[
  {
    "path": "LICENSE",
    "content": "                    GNU GENERAL PUBLIC LICENSE\n                       Version 3, 29 June 2007\n\n Copyright (C) 2007 Free Software Foundation, Inc. <https://fsf.org/>\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n                            Preamble\n\n  The GNU General Public License is a free, copyleft license for\nsoftware and other kinds of works.\n\n  The licenses for most software and other practical works are designed\nto take away your freedom to share and change the works.  By contrast,\nthe GNU General Public License is intended to guarantee your freedom to\nshare and change all versions of a program--to make sure it remains free\nsoftware for all its users.  We, the Free Software Foundation, use the\nGNU General Public License for most of our software; it applies also to\nany other work released this way by its authors.  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthem if you wish), that you receive source code or can get it if you\nwant it, that you can change the software or use pieces of it in new\nfree programs, and that you know you can do these things.\n\n  To protect your rights, we need to prevent others from denying you\nthese rights or asking you to surrender the rights.  Therefore, you have\ncertain responsibilities if you distribute copies of the software, or if\nyou modify it: responsibilities to respect the freedom of others.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must pass on to the recipients the same\nfreedoms that you received.  You must make sure that they, too, receive\nor can get the source code.  And you must show them these terms so they\nknow their rights.\n\n  Developers that use the GNU GPL protect your rights with two steps:\n(1) assert copyright on the software, and (2) offer you this License\ngiving you legal permission to copy, distribute and/or modify it.\n\n  For the developers' and authors' protection, the GPL clearly explains\nthat there is no warranty for this free software.  For both users' and\nauthors' sake, the GPL requires that modified versions be marked as\nchanged, so that their problems will not be attributed erroneously to\nauthors of previous versions.\n\n  Some devices are designed to deny users access to install or run\nmodified versions of the software inside them, although the manufacturer\ncan do so.  This is fundamentally incompatible with the aim of\nprotecting users' freedom to change the software.  The systematic\npattern of such abuse occurs in the area of products for individuals to\nuse, which is precisely where it is most unacceptable.  Therefore, we\nhave designed this version of the GPL to prohibit the practice for those\nproducts.  If such problems arise substantially in other domains, we\nstand ready to extend this provision to those domains in future versions\nof the GPL, as needed to protect the freedom of users.\n\n  Finally, every program is threatened constantly by software patents.\nStates should not allow patents to restrict development and use of\nsoftware on general-purpose computers, but in those that do, we wish to\navoid the special danger that patents applied to a free program could\nmake it effectively proprietary.  To prevent this, the GPL assures that\npatents cannot be used to render the program non-free.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\n                       TERMS AND CONDITIONS\n\n  0. Definitions.\n\n  \"This License\" refers to version 3 of the GNU General Public License.\n\n  \"Copyright\" also means copyright-like laws that apply to other kinds of\nworks, such as semiconductor masks.\n\n  \"The Program\" refers to any copyrightable work licensed under this\nLicense.  Each licensee is addressed as \"you\".  \"Licensees\" and\n\"recipients\" may be individuals or organizations.\n\n  To \"modify\" a work means to copy from or adapt all or part of the work\nin a fashion requiring copyright permission, other than the making of an\nexact copy.  The resulting work is called a \"modified version\" of the\nearlier work or a work \"based on\" the earlier work.\n\n  A \"covered work\" means either the unmodified Program or a work based\non the Program.\n\n  To \"propagate\" a work means to do anything with it that, without\npermission, would make you directly or secondarily liable for\ninfringement under applicable copyright law, except executing it on a\ncomputer or modifying a private copy.  Propagation includes copying,\ndistribution (with or without modification), making available to the\npublic, and in some countries other activities as well.\n\n  To \"convey\" a work means any kind of propagation that enables other\nparties to make or receive copies.  Mere interaction with a user through\na computer network, with no transfer of a copy, is not conveying.\n\n  An interactive user interface displays \"Appropriate Legal Notices\"\nto the extent that it includes a convenient and prominently visible\nfeature that (1) displays an appropriate copyright notice, and (2)\ntells the user that there is no warranty for the work (except to the\nextent that warranties are provided), that licensees may convey the\nwork under this License, and how to view a copy of this License.  If\nthe interface presents a list of user commands or options, such as a\nmenu, a prominent item in the list meets this criterion.\n\n  1. Source Code.\n\n  The \"source code\" for a work means the preferred form of the work\nfor making modifications to it.  \"Object code\" means any non-source\nform of a work.\n\n  A \"Standard Interface\" means an interface that either is an official\nstandard defined by a recognized standards body, or, in the case of\ninterfaces specified for a particular programming language, one that\nis widely used among developers working in that language.\n\n  The \"System Libraries\" of an executable work include anything, other\nthan the work as a whole, that (a) is included in the normal form of\npackaging a Major Component, but which is not part of that Major\nComponent, and (b) serves only to enable use of the work with that\nMajor Component, or to implement a Standard Interface for which an\nimplementation is available to the public in source code form.  A\n\"Major Component\", in this context, means a major essential component\n(kernel, window system, and so on) of the specific operating system\n(if any) on which the executable work runs, or a compiler used to\nproduce the work, or an object code interpreter used to run it.\n\n  The \"Corresponding Source\" for a work in object code form means all\nthe source code needed to generate, install, and (for an executable\nwork) run the object code and to modify the work, including scripts to\ncontrol those activities.  However, it does not include the work's\nSystem Libraries, or general-purpose tools or generally available free\nprograms which are used unmodified in performing those activities but\nwhich are not part of the work.  For example, Corresponding Source\nincludes interface definition files associated with source files for\nthe work, and the source code for shared libraries and dynamically\nlinked subprograms that the work is specifically designed to require,\nsuch as by intimate data communication or control flow between those\nsubprograms and other parts of the work.\n\n  The Corresponding Source need not include anything that users\ncan regenerate automatically from other parts of the Corresponding\nSource.\n\n  The Corresponding Source for a work in source code form is that\nsame work.\n\n  2. Basic Permissions.\n\n  All rights granted under this License are granted for the term of\ncopyright on the Program, and are irrevocable provided the stated\nconditions are met.  This License explicitly affirms your unlimited\npermission to run the unmodified Program.  The output from running a\ncovered work is covered by this License only if the output, given its\ncontent, constitutes a covered work.  This License acknowledges your\nrights of fair use or other equivalent, as provided by copyright law.\n\n  You may make, run and propagate covered works that you do not\nconvey, without conditions so long as your license otherwise remains\nin force.  You may convey covered works to others for the sole purpose\nof having them make modifications exclusively for you, or provide you\nwith facilities for running those works, provided that you comply with\nthe terms of this License in conveying all material for which you do\nnot control copyright.  Those thus making or running the covered works\nfor you must do so exclusively on your behalf, under your direction\nand control, on terms that prohibit them from making any copies of\nyour copyrighted material outside their relationship with you.\n\n  Conveying under any other circumstances is permitted solely under\nthe conditions stated below.  Sublicensing is not allowed; section 10\nmakes it unnecessary.\n\n  3. Protecting Users' Legal Rights From Anti-Circumvention Law.\n\n  No covered work shall be deemed part of an effective technological\nmeasure under any applicable law fulfilling obligations under article\n11 of the WIPO copyright treaty adopted on 20 December 1996, or\nsimilar laws prohibiting or restricting circumvention of such\nmeasures.\n\n  When you convey a covered work, you waive any legal power to forbid\ncircumvention of technological measures to the extent such circumvention\nis effected by exercising rights under this License with respect to\nthe covered work, and you disclaim any intention to limit operation or\nmodification of the work as a means of enforcing, against the work's\nusers, your or third parties' legal rights to forbid circumvention of\ntechnological measures.\n\n  4. Conveying Verbatim Copies.\n\n  You may convey verbatim copies of the Program's source code as you\nreceive it, in any medium, provided that you conspicuously and\nappropriately publish on each copy an appropriate copyright notice;\nkeep intact all notices stating that this License and any\nnon-permissive terms added in accord with section 7 apply to the code;\nkeep intact all notices of the absence of any warranty; and give all\nrecipients a copy of this License along with the Program.\n\n  You may charge any price or no price for each copy that you convey,\nand you may offer support or warranty protection for a fee.\n\n  5. Conveying Modified Source Versions.\n\n  You may convey a work based on the Program, or the modifications to\nproduce it from the Program, in the form of source code under the\nterms of section 4, provided that you also meet all of these conditions:\n\n    a) The work must carry prominent notices stating that you modified\n    it, and giving a relevant date.\n\n    b) The work must carry prominent notices stating that it is\n    released under this License and any conditions added under section\n    7.  This requirement modifies the requirement in section 4 to\n    \"keep intact all notices\".\n\n    c) You must license the entire work, as a whole, under this\n    License to anyone who comes into possession of a copy.  This\n    License will therefore apply, along with any applicable section 7\n    additional terms, to the whole of the work, and all its parts,\n    regardless of how they are packaged.  This License gives no\n    permission to license the work in any other way, but it does not\n    invalidate such permission if you have separately received it.\n\n    d) If the work has interactive user interfaces, each must display\n    Appropriate Legal Notices; however, if the Program has interactive\n    interfaces that do not display Appropriate Legal Notices, your\n    work need not make them do so.\n\n  A compilation of a covered work with other separate and independent\nworks, which are not by their nature extensions of the covered work,\nand which are not combined with it such as to form a larger program,\nin or on a volume of a storage or distribution medium, is called an\n\"aggregate\" if the compilation and its resulting copyright are not\nused to limit the access or legal rights of the compilation's users\nbeyond what the individual works permit.  Inclusion of a covered work\nin an aggregate does not cause this License to apply to the other\nparts of the aggregate.\n\n  6. Conveying Non-Source Forms.\n\n  You may convey a covered work in object code form under the terms\nof sections 4 and 5, provided that you also convey the\nmachine-readable Corresponding Source under the terms of this License,\nin one of these ways:\n\n    a) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by the\n    Corresponding Source fixed on a durable physical medium\n    customarily used for software interchange.\n\n    b) Convey the object code in, or embodied in, a physical product\n    (including a physical distribution medium), accompanied by a\n    written offer, valid for at least three years and valid for as\n    long as you offer spare parts or customer support for that product\n    model, to give anyone who possesses the object code either (1) a\n    copy of the Corresponding Source for all the software in the\n    product that is covered by this License, on a durable physical\n    medium customarily used for software interchange, for a price no\n    more than your reasonable cost of physically performing this\n    conveying of source, or (2) access to copy the\n    Corresponding Source from a network server at no charge.\n\n    c) Convey individual copies of the object code with a copy of the\n    written offer to provide the Corresponding Source.  This\n    alternative is allowed only occasionally and noncommercially, and\n    only if you received the object code with such an offer, in accord\n    with subsection 6b.\n\n    d) Convey the object code by offering access from a designated\n    place (gratis or for a charge), and offer equivalent access to the\n    Corresponding Source in the same way through the same place at no\n    further charge.  You need not require recipients to copy the\n    Corresponding Source along with the object code.  If the place to\n    copy the object code is a network server, the Corresponding Source\n    may be on a different server (operated by you or a third party)\n    that supports equivalent copying facilities, provided you maintain\n    clear directions next to the object code saying where to find the\n    Corresponding Source.  Regardless of what server hosts the\n    Corresponding Source, you remain obligated to ensure that it is\n    available for as long as needed to satisfy these requirements.\n\n    e) Convey the object code using peer-to-peer transmission, provided\n    you inform other peers where the object code and Corresponding\n    Source of the work are being offered to the general public at no\n    charge under subsection 6d.\n\n  A separable portion of the object code, whose source code is excluded\nfrom the Corresponding Source as a System Library, need not be\nincluded in conveying the object code work.\n\n  A \"User Product\" is either (1) a \"consumer product\", which means any\ntangible personal property which is normally used for personal, family,\nor household purposes, or (2) anything designed or sold for incorporation\ninto a dwelling.  In determining whether a product is a consumer product,\ndoubtful cases shall be resolved in favor of coverage.  For a particular\nproduct received by a particular user, \"normally used\" refers to a\ntypical or common use of that class of product, regardless of the status\nof the particular user or of the way in which the particular user\nactually uses, or expects or is expected to use, the product.  A product\nis a consumer product regardless of whether the product has substantial\ncommercial, industrial or non-consumer uses, unless such uses represent\nthe only significant mode of use of the product.\n\n  \"Installation Information\" for a User Product means any methods,\nprocedures, authorization keys, or other information required to install\nand execute modified versions of a covered work in that User Product from\na modified version of its Corresponding Source.  The information must\nsuffice to ensure that the continued functioning of the modified object\ncode is in no case prevented or interfered with solely because\nmodification has been made.\n\n  If you convey an object code work under this section in, or with, or\nspecifically for use in, a User Product, and the conveying occurs as\npart of a transaction in which the right of possession and use of the\nUser Product is transferred to the recipient in perpetuity or for a\nfixed term (regardless of how the transaction is characterized), the\nCorresponding Source conveyed under this section must be accompanied\nby the Installation Information.  But this requirement does not apply\nif neither you nor any third party retains the ability to install\nmodified object code on the User Product (for example, the work has\nbeen installed in ROM).\n\n  The requirement to provide Installation Information does not include a\nrequirement to continue to provide support service, warranty, or updates\nfor a work that has been modified or installed by the recipient, or for\nthe User Product in which it has been modified or installed.  Access to a\nnetwork may be denied when the modification itself materially and\nadversely affects the operation of the network or violates the rules and\nprotocols for communication across the network.\n\n  Corresponding Source conveyed, and Installation Information provided,\nin accord with this section must be in a format that is publicly\ndocumented (and with an implementation available to the public in\nsource code form), and must require no special password or key for\nunpacking, reading or copying.\n\n  7. Additional Terms.\n\n  \"Additional permissions\" are terms that supplement the terms of this\nLicense by making exceptions from one or more of its conditions.\nAdditional permissions that are applicable to the entire Program shall\nbe treated as though they were included in this License, to the extent\nthat they are valid under applicable law.  If additional permissions\napply only to part of the Program, that part may be used separately\nunder those permissions, but the entire Program remains governed by\nthis License without regard to the additional permissions.\n\n  When you convey a copy of a covered work, you may at your option\nremove any additional permissions from that copy, or from any part of\nit.  (Additional permissions may be written to require their own\nremoval in certain cases when you modify the work.)  You may place\nadditional permissions on material, added by you to a covered work,\nfor which you have or can give appropriate copyright permission.\n\n  Notwithstanding any other provision of this License, for material you\nadd to a covered work, you may (if authorized by the copyright holders of\nthat material) supplement the terms of this License with terms:\n\n    a) Disclaiming warranty or limiting liability differently from the\n    terms of sections 15 and 16 of this License; or\n\n    b) Requiring preservation of specified reasonable legal notices or\n    author attributions in that material or in the Appropriate Legal\n    Notices displayed by works containing it; or\n\n    c) Prohibiting misrepresentation of the origin of that material, or\n    requiring that modified versions of such material be marked in\n    reasonable ways as different from the original version; or\n\n    d) Limiting the use for publicity purposes of names of licensors or\n    authors of the material; or\n\n    e) Declining to grant rights under trademark law for use of some\n    trade names, trademarks, or service marks; or\n\n    f) Requiring indemnification of licensors and authors of that\n    material by anyone who conveys the material (or modified versions of\n    it) with contractual assumptions of liability to the recipient, for\n    any liability that these contractual assumptions directly impose on\n    those licensors and authors.\n\n  All other non-permissive additional terms are considered \"further\nrestrictions\" within the meaning of section 10.  If the Program as you\nreceived it, or any part of it, contains a notice stating that it is\ngoverned by this License along with a term that is a further\nrestriction, you may remove that term.  If a license document contains\na further restriction but permits relicensing or conveying under this\nLicense, you may add to a covered work material governed by the terms\nof that license document, provided that the further restriction does\nnot survive such relicensing or conveying.\n\n  If you add terms to a covered work in accord with this section, you\nmust place, in the relevant source files, a statement of the\nadditional terms that apply to those files, or a notice indicating\nwhere to find the applicable terms.\n\n  Additional terms, permissive or non-permissive, may be stated in the\nform of a separately written license, or stated as exceptions;\nthe above requirements apply either way.\n\n  8. Termination.\n\n  You may not propagate or modify a covered work except as expressly\nprovided under this License.  Any attempt otherwise to propagate or\nmodify it is void, and will automatically terminate your rights under\nthis License (including any patent licenses granted under the third\nparagraph of section 11).\n\n  However, if you cease all violation of this License, then your\nlicense from a particular copyright holder is reinstated (a)\nprovisionally, unless and until the copyright holder explicitly and\nfinally terminates your license, and (b) permanently, if the copyright\nholder fails to notify you of the violation by some reasonable means\nprior to 60 days after the cessation.\n\n  Moreover, your license from a particular copyright holder is\nreinstated permanently if the copyright holder notifies you of the\nviolation by some reasonable means, this is the first time you have\nreceived notice of violation of this License (for any work) from that\ncopyright holder, and you cure the violation prior to 30 days after\nyour receipt of the notice.\n\n  Termination of your rights under this section does not terminate the\nlicenses of parties who have received copies or rights from you under\nthis License.  If your rights have been terminated and not permanently\nreinstated, you do not qualify to receive new licenses for the same\nmaterial under section 10.\n\n  9. Acceptance Not Required for Having Copies.\n\n  You are not required to accept this License in order to receive or\nrun a copy of the Program.  Ancillary propagation of a covered work\noccurring solely as a consequence of using peer-to-peer transmission\nto receive a copy likewise does not require acceptance.  However,\nnothing other than this License grants you permission to propagate or\nmodify any covered work.  These actions infringe copyright if you do\nnot accept this License.  Therefore, by modifying or propagating a\ncovered work, you indicate your acceptance of this License to do so.\n\n  10. Automatic Licensing of Downstream Recipients.\n\n  Each time you convey a covered work, the recipient automatically\nreceives a license from the original licensors, to run, modify and\npropagate that work, subject to this License.  You are not responsible\nfor enforcing compliance by third parties with this License.\n\n  An \"entity transaction\" is a transaction transferring control of an\norganization, or substantially all assets of one, or subdividing an\norganization, or merging organizations.  If propagation of a covered\nwork results from an entity transaction, each party to that\ntransaction who receives a copy of the work also receives whatever\nlicenses to the work the party's predecessor in interest had or could\ngive under the previous paragraph, plus a right to possession of the\nCorresponding Source of the work from the predecessor in interest, if\nthe predecessor has it or can get it with reasonable efforts.\n\n  You may not impose any further restrictions on the exercise of the\nrights granted or affirmed under this License.  For example, you may\nnot impose a license fee, royalty, or other charge for exercise of\nrights granted under this License, and you may not initiate litigation\n(including a cross-claim or counterclaim in a lawsuit) alleging that\nany patent claim is infringed by making, using, selling, offering for\nsale, or importing the Program or any portion of it.\n\n  11. Patents.\n\n  A \"contributor\" is a copyright holder who authorizes use under this\nLicense of the Program or a work on which the Program is based.  The\nwork thus licensed is called the contributor's \"contributor version\".\n\n  A contributor's \"essential patent claims\" are all patent claims\nowned or controlled by the contributor, whether already acquired or\nhereafter acquired, that would be infringed by some manner, permitted\nby this License, of making, using, or selling its contributor version,\nbut do not include claims that would be infringed only as a\nconsequence of further modification of the contributor version.  For\npurposes of this definition, \"control\" includes the right to grant\npatent sublicenses in a manner consistent with the requirements of\nthis License.\n\n  Each contributor grants you a non-exclusive, worldwide, royalty-free\npatent license under the contributor's essential patent claims, to\nmake, use, sell, offer for sale, import and otherwise run, modify and\npropagate the contents of its contributor version.\n\n  In the following three paragraphs, a \"patent license\" is any express\nagreement or commitment, however denominated, not to enforce a patent\n(such as an express permission to practice a patent or covenant not to\nsue for patent infringement).  To \"grant\" such a patent license to a\nparty means to make such an agreement or commitment not to enforce a\npatent against the party.\n\n  If you convey a covered work, knowingly relying on a patent license,\nand the Corresponding Source of the work is not available for anyone\nto copy, free of charge and under the terms of this License, through a\npublicly available network server or other readily accessible means,\nthen you must either (1) cause the Corresponding Source to be so\navailable, or (2) arrange to deprive yourself of the benefit of the\npatent license for this particular work, or (3) arrange, in a manner\nconsistent with the requirements of this License, to extend the patent\nlicense to downstream recipients.  \"Knowingly relying\" means you have\nactual knowledge that, but for the patent license, your conveying the\ncovered work in a country, or your recipient's use of the covered work\nin a country, would infringe one or more identifiable patents in that\ncountry that you have reason to believe are valid.\n\n  If, pursuant to or in connection with a single transaction or\narrangement, you convey, or propagate by procuring conveyance of, a\ncovered work, and grant a patent license to some of the parties\nreceiving the covered work authorizing them to use, propagate, modify\nor convey a specific copy of the covered work, then the patent license\nyou grant is automatically extended to all recipients of the covered\nwork and works based on it.\n\n  A patent license is \"discriminatory\" if it does not include within\nthe scope of its coverage, prohibits the exercise of, or is\nconditioned on the non-exercise of one or more of the rights that are\nspecifically granted under this License.  You may not convey a covered\nwork if you are a party to an arrangement with a third party that is\nin the business of distributing software, under which you make payment\nto the third party based on the extent of your activity of conveying\nthe work, and under which the third party grants, to any of the\nparties who would receive the covered work from you, a discriminatory\npatent license (a) in connection with copies of the covered work\nconveyed by you (or copies made from those copies), or (b) primarily\nfor and in connection with specific products or compilations that\ncontain the covered work, unless you entered into that arrangement,\nor that patent license was granted, prior to 28 March 2007.\n\n  Nothing in this License shall be construed as excluding or limiting\nany implied license or other defenses to infringement that may\notherwise be available to you under applicable patent law.\n\n  12. No Surrender of Others' Freedom.\n\n  If conditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot convey a\ncovered work so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you may\nnot convey it at all.  For example, if you agree to terms that obligate you\nto collect a royalty for further conveying from those to whom you convey\nthe Program, the only way you could satisfy both those terms and this\nLicense would be to refrain entirely from conveying the Program.\n\n  13. Use with the GNU Affero General Public License.\n\n  Notwithstanding any other provision of this License, you have\npermission to link or combine any covered work with a work licensed\nunder version 3 of the GNU Affero General Public License into a single\ncombined work, and to convey the resulting work.  The terms of this\nLicense will continue to apply to the part which is the covered work,\nbut the special requirements of the GNU Affero General Public License,\nsection 13, concerning interaction through a network will apply to the\ncombination as such.\n\n  14. Revised Versions of this License.\n\n  The Free Software Foundation may publish revised and/or new versions of\nthe GNU General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\n  Each version is given a distinguishing version number.  If the\nProgram specifies that a certain numbered version of the GNU General\nPublic License \"or any later version\" applies to it, you have the\noption of following the terms and conditions either of that numbered\nversion or of any later version published by the Free Software\nFoundation.  If the Program does not specify a version number of the\nGNU General Public License, you may choose any version ever published\nby the Free Software Foundation.\n\n  If the Program specifies that a proxy can decide which future\nversions of the GNU General Public License can be used, that proxy's\npublic statement of acceptance of a version permanently authorizes you\nto choose that version for the Program.\n\n  Later license versions may give you additional or different\npermissions.  However, no additional obligations are imposed on any\nauthor or copyright holder as a result of your choosing to follow a\nlater version.\n\n  15. Disclaimer of Warranty.\n\n  THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY\nAPPLICABLE LAW.  EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT\nHOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY\nOF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,\nTHE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM\nIS WITH YOU.  SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF\nALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. Limitation of Liability.\n\n  IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS\nTHE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY\nGENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE\nUSE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF\nDATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD\nPARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),\nEVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGES.\n\n  17. Interpretation of Sections 15 and 16.\n\n  If the disclaimer of warranty and limitation of liability provided\nabove cannot be given local legal effect according to their terms,\nreviewing courts shall apply local law that most closely approximates\nan absolute waiver of all civil liability in connection with the\nProgram, unless a warranty or assumption of liability accompanies a\ncopy of the Program in return for a fee.\n\n                     END OF TERMS AND CONDITIONS\n\n            How to Apply These Terms to Your New Programs\n\n  If you develop a new program, and you want it to be of the greatest\npossible use to the public, the best way to achieve this is to make it\nfree software which everyone can redistribute and change under these terms.\n\n  To do so, attach the following notices to the program.  It is safest\nto attach them to the start of each source file to most effectively\nstate the exclusion of warranty; and each file should have at least\nthe \"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the program's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This program is free software: you can redistribute it and/or modify\n    it under the terms of the GNU General Public License as published by\n    the Free Software Foundation, either version 3 of the License, or\n    (at your option) any later version.\n\n    This program is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n    GNU General Public License for more details.\n\n    You should have received a copy of the GNU General Public License\n    along with this program.  If not, see <https://www.gnu.org/licenses/>.\n\nAlso add information on how to contact you by electronic and paper mail.\n\n  If the program does terminal interaction, make it output a short\nnotice like this when it starts in an interactive mode:\n\n    <program>  Copyright (C) <year>  <name of author>\n    This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.\n    This is free software, and you are welcome to redistribute it\n    under certain conditions; type `show c' for details.\n\nThe hypothetical commands `show w' and `show c' should show the appropriate\nparts of the General Public License.  Of course, your program's commands\nmight be different; for a GUI interface, you would use an \"about box\".\n\n  You should also get your employer (if you work as a programmer) or school,\nif any, to sign a \"copyright disclaimer\" for the program, if necessary.\nFor more information on this, and how to apply and follow the GNU GPL, see\n<https://www.gnu.org/licenses/>.\n\n  The GNU General Public License does not permit incorporating your program\ninto proprietary programs.  If your program is a subroutine library, you\nmay consider it more useful to permit linking proprietary applications with\nthe library.  If this is what you want to do, use the GNU Lesser General\nPublic License instead of this License.  But first, please read\n<https://www.gnu.org/licenses/why-not-lgpl.html>.\n"
  },
  {
    "path": "README.md",
    "content": "- [个人脚本专用配套插件包](https://github.com/281677160/build-actions)\n"
  },
  {
    "path": "luci-app-adguardhome/Makefile",
    "content": "# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-adguardhome\nPKG_RELEASE:=15\n\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/luci-app-adguardhome\n\tSECTION:=luci\n\tCATEGORY:=LuCI\n\tSUBMENU:=3. Applications\n\tTITLE:=LuCI app for adguardhome\n\tPKG_MAINTAINER:=<https://github.com/rufengsuixing/luci-app-adguardhome>\n\tPKGARCH:=all\n\tDEPENDS:=+!wget-ssl&&!curl:wget-ssl\nendef\n\ndefine Package/luci-app-adguardhome/description\n\tLuCI support for adguardhome\nendef\n\ndefine Build/Prepare\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/luci-app-adguardhome/conffiles\n/usr/share/AdGuardHome/links.txt\n/etc/config/AdGuardHome\nendef\n\ndefine Package/luci-app-adguardhome/install\n    $(INSTALL_DIR) $(1)/usr/lib/lua/luci\n\tcp -pR ./luasrc/* $(1)/usr/lib/lua/luci\n\t$(INSTALL_DIR) $(1)/\n\tcp -pR ./root/* $(1)/\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n\n\tpo2lmo ./po/zh_Hans/AdGuardHome.po $(1)/usr/lib/lua/luci/i18n/AdGuardHome.zh-cn.lmo\nendef\n\ndefine Package/luci-app-adguardhome/postinst\n#!/bin/sh\n\t/etc/init.d/AdGuardHome enable >/dev/null 2>&1\n\tenable=$(uci get AdGuardHome.AdGuardHome.enabled 2>/dev/null)\n\tif [ \"$enable\" == \"1\" ]; then\n\t\t/etc/init.d/AdGuardHome reload\n\tfi\n\trm -f /tmp/luci-indexcache\n\trm -f /tmp/luci-modulecache/*\nexit 0\nendef\n\ndefine Package/luci-app-adguardhome/prerm\n#!/bin/sh\nif [ -z \"$${IPKG_INSTROOT}\" ]; then\n     /etc/init.d/AdGuardHome disable\n     /etc/init.d/AdGuardHome stop\nuci -q batch <<-EOF >/dev/null 2>&1\n\tdelete ucitrack.@AdGuardHome[-1]\n\tcommit ucitrack\nEOF\nfi\nexit 0\nendef\n\n$(eval $(call BuildPackage,luci-app-adguardhome))\n"
  },
  {
    "path": "luci-app-adguardhome/luasrc/controller/AdGuardHome.lua",
    "content": "module(\"luci.controller.AdGuardHome\", package.seeall)\nlocal fs = require \"nixio.fs\"\nlocal http = require \"luci.http\"\nlocal uci = require\"luci.model.uci\".cursor()\nfunction index()\n    entry({\"admin\", \"services\", \"AdGuardHome\"}, alias(\"admin\", \"services\", \"AdGuardHome\", \"base\"), _(\"AdGuard Home\"), 10).dependent = true\n    entry({\"admin\", \"services\", \"AdGuardHome\", \"base\"}, cbi(\"AdGuardHome/base\"),  _(\"Base Setting\"), 1).leaf = true\n    entry({\"admin\", \"services\", \"AdGuardHome\", \"log\"}, form(\"AdGuardHome/log\"), _(\"Log\"), 2).leaf = true\n    entry({\"admin\", \"services\", \"AdGuardHome\", \"manual\"}, cbi(\"AdGuardHome/manual\"), _(\"Manual Config\"), 3).leaf = true\n    entry({\"admin\", \"services\", \"AdGuardHome\", \"status\"}, call(\"act_status\")).leaf = true\n    entry({\"admin\", \"services\", \"AdGuardHome\", \"check\"}, call(\"check_update\"))\n    entry({\"admin\", \"services\", \"AdGuardHome\", \"doupdate\"}, call(\"do_update\"))\n    entry({\"admin\", \"services\", \"AdGuardHome\", \"getlog\"}, call(\"get_log\"))\n    entry({\"admin\", \"services\", \"AdGuardHome\", \"dodellog\"}, call(\"do_dellog\"))\n    entry({\"admin\", \"services\", \"AdGuardHome\", \"reloadconfig\"}, call(\"reload_config\"))\n    entry({\"admin\", \"services\", \"AdGuardHome\", \"gettemplateconfig\"}, call(\"get_template_config\"))\nend\n\nfunction get_template_config()\n    local b\n\tlocal d = \"\"\n\tlocal file = \"/tmp/resolv.conf.d/resolv.conf.auto\"\n\tif not fs.access(file) then\n\t\tfile = \"/tmp/resolv.conf.auto\"\n\tend\n    for cnt in io.lines(file) do\n        b = string.match(cnt, \"^[^#]*nameserver%s+([^%s]+)$\")\n        if (b ~= nil) then d = d .. \"  - \" .. b .. \"\\n\" end\n    end\n    local f = io.open(\"/usr/share/AdGuardHome/AdGuardHome_template.yaml\", \"r+\")\n    local tbl = {}\n    local a = \"\"\n    while (1) do\n        a = f:read(\"*l\")\n        if (a == \"#bootstrap_dns\") then\n            a = d\n        elseif (a == \"#upstream_dns\") then\n            a = d\n        elseif (a == nil) then\n            break\n        end\n        table.insert(tbl, a)\n    end\n    f:close()\n    http.prepare_content(\"text/plain; charset=utf-8\")\n    http.write(table.concat(tbl, \"\\n\"))\nend\n\nfunction reload_config()\n    fs.remove(\"/tmp/AdGuardHometmpconfig.yaml\")\n    http.prepare_content(\"application/json\")\n    http.write('')\nend\n\nfunction act_status()\n    local e = {}\n    local binpath = uci:get(\"AdGuardHome\", \"AdGuardHome\", \"binpath\")\n    e.running = luci.sys.call(\"pgrep \" .. binpath .. \" >/dev/null\") == 0\n    e.redirect = (fs.readfile(\"/var/run/AdGredir\") == \"1\")\n    http.prepare_content(\"application/json\")\n    http.write_json(e)\nend\n\nfunction do_update()\n    fs.writefile(\"/var/run/lucilogpos\", \"0\")\n    http.prepare_content(\"application/json\")\n    http.write('')\n    local arg\n    if luci.http.formvalue(\"force\") == \"1\" then\n        arg = \"force\"\n    else\n        arg = \"\"\n    end\n    if fs.access(\"/var/run/update_core\") then\n        if arg == \"force\" then\n            luci.sys.exec(\"kill $(pgrep /usr/share/AdGuardHome/update_core.sh) ; sh /usr/share/AdGuardHome/update_core.sh \" .. arg .. \" >/tmp/AdGuardHome_update.log 2>&1 &\")\n        end\n    else\n        luci.sys.exec(\"sh /usr/share/AdGuardHome/update_core.sh \" .. arg .. \" >/tmp/AdGuardHome_update.log 2>&1 &\")\n    end\nend\n\nfunction get_log()\n    local logfile = uci:get(\"AdGuardHome\", \"AdGuardHome\", \"logfile\")\n    if (logfile == nil) then\n        http.write(\"no log available\\n\")\n        return\n    elseif (logfile == \"syslog\") then\n        if not fs.access(\"/var/run/AdGuardHomesyslog\") then\n            luci.sys.exec(\"(/usr/share/AdGuardHome/getsyslog.sh &); sleep 1;\")\n        end\n        logfile = \"/tmp/AdGuardHometmp.log\"\n        fs.writefile(\"/var/run/AdGuardHomesyslog\", \"1\")\n    elseif not fs.access(logfile) then\n        http.write(\"\")\n        return\n    end\n    http.prepare_content(\"text/plain; charset=utf-8\")\n    local fdp = tonumber(fs.readfile(\"/var/run/lucilogpos\")) or 0\n    local f = io.open(logfile, \"r+\")\n    f:seek(\"set\", fdp)\n    local a = f:read(2048000) or \"\"\n    fdp = f:seek()\n    fs.writefile(\"/var/run/lucilogpos\", tostring(fdp))\n    f:close()\n    http.write(a)\nend\n\nfunction do_dellog()\n    local logfile = uci:get(\"AdGuardHome\", \"AdGuardHome\", \"logfile\")\n    fs.writefile(logfile, \"\")\n    http.prepare_content(\"application/json\")\n    http.write('')\nend\n\nfunction check_update()\n    http.prepare_content(\"text/plain; charset=utf-8\")\n    local fdp = tonumber(fs.readfile(\"/var/run/lucilogpos\")) or 0\n    local f = io.open(\"/tmp/AdGuardHome_update.log\", \"r+\")\n    f:seek(\"set\", fdp)\n    local a = f:read(2048000) or \"\"\n    fdp = f:seek()\n    fs.writefile(\"/var/run/lucilogpos\", tostring(fdp))\n    f:close()\n    if fs.access(\"/var/run/update_core\") then\n        http.write(a)\n    else\n        http.write(a .. \"\\0\")\n    end\nend\n"
  },
  {
    "path": "luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/base.lua",
    "content": "require(\"luci.sys\")\nrequire(\"luci.util\")\nrequire(\"io\")\nlocal m, s, o, o1\nlocal fs = require \"nixio.fs\"\nlocal uci = require\"luci.model.uci\".cursor()\nlocal configpath = uci:get(\"AdGuardHome\", \"AdGuardHome\", \"configpath\") or \"/etc/config/AdGuardHome.yaml\"\nlocal binpath = uci:get(\"AdGuardHome\", \"AdGuardHome\", \"binpath\") or \"/usr/bin/AdGuardHome/AdGuardHome\"\nhttpport = uci:get(\"AdGuardHome\", \"AdGuardHome\", \"httpport\") or \"3000\"\n\nm = Map(\"AdGuardHome\", \"AdGuard Home\")\nm.description = translate(\"Free and open source, powerful network-wide ads & trackers blocking DNS server.\")\nm:section(SimpleSection).template = \"AdGuardHome/AdGuardHome_status\"\n\ns = m:section(TypedSection, \"AdGuardHome\")\ns.anonymous = true\ns.addremove = false\n\n---- enable\no = s:option(Flag, \"enabled\", translate(\"Enable\"))\no.default = 0\no.optional = false\n\n---- httpport\no = s:option(Value, \"httpport\", translate(\"Browser management port\"))\no.placeholder = 3000\no.default = 3000\no.datatype = \"port\"\no.optional = false\no.description = translate(\"<input type='button' style='width:210px; border-color:Teal; text-align:center; font-weight:bold;color:Green;' value='AdGuardHome Web:\" .. httpport .. \"' onclick=\\\"window.open('http://'+window.location.hostname+':\" .. httpport .. \"')\\\"/>\")\n\n---- update warning not safe\nlocal binmtime = uci:get(\"AdGuardHome\", \"AdGuardHome\", \"binmtime\") or \"0\"\nlocal e = \"\"\nif not fs.access(configpath) then e = e .. \" \" .. translate(\"no config\") end\nif not fs.access(binpath) then\n    e = e .. \" \" .. translate(\"no core\")\nelse\n    local version = uci:get(\"AdGuardHome\", \"AdGuardHome\", \"version\")\n    local testtime = fs.stat(binpath, \"mtime\")\n    if testtime ~= tonumber(binmtime) or version == nil then\n        -- local tmp=luci.sys.exec(binpath..\" -c /dev/null --check-config 2>&1| grep -m 1 -E 'v[0-9.]+' -o\")\n        -- version=string.sub(tmp, 1, -2)\n        version = luci.sys.exec(string.format(\"echo -n $(%s --version 2>&1 | awk -F 'version ' '{print $2}' | awk -F ',' '{print $1}')\", binpath))\n        if version == \"\" then version = \"core error\" end\n        uci:set(\"AdGuardHome\", \"AdGuardHome\", \"version\", version)\n        uci:set(\"AdGuardHome\", \"AdGuardHome\", \"binmtime\", testtime)\n        uci:commit(\"AdGuardHome\")\n    end\n    e = version .. e\nend\no = s:option(Button, \"restart\", translate(\"Update\"))\no.inputtitle = translate(\"Update core version\")\no.template = \"AdGuardHome/AdGuardHome_check\"\no.showfastconfig = (not fs.access(configpath))\no.description = string.format(translate(\"core version:\") .. \"<strong><font id='updateversion' color='green'>%s </font></strong>\", e)\n\n---- port warning not safe\nlocal port = luci.sys.exec(\"awk '/  port:/{printf($2);exit;}' \" .. configpath .. \" 2>nul\")\nif (port == \"\") then port = \"?\" end\n\n---- Redirect\no = s:option(ListValue, \"redirect\", port .. translate(\"Redirect\"), translate(\"AdGuardHome redirect mode\"))\no.placeholder = \"none\"\no:value(\"none\", translate(\"none\"))\no:value(\"dnsmasq-upstream\", translate(\"Run as dnsmasq upstream server\"))\no:value(\"redirect\", translate(\"Redirect 53 port to AdGuardHome\"))\no:value(\"exchange\", translate(\"Use port 53 replace dnsmasq\"))\no.default = \"none\"\no.optional = true\n\n---- bin path\no = s:option(Value, \"binpath\", translate(\"Bin Path\"), translate(\"AdGuardHome Bin path if no bin will auto download\"))\no.default = \"/usr/bin/AdGuardHome/AdGuardHome\"\no.datatype = \"string\"\no.optional = false\no.rmempty = false\no.validate = function(self, value)\n    if value == \"\" then return nil end\n    if fs.stat(value, \"type\") == \"dir\" then fs.rmdir(value) end\n    if fs.stat(value, \"type\") == \"dir\" then\n        if (m.message) then\n            m.message = m.message .. \"\\nerror!bin path is a dir\"\n        else\n            m.message = \"error!bin path is a dir\"\n        end\n        return nil\n    end\n    return value\nend\n\n--- upx\no = s:option(ListValue, \"upxflag\", translate(\"use upx to compress bin after download\"))\no:value(\"\", translate(\"none\"))\no:value(\"-1\", translate(\"compress faster\"))\no:value(\"-9\", translate(\"compress better\"))\no:value(\"--best\", translate(\"compress best(can be slow for big files)\"))\no:value(\"--brute\", translate(\"try all available compression methods & filters [slow]\"))\no:value(\"--ultra-brute\", translate(\"try even more compression variants [very slow]\"))\no.default = \"\"\no.description = translate(\"bin use less space,but may have compatibility issues\")\no.rmempty = true\n\n---- config path\no = s:option(Value, \"configpath\", translate(\"Config Path\"), translate(\"AdGuardHome config path\"))\no.default = \"/etc/config/AdGuardHome.yaml\"\no.datatype = \"string\"\no.optional = false\no.rmempty = false\no.validate = function(self, value)\n    if value == nil then return nil end\n    if fs.stat(value, \"type\") == \"dir\" then fs.rmdir(value) end\n    if fs.stat(value, \"type\") == \"dir\" then\n        if m.message then\n            m.message = m.message .. \"\\nerror!config path is a dir\"\n        else\n            m.message = \"error!config path is a dir\"\n        end\n        return nil\n    end\n    return value\nend\n\n---- work dir\no = s:option(Value, \"workdir\", translate(\"Work dir\"), translate(\"AdGuardHome work dir include rules,audit log and database\"))\no.default = \"/usr/bin/AdGuardHome\"\no.datatype = \"string\"\no.optional = false\no.rmempty = false\no.validate = function(self, value)\n    if value == \"\" then return nil end\n    if fs.stat(value, \"type\") == \"reg\" then\n        if m.message then\n            m.message = m.message .. \"\\nerror!work dir is a file\"\n        else\n            m.message = \"error!work dir is a file\"\n        end\n        return nil\n    end\n    if string.sub(value, -1) == \"/\" then\n        return string.sub(value, 1, -2)\n    else\n        return value\n    end\nend\n\n---- log file\no = s:option(Value, \"logfile\", translate(\"Runtime log file\"), translate(\"AdGuardHome runtime Log file if 'syslog': write to system log;if empty no log\"))\no.datatype = \"string\"\no.rmempty = true\no.validate = function(self, value)\n    if fs.stat(value, \"type\") == \"dir\" then fs.rmdir(value) end\n    if fs.stat(value, \"type\") == \"dir\" then\n        if m.message then\n            m.message = m.message .. \"\\nerror!log file is a dir\"\n        else\n            m.message = \"error!log file is a dir\"\n        end\n        return nil\n    end\n    return value\nend\n\n---- debug\no = s:option(Flag, \"verbose\", translate(\"Verbose log\"))\no.default = 0\no.optional = true\n\n---- gfwlist \nlocal a = luci.sys.call(\"grep -m 1 -q programadd \" .. configpath)\nif (a == 0) then\n    a = \"Added\"\nelse\n    a = \"Not added\"\nend\n\no = s:option(Button, \"gfwdel\", translate(\"Del gfwlist\"), translate(a))\no.optional = true\no.inputtitle = translate(\"Del\")\no.write = function()\n    luci.sys.exec(\"sh /usr/share/AdGuardHome/gfw2adg.sh del 2>&1\")\n    luci.http.redirect(luci.dispatcher.build_url(\"admin\", \"services\", \"AdGuardHome\"))\nend\n\no = s:option(Button, \"gfwadd\", translate(\"Add gfwlist\"), translate(a))\no.optional = true\no.inputtitle = translate(\"Add\")\no.write = function()\n    luci.sys.exec(\"sh /usr/share/AdGuardHome/gfw2adg.sh 2>&1\")\n    luci.http.redirect(luci.dispatcher.build_url(\"admin\", \"services\", \"AdGuardHome\"))\nend\n\no = s:option(Value, \"gfwupstream\", translate(\"Gfwlist upstream dns server\"), translate(\"Gfwlist domain upstream dns service\") .. translate(a))\no.default = \"tcp://208.67.220.220:5353\"\no.datatype = \"string\"\no.optional = true\n\n---- chpass\no = s:option(Value, \"hashpass\", translate(\"Change browser management password\"), translate(\"Press load culculate model and culculate finally save/apply\"))\no.default = \"\"\no.datatype = \"string\"\no.template = \"AdGuardHome/AdGuardHome_chpass\"\no.optional = true\n\n---- upgrade protect\no = s:option(MultiValue, \"upprotect\", translate(\"Keep files when system upgrade\"))\no:value(\"$binpath\", translate(\"core bin\"))\no:value(\"$configpath\", translate(\"config file\"))\no:value(\"$logfile\", translate(\"log file\"))\no:value(\"$workdir/data/sessions.db\", translate(\"sessions.db\"))\no:value(\"$workdir/data/stats.db\", translate(\"stats.db\"))\no:value(\"$workdir/data/querylog.json\", translate(\"querylog.json\"))\no:value(\"$workdir/data/filters\", translate(\"filters\"))\no.widget = \"checkbox\"\no.default = nil\no.optional = true\n\n---- wait net on boot\no = s:option(Flag, \"waitonboot\", translate(\"On boot when network ok restart\"))\no.default = 1\no.optional = true\n\n---- backup workdir on shutdown\nlocal workdir = uci:get(\"AdGuardHome\", \"AdGuardHome\", \"workdir\") or \"/usr/bin/AdGuardHome\"\no = s:option(MultiValue, \"backupfile\", translate(\"Backup workdir files when shutdown\"))\no1 = s:option(Value, \"backupwdpath\", translate(\"Backup workdir path\"))\nlocal name\no:value(\"filters\", \"filters\")\no:value(\"stats.db\", \"stats.db\")\no:value(\"querylog.json\", \"querylog.json\")\no:value(\"sessions.db\", \"sessions.db\")\no1:depends(\"backupfile\", \"filters\")\no1:depends(\"backupfile\", \"stats.db\")\no1:depends(\"backupfile\", \"querylog.json\")\no1:depends(\"backupfile\", \"sessions.db\")\nfor name in fs.glob(workdir .. \"/data/*\") do\n    name = fs.basename(name)\n    if name ~= \"filters\" and name ~= \"stats.db\" and name ~= \"querylog.json\" and\n        name ~= \"sessions.db\" then\n        o:value(name, name)\n        o1:depends(\"backupfile\", name)\n    end\nend\no.widget = \"checkbox\"\no.default = nil\no.optional = false\no.description = translate(\"Will be restore when workdir/data is empty\")\n----backup workdir path\no1.default = \"/usr/bin/AdGuardHome\"\no1.datatype = \"string\"\no1.optional = false\no1.validate = function(self, value)\n    if fs.stat(value, \"type\") == \"reg\" then\n        if m.message then\n            m.message = m.message .. \"\\nerror!backup dir is a file\"\n        else\n            m.message = \"error!backup dir is a file\"\n        end\n        return nil\n    end\n    if string.sub(value, -1) == \"/\" then\n        return string.sub(value, 1, -2)\n    else\n        return value\n    end\nend\n\n----Crontab\no = s:option(MultiValue, \"crontab\", translate(\"Crontab task\"), translate(\"Please change time and args in crontab\"))\no:value(\"autoupdate\", translate(\"Auto update core\"))\no:value(\"cutquerylog\", translate(\"Auto tail querylog\"))\no:value(\"cutruntimelog\", translate(\"Auto tail runtime log\"))\no:value(\"autohost\", translate(\"Auto update ipv6 hosts and restart adh\"))\no:value(\"autogfw\", translate(\"Auto update gfwlist and restart adh\"))\no.widget = \"checkbox\"\no.default = nil\no.optional = true\n\n----downloadpath\no = s:option(TextValue, \"downloadlinks\", translate(\"Download links for update\"))\no.optional = false\no.rows = 4\no.wrap = \"soft\"\no.cfgvalue = function(self, section)\n    return fs.readfile(\"/usr/share/AdGuardHome/links.txt\")\nend\no.write = function(self, section, value)\n    fs.writefile(\"/usr/share/AdGuardHome/links.txt\", value:gsub(\"\\r\\n\", \"\\n\"))\nend\nfs.writefile(\"/var/run/lucilogpos\", \"0\")\nfunction m.on_commit(map)\n    if (fs.access(\"/var/run/AdGserverdis\")) then\n        io.popen(\"/etc/init.d/AdGuardHome reload &\")\n        return\n    end\n    local ucitracktest = uci:get(\"AdGuardHome\", \"AdGuardHome\", \"ucitracktest\")\n    if ucitracktest == \"1\" then\n        return\n    elseif ucitracktest == \"0\" then\n        io.popen(\"/etc/init.d/AdGuardHome reload &\")\n    else\n        if (fs.access(\"/var/run/AdGlucitest\")) then\n            uci:set(\"AdGuardHome\", \"AdGuardHome\", \"ucitracktest\", \"0\")\n            io.popen(\"/etc/init.d/AdGuardHome reload &\")\n        else\n            fs.writefile(\"/var/run/AdGlucitest\", \"\")\n            if (ucitracktest == \"2\") then\n                uci:set(\"AdGuardHome\", \"AdGuardHome\", \"ucitracktest\", \"1\")\n            else\n                uci:set(\"AdGuardHome\", \"AdGuardHome\", \"ucitracktest\", \"2\")\n            end\n        end\n        uci:commit(\"AdGuardHome\")\n    end\nend\nreturn m\n"
  },
  {
    "path": "luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/log.lua",
    "content": "local fs = require \"nixio.fs\"\nlocal uci = require\"luci.model.uci\".cursor()\nlocal f, t\nf = SimpleForm(\"logview\")\nf.reset = false\nf.submit = false\nt = f:field(TextValue, \"conf\")\nt.rmempty = true\nt.rows = 20\nt.template = \"AdGuardHome/log\"\nt.readonly = \"readonly\"\nlocal logfile = uci:get(\"AdGuardHome\", \"AdGuardHome\", \"logfile\") or \"\"\nt.timereplace = (logfile ~= \"syslog\" and logfile ~= \"\")\nt.pollcheck = logfile ~= \"\"\nfs.writefile(\"/var/run/lucilogpos\", \"0\")\nreturn f\n"
  },
  {
    "path": "luci-app-adguardhome/luasrc/model/cbi/AdGuardHome/manual.lua",
    "content": "local m, s, o\nlocal fs = require \"nixio.fs\"\nlocal uci = require\"luci.model.uci\".cursor()\nlocal sys = require \"luci.sys\"\nrequire(\"string\")\nrequire(\"io\")\nrequire(\"table\")\nfunction gen_template_config()\n    local b\n    local d = \"\"\n\tlocal file = \"/tmp/resolv.conf.d/resolv.conf.auto\"\n\tif not fs.access(file) then\n\t\tfile = \"/tmp/resolv.conf.auto\"\n\tend\n    for cnt in io.lines(file) do\n        b = string.match(cnt, \"^[^#]*nameserver%s+([^%s]+)$\")\n        if (b ~= nil) then d = d .. \"  - \" .. b .. \"\\n\" end\n    end\n    local f = io.open(\"/usr/share/AdGuardHome/AdGuardHome_template.yaml\", \"r+\")\n    local tbl = {}\n    local a = \"\"\n    while (1) do\n        a = f:read(\"*l\")\n        if (a == \"#bootstrap_dns\") then\n            a = d\n        elseif (a == \"#upstream_dns\") then\n            a = d\n        elseif (a == nil) then\n            break\n        end\n        table.insert(tbl, a)\n    end\n    f:close()\n    return table.concat(tbl, \"\\n\")\nend\n\nm = Map(\"AdGuardHome\")\nlocal configpath = uci:get(\"AdGuardHome\", \"AdGuardHome\", \"configpath\")\nlocal binpath = uci:get(\"AdGuardHome\", \"AdGuardHome\", \"binpath\")\ns = m:section(TypedSection, \"AdGuardHome\")\ns.anonymous = true\ns.addremove = false\n\n--- config\no = s:option(TextValue, \"escconf\")\no.rows = 66\no.wrap = \"off\"\no.rmempty = true\no.cfgvalue = function(self, section)\n    return fs.readfile(\"/tmp/AdGuardHometmpconfig.yaml\") or fs.readfile(configpath) or gen_template_config() or \"\"\nend\no.validate = function(self, value)\n    fs.writefile(\"/tmp/AdGuardHometmpconfig.yaml\", value:gsub(\"\\r\\n\", \"\\n\"))\n    if fs.access(binpath) then\n        if (sys.call(binpath .. \" -c /tmp/AdGuardHometmpconfig.yaml --check-config 2> /tmp/AdGuardHometest.log\") == 0) then return value end\n    else\n        return value\n    end\n    luci.http.redirect(luci.dispatcher.build_url(\"admin\", \"services\", \"AdGuardHome\", \"manual\"))\n    return nil\nend\no.write = function(self, section, value)\n    fs.move(\"/tmp/AdGuardHometmpconfig.yaml\", configpath)\nend\no.remove = function(self, section, value) fs.writefile(configpath, \"\") end\n\n--- js and reload button\no = s:option(DummyValue, \"\")\no.anonymous = true\no.template = \"AdGuardHome/yamleditor\"\nif not fs.access(binpath) then\n    o.description = translate(\"WARNING!!! no bin found apply config will not be test\")\nend\n\n--- log \nif (fs.access(\"/tmp/AdGuardHometmpconfig.yaml\")) then\n    local c = fs.readfile(\"/tmp/AdGuardHometest.log\")\n    if (c ~= \"\") then\n        o = s:option(TextValue, \"\")\n        o.readonly = true\n        o.rows = 5\n        o.rmempty = true\n        o.name = \"\"\n        o.cfgvalue = function(self, section)\n            return fs.readfile(\"/tmp/AdGuardHometest.log\")\n        end\n    end\nend\n\nfunction m.on_commit(map)\n    local ucitracktest = uci:get(\"AdGuardHome\", \"AdGuardHome\", \"ucitracktest\")\n    if ucitracktest == \"1\" then\n        return\n    elseif ucitracktest == \"0\" then\n        io.popen(\"/etc/init.d/AdGuardHome reload &\")\n    else\n        fs.writefile(\"/var/run/AdGlucitest\", \"\")\n    end\nend\nreturn m\n"
  },
  {
    "path": "luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_check.htm",
    "content": "<%+cbi/valueheader%>\n<%local fs=require\"nixio.fs\"%>\n<input type=\"button\" class=\"cbi-button cbi-button-apply\" id=\"apply_update_button\" value=\"<%:Update core version%>\" onclick=\" return apply_update() \"/>\n<input type=\"button\" class=\"cbi-button cbi-button-apply\" id=\"apply_forceupdate_button\" value=\"<%:Force update%>\" onclick=\" return apply_forceupdate()\" style=\"display:none\"/>\n<% if self.showfastconfig then %>\n<input type=\"button\" class=\"cbi-button cbi-button-apply\" id=\"to_configpage\" value=\"<%:Fast config%>\" onclick=\"location.href='<%=url([[admin]], [[services]], [[AdGuardHome]], [[manual]])%>'\"/>\n<%end%>\n<div id=\"logview\" style=\"display:none\">\n<input type=\"checkbox\" id=\"reversetag\" value=\"reverse\" onclick=\" return reverselog()\" style=\"vertical-align:middle;height: auto;\"><%:reverse%></input>\n<textarea id=\"cbid.logview.1.conf\" class=\"cbi-input-textarea\" style=\"width: 100%;display:block;\" data-update=\"change\" rows=\"5\" cols=\"60\" readonly=\"readonly\" > </textarea>\n</div>\n<script type=\"text/javascript\">//<![CDATA[\nvar updatebtn = document.getElementById('apply_update_button');\nvar forceupdatebtn = document.getElementById('apply_forceupdate_button');\nvar islogreverse = false;\nfunction apply_forceupdate(){\n\tXHR.get('<%=url([[admin]], [[services]], [[AdGuardHome]], [[doupdate]])%>',{ force: 1 },function(x, data){}\n\t\t);\n\tupdatebtn.disabled = true;\n\tpoll_check();\n\treturn\n}\nfunction reverselog(){\n\tvar lv = document.getElementById('cbid.logview.1.conf');\n\tlv.innerHTML=lv.innerHTML.split('\\n').reverse().join('\\n')\n\tif (islogreverse){\n\tislogreverse=false;\n\t}else{\n\tislogreverse=true;\n\t}\n\treturn\n}\nfunction apply_update(){\n\tXHR.get('<%=url([[admin]], [[services]], [[AdGuardHome]], [[doupdate]])%>',null,function(x, data){}\n\t\t);\n\tupdatebtn.disabled = true;\n\tupdatebtn.value    = '<%:Check...%>';\n\tforceupdatebtn.style.display=\"inline\"\n\tpoll_check();\n\treturn\n}\nfunction poll_check(){\nvar tag = document.getElementById('logview');\n\ttag.style.display=\"block\"\nXHR.poll(3, '<%=url([[admin]], [[services]], [[AdGuardHome]], [[check]])%>', null,\n\tfunction(x, data) {\n\t\tvar lv = document.getElementById('cbid.logview.1.conf');\n\t\tif (x.responseText && lv) {\n\t\t\tif (x.responseText==\"\\u0000\"){\n\t\t\t\tfor(j = 0,len=this.XHR._q.length; j < len; j++) {\n\t\t\t\t\tif (this.XHR._q[j].url == '<%=url([[admin]], [[services]], [[AdGuardHome]], [[check]])%>'){\n\t\t\t\t\t\tthis.XHR._q.splice(j,1);\n\t\t\t\t\t\tupdatebtn.disabled = false;\n\t\t\t\t\t\tupdatebtn.value    = '<%:Updated%>';\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn\t\n\t\t\t}\n\t\t\tif (islogreverse){\n\t\t\t\tlv.innerHTML = x.responseText.split('\\n').reverse().join('\\n')+lv.innerHTML;\n\t\t\t}else{\n\t\t\t\tlv.innerHTML += x.responseText;\n\t\t\t}\n\t\t}\n\t}\n);}\n<% if fs.access(\"/var/run/update_core\") then %>\n\tupdatebtn.disabled = true;\n\tupdatebtn.value    = '<%:Check...%>';\n\tforceupdatebtn.style.display=\"inline\"\n\tpoll_check();\n<%elseif fs.access(\"/var/run/update_core_error\") then %>\n\tpoll_check();\n<%end%>\n//]]>\n</script>\n<%+cbi/valuefooter%>"
  },
  {
    "path": "luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_chpass.htm",
    "content": "<%+cbi/valueheader%>\n<script type=\"text/javascript\">//<![CDATA[\nfunction chpass(btn)\n\t{\n\t\tbtn.disabled = true;\n\t\tbtn.value    = '<%:loading...%>';\n\t\tif (typeof bcryptloaded == 'undefined' ){\n\t\tvar theHead = document.getElementsByTagName('head').item(0);\n\t\t//创建脚本的dom对象实例\n\t\tvar myScript = document.createElement('script');\n\t\tmyScript.src = '<%=resource%>/twin-bcrypt.min.js';            //指定脚本路径\n\t\tmyScript.type = 'text/javascript';    //指定脚本类型\n\t\tmyScript.defer = true;                //程序下载完后再解析和执行\n\t\ttheHead.appendChild(myScript);\n\t\tbcryptloaded=1;\n\t\tbtn.value    = '<%:Culculate%>';\n\t\tbtn.disabled = false;\n\t\treturn\n\t\t}\n\t\tvar lv = document.getElementById('cbid.AdGuardHome.AdGuardHome.hashpass');\n\t\tif (lv.value != \"\"){\n\t\tvar hash = TwinBcrypt.hashSync(lv.value);\n\t\tlv.value=hash;\n\t\tbtn.value    = '<%:Please save/apply%>';\n\t\t}else{\n\t\tbtn.value    = '<%:is empty%>';\n\t\tbtn.disabled = false;\n\t\t}\n\t}\n//]]>\n</script> \n\t\t<input data-update=\"change\"<%=\n\t\tattr(\"id\", cbid) ..\n\t\tattr(\"name\", cbid) ..\n\t\tattr(\"type\", self.password and \"password\" or \"text\") ..\n\t\tattr(\"class\", self.password and \"cbi-input-password\" or \"cbi-input-text\") ..\n\t\tattr(\"value\", self:cfgvalue(section) or self.default) ..\n\t\tifattr(self.size, \"size\") ..\n\t\tifattr(self.placeholder, \"placeholder\") ..\n\t\tifattr(self.readonly, \"readonly\") ..\n\t\tifattr(self.maxlength, \"maxlength\") ..\n\t\tifattr(self.datatype, \"data-type\", self.datatype) ..\n\t\tifattr(self.datatype, \"data-optional\", self.optional or self.rmempty) ..\n\t\tifattr(self.combobox_manual, \"data-manual\", self.combobox_manual) ..\n\t\tifattr(#self.keylist > 0, \"data-choices\", { self.keylist, self.vallist })\n\t%> />\n\t<% if self.password then %><img src=\"<%=resource%>/cbi/reload.gif\" style=\"vertical-align:middle\" title=\"<%:Reveal/hide password%>\" onclick=\"var e = document.getElementById('<%=cbid%>'); e.type = (e.type=='password') ? 'text' : 'password';\" /><% end %>\n\t<input type=\"button\" class=\"cbi-button cbi-button-apply\" id=\"cbid.AdGuardHome.AdGuardHome.applychpass\" value=\"<%:Load culculate model%>\" onclick=\"return chpass(this)\"/>\n<%+cbi/valuefooter%>"
  },
  {
    "path": "luci-app-adguardhome/luasrc/view/AdGuardHome/AdGuardHome_status.htm",
    "content": "<script type=\"text/javascript\">//<![CDATA[\nXHR.poll(3, '<%=url([[admin]], [[services]], [[AdGuardHome]], [[status]])%>', null,\n\tfunction(x, data) {\n\t\tvar tb = document.getElementById('AdGuardHome_status');\n\t\tif (data && tb) {\n\t\t\tif (data.running) {\n\t\t\t\ttb.innerHTML = '<em><b><font color=green>AdGuardHome <%:RUNNING%></font></b></em>';\n\t\t\t} else {\n\t\t\t\ttb.innerHTML = '<em><b><font color=red>AdGuardHome <%:NOT RUNNING%></font></b></em>';\n\t\t\t}\n\t\t\tif (data.redirect)\n\t\t\t{\n\t\t\t\ttb.innerHTML+='<em><b><font color=green><%:Redirected%></font></b></em>'\n\t\t\t} else {\n\t\t\t\ttb.innerHTML+='<em><b><font color=red><%:Not redirect%></font></b></em>'\t\n\t\t\t}\n\t\t}\n\t}\n);\n//]]>\n</script>\n<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>\n<fieldset class=\"cbi-section\">\n\t<p id=\"AdGuardHome_status\">\n\t\t<em><%:Collecting data...%></em>\n\t</p>\n</fieldset>"
  },
  {
    "path": "luci-app-adguardhome/luasrc/view/AdGuardHome/log.htm",
    "content": "<%+cbi/valueheader%>\n<input type=\"checkbox\" name=\"NAME\" value=\"reverse\" onclick=\" return reverselog()\" style=\"vertical-align:middle;height: auto;\" checked><%:reverse%></input>\n<%if self.timereplace then%>\n<input type=\"checkbox\" name=\"NAME\" value=\"localtime\" onclick=\" return chlogtime()\" style=\"vertical-align:middle;height: auto;\" checked><%:localtime%></input><br>\n<%end%>\n<textarea id=\"cbid.logview.1.conf\" class=\"cbi-input-textarea\" style=\"width: 100%;display:inline\" data-update=\"change\" rows=\"32\" cols=\"60\" readonly=\"readonly\" > </textarea>\n<input type=\"button\" class=\"cbi-button cbi-button-apply\" id=\"apply_update_button\" value=\"<%:dellog%>\" onclick=\" return apply_del_log() \"/>\n<input type=\"button\" class=\"cbi-button cbi-button-apply\" value=\"<%:download log%>\" style=\" display:inline;\" onclick=\" return download_log()\" />\n<script type=\"text/javascript\">//<![CDATA[\nvar islogreverse = true;\nvar isutc2local = <%=tostring(self.timereplace)%>;\nfunction createAndDownloadFile(fileName, content) {\n    var aTag = document.createElement('a');\n    var blob = new Blob([content]);\n    aTag.download = fileName;\n    aTag.href = URL.createObjectURL(blob);\n    aTag.click();\n    URL.revokeObjectURL(blob);\n}\nfunction download_log(){\n\tvar lv = document.getElementById('cbid.logview.1.conf');\n\tvar dt = new Date();\n\tvar timestamp = (dt.getMonth()+1)+\"-\"+dt.getDate()+\"-\"+dt.getHours()+\"_\"+dt.getMinutes();\n\tcreateAndDownloadFile(\"AdGuardHome\"+timestamp+\".log\",lv.innerHTML)\n\treturn\n}\nfunction apply_del_log(){\n\tXHR.get('<%=url([[admin]], [[services]], [[AdGuardHome]], [[dodellog]])%>',null,function(x, data){\n\tvar lv = document.getElementById('cbid.logview.1.conf');\n\t\tlv.innerHTML=\"\";\n\t}\n\t\t);\n\treturn\n}\nfunction chlogtime(){\n\tvar lv = document.getElementById('cbid.logview.1.conf');\n\tif (isutc2local){\n\tlv.innerHTML=line_toUTC(lv.innerHTML).join('\\n');\n\tisutc2local=false;\n\t}else{\n\tlv.innerHTML=line_tolocal(lv.innerHTML).join('\\n');\n\tisutc2local=true;\n\t}\n\treturn\n}\nfunction reverselog(){\n\tvar lv = document.getElementById('cbid.logview.1.conf');\n\tlv.innerHTML=lv.innerHTML.split('\\n').reverse().join('\\n')\n\tif (islogreverse){\n\tislogreverse=false;\n\t}else{\n\tislogreverse=true;\n\t}\n\treturn\n}\nfunction p(s) {\n        return s < 10 ? '0' + s: s;\n}\nfunction line_tolocal(str){\nvar strt=new Array();\nstr.trim().split('\\n').forEach(function(v, i) {\nvar dt = new Date(v.substring(0,19)+\" UTC\");\nif (dt != \"Invalid Date\"){\n  strt[i]=dt.getFullYear()+\"/\"+p(dt.getMonth()+1)+\"/\"+p(dt.getDate())+\" \"+p(dt.getHours())+\":\"+p(dt.getMinutes())+\":\"+p(dt.getSeconds())+v.substring(19);\n}else{\n  strt[i]=v;}})\nreturn strt\n}\nfunction line_toUTC(str){\nvar strt=new Array();\nstr.trim().split('\\n').forEach(function(v, i) {\nvar dt = new Date(v.substring(0,19))\nif (dt != \"Invalid Date\"){\n  strt[i]=dt.getUTCFullYear()+\"/\"+p(dt.getUTCMonth()+1)+\"/\"+p(dt.getUTCDate())+\" \"+p(dt.getUTCHours())+\":\"+p(dt.getUTCMinutes())+\":\"+p(dt.getUTCSeconds())+v.substring(19);\n}else{\n  strt[i]=v;}})\nreturn strt\n}\nfunction poll_check(){\nXHR.poll(3, '<%=url([[admin]], [[services]], [[AdGuardHome]], [[getlog]])%>', null,\n\tfunction(x, data) {\n\t\tvar lv = document.getElementById('cbid.logview.1.conf');\n\t\tif (x.responseText && lv) {\n\t\t\tif (isutc2local)\n\t\t\t{\n\t\t\t\tvar lines=line_tolocal(x.responseText);\n\t\t\t\tif (islogreverse){\n\t\t\t\t\tlv.innerHTML = lines.reverse().join('\\n')+lv.innerHTML;\n\t\t\t\t}else{\n\t\t\t\t\tlv.innerHTML += lines.join('\\n');\n\t\t\t\t}\n\t\t\t}else{\n\t\t\t\tif (islogreverse){\n\t\t\t\t\tlv.innerHTML = x.responseText.split('\\n').reverse().join('\\n')+lv.innerHTML;\n\t\t\t\t}else{\n\t\t\t\t\tlv.innerHTML += x.responseText;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n);}\n<%if self.pollcheck then%>\npoll_check();\n<%else%>\nvar lv = document.getElementById('cbid.logview.1.conf');\nlv.innerHTML=\"<%:Please add log path in config to enable log%>\"\n<%end%>\n//]]>\n</script>\t\n<%+cbi/valuefooter%>"
  },
  {
    "path": "luci-app-adguardhome/luasrc/view/AdGuardHome/yamleditor.htm",
    "content": "<%+cbi/valueheader%>\n<script src=\"/luci-static/resources/codemirror/lib/codemirror.js\"></script>\n<link rel=\"stylesheet\" href=\"/luci-static/resources/codemirror/lib/codemirror.css\"/>\n<script src=\"/luci-static/resources/codemirror/mode/yaml/yaml.js\"></script>\n<link rel=\"stylesheet\" href=\"/luci-static/resources/codemirror/theme/dracula.css\"/>\n<link rel=\"stylesheet\" href=\"/luci-static/resources/codemirror/addon/fold/foldgutter.css\"/>\n<script src=\"/luci-static/resources/codemirror/addon/fold/foldcode.js\"></script>\n<script src=\"/luci-static/resources/codemirror/addon/fold/foldgutter.js\"></script>\n<script src=\"/luci-static/resources/codemirror/addon/fold/indent-fold.js\"></script>\n<script type=\"text/javascript\">//<![CDATA[\nvar editor = CodeMirror.fromTextArea(document.getElementById(\"cbid.AdGuardHome.AdGuardHome.escconf\"), {\nmode: \"text/yaml\",    //实现groovy代码高亮\nstyleActiveLine: true,\nlineNumbers: true,\t//显示行号\ntheme: \"dracula\",\t//设置主题\nlineWrapping: true,\t//代码折叠\nfoldGutter: true,\ngutters: [\"CodeMirror-linenumbers\", \"CodeMirror-foldgutter\"],\nmatchBrackets: true //括号匹配\n}\n);\nfunction reload_config(){\n\tXHR.get('<%=url([[admin]], [[services]], [[AdGuardHome]], [[reloadconfig]])%>', null,\n\tfunction(x, data) {\n\tlocation.reload();\n\t});}\nfunction use_template(){\n\tXHR.get('<%=url([[admin]], [[services]], [[AdGuardHome]], [[gettemplateconfig]])%>', null,\n\tfunction(x, data) {\n\teditor.setValue(x.responseText)\n\t});}\n//]]>\n</script> \n<%fs=require\"nixio.fs\"%>\n<%if fs.access(\"/tmp/AdGuardHometmpconfig.yaml\") then%>\n<input type=\"button\" id=\"apply_update_button\" value=\"<%:Reload Config%>\" onclick=\" return reload_config() \"/>\n<%end%>\n<input type=\"button\" id=\"template_button\" value=\"<%:Use template%>\" onclick=\" return use_template() \"/>\n<%+cbi/valuefooter%>"
  },
  {
    "path": "luci-app-adguardhome/po/zh_Hans/AdGuardHome.po",
    "content": "#/cgi-bin/luci/admin/services/AdGuardHome\nmsgid \"Base Setting\"\nmsgstr \"基础设置\"\n\nmsgid \"Log\"\nmsgstr \"日志\"\n\nmsgid \"Manual Config\"\nmsgstr \"手动设置\"\n\nmsgid \"Free and open source, powerful network-wide ads & trackers blocking DNS server.\"\nmsgstr \"免费去广告和跟踪程序拦截DNS服务器，网页管理初始账号和密码均为：admin\"\n\nmsgid \"RUNNING\"\nmsgstr \"运行中\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\nmsgid \"Redirected\"\nmsgstr \"已重定向\"\n\nmsgid \"Not redirect\"\nmsgstr \"未重定向\"\n\nmsgid \"Collecting data...\"\nmsgstr \"获取数据中...\"\n\nmsgid \"Enable\"\nmsgstr \"启用\"\n\nmsgid \"Browser management port\"\nmsgstr \"网页管理端口\"\n\nmsgid \"Update\"\nmsgstr \"更新\"\n#button change\nmsgid \"Update core version\"\nmsgstr \"更新核心版本\"\n\nmsgid \"Check...\"\nmsgstr \"检查中...\"\n\nmsgid \"Updated\"\nmsgstr \"已更新\"\n\n#button hide\nmsgid \"Force update\"\nmsgstr \"强制更新\"\n\nmsgid \"Fast config\"\nmsgstr \"快速配置\"\n#\nmsgid \"core version:\"\nmsgstr \"核心版本:\"\n#description change\nmsgid \"no config\"\nmsgstr \"没有配置文件\"\nmsgid \"no core\"\nmsgstr \"没有核心\"\n#\nmsgid \"Redirect\"\nmsgstr \"重定向\"\n#inlist\nmsgid \"none\"\nmsgstr \"无\"\n\nmsgid \"Run as dnsmasq upstream server\"\nmsgstr \"作为dnsmasq的上游服务器\"\n\nmsgid \"Redirect 53 port to AdGuardHome\"\nmsgstr \"重定向53端口到AdGuardHome\"\n\nmsgid \"Use port 53 replace dnsmasq\"\nmsgstr \"使用53端口替换dnsmasq\"\n#\nmsgid \"AdGuardHome redirect mode\"\nmsgstr \"AdGuardHome重定向模式\"\n\nmsgid \"Bin Path\"\nmsgstr \"执行文件路径\"\n\nmsgid \"AdGuardHome Bin path if no bin will auto download\"\nmsgstr \"AdGuardHome 执行文件路径 如果没有执行文件将自动下载\"\n\nmsgid \"use upx to compress bin after download\"\nmsgstr \"下载后使用upx压缩执行文件\"\n#inlist\nmsgid \"compress faster\"\nmsgstr \"快速压缩\"\n\nmsgid \"compress better\"\nmsgstr \"更好的压缩\"\n\nmsgid \"compress best(can be slow for big files)\"\nmsgstr \"最好的压缩(大文件可能慢)\"\n\nmsgid \"try all available compression methods & filters [slow]\"\nmsgstr \"尝试所有可能的压缩方法和过滤器[慢]\"\n\nmsgid \"try even more compression variants [very slow]\"\nmsgstr \"尝试更多变体压缩手段[很慢]\"\n\nmsgid \"bin use less space,but may have compatibility issues\"\nmsgstr \"减小执行文件空间占用，但是可能压缩后有兼容性问题\"\n#\nmsgid \"Config Path\"\nmsgstr \"配置文件路径\"\n\nmsgid \"AdGuardHome config path\"\nmsgstr \"AdGuardHome 配置文件路径\"\n\nmsgid \"Work dir\"\nmsgstr \"工作目录\"\n\nmsgid \"AdGuardHome work dir include rules,audit log and database\"\nmsgstr \"AdGuardHome 工作目录包含规则，审计日志和数据库\"\n\nmsgid \"Runtime log file\"\nmsgstr \"运行日志\"\n\nmsgid \"AdGuardHome runtime Log file if 'syslog': write to system log;if empty no log\"\nmsgstr \"AdGuardHome 运行日志 如果填syslog将写入系统日志；如果空则不记录日志\"\n\nmsgid \"Verbose log\"\nmsgstr \"详细日志\"\n#hide div\nmsgid \"Add gfwlist\"\nmsgstr \"加入gfw列表\"\n\nmsgid \"Add\"\nmsgstr \"添加\"\n\nmsgid \"Added\"\nmsgstr \"已添加\"\n\nmsgid \"Not added\"\nmsgstr \"未添加\"\n#hide div\nmsgid \"Del gfwlist\"\nmsgstr \"删除gfw列表\"\n\nmsgid \"Del\"\nmsgstr \"删除\"\n#hide div\nmsgid \"Gfwlist upstream dns server\"\nmsgstr \"gfw列表上游服务器\"\n\nmsgid \"Gfwlist domain upstream dns service\"\nmsgstr \"gfw列表域名上游服务器\"\n#hide div\nmsgid \"Change browser management password\"\nmsgstr \"改变网页登录密码\"\n\nmsgid \"Culculate\"\nmsgstr \"计算\"\n##button change\nmsgid \"Load culculate model\"\nmsgstr \"载入计算模块\"\n\nmsgid \"loading...\"\nmsgstr \"载入中\"\n\nmsgid \"Please save/apply\"\nmsgstr \"请提交\"\n\nmsgid \"is empty\"\nmsgstr \"为空\"\n\nmsgid \"Press load culculate model and culculate finally save/apply\"\nmsgstr \"按载入计算模块 然后计算 最后保存/提交\"\n#\nmsgid \"Keep files when system upgrade\"\nmsgstr \"系统升级时保留文件\"\n#checkbox\nmsgid \"core bin\"\nmsgstr \"核心执行文件\"\n\nmsgid \"config file\"\nmsgstr \"配置文件\"\n\nmsgid \"log file\"\nmsgstr \"日志文件\"\n\nmsgid \"querylog.json\"\nmsgstr \"审计日志.json\"\n#\nmsgid \"On boot when network ok restart\"\nmsgstr \"开机后网络准备好时重启\"\n\nmsgid \"Backup workdir files when shutdown\"\nmsgstr \"在关机时备份工作目录文件\"\n\nmsgid \"Will be restore when workdir/data is empty\"\nmsgstr \"在工作目录/data为空的时候恢复\"\n\nmsgid \"Backup workdir path\"\nmsgstr \"工作目录备份路径\"\n\nmsgid \"Crontab task\"\nmsgstr \"计划任务\"\n\nmsgid \"Auto update core\"\nmsgstr \"自动升级核心\"\n\nmsgid \"Auto tail querylog\"\nmsgstr \"自动截短查询日志\"\n\nmsgid \"Auto tail runtime log\"\nmsgstr \"自动截短运行日志\"\n\nmsgid \"Auto update ipv6 hosts and restart adh\"\nmsgstr \"自动更新ipv6主机并重启adh\"\n\nmsgid \"Auto update gfwlist and restart adh\"\nmsgstr \"自动更新gfw列表并重启adh\"\n\nmsgid \"Please change time and args in crontab\"\nmsgstr \"请在计划任务中修改时间和参数\"\n\nmsgid \"Download links for update\"\nmsgstr \"升级用的下载链接\"\n\n#/cgi-bin/luci/admin/services/AdGuardHome/log/\nmsgid \"reverse\"\nmsgstr \"逆序\"\n\nmsgid \"localtime\"\nmsgstr \"本地时间\"\n\nmsgid \"Please add log path in config to enable log\"\nmsgstr \"请在设置里填写日志路径以启用日志\"\n\nmsgid \"dellog\"\nmsgstr \"删除日志\"\n\nmsgid \"download log\"\nmsgstr \"下载日志\"\n\n#/cgi-bin/luci//admin/services/AdGuardHome/manual/\nmsgid \"Use template\"\nmsgstr \"使用模板\"\n#hide button\nmsgid \"Reload Config\"\nmsgstr \"重新载入配置\"\n\nmsgid \"WARNING!!! no bin found apply config will not be test\"\nmsgstr \"警告！！！未找到执行文件，提交配置将不会进行校验\"\n#unused\nmsgid \"Change browser management username\"\nmsgstr \"改变网页登录用户名\"\n\nmsgid \"Username\"\nmsgstr \"用户名\"\n\nmsgid \"Check Config\"\nmsgstr \"检查配置\"\n\nmsgid \"unknown\"\nmsgstr \"未知\"\n\nmsgid \"Keep database when system upgrade\"\nmsgstr \"系统升级时保留数据\"\n\nmsgid \"Boot delay until network ok\"\nmsgstr \"开机时直到网络准备好再启动\"\n"
  },
  {
    "path": "luci-app-adguardhome/root/etc/config/AdGuardHome",
    "content": "config AdGuardHome 'AdGuardHome'\n\toption enabled '0'\n\toption httpport '3000'\n\toption configpath '/etc/config/AdGuardHome.yaml'\n\toption workdir '/tmp/AdGuardHome'\n\toption logfile '/tmp/AdGuardHome.log'\n\toption verbose '0'\n\toption binpath '/usr/bin/AdGuardHome/AdGuardHome'\n\toption upxflag ''\n\toption redirect 'dnsmasq-upstream'\n\toption waitonboot '0'\n\toption ucitracktest '1'\n"
  },
  {
    "path": "luci-app-adguardhome/root/etc/config/AdGuardHome.yaml",
    "content": "http:\n  address: 0.0.0.0:3000\n  session_ttl: 720h\nusers:\n  - name: admin\n    password: $2y$10$vHRcARdPCieYG3RXWomV5evDYN.Nj/edtwEkQgQJZcK6z7qTLaIc6\nauth_attempts: 5\nblock_auth_min: 15\nhttp_proxy: \"\"\nlanguage: zh-cn\ntheme: auto\ndebug_pprof: false\ndns:\n  bind_hosts:\n    - 0.0.0.0\n  port: 1745\n  anonymize_client_ip: false\n  protection_enabled: true\n  blocking_mode: default\n  blocking_ipv4: \"\"\n  blocking_ipv6: \"\"\n  blocked_response_ttl: 10\n  protection_disabled_until: null\n  parental_block_host: family-block.dns.adguard.com\n  safebrowsing_block_host: standard-block.dns.adguard.com\n  ratelimit: 0\n  ratelimit_whitelist: []\n  refuse_any: false\n  upstream_dns:\n    - 223.5.5.5\n  upstream_dns_file: \"\"\n  bootstrap_dns:\n    - 119.29.29.29\n    - 223.5.5.5\n  all_servers: false\n  fastest_addr: false\n  fastest_timeout: 1s\n  allowed_clients: []\n  disallowed_clients: []\n  blocked_hosts:\n    - version.bind\n    - id.server\n    - hostname.bind\n  trusted_proxies:\n    - 127.0.0.0/8\n    - ::1/128\n  cache_size: 4194304\n  cache_ttl_min: 0\n  cache_ttl_max: 0\n  cache_optimistic: true\n  bogus_nxdomain: []\n  aaaa_disabled: false\n  enable_dnssec: false\n  edns_client_subnet: false\n  max_goroutines: 300\n  ipset: []\n  filtering_enabled: true\n  filters_update_interval: 24\n  parental_enabled: false\n  safesearch_enabled: false\n  safebrowsing_enabled: false\n  safebrowsing_cache_size: 1048576\n  safesearch_cache_size: 1048576\n  parental_cache_size: 1048576\n  cache_time: 30\n  rewrites: []\n  blocked_services: []\n  upstream_timeout: 10s\n  private_networks: []\n  use_private_ptr_resolvers: true\n  local_ptr_upstreams: []\ntls:\n  enabled: false\n  server_name: \"\"\n  force_https: false\n  port_https: 443\n  port_dns_over_tls: 853\n  port_dns_over_quic: 784\n  port_dnscrypt: 0\n  dnscrypt_config_file: \"\"\n  allow_unencrypted_doh: false\n  certificate_chain: \"\"\n  private_key: \"\"\n  certificate_path: \"\"\n  private_key_path: \"\"\nfilters:\n  - enabled: true\n    url: https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt\n    name: AdGuard DNS filter\n    id: 1228750870\n  - enabled: true\n    url: http://sub.adtchrome.com/adt-chinalist-easylist.txt\n    name: 广告终结者使用的拦截规则，基于ChinaList+EasyList修正维护\n    id: 139789181\n  - enabled: true\n    url: https://easylist-downloads.adblockplus.org/easylist.txt\n    name: EasyList-去除国际网页中大多数广告，包括不需要的框架、图像和对象\n    id: 139789112\n  - enabled: true\n    url: https://easylist-downloads.adblockplus.org/easylistchina.txt\n    name: EasyList China-EasyList针对国内的补充规则\n    id: 139789121\n  - enabled: true\n    url: https://anti-ad.net/adguard.txt\n    name: anti-AD命中率最高列表\n    id: 139789122\n  - enabled: false\n    url: https://raw.iqiq.io/banbendalao/ADgk/master/ADgk.txt\n    name: ADgk去广告easylistchina补充规则\n    id: 139789131\n  - enabled: false\n    url: https://raw.iqiq.io/banbendalao/ADgk/master/kill-baidu-ad.txt\n    name: ADgk百度广告过滤\n    id: 139789133\n  - enabled: false\n    url: https://pgl.yoyo.org/adservers/serverlist.php?hostformat=hosts&showintro=1&mimetype=plaintext\n    name: Peter Lowe’s Ad and tracking server list​\n    id: 139789152\n  - enabled: false\n    url: https://easylist.to/easylist/fanboy-social.txt\n    name: Fanboy's Social Blocking List\n    id: 139789153\n  - enabled: false\n    url: https://easylist.to/easylist/fanboy-annoyance.txt\n    name: Fanboy's Annoyance List\n    id: 139789154\n  - enabled: false\n    url: https://secure.fanboy.co.nz/fanboy-cookiemonster.txt\n    name: EasyList Cookie List\n    id: 139789155\n  - enabled: false\n    url: https://fanboy.co.nz/fanboy-antifacebook.txt\n    name: Anti-Facebook List\n    id: 139789161\n  - enabled: false\n    url: https://filters.adtidy.org/extension/ublock/filters/14.txt\n    name: AdGuard Annoyances filter\n    id: 139789162\n  - enabled: false\n    url: https://www.fanboy.co.nz/enhancedstats.txt\n    name: Fanboy's Enhanced Tracking List\n    id: 139789164\n  - enabled: false\n    url: https://filters.adtidy.org/extension/ublock/filters/3.txt\n    name: AdGuard Tracking Protection filter\n    id: 139789165\n  - enabled: false\n    url: https://easylist.to/easylist/easylist.txt\n    name: EasyList\n    id: 139789171\n  - enabled: false\n    url: https://filters.adtidy.org/extension/ublock/filters/11.txt\n    name: AdGuard Mobile Ads filter\n    id: 139789172\n  - enabled: false\n    url: https://filters.adtidy.org/extension/ublock/filters/2_without_easylist.txt\n    name: AdGuard Base filter\n    id: 139789173\n  - enabled: false\n    url: https://easylist-downloads.adblockplus.org/antiadblockfilters.txt\n    name: Adblock Warning Removal List\n    id: 139789174\n  - enabled: false\n    url: https://fanboy.co.nz/fanboy-problematic-sites.txt\n    name: Fanboy's problematic-sites\n    id: 139789175\n  - enabled: false\n    url: https://adaway.org/hosts.txt\n    name: Adaway HOST\n    id: 139789187\nwhitelist_filters: []\nuser_rules:\n  - '@@||taobao.com^$important'\n  - '@@||tmall.com^$important'\n  - '@@||jd.com^important'\n  - '@@||flyme.cn^$important'\n  - '@@||meizu.com^$important'\n  - '@@||wl.jd.com^$important'\n  - '@@||flydigi.com^'\n  - '@@||pv.sohu.com^$important'\n  - /googleads.$~script,domain=~googleads.github.io\n  - /pagead/lvz?\n  - '||google.com/pagead/'\n  - '||static.doubleclick.net^$domain=youtube.com'\n  - '||youtube.com/get_midroll_'\n  - '||5hz.org^'\n  - '@@||000714.xyz^'\n  - '@@||blueskyxn.com^'\n  - '||topnewsfeeds.net^'\n  - '||nbryb.com^'\n  - '||superbdolly.com^'\n  - '||salutationcheerlessdemote.com^'\n  - '||buildingdoodlesquare.com^'\n  - '||colonistnobilityheroic.com^'\ndhcp:\n  enabled: false\n  interface_name: \"\"\n  dhcpv4:\n    gateway_ip: \"\"\n    subnet_mask: \"\"\n    range_start: \"\"\n    range_end: \"\"\n    lease_duration: 86400\n    icmp_timeout_msec: 1000\n    options: []\n  dhcpv6:\n    range_start: \"\"\n    lease_duration: 86400\n    ra_slaac_only: false\n    ra_allow_slaac: false\nclients: []\nlog_compress: false\nlog_localtime: false\nlog_max_backups: 0\nlog_max_size: 100\nlog_max_age: 3\nlog_file: \"\"\nverbose: false\nschema_version: 10\n"
  },
  {
    "path": "luci-app-adguardhome/root/etc/init.d/AdGuardHome",
    "content": "#!/bin/sh /etc/rc.common\n\nUSE_PROCD=1\n\nSTART=95\nSTOP=01\n\nCONFIGURATION=AdGuardHome\nCRON_FILE=/etc/crontabs/root\nEXTRA_COMMANDS=\"do_redirect testbackup test_crontab force_reload isrunning\"\nEXTRA_HELP=\"        do_redirect 0 or 1\\\n        testbackup backup or restore\\\n\t\ttest_crontab\n\t\tforce_reload\n\t\tisrunning\"\nset_forward_dnsmasq()\n{\n\tlocal PORT=\"$1\"\n\taddr=\"127.0.0.1#$PORT\"\n\tOLD_SERVER=\"`uci get dhcp.@dnsmasq[0].server 2>/dev/null`\"\n\techo $OLD_SERVER | grep \"^$addr\" >/dev/null 2>&1\n\tif [ $? -eq 0 ]; then\n\t\treturn\n\tfi\n\tuci delete dhcp.@dnsmasq[0].server 2>/dev/null\n\tuci add_list dhcp.@dnsmasq[0].server=$addr\n\tfor server in $OLD_SERVER; do\n\t\tif [ \"$server\" = \"$addr\" ]; then\n\t\t\tcontinue\n\t\tfi\n\t\tuci add_list dhcp.@dnsmasq[0].server=$server\n\tdone\n\tuci delete dhcp.@dnsmasq[0].resolvfile 2>/dev/null\n\tuci set dhcp.@dnsmasq[0].noresolv=1\n\tuci commit dhcp\n\t/etc/init.d/dnsmasq restart\n}\n\nstop_forward_dnsmasq()\n{\n\tlocal OLD_PORT=\"$1\"\n\taddr=\"127.0.0.1#$OLD_PORT\"\n\tOLD_SERVER=\"`uci get dhcp.@dnsmasq[0].server 2>/dev/null`\"\n\techo $OLD_SERVER | grep \"^$addr\" >/dev/null 2>&1\n\tif [ $? -ne 0 ]; then\n\t\treturn\n\tfi\n\n\tuci del_list dhcp.@dnsmasq[0].server=$addr 2>/dev/null\n\taddrlist=\"`uci get dhcp.@dnsmasq[0].server 2>/dev/null`\"\n\tif [ -z \"$addrlist\" ] ; then\n\t\tresolvfile=\"/tmp/resolv.conf.d/resolv.conf.auto\"\n\t\t[ ! -f \"$resolvfile\" ] && resolvfile=\"/tmp/resolv.conf.auto\"\n\t\tuci set dhcp.@dnsmasq[0].resolvfile=\"$resolvfile\" 2>/dev/null\n\t\tuci delete dhcp.@dnsmasq[0].noresolv 2>/dev/null\n\tfi\n\tuci commit dhcp\n\t/etc/init.d/dnsmasq restart\n}\n\nset_iptable()\n{\n\tlocal ipv6_server=$1\n\tlocal tcp_server=$2\n\tuci -q batch <<-EOF >/dev/null 2>&1\n  delete firewall.AdGuardHome\n\tset firewall.AdGuardHome=include\n\tset firewall.AdGuardHome.type=script\n\tset firewall.AdGuardHome.path=/usr/share/AdGuardHome/firewall.start\n\tset firewall.AdGuardHome.reload=1\n\tcommit firewall\nEOF\n\t\n\t[ \"$tcp_server\" == \"1\" ] && iptables -t nat -I PREROUTING 1 -m comment --comment \"AdGuardHome\" -p tcp --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT\n\tiptables -t nat -I PREROUTING 1 -m comment --comment \"AdGuardHome\" -p udp --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT\n\n\t[ \"$ipv6_server\" == 0 ] && return\n\n\t[ \"$tcp_server\" == \"1\" ] && ip6tables -t nat -I PREROUTING 1 -m comment --comment \"AdGuardHome\" -p tcp --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT\n\tip6tables -t nat -I PREROUTING 1 -m comment --comment \"AdGuardHome\" -p udp --dport 53 -j REDIRECT --to-ports $AdGuardHome_PORT\n}\n\nclear_iptable()\n{\n\tuci -q batch <<-EOF >/dev/null 2>&1\n  delete firewall.AdGuardHome\n\tcommit firewall\nEOF\n\n\tnums=$(iptables -t nat -n -L PREROUTING 2>/dev/null | grep -c \"AdGuardHome\")\n\tif [ -n \"$nums\" ]; then\n\t\tuntil [ \"$nums\" = 0 ]\n\t\tdo\n\t\t\trules=$(iptables -t nat -n -L PREROUTING --line-num 2>/dev/null | grep \"AdGuardHome\" | awk '{print $1}')\n\t\t\tfor rule in $rules\n\t\t\tdo\n\t\t\t\tiptables -t nat -D PREROUTING $rule 2> /dev/null\n\t\t\t\tbreak\n\t\t\tdone\n\t\t\tnums=$(expr $nums - 1)\n\t\tdone\n\tfi\n\t\n\tnums=$(ip6tables -t nat -n -L PREROUTING 2>/dev/null | grep -c \"AdGuardHome\")\n\tif [ -n \"$nums\" ]; then\n\t\tuntil [ \"$nums\" = 0 ]\n\t\tdo\n\t\t\trules=$(ip6tables -t nat -n -L PREROUTING --line-num 2>/dev/null | grep \"AdGuardHome\" | awk '{print $1}')\n\t\t\tfor rule in $rules\n\t\t\tdo\n\t\t\t\tip6tables -t nat -D PREROUTING $rule 2> /dev/null\n\t\t\t\tbreak\n\t\t\tdone\n\t\t\tnums=$(expr $nums - 1)\n\t\tdone\n\tfi\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"$CONFIGURATION\"\n\t[ \"$(uci get AdGuardHome.AdGuardHome.redirect)\" == \"redirect\" ] && procd_add_reload_trigger firewall\n}\nisrunning(){\nconfig_load \"${CONFIGURATION}\"\n_isrunning\nlocal r=$?\n([ \"$r\" == \"0\" ] && echo \"running\") || ([ \"$r\" == \"1\" ] && echo \"not run\" ) || echo \"no bin\"\nreturn $r\n}\n_isrunning(){\n\tconfig_get binpath $CONFIGURATION binpath \"/usr/bin/AdGuardHome/AdGuardHome\"\n\t[ ! -f \"$binpath\" ] && return 2\n\tpgrep $binpath 2>&1 >/dev/null && return 0\n\treturn 1\n}\nforce_reload(){\n\tconfig_load \"${CONFIGURATION}\"\n\t_isrunning && procd_send_signal \"$CONFIGURATION\" || start\n}\nget_tz()\n{\n\tSET_TZ=\"\"\n\n\tif [ -e \"/etc/localtime\" ]; then\n\t\treturn\n\tfi\n\n\tfor tzfile in /etc/TZ /var/etc/TZ\n\tdo\n\t\tif [ ! -e \"$tzfile\" ]; then\n\t\t\tcontinue\n\t\tfi\n\n\t\ttz=\"`cat $tzfile 2>/dev/null`\"\n\tdone\n\n\tif [ -z \"$tz\" ]; then\n\t\treturn\n\tfi\n\n\tSET_TZ=$tz\n}\n\nrm_port53()\n{\n\tlocal AdGuardHome_PORT=$(config_editor \"dns.port\" \"\" \"$configpath\" \"1\")\n\tdnsmasq_port=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)\n\tif [ -z \"$dnsmasq_port\" ]; then\n\tdnsmasq_port=\"53\"\n\tfi\n\tif [ \"$dnsmasq_port\" == \"$AdGuardHome_PORT\" ]; then\n\t\tif [ \"$dnsmasq_port\" == \"53\" ]; then\n\t\t\tdnsmasq_port=\"1745\"\n\t\tfi\n\telif [ \"$dnsmasq_port\" == \"53\" ]; then\n\t\treturn\n\tfi\n\tconfig_editor \"dns.port\" \"$dnsmasq_port\" \"$configpath\"\n\tuci set dhcp.@dnsmasq[0].port=\"53\"\n\tuci commit dhcp\n\t/etc/init.d/dnsmasq restart\n}\n\nuse_port53()\n{\n\tlocal AdGuardHome_PORT=$(config_editor \"dns.port\" \"\" \"$configpath\" \"1\")\n\tdnsmasq_port=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)\n\tif [ -z \"$dnsmasq_port\" ]; then\n\t\tdnsmasq_port=\"53\"\n\tfi\n\tif [ \"$dnsmasq_port\" == \"$AdGuardHome_PORT\" ]; then\n\t\tif [ \"$dnsmasq_port\" == \"53\" ]; then\n\t\t\tAdGuardHome_PORT=\"1745\"\n\t\tfi\n\telif [ \"$AdGuardHome_PORT\" == \"53\" ]; then\n\t\treturn\n\tfi\n\tconfig_editor \"dns.port\" \"53\" \"$configpath\"\n\tuci set dhcp.@dnsmasq[0].port=\"$AdGuardHome_PORT\"\n\tuci commit dhcp\n\t/etc/init.d/dnsmasq restart\n}\ndo_redirect()\n{\n\tconfig_load \"${CONFIGURATION}\"\n\t_do_redirect $1\n}\n_do_redirect()\n{\n\tlocal section=\"$CONFIGURATION\"\n\targs=\"\"\n\tipv6_server=1\n\ttcp_server=0\n\tenabled=$1\n\tif [ \"$enabled\" == \"1\" ]; then\n\t\techo -n \"1\">/var/run/AdGredir\n\telse\n\t\techo -n \"0\">/var/run/AdGredir\n\tfi\n\tconfig_get configpath $CONFIGURATION configpath \"/etc/AdGuardHome.yaml\"\n\tAdGuardHome_PORT=$(config_editor \"dns.port\" \"\" \"$configpath\" \"1\")\n\tif [ -z \"$AdGuardHome_PORT\" ]; then\n\t\tAdGuardHome_PORT=\"0\"\n\tfi\n\tconfig_get \"redirect\" \"$section\" \"redirect\" \"none\"\n\tconfig_get \"old_redirect\" \"$section\" \"old_redirect\" \"none\"\n\tconfig_get \"old_port\" \"$section\" \"old_port\" \"0\"\n\tconfig_get \"old_enabled\" \"$section\" \"old_enabled\" \"0\"\n\tuci get dhcp.@dnsmasq[0].port >/dev/null 2>&1 || uci set dhcp.@dnsmasq[0].port=\"53\" >/dev/null 2>&1\n\tuci commit dhcp\n\tif [ \"$old_enabled\" = \"1\" -a \"$old_redirect\" == \"exchange\" ]; then\n\t\tAdGuardHome_PORT=$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)\n\tfi\n\n\tif [ \"$old_redirect\" != \"$redirect\" ] || [ \"$old_port\" != \"$AdGuardHome_PORT\" ] || [ \"$old_enabled\" = \"1\" -a \"$enabled\" = \"0\" ]; then\n\t\tif [ \"$old_redirect\" != \"none\" ]; then\n\t\t\tif [  \"$old_redirect\" == \"redirect\" -a \"$old_port\" != \"0\" ]; then\n\t\t\t\tclear_iptable\n\t\t\telif [ \"$old_redirect\" == \"dnsmasq-upstream\" ]; then\n\t\t\t\tstop_forward_dnsmasq \"$old_port\"\n\t\t\telif [ \"$old_redirect\" == \"exchange\" ]; then\n\t\t\t\trm_port53\n\t\t\tfi\n\t\tfi\n\telif [ \"$old_enabled\" = \"1\" -a \"$enabled\" = \"1\" ]; then\n\t\tif [  \"$old_redirect\" == \"redirect\" -a \"$old_port\" != \"0\" ]; then\n\t\t\tclear_iptable\n\t\tfi\n\tfi\n\tuci delete AdGuardHome.@AdGuardHome[0].old_redirect 2>/dev/null\n\tuci delete AdGuardHome.@AdGuardHome[0].old_port 2>/dev/null\n\tuci delete AdGuardHome.@AdGuardHome[0].old_enabled 2>/dev/null\n\tuci add_list AdGuardHome.@AdGuardHome[0].old_redirect=\"$redirect\" 2>/dev/null\n\tuci add_list AdGuardHome.@AdGuardHome[0].old_port=\"$AdGuardHome_PORT\" 2>/dev/null\n\tuci add_list AdGuardHome.@AdGuardHome[0].old_enabled=\"$enabled\" 2>/dev/null\n\tuci commit AdGuardHome\n\t[ \"$enabled\" == \"0\" ] && return 1\n\tif [ \"$AdGuardHome_PORT\" == \"0\" ]; then\n\t\treturn 1\n\tfi\n\tif [ \"$redirect\" = \"redirect\" ]; then\n\t\tset_iptable $ipv6_server $tcp_server\n\telif [ \"$redirect\" = \"dnsmasq-upstream\" ]; then\n\t\tset_forward_dnsmasq \"$AdGuardHome_PORT\"\n\telif [ \"$redirect\" == \"exchange\" -a \"$(uci get dhcp.@dnsmasq[0].port 2>/dev/null)\" == \"53\" ]; then\n\t\tuse_port53\n\tfi\n}\nget_filesystem()\n{\n# print out path filesystem\n    echo $1 | awk '\n    BEGIN{\n    while ((\"mount\"| getline ret) > 0)\n    {\n    split(ret,d);\n    fs[d[3]]=d[5];\n    m=index(d[1],\":\")\n    if (m==0)\n    {\n        pt[d[3]]=d[1]\n    }else{\n        pt[d[3]]=substr(d[1],m+1)\n    }}}{\n    split($0,d,\"/\");\n    if (\"/\" in fs)\n    {\n    result1=fs[\"/\"];\n    }\n    if (\"/\" in pt)\n    {\n    result2=pt[\"/\"];\n    }\n    for (i=2;i<=length(d);i++)\n    {\n       p[i]=p[i-1]\"/\"d[i];\n       if (p[i] in fs)\n        {\n        result1=fs[p[i]];\n        result2=pt[p[i]];\n        }\n    }\n    if (result2 in fs){\n        result=fs[result2]}\n    else{\n        result=result1}\n    print(result);}'\n}\n\nconfig_editor()\n{\n\tawk -v yaml=\"$1\" -v value=\"$2\" -v file=\"$3\" -v ro=\"$4\" '\n\tBEGIN{split(yaml,part,\"\\.\");s=\"\";i=1;l=length(part);}\n    {\n        if (match($0,s\"\"part[i]\":\"))\n        {\n            if (i==l)\n            {\n                split($0,t,\": \");\n\t\t\t\tif (ro==\"\"){\n\t\t\t\tsystem(\"sed -i '\\''\"FNR\"c \\\\\"t[1]\": \"value\"'\\'' \"file);\n\t\t\t\t}else{\n\t\t\t\tprint(t[2]);\n\t\t\t\t}\n\t\t\t\texit;\n            }\n            s=s\"[- ]{2}\";\n            i++;\n        }\n    }' $3\n}\n\nboot_service() {\n\trm /var/run/AdGserverdis >/dev/null 2>&1\n\tconfig_load \"${CONFIGURATION}\"\n\tconfig_get waitonboot $CONFIGURATION waitonboot \"0\"\n\tconfig_get_bool enabled $CONFIGURATION enabled 0\n\tconfig_get binpath $CONFIGURATION binpath \"/usr/bin/AdGuardHome/AdGuardHome\"\n\t[ -f \"$binpath\" ] && start_service\n\tif [ \"$enabled\" == \"1\" ] && [ \"$waitonboot\" == \"1\" ]; then\n\t\tprocd_open_instance \"waitnet\"\n\t\tprocd_set_param command \"/usr/share/AdGuardHome/waitnet.sh\"\n\t\tprocd_close_instance\n\t\techo \"no net start pinging\"\n\tfi\n}\n\ntestbackup(){\n\tconfig_load \"${CONFIGURATION}\"\n\tif [ \"$1\" == \"backup\" ]; then\n\t\tbackup\n\telif [ \"$1\" == \"restore\" ]; then\n\t\trestore\n\tfi\n}\nrestore()\n{\n\tconfig_get workdir $CONFIGURATION workdir \"/usr/bin/AdGuardHome\"\n\tconfig_get backupwdpath $CONFIGURATION backupwdpath \"/usr/bin/AdGuardHome\"\n\tcp -u -r -f $backupwdpath/data $workdir\n}\nbackup() {\n\tconfig_get backupwdpath $CONFIGURATION backupwdpath \"/usr/bin/AdGuardHome\"\n\tmkdir -p $backupwdpath/data\n\tconfig_get workdir $CONFIGURATION workdir \"/usr/bin/AdGuardHome\"\n\tconfig_get backupfile $CONFIGURATION backupfile \"\"\n\tfor one in $backupfile;\n\tdo\n\t\twhile :\n\t\tdo\n\t\t\tif [ -d \"$backupwdpath/data/$one\" ]; then\n\t\t\t\tcpret=$(cp -u -r -f $workdir/data/$one $backupwdpath/data 2>&1)\n\t\t\telse\n\t\t\t\tcpret=$(cp -u -r -f $workdir/data/$one $backupwdpath/data/$one 2>&1)\n\t\t\tfi\n\t\t\techo \"$cpret\"\n\t\t\techo \"$cpret\" | grep \"no space left on device\"\n\t\t\tif [ \"$?\" == \"0\" ]; then\n\t\t\t\techo \"磁盘已满,删除log重试中\"\n\t\t\t\tdel_querylog && continue\n\t\t\t\trm -f -r $backupwdpath/data/filters\n\t\t\t\trm -f -r $workdir/data/filters && continue\n\t\t\t\techo \"backup failed\"\n\t\t\tfi\n\t\t\tbreak\n\t\tdone\n\tdone\n}\nstart_service() {\n\t# Reading config\n\trm /var/run/AdGserverdis >/dev/null 2>&1\n\tconfig_load \"${CONFIGURATION}\"\n\t# update password\n\tconfig_get hashpass $CONFIGURATION hashpass \"\"\n\tconfig_get configpath $CONFIGURATION configpath \"/etc/AdGuardHome.yaml\"\n\tif [ -n \"$hashpass\" ]; then\n\t\tconfig_editor \"users.password\" \"$hashpass\" \"$configpath\"\n\t\tuci set $CONFIGURATION.$CONFIGURATION.hashpass=\"\"\n\tfi\n\tlocal enabled\n\tconfig_get_bool enabled $CONFIGURATION enabled 0\n\t# update crontab\n\tdo_crontab\n\tif [ \"$enabled\" == \"0\" ]; then\n\t\t_do_redirect 0\n\t\treturn\n\tfi\n\t#what need to do before reload\n\tconfig_get workdir $CONFIGURATION workdir \"/usr/bin/AdGuardHome\"\n\n\tconfig_get backupfile $CONFIGURATION backupfile \"\"\n\tmkdir -p $workdir/data\n\tif [ -n \"$backupfile\" ] && [ ! -d \"$workdir/data\" ]; then\n\t\trestore\n\tfi\n\t# for overlay data-stk-oo not suppport\n\tlocal cwdfs=$(get_filesystem $workdir)\n\techo \"workdir is a $cwdfs filesystem\"\n\tif [ \"$cwdfs\" == \"jffs2\" ]; then\n\t\techo \"fs error ln db to tmp $workdir $cwdfs\"\n\t\tlogger \"AdGuardHome\" \"warning db redirect to tmp\"\n\t\ttouch $workdir/data/stats.db\n\t\tif [ ! -L $workdir/data/stats.db ]; then\n\t\tmv -f $workdir/data/stats.db /tmp/stats.db 2>/dev/null\n\t\tln -s /tmp/stats.db $workdir/data/stats.db 2>/dev/null\n\t\tfi\n\t\ttouch $workdir/data/sessions.db\n\t\tif [ ! -L $workdir/data/sessions.db ]; then\n\t\tmv -f $workdir/data/sessions.db /tmp/sessions.db 2>/dev/null\n\t\tln -s /tmp/sessions.db $workdir/data/sessions.db 2>/dev/null\n\t\tfi\n\tfi\n\tlocal ADDITIONAL_ARGS=\"\"\n\tconfig_get binpath $CONFIGURATION binpath \"/usr/bin/AdGuardHome/AdGuardHome\"\n\n\tmkdir -p ${binpath%/*}\n\tADDITIONAL_ARGS=\"$ADDITIONAL_ARGS -c $configpath\"\n\tADDITIONAL_ARGS=\"$ADDITIONAL_ARGS -w $workdir\"\n\tconfig_get httpport $CONFIGURATION httpport 3000\n\tADDITIONAL_ARGS=\"$ADDITIONAL_ARGS -p $httpport\"\n\n\t# hack to save config file when upgrade system\n\tconfig_get upprotect $CONFIGURATION upprotect \"\"\n\teval upprotect=${upprotect// /\\\\\\\\n}\n\techo -e \"$upprotect\">/lib/upgrade/keep.d/luci-app-adguardhome\n\t\n\tconfig_get logfile $CONFIGURATION logfile \"\"\n\tif [ -n \"$logfile\" ]; then\n\t\tADDITIONAL_ARGS=\"$ADDITIONAL_ARGS -l $logfile\"\n\tfi\n\n\tif [ ! -f \"$binpath\" ]; then\n\t\t_do_redirect 0\n\t\t/usr/share/AdGuardHome/update_core.sh 2>&1 >/tmp/AdGuardHome_update.log &\n\t\texit 0\n\tfi\n\n\tconfig_get_bool verbose $CONFIGURATION verbose 0\n\tif [ \"$verbose\" -eq 1 ]; then\n\t\tADDITIONAL_ARGS=\"$ADDITIONAL_ARGS -v\"\n\tfi\n\n\tprocd_open_instance\n\tget_tz\n\tif [ -n \"$SET_TZ\" ]; then\n\t\tprocd_set_param env TZ=\"$SET_TZ\"\n\tfi\n\tprocd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}\n\tprocd_set_param limits core=\"unlimited\" nofile=\"65535 65535\"\n\tprocd_set_param stderr 1\n\tprocd_set_param command $binpath $ADDITIONAL_ARGS\n\tprocd_set_param file \"$configpath\" \"/etc/hosts\" \"/etc/config/AdGuardHome\"\n\tprocd_close_instance\n\tif [ -f \"$configpath\" ]; then\n\t\t_do_redirect 1\n\telse\n\t\t_do_redirect 0\n\t\tconfig_get \"redirect\" \"AdGuardHome\" \"redirect\" \"none\"\n\t\tif [ \"$redirect\" != \"none\" ]; then\n\t\t\tprocd_open_instance \"waitconfig\"\n\t\t\tprocd_set_param command \"/usr/share/AdGuardHome/watchconfig.sh\"\n\t\t\tprocd_close_instance\n\t\t\techo \"no config start watching\"\n\t\tfi\n\tfi\n\techo \"AdGuardHome service enabled\"\n\techo \"luci enable switch=$enabled\"\n\t(sleep 10 && [ -z \"$(pgrep $binpath)\" ] && logger \"AdGuardHome\" \"no process in 10s cancel redirect\" && _do_redirect 0 )&\n}\nreload_service()\n{\n\trm /var/run/AdGlucitest >/dev/null 2>&1\n\techo \"AdGuardHome reloading\"\n\tstart\n}\n\ndel_querylog(){\nlocal btarget=$(ls $backupwdpath/data | grep -F \"querylog.json\" | sort -r | head -n 1)\nlocal wtarget=$(ls $workdir/data | grep -F \"querylog.json\" | sort -r | head -n 1)\nif [ \"$btarget\"x == \"$wtarget\"x ]; then\n\t[ -z \"$btarget\" ] && return 1\n\trm -f $workdir/data/$wtarget\n\trm -f $backupwdpath/data/$btarget\n\treturn 0\nfi\nif [ \"$btarget\" \\> \"$wtarget\" ]; then\n\trm -f $backupwdpath/data/$btarget\n\treturn 0\nelse\n\trm -f $workdir/data/$wtarget\n\treturn 0\nfi\n}\nstop_service()\n{\n\tconfig_load \"${CONFIGURATION}\"\n\t_do_redirect 0\n\tdo_crontab\n\tif [ \"$1\" != \"nobackup\" ]; then\n\t\tconfig_get backupfile $CONFIGURATION backupfile \"0\"\n\t\tif [ -n \"$backupfile\" ]; then\n\t\t\tbackup\n\t\tfi\n\tfi\n\techo \"AdGuardHome service disabled\"\n\ttouch /var/run/AdGserverdis\n}\nboot() {\n\trc_procd boot_service \"$@\"\n\tif eval \"type service_started\" 2>/dev/null >/dev/null; then\n\t\tservice_started\n\tfi\n}\ntest_crontab(){\nconfig_load \"${CONFIGURATION}\"\ndo_crontab\n}\ndo_crontab(){\n\tconfig_get_bool enabled $CONFIGURATION enabled 0\n\tconfig_get crontab $CONFIGURATION crontab \"\"\n\tlocal findstr default cronenable replace commit\n\tlocal cronreload=0\n\tlocal commit=0\n\tfindstr=\"/usr/share/AdGuardHome/update_core.sh\"\n\tdefault=\"30 3 * * * /usr/share/AdGuardHome/update_core.sh 2>&1\"\n\t[ \"$enabled\" == \"0\" ] || [ \"${crontab//autoupdate/}\" == \"$crontab\" ] && cronenable=0 || cronenable=1\n\tcrontab_editor\n\t\n\tconfig_get workdir $CONFIGURATION workdir \"/usr/bin/AdGuardHome\"\n\tconfig_get lastworkdir $CONFIGURATION lastworkdir \"/usr/bin/AdGuardHome\"\n\tfindstr=\"/usr/share/AdGuardHome/tailto.sh [0-9]* \\$(uci get AdGuardHome.AdGuardHome.workdir)/data/querylog.json\"\n\t#[ -n \"$lastworkdir\" ] && findstr=\"/usr/share/AdGuardHome/tailto.sh [0-9]* $lastworkdir/data/querylog.json\" && [ \"$lastworkdir\" != \"$workdir\" ] && replace=\"${lastworkdir//\\//\\\\/}/${workdir//\\//\\\\/}\"\n\tdefault=\"0 * * * * /usr/share/AdGuardHome/tailto.sh 2000 \\$(uci get AdGuardHome.AdGuardHome.workdir)/data/querylog.json\"\n\t[ \"$enabled\" == \"0\" ] || [ \"${crontab//cutquerylog/}\" == \"$crontab\" ] && cronenable=0 || cronenable=1\n\tcrontab_editor\n\t#[ \"$lastworkdir\" != \"$workdir\" ] && uci set AdGuardHome.AdGuardHome.lastworkdir=\"$workdir\" && commit=1\n\t\n\tconfig_get logfile $CONFIGURATION logfile \"\"\n\tconfig_get lastlogfile $CONFIGURATION lastlogfile \"\"\n\tfindstr=\"/usr/share/AdGuardHome/tailto.sh [0-9]* \\$(uci get AdGuardHome.AdGuardHome.logfile)\"\n\tdefault=\"30 3 * * * /usr/share/AdGuardHome/tailto.sh 2000 \\$(uci get AdGuardHome.AdGuardHome.logfile)\"\n\t#[ -n \"$lastlogfile\" ] && findstr=\"/usr/share/AdGuardHome/tailto.sh [0-9]* $lastlogfile\" && [ -n \"$logfile\" ] && [ \"$lastlogfile\" != \"$logfile\" ] && replace=\"${lastlogfile//\\//\\\\/}/${logfile//\\//\\\\/}\"\n\t[ \"$logfile\" == \"syslog\" ] || [ \"$logfile\" == \"\" ] || [ \"$enabled\" == \"0\" ] || [ \"${crontab//cutruntimelog/}\" == \"$crontab\" ] && cronenable=0 || cronenable=1\n\tcrontab_editor\n\t#[ -n \"$logfile\" ] && [ \"$lastlogfile\" != \"$logfile\" ] && uci set AdGuardHome.AdGuardHome.lastlogfile=\"$logfile\" && commit=1\n\t\n\tfindstr=\"/usr/share/AdGuardHome/addhost.sh\"\n\tdefault=\"0 * * * * /usr/share/AdGuardHome/addhost.sh\"\n\t[ \"$enabled\" == \"0\" ] || [ \"${crontab//autohost/}\" == \"$crontab\" ] && cronenable=0 || cronenable=1\n\tcrontab_editor\n\t[ \"$cronenable\" == \"0\" ] && /usr/share/AdGuardHome/addhost.sh \"del\" \"noreload\" || /usr/share/AdGuardHome/addhost.sh \"\" \"noreload\"\n\n\tfindstr=\"/usr/share/AdGuardHome/gfw2adg.sh\"\n\tdefault=\"30 3 * * * /usr/share/AdGuardHome/gfw2adg.sh\"\n\t[ \"$enabled\" == \"0\" ] || [ \"${crontab//autogfw/}\" == \"$crontab\" ] && cronenable=0 || cronenable=1\n\tcrontab_editor\n\t[ \"$cronreload\" -gt 0 ] && /etc/init.d/cron restart\n\t#[ \"$commit\" -gt 0 ] && uci commit AdGuardHome\n}\ncrontab_editor(){\n\t#usage input:\n\t#findstr=\n\t#default=\n\t#cronenable=\n\t#replace=\"${last//\\//\\\\/}/${now//\\//\\\\/}\"\n\t#output:cronreload:if >1 please /etc/init.d/cron restart manual\n\tlocal testline reload\n\tlocal line=\"$(grep \"$findstr\" $CRON_FILE)\"\n\t[ -n \"$replace\" ] && [ -n \"$line\" ] && eval testline=\"\\${line//$replace}\" && [ \"$testline\" != \"$line\" ] && line=\"$testline\" && reload=\"1\" && replace=\"\" \n\tif [ \"${line:0:1}\" != \"#\" ]; then\n\t\tif [ $cronenable -eq 1 ]; then\n\t\t\t[ -z \"$line\" ] && line=\"$default\" && reload=\"1\"\n\t\t\tif [ -n \"$reload\" ]; then\n\t\t\t\tsed -i \"\\,$findstr,d\" $CRON_FILE\n\t\t\t\techo \"$line\" >> $CRON_FILE\n\t\t\t\tcronreload=$((cronreload+1))\n\t\t\tfi\n\t\telif [ -n \"$line\" ]; then\n\t\t\tsed -i \"\\,$findstr,d\" $CRON_FILE\n\t\t\techo \"#$line\" >> $CRON_FILE\n\t\t\tcronreload=$((cronreload+1))\n\t\tfi\n\telse\n\t\tif [ $cronenable -eq 1 ]; then\n\t\t\tsed -i \"\\,$findstr,d\" $CRON_FILE\n\t\t\techo \"${line:1}\" >> $CRON_FILE\n\t\t\tcronreload=$((cronreload+1))\n\t\telif [ -z \"$reload\" ]; then\n\t\t\tsed -i \"\\,$findstr,d\" $CRON_FILE\n\t\t\techo \"$line\" >> $CRON_FILE\n\t\tfi\n\tfi\n\t\n}\n"
  },
  {
    "path": "luci-app-adguardhome/root/etc/uci-defaults/40_luci-AdGuardHome",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null 2>&1\n\tdelete ucitrack.@AdGuardHome[-1]\n\tadd ucitrack AdGuardHome\n\tset ucitrack.@AdGuardHome[-1].init=AdGuardHome\n\tcommit ucitrack\n\tdelete AdGuardHome.AdGuardHome.ucitracktest\nEOF\n\nrm -f /tmp/luci-indexcache\nexit 0\n"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/AdGuardHome_template.yaml",
    "content": "bind_host: 0.0.0.0\nbind_port: 3000\nbeta_bind_port: 0\nusers:\n  - name: admin\n    password: $2y$10$vHRcARdPCieYG3RXWomV5evDYN.Nj/edtwEkQgQJZcK6z7qTLaIc6\nauth_attempts: 5\nblock_auth_min: 15\nhttp_proxy: \"\"\nlanguage: zh-cn\ntheme: auto\ndebug_pprof: false\ndns:\n  bind_hosts:\n    - 0.0.0.0\n  port: 1745\n  anonymize_client_ip: false\n  protection_enabled: true\n  blocking_mode: default\n  blocking_ipv4: \"\"\n  blocking_ipv6: \"\"\n  blocked_response_ttl: 10\n  protection_disabled_until: null\n  parental_block_host: family-block.dns.adguard.com\n  safebrowsing_block_host: standard-block.dns.adguard.com\n  ratelimit: 0\n  ratelimit_whitelist: []\n  refuse_any: false\n  upstream_dns:\n  - 223.5.5.5\n  upstream_dns_file: \"\"\n  bootstrap_dns:\n  - 119.29.29.29\n  - 223.5.5.5\n  all_servers: false\n  fastest_addr: false\n  fastest_timeout: 1s\n  allowed_clients: []\n  disallowed_clients: []\n  blocked_hosts:\n  - version.bind\n  - id.server\n  - hostname.bind\n  trusted_proxies:\n  - 127.0.0.0/8\n  - ::1/128\n  cache_size: 4194304\n  cache_ttl_min: 0\n  cache_ttl_max: 0\n  cache_optimistic: true\n  bogus_nxdomain: []\n  aaaa_disabled: false\n  enable_dnssec: false\n  edns_client_subnet: false\n  max_goroutines: 300\n  ipset: []\n  filtering_enabled: true\n  filters_update_interval: 24\n  parental_enabled: false\n  safesearch_enabled: false\n  safebrowsing_enabled: false\n  safebrowsing_cache_size: 1048576\n  safesearch_cache_size: 1048576\n  parental_cache_size: 1048576\n  cache_time: 30\n  rewrites: []\n  blocked_services: []\n  upstream_timeout: 10s\n  private_networks: []\n  use_private_ptr_resolvers: true\n  local_ptr_upstreams: []\ntls:\n  enabled: false\n  server_name: \"\"\n  force_https: false\n  port_https: 443\n  port_dns_over_tls: 853\n  port_dns_over_quic: 784\n  port_dnscrypt: 0\n  dnscrypt_config_file: \"\"\n  allow_unencrypted_doh: false\n  certificate_chain: \"\"\n  private_key: \"\"\n  certificate_path: \"\"\n  private_key_path: \"\"\nfilters:\n- enabled: true\n  url: https://adguardteam.github.io/AdGuardSDNSFilter/Filters/filter.txt\n  name: AdGuard DNS filter\n  id: 1628750870\n- enabled: true\n  url: https://anti-ad.net/easylist.txt\n  name: 'CHN: anti-AD'\n  id: 1628750871\nwhitelist_filters: []\nuser_rules:\n- '@@||taobao.com^$important'\n- '@@||jd.com^important'\n- '@@||flyme.cn^$important'\n- '@@||meizu.com^$important'\n- '@@||wl.jd.com^$important'\n- '@@||flydigi.com^'\n- '@@||pv.sohu.com^$important'\ndhcp:\n  enabled: false\n  interface_name: \"\"\n  dhcpv4:\n    gateway_ip: \"\"\n    subnet_mask: \"\"\n    range_start: \"\"\n    range_end: \"\"\n    lease_duration: 86400\n    icmp_timeout_msec: 1000\n    options: []\n  dhcpv6:\n    range_start: \"\"\n    lease_duration: 86400\n    ra_slaac_only: false\n    ra_allow_slaac: false\nclients: []\nlog_compress: false\nlog_localtime: false\nlog_max_backups: 0\nlog_max_size: 100\nlog_max_age: 3\nlog_file: \"\"\nverbose: false\nschema_version: 10\n"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/addhost.sh",
    "content": "#!/bin/sh\ncheckmd5(){\nlocal nowmd5=$(md5sum /etc/hosts)\nnowmd5=${nowmd5%% *}\nlocal lastmd5=$(uci get AdGuardHome.AdGuardHome.hostsmd5 2>/dev/null)\nif [ \"$nowmd5\" != \"$lastmd5\" ]; then\n\tuci set AdGuardHome.AdGuardHome.hostsmd5=\"$nowmd5\"\n\tuci commit AdGuardHome\n\t[ \"$1\" == \"noreload\" ] || /etc/init.d/AdGuardHome reload\nfi\n}\n[ \"$1\" == \"del\" ] && sed -i '/programaddstart/,/programaddend/d' /etc/hosts && checkmd5 \"$2\" && exit 0\n/usr/bin/awk 'BEGIN{\nwhile ((getline < \"/tmp/dhcp.leases\") > 0)\n{\n    a[$2]=$4;\n}\nwhile ((\"ip -6 neighbor show | grep -v fe80\" | getline) > 0)\n{\n    if (a[$5]) {print $1\" \"a[$5] >\"/tmp/tmphost\"; }\n}\nprint \"#programaddend\" >\"/tmp/tmphost\";\n}'\ngrep programaddstart /etc/hosts >/dev/null 2>&1\nif [ \"$?\" == \"0\" ]; then\n\tsed -i '/programaddstart/,/programaddend/c\\#programaddstart' /etc/hosts\n\tsed -i '/programaddstart/'r/tmp/tmphost /etc/hosts\nelse\n\techo \"#programaddstart\" >>/etc/hosts\n\tcat /tmp/tmphost >> /etc/hosts\nfi\nrm /tmp/tmphost\ncheckmd5 \"$2\""
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/firewall.start",
    "content": "#!/bin/sh\n\nAdGuardHome_enable=$(uci get AdGuardHome.AdGuardHome.enabled)\nredirect=$(uci get AdGuardHome.AdGuardHome.redirect)\n\nif [ $AdGuardHome_enable -eq 1 -a \"$redirect\" == \"redirect\" ]; then\n\t/etc/init.d/AdGuardHome do_redirect 1\nfi\n"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/getsyslog.sh",
    "content": "#!/bin/sh\nPATH=\"/usr/sbin:/usr/bin:/sbin:/bin\"\nlogread -e AdGuardHome > /tmp/AdGuardHometmp.log\nlogread -e AdGuardHome -f >> /tmp/AdGuardHometmp.log &\npid=$!\necho \"1\">/var/run/AdGuardHomesyslog\nwhile true\ndo\n\tsleep 12\n\twatchdog=$(cat /var/run/AdGuardHomesyslog)\n\tif [ \"$watchdog\"x == \"0\"x ]; then\n\t\tkill $pid\n\t\trm /tmp/AdGuardHometmp.log\n\t\trm /var/run/AdGuardHomesyslog\n\t\texit 0\n\telse\n\t\techo \"0\">/var/run/AdGuardHomesyslog\n\tfi\ndone"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/gfw2adg.sh",
    "content": "#!/bin/sh\nPATH=\"/usr/sbin:/usr/bin:/sbin:/bin\"\ncheckmd5(){\nlocal nowmd5=$(md5sum /tmp/adguard.list 2>/dev/null)\nnowmd5=${nowmd5%% *}\nlocal lastmd5=$(uci get AdGuardHome.AdGuardHome.gfwlistmd5 2>/dev/null)\nif [ \"$nowmd5\" != \"$lastmd5\" ]; then\n\tuci set AdGuardHome.AdGuardHome.gfwlistmd5=\"$nowmd5\"\n\tuci commit AdGuardHome\n\t[ \"$1\" == \"noreload\" ] || /etc/init.d/AdGuardHome reload\nfi\n}\nconfigpath=$(uci get AdGuardHome.AdGuardHome.configpath 2>/dev/null)\n[ \"$1\" == \"del\" ] && sed -i '/programaddstart/,/programaddend/d' $configpath && checkmd5 \"$2\" && exit 0\ngfwupstream=$(uci get AdGuardHome.AdGuardHome.gfwupstream 2>/dev/null)\nif [ -z $gfwupstream ]; then\ngfwupstream=\"tcp://208.67.220.220:5353\"\nfi\nif [ ! -f \"$configpath\" ]; then\n\techo \"please make a config first\"\n\texit 1\nfi\nwget --no-check-certificate https://cdn.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt -O- | base64 -d > /tmp/gfwlist.txt\ncat /tmp/gfwlist.txt | awk -v upst=\"$gfwupstream\" 'BEGIN{getline;}{\ns1=substr($0,1,1);\nif (s1==\"!\")\n{next;}\nif (s1==\"@\"){\n    $0=substr($0,3);\n    s1=substr($0,1,1);\n    white=1;}\nelse{\n    white=0;\n}\n\nif (s1==\"|\")\n    {s2=substr($0,2,1);\n    if (s2==\"|\")\n    {\n        $0=substr($0,3);\n        split($0,d,\"/\");\n        $0=d[1];\n    }else{\n        split($0,d,\"/\");\n        $0=d[3];\n    }}\nelse{\n    split($0,d,\"/\");\n    $0=d[1];\n}\nstar=index($0,\"*\");\nif (star!=0)\n{\n    $0=substr($0,star+1);\n    dot=index($0,\".\");\n    if (dot!=0)\n        $0=substr($0,dot+1);\n    else\n        next;\n    s1=substr($0,1,1);\n}\nif (s1==\".\")\n{fin=substr($0,2);}\nelse{fin=$0;}\nif (index(fin,\".\")==0) next;\nif (index(fin,\"%\")!=0) next;\nif (index(fin,\":\")!=0) next;\nmatch(fin,\"^[0-9\\.]+\")\nif (RSTART==1 && RLENGTH==length(fin)) {print \"ipset add gfwlist \"fin>\"/tmp/doipset.sh\";next;}\nif (fin==\"\" || finl==fin) next;\nfinl=fin;\nif (white==0)\n    {print(\"  - '\\''[/\"fin\"/]\"upst\"'\\''\");}\nelse{\n    print(\"  - '\\''[/\"fin\"/]#'\\''\");}\n}END{print(\"  - '\\''[/programaddend/]#'\\''\")}' > /tmp/adguard.list\ngrep programaddstart $configpath\nif [ \"$?\" == \"0\" ]; then\n\tsed -i '/programaddstart/,/programaddend/c\\  - '\\''\\[\\/programaddstart\\/\\]#'\\''' $configpath\n\tsed -i '/programaddstart/'r/tmp/adguard.list $configpath\nelse\n\tsed -i '1i\\  - '\\''[/programaddstart/]#'\\''' /tmp/adguard.list\n\tsed -i '/upstream_dns:/'r/tmp/adguard.list $configpath\nfi\ncheckmd5 \"$2\"\nrm -f /tmp/gfwlist.txt /tmp/adguard.list"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/links.txt",
    "content": "https://static.adguard.com/adguardhome/release/AdGuardHome_linux_${Arch}.tar.gz\n#https://github.com/AdguardTeam/AdGuardHome/releases/download/${latest_ver}/AdGuardHome_linux_${Arch}.tar.gz\n#https://static.adguard.com/adguardhome/beta/AdGuardHome_linux_${Arch}.tar.gz"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/tailto.sh",
    "content": "#!/bin/sh\ntail -n $1 \"$2\" > /var/run/tailtmp\ncat /var/run/tailtmp > \"$2\"\nrm /var/run/tailtmp"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/update_core.sh",
    "content": "#!/bin/bash\nPATH=\"/usr/sbin:/usr/bin:/sbin:/bin\"\nbinpath=$(uci get AdGuardHome.AdGuardHome.binpath)\nif [ -z \"$binpath\" ]; then\nuci set AdGuardHome.AdGuardHome.binpath=\"/tmp/AdGuardHome/AdGuardHome\"\nbinpath=\"/tmp/AdGuardHome/AdGuardHome\"\nfi\nmkdir -p ${binpath%/*}\nupxflag=$(uci get AdGuardHome.AdGuardHome.upxflag 2>/dev/null)\n\ncheck_if_already_running(){\n\trunning_tasks=\"$(ps |grep \"AdGuardHome\" |grep \"update_core\" |grep -v \"grep\" |awk '{print $1}' |wc -l)\"\n\t[ \"${running_tasks}\" -gt \"2\" ] && echo -e \"\\nA task is already running.\"  && EXIT 2\n}\n\ncheck_wgetcurl(){\n\twhich curl && downloader=\"curl -L -k --retry 2 --connect-timeout 20 -o\" && return\n\twhich wget && downloader=\"wget --no-check-certificate -t 2 -T 20 -O\" && return\n\t[ -z \"$1\" ] && opkg update || (echo error opkg && EXIT 1)\n\t[ -z \"$1\" ] && (opkg remove wget wget-nossl --force-depends ; opkg install wget ; check_wgetcurl 1 ;return)\n\t[ \"$1\" == \"1\" ] && (opkg install curl ; check_wgetcurl 2 ; return)\n\techo error curl and wget && EXIT 1\n}\ncheck_latest_version(){\n\tcheck_wgetcurl\n\tlatest_ver=\"$($downloader - https://api.github.com/repos/AdguardTeam/AdGuardHome/releases/latest 2>/dev/null|grep -E 'tag_name' |grep -E 'v[0-9.]+' -o 2>/dev/null)\"\n\tif [ -z \"${latest_ver}\" ]; then\n\t\techo -e \"\\nFailed to check latest version, please try again later.\"  && EXIT 1\n\tfi\n\tnow_ver=\"$($binpath -c /dev/null --check-config 2>&1| grep -m 1 -E 'v[0-9.]+' -o)\"\n\tif [ \"${latest_ver}\"x != \"${now_ver}\"x ] || [ \"$1\" == \"force\" ]; then\n\t\techo -e \"Local version: ${now_ver}., cloud version: ${latest_ver}.\" \n\t\tdoupdate_core\n\telse\n\t\t\techo -e \"\\nLocal version: ${now_ver}, cloud version: ${latest_ver}.\" \n\t\t\techo -e \"You're already using the latest version.\" \n\t\t\tif [ ! -z \"$upxflag\" ]; then\n\t\t\t\tfilesize=$(ls -l $binpath | awk '{ print $5 }')\n\t\t\t\tif [ $filesize -gt 8000000 ]; then\n\t\t\t\t\techo -e \"start upx may take a long time\"\n\t\t\t\t\tdoupx\n\t\t\t\t\tmkdir -p \"/tmp/AdGuardHomeupdate/AdGuardHome\" >/dev/null 2>&1\n\t\t\t\t\trm -fr /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/}\n\t\t\t\t\t/tmp/upx-${upx_latest_ver}-${Arch}_linux/upx $upxflag $binpath -o /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/}\n\t\t\t\t\trm -rf /tmp/upx-${upx_latest_ver}-${Arch}_linux\n\t\t\t\t\t/etc/init.d/AdGuardHome stop nobackup\n\t\t\t\t\trm $binpath\n\t\t\t\t\tmv -f /tmp/AdGuardHomeupdate/AdGuardHome/${binpath##*/} $binpath\n\t\t\t\t\t/etc/init.d/AdGuardHome start\n\t\t\t\t\techo -e \"finished\"\n\t\t\t\tfi\n\t\t\tfi\n\t\t\tEXIT 0\n\tfi\n}\ndoupx(){\n\tArcht=\"$(opkg info kernel | grep Architecture | awk -F \"[ _]\" '{print($2)}')\"\n\tcase $Archt in\n\t\"i386\")\n\tArch=\"i386\"\n\t;;\n\t\"i686\")\n\tArch=\"i386\"\n\techo -e \"i686 use $Arch may have bug\" \n\t;;\n\t\"x86\")\n\tArch=\"amd64\"\n\t;;\n\t\"mipsel\")\n\tArch=\"mipsel\"\n\t;;\n\t\"mips64el\")\n\tArch=\"mips64el\"\n\tArch=\"mipsel\"\n\techo -e \"mips64el use $Arch may have bug\" \n\t;;\n\t\"mips\")\n\tArch=\"mips\"\n\t;;\n\t\"mips64\")\n\tArch=\"mips64\"\n\tArch=\"mips\"\n\techo -e \"mips64 use $Arch may have bug\" \n\t;;\n\t\"arm\")\n\tArch=\"arm\"\n\t;;\n\t\"armeb\")\n\tArch=\"armeb\"\n\t;;\n\t\"aarch64\")\n\tArch=\"arm64\"\n\t;;\n\t\"powerpc\")\n\tArch=\"powerpc\"\n\t;;\n\t\"powerpc64\")\n\tArch=\"powerpc64\"\n\t;;\n\t*)\n\techo -e \"error not support $Archt if you can use offical release please issue a bug\" \n\tEXIT 1\n\t;;\n\tesac\n\tupx_latest_ver=\"$($downloader - https://api.github.com/repos/upx/upx/releases/latest 2>/dev/null|grep -E 'tag_name' |grep -E '[0-9.]+' -o 2>/dev/null)\"\n\t$downloader /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz \"https://github.com/upx/upx/releases/download/v${upx_latest_ver}/upx-${upx_latest_ver}-${Arch}_linux.tar.xz\" 2>&1\n\t#tar xvJf\n\twhich xz || (opkg list | grep ^xz || opkg update && opkg install xz) || (echo \"xz download fail\" && EXIT 1)\n\tmkdir -p /tmp/upx-${upx_latest_ver}-${Arch}_linux\n\txz -d -c /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz| tar -x -C \"/tmp\" >/dev/null 2>&1\n\tif [ ! -e \"/tmp/upx-${upx_latest_ver}-${Arch}_linux/upx\" ]; then\n\t\techo -e \"Failed to download upx.\" \n\t\tEXIT 1\n\tfi\n\trm /tmp/upx-${upx_latest_ver}-${Arch}_linux.tar.xz\n}\ndoupdate_core(){\n\techo -e \"Updating core...\" \n\tmkdir -p \"/tmp/AdGuardHomeupdate\"\n\trm -rf /tmp/AdGuardHomeupdate/* >/dev/null 2>&1\n\tArcht=\"$(opkg info kernel | grep Architecture | awk -F \"[ _]\" '{print($2)}')\"\n\tcase $Archt in\n\t\"i386\")\n\tArch=\"386\"\n\t;;\n\t\"i686\")\n\tArch=\"386\"\n\t;;\n\t\"x86\")\n\tArch=\"amd64\"\n\t;;\n\t\"mipsel\")\n\tArch=\"mipsle\"\n\t;;\n\t\"mips64el\")\n\tArch=\"mips64le\"\n\tArch=\"mipsle\"\n\techo -e \"mips64el use $Arch may have bug\" \n\t;;\n\t\"mips\")\n\tArch=\"mips\"\n\t;;\n\t\"mips64\")\n\tArch=\"mips64\"\n\tArch=\"mips\"\n\techo -e \"mips64 use $Arch may have bug\" \n\t;;\n\t\"arm\")\n\tArch=\"arm\"\n\t;;\n\t\"aarch64\")\n\tArch=\"arm64\"\n\t;;\n\t\"powerpc\")\n\tArch=\"ppc\"\n\techo -e \"error not support $Archt\" \n\tEXIT 1\n\t;;\n\t\"powerpc64\")\n\tArch=\"ppc64\"\n\techo -e \"error not support $Archt\" \n\tEXIT 1\n\t;;\n\t*)\n\techo -e \"error not support $Archt if you can use offical release please issue a bug\" \n\tEXIT 1\n\t;;\n\tesac\n\techo -e \"start download\" \n\tgrep -v \"^#\" /usr/share/AdGuardHome/links.txt >/tmp/run/AdHlinks.txt\n\twhile read link\n\tdo\n\t\teval link=\"$link\"\n\t\t$downloader /tmp/AdGuardHomeupdate/${link##*/} \"$link\" 2>&1\n\t\tif [ \"$?\" != \"0\" ]; then\n\t\t\techo \"download failed try another download\"\n\t\t\trm -f /tmp/AdGuardHomeupdate/${link##*/}\n\t\telse\n\t\t\tlocal success=\"1\"\n\t\t\tbreak\n\t\tfi \n\tdone < \"/tmp/run/AdHlinks.txt\"\n\trm /tmp/run/AdHlinks.txt\n\t[ -z \"$success\" ] && echo \"no download success\" && EXIT 1\n\tif [ \"${link##*.}\" == \"gz\" ]; then\n\t\ttar -zxf \"/tmp/AdGuardHomeupdate/${link##*/}\" -C \"/tmp/AdGuardHomeupdate/\"\n\t\tif [ ! -e \"/tmp/AdGuardHomeupdate/AdGuardHome\" ]; then\n\t\t\techo -e \"Failed to download core.\" \n\t\t\trm -rf \"/tmp/AdGuardHomeupdate\" >/dev/null 2>&1\n\t\t\tEXIT 1\n\t\tfi\n\t\tdownloadbin=\"/tmp/AdGuardHomeupdate/AdGuardHome/AdGuardHome\"\n\telse\n\t\tdownloadbin=\"/tmp/AdGuardHomeupdate/${link##*/}\"\n\tfi\n\tchmod 755 $downloadbin\n\techo -e \"download success start copy\" \n\tif [ -n \"$upxflag\" ]; then\n\t\techo -e \"start upx may take a long time\" \n\t\tdoupx\n\t\t/tmp/upx-${upx_latest_ver}-${Arch}_linux/upx $upxflag $downloadbin\n\t\trm -rf /tmp/upx-${upx_latest_ver}-${Arch}_linux\n\tfi\n\techo -e \"start copy\" \n\t/etc/init.d/AdGuardHome stop nobackup\n\trm \"$binpath\"\n\tmv -f \"$downloadbin\" \"$binpath\"\n\tif [ \"$?\" == \"1\" ]; then\n\t\techo \"mv failed maybe not enough space please use upx or change bin to /tmp/AdGuardHome\" \n\t\tEXIT 1\n\tfi\n\t/etc/init.d/AdGuardHome start\n\trm -rf \"/tmp/AdGuardHomeupdate\" >/dev/null 2>&1\n\techo -e \"Succeeded in updating core.\" \n\techo -e \"Local version: ${latest_ver}, cloud version: ${latest_ver}.\\n\" \n\tEXIT 0\n}\nEXIT(){\n\trm /var/run/update_core 2>/dev/null\n\t[ \"$1\" != \"0\" ] && touch /var/run/update_core_error\n\texit $1\n}\nmain(){\n\t\n\tcheck_if_already_running\n\tcheck_latest_version $1\n}\n\ttrap \"EXIT 1\" SIGTERM SIGINT\n\ttouch /var/run/update_core\n\trm /var/run/update_core_error 2>/dev/null\n\tmain $1\n"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/waitnet.sh",
    "content": "#!/bin/sh\nPATH=\"/usr/sbin:/usr/bin:/sbin:/bin\"\ncount=0\nwhile :\ndo\n\tping -c 1 -W 1 -q www.baidu.com 1>/dev/null 2>&1\n\tif [ \"$?\" == \"0\" ]; then\n\t\t/etc/init.d/AdGuardHome force_reload\n\t\tbreak\n\tfi\n\tping -c 1 -W 1 -q 202.108.22.5 1>/dev/null 2>&1\n\tif [ \"$?\" == \"0\" ]; then\n\t\t/etc/init.d/AdGuardHome force_reload\n\t\tbreak\n\tfi\n\tsleep 5\n\tping -c 1 -W 1 -q www.google.com 1>/dev/null 2>&1\n\tif [ \"$?\" == \"0\" ]; then\n\t\t/etc/init.d/AdGuardHome force_reload\n\t\tbreak\n\tfi\n\tping -c 1 -W 1 -q 8.8.8.8 1>/dev/null 2>&1\n\tif [ \"$?\" == \"0\" ]; then\n\t\t/etc/init.d/AdGuardHome force_reload\n\t\tbreak\n\tfi\n\tsleep 5\n\tcount=$((count+1))\n\tif [ $count -gt 18 ]; then\n\t\t/etc/init.d/AdGuardHome force_reload\n\t\tbreak\n\tfi\ndone\nreturn 0"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/AdGuardHome/watchconfig.sh",
    "content": "#!/bin/sh\nPATH=\"/usr/sbin:/usr/bin:/sbin:/bin\"\nconfigpath=$(uci get AdGuardHome.AdGuardHome.configpath)\nwhile :\ndo\n\tsleep 10\n\tif [ -f \"$configpath\" ]; then\n\t\t/etc/init.d/AdGuardHome do_redirect 1\n\t\tbreak\n\tfi\ndone\nreturn 0"
  },
  {
    "path": "luci-app-adguardhome/root/usr/share/rpcd/acl.d/luci-app-adguardhome.json",
    "content": "{\n\t\"luci-app-adguardhome\": {\n\t\t\"description\": \"Grant UCI access for luci-app-adguardhome\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"AdGuardHome\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"AdGuardHome\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldcode.js",
    "content": "!function(n){\"object\"==typeof exports&&\"object\"==typeof module?n(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],n):n(CodeMirror)}(function(n){\"use strict\";function e(e,o,i,t){if(i&&i.call){var l=i;i=null}else l=r(e,i,\"rangeFinder\");\"number\"==typeof o&&(o=n.Pos(o,0));var f=r(e,i,\"minFoldSize\");function d(n){var r=l(e,o);if(!r||r.to.line-r.from.line<f)return null;for(var i=e.findMarksAt(r.from),d=0;d<i.length;++d)if(i[d].__isFold&&\"fold\"!==t){if(!n)return null;r.cleared=!0,i[d].clear()}return r}var u=d(!0);if(r(e,i,\"scanUp\"))for(;!u&&o.line>e.firstLine();)o=n.Pos(o.line-1,0),u=d(!1);if(u&&!u.cleared&&\"unfold\"!==t){var a=function(n,e){var o=r(n,e,\"widget\");if(\"string\"==typeof o){var i=document.createTextNode(o);(o=document.createElement(\"span\")).appendChild(i),o.className=\"CodeMirror-foldmarker\"}else o&&(o=o.cloneNode(!0));return o}(e,i);n.on(a,\"mousedown\",function(e){c.clear(),n.e_preventDefault(e)});var c=e.markText(u.from,u.to,{replacedWith:a,clearOnEnter:r(e,i,\"clearOnEnter\"),__isFold:!0});c.on(\"clear\",function(o,r){n.signal(e,\"unfold\",e,o,r)}),n.signal(e,\"fold\",e,u.from,u.to)}}n.newFoldFunction=function(n,o){return function(r,i){e(r,i,{rangeFinder:n,widget:o})}},n.defineExtension(\"foldCode\",function(n,o,r){e(this,n,o,r)}),n.defineExtension(\"isFolded\",function(n){for(var e=this.findMarksAt(n),o=0;o<e.length;++o)if(e[o].__isFold)return!0}),n.commands.toggleFold=function(n){n.foldCode(n.getCursor())},n.commands.fold=function(n){n.foldCode(n.getCursor(),null,\"fold\")},n.commands.unfold=function(n){n.foldCode(n.getCursor(),null,\"unfold\")},n.commands.foldAll=function(e){e.operation(function(){for(var o=e.firstLine(),r=e.lastLine();o<=r;o++)e.foldCode(n.Pos(o,0),null,\"fold\")})},n.commands.unfoldAll=function(e){e.operation(function(){for(var o=e.firstLine(),r=e.lastLine();o<=r;o++)e.foldCode(n.Pos(o,0),null,\"unfold\")})},n.registerHelper(\"fold\",\"combine\",function(){var n=Array.prototype.slice.call(arguments,0);return function(e,o){for(var r=0;r<n.length;++r){var i=n[r](e,o);if(i)return i}}}),n.registerHelper(\"fold\",\"auto\",function(n,e){for(var o=n.getHelpers(e,\"fold\"),r=0;r<o.length;r++){var i=o[r](n,e);if(i)return i}});var o={rangeFinder:n.fold.auto,widget:\"↔\",minFoldSize:0,scanUp:!1,clearOnEnter:!0};function r(n,e,r){if(e&&void 0!==e[r])return e[r];var i=n.options.foldOptions;return i&&void 0!==i[r]?i[r]:o[r]}n.defineOption(\"foldOptions\",null),n.defineExtension(\"foldOption\",function(n,e){return r(this,n,e)})});"
  },
  {
    "path": "luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldgutter.css",
    "content": ".CodeMirror-foldmarker{color:blue;text-shadow:#b9f 1px 1px 2px,#b9f -1px -1px 2px,#b9f 1px -1px 2px,#b9f -1px 1px 2px;font-family:arial;line-height:.3;cursor:pointer}.CodeMirror-foldgutter{width:.7em}.CodeMirror-foldgutter-open,.CodeMirror-foldgutter-folded{cursor:pointer}.CodeMirror-foldgutter-open:after{content:\"\\25BE\"}.CodeMirror-foldgutter-folded:after{content:\"\\25B8\"}\n"
  },
  {
    "path": "luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/foldgutter.js",
    "content": "!function(t){\"object\"==typeof exports&&\"object\"==typeof module?t(require(\"../../lib/codemirror\"),require(\"./foldcode\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\",\"./foldcode\"],t):t(CodeMirror)}(function(t){\"use strict\";t.defineOption(\"foldGutter\",!1,function(o,e,r){r&&r!=t.Init&&(o.clearGutter(o.state.foldGutter.options.gutter),o.state.foldGutter=null,o.off(\"gutterClick\",a),o.off(\"changes\",d),o.off(\"viewportChange\",u),o.off(\"fold\",l),o.off(\"unfold\",l),o.off(\"swapDoc\",d)),e&&(o.state.foldGutter=new function(t){this.options=t,this.from=this.to=0}(function(t){!0===t&&(t={});null==t.gutter&&(t.gutter=\"CodeMirror-foldgutter\");null==t.indicatorOpen&&(t.indicatorOpen=\"CodeMirror-foldgutter-open\");null==t.indicatorFolded&&(t.indicatorFolded=\"CodeMirror-foldgutter-folded\");return t}(e)),f(o),o.on(\"gutterClick\",a),o.on(\"changes\",d),o.on(\"viewportChange\",u),o.on(\"fold\",l),o.on(\"unfold\",l),o.on(\"swapDoc\",d))});var o=t.Pos;function e(t,e){for(var r=t.findMarks(o(e,0),o(e+1,0)),n=0;n<r.length;++n)if(r[n].__isFold){var i=r[n].find(-1);if(i&&i.line===e)return r[n]}}function r(t){if(\"string\"==typeof t){var o=document.createElement(\"div\");return o.className=t+\" CodeMirror-guttermarker-subtle\",o}return t.cloneNode(!0)}function n(t,n,f){var a=t.state.foldGutter.options,d=n-1,u=t.foldOption(a,\"minFoldSize\"),l=t.foldOption(a,\"rangeFinder\"),c=\"string\"==typeof a.indicatorFolded&&i(a.indicatorFolded),s=\"string\"==typeof a.indicatorOpen&&i(a.indicatorOpen);t.eachLine(n,f,function(n){++d;var i=null,f=n.gutterMarkers;if(f&&(f=f[a.gutter]),e(t,d)){if(c&&f&&c.test(f.className))return;i=r(a.indicatorFolded)}else{var p=o(d,0),m=l&&l(t,p);if(m&&m.to.line-m.from.line>=u){if(s&&f&&s.test(f.className))return;i=r(a.indicatorOpen)}}(i||f)&&t.setGutterMarker(n,a.gutter,i)})}function i(t){return new RegExp(\"(^|\\\\s)\"+t+\"(?:$|\\\\s)\\\\s*\")}function f(t){var o=t.getViewport(),e=t.state.foldGutter;e&&(t.operation(function(){n(t,o.from,o.to)}),e.from=o.from,e.to=o.to)}function a(t,r,n){var i=t.state.foldGutter;if(i){var f=i.options;if(n==f.gutter){var a=e(t,r);a?a.clear():t.foldCode(o(r,0),f)}}}function d(t){var o=t.state.foldGutter;if(o){var e=o.options;o.from=o.to=0,clearTimeout(o.changeUpdate),o.changeUpdate=setTimeout(function(){f(t)},e.foldOnChangeTimeSpan||600)}}function u(t){var o=t.state.foldGutter;if(o){var e=o.options;clearTimeout(o.changeUpdate),o.changeUpdate=setTimeout(function(){var e=t.getViewport();o.from==o.to||e.from-o.to>20||o.from-e.to>20?f(t):t.operation(function(){e.from<o.from&&(n(t,e.from,o.from),o.from=e.from),e.to>o.to&&(n(t,o.to,e.to),o.to=e.to)})},e.updateViewportTimeSpan||400)}}function l(t,o){var e=t.state.foldGutter;if(e){var r=o.line;r>=e.from&&r<e.to&&n(t,r,r+1)}}});"
  },
  {
    "path": "luci-app-adguardhome/root/www/luci-static/resources/codemirror/addon/fold/indent-fold.js",
    "content": "!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)}(function(e){\"use strict\";function n(n,t){var i=n.getLine(t),o=i.search(/\\S/);return-1==o||/\\bcomment\\b/.test(n.getTokenTypeAt(e.Pos(t,o+1)))?-1:e.countColumn(i,null,n.getOption(\"tabSize\"))}e.registerHelper(\"fold\",\"indent\",function(t,i){var o=n(t,i.line);if(!(o<0)){for(var r=null,l=i.line+1,f=t.lastLine();l<=f;++l){var u=n(t,l);if(-1==u);else{if(!(u>o))break;r=l}}return r?{from:e.Pos(i.line,t.getLine(i.line).length),to:e.Pos(r,t.getLine(r).length)}:void 0}})});"
  },
  {
    "path": "luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.css",
    "content": ".CodeMirror{font-family:monospace;height:500px;color:black;direction:ltr}.CodeMirror-lines{padding:4px 0}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{padding:0 4px}.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{background-color:white}.CodeMirror-gutters{border-right:1px solid #ddd;background-color:#f7f7f7;white-space:nowrap}.CodeMirror-linenumber{padding:0 3px 0 5px;min-width:20px;text-align:right;color:#999;white-space:nowrap}.CodeMirror-guttermarker{color:black}.CodeMirror-guttermarker-subtle{color:#999}.CodeMirror-cursor{border-left:1px solid black;border-right:0;width:0}.CodeMirror div.CodeMirror-secondarycursor{border-left:1px solid silver}.cm-fat-cursor .CodeMirror-cursor{width:auto;border:0 !important;background:#7e7}.cm-fat-cursor div.CodeMirror-cursors{z-index:1}.cm-fat-cursor-mark{background-color:rgba(20,255,20,0.5);-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite}.cm-animate-fat-cursor{width:auto;border:0;-webkit-animation:blink 1.06s steps(1) infinite;-moz-animation:blink 1.06s steps(1) infinite;animation:blink 1.06s steps(1) infinite;background-color:#7e7}@-moz-keyframes blink{50%{background-color:transparent}}@-webkit-keyframes blink{50%{background-color:transparent}}@keyframes blink{50%{background-color:transparent}}.cm-tab{display:inline-block;text-decoration:inherit}.CodeMirror-rulers{position:absolute;left:0;right:0;top:-50px;bottom:0;overflow:hidden}.CodeMirror-ruler{border-left:1px solid #ccc;top:0;bottom:0;position:absolute}.cm-s-default .cm-header{color:blue}.cm-s-default .cm-quote{color:#090}.cm-negative{color:#d44}.cm-positive{color:#292}.cm-header,.cm-strong{font-weight:bold}.cm-em{font-style:italic}.cm-link{text-decoration:underline}.cm-strikethrough{text-decoration:line-through}.cm-s-default .cm-keyword{color:#708}.cm-s-default .cm-atom{color:#219}.cm-s-default .cm-number{color:#164}.cm-s-default .cm-def{color:#00f}.cm-s-default .cm-variable-2{color:#05a}.cm-s-default .cm-variable-3,.cm-s-default .cm-type{color:#085}.cm-s-default .cm-comment{color:#a50}.cm-s-default .cm-string{color:#a11}.cm-s-default .cm-string-2{color:#f50}.cm-s-default .cm-meta{color:#555}.cm-s-default .cm-qualifier{color:#555}.cm-s-default .cm-builtin{color:#30a}.cm-s-default .cm-bracket{color:#997}.cm-s-default .cm-tag{color:#170}.cm-s-default .cm-attribute{color:#00c}.cm-s-default .cm-hr{color:#999}.cm-s-default .cm-link{color:#00c}.cm-s-default .cm-error{color:red}.cm-invalidchar{color:red}.CodeMirror-composing{border-bottom:2px solid}div.CodeMirror span.CodeMirror-matchingbracket{color:#0b0}div.CodeMirror span.CodeMirror-nonmatchingbracket{color:#a22}.CodeMirror-matchingtag{background:rgba(255,150,0,.3)}.CodeMirror-activeline-background{background:#e8f2ff}.CodeMirror{position:relative;overflow:hidden;background:white}.CodeMirror-scroll{overflow:scroll !important;margin-bottom:-30px;margin-right:-30px;padding-bottom:30px;height:100%;outline:0;position:relative}.CodeMirror-sizer{position:relative;border-right:30px solid transparent}.CodeMirror-vscrollbar,.CodeMirror-hscrollbar,.CodeMirror-scrollbar-filler,.CodeMirror-gutter-filler{position:absolute;z-index:6;display:none}.CodeMirror-vscrollbar{right:0;top:0;overflow-x:hidden;overflow-y:scroll}.CodeMirror-hscrollbar{bottom:0;left:0;overflow-y:hidden;overflow-x:scroll}.CodeMirror-scrollbar-filler{right:0;bottom:0}.CodeMirror-gutter-filler{left:0;bottom:0}.CodeMirror-gutters{position:absolute;left:0;top:0;min-height:100%;z-index:3}.CodeMirror-gutter{white-space:normal;height:100%;display:inline-block;vertical-align:top;margin-bottom:-30px}.CodeMirror-gutter-wrapper{position:absolute;z-index:4;background:none !important;border:none !important}.CodeMirror-gutter-background{position:absolute;top:0;bottom:0;z-index:4}.CodeMirror-gutter-elt{position:absolute;cursor:default;z-index:4}.CodeMirror-gutter-wrapper ::selection{background-color:transparent}.CodeMirror-gutter-wrapper ::-moz-selection{background-color:transparent}.CodeMirror-lines{cursor:text;min-height:1px}.CodeMirror pre.CodeMirror-line,.CodeMirror pre.CodeMirror-line-like{-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;border-width:0;background:transparent;font-family:inherit;font-size:inherit;margin:0;white-space:pre;word-wrap:normal;line-height:inherit;color:inherit;z-index:2;position:relative;overflow:visible;-webkit-tap-highlight-color:transparent;-webkit-font-variant-ligatures:contextual;font-variant-ligatures:contextual}.CodeMirror-wrap pre.CodeMirror-line,.CodeMirror-wrap pre.CodeMirror-line-like{word-wrap:break-word;white-space:pre-wrap;word-break:normal}.CodeMirror-linebackground{position:absolute;left:0;right:0;top:0;bottom:0;z-index:0}.CodeMirror-linewidget{position:relative;z-index:2;padding:.1px}.CodeMirror-rtl pre{direction:rtl}.CodeMirror-code{outline:0}.CodeMirror-scroll,.CodeMirror-sizer,.CodeMirror-gutter,.CodeMirror-gutters,.CodeMirror-linenumber{-moz-box-sizing:content-box;box-sizing:content-box}.CodeMirror-measure{position:absolute;width:100%;height:0;overflow:hidden;visibility:hidden}.CodeMirror-cursor{position:absolute;pointer-events:none}.CodeMirror-measure pre{position:static}div.CodeMirror-cursors{visibility:hidden;position:relative;z-index:3}div.CodeMirror-dragcursors{visibility:visible}.CodeMirror-focused div.CodeMirror-cursors{visibility:visible}.CodeMirror-selected{background:#d9d9d9}.CodeMirror-focused .CodeMirror-selected{background:#d7d4f0}.CodeMirror-crosshair{cursor:crosshair}.CodeMirror-line::selection,.CodeMirror-line>span::selection,.CodeMirror-line>span>span::selection{background:#d7d4f0}.CodeMirror-line::-moz-selection,.CodeMirror-line>span::-moz-selection,.CodeMirror-line>span>span::-moz-selection{background:#d7d4f0}.cm-searching{background-color:#ffa;background-color:rgba(255,255,0,.4)}.cm-force-border{padding-right:.1px}@media print{.CodeMirror div.CodeMirror-cursors{visibility:hidden}}.cm-tab-wrap-hack:after{content:''}span.CodeMirror-selectedtext{background:0}\n"
  },
  {
    "path": "luci-app-adguardhome/root/www/luci-static/resources/codemirror/lib/codemirror.js",
    "content": "!function(e,t){\"object\"==typeof exports&&\"undefined\"!=typeof module?module.exports=t():\"function\"==typeof define&&define.amd?define(t):e.CodeMirror=t()}(this,function(){\"use strict\";var e=navigator.userAgent,t=navigator.platform,r=/gecko\\/\\d/i.test(e),n=/MSIE \\d/.test(e),i=/Trident\\/(?:[7-9]|\\d{2,})\\..*rv:(\\d+)/.exec(e),o=/Edge\\/(\\d+)/.exec(e),l=n||i||o,s=l&&(n?document.documentMode||6:+(o||i)[1]),a=!o&&/WebKit\\//.test(e),u=a&&/Qt\\/\\d+\\.\\d+/.test(e),c=!o&&/Chrome\\//.test(e),h=/Opera\\//.test(e),f=/Apple Computer/.test(navigator.vendor),d=/Mac OS X 1\\d\\D([8-9]|\\d\\d)\\D/.test(e),p=/PhantomJS/.test(e),g=!o&&/AppleWebKit/.test(e)&&/Mobile\\/\\w+/.test(e),v=/Android/.test(e),m=g||v||/webOS|BlackBerry|Opera Mini|Opera Mobi|IEMobile/i.test(e),y=g||/Mac/.test(t),b=/\\bCrOS\\b/.test(e),w=/win/i.test(t),x=h&&e.match(/Version\\/(\\d*\\.\\d*)/);x&&(x=Number(x[1])),x&&x>=15&&(h=!1,a=!0);var C=y&&(u||h&&(null==x||x<12.11)),S=r||l&&s>=9;function L(e){return new RegExp(\"(^|\\\\s)\"+e+\"(?:$|\\\\s)\\\\s*\")}var k,T=function(e,t){var r=e.className,n=L(t).exec(r);if(n){var i=r.slice(n.index+n[0].length);e.className=r.slice(0,n.index)+(i?n[1]+i:\"\")}};function M(e){for(var t=e.childNodes.length;t>0;--t)e.removeChild(e.firstChild);return e}function N(e,t){return M(e).appendChild(t)}function O(e,t,r,n){var i=document.createElement(e);if(r&&(i.className=r),n&&(i.style.cssText=n),\"string\"==typeof t)i.appendChild(document.createTextNode(t));else if(t)for(var o=0;o<t.length;++o)i.appendChild(t[o]);return i}function A(e,t,r,n){var i=O(e,t,r,n);return i.setAttribute(\"role\",\"presentation\"),i}function D(e,t){if(3==t.nodeType&&(t=t.parentNode),e.contains)return e.contains(t);do{if(11==t.nodeType&&(t=t.host),t==e)return!0}while(t=t.parentNode)}function W(){var e;try{e=document.activeElement}catch(t){e=document.body||null}for(;e&&e.shadowRoot&&e.shadowRoot.activeElement;)e=e.shadowRoot.activeElement;return e}function H(e,t){var r=e.className;L(t).test(r)||(e.className+=(r?\" \":\"\")+t)}function F(e,t){for(var r=e.split(\" \"),n=0;n<r.length;n++)r[n]&&!L(r[n]).test(t)&&(t+=\" \"+r[n]);return t}k=document.createRange?function(e,t,r,n){var i=document.createRange();return i.setEnd(n||e,r),i.setStart(e,t),i}:function(e,t,r){var n=document.body.createTextRange();try{n.moveToElementText(e.parentNode)}catch(e){return n}return n.collapse(!0),n.moveEnd(\"character\",r),n.moveStart(\"character\",t),n};var P=function(e){e.select()};function E(e){var t=Array.prototype.slice.call(arguments,1);return function(){return e.apply(null,t)}}function I(e,t,r){for(var n in t||(t={}),e)!e.hasOwnProperty(n)||!1===r&&t.hasOwnProperty(n)||(t[n]=e[n]);return t}function z(e,t,r,n,i){null==t&&-1==(t=e.search(/[^\\s\\u00a0]/))&&(t=e.length);for(var o=n||0,l=i||0;;){var s=e.indexOf(\"\\t\",o);if(s<0||s>=t)return l+(t-o);l+=s-o,l+=r-l%r,o=s+1}}g?P=function(e){e.selectionStart=0,e.selectionEnd=e.value.length}:l&&(P=function(e){try{e.select()}catch(e){}});var R=function(){this.id=null,this.f=null,this.time=0,this.handler=E(this.onTimeout,this)};function B(e,t){for(var r=0;r<e.length;++r)if(e[r]==t)return r;return-1}R.prototype.onTimeout=function(e){e.id=0,e.time<=+new Date?e.f():setTimeout(e.handler,e.time-+new Date)},R.prototype.set=function(e,t){this.f=t;var r=+new Date+e;(!this.id||r<this.time)&&(clearTimeout(this.id),this.id=setTimeout(this.handler,e),this.time=r)};var G=30,U={toString:function(){return\"CodeMirror.Pass\"}},V={scroll:!1},K={origin:\"*mouse\"},j={origin:\"+move\"};function X(e,t,r){for(var n=0,i=0;;){var o=e.indexOf(\"\\t\",n);-1==o&&(o=e.length);var l=o-n;if(o==e.length||i+l>=t)return n+Math.min(l,t-i);if(i+=o-n,n=o+1,(i+=r-i%r)>=t)return n}}var Y=[\"\"];function _(e){for(;Y.length<=e;)Y.push($(Y)+\" \");return Y[e]}function $(e){return e[e.length-1]}function q(e,t){for(var r=[],n=0;n<e.length;n++)r[n]=t(e[n],n);return r}function Z(){}function Q(e,t){var r;return Object.create?r=Object.create(e):(Z.prototype=e,r=new Z),t&&I(t,r),r}var J=/[\\u00df\\u0587\\u0590-\\u05f4\\u0600-\\u06ff\\u3040-\\u309f\\u30a0-\\u30ff\\u3400-\\u4db5\\u4e00-\\u9fcc\\uac00-\\ud7af]/;function ee(e){return/\\w/.test(e)||e>\"\"&&(e.toUpperCase()!=e.toLowerCase()||J.test(e))}function te(e,t){return t?!!(t.source.indexOf(\"\\\\w\")>-1&&ee(e))||t.test(e):ee(e)}function re(e){for(var t in e)if(e.hasOwnProperty(t)&&e[t])return!1;return!0}var ne=/[\\u0300-\\u036f\\u0483-\\u0489\\u0591-\\u05bd\\u05bf\\u05c1\\u05c2\\u05c4\\u05c5\\u05c7\\u0610-\\u061a\\u064b-\\u065e\\u0670\\u06d6-\\u06dc\\u06de-\\u06e4\\u06e7\\u06e8\\u06ea-\\u06ed\\u0711\\u0730-\\u074a\\u07a6-\\u07b0\\u07eb-\\u07f3\\u0816-\\u0819\\u081b-\\u0823\\u0825-\\u0827\\u0829-\\u082d\\u0900-\\u0902\\u093c\\u0941-\\u0948\\u094d\\u0951-\\u0955\\u0962\\u0963\\u0981\\u09bc\\u09be\\u09c1-\\u09c4\\u09cd\\u09d7\\u09e2\\u09e3\\u0a01\\u0a02\\u0a3c\\u0a41\\u0a42\\u0a47\\u0a48\\u0a4b-\\u0a4d\\u0a51\\u0a70\\u0a71\\u0a75\\u0a81\\u0a82\\u0abc\\u0ac1-\\u0ac5\\u0ac7\\u0ac8\\u0acd\\u0ae2\\u0ae3\\u0b01\\u0b3c\\u0b3e\\u0b3f\\u0b41-\\u0b44\\u0b4d\\u0b56\\u0b57\\u0b62\\u0b63\\u0b82\\u0bbe\\u0bc0\\u0bcd\\u0bd7\\u0c3e-\\u0c40\\u0c46-\\u0c48\\u0c4a-\\u0c4d\\u0c55\\u0c56\\u0c62\\u0c63\\u0cbc\\u0cbf\\u0cc2\\u0cc6\\u0ccc\\u0ccd\\u0cd5\\u0cd6\\u0ce2\\u0ce3\\u0d3e\\u0d41-\\u0d44\\u0d4d\\u0d57\\u0d62\\u0d63\\u0dca\\u0dcf\\u0dd2-\\u0dd4\\u0dd6\\u0ddf\\u0e31\\u0e34-\\u0e3a\\u0e47-\\u0e4e\\u0eb1\\u0eb4-\\u0eb9\\u0ebb\\u0ebc\\u0ec8-\\u0ecd\\u0f18\\u0f19\\u0f35\\u0f37\\u0f39\\u0f71-\\u0f7e\\u0f80-\\u0f84\\u0f86\\u0f87\\u0f90-\\u0f97\\u0f99-\\u0fbc\\u0fc6\\u102d-\\u1030\\u1032-\\u1037\\u1039\\u103a\\u103d\\u103e\\u1058\\u1059\\u105e-\\u1060\\u1071-\\u1074\\u1082\\u1085\\u1086\\u108d\\u109d\\u135f\\u1712-\\u1714\\u1732-\\u1734\\u1752\\u1753\\u1772\\u1773\\u17b7-\\u17bd\\u17c6\\u17c9-\\u17d3\\u17dd\\u180b-\\u180d\\u18a9\\u1920-\\u1922\\u1927\\u1928\\u1932\\u1939-\\u193b\\u1a17\\u1a18\\u1a56\\u1a58-\\u1a5e\\u1a60\\u1a62\\u1a65-\\u1a6c\\u1a73-\\u1a7c\\u1a7f\\u1b00-\\u1b03\\u1b34\\u1b36-\\u1b3a\\u1b3c\\u1b42\\u1b6b-\\u1b73\\u1b80\\u1b81\\u1ba2-\\u1ba5\\u1ba8\\u1ba9\\u1c2c-\\u1c33\\u1c36\\u1c37\\u1cd0-\\u1cd2\\u1cd4-\\u1ce0\\u1ce2-\\u1ce8\\u1ced\\u1dc0-\\u1de6\\u1dfd-\\u1dff\\u200c\\u200d\\u20d0-\\u20f0\\u2cef-\\u2cf1\\u2de0-\\u2dff\\u302a-\\u302f\\u3099\\u309a\\ua66f-\\ua672\\ua67c\\ua67d\\ua6f0\\ua6f1\\ua802\\ua806\\ua80b\\ua825\\ua826\\ua8c4\\ua8e0-\\ua8f1\\ua926-\\ua92d\\ua947-\\ua951\\ua980-\\ua982\\ua9b3\\ua9b6-\\ua9b9\\ua9bc\\uaa29-\\uaa2e\\uaa31\\uaa32\\uaa35\\uaa36\\uaa43\\uaa4c\\uaab0\\uaab2-\\uaab4\\uaab7\\uaab8\\uaabe\\uaabf\\uaac1\\uabe5\\uabe8\\uabed\\udc00-\\udfff\\ufb1e\\ufe00-\\ufe0f\\ufe20-\\ufe26\\uff9e\\uff9f]/;function ie(e){return e.charCodeAt(0)>=768&&ne.test(e)}function oe(e,t,r){for(;(r<0?t>0:t<e.length)&&ie(e.charAt(t));)t+=r;return t}function le(e,t,r){for(var n=t>r?-1:1;;){if(t==r)return t;var i=(t+r)/2,o=n<0?Math.ceil(i):Math.floor(i);if(o==t)return e(o)?t:r;e(o)?r=o:t=o+n}}var se=null;function ae(e,t,r){var n;se=null;for(var i=0;i<e.length;++i){var o=e[i];if(o.from<t&&o.to>t)return i;o.to==t&&(o.from!=o.to&&\"before\"==r?n=i:se=i),o.from==t&&(o.from!=o.to&&\"before\"!=r?n=i:se=i)}return null!=n?n:se}var ue=function(){var e=\"bbbbbbbbbtstwsbbbbbbbbbbbbbbssstwNN%%%NNNNNN,N,N1111111111NNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNNNLLLLLLLLLLLLLLLLLLLLLLLLLLNNNNbbbbbbsbbbbbbbbbbbbbbbbbbbbbbbbbb,N%%%%NNNNLNNNNN%%11NLNNN1LNNNNNLLLLLLLLLLLLLLLLLLLLLLLNLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLN\",t=\"nnnnnnNNr%%r,rNNmmmmmmmmmmmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmmmmmmmmmmmmmmmnnnnnnnnnn%nnrrrmrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrmmmmmmmnNmmmmmmrrmmNmmmmrr1111111111\";var r=/[\\u0590-\\u05f4\\u0600-\\u06ff\\u0700-\\u08ac]/,n=/[stwN]/,i=/[LRr]/,o=/[Lb1n]/,l=/[1n]/;function s(e,t,r){this.level=e,this.from=t,this.to=r}return function(a,u){var c=\"ltr\"==u?\"L\":\"R\";if(0==a.length||\"ltr\"==u&&!r.test(a))return!1;for(var h,f=a.length,d=[],p=0;p<f;++p)d.push((h=a.charCodeAt(p))<=247?e.charAt(h):1424<=h&&h<=1524?\"R\":1536<=h&&h<=1785?t.charAt(h-1536):1774<=h&&h<=2220?\"r\":8192<=h&&h<=8203?\"w\":8204==h?\"b\":\"L\");for(var g=0,v=c;g<f;++g){var m=d[g];\"m\"==m?d[g]=v:v=m}for(var y=0,b=c;y<f;++y){var w=d[y];\"1\"==w&&\"r\"==b?d[y]=\"n\":i.test(w)&&(b=w,\"r\"==w&&(d[y]=\"R\"))}for(var x=1,C=d[0];x<f-1;++x){var S=d[x];\"+\"==S&&\"1\"==C&&\"1\"==d[x+1]?d[x]=\"1\":\",\"!=S||C!=d[x+1]||\"1\"!=C&&\"n\"!=C||(d[x]=C),C=S}for(var L=0;L<f;++L){var k=d[L];if(\",\"==k)d[L]=\"N\";else if(\"%\"==k){var T=void 0;for(T=L+1;T<f&&\"%\"==d[T];++T);for(var M=L&&\"!\"==d[L-1]||T<f&&\"1\"==d[T]?\"1\":\"N\",N=L;N<T;++N)d[N]=M;L=T-1}}for(var O=0,A=c;O<f;++O){var D=d[O];\"L\"==A&&\"1\"==D?d[O]=\"L\":i.test(D)&&(A=D)}for(var W=0;W<f;++W)if(n.test(d[W])){var H=void 0;for(H=W+1;H<f&&n.test(d[H]);++H);for(var F=\"L\"==(W?d[W-1]:c),P=F==(\"L\"==(H<f?d[H]:c))?F?\"L\":\"R\":c,E=W;E<H;++E)d[E]=P;W=H-1}for(var I,z=[],R=0;R<f;)if(o.test(d[R])){var B=R;for(++R;R<f&&o.test(d[R]);++R);z.push(new s(0,B,R))}else{var G=R,U=z.length;for(++R;R<f&&\"L\"!=d[R];++R);for(var V=G;V<R;)if(l.test(d[V])){G<V&&z.splice(U,0,new s(1,G,V));var K=V;for(++V;V<R&&l.test(d[V]);++V);z.splice(U,0,new s(2,K,V)),G=V}else++V;G<R&&z.splice(U,0,new s(1,G,R))}return\"ltr\"==u&&(1==z[0].level&&(I=a.match(/^\\s+/))&&(z[0].from=I[0].length,z.unshift(new s(0,0,I[0].length))),1==$(z).level&&(I=a.match(/\\s+$/))&&($(z).to-=I[0].length,z.push(new s(0,f-I[0].length,f)))),\"rtl\"==u?z.reverse():z}}();function ce(e,t){var r=e.order;return null==r&&(r=e.order=ue(e.text,t)),r}var he=[],fe=function(e,t,r){if(e.addEventListener)e.addEventListener(t,r,!1);else if(e.attachEvent)e.attachEvent(\"on\"+t,r);else{var n=e._handlers||(e._handlers={});n[t]=(n[t]||he).concat(r)}};function de(e,t){return e._handlers&&e._handlers[t]||he}function pe(e,t,r){if(e.removeEventListener)e.removeEventListener(t,r,!1);else if(e.detachEvent)e.detachEvent(\"on\"+t,r);else{var n=e._handlers,i=n&&n[t];if(i){var o=B(i,r);o>-1&&(n[t]=i.slice(0,o).concat(i.slice(o+1)))}}}function ge(e,t){var r=de(e,t);if(r.length)for(var n=Array.prototype.slice.call(arguments,2),i=0;i<r.length;++i)r[i].apply(null,n)}function ve(e,t,r){return\"string\"==typeof t&&(t={type:t,preventDefault:function(){this.defaultPrevented=!0}}),ge(e,r||t.type,e,t),Ce(t)||t.codemirrorIgnore}function me(e){var t=e._handlers&&e._handlers.cursorActivity;if(t)for(var r=e.curOp.cursorActivityHandlers||(e.curOp.cursorActivityHandlers=[]),n=0;n<t.length;++n)-1==B(r,t[n])&&r.push(t[n])}function ye(e,t){return de(e,t).length>0}function be(e){e.prototype.on=function(e,t){fe(this,e,t)},e.prototype.off=function(e,t){pe(this,e,t)}}function we(e){e.preventDefault?e.preventDefault():e.returnValue=!1}function xe(e){e.stopPropagation?e.stopPropagation():e.cancelBubble=!0}function Ce(e){return null!=e.defaultPrevented?e.defaultPrevented:0==e.returnValue}function Se(e){we(e),xe(e)}function Le(e){return e.target||e.srcElement}function ke(e){var t=e.which;return null==t&&(1&e.button?t=1:2&e.button?t=3:4&e.button&&(t=2)),y&&e.ctrlKey&&1==t&&(t=3),t}var Te,Me,Ne=function(){if(l&&s<9)return!1;var e=O(\"div\");return\"draggable\"in e||\"dragDrop\"in e}();function Oe(e){if(null==Te){var t=O(\"span\",\"​\");N(e,O(\"span\",[t,document.createTextNode(\"x\")])),0!=e.firstChild.offsetHeight&&(Te=t.offsetWidth<=1&&t.offsetHeight>2&&!(l&&s<8))}var r=Te?O(\"span\",\"​\"):O(\"span\",\" \",null,\"display: inline-block; width: 1px; margin-right: -1px\");return r.setAttribute(\"cm-text\",\"\"),r}function Ae(e){if(null!=Me)return Me;var t=N(e,document.createTextNode(\"AخA\")),r=k(t,0,1).getBoundingClientRect(),n=k(t,1,2).getBoundingClientRect();return M(e),!(!r||r.left==r.right)&&(Me=n.right-r.right<3)}var De,We=3!=\"\\n\\nb\".split(/\\n/).length?function(e){for(var t=0,r=[],n=e.length;t<=n;){var i=e.indexOf(\"\\n\",t);-1==i&&(i=e.length);var o=e.slice(t,\"\\r\"==e.charAt(i-1)?i-1:i),l=o.indexOf(\"\\r\");-1!=l?(r.push(o.slice(0,l)),t+=l+1):(r.push(o),t=i+1)}return r}:function(e){return e.split(/\\r\\n?|\\n/)},He=window.getSelection?function(e){try{return e.selectionStart!=e.selectionEnd}catch(e){return!1}}:function(e){var t;try{t=e.ownerDocument.selection.createRange()}catch(e){}return!(!t||t.parentElement()!=e)&&0!=t.compareEndPoints(\"StartToEnd\",t)},Fe=\"oncopy\"in(De=O(\"div\"))||(De.setAttribute(\"oncopy\",\"return;\"),\"function\"==typeof De.oncopy),Pe=null;var Ee={},Ie={};function ze(e){if(\"string\"==typeof e&&Ie.hasOwnProperty(e))e=Ie[e];else if(e&&\"string\"==typeof e.name&&Ie.hasOwnProperty(e.name)){var t=Ie[e.name];\"string\"==typeof t&&(t={name:t}),(e=Q(t,e)).name=t.name}else{if(\"string\"==typeof e&&/^[\\w\\-]+\\/[\\w\\-]+\\+xml$/.test(e))return ze(\"application/xml\");if(\"string\"==typeof e&&/^[\\w\\-]+\\/[\\w\\-]+\\+json$/.test(e))return ze(\"application/json\")}return\"string\"==typeof e?{name:e}:e||{name:\"null\"}}function Re(e,t){t=ze(t);var r=Ee[t.name];if(!r)return Re(e,\"text/plain\");var n=r(e,t);if(Be.hasOwnProperty(t.name)){var i=Be[t.name];for(var o in i)i.hasOwnProperty(o)&&(n.hasOwnProperty(o)&&(n[\"_\"+o]=n[o]),n[o]=i[o])}if(n.name=t.name,t.helperType&&(n.helperType=t.helperType),t.modeProps)for(var l in t.modeProps)n[l]=t.modeProps[l];return n}var Be={};function Ge(e,t){I(t,Be.hasOwnProperty(e)?Be[e]:Be[e]={})}function Ue(e,t){if(!0===t)return t;if(e.copyState)return e.copyState(t);var r={};for(var n in t){var i=t[n];i instanceof Array&&(i=i.concat([])),r[n]=i}return r}function Ve(e,t){for(var r;e.innerMode&&(r=e.innerMode(t))&&r.mode!=e;)t=r.state,e=r.mode;return r||{mode:e,state:t}}function Ke(e,t,r){return!e.startState||e.startState(t,r)}var je=function(e,t,r){this.pos=this.start=0,this.string=e,this.tabSize=t||8,this.lastColumnPos=this.lastColumnValue=0,this.lineStart=0,this.lineOracle=r};function Xe(e,t){if((t-=e.first)<0||t>=e.size)throw new Error(\"There is no line \"+(t+e.first)+\" in the document.\");for(var r=e;!r.lines;)for(var n=0;;++n){var i=r.children[n],o=i.chunkSize();if(t<o){r=i;break}t-=o}return r.lines[t]}function Ye(e,t,r){var n=[],i=t.line;return e.iter(t.line,r.line+1,function(e){var o=e.text;i==r.line&&(o=o.slice(0,r.ch)),i==t.line&&(o=o.slice(t.ch)),n.push(o),++i}),n}function _e(e,t,r){var n=[];return e.iter(t,r,function(e){n.push(e.text)}),n}function $e(e,t){var r=t-e.height;if(r)for(var n=e;n;n=n.parent)n.height+=r}function qe(e){if(null==e.parent)return null;for(var t=e.parent,r=B(t.lines,e),n=t.parent;n;t=n,n=n.parent)for(var i=0;n.children[i]!=t;++i)r+=n.children[i].chunkSize();return r+t.first}function Ze(e,t){var r=e.first;e:do{for(var n=0;n<e.children.length;++n){var i=e.children[n],o=i.height;if(t<o){e=i;continue e}t-=o,r+=i.chunkSize()}return r}while(!e.lines);for(var l=0;l<e.lines.length;++l){var s=e.lines[l].height;if(t<s)break;t-=s}return r+l}function Qe(e,t){return t>=e.first&&t<e.first+e.size}function Je(e,t){return String(e.lineNumberFormatter(t+e.firstLineNumber))}function et(e,t,r){if(void 0===r&&(r=null),!(this instanceof et))return new et(e,t,r);this.line=e,this.ch=t,this.sticky=r}function tt(e,t){return e.line-t.line||e.ch-t.ch}function rt(e,t){return e.sticky==t.sticky&&0==tt(e,t)}function nt(e){return et(e.line,e.ch)}function it(e,t){return tt(e,t)<0?t:e}function ot(e,t){return tt(e,t)<0?e:t}function lt(e,t){return Math.max(e.first,Math.min(t,e.first+e.size-1))}function st(e,t){if(t.line<e.first)return et(e.first,0);var r=e.first+e.size-1;return t.line>r?et(r,Xe(e,r).text.length):function(e,t){var r=e.ch;return null==r||r>t?et(e.line,t):r<0?et(e.line,0):e}(t,Xe(e,t.line).text.length)}function at(e,t){for(var r=[],n=0;n<t.length;n++)r[n]=st(e,t[n]);return r}je.prototype.eol=function(){return this.pos>=this.string.length},je.prototype.sol=function(){return this.pos==this.lineStart},je.prototype.peek=function(){return this.string.charAt(this.pos)||void 0},je.prototype.next=function(){if(this.pos<this.string.length)return this.string.charAt(this.pos++)},je.prototype.eat=function(e){var t=this.string.charAt(this.pos);if(\"string\"==typeof e?t==e:t&&(e.test?e.test(t):e(t)))return++this.pos,t},je.prototype.eatWhile=function(e){for(var t=this.pos;this.eat(e););return this.pos>t},je.prototype.eatSpace=function(){for(var e=this.pos;/[\\s\\u00a0]/.test(this.string.charAt(this.pos));)++this.pos;return this.pos>e},je.prototype.skipToEnd=function(){this.pos=this.string.length},je.prototype.skipTo=function(e){var t=this.string.indexOf(e,this.pos);if(t>-1)return this.pos=t,!0},je.prototype.backUp=function(e){this.pos-=e},je.prototype.column=function(){return this.lastColumnPos<this.start&&(this.lastColumnValue=z(this.string,this.start,this.tabSize,this.lastColumnPos,this.lastColumnValue),this.lastColumnPos=this.start),this.lastColumnValue-(this.lineStart?z(this.string,this.lineStart,this.tabSize):0)},je.prototype.indentation=function(){return z(this.string,null,this.tabSize)-(this.lineStart?z(this.string,this.lineStart,this.tabSize):0)},je.prototype.match=function(e,t,r){if(\"string\"!=typeof e){var n=this.string.slice(this.pos).match(e);return n&&n.index>0?null:(n&&!1!==t&&(this.pos+=n[0].length),n)}var i=function(e){return r?e.toLowerCase():e};if(i(this.string.substr(this.pos,e.length))==i(e))return!1!==t&&(this.pos+=e.length),!0},je.prototype.current=function(){return this.string.slice(this.start,this.pos)},je.prototype.hideFirstChars=function(e,t){this.lineStart+=e;try{return t()}finally{this.lineStart-=e}},je.prototype.lookAhead=function(e){var t=this.lineOracle;return t&&t.lookAhead(e)},je.prototype.baseToken=function(){var e=this.lineOracle;return e&&e.baseToken(this.pos)};var ut=function(e,t){this.state=e,this.lookAhead=t},ct=function(e,t,r,n){this.state=t,this.doc=e,this.line=r,this.maxLookAhead=n||0,this.baseTokens=null,this.baseTokenPos=1};function ht(e,t,r,n){var i=[e.state.modeGen],o={};wt(e,t.text,e.doc.mode,r,function(e,t){return i.push(e,t)},o,n);for(var l=r.state,s=function(n){r.baseTokens=i;var s=e.state.overlays[n],a=1,u=0;r.state=!0,wt(e,t.text,s.mode,r,function(e,t){for(var r=a;u<e;){var n=i[a];n>e&&i.splice(a,1,e,i[a+1],n),a+=2,u=Math.min(e,n)}if(t)if(s.opaque)i.splice(r,a-r,e,\"overlay \"+t),a=r+2;else for(;r<a;r+=2){var o=i[r+1];i[r+1]=(o?o+\" \":\"\")+\"overlay \"+t}},o),r.state=l,r.baseTokens=null,r.baseTokenPos=1},a=0;a<e.state.overlays.length;++a)s(a);return{styles:i,classes:o.bgClass||o.textClass?o:null}}function ft(e,t,r){if(!t.styles||t.styles[0]!=e.state.modeGen){var n=dt(e,qe(t)),i=t.text.length>e.options.maxHighlightLength&&Ue(e.doc.mode,n.state),o=ht(e,t,n);i&&(n.state=i),t.stateAfter=n.save(!i),t.styles=o.styles,o.classes?t.styleClasses=o.classes:t.styleClasses&&(t.styleClasses=null),r===e.doc.highlightFrontier&&(e.doc.modeFrontier=Math.max(e.doc.modeFrontier,++e.doc.highlightFrontier))}return t.styles}function dt(e,t,r){var n=e.doc,i=e.display;if(!n.mode.startState)return new ct(n,!0,t);var o=function(e,t,r){for(var n,i,o=e.doc,l=r?-1:t-(e.doc.mode.innerMode?1e3:100),s=t;s>l;--s){if(s<=o.first)return o.first;var a=Xe(o,s-1),u=a.stateAfter;if(u&&(!r||s+(u instanceof ut?u.lookAhead:0)<=o.modeFrontier))return s;var c=z(a.text,null,e.options.tabSize);(null==i||n>c)&&(i=s-1,n=c)}return i}(e,t,r),l=o>n.first&&Xe(n,o-1).stateAfter,s=l?ct.fromSaved(n,l,o):new ct(n,Ke(n.mode),o);return n.iter(o,t,function(r){pt(e,r.text,s);var n=s.line;r.stateAfter=n==t-1||n%5==0||n>=i.viewFrom&&n<i.viewTo?s.save():null,s.nextLine()}),r&&(n.modeFrontier=s.line),s}function pt(e,t,r,n){var i=e.doc.mode,o=new je(t,e.options.tabSize,r);for(o.start=o.pos=n||0,\"\"==t&&gt(i,r.state);!o.eol();)vt(i,o,r.state),o.start=o.pos}function gt(e,t){if(e.blankLine)return e.blankLine(t);if(e.innerMode){var r=Ve(e,t);return r.mode.blankLine?r.mode.blankLine(r.state):void 0}}function vt(e,t,r,n){for(var i=0;i<10;i++){n&&(n[0]=Ve(e,r).mode);var o=e.token(t,r);if(t.pos>t.start)return o}throw new Error(\"Mode \"+e.name+\" failed to advance stream.\")}ct.prototype.lookAhead=function(e){var t=this.doc.getLine(this.line+e);return null!=t&&e>this.maxLookAhead&&(this.maxLookAhead=e),t},ct.prototype.baseToken=function(e){if(!this.baseTokens)return null;for(;this.baseTokens[this.baseTokenPos]<=e;)this.baseTokenPos+=2;var t=this.baseTokens[this.baseTokenPos+1];return{type:t&&t.replace(/( |^)overlay .*/,\"\"),size:this.baseTokens[this.baseTokenPos]-e}},ct.prototype.nextLine=function(){this.line++,this.maxLookAhead>0&&this.maxLookAhead--},ct.fromSaved=function(e,t,r){return t instanceof ut?new ct(e,Ue(e.mode,t.state),r,t.lookAhead):new ct(e,Ue(e.mode,t),r)},ct.prototype.save=function(e){var t=!1!==e?Ue(this.doc.mode,this.state):this.state;return this.maxLookAhead>0?new ut(t,this.maxLookAhead):t};var mt=function(e,t,r){this.start=e.start,this.end=e.pos,this.string=e.current(),this.type=t||null,this.state=r};function yt(e,t,r,n){var i,o,l=e.doc,s=l.mode,a=Xe(l,(t=st(l,t)).line),u=dt(e,t.line,r),c=new je(a.text,e.options.tabSize,u);for(n&&(o=[]);(n||c.pos<t.ch)&&!c.eol();)c.start=c.pos,i=vt(s,c,u.state),n&&o.push(new mt(c,i,Ue(l.mode,u.state)));return n?o:new mt(c,i,u.state)}function bt(e,t){if(e)for(;;){var r=e.match(/(?:^|\\s+)line-(background-)?(\\S+)/);if(!r)break;e=e.slice(0,r.index)+e.slice(r.index+r[0].length);var n=r[1]?\"bgClass\":\"textClass\";null==t[n]?t[n]=r[2]:new RegExp(\"(?:^|s)\"+r[2]+\"(?:$|s)\").test(t[n])||(t[n]+=\" \"+r[2])}return e}function wt(e,t,r,n,i,o,l){var s=r.flattenSpans;null==s&&(s=e.options.flattenSpans);var a,u=0,c=null,h=new je(t,e.options.tabSize,n),f=e.options.addModeClass&&[null];for(\"\"==t&&bt(gt(r,n.state),o);!h.eol();){if(h.pos>e.options.maxHighlightLength?(s=!1,l&&pt(e,t,n,h.pos),h.pos=t.length,a=null):a=bt(vt(r,h,n.state,f),o),f){var d=f[0].name;d&&(a=\"m-\"+(a?d+\" \"+a:d))}if(!s||c!=a){for(;u<h.start;)i(u=Math.min(h.start,u+5e3),c);c=a}h.start=h.pos}for(;u<h.pos;){var p=Math.min(h.pos,u+5e3);i(p,c),u=p}}var xt=!1,Ct=!1;function St(e,t,r){this.marker=e,this.from=t,this.to=r}function Lt(e,t){if(e)for(var r=0;r<e.length;++r){var n=e[r];if(n.marker==t)return n}}function kt(e,t){for(var r,n=0;n<e.length;++n)e[n]!=t&&(r||(r=[])).push(e[n]);return r}function Tt(e,t){if(t.full)return null;var r=Qe(e,t.from.line)&&Xe(e,t.from.line).markedSpans,n=Qe(e,t.to.line)&&Xe(e,t.to.line).markedSpans;if(!r&&!n)return null;var i=t.from.ch,o=t.to.ch,l=0==tt(t.from,t.to),s=function(e,t,r){var n;if(e)for(var i=0;i<e.length;++i){var o=e[i],l=o.marker;if(null==o.from||(l.inclusiveLeft?o.from<=t:o.from<t)||o.from==t&&\"bookmark\"==l.type&&(!r||!o.marker.insertLeft)){var s=null==o.to||(l.inclusiveRight?o.to>=t:o.to>t);(n||(n=[])).push(new St(l,o.from,s?null:o.to))}}return n}(r,i,l),a=function(e,t,r){var n;if(e)for(var i=0;i<e.length;++i){var o=e[i],l=o.marker;if(null==o.to||(l.inclusiveRight?o.to>=t:o.to>t)||o.from==t&&\"bookmark\"==l.type&&(!r||o.marker.insertLeft)){var s=null==o.from||(l.inclusiveLeft?o.from<=t:o.from<t);(n||(n=[])).push(new St(l,s?null:o.from-t,null==o.to?null:o.to-t))}}return n}(n,o,l),u=1==t.text.length,c=$(t.text).length+(u?i:0);if(s)for(var h=0;h<s.length;++h){var f=s[h];if(null==f.to){var d=Lt(a,f.marker);d?u&&(f.to=null==d.to?null:d.to+c):f.to=i}}if(a)for(var p=0;p<a.length;++p){var g=a[p];if(null!=g.to&&(g.to+=c),null==g.from)Lt(s,g.marker)||(g.from=c,u&&(s||(s=[])).push(g));else g.from+=c,u&&(s||(s=[])).push(g)}s&&(s=Mt(s)),a&&a!=s&&(a=Mt(a));var v=[s];if(!u){var m,y=t.text.length-2;if(y>0&&s)for(var b=0;b<s.length;++b)null==s[b].to&&(m||(m=[])).push(new St(s[b].marker,null,null));for(var w=0;w<y;++w)v.push(m);v.push(a)}return v}function Mt(e){for(var t=0;t<e.length;++t){var r=e[t];null!=r.from&&r.from==r.to&&!1!==r.marker.clearWhenEmpty&&e.splice(t--,1)}return e.length?e:null}function Nt(e){var t=e.markedSpans;if(t){for(var r=0;r<t.length;++r)t[r].marker.detachLine(e);e.markedSpans=null}}function Ot(e,t){if(t){for(var r=0;r<t.length;++r)t[r].marker.attachLine(e);e.markedSpans=t}}function At(e){return e.inclusiveLeft?-1:0}function Dt(e){return e.inclusiveRight?1:0}function Wt(e,t){var r=e.lines.length-t.lines.length;if(0!=r)return r;var n=e.find(),i=t.find(),o=tt(n.from,i.from)||At(e)-At(t);if(o)return-o;var l=tt(n.to,i.to)||Dt(e)-Dt(t);return l||t.id-e.id}function Ht(e,t){var r,n=Ct&&e.markedSpans;if(n)for(var i=void 0,o=0;o<n.length;++o)(i=n[o]).marker.collapsed&&null==(t?i.from:i.to)&&(!r||Wt(r,i.marker)<0)&&(r=i.marker);return r}function Ft(e){return Ht(e,!0)}function Pt(e){return Ht(e,!1)}function Et(e,t){var r,n=Ct&&e.markedSpans;if(n)for(var i=0;i<n.length;++i){var o=n[i];o.marker.collapsed&&(null==o.from||o.from<t)&&(null==o.to||o.to>t)&&(!r||Wt(r,o.marker)<0)&&(r=o.marker)}return r}function It(e,t,r,n,i){var o=Xe(e,t),l=Ct&&o.markedSpans;if(l)for(var s=0;s<l.length;++s){var a=l[s];if(a.marker.collapsed){var u=a.marker.find(0),c=tt(u.from,r)||At(a.marker)-At(i),h=tt(u.to,n)||Dt(a.marker)-Dt(i);if(!(c>=0&&h<=0||c<=0&&h>=0)&&(c<=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?tt(u.to,r)>=0:tt(u.to,r)>0)||c>=0&&(a.marker.inclusiveRight&&i.inclusiveLeft?tt(u.from,n)<=0:tt(u.from,n)<0)))return!0}}}function zt(e){for(var t;t=Ft(e);)e=t.find(-1,!0).line;return e}function Rt(e,t){var r=Xe(e,t),n=zt(r);return r==n?t:qe(n)}function Bt(e,t){if(t>e.lastLine())return t;var r,n=Xe(e,t);if(!Gt(e,n))return t;for(;r=Pt(n);)n=r.find(1,!0).line;return qe(n)+1}function Gt(e,t){var r=Ct&&t.markedSpans;if(r)for(var n=void 0,i=0;i<r.length;++i)if((n=r[i]).marker.collapsed){if(null==n.from)return!0;if(!n.marker.widgetNode&&0==n.from&&n.marker.inclusiveLeft&&Ut(e,t,n))return!0}}function Ut(e,t,r){if(null==r.to){var n=r.marker.find(1,!0);return Ut(e,n.line,Lt(n.line.markedSpans,r.marker))}if(r.marker.inclusiveRight&&r.to==t.text.length)return!0;for(var i=void 0,o=0;o<t.markedSpans.length;++o)if((i=t.markedSpans[o]).marker.collapsed&&!i.marker.widgetNode&&i.from==r.to&&(null==i.to||i.to!=r.from)&&(i.marker.inclusiveLeft||r.marker.inclusiveRight)&&Ut(e,t,i))return!0}function Vt(e){for(var t=0,r=(e=zt(e)).parent,n=0;n<r.lines.length;++n){var i=r.lines[n];if(i==e)break;t+=i.height}for(var o=r.parent;o;o=(r=o).parent)for(var l=0;l<o.children.length;++l){var s=o.children[l];if(s==r)break;t+=s.height}return t}function Kt(e){if(0==e.height)return 0;for(var t,r=e.text.length,n=e;t=Ft(n);){var i=t.find(0,!0);n=i.from.line,r+=i.from.ch-i.to.ch}for(n=e;t=Pt(n);){var o=t.find(0,!0);r-=n.text.length-o.from.ch,r+=(n=o.to.line).text.length-o.to.ch}return r}function jt(e){var t=e.display,r=e.doc;t.maxLine=Xe(r,r.first),t.maxLineLength=Kt(t.maxLine),t.maxLineChanged=!0,r.iter(function(e){var r=Kt(e);r>t.maxLineLength&&(t.maxLineLength=r,t.maxLine=e)})}var Xt=function(e,t,r){this.text=e,Ot(this,t),this.height=r?r(this):1};function Yt(e){e.parent=null,Nt(e)}Xt.prototype.lineNo=function(){return qe(this)},be(Xt);var _t={},$t={};function qt(e,t){if(!e||/^\\s*$/.test(e))return null;var r=t.addModeClass?$t:_t;return r[e]||(r[e]=e.replace(/\\S+/g,\"cm-$&\"))}function Zt(e,t){var r=A(\"span\",null,null,a?\"padding-right: .1px\":null),n={pre:A(\"pre\",[r],\"CodeMirror-line\"),content:r,col:0,pos:0,cm:e,trailingSpace:!1,splitSpaces:e.getOption(\"lineWrapping\")};t.measure={};for(var i=0;i<=(t.rest?t.rest.length:0);i++){var o=i?t.rest[i-1]:t.line,l=void 0;n.pos=0,n.addToken=Jt,Ae(e.display.measure)&&(l=ce(o,e.doc.direction))&&(n.addToken=er(n.addToken,l)),n.map=[],rr(o,n,ft(e,o,t!=e.display.externalMeasured&&qe(o))),o.styleClasses&&(o.styleClasses.bgClass&&(n.bgClass=F(o.styleClasses.bgClass,n.bgClass||\"\")),o.styleClasses.textClass&&(n.textClass=F(o.styleClasses.textClass,n.textClass||\"\"))),0==n.map.length&&n.map.push(0,0,n.content.appendChild(Oe(e.display.measure))),0==i?(t.measure.map=n.map,t.measure.cache={}):((t.measure.maps||(t.measure.maps=[])).push(n.map),(t.measure.caches||(t.measure.caches=[])).push({}))}if(a){var s=n.content.lastChild;(/\\bcm-tab\\b/.test(s.className)||s.querySelector&&s.querySelector(\".cm-tab\"))&&(n.content.className=\"cm-tab-wrap-hack\")}return ge(e,\"renderLine\",e,t.line,n.pre),n.pre.className&&(n.textClass=F(n.pre.className,n.textClass||\"\")),n}function Qt(e){var t=O(\"span\",\"•\",\"cm-invalidchar\");return t.title=\"\\\\u\"+e.charCodeAt(0).toString(16),t.setAttribute(\"aria-label\",t.title),t}function Jt(e,t,r,n,i,o,a){if(t){var u,c=e.splitSpaces?function(e,t){if(e.length>1&&!/  /.test(e))return e;for(var r=t,n=\"\",i=0;i<e.length;i++){var o=e.charAt(i);\" \"!=o||!r||i!=e.length-1&&32!=e.charCodeAt(i+1)||(o=\" \"),n+=o,r=\" \"==o}return n}(t,e.trailingSpace):t,h=e.cm.state.specialChars,f=!1;if(h.test(t)){u=document.createDocumentFragment();for(var d=0;;){h.lastIndex=d;var p=h.exec(t),g=p?p.index-d:t.length-d;if(g){var v=document.createTextNode(c.slice(d,d+g));l&&s<9?u.appendChild(O(\"span\",[v])):u.appendChild(v),e.map.push(e.pos,e.pos+g,v),e.col+=g,e.pos+=g}if(!p)break;d+=g+1;var m=void 0;if(\"\\t\"==p[0]){var y=e.cm.options.tabSize,b=y-e.col%y;(m=u.appendChild(O(\"span\",_(b),\"cm-tab\"))).setAttribute(\"role\",\"presentation\"),m.setAttribute(\"cm-text\",\"\\t\"),e.col+=b}else\"\\r\"==p[0]||\"\\n\"==p[0]?((m=u.appendChild(O(\"span\",\"\\r\"==p[0]?\"␍\":\"␤\",\"cm-invalidchar\"))).setAttribute(\"cm-text\",p[0]),e.col+=1):((m=e.cm.options.specialCharPlaceholder(p[0])).setAttribute(\"cm-text\",p[0]),l&&s<9?u.appendChild(O(\"span\",[m])):u.appendChild(m),e.col+=1);e.map.push(e.pos,e.pos+1,m),e.pos++}}else e.col+=t.length,u=document.createTextNode(c),e.map.push(e.pos,e.pos+t.length,u),l&&s<9&&(f=!0),e.pos+=t.length;if(e.trailingSpace=32==c.charCodeAt(t.length-1),r||n||i||f||o){var w=r||\"\";n&&(w+=n),i&&(w+=i);var x=O(\"span\",[u],w,o);if(a)for(var C in a)a.hasOwnProperty(C)&&\"style\"!=C&&\"class\"!=C&&x.setAttribute(C,a[C]);return e.content.appendChild(x)}e.content.appendChild(u)}}function er(e,t){return function(r,n,i,o,l,s,a){i=i?i+\" cm-force-border\":\"cm-force-border\";for(var u=r.pos,c=u+n.length;;){for(var h=void 0,f=0;f<t.length&&!((h=t[f]).to>u&&h.from<=u);f++);if(h.to>=c)return e(r,n,i,o,l,s,a);e(r,n.slice(0,h.to-u),i,o,null,s,a),o=null,n=n.slice(h.to-u),u=h.to}}}function tr(e,t,r,n){var i=!n&&r.widgetNode;i&&e.map.push(e.pos,e.pos+t,i),!n&&e.cm.display.input.needsContentAttribute&&(i||(i=e.content.appendChild(document.createElement(\"span\"))),i.setAttribute(\"cm-marker\",r.id)),i&&(e.cm.display.input.setUneditable(i),e.content.appendChild(i)),e.pos+=t,e.trailingSpace=!1}function rr(e,t,r){var n=e.markedSpans,i=e.text,o=0;if(n)for(var l,s,a,u,c,h,f,d=i.length,p=0,g=1,v=\"\",m=0;;){if(m==p){a=u=c=s=\"\",f=null,h=null,m=1/0;for(var y=[],b=void 0,w=0;w<n.length;++w){var x=n[w],C=x.marker;if(\"bookmark\"==C.type&&x.from==p&&C.widgetNode)y.push(C);else if(x.from<=p&&(null==x.to||x.to>p||C.collapsed&&x.to==p&&x.from==p)){if(null!=x.to&&x.to!=p&&m>x.to&&(m=x.to,u=\"\"),C.className&&(a+=\" \"+C.className),C.css&&(s=(s?s+\";\":\"\")+C.css),C.startStyle&&x.from==p&&(c+=\" \"+C.startStyle),C.endStyle&&x.to==m&&(b||(b=[])).push(C.endStyle,x.to),C.title&&((f||(f={})).title=C.title),C.attributes)for(var S in C.attributes)(f||(f={}))[S]=C.attributes[S];C.collapsed&&(!h||Wt(h.marker,C)<0)&&(h=x)}else x.from>p&&m>x.from&&(m=x.from)}if(b)for(var L=0;L<b.length;L+=2)b[L+1]==m&&(u+=\" \"+b[L]);if(!h||h.from==p)for(var k=0;k<y.length;++k)tr(t,0,y[k]);if(h&&(h.from||0)==p){if(tr(t,(null==h.to?d+1:h.to)-p,h.marker,null==h.from),null==h.to)return;h.to==p&&(h=!1)}}if(p>=d)break;for(var T=Math.min(d,m);;){if(v){var M=p+v.length;if(!h){var N=M>T?v.slice(0,T-p):v;t.addToken(t,N,l?l+a:a,c,p+N.length==m?u:\"\",s,f)}if(M>=T){v=v.slice(T-p),p=T;break}p=M,c=\"\"}v=i.slice(o,o=r[g++]),l=qt(r[g++],t.cm.options)}}else for(var O=1;O<r.length;O+=2)t.addToken(t,i.slice(o,o=r[O]),qt(r[O+1],t.cm.options))}function nr(e,t,r){this.line=t,this.rest=function(e){for(var t,r;t=Pt(e);)e=t.find(1,!0).line,(r||(r=[])).push(e);return r}(t),this.size=this.rest?qe($(this.rest))-r+1:1,this.node=this.text=null,this.hidden=Gt(e,t)}function ir(e,t,r){for(var n,i=[],o=t;o<r;o=n){var l=new nr(e.doc,Xe(e.doc,o),o);n=o+l.size,i.push(l)}return i}var or=null;var lr=null;function sr(e,t){var r=de(e,t);if(r.length){var n,i=Array.prototype.slice.call(arguments,2);or?n=or.delayedCallbacks:lr?n=lr:(n=lr=[],setTimeout(ar,0));for(var o=function(e){n.push(function(){return r[e].apply(null,i)})},l=0;l<r.length;++l)o(l)}}function ar(){var e=lr;lr=null;for(var t=0;t<e.length;++t)e[t]()}function ur(e,t,r,n){for(var i=0;i<t.changes.length;i++){var o=t.changes[i];\"text\"==o?fr(e,t):\"gutter\"==o?pr(e,t,r,n):\"class\"==o?dr(e,t):\"widget\"==o&&gr(e,t,n)}t.changes=null}function cr(e){return e.node==e.text&&(e.node=O(\"div\",null,null,\"position: relative\"),e.text.parentNode&&e.text.parentNode.replaceChild(e.node,e.text),e.node.appendChild(e.text),l&&s<8&&(e.node.style.zIndex=2)),e.node}function hr(e,t){var r=e.display.externalMeasured;return r&&r.line==t.line?(e.display.externalMeasured=null,t.measure=r.measure,r.built):Zt(e,t)}function fr(e,t){var r=t.text.className,n=hr(e,t);t.text==t.node&&(t.node=n.pre),t.text.parentNode.replaceChild(n.pre,t.text),t.text=n.pre,n.bgClass!=t.bgClass||n.textClass!=t.textClass?(t.bgClass=n.bgClass,t.textClass=n.textClass,dr(e,t)):r&&(t.text.className=r)}function dr(e,t){!function(e,t){var r=t.bgClass?t.bgClass+\" \"+(t.line.bgClass||\"\"):t.line.bgClass;if(r&&(r+=\" CodeMirror-linebackground\"),t.background)r?t.background.className=r:(t.background.parentNode.removeChild(t.background),t.background=null);else if(r){var n=cr(t);t.background=n.insertBefore(O(\"div\",null,r),n.firstChild),e.display.input.setUneditable(t.background)}}(e,t),t.line.wrapClass?cr(t).className=t.line.wrapClass:t.node!=t.text&&(t.node.className=\"\");var r=t.textClass?t.textClass+\" \"+(t.line.textClass||\"\"):t.line.textClass;t.text.className=r||\"\"}function pr(e,t,r,n){if(t.gutter&&(t.node.removeChild(t.gutter),t.gutter=null),t.gutterBackground&&(t.node.removeChild(t.gutterBackground),t.gutterBackground=null),t.line.gutterClass){var i=cr(t);t.gutterBackground=O(\"div\",null,\"CodeMirror-gutter-background \"+t.line.gutterClass,\"left: \"+(e.options.fixedGutter?n.fixedPos:-n.gutterTotalWidth)+\"px; width: \"+n.gutterTotalWidth+\"px\"),e.display.input.setUneditable(t.gutterBackground),i.insertBefore(t.gutterBackground,t.text)}var o=t.line.gutterMarkers;if(e.options.lineNumbers||o){var l=cr(t),s=t.gutter=O(\"div\",null,\"CodeMirror-gutter-wrapper\",\"left: \"+(e.options.fixedGutter?n.fixedPos:-n.gutterTotalWidth)+\"px\");if(e.display.input.setUneditable(s),l.insertBefore(s,t.text),t.line.gutterClass&&(s.className+=\" \"+t.line.gutterClass),!e.options.lineNumbers||o&&o[\"CodeMirror-linenumbers\"]||(t.lineNumber=s.appendChild(O(\"div\",Je(e.options,r),\"CodeMirror-linenumber CodeMirror-gutter-elt\",\"left: \"+n.gutterLeft[\"CodeMirror-linenumbers\"]+\"px; width: \"+e.display.lineNumInnerWidth+\"px\"))),o)for(var a=0;a<e.display.gutterSpecs.length;++a){var u=e.display.gutterSpecs[a].className,c=o.hasOwnProperty(u)&&o[u];c&&s.appendChild(O(\"div\",[c],\"CodeMirror-gutter-elt\",\"left: \"+n.gutterLeft[u]+\"px; width: \"+n.gutterWidth[u]+\"px\"))}}}function gr(e,t,r){t.alignable&&(t.alignable=null);for(var n=t.node.firstChild,i=void 0;n;n=i)i=n.nextSibling,\"CodeMirror-linewidget\"==n.className&&t.node.removeChild(n);mr(e,t,r)}function vr(e,t,r,n){var i=hr(e,t);return t.text=t.node=i.pre,i.bgClass&&(t.bgClass=i.bgClass),i.textClass&&(t.textClass=i.textClass),dr(e,t),pr(e,t,r,n),mr(e,t,n),t.node}function mr(e,t,r){if(yr(e,t.line,t,r,!0),t.rest)for(var n=0;n<t.rest.length;n++)yr(e,t.rest[n],t,r,!1)}function yr(e,t,r,n,i){if(t.widgets)for(var o=cr(r),l=0,s=t.widgets;l<s.length;++l){var a=s[l],u=O(\"div\",[a.node],\"CodeMirror-linewidget\");a.handleMouseEvents||u.setAttribute(\"cm-ignore-events\",\"true\"),br(a,u,r,n),e.display.input.setUneditable(u),i&&a.above?o.insertBefore(u,r.gutter||r.text):o.appendChild(u),sr(a,\"redraw\")}}function br(e,t,r,n){if(e.noHScroll){(r.alignable||(r.alignable=[])).push(t);var i=n.wrapperWidth;t.style.left=n.fixedPos+\"px\",e.coverGutter||(i-=n.gutterTotalWidth,t.style.paddingLeft=n.gutterTotalWidth+\"px\"),t.style.width=i+\"px\"}e.coverGutter&&(t.style.zIndex=5,t.style.position=\"relative\",e.noHScroll||(t.style.marginLeft=-n.gutterTotalWidth+\"px\"))}function wr(e){if(null!=e.height)return e.height;var t=e.doc.cm;if(!t)return 0;if(!D(document.body,e.node)){var r=\"position: relative;\";e.coverGutter&&(r+=\"margin-left: -\"+t.display.gutters.offsetWidth+\"px;\"),e.noHScroll&&(r+=\"width: \"+t.display.wrapper.clientWidth+\"px;\"),N(t.display.measure,O(\"div\",[e.node],null,r))}return e.height=e.node.parentNode.offsetHeight}function xr(e,t){for(var r=Le(t);r!=e.wrapper;r=r.parentNode)if(!r||1==r.nodeType&&\"true\"==r.getAttribute(\"cm-ignore-events\")||r.parentNode==e.sizer&&r!=e.mover)return!0}function Cr(e){return e.lineSpace.offsetTop}function Sr(e){return e.mover.offsetHeight-e.lineSpace.offsetHeight}function Lr(e){if(e.cachedPaddingH)return e.cachedPaddingH;var t=N(e.measure,O(\"pre\",\"x\",\"CodeMirror-line-like\")),r=window.getComputedStyle?window.getComputedStyle(t):t.currentStyle,n={left:parseInt(r.paddingLeft),right:parseInt(r.paddingRight)};return isNaN(n.left)||isNaN(n.right)||(e.cachedPaddingH=n),n}function kr(e){return G-e.display.nativeBarWidth}function Tr(e){return e.display.scroller.clientWidth-kr(e)-e.display.barWidth}function Mr(e){return e.display.scroller.clientHeight-kr(e)-e.display.barHeight}function Nr(e,t,r){if(e.line==t)return{map:e.measure.map,cache:e.measure.cache};for(var n=0;n<e.rest.length;n++)if(e.rest[n]==t)return{map:e.measure.maps[n],cache:e.measure.caches[n]};for(var i=0;i<e.rest.length;i++)if(qe(e.rest[i])>r)return{map:e.measure.maps[i],cache:e.measure.caches[i],before:!0}}function Or(e,t,r,n){return Wr(e,Dr(e,t),r,n)}function Ar(e,t){if(t>=e.display.viewFrom&&t<e.display.viewTo)return e.display.view[an(e,t)];var r=e.display.externalMeasured;return r&&t>=r.lineN&&t<r.lineN+r.size?r:void 0}function Dr(e,t){var r=qe(t),n=Ar(e,r);n&&!n.text?n=null:n&&n.changes&&(ur(e,n,r,rn(e)),e.curOp.forceUpdate=!0),n||(n=function(e,t){var r=qe(t=zt(t)),n=e.display.externalMeasured=new nr(e.doc,t,r);n.lineN=r;var i=n.built=Zt(e,n);return n.text=i.pre,N(e.display.lineMeasure,i.pre),n}(e,t));var i=Nr(n,t,r);return{line:t,view:n,rect:null,map:i.map,cache:i.cache,before:i.before,hasHeights:!1}}function Wr(e,t,r,n,i){t.before&&(r=-1);var o,a=r+(n||\"\");return t.cache.hasOwnProperty(a)?o=t.cache[a]:(t.rect||(t.rect=t.view.text.getBoundingClientRect()),t.hasHeights||(!function(e,t,r){var n=e.options.lineWrapping,i=n&&Tr(e);if(!t.measure.heights||n&&t.measure.width!=i){var o=t.measure.heights=[];if(n){t.measure.width=i;for(var l=t.text.firstChild.getClientRects(),s=0;s<l.length-1;s++){var a=l[s],u=l[s+1];Math.abs(a.bottom-u.bottom)>2&&o.push((a.bottom+u.top)/2-r.top)}}o.push(r.bottom-r.top)}}(e,t.view,t.rect),t.hasHeights=!0),(o=function(e,t,r,n){var i,o=Pr(t.map,r,n),a=o.node,u=o.start,c=o.end,h=o.collapse;if(3==a.nodeType){for(var f=0;f<4;f++){for(;u&&ie(t.line.text.charAt(o.coverStart+u));)--u;for(;o.coverStart+c<o.coverEnd&&ie(t.line.text.charAt(o.coverStart+c));)++c;if((i=l&&s<9&&0==u&&c==o.coverEnd-o.coverStart?a.parentNode.getBoundingClientRect():Er(k(a,u,c).getClientRects(),n)).left||i.right||0==u)break;c=u,u-=1,h=\"right\"}l&&s<11&&(i=function(e,t){if(!window.screen||null==screen.logicalXDPI||screen.logicalXDPI==screen.deviceXDPI||!function(e){if(null!=Pe)return Pe;var t=N(e,O(\"span\",\"x\")),r=t.getBoundingClientRect(),n=k(t,0,1).getBoundingClientRect();return Pe=Math.abs(r.left-n.left)>1}(e))return t;var r=screen.logicalXDPI/screen.deviceXDPI,n=screen.logicalYDPI/screen.deviceYDPI;return{left:t.left*r,right:t.right*r,top:t.top*n,bottom:t.bottom*n}}(e.display.measure,i))}else{var d;u>0&&(h=n=\"right\"),i=e.options.lineWrapping&&(d=a.getClientRects()).length>1?d[\"right\"==n?d.length-1:0]:a.getBoundingClientRect()}if(l&&s<9&&!u&&(!i||!i.left&&!i.right)){var p=a.parentNode.getClientRects()[0];i=p?{left:p.left,right:p.left+tn(e.display),top:p.top,bottom:p.bottom}:Fr}for(var g=i.top-t.rect.top,v=i.bottom-t.rect.top,m=(g+v)/2,y=t.view.measure.heights,b=0;b<y.length-1&&!(m<y[b]);b++);var w=b?y[b-1]:0,x=y[b],C={left:(\"right\"==h?i.right:i.left)-t.rect.left,right:(\"left\"==h?i.left:i.right)-t.rect.left,top:w,bottom:x};i.left||i.right||(C.bogus=!0);e.options.singleCursorHeightPerLine||(C.rtop=g,C.rbottom=v);return C}(e,t,r,n)).bogus||(t.cache[a]=o)),{left:o.left,right:o.right,top:i?o.rtop:o.top,bottom:i?o.rbottom:o.bottom}}var Hr,Fr={left:0,right:0,top:0,bottom:0};function Pr(e,t,r){for(var n,i,o,l,s,a,u=0;u<e.length;u+=3)if(s=e[u],a=e[u+1],t<s?(i=0,o=1,l=\"left\"):t<a?o=(i=t-s)+1:(u==e.length-3||t==a&&e[u+3]>t)&&(i=(o=a-s)-1,t>=a&&(l=\"right\")),null!=i){if(n=e[u+2],s==a&&r==(n.insertLeft?\"left\":\"right\")&&(l=r),\"left\"==r&&0==i)for(;u&&e[u-2]==e[u-3]&&e[u-1].insertLeft;)n=e[2+(u-=3)],l=\"left\";if(\"right\"==r&&i==a-s)for(;u<e.length-3&&e[u+3]==e[u+4]&&!e[u+5].insertLeft;)n=e[(u+=3)+2],l=\"right\";break}return{node:n,start:i,end:o,collapse:l,coverStart:s,coverEnd:a}}function Er(e,t){var r=Fr;if(\"left\"==t)for(var n=0;n<e.length&&(r=e[n]).left==r.right;n++);else for(var i=e.length-1;i>=0&&(r=e[i]).left==r.right;i--);return r}function Ir(e){if(e.measure&&(e.measure.cache={},e.measure.heights=null,e.rest))for(var t=0;t<e.rest.length;t++)e.measure.caches[t]={}}function zr(e){e.display.externalMeasure=null,M(e.display.lineMeasure);for(var t=0;t<e.display.view.length;t++)Ir(e.display.view[t])}function Rr(e){zr(e),e.display.cachedCharWidth=e.display.cachedTextHeight=e.display.cachedPaddingH=null,e.options.lineWrapping||(e.display.maxLineChanged=!0),e.display.lineNumChars=null}function Br(){return c&&v?-(document.body.getBoundingClientRect().left-parseInt(getComputedStyle(document.body).marginLeft)):window.pageXOffset||(document.documentElement||document.body).scrollLeft}function Gr(){return c&&v?-(document.body.getBoundingClientRect().top-parseInt(getComputedStyle(document.body).marginTop)):window.pageYOffset||(document.documentElement||document.body).scrollTop}function Ur(e){var t=0;if(e.widgets)for(var r=0;r<e.widgets.length;++r)e.widgets[r].above&&(t+=wr(e.widgets[r]));return t}function Vr(e,t,r,n,i){if(!i){var o=Ur(t);r.top+=o,r.bottom+=o}if(\"line\"==n)return r;n||(n=\"local\");var l=Vt(t);if(\"local\"==n?l+=Cr(e.display):l-=e.display.viewOffset,\"page\"==n||\"window\"==n){var s=e.display.lineSpace.getBoundingClientRect();l+=s.top+(\"window\"==n?0:Gr());var a=s.left+(\"window\"==n?0:Br());r.left+=a,r.right+=a}return r.top+=l,r.bottom+=l,r}function Kr(e,t,r){if(\"div\"==r)return t;var n=t.left,i=t.top;if(\"page\"==r)n-=Br(),i-=Gr();else if(\"local\"==r||!r){var o=e.display.sizer.getBoundingClientRect();n+=o.left,i+=o.top}var l=e.display.lineSpace.getBoundingClientRect();return{left:n-l.left,top:i-l.top}}function jr(e,t,r,n,i){return n||(n=Xe(e.doc,t.line)),Vr(e,n,Or(e,n,t.ch,i),r)}function Xr(e,t,r,n,i,o){function l(t,l){var s=Wr(e,i,t,l?\"right\":\"left\",o);return l?s.left=s.right:s.right=s.left,Vr(e,n,s,r)}n=n||Xe(e.doc,t.line),i||(i=Dr(e,n));var s=ce(n,e.doc.direction),a=t.ch,u=t.sticky;if(a>=n.text.length?(a=n.text.length,u=\"before\"):a<=0&&(a=0,u=\"after\"),!s)return l(\"before\"==u?a-1:a,\"before\"==u);function c(e,t,r){return l(r?e-1:e,1==s[t].level!=r)}var h=ae(s,a,u),f=se,d=c(a,h,\"before\"==u);return null!=f&&(d.other=c(a,f,\"before\"!=u)),d}function Yr(e,t){var r=0;t=st(e.doc,t),e.options.lineWrapping||(r=tn(e.display)*t.ch);var n=Xe(e.doc,t.line),i=Vt(n)+Cr(e.display);return{left:r,right:r,top:i,bottom:i+n.height}}function _r(e,t,r,n,i){var o=et(e,t,r);return o.xRel=i,n&&(o.outside=n),o}function $r(e,t,r){var n=e.doc;if((r+=e.display.viewOffset)<0)return _r(n.first,0,null,-1,-1);var i=Ze(n,r),o=n.first+n.size-1;if(i>o)return _r(n.first+n.size-1,Xe(n,o).text.length,null,1,1);t<0&&(t=0);for(var l=Xe(n,i);;){var s=Jr(e,l,i,t,r),a=Et(l,s.ch+(s.xRel>0||s.outside>0?1:0));if(!a)return s;var u=a.find(1);if(u.line==i)return u;l=Xe(n,i=u.line)}}function qr(e,t,r,n){n-=Ur(t);var i=t.text.length,o=le(function(t){return Wr(e,r,t-1).bottom<=n},i,0);return{begin:o,end:i=le(function(t){return Wr(e,r,t).top>n},o,i)}}function Zr(e,t,r,n){return r||(r=Dr(e,t)),qr(e,t,r,Vr(e,t,Wr(e,r,n),\"line\").top)}function Qr(e,t,r,n){return!(e.bottom<=r)&&(e.top>r||(n?e.left:e.right)>t)}function Jr(e,t,r,n,i){i-=Vt(t);var o=Dr(e,t),l=Ur(t),s=0,a=t.text.length,u=!0,c=ce(t,e.doc.direction);if(c){var h=(e.options.lineWrapping?function(e,t,r,n,i,o,l){var s=qr(e,t,n,l),a=s.begin,u=s.end;/\\s/.test(t.text.charAt(u-1))&&u--;for(var c=null,h=null,f=0;f<i.length;f++){var d=i[f];if(!(d.from>=u||d.to<=a)){var p=1!=d.level,g=Wr(e,n,p?Math.min(u,d.to)-1:Math.max(a,d.from)).right,v=g<o?o-g+1e9:g-o;(!c||h>v)&&(c=d,h=v)}}c||(c=i[i.length-1]);c.from<a&&(c={from:a,to:c.to,level:c.level});c.to>u&&(c={from:c.from,to:u,level:c.level});return c}:function(e,t,r,n,i,o,l){var s=le(function(s){var a=i[s],u=1!=a.level;return Qr(Xr(e,et(r,u?a.to:a.from,u?\"before\":\"after\"),\"line\",t,n),o,l,!0)},0,i.length-1),a=i[s];if(s>0){var u=1!=a.level,c=Xr(e,et(r,u?a.from:a.to,u?\"after\":\"before\"),\"line\",t,n);Qr(c,o,l,!0)&&c.top>l&&(a=i[s-1])}return a})(e,t,r,o,c,n,i);s=(u=1!=h.level)?h.from:h.to-1,a=u?h.to:h.from-1}var f,d,p=null,g=null,v=le(function(t){var r=Wr(e,o,t);return r.top+=l,r.bottom+=l,!!Qr(r,n,i,!1)&&(r.top<=i&&r.left<=n&&(p=t,g=r),!0)},s,a),m=!1;if(g){var y=n-g.left<g.right-n,b=y==u;v=p+(b?0:1),d=b?\"after\":\"before\",f=y?g.left:g.right}else{u||v!=a&&v!=s||v++,d=0==v?\"after\":v==t.text.length?\"before\":Wr(e,o,v-(u?1:0)).bottom+l<=i==u?\"after\":\"before\";var w=Xr(e,et(r,v,d),\"line\",t,o);f=w.left,m=i<w.top?-1:i>=w.bottom?1:0}return _r(r,v=oe(t.text,v,1),d,m,n-f)}function en(e){if(null!=e.cachedTextHeight)return e.cachedTextHeight;if(null==Hr){Hr=O(\"pre\",null,\"CodeMirror-line-like\");for(var t=0;t<49;++t)Hr.appendChild(document.createTextNode(\"x\")),Hr.appendChild(O(\"br\"));Hr.appendChild(document.createTextNode(\"x\"))}N(e.measure,Hr);var r=Hr.offsetHeight/50;return r>3&&(e.cachedTextHeight=r),M(e.measure),r||1}function tn(e){if(null!=e.cachedCharWidth)return e.cachedCharWidth;var t=O(\"span\",\"xxxxxxxxxx\"),r=O(\"pre\",[t],\"CodeMirror-line-like\");N(e.measure,r);var n=t.getBoundingClientRect(),i=(n.right-n.left)/10;return i>2&&(e.cachedCharWidth=i),i||10}function rn(e){for(var t=e.display,r={},n={},i=t.gutters.clientLeft,o=t.gutters.firstChild,l=0;o;o=o.nextSibling,++l){var s=e.display.gutterSpecs[l].className;r[s]=o.offsetLeft+o.clientLeft+i,n[s]=o.clientWidth}return{fixedPos:nn(t),gutterTotalWidth:t.gutters.offsetWidth,gutterLeft:r,gutterWidth:n,wrapperWidth:t.wrapper.clientWidth}}function nn(e){return e.scroller.getBoundingClientRect().left-e.sizer.getBoundingClientRect().left}function on(e){var t=en(e.display),r=e.options.lineWrapping,n=r&&Math.max(5,e.display.scroller.clientWidth/tn(e.display)-3);return function(i){if(Gt(e.doc,i))return 0;var o=0;if(i.widgets)for(var l=0;l<i.widgets.length;l++)i.widgets[l].height&&(o+=i.widgets[l].height);return r?o+(Math.ceil(i.text.length/n)||1)*t:o+t}}function ln(e){var t=e.doc,r=on(e);t.iter(function(e){var t=r(e);t!=e.height&&$e(e,t)})}function sn(e,t,r,n){var i=e.display;if(!r&&\"true\"==Le(t).getAttribute(\"cm-not-content\"))return null;var o,l,s=i.lineSpace.getBoundingClientRect();try{o=t.clientX-s.left,l=t.clientY-s.top}catch(t){return null}var a,u=$r(e,o,l);if(n&&1==u.xRel&&(a=Xe(e.doc,u.line).text).length==u.ch){var c=z(a,a.length,e.options.tabSize)-a.length;u=et(u.line,Math.max(0,Math.round((o-Lr(e.display).left)/tn(e.display))-c))}return u}function an(e,t){if(t>=e.display.viewTo)return null;if((t-=e.display.viewFrom)<0)return null;for(var r=e.display.view,n=0;n<r.length;n++)if((t-=r[n].size)<0)return n}function un(e,t,r,n){null==t&&(t=e.doc.first),null==r&&(r=e.doc.first+e.doc.size),n||(n=0);var i=e.display;if(n&&r<i.viewTo&&(null==i.updateLineNumbers||i.updateLineNumbers>t)&&(i.updateLineNumbers=t),e.curOp.viewChanged=!0,t>=i.viewTo)Ct&&Rt(e.doc,t)<i.viewTo&&hn(e);else if(r<=i.viewFrom)Ct&&Bt(e.doc,r+n)>i.viewFrom?hn(e):(i.viewFrom+=n,i.viewTo+=n);else if(t<=i.viewFrom&&r>=i.viewTo)hn(e);else if(t<=i.viewFrom){var o=fn(e,r,r+n,1);o?(i.view=i.view.slice(o.index),i.viewFrom=o.lineN,i.viewTo+=n):hn(e)}else if(r>=i.viewTo){var l=fn(e,t,t,-1);l?(i.view=i.view.slice(0,l.index),i.viewTo=l.lineN):hn(e)}else{var s=fn(e,t,t,-1),a=fn(e,r,r+n,1);s&&a?(i.view=i.view.slice(0,s.index).concat(ir(e,s.lineN,a.lineN)).concat(i.view.slice(a.index)),i.viewTo+=n):hn(e)}var u=i.externalMeasured;u&&(r<u.lineN?u.lineN+=n:t<u.lineN+u.size&&(i.externalMeasured=null))}function cn(e,t,r){e.curOp.viewChanged=!0;var n=e.display,i=e.display.externalMeasured;if(i&&t>=i.lineN&&t<i.lineN+i.size&&(n.externalMeasured=null),!(t<n.viewFrom||t>=n.viewTo)){var o=n.view[an(e,t)];if(null!=o.node){var l=o.changes||(o.changes=[]);-1==B(l,r)&&l.push(r)}}}function hn(e){e.display.viewFrom=e.display.viewTo=e.doc.first,e.display.view=[],e.display.viewOffset=0}function fn(e,t,r,n){var i,o=an(e,t),l=e.display.view;if(!Ct||r==e.doc.first+e.doc.size)return{index:o,lineN:r};for(var s=e.display.viewFrom,a=0;a<o;a++)s+=l[a].size;if(s!=t){if(n>0){if(o==l.length-1)return null;i=s+l[o].size-t,o++}else i=s-t;t+=i,r+=i}for(;Rt(e.doc,r)!=r;){if(o==(n<0?0:l.length-1))return null;r+=n*l[o-(n<0?1:0)].size,o+=n}return{index:o,lineN:r}}function dn(e){for(var t=e.display.view,r=0,n=0;n<t.length;n++){var i=t[n];i.hidden||i.node&&!i.changes||++r}return r}function pn(e){e.display.input.showSelection(e.display.input.prepareSelection())}function gn(e,t){void 0===t&&(t=!0);for(var r=e.doc,n={},i=n.cursors=document.createDocumentFragment(),o=n.selection=document.createDocumentFragment(),l=0;l<r.sel.ranges.length;l++)if(t||l!=r.sel.primIndex){var s=r.sel.ranges[l];if(!(s.from().line>=e.display.viewTo||s.to().line<e.display.viewFrom)){var a=s.empty();(a||e.options.showCursorWhenSelecting)&&vn(e,s.head,i),a||yn(e,s,o)}}return n}function vn(e,t,r){var n=Xr(e,t,\"div\",null,null,!e.options.singleCursorHeightPerLine),i=r.appendChild(O(\"div\",\" \",\"CodeMirror-cursor\"));if(i.style.left=n.left+\"px\",i.style.top=n.top+\"px\",i.style.height=Math.max(0,n.bottom-n.top)*e.options.cursorHeight+\"px\",n.other){var o=r.appendChild(O(\"div\",\" \",\"CodeMirror-cursor CodeMirror-secondarycursor\"));o.style.display=\"\",o.style.left=n.other.left+\"px\",o.style.top=n.other.top+\"px\",o.style.height=.85*(n.other.bottom-n.other.top)+\"px\"}}function mn(e,t){return e.top-t.top||e.left-t.left}function yn(e,t,r){var n=e.display,i=e.doc,o=document.createDocumentFragment(),l=Lr(e.display),s=l.left,a=Math.max(n.sizerWidth,Tr(e)-n.sizer.offsetLeft)-l.right,u=\"ltr\"==i.direction;function c(e,t,r,n){t<0&&(t=0),t=Math.round(t),n=Math.round(n),o.appendChild(O(\"div\",null,\"CodeMirror-selected\",\"position: absolute; left: \"+e+\"px;\\n                             top: \"+t+\"px; width: \"+(null==r?a-e:r)+\"px;\\n                             height: \"+(n-t)+\"px\"))}function h(t,r,n){var o,l,h=Xe(i,t),f=h.text.length;function d(r,n){return jr(e,et(t,r),\"div\",h,n)}function p(t,r,n){var i=Zr(e,h,null,t),o=\"ltr\"==r==(\"after\"==n)?\"left\":\"right\";return d(\"after\"==n?i.begin:i.end-(/\\s/.test(h.text.charAt(i.end-1))?2:1),o)[o]}var g=ce(h,i.direction);return function(e,t,r,n){if(!e)return n(t,r,\"ltr\",0);for(var i=!1,o=0;o<e.length;++o){var l=e[o];(l.from<r&&l.to>t||t==r&&l.to==t)&&(n(Math.max(l.from,t),Math.min(l.to,r),1==l.level?\"rtl\":\"ltr\",o),i=!0)}i||n(t,r,\"ltr\")}(g,r||0,null==n?f:n,function(e,t,i,h){var v=\"ltr\"==i,m=d(e,v?\"left\":\"right\"),y=d(t-1,v?\"right\":\"left\"),b=null==r&&0==e,w=null==n&&t==f,x=0==h,C=!g||h==g.length-1;if(y.top-m.top<=3){var S=(u?w:b)&&C,L=(u?b:w)&&x?s:(v?m:y).left,k=S?a:(v?y:m).right;c(L,m.top,k-L,m.bottom)}else{var T,M,N,O;v?(T=u&&b&&x?s:m.left,M=u?a:p(e,i,\"before\"),N=u?s:p(t,i,\"after\"),O=u&&w&&C?a:y.right):(T=u?p(e,i,\"before\"):s,M=!u&&b&&x?a:m.right,N=!u&&w&&C?s:y.left,O=u?p(t,i,\"after\"):a),c(T,m.top,M-T,m.bottom),m.bottom<y.top&&c(s,m.bottom,null,y.top),c(N,y.top,O-N,y.bottom)}(!o||mn(m,o)<0)&&(o=m),mn(y,o)<0&&(o=y),(!l||mn(m,l)<0)&&(l=m),mn(y,l)<0&&(l=y)}),{start:o,end:l}}var f=t.from(),d=t.to();if(f.line==d.line)h(f.line,f.ch,d.ch);else{var p=Xe(i,f.line),g=Xe(i,d.line),v=zt(p)==zt(g),m=h(f.line,f.ch,v?p.text.length+1:null).end,y=h(d.line,v?0:null,d.ch).start;v&&(m.top<y.top-2?(c(m.right,m.top,null,m.bottom),c(s,y.top,y.left,y.bottom)):c(m.right,m.top,y.left-m.right,m.bottom)),m.bottom<y.top&&c(s,m.bottom,null,y.top)}r.appendChild(o)}function bn(e){if(e.state.focused){var t=e.display;clearInterval(t.blinker);var r=!0;t.cursorDiv.style.visibility=\"\",e.options.cursorBlinkRate>0?t.blinker=setInterval(function(){return t.cursorDiv.style.visibility=(r=!r)?\"\":\"hidden\"},e.options.cursorBlinkRate):e.options.cursorBlinkRate<0&&(t.cursorDiv.style.visibility=\"hidden\")}}function wn(e){e.state.focused||(e.display.input.focus(),Cn(e))}function xn(e){e.state.delayingBlurEvent=!0,setTimeout(function(){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1,Sn(e))},100)}function Cn(e,t){e.state.delayingBlurEvent&&(e.state.delayingBlurEvent=!1),\"nocursor\"!=e.options.readOnly&&(e.state.focused||(ge(e,\"focus\",e,t),e.state.focused=!0,H(e.display.wrapper,\"CodeMirror-focused\"),e.curOp||e.display.selForContextMenu==e.doc.sel||(e.display.input.reset(),a&&setTimeout(function(){return e.display.input.reset(!0)},20)),e.display.input.receivedFocus()),bn(e))}function Sn(e,t){e.state.delayingBlurEvent||(e.state.focused&&(ge(e,\"blur\",e,t),e.state.focused=!1,T(e.display.wrapper,\"CodeMirror-focused\")),clearInterval(e.display.blinker),setTimeout(function(){e.state.focused||(e.display.shift=!1)},150))}function Ln(e){for(var t=e.display,r=t.lineDiv.offsetTop,n=0;n<t.view.length;n++){var i=t.view[n],o=e.options.lineWrapping,a=void 0,u=0;if(!i.hidden){if(l&&s<8){var c=i.node.offsetTop+i.node.offsetHeight;a=c-r,r=c}else{var h=i.node.getBoundingClientRect();a=h.bottom-h.top,!o&&i.text.firstChild&&(u=i.text.firstChild.getBoundingClientRect().right-h.left-1)}var f=i.line.height-a;if((f>.005||f<-.005)&&($e(i.line,a),kn(i.line),i.rest))for(var d=0;d<i.rest.length;d++)kn(i.rest[d]);if(u>e.display.sizerWidth){var p=Math.ceil(u/tn(e.display));p>e.display.maxLineLength&&(e.display.maxLineLength=p,e.display.maxLine=i.line,e.display.maxLineChanged=!0)}}}}function kn(e){if(e.widgets)for(var t=0;t<e.widgets.length;++t){var r=e.widgets[t],n=r.node.parentNode;n&&(r.height=n.offsetHeight)}}function Tn(e,t,r){var n=r&&null!=r.top?Math.max(0,r.top):e.scroller.scrollTop;n=Math.floor(n-Cr(e));var i=r&&null!=r.bottom?r.bottom:n+e.wrapper.clientHeight,o=Ze(t,n),l=Ze(t,i);if(r&&r.ensure){var s=r.ensure.from.line,a=r.ensure.to.line;s<o?(o=s,l=Ze(t,Vt(Xe(t,s))+e.wrapper.clientHeight)):Math.min(a,t.lastLine())>=l&&(o=Ze(t,Vt(Xe(t,a))-e.wrapper.clientHeight),l=a)}return{from:o,to:Math.max(l,o+1)}}function Mn(e,t){var r=e.display,n=en(e.display);t.top<0&&(t.top=0);var i=e.curOp&&null!=e.curOp.scrollTop?e.curOp.scrollTop:r.scroller.scrollTop,o=Mr(e),l={};t.bottom-t.top>o&&(t.bottom=t.top+o);var s=e.doc.height+Sr(r),a=t.top<n,u=t.bottom>s-n;if(t.top<i)l.scrollTop=a?0:t.top;else if(t.bottom>i+o){var c=Math.min(t.top,(u?s:t.bottom)-o);c!=i&&(l.scrollTop=c)}var h=e.curOp&&null!=e.curOp.scrollLeft?e.curOp.scrollLeft:r.scroller.scrollLeft,f=Tr(e)-(e.options.fixedGutter?r.gutters.offsetWidth:0),d=t.right-t.left>f;return d&&(t.right=t.left+f),t.left<10?l.scrollLeft=0:t.left<h?l.scrollLeft=Math.max(0,t.left-(d?0:10)):t.right>f+h-3&&(l.scrollLeft=t.right+(d?0:10)-f),l}function Nn(e,t){null!=t&&(Dn(e),e.curOp.scrollTop=(null==e.curOp.scrollTop?e.doc.scrollTop:e.curOp.scrollTop)+t)}function On(e){Dn(e);var t=e.getCursor();e.curOp.scrollToPos={from:t,to:t,margin:e.options.cursorScrollMargin}}function An(e,t,r){null==t&&null==r||Dn(e),null!=t&&(e.curOp.scrollLeft=t),null!=r&&(e.curOp.scrollTop=r)}function Dn(e){var t=e.curOp.scrollToPos;t&&(e.curOp.scrollToPos=null,Wn(e,Yr(e,t.from),Yr(e,t.to),t.margin))}function Wn(e,t,r,n){var i=Mn(e,{left:Math.min(t.left,r.left),top:Math.min(t.top,r.top)-n,right:Math.max(t.right,r.right),bottom:Math.max(t.bottom,r.bottom)+n});An(e,i.scrollLeft,i.scrollTop)}function Hn(e,t){Math.abs(e.doc.scrollTop-t)<2||(r||oi(e,{top:t}),Fn(e,t,!0),r&&oi(e),ei(e,100))}function Fn(e,t,r){t=Math.min(e.display.scroller.scrollHeight-e.display.scroller.clientHeight,t),(e.display.scroller.scrollTop!=t||r)&&(e.doc.scrollTop=t,e.display.scrollbars.setScrollTop(t),e.display.scroller.scrollTop!=t&&(e.display.scroller.scrollTop=t))}function Pn(e,t,r,n){t=Math.min(t,e.display.scroller.scrollWidth-e.display.scroller.clientWidth),(r?t==e.doc.scrollLeft:Math.abs(e.doc.scrollLeft-t)<2)&&!n||(e.doc.scrollLeft=t,ai(e),e.display.scroller.scrollLeft!=t&&(e.display.scroller.scrollLeft=t),e.display.scrollbars.setScrollLeft(t))}function En(e){var t=e.display,r=t.gutters.offsetWidth,n=Math.round(e.doc.height+Sr(e.display));return{clientHeight:t.scroller.clientHeight,viewHeight:t.wrapper.clientHeight,scrollWidth:t.scroller.scrollWidth,clientWidth:t.scroller.clientWidth,viewWidth:t.wrapper.clientWidth,barLeft:e.options.fixedGutter?r:0,docHeight:n,scrollHeight:n+kr(e)+t.barHeight,nativeBarWidth:t.nativeBarWidth,gutterWidth:r}}var In=function(e,t,r){this.cm=r;var n=this.vert=O(\"div\",[O(\"div\",null,null,\"min-width: 1px\")],\"CodeMirror-vscrollbar\"),i=this.horiz=O(\"div\",[O(\"div\",null,null,\"height: 100%; min-height: 1px\")],\"CodeMirror-hscrollbar\");n.tabIndex=i.tabIndex=-1,e(n),e(i),fe(n,\"scroll\",function(){n.clientHeight&&t(n.scrollTop,\"vertical\")}),fe(i,\"scroll\",function(){i.clientWidth&&t(i.scrollLeft,\"horizontal\")}),this.checkedZeroWidth=!1,l&&s<8&&(this.horiz.style.minHeight=this.vert.style.minWidth=\"18px\")};In.prototype.update=function(e){var t=e.scrollWidth>e.clientWidth+1,r=e.scrollHeight>e.clientHeight+1,n=e.nativeBarWidth;if(r){this.vert.style.display=\"block\",this.vert.style.bottom=t?n+\"px\":\"0\";var i=e.viewHeight-(t?n:0);this.vert.firstChild.style.height=Math.max(0,e.scrollHeight-e.clientHeight+i)+\"px\"}else this.vert.style.display=\"\",this.vert.firstChild.style.height=\"0\";if(t){this.horiz.style.display=\"block\",this.horiz.style.right=r?n+\"px\":\"0\",this.horiz.style.left=e.barLeft+\"px\";var o=e.viewWidth-e.barLeft-(r?n:0);this.horiz.firstChild.style.width=Math.max(0,e.scrollWidth-e.clientWidth+o)+\"px\"}else this.horiz.style.display=\"\",this.horiz.firstChild.style.width=\"0\";return!this.checkedZeroWidth&&e.clientHeight>0&&(0==n&&this.zeroWidthHack(),this.checkedZeroWidth=!0),{right:r?n:0,bottom:t?n:0}},In.prototype.setScrollLeft=function(e){this.horiz.scrollLeft!=e&&(this.horiz.scrollLeft=e),this.disableHoriz&&this.enableZeroWidthBar(this.horiz,this.disableHoriz,\"horiz\")},In.prototype.setScrollTop=function(e){this.vert.scrollTop!=e&&(this.vert.scrollTop=e),this.disableVert&&this.enableZeroWidthBar(this.vert,this.disableVert,\"vert\")},In.prototype.zeroWidthHack=function(){var e=y&&!d?\"12px\":\"18px\";this.horiz.style.height=this.vert.style.width=e,this.horiz.style.pointerEvents=this.vert.style.pointerEvents=\"none\",this.disableHoriz=new R,this.disableVert=new R},In.prototype.enableZeroWidthBar=function(e,t,r){e.style.pointerEvents=\"auto\",t.set(1e3,function n(){var i=e.getBoundingClientRect();(\"vert\"==r?document.elementFromPoint(i.right-1,(i.top+i.bottom)/2):document.elementFromPoint((i.right+i.left)/2,i.bottom-1))!=e?e.style.pointerEvents=\"none\":t.set(1e3,n)})},In.prototype.clear=function(){var e=this.horiz.parentNode;e.removeChild(this.horiz),e.removeChild(this.vert)};var zn=function(){};function Rn(e,t){t||(t=En(e));var r=e.display.barWidth,n=e.display.barHeight;Bn(e,t);for(var i=0;i<4&&r!=e.display.barWidth||n!=e.display.barHeight;i++)r!=e.display.barWidth&&e.options.lineWrapping&&Ln(e),Bn(e,En(e)),r=e.display.barWidth,n=e.display.barHeight}function Bn(e,t){var r=e.display,n=r.scrollbars.update(t);r.sizer.style.paddingRight=(r.barWidth=n.right)+\"px\",r.sizer.style.paddingBottom=(r.barHeight=n.bottom)+\"px\",r.heightForcer.style.borderBottom=n.bottom+\"px solid transparent\",n.right&&n.bottom?(r.scrollbarFiller.style.display=\"block\",r.scrollbarFiller.style.height=n.bottom+\"px\",r.scrollbarFiller.style.width=n.right+\"px\"):r.scrollbarFiller.style.display=\"\",n.bottom&&e.options.coverGutterNextToScrollbar&&e.options.fixedGutter?(r.gutterFiller.style.display=\"block\",r.gutterFiller.style.height=n.bottom+\"px\",r.gutterFiller.style.width=t.gutterWidth+\"px\"):r.gutterFiller.style.display=\"\"}zn.prototype.update=function(){return{bottom:0,right:0}},zn.prototype.setScrollLeft=function(){},zn.prototype.setScrollTop=function(){},zn.prototype.clear=function(){};var Gn={native:In,null:zn};function Un(e){e.display.scrollbars&&(e.display.scrollbars.clear(),e.display.scrollbars.addClass&&T(e.display.wrapper,e.display.scrollbars.addClass)),e.display.scrollbars=new Gn[e.options.scrollbarStyle](function(t){e.display.wrapper.insertBefore(t,e.display.scrollbarFiller),fe(t,\"mousedown\",function(){e.state.focused&&setTimeout(function(){return e.display.input.focus()},0)}),t.setAttribute(\"cm-not-content\",\"true\")},function(t,r){\"horizontal\"==r?Pn(e,t):Hn(e,t)},e),e.display.scrollbars.addClass&&H(e.display.wrapper,e.display.scrollbars.addClass)}var Vn=0;function Kn(e){var t;e.curOp={cm:e,viewChanged:!1,startHeight:e.doc.height,forceUpdate:!1,updateInput:0,typing:!1,changeObjs:null,cursorActivityHandlers:null,cursorActivityCalled:0,selectionChanged:!1,updateMaxLine:!1,scrollLeft:null,scrollTop:null,scrollToPos:null,focus:!1,id:++Vn},t=e.curOp,or?or.ops.push(t):t.ownsGroup=or={ops:[t],delayedCallbacks:[]}}function jn(e){var t=e.curOp;t&&function(e,t){var r=e.ownsGroup;if(r)try{!function(e){var t=e.delayedCallbacks,r=0;do{for(;r<t.length;r++)t[r].call(null);for(var n=0;n<e.ops.length;n++){var i=e.ops[n];if(i.cursorActivityHandlers)for(;i.cursorActivityCalled<i.cursorActivityHandlers.length;)i.cursorActivityHandlers[i.cursorActivityCalled++].call(null,i.cm)}}while(r<t.length)}(r)}finally{or=null,t(r)}}(t,function(e){for(var t=0;t<e.ops.length;t++)e.ops[t].cm.curOp=null;!function(e){for(var t=e.ops,r=0;r<t.length;r++)Xn(t[r]);for(var n=0;n<t.length;n++)(i=t[n]).updatedDisplay=i.mustUpdate&&ni(i.cm,i.update);var i;for(var o=0;o<t.length;o++)Yn(t[o]);for(var l=0;l<t.length;l++)_n(t[l]);for(var s=0;s<t.length;s++)$n(t[s])}(e)})}function Xn(e){var t=e.cm,r=t.display;!function(e){var t=e.display;!t.scrollbarsClipped&&t.scroller.offsetWidth&&(t.nativeBarWidth=t.scroller.offsetWidth-t.scroller.clientWidth,t.heightForcer.style.height=kr(e)+\"px\",t.sizer.style.marginBottom=-t.nativeBarWidth+\"px\",t.sizer.style.borderRightWidth=kr(e)+\"px\",t.scrollbarsClipped=!0)}(t),e.updateMaxLine&&jt(t),e.mustUpdate=e.viewChanged||e.forceUpdate||null!=e.scrollTop||e.scrollToPos&&(e.scrollToPos.from.line<r.viewFrom||e.scrollToPos.to.line>=r.viewTo)||r.maxLineChanged&&t.options.lineWrapping,e.update=e.mustUpdate&&new ri(t,e.mustUpdate&&{top:e.scrollTop,ensure:e.scrollToPos},e.forceUpdate)}function Yn(e){var t=e.cm,r=t.display;e.updatedDisplay&&Ln(t),e.barMeasure=En(t),r.maxLineChanged&&!t.options.lineWrapping&&(e.adjustWidthTo=Or(t,r.maxLine,r.maxLine.text.length).left+3,t.display.sizerWidth=e.adjustWidthTo,e.barMeasure.scrollWidth=Math.max(r.scroller.clientWidth,r.sizer.offsetLeft+e.adjustWidthTo+kr(t)+t.display.barWidth),e.maxScrollLeft=Math.max(0,r.sizer.offsetLeft+e.adjustWidthTo-Tr(t))),(e.updatedDisplay||e.selectionChanged)&&(e.preparedSelection=r.input.prepareSelection())}function _n(e){var t=e.cm;null!=e.adjustWidthTo&&(t.display.sizer.style.minWidth=e.adjustWidthTo+\"px\",e.maxScrollLeft<t.doc.scrollLeft&&Pn(t,Math.min(t.display.scroller.scrollLeft,e.maxScrollLeft),!0),t.display.maxLineChanged=!1);var r=e.focus&&e.focus==W();e.preparedSelection&&t.display.input.showSelection(e.preparedSelection,r),(e.updatedDisplay||e.startHeight!=t.doc.height)&&Rn(t,e.barMeasure),e.updatedDisplay&&si(t,e.barMeasure),e.selectionChanged&&bn(t),t.state.focused&&e.updateInput&&t.display.input.reset(e.typing),r&&wn(e.cm)}function $n(e){var t=e.cm,r=t.display,n=t.doc;(e.updatedDisplay&&ii(t,e.update),null==r.wheelStartX||null==e.scrollTop&&null==e.scrollLeft&&!e.scrollToPos||(r.wheelStartX=r.wheelStartY=null),null!=e.scrollTop&&Fn(t,e.scrollTop,e.forceScroll),null!=e.scrollLeft&&Pn(t,e.scrollLeft,!0,!0),e.scrollToPos)&&function(e,t){if(!ve(e,\"scrollCursorIntoView\")){var r=e.display,n=r.sizer.getBoundingClientRect(),i=null;if(t.top+n.top<0?i=!0:t.bottom+n.top>(window.innerHeight||document.documentElement.clientHeight)&&(i=!1),null!=i&&!p){var o=O(\"div\",\"​\",null,\"position: absolute;\\n                         top: \"+(t.top-r.viewOffset-Cr(e.display))+\"px;\\n                         height: \"+(t.bottom-t.top+kr(e)+r.barHeight)+\"px;\\n                         left: \"+t.left+\"px; width: \"+Math.max(2,t.right-t.left)+\"px;\");e.display.lineSpace.appendChild(o),o.scrollIntoView(i),e.display.lineSpace.removeChild(o)}}}(t,function(e,t,r,n){var i;null==n&&(n=0),e.options.lineWrapping||t!=r||(r=\"before\"==(t=t.ch?et(t.line,\"before\"==t.sticky?t.ch-1:t.ch,\"after\"):t).sticky?et(t.line,t.ch+1,\"before\"):t);for(var o=0;o<5;o++){var l=!1,s=Xr(e,t),a=r&&r!=t?Xr(e,r):s,u=Mn(e,i={left:Math.min(s.left,a.left),top:Math.min(s.top,a.top)-n,right:Math.max(s.left,a.left),bottom:Math.max(s.bottom,a.bottom)+n}),c=e.doc.scrollTop,h=e.doc.scrollLeft;if(null!=u.scrollTop&&(Hn(e,u.scrollTop),Math.abs(e.doc.scrollTop-c)>1&&(l=!0)),null!=u.scrollLeft&&(Pn(e,u.scrollLeft),Math.abs(e.doc.scrollLeft-h)>1&&(l=!0)),!l)break}return i}(t,st(n,e.scrollToPos.from),st(n,e.scrollToPos.to),e.scrollToPos.margin));var i=e.maybeHiddenMarkers,o=e.maybeUnhiddenMarkers;if(i)for(var l=0;l<i.length;++l)i[l].lines.length||ge(i[l],\"hide\");if(o)for(var s=0;s<o.length;++s)o[s].lines.length&&ge(o[s],\"unhide\");r.wrapper.offsetHeight&&(n.scrollTop=t.display.scroller.scrollTop),e.changeObjs&&ge(t,\"changes\",t,e.changeObjs),e.update&&e.update.finish()}function qn(e,t){if(e.curOp)return t();Kn(e);try{return t()}finally{jn(e)}}function Zn(e,t){return function(){if(e.curOp)return t.apply(e,arguments);Kn(e);try{return t.apply(e,arguments)}finally{jn(e)}}}function Qn(e){return function(){if(this.curOp)return e.apply(this,arguments);Kn(this);try{return e.apply(this,arguments)}finally{jn(this)}}}function Jn(e){return function(){var t=this.cm;if(!t||t.curOp)return e.apply(this,arguments);Kn(t);try{return e.apply(this,arguments)}finally{jn(t)}}}function ei(e,t){e.doc.highlightFrontier<e.display.viewTo&&e.state.highlight.set(t,E(ti,e))}function ti(e){var t=e.doc;if(!(t.highlightFrontier>=e.display.viewTo)){var r=+new Date+e.options.workTime,n=dt(e,t.highlightFrontier),i=[];t.iter(n.line,Math.min(t.first+t.size,e.display.viewTo+500),function(o){if(n.line>=e.display.viewFrom){var l=o.styles,s=o.text.length>e.options.maxHighlightLength?Ue(t.mode,n.state):null,a=ht(e,o,n,!0);s&&(n.state=s),o.styles=a.styles;var u=o.styleClasses,c=a.classes;c?o.styleClasses=c:u&&(o.styleClasses=null);for(var h=!l||l.length!=o.styles.length||u!=c&&(!u||!c||u.bgClass!=c.bgClass||u.textClass!=c.textClass),f=0;!h&&f<l.length;++f)h=l[f]!=o.styles[f];h&&i.push(n.line),o.stateAfter=n.save(),n.nextLine()}else o.text.length<=e.options.maxHighlightLength&&pt(e,o.text,n),o.stateAfter=n.line%5==0?n.save():null,n.nextLine();if(+new Date>r)return ei(e,e.options.workDelay),!0}),t.highlightFrontier=n.line,t.modeFrontier=Math.max(t.modeFrontier,n.line),i.length&&qn(e,function(){for(var t=0;t<i.length;t++)cn(e,i[t],\"text\")})}}var ri=function(e,t,r){var n=e.display;this.viewport=t,this.visible=Tn(n,e.doc,t),this.editorIsHidden=!n.wrapper.offsetWidth,this.wrapperHeight=n.wrapper.clientHeight,this.wrapperWidth=n.wrapper.clientWidth,this.oldDisplayWidth=Tr(e),this.force=r,this.dims=rn(e),this.events=[]};function ni(e,t){var r=e.display,n=e.doc;if(t.editorIsHidden)return hn(e),!1;if(!t.force&&t.visible.from>=r.viewFrom&&t.visible.to<=r.viewTo&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo)&&r.renderedView==r.view&&0==dn(e))return!1;ui(e)&&(hn(e),t.dims=rn(e));var i=n.first+n.size,o=Math.max(t.visible.from-e.options.viewportMargin,n.first),l=Math.min(i,t.visible.to+e.options.viewportMargin);r.viewFrom<o&&o-r.viewFrom<20&&(o=Math.max(n.first,r.viewFrom)),r.viewTo>l&&r.viewTo-l<20&&(l=Math.min(i,r.viewTo)),Ct&&(o=Rt(e.doc,o),l=Bt(e.doc,l));var s=o!=r.viewFrom||l!=r.viewTo||r.lastWrapHeight!=t.wrapperHeight||r.lastWrapWidth!=t.wrapperWidth;!function(e,t,r){var n=e.display;0==n.view.length||t>=n.viewTo||r<=n.viewFrom?(n.view=ir(e,t,r),n.viewFrom=t):(n.viewFrom>t?n.view=ir(e,t,n.viewFrom).concat(n.view):n.viewFrom<t&&(n.view=n.view.slice(an(e,t))),n.viewFrom=t,n.viewTo<r?n.view=n.view.concat(ir(e,n.viewTo,r)):n.viewTo>r&&(n.view=n.view.slice(0,an(e,r)))),n.viewTo=r}(e,o,l),r.viewOffset=Vt(Xe(e.doc,r.viewFrom)),e.display.mover.style.top=r.viewOffset+\"px\";var u=dn(e);if(!s&&0==u&&!t.force&&r.renderedView==r.view&&(null==r.updateLineNumbers||r.updateLineNumbers>=r.viewTo))return!1;var c=function(e){if(e.hasFocus())return null;var t=W();if(!t||!D(e.display.lineDiv,t))return null;var r={activeElt:t};if(window.getSelection){var n=window.getSelection();n.anchorNode&&n.extend&&D(e.display.lineDiv,n.anchorNode)&&(r.anchorNode=n.anchorNode,r.anchorOffset=n.anchorOffset,r.focusNode=n.focusNode,r.focusOffset=n.focusOffset)}return r}(e);return u>4&&(r.lineDiv.style.display=\"none\"),function(e,t,r){var n=e.display,i=e.options.lineNumbers,o=n.lineDiv,l=o.firstChild;function s(t){var r=t.nextSibling;return a&&y&&e.display.currentWheelTarget==t?t.style.display=\"none\":t.parentNode.removeChild(t),r}for(var u=n.view,c=n.viewFrom,h=0;h<u.length;h++){var f=u[h];if(f.hidden);else if(f.node&&f.node.parentNode==o){for(;l!=f.node;)l=s(l);var d=i&&null!=t&&t<=c&&f.lineNumber;f.changes&&(B(f.changes,\"gutter\")>-1&&(d=!1),ur(e,f,c,r)),d&&(M(f.lineNumber),f.lineNumber.appendChild(document.createTextNode(Je(e.options,c)))),l=f.node.nextSibling}else{var p=vr(e,f,c,r);o.insertBefore(p,l)}c+=f.size}for(;l;)l=s(l)}(e,r.updateLineNumbers,t.dims),u>4&&(r.lineDiv.style.display=\"\"),r.renderedView=r.view,function(e){if(e&&e.activeElt&&e.activeElt!=W()&&(e.activeElt.focus(),e.anchorNode&&D(document.body,e.anchorNode)&&D(document.body,e.focusNode))){var t=window.getSelection(),r=document.createRange();r.setEnd(e.anchorNode,e.anchorOffset),r.collapse(!1),t.removeAllRanges(),t.addRange(r),t.extend(e.focusNode,e.focusOffset)}}(c),M(r.cursorDiv),M(r.selectionDiv),r.gutters.style.height=r.sizer.style.minHeight=0,s&&(r.lastWrapHeight=t.wrapperHeight,r.lastWrapWidth=t.wrapperWidth,ei(e,400)),r.updateLineNumbers=null,!0}function ii(e,t){for(var r=t.viewport,n=!0;(n&&e.options.lineWrapping&&t.oldDisplayWidth!=Tr(e)||(r&&null!=r.top&&(r={top:Math.min(e.doc.height+Sr(e.display)-Mr(e),r.top)}),t.visible=Tn(e.display,e.doc,r),!(t.visible.from>=e.display.viewFrom&&t.visible.to<=e.display.viewTo)))&&ni(e,t);n=!1){Ln(e);var i=En(e);pn(e),Rn(e,i),si(e,i),t.force=!1}t.signal(e,\"update\",e),e.display.viewFrom==e.display.reportedViewFrom&&e.display.viewTo==e.display.reportedViewTo||(t.signal(e,\"viewportChange\",e,e.display.viewFrom,e.display.viewTo),e.display.reportedViewFrom=e.display.viewFrom,e.display.reportedViewTo=e.display.viewTo)}function oi(e,t){var r=new ri(e,t);if(ni(e,r)){Ln(e),ii(e,r);var n=En(e);pn(e),Rn(e,n),si(e,n),r.finish()}}function li(e){var t=e.gutters.offsetWidth;e.sizer.style.marginLeft=t+\"px\"}function si(e,t){e.display.sizer.style.minHeight=t.docHeight+\"px\",e.display.heightForcer.style.top=t.docHeight+\"px\",e.display.gutters.style.height=t.docHeight+e.display.barHeight+kr(e)+\"px\"}function ai(e){var t=e.display,r=t.view;if(t.alignWidgets||t.gutters.firstChild&&e.options.fixedGutter){for(var n=nn(t)-t.scroller.scrollLeft+e.doc.scrollLeft,i=t.gutters.offsetWidth,o=n+\"px\",l=0;l<r.length;l++)if(!r[l].hidden){e.options.fixedGutter&&(r[l].gutter&&(r[l].gutter.style.left=o),r[l].gutterBackground&&(r[l].gutterBackground.style.left=o));var s=r[l].alignable;if(s)for(var a=0;a<s.length;a++)s[a].style.left=o}e.options.fixedGutter&&(t.gutters.style.left=n+i+\"px\")}}function ui(e){if(!e.options.lineNumbers)return!1;var t=e.doc,r=Je(e.options,t.first+t.size-1),n=e.display;if(r.length!=n.lineNumChars){var i=n.measure.appendChild(O(\"div\",[O(\"div\",r)],\"CodeMirror-linenumber CodeMirror-gutter-elt\")),o=i.firstChild.offsetWidth,l=i.offsetWidth-o;return n.lineGutter.style.width=\"\",n.lineNumInnerWidth=Math.max(o,n.lineGutter.offsetWidth-l)+1,n.lineNumWidth=n.lineNumInnerWidth+l,n.lineNumChars=n.lineNumInnerWidth?r.length:-1,n.lineGutter.style.width=n.lineNumWidth+\"px\",li(e.display),!0}return!1}function ci(e,t){for(var r=[],n=!1,i=0;i<e.length;i++){var o=e[i],l=null;if(\"string\"!=typeof o&&(l=o.style,o=o.className),\"CodeMirror-linenumbers\"==o){if(!t)continue;n=!0}r.push({className:o,style:l})}return t&&!n&&r.push({className:\"CodeMirror-linenumbers\",style:null}),r}function hi(e){var t=e.gutters,r=e.gutterSpecs;M(t),e.lineGutter=null;for(var n=0;n<r.length;++n){var i=r[n],o=i.className,l=i.style,s=t.appendChild(O(\"div\",null,\"CodeMirror-gutter \"+o));l&&(s.style.cssText=l),\"CodeMirror-linenumbers\"==o&&(e.lineGutter=s,s.style.width=(e.lineNumWidth||1)+\"px\")}t.style.display=r.length?\"\":\"none\",li(e)}function fi(e){hi(e.display),un(e),ai(e)}ri.prototype.signal=function(e,t){ye(e,t)&&this.events.push(arguments)},ri.prototype.finish=function(){for(var e=0;e<this.events.length;e++)ge.apply(null,this.events[e])};var di=0,pi=null;function gi(e){var t=e.wheelDeltaX,r=e.wheelDeltaY;return null==t&&e.detail&&e.axis==e.HORIZONTAL_AXIS&&(t=e.detail),null==r&&e.detail&&e.axis==e.VERTICAL_AXIS?r=e.detail:null==r&&(r=e.wheelDelta),{x:t,y:r}}function vi(e){var t=gi(e);return t.x*=pi,t.y*=pi,t}function mi(e,t){var n=gi(t),i=n.x,o=n.y,l=e.display,s=l.scroller,u=s.scrollWidth>s.clientWidth,c=s.scrollHeight>s.clientHeight;if(i&&u||o&&c){if(o&&y&&a)e:for(var f=t.target,d=l.view;f!=s;f=f.parentNode)for(var p=0;p<d.length;p++)if(d[p].node==f){e.display.currentWheelTarget=f;break e}if(i&&!r&&!h&&null!=pi)return o&&c&&Hn(e,Math.max(0,s.scrollTop+o*pi)),Pn(e,Math.max(0,s.scrollLeft+i*pi)),(!o||o&&c)&&we(t),void(l.wheelStartX=null);if(o&&null!=pi){var g=o*pi,v=e.doc.scrollTop,m=v+l.wrapper.clientHeight;g<0?v=Math.max(0,v+g-50):m=Math.min(e.doc.height,m+g+50),oi(e,{top:v,bottom:m})}di<20&&(null==l.wheelStartX?(l.wheelStartX=s.scrollLeft,l.wheelStartY=s.scrollTop,l.wheelDX=i,l.wheelDY=o,setTimeout(function(){if(null!=l.wheelStartX){var e=s.scrollLeft-l.wheelStartX,t=s.scrollTop-l.wheelStartY,r=t&&l.wheelDY&&t/l.wheelDY||e&&l.wheelDX&&e/l.wheelDX;l.wheelStartX=l.wheelStartY=null,r&&(pi=(pi*di+r)/(di+1),++di)}},200)):(l.wheelDX+=i,l.wheelDY+=o))}}l?pi=-.53:r?pi=15:c?pi=-.7:f&&(pi=-1/3);var yi=function(e,t){this.ranges=e,this.primIndex=t};yi.prototype.primary=function(){return this.ranges[this.primIndex]},yi.prototype.equals=function(e){if(e==this)return!0;if(e.primIndex!=this.primIndex||e.ranges.length!=this.ranges.length)return!1;for(var t=0;t<this.ranges.length;t++){var r=this.ranges[t],n=e.ranges[t];if(!rt(r.anchor,n.anchor)||!rt(r.head,n.head))return!1}return!0},yi.prototype.deepCopy=function(){for(var e=[],t=0;t<this.ranges.length;t++)e[t]=new bi(nt(this.ranges[t].anchor),nt(this.ranges[t].head));return new yi(e,this.primIndex)},yi.prototype.somethingSelected=function(){for(var e=0;e<this.ranges.length;e++)if(!this.ranges[e].empty())return!0;return!1},yi.prototype.contains=function(e,t){t||(t=e);for(var r=0;r<this.ranges.length;r++){var n=this.ranges[r];if(tt(t,n.from())>=0&&tt(e,n.to())<=0)return r}return-1};var bi=function(e,t){this.anchor=e,this.head=t};function wi(e,t,r){var n=e&&e.options.selectionsMayTouch,i=t[r];t.sort(function(e,t){return tt(e.from(),t.from())}),r=B(t,i);for(var o=1;o<t.length;o++){var l=t[o],s=t[o-1],a=tt(s.to(),l.from());if(n&&!l.empty()?a>0:a>=0){var u=ot(s.from(),l.from()),c=it(s.to(),l.to()),h=s.empty()?l.from()==l.head:s.from()==s.head;o<=r&&--r,t.splice(--o,2,new bi(h?c:u,h?u:c))}}return new yi(t,r)}function xi(e,t){return new yi([new bi(e,t||e)],0)}function Ci(e){return e.text?et(e.from.line+e.text.length-1,$(e.text).length+(1==e.text.length?e.from.ch:0)):e.to}function Si(e,t){if(tt(e,t.from)<0)return e;if(tt(e,t.to)<=0)return Ci(t);var r=e.line+t.text.length-(t.to.line-t.from.line)-1,n=e.ch;return e.line==t.to.line&&(n+=Ci(t).ch-t.to.ch),et(r,n)}function Li(e,t){for(var r=[],n=0;n<e.sel.ranges.length;n++){var i=e.sel.ranges[n];r.push(new bi(Si(i.anchor,t),Si(i.head,t)))}return wi(e.cm,r,e.sel.primIndex)}function ki(e,t,r){return e.line==t.line?et(r.line,e.ch-t.ch+r.ch):et(r.line+(e.line-t.line),e.ch)}function Ti(e){e.doc.mode=Re(e.options,e.doc.modeOption),Mi(e)}function Mi(e){e.doc.iter(function(e){e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null)}),e.doc.modeFrontier=e.doc.highlightFrontier=e.doc.first,ei(e,100),e.state.modeGen++,e.curOp&&un(e)}function Ni(e,t){return 0==t.from.ch&&0==t.to.ch&&\"\"==$(t.text)&&(!e.cm||e.cm.options.wholeLineUpdateBefore)}function Oi(e,t,r,n){function i(e){return r?r[e]:null}function o(e,r,i){!function(e,t,r,n){e.text=t,e.stateAfter&&(e.stateAfter=null),e.styles&&(e.styles=null),null!=e.order&&(e.order=null),Nt(e),Ot(e,r);var i=n?n(e):1;i!=e.height&&$e(e,i)}(e,r,i,n),sr(e,\"change\",e,t)}function l(e,t){for(var r=[],o=e;o<t;++o)r.push(new Xt(u[o],i(o),n));return r}var s=t.from,a=t.to,u=t.text,c=Xe(e,s.line),h=Xe(e,a.line),f=$(u),d=i(u.length-1),p=a.line-s.line;if(t.full)e.insert(0,l(0,u.length)),e.remove(u.length,e.size-u.length);else if(Ni(e,t)){var g=l(0,u.length-1);o(h,h.text,d),p&&e.remove(s.line,p),g.length&&e.insert(s.line,g)}else if(c==h)if(1==u.length)o(c,c.text.slice(0,s.ch)+f+c.text.slice(a.ch),d);else{var v=l(1,u.length-1);v.push(new Xt(f+c.text.slice(a.ch),d,n)),o(c,c.text.slice(0,s.ch)+u[0],i(0)),e.insert(s.line+1,v)}else if(1==u.length)o(c,c.text.slice(0,s.ch)+u[0]+h.text.slice(a.ch),i(0)),e.remove(s.line+1,p);else{o(c,c.text.slice(0,s.ch)+u[0],i(0)),o(h,f+h.text.slice(a.ch),d);var m=l(1,u.length-1);p>1&&e.remove(s.line+1,p-1),e.insert(s.line+1,m)}sr(e,\"change\",e,t)}function Ai(e,t,r){!function e(n,i,o){if(n.linked)for(var l=0;l<n.linked.length;++l){var s=n.linked[l];if(s.doc!=i){var a=o&&s.sharedHist;r&&!a||(t(s.doc,a),e(s.doc,n,a))}}}(e,null,!0)}function Di(e,t){if(t.cm)throw new Error(\"This document is already in use.\");e.doc=t,t.cm=e,ln(e),Ti(e),Wi(e),e.options.lineWrapping||jt(e),e.options.mode=t.modeOption,un(e)}function Wi(e){(\"rtl\"==e.doc.direction?H:T)(e.display.lineDiv,\"CodeMirror-rtl\")}function Hi(e){this.done=[],this.undone=[],this.undoDepth=1/0,this.lastModTime=this.lastSelTime=0,this.lastOp=this.lastSelOp=null,this.lastOrigin=this.lastSelOrigin=null,this.generation=this.maxGeneration=e||1}function Fi(e,t){var r={from:nt(t.from),to:Ci(t),text:Ye(e,t.from,t.to)};return Ri(e,r,t.from.line,t.to.line+1),Ai(e,function(e){return Ri(e,r,t.from.line,t.to.line+1)},!0),r}function Pi(e){for(;e.length;){if(!$(e).ranges)break;e.pop()}}function Ei(e,t,r,n){var i=e.history;i.undone.length=0;var o,l,s=+new Date;if((i.lastOp==n||i.lastOrigin==t.origin&&t.origin&&(\"+\"==t.origin.charAt(0)&&i.lastModTime>s-(e.cm?e.cm.options.historyEventDelay:500)||\"*\"==t.origin.charAt(0)))&&(o=function(e,t){return t?(Pi(e.done),$(e.done)):e.done.length&&!$(e.done).ranges?$(e.done):e.done.length>1&&!e.done[e.done.length-2].ranges?(e.done.pop(),$(e.done)):void 0}(i,i.lastOp==n)))l=$(o.changes),0==tt(t.from,t.to)&&0==tt(t.from,l.to)?l.to=Ci(t):o.changes.push(Fi(e,t));else{var a=$(i.done);for(a&&a.ranges||zi(e.sel,i.done),o={changes:[Fi(e,t)],generation:i.generation},i.done.push(o);i.done.length>i.undoDepth;)i.done.shift(),i.done[0].ranges||i.done.shift()}i.done.push(r),i.generation=++i.maxGeneration,i.lastModTime=i.lastSelTime=s,i.lastOp=i.lastSelOp=n,i.lastOrigin=i.lastSelOrigin=t.origin,l||ge(e,\"historyAdded\")}function Ii(e,t,r,n){var i=e.history,o=n&&n.origin;r==i.lastSelOp||o&&i.lastSelOrigin==o&&(i.lastModTime==i.lastSelTime&&i.lastOrigin==o||function(e,t,r,n){var i=t.charAt(0);return\"*\"==i||\"+\"==i&&r.ranges.length==n.ranges.length&&r.somethingSelected()==n.somethingSelected()&&new Date-e.history.lastSelTime<=(e.cm?e.cm.options.historyEventDelay:500)}(e,o,$(i.done),t))?i.done[i.done.length-1]=t:zi(t,i.done),i.lastSelTime=+new Date,i.lastSelOrigin=o,i.lastSelOp=r,n&&!1!==n.clearRedo&&Pi(i.undone)}function zi(e,t){var r=$(t);r&&r.ranges&&r.equals(e)||t.push(e)}function Ri(e,t,r,n){var i=t[\"spans_\"+e.id],o=0;e.iter(Math.max(e.first,r),Math.min(e.first+e.size,n),function(r){r.markedSpans&&((i||(i=t[\"spans_\"+e.id]={}))[o]=r.markedSpans),++o})}function Bi(e){if(!e)return null;for(var t,r=0;r<e.length;++r)e[r].marker.explicitlyCleared?t||(t=e.slice(0,r)):t&&t.push(e[r]);return t?t.length?t:null:e}function Gi(e,t){var r=function(e,t){var r=t[\"spans_\"+e.id];if(!r)return null;for(var n=[],i=0;i<t.text.length;++i)n.push(Bi(r[i]));return n}(e,t),n=Tt(e,t);if(!r)return n;if(!n)return r;for(var i=0;i<r.length;++i){var o=r[i],l=n[i];if(o&&l)e:for(var s=0;s<l.length;++s){for(var a=l[s],u=0;u<o.length;++u)if(o[u].marker==a.marker)continue e;o.push(a)}else l&&(r[i]=l)}return r}function Ui(e,t,r){for(var n=[],i=0;i<e.length;++i){var o=e[i];if(o.ranges)n.push(r?yi.prototype.deepCopy.call(o):o);else{var l=o.changes,s=[];n.push({changes:s});for(var a=0;a<l.length;++a){var u=l[a],c=void 0;if(s.push({from:u.from,to:u.to,text:u.text}),t)for(var h in u)(c=h.match(/^spans_(\\d+)$/))&&B(t,Number(c[1]))>-1&&($(s)[h]=u[h],delete u[h])}}}return n}function Vi(e,t,r,n){if(n){var i=e.anchor;if(r){var o=tt(t,i)<0;o!=tt(r,i)<0?(i=t,t=r):o!=tt(t,r)<0&&(t=r)}return new bi(i,t)}return new bi(r||t,t)}function Ki(e,t,r,n,i){null==i&&(i=e.cm&&(e.cm.display.shift||e.extend)),$i(e,new yi([Vi(e.sel.primary(),t,r,i)],0),n)}function ji(e,t,r){for(var n=[],i=e.cm&&(e.cm.display.shift||e.extend),o=0;o<e.sel.ranges.length;o++)n[o]=Vi(e.sel.ranges[o],t[o],null,i);$i(e,wi(e.cm,n,e.sel.primIndex),r)}function Xi(e,t,r,n){var i=e.sel.ranges.slice(0);i[t]=r,$i(e,wi(e.cm,i,e.sel.primIndex),n)}function Yi(e,t,r,n){$i(e,xi(t,r),n)}function _i(e,t,r){var n=e.history.done,i=$(n);i&&i.ranges?(n[n.length-1]=t,qi(e,t,r)):$i(e,t,r)}function $i(e,t,r){qi(e,t,r),Ii(e,e.sel,e.cm?e.cm.curOp.id:NaN,r)}function qi(e,t,r){(ye(e,\"beforeSelectionChange\")||e.cm&&ye(e.cm,\"beforeSelectionChange\"))&&(t=function(e,t,r){var n={ranges:t.ranges,update:function(t){this.ranges=[];for(var r=0;r<t.length;r++)this.ranges[r]=new bi(st(e,t[r].anchor),st(e,t[r].head))},origin:r&&r.origin};return ge(e,\"beforeSelectionChange\",e,n),e.cm&&ge(e.cm,\"beforeSelectionChange\",e.cm,n),n.ranges!=t.ranges?wi(e.cm,n.ranges,n.ranges.length-1):t}(e,t,r)),Zi(e,Ji(e,t,r&&r.bias||(tt(t.primary().head,e.sel.primary().head)<0?-1:1),!0)),r&&!1===r.scroll||!e.cm||On(e.cm)}function Zi(e,t){t.equals(e.sel)||(e.sel=t,e.cm&&(e.cm.curOp.updateInput=1,e.cm.curOp.selectionChanged=!0,me(e.cm)),sr(e,\"cursorActivity\",e))}function Qi(e){Zi(e,Ji(e,e.sel,null,!1))}function Ji(e,t,r,n){for(var i,o=0;o<t.ranges.length;o++){var l=t.ranges[o],s=t.ranges.length==e.sel.ranges.length&&e.sel.ranges[o],a=to(e,l.anchor,s&&s.anchor,r,n),u=to(e,l.head,s&&s.head,r,n);(i||a!=l.anchor||u!=l.head)&&(i||(i=t.ranges.slice(0,o)),i[o]=new bi(a,u))}return i?wi(e.cm,i,t.primIndex):t}function eo(e,t,r,n,i){var o=Xe(e,t.line);if(o.markedSpans)for(var l=0;l<o.markedSpans.length;++l){var s=o.markedSpans[l],a=s.marker,u=\"selectLeft\"in a?!a.selectLeft:a.inclusiveLeft,c=\"selectRight\"in a?!a.selectRight:a.inclusiveRight;if((null==s.from||(u?s.from<=t.ch:s.from<t.ch))&&(null==s.to||(c?s.to>=t.ch:s.to>t.ch))){if(i&&(ge(a,\"beforeCursorEnter\"),a.explicitlyCleared)){if(o.markedSpans){--l;continue}break}if(!a.atomic)continue;if(r){var h=a.find(n<0?1:-1),f=void 0;if((n<0?c:u)&&(h=ro(e,h,-n,h&&h.line==t.line?o:null)),h&&h.line==t.line&&(f=tt(h,r))&&(n<0?f<0:f>0))return eo(e,h,t,n,i)}var d=a.find(n<0?-1:1);return(n<0?u:c)&&(d=ro(e,d,n,d.line==t.line?o:null)),d?eo(e,d,t,n,i):null}}return t}function to(e,t,r,n,i){var o=n||1,l=eo(e,t,r,o,i)||!i&&eo(e,t,r,o,!0)||eo(e,t,r,-o,i)||!i&&eo(e,t,r,-o,!0);return l||(e.cantEdit=!0,et(e.first,0))}function ro(e,t,r,n){return r<0&&0==t.ch?t.line>e.first?st(e,et(t.line-1)):null:r>0&&t.ch==(n||Xe(e,t.line)).text.length?t.line<e.first+e.size-1?et(t.line+1,0):null:new et(t.line,t.ch+r)}function no(e){e.setSelection(et(e.firstLine(),0),et(e.lastLine()),V)}function io(e,t,r){var n={canceled:!1,from:t.from,to:t.to,text:t.text,origin:t.origin,cancel:function(){return n.canceled=!0}};return r&&(n.update=function(t,r,i,o){t&&(n.from=st(e,t)),r&&(n.to=st(e,r)),i&&(n.text=i),void 0!==o&&(n.origin=o)}),ge(e,\"beforeChange\",e,n),e.cm&&ge(e.cm,\"beforeChange\",e.cm,n),n.canceled?(e.cm&&(e.cm.curOp.updateInput=2),null):{from:n.from,to:n.to,text:n.text,origin:n.origin}}function oo(e,t,r){if(e.cm){if(!e.cm.curOp)return Zn(e.cm,oo)(e,t,r);if(e.cm.state.suppressEdits)return}if(!(ye(e,\"beforeChange\")||e.cm&&ye(e.cm,\"beforeChange\"))||(t=io(e,t,!0))){var n=xt&&!r&&function(e,t,r){var n=null;if(e.iter(t.line,r.line+1,function(e){if(e.markedSpans)for(var t=0;t<e.markedSpans.length;++t){var r=e.markedSpans[t].marker;!r.readOnly||n&&-1!=B(n,r)||(n||(n=[])).push(r)}}),!n)return null;for(var i=[{from:t,to:r}],o=0;o<n.length;++o)for(var l=n[o],s=l.find(0),a=0;a<i.length;++a){var u=i[a];if(!(tt(u.to,s.from)<0||tt(u.from,s.to)>0)){var c=[a,1],h=tt(u.from,s.from),f=tt(u.to,s.to);(h<0||!l.inclusiveLeft&&!h)&&c.push({from:u.from,to:s.from}),(f>0||!l.inclusiveRight&&!f)&&c.push({from:s.to,to:u.to}),i.splice.apply(i,c),a+=c.length-3}}return i}(e,t.from,t.to);if(n)for(var i=n.length-1;i>=0;--i)lo(e,{from:n[i].from,to:n[i].to,text:i?[\"\"]:t.text,origin:t.origin});else lo(e,t)}}function lo(e,t){if(1!=t.text.length||\"\"!=t.text[0]||0!=tt(t.from,t.to)){var r=Li(e,t);Ei(e,t,r,e.cm?e.cm.curOp.id:NaN),uo(e,t,r,Tt(e,t));var n=[];Ai(e,function(e,r){r||-1!=B(n,e.history)||(po(e.history,t),n.push(e.history)),uo(e,t,null,Tt(e,t))})}}function so(e,t,r){var n=e.cm&&e.cm.state.suppressEdits;if(!n||r){for(var i,o=e.history,l=e.sel,s=\"undo\"==t?o.done:o.undone,a=\"undo\"==t?o.undone:o.done,u=0;u<s.length&&(i=s[u],r?!i.ranges||i.equals(e.sel):i.ranges);u++);if(u!=s.length){for(o.lastOrigin=o.lastSelOrigin=null;;){if(!(i=s.pop()).ranges){if(n)return void s.push(i);break}if(zi(i,a),r&&!i.equals(e.sel))return void $i(e,i,{clearRedo:!1});l=i}var c=[];zi(l,a),a.push({changes:c,generation:o.generation}),o.generation=i.generation||++o.maxGeneration;for(var h=ye(e,\"beforeChange\")||e.cm&&ye(e.cm,\"beforeChange\"),f=function(r){var n=i.changes[r];if(n.origin=t,h&&!io(e,n,!1))return s.length=0,{};c.push(Fi(e,n));var o=r?Li(e,n):$(s);uo(e,n,o,Gi(e,n)),!r&&e.cm&&e.cm.scrollIntoView({from:n.from,to:Ci(n)});var l=[];Ai(e,function(e,t){t||-1!=B(l,e.history)||(po(e.history,n),l.push(e.history)),uo(e,n,null,Gi(e,n))})},d=i.changes.length-1;d>=0;--d){var p=f(d);if(p)return p.v}}}}function ao(e,t){if(0!=t&&(e.first+=t,e.sel=new yi(q(e.sel.ranges,function(e){return new bi(et(e.anchor.line+t,e.anchor.ch),et(e.head.line+t,e.head.ch))}),e.sel.primIndex),e.cm)){un(e.cm,e.first,e.first-t,t);for(var r=e.cm.display,n=r.viewFrom;n<r.viewTo;n++)cn(e.cm,n,\"gutter\")}}function uo(e,t,r,n){if(e.cm&&!e.cm.curOp)return Zn(e.cm,uo)(e,t,r,n);if(t.to.line<e.first)ao(e,t.text.length-1-(t.to.line-t.from.line));else if(!(t.from.line>e.lastLine())){if(t.from.line<e.first){var i=t.text.length-1-(e.first-t.from.line);ao(e,i),t={from:et(e.first,0),to:et(t.to.line+i,t.to.ch),text:[$(t.text)],origin:t.origin}}var o=e.lastLine();t.to.line>o&&(t={from:t.from,to:et(o,Xe(e,o).text.length),text:[t.text[0]],origin:t.origin}),t.removed=Ye(e,t.from,t.to),r||(r=Li(e,t)),e.cm?function(e,t,r){var n=e.doc,i=e.display,o=t.from,l=t.to,s=!1,a=o.line;e.options.lineWrapping||(a=qe(zt(Xe(n,o.line))),n.iter(a,l.line+1,function(e){if(e==i.maxLine)return s=!0,!0}));n.sel.contains(t.from,t.to)>-1&&me(e);Oi(n,t,r,on(e)),e.options.lineWrapping||(n.iter(a,o.line+t.text.length,function(e){var t=Kt(e);t>i.maxLineLength&&(i.maxLine=e,i.maxLineLength=t,i.maxLineChanged=!0,s=!1)}),s&&(e.curOp.updateMaxLine=!0));(function(e,t){if(e.modeFrontier=Math.min(e.modeFrontier,t),!(e.highlightFrontier<t-10)){for(var r=e.first,n=t-1;n>r;n--){var i=Xe(e,n).stateAfter;if(i&&(!(i instanceof ut)||n+i.lookAhead<t)){r=n+1;break}}e.highlightFrontier=Math.min(e.highlightFrontier,r)}})(n,o.line),ei(e,400);var u=t.text.length-(l.line-o.line)-1;t.full?un(e):o.line!=l.line||1!=t.text.length||Ni(e.doc,t)?un(e,o.line,l.line+1,u):cn(e,o.line,\"text\");var c=ye(e,\"changes\"),h=ye(e,\"change\");if(h||c){var f={from:o,to:l,text:t.text,removed:t.removed,origin:t.origin};h&&sr(e,\"change\",e,f),c&&(e.curOp.changeObjs||(e.curOp.changeObjs=[])).push(f)}e.display.selForContextMenu=null}(e.cm,t,n):Oi(e,t,n),qi(e,r,V),e.cantEdit&&to(e,et(e.firstLine(),0))&&(e.cantEdit=!1)}}function co(e,t,r,n,i){var o;n||(n=r),tt(n,r)<0&&(r=(o=[n,r])[0],n=o[1]),\"string\"==typeof t&&(t=e.splitLines(t)),oo(e,{from:r,to:n,text:t,origin:i})}function ho(e,t,r,n){r<e.line?e.line+=n:t<e.line&&(e.line=t,e.ch=0)}function fo(e,t,r,n){for(var i=0;i<e.length;++i){var o=e[i],l=!0;if(o.ranges){o.copied||((o=e[i]=o.deepCopy()).copied=!0);for(var s=0;s<o.ranges.length;s++)ho(o.ranges[s].anchor,t,r,n),ho(o.ranges[s].head,t,r,n)}else{for(var a=0;a<o.changes.length;++a){var u=o.changes[a];if(r<u.from.line)u.from=et(u.from.line+n,u.from.ch),u.to=et(u.to.line+n,u.to.ch);else if(t<=u.to.line){l=!1;break}}l||(e.splice(0,i+1),i=0)}}}function po(e,t){var r=t.from.line,n=t.to.line,i=t.text.length-(n-r)-1;fo(e.done,r,n,i),fo(e.undone,r,n,i)}function go(e,t,r,n){var i=t,o=t;return\"number\"==typeof t?o=Xe(e,lt(e,t)):i=qe(t),null==i?null:(n(o,i)&&e.cm&&cn(e.cm,i,r),o)}function vo(e){this.lines=e,this.parent=null;for(var t=0,r=0;r<e.length;++r)e[r].parent=this,t+=e[r].height;this.height=t}function mo(e){this.children=e;for(var t=0,r=0,n=0;n<e.length;++n){var i=e[n];t+=i.chunkSize(),r+=i.height,i.parent=this}this.size=t,this.height=r,this.parent=null}bi.prototype.from=function(){return ot(this.anchor,this.head)},bi.prototype.to=function(){return it(this.anchor,this.head)},bi.prototype.empty=function(){return this.head.line==this.anchor.line&&this.head.ch==this.anchor.ch},vo.prototype={chunkSize:function(){return this.lines.length},removeInner:function(e,t){for(var r=e,n=e+t;r<n;++r){var i=this.lines[r];this.height-=i.height,Yt(i),sr(i,\"delete\")}this.lines.splice(e,t)},collapse:function(e){e.push.apply(e,this.lines)},insertInner:function(e,t,r){this.height+=r,this.lines=this.lines.slice(0,e).concat(t).concat(this.lines.slice(e));for(var n=0;n<t.length;++n)t[n].parent=this},iterN:function(e,t,r){for(var n=e+t;e<n;++e)if(r(this.lines[e]))return!0}},mo.prototype={chunkSize:function(){return this.size},removeInner:function(e,t){this.size-=t;for(var r=0;r<this.children.length;++r){var n=this.children[r],i=n.chunkSize();if(e<i){var o=Math.min(t,i-e),l=n.height;if(n.removeInner(e,o),this.height-=l-n.height,i==o&&(this.children.splice(r--,1),n.parent=null),0==(t-=o))break;e=0}else e-=i}if(this.size-t<25&&(this.children.length>1||!(this.children[0]instanceof vo))){var s=[];this.collapse(s),this.children=[new vo(s)],this.children[0].parent=this}},collapse:function(e){for(var t=0;t<this.children.length;++t)this.children[t].collapse(e)},insertInner:function(e,t,r){this.size+=t.length,this.height+=r;for(var n=0;n<this.children.length;++n){var i=this.children[n],o=i.chunkSize();if(e<=o){if(i.insertInner(e,t,r),i.lines&&i.lines.length>50){for(var l=i.lines.length%25+25,s=l;s<i.lines.length;){var a=new vo(i.lines.slice(s,s+=25));i.height-=a.height,this.children.splice(++n,0,a),a.parent=this}i.lines=i.lines.slice(0,l),this.maybeSpill()}break}e-=o}},maybeSpill:function(){if(!(this.children.length<=10)){var e=this;do{var t=new mo(e.children.splice(e.children.length-5,5));if(e.parent){e.size-=t.size,e.height-=t.height;var r=B(e.parent.children,e);e.parent.children.splice(r+1,0,t)}else{var n=new mo(e.children);n.parent=e,e.children=[n,t],e=n}t.parent=e.parent}while(e.children.length>10);e.parent.maybeSpill()}},iterN:function(e,t,r){for(var n=0;n<this.children.length;++n){var i=this.children[n],o=i.chunkSize();if(e<o){var l=Math.min(t,o-e);if(i.iterN(e,l,r))return!0;if(0==(t-=l))break;e=0}else e-=o}}};var yo=function(e,t,r){if(r)for(var n in r)r.hasOwnProperty(n)&&(this[n]=r[n]);this.doc=e,this.node=t};function bo(e,t,r){Vt(t)<(e.curOp&&e.curOp.scrollTop||e.doc.scrollTop)&&Nn(e,r)}yo.prototype.clear=function(){var e=this.doc.cm,t=this.line.widgets,r=this.line,n=qe(r);if(null!=n&&t){for(var i=0;i<t.length;++i)t[i]==this&&t.splice(i--,1);t.length||(r.widgets=null);var o=wr(this);$e(r,Math.max(0,r.height-o)),e&&(qn(e,function(){bo(e,r,-o),cn(e,n,\"widget\")}),sr(e,\"lineWidgetCleared\",e,this,n))}},yo.prototype.changed=function(){var e=this,t=this.height,r=this.doc.cm,n=this.line;this.height=null;var i=wr(this)-t;i&&(Gt(this.doc,n)||$e(n,n.height+i),r&&qn(r,function(){r.curOp.forceUpdate=!0,bo(r,n,i),sr(r,\"lineWidgetChanged\",r,e,qe(n))}))},be(yo);var wo=0,xo=function(e,t){this.lines=[],this.type=t,this.doc=e,this.id=++wo};function Co(e,t,r,n,i){if(n&&n.shared)return function(e,t,r,n,i){(n=I(n)).shared=!1;var o=[Co(e,t,r,n,i)],l=o[0],s=n.widgetNode;return Ai(e,function(e){s&&(n.widgetNode=s.cloneNode(!0)),o.push(Co(e,st(e,t),st(e,r),n,i));for(var a=0;a<e.linked.length;++a)if(e.linked[a].isParent)return;l=$(o)}),new So(o,l)}(e,t,r,n,i);if(e.cm&&!e.cm.curOp)return Zn(e.cm,Co)(e,t,r,n,i);var o=new xo(e,i),l=tt(t,r);if(n&&I(n,o,!1),l>0||0==l&&!1!==o.clearWhenEmpty)return o;if(o.replacedWith&&(o.collapsed=!0,o.widgetNode=A(\"span\",[o.replacedWith],\"CodeMirror-widget\"),n.handleMouseEvents||o.widgetNode.setAttribute(\"cm-ignore-events\",\"true\"),n.insertLeft&&(o.widgetNode.insertLeft=!0)),o.collapsed){if(It(e,t.line,t,r,o)||t.line!=r.line&&It(e,r.line,t,r,o))throw new Error(\"Inserting collapsed marker partially overlapping an existing one\");Ct=!0}o.addToHistory&&Ei(e,{from:t,to:r,origin:\"markText\"},e.sel,NaN);var s,a=t.line,u=e.cm;if(e.iter(a,r.line+1,function(e){u&&o.collapsed&&!u.options.lineWrapping&&zt(e)==u.display.maxLine&&(s=!0),o.collapsed&&a!=t.line&&$e(e,0),function(e,t){e.markedSpans=e.markedSpans?e.markedSpans.concat([t]):[t],t.marker.attachLine(e)}(e,new St(o,a==t.line?t.ch:null,a==r.line?r.ch:null)),++a}),o.collapsed&&e.iter(t.line,r.line+1,function(t){Gt(e,t)&&$e(t,0)}),o.clearOnEnter&&fe(o,\"beforeCursorEnter\",function(){return o.clear()}),o.readOnly&&(xt=!0,(e.history.done.length||e.history.undone.length)&&e.clearHistory()),o.collapsed&&(o.id=++wo,o.atomic=!0),u){if(s&&(u.curOp.updateMaxLine=!0),o.collapsed)un(u,t.line,r.line+1);else if(o.className||o.startStyle||o.endStyle||o.css||o.attributes||o.title)for(var c=t.line;c<=r.line;c++)cn(u,c,\"text\");o.atomic&&Qi(u.doc),sr(u,\"markerAdded\",u,o)}return o}xo.prototype.clear=function(){if(!this.explicitlyCleared){var e=this.doc.cm,t=e&&!e.curOp;if(t&&Kn(e),ye(this,\"clear\")){var r=this.find();r&&sr(this,\"clear\",r.from,r.to)}for(var n=null,i=null,o=0;o<this.lines.length;++o){var l=this.lines[o],s=Lt(l.markedSpans,this);e&&!this.collapsed?cn(e,qe(l),\"text\"):e&&(null!=s.to&&(i=qe(l)),null!=s.from&&(n=qe(l))),l.markedSpans=kt(l.markedSpans,s),null==s.from&&this.collapsed&&!Gt(this.doc,l)&&e&&$e(l,en(e.display))}if(e&&this.collapsed&&!e.options.lineWrapping)for(var a=0;a<this.lines.length;++a){var u=zt(this.lines[a]),c=Kt(u);c>e.display.maxLineLength&&(e.display.maxLine=u,e.display.maxLineLength=c,e.display.maxLineChanged=!0)}null!=n&&e&&this.collapsed&&un(e,n,i+1),this.lines.length=0,this.explicitlyCleared=!0,this.atomic&&this.doc.cantEdit&&(this.doc.cantEdit=!1,e&&Qi(e.doc)),e&&sr(e,\"markerCleared\",e,this,n,i),t&&jn(e),this.parent&&this.parent.clear()}},xo.prototype.find=function(e,t){var r,n;null==e&&\"bookmark\"==this.type&&(e=1);for(var i=0;i<this.lines.length;++i){var o=this.lines[i],l=Lt(o.markedSpans,this);if(null!=l.from&&(r=et(t?o:qe(o),l.from),-1==e))return r;if(null!=l.to&&(n=et(t?o:qe(o),l.to),1==e))return n}return r&&{from:r,to:n}},xo.prototype.changed=function(){var e=this,t=this.find(-1,!0),r=this,n=this.doc.cm;t&&n&&qn(n,function(){var i=t.line,o=qe(t.line),l=Ar(n,o);if(l&&(Ir(l),n.curOp.selectionChanged=n.curOp.forceUpdate=!0),n.curOp.updateMaxLine=!0,!Gt(r.doc,i)&&null!=r.height){var s=r.height;r.height=null;var a=wr(r)-s;a&&$e(i,i.height+a)}sr(n,\"markerChanged\",n,e)})},xo.prototype.attachLine=function(e){if(!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;t.maybeHiddenMarkers&&-1!=B(t.maybeHiddenMarkers,this)||(t.maybeUnhiddenMarkers||(t.maybeUnhiddenMarkers=[])).push(this)}this.lines.push(e)},xo.prototype.detachLine=function(e){if(this.lines.splice(B(this.lines,e),1),!this.lines.length&&this.doc.cm){var t=this.doc.cm.curOp;(t.maybeHiddenMarkers||(t.maybeHiddenMarkers=[])).push(this)}},be(xo);var So=function(e,t){this.markers=e,this.primary=t;for(var r=0;r<e.length;++r)e[r].parent=this};function Lo(e){return e.findMarks(et(e.first,0),e.clipPos(et(e.lastLine())),function(e){return e.parent})}function ko(e){for(var t=function(t){var r=e[t],n=[r.primary.doc];Ai(r.primary.doc,function(e){return n.push(e)});for(var i=0;i<r.markers.length;i++){var o=r.markers[i];-1==B(n,o.doc)&&(o.parent=null,r.markers.splice(i--,1))}},r=0;r<e.length;r++)t(r)}So.prototype.clear=function(){if(!this.explicitlyCleared){this.explicitlyCleared=!0;for(var e=0;e<this.markers.length;++e)this.markers[e].clear();sr(this,\"clear\")}},So.prototype.find=function(e,t){return this.primary.find(e,t)},be(So);var To=0,Mo=function(e,t,r,n,i){if(!(this instanceof Mo))return new Mo(e,t,r,n,i);null==r&&(r=0),mo.call(this,[new vo([new Xt(\"\",null)])]),this.first=r,this.scrollTop=this.scrollLeft=0,this.cantEdit=!1,this.cleanGeneration=1,this.modeFrontier=this.highlightFrontier=r;var o=et(r,0);this.sel=xi(o),this.history=new Hi(null),this.id=++To,this.modeOption=t,this.lineSep=n,this.direction=\"rtl\"==i?\"rtl\":\"ltr\",this.extend=!1,\"string\"==typeof e&&(e=this.splitLines(e)),Oi(this,{from:o,to:o,text:e}),$i(this,xi(o),V)};Mo.prototype=Q(mo.prototype,{constructor:Mo,iter:function(e,t,r){r?this.iterN(e-this.first,t-e,r):this.iterN(this.first,this.first+this.size,e)},insert:function(e,t){for(var r=0,n=0;n<t.length;++n)r+=t[n].height;this.insertInner(e-this.first,t,r)},remove:function(e,t){this.removeInner(e-this.first,t)},getValue:function(e){var t=_e(this,this.first,this.first+this.size);return!1===e?t:t.join(e||this.lineSeparator())},setValue:Jn(function(e){var t=et(this.first,0),r=this.first+this.size-1;oo(this,{from:t,to:et(r,Xe(this,r).text.length),text:this.splitLines(e),origin:\"setValue\",full:!0},!0),this.cm&&An(this.cm,0,0),$i(this,xi(t),V)}),replaceRange:function(e,t,r,n){co(this,e,t=st(this,t),r=r?st(this,r):t,n)},getRange:function(e,t,r){var n=Ye(this,st(this,e),st(this,t));return!1===r?n:n.join(r||this.lineSeparator())},getLine:function(e){var t=this.getLineHandle(e);return t&&t.text},getLineHandle:function(e){if(Qe(this,e))return Xe(this,e)},getLineNumber:function(e){return qe(e)},getLineHandleVisualStart:function(e){return\"number\"==typeof e&&(e=Xe(this,e)),zt(e)},lineCount:function(){return this.size},firstLine:function(){return this.first},lastLine:function(){return this.first+this.size-1},clipPos:function(e){return st(this,e)},getCursor:function(e){var t=this.sel.primary();return null==e||\"head\"==e?t.head:\"anchor\"==e?t.anchor:\"end\"==e||\"to\"==e||!1===e?t.to():t.from()},listSelections:function(){return this.sel.ranges},somethingSelected:function(){return this.sel.somethingSelected()},setCursor:Jn(function(e,t,r){Yi(this,st(this,\"number\"==typeof e?et(e,t||0):e),null,r)}),setSelection:Jn(function(e,t,r){Yi(this,st(this,e),st(this,t||e),r)}),extendSelection:Jn(function(e,t,r){Ki(this,st(this,e),t&&st(this,t),r)}),extendSelections:Jn(function(e,t){ji(this,at(this,e),t)}),extendSelectionsBy:Jn(function(e,t){ji(this,at(this,q(this.sel.ranges,e)),t)}),setSelections:Jn(function(e,t,r){if(e.length){for(var n=[],i=0;i<e.length;i++)n[i]=new bi(st(this,e[i].anchor),st(this,e[i].head));null==t&&(t=Math.min(e.length-1,this.sel.primIndex)),$i(this,wi(this.cm,n,t),r)}}),addSelection:Jn(function(e,t,r){var n=this.sel.ranges.slice(0);n.push(new bi(st(this,e),st(this,t||e))),$i(this,wi(this.cm,n,n.length-1),r)}),getSelection:function(e){for(var t,r=this.sel.ranges,n=0;n<r.length;n++){var i=Ye(this,r[n].from(),r[n].to());t=t?t.concat(i):i}return!1===e?t:t.join(e||this.lineSeparator())},getSelections:function(e){for(var t=[],r=this.sel.ranges,n=0;n<r.length;n++){var i=Ye(this,r[n].from(),r[n].to());!1!==e&&(i=i.join(e||this.lineSeparator())),t[n]=i}return t},replaceSelection:function(e,t,r){for(var n=[],i=0;i<this.sel.ranges.length;i++)n[i]=e;this.replaceSelections(n,t,r||\"+input\")},replaceSelections:Jn(function(e,t,r){for(var n=[],i=this.sel,o=0;o<i.ranges.length;o++){var l=i.ranges[o];n[o]={from:l.from(),to:l.to(),text:this.splitLines(e[o]),origin:r}}for(var s=t&&\"end\"!=t&&function(e,t,r){for(var n=[],i=et(e.first,0),o=i,l=0;l<t.length;l++){var s=t[l],a=ki(s.from,i,o),u=ki(Ci(s),i,o);if(i=s.to,o=u,\"around\"==r){var c=e.sel.ranges[l],h=tt(c.head,c.anchor)<0;n[l]=new bi(h?u:a,h?a:u)}else n[l]=new bi(a,a)}return new yi(n,e.sel.primIndex)}(this,n,t),a=n.length-1;a>=0;a--)oo(this,n[a]);s?_i(this,s):this.cm&&On(this.cm)}),undo:Jn(function(){so(this,\"undo\")}),redo:Jn(function(){so(this,\"redo\")}),undoSelection:Jn(function(){so(this,\"undo\",!0)}),redoSelection:Jn(function(){so(this,\"redo\",!0)}),setExtending:function(e){this.extend=e},getExtending:function(){return this.extend},historySize:function(){for(var e=this.history,t=0,r=0,n=0;n<e.done.length;n++)e.done[n].ranges||++t;for(var i=0;i<e.undone.length;i++)e.undone[i].ranges||++r;return{undo:t,redo:r}},clearHistory:function(){this.history=new Hi(this.history.maxGeneration)},markClean:function(){this.cleanGeneration=this.changeGeneration(!0)},changeGeneration:function(e){return e&&(this.history.lastOp=this.history.lastSelOp=this.history.lastOrigin=null),this.history.generation},isClean:function(e){return this.history.generation==(e||this.cleanGeneration)},getHistory:function(){return{done:Ui(this.history.done),undone:Ui(this.history.undone)}},setHistory:function(e){var t=this.history=new Hi(this.history.maxGeneration);t.done=Ui(e.done.slice(0),null,!0),t.undone=Ui(e.undone.slice(0),null,!0)},setGutterMarker:Jn(function(e,t,r){return go(this,e,\"gutter\",function(e){var n=e.gutterMarkers||(e.gutterMarkers={});return n[t]=r,!r&&re(n)&&(e.gutterMarkers=null),!0})}),clearGutter:Jn(function(e){var t=this;this.iter(function(r){r.gutterMarkers&&r.gutterMarkers[e]&&go(t,r,\"gutter\",function(){return r.gutterMarkers[e]=null,re(r.gutterMarkers)&&(r.gutterMarkers=null),!0})})}),lineInfo:function(e){var t;if(\"number\"==typeof e){if(!Qe(this,e))return null;if(t=e,!(e=Xe(this,e)))return null}else if(null==(t=qe(e)))return null;return{line:t,handle:e,text:e.text,gutterMarkers:e.gutterMarkers,textClass:e.textClass,bgClass:e.bgClass,wrapClass:e.wrapClass,widgets:e.widgets}},addLineClass:Jn(function(e,t,r){return go(this,e,\"gutter\"==t?\"gutter\":\"class\",function(e){var n=\"text\"==t?\"textClass\":\"background\"==t?\"bgClass\":\"gutter\"==t?\"gutterClass\":\"wrapClass\";if(e[n]){if(L(r).test(e[n]))return!1;e[n]+=\" \"+r}else e[n]=r;return!0})}),removeLineClass:Jn(function(e,t,r){return go(this,e,\"gutter\"==t?\"gutter\":\"class\",function(e){var n=\"text\"==t?\"textClass\":\"background\"==t?\"bgClass\":\"gutter\"==t?\"gutterClass\":\"wrapClass\",i=e[n];if(!i)return!1;if(null==r)e[n]=null;else{var o=i.match(L(r));if(!o)return!1;var l=o.index+o[0].length;e[n]=i.slice(0,o.index)+(o.index&&l!=i.length?\" \":\"\")+i.slice(l)||null}return!0})}),addLineWidget:Jn(function(e,t,r){return function(e,t,r,n){var i=new yo(e,r,n),o=e.cm;return o&&i.noHScroll&&(o.display.alignWidgets=!0),go(e,t,\"widget\",function(t){var r=t.widgets||(t.widgets=[]);if(null==i.insertAt?r.push(i):r.splice(Math.min(r.length-1,Math.max(0,i.insertAt)),0,i),i.line=t,o&&!Gt(e,t)){var n=Vt(t)<e.scrollTop;$e(t,t.height+wr(i)),n&&Nn(o,i.height),o.curOp.forceUpdate=!0}return!0}),o&&sr(o,\"lineWidgetAdded\",o,i,\"number\"==typeof t?t:qe(t)),i}(this,e,t,r)}),removeLineWidget:function(e){e.clear()},markText:function(e,t,r){return Co(this,st(this,e),st(this,t),r,r&&r.type||\"range\")},setBookmark:function(e,t){var r={replacedWith:t&&(null==t.nodeType?t.widget:t),insertLeft:t&&t.insertLeft,clearWhenEmpty:!1,shared:t&&t.shared,handleMouseEvents:t&&t.handleMouseEvents};return Co(this,e=st(this,e),e,r,\"bookmark\")},findMarksAt:function(e){var t=[],r=Xe(this,(e=st(this,e)).line).markedSpans;if(r)for(var n=0;n<r.length;++n){var i=r[n];(null==i.from||i.from<=e.ch)&&(null==i.to||i.to>=e.ch)&&t.push(i.marker.parent||i.marker)}return t},findMarks:function(e,t,r){e=st(this,e),t=st(this,t);var n=[],i=e.line;return this.iter(e.line,t.line+1,function(o){var l=o.markedSpans;if(l)for(var s=0;s<l.length;s++){var a=l[s];null!=a.to&&i==e.line&&e.ch>=a.to||null==a.from&&i!=e.line||null!=a.from&&i==t.line&&a.from>=t.ch||r&&!r(a.marker)||n.push(a.marker.parent||a.marker)}++i}),n},getAllMarks:function(){var e=[];return this.iter(function(t){var r=t.markedSpans;if(r)for(var n=0;n<r.length;++n)null!=r[n].from&&e.push(r[n].marker)}),e},posFromIndex:function(e){var t,r=this.first,n=this.lineSeparator().length;return this.iter(function(i){var o=i.text.length+n;if(o>e)return t=e,!0;e-=o,++r}),st(this,et(r,t))},indexFromPos:function(e){var t=(e=st(this,e)).ch;if(e.line<this.first||e.ch<0)return 0;var r=this.lineSeparator().length;return this.iter(this.first,e.line,function(e){t+=e.text.length+r}),t},copy:function(e){var t=new Mo(_e(this,this.first,this.first+this.size),this.modeOption,this.first,this.lineSep,this.direction);return t.scrollTop=this.scrollTop,t.scrollLeft=this.scrollLeft,t.sel=this.sel,t.extend=!1,e&&(t.history.undoDepth=this.history.undoDepth,t.setHistory(this.getHistory())),t},linkedDoc:function(e){e||(e={});var t=this.first,r=this.first+this.size;null!=e.from&&e.from>t&&(t=e.from),null!=e.to&&e.to<r&&(r=e.to);var n=new Mo(_e(this,t,r),e.mode||this.modeOption,t,this.lineSep,this.direction);return e.sharedHist&&(n.history=this.history),(this.linked||(this.linked=[])).push({doc:n,sharedHist:e.sharedHist}),n.linked=[{doc:this,isParent:!0,sharedHist:e.sharedHist}],function(e,t){for(var r=0;r<t.length;r++){var n=t[r],i=n.find(),o=e.clipPos(i.from),l=e.clipPos(i.to);if(tt(o,l)){var s=Co(e,o,l,n.primary,n.primary.type);n.markers.push(s),s.parent=n}}}(n,Lo(this)),n},unlinkDoc:function(e){if(e instanceof Sl&&(e=e.doc),this.linked)for(var t=0;t<this.linked.length;++t){if(this.linked[t].doc==e){this.linked.splice(t,1),e.unlinkDoc(this),ko(Lo(this));break}}if(e.history==this.history){var r=[e.id];Ai(e,function(e){return r.push(e.id)},!0),e.history=new Hi(null),e.history.done=Ui(this.history.done,r),e.history.undone=Ui(this.history.undone,r)}},iterLinkedDocs:function(e){Ai(this,e)},getMode:function(){return this.mode},getEditor:function(){return this.cm},splitLines:function(e){return this.lineSep?e.split(this.lineSep):We(e)},lineSeparator:function(){return this.lineSep||\"\\n\"},setDirection:Jn(function(e){var t;(\"rtl\"!=e&&(e=\"ltr\"),e!=this.direction)&&(this.direction=e,this.iter(function(e){return e.order=null}),this.cm&&qn(t=this.cm,function(){Wi(t),un(t)}))})}),Mo.prototype.eachLine=Mo.prototype.iter;var No=0;function Oo(e){var t=this;if(Ao(t),!ve(t,e)&&!xr(t.display,e)){we(e),l&&(No=+new Date);var r=sn(t,e,!0),n=e.dataTransfer.files;if(r&&!t.isReadOnly())if(n&&n.length&&window.FileReader&&window.File)for(var i=n.length,o=Array(i),s=0,a=function(e,n){if(!t.options.allowDropFileTypes||-1!=B(t.options.allowDropFileTypes,e.type)){var l=new FileReader;l.onload=Zn(t,function(){var e=l.result;if(/[\\x00-\\x08\\x0e-\\x1f]{2}/.test(e)&&(e=\"\"),o[n]=e,++s==i){var a={from:r=st(t.doc,r),to:r,text:t.doc.splitLines(o.join(t.doc.lineSeparator())),origin:\"paste\"};oo(t.doc,a),_i(t.doc,xi(r,Ci(a)))}}),l.readAsText(e)}},u=0;u<i;++u)a(n[u],u);else{if(t.state.draggingText&&t.doc.sel.contains(r)>-1)return t.state.draggingText(e),void setTimeout(function(){return t.display.input.focus()},20);try{var c=e.dataTransfer.getData(\"Text\");if(c){var h;if(t.state.draggingText&&!t.state.draggingText.copy&&(h=t.listSelections()),qi(t.doc,xi(r,r)),h)for(var f=0;f<h.length;++f)co(t.doc,\"\",h[f].anchor,h[f].head,\"drag\");t.replaceSelection(c,\"around\",\"paste\"),t.display.input.focus()}}catch(e){}}}}function Ao(e){e.display.dragCursor&&(e.display.lineSpace.removeChild(e.display.dragCursor),e.display.dragCursor=null)}function Do(e){if(document.getElementsByClassName){for(var t=document.getElementsByClassName(\"CodeMirror\"),r=[],n=0;n<t.length;n++){var i=t[n].CodeMirror;i&&r.push(i)}r.length&&r[0].operation(function(){for(var t=0;t<r.length;t++)e(r[t])})}}var Wo=!1;function Ho(){var e;Wo||(fe(window,\"resize\",function(){null==e&&(e=setTimeout(function(){e=null,Do(Fo)},100))}),fe(window,\"blur\",function(){return Do(Sn)}),Wo=!0)}function Fo(e){var t=e.display;t.cachedCharWidth=t.cachedTextHeight=t.cachedPaddingH=null,t.scrollbarsClipped=!1,e.setSize()}for(var Po={3:\"Pause\",8:\"Backspace\",9:\"Tab\",13:\"Enter\",16:\"Shift\",17:\"Ctrl\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Esc\",32:\"Space\",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"Left\",38:\"Up\",39:\"Right\",40:\"Down\",44:\"PrintScrn\",45:\"Insert\",46:\"Delete\",59:\";\",61:\"=\",91:\"Mod\",92:\"Mod\",93:\"Mod\",106:\"*\",107:\"=\",109:\"-\",110:\".\",111:\"/\",145:\"ScrollLock\",173:\"-\",186:\";\",187:\"=\",188:\",\",189:\"-\",190:\".\",191:\"/\",192:\"`\",219:\"[\",220:\"\\\\\",221:\"]\",222:\"'\",63232:\"Up\",63233:\"Down\",63234:\"Left\",63235:\"Right\",63272:\"Delete\",63273:\"Home\",63275:\"End\",63276:\"PageUp\",63277:\"PageDown\",63302:\"Insert\"},Eo=0;Eo<10;Eo++)Po[Eo+48]=Po[Eo+96]=String(Eo);for(var Io=65;Io<=90;Io++)Po[Io]=String.fromCharCode(Io);for(var zo=1;zo<=12;zo++)Po[zo+111]=Po[zo+63235]=\"F\"+zo;var Ro={};function Bo(e){var t,r,n,i,o=e.split(/-(?!$)/);e=o[o.length-1];for(var l=0;l<o.length-1;l++){var s=o[l];if(/^(cmd|meta|m)$/i.test(s))i=!0;else if(/^a(lt)?$/i.test(s))t=!0;else if(/^(c|ctrl|control)$/i.test(s))r=!0;else{if(!/^s(hift)?$/i.test(s))throw new Error(\"Unrecognized modifier name: \"+s);n=!0}}return t&&(e=\"Alt-\"+e),r&&(e=\"Ctrl-\"+e),i&&(e=\"Cmd-\"+e),n&&(e=\"Shift-\"+e),e}function Go(e){var t={};for(var r in e)if(e.hasOwnProperty(r)){var n=e[r];if(/^(name|fallthrough|(de|at)tach)$/.test(r))continue;if(\"...\"==n){delete e[r];continue}for(var i=q(r.split(\" \"),Bo),o=0;o<i.length;o++){var l=void 0,s=void 0;o==i.length-1?(s=i.join(\" \"),l=n):(s=i.slice(0,o+1).join(\" \"),l=\"...\");var a=t[s];if(a){if(a!=l)throw new Error(\"Inconsistent bindings for \"+s)}else t[s]=l}delete e[r]}for(var u in t)e[u]=t[u];return e}function Uo(e,t,r,n){var i=(t=Xo(t)).call?t.call(e,n):t[e];if(!1===i)return\"nothing\";if(\"...\"===i)return\"multi\";if(null!=i&&r(i))return\"handled\";if(t.fallthrough){if(\"[object Array]\"!=Object.prototype.toString.call(t.fallthrough))return Uo(e,t.fallthrough,r,n);for(var o=0;o<t.fallthrough.length;o++){var l=Uo(e,t.fallthrough[o],r,n);if(l)return l}}}function Vo(e){var t=\"string\"==typeof e?e:Po[e.keyCode];return\"Ctrl\"==t||\"Alt\"==t||\"Shift\"==t||\"Mod\"==t}function Ko(e,t,r){var n=e;return t.altKey&&\"Alt\"!=n&&(e=\"Alt-\"+e),(C?t.metaKey:t.ctrlKey)&&\"Ctrl\"!=n&&(e=\"Ctrl-\"+e),(C?t.ctrlKey:t.metaKey)&&\"Cmd\"!=n&&(e=\"Cmd-\"+e),!r&&t.shiftKey&&\"Shift\"!=n&&(e=\"Shift-\"+e),e}function jo(e,t){if(h&&34==e.keyCode&&e.char)return!1;var r=Po[e.keyCode];return null!=r&&!e.altGraphKey&&(3==e.keyCode&&e.code&&(r=e.code),Ko(r,e,t))}function Xo(e){return\"string\"==typeof e?Ro[e]:e}function Yo(e,t){for(var r=e.doc.sel.ranges,n=[],i=0;i<r.length;i++){for(var o=t(r[i]);n.length&&tt(o.from,$(n).to)<=0;){var l=n.pop();if(tt(l.from,o.from)<0){o.from=l.from;break}}n.push(o)}qn(e,function(){for(var t=n.length-1;t>=0;t--)co(e.doc,\"\",n[t].from,n[t].to,\"+delete\");On(e)})}function _o(e,t,r){var n=oe(e.text,t+r,r);return n<0||n>e.text.length?null:n}function $o(e,t,r){var n=_o(e,t.ch,r);return null==n?null:new et(t.line,n,r<0?\"after\":\"before\")}function qo(e,t,r,n,i){if(e){var o=ce(r,t.doc.direction);if(o){var l,s=i<0?$(o):o[0],a=i<0==(1==s.level)?\"after\":\"before\";if(s.level>0||\"rtl\"==t.doc.direction){var u=Dr(t,r);l=i<0?r.text.length-1:0;var c=Wr(t,u,l).top;l=le(function(e){return Wr(t,u,e).top==c},i<0==(1==s.level)?s.from:s.to-1,l),\"before\"==a&&(l=_o(r,l,1))}else l=i<0?s.to:s.from;return new et(n,l,a)}}return new et(n,i<0?r.text.length:0,i<0?\"before\":\"after\")}Ro.basic={Left:\"goCharLeft\",Right:\"goCharRight\",Up:\"goLineUp\",Down:\"goLineDown\",End:\"goLineEnd\",Home:\"goLineStartSmart\",PageUp:\"goPageUp\",PageDown:\"goPageDown\",Delete:\"delCharAfter\",Backspace:\"delCharBefore\",\"Shift-Backspace\":\"delCharBefore\",Tab:\"defaultTab\",\"Shift-Tab\":\"indentAuto\",Enter:\"newlineAndIndent\",Insert:\"toggleOverwrite\",Esc:\"singleSelection\"},Ro.pcDefault={\"Ctrl-A\":\"selectAll\",\"Ctrl-D\":\"deleteLine\",\"Ctrl-Z\":\"undo\",\"Shift-Ctrl-Z\":\"redo\",\"Ctrl-Y\":\"redo\",\"Ctrl-Home\":\"goDocStart\",\"Ctrl-End\":\"goDocEnd\",\"Ctrl-Up\":\"goLineUp\",\"Ctrl-Down\":\"goLineDown\",\"Ctrl-Left\":\"goGroupLeft\",\"Ctrl-Right\":\"goGroupRight\",\"Alt-Left\":\"goLineStart\",\"Alt-Right\":\"goLineEnd\",\"Ctrl-Backspace\":\"delGroupBefore\",\"Ctrl-Delete\":\"delGroupAfter\",\"Ctrl-S\":\"save\",\"Ctrl-F\":\"find\",\"Ctrl-G\":\"findNext\",\"Shift-Ctrl-G\":\"findPrev\",\"Shift-Ctrl-F\":\"replace\",\"Shift-Ctrl-R\":\"replaceAll\",\"Ctrl-[\":\"indentLess\",\"Ctrl-]\":\"indentMore\",\"Ctrl-U\":\"undoSelection\",\"Shift-Ctrl-U\":\"redoSelection\",\"Alt-U\":\"redoSelection\",fallthrough:\"basic\"},Ro.emacsy={\"Ctrl-F\":\"goCharRight\",\"Ctrl-B\":\"goCharLeft\",\"Ctrl-P\":\"goLineUp\",\"Ctrl-N\":\"goLineDown\",\"Alt-F\":\"goWordRight\",\"Alt-B\":\"goWordLeft\",\"Ctrl-A\":\"goLineStart\",\"Ctrl-E\":\"goLineEnd\",\"Ctrl-V\":\"goPageDown\",\"Shift-Ctrl-V\":\"goPageUp\",\"Ctrl-D\":\"delCharAfter\",\"Ctrl-H\":\"delCharBefore\",\"Alt-D\":\"delWordAfter\",\"Alt-Backspace\":\"delWordBefore\",\"Ctrl-K\":\"killLine\",\"Ctrl-T\":\"transposeChars\",\"Ctrl-O\":\"openLine\"},Ro.macDefault={\"Cmd-A\":\"selectAll\",\"Cmd-D\":\"deleteLine\",\"Cmd-Z\":\"undo\",\"Shift-Cmd-Z\":\"redo\",\"Cmd-Y\":\"redo\",\"Cmd-Home\":\"goDocStart\",\"Cmd-Up\":\"goDocStart\",\"Cmd-End\":\"goDocEnd\",\"Cmd-Down\":\"goDocEnd\",\"Alt-Left\":\"goGroupLeft\",\"Alt-Right\":\"goGroupRight\",\"Cmd-Left\":\"goLineLeft\",\"Cmd-Right\":\"goLineRight\",\"Alt-Backspace\":\"delGroupBefore\",\"Ctrl-Alt-Backspace\":\"delGroupAfter\",\"Alt-Delete\":\"delGroupAfter\",\"Cmd-S\":\"save\",\"Cmd-F\":\"find\",\"Cmd-G\":\"findNext\",\"Shift-Cmd-G\":\"findPrev\",\"Cmd-Alt-F\":\"replace\",\"Shift-Cmd-Alt-F\":\"replaceAll\",\"Cmd-[\":\"indentLess\",\"Cmd-]\":\"indentMore\",\"Cmd-Backspace\":\"delWrappedLineLeft\",\"Cmd-Delete\":\"delWrappedLineRight\",\"Cmd-U\":\"undoSelection\",\"Shift-Cmd-U\":\"redoSelection\",\"Ctrl-Up\":\"goDocStart\",\"Ctrl-Down\":\"goDocEnd\",fallthrough:[\"basic\",\"emacsy\"]},Ro.default=y?Ro.macDefault:Ro.pcDefault;var Zo={selectAll:no,singleSelection:function(e){return e.setSelection(e.getCursor(\"anchor\"),e.getCursor(\"head\"),V)},killLine:function(e){return Yo(e,function(t){if(t.empty()){var r=Xe(e.doc,t.head.line).text.length;return t.head.ch==r&&t.head.line<e.lastLine()?{from:t.head,to:et(t.head.line+1,0)}:{from:t.head,to:et(t.head.line,r)}}return{from:t.from(),to:t.to()}})},deleteLine:function(e){return Yo(e,function(t){return{from:et(t.from().line,0),to:st(e.doc,et(t.to().line+1,0))}})},delLineLeft:function(e){return Yo(e,function(e){return{from:et(e.from().line,0),to:e.from()}})},delWrappedLineLeft:function(e){return Yo(e,function(t){var r=e.charCoords(t.head,\"div\").top+5;return{from:e.coordsChar({left:0,top:r},\"div\"),to:t.from()}})},delWrappedLineRight:function(e){return Yo(e,function(t){var r=e.charCoords(t.head,\"div\").top+5,n=e.coordsChar({left:e.display.lineDiv.offsetWidth+100,top:r},\"div\");return{from:t.from(),to:n}})},undo:function(e){return e.undo()},redo:function(e){return e.redo()},undoSelection:function(e){return e.undoSelection()},redoSelection:function(e){return e.redoSelection()},goDocStart:function(e){return e.extendSelection(et(e.firstLine(),0))},goDocEnd:function(e){return e.extendSelection(et(e.lastLine()))},goLineStart:function(e){return e.extendSelectionsBy(function(t){return Qo(e,t.head.line)},{origin:\"+move\",bias:1})},goLineStartSmart:function(e){return e.extendSelectionsBy(function(t){return Jo(e,t.head)},{origin:\"+move\",bias:1})},goLineEnd:function(e){return e.extendSelectionsBy(function(t){return function(e,t){var r=Xe(e.doc,t),n=function(e){for(var t;t=Pt(e);)e=t.find(1,!0).line;return e}(r);n!=r&&(t=qe(n));return qo(!0,e,r,t,-1)}(e,t.head.line)},{origin:\"+move\",bias:-1})},goLineRight:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,\"div\").top+5;return e.coordsChar({left:e.display.lineDiv.offsetWidth+100,top:r},\"div\")},j)},goLineLeft:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,\"div\").top+5;return e.coordsChar({left:0,top:r},\"div\")},j)},goLineLeftSmart:function(e){return e.extendSelectionsBy(function(t){var r=e.cursorCoords(t.head,\"div\").top+5,n=e.coordsChar({left:0,top:r},\"div\");return n.ch<e.getLine(n.line).search(/\\S/)?Jo(e,t.head):n},j)},goLineUp:function(e){return e.moveV(-1,\"line\")},goLineDown:function(e){return e.moveV(1,\"line\")},goPageUp:function(e){return e.moveV(-1,\"page\")},goPageDown:function(e){return e.moveV(1,\"page\")},goCharLeft:function(e){return e.moveH(-1,\"char\")},goCharRight:function(e){return e.moveH(1,\"char\")},goColumnLeft:function(e){return e.moveH(-1,\"column\")},goColumnRight:function(e){return e.moveH(1,\"column\")},goWordLeft:function(e){return e.moveH(-1,\"word\")},goGroupRight:function(e){return e.moveH(1,\"group\")},goGroupLeft:function(e){return e.moveH(-1,\"group\")},goWordRight:function(e){return e.moveH(1,\"word\")},delCharBefore:function(e){return e.deleteH(-1,\"char\")},delCharAfter:function(e){return e.deleteH(1,\"char\")},delWordBefore:function(e){return e.deleteH(-1,\"word\")},delWordAfter:function(e){return e.deleteH(1,\"word\")},delGroupBefore:function(e){return e.deleteH(-1,\"group\")},delGroupAfter:function(e){return e.deleteH(1,\"group\")},indentAuto:function(e){return e.indentSelection(\"smart\")},indentMore:function(e){return e.indentSelection(\"add\")},indentLess:function(e){return e.indentSelection(\"subtract\")},insertTab:function(e){return e.replaceSelection(\"\\t\")},insertSoftTab:function(e){for(var t=[],r=e.listSelections(),n=e.options.tabSize,i=0;i<r.length;i++){var o=r[i].from(),l=z(e.getLine(o.line),o.ch,n);t.push(_(n-l%n))}e.replaceSelections(t)},defaultTab:function(e){e.somethingSelected()?e.indentSelection(\"add\"):e.execCommand(\"insertTab\")},transposeChars:function(e){return qn(e,function(){for(var t=e.listSelections(),r=[],n=0;n<t.length;n++)if(t[n].empty()){var i=t[n].head,o=Xe(e.doc,i.line).text;if(o)if(i.ch==o.length&&(i=new et(i.line,i.ch-1)),i.ch>0)i=new et(i.line,i.ch+1),e.replaceRange(o.charAt(i.ch-1)+o.charAt(i.ch-2),et(i.line,i.ch-2),i,\"+transpose\");else if(i.line>e.doc.first){var l=Xe(e.doc,i.line-1).text;l&&(i=new et(i.line,1),e.replaceRange(o.charAt(0)+e.doc.lineSeparator()+l.charAt(l.length-1),et(i.line-1,l.length-1),i,\"+transpose\"))}r.push(new bi(i,i))}e.setSelections(r)})},newlineAndIndent:function(e){return qn(e,function(){for(var t=e.listSelections(),r=t.length-1;r>=0;r--)e.replaceRange(e.doc.lineSeparator(),t[r].anchor,t[r].head,\"+input\");t=e.listSelections();for(var n=0;n<t.length;n++)e.indentLine(t[n].from().line,null,!0);On(e)})},openLine:function(e){return e.replaceSelection(\"\\n\",\"start\")},toggleOverwrite:function(e){return e.toggleOverwrite()}};function Qo(e,t){var r=Xe(e.doc,t),n=zt(r);return n!=r&&(t=qe(n)),qo(!0,e,n,t,1)}function Jo(e,t){var r=Qo(e,t.line),n=Xe(e.doc,r.line),i=ce(n,e.doc.direction);if(!i||0==i[0].level){var o=Math.max(0,n.text.search(/\\S/)),l=t.line==r.line&&t.ch<=o&&t.ch;return et(r.line,l?0:o,r.sticky)}return r}function el(e,t,r){if(\"string\"==typeof t&&!(t=Zo[t]))return!1;e.display.input.ensurePolled();var n=e.display.shift,i=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),r&&(e.display.shift=!1),i=t(e)!=U}finally{e.display.shift=n,e.state.suppressEdits=!1}return i}var tl=new R;function rl(e,t,r,n){var i=e.state.keySeq;if(i){if(Vo(t))return\"handled\";if(/\\'$/.test(t)?e.state.keySeq=null:tl.set(50,function(){e.state.keySeq==i&&(e.state.keySeq=null,e.display.input.reset())}),nl(e,i+\" \"+t,r,n))return!0}return nl(e,t,r,n)}function nl(e,t,r,n){var i=function(e,t,r){for(var n=0;n<e.state.keyMaps.length;n++){var i=Uo(t,e.state.keyMaps[n],r,e);if(i)return i}return e.options.extraKeys&&Uo(t,e.options.extraKeys,r,e)||Uo(t,e.options.keyMap,r,e)}(e,t,n);return\"multi\"==i&&(e.state.keySeq=t),\"handled\"==i&&sr(e,\"keyHandled\",e,t,r),\"handled\"!=i&&\"multi\"!=i||(we(r),bn(e)),!!i}function il(e,t){var r=jo(t,!0);return!!r&&(t.shiftKey&&!e.state.keySeq?rl(e,\"Shift-\"+r,t,function(t){return el(e,t,!0)})||rl(e,r,t,function(t){if(\"string\"==typeof t?/^go[A-Z]/.test(t):t.motion)return el(e,t)}):rl(e,r,t,function(t){return el(e,t)}))}var ol=null;function ll(e){var t=this;if(t.curOp.focus=W(),!ve(t,e)){l&&s<11&&27==e.keyCode&&(e.returnValue=!1);var r=e.keyCode;t.display.shift=16==r||e.shiftKey;var n=il(t,e);h&&(ol=n?r:null,!n&&88==r&&!Fe&&(y?e.metaKey:e.ctrlKey)&&t.replaceSelection(\"\",null,\"cut\")),18!=r||/\\bCodeMirror-crosshair\\b/.test(t.display.lineDiv.className)||function(e){var t=e.display.lineDiv;function r(e){18!=e.keyCode&&e.altKey||(T(t,\"CodeMirror-crosshair\"),pe(document,\"keyup\",r),pe(document,\"mouseover\",r))}H(t,\"CodeMirror-crosshair\"),fe(document,\"keyup\",r),fe(document,\"mouseover\",r)}(t)}}function sl(e){16==e.keyCode&&(this.doc.sel.shift=!1),ve(this,e)}function al(e){var t=this;if(!(xr(t.display,e)||ve(t,e)||e.ctrlKey&&!e.altKey||y&&e.metaKey)){var r=e.keyCode,n=e.charCode;if(h&&r==ol)return ol=null,void we(e);if(!h||e.which&&!(e.which<10)||!il(t,e)){var i=String.fromCharCode(null==n?r:n);\"\\b\"!=i&&(function(e,t,r){return rl(e,\"'\"+r+\"'\",t,function(t){return el(e,t,!0)})}(t,e,i)||t.display.input.onKeyPress(e))}}}var ul,cl,hl=function(e,t,r){this.time=e,this.pos=t,this.button=r};function fl(e){var t=this,r=t.display;if(!(ve(t,e)||r.activeTouch&&r.input.supportsTouch()))if(r.input.ensurePolled(),r.shift=e.shiftKey,xr(r,e))a||(r.scroller.draggable=!1,setTimeout(function(){return r.scroller.draggable=!0},100));else if(!gl(t,e)){var n=sn(t,e),i=ke(e),o=n?function(e,t){var r=+new Date;return cl&&cl.compare(r,e,t)?(ul=cl=null,\"triple\"):ul&&ul.compare(r,e,t)?(cl=new hl(r,e,t),ul=null,\"double\"):(ul=new hl(r,e,t),cl=null,\"single\")}(n,i):\"single\";window.focus(),1==i&&t.state.selectingText&&t.state.selectingText(e),n&&function(e,t,r,n,i){var o=\"Click\";\"double\"==n?o=\"Double\"+o:\"triple\"==n&&(o=\"Triple\"+o);return rl(e,Ko(o=(1==t?\"Left\":2==t?\"Middle\":\"Right\")+o,i),i,function(t){if(\"string\"==typeof t&&(t=Zo[t]),!t)return!1;var n=!1;try{e.isReadOnly()&&(e.state.suppressEdits=!0),n=t(e,r)!=U}finally{e.state.suppressEdits=!1}return n})}(t,i,n,o,e)||(1==i?n?function(e,t,r,n){l?setTimeout(E(wn,e),0):e.curOp.focus=W();var i,o=function(e,t,r){var n=e.getOption(\"configureMouse\"),i=n?n(e,t,r):{};if(null==i.unit){var o=b?r.shiftKey&&r.metaKey:r.altKey;i.unit=o?\"rectangle\":\"single\"==t?\"char\":\"double\"==t?\"word\":\"line\"}(null==i.extend||e.doc.extend)&&(i.extend=e.doc.extend||r.shiftKey);null==i.addNew&&(i.addNew=y?r.metaKey:r.ctrlKey);null==i.moveOnDrag&&(i.moveOnDrag=!(y?r.altKey:r.ctrlKey));return i}(e,r,n),u=e.doc.sel;e.options.dragDrop&&Ne&&!e.isReadOnly()&&\"single\"==r&&(i=u.contains(t))>-1&&(tt((i=u.ranges[i]).from(),t)<0||t.xRel>0)&&(tt(i.to(),t)>0||t.xRel<0)?function(e,t,r,n){var i=e.display,o=!1,u=Zn(e,function(t){a&&(i.scroller.draggable=!1),e.state.draggingText=!1,pe(i.wrapper.ownerDocument,\"mouseup\",u),pe(i.wrapper.ownerDocument,\"mousemove\",c),pe(i.scroller,\"dragstart\",h),pe(i.scroller,\"drop\",u),o||(we(t),n.addNew||Ki(e.doc,r,null,null,n.extend),a||l&&9==s?setTimeout(function(){i.wrapper.ownerDocument.body.focus(),i.input.focus()},20):i.input.focus())}),c=function(e){o=o||Math.abs(t.clientX-e.clientX)+Math.abs(t.clientY-e.clientY)>=10},h=function(){return o=!0};a&&(i.scroller.draggable=!0);e.state.draggingText=u,u.copy=!n.moveOnDrag,i.scroller.dragDrop&&i.scroller.dragDrop();fe(i.wrapper.ownerDocument,\"mouseup\",u),fe(i.wrapper.ownerDocument,\"mousemove\",c),fe(i.scroller,\"dragstart\",h),fe(i.scroller,\"drop\",u),xn(e),setTimeout(function(){return i.input.focus()},20)}(e,n,t,o):function(e,t,r,n){var i=e.display,o=e.doc;we(t);var l,s,a=o.sel,u=a.ranges;n.addNew&&!n.extend?(s=o.sel.contains(r),l=s>-1?u[s]:new bi(r,r)):(l=o.sel.primary(),s=o.sel.primIndex);if(\"rectangle\"==n.unit)n.addNew||(l=new bi(r,r)),r=sn(e,t,!0,!0),s=-1;else{var c=dl(e,r,n.unit);l=n.extend?Vi(l,c.anchor,c.head,n.extend):c}n.addNew?-1==s?(s=u.length,$i(o,wi(e,u.concat([l]),s),{scroll:!1,origin:\"*mouse\"})):u.length>1&&u[s].empty()&&\"char\"==n.unit&&!n.extend?($i(o,wi(e,u.slice(0,s).concat(u.slice(s+1)),0),{scroll:!1,origin:\"*mouse\"}),a=o.sel):Xi(o,s,l,K):(s=0,$i(o,new yi([l],0),K),a=o.sel);var h=r;function f(t){if(0!=tt(h,t))if(h=t,\"rectangle\"==n.unit){for(var i=[],u=e.options.tabSize,c=z(Xe(o,r.line).text,r.ch,u),f=z(Xe(o,t.line).text,t.ch,u),d=Math.min(c,f),p=Math.max(c,f),g=Math.min(r.line,t.line),v=Math.min(e.lastLine(),Math.max(r.line,t.line));g<=v;g++){var m=Xe(o,g).text,y=X(m,d,u);d==p?i.push(new bi(et(g,y),et(g,y))):m.length>y&&i.push(new bi(et(g,y),et(g,X(m,p,u))))}i.length||i.push(new bi(r,r)),$i(o,wi(e,a.ranges.slice(0,s).concat(i),s),{origin:\"*mouse\",scroll:!1}),e.scrollIntoView(t)}else{var b,w=l,x=dl(e,t,n.unit),C=w.anchor;tt(x.anchor,C)>0?(b=x.head,C=ot(w.from(),x.anchor)):(b=x.anchor,C=it(w.to(),x.head));var S=a.ranges.slice(0);S[s]=function(e,t){var r=t.anchor,n=t.head,i=Xe(e.doc,r.line);if(0==tt(r,n)&&r.sticky==n.sticky)return t;var o=ce(i);if(!o)return t;var l=ae(o,r.ch,r.sticky),s=o[l];if(s.from!=r.ch&&s.to!=r.ch)return t;var a,u=l+(s.from==r.ch==(1!=s.level)?0:1);if(0==u||u==o.length)return t;if(n.line!=r.line)a=(n.line-r.line)*(\"ltr\"==e.doc.direction?1:-1)>0;else{var c=ae(o,n.ch,n.sticky),h=c-l||(n.ch-r.ch)*(1==s.level?-1:1);a=c==u-1||c==u?h<0:h>0}var f=o[u+(a?-1:0)],d=a==(1==f.level),p=d?f.from:f.to,g=d?\"after\":\"before\";return r.ch==p&&r.sticky==g?t:new bi(new et(r.line,p,g),n)}(e,new bi(st(o,C),b)),$i(o,wi(e,S,s),K)}}var d=i.wrapper.getBoundingClientRect(),p=0;function g(t){e.state.selectingText=!1,p=1/0,t&&(we(t),i.input.focus()),pe(i.wrapper.ownerDocument,\"mousemove\",v),pe(i.wrapper.ownerDocument,\"mouseup\",m),o.history.lastSelOrigin=null}var v=Zn(e,function(t){0!==t.buttons&&ke(t)?function t(r){var l=++p;var s=sn(e,r,!0,\"rectangle\"==n.unit);if(!s)return;if(0!=tt(s,h)){e.curOp.focus=W(),f(s);var a=Tn(i,o);(s.line>=a.to||s.line<a.from)&&setTimeout(Zn(e,function(){p==l&&t(r)}),150)}else{var u=r.clientY<d.top?-20:r.clientY>d.bottom?20:0;u&&setTimeout(Zn(e,function(){p==l&&(i.scroller.scrollTop+=u,t(r))}),50)}}(t):g(t)}),m=Zn(e,g);e.state.selectingText=m,fe(i.wrapper.ownerDocument,\"mousemove\",v),fe(i.wrapper.ownerDocument,\"mouseup\",m)}(e,n,t,o)}(t,n,o,e):Le(e)==r.scroller&&we(e):2==i?(n&&Ki(t.doc,n),setTimeout(function(){return r.input.focus()},20)):3==i&&(S?t.display.input.onContextMenu(e):xn(t)))}}function dl(e,t,r){if(\"char\"==r)return new bi(t,t);if(\"word\"==r)return e.findWordAt(t);if(\"line\"==r)return new bi(et(t.line,0),st(e.doc,et(t.line+1,0)));var n=r(e,t);return new bi(n.from,n.to)}function pl(e,t,r,n){var i,o;if(t.touches)i=t.touches[0].clientX,o=t.touches[0].clientY;else try{i=t.clientX,o=t.clientY}catch(t){return!1}if(i>=Math.floor(e.display.gutters.getBoundingClientRect().right))return!1;n&&we(t);var l=e.display,s=l.lineDiv.getBoundingClientRect();if(o>s.bottom||!ye(e,r))return Ce(t);o-=s.top-l.viewOffset;for(var a=0;a<e.display.gutterSpecs.length;++a){var u=l.gutters.childNodes[a];if(u&&u.getBoundingClientRect().right>=i)return ge(e,r,e,Ze(e.doc,o),e.display.gutterSpecs[a].className,t),Ce(t)}}function gl(e,t){return pl(e,t,\"gutterClick\",!0)}function vl(e,t){xr(e.display,t)||function(e,t){if(!ye(e,\"gutterContextMenu\"))return!1;return pl(e,t,\"gutterContextMenu\",!1)}(e,t)||ve(e,t,\"contextmenu\")||S||e.display.input.onContextMenu(t)}function ml(e){e.display.wrapper.className=e.display.wrapper.className.replace(/\\s*cm-s-\\S+/g,\"\")+e.options.theme.replace(/(^|\\s)\\s*/g,\" cm-s-\"),Rr(e)}hl.prototype.compare=function(e,t,r){return this.time+400>e&&0==tt(t,this.pos)&&r==this.button};var yl={toString:function(){return\"CodeMirror.Init\"}},bl={},wl={};function xl(e,t,r){if(!t!=!(r&&r!=yl)){var n=e.display.dragFunctions,i=t?fe:pe;i(e.display.scroller,\"dragstart\",n.start),i(e.display.scroller,\"dragenter\",n.enter),i(e.display.scroller,\"dragover\",n.over),i(e.display.scroller,\"dragleave\",n.leave),i(e.display.scroller,\"drop\",n.drop)}}function Cl(e){e.options.lineWrapping?(H(e.display.wrapper,\"CodeMirror-wrap\"),e.display.sizer.style.minWidth=\"\",e.display.sizerWidth=null):(T(e.display.wrapper,\"CodeMirror-wrap\"),jt(e)),ln(e),un(e),Rr(e),setTimeout(function(){return Rn(e)},100)}function Sl(e,t){var n=this;if(!(this instanceof Sl))return new Sl(e,t);this.options=t=t?I(t):{},I(bl,t,!1);var i=t.value;\"string\"==typeof i?i=new Mo(i,t.mode,null,t.lineSeparator,t.direction):t.mode&&(i.modeOption=t.mode),this.doc=i;var o=new Sl.inputStyles[t.inputStyle](this),u=this.display=new function(e,t,n,i){var o=this;this.input=n,o.scrollbarFiller=O(\"div\",null,\"CodeMirror-scrollbar-filler\"),o.scrollbarFiller.setAttribute(\"cm-not-content\",\"true\"),o.gutterFiller=O(\"div\",null,\"CodeMirror-gutter-filler\"),o.gutterFiller.setAttribute(\"cm-not-content\",\"true\"),o.lineDiv=A(\"div\",null,\"CodeMirror-code\"),o.selectionDiv=O(\"div\",null,null,\"position: relative; z-index: 1\"),o.cursorDiv=O(\"div\",null,\"CodeMirror-cursors\"),o.measure=O(\"div\",null,\"CodeMirror-measure\"),o.lineMeasure=O(\"div\",null,\"CodeMirror-measure\"),o.lineSpace=A(\"div\",[o.measure,o.lineMeasure,o.selectionDiv,o.cursorDiv,o.lineDiv],null,\"position: relative; outline: none\");var u=A(\"div\",[o.lineSpace],\"CodeMirror-lines\");o.mover=O(\"div\",[u],null,\"position: relative\"),o.sizer=O(\"div\",[o.mover],\"CodeMirror-sizer\"),o.sizerWidth=null,o.heightForcer=O(\"div\",null,null,\"position: absolute; height: \"+G+\"px; width: 1px;\"),o.gutters=O(\"div\",null,\"CodeMirror-gutters\"),o.lineGutter=null,o.scroller=O(\"div\",[o.sizer,o.heightForcer,o.gutters],\"CodeMirror-scroll\"),o.scroller.setAttribute(\"tabIndex\",\"-1\"),o.wrapper=O(\"div\",[o.scrollbarFiller,o.gutterFiller,o.scroller],\"CodeMirror\"),l&&s<8&&(o.gutters.style.zIndex=-1,o.scroller.style.paddingRight=0),a||r&&m||(o.scroller.draggable=!0),e&&(e.appendChild?e.appendChild(o.wrapper):e(o.wrapper)),o.viewFrom=o.viewTo=t.first,o.reportedViewFrom=o.reportedViewTo=t.first,o.view=[],o.renderedView=null,o.externalMeasured=null,o.viewOffset=0,o.lastWrapHeight=o.lastWrapWidth=0,o.updateLineNumbers=null,o.nativeBarWidth=o.barHeight=o.barWidth=0,o.scrollbarsClipped=!1,o.lineNumWidth=o.lineNumInnerWidth=o.lineNumChars=null,o.alignWidgets=!1,o.cachedCharWidth=o.cachedTextHeight=o.cachedPaddingH=null,o.maxLine=null,o.maxLineLength=0,o.maxLineChanged=!1,o.wheelDX=o.wheelDY=o.wheelStartX=o.wheelStartY=null,o.shift=!1,o.selForContextMenu=null,o.activeTouch=null,o.gutterSpecs=ci(i.gutters,i.lineNumbers),hi(o),n.init(o)}(e,i,o,t);for(var c in u.wrapper.CodeMirror=this,ml(this),t.lineWrapping&&(this.display.wrapper.className+=\" CodeMirror-wrap\"),Un(this),this.state={keyMaps:[],overlays:[],modeGen:0,overwrite:!1,delayingBlurEvent:!1,focused:!1,suppressEdits:!1,pasteIncoming:-1,cutIncoming:-1,selectingText:!1,draggingText:!1,highlight:new R,keySeq:null,specialChars:null},t.autofocus&&!m&&u.input.focus(),l&&s<11&&setTimeout(function(){return n.display.input.reset(!0)},20),function(e){var t=e.display;fe(t.scroller,\"mousedown\",Zn(e,fl)),fe(t.scroller,\"dblclick\",l&&s<11?Zn(e,function(t){if(!ve(e,t)){var r=sn(e,t);if(r&&!gl(e,t)&&!xr(e.display,t)){we(t);var n=e.findWordAt(r);Ki(e.doc,n.anchor,n.head)}}}):function(t){return ve(e,t)||we(t)});fe(t.scroller,\"contextmenu\",function(t){return vl(e,t)});var r,n={end:0};function i(){t.activeTouch&&(r=setTimeout(function(){return t.activeTouch=null},1e3),(n=t.activeTouch).end=+new Date)}function o(e,t){if(null==t.left)return!0;var r=t.left-e.left,n=t.top-e.top;return r*r+n*n>400}fe(t.scroller,\"touchstart\",function(i){if(!ve(e,i)&&!function(e){if(1!=e.touches.length)return!1;var t=e.touches[0];return t.radiusX<=1&&t.radiusY<=1}(i)&&!gl(e,i)){t.input.ensurePolled(),clearTimeout(r);var o=+new Date;t.activeTouch={start:o,moved:!1,prev:o-n.end<=300?n:null},1==i.touches.length&&(t.activeTouch.left=i.touches[0].pageX,t.activeTouch.top=i.touches[0].pageY)}}),fe(t.scroller,\"touchmove\",function(){t.activeTouch&&(t.activeTouch.moved=!0)}),fe(t.scroller,\"touchend\",function(r){var n=t.activeTouch;if(n&&!xr(t,r)&&null!=n.left&&!n.moved&&new Date-n.start<300){var l,s=e.coordsChar(t.activeTouch,\"page\");l=!n.prev||o(n,n.prev)?new bi(s,s):!n.prev.prev||o(n,n.prev.prev)?e.findWordAt(s):new bi(et(s.line,0),st(e.doc,et(s.line+1,0))),e.setSelection(l.anchor,l.head),e.focus(),we(r)}i()}),fe(t.scroller,\"touchcancel\",i),fe(t.scroller,\"scroll\",function(){t.scroller.clientHeight&&(Hn(e,t.scroller.scrollTop),Pn(e,t.scroller.scrollLeft,!0),ge(e,\"scroll\",e))}),fe(t.scroller,\"mousewheel\",function(t){return mi(e,t)}),fe(t.scroller,\"DOMMouseScroll\",function(t){return mi(e,t)}),fe(t.wrapper,\"scroll\",function(){return t.wrapper.scrollTop=t.wrapper.scrollLeft=0}),t.dragFunctions={enter:function(t){ve(e,t)||Se(t)},over:function(t){ve(e,t)||(!function(e,t){var r=sn(e,t);if(r){var n=document.createDocumentFragment();vn(e,r,n),e.display.dragCursor||(e.display.dragCursor=O(\"div\",null,\"CodeMirror-cursors CodeMirror-dragcursors\"),e.display.lineSpace.insertBefore(e.display.dragCursor,e.display.cursorDiv)),N(e.display.dragCursor,n)}}(e,t),Se(t))},start:function(t){return function(e,t){if(l&&(!e.state.draggingText||+new Date-No<100))Se(t);else if(!ve(e,t)&&!xr(e.display,t)&&(t.dataTransfer.setData(\"Text\",e.getSelection()),t.dataTransfer.effectAllowed=\"copyMove\",t.dataTransfer.setDragImage&&!f)){var r=O(\"img\",null,null,\"position: fixed; left: 0; top: 0;\");r.src=\"data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==\",h&&(r.width=r.height=1,e.display.wrapper.appendChild(r),r._top=r.offsetTop),t.dataTransfer.setDragImage(r,0,0),h&&r.parentNode.removeChild(r)}}(e,t)},drop:Zn(e,Oo),leave:function(t){ve(e,t)||Ao(e)}};var a=t.input.getField();fe(a,\"keyup\",function(t){return sl.call(e,t)}),fe(a,\"keydown\",Zn(e,ll)),fe(a,\"keypress\",Zn(e,al)),fe(a,\"focus\",function(t){return Cn(e,t)}),fe(a,\"blur\",function(t){return Sn(e,t)})}(this),Ho(),Kn(this),this.curOp.forceUpdate=!0,Di(this,i),t.autofocus&&!m||this.hasFocus()?setTimeout(E(Cn,this),20):Sn(this),wl)wl.hasOwnProperty(c)&&wl[c](n,t[c],yl);ui(this),t.finishInit&&t.finishInit(this);for(var d=0;d<Ll.length;++d)Ll[d](n);jn(this),a&&t.lineWrapping&&\"optimizelegibility\"==getComputedStyle(u.lineDiv).textRendering&&(u.lineDiv.style.textRendering=\"auto\")}Sl.defaults=bl,Sl.optionHandlers=wl;var Ll=[];function kl(e,t,r,n){var i,o=e.doc;null==r&&(r=\"add\"),\"smart\"==r&&(o.mode.indent?i=dt(e,t).state:r=\"prev\");var l=e.options.tabSize,s=Xe(o,t),a=z(s.text,null,l);s.stateAfter&&(s.stateAfter=null);var u,c=s.text.match(/^\\s*/)[0];if(n||/\\S/.test(s.text)){if(\"smart\"==r&&((u=o.mode.indent(i,s.text.slice(c.length),s.text))==U||u>150)){if(!n)return;r=\"prev\"}}else u=0,r=\"not\";\"prev\"==r?u=t>o.first?z(Xe(o,t-1).text,null,l):0:\"add\"==r?u=a+e.options.indentUnit:\"subtract\"==r?u=a-e.options.indentUnit:\"number\"==typeof r&&(u=a+r),u=Math.max(0,u);var h=\"\",f=0;if(e.options.indentWithTabs)for(var d=Math.floor(u/l);d;--d)f+=l,h+=\"\\t\";if(f<u&&(h+=_(u-f)),h!=c)return co(o,h,et(t,0),et(t,c.length),\"+input\"),s.stateAfter=null,!0;for(var p=0;p<o.sel.ranges.length;p++){var g=o.sel.ranges[p];if(g.head.line==t&&g.head.ch<c.length){var v=et(t,c.length);Xi(o,p,new bi(v,v));break}}}Sl.defineInitHook=function(e){return Ll.push(e)};var Tl=null;function Ml(e){Tl=e}function Nl(e,t,r,n,i){var o=e.doc;e.display.shift=!1,n||(n=o.sel);var l=+new Date-200,s=\"paste\"==i||e.state.pasteIncoming>l,a=We(t),u=null;if(s&&n.ranges.length>1)if(Tl&&Tl.text.join(\"\\n\")==t){if(n.ranges.length%Tl.text.length==0){u=[];for(var c=0;c<Tl.text.length;c++)u.push(o.splitLines(Tl.text[c]))}}else a.length==n.ranges.length&&e.options.pasteLinesPerSelection&&(u=q(a,function(e){return[e]}));for(var h=e.curOp.updateInput,f=n.ranges.length-1;f>=0;f--){var d=n.ranges[f],p=d.from(),g=d.to();d.empty()&&(r&&r>0?p=et(p.line,p.ch-r):e.state.overwrite&&!s?g=et(g.line,Math.min(Xe(o,g.line).text.length,g.ch+$(a).length)):s&&Tl&&Tl.lineWise&&Tl.text.join(\"\\n\")==t&&(p=g=et(p.line,0)));var v={from:p,to:g,text:u?u[f%u.length]:a,origin:i||(s?\"paste\":e.state.cutIncoming>l?\"cut\":\"+input\")};oo(e.doc,v),sr(e,\"inputRead\",e,v)}t&&!s&&Al(e,t),On(e),e.curOp.updateInput<2&&(e.curOp.updateInput=h),e.curOp.typing=!0,e.state.pasteIncoming=e.state.cutIncoming=-1}function Ol(e,t){var r=e.clipboardData&&e.clipboardData.getData(\"Text\");if(r)return e.preventDefault(),t.isReadOnly()||t.options.disableInput||qn(t,function(){return Nl(t,r,0,null,\"paste\")}),!0}function Al(e,t){if(e.options.electricChars&&e.options.smartIndent)for(var r=e.doc.sel,n=r.ranges.length-1;n>=0;n--){var i=r.ranges[n];if(!(i.head.ch>100||n&&r.ranges[n-1].head.line==i.head.line)){var o=e.getModeAt(i.head),l=!1;if(o.electricChars){for(var s=0;s<o.electricChars.length;s++)if(t.indexOf(o.electricChars.charAt(s))>-1){l=kl(e,i.head.line,\"smart\");break}}else o.electricInput&&o.electricInput.test(Xe(e.doc,i.head.line).text.slice(0,i.head.ch))&&(l=kl(e,i.head.line,\"smart\"));l&&sr(e,\"electricInput\",e,i.head.line)}}}function Dl(e){for(var t=[],r=[],n=0;n<e.doc.sel.ranges.length;n++){var i=e.doc.sel.ranges[n].head.line,o={anchor:et(i,0),head:et(i+1,0)};r.push(o),t.push(e.getRange(o.anchor,o.head))}return{text:t,ranges:r}}function Wl(e,t,r,n){e.setAttribute(\"autocorrect\",r?\"\":\"off\"),e.setAttribute(\"autocapitalize\",n?\"\":\"off\"),e.setAttribute(\"spellcheck\",!!t)}function Hl(){var e=O(\"textarea\",null,null,\"position: absolute; bottom: -1em; padding: 0; width: 1px; height: 1em; outline: none\"),t=O(\"div\",[e],null,\"overflow: hidden; position: relative; width: 3px; height: 0px;\");return a?e.style.width=\"1000px\":e.setAttribute(\"wrap\",\"off\"),g&&(e.style.border=\"1px solid black\"),Wl(e),t}function Fl(e,t,r,n,i){var o=t,l=r,s=Xe(e,t.line);function a(n){var o,l;if(null==(o=i?function(e,t,r,n){var i=ce(t,e.doc.direction);if(!i)return $o(t,r,n);r.ch>=t.text.length?(r.ch=t.text.length,r.sticky=\"before\"):r.ch<=0&&(r.ch=0,r.sticky=\"after\");var o=ae(i,r.ch,r.sticky),l=i[o];if(\"ltr\"==e.doc.direction&&l.level%2==0&&(n>0?l.to>r.ch:l.from<r.ch))return $o(t,r,n);var s,a=function(e,r){return _o(t,e instanceof et?e.ch:e,r)},u=function(r){return e.options.lineWrapping?(s=s||Dr(e,t),Zr(e,t,s,r)):{begin:0,end:t.text.length}},c=u(\"before\"==r.sticky?a(r,-1):r.ch);if(\"rtl\"==e.doc.direction||1==l.level){var h=1==l.level==n<0,f=a(r,h?1:-1);if(null!=f&&(h?f<=l.to&&f<=c.end:f>=l.from&&f>=c.begin)){var d=h?\"before\":\"after\";return new et(r.line,f,d)}}var p=function(e,t,n){for(var o=function(e,t){return t?new et(r.line,a(e,1),\"before\"):new et(r.line,e,\"after\")};e>=0&&e<i.length;e+=t){var l=i[e],s=t>0==(1!=l.level),u=s?n.begin:a(n.end,-1);if(l.from<=u&&u<l.to)return o(u,s);if(u=s?l.from:a(l.to,-1),n.begin<=u&&u<n.end)return o(u,s)}},g=p(o+n,n,c);if(g)return g;var v=n>0?c.end:a(c.begin,-1);return null==v||n>0&&v==t.text.length||!(g=p(n>0?0:i.length-1,n,u(v)))?null:g}(e.cm,s,t,r):$o(s,t,r))){if(n||(l=t.line+r)<e.first||l>=e.first+e.size||(t=new et(l,t.ch,t.sticky),!(s=Xe(e,l))))return!1;t=qo(i,e.cm,s,t.line,r)}else t=o;return!0}if(\"char\"==n)a();else if(\"column\"==n)a(!0);else if(\"word\"==n||\"group\"==n)for(var u=null,c=\"group\"==n,h=e.cm&&e.cm.getHelper(t,\"wordChars\"),f=!0;!(r<0)||a(!f);f=!1){var d=s.text.charAt(t.ch)||\"\\n\",p=te(d,h)?\"w\":c&&\"\\n\"==d?\"n\":!c||/\\s/.test(d)?null:\"p\";if(!c||f||p||(p=\"s\"),u&&u!=p){r<0&&(r=1,a(),t.sticky=\"after\");break}if(p&&(u=p),r>0&&!a(!f))break}var g=to(e,t,o,l,!0);return rt(o,g)&&(g.hitSide=!0),g}function Pl(e,t,r,n){var i,o,l=e.doc,s=t.left;if(\"page\"==n){var a=Math.min(e.display.wrapper.clientHeight,window.innerHeight||document.documentElement.clientHeight),u=Math.max(a-.5*en(e.display),3);i=(r>0?t.bottom:t.top)+r*u}else\"line\"==n&&(i=r>0?t.bottom+3:t.top-3);for(;(o=$r(e,s,i)).outside;){if(r<0?i<=0:i>=l.height){o.hitSide=!0;break}i+=5*r}return o}var El=function(e){this.cm=e,this.lastAnchorNode=this.lastAnchorOffset=this.lastFocusNode=this.lastFocusOffset=null,this.polling=new R,this.composing=null,this.gracePeriod=!1,this.readDOMTimeout=null};function Il(e,t){var r=Ar(e,t.line);if(!r||r.hidden)return null;var n=Xe(e.doc,t.line),i=Nr(r,n,t.line),o=ce(n,e.doc.direction),l=\"left\";o&&(l=ae(o,t.ch)%2?\"right\":\"left\");var s=Pr(i.map,t.ch,l);return s.offset=\"right\"==s.collapse?s.end:s.start,s}function zl(e,t){return t&&(e.bad=!0),e}function Rl(e,t,r){var n;if(t==e.display.lineDiv){if(!(n=e.display.lineDiv.childNodes[r]))return zl(e.clipPos(et(e.display.viewTo-1)),!0);t=null,r=0}else for(n=t;;n=n.parentNode){if(!n||n==e.display.lineDiv)return null;if(n.parentNode&&n.parentNode==e.display.lineDiv)break}for(var i=0;i<e.display.view.length;i++){var o=e.display.view[i];if(o.node==n)return Bl(o,t,r)}}function Bl(e,t,r){var n=e.text.firstChild,i=!1;if(!t||!D(n,t))return zl(et(qe(e.line),0),!0);if(t==n&&(i=!0,t=n.childNodes[r],r=0,!t)){var o=e.rest?$(e.rest):e.line;return zl(et(qe(o),o.text.length),i)}var l=3==t.nodeType?t:null,s=t;for(l||1!=t.childNodes.length||3!=t.firstChild.nodeType||(l=t.firstChild,r&&(r=l.nodeValue.length));s.parentNode!=n;)s=s.parentNode;var a=e.measure,u=a.maps;function c(t,r,n){for(var i=-1;i<(u?u.length:0);i++)for(var o=i<0?a.map:u[i],l=0;l<o.length;l+=3){var s=o[l+2];if(s==t||s==r){var c=qe(i<0?e.line:e.rest[i]),h=o[l]+n;return(n<0||s!=t)&&(h=o[l+(n?1:0)]),et(c,h)}}}var h=c(l,s,r);if(h)return zl(h,i);for(var f=s.nextSibling,d=l?l.nodeValue.length-r:0;f;f=f.nextSibling){if(h=c(f,f.firstChild,0))return zl(et(h.line,h.ch-d),i);d+=f.textContent.length}for(var p=s.previousSibling,g=r;p;p=p.previousSibling){if(h=c(p,p.firstChild,-1))return zl(et(h.line,h.ch+g),i);g+=p.textContent.length}}El.prototype.init=function(e){var t=this,r=this,n=r.cm,i=r.div=e.lineDiv;function o(e){if(!ve(n,e)){if(n.somethingSelected())Ml({lineWise:!1,text:n.getSelections()}),\"cut\"==e.type&&n.replaceSelection(\"\",null,\"cut\");else{if(!n.options.lineWiseCopyCut)return;var t=Dl(n);Ml({lineWise:!0,text:t.text}),\"cut\"==e.type&&n.operation(function(){n.setSelections(t.ranges,0,V),n.replaceSelection(\"\",null,\"cut\")})}if(e.clipboardData){e.clipboardData.clearData();var o=Tl.text.join(\"\\n\");if(e.clipboardData.setData(\"Text\",o),e.clipboardData.getData(\"Text\")==o)return void e.preventDefault()}var l=Hl(),s=l.firstChild;n.display.lineSpace.insertBefore(l,n.display.lineSpace.firstChild),s.value=Tl.text.join(\"\\n\");var a=document.activeElement;P(s),setTimeout(function(){n.display.lineSpace.removeChild(l),a.focus(),a==i&&r.showPrimarySelection()},50)}}Wl(i,n.options.spellcheck,n.options.autocorrect,n.options.autocapitalize),fe(i,\"paste\",function(e){ve(n,e)||Ol(e,n)||s<=11&&setTimeout(Zn(n,function(){return t.updateFromDOM()}),20)}),fe(i,\"compositionstart\",function(e){t.composing={data:e.data,done:!1}}),fe(i,\"compositionupdate\",function(e){t.composing||(t.composing={data:e.data,done:!1})}),fe(i,\"compositionend\",function(e){t.composing&&(e.data!=t.composing.data&&t.readFromDOMSoon(),t.composing.done=!0)}),fe(i,\"touchstart\",function(){return r.forceCompositionEnd()}),fe(i,\"input\",function(){t.composing||t.readFromDOMSoon()}),fe(i,\"copy\",o),fe(i,\"cut\",o)},El.prototype.prepareSelection=function(){var e=gn(this.cm,!1);return e.focus=this.cm.state.focused,e},El.prototype.showSelection=function(e,t){e&&this.cm.display.view.length&&((e.focus||t)&&this.showPrimarySelection(),this.showMultipleSelections(e))},El.prototype.getSelection=function(){return this.cm.display.wrapper.ownerDocument.getSelection()},El.prototype.showPrimarySelection=function(){var e=this.getSelection(),t=this.cm,n=t.doc.sel.primary(),i=n.from(),o=n.to();if(t.display.viewTo==t.display.viewFrom||i.line>=t.display.viewTo||o.line<t.display.viewFrom)e.removeAllRanges();else{var l=Rl(t,e.anchorNode,e.anchorOffset),s=Rl(t,e.focusNode,e.focusOffset);if(!l||l.bad||!s||s.bad||0!=tt(ot(l,s),i)||0!=tt(it(l,s),o)){var a=t.display.view,u=i.line>=t.display.viewFrom&&Il(t,i)||{node:a[0].measure.map[2],offset:0},c=o.line<t.display.viewTo&&Il(t,o);if(!c){var h=a[a.length-1].measure,f=h.maps?h.maps[h.maps.length-1]:h.map;c={node:f[f.length-1],offset:f[f.length-2]-f[f.length-3]}}if(u&&c){var d,p=e.rangeCount&&e.getRangeAt(0);try{d=k(u.node,u.offset,c.offset,c.node)}catch(e){}d&&(!r&&t.state.focused?(e.collapse(u.node,u.offset),d.collapsed||(e.removeAllRanges(),e.addRange(d))):(e.removeAllRanges(),e.addRange(d)),p&&null==e.anchorNode?e.addRange(p):r&&this.startGracePeriod()),this.rememberSelection()}else e.removeAllRanges()}}},El.prototype.startGracePeriod=function(){var e=this;clearTimeout(this.gracePeriod),this.gracePeriod=setTimeout(function(){e.gracePeriod=!1,e.selectionChanged()&&e.cm.operation(function(){return e.cm.curOp.selectionChanged=!0})},20)},El.prototype.showMultipleSelections=function(e){N(this.cm.display.cursorDiv,e.cursors),N(this.cm.display.selectionDiv,e.selection)},El.prototype.rememberSelection=function(){var e=this.getSelection();this.lastAnchorNode=e.anchorNode,this.lastAnchorOffset=e.anchorOffset,this.lastFocusNode=e.focusNode,this.lastFocusOffset=e.focusOffset},El.prototype.selectionInEditor=function(){var e=this.getSelection();if(!e.rangeCount)return!1;var t=e.getRangeAt(0).commonAncestorContainer;return D(this.div,t)},El.prototype.focus=function(){\"nocursor\"!=this.cm.options.readOnly&&(this.selectionInEditor()||this.showSelection(this.prepareSelection(),!0),this.div.focus())},El.prototype.blur=function(){this.div.blur()},El.prototype.getField=function(){return this.div},El.prototype.supportsTouch=function(){return!0},El.prototype.receivedFocus=function(){var e=this;this.selectionInEditor()?this.pollSelection():qn(this.cm,function(){return e.cm.curOp.selectionChanged=!0}),this.polling.set(this.cm.options.pollInterval,function t(){e.cm.state.focused&&(e.pollSelection(),e.polling.set(e.cm.options.pollInterval,t))})},El.prototype.selectionChanged=function(){var e=this.getSelection();return e.anchorNode!=this.lastAnchorNode||e.anchorOffset!=this.lastAnchorOffset||e.focusNode!=this.lastFocusNode||e.focusOffset!=this.lastFocusOffset},El.prototype.pollSelection=function(){if(null==this.readDOMTimeout&&!this.gracePeriod&&this.selectionChanged()){var e=this.getSelection(),t=this.cm;if(v&&c&&this.cm.display.gutterSpecs.length&&function(e){for(var t=e;t;t=t.parentNode)if(/CodeMirror-gutter-wrapper/.test(t.className))return!0;return!1}(e.anchorNode))return this.cm.triggerOnKeyDown({type:\"keydown\",keyCode:8,preventDefault:Math.abs}),this.blur(),void this.focus();if(!this.composing){this.rememberSelection();var r=Rl(t,e.anchorNode,e.anchorOffset),n=Rl(t,e.focusNode,e.focusOffset);r&&n&&qn(t,function(){$i(t.doc,xi(r,n),V),(r.bad||n.bad)&&(t.curOp.selectionChanged=!0)})}}},El.prototype.pollContent=function(){null!=this.readDOMTimeout&&(clearTimeout(this.readDOMTimeout),this.readDOMTimeout=null);var e,t,r,n=this.cm,i=n.display,o=n.doc.sel.primary(),l=o.from(),s=o.to();if(0==l.ch&&l.line>n.firstLine()&&(l=et(l.line-1,Xe(n.doc,l.line-1).length)),s.ch==Xe(n.doc,s.line).text.length&&s.line<n.lastLine()&&(s=et(s.line+1,0)),l.line<i.viewFrom||s.line>i.viewTo-1)return!1;l.line==i.viewFrom||0==(e=an(n,l.line))?(t=qe(i.view[0].line),r=i.view[0].node):(t=qe(i.view[e].line),r=i.view[e-1].node.nextSibling);var a,u,c=an(n,s.line);if(c==i.view.length-1?(a=i.viewTo-1,u=i.lineDiv.lastChild):(a=qe(i.view[c+1].line)-1,u=i.view[c+1].node.previousSibling),!r)return!1;for(var h=n.doc.splitLines(function(e,t,r,n,i){var o=\"\",l=!1,s=e.doc.lineSeparator(),a=!1;function u(){l&&(o+=s,a&&(o+=s),l=a=!1)}function c(e){e&&(u(),o+=e)}function h(t){if(1==t.nodeType){var r=t.getAttribute(\"cm-text\");if(r)return void c(r);var o,f=t.getAttribute(\"cm-marker\");if(f){var d=e.findMarks(et(n,0),et(i+1,0),(v=+f,function(e){return e.id==v}));return void(d.length&&(o=d[0].find(0))&&c(Ye(e.doc,o.from,o.to).join(s)))}if(\"false\"==t.getAttribute(\"contenteditable\"))return;var p=/^(pre|div|p|li|table|br)$/i.test(t.nodeName);if(!/^br$/i.test(t.nodeName)&&0==t.textContent.length)return;p&&u();for(var g=0;g<t.childNodes.length;g++)h(t.childNodes[g]);/^(pre|p)$/i.test(t.nodeName)&&(a=!0),p&&(l=!0)}else 3==t.nodeType&&c(t.nodeValue.replace(/\\u200b/g,\"\").replace(/\\u00a0/g,\" \"));var v}for(;h(t),t!=r;)t=t.nextSibling,a=!1;return o}(n,r,u,t,a)),f=Ye(n.doc,et(t,0),et(a,Xe(n.doc,a).text.length));h.length>1&&f.length>1;)if($(h)==$(f))h.pop(),f.pop(),a--;else{if(h[0]!=f[0])break;h.shift(),f.shift(),t++}for(var d=0,p=0,g=h[0],v=f[0],m=Math.min(g.length,v.length);d<m&&g.charCodeAt(d)==v.charCodeAt(d);)++d;for(var y=$(h),b=$(f),w=Math.min(y.length-(1==h.length?d:0),b.length-(1==f.length?d:0));p<w&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)++p;if(1==h.length&&1==f.length&&t==l.line)for(;d&&d>l.ch&&y.charCodeAt(y.length-p-1)==b.charCodeAt(b.length-p-1);)d--,p++;h[h.length-1]=y.slice(0,y.length-p).replace(/^\\u200b+/,\"\"),h[0]=h[0].slice(d).replace(/\\u200b+$/,\"\");var x=et(t,d),C=et(a,f.length?$(f).length-p:0);return h.length>1||h[0]||tt(x,C)?(co(n.doc,h,x,C,\"+input\"),!0):void 0},El.prototype.ensurePolled=function(){this.forceCompositionEnd()},El.prototype.reset=function(){this.forceCompositionEnd()},El.prototype.forceCompositionEnd=function(){this.composing&&(clearTimeout(this.readDOMTimeout),this.composing=null,this.updateFromDOM(),this.div.blur(),this.div.focus())},El.prototype.readFromDOMSoon=function(){var e=this;null==this.readDOMTimeout&&(this.readDOMTimeout=setTimeout(function(){if(e.readDOMTimeout=null,e.composing){if(!e.composing.done)return;e.composing=null}e.updateFromDOM()},80))},El.prototype.updateFromDOM=function(){var e=this;!this.cm.isReadOnly()&&this.pollContent()||qn(this.cm,function(){return un(e.cm)})},El.prototype.setUneditable=function(e){e.contentEditable=\"false\"},El.prototype.onKeyPress=function(e){0==e.charCode||this.composing||(e.preventDefault(),this.cm.isReadOnly()||Zn(this.cm,Nl)(this.cm,String.fromCharCode(null==e.charCode?e.keyCode:e.charCode),0))},El.prototype.readOnlyChanged=function(e){this.div.contentEditable=String(\"nocursor\"!=e)},El.prototype.onContextMenu=function(){},El.prototype.resetPosition=function(){},El.prototype.needsContentAttribute=!0;var Gl=function(e){this.cm=e,this.prevInput=\"\",this.pollingFast=!1,this.polling=new R,this.hasSelection=!1,this.composing=null};Gl.prototype.init=function(e){var t=this,r=this,n=this.cm;this.createField(e);var i=this.textarea;function o(e){if(!ve(n,e)){if(n.somethingSelected())Ml({lineWise:!1,text:n.getSelections()});else{if(!n.options.lineWiseCopyCut)return;var t=Dl(n);Ml({lineWise:!0,text:t.text}),\"cut\"==e.type?n.setSelections(t.ranges,null,V):(r.prevInput=\"\",i.value=t.text.join(\"\\n\"),P(i))}\"cut\"==e.type&&(n.state.cutIncoming=+new Date)}}e.wrapper.insertBefore(this.wrapper,e.wrapper.firstChild),g&&(i.style.width=\"0px\"),fe(i,\"input\",function(){l&&s>=9&&t.hasSelection&&(t.hasSelection=null),r.poll()}),fe(i,\"paste\",function(e){ve(n,e)||Ol(e,n)||(n.state.pasteIncoming=+new Date,r.fastPoll())}),fe(i,\"cut\",o),fe(i,\"copy\",o),fe(e.scroller,\"paste\",function(t){if(!xr(e,t)&&!ve(n,t)){if(!i.dispatchEvent)return n.state.pasteIncoming=+new Date,void r.focus();var o=new Event(\"paste\");o.clipboardData=t.clipboardData,i.dispatchEvent(o)}}),fe(e.lineSpace,\"selectstart\",function(t){xr(e,t)||we(t)}),fe(i,\"compositionstart\",function(){var e=n.getCursor(\"from\");r.composing&&r.composing.range.clear(),r.composing={start:e,range:n.markText(e,n.getCursor(\"to\"),{className:\"CodeMirror-composing\"})}}),fe(i,\"compositionend\",function(){r.composing&&(r.poll(),r.composing.range.clear(),r.composing=null)})},Gl.prototype.createField=function(e){this.wrapper=Hl(),this.textarea=this.wrapper.firstChild},Gl.prototype.prepareSelection=function(){var e=this.cm,t=e.display,r=e.doc,n=gn(e);if(e.options.moveInputWithCursor){var i=Xr(e,r.sel.primary().head,\"div\"),o=t.wrapper.getBoundingClientRect(),l=t.lineDiv.getBoundingClientRect();n.teTop=Math.max(0,Math.min(t.wrapper.clientHeight-10,i.top+l.top-o.top)),n.teLeft=Math.max(0,Math.min(t.wrapper.clientWidth-10,i.left+l.left-o.left))}return n},Gl.prototype.showSelection=function(e){var t=this.cm.display;N(t.cursorDiv,e.cursors),N(t.selectionDiv,e.selection),null!=e.teTop&&(this.wrapper.style.top=e.teTop+\"px\",this.wrapper.style.left=e.teLeft+\"px\")},Gl.prototype.reset=function(e){if(!this.contextMenuPending&&!this.composing){var t=this.cm;if(t.somethingSelected()){this.prevInput=\"\";var r=t.getSelection();this.textarea.value=r,t.state.focused&&P(this.textarea),l&&s>=9&&(this.hasSelection=r)}else e||(this.prevInput=this.textarea.value=\"\",l&&s>=9&&(this.hasSelection=null))}},Gl.prototype.getField=function(){return this.textarea},Gl.prototype.supportsTouch=function(){return!1},Gl.prototype.focus=function(){if(\"nocursor\"!=this.cm.options.readOnly&&(!m||W()!=this.textarea))try{this.textarea.focus()}catch(e){}},Gl.prototype.blur=function(){this.textarea.blur()},Gl.prototype.resetPosition=function(){this.wrapper.style.top=this.wrapper.style.left=0},Gl.prototype.receivedFocus=function(){this.slowPoll()},Gl.prototype.slowPoll=function(){var e=this;this.pollingFast||this.polling.set(this.cm.options.pollInterval,function(){e.poll(),e.cm.state.focused&&e.slowPoll()})},Gl.prototype.fastPoll=function(){var e=!1,t=this;t.pollingFast=!0,t.polling.set(20,function r(){t.poll()||e?(t.pollingFast=!1,t.slowPoll()):(e=!0,t.polling.set(60,r))})},Gl.prototype.poll=function(){var e=this,t=this.cm,r=this.textarea,n=this.prevInput;if(this.contextMenuPending||!t.state.focused||He(r)&&!n&&!this.composing||t.isReadOnly()||t.options.disableInput||t.state.keySeq)return!1;var i=r.value;if(i==n&&!t.somethingSelected())return!1;if(l&&s>=9&&this.hasSelection===i||y&&/[\\uf700-\\uf7ff]/.test(i))return t.display.input.reset(),!1;if(t.doc.sel==t.display.selForContextMenu){var o=i.charCodeAt(0);if(8203!=o||n||(n=\"​\"),8666==o)return this.reset(),this.cm.execCommand(\"undo\")}for(var a=0,u=Math.min(n.length,i.length);a<u&&n.charCodeAt(a)==i.charCodeAt(a);)++a;return qn(t,function(){Nl(t,i.slice(a),n.length-a,null,e.composing?\"*compose\":null),i.length>1e3||i.indexOf(\"\\n\")>-1?r.value=e.prevInput=\"\":e.prevInput=i,e.composing&&(e.composing.range.clear(),e.composing.range=t.markText(e.composing.start,t.getCursor(\"to\"),{className:\"CodeMirror-composing\"}))}),!0},Gl.prototype.ensurePolled=function(){this.pollingFast&&this.poll()&&(this.pollingFast=!1)},Gl.prototype.onKeyPress=function(){l&&s>=9&&(this.hasSelection=null),this.fastPoll()},Gl.prototype.onContextMenu=function(e){var t=this,r=t.cm,n=r.display,i=t.textarea;t.contextMenuPending&&t.contextMenuPending();var o=sn(r,e),u=n.scroller.scrollTop;if(o&&!h){r.options.resetSelectionOnContextMenu&&-1==r.doc.sel.contains(o)&&Zn(r,$i)(r.doc,xi(o),V);var c,f=i.style.cssText,d=t.wrapper.style.cssText,p=t.wrapper.offsetParent.getBoundingClientRect();if(t.wrapper.style.cssText=\"position: static\",i.style.cssText=\"position: absolute; width: 30px; height: 30px;\\n      top: \"+(e.clientY-p.top-5)+\"px; left: \"+(e.clientX-p.left-5)+\"px;\\n      z-index: 1000; background: \"+(l?\"rgba(255, 255, 255, .05)\":\"transparent\")+\";\\n      outline: none; border-width: 0; outline: none; overflow: hidden; opacity: .05; filter: alpha(opacity=5);\",a&&(c=window.scrollY),n.input.focus(),a&&window.scrollTo(null,c),n.input.reset(),r.somethingSelected()||(i.value=t.prevInput=\" \"),t.contextMenuPending=m,n.selForContextMenu=r.doc.sel,clearTimeout(n.detectingSelectAll),l&&s>=9&&v(),S){Se(e);var g=function(){pe(window,\"mouseup\",g),setTimeout(m,20)};fe(window,\"mouseup\",g)}else setTimeout(m,50)}function v(){if(null!=i.selectionStart){var e=r.somethingSelected(),o=\"​\"+(e?i.value:\"\");i.value=\"⇚\",i.value=o,t.prevInput=e?\"\":\"​\",i.selectionStart=1,i.selectionEnd=o.length,n.selForContextMenu=r.doc.sel}}function m(){if(t.contextMenuPending==m&&(t.contextMenuPending=!1,t.wrapper.style.cssText=d,i.style.cssText=f,l&&s<9&&n.scrollbars.setScrollTop(n.scroller.scrollTop=u),null!=i.selectionStart)){(!l||l&&s<9)&&v();var e=0,o=function(){n.selForContextMenu==r.doc.sel&&0==i.selectionStart&&i.selectionEnd>0&&\"​\"==t.prevInput?Zn(r,no)(r):e++<10?n.detectingSelectAll=setTimeout(o,500):(n.selForContextMenu=null,n.input.reset())};n.detectingSelectAll=setTimeout(o,200)}}},Gl.prototype.readOnlyChanged=function(e){e||this.reset(),this.textarea.disabled=\"nocursor\"==e},Gl.prototype.setUneditable=function(){},Gl.prototype.needsContentAttribute=!1,function(e){var t=e.optionHandlers;function r(r,n,i,o){e.defaults[r]=n,i&&(t[r]=o?function(e,t,r){r!=yl&&i(e,t,r)}:i)}e.defineOption=r,e.Init=yl,r(\"value\",\"\",function(e,t){return e.setValue(t)},!0),r(\"mode\",null,function(e,t){e.doc.modeOption=t,Ti(e)},!0),r(\"indentUnit\",2,Ti,!0),r(\"indentWithTabs\",!1),r(\"smartIndent\",!0),r(\"tabSize\",4,function(e){Mi(e),Rr(e),un(e)},!0),r(\"lineSeparator\",null,function(e,t){if(e.doc.lineSep=t,t){var r=[],n=e.doc.first;e.doc.iter(function(e){for(var i=0;;){var o=e.text.indexOf(t,i);if(-1==o)break;i=o+t.length,r.push(et(n,o))}n++});for(var i=r.length-1;i>=0;i--)co(e.doc,t,r[i],et(r[i].line,r[i].ch+t.length))}}),r(\"specialChars\",/[\\u0000-\\u001f\\u007f-\\u009f\\u00ad\\u061c\\u200b-\\u200f\\u2028\\u2029\\ufeff\\ufff9-\\ufffc]/g,function(e,t,r){e.state.specialChars=new RegExp(t.source+(t.test(\"\\t\")?\"\":\"|\\t\"),\"g\"),r!=yl&&e.refresh()}),r(\"specialCharPlaceholder\",Qt,function(e){return e.refresh()},!0),r(\"electricChars\",!0),r(\"inputStyle\",m?\"contenteditable\":\"textarea\",function(){throw new Error(\"inputStyle can not (yet) be changed in a running editor\")},!0),r(\"spellcheck\",!1,function(e,t){return e.getInputField().spellcheck=t},!0),r(\"autocorrect\",!1,function(e,t){return e.getInputField().autocorrect=t},!0),r(\"autocapitalize\",!1,function(e,t){return e.getInputField().autocapitalize=t},!0),r(\"rtlMoveVisually\",!w),r(\"wholeLineUpdateBefore\",!0),r(\"theme\",\"default\",function(e){ml(e),fi(e)},!0),r(\"keyMap\",\"default\",function(e,t,r){var n=Xo(t),i=r!=yl&&Xo(r);i&&i.detach&&i.detach(e,n),n.attach&&n.attach(e,i||null)}),r(\"extraKeys\",null),r(\"configureMouse\",null),r(\"lineWrapping\",!1,Cl,!0),r(\"gutters\",[],function(e,t){e.display.gutterSpecs=ci(t,e.options.lineNumbers),fi(e)},!0),r(\"fixedGutter\",!0,function(e,t){e.display.gutters.style.left=t?nn(e.display)+\"px\":\"0\",e.refresh()},!0),r(\"coverGutterNextToScrollbar\",!1,function(e){return Rn(e)},!0),r(\"scrollbarStyle\",\"native\",function(e){Un(e),Rn(e),e.display.scrollbars.setScrollTop(e.doc.scrollTop),e.display.scrollbars.setScrollLeft(e.doc.scrollLeft)},!0),r(\"lineNumbers\",!1,function(e,t){e.display.gutterSpecs=ci(e.options.gutters,t),fi(e)},!0),r(\"firstLineNumber\",1,fi,!0),r(\"lineNumberFormatter\",function(e){return e},fi,!0),r(\"showCursorWhenSelecting\",!1,pn,!0),r(\"resetSelectionOnContextMenu\",!0),r(\"lineWiseCopyCut\",!0),r(\"pasteLinesPerSelection\",!0),r(\"selectionsMayTouch\",!1),r(\"readOnly\",!1,function(e,t){\"nocursor\"==t&&(Sn(e),e.display.input.blur()),e.display.input.readOnlyChanged(t)}),r(\"disableInput\",!1,function(e,t){t||e.display.input.reset()},!0),r(\"dragDrop\",!0,xl),r(\"allowDropFileTypes\",null),r(\"cursorBlinkRate\",530),r(\"cursorScrollMargin\",0),r(\"cursorHeight\",1,pn,!0),r(\"singleCursorHeightPerLine\",!0,pn,!0),r(\"workTime\",100),r(\"workDelay\",100),r(\"flattenSpans\",!0,Mi,!0),r(\"addModeClass\",!1,Mi,!0),r(\"pollInterval\",100),r(\"undoDepth\",200,function(e,t){return e.doc.history.undoDepth=t}),r(\"historyEventDelay\",1250),r(\"viewportMargin\",10,function(e){return e.refresh()},!0),r(\"maxHighlightLength\",1e4,Mi,!0),r(\"moveInputWithCursor\",!0,function(e,t){t||e.display.input.resetPosition()}),r(\"tabindex\",null,function(e,t){return e.display.input.getField().tabIndex=t||\"\"}),r(\"autofocus\",null),r(\"direction\",\"ltr\",function(e,t){return e.doc.setDirection(t)},!0),r(\"phrases\",null)}(Sl),function(e){var t=e.optionHandlers,r=e.helpers={};e.prototype={constructor:e,focus:function(){window.focus(),this.display.input.focus()},setOption:function(e,r){var n=this.options,i=n[e];n[e]==r&&\"mode\"!=e||(n[e]=r,t.hasOwnProperty(e)&&Zn(this,t[e])(this,r,i),ge(this,\"optionChange\",this,e))},getOption:function(e){return this.options[e]},getDoc:function(){return this.doc},addKeyMap:function(e,t){this.state.keyMaps[t?\"push\":\"unshift\"](Xo(e))},removeKeyMap:function(e){for(var t=this.state.keyMaps,r=0;r<t.length;++r)if(t[r]==e||t[r].name==e)return t.splice(r,1),!0},addOverlay:Qn(function(t,r){var n=t.token?t:e.getMode(this.options,t);if(n.startState)throw new Error(\"Overlays may not be stateful.\");!function(e,t,r){for(var n=0,i=r(t);n<e.length&&r(e[n])<=i;)n++;e.splice(n,0,t)}(this.state.overlays,{mode:n,modeSpec:t,opaque:r&&r.opaque,priority:r&&r.priority||0},function(e){return e.priority}),this.state.modeGen++,un(this)}),removeOverlay:Qn(function(e){for(var t=this.state.overlays,r=0;r<t.length;++r){var n=t[r].modeSpec;if(n==e||\"string\"==typeof e&&n.name==e)return t.splice(r,1),this.state.modeGen++,void un(this)}}),indentLine:Qn(function(e,t,r){\"string\"!=typeof t&&\"number\"!=typeof t&&(t=null==t?this.options.smartIndent?\"smart\":\"prev\":t?\"add\":\"subtract\"),Qe(this.doc,e)&&kl(this,e,t,r)}),indentSelection:Qn(function(e){for(var t=this.doc.sel.ranges,r=-1,n=0;n<t.length;n++){var i=t[n];if(i.empty())i.head.line>r&&(kl(this,i.head.line,e,!0),r=i.head.line,n==this.doc.sel.primIndex&&On(this));else{var o=i.from(),l=i.to(),s=Math.max(r,o.line);r=Math.min(this.lastLine(),l.line-(l.ch?0:1))+1;for(var a=s;a<r;++a)kl(this,a,e);var u=this.doc.sel.ranges;0==o.ch&&t.length==u.length&&u[n].from().ch>0&&Xi(this.doc,n,new bi(o,u[n].to()),V)}}}),getTokenAt:function(e,t){return yt(this,e,t)},getLineTokens:function(e,t){return yt(this,et(e),t,!0)},getTokenTypeAt:function(e){e=st(this.doc,e);var t,r=ft(this,Xe(this.doc,e.line)),n=0,i=(r.length-1)/2,o=e.ch;if(0==o)t=r[2];else for(;;){var l=n+i>>1;if((l?r[2*l-1]:0)>=o)i=l;else{if(!(r[2*l+1]<o)){t=r[2*l+2];break}n=l+1}}var s=t?t.indexOf(\"overlay \"):-1;return s<0?t:0==s?null:t.slice(0,s-1)},getModeAt:function(t){var r=this.doc.mode;return r.innerMode?e.innerMode(r,this.getTokenAt(t).state).mode:r},getHelper:function(e,t){return this.getHelpers(e,t)[0]},getHelpers:function(e,t){var n=[];if(!r.hasOwnProperty(t))return n;var i=r[t],o=this.getModeAt(e);if(\"string\"==typeof o[t])i[o[t]]&&n.push(i[o[t]]);else if(o[t])for(var l=0;l<o[t].length;l++){var s=i[o[t][l]];s&&n.push(s)}else o.helperType&&i[o.helperType]?n.push(i[o.helperType]):i[o.name]&&n.push(i[o.name]);for(var a=0;a<i._global.length;a++){var u=i._global[a];u.pred(o,this)&&-1==B(n,u.val)&&n.push(u.val)}return n},getStateAfter:function(e,t){var r=this.doc;return dt(this,(e=lt(r,null==e?r.first+r.size-1:e))+1,t).state},cursorCoords:function(e,t){var r=this.doc.sel.primary();return Xr(this,null==e?r.head:\"object\"==typeof e?st(this.doc,e):e?r.from():r.to(),t||\"page\")},charCoords:function(e,t){return jr(this,st(this.doc,e),t||\"page\")},coordsChar:function(e,t){return $r(this,(e=Kr(this,e,t||\"page\")).left,e.top)},lineAtHeight:function(e,t){return e=Kr(this,{top:e,left:0},t||\"page\").top,Ze(this.doc,e+this.display.viewOffset)},heightAtLine:function(e,t,r){var n,i=!1;if(\"number\"==typeof e){var o=this.doc.first+this.doc.size-1;e<this.doc.first?e=this.doc.first:e>o&&(e=o,i=!0),n=Xe(this.doc,e)}else n=e;return Vr(this,n,{top:0,left:0},t||\"page\",r||i).top+(i?this.doc.height-Vt(n):0)},defaultTextHeight:function(){return en(this.display)},defaultCharWidth:function(){return tn(this.display)},getViewport:function(){return{from:this.display.viewFrom,to:this.display.viewTo}},addWidget:function(e,t,r,n,i){var o,l,s,a=this.display,u=(e=Xr(this,st(this.doc,e))).bottom,c=e.left;if(t.style.position=\"absolute\",t.setAttribute(\"cm-ignore-events\",\"true\"),this.display.input.setUneditable(t),a.sizer.appendChild(t),\"over\"==n)u=e.top;else if(\"above\"==n||\"near\"==n){var h=Math.max(a.wrapper.clientHeight,this.doc.height),f=Math.max(a.sizer.clientWidth,a.lineSpace.clientWidth);(\"above\"==n||e.bottom+t.offsetHeight>h)&&e.top>t.offsetHeight?u=e.top-t.offsetHeight:e.bottom+t.offsetHeight<=h&&(u=e.bottom),c+t.offsetWidth>f&&(c=f-t.offsetWidth)}t.style.top=u+\"px\",t.style.left=t.style.right=\"\",\"right\"==i?(c=a.sizer.clientWidth-t.offsetWidth,t.style.right=\"0px\"):(\"left\"==i?c=0:\"middle\"==i&&(c=(a.sizer.clientWidth-t.offsetWidth)/2),t.style.left=c+\"px\"),r&&(o=this,l={left:c,top:u,right:c+t.offsetWidth,bottom:u+t.offsetHeight},null!=(s=Mn(o,l)).scrollTop&&Hn(o,s.scrollTop),null!=s.scrollLeft&&Pn(o,s.scrollLeft))},triggerOnKeyDown:Qn(ll),triggerOnKeyPress:Qn(al),triggerOnKeyUp:sl,triggerOnMouseDown:Qn(fl),execCommand:function(e){if(Zo.hasOwnProperty(e))return Zo[e].call(null,this)},triggerElectric:Qn(function(e){Al(this,e)}),findPosH:function(e,t,r,n){var i=1;t<0&&(i=-1,t=-t);for(var o=st(this.doc,e),l=0;l<t&&!(o=Fl(this.doc,o,i,r,n)).hitSide;++l);return o},moveH:Qn(function(e,t){var r=this;this.extendSelectionsBy(function(n){return r.display.shift||r.doc.extend||n.empty()?Fl(r.doc,n.head,e,t,r.options.rtlMoveVisually):e<0?n.from():n.to()},j)}),deleteH:Qn(function(e,t){var r=this.doc.sel,n=this.doc;r.somethingSelected()?n.replaceSelection(\"\",null,\"+delete\"):Yo(this,function(r){var i=Fl(n,r.head,e,t,!1);return e<0?{from:i,to:r.head}:{from:r.head,to:i}})}),findPosV:function(e,t,r,n){var i=1,o=n;t<0&&(i=-1,t=-t);for(var l=st(this.doc,e),s=0;s<t;++s){var a=Xr(this,l,\"div\");if(null==o?o=a.left:a.left=o,(l=Pl(this,a,i,r)).hitSide)break}return l},moveV:Qn(function(e,t){var r=this,n=this.doc,i=[],o=!this.display.shift&&!n.extend&&n.sel.somethingSelected();if(n.extendSelectionsBy(function(l){if(o)return e<0?l.from():l.to();var s=Xr(r,l.head,\"div\");null!=l.goalColumn&&(s.left=l.goalColumn),i.push(s.left);var a=Pl(r,s,e,t);return\"page\"==t&&l==n.sel.primary()&&Nn(r,jr(r,a,\"div\").top-s.top),a},j),i.length)for(var l=0;l<n.sel.ranges.length;l++)n.sel.ranges[l].goalColumn=i[l]}),findWordAt:function(e){var t=Xe(this.doc,e.line).text,r=e.ch,n=e.ch;if(t){var i=this.getHelper(e,\"wordChars\");\"before\"!=e.sticky&&n!=t.length||!r?++n:--r;for(var o=t.charAt(r),l=te(o,i)?function(e){return te(e,i)}:/\\s/.test(o)?function(e){return/\\s/.test(e)}:function(e){return!/\\s/.test(e)&&!te(e)};r>0&&l(t.charAt(r-1));)--r;for(;n<t.length&&l(t.charAt(n));)++n}return new bi(et(e.line,r),et(e.line,n))},toggleOverwrite:function(e){null!=e&&e==this.state.overwrite||((this.state.overwrite=!this.state.overwrite)?H(this.display.cursorDiv,\"CodeMirror-overwrite\"):T(this.display.cursorDiv,\"CodeMirror-overwrite\"),ge(this,\"overwriteToggle\",this,this.state.overwrite))},hasFocus:function(){return this.display.input.getField()==W()},isReadOnly:function(){return!(!this.options.readOnly&&!this.doc.cantEdit)},scrollTo:Qn(function(e,t){An(this,e,t)}),getScrollInfo:function(){var e=this.display.scroller;return{left:e.scrollLeft,top:e.scrollTop,height:e.scrollHeight-kr(this)-this.display.barHeight,width:e.scrollWidth-kr(this)-this.display.barWidth,clientHeight:Mr(this),clientWidth:Tr(this)}},scrollIntoView:Qn(function(e,t){null==e?(e={from:this.doc.sel.primary().head,to:null},null==t&&(t=this.options.cursorScrollMargin)):\"number\"==typeof e?e={from:et(e,0),to:null}:null==e.from&&(e={from:e,to:null}),e.to||(e.to=e.from),e.margin=t||0,null!=e.from.line?function(e,t){Dn(e),e.curOp.scrollToPos=t}(this,e):Wn(this,e.from,e.to,e.margin)}),setSize:Qn(function(e,t){var r=this,n=function(e){return\"number\"==typeof e||/^\\d+$/.test(String(e))?e+\"px\":e};null!=e&&(this.display.wrapper.style.width=n(e)),null!=t&&(this.display.wrapper.style.height=n(t)),this.options.lineWrapping&&zr(this);var i=this.display.viewFrom;this.doc.iter(i,this.display.viewTo,function(e){if(e.widgets)for(var t=0;t<e.widgets.length;t++)if(e.widgets[t].noHScroll){cn(r,i,\"widget\");break}++i}),this.curOp.forceUpdate=!0,ge(this,\"refresh\",this)}),operation:function(e){return qn(this,e)},startOperation:function(){return Kn(this)},endOperation:function(){return jn(this)},refresh:Qn(function(){var e=this.display.cachedTextHeight;un(this),this.curOp.forceUpdate=!0,Rr(this),An(this,this.doc.scrollLeft,this.doc.scrollTop),li(this.display),(null==e||Math.abs(e-en(this.display))>.5)&&ln(this),ge(this,\"refresh\",this)}),swapDoc:Qn(function(e){var t=this.doc;return t.cm=null,this.state.selectingText&&this.state.selectingText(),Di(this,e),Rr(this),this.display.input.reset(),An(this,e.scrollLeft,e.scrollTop),this.curOp.forceScroll=!0,sr(this,\"swapDoc\",this,t),t}),phrase:function(e){var t=this.options.phrases;return t&&Object.prototype.hasOwnProperty.call(t,e)?t[e]:e},getInputField:function(){return this.display.input.getField()},getWrapperElement:function(){return this.display.wrapper},getScrollerElement:function(){return this.display.scroller},getGutterElement:function(){return this.display.gutters}},be(e),e.registerHelper=function(t,n,i){r.hasOwnProperty(t)||(r[t]=e[t]={_global:[]}),r[t][n]=i},e.registerGlobalHelper=function(t,n,i,o){e.registerHelper(t,n,o),r[t]._global.push({pred:i,val:o})}}(Sl);var Ul=\"iter insert remove copy getEditor constructor\".split(\" \");for(var Vl in Mo.prototype)Mo.prototype.hasOwnProperty(Vl)&&B(Ul,Vl)<0&&(Sl.prototype[Vl]=function(e){return function(){return e.apply(this.doc,arguments)}}(Mo.prototype[Vl]));return be(Mo),Sl.inputStyles={textarea:Gl,contenteditable:El},Sl.defineMode=function(e){Sl.defaults.mode||\"null\"==e||(Sl.defaults.mode=e),function(e,t){arguments.length>2&&(t.dependencies=Array.prototype.slice.call(arguments,2)),Ee[e]=t}.apply(this,arguments)},Sl.defineMIME=function(e,t){Ie[e]=t},Sl.defineMode(\"null\",function(){return{token:function(e){return e.skipToEnd()}}}),Sl.defineMIME(\"text/plain\",\"null\"),Sl.defineExtension=function(e,t){Sl.prototype[e]=t},Sl.defineDocExtension=function(e,t){Mo.prototype[e]=t},Sl.fromTextArea=function(e,t){if((t=t?I(t):{}).value=e.value,!t.tabindex&&e.tabIndex&&(t.tabindex=e.tabIndex),!t.placeholder&&e.placeholder&&(t.placeholder=e.placeholder),null==t.autofocus){var r=W();t.autofocus=r==e||null!=e.getAttribute(\"autofocus\")&&r==document.body}function n(){e.value=s.getValue()}var i;if(e.form&&(fe(e.form,\"submit\",n),!t.leaveSubmitMethodAlone)){var o=e.form;i=o.submit;try{var l=o.submit=function(){n(),o.submit=i,o.submit(),o.submit=l}}catch(e){}}t.finishInit=function(r){r.save=n,r.getTextArea=function(){return e},r.toTextArea=function(){r.toTextArea=isNaN,n(),e.parentNode.removeChild(r.getWrapperElement()),e.style.display=\"\",e.form&&(pe(e.form,\"submit\",n),t.leaveSubmitMethodAlone||\"function\"!=typeof e.form.submit||(e.form.submit=i))}},e.style.display=\"none\";var s=Sl(function(t){return e.parentNode.insertBefore(t,e.nextSibling)},t);return s},function(e){e.off=pe,e.on=fe,e.wheelEventPixels=vi,e.Doc=Mo,e.splitLines=We,e.countColumn=z,e.findColumn=X,e.isWordChar=ee,e.Pass=U,e.signal=ge,e.Line=Xt,e.changeEnd=Ci,e.scrollbarModel=Gn,e.Pos=et,e.cmpPos=tt,e.modes=Ee,e.mimeModes=Ie,e.resolveMode=ze,e.getMode=Re,e.modeExtensions=Be,e.extendMode=Ge,e.copyState=Ue,e.startState=Ke,e.innerMode=Ve,e.commands=Zo,e.keyMap=Ro,e.keyName=jo,e.isModifierKey=Vo,e.lookupKey=Uo,e.normalizeKeyMap=Go,e.StringStream=je,e.SharedTextMarker=So,e.TextMarker=xo,e.LineWidget=yo,e.e_preventDefault=we,e.e_stopPropagation=xe,e.e_stop=Se,e.addClass=H,e.contains=D,e.rmClass=T,e.keyNames=Po}(Sl),Sl.version=\"5.49.2\",Sl});"
  },
  {
    "path": "luci-app-adguardhome/root/www/luci-static/resources/codemirror/mode/yaml/yaml.js",
    "content": "!function(e){\"object\"==typeof exports&&\"object\"==typeof module?e(require(\"../../lib/codemirror\")):\"function\"==typeof define&&define.amd?define([\"../../lib/codemirror\"],e):e(CodeMirror)}(function(e){\"use strict\";e.defineMode(\"yaml\",function(){var e=new RegExp(\"\\\\b((\"+[\"true\",\"false\",\"on\",\"off\",\"yes\",\"no\"].join(\")|(\")+\"))$\",\"i\");return{token:function(i,t){var r=i.peek(),n=t.escaped;if(t.escaped=!1,\"#\"==r&&(0==i.pos||/\\s/.test(i.string.charAt(i.pos-1))))return i.skipToEnd(),\"comment\";if(i.match(/^('([^']|\\\\.)*'?|\"([^\"]|\\\\.)*\"?)/))return\"string\";if(t.literal&&i.indentation()>t.keyCol)return i.skipToEnd(),\"string\";if(t.literal&&(t.literal=!1),i.sol()){if(t.keyCol=0,t.pair=!1,t.pairStart=!1,i.match(/---/))return\"def\";if(i.match(/\\.\\.\\./))return\"def\";if(i.match(/\\s*-\\s+/))return\"meta\"}if(i.match(/^(\\{|\\}|\\[|\\])/))return\"{\"==r?t.inlinePairs++:\"}\"==r?t.inlinePairs--:\"[\"==r?t.inlineList++:t.inlineList--,\"meta\";if(t.inlineList>0&&!n&&\",\"==r)return i.next(),\"meta\";if(t.inlinePairs>0&&!n&&\",\"==r)return t.keyCol=0,t.pair=!1,t.pairStart=!1,i.next(),\"meta\";if(t.pairStart){if(i.match(/^\\s*(\\||\\>)\\s*/))return t.literal=!0,\"meta\";if(i.match(/^\\s*(\\&|\\*)[a-z0-9\\._-]+\\b/i))return\"variable-2\";if(0==t.inlinePairs&&i.match(/^\\s*-?[0-9\\.\\,]+\\s?$/))return\"number\";if(t.inlinePairs>0&&i.match(/^\\s*-?[0-9\\.\\,]+\\s?(?=(,|}))/))return\"number\";if(i.match(e))return\"keyword\"}return!t.pair&&i.match(/^\\s*(?:[,\\[\\]{}&*!|>'\"%@`][^\\s'\":]|[^,\\[\\]{}#&*!|>'\"%@`])[^#]*?(?=\\s*:($|\\s))/)?(t.pair=!0,t.keyCol=i.indentation(),\"atom\"):t.pair&&i.match(/^:\\s*/)?(t.pairStart=!0,\"meta\"):(t.pairStart=!1,t.escaped=\"\\\\\"==r,i.next(),null)},startState:function(){return{pair:!1,pairStart:!1,keyCol:0,inlinePairs:0,inlineList:0,literal:!1,escaped:!1}},lineComment:\"#\",fold:\"indent\"}}),e.defineMIME(\"text/x-yaml\",\"yaml\"),e.defineMIME(\"text/yaml\",\"yaml\")});"
  },
  {
    "path": "luci-app-adguardhome/root/www/luci-static/resources/codemirror/theme/dracula.css",
    "content": ".cm-s-dracula.CodeMirror,.cm-s-dracula .CodeMirror-gutters{background-color:#282a36 !important;color:#f8f8f2 !important;border:0}.cm-s-dracula .CodeMirror-gutters{color:#282a36}.cm-s-dracula .CodeMirror-cursor{border-left:solid thin #f8f8f0}.cm-s-dracula .CodeMirror-linenumber{color:#6d8a88}.cm-s-dracula .CodeMirror-selected{background:rgba(255,255,255,0.10)}.cm-s-dracula .CodeMirror-line::selection,.cm-s-dracula .CodeMirror-line>span::selection,.cm-s-dracula .CodeMirror-line>span>span::selection{background:rgba(255,255,255,0.10)}.cm-s-dracula .CodeMirror-line::-moz-selection,.cm-s-dracula .CodeMirror-line>span::-moz-selection,.cm-s-dracula .CodeMirror-line>span>span::-moz-selection{background:rgba(255,255,255,0.10)}.cm-s-dracula span.cm-comment{color:#6272a4}.cm-s-dracula span.cm-string,.cm-s-dracula span.cm-string-2{color:#f1fa8c}.cm-s-dracula span.cm-number{color:#bd93f9}.cm-s-dracula span.cm-variable{color:#50fa7b}.cm-s-dracula span.cm-variable-2{color:white}.cm-s-dracula span.cm-def{color:#50fa7b}.cm-s-dracula span.cm-operator{color:#ff79c6}.cm-s-dracula span.cm-keyword{color:#ff79c6}.cm-s-dracula span.cm-atom{color:#bd93f9}.cm-s-dracula span.cm-meta{color:#f8f8f2}.cm-s-dracula span.cm-tag{color:#ff79c6}.cm-s-dracula span.cm-attribute{color:#50fa7b}.cm-s-dracula span.cm-qualifier{color:#50fa7b}.cm-s-dracula span.cm-property{color:#66d9ef}.cm-s-dracula span.cm-builtin{color:#50fa7b}.cm-s-dracula span.cm-variable-3,.cm-s-dracula span.cm-type{color:#ffb86c}.cm-s-dracula .CodeMirror-activeline-background{background:rgba(255,255,255,0.1)}.cm-s-dracula .CodeMirror-matchingbracket{text-decoration:underline;color:white !important}\n"
  },
  {
    "path": "luci-app-amlogic/Makefile",
    "content": "#=====================================================================================================\n# This file is licensed under the terms of the GNU General Public\n# License version 2. This program is licensed \"as is\" without any\n# warranty of any kind, whether express or implied.\n#\n# This file is a part of the luci-app-amlogic plugin\n# https://github.com/ophub/luci-app-amlogic\n#\n# Description: Supports install/update/backup/restore/snapshot operations using OpenWrt on many boxes\n# Copyright (C) 2021- https://github.com/unifreq/openwrt_packit\n# Copyright (C) 2021- https://github.com/ophub/luci-app-amlogic\n#\n# Command: curl -fsSL git.io/luci-app-amlogic | bash\n#=====================================================================================================\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-amlogic\nPKG_VERSION:=3.1.301\nPKG_RELEASE:=1\n\nPKG_LICENSE:=GPL-2.0 License\nPKG_MAINTAINER:=ophub <https://github.com/ophub/luci-app-amlogic>\n\nLUCI_TITLE:=LuCI support for custom TV boxes\nLUCI_PKGARCH:=all\nLUCI_DEPENDS:= \\\n\t@(aarch64||arm) +bash +blkid +block-mount +curl +dosfstools +e2fsprogs \\\n\t+fdisk +jq +losetup +lsblk +parted +perl +pv +uuidgen\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/amlogic\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/controller/amlogic.lua",
    "content": "module(\"luci.controller.amlogic\", package.seeall)\n\nlocal sys = require \"luci.sys\"\nlocal PKG_NAME = \"luci-app-amlogic\"\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/amlogic\") then\n\t\treturn\n\tend\n\n\tlocal page = entry({ \"admin\", \"system\", \"amlogic\" }, alias(\"admin\", \"system\", \"amlogic\", \"info\"), _(\"Amlogic Service\"), 88)\n\tpage.dependent = true\n\tpage.acl_depends = { PKG_NAME }\n\n\tlocal platfrom = luci.sys.exec(\"cat /etc/flippy-openwrt-release 2>/dev/null | grep PLATFORM | awk -F'=' '{print $2}' | grep -oE '(amlogic|rockchip|allwinner|qemu)' | xargs\") or \"Unknown\"\n\tlocal install_menu = luci.sys.exec(\"cat /etc/flippy-openwrt-release 2>/dev/null | grep SHOW_INSTALL_MENU | awk -F'=' '{print $2}' | grep -oE '(yes|no)' | xargs\") or \"Unknown\"\n\t-- Detect whether root fs is already on internal storage (eMMC/NVMe/disk).\n\t-- If so, OpenWrt is already installed and the Install menu should be hidden.\n\tlocal root_pt = luci.sys.exec(\"df / | tail -n1 | awk '{print $1}' | awk -F'/' '{print $3}'\") or \"\"\n\troot_pt = root_pt:gsub(\"%s+\", \"\")\n\tlocal is_installed = (root_pt ~= \"\" and (\n\t\troot_pt:match(\"^mmcblk%d+p%d+$\") or\n\t\troot_pt:match(\"^[hsv]d[a-z]%d+$\") or\n\t\troot_pt:match(\"^nvme%d+n%d+p%d+$\")\n\t)) and true or false\n\n\tentry({ \"admin\", \"system\", \"amlogic\", \"info\" }, form(\"amlogic/amlogic_info\"), _(\"Amlogic Service\"), 1).leaf = true\n\tlocal can_install = (string.find(platfrom, \"amlogic\") ~= nil or string.find(platfrom, \"allwinner\") ~= nil or string.find(install_menu, \"yes\") ~= nil)\n\tif can_install and not is_installed then\n\t\tentry({ \"admin\", \"system\", \"amlogic\", \"install\" }, form(\"amlogic/amlogic_install\"), _(\"Install OpenWrt\"), 2).leaf = true\n\tend\n\tentry({ \"admin\", \"system\", \"amlogic\", \"upload\" }, form(\"amlogic/amlogic_upload\"), _(\"Manually Upload Update\"), 3).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"check\" }, form(\"amlogic/amlogic_check\"), _(\"Online Download Update\"), 4).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"backup\" }, form(\"amlogic/amlogic_backup\"), _(\"Backup Firmware Config\"), 5).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"backuplist\" }, form(\"amlogic/amlogic_backuplist\")).leaf = true\n\tif (string.find(platfrom, \"qemu\")) == nil then\n\t\tentry({ \"admin\", \"system\", \"amlogic\", \"armcpu\" }, cbi(\"amlogic/amlogic_armcpu\"), _(\"CPU Settings\"), 6).leaf = true\n\tend\n\tentry({ \"admin\", \"system\", \"amlogic\", \"config\" }, cbi(\"amlogic/amlogic_config\"), _(\"Plugin Settings\"), 7).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"log\" }, form(\"amlogic/amlogic_log\"), _(\"Server Logs\"), 8).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"poweroff\" }, form(\"amlogic/amlogic_poweroff\"), _(\"PowerOff\"), 9).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"check_firmware\" }, call(\"action_check_firmware\"))\n\tentry({ \"admin\", \"system\", \"amlogic\", \"check_plugin\" }, call(\"action_check_plugin\"))\n\tentry({ \"admin\", \"system\", \"amlogic\", \"check_plugin_download\" }, call(\"action_check_plugin_download\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"check_kernel\" }, call(\"action_check_kernel\"))\n\tentry({ \"admin\", \"system\", \"amlogic\", \"refresh_log\" }, call(\"action_refresh_log\"))\n\tentry({ \"admin\", \"system\", \"amlogic\", \"del_log\" }, call(\"action_del_log\"))\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_model_database\" }, call(\"action_check_model_database\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_check_install\" }, call(\"action_start_check_install\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_check_firmware\" }, call(\"action_start_check_firmware\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_check_plugin\" }, call(\"action_start_check_plugin\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_check_kernel\" }, call(\"action_start_check_kernel\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_check_rescue\" }, call(\"action_start_check_rescue\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_check_upfiles\" }, call(\"action_start_check_upfiles\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_amlogic_install\" }, call(\"action_start_amlogic_install\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_amlogic_update\" }, call(\"action_start_amlogic_update\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_amlogic_kernel\" }, call(\"action_start_amlogic_kernel\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_amlogic_plugin\" }, call(\"action_start_amlogic_plugin\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_amlogic_rescue\" }, call(\"action_start_amlogic_rescue\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_snapshot_delete\" }, call(\"action_start_snapshot_delete\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_snapshot_restore\" }, call(\"action_start_snapshot_restore\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_snapshot_list\" }, call(\"action_check_snapshot\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_openwrt_author\" }, call(\"action_openwrt_author\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"state\" }, call(\"action_state\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_poweroff\" }, call(\"action_poweroff\")).leaf = true\n\tentry({ \"admin\", \"system\", \"amlogic\", \"start_switch\" }, call(\"action_switch\")).leaf = true\nend\n\n--Remove the spaces in the string\nfunction trim(str)\n\t--return (string.gsub(str, \"^%s*(.-)%s*$\", \"%1\"))\n\treturn (string.gsub(str, \"%s+\", \"\"))\nend\n\n--Create a temporary folder (fire-and-forget, result not needed)\nluci.sys.exec(\"[ -d /tmp/upload ] || mkdir -p /tmp/upload >/dev/null\")\nluci.sys.exec(\"[ -d /tmp/amlogic ] || mkdir -p /tmp/amlogic >/dev/null\")\n\n-- Read per-request UCI config and platform info.\n-- Defined as a function so values are always fresh (not stale from module load).\nlocal function get_config()\n\tlocal amlogic_firmware_config = luci.sys.exec(\"uci get amlogic.config.amlogic_firmware_config 2>/dev/null\") or \"1\"\n\tlocal update_restore_config = (tonumber(amlogic_firmware_config) == 0) and \"no-restore\" or \"restore\"\n\n\tlocal amlogic_write_bootloader = luci.sys.exec(\"uci get amlogic.config.amlogic_write_bootloader 2>/dev/null\") or \"1\"\n\tlocal auto_write_bootloader = (tonumber(amlogic_write_bootloader) == 0) and \"no\" or \"yes\"\n\n\tlocal amlogic_shared_fstype = trim(luci.sys.exec(\"uci get amlogic.config.amlogic_shared_fstype 2>/dev/null\") or \"\")\n\tlocal auto_shared_fstype = (amlogic_shared_fstype == \"\") and \"ext4\" or amlogic_shared_fstype\n\n\tlocal device_platfrom = luci.sys.exec(\"cat /etc/flippy-openwrt-release 2>/dev/null | grep PLATFORM | awk -F'=' '{print $2}' | grep -oE '(amlogic|rockchip|allwinner|qemu)' | xargs\") or \"Unknown\"\n\tlocal device_install_script, device_update_script, device_kernel_script\n\tif string.find(device_platfrom, \"rockchip\") then\n\t\tdevice_install_script = \"\"\n\t\tdevice_update_script  = \"openwrt-update-rockchip\"\n\t\tdevice_kernel_script  = \"openwrt-kernel\"\n\telseif string.find(device_platfrom, \"allwinner\") then\n\t\tdevice_install_script = \"openwrt-install-allwinner\"\n\t\tdevice_update_script  = \"openwrt-update-allwinner\"\n\t\tdevice_kernel_script  = \"openwrt-kernel\"\n\telseif string.find(device_platfrom, \"qemu\") then\n\t\tdevice_install_script = \"\"\n\t\tdevice_update_script  = \"openwrt-update-kvm\"\n\t\tdevice_kernel_script  = \"openwrt-kernel\"\n\telse\n\t\tdevice_install_script = \"openwrt-install-amlogic\"\n\t\tdevice_update_script  = \"openwrt-update-amlogic\"\n\t\tdevice_kernel_script  = \"openwrt-kernel\"\n\tend\n\n\treturn {\n\t\tupdate_restore_config = update_restore_config,\n\t\tauto_write_bootloader = auto_write_bootloader,\n\t\tauto_shared_fstype    = auto_shared_fstype,\n\t\tdevice_platfrom       = device_platfrom,\n\t\tdevice_install_script = device_install_script,\n\t\tdevice_update_script  = device_update_script,\n\t\tdevice_kernel_script  = device_kernel_script,\n\t}\nend\n\n--General array functions\nfunction string.split(input, delimiter)\n\tinput = tostring(input)\n\tdelimiter = tostring(delimiter)\n\tif (delimiter == '') then return false end\n\tlocal pos, arr = 0, {}\n\t-- for each divider found\n\tfor st, sp in function() return string.find(input, delimiter, pos, true) end do\n\t\ttable.insert(arr, string.sub(input, pos, st - 1))\n\t\tpos = sp + 1\n\tend\n\ttable.insert(arr, string.sub(input, pos))\n\treturn arr\nend\n\n--Refresh the log\nfunction action_refresh_log()\n\tlocal logfile = \"/tmp/amlogic/amlogic.log\"\n\tif not nixio.fs.access(logfile) then\n\t\tluci.sys.exec(\"uname -a > /tmp/amlogic/amlogic.log && sync\")\n\t\tluci.sys.exec(\"echo '' > /tmp/amlogic/amlogic_check_install.log && sync >/dev/null 2>&1\")\n\t\tluci.sys.exec(\"echo '' > /tmp/amlogic/amlogic_check_upfiles.log && sync >/dev/null 2>&1\")\n\t\tluci.sys.exec(\"echo '' > /tmp/amlogic/amlogic_check_plugin.log && sync >/dev/null 2>&1\")\n\t\tluci.sys.exec(\"echo '' > /tmp/amlogic/amlogic_check_kernel.log && sync >/dev/null 2>&1\")\n\t\tluci.sys.exec(\"echo '' > /tmp/amlogic/amlogic_check_firmware.log && sync >/dev/null 2>&1\")\n\t\tluci.sys.exec(\"echo '' > /tmp/amlogic/amlogic_check_rescue.log && sync >/dev/null 2>&1\")\n\t\tluci.sys.exec(\"echo '' > /tmp/amlogic/amlogic_running_script.log && sync >/dev/null 2>&1\")\n\tend\n\tluci.http.prepare_content(\"text/plain; charset=utf-8\")\n\tlocal f = io.open(logfile, \"r+\")\n\tf:seek(\"set\")\n\tlocal a = f:read(2048000) or \"\"\n\tf:close()\n\tluci.http.write(a)\nend\n\n--Delete the logs\nfunction action_del_log()\n\tluci.sys.exec(\": > /tmp/amlogic/amlogic.log\")\n\tluci.sys.exec(\": > /tmp/amlogic/amlogic_check_install.log\")\n\tluci.sys.exec(\": > /tmp/amlogic/amlogic_check_upfiles.log\")\n\tluci.sys.exec(\": > /tmp/amlogic/amlogic_check_plugin.log\")\n\tluci.sys.exec(\": > /tmp/amlogic/amlogic_check_kernel.log\")\n\tluci.sys.exec(\": > /tmp/amlogic/amlogic_check_firmware.log\")\n\tluci.sys.exec(\": > /tmp/amlogic/amlogic_check_rescue.log\")\n\tluci.sys.exec(\": > /tmp/amlogic/amlogic_running_script.log\")\nend\n\n\n--Upgrade luci-app-amlogic plugin\nfunction start_amlogic_plugin()\n\tlocal log_file = \"/tmp/amlogic/amlogic_check_plugin.log\"\n\tlocal running_lock = \"/tmp/amlogic/amlogic_running_script.log\"\n\tlocal config_file = \"/etc/config/amlogic\"\n\tlocal config_bak = \"/etc/config/amlogic_bak\"\n\n\t-- 1. Create a running lock and clear previous log\n\tluci.sys.call(\"echo '1@Plugin update in progress, try again later!' > \" .. running_lock .. \" && > \" .. log_file)\n\n\t-- 2. Backup config file\n\tluci.sys.call(string.format(\"[ -f %s ] && cp -vf %s %s >> %s 2>&1\", config_file, config_file, config_bak, log_file))\n\n\t-- 3. Detect and install\n\tlocal install_status = 1\n\tif luci.sys.call(\"command -v opkg >/dev/null\") == 0 then\n\t\tluci.sys.call(\"echo 'System uses opkg. Attempting to install .ipk package...' >> \" .. log_file)\n\t\tlocal install_cmd = string.format(\"opkg --force-reinstall install /tmp/amlogic/*.ipk >> %s 2>&1\", log_file)\n\t\tinstall_status = luci.sys.call(install_cmd)\n\telseif luci.sys.call(\"command -v apk >/dev/null\") == 0 then\n\t\tluci.sys.call(\"echo 'System uses apk. Attempting to install .apk package...' >> \" .. log_file)\n\t\tlocal install_cmd = string.format(\"apk add --force-overwrite --allow-untrusted /tmp/amlogic/*.apk >> %s 2>&1\", log_file)\n\t\tinstall_status = luci.sys.call(install_cmd)\n\telse\n\t\tluci.sys.call(\"echo 'Error: Neither opkg nor apk found. Aborting.' >> \" .. log_file)\n\tend\n\n\t-- 4. Check result and finalize\n\tif install_status == 0 then\n\t\t-- SUCCESS\n\t\tluci.sys.call(\"echo 'Installation successful. Finalizing...' >> \" .. log_file)\n\t\tluci.sys.call(string.format(\"[ -f %s ] && cp -vf %s %s >> %s 2>&1\", config_bak, config_bak, config_file, log_file))\n\t\tluci.sys.call(\"rm -f /etc/config/amlogic.apk-new /etc/config/amlogic.ipk-old >> \" .. log_file .. \" 2>&1\")\n\t\tluci.sys.call(\"rm -rf /tmp/luci-indexcache /tmp/luci-modulecache/* \" .. config_bak)\n\t\tluci.sys.call(\"echo '' > \" .. running_lock)\n\t\tluci.sys.call(\"echo 'Successful Update' > \" .. log_file)\n\t\t-- Cross-branch cleanup: run in background after a delay so the browser\n\t\t-- can poll \"Successful Update\" before any files are removed.\n\t\tlocal cleanup_cmd = table.concat({\n\t\t\t\"(sleep 3\",\n\t\t\t\"new_release=''\",\n\t\t\t\"if command -v opkg >/dev/null 2>&1; then\",\n\t\t\t\"  new_release=\\\"$(opkg list-installed | grep '^luci-app-amlogic ' | awk '{print $3}' | cut -d'-' -f2)\\\"\",\n\t\t\t\"elif command -v apk >/dev/null 2>&1; then\",\n\t\t\t\"  new_release=\\\"$(apk list --installed 2>/dev/null | grep '^luci-app-amlogic-' | awk '{print $1}' | cut -d'-' -f5 | sed 's/^r//')\\\"\",\n\t\t\t\"fi\",\n\t\t\t\"if [ \\\"${new_release}\\\" = '2' ]; then\",\n\t\t\t\"  rm -f /usr/lib/lua/luci/controller/amlogic.lua\",\n\t\t\t\"  rm -rf /usr/lib/lua/luci/model/cbi/amlogic\",\n\t\t\t\"  rm -rf /usr/lib/lua/luci/view/amlogic\",\n\t\t\t\"elif [ \\\"${new_release}\\\" = '1' ]; then\",\n\t\t\t\"  rm -f /usr/share/rpcd/ucode/luci.amlogic\",\n\t\t\t\"  rm -f /www/luci-static/resources/view/amlogic/*.js\",\n\t\t\t\"  rm -f /usr/share/luci/menu.d/luci-app-amlogic.json\",\n\t\t\t\"fi) &\"\n\t\t}, \"\\n\")\n\t\tluci.sys.call(cleanup_cmd)\n\t\treturn 0\n\telse\n\t\t-- FAILURE\n\t\tluci.sys.call(\"echo '--- INSTALLATION FAILED! ---' >> \" .. log_file)\n\t\tluci.sys.call(\"echo 'Restoring configuration and aborting.' >> \" .. log_file)\n\t\tluci.sys.call(string.format(\"[ -f %s ] && cp -vf %s %s >> %s 2>&1\", config_bak, config_bak, config_file, log_file))\n\t\tluci.sys.call(\"rm -f \" .. config_bak)\n\t\tluci.sys.call(\"echo '' > \" .. running_lock)\n\t\treturn install_status\n\tend\nend\n\n--Upgrade the kernel\nfunction start_amlogic_kernel()\n\tlocal cfg = get_config()\n\tluci.sys.call(\"echo '2@Kernel update in progress, try again later!' > /tmp/amlogic/amlogic_running_script.log && sync >/dev/null 2>&1\")\n\tluci.sys.call(\"chmod +x /usr/sbin/\" .. cfg.device_kernel_script .. \" >/dev/null 2>&1\")\n\tlocal state = luci.sys.call(\"/usr/sbin/\" .. cfg.device_kernel_script .. \" \" .. cfg.auto_write_bootloader .. \" > /tmp/amlogic/amlogic_check_kernel.log && sync >/dev/null 2>&1\")\n\treturn state\nend\n\n--Upgrade amlogic openwrt firmware\nfunction start_amlogic_update()\n\tlocal cfg = get_config()\n\tluci.sys.call(\"echo '3@OpenWrt update in progress, try again later!' > /tmp/amlogic/amlogic_running_script.log && sync >/dev/null 2>&1\")\n\tluci.sys.call(\"chmod +x /usr/sbin/\" .. cfg.device_update_script .. \" >/dev/null 2>&1\")\n\tlocal amlogic_update_sel = luci.http.formvalue(\"amlogic_update_sel\")\n\tlocal res = string.split(amlogic_update_sel, \"@\")\n\tlocal update_firmware_name = res[1] or \"auto\"\n\tlocal update_firmware_updated = res[2] or \"updated\"\n\tlocal update_write_path = res[3] or \"/tmp\"\n\tluci.sys.call(\"echo \" .. update_firmware_updated .. \" > \" .. update_write_path .. \"/.luci-app-amlogic/op_release_code 2>/dev/null && sync\")\n\tlocal state = luci.sys.call(\"/usr/sbin/\" .. cfg.device_update_script .. \" \" .. update_firmware_name .. \" \" .. cfg.auto_write_bootloader .. \" \" .. cfg.update_restore_config .. \" > /tmp/amlogic/amlogic_check_firmware.log && sync 2>/dev/null\")\n\treturn state\nend\n\n--Rescue kernel\nlocal function start_amlogic_rescue()\n\tlocal cfg = get_config()\n\tluci.sys.call(\"echo '4@Kernel rescue in progress, try again later!' > /tmp/amlogic/amlogic_running_script.log && sync >/dev/null 2>&1\")\n\tluci.sys.call(\"chmod +x /usr/sbin/\" .. cfg.device_kernel_script .. \" >/dev/null 2>&1\")\n\tlocal state = luci.sys.call(\"/usr/sbin/\" .. cfg.device_kernel_script .. \" -s > /tmp/amlogic/amlogic_check_rescue.log && sync >/dev/null 2>&1\")\n\tluci.sys.call(\"echo '' > /tmp/amlogic/amlogic_running_script.log && sync >/dev/null 2>&1\")\n\treturn state\nend\n\n--Install amlogic openwrt firmware\nfunction start_amlogic_install()\n\tlocal cfg = get_config()\n\tluci.sys.exec(\"chmod +x /usr/sbin/\" .. cfg.device_install_script .. \" >/dev/null 2>&1\")\n\tlocal amlogic_install_sel = luci.http.formvalue(\"amlogic_install_sel\")\n\tlocal res = string.split(amlogic_install_sel, \"@\")\n\tlocal soc_id = res[1] or \"99\"\n\tlocal dtb_filename\n\tif tonumber(res[1]) == 99 then\n\t\tdtb_filename = res[2] or \"auto_dtb\"\n\telse\n\t\tdtb_filename = \"auto_dtb\"\n\tend\n\tlocal state = luci.sys.call(\"/usr/sbin/\" .. cfg.device_install_script .. \" \" .. cfg.auto_write_bootloader .. \" \" .. soc_id .. \" \" .. dtb_filename .. \" \" .. cfg.auto_shared_fstype .. \" > /tmp/amlogic/amlogic_check_install.log && sync 2>/dev/null\")\n\treturn state\nend\n\n--Delets the snapshot\nfunction start_snapshot_delete()\n\tlocal snapshot_delete_sel = luci.http.formvalue(\"snapshot_delete_sel\")\n\tlocal state = luci.sys.exec(\"btrfs subvolume delete -c /.snapshots/\" .. snapshot_delete_sel .. \" 2>/dev/null && sync\")\n\treturn state\nend\n\n--Restore to this snapshot\nfunction start_snapshot_restore()\n\tlocal snapshot_restore_sel = luci.http.formvalue(\"snapshot_restore_sel\")\n\tlocal state = luci.sys.exec(\"btrfs subvolume snapshot /.snapshots/etc-\" .. snapshot_restore_sel .. \" /etc 2>/dev/null && sync\")\n\tlocal state_nowreboot = luci.sys.exec(\"echo 'b' > /proc/sysrq-trigger 2>/dev/null\")\n\treturn state\nend\n\n--Check the plugin (phase 1: query latest version, output Download button to log)\nfunction action_check_plugin()\n\tluci.sys.exec(\"chmod +x /usr/share/amlogic/amlogic_check_plugin.sh >/dev/null 2>&1\")\n\treturn luci.sys.call(\"/usr/share/amlogic/amlogic_check_plugin.sh -c >/dev/null 2>&1\")\nend\n\n--Check the plugin (phase 2: download the given version, output Update button to log)\nfunction action_check_plugin_download()\n\tluci.sys.exec(\"chmod +x /usr/share/amlogic/amlogic_check_plugin.sh >/dev/null 2>&1\")\n\tlocal plugin_options = luci.http.formvalue(\"plugin_options\") or \"\"\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\tcheck_plugin_status = luci.sys.call(\"/usr/share/amlogic/amlogic_check_plugin.sh -d \" .. plugin_options .. \" >/dev/null 2>&1\");\n\t})\nend\n\n--Check and download the kernel\nfunction check_kernel()\n\tluci.sys.exec(\"chmod +x /usr/share/amlogic/amlogic_check_kernel.sh >/dev/null 2>&1\")\n\tlocal kernel_options = luci.http.formvalue(\"kernel_options\")\n\tlocal state\n\tif kernel_options == \"check\" then\n\t\tstate = luci.sys.call(\"/usr/share/amlogic/amlogic_check_kernel.sh -check >/dev/null 2>&1\")\n\telse\n\t\tstate = luci.sys.call(\"/usr/share/amlogic/amlogic_check_kernel.sh -download \" .. kernel_options .. \" >/dev/null 2>&1\")\n\tend\n\treturn state\nend\n\n--Check the kernel\nfunction action_check_kernel()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\tcheck_kernel_status = check_kernel();\n\t})\nend\n\n--Check the firmware\nfunction check_firmware()\n\tluci.sys.exec(\"chmod +x /usr/share/amlogic/amlogic_check_firmware.sh >/dev/null 2>&1\")\n\tlocal firmware_options = luci.http.formvalue(\"firmware_options\")\n\tlocal state\n\tif firmware_options == \"check\" then\n\t\tstate = luci.sys.call(\"/usr/share/amlogic/amlogic_check_firmware.sh -check >/dev/null 2>&1\")\n\telse\n\t\tstate = luci.sys.call(\"/usr/share/amlogic/amlogic_check_firmware.sh -download \" .. firmware_options .. \" >/dev/null 2>&1\")\n\tend\n\treturn state\nend\n\n--Check the openwrt firmware version online\nfunction action_check_firmware()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\tcheck_firmware_status = check_firmware();\n\t})\nend\n\n--Read upload files log\nlocal function start_check_upfiles()\n\treturn luci.sys.exec(\"sed -n '$p' /tmp/amlogic/amlogic_check_upfiles.log 2>/dev/null\")\nend\n\n--Read plug-in check log\nlocal function start_check_plugin()\n\treturn luci.sys.exec(\"sed -n '$p' /tmp/amlogic/amlogic_check_plugin.log 2>/dev/null\")\nend\n\n--Read kernel check log\nlocal function start_check_kernel()\n\treturn luci.sys.exec(\"sed -n '$p' /tmp/amlogic/amlogic_check_kernel.log 2>/dev/null\")\nend\n\n--Read openwrt firmware check log\nlocal function start_check_firmware()\n\treturn luci.sys.exec(\"sed -n '$p' /tmp/amlogic/amlogic_check_firmware.log 2>/dev/null\")\nend\n\n--Read rescue kernel log\nlocal function start_check_rescue()\n\treturn luci.sys.exec(\"sed -n '$p' /tmp/amlogic/amlogic_check_rescue.log 2>/dev/null\")\nend\n\n--Read openwrt install log\nlocal function start_check_install()\n\treturn luci.sys.exec(\"sed -n '$p' /tmp/amlogic/amlogic_check_install.log 2>/dev/null\")\nend\n\n--Return online check plugin result\nfunction action_start_check_plugin()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\tstart_check_plugin = start_check_plugin();\n\t})\nend\n\n--Return online check kernel result\nfunction action_start_check_kernel()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\tstart_check_kernel = start_check_kernel();\n\t})\nend\n\n--Return online check openwrt firmware result\nfunction action_start_check_firmware()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\tstart_check_firmware = start_check_firmware();\n\t})\nend\n\n--Return online check rescue kernel result\nfunction action_start_check_rescue()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\tstart_check_rescue = start_check_rescue();\n\t})\nend\n\n--Return online install openwrt result\nfunction action_start_check_install()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\tstart_check_install = start_check_install();\n\t})\nend\n\n--Return online install openwrt result for amlogic\nfunction action_start_amlogic_install()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\trule_install_status = start_amlogic_install();\n\t})\nend\n\n--Return snapshot delete result\nfunction action_start_snapshot_delete()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\trule_delete_status = start_snapshot_delete();\n\t})\nend\n\n--Return snapshot restore result\nfunction action_start_snapshot_restore()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\trule_restore_status = start_snapshot_restore();\n\t})\nend\n\n--Return openwrt update result for amlogic\nfunction action_start_amlogic_update()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\trule_update_status = start_amlogic_update();\n\t})\nend\n\n--Return kernel update result\nfunction action_start_amlogic_kernel()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\trule_kernel_status = start_amlogic_kernel();\n\t})\nend\n\n--Return plugin update result\nfunction action_start_amlogic_plugin()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\trule_plugin_status = start_amlogic_plugin();\n\t})\nend\n\n--Return rescue kernel result\nfunction action_start_amlogic_rescue()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\tstart_amlogic_rescue = start_amlogic_rescue();\n\t})\nend\n\n--Return files upload result\nfunction action_start_check_upfiles()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\tstart_check_upfiles = start_check_upfiles();\n\t})\nend\n\n--Return the current openwrt firmware version\nlocal function current_firmware_version()\n\treturn luci.sys.exec(\"uname -r 2>/dev/null | grep -oE '^[1-9].[0-9]{1,3}.[0-9]+'\") or \"Invalid value.\"\nend\n\n--Return the current plugin version\nlocal function current_plugin_version()\n    local version_str = \"\"\n\n    -- Check if opkg command exists\n    if sys.call(\"command -v opkg >/dev/null\") == 0 then\n        local opkg_cmd = string.format(\"opkg list-installed | grep '^%s' | awk '{print $3}' | cut -d'-' -f1\", PKG_NAME)\n        version_str = trim(sys.exec(opkg_cmd))\n    end\n\n    -- If opkg failed or not found, check if apk command exists\n    if version_str == \"\" and sys.call(\"command -v apk >/dev/null\") == 0 then\n        local apk_cmd = string.format(\"apk list --installed 2>/dev/null | grep '^%s' | awk '{print $1}' | cut -d'-' -f4\", PKG_NAME)\n        version_str = trim(sys.exec(apk_cmd))\n    end\n\n    if version_str ~= \"\" then\n        return version_str\n    else\n        return \"Invalid value.\"\n    end\nend\n\n--Return the current kernel version\nlocal function current_kernel_version()\n\treturn luci.sys.exec(\"uname -r 2>/dev/null | grep -oE '^[1-9].[0-9]{1,3}.[0-9]+'\") or \"Invalid value.\"\nend\n\n--Return the current kernel branch\nlocal function current_kernel_branch()\n\tlocal default_kernel_branch = luci.sys.exec(\"uname -r 2>/dev/null | grep -oE '^[1-9].[0-9]{1,3}'\")\n\tlocal amlogic_kernel_branch = luci.sys.exec(\"uci get amlogic.config.amlogic_kernel_branch 2>/dev/null | grep -oE '^[1-9].[0-9]{1,3}'\") or \"\"\n\tif trim(amlogic_kernel_branch) == \"\" then\n\t\treturn default_kernel_branch\n\telse\n\t\treturn amlogic_kernel_branch\n\tend\nend\n\n--Return current version information\nfunction action_state()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\tcurrent_firmware_version = current_firmware_version(),\n\t\tcurrent_plugin_version = current_plugin_version(),\n\t\tcurrent_kernel_version = current_kernel_version(),\n\t\tcurrent_kernel_branch = current_kernel_branch();\n\t})\nend\n\n--Read external model database\nlocal function my_model_database()\n\tlocal cfg = get_config()\n\tif string.find(cfg.device_platfrom, \"allwinner\") then\n\t\treturn luci.sys.exec(\"cat /etc/model_database.txt 2>/dev/null | grep -E '^w[0-9]{1,9}.*:' | awk -F ':' '{print $1,$2}' OFS='###' ORS='@@@' | tr ' ' '~' 2>&1\")\n\telse\n\t\treturn luci.sys.exec(\"cat /etc/model_database.txt 2>/dev/null | grep -E '^[0-9]{1,9}.*:' | awk -F ':' '{print $1,$2}' OFS='###' ORS='@@@' | tr ' ' '~' 2>&1\")\n\tend\nend\n\n--Return external model database\nfunction action_check_model_database()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\tmy_model_database = my_model_database();\n\t})\nend\n\n--Return the current snapshot list\nlocal function current_snapshot()\n\treturn luci.sys.exec(\"btrfs subvolume list -rt / | awk '{print $4}' | grep .snapshots\") or \"Invalid value.\"\nend\n\n--Return current snapshot information\nfunction action_check_snapshot()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\tcurrent_snapshot = current_snapshot();\n\t})\nend\n\n--Return the openwrt compile author\nlocal function openwrt_author()\n\treturn luci.sys.exec(\"uci get amlogic.config.amlogic_firmware_repo 2>/dev/null\") or \"Invalid value.\"\nend\n\n--Return current snapshot information\nfunction action_openwrt_author()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\topenwrt_author = openwrt_author();\n\t})\nend\n\n--Shut down the router\nfunction action_poweroff()\n\tluci.sys.exec(\"/sbin/poweroff\")\nend\n\n--Switching dual partition\nfunction action_switch()\n\tluci.sys.exec(\"[ -f /boot/efi/EFI/BOOT/grub.cfg.prev ] && (cd /boot/efi/EFI/BOOT/ && mv -f grub.cfg grub.cfg.bak && mv -f grub.cfg.prev grub.cfg && mv -f grub.cfg.bak grub.cfg.prev)\")\n\tluci.sys.exec(\"sync && reboot\")\nend\n\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_armcpu.lua",
    "content": "--Copyright: https://github.com/coolsnowwolf/luci/tree/master/applications/luci-app-cpufreq\n--Planner: https://github.com/unifreq/openwrt_packit\n--Extended support: https://github.com/ophub/luci-app-amlogic\n--Function: Support multi-core\n\nlocal mp\n\n--Remove the spaces in the string\nfunction trim(str)\n\t--return (string.gsub(str, \"^%s*(.-)%s*$\", \"%1\"))\n\treturn (string.gsub(str, \"%s+\", \"\"))\nend\n\n--split\nfunction string.split(e, t)\n\te = tostring(e)\n\tt = tostring(t)\n\tif (t == '') then return false end\n\tlocal a, o = 0, {}\n\tfor i, t in function() return string.find(e, t, a, true) end do\n\t\ttable.insert(o, string.sub(e, a, i - 1))\n\t\ta = t + 1\n\tend\n\ttable.insert(o, string.sub(e, a))\n\treturn o\nend\n\n--Auto-complete node\nlocal check_config_settings = luci.sys.exec(\"uci get amlogic.@settings[0].governor0 2>/dev/null\") or \"\"\nif (trim(check_config_settings) == \"\") then\n\tluci.sys.exec(\"uci delete amlogic.@settings[0] 2>/dev/null\")\n\tluci.sys.exec(\"uci set amlogic.armcpu='settings' 2>/dev/null\")\n\tluci.sys.exec(\"uci commit amlogic 2>/dev/null\")\nend\n\nmp = Map(\"amlogic\")\nmp.title = translate(\"CPU Freq Settings\")\nmp.description = translate(\"Set CPU Scaling Governor to Max Performance or Balance Mode\")\n\ns = mp:section(NamedSection, \"armcpu\", \"settings\")\ns.anonymouse = true\n\nlocal cpu_policys = luci.sys.exec(\"ls /sys/devices/system/cpu/cpufreq | grep -E 'policy[0-9]{1,3}' | xargs\") or \"policy0\"\npolicy_array = string.split(cpu_policys, \" \")\n\nfor tt, policy_name in ipairs(policy_array) do\n\n\t--Dynamic tab, automatically changes according to the number of cores, begin ------\n\tpolicy_name = tostring(trim(policy_name))\n\tpolicy_id = tostring(trim(string.gsub(policy_name, \"policy\", \"\")))\n\n\ttab_name = policy_name\n\ttab_id = tostring(trim(\"tab\" .. policy_id))\n\n\tcpu_freqs = nixio.fs.readfile(trim(\"/sys/devices/system/cpu/cpufreq/\" .. policy_name .. \"/scaling_available_frequencies\")) or \"100000\"\n\tcpu_freqs = string.sub(cpu_freqs, 1, -3)\n\tcpu_governors = nixio.fs.readfile(trim(\"/sys/devices/system/cpu/cpufreq/\" .. policy_name .. \"/scaling_available_governors\")) or \"performance\"\n\tcpu_governors = string.sub(cpu_governors, 1, -3)\n\tfreq_array = string.split(cpu_freqs, \" \")\n\tgovernor_array = string.split(cpu_governors, \" \")\n\n\ts:tab(tab_id, tab_name)\n\n\ttab_core_type = s:taboption(tab_id, DummyValue, trim(\"core_type\" .. policy_id), translate(\"Microarchitectures:\"))\n\ttab_core_type.default = luci.sys.exec(\"cat /sys/devices/system/cpu/cpu\" .. policy_id .. \"/uevent | grep -E '^OF_COMPATIBLE_0.*' | tr -d 'OF_COMPATIBLE_0=' | xargs\") or \"Unknown\"\n\ttab_core_type.rmempty = false\n\n\tgovernor = s:taboption(tab_id, ListValue, trim(\"governor\" .. policy_id), translate(\"CPU Scaling Governor:\"))\n\tfor t, e in ipairs(governor_array) do\n\t\tif e ~= \"\" then governor:value(e, translate(e, string.upper(e))) end\n\tend\n\tgovernor.default = \"schedutil\"\n\tgovernor.rmempty = false\n\n\tminfreq = s:taboption(tab_id, ListValue, trim(\"minfreq\" .. policy_id), translate(\"Min Freq:\"))\n\tfor t, e in ipairs(freq_array) do\n\t\tif e ~= \"\" then minfreq:value(e) end\n\tend\n\tminfreq.default = \"500000\"\n\tminfreq.rmempty = false\n\n\tmaxfreq = s:taboption(tab_id, ListValue, trim(\"maxfreq\" .. policy_id), translate(\"Max Freq:\"))\n\tfor t, e in ipairs(freq_array) do\n\t\tif e ~= \"\" then maxfreq:value(e) end\n\tend\n\tmaxfreq.default = \"1512000\"\n\tmaxfreq.rmempty = false\n\n\t--Dynamic tab, automatically changes according to the number of cores, end ------\n\nend\n\n-- Apply the settings to the system\nfunction mp.on_after_commit(self)\n    luci.sys.exec(\"(sleep 2 && /etc/init.d/amlogic start) >/dev/null 2>&1 &\")\nend\n\nreturn mp\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_backup.lua",
    "content": "--Copyright: https://github.com/coolsnowwolf/luci/tree/master/applications/luci-app-filetransfer\n--Extended support: https://github.com/ophub/luci-app-amlogic\n--Function: Download files\n\nlocal io = require \"io\"\nlocal os = require \"os\"\nlocal fs = require \"nixio.fs\"\nlocal b, c, x\n\n-- Checks wheather the given path exists and points to a directory.\nfunction isdirectory(dirname)\n\treturn fs.stat(dirname, \"type\") == \"dir\"\nend\n\n-- Check if a file or directory exists\nfunction file_exists(path)\n\tlocal file = io.open(path, \"rb\")\n\tif file then file:close() end\n\treturn file ~= nil\nend\n\n--SimpleForm for Backup Config\nb = SimpleForm(\"backup\", nil)\nb.title = translate(\"Backup Firmware Config\")\nb.description = translate(\"Backup OpenWrt config (openwrt_config.tar.gz). Use this file to restore the config in [Manually Upload Update].\")\nb.reset = false\nb.submit = false\n\ns = b:section(SimpleSection, \"\", \"\")\n\n-- Button for customize backup list\nmy = s:option(Button, \"customize\", translate(\"Edit List:\"))\nmy.template = \"amlogic/other_button\"\n\nmy.render = function(self, section, scope)\n\tself.section = true\n\tscope.display = \"\"\n\tself.inputtitle = translate(\"Open List\")\n\tself.inputstyle = \"save\"\n\tButton.render(self, section, scope)\nend\n\nmy.write = function(self, section, scope)\n\tlocal handle = io.popen(\"[[ -s /etc/amlogic_backup_list.conf ]] || sed -n \\\"/BACKUP_LIST='/,/.*'$/p\\\" /usr/sbin/openwrt-backup | sed -e \\\"s/BACKUP_LIST=\\\\(.*\\\\)/\\\\1/; s/'//g; s/\\\\\\\\\\\\\\\\//g; s/ //g\\\" > /etc/amlogic_backup_list.conf 2>/dev/null\")\n\thandle:close()\n\tluci.http.redirect(luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"backuplist\"))\nend\n\n-- Button for download backup config\no = s:option(Button, \"download\", translate(\"Backup Config:\"))\no.template = \"amlogic/other_button\"\n\num = s:option(DummyValue, \"\", nil)\num.template = \"amlogic/other_dvalue\"\n\no.render = function(self, section, scope)\n\tself.section = true\n\tscope.display = \"\"\n\tself.inputtitle = translate(\"Download Backup\")\n\tself.inputstyle = \"save\"\n\tButton.render(self, section, scope)\nend\n\no.write = function(self, section, scope)\n\tlocal x = luci.sys.exec(\"chmod +x /usr/sbin/openwrt-backup 2>/dev/null\")\n\tlocal r = luci.sys.exec(\"/usr/sbin/openwrt-backup -b > /tmp/amlogic/amlogic.log && sync 2>/dev/null\")\n\n\tlocal sPath, sFile, fd, block\n\tsPath = \"/.reserved/openwrt_config.tar.gz\"\n\tsFile = fs.basename(sPath)\n\tif isdirectory(sPath) then\n\t\tfd = io.popen('tar -C \"%s\" -cz .' % { sPath }, \"r\")\n\t\tsFile = sFile .. \".tar.gz\"\n\telse\n\t\tfd = nixio.open(sPath, \"r\")\n\tend\n\tif not fd then\n\t\tum.value = translate(\"Couldn't open file:\") .. sPath\n\t\treturn\n\telse\n\t\tum.value = translate(\"The file Will download automatically.\") .. sPath\n\tend\n\n\tluci.http.header('Content-Disposition', 'attachment; filename=\"%s\"' % { sFile })\n\tluci.http.prepare_content(\"application/octet-stream\")\n\twhile true do\n\t\tblock = fd:read(nixio.const.buffersize)\n\t\tif (not block) or (#block == 0) then\n\t\t\tbreak\n\t\telse\n\t\t\tluci.http.write(block)\n\t\tend\n\tend\n\tfd:close()\n\tluci.http.close()\nend\n\n-- Button for restore backup list\nr = s:option(Button, \"restore\", translate(\"Restore Backup:\"))\nr.template = \"amlogic/other_button\"\n\nr.render = function(self, section, scope)\n\tself.section = true\n\tscope.display = \"\"\n\tself.inputtitle = translate(\"Upload Backup\")\n\tself.inputstyle = \"save\"\n\tButton.render(self, section, scope)\nend\n\nr.write = function(self, section, scope)\n\tluci.http.redirect(luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"upload\"))\nend\n\n-- SimpleForm for Create Snapshot\nc = SimpleForm(\"snapshot\", nil)\nc.title = translate(\"Snapshot Management\")\nc.description = translate(\"Create a snapshot of the current system configuration, or restore to a snapshot.\")\nc.reset = false\nc.submit = false\n\nd = c:section(SimpleSection, \"\", nil)\n\nw = d:option(Button, \"create_snapshot\", \"\")\nw.template = \"amlogic/other_button\"\nw.render = function(self, section, scope)\n\tself.section = true\n\tscope.display = \"\"\n\tself.inputtitle = translate(\"Create Snapshot\")\n\tself.inputstyle = \"save\"\n\tButton.render(self, section, scope)\nend\n\nw.write = function(self, section, scope)\n\tlocal x = luci.sys.exec(\"btrfs subvolume snapshot -r /etc /.snapshots/etc-\" .. os.date(\"%m.%d.%H%M%S\") .. \" 2>/dev/null && sync\")\n\tluci.http.redirect(luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"backup\"))\nend\nw = d:option(TextValue, \"snapshot_list\", nil)\nw.template = \"amlogic/other_snapshot\"\n\n--KVM virtual machine switching dual partition\nif file_exists(\"/boot/efi/EFI/BOOT/grub.cfg.prev\") then\n\tx = SimpleForm(\"kvm\", nil)\n\tx.title = translate(\"KVM dual system switching\")\n\tx.description = translate(\"You can freely switch between KVM dual partitions, using OpenWrt systems in different partitions.\")\n\tx.reset = false\n\tx.submit = false\n\n\tx:section(SimpleSection).template = \"amlogic/other_kvm\"\nend\n\nreturn b, c, x\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_backuplist.lua",
    "content": "local fs = require \"nixio.fs\"\nlocal backup_list_conf = \"/etc/amlogic_backup_list.conf\"\n\n-- Delete all spaces and tabs at the beginning of the line, and the unified line break is \\n\nfunction remove_spaces(value)\n\tlocal lines = {}\n\tfor line in value:gmatch(\"[^\\r\\n]+\") do\n\t\tline = line:gsub(\"^%s*\", \"\")\n\t\tif line ~= \"\" then\n\t\t\ttable.insert(lines, line)\n\t\tend\n\tend\n\tvalue = table.concat(lines, \"\\n\")\n\tvalue = value:gsub(\"[\\r\\n]+\", \"\\n\")\n\treturn value\nend\n\n-- Remove backslash at the end of each line\nfunction remove_backslash_at_end(value)\n\tlocal lines = {}\n\tfor line in value:gmatch(\"[^\\r\\n]+\") do\n\t\tline = line:gsub(\"%s*\\\\%s*$\", \"\")\n\t\ttable.insert(lines, line)\n\tend\n\treturn table.concat(lines, \"\\n\")\nend\n\nlocal f = SimpleForm(\"customize\",\n\ttranslate(\"Backup Configuration - Custom List\"),\n\ttranslate(\"Write one configuration item per line, and directories should end with a /.\"))\n\nlocal o = f:field(Value, \"_custom\")\n\no.template = \"cbi/tvalue\"\no.rows = 30\n\nfunction o.cfgvalue(self, section)\n\tlocal readconf = fs.readfile(backup_list_conf)\n\tlocal value = remove_spaces(readconf)\n\tlocal value = remove_backslash_at_end(value)\n\treturn value\nend\n\nfunction o.write(self, section, value)\n\tlocal value = remove_spaces(value)\n\tlocal value = remove_backslash_at_end(value)\n\tfs.writefile(backup_list_conf, value)\n\tluci.http.redirect(luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"backup\"))\nend\n\nreturn f\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_check.lua",
    "content": "local b, c\n\n--SimpleForm for Check\nb             = SimpleForm(\"amlogic\", nil)\nb.title       = translate(\"Check Update\")\nb.description = translate(\"Provide OpenWrt Firmware, Kernel and Plugin online check, download and update service.\")\nb.reset       = false\nb.submit      = false\n\nb:section(SimpleSection).template = \"amlogic/other_check\"\n\n\n--SimpleForm for Rescue Kernel\nc             = SimpleForm(\"rescue\", nil)\nc.title       = translate(\"Rescue Kernel\")\nc.description = translate(\"When a kernel update fails and causes the OpenWrt system to be unbootable, the kernel can be restored by mutual recovery from eMMC/NVMe/sdX.\")\nc.reset       = false\nc.submit      = false\n\nc:section(SimpleSection).template = \"amlogic/other_rescue\"\n\nreturn b, c"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_config.lua",
    "content": "--Remove the spaces in the string\nfunction trim(str)\n    --return (string.gsub(str, \"^%s*(.-)%s*$\", \"%1\"))\n    return (string.gsub(str, \"%s+\", \"\"))\nend\n\n--Auto-complete node\nlocal check_config_amlogic = luci.sys.exec(\"uci get amlogic.@amlogic[0].amlogic_firmware_repo 2>/dev/null\") or \"\"\nif (trim(check_config_amlogic) == \"\") then\n    luci.sys.exec(\"uci delete amlogic.@amlogic[0] 2>/dev/null\")\n    luci.sys.exec(\"uci set amlogic.config='amlogic' 2>/dev/null\")\n    luci.sys.exec(\"uci commit amlogic 2>/dev/null\")\nend\n\nb = Map(\"amlogic\")\nb.title = translate(\"Plugin Settings\")\nlocal des_content = translate(\"You can customize the github.com download repository of OpenWrt files and kernels in [Online Download Update].\")\nlocal des_content = des_content .. \"<br />\" .. translate(\"Tip: The same files as the current OpenWrt system's BOARD (such as rock5b) and kernel (such as 5.10) will be downloaded.\")\nb.description = des_content\n\no = b:section(NamedSection, \"config\", \"amlogic\")\no.anonymouse = true\n\n--1.Set OpenWrt Firmware Repository\nmydevice = o:option(DummyValue, \"mydevice\", translate(\"Current Device:\"))\nmydevice.description = translate(\"Display the PLATFORM classification of the device.\")\nmydevice_platfrom = trim(luci.sys.exec(\"cat /etc/flippy-openwrt-release 2>/dev/null | grep PLATFORM | awk -F'=' '{print $2}' | grep -oE '(amlogic|rockchip|allwinner|qemu)'\")) or \"Unknown\"\nmydevice.default = \"PLATFORM: \" .. mydevice_platfrom\nmydevice.rmempty = false\n\n--2.Set OpenWrt Firmware Repository\nfirmware_repo = o:option(Value, \"amlogic_firmware_repo\", translate(\"OpenWrt download repository:\"))\nfirmware_repo.description = translate(\"Set the OpenWrt files download repository on github.com in [Online Download Update].\")\nfirmware_repo.default = \"https://github.com/breakingbadboy/OpenWrt\"\nfirmware_repo.rmempty = false\n\n--3.Set OpenWrt Releases's Tag Keywords\nfirmware_tag = o:option(Value, \"amlogic_firmware_tag\", translate(\"OpenWrt download tags keyword:\"))\nfirmware_tag.description = translate(\"Set the OpenWrt files download tags keyword for github.com in [Online Download Update].\")\nfirmware_tag.default = \"ARMv8\"\nfirmware_tag.rmempty = false\n\n--4.Set OpenWrt Firmware Suffix\nfirmware_suffix = o:option(Value, \"amlogic_firmware_suffix\", translate(\"OpenWrt files suffix:\"))\nfirmware_suffix.description = translate(\"Set the OpenWrt files download suffix for github.com in [Online Download Update].\")\nfirmware_suffix:value(\".7z\", translate(\".7z\"))\nfirmware_suffix:value(\".zip\", translate(\".zip\"))\nfirmware_suffix:value(\".img.gz\", translate(\".img.gz\"))\nfirmware_suffix:value(\".img.xz\", translate(\".img.xz\"))\nfirmware_suffix.default = \".img.gz\"\nfirmware_suffix.rmempty = false\n\n--5.Set OpenWrt Kernel DownLoad Path\nkernel_path = o:option(Value, \"amlogic_kernel_path\", translate(\"Kernel download repository:\"))\nkernel_path.description = translate(\"Set the kernel files download repository on github.com in [Online Download Update].\")\nkernel_path:value(\"https://github.com/breakingbadboy/OpenWrt\")\nkernel_path:value(\"https://github.com/ophub/kernel\")\nkernel_path.default = \"https://github.com/breakingbadboy/OpenWrt\"\nkernel_path.rmempty = false\n\n--6. Set OpenWrt Kernel Tags\n-- Read the currently SAVED value of the kernel path.\nlocal current_kernel_path = trim(luci.sys.exec(\"uci get amlogic.config.amlogic_kernel_path 2>/dev/null\") or \"\")\n-- If it's not set yet, use its default value for the logic below.\nif current_kernel_path == \"\" then\n    current_kernel_path = kernel_path.default\nend\n-- Define the tag lists.\n-- The base list, available for all repositories.\nlocal known_tags = {\n    kernel_rk3588 = \"kernel_rk3588 [Rockchip RK3588 Kernel]\",\n    kernel_rk35xx = \"kernel_rk35xx [Rockchip RK35xx Kernel]\",\n    kernel_stable = \"kernel_stable [Mainline Stable Kernel]\",\n}\n-- Additional tags only available for the 'ophub/kernel' repository.\nlocal ophub_extra_tags = {\n    kernel_flippy = \"kernel_flippy [Mainline Stable Kernel by Flippy]\",\n    kernel_h6 = \"kernel_h6 [Allwinner H6 Kernel]\",\n    kernel_beta = \"kernel_beta [Beta Kernel]\",\n}\n-- Conditionally add the extra tags to the list.\nif (string.find(current_kernel_path, \"ophub/kernel\")) then\n    for value, display_name in pairs(ophub_extra_tags) do\n        known_tags[value] = display_name\n    end\nend\n-- Determine the default kernel tag based on existing config or system info.\nlocal kernel_tagsname\nlocal existing_tag = trim(luci.sys.exec(\"uci get amlogic.config.amlogic_kernel_tags 2>/dev/null\") or \"\")\nif existing_tag ~= \"\" then\n    kernel_tagsname = existing_tag\nelse\n    local kernel_release_info = trim(luci.sys.exec(\"uname -r 2>/dev/null\")) or \"\"\n\n    if (string.find(kernel_release_info, \"-rk3588\")) then\n        kernel_tagsname = \"kernel_rk3588\"\n    elseif (string.find(kernel_release_info, \"-rk35xx\")) then\n        kernel_tagsname = \"kernel_rk35xx\"\n    elseif (string.find(kernel_release_info, \"-h6\") or string.find(kernel_release_info, \"-zicai\")) then\n        kernel_tagsname = \"kernel_h6\"\n    else\n        kernel_tagsname = \"kernel_stable\"\n    end\nend\n-- Create the kernel tags option.\nkernel_tags = o:option(Value, \"amlogic_kernel_tags\", translate(\"Kernel download tags:\"))\nkernel_tags.description = translate(\"Set the kernel files download tags on github.com in [Online Download Update].\")\n-- Populate the dropdown with the known tags.\nfor value, display_name in pairs(known_tags) do\n    kernel_tags:value(value, translate(display_name))\nend\n-- Ensure the default tag is included in the options.\nif not known_tags[kernel_tagsname] then\n    kernel_tags:value(kernel_tagsname, kernel_tagsname)\nend\n-- Set the default and other properties.\nkernel_tags.default = kernel_tagsname\nkernel_tags.rmempty = false\n\n--7.Set kernel version branch\nkernel_branch = o:option(Value, \"amlogic_kernel_branch\", translate(\"Set version branch:\"))\nkernel_branch.description = translate(\"Set the version branch of the OpenWrt files and kernel selected in [Online Download Update].\")\nkernel_branch:value(\"5.4\", translate(\"5.4\"))\nkernel_branch:value(\"5.10\", translate(\"5.10\"))\nkernel_branch:value(\"5.15\", translate(\"5.15\"))\nkernel_branch:value(\"6.1\", translate(\"6.1\"))\nkernel_branch:value(\"6.6\", translate(\"6.6\"))\nkernel_branch:value(\"6.12\", translate(\"6.12\"))\nkernel_branch:value(\"6.18\", translate(\"6.18\"))\nlocal default_kernel_branch = luci.sys.exec(\"uname -r | grep -oE '^[1-9].[0-9]{1,3}'\")\nkernel_branch.default = trim(default_kernel_branch)\nkernel_branch.rmempty = false\n\n--8.Set plugin branch\nplugin_branch = o:option(Value, \"amlogic_plugin_branch\", translate(\"Set plugin branch:\"))\nplugin_branch.description = translate(\"Set the branch of the luci-app-amlogic plugin used in [Only update Amlogic Service]. Default (empty) uses the main (Lua) branch.\")\nplugin_branch:value(\"\", translate(\"main [Lua version]\"))\nplugin_branch:value(\"js\", translate(\"js [JavaScript version]\"))\nplugin_branch.default = \"\"\nplugin_branch.rmempty = true\n\n--9.Restore configuration\nfirmware_config = o:option(Flag, \"amlogic_firmware_config\", translate(\"Keep config update:\"))\nfirmware_config.description = translate(\"Set whether to keep the current config during [Online Download Update] and [Manually Upload Update].\")\nfirmware_config.default = \"1\"\nfirmware_config.rmempty = false\n\n--9.Write bootloader\nwrite_bootloader = o:option(Flag, \"amlogic_write_bootloader\", translate(\"Auto write bootloader:\"))\nwrite_bootloader.description = translate(\"[Recommended choice] Set whether to auto write bootloader during install and update OpenWrt.\")\nwrite_bootloader.default = \"0\"\nwrite_bootloader.rmempty = false\n\n--10.Set the file system type of the shared partition\nshared_fstype = o:option(ListValue, \"amlogic_shared_fstype\", translate(\"Set the file system type:\"))\nshared_fstype.description = translate(\"[Default ext4] Set the file system type of the shared partition (/mnt/mmcblk*p4) when install OpenWrt.\")\nshared_fstype:value(\"ext4\", translate(\"ext4\"))\nshared_fstype:value(\"f2fs\", translate(\"f2fs\"))\nshared_fstype:value(\"btrfs\", translate(\"btrfs\"))\nshared_fstype:value(\"xfs\", translate(\"xfs\"))\nshared_fstype.default = \"ext4\"\nshared_fstype.rmempty = false\n\nreturn b\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_info.lua",
    "content": "local b\n\n--SimpleForm for Info\nb             = SimpleForm(\"amlogic\", nil)\nb.title       = translate(\"Amlogic Service\")\nb.description = translate(\"Supports management of Amlogic s9xxx, Allwinner (V-Plus Cloud), and Rockchip (BeikeYun, Chainedbox L1 Pro) boxes.\")\nb.reset       = false\nb.submit      = false\n\nb:section(SimpleSection).template = \"amlogic/other_info\"\n\nreturn b\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_install.lua",
    "content": "local b\n\n--SimpleForm for Install OpenWrt to Amlogic EMMC\nb             = SimpleForm(\"amlogic_install\", nil)\nb.title       = translate(\"Install OpenWrt\")\nb.description = translate(\"Install OpenWrt to EMMC, Please select the device model, Or enter the dtb file name.\")\nb.reset       = false\nb.submit      = false\n\nb:section(SimpleSection).template = \"amlogic/other_install\"\n\nreturn b\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_log.lua",
    "content": "local b\n\n--SimpleForm for Server Logs\nb = SimpleForm(\"amlogic_log\", nil)\nb.title = translate(\"Server Logs\")\nb.description = translate(\"Display the execution log of the current operation.\")\nb.reset = false\nb.submit = false\n\ns = b:section(SimpleSection, \"\", nil)\n\no = s:option(TextValue, \"\")\no.template = \"amlogic/other_log\"\n\nreturn b\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_poweroff.lua",
    "content": "local b\n\n--SimpleForm for PowerOff\nb             = SimpleForm(\"poweroff\", nil)\nb.title       = translate(\"PowerOff\")\nb.description = translate(\"Shut down your router device.\")\nb.reset       = false\nb.submit      = false\n\nb:section(SimpleSection).template = \"amlogic/other_poweroff\"\n\nreturn b\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/model/cbi/amlogic/amlogic_upload.lua",
    "content": "--Copyright: https://github.com/coolsnowwolf/luci/tree/master/applications/luci-app-filetransfer\n--Extended support: https://github.com/ophub/luci-app-amlogic\n--Function: Upload files\n\nlocal os    = require \"os\"\nlocal fs    = require \"nixio.fs\"\nlocal nutil = require \"nixio.util\"\nlocal type  = type\nlocal b, form\n\n--Remove the spaces in the string\nfunction trim(str)\n\t--return (string.gsub(str, \"^%s*(.-)%s*$\", \"%1\"))\n\treturn (string.gsub(str, \"%s+\", \"\"))\nend\n\n-- Evaluate given shell glob pattern and return a table containing all matching\nfunction glob(...)\n\tlocal iter, code, msg = fs.glob(...)\n\tif iter then\n\t\treturn nutil.consume(iter)\n\telse\n\t\treturn nil, code, msg\n\tend\nend\n\n-- Checks wheather the given path exists and points to a regular file.\nfunction isfile(filename)\n\treturn fs.stat(filename, \"type\") == \"reg\"\nend\n\n-- Get the last modification time of given file path in Unix epoch format.\nfunction mtime(path)\n\treturn fs.stat(path, \"mtime\")\nend\n\nlocal stat_tr = {\n\treg = \"regular\",\n\tdir = \"directory\",\n\tlnk = \"link\",\n\tchr = \"character device\",\n\tblk = \"block device\",\n\tfifo = \"fifo\",\n\tsock = \"socket\"\n}\n-- Get information about given file or directory.\nfunction stat(path, key)\n\tlocal data, code, msg = fs.stat(path)\n\tif data then\n\t\tdata.mode = data.modestr\n\t\tdata.type = stat_tr[data.type] or \"?\"\n\tend\n\treturn key and data and data[key] or data, code, msg\nend\n\n--Set default upload path\nlocal ROOT_PTNAME = trim(luci.sys.exec(\"df / | tail -n1 | awk '{print $1}' | awk -F '/' '{print $3}'\"))\nif ROOT_PTNAME then\n\tif (string.find(ROOT_PTNAME, \"mmcblk[0-4]p[1-4]\")) then\n\t\tlocal EMMC_NAME = trim(luci.sys.exec(\"echo \" .. ROOT_PTNAME .. \" | awk '{print substr($1, 1, length($1)-2)}'\"))\n\t\tupload_path = trim(\"/mnt/\" .. EMMC_NAME .. \"p4/\")\n\telseif (string.find(ROOT_PTNAME, \"[hsv]d[a-z]\")) then\n\t\tlocal EMMC_NAME = trim(luci.sys.exec(\"echo \" .. ROOT_PTNAME .. \" | awk '{print substr($1, 1, length($1)-1)}'\"))\n\t\tupload_path = trim(\"/mnt/\" .. EMMC_NAME .. \"4/\")\n\telse\n\t\tupload_path = \"/tmp/upload/\"\n\tend\nelse\n\tupload_path = \"/tmp/upload/\"\nend\n\n--Clear the version check log\nluci.sys.exec(\"echo '' > /tmp/amlogic/amlogic_check_plugin.log && sync >/dev/null 2>&1\")\nluci.sys.exec(\"echo '' > /tmp/amlogic/amlogic_check_kernel.log && sync >/dev/null 2>&1\")\n\n--SimpleForm for Update OpenWrt firmware/kernel\nb = SimpleForm(\"upload\", nil)\nb.title = translate(\"Upload\")\nlocal des_content = translate(\"Update plugins first, then update the kernel or firmware.\")\nlocal des_content = des_content .. \"<br />\" .. translate(\"After uploading [Firmware], [Kernel], [IPK] or [Backup Config], the operation buttons will be displayed.\")\nb.description = des_content\nb.reset = false\nb.submit = false\n\ns = b:section(SimpleSection, \"\", \"\")\n\no = s:option(FileUpload, \"\")\no.template = \"amlogic/other_upload\"\n\num = s:option(DummyValue, \"\", nil)\num.template = \"amlogic/other_dvalue\"\n\nlocal dir, fd\ndir = upload_path\nfs.mkdir(dir)\nluci.http.setfilehandler(\n\tfunction(meta, chunk, eof)\n\tif not fd then\n\t\tif not meta then return end\n\t\tif meta and chunk then fd = nixio.open(dir .. meta.file, \"w\") end\n\t\tif not fd then\n\t\t\tum.value = translate(\"Create upload file error.\") .. \" Error Info: \" .. trim(upload_path .. meta.file)\n\t\t\treturn\n\t\tend\n\tend\n\tif chunk and fd then\n\t\tfd:write(chunk)\n\tend\n\tif eof and fd then\n\t\tfd:close()\n\t\tfd = nil\n\t\tum.value = translate(\"File saved to\") .. trim(upload_path .. meta.file)\n\tend\nend\n)\n\nif luci.http.formvalue(\"upload\") then\n\tlocal f = luci.http.formvalue(\"ulfile\")\n\tif #f <= 0 then\n\t\tum.value = translate(\"No specify upload file.\")\n\tend\nend\n\nlocal function getSizeStr(size)\n\tlocal i = 0\n\tlocal byteUnits = { ' kB', ' MB', ' GB', ' TB' }\n\trepeat\n\t\tsize = size / 1024\n\t\ti = i + 1\n\tuntil (size <= 1024)\n\treturn string.format(\"%.1f\", size) .. byteUnits[i]\nend\n\nlocal inits, attr = {}\nfor i, f in ipairs(glob(trim(upload_path .. \"*\"))) do\n\tattr = stat(f)\n\titisfile = isfile(f)\n\tif attr and itisfile then\n\t\tinits[i] = {}\n\t\tinits[i].name = fs.basename(f)\n\t\tinits[i].mtime = os.date(\"%Y-%m-%d %H:%M:%S\", attr.mtime)\n\t\tinits[i].modestr = attr.modestr\n\t\tinits[i].size = getSizeStr(attr.size)\n\t\tinits[i].remove = 0\n\t\tinits[i].ipk = false\n\n\t\t--Check whether the openwrt firmware file\n\t\t-- openwrt_s905d_v5.10.16_2021.05.31.1958.img.gz\n\t\tif (string.lower(string.sub(fs.basename(f), -7, -1)) == \".img.gz\") then\n\t\t\topenwrt_firmware_file = true\n\t\tend\n\t\t-- openwrt_s905d_n1_R21.7.15_k5.4.134-flippy-62+o.img.xz\n\t\tif (string.lower(string.sub(fs.basename(f), -7, -1)) == \".img.xz\") then\n\t\t\topenwrt_firmware_file = true\n\t\tend\n\t\t-- openwrt_s905d_n1_R21.7.15_k5.13.2-flippy-62+.7z\n\t\tif (string.lower(string.sub(fs.basename(f), -3, -1)) == \".7z\") then\n\t\t\topenwrt_firmware_file = true\n\t\tend\n\t\t-- openwrt_s905d_n1_R21.7.15_k5.13.2-flippy-62+.img\n\t\tif (string.lower(string.sub(fs.basename(f), -4, -1)) == \".img\") then\n\t\t\topenwrt_firmware_file = true\n\t\tend\n\n\t\t--Check whether the three kernel files\n\t\t-- boot-5.10.16-flippy-53+.tar.gz\n\t\tif (string.lower(string.sub(fs.basename(f), 1, 5)) == \"boot-\") then\n\t\t\tboot_file = true\n\t\tend\n\t\t-- dtb-amlogic-5.10.16-flippy-53+.tar.gz\n\t\tif (string.lower(string.sub(fs.basename(f), 1, 4)) == \"dtb-\") then\n\t\t\tdtb_file = true\n\t\tend\n\t\t-- modules-5.10.16-flippy-53+.tar.gz\n\t\tif (string.lower(string.sub(fs.basename(f), 1, 8)) == \"modules-\") then\n\t\t\tmodules_file = true\n\t\tend\n\n\t\t--Check whether the backup file\n\t\t-- openwrt_config.tar.gz\n\t\tif (string.lower(string.sub(fs.basename(f), 1, -1)) == \"openwrt_config.tar.gz\") then\n\t\t\tbackup_config_file = true\n\t\tend\n\tend\nend\n\n--SimpleForm for Upload file list\nform = SimpleForm(\"filelist\", translate(\"Upload file list\"), nil)\nform.reset = false\nform.submit = false\n\ndescription_info = \"\"\nluci.sys.exec(\"echo '' > /tmp/amlogic/amlogic_check_upfiles.log && sync >/dev/null 2>&1\")\n\nif backup_config_file then\n\tdescription_info = description_info .. translate(\"There are config file in the upload directory, and you can restore the config. \")\nend\n\nif boot_file and dtb_file and modules_file then\n\tdescription_info = description_info .. translate(\"There are kernel files in the upload directory, and you can replace the kernel.\")\n\tluci.sys.exec(\"echo 'kernel' > /tmp/amlogic/amlogic_check_upfiles.log && sync >/dev/null 2>&1\")\nend\n\nif openwrt_firmware_file then\n\tdescription_info = description_info .. translate(\"There are openwrt firmware file in the upload directory, and you can update the openwrt.\")\n\tluci.sys.exec(\"echo 'firmware' > /tmp/amlogic/amlogic_check_upfiles.log && sync >/dev/null 2>&1\")\nend\n\nif description_info ~= \"\" then\n\tform.description = ' <span style=\"color: green\"><b> Tip: ' .. description_info .. ' </b></span> '\nend\n\ntb = form:section(Table, inits)\nnm = tb:option(DummyValue, \"name\", translate(\"File name\"))\nmt = tb:option(DummyValue, \"mtime\", translate(\"Modify time\"))\nms = tb:option(DummyValue, \"modestr\", translate(\"Attributes\"))\nsz = tb:option(DummyValue, \"size\", translate(\"Size\"))\nbtnrm = tb:option(Button, \"remove\", translate(\"Remove\"))\nbtnrm.render = function(self, section, scope)\n\tself.inputstyle = \"remove\"\n\tButton.render(self, section, scope)\nend\nbtnrm.write = function(self, section)\n\tlocal v = fs.unlink(trim(upload_path .. fs.basename(inits[section].name)))\n\tif v then table.remove(inits, section) end\n\treturn v\nend\n\nfunction IsConfigFile(name)\n\tname = name or \"\"\n\tlocal config_file = string.lower(string.sub(name, 1, -1))\n\treturn config_file == \"openwrt_config.tar.gz\"\nend\n\n-- Check if the file is a known package type (.ipk or .apk)\nfunction IsPackageFile(name)\n\tname = name or \"\"\n\tlocal lname = string.lower(name)\n\treturn string.sub(lname, -4) == \".ipk\" or string.sub(lname, -4) == \".apk\"\nend\n\n--Add Button for *.ipk\nbtnis = tb:option(Button, \"ipk\", translate(\"Install\"))\nbtnis.template = \"amlogic/other_button\"\nbtnis.render = function(self, section, scope)\n\tif not inits[section] then return false end\n\tif IsPackageFile(inits[section].name) then\n\t\tscope.display = \"\"\n\t\tself.inputtitle = translate(\"Install\")\n\telseif IsConfigFile(inits[section].name) then\n\t\tscope.display = \"\"\n\t\tself.inputtitle = translate(\"Restore\")\n\telse\n\t\tscope.display = \"none\"\n\tend\n\n\tself.inputstyle = \"apply\"\n\tButton.render(self, section, scope)\nend\nbtnis.write = function(self, section)\n\tlocal file_to_install = inits[section].name\n\tlocal full_path = upload_path .. file_to_install\n\n\tif IsPackageFile(file_to_install) then\n\t\tlocal r = \"\"\n\t\tlocal install_cmd = \"\"\n\n\t\t-- Check for opkg first\n\t\tif luci.sys.call(\"command -v opkg >/dev/null\") == 0 then\n\t\t\tinstall_cmd = string.format('opkg --force-reinstall install %s', full_path)\n\t\t\tr = luci.sys.exec(install_cmd)\n\t\t-- If opkg is not found, check for apk\n\t\telseif luci.sys.call(\"command -v apk >/dev/null\") == 0 then\n\t\t\t-- NOTE: --allow-untrusted is required for local packages\n\t\t\tinstall_cmd = string.format('apk add --force-overwrite --allow-untrusted %s', full_path)\n\t\t\tr = luci.sys.exec(install_cmd)\n\t\t-- If neither is found\n\t\telse\n\t\t\tr = \"Error: Neither 'opkg' nor 'apk' package manager found on the system.\"\n\t\tend\n\n\t\t-- Clean LuCI cache after installation\n\t\tluci.sys.exec(\"rm -rf /tmp/luci-indexcache /tmp/luci-modulecache/* >/dev/null 2>&1\")\n\n\t\t-- Display the result message\n\t\t-- We add a message to prompt the user to refresh the page to see changes.\n\t\tlocal result_msg = r .. \"<br/><b>\" .. translate(\"Please refresh the page to see the changes.\") .. \"</b>\"\n\t\tform.description = string.format('<span style=\"color: red\">%s</span>', result_msg)\n\n\telseif IsConfigFile(inits[section].name) then\n\t\tform.description = ' <span style=\"color: green\"><b> ' .. translate(\"Tip: The config is being restored, and it will automatically restart after completion.\") .. ' </b></span> '\n\t\tluci.sys.exec(\"chmod +x /usr/sbin/openwrt-backup 2>/dev/null\")\n\t\tluci.sys.exec(\"/usr/sbin/openwrt-backup -r > /tmp/amlogic/amlogic.log && sync 2>/dev/null\")\n\tend\nend\n\n--SimpleForm for Check upload files\nform:section(SimpleSection).template = \"amlogic/other_upfiles\"\n\nreturn b, form\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_button.htm",
    "content": "<%+cbi/valueheader%>\n\t<% if self:cfgvalue(section) ~= false then %>\n\t\t<input class=\"cbi-button cbi-button-<%=self.inputstyle or \"button\" %>\" style=\"display: <%= display %>\" type=\"submit\" <%= attr(\"name\", cbid) .. attr(\"id\", cbid) .. attr(\"value\", self.inputtitle or self.title)%> />\n\t<% else %>\n\t\t-\n\t<% end %>\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_check.htm",
    "content": "<style>\n.NewsTdHeight{ line-height: 20px; }\n</style>\n<fieldset class=\"cbi-section\">\n\t<table width=\"100%\" class=\"NewsTdHeight\">\n\t\t<tr><td width=\"100%\" colspan=\"2\">\n\t\t\t<p align=\"center\">\n\t\t\t\t<%:Update plugins first, then update the kernel or firmware. More options can be configured in [Plugin Settings].%> <span id=\"_openwrt_mainline_version\"></span>\n\t\t\t</p>\n\t\t</td></tr>\n\t\t<tr><td width=\"35%\" align=\"right\"><input type=\"button\" class=\"cbi-button cbi-button-reload\" value=\"<%:Only update Amlogic Service%>\" onclick=\"return b_check_plugin(this)\"/></td><td  width=\"65%\" align=\"left\"><span id=\"_current_plugin_version\"><%:Collecting data...%></span>　<span id=\"_check_plugin\"></span></td></tr>\n\t\t<tr><td width=\"35%\" align=\"right\"><input type=\"button\" class=\"cbi-button cbi-button-reload\" value=\"<%:Update system kernel only%>\" onclick=\"return b_check_kernel(this, 'check')\"/></td><td  width=\"65%\" align=\"left\"><span id=\"_current_kernel_version\"><%:Collecting data...%></span>　<span id=\"_check_kernel\"></span></td></tr>\n\t\t<tr><td width=\"35%\" align=\"right\"><input type=\"button\" class=\"cbi-button cbi-button-reload\" value=\"<%:Complete system update%>\" onclick=\"return b_check_firmware(this, 'check')\"/></td><td  width=\"65%\" align=\"left\"><span id=\"_current_firmware_version\"><%:Collecting data...%></span>　<span id=\"_check_firmware\"></span></td></tr>\n\t</table>\n</fieldset>\n<script type=\"text/javascript\">//<![CDATA[\n\n\tfunction amlogic_update(btn,amlogic_update_sel)\n\t{\n\t\tbtn.disabled = true;\n\t\tbtn.value    = '<%:Updating...%> ';\n\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_amlogic_update\")%>',\n\t\t\t{\n\t\t\t\tamlogic_update_sel: amlogic_update_sel\n\t\t\t},\n\t\t\tfunction(x,status)\n\t\t\t{\n\t\t\t\tif ( x && x.status == 200 ) {\n\t\t\t\t\tbtn.value = (status.rule_update_status == \"0\") ? '<%:Successful Update%>' : '<%:Update Failed%>';\n\t\t\t\t} else {\n\t\t\t\t\tbtn.value = '<%:Update%>';\n\t\t\t\t}\n\t\t\t\tbtn.disabled = false;\n\t\t\t}\n\t\t);\n\t\treturn false;\n\t}\n\n\tfunction amlogic_kernel(btn)\n\t{\n\t\tbtn.disabled = true;\n\t\tbtn.value    = '<%:Updating...%> ';\n\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_amlogic_kernel\")%>', null, function(x, status) {\n\t\t\t\tif ( x && x.status == 200 ) {\n\t\t\t\t\tbtn.value = (status.rule_kernel_status == \"0\") ? '<%:Successful Update%>' : '<%:Update Failed%>';\n\t\t\t\t} else {\n\t\t\t\t\tbtn.value = '<%:Update%>';\n\t\t\t\t}\n\t\t\t\tbtn.disabled = false;\n\t\t\t}\n\t\t);\n\t\treturn false;\n\t}\n\n\tfunction amlogic_plugin(btn)\n\t{\n\t\tbtn.disabled = true;\n\t\tbtn.value    = '<%:Updating...%> ';\n\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_amlogic_plugin\")%>', null, function(x, status) {\n\t\t\t\tif ( x && x.status == 200 ) {\n\t\t\t\t\tbtn.value = (status.rule_plugin_status == \"0\") ? '<%:Successful Update%>' : '<%:Update Failed%>';\n\t\t\t\t} else {\n\t\t\t\t\tbtn.value = '<%:Update%>';\n\t\t\t\t}\n\t\t\t\tbtn.disabled = false;\n\t\t\t}\n\t\t);\n\t\treturn false;\n\t}\n\n\tfunction b_check_firmware(btn,firmware_options)\n\t{\n\t\tbtn.disabled = true;\n\t\tbtn.value = '<%:Checking...%>';\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"check_firmware\")%>',\n\t\t\t{\n\t\t\t\tfirmware_options: firmware_options\n\t\t\t},\n\t\t\tfunction(x,status)\n\t\t\t{\n\t\t\t\tbtn.value = '<%:Complete system update%>';\n\t\t\t\tbtn.disabled = false;\n\t\t\t}\n\t\t);\n\t\treturn false;\n\t}\n\n\t// b_check_plugin handles both phases:\n\t//   Phase 1 (check):    called with no second arg — queries latest version, log shows Download button\n\t//   Phase 2 (download): called with 'download_VERSION' — downloads the package, log shows Update button\n\tfunction b_check_plugin(btn, plugin_options)\n\t{\n\t\tbtn.disabled = true;\n\t\tif (plugin_options && plugin_options.indexOf('download_') === 0) {\n\t\t\t// Phase 2: download the specified version\n\t\t\tbtn.value = '<%:Downloading...%>';\n\t\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"check_plugin_download\")%>',\n\t\t\t\t{ plugin_options: plugin_options },\n\t\t\t\tfunction(x, status) {\n\t\t\t\t\tbtn.disabled = false;\n\t\t\t\t\tbtn.value = '<%:Only update Amlogic Service%>';\n\t\t\t\t}\n\t\t\t);\n\t\t} else {\n\t\t\t// Phase 1: check for new version\n\t\t\tbtn.value = '<%:Checking...%>';\n\t\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"check_plugin\")%>', null,\n\t\t\t\tfunction(x, status) {\n\t\t\t\t\tbtn.disabled = false;\n\t\t\t\t\tbtn.value = '<%:Only update Amlogic Service%>';\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t\treturn false;\n\t}\n\n\t// Called from the log-injected Download button (two-phase new script)\n\tfunction b_check_plugin_download(btn, plugin_options)\n\t{\n\t\treturn b_check_plugin(btn, plugin_options);\n\t}\n\n\tfunction b_check_kernel(btn,kernel_options)\n\t{\n\t\tbtn.disabled = true;\n\t\tbtn.value = '<%:Checking...%>';\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"check_kernel\")%>',\n\t\t\t{\n\t\t\t\tkernel_options: kernel_options\n\t\t\t},\n\t\t\tfunction(x,status)\n\t\t\t{\n\t\t\t\tbtn.value = '<%:Update system kernel only%>';\n\t\t\t\tbtn.disabled = false;\n\t\t\t}\n\t\t);\n\t\treturn false;\n\t}\n\n\tvar _check_firmware = document.getElementById('_check_firmware');\n\tXHR.poll(1, '<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_check_firmware\")%>', status.start_check_firmware, function(x, status) {\n\tif ( x && x.status == 200 ) {\n\t\tif ( status.start_check_firmware != \"\\n\" && status.start_check_firmware != \"\" ) {\n\t\t\t_check_firmware.innerHTML = '<font color=\"blue\"> '+status.start_check_firmware+'</font>';\n\t\t}\n\t\tif ( status.start_check_firmware == \"\\n\" || status.start_check_firmware == \"\" ) {\n\t\t\t_check_firmware.innerHTML = '';\n\t\t}\n\t}\n\t});\n\n\tvar _check_plugin = document.getElementById('_check_plugin');\n\tXHR.poll(1, '<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_check_plugin\")%>', status.start_check_plugin, function(x, status) {\n\tif ( x && x.status == 200 ) {\n\t\tif ( status.start_check_plugin != \"\\n\" && status.start_check_plugin != \"\" ) {\n\t\t\t_check_plugin.innerHTML = '<font color=\"blue\"> '+status.start_check_plugin+'</font>';\n\t\t}\n\t\tif ( status.start_check_plugin == \"\\n\" || status.start_check_plugin == \"\" ) {\n\t\t\t_check_plugin.innerHTML = '';\n\t\t}\n\t}\n\t});\n\n\tvar _check_kernel = document.getElementById('_check_kernel');\n\tXHR.poll(1, '<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_check_kernel\")%>', status.start_check_kernel, function(x, status) {\n\tif ( x && x.status == 200 ) {\n\t\tif ( status.start_check_kernel != \"\\n\" && status.start_check_kernel != \"\" ) {\n\t\t\t_check_kernel.innerHTML = '<font color=\"blue\"> '+status.start_check_kernel+'</font>';\n\t\t}\n\t\tif ( status.start_check_kernel == \"\\n\" || status.start_check_kernel == \"\" ) {\n\t\t\t_check_kernel.innerHTML = '';\n\t\t}\n\t}\n\t});\n\n\tvar _current_firmware_version = document.getElementById('_current_firmware_version');\n\tvar _current_plugin_version = document.getElementById('_current_plugin_version');\n\tvar _current_kernel_version = document.getElementById('_current_kernel_version');\n\tvar _openwrt_mainline_version = document.getElementById('_openwrt_mainline_version');\n\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"state\")%>', null, function(x, status) {\n\tif ( x && x.status == 200 ) {\n\t\t_current_firmware_version.innerHTML = status.current_firmware_version ? \"<font color=green><%:Current Version%> [ \"+status.current_firmware_version+\" ] </font>\" : \"<font color=red>\"+\"<%:Invalid value.%>\"+\"</font>\";\n\t\t_current_plugin_version.innerHTML = status.current_plugin_version ? \"<font color=green><%:Current Version%> [ \"+status.current_plugin_version+\" ] </font>\" : \"<font color=red>\"+\"<%:Invalid value.%>\"+\"</font>\";\n\t\t_current_kernel_version.innerHTML = status.current_kernel_version ? \"<font color=green><%:Current Version%> [ \"+status.current_kernel_version+\" ] </font>\" : \"<font color=red>\"+\"<%:Invalid value.%>\"+\"</font>\";\n\t\t_openwrt_mainline_version.innerHTML = status.current_kernel_branch ? \" [ \"+status.current_kernel_branch+\".y ] \" : \"[ \"+\"<%:Invalid value.%>\"+\" ]\";\n\t}\n\t});\n\n//]]></script>\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_dvalue.htm",
    "content": "<%+cbi/valueheader%>\n<span style=\"color: red\">\n<%\n\tlocal val = self:cfgvalue(section) or self.default or \"\"\n\twrite(pcdata(val))\n%>\n</span>\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_info.htm",
    "content": "<style>\n.NewsTdHeight{ line-height:20px; }\n</style>\n<fieldset class=\"cbi-section\">\n\t<table width=\"100%\" class=\"NewsTdHeight\">\n\t\t<tr><td colspan=\"2\" width=\"100%\" align=\"center\">\n\t\t\t<img id=\"logo_amlogic\" src=\"<%=resource%>/amlogic/logo.png\" alt=\"Logo\" width=\"135\" />\n\t\t</td></tr>\n\t\t<tr><td colspan=\"2\" width=\"100%\" align=\"center\">\n\t\t\t<img id=\"Packit\" src=\"<%=resource%>/amlogic/packit.svg\" alt=\"Packit\" width=\"168px\" height=\"20px\" onclick=\"return homepage('packit')\" />\n\t\t\t&nbsp;&nbsp;\n\t\t\t<img id=\"Author\" src=\"<%=resource%>/amlogic/author.svg\" alt=\"Author\" width=\"168px\" height=\"20px\" onclick=\"return author_homepage('author')\" />\n\t\t\t&nbsp;&nbsp;\n\t\t\t<img id=\"Plugin\" src=\"<%=resource%>/amlogic/plugin.svg\" alt=\"luci-app-amlogic\" width=\"160px\" height=\"20px\" onclick=\"return homepage('plugin')\" />\n\t\t</td></tr>\n\t\t<tr><td width=\"20%\" align=\"right\"><%:Supported functions:%></td><td  width=\"80%\" align=\"left\" id=\"_clash\">\n\t\t\t<%:Provide services such as install to EMMC, Update Firmware and Kernel, Backup and Recovery Config, Snapshot management, etc.%>\n\t\t</td></tr>\n\t\t<tr><td width=\"20%\" align=\"right\"><%:Supported Boxes:%></td><td  width=\"80%\" align=\"left\" id=\"_clash\">\n\t\t\t<%:Amlogic s922x --- [ Beelink, Beelink-Pro, Ugoos-AM6-Plus, ODROID-N2, Khadas-VIM3, Ali-CT2000 ]%><br>\n\t\t\t<%:Amlogic s905x3 -- [ X96-Max+, HK1-Box, H96-Max-X3, Ugoos-X3, TX3, X96-Air, A95XF3-Air ]%><br>\n\t\t\t<%:Amlogic s905x2 -- [ X96Max-4G, X96Max-2G, MECOOL-KM3-4G, Tanix-Tx5-Max, A95X-F2 ]%><br>\n\t\t\t<%:Amlogic s912 ---- [ H96-Pro-Plus, Octopus-Planet, A1, A2, Z6-Plus, TX92, X92, TX8-MAX, TX9-Pro ]%><br>\n\t\t\t<%:Amlogic s905x --- [ HG680P, B860H, TBee, T95, TX9, XiaoMI-3S, X96 ]%><br>\n\t\t\t<%:Amlogic s905w --- [ X96-Mini, TX3-Mini, W95, X96W/FunTV, MXQ-Pro-4K ]%><br>\n\t\t\t<%:Amlogic s905d --- [ Phicomm-N1, MECOOL-KI-Pro, SML-5442TW ]%><br>\n\t\t\t<%:Amlogic s905l --- [ UNT402A, M201-S ]%><br>\n\t\t\t<%:Amlogic s905l2 -- [ MGV2000, MGV3000, Wojia-TV-IPBS9505, M301A, E900v21E ]%><br>\n\t\t\t<%:Amlogic s905l3 -- [ CM211-1, CM311-1, HG680-LC, M401A, UNT400G1, UNT402A, ZXV10-BV310 ]%><br>\n\t\t\t<%:Amlogic s905l3a - [ E900V22C/D, CM311-1a-YST, M401A, M411A, UNT403A, UNT413A, IP112H ]%><br>\n\t\t\t<%:Amlogic s905l3b - [ CM211-1, CM311-1, E900V22D, E900V21E, E900V22E, M302A/M304A ]%><br>\n\t\t\t<%:Amlogic s905 ---- [ Beelink-Mini-MX-2G, Sunvell-T95M, MXQ-Pro+4K, SumaVision-Q5 ]%><br>\n\t\t\t<%:Allwinner H6 ---- [ V-Plus Cloud ]%><br>\n\t\t\t<%:Rockchip -------- [ BeikeYun, L1-Pro, FastRhino R66S/R68S, Radxa 5B/E25 ]%><br>\n\t\t\t<%:Used in KVM ----- [ Can be used in KVM virtual machine of Armbian system. ]%>\n\t\t</td></tr>\n\t</table>\n</fieldset>\n<script type=\"text/javascript\">//<![CDATA[\n\n\tfunction winOpen(url)\n\t{\n\t\tvar winOpen = window.open(url);\n\t\tif( winOpen == null || typeof(winOpen) == 'undefined' ){ window.location.href=url; }\n\t}\n\n\tfunction homepage(website)\n\t{\n\t\tvar url = \"\";\n\t\tif( website == 'packit' ) { url = 'https://github.com/unifreq/openwrt_packit'; }\n\t\tif( website == 'plugin' ) { url = 'https://github.com/ophub/luci-app-amlogic'; }\n\t\tif ( url != \"\" ) { winOpen(url); }\n\t}\n\n\tfunction author_homepage(website)\n\t{\n\t\tvar openwrt_author_repo = \"\";\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_openwrt_author\")%>', null, function(x, status) {\n\t\tif ( x && x.status == 200 ) {\n\t\t\tlet openwrt_author_repo = status.openwrt_author;\n\t\t\tlet trimstr_au = openwrt_author_repo.replace(/(^\\s*)|(\\s*$)/g, \"\");\n\t\t\tif (trimstr_au.indexOf(\"https\") == -1) {\n\t\t\t\ttrimstr_au = 'https://github.com/' + trimstr_au;\n\t\t\t}\n\t\t\tif ( trimstr_au != \"\" ) { winOpen(trimstr_au); }\n\t\t}\n\t\t});\n\t}\n\n//]]></script>\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_install.htm",
    "content": "<style>\n.NewsTdHeight{ line-height:20px; }\n</style>\n<fieldset class=\"cbi-section\">\n\t<table width=\"100%\" class=\"NewsTdHeight\">\n\t\t<tr><td width=\"35%\" align=\"right\"><%:Select the device model:%></td>\n\t\t\t<td  width=\"65%\" align=\"left\">\n\t\t\t\t<select name=\"amlogic_soc\" id=\"amlogic_soc\" style=\"width:auto\" onchange=\"sel_dtb_input(this.options[this.selectedIndex].value)\">\n\t\t\t\t<option value=\"0\"><%:Select List%></option>\n\t\t\t\t<option value=\"99\"><%:Enter the dtb file name%></option>\n\t\t\t\t</select>\n\t\t\t</td>\n\t\t</tr>\n\t\t<tr id=\"tr_sel_dtb\" style=\"display:none;\"><td width=\"30%\" align=\"right\"><%:Enter the dtb file name:%></td><td  width=\"70%\" align=\"left\"><input class=\"cbi-input-file\" style=\"width: 235px\" type=\"text\" id=\"amlogic_dtb\" name=\"amlogic_dtb\" /></td></tr>\n\t\t<tr id=\"tr_sel_soc\" style=\"display:none;\"><td width=\"30%\" align=\"right\"><%:Enter the soc name:%></td><td  width=\"70%\" align=\"left\"><input class=\"cbi-input-file\" style=\"width: 235px\" type=\"text\" id=\"amlogic_socname\" name=\"amlogic_socname\" /></td></tr>\n\t\t<tr id=\"tr_sel_uboot\" style=\"display:none;\"><td width=\"30%\" align=\"right\"><%:Enter the uboot_overload name:%></td><td  width=\"70%\" align=\"left\"><input class=\"cbi-input-file\" style=\"width: 235px\" type=\"text\" id=\"amlogic_uboot\" name=\"amlogic_uboot\" /></td></tr>\n\t\t<tr>\n\t\t\t<td width=\"30%\" align=\"right\"><%:Install OpenWrt:%></td>\n\t\t\t<td  width=\"70%\" align=\"left\">\n\t\t\t\t<input type=\"button\" class=\"cbi-button cbi-button-reload\" value=\"<%:Install%>\" onclick=\"return amlogic_install(this, '<%=self:cfgvalue(section)%>')\"/>　<span id=\"_check_install\"></span>\n\t\t\t</td>\n\t\t</tr>\n\t</table>\n</fieldset>\n<script type=\"text/javascript\">//<![CDATA[\n\n\t// Show custom dtb input box\n\tfunction sel_dtb_input(soc_value){\n\t\tif ( soc_value == \"99\" )\n\t\t{\n\t\t\tdocument.getElementById('tr_sel_dtb').style = '';\n\t\t\tdocument.getElementById('tr_sel_soc').style = '';\n\t\t\tdocument.getElementById('tr_sel_uboot').style = '';\n\t\t}\n\t\telse\n\t\t{\n\t\t\tdocument.getElementById('tr_sel_dtb').style = 'display:none;';\n\t\t\tdocument.getElementById('tr_sel_soc').style = 'display:none;';\n\t\t\tdocument.getElementById('tr_sel_uboot').style = 'display:none;';\n\t\t}\n\t}\n\n\t// Show the status of the install button\n\tfunction amlogic_install(btn,amlogic_install_sel)\n\t{\n\t\tvar amlogic_soc_id = document.getElementById('amlogic_soc');\n\t\tvar amlogic_soc_index = amlogic_soc_id.selectedIndex;\n\t\tvar amlogic_soc_value = amlogic_soc_id.options[amlogic_soc_index].value;\n\t\tvar amlogic_soc_text = amlogic_soc_id.options[amlogic_soc_index].text;\n\n\t\tvar amlogic_dtb_id = document.getElementById('amlogic_dtb');\n\t\tvar amlogic_dtb_value = amlogic_dtb_id.value;\n\n\t\tvar amlogic_soc_name = document.getElementById('amlogic_socname');\n\t\tvar amlogic_socname_value = amlogic_socname.value;\n\n\t\tvar amlogic_ubootname = document.getElementById('amlogic_uboot');\n\t\tvar amlogic_ubootname_value = amlogic_ubootname.value;\n\n\t\tvar amlogic_confirm_info = amlogic_soc_text;\n\t\tif (confirm('<%:You have chosen:%>' + amlogic_confirm_info + ', <%:Start install?%>') != true) { return false; }\n\n\t\tbtn.disabled = true;\n\t\tbtn.value    = '<%:Installing...%> ';\n\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_amlogic_install\")%>',\n\t\t\t{\n\t\t\t\tamlogic_install_sel: amlogic_soc_value + '@' + amlogic_dtb_value + ':' + amlogic_socname_value + ':' + amlogic_ubootname_value\n\t\t\t},\n\t\t\tfunction(x,status)\n\t\t\t{\n\t\t\t\tif ( x && x.status == 200 ) {\n\t\t\t\t\tif(status.rule_install_status!=\"0\")\n\t\t\t\t\t{\n\t\t\t\t\t\tbtn.value = '<%:Install Failed%>';\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbtn.value = '<%:Successful Install%>';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tbtn.value = '<%:Install%>';\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\tbtn.disabled = false;\n\t\treturn false;\n\t}\n\n\t// Read openwrt install log\n\tvar start_check_install = document.getElementById('_check_install');\n\tXHR.poll(1, '<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_check_install\")%>', status.start_check_install, function(x, status) {\n\tif ( x && x.status == 200 ) {\n\t\tif ( status.start_check_install != \"\\n\" && status.start_check_install != \"\" ) {\n\t\t\tstart_check_install.innerHTML = '<font color=\"blue\"> '+status.start_check_install+'</font>';\n\t\t}\n\t\tif ( status.start_check_install == \"\\n\" || status.start_check_install == \"\" ) {\n\t\t\tstart_check_install.innerHTML = '';\n\t\t}\n\t}\n\t});\n\n\t// Show external modal database: /etc/model_database.txt\n\tvar mymodel_arrlen = 0;\n\tvar _option_codes = '<option value=\"0\"><%:Select List%></option>';\n\tvar _check_my_amlogic_soc = document.getElementById('amlogic_soc');\n\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_model_database\")%>', null, function(x, status) {\n\t\tif ( x && x.status == 200 ) {\n\t\t\tif ( status.my_model_database != \"\" ) {\n\t\t\t\tlet userModelList = status.my_model_database;\n\t\t\t\tvar user_arry = userModelList.split('@@@');\n\t\t\t\tvar mymodel_arrlen = user_arry.length - 1;\n\t\t\t\tfor ( j = 0; j < mymodel_arrlen; j++ ) {\n\t\t\t\t\tmy_box_mode = user_arry[j].split('###');\n\t\t\t\t\tmy_box_mode_id = my_box_mode[0];\n\t\t\t\t\tmy_box_mode_name = my_box_mode[1];\n\t\t\t\t\tif ( my_box_mode_id != \"\" && my_box_mode_name != \"\" ) {\n\t\t\t\t\t\t_option_codes = _option_codes + '<option value=\"' + my_box_mode_id + '\">[ ' + my_box_mode_id + ' ] ' + my_box_mode_name.replace(/~/g, \" \") + '</option>';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_option_codes = _option_codes + '<option value=\"99\"><%:Enter the dtb file name%></option>';\n\t\t_check_my_amlogic_soc.innerHTML = _option_codes;\n\t});\n\n//]]></script>\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_kvm.htm",
    "content": "<style>\n.NewsTdHeight{ line-height:32px; }\n.imgLeft{ float:left; margin-right:10px; vertical-align:middle; }\n.contentRight{ align-items: center; }\n</style>\n<fieldset class=\"cbi-section\">\n\t<table width=\"100%\" class=\"NewsTdHeight\">\n\t\t<tr><td width=\"100%\" align=\"left\">\n\t\t\t<input class=\"cbi-button cbi-button-save\" type=\"button\" value=\"<%:Switch System%>\" onclick=\"switchopenwrt(this)\" />\n\t\t\t<p style=\"display:none\">\n\t\t\t\t<img id=\"img_loading\" style=\"display:block\" src=\"<%=resource%>/amlogic/loading.gif\" alt=\"<%:Loading%>\" class=\"imgLeft\" />\n\t\t\t\t<img id=\"img_switch\" style=\"display:none\" src=\"<%=resource%>/amlogic/switch.png\" alt=\"<%:PowerOff%>\" class=\"imgLeft\" />\n\t\t\t\t<span id=\"msg_switch\" class=\"contentRight\"><%:System is switching...%></span>\n\t\t\t</p>\n\t\t</td></tr>\n\t</table>\n</fieldset>\n\n<script type=\"text/javascript\">//<![CDATA[\n\n\tfunction status_check() {\n\t\tvar time = 5;\n\t\tvar img_loading = document.getElementById(\"img_loading\");\n\t\tvar img_switch = document.getElementById(\"img_switch\");\n\t\tvar msg = document.getElementById(\"msg_switch\");\n\t\tvar set = setInterval(function() {\n\t\t\ttime--;\n\t\t\tmsg.innerHTML = \"<%:Waiting for system switching...%>\";\n\t\t\tif(time === 0) {\n\t\t\t\timg_loading.style.display = 'none';\n\t\t\t\timg_switch.style.display = 'block';\n\t\t\t\tmsg.innerHTML = \"<%:System switchover succeeded, restarting...%>\";\n\t\t\t\tclearInterval(set);\n\t\t\t}\n\t\t}, 1000);\n\t}\n\n\tfunction switchopenwrt(btn) {\n\t\tif (confirm('<%:Are you sure you want to switch systems?%>') != true) { return false; }\n\n\t\tbtn.style.display = 'none';\n\t\tdocument.getElementById('msg_switch').parentNode.style.display = 'block';\n\n\t\t(new XHR()).post('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_switch\")%>', { token: '<%=token%>' }, status_check);\n\t}\n\n\n//]]></script>\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_log.htm",
    "content": "<%+cbi/valueheader%>\n<textarea id=\"amlogic.ophub.clog\" class=\"cbi-input-textarea\" style=\"width: 100%;display:inline\" data-update=\"change\" rows=\"8\" cols=\"60\" readonly=\"readonly\" > </textarea>\n<fieldset class=\"cbi-section\">\n\t<table width=\"100%\">\n\t\t<tr>\n\t\t\t<td width=\"25%\" align=\"center\"><input type=\"button\" class=\"cbi-button cbi-button-apply\" id=\"stop_refresh_button\" value=\"<%:Stop Refresh Log%>\" onclick=\" return stop_refresh() \"/></td>\n\t\t\t<td width=\"25%\" align=\"center\"><input type=\"button\" class=\"cbi-button cbi-button-apply\" id=\"start_refresh_button\" value=\"<%:Start Refresh Log%>\" onclick=\" return start_refresh() \"/></td>\n\t\t\t<td width=\"25%\" align=\"center\"><input type=\"button\" class=\"cbi-button cbi-button-apply\" id=\"del_log_button\" value=\"<%:Clean Log%>\" style=\" display:inline;\" onclick=\" return del_log() \" /></td>\n\t\t\t<td width=\"25%\" align=\"center\"><input type=\"button\" class=\"cbi-button cbi-button-apply\" id=\"down_log_button\" value=\"<%:Download Log%>\" style=\" display:inline;\" onclick=\" return download_log() \" /></td>\n\t\t</tr>\n\t</table>\n</fieldset>\n\n<script type=\"text/javascript\">//<![CDATA[\nvar r\n\nfunction stop_refresh() {\n\tclearTimeout(r);\n\treturn\n}\n\nfunction start_refresh() {\n\tclearTimeout(r);\n\tr=setTimeout(\"poll_log()\",1000*2);\n\treturn\n}\n\nfunction createAndDownloadFile(fileName, content) {\n\tvar aTag = document.createElement('a');\n\tvar blob = new Blob([content]);\n\taTag.download = fileName;\n\taTag.href = URL.createObjectURL(blob);\n\taTag.click();\n\tURL.revokeObjectURL(blob);\n}\n\nfunction download_log(){\n\tvar lv = document.getElementById('amlogic.ophub.clog');\n\tvar dt = new Date();\n\tvar timestamp = dt.getFullYear()+\"-\"+(dt.getMonth()+1)+\"-\"+dt.getDate()+\"-\"+dt.getHours()+\"-\"+dt.getMinutes()+\"-\"+dt.getSeconds();\n\tcreateAndDownloadFile(\"Amlogic-\"+timestamp+\".log\",lv.innerHTML)\n\treturn\n}\n\nfunction del_log() {\n\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"del_log\")%>',null,function(x, data){\n\t\tvar lv = document.getElementById('amlogic.ophub.clog');\n\t\t\tlv.innerHTML=\"\";\n\t\t}\n\t);\n\treturn\n}\n\nfunction p(s) {\n\treturn s < 10 ? '0' + s: s;\n}\n\nfunction line_tolocal(str){\n\tvar strt=new Array();\n\tstr.trim().split('\\n').forEach(function(v, i) {\n\tvar dt = new Date(v.substring(6,26));\n\tif (dt != \"Invalid Date\"){\n\t\tstrt[i]=dt.getFullYear()+\"-\"+p(dt.getMonth()+1)+\"-\"+p(dt.getDate())+\" \"+p(dt.getHours())+\":\"+p(dt.getMinutes())+\":\"+p(dt.getSeconds())+v.substring(27);\n\t}else{\n\t\tstrt[i]=v;}})\n\tvar old_log_line = sessionStorage.log_line;\n\tif ( old_log_line != null && strt.length != null ) {\n\t\tif (old_log_line - strt.length < 0) {\n\t\t\tsessionStorage.log_line = strt.length;\n\t\t\treturn strt.slice('-'+(strt.length-old_log_line))\n\t\t}\n\t\t\telse if (old_log_line == strt.length) {\n\t\t\t\tsessionStorage.log_line = strt.length;\n\t\t\t\treturn\n\t\t}\n\t\telse if (old_log_line - strt.length > 0) {\n\t\t\tsessionStorage.log_line = strt.length;\n\t\t\tvar lv = document.getElementById('amlogic.ophub.clog');\n\t\t\tlv.innerHTML = \"\";\n\t\t\treturn strt\n\t\t}\n\t}\n\telse if ( strt.length != null ) {\n\t\tsessionStorage.log_line = strt.length;\n\t\treturn strt\n\t}\n\telse {\n\t\tsessionStorage.log_line = \"0\";\n\t\treturn strt\n\t}\n}\n\nfunction poll_log(){\n\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"refresh_log\")%>', null,\n\tfunction(x, data) {\n\t\tif ( x && x.status == 200 ) {\n\t\t\tvar lv = document.getElementById('amlogic.ophub.clog');\n\t\t\tif (x.responseText && lv) {\n\t\t\t\tvar lines=line_tolocal(x.responseText);\n\t\t\t\tif (lines != null) {\n\t\t\t\t\tlv.innerHTML = lines.reverse().join('\\n')+'\\n'+lv.innerHTML;\n\t\t\t\t\t//lv.innerHTML = x.responseText.split('\\n').reverse().join('\\n')+lv.innerHTML;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t);\n\tr=setTimeout(\"poll_log()\",1000*2);\n}\n\nsessionStorage.removeItem(\"log_line\");\npoll_log();\n\n//]]>\n</script>\n\n<%+cbi/valuefooter%>"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_poweroff.htm",
    "content": "<style>\n.NewsTdHeight{ line-height:32px; }\n.imgLeft{ float:left; margin-right:10px; vertical-align:middle; }\n.contentRight{ align-items: center; }\n</style>\n<fieldset class=\"cbi-section\">\n\t<table width=\"100%\" class=\"NewsTdHeight\">\n\t\t<tr><td width=\"100%\" align=\"left\">\n\t\t\t<input class=\"cbi-button cbi-button-remove\" type=\"button\" value=\"<%:Perform PowerOff%>\" onclick=\"poweroff(this)\" />\n\t\t\t<p style=\"display:none\">\n\t\t\t\t<img id=\"img_loading\" style=\"display:block\" src=\"<%=resource%>/amlogic/loading.gif\" alt=\"<%:Loading%>\" class=\"imgLeft\" />\n\t\t\t\t<img id=\"img_poweroff\" style=\"display:none\" src=\"<%=resource%>/amlogic/poweroff.png\" alt=\"<%:PowerOff%>\" class=\"imgLeft\" />\n\t\t\t\t<span id=\"msg_poweroff\" class=\"contentRight\"><%:Device is shutting down...%></span>\n\t\t\t</p>\n\t\t</td></tr>\n\t</table>\n</fieldset>\n\n<script type=\"text/javascript\">//<![CDATA[\n\n\tfunction status_check() {\n\t\tvar time = 5;\n\t\tvar img_loading = document.getElementById(\"img_loading\");\n\t\tvar img_poweroff = document.getElementById(\"img_poweroff\");\n\t\tvar msg = document.getElementById(\"msg_poweroff\");\n\t\tvar set = setInterval(function() {\n\t\t\ttime--;\n\t\t\tmsg.innerHTML = \"<%:Waiting for the device to shut down...%>\";\n\t\t\tif(time === 0) {\n\t\t\t\timg_loading.style.display = 'none';\n\t\t\t\timg_poweroff.style.display = 'block';\n\t\t\t\tmsg.innerHTML = \"<%:The device has been turned off%>\";\n\t\t\t\tclearInterval(set);\n\t\t\t}\n\t\t}, 1000);\n\t}\n\n\tfunction poweroff(btn) {\n\t\tif (confirm('<%:Are you sure you want to shut down?%>') != true) { return false; }\n\n\t\tbtn.style.display = 'none';\n\t\tdocument.getElementById('msg_poweroff').parentNode.style.display = 'block';\n\n\t\t(new XHR()).post('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_poweroff\")%>', { token: '<%=token%>' }, status_check);\n\t}\n\n\n//]]></script>\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_rescue.htm",
    "content": "<style>\n    .NewsTdHeight{ line-height: 20px; }\n</style>\n<fieldset class=\"cbi-section\">\n    <table width=\"100%\" class=\"NewsTdHeight\">\n        <tr><td width=\"35%\" align=\"right\"><input type=\"button\" class=\"cbi-button cbi-button-reload\" value=\"<%:Rescue the original system kernel%>\" onclick=\"return b_rescue_kernel(this)\"/></td><td  width=\"65%\" align=\"left\"><span id=\"_current_rescue_version\"><%:Collecting data...%></span>　<span id=\"_check_rescue\"></span></td></tr>\n    </table>\n</fieldset>\n<script type=\"text/javascript\">//<![CDATA[\n    function b_rescue_kernel(btn)\n    {\n        btn.disabled = true;\n        btn.value = '<%:Rescuing...%>';\n        XHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_amlogic_rescue\")%>', null, function(x, status) {\n        if ( x && x.status == 200 ) {\n            btn.disabled = false;\n            btn.value = '<%:Rescue the original system kernel%>';\n        }\n        else {\n            btn.disabled = false;\n            btn.value = '<%:Rescue the original system kernel%>';\n        }\n        return false;\n        });\n    }\n\n    var _check_rescue = document.getElementById('_check_rescue');\n\tXHR.poll(1, '<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_check_rescue\")%>', status.start_check_rescue, function(x, status) {\n\tif ( x && x.status == 200 ) {\n\t\tif ( status.start_check_rescue != \"\\n\" && status.start_check_rescue != \"\" ) {\n\t\t\t_check_rescue.innerHTML = '<font color=\"blue\"> '+status.start_check_rescue+'</font>';\n\t\t}\n\t\tif ( status.start_check_rescue == \"\\n\" || status.start_check_rescue == \"\" ) {\n\t\t\t_check_rescue.innerHTML = '';\n\t\t}\n\t}\n\t});\n\n    var _current_rescue_version = document.getElementById('_current_rescue_version');\n    XHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"state\")%>', null, function(x, status) {\n    if ( x && x.status == 200 ) {\n\t\t_current_rescue_version.innerHTML = status.current_kernel_version ? \"<font color=green><%:Current Version%> [ \"+status.current_kernel_version+\" ] </font>\" : \"<font color=red>\"+\"<%:Invalid value.%>\"+\"</font>\";\n    }\n    });\n\n//]]></script>\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_snapshot.htm",
    "content": "<style>\n.NewsTdHeight{ line-height:20px; }\n.SnapshotsTitHeight{ line-height:40px; text-align: center; }\n.list{\n    display: flex;\n    flex-wrap: wrap;\n    justify-content: space-between;\n    text-align: center;\n    position: relative;\n    width: 100%;\n\tbackground-color: #FFF;\n}\n.item{\n    border: 1px solid #CACACA;\n    color: #888;\n    font-size: 14px;\n    width: 150px;\n    height: 130px;\n    margin:8px;\n    text-align: center;\n    align-items:center;\n}\n.item:hover{background:#e5f3f6;}\n.item:not(:nth-child(3n)){\n    content: \"\";\n    width: 150px;\n}\n.list:after {\n    content: \"\";\n    width: 150px;\n}\n</style>\n\n<div class=\"list\" id=\"_check_snapshot\">\n\t<%:Collecting data...%>\n</div>\n\n<script type=\"text/javascript\">//<![CDATA[\n\n    // Delete snapshot function\n\tfunction delete_snapshot(btn,snapshot_delete_sel)\n\t{\n\n\t\tif (confirm('<%:You selected a snapshot:%> [ ' + snapshot_delete_sel + ' ] , <%:Confirm delete?%>') != true) { return false; }\n\n\t\tbtn.disabled = true;\n\t\tbtn.value    = '<%:Deleting...%> ';\n\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_snapshot_delete\")%>',\n\t\t\t{\n\t\t\t\tsnapshot_delete_sel: snapshot_delete_sel\n\t\t\t},\n\t\t\tfunction(x,status)\n\t\t\t{\n\t\t\t\tif ( x && x.status == 200 ) {\n\t\t\t\t\tif(status.rule_delete_status!=\"0\")\n\t\t\t\t\t{\n\t\t\t\t\t\tbtn.value = '<%:Delete Failed%>';\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbtn.value = '<%:Successfully Deleted%>';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tbtn.value = '<%:Delete Snapshot%>';\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\tvar sdiv = 'snapshots_div_' + snapshot_delete_sel;\n\t\tdocument.getElementById(sdiv).style.display = 'none';\n\t\tbtn.disabled = false;\n\t\treturn false;\n\n\t}\n\n\t// Restore snapshot function\n\tfunction restore_snapshot(btn,snapshot_restore_sel)\n\t{\n\n\t\tif (confirm('<%:You selected a snapshot:%> [ ' + snapshot_restore_sel + ' ] , <%:Confirm recovery and restart OpenWrt?%>') != true) { return false; }\n\n\t\tbtn.disabled = true;\n\t\tbtn.value    = '<%:Restoring...%> ';\n\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_snapshot_restore\")%>',\n\t\t\t{\n\t\t\t\tsnapshot_restore_sel: snapshot_restore_sel\n\t\t\t},\n\t\t\tfunction(x,status)\n\t\t\t{\n\t\t\t\tif ( x && x.status == 200 ) {\n\t\t\t\t\tif(status.rule_restore_status!=\"0\")\n\t\t\t\t\t{\n\t\t\t\t\t\tbtn.value = '<%:Restore Failed%>';\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbtn.value = '<%:Successfully Restored%>';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tbtn.value = '<%:Restore Snapshot%>';\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\tbtn.disabled = false;\n\t\treturn false;\n\t}\n\n\t// Show current snapshot list\n\tmycars_arrlen = 0;\n\t_no_snapshots = \"<%:Currently OpenWrt does not support the snapshot function.%>\";\n\t_no_snapshots = _no_snapshots + \"<%:Please use this plugin to reinstall or upgrade OpenWrt to enable the snapshot function.%>\";\n\tvar _check_snapshot = document.getElementById('_check_snapshot');\n\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_snapshot_list\")%>', null, function(x, status) {\n\t\tif ( x && x.status == 200 ) {\n\n\t\t\tlet userArer = status.current_snapshot;\n\t\t\tlet user_arer_clear = userArer.replace(/\\.snapshots\\//g, \"\");\n\t\t\tlet trimstr = user_arer_clear.replace(/(^\\s*)|(\\s*$)/g, \"\");\n\t\t\tlet user_arer = trimstr.replace(/\\s+/g, \",\");\n\t\t\tvar mycars = user_arer.split(',');\n\t\t\tvar mycars_arrlen = mycars.length;\n\n\t\t\t_div_codes = \"\"\n\t\t\t_snapshots_tit = \"\"\n\t\t\tfor ( j = 0; j < mycars_arrlen; j++ ) {\n\n\t\t\t\tif ( mycars[j] == \"etc-000\" ) {\n\t\t\t\t\t_snapshots_tit = \"<%:Initialize Snapshot%>\";\n\t\t\t\t} else if ( mycars[j] == \"etc-001\" ) {\n\t\t\t\t\t_snapshots_tit = \"<%:Update Snapshot%>\";\n\t\t\t\t} else {\n\t\t\t\t\t_snapshots_tit = mycars[j];\n\t\t\t\t}\n\n\t\t\t\t_div_codes = _div_codes + '<div class=\"item\" id=\"snapshots_div_' + mycars[j] + '\">';\n\t\t\t\t_div_codes = _div_codes + '<div class=\"SnapshotsTitHeight\">' + _snapshots_tit + '</div>'\n\t\t\t\t_div_codes = _div_codes + '<div class=\"SnapshotsTitHeight\"><input type=\"button\" class=\"cbi-button cbi-button-apply\" value=\"<%:Restore Snap%>\" onclick=\"return restore_snapshot(this, \\'' + mycars[j] + '\\')\"/></div>'\n\t\t\t\tif ( mycars[j] != \"etc-000\" && mycars[j] != \"etc-001\" ) { _div_codes = _div_codes + '<div class=\"SnapshotsTitHeight\"><input type=\"button\" class=\"cbi-button cbi-button-remove\" value=\"<%:Delete Snap%>\" onclick=\"return delete_snapshot(this, \\'' + mycars[j] + '\\')\"/></div>' }\n\t\t\t\t_div_codes = _div_codes + '</div>';\n\n\t\t\t}\n\t\t\t_check_snapshot.innerHTML = _div_codes ? _div_codes : \"<font color=red>\"+\"<%:Invalid value.%>\"+\"</font>\";\n\t\t} else {\n\t\t\t_check_snapshot.innerHTML = \"<font color=red>\"+ _no_snapshots +\"</font>\";\n\t\t}\n\t});\n\n//]]></script>\n\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_upfiles.htm",
    "content": "<style>\n.NewsTdHeight{ line-height:20px; }\n</style>\n\n<fieldset class=\"cbi-section\">\n\t<table width=\"100%\" class=\"NewsTdHeight\">\n\t\t<tr><td width=\"100%\" colspan=\"2\">\n\t\t\t<p align=\"center\">\n\t\t\t\t<%:After uploading firmware (.img/.img.gz/.img.xz/.7z suffix) or kernel files (3 kernel files), the update button will be displayed.%>\n\t\t\t</p>\n\t\t</td></tr>\n\t\t<tr><td width=\"30%\" align=\"right\">\n\t\t\t<input id=\"_have_firmware\" type=\"button\" class=\"cbi-button cbi-button-reload\" value=\"<%:Update OpenWrt firmware%>\" onclick=\"return amlogic_update(this, 'auto@updated@/tmp')\"/>\n\t\t\t<input id=\"_have_kernel\" type=\"button\" class=\"cbi-button cbi-button-reload\" value=\"<%:Replace OpenWrt Kernel%>\" onclick=\"return amlogic_kernel(this)\"/>\n\t\t</td><td  width=\"70%\" align=\"left\">\n\t\t\t<span id=\"_current_firmware_version\"><%:Collecting data...%></span>　\n\t\t\t<span id=\"_check_log_firmware\"></span><span id=\"_check_log_kernel\"></span>\n\t\t</td></tr>\n\t</table>\n</fieldset>\n\n<script type=\"text/javascript\">//<![CDATA[\n\n\tfunction amlogic_update(btn,amlogic_update_sel)\n\t{\n\t\tbtn.disabled = true;\n\t\tbtn.value    = '<%:Updating...%> ';\n\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_amlogic_update\")%>',\n\t\t\t{\n\t\t\t\tamlogic_update_sel: amlogic_update_sel\n\t\t\t},\n\t\t\tfunction(x,status)\n\t\t\t{\n\t\t\t\tif ( x && x.status == 200 ) {\n\t\t\t\t\tif(status.rule_update_status!=\"0\")\n\t\t\t\t\t{\n\t\t\t\t\t\tbtn.value = '<%:Update Failed%>';\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbtn.value = '<%:Successful Update%>';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tbtn.value = '<%:Update OpenWrt firmware%>';\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\tbtn.disabled = false;\n\t\treturn false;\n\t}\n\n\tfunction amlogic_kernel(btn)\n\t{\n\t\tbtn.disabled = true;\n\t\tbtn.value    = '<%:Updating...%> ';\n\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_amlogic_kernel\")%>', null, function(x, status) {\n\t\t\t\tif ( x && x.status == 200 ) {\n\t\t\t\t\tif(status.rule_kernel_status!=\"0\")\n\t\t\t\t\t{\n\t\t\t\t\t\tbtn.value = '<%:Update Failed%>';\n\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tbtn.value = '<%:Successful Update%>';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tbtn.value = '<%:Replace OpenWrt Kernel%>';\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\tbtn.disabled = false;\n\t\treturn false;\n\t}\n\n\tvar _have_firmware = document.getElementById('_have_firmware');\n\tvar _have_kernel = document.getElementById('_have_kernel');\n\tXHR.poll(1, '<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_check_upfiles\")%>', status.start_check_upfiles, function(x, status) {\n\tif ( x && x.status == 200 ) {\n\t\tif ( status.start_check_upfiles == \"firmware\\n\" || status.start_check_upfiles == \"firmware\" ) {\n\t\t\t_have_firmware.style.display = 'block';\n\t\t} else {\n\t\t\t_have_firmware.style.display = 'none';\n\t\t}\n\n\t\tif ( status.start_check_upfiles == \"kernel\\n\" || status.start_check_upfiles == \"kernel\" ) {\n\t\t\t_have_kernel.style.display = 'block';\n\t\t} else {\n\t\t\t_have_kernel.style.display = 'none';\n\t\t}\n\t}\n\t});\n\n\tvar _check_log_firmware = document.getElementById('_check_log_firmware');\n\tXHR.poll(1, '<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_check_firmware\")%>', status.start_check_firmware, function(x, status) {\n\tif ( x && x.status == 200 ) {\n\t\tif ( status.start_check_firmware != \"\\n\" && status.start_check_firmware != \"\" ) {\n\t\t\t_check_log_firmware.innerHTML = '<font color=\"blue\"> '+status.start_check_firmware+'</font>';\n\t\t}\n\t\tif ( status.start_check_firmware == \"\\n\" || status.start_check_firmware == \"\" ) {\n\t\t\t_check_log_firmware.innerHTML = '';\n\t\t}\n\t}\n\t});\n\n\tvar _check_log_kernel = document.getElementById('_check_log_kernel');\n\tXHR.poll(1, '<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"start_check_kernel\")%>', status.start_check_kernel, function(x, status) {\n\tif ( x && x.status == 200 ) {\n\t\tif ( status.start_check_kernel != \"\\n\" && status.start_check_kernel != \"\" ) {\n\t\t\t_check_log_kernel.innerHTML = '<font color=\"blue\"> '+status.start_check_kernel+'</font>';\n\t\t}\n\t\tif ( status.start_check_kernel == \"\\n\" || status.start_check_kernel == \"\" ) {\n\t\t\t_check_log_kernel.innerHTML = '';\n\t\t}\n\t}\n\t});\n\n\tvar _current_firmware_version = document.getElementById('_current_firmware_version');\n\t//var _current_kernel_version = document.getElementById('_current_kernel_version');\n\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"system\", \"amlogic\", \"state\")%>', null, function(x, status) {\n\tif ( x && x.status == 200 ) {\n\t\t_current_firmware_version.innerHTML = status.current_firmware_version ? \"<font color=green><%:Current Version%> [ \"+status.current_firmware_version+\" ] </font>\" : \"<font color=red>\"+\"<%:Invalid value.%>\"+\"</font>\";\n\t\t//_current_kernel_version.innerHTML = status.current_kernel_version ? \"<font color=green><%:Current Version%> [ \"+status.current_kernel_version+\" ] </font>\" : \"<font color=red>\"+\"<%:Invalid value.%>\"+\"</font>\";\n\t}\n\t});\n\n//]]></script>\n"
  },
  {
    "path": "luci-app-amlogic/luasrc/view/amlogic/other_upload.htm",
    "content": "<%+cbi/valueheader%>\n\t<label class=\"cbi-value\" style=\"display:inline-block; width: 150px\" for=\"ulfile\"><%:Choose local file:%></label>\n\t<input class=\"cbi-input-file\" style=\"width: 400px\" type=\"file\" id=\"ulfile\" name=\"ulfile\" />\n\t<input type=\"submit\" class=\"cbi-button cbi-input-apply\" name=\"upload\" value=\"<%:Upload%>\" />\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-amlogic/po/ru/amlogic.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Project-Id-Version: \\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revision-Date: \\n\"\n\"Last-Translator: https://github.com/ophub/luci-app-amlogic\\n\"\n\"Language-Team: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: ru_RU\\n\"\n\"X-Generator: Poedit 2.3.1\\n\"\n\nmsgid \"Choose local file:\"\nmsgstr \"Выберите локальный файл:\"\n\nmsgid \"Couldn't open file:\"\nmsgstr \"Не удалось открыть файл:\"\n\nmsgid \"The file Will download automatically.\"\nmsgstr \"Файл будет загружен автоматически.\"\n\nmsgid \"Create upload file error.\"\nmsgstr \"Ошибка создания загружаемого файла.\"\n\nmsgid \"Download\"\nmsgstr \"Скачать\"\n\nmsgid \"Download file\"\nmsgstr \"Скачать файл\"\n\nmsgid \"File name\"\nmsgstr \"Имя файла\"\n\nmsgid \"File saved to\"\nmsgstr \"Файл сохранён в\"\n\nmsgid \"FileTransfer\"\nmsgstr \"Передача файлов\"\n\nmsgid \"Install\"\nmsgstr \"Установить\"\n\nmsgid \"Attributes\"\nmsgstr \"Атрибуты\"\n\nmsgid \"Modify time\"\nmsgstr \"Время изменения\"\n\nmsgid \"No specify upload file.\"\nmsgstr \"Не указан файл для загрузки.\"\n\nmsgid \"Path on Route:\"\nmsgstr \"Путь на маршрутизаторе:\"\n\nmsgid \"Remove\"\nmsgstr \"Удалить\"\n\nmsgid \"Size\"\nmsgstr \"Размер\"\n\nmsgid \"Upload\"\nmsgstr \"Загрузить\"\n\nmsgid \"Upload file list\"\nmsgstr \"Список загруженных файлов\"\n\nmsgid \"There are config file in the upload directory, and you can restore the config. \"\nmsgstr \"В каталоге загрузки есть файл конфигурации — вы можете восстановить настройки.\"\n\nmsgid \"There are kernel files in the upload directory, and you can replace the kernel.\"\nmsgstr \"В каталоге загрузки находятся файлы ядра — вы можете заменить ядро.\"\n\nmsgid \"There are openwrt firmware file in the upload directory, and you can update the openwrt.\"\nmsgstr \"В каталоге загрузки есть файл прошивки OpenWrt — вы можете обновить OpenWrt.\"\n\nmsgid \"Update plugins first, then update the kernel or firmware.\"\nmsgstr \"Сначала обновите плагины, затем ядро или прошивку.\"\n\nmsgid \"After uploading [Firmware], [Kernel], [IPK] or [Backup Config], the operation buttons will be displayed.\"\nmsgstr \"После загрузки [прошивки], [ядра], [IPK-пакета] или [резервной конфигурации] появятся соответствующие кнопки управления.\"\n\nmsgid \"After uploading firmware (.img/.img.gz/.img.xz/.7z suffix) or kernel files (3 kernel files), the update button will be displayed.\"\nmsgstr \"После загрузки файлов прошивки (с расширениями .img/.img.gz/.img.xz/.7z) или файлов ядра (3 файла), появится кнопка обновления.\"\n\nmsgid \"Amlogic Service\"\nmsgstr \"Сервис Amlogic\"\n\nmsgid \"Restore Config / Replace OpenWrt Kernel\"\nmsgstr \"Восстановить конфигурацию / Заменить ядро OpenWrt\"\n\nmsgid \"Manually Upload Update\"\nmsgstr \"Обновление вручную\"\n\nmsgid \"Install OpenWrt\"\nmsgstr \"Установить OpenWrt\"\n\nmsgid \"Select the device model:\"\nmsgstr \"Выберите модель устройства:\"\n\nmsgid \"Select List\"\nmsgstr \"Выбрать из списка\"\n\nmsgid \"Enter the dtb file name\"\nmsgstr \"Введите имя файла DTB\"\n\nmsgid \"Enter the soc name:\"\nmsgstr \"Введите имя SoC:\"\n\nmsgid \"Enter the uboot_overload name:\"\nmsgstr \"Введите имя uboot_overload:\"\n\nmsgid \"Invalid value.\"\nmsgstr \"Недопустимое значение.\"\n\nmsgid \"Install OpenWrt:\"\nmsgstr \"Установка OpenWrt:\"\n\nmsgid \"Install OpenWrt to EMMC, Please select the device model, Or enter the dtb file name.\"\nmsgstr \"Установка OpenWrt на eMMC. Пожалуйста, выберите модель устройства или введите имя файла DTB.\"\n\nmsgid \"Tip: Writing is in progress, and it will automatically restart after completion.\"\nmsgstr \"Подсказка: идёт запись — после завершения устройство автоматически перезагрузится.\"\n\nmsgid \"You have chosen:\"\nmsgstr \"Вы выбрали:\"\n\nmsgid \"Start install?\"\nmsgstr \"Начать установку?\"\n\nmsgid \"Installing...\"\nmsgstr \"Установка...\"\n\nmsgid \"Install Failed\"\nmsgstr \"Установка не удалась\"\n\nmsgid \"Successful Install\"\nmsgstr \"Установка завершена успешно\"\n\nmsgid \"Update\"\nmsgstr \"Обновить\"\n\nmsgid \"Updating...\"\nmsgstr \"Обновление...\"\n\nmsgid \"Update Failed\"\nmsgstr \"Обновление не удалось\"\n\nmsgid \"Successful Update\"\nmsgstr \"Обновление завершено успешно\"\n\nmsgid \"Update OpenWrt firmware\"\nmsgstr \"Обновить прошивку OpenWrt\"\n\nmsgid \"kernel\"\nmsgstr \"ядро\"\n\nmsgid \"Replace OpenWrt Kernel\"\nmsgstr \"Заменить ядро OpenWrt\"\n\nmsgid \"Tip: The kernel is being replaced, and it will automatically restart after completion.\"\nmsgstr \"Подсказка: идёт замена ядра — после завершения устройство автоматически перезагрузится.\"\n\nmsgid \"Supports management of Amlogic s9xxx, Allwinner (V-Plus Cloud), and Rockchip (BeikeYun, Chainedbox L1 Pro) boxes.\"\nmsgstr \"Поддерживает управление устройствами на базе Amlogic s9xxx, Allwinner (V-Plus Cloud) и Rockchip (BeikeYun, Chainedbox L1 Pro).\"\n\nmsgid \"Supported functions:\"\nmsgstr \"Поддерживаемые функции:\"\n\nmsgid \"Provide services such as install to EMMC, Update Firmware and Kernel, Backup and Recovery Config, Snapshot management, etc.\"\nmsgstr \"Позволяет устанавливать OpenWrt на eMMC, обновлять прошивку и ядро, выполнять резервное копирование и восстановление конфигурации, а также управлять снапшотами (мгновенными снимками системы).\"\n\nmsgid \"Supported Boxes:\"\nmsgstr \"Поддерживаемые устройства:\"\n\nmsgid \"Amlogic s922x --- [ Beelink, Beelink-Pro, Ugoos-AM6-Plus, ODROID-N2, Khadas-VIM3, Ali-CT2000 ]\"\nmsgstr \"Amlogic s922x — [Beelink, Beelink-Pro, Ugoos-AM6-Plus, ODROID-N2, Khadas-VIM3, Ali-CT2000]\"\n\nmsgid \"Amlogic s905x3 -- [ X96-Max+, HK1-Box, H96-Max-X3, Ugoos-X3, TX3, X96-Air, A95XF3-Air ]\"\nmsgstr \"Amlogic s905x3 — [X96-Max+, HK1-Box, H96-Max-X3, Ugoos-X3, TX3, X96-Air, A95XF3-Air]\"\n\nmsgid \"Amlogic s905x2 -- [ X96Max-4G, X96Max-2G, MECOOL-KM3-4G, Tanix-Tx5-Max, A95X-F2 ]\"\nmsgstr \"Amlogic s905x2 — [X96Max-4G, X96Max-2G, MECOOL-KM3-4G, Tanix-Tx5-Max, A95X-F2]\"\n\nmsgid \"Amlogic s912 ---- [ H96-Pro-Plus, Octopus-Planet, A1, A2, Z6-Plus, TX92, X92, TX8-MAX, TX9-Pro ]\"\nmsgstr \"Amlogic s912 — [H96-Pro-Plus, Octopus-Planet, A1, A2, Z6-Plus, TX92, X92, TX8-MAX, TX9-Pro]\"\n\nmsgid \"Amlogic s905x --- [ HG680P, B860H, TBee, T95, TX9, XiaoMI-3S, X96 ]\"\nmsgstr \"Amlogic s905x — [HG680P, B860H, TBee, T95, TX9, XiaoMI-3S, X96]\"\n\nmsgid \"Amlogic s905w --- [ X96-Mini, TX3-Mini, W95, X96W/FunTV, MXQ-Pro-4K ]\"\nmsgstr \"Amlogic s905w — [X96-Mini, TX3-Mini, W95, X96W/FunTV, MXQ-Pro-4K]\"\n\nmsgid \"Amlogic s905d --- [ Phicomm-N1, MECOOL-KI-Pro, SML-5442TW ]\"\nmsgstr \"Amlogic s905d — [Phicomm-N1, MECOOL-KI-Pro, SML-5442TW]\"\n\nmsgid \"Amlogic s905l --- [ UNT402A, M201-S ]\"\nmsgstr \"Amlogic s905l — [UNT402A, M201-S]\"\n\nmsgid \"Amlogic s905l2 -- [ MGV2000, MGV3000, Wojia-TV-IPBS9505, M301A, E900v21E ]\"\nmsgstr \"Amlogic s905l2 — [MGV2000, MGV3000, Wojia-TV-IPBS9505, M301A, E900v21E]\"\n\nmsgid \"Amlogic s905l3 -- [ CM211-1, CM311-1, HG680-LC, M401A, UNT400G1, UNT402A, ZXV10-BV310 ]\"\nmsgstr \"Amlogic s905l3 — [CM211-1, CM311-1, HG680-LC, M401A, UNT400G1, UNT402A, ZXV10-BV310]\"\n\nmsgid \"Amlogic s905l3a - [ E900V22C/D, CM311-1a-YST, M401A, M411A, UNT403A, UNT413A, IP112H ]\"\nmsgstr \"Amlogic s905l3a — [E900V22C/D, CM311-1a-YST, M401A, M411A, UNT403A, UNT413A, IP112H]\"\n\nmsgid \"Amlogic s905l3b - [ CM211-1, CM311-1, E900V22D, E900V21E, E900V22E, M302A/M304A ]\"\nmsgstr \"Amlogic s905l3b — [CM211-1, CM311-1, E900V22D, E900V21E, E900V22E, M302A/M304A]\"\n\nmsgid \"Amlogic s905 ---- [ Beelink-Mini-MX-2G, Sunvell-T95M, MXQ-Pro+4K, SumaVision-Q5 ]\"\nmsgstr \"Amlogic s905 — [Beelink-Mini-MX-2G, Sunvell-T95M, MXQ-Pro+4K, SumaVision-Q5]\"\n\nmsgid \"Allwinner H6 ---- [ V-Plus Cloud ]\"\nmsgstr \"Allwinner H6 — [V-Plus Cloud]\"\n\nmsgid \"Rockchip -------- [ BeikeYun, L1-Pro, FastRhino R66S/R68S, Radxa 5B/E25 ]\"\nmsgstr \"Rockchip — [BeikeYun, L1-Pro, FastRhino R66S/R68S, Radxa 5B/E25]\"\n\nmsgid \"Used in KVM ----- [ Can be used in KVM virtual machine of Armbian system. ]\"\nmsgstr \"Используется в KVM — [можно использовать в виртуальной машине KVM на базе Armbian].\"\n\nmsgid \"KVM dual system switching\"\nmsgstr \"Переключение между двумя системами в KVM\"\n\nmsgid \"You can freely switch between KVM dual partitions, using OpenWrt systems in different partitions.\"\nmsgstr \"Вы можете свободно переключаться между двумя разделами KVM, используя OpenWrt из разных разделов.\"\n\nmsgid \"Switch System\"\nmsgstr \"Переключить систему\"\n\nmsgid \"System is switching...\"\nmsgstr \"Переключение системы...\"\n\nmsgid \"Waiting for system switching...\"\nmsgstr \"Ожидание завершения переключения...\"\n\nmsgid \"System switchover succeeded, restarting...\"\nmsgstr \"Переключение успешно, перезагрузка...\"\n\nmsgid \"Are you sure you want to switch systems?\"\nmsgstr \"Вы уверены, что хотите переключить систему?\"\n\nmsgid \"Install Ipk\"\nmsgstr \"Установить IPK\"\n\nmsgid \"Plugin Settings\"\nmsgstr \"Настройки плагина\"\n\nmsgid \"Backup Firmware Config\"\nmsgstr \"Резервное копирование конфигурации\"\n\nmsgid \"Backup Config:\"\nmsgstr \"Резервная копия конфигурации:\"\n\nmsgid \"Download Backup\"\nmsgstr \"Скачать резервную копию\"\n\nmsgid \"Backup OpenWrt config (openwrt_config.tar.gz). Use this file to restore the config in [Manually Upload Update].\"\nmsgstr \"Создать резервную копию конфигурации OpenWrt (openwrt_config.tar.gz). Используйте этот файл для восстановления в разделе [Обновление вручную].\"\n\nmsgid \"Edit List:\"\nmsgstr \"Редактировать список:\"\n\nmsgid \"Open List\"\nmsgstr \"Открыть список\"\n\nmsgid \"Backup Configuration - Custom List\"\nmsgstr \"Резервная копия — пользовательский список\"\n\nmsgid \"Write one configuration item per line, and directories should end with a /.\"\nmsgstr \"По одному элементу на строку. Имена каталогов должны оканчиваться на «/».\"\n\nmsgid \"Restore Backup:\"\nmsgstr \"Восстановить из резервной копии:\"\n\nmsgid \"Upload Backup\"\nmsgstr \"Загрузить резервную копию\"\n\nmsgid \"Restore\"\nmsgstr \"Восстановить\"\n\nmsgid \"Restore Config\"\nmsgstr \"Восстановить конфигурацию\"\n\nmsgid \"Restore configuration\"\nmsgstr \"Восстановление конфигурации\"\n\nmsgid \"Config File\"\nmsgstr \"Файл конфигурации\"\n\nmsgid \"Tip: The config is being restored, and it will automatically restart after completion.\"\nmsgstr \"Подсказка: идёт восстановление конфигурации — после завершения устройство автоматически перезагрузится.\"\n\nmsgid \"Snapshot Management\"\nmsgstr \"Управление снапшотами\"\n\nmsgid \"Create Snapshot\"\nmsgstr \"Создать снапшот\"\n\nmsgid \"Creating...\"\nmsgstr \"Создание...\"\n\nmsgid \"Created successfully\"\nmsgstr \"Создано успешно\"\n\nmsgid \"Creation failed\"\nmsgstr \"Ошибка создания\"\n\nmsgid \"Initialize Snapshot\"\nmsgstr \"Инициализировать снапшот\"\n\nmsgid \"Update Snapshot\"\nmsgstr \"Обновить снапшот\"\n\nmsgid \"Restore Snap\"\nmsgstr \"Восстановить снапшот\"\n\nmsgid \"Restoring...\"\nmsgstr \"Восстановление...\"\n\nmsgid \"Restore Failed\"\nmsgstr \"Восстановление не удалось\"\n\nmsgid \"Successfully Restored\"\nmsgstr \"Восстановлено успешно\"\n\nmsgid \"Delete Snap\"\nmsgstr \"Удалить снапшот\"\n\nmsgid \"You selected a snapshot:\"\nmsgstr \"Вы выбрали снапшот:\"\n\nmsgid \"Confirm delete?\"\nmsgstr \"Подтвердить удаление?\"\n\nmsgid \"Confirm recovery and restart OpenWrt?\"\nmsgstr \"Подтвердить восстановление и перезагрузку OpenWrt?\"\n\nmsgid \"Delete Failed\"\nmsgstr \"Удаление не удалось\"\n\nmsgid \"Successfully Deleted\"\nmsgstr \"Удалено успешно\"\n\nmsgid \"Create a snapshot of the current system configuration, or restore to a snapshot.\"\nmsgstr \"Создать снапшот текущей конфигурации системы или восстановиться из снапшота.\"\n\nmsgid \"Currently OpenWrt does not support the snapshot function.\"\nmsgstr \"В текущей версии OpenWrt функция снапшотов не поддерживается.\"\n\nmsgid \"Please use this plugin to reinstall or upgrade OpenWrt to enable the snapshot function.\"\nmsgstr \"Пожалуйста, используйте этот плагин для переустановки или обновления OpenWrt, чтобы включить поддержку снапшотов.\"\n\nmsgid \"Deleting...\"\nmsgstr \"Удаление...\"\n\nmsgid \"Online Download Update\"\nmsgstr \"Обновление через интернет\"\n\nmsgid \"Config Source\"\nmsgstr \"Источник конфигурации\"\n\nmsgid \"You can customize the github.com download repository of OpenWrt files and kernels in [Online Download Update].\"\nmsgstr \"Вы можете настроить репозиторий на github.com для загрузки файлов OpenWrt и ядер в разделе [Обновление через интернет].\"\n\nmsgid \"Tip: The same files as the current OpenWrt system's BOARD (such as rock5b) and kernel (such as 5.10) will be downloaded.\"\nmsgstr \"Подсказка: будут загружены файлы, соответствующие текущей платформе (например, rock5b) и версии ядра (например, 5.10).\"\n\nmsgid \"OpenWrt download repository:\"\nmsgstr \"Репозиторий OpenWrt:\"\n\nmsgid \"Set the OpenWrt files download repository on github.com in [Online Download Update].\"\nmsgstr \"Укажите репозиторий на github.com для загрузки файлов OpenWrt в разделе [Обновление через интернет].\"\n\nmsgid \"OpenWrt download tags keyword:\"\nmsgstr \"Ключевое слово тега OpenWrt:\"\n\nmsgid \"Set the OpenWrt files download tags keyword for github.com in [Online Download Update].\"\nmsgstr \"Укажите ключевое слово тега для загрузки файлов OpenWrt на github.com в разделе [Обновление через интернет].\"\n\nmsgid \"OpenWrt files suffix:\"\nmsgstr \"Расширение файлов OpenWrt:\"\n\nmsgid \"Set the OpenWrt files download suffix for github.com in [Online Download Update].\"\nmsgstr \"Укажите расширение файлов OpenWrt, загружаемых с github.com, в разделе [Обновление через интернет].\"\n\nmsgid \"Kernel download repository:\"\nmsgstr \"Репозиторий ядра:\"\n\nmsgid \"Set the kernel files download repository on github.com in [Online Download Update].\"\nmsgstr \"Укажите репозиторий на github.com для загрузки файлов ядра в разделе [Обновление через интернет].\"\n\nmsgid \"Kernel download tags:\"\nmsgstr \"Теги ядра:\"\n\nmsgid \"Set the kernel files download tags on github.com in [Online Download Update].\"\nmsgstr \"Укажите теги для загрузки файлов ядра на github.com в разделе [Обновление через интернет].\"\n\nmsgid \"kernel_rk3588 [Rockchip RK3588 Kernel]\"\nmsgstr \"kernel_rk3588 [Ядро для Rockchip RK3588]\"\n\nmsgid \"kernel_rk35xx [Rockchip RK35xx Kernel]\"\nmsgstr \"kernel_rk35xx [Ядро для Rockchip RK35xx]\"\n\nmsgid \"kernel_stable [Mainline Stable Kernel]\"\nmsgstr \"kernel_stable [Стабильное ядро из mainline]\"\n\nmsgid \"kernel_flippy [Mainline Stable Kernel by Flippy]\"\nmsgstr \"kernel_flippy [Стабильное ядро от Flippy]\"\n\nmsgid \"kernel_h6 [Allwinner H6 Kernel]\"\nmsgstr \"kernel_h6 [Ядро для Allwinner H6]\"\n\nmsgid \"kernel_beta [Beta Kernel]\"\nmsgstr \"kernel_beta [Бета-версия ядра]\"\n\nmsgid \"Set version branch:\"\nmsgstr \"Ветка версии:\"\n\nmsgid \"Set the version branch of the OpenWrt files and kernel selected in [Online Download Update].\"\nmsgstr \"Укажите ветку версии для файлов OpenWrt и ядра в разделе [Обновление через интернет].\"\n\nmsgid \"Set plugin branch:\"\nmsgstr \"Ветка плагина:\"\n\nmsgid \"Set the branch of the luci-app-amlogic plugin used in [Only update Amlogic Service]. Default (empty) uses the main (Lua) branch.\"\nmsgstr \"Укажите ветку плагина luci-app-amlogic для раздела [Только обновить сервис Amlogic]. По умолчанию (пусто) используется ветка main (Lua).\"\n\nmsgid \"main [Lua version]\"\nmsgstr \"main [Lua версия]\"\n\nmsgid \"js [JavaScript version]\"\nmsgstr \"js [JavaScript версия]\"\n\nmsgid \"Keep config update:\"\nmsgstr \"Сохранять конфигурацию при обновлении:\"\n\nmsgid \"Set whether to keep the current config during [Online Download Update] and [Manually Upload Update].\"\nmsgstr \"Выберите, сохранять ли текущую конфигурацию при обновлении через интернет или вручную.\"\n\nmsgid \"Auto write bootloader:\"\nmsgstr \"Автоматически записывать bootloader:\"\n\nmsgid \"[Recommended choice] Set whether to auto write bootloader during install and update OpenWrt.\"\nmsgstr \"[Рекомендуется] Указывает, записывать ли автоматически bootloader при установке или обновлении OpenWrt.\"\n\nmsgid \"Set the file system type:\"\nmsgstr \"Тип файловой системы:\"\n\nmsgid \"[Default ext4] Set the file system type of the shared partition (/mnt/mmcblk*p4) when install OpenWrt.\"\nmsgstr \"[По умолчанию ext4] Укажите тип файловой системы для общего раздела (/mnt/mmcblk*p4) при установке OpenWrt.\"\n\nmsgid \"Save Config:\"\nmsgstr \"Сохранить конфигурацию:\"\n\nmsgid \"Save\"\nmsgstr \"Сохранить\"\n\nmsgid \"Check All Components Update\"\nmsgstr \"Проверка обновлений\"\n\nmsgid \"Provide OpenWrt Firmware, Kernel and Plugin online check, download and update service.\"\nmsgstr \"Предоставляет онлайн-проверку, загрузку и обновление прошивки OpenWrt, ядра и плагинов.\"\n\nmsgid \"Only update Amlogic Service\"\nmsgstr \"Обновить только сервис Amlogic\"\n\nmsgid \"Update system kernel only\"\nmsgstr \"Обновить только ядро системы\"\n\nmsgid \"Complete system update\"\nmsgstr \"Полное обновление системы\"\n\nmsgid \"Check Update\"\nmsgstr \"Проверить обновления\"\n\nmsgid \"Checking...\"\nmsgstr \"Проверка...\"\n\nmsgid \"Current Version\"\nmsgstr \"Текущая версия\"\n\nmsgid \"Latest Version\"\nmsgstr \"Последняя версия\"\n\nmsgid \"Rescue Kernel\"\nmsgstr \"Аварийное восстановление ядра\"\n\nmsgid \"When a kernel update fails and causes the OpenWrt system to be unbootable, the kernel can be restored by mutual recovery from eMMC/NVMe/sdX.\"\nmsgstr \"Если обновление ядра привело к невозможности загрузки OpenWrt, его можно восстановить с другого носителя (eMMC/NVMe/sdX).\"\n\nmsgid \"Rescue the original system kernel\"\nmsgstr \"Восстановить исходное ядро системы\"\n\nmsgid \"Rescuing...\"\nmsgstr \"Восстановление...\"\n\nmsgid \"Current Device:\"\nmsgstr \"Текущее устройство:\"\n\nmsgid \"Display the PLATFORM classification of the device.\"\nmsgstr \"Отображает класс PLATFORM устройства.\"\n\nmsgid \"Update plugins first, then update the kernel or firmware. More options can be configured in [Plugin Settings].\"\nmsgstr \"Сначала обновите плагины, затем ядро или прошивку. Дополнительные настройки доступны в [Настройках плагина].\"\n\nmsgid \"Collecting data...\"\nmsgstr \"Сбор данных...\"\n\nmsgid \"Server Logs\"\nmsgstr \"Журнал операций\"\n\nmsgid \"Display the execution log of the current operation.\"\nmsgstr \"Отображает журнал выполнения текущей операции.\"\n\nmsgid \"Stop Refresh Log\"\nmsgstr \"Остановить обновление журнала\"\n\nmsgid \"Start Refresh Log\"\nmsgstr \"Начать обновление журнала\"\n\nmsgid \"Clean Log\"\nmsgstr \"Очистить журнал\"\n\nmsgid \"Download Log\"\nmsgstr \"Скачать журнал\"\n\nmsgid \"CPU Settings\"\nmsgstr \"Настройки CPU\"\n\nmsgid \"CPU Freq\"\nmsgstr \"Частота CPU\"\n\nmsgid \"CPU Freq Settings\"\nmsgstr \"Настройки частоты CPU\"\n\nmsgid \"Set CPU Scaling Governor to Max Performance or Balance Mode\"\nmsgstr \"Выберите режим управления частотой CPU: максимальная производительность или баланс.\"\n\nmsgid \"CPU Scaling Governor:\"\nmsgstr \"Режим управления частотой:\"\n\nmsgid \"ondemand\"\nmsgstr \"Ondemand — автоматический баланс\"\n\nmsgid \"performance\"\nmsgstr \"Performance — максимальная производительность\"\n\nmsgid \"schedutil\"\nmsgstr \"Schedutil — умный планировщик\"\n\nmsgid \"CPU Freq from 48000 to 716000 (Khz)\"\nmsgstr \"Диапазон частоты CPU: от 48000 до 716000 КГц\"\n\nmsgid \"Min Freq:\"\nmsgstr \"Мин. частота:\"\n\nmsgid \"Max Freq:\"\nmsgstr \"Макс. частота:\"\n\nmsgid \"CPU Switching Threshold:\"\nmsgstr \"Порог переключения частоты CPU:\"\n\nmsgid \"Kernel make a decision on whether it should increase the frequency (%)\"\nmsgstr \"При загрузке CPU выше указанного процента (%), ядро увеличит частоту.\"\n\nmsgid \"CPU Switching Sampling rate:\"\nmsgstr \"Период проверки частоты CPU:\"\n\nmsgid \"The sampling rate determines how frequently the governor checks to tune the CPU (ms)\"\nmsgstr \"Частота проверки загрузки CPU (мс). Примечание: слишком частое переключение может вызвать дрожание задержек в сети.\"\n\nmsgid \"Microarchitectures:\"\nmsgstr \"Микроархитектура:\"\n\nmsgid \"Loading\"\nmsgstr \"Загрузка\"\n\nmsgid \"PowerOff\"\nmsgstr \"Выключить\"\n\nmsgid \"Shut down your router device.\"\nmsgstr \"Выключить устройство маршрутизатора.\"\n\nmsgid \"Perform PowerOff\"\nmsgstr \"Выполнить выключение\"\n\nmsgid \"Are you sure you want to shut down?\"\nmsgstr \"Вы уверены, что хотите выключить устройство?\"\n\nmsgid \"Device is shutting down...\"\nmsgstr \"Устройство выключается...\"\n\nmsgid \"Waiting for the device to shut down...\"\nmsgstr \"Ожидание завершения выключения...\"\n\nmsgid \"The device has been turned off\"\nmsgstr \"Устройство выключено\"\n"
  },
  {
    "path": "luci-app-amlogic/po/zh_Hans/amlogic.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Project-Id-Version: \\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revision-Date: \\n\"\n\"Last-Translator: https://github.com/ophub/luci-app-amlogic \\n\"\n\"Language-Team: \\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Language: zh_Hans\\n\"\n\"X-Generator: Poedit 2.3.1\\n\"\n\nmsgid \"Choose local file:\"\nmsgstr \"选择本地文件：\"\n\nmsgid \"Couldn't open file:\"\nmsgstr \"无法打开文件：\"\n\nmsgid \"The file Will download automatically.\"\nmsgstr \"文件将自动下载\"\n\nmsgid \"Create upload file error.\"\nmsgstr \"创建上传文件失败。\"\n\nmsgid \"Download\"\nmsgstr \"下载\"\n\nmsgid \"Download file\"\nmsgstr \"下载文件\"\n\nmsgid \"File name\"\nmsgstr \"文件名\"\n\nmsgid \"File saved to\"\nmsgstr \"文件保存到\"\n\nmsgid \"FileTransfer\"\nmsgstr \"文件传输\"\n\nmsgid \"Install\"\nmsgstr \"安装\"\n\nmsgid \"Attributes\"\nmsgstr \"属性\"\n\nmsgid \"Modify time\"\nmsgstr \"修改时间\"\n\nmsgid \"No specify upload file.\"\nmsgstr \"未指定上传文件。\"\n\nmsgid \"Path on Route:\"\nmsgstr \"路由根目录：\"\n\nmsgid \"Remove\"\nmsgstr \"移除\"\n\nmsgid \"Size\"\nmsgstr \"大小\"\n\nmsgid \"Upload\"\nmsgstr \"上传\"\n\nmsgid \"Upload file list\"\nmsgstr \"上传文件列表\"\n\nmsgid \"There are config file in the upload directory, and you can restore the config. \"\nmsgstr \"上传文件列表中有配置文件，你可以恢复配置。\"\n\nmsgid \"There are kernel files in the upload directory, and you can replace the kernel.\"\nmsgstr \"上传文件列表中有内核文件，你可以升级内核。\"\n\nmsgid \"There are openwrt firmware file in the upload directory, and you can update the openwrt.\"\nmsgstr \"上传文件列表中有 OpenWrt 固件文件，你可以升级 OpenWrt。\"\n\nmsgid \"Update plugins first, then update the kernel or firmware.\"\nmsgstr \"首先更新插件，再更新内核或固件。\"\n\nmsgid \"After uploading [Firmware], [Kernel], [IPK] or [Backup Config], the operation buttons will be displayed.\"\nmsgstr \"当上传 [固件文件]，[内核文件]，[IPK文件]，[配置文件] 后，将自动显示相关操作按钮。\"\n\nmsgid \"After uploading firmware (.img/.img.gz/.img.xz/.7z suffix) or kernel files (3 kernel files), the update button will be displayed.\"\nmsgstr \"当上传文件列表中有 OpenWrt 固件（.img/.img.gz/.img.xz/.7z 后缀）或内核文件（3个内核文件）时，将自动显示相关操作按钮。\"\n\nmsgid \"Amlogic Service\"\nmsgstr \"晶晨宝盒\"\n\nmsgid \"Restore Config / Replace OpenWrt Kernel\"\nmsgstr \"恢复配置 / 升级 OpenWrt 内核\"\n\nmsgid \"Manually Upload Update\"\nmsgstr \"手动上传更新\"\n\nmsgid \"Install OpenWrt\"\nmsgstr \"安装 OpenWrt\"\n\nmsgid \"Select the device model:\"\nmsgstr \"选择设备型号：\"\n\nmsgid \"Select List\"\nmsgstr \"选择列表\"\n\nmsgid \"Enter the dtb file name\"\nmsgstr \"输入自定义 dtb 文件名\"\n\nmsgid \"Enter the soc name:\"\nmsgstr \"输入自定义 soc 名称：\"\n\nmsgid \"Enter the uboot_overload name:\"\nmsgstr \"输入自定义 uboot_overload 名称：\"\n\nmsgid \"Invalid value.\"\nmsgstr \"无效值\"\n\nmsgid \"Install OpenWrt:\"\nmsgstr \"安装 OpenWrt：\"\n\nmsgid \"Install OpenWrt to EMMC, Please select the device model, Or enter the dtb file name.\"\nmsgstr \"将 OpenWrt 安装到 EMMC，请选择设备型号，或输入 dtb 文件名。\"\n\nmsgid \"Tip: Writing is in progress, and it will automatically restart after completion.\"\nmsgstr \"提示：正在写入，完成后将自动重启。\"\n\nmsgid \"You have chosen:\"\nmsgstr \"你选择了：\"\n\nmsgid \"Start install?\"\nmsgstr \"开始安装吗？\"\n\nmsgid \"Installing...\"\nmsgstr \"正在安装...\"\n\nmsgid \"Install Failed\"\nmsgstr \"安装失败\"\n\nmsgid \"Successful Install\"\nmsgstr \"安装成功\"\n\nmsgid \"Update\"\nmsgstr \"升级\"\n\nmsgid \"Updating...\"\nmsgstr \"正在更新...\"\n\nmsgid \"Update Failed\"\nmsgstr \"更新失败\"\n\nmsgid \"Successful Update\"\nmsgstr \"更新成功\"\n\nmsgid \"Update OpenWrt firmware\"\nmsgstr \"升级 OpenWrt 固件\"\n\nmsgid \"kernel\"\nmsgstr \"内核\"\n\nmsgid \"Replace OpenWrt Kernel\"\nmsgstr \"更换 OpenWrt 内核\"\n\nmsgid \"Tip: The kernel is being replaced, and it will automatically restart after completion.\"\nmsgstr \"提示：正在替换内核，完成后将自动重启。\"\n\nmsgid \"Supports management of Amlogic s9xxx, Allwinner (V-Plus Cloud), and Rockchip (BeikeYun, Chainedbox L1 Pro) boxes.\"\nmsgstr \"支持对晶晨 s9xxx 系列（斐讯N1、HK1等），全志（微加云），以及瑞芯微（贝壳云、我家云）的盒子进行在线管理。\"\n\nmsgid \"Supported functions:\"\nmsgstr \"支持的功能：\"\n\nmsgid \"Provide services such as install to EMMC, Update Firmware and Kernel, Backup and Recovery Config, Snapshot management, etc.\"\nmsgstr \"支持将 OpenWrt 系统写入 EMMC、升级固件与内核，备份与恢复自定义配置，快照管理等功能。\"\n\nmsgid \"Supported Boxes:\"\nmsgstr \"支持的盒子：\"\n\nmsgid \"Amlogic s922x --- [ Beelink, Beelink-Pro, Ugoos-AM6-Plus, ODROID-N2, Khadas-VIM3, Ali-CT2000 ]\"\nmsgstr \"晶晨 s922x --- [ Beelink, Beelink-Pro, Ugoos-AM6-Plus, ODROID-N2, Khadas-VIM3, Ali-CT2000 ]\"\n\nmsgid \"Amlogic s905x3 -- [ X96-Max+, HK1-Box, H96-Max-X3, Ugoos-X3, TX3, X96-Air, A95XF3-Air ]\"\nmsgstr \"晶晨 s905x3 -- [ X96-Max+, HK1-Box, H96-Max-X3, Ugoos-X3, TX3, X96-Air, A95XF3-Air ]\"\n\nmsgid \"Amlogic s905x2 -- [ X96Max-4G, X96Max-2G, MECOOL-KM3-4G, Tanix-Tx5-Max, A95X-F2 ]\"\nmsgstr \"晶晨 s905x2 -- [ X96Max-4G, X96Max-2G, MECOOL-KM3-4G, Tanix-Tx5-Max, A95X-F2 ]\"\n\nmsgid \"Amlogic s912 ---- [ H96-Pro-Plus, Octopus-Planet, A1, A2, Z6-Plus, TX92, X92, TX8-MAX, TX9-Pro ]\"\nmsgstr \"晶晨 s912 ---- [ H96-Pro-Plus, 章鱼星球, A1, A2, Z6-Plus, TX92, X92, TX8-MAX, TX9-Pro ]\"\n\nmsgid \"Amlogic s905x --- [ HG680P, B860H, TBee, T95, TX9, XiaoMI-3S, X96 ]\"\nmsgstr \"晶晨 s905x --- [ 烽火HG680, 中兴B860H, TBee, T95, TX9, XiaoMI-3S, X96 ]\"\n\nmsgid \"Amlogic s905w --- [ X96-Mini, TX3-Mini, W95, X96W/FunTV, MXQ-Pro-4K ]\"\nmsgstr \"晶晨 s905w --- [ X96-Mini, TX3-Mini, W95, X96W/FunTV, MXQ-Pro-4K ]\"\n\nmsgid \"Amlogic s905d --- [ Phicomm-N1, MECOOL-KI-Pro, SML-5442TW ]\"\nmsgstr \"晶晨 s905d --- [ 斐讯-N1, MECOOL-KI-Pro, SML-5442TW ]\"\n\nmsgid \"Amlogic s905l --- [ UNT402A, M201-S ]\"\nmsgstr \"晶晨 s905l --- [ UNT402A, M201-S ]\"\n\nmsgid \"Amlogic s905l2 -- [ MGV2000, MGV3000, Wojia-TV-IPBS9505, M301A, E900v21E ]\"\nmsgstr \"晶晨 s905l2 -- [ MGV2000, MGV3000, Wojia-TV-IPBS9505, M301A, E900v21E ]\"\n\nmsgid \"Amlogic s905l3 -- [ CM211-1, CM311-1, HG680-LC, M401A, UNT400G1, UNT402A, ZXV10-BV310 ]\"\nmsgstr \"晶晨 s905l3 -- [ CM211-1, CM311-1, HG680-LC, M401A, UNT400G1, UNT402A, ZXV10-BV310 ]\"\n\nmsgid \"Amlogic s905l3a - [ E900V22C/D, CM311-1a-YST, M401A, M411A, UNT403A, UNT413A, IP112H ]\"\nmsgstr \"晶晨 s905l3a - [ E900V22C/D, CM311-1a-YST, M401A, M411A, UNT403A, UNT413A, IP112H ]\"\n\nmsgid \"Amlogic s905l3b - [ CM211-1, CM311-1, E900V22D, E900V21E, E900V22E, M302A/M304A ]\"\nmsgstr \"晶晨 s905l3b - [ CM211-1, CM311-1, E900V22D, E900V21E, E900V22E, M302A/M304A ]\"\n\nmsgid \"Amlogic s905 ---- [ Beelink-Mini-MX-2G, Sunvell-T95M, MXQ-Pro+4K, SumaVision-Q5 ]\"\nmsgstr \"晶晨 s905 ---- [ Beelink-Mini-MX-2G, Sunvell-T95M, MXQ-Pro+4K, SumaVision-Q5 ]\"\n\nmsgid \"Allwinner H6 ---- [ V-Plus Cloud ]\"\nmsgstr \"全志 H6 ------ [ 微加云 ]\"\n\nmsgid \"Rockchip -------- [ BeikeYun, L1-Pro, FastRhino R66S/R68S, Radxa 5B/E25 ]\"\nmsgstr \"瑞芯微 ------- [ 贝壳云, 我家云, 电犀牛R66S/R68S, 瑞莎5B/E25 ]\"\n\nmsgid \"Used in KVM ----- [ Can be used in KVM virtual machine of Armbian system. ]\"\nmsgstr \"KVM 中使用 --- [ 可以在 Armbian 系统的 KVM 虚拟机中使用。 ]\"\n\nmsgid \"KVM dual system switching\"\nmsgstr \"KVM 双系统切换\"\n\nmsgid \"You can freely switch between KVM dual partitions, using OpenWrt systems in different partitions.\"\nmsgstr \"您可以在 KVM 双分区之间自由切换，使用不同分区中的 OpenWrt 系统。\"\n\nmsgid \"Switch System\"\nmsgstr \"切换系统\"\n\nmsgid \"System is switching...\"\nmsgstr \"系统切换中...\"\n\nmsgid \"Waiting for system switching...\"\nmsgstr \"等待系统完成切换...\"\n\nmsgid \"System switchover succeeded, restarting...\"\nmsgstr \"系统切换成功，正在重启...\"\n\nmsgid \"Are you sure you want to switch systems?\"\nmsgstr \"你确定要切换系统吗？\"\n\nmsgid \"Install Ipk\"\nmsgstr \"安装Ipk\"\n\nmsgid \"Plugin Settings\"\nmsgstr \"插件设置\"\n\nmsgid \"Backup Firmware Config\"\nmsgstr \"备份固件配置\"\n\nmsgid \"Backup Config:\"\nmsgstr \"备份配置：\"\n\nmsgid \"Download Backup\"\nmsgstr \"下载备份\"\n\nmsgid \"Backup OpenWrt config (openwrt_config.tar.gz). Use this file to restore the config in [Manually Upload Update].\"\nmsgstr \"备份当前 OpenWrt 的相关配置信息(openwrt_config.tar.gz)。使用此文件可在 [手动上传更新] 中恢复配置。\"\n\nmsgid \"Edit List:\"\nmsgstr \"编辑列表：\"\n\nmsgid \"Open List\"\nmsgstr \"打开列表\"\n\nmsgid \"Backup Configuration - Custom List\"\nmsgstr \"备份配置 - 自定义列表\"\n\nmsgid \"Write one configuration item per line, and directories should end with a /.\"\nmsgstr \"每行写一个配置项，目录需要以/结尾。\"\n\nmsgid \"Restore Backup:\"\nmsgstr \"恢复备份：\"\n\nmsgid \"Upload Backup\"\nmsgstr \"上传备份\"\n\nmsgid \"Restore\"\nmsgstr \"恢复\"\n\nmsgid \"Restore Config\"\nmsgstr \"恢复配置\"\n\nmsgid \"Restore configuration\"\nmsgstr \"还原配置\"\n\nmsgid \"Config File\"\nmsgstr \"配置文件\"\n\nmsgid \"Tip: The config is being restored, and it will automatically restart after completion.\"\nmsgstr \"提示：正在还原配置，完成后将自动重启。\"\n\nmsgid \"Snapshot Management\"\nmsgstr \"快照管理\"\n\nmsgid \"Create Snapshot\"\nmsgstr \"创建快照\"\n\nmsgid \"Creating...\"\nmsgstr \"正在创建\"\n\nmsgid \"Created successfully\"\nmsgstr \"创建成功\"\n\nmsgid \"Creation failed\"\nmsgstr \"创建失败\"\n\nmsgid \"Initialize Snapshot\"\nmsgstr \"初始化快照\"\n\nmsgid \"Update Snapshot\"\nmsgstr \"更新点快照\"\n\nmsgid \"Restore Snap\"\nmsgstr \"还原快照\"\n\nmsgid \"Restoring...\"\nmsgstr \"正在还原\"\n\nmsgid \"Restore Failed\"\nmsgstr \"还原失败\"\n\nmsgid \"Successfully Restored\"\nmsgstr \"还原成功\"\n\nmsgid \"Delete Snap\"\nmsgstr \"删除快照\"\n\nmsgid \"You selected a snapshot:\"\nmsgstr \"你选择了快照：\"\n\nmsgid \"Confirm delete?\"\nmsgstr \"确定删除吗？\"\n\nmsgid \"Confirm recovery and restart OpenWrt?\"\nmsgstr \"确定恢复并重启 OpenWrt 吗？\"\n\nmsgid \"Delete Failed\"\nmsgstr \"删除失败\"\n\nmsgid \"Successfully Deleted\"\nmsgstr \"删除成功\"\n\nmsgid \"Create a snapshot of the current system configuration, or restore to a snapshot.\"\nmsgstr \"创建当前系统配置的快照，或还原到某个快照。\"\n\nmsgid \"Currently OpenWrt does not support the snapshot function.\"\nmsgstr \"当前 OpenWrt 不支持快照功能。\"\n\nmsgid \"Please use this plugin to reinstall or upgrade OpenWrt to enable the snapshot function.\"\nmsgstr \"请使用本插件重新安装或升级 OpenWrt 开启快照功能。\"\n\nmsgid \"Deleting...\"\nmsgstr \"正在删除...\"\n\nmsgid \"Online Download Update\"\nmsgstr \"在线下载更新\"\n\nmsgid \"Config Source\"\nmsgstr \"配置来源\"\n\nmsgid \"You can customize the github.com download repository of OpenWrt files and kernels in [Online Download Update].\"\nmsgstr \"您可以自定义 [在线下载和更新] 中 OpenWrt 固件和内核的 github.com 下载仓库。\"\n\nmsgid \"Tip: The same files as the current OpenWrt system's BOARD (such as rock5b) and kernel (such as 5.10) will be downloaded.\"\nmsgstr \"提示：将下载与当前 OpenWrt 系统的 BOARD（如：rock5b）和内核（如：5.10）相同的文件。\"\n\nmsgid \"OpenWrt download repository:\"\nmsgstr \"OpenWrt 文件的下载仓库：\"\n\nmsgid \"Set the OpenWrt files download repository on github.com in [Online Download Update].\"\nmsgstr \"设置 [在线下载更新] 中 github.com 的 OpenWrt 文件的下载仓库。\"\n\nmsgid \"OpenWrt download tags keyword:\"\nmsgstr \"OpenWrt 下载标签关键字：\"\n\nmsgid \"Set the OpenWrt files download tags keyword for github.com in [Online Download Update].\"\nmsgstr \"设置 [在线下载更新] 中 github.com 的 OpenWrt 文件下载标签关键字。\"\n\nmsgid \"OpenWrt files suffix:\"\nmsgstr \"OpenWrt 文件的后缀：\"\n\nmsgid \"Set the OpenWrt files download suffix for github.com in [Online Download Update].\"\nmsgstr \"设置 [在线下载更新] 中 github.com 的 OpenWrt 文件的后缀。\"\n\nmsgid \"Kernel download repository:\"\nmsgstr \"内核的下载仓库：\"\n\nmsgid \"Set the kernel files download repository on github.com in [Online Download Update].\"\nmsgstr \"设置 [在线下载更新] 中 github.com 的内核文件下载仓库。\"\n\nmsgid \"Kernel download tags:\"\nmsgstr \"内核的下载标签：\"\n\nmsgid \"Set the kernel files download tags on github.com in [Online Download Update].\"\nmsgstr \"设置 [在线下载更新] 中 github.com 的内核文件下载标签。\"\n\nmsgid \"kernel_rk3588 [Rockchip RK3588 Kernel]\"\nmsgstr \"kernel_rk3588 [Rockchip RK3588 内核]\"\n\nmsgid \"kernel_rk35xx [Rockchip RK35xx Kernel]\"\nmsgstr \"kernel_rk35xx [Rockchip RK35xx 内核]\"\n\nmsgid \"kernel_stable [Mainline Stable Kernel]\"\nmsgstr \"kernel_stable [主线稳定内核]\"\n\nmsgid \"kernel_flippy [Mainline Stable Kernel by Flippy]\"\nmsgstr \"kernel_flippy [Flippy 的主线稳定内核]\"\n\nmsgid \"kernel_h6 [Allwinner H6 Kernel]\"\nmsgstr \"kernel_h6 [Allwinner H6 内核]\"\n\nmsgid \"kernel_beta [Beta Kernel]\"\nmsgstr \"kernel_beta [测试版内核]\"\n\nmsgid \"Set version branch:\"\nmsgstr \"设置版本分支：\"\n\nmsgid \"Set the version branch of the OpenWrt files and kernel selected in [Online Download Update].\"\nmsgstr \"设置 [在线下载更新] 时 OpenWrt 文件与内核所选用的版本分支。\"\n\nmsgid \"Set plugin branch:\"\nmsgstr \"设置插件分支：\"\n\nmsgid \"Set the branch of the luci-app-amlogic plugin used in [Only update Amlogic Service]. Default (empty) uses the main (Lua) branch.\"\nmsgstr \"设置 [仅更新晶晨宝盒] 时使用的插件分支。默认（空）使用 main (Lua) 分支。\"\n\nmsgid \"main [Lua version]\"\nmsgstr \"main [Lua 版本]\"\n\nmsgid \"js [JavaScript version]\"\nmsgstr \"js [JavaScript 版本]\"\n\nmsgid \"Keep config update:\"\nmsgstr \"保留配置更新：\"\n\nmsgid \"Set whether to keep the current config during [Online Download Update] and [Manually Upload Update].\"\nmsgstr \"设置是否在 [在线下载更新] 和 [手动上传更新] 时保留当前的配置。\"\n\nmsgid \"Auto write bootloader:\"\nmsgstr \"自动写入 bootloader：\"\n\nmsgid \"[Recommended choice] Set whether to auto write bootloader during install and update OpenWrt.\"\nmsgstr \"[推荐选择] 设置在安装和更新 OpenWrt 固件时是否自动写入 bootloader 文件。\"\n\nmsgid \"Set the file system type:\"\nmsgstr \"设置文件系统类型：\"\n\nmsgid \"[Default ext4] Set the file system type of the shared partition (/mnt/mmcblk*p4) when install OpenWrt.\"\nmsgstr \"[默认 ext4] 设置安装 OpenWrt 时共享分区 (/mnt/mmcblk*p4) 的文件系统类型。\"\n\nmsgid \"Save Config:\"\nmsgstr \"保存配置：\"\n\nmsgid \"Save\"\nmsgstr \"保存\"\n\nmsgid \"Check All Components Update\"\nmsgstr \"插件和内核检查更新\"\n\nmsgid \"Provide OpenWrt Firmware, Kernel and Plugin online check, download and update service.\"\nmsgstr \"提供 OpenWrt 固件，内核和插件在线检查，下载和更新服务。\"\n\nmsgid \"Only update Amlogic Service\"\nmsgstr \"仅更新晶晨宝盒\"\n\nmsgid \"Update system kernel only\"\nmsgstr \"仅更新系统内核\"\n\nmsgid \"Complete system update\"\nmsgstr \"完整更新全系统\"\n\nmsgid \"Check Update\"\nmsgstr \"检查更新\"\n\nmsgid \"Checking...\"\nmsgstr \"正在检查更新...\"\n\nmsgid \"Current Version\"\nmsgstr \"当前版本\"\n\nmsgid \"Latest Version\"\nmsgstr \"最新版本\"\n\nmsgid \"Rescue Kernel\"\nmsgstr \"救援内核\"\n\nmsgid \"When a kernel update fails and causes the OpenWrt system to be unbootable, the kernel can be restored by mutual recovery from eMMC/NVMe/sdX.\"\nmsgstr \"当内核更新失败造成 OpenWrt 系统无法启动时，可以从 eMMC/NVME/sdX 相互恢复内核。\"\n\nmsgid \"Rescue the original system kernel\"\nmsgstr \"救援原系统内核\"\n\nmsgid \"Rescuing...\"\nmsgstr \"正在救援...\"\n\nmsgid \"Current Device:\"\nmsgstr \"当前设备：\"\n\nmsgid \"Display the PLATFORM classification of the device.\"\nmsgstr \"显示设备的 PLATFORM 分类。\"\n\nmsgid \"Update plugins first, then update the kernel or firmware. More options can be configured in [Plugin Settings].\"\nmsgstr \"首先更新插件，再更新内核或固件。更多选项可以在插件设置中配置。\"\n\nmsgid \"Collecting data...\"\nmsgstr \"正在收集数据…\"\n\nmsgid \"Check All Components Update\"\nmsgstr \"插件和内核检查更新\"\n\nmsgid \"Server Logs\"\nmsgstr \"操作日志\"\n\nmsgid \"Display the execution log of the current operation.\"\nmsgstr \"显示当前操作的执行日志。\"\n\nmsgid \"Stop Refresh Log\"\nmsgstr \"停止刷新\"\n\nmsgid \"Start Refresh Log\"\nmsgstr \"开始刷新\"\n\nmsgid \"Clean Log\"\nmsgstr \"清理日志\"\n\nmsgid \"Download Log\"\nmsgstr \"下载日志\"\n\nmsgid \"CPU Settings\"\nmsgstr \"CPU 设置\"\n\nmsgid \"CPU Freq\"\nmsgstr \"CPU 性能优化调节\"\n\nmsgid \"CPU Freq Settings\"\nmsgstr \"CPU 性能优化调节设置\"\n\nmsgid \"Set CPU Scaling Governor to Max Performance or Balance Mode\"\nmsgstr \"设置路由器的 CPU 性能模式（高性能/均衡省电）\"\n\nmsgid \"CPU Scaling Governor:\"\nmsgstr \"CPU 调速器：\"\n\nmsgid \"ondemand\"\nmsgstr \"Ondemand 自动平衡模式\"\n\nmsgid \"performance\"\nmsgstr \"Performance 高性能模式\"\n\nmsgid \"schedutil\"\nmsgstr \"Schedutil 敏捷调度器模式\"\n\nmsgid \"CPU Freq from 48000 to 716000 (Khz)\"\nmsgstr \"CPU 频率范围为 48000 到 716000 (Khz)\"\n\nmsgid \"Min Freq:\"\nmsgstr \"最小频率：\"\n\nmsgid \"Max Freq:\"\nmsgstr \"最大频率：\"\n\nmsgid \"CPU Switching Threshold:\"\nmsgstr \"CPU 切换频率触发阈值：\"\n\nmsgid \"Kernel make a decision on whether it should increase the frequency (%)\"\nmsgstr \"当 CPU 占用率超过 (%) 的情况下触发内核切换频率\"\n\nmsgid \"CPU Switching Sampling rate:\"\nmsgstr \"CPU 切换周期：\"\n\nmsgid \"The sampling rate determines how frequently the governor checks to tune the CPU (ms)\"\nmsgstr \"CPU 检查切换的周期 (ms) 。注意：过于频繁的切换频率会引起网络延迟抖动\"\n\nmsgid \"Microarchitectures:\"\nmsgstr \"微架构：\"\n\nmsgid \"Loading\"\nmsgstr \"载入中\"\n\nmsgid \"PowerOff\"\nmsgstr \"关机\"\n\nmsgid \"Shut down your router device.\"\nmsgstr \"关闭你的路由器设备。\"\n\nmsgid \"Perform PowerOff\"\nmsgstr \"执行关机\"\n\nmsgid \"Are you sure you want to shut down?\"\nmsgstr \"你确定要关机吗？\"\n\nmsgid \"Device is shutting down...\"\nmsgstr \"设备正在关机...\"\n\nmsgid \"Waiting for the device to shut down...\"\nmsgstr \"等待设备关机...\"\n\nmsgid \"The device has been turned off\"\nmsgstr \"设备已经关机\"\n\n\n"
  },
  {
    "path": "luci-app-amlogic/root/etc/config/amlogic",
    "content": "\nconfig amlogic 'config'\n\toption enable '1'\n\toption amlogic_firmware_repo 'https://github.com/breakingbadboy/OpenWrt'\n\toption amlogic_firmware_tag 'ARMv8'\n\toption amlogic_firmware_suffix '.img.gz'\n\toption amlogic_kernel_path 'https://github.com/ophub/kernel'\n\toption amlogic_kernel_tags ''\n\toption amlogic_kernel_branch ''\n\toption amlogic_plugin_branch 'main'\n\toption amlogic_firmware_config '1'\n\toption amlogic_write_bootloader '0'\n\toption amlogic_shared_fstype 'ext4'\n\nconfig settings 'armcpu'\n\toption governor0 'schedutil'\n\toption minfreq0 '500000'\n\toption maxfreq0 '1512000'\n"
  },
  {
    "path": "luci-app-amlogic/root/etc/init.d/amlogic",
    "content": "#!/bin/sh /etc/rc.common\nSTART=60\n\nNAME=amlogic\n\nuci_get_by_type() {\n    local ret=$(uci get $NAME.@$1[0].$2 2>/dev/null)\n    echo ${ret:=$3}\n}\n\nuci_set_by_type() {\n    uci set $NAME.@$1[0].$2=$3 2>/dev/null\n    uci commit $NAME\n}\n\nstart() {\n    [ -x \"/usr/sbin/fixcpufreq.pl\" ] && /usr/sbin/fixcpufreq.pl && sync\n    local cpu_policys=$(ls /sys/devices/system/cpu/cpufreq 2>/dev/null | grep -E 'policy[0-9]{1,3}' | xargs)\n    if [ \"${cpu_policys}\" = \"\" ]; then\n        cpu_policys=\"policy0\"\n    fi\n\n    config_load $NAME\n    for policy_name in ${cpu_policys}; do\n        local policy_id=\"${policy_name//policy/}\"\n\n        # Get an optional value list for the current device\n        local governor_list=\"$(cat /sys/devices/system/cpu/cpufreq/${policy_name}/scaling_available_frequencies 2>/dev/null | xargs)\"\n        local second_place_order=\"$(echo ${governor_list} | awk '{print $1}')\"\n        local second_place_reverse=\"$(echo ${governor_list} | awk '{print $NF}')\"\n\n        # Get the default value in the Config file\n        local governor=$(uci_get_by_type settings governor${policy_id} schedutil)\n        local minfreq=$(uci_get_by_type settings minfreq${policy_id} ${second_place_order})\n        local maxfreq=$(uci_get_by_type settings maxfreq${policy_id} ${second_place_reverse})\n\n        # Update result to the corresponding file\n        echo $governor >/sys/devices/system/cpu/cpufreq/${policy_name}/scaling_governor\n        echo $minfreq >/sys/devices/system/cpu/cpufreq/${policy_name}/scaling_min_freq\n        echo $maxfreq >/sys/devices/system/cpu/cpufreq/${policy_name}/scaling_max_freq\n\n        # If the governor is ondemand, configure its specific parameters.\n        if [ \"$governor\" = \"ondemand\" ]; then\n            local ondemand_dir=\"/sys/devices/system/cpu/cpufreq/${policy_name}/ondemand\"\n            # Check if the per-policy ondemand directory exists.\n            if [ -d \"$ondemand_dir\" ]; then\n                # Read ondemand parameters from UCI, or use default values (e.g., 80 and 20) if not set.\n                local up_threshold=$(uci_get_by_type settings up_threshold${policy_id} 80)\n                local sampling_down_factor=$(uci_get_by_type settings sampling_down_factor${policy_id} 20)\n\n                # Write the values to the system files.\n                echo $up_threshold > \"${ondemand_dir}/up_threshold\"\n                echo $sampling_down_factor > \"${ondemand_dir}/sampling_down_factor\"\n            fi\n        fi\n    done\n}\n\nreload() {\n    start\n    return 0\n}\n"
  },
  {
    "path": "luci-app-amlogic/root/etc/uci-defaults/luci-amlogic",
    "content": "#!/bin/sh\n\nsed -i 's/cbi.submit\\\"] = true/cbi.submit\\\"] = \\\"1\\\"/g' /usr/lib/lua/luci/dispatcher.lua\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@amlogic[-1]\n\tadd ucitrack amlogic\n\tset ucitrack.@amlogic[-1].init=amlogic\n\tcommit ucitrack\nEOF\n\nrm -rf /tmp/luci-*\nexit 0\n"
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/fixcpufreq.pl",
    "content": "#!/usr/bin/perl\n\nuse strict;\nuse File::Basename;\n\nmy $uci_config_name;\nif(-f \"/etc/config/amlogic\") {\n\t$uci_config_name=\"amlogic\";\n} elsif(-f \"/etc/config/cpufreq\") {\n\t$uci_config_name=\"cpufreq\";\n} else {\n\tprint \"Can not found amlogic or cpufreq config file!\\n\";\n\texit(0);\n}\n\nmy @policy_ids;\nmy @policy_homes = </sys/devices/system/cpu/cpufreq/policy?>;\nif(@policy_homes) {\n\tforeach my $policy_home (@policy_homes) {\n\t\tpush @policy_ids, substr($policy_home, -1);\n\t}\n} else {\n\tprint \"Can not found any policy!\\n\";\n\texit 0;\n}\n\nour $need_commit = 0;\nfor(my $i=0; $i <= $#policy_ids; $i++) {\n\t&fix_invalid_value($uci_config_name, $policy_ids[$i], $policy_homes[$i]);\n\n}\n\nif($need_commit > 0) {\n\t&uci_commit($uci_config_name);\n}\n\nexit 0;\n\n################################# function ####################################\nsub fix_invalid_value {\n\tmy($uci_config, $policy_id, $policy_home) = @_;\n\n\tmy %gove_hash = &get_gove_hash($policy_home);\n\tmy @freqs = &get_freq_list($policy_home);\n\tmy %freq_hash = &get_freq_hash(@freqs);\n\tmy $min_freq = &get_min_freq(@freqs);\n\tmy $max_freq = &get_max_freq(@freqs);\n\n\tmy $uci_section = \"settings\";\n\tmy $uci_option;\n\tif($uci_config eq \"cpufreq\" ) {\n       \t    $uci_option = \"governor\";\n\t} else {\n       \t    $uci_option = \"governor\" . $policy_id;\n\t}\n\t# 如果未设置 governor, 或该 goveernor 不存在， 则修败默认值为 schedutil\n\tmy $config_gove = &uci_get_by_type($uci_config, $uci_section, $uci_option, \"NA\");\n\tif( ($config_gove eq \"NA\") ||\n\t    ($gove_hash{$config_gove} != 1)) {\n\t\t&uci_set_by_type($uci_config, $uci_section, $uci_option, \"schedutil\");\n\t\t$need_commit++;\n\t}\n\n\t# 如果出现不存在的 minfreq, 则修改为实际的 min_freq\n\tif($uci_config eq \"cpufreq\" ) {\n\t\t# \"minifreq\" is a spelling error that has always existed in the upstream source code\n\t\t$uci_option = \"minifreq\"; \n\t} else {\n\t\t$uci_option = \"minfreq\" . $policy_id;\n\t}\n\tmy $config_min_freq = &uci_get_by_type($uci_config, $uci_section, $uci_option, \"0\");\n\tif($freq_hash{$config_min_freq} != 1) {\n\t\t&uci_set_by_type($uci_config, $uci_section, $uci_option, $min_freq);\n\t\t$need_commit++;\n\t}\n\n\t# 如果出现不存在的 maxfreq\n\t# 或 maxfreq < minfreq, 则修改为实际的 max_freq\n\tif($uci_config eq \"cpufreq\" ) {\n\t\t$uci_option = \"maxfreq\";\n\t} else {\n\t\t$uci_option = \"maxfreq\" . $policy_id;\n\t}\n\tmy $config_max_freq = &uci_get_by_type($uci_config, $uci_section, $uci_option, \"0\");\n\tif( ( $freq_hash{$config_max_freq} != 1) || \n            ( $config_max_freq < $config_min_freq)) {\n\t\t&uci_set_by_type($uci_config, $uci_section, $uci_option, $max_freq);\n\t\t$need_commit++;\n\t}\n}\n\nsub get_freq_list {\n\tmy $policy_home = shift;\n        my @ret_ary;\n        open my $fh, \"<\", \"${policy_home}/scaling_available_frequencies\" or die;\n\t$_ = <$fh>;\n\tchomp;\n\t@ret_ary = split /\\s+/;\n\tclose($fh);\n\treturn @ret_ary;\n}\n\nsub get_freq_hash {\n\tmy @freq_ary = @_;\n\tmy %ret_hash;\n        foreach my $freq (@freq_ary) {\n            if($freq =~ m/\\d+/) {\n                $ret_hash{$freq} = 1;\n            }\n        }\n\treturn %ret_hash;\n}\n\nsub get_min_freq {\n\tmy @freq_ary = @_;\n\treturn (sort {$a<=>$b} @freq_ary)[0];\n}\n\nsub get_max_freq {\n\tmy @freq_ary = @_;\n\treturn (sort {$a<=>$b} @freq_ary)[-1];\n}\n\nsub get_gove_hash {\n\tmy $policy_home = shift;\n\tmy %ret_hash;\n        open my $fh, \"<\", \"${policy_home}/scaling_available_governors\" or die;\n\t$_ = <$fh>;\n\tchomp;\n\tmy @gov_ary = split /\\s+/;\n\tforeach my $gov (@gov_ary) {\n\t\t#print \"gov: $gov\\n\";\n\t\tif($gov =~ m/\\w+/) {\n\t\t\t$ret_hash{$gov} = 1;\n            \t}\n        }\n        close($fh);\n\treturn %ret_hash;\n}\n\nsub uci_get_by_type {\n\tmy($config,$section,$option,$default) = @_;\n\tmy $ret;\n        $ret=`uci get ${config}.\\@${section}\\[0\\].${option} 2>/dev/null`;\n\t# 消除回车换行\n\t$ret =~ s/[\\n\\r]//g;\n\tif($ret eq '') {\n\t\treturn $default;\n\t} else {\n\t\treturn $ret;\n\t}\n}\n\nsub uci_set_by_type {\n\tmy($config,$section,$option,$value) = @_;\n\tmy $ret;\n\tsystem(\"uci set ${config}.\\@${section}\\[0\\].${option}=${value}\");\n\treturn;\n}\n\nsub uci_commit {\n\tmy $config = shift;\n\tsystem(\"uci commit ${config}\");\n\treturn;\n}\n"
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/openwrt-backup",
    "content": "#!/bin/bash\n#======================================================================\n# Function: Backup and restore config files in the /etc directory\n# Copyright (C) 2020-- https://github.com/unifreq/openwrt_packit\n# Copyright (C) 2021-- https://github.com/ophub/luci-app-amlogic\n#======================================================================\n\nVERSION=\"v1.3\"\nZSTD_LEVEL=6\nSNAPSHOT_PRESTR=\".snapshots/\"\nBACKUP_DIR=\"/.reserved\"\nBACKUP_NAME=\"openwrt_config.tar.gz\"\nBACKUP_FILE=\"${BACKUP_DIR}/${BACKUP_NAME}\"\n# Customize backup list\nbackup_list_conf=\"/etc/amlogic_backup_list.conf\"\nif [[ -s \"${backup_list_conf}\" ]]; then\n    while IFS= read -r line; do\n        BACKUP_LIST+=\"${line} \"\n    done <\"${backup_list_conf}\"\nelse\n    BACKUP_LIST='./etc/AdGuardHome.yaml \\\n./etc/amlogic_backup_list.conf \\\n./etc/adblocklist/ \\\n./etc/amule/ \\\n./etc/balance_irq \\\n./etc/bluetooth/ \\\n./etc/china_ssr.txt \\\n./etc/cifs/cifsdpwd.db \\\n./etc/smbd/smbdpwd.db \\\n./etc/ksmbd/ksmbdpwd.db \\\n./etc/config/ \\\n./etc/crontabs/ \\\n./etc/dae/ \\\n./etc/daed/ \\\n./usr/share/openclash/core/ \\\n./etc/openclash/backup/ \\\n./etc/openclash/config/ \\\n./etc/openclash/custom/ \\\n./etc/openclash/game_rules/ \\\n./etc/openclash/rule_provider/ \\\n./etc/openclash/proxy_provider/ \\\n./etc/dnsforwarder/ \\\n./etc/dnsmasq.conf \\\n./etc/dnsmasq.d/ \\\n./etc/dnsmasq.oversea/ \\\n./etc/dnsmasq.ssr/ \\\n./etc/docker/daemon.json \\\n./etc/docker/key.json \\\n./etc/dropbear/ \\\n./etc/easy-rsa/ \\\n./etc/environment \\\n./etc/exports \\\n./etc/firewall.user \\\n./etc/gfwlist/ \\\n./etc/haproxy.cfg \\\n./etc/hosts \\\n./etc/ipsec.conf \\\n./etc/ipsec.d/ \\\n./etc/ipsec.secrets \\\n./etc/ipsec.user \\\n./etc/ipset/ \\\n./etc/mosdns/config.yaml \\\n./etc/mwan3.user \\\n./etc/nginx/nginx.conf \\\n./etc/ocserv/ \\\n./etc/openvpn/ \\\n./etc/pptpd.conf \\\n./etc/qBittorrent/ \\\n./etc/rc.local \\\n./etc/samba/smbpasswd \\\n./etc/shadow \\\n./etc/smartdns/ \\\n./etc/sqm/ \\\n./etc/ssh/*key*  \\\n./etc/ssl/private/  \\\n./etc/ssrplus/ \\\n./etc/sysupgrade.conf \\\n./etc/tailscale/ \\\n./etc/transmission/ \\\n./etc/uhttpd.crt \\\n./etc/uhttpd.key \\\n./etc/urandom.seed \\\n./etc/v2raya/ \\\n./etc/verysync/ \\\n./root/.ssh/'\nfi\n\nerror_msg() {\n    echo -e \" [ERROR] ${1}\"\n    exit 1\n}\n\nif dmesg | grep 'meson' >/dev/null 2>&1; then\n    PLATFORM=\"amlogic\"\nelif dmesg | grep 'rockchip' >/dev/null 2>&1; then\n    PLATFORM=\"rockchip\"\nelif dmesg | grep 'sun50i-h6' >/dev/null 2>&1; then\n    PLATFORM=\"allwinner\"\nelse\n    source /etc/flippy-openwrt-release\n    case ${PLATFORM} in\n    amlogic | rockchip | allwinner | qemu-aarch64) : ;;\n    *) error_msg \"Unknown platform, only support amlogic or rockchip or allwinner h6 or qemu-aarch64!\" ;;\n    esac\nfi\n\nget_root_partition_name() {\n    local paths=(\"/\" \"/overlay\" \"/rom\")\n    local partition_name\n\n    for path in \"${paths[@]}\"; do\n        partition_name=$(df \"${path}\" | awk 'NR==2 {print $1}' | awk -F '/' '{print $3}')\n        [[ -n \"${partition_name}\" ]] && break\n    done\n\n    [[ -z \"${partition_name}\" ]] && error_msg \"Cannot find the root partition!\"\n    echo \"${partition_name}\"\n}\n\n# Get the partition message of the root file system\nget_root_partition_msg() {\n    local paths=(\"/\" \"/overlay\" \"/rom\")\n    local partition_name\n\n    for path in \"${paths[@]}\"; do\n        partition_msg=$(lsblk -l -o NAME,PATH,MOUNTPOINT,UUID,FSTYPE,LABEL | awk '$3 ~ \"^\" \"'\"${path}\"'\" \"$\" {print $0}')\n        [[ -n \"${partition_msg}\" ]] && break\n    done\n\n    [[ -z \"${partition_msg}\" ]] && error_msg \"Cannot find the root partition message!\"\n    echo \"${partition_msg}\"\n}\n\nbackup() {\n    cd /\n    echo -n \"Backup config files ... \"\n    [ -d \"${BACKUP_DIR}\" ] || mkdir -p \"${BACKUP_DIR}\"\n    eval tar czf \"${BACKUP_FILE}\" \"${BACKUP_LIST}\" 2>/dev/null\n    sync\n    if [ -f \"${BACKUP_FILE}\" ]; then\n        echo \"Has been backed up to [ ${BACKUP_FILE} ], please download and save.\"\n        exit 0\n    else\n        error_msg \"Backup failed!\"\n    fi\n}\n\nrestore() {\n    # Find the partition where root is located\n    ROOT_PTNAME=\"$(get_root_partition_name)\"\n\n    # Find the disk where the partition is located, only supports mmcblk?p? sd?? hd?? vd?? and other formats\n    case ${ROOT_PTNAME} in\n    mmcblk?p[1-4])\n        EMMC_NAME=$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-2)}')\n        PARTITION_NAME=\"p\"\n        LB_PRE=\"EMMC_\"\n        ;;\n    [hsv]d[a-z][1-4])\n        EMMC_NAME=$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-1)}')\n        PARTITION_NAME=\"\"\n        LB_PRE=\"\"\n        ;;\n    *)\n        error_msg \"Unable to recognize the disk type of ${ROOT_PTNAME}!\"\n        ;;\n    esac\n\n    [ -d \"${BACKUP_DIR}\" ] || mkdir -p \"${BACKUP_DIR}\"\n    [ -f \"/tmp/upload/${BACKUP_NAME}\" ] && mv -f \"/tmp/upload/${BACKUP_NAME}\" ${BACKUP_FILE}\n    [ -f \"/mnt/${EMMC_NAME}${PARTITION_NAME}4/${BACKUP_NAME}\" ] && mv -f \"/mnt/${EMMC_NAME}${PARTITION_NAME}4/${BACKUP_NAME}\" ${BACKUP_FILE}\n    sync\n\n    if [ -f \"${BACKUP_FILE}\" ]; then\n        echo -n \"restore config files ... \"\n        cd /\n        tar xzf \"${BACKUP_FILE}\" 2>/dev/null && sync\n\n        echo \"Successful recovery. Will start automatically, please refresh later!\"\n        sleep 3\n        reboot\n        exit 0\n    else\n        error_msg \"The backup file [ ${BACKUP_FILE} ] not found!\"\n    fi\n}\n\ngen_fstab() {\n    # Find the partition where root is located\n    ROOT_PTNAME=\"$(get_root_partition_name)\"\n\n    # Find the disk where the partition is located, only supports mmcblk?p? sd?? hd?? vd?? and other formats\n    case ${ROOT_PTNAME} in\n    mmcblk?p[1-4])\n        EMMC_NAME=$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-2)}')\n        PARTITION_NAME=\"p\"\n        ;;\n    [hsv]d[a-z][1-4])\n        EMMC_NAME=$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-1)}')\n        PARTITION_NAME=\"\"\n        ;;\n    *)\n        error_msg \"Unable to recognize the disk type of ${ROOT_PTNAME}!\"\n        ;;\n    esac\n\n    ROOT_MSG=\"$(get_root_partition_msg)\"\n    ROOT_NAME=$(echo $ROOT_MSG | awk '{print $1}')\n    ROOT_DEV=$(echo $ROOT_MSG | awk '{print $2}')\n    ROOT_UUID=$(echo $ROOT_MSG | awk '{print $4}')\n    ROOT_FSTYPE=$(echo $ROOT_MSG | awk '{print $5}')\n    ROOT_LABEL=$(echo $ROOT_MSG | awk '{print $6}')\n\n    BOOT_NAME=\"${EMMC_NAME}${PARTITION_NAME}1\"\n    BOOT_MSG=$(lsblk -l -o NAME,UUID,FSTYPE,LABEL | grep \"${BOOT_NAME}\")\n    BOOT_DEV=\"/dev/${BOOT_NAME}\"\n    BOOT_UUID=$(echo $BOOT_MSG | awk '{print $2}')\n    BOOT_FSTYPE=$(echo $BOOT_MSG | awk '{print $3}')\n    BOOT_LABEL=$(echo $BOOT_MSG | awk '{print $4}')\n\n    cat >/etc/config/fstab <<EOF\nconfig global\n\toption anon_swap '0'\n\toption anon_mount '1'\n\toption auto_swap '0'\n\toption auto_mount '1'\n\toption delay_root '5'\n\toption check_fs '0'\n\nconfig mount\n\toption target '/rom'\n\toption uuid '${ROOT_UUID}'\n\toption enabled '1'\n\toption enabled_fsck '1'\n\toption fstype '${ROOT_FSTYPE}'\nEOF\n\n    if [ \"${ROOT_FSTYPE}\" == \"btrfs\" ]; then\n        echo \"\toption options 'compress=zstd:${ZSTD_LEVEL}'\" >>/etc/config/fstab\n    fi\n\n    cat >>/etc/config/fstab <<EOF\n\nconfig mount\n\toption target '/boot'\nEOF\n\n    if [ \"${BOOT_FSTYPE}\" == \"vfat\" ]; then\n        echo \"\toption label '${BOOT_LABEL}'\" >>/etc/config/fstab\n    else\n        echo \"\toption uuid '${BOOT_UUID}'\" >>/etc/config/fstab\n    fi\n\n    cat >>/etc/config/fstab <<EOF\n\toption enabled '1'\n\toption enabled_fsck '1'\n\toption fstype '${BOOT_FSTYPE}'\n\nEOF\n    echo \"/etc/config/fstab generated.\"\n    echo \"Please reboot before continuing.\"\n    exit 0\n}\n\nprint_list() {\n    echo \"${BACKUP_LIST}\"\n    exit 0\n}\n\nlist_snapshot() {\n    echo \"----------------------------------------------------------------\"\n    btrfs subvolume list -rt /\n    echo \"----------------------------------------------------------------\"\n    read -p \"Press [ enter ] to return.\" q\n}\n\ncreate_snapshot() {\n    default_snap_name=\"etc-$(date +\"%m.%d.%H%M%S\")\"\n    echo \"The default snapshot name is: ${default_snap_name}\"\n    echo \"If you want to modify the snapshot name, please enter it below. Cannot contain spaces.\"\n    echo \"If you do not want to modify it, just press [ Enter ]. Or press the [ q ] key to go back directly.\"\n    while :; do\n        read -p \"[${default_snap_name}] : \" nname\n        if [ \"${nname}\" == \"\" ]; then\n            snap_name=\"${default_snap_name}\"\n            break\n        elif echo \"${nname}\" | grep -E \"\\s+\" >/dev/null; then\n            echo \"The name [${nname}] contains spaces, please re-enter!\"\n            continue\n        elif [ \"${nname}\" == \"q\" ] || [ \"${nname}\" == \"Q\" ]; then\n            return\n        else\n            if btrfs subvolume list -rt / | awk '{print $4}' | grep \"^\\\\${SNAPSHOT_PRESTR}${nname}$\" >/dev/null; then\n                echo \"Name: [ ${nname} ] has been used, please re-enter!\"\n                continue\n            else\n                snap_name=\"${nname}\"\n                break\n            fi\n        fi\n    done\n\n    (\n        cd /\n        chattr -ia etc/config/fstab\n        btrfs subvolume snapshot -r /etc \"${SNAPSHOT_PRESTR}${snap_name}\"\n        if [[ \"$?\" -eq \"0\" ]]; then\n            echo \"The snapshot is created successfully: ${snap_name}\"\n        else\n            echo \"Snapshot creation failed!\"\n        fi\n    )\n    read -p \"Press [ enter ] to return.\" q\n}\n\nrestore_snapshot() {\n    echo \"Below are the existing etc snapshots, please enter the name of one of them.\"\n    echo \"Tip: [ etc-000 ] This is the factory initial configuration.\"\n    echo \"     [ etc-001 ] if it exists, it is the initial configuration after upgrading from the previous version.\"\n    echo \"----------------------------------------------------------------\"\n    btrfs subvolume list -rt /\n    echo \"----------------------------------------------------------------\"\n    read -p \"Please enter the name of the snapshot to be restored (only the part after ${SNAPSHOT_PRESTR} needs to be entered): \" snap_name\n    if btrfs subvolume list -rt / | grep \"${SNAPSHOT_PRESTR}${snap_name}\" >/dev/null; then\n        while :; do\n            echo \"Once the snapshot is restored, the current [ /etc ] will be overwritten!\"\n            read -p \"Are you sure you want to restore the snapshot: [$snap_name]? y/n [n] \" yn\n            case $yn in\n            y | Y)\n                (\n                    cd /\n                    chattr -ia etc/config/fstab\n                    mv etc etc.backup\n                    btrfs subvolume snapshot \"${SNAPSHOT_PRESTR}${snap_name}\" etc\n                    if [[ \"$?\" -eq \"0\" ]]; then\n                        btrfs subvolume delete -c etc.backup\n                        echo \"Successfully restored, please enter [ reboot ] to restart the openwrt.\"\n                    else\n                        rm -rf etc\n                        mv etc.backup etc\n                        echo \"Recovery failed, [ etc ] has not changed!\"\n                    fi\n                )\n                read -p \"Press [ enter ] to return.\" q\n                break\n                ;;\n            *)\n                break\n                ;;\n            esac\n        done\n    else\n        read -p \"The snapshot name is incorrect, please run the program again! Press [ Enter ] to go back.\" q\n    fi\n}\n\ndelete_snapshot() {\n    echo \"Below are the existing [ etc ] snapshots, please enter the name of one of them.\"\n    echo \"Tip: [ etc-000 ] This is the factory initial configuration (cannot be deleted)\"\n    echo \"     [ etc-001 ] if it exists, it is the initial configuration after upgrading from the previous version (cannot be deleted)\"\n    echo \"----------------------------------------------------------------\"\n    btrfs subvolume list -rt /\n    echo \"----------------------------------------------------------------\"\n    read -p \"Please enter the name of the snapshot to be deleted (only the part after ${SNAPSHOT_PRESTR} needs to be entered): \" snap_name\n    if [ \"${snap_name}\" == \"etc-000\" ] || [ \"${snap_name}\" == \"etc-001\" ]; then\n        read -p \"The key snapshot cannot be deleted! Press [ enter ] to return.\" q\n    elif [ \"${snap_name}\" == \"\" ]; then\n        read -p \"Name is empty! Press [ enter ] to return.\" q\n    else\n        if btrfs subvolume list -rt / | grep \"${SNAPSHOT_PRESTR}${snap_name}\" >/dev/null; then\n            read -p \"Are you sure you want to delete ${snap_name}? y/n [n] \" yn\n            case $yn in\n            y | Y)\n                (\n                    cd /\n                    btrfs subvolume delete -c \"${SNAPSHOT_PRESTR}${snap_name}\"\n                    if [[ \"$?\" -eq \"0\" ]]; then\n                        echo \"Snapshot [ ${snap_name} ] has been deleted.\"\n                    else\n                        echo \"Snapshot [ ${snap_name} ] failed to delete!\"\n                    fi\n                )\n                read -p \"Press [ Enter ] to return.\" q\n                ;;\n            *)\n                break\n                ;;\n            esac\n        else\n            read -p \"The name of the snapshot is incorrect, press [ Enter ] to return.\" q\n        fi\n    fi\n}\n\nmigrate_snapshot() {\n    cur_rootdev=\"$(get_root_partition_name)\"\n\n    dev_pre=$(echo \"${cur_rootdev}\" | awk '{print substr($1, 1, length($1)-1);}')\n    rootdev_idx=$(echo \"${cur_rootdev}\" | awk '{print substr($1, length($1),1);}')\n    case $rootdev_idx in\n    2)\n        old_rootpath=\"/mnt/${dev_pre}3\"\n        ;;\n    3)\n        old_rootpath=\"/mnt/${dev_pre}2\"\n        ;;\n    *)\n        echo \"Judge the old version of rootfs path failed!\"\n        read -p \"Press [ enter ] to return.\" q\n        return\n        ;;\n    esac\n    echo \"The following are snapshots of etc found from the old version of rootfs, please enter the name of one of them.\"\n    echo \"Tip: Automatically exclude etc-000 and etc-001\"\n    echo \"-----------------------------------------------------------------------------------\"\n    btrfs subvolume list -rt \"${old_rootpath}\" | grep -v \"${SNAPSHOT_PRESTR}etc-000\" | grep -v \"${SNAPSHOT_PRESTR}etc-001\"\n    echo \"-----------------------------------------------------------------------------------\"\n    read -p \"Please enter the name of the snapshot to be migrated (only the part after $(SNAPSHOT_PRESTR) needs to be entered): \" old_snap_name\n    if [ \"${old_snap_name}\" == \"\" ]; then\n        read -p \"The name is empty, Press [ enter ] to return.\" q\n        return\n    elif ! btrfs subvolume list -rt \"${old_rootpath}\" | awk '{print $4}' | grep \"^${SNAPSHOT_PRESTR}${old_snap_name}$\" >/dev/null; then\n        echo \"The name was entered incorrectly, and the corresponding snapshot was not found!\"\n        read -p \"Press [ enter ] to return.\" q\n        return\n    elif [ \"${old_snap_name}\" == \"etc-000\" ] || [ \"${old_snap_name}\" == \"etc-001\" ]; then\n        echo \"Critical snapshots are not allowed to migrate!\"\n        read -p \"Press [ enter ] to return.\" q\n        return\n    fi\n\n    # Find out if there is a snapshot with the same name under the current rootfs\n    if btrfs subvolume list -rt / | awk '{print $4}' | grep \"^\\\\${SNAPSHOT_PRESTR}${old_snap_name}$\" >/dev/null; then\n        echo \"A snapshot with the name [ ${old_snap_name} ] already exists and cannot be migrated! (But you can delete the existing snapshot with the same name and then migrate)\"\n        read -p \"Press [ enter ] to return.\" q\n        return\n    fi\n\n    need_size=$(du -h -d0 ${old_rootpath}/${SNAPSHOT_PRESTR}${old_snap_name} | tail -n1 | awk '{print $1}')\n    echo \"----------------------------------------------------------------------------------------------\"\n    df -h\n    echo \"----------------------------------------------------------------------------------------------\"\n    echo -e \"Note: To migrate the snapshot [ ${old_snap_name} ] of [ ${old_rootpath} ] to the current rootfs, it takes about [ ${need_size} ] space,\"\n    echo -e \"      Please confirm whether the partition [/dev/${cur_rootdev}] where [/] is located has enough free space (Available)?\"\n    read -p \"Are you sure to migrate? y/n [n] \" yn\n    if [ \"$yn\" == \"y\" ] || [ \"$yn\" == \"Y\" ]; then\n        (\n            cd /\n            btrfs send ${old_rootpath}/${SNAPSHOT_PRESTR}${old_snap_name} | btrfs receive ${SNAPSHOT_PRESTR}\n            if [ $? -eq 0 ]; then\n                btrfs property set -ts ${SNAPSHOT_PRESTR}${old_snap_name} ro false\n                cp ${SNAPSHOT_PRESTR}etc-000/config/fstab ${SNAPSHOT_PRESTR}${old_snap_name}/config/\n                cp ${SNAPSHOT_PRESTR}etc-000/fstab ${SNAPSHOT_PRESTR}${old_snap_name}/\n                cp ${SNAPSHOT_PRESTR}etc-000/openwrt_release ${SNAPSHOT_PRESTR}${old_snap_name}/\n                cp ${SNAPSHOT_PRESTR}etc-000/openwrt_version ${SNAPSHOT_PRESTR}${old_snap_name}/\n                cp ${SNAPSHOT_PRESTR}etc-000/flippy-openwrt-release ${SNAPSHOT_PRESTR}${old_snap_name}/\n                cp ${SNAPSHOT_PRESTR}etc-000/banner ${SNAPSHOT_PRESTR}${old_snap_name}/banner\n                btrfs property set -ts ${SNAPSHOT_PRESTR}${old_snap_name} ro true\n                echo \"The migration is complete, if you want to apply the snapshot [ ${old_snap_name} ], please use the restore snapshot function.\"\n            else\n                echo \"The migration failed!\"\n            fi\n            read -p \"Press [ enter ] to return.\" q\n            return\n        )\n    fi\n}\n\nsnapshot_help() {\n    clear\n    cat <<EOF\n============================================================================================================================\n1.  What is a snapshot?\n    A snapshot is the state record of a certain subvolume at a certain point in time, and a snapshot is a special subvolume;\n    When the local snapshot is first generated, it shares the disk space with the original subvolume,\n    so it does not occupy additional space, and only the files that have changed subsequently occupy space;\n    Snapshots migrated from other places are not snapshots in essence, but just ordinary subvolumes, so they take up space.\n2.  How to display existing snapshots?\n    input the command: btrfs subvolume list -rt /\n---------------------------------------------------------------------------------------------\nEOF\n    btrfs subvolume list -rt /\n    cat <<EOF\n---------------------------------------------------------------------------------------------\n2.  How to create a snapshot?\n    btrfs subvolume snapshot -r /etc /.snapshots/snapshot_1  # -r It means to generate a read-only snapshot\n3.  How to delete a snapshot?\n    btrfs subvolume delete -c /.snapshots/snapshot_1  # -c 是 commit 的意思\n4.  How to rename a snapshot?\n    Just use the [ mv ] command of the operating system, for example:\n    mv /.snapshots/snapshot_1 /.snapshots/snapshot_2\n5.  How to restore the snapshot?\n    mv /etc /etc.backup  # Back up /etc to /etc.backup, that is, rename the subvolume\n    btrfs subvolume snapshot /.snapshots/etc-001  /etc   # Use snapshot etc-001 to generate snapshot etc, no -r parameter\n    # (Yes, snapshots can also be re-generated snapshots)\n    btrfs delete -c /etc.backup # After the previous step is successful, you can delete the etc backup just now\n6.  How to restore a certain file from the snapshot?\n    Example A: Restore the mount point configuration file from snapshot etc-000: /etc/config/fstab\n        cp /.snapshots/etc-000/config/fstab /etc/config/\n    Example B: Restore network configuration from snapshot etc-001:\n        cp /.snapshots/etc-001/config/network  /etc/config/\n    Example C: Restore the ssr configuration file from snapshot etc-001:\n        cp /.snapshots/etc-001/config/shadowsocksr /etc/config/\n    # (Yes, it is the [ cp ] command of the operating system)\n7.  How to migrate snapshots from remote?\n    btrfs supports ssh remote migration snapshots, for example:\n    ssh 192.168.1.1 btrfs send /.snapshots/snapshot_x  |  btrfs receive /.snapshots\n    After the command is completed, the remote snapshot_x is copied to the local /.snapshots/snapshot_x\n    (as mentioned above, the migration is a subvolume, which takes up space)\n============================================================================================================================\nEOF\n    exit 0\n}\n\nprint_help() {\n    echo \"Usage: $0  -b    [ backup ]\"\n    echo \"       $0  -r    [ restore ]\"\n    echo \"       $0  -g    [ generate fstab ]\"\n    echo \"       $0  -p    [ print backup list ]\"\n    echo \"       $0  -l    [ list snapshots ]\"\n    echo \"       $0  -c    [ create snapshot ]\"\n    echo \"       $0  -s    [ restore snapshot ]\"\n    echo \"       $0  -d    [ delete snapshot ]\"\n    echo \"       $0  -h    [ help ]\"\n    echo \"       $0  -q    [ quit ]\"\n    exit 0\n}\n\nmenu() {\n    while :; do\n        clear\n        cat <<EOF\n\n        ┌────────[ backup config ]────────┐\n        │                                 │\n        │       b. backup config          │\n        │       r. restore config         │\n        │       g. generate fstab         │\n        │       p. print backup list      │\n        │                                 │\n        ├─────[ Snapshot management ]─────┤\n        │                                 │\n        │       l. list snapshots         │\n        │       c. create snapshot        │\n        │       d. delete snapshot        │\n        │       R. restore snapshot       │\n        │       m. migrate snapshot       │\n        │       s. snapshot help          │\n        │                                 │\n        ╞═════════════════════════════════╡\n        │                                 │\n        │       h. help                   │\n        │       q. quit                   │\n        │                                 │\n        └─────────────────────────────────┘\n\nEOF\n        echo -ne \"please select: [ ]\\b\\b\"\n        read select\n        case $select in\n        b | backup) backup ;;\n        r | restore)\n            restore\n            gen_fstab\n            ;;\n        g | gen_fstab) gen_fstab ;;\n        p | print_list) print_list ;;\n        l | list_snapshot) list_snapshot ;;\n        c | create_snapshot) create_snapshot ;;\n        d | delete_snapshot) delete_snapshot ;;\n        R | restore_snapshot) restore_snapshot ;;\n        m | migrate_snapshot) migrate_snapshot ;;\n        s | snapshot_help) snapshot_help ;;\n        h | help) print_help ;;\n        q | quit) exit 0 ;;\n        esac\n    done\n}\n\ngetopts 'brgplcRmsdhq' opts\ncase $opts in\nb | backup) backup ;;\nr | restore)\n    restore\n    gen_fstab\n    ;;\ng | gen_fstab) gen_fstab ;;\np | print_list) print_list ;;\nl | list_snapshot) list_snapshot ;;\nc | create_snapshot) create_snapshot ;;\nd | delete_snapshot) delete_snapshot ;;\nR | restore_snapshot) restore_snapshot ;;\nm | migrate_snapshot) migrate_snapshot ;;\ns | snapshot_help) snapshot_help ;;\nh | help) print_help ;;\nq | quit) exit 0 ;;\n*) menu ;;\nesac\n"
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/openwrt-ddbr",
    "content": "#!/bin/bash\n#===========================================================================\n#\n# This file is licensed under the terms of the GNU General Public\n# License version 2. This program is licensed \"as is\" without any\n# warranty of any kind, whether express or implied.\n#\n# This file is a part of the make OpenWrt for Amlogic s9xxx tv box\n# https://github.com/ophub/luci-app-amlogic\n#\n# Description: Backup and restore the system in emmc\n# Copyright (C) 2017- The function borrowed from armbian/ddbr, Author: xXx\n# Copyright (C) 2021- https://github.com/unifreq/openwrt_packit\n# Copyright (C) 2021- https://github.com/ophub/luci-app-amlogic\n#\n# Command: openwrt-ddbr\n#\n#========================= Set default parameters ===========================\n#\n# Set font color\nblue_font_prefix=\"\\033[34m\"\npurple_font_prefix=\"\\033[35m\"\ngreen_font_prefix=\"\\033[32m\"\nyellow_font_prefix=\"\\033[33m\"\nred_font_prefix=\"\\033[31m\"\nfont_color_suffix=\"\\033[0m\"\nINFO=\"[${blue_font_prefix}INFO${font_color_suffix}]\"\nSTEPS=\"[${purple_font_prefix}STEPS${font_color_suffix}]\"\nSUCCESS=\"[${green_font_prefix}SUCCESS${font_color_suffix}]\"\nOPT=\"[${yellow_font_prefix}OPT${font_color_suffix}]\"\nERROR=\"[${red_font_prefix}ERROR${font_color_suffix}]\"\n#\n# Check the output path\nout_path=\"/ddbr\"\n# File name for backup/restore\nddbr_image=\"BACKUP-arm-64-emmc.img.gz\"\n# Need remaining space, unit: GB\nneed_space=\"2\"\n#\n#===========================================================================\n\n# Encountered a serious error, abort the script execution\nerror_msg() {\n\techo -e \"${ERROR} ${1}\"\n\texit 1\n}\n\n# Get the partition name of the root file system\nget_root_partition_name() {\n\tlocal paths=(\"/\" \"/overlay\" \"/rom\")\n\tlocal partition_name\n\n\tfor path in \"${paths[@]}\"; do\n\t\tpartition_name=$(df \"${path}\" | awk 'NR==2 {print $1}' | awk -F '/' '{print $3}')\n\t\t[[ -n \"${partition_name}\" ]] && break\n\tdone\n\n\t[[ -z \"${partition_name}\" ]] && error_msg \"Cannot find the root partition!\"\n\techo \"${partition_name}\"\n}\n\n# Check emmc\ndo_checkemmc() {\n\t# Get device name\n\tmydevice_name=\"$(cat /proc/device-tree/model | tr -d '\\000')\"\n\techo -e \"${INFO} The device name: [ ${mydevice_name} ]\"\n\n\t# Find the partition where root is located\n\troot_ptname=\"$(get_root_partition_name)\"\n\n\t# Find the EMMC drive\n\temmc=\"$(lsblk -l -o NAME | grep -oE \"mmcblk[0-9]boot0\" | sort | uniq | sed \"s/boot0//g\")\"\n\t# Find emmc disk, find emmc that does not contain the boot0 partition\n\t[[ -z \"${emmc}\" ]] && emmc=\"$(lsblk -l -o NAME | grep -oE '(mmcblk[0-9]?)' | grep -vE ^${root_ptname:0:-2} | uniq)\"\n\t# Check if emmc exists\n\t[[ -z \"${emmc}\" ]] && error_msg \"The eMMC storage not found in this device!\"\n\t# Show the emmc name\n\techo -e \"${INFO} The device eMMC name: [ /dev/${emmc} ]\"\n\n\t# Find the disk where the partition is located, only supports mmcblk?p? sd?? hd?? vd?? and other formats\n\tcase \"${root_ptname}\" in\n\tmmcblk?p[1-4])\n\t\tdisk_name=\"$(echo ${root_ptname} | awk '{print substr($1, 1, length($1)-2)}')\"\n\t\tif lsblk -l -o NAME | grep \"${disk_name}boot0\" >/dev/null; then\n\t\t\terror_msg \"The current system is running on emmc. Please perform backup/restore operation in [ SD/TF/USB ]!\"\n\t\tfi\n\t\tlink_ptname=\"p\"\n\t\t;;\n\t[hsv]d[a-z][1-4])\n\t\tdisk_name=\"$(echo ${root_ptname} | awk '{print substr($1, 1, length($1)-1)}')\"\n\t\tlink_ptname=\"\"\n\t\t;;\n\tnvme?n?p[1-4])\n\t\tdisk_name=\"$(echo ${root_ptname} | awk '{print substr($1, 1, length($1)-2)}')\"\n\t\tlink_ptname=\"p\"\n\t\t;;\n\t*)\n\t\terror_msg \"Unable to recognize the disk type of ${root_ptname}!\"\n\t\t;;\n\tesac\n\n\t# Set check parameters\n\tout_path=\"/mnt/${disk_name}${link_ptname}4\"\n\tdev_intsize=\"$(fdisk -s /dev/${emmc})\"\n\t[[ -z \"$(echo \"${dev_intsize}\" | sed -n \"/^[0-9]\\+$/p\")\" ]] && error_msg \"Unable to get EMMC size.\"\n\techo -e \"${INFO} The device EMMC size: [ $(($dev_intsize / 1024 / 1024))GB ]\"\n\n\t# check directory\n\t[[ -d \"${out_path}\" ]] || mkdir -p ${out_path}\n\techo -e \"${INFO} The ddbr file path: [ ${out_path}/${ddbr_image} ]\\n\"\n}\n\n# Check the remaining space\ndo_checkspace() {\n\tremaining_space=\"$(df -Tk ${out_path} | grep '/dev/' | awk '{print $5}' | echo $(($(xargs) / 1024 / 1024)))\"\n\tif [[ -z \"$(echo \"${remaining_space}\" | sed -n \"/^[0-9]\\+$/p\")\" ]]; then\n\t\terror_msg \"The path is not available, the remaining space cannot be obtained.\"\n\tfi\n\tif [[ \"${remaining_space}\" -lt \"${need_space}\" ]]; then\n\t\terror_msg \"The remaining space is [ ${remaining_space} ] Gb, and more than [ ${need_space} ] Gb space is required.\"\n\tfi\n}\n\n# Backup the emmc system\ndo_backup() {\n\techo -e \"${STEPS} Start to backup the system in emmc.\"\n\tdo_checkspace\n\techo -e \"Saving and Compressing [ /dev/${emmc} ] to [ ${out_path}/${ddbr_image} ], Please wait...\"\n\trm -f ${out_path}/${ddbr_image} 2>/dev/null && sync\n\tdd if=/dev/${emmc} | pv -s ${dev_intsize}\"K\" | gzip >${out_path}/${ddbr_image}\n\t[[ \"${?}\" -eq \"0\" ]] && sync && echo -e \"${SUCCESS} Backup is complete.\"\n}\n\n# Restore the emmc system\ndo_restore() {\n\techo -e \"${STEPS} Start to restore the system in emmc.\"\n\t[[ ! -f ${out_path}/${ddbr_image} ]] && error_msg \"The [ ${out_path}/${ddbr_image} ] File not found.\"\n\techo -e \"Restoring [ ${out_path}/${ddbr_image} ] to [ /dev/${emmc} ], Please wait...\"\n\tgunzip -c ${out_path}/${ddbr_image} | pv -s ${dev_intsize}\"K\" | dd of=/dev/${emmc}\n\t[[ \"${?}\" -eq \"0\" ]] && sync && echo -e \"${SUCCESS} Restore is complete.\"\n}\n\necho -e \"${STEPS} Welcome to use the EMMC system backup/restore service.\"\n# Check script permission\n[[ -x \"/usr/sbin/openwrt-ddbr\" ]] || error_msg \"Please grant execution permission: [ chmod +x /usr/sbin/openwrt-ddbr ]\"\n# Check emmc\ndo_checkemmc\n# Prompt the user to select backup/restore\necho -ne \"${OPT} Do you want to backup or restore? Backup=(b) Restore=(r): \"\nread br\ncase \"${br}\" in\nb | B | backup) do_backup ;;\nr | R | restore) do_restore ;;\n*) exit 0 ;;\nesac\n"
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/openwrt-install-amlogic",
    "content": "#!/bin/bash\n#======================================================================================\n# Function: Install openwrt to emmc for Amlogic S9xxx STB\n# Copyright (C) 2020-- https://github.com/unifreq/openwrt_packit\n# Copyright (C) 2021-- https://github.com/ophub/luci-app-amlogic\n#======================================================================================\n#\n# The script supports directly setting parameters for installation, skipping interactive selection\n# openwrt-install-amlogic ${AUTO_MAINLINE_UBOOT} ${ID} ${FDTFILE}:${SOC}:${UBOOT_OVERLOAD} ${SHARED_FSTYPE}\n# E.g: openwrt-install-amlogic yes 11 auto ext4\n# E.g: openwrt-install-amlogic no 99 meson-gxl-s905d-phicomm-n1.dtb:s905d:u-boot-n1.bin ext4\n# Tip: When custom dtb file, set ${SOC_ID} to 99, and parameter ${FDTFILE}:${SOC}:${UBOOT_OVERLOAD} must be set\n# Tip: ${SHARED_FSTYPE}: Shared partition can be ext4, xfs, btrfs, f2fs\n\n# You can also execute the script directly, and interactively select related functions\n# E.g: openwrt-install-amlogic\n#\n#======================================================================================\n\n# Encountered a serious error, abort the script execution\nerror_msg() {\n    echo -e \"[ERROR] ${1}\"\n    exit 1\n}\n\n# Get the partition name of the root file system\nget_root_partition_name() {\n    local paths=(\"/\" \"/overlay\" \"/rom\")\n    local partition_name\n\n    for path in \"${paths[@]}\"; do\n        partition_name=$(df \"${path}\" | awk 'NR==2 {print $1}' | awk -F '/' '{print $3}')\n        [[ -n \"${partition_name}\" ]] && break\n    done\n\n    [[ -z \"${partition_name}\" ]] && error_msg \"Cannot find the root partition!\"\n    echo \"${partition_name}\"\n}\n\n# Receive one-key command related parameters\nAUTO_MAINLINE_UBOOT=\"${1}\"\nZSTD_LEVEL=\"6\"\nop_release=\"/etc/flippy-openwrt-release\"\n\n# For [luci-app-amlogic] input parameter: DTB, SOC & UBOOT_OVERLOAD\n# When there is no input parameter, select manually\nSPECIFY_ID=\"\"\nSPECIFY_SOC=\"\"\nSPECIFY_DTB=\"\"\nSPECIFY_UBOOT=\"\"\n[[ -n \"${2}\" ]] && {\n    SPECIFY_ID=\"${2}\"\n    if [[ \"${2}\" -eq \"99\" ]]; then\n        if [[ -n \"${3}\" ]]; then\n            # E.g: meson-gxl-s905d-phicomm-n1.dtb:s905d:u-boot-n1.bin\n            SPECIFY_DTB=\"$(echo \"${3}\" | awk -F ':' '{print $1}')\"\n            SPECIFY_SOC=\"$(echo \"${3}\" | awk -F ':' '{print $2}')\"\n            SPECIFY_UBOOT=\"$(echo \"${3}\" | awk -F ':' '{print $3}')\"\n        else\n            error_msg \"Please enter the DTB file name!\"\n        fi\n    fi\n}\n\n# shared partition can be ext4, xfs, btrfs, f2fs\nSHARED_FSTYPE=\"${4}\"\n\necho \"AUTO_MAINLINE_UBOOT: ${AUTO_MAINLINE_UBOOT}\"\necho \"SPECIFY_DTB: ${SPECIFY_DTB}\"\necho \"SPECIFY_SOC: ${SPECIFY_SOC}\"\necho \"SPECIFY_UBOOT: ${SPECIFY_UBOOT}\"\necho \"SHARED_FSTYPE: ${SHARED_FSTYPE}\"\n\n# Current device model\nMYDEVICE_NAME=$(cat /proc/device-tree/model | tr -d '\\000')\nif [[ -z \"${MYDEVICE_NAME}\" ]]; then\n    error_msg \"The device name is empty and cannot be recognized.\"\nelif [[ ! -f \"${op_release}\" ]]; then\n    error_msg \"The [ ${op_release} ] file is missing.\"\nelse\n    echo -e \"Current device: ${MYDEVICE_NAME} [ amlogic ]\"\n    sleep 3\nfi\n\n# Find the device name of /\nroot_devname=\"$(get_root_partition_name)\"\nif lsblk -l | grep -E \"^${root_devname}boot0\" >/dev/null; then\n    error_msg \"you are running in emmc mode, please boot system with usb or tf card!\"\nfi\n\ninstall_emmc=\"$(lsblk -l -o NAME | grep -oE '(mmcblk[0-9]?boot0)' | sed \"s/boot0//g\")\"\nif [[ \"${install_emmc}\" == \"\" ]]; then\n    error_msg \"No emmc can be found to install the openwrt system!\"\nfi\n\n# EMMC DEVICE NAME\nEMMC_NAME=\"${install_emmc}\"\nEMMC_DEVPATH=\"/dev/${EMMC_NAME}\"\necho ${EMMC_DEVPATH}\nEMMC_SIZE=$(lsblk -l -b -o NAME,SIZE | grep ${EMMC_NAME} | sort | uniq | head -n1 | awk '{print $2}')\necho \"${EMMC_NAME} : ${EMMC_SIZE} bytes\"\n\nROOT_NAME=$(lsblk -l -o NAME,MAJ:MIN,MOUNTPOINT | grep -e '/$' | awk '{print $1}')\necho \"ROOTFS: ${ROOT_NAME}\"\n\nBOOT_NAME=$(lsblk -l -o NAME,MAJ:MIN,MOUNTPOINT | grep -e '/boot$' | awk '{print $1}')\necho \"BOOT: ${BOOT_NAME}\"\n\n# box model database\n# The field separator is :\n# \" \" or \"\" or NA or NULL means this field is null\n# The fields list:\n# 1.  id\n# 2.  model name\n# 3.  SOC\n# 4.  FDTFILE\n# 5.  UBOOT_OVERLOAD\n# 6.  MAINLINE_UBOOT\n# 7.  ANDROID_UBOOT\n# 8.  brief description\n#\n\n# allow use external modal database\nif [[ -f \"/etc/model_database.txt\" ]]; then\n    model_database=\"$(cat /etc/model_database.txt)\"\nelse\n    error_msg \"[ /etc/model_database.txt ] file is missing.\"\nfi\n\nfunction display_database() {\n    while read -r line; do\n        if [[ \"$line\" =~ ^# ]]; then\n            # Process comment lines, starting with #\n            line=\"${line/#+\\s+/}\"\n            echo \"$line >>>\"\n        else\n            # Process data lines, starting with id\n            IFS=':' read -r -a fields <<<\"$line\"\n            printf \"%5s %-48s%-10s%-s\\n\" \"${fields[0]}\" \"${fields[1]}\" \"${fields[2]}\" \"${fields[7]}\"\n        fi\n    done < <(echo \"${model_database}\")\n}\n\nfunction search_model() {\n    local id=\"${1}\"\n    local ret_count=\"$(echo \"${model_database}\" | awk -F ':' \"\\$1~/^$id\\$/ {print \\$0}\" | wc -l)\"\n    if [[ \"${ret_count}\" -eq \"1\" ]]; then\n        echo \"${model_database}\" | awk -F ':' \"\\$1~/^$id\\$/ {print \\$0}\" | sed -e 's/NA//g' -e 's/NULL//g' -e 's/[ ][ ]*//g'\n    fi\n}\n\necho \"Please select s9xxx box model:\"\necho \"----------------------------------------------------------------------------------------------------\"\ndisplay_database\necho \"----------------------------------------------------------------------------------------------------\"\n\n# For [luci-app-amlogic] input parameter: SOC & DTB\n# When there is no input parameter, select manually\nif [[ -n \"${SPECIFY_ID}\" ]]; then\n    boxtype=\"${SPECIFY_ID}\"\nelse\n    echo -n \"Please choose: \"\n    read boxtype\nfi\n\nif [[ \"${boxtype}\" -eq \"99\" ]]; then\n    FDTFILE=\"${SPECIFY_DTB}\"\n    AMLOGIC_SOC=\"${SPECIFY_SOC}\"\n    UBOOT_OVERLOAD=\"${SPECIFY_UBOOT}\"\n    MAINLINE_UBOOT=\"\"\n    ANDROID_UBOOT=\"\"\nelif [[ \"${boxtype}\" -eq \"0\" ]]; then\n    read -p \"Please Input SoC Name(such as s9xxx): \" AMLOGIC_SOC\n    AMLOGIC_SOC=\"${AMLOGIC_SOC}\"\n\n    read -p \"Please Input DTB Name(such as meson-xxx.dtb): \" FDTFILE\n    FDTFILE=\"${FDTFILE}\"\n\n    read -p \"Please Input UBOOT_OVERLOAD Name(such as u-boot-xxx.bin): \" UBOOT_OVERLOAD\n    UBOOT_OVERLOAD=\"${UBOOT_OVERLOAD}\"\n\n    read -p \"Please Input MAINLINE_UBOOT Name(such as /lib/u-boot/xxx-u-boot.bin.sd.bin): \" MAINLINE_UBOOT\n    MAINLINE_UBOOT=\"${MAINLINE_UBOOT}\"\n\n    read -p \"Please Input ANDROID_UBOOT Name(such as /lib/u-boot/xxx-bootloader.img): \" ANDROID_UBOOT\n    ANDROID_UBOOT=\"${ANDROID_UBOOT}\"\nelse\n    ret=\"$(search_model ${boxtype})\"\n    if [[ -z \"${ret}\" ]]; then\n        error_msg \"Input error, exit!\"\n    fi\n    # 3.  soc\n    # 4.  FDTFILE\n    # 5.  UBOOT_OVERLOAD\n    # 6.  MAINLINE_UBOOT\n    # 7.  ANDROID_UBOOT\n    AMLOGIC_SOC=\"$(echo \"${ret}\" | awk -F ':' '{print $3}')\"\n    FDTFILE=\"$(echo \"${ret}\" | awk -F ':' '{print $4}')\"\n    UBOOT_OVERLOAD=\"$(echo \"${ret}\" | awk -F ':' '{print $5}')\"\n    MAINLINE_UBOOT=\"$(echo \"${ret}\" | awk -F ':' '{print $6}')\"\n    ANDROID_UBOOT=\"$(echo \"${ret}\" | awk -F ':' '{print $7}')\"\nfi\n\nif [[ -z \"${FDTFILE}\" || ! -f \"/boot/dtb/amlogic/${FDTFILE}\" ]]; then\n    error_msg \"/boot/dtb/amlogic/${FDTFILE} does not exist!\"\nfi\n\necho \"AMLOGIC_SOC Value [ ${AMLOGIC_SOC} ]\"\necho \"FDTFILE Value [ ${FDTFILE} ]\"\necho \"UBOOT_OVERLOAD Value [ ${UBOOT_OVERLOAD} ]\"\necho \"MAINLINE_UBOOT Value [ ${MAINLINE_UBOOT} ]\"\necho \"ANDROID_UBOOT Value [ ${ANDROID_UBOOT} ]\"\n\nsed -i \"s|^SOC=.*|SOC='${AMLOGIC_SOC}'|g\" ${op_release} 2>/dev/null\nsed -i \"s|^FDTFILE=.*|FDTFILE='${FDTFILE}'|g\" ${op_release} 2>/dev/null\nsed -i \"s|^UBOOT_OVERLOAD=.*|UBOOT_OVERLOAD='${UBOOT_OVERLOAD}'|g\" ${op_release} 2>/dev/null\nsed -i \"s|^MAINLINE_UBOOT=.*|MAINLINE_UBOOT='${MAINLINE_UBOOT}'|g\" ${op_release} 2>/dev/null\nsed -i \"s|^ANDROID_UBOOT=.*|ANDROID_UBOOT='${ANDROID_UBOOT}'|g\" ${op_release} 2>/dev/null\n\nK510=\"1\"\n[[ \"$(hexdump -n 15 -x \"/boot/zImage\" 2>/dev/null | head -n 1 | awk '{print $7}')\" == \"0108\" ]] && K510=\"0\"\necho -e \"K510 [ ${K510} ]\"\n\n# backup old bootloader\nif [[ ! -f \"/root/BackupOldBootloader.img\" ]]; then\n    echo \"Backup bootloader -> [ BackupOldBootloader.img ] ... \"\n    dd if=/dev/$EMMC_NAME of=/root/BackupOldBootloader.img bs=1M count=4 conv=fsync\n    echo \"Backup bootloader complete.\"\n    echo\nfi\n\nswapoff -a\n\n# umount all other mount points\nMOUNTS=$(lsblk -l -o MOUNTPOINT)\nfor mnt in $MOUNTS; do\n    if [ \"$mnt\" == \"MOUNTPOINT\" ]; then\n        continue\n    fi\n\n    if [ \"$mnt\" == \"\" ]; then\n        continue\n    fi\n\n    if [ \"$mnt\" == \"/\" ]; then\n        continue\n    fi\n\n    if [ \"$mnt\" == \"/boot\" ]; then\n        continue\n    fi\n\n    if [ \"$mnt\" == \"/opt\" ]; then\n        continue\n    fi\n\n    if [ \"$mnt\" == \"[SWAP]\" ]; then\n        echo \"swapoff -a\"\n        swapoff -a\n        continue\n    fi\n\n    if echo $mnt | grep $EMMC_NAME; then\n        echo \"umount -f $mnt\"\n        umount -f $mnt\n        if [ $? -ne 0 ]; then\n            error_msg \"$mnt Cannot be uninstalled, the installation process is aborted.\"\n        fi\n    fi\ndone\n\n# Delete old partition if exists\np=$(lsblk -l | grep -e \"${EMMC_NAME}p\" | wc -l)\necho \"A total of [ $p ] old partitions on EMMC will be deleted\"\n>/tmp/fdisk.script\nwhile [ $p -ge 1 ]; do\n    echo \"d\" >>/tmp/fdisk.script\n    if [ $p -gt 1 ]; then\n        echo \"$p\" >>/tmp/fdisk.script\n    fi\n    p=$((p - 1))\ndone\n\n# you can change ROOT size(MB) >= 320\nROOT1=\"1280\"\nROOT2=\"1280\"\nif [[ \"${AMLOGIC_SOC}\" == \"s912\" ]] && [[ \"${boxtype}\" == \"213\" || \"${boxtype}\" == \"2e\" ]]; then\n    BOOT=\"512\"\n    BLANK1=\"700\"\n    BLANK2=\"220\"\n    BLANK3=\"0\"\n    BLANK4=\"0\"\nelif [[ \"${AMLOGIC_SOC}\" == \"s912\" || \"${AMLOGIC_SOC}\" == \"s905d\" ]]; then\n    BOOT=\"512\"\n    BLANK1=\"68\"\n    BLANK2=\"220\"\n    BLANK3=\"0\"\n    BLANK4=\"0\"\nelif [[ \"${AMLOGIC_SOC}\" == \"s905x\" ]]; then\n    BOOT=\"160\"\n    BLANK1=\"700\"\n    BLANK2=\"0\"\n    BLANK3=\"0\"\n    BLANK4=\"0\"\nelif [[ \"${FDTFILE}\" == \"meson-sm1-skyworth-lb2004-a4091.dtb\" ]]; then\n    BOOT=\"512\"\n    BLANK1=\"108\"\n    BLANK2=\"562\"\n    BLANK3=\"0\"\n    BLANK4=\"0\"\nelif [[ \"${AMLOGIC_SOC}\" == \"s905l3a\" ]] && [[ \"${boxtype}\" == \"304\" || \"${boxtype}\" == \"34\" ]]; then\n    # e900v22c/d(s905l3a)\n    BOOT=\"256\"\n    BLANK1=\"570\"\n    BLANK2=\"0\"\n    BLANK3=\"0\"\n    BLANK4=\"0\"\nelif [[ \"${AMLOGIC_SOC}\" == \"s905l3a\" ]] && [[ \"${boxtype}\" == \"305\" || \"${boxtype}\" == \"33\" ]]; then\n    # CM311-1a-YST(s905l3a)\n    BOOT=\"512\"\n    BLANK1=\"108\"\n    BLANK2=\"778\"\n    BLANK3=\"0\"\n    BLANK4=\"0\"\nelif [[ \"${AMLOGIC_SOC}\" == \"s905l3b\" ]]; then\n    # M302A/M304A(s905l3b)\n    BOOT=\"512\"\n    BLANK1=\"128\"\n    BLANK2=\"720\"\n    BLANK3=\"0\"\n    BLANK4=\"0\"\nelif [[ \"${AMLOGIC_SOC}\" == \"s905x3\" ]] && [[ \"${boxtype}\" == \"525\" || \"${boxtype}\" == \"5n\" ]]; then\n    # Whale(s905x3)\n    BOOT=\"512\"\n    BLANK1=\"108\"\n    BLANK2=\"650\"\n    BLANK3=\"0\"\n    BLANK4=\"0\"\nelif [[ \"${boxtype}\" =~ ^(409|410|49|4a)$ ]]; then\n    # WXY-OES(A311D):409/49, WXY-OES-PLUS(S922X):410/4a\n    BOOT=\"512\"\n    BLANK1=\"700\"\n    BLANK2=\"0\"\n    BLANK3=\"0\"\n    BLANK4=\"0\"\nelse\n    BOOT=\"160\"\n    BLANK1=\"68\"\n    BLANK2=\"0\"\n    BLANK3=\"162\"\n    BLANK4=\"0\"\nfi\n\nDST_TOTAL_MB=$((EMMC_SIZE / 1024 / 1024))\n\nstart1=$((BLANK1 * 2048))\nend1=$((start1 + (BOOT * 2048) - 1))\n\nstart2=$(((BLANK2 * 2048) + end1 + 1))\nend2=$((start2 + (ROOT1 * 2048) - 1))\n\nstart3=$(((BLANK3 * 2048) + end2 + 1))\nend3=$((start3 + (ROOT2 * 2048) - 1))\n\nstart4=$(((BLANK4 * 2048) + end3 + 1))\nend4=$((DST_TOTAL_MB * 2048 - 1))\n\ncat >>/tmp/fdisk.script <<EOF\nn\np\n1\n$start1\n$end1\nn\np\n2\n$start2\n$end2\nn\np\n3\n$start3\n$end3\nn\np\n$start4\n$end4\nt\n1\nc\nt\n2\n83\nt\n3\n83\nt\n4\n83\nw\nEOF\n\nfdisk /dev/${EMMC_NAME} </tmp/fdisk.script 2>/dev/null\nif [ $? -ne 0 ]; then\n    echo \"The fdisk partition fails, Please try again.\"\n    dd if=/root/BackupOldBootloader.img of=/dev/${EMMC_NAME} conv=fsync && sync\n    dd if=/dev/zero of=/dev/${EMMC_NAME} bs=512 count=1 && sync\n    exit 1\nfi\necho \"Partition complete.\"\n\n# write some zero data to part begin\nseek=$((start1 / 2048))\ndd if=/dev/zero of=/dev/${EMMC_NAME} bs=1M count=1 seek=$seek conv=fsync\n\nseek=$((start2 / 2048))\ndd if=/dev/zero of=/dev/${EMMC_NAME} bs=1M count=1 seek=$seek conv=fsync\n\nseek=$((start3 / 2048))\ndd if=/dev/zero of=/dev/${EMMC_NAME} bs=1M count=1 seek=$seek conv=fsync\n\nseek=$((start4 / 2048))\ndd if=/dev/zero of=/dev/${EMMC_NAME} bs=1M count=1 seek=$seek conv=fsync\n\n#Mainline U-BOOT detection\nFLASH_MAINLINE_UBOOT=0\nif [[ -n \"${MAINLINE_UBOOT}\" && -f \"${MAINLINE_UBOOT}\" ]]; then\n    cat <<EOF\n----------------------------------------------------------------------------------\nFound an available mainline bootloader (Mainline u-boot), you can flash into EMMC.\n----------------------------------------------------------------------------------\nEOF\n    while :; do\n        # For [luci-app-amlogic] input parameter: SOC & DTB\n        # When there is no input parameter, select manually\n        if [[ \"${AUTO_MAINLINE_UBOOT}\" == \"yes\" ]]; then\n            if [[ \"${K510}\" -eq \"1\" ]]; then\n                yn=\"y\"\n            else\n                yn=\"n\"\n            fi\n        elif [[ \"${AUTO_MAINLINE_UBOOT}\" == \"no\" ]]; then\n            yn=\"n\"\n        else\n            read -p \"Please choose whether to write the mainline bootloader to EMMC?  y/n \" yn\n        fi\n        case $yn in\n        y | Y)\n            FLASH_MAINLINE_UBOOT=1\n            break\n            ;;\n        n | N)\n            FLASH_MAINLINE_UBOOT=0\n            break\n            ;;\n        esac\n    done\nfi\n\nif [[ \"${FLASH_MAINLINE_UBOOT}\" -eq \"1\" ]]; then\n    echo -e \"Write Mainline bootloader: [ ${MAINLINE_UBOOT} ]\"\n    dd if=${MAINLINE_UBOOT} of=/dev/${EMMC_NAME} bs=1 count=444 conv=fsync\n    dd if=${MAINLINE_UBOOT} of=/dev/${EMMC_NAME} bs=512 skip=1 seek=1 conv=fsync\nelif [[ -n \"${ANDROID_UBOOT}\" && -f \"${ANDROID_UBOOT}\" ]]; then\n    echo -e \"Write Android bootloader: [ ${ANDROID_UBOOT} ]\"\n    dd if=${ANDROID_UBOOT} of=/dev/${EMMC_NAME} bs=1 count=444 conv=fsync\n    dd if=${ANDROID_UBOOT} of=/dev/${EMMC_NAME} bs=512 skip=1 seek=1 conv=fsync\nelse\n    echo \"Did not change the original bootloader.\"\nfi\n\n# fix wifi macaddr\nif [ -x /usr/bin/fix_wifi_macaddr.sh ]; then\n    /usr/bin/fix_wifi_macaddr.sh\nfi\n\n# mkfs\necho \"Start creating file system ... \"\necho \"Create a boot file system ... \"\n\necho \"format boot partiton...\"\nmkfs.fat -n EMMC_BOOT -F 32 /dev/${EMMC_NAME}p1\nmkdir -p /mnt/${EMMC_NAME}p1\nsleep 2\numount -f /mnt/${EMMC_NAME}p1 2>/dev/null\n\necho \"format rootfs1 partiton...\"\nROOTFS1_UUID=$(/usr/bin/uuidgen)\nmkfs.btrfs -f -U ${ROOTFS1_UUID} -L EMMC_ROOTFS1 -m single /dev/${EMMC_NAME}p2\nmkdir -p /mnt/${EMMC_NAME}p2\nsleep 2\numount -f /mnt/${EMMC_NAME}p2 2>/dev/null\n\necho \"format rootfs2 partiton...\"\nROOTFS2_UUID=$(/usr/bin/uuidgen)\nmkfs.btrfs -f -U ${ROOTFS2_UUID} -L EMMC_ROOTFS2 -m single /dev/${EMMC_NAME}p3\nmkdir -p /mnt/${EMMC_NAME}p3\nsleep 2\numount -f /mnt/${EMMC_NAME}p3 2>/dev/null\n\n# mount and copy\necho \"Wait for the boot file system to mount ... \"\ni=1\nmax_try=10\nwhile [ $i -le $max_try ]; do\n    mount -t vfat /dev/${EMMC_NAME}p1 /mnt/${EMMC_NAME}p1 2>/dev/null\n    sleep 2\n    mnt=$(lsblk -l -o MOUNTPOINT | grep /mnt/${EMMC_NAME}p1)\n\n    if [ \"$mnt\" == \"\" ]; then\n        if [ $i -lt $max_try ]; then\n            echo \"Not mounted successfully, try again ...\"\n            i=$((i + 1))\n        else\n            error_msg \"Cannot mount the boot file system, give up!\"\n        fi\n    else\n        echo \"Successfully mounted.\"\n        echo \"copy boot ...\"\n        cd /mnt/${EMMC_NAME}p1\n        rm -rf /boot/'System Volume Information/'\n        (cd /boot && tar cf - .) | tar xf -\n        sync\n\n        echo \"Edit uEnv.txt ...\"\n        [[ -f \"uEnv.txt\" ]] && {\n            sed -i -E \\\n                -e \"s|/dtb/amlogic.*|/dtb/amlogic/${FDTFILE}|\" \\\n                -e \"s|UUID=[^ ]*|UUID=${ROOTFS1_UUID}|\" \\\n                -e \"s|rootflags=compress=zstd:[^ ]*|rootflags=compress=zstd:${ZSTD_LEVEL}|\" \\\n                uEnv.txt\n        }\n\n        # Replace the extlinux/extlinux.conf if it exists\n        [[ -f \"extlinux/extlinux.conf\" ]] && {\n            sed -i -E \\\n                -e \"s|/dtb/amlogic.*|/dtb/amlogic/${FDTFILE}|\" \\\n                -e \"s|UUID=[^ ]*|UUID=${ROOTFS1_UUID}|\" \\\n                -e \"s|rootflags=compress=zstd:[^ ]*|rootflags=compress=zstd:${ZSTD_LEVEL}|\" \\\n                extlinux/extlinux.conf\n        }\n\n        rm -f s905_autoscript* aml_autoscript*\n\n        if [ ${K510} -eq 1 ]; then\n            if [ -f ${UBOOT_OVERLOAD} ]; then\n                cp -f -v ${UBOOT_OVERLOAD} u-boot.emmc\n            elif [ -f \"u-boot.ext\" ]; then\n                cp -f -v u-boot.ext u-boot.emmc\n            fi\n        fi\n\n        mv -f boot-emmc.ini boot.ini\n        mv -f boot-emmc.cmd boot.cmd\n        mv -f boot-emmc.scr boot.scr\n\n        sync\n        echo \"complete.\"\n        cd /\n        umount -f /mnt/${EMMC_NAME}p1\n        break\n    fi\ndone\necho \"complete.\"\n\necho \"Wait for the rootfs file system to mount ... \"\ni=1\nwhile [ $i -le $max_try ]; do\n    mount -t btrfs -o compress=zstd:${ZSTD_LEVEL} /dev/${EMMC_NAME}p2 /mnt/${EMMC_NAME}p2 2>/dev/null\n    sleep 2\n    mnt=$(lsblk -l -o MOUNTPOINT | grep /mnt/${EMMC_NAME}p2)\n    if [ \"$mnt\" == \"\" ]; then\n        if [ $i -lt $max_try ]; then\n            echo \"Not mounted successfully, try again ...\"\n            i=$((i + 1))\n        else\n            error_msg \"Cannot mount rootfs file system, give up!\"\n        fi\n    else\n        echo \"Successfully mounted\"\n        echo \"Create folder ... \"\n        cd /mnt/${EMMC_NAME}p2\n        btrfs subvolume create etc\n        mkdir -p bin boot dev lib opt mnt overlay proc rom root run sbin sys tmp usr www .reserved .snapshots\n        ln -sf lib/ lib64\n        ln -sf tmp/ var\n        sync\n        echo \"complete.\"\n\n        COPY_SRC=\"root etc bin sbin lib opt usr www\"\n        echo \"Copy data ... \"\n        for src in $COPY_SRC; do\n            echo \"copy [ $src ] ...\"\n            (cd / && tar cf - $src) | tar xf -\n            sync\n        done\n        echo \"Copy complete.\"\n        sync\n\n        cat >etc/docker/daemon.json <<EOF\n{\n  \"bip\": \"172.31.0.1/24\",\n  \"data-root\": \"/mnt/${EMMC_NAME}p4/docker/\",\n  \"log-level\": \"warn\",\n  \"log-driver\": \"json-file\",\n  \"log-opts\": {\n     \"max-size\": \"10m\",\n     \"max-file\": \"5\"\n   },\n  \"registry-mirrors\": [\n     \"https://mirror.baidubce.com/\",\n     \"https://hub-mirror.c.163.com\"\n   ]\n}\nEOF\n\n        # change data_root value in /etc/config/dockerd\n        if [[ -f \"/etc/init.d/dockerman\" ]] && [[ -f \"/etc/config/dockerd\" ]]; then\n            sed -i \"s|option data_root.*|option data_root '/mnt/${EMMC_NAME}p4/docker/'|g\" etc/config/dockerd\n        fi\n        rm -rf opt/docker && ln -sf /mnt/${EMMC_NAME}p4/docker/ opt/docker >/dev/null\n        rm -rf usr/bin/AdGuardHome && ln -sf /mnt/${EMMC_NAME}p4/AdGuardHome usr/bin/ >/dev/null\n\n        echo \"Edit configuration file ...\"\n        #cd /mnt/${EMMC_NAME}p2/usr/bin/\n        #rm -f openwrt-install-amlogic openwrt-update-amlogic\n        cd /mnt/${EMMC_NAME}p2/etc/rc.d\n        ln -sf ../init.d/dockerd S99dockerd\n        rm -f S??shortcut-fe\n        if grep \"sfe_flow '1'\" ../config/turboacc >/dev/null; then\n            if find ../../lib/modules -name 'shortcut-fe-cm.ko'; then\n                ln -sf ../init.d/shortcut-fe S99shortcut-fe\n            fi\n        fi\n        cd /mnt/${EMMC_NAME}p2/etc\n        cat >fstab <<EOF\nUUID=${ROOTFS1_UUID} / btrfs compress=zstd:${ZSTD_LEVEL} 0 1\nLABEL=EMMC_BOOT /boot vfat defaults 0 2\n#tmpfs /tmp tmpfs defaults,nosuid 0 0\nEOF\n\n        cd /mnt/${EMMC_NAME}p2/etc/config\n        cat >fstab <<EOF\nconfig  global\n        option anon_swap '0'\n        option anon_mount '1'\n        option auto_swap '0'\n        option auto_mount '1'\n        option delay_root '5'\n        option check_fs '0'\n\nconfig  mount\n        option target '/rom'\n        option uuid '${ROOTFS1_UUID}'\n        option enabled '1'\n        option enabled_fsck '1'\n        option fstype 'btrfs'\n        option options 'compress=zstd:${ZSTD_LEVEL}'\n\nconfig  mount\n        option target '/boot'\n        option label 'EMMC_BOOT'\n        option enabled '1'\n        option enabled_fsck '1'\n        option fstype 'vfat'\n\nEOF\n\n        echo -n \"Create initial etc snapshot -> .snapshots/etc-000\"\n        cd /mnt/${EMMC_NAME}p2 &&\n            btrfs subvolume snapshot -r etc .snapshots/etc-000\n        sync\n\n        cd /\n        umount -f /mnt/${EMMC_NAME}p2\n        break\n    fi\ndone\necho \"complete.\"\n\necho \"Create a shared file system.\"\nmkdir -p /mnt/${EMMC_NAME}p4\n\n# When there is no input parameter, select manually\nif [[ -n \"${SHARED_FSTYPE}\" ]]; then\n    TARGET_SHARED_FSTYPE=${SHARED_FSTYPE}\nelse\n    cat <<EOF\n---------------------------------------------------------------------------------\nPlease select the type of shared file system:\n1. ext4:  [Default options] suitable for general use.\n2. btrfs: Which can extend the service life of ssd/mmc.\n3. f2fs:  Fast reading and writing speed, but the compatibility is slightly poor.\n4. xfs:   Very good file system, alternative to ext4.\n---------------------------------------------------------------------------------\nEOF\n    read -p \"Please Input ID: \" TARGET_SHARED_FSTYPE\nfi\ncase $TARGET_SHARED_FSTYPE in\n2 | btrfs)\n    mkfs.btrfs -f -L EMMC_SHARED -m single /dev/${EMMC_NAME}p4 >/dev/null\n    mount -t btrfs /dev/${EMMC_NAME}p4 /mnt/${EMMC_NAME}p4\n    ;;\n3 | f2fs)\n    mkfs.f2fs -f -l EMMC_SHARED /dev/${EMMC_NAME}p4 >/dev/null\n    mount -t f2fs /dev/${EMMC_NAME}p4 /mnt/${EMMC_NAME}p4\n    ;;\n4 | xfs)\n    mkfs.xfs -f -L EMMC_SHARED /dev/${EMMC_NAME}p4 >/dev/null\n    mount -t xfs /dev/${EMMC_NAME}p4 /mnt/${EMMC_NAME}p4\n    ;;\n*)\n    mkfs.ext4 -F -L EMMC_SHARED /dev/${EMMC_NAME}p4 >/dev/null\n    mount -t ext4 /dev/${EMMC_NAME}p4 /mnt/${EMMC_NAME}p4\n    ;;\nesac\nmkdir -p /mnt/${EMMC_NAME}p4/docker /mnt/${EMMC_NAME}p4/AdGuardHome/data\nsync\n\necho \"Successful installed, please unplug the USB, re-insert the power supply to start the openwrt.\"\nexit 0\n"
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/openwrt-kernel",
    "content": "#!/bin/bash\n#====================================================================================\n#\n# Function: Update the kernel for OpenWrt (Amlogic s9xxx, Allwinner, Rockchip)\n# Copyright (C) 2020-- https://github.com/unifreq/openwrt_packit\n# Copyright (C) 2021-- https://github.com/ophub/luci-app-amlogic\n#\n# Support the kernel: boot-*.tar.gz, dtb-*.tar.gz, modules-*.tar.gz\n# It is recommended to install MAINLINE_UBOOT for kernel versions above 5.10.y\n# openwrt-kernel ${AUTO_MAINLINE_UBOOT}\n# E.g: openwrt-kernel yes\n#      openwrt-kernel no\n#\n#================================== Functions list ==================================\n#\n# error_msg          : Output error message\n# get_textoffset     : Get kernel TEXT_OFFSET\n# init_var           : Initialize all variables\n# check_kernel       : Check kernel files list\n# chech_files_same   : Check file consistency\n# restore_kernel     : Restore current kernel\n# update_kernel      : Update the kernel\n# update_uboot       : Update the uboot\n#\n#============================== Set default parameters ==============================\n#\n# Receive one-key command related parameters\nAUTO_MAINLINE_UBOOT=\"no\"\n# Set the release check file\nrelease_file=\"/etc/flippy-openwrt-release\"\n#\n#====================================================================================\n\n# Encountered a serious error, abort the script execution\nerror_msg() {\n    echo -e \"[Error] ${1}\"\n    exit 1\n}\n\n# Get the partition name of the /boot file system\nget_boot_partition_name() {\n    local paths=\"/boot\"\n    local partition_name\n\n    partition_name=$(df \"${paths}\" | awk 'NR==2 {print $1}' | awk -F '/' '{print $3}')\n\n    echo \"${partition_name}\"\n}\n\n# Get the partition name of the root file system\nget_root_partition_name() {\n    local paths=(\"/\" \"/overlay\" \"/rom\")\n    local partition_name\n\n    for path in \"${paths[@]}\"; do\n        partition_name=$(df \"${path}\" | awk 'NR==2 {print $1}' | awk -F '/' '{print $3}')\n        [[ -n \"${partition_name}\" ]] && break\n    done\n\n    echo \"${partition_name}\"\n}\n\n# Get kernel TEXT_OFFSET, For u-boot.ext and u-boot.emmc\nget_textoffset() {\n    boot_tgz_file=\"${1}\"\n    vmlinuz_name=\"${2}\"\n    K510=\"1\"\n    temp_dir=\"$(mktemp -d)\"\n    (\n        cd ${temp_dir}\n        tar -xf \"${boot_tgz_file}\" \"${vmlinuz_name}\"\n    )\n    # With TEXT_OFFSET patch is [ 0108 ], without TEXT_OFFSET patch is [ 0000 ]\n    [[ \"$(hexdump -n 15 -x \"${temp_dir}/${vmlinuz_name}\" 2>/dev/null | head -n 1 | awk '{print $7}')\" == \"0108\" ]] && K510=\"0\"\n}\n\ninit_var() {\n    # Receive one-key command related parameters\n    [[ \"${1}\" == \"yes\" ]] && AUTO_MAINLINE_UBOOT=\"yes\"\n\n    # Check dependencies\n    [[ -n \"$(busybox which tar)\" ]] || error_msg \"Missing [ tar ] in OpenWrt firmware, unable to update kernel\"\n\n    # Check release file\n    if [[ -s \"${release_file}\" ]]; then\n        source \"${release_file}\"\n        PLATFORM=\"${PLATFORM}\"\n        MODEL_ID=\"${MODEL_ID}\"\n        UBOOT_OVERLOAD=\"${UBOOT_OVERLOAD}\"\n        MAINLINE_UBOOT=\"${MAINLINE_UBOOT}\"\n        ANDROID_UBOOT=\"${ANDROID_UBOOT}\"\n        SOC=\"${SOC}\"\n        LOCK_KERNEL=\"${LOCK_KERNEL}\"\n    else\n        error_msg \"${release_file} file is missing!\"\n    fi\n    [[ -n \"${PLATFORM}\" ]] || error_msg \"Missing ${PLATFORM} value in ${release_file} file.\"\n\n    # Define supported platforms\n    support_platform=(\"allwinner\" \"rockchip\" \"amlogic\" \"qemu-aarch64\")\n    [[ -n \"$(echo \"${support_platform[@]}\" | grep -w \"${PLATFORM}\")\" ]] || error_msg \"[ ${PLATFORM} ] is not supported.\"\n\n    # Check and repair partition mount points\n    [[ -z \"$(get_boot_partition_name)\" || -z \"$(get_root_partition_name)\" ]] && {\n        echo -e \"Partition mount point error, start repairing...\"\n        openwrt-backup -g\n    }\n\n    # Set /boot/vmlinuz-* replication names for different SoCs\n    MYBOOT_VMLINUZ=\"$(ls -l /boot/*Image 2>/dev/null | awk '{print $9}' | head -n 1)\"\n    MYBOOT_VMLINUZ=\"${MYBOOT_VMLINUZ##*/}\"\n    [[ -n \"${MYBOOT_VMLINUZ}\" ]] || error_msg \"Failed to get Image name: [ ${MYBOOT_VMLINUZ} ]\"\n\n    # Find the partition where root is located\n    ROOT_PTNAME=\"$(get_root_partition_name)\"\n\n    # Find the disk where the partition is located, only supports mmcblk?p? sd?? hd?? vd?? and other formats\n    case \"${ROOT_PTNAME}\" in\n    mmcblk?p[1-9])\n        EMMC_NAME=\"$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-2)}')\"\n        PARTITION_NAME=\"p\"\n        ;;\n    [hsv]d[a-z][1-9])\n        EMMC_NAME=\"$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-1)}')\"\n        PARTITION_NAME=\"\"\n        ;;\n    nvme?n?p[1-9])\n        EMMC_NAME=\"$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-2)}')\"\n        PARTITION_NAME=\"p\"\n        ;;\n    *)\n        error_msg \"Unable to recognize the disk type of ${ROOT_PTNAME}!\"\n        ;;\n    esac\n    P4_PATH=\"/mnt/${EMMC_NAME}${PARTITION_NAME}4\"\n    # Move kernel related files to the ${P4_PATH} directory\n    mv -f /tmp/upload/* ${P4_PATH} 2>/dev/null\n\n    # Current device model\n    MYDEVICE_NAME=\"$(cat /proc/device-tree/model | tr -d '\\000')\"\n    [[ \"${PLATFORM}\" == \"qemu-aarch64\" ]] && MYDEVICE_NAME=\"KVM Virtual Machine\"\n    echo -e \"Current device: ${MYDEVICE_NAME} [ ${PLATFORM} ], Use in [ ${EMMC_NAME} ]\"\n    sync && echo \"\"\n}\n\n# Check kernel files list\ncheck_kernel() {\n    cd ${P4_PATH}\n\n    # Determine custom kernel filename\n    kernel_boot=\"$(ls boot-*.tar.gz 2>/dev/null | head -n 1)\"\n    kernel_name=\"${kernel_boot:5:-7}\"\n\n    KERNEL_VERSION=\"$(echo ${kernel_name} | grep -oE '^[1-9].[0-9]{1,3}.[0-9]+')\"\n    echo -e \"Kernel name: ${kernel_name}\"\n\n    # check if kernel is locked\n    if [ -n \"${LOCK_KERNEL}\" ]; then\n        if [ \"${LOCK_KERNEL}\" != \"${kernel_name}\" ]; then\n            if ! echo \"${kernel_name}\" | grep -E '^5.10.\\d+-.*?rk35.*?$' >/dev/null; then\n                error_msg \"The kernel version is locked to [ ${LOCK_KERNEL} ], but your kernel is [ ${kernel_name} ]. \"\n            fi\n        fi\n    fi\n\n    # Check if the file is added with TEXT_OFFSET patch\n    get_textoffset \"${P4_PATH}/${kernel_boot}\" \"vmlinuz-${kernel_name}\"\n    echo -e \"K510 [ ${K510} ]\"\n    if [[ \"${PLATFORM}\" == \"amlogic\" && \"${K510}\" -eq \"1\" ]]; then\n        [[ -n \"${UBOOT_OVERLOAD}\" && -f \"/boot/${UBOOT_OVERLOAD}\" ]] || error_msg \"The UBOOT_OVERLOAD file is missing and cannot be update.\"\n    fi\n\n    # Check the sha256sums file\n    sha256sums_file=\"sha256sums\"\n    sha256sums_check=\"1\"\n    [[ -s \"${sha256sums_file}\" && -n \"$(cat ${sha256sums_file})\" ]] || sha256sums_check=\"0\"\n    [[ -n \"$(busybox which sha256sum)\" ]] || sha256sums_check=\"0\"\n    [[ \"${sha256sums_check}\" -eq \"1\" ]] && echo -e \"Enable sha256sum checking...\"\n\n    # Loop check file\n    i=\"1\"\n    if [[ \"${PLATFORM}\" == \"qemu-aarch64\" ]]; then\n        kernel_list=(\"boot\" \"modules\")\n    else\n        kernel_list=(\"boot\" \"dtb-${PLATFORM}\" \"modules\")\n    fi\n    for kernel_file in ${kernel_list[*]}; do\n        # Set check filename\n        tmp_file=\"${kernel_file}-${kernel_name}.tar.gz\"\n        # Check if file exists\n        [[ -s \"${tmp_file}\" ]] || error_msg \"The [ ${kernel_file} ] file is missing.\"\n        # Check if the file sha256sum is correct\n        if [[ \"${sha256sums_check}\" -eq \"1\" ]]; then\n            tmp_sha256sum=\"$(sha256sum \"${tmp_file}\" | awk '{print $1}')\"\n            tmp_checkcode=\"$(cat ${sha256sums_file} | grep ${tmp_file} | awk '{print $1}')\"\n            [[ \"${tmp_sha256sum}\" == \"${tmp_checkcode}\" ]] || error_msg \"${tmp_file}: sha256sum verification failed.\"\n            echo -e \"(${i}/3) [ ${tmp_file} ] file sha256sum check same.\"\n        fi\n        let i++\n    done\n\n    sync && echo \"\"\n}\n\n# Check the consistency of amlogic device files\nchech_files_same() {\n    i=\"0\"\n    max_try=\"5\"\n    while [[ \"${i}\" -le \"${max_try}\" ]]; do\n        if [[ \"$(sha256sum \"${1}\" | awk '{print $1}')\" == \"$(sha256sum \"${2}\" | awk '{print $1}')\" ]]; then\n            echo \"\" && break\n        else\n            cp -f ${1} ${2}\n            i=\"$((i + 1))\"\n        fi\n    done\n    [[ \"${i}\" -gt \"${max_try}\" ]] && echo \"God, it's different after ${max_try} copies: [ ${1} ]\"\n}\n\n# Restore the kernel when the update fails\nrestore_kernel() {\n    (\n        cd /boot\n        rm -rf \\\n            config-${kernel_name} \\\n            System.map-${kernel_name} \\\n            initrd.img-${kernel_name} \\\n            uInitrd-${kernel_name} \\\n            vmlinuz-${kernel_name} \\\n            initrd.img \\\n            uInitrd \\\n            zImage \\\n            Image \\\n            vmlinuz \\\n            dtb* 2>/dev/null\n        tar -xzf /tmp/boot-backup.tar.gz 2>/dev/null\n    )\n    error_msg \"Kernel update failed and has been reverted.\"\n}\n\n# Update the kernel\nupdate_kernel() {\n    local cur_kernel_name=$(uname -r)\n    local boot_fstype=$(df -T /boot | tail -n1 | awk '{print $2}')\n    echo -e \"Start unpacking the kernel...\"\n\n    # 01. for /boot five files\n    # Backup the current_kernel\n    (\n        cd /boot\n        tar -czf /tmp/boot-backup.tar.gz \\\n            config-${cur_kernel_name} \\\n            System.map-${cur_kernel_name} \\\n            initrd.img-${cur_kernel_name} \\\n            uInitrd-${cur_kernel_name} \\\n            vmlinuz-${cur_kernel_name} \\\n            initrd.img \\\n            uInitrd \\\n            zImage \\\n            Image \\\n            vmlinuz \\\n            dtb* 2>/dev/null\n        rm -rf \\\n            config-${cur_kernel_name} \\\n            System.map-${cur_kernel_name} \\\n            initrd.img-${cur_kernel_name} \\\n            uInitrd-${cur_kernel_name} \\\n            vmlinuz-${cur_kernel_name} \\\n            initrd.img \\\n            uInitrd \\\n            zImage \\\n            Image \\\n            vmlinuz \\\n            dtb* 2>/dev/null\n    )\n    # Extract the new kernel\n    tar -xf ${P4_PATH}/boot-${kernel_name}.tar.gz -C /boot\n\n    # Check if the file exists\n    local valid_files\n    if [[ \"${PLATFORM}\" == \"qemu-aarch64\" ]]; then\n        valid_files=\"vmlinuz-${kernel_name} initrd.img-${kernel_name} config-${kernel_name} System.map-${kernel_name}\"\n        rm -f /boot/uInitrd*\n    else\n        valid_files=\"vmlinuz-${kernel_name} uInitrd-${kernel_name} config-${kernel_name} System.map-${kernel_name}\"\n        # wxy-oect: MODEL_ID numbers r306,r307 and w[0-9]{3}, require special handling of uInitrd\n        [[ \"${MODEL_ID}\" =~ ^(r306|r307|w[0-9]{3})$ ]] || rm -f /boot/initrd.img*\n    fi\n    for f in ${valid_files}; do [[ -f \"/boot/${f}\" ]] || restore_kernel; done\n\n    # Check if the files are the same\n    (\n        cd /boot\n        if [[ \"${PLATFORM}\" == \"qemu-aarch64\" ]]; then\n            ln -sf initrd.img-${kernel_name} initrd.img\n            ln -sf vmlinuz-${kernel_name} ${MYBOOT_VMLINUZ}\n        elif [[ \"$boot_fstype\" == \"vfat\" ]]; then\n            cp -f uInitrd-${kernel_name} uInitrd\n            [[ -z \"$(chech_files_same uInitrd-${kernel_name} uInitrd)\" ]] || restore_kernel\n            cp -f vmlinuz-${kernel_name} ${MYBOOT_VMLINUZ}\n            [[ -z \"$(chech_files_same vmlinuz-${kernel_name} ${MYBOOT_VMLINUZ})\" ]] || restore_kernel\n        else\n            ln -sf uInitrd-${kernel_name} uInitrd\n            ln -sf vmlinuz-${kernel_name} ${MYBOOT_VMLINUZ}\n        fi\n\n        # wxy-oect: MODEL_ID numbers r306 and r307, require special handling of uInitrd\n        [[ \"${MODEL_ID}\" =~ ^(r306|r307)$ ]] && ln -sf initrd.img-${kernel_name} uInitrd\n    )\n\n    echo -e \"(1/3) Unpacking [ boot-${kernel_name}.tar.gz ] done.\"\n\n    if [[ \"${PLATFORM}\" == \"qemu-aarch64\" ]]; then\n        echo -e \"(2/3) skip unpack dtb files.\"\n    else\n        # 02. for /boot/dtb/${PLATFORM}/*\n        if [[ \"${boot_fstype}\" == \"vfat\" ]]; then\n            (cd /boot && mkdir -p dtb/${PLATFORM})\n        else\n            (cd /boot && mkdir -p dtb-${kernel_name}/${PLATFORM} && ln -sf dtb-${kernel_name} dtb)\n        fi\n        tar -xf ${P4_PATH}/dtb-${PLATFORM}-${kernel_name}.tar.gz -C /boot/dtb/${PLATFORM}\n        [[ \"$(ls /boot/dtb/${PLATFORM} -l 2>/dev/null | grep \"^-\" | wc -l)\" -ge \"1\" ]] || error_msg \"/boot/dtb/${PLATFORM} file is missing.\"\n        echo -e \"(2/3) Unpacking [ dtb-${PLATFORM}-${kernel_name}.tar.gz ] done.\"\n    fi\n\n    # 03. for /lib/modules/*\n    rm -rf /lib/modules/*\n    tar -xf ${P4_PATH}/modules-${kernel_name}.tar.gz -C /lib/modules\n    (\n        cd /lib/modules/${kernel_name}\n        rm -f *.ko\n        find ./ -type f -name '*.ko' -exec ln -s {} ./ \\;\n        sync && sleep 3\n        x=$(ls *.ko -l 2>/dev/null | grep \"^l\" | wc -l)\n        [[ \"${x}\" -eq \"0\" ]] && error_msg \"Error *.ko Files not found.\"\n    )\n    echo -e \"(3/3) Unpacking [ modules-${kernel_name}.tar.gz ] done.\"\n\n    # Delete kernel tmpfiles\n    rm -f ${P4_PATH}/*-${kernel_name}.tar.gz\n    rm -f ${P4_PATH}/sha256sums\n\n    sync && echo \"\"\n}\n\n# Update the uboot\nupdate_uboot() {\n    # Only amlogic SoCs needs to be updated\n    if [[ \"${PLATFORM}\" == \"amlogic\" ]]; then\n        # Copy u-boot.ext and u-boot.emmc\n        if [[ \"${K510}\" -eq \"1\" && -n \"${UBOOT_OVERLOAD}\" && -f \"/boot/${UBOOT_OVERLOAD}\" ]]; then\n            [[ ! -f \"/boot/u-boot.ext\" ]] && cp -f \"/boot/${UBOOT_OVERLOAD}\" /boot/u-boot.ext && chmod +x /boot/u-boot.ext\n            [[ ! -f \"/boot/u-boot.emmc\" ]] && cp -f \"/boot/u-boot.ext\" /boot/u-boot.emmc && chmod +x /boot/u-boot.emmc\n            echo -e \"The ${UBOOT_OVERLOAD} file copy is complete.\"\n        elif [[ \"${K510}\" -eq \"0\" ]]; then\n            rm -f \"/boot/u-boot.ext\" \"/boot/u-boot.emmc\"\n        fi\n\n        # Write Mainline bootloader\n        if [[ -f \"${MAINLINE_UBOOT}\" && \"${AUTO_MAINLINE_UBOOT}\" == \"yes\" ]]; then\n            echo -e \"Write Mainline bootloader: [ ${MAINLINE_UBOOT} ] to [ /dev/${EMMC_NAME} ]\"\n            dd if=${MAINLINE_UBOOT} of=/dev/${EMMC_NAME} bs=1 count=442 conv=fsync\n            dd if=${MAINLINE_UBOOT} of=/dev/${EMMC_NAME} bs=512 skip=1 seek=1 conv=fsync\n            echo -e \"The MAINLINE_UBOOT file write is complete.\"\n        fi\n    fi\n\n    # Update release file\n    sed -i \"s|^KERNEL_VERSION=.*|KERNEL_VERSION='${kernel_name}'|g\" ${release_file} 2>/dev/null\n    # Update banner file\n    sed -i \"s| Kernel.*| Kernel: ${kernel_name}|g\" /etc/banner 2>/dev/null\n\n    sync && echo \"\"\n}\n\n# Rescue the kernel\nsos_kernel() {\n    echo -e \"Start rescuing kernel...\"\n\n    # Supports specifying disks, such as: [ openwrt-kernel -s mmcblk1 ]\n    box_disk=\"${2}\"\n\n    if [[ -n \"${box_disk}\" ]]; then\n        # Format the disk names\n        box_disk=\"${box_disk//\\/dev\\//}\"\n\n        # Check if the disk exists\n        [[ -b \"/dev/${box_disk}\" ]] || error_msg \"The specified disk [ ${box_disk} ] does not exist.\"\n\n        # Check if the disk is the same as the current system disk\n        [[ \"${box_disk}\" == \"${EMMC_NAME}\" ]] && error_msg \"The specified disk [ ${box_disk} ] is the same as the current system disk [ ${EMMC_NAME} ].\"\n\n        echo -e \"The device name of the specified disk: [ ${box_disk} ]\"\n    else\n        # Find emmc disk, first find emmc containing boot0 partition\n        box_disk=\"$(lsblk -l -o NAME | grep -oE '(mmcblk[0-9]?|nvme[0-9]?n[0-9]?|[hsv]d[a-z])' | grep -vE ^${EMMC_NAME} | sort -u | head -n 1)\"\n\n        # Check if disk exists\n        [[ -z \"${box_disk}\" ]] && error_msg \"Unable to locate the storage requiring rescue.\"\n\n        echo -e \"The device name of the target disk: [ ${box_disk} ]\"\n    fi\n\n    rescue_disk=\"/dev/${box_disk}\"\n    echo -e \"The current OpenWrt is running on [ /dev/${EMMC_NAME} ], and the target disk for restoration is [ ${rescue_disk} ].\"\n\n    # Create a temporary mount directory\n    umount ${P4_PATH}/bootfs 2>/dev/null\n    umount ${P4_PATH}/rootfs 2>/dev/null\n    rm -rf ${P4_PATH}/bootfs ${P4_PATH}/rootfs 2>/dev/null\n    mkdir -p ${P4_PATH}/{bootfs/,rootfs/} && sync\n    [[ \"${?}\" -ne \"0\" ]] && error_msg \"Failed to create temporary mount directory [ ${P4_PATH} ]\"\n\n    # Mount target bootfs partition\n    [[ \"${box_disk}\" =~ ^([hsv]d[a-z]) ]] && rescue_disk_partition_name=\"\" || rescue_disk_partition_name=\"p\"\n    mount ${rescue_disk}${rescue_disk_partition_name}1 ${P4_PATH}/bootfs\n    [[ \"${?}\" -ne \"0\" ]] && error_msg \"mount ${rescue_disk}${PARTITION_NAME}1 failed!\"\n    echo -e \"The [ ${rescue_disk}${rescue_disk_partition_name}1 ] partition is mounted on [ ${P4_PATH}/bootfs ].\"\n\n    # Search uuid file\n    if [[ -f \"${P4_PATH}/bootfs/uEnv.txt\" ]]; then\n        search_file=\"uEnv.txt\"\n    elif [[ -f \"${P4_PATH}/bootfs/armbianEnv.txt\" ]]; then\n        search_file=\"armbianEnv.txt\"\n    elif [[ -f \"${P4_PATH}/bootfs/extlinux/extlinux.conf\" ]]; then\n        search_file=\"extlinux/extlinux.conf\"\n    else\n        error_msg \"The [ uEnv.txt, armbianEnv.txt, extlinux/extlinux.conf ] file does not exist, stop rescuing.\"\n    fi\n\n    # Get the target partition uuid and rootfs\n    target_parttion_uuid=\"$(grep '=UUID=' ${P4_PATH}/bootfs/${search_file} | sed -n 's/.*=UUID=\\([a-f0-9-]*\\).*/\\1/p')\"\n    [[ -z \"${target_parttion_uuid}\" ]] && error_msg \"The [ ${search_file} ] file does not contain the UUID value.\"\n    target_rootfs=\"$(blkid | grep ${target_parttion_uuid} | awk -F':' '{print $1;}')\"\n    [[ -z \"${target_rootfs}\" ]] && error_msg \"The [ ${target_parttion_uuid} ] UUID does not exist in the system.\"\n\n    # Mount target rootfs partition\n    mount ${target_rootfs} ${P4_PATH}/rootfs\n    [[ \"${?}\" -ne \"0\" ]] && error_msg \"mount ${rescue_disk}${PARTITION_NAME}2 failed!\"\n    echo -e \"The [ ${target_rootfs} ] partition is mounted on [ ${P4_PATH}/rootfs ].\"\n\n    # Identify the current kernel files\n    kernel_signature=\"$(uname -r)\"\n\n    # 01. For /boot files\n    [[ -d \"${P4_PATH}/bootfs\" ]] && {\n        cd ${P4_PATH}/bootfs\n        rm -rf config-* initrd.img-* System.map-* vmlinuz-* uInitrd* *Image dtb* u-boot.ext u-boot.emmc\n        [[ -f \"/boot/u-boot.ext\" ]] && {\n            cp -f /boot/u-boot.ext .\n            cp -f /boot/u-boot.ext u-boot.emmc\n            chmod +x u-boot.ext u-boot.emmc\n        }\n        cp -rf /boot/{*-${kernel_signature},uInitrd,*Image,dtb} .\n        [[ \"${?}\" -ne \"0\" ]] && error_msg \"(1/2) [ boot ] kernel files rescue failed.\"\n        echo -e \"(1/2) [ boot ] kernel files rescue succeeded.\"\n\n        [[ -f \"/boot/emmc_autoscript.cmd\" ]] && cp -f /boot/emmc_autoscript.cmd .\n        [[ -f \"/boot/emmc_autoscript\" ]] && cp -f /boot/emmc_autoscript .\n        [[ -f \"/boot/s905_autoscript.cmd\" ]] && cp -f /boot/s905_autoscript.cmd .\n        [[ -f \"/boot/s905_autoscript\" ]] && cp -f /boot/s905_autoscript .\n    } || error_msg \"(1/2) The [ ${P4_PATH}/bootfs ] folder does not exist, stop rescuing.\"\n\n    # 02. For /lib/modules/${kernel_signature}\n    [[ -d \"${P4_PATH}/rootfs/lib/modules\" ]] && {\n        cd ${P4_PATH}/rootfs/lib/modules\n        rm -rf *\n        cp -rf /lib/modules/${kernel_signature} .\n        [[ \"${?}\" -ne \"0\" ]] && error_msg \"(2/2) [ modules ] kernel files rescue failed.\"\n        echo -e \"(2/2) [ modules ] kernel files rescue succeeded.\"\n    } || error_msg \"(2/2) The [ ${P4_PATH}/rootfs/lib/modules ] folder does not exist, stop rescuing.\"\n\n    # Unmount the emmc partition\n    cd ${P4_PATH}\n    umount -f ${P4_PATH}/bootfs\n    [[ \"${?}\" -ne \"0\" ]] && error_msg \"Failed to umount [ ${P4_PATH}/bootfs ]\"\n    umount -f ${P4_PATH}/rootfs\n    [[ \"${?}\" -ne \"0\" ]] && error_msg \"Failed to umount [ ${P4_PATH}/rootfs ]\"\n    # Remove the temporary mount directory\n    rm -rf ${P4_PATH}/bootfs ${P4_PATH}/rootfs\n\n    sync && echo \"\"\n}\n\necho -e \"Welcome to the OpenWrt Kernel Management Tool.\"\n# Operation environment check\n[[ -x \"/usr/sbin/openwrt-kernel\" ]] || error_msg \"Please grant execution permission: chmod +x /usr/sbin/openwrt-kernel\"\n\n# Execute relevant functions based on the options\nif [[ \"${@}\" =~ ^-s(\\s)* ]]; then\n    # Initialize all variables\n    init_var \"${@}\"\n    # Start rescuing the kernel\n    sos_kernel \"${@}\"\n\n    # Kernel restore successful\n    sync && sleep 3\n    echo -e \"Kernel rescue successful, please remove the disk and restart the OpenWrt system.\"\n    exit 0\nelse\n    # Initialize all variables\n    init_var \"${@}\"\n    # Check kernel files list\n    check_kernel\n    # Update the kernel\n    update_kernel\n    # Update the uboot\n    update_uboot\n\n    # Kernel update successful\n    sync && sleep 3\n    echo \"Successfully updated, automatic restarting...\"\n    reboot\n    exit 0\nfi\n"
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/openwrt-update-allwinner",
    "content": "#!/bin/bash\n#======================================================================================\n# Function: Update openwrt to emmc for Allwinner STB\n# Copyright (C) 2020-- https://github.com/unifreq/openwrt_packit\n# Copyright (C) 2021-- https://github.com/ophub/luci-app-amlogic\n#======================================================================================\n#\n# The script supports directly setting parameters for update, skipping interactive selection\n# openwrt-update-allwinner ${OPENWRT_FILE} ${AUTO_MAINLINE_UBOOT} ${RESTORE_CONFIG}\n# E.g: openwrt-update-allwinner openwrt_s905d.img.gz yes restore\n# E.g: openwrt-update-allwinner openwrt_s905d.img.gz no no-restore\n\n# You can also execute the script directly, and interactively select related functions\n# E.g: openwrt-update-allwinner\n#\n#======================================================================================\n\n# Encountered a serious error, abort the script execution\nerror_msg() {\n    echo -e \"[ERROR] ${1}\"\n    exit 1\n}\n\n# Get the partition name of the /boot file system\nget_boot_partition_name() {\n    local paths=\"/boot\"\n    local partition_name\n\n    partition_name=$(df \"${paths}\" | awk 'NR==2 {print $1}' | awk -F '/' '{print $3}')\n\n    echo \"${partition_name}\"\n}\n\n# Get the partition name of the root file system\nget_root_partition_name() {\n    local paths=(\"/\" \"/overlay\" \"/rom\")\n    local partition_name\n\n    for path in \"${paths[@]}\"; do\n        partition_name=$(df \"${path}\" | awk 'NR==2 {print $1}' | awk -F '/' '{print $3}')\n        [[ -n \"${partition_name}\" ]] && break\n    done\n\n    echo \"${partition_name}\"\n}\n\n# Get the partition message of the root file system\nget_root_partition_msg() {\n    local paths=(\"/\" \"/overlay\" \"/rom\")\n    local partition_name\n\n    for path in \"${paths[@]}\"; do\n        partition_msg=$(lsblk -l -o NAME,PATH,TYPE,UUID,MOUNTPOINT | awk '$3~/^part$/ && $5 ~ \"^\" \"'\"${path}\"'\" \"$\" {print $0}')\n        [[ -n \"${partition_msg}\" ]] && break\n    done\n\n    [[ -z \"${partition_msg}\" ]] && error_msg \"Cannot find the root partition message!\"\n    echo \"${partition_msg}\"\n}\n\n# Receive one-key command related parameters\nIMG_NAME=${1}\nAUTO_MAINLINE_UBOOT=${2}\nBACKUP_RESTORE_CONFIG=${3}\n\n# Current FDT file\nif [[ -f \"/boot/uEnv.txt\" ]]; then\n    source /boot/uEnv.txt 2>/dev/null\n    MYDTB_FDTFILE=$(basename $FDT)\nelif [[ -f \"/boot/armbianEnv.txt\" ]]; then\n    source /boot/armbianEnv.txt 2>/dev/null\n    MYDTB_FDTFILE=\"$(basename $fdtfile)\"\nelif [[ -f \"/etc/flippy-openwrt-release\" ]]; then\n    source /etc/flippy-openwrt-release 2>/dev/null\n    MYDTB_FDTFILE=\"${FDTFILE}\"\nfi\n\n[[ -z \"${MYDTB_FDTFILE}\" ]] && error_msg \"Invalid FDTFILE: [ ${MYDTB_FDTFILE} ]\"\n\n# Current device model\nMYDEVICE_NAME=$(cat /proc/device-tree/model | tr -d '\\000')\nif [[ -z \"${MYDEVICE_NAME}\" ]]; then\n    error_msg \"The device name is empty and cannot be recognized.\"\nelif [[ \"$(echo ${MYDEVICE_NAME} | grep \"V-Plus Cloud\")\" == \"\" ]]; then\n    error_msg \"[ ${MYDEVICE_NAME} ] is not [ V-Plus Cloud ] device, please select the correct script.\"\nelse\n    echo -e \"Current device: ${MYDEVICE_NAME} [ vplus ]\"\n    sleep 3\nfi\n\n# Check and repair partition mount points\n[[ -z \"$(get_boot_partition_name)\" || -z \"$(get_root_partition_name)\" ]] && {\n    echo -e \"Partition mount point error, start repairing...\"\n    openwrt-backup -g\n}\n\n# Find the partition where root is located\nROOT_PTNAME=\"$(get_root_partition_name)\"\n\n# Find the disk where the partition is located, only supports mmcblk?p? sd?? hd?? vd?? and other formats\ncase ${ROOT_PTNAME} in\nmmcblk?p[1-4])\n    EMMC_NAME=$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-2)}')\n    PARTITION_NAME=\"p\"\n    LB_PRE=\"EMMC_\"\n    ;;\n[hsv]d[a-z][1-4])\n    EMMC_NAME=$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-1)}')\n    PARTITION_NAME=\"\"\n    LB_PRE=\"\"\n    ;;\n*)\n    error_msg \"Unable to recognize the disk type of ${ROOT_PTNAME}!\"\n    ;;\nesac\n\ncd /mnt/${EMMC_NAME}${PARTITION_NAME}4/\nmv -f /tmp/upload/* . 2>/dev/null && sync\n\nif [[ \"${IMG_NAME}\" == *.img ]]; then\n    echo -e \"Update using [ ${IMG_NAME} ] file. Please wait a moment ...\"\nelif [ $(ls *.img -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    IMG_NAME=$(ls *.img | head -n 1)\n    echo -e \"Update using [ ${IMG_NAME} ] ] file. Please wait a moment ...\"\nelif [ $(ls *.img.xz -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    xz_file=$(ls *.img.xz | head -n 1)\n    echo -e \"Update using [ ${xz_file} ] file. Please wait a moment ...\"\n    xz -d ${xz_file} 2>/dev/null\n    IMG_NAME=$(ls *.img | head -n 1)\nelif [ $(ls *.img.gz -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    gz_file=$(ls *.img.gz | head -n 1)\n    echo -e \"Update using [ ${gz_file} ] file. Please wait a moment ...\"\n    gzip -df ${gz_file} 2>/dev/null\n    IMG_NAME=$(ls *.img | head -n 1)\nelif [ $(ls *.7z -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    gz_file=$(ls *.7z | head -n 1)\n    echo -e \"Update using [ ${gz_file} ] file. Please wait a moment ...\"\n    bsdtar -xmf ${gz_file} 2>/dev/null\n    [ $? -eq 0 ] || 7z x ${gz_file} -aoa -y 2>/dev/null\n    IMG_NAME=$(ls *.img | head -n 1)\nelif [ $(ls *.zip -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    zip_file=$(ls *.zip | head -n 1)\n    echo -e \"Update using [ ${zip_file} ] file. Please wait a moment ...\"\n    unzip -o ${zip_file} 2>/dev/null\n    IMG_NAME=$(ls *.img | head -n 1)\nelse\n    echo -e \"Please upload or specify the update openwrt firmware file.\"\n    echo -e \"Upload method: system menu → Amlogic Service → Manually Upload Update\"\n    echo -e \"Specify method: Place the openwrt firmware file in [ /mnt/${EMMC_NAME}${PARTITION_NAME}4/ ]\"\n    echo -e \"The supported file suffixes are: *.img, *.img.xz, *.img.gz, *.7z, *.zip\"\n    echo -e \"After upload the openwrt firmware file, run again.\"\n    exit 1\nfi\nsync\n\n# check file\nif [ ! -f \"${IMG_NAME}\" ]; then\n    error_msg \"No update file found.\"\nelse\n    echo \"Start update from [ ${IMG_NAME} ]\"\nfi\n\n# find boot partition\nBOOT_PART_MSG=$(lsblk -l -o NAME,PATH,TYPE,UUID,MOUNTPOINT | awk '$3~/^part$/ && $5 ~ /^\\/boot$/ {print $0}')\nif [ \"${BOOT_PART_MSG}\" == \"\" ]; then\n    error_msg \"The boot partition is not exists or not mounted, so it cannot be upgraded with this script!\"\nfi\n\nBR_FLAG=1\necho -ne \"Whether to backup and restore the current config files? y/n [y]\\b\\b\"\nif [[ ${BACKUP_RESTORE_CONFIG} == \"restore\" ]]; then\n    yn=\"y\"\nelif [[ ${BACKUP_RESTORE_CONFIG} == \"no-restore\" ]]; then\n    yn=\"n\"\nelse\n    read yn\nfi\ncase $yn in\nn* | N*)\n    BR_FLAG=0\n    ;;\nesac\n\nBOOT_NAME=$(echo ${BOOT_PART_MSG} | awk '{print $1}')\nBOOT_PATH=$(echo ${BOOT_PART_MSG} | awk '{print $2}')\nBOOT_UUID=$(echo ${BOOT_PART_MSG} | awk '{print $4}')\n\n# find root partition\nROOT_PART_MSG=\"$(get_root_partition_msg)\"\nROOT_NAME=$(echo ${ROOT_PART_MSG} | awk '{print $1}')\nROOT_PATH=$(echo ${ROOT_PART_MSG} | awk '{print $2}')\nROOT_UUID=$(echo ${ROOT_PART_MSG} | awk '{print $4}')\ncase ${ROOT_NAME} in\n${EMMC_NAME}${PARTITION_NAME}2)\n    NEW_ROOT_NAME=\"${EMMC_NAME}${PARTITION_NAME}3\"\n    NEW_ROOT_LABEL=\"${LB_PRE}ROOTFS2\"\n    ;;\n${EMMC_NAME}${PARTITION_NAME}3)\n    NEW_ROOT_NAME=\"${EMMC_NAME}${PARTITION_NAME}2\"\n    NEW_ROOT_LABEL=\"${LB_PRE}ROOTFS1\"\n    ;;\n*)\n    error_msg \"The root partition location is invalid, so it cannot be upgraded with this script!\"\n    ;;\nesac\n\n# find new root partition\nNEW_ROOT_PART_MSG=$(lsblk -l -o NAME,PATH,TYPE,UUID,MOUNTPOINT | grep \"${NEW_ROOT_NAME}\" | awk '$3 ~ /^part$/ && $5 !~ /^\\/$/ && $5 !~ /^\\/boot$/ {print $0}')\nif [ \"${NEW_ROOT_PART_MSG}\" == \"\" ]; then\n    error_msg \"The new root partition is not exists, so it cannot be upgraded with this script!\"\nfi\nNEW_ROOT_NAME=$(echo $NEW_ROOT_PART_MSG | awk '{print $1}')\nNEW_ROOT_PATH=$(echo $NEW_ROOT_PART_MSG | awk '{print $2}')\nNEW_ROOT_UUID=$(echo $NEW_ROOT_PART_MSG | awk '{print $4}')\nNEW_ROOT_MP=$(echo $NEW_ROOT_PART_MSG | awk '{print $5}')\n\n# losetup\nlosetup -f -P $IMG_NAME\nif [ $? -eq 0 ]; then\n    LOOP_DEV=$(losetup | grep \"$IMG_NAME\" | awk '{print $1}')\n    if [ \"$LOOP_DEV\" == \"\" ]; then\n        error_msg \"loop device not found!\"\n    fi\nelse\n    error_msg \"losetup $IMG_FILE failed!\"\nfi\n\n# fix loopdev issue in kernel 5.19\nfunction fix_loopdev() {\n    local parentdev=${1##*/}\n    if [ ! -d /sys/block/${parentdev} ]; then\n        return\n    fi\n    subdevs=$(lsblk -l -o NAME | grep -E \"^${parentdev}.+\\$\")\n    for subdev in $subdevs; do\n        if [ ! -d /sys/block/${parentdev}/${subdev} ]; then\n            return\n        elif [ -b /dev/${sub_dev} ]; then\n            continue\n        fi\n        source /sys/block/${parentdev}/${subdev}/uevent\n        mknod /dev/${subdev} b ${MAJOR} ${MINOR}\n        unset MAJOR MINOR DEVNAME DEVTYPE DISKSEQ PARTN PARTNAME\n    done\n}\nfix_loopdev ${LOOP_DEV}\n\nWAIT=3\necho -n \"The loopdev is $LOOP_DEV, wait ${WAIT} seconds \"\nwhile [ $WAIT -ge 1 ]; do\n    echo -n \".\"\n    sleep 1\n    WAIT=$((WAIT - 1))\ndone\necho\n\n# umount loop devices (openwrt will auto mount some partition)\nMOUNTED_DEVS=$(lsblk -l -o NAME,PATH,MOUNTPOINT | grep \"$LOOP_DEV\" | awk '$3 !~ /^$/ {print $2}')\nfor dev in $MOUNTED_DEVS; do\n    while :; do\n        echo -n \"umount $dev ... \"\n        umount -f $dev\n        sleep 1\n        mnt=$(lsblk -l -o NAME,PATH,MOUNTPOINT | grep \"$dev\" | awk '$3 !~ /^$/ {print $2}')\n        if [ \"$mnt\" == \"\" ]; then\n            echo \"ok\"\n            break\n        else\n            echo \"try again ...\"\n        fi\n    done\ndone\n\n# mount src part\nWORK_DIR=$PWD\nP1=${WORK_DIR}/boot\nP2=${WORK_DIR}/root\nmkdir -p $P1 $P2\necho -n \"mount ${LOOP_DEV}p1 -> ${P1} ... \"\nmount -t vfat -o ro ${LOOP_DEV}p1 ${P1}\nif [ $? -ne 0 ]; then\n    echo \"mount failed\"\n    losetup -D\n    exit 1\nelse\n    echo \"ok\"\nfi\n\necho -n \"mount ${LOOP_DEV}p2 -> ${P2} ... \"\nZSTD_LEVEL=6\nmount -t btrfs -o ro,compress=zstd:${ZSTD_LEVEL} ${LOOP_DEV}p2 ${P2}\nif [ $? -ne 0 ]; then\n    echo \"mount failed\"\n    umount -f ${P1}\n    losetup -D\n    exit 1\nelse\n    echo \"ok\"\nfi\n\n# Prepare the dockerman config file\nif [ -f ${P2}/etc/init.d/dockerman ] && [ -f ${P2}/etc/config/dockerd ]; then\n\n    flg=0\n    # get current docker data root\n    data_root=$(uci get dockerd.globals.data_root 2>/dev/null)\n    if [ \"$data_root\" == \"\" ]; then\n        flg=1\n        # get current config from /etc/docker/daemon.json\n        if [ -f \"/etc/docker/daemon.json\" ] && [ -x \"/usr/bin/jq\" ]; then\n            data_root=$(jq -r '.\"data-root\"' /etc/docker/daemon.json)\n\n            bip=$(jq -r '.\"bip\"' /etc/docker/daemon.json)\n            [ \"$bip\" == \"null\" ] && bip=\"172.31.0.1/24\"\n\n            log_level=$(jq -r '.\"log-level\"' /etc/docker/daemon.json)\n            [ \"$log_level\" == \"null\" ] && log_level=\"warn\"\n\n            _iptables=$(jq -r '.\"iptables\"' /etc/docker/daemon.json)\n            [ \"$_iptables\" == \"null\" ] && _iptables=\"true\"\n\n            registry_mirrors=$(jq -r '.\"registry-mirrors\"[]' /etc/docker/daemon.json 2>/dev/null)\n        fi\n    fi\n\n    if [ \"$data_root\" == \"\" ]; then\n        data_root=\"/opt/docker/\" # the default data root\n    fi\n\n    if ! uci get dockerd.globals >/dev/null 2>&1; then\n        uci set dockerd.globals='globals'\n        uci commit\n    fi\n\n    # delete alter config , use inner config\n    if uci get dockerd.globals.alt_config_file >/dev/null 2>&1; then\n        uci delete dockerd.globals.alt_config_file\n        uci commit\n    fi\n\n    if [ $flg -eq 1 ]; then\n        uci set dockerd.globals.data_root=$data_root\n        [ \"$bip\" != \"\" ] && uci set dockerd.globals.bip=$bip\n        [ \"$log_level\" != \"\" ] && uci set dockerd.globals.log_level=$log_level\n        [ \"$_iptables\" != \"\" ] && uci set dockerd.globals.iptables=$_iptables\n        if [ \"$registry_mirrors\" != \"\" ]; then\n            for reg in $registry_mirrors; do\n                uci add_list dockerd.globals.registry_mirrors=$reg\n            done\n        fi\n        uci set dockerd.globals.auto_start='1'\n        uci commit\n    fi\nfi\n\n#format NEW_ROOT\necho \"umount ${NEW_ROOT_MP}\"\numount -f \"${NEW_ROOT_MP}\"\nif [ $? -ne 0 ]; then\n    echo \"umount failed, please reboot and try again!\"\n    umount -f ${P1}\n    umount -f ${P2}\n    losetup -D\n    exit 1\nfi\n\necho \"format ${NEW_ROOT_PATH}\"\nNEW_ROOT_UUID=$(uuidgen)\nmkfs.btrfs -f -U ${NEW_ROOT_UUID} -L ${NEW_ROOT_LABEL} ${NEW_ROOT_PATH}\nif [ $? -ne 0 ]; then\n    echo \"format ${NEW_ROOT_PATH} failed!\"\n    umount -f ${P1}\n    umount -f ${P2}\n    losetup -D\n    exit 1\nfi\n\necho \"mount ${NEW_ROOT_PATH} to ${NEW_ROOT_MP}\"\nmount -t btrfs -o compress=zstd:${ZSTD_LEVEL} ${NEW_ROOT_PATH} ${NEW_ROOT_MP}\nif [ $? -ne 0 ]; then\n    echo \"mount ${NEW_ROOT_PATH} to ${NEW_ROOT_MP} failed!\"\n    umount -f ${P1}\n    umount -f ${P2}\n    losetup -D\n    exit 1\nfi\n\n# begin copy rootfs\ncd ${NEW_ROOT_MP}\necho \"Start copy data from ${P2} to ${NEW_ROOT_MP} ...\"\nENTRYS=$(ls)\nfor entry in $ENTRYS; do\n    if [ \"$entry\" == \"lost+found\" ]; then\n        continue\n    fi\n    echo -n \"remove old $entry ... \"\n    rm -rf $entry\n    if [ $? -eq 0 ]; then\n        echo \"ok\"\n    else\n        error_msg \"failed\"\n    fi\ndone\necho\n\necho \"create etc subvolume ...\"\nbtrfs subvolume create etc\necho -n \"make dirs ... \"\nmkdir -p .snapshots .reserved bin boot dev lib opt mnt overlay proc rom root run sbin sys tmp usr www\nln -sf lib/ lib64\nln -sf tmp/ var\necho \"done\"\necho\n\nCOPY_SRC=\"root etc bin sbin lib opt usr www\"\necho \"copy data ... \"\nfor src in $COPY_SRC; do\n    echo -n \"copy $src ... \"\n    (cd ${P2} && tar cf - $src) | tar xf -\n    sync\n    echo \"done\"\ndone\n\nSHFS=\"/mnt/${EMMC_NAME}${PARTITION_NAME}4\"\necho \"Modify config files ... \"\nrm -f \"./etc/rc.local.orig\" \"./etc/first_run.sh\" \"./etc/part_size\"\nrm -f ./etc/bench.log\nif [ -x ./usr/sbin/balethirq.pl ]; then\n    if grep \"balethirq.pl\" \"./etc/rc.local\"; then\n        echo \"balance irq is enabled\"\n    else\n        echo \"enable balance irq\"\n        sed -e \"/exit/i\\/usr/sbin/balethirq.pl\" -i ./etc/rc.local\n    fi\nfi\ncat >./etc/fstab <<EOF\nUUID=${NEW_ROOT_UUID} / btrfs compress=zstd:${ZSTD_LEVEL} 0 1\nLABEL=${LB_PRE}BOOT /boot vfat defaults 0 2\n#tmpfs /tmp tmpfs defaults,nosuid 0 0\nEOF\n\ncat >./etc/config/fstab <<EOF\nconfig global\n        option anon_swap '0'\n        option anon_mount '1'\n        option auto_swap '0'\n        option auto_mount '1'\n        option delay_root '5'\n        option check_fs '0'\n\nconfig mount\n        option target '/rom'\n        option uuid '${NEW_ROOT_UUID}'\n        option enabled '1'\n        option enabled_fsck '1'\n        option fstype 'btrfs'\n        option options 'compress=zstd:${ZSTD_LEVEL}'\n\nconfig mount\n        option target '/boot'\n        option label '${LB_PRE}BOOT'\n        option enabled '1'\n        option enabled_fsck '0'\n        option fstype 'vfat'\n\nEOF\n(\n    cd etc/rc.d\n    rm -f S??shortcut-fe\n    if grep \"sfe_flow '1'\" ../config/turboacc >/dev/null; then\n        if find ../../lib/modules -name 'shortcut-fe-cm.ko'; then\n            ln -sf ../init.d/shortcut-fe S99shortcut-fe\n        fi\n    fi\n)\n\n# move /etc/config/balance_irq to /etc/balance_irq\n[ -f \"./etc/config/balance_irq\" ] && mv ./etc/config/balance_irq ./etc/\nsync\n\necho \"create the first etc snapshot -> .snapshots/etc-000\"\nbtrfs subvolume snapshot -r etc .snapshots/etc-000\n\n[ -d ${SHFS}/docker ] || mkdir -p ${SHFS}/docker\nrm -rf opt/docker && ln -sf ${SHFS}/docker/ opt/docker\n\nif [ -f /mnt/${NEW_ROOT_NAME}/etc/config/AdGuardHome ]; then\n    [ -d ${SHFS}/AdGuardHome/data ] || mkdir -p ${SHFS}/AdGuardHome/data\n    if [ ! -L /usr/bin/AdGuardHome ]; then\n        [ -d /usr/bin/AdGuardHome ] &&\n            cp -a /usr/bin/AdGuardHome/* ${SHFS}/AdGuardHome/\n    fi\n    ln -sf ${SHFS}/AdGuardHome /mnt/${NEW_ROOT_NAME}/usr/bin/AdGuardHome\nfi\n\nBOOTLOADER=\"./lib/u-boot/u-boot-sunxi-with-spl.bin\"\nif [ -f ${BOOTLOADER} ]; then\n    echo \"update u-boot ... \"\n    # erase from 8kb to 4mb\n    dd if=/dev/zero of=/dev/${EMMC_NAME} bs=1024 seek=8 count=4088 conv=fsync\n    # write u-boot\n    dd if=${BOOTLOADER} of=/dev/${EMMC_NAME} bs=1024 seek=8 conv=fsync\n    echo \"done\"\nfi\nsync\necho \"copy done\"\necho\n\nBACKUP_LIST=$(${P2}/usr/sbin/openwrt-backup -p)\nif [ $BR_FLAG -eq 1 ]; then\n    echo -n \"Restore your old config files ... \"\n    (\n        cd /\n        eval tar czf ${NEW_ROOT_MP}/.reserved/openwrt_config.tar.gz \"${BACKUP_LIST}\" 2>/dev/null\n    )\n    tar xzf ${NEW_ROOT_MP}/.reserved/openwrt_config.tar.gz\n    [ -f ./etc/config/dockerman ] && sed -e \"s/option wan_mode 'false'/option wan_mode 'true'/\" -i ./etc/config/dockerman 2>/dev/null\n    [ -f ./etc/config/dockerd ] && sed -e \"s/option wan_mode '0'/option wan_mode '1'/\" -i ./etc/config/dockerd 2>/dev/null\n    [ -f ./etc/config/verysync ] && sed -e 's/config setting/config verysync/' -i ./etc/config/verysync\n\n    # 还原 fstab\n    cp -f .snapshots/etc-000/fstab ./etc/fstab\n    cp -f .snapshots/etc-000/config/fstab ./etc/config/fstab\n    # 还原 luci\n    cp -f .snapshots/etc-000/config/luci ./etc/config/luci\n    # 还原/etc/config/rpcd\n    cp -f .snapshots/etc-000/config/rpcd ./etc/config/rpcd\n\n    sync\n    echo \"done\"\n    echo\nfi\n\nrm -f ./etc/bench.log\ncat >>./etc/crontabs/root <<EOF\n17 3 * * * /etc/coremark.sh\nEOF\n\nsed -e 's/ttyAMA0/ttyS0/' -i ./etc/inittab\nsss=$(date +%s)\nddd=$((sss / 86400))\nsed -e \"s/:0:0:99999:7:::/:${ddd}:0:99999:7:::/\" -i ./etc/shadow\n# 修复amule每次升级后重复添加条目的问题\nsed -e \"/amule:x:/d\" -i ./etc/shadow\n# 修复dropbear每次升级后重复添加sshd条目的问题\nsed -e \"/sshd:x:/d\" -i ./etc/shadow\nif ! grep \"sshd:x:22:sshd\" ./etc/group >/dev/null; then\n    echo \"sshd:x:22:sshd\" >>./etc/group\nfi\nif ! grep \"sshd:x:22:22:sshd:\" ./etc/passwd >/dev/null; then\n    echo \"sshd:x:22:22:sshd:/var/run/sshd:/bin/false\" >>./etc/passwd\nfi\nif ! grep \"sshd:x:\" ./etc/shadow >/dev/null; then\n    echo \"sshd:x:${ddd}:0:99999:7:::\" >>./etc/shadow\nfi\n\nif [ $BR_FLAG -eq 1 ]; then\n    if [ -x ./bin/bash ] && [ -f ./etc/profile.d/30-sysinfo.sh ]; then\n        sed -e 's/\\/bin\\/ash/\\/bin\\/bash/' -i ./etc/passwd\n    fi\n    sync\n    echo \"done\"\n    echo\nfi\nsed -e \"s/option hw_flow '1'/option hw_flow '0'/\" -i ./etc/config/turboacc\n(\n    cd etc/rc.d\n    rm -f S??shortcut-fe\n    if grep \"sfe_flow '1'\" ../config/turboacc >/dev/null; then\n        if find ../../lib/modules -name 'shortcut-fe-cm.ko'; then\n            ln -sf ../init.d/shortcut-fe S99shortcut-fe\n        fi\n    fi\n)\nsync\n\neval tar czf .reserved/openwrt_config.tar.gz \"${BACKUP_LIST}\" 2>/dev/null\n\nrm -f ./etc/part_size ./etc/first_run.sh\nmv ./etc/rc.local ./etc/rc.local.orig\ncat >\"./etc/rc.local\" <<EOF\nif ! ls /etc/rc.d/S??dockerd >/dev/null 2>&1;then\n    /etc/init.d/dockerd enable\n    /etc/init.d/dockerd start\nfi\nif ! ls /etc/rc.d/S??dockerman >/dev/null 2>&1 && [ -f /etc/init.d/dockerman ];then\n    /etc/init.d/dockerman enable\n    /etc/init.d/dockerman start\nfi\nopkg remove --force-removal-of-dependent-packages shairport-sync-openssl\nmv /etc/rc.local.orig /etc/rc.local\nchmod 755 /etc/rc.local\nexec /etc/rc.local\nexit\nEOF\nchmod 755 ./etc/rc.local*\n\n# move /etc/config/balance_irq to /etc/balance_irq\n[ -f \"./etc/config/balance_irq\" ] && mv ./etc/config/balance_irq ./etc/\n\necho \"create the second etc snapshot -> .snapshots/etc-001\"\nbtrfs subvolume snapshot -r etc .snapshots/etc-001\n\n# 2021.04.01添加\n# 强制锁定fstab,防止用户擅自修改挂载点\n# 开启了快照功能之后，不再需要锁定fstab\n#chattr +ia ./etc/config/fstab\n\ncd ${WORK_DIR}\n\necho \"Start copy data from ${P1} to /boot ...\"\ncd /boot\necho -n \"remove old boot files ...\"\nrm -rf *\necho \"done\"\necho -n \"copy new boot files ... \"\n(cd ${P1} && tar cf - .) | tar xf -\nsync\necho \"done\"\necho\n\necho -n \"Update boot args ... \"\ncat >uEnv.txt <<EOF\nLINUX=/zImage\nINITRD=/uInitrd\n\n# Example:\n#   FDT=/dtb/allwinner/sun50i-h6-vplus-cloud.dtb\n#   FDT=/dtb/allwinner/sun50i-h6-vplus-cloud-2ghz.dtb\nFDT=/dtb/allwinner/${MYDTB_FDTFILE}\n\nAPPEND=root=UUID=${NEW_ROOT_UUID} rootfstype=btrfs rootflags=compress=zstd:${ZSTD_LEVEL} console=ttyS0,115200n8 no_console_suspend consoleblank=0 fsck.fix=yes fsck.repair=yes net.ifnames=0 cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1\nEOF\n\n# Compatible with armbianEnv.txt file\n[[ -f \"armbianEnv.txt\" ]] && {\n    echo \"Update armbianEnv.txt settings.\"\n    sed -i \"s|^rootdev=.*|rootdev=UUID=${NEW_ROOT_UUID}|g\" armbianEnv.txt\n    rm -f uEnv.txt\n}\n\n# Replace the UUID for extlinux/extlinux.conf if it exists\n[[ -f \"extlinux/extlinux.conf\" ]] && {\n    sed -i -E \"s|UUID=[^ ]*|UUID=${NEW_ROOT_UUID}|\" extlinux/extlinux.conf 2>/dev/null\n}\n\nsync\necho \"done\"\necho\n\ncd $WORK_DIR\numount -f ${P1} ${P2} 2>/dev/null\nlosetup -D 2>/dev/null\nrmdir ${P1} ${P2} 2>/dev/null\nrm -f ${IMG_NAME} 2>/dev/null\nrm -f sha256sums 2>/dev/null\nsync\n\necho \"Successfully updated, automatic restarting...\"\nsleep 3\nreboot\nexit 0\n"
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/openwrt-update-amlogic",
    "content": "#!/bin/bash\n#======================================================================================\n# Function: Update openwrt to emmc for Amlogic S9xxx STB\n# Copyright (C) 2020-- https://github.com/unifreq/openwrt_packit\n# Copyright (C) 2021-- https://github.com/ophub/luci-app-amlogic\n#======================================================================================\n#\n# The script supports directly setting parameters for update, skipping interactive selection\n# openwrt-update-amlogic ${OPENWRT_FILE} ${AUTO_MAINLINE_UBOOT} ${RESTORE_CONFIG}\n# E.g: openwrt-update-amlogic openwrt_s905d.img.gz yes restore\n# E.g: openwrt-update-amlogic openwrt_s905d.img.gz no no-restore\n\n# You can also execute the script directly, and interactively select related functions\n# E.g: openwrt-update-amlogic\n#\n#======================================================================================\n\n# Encountered a serious error, abort the script execution\nerror_msg() {\n    echo -e \"[ERROR] ${1}\"\n    exit 1\n}\n\n# Get the partition name of the /boot file system\nget_boot_partition_name() {\n    local paths=\"/boot\"\n    local partition_name\n\n    partition_name=$(df \"${paths}\" | awk 'NR==2 {print $1}' | awk -F '/' '{print $3}')\n\n    echo \"${partition_name}\"\n}\n\n# Get the partition name of the root file system\nget_root_partition_name() {\n    local paths=(\"/\" \"/overlay\" \"/rom\")\n    local partition_name\n\n    for path in \"${paths[@]}\"; do\n        partition_name=$(df \"${path}\" | awk 'NR==2 {print $1}' | awk -F '/' '{print $3}')\n        [[ -n \"${partition_name}\" ]] && break\n    done\n\n    echo \"${partition_name}\"\n}\n\n# Get the partition message of the root file system\nget_root_partition_msg() {\n    local paths=(\"/\" \"/overlay\" \"/rom\")\n    local partition_name\n\n    for path in \"${paths[@]}\"; do\n        partition_msg=$(lsblk -l -o NAME,PATH,TYPE,UUID,MOUNTPOINT | awk '$3~/^part$/ && $5 ~ \"^\" \"'\"${path}\"'\" \"$\" {print $0}')\n        [[ -n \"${partition_msg}\" ]] && break\n    done\n\n    [[ -z \"${partition_msg}\" ]] && error_msg \"Cannot find the root partition message!\"\n    echo \"${partition_msg}\"\n}\n\n# Receive one-key command related parameters\nIMG_NAME=\"${1}\"\nAUTO_MAINLINE_UBOOT=\"${2}\"\nBACKUP_RESTORE_CONFIG=\"${3}\"\n\n# Current device model\nMYDEVICE_NAME=$(cat /proc/device-tree/model | tr -d '\\000')\nif [[ -z \"${MYDEVICE_NAME}\" ]]; then\n    error_msg \"The device name is empty and cannot be recognized.\"\nelif [[ ! -f \"/etc/flippy-openwrt-release\" ]]; then\n    error_msg \"The [ /etc/flippy-openwrt-release ] file is missing.\"\nelse\n    echo -e \"Current device: ${MYDEVICE_NAME} [ amlogic ]\"\n    sleep 3\nfi\n\n# Check and repair partition mount points\n[[ -z \"$(get_boot_partition_name)\" || -z \"$(get_root_partition_name)\" ]] && {\n    echo -e \"Partition mount point error, start repairing...\"\n    openwrt-backup -g\n}\n\n# Find the partition where root is located\nROOT_PTNAME=\"$(get_root_partition_name)\"\n\n# Find the disk where the partition is located, only supports mmcblk?p? sd?? hd?? vd?? and other formats\ncase ${ROOT_PTNAME} in\nmmcblk?p[1-4])\n    EMMC_NAME=$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-2)}')\n    if lsblk -l -o NAME | grep \"${EMMC_NAME}boot0\" >/dev/null; then\n        ROOT_DISK_TYPE=\"EMMC\"\n    else\n        ROOT_DISK_TYPE=\"SD\"\n    fi\n    PARTITION_NAME=\"p\"\n    LB_PRE=\"${ROOT_DISK_TYPE}_\"\n    ;;\n[hsv]d[a-z][1-4])\n    EMMC_NAME=$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-1)}')\n    ROOT_DISK_TYPE=\"USB\"\n    PARTITION_NAME=\"\"\n    LB_PRE=\"${ROOT_DISK_TYPE}_\"\n    ;;\n*)\n    error_msg \"Unable to recognize the disk type of ${ROOT_PTNAME}!\"\n    ;;\nesac\n\nDOCKER_ROOT=\"/mnt/${EMMC_NAME}${PARTITION_NAME}4/docker/\"\ncd /mnt/${EMMC_NAME}${PARTITION_NAME}4/\nmv -f /tmp/upload/* . 2>/dev/null && sync\n\nif [[ \"${IMG_NAME}\" == *.img ]]; then\n    echo -e \"Update using [ ${IMG_NAME} ] file. Please wait a moment ...\"\nelif [ $(ls *.img -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    IMG_NAME=$(ls *.img | head -n 1)\n    echo -e \"Update using [ ${IMG_NAME} ] ] file. Please wait a moment ...\"\nelif [ $(ls *.img.xz -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    xz_file=$(ls *.img.xz | head -n 1)\n    echo -e \"Update using [ ${xz_file} ] file. Please wait a moment ...\"\n    xz -d ${xz_file} 2>/dev/null\n    IMG_NAME=$(ls *.img | head -n 1)\nelif [ $(ls *.img.gz -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    gz_file=$(ls *.img.gz | head -n 1)\n    echo -e \"Update using [ ${gz_file} ] file. Please wait a moment ...\"\n    gzip -df ${gz_file} 2>/dev/null\n    IMG_NAME=$(ls *.img | head -n 1)\nelif [ $(ls *.7z -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    gz_file=$(ls *.7z | head -n 1)\n    echo -e \"Update using [ ${gz_file} ] file. Please wait a moment ...\"\n    bsdtar -xmf ${gz_file} 2>/dev/null\n    [ $? -eq 0 ] || 7z x ${gz_file} -aoa -y 2>/dev/null\n    IMG_NAME=$(ls *.img | head -n 1)\nelif [ $(ls *.zip -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    zip_file=$(ls *.zip | head -n 1)\n    echo -e \"Update using [ ${zip_file} ] file. Please wait a moment ...\"\n    unzip -o ${zip_file} 2>/dev/null\n    IMG_NAME=$(ls *.img | head -n 1)\nelse\n    echo -e \"Please upload or specify the update openwrt firmware file.\"\n    echo -e \"Upload method: system menu → Amlogic Service → Manually Upload Update\"\n    echo -e \"Specify method: Place the openwrt firmware file in [ /mnt/${EMMC_NAME}${PARTITION_NAME}4/ ]\"\n    echo -e \"The supported file suffixes are: *.img, *.img.xz, *.img.gz, *.7z, *.zip\"\n    echo -e \"After upload the openwrt firmware file, run again.\"\n    exit 1\nfi\nsync\n\n# check file\nif [ ! -f \"${IMG_NAME}\" ]; then\n    error_msg \"No update file found.\"\nelse\n    echo \"Start update from [ ${IMG_NAME} ]\"\nfi\n\n# Check the necessary dependencies\nDEPENDS=\"lsblk uuidgen grep awk btrfs mkfs.fat mkfs.btrfs md5sum fatlabel\"\necho \"Check the necessary dependencies...\"\nfor dep in ${DEPENDS}; do\n    WITCH=$(busybox which ${dep})\n    if [ \"${WITCH}\" == \"\" ]; then\n        error_msg \"Dependent command: ${dep} does not exist, upgrade cannot be performed, only flash through U disk/TF card!\"\n    else\n        echo \"${dep} path: ${WITCH}\"\n    fi\ndone\necho \"Check passed\"\n\n# find boot partition\nBOOT_PART_MSG=$(lsblk -l -o NAME,PATH,TYPE,UUID,MOUNTPOINT | awk '$3~/^part$/ && $5 ~ /^\\/boot$/ {print $0}')\nif [ \"${BOOT_PART_MSG}\" == \"\" ]; then\n    error_msg \"Boot The partition does not exist, so the update cannot be continued!\"\nfi\nBOOT_NAME=$(echo ${BOOT_PART_MSG} | awk '{print $1}')\nBOOT_PATH=$(echo ${BOOT_PART_MSG} | awk '{print $2}')\nBOOT_UUID=$(echo ${BOOT_PART_MSG} | awk '{print $4}')\n\nBR_FLAG=1\necho -ne \"Whether to backup and restore the current config files? y/n [y]\\b\\b\"\nif [[ ${BACKUP_RESTORE_CONFIG} == \"restore\" ]]; then\n    yn=\"y\"\nelif [[ ${BACKUP_RESTORE_CONFIG} == \"no-restore\" ]]; then\n    yn=\"n\"\nelse\n    read yn\nfi\ncase $yn in\nn* | N*)\n    BR_FLAG=0\n    ;;\nesac\n\n# find root partition\nROOT_PART_MSG=\"$(get_root_partition_msg)\"\nROOT_NAME=$(echo ${ROOT_PART_MSG} | awk '{print $1}')\nROOT_PATH=$(echo ${ROOT_PART_MSG} | awk '{print $2}')\nROOT_UUID=$(echo ${ROOT_PART_MSG} | awk '{print $4}')\n\ncase ${ROOT_NAME} in\n${EMMC_NAME}${PARTITION_NAME}2)\n    NEW_ROOT_NAME=\"${EMMC_NAME}${PARTITION_NAME}3\"\n    NEW_ROOT_LABEL=\"${LB_PRE}ROOTFS2\"\n    ;;\n${EMMC_NAME}${PARTITION_NAME}3)\n    NEW_ROOT_NAME=\"${EMMC_NAME}${PARTITION_NAME}2\"\n    NEW_ROOT_LABEL=\"${LB_PRE}ROOTFS1\"\n    ;;\n*)\n    error_msg \"ROOTFS The partition location is incorrect, so the update cannot continue!\"\n    ;;\nesac\necho \"NEW_ROOT_NAME: [ ${NEW_ROOT_NAME} ]\"\n\n# find new root partition\nNEW_ROOT_PART_MSG=$(lsblk -l -o NAME,PATH,TYPE,UUID,MOUNTPOINT | grep \"${NEW_ROOT_NAME}\" | awk '$3 ~ /^part$/ && $5 !~ /^\\/$/ && $5 !~ /^\\/boot$/ {print $0}')\nif [ \"${NEW_ROOT_PART_MSG}\" == \"\" ]; then\n    error_msg \"The new ROOTFS partition does not exist, so the update cannot continue!\"\nfi\nNEW_ROOT_NAME=$(echo ${NEW_ROOT_PART_MSG} | awk '{print $1}')\nNEW_ROOT_PATH=$(echo ${NEW_ROOT_PART_MSG} | awk '{print $2}')\nNEW_ROOT_UUID=$(echo ${NEW_ROOT_PART_MSG} | awk '{print $4}')\nNEW_ROOT_MP=$(echo ${NEW_ROOT_PART_MSG} | awk '{print $5}')\necho \"NEW_ROOT_MP: [ ${NEW_ROOT_MP} ]\"\n\n# backup old bootloader\nif [ ! -f /root/BackupOldBootloader.img ]; then\n    echo \"Backup bootloader -> [ BackupOldBootloader.img ] ... \"\n    dd if=/dev/${EMMC_NAME} of=/root/BackupOldBootloader.img bs=1M count=4 conv=fsync\n    echo \"Backup bootloader complete.\"\n    echo\nfi\n\n# losetup\nlosetup -f -P ${IMG_NAME}\nif [ ${?} -eq 0 ]; then\n    LOOP_DEV=$(losetup | grep \"${IMG_NAME}\" | awk '{print $1}')\n    if [ \"${LOOP_DEV}\" == \"\" ]; then\n        error_msg \"loop device not found!\"\n    fi\nelse\n    error_msg \"losetup [ ${IMG_FILE} ] failed!\"\nfi\n\n# fix loopdev issue in kernel 5.19\nfunction fix_loopdev() {\n    local parentdev=${1##*/}\n    if [ ! -d /sys/block/${parentdev} ]; then\n        return\n    fi\n    subdevs=$(lsblk -l -o NAME | grep -E \"^${parentdev}.+\\$\")\n    for subdev in ${subdevs}; do\n        if [ ! -d /sys/block/${parentdev}/${subdev} ]; then\n            return\n        elif [ -b /dev/${sub_dev} ]; then\n            continue\n        fi\n        source /sys/block/${parentdev}/${subdev}/uevent\n        mknod /dev/${subdev} b ${MAJOR} ${MINOR}\n        unset MAJOR MINOR DEVNAME DEVTYPE DISKSEQ PARTN PARTNAME\n    done\n}\nfix_loopdev ${LOOP_DEV}\n\nWAIT=3\necho \"The loopdev is [ $LOOP_DEV ], wait [ ${WAIT} ] seconds. \"\nwhile [[ \"${WAIT}\" -ge \"1\" ]]; do\n    sleep 1\n    WAIT=$((WAIT - 1))\ndone\n\n# umount loop devices (openwrt will auto mount some partition)\nMOUNTED_DEVS=$(lsblk -l -o NAME,PATH,MOUNTPOINT | grep \"${LOOP_DEV}\" | awk '$3 !~ /^$/ {print $2}')\nfor dev in ${MOUNTED_DEVS}; do\n    while :; do\n        echo \"umount [ ${dev} ] ... \"\n        umount -f ${dev}\n        sleep 1\n        mnt=$(lsblk -l -o NAME,PATH,MOUNTPOINT | grep \"${dev}\" | awk '$3 !~ /^$/ {print $2}')\n        if [ \"${mnt}\" == \"\" ]; then\n            break\n        else\n            echo \"Retry ...\"\n        fi\n    done\ndone\n\n# mount src part\nWORK_DIR=${PWD}\nP1=${WORK_DIR}/boot\nP2=${WORK_DIR}/root\nmkdir -p $P1 $P2\n\necho \"Mount [ ${LOOP_DEV}p1 ] -> [ ${P1} ] ... \"\nmount -t vfat -o ro ${LOOP_DEV}p1 ${P1}\nif [ $? -ne 0 ]; then\n    echo \"Mount p1 [ ${LOOP_DEV}p1 ] failed!\"\n    losetup -D\n    exit 1\nfi\n\necho \"Mount [ ${LOOP_DEV}p2 ] -> [ ${P2} ] ... \"\nZSTD_LEVEL=6\nmount -t btrfs -o ro,compress=zstd:${ZSTD_LEVEL} ${LOOP_DEV}p2 ${P2}\nif [ $? -ne 0 ]; then\n    echo \"Mount p2 [ ${LOOP_DEV}p2 ] failed!\"\n    umount -f ${P1}\n    losetup -D\n    exit 1\nfi\n\n# Prepare the dockerman config file\nif [ -f ${P2}/etc/init.d/dockerman ] && [ -f ${P2}/etc/config/dockerd ]; then\n\n    flg=0\n    # get current docker data root\n    data_root=$(uci get dockerd.globals.data_root 2>/dev/null)\n    if [ \"${data_root}\" == \"\" ]; then\n        flg=1\n        # get current config from /etc/docker/daemon.json\n        if [ -f \"/etc/docker/daemon.json\" ] && [ -x \"/usr/bin/jq\" ]; then\n            data_root=$(jq -r '.\"data-root\"' /etc/docker/daemon.json)\n\n            bip=$(jq -r '.\"bip\"' /etc/docker/daemon.json)\n            [ \"${bip}\" == \"null\" ] && bip=\"172.31.0.1/24\"\n\n            log_level=$(jq -r '.\"log-level\"' /etc/docker/daemon.json)\n            [ \"${log_level}\" == \"null\" ] && log_level=\"warn\"\n\n            _iptables=$(jq -r '.\"iptables\"' /etc/docker/daemon.json)\n            [ \"${_iptables}\" == \"null\" ] && _iptables=\"true\"\n\n            registry_mirrors=$(jq -r '.\"registry-mirrors\"[]' /etc/docker/daemon.json 2>/dev/null)\n        fi\n    fi\n\n    if [ \"${data_root}\" == \"\" ]; then\n        data_root=\"/opt/docker/\" # the default data root\n    fi\n\n    if ! uci get dockerd.globals >/dev/null 2>&1; then\n        uci set dockerd.globals='globals'\n        uci commit\n    fi\n\n    # delete alter config , use inner config\n    if uci get dockerd.globals.alt_config_file >/dev/null 2>&1; then\n        uci delete dockerd.globals.alt_config_file\n        uci commit\n    fi\n\n    if [ ${flg} -eq 1 ]; then\n        uci set dockerd.globals.data_root=${data_root}\n        [ \"${bip}\" != \"\" ] && uci set dockerd.globals.bip=${bip}\n        [ \"${log_level}\" != \"\" ] && uci set dockerd.globals.log_level=${log_level}\n        [ \"${_iptables}\" != \"\" ] && uci set dockerd.globals.iptables=${_iptables}\n        if [ \"${registry_mirrors}\" != \"\" ]; then\n            for reg in ${registry_mirrors}; do\n                uci add_list dockerd.globals.registry_mirrors=${reg}\n            done\n        fi\n        uci set dockerd.globals.auto_start='1'\n        uci commit\n    fi\nfi\n\n#update version prompt\nsource /boot/uEnv.txt 2>/dev/null\nCUR_FDTFILE=${FDT}\necho -e \"FDT Value [ ${CUR_FDTFILE} ]\"\ncp /boot/uEnv.txt /tmp/uEnv.txt && sync\n\nK510=\"1\"\n[[ \"$(hexdump -n 15 -x \"${P1}/zImage\" 2>/dev/null | head -n 1 | awk '{print $7}')\" == \"0108\" ]] && K510=\"0\"\necho -e \"K510 [ ${K510} ]\"\n\n# flippy-openwrt-release info\nUBOOT_OVERLOAD=\"\"\nMAINLINE_UBOOT=\"\"\nANDROID_UBOOT=\"\"\nenv_openwrt_file=\"\"\n\nif [ -f \"${P2}/etc/flippy-openwrt-release\" ]; then\n    env_openwrt_file=\"${P2}/etc/flippy-openwrt-release\"\nelif [ -f \"/etc/flippy-openwrt-release\" ]; then\n    env_openwrt_file=\"/etc/flippy-openwrt-release\"\nelse\n    env_openwrt_file=\"\"\nfi\n\nif [ -n \"${env_openwrt_file}\" ]; then\n    source \"${env_openwrt_file}\" 2>/dev/null\n    # Update the parameters used\n    UBOOT_OVERLOAD=${UBOOT_OVERLOAD}\n    MAINLINE_UBOOT=${MAINLINE_UBOOT}\n    ANDROID_UBOOT=${ANDROID_UBOOT}\n\n    # Unused parameters\n    FDTFILE=${FDTFILE}\n    U_BOOT_EXT=${U_BOOT_EXT}\n    KERNEL_VERSION=${KERNEL_VERSION}\n    SOC=${SOC}\nfi\n\n#format NEW_ROOT\necho \"umount [ ${NEW_ROOT_MP} ]\"\numount -f \"${NEW_ROOT_MP}\"\nif [[ \"${?}\" -ne \"0\" ]]; then\n    echo \"Umount [ ${NEW_ROOT_MP} ] failed, Please restart and try again!\"\n    umount -f ${P1}\n    umount -f ${P2}\n    losetup -D\n    exit 1\nfi\n\n# check and fix partition\nfunction check_and_fix_partition() {\n    local target_dev_name=${1}  # mmcblk2\n    local target_pt_name=${2}   # p2\n    local target_pt_idx=${3}    # 2\n    local safe_pt_begin_mb=${4} # 800\n    local safe_pt_begin_byte=$((${safe_pt_begin_mb} * 1024 * 1024))\n\n    local cur_pt_begin_sector=$(fdisk -l /dev/${target_dev_name} | grep ${target_dev_name}${target_pt_name} | awk '{printf $2}')\n    local cur_pt_begin_mb=$((${cur_pt_begin_sector} * 512 / 1024 / 1024))\n\n    if [ ${cur_pt_begin_mb} -ge ${safe_pt_begin_mb} ]; then\n        # check pass\n        return\n    fi\n\n    local cur_pt_end_sector=$(fdisk -l /dev/${target_dev_name} | grep ${target_dev_name}${target_pt_name} | awk '{printf $3}')\n    local cur_pt_end_byte=$(((${cur_pt_end_sector} + 1) * 512 - 1))\n\n    echo \"Unsafe partition found, repairing ... \"\n    parted /dev/${target_dev_name} rm ${target_pt_idx} ||\n        (\n            error_msg \"rm partion ${target_pt_idx} failed\"\n        )\n    parted /dev/${target_dev_name} mkpart primary btrfs \"${safe_pt_begin_byte}b\" \"${cur_pt_end_byte}b\" ||\n        (\n            error_msg \"create new partion ${target_pt_idx} failed\"\n        )\n    echo \"Partition repaired\"\n}\n\n# check if need fix partition\nif [ \"${NEW_ROOT_NAME}\" == \"mmcblk2p2\" ]; then\n    if [ \"${MYDEVICE_NAME}\" == \"Phicomm N1\" ] || [ \"${MYDEVICE_NAME}\" == \"Octopus Planet\" ]; then\n        # 最新研究结果:\n        #     Phicomm N1当采用官方 \"天天链\" 固件底包时，\n        #     796MB开始的 12 字节在每次重启后会被 bootloader 覆写,\n        #     因此把安全位置设定在800MB之后\n        # The latest research results:\n        #     When Phicomm N1 uses the official \"tian tian lian\" firmware bottom package,\n        #     the 12 bytes starting from 796MB will be overwritten by bootloader after each reboot,\n        #     so the safe location is set after 800MB\n        SAFE_PT_BEGIN_MB=800\n        check_and_fix_partition \"${EMMC_NAME}\" \"p2\" 2 ${SAFE_PT_BEGIN_MB}\n    fi\nfi\n\necho \"Format [ ${NEW_ROOT_PATH} ]\"\nNEW_ROOT_UUID=$(uuidgen)\nmkfs.btrfs -f -U ${NEW_ROOT_UUID} -L ${NEW_ROOT_LABEL} -m single ${NEW_ROOT_PATH}\nif [ $? -ne 0 ]; then\n    echo \"Format [ ${NEW_ROOT_PATH} ] failed!\"\n    umount -f ${P1}\n    umount -f ${P2}\n    losetup -D\n    exit 1\nfi\n\necho \"Mount [ ${NEW_ROOT_PATH} ] -> [ ${NEW_ROOT_MP} ]\"\nmount -t btrfs -o compress=zstd:${ZSTD_LEVEL} ${NEW_ROOT_PATH} ${NEW_ROOT_MP}\nif [ $? -ne 0 ]; then\n    echo \"Mount [ ${NEW_ROOT_PATH} ] -> [ ${NEW_ROOT_MP} ] failed!\"\n    umount -f ${P1}\n    umount -f ${P2}\n    losetup -D\n    exit 1\nfi\n\n# begin copy rootfs\ncd ${NEW_ROOT_MP}\necho \"Start copying data， From [ ${P2} ] TO [ ${NEW_ROOT_MP} ] ...\"\nENTRYS=$(ls)\nfor entry in ${ENTRYS}; do\n    if [[ \"${entry}\" == \"lost+found\" ]]; then\n        continue\n    fi\n    echo \"Remove old [ ${entry} ] ... \"\n    rm -rf ${entry}\n    if [[ \"${?}\" -ne \"0\" ]]; then\n        error_msg \"failed.\"\n    fi\ndone\n\necho \"Create folder ... \"\nbtrfs subvolume create etc\nmkdir -p .snapshots .reserved bin boot dev lib opt mnt overlay proc rom root run sbin sys tmp usr www\nln -sf lib/ lib64\nln -sf tmp/ var\nsync\n\nCOPY_SRC=\"root etc bin sbin lib opt usr www\"\necho \"Copy data begin ... \"\nfor src in ${COPY_SRC}; do\n    echo \"Copy [ ${src} ] ... \"\n    (cd ${P2} && tar cf - ${src}) | tar xf -\n    sync\ndone\n\n# if not backup, then force rewrite the etc/docker/daemon.json\nif [ \"${BR_FLAG}\" -eq 0 ]; then\n    cat >./etc/docker/daemon.json <<EOF\n{\n  \"bip\": \"172.31.0.1/24\",\n  \"data-root\": \"${DOCKER_ROOT}\",\n  \"log-level\": \"warn\",\n  \"log-driver\": \"json-file\",\n  \"log-opts\": {\n     \"max-size\": \"10m\",\n     \"max-file\": \"5\"\n   },\n  \"registry-mirrors\": [\n     \"https://mirror.baidubce.com/\",\n     \"https://hub-mirror.c.163.com\"\n   ]\n}\nEOF\nfi\n\ncat >./etc/fstab <<EOF\nUUID=${NEW_ROOT_UUID} / btrfs compress=zstd:${ZSTD_LEVEL} 0 1\nLABEL=${LB_PRE}BOOT /boot vfat defaults 0 2\n#tmpfs /tmp tmpfs defaults,nosuid 0 0\nEOF\n\ncat >./etc/config/fstab <<EOF\nconfig  global\n        option anon_swap '0'\n        option anon_mount '1'\n        option auto_swap '0'\n        option auto_mount '1'\n        option delay_root '5'\n        option check_fs '0'\n\nconfig  mount\n        option target '/rom'\n        option uuid '${NEW_ROOT_UUID}'\n        option enabled '1'\n        option enabled_fsck '1'\n        option fstype 'btrfs'\n        option options 'compress=zstd:${ZSTD_LEVEL}'\n\nconfig  mount\n        option target '/boot'\n        option label '${LB_PRE}BOOT'\n        option enabled '1'\n        option enabled_fsck '1'\n        option fstype 'vfat'\n\nEOF\n(\n    cd etc/rc.d\n    rm -f S??shortcut-fe\n    if grep \"sfe_flow '1'\" ../config/turboacc >/dev/null; then\n        if find ../../lib/modules -name 'shortcut-fe-cm.ko'; then\n            ln -sf ../init.d/shortcut-fe S99shortcut-fe\n        fi\n    fi\n)\n# move /etc/config/balance_irq to /etc/balance_irq\n[ -f \"./etc/config/balance_irq\" ] && mv ./etc/config/balance_irq ./etc/\nsync\n\necho \"Create initial etc snapshot -> .snapshots/etc-000\"\nbtrfs subvolume snapshot -r etc .snapshots/etc-000\nsync\n\n[ -d /mnt/${EMMC_NAME}${PARTITION_NAME}4/docker ] || mkdir -p /mnt/${EMMC_NAME}${PARTITION_NAME}4/docker\nrm -rf opt/docker && ln -sf /mnt/${EMMC_NAME}${PARTITION_NAME}4/docker/ opt/docker\n\nif [ -f /mnt/${NEW_ROOT_NAME}/etc/config/AdGuardHome ]; then\n    [ -d /mnt/${EMMC_NAME}${PARTITION_NAME}4/AdGuardHome/data ] || mkdir -p /mnt/${EMMC_NAME}${PARTITION_NAME}4/AdGuardHome/data\n    if [ ! -L /usr/bin/AdGuardHome ]; then\n        [ -d /usr/bin/AdGuardHome ] &&\n            cp -a /usr/bin/AdGuardHome/* /mnt/${EMMC_NAME}${PARTITION_NAME}4/AdGuardHome/\n    fi\n    ln -sf /mnt/${EMMC_NAME}${PARTITION_NAME}4/AdGuardHome /mnt/${NEW_ROOT_NAME}/usr/bin/AdGuardHome\nfi\n\n#rm -f /mnt/${NEW_ROOT_NAME}/usr/sbin/openwrt-install-amlogic\n#rm -f /mnt/${NEW_ROOT_NAME}/usr/sbin/openwrt-update-amlogic\nrm -f /mnt/${NEW_ROOT_NAME}/root/install-to-emmc.sh\nsync\necho \"Copy data complete ...\"\n\nBACKUP_LIST=$(${P2}/usr/sbin/openwrt-backup -p)\nif [[ \"${BR_FLAG}\" -eq \"1\" && -n \"${BACKUP_LIST}\" ]]; then\n    echo -n \"Start restoring configuration files ... \"\n    (\n        cd /\n        eval tar czf ${NEW_ROOT_MP}/.reserved/openwrt_config.tar.gz \"${BACKUP_LIST}\" 2>/dev/null\n    )\n    tar xzf ${NEW_ROOT_MP}/.reserved/openwrt_config.tar.gz\n\n    [ -f ./etc/config/dockerman ] && sed -e \"s/option wan_mode 'false'/option wan_mode 'true'/\" -i ./etc/config/dockerman 2>/dev/null\n    [ -f ./etc/config/dockerd ] && sed -e \"s/option wan_mode '0'/option wan_mode '1'/\" -i ./etc/config/dockerd 2>/dev/null\n    [ -f ./etc/config/verysync ] && sed -e 's/config setting/config verysync/' -i ./etc/config/verysync 2>/dev/null\n\n    # Restore fstab\n    cp -f .snapshots/etc-000/fstab ./etc/fstab\n    cp -f .snapshots/etc-000/config/fstab ./etc/config/fstab\n    # 还原 luci\n    cp -f .snapshots/etc-000/config/luci ./etc/config/luci\n    # 还原/etc/config/rpcd\n    cp -f .snapshots/etc-000/config/rpcd ./etc/config/rpcd\n\n    sync\n    echo \"Restore configuration information complete.\"\nfi\n\necho \"Modify the configuration file ... \"\nrm -f \"./etc/rc.local.orig\" \"./etc/first_run.sh\" \"./etc/part_size\"\nrm -rf \"./opt/docker\" && ln -sf \"/mnt/${EMMC_NAME}${PARTITION_NAME}4/docker\" \"./opt/docker\"\nrm -f ./etc/bench.log\ncat >>./etc/crontabs/root <<EOF\n37 5 * * * /etc/coremark.sh\nEOF\n\nsed -e 's/ttyAMA0/ttyAML0/' -i ./etc/inittab\nsed -e 's/ttyS0/tty0/' -i ./etc/inittab\nsss=$(date +%s)\nddd=$((sss / 86400))\nsed -e \"s/:0:0:99999:7:::/:${ddd}:0:99999:7:::/\" -i ./etc/shadow\n# Fix the problem of repeatedly adding amule entries after each upgrade\nsed -e \"/amule:x:/d\" -i ./etc/shadow\n# Fix the problem of repeatedly adding sshd entries after each upgrade of dropbear\nsed -e \"/sshd:x:/d\" -i ./etc/shadow\nif ! grep \"sshd:x:22:sshd\" ./etc/group >/dev/null; then\n    echo \"sshd:x:22:sshd\" >>./etc/group\nfi\nif ! grep \"sshd:x:22:22:sshd:\" ./etc/passwd >/dev/null; then\n    echo \"sshd:x:22:22:sshd:/var/run/sshd:/bin/false\" >>./etc/passwd\nfi\nif ! grep \"sshd:x:\" ./etc/shadow >/dev/null; then\n    echo \"sshd:x:${ddd}:0:99999:7:::\" >>./etc/shadow\nfi\n\nif [ \"${BR_FLAG}\" -eq \"1\" ]; then\n    if [ -x ./bin/bash ] && [ -f ./etc/profile.d/30-sysinfo.sh ]; then\n        sed -e 's/\\/bin\\/ash/\\/bin\\/bash/' -i ./etc/passwd\n    fi\n    sync\nfi\nsed -e \"s/option hw_flow '1'/option hw_flow '0'/\" -i ./etc/config/turboacc\n(\n    cd etc/rc.d\n    rm -f S??shortcut-fe\n    if grep \"sfe_flow '1'\" ../config/turboacc >/dev/null; then\n        if find ../../lib/modules -name 'shortcut-fe-cm.ko'; then\n            ln -sf ../init.d/shortcut-fe S99shortcut-fe\n        fi\n    fi\n)\neval tar czf .reserved/openwrt_config.tar.gz \"${BACKUP_LIST}\" 2>/dev/null\n\nrm -f ./etc/part_size ./etc/first_run.sh\nif [ -x ./usr/sbin/balethirq.pl ]; then\n    if grep \"balethirq.pl\" \"./etc/rc.local\"; then\n        echo \"balance irq is enabled\"\n    else\n        echo \"enable balance irq\"\n        sed -e \"/exit/i\\/usr/sbin/balethirq.pl\" -i ./etc/rc.local\n    fi\nfi\n\nmv ./etc/rc.local ./etc/rc.local.orig\ncat >\"./etc/rc.local\" <<EOF\nif ! ls /etc/rc.d/S??dockerd >/dev/null 2>&1;then\n    /etc/init.d/dockerd enable\n    /etc/init.d/dockerd start\nfi\nif ! ls /etc/rc.d/S??dockerman >/dev/null 2>&1 && [ -f /etc/init.d/dockerman ];then\n    /etc/init.d/dockerman enable\n    /etc/init.d/dockerman start\nfi\nmv /etc/rc.local.orig /etc/rc.local\nchmod 755 /etc/rc.local\nexec /etc/rc.local\nexit\nEOF\nchmod 755 ./etc/rc.local*\n\n#Mainline U-BOOT detection\nFLASH_MAINLINE_UBOOT=0\nif [[ -n \"${MAINLINE_UBOOT}\" && -f \"${P2}${MAINLINE_UBOOT}\" ]]; then\n    cat <<EOF\n----------------------------------------------------------------------------------\nFound an available mainline bootloader (Mainline u-boot), you can flash into EMMC.\n----------------------------------------------------------------------------------\nEOF\n    while :; do\n        if [[ \"${AUTO_MAINLINE_UBOOT}\" == \"yes\" ]]; then\n            if [[ \"${K510}\" -eq \"1\" ]]; then\n                yn=\"y\"\n            else\n                yn=\"n\"\n            fi\n        elif [[ \"${AUTO_MAINLINE_UBOOT}\" == \"no\" ]]; then\n            yn=\"n\"\n        else\n            read -p \"Please choose whether to write the mainline bootloader to EMMC?  y/n \" yn\n        fi\n\n        case ${yn} in\n        y | Y)\n            FLASH_MAINLINE_UBOOT=1\n            break\n            ;;\n        n | N)\n            FLASH_MAINLINE_UBOOT=0\n            break\n            ;;\n        esac\n    done\nfi\n\nif [[ \"${FLASH_MAINLINE_UBOOT}\" -eq \"1\" ]]; then\n    echo -e \"Write Mainline bootloader: [ ${MAINLINE_UBOOT} ]\"\n    dd if=${P2}${MAINLINE_UBOOT} of=/dev/${EMMC_NAME} bs=1 count=444 conv=fsync\n    dd if=${P2}${MAINLINE_UBOOT} of=/dev/${EMMC_NAME} bs=512 skip=1 seek=1 conv=fsync\nelif [[ -n \"${ANDROID_UBOOT}\" && -f \"${P2}${ANDROID_UBOOT}\" ]]; then\n    echo -e \"Write Android bootloader: [ ${ANDROID_UBOOT} ]\"\n    dd if=${P2}${ANDROID_UBOOT} of=/dev/${EMMC_NAME} bs=1 count=444 conv=fsync\n    dd if=${P2}${ANDROID_UBOOT} of=/dev/${EMMC_NAME} bs=512 skip=1 seek=1 conv=fsync\nelse\n    echo \"Did not change the original bootloader.\"\nfi\n\n# move /etc/config/balance_irq to /etc/balance_irq\n[ -f \"./etc/config/balance_irq\" ] && mv ./etc/config/balance_irq ./etc/\n\necho \"Create etc snapshot -> .snapshots/etc-001\"\nbtrfs subvolume snapshot -r etc .snapshots/etc-001\n\ncd ${WORK_DIR}\n\necho \"Change the label of ${BOOT_PATH} ... \"\nfatlabel ${BOOT_PATH} \"${LB_PRE}BOOT\"\necho \"Start copying data， from [ ${P1} ] to [ /boot ] ...\"\ncd /boot\necho \"Delete the old boot file ...\"\nrm -rf * && sync\n\necho \"Copy the new boot file ... \"\n(cd ${P1} && tar cf - .) | tar xf - 2>/dev/null\nsync\n\nif [ -f ${P1}/uInitrd ]; then\n    i=1\n    max_try=10\n    while [ \"${i}\" -le \"${max_try}\" ]; do\n        uInitrd_original=$(md5sum ${P1}/uInitrd | awk '{print $1}')\n        uInitrd_new=$(md5sum uInitrd | awk '{print $1}')\n        if [ \"${uInitrd_original}\" = \"${uInitrd_new}\" ]; then\n            break\n        else\n            rm -f uInitrd && sync\n            cp -f ${P1}/uInitrd uInitrd 2>/dev/null && sync\n            let i++\n            continue\n        fi\n    done\n    [ \"${i}\" -eq \"10\" ] && error_msg \"uInitrd file copy failed.\"\nelse\n    echo \"uInitrd file is missing.\"\nfi\n\nif [ -f ${P1}/zImage ]; then\n    i=1\n    max_try=10\n    while [ \"${i}\" -le \"${max_try}\" ]; do\n        zImage_original=$(md5sum ${P1}/zImage | awk '{print $1}')\n        zImage_new=$(md5sum zImage | awk '{print $1}')\n        if [ \"${zImage_original}\" = \"${zImage_new}\" ]; then\n            break\n        else\n            rm -f zImage && sync\n            cp -f ${P1}/zImage zImage 2>/dev/null && sync\n            let i++\n            continue\n        fi\n    done\n    [ \"${i}\" -eq \"10\" ] && error_msg \"zImage file copy failed.\"\nelse\n    error_msg \"zImage file is missing.\"\nfi\n\nif [ ${ROOT_DISK_TYPE} == \"EMMC\" ]; then\n    rm -f s905_autoscript* aml_autoscript*\n    mv -f boot-emmc.ini boot.ini\n    mv -f boot-emmc.cmd boot.cmd\n    mv -f boot-emmc.scr boot.scr\nfi\n\nif [ \"${K510}\" -eq \"1\" ]; then\n    if [ -f \"u-boot.ext\" ]; then\n        cp -vf u-boot.ext u-boot.emmc\n    elif [ -f ${P1}/${UBOOT_OVERLOAD} ]; then\n        cp -vf ${P1}/${UBOOT_OVERLOAD} ${UBOOT_OVERLOAD}\n        cp -vf ${P1}/${UBOOT_OVERLOAD} u-boot.ext\n        cp -vf ${P1}/${UBOOT_OVERLOAD} u-boot.emmc\n        chmod +x u-boot*\n    fi\nelse\n    rm -f u-boot.ext 2>/dev/null\n    rm -f u-boot.emmc 2>/dev/null\nfi\n\nsync\n\necho \"Update boot parameters ... \"\nif [ -f /tmp/uEnv.txt ]; then\n    lines=$(wc -l </tmp/uEnv.txt)\n    lines=$((lines - 1))\n    head -n $lines /tmp/uEnv.txt >uEnv.txt\n    cat >>uEnv.txt <<EOF\nAPPEND=root=UUID=${NEW_ROOT_UUID} rootfstype=btrfs rootflags=compress=zstd:${ZSTD_LEVEL} console=ttyAML0,115200n8 console=tty0 no_console_suspend consoleblank=0 fsck.fix=yes fsck.repair=yes net.ifnames=0 cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1\nEOF\nelse\n    cat >uEnv.txt <<EOF\nLINUX=/zImage\nINITRD=/uInitrd\nFDT=${CUR_FDTFILE}\nAPPEND=root=UUID=${NEW_ROOT_UUID} rootfstype=btrfs rootflags=compress=zstd:${ZSTD_LEVEL} console=ttyAML0,115200n8 console=tty0 no_console_suspend consoleblank=0 fsck.fix=yes fsck.repair=yes net.ifnames=0 cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1\nEOF\nfi\nsync\n\n# Replace the UUID for extlinux/extlinux.conf if it exists\n[[ -f \"extlinux/extlinux.conf\" ]] && {\n    sed -i -E \"s|UUID=[^ ]*|UUID=${NEW_ROOT_UUID}|\" extlinux/extlinux.conf 2>/dev/null\n}\n\ncd $WORK_DIR\numount -f ${P1} ${P2} 2>/dev/null\nlosetup -D 2>/dev/null\nrm -rf ${P1} ${P2} 2>/dev/null\nrm -f ${IMG_NAME} 2>/dev/null\nrm -f sha256sums 2>/dev/null\nsync\nwait\n\necho \"Successfully updated, automatic restarting...\"\nsleep 3\nreboot\nexit 0\n"
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/openwrt-update-kvm",
    "content": "#!/bin/bash\n#======================================================================================\n# Function: Update the QEMU AARCH64 KVM vitual machine openwrt firmware\n# Copyright (C) 2022-- https://github.com/unifreq/openwrt_packit\n# Copyright (C) 2022-- https://github.com/ophub\n#======================================================================================\n#\n# The script supports directly setting parameters for update, skipping interactive selection\n# openwrt-update-amlogic ${OPENWRT_FILE} ${AUTO_MAINLINE_UBOOT} ${RESTORE_CONFIG} ${WORK_DIR}\n# E.g: openwrt-update-kvm openwrt_qemu-aarch64.img.gz no restore /mnt/vda4\n# E.g: openwrt-update-kvm openwrt_qemu-aarch64.img.gz no no-restore /mnt/data\n\n# You can also execute the script directly, and interactively select related functions\n# E.g: openwrt-update-kvm\n#\n#======================================================================================\n\n# Encountered a serious error, abort the script execution\nerror_msg() {\n    echo -e \"[ERROR] ${1}\"\n    exit 1\n}\n\n# Get the partition name of the /boot file system\nget_boot_partition_name() {\n    local paths=\"/boot\"\n    local partition_name\n\n    partition_name=$(df \"${paths}\" | awk 'NR==2 {print $1}' | awk -F '/' '{print $3}')\n\n    echo \"${partition_name}\"\n}\n\n# Get the partition name of the root file system\nget_root_partition_name() {\n    local paths=(\"/\" \"/overlay\" \"/rom\")\n    local partition_name\n\n    for path in \"${paths[@]}\"; do\n        partition_name=$(df \"${path}\" | awk 'NR==2 {print $1}' | awk -F '/' '{print $3}')\n        [[ -n \"${partition_name}\" ]] && break\n    done\n\n    echo \"${partition_name}\"\n}\n\n# Get the partition message of the root file system\nget_root_partition_msg() {\n    local paths=(\"/\" \"/overlay\" \"/rom\")\n    local partition_name\n\n    for path in \"${paths[@]}\"; do\n        partition_msg=$(lsblk -l -o NAME,PATH,TYPE,UUID,MOUNTPOINT | awk '$3~/^part$/ && $5 ~ \"^\" \"'\"${path}\"'\" \"$\" {print $0}')\n        [[ -n \"${partition_msg}\" ]] && break\n    done\n\n    [[ -z \"${partition_msg}\" ]] && error_msg \"Cannot find the root partition message!\"\n    echo \"${partition_msg}\"\n}\n\n# Receive one-key command related parameters\nIMG_NAME=\"${1}\"\nAUTO_MAINLINE_UBOOT=\"${2}\"\nBACKUP_RESTORE_CONFIG=\"${3}\"\nWORK_DIR=\"${4}\"\n\n# Check the necessary dependencies\nDEPENDS=\"lsblk uuidgen grep awk btrfs mkfs.fat mkfs.btrfs md5sum fatlabel jq\"\necho \"Check the necessary dependencies...\"\nfor dep in ${DEPENDS}; do\n    WITCH=$(busybox which ${dep})\n    if [ \"${WITCH}\" == \"\" ]; then\n        error_msg \"Dependent command: ${dep} does not exist, upgrade cannot be performed!\"\n    else\n        echo \"${dep} path: ${WITCH}\"\n    fi\ndone\necho \"Check passed\"\n\n# Current device model\nsource /etc/flippy-openwrt-release\nif [[ -z \"${PLATFORM}\" ]]; then\n    error_msg \"The platform is empty.\"\nelif [[ \"${PLATFORM}\" != \"qemu-aarch64\" ]]; then\n    error_msg \"The platform is missing, only support qemu-aarch64.\"\nelse\n    echo -e \"Current platform: [ ${PLATFORM} ]\"\n    sleep 3\nfi\n\n# Check and repair partition mount points\n[[ -z \"$(get_boot_partition_name)\" || -z \"$(get_root_partition_name)\" ]] && {\n    echo -e \"Partition mount point error, start repairing...\"\n    openwrt-backup -g\n}\n\n# Find the partition where root is located\n# vda2 or vda3\nROOT_PTNAME=\"$(get_root_partition_name)\"\n\n# Find the disk where the partition is located, only supports sd?? hd?? vd??\ncase ${ROOT_PTNAME} in\n[hsv]d[a-z][1-4])\n    DISK_NAME=$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-1)}')\n    PART_PRESTR=\"\"\n    LABEL_PRESTR=\"\"\n    ;;\n*)\n    error_msg \"Unable to recognize the disk type of ${ROOT_PTNAME}!\"\n    ;;\nesac\n\nfunction get_docker_root {\n    local data_root\n    if [[ -f /etc/config/dockerd ]]; then\n        data_root=$(uci get dockerd.globals.data_root)\n    fi\n    if [[ -z \"${data_root}\" ]] && [[ -f /etc/docker/daemon.json ]]; then\n        data_root=$(jq -r '.\"data-root\"' /etc/docker/daemon.json)\n    fi\n    echo \"$data_root\"\n}\nDOCKER_ROOT=$(get_docker_root)\n\nif [[ -z \"${WORK_DIR}\" ]]; then\n    WORK_DIR=\"/mnt/${DISK_NAME}${PART_PRESTR}4/\"\nfi\nif [[ ! -d \"${WORK_DIR}\" ]]; then\n    error_msg \"the work directory is not exists. [ ${WORK_DIR} ]\"\nfi\n\ncd \"${WORK_DIR}\"\nif [[ -d \"/tmp/upload\" ]] && [[ -f \"/tmp/upload/*img*\" ]]; then\n    mv -f /tmp/upload/*img* .\n    if [[ $? -ne 0 ]]; then\n        error_msg \"move file failed.\"\n    fi\nfi\nsync\n\nif [[ \"${IMG_NAME}\" == *.img ]]; then\n    echo -e \"Update using [ ${IMG_NAME} ] file. Please wait a moment ...\"\nelif [ $(ls *.img -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    IMG_NAME=$(ls *.img | head -n 1)\n    echo -e \"Update using [ ${IMG_NAME} ] ] file. Please wait a moment ...\"\nelif [ $(ls *.img.xz -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    xz_file=$(ls *.img.xz | head -n 1)\n    echo -e \"Update using [ ${xz_file} ] file. Please wait a moment ...\"\n    xz -d ${xz_file} 2>/dev/null\n    IMG_NAME=$(ls *.img | head -n 1)\nelif [ $(ls *.img.gz -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    gz_file=$(ls *.img.gz | head -n 1)\n    echo -e \"Update using [ ${gz_file} ] file. Please wait a moment ...\"\n    gzip -df ${gz_file} 2>/dev/null\n    IMG_NAME=$(ls *.img | head -n 1)\nelif [ $(ls *.7z -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    gz_file=$(ls *.7z | head -n 1)\n    echo -e \"Update using [ ${gz_file} ] file. Please wait a moment ...\"\n    bsdtar -xmf ${gz_file} 2>/dev/null\n    [ $? -eq 0 ] || 7z x ${gz_file} -aoa -y 2>/dev/null\n    IMG_NAME=$(ls *.img | head -n 1)\nelif [ $(ls *.zip -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    zip_file=$(ls *.zip | head -n 1)\n    echo -e \"Update using [ ${zip_file} ] file. Please wait a moment ...\"\n    unzip -o ${zip_file} 2>/dev/null\n    IMG_NAME=$(ls *.img | head -n 1)\nelse\n    echo -e \"Please upload or specify the update openwrt firmware file.\"\n    #echo -e \"Upload method: system menu → Amlogic Service → Manually Upload Update\"\n    echo -e \"Specify method: Place the openwrt firmware file in [ ${WORK_DIR} ]\"\n    echo -e \"The supported file suffixes are: *.img, *.img.xz, *.img.gz, *.7z, *.zip\"\n    echo -e \"After upload the openwrt firmware file, run again.\"\n    exit 1\nfi\nsync\n\n# check file\nif [ ! -f \"${IMG_NAME}\" ]; then\n    error_msg \"No update file found.\"\nelse\n    echo \"Start update from [ ${IMG_NAME} ]\"\nfi\n\n# find efi partition\nEFI_PART_MSG=$(lsblk -l -o NAME,PATH,TYPE,UUID,MOUNTPOINT | awk '$3~/^part$/ && $5 ~ /^\\/boot\\/efi$/ {print $0}')\nif [ \"${EFI_PART_MSG}\" == \"\" ]; then\n    error_msg \"The EFI partition does not exist, so the update cannot be continued!\"\nfi\nEFI_NAME=$(echo $EFI_PART_MSG | awk '{print $1}')\nEFI_DEV=$(echo $EFI_PART_MSG | awk '{print $2}')\nEFI_UUID=$(echo $EFI_PART_MSG | awk '{print $4}')\n\nBR_FLAG=1\nif [[ ${BACKUP_RESTORE_CONFIG} == \"restore\" ]]; then\n    BR_FLAG=1\nelif [[ ${BACKUP_RESTORE_CONFIG} == \"no-restore\" ]]; then\n    BR_FLAG=0\nelse\n    echo -ne \"Whether to backup and restore the current config files? y/n [y]\\b\\b\"\n    read yn\n    case $yn in\n    n* | N*) BR_FLAG=0 ;;\n    esac\nfi\n\n# find root partition\nROOT_PART_MSG=\"$(get_root_partition_msg)\"\nROOT_NAME=$(echo ${ROOT_PART_MSG} | awk '{print $1}')\nROOT_DEV=$(echo ${ROOT_PART_MSG} | awk '{print $2}')\nROOT_UUID=$(echo ${ROOT_PART_MSG} | awk '{print $4}')\n\ncase ${ROOT_NAME} in\n${DISK_NAME}${PART_PRESTR}2)\n    NEW_ROOT_NAME=\"${DISK_NAME}${PART_PRESTR}3\"\n    NEW_ROOT_LABEL=\"${LABEL_PRESTR}ROOTFS2\"\n    ;;\n${DISK_NAME}${PART_PRESTR}3)\n    NEW_ROOT_NAME=\"${DISK_NAME}${PART_PRESTR}2\"\n    NEW_ROOT_LABEL=\"${LABEL_PRESTR}ROOTFS1\"\n    ;;\n*)\n    error_msg \"ROOTFS The partition location is incorrect, so the update cannot continue!\"\n    ;;\nesac\necho \"NEW_ROOT_NAME: [ ${NEW_ROOT_NAME} ]\"\n\n# find new root partition\nNEW_ROOT_PART_MSG=$(lsblk -l -o NAME,PATH,TYPE,UUID,MOUNTPOINT | grep \"${NEW_ROOT_NAME}\" | awk '$3 ~ /^part$/ && $5 !~ /^\\/$/ && $5 !~ /^\\/boot$/ {print $0}')\nif [ \"${NEW_ROOT_PART_MSG}\" == \"\" ]; then\n    error_msg \"The new ROOTFS partition does not exist, so the update cannot continue!\"\nfi\nNEW_ROOT_NAME=$(echo $NEW_ROOT_PART_MSG | awk '{print $1}')\nNEW_ROOT_DEV=$(echo $NEW_ROOT_PART_MSG | awk '{print $2}')\nNEW_ROOT_UUID=$(echo $NEW_ROOT_PART_MSG | awk '{print $4}')\nNEW_ROOT_MOUNTPOINT=$(echo $NEW_ROOT_PART_MSG | awk '{print $5}')\necho \"NEW_ROOT_MOUNTPOINT: [ ${NEW_ROOT_MOUNTPOINT} ]\"\n\n# losetup\nlosetup -f -P $IMG_NAME\nif [ $? -eq 0 ]; then\n    LOOP_DEV=$(losetup | grep \"$IMG_NAME\" | awk '{print $1}')\n    if [ \"$LOOP_DEV\" == \"\" ]; then\n        error_msg \"loop device not found!\"\n    fi\nelse\n    error_msg \"losetup [ $IMG_FILE ] failed!\"\nfi\n\n# fix loopdev issue in kernel 5.19\nfunction fix_loopdev() {\n    local parentdev=${1##*/}\n    if [ ! -d /sys/block/${parentdev} ]; then\n        return\n    fi\n    subdevs=$(lsblk -l -o NAME | grep -E \"^${parentdev}.+\\$\")\n    for subdev in $subdevs; do\n        if [ ! -d /sys/block/${parentdev}/${subdev} ]; then\n            return\n        elif [ -b /dev/${sub_dev} ]; then\n            continue\n        fi\n        source /sys/block/${parentdev}/${subdev}/uevent\n        mknod /dev/${subdev} b ${MAJOR} ${MINOR}\n        unset MAJOR MINOR DEVNAME DEVTYPE DISKSEQ PARTN PARTNAME\n    done\n}\nfix_loopdev ${LOOP_DEV}\n\nWAIT=3\necho \"The loopdev is [ $LOOP_DEV ], wait [ ${WAIT} ] seconds. \"\nwhile [ $WAIT -ge 1 ]; do\n    sleep 1\n    WAIT=$((WAIT - 1))\ndone\n\n# umount loop devices (openwrt will auto mount some partition)\nMOUNTED_DEVS=$(lsblk -l -o NAME,PATH,MOUNTPOINT | grep \"$LOOP_DEV\" | awk '$3 !~ /^$/ {print $2}')\nfor dev in $MOUNTED_DEVS; do\n    while :; do\n        echo \"umount [ $dev ] ... \"\n        umount -f $dev\n        sleep 1\n        mnt=$(lsblk -l -o NAME,PATH,MOUNTPOINT | grep \"$dev\" | awk '$3 !~ /^$/ {print $2}')\n        if [ \"$mnt\" == \"\" ]; then\n            break\n        else\n            echo \"Retry ...\"\n        fi\n    done\ndone\n\n# mount src part\nP1=${WORK_DIR}/efi\nP2=${WORK_DIR}/root\nmkdir -p $P1 $P2\n\necho \"Mount [ ${LOOP_DEV}p1 ] -> [ ${P1} ] ... \"\nmount -t vfat -o ro ${LOOP_DEV}p1 ${P1}\nif [ $? -ne 0 ]; then\n    echo \"Mount p1 [ ${LOOP_DEV}p1 ] failed!\"\n    losetup -D\n    exit 1\nfi\n\necho \"Mount [ ${LOOP_DEV}p2 ] -> [ ${P2} ] ... \"\nZSTD_LEVEL=\"6\"\nmount -t btrfs -o ro,compress=zstd:${ZSTD_LEVEL} ${LOOP_DEV}p2 ${P2}\nif [ $? -ne 0 ]; then\n    echo \"Mount p2 [ ${LOOP_DEV}p2 ] failed!\"\n    umount -f ${P1}\n    losetup -D\n    exit 1\nfi\n\n# Prepare the dockerman config file\nif [ -f ${P2}/etc/init.d/dockerman ] && [ -f ${P2}/etc/config/dockerd ]; then\n\n    flg=0\n    # get current docker data root\n    data_root=$(uci get dockerd.globals.data_root 2>/dev/null)\n    if [ \"$data_root\" == \"\" ]; then\n        flg=1\n        # get current config from /etc/docker/daemon.json\n        if [ -f \"/etc/docker/daemon.json\" ] && [ -x \"/usr/bin/jq\" ]; then\n            data_root=$(jq -r '.\"data-root\"' /etc/docker/daemon.json)\n\n            bip=$(jq -r '.\"bip\"' /etc/docker/daemon.json)\n            [ \"$bip\" == \"null\" ] && bip=\"172.31.0.1/24\"\n\n            log_level=$(jq -r '.\"log-level\"' /etc/docker/daemon.json)\n            [ \"$log_level\" == \"null\" ] && log_level=\"warn\"\n\n            _iptables=$(jq -r '.\"iptables\"' /etc/docker/daemon.json)\n            [ \"$_iptables\" == \"null\" ] && _iptables=\"true\"\n\n            registry_mirrors=$(jq -r '.\"registry-mirrors\"[]' /etc/docker/daemon.json 2>/dev/null)\n        fi\n    fi\n\n    if [ \"$data_root\" == \"\" ]; then\n        data_root=\"/opt/docker/\" # the default data root\n    fi\n\n    if ! uci get dockerd.globals >/dev/null 2>&1; then\n        uci set dockerd.globals='globals'\n        uci commit\n    fi\n\n    # delete alter config , use inner config\n    if uci get dockerd.globals.alt_config_file >/dev/null 2>&1; then\n        uci delete dockerd.globals.alt_config_file\n        uci commit\n    fi\n\n    if [ $flg -eq 1 ]; then\n        uci set dockerd.globals.data_root=$data_root\n        [ \"$bip\" != \"\" ] && uci set dockerd.globals.bip=$bip\n        [ \"$log_level\" != \"\" ] && uci set dockerd.globals.log_level=$log_level\n        [ \"$_iptables\" != \"\" ] && uci set dockerd.globals.iptables=$_iptables\n        if [ \"$registry_mirrors\" != \"\" ]; then\n            for reg in $registry_mirrors; do\n                uci add_list dockerd.globals.registry_mirrors=$reg\n            done\n        fi\n        uci set dockerd.globals.auto_start='1'\n        uci commit\n    fi\nfi\n\n#format NEW_ROOT\necho \"umount [ ${NEW_ROOT_MOUNTPOINT} ]\"\numount -f \"${NEW_ROOT_MOUNTPOINT}\"\nif [ $? -ne 0 ]; then\n    echo \"Umount [ ${NEW_ROOT_MOUNTPOINT} ] failed, Please restart and try again!\"\n    umount -f ${P1}\n    umount -f ${P2}\n    losetup -D\n    exit 1\nfi\n\necho \"Format [ ${NEW_ROOT_DEV} ]\"\nNEW_ROOT_UUID=$(uuidgen)\nmkfs.btrfs -f -U ${NEW_ROOT_UUID} -L ${NEW_ROOT_LABEL} ${NEW_ROOT_DEV}\nif [ $? -ne 0 ]; then\n    echo \"Format [ ${NEW_ROOT_DEV} ] failed!\"\n    umount -f ${P1}\n    umount -f ${P2}\n    losetup -D\n    exit 1\nfi\n\necho \"Mount [ ${NEW_ROOT_DEV} ] -> [ ${NEW_ROOT_MOUNTPOINT} ]\"\nmount -t btrfs -o compress=zstd:${ZSTD_LEVEL} ${NEW_ROOT_DEV} ${NEW_ROOT_MOUNTPOINT}\nif [ $? -ne 0 ]; then\n    echo \"Mount [ ${NEW_ROOT_DEV} ] -> [ ${NEW_ROOT_MOUNTPOINT} ] failed!\"\n    umount -f ${P1}\n    umount -f ${P2}\n    losetup -D\n    exit 1\nfi\n\n# begin copy rootfs\ncd ${NEW_ROOT_MOUNTPOINT}\necho \"Start copying data， From [ ${P2} ] TO [ ${NEW_ROOT_MOUNTPOINT} ] ...\"\nENTRYS=$(ls)\nfor entry in $ENTRYS; do\n    if [ \"$entry\" == \"lost+found\" ]; then\n        continue\n    fi\n    echo \"Remove old [ $entry ] ... \"\n    rm -rf $entry\n    if [ $? -ne 0 ]; then\n        error_msg \"failed.\"\n    fi\ndone\n\necho \"Create folder ... \"\nbtrfs subvolume create etc\nmkdir -p .snapshots .reserved bin boot dev lib opt mnt overlay proc rom root run sbin sys tmp usr www\nln -sf lib/ lib64\nln -sf tmp/ var\nsync\n\nCOPY_SRC=\"boot root etc bin sbin lib opt usr www\"\necho \"Copy data begin ... \"\nfor src in $COPY_SRC; do\n    echo \"Copy [ $src ] ... \"\n    (cd ${P2} && tar cf - $src) | tar xf -\n    sync\ndone\n\n# if not backup, then force rewrite the etc/docker/daemon.json\nif [ \"${BR_FLAG}\" -eq 0 ]; then\n    cat >./etc/docker/daemon.json <<EOF\n{\n  \"bip\": \"172.31.0.1/24\",\n  \"data-root\": \"${DOCKER_ROOT}\",\n  \"log-level\": \"warn\",\n  \"log-driver\": \"json-file\",\n  \"log-opts\": {\n     \"max-size\": \"10m\",\n     \"max-file\": \"5\"\n   },\n  \"registry-mirrors\": [\n     \"https://mirror.baidubce.com/\",\n     \"https://hub-mirror.c.163.com\"\n   ]\n}\nEOF\nfi\n\ncat >./etc/fstab <<EOF\nUUID=${NEW_ROOT_UUID} / btrfs compress=zstd:${ZSTD_LEVEL} 0 1\nLABEL=EFI /boot/efi vfat defaults 0 2\n#tmpfs /tmp tmpfs defaults,nosuid 0 0\nEOF\n\ncat >./etc/config/fstab <<EOF\nconfig  global\n        option anon_swap '0'\n        option anon_mount '1'\n        option auto_swap '0'\n        option auto_mount '1'\n        option delay_root '5'\n        option check_fs '0'\n\nconfig  mount\n        option target '/rom'\n        option uuid '${NEW_ROOT_UUID}'\n        option enabled '1'\n        option enabled_fsck '1'\n        option fstype 'btrfs'\n        option options 'compress=zstd:${ZSTD_LEVEL}'\n\nconfig  mount\n        option target '/boot/efi'\n        option label 'EFI'\n        option enabled '1'\n        option enabled_fsck '1'\n        option fstype 'vfat'\n\nEOF\n(\n    cd etc/rc.d\n    rm -f S??shortcut-fe\n    if grep \"sfe_flow '1'\" ../config/turboacc >/dev/null; then\n        if find ../../lib/modules -name 'shortcut-fe-cm.ko'; then\n            ln -sf ../init.d/shortcut-fe S99shortcut-fe\n        fi\n    fi\n)\n\n# move /etc/config/balance_irq to /etc/balance_irq\n[ -f \"./etc/config/balance_irq\" ] && mv ./etc/config/balance_irq ./etc/\nsync\n\necho \"Create initial etc snapshot -> .snapshots/etc-000\"\nbtrfs subvolume snapshot -r etc .snapshots/etc-000\nsync\n\n[ -d /mnt/${DISK_NAME}${PART_PRESTR}4/docker ] || mkdir -p /mnt/${DISK_NAME}${PART_PRESTR}4/docker\nrm -rf opt/docker && ln -sf /mnt/${DISK_NAME}${PART_PRESTR}4/docker/ opt/docker\n\nif [ -f /mnt/${NEW_ROOT_NAME}/etc/config/AdGuardHome ]; then\n    [ -d /mnt/${DISK_NAME}${PART_PRESTR}4/AdGuardHome/data ] || mkdir -p /mnt/${DISK_NAME}${PART_PRESTR}4/AdGuardHome/data\n    if [ ! -L /usr/bin/AdGuardHome ]; then\n        [ -d /usr/bin/AdGuardHome ] &&\n            cp -a /usr/bin/AdGuardHome/* /mnt/${DISK_NAME}${PART_PRESTR}4/AdGuardHome/\n    fi\n    ln -sf /mnt/${DISK_NAME}${PART_PRESTR}4/AdGuardHome /mnt/${NEW_ROOT_NAME}/usr/bin/AdGuardHome\nfi\nsync\necho \"Copy data complete ...\"\n\nBACKUP_LIST=$(${P2}/usr/sbin/openwrt-backup -p)\nif [[ \"${BR_FLAG}\" -eq \"1\" && -n \"${BACKUP_LIST}\" ]]; then\n    echo -n \"Start restoring configuration files ... \"\n    (\n        cd /\n        eval tar czf ${NEW_ROOT_MOUNTPOINT}/.reserved/openwrt_config.tar.gz \"${BACKUP_LIST}\" 2>/dev/null\n    )\n    tar xzf ${NEW_ROOT_MOUNTPOINT}/.reserved/openwrt_config.tar.gz\n\n    [ -f ./etc/config/dockerman ] && sed -e \"s/option wan_mode 'false'/option wan_mode 'true'/\" -i ./etc/config/dockerman 2>/dev/null\n    [ -f ./etc/config/dockerd ] && sed -e \"s/option wan_mode '0'/option wan_mode '1'/\" -i ./etc/config/dockerd 2>/dev/null\n    [ -f ./etc/config/verysync ] && sed -e 's/config setting/config verysync/' -i ./etc/config/verysync 2>/dev/null\n\n    # Restore fstab\n    cp -f .snapshots/etc-000/fstab ./etc/fstab\n    cp -f .snapshots/etc-000/config/fstab ./etc/config/fstab\n    # 还原 luci\n    cp -f .snapshots/etc-000/config/luci ./etc/config/luci\n    # 还原/etc/config/rpcd\n    cp -f .snapshots/etc-000/config/rpcd ./etc/config/rpcd\n\n    sync\n    echo \"Restore configuration information complete.\"\nfi\n\necho \"Modify the configuration file ... \"\nrm -f \"./etc/rc.local.orig\" \"./etc/first_run.sh\" \"./etc/part_size\"\nrm -rf \"./opt/docker\" && ln -sf \"/mnt/${DISK_NAME}${PART_PRESTR}4/docker\" \"./opt/docker\"\nrm -f ./etc/bench.log\ncat >>./etc/crontabs/root <<EOF\n37 5 * * * /etc/coremark.sh\nEOF\n\nsss=$(date +%s)\nddd=$((sss / 86400))\nsed -e \"s/:0:0:99999:7:::/:${ddd}:0:99999:7:::/\" -i ./etc/shadow\n# Fix the problem of repeatedly adding amule entries after each upgrade\nsed -e \"/amule:x:/d\" -i ./etc/shadow\n# Fix the problem of repeatedly adding sshd entries after each upgrade of dropbear\nsed -e \"/sshd:x:/d\" -i ./etc/shadow\nif ! grep \"sshd:x:22:sshd\" ./etc/group >/dev/null; then\n    echo \"sshd:x:22:sshd\" >>./etc/group\nfi\nif ! grep \"sshd:x:22:22:sshd:\" ./etc/passwd >/dev/null; then\n    echo \"sshd:x:22:22:sshd:/var/run/sshd:/bin/false\" >>./etc/passwd\nfi\nif ! grep \"sshd:x:\" ./etc/shadow >/dev/null; then\n    echo \"sshd:x:${ddd}:0:99999:7:::\" >>./etc/shadow\nfi\n\nif [ \"${BR_FLAG}\" -eq \"1\" ]; then\n    if [ -x ./bin/bash ] && [ -f ./etc/profile.d/30-sysinfo.sh ]; then\n        sed -e 's/\\/bin\\/ash/\\/bin\\/bash/' -i ./etc/passwd\n    fi\n    sync\nfi\nsed -e \"s/option hw_flow '1'/option hw_flow '0'/\" -i ./etc/config/turboacc\n(\n    cd etc/rc.d\n    rm -f S??shortcut-fe\n    if grep \"sfe_flow '1'\" ../config/turboacc >/dev/null; then\n        if find ../../lib/modules -name 'shortcut-fe-cm.ko'; then\n            ln -sf ../init.d/shortcut-fe S99shortcut-fe\n        fi\n    fi\n)\neval tar czf .reserved/openwrt_config.tar.gz \"${BACKUP_LIST}\" 2>/dev/null\n\nrm -f ./etc/part_size ./etc/first_run.sh\nif [ -x ./usr/sbin/balethirq.pl ]; then\n    if grep \"balethirq.pl\" \"./etc/rc.local\"; then\n        echo \"balance irq is enabled\"\n    else\n        echo \"enable balance irq\"\n        sed -e \"/exit/i\\/usr/sbin/balethirq.pl\" -i ./etc/rc.local\n    fi\nfi\n\nmv ./etc/rc.local ./etc/rc.local.orig\ncat >\"./etc/rc.local\" <<EOF\nif ! ls /etc/rc.d/S??dockerd >/dev/null 2>&1;then\n    /etc/init.d/dockerd enable\n    /etc/init.d/dockerd start\nfi\nif ! ls /etc/rc.d/S??dockerman >/dev/null 2>&1 && [ -f /etc/init.d/dockerman ];then\n    /etc/init.d/dockerman enable\n    /etc/init.d/dockerman start\nfi\nmv /etc/rc.local.orig /etc/rc.local\nchmod 755 /etc/rc.local\nexec /etc/rc.local\nexit\nEOF\nchmod 755 ./etc/rc.local*\n\n# move /etc/config/balance_irq to /etc/balance_irq\n[ -f \"./etc/config/balance_irq\" ] && mv ./etc/config/balance_irq ./etc/\n\necho \"Create etc snapshot -> .snapshots/etc-001\"\nbtrfs subvolume snapshot -r etc .snapshots/etc-001\n\ncd ${WORK_DIR}\n\necho \"Copy efi files ...\"\nfatlabel ${EFI_DEV} \"EFI\"\ncd /boot/efi\nmv ./EFI/BOOT/grub.cfg /tmp/grub.cfg.prev\nrm -rf *\ncp -a ${P1}/* .\n# 如果想启动上一个版本的openwrt,可以把 /boot/efi/EFI/BOOT/grub.cfg.prev 复制成 /boot/efi/EFI/BOOT/grub.cfg\nmv /tmp/grub.cfg.prev ./EFI/BOOT/\n\necho \"Modify efi configuration ... \"\ncd /boot/efi/EFI/BOOT\ncat >grub.cfg <<EOF\necho \"search fs_uuid ${NEW_ROOT_UUID} ...\"\nsearch.fs_uuid ${NEW_ROOT_UUID} root\necho \"root=\\$root\"\necho \"set prefix ... \"\nset prefix=(\\$root)'/boot/grub2'\necho \"prefix=\\$prefix\"\nsource \\${prefix}/grub.cfg\nEOF\n\necho \"Modify boot configuration ... \"\ncd ${NEW_ROOT_MOUNTPOINT}/boot/grub2\ncat >grub.cfg <<EOF\ninsmod gzio\ninsmod part_gpt\ninsmod zstd\ninsmod btrfs\nterminal_input console\nterminal_output console\n\nset default=\"0\"\nset timeout=3\n\nmenuentry \"OpenWrt\" {\n        echo    'Loading linux kernel ...'\n        linux /boot/vmlinuz root=UUID=${NEW_ROOT_UUID} rootfstype=btrfs rootflags=compress=zstd:${ZSTD_LEVEL} console=ttyAMA0,115200n8 no_console_suspend consoleblank=0 fsck.fix=yes fsck.repair=yes net.ifnames=0 cgroup_enable=cpuset cgroup_memory=1 cgroup_enable=memory swapaccount=1\n        echo    'Loading initial ramdisk ...'\n        initrd /boot/initrd.img\n}\nEOF\n\nsync\n\ncd $WORK_DIR\numount -f ${P1} ${P2} 2>/dev/null\nlosetup -D 2>/dev/null\nrm -rf ${P1} ${P2} 2>/dev/null\nrm -f ${IMG_NAME} 2>/dev/null\nrm -f sha256sums 2>/dev/null\nsync\nwait\n\necho \"Successfully updated, automatic restarting...\"\nsleep 3\nreboot\nexit 0\n"
  },
  {
    "path": "luci-app-amlogic/root/usr/sbin/openwrt-update-rockchip",
    "content": "#!/bin/bash\n#======================================================================================\n# Function: Update openwrt to emmc for Rockchip STB\n# Copyright (C) 2020-- https://github.com/unifreq/openwrt_packit\n# Copyright (C) 2021-- https://github.com/ophub/luci-app-amlogic\n#======================================================================================\n#\n# The script supports directly setting parameters for update, skipping interactive selection\n# openwrt-update-rockchip ${OPENWRT_FILE} ${AUTO_MAINLINE_UBOOT} ${RESTORE_CONFIG}\n# E.g: openwrt-update-rockchip openwrt_s905d.img.gz yes restore\n# E.g: openwrt-update-rockchip openwrt_s905d.img.gz no no-restore\n\n# You can also execute the script directly, and interactively select related functions\n# E.g: openwrt-update-rockchip\n#\n#======================================================================================\n\n# Encountered a serious error, abort the script execution\nerror_msg() {\n    echo -e \"[ERROR] ${1}\"\n    exit 1\n}\n\n# Get the partition name of the /boot file system\nget_boot_partition_name() {\n    local paths=\"/boot\"\n    local partition_name\n\n    partition_name=$(df \"${paths}\" | awk 'NR==2 {print $1}' | awk -F '/' '{print $3}')\n\n    echo \"${partition_name}\"\n}\n\n# Get the partition name of the root file system\nget_root_partition_name() {\n    local paths=(\"/\" \"/overlay\" \"/rom\")\n    local partition_name\n\n    for path in \"${paths[@]}\"; do\n        partition_name=$(df \"${path}\" | awk 'NR==2 {print $1}' | awk -F '/' '{print $3}')\n        [[ -n \"${partition_name}\" ]] && break\n    done\n\n    echo \"${partition_name}\"\n}\n\n# Get the partition message of the root file system\nget_root_partition_msg() {\n    local paths=(\"/\" \"/overlay\" \"/rom\")\n    local partition_name\n\n    for path in \"${paths[@]}\"; do\n        partition_msg=$(lsblk -l -o NAME,PATH,TYPE,UUID,MOUNTPOINT | awk '$3~/^part$/ && $5 ~ \"^\" \"'\"${path}\"'\" \"$\" {print $0}')\n        [[ -n \"${partition_msg}\" ]] && break\n    done\n\n    [[ -z \"${partition_msg}\" ]] && error_msg \"Cannot find the root partition message!\"\n    echo \"${partition_msg}\"\n}\n\n# Receive one-key command related parameters\nIMG_NAME=\"${1}\"\nAUTO_MAINLINE_UBOOT=\"${2}\"\nBACKUP_RESTORE_CONFIG=\"${3}\"\n\n# Current device model\nif [ -f /boot/armbianEnv.txt ]; then\n    source /boot/armbianEnv.txt 2>/dev/null\n    CURRENT_FDTFILE=$(basename ${fdtfile})\nfi\nMYDEVICE_NAME=$(cat /proc/device-tree/model | tr -d '\\000')\ncase $MYDEVICE_NAME in\n\"\")\n    error_msg \"The device name is empty and cannot be recognized.\"\n    ;;\n\n\"Chainedbox L1 Pro\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3328-l1pro-1296mhz.dtb\"\n    fi\n    SOC=\"l1pro\"\n    ;;\n\"BeikeYun\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3328-beikeyun-1296mhz.dtb\"\n    fi\n    SOC=\"beikeyun\"\n    ;;\n\"ZCuble1 Max\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3399-zcube1-max.dtb\"\n    fi\n    SOC=\"zcube1 max\"\n    ;;\n\"JP TVbox 3566\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3566-jp-tvbox.dtb\"\n    fi\n    SOC=\"jp-tvbox\"\n    ;;\n\"Radxa CM3 RPI CM4 IO\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3566-radxa-cm3-rpi-cm4-io.dtb\"\n    fi\n    SOC=\"radxa-cm3-rpi-cm4-io\"\n    ;;\n\"FastRhino R66S\" | \"Lunzn FastRhino R66S\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3568-fastrhino-r66s.dtb\"\n    fi\n    SOC=\"r66s\"\n    ;;\n\"FastRhino R68S\" | \"Lunzn FastRhino R68S\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3568-fastrhino-r68s.dtb\"\n    fi\n    SOC=\"r68s\"\n    ;;\n\"RK3568 EC-X\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3568-ec-x.dtb\"\n    fi\n    SOC=\"ec-x\"\n    ;;\n\"HINLINK OPC-H66K Board\" | \"Hlink H66K\")\n    if [ -n \"${CURRENT_FDTFILE}\" ] && [ \"${CURRENT_FDTFILE}\" != \"rk3568-opc-h66k.dtb\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3568-hlink-h66k.dtb\"\n    fi\n    SOC=\"h66k\"\n    ;;\n\"HINLINK OPC-H68K Board\" | \"Hlink H68K\")\n    if [ -n \"${CURRENT_FDTFILE}\" ] && [ \"${CURRENT_FDTFILE}\" != \"rk3568-opc-h68k.dtb\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3568-hlink-h68k.dtb\"\n    fi\n    SOC=\"h68k\"\n    ;;\n\"HINLINK OPC-H69K Board\" | \"Hlink H69K\")\n    if [ -n \"${CURRENT_FDTFILE}\" ] && [ \"${CURRENT_FDTFILE}\" != \"rk3568-opc-h69k.dtb\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3568-hlink-h69k.dtb\"\n    fi\n    SOC=\"h69k\"\n    ;;\n\"Radxa E25\" | \"Radxa E25 Carrier Board\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3568-radxa-e25.dtb\"\n    fi\n    SOC=\"e25\"\n    ;;\n\"HINLINK OWL H88K-V3 Board\" | \"Hlink H88K-V3\")\n    if [ -n \"${CURRENT_FDTFILE}\" ] && [ \"${CURRENT_FDTFILE}\" != \"rk3568-hinlink-h88k-v3.dtb\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3588-hlink-h88k-v3.dtb\"\n    fi\n    SOC=\"h88k-v3\"\n    ;;\n\"Hlink H88K V3.1\")\n    if [ -n \"${CURRENT_FDTFILE}\" ] && [ \"${CURRENT_FDTFILE}\" != \"rk3568-hinlink-h88k-v31.dtb\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3588-hlink-h88k-v31.dtb\"\n    fi\n    SOC=\"h88k-v3\"\n    ;;\n\"HINLINK OWL H88K Board\" | \"Hlink H88K\")\n    if [ -n \"${CURRENT_FDTFILE}\" ] && [ \"${CURRENT_FDTFILE}\" != \"rk3568-hinlink-h88k.dtb\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3588-hlink-h88k.dtb\"\n    fi\n    SOC=\"ak88/h88k\"\n    ;;\n\"Hlink H28K\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3528-hlink-h28k.dtb\"\n    fi\n    SOC=\"h28k\"\n    ;;\n\"Hlink HT2\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3528-hlink-ht2.dtb\"\n    fi\n    SOC=\"ht2\"\n    ;;\n\"Radxa E20C\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3528-radxa-e20c.dtb\"\n    fi\n    SOC=\"e20c\"\n    ;;\n\"Radxa E24C\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3528-radxa-e24c.dtb\"\n    fi\n    SOC=\"e24c\"\n    ;;\n\"YiXun Rs6Pro\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3528-yixun-rs6pro.dtb\"\n    fi\n    SOC=\"rs6pro\"\n    ;;\n\"Ariaboard Photonicat\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3568-photonicat.dtb\"\n    fi\n    SOC=\"photonicat\"\n    ;;\n\"NLnet Watermelon Pi V3\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3568-watermelon-pi-v3.dtb\"\n    fi\n    SOC=\"watermelon-pi-v3\"\n    ;;\n\"NLnet Watermelon Pi\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3568-watermelon-pi.dtb\"\n    fi\n    SOC=\"watermelon-pi\"\n    ;;\n\"Rockchip RK3576 DshanPi A1 Board\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3576-100ask-dshanpi-a1.dtb\"\n    fi\n    SOC=\"100ask-dshanpi-a1\"\n    ;;\n\"Radxa ROCK 5B\" | \"Radxa ROCK 5 Model B\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3588-rock-5b.dtb\"\n    fi\n    SOC=\"rock5b\"\n    ;;\n\"Radxa ROCK 5C\" | \"Radxa ROCK 5 Model C\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3588s-rock-5c.dtb\"\n    fi\n    SOC=\"rock5c\"\n    ;;\n\"Radxa E52C\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3588s-radxa-e52c.dtb\"\n    fi\n    SOC=\"e52c\"\n    ;;\n\"Radxa E54C\")\n    if [ -n \"${CURRENT_FDTFILE}\" ]; then\n        MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n    else\n        MYDTB_FDTFILE=\"rk3588s-radxa-e54c.dtb\"\n    fi\n    SOC=\"e54c\"\n    ;;\n*) #default\n    if [ -f \"/etc/flippy-openwrt-release\" ]; then\n        source /etc/flippy-openwrt-release 2>/dev/null\n        if [ -n \"${CURRENT_FDTFILE}\" ]; then\n            MYDTB_FDTFILE=\"${CURRENT_FDTFILE}\"\n        else\n            MYDTB_FDTFILE=\"${FDTFILE}\"\n        fi\n        SOC=\"${SOC}\"\n    else\n        error_msg \"Unknown device: [ ${MYDEVICE_NAME} ], Not supported.\"\n    fi\n    ;;\nesac\n\n[[ -z \"${MYDTB_FDTFILE}\" || -z \"${SOC}\" ]] && {\n    error_msg \"Invalid FDTFILE or SOC: [ ${MYDTB_FDTFILE} / ${SOC} ]\"\n}\n\necho -e \"Current device: ${MYDEVICE_NAME} [ ${SOC} ]\"\nsleep 3\n\n# Check and repair partition mount points\n[[ -z \"$(get_boot_partition_name)\" || -z \"$(get_root_partition_name)\" ]] && {\n    echo -e \"Partition mount point error, start repairing...\"\n    openwrt-backup -g\n}\n\n# Find the partition where root is located\nROOT_PTNAME=\"$(get_root_partition_name)\"\n\n# Find the disk where the partition is located, only supports mmcblk?p? sd?? hd?? vd?? and other formats\ncase ${ROOT_PTNAME} in\nmmcblk?p[1-4])\n    EMMC_NAME=$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-2)}')\n    PARTITION_NAME=\"p\"\n    LB_PRE=\"EMMC_\"\n    ;;\nnvme?n?p?)\n    EMMC_NAME=$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-2)}')\n    PARTITION_NAME=\"p\"\n    LB_PRE=\"NVME_\"\n    ;;\n[hsv]d[a-z][1-4])\n    EMMC_NAME=$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-1)}')\n    PARTITION_NAME=\"\"\n    LB_PRE=\"USB_\"\n    ;;\n*)\n    error_msg \"Unable to recognize the disk type of ${ROOT_PTNAME}!\"\n    ;;\nesac\n\ncd /mnt/${EMMC_NAME}${PARTITION_NAME}4/\nmv -f /tmp/upload/* . 2>/dev/null && sync\n\nif [[ \"${IMG_NAME}\" == *.img ]]; then\n    echo -e \"Update using [ ${IMG_NAME} ] file. Please wait a moment ...\"\nelif [ $(ls *.img -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    IMG_NAME=$(ls *.img | head -n 1)\n    echo -e \"Update using [ ${IMG_NAME} ] ] file. Please wait a moment ...\"\nelif [ $(ls *.img.xz -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    xz_file=$(ls *.img.xz | head -n 1)\n    echo -e \"Update using [ ${xz_file} ] file. Please wait a moment ...\"\n    xz -d ${xz_file} 2>/dev/null\n    IMG_NAME=$(ls *.img | head -n 1)\nelif [ $(ls *.img.gz -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    gz_file=$(ls *.img.gz | head -n 1)\n    echo -e \"Update using [ ${gz_file} ] file. Please wait a moment ...\"\n    gzip -df ${gz_file} 2>/dev/null\n    IMG_NAME=$(ls *.img | head -n 1)\nelif [ $(ls *.7z -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    gz_file=$(ls *.7z | head -n 1)\n    echo -e \"Update using [ ${gz_file} ] file. Please wait a moment ...\"\n    bsdtar -xmf ${gz_file} 2>/dev/null\n    [ $? -eq 0 ] || 7z x ${gz_file} -aoa -y 2>/dev/null\n    IMG_NAME=$(ls *.img | head -n 1)\nelif [ $(ls *.zip -l 2>/dev/null | grep \"^-\" | wc -l) -ge 1 ]; then\n    zip_file=$(ls *.zip | head -n 1)\n    echo -e \"Update using [ ${zip_file} ] file. Please wait a moment ...\"\n    unzip -o ${zip_file} 2>/dev/null\n    IMG_NAME=$(ls *.img | head -n 1)\nelse\n    echo -e \"Please upload or specify the update openwrt firmware file.\"\n    echo -e \"Upload method: system menu → Amlogic Service → Manually Upload Update\"\n    echo -e \"Specify method: Place the openwrt firmware file in [ /mnt/${EMMC_NAME}${PARTITION_NAME}4/ ]\"\n    echo -e \"The supported file suffixes are: *.img, *.img.xz, *.img.gz, *.7z, *.zip\"\n    echo -e \"After upload the openwrt firmware file, run again.\"\n    exit 1\nfi\nsync\n\n# check file\nif [ ! -f \"${IMG_NAME}\" ]; then\n    error_msg \"No update file found.\"\nelse\n    echo \"Start update from [ ${IMG_NAME} ]\"\nfi\n\n# find boot partition\nBOOT_PART_MSG=$(lsblk -l -o NAME,PATH,TYPE,UUID,MOUNTPOINT | awk '$3~/^part$/ && $5 ~ /^\\/boot$/ {print $0}')\nif [ \"${BOOT_PART_MSG}\" == \"\" ]; then\n    error_msg \"The boot partition is not exists or not mounted, so it cannot be upgraded with this script!\"\nfi\n\nBR_FLAG=1\necho -ne \"Whether to backup and restore the current config files? y/n [y]\\b\\b\"\nif [[ ${BACKUP_RESTORE_CONFIG} == \"restore\" ]]; then\n    yn=\"y\"\nelif [[ ${BACKUP_RESTORE_CONFIG} == \"no-restore\" ]]; then\n    yn=\"n\"\nelse\n    read yn\nfi\ncase ${yn} in\nn* | N*)\n    BR_FLAG=0\n    ;;\nesac\n\nBOOT_NAME=$(echo ${BOOT_PART_MSG} | awk '{print $1}')\nBOOT_PATH=$(echo ${BOOT_PART_MSG} | awk '{print $2}')\nBOOT_UUID=$(echo ${BOOT_PART_MSG} | awk '{print $4}')\n\n# find root partition\nROOT_PART_MSG=\"$(get_root_partition_msg)\"\nROOT_NAME=$(echo ${ROOT_PART_MSG} | awk '{print $1}')\nROOT_PATH=$(echo ${ROOT_PART_MSG} | awk '{print $2}')\nROOT_UUID=$(echo ${ROOT_PART_MSG} | awk '{print $4}')\ncase ${ROOT_NAME} in\n${EMMC_NAME}${PARTITION_NAME}2)\n    NEW_ROOT_NAME=\"${EMMC_NAME}${PARTITION_NAME}3\"\n    NEW_ROOT_LABEL=\"${LB_PRE}ROOTFS2\"\n    ;;\n${EMMC_NAME}${PARTITION_NAME}3)\n    NEW_ROOT_NAME=\"${EMMC_NAME}${PARTITION_NAME}2\"\n    NEW_ROOT_LABEL=\"${LB_PRE}ROOTFS1\"\n    ;;\n*)\n    error_msg \"The root partition location is invalid, so it cannot be upgraded with this script!\"\n    ;;\nesac\n\n# find new root partition\nNEW_ROOT_PART_MSG=$(lsblk -l -o NAME,PATH,TYPE,UUID,MOUNTPOINT | grep \"${NEW_ROOT_NAME}\" | awk '$3 ~ /^part$/ && $5 !~ /^\\/$/ && $5 !~ /^\\/boot$/ {print $0}')\nif [ \"${NEW_ROOT_PART_MSG}\" == \"\" ]; then\n    error_msg \"The new root partition is not exists, so it cannot be upgraded with this script!\"\nfi\nNEW_ROOT_NAME=$(echo ${NEW_ROOT_PART_MSG} | awk '{print $1}')\nNEW_ROOT_PATH=$(echo ${NEW_ROOT_PART_MSG} | awk '{print $2}')\nNEW_ROOT_UUID=$(echo ${NEW_ROOT_PART_MSG} | awk '{print $4}')\nNEW_ROOT_MP=$(echo ${NEW_ROOT_PART_MSG} | awk '{print $5}')\n\n# losetup\nlosetup -f -P ${IMG_NAME}\nif [[ \"${?}\" -eq \"0\" ]]; then\n    LOOP_DEV=$(losetup | grep \"${IMG_NAME}\" | awk '{print $1}')\n    if [ \"$LOOP_DEV\" == \"\" ]; then\n        error_msg \"loop device not found!\"\n    fi\nelse\n    error_msg \"losetup ${IMG_FILE} failed!\"\nfi\n\n# fix loopdev issue in kernel 5.19\nfunction fix_loopdev() {\n    local parentdev=${1##*/}\n    if [ ! -d /sys/block/${parentdev} ]; then\n        return\n    fi\n    subdevs=$(lsblk -l -o NAME | grep -E \"^${parentdev}.+\\$\")\n    for subdev in ${subdevs}; do\n        if [ ! -d /sys/block/${parentdev}/${subdev} ]; then\n            return\n        elif [ -b /dev/${sub_dev} ]; then\n            continue\n        fi\n        source /sys/block/${parentdev}/${subdev}/uevent\n        mknod /dev/${subdev} b ${MAJOR} ${MINOR}\n        unset MAJOR MINOR DEVNAME DEVTYPE DISKSEQ PARTN PARTNAME\n    done\n}\nfix_loopdev ${LOOP_DEV}\n\nWAIT=3\necho -n \"The loopdev is ${LOOP_DEV}, wait ${WAIT} seconds \"\nwhile [ ${WAIT} -ge 1 ]; do\n    echo -n \".\"\n    sleep 1\n    WAIT=$((WAIT - 1))\ndone\necho\n\n# umount loop devices (openwrt will auto mount some partition)\nMOUNTED_DEVS=$(lsblk -l -o NAME,PATH,MOUNTPOINT | grep \"${LOOP_DEV}\" | awk '$3 !~ /^$/ {print $2}')\nfor dev in ${MOUNTED_DEVS}; do\n    while :; do\n        echo -n \"umount ${dev} ... \"\n        umount -f ${dev}\n        sleep 1\n        mnt=$(lsblk -l -o NAME,PATH,MOUNTPOINT | grep \"${dev}\" | awk '$3 !~ /^$/ {print $2}')\n        if [ \"${mnt}\" == \"\" ]; then\n            echo \"ok\"\n            break\n        else\n            echo \"try again ...\"\n        fi\n    done\ndone\n\n# mount src part\nWORK_DIR=${PWD}\nP1=${WORK_DIR}/boot\nP2=${WORK_DIR}/root\nmkdir -p $P1 $P2\necho -n \"mount ${LOOP_DEV}p1 -> ${P1} ... \"\nmount -t ext4 -o ro ${LOOP_DEV}p1 ${P1}\nif [[ \"${?}\" -ne \"0\" ]]; then\n    echo \"mount failed\"\n    losetup -D\n    exit 1\nelse\n    echo \"ok\"\nfi\n\necho -n \"mount ${LOOP_DEV}p2 -> ${P2} ... \"\nZSTD_LEVEL=6\nmount -t btrfs -o ro,compress=zstd:${ZSTD_LEVEL} ${LOOP_DEV}p2 ${P2}\nif [[ \"${?}\" -ne \"0\" ]]; then\n    echo \"mount failed\"\n    umount -f ${P1}\n    losetup -D\n    exit 1\nelse\n    echo \"ok\"\nfi\n\n# Prepare the dockerman config file\nif [ -f ${P2}/etc/init.d/dockerman ] && [ -f ${P2}/etc/config/dockerd ]; then\n\n    flg=0\n    # get current docker data root\n    data_root=$(uci get dockerd.globals.data_root 2>/dev/null)\n    if [ \"${data_root}\" == \"\" ]; then\n        flg=1\n        # get current config from /etc/docker/daemon.json\n        if [ -f \"/etc/docker/daemon.json\" ] && [ -x \"/usr/bin/jq\" ]; then\n            data_root=$(jq -r '.\"data-root\"' /etc/docker/daemon.json)\n\n            bip=$(jq -r '.\"bip\"' /etc/docker/daemon.json)\n            [ \"${bip}\" == \"null\" ] && bip=\"172.31.0.1/24\"\n\n            log_level=$(jq -r '.\"log-level\"' /etc/docker/daemon.json)\n            [ \"${log_level}\" == \"null\" ] && log_level=\"warn\"\n\n            _iptables=$(jq -r '.\"iptables\"' /etc/docker/daemon.json)\n            [ \"${_iptables}\" == \"null\" ] && _iptables=\"true\"\n\n            registry_mirrors=$(jq -r '.\"registry-mirrors\"[]' /etc/docker/daemon.json 2>/dev/null)\n        fi\n    fi\n\n    if [ \"${data_root}\" == \"\" ]; then\n        data_root=\"/opt/docker/\" # the default data root\n    fi\n\n    if ! uci get dockerd.globals >/dev/null 2>&1; then\n        uci set dockerd.globals='globals'\n        uci commit\n    fi\n\n    # delete alter config , use inner config\n    if uci get dockerd.globals.alt_config_file >/dev/null 2>&1; then\n        uci delete dockerd.globals.alt_config_file\n        uci commit\n    fi\n\n    if [[ \"${flg}\" -eq \"1\" ]]; then\n        uci set dockerd.globals.data_root=${data_root}\n        [ \"${bip}\" != \"\" ] && uci set dockerd.globals.bip=${bip}\n        [ \"${log_level}\" != \"\" ] && uci set dockerd.globals.log_level=${log_level}\n        [ \"${_iptables}\" != \"\" ] && uci set dockerd.globals.iptables=${_iptables}\n        if [ \"${registry_mirrors}\" != \"\" ]; then\n            for reg in ${registry_mirrors}; do\n                uci add_list dockerd.globals.registry_mirrors=${reg}\n            done\n        fi\n        uci set dockerd.globals.auto_start='1'\n        uci commit\n    fi\nfi\n\n#format NEW_ROOT\necho \"umount ${NEW_ROOT_MP}\"\numount -f \"${NEW_ROOT_MP}\"\nif [[ \"${?}\" -ne \"0\" ]]; then\n    echo \"umount failed, please reboot and try again!\"\n    umount -f ${P1}\n    umount -f ${P2}\n    losetup -D\n    exit 1\nfi\n\necho \"format ${NEW_ROOT_PATH}\"\nNEW_ROOT_UUID=$(uuidgen)\nmkfs.btrfs -f -U ${NEW_ROOT_UUID} -L ${NEW_ROOT_LABEL} -m single ${NEW_ROOT_PATH}\nif [[ \"${?}\" -ne \"0\" ]]; then\n    echo \"format ${NEW_ROOT_PATH} failed!\"\n    umount -f ${P1}\n    umount -f ${P2}\n    losetup -D\n    exit 1\nfi\n\necho \"mount ${NEW_ROOT_PATH} to ${NEW_ROOT_MP}\"\nmount -t btrfs -o compress=zstd:${ZSTD_LEVEL} ${NEW_ROOT_PATH} ${NEW_ROOT_MP}\nif [[ \"${?}\" -ne \"0\" ]]; then\n    echo \"mount ${NEW_ROOT_PATH} to ${NEW_ROOT_MP} failed!\"\n    umount -f ${P1}\n    umount -f ${P2}\n    losetup -D\n    exit 1\nfi\n\n# begin copy rootfs\ncd ${NEW_ROOT_MP}\necho \"Start copy data from ${P2} to ${NEW_ROOT_MP} ...\"\nENTRYS=$(ls)\nfor entry in ${ENTRYS}; do\n    if [ \"${entry}\" == \"lost+found\" ]; then\n        continue\n    fi\n    echo -n \"remove old ${entry} ... \"\n    rm -rf ${entry}\n    if [ $? -eq 0 ]; then\n        echo \"ok\"\n    else\n        echo \"failed\"\n        exit 1\n    fi\ndone\necho\n\necho \"create etc subvolume ...\"\nbtrfs subvolume create etc\necho -n \"make dirs ... \"\nmkdir -p .snapshots .reserved bin boot dev lib opt mnt overlay proc rom root run sbin sys tmp usr www\nln -sf lib/ lib64\nln -sf tmp/ var\necho \"done\"\necho\n\nCOPY_SRC=\"root etc bin sbin lib opt usr www\"\necho \"copy data ... \"\nfor src in ${COPY_SRC}; do\n    echo -n \"copy ${src} ... \"\n    (cd ${P2} && tar cf - ${src}) | tar xf -\n    sync\n    echo \"done\"\ndone\n\nSHFS=\"/mnt/${EMMC_NAME}${PARTITION_NAME}4\"\necho \"Modify config files ... \"\nif [ -x ./usr/sbin/balethirq.pl ]; then\n    if grep \"balethirq.pl\" \"./etc/rc.local\"; then\n        echo \"balance irq is enabled\"\n    else\n        echo \"enable balance irq\"\n        sed -e \"/exit/i\\/usr/sbin/balethirq.pl\" -i ./etc/rc.local\n    fi\nfi\n\nrm -f ./etc/bench.log\ncat >./etc/fstab <<EOF\nUUID=${NEW_ROOT_UUID} / btrfs compress=zstd:${ZSTD_LEVEL} 0 1\nUUID=${BOOT_UUID} /boot ext4 defaults 0 2\n#tmpfs /tmp tmpfs defaults,nosuid 0 0\nEOF\n\ncat >./etc/config/fstab <<EOF\nconfig global\n        option anon_swap '0'\n        option anon_mount '1'\n        option auto_swap '0'\n        option auto_mount '1'\n        option delay_root '5'\n        option check_fs '0'\n\nconfig mount\n        option target '/rom'\n        option uuid '${NEW_ROOT_UUID}'\n        option enabled '1'\n        option enabled_fsck '1'\n        option fstype 'btrfs'\n        option options 'compress=zstd:${ZSTD_LEVEL}'\n\nconfig mount\n        option target '/boot'\n        option uuid '${BOOT_UUID}'\n        option enabled '1'\n        option enabled_fsck '0'\n        option fstype 'ext4'\n\nEOF\n(\n    cd etc/rc.d\n    rm -f S??shortcut-fe\n    if grep \"sfe_flow '1'\" ../config/turboacc >/dev/null; then\n        if find ../../lib/modules -name 'shortcut-fe-cm.ko'; then\n            ln -sf ../init.d/shortcut-fe S99shortcut-fe\n        fi\n    fi\n)\n# move /etc/config/balance_irq to /etc/balance_irq\n[ -f \"./etc/config/balance_irq\" ] && mv ./etc/config/balance_irq ./etc/\nsync\n\necho \"create the first etc snapshot -> .snapshots/etc-000\"\nbtrfs subvolume snapshot -r etc .snapshots/etc-000\n\n[ -d ${SHFS}/docker ] || mkdir -p ${SHFS}/docker\nrm -rf opt/docker && ln -sf ${SHFS}/docker/ opt/docker\n\nif [ -f /mnt/${NEW_ROOT_NAME}/etc/config/AdGuardHome ]; then\n    [ -d ${SHFS}/AdGuardHome/data ] || mkdir -p ${SHFS}/AdGuardHome/data\n    if [ ! -L /usr/bin/AdGuardHome ]; then\n        [ -d /usr/bin/AdGuardHome ] &&\n            cp -a /usr/bin/AdGuardHome/* ${SHFS}/AdGuardHome/\n    fi\n    ln -sf ${SHFS}/AdGuardHome /mnt/${NEW_ROOT_NAME}/usr/bin/AdGuardHome\nfi\n\nsync\necho \"copy done\"\necho\n\nBACKUP_LIST=$(${P2}/usr/sbin/openwrt-backup -p)\nif [ $BR_FLAG -eq 1 ]; then\n    echo -n \"Restore your old config files ... \"\n    (\n        cd /\n        eval tar czf ${NEW_ROOT_MP}/.reserved/openwrt_config.tar.gz \"${BACKUP_LIST}\" 2>/dev/null\n    )\n    tar xzf ${NEW_ROOT_MP}/.reserved/openwrt_config.tar.gz\n    [ -f ./etc/config/dockerman ] && sed -e \"s/option wan_mode 'false'/option wan_mode 'true'/\" -i ./etc/config/dockerman 2>/dev/null\n    [ -f ./etc/config/dockerd ] && sed -e \"s/option wan_mode '0'/option wan_mode '1'/\" -i ./etc/config/dockerd 2>/dev/null\n    [ -f ./etc/config/verysync ] && sed -e 's/config setting/config verysync/' -i ./etc/config/verysync\n\n    # 还原 fstab\n    cp -f .snapshots/etc-000/fstab ./etc/fstab\n    cp -f .snapshots/etc-000/config/fstab ./etc/config/fstab\n    # 还原 luci\n    cp -f .snapshots/etc-000/config/luci ./etc/config/luci\n    # 还原/etc/config/rpcd\n    cp -f .snapshots/etc-000/config/rpcd ./etc/config/rpcd\n\n    sync\n    echo \"done\"\n    echo\nfi\n\ncat >>./etc/crontabs/root <<EOF\n17 3 * * * /etc/coremark.sh\nEOF\n\nsed -e 's/ttyAMA0/ttyS2/' -i ./etc/inittab\n\n[ \"${SOC}\" != \"h28k\" ] && \\\n[ \"${SOC}\" != \"h29k\" ] && \\\n[ \"${SOC}\" != \"ht2\" ] && \\\n[ \"${SOC}\" != \"e20c\" ] && \\\n[ \"${SOC}\" != \"e24c\" ] && \\\n    sed -e 's/ttyS0/tty1/' -i ./etc/inittab\n\nsss=$(date +%s)\nddd=$((sss / 86400))\nsed -e \"s/:0:0:99999:7:::/:${ddd}:0:99999:7:::/\" -i ./etc/shadow\n# 修复amule每次升级后重复添加条目的问题\nsed -e \"/amule:x:/d\" -i ./etc/shadow\n# 修复dropbear每次升级后重复添加sshd条目的问题\nsed -e \"/sshd:x:/d\" -i ./etc/shadow\nif ! grep \"sshd:x:22:sshd\" ./etc/group >/dev/null; then\n    echo \"sshd:x:22:sshd\" >>./etc/group\nfi\nif ! grep \"sshd:x:22:22:sshd:\" ./etc/passwd >/dev/null; then\n    echo \"sshd:x:22:22:sshd:/var/run/sshd:/bin/false\" >>./etc/passwd\nfi\nif ! grep \"sshd:x:\" ./etc/shadow >/dev/null; then\n    echo \"sshd:x:${ddd}:0:99999:7:::\" >>./etc/shadow\nfi\n\nif [ $BR_FLAG -eq 1 ]; then\n    if [ -x ./bin/bash ] && [ -f ./etc/profile.d/30-sysinfo.sh ]; then\n        sed -e 's/\\/bin\\/ash/\\/bin\\/bash/' -i ./etc/passwd\n    fi\n    sync\n    echo \"done\"\n    echo\nfi\nsed -e \"s/option hw_flow '1'/option hw_flow '0'/\" -i ./etc/config/turboacc\n(\n    cd etc/rc.d\n    rm -f S??shortcut-fe\n    if grep \"sfe_flow '1'\" ../config/turboacc >/dev/null; then\n        if find ../../lib/modules -name 'shortcut-fe-cm.ko'; then\n            ln -sf ../init.d/shortcut-fe S99shortcut-fe\n        fi\n    fi\n)\n\n# move /etc/config/balance_irq to /etc/balance_irq\n[ -f \"./etc/config/balance_irq\" ] && mv ./etc/config/balance_irq ./etc/\n\nrm -f \"./etc/rc.local.orig\" \"./etc/first_run.sh\" \"./etc/part_size\"\n\neval tar czf .reserved/openwrt_config.tar.gz \"${BACKUP_LIST}\" 2>/dev/null\nsync\n\nmv ./etc/rc.local ./etc/rc.local.orig\ncat >\"./etc/rc.local\" <<EOF\nif ! ls /etc/rc.d/S??dockerd >/dev/null 2>&1;then\n    /etc/init.d/dockerd enable\n    /etc/init.d/dockerd start\nfi\nif ! ls /etc/rc.d/S??dockerman >/dev/null 2>&1 && [ -f /etc/init.d/dockerman ];then\n    /etc/init.d/dockerman enable\n    /etc/init.d/dockerman start\nfi\nmv /etc/rc.local.orig /etc/rc.local\nchmod 755 /etc/rc.local\nexec /etc/rc.local\nexit\nEOF\nchmod 755 ./etc/rc.local*\n\necho \"create the second etc snapshot -> .snapshots/etc-001\"\nbtrfs subvolume snapshot -r etc .snapshots/etc-001\n\n# 2021.04.01添加\n# 强制锁定fstab,防止用户擅自修改挂载点\n# 开启了快照功能之后，不再需要锁定fstab\n#chattr +ia ./etc/config/fstab\n\ncd ${WORK_DIR}\n\necho \"Start copy data from ${P2} to /boot ...\"\ncd /boot\necho -n \"backup armbianEnv.txt ...\"\ncp armbianEnv.txt /tmp/\necho -n \"backup current dtb file ...\"\ncp -v dtb/rockchip/${CURRENT_FDTFILE} /tmp/\necho -n \"remove old boot files ...\"\nrm -rf *\necho \"done\"\necho -n \"copy new boot files ... \"\n(cd ${P1} && tar cf - .) | tar xf -\nsync\necho \"done\"\necho\n\necho -n \"Update boot args ... \"\n\nif [ -f /tmp/armbianEnv.txt ]; then\n    ORIG_OVERLAYS=$(grep '^overlays=' /tmp/armbianEnv.txt)\n    ORIG_USER_OVERLAYS=$(grep '^user_overlays=' /tmp/armbianEnv.txt)\n    sed -e '/user_overlays=/d' -i armbianEnv.txt\n    sed -e '/overlays=/d' -i armbianEnv.txt\n    echo \"$ORIG_OVERLAYS\" >>armbianEnv.txt\n    echo \"$ORIG_USER_OVERLAYS\" >>armbianEnv.txt\nfi\n\nsed -e '/fdtfile=/d' -i armbianEnv.txt\nsed -e '/rootdev=/d' -i armbianEnv.txt\nsed -e '/rootfstype=/d' -i armbianEnv.txt\nsed -e '/rootflags=/d' -i armbianEnv.txt\ncase $SOC in\nl1pro | beikeyun)\n    echo \"fdtfile=/dtb/rockchip/${MYDTB_FDTFILE}\" >>armbianEnv.txt\n    ;;\n*)\n    echo \"fdtfile=rockchip/${MYDTB_FDTFILE}\" >>armbianEnv.txt\n    ;;\nesac\ncat >>armbianEnv.txt <<EOF\nrootdev=UUID=${NEW_ROOT_UUID}\nrootfstype=btrfs\nrootflags=compress=zstd:${ZSTD_LEVEL}\nEOF\n\n# Replace the UUID for extlinux/extlinux.conf if it exists\n[[ -f \"extlinux/extlinux.conf\" ]] && {\n    sed -i -E \"s|UUID=[^ ]*|UUID=${NEW_ROOT_UUID}|\" extlinux/extlinux.conf 2>/dev/null\n}\n\n# 如果新的dtb文件不存在,则用旧的代替\nif [ ! -f \"dtb/rockchip/${MYDTB_FDTFILE}\" ]; then\n    echo \"The new dtb file does not exist, replace it with the old one.\"\n    cp -v /tmp/${CURRENT_FDTFILE} dtb/rockchip/${MYDTB_FDTFILE}\nfi\nsync\n\necho \"done\"\necho\n\ncd $WORK_DIR\numount -f ${P1} ${P2} 2>/dev/null\nlosetup -D 2>/dev/null\nrmdir ${P1} ${P2} 2>/dev/null\nrm -f ${IMG_NAME} 2>/dev/null\nrm -f sha256sums 2>/dev/null\nsync\n\necho \"Successfully updated, automatic restarting...\"\nsleep 3\nreboot\nexit 0\n"
  },
  {
    "path": "luci-app-amlogic/root/usr/share/amlogic/amlogic_check_firmware.sh",
    "content": "#!/bin/bash\n#==================================================================\n# This file is licensed under the terms of the GNU General Public\n# License version 2. This program is licensed \"as is\" without any\n# warranty of any kind, whether express or implied.\n#\n# This file is a part of the luci-app-amlogic plugin\n# https://github.com/ophub/luci-app-amlogic\n#\n# Description: Check and update OpenWrt firmware\n# Copyright (C) 2021- https://github.com/unifreq/openwrt_packit\n# Copyright (C) 2021- https://github.com/ophub/luci-app-amlogic\n#==================================================================\n\n# Set a fixed value\ncheck_option=\"${1}\"\ndownload_version=\"${2}\"\nTMP_CHECK_DIR=\"/tmp/amlogic\"\nAMLOGIC_SOC_FILE=\"/etc/flippy-openwrt-release\"\nSTART_LOG=\"${TMP_CHECK_DIR}/amlogic_check_firmware.log\"\nRUNNING_LOG=\"${TMP_CHECK_DIR}/amlogic_running_script.log\"\nLOG_FILE=\"${TMP_CHECK_DIR}/amlogic.log\"\nsupport_platform=(\"allwinner\" \"rockchip\" \"amlogic\" \"qemu-aarch64\")\nLOGTIME=\"$(date \"+%Y-%m-%d %H:%M:%S\")\"\n[[ -d ${TMP_CHECK_DIR} ]] || mkdir -p ${TMP_CHECK_DIR}\n\n# Clean the running log\nclean_running() {\n    echo -e '' >${RUNNING_LOG} 2>/dev/null && sync\n}\n\n# Add log\ntolog() {\n    echo -e \"${1}\" >${START_LOG}\n    echo -e \"${LOGTIME} ${1}\" >>${LOG_FILE}\n    [[ -n \"${2}\" && \"${2}\" -eq \"1\" ]] && clean_running && exit 1\n}\n\n# Get the partition name of the root file system\nget_root_partition_name() {\n    local paths=(\"/\" \"/overlay\" \"/rom\")\n    local partition_name\n\n    for path in \"${paths[@]}\"; do\n        partition_name=$(df \"${path}\" | awk 'NR==2 {print $1}' | awk -F '/' '{print $3}')\n        [[ -n \"${partition_name}\" ]] && break\n    done\n\n    [[ -z \"${partition_name}\" ]] && tolog \"Cannot find the root partition!\" \"1\"\n    echo \"${partition_name}\"\n}\n\n# Check running scripts, prohibit running concurrently\nthis_running_log=\"3@OpenWrt update in progress, try again later!\"\nrunning_script=\"$(cat ${RUNNING_LOG} 2>/dev/null | xargs)\"\nif [[ -n \"${running_script}\" ]]; then\n    run_num=\"$(echo \"${running_script}\" | awk -F \"@\" '{print $1}')\"\n    run_log=\"$(echo \"${running_script}\" | awk -F \"@\" '{print $2}')\"\nfi\nif [[ -n \"${run_log}\" && \"${run_num}\" -ne \"3\" ]]; then\n    echo -e \"${run_log}\" >${START_LOG} 2>/dev/null && sync && exit 1\nelse\n    echo -e \"${this_running_log}\" >${RUNNING_LOG} 2>/dev/null && sync\nfi\n\n# Find the partition where root is located\nROOT_PTNAME=\"$(get_root_partition_name)\"\n\n# Find the disk where the partition is located, only supports mmcblk?p? sd?? hd?? vd?? and other formats\ncase \"${ROOT_PTNAME}\" in\nmmcblk?p[1-4])\n    EMMC_NAME=\"$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-2)}')\"\n    PARTITION_NAME=\"p\"\n    ;;\n[hsv]d[a-z][1-4])\n    EMMC_NAME=\"$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-1)}')\"\n    PARTITION_NAME=\"\"\n    ;;\nnvme?n?p[1-4])\n    EMMC_NAME=\"$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-2)}')\"\n    PARTITION_NAME=\"p\"\n    ;;\n*)\n    tolog \"Unable to recognize the disk type of ${ROOT_PTNAME}!\" \"1\"\n    ;;\nesac\n\n# Set the default download path\nFIRMWARE_DOWNLOAD_PATH=\"/mnt/${EMMC_NAME}${PARTITION_NAME}4\"\n[ -d \"${FIRMWARE_DOWNLOAD_PATH}/.luci-app-amlogic\" ] || mkdir -p \"${FIRMWARE_DOWNLOAD_PATH}/.luci-app-amlogic\"\n\n# Check release file\nif [[ -s \"${AMLOGIC_SOC_FILE}\" ]]; then\n    source \"${AMLOGIC_SOC_FILE}\" 2>/dev/null\n    PLATFORM=\"${PLATFORM}\"\n    BOARD=\"${BOARD}\"\nelse\n    tolog \"${AMLOGIC_SOC_FILE} file is missing!\" \"1\"\nfi\nif [[ -z \"${PLATFORM}\" || -z \"$(echo \"${support_platform[@]}\" | grep -w \"${PLATFORM}\")\" || -z \"${BOARD}\" ]]; then\n    tolog \"Missing [ PLATFORM / BOARD ] value in ${AMLOGIC_SOC_FILE} file.\" \"1\"\nfi\n\ntolog \"PLATFORM: [ ${PLATFORM} ], BOARD: [ ${BOARD} ], Use in [ ${EMMC_NAME} ]\"\nsleep 2\n\n# 01. Query local version information\ntolog \"01. Query version information...\"\n# 01.01 Query the current version\ncurrent_kernel_v=\"$(uname -r 2>/dev/null | grep -oE '^[1-9].[0-9]{1,3}.[0-9]+')\"\ntolog \"01.01 current version: ${current_kernel_v}\"\nsleep 2\n\n# 01.01 Version comparison\nmain_line_version=\"$(echo ${current_kernel_v} | awk -F '.' '{print $1\".\"$2}')\"\n\n# 01.02. Query the selected branch in the settings\nserver_kernel_branch=\"$(uci get amlogic.config.amlogic_kernel_branch 2>/dev/null | grep -oE '^[1-9].[0-9]{1,3}')\"\nif [[ -z \"${server_kernel_branch}\" ]]; then\n    server_kernel_branch=\"${main_line_version}\"\n    uci set amlogic.config.amlogic_kernel_branch=\"${main_line_version}\" 2>/dev/null\n    uci commit amlogic 2>/dev/null\nfi\nif [[ \"${server_kernel_branch}\" != \"${main_line_version}\" ]]; then\n    main_line_version=\"${server_kernel_branch}\"\n    tolog \"01.02 Select branch: ${main_line_version}\"\n    sleep 2\nfi\n\n# 01.03. Download server version documentation\nserver_firmware_url=\"$(uci get amlogic.config.amlogic_firmware_repo 2>/dev/null)\"\n[[ ! -z \"${server_firmware_url}\" ]] || tolog \"01.03 The custom firmware download repo is invalid.\" \"1\"\nreleases_tag_keywords=\"$(uci get amlogic.config.amlogic_firmware_tag 2>/dev/null)\"\n[[ ! -z \"${releases_tag_keywords}\" ]] || tolog \"01.04 The custom firmware tag keywords is invalid.\" \"1\"\nfirmware_suffix=\"$(uci get amlogic.config.amlogic_firmware_suffix 2>/dev/null)\"\n[[ ! -z \"${firmware_suffix}\" ]] || tolog \"01.05 The custom firmware suffix is invalid.\" \"1\"\n\nif [[ \"${server_firmware_url}\" == http* ]]; then\n    server_firmware_url=\"${server_firmware_url#*com\\/}\"\nfi\n\n# 02. Check Updated\ncheck_updated() {\n    tolog \"02.01 Search for tags in the first 5 pages of releases...\"\n\n    # Get the tags list\n    firmware_tags_array=()\n    for i in {1..5}; do\n        while IFS= read -r firmware_tags_name; do\n            firmware_tags_name=\"$(echo \"${firmware_tags_name}\" | sed 's/releases\\/tag\\///g')\"\n            if [[ -n \"${firmware_tags_name}\" ]]; then\n                firmware_tags_array+=(\"${firmware_tags_name}\")\n            fi\n        done < <(\n            curl -fsSL -m 10 \\\n                https://github.com/${server_firmware_url}/releases?page=${i} |\n                grep -oE 'releases/tag/([^\" ]+)'\n        )\n    done\n\n    if [[ \"${#firmware_tags_array[*]}\" -eq \"0\" ]]; then\n        tolog \"02.01.01 Unable to retrieve a list of firmware tags.\" \"1\"\n    fi\n\n    tolog \"02.02 Search for tags containing the keyword...\"\n\n    # Search for tags containing the keyword\n    for i in \"${firmware_tags_array[@]}\"; do\n        if [[ \"${i}\" == *\"${releases_tag_keywords}\"* ]]; then\n            firmware_releases_tag=\"${i}\"\n            break\n        fi\n    done\n\n    if [[ -n \"${firmware_releases_tag}\" ]]; then\n        tolog \"02.02.01 Tags: ${firmware_releases_tag}\"\n        sleep 2\n    else\n        tolog \"02.02.01 No matching tags found.\" \"1\"\n    fi\n\n    tolog \"02.03 Start searching for firmware download links...\"\n\n    # Retrieve the HTML code of the tags list page\n    html_code=\"$(\n        curl -fsSL -m 10 \\\n            https://github.com/${server_firmware_url}/releases/expanded_assets/${firmware_releases_tag}\n    )\"\n\n    # Set the regular expression for the OpenWrt filename\n    op_file_pattern=\".*_${BOARD}_.*k${main_line_version}\\.[0-9]+.*${firmware_suffix}\"\n    # Find the <li> list item where the OpenWrt file is located\n    li_block=$(awk -v pattern=\"${op_file_pattern}\" -v RS='</li>' '$0 ~ pattern { print $0 \"</li>\"; exit }' <<<\"${html_code}\")\n    [[ -z \"${li_block}\" ]] && tolog \"02.03.01 No matching download links found.\" \"1\"\n\n    # Find the OpenWrt filename\n    latest_url=$(echo \"${li_block}\" | grep -oE \"/[^\\\"]*_${BOARD}_.*k${main_line_version}\\.[0-9]+[^\\\"]*${firmware_suffix}\" | sort -urV | head -n 1 | xargs basename 2>/dev/null)\n    tolog \"02.03.02 OpenWrt file: ${latest_url}\"\n\n    # Find the date of the latest update\n    latest_updated_at=$(echo \"${li_block}\" | grep -o 'datetime=\"[^\"]*\"' | sed 's/datetime=\"//; s/\"//')\n    tolog \"02.03.03 Latest updated at: ${latest_updated_at}\"\n    # Format the date for display\n    date_display_format=\"$(echo ${latest_updated_at} | tr 'T' '(' | tr 'Z' ')')\"\n    [[ -z \"${latest_url}\" || -z \"${latest_updated_at}\" ]] && tolog \"02.03.04 The download URL or date is invalid.\" \"1\"\n\n    # Find the firmware sha256 value\n    latest_firmware_sha256=\"$(echo \"${li_block}\" | grep -o 'value=\"sha256:[^\"]*' | sed 's/value=\"sha256://')\"\n    tolog \"02.03.05 OpenWrt sha256: ${latest_firmware_sha256}\"\n\n    # Check the firmware update code\n    down_check_code=\"${latest_updated_at}.${main_line_version}\"\n    op_release_code=\"${FIRMWARE_DOWNLOAD_PATH}/.luci-app-amlogic/op_release_code\"\n    if [[ -s \"${op_release_code}\" ]]; then\n        update_check_code=\"$(cat ${op_release_code} | xargs)\"\n        if [[ -n \"${update_check_code}\" && \"${update_check_code}\" == \"${down_check_code}\" ]]; then\n            tolog \"02.04 Already the latest version, no need to update.\" \"1\"\n        fi\n    fi\n\n    # Prompt to update\n    if [[ -n \"${latest_url}\" ]]; then\n        tolog '<input type=\"button\" class=\"cbi-button cbi-button-reload\" value=\"Download\" onclick=\"return b_check_firmware(this, '\"'download_${latest_updated_at}@${firmware_releases_tag}/${latest_url}@${latest_firmware_sha256}'\"')\"/> Latest updated: '${date_display_format}'' \"1\"\n    else\n        tolog \"02.05 No OpenWrt available, please use another kernel branch.\" \"1\"\n    fi\n\n    exit 0\n}\n\n# 03. Download Openwrt\ndownload_firmware() {\n    tolog \"03. Start download the Openwrt...\"\n\n    # Get the openwrt firmware download path\n    if [[ \"${download_version}\" == \"download_\"* ]]; then\n        tolog \"03.01 Start downloading...\"\n    else\n        tolog \"03.01 Invalid parameter.\" \"1\"\n    fi\n\n    # Delete other residual firmware files\n    rm -f ${FIRMWARE_DOWNLOAD_PATH}/*${firmware_suffix} 2>/dev/null && sync\n    rm -f ${FIRMWARE_DOWNLOAD_PATH}/*.img 2>/dev/null && sync\n    rm -f ${FIRMWARE_DOWNLOAD_PATH}/sha256sums 2>/dev/null && sync\n\n    # OpenWrt make data\n    latest_updated_at=\"$(echo ${download_version} | awk -F'@' '{print $1}' | sed -e s'|download_||'g)\"\n    down_check_code=\"${latest_updated_at}.${main_line_version}\"\n\n    # Download firmware\n    opfile_path=\"$(echo ${download_version} | awk -F'@' '{print $2}')\"\n    # Restore converted characters in file names(%2B to +)\n    firmware_download_oldname=\"${opfile_path//%2B/+}\"\n    latest_url=\"https://github.com/${server_firmware_url}/releases/download/${firmware_download_oldname}\"\n\n    # Find the firmware sha256 value\n    releases_firmware_sha256sums=\"$(echo ${download_version} | awk -F'@' '{print $3}')\"\n\n    # Download to OpenWrt file\n    firmware_download_name=\"openwrt_${BOARD}_k${main_line_version}_github${firmware_suffix}\"\n    curl -fsSL \"${latest_url}\" -o \"${FIRMWARE_DOWNLOAD_PATH}/${firmware_download_name}\"\n    if [[ \"$?\" -eq \"0\" && -s \"${FIRMWARE_DOWNLOAD_PATH}/${firmware_download_name}\" ]]; then\n        tolog \"03.02 OpenWrt downloaded successfully.\"\n    else\n        tolog \"03.02 OpenWrt download failed.\" \"1\"\n    fi\n\n    # Verify sha256sums if available\n    if [[ -n \"${releases_firmware_sha256sums}\" ]]; then\n        tolog \"03.03 Perform sha256 checksum verification.\"\n\n        # If there is a sha256sum file, compare it\n        download_firmware_sha256sums=\"$(sha256sum ${FIRMWARE_DOWNLOAD_PATH}/${firmware_download_name} | awk '{print $1}')\"\n        if [[ \"${releases_firmware_sha256sums}\" != \"${download_firmware_sha256sums}\" ]]; then\n            tolog \"03.03.01 sha256sum verification mismatched.\" \"1\"\n        else\n            tolog \"03.03.02 sha256sum verification succeeded.\"\n        fi\n    fi\n\n    sync && sleep 3\n\n    tolog \"You can update.\"\n\n    tolog '<input type=\"button\" class=\"cbi-button cbi-button-reload\" value=\"Update\" onclick=\"return amlogic_update(this, '\"'${firmware_download_name}@${down_check_code}@${FIRMWARE_DOWNLOAD_PATH}'\"')\"/>' \"1\"\n\n    exit 0\n}\n\ngetopts 'cd' opts\ncase \"${opts}\" in\nc | check)\n    check_updated\n    ;;\n* | download)\n    download_firmware\n    ;;\nesac\n"
  },
  {
    "path": "luci-app-amlogic/root/usr/share/amlogic/amlogic_check_kernel.sh",
    "content": "#!/bin/bash\n#==================================================================\n# This file is licensed under the terms of the GNU General Public\n# License version 2. This program is licensed \"as is\" without any\n# warranty of any kind, whether express or implied.\n#\n# This file is a part of the luci-app-amlogic plugin\n# https://github.com/ophub/luci-app-amlogic\n#\n# Description: Check and update OpenWrt Kernel\n# Copyright (C) 2021- https://github.com/unifreq/openwrt_packit\n# Copyright (C) 2021- https://github.com/ophub/luci-app-amlogic\n#==================================================================\n\n# Set a fixed value\ncheck_option=\"${1}\"\ndownload_version=\"${2}\"\nTMP_CHECK_DIR=\"/tmp/amlogic\"\nAMLOGIC_SOC_FILE=\"/etc/flippy-openwrt-release\"\nSTART_LOG=\"${TMP_CHECK_DIR}/amlogic_check_kernel.log\"\nRUNNING_LOG=\"${TMP_CHECK_DIR}/amlogic_running_script.log\"\nLOG_FILE=\"${TMP_CHECK_DIR}/amlogic.log\"\nsupport_platform=(\"allwinner\" \"rockchip\" \"amlogic\" \"qemu-aarch64\")\nLOGTIME=\"$(date \"+%Y-%m-%d %H:%M:%S\")\"\n[[ -d ${TMP_CHECK_DIR} ]] || mkdir -p ${TMP_CHECK_DIR}\n\n# Clean the running log\nclean_running() {\n    echo -e '' >${RUNNING_LOG} 2>/dev/null && sync\n}\n\n# Add log\ntolog() {\n    echo -e \"${1}\" >${START_LOG}\n    echo -e \"${LOGTIME} ${1}\" >>${LOG_FILE}\n    [[ -n \"${2}\" && \"${2}\" -eq \"1\" ]] && clean_running && exit 1\n}\n\n# Get the partition name of the root file system\nget_root_partition_name() {\n    local paths=(\"/\" \"/overlay\" \"/rom\")\n    local partition_name\n\n    for path in \"${paths[@]}\"; do\n        partition_name=$(df \"${path}\" | awk 'NR==2 {print $1}' | awk -F '/' '{print $3}')\n        [[ -n \"${partition_name}\" ]] && break\n    done\n\n    [[ -z \"${partition_name}\" ]] && tolog \"Cannot find the root partition!\" \"1\"\n    echo \"${partition_name}\"\n}\n\n# Check running scripts, prohibit running concurrently\nthis_running_log=\"2@Kernel update in progress, try again later!\"\nrunning_script=\"$(cat ${RUNNING_LOG} 2>/dev/null | xargs)\"\nif [[ -n \"${running_script}\" ]]; then\n    run_num=\"$(echo \"${running_script}\" | awk -F \"@\" '{print $1}')\"\n    run_log=\"$(echo \"${running_script}\" | awk -F \"@\" '{print $2}')\"\nfi\nif [[ -n \"${run_log}\" && \"${run_num}\" -ne \"2\" ]]; then\n    echo -e \"${run_log}\" >${START_LOG} 2>/dev/null && sync && exit 1\nelse\n    echo -e \"${this_running_log}\" >${RUNNING_LOG} 2>/dev/null && sync\nfi\n\n# Find the partition where root is located\nROOT_PTNAME=\"$(get_root_partition_name)\"\n\n# Find the disk where the partition is located, only supports mmcblk?p? sd?? hd?? vd?? and other formats\ncase \"${ROOT_PTNAME}\" in\nmmcblk?p[1-4])\n    EMMC_NAME=\"$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-2)}')\"\n    PARTITION_NAME=\"p\"\n    ;;\n[hsv]d[a-z][1-4])\n    EMMC_NAME=\"$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-1)}')\"\n    PARTITION_NAME=\"\"\n    ;;\nnvme?n?p[1-4])\n    EMMC_NAME=\"$(echo ${ROOT_PTNAME} | awk '{print substr($1, 1, length($1)-2)}')\"\n    PARTITION_NAME=\"p\"\n    ;;\n*)\n    tolog \"Unable to recognize the disk type of ${ROOT_PTNAME}!\" \"1\"\n    ;;\nesac\n# Set the default download path\nKERNEL_DOWNLOAD_PATH=\"/mnt/${EMMC_NAME}${PARTITION_NAME}4\"\n\n# Check release file\nif [[ -s \"${AMLOGIC_SOC_FILE}\" ]]; then\n    source \"${AMLOGIC_SOC_FILE}\" 2>/dev/null\n    PLATFORM=\"${PLATFORM}\"\nelse\n    tolog \"${AMLOGIC_SOC_FILE} file is missing!\" \"1\"\nfi\nif [[ -z \"${PLATFORM}\" || -z \"$(echo \"${support_platform[@]}\" | grep -w \"${PLATFORM}\")\" ]]; then\n    tolog \"Missing [ PLATFORM ] value in ${AMLOGIC_SOC_FILE} file.\" \"1\"\nfi\n\ntolog \"PLATFORM: [ ${PLATFORM} ], Use in [ ${EMMC_NAME} ]\"\nsleep 2\n\n# Step 1. Set the kernel query api\ntolog \"01. Start checking the kernel repository.\"\nfirmware_repo=\"$(uci get amlogic.config.amlogic_firmware_repo 2>/dev/null)\"\n[[ -n \"${firmware_repo}\" ]] || tolog \"01.01 The custom kernel download repo is invalid.\" \"1\"\nkernel_repo=\"$(uci get amlogic.config.amlogic_kernel_path 2>/dev/null)\"\n[[ -n \"${kernel_repo}\" ]] || tolog \"01.02 The custom kernel download repo is invalid.\" \"1\"\n\nif [[ \"${kernel_repo}\" == \"opt/kernel\" ]]; then\n    uci set amlogic.config.amlogic_kernel_path=\"${firmware_repo}\" 2>/dev/null\n    uci commit amlogic 2>/dev/null\n    kernel_repo=\"${firmware_repo}\"\nfi\n\n# Convert kernel repo to api format\n[[ \"${kernel_repo}\" =~ ^https: ]] && kernel_repo=\"$(echo ${kernel_repo} | awk -F'/' '{print $4\"/\"$5}')\"\nkernel_api=\"https://github.com/${kernel_repo}\"\ntolog \"01.03 Kernel repo: ${kernel_repo}\"\n# Get the current kernel uname\nkernel_uname=\"$(uname -r 2>/dev/null)\"\ntolog \"01.04 Current kernel uname: ${kernel_uname}\"\n\n# Get the kernel tag from uci config\nop_kernel_tags=\"$(uci get amlogic.config.amlogic_kernel_tags 2>/dev/null)\"\n# Determine the kernel tag\nif [[ -n \"${op_kernel_tags}\" ]]; then\n    kernel_tag=\"${op_kernel_tags/kernel_/}\"\nelse\n    # Determine the kernel tag based on the current kernel uname\n    if [[ \"${kernel_uname}\" =~ -rk3588 ]]; then\n        kernel_tag=\"rk3588\"\n    elif [[ \"${kernel_uname}\" =~ -rk35xx ]]; then\n        kernel_tag=\"rk35xx\"\n    elif [[ \"${kernel_uname}\" =~ -flippy ]]; then\n        kernel_tag=\"flippy\"\n    elif [[ \"${kernel_uname}\" =~ -h6|-zicai ]]; then\n        kernel_tag=\"h6\"\n    else\n        kernel_tag=\"stable\"\n    fi\n\n    # Save the kernel tag to uci config\n    uci set amlogic.config.amlogic_kernel_tags=\"kernel_${kernel_tag}\" 2>/dev/null\n    uci commit amlogic 2>/dev/null\nfi\ntolog \"01.05 Kernel tag: kernel_${kernel_tag}\"\nsleep 2\n\n# Step 2: Check if there is the latest kernel version\ncheck_kernel() {\n    # 02. Query local version information\n    tolog \"02. Start checking the kernel version.\"\n\n    # 02.01 Get current kernel version\n    [[ ! \"${kernel_tag}\" =~ ^(rk3588|rk35xx)$ ]] && kernel_uname=\"$(echo \"${kernel_uname}\" | cut -d'-' -f1)\"\n    [[ -n \"${kernel_uname}\" ]] || tolog \"02.01 The current kernel version is not detected.\" \"1\"\n    tolog \"02.01 current version: ${kernel_uname}\"\n    sleep 2\n\n    # 02.02 Version comparison\n    main_line_version=\"$(echo ${kernel_uname} | awk -F '.' '{print $1\".\"$2}')\"\n\n    # 02.03 Query the selected branch in the settings\n    server_kernel_branch=\"$(uci get amlogic.config.amlogic_kernel_branch 2>/dev/null | grep -oE '^[1-9].[0-9]{1,3}')\"\n    if [[ -z \"${server_kernel_branch}\" ]]; then\n        server_kernel_branch=\"${main_line_version}\"\n        uci set amlogic.config.amlogic_kernel_branch=\"${main_line_version}\" 2>/dev/null\n        uci commit amlogic 2>/dev/null\n    fi\n\n    if [[ \"${server_kernel_branch}\" != \"${main_line_version}\" ]]; then\n        main_line_version=\"${server_kernel_branch}\"\n        main_line_now=\"0\"\n        tolog \"02.02 Select branch: ${main_line_version}\"\n        sleep 2\n    fi\n\n    # Check the version on the server\n    latest_version=\"$(\n        curl -fsSL -m 10 \\\n            ${kernel_api}/releases/expanded_assets/kernel_${kernel_tag} |\n            grep -oE \"${main_line_version}\\.[0-9]+[^\\\"]*\\.tar\\.gz\" | sed 's/.tar.gz//' |\n            sort -urV | head -n 1\n    )\"\n    [[ -n \"${latest_version}\" ]] || tolog \"02.03 No kernel available, please use another kernel branch.\" \"1\"\n\n    tolog \"02.04 current version: ${kernel_uname}, Latest version: ${latest_version}\"\n    sleep 2\n\n    # Get the sha256 value of the latest version\n    latest_kernel_sha256=\"$(\n        curl -fsSL -m 10 \\\n            ${kernel_api}/releases/expanded_assets/kernel_${kernel_tag} |\n            awk -v pattern=\"${latest_version}\\.tar\\.gz\" -v RS='</li>' '$0 ~ pattern { print $0 \"</li>\"; exit }' |\n            grep -o 'value=\"sha256:[^\"]*' | sed 's/value=\"sha256://'\n    )\"\n    [[ -n \"${latest_kernel_sha256}\" ]] && tolog \"02.05 Kernel sha256: ${latest_kernel_sha256}\"\n\n    if [[ \"${latest_version}\" == \"${kernel_uname}\" ]]; then\n        tolog \"02.06 Already the latest version, no need to update.\" \"1\"\n        sleep 2\n    else\n        tolog '<input type=\"button\" class=\"cbi-button cbi-button-reload\" value=\"Download\" onclick=\"return b_check_kernel(this, '\"'download_${latest_version}_${latest_kernel_sha256}'\"')\"/> Latest version: '${latest_version}'' \"1\"\n    fi\n\n    exit 0\n}\n\n# Step 3: Download the latest kernel version\ndownload_kernel() {\n    tolog \"03. Start download the kernel file.\"\n    if [[ \"${download_version}\" == \"download_\"* ]]; then\n        tolog \"03.01 Start downloading...\"\n    else\n        tolog \"03.01 Invalid parameter\" \"1\"\n    fi\n\n    # Get the kernel file name\n    kernel_file_name=\"$(echo \"${download_version}\" | cut -d '_' -f2)\"\n    # Restore converted characters in file names(%2B to +)\n    kernel_file_name=\"${kernel_file_name//%2B/+}\"\n    # Get the sha256 value\n    kernel_file_sha256=\"$(echo \"${download_version}\" | cut -d '_' -f3)\"\n\n    # Delete other residual kernel files\n    rm -f ${KERNEL_DOWNLOAD_PATH}/*.tar.gz\n    rm -f ${KERNEL_DOWNLOAD_PATH}/sha256sums\n    rm -rf ${KERNEL_DOWNLOAD_PATH}/${kernel_file_name}*\n\n    kernel_down_from=\"https://github.com/${kernel_repo}/releases/download/kernel_${kernel_tag}/${kernel_file_name}.tar.gz\"\n\n    curl -fsSL \"${kernel_down_from}\" -o ${KERNEL_DOWNLOAD_PATH}/${kernel_file_name}.tar.gz\n    [[ \"${?}\" -ne \"0\" ]] && tolog \"03.02 The kernel download failed.\" \"1\"\n\n    # Verify sha256\n    if [[ -n \"${kernel_file_sha256}\" ]]; then\n        tolog \"03.03 Perform sha256 checksum verification.\"\n\n        download_kernel_sha256sums=\"$(sha256sum ${KERNEL_DOWNLOAD_PATH}/${kernel_file_name}.tar.gz | awk '{print $1}')\"\n        if [[ \"${kernel_file_sha256}\" != \"${download_kernel_sha256sums}\" ]]; then\n            tolog \"03.03.01 sha256sum verification mismatched.\" \"1\"\n        else\n            tolog \"03.03.02 sha256sum verification succeeded.\"\n        fi\n    fi\n\n    # Decompress the kernel package\n    tolog \"03.04 Start decompressing the kernel package...\"\n    tar -xf ${KERNEL_DOWNLOAD_PATH}/${kernel_file_name}.tar.gz -C ${KERNEL_DOWNLOAD_PATH}\n    [[ \"${?}\" -ne \"0\" ]] && tolog \"03.05 Kernel decompression failed.\" \"1\"\n    mv -f ${KERNEL_DOWNLOAD_PATH}/${kernel_file_name}/* ${KERNEL_DOWNLOAD_PATH}/\n\n    sync && sleep 3\n    # Delete the downloaded kernel file\n    rm -f ${KERNEL_DOWNLOAD_PATH}/${kernel_file_name}.tar.gz\n    rm -rf ${KERNEL_DOWNLOAD_PATH}/${kernel_file_name}\n\n    tolog \"03.06 The kernel is ready, you can update.\"\n    sleep 2\n\n    #echo '<a href=\"javascript:;\" onclick=\"return amlogic_kernel(this)\">Update</a>' >$START_LOG\n    tolog '<input type=\"button\" class=\"cbi-button cbi-button-reload\" value=\"Update\" onclick=\"return amlogic_kernel(this)\"/>' \"1\"\n\n    exit 0\n}\n\ngetopts 'cd' opts\ncase \"${opts}\" in\nc | check)\n    check_kernel\n    ;;\n* | download)\n    download_kernel\n    ;;\nesac\n"
  },
  {
    "path": "luci-app-amlogic/root/usr/share/amlogic/amlogic_check_plugin.sh",
    "content": "#!/bin/bash\n#==================================================================\n# This file is licensed under the terms of the GNU General Public\n# License version 2. This program is licensed \"as is\" without any\n# warranty of any kind, whether express or implied.\n#\n# This file is a part of the luci-app-amlogic plugin\n# https://github.com/ophub/luci-app-amlogic\n#\n# Description: Check and update luci-app-amlogic plugin\n# Copyright (C) 2021- https://github.com/unifreq/openwrt_packit\n# Copyright (C) 2021- https://github.com/ophub/luci-app-amlogic\n#==================================================================\n\n# Set a fixed value\ncheck_option=\"${1}\"\ndownload_version=\"${2}\"\nTMP_CHECK_DIR=\"/tmp/amlogic\"\nAMLOGIC_SOC_FILE=\"/etc/flippy-openwrt-release\"\nAMLOGIC_CONFIG_FILE=\"/etc/config/amlogic\"\nSTART_LOG=\"${TMP_CHECK_DIR}/amlogic_check_plugin.log\"\nRUNNING_LOG=\"${TMP_CHECK_DIR}/amlogic_running_script.log\"\nLOG_FILE=\"${TMP_CHECK_DIR}/amlogic.log\"\nsupport_platform=(\"allwinner\" \"rockchip\" \"amlogic\" \"qemu-aarch64\")\nLOGTIME=\"$(date \"+%Y-%m-%d %H:%M:%S\")\"\n[[ -d ${TMP_CHECK_DIR} ]] || mkdir -p ${TMP_CHECK_DIR}\n\n# Clean the running log\nclean_running() {\n    echo -e '' >${RUNNING_LOG} 2>/dev/null && sync\n}\n\n# Add log\ntolog() {\n    echo -e \"${1}\" >${START_LOG}\n    echo -e \"${LOGTIME} ${1}\" >>${LOG_FILE}\n    [[ -n \"${2}\" && \"${2}\" -eq \"1\" ]] && clean_running && exit 1\n}\n\n# Check running scripts, prohibit running concurrently\nthis_running_log=\"1@Plugin update in progress, try again later!\"\nrunning_script=\"$(cat ${RUNNING_LOG} 2>/dev/null | xargs)\"\nif [[ -n \"${running_script}\" ]]; then\n    run_num=\"$(echo \"${running_script}\" | awk -F \"@\" '{print $1}')\"\n    run_log=\"$(echo \"${running_script}\" | awk -F \"@\" '{print $2}')\"\nfi\nif [[ -n \"${run_log}\" && \"${run_num}\" -ne \"1\" ]]; then\n    echo -e \"${run_log}\" >${START_LOG} 2>/dev/null && sync && exit 1\nelse\n    echo -e \"${this_running_log}\" >${RUNNING_LOG} 2>/dev/null && sync\nfi\n\n# Check release file\nif [[ -s \"${AMLOGIC_SOC_FILE}\" ]]; then\n    source \"${AMLOGIC_SOC_FILE}\" 2>/dev/null\n    PLATFORM=\"${PLATFORM}\"\nelse\n    tolog \"${AMLOGIC_SOC_FILE} file is missing!\" \"1\"\nfi\nif [[ -z \"${PLATFORM}\" || -z \"$(echo \"${support_platform[@]}\" | grep -w \"${PLATFORM}\")\" ]]; then\n    tolog \"Missing [ PLATFORM ] value in ${AMLOGIC_SOC_FILE} file.\" \"1\"\nfi\n\ntolog \"PLATFORM: [ ${PLATFORM} ]\"\nsleep 2\n\n# Read plugin branch from UCI config; default to \"\" (main-lua) when missing or empty\n# When amlogic_plugin_branch is missing, add it with empty value (main-lua default)\nif [[ -f \"${AMLOGIC_CONFIG_FILE}\" ]]; then\n    plugin_branch=\"$(uci get amlogic.config.amlogic_plugin_branch 2>/dev/null | xargs)\"\n    if ! grep -q \"amlogic_plugin_branch\" \"${AMLOGIC_CONFIG_FILE}\" 2>/dev/null; then\n        uci set amlogic.config.amlogic_plugin_branch='' 2>/dev/null\n        uci commit amlogic 2>/dev/null\n        plugin_branch=\"\"\n    fi\nelse\n    plugin_branch=\"\"\nfi\ntolog \"Plugin branch: [ ${plugin_branch:-main-lua} ]\"\nsleep 1\nget_plugin_info() {\n    package_manager=\"\"\n    current_plugin_v=\"\"\n    current_plugin_release=\"\"\n    if command -v opkg >/dev/null 2>&1; then\n        package_manager=\"ipk\"\n        # Full version string e.g. \"3.1.295-1\" or \"3.1.295-2\"\n        local full_v\n        full_v=\"$(opkg list-installed | grep '^luci-app-amlogic ' | awk '{print $3}')\"\n        current_plugin_v=\"$(echo \"${full_v}\" | cut -d'-' -f1)\"\n        current_plugin_release=\"$(echo \"${full_v}\" | cut -d'-' -f2)\"\n    elif command -v apk >/dev/null 2>&1; then\n        package_manager=\"apk\"\n        # Package name e.g. \"luci-app-amlogic-3.1.295-r2\"\n        # Fields: luci(1) app(2) amlogic(3) 3.1.295(4) r2(5)\n        local pkg_name\n        pkg_name=\"$(apk list --installed | grep '^luci-app-amlogic-' | awk '{print $1}')\"\n        current_plugin_v=\"$(echo \"${pkg_name}\" | cut -d'-' -f4)\"\n        # Extract release number: \"r2\" -> \"2\"\n        current_plugin_release=\"$(echo \"${pkg_name}\" | cut -d'-' -f5 | sed 's/^r//')\"\n    fi\n}\n\n# Step 2: Check if there is the latest plugin version\ncheck_plugin() {\n    tolog \"01. Query current version information.\"\n    get_plugin_info\n    if [[ -z \"${package_manager}\" || -z \"${current_plugin_v}\" ]]; then\n        tolog \"01.01 Plugin 'luci-app-amlogic' not found or package manager unknown.\" \"1\"\n    else\n        tolog \"01.01 Using [${package_manager}]. Current version: ${current_plugin_v}, Release: ${current_plugin_release:-unknown}\"\n    fi\n    sleep 2\n\n    tolog \"02. Start querying plugin version...\"\n    if [[ \"${plugin_branch}\" == \"js\" ]]; then\n        latest_version=\"$(\n            curl -fsSL -m 10 \\\n                https://github.com/ophub/luci-app-amlogic/releases |\n                grep -oE 'expanded_assets/[0-9]+\\.[0-9]+\\.[0-9]+-js' | sed 's|expanded_assets/||g' |\n                sort -urV | head -n 1\n        )\"\n    else\n        latest_version=\"$(\n            curl -fsSL -m 10 \\\n                https://github.com/ophub/luci-app-amlogic/releases |\n                grep -oE 'expanded_assets/[0-9]+\\.[0-9]+\\.[0-9]+' | sed 's|expanded_assets/||g' |\n                grep -v '\\-js' |\n                sort -urV | head -n 1\n        )\"\n    fi\n    if [[ -z \"${latest_version}\" ]]; then\n        tolog \"02.01 Query failed, please try again.\" \"1\"\n    fi\n\n    tolog \"02.01 Current version: ${current_plugin_v}, Latest version: ${latest_version}\"\n    sleep 2\n\n    # Strip variant suffix (e.g. \"-js\") from latest_version to get the numeric part.\n    latest_version_base=\"${latest_version%%-*}\"\n\n    # Determine target PKG_RELEASE for the selected branch:\n    #   js branch  -> release 2\n    #   lua branch -> release 1\n    if [[ \"${plugin_branch}\" == \"js\" ]]; then\n        target_release=\"2\"\n    else\n        target_release=\"1\"\n    fi\n\n    # Only report \"already latest\" when BOTH the version number AND the installed\n    # branch (PKG_RELEASE) match the selected branch. If the user switched branches\n    # (same version number but different release), we still offer an update.\n    if [[ \"${current_plugin_v}\" == \"${latest_version_base}\" && \"${current_plugin_release}\" == \"${target_release}\" ]]; then\n        tolog \"02.02 Already the latest version, no need to update.\" \"1\"\n    else\n        tolog '<input type=\"button\" class=\"cbi-button cbi-button-reload\" value=\"Download\" onclick=\"return b_check_plugin(this, '\"'download_${latest_version}'\"')\"/> Latest version: '${latest_version}'' \"1\"\n    fi\n\n    exit 0\n}\n\n# Step 3: Download the latest plugin version\ndownload_plugin() {\n    tolog \"03. Start downloading the plugin file.\"\n    if [[ \"${download_version}\" == \"download_\"* ]]; then\n        tolog \"03.01 Start downloading...\"\n    else\n        tolog \"03.01 Invalid parameter.\" \"1\"\n    fi\n\n    # Extract version from parameter (e.g. \"download_3.1.290\" -> \"3.1.290\")\n    latest_version=\"$(echo \"${download_version}\" | cut -d '_' -f2-)\"\n\n    get_plugin_info\n    if [[ -z \"${package_manager}\" ]]; then\n        tolog \"03.02 Package manager not found.\" \"1\"\n    fi\n\n    tolog \"03.02 Package manager: ${package_manager}, Version to download: ${latest_version}\"\n\n    # Clean up previous downloads\n    rm -f ${TMP_CHECK_DIR}/*.ipk 2>/dev/null\n    rm -f ${TMP_CHECK_DIR}/*.apk 2>/dev/null\n    rm -f ${TMP_CHECK_DIR}/sha256sums 2>/dev/null\n    sync\n\n    download_repo=\"https://github.com/ophub/luci-app-amlogic/releases/download\"\n\n    # Use GitHub API to find exact filenames\n    if ! command -v jq >/dev/null 2>&1; then\n        tolog \"03.03 jq not found, cannot query GitHub API.\" \"1\"\n    fi\n\n    tolog \"03.03 Querying GitHub API for release assets...\"\n    api_url=\"https://api.github.com/repos/ophub/luci-app-amlogic/releases/tags/${latest_version}\"\n    asset_list=\"$(curl -fsSL -m 15 \"${api_url}\" | jq -r '.assets[].name' | xargs)\"\n    if [[ -z \"${asset_list}\" ]]; then\n        tolog \"03.03 Failed to fetch release assets from GitHub API.\" \"1\"\n    fi\n\n    plugin_file_name=\"$(echo \"${asset_list}\" | tr ' ' '\\n' | grep -oE \"^luci-app-amlogic.*${package_manager}$\" | head -n 1)\"\n    lang_file_list=($(echo \"${asset_list}\" | tr ' ' '\\n' | grep -oE \"^luci-i18n-amlogic.*${package_manager}$\"))\n\n    if [[ -z \"${plugin_file_name}\" ]]; then\n        tolog \"03.04 Could not find plugin file (.${package_manager}) in release assets.\" \"1\"\n    fi\n\n    tolog \"03.04 Plugin file: ${plugin_file_name}\"\n\n    # Download the main plugin file\n    plugin_full_url=\"${download_repo}/${latest_version}/${plugin_file_name}\"\n    tolog \"03.05 Downloading main plugin...\"\n    curl -fsSL \"${plugin_full_url}\" -o \"${TMP_CHECK_DIR}/${plugin_file_name}\"\n    [[ \"${?}\" -ne \"0\" ]] && tolog \"03.05 Plugin [ ${plugin_file_name} ] download failed.\" \"1\"\n\n    # Download language packs\n    for langfile in \"${lang_file_list[@]}\"; do\n        lang_full_url=\"${download_repo}/${latest_version}/${langfile}\"\n        tolog \"03.06 Downloading language pack [ ${langfile} ]...\"\n        curl -fsSL \"${lang_full_url}\" -o \"${TMP_CHECK_DIR}/${langfile}\"\n        [[ \"${?}\" -ne \"0\" ]] && tolog \"03.06 Language pack [ ${langfile} ] download failed.\" \"1\"\n    done\n\n    # The .apk filename uses tilde (~) instead of dot before the hash suffix\n    for file in ${TMP_CHECK_DIR}/*.apk; do\n        [[ -f \"${file}\" ]] || continue\n        base_name=\"$(basename \"${file}\")\"\n        new_name=\"$(echo \"${base_name}\" | sed -E 's/\\.([a-f0-9]{7}\\.apk)/~\\1/')\"\n        if [[ \"${base_name}\" != \"${new_name}\" ]]; then\n            mv -f \"${file}\" \"${TMP_CHECK_DIR}/${new_name}\" || true\n        fi\n    done\n\n    sync && sleep 2\n\n    tolog \"03.07 The plugin is ready, you can update.\"\n    sleep 2\n\n    tolog '<input type=\"button\" class=\"cbi-button cbi-button-reload\" value=\"Update\" onclick=\"return amlogic_plugin(this)\"/> Latest version: '${latest_version}'' \"1\"\n\n    exit 0\n}\n\ngetopts 'cd' opts\ncase \"${opts}\" in\nc | check)\n    check_plugin\n    ;;\n* | download)\n    download_plugin\n    ;;\nesac\n"
  },
  {
    "path": "luci-app-amlogic/root/usr/share/rpcd/acl.d/luci-app-amlogic.json",
    "content": "{\n\t\"luci-app-amlogic\": {\n\t\t\"description\": \"Grant UCI access for luci-app-amlogic\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"amlogic\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"amlogic\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-autoipsetadder/Makefile",
    "content": "# Copyright (C) 2018-2019 Lienol\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-autoipsetadder\nPKG_VERSION:=1.0\nPKG_RELEASE:=7\n\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/luci-app-autoipsetadder\n\tSECTION:=luci\n\tCATEGORY:=LuCI\n\tSUBMENU:=3. Applications\n\tTITLE:=LuCI Support for autoipsetadder\n\tPKGARCH:=all\n\tDEPENDS:= +httping +curl\nendef\n\ndefine Package/luci-app-autoipsetadder/description\n\tLuCI support for autoipsetadder\nendef\n\ndefine Build/Prepare\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/luci-app-autoipsetadder/conffiles\n/etc/config/autoipsetadder\nendef\n\ndefine Package/luci-app-autoipsetadder/install\n    $(INSTALL_DIR) $(1)/usr/lib/lua/luci\n\tcp -pR ./luasrc/* $(1)/usr/lib/lua/luci\n\t$(INSTALL_DIR) $(1)/\n\tcp -pR ./root/* $(1)/\nendef\n\ndefine Package/luci-app-autoipsetadder/postinst\n#!/bin/sh\n\t/etc/init.d/autoipsetadder enable >/dev/null 2>&1\n\t/etc/init.d/autoipsetadder start\n\trm -f /tmp/luci-indexcache\n\trm -f /tmp/luci-modulecache/*\nexit 0\nendef\n\ndefine Package/luci-app-autoipsetadder/prerm\n#!/bin/sh\nif [ -z \"$${IPKG_INSTROOT}\" ]; then\n     /etc/init.d/autoipsetadder disable\n     /etc/init.d/autoipsetadder stop\nfi\nexit 0\nendef\n\n$(eval $(call BuildPackage,luci-app-autoipsetadder))\n"
  },
  {
    "path": "luci-app-autoipsetadder/luasrc/controller/autoipsetadder.lua",
    "content": "module(\"luci.controller.autoipsetadder\",package.seeall)\nlocal io     = require \"io\"\nlocal fs=require\"nixio.fs\"\nlocal sys=require\"luci.sys\"\nlocal uci=require\"luci.model.uci\".cursor()\nfunction index()\n\tentry({\"admin\",\"services\",\"autoipsetadder\"},firstchild(),_(\"autoipsetadder\"),30).dependent=true\n\tentry({\"admin\",\"services\",\"autoipsetadder\",\"autoipsetadder\"},cbi(\"autoipsetadder\"),_(\"Base Setting\"),1)\n    entry({\"admin\",\"services\",\"autoipsetadder\",\"status\"},call(\"act_status\")).leaf=true\n\tentry({\"admin\", \"services\", \"autoipsetadder\", \"getlog\"}, call(\"get_log\"))\n\tentry({\"admin\", \"services\", \"autoipsetadder\", \"dodellog\"}, call(\"do_del_log\"))\n\tentry({\"admin\", \"services\", \"autoipsetadder\", \"debugip\"}, call(\"do_debug_ip\"))\nend\n\nfunction act_status()\n  local e={}\n  e.running=luci.sys.call(\"pgrep -f /usr/bin/autoipsetadder/autoaddlist.sh >/dev/null\")==0\n  luci.http.prepare_content(\"application/json\")\n  luci.http.write_json(e)\nend\nfunction do_del_log()\nlocal logfile=uci:get(\"autoipsetadder\",\"autoipsetadder\",\"logfile\") or \"/tmp/addlist.log\"\nnixio.fs.writefile(logfile,\"\")\nluci.http.prepare_content(\"application/json\")\nluci.http.write('')\nend\nfunction do_debug_ip()\nluci.http.prepare_content(\"text/plain; charset=utf-8\")\nlocal a=sys.exec(\"/usr/bin/autoipsetadder/debugip.sh\")\nif (a==\"\") then\na=\"noproblem\"\nend\nluci.http.write(a)\nend\nfunction get_log()\n\tlocal logfile,fdp\n\tlogfile=uci:get(\"autoipsetadder\",\"autoipsetadder\",\"logfile\") or \"/tmp/addlist.log\"\n\tluci.http.prepare_content(\"text/plain; charset=utf-8\")\n\tif not fs.access(logfile) then\n\t\tluci.http.write(\"\")\n\t\treturn\n\tend\n\tif fs.access(\"/var/run/lucilogreload\") then\n\t\tfdp=0\n\t\tfs.remove(\"/var/run/lucilogreload\")\n\telse\n\t\tfdp=tonumber(fs.readfile(\"/var/run/lucilogpos\")) or 0\n\tend\n\tlocal f=io.open(logfile, \"r+\")\n\tf:seek(\"set\",fdp)\n\tlocal a=f:read(2048000) or \"\"\n\tfdp=f:seek()\n\tfs.writefile(\"/var/run/lucilogpos\",tostring(fdp))\n\tf:close()\n\tluci.http.write(a)\nend"
  },
  {
    "path": "luci-app-autoipsetadder/luasrc/model/cbi/autoipsetadder.lua",
    "content": "require(\"luci.sys\")\nrequire(\"luci.util\")\nlocal fs=require\"nixio.fs\"\nlocal uci=require\"luci.model.uci\".cursor()\nlocal m,s,o\nm = Map(\"autoipsetadder\", translate(\"ipsetautoadder\"))\nm.description = translate(\"自动将联不通的域名加入ipset\")\nm:section(SimpleSection).template  = \"autoipsetadder/status\"\n\ns = m:section(TypedSection, \"autoipsetadder\")\ns.anonymous=true\ns.addremove=false\n---- enable\no = s:option(Flag, \"enabled\", translate(\"启用\"))\no.default = 0\no.rmempty = false\n---- logview\no=s:option(TextValue, \"show\", \"日志\")\no.template = \"autoipsetadder/check\"\n---- logpath\no = s:option(Value, \"logfile\", translate(\"Runtime log file\"))\no.datatype    = \"string\"\no.default=\"/tmp/addlist.log\"\no.optional = false\no.validate=function(self, value)\nif fs.stat(value,\"type\")==\"dir\" then\n\tfs.rmdir(value)\nend\nif fs.stat(value,\"type\")==\"dir\" then\n\tif m.message then\n\tm.message =m.message..\"\\nerror!log file is a dir\"\n\telse\n\tm.message =\"error!log file is a dir\"\n\tend\n\treturn nil\nend \nreturn value\nend\n---- dnsmasq log\no = s:option(Value, \"dnslogfile\", translate(\"dnsmasq log file\"))\no.datatype    = \"string\"\no.optional = false\no.default=\"/tmp/dnsmasq.log\"\no.validate=function(self, value)\nif fs.stat(value,\"type\")==\"dir\" then\n\tfs.rmdir(value)\nend\nif fs.stat(value,\"type\")==\"dir\" then\n\tif m.message then\n\tm.message =m.message..\"\\nerror!log file is a dir\"\n\telse\n\tm.message =\"error!log file is a dir\"\n\tend\n\treturn nil\nend \nreturn value\nend\n---- crontab \no = s:option(MultiValue, \"crontab\", translate(\"Crontab task\"),translate(\"Please change time and args in crontab\"))\no:value(\"autodeldnslog\",translate(\"Auto del dnsmasq log\"))\no:value(\"autotaillog\",translate(\"Auto tail runtime log\"))\no.widget = \"checkbox\"\no.default = \"autodeldnslog autotaillog\"\no.rmempty= true\n\no = s:option(MultiValue, \"config\", translate(\"the way add to gfwlist\"))\no:value(\"nochina\",translate(\"no china ip\"))\no:value(\"pingadd\",translate(\"5ping loss1-4\"))\no:value(\"packetpass\",translate(\"packet >12 pass\"))\no.widget = \"checkbox\"\no.default = \"nochina pingadd packetpass\"\no.rmempty=true\n---- apply\nnixio.fs.writefile(\"/var/run/lucilogreload\",\"\")\nfunction m.on_commit(map)\n\tlocal ucitracktest=uci:get(\"autoipsetadder\",\"autoipsetadder\",\"ucitracktest\")\n\tif ucitracktest==\"1\" then\n\t\treturn\n\telseif ucitracktest==\"0\" then\n\t\tio.popen(\"/etc/init.d/autoipsetadder reload &\")\n\telse\n\t\tif (fs.access(\"/var/run/AdGucitest\")) then\n\t\t\tuci:set(\"autoipsetadder\",\"autoipsetadder\",\"ucitracktest\",\"0\")\n\t\t\tio.popen(\"/etc/init.d/autoipsetadder reload &\")\n\t\telse\n\t\t\tfs.writefile(\"/var/run/AdGucitest\",\"\")\n\t\t\tif (ucitracktest==\"2\") then\n\t\t\t\tuci:set(\"autoipsetadder\",\"autoipsetadder\",\"ucitracktest\",\"1\")\n\t\t\telse\n\t\t\t\tuci:set(\"autoipsetadder\",\"autoipsetadder\",\"ucitracktest\",\"2\")\n\t\t\tend\n\t\tend\n\t\tuci:save(\"autoipsetadder\")\n\t\tuci:commit(\"autoipsetadder\")\n\tend\nend\nreturn m\n"
  },
  {
    "path": "luci-app-autoipsetadder/luasrc/view/autoipsetadder/check.htm",
    "content": "<%+cbi/valueheader%>\n<%uci=require\"luci.model.uci\".cursor()%>\n<%nixio=require\"nixio\"%>\n\n<%if uci:get(\"autoipsetadder\",\"autoipsetadder\",\"enabled\")==\"1\" then%>\n<textarea id=\"cbid.logview.1.conf\" class=\"cbi-input-textarea\" style=\"width: 100%;display:inline\" data-update=\"change\" rows=\"10\" cols=\"60\" readonly=\"readonly\" > </textarea>\n<input type=\"checkbox\" value=\"reverse\" onclick=\" return reverselog()\" style=\"vertical-align:middle;height: auto;\" checked><%:reverse%></input>\n<input type=\"button\" class=\"cbi-button cbi-button-apply\" id=\"apply_update_button\" value=\"dellog\" onclick=\" return apply_del_log() \"/>\n\n<input type=\"button\" class=\"cbi-button cbi-button-apply\" id=\"apply_update_button\" value=\"debug\" onclick=\" return debug_ip() \"/>\n\n<textarea id=\"cbid.logview.2.conf\" class=\"cbi-input-textarea\" style=\"width: 100%;display:none\" data-update=\"change\" rows=\"10\" cols=\"60\" readonly=\"readonly\" > </textarea>\n\n<script type=\"text/javascript\">//<![CDATA[\nvar islogreverse = true;\nfunction apply_del_log(){\n\tXHR.get('<%=url([[admin]], [[services]], [[autoipsetadder]], [[dodellog]])%>',null,function(x, data){\n\tvar lv = document.getElementById('cbid.logview.1.conf');\n\t\tlv.innerHTML=\"\";\n\t}\n\t\t);\n\treturn\n}\nfunction reverselog(){\n\tvar lv = document.getElementById('cbid.logview.1.conf');\n\tlv.innerHTML=lv.innerHTML.split('\\n').reverse().join('\\n')\n\tif (islogreverse){\n\tislogreverse=false;\n\t}else{\n\tislogreverse=true;\n\t}\n\treturn\n}\nfunction debug_ip(){\n\tvar lv2 = document.getElementById('cbid.logview.2.conf');\n\tlv2.style.display=\"inline\"\n\tXHR.get('<%=url([[admin]], [[services]], [[autoipsetadder]], [[debugip]])%>',null,function(x, data){\n\tvar lv2 = document.getElementById('cbid.logview.2.conf');\n\tlv2.innerHTML = x.responseText; \n\t}\n\t\t);\n\treturn\n}\nfunction poll_check(){\nXHR.poll(3, '<%=url([[admin]], [[services]], [[autoipsetadder]], [[getlog]])%>', null,\n\tfunction(x, data) {\n\t\tvar lv = document.getElementById('cbid.logview.1.conf');\n\t\tif (x.responseText && lv) {\n\t\t\tif (islogreverse){\n\t\t\t\tlv.innerHTML = x.responseText.split('\\n').reverse().join('\\n')+lv.innerHTML;\n\t\t\t}else{\n\t\t\t\tlv.innerHTML += x.responseText;\n\t\t\t}\n\t\t}\n\t}\n);}\npoll_check();\n\n//]]>\n</script>\n<%end%>\t\t\n<%+cbi/valuefooter%>"
  },
  {
    "path": "luci-app-autoipsetadder/luasrc/view/autoipsetadder/status.htm",
    "content": "<script type=\"text/javascript\">//<![CDATA[\nXHR.poll(3, '<%=url([[admin]], [[services]], [[autoipsetadder]], [[status]])%>', null,\n\tfunction(x, data) {\n\t\tvar tb = document.getElementById('autoipsetadder_status');\n\t\tif (data && tb) {\n\t\t\tif (data.running) {\n\t\t\t\tvar links = '<em><b><font color=green>autoipsetadder <%:RUNNING%></font></b></em>';\n\t\t\t\ttb.innerHTML = links;\n\t\t\t} else {\n\t\t\t\ttb.innerHTML = '<em><b><font color=red>autoipsetadder <%:NOT RUNNING%></font></b></em>';\n\t\t\t}\n\t\t}\n\t}\n);\n//]]>\n</script>\n<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>\n<fieldset class=\"cbi-section\">\n\t<p id=\"autoipsetadder_status\">\n\t\t<em><%:Collecting data...%></em>\n\t</p>\n</fieldset>"
  },
  {
    "path": "luci-app-autoipsetadder/root/etc/config/autoipsetadder",
    "content": "config autoipsetadder 'autoipsetadder'\n\toption enabled '0'\n"
  },
  {
    "path": "luci-app-autoipsetadder/root/etc/init.d/autoipsetadder",
    "content": "#!/bin/sh /etc/rc.common\n \nUSE_PROCD=1\n \nSTART=99\nSTOP=01\nCRON_FILE=/etc/crontabs/root\nCONFIGURATION=autoipsetadder\nEXTRA_COMMANDS=\"test_crontab\"\nEXTRA_HELP=\"\n\t\ttest_crontab\"\nset_dnsmasq_log()\n{\n\tsed -i '/log-facility/d' /etc/dnsmasq.conf\n\tsed -i '/log-queries/d' /etc/dnsmasq.conf\n\tuci set dhcp.@dnsmasq[0].logfacility='/tmp/dnsmasq.log'\n\tuci delete dhcp.@dnsmasq[0].logqueries\n\techo log-queries >> /etc/dnsmasq.conf\n\tuci commit dhcp\n\t/etc/init.d/dnsmasq reload\n}\n\nstop_dnsmasq_log()\n{\n\tsed -i '/log-queries/d' /etc/dnsmasq.conf\n\tuci delete dhcp.@dnsmasq[0].logfacility\n\tuci commit dhcp\n\t/etc/init.d/dnsmasq reload\n}\n\nreload_service()\n{\n\trm -f /var/run/AdGucitest 2>/dev/null\n\tkill $(cat /var/run/autoipsetadder.pid)\n\tstart\n}\nservice_triggers() {\n\tprocd_add_reload_trigger \"$CONFIGURATION\"\n}\nstart_service() {\n\t# Reading config\n\tconfig_load \"${CONFIGURATION}\"\n\tmkdir -p /tmp/run/autoipsetadder\n\tlocal enabled\n\tconfig_get_bool enabled $CONFIGURATION enabled 0\n\tdo_crontab\n\tif [ \"$enabled\" == \"1\" ]; then\n\t\tset_dnsmasq_log\n\t\tprocd_open_instance\n\t\tprocd_set_param respawn\n\t\t# pass config to script on start\n\t\tprocd_set_param command sh /usr/bin/autoipsetadder/autoaddlist.sh\n\t\tprocd_close_instance\n\t\techo \"autoipsetadder turn on\"\n\t\techo \"enabled=$enabled\"\n\telse\n\t\tstop_dnsmasq_log\n\t\techo \"autoipsetadder turn off\"\n\t\techo \"enabled=$enabled\"\n\tfi\n}\n\nstop_service()\n{\t\n\tconfig_load \"${CONFIGURATION}\"\n\tstop_dnsmasq_log\n\tdo_crontab\n\tkill $(cat /var/run/autoipsetadder.pid)\n\techo \"autoipsetadder turn off\"\n\techo \"enabled=\"$enabled\"\"\n}\ndo_crontab(){\n\tconfig_get_bool enabled $CONFIGURATION enabled 0\n\t#config_get logfile $CONFIGURATION logfile \"/tmp/addlist.log\"\n\t#config_get dnslogfile $CONFIGURATION dnslogfile \"/tmp/dnsmasq.log\"\n\tconfig_get crontab $CONFIGURATION crontab \"\"\n\tcronreload=0\n\tfindstr=\"echo qingkong > \\$(uci get autoipsetadder.autoipsetadder.dnslogfile)\"\n\tdefault=\"0 * * * * echo qingkong > \\$(uci get autoipsetadder.autoipsetadder.dnslogfile)\"\n\t#[ -n \"$lastdnslogfile\" ] && findstr=\"echo qingkong > $lastdnslogfile\" && [ \"$lastdnslogfile\" != \"$dnslogfile\" ] && replace=\"${lastdnslogfile//\\//\\\\/}/${dnslogfile//\\//\\\\/}\"\n\t[ \"$enabled\" == \"0\" ] || [ \"${crontab//autodeldnslog/}\" == \"$crontab\" ] && cronenable=0 || cronenable=1\n\tcrontab_editor\n\t#[ \"$lastdnslogfile\" != \"$dnslogfile\" ] && uci set autoipsetadder.autoipsetadder.lastdnslogfile=\"$dnslogfile\" && commit=1\n\t\n\tfindstr=\"/usr/bin/autoipsetadder/tailto.sh [0-9]* \\$(uci get autoipsetadder.autoipsetadder.logfile)\"\n\tdefault=\"0 0 * * * /usr/bin/autoipsetadder/tailto.sh 2000 \\$(uci get autoipsetadder.autoipsetadder.logfile)\"\n\t#[ -n \"$lastlogfile\" ] && findstr=\"/usr/bin/autoipsetadder/tailto.sh [0-9]* $lastlogfile\" && [ \"$lastlogfile\" != \"$logfile\" ] && replace=\"${lastlogfile//\\//\\\\/}/${logfile//\\//\\\\/}\"\n\t[ \"$enabled\" == \"0\" ] || [ \"${crontab//autotaillog/}\" == \"$crontab\" ] && cronenable=0 || cronenable=1\n\tcrontab_editor\n\t#[ -n \"$logfile\" ] && [ \"$lastlogfile\" != \"$logfile\" ] && uci set autoipsetadder.autoipsetadder.lastlogfile=\"$logfile\" && commit=1\n\t\n\t[ \"$cronreload\" -gt 0 ] && /etc/init.d/cron restart\n\t#[ \"$commit\" -gt 0 ] && uci commit autoipsetadder\n}\ncrontab_editor(){\n\tlocal testline reload\n\tlocal line=\"$(grep \"$findstr\" $CRON_FILE)\"\n\t[ -n \"$replace\" ] && [ -n \"$line\" ] && eval testline=\"\\${line//$replace}\" && [ \"$testline\" != \"$line\" ] && line=\"$testline\" && reload=\"1\" && replace=\"\" \n\tif [ \"${line:0:1}\" != \"#\" ]; then\n\t\tif [ $cronenable -eq 1 ]; then\n\t\t\t[ -z \"$line\" ] && line=\"$default\" && reload=\"1\"\n\t\t\tif [ -n \"$reload\" ]; then\n\t\t\t\tsed -i \"\\,$findstr,d\" $CRON_FILE\n\t\t\t\techo \"$line\" >> $CRON_FILE\n\t\t\t\tcronreload=$((cronreload+1))\n\t\t\tfi\n\t\telif [ -n \"$line\" ]; then\n\t\t\tsed -i \"\\,$findstr,d\" $CRON_FILE\n\t\t\techo \"#$line\" >> $CRON_FILE\n\t\t\tcronreload=$((cronreload+1))\n\t\tfi\n\telse\n\t\tif [ $cronenable -eq 1 ]; then\n\t\t\tsed -i \"\\,$findstr,d\" $CRON_FILE\n\t\t\techo \"${line:1}\" >> $CRON_FILE\n\t\t\tcronreload=$((cronreload+1))\n\t\telif [ -z \"$reload\" ]; then\n\t\t\tsed -i \"\\,$findstr,d\" $CRON_FILE\n\t\t\techo \"$line\" >> $CRON_FILE\n\t\tfi\n\tfi\n}\ntest_crontab(){\nconfig_load \"${CONFIGURATION}\"\ndo_crontab\n}\n"
  },
  {
    "path": "luci-app-autoipsetadder/root/etc/uci-defaults/40_luci-autoipsetadder",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@autoipsetadder[-1]\n\tadd ucitrack autoipsetadder\n\tset ucitrack.@autoipsetadder[-1].init=autoipsetadder\n\tcommit ucitrack\nEOF\n\nrm -f /tmp/luci-indexcache\nexit 0\n"
  },
  {
    "path": "luci-app-autoipsetadder/root/usr/bin/autoipsetadder/autoaddlist.sh",
    "content": "#!/bin/sh\nPATH=\"/usr/sbin:/usr/bin:/sbin:/bin\"\nlogfile=$(uci get autoipsetadder.autoipsetadder.logfile)\n[ -z \"$logfile\" ] && logfile=\"/tmp/addlist.log\"\ndnslogfile=$(uci get autoipsetadder.autoipsetadder.dnslogfile)\n[ -z \"$logfile\" ] && dnslogfile=\"/tmp/dnsmasq.log\"\nconfig=$(uci get autoipsetadder.autoipsetadder.config 2>/dev/null)\n[ \"${config//nochina/}\" == \"$config\" ] && nochina=\"0\" || nochina=\"1\"\n[ \"${config//packetpass/}\" == \"$config\" ] && packetpass=\"0\" || packetpass=\"1\"\n(tail -F $dnslogfile & echo $! >/var/run/autoipsetadder.pid ) | awk -v nochina=\"$nochina\" -v packetpass=\"$packetpass\" -F \"[, ]+\" '/reply/{\nip=$8;\nif (ip==\"\" || ip==\"127.0.0.1\"|| ip==\"0.0.0.0\")\n{\nnext;\n}\nif (index(ip,\"<CNAME>\")!=0)\n{\nif (cname==1)\n{\n    next;\n}\ncname=1;\ndomain=$6;\n#第一次cname时锁定域名，防止解析cname对其改动\nnext;\n}\n#以上获得上行是否为cname，本行不是cname执行以下内容\n#lastdomain记录上次非cname的域名，与本次域名对比\nif(lastdomain!=$6){\n    for (ipindex in ipcache)\n    {\n        delete ipcache[ipindex];\n    }\n    ipcount=0;\n    createpid=1;\n#上行非cname，并且不是同cname解析域名的多个ip，更新域名，清理同域名免试flag\nif (cname!=1)\n{\n    domain=$6;\n    testall=0;\n}}\nipcount++;\ncname=0;\nlastdomain=$6\n#去除非ipv4\nif (index(ip,\".\")==0)\n{\n    next;\n}\n#不重复探测ip\nif (!(ip in a))\n{   \n#包数>12的同域名放过\nif (passdomain==domain)\n{\n    print(ip\" \"domain\" pass by same domain ok\");\n    a[ip]=domain;\n    next;\n}\nif (nochina==1){\n\"ipset test china \"ip\" 2>&1\"| getline ipset;\nclose(\"ipset test china \"ip\" 2>&1\");\nif (index(ipset,\"Warning\")!=0){\n\tprint(\"china \"ip\" pass\");\n\ta[ip]=domain;\n\tnext;\n}}\n\"ipset test gfwlist \"ip\" 2>&1\"| getline ipset;\nclose(\"ipset test gfwlist \"ip\" 2>&1\");\nif (index(ipset,\"Warning\")!=0){\n\tprint(\"gfwlist \"ip\" pass\");\n\ta[ip]=domain;\n\tnext;\n    }\n\n#ip压入缓存，用于未检测到443/80的缓存\nipcache[ipcount]=ip;\nif (testall==0){\n    tryhttps=0;\n    tryhttp=0;\n    #探测 nf_conntrack 的443/80\n    while (\"grep \"ip\" /proc/net/nf_conntrack\"| getline ret > 0)\n    {\n        split(ret, b,\" +\");\n        split(b[11], pagnum,\"=\");\n        #包数>12的放过\n        if (packetpass==1 && pagnum[2]>12)\n        {\n            print(\"pass by packets=\"pagnum[2]\" \"ip\" \"domain);\n            for (ipindex in ipcache)\n            {\n                a[ipcache[ipindex]]=domain;\n                delete ipcache[ipindex];\n            }\n            passdomain=domain;\n            close(\"grep \"ip\" /proc/net/nf_conntrack\");\n            ipcount--;\n            next;\n        }\n        if (b[8]==\"dst=\"ip)\n        {\n            if (b[10]==\"dport=443\"){\n                tryhttps=1;\n                break;\n            }\n            else if (b[10]==\"dport=80\"){\n                tryhttp=1;\n            }\n        }\n    }\n    close(\"grep \"ip\" /proc/net/nf_conntrack\");\n}else{\n    if (testall==443)\n    {\n        tryhttps=1\n    }else{\n        tryhttp=1\n    }\n}\nif (tryhttps==1)\n{   if (createpid==1)\n    {\n        print \"\">\"/tmp/run/autoipsetadder/\"domain\n        close(\"/tmp/run/autoipsetadder/\"domain);\n        print(\"create\"domain);\n        print(ip\" \"domain\" 443\"ipcount-1);\n        a[ip]=domain;\n        #正在使用的ip用最大延迟，最后探测，减少打断tcp的可能\n        system(\"/usr/bin/autoipsetadder/testip.sh \"ip\" \"domain\" 443 \"ipcount-1\" &\");\n        delete ipcache[ipcount];\n        createpid=0;\n    }\n    #未检测到443/80同域名缓存的ip进行测试，ipindex-1为测试延迟时间\n    for (ipindex in ipcache){\n        print(ipcache[ipindex]\" \"domain\" 443 \"ipindex-1);\n        a[ipcache[ipindex]]=domain;\n        system(\"/usr/bin/autoipsetadder/testip.sh \"ipcache[ipindex]\" \"domain\" 443 \"ipindex-1\" &\");\n        delete ipcache[ipindex];\n    }\n    #后续同域名ip免nf_conntrack测试\n    testall=443;\n}\nelse if (tryhttp==1)\n{   \n    if (createpid==1)\n    {\n        print \"\">\"/tmp/run/autoipsetadder/\"domain\n        close(\"/tmp/run/autoipsetadder/\"domain);\n        print(\"create\"domain);\n        print(ip\" \"domain\" 80 \"ipcount-1);\n        a[ip]=domain;\n        system(\"/usr/bin/autoipsetadder/testip.sh \"ip\" \"domain\" 80 \"ipcount-1\" &\");\n        delete ipcache[ipcount];\n        createpid=0;\n    }\n    for (ipindex in ipcache){\n        print(ipcache[ipindex]\" \"domain\" 80 \"ipindex-1);\n        a[ipcache[ipindex]]=domain;\n        system(\"/usr/bin/autoipsetadder/testip.sh \"ipcache[ipindex]\" \"domain\" 80 \"ipindex-1\" &\");\n        delete ipcache[ipindex];\n    }\n    testall=80;\n}}\n}'  >> $logfile"
  },
  {
    "path": "luci-app-autoipsetadder/root/usr/bin/autoipsetadder/debugip.sh",
    "content": "#!/bin/sh\nPATH=\"/usr/sbin:/usr/bin:/sbin:/bin\"\ndlchina=$1;\nlogfile=$(uci get autoipsetadder.autoipsetadder.logfile)\n[ -z \"$logfile\" ] && logfile=\"/tmp/addlist.log\"\n\ndnslogfile=$(uci get autoipsetadder.autoipsetadder.dnslogfile)\n[ -z \"$logfile\" ] && dnslogfile=\"/tmp/dnsmasq.log\"\n\n\nipset list gfwlist | awk -v dlchina=\"$dlchina\" -v dnslogfile=\"$dnslogfile\" -v logfile=\"$logfile\" '{\nif (index($0,\".\")==0)\n{\n    next;\n}\nif ($0==\"127.0.0.1\") {system(\"ipset d gfwlist 127.0.0.1\");next;}\n\"ipset test whitelist \"$0\" 2>&1\"| getline ipset;\nclose(\"ipset test whitelist \"$0\" 2>&1\");\n    if (index(ipset,\"Warning\")==0){\n        white=0;\n    }else{\n        white=1;\n    }\n    \"ipset test china \"$0\" 2>&1\"| getline ipset;\n    close(\"ipset test china \"$0\" 2>&1\");\n    if (index(ipset,\"Warning\")!=0){\n        china=1;\n    }\n    else{\n        china=0;\n    }\n    if (white==1)\n    {\n        if (china==0)\n        {\n        print(\"warning white ip not china\"$0);\n        ret=system(\"grep \"$0\" \"logfile);\n        if (ret!=0)\n        {\n            ret=system(\"grep \"$0\" \"dnslogfile);\n        }\n        }\n    }else if (china==1)\n\t{\n\t\tprint(\"warning china ip not white\"$0);\n\t\tret=system(\"grep \"$0\" \"logfile)\n\t\tif (ret!=0)\n\t\t{\n\t\t\tret=system(\"grep \"$0\" \"dnslogfile);\n\t\t}\n\t\tif (dlchina)\n\t\t{\n\t\t\tsystem(\"ipset del gfwlist \"$0);\n\t\t}\n\t}  \n}'"
  },
  {
    "path": "luci-app-autoipsetadder/root/usr/bin/autoipsetadder/tailto.sh",
    "content": "#!/bin/sh\ntail -n $1 \"$2\" > /var/run/tailtmp\ncat /var/run/tailtmp > \"$2\"\nrm /var/run/tailtmp"
  },
  {
    "path": "luci-app-autoipsetadder/root/usr/bin/autoipsetadder/testip.sh",
    "content": "#!/bin/sh\nconfig=$(uci get autoipsetadder.autoipsetadder.config 2>/dev/null)\n[ \"${config//pingadd/}\" == \"$config\" ] && pingadd=\"0\" || pingadd=\"1\"\necho $* | awk -v pingadd=\"$pingadd\" '{\nif ($4==\"\")\n{ \nwait=0;\n}else\n{wait=$4;}\nsystem(\"sleep \"wait);\nERRNO=\"\";\npidfile=\"/tmp/run/autoipsetadder/\"$2\ngetline drop< pidfile;\nclose(pidfile);\nif (ERRNO) {\naddlist=0;\nprint(\"bypass\"$1\" \"$2);\nnext;}\nif ($3==\"443\")\n{\ncmd=(\"httping -c 1 -t 4 -l \"$2\" --divert-connect \"$1);\n}\nelse if ($3==\"80\")\n{\ncmd=(\"httping -c 1 -t 4 \"$2\" --divert-connect \"$1);\n}\naddlist=0;\nslow=0;\nwhile ((cmd | getline ret) > 0)\n{\n    if (addlist!=0)\n    {\n        continue;\n    }\n    else if (index(ret,\"short read\")!=0)\n    {\n        if (system(\"httping -q -c 1 -t 4 -l \"$2\" --divert-connect \"$1)==0)\n        {\n            addlist=-1;\n            break;\n        }else{\n            print(\"doname rst autoaddip \"$1\" \"$2);\n            addlist=1;\n        }\n    } \n    else if (index(ret,\"timeout\")!=0)\n    {\n        while ((cmd | getline ret) > 0)\n        {\n            if (index(ret,\"timeout\")!=0)\n            {\n                print(\"direct so slow autoaddip \"$1\" \"$2);\n                addlist=1;\n                slow=1;\n            }\n        }\n    }else if (index(ret,\"SSL handshake error: (null)\")!=0)\n    {\n        if(system(\"curl -m 10 --resolve \"$2\":443:\"$1\" https://\"$2\" -o /dev/null 2>/dev/null\")==0){\n            addlist=-1;\n            break;\n        }\n    }else if (index(ret,\"Connection refused\")!=0){\n        print(\"direct Connection refused autoaddip\"$1\" \"$2);\n        addlist=1;\n    }\n}\nclose(cmd);\n\nif (addlist!=1)\n{\n    if (addlist==0){\n        split(ret, c,\"[ /]+\");\n        print(c[6]);\n        if (c[6]==\"failed,\"){\n            print(\"can not connect autoaddip \"$1\" \"$2);\n            addlist=1;\n        }\n        else if (c[6]+0>10000)\n        {\n            print(\"direct ssl so slow autoaddip \"$1\" \"$2);\n            addlist=1;\n        }else{\n            addlist=-1;}\n    }\n    if (addlist==-1 && pingadd==1)\n    {\n        while ((\"ping -c 5 -q -A \"$1 | getline ret) > 0)\n        {\n            if (index(ret,\"packet loss\")!=0)\n            {\n                split(ret, p,\"[ ]+\");\n                if (p[4]>0 && p[4]<5)\n                {\n                    print(\"ping packet loss autoaddip \"$1\" \"$2);\n                    pingloss=1;\n                    addlist=1;\n                }else{pingloss=0;}\n                break;\n            } \n        }\n        close(\"ping -c 5 -q \"$1);\n    }\n}\nERRNO=\"\";\nif (pingloss!=1){\n    getline drop< pidfile;\n    close(pidfile);\n}\nif (ERRNO) {addlist=0;next;}\nif (addlist==1){\nsystem(\"ipset add gfwlist \"$1);\nwhile ((cmd | getline ret) > 0)\n{\n    if (addlist==1)\n    {\n    if (index(ret,\"short read\")!=0)\n    {\n    system(\"ipset del gfwlist \"$1);\n    print(\"doname proxy rst autodelip \"$1\" \"$2);\n    addlist=-2;\n    }\n    else if (index(ret,\"SSL handshake error: (null)\")!=0)\n    {\n        if(system(\"curl -m 10 --resolve \"$2\":443:\"$1\" https://\"$2\" -o /dev/null 2>/dev/null\")==0)\n        {\n            addlist=2;\n        }\n    }\n    }\n}\nclose(cmd);\nif (addlist==1){\n    split(ret, c,\"[ /]+\");\n    print(c[6]);\n    if (c[6]==\"failed,\")\n    {\n        system(\"ipset del gfwlist \"$1);\n        print(\"proxy can not connect autodelip \"$1\" \"$2);\n        addlist=-2;\n    }else{\n        addlist=2;\n    }\n}\n}\n}END{\nif (addlist==2)\n{   if (pingloss==0){\n    ERRNO=\"\";\n    getline drop< pidfile;\n    if (ERRNO) {\n        system(\"ipset del gfwlist \"$1);\n        print(\"cancel add myself \"$1\" \"$2\" due to one ip success direct\");\n    }else{\n    print $1\"\\n\">>pidfile;\n    }\n    close(pidfile);}\n}else if (addlist==-1)\n{\n    print($1\" \"$2\" direct success\");\n    while ((getline ret< pidfile) > 0)\n    {\n        if (ret!=\"\"){\n        system(\"ipset del gfwlist \"ret);\n        print(\"cancel add someone \"ret\" \"$2\" due to me\"$1\" success direct\");\n        }\n    }\n    close(pidfile);\n    system(\"rm \"pidfile\" 2>/dev/null\");\n    print($1\" del \"$2);\n}else if (addlist==-2)\n{   \n    system(\"sleep 10\");\n    while ((getline ret< pidfile) > 0)\n    {\n        if (ret!=\"\"){\n        system(\"ipset add gfwlist \"$1);\n        print(\"add \"ret\" \"$2\" due to one ip success proxy\");\n        break;}\n    }\n    close(pidfile);\n}}'"
  },
  {
    "path": "luci-app-beardropper/Makefile",
    "content": "#\n# Copyright (C) 2020 Nate Ding\n#\n# This is free software, licensed under the GNU General Public License v3.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_Title:=LuCI Support for BearDropper\nLUCI_PKGARCH=all\n\nPKG_VERSION:=1.1\nPKG_RELEASE:=20200522\n\nPKG_MAINTANINER:=Nate Ding <natelol@github.com>\nPKG_LICENSE:=GLPv3\nPKG_LICENSE_FILES:=LICENSE\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-beardropper/luasrc/controller/beardropper.lua",
    "content": "module(\"luci.controller.beardropper\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/beardropper\") then\n\t\treturn\n\tend\n\n\tlocal page = entry({\"admin\", \"services\", \"beardropper\"}, alias(\"admin\", \"services\", \"beardropper\", \"setting\"), _(\"BearDropper\"))\n\tpage.order = 20\n\tpage.dependent = true\n\tpage.acl_depends = { \"luci-app-beardropper\" }\n\n\tentry({\"admin\", \"services\", \"beardropper\", \"setting\"}, cbi(\"beardropper/setting\"), _(\"Setting\"), 30).leaf = true\n\tentry({\"admin\", \"services\", \"beardropper\", \"log\"}, form(\"beardropper/log\"), _(\"Log\"), 40).leaf = true\n\tentry({\"admin\", \"services\", \"beardropper\", \"status\"}, call(\"act_status\"))\nend\n\nfunction act_status()\n\tlocal e = {}\n\te.running = luci.sys.call(\"pgrep -f /usr/sbin/beardropper >/dev/null\") == 0\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n"
  },
  {
    "path": "luci-app-beardropper/luasrc/model/cbi/beardropper/log.lua",
    "content": "f = SimpleForm(\"logview\")\nf.reset = false\nf.submit = false\n\nt = f:field(TextValue, \"conf\")\nt.rmempty = true\nt.rows = 20\n\nfunction t.cfgvalue()\nlocal logs = luci.util.execi(\"logread | grep authpriv | grep beardropper\")\nlocal s = \"\"\nfor line in logs do\ns = line .. \"\\n\" .. s\nend\nreturn s\nend\nt.readonly=\"readonly\"\n\nreturn f\n"
  },
  {
    "path": "luci-app-beardropper/luasrc/model/cbi/beardropper/setting.lua",
    "content": "\nm = Map(\"beardropper\", translate(\"BearDropper\"), \ntranslate(\"luci-app-beardropper, the LuCI app built with the elegant firewall rule generation on-the-fly script bearDropper. <br /> <br /> Should you have any questions, please refer to the repo: \")..[[<a href=\"https://github.com/NateLol/luci-app-bearDropper\" target=\"_blank\">luci-app-beardropper</a>]]\n)\nm:chain(\"luci\")\n\nm:section(SimpleSection).template  = \"beardropper/beardropper_status\"\n\ns = m:section(TypedSection, \"beardropper\", translate(\"\"))\ns.anonymous = true\ns.addremove = false\n\n-- TABS \ns:tab(\"options\", translate(\"Options\"))\ns:tab(\"blocked\", translate(\"Blocked IP\"))\n\no = s:taboption(\"options\", Flag, \"enabled\", translate(\"Enabled\"))\no.default = 0\n\n-- OPTIONS\no = s:taboption(\"options\", ListValue, \"defaultMode\", translate(\"Running Mode\"))\no.default = \"follow\"\no:value(\"follow\", translate(\"Follow\"))\no:value(\"entire\", translate(\"Entire\"))\no:value(\"today\", translate(\"Today\"))\no:value(\"wipe\", translate(\"Wipe\"))\n\n\no = s:taboption(\"options\", Value, \"attemptCount\", translate(\"Attempt Tolerance\"), translate(\"failure attempts from a given IP required to trigger a ban\"))\n\no = s:taboption(\"options\", Value, \"attemptPeriod\", translate(\"Attempt Cycle\"), translate(\"time period during which attemptCount must be exceeded in order to trigger a ban <br> Format: 1w2d3h4m5s represents 1week 2days 3hours 4minutes 5 seconds\"))\n\no = s:taboption(\"options\", Value, \"banLength\", translate(\"Ban Period\"), translate(\"how long a ban exist once the attempt threshold is exceeded\"))\n\no = s:taboption(\"options\", ListValue, \"logLevel\", translate(\"Log Level\"))\no.default = \"1\"\no:value(\"0\", translate(\"Silent\"))\no:value(\"1\", translate(\"Default\"))\no:value(\"2\", translate(\"Verbose\"))\no:value(\"3\", translate(\"Debug\"))\n\n\no = s:taboption(\"blocked\", Value, \"blocked\", translate(\"Blocked IP List\"))\no.template = \"cbi/tvalue\"\no.rows = 40\no.wrap = \"off\"\no.readonly = \"true\"\nfunction o.cfgvalue(e, e)\n\treturn luci.sys.exec(\"cat /tmp/beardropper.bddb | awk /'=1/'| awk -F '=' '{print $1}' | awk '{print substr($0,6)}' | awk 'gsub(/_/,\\\":\\\",$0)'\")\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-beardropper/luasrc/view/beardropper/beardropper_status.htm",
    "content": "<script type=\"text/javascript\">//<![CDATA[\nXHR.poll(3, '<%=url([[admin]], [[services]], [[beardropper]], [[status]])%>', null,\n\tfunction(x, data) {\n\t\tvar tb = document.getElementById('beardropper_status');\n\t\tif (data && tb) {\n\t\t\tif (data.running) {\n\t\t\t\tvar links = '<em><b><font color=green>BearDropper <%:RUNNING%></font></b></em>';\n\t\t\t\ttb.innerHTML = links;\n\t\t\t} else {\n\t\t\t\ttb.innerHTML = '<em><b><font color=red>BearDropper <%:NOT RUNNING%></font></b></em>';\n\t\t\t}\n\t\t}\n\t}\n);\n//]]>\n</script>\n<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>\n<fieldset class=\"cbi-section\">\n\t<p id=\"beardropper_status\">\n\t\t<em><%:Collecting data...%></em>\n\t</p>\n</fieldset>\n"
  },
  {
    "path": "luci-app-beardropper/po/zh_Hans/beardropper.po",
    "content": "bearDropper#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36\nmsgid \"Attempt Cycle\"\nmsgstr \"尝试登录时间段\"\n\n\nmsgid \"Setting\"\nmsgstr \"设置\"\n\nmsgid \"Log\"\nmsgstr \"日志\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:34\nmsgid \"Attempt Tolerance\"\nmsgstr \"最大尝试登录次数\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:38\nmsgid \"Ban Period\"\nmsgstr \"封禁IP时长\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/controller/bearDropper.lua:7\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:7\nmsgid \"BearDropper\"\nmsgstr \"\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:20\nmsgid \"Blocked IP\"\nmsgstr \"屏蔽列表\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:52\nmsgid \"Blocked IP List\"\nmsgstr \"已屏蔽IP列表\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:20\nmsgid \"Collecting data...\"\nmsgstr \"\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:45\nmsgid \"Debug\"\nmsgstr \"调试\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:43\nmsgid \"Default\"\nmsgstr \"默认\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:22\nmsgid \"Enabled\"\nmsgstr \"启用\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:29\nmsgid \"Entire\"\nmsgstr \"已有记录\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:28\nmsgid \"Follow\"\nmsgstr \"后台监控\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:40\nmsgid \"Log Level\"\nmsgstr \"日志等级\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:10\nmsgid \"NOT RUNNING\"\nmsgstr \"\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:19\nmsgid \"Options\"\nmsgstr \"选项\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:7\nmsgid \"RUNNING\"\nmsgstr \"\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:26\nmsgid \"Running Mode\"\nmsgstr \"运行模式\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:42\nmsgid \"Silent\"\nmsgstr \"安静\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:30\nmsgid \"Today\"\nmsgstr \"仅今日\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:44\nmsgid \"Verbose\"\nmsgstr \"详细\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:31\nmsgid \"Wipe\"\nmsgstr \"清除所有\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:34\nmsgid \"failure attempts from a given IP required to trigger a ban\"\nmsgstr \"尝试登录超过设定值次数的IP将被封禁\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:38\nmsgid \"how long a ban exist once the attempt threshold is exceeded\"\nmsgstr \"IP将被封禁设定的时间\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:8\nmsgid \"\"\n\"luci-app-beardropper, the LuCI app built with the elegant firewall rule \"\n\"generation on-the-fly script bearDropper. <br /> <br /> Should you have any \"\n\"questions, please refer to the repo:\"\nmsgstr \"\"\n\"luci-app-beardropper, 是一款能够在开启公网访问之后对潜在的ssh attack进行防御\"\n\"的脚本. <br /> <br /> 如果你在使用中有任何问题，请到项目中提问: \"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36\nmsgid \"\"\n\"time period during which attemptCount must be exceeded in order to trigger a \"\n\"ban <br> Format: 1w2d3h4m5s represents 1week 2days 3hours 4minutes 5 seconds\"\nmsgstr \"\"\n\"在设定的时间段内连续尝试失败 <br> 格式：1w2d3h4m5s代表1周2天3小时4分5秒\"\n"
  },
  {
    "path": "luci-app-beardropper/po/zh_Hant/beardropper.po",
    "content": "bearDropper#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36\nmsgid \"Attempt Cycle\"\nmsgstr \"嘗試登錄時間段\"\n\n\nmsgid \"Setting\"\nmsgstr \"設置\"\n\nmsgid \"Log\"\nmsgstr \"日誌\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:34\nmsgid \"Attempt Tolerance\"\nmsgstr \"最大嘗試登錄次數\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:38\nmsgid \"Ban Period\"\nmsgstr \"封禁IP時長\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/controller/bearDropper.lua:7\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:7\nmsgid \"BearDropper\"\nmsgstr \"\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:20\nmsgid \"Blocked IP\"\nmsgstr \"屏蔽列表\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:52\nmsgid \"Blocked IP List\"\nmsgstr \"已屏蔽IP列表\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:20\nmsgid \"Collecting data...\"\nmsgstr \"\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:45\nmsgid \"Debug\"\nmsgstr \"調試\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:43\nmsgid \"Default\"\nmsgstr \"默認\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:22\nmsgid \"Enabled\"\nmsgstr \"啟用\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:29\nmsgid \"Entire\"\nmsgstr \"已有記錄\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:28\nmsgid \"Follow\"\nmsgstr \"後臺監控\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:40\nmsgid \"Log Level\"\nmsgstr \"日誌等級\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:10\nmsgid \"NOT RUNNING\"\nmsgstr \"\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:19\nmsgid \"Options\"\nmsgstr \"選項\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/view/bearDropper/status.htm:7\nmsgid \"RUNNING\"\nmsgstr \"\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:26\nmsgid \"Running Mode\"\nmsgstr \"運行模式\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:42\nmsgid \"Silent\"\nmsgstr \"安靜\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:30\nmsgid \"Today\"\nmsgstr \"僅今日\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:44\nmsgid \"Verbose\"\nmsgstr \"詳細\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:31\nmsgid \"Wipe\"\nmsgstr \"清除所有\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:34\nmsgid \"failure attempts from a given IP required to trigger a ban\"\nmsgstr \"嘗試登錄超過設定值次數的IP將被封禁\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:38\nmsgid \"how long a ban exist once the attempt threshold is exceeded\"\nmsgstr \"IP將被封禁設定的時間\"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:8\nmsgid \"\"\n\"luci-app-beardropper, the LuCI app built with the elegant firewall rule \"\n\"generation on-the-fly script bearDropper. <br /> <br /> Should you have any \"\n\"questions, please refer to the repo:\"\nmsgstr \"\"\n\"luci-app-beardropper, 是壹款能夠在開啟公網訪問之後對潛在的ssh attack進行防禦\"\n\"的腳本. <br /> <br /> 如果妳在使用中有任何問題，請到項目中提問: \"\n\n#: ../../package/feeds/luci/luci-app-beardropper/luasrc/model/cbi/bearDropper/setting.lua:36\nmsgid \"\"\n\"time period during which attemptCount must be exceeded in order to trigger a \"\n\"ban <br> Format: 1w2d3h4m5s represents 1week 2days 3hours 4minutes 5 seconds\"\nmsgstr \"\"\n\"在設定的時間段內連續嘗試失敗 <br> 格式：1w2d3h4m5s代表1周2天3小時4分5秒\"\n"
  },
  {
    "path": "luci-app-beardropper/root/etc/config/beardropper",
    "content": "config beardropper\n\toption attemptCount '5'\n\toption attemptPeriod '12h'\n\toption banLength '1w'\n\toption logFacility 'authpriv.notice'\n\toption fileStateType 'bddb'\n\toption fileStateTempPrefix '/tmp/beardropper'\n\toption fileStatePersistPrefix '/etc/beardropper'\n\tlist firewallHookChain 'input_wan_rule:1'\n\tlist firewallHookChain 'forwarding_wan_rule:1'\n\toption firewallTarget 'DROP'\n\tlist logRegex 's/[`$\"\\'\\'']//g'\n\tlist logRegex '/has invalid shell, rejected$/d'\n\tlist logRegex '/^[A-Za-z ]+[0-9: ]+authpriv.warn dropbear\\[.+([0-9]+\\.){3}[0-9]+/p'\n\tlist logRegex '/^[A-Za-z ]+[0-9: ]+authpriv.info dropbear\\[.+:\\ Exit before auth:.*/p'\n\toption defaultMode 'follow'\n\toption enabled '1'\n\toption logLevel '2'\n"
  },
  {
    "path": "luci-app-beardropper/root/etc/init.d/beardropper",
    "content": "#!/bin/sh /etc/rc.common\nSTART=98\n\nPROG=/usr/sbin/beardropper\nSERVICE_DAEMONIZE=1\nSERVICE_WRITE_PID=1\n\ngetKids() { \n egrep \"^PPid:\t*$1$\" /proc/[0-9]*/s*s 2>/dev/null | cut -f3 -d/ | xargs echo\n}\n\nstart() {\n    service_start ${PROG} -m follow   \n    echo \"beardropper started!\"\n}\n\nstop() {\n    #PID=`cat /var/run/bearDropper.pid`\n\t#kill `getKids $PID`\n\tkill -9 `pgrep -f /usr/sbin/beardropper`\n\tsleep 1\n        service_stop ${PROG}\n\techo \"beardropper exit....\"\n}\n\nrestart() {\n\tenabled=$(uci get beardropper.@beardropper[0].enabled)\n\tpgrep -f ${PROG} >/dev/null\n\tif [ $? -eq 0 ];then #running\n\t\tif [ $enabled -eq 1 ]; then\n\t\t\tstop \n\t\t\tsleep 1\n\t\t\techo \"beardropper is restarting...\"\n\t\t\tstart\n\t\telse \n\t\t\tstop\n\t\tfi\n\telse\n\t\tif [ $enabled -eq 1 ]; then\n\t\t\tstart\n\t\telse\n\t\t\texit 0\n\t\tfi\n\tfi\n\n}\n"
  },
  {
    "path": "luci-app-beardropper/root/etc/uci-defaults/luci-beardropper",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@beardropper[-1]\n\tadd ucitrack beardropper\n\tset ucitrack.@beardropper[-1].init=beardropper\n\tcommit ucitrack\nEOF\n\ntouch /tmp/beardropper.bddb\nrm -rf /tmp/luci-*\nexit 0\n"
  },
  {
    "path": "luci-app-beardropper/root/usr/sbin/beardropper",
    "content": "#!/bin/ash\n#\n# beardropper - dropbear log parsing ban agent for OpenWRT (Chaos Calmer rewrite of dropBrute.sh)\n#   http://github.com/robzr/bearDropper  -- Rob Zwissler 11/2015\n# \n#   - lightweight, no dependencies, busybox ash + native OpenWRT commands\n#   - uses uci for configuration, overrideable via command line arguments\n#   - runs continuously in background (via init script) or periodically (via cron)\n#   - uses BIND time shorthand, ex: 1w5d3h1m8s is 1 week, 5 days, 3 hours, 1 minute, 8 seconds\n#   - Whitelist IP or CIDR entries (TBD) in uci config file\n#   - Records state file to tmpfs and intelligently syncs to persistent storage (can disable)\n#   - Persistent sync routines are optimized to avoid excessive writes (persistentStateWritePeriod)\n#   - Every run occurs in one of the following modes. If not specified, interval mode (24 hours) is \n#     the default when not specified (the init script specifies follow mode via command line)\n# \n#     \"follow\" mode follows syslog to process entries as they happen; generally launched via init\n#        script. Responds the fastest, runs the most efficiently, but is always in memory.\n#     \"interval\" mode only processes entries going back the specified interval; requires \n#       more processing than today mode, but responds more accurately. Use with cron.\n#     \"today\" mode looks at log entries from the day it is being run, simple and lightweight, \n#       generally run from cron periodically (same simplistic behavior as dropBrute.sh)\n#     \"entire\" mode runs through entire contents of the syslog ring buffer\n#     \"wipe\" mode tears down the firewall rules and removes the state files\n\n# Load UCI config variable, or use default if not set\n# Args: $1 = variable name (also uci option name), $2 = default_value\nuciSection='beardropper.@[0]'\nuciLoadVar () { \n  local getUci\n  getUci=`uci -q get ${uciSection}.\"$1\"` || getUci=\"$2\" \n  eval $1=\\'$getUci\\'; \n}\nuciLoad() {\n  local tFile=`mktemp` delim=\"\n\"\n  [ \"$1\" = -d ] && { delim=\"$2\"; shift 2; }\n  uci -q -d\"$delim\" get \"$uciSection.$1\" 2>/dev/null >$tFile\n  if [ $? = 0 ] ; then\n    sed -e s/^\\'// -e s/\\'$// <$tFile\n  else\n    while [ -n \"$2\" ]; do echo $2; shift; done\n  fi\n  rm -f $tFile\n}\n\n# Common config variables - edit these in /etc/config/beardropper\n# or they can be overridden at runtime with command line options\n#\nuciLoadVar defaultMode entire\nuciLoadVar enabled 0\nuciLoadVar attemptCount 10\nuciLoadVar attemptPeriod 12h\nuciLoadVar banLength 1w\nuciLoadVar logLevel 1\nuciLoadVar logFacility authpriv.notice\nuciLoadVar persistentStateWritePeriod -1\nuciLoadVar fileStateType bddb\nuciLoadVar fileStateTempPrefix /tmp/beardropper\nuciLoadVar fileStatePersistPrefix /etc/beardropper\nfirewallHookChains=\"`uciLoad -d \\  firewallHookChain input_wan_rule:1 forwarding_wan_rule:1`\"\nuciLoadVar firewallTarget DROP\n\n# Not commonly changed, but changeable via uci or cmdline (primarily \n# to enable multiple parallel runs with different parameters)\nuciLoadVar firewallChain beardropper\n\n# Advanced variables, changeable via uci only (no cmdline), it is \n# unlikely that these will need to be changed, but just in case...\n#\nuciLoadVar syslogTag \"beardropper[$$]\"\n# how often to attempt to expire bans when in follow mode\nuciLoadVar followModeCheckInterval 30m\t\nuciLoadVar cmdLogread 'logread'\t\t# for tuning, ex: \"logread -l250\"\nuciLoadVar cmdLogreadEba 'logread'\t# for \"Exit before auth:\" backscanning\nuciLoadVar formatLogDate '%b %e %H:%M:%S %Y'\t# used to convert syslog dates\nuciLoadVar formatTodayLogDateRegex '^%a %b %e ..:..:.. %Y'\t# filter for today mode\n\n# Begin functions\n#\n# Clear bddb entries from environment\nbddbClear () { \n  local bddbVar\n  for bddbVar in `set | egrep '^bddb_[0-9_]*=' | cut -f1 -d= | xargs echo -n` ; do eval unset $bddbVar ; done\n  bddbStateChange=1\n}\n\n# Returns count of unique IP entries in environment\nbddbCount () { set | egrep '^bddb_[0-9_]*=' | wc -l ; }\n\n# Loads existing bddb file into environment\n# Arg: $1 = file, $2 = type (bddb/bddbz), $3 = \nbddbLoad () { \n  local loadFile=\"$1.$2\" fileType=\"$2\"\n  if [ \"$fileType\" = bddb -a -f \"$loadFile\" ] ; then\n    . \"$loadFile\"\n  elif [ \"$fileType\" = bddbz -a -f \"$loadFile\" ] ; then\n    local tmpFile=\"`mktemp`\"\n    zcat $loadFile > \"$tmpFile\"\n    . \"$tmpFile\"\n    rm -f \"$tmpFile\"\n  fi\n  bddbStateChange=0\n}\n\n# Saves environment bddb entries to file, Arg: $1 = file to save in\nbddbSave () { \n  local saveFile=\"$1.$2\" fileType=\"$2\"\n  if [ \"$fileType\" = bddb ] ; then\n    set | egrep '^bddb_[0-9_]*=' | sed s/\\'//g > \"$saveFile\"\n  elif [ \"$fileType\" = bddbz ] ; then\n    set | egrep '^bddb_[0-9_]*=' | sed s/\\'//g | gzip -c > \"$saveFile\"\n  fi\n  bddbStateChange=0 \n}\n\n# Set bddb record status=1, update ban time flag with newest\n# Args: $1=IP Address $2=timeFlag\nbddbEnableStatus () {\n  local record=`echo $1 | sed -e 's/\\./_/g' -e 's/^/bddb_/'`\n  local newestTime=`bddbGetTimes $1 | sed 's/.* //' | xargs echo $2 | tr \\  '\\n' | sort -n | tail -1 `\n  eval $record=\"1,$newestTime\"\n  bddbStateChange=1\n}\n\n# Args: $1=IP Address\nbddbGetStatus () {\n  bddbGetRecord $1 | cut -d, -f1\n}\n\n# Args: $1=IP Address\nbddbGetTimes () {\n  bddbGetRecord $1 | cut -d, -f2-\n}\n\n# Args: $1 = IP address, $2 [$3 ...] = timestamp (seconds since epoch)\nbddbAddRecord () {\n  local ip=\"`echo \"$1\" | tr . _`\" ; shift\n  local newEpochList=\"$@\" status=\"`eval echo \\\\\\$bddb_$ip | cut -f1 -d,`\"\n  local oldEpochList=\"`eval echo \\\\\\$bddb_$ip | cut -f2- -d,  | tr , \\ `\" \n  local epochList=`echo $oldEpochList $newEpochList | xargs -n 1 echo | sort -un | xargs echo -n | tr \\  ,`\n  [ -z \"$status\" ] && status=0\n  eval \"bddb_$ip\"\\=\\\"$status,$epochList\\\"\n  bddbStateChange=1\n}\n\n# Args: $1 = IP address\nbddbRemoveRecord () {\n  local ip=\"`echo \"$1\" | tr . _`\"\n  eval unset bddb_$ip\n  bddbStateChange=1\n}\n\n# Returns all IPs (not CIDR) present in records\nbddbGetAllIPs () { \n  local ipRaw record\n  set | egrep '^bddb_[0-9_]*=' | tr \\' \\  | while read record ; do\n    ipRaw=`echo $record | cut -f1 -d= | sed 's/^bddb_//'`\n    if [ `echo $ipRaw | tr _ \\  | wc -w` -eq 4 ] ; then\n      echo $ipRaw | tr _ .\n    fi\n  done\n}\n\n# retrieve single IP record, Args: $1=IP\nbddbGetRecord () {\n  local record\n  record=`echo $1 | sed -e 's/\\./_/g' -e 's/^/bddb_/'`\n  eval echo \\$$record\n}\n\nisValidBindTime () { echo \"$1\" | egrep -q '^[0-9]+$|^([0-9]+[wdhms]?)+$' ; }\n\n# expands Bind time syntax into seconds (ex: 3w6d23h59m59s), Arg: $1=time string\nexpandBindTime () {\n  isValidBindTime \"$1\" || { logLine 0 \"Error: Invalid time specified ($1)\" >&2 ; exit 254 ; }\n  echo $((`echo \"$1\" | sed -e 's/w+*/*7d+/g' -e 's/d+*/*24h+/g' -e 's/h+*/*60m+/g' -e 's/m+*/*60+/g' \\\n    -e s/s//g -e s/+\\$//`))\n}\n\n# Args: $1 = loglevel, $2 = info to log\nlogLine () {\n  [ $1 -gt $logLevel ] && return\n  shift\n  if [ \"$logFacility\" = \"stdout\" ] ; then echo \"$@\"\n  elif [ \"$logFacility\" = \"stderr\" ] ; then echo \"$@\" >&2\n  else logger -t \"$syslogTag\" -p \"$logFacility\" \"$@\"\n  fi\n}\n\n# extra validation, fails safe. Args: $1=log line\ngetLogTime () {\n  local logDateString=`echo \"$1\" | sed -n \\\n    's/^[A-Z][a-z]* \\([A-Z][a-z]*  *[0-9][0-9]*  *[0-9][0-9]*:[0-9][0-9]:[0-9][0-9] [0-9][0-9]*\\) .*$/\\1/p'`\n  date -d\"$logDateString\" -D\"$formatLogDate\" +%s || logLine 1 \\\n    \"Error: logDateString($logDateString) malformed line ($1)\"\n}\n\n# extra validation, fails safe. Args: $1=log line\ngetLogIP () { \n  local logLine=\"$1\"\n  local ebaPID=`echo \"$logLine\" | sed -n 's/^.*authpriv.info \\(dropbear\\[[0-9]*\\]:\\) Exit before auth:.*/\\1/p'`\n  [ -n \"$ebaPID\" ] && logLine=`$cmdLogreadEba | fgrep \"${ebaPID} Child connection from \"`\n  echo \"$logLine\" | sed -n 's/^.*[^0-9]\\([0-9][0-9]*\\.[0-9][0-9]*\\.[0-9][0-9]*\\.[0-9][0-9]*\\).*$/\\1/p'\n}\n\n# Args: $1=IP\nunBanIP () {\n  if iptables -C $firewallChain -s $ip -j \"$firewallTarget\" 2>/dev/null ; then\n    logLine 1 \"Removing ban rule for IP $ip from iptables\"\n    iptables -D $firewallChain -s $ip -j \"$firewallTarget\"\n  else\n    logLine 3 \"unBanIP() Ban rule for $ip not present in iptables\"\n  fi\n}\n\n# Args: $1=IP\nbanIP () {\n  local ip=\"$1\" x chain position\n  if ! iptables -nL $firewallChain >/dev/null 2>/dev/null ; then  \n    logLine 1 \"Creating iptables chain $firewallChain\"\n    iptables -N $firewallChain\n  fi\n  for x in $firewallHookChains ; do\n    chain=\"${x%:*}\" ; position=\"${x#*:}\"\n    if [ $position -ge 0 ] &&  ! iptables -C $chain -j $firewallChain 2>/dev/null ; then\n      logLine 1 \"Inserting hook into iptables chain $chain\"\n      if [ $position = 0 ] ; then\n        iptables -A $chain -j $firewallChain\n      else\n        iptables -I $chain $position -j $firewallChain\n    fi ; fi \n  done\n  if ! iptables -C $firewallChain -s $ip -j \"$firewallTarget\" 2>/dev/null ; then\n    logLine 1 \"Inserting ban rule for IP $ip into iptables chain $firewallChain\"\n    iptables -A $firewallChain -s $ip -j \"$firewallTarget\"\n  else\n    logLine 3 \"banIP() rule for $ip already present in iptables chain\"\n  fi\n}\n\nwipeFirewall () {\n  local x chain position\n  for x in $firewallHookChains ; do\n    chain=\"${x%:*}\" ; position=\"${x#*:}\"\n    if [ $position -ge 0 ] ; then\n      if iptables -C $chain -j $firewallChain 2>/dev/null ; then\n        logLine 1 \"Removing hook from iptables chain $chain\"\n        iptables -D $chain -j $firewallChain\n    fi ; fi\n  done\n  if iptables -nL $firewallChain >/dev/null 2>/dev/null ; then  \n    logLine 1 \"Flushing and removing iptables chain $firewallChain\"\n    iptables -F $firewallChain 2>/dev/null\n    iptables -X $firewallChain 2>/dev/null\n  fi\n}\n\n# review state file for expired records - we could add the bantime to\n# the rule via --comment but I can't think of a reason why that would\n# be necessary unless there is a bug in the expiration logic. The\n# state db should be more resiliant than the firewall in practice.\n#\nbddbCheckStatusAll () {\n  local now=`date +%s`\n  bddbGetAllIPs | while read ip ; do\n    if [ `bddbGetStatus $ip` -eq 1 ] ; then\n      logLine 3 \"bddbCheckStatusAll($ip) testing banLength:$banLength + bddbGetTimes:`bddbGetTimes $ip` vs. now:$now\"\n      if [ $((banLength + `bddbGetTimes $ip`)) -lt $now ] ; then\n        logLine 1 \"Ban expired for $ip, removing from iptables\"\n        unBanIP $ip\n        bddbRemoveRecord $ip\n      else \n        logLine 3 \"bddbCheckStatusAll($ip) not expired yet\"\n        banIP $ip\n      fi\n    elif [ `bddbGetStatus $ip` -eq 0 ] ; then\n      local times=`bddbGetTimes $ip | tr , \\ `\n      local timeCount=`echo $times | wc -w`\n      local lastTime=`echo $times | cut -d\\  -f$timeCount`\n      if [ $((lastTime + attemptPeriod)) -lt $now ] ; then\n        bddbRemoveRecord $ip\n    fi ; fi\n    saveState\n  done\n  loadState\n}\n\n# Only used when status is already 0 and possibly going to 1, Args: $1=IP\nbddbEvaluateRecord () {\n  local ip=$1 firstTime lastTime\n  local times=`bddbGetRecord $1 | cut -d, -f2- | tr , \\ `\n  local timeCount=`echo $times | wc -w`\n  local didBan=0\n  \n  # 1: not enough attempts => do nothing and exit\n  # 2: attempts exceed threshold in time period => ban\n  # 3: attempts exceed threshold but time period is too long => trim oldest time, recalculate\n  while [ $timeCount -ge $attemptCount ] ; do\n    firstTime=`echo $times | cut -d\\  -f1`\n    lastTime=`echo $times | cut -d\\  -f$timeCount`\n    timeDiff=$((lastTime - firstTime))\n    logLine 3 \"bddbEvaluateRecord($ip) count=$timeCount timeDiff=$timeDiff/$attemptPeriod\"\n    if [ $timeDiff -le $attemptPeriod ] ; then\n      bddbEnableStatus $ip $lastTime\n      logLine 2 \"bddbEvaluateRecord($ip) exceeded ban threshold, adding to iptables\"\n      banIP $ip\n      didBan=1\n    fi\n    times=`echo $times | cut -d\\  -f2-`\n    timeCount=`echo $times | wc -w`\n  done  \n  [ $didBan = 0 ] && logLine 2 \"bddbEvaluateRecord($ip) does not exceed threshhold, skipping\"\n}\n\n# Reads filtered log line and evaluates for action  Args: $1=log line\nprocessLogLine () {\n  local time=`getLogTime \"$1\"` \n  local ip=`getLogIP \"$1\"` \n  local status=\"`bddbGetStatus $ip`\"\n\n  if [ \"$status\" = -1 ] ; then\n    logLine 2 \"processLogLine($ip,$time) IP is whitelisted\"\n  elif [ \"$status\" = 1 ] ; then\n    if [ \"`bddbGetTimes $ip`\" -ge $time ] ; then\n      logLine 2 \"processLogLine($ip,$time) already banned, ban timestamp already equal or newer\"\n    else\n      logLine 2 \"processLogLine($ip,$time) already banned, updating ban timestamp\"\n      bddbEnableStatus $ip $time\n    fi\n    banIP $ip\n  elif [ -n \"$ip\" -a -n \"$time\" ] ; then\n    bddbAddRecord $ip $time\n    logLine 2 \"processLogLine($ip,$time) Added record, comparing\"\n    bddbEvaluateRecord $ip \n  else\n    logLine 1 \"processLogLine($ip,$time) malformed line ($1)\"\n  fi\n}\n\n# Args, $1=-f to force a persistent write (unless lastPersistentStateWrite=-1)\nsaveState () {\n  local forcePersistent=0\n  [ \"$1\" = \"-f\" ] && forcePersistent=1\n\n  if [ $bddbStateChange -gt 0 ] ; then\n    logLine 3 \"saveState() saving to temp state file\"\n    bddbSave \"$fileStateTempPrefix\" \"$fileStateType\"\n    logLine 3 \"saveState() now=`date +%s` lPSW=$lastPersistentStateWrite pSWP=$persistentStateWritePeriod fP=$forcePersistent\"\n  fi    \n  if [ $persistentStateWritePeriod -gt 1 ] || [ $persistentStateWritePeriod -eq 0 -a $forcePersistent -eq 1 ] ; then\n    if [ $((`date +%s` - lastPersistentStateWrite)) -ge $persistentStateWritePeriod ] || [ $forcePersistent -eq 1 ] ; then\n      if [ ! -f \"$fileStatePersist\" ] || ! cmp -s \"$fileStateTemp\" \"$fileStatePersist\" ; then\n        logLine 2 \"saveState() writing to persistent state file\"\n        bddbSave \"$fileStatePersistPrefix\" \"$fileStateType\"\n        lastPersistentStateWrite=\"`date +%s`\"\n  fi ; fi ; fi\n}\n\nloadState () {\n  bddbClear\n  bddbLoad \"$fileStatePersistPrefix\" \"$fileStateType\"\n  bddbLoad \"$fileStateTempPrefix\" \"$fileStateType\"\n  logLine 2 \"loadState() loaded `bddbCount` entries\"\n}\n\nprintUsage () {\n  cat <<-_EOF_\n\tUsage: beardropper [-m mode] [-a #] [-b #] [-c ...] [-C ...] [-f ...] [-l #] [-j ...] [-p #] [-P #] [-s ...]\n\n\t  Running Modes (-m) (def: $defaultMode)\n\t    follow     constantly monitors log\n\t    entire     processes entire log contents\n\t    today      processes log entries from same day only\n\t    #          interval mode, specify time string or seconds\n\t    wipe       wipe state files, unhook and remove firewall chain\n\n\t  Options\n\t    -a #   attempt count before banning (def: $attemptCount)\n\t    -b #   ban length once attempts hit threshold (def: $banLength)\n\t    -c ... firewall chain to record bans (def: $firewallChain)\n\t    -C ... firewall chains/positions to hook into (def: $firewallHookChains)\n\t    -f ... log facility (syslog facility or stdout/stderr) (def: $logFacility)\n\t    -j ... firewall target (def: $firewallTarget)\n\t    -l #   log level - 0=off, 1=standard, 2=verbose (def: $logLevel)\n\t    -p #   attempt period which attempt counts must happen in (def: $attemptPeriod)\n\t    -P #   persistent state file write period (def: $persistentStateWritePeriod)\n\t    -s ... persistent state file prefix (def: $fileStatePersistPrefix)\n\t    -t ... temporary state file prefix (def: $fileStateTempPrefix)\n\n\t  All time strings can be specified in seconds, or using BIND style\n\t  time strings, ex: 1w2d3h5m30s is 1 week, 2 days, 3 hours, etc...\n\n\t_EOF_\n}\n\n#  Begin main logic\n#\nunset logMode\nwhile getopts a:b:c:C:f:hj:l:m:p:P:s:t: arg ; do\n  case \"$arg\" in \n    a) attemptCount=\"$OPTARG\" ;;\n    b) banLength=\"$OPTARG\" ;;\n    c) firewallChain=\"$OPTARG\" ;;\n    C) firewallHookChains=\"$OPTARG\" ;;\n    f) logFacility=\"$OPTARG\" ;;\n    j) firewallTarget=\"$OPTARG\" ;;\n    l) logLevel=\"$OPTARG\" ;;\n    m) logMode=\"$OPTARG\" ;;\n    p) attemptPeriod=\"$OPTARG\" ;;\n    P) persistentStateWritePeriod=\"$OPTARG\" ;;\n    s) fileStatePersistPrefix=\"$OPTARG\" ;;\n    s) fileStatePersistPrefix=\"$OPTARG\" ;;\n    *) printUsage\n      exit 254\n  esac\n  shift `expr $OPTIND - 1`\ndone\n[ -z $logMode ] && logMode=\"$defaultMode\"\n\nfileStateTemp=\"$fileStateTempPrefix.$fileStateType\"\nfileStatePersist=\"$fileStatePersistPrefix.$fileStateType\"\n\nattemptPeriod=`expandBindTime $attemptPeriod`\nbanLength=`expandBindTime $banLength`\n[ $persistentStateWritePeriod != -1 ] && persistentStateWritePeriod=`expandBindTime $persistentStateWritePeriod`\nfollowModeCheckInterval=`expandBindTime $followModeCheckInterval`\nexitStatus=0\n\n# Here we convert the logRegex list into a sed -f file\nfileRegex=\"/tmp/beardropper.$$.regex\"\nuciLoad logRegex 's/[`$\"'\\\\\\'']//g' '/has invalid shell, rejected$/d' \\\n  '/^[A-Za-z ]+[0-9: ]+authpriv.warn dropbear\\[.+([0-9]+\\.){3}[0-9]+/p' \\\n  '/^[A-Za-z ]+[0-9: ]+authpriv.info dropbear\\[.+:\\ Exit before auth:.*/p' > \"$fileRegex\"\nlastPersistentStateWrite=\"`date +%s`\"\nloadState\nbddbCheckStatusAll\n\n# main event loops\n\nif [ \"$logMode\" = follow ] ; then \n  logLine 1 \"Running in follow mode\"\n  readsSinceSave=0 lastCheckAll=0 worstCaseReads=1 tmpFile=\"/tmp/beardropper.$$.1\"\n# Verify if these do any good - try saving to a temp.  Scope may make saveState useless.\n  trap \"rm -f \"$tmpFile\" \"$fileRegex\" ; exit \" SIGINT\n  [ $persistentStateWritePeriod -gt 1 ] && worstCaseReads=$((persistentStateWritePeriod / followModeCheckInterval))\n  firstRun=1\n  $cmdLogread -f | while read -t $followModeCheckInterval line || true ; do\n    if [ $firstRun -eq 1 ] ; then\n      trap \"saveState -f\" SIGHUP\n      trap \"saveState -f; exit\" SIGINT\n      firstRun=0\n    fi\n    sed -nEf \"$fileRegex\" > \"$tmpFile\" <<-_EOF_\n\t$line\n\t_EOF_\n    line=\"`cat $tmpFile`\"\n    [ -n \"$line\" ] && processLogLine \"$line\"\n    logLine 3 \"ReadComp:$readsSinceSave/$worstCaseReads\"\n    if [ $((++readsSinceSave)) -ge $worstCaseReads ] ; then\n      now=\"`date +%s`\"\n      if [ $((now - lastCheckAll)) -ge $followModeCheckInterval ] ; then\n        bddbCheckStatusAll\n        lastCheckAll=\"$now\"\n        saveState\n        readsSinceSave=0\n      fi\n    fi\n  done\nelif [ \"$logMode\" = entire ] ; then \n  logLine 1 \"Running in entire mode\"\n  $cmdLogread | sed -nEf \"$fileRegex\" | while read line ; do \n    processLogLine \"$line\" \n    saveState\n  done\n  loadState\n  bddbCheckStatusAll\n  saveState -f\nelif [ \"$logMode\" = today ] ; then \n  logLine 1 \"Running in today mode\"\n  # merge the egrep into sed with -e /^$formatTodayLogDateRegex/!d\n  $cmdLogread | egrep \"`date +\\'$formatTodayLogDateRegex\\'`\" | sed -nEf \"$fileRegex\" | while read line ; do \n      processLogLine \"$line\" \n      saveState\n    done\n  loadState\n  bddbCheckStatusAll\n  saveState -f\nelif isValidBindTime \"$logMode\" ; then\n  logInterval=`expandBindTime $logMode`\n  logLine 1 \"Running in interval mode (reviewing $logInterval seconds of log entries)...\"\n  timeStart=$((`date +%s` - logInterval))\n  $cmdLogread | sed -nEf \"$fileRegex\" | while read line ; do\n    timeWhen=`getLogTime \"$line\"`\n    [ $timeWhen -ge $timeStart ] && processLogLine \"$line\"\n    saveState\n  done\n  loadState\n  bddbCheckStatusAll\n  saveState -f\nelif [ \"$logMode\" = wipe ] ; then \n  logLine 2 \"Wiping state files, unhooking and removing iptables chains\"\n  wipeFirewall\n  if [ -f \"$fileStateTemp\" ] ; then\n    logLine 1 \"Removing non-persistent statefile ($fileStateTemp)\"\n    rm -f \"$fileStateTemp\"\n  fi\n  if [ -f \"$fileStatePersist\" ] ; then\n    logLine 1 \"Removing persistent statefile ($fileStatePersist)\"\n    rm -f \"$fileStatePersist\"\n  fi\nelse\n  logLine 0 \"Error: invalid log mode ($logMode)\"\n  exitStatus=254\nfi\n\nrm -f \"$fileRegex\"\nexit $exitStatus\n"
  },
  {
    "path": "luci-app-beardropper/root/usr/share/rpcd/acl.d/luci-app-beardropper.json",
    "content": "{\n\t\"luci-app-beardropper\": {\n\t\"description\": \"Grant UCI access for luci-app-beardropper\",\n\t\"read\": {\n\t\t\"uci\": [ \"beardropper\" ]\n\t\t},\n\t\"write\": {\n\t\t\"uci\": [ \"beardropper\" ]\n\t\t}\n\t}\n}"
  },
  {
    "path": "luci-app-cloudflarespeedtest/Makefile",
    "content": "# Author: mingxiaoyu (fengying0347@163.com)\n#\n# Licensed to the public under the GNU General Public License v3.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-cloudflarespeedtest\n\nLUCI_TITLE:=LuCI support for Cloudflares Speed Test\nLUCI_DEPENDS:=+cdnspeedtest +openssl-util +curl\nLUCI_PKGARCH:=all\nPKG_VERSION:=1.4.9\nPKG_RELEASE:=0\nPKG_LICENSE:=AGPL-3.0\nPKG_MAINTAINER:=mingxiaoyu <fengying0347@163.com>\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-cloudflarespeedtest/luasrc/controller/cloudflarespeedtest.lua",
    "content": "-- Copyright (C) 2020 mingxiaoyu <fengying0347@163.com>\n-- Licensed to the public under the GNU General Public License v3.\nmodule(\"luci.controller.cloudflarespeedtest\",package.seeall)\n\nfunction index()\n\n\tif not nixio.fs.access('/etc/config/cloudflarespeedtest') then\n\t\treturn\n\tend\n\n\tlocal page\n\tpage = entry({\"admin\", \"services\", \"cloudflarespeedtest\"}, firstchild(), _(\"Cloudflare Speed Test\"), 99)\n\tpage.dependent = false\n\tpage.acl_depends = { \"luci-app-cloudflarespeedtest\" }\n\n\tentry({\"admin\", \"services\", \"cloudflarespeedtest\", \"general\"}, cbi(\"cloudflarespeedtest/cloudflarespeedtest\"), _(\"Base Setting\"), 1)\n\tentry({\"admin\", \"services\", \"cloudflarespeedtest\", \"logread\"}, form(\"cloudflarespeedtest/logread\"), _(\"Logs\"), 2)\n\n\tentry({\"admin\", \"services\", \"cloudflarespeedtest\", \"status\"}, call(\"act_status\")).leaf = true\n\tentry({\"admin\", \"services\", \"cloudflarespeedtest\", \"stop\"}, call(\"act_stop\"))\n\tentry({\"admin\", \"services\", \"cloudflarespeedtest\", \"start\"}, call(\"act_start\"))\n\tentry({\"admin\", \"services\", \"cloudflarespeedtest\", \"getlog\"}, call(\"get_log\"))\nend\n\nfunction act_status()\n\tlocal e = {}\n\te.running = luci.sys.call(\"busybox ps -w | grep cdnspeedtest | grep -v grep >/dev/null\") == 0\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n\nfunction act_stop()\n \tluci.sys.call(\"busybox ps -w | grep cdnspeedtest | grep -v grep | xargs kill -9 >/dev/null\")\n\tluci.http.write('')\nend\n\nfunction act_start()\n\tact_stop()\n\tluci.sys.call(\"/usr/bin/cloudflarespeedtest/cloudflarespeedtest.sh start\")\n\tluci.http.write('')\nend\n\nfunction get_log()\n\tlocal fs = require \"nixio.fs\"\n\tlocal e = {}\n\te.running = luci.sys.call(\"busybox ps -w | grep cdnspeedtest | grep -v grep >/dev/null\") == 0\n\te.log= fs.readfile(\"/var/log/cloudflarespeedtest.log\") or \"\"\t \n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n"
  },
  {
    "path": "luci-app-cloudflarespeedtest/luasrc/model/cbi/cloudflarespeedtest/cloudflarespeedtest.lua",
    "content": "require(\"luci.sys\")\n\nlocal uci = luci.model.uci.cursor()\n\nm = Map('cloudflarespeedtest')\nm.title = translate('Cloudflare Speed Test')\nm.description = '<a href=\\\"https://github.com/mingxiaoyu/luci-app-cloudflarespeedtest\\\" target=\\\"_blank\\\">GitHub</a>'\n\n-- [[ 基本设置 ]]--\n\ns = m:section(NamedSection, 'global')\ns.addremove = false\ns.anonymous = true\n\no=s:option(Flag,\"enabled\",translate(\"Enabled\"))\no.description = translate(\"Enabled scheduled task test Cloudflare IP\")\no.rmempty=false\no.default = 0\n\no=s:option(Flag,\"ipv6_enabled\",translate(\"IPv6 Enabled\"))\no.description = translate(\"Provides only one method, if IPv6 is enabled, IPv4 will not be tested\")\no.default = 0\no.rmempty=false\n\no=s:option(Value,\"speed\",translate(\"Broadband speed\"))\no.description =translate(\"100M broadband download speed is about 12M/s. It is not recommended to fill in an excessively large value, and it may run all the time.\");\no.datatype =\"uinteger\" \no.rmempty=false\n\no=s:option(Value,\"custome_url\",translate(\"Custome Url\"))\no.description = translate(\"<a href=\\\"https://github.com/XIU2/CloudflareSpeedTest/issues/168\\\" target=\\\"_blank\\\">How to create</a>\")\no.rmempty=false\n\no=s:option(Flag,\"custome_cors_enabled\",translate(\"Custome Cron Enabled\"))\no.default = 0\no.rmempty=false\n\no = s:option(Value, \"custome_cron\", translate(\"Custome Cron\"))\no:depends(\"custome_cors_enabled\", 1)\n\nhour = s:option(Value, \"hour\", translate(\"Hour\"))\nhour.datatype = \"range(0,23)\"\nhour:depends(\"custome_cors_enabled\", 0)\n\nminute = s:option(Value, \"minute\", translate(\"Minute\"))\nminute.datatype = \"range(0,59)\"\nminute:depends(\"custome_cors_enabled\", 0)\n\no = s:option(ListValue, \"proxy_mode\", translate(\"Proxy Mode\"))\no:value(\"nil\", translate(\"HOLD\"))\no.description = translate(\"during the speed testing, swith to which mode\")\no:value(\"gfw\", translate(\"GFW List\"))\no:value(\"close\", translate(\"CLOSE\"))\no.default = \"gfw\"\n\no=s:option(Flag,\"advanced\",translate(\"Advanced\"))\no.description = translate(\"Not recommended\")\no.default = 0\no.rmempty=false\n\no = s:option(Value, \"threads\", translate(\"Thread\"))\no.datatype =\"uinteger\" \no.default = 200\no.rmempty=true\no:depends(\"advanced\", 1)\n\no = s:option(Value, \"tl\", translate(\"Average Latency Cap\"))\no.datatype =\"uinteger\" \no.default = 200\no.rmempty=true\no:depends(\"advanced\", 1)\n\no = s:option(Value, \"tll\", translate(\"Average Latency Lower Bound\"))\no.datatype =\"uinteger\" \no.default = 40\no.rmempty=true\no:depends(\"advanced\", 1)\n\no = s:option(Value, \"t\", translate(\"Delayed speed measurement time\"))\no.datatype =\"uinteger\" \no.default = 4\no.rmempty=true\no:depends(\"advanced\", 1)\n \no = s:option(Value, \"dt\", translate(\"Download speed test time\"))\no.datatype =\"uinteger\" \no.default = 10\no.rmempty=true\no:depends(\"advanced\", 1)\n \no = s:option(Value, \"dn\", translate(\"Number of download speed tests\"))\no.datatype =\"uinteger\" \no.default = 1\no.rmempty=true\no:depends(\"advanced\", 1)  \n\no = s:option(Flag, \"dd\", translate(\"Disable download speed test\"))\no.default = 0\no.rmempty=true\no:depends(\"advanced\", 1)  \n \no = s:option(Value, \"tp\", translate(\"Port\"))\no.rmempty=true\no.default = 443\no.datatype =\"port\"\no:depends(\"advanced\", 1)\n\no = s:option(DummyValue, '', '')\no.rawhtml = true\no.template = \"cloudflarespeedtest/actions\"\n\ns = m:section(NamedSection, \"servers\", \"section\", translate(\"Third party applications settings\"))\n\nif nixio.fs.access(\"/etc/config/shadowsocksr\") then\n\ts:tab(\"ssr\", translate(\"Shadowsocksr Plus+\"))\t\n\n\to=s:taboption(\"ssr\", Flag, \"ssr_enabled\",translate(\"Shadowsocksr Plus+ Enabled\"))\n\to.rmempty=true\t\n\n\tlocal ssr_server_table = {}\n\tuci:foreach(\"shadowsocksr\", \"servers\", function(s)\n\t\tif s.alias then\n\t\t\tssr_server_table[s[\".name\"]] = \"[%s]:%s\" % {string.upper(s.v2ray_protocol or s.type), s.alias}\n\t\telseif s.server and s.server_port then\n\t\t\tssr_server_table[s[\".name\"]] = \"[%s]:%s:%s\" % {string.upper(s.v2ray_protocol or s.type), s.server, s.server_port}\n\t\tend\n\tend)\n\n\tlocal ssr_key_table = {}\n\tfor key, _ in pairs(ssr_server_table) do\n\t\ttable.insert(ssr_key_table, key)\n\tend\n\n\ttable.sort(ssr_key_table)\n\n\to = s:taboption(\"ssr\", DynamicList, \"ssr_services\",\n\t\t\ttranslate(\"Shadowsocksr Servers\"),\n\t\t\ttranslate(\"Please select a service\"))\n\t\t\t\n\tfor _, key in pairs(ssr_key_table) do\n\t\to:value(key, ssr_server_table[key])\n\tend\n\to:depends(\"ssr_enabled\", 1)\n\to.forcewrite = true\n\nend\n\n\nif nixio.fs.access(\"/etc/config/passwall\") then\n\ts:tab(\"passwalltab\", translate(\"passwall\"))\n\n\to=s:taboption(\"passwalltab\", Flag, \"passwall_enabled\",translate(\"Passwall Enabled\"))\n\to.rmempty=true\t\n\n\tlocal passwall_server_table = {}\n\tuci:foreach(\"passwall\", \"nodes\", function(s)\n\t\tif s.remarks then\n\t\t\tpasswall_server_table[s[\".name\"]] = \"[%s]:%s\" % {string.upper(s.protocol or s.type), s.remarks}\n\t\tend\n\tend)\n\n\tlocal passwall_key_table = {}\n\tfor key, _ in pairs(passwall_server_table) do\n\t\ttable.insert(passwall_key_table, key)\n\tend\n\n\ttable.sort(passwall_key_table)\n\n\to = s:taboption(\"passwalltab\", DynamicList, \"passwall_services\",\n\t\t\ttranslate(\"Passwall Servers\"),\n\t\t\ttranslate(\"Please select a service\"))\n\t\t\t\n\tfor _, key in pairs(passwall_key_table) do\n\t\to:value(key, passwall_server_table[key])\n\tend\n\to:depends(\"passwall_enabled\", 1)\n\to.forcewrite = true\n\nend\n\nif nixio.fs.access(\"/etc/config/passwall2\") then\n\ts:tab(\"passwall2tab\", translate(\"passwall2\"))\n\n\to=s:taboption(\"passwall2tab\", Flag, \"passwall2_enabled\",translate(\"PassWall2 Enabled\"))\n\to.rmempty=true\t\n\n\tlocal passwall2_server_table = {}\n\tuci:foreach(\"passwall2\", \"nodes\", function(s)\n\t\tif s.remarks then\n\t\t\tpasswall2_server_table[s[\".name\"]] = \"[%s]:%s\" % {string.upper(s.protocol or s.type), s.remarks}\n\t\tend\n\tend)\n\n\tlocal passwall2_key_table = {}\n\tfor key, _ in pairs(passwall2_server_table) do\n\t\ttable.insert(passwall2_key_table, key)\n\tend\n\n\ttable.sort(passwall2_key_table)\n\n\to = s:taboption(\"passwall2tab\", DynamicList, \"passwall2_services\",\n\t\t\ttranslate(\"Passwall2 Servers\"),\n\t\t\ttranslate(\"Please select a service\"))\n\t\t\t\n\tfor _, key in pairs(passwall2_key_table) do\n\t\to:value(key, passwall2_server_table[key])\n\tend\n\to:depends(\"passwall2_enabled\", 1)\n\to.forcewrite = true\n\nend\n\ns:tab(\"bypasstab\", translate(\"Bypass\"))\nif nixio.fs.access(\"/etc/config/bypass\") then\n\t\n\to=s:taboption(\"bypasstab\", Flag, \"bypass_enabled\",translate(\"Bypass Enabled\"))\n\to.rmempty=true\t\n\n\tlocal bypass_server_table = {}\n\tuci:foreach(\"bypass\", \"servers\", function(s)\n\t\tif s.alias then\n\t\t\tbypass_server_table[s[\".name\"]] = \"[%s]:%s\" % {string.upper(s.protocol or s.type), s.alias}\n\t\telseif s.server and s.server_port then\n\t\t\tbypass_server_table[s[\".name\"]] = \"[%s]:%s:%s\" % {string.upper(s.protocol or s.type), s.server, s.server_port}\n\t\tend\n\tend)\n\n\tlocal bypass_key_table = {}\n\tfor key, _ in pairs(bypass_server_table) do\n\t\ttable.insert(bypass_key_table, key)\n\tend\n\n\ttable.sort(bypass_key_table)\n\n\to = s:taboption(\"bypasstab\", DynamicList, \"bypass_services\",\n\t\t\ttranslate(\"Bypass Servers\"),\n\t\t\ttranslate(\"Please select a service\"))\n\t\t\t\n\tfor _, key in pairs(bypass_key_table) do\n\t\to:value(key, bypass_server_table[key])\n\tend\n\to:depends(\"bypass_enabled\", 1)\n\to.forcewrite = true\n\nend\n\ns:tab(\"vssrtab\", translate(\"Vssr\"))\nif nixio.fs.access(\"/etc/config/vssr\") then\n\t\n\to=s:taboption(\"vssrtab\", Flag, \"vssr_enabled\",translate(\"Vssr Enabled\"))\n\to.rmempty=true\t\n\n\tlocal vssr_server_table = {}\n\tuci:foreach(\"vssr\", \"servers\", function(s)\n\t\tif s.alias then\n\t\t\tvssr_server_table[s[\".name\"]] = \"[%s]:%s\" % {string.upper(s.protocol or s.type), s.alias}\n\t\telseif s.server and s.server_port then\n\t\t\tvssr_server_table[s[\".name\"]] = \"[%s]:%s:%s\" % {string.upper(s.protocol or s.type), s.server, s.server_port}\n\t\tend\n\tend)\n\n\tlocal vssr_key_table = {}\n\tfor key, _ in pairs(vssr_server_table) do\n\t\ttable.insert(vssr_key_table, key)\n\tend\n\n\ttable.sort(vssr_key_table)\n\n\to = s:taboption(\"vssrtab\", DynamicList, \"vssr_services\",\n\t\t\ttranslate(\"Vssr Servers\"),\n\t\t\ttranslate(\"Please select a service\"))\n\t\t\t\n\tfor _, key in pairs(vssr_key_table) do\n\t\to:value(key, vssr_server_table[key])\n\tend\n\to:depends(\"vssr_enabled\", 1)\n\to.forcewrite = true\n\nend\n\ns:tab(\"dnstab\", translate(\"DNS\"))\n\no=s:taboption(\"dnstab\", Flag, \"DNS_enabled\",translate(\"DNS Enabled\"))\n\no=s:taboption(\"dnstab\", ListValue, \"DNS_type\", translate(\"DNS Type\"))\no:value(\"aliyu\", translate(\"AliyuDNS\"))\no:depends(\"DNS_enabled\", 1)\n\no=s:taboption(\"dnstab\", Value,\"app_key\",translate(\"Access Key ID\"))\no.rmempty=true\no:depends(\"DNS_enabled\", 1)\no=s:taboption(\"dnstab\", Value,\"app_secret\",translate(\"Access Key Secret\"))\no.rmempty=true\no:depends(\"DNS_enabled\", 1)\n\no=s:taboption(\"dnstab\", Value,\"main_domain\",translate(\"Main Domain\"),translate(\"For example: test.github.com -> github.com\"))\no.rmempty=true\no:depends(\"DNS_enabled\", 1)\no=s:taboption(\"dnstab\", Value,\"sub_domain\",translate(\"Sub Domain\"),translate(\"For example: test.github.com -> test\"))\no.rmempty=true\no:depends(\"DNS_enabled\", 1)\n\no=s:taboption(\"dnstab\", ListValue, \"line\", translate(\"Lines\"))\no:value(\"default\", translate(\"default\"))\no:value(\"telecom\", translate(\"telecom\"))\no:value(\"unicom\", translate(\"unicom\"))\no:value(\"mobile\", translate(\"mobile\"))\no:depends(\"DNS_enabled\", 1)\no.default =\"telecom\"\n\ns:tab(\"dnshost\", translate(\"HOST\"))\no=s:taboption(\"dnshost\", Flag, \"HOST_enabled\",translate(\"HOST Enabled\"))\no=s:taboption(\"dnshost\", Value,\"host_domain\",translate(\"Domain\"))\no.rmempty=true\no:depends(\"HOST_enabled\", 1)\n\ne=m:section(TypedSection,\"global\",translate(\"Best IP\"))\ne.anonymous=true\nlocal a=\"/usr/share/cloudflarespeedtestresult.txt\"\ntvIPs=e:option(TextValue,\"syipstext\")\ntvIPs.rows=8\ntvIPs.readonly=\"readonly\"\ntvIPs.wrap=\"off\"\n\nfunction tvIPs.cfgvalue(e,e)\n\tsylogtext=\"\"\n\tif a and nixio.fs.access(a) then\n\t\tsylogtext=luci.sys.exec(\"tail -n 100 %s\"%a)\n\tend\n\treturn sylogtext\nend\ntvIPs.write=function(e,e,e)\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-cloudflarespeedtest/luasrc/model/cbi/cloudflarespeedtest/logread.lua",
    "content": "log = SimpleForm(\"logview\")\nlog.submit = false\nlog.reset = false\n\nt = log:field(DummyValue, '', '')\nt.rawhtml = true\nt.template = 'cloudflarespeedtest/logread'\n\nreturn log\n"
  },
  {
    "path": "luci-app-cloudflarespeedtest/luasrc/view/cloudflarespeedtest/actions.htm",
    "content": "<%+cbi/valueheader%>\n<script type=\"text/javascript\">//<![CDATA[\n    const STATUS_URL = '<%=luci.dispatcher.build_url(\"admin\", \"services\", \"cloudflarespeedtest\",\"status\")%>';\n    const RUN_URL = '<%=luci.dispatcher.build_url(\"admin\", \"services\", \"cloudflarespeedtest\",\"start\")%>';\n    const STOP_URL = '<%=luci.dispatcher.build_url(\"admin\", \"services\", \"cloudflarespeedtest\",\"stop\")%>';\n    const LOG_URL = '<%=luci.dispatcher.build_url(\"admin\", \"services\", \"cloudflarespeedtest\",\"logread\")%>';\n  \n    XHR.poll(3, STATUS_URL, null,\n        function(x, data) {\n            var tb = document.getElementById('cloudflarespeedtest_status');        \n          \n            if (data && tb) {\n                if (data.running) {\n                    buttonStatus(true)          \n                    tb.innerHTML = '<em><b><font color=green><%:RUNNING %></font></b></em>';\n                } else {\n                    buttonStatus(false)  \n                    tb.innerHTML = '<em><b><font color=red> <%:NOT RUNNING %></font></b></em>';\n                }\n            }\n        }\n    );\n\n\tfunction cloudflarespeedtest_act_start() {\n        buttonStatus(true)\n\t\tXHR.get(RUN_URL, null, () => {          \n        });\n        setTimeout(() => { window.location = LOG_URL }, 500);\n        return false;\t\n\t}\n\n    function cloudflarespeedtest_act_stop(){\n        XHR.get(STOP_URL, null, () => {    \n            buttonStatus(false)      \n        });\n        return false;\t\n    }\n\n    function buttonStatus(running){\n        document.getElementById('cloudflarespeedtest_start').style.display  =  running ? \"none\" : \"block\"\n        document.getElementById('cloudflarespeedtest_stop').style.display   =  running ? \"block\" : \"none\"\n    }\n    \n//]]></script>\n<label class=\"cbi-value-title\"><%= translate(\"Status\") %></label>\n<div class=\"cbi-value-field\">\n    <p id=\"cloudflarespeedtest_status\"><em><%:Collecting data...%></em></p>\n</div>\n\n<label class=\"cbi-value-title\"><%= translate(\"Speed Test\") %></label>\n<div class=\"cbi-value-field\">\n    <input id=\"cloudflarespeedtest_start\" type=\"button\" style=\"display:block;\" class=\"btn cbi-button cbi-button-apply\" value=\"<%= translate('TEST AND APPLY') %>\" onclick=\"cloudflarespeedtest_act_start()\" />\n\t<input id=\"cloudflarespeedtest_stop\" type=\"button\" style=\"display:none;\" class=\"btn cbi-button cbi-button-apply\" value=\"<%= translate('STOP') %>\" onclick=\"cloudflarespeedtest_act_stop()\" />\n</div>\n\n<%+cbi/valuefooter%>"
  },
  {
    "path": "luci-app-cloudflarespeedtest/luasrc/view/cloudflarespeedtest/logread.htm",
    "content": "<%+cbi/valueheader%>\n<input type=\"checkbox\" id=\"checkbox1\" checked><%:Auto refresh%></input>\n<textarea id=\"logview\" class=\"cbi-input-textarea\" style=\"width: 100%\" rows=\"30\" readonly=\"readonly\"></textarea>\n\n<script type=\"text/javascript\">\n    const LOG_URL = '<%=luci.dispatcher.build_url(\"admin\", \"services\", \"cloudflarespeedtest\",\"getlog\")%>';\n    \n    function getlog(){\n        XHR.get(LOG_URL, null, function(x, data) {            \n             logview.value = data.log;   \n             if(document.getElementById(\"checkbox1\").checked == true){\n                logview.scrollTop = logview.scrollHeight;\n             }     \n        });\n    }\n    getlog()\n    setInterval(() => { \n        if(document.getElementById(\"checkbox1\").checked == true){\n            getlog()\n        }\n    }, 2000);\n</script>\n<%+cbi/valuefooter%>"
  },
  {
    "path": "luci-app-cloudflarespeedtest/po/zh_Hans/cloudflarespeedtest.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: \\n\"\n\"POT-Creation-Date: \\n\"\n\"PO-Revision-Date: 2022-02-10 20:44+0000\\n\"\n\"Last-Translator: mingxiaoyu <fengying0347@163.com>\\n\"\n\"Language: zh_Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Weblate 4.8-dev\\n\"\n\nmsgid \"<a href=\\\"https://github.com/mingxiaoyu/luci-app-cloudflarespeedtest\\\" target=\\\"_blank\\\">GitHub</a>\"\nmsgstr \"<a href=\\\"https://github.com/mingxiaoyu/luci-app-cloudflarespeedtest\\\" target=\\\"_blank\\\">GitHub项目地址</a>\"\n\nmsgid \"Cloudflare Speed Test\"\nmsgstr \"Cloudflare速度测试\"\n\nmsgid \"Base Setting\"\nmsgstr \"基本设置\"\n\nmsgid \"Logs\"\nmsgstr \"日志\"\n\nmsgid \"Enabled\"\nmsgstr \"启用\"\n\nmsgid \"Enabled scheduled task test Cloudflare IP\"\nmsgstr \"启用计划任务测试 Cloudflare IP\"\n\nmsgid \"Broadband speed\"\nmsgstr \"宽带速度\"\n\nmsgid \"Custome Url Enabled\"\nmsgstr \"启用自定义地址\"\n\nmsgid \"Custome Url\"\nmsgstr \"自定义地址\"\n\nmsgid \"Custome Cron Enabled\"\nmsgstr \"启用自定义Cron\"\n\nmsgid \"Custome Cron\"\nmsgstr \"自定义Cron\"\n\nmsgid \"Hour\"\nmsgstr \"小时\"\n\nmsgid \"Minute\"\nmsgstr \"分钟\"\n\nmsgid \"100M broadband download speed is about 12M/s. It is not recommended to fill in an excessively large value, and it may run all the time.\"\nmsgstr \"100M的宽带下载大概为速度12M/s。不推荐填过大的值，可能出现一直运行。\"\n\nmsgid \"Shadowsocksr Plus+ Enabled\"\nmsgstr \"启用ShadowSocksR Plus+\"\n\nmsgid \"Passwall Enabled\"\nmsgstr \"启用Passwall\"\n\nmsgid \"PassWall2 Enabled\"\nmsgstr \"启用PassWall2\"\n\nmsgid \"Bypass Enabled\"\nmsgstr \"启用Bypass\"\n\nmsgid \"Vssr Enabled\"\nmsgstr \"启用Vssr\"\nmsgid \"Shadowsocksr Servers\"\nmsgstr \"ShadowSocksR Plus+服务\"\n\nmsgid \"Passwall Servers\"\nmsgstr \"Passwall服务\"\n\nmsgid \"Passwall2 Servers\"\nmsgstr \"Passwall2服务\"\n\nmsgid \"Bypass Servers\"\nmsgstr \"Bypass服务\"\n\nmsgid \"Vssr Servers\"\nmsgstr \"Vssr服务\"\n\nmsgid \"Please select a service\"\nmsgstr \"请选择一项服务\"\n\nmsgid \"Speed Test\"\nmsgstr \"速度测试\"\n\nmsgid \"Best IP\"\nmsgstr \"最佳IP\"\n\nmsgid \"TEST AND APPLY\"\nmsgstr \"测试并应用\"\n\nmsgid \"STOP\"\nmsgstr \"停止\"\n\nmsgid \"Advanced\"\nmsgstr \"高级模式\"\n\nmsgid \"Thread\"\nmsgid \"线程数\"\n\nmsgid \"Average Latency Cap\"\nmsgstr \"平均延迟上限\"\n\nmsgid \"Average Latency Lower Bound\"\nmsgstr \"平均延迟下限\"\n\nmsgid \"IPv6 Enabled\"\nmsgstr \"启用IPv6\"\n\nmsgid \"Delayed speed measurement time\"\nmsgstr \"延迟测速次数\"\n \nmsgid \"Download speed test time\"\nmsgstr \"下载测速时间\"\n\nmsgid \"Number of download speed tests\"\nmsgstr \"下载测速数量\"\n\nmsgid \"Disable download speed test\"\nmsgstr \"禁用下载测速\"\n\nmsgid \"Port\"\nmsgstr \"端口\"\n\nmsgid \"Not recommended\"\nmsgstr \"不推荐\"\n\nmsgid \"Provides only one method, if IPv6 is enabled, IPv4 will not be tested\"\nmsgstr \"IPv4和IPv6只能选一个！！！！！！\"\n\nmsgid \"<a href=\\\"https://github.com/XIU2/CloudflareSpeedTest/issues/168\\\" target=\\\"_blank\\\">How to create</a>\"\nmsgstr \"<a href=\\\"https://github.com/XIU2/CloudflareSpeedTest/issues/168\\\" target=\\\"_blank\\\">如何创建</a>\"\n\nmsgid \"RUNNING\" \nmsgstr \"运行中\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\nmsgid \"Collecting data...\"\nmsgstr \"收集数据中...\"\n\nmsgid \"Third party applications settings\"\nmsgstr \"第三方应用设置\"\n\nmsgid \"Auto refresh\"\nmsgstr \"自动刷新\"\n\nmsgid \"Status\"\nmsgstr \"状态\"\n\nmsgid \"Proxy Mode\"\nmsgstr \"代理模式\"\n\nmsgid \"HOLD\"\nmsgstr \"保持\"\n\nmsgid \"GFW List\"\nmsgid \"GFW列表\"\n\nmsgid \"CLOSE\"\nmsgstr \"关闭\"\n\nmsgid \"during the speed testing, swith to which mode\"\nmsgstr \"在速度测试期间，切换到哪种模式\"\n\nmsgid \"DNS\"\nmsgstr \"DNS\"\n\nmsgid \"DNS Enabled\"\nmsgstr \"启用DNS\"\n\nmsgid \"DNS Type\"\nmsgstr \"DNS类型\"\n\nmsgid \"AliyuDNS\"\nmsgstr \"阿里云DNS\"\n\nmsgid \"Access Key ID\"\nmsgstr \"Access Key ID\"\n\nmsgid \"Access Key Secret\"\nmsgstr \"Access Key Secret\"\n\nmsgid \"Main Domain\"\nmsgstr \"主域名\"\n\nmsgid \"Sub Domain\"\nmsgstr \"子域名\"\n\nmsgid \"For example: test.github.com -> github.com\"\nmsgstr \"例如: test.github.com 则填: github.com\"\n\nmsgid \"For example: test.github.com -> test\"\nmsgstr \"例如: test.github.com, 则填: test\"\n\nmsgid \"Lines\"\nmsgstr \"解析线路\"\n\nmsgid \"default\"\nmsgstr \"默认\"\n\nmsgid \"telecom\"\nmsgstr \"电信\"\n\nmsgid \"unicom\"\nmsgstr \"联通\"\n\nmsgid \"mobile\"\nmsgstr \"移动\"\n\nmsgid \"HOST Enabled\"\nmsgstr \"启用HOST\"\n\nmsgid \"Domain\"\nmsgstr \"域名\"\n"
  },
  {
    "path": "luci-app-cloudflarespeedtest/root/etc/config/cloudflarespeedtest",
    "content": "\nconfig global 'global'\n\toption hour '5'\n\toption minute '0'\n\toption enabled '0'\n\toption ipv6_enabled '0'\n\toption advanced '0'\n\toption tl '200'\n\toption tll '40'\n\toption custome_url 'https://speed.cloudflare.com/__down?bytes=300000000'\n\toption threads '200'\n\toption speed '100'\n\nconfig servers 'servers'\n\toption ssr_enabled '0'\n\toption passwall_enabled '0'\n\toption passwall2_enabled '0'\n\toption bypass_enabled '0'\n\toption vssr_enabled '0'\n\toption DNS_enabled '0'\n\n"
  },
  {
    "path": "luci-app-cloudflarespeedtest/root/etc/init.d/cloudflarespeedtest",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=99\n\nUSE_PROCD=1\n\nCRON_FILE=/etc/crontabs/root\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"cloudflarespeedtest\"\n}\n\nadd_cron(){\n\tlocal enabled\n\tconfig_get_bool enabled $1 enabled\n\t\n\tdel_cron\n\t\n\tif\t[ $enabled = 1 ] ; then \n\t\tlocal minute\n\t\tlocal hour\n\t\tlocal custome_cors_enabled\n\t\tlocal custome_cron\n\n\t\tconfig_get minute $1 minute\n\t\tconfig_get hour $1 hour\n\t\tconfig_get_bool custome_cors_enabled $1 custome_cors_enabled\n\t\tconfig_get custome_cron $1 custome_cron\n\n\t\tif [ $custome_cors_enabled = 1 ] ; then \n \t\t\techo \"$custome_cron /usr/bin/cloudflarespeedtest/cloudflarespeedtest.sh start\" >> $CRON_FILE\n\t\telse\n\t\t\techo \"$minute $hour * * * /usr/bin/cloudflarespeedtest/cloudflarespeedtest.sh start\" >> $CRON_FILE\n\t\tfi\n\t\tcrontab $CRON_FILE\t \n\tfi\n}\n\ndel_cron(){\t\n\tsed -i '/cloudflarespeedtest/d' $CRON_FILE\n\t/etc/init.d/cron restart\n}\n\nstop_instance(){\n\tdel_cron\n}\n\nstop_service() {\n\tconfig_load cloudflarespeedtest\n\tconfig_foreach stop_instance global\n}\nstart_service() {\n\tconfig_load cloudflarespeedtest\n\tconfig_foreach add_cron global\t \n}\nreload_service() {\n\tstop\n\tstart\n}"
  },
  {
    "path": "luci-app-cloudflarespeedtest/root/usr/bin/cloudflarespeedtest/aliddns.sh",
    "content": "#!/bin/sh\nLOG_FILE='/var/log/cloudflarespeedtest.log'\n\necholog() {\n\tlocal d=\"$(date \"+%Y-%m-%d %H:%M:%S\")\"\n\techo -e \"$d: $*\" >>$LOG_FILE\n}\n\nurlencode() {\n\t# urlencode url<string>\n\tout=''\n\tfor c in $(echo -n $1 | sed 's/[^\\n]/&\\n/g'); do\n\t\tcase $c in\n\t\t\t[a-zA-Z0-9._-]) out=\"$out$c\" ;;\n\t\t\t*) out=\"$out$(printf '%%%02X' \"'$c\")\" ;;\n\t\tesac\n\tdone\n\techo -n $out\n}\n\nsend_request() {\n\t# send_request action<string> args<string>\n\tlocal args=\"AccessKeyId=$ak_id&Action=$1&Format=json&$2&Version=2015-01-09\"\n\tlocal hash=$(urlencode $(echo -n \"GET&%2F&$(urlencode $args)\" | openssl dgst -sha1 -hmac \"$ak_sec&\" -binary | openssl base64))\n\tcurl -sSL --connect-timeout 5 \"http://alidns.aliyuncs.com/?$args&Signature=$hash\"\n}\n\nget_recordid() {\n\tsed 's/RR/\\n/g' | sed -n 's/.*RecordId[^0-9]*\\([0-9]*\\).*/\\1\\n/p' | sort -ru | sed /^$/d\n}\n\nquery_recordid() {\n\tsend_request \"DescribeSubDomainRecords\" \"SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&SubDomain=$sub_dm.$main_dm&Timestamp=$timestamp&Type=A\"\n}\n\nupdate_record() {\n\tsend_request \"UpdateDomainRecord\" \"Line=$line&RR=$sub_dm&RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=$type&Value=$ip\"\n}\n\nadd_record() {\n\tsend_request \"AddDomainRecord&DomainName=$main_dm\" \"Line=$line&RR=$sub_dm&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp&Type=$type&Value=$ip\"\n}\n\ndel_record() {\n\tsend_request \"DeleteDomainRecord\" \"RecordId=$1&SignatureMethod=HMAC-SHA1&SignatureNonce=$timestamp&SignatureVersion=1.0&Timestamp=$timestamp\"\n}\n\naliddns() {\n\tak_id=$1\n\tak_sec=$2\n\tmain_dm=$3\n\tsub_dm=$4\n\tline=$5\n\tisIpv6=$6\n\tip=$7\n\ttype=A\n\t\n\tif [ $isIpv6 -eq \"1\" ] ;then\n\t\ttype=AAAA\n\tfi\necho  $ip\necho  $type\n\trrid=`query_recordid | get_recordid`\n\t\n\tif [ -z \"$rrid\" ]; then\n\t\trrid=`add_record | get_recordid`\n\t\techolog \"ADD record $rrid\"\n\telse\n\t\tupdate_record $rrid\n\t\techolog \"UPDATE record $rrid\"\n\tfi\n\tif [ -z \"$rrid\" ]; then\n\t\t# failed\n\t\techolog \"# ERROR, Please Check Config/Time\"\n\tfi\n}\n\n\ntimestamp=$(date -u \"+%Y-%m-%dT%H%%3A%M%%3A%SZ\")\n\naliddns \"$@\"\n"
  },
  {
    "path": "luci-app-cloudflarespeedtest/root/usr/bin/cloudflarespeedtest/cloudflarespeedtest.sh",
    "content": "#!/bin/sh\n\nLOG_FILE='/var/log/cloudflarespeedtest.log'\nIP_FILE='/usr/share/cloudflarespeedtestresult.txt'\nIPV4_TXT='/usr/share/CloudflareSpeedTest/ip.txt'\nIPV6_TXT='/usr/share/CloudflareSpeedTest/ipv6.txt'\n\nfunction get_global_config(){\n\twhile [[ \"$*\" != \"\" ]]; do\n\t\teval ${1}='`uci get cloudflarespeedtest.global.$1`' 2>/dev/null\n\t\tshift\n\tdone\n}\n\nfunction get_servers_config(){\n\twhile [[ \"$*\" != \"\" ]]; do\n\t\teval ${1}='`uci get cloudflarespeedtest.servers.$1`' 2>/dev/null\n\t\tshift\n\tdone\n}\n\necholog() {\n\tlocal d=\"$(date \"+%Y-%m-%d %H:%M:%S\")\"\n\techo -e \"$d: $*\" \n\techo -e \"$d: $*\" >>$LOG_FILE\n}\n\nfunction read_config(){\n\tget_global_config \"enabled\" \"speed\" \"custome_url\" \"threads\" \"custome_cors_enabled\" \"custome_cron\" \"t\" \"tp\" \"dt\" \"dn\" \"dd\" \"tl\" \"tll\" \"ipv6_enabled\" \"advanced\" \"proxy_mode\"\n\tget_servers_config \"ssr_services\" \"ssr_enabled\" \"passwall_enabled\" \"passwall_services\" \"passwall2_enabled\" \"passwall2_services\" \"bypass_enabled\" \"bypass_services\" \"vssr_enabled\" \"vssr_services\" \"DNS_enabled\" \"HOST_enabled\"\n}\n\nfunction appinit(){\n\tssr_started='';\n\tpasswall_started='';\n\tpasswall2_started='';\n\tbypass_started='';\n\tvssr_started='';\n}\n\nfunction speed_test(){\n\n\trm -rf $LOG_FILE\n\n\tcommand=\"/usr/bin/cdnspeedtest -sl $((speed*125/1000)) -url ${custome_url} -o ${IP_FILE}\"\n\n\tif [ $ipv6_enabled -eq \"1\" ] ;then\n\t\tcommand=\"${command} -f ${IPV6_TXT}\"\n\telse\n\t\tcommand=\"${command} -f ${IPV4_TXT}\"\n\tfi\n\n\tif [ $advanced -eq \"1\" ] ; then\n\t\tcommand=\"${command} -tl ${tl} -tll ${tll} -n ${threads} -t ${t} -dt ${dt} -dn ${dn}\"\n\t\tif [ $dd -eq \"1\" ] ; then\n\t\t\tcommand=\"${command} -dd\"\n\t\tfi\n\t\tif [ $tp -ne \"443\" ] ; then\n\t\t \tcommand=\"${command} -tp ${tp}\"\n\t\tfi\n\telse\n\t\tcommand=\"${command} -tl 200 -tll 40 -n 200 -t 4 -dt 10 -dn 1\"\n\tfi\n\n\tappinit\n\n\tssr_original_server=$(uci get shadowsocksr.@global[0].global_server 2>/dev/null)\n\tssr_original_run_mode=$(uci get shadowsocksr.@global[0].run_mode 2>/dev/null)\n\tif [ \"x${ssr_original_server}\" != \"xnil\" ] && [ \"x${ssr_original_server}\"  !=  \"x\" ] ;then\n\t\tif [ $proxy_mode  == \"close\" ] ;then\n\t\t\tuci set shadowsocksr.@global[0].global_server=\"nil\"\t\t\t\n\t\telif  [ $proxy_mode  == \"gfw\" ] ;then\n\t\t\tuci set shadowsocksr.@global[0].run_mode=\"gfw\"\n\t\tfi\n\t\tssr_started='1';\n\t\tuci commit shadowsocksr\n\t\t/etc/init.d/shadowsocksr restart\n\tfi\n\n\tpasswall_server_enabled=$(uci get passwall.@global[0].enabled 2>/dev/null)\n\tpasswall_original_run_mode=$(uci get passwall.@global[0].tcp_proxy_mode 2>/dev/null)\n\tif [ \"x${passwall_server_enabled}\" == \"x1\" ] ;then\n\t\tif [ $proxy_mode  == \"close\" ] ;then\n\t\t\tuci set passwall.@global[0].enabled=\"0\"\t\t\t\n\t\telif  [ $proxy_mode  == \"gfw\" ] ;then\n\t\t\tuci set passwall.@global[0].tcp_proxy_mode=\"gfwlist\"\n\t\tfi\t \n\t\tpasswall_started='1'; \n\t\tuci commit passwall\n\t\t/etc/init.d/passwall  restart 2>/dev/null\n\tfi\n\n\tpasswall2_server_enabled=$(uci get passwall2.@global[0].enabled 2>/dev/null)\n\tpasswall2_original_run_mode=$(uci get passwall2.@global[0].tcp_proxy_mode 2>/dev/null)\n\tif [ \"x${passwall2_server_enabled}\" == \"x1\" ] ;then\n\t\tif [ $proxy_mode  == \"close\" ] ;then\n\t\t\tuci set passwall2.@global[0].enabled=\"0\"\t\t\t\n\t\telif  [ $proxy_mode  == \"gfw\" ] ;then\n\t\t\tuci set passwall2.@global[0].tcp_proxy_mode=\"gfwlist\"\n\t\tfi \n\t\tpasswall2_started='1'; \n\t\tuci commit passwall2\n\t\t/etc/init.d/passwall2 restart 2>/dev/null\n\tfi\n\t\n\tvssr_original_server=$(uci get vssr.@global[0].global_server 2>/dev/null)\n\tvssr_original_run_mode=$(uci get vssr.@global[0].run_mode 2>/dev/null)\n\tif [ \"x${vssr_original_server}\" != \"xnil\" ] && [ \"x${vssr_original_server}\"  !=  \"x\" ] ;then\n\n\t\tif [ $proxy_mode  == \"close\" ] ;then\n\t\t\tuci set vssr.@global[0].global_server=\"nil\"\t\t\n\t\telif  [ $proxy_mode  == \"gfw\" ] ;then\n\t\t\tuci set vssr.@global[0].run_mode=\"gfw\"\n\t\tfi\n\t\tvssr_started='1';\n\t\tuci commit vssr\n\t\t/etc/init.d/vssr restart\n\tfi\n\n\tbypass_original_server=$(uci get bypass.@global[0].global_server 2>/dev/null)\n\tbypass_original_run_mode=$(uci get bypass.@global[0].run_mode 2>/dev/null)\n\tif [ \"x${bypass_original_server}\" != \"x\" ] ;then\n\t\tif [ $proxy_mode  == \"close\" ] ;then\n\t\t\tuci set bypass.@global[0].global_server=\"\"\t\t\t\n\t\telif  [ $proxy_mode  == \"gfw\" ] ;then\n\t\t\tuci set bypass.@global[0].run_mode=\"gfw\"\n\t\tfi\n\t\tbypass_started='1';\n\t\tuci commit bypass\n\t\t/etc/init.d/bypass restart\n\tfi\n\n\techo $command  >> $LOG_FILE 2>&1 \n\techolog \"-----------start----------\" \n\t$command >> $LOG_FILE 2>&1\n\techolog \"-----------end------------\"\n}\n\nfunction ip_replace(){\n\n\t# 获取最快 IP（从 result.csv 结果文件中获取第一个 IP）\n\tbestip=$(sed -n \"2,1p\" $IP_FILE | awk -F, '{print $1}')\n\tif [[ -z \"${bestip}\" ]]; then\n\t\techolog \"CloudflareST 测速结果 IP 数量为 0,跳过下面步骤...\"\n\telse\n\t\talidns_ip\n\t\tssr_best_ip\n\t\tvssr_best_ip\n\t\tbypass_best_ip\n\t\tpasswall_best_ip\n\t\tpasswall2_best_ip\n\t\trestart_app\n\t\thost_ip\t\n\tfi\n}\n\nfunction passwall_best_ip(){\n\tif [ \"x${passwall_enabled}\" == \"x1\" ] ;then\n\t\techolog \"设置passwall IP\"\n\t\tfor ssrname in $passwall_services\n\t\tdo\n\t\t\techo $ssrname\n\t\t\tuci set passwall.$ssrname.address=\"${bestip}\"\n\t\tdone\n\t\tuci commit passwall\n\tfi\n}\n\nfunction passwall2_best_ip(){\n\tif [ \"x${passwall2_enabled}\" == \"x1\" ] ;then\n\t\techolog \"设置passwall2 IP\"\n\t\tfor ssrname in $passwall2_services\n\t\tdo\n\t\t\techo $ssrname\n\t\t\tuci set passwall2.$ssrname.address=\"${bestip}\"\n\t\tdone\n\t\tuci commit passwall2\n\tfi\n}\n\nfunction ssr_best_ip(){\n\tif [ \"x${ssr_enabled}\" == \"x1\" ] ;then\n\t\techolog \"设置ssr IP\"\n\t\tfor ssrname in $ssr_services\n\t\tdo\n\t\t\techo $ssrname\n\t\t\tuci set shadowsocksr.$ssrname.server=\"${bestip}\"\n\t\t\tuci set shadowsocksr.$ssrname.ip=\"${bestip}\"\n\t\tdone\t\n    \tuci commit shadowsocksr\n\tfi\n}\n\nfunction vssr_best_ip(){\n\tif [ \"x${vssr_enabled}\" == \"x1\" ] ;then\n\t\techolog \"设置Vssr IP\"\n\t\tfor ssrname in $vssr_services\n\t\tdo\n\t\t\techo $ssrname\n\t\t\tuci set vssr.$ssrname.server=\"${bestip}\"\n\t\tdone    \n    \tuci commit vssr\n\tfi\n}\n\nfunction bypass_best_ip(){\n\tif [ \"x${bypass_enabled}\" == \"x1\" ] ;then\n\t\techolog \"设置Bypass IP\"\n\t\tfor ssrname in $bypass_services\n\t\tdo\n\t\t\techo $ssrname\n\t\t\tuci set bypass.$ssrname.server=\"${bestip}\"\n\t\tdone    \n    \tuci commit bypass   \n\tfi\n}\n\nfunction restart_app(){\n\tif [ \"x${ssr_started}\" == \"x1\" ] ;then\n\t\tif [ $proxy_mode  == \"close\" ] ;then\n\t\t\tuci set shadowsocksr.@global[0].global_server=\"${ssr_original_server}\"\t\t\n\t\telif [ $proxy_mode  == \"gfw\" ] ;then\n\t\t\tuci set  shadowsocksr.@global[0].run_mode=\"${ssr_original_run_mode}\"\n\t\tfi\n\t\tuci commit shadowsocksr\n\t\t/etc/init.d/shadowsocksr restart &>/dev/null\n    \techolog \"ssr重启完成\"\n    fi\n\n\tif [ \"x${passwall_started}\" == \"x1\" ] ;then\n\t\tif [ $proxy_mode  == \"close\" ] ;then\n\t\t\t\tuci set passwall.@global[0].enabled=\"${passwall_server_enabled}\"\t\t\n\t\telif [ $proxy_mode  == \"gfw\" ] ;then\n\t\t\t\tuci set passwall.@global[0].tcp_proxy_mode=\"${passwall_original_run_mode}\"\n\t\tfi\t\n\t\tuci commit passwall\n\t\t/etc/init.d/passwall restart 2>/dev/null\n\t\techolog \"passwall重启完成\"\n\tfi\t \n\n\tif [ \"x${passwall2_started}\" == \"x1\" ] ;then\n\t\tif [ $proxy_mode  == \"close\" ] ;then\n\t\t\t\tuci set passwall2.@global[0].enabled=\"${passwall2_server_enabled}\"\t\t\n\t\telif [ $proxy_mode  == \"gfw\" ] ;then\n\t\t \t\tuci set passwall2.@global[0].tcp_proxy_mode=\"${passwall2_original_run_mode}\"\n\t\tfi\n\t\tuci commit passwall2\n\t\t/etc/init.d/passwall2 restart 2>/dev/null\n\t\techolog \"passwall2重启完成\"\t\t \n\tfi\n\n\tif [ \"x${bypass_started}\" == \"x1\" ] ;then\n      \tif [ $proxy_mode  == \"close\" ] ;then\n        \tuci set vssr.@global[0].global_server=\"${vssr_original_server}\"\t\t\n      \telif [ $proxy_mode  == \"gfw\" ] ;then\n        \tuci set vssr.@global[0].run_mode=\"${vssr_original_run_mode}\"\n      \tfi\t\n\t\tuci commit vssr\n\t\t/etc/init.d/vssr restart &>/dev/null\n    \techolog \"Vssr重启完成\"\n\tfi\n\n\tif [ \"x${vssr_started}\" == \"x1\" ] ;then\n\t\tif [ $proxy_mode  == \"close\" ] ;then\n        \tuci set bypass.@global[0].global_server=\"${bypass_original_server}\"\t\t\n      \telif [ $proxy_mode  == \"gfw\" ] ;then\n        \tuci set  bypass.@global[0].run_mode=\"${bypass_original_run_mode}\"\n      \tfi\t\n     \tuci commit bypass \n\t \t/etc/init.d/bypass restart &>/dev/null\n    \techolog \"Bypass重启完成\"\n\tfi\n}\n\nfunction alidns_ip(){\n\tif [ \"x${DNS_enabled}\" == \"x1\" ] ;then\n\t\tget_servers_config \"DNS_type\" \"app_key\" \"app_secret\" \"main_domain\" \"sub_domain\" \"line\"\n\t\tif [ $DNS_type == \"aliyu\" ] ;then\n\t\tfor sub in $sub_domain\n\t\tdo\n\t\t\t/usr/bin/cloudflarespeedtest/aliddns.sh $app_key $app_secret $main_domain $sub $line $ipv6_enabled $bestip \n\t\t\techolog \"更新域名${sub}阿里云DNS完成\"\n\t\t\tsleep 1s\n\t\tdone\n\t\tfi\n\t\techo \"aliyun done\"\n\tfi\n}\n\nfunction host_ip() {\n\tif [ \"x${HOST_enabled}\" == \"x1\" ] ;then\n    get_servers_config \"host_domain\"\n    HOSTS_LINE=\"$bestip $host_domain\"\n    if [ -n \"$(grep $host_domain /etc/hosts)\" ]\n        then\n          sed -i\".bak\" \"/$host_domain/d\" /etc/hosts\n          echo $HOSTS_LINE >> /etc/hosts;\n        else                             \n          echo $HOSTS_LINE >> /etc/hosts;\n    fi                                \n    /etc/init.d/dnsmasq reload &>/dev/null\n    echolog \"HOST 完成\"\n  fi\n}\n\nread_config\n\n# 启动参数\nif [ \"$1\" ] ;then\n\t[ $1 == \"start\" ] && speed_test && ip_replace\n\t[ $1 == \"test\" ] && speed_test\n\t[ $1 == \"replace\" ] && ip_replace\n\texit\nfi\n"
  },
  {
    "path": "luci-app-cloudflarespeedtest/root/usr/share/rpcd/acl.d/luci-app-cloudflarespeedtest.json",
    "content": "{\r\n\t\"luci-app-cloudflarespeedtest\": {\r\n\t\t\"description\": \"Grant UCI access for luci-app-cloudflarespeedtest\",\r\n\t\t\"read\": {\r\n\t\t\t\"uci\": [ \"cloudflarespeedtest\" ]\r\n\t\t},\r\n\t\t\"write\": {\r\n\t\t\t\"uci\": [ \"cloudflarespeedtest\" ]\r\n\t\t}\r\n\t}\r\n}\r\n"
  },
  {
    "path": "luci-app-control-timewol/Makefile",
    "content": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for Timewol\nLUCI_DEPENDS:=+etherwake\nLUCI_PKGARCH:=all\nPKG_VERSION:=1.1\nPKG_RELEASE:=2\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-control-timewol/luasrc/controller/timewol.lua",
    "content": "module(\"luci.controller.timewol\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/luci-app-control-timewol\") then\n\t\treturn\n\tend\n\n\tentry({\"admin\", \"control\"}, firstchild(), \"Control\", 44).dependent = false\n\tentry({\"admin\", \"control\", \"timewol\"}, cbi(\"timewol\"), _(\"Timed Wakeup\"), 95).dependent = true\n\tentry({\"admin\", \"control\", \"timewol\", \"status\"}, call(\"status\")).leaf = true\nend\n\nfunction status()\n\tlocal e = {}\n\te.status = luci.sys.call(\"cat /etc/crontabs/root | grep etherwake >/dev/null\") == 0\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n"
  },
  {
    "path": "luci-app-control-timewol/luasrc/model/cbi/timewol.lua",
    "content": "local i = require \"luci.sys\"\n\nt = Map(\"luci-app-control-timewol\", translate(\"Timed network wake-up\"), translate(\"Wake up your LAN device regularly\"))\n\ne = t:section(TypedSection, \"basic\", translate(\"Basic setting\"))\ne.anonymous = true\n\no = e:option(Flag, \"enable\", translate(\"Enable\"))\no.rmempty = false\n\ne = t:section(TypedSection, \"macclient\", translate(\"Client setting\"))\ne.template = \"cbi/tblsection\"\ne.anonymous = true\ne.addremove = true\n\nnolimit_mac = e:option(Value, \"macaddr\", translate(\"MAC Address\"))\nnolimit_mac.rmempty = false\ni.net.mac_hints(function(e, t)\n\tnolimit_mac:value(e, \"%s (%s)\" % {e, t})\nend)\nnolimit_eth = e:option(Value, \"maceth\", translate(\"Network interface\"))\nnolimit_eth.rmempty = false\nfor t, e in ipairs(i.net.devices()) do\n\tif e ~= \"lo\" then\n\t\tnolimit_eth:value(e)\n\tend\nend\n\na = e:option(Value, \"minute\", translate(\"minutes\"))\na.optional = false\n\na = e:option(Value, \"hour\", translate(\"hour\"))\na.optional = false\n\na = e:option(Value, \"day\", translate(\"day\"))\na.optional = false\n\na = e:option(Value, \"month\", translate(\"month\"))\na.optional = false\n\na = e:option(Value, \"weeks\", translate(\"weeks\"))\na.optional = false\n\nreturn t\n"
  },
  {
    "path": "luci-app-control-timewol/luasrc/view/timewol/index.htm",
    "content": "<%#\n Copyright 2016 Chen RuiWei <crwbak@gmail.com>\n Licensed to the public under the Apache License 2.0.\n-%>\n\n<% include(\"cbi/map\") %>\n<script type=\"text/javascript\">//<![CDATA[\n\tXHR.poll(2, '<%=luci.dispatcher.build_url(\"admin\", \"control\", \"timewol\", \"status\")%>', null,\n\t\tfunction(x, result)\n\t\t{\n\t\t\tvar status = document.getElementsByClassName('timewol_status')[0];\n\t\t\tstatus.setAttribute(\"style\",\"font-weight:bold;\");\n\t\t\tstatus.setAttribute(\"color\",result.status ? \"green\":\"red\");\n\t\t\tstatus.innerHTML = result.status?'<%=translate(\"RUNNING\")%>':'<%=translate(\"NOT RUNNING\")%>';\n\t\t}\n\t)\n//]]>\n</script>\n"
  },
  {
    "path": "luci-app-control-timewol/luasrc/view/timewol/timewol.htm",
    "content": "<%+cbi/valueheader%>\n<font class=\"timewol_status\"><%=pcdata(self:cfgvalue(section) or self.default or \"\")%></font>\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-control-timewol/po/zh_Hans/timewol.po",
    "content": "msgid \"Control\"\nmsgstr \"管控\"\n\nmsgid \"Running Status\"\nmsgstr \"运行状态\"\n\nmsgid \"Collecting data...\"\nmsgstr \"正在收集数据...\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\nmsgid \"RUNNING\"\nmsgstr \"运行中\"\n\nmsgid \"Timed Wakeup\"\nmsgstr \"定时唤醒\"\n\nmsgid \"Timed network wake-up\"\nmsgstr \"定时网络唤醒\"\n\nmsgid \"Wake up your LAN device regularly\"\nmsgstr \"定时唤醒你的局域网设备\"\n\nmsgid \"Basic setting\"\nmsgstr \"基本设置\"\n\nmsgid \"Enable\"\nmsgstr \"开启\"\n\nmsgid \"Client setting\"\nmsgstr \"客户端设置\"\n\nmsgid \"MAC Address\"\nmsgstr \"MAC 地址\"\n\nmsgid \"Network interface\"\nmsgstr \"网络接口\"\n\nmsgid \"minutes\"\nmsgstr \"分钟\"\n\nmsgid \"hour\"\nmsgstr \"小时\"\n\nmsgid \"day\"\nmsgstr \"日\"\n\nmsgid \"month\"\nmsgstr \"月\"\n\nmsgid \"weeks\"\nmsgstr \"星期\"\n"
  },
  {
    "path": "luci-app-control-timewol/root/etc/config/luci-app-control-timewol",
    "content": "\nconfig basic\n\toption enable '0'\n"
  },
  {
    "path": "luci-app-control-timewol/root/etc/init.d/luci-app-control-timewol",
    "content": "#!/bin/sh /etc/rc.common\n#\n# Copyright (C) 2015 OpenWrt-dist\n# Copyright (C) 2016 fw867 <ffkykzs@gmail.com>\n#\n# This is free software, licensed under the GNU General Public License v3.\n# See /LICENSE for more information.\n#\n\nSTART=99\n\nCONFIG=\"luci-app-control-timewol\"\n\nuci_get_by_type() {\n\tlocal index=0\n\tif [ -n $4 ]; then\n\t\tindex=$4\n\tfi\n\tlocal ret=$(uci get $CONFIG.@$1[$index].$2 2>/dev/null)\n\techo ${ret:=$3}\n}\n\nis_true() {\n\tcase $1 in\n\t\t1|on|true|yes|enabled) echo 0;;\n\t\t*) echo 1;;\n\tesac\n}\n\nload_config() {\n\tENABLED=$(uci_get_by_type basic enable)\n\treturn $(is_true $ENABLED)\n}\n\nadd_rule(){\n\tlocal items=$(uci show ${CONFIG} | grep \"=macclient\" | cut -d '.' -sf 2 | cut -d '=' -sf 1)\n\tfor i in $items; do\n\t\tlocal macaddr=$(uci -q get ${CONFIG}.${i}.macaddr)\n\t\tlocal maceth=$(uci -q get ${CONFIG}.${i}.maceth)\n\t\tlocal minute=$(uci -q get ${CONFIG}.${i}.minute)\n\t\tlocal hour=$(uci -q get ${CONFIG}.${i}.hour)\n\t\tlocal day=$(uci -q get ${CONFIG}.${i}.day)\n\t\tlocal month=$(uci -q get ${CONFIG}.${i}.month)\n\t\tlocal weeks=$(uci -q get ${CONFIG}.${i}.weeks)\n\t\tif [ -z $macaddr ] || [ -z $maceth ]; then\n\t\t\tcontinue\n\t\tfi\n\t\tif [ -z $minute ] ; then\n\t\t\tminute=\"0\"\n\t\tfi\n\t\tif [ -z $hour ] ; then\n\t\t\thour=\"*\"\n\t\tfi\n\t\tif [ -z $day ] ; then\n\t\t\tday=\"*\"\n\t\tfi\n\t\tif [ -z $month ] ; then\n\t\t\tmonth=\"*\"\n\t\tfi\n\t\tif [ -z $weeks ] ; then\n\t\t\tweeks=\"*\"\n\t\tfi\n\t\techo \"$minute $hour $day $month $weeks /usr/bin/etherwake -D -i $maceth $macaddr\" >> /etc/crontabs/root\n\t\tunset macaddr maceth minute hour day month weeks\n\tdone\n}\n\nstart() {\n\tstop\n    ! load_config && exit 0\n    add_rule\n}\nstop() {\n\tsed -i '/etherwake/d' /etc/crontabs/root >/dev/null 2>&1\n}\n"
  },
  {
    "path": "luci-app-control-timewol/root/etc/uci-defaults/luci-app-control-timewol",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@luci_app_control_timewol[-1]\n\tadd ucitrack luci_app_control_timewol\n\tset ucitrack.@luci_app_control_timewol[-1].init=luci-app-control-timewol\n\tcommit ucitrack\nEOF\n\nrm -rf /tmp/luci-*cache\nexit 0\n"
  },
  {
    "path": "luci-app-control-timewol/root/usr/share/rpcd/acl.d/luci-app-control-timewol.json",
    "content": "{\n\t\"luci-app-control-timewol\": {\n\t\t\"description\": \"Grant UCI access for luci-app-control-timewol\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"luci-app-control-timewol\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"luci-app-control-timewol\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-control-timewol/root/usr/share/ucitrack/luci-app-control-timewol.json",
    "content": "{\n\t\"config\": \"luci-app-control-timewol\",\n\t\"init\": \"luci-app-control-timewol\"\n}\n"
  },
  {
    "path": "luci-app-control-webrestriction/Makefile",
    "content": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for Webrestriction\nLUCI_PKGARCH:=all\nPKG_VERSION:=1.1\nPKG_RELEASE:=2\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-control-webrestriction/luasrc/controller/webrestriction.lua",
    "content": "module(\"luci.controller.webrestriction\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/luci-app-control-webrestriction\") then\n\t\treturn\n\tend\n\n\tentry({\"admin\", \"control\"}, firstchild(), \"Control\", 44).dependent = false\n\tentry({\"admin\", \"control\", \"webrestriction\"}, cbi(\"webrestriction\"), _(\"Access Control\"), 11).dependent = true\n\tentry({\"admin\", \"control\", \"webrestriction\", \"status\"}, call(\"status\")).leaf = true\nend\n\nfunction status()\n\tlocal e = {}\n\te.status = luci.sys.call(\"iptables -w -L FORWARD | grep WEB_RESTRICTION >/dev/null\") == 0\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n"
  },
  {
    "path": "luci-app-control-webrestriction/luasrc/model/cbi/webrestriction.lua",
    "content": "local o = require \"luci.sys\"\n\na = Map(\"luci-app-control-webrestriction\", translate(\"Access Control\"), translate(\n\t\"Use the blacklist or whitelist mode to control whether a client in the list can connect to the Internet.\"))\na.template = \"webrestriction/index\"\n\ne = a:section(TypedSection, \"basic\", translate(\"Running Status\"))\ne.anonymous = true\n\nt = e:option(DummyValue, \"webrestriction_status\", translate(\"Running Status\"))\nt.template = \"webrestriction/webrestriction\"\nt.value = translate(\"Collecting data...\")\n\ne = a:section(TypedSection, \"basic\", translate(\"Global setting\"))\ne.anonymous = true\n\nt = e:option(Flag, \"enable\", translate(\"Enable\"))\nt.rmempty = false\n\nt = e:option(ListValue, \"limit_type\", translate(\"Limit mode\"))\nt.default = \"blacklist\"\nt:value(\"whitelist\", translate(\"Whitelist\"))\nt:value(\"blacklist\", translate(\"Blacklist\"))\n\ne = a:section(TypedSection, \"macbind\", translate(\"List setting\"), translate(\n\t\"In blacklist mode, the client in the list is prohibited from connecting to the Internet. In whitelist mode, only the clients in the list can connect to the Internet.\"))\ne.template = \"cbi/tblsection\"\ne.anonymous = true\ne.addremove = true\n\nt = e:option(Flag, \"enable\", translate(\"Enable\"))\nt.rmempty = false\n\nt = e:option(Value, \"macaddr\", translate(\"MAC Address\"))\nt.rmempty = true\n\no.net.mac_hints(function(e, a)\n\tt:value(e, \"%s (%s)\" % {e, a})\nend)\nreturn a\n"
  },
  {
    "path": "luci-app-control-webrestriction/luasrc/view/webrestriction/index.htm",
    "content": "<%#\n Copyright 2016 Chen RuiWei <crwbak@gmail.com>\n Licensed to the public under the Apache License 2.0.\n-%>\n\n<% include(\"cbi/map\") %>\n<script type=\"text/javascript\">//<![CDATA[\n\tXHR.poll(2, '<%=luci.dispatcher.build_url(\"admin\", \"control\", \"webrestriction\", \"status\")%>', null,\n\t\tfunction(x, result)\n\t\t{\n\t\t\tvar status = document.getElementsByClassName('webrestriction_status')[0];\n\t\t\tstatus.setAttribute(\"style\",\"font-weight:bold;\");\n\t\t\tstatus.setAttribute(\"color\",result.status ? \"green\":\"red\");\n\t\t\tstatus.innerHTML = result.status?'<%=translate(\"RUNNING\")%>':'<%=translate(\"NOT RUNNING\")%>';\n\t\t}\n\t)\n//]]>\n</script>\n"
  },
  {
    "path": "luci-app-control-webrestriction/luasrc/view/webrestriction/webrestriction.htm",
    "content": "<%+cbi/valueheader%>\n<font class=\"webrestriction_status\"><%=pcdata(self:cfgvalue(section) or self.default or \"\")%></font>\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-control-webrestriction/po/zh_Hans/webrestriction.po",
    "content": "msgid \"Control\"\nmsgstr \"管控\"\n\nmsgid \"Running Status\"\nmsgstr \"运行状态\"\n\nmsgid \"Collecting data...\"\nmsgstr \"正在收集数据...\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\nmsgid \"RUNNING\"\nmsgstr \"运行中\"\n\nmsgid \"Access Control\"\nmsgstr \"访问限制\"\n\nmsgid \"Use the blacklist or whitelist mode to control whether a client in the list can connect to the Internet.\"\nmsgstr \"使用黑名单或者白名单模式控制列表中的客户端是否能够连接到互联网。\"\n\nmsgid \"Global setting\"\nmsgstr \"全局设置\"\n\nmsgid \"Enable\"\nmsgstr \"开启\"\n\nmsgid \"Limit mode\"\nmsgstr \"限制模式\"\n\nmsgid \"Whitelist\"\nmsgstr \"白名单\"\n\nmsgid \"Blacklist\"\nmsgstr \"黑名单\"\n\nmsgid \"List setting\"\nmsgstr \"名单设置\"\n\nmsgid \"In blacklist mode, the client in the list is prohibited from connecting to the Internet. In whitelist mode, only the clients in the list can connect to the Internet.\"\nmsgstr \"如果是黑名单模式，列表中的客户端将被禁止连接到互联网；白名单模式表示仅有列表中的客户端可以连接到互联网。\"\n\nmsgid \"MAC Address\"\nmsgstr \"MAC 地址\"\n"
  },
  {
    "path": "luci-app-control-webrestriction/root/etc/config/luci-app-control-webrestriction",
    "content": "\nconfig basic\n\toption enable '0'\n\toption limit_type 'blacklist'\n\n"
  },
  {
    "path": "luci-app-control-webrestriction/root/etc/init.d/luci-app-control-webrestriction",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2016 fw867 <ffkykzs@gmail.com>\n# Copyright (C) 2024 Lienol\n\nSTART=99\n\nCONFIG=\"luci-app-control-webrestriction\"\nipt=\"iptables -w\"\nip6t=\"ip6tables -w\"\n\niptables_w(){\n\t$ipt 1 \"$@\"\n\t$ip6t 1 \"$@\"\n}\n\nadd_rule(){\n\taction=$1\n\tlocal items=$(uci show ${CONFIG} | grep \"=macbind\" | cut -d '.' -sf 2 | cut -d '=' -sf 1)\n\tfor i in $items; do\n\t\tenable=$(uci -q get ${CONFIG}.${i}.enable)\n\t\tmacaddr=$(uci -q get ${CONFIG}.${i}.macaddr)\n\t\tif [ -z $enable ] || [ -z $macaddr ]; then\n\t\t\tcontinue\n\t\tfi\n\t\tif [ \"$enable\" == \"1\" ]; then\n\t\t\tiptables_w -A WEB_RESTRICTION -m mac --mac-source $macaddr -j $action\n\t\t\t[ \"$limit_type\" == \"blacklist\" ] && {\n\t\t\t\tiptables_w -t nat -A WEB_RESTRICTION -m mac --mac-source $macaddr -j RETURN\n\t\t\t}\n\t\tfi\n\t\tunset enable macaddr\n\tdone\n}\n\nstart(){\n\tstop\n\tENABLED=$(uci -q get ${CONFIG}.@basic[0].enable || echo \"0\")\n\t[ \"${ENABLED}\" != \"1\" ] && exit 0\n\tlimit_type=$(uci -q get ${CONFIG}.@basic[0].limit_type)\n\n\tiptables_w -N WEB_RESTRICTION\n\tif [ \"$limit_type\" == \"blacklist\" ]; then\n\t\tiptables_w -t nat -N WEB_RESTRICTION\n\t\tadd_rule DROP\n\telse\n\t\tadd_rule ACCEPT\n\t\tiptables_w -A WEB_RESTRICTION -j DROP\n\tfi\n\n\tFW3_INDEX_4=$($ipt -L FORWARD --line-numbers | tail -n +3 | grep -E ACCEPT | grep ctstate | grep fw3 | awk '{print $1}')\n\t[ -n \"$FW3_INDEX_4\" ] && let FW3_INDEX_4+=1\n\t$ipt -I FORWARD $FW3_INDEX_4 -j WEB_RESTRICTION\n\n\tFW3_INDEX_6=$($ip6t -L FORWARD --line-numbers | tail -n +3 | grep -E ACCEPT | grep ctstate | grep fw3 | awk '{print $1}')\n\t[ -n \"$FW3_INDEX_6\" ] && let FW3_INDEX_6+=1\n\t$ip6t -I FORWARD $FW3_INDEX_6 -j WEB_RESTRICTION\n\n\t[ \"$limit_type\" == \"blacklist\" ] && {\n\t\tiptables_w -t nat -I PREROUTING 1 -j WEB_RESTRICTION\n\t}\n}\n\nstop(){\n\tipt_del() {\n\t\tfor i in $(seq 1 $($1 -nL $2 | grep -c \"WEB_RESTRICTION\")); do\n\t\t\tlocal index=$($1 --line-number -nL $2 | grep \"WEB_RESTRICTION\" | head -1 | awk '{print $1}')\n\t\t\t$1 -w -D $2 $index 2>/dev/null\n\t\tdone\n\t}\n\tipt_del \"$ipt\" \"FORWARD\"\n\tipt_del \"$ipt\" \"INPUT\"\n\tipt_del \"$ipt -t nat\" \"PREROUTING\"\n\tipt_del \"$ip6t\" \"FORWARD\"\n\tipt_del \"$ip6t\" \"INPUT\"\n\tipt_del \"$ip6t -t nat\" \"PREROUTING\"\n\n\tiptables_w -F WEB_RESTRICTION 2>/dev/null\n\tiptables_w -X WEB_RESTRICTION 2>/dev/null\n\tiptables_w -t nat -F WEB_RESTRICTION 2>/dev/null\n\tiptables_w -t nat -X WEB_RESTRICTION 2>/dev/null\n}\n"
  },
  {
    "path": "luci-app-control-webrestriction/root/etc/uci-defaults/luci-app-control-webrestriction",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@luci_app_control_webrestriction[-1]\n\tadd ucitrack luci_app_control_webrestriction\n\tset ucitrack.@luci_app_control_webrestriction[-1].init=luci-app-control-webrestriction\n\tcommit ucitrack\nEOF\n\nrm -rf /tmp/luci-*cache\nexit 0\n"
  },
  {
    "path": "luci-app-control-webrestriction/root/usr/share/rpcd/acl.d/luci-app-control-webrestriction.json",
    "content": "{\n\t\"luci-app-control-webrestriction\": {\n\t\t\"description\": \"Grant UCI access for luci-app-control-webrestriction\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"luci-app-control-webrestriction\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"luci-app-control-webrestriction\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-control-webrestriction/root/usr/share/ucitrack/luci-app-control-webrestriction.json",
    "content": "{\n\t\"config\": \"luci-app-control-webrestriction\",\n\t\"init\": \"luci-app-control-webrestriction\"\n}\n"
  },
  {
    "path": "luci-app-control-weburl/Makefile",
    "content": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for Weburl\nLUCI_DEPENDS:=+iptables-mod-filter +kmod-ipt-filter\nLUCI_PKGARCH:=all\nPKG_VERSION:=1.1\nPKG_RELEASE:=2\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-control-weburl/luasrc/controller/weburl.lua",
    "content": "module(\"luci.controller.weburl\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/luci-app-control-weburl\") then\n\t\treturn\n\tend\n\n\tentry({\"admin\", \"control\"}, firstchild(), \"Control\", 44).dependent = false\n\tentry({\"admin\", \"control\", \"weburl\"}, cbi(\"weburl\"), _(\"URL Filter\"), 12).dependent = true\n\tentry({\"admin\", \"control\", \"weburl\", \"status\"}, call(\"status\")).leaf = true\nend\n\nfunction status()\n\tlocal e = {}\n\te.status = luci.sys.call(\"iptables -w -L FORWARD | grep WEBURL >/dev/null\") == 0\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n"
  },
  {
    "path": "luci-app-control-weburl/luasrc/model/cbi/weburl.lua",
    "content": "local o = require \"luci.sys\"\n\na = Map(\"luci-app-control-weburl\", translate(\"URL Filter\"), translate(\n\t\"Set keyword filtering here, can be any character in the URL, can filter such as video sites, QQ, thunder, Taobao...\"))\na.template = \"weburl/index\"\n\nt = a:section(TypedSection, \"basic\", translate(\"Running Status\"))\nt.anonymous = true\n\ne = t:option(DummyValue, \"weburl_status\", translate(\"Running Status\"))\ne.template = \"weburl/weburl\"\ne.value = translate(\"Collecting data...\")\n\nt = a:section(TypedSection, \"basic\", translate(\"Basic setting\"), translate(\n\t\"In general, normal filtering works fine, but forced filtering uses more complex algorithms and leads to higher CPU usage.\"))\nt.anonymous = true\n\ne = t:option(Flag, \"enable\", translate(\"Enable\"))\ne.rmempty = false\n\ne = t:option(Flag, \"algos\", translate(\"Forced filter\"))\ne.rmempty = false\n\nt = a:section(TypedSection, \"macbind\", translate(\"Keyword setting\"), translate(\n\t\"MAC addresses do not filter out all clients. For example, only specified clients are filtered out. Filtering time is optional.\"))\nt.template = \"cbi/tblsection\"\nt.anonymous = true\nt.addremove = true\n\ne = t:option(Flag, \"enable\", translate(\"Enable\"))\ne.rmempty = false\n\ne = t:option(Value, \"macaddr\", translate(\"MAC Address\"))\ne.rmempty = true\n\no.net.mac_hints(function(t, a)\n\te:value(t, \"%s (%s)\" % {t, a})\nend)\n\ne = t:option(Value, \"timeon\", translate(\"Start time\"))\ne.placeholder = \"00:00\"\ne.rmempty = true\n\ne = t:option(Value, \"timeoff\", translate(\"End time\"))\ne.placeholder = \"23:59\"\ne.rmempty = true\n\ne = t:option(Value, \"keyword\", translate(\"Keyword\"))\ne.rmempty = false\n\nreturn a\n"
  },
  {
    "path": "luci-app-control-weburl/luasrc/view/weburl/index.htm",
    "content": "<%#\n Copyright 2016 Chen RuiWei <crwbak@gmail.com>\n Licensed to the public under the Apache License 2.0.\n-%>\n\n<% include(\"cbi/map\") %>\n<script type=\"text/javascript\">//<![CDATA[\n\tXHR.poll(2, '<%=luci.dispatcher.build_url(\"admin\", \"control\", \"weburl\", \"status\")%>', null,\n\t\tfunction(x, result)\n\t\t{\n\t\t\tvar status = document.getElementsByClassName('weburl_status')[0];\n\t\t\tstatus.setAttribute(\"style\",\"font-weight:bold;\");\n\t\t\tstatus.setAttribute(\"color\",result.status ? \"green\":\"red\");\n\t\t\tstatus.innerHTML = result.status?'<%=translate(\"RUNNING\")%>':'<%=translate(\"NOT RUNNING\")%>';\n\t\t}\n\t)\n//]]>\n</script>\n"
  },
  {
    "path": "luci-app-control-weburl/luasrc/view/weburl/weburl.htm",
    "content": "<%+cbi/valueheader%>\n<font class=\"weburl_status\"><%=pcdata(self:cfgvalue(section) or self.default or \"\")%></font>\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-control-weburl/po/zh_Hans/weburl.po",
    "content": "msgid \"Control\"\nmsgstr \"管控\"\n\nmsgid \"Running Status\"\nmsgstr \"运行状态\"\n\nmsgid \"Collecting data...\"\nmsgstr \"正在收集数据...\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\nmsgid \"RUNNING\"\nmsgstr \"运行中\"\n\nmsgid \"URL Filter\"\nmsgstr \"网址过滤\"\n\nmsgid \"Set keyword filtering here, can be any character in the URL, can filter such as video sites, QQ, thunder, Taobao...\"\nmsgstr \"在这里设置关键词过滤，可以是URL里任意字符，可以过滤如视频网站、QQ、迅雷、淘宝。。。\"\n\nmsgid \"Basic setting\"\nmsgstr \"基本设置\"\n\nmsgid \"In general, normal filtering works fine, but forced filtering uses more complex algorithms and leads to higher CPU usage.\"\nmsgstr \"一般来说普通过滤效果就很好了，强制过滤会使用更复杂的算法导致更高的CPU占用。\"\n\nmsgid \"Enable\"\nmsgstr \"启用\"\n\nmsgid \"Forced filter\"\nmsgstr \"强效过滤\"\n\nmsgid \"Keyword setting\"\nmsgstr \"关键词设置\"\n\nmsgid \"MAC addresses do not filter out all clients. For example, only specified clients are filtered out. Filtering time is optional.\"\nmsgstr \"MAC不设置为全客户端过滤，如设置只过滤指定的客户端。过滤时间可不设置。\"\n\nmsgid \"MAC Address\"\nmsgstr \"MAC 地址\"\n\nmsgid \"Start time\"\nmsgstr \"开始时间\"\n\nmsgid \"End time\"\nmsgstr \"结束时间\"\n\nmsgid \"Keyword\"\nmsgstr \"关键字\"\n"
  },
  {
    "path": "luci-app-control-weburl/root/etc/config/luci-app-control-weburl",
    "content": "\nconfig basic\n\toption enable '0'\n\toption algos '0'\n\nconfig macbind\n\toption keyword 'qq.com'\n\toption enable '0'\n\toption macaddr '00:0C:29:C8:99:9E'\n\nconfig macbind\n\toption keyword 'taobao.com'\n\toption enable '0'\n\nconfig macbind\n\toption enable '0'\n\toption keyword 'youku.com'\n\nconfig macbind\n\toption enable '0'\n\toption keyword 'www'\n\n"
  },
  {
    "path": "luci-app-control-weburl/root/etc/init.d/luci-app-control-weburl",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2016 fw867 <ffkykzs@gmail.com>\n# Copyright (C) 2024 Lienol\n\nSTART=99\n\nCONFIG=\"luci-app-control-weburl\"\n\niptables_w(){\n\tiptables -w 1 \"$@\"\n\tip6tables -w 1 \"$@\"\n}\n\nstart(){\n\tstop\n\tENABLED=$(uci -q get ${CONFIG}.@basic[0].enable || echo \"0\")\n\t[ \"${ENABLED}\" != \"1\" ] && exit 0\n\tALGOS=$(uci -q get ${CONFIG}.@basic[0].algos || echo \"0\")\n\tWEBURL_ALGOS=\"bm\"\n\t[ \"${ALGOS}\" = \"1\" ] && WEBURL_ALGOS=\"kmp\"\n\n\t# resolve interface\n\tlocal interface=$(\n\t\t. /lib/functions/network.sh\n\n\t\tnetwork_is_up \"lan\" && network_get_device device \"lan\"\n\t\techo \"${device:-br-lan}\"\n\t)\n\n\tiptables_w -t filter -N WEBURL_REJECT\n\tiptables_w -t filter -I WEBURL_REJECT -j DROP\n\tiptables_w -t filter -I WEBURL_REJECT -p tcp -j REJECT --reject-with tcp-reset\n\tiptables_w -t filter -N WEBURL_RULES\n\tiptables_w -t filter -N WEBURL\n\tiptables_w -t filter -I WEBURL -i $interface -m length --length 53:768 -j WEBURL_RULES\n\t# iptables_w -t filter -I WEBURL -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT\n\tiptables_w -t filter -I FORWARD -j WEBURL\n\n\tlocal items=$(uci show ${CONFIG} | grep \"=macbind\" | cut -d '.' -sf 2 | cut -d '=' -sf 1)\n\tfor i in $items; do\n\t\tenable=$(uci -q get ${CONFIG}.${i}.enable || echo \"0\")\n\t\tmacaddr=$(uci -q get ${CONFIG}.${i}.macaddr)\n\t\ttimeon=$(uci -q get ${CONFIG}.${i}.timeon)\n\t\ttimeoff=$(uci -q get ${CONFIG}.${i}.timeoff)\n\t\tkeyword=$(uci -q get ${CONFIG}.${i}.keyword)\n\t\tif [ \"$enable\" == \"0\" ] || [ -z \"$keyword\" ]; then\n\t\t\tcontinue\n\t\tfi\n\t\tif [ -z \"$timeon\" ] || [ -z \"$timeoff\" ]; then\n\t\t\tsettime=\"\"\n\t\telse\n\t\t\tsettime=\"-m time --kerneltz --timestart $timeon --timestop $timeoff\"\n\t\tfi\n\n\t\tif [ -z \"$macaddr\" ]; then\n\t\t\tiptables_w -t filter -I WEBURL_RULES $settime -m string --string \"$keyword\" --algo $WEBURL_ALGOS -j WEBURL_REJECT\n\t\telse\n\t\t\tiptables_w -t filter -I WEBURL_RULES $settime -m mac --mac-source $macaddr -m string --string \"$keyword\" --algo $WEBURL_ALGOS -j WEBURL_REJECT\n\t\tfi\n\t\tunset enable macaddr timeon timeoff keyword\n\tdone\n\n\tlogger -t weburl \"weburl filter on $interface\"\n}\n\nstop(){\n\tiptables_w -t filter -D FORWARD -j WEBURL 2>/dev/null\n\tiptables_w -t filter -F WEBURL 2>/dev/null\n\tiptables_w -t filter -X WEBURL 2>/dev/null\n\tiptables_w -t filter -F WEBURL_RULES 2>/dev/null\n\tiptables_w -t filter -X WEBURL_RULES 2>/dev/null\n\tiptables_w -t filter -F WEBURL_REJECT 2>/dev/null\n\tiptables_w -t filter -X WEBURL_REJECT 2>/dev/null\n}\n"
  },
  {
    "path": "luci-app-control-weburl/root/etc/uci-defaults/luci-app-control-weburl",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@luci_app_control_weburl[-1]\n\tadd ucitrack luci_app_control_weburl\n\tset ucitrack.@luci_app_control_weburl[-1].init=luci-app-control-weburl\n\tcommit ucitrack\nEOF\n\nrm -rf /tmp/luci-*cache\nexit 0\n"
  },
  {
    "path": "luci-app-control-weburl/root/usr/share/rpcd/acl.d/luci-app-control-weburl.json",
    "content": "{\n\t\"luci-app-control-weburl\": {\n\t\t\"description\": \"Grant UCI access for luci-app-control-weburl\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"luci-app-control-weburl\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"luci-app-control-weburl\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-control-weburl/root/usr/share/ucitrack/luci-app-control-weburl.json",
    "content": "{\n\t\"config\": \"luci-app-control-weburl\",\n\t\"init\": \"luci-app-control-weburl\"\n}\n"
  },
  {
    "path": "luci-app-cpulimit/Makefile",
    "content": "#\n# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=cpulimit configuration module\nLUCI_DEPENDS:=+cpulimit\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-cpulimit/luasrc/controller/cpulimit.lua",
    "content": "module(\"luci.controller.cpulimit\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/cpulimit\") then\n\t\treturn\n\tend\n\n\tlocal page = entry({\"admin\", \"system\", \"cpulimit\"}, cbi(\"cpulimit\"), _(\"cpulimit\"), 65)\n\tpage.dependent = true\n\tpage.acl_depends = { \"luci-app-cpulimit\" }\nend\n"
  },
  {
    "path": "luci-app-cpulimit/luasrc/model/cbi/cpulimit.lua",
    "content": "m = Map(\"cpulimit\", translate(\"cpulimit\"))\nm.description = translate(\"cpulimit  \")\n\ns = m:section(TypedSection, \"list\", translate(\"Settings\"))\ns.template = \"cbi/tblsection\"\ns.anonymous = true\ns.addremove = true\n\nenable = s:option(Flag, \"enabled\", translate(\"enable\", \"enable\"))\nenable.optional = false\nenable.rmempty = false\n\nexename = s:option(Value, \"exename\", translate(\"exename\"), translate(\"name of the executable program file or path name\"))\nexename.optional = false\nexename.rmempty = false\nexename.default = \"/usr/bin/transmission-daemon\"\nexename:value(\"transmission\",\"/usr/bin/transmission-daemon\")\nexename:value(\"samba\",\"/usr/sbin/smbd\")\nexename:value(\"mount.ntfs-3g\",\"mount.ntfs-3g\")\nexename:value(\"vsftpd\",\"/usr/sbin/vsftpd\")\nexename:value(\"pure-ftpd\",\"/usr/sbin/pure-ftpd\")\n\nlimit = s:option(Value, \"limit\", translate(\"limit\"))\nlimit.optional = false\nlimit.rmempty = false\nlimit.default = \"50\"\nlimit:value(\"100\",\"100%\")\nlimit:value(\"90\",\"90%\")\nlimit:value(\"80\",\"80%\")\nlimit:value(\"70\",\"70%\")\nlimit:value(\"60\",\"60%\")\nlimit:value(\"50\",\"50%\")\nlimit:value(\"40\",\"40%\")\nlimit:value(\"30\",\"30%\")\nlimit:value(\"20\",\"20%\")\nlimit:value(\"10\",\"10%\")\n\nreturn m\n"
  },
  {
    "path": "luci-app-cpulimit/po/zh_Hans/cpulimit.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"POT-Creation-Date: 2014-06-28\\n\"\n\"PO-Revision-Date: 2014-06-28\\n\"\n\"Last-Translator: Syrone Wong <wong.syrone@gmail.com>\\n\"\n\"Language: zh_Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\nmsgid \"cpulimit\"\nmsgstr \"CPU占用率限制\"\n\nmsgid \"Use cpulimit to restrict app's cpu usage.\"\nmsgstr \"利用cpulimit限制应用程序的CPU使用率\"\n\nmsgid \"Usage restrictions\"\nmsgstr \"使用率限制\"\n\nmsgid \"exename\"\nmsgstr \"进程名称\"\n\nmsgid \"name of the executable program file or path name\"\nmsgstr \"可执行文件名称。不能是应用程序路径！\"\n\nmsgid \"limit\"\nmsgstr \"占用率限制\""
  },
  {
    "path": "luci-app-cpulimit/root/etc/config/cpulimit",
    "content": "\nconfig 'list'\n\toption 'exename' '/usr/bin/transmission-daemon'\n\toption 'limit' '50'\n\toption 'enabled' '0'\n\n"
  },
  {
    "path": "luci-app-cpulimit/root/etc/init.d/cpulimit",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2006-2011 OpenWrt.org\n. /lib/functions.sh\n\nSTART=50\n\nDEFAULT=/etc/default/cpulimit\n\n\nstart() {\n /usr/bin/cpulimit.sh start &\n}\n\nstop() {\n  killall -9 cpulimit\n}\n"
  },
  {
    "path": "luci-app-cpulimit/root/etc/uci-defaults/luci-cpulimit",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n          delete ucitrack.@cpulimit[-1]\n          add ucitrack cpulimit\n          set ucitrack.@cpulimit[-1].init=cpulimit\n          commit ucitrack\nEOF\n\n/etc/init.d/cpulimit enable\n\nrm -f /tmp/luci-indexcache\nexit 0\n"
  },
  {
    "path": "luci-app-cpulimit/root/usr/bin/cpulimit.sh",
    "content": "#!/bin/sh\n\n. /lib/functions.sh\n\ncpulimit_get(){\n\techo cpulimit_get\n\tconfig_get enabled $1 enabled\n\t[ $enabled -gt 0 ] || return 1\n\tconfig_get limit $1 limit\n\tconfig_get exename $1 exename\n\tcpulimit -l $limit -e $exename &\n\techo cpulimit -l $limit -e $exename\n}\n\n\n\nstop() {\nkillall -9 cpulimit\n#\tps -a|grep cpulimit|while read line\n#\tdo\n#\t  killall cpulimit>/dev/null 2>&1\n#\tdone\n}\n\ncase \"$1\" in\n\t\"start\")\n\techo start\n\tkillall -9 cpulimit\n\tconfig_load cpulimit\n\tconfig_foreach cpulimit_get list\n\techo end\n\texit 0\t\n;;\n\t\"stop\")echo stop; killall -9 cpulimit;;\nesac\n"
  },
  {
    "path": "luci-app-cpulimit/root/usr/share/rpcd/acl.d/luci-app-cpulimit.json",
    "content": "{\n\t\"luci-app-cpulimit\": {\n\t\t\"description\": \"Grant UCI access for luci-app-cpulimit\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"cpulimit\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"cpulimit\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-ddns-go/ddns-go/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021-2026 sirpdboy  <herboy2008@gmail.com>\n# \n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=ddns-go\nPKG_VERSION:=6.16.2\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/jeessy2/ddns-go/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=1a92f53e50c8ca81e20c15c6dbaf490544f1a7b7b8c8d1c4c60ad8f1bc890276\n\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=sirpdboy <herboy2008@gmail.com>\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/jeessy2/ddns-go/v6\nGO_PKG_LDFLAGS_X:=main.Version=$(PKG_VERSION)\nGO_PKG_LDFLAGS:=$(GO_PKG_LDFLAGS_X)\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/ddns-go\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=IP Addresses and Names\n  TITLE:=Support IPV4 and IPV6 simple and easy-to-use IP binding domain name tool\n  URL:=https://github.com/jeessy2/ddns-go\n  DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle\n  USERID:=ddns-go:ddns-go\nendef\n\ndefine Package/ddns-go/description\n  A simple and easy-to-use IP binding domain name tool that supports IPV4 and IPV6.\nendef\n\ndefine Package/ddns-go/conffiles\n/etc/config/ddns-go\n/etc/ddns-go/ddns-go-config.yaml\nendef\n\n\ndefine Package/ddns-go/install\n\t$(call GoPackage/Package/Install/Bin,$(1))\n\t\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_DIR) $(1)/etc/config\n\t$(INSTALL_BIN) $(CURDIR)/files/ddns-go.init $(1)/etc/init.d/ddns-go\n\t$(INSTALL_CONF) $(CURDIR)/files/ddns-go.conf $(1)/etc/config/ddns-go\nendef\n\n$(eval $(call GoBinPackage,ddns-go))\n$(eval $(call BuildPackage,ddns-go))"
  },
  {
    "path": "luci-app-ddns-go/ddns-go/files/ddns-go.conf",
    "content": "config basic 'config'\n        option enabled '0'\n        option logger '1'\n        option port '9876'\n        option time '300'\n        option ctimes '5'\n        option skipverify '0'\n        option delay '0'\n        option dns '223.5.5.5'\n"
  },
  {
    "path": "luci-app-ddns-go/ddns-go/files/ddns-go.init",
    "content": "#!/bin/sh /etc/rc.common\n#\n# Copyright (C) 2021-2026  sirpdboy  <herboy2008@gmail.com> \n#\n# This file is part of ddns-go .\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\nSTART=99\nUSE_PROCD=1\nNAME=ddns-go\nPROG=/usr/bin/ddns-go\nCONFDIR=/etc/ddns-go\nCONF=$CONFDIR/ddns-go-config.yaml\n\ninit_yaml() {\n    [ -d \"$CONFDIR\" ] || mkdir -p \"$CONFDIR\"\n    chown -R ddns-go:ddns-go \"$CONFDIR\"\n    chmod 755 \"$CONFDIR\"\n    [ -f \"$CONF\" ] && chmod 644 \"$CONF\"\n}\n\nbuild_args() {\n    local cfg=\"$1\"\n    local args=\"-c $CONF\"\n    \n    config_get port \"$cfg\" port '9876'\n    args=\"$args -l :$port\"\n    \n    config_get time \"$cfg\" time '300'\n    [ -n \"$time\" ] && args=\"$args -f $time\"\n    \n    config_get ctimes \"$cfg\" ctimes '5'\n    [ -n \"$ctimes\" ] && args=\"$args -cacheTimes $ctimes\"\n    \n    config_get dns \"$cfg\" dns '223.5.5.5'\n    [ -n \"$dns\" ] && args=\"$args -dns $dns\"\n    \n    config_get_bool noweb \"$cfg\" noweb 0\n    [ \"$noweb\" -eq 1 ] && args=\"$args -noweb\"\n    \n    config_get_bool skipverify \"$cfg\" skipverify 0\n    [ \"$skipverify\" -eq 1 ] && args=\"$args -skipVerify\"\n    \n    echo \"$args\"\n}\n\nstart_instance() {\n    local cfg=\"$1\"\n    config_get_bool enabled \"$cfg\" enabled 0\n    [ \"$enabled\" -eq 0 ] && return 0\n    \n    config_get delay \"$cfg\" delay 0\n    if [ \"$delay\" -gt 0 ]; then\n        local uptime=$(awk -F. '{print $1}' /proc/uptime)\n        [ \"$uptime\" -lt 120 ] && sleep \"$delay\"\n    fi\n    \n    init_yaml\n    \n    local args=$(build_args \"$cfg\")\n    \n    procd_open_instance\n    procd_set_param command $PROG $args\n\n    procd_set_param stdout 1\n    procd_set_param stderr 1\n    procd_set_param log_level 7\n    \n    procd_set_param user ddns-go\n    procd_set_param respawn\n    \n    procd_close_instance\n}\n\nstart_service() {\n    config_load \"$NAME\"\n    config_foreach start_instance 'basic'\n}\n\nservice_triggers() {\n    procd_add_reload_trigger \"$NAME\"\n}"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021-2026  sirpdboy  <herboy2008@gmail.com> \n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-ddns-go\nPKG_VERSION:=1.6.8\nPKG_RELEASE:=20260323\n\nPKG_MAINTAINER:=sirpdboy  <herboy2008@gmail.com>\nPKG_CONFIG_DEPENDS:=\n\nLUCI_TITLE:=LuCI Support for Dynamic ddns-go Client\nLUCI_DEPENDS:=+ddns-go\nLUCI_PKGARCH:=all\n\n\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/htdocs/luci-static/resources/view/ddns-go/config.js",
    "content": "/*   Copyright (C) 2022-2026 sirpdboy herboy2008@gmail.com*/\n'use strict';\n'require view';\n'require fs';\n'require ui';\n'require uci';\n'require form';\n'require poll';\n'require rpc';\n\nconst getDDNSGoInfo = rpc.declare({\n    object: 'luci.ddns-go',\n    method: 'get_ver',\n    expect: { 'ver': {} }\n});\n\nconst getUpdateInfo = rpc.declare({\n    object: 'luci.ddns-go',\n    method: 'last_update',\n    expect: { 'update': {} }\n});\n\nconst updateMessageMap = {\n    'Already the latest version': _('Already the latest version'),\n    'New version available': _('New version available'),\n    'Update successful': _('Update successful'),\n    'Download update failed': _('Download update failed'),\n    'Update check failed': _('Update check failed'),\n    'Update status unknown': _('Update status unknown')\n};\n\nasync function checkProcess() {\n    try {\n        const pidofRes = await fs.exec('/bin/pidof', ['ddns-go']);\n        if (pidofRes.code === 0) {\n            return {\n                running: true,\n                pid: pidofRes.stdout.trim()\n            };\n        }\n    } catch (err) {\n    }\n    try {\n        const psRes = await fs.exec('/bin/ps', ['-C', 'ddns-go', '-o', 'pid=']);\n        const pid = psRes.stdout.trim();\n        return {\n            running: pid !== '',\n            pid: pid || null\n        };\n    } catch (err) {\n        return { running: false, pid: null };\n    }\n}\n\nfunction getVersionInfo() {\n    return L.resolveDefault(getDDNSGoInfo(), {}).then(function(result) {\n        return result || {};\n    }).catch(function(error) {\n        console.error('Failed to get version:', error);\n        return {};\n    });\n}\n\nfunction checkUpdateStatus() {\n    return L.resolveDefault(getUpdateInfo(), {}).then(function(result) {\n        return result || {};\n    }).catch(function(error) {\n        console.error('Failed to get update info:', error);\n        return {};\n    });\n}\nfunction extractPortNumber(portValue) {\n    if (!portValue) return '9876';\n    if (portValue.includes(':')) {\n        var parts = portValue.split(':');\n        return parts[parts.length - 1];\n    }\n    return portValue;\n}\n\nfunction renderStatus(isRunning, listen_port, noweb, version) {\n    var statusText = isRunning ? _('RUNNING') : _('NOT RUNNING');\n    var color = isRunning ? 'green' : 'red';\n    var icon = isRunning ? '✓' : '✗';\n    var versionText = version ? `v${version}` : '';\n    \n    var html = String.format(\n        '<em><span style=\"color:%s\">%s <strong>%s %s - %s</strong></span></em>',\n        color, icon, _('DDNS-Go'), versionText, statusText\n    );\n    \n    if (isRunning) {\n        html += String.format('&#160;<a class=\"btn cbi-button\" href=\"http://%s:%s\" target=\"_blank\">%s</a>', \n             window.location.hostname, listen_port, _('Open Web Interface'));\n    }\n    \n    return html;\n}\n\nfunction renderUpdateStatus(updateInfo) {\n    if (!updateInfo || !updateInfo.status) {\n        return '<span style=\"color:orange\"> ⚠ ' + _('Update status unknown') + '</span>';\n    }\n    \n    var status = updateInfo.status;\n    var message = updateInfo.message || '';\n    \n    for (let [en, zh] of Object.entries(updateMessageMap)) {\n        if (message.includes(en)) {\n            message = message.replace(en, zh);\n            break;\n        }\n    }\n    \n    switch(status) {\n        case 'updated':\n            return String.format('<span style=\"color:green\">✓ %s</span>', message);\n        case 'update_available':\n            return String.format('<span style=\"color:blue\">↻ %s</span>', message);\n        case 'latest':\n            return String.format('<span style=\"color:green\">✓ %s</span>', message);\n        case 'download_failed':\n        case 'check_failed':\n            return String.format('<span style=\"color:red\">✗ %s</span>', message);\n        default:\n            return String.format('<span style=\"color:orange\">? %s</span>', message);\n    }\n}\n\nreturn view.extend({\n    load: function() {\n        return Promise.all([\n            uci.load('ddns-go')\n        ]);\n    },\n    \n    handleResetPassword: async function () {\n        try {\n            ui.showModal(_('Resetting Password'), [\n                E('p', { 'class': 'spinning' }, _('Resetting admin username and password, please wait...'))\n            ]);\n            const result = await fs.exec('/usr/bin/ddns-go', ['-resetPassword', 'admin12345', '-c', '/etc/ddns-go/ddns-go-config.yaml']);\n            const configFile = '/etc/ddns-go/ddns-go-config.yaml';\n            const readResult = await fs.read(configFile);\n            if (readResult && readResult.trim() !== '') {\n                let configContent = readResult;\n                configContent = configContent.replace(/(username:\\s*).*/g, '$1admin');\n                \n                if (!configContent.includes('user:')) {\n                    configContent += '\\nuser:\\n    username: admin\\n    password: $2a$10$G1xO1cVUYtSpPYwV/Jk3l.u7PxLUxo03wntWG6VA9BxAftNWfZEhK';\n                }\n                \n                await fs.write(configFile, configContent);\n            }\n\n            ui.hideModal();\n\n            if (result.code === 0) {\n                ui.showModal(_('Username and Password Reset Successful'), [\n                    E('p', _('Username: admin, Password: admin12345')),\n                    E('p', _('You need to restart DDNS-Go service for the changes to take effect.')),\n                    E('div', { 'class': 'right' }, [\n                        E('button', {\n                            'class': 'btn cbi-button cbi-button-positive',\n                            'click': ui.createHandlerFn(this, function() {\n                                ui.hideModal();\n                                this.handleRestartService();\n                            })\n                        }, _('Restart Service Now')),\n                        ' ',\n                        E('button', {\n                            'class': 'btn cbi-button cbi-button-neutral',\n                            'click': ui.hideModal\n                        }, _('Restart Later'))\n                    ])\n                ]);\n            } else {\n                ui.showModal(_('Partial Reset'), [\n                    E('p', _('DDNS-Go command reset may have failed, but configuration file has been updated.')),\n                    E('p', _('Username: admin, Password: admin12345')),\n                    E('p', _('You may need to restart DDNS-Go service manually.')),\n                    E('div', { 'class': 'right' }, [\n                        E('button', {\n                            'class': 'btn cbi-button cbi-button-positive',\n                            'click': ui.createHandlerFn(this, function() {\n                                ui.hideModal();\n                                this.handleRestartService();\n                            })\n                        }, _('Restart Service Now')),\n                        ' ',\n                        E('button', {\n                            'class': 'btn cbi-button cbi-button-neutral',\n                            'click': ui.hideModal\n                        }, _('Close'))\n                    ])\n                ]);\n            }\n            \n        } catch (error) {\n            ui.hideModal();\n            alert(_('ERROR:') + '\\n' + _('Reset username/password failed:') + '\\n' + error.message);\n        }\n    },\n \n    handleRestartService: async function() {\n    try {\n        // const enabledValue = document.querySelector('input[name=\"cfg001c48.enabled\"]')?.checked ? '1' : '0';\n\tconst enabledValue = document.querySelectorAll('input[id=\"widget.cbid.ddns-go.config.enabled\"]')?.checked ? '1' : '0';\n\n        await uci.set('ddns-go', 'config', 'enabled', enabledValue);\n        await uci.save('ddns-go');\n        await uci.apply();\n        \n        await fs.exec('/etc/init.d/ddns-go', ['stop']);\n        await new Promise(resolve => setTimeout(resolve, 1000));\n        \n        if (enabledValue === '1') {\n            await fs.exec('/etc/init.d/ddns-go', ['start']);\n        }\n        \n        alert(_('SUCCESS:') + '\\n' + _('DDNS-Go service restarted successfully'));\n        if (window.statusPoll) {\n            window.statusPoll();\n        }\n    } catch (error) {\n        alert(_('ERROR:') + '\\n' + _('Failed to restart service:') + '\\n' + error.message);\n    }\n    },\n\n    handleUpdate: async function () {\n        try {\n            var updateView = document.getElementById('update_status');\n            if (updateView) {\n                updateView.innerHTML = '<span class=\"spinning\"></span> ' + _('Updating, please wait...');\n            }\n            const updateInfo = await checkUpdateStatus();\n            if (updateView) {\n                updateView.innerHTML = renderUpdateStatus(updateInfo);\n            }\n\n            if (updateInfo.update_successful || updateInfo.status === 'updated') {\n                if (window.statusPoll) {\n                    window.statusPoll();\n                }\n                \n                setTimeout(() => {\n                    var updateView = document.getElementById('update_status');\n                    if (updateView) {\n                        getVersionInfo().then(function(versionInfo) {\n                            var version = versionInfo.version || '';\n                            updateView.innerHTML = String.format('<span style=\"color:green\">✓ %s v%s</span>', \n                                _('Current Version'), version);\n                        });\n                    }\n                }, 3000);\n            }\n\n        } catch (error) {\n            console.error('Update failed:', error);\n            var updateView = document.getElementById('update_status');\n            if (updateView) {\n                updateView.innerHTML = '<span style=\"color:red\">✗ ' + _('Update failed') + '</span>';\n\n                setTimeout(() => {\n                    getVersionInfo().then(function(versionInfo) {\n                        var version = versionInfo.version || '';\n                        updateView.innerHTML = String.format('<span>%s v%s</span>', \n                            _('Current Version'), version);\n                    });\n                }, 5000);\n            }\n        }\n    },\n    \n    render: function(data) {\n        var m, s, o;\n        \n        var portValue = uci.get('ddns-go', 'config', 'port') || '[::]:9876';\n        var listen_port = extractPortNumber(portValue);\n        var noweb = uci.get('ddns-go', 'config', 'noweb') || '0';\n\n        m = new form.Map('ddns-go', _('DDNS-GO'),\n            _('DDNS-GO automatically obtains your public IPv4 or IPv6 address and resolves it to the corresponding domain name service.'));\n\n        s = m.section(form.TypedSection);\n        s.anonymous = true;\n   \n        s.render = function() {\n            var statusView = E('p', { id: 'control_status' }, \n                '<span class=\"spinning\"></span> ' + _('Checking status...'));\n            \n            window.statusPoll = function() {\n                return Promise.all([\n                    checkProcess(),\n                    getVersionInfo()\n                ]).then(function(results) {\n                    var [processInfo, versionInfo] = results;\n                    var version = versionInfo.version || '';\n                    statusView.innerHTML = renderStatus(processInfo.running, listen_port, noweb, version);\n                }).catch(function(err) {\n                    console.error('Status check failed:', err);\n                    statusView.innerHTML = '<span style=\"color:orange\">⚠ ' + _('Status check error') + '</span>';\n                });\n            };\n            \n            poll.add(window.statusPoll, 5);\n            \n            return E('div', { class: 'cbi-section', id: 'status_bar' }, [\n                statusView\n            ]);\n        };\n\n        s = m.section(form.NamedSection, 'config', 'basic');\n\n        o = s.option(form.Flag, 'enabled', _('Enable'));\n        o.default = o.disabled;\n        o.rmempty = false;\n\n        o = s.option(form.Value, 'port', _('Listen port'));\n        o.default = '9876';\n        o.rmempty = false;\n        o.datatype = 'string'; \n        o.description = _('Port number (1-65535)');\n\n        o = s.option(form.Value, 'time', _('Update interval (seconds)'));\n        o.default = '300';\n        o.datatype = 'range(60,86400)'; \n        o.description = _('Update interval in seconds (60-86400)');\n\n        o = s.option(form.Value, 'ctimes', _('Provider comparison interval'));\n        o.default = '5';\n        o.datatype = 'range(1,60)';\n        o.description = _('Number of times to compare with service provider (1-60)');\n\n        o = s.option(form.Value, 'skipverify', _('Skip verifying certificates'));\n        o.default = '0';\n        o.value('0', _('No'));\n        o.value('1', _('Yes'));\n\n        o = s.option(form.Value, 'dns', _('Specify DNS resolution server'));\n        o.value('223.5.5.5', _('Ali DNS 223.5.5.5'));\n        o.value('223.6.6.6', _('Ali DNS 223.6.6.6'));\n        o.value('119.29.29.29', _('Tencent DNS 119.29.29.29'));\n        o.value('1.1.1.1', _('CloudFlare DNS 1.1.1.1'));\n        o.value('8.8.8.8', _('Google DNS 8.8.8.8'));\n        o.value('8.8.4.4', _('Google DNS 8.8.4.4'));\n        o.datatype = 'ipaddr'; \n\n        o = s.option(form.Flag, 'noweb', _('Do not start web services'));\n        o.default = '0';\n        o.rmempty = false;\n\n        o = s.option(form.Value, 'delay', _('Delayed Start (seconds)'));\n        o.default = '60';\n    \n        o = s.option(form.Button, '_newpassword', _('Reset account password'));\n        o.inputtitle = _('Reset');\n        o.inputstyle = 'apply';\n        o.onclick = L.bind(this.handleResetPassword, this, data);\n\n        o = s.option(form.Button, '_update', _('Check Update'));\n        o.inputtitle = _('Check');\n        o.inputstyle = 'apply';\n        o.onclick = L.bind(this.handleUpdate, this, data);\n\n        o = s.option(form.DummyValue, '_update_status', _('Current Version'));\n        o.rawhtml = true;\n        \n        var currentVersion = '';\n\t\n        getVersionInfo().then(function(versionInfo) {\n            currentVersion = versionInfo.version || '';\n            var updateView = document.getElementById('update_status');\n            if (updateView) {\n                updateView.innerHTML = String.format('<span>v%s</span>', currentVersion);\n            }\n        });\n        \n        o.cfgvalue = function() {\n            return E('div', { style: 'margin: 5px 0;' }, [\n                E('span', { id: 'update_status' }, \n                    currentVersion ? String.format('v%s', currentVersion) : _('Loading...'))\n            ]);\n        };\n        \n        return m.render();\n    }\n});"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/htdocs/luci-static/resources/view/ddns-go/ddns-go.js",
    "content": "/*   Copyright (C) 2022-2026 sirpdboy herboy2008@gmail.com */\n\n'use strict';\n'require view';\n'require fs';\n'require ui';\n'require uci';\n'require form';\n'require poll';\n\nreturn view.extend({\n    load: function() {\n        return uci.load('ddns-go');\n    },\n\n    checkRunning: function() {\n        return fs.exec('/bin/pidof', ['ddns-go']).then(function(pidRes) {\n            if (pidRes.code === 0) return { isRunning: true };\n            return fs.exec('/bin/ash', ['-c', 'ps | grep -q \"[d]dns-go\"']).then(function(grepRes) {\n                return { isRunning: grepRes.code === 0 };\n            });\n        });\n    },\nrender: function() {\n    var self = this;\n    \n    return this.checkRunning().then(function(checkResult) {\n        var isRunning = checkResult.isRunning;\n        var port = uci.get('ddns-go', 'config', 'port') || '[::]:9876';\n        var noweb = uci.get('ddns-go', 'config', 'noweb');\n        port = port.split(':').pop();\n        \n        var container = E('div');\n        if (!isRunning || noweb === '1') {\n            if (!isRunning) {\n                var message = _('DDNS-GO Service Not Running');\n            } \n            if (noweb === '1') {\n                var message = _('DDNS-GO Web Interface Disabled');\n            }\n\n            container.appendChild(E('div', { \n                style: 'text-align: center; padding: 2em;' \n            }, [\n                E('img', {\n                    src: 'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMjQiIGhlaWdodD0iMTAyNCIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCI+PHBhdGggZmlsbD0iI2RmMDAwMCIgZD0iTTk0Mi40MjEgMjM0LjYyNGw4MC44MTEtODAuODExLTE1My4wNDUtMTUzLjA0NS04MC44MTEgODAuODExYy03OS45NTctNTEuNjI3LTE3NS4xNDctODEuNTc5LTI3Ny4zNzYtODEuNTc5LTI4Mi43NTIgMC01MTIgMjI5LjI0OC01MTIgNTEyIDAgMTAyLjIyOSAyOS45NTIgMTk3LjQxOSA4MS41NzkgMjc3LjM3NmwtODAuODExIDgwLjgxMSAxNTMuMDQ1IDE1My4wNDUgODAuODExLTgwLjgxMWM3OS45NTcgNTEuNjI3IDE3NS4xNDcgODEuNTc5IDI3Ny4zNzYgODEuNTc5IDI4Mi43NTIgMCA1MTItMjI5LjI0OCA1MTItNTEyIDAtMTAyLjIyOS0yOS45NTItMTk3LjQxOS04MS41NzktMjc3LjM3NnpNMTk0Ljk0NCA1MTJjMC0xNzUuMTA0IDE0MS45NTItMzE3LjA1NiAzMTcuMDU2LTMxNy4wNTYgNDggMCA5My40ODMgMTAuNjY3IDEzNC4yMjkgMjkuNzgxbC00MjEuNTQ3IDQyMS41NDdjLTE5LjA3Mi00MC43ODktMjkuNzM5LTg2LjI3Mi0yOS43MzktMTM0LjI3MnpNNTEyIDgyOS4wNTZjLTQ4IDAtOTMuNDgzLTEwLjY2Ny0xMzQuMjI5LTI5Ljc4MWw0MjEuNTQ3LTQyMS41NDdjMTkuMDcyIDQwLjc4OSAyOS43ODEgODYuMjcyIDI5Ljc4MSAxMzQuMjI5LTAuMDQzIDE3NS4xNDctMTQxLjk5NSAzMTcuMDk5LTMxNy4wOTkgMzE3LjA5OXoiLz48L3N2Zz4=',\n                    style: 'width: 100px; height: 100px; margin-bottom: 1em;'\n                }),\n                E('h2', {}, message)\n            ]));\n        } else {\n            var isHttps = window.location.protocol === 'https:';\n            \n            if (isHttps) {\n                var buttonContainer = E('div', {\n                    style: 'text-align: center; padding: 2em;'\n                }, [\n                    E('h2', {}, _('DDNS-GO Control panel')),\n                    E('p', {}, _('Due to browser security policies, the DDNS-GO interface https cannot be embedded directly.')),\n                    E('a', {\n                        href: 'http://' + window.location.hostname + ':' + port,\n                        target: '_blank',\n                        class: 'cbi-button cbi-button-apply',\n                        style: 'display: inline-block; margin-top: 1em; padding: 10px 20px; font-size: 16px; text-decoration: none; color: white;'\n                    }, _('Open Web Interface')),\n                ]);\n                container.appendChild(buttonContainer);\n            } else {\n                var iframe = E('iframe', {\n                    src: 'http://' + window.location.hostname + ':' + port,\n                    style: 'width: 100%; min-height: 100vh; border: none;'\n                });\n                container.appendChild(iframe);\n            }\n        }\n        \n        poll.add(function() {\n            return self.checkRunning().then(function(checkResult) {\n                var newStatus = checkResult.isRunning;\n                if (newStatus !== isRunning) {\n                    window.location.reload();\n                }\n            });\n        }, 5);\n        \n        poll.start();\n        \n        return container;\n    });\n},\n\n\n    handleSaveApply: null,\n    handleSave: null,\n    handleReset: null\n});"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/htdocs/luci-static/resources/view/ddns-go/log.js",
    "content": "// SPDX-License-Identifier: Apache-2.0\n/*\n * Copyright (C) 2022-2026 sirpdboy <herboy2008@gmail.com>\n */\n'use strict';\n'require dom';\n'require fs';\n'require poll';\n'require uci';\n'require view';\n'require form';\n\nreturn view.extend({\n\trender: function () {\n\t\tvar css = `\n\t\t\t.log-container {\n\t\t\t\tmax-height: 1200px;\n\t\t\t\toverflow-y: auto;\n\t\t\t\tborder-radius: 3px;\n\t\t\t\tmargin-top: 10px;\n\t\t\t\tpadding: 5px;\n\t\t\t\tbackground-color: var(--background-color);\n\t\t\t\tfont-family: monospace;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tborder: 1px solid var(--border-color);\n\t\t\t}\n\t\t\t.log-line {\n\t\t\t\tpadding: 3px 5px;\n\t\t\t\tfont-family: monospace;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tline-height: 1.4;\n\t\t\t\tborder-bottom: 1px solid var(--border-color-light);\n\t\t\t\twhite-space: pre-wrap;\n\t\t\t\tword-break: break-all;\n\t\t\t}\n\t\t\t.log-line:last-child {\n\t\t\t\tborder-bottom: none;\n\t\t\t}\n\t\t\t.log-timestamp {\n\t\t\t\tcolor: #0066cc;\n\t\t\t\tmargin-right: 10px;\n\t\t\t\tfont-weight: bold;\n\t\t\t}\n\t\t\t.log-error {\n\t\t\t\tcolor: #cc0000;\n\t\t\t}\n\t\t\t.log-warning {\n\t\t\t\tcolor: #ff9900;\n\t\t\t}\n\t\t\t.control-buttons {\n\t\t\t\tmargin-bottom: 10px;\n\t\t\t\tdisplay: flex;\n\t\t\t\tgap: 5px;\n\t\t\t}\n\n\t\t`;\n\n\t\tvar log_container = E('div', { \n\t\t\t'class': 'log-container', \n\t\t\t'id': 'log_container',\n\t\t\t'style': 'min-height: 200px;'\n\t\t}, E('div', { 'class': 'log-line' }, _('Loading logs...')));\n\n\n\t\tvar lastLogContent = '';\n\t\tvar lastScrollTop = 0;\n\t\tvar isScrolledToTop = true;\n\n\t\tfunction extractDDNSGoMessage(line) {\n\t\t\tif (!line || !line.includes('ddns-go')) return null;\n\t\t\t\n\t\t\tvar regex = /^(.*?ddns-go.*?):\\s*(.*)$/;\n\t\t\tvar match = line.match(regex);\n\t\t\t\n\t\t\tif (match) {\n\t\t\t\tvar timestampMatch = line.match(/^([A-Z][a-z]{2}\\s+[A-Z][a-z]{2}\\s+\\d{1,2}\\s+\\d{2}:\\d{2}:\\d{2}\\s+\\d{4})/);\n\t\t\t\tif (timestampMatch) {\n\t\t\t\t\treturn {\n\t\t\t\t\t\ttimestamp: timestampMatch[1],\n\t\t\t\t\t\tmessage: match[2]\n\t\t\t\t\t};\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tvar selfTimestampMatch = line.match(/(\\d{4}\\/\\d{2}\\/\\d{2}\\s+\\d{2}:\\d{2}:\\d{2})\\s+(.*)$/);\n\t\t\tif (selfTimestampMatch) {\n\t\t\t\treturn {\n\t\t\t\t\ttimestamp: selfTimestampMatch[1],\n\t\t\t\t\tmessage: selfTimestampMatch[2]\n\t\t\t\t};\n\t\t\t}\n\t\t\t\n\t\t\treturn {\n\t\t\t\ttimestamp: null,\n\t\t\t\tmessage: line\n\t\t\t};\n\t\t}\n\n\t\tfunction formatLogLine(line) {\n\t\t\tif (!line || line.trim() === '') return null;\n\t\t\t\n\t\t\tvar extracted = extractDDNSGoMessage(line);\n\t\t\tif (!extracted) return null;\n\t\t\t\n\t\t\tvar lineClass = ['log-line'];\n\t\t\t\n\t\t\tif (line.includes('err') || line.includes('ERROR') || line.includes('failed')) {\n\t\t\t\tlineClass.push('log-error');\n\t\t\t} else if (line.includes('warn') || line.includes('WARNING')) {\n\t\t\t\tlineClass.push('log-warning');\n\t\t\t}\n\t\t\t\n\t\t\tif (extracted.timestamp) {\n\t\t\t\treturn E('div', { 'class': lineClass.join(' ') }, [\n\t\t\t\t\tE('span', { 'class': 'log-timestamp' }, extracted.timestamp + ' '),\n\t\t\t\t\tE('span', { 'class': 'log-message' }, extracted.message)\n\t\t\t\t]);\n\t\t\t} else {\n\t\t\t\treturn E('div', { 'class': lineClass.join(' ') }, extracted.message);\n\t\t\t}\n\t\t}\n\t\tfunction formatLogContent(logContent) {\n\t\t\tif (!logContent || logContent.trim() === '') {\n\t\t\t\treturn E('div', { 'class': 'log-line' }, _('No ddns-go logs found.'));\n\t\t\t}\n\t\t\t\n\t\t\tvar lines = logContent.split('\\n');\n\t\t\tvar formattedLines = [];\n\t\t\t\n\t\t\tfor (var i = 0; i < lines.length; i++) {\n\t\t\t\tvar line = lines[i].trim();\n\t\t\t\tif (line === '' || line.includes('No ddns-go logs found')) continue;\n\t\t\t\t\n\t\t\t\tvar formattedLine = formatLogLine(line);\n\t\t\t\tif (formattedLine) {\n\t\t\t\t\tformattedLines.push(formattedLine);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tif (formattedLines.length === 0) {\n\t\t\t\treturn E('div', { 'class': 'log-line' }, _('No ddns-go logs found.'));\n\t\t\t}\n\t\t\t\n\t\t\tformattedLines.reverse();\n\t\t\t\n\t\t\treturn E('div', {}, formattedLines);\n\t\t}\n\n\t\tfunction clearLogs(button) {\n\t\t\tbutton.disabled = true;\n\t\t\tbutton.textContent = _('Clearing...');\n\t\t\t\n\t\t\treturn fs.exec('/usr/libexec/ddns-go-call', ['clear_logs'])\n\t\t\t\t.then(function(res) {\n\t\t\t\t\tbutton.textContent = _('Logs cleared!');\n\t\t\t\t\tlastLogContent = '';\n\t\t\t\t\treturn fetchLogs();\n\t\t\t\t})\n\t\t\t\t.catch(function(err) {\n\t\t\t\t\tconsole.error('Clear logs error:', err);\n\t\t\t\t\tbutton.textContent = _('Failed to clear');\n\t\t\t\t})\n\t\t\t\t.finally(function() {\n\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\tbutton.disabled = false;\n\t\t\t\t\t\tbutton.textContent = _('Clear Logs');\n\t\t\t\t\t}, 2000);\n\t\t\t\t});\n\t\t}\n\t\tfunction fetchLogs() {\n\t\t\t\n\t\t\treturn fs.exec('/usr/libexec/ddns-go-call', ['get_logs'])\n\t\t\t\t.then(function(res) {\n\t\t\t\t\tvar logContent = '';\n\t\t\t\t\tif (res === null || res === undefined) {\n\t\t\t\t\t\tlogContent = '';\n\t\t\t\t\t} else if (typeof res === 'string') {\n\t\t\t\t\t\tlogContent = res;\n\t\t\t\t\t} else if (res.stdout !== undefined) {\n\t\t\t\t\t\tlogContent = res.stdout;\n\t\t\t\t\t} else if (res.data !== undefined) {\n\t\t\t\t\t\tlogContent = res.data;\n\t\t\t\t\t} else if (typeof res === 'object') {\n\t\t\t\t\t\tlogContent = JSON.stringify(res);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tlogContent = logContent.trim();\n\t\t\t\t\tvar lineCount = logContent.split('\\n').filter(l => \n\t\t\t\t\t\tl.trim() !== '' && !l.includes('No ddns-go logs found')\n\t\t\t\t\t).length;\n\t\t\t\t\t\n\t\t\t\t\tif (logContent !== lastLogContent) {\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar formattedLog = formatLogContent(logContent);\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar prevScrollHeight = log_container.scrollHeight;\n\t\t\t\t\t\tvar prevScrollTop = log_container.scrollTop;\n\t\t\t\t\t\t\n\t\t\t\t\t\tdom.content(log_container, formattedLog);\n\t\t\t\t\t\tlastLogContent = logContent;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (!isScrolledToTop) {\n\t\t\t\t\t\t\tvar newScrollHeight = log_container.scrollHeight;\n\t\t\t\t\t\t\tvar heightDiff = newScrollHeight - prevScrollHeight;\n\t\t\t\t\t\t\tlog_container.scrollTop = prevScrollTop + heightDiff;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn Promise.resolve();\n\t\t\t\t})\n\t\t\t\t.catch(function(err) {\n\t\t\t\t\tconsole.error('Log fetch error:', err);\n\t\t\t\t\tvar errorMsg = _('Failed to read logs: %s').format(err.message || 'Resource not found');\n\t\t\t\t\tdom.content(log_container, E('div', { 'class': 'log-line log-error' }, errorMsg));\n\t\t\t\t\treturn Promise.reject(err);\n\t\t\t\t});\n\t\t}\n\n\t\tvar clear_button = E('button', {\n\t\t\t'class': 'cbi-button cbi-button-remove',\n\t\t\t'click': function(ev) {\n\t\t\t\tev.preventDefault();\n\t\t\t\tclearLogs(ev.target);\n\t\t\t}\n\t\t}, _('Clear Logs'));\n\n\n\t\tlog_container.addEventListener('scroll', function() {\n\t\t\tlastScrollTop = this.scrollTop;\n\t\t\tisScrolledToTop = this.scrollTop <= 1;\n\t\t});\n\n\t\tsetTimeout(fetchLogs, 200);\n\n\t\tpoll.add(L.bind(function() {\n\t\t\treturn fetchLogs().catch(function(err) {\n\t\t\t\tconsole.error('Poll error:', err);\n\t\t\t});\n\t\t}));\n\n\t\tpoll.start();\n\n\t\treturn E('div', { 'class': 'cbi-map' }, [\n\t\t\tE('style', [css]),\n\t\t\tE('div', { 'class': 'cbi-section' }, [\n\t\t\t\tE('div', { 'class': 'control-buttons' }, [ clear_button]),\n\t\t\t\tlog_container,\n\t\t\t\tE('small', {}, [\n\t\t\t\t\t_('Refresh every 5 seconds.').format(L.env.pollinterval),\n\t\t\t\t])\n\t\t\t])\n\t\t]);\n\t},\n\n\thandleSaveApply: null,\n\thandleSave: null,\n\thandleReset: null\n});"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/po/templates/ddns-go.pot",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Project-Id-Version: ddns-go\\n\"\n\nmsgid \"DDNS-GO\"\nmsgstr \"\"\n\nmsgid \"DDNS-GO automatically obtains your public IPv4 or IPv6 address and resolves it to the corresponding domain name service.\"\nmsgstr \"\"\n\nmsgid \"Enable\"\nmsgstr \"\"\n\nmsgid \"Listen port\"\nmsgstr \"\"\n\nmsgid \"DDNS-GO Service Not Running\"\nmsgstr \"\"\n\nmsgid \"DDNS-GO Web Interface Disabled\"\nmsgstr \"\"\n\nmsgid \"DDNS-GO Control panel\"\nmsgstr \"\"\n\nmsgid \"Update interval(seconds)\"\nmsgstr \"\"\n\nmsgid \"Compare with service provider N times intervals\"\nmsgstr \"\"\n\nmsgid \"Skip verifying certificates\"\nmsgstr \"\"\n\nmsgid \"Specify DNS resolution server\"\nmsgstr \"\"\n\nmsgid \"Do not start web services\"\nmsgstr \"\"\n\nmsgid \"Delayed Start (seconds)\"\nmsgstr \"\"\n\nmsgid \"Reset account password\"\nmsgstr \"\"\n\nmsgid \"Check Update\"\nmsgstr \"\"\n\nmsgid \"Current Version:\"\nmsgstr \"\"\n\nmsgid \"Reset\"\nmsgstr \"\"\n\nmsgid \"RUNNING\"\nmsgstr \"\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"\"\n\nmsgid \"Open Web Interface\"\nmsgstr \"\"\n\nmsgid \"Checking status...\"\nmsgstr \"\"\n\nmsgid \"Status check error\"\nmsgstr \"\"\n\nmsgid \"Already the latest version\"\nmsgstr \"\"\n\nmsgid \"New version available\"\nmsgstr \"\"\n\nmsgid \"Update successful\"\nmsgstr \"\"\n\nmsgid \"Download update failed\"\nmsgstr \"\"\n\nmsgid \"Update check failed\"\nmsgstr \"\"\n\nmsgid \"Update status unknown\"\nmsgstr \"\"\n\nmsgid \"Update failed\"\nmsgstr \"\"\n\nmsgid \"Updating, please wait...\"\nmsgstr \"\"\n\nmsgid \"Loading...\"\nmsgstr \"\"\n\nmsgid \"Unknown\"\nmsgstr \"\"\n\nmsgid \"Failed to load\"\nmsgstr \"\"\n\nmsgid \"Log is clean.\"\nmsgstr \"\"\n\nmsgid \"Clear Logs\"\nmsgstr \"\"\n\nmsgid \"Logs cleared!\"\nmsgstr \"\"\n\nmsgid \"Refresh every 5 seconds.\"\nmsgstr \"\"\n\nmsgid \"No ddns-go logs found\"\nmsgstr \"\"\n\nmsgid \"Resetting Password\"\nmsgstr \"\"\n\nmsgid \"Resetting admin username and password, please wait...\"\nmsgstr \"\"\n\nmsgid \"Username and Password Reset Successful\"\nmsgstr \"\"\n\nmsgid \"Username: admin, Password: admin12345\"\nmsgstr \"\"\n\nmsgid \"You need to restart DDNS-Go service for the changes to take effect.\"\nmsgstr \"\"\n\nmsgid \"Restart Service Now\"\nmsgstr \"\"\n\nmsgid \"Restart Later\"\nmsgstr \"\"\n\nmsgid \"Partial Reset\"\nmsgstr \"\"\n\nmsgid \"DDNS-Go command reset may have failed, but configuration file has been updated.\"\nmsgstr \"\"\n\nmsgid \"You may need to restart DDNS-Go service manually.\"\nmsgstr \"\"\n\nmsgid \"Close\"\nmsgstr \"\"\n\nmsgid \"ERROR:\"\nmsgstr \"\"\n\nmsgid \"Reset username/password failed:\"\nmsgstr \"\"\n\nmsgid \"SUCCESS:\"\nmsgstr \"\"\n\nmsgid \"DDNS-Go service restarted successfully\"\nmsgstr \"\"\n\nmsgid \"Failed to restart service:\"\nmsgstr \"\"\n\nmsgid \"Ali DNS 223.5.5.5\"\nmsgstr \"\"\n\nmsgid \"Ali DNS 223.6.6.6\"\nmsgstr \"\"\n\nmsgid \"Tencent DNS 119.29.29.29\"\nmsgstr \"\"\n\nmsgid \"CloudFlare DNS 1.1.1.1\"\nmsgstr \"\"\n\nmsgid \"Google DNS 8.8.8.8\"\nmsgstr \"\"\n\nmsgid \"Google DNS 8.8.4.4\"\nmsgstr \"\"\n\nmsgid \"Found %d ddns-go entries. Last updated: %s\"\nmsgstr \"\"\n"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/po/zh_Hans/ddns-go.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Project-Id-Version: ddns-go\\n\"\n\nmsgid \"DDNS-GO\"\nmsgstr \"DDNS-GO\"\n\nmsgid \"DDNS-GO automatically obtains your public IPv4 or IPv6 address and resolves it to the corresponding domain name service.\"\nmsgstr \"DDNS-GO 自动获取您的公网 IPv4 或 IPv6 地址，并解析到对应的域名服务。\"\n\nmsgid \"Enable\"\nmsgstr \"启用\"\n\nmsgid \"Listen port\"\nmsgstr \"监听端口\"\n\nmsgid \"DDNS-GO Service Not Running\"\nmsgstr \"DDNS-GO服务未启用\"\n\nmsgid \"DDNS-GO Web Interface Disabled\"\nmsgstr \"DDNS-GO WEB服务禁用\"\n\nmsgid \"DDNS-GO Control panel\"\nmsgstr \"DDNS-GO操作台\"\n\nmsgid \"Update interval (seconds)\"\nmsgstr \"更新间隔（秒）\"\n\nmsgid \"Provider comparison interval\"\nmsgstr \"提供商比较间隔\"\n\nmsgid \"Number of times to compare with service provider (1-60)\"\nmsgstr \"与服务提供商间隔比较的次数（1-60）\"\n\nmsgid \"Skip verifying certificates\"\nmsgstr \"跳过证书验证\"\n\nmsgid \"Specify DNS resolution server\"\nmsgstr \"指定DNS解析服务器\"\n\nmsgid \"Do not start web services\"\nmsgstr \"不启动Web服务\"\n\nmsgid \"Delayed Start (seconds)\"\nmsgstr \"延迟启动（秒）\"\n\nmsgid \"Reset account password\"\nmsgstr \"重置账户密码\"\n\nmsgid \"Check Update\"\nmsgstr \"检查更新\"\n\nmsgid \"Port number (1-65535)\"\nmsgstr \"端口范围(1-65535)\"\n\nmsgid \"Check\"\nmsgstr \"检查\"\n\nmsgid \"Update interval in seconds (60-86400)\"\nmsgstr \"更新间隔范围(60-86400)秒\"\n\nmsgid \"Current Version\"\nmsgstr \"当前版本\"\n\nmsgid \"Reset\"\nmsgstr \"重置\"\n\nmsgid \"RUNNING\"\nmsgstr \"运行中\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\nmsgid \"Open Web Interface\"\nmsgstr \"打开Web界面\"\n\nmsgid \"Checking status...\"\nmsgstr \"检查状态中...\"\n\nmsgid \"Status check error\"\nmsgstr \"状态检查错误\"\n\nmsgid \"Already the latest version\"\nmsgstr \"已是最新版本\"\n\nmsgid \"New version available\"\nmsgstr \"有新版本可用\"\n\nmsgid \"Update successful\"\nmsgstr \"更新成功\"\n\nmsgid \"Download update failed\"\nmsgstr \"下载更新失败\"\n\nmsgid \"Update check failed\"\nmsgstr \"检查更新失败\"\n\nmsgid \"Update status unknown\"\nmsgstr \"更新状态未知\"\n\nmsgid \"Update failed\"\nmsgstr \"更新失败\"\n\nmsgid \"Updating, please wait...\"\nmsgstr \"正在更新，请稍候...\"\n\nmsgid \"Loading...\"\nmsgstr \"加载中...\"\n\nmsgid \"Unknown\"\nmsgstr \"未知\"\n\nmsgid \"Failed to load\"\nmsgstr \"加载失败\"\n\nmsgid \"Log is clean.\"\nmsgstr \"日志清除\"\n\nmsgid \"Clear Logs\"\nmsgstr \"清除日志\"\n\nmsgid \"Logs cleared!\"\nmsgstr \"已清除\"\n\nmsgid \"Refresh every 5 seconds.\"\nmsgstr \"每 5 秒刷新\"\n\nmsgid \"No ddns-go logs found\"\nmsgstr \"没有日志\"\n\nmsgid \"Resetting Password\"\nmsgstr \"重置密码\"\n\nmsgid \"Resetting admin username and password, please wait...\"\nmsgstr \"正在重置管理员用户名和密码，请稍候...\"\n\nmsgid \"Username and Password Reset Successful\"\nmsgstr \"用户名和密码重置成功\"\n\nmsgid \"Username: admin, Password: admin12345\"\nmsgstr \"用户名: admin, 密码: admin12345\"\n\nmsgid \"You need to restart DDNS-Go service for the changes to take effect.\"\nmsgstr \"您需要重启 DDNS-Go 服务以使更改生效。\"\n\nmsgid \"Restart Service Now\"\nmsgstr \"立即重启服务\"\n\nmsgid \"Restart Later\"\nmsgstr \"稍后重启\"\n\nmsgid \"Partial Reset\"\nmsgstr \"部分重置\"\n\nmsgid \"DDNS-Go command reset may have failed, but configuration file has been updated.\"\nmsgstr \"DDNS-Go 命令重置可能失败，但配置文件已更新。\"\n\nmsgid \"You may need to restart DDNS-Go service manually.\"\nmsgstr \"您可能需要手动重启 DDNS-Go 服务。\"\n\nmsgid \"Close\"\nmsgstr \"关闭\"\n\nmsgid \"ERROR:\"\nmsgstr \"错误:\"\n\nmsgid \"Reset username/password failed:\"\nmsgstr \"重置用户名/密码失败:\"\n\nmsgid \"SUCCESS:\"\nmsgstr \"成功:\"\n\nmsgid \"DDNS-Go service restarted successfully\"\nmsgstr \"DDNS-Go 服务重启成功\"\n\nmsgid \"Failed to restart service:\"\nmsgstr \"重启服务失败:\"\n\nmsgid \"Ali DNS 223.5.5.5\"\nmsgstr \"阿里 DNS 223.5.5.5\"\n\nmsgid \"Ali DNS 223.6.6.6\"\nmsgstr \"阿里 DNS 223.6.6.6\"\n\nmsgid \"Tencent DNS 119.29.29.29\"\nmsgstr \"腾讯 DNS 119.29.29.29\"\n\nmsgid \"CloudFlare DNS 1.1.1.1\"\nmsgstr \"CloudFlare DNS 1.1.1.1\"\n\nmsgid \"Google DNS 8.8.8.8\"\nmsgstr \"谷歌 DNS 8.8.8.8\"\n\nmsgid \"Google DNS 8.8.4.4\"\nmsgstr \"谷歌 DNS 8.8.4.4\"\n\nmsgid \"Found %d ddns-go entries. Last updated: %s\"\nmsgstr \"找到 %d ddns-go记录，最近时间: %s\"\n"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/root/etc/uci-defaults/99-luci-ddns-go",
    "content": "#!/bin/sh\n\nchmod +x /usr/share/rpcd/ucode/luci.ddns-go\nchown root:www-data /usr/libexec/ddns-go-call\nchmod 750 /usr/libexec/ddns-go-call\nrm -f /tmp/luci-indexcache\n/etc/init.d/rpcd restart\nexit 0\n"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/root/usr/libexec/ddns-go-call",
    "content": "#!/bin/sh\ncase \"$1\" in\n    \"get_logs\")\n        logread -l 200 2>/dev/null | grep ddns-go || echo \"No ddns-go logs found\"\n        ;;\n    \"clear_logs\")\n        /etc/init.d/log restart >/dev/null 2>&1\n        echo \"Logs cleared\"\n        ;;\nesac\n"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/root/usr/share/luci/menu.d/luci-app-ddns-go.json",
    "content": "{\n    \"admin/services/ddns-go\": {\n\t\t\"title\": \"DDNS-GO\",\n\t\t\"order\": 58,\n\t\t\"action\": {\n\t\t     \"type\": \"firstchild\"\n\t\t},\n\t\t\"depends\": {\n\t\t\t\"acl\": [ \"luci-app-ddns-go\" ],\n\t\t\t\"uci\": { \"ddns-go\": true }\n\t\t}\n    },\n\n    \"admin/services/ddns-go/ddns-go\": {\n         \"title\": \"DDNS-GO Control panel\",\n         \"order\": 10,\n         \"action\": {\n               \"type\": \"view\",\n               \"path\": \"ddns-go/ddns-go\"\n             }\n    },\n    \"admin/services/ddns-go/config\": {\n             \"title\": \"Base Setting\",\n             \"order\": 20,\n             \"action\": {\n               \"type\": \"view\",\n               \"path\": \"ddns-go/config\"\n             }\n    },\n\n    \"admin/services/ddns-go/log\": {\n\t\t\"title\": \"Log\",\n             \"order\": 30,\n             \"action\": {\n               \"type\": \"view\",\n               \"path\": \"ddns-go/log\"\n             }\n    }\n\n}\n"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/root/usr/share/rpcd/acl.d/luci-app-ddns-go.json",
    "content": "{\n\t\"luci-app-ddns-go\": {\n\t\t\"description\": \"Grant UCI access for luci-app-ddns-go\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"ddns-go\" ],\n\t\t\t\"file\": {\n\t\t\t\t\"/etc/init.d/ddns-go\": [ \"exec\" ],\n\t\t\t\t\"/usr/libexec/ddns-go-call\": [ \"exec\" ],\n\t\t\t\t\"/usr/share/rpcd/ucode/luci.ddns-go\": [ \"exec\" ],\n\t\t\t\t\"/bin/pidof\": [ \"exec\" ],\n\t\t\t\t\"/bin/ps\": [ \"exec\" ],\n\t\t\t\t\"/bin/ash\": [ \"exec\" ],\n\t\t\t\t\"/etc/ddns-go/ddns-go-config.yaml\": [ \"read\" ],\n\t\t\t\t\"/var/log/*\": [ \"read\" ],\n\t\t\t\t\"/bin/logread\": [ \"exec\" ]\n\t\t\t},\n\t\t\t\"ubus\": {\n\t\t\t\t\"rc\": [ \"*\" ],\n\t\t\t\t\"service\": [ \"list\" ],\n\t\t\t\t\"luci.ddns-go\": [ \"*\" ],\n\t\t\t\t\"network.interface.*\": [ \"status\" ],\n\t\t\t\t\"network\": [ \"*\" ]\n\t\t\t}\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"ddns-go\" ],\n\t\t\t\"file\": {\n\t\t\t\t\"/etc/ddns-go/ddns-go-config.yaml\": [ \"write\" ]\n\t\t\t},\n\t\t\t\"ubus\": {\n\t\t\t\t\"luci.ddns-go\": [ \"*\" ]\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-ddns-go/luci-app-ddns-go/root/usr/share/rpcd/ucode/luci.ddns-go",
    "content": "#!/usr/bin/ucode\n/*\n * SPDX-License-Identifier: GPL-2.0-only\n *\n * Copyright (C) 2022-2026  sirpdboy  <herboy2008@gmail.com>\n */\n\n'use strict';\n\nimport { access, error, lstat, popen, readfile, writefile } from 'fs';\n\n/* Kanged from ucode/luci */\nfunction shellquote(s) {\n\treturn `'${replace(s, \"'\", \"'\\\\''\")}'`;\n}\nfunction get_current_version() {\n\tif (!access('/usr/bin/ddns-go'))\n\t\treturn null;\n\t\n\tconst fd = popen('/usr/bin/ddns-go -v');\n\tif (fd) {\n\t\tlet version_output = fd.read('all');\n\t\tfd.close();\n\t\t\n\t\tif (!version_output || length(version_output) === 0)\n\t\t\treturn null;\n\t\t\n\t\ttry {\n\t\t\tversion_output = replace(trim(version_output), /^v/, '');\n\t\t\treturn version_output;\n\t\t} catch(e) {\n\t\t\treturn null;\n\t\t}\n\t}\n\treturn null;\n}\n\nconst methods = {\n\tget_ver: {\n\t\tcall: function() {\n\t\t\tlet current_version = get_current_version();\n\t\t\tif (!current_version)\n\t\t\t\treturn { ver: {}, error: 'ddns-go not found or version check failed' };\n\t\t\t\n\t\t\treturn { ver: { version: current_version } };\n\t\t}\n\t},\n\n\tlast_update: {\n\t\tcall: function() {\n\t\t\tif (!access('/usr/bin/ddns-go'))\n\t\t\t\treturn { update: {}, error: 'ddns-go not found' };\n\t\t\tlet version_before = get_current_version();\n\t\t\t\n\t\t\tconst fd = popen('/usr/bin/ddns-go -u');\n\t\t\tif (fd) {\n\t\t\t\tlet output = fd.read('all');\n\t\t\t\tfd.close();\n\t\t\t\t\n\t\t\t\tif (!output || length(output) === 0)\n\t\t\t\t\treturn { update: {}, error: 'empty response' };\n\t\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\toutput = trim(output);\n\t\t\t\t\tlet update_info = {\n\t\t\t\t\t\traw_output: output,\n\t\t\t\t\t\tversion_before: version_before,\n\t\t\t\t\t\tversion_after: null,\n\t\t\t\t\t\thas_update: false,\n\t\t\t\t\t\tupdate_successful: false,\n\t\t\t\t\t\tcurrent_version: '',\n\t\t\t\t\t\tlatest_version: '',\n\t\t\t\t\t\tstatus: 'unknown',\n\t\t\t\t\t\tmessage: output\n\t\t\t\t\t};\n\t\t\t\t\t\n\t\t\t\t\tupdate_info.version_after = get_current_version();\n\t\t\t\t\t\n\t\t\t\t\tif (version_before && update_info.version_after && version_before !== update_info.version_after) {\n\t\t\t\t\t\tupdate_info.update_successful = true;\n\t\t\t\t\t\tupdate_info.has_update = false; \n\t\t\t\t\t\tupdate_info.status = 'updated';\n\t\t\t\t\t\tupdate_info.message = `Update successful: ${version_before} → ${update_info.version_after}`;\n\t\t\t\t\t}\n\t\t\t\t\telse if (match(output, /Current version.*is the latest/)) {\n\t\t\t\t\t\tupdate_info.status = 'latest';\n\t\t\t\t\t\tupdate_info.has_update = false;\n\t\t\t\t\t\tlet version_match = match(output, /v[\\d.]+/);\n\t\t\t\t\t\tif (version_match) {\n\t\t\t\t\t\t\tupdate_info.current_version = replace(version_match[0], /^v/, '');\n\t\t\t\t\t\t\tupdate_info.latest_version = update_info.current_version;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tupdate_info.message = 'Already the latest version ' + (update_info.current_version || '');\n\t\t\t\t\t\t\n\t\t\t\t\t} else if (match(output, /new version.*available/)) {\n\t\t\t\t\t\tupdate_info.status = 'update_available';\n\t\t\t\t\t\tupdate_info.has_update = true;\n\t\t\t\t\t\t\n\t\t\t\t\t\tlet versions = match(output, /v[\\d.]+/, 'g');\n\t\t\t\t\t\tif (versions && length(versions) >= 2) {\n\t\t\t\t\t\t\tupdate_info.current_version = replace(versions[0], /^v/, '');\n\t\t\t\t\t\t\tupdate_info.latest_version = replace(versions[1], /^v/, '');\n\t\t\t\t\t\t} else if (version_before) {\n\t\t\t\t\t\t\tupdate_info.current_version = version_before;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tupdate_info.message = 'New version available: ' + (update_info.latest_version || '');\n\t\t\t\t\t\t\n\t\t\t\t\t} else if (match(output, /download.*failed/)) {\n\t\t\t\t\t\tupdate_info.status = 'download_failed';\n\t\t\t\t\t\tupdate_info.has_update = false;\n\t\t\t\t\t\tupdate_info.message = 'Download update failed';\n\t\t\t\t\t\t\n\t\t\t\t\t} else if (match(output, /check.*failed/)) {\n\t\t\t\t\t\tupdate_info.status = 'check_failed';\n\t\t\t\t\t\tupdate_info.has_update = false;\n\t\t\t\t\t\tupdate_info.message = 'Update check failed';\n\t\t\t\t\t\t\n\t\t\t\t\t} else {\n\t\t\t\t\t\tupdate_info.status = 'unknown';\n\t\t\t\t\t\tupdate_info.message = output;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\treturn { update: update_info };\n\t\t\t\t} catch(e) {\n\t\t\t\t\treturn { update: {}, error: 'Parse error: ' + e };\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn { update: {}, error: 'failed to execute ddns-go command' };\n\t\t\t}\n\t\t}\n\t}\n};\n\nreturn { 'luci.ddns-go': methods };"
  },
  {
    "path": "luci-app-ddnsto/Makefile",
    "content": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for ddnsto\nLUCI_DEPENDS:=+ddnsto +block-mount\nLUCI_PKGARCH:=all\nPKG_VERSION:=3.2.0-r5\nPKG_RELEASE:=\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n\n"
  },
  {
    "path": "luci-app-ddnsto/luasrc/controller/ddnsto.lua",
    "content": "--[[\nDDNSTO LuCI Controller + JSON API\n=================================\n \n----\n为 ddnsto 的 LuCI 页面（可用原生 JS/React/Vue）提供稳定的后端接口：\n1) 读取/更新 UCI 配置：/etc/config/ddnsto\n2) 控制 init.d 服务：/etc/init.d/ddnsto start|stop|restart|reload\n3) 查询运行状态：ddnstod 是否在运行、PID、enabled/token 是否就绪\n4) （可选）读取最近日志：logread 过滤 ddnsto/ddnstod\n\n路由说明\n--------\n默认挂载在：\n/cgi-bin/luci/admin/services/ddnsto/page         -- LuCI 页面入口（模板）\n/cgi-bin/luci/admin/services/ddnsto/api/config   -- GET/POST 配置\n/c.../ddnsto/api/service                         -- POST 服务控制\n/c.../ddnsto/api/status                          -- GET 状态\n/c.../ddnsto/api/logs                            -- GET 日志（可选）\n\nCSRF 说明\n---------\nLuCI 对 POST 通常要求 token 校验。这里提供两种方式（二选一）：\n- Header: X-LuCI-Token: <luci.dispatcher.context.token>\n- Form字段: token=<...>（application/x-www-form-urlencoded 时常用）\n\n对于前端（React）最佳实践是：\n- 在 LuCI 模板里注入 window.ddnstoCsrfToken = \"<%=luci.dispatcher.context.token%>\"\n- 所有 POST 带上该 token\n\n前端对接建议\n------------\n- GET config/status: fetch(url, {credentials: 'same-origin'})\n- POST config/service: JSON body + X-LuCI-Token，或表单 token\n\n开发/调试注意\n------------\n1) 修改 controller 后，LuCI 可能缓存索引：\n   - rm -f /tmp/luci-indexcache\n   - /etc/init.d/uhttpd restart  （或重启设备）\n2) 确保 /etc/config/ddnsto 存在；否则 index() 会直接 return。\n3) 若想扩展更多字段（如 address），建议在 GET 返回里带出，但 POST 仅允许白名单字段写入。\n\n安全边界\n--------\n本接口位于 LuCI admin 路径下，默认需要登录 LuCI。\n此外：\n- service action 做了白名单限制，避免命令注入\n- config 写入做了基本校验（bool/number）\n--]]\n\nmodule(\"luci.controller.ddnsto\", package.seeall)\n\n-- ==========\n-- Utilities\n-- ==========\n\nlocal function write_json(tbl)\n  local http = require \"luci.http\"\n  local jsonc = require \"luci.jsonc\"\n  http.prepare_content(\"application/json\")\n  http.write(jsonc.stringify(tbl))\nend\n\nlocal function bad_request(msg)\n  write_json({ ok = false, error = msg or \"bad request\" })\nend\n\nlocal function method_not_allowed()\n  write_json({ ok = false, error = \"method not allowed\" })\nend\n\nlocal function read_json_body()\n  local http = require \"luci.http\"\n  local jsonc = require \"luci.jsonc\"\n  local ctype = http.getenv(\"CONTENT_TYPE\") or \"\"\n  if not ctype:match(\"^application/json\") then\n    return nil\n  end\n  local raw = http.content() or \"\"\n  if #raw == 0 then\n    return nil\n  end\n  local obj = jsonc.parse(raw)\n  if type(obj) ~= \"table\" then\n    return nil\n  end\n  return obj\nend\n\nlocal function get_command(cmd)\n    local handle = io.popen(cmd, \"r\")\n    if handle then\n        local res = string.gsub(handle:read(\"*a\"), \"\\n\", \"\")   \n        handle:close()\n        return res\n    end\n    return \"\"\n    \nend\n\nlocal function parse_device_id(raw)\n  local cleaned = tostring(raw or \"\")\n  cleaned = cleaned:gsub(\"%s+\", \" \"):gsub(\"^%s+\", \"\"):gsub(\"%s+$\", \"\")\n  if cleaned == \"\" then\n    return \"\"\n  end\n  local _, did = cleaned:match(\"^(%S+)%s+(%S+)$\")\n  return did or cleaned\nend\n\nlocal function normalize_index(index)\n  local idx = index\n  if not (idx and tostring(idx):match(\"^%d+$\")) then\n    idx = \"0\"\n  end\n  return idx\nend\n\nlocal function fetch_device_id(index)\n  local idx = normalize_index(index)\n  local cmd = string.format(\"/usr/sbin/ddnstod -x %s -w\", idx)\n  return parse_device_id(get_command(cmd))\nend\n\nlocal function param(body, key)\n  local http = require \"luci.http\"\n  if type(body) == \"table\" and body[key] ~= nil then\n    return tostring(body[key])\n  end\n  return http.formvalue(key)\nend\n\nlocal function is_bool01(v)\n  return v == \"0\" or v == \"1\"\nend\n\nlocal function is_uint(v)\n  return v ~= nil and tostring(v):match(\"^%d+$\") ~= nil\nend\n\nlocal function is_empty(v)\n  return v == nil or tostring(v):match(\"^%s*$\") ~= nil\nend\n\nlocal function has_space(v)\n  return v ~= nil and tostring(v):find(\"%s\") ~= nil\nend\n\n-- LuCI CSRF Check\nlocal function require_csrf()\n  local http = require \"luci.http\"\n  local disp = require \"luci.dispatcher\"\n  \n  local method = http.getenv(\"REQUEST_METHOD\") or \"\"\n  if method ~= \"POST\" then\n    return true\n  end\n\n  local ctx = disp.context\n  \n  -- 1. Ensure user is authenticated (session exists)\n  if not (ctx and ctx.authsession) then\n     write_json({ ok = false, error = \"auth session missing\" })\n     return false\n  end\n\n  local expected = ctx.token\n  \n  local header_token = http.getenv(\"HTTP_X_LUCI_TOKEN\")\n  local form_token = http.formvalue(\"token\")\n  local body = read_json_body()\n  local body_token = (type(body) == \"table\") and body[\"token\"] or nil\n\n  local provided = header_token or form_token or body_token\n\n  -- 2. If server has a token, enforce strict match\n  if expected then\n    if provided ~= expected then\n      write_json({ ok = false, error = \"bad csrf token\" })\n      return false\n    end\n  else\n    -- 3. If server lost the token (common in some envs), \n    -- just ensure the client sent *something* (e.g. via custom header)\n    -- This protects against basic CSRF because attackers can't easily set custom headers.\n    if not provided or #provided == 0 then\n      write_json({ ok = false, error = \"csrf token missing\" })\n      return false\n    end\n  end\n\n  return true\nend\n\nlocal function ensure_ddnsto_section()\n  local uci = require \"luci.model.uci\".cursor()\n  local sid = nil\n  uci:foreach(\"ddnsto\", \"ddnsto\", function(s) sid = s[\".name\"] end)\n  if not sid then\n    sid = uci:add(\"ddnsto\", \"ddnsto\")\n  end\n  return sid\nend\n\nlocal function read_config()\n  local uci = require \"luci.model.uci\".cursor()\n  local sys = require \"luci.sys\"\n  local cfg = {\n    enabled      = \"1\",\n    token        = \"\",\n    index        = \"0\",\n    logger       = \"0\",\n    feat_enabled = \"0\",\n    feat_port    = \"3033\",\n    feat_username = \"\",\n    feat_password = \"\",\n    feat_disk_path_selected = \"\",\n    address      = \"\",\n    mounts       = {},\n    device_id    = \"\",\n    deviceId     = \"\",\n  }\n\n  uci:foreach(\"ddnsto\", \"ddnsto\", function(s)\n    cfg.enabled      = s.enabled or cfg.enabled\n    cfg.token        = s.token or cfg.token\n    cfg.index        = s.index or cfg.index\n    cfg.logger       = s.logger or cfg.logger\n    cfg.feat_enabled = s.feat_enabled or cfg.feat_enabled\n    cfg.feat_port    = s.feat_port or cfg.feat_port\n    cfg.feat_username = s.feat_username or cfg.feat_username\n    cfg.feat_password = s.feat_password or cfg.feat_password\n    cfg.feat_disk_path_selected = s.feat_disk_path_selected or cfg.feat_disk_path_selected\n    cfg.address      = s.address or cfg.address\n  end)\n\n  do\n    local did = fetch_device_id(cfg.index)\n    cfg.device_id = did\n    cfg.deviceId = did\n  end\n\n  -- Get mounts (via block info)\n  local mounts = {}\n  local block = io.popen(\"/sbin/block info\", \"r\")\n  if block then\n    while true do\n      local ln = block:read(\"*l\")\n      if not ln then break end\n      \n      local dev = ln:match(\"^/dev/(.-):\")\n      if dev then\n        for key, val in ln:gmatch([[(%w+)=\"(.-)\"]]) do\n          if key:lower() == \"mount\" then\n            table.insert(mounts, val)\n          end\n        end\n      end\n    end\n    block:close()\n  end\n  cfg.mounts = mounts\n\n  return cfg\nend\n\n-- ==========\n-- LuCI index\n-- ==========\n\nfunction index()\n  local ok_fs, fs = pcall(require, \"nixio.fs\")\n  if not (ok_fs and fs) then\n    local ok_lfs, lfs = pcall(require, \"luci.fs\")\n    if ok_lfs then fs = lfs end\n  end\n\n  local has_config = true\n  if fs and fs.access then\n    has_config = fs.access(\"/etc/config/ddnsto\")\n  end\n  if has_config == false then return end\n\n  entry({\"admin\", \"services\", \"ddnsto\"}, firstchild(), _(\"DDNSTO 远程控制\"), 60).dependent = false\n  entry({\"admin\", \"services\", \"ddnsto\", \"page\"}, call(\"action_page\"), _(\"Settings\"), 10).leaf = true\n  -- entry({\"admin\", \"ddnsto_dev\"}, call(\"action_ddnsto_dev\"), _(\"DDNSTO (Dev)\"), 99).leaf = true\n  \n  entry({\"admin\", \"services\", \"ddnsto\", \"api\", \"config\"},  call(\"api_config\")).leaf = true\n  entry({\"admin\", \"services\", \"ddnsto\", \"api\", \"service\"}, call(\"api_service\")).leaf = true\n  entry({\"admin\", \"services\", \"ddnsto\", \"api\", \"run\"},     call(\"api_run\")).leaf = true\n  entry({\"admin\", \"services\", \"ddnsto\", \"api\", \"restart\"}, call(\"api_restart\")).leaf = true\n  entry({\"admin\", \"services\", \"ddnsto\", \"api\", \"stop\"},    call(\"api_stop\")).leaf = true\n  entry({\"admin\", \"services\", \"ddnsto\", \"api\", \"onboarding\", \"start\"}, call(\"api_onboarding_start\")).leaf = true\n  entry({\"admin\", \"services\", \"ddnsto\", \"api\", \"onboarding\", \"address\"}, call(\"api_onboarding_address\")).leaf = true\n  entry({\"admin\", \"services\", \"ddnsto\", \"api\", \"connectivity\"},  call(\"api_connectivity\")).leaf = true\n  entry({\"admin\", \"services\", \"ddnsto\", \"api\", \"status\"},  call(\"api_status\")).leaf = true\n  entry({\"admin\", \"services\", \"ddnsto\", \"api\", \"logs\"},    call(\"api_logs\")).leaf = true\nend\n\nfunction action_page()\n  local template = require \"luci.template\"\n  local dsp = require \"luci.dispatcher\"\n  local i18n = require \"luci.i18n\"\n  local ctx = dsp.context or {}\n\n  local data = {\n    token    = ctx.token or \"\",\n    prefix   = dsp.build_url(\"admin\", \"services\", \"ddnsto\"),\n    api_base = dsp.build_url(),\n    lang     = i18n.context.lang or \"zh-cn\"\n  }\n  template.render(\"ddnsto/main\", data)\nend\n\n-- ==========\n-- API: config\n-- ==========\n\nfunction api_config()\n  local http = require \"luci.http\"\n  local uci = require \"luci.model.uci\".cursor()\n  local method = http.getenv(\"REQUEST_METHOD\") or \"\"\n\n  if method == \"GET\" then\n    write_json({ ok = true, data = read_config() })\n    return\n  end\n\n  if method ~= \"POST\" then\n    method_not_allowed()\n    return\n  end\n\n  if not require_csrf() then return end\n\n  local body = read_json_body()\n\n  local enabled      = param(body, \"enabled\")\n  local ddnsto_token = param(body, \"ddnsto_token\")\n\n  local index        = param(body, \"index\")\n  local logger       = param(body, \"logger\")\n  local feat_enabled = param(body, \"feat_enabled\")\n  local feat_port    = param(body, \"feat_port\")\n  local feat_username = param(body, \"feat_username\")\n  local feat_password = param(body, \"feat_password\")\n  local feat_disk_path_selected = param(body, \"feat_disk_path_selected\")\n\n  -- 基本校验（按需扩展）\n  if enabled      and not is_bool01(enabled)      then return bad_request(\"bad enabled\") end\n  if logger       and not is_bool01(logger)       then return bad_request(\"bad logger\") end\n  if feat_enabled and not is_bool01(feat_enabled) then return bad_request(\"bad feat_enabled\") end\n\n  local has_payload = enabled ~= nil or ddnsto_token ~= nil or index ~= nil or logger ~= nil\n    or feat_enabled ~= nil or feat_port ~= nil or feat_username ~= nil or feat_password ~= nil\n    or feat_disk_path_selected ~= nil\n  if not has_payload then\n    return bad_request(\"invalid request\")\n  end\n\n  local enabled_on = enabled == \"1\"\n  local feat_on = feat_enabled == \"1\"\n\n  if enabled_on and is_empty(ddnsto_token) then\n    return bad_request(\"请填写正确用户Token（令牌）\")\n  end\n\n  if ddnsto_token ~= nil and has_space(ddnsto_token) then\n    return bad_request(\"令牌勿包含空格\")\n  end\n\n  if not is_uint(index) then\n    return bad_request(\"请填写正确的设备编号，仅允许数字\")\n  end\n  local index_num = tonumber(index)\n  if index_num < 0 or index_num > 99 then\n    return bad_request(\"请填写正确的设备编号，仅允许数字\")\n  end\n\n  if feat_on then\n    if not is_uint(feat_port) then\n      return bad_request(\"请填写正确的端口\")\n    end\n\n    local port_num = tonumber(feat_port)\n    if not port_num or port_num == 0 or port_num > 65535 then\n      return bad_request(\"请填写正确的端口\")\n    end\n\n    if is_empty(feat_username) then\n      return bad_request(\"请填写授权用户名\")\n    end\n    if has_space(feat_username) then\n      return bad_request(\"用户名请勿包含空格\")\n    end\n    if is_empty(feat_password) then\n      return bad_request(\"请填写授权用户密码\")\n    end\n    if has_space(feat_password) then\n      return bad_request(\"用户密码请勿包含空格\")\n    end\n    if is_empty(feat_disk_path_selected) then\n      return bad_request(\"请填写共享磁盘路径\")\n    end\n  end\n\n  local sid = ensure_ddnsto_section()\n\n  -- 白名单写入：只写我们明确允许前端控制的字段\n  if enabled      then uci:set(\"ddnsto\", sid, \"enabled\", enabled) end\n  if ddnsto_token ~= nil then uci:set(\"ddnsto\", sid, \"token\", ddnsto_token) end\n  if index        then uci:set(\"ddnsto\", sid, \"index\", index) end\n  if logger       then uci:set(\"ddnsto\", sid, \"logger\", logger) end\n  if feat_enabled then uci:set(\"ddnsto\", sid, \"feat_enabled\", feat_enabled) end\n  if feat_port    then uci:set(\"ddnsto\", sid, \"feat_port\", feat_port) end\n  if feat_username then uci:set(\"ddnsto\", sid, \"feat_username\", feat_username) end\n  if feat_password then uci:set(\"ddnsto\", sid, \"feat_password\", feat_password) end\n  if feat_disk_path_selected then uci:set(\"ddnsto\", sid, \"feat_disk_path_selected\", feat_disk_path_selected) end\n\n  uci:commit(\"ddnsto\")\n\n  -- Restart service to apply changes\n  local sys = require \"luci.sys\"\n  sys.call(\"/etc/init.d/ddnsto restart >/dev/null 2>&1\")\n\n  write_json({ ok = true })\nend\n\n-- ==========\n-- API: service\n-- ==========\n\nlocal function run_service_action(action, allow_reload)\n  local http = require \"luci.http\"\n  local sys = require \"luci.sys\"\n  local method = http.getenv(\"REQUEST_METHOD\") or \"\"\n  \n  if method ~= \"POST\" then\n    method_not_allowed()\n    return\n  end\n\n  if not require_csrf() then return end\n\n  if not action then\n    local body = read_json_body()\n    action = param(body, \"action\") or \"\"\n  end\n\n  local allow = {\n    start = true,\n    stop = true,\n    restart = true,\n    reload = allow_reload == true,\n  }\n\n  if not allow[action] then\n    return bad_request(\"bad action\")\n  end\n\n  local cmd = string.format(\"/etc/init.d/ddnsto %s >/dev/null 2>&1\", action)\n  local rc = sys.call(cmd)\n  write_json({ ok = (rc == 0), rc = rc })\nend\n\nfunction api_service()\n  return run_service_action(nil, true)\nend\n\nfunction api_run()\n  return run_service_action(\"start\")\nend\n\nfunction api_restart()\n  return run_service_action(\"restart\")\nend\n\nfunction api_stop()\n  return run_service_action(\"stop\")\nend\n\n-- ==========\n-- API: onboarding helpers\n-- ==========\n\nfunction api_onboarding_start()\n  local http = require \"luci.http\"\n  local uci = require \"luci.model.uci\".cursor()\n  local sys = require \"luci.sys\"\n  local method = http.getenv(\"REQUEST_METHOD\") or \"\"\n\n  if method ~= \"POST\" then\n    method_not_allowed()\n    return\n  end\n\n  if not require_csrf() then return end\n\n  local body = read_json_body()\n  local token = param(body, \"token\")\n\n  if is_empty(token) then\n    return bad_request(\"token required\")\n  end\n  if has_space(token) then\n    return bad_request(\"token must not contain spaces\")\n  end\n\n  local sid = ensure_ddnsto_section()\n  uci:set(\"ddnsto\", sid, \"token\", token)\n  uci:set(\"ddnsto\", sid, \"enabled\", \"1\")\n  uci:set(\"ddnsto\", sid, \"feat_enabled\", \"0\")\n  uci:commit(\"ddnsto\")\n\n  local rc = sys.call(\"/etc/init.d/ddnsto restart >/dev/null 2>&1\")\n  write_json({ ok = (rc == 0), rc = rc })\nend\n\nfunction api_onboarding_address()\n  local http = require \"luci.http\"\n  local uci = require \"luci.model.uci\".cursor()\n  local method = http.getenv(\"REQUEST_METHOD\") or \"\"\n\n  if method ~= \"POST\" then\n    method_not_allowed()\n    return\n  end\n\n  if not require_csrf() then return end\n\n  local body = read_json_body()\n  local url = param(body, \"url\") or param(body, \"address\")\n\n  if is_empty(url) then\n    return bad_request(\"address required\")\n  end\n\n  local sid = ensure_ddnsto_section()\n  uci:set(\"ddnsto\", sid, \"address\", url)\n  uci:commit(\"ddnsto\")\n\n  write_json({ ok = true })\nend\n\n-- ==========\n-- API: status\n-- ==========\n\nfunction api_status()\n  local sys  = require \"luci.sys\"\n  local uci  = require \"luci.model.uci\".cursor()\n  local jsonc = require \"luci.jsonc\"\n\n  local enabled, token = \"0\", \"\"\n  local address, index = \"\", \"0\"\n  uci:foreach(\"ddnsto\", \"ddnsto\", function(s)\n    enabled = s.enabled or \"0\"\n    token   = s.token or \"\"\n    address = s.address or \"\"\n    index   = s.index or index\n  end)\n\n  local raw = sys.exec([[ubus call service list '{\"name\":\"ddnsto\"}' 2>/dev/null]]) or \"\"\n  local pid, running = \"\", false\n\n  local ok, obj = pcall(jsonc.parse, raw)\n  if ok and type(obj) == \"table\" and type(obj.ddnsto) == \"table\" and type(obj.ddnsto.instances) == \"table\" then\n    for _, inst in pairs(obj.ddnsto.instances) do\n      if type(inst) == \"table\" and inst.running == true then\n        running = true\n        pid = tostring(inst.pid or \"\")\n        break\n      end\n    end\n  end\n\n  local board_raw = sys.exec(\"ubus call system board 2>/dev/null\") or \"\"\n  local hostname = \"OpenWrt\"\n  local ok_board, board_obj = pcall(jsonc.parse, board_raw)\n  if ok_board and type(board_obj) == \"table\" and board_obj.hostname then\n    hostname = board_obj.hostname\n  end\n\n  local version = get_command(\"/usr/sbin/ddnstod -v\")\n\n  local did = \"\"\n  do\n    did = fetch_device_id(index)\n  end\n\n  write_json({\n    ok = true,\n    data = {\n      enabled = enabled,\n      running = running,\n      pid = pid,\n      token_set = (token and #token > 0) or false,\n      address = address,\n      device_id = did,\n      deviceId = did,\n      hostname = hostname,\n      version = version,\n    }\n  })\nend\n\n-- ==========\n-- API: connectivity (tunnel server reachability)\n-- ==========\n\nfunction api_connectivity()\n  local sys  = require \"luci.sys\"\n\n  local function resolve_host(host)\n    local out = sys.exec(string.format(\"nslookup %s 223.5.5.5 2>/dev/null\", host)) or \"\"\n    if out == \"\" then\n      out = sys.exec(string.format(\"nslookup %s 8.8.8.8 2>/dev/null\", host)) or \"\"\n    end\n    if out == \"\" then\n      out = sys.exec(string.format(\"nslookup %s 2>/dev/null\", host)) or \"\"\n    end\n    local ip = out:match(\"Address 1:%s*([%d%.]+)\") or out:match(\"Address:%s*([%d%.]+)\")\n    return ip or \"\"\n  end\n\n  local tunnel_targets = {}\n  local resolved_ip = resolve_host(\"tunnel.kooldns.cn\")\n  if resolved_ip ~= \"\" then table.insert(tunnel_targets, resolved_ip) end\n  table.insert(tunnel_targets, \"tunnel.kooldns.cn\")\n  table.insert(tunnel_targets, \"125.39.21.43\")\n\n  do\n    local seen = {}\n    local uniq = {}\n    for _, t in ipairs(tunnel_targets) do\n      if not seen[t] then\n        seen[t] = true\n        table.insert(uniq, t)\n      end\n    end\n    tunnel_targets = uniq\n  end\n\n  local function connect_target(target)\n    local ret = sys.call(string.format(\"ping -c 1 -W 2 %s >/dev/null 2>&1\", target))\n    if ret == 0 then\n      return 0, nil\n    end\n    return ret, string.format(\"ping exit %d to %s\", ret, target)\n  end\n\n  local tunnel_ok = false\n  local tunnel_err = nil\n\n  if #tunnel_targets == 0 then\n    tunnel_err = \"resolve tunnel.kooldns.cn failed\"\n  else\n    for _, target in ipairs(tunnel_targets) do\n      local ret, err = connect_target(target)\n      if ret == 0 then\n        tunnel_ok = true\n        tunnel_err = nil\n        break\n      else\n        tunnel_err = err\n      end\n    end\n  end\n\n  write_json({\n    ok = true,\n    data = {\n      tunnel_ok = tunnel_ok,\n      tunnel_ret = tunnel_ok and nil or tunnel_err,\n      targets = tunnel_targets,\n    }\n  })\nend\n\n-- ==========\n-- API: logs\n-- ==========\n\nfunction api_logs()\n  local http = require \"luci.http\"\n  local sys = require \"luci.sys\"\n  local method = http.getenv(\"REQUEST_METHOD\") or \"\"\n  \n  if method ~= \"GET\" then\n    method_not_allowed()\n    return\n  end\n\n  local lines = tonumber(http.formvalue(\"lines\") or \"200\") or 200\n  if lines < 10 then lines = 10 end\n  if lines > 2000 then lines = 2000 end\n\n  local cmd = string.format(\"logread 2>/dev/null | grep -E 'ddnsto|ddnstod' | tail -n %d\", lines)\n  local out = sys.exec(cmd) or \"\"\n  local arr = {}\n\n  for line in out:gmatch(\"([^\\n]*)\\n?\") do\n    if line and #line > 0 then\n      arr[#arr + 1] = line\n    end\n  end\n\n  write_json({ ok = true, data = { lines = arr, total = #arr } })\nend\n\nfunction action_ddnsto_dev()\n    local dsp    = require \"luci.dispatcher\"\n    local i18n   = require \"luci.i18n\"\n    local template = require \"luci.template\"\n    local ctx    = dsp.context or {}\n\n    local data = {\n        token   = ctx.token or \"\",\n        prefix  = dsp.build_url(\"admin\", \"ddnsto_dev\"),\n        api_base= dsp.build_url(),\n        lang    = i18n.context.lang or \"zh-cn\"\n    }\n\n    template.render(\"ddnsto/dev\", data)\nend\n"
  },
  {
    "path": "luci-app-ddnsto/luasrc/model/cbi/ddnsto.lua",
    "content": "--wulishui <wulishui@gmail.com> ,20200911\n--jjm2473 <jjm2473@gmail.com> ,20210127\n\nlocal m, s\n\nm = Map(\"ddnsto\", translate(\"DDNS.to\"), translate(\"DDNS.to is a reverse proxy.\")\n\t.. \" <a href=\\\"https://www.ddnsto.com/\\\" onclick=\\\"void(0)\\\" target=\\\"_blank\\\">\"\n\t.. translate(\"Official Website\")\n\t.. \"</a>\")\n\nm:section(SimpleSection).template  = \"ddnsto_status\"\n\ns=m:section(TypedSection, \"ddnsto\", translate(\"Global settings\"))\ns.addremove=false\ns.anonymous=true\n\ns:option(Flag, \"enabled\", translate(\"Enable\")).rmempty=false\n\ns:option(Value, \"token\", translate(\"Token\")).rmempty=false\n\nreturn m\n\n\n"
  },
  {
    "path": "luci-app-ddnsto/luasrc/view/ddnsto/main.htm",
    "content": "<%+header%>\n<script>\n  (function () {\n    window.ddnstoConfig = {\n      token: \"<%=token or ''%>\",\n      prefix: \"<%=prefix or '/cgi-bin/luci/admin/services/ddnsto'%>\",\n      api_base: \"<%=api_base or '/cgi-bin/luci'%>\",\n      lang: \"<%=lang or 'zh-cn'%>\"\n    };\n\n  })();\n</script>\n\n<div class=\"ddnsto-host\">\n  <div id=\"app\" class=\"ddnsto-root\" data-ddnsto-shadow></div>\n</div>\n\n<% local cache_bust = os.time() %>\n<script type=\"module\" crossorigin src=\"/luci-static/ddnsto/index.js?v=<%=cache_bust%>\"></script>\n<%+footer%>\n"
  },
  {
    "path": "luci-app-ddnsto/po/zh_Hans/ddnsto.po",
    "content": "msgid \"DDNS.to\"\nmsgstr \"DDNS.to内网穿透\"\n\nmsgid \"Running state\"\nmsgstr \"运行状态\"\n\nmsgid \"Click to open DDNS.to\"\nmsgstr \"点击打开DDNSTO控制台\"\n\nmsgid \"DDNS.to is a reverse proxy.\"\nmsgstr \"DDNS.to是一个内网穿透工具。\"\n\nmsgid \"Official Website\"\nmsgstr \"官网\"\n\nmsgid \"Token\"\nmsgstr \"令牌\"\n\nmsgid \"The DDNS.to service is running.\"\nmsgstr \"DDNS.to服务已启动\"\n\nmsgid \"The DDNS.to service is not running.\"\nmsgstr \"DDNS.to服务未启动\"\n\nmsgid \"DDNS.to Status\"\nmsgstr \"DDNS.to服务状态\"\n\nmsgid \"Collecting data...\"\nmsgstr \"收集数据...\"\n\nmsgid \"Global settings\"\nmsgstr \"全局设置\"\n"
  },
  {
    "path": "luci-app-ddnsto/root/etc/uci-defaults/50_luci-ddnsto",
    "content": "#!/bin/sh\n\nrm -f /tmp/luci-indexcache /tmp/luci-indexcache.*\nexit 0\n"
  },
  {
    "path": "luci-app-ddnsto/root/www/luci-static/ddnsto/index.js",
    "content": "(function(){const E=document.createElement(\"link\").relList;if(E&&E.supports&&E.supports(\"modulepreload\"))return;for(const T of document.querySelectorAll('link[rel=\"modulepreload\"]'))U(T);new MutationObserver(T=>{for(const L of T)if(L.type===\"childList\")for(const B of L.addedNodes)B.tagName===\"LINK\"&&B.rel===\"modulepreload\"&&U(B)}).observe(document,{childList:!0,subtree:!0});function d(T){const L={};return T.integrity&&(L.integrity=T.integrity),T.referrerPolicy&&(L.referrerPolicy=T.referrerPolicy),T.crossOrigin===\"use-credentials\"?L.credentials=\"include\":T.crossOrigin===\"anonymous\"?L.credentials=\"omit\":L.credentials=\"same-origin\",L}function U(T){if(T.ep)return;T.ep=!0;const L=d(T);fetch(T.href,L)}})();function Vd(y){return y&&y.__esModule&&Object.prototype.hasOwnProperty.call(y,\"default\")?y.default:y}var Mi={exports:{}},Nr={},Oi={exports:{}},J={};/**\n * @license React\n * react.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */var Iu;function Wd(){if(Iu)return J;Iu=1;var y=Symbol.for(\"react.element\"),E=Symbol.for(\"react.portal\"),d=Symbol.for(\"react.fragment\"),U=Symbol.for(\"react.strict_mode\"),T=Symbol.for(\"react.profiler\"),L=Symbol.for(\"react.provider\"),B=Symbol.for(\"react.context\"),G=Symbol.for(\"react.forward_ref\"),A=Symbol.for(\"react.suspense\"),Q=Symbol.for(\"react.memo\"),Z=Symbol.for(\"react.lazy\"),W=Symbol.iterator;function H(u){return u===null||typeof u!=\"object\"?null:(u=W&&u[W]||u[\"@@iterator\"],typeof u==\"function\"?u:null)}var q={isMounted:function(){return!1},enqueueForceUpdate:function(){},enqueueReplaceState:function(){},enqueueSetState:function(){}},ae=Object.assign,V={};function Y(u,v,M){this.props=u,this.context=v,this.refs=V,this.updater=M||q}Y.prototype.isReactComponent={},Y.prototype.setState=function(u,v){if(typeof u!=\"object\"&&typeof u!=\"function\"&&u!=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,u,v,\"setState\")},Y.prototype.forceUpdate=function(u){this.updater.enqueueForceUpdate(this,u,\"forceUpdate\")};function we(){}we.prototype=Y.prototype;function ze(u,v,M){this.props=u,this.context=v,this.refs=V,this.updater=M||q}var ke=ze.prototype=new we;ke.constructor=ze,ae(ke,Y.prototype),ke.isPureReactComponent=!0;var fe=Array.isArray,Ce=Object.prototype.hasOwnProperty,K={current:null},Re={key:!0,ref:!0,__self:!0,__source:!0};function he(u,v,M){var b,X={},O=null,re=null;if(v!=null)for(b in v.ref!==void 0&&(re=v.ref),v.key!==void 0&&(O=\"\"+v.key),v)Ce.call(v,b)&&!Re.hasOwnProperty(b)&&(X[b]=v[b]);var ee=arguments.length-2;if(ee===1)X.children=M;else if(1<ee){for(var oe=Array(ee),Ue=0;Ue<ee;Ue++)oe[Ue]=arguments[Ue+2];X.children=oe}if(u&&u.defaultProps)for(b in ee=u.defaultProps,ee)X[b]===void 0&&(X[b]=ee[b]);return{$$typeof:y,type:u,key:O,ref:re,props:X,_owner:K.current}}function xe(u,v){return{$$typeof:y,type:u.type,key:v,ref:u.ref,props:u.props,_owner:u._owner}}function ue(u){return typeof u==\"object\"&&u!==null&&u.$$typeof===y}function Qe(u){var v={\"=\":\"=0\",\":\":\"=2\"};return\"$\"+u.replace(/[=:]/g,function(M){return v[M]})}var Le=/\\/+/g;function me(u,v){return typeof u==\"object\"&&u!==null&&u.key!=null?Qe(\"\"+u.key):v.toString(36)}function ge(u,v,M,b,X){var O=typeof u;(O===\"undefined\"||O===\"boolean\")&&(u=null);var re=!1;if(u===null)re=!0;else switch(O){case\"string\":case\"number\":re=!0;break;case\"object\":switch(u.$$typeof){case y:case E:re=!0}}if(re)return re=u,X=X(re),u=b===\"\"?\".\"+me(re,0):b,fe(X)?(M=\"\",u!=null&&(M=u.replace(Le,\"$&/\")+\"/\"),ge(X,v,M,\"\",function(Ue){return Ue})):X!=null&&(ue(X)&&(X=xe(X,M+(!X.key||re&&re.key===X.key?\"\":(\"\"+X.key).replace(Le,\"$&/\")+\"/\")+u)),v.push(X)),1;if(re=0,b=b===\"\"?\".\":b+\":\",fe(u))for(var ee=0;ee<u.length;ee++){O=u[ee];var oe=b+me(O,ee);re+=ge(O,v,M,oe,X)}else if(oe=H(u),typeof oe==\"function\")for(u=oe.call(u),ee=0;!(O=u.next()).done;)O=O.value,oe=b+me(O,ee++),re+=ge(O,v,M,oe,X);else if(O===\"object\")throw v=String(u),Error(\"Objects are not valid as a React child (found: \"+(v===\"[object Object]\"?\"object with keys {\"+Object.keys(u).join(\", \")+\"}\":v)+\"). If you meant to render a collection of children, use an array instead.\");return re}function Ie(u,v,M){if(u==null)return u;var b=[],X=0;return ge(u,b,\"\",\"\",function(O){return v.call(M,O,X++)}),b}function Ne(u){if(u._status===-1){var v=u._result;v=v(),v.then(function(M){(u._status===0||u._status===-1)&&(u._status=1,u._result=M)},function(M){(u._status===0||u._status===-1)&&(u._status=2,u._result=M)}),u._status===-1&&(u._status=0,u._result=v)}if(u._status===1)return u._result.default;throw u._result}var ie={current:null},x={transition:null},I={ReactCurrentDispatcher:ie,ReactCurrentBatchConfig:x,ReactCurrentOwner:K};function g(){throw Error(\"act(...) is not supported in production builds of React.\")}return J.Children={map:Ie,forEach:function(u,v,M){Ie(u,function(){v.apply(this,arguments)},M)},count:function(u){var v=0;return Ie(u,function(){v++}),v},toArray:function(u){return Ie(u,function(v){return v})||[]},only:function(u){if(!ue(u))throw Error(\"React.Children.only expected to receive a single React element child.\");return u}},J.Component=Y,J.Fragment=d,J.Profiler=T,J.PureComponent=ze,J.StrictMode=U,J.Suspense=A,J.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=I,J.act=g,J.cloneElement=function(u,v,M){if(u==null)throw Error(\"React.cloneElement(...): The argument must be a React element, but you passed \"+u+\".\");var b=ae({},u.props),X=u.key,O=u.ref,re=u._owner;if(v!=null){if(v.ref!==void 0&&(O=v.ref,re=K.current),v.key!==void 0&&(X=\"\"+v.key),u.type&&u.type.defaultProps)var ee=u.type.defaultProps;for(oe in v)Ce.call(v,oe)&&!Re.hasOwnProperty(oe)&&(b[oe]=v[oe]===void 0&&ee!==void 0?ee[oe]:v[oe])}var oe=arguments.length-2;if(oe===1)b.children=M;else if(1<oe){ee=Array(oe);for(var Ue=0;Ue<oe;Ue++)ee[Ue]=arguments[Ue+2];b.children=ee}return{$$typeof:y,type:u.type,key:X,ref:O,props:b,_owner:re}},J.createContext=function(u){return u={$$typeof:B,_currentValue:u,_currentValue2:u,_threadCount:0,Provider:null,Consumer:null,_defaultValue:null,_globalName:null},u.Provider={$$typeof:L,_context:u},u.Consumer=u},J.createElement=he,J.createFactory=function(u){var v=he.bind(null,u);return v.type=u,v},J.createRef=function(){return{current:null}},J.forwardRef=function(u){return{$$typeof:G,render:u}},J.isValidElement=ue,J.lazy=function(u){return{$$typeof:Z,_payload:{_status:-1,_result:u},_init:Ne}},J.memo=function(u,v){return{$$typeof:Q,type:u,compare:v===void 0?null:v}},J.startTransition=function(u){var v=x.transition;x.transition={};try{u()}finally{x.transition=v}},J.unstable_act=g,J.useCallback=function(u,v){return ie.current.useCallback(u,v)},J.useContext=function(u){return ie.current.useContext(u)},J.useDebugValue=function(){},J.useDeferredValue=function(u){return ie.current.useDeferredValue(u)},J.useEffect=function(u,v){return ie.current.useEffect(u,v)},J.useId=function(){return ie.current.useId()},J.useImperativeHandle=function(u,v,M){return ie.current.useImperativeHandle(u,v,M)},J.useInsertionEffect=function(u,v){return ie.current.useInsertionEffect(u,v)},J.useLayoutEffect=function(u,v){return ie.current.useLayoutEffect(u,v)},J.useMemo=function(u,v){return ie.current.useMemo(u,v)},J.useReducer=function(u,v,M){return ie.current.useReducer(u,v,M)},J.useRef=function(u){return ie.current.useRef(u)},J.useState=function(u){return ie.current.useState(u)},J.useSyncExternalStore=function(u,v,M){return ie.current.useSyncExternalStore(u,v,M)},J.useTransition=function(){return ie.current.useTransition()},J.version=\"18.3.1\",J}var Mu;function Ai(){return Mu||(Mu=1,Oi.exports=Wd()),Oi.exports}/**\n * @license React\n * react-jsx-runtime.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */var Ou;function Bd(){if(Ou)return Nr;Ou=1;var y=Ai(),E=Symbol.for(\"react.element\"),d=Symbol.for(\"react.fragment\"),U=Object.prototype.hasOwnProperty,T=y.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED.ReactCurrentOwner,L={key:!0,ref:!0,__self:!0,__source:!0};function B(G,A,Q){var Z,W={},H=null,q=null;Q!==void 0&&(H=\"\"+Q),A.key!==void 0&&(H=\"\"+A.key),A.ref!==void 0&&(q=A.ref);for(Z in A)U.call(A,Z)&&!L.hasOwnProperty(Z)&&(W[Z]=A[Z]);if(G&&G.defaultProps)for(Z in A=G.defaultProps,A)W[Z]===void 0&&(W[Z]=A[Z]);return{$$typeof:E,type:G,key:H,ref:q,props:W,_owner:T.current}}return Nr.Fragment=d,Nr.jsx=B,Nr.jsxs=B,Nr}var Du;function Qd(){return Du||(Du=1,Mi.exports=Bd()),Mi.exports}var m=Qd(),C=Ai();const Kd=Vd(C);var Fl={},Di={exports:{}},Je={},Fi={exports:{}},bi={};/**\n * @license React\n * scheduler.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */var Fu;function Yd(){return Fu||(Fu=1,(function(y){function E(x,I){var g=x.length;x.push(I);e:for(;0<g;){var u=g-1>>>1,v=x[u];if(0<T(v,I))x[u]=I,x[g]=v,g=u;else break e}}function d(x){return x.length===0?null:x[0]}function U(x){if(x.length===0)return null;var I=x[0],g=x.pop();if(g!==I){x[0]=g;e:for(var u=0,v=x.length,M=v>>>1;u<M;){var b=2*(u+1)-1,X=x[b],O=b+1,re=x[O];if(0>T(X,g))O<v&&0>T(re,X)?(x[u]=re,x[O]=g,u=O):(x[u]=X,x[b]=g,u=b);else if(O<v&&0>T(re,g))x[u]=re,x[O]=g,u=O;else break e}}return I}function T(x,I){var g=x.sortIndex-I.sortIndex;return g!==0?g:x.id-I.id}if(typeof performance==\"object\"&&typeof performance.now==\"function\"){var L=performance;y.unstable_now=function(){return L.now()}}else{var B=Date,G=B.now();y.unstable_now=function(){return B.now()-G}}var A=[],Q=[],Z=1,W=null,H=3,q=!1,ae=!1,V=!1,Y=typeof setTimeout==\"function\"?setTimeout:null,we=typeof clearTimeout==\"function\"?clearTimeout:null,ze=typeof setImmediate<\"u\"?setImmediate:null;typeof navigator<\"u\"&&navigator.scheduling!==void 0&&navigator.scheduling.isInputPending!==void 0&&navigator.scheduling.isInputPending.bind(navigator.scheduling);function ke(x){for(var I=d(Q);I!==null;){if(I.callback===null)U(Q);else if(I.startTime<=x)U(Q),I.sortIndex=I.expirationTime,E(A,I);else break;I=d(Q)}}function fe(x){if(V=!1,ke(x),!ae)if(d(A)!==null)ae=!0,Ne(Ce);else{var I=d(Q);I!==null&&ie(fe,I.startTime-x)}}function Ce(x,I){ae=!1,V&&(V=!1,we(he),he=-1),q=!0;var g=H;try{for(ke(I),W=d(A);W!==null&&(!(W.expirationTime>I)||x&&!Qe());){var u=W.callback;if(typeof u==\"function\"){W.callback=null,H=W.priorityLevel;var v=u(W.expirationTime<=I);I=y.unstable_now(),typeof v==\"function\"?W.callback=v:W===d(A)&&U(A),ke(I)}else U(A);W=d(A)}if(W!==null)var M=!0;else{var b=d(Q);b!==null&&ie(fe,b.startTime-I),M=!1}return M}finally{W=null,H=g,q=!1}}var K=!1,Re=null,he=-1,xe=5,ue=-1;function Qe(){return!(y.unstable_now()-ue<xe)}function Le(){if(Re!==null){var x=y.unstable_now();ue=x;var I=!0;try{I=Re(!0,x)}finally{I?me():(K=!1,Re=null)}}else K=!1}var me;if(typeof ze==\"function\")me=function(){ze(Le)};else if(typeof MessageChannel<\"u\"){var ge=new MessageChannel,Ie=ge.port2;ge.port1.onmessage=Le,me=function(){Ie.postMessage(null)}}else me=function(){Y(Le,0)};function Ne(x){Re=x,K||(K=!0,me())}function ie(x,I){he=Y(function(){x(y.unstable_now())},I)}y.unstable_IdlePriority=5,y.unstable_ImmediatePriority=1,y.unstable_LowPriority=4,y.unstable_NormalPriority=3,y.unstable_Profiling=null,y.unstable_UserBlockingPriority=2,y.unstable_cancelCallback=function(x){x.callback=null},y.unstable_continueExecution=function(){ae||q||(ae=!0,Ne(Ce))},y.unstable_forceFrameRate=function(x){0>x||125<x?console.error(\"forceFrameRate takes a positive int between 0 and 125, forcing frame rates higher than 125 fps is not supported\"):xe=0<x?Math.floor(1e3/x):5},y.unstable_getCurrentPriorityLevel=function(){return H},y.unstable_getFirstCallbackNode=function(){return d(A)},y.unstable_next=function(x){switch(H){case 1:case 2:case 3:var I=3;break;default:I=H}var g=H;H=I;try{return x()}finally{H=g}},y.unstable_pauseExecution=function(){},y.unstable_requestPaint=function(){},y.unstable_runWithPriority=function(x,I){switch(x){case 1:case 2:case 3:case 4:case 5:break;default:x=3}var g=H;H=x;try{return I()}finally{H=g}},y.unstable_scheduleCallback=function(x,I,g){var u=y.unstable_now();switch(typeof g==\"object\"&&g!==null?(g=g.delay,g=typeof g==\"number\"&&0<g?u+g:u):g=u,x){case 1:var v=-1;break;case 2:v=250;break;case 5:v=1073741823;break;case 4:v=1e4;break;default:v=5e3}return v=g+v,x={id:Z++,callback:I,priorityLevel:x,startTime:g,expirationTime:v,sortIndex:-1},g>u?(x.sortIndex=g,E(Q,x),d(A)===null&&x===d(Q)&&(V?(we(he),he=-1):V=!0,ie(fe,g-u))):(x.sortIndex=v,E(A,x),ae||q||(ae=!0,Ne(Ce))),x},y.unstable_shouldYield=Qe,y.unstable_wrapCallback=function(x){var I=H;return function(){var g=H;H=I;try{return x.apply(this,arguments)}finally{H=g}}}})(bi)),bi}var bu;function Xd(){return bu||(bu=1,Fi.exports=Yd()),Fi.exports}/**\n * @license React\n * react-dom.production.min.js\n *\n * Copyright (c) Facebook, Inc. and its affiliates.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE file in the root directory of this source tree.\n */var Uu;function Gd(){if(Uu)return Je;Uu=1;var y=Ai(),E=Xd();function d(e){for(var t=\"https://reactjs.org/docs/error-decoder.html?invariant=\"+e,n=1;n<arguments.length;n++)t+=\"&args[]=\"+encodeURIComponent(arguments[n]);return\"Minified React error #\"+e+\"; visit \"+t+\" for the full message or use the non-minified dev environment for full errors and additional helpful warnings.\"}var U=new Set,T={};function L(e,t){B(e,t),B(e+\"Capture\",t)}function B(e,t){for(T[e]=t,e=0;e<t.length;e++)U.add(t[e])}var G=!(typeof window>\"u\"||typeof window.document>\"u\"||typeof window.document.createElement>\"u\"),A=Object.prototype.hasOwnProperty,Q=/^[: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]*$/,Z={},W={};function H(e){return A.call(W,e)?!0:A.call(Z,e)?!1:Q.test(e)?W[e]=!0:(Z[e]=!0,!1)}function q(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 ae(e,t,n,r){if(t===null||typeof t>\"u\"||q(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 V(e,t,n,r,l,o,i){this.acceptsBooleans=t===2||t===3||t===4,this.attributeName=r,this.attributeNamespace=l,this.mustUseProperty=n,this.propertyName=e,this.type=t,this.sanitizeURL=o,this.removeEmptyString=i}var Y={};\"children dangerouslySetInnerHTML defaultValue defaultChecked innerHTML suppressContentEditableWarning suppressHydrationWarning style\".split(\" \").forEach(function(e){Y[e]=new V(e,0,!1,e,null,!1,!1)}),[[\"acceptCharset\",\"accept-charset\"],[\"className\",\"class\"],[\"htmlFor\",\"for\"],[\"httpEquiv\",\"http-equiv\"]].forEach(function(e){var t=e[0];Y[t]=new V(t,1,!1,e[1],null,!1,!1)}),[\"contentEditable\",\"draggable\",\"spellCheck\",\"value\"].forEach(function(e){Y[e]=new V(e,2,!1,e.toLowerCase(),null,!1,!1)}),[\"autoReverse\",\"externalResourcesRequired\",\"focusable\",\"preserveAlpha\"].forEach(function(e){Y[e]=new V(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){Y[e]=new V(e,3,!1,e.toLowerCase(),null,!1,!1)}),[\"checked\",\"multiple\",\"muted\",\"selected\"].forEach(function(e){Y[e]=new V(e,3,!0,e,null,!1,!1)}),[\"capture\",\"download\"].forEach(function(e){Y[e]=new V(e,4,!1,e,null,!1,!1)}),[\"cols\",\"rows\",\"size\",\"span\"].forEach(function(e){Y[e]=new V(e,6,!1,e,null,!1,!1)}),[\"rowSpan\",\"start\"].forEach(function(e){Y[e]=new V(e,5,!1,e.toLowerCase(),null,!1,!1)});var we=/[\\-:]([a-z])/g;function ze(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(we,ze);Y[t]=new V(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(we,ze);Y[t]=new V(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(we,ze);Y[t]=new V(t,1,!1,e,\"http://www.w3.org/XML/1998/namespace\",!1,!1)}),[\"tabIndex\",\"crossOrigin\"].forEach(function(e){Y[e]=new V(e,1,!1,e.toLowerCase(),null,!1,!1)}),Y.xlinkHref=new V(\"xlinkHref\",1,!1,\"xlink:href\",\"http://www.w3.org/1999/xlink\",!0,!1),[\"src\",\"href\",\"action\",\"formAction\"].forEach(function(e){Y[e]=new V(e,1,!1,e.toLowerCase(),null,!0,!0)});function ke(e,t,n,r){var l=Y.hasOwnProperty(t)?Y[t]:null;(l!==null?l.type!==0:r||!(2<t.length)||t[0]!==\"o\"&&t[0]!==\"O\"||t[1]!==\"n\"&&t[1]!==\"N\")&&(ae(t,n,l,r)&&(n=null),r||l===null?H(t)&&(n===null?e.removeAttribute(t):e.setAttribute(t,\"\"+n)):l.mustUseProperty?e[l.propertyName]=n===null?l.type===3?!1:\"\":n:(t=l.attributeName,r=l.attributeNamespace,n===null?e.removeAttribute(t):(l=l.type,n=l===3||l===4&&n===!0?\"\":\"\"+n,r?e.setAttributeNS(r,t,n):e.setAttribute(t,n))))}var fe=y.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED,Ce=Symbol.for(\"react.element\"),K=Symbol.for(\"react.portal\"),Re=Symbol.for(\"react.fragment\"),he=Symbol.for(\"react.strict_mode\"),xe=Symbol.for(\"react.profiler\"),ue=Symbol.for(\"react.provider\"),Qe=Symbol.for(\"react.context\"),Le=Symbol.for(\"react.forward_ref\"),me=Symbol.for(\"react.suspense\"),ge=Symbol.for(\"react.suspense_list\"),Ie=Symbol.for(\"react.memo\"),Ne=Symbol.for(\"react.lazy\"),ie=Symbol.for(\"react.offscreen\"),x=Symbol.iterator;function I(e){return e===null||typeof e!=\"object\"?null:(e=x&&e[x]||e[\"@@iterator\"],typeof e==\"function\"?e:null)}var g=Object.assign,u;function v(e){if(u===void 0)try{throw Error()}catch(n){var t=n.stack.trim().match(/\\n( *(at )?)/);u=t&&t[1]||\"\"}return`\n`+u+e}var M=!1;function b(e,t){if(!e||M)return\"\";M=!0;var n=Error.prepareStackTrace;Error.prepareStackTrace=void 0;try{if(t)if(t=function(){throw Error()},Object.defineProperty(t.prototype,\"props\",{set:function(){throw Error()}}),typeof Reflect==\"object\"&&Reflect.construct){try{Reflect.construct(t,[])}catch(h){var r=h}Reflect.construct(e,[],t)}else{try{t.call()}catch(h){r=h}e.call(t.prototype)}else{try{throw Error()}catch(h){r=h}e()}}catch(h){if(h&&r&&typeof h.stack==\"string\"){for(var l=h.stack.split(`\n`),o=r.stack.split(`\n`),i=l.length-1,a=o.length-1;1<=i&&0<=a&&l[i]!==o[a];)a--;for(;1<=i&&0<=a;i--,a--)if(l[i]!==o[a]){if(i!==1||a!==1)do if(i--,a--,0>a||l[i]!==o[a]){var s=`\n`+l[i].replace(\" at new \",\" at \");return e.displayName&&s.includes(\"<anonymous>\")&&(s=s.replace(\"<anonymous>\",e.displayName)),s}while(1<=i&&0<=a);break}}}finally{M=!1,Error.prepareStackTrace=n}return(e=e?e.displayName||e.name:\"\")?v(e):\"\"}function X(e){switch(e.tag){case 5:return v(e.type);case 16:return v(\"Lazy\");case 13:return v(\"Suspense\");case 19:return v(\"SuspenseList\");case 0:case 2:case 15:return e=b(e.type,!1),e;case 11:return e=b(e.type.render,!1),e;case 1:return e=b(e.type,!0),e;default:return\"\"}}function O(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 Re:return\"Fragment\";case K:return\"Portal\";case xe:return\"Profiler\";case he:return\"StrictMode\";case me:return\"Suspense\";case ge:return\"SuspenseList\"}if(typeof e==\"object\")switch(e.$$typeof){case Qe:return(e.displayName||\"Context\")+\".Consumer\";case ue:return(e._context.displayName||\"Context\")+\".Provider\";case Le:var t=e.render;return e=e.displayName,e||(e=t.displayName||t.name||\"\",e=e!==\"\"?\"ForwardRef(\"+e+\")\":\"ForwardRef\"),e;case Ie:return t=e.displayName||null,t!==null?t:O(e.type)||\"Memo\";case Ne:t=e._payload,e=e._init;try{return O(e(t))}catch{}}return null}function re(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 O(t);case 8:return t===he?\"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 ee(e){switch(typeof e){case\"boolean\":case\"number\":case\"string\":case\"undefined\":return e;case\"object\":return e;default:return\"\"}}function oe(e){var t=e.type;return(e=e.nodeName)&&e.toLowerCase()===\"input\"&&(t===\"checkbox\"||t===\"radio\")}function Ue(e){var t=oe(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 l=n.get,o=n.set;return Object.defineProperty(e,t,{configurable:!0,get:function(){return l.call(this)},set:function(i){r=\"\"+i,o.call(this,i)}}),Object.defineProperty(e,t,{enumerable:n.enumerable}),{getValue:function(){return r},setValue:function(i){r=\"\"+i},stopTracking:function(){e._valueTracker=null,delete e[t]}}}}function fn(e){e._valueTracker||(e._valueTracker=Ue(e))}function Un(e){if(!e)return!1;var t=e._valueTracker;if(!t)return!0;var n=t.getValue(),r=\"\";return e&&(r=oe(e)?e.checked?\"true\":\"false\":e.value),e=r,e!==n?(t.setValue(e),!0):!1}function Tt(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 An(e,t){var n=t.checked;return g({},t,{defaultChecked:void 0,defaultValue:void 0,value:void 0,checked:n??e._wrapperState.initialChecked})}function Zt(e,t){var n=t.defaultValue==null?\"\":t.defaultValue,r=t.checked!=null?t.checked:t.defaultChecked;n=ee(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 $i(e,t){t=t.checked,t!=null&&ke(e,\"checked\",t,!1)}function $l(e,t){$i(e,t);var n=ee(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\")?Hl(e,t.type,n):t.hasOwnProperty(\"defaultValue\")&&Hl(e,t.type,ee(t.defaultValue)),t.checked==null&&t.defaultChecked!=null&&(e.defaultChecked=!!t.defaultChecked)}function Hi(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 Hl(e,t,n){(t!==\"number\"||Tt(e.ownerDocument)!==e)&&(n==null?e.defaultValue=\"\"+e._wrapperState.initialValue:e.defaultValue!==\"\"+n&&(e.defaultValue=\"\"+n))}var $n=Array.isArray;function pn(e,t,n,r){if(e=e.options,t){t={};for(var l=0;l<n.length;l++)t[\"$\"+n[l]]=!0;for(n=0;n<e.length;n++)l=t.hasOwnProperty(\"$\"+e[n].value),e[n].selected!==l&&(e[n].selected=l),l&&r&&(e[n].defaultSelected=!0)}else{for(n=\"\"+ee(n),t=null,l=0;l<e.length;l++){if(e[l].value===n){e[l].selected=!0,r&&(e[l].defaultSelected=!0);return}t!==null||e[l].disabled||(t=e[l])}t!==null&&(t.selected=!0)}}function Vl(e,t){if(t.dangerouslySetInnerHTML!=null)throw Error(d(91));return g({},t,{value:void 0,defaultValue:void 0,children:\"\"+e._wrapperState.initialValue})}function Vi(e,t){var n=t.value;if(n==null){if(n=t.children,t=t.defaultValue,n!=null){if(t!=null)throw Error(d(92));if($n(n)){if(1<n.length)throw Error(d(93));n=n[0]}t=n}t==null&&(t=\"\"),n=t}e._wrapperState={initialValue:ee(n)}}function Wi(e,t){var n=ee(t.value),r=ee(t.defaultValue);n!=null&&(n=\"\"+n,n!==e.value&&(e.value=n),t.defaultValue==null&&e.defaultValue!==n&&(e.defaultValue=n)),r!=null&&(e.defaultValue=\"\"+r)}function Bi(e){var t=e.textContent;t===e._wrapperState.initialValue&&t!==\"\"&&t!==null&&(e.value=t)}function Qi(e){switch(e){case\"svg\":return\"http://www.w3.org/2000/svg\";case\"math\":return\"http://www.w3.org/1998/Math/MathML\";default:return\"http://www.w3.org/1999/xhtml\"}}function Wl(e,t){return e==null||e===\"http://www.w3.org/1999/xhtml\"?Qi(t):e===\"http://www.w3.org/2000/svg\"&&t===\"foreignObject\"?\"http://www.w3.org/1999/xhtml\":e}var Pr,Ki=(function(e){return typeof MSApp<\"u\"&&MSApp.execUnsafeLocalFunction?function(t,n,r,l){MSApp.execUnsafeLocalFunction(function(){return e(t,n,r,l)})}:e})(function(e,t){if(e.namespaceURI!==\"http://www.w3.org/2000/svg\"||\"innerHTML\"in e)e.innerHTML=t;else{for(Pr=Pr||document.createElement(\"div\"),Pr.innerHTML=\"<svg>\"+t.valueOf().toString()+\"</svg>\",t=Pr.firstChild;e.firstChild;)e.removeChild(e.firstChild);for(;t.firstChild;)e.appendChild(t.firstChild)}});function Hn(e,t){if(t){var n=e.firstChild;if(n&&n===e.lastChild&&n.nodeType===3){n.nodeValue=t;return}}e.textContent=t}var Vn={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},Ku=[\"Webkit\",\"ms\",\"Moz\",\"O\"];Object.keys(Vn).forEach(function(e){Ku.forEach(function(t){t=t+e.charAt(0).toUpperCase()+e.substring(1),Vn[t]=Vn[e]})});function Yi(e,t,n){return t==null||typeof t==\"boolean\"||t===\"\"?\"\":n||typeof t!=\"number\"||t===0||Vn.hasOwnProperty(e)&&Vn[e]?(\"\"+t).trim():t+\"px\"}function Xi(e,t){e=e.style;for(var n in t)if(t.hasOwnProperty(n)){var r=n.indexOf(\"--\")===0,l=Yi(n,t[n],r);n===\"float\"&&(n=\"cssFloat\"),r?e.setProperty(n,l):e[n]=l}}var Yu=g({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 Bl(e,t){if(t){if(Yu[e]&&(t.children!=null||t.dangerouslySetInnerHTML!=null))throw Error(d(137,e));if(t.dangerouslySetInnerHTML!=null){if(t.children!=null)throw Error(d(60));if(typeof t.dangerouslySetInnerHTML!=\"object\"||!(\"__html\"in t.dangerouslySetInnerHTML))throw Error(d(61))}if(t.style!=null&&typeof t.style!=\"object\")throw Error(d(62))}}function Ql(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 Kl=null;function Yl(e){return e=e.target||e.srcElement||window,e.correspondingUseElement&&(e=e.correspondingUseElement),e.nodeType===3?e.parentNode:e}var Xl=null,hn=null,mn=null;function Gi(e){if(e=dr(e)){if(typeof Xl!=\"function\")throw Error(d(280));var t=e.stateNode;t&&(t=Jr(t),Xl(e.stateNode,e.type,t))}}function Zi(e){hn?mn?mn.push(e):mn=[e]:hn=e}function Ji(){if(hn){var e=hn,t=mn;if(mn=hn=null,Gi(e),t)for(e=0;e<t.length;e++)Gi(t[e])}}function qi(e,t){return e(t)}function ea(){}var Gl=!1;function ta(e,t,n){if(Gl)return e(t,n);Gl=!0;try{return qi(e,t,n)}finally{Gl=!1,(hn!==null||mn!==null)&&(ea(),Ji())}}function Wn(e,t){var n=e.stateNode;if(n===null)return null;var r=Jr(n);if(r===null)return null;n=r[t];e:switch(t){case\"onClick\":case\"onClickCapture\":case\"onDoubleClick\":case\"onDoubleClickCapture\":case\"onMouseDown\":case\"onMouseDownCapture\":case\"onMouseMove\":case\"onMouseMoveCapture\":case\"onMouseUp\":case\"onMouseUpCapture\":case\"onMouseEnter\":(r=!r.disabled)||(e=e.type,r=!(e===\"button\"||e===\"input\"||e===\"select\"||e===\"textarea\")),e=!r;break e;default:e=!1}if(e)return null;if(n&&typeof n!=\"function\")throw Error(d(231,t,typeof n));return n}var Zl=!1;if(G)try{var Bn={};Object.defineProperty(Bn,\"passive\",{get:function(){Zl=!0}}),window.addEventListener(\"test\",Bn,Bn),window.removeEventListener(\"test\",Bn,Bn)}catch{Zl=!1}function Xu(e,t,n,r,l,o,i,a,s){var h=Array.prototype.slice.call(arguments,3);try{t.apply(n,h)}catch(k){this.onError(k)}}var Qn=!1,Tr=null,Rr=!1,Jl=null,Gu={onError:function(e){Qn=!0,Tr=e}};function Zu(e,t,n,r,l,o,i,a,s){Qn=!1,Tr=null,Xu.apply(Gu,arguments)}function Ju(e,t,n,r,l,o,i,a,s){if(Zu.apply(this,arguments),Qn){if(Qn){var h=Tr;Qn=!1,Tr=null}else throw Error(d(198));Rr||(Rr=!0,Jl=h)}}function Jt(e){var t=e,n=e;if(e.alternate)for(;t.return;)t=t.return;else{e=t;do t=e,(t.flags&4098)!==0&&(n=t.return),e=t.return;while(e)}return t.tag===3?n:null}function na(e){if(e.tag===13){var t=e.memoizedState;if(t===null&&(e=e.alternate,e!==null&&(t=e.memoizedState)),t!==null)return t.dehydrated}return null}function ra(e){if(Jt(e)!==e)throw Error(d(188))}function qu(e){var t=e.alternate;if(!t){if(t=Jt(e),t===null)throw Error(d(188));return t!==e?null:e}for(var n=e,r=t;;){var l=n.return;if(l===null)break;var o=l.alternate;if(o===null){if(r=l.return,r!==null){n=r;continue}break}if(l.child===o.child){for(o=l.child;o;){if(o===n)return ra(l),e;if(o===r)return ra(l),t;o=o.sibling}throw Error(d(188))}if(n.return!==r.return)n=l,r=o;else{for(var i=!1,a=l.child;a;){if(a===n){i=!0,n=l,r=o;break}if(a===r){i=!0,r=l,n=o;break}a=a.sibling}if(!i){for(a=o.child;a;){if(a===n){i=!0,n=o,r=l;break}if(a===r){i=!0,r=o,n=l;break}a=a.sibling}if(!i)throw Error(d(189))}}if(n.alternate!==r)throw Error(d(190))}if(n.tag!==3)throw Error(d(188));return n.stateNode.current===n?e:t}function la(e){return e=qu(e),e!==null?oa(e):null}function oa(e){if(e.tag===5||e.tag===6)return e;for(e=e.child;e!==null;){var t=oa(e);if(t!==null)return t;e=e.sibling}return null}var ia=E.unstable_scheduleCallback,aa=E.unstable_cancelCallback,ec=E.unstable_shouldYield,tc=E.unstable_requestPaint,_e=E.unstable_now,nc=E.unstable_getCurrentPriorityLevel,ql=E.unstable_ImmediatePriority,sa=E.unstable_UserBlockingPriority,Lr=E.unstable_NormalPriority,rc=E.unstable_LowPriority,ua=E.unstable_IdlePriority,Ir=null,vt=null;function lc(e){if(vt&&typeof vt.onCommitFiberRoot==\"function\")try{vt.onCommitFiberRoot(Ir,e,void 0,(e.current.flags&128)===128)}catch{}}var ut=Math.clz32?Math.clz32:ac,oc=Math.log,ic=Math.LN2;function ac(e){return e>>>=0,e===0?32:31-(oc(e)/ic|0)|0}var Mr=64,Or=4194304;function Kn(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 Dr(e,t){var n=e.pendingLanes;if(n===0)return 0;var r=0,l=e.suspendedLanes,o=e.pingedLanes,i=n&268435455;if(i!==0){var a=i&~l;a!==0?r=Kn(a):(o&=i,o!==0&&(r=Kn(o)))}else i=n&~l,i!==0?r=Kn(i):o!==0&&(r=Kn(o));if(r===0)return 0;if(t!==0&&t!==r&&(t&l)===0&&(l=r&-r,o=t&-t,l>=o||l===16&&(o&4194240)!==0))return t;if((r&4)!==0&&(r|=n&16),t=e.entangledLanes,t!==0)for(e=e.entanglements,t&=r;0<t;)n=31-ut(t),l=1<<n,r|=e[n],t&=~l;return r}function sc(e,t){switch(e){case 1:case 2:case 4:return t+250;case 8:case 16:case 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 t+5e3;case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:return-1;case 134217728:case 268435456:case 536870912:case 1073741824:return-1;default:return-1}}function uc(e,t){for(var n=e.suspendedLanes,r=e.pingedLanes,l=e.expirationTimes,o=e.pendingLanes;0<o;){var i=31-ut(o),a=1<<i,s=l[i];s===-1?((a&n)===0||(a&r)!==0)&&(l[i]=sc(a,t)):s<=t&&(e.expiredLanes|=a),o&=~a}}function eo(e){return e=e.pendingLanes&-1073741825,e!==0?e:e&1073741824?1073741824:0}function ca(){var e=Mr;return Mr<<=1,(Mr&4194240)===0&&(Mr=64),e}function to(e){for(var t=[],n=0;31>n;n++)t.push(e);return t}function Yn(e,t,n){e.pendingLanes|=t,t!==536870912&&(e.suspendedLanes=0,e.pingedLanes=0),e=e.eventTimes,t=31-ut(t),e[t]=n}function cc(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<n;){var l=31-ut(n),o=1<<l;t[l]=0,r[l]=-1,e[l]=-1,n&=~o}}function no(e,t){var n=e.entangledLanes|=t;for(e=e.entanglements;n;){var r=31-ut(n),l=1<<r;l&t|e[r]&t&&(e[r]|=t),n&=~l}}var le=0;function da(e){return e&=-e,1<e?4<e?(e&268435455)!==0?16:536870912:4:1}var fa,ro,pa,ha,ma,lo=!1,Fr=[],Rt=null,Lt=null,It=null,Xn=new Map,Gn=new Map,Mt=[],dc=\"mousedown mouseup touchcancel touchend touchstart auxclick dblclick pointercancel pointerdown pointerup dragend dragstart drop compositionend compositionstart keydown keypress keyup input textInput copy cut paste click change contextmenu reset submit\".split(\" \");function ga(e,t){switch(e){case\"focusin\":case\"focusout\":Rt=null;break;case\"dragenter\":case\"dragleave\":Lt=null;break;case\"mouseover\":case\"mouseout\":It=null;break;case\"pointerover\":case\"pointerout\":Xn.delete(t.pointerId);break;case\"gotpointercapture\":case\"lostpointercapture\":Gn.delete(t.pointerId)}}function Zn(e,t,n,r,l,o){return e===null||e.nativeEvent!==o?(e={blockedOn:t,domEventName:n,eventSystemFlags:r,nativeEvent:o,targetContainers:[l]},t!==null&&(t=dr(t),t!==null&&ro(t)),e):(e.eventSystemFlags|=r,t=e.targetContainers,l!==null&&t.indexOf(l)===-1&&t.push(l),e)}function fc(e,t,n,r,l){switch(t){case\"focusin\":return Rt=Zn(Rt,e,t,n,r,l),!0;case\"dragenter\":return Lt=Zn(Lt,e,t,n,r,l),!0;case\"mouseover\":return It=Zn(It,e,t,n,r,l),!0;case\"pointerover\":var o=l.pointerId;return Xn.set(o,Zn(Xn.get(o)||null,e,t,n,r,l)),!0;case\"gotpointercapture\":return o=l.pointerId,Gn.set(o,Zn(Gn.get(o)||null,e,t,n,r,l)),!0}return!1}function va(e){var t=qt(e.target);if(t!==null){var n=Jt(t);if(n!==null){if(t=n.tag,t===13){if(t=na(n),t!==null){e.blockedOn=t,ma(e.priority,function(){pa(n)});return}}else if(t===3&&n.stateNode.current.memoizedState.isDehydrated){e.blockedOn=n.tag===3?n.stateNode.containerInfo:null;return}}}e.blockedOn=null}function br(e){if(e.blockedOn!==null)return!1;for(var t=e.targetContainers;0<t.length;){var n=io(e.domEventName,e.eventSystemFlags,t[0],e.nativeEvent);if(n===null){n=e.nativeEvent;var r=new n.constructor(n.type,n);Kl=r,n.target.dispatchEvent(r),Kl=null}else return t=dr(n),t!==null&&ro(t),e.blockedOn=n,!1;t.shift()}return!0}function ya(e,t,n){br(e)&&n.delete(t)}function pc(){lo=!1,Rt!==null&&br(Rt)&&(Rt=null),Lt!==null&&br(Lt)&&(Lt=null),It!==null&&br(It)&&(It=null),Xn.forEach(ya),Gn.forEach(ya)}function Jn(e,t){e.blockedOn===t&&(e.blockedOn=null,lo||(lo=!0,E.unstable_scheduleCallback(E.unstable_NormalPriority,pc)))}function qn(e){function t(l){return Jn(l,e)}if(0<Fr.length){Jn(Fr[0],e);for(var n=1;n<Fr.length;n++){var r=Fr[n];r.blockedOn===e&&(r.blockedOn=null)}}for(Rt!==null&&Jn(Rt,e),Lt!==null&&Jn(Lt,e),It!==null&&Jn(It,e),Xn.forEach(t),Gn.forEach(t),n=0;n<Mt.length;n++)r=Mt[n],r.blockedOn===e&&(r.blockedOn=null);for(;0<Mt.length&&(n=Mt[0],n.blockedOn===null);)va(n),n.blockedOn===null&&Mt.shift()}var gn=fe.ReactCurrentBatchConfig,Ur=!0;function hc(e,t,n,r){var l=le,o=gn.transition;gn.transition=null;try{le=1,oo(e,t,n,r)}finally{le=l,gn.transition=o}}function mc(e,t,n,r){var l=le,o=gn.transition;gn.transition=null;try{le=4,oo(e,t,n,r)}finally{le=l,gn.transition=o}}function oo(e,t,n,r){if(Ur){var l=io(e,t,n,r);if(l===null)Eo(e,t,r,Ar,n),ga(e,r);else if(fc(l,e,t,n,r))r.stopPropagation();else if(ga(e,r),t&4&&-1<dc.indexOf(e)){for(;l!==null;){var o=dr(l);if(o!==null&&fa(o),o=io(e,t,n,r),o===null&&Eo(e,t,r,Ar,n),o===l)break;l=o}l!==null&&r.stopPropagation()}else Eo(e,t,r,null,n)}}var Ar=null;function io(e,t,n,r){if(Ar=null,e=Yl(r),e=qt(e),e!==null)if(t=Jt(e),t===null)e=null;else if(n=t.tag,n===13){if(e=na(t),e!==null)return e;e=null}else if(n===3){if(t.stateNode.current.memoizedState.isDehydrated)return t.tag===3?t.stateNode.containerInfo:null;e=null}else t!==e&&(e=null);return Ar=e,null}function wa(e){switch(e){case\"cancel\":case\"click\":case\"close\":case\"contextmenu\":case\"copy\":case\"cut\":case\"auxclick\":case\"dblclick\":case\"dragend\":case\"dragstart\":case\"drop\":case\"focusin\":case\"focusout\":case\"input\":case\"invalid\":case\"keydown\":case\"keypress\":case\"keyup\":case\"mousedown\":case\"mouseup\":case\"paste\":case\"pause\":case\"play\":case\"pointercancel\":case\"pointerdown\":case\"pointerup\":case\"ratechange\":case\"reset\":case\"resize\":case\"seeked\":case\"submit\":case\"touchcancel\":case\"touchend\":case\"touchstart\":case\"volumechange\":case\"change\":case\"selectionchange\":case\"textInput\":case\"compositionstart\":case\"compositionend\":case\"compositionupdate\":case\"beforeblur\":case\"afterblur\":case\"beforeinput\":case\"blur\":case\"fullscreenchange\":case\"focus\":case\"hashchange\":case\"popstate\":case\"select\":case\"selectstart\":return 1;case\"drag\":case\"dragenter\":case\"dragexit\":case\"dragleave\":case\"dragover\":case\"mousemove\":case\"mouseout\":case\"mouseover\":case\"pointermove\":case\"pointerout\":case\"pointerover\":case\"scroll\":case\"toggle\":case\"touchmove\":case\"wheel\":case\"mouseenter\":case\"mouseleave\":case\"pointerenter\":case\"pointerleave\":return 4;case\"message\":switch(nc()){case ql:return 1;case sa:return 4;case Lr:case rc:return 16;case ua:return 536870912;default:return 16}default:return 16}}var Ot=null,ao=null,$r=null;function ka(){if($r)return $r;var e,t=ao,n=t.length,r,l=\"value\"in Ot?Ot.value:Ot.textContent,o=l.length;for(e=0;e<n&&t[e]===l[e];e++);var i=n-e;for(r=1;r<=i&&t[n-r]===l[o-r];r++);return $r=l.slice(e,1<r?1-r:void 0)}function Hr(e){var t=e.keyCode;return\"charCode\"in e?(e=e.charCode,e===0&&t===13&&(e=13)):e=t,e===10&&(e=13),32<=e||e===13?e:0}function Vr(){return!0}function xa(){return!1}function qe(e){function t(n,r,l,o,i){this._reactName=n,this._targetInst=l,this.type=r,this.nativeEvent=o,this.target=i,this.currentTarget=null;for(var a in e)e.hasOwnProperty(a)&&(n=e[a],this[a]=n?n(o):o[a]);return this.isDefaultPrevented=(o.defaultPrevented!=null?o.defaultPrevented:o.returnValue===!1)?Vr:xa,this.isPropagationStopped=xa,this}return g(t.prototype,{preventDefault:function(){this.defaultPrevented=!0;var n=this.nativeEvent;n&&(n.preventDefault?n.preventDefault():typeof n.returnValue!=\"unknown\"&&(n.returnValue=!1),this.isDefaultPrevented=Vr)},stopPropagation:function(){var n=this.nativeEvent;n&&(n.stopPropagation?n.stopPropagation():typeof n.cancelBubble!=\"unknown\"&&(n.cancelBubble=!0),this.isPropagationStopped=Vr)},persist:function(){},isPersistent:Vr}),t}var vn={eventPhase:0,bubbles:0,cancelable:0,timeStamp:function(e){return e.timeStamp||Date.now()},defaultPrevented:0,isTrusted:0},so=qe(vn),er=g({},vn,{view:0,detail:0}),gc=qe(er),uo,co,tr,Wr=g({},er,{screenX:0,screenY:0,clientX:0,clientY:0,pageX:0,pageY:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,getModifierState:po,button:0,buttons:0,relatedTarget:function(e){return e.relatedTarget===void 0?e.fromElement===e.srcElement?e.toElement:e.fromElement:e.relatedTarget},movementX:function(e){return\"movementX\"in e?e.movementX:(e!==tr&&(tr&&e.type===\"mousemove\"?(uo=e.screenX-tr.screenX,co=e.screenY-tr.screenY):co=uo=0,tr=e),uo)},movementY:function(e){return\"movementY\"in e?e.movementY:co}}),Sa=qe(Wr),vc=g({},Wr,{dataTransfer:0}),yc=qe(vc),wc=g({},er,{relatedTarget:0}),fo=qe(wc),kc=g({},vn,{animationName:0,elapsedTime:0,pseudoElement:0}),xc=qe(kc),Sc=g({},vn,{clipboardData:function(e){return\"clipboardData\"in e?e.clipboardData:window.clipboardData}}),_c=qe(Sc),Ec=g({},vn,{data:0}),_a=qe(Ec),Cc={Esc:\"Escape\",Spacebar:\" \",Left:\"ArrowLeft\",Up:\"ArrowUp\",Right:\"ArrowRight\",Down:\"ArrowDown\",Del:\"Delete\",Win:\"OS\",Menu:\"ContextMenu\",Apps:\"ContextMenu\",Scroll:\"ScrollLock\",MozPrintableKey:\"Unidentified\"},Nc={8:\"Backspace\",9:\"Tab\",12:\"Clear\",13:\"Enter\",16:\"Shift\",17:\"Control\",18:\"Alt\",19:\"Pause\",20:\"CapsLock\",27:\"Escape\",32:\" \",33:\"PageUp\",34:\"PageDown\",35:\"End\",36:\"Home\",37:\"ArrowLeft\",38:\"ArrowUp\",39:\"ArrowRight\",40:\"ArrowDown\",45:\"Insert\",46:\"Delete\",112:\"F1\",113:\"F2\",114:\"F3\",115:\"F4\",116:\"F5\",117:\"F6\",118:\"F7\",119:\"F8\",120:\"F9\",121:\"F10\",122:\"F11\",123:\"F12\",144:\"NumLock\",145:\"ScrollLock\",224:\"Meta\"},jc={Alt:\"altKey\",Control:\"ctrlKey\",Meta:\"metaKey\",Shift:\"shiftKey\"};function zc(e){var t=this.nativeEvent;return t.getModifierState?t.getModifierState(e):(e=jc[e])?!!t[e]:!1}function po(){return zc}var Pc=g({},er,{key:function(e){if(e.key){var t=Cc[e.key]||e.key;if(t!==\"Unidentified\")return t}return e.type===\"keypress\"?(e=Hr(e),e===13?\"Enter\":String.fromCharCode(e)):e.type===\"keydown\"||e.type===\"keyup\"?Nc[e.keyCode]||\"Unidentified\":\"\"},code:0,location:0,ctrlKey:0,shiftKey:0,altKey:0,metaKey:0,repeat:0,locale:0,getModifierState:po,charCode:function(e){return e.type===\"keypress\"?Hr(e):0},keyCode:function(e){return e.type===\"keydown\"||e.type===\"keyup\"?e.keyCode:0},which:function(e){return e.type===\"keypress\"?Hr(e):e.type===\"keydown\"||e.type===\"keyup\"?e.keyCode:0}}),Tc=qe(Pc),Rc=g({},Wr,{pointerId:0,width:0,height:0,pressure:0,tangentialPressure:0,tiltX:0,tiltY:0,twist:0,pointerType:0,isPrimary:0}),Ea=qe(Rc),Lc=g({},er,{touches:0,targetTouches:0,changedTouches:0,altKey:0,metaKey:0,ctrlKey:0,shiftKey:0,getModifierState:po}),Ic=qe(Lc),Mc=g({},vn,{propertyName:0,elapsedTime:0,pseudoElement:0}),Oc=qe(Mc),Dc=g({},Wr,{deltaX:function(e){return\"deltaX\"in e?e.deltaX:\"wheelDeltaX\"in e?-e.wheelDeltaX:0},deltaY:function(e){return\"deltaY\"in e?e.deltaY:\"wheelDeltaY\"in e?-e.wheelDeltaY:\"wheelDelta\"in e?-e.wheelDelta:0},deltaZ:0,deltaMode:0}),Fc=qe(Dc),bc=[9,13,27,32],ho=G&&\"CompositionEvent\"in window,nr=null;G&&\"documentMode\"in document&&(nr=document.documentMode);var Uc=G&&\"TextEvent\"in window&&!nr,Ca=G&&(!ho||nr&&8<nr&&11>=nr),Na=\" \",ja=!1;function za(e,t){switch(e){case\"keyup\":return bc.indexOf(t.keyCode)!==-1;case\"keydown\":return t.keyCode!==229;case\"keypress\":case\"mousedown\":case\"focusout\":return!0;default:return!1}}function Pa(e){return e=e.detail,typeof e==\"object\"&&\"data\"in e?e.data:null}var yn=!1;function Ac(e,t){switch(e){case\"compositionend\":return Pa(t);case\"keypress\":return t.which!==32?null:(ja=!0,Na);case\"textInput\":return e=t.data,e===Na&&ja?null:e;default:return null}}function $c(e,t){if(yn)return e===\"compositionend\"||!ho&&za(e,t)?(e=ka(),$r=ao=Ot=null,yn=!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.char.length)return t.char;if(t.which)return String.fromCharCode(t.which)}return null;case\"compositionend\":return Ca&&t.locale!==\"ko\"?null:t.data;default:return null}}var Hc={color:!0,date:!0,datetime:!0,\"datetime-local\":!0,email:!0,month:!0,number:!0,password:!0,range:!0,search:!0,tel:!0,text:!0,time:!0,url:!0,week:!0};function Ta(e){var t=e&&e.nodeName&&e.nodeName.toLowerCase();return t===\"input\"?!!Hc[e.type]:t===\"textarea\"}function Ra(e,t,n,r){Zi(r),t=Xr(t,\"onChange\"),0<t.length&&(n=new so(\"onChange\",\"change\",null,n,r),e.push({event:n,listeners:t}))}var rr=null,lr=null;function Vc(e){Xa(e,0)}function Br(e){var t=_n(e);if(Un(t))return e}function Wc(e,t){if(e===\"change\")return t}var La=!1;if(G){var mo;if(G){var go=\"oninput\"in document;if(!go){var Ia=document.createElement(\"div\");Ia.setAttribute(\"oninput\",\"return;\"),go=typeof Ia.oninput==\"function\"}mo=go}else mo=!1;La=mo&&(!document.documentMode||9<document.documentMode)}function Ma(){rr&&(rr.detachEvent(\"onpropertychange\",Oa),lr=rr=null)}function Oa(e){if(e.propertyName===\"value\"&&Br(lr)){var t=[];Ra(t,lr,e,Yl(e)),ta(Vc,t)}}function Bc(e,t,n){e===\"focusin\"?(Ma(),rr=t,lr=n,rr.attachEvent(\"onpropertychange\",Oa)):e===\"focusout\"&&Ma()}function Qc(e){if(e===\"selectionchange\"||e===\"keyup\"||e===\"keydown\")return Br(lr)}function Kc(e,t){if(e===\"click\")return Br(t)}function Yc(e,t){if(e===\"input\"||e===\"change\")return Br(t)}function Xc(e,t){return e===t&&(e!==0||1/e===1/t)||e!==e&&t!==t}var ct=typeof Object.is==\"function\"?Object.is:Xc;function or(e,t){if(ct(e,t))return!0;if(typeof e!=\"object\"||e===null||typeof t!=\"object\"||t===null)return!1;var n=Object.keys(e),r=Object.keys(t);if(n.length!==r.length)return!1;for(r=0;r<n.length;r++){var l=n[r];if(!A.call(t,l)||!ct(e[l],t[l]))return!1}return!0}function Da(e){for(;e&&e.firstChild;)e=e.firstChild;return e}function Fa(e,t){var n=Da(e);e=0;for(var r;n;){if(n.nodeType===3){if(r=e+n.textContent.length,e<=t&&r>=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=Da(n)}}function ba(e,t){return e&&t?e===t?!0:e&&e.nodeType===3?!1:t&&t.nodeType===3?ba(e,t.parentNode):\"contains\"in e?e.contains(t):e.compareDocumentPosition?!!(e.compareDocumentPosition(t)&16):!1:!1}function Ua(){for(var e=window,t=Tt();t instanceof e.HTMLIFrameElement;){try{var n=typeof t.contentWindow.location.href==\"string\"}catch{n=!1}if(n)e=t.contentWindow;else break;t=Tt(e.document)}return t}function vo(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 Gc(e){var t=Ua(),n=e.focusedElem,r=e.selectionRange;if(t!==n&&n&&n.ownerDocument&&ba(n.ownerDocument.documentElement,n)){if(r!==null&&vo(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 l=n.textContent.length,o=Math.min(r.start,l);r=r.end===void 0?o:Math.min(r.end,l),!e.extend&&o>r&&(l=r,r=o,o=l),l=Fa(n,o);var i=Fa(n,r);l&&i&&(e.rangeCount!==1||e.anchorNode!==l.node||e.anchorOffset!==l.offset||e.focusNode!==i.node||e.focusOffset!==i.offset)&&(t=t.createRange(),t.setStart(l.node,l.offset),e.removeAllRanges(),o>r?(e.addRange(t),e.extend(i.node,i.offset)):(t.setEnd(i.node,i.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<t.length;n++)e=t[n],e.element.scrollLeft=e.left,e.element.scrollTop=e.top}}var Zc=G&&\"documentMode\"in document&&11>=document.documentMode,wn=null,yo=null,ir=null,wo=!1;function Aa(e,t,n){var r=n.window===n?n.document:n.nodeType===9?n:n.ownerDocument;wo||wn==null||wn!==Tt(r)||(r=wn,\"selectionStart\"in r&&vo(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}),ir&&or(ir,r)||(ir=r,r=Xr(yo,\"onSelect\"),0<r.length&&(t=new so(\"onSelect\",\"select\",null,t,n),e.push({event:t,listeners:r}),t.target=wn)))}function Qr(e,t){var n={};return n[e.toLowerCase()]=t.toLowerCase(),n[\"Webkit\"+e]=\"webkit\"+t,n[\"Moz\"+e]=\"moz\"+t,n}var kn={animationend:Qr(\"Animation\",\"AnimationEnd\"),animationiteration:Qr(\"Animation\",\"AnimationIteration\"),animationstart:Qr(\"Animation\",\"AnimationStart\"),transitionend:Qr(\"Transition\",\"TransitionEnd\")},ko={},$a={};G&&($a=document.createElement(\"div\").style,\"AnimationEvent\"in window||(delete kn.animationend.animation,delete kn.animationiteration.animation,delete kn.animationstart.animation),\"TransitionEvent\"in window||delete kn.transitionend.transition);function Kr(e){if(ko[e])return ko[e];if(!kn[e])return e;var t=kn[e],n;for(n in t)if(t.hasOwnProperty(n)&&n in $a)return ko[e]=t[n];return e}var Ha=Kr(\"animationend\"),Va=Kr(\"animationiteration\"),Wa=Kr(\"animationstart\"),Ba=Kr(\"transitionend\"),Qa=new Map,Ka=\"abort auxClick cancel canPlay canPlayThrough click close contextMenu copy cut drag dragEnd dragEnter dragExit dragLeave dragOver dragStart drop durationChange emptied encrypted ended error gotPointerCapture input invalid keyDown keyPress keyUp load loadedData loadedMetadata loadStart lostPointerCapture mouseDown mouseMove mouseOut mouseOver mouseUp paste pause play playing pointerCancel pointerDown pointerMove pointerOut pointerOver pointerUp progress rateChange reset resize seeked seeking stalled submit suspend timeUpdate touchCancel touchEnd touchStart volumeChange scroll toggle touchMove waiting wheel\".split(\" \");function Dt(e,t){Qa.set(e,t),L(t,[e])}for(var xo=0;xo<Ka.length;xo++){var So=Ka[xo],Jc=So.toLowerCase(),qc=So[0].toUpperCase()+So.slice(1);Dt(Jc,\"on\"+qc)}Dt(Ha,\"onAnimationEnd\"),Dt(Va,\"onAnimationIteration\"),Dt(Wa,\"onAnimationStart\"),Dt(\"dblclick\",\"onDoubleClick\"),Dt(\"focusin\",\"onFocus\"),Dt(\"focusout\",\"onBlur\"),Dt(Ba,\"onTransitionEnd\"),B(\"onMouseEnter\",[\"mouseout\",\"mouseover\"]),B(\"onMouseLeave\",[\"mouseout\",\"mouseover\"]),B(\"onPointerEnter\",[\"pointerout\",\"pointerover\"]),B(\"onPointerLeave\",[\"pointerout\",\"pointerover\"]),L(\"onChange\",\"change click focusin focusout input keydown keyup selectionchange\".split(\" \")),L(\"onSelect\",\"focusout contextmenu dragend focusin keydown keyup mousedown mouseup selectionchange\".split(\" \")),L(\"onBeforeInput\",[\"compositionend\",\"keypress\",\"textInput\",\"paste\"]),L(\"onCompositionEnd\",\"compositionend focusout keydown keypress keyup mousedown\".split(\" \")),L(\"onCompositionStart\",\"compositionstart focusout keydown keypress keyup mousedown\".split(\" \")),L(\"onCompositionUpdate\",\"compositionupdate focusout keydown keypress keyup mousedown\".split(\" \"));var ar=\"abort canplay canplaythrough durationchange emptied encrypted ended error loadeddata loadedmetadata loadstart pause play playing progress ratechange resize seeked seeking stalled suspend timeupdate volumechange waiting\".split(\" \"),ed=new Set(\"cancel close invalid load scroll toggle\".split(\" \").concat(ar));function Ya(e,t,n){var r=e.type||\"unknown-event\";e.currentTarget=n,Ju(r,t,void 0,e),e.currentTarget=null}function Xa(e,t){t=(t&4)!==0;for(var n=0;n<e.length;n++){var r=e[n],l=r.event;r=r.listeners;e:{var o=void 0;if(t)for(var i=r.length-1;0<=i;i--){var a=r[i],s=a.instance,h=a.currentTarget;if(a=a.listener,s!==o&&l.isPropagationStopped())break e;Ya(l,a,h),o=s}else for(i=0;i<r.length;i++){if(a=r[i],s=a.instance,h=a.currentTarget,a=a.listener,s!==o&&l.isPropagationStopped())break e;Ya(l,a,h),o=s}}}if(Rr)throw e=Jl,Rr=!1,Jl=null,e}function ce(e,t){var n=t[To];n===void 0&&(n=t[To]=new Set);var r=e+\"__bubble\";n.has(r)||(Ga(t,e,2,!1),n.add(r))}function _o(e,t,n){var r=0;t&&(r|=4),Ga(n,e,r,t)}var Yr=\"_reactListening\"+Math.random().toString(36).slice(2);function sr(e){if(!e[Yr]){e[Yr]=!0,U.forEach(function(n){n!==\"selectionchange\"&&(ed.has(n)||_o(n,!1,e),_o(n,!0,e))});var t=e.nodeType===9?e:e.ownerDocument;t===null||t[Yr]||(t[Yr]=!0,_o(\"selectionchange\",!1,t))}}function Ga(e,t,n,r){switch(wa(t)){case 1:var l=hc;break;case 4:l=mc;break;default:l=oo}n=l.bind(null,t,n,e),l=void 0,!Zl||t!==\"touchstart\"&&t!==\"touchmove\"&&t!==\"wheel\"||(l=!0),r?l!==void 0?e.addEventListener(t,n,{capture:!0,passive:l}):e.addEventListener(t,n,!0):l!==void 0?e.addEventListener(t,n,{passive:l}):e.addEventListener(t,n,!1)}function Eo(e,t,n,r,l){var o=r;if((t&1)===0&&(t&2)===0&&r!==null)e:for(;;){if(r===null)return;var i=r.tag;if(i===3||i===4){var a=r.stateNode.containerInfo;if(a===l||a.nodeType===8&&a.parentNode===l)break;if(i===4)for(i=r.return;i!==null;){var s=i.tag;if((s===3||s===4)&&(s=i.stateNode.containerInfo,s===l||s.nodeType===8&&s.parentNode===l))return;i=i.return}for(;a!==null;){if(i=qt(a),i===null)return;if(s=i.tag,s===5||s===6){r=o=i;continue e}a=a.parentNode}}r=r.return}ta(function(){var h=o,k=Yl(n),S=[];e:{var w=Qa.get(e);if(w!==void 0){var N=so,z=e;switch(e){case\"keypress\":if(Hr(n)===0)break e;case\"keydown\":case\"keyup\":N=Tc;break;case\"focusin\":z=\"focus\",N=fo;break;case\"focusout\":z=\"blur\",N=fo;break;case\"beforeblur\":case\"afterblur\":N=fo;break;case\"click\":if(n.button===2)break e;case\"auxclick\":case\"dblclick\":case\"mousedown\":case\"mousemove\":case\"mouseup\":case\"mouseout\":case\"mouseover\":case\"contextmenu\":N=Sa;break;case\"drag\":case\"dragend\":case\"dragenter\":case\"dragexit\":case\"dragleave\":case\"dragover\":case\"dragstart\":case\"drop\":N=yc;break;case\"touchcancel\":case\"touchend\":case\"touchmove\":case\"touchstart\":N=Ic;break;case Ha:case Va:case Wa:N=xc;break;case Ba:N=Oc;break;case\"scroll\":N=gc;break;case\"wheel\":N=Fc;break;case\"copy\":case\"cut\":case\"paste\":N=_c;break;case\"gotpointercapture\":case\"lostpointercapture\":case\"pointercancel\":case\"pointerdown\":case\"pointermove\":case\"pointerout\":case\"pointerover\":case\"pointerup\":N=Ea}var P=(t&4)!==0,Ee=!P&&e===\"scroll\",f=P?w!==null?w+\"Capture\":null:w;P=[];for(var c=h,p;c!==null;){p=c;var _=p.stateNode;if(p.tag===5&&_!==null&&(p=_,f!==null&&(_=Wn(c,f),_!=null&&P.push(ur(c,_,p)))),Ee)break;c=c.return}0<P.length&&(w=new N(w,z,null,n,k),S.push({event:w,listeners:P}))}}if((t&7)===0){e:{if(w=e===\"mouseover\"||e===\"pointerover\",N=e===\"mouseout\"||e===\"pointerout\",w&&n!==Kl&&(z=n.relatedTarget||n.fromElement)&&(qt(z)||z[St]))break e;if((N||w)&&(w=k.window===k?k:(w=k.ownerDocument)?w.defaultView||w.parentWindow:window,N?(z=n.relatedTarget||n.toElement,N=h,z=z?qt(z):null,z!==null&&(Ee=Jt(z),z!==Ee||z.tag!==5&&z.tag!==6)&&(z=null)):(N=null,z=h),N!==z)){if(P=Sa,_=\"onMouseLeave\",f=\"onMouseEnter\",c=\"mouse\",(e===\"pointerout\"||e===\"pointerover\")&&(P=Ea,_=\"onPointerLeave\",f=\"onPointerEnter\",c=\"pointer\"),Ee=N==null?w:_n(N),p=z==null?w:_n(z),w=new P(_,c+\"leave\",N,n,k),w.target=Ee,w.relatedTarget=p,_=null,qt(k)===h&&(P=new P(f,c+\"enter\",z,n,k),P.target=p,P.relatedTarget=Ee,_=P),Ee=_,N&&z)t:{for(P=N,f=z,c=0,p=P;p;p=xn(p))c++;for(p=0,_=f;_;_=xn(_))p++;for(;0<c-p;)P=xn(P),c--;for(;0<p-c;)f=xn(f),p--;for(;c--;){if(P===f||f!==null&&P===f.alternate)break t;P=xn(P),f=xn(f)}P=null}else P=null;N!==null&&Za(S,w,N,P,!1),z!==null&&Ee!==null&&Za(S,Ee,z,P,!0)}}e:{if(w=h?_n(h):window,N=w.nodeName&&w.nodeName.toLowerCase(),N===\"select\"||N===\"input\"&&w.type===\"file\")var R=Wc;else if(Ta(w))if(La)R=Yc;else{R=Qc;var D=Bc}else(N=w.nodeName)&&N.toLowerCase()===\"input\"&&(w.type===\"checkbox\"||w.type===\"radio\")&&(R=Kc);if(R&&(R=R(e,h))){Ra(S,R,n,k);break e}D&&D(e,w,h),e===\"focusout\"&&(D=w._wrapperState)&&D.controlled&&w.type===\"number\"&&Hl(w,\"number\",w.value)}switch(D=h?_n(h):window,e){case\"focusin\":(Ta(D)||D.contentEditable===\"true\")&&(wn=D,yo=h,ir=null);break;case\"focusout\":ir=yo=wn=null;break;case\"mousedown\":wo=!0;break;case\"contextmenu\":case\"mouseup\":case\"dragend\":wo=!1,Aa(S,n,k);break;case\"selectionchange\":if(Zc)break;case\"keydown\":case\"keyup\":Aa(S,n,k)}var F;if(ho)e:{switch(e){case\"compositionstart\":var $=\"onCompositionStart\";break e;case\"compositionend\":$=\"onCompositionEnd\";break e;case\"compositionupdate\":$=\"onCompositionUpdate\";break e}$=void 0}else yn?za(e,n)&&($=\"onCompositionEnd\"):e===\"keydown\"&&n.keyCode===229&&($=\"onCompositionStart\");$&&(Ca&&n.locale!==\"ko\"&&(yn||$!==\"onCompositionStart\"?$===\"onCompositionEnd\"&&yn&&(F=ka()):(Ot=k,ao=\"value\"in Ot?Ot.value:Ot.textContent,yn=!0)),D=Xr(h,$),0<D.length&&($=new _a($,e,null,n,k),S.push({event:$,listeners:D}),F?$.data=F:(F=Pa(n),F!==null&&($.data=F)))),(F=Uc?Ac(e,n):$c(e,n))&&(h=Xr(h,\"onBeforeInput\"),0<h.length&&(k=new _a(\"onBeforeInput\",\"beforeinput\",null,n,k),S.push({event:k,listeners:h}),k.data=F))}Xa(S,t)})}function ur(e,t,n){return{instance:e,listener:t,currentTarget:n}}function Xr(e,t){for(var n=t+\"Capture\",r=[];e!==null;){var l=e,o=l.stateNode;l.tag===5&&o!==null&&(l=o,o=Wn(e,n),o!=null&&r.unshift(ur(e,o,l)),o=Wn(e,t),o!=null&&r.push(ur(e,o,l))),e=e.return}return r}function xn(e){if(e===null)return null;do e=e.return;while(e&&e.tag!==5);return e||null}function Za(e,t,n,r,l){for(var o=t._reactName,i=[];n!==null&&n!==r;){var a=n,s=a.alternate,h=a.stateNode;if(s!==null&&s===r)break;a.tag===5&&h!==null&&(a=h,l?(s=Wn(n,o),s!=null&&i.unshift(ur(n,s,a))):l||(s=Wn(n,o),s!=null&&i.push(ur(n,s,a)))),n=n.return}i.length!==0&&e.push({event:t,listeners:i})}var td=/\\r\\n?/g,nd=/\\u0000|\\uFFFD/g;function Ja(e){return(typeof e==\"string\"?e:\"\"+e).replace(td,`\n`).replace(nd,\"\")}function Gr(e,t,n){if(t=Ja(t),Ja(e)!==t&&n)throw Error(d(425))}function Zr(){}var Co=null,No=null;function jo(e,t){return e===\"textarea\"||e===\"noscript\"||typeof t.children==\"string\"||typeof t.children==\"number\"||typeof t.dangerouslySetInnerHTML==\"object\"&&t.dangerouslySetInnerHTML!==null&&t.dangerouslySetInnerHTML.__html!=null}var zo=typeof setTimeout==\"function\"?setTimeout:void 0,rd=typeof clearTimeout==\"function\"?clearTimeout:void 0,qa=typeof Promise==\"function\"?Promise:void 0,ld=typeof queueMicrotask==\"function\"?queueMicrotask:typeof qa<\"u\"?function(e){return qa.resolve(null).then(e).catch(od)}:zo;function od(e){setTimeout(function(){throw e})}function Po(e,t){var n=t,r=0;do{var l=n.nextSibling;if(e.removeChild(n),l&&l.nodeType===8)if(n=l.data,n===\"/$\"){if(r===0){e.removeChild(l),qn(t);return}r--}else n!==\"$\"&&n!==\"$?\"&&n!==\"$!\"||r++;n=l}while(n);qn(t)}function Ft(e){for(;e!=null;e=e.nextSibling){var t=e.nodeType;if(t===1||t===3)break;if(t===8){if(t=e.data,t===\"$\"||t===\"$!\"||t===\"$?\")break;if(t===\"/$\")return null}}return e}function es(e){e=e.previousSibling;for(var t=0;e;){if(e.nodeType===8){var n=e.data;if(n===\"$\"||n===\"$!\"||n===\"$?\"){if(t===0)return e;t--}else n===\"/$\"&&t++}e=e.previousSibling}return null}var Sn=Math.random().toString(36).slice(2),yt=\"__reactFiber$\"+Sn,cr=\"__reactProps$\"+Sn,St=\"__reactContainer$\"+Sn,To=\"__reactEvents$\"+Sn,id=\"__reactListeners$\"+Sn,ad=\"__reactHandles$\"+Sn;function qt(e){var t=e[yt];if(t)return t;for(var n=e.parentNode;n;){if(t=n[St]||n[yt]){if(n=t.alternate,t.child!==null||n!==null&&n.child!==null)for(e=es(e);e!==null;){if(n=e[yt])return n;e=es(e)}return t}e=n,n=e.parentNode}return null}function dr(e){return e=e[yt]||e[St],!e||e.tag!==5&&e.tag!==6&&e.tag!==13&&e.tag!==3?null:e}function _n(e){if(e.tag===5||e.tag===6)return e.stateNode;throw Error(d(33))}function Jr(e){return e[cr]||null}var Ro=[],En=-1;function bt(e){return{current:e}}function de(e){0>En||(e.current=Ro[En],Ro[En]=null,En--)}function se(e,t){En++,Ro[En]=e.current,e.current=t}var Ut={},Ae=bt(Ut),Ke=bt(!1),en=Ut;function Cn(e,t){var n=e.type.contextTypes;if(!n)return Ut;var r=e.stateNode;if(r&&r.__reactInternalMemoizedUnmaskedChildContext===t)return r.__reactInternalMemoizedMaskedChildContext;var l={},o;for(o in n)l[o]=t[o];return r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=t,e.__reactInternalMemoizedMaskedChildContext=l),l}function Ye(e){return e=e.childContextTypes,e!=null}function qr(){de(Ke),de(Ae)}function ts(e,t,n){if(Ae.current!==Ut)throw Error(d(168));se(Ae,t),se(Ke,n)}function ns(e,t,n){var r=e.stateNode;if(t=t.childContextTypes,typeof r.getChildContext!=\"function\")return n;r=r.getChildContext();for(var l in r)if(!(l in t))throw Error(d(108,re(e)||\"Unknown\",l));return g({},n,r)}function el(e){return e=(e=e.stateNode)&&e.__reactInternalMemoizedMergedChildContext||Ut,en=Ae.current,se(Ae,e),se(Ke,Ke.current),!0}function rs(e,t,n){var r=e.stateNode;if(!r)throw Error(d(169));n?(e=ns(e,t,en),r.__reactInternalMemoizedMergedChildContext=e,de(Ke),de(Ae),se(Ae,e)):de(Ke),se(Ke,n)}var _t=null,tl=!1,Lo=!1;function ls(e){_t===null?_t=[e]:_t.push(e)}function sd(e){tl=!0,ls(e)}function At(){if(!Lo&&_t!==null){Lo=!0;var e=0,t=le;try{var n=_t;for(le=1;e<n.length;e++){var r=n[e];do r=r(!0);while(r!==null)}_t=null,tl=!1}catch(l){throw _t!==null&&(_t=_t.slice(e+1)),ia(ql,At),l}finally{le=t,Lo=!1}}return null}var Nn=[],jn=0,nl=null,rl=0,rt=[],lt=0,tn=null,Et=1,Ct=\"\";function nn(e,t){Nn[jn++]=rl,Nn[jn++]=nl,nl=e,rl=t}function os(e,t,n){rt[lt++]=Et,rt[lt++]=Ct,rt[lt++]=tn,tn=e;var r=Et;e=Ct;var l=32-ut(r)-1;r&=~(1<<l),n+=1;var o=32-ut(t)+l;if(30<o){var i=l-l%5;o=(r&(1<<i)-1).toString(32),r>>=i,l-=i,Et=1<<32-ut(t)+l|n<<l|r,Ct=o+e}else Et=1<<o|n<<l|r,Ct=e}function Io(e){e.return!==null&&(nn(e,1),os(e,1,0))}function Mo(e){for(;e===nl;)nl=Nn[--jn],Nn[jn]=null,rl=Nn[--jn],Nn[jn]=null;for(;e===tn;)tn=rt[--lt],rt[lt]=null,Ct=rt[--lt],rt[lt]=null,Et=rt[--lt],rt[lt]=null}var et=null,tt=null,pe=!1,dt=null;function is(e,t){var n=st(5,null,null,0);n.elementType=\"DELETED\",n.stateNode=t,n.return=e,t=e.deletions,t===null?(e.deletions=[n],e.flags|=16):t.push(n)}function as(e,t){switch(e.tag){case 5:var n=e.type;return t=t.nodeType!==1||n.toLowerCase()!==t.nodeName.toLowerCase()?null:t,t!==null?(e.stateNode=t,et=e,tt=Ft(t.firstChild),!0):!1;case 6:return t=e.pendingProps===\"\"||t.nodeType!==3?null:t,t!==null?(e.stateNode=t,et=e,tt=null,!0):!1;case 13:return t=t.nodeType!==8?null:t,t!==null?(n=tn!==null?{id:Et,overflow:Ct}:null,e.memoizedState={dehydrated:t,treeContext:n,retryLane:1073741824},n=st(18,null,null,0),n.stateNode=t,n.return=e,e.child=n,et=e,tt=null,!0):!1;default:return!1}}function Oo(e){return(e.mode&1)!==0&&(e.flags&128)===0}function Do(e){if(pe){var t=tt;if(t){var n=t;if(!as(e,t)){if(Oo(e))throw Error(d(418));t=Ft(n.nextSibling);var r=et;t&&as(e,t)?is(r,n):(e.flags=e.flags&-4097|2,pe=!1,et=e)}}else{if(Oo(e))throw Error(d(418));e.flags=e.flags&-4097|2,pe=!1,et=e}}}function ss(e){for(e=e.return;e!==null&&e.tag!==5&&e.tag!==3&&e.tag!==13;)e=e.return;et=e}function ll(e){if(e!==et)return!1;if(!pe)return ss(e),pe=!0,!1;var t;if((t=e.tag!==3)&&!(t=e.tag!==5)&&(t=e.type,t=t!==\"head\"&&t!==\"body\"&&!jo(e.type,e.memoizedProps)),t&&(t=tt)){if(Oo(e))throw us(),Error(d(418));for(;t;)is(e,t),t=Ft(t.nextSibling)}if(ss(e),e.tag===13){if(e=e.memoizedState,e=e!==null?e.dehydrated:null,!e)throw Error(d(317));e:{for(e=e.nextSibling,t=0;e;){if(e.nodeType===8){var n=e.data;if(n===\"/$\"){if(t===0){tt=Ft(e.nextSibling);break e}t--}else n!==\"$\"&&n!==\"$!\"&&n!==\"$?\"||t++}e=e.nextSibling}tt=null}}else tt=et?Ft(e.stateNode.nextSibling):null;return!0}function us(){for(var e=tt;e;)e=Ft(e.nextSibling)}function zn(){tt=et=null,pe=!1}function Fo(e){dt===null?dt=[e]:dt.push(e)}var ud=fe.ReactCurrentBatchConfig;function fr(e,t,n){if(e=n.ref,e!==null&&typeof e!=\"function\"&&typeof e!=\"object\"){if(n._owner){if(n=n._owner,n){if(n.tag!==1)throw Error(d(309));var r=n.stateNode}if(!r)throw Error(d(147,e));var l=r,o=\"\"+e;return t!==null&&t.ref!==null&&typeof t.ref==\"function\"&&t.ref._stringRef===o?t.ref:(t=function(i){var a=l.refs;i===null?delete a[o]:a[o]=i},t._stringRef=o,t)}if(typeof e!=\"string\")throw Error(d(284));if(!n._owner)throw Error(d(290,e))}return e}function ol(e,t){throw e=Object.prototype.toString.call(t),Error(d(31,e===\"[object Object]\"?\"object with keys {\"+Object.keys(t).join(\", \")+\"}\":e))}function cs(e){var t=e._init;return t(e._payload)}function ds(e){function t(f,c){if(e){var p=f.deletions;p===null?(f.deletions=[c],f.flags|=16):p.push(c)}}function n(f,c){if(!e)return null;for(;c!==null;)t(f,c),c=c.sibling;return null}function r(f,c){for(f=new Map;c!==null;)c.key!==null?f.set(c.key,c):f.set(c.index,c),c=c.sibling;return f}function l(f,c){return f=Yt(f,c),f.index=0,f.sibling=null,f}function o(f,c,p){return f.index=p,e?(p=f.alternate,p!==null?(p=p.index,p<c?(f.flags|=2,c):p):(f.flags|=2,c)):(f.flags|=1048576,c)}function i(f){return e&&f.alternate===null&&(f.flags|=2),f}function a(f,c,p,_){return c===null||c.tag!==6?(c=zi(p,f.mode,_),c.return=f,c):(c=l(c,p),c.return=f,c)}function s(f,c,p,_){var R=p.type;return R===Re?k(f,c,p.props.children,_,p.key):c!==null&&(c.elementType===R||typeof R==\"object\"&&R!==null&&R.$$typeof===Ne&&cs(R)===c.type)?(_=l(c,p.props),_.ref=fr(f,c,p),_.return=f,_):(_=Pl(p.type,p.key,p.props,null,f.mode,_),_.ref=fr(f,c,p),_.return=f,_)}function h(f,c,p,_){return c===null||c.tag!==4||c.stateNode.containerInfo!==p.containerInfo||c.stateNode.implementation!==p.implementation?(c=Pi(p,f.mode,_),c.return=f,c):(c=l(c,p.children||[]),c.return=f,c)}function k(f,c,p,_,R){return c===null||c.tag!==7?(c=dn(p,f.mode,_,R),c.return=f,c):(c=l(c,p),c.return=f,c)}function S(f,c,p){if(typeof c==\"string\"&&c!==\"\"||typeof c==\"number\")return c=zi(\"\"+c,f.mode,p),c.return=f,c;if(typeof c==\"object\"&&c!==null){switch(c.$$typeof){case Ce:return p=Pl(c.type,c.key,c.props,null,f.mode,p),p.ref=fr(f,null,c),p.return=f,p;case K:return c=Pi(c,f.mode,p),c.return=f,c;case Ne:var _=c._init;return S(f,_(c._payload),p)}if($n(c)||I(c))return c=dn(c,f.mode,p,null),c.return=f,c;ol(f,c)}return null}function w(f,c,p,_){var R=c!==null?c.key:null;if(typeof p==\"string\"&&p!==\"\"||typeof p==\"number\")return R!==null?null:a(f,c,\"\"+p,_);if(typeof p==\"object\"&&p!==null){switch(p.$$typeof){case Ce:return p.key===R?s(f,c,p,_):null;case K:return p.key===R?h(f,c,p,_):null;case Ne:return R=p._init,w(f,c,R(p._payload),_)}if($n(p)||I(p))return R!==null?null:k(f,c,p,_,null);ol(f,p)}return null}function N(f,c,p,_,R){if(typeof _==\"string\"&&_!==\"\"||typeof _==\"number\")return f=f.get(p)||null,a(c,f,\"\"+_,R);if(typeof _==\"object\"&&_!==null){switch(_.$$typeof){case Ce:return f=f.get(_.key===null?p:_.key)||null,s(c,f,_,R);case K:return f=f.get(_.key===null?p:_.key)||null,h(c,f,_,R);case Ne:var D=_._init;return N(f,c,p,D(_._payload),R)}if($n(_)||I(_))return f=f.get(p)||null,k(c,f,_,R,null);ol(c,_)}return null}function z(f,c,p,_){for(var R=null,D=null,F=c,$=c=0,De=null;F!==null&&$<p.length;$++){F.index>$?(De=F,F=null):De=F.sibling;var ne=w(f,F,p[$],_);if(ne===null){F===null&&(F=De);break}e&&F&&ne.alternate===null&&t(f,F),c=o(ne,c,$),D===null?R=ne:D.sibling=ne,D=ne,F=De}if($===p.length)return n(f,F),pe&&nn(f,$),R;if(F===null){for(;$<p.length;$++)F=S(f,p[$],_),F!==null&&(c=o(F,c,$),D===null?R=F:D.sibling=F,D=F);return pe&&nn(f,$),R}for(F=r(f,F);$<p.length;$++)De=N(F,f,$,p[$],_),De!==null&&(e&&De.alternate!==null&&F.delete(De.key===null?$:De.key),c=o(De,c,$),D===null?R=De:D.sibling=De,D=De);return e&&F.forEach(function(Xt){return t(f,Xt)}),pe&&nn(f,$),R}function P(f,c,p,_){var R=I(p);if(typeof R!=\"function\")throw Error(d(150));if(p=R.call(p),p==null)throw Error(d(151));for(var D=R=null,F=c,$=c=0,De=null,ne=p.next();F!==null&&!ne.done;$++,ne=p.next()){F.index>$?(De=F,F=null):De=F.sibling;var Xt=w(f,F,ne.value,_);if(Xt===null){F===null&&(F=De);break}e&&F&&Xt.alternate===null&&t(f,F),c=o(Xt,c,$),D===null?R=Xt:D.sibling=Xt,D=Xt,F=De}if(ne.done)return n(f,F),pe&&nn(f,$),R;if(F===null){for(;!ne.done;$++,ne=p.next())ne=S(f,ne.value,_),ne!==null&&(c=o(ne,c,$),D===null?R=ne:D.sibling=ne,D=ne);return pe&&nn(f,$),R}for(F=r(f,F);!ne.done;$++,ne=p.next())ne=N(F,f,$,ne.value,_),ne!==null&&(e&&ne.alternate!==null&&F.delete(ne.key===null?$:ne.key),c=o(ne,c,$),D===null?R=ne:D.sibling=ne,D=ne);return e&&F.forEach(function(Hd){return t(f,Hd)}),pe&&nn(f,$),R}function Ee(f,c,p,_){if(typeof p==\"object\"&&p!==null&&p.type===Re&&p.key===null&&(p=p.props.children),typeof p==\"object\"&&p!==null){switch(p.$$typeof){case Ce:e:{for(var R=p.key,D=c;D!==null;){if(D.key===R){if(R=p.type,R===Re){if(D.tag===7){n(f,D.sibling),c=l(D,p.props.children),c.return=f,f=c;break e}}else if(D.elementType===R||typeof R==\"object\"&&R!==null&&R.$$typeof===Ne&&cs(R)===D.type){n(f,D.sibling),c=l(D,p.props),c.ref=fr(f,D,p),c.return=f,f=c;break e}n(f,D);break}else t(f,D);D=D.sibling}p.type===Re?(c=dn(p.props.children,f.mode,_,p.key),c.return=f,f=c):(_=Pl(p.type,p.key,p.props,null,f.mode,_),_.ref=fr(f,c,p),_.return=f,f=_)}return i(f);case K:e:{for(D=p.key;c!==null;){if(c.key===D)if(c.tag===4&&c.stateNode.containerInfo===p.containerInfo&&c.stateNode.implementation===p.implementation){n(f,c.sibling),c=l(c,p.children||[]),c.return=f,f=c;break e}else{n(f,c);break}else t(f,c);c=c.sibling}c=Pi(p,f.mode,_),c.return=f,f=c}return i(f);case Ne:return D=p._init,Ee(f,c,D(p._payload),_)}if($n(p))return z(f,c,p,_);if(I(p))return P(f,c,p,_);ol(f,p)}return typeof p==\"string\"&&p!==\"\"||typeof p==\"number\"?(p=\"\"+p,c!==null&&c.tag===6?(n(f,c.sibling),c=l(c,p),c.return=f,f=c):(n(f,c),c=zi(p,f.mode,_),c.return=f,f=c),i(f)):n(f,c)}return Ee}var Pn=ds(!0),fs=ds(!1),il=bt(null),al=null,Tn=null,bo=null;function Uo(){bo=Tn=al=null}function Ao(e){var t=il.current;de(il),e._currentValue=t}function $o(e,t,n){for(;e!==null;){var r=e.alternate;if((e.childLanes&t)!==t?(e.childLanes|=t,r!==null&&(r.childLanes|=t)):r!==null&&(r.childLanes&t)!==t&&(r.childLanes|=t),e===n)break;e=e.return}}function Rn(e,t){al=e,bo=Tn=null,e=e.dependencies,e!==null&&e.firstContext!==null&&((e.lanes&t)!==0&&(Xe=!0),e.firstContext=null)}function ot(e){var t=e._currentValue;if(bo!==e)if(e={context:e,memoizedValue:t,next:null},Tn===null){if(al===null)throw Error(d(308));Tn=e,al.dependencies={lanes:0,firstContext:e}}else Tn=Tn.next=e;return t}var rn=null;function Ho(e){rn===null?rn=[e]:rn.push(e)}function ps(e,t,n,r){var l=t.interleaved;return l===null?(n.next=n,Ho(t)):(n.next=l.next,l.next=n),t.interleaved=n,Nt(e,r)}function Nt(e,t){e.lanes|=t;var n=e.alternate;for(n!==null&&(n.lanes|=t),n=e,e=e.return;e!==null;)e.childLanes|=t,n=e.alternate,n!==null&&(n.childLanes|=t),n=e,e=e.return;return n.tag===3?n.stateNode:null}var $t=!1;function Vo(e){e.updateQueue={baseState:e.memoizedState,firstBaseUpdate:null,lastBaseUpdate:null,shared:{pending:null,interleaved:null,lanes:0},effects:null}}function hs(e,t){e=e.updateQueue,t.updateQueue===e&&(t.updateQueue={baseState:e.baseState,firstBaseUpdate:e.firstBaseUpdate,lastBaseUpdate:e.lastBaseUpdate,shared:e.shared,effects:e.effects})}function jt(e,t){return{eventTime:e,lane:t,tag:0,payload:null,callback:null,next:null}}function Ht(e,t,n){var r=e.updateQueue;if(r===null)return null;if(r=r.shared,(te&2)!==0){var l=r.pending;return l===null?t.next=t:(t.next=l.next,l.next=t),r.pending=t,Nt(e,n)}return l=r.interleaved,l===null?(t.next=t,Ho(r)):(t.next=l.next,l.next=t),r.interleaved=t,Nt(e,n)}function sl(e,t,n){if(t=t.updateQueue,t!==null&&(t=t.shared,(n&4194240)!==0)){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,no(e,n)}}function ms(e,t){var n=e.updateQueue,r=e.alternate;if(r!==null&&(r=r.updateQueue,n===r)){var l=null,o=null;if(n=n.firstBaseUpdate,n!==null){do{var i={eventTime:n.eventTime,lane:n.lane,tag:n.tag,payload:n.payload,callback:n.callback,next:null};o===null?l=o=i:o=o.next=i,n=n.next}while(n!==null);o===null?l=o=t:o=o.next=t}else l=o=t;n={baseState:r.baseState,firstBaseUpdate:l,lastBaseUpdate:o,shared:r.shared,effects:r.effects},e.updateQueue=n;return}e=n.lastBaseUpdate,e===null?n.firstBaseUpdate=t:e.next=t,n.lastBaseUpdate=t}function ul(e,t,n,r){var l=e.updateQueue;$t=!1;var o=l.firstBaseUpdate,i=l.lastBaseUpdate,a=l.shared.pending;if(a!==null){l.shared.pending=null;var s=a,h=s.next;s.next=null,i===null?o=h:i.next=h,i=s;var k=e.alternate;k!==null&&(k=k.updateQueue,a=k.lastBaseUpdate,a!==i&&(a===null?k.firstBaseUpdate=h:a.next=h,k.lastBaseUpdate=s))}if(o!==null){var S=l.baseState;i=0,k=h=s=null,a=o;do{var w=a.lane,N=a.eventTime;if((r&w)===w){k!==null&&(k=k.next={eventTime:N,lane:0,tag:a.tag,payload:a.payload,callback:a.callback,next:null});e:{var z=e,P=a;switch(w=t,N=n,P.tag){case 1:if(z=P.payload,typeof z==\"function\"){S=z.call(N,S,w);break e}S=z;break e;case 3:z.flags=z.flags&-65537|128;case 0:if(z=P.payload,w=typeof z==\"function\"?z.call(N,S,w):z,w==null)break e;S=g({},S,w);break e;case 2:$t=!0}}a.callback!==null&&a.lane!==0&&(e.flags|=64,w=l.effects,w===null?l.effects=[a]:w.push(a))}else N={eventTime:N,lane:w,tag:a.tag,payload:a.payload,callback:a.callback,next:null},k===null?(h=k=N,s=S):k=k.next=N,i|=w;if(a=a.next,a===null){if(a=l.shared.pending,a===null)break;w=a,a=w.next,w.next=null,l.lastBaseUpdate=w,l.shared.pending=null}}while(!0);if(k===null&&(s=S),l.baseState=s,l.firstBaseUpdate=h,l.lastBaseUpdate=k,t=l.shared.interleaved,t!==null){l=t;do i|=l.lane,l=l.next;while(l!==t)}else o===null&&(l.shared.lanes=0);an|=i,e.lanes=i,e.memoizedState=S}}function gs(e,t,n){if(e=t.effects,t.effects=null,e!==null)for(t=0;t<e.length;t++){var r=e[t],l=r.callback;if(l!==null){if(r.callback=null,r=n,typeof l!=\"function\")throw Error(d(191,l));l.call(r)}}}var pr={},wt=bt(pr),hr=bt(pr),mr=bt(pr);function ln(e){if(e===pr)throw Error(d(174));return e}function Wo(e,t){switch(se(mr,t),se(hr,e),se(wt,pr),e=t.nodeType,e){case 9:case 11:t=(t=t.documentElement)?t.namespaceURI:Wl(null,\"\");break;default:e=e===8?t.parentNode:t,t=e.namespaceURI||null,e=e.tagName,t=Wl(t,e)}de(wt),se(wt,t)}function Ln(){de(wt),de(hr),de(mr)}function vs(e){ln(mr.current);var t=ln(wt.current),n=Wl(t,e.type);t!==n&&(se(hr,e),se(wt,n))}function Bo(e){hr.current===e&&(de(wt),de(hr))}var ve=bt(0);function cl(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 Qo=[];function Ko(){for(var e=0;e<Qo.length;e++)Qo[e]._workInProgressVersionPrimary=null;Qo.length=0}var dl=fe.ReactCurrentDispatcher,Yo=fe.ReactCurrentBatchConfig,on=0,ye=null,Pe=null,Me=null,fl=!1,gr=!1,vr=0,cd=0;function $e(){throw Error(d(321))}function Xo(e,t){if(t===null)return!1;for(var n=0;n<t.length&&n<e.length;n++)if(!ct(e[n],t[n]))return!1;return!0}function Go(e,t,n,r,l,o){if(on=o,ye=t,t.memoizedState=null,t.updateQueue=null,t.lanes=0,dl.current=e===null||e.memoizedState===null?hd:md,e=n(r,l),gr){o=0;do{if(gr=!1,vr=0,25<=o)throw Error(d(301));o+=1,Me=Pe=null,t.updateQueue=null,dl.current=gd,e=n(r,l)}while(gr)}if(dl.current=ml,t=Pe!==null&&Pe.next!==null,on=0,Me=Pe=ye=null,fl=!1,t)throw Error(d(300));return e}function Zo(){var e=vr!==0;return vr=0,e}function kt(){var e={memoizedState:null,baseState:null,baseQueue:null,queue:null,next:null};return Me===null?ye.memoizedState=Me=e:Me=Me.next=e,Me}function it(){if(Pe===null){var e=ye.alternate;e=e!==null?e.memoizedState:null}else e=Pe.next;var t=Me===null?ye.memoizedState:Me.next;if(t!==null)Me=t,Pe=e;else{if(e===null)throw Error(d(310));Pe=e,e={memoizedState:Pe.memoizedState,baseState:Pe.baseState,baseQueue:Pe.baseQueue,queue:Pe.queue,next:null},Me===null?ye.memoizedState=Me=e:Me=Me.next=e}return Me}function yr(e,t){return typeof t==\"function\"?t(e):t}function Jo(e){var t=it(),n=t.queue;if(n===null)throw Error(d(311));n.lastRenderedReducer=e;var r=Pe,l=r.baseQueue,o=n.pending;if(o!==null){if(l!==null){var i=l.next;l.next=o.next,o.next=i}r.baseQueue=l=o,n.pending=null}if(l!==null){o=l.next,r=r.baseState;var a=i=null,s=null,h=o;do{var k=h.lane;if((on&k)===k)s!==null&&(s=s.next={lane:0,action:h.action,hasEagerState:h.hasEagerState,eagerState:h.eagerState,next:null}),r=h.hasEagerState?h.eagerState:e(r,h.action);else{var S={lane:k,action:h.action,hasEagerState:h.hasEagerState,eagerState:h.eagerState,next:null};s===null?(a=s=S,i=r):s=s.next=S,ye.lanes|=k,an|=k}h=h.next}while(h!==null&&h!==o);s===null?i=r:s.next=a,ct(r,t.memoizedState)||(Xe=!0),t.memoizedState=r,t.baseState=i,t.baseQueue=s,n.lastRenderedState=r}if(e=n.interleaved,e!==null){l=e;do o=l.lane,ye.lanes|=o,an|=o,l=l.next;while(l!==e)}else l===null&&(n.lanes=0);return[t.memoizedState,n.dispatch]}function qo(e){var t=it(),n=t.queue;if(n===null)throw Error(d(311));n.lastRenderedReducer=e;var r=n.dispatch,l=n.pending,o=t.memoizedState;if(l!==null){n.pending=null;var i=l=l.next;do o=e(o,i.action),i=i.next;while(i!==l);ct(o,t.memoizedState)||(Xe=!0),t.memoizedState=o,t.baseQueue===null&&(t.baseState=o),n.lastRenderedState=o}return[o,r]}function ys(){}function ws(e,t){var n=ye,r=it(),l=t(),o=!ct(r.memoizedState,l);if(o&&(r.memoizedState=l,Xe=!0),r=r.queue,ei(Ss.bind(null,n,r,e),[e]),r.getSnapshot!==t||o||Me!==null&&Me.memoizedState.tag&1){if(n.flags|=2048,wr(9,xs.bind(null,n,r,l,t),void 0,null),Oe===null)throw Error(d(349));(on&30)!==0||ks(n,t,l)}return l}function ks(e,t,n){e.flags|=16384,e={getSnapshot:t,value:n},t=ye.updateQueue,t===null?(t={lastEffect:null,stores:null},ye.updateQueue=t,t.stores=[e]):(n=t.stores,n===null?t.stores=[e]:n.push(e))}function xs(e,t,n,r){t.value=n,t.getSnapshot=r,_s(t)&&Es(e)}function Ss(e,t,n){return n(function(){_s(t)&&Es(e)})}function _s(e){var t=e.getSnapshot;e=e.value;try{var n=t();return!ct(e,n)}catch{return!0}}function Es(e){var t=Nt(e,1);t!==null&&mt(t,e,1,-1)}function Cs(e){var t=kt();return typeof e==\"function\"&&(e=e()),t.memoizedState=t.baseState=e,e={pending:null,interleaved:null,lanes:0,dispatch:null,lastRenderedReducer:yr,lastRenderedState:e},t.queue=e,e=e.dispatch=pd.bind(null,ye,e),[t.memoizedState,e]}function wr(e,t,n,r){return e={tag:e,create:t,destroy:n,deps:r,next:null},t=ye.updateQueue,t===null?(t={lastEffect:null,stores:null},ye.updateQueue=t,t.lastEffect=e.next=e):(n=t.lastEffect,n===null?t.lastEffect=e.next=e:(r=n.next,n.next=e,e.next=r,t.lastEffect=e)),e}function Ns(){return it().memoizedState}function pl(e,t,n,r){var l=kt();ye.flags|=e,l.memoizedState=wr(1|t,n,void 0,r===void 0?null:r)}function hl(e,t,n,r){var l=it();r=r===void 0?null:r;var o=void 0;if(Pe!==null){var i=Pe.memoizedState;if(o=i.destroy,r!==null&&Xo(r,i.deps)){l.memoizedState=wr(t,n,o,r);return}}ye.flags|=e,l.memoizedState=wr(1|t,n,o,r)}function js(e,t){return pl(8390656,8,e,t)}function ei(e,t){return hl(2048,8,e,t)}function zs(e,t){return hl(4,2,e,t)}function Ps(e,t){return hl(4,4,e,t)}function Ts(e,t){if(typeof t==\"function\")return e=e(),t(e),function(){t(null)};if(t!=null)return e=e(),t.current=e,function(){t.current=null}}function Rs(e,t,n){return n=n!=null?n.concat([e]):null,hl(4,4,Ts.bind(null,t,e),n)}function ti(){}function Ls(e,t){var n=it();t=t===void 0?null:t;var r=n.memoizedState;return r!==null&&t!==null&&Xo(t,r[1])?r[0]:(n.memoizedState=[e,t],e)}function Is(e,t){var n=it();t=t===void 0?null:t;var r=n.memoizedState;return r!==null&&t!==null&&Xo(t,r[1])?r[0]:(e=e(),n.memoizedState=[e,t],e)}function Ms(e,t,n){return(on&21)===0?(e.baseState&&(e.baseState=!1,Xe=!0),e.memoizedState=n):(ct(n,t)||(n=ca(),ye.lanes|=n,an|=n,e.baseState=!0),t)}function dd(e,t){var n=le;le=n!==0&&4>n?n:4,e(!0);var r=Yo.transition;Yo.transition={};try{e(!1),t()}finally{le=n,Yo.transition=r}}function Os(){return it().memoizedState}function fd(e,t,n){var r=Qt(e);if(n={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null},Ds(e))Fs(t,n);else if(n=ps(e,t,n,r),n!==null){var l=Be();mt(n,e,r,l),bs(n,t,r)}}function pd(e,t,n){var r=Qt(e),l={lane:r,action:n,hasEagerState:!1,eagerState:null,next:null};if(Ds(e))Fs(t,l);else{var o=e.alternate;if(e.lanes===0&&(o===null||o.lanes===0)&&(o=t.lastRenderedReducer,o!==null))try{var i=t.lastRenderedState,a=o(i,n);if(l.hasEagerState=!0,l.eagerState=a,ct(a,i)){var s=t.interleaved;s===null?(l.next=l,Ho(t)):(l.next=s.next,s.next=l),t.interleaved=l;return}}catch{}finally{}n=ps(e,t,l,r),n!==null&&(l=Be(),mt(n,e,r,l),bs(n,t,r))}}function Ds(e){var t=e.alternate;return e===ye||t!==null&&t===ye}function Fs(e,t){gr=fl=!0;var n=e.pending;n===null?t.next=t:(t.next=n.next,n.next=t),e.pending=t}function bs(e,t,n){if((n&4194240)!==0){var r=t.lanes;r&=e.pendingLanes,n|=r,t.lanes=n,no(e,n)}}var ml={readContext:ot,useCallback:$e,useContext:$e,useEffect:$e,useImperativeHandle:$e,useInsertionEffect:$e,useLayoutEffect:$e,useMemo:$e,useReducer:$e,useRef:$e,useState:$e,useDebugValue:$e,useDeferredValue:$e,useTransition:$e,useMutableSource:$e,useSyncExternalStore:$e,useId:$e,unstable_isNewReconciler:!1},hd={readContext:ot,useCallback:function(e,t){return kt().memoizedState=[e,t===void 0?null:t],e},useContext:ot,useEffect:js,useImperativeHandle:function(e,t,n){return n=n!=null?n.concat([e]):null,pl(4194308,4,Ts.bind(null,t,e),n)},useLayoutEffect:function(e,t){return pl(4194308,4,e,t)},useInsertionEffect:function(e,t){return pl(4,2,e,t)},useMemo:function(e,t){var n=kt();return t=t===void 0?null:t,e=e(),n.memoizedState=[e,t],e},useReducer:function(e,t,n){var r=kt();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=fd.bind(null,ye,e),[r.memoizedState,e]},useRef:function(e){var t=kt();return e={current:e},t.memoizedState=e},useState:Cs,useDebugValue:ti,useDeferredValue:function(e){return kt().memoizedState=e},useTransition:function(){var e=Cs(!1),t=e[0];return e=dd.bind(null,e[1]),kt().memoizedState=e,[t,e]},useMutableSource:function(){},useSyncExternalStore:function(e,t,n){var r=ye,l=kt();if(pe){if(n===void 0)throw Error(d(407));n=n()}else{if(n=t(),Oe===null)throw Error(d(349));(on&30)!==0||ks(r,t,n)}l.memoizedState=n;var o={value:n,getSnapshot:t};return l.queue=o,js(Ss.bind(null,r,o,e),[e]),r.flags|=2048,wr(9,xs.bind(null,r,o,n,t),void 0,null),n},useId:function(){var e=kt(),t=Oe.identifierPrefix;if(pe){var n=Ct,r=Et;n=(r&~(1<<32-ut(r)-1)).toString(32)+n,t=\":\"+t+\"R\"+n,n=vr++,0<n&&(t+=\"H\"+n.toString(32)),t+=\":\"}else n=cd++,t=\":\"+t+\"r\"+n.toString(32)+\":\";return e.memoizedState=t},unstable_isNewReconciler:!1},md={readContext:ot,useCallback:Ls,useContext:ot,useEffect:ei,useImperativeHandle:Rs,useInsertionEffect:zs,useLayoutEffect:Ps,useMemo:Is,useReducer:Jo,useRef:Ns,useState:function(){return Jo(yr)},useDebugValue:ti,useDeferredValue:function(e){var t=it();return Ms(t,Pe.memoizedState,e)},useTransition:function(){var e=Jo(yr)[0],t=it().memoizedState;return[e,t]},useMutableSource:ys,useSyncExternalStore:ws,useId:Os,unstable_isNewReconciler:!1},gd={readContext:ot,useCallback:Ls,useContext:ot,useEffect:ei,useImperativeHandle:Rs,useInsertionEffect:zs,useLayoutEffect:Ps,useMemo:Is,useReducer:qo,useRef:Ns,useState:function(){return qo(yr)},useDebugValue:ti,useDeferredValue:function(e){var t=it();return Pe===null?t.memoizedState=e:Ms(t,Pe.memoizedState,e)},useTransition:function(){var e=qo(yr)[0],t=it().memoizedState;return[e,t]},useMutableSource:ys,useSyncExternalStore:ws,useId:Os,unstable_isNewReconciler:!1};function ft(e,t){if(e&&e.defaultProps){t=g({},t),e=e.defaultProps;for(var n in e)t[n]===void 0&&(t[n]=e[n]);return t}return t}function ni(e,t,n,r){t=e.memoizedState,n=n(r,t),n=n==null?t:g({},t,n),e.memoizedState=n,e.lanes===0&&(e.updateQueue.baseState=n)}var gl={isMounted:function(e){return(e=e._reactInternals)?Jt(e)===e:!1},enqueueSetState:function(e,t,n){e=e._reactInternals;var r=Be(),l=Qt(e),o=jt(r,l);o.payload=t,n!=null&&(o.callback=n),t=Ht(e,o,l),t!==null&&(mt(t,e,l,r),sl(t,e,l))},enqueueReplaceState:function(e,t,n){e=e._reactInternals;var r=Be(),l=Qt(e),o=jt(r,l);o.tag=1,o.payload=t,n!=null&&(o.callback=n),t=Ht(e,o,l),t!==null&&(mt(t,e,l,r),sl(t,e,l))},enqueueForceUpdate:function(e,t){e=e._reactInternals;var n=Be(),r=Qt(e),l=jt(n,r);l.tag=2,t!=null&&(l.callback=t),t=Ht(e,l,r),t!==null&&(mt(t,e,r,n),sl(t,e,r))}};function Us(e,t,n,r,l,o,i){return e=e.stateNode,typeof e.shouldComponentUpdate==\"function\"?e.shouldComponentUpdate(r,o,i):t.prototype&&t.prototype.isPureReactComponent?!or(n,r)||!or(l,o):!0}function As(e,t,n){var r=!1,l=Ut,o=t.contextType;return typeof o==\"object\"&&o!==null?o=ot(o):(l=Ye(t)?en:Ae.current,r=t.contextTypes,o=(r=r!=null)?Cn(e,l):Ut),t=new t(n,o),e.memoizedState=t.state!==null&&t.state!==void 0?t.state:null,t.updater=gl,e.stateNode=t,t._reactInternals=e,r&&(e=e.stateNode,e.__reactInternalMemoizedUnmaskedChildContext=l,e.__reactInternalMemoizedMaskedChildContext=o),t}function $s(e,t,n,r){e=t.state,typeof t.componentWillReceiveProps==\"function\"&&t.componentWillReceiveProps(n,r),typeof t.UNSAFE_componentWillReceiveProps==\"function\"&&t.UNSAFE_componentWillReceiveProps(n,r),t.state!==e&&gl.enqueueReplaceState(t,t.state,null)}function ri(e,t,n,r){var l=e.stateNode;l.props=n,l.state=e.memoizedState,l.refs={},Vo(e);var o=t.contextType;typeof o==\"object\"&&o!==null?l.context=ot(o):(o=Ye(t)?en:Ae.current,l.context=Cn(e,o)),l.state=e.memoizedState,o=t.getDerivedStateFromProps,typeof o==\"function\"&&(ni(e,t,o,n),l.state=e.memoizedState),typeof t.getDerivedStateFromProps==\"function\"||typeof l.getSnapshotBeforeUpdate==\"function\"||typeof l.UNSAFE_componentWillMount!=\"function\"&&typeof l.componentWillMount!=\"function\"||(t=l.state,typeof l.componentWillMount==\"function\"&&l.componentWillMount(),typeof l.UNSAFE_componentWillMount==\"function\"&&l.UNSAFE_componentWillMount(),t!==l.state&&gl.enqueueReplaceState(l,l.state,null),ul(e,n,l,r),l.state=e.memoizedState),typeof l.componentDidMount==\"function\"&&(e.flags|=4194308)}function In(e,t){try{var n=\"\",r=t;do n+=X(r),r=r.return;while(r);var l=n}catch(o){l=`\nError generating stack: `+o.message+`\n`+o.stack}return{value:e,source:t,stack:l,digest:null}}function li(e,t,n){return{value:e,source:null,stack:n??null,digest:t??null}}function oi(e,t){try{console.error(t.value)}catch(n){setTimeout(function(){throw n})}}var vd=typeof WeakMap==\"function\"?WeakMap:Map;function Hs(e,t,n){n=jt(-1,n),n.tag=3,n.payload={element:null};var r=t.value;return n.callback=function(){_l||(_l=!0,ki=r),oi(e,t)},n}function Vs(e,t,n){n=jt(-1,n),n.tag=3;var r=e.type.getDerivedStateFromError;if(typeof r==\"function\"){var l=t.value;n.payload=function(){return r(l)},n.callback=function(){oi(e,t)}}var o=e.stateNode;return o!==null&&typeof o.componentDidCatch==\"function\"&&(n.callback=function(){oi(e,t),typeof r!=\"function\"&&(Wt===null?Wt=new Set([this]):Wt.add(this));var i=t.stack;this.componentDidCatch(t.value,{componentStack:i!==null?i:\"\"})}),n}function Ws(e,t,n){var r=e.pingCache;if(r===null){r=e.pingCache=new vd;var l=new Set;r.set(t,l)}else l=r.get(t),l===void 0&&(l=new Set,r.set(t,l));l.has(n)||(l.add(n),e=Rd.bind(null,e,t,n),t.then(e,e))}function Bs(e){do{var t;if((t=e.tag===13)&&(t=e.memoizedState,t=t!==null?t.dehydrated!==null:!0),t)return e;e=e.return}while(e!==null);return null}function Qs(e,t,n,r,l){return(e.mode&1)===0?(e===t?e.flags|=65536:(e.flags|=128,n.flags|=131072,n.flags&=-52805,n.tag===1&&(n.alternate===null?n.tag=17:(t=jt(-1,1),t.tag=2,Ht(n,t,1))),n.lanes|=1),e):(e.flags|=65536,e.lanes=l,e)}var yd=fe.ReactCurrentOwner,Xe=!1;function We(e,t,n,r){t.child=e===null?fs(t,null,n,r):Pn(t,e.child,n,r)}function Ks(e,t,n,r,l){n=n.render;var o=t.ref;return Rn(t,l),r=Go(e,t,n,r,o,l),n=Zo(),e!==null&&!Xe?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~l,zt(e,t,l)):(pe&&n&&Io(t),t.flags|=1,We(e,t,r,l),t.child)}function Ys(e,t,n,r,l){if(e===null){var o=n.type;return typeof o==\"function\"&&!ji(o)&&o.defaultProps===void 0&&n.compare===null&&n.defaultProps===void 0?(t.tag=15,t.type=o,Xs(e,t,o,r,l)):(e=Pl(n.type,null,r,t,t.mode,l),e.ref=t.ref,e.return=t,t.child=e)}if(o=e.child,(e.lanes&l)===0){var i=o.memoizedProps;if(n=n.compare,n=n!==null?n:or,n(i,r)&&e.ref===t.ref)return zt(e,t,l)}return t.flags|=1,e=Yt(o,r),e.ref=t.ref,e.return=t,t.child=e}function Xs(e,t,n,r,l){if(e!==null){var o=e.memoizedProps;if(or(o,r)&&e.ref===t.ref)if(Xe=!1,t.pendingProps=r=o,(e.lanes&l)!==0)(e.flags&131072)!==0&&(Xe=!0);else return t.lanes=e.lanes,zt(e,t,l)}return ii(e,t,n,r,l)}function Gs(e,t,n){var r=t.pendingProps,l=r.children,o=e!==null?e.memoizedState:null;if(r.mode===\"hidden\")if((t.mode&1)===0)t.memoizedState={baseLanes:0,cachePool:null,transitions:null},se(On,nt),nt|=n;else{if((n&1073741824)===0)return e=o!==null?o.baseLanes|n:n,t.lanes=t.childLanes=1073741824,t.memoizedState={baseLanes:e,cachePool:null,transitions:null},t.updateQueue=null,se(On,nt),nt|=e,null;t.memoizedState={baseLanes:0,cachePool:null,transitions:null},r=o!==null?o.baseLanes:n,se(On,nt),nt|=r}else o!==null?(r=o.baseLanes|n,t.memoizedState=null):r=n,se(On,nt),nt|=r;return We(e,t,l,n),t.child}function Zs(e,t){var n=t.ref;(e===null&&n!==null||e!==null&&e.ref!==n)&&(t.flags|=512,t.flags|=2097152)}function ii(e,t,n,r,l){var o=Ye(n)?en:Ae.current;return o=Cn(t,o),Rn(t,l),n=Go(e,t,n,r,o,l),r=Zo(),e!==null&&!Xe?(t.updateQueue=e.updateQueue,t.flags&=-2053,e.lanes&=~l,zt(e,t,l)):(pe&&r&&Io(t),t.flags|=1,We(e,t,n,l),t.child)}function Js(e,t,n,r,l){if(Ye(n)){var o=!0;el(t)}else o=!1;if(Rn(t,l),t.stateNode===null)yl(e,t),As(t,n,r),ri(t,n,r,l),r=!0;else if(e===null){var i=t.stateNode,a=t.memoizedProps;i.props=a;var s=i.context,h=n.contextType;typeof h==\"object\"&&h!==null?h=ot(h):(h=Ye(n)?en:Ae.current,h=Cn(t,h));var k=n.getDerivedStateFromProps,S=typeof k==\"function\"||typeof i.getSnapshotBeforeUpdate==\"function\";S||typeof i.UNSAFE_componentWillReceiveProps!=\"function\"&&typeof i.componentWillReceiveProps!=\"function\"||(a!==r||s!==h)&&$s(t,i,r,h),$t=!1;var w=t.memoizedState;i.state=w,ul(t,r,i,l),s=t.memoizedState,a!==r||w!==s||Ke.current||$t?(typeof k==\"function\"&&(ni(t,n,k,r),s=t.memoizedState),(a=$t||Us(t,n,a,r,w,s,h))?(S||typeof i.UNSAFE_componentWillMount!=\"function\"&&typeof i.componentWillMount!=\"function\"||(typeof i.componentWillMount==\"function\"&&i.componentWillMount(),typeof i.UNSAFE_componentWillMount==\"function\"&&i.UNSAFE_componentWillMount()),typeof i.componentDidMount==\"function\"&&(t.flags|=4194308)):(typeof i.componentDidMount==\"function\"&&(t.flags|=4194308),t.memoizedProps=r,t.memoizedState=s),i.props=r,i.state=s,i.context=h,r=a):(typeof i.componentDidMount==\"function\"&&(t.flags|=4194308),r=!1)}else{i=t.stateNode,hs(e,t),a=t.memoizedProps,h=t.type===t.elementType?a:ft(t.type,a),i.props=h,S=t.pendingProps,w=i.context,s=n.contextType,typeof s==\"object\"&&s!==null?s=ot(s):(s=Ye(n)?en:Ae.current,s=Cn(t,s));var N=n.getDerivedStateFromProps;(k=typeof N==\"function\"||typeof i.getSnapshotBeforeUpdate==\"function\")||typeof i.UNSAFE_componentWillReceiveProps!=\"function\"&&typeof i.componentWillReceiveProps!=\"function\"||(a!==S||w!==s)&&$s(t,i,r,s),$t=!1,w=t.memoizedState,i.state=w,ul(t,r,i,l);var z=t.memoizedState;a!==S||w!==z||Ke.current||$t?(typeof N==\"function\"&&(ni(t,n,N,r),z=t.memoizedState),(h=$t||Us(t,n,h,r,w,z,s)||!1)?(k||typeof i.UNSAFE_componentWillUpdate!=\"function\"&&typeof i.componentWillUpdate!=\"function\"||(typeof i.componentWillUpdate==\"function\"&&i.componentWillUpdate(r,z,s),typeof i.UNSAFE_componentWillUpdate==\"function\"&&i.UNSAFE_componentWillUpdate(r,z,s)),typeof i.componentDidUpdate==\"function\"&&(t.flags|=4),typeof i.getSnapshotBeforeUpdate==\"function\"&&(t.flags|=1024)):(typeof i.componentDidUpdate!=\"function\"||a===e.memoizedProps&&w===e.memoizedState||(t.flags|=4),typeof i.getSnapshotBeforeUpdate!=\"function\"||a===e.memoizedProps&&w===e.memoizedState||(t.flags|=1024),t.memoizedProps=r,t.memoizedState=z),i.props=r,i.state=z,i.context=s,r=h):(typeof i.componentDidUpdate!=\"function\"||a===e.memoizedProps&&w===e.memoizedState||(t.flags|=4),typeof i.getSnapshotBeforeUpdate!=\"function\"||a===e.memoizedProps&&w===e.memoizedState||(t.flags|=1024),r=!1)}return ai(e,t,n,r,o,l)}function ai(e,t,n,r,l,o){Zs(e,t);var i=(t.flags&128)!==0;if(!r&&!i)return l&&rs(t,n,!1),zt(e,t,o);r=t.stateNode,yd.current=t;var a=i&&typeof n.getDerivedStateFromError!=\"function\"?null:r.render();return t.flags|=1,e!==null&&i?(t.child=Pn(t,e.child,null,o),t.child=Pn(t,null,a,o)):We(e,t,a,o),t.memoizedState=r.state,l&&rs(t,n,!0),t.child}function qs(e){var t=e.stateNode;t.pendingContext?ts(e,t.pendingContext,t.pendingContext!==t.context):t.context&&ts(e,t.context,!1),Wo(e,t.containerInfo)}function eu(e,t,n,r,l){return zn(),Fo(l),t.flags|=256,We(e,t,n,r),t.child}var si={dehydrated:null,treeContext:null,retryLane:0};function ui(e){return{baseLanes:e,cachePool:null,transitions:null}}function tu(e,t,n){var r=t.pendingProps,l=ve.current,o=!1,i=(t.flags&128)!==0,a;if((a=i)||(a=e!==null&&e.memoizedState===null?!1:(l&2)!==0),a?(o=!0,t.flags&=-129):(e===null||e.memoizedState!==null)&&(l|=1),se(ve,l&1),e===null)return Do(t),e=t.memoizedState,e!==null&&(e=e.dehydrated,e!==null)?((t.mode&1)===0?t.lanes=1:e.data===\"$!\"?t.lanes=8:t.lanes=1073741824,null):(i=r.children,e=r.fallback,o?(r=t.mode,o=t.child,i={mode:\"hidden\",children:i},(r&1)===0&&o!==null?(o.childLanes=0,o.pendingProps=i):o=Tl(i,r,0,null),e=dn(e,r,n,null),o.return=t,e.return=t,o.sibling=e,t.child=o,t.child.memoizedState=ui(n),t.memoizedState=si,e):ci(t,i));if(l=e.memoizedState,l!==null&&(a=l.dehydrated,a!==null))return wd(e,t,i,r,a,l,n);if(o){o=r.fallback,i=t.mode,l=e.child,a=l.sibling;var s={mode:\"hidden\",children:r.children};return(i&1)===0&&t.child!==l?(r=t.child,r.childLanes=0,r.pendingProps=s,t.deletions=null):(r=Yt(l,s),r.subtreeFlags=l.subtreeFlags&14680064),a!==null?o=Yt(a,o):(o=dn(o,i,n,null),o.flags|=2),o.return=t,r.return=t,r.sibling=o,t.child=r,r=o,o=t.child,i=e.child.memoizedState,i=i===null?ui(n):{baseLanes:i.baseLanes|n,cachePool:null,transitions:i.transitions},o.memoizedState=i,o.childLanes=e.childLanes&~n,t.memoizedState=si,r}return o=e.child,e=o.sibling,r=Yt(o,{mode:\"visible\",children:r.children}),(t.mode&1)===0&&(r.lanes=n),r.return=t,r.sibling=null,e!==null&&(n=t.deletions,n===null?(t.deletions=[e],t.flags|=16):n.push(e)),t.child=r,t.memoizedState=null,r}function ci(e,t){return t=Tl({mode:\"visible\",children:t},e.mode,0,null),t.return=e,e.child=t}function vl(e,t,n,r){return r!==null&&Fo(r),Pn(t,e.child,null,n),e=ci(t,t.pendingProps.children),e.flags|=2,t.memoizedState=null,e}function wd(e,t,n,r,l,o,i){if(n)return t.flags&256?(t.flags&=-257,r=li(Error(d(422))),vl(e,t,i,r)):t.memoizedState!==null?(t.child=e.child,t.flags|=128,null):(o=r.fallback,l=t.mode,r=Tl({mode:\"visible\",children:r.children},l,0,null),o=dn(o,l,i,null),o.flags|=2,r.return=t,o.return=t,r.sibling=o,t.child=r,(t.mode&1)!==0&&Pn(t,e.child,null,i),t.child.memoizedState=ui(i),t.memoizedState=si,o);if((t.mode&1)===0)return vl(e,t,i,null);if(l.data===\"$!\"){if(r=l.nextSibling&&l.nextSibling.dataset,r)var a=r.dgst;return r=a,o=Error(d(419)),r=li(o,r,void 0),vl(e,t,i,r)}if(a=(i&e.childLanes)!==0,Xe||a){if(r=Oe,r!==null){switch(i&-i){case 4:l=2;break;case 16:l=8;break;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:case 4194304:case 8388608:case 16777216:case 33554432:case 67108864:l=32;break;case 536870912:l=268435456;break;default:l=0}l=(l&(r.suspendedLanes|i))!==0?0:l,l!==0&&l!==o.retryLane&&(o.retryLane=l,Nt(e,l),mt(r,e,l,-1))}return Ni(),r=li(Error(d(421))),vl(e,t,i,r)}return l.data===\"$?\"?(t.flags|=128,t.child=e.child,t=Ld.bind(null,e),l._reactRetry=t,null):(e=o.treeContext,tt=Ft(l.nextSibling),et=t,pe=!0,dt=null,e!==null&&(rt[lt++]=Et,rt[lt++]=Ct,rt[lt++]=tn,Et=e.id,Ct=e.overflow,tn=t),t=ci(t,r.children),t.flags|=4096,t)}function nu(e,t,n){e.lanes|=t;var r=e.alternate;r!==null&&(r.lanes|=t),$o(e.return,t,n)}function di(e,t,n,r,l){var o=e.memoizedState;o===null?e.memoizedState={isBackwards:t,rendering:null,renderingStartTime:0,last:r,tail:n,tailMode:l}:(o.isBackwards=t,o.rendering=null,o.renderingStartTime=0,o.last=r,o.tail=n,o.tailMode=l)}function ru(e,t,n){var r=t.pendingProps,l=r.revealOrder,o=r.tail;if(We(e,t,r.children,n),r=ve.current,(r&2)!==0)r=r&1|2,t.flags|=128;else{if(e!==null&&(e.flags&128)!==0)e:for(e=t.child;e!==null;){if(e.tag===13)e.memoizedState!==null&&nu(e,n,t);else if(e.tag===19)nu(e,n,t);else if(e.child!==null){e.child.return=e,e=e.child;continue}if(e===t)break e;for(;e.sibling===null;){if(e.return===null||e.return===t)break e;e=e.return}e.sibling.return=e.return,e=e.sibling}r&=1}if(se(ve,r),(t.mode&1)===0)t.memoizedState=null;else switch(l){case\"forwards\":for(n=t.child,l=null;n!==null;)e=n.alternate,e!==null&&cl(e)===null&&(l=n),n=n.sibling;n=l,n===null?(l=t.child,t.child=null):(l=n.sibling,n.sibling=null),di(t,!1,l,n,o);break;case\"backwards\":for(n=null,l=t.child,t.child=null;l!==null;){if(e=l.alternate,e!==null&&cl(e)===null){t.child=l;break}e=l.sibling,l.sibling=n,n=l,l=e}di(t,!0,n,null,o);break;case\"together\":di(t,!1,null,null,void 0);break;default:t.memoizedState=null}return t.child}function yl(e,t){(t.mode&1)===0&&e!==null&&(e.alternate=null,t.alternate=null,t.flags|=2)}function zt(e,t,n){if(e!==null&&(t.dependencies=e.dependencies),an|=t.lanes,(n&t.childLanes)===0)return null;if(e!==null&&t.child!==e.child)throw Error(d(153));if(t.child!==null){for(e=t.child,n=Yt(e,e.pendingProps),t.child=n,n.return=t;e.sibling!==null;)e=e.sibling,n=n.sibling=Yt(e,e.pendingProps),n.return=t;n.sibling=null}return t.child}function kd(e,t,n){switch(t.tag){case 3:qs(t),zn();break;case 5:vs(t);break;case 1:Ye(t.type)&&el(t);break;case 4:Wo(t,t.stateNode.containerInfo);break;case 10:var r=t.type._context,l=t.memoizedProps.value;se(il,r._currentValue),r._currentValue=l;break;case 13:if(r=t.memoizedState,r!==null)return r.dehydrated!==null?(se(ve,ve.current&1),t.flags|=128,null):(n&t.child.childLanes)!==0?tu(e,t,n):(se(ve,ve.current&1),e=zt(e,t,n),e!==null?e.sibling:null);se(ve,ve.current&1);break;case 19:if(r=(n&t.childLanes)!==0,(e.flags&128)!==0){if(r)return ru(e,t,n);t.flags|=128}if(l=t.memoizedState,l!==null&&(l.rendering=null,l.tail=null,l.lastEffect=null),se(ve,ve.current),r)break;return null;case 22:case 23:return t.lanes=0,Gs(e,t,n)}return zt(e,t,n)}var lu,fi,ou,iu;lu=function(e,t){for(var n=t.child;n!==null;){if(n.tag===5||n.tag===6)e.appendChild(n.stateNode);else if(n.tag!==4&&n.child!==null){n.child.return=n,n=n.child;continue}if(n===t)break;for(;n.sibling===null;){if(n.return===null||n.return===t)return;n=n.return}n.sibling.return=n.return,n=n.sibling}},fi=function(){},ou=function(e,t,n,r){var l=e.memoizedProps;if(l!==r){e=t.stateNode,ln(wt.current);var o=null;switch(n){case\"input\":l=An(e,l),r=An(e,r),o=[];break;case\"select\":l=g({},l,{value:void 0}),r=g({},r,{value:void 0}),o=[];break;case\"textarea\":l=Vl(e,l),r=Vl(e,r),o=[];break;default:typeof l.onClick!=\"function\"&&typeof r.onClick==\"function\"&&(e.onclick=Zr)}Bl(n,r);var i;n=null;for(h in l)if(!r.hasOwnProperty(h)&&l.hasOwnProperty(h)&&l[h]!=null)if(h===\"style\"){var a=l[h];for(i in a)a.hasOwnProperty(i)&&(n||(n={}),n[i]=\"\")}else h!==\"dangerouslySetInnerHTML\"&&h!==\"children\"&&h!==\"suppressContentEditableWarning\"&&h!==\"suppressHydrationWarning\"&&h!==\"autoFocus\"&&(T.hasOwnProperty(h)?o||(o=[]):(o=o||[]).push(h,null));for(h in r){var s=r[h];if(a=l?.[h],r.hasOwnProperty(h)&&s!==a&&(s!=null||a!=null))if(h===\"style\")if(a){for(i in a)!a.hasOwnProperty(i)||s&&s.hasOwnProperty(i)||(n||(n={}),n[i]=\"\");for(i in s)s.hasOwnProperty(i)&&a[i]!==s[i]&&(n||(n={}),n[i]=s[i])}else n||(o||(o=[]),o.push(h,n)),n=s;else h===\"dangerouslySetInnerHTML\"?(s=s?s.__html:void 0,a=a?a.__html:void 0,s!=null&&a!==s&&(o=o||[]).push(h,s)):h===\"children\"?typeof s!=\"string\"&&typeof s!=\"number\"||(o=o||[]).push(h,\"\"+s):h!==\"suppressContentEditableWarning\"&&h!==\"suppressHydrationWarning\"&&(T.hasOwnProperty(h)?(s!=null&&h===\"onScroll\"&&ce(\"scroll\",e),o||a===s||(o=[])):(o=o||[]).push(h,s))}n&&(o=o||[]).push(\"style\",n);var h=o;(t.updateQueue=h)&&(t.flags|=4)}},iu=function(e,t,n,r){n!==r&&(t.flags|=4)};function kr(e,t){if(!pe)switch(e.tailMode){case\"hidden\":t=e.tail;for(var n=null;t!==null;)t.alternate!==null&&(n=t),t=t.sibling;n===null?e.tail=null:n.sibling=null;break;case\"collapsed\":n=e.tail;for(var r=null;n!==null;)n.alternate!==null&&(r=n),n=n.sibling;r===null?t||e.tail===null?e.tail=null:e.tail.sibling=null:r.sibling=null}}function He(e){var t=e.alternate!==null&&e.alternate.child===e.child,n=0,r=0;if(t)for(var l=e.child;l!==null;)n|=l.lanes|l.childLanes,r|=l.subtreeFlags&14680064,r|=l.flags&14680064,l.return=e,l=l.sibling;else for(l=e.child;l!==null;)n|=l.lanes|l.childLanes,r|=l.subtreeFlags,r|=l.flags,l.return=e,l=l.sibling;return e.subtreeFlags|=r,e.childLanes=n,t}function xd(e,t,n){var r=t.pendingProps;switch(Mo(t),t.tag){case 2:case 16:case 15:case 0:case 11:case 7:case 8:case 12:case 9:case 14:return He(t),null;case 1:return Ye(t.type)&&qr(),He(t),null;case 3:return r=t.stateNode,Ln(),de(Ke),de(Ae),Ko(),r.pendingContext&&(r.context=r.pendingContext,r.pendingContext=null),(e===null||e.child===null)&&(ll(t)?t.flags|=4:e===null||e.memoizedState.isDehydrated&&(t.flags&256)===0||(t.flags|=1024,dt!==null&&(_i(dt),dt=null))),fi(e,t),He(t),null;case 5:Bo(t);var l=ln(mr.current);if(n=t.type,e!==null&&t.stateNode!=null)ou(e,t,n,r,l),e.ref!==t.ref&&(t.flags|=512,t.flags|=2097152);else{if(!r){if(t.stateNode===null)throw Error(d(166));return He(t),null}if(e=ln(wt.current),ll(t)){r=t.stateNode,n=t.type;var o=t.memoizedProps;switch(r[yt]=t,r[cr]=o,e=(t.mode&1)!==0,n){case\"dialog\":ce(\"cancel\",r),ce(\"close\",r);break;case\"iframe\":case\"object\":case\"embed\":ce(\"load\",r);break;case\"video\":case\"audio\":for(l=0;l<ar.length;l++)ce(ar[l],r);break;case\"source\":ce(\"error\",r);break;case\"img\":case\"image\":case\"link\":ce(\"error\",r),ce(\"load\",r);break;case\"details\":ce(\"toggle\",r);break;case\"input\":Zt(r,o),ce(\"invalid\",r);break;case\"select\":r._wrapperState={wasMultiple:!!o.multiple},ce(\"invalid\",r);break;case\"textarea\":Vi(r,o),ce(\"invalid\",r)}Bl(n,o),l=null;for(var i in o)if(o.hasOwnProperty(i)){var a=o[i];i===\"children\"?typeof a==\"string\"?r.textContent!==a&&(o.suppressHydrationWarning!==!0&&Gr(r.textContent,a,e),l=[\"children\",a]):typeof a==\"number\"&&r.textContent!==\"\"+a&&(o.suppressHydrationWarning!==!0&&Gr(r.textContent,a,e),l=[\"children\",\"\"+a]):T.hasOwnProperty(i)&&a!=null&&i===\"onScroll\"&&ce(\"scroll\",r)}switch(n){case\"input\":fn(r),Hi(r,o,!0);break;case\"textarea\":fn(r),Bi(r);break;case\"select\":case\"option\":break;default:typeof o.onClick==\"function\"&&(r.onclick=Zr)}r=l,t.updateQueue=r,r!==null&&(t.flags|=4)}else{i=l.nodeType===9?l:l.ownerDocument,e===\"http://www.w3.org/1999/xhtml\"&&(e=Qi(n)),e===\"http://www.w3.org/1999/xhtml\"?n===\"script\"?(e=i.createElement(\"div\"),e.innerHTML=\"<script><\\/script>\",e=e.removeChild(e.firstChild)):typeof r.is==\"string\"?e=i.createElement(n,{is:r.is}):(e=i.createElement(n),n===\"select\"&&(i=e,r.multiple?i.multiple=!0:r.size&&(i.size=r.size))):e=i.createElementNS(e,n),e[yt]=t,e[cr]=r,lu(e,t,!1,!1),t.stateNode=e;e:{switch(i=Ql(n,r),n){case\"dialog\":ce(\"cancel\",e),ce(\"close\",e),l=r;break;case\"iframe\":case\"object\":case\"embed\":ce(\"load\",e),l=r;break;case\"video\":case\"audio\":for(l=0;l<ar.length;l++)ce(ar[l],e);l=r;break;case\"source\":ce(\"error\",e),l=r;break;case\"img\":case\"image\":case\"link\":ce(\"error\",e),ce(\"load\",e),l=r;break;case\"details\":ce(\"toggle\",e),l=r;break;case\"input\":Zt(e,r),l=An(e,r),ce(\"invalid\",e);break;case\"option\":l=r;break;case\"select\":e._wrapperState={wasMultiple:!!r.multiple},l=g({},r,{value:void 0}),ce(\"invalid\",e);break;case\"textarea\":Vi(e,r),l=Vl(e,r),ce(\"invalid\",e);break;default:l=r}Bl(n,l),a=l;for(o in a)if(a.hasOwnProperty(o)){var s=a[o];o===\"style\"?Xi(e,s):o===\"dangerouslySetInnerHTML\"?(s=s?s.__html:void 0,s!=null&&Ki(e,s)):o===\"children\"?typeof s==\"string\"?(n!==\"textarea\"||s!==\"\")&&Hn(e,s):typeof s==\"number\"&&Hn(e,\"\"+s):o!==\"suppressContentEditableWarning\"&&o!==\"suppressHydrationWarning\"&&o!==\"autoFocus\"&&(T.hasOwnProperty(o)?s!=null&&o===\"onScroll\"&&ce(\"scroll\",e):s!=null&&ke(e,o,s,i))}switch(n){case\"input\":fn(e),Hi(e,r,!1);break;case\"textarea\":fn(e),Bi(e);break;case\"option\":r.value!=null&&e.setAttribute(\"value\",\"\"+ee(r.value));break;case\"select\":e.multiple=!!r.multiple,o=r.value,o!=null?pn(e,!!r.multiple,o,!1):r.defaultValue!=null&&pn(e,!!r.multiple,r.defaultValue,!0);break;default:typeof l.onClick==\"function\"&&(e.onclick=Zr)}switch(n){case\"button\":case\"input\":case\"select\":case\"textarea\":r=!!r.autoFocus;break e;case\"img\":r=!0;break e;default:r=!1}}r&&(t.flags|=4)}t.ref!==null&&(t.flags|=512,t.flags|=2097152)}return He(t),null;case 6:if(e&&t.stateNode!=null)iu(e,t,e.memoizedProps,r);else{if(typeof r!=\"string\"&&t.stateNode===null)throw Error(d(166));if(n=ln(mr.current),ln(wt.current),ll(t)){if(r=t.stateNode,n=t.memoizedProps,r[yt]=t,(o=r.nodeValue!==n)&&(e=et,e!==null))switch(e.tag){case 3:Gr(r.nodeValue,n,(e.mode&1)!==0);break;case 5:e.memoizedProps.suppressHydrationWarning!==!0&&Gr(r.nodeValue,n,(e.mode&1)!==0)}o&&(t.flags|=4)}else r=(n.nodeType===9?n:n.ownerDocument).createTextNode(r),r[yt]=t,t.stateNode=r}return He(t),null;case 13:if(de(ve),r=t.memoizedState,e===null||e.memoizedState!==null&&e.memoizedState.dehydrated!==null){if(pe&&tt!==null&&(t.mode&1)!==0&&(t.flags&128)===0)us(),zn(),t.flags|=98560,o=!1;else if(o=ll(t),r!==null&&r.dehydrated!==null){if(e===null){if(!o)throw Error(d(318));if(o=t.memoizedState,o=o!==null?o.dehydrated:null,!o)throw Error(d(317));o[yt]=t}else zn(),(t.flags&128)===0&&(t.memoizedState=null),t.flags|=4;He(t),o=!1}else dt!==null&&(_i(dt),dt=null),o=!0;if(!o)return t.flags&65536?t:null}return(t.flags&128)!==0?(t.lanes=n,t):(r=r!==null,r!==(e!==null&&e.memoizedState!==null)&&r&&(t.child.flags|=8192,(t.mode&1)!==0&&(e===null||(ve.current&1)!==0?Te===0&&(Te=3):Ni())),t.updateQueue!==null&&(t.flags|=4),He(t),null);case 4:return Ln(),fi(e,t),e===null&&sr(t.stateNode.containerInfo),He(t),null;case 10:return Ao(t.type._context),He(t),null;case 17:return Ye(t.type)&&qr(),He(t),null;case 19:if(de(ve),o=t.memoizedState,o===null)return He(t),null;if(r=(t.flags&128)!==0,i=o.rendering,i===null)if(r)kr(o,!1);else{if(Te!==0||e!==null&&(e.flags&128)!==0)for(e=t.child;e!==null;){if(i=cl(e),i!==null){for(t.flags|=128,kr(o,!1),r=i.updateQueue,r!==null&&(t.updateQueue=r,t.flags|=4),t.subtreeFlags=0,r=n,n=t.child;n!==null;)o=n,e=r,o.flags&=14680066,i=o.alternate,i===null?(o.childLanes=0,o.lanes=e,o.child=null,o.subtreeFlags=0,o.memoizedProps=null,o.memoizedState=null,o.updateQueue=null,o.dependencies=null,o.stateNode=null):(o.childLanes=i.childLanes,o.lanes=i.lanes,o.child=i.child,o.subtreeFlags=0,o.deletions=null,o.memoizedProps=i.memoizedProps,o.memoizedState=i.memoizedState,o.updateQueue=i.updateQueue,o.type=i.type,e=i.dependencies,o.dependencies=e===null?null:{lanes:e.lanes,firstContext:e.firstContext}),n=n.sibling;return se(ve,ve.current&1|2),t.child}e=e.sibling}o.tail!==null&&_e()>Dn&&(t.flags|=128,r=!0,kr(o,!1),t.lanes=4194304)}else{if(!r)if(e=cl(i),e!==null){if(t.flags|=128,r=!0,n=e.updateQueue,n!==null&&(t.updateQueue=n,t.flags|=4),kr(o,!0),o.tail===null&&o.tailMode===\"hidden\"&&!i.alternate&&!pe)return He(t),null}else 2*_e()-o.renderingStartTime>Dn&&n!==1073741824&&(t.flags|=128,r=!0,kr(o,!1),t.lanes=4194304);o.isBackwards?(i.sibling=t.child,t.child=i):(n=o.last,n!==null?n.sibling=i:t.child=i,o.last=i)}return o.tail!==null?(t=o.tail,o.rendering=t,o.tail=t.sibling,o.renderingStartTime=_e(),t.sibling=null,n=ve.current,se(ve,r?n&1|2:n&1),t):(He(t),null);case 22:case 23:return Ci(),r=t.memoizedState!==null,e!==null&&e.memoizedState!==null!==r&&(t.flags|=8192),r&&(t.mode&1)!==0?(nt&1073741824)!==0&&(He(t),t.subtreeFlags&6&&(t.flags|=8192)):He(t),null;case 24:return null;case 25:return null}throw Error(d(156,t.tag))}function Sd(e,t){switch(Mo(t),t.tag){case 1:return Ye(t.type)&&qr(),e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 3:return Ln(),de(Ke),de(Ae),Ko(),e=t.flags,(e&65536)!==0&&(e&128)===0?(t.flags=e&-65537|128,t):null;case 5:return Bo(t),null;case 13:if(de(ve),e=t.memoizedState,e!==null&&e.dehydrated!==null){if(t.alternate===null)throw Error(d(340));zn()}return e=t.flags,e&65536?(t.flags=e&-65537|128,t):null;case 19:return de(ve),null;case 4:return Ln(),null;case 10:return Ao(t.type._context),null;case 22:case 23:return Ci(),null;case 24:return null;default:return null}}var wl=!1,Ve=!1,_d=typeof WeakSet==\"function\"?WeakSet:Set,j=null;function Mn(e,t){var n=e.ref;if(n!==null)if(typeof n==\"function\")try{n(null)}catch(r){Se(e,t,r)}else n.current=null}function pi(e,t,n){try{n()}catch(r){Se(e,t,r)}}var au=!1;function Ed(e,t){if(Co=Ur,e=Ua(),vo(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 l=r.anchorOffset,o=r.focusNode;r=r.focusOffset;try{n.nodeType,o.nodeType}catch{n=null;break e}var i=0,a=-1,s=-1,h=0,k=0,S=e,w=null;t:for(;;){for(var N;S!==n||l!==0&&S.nodeType!==3||(a=i+l),S!==o||r!==0&&S.nodeType!==3||(s=i+r),S.nodeType===3&&(i+=S.nodeValue.length),(N=S.firstChild)!==null;)w=S,S=N;for(;;){if(S===e)break t;if(w===n&&++h===l&&(a=i),w===o&&++k===r&&(s=i),(N=S.nextSibling)!==null)break;S=w,w=S.parentNode}S=N}n=a===-1||s===-1?null:{start:a,end:s}}else n=null}n=n||{start:0,end:0}}else n=null;for(No={focusedElem:e,selectionRange:n},Ur=!1,j=t;j!==null;)if(t=j,e=t.child,(t.subtreeFlags&1028)!==0&&e!==null)e.return=t,j=e;else for(;j!==null;){t=j;try{var z=t.alternate;if((t.flags&1024)!==0)switch(t.tag){case 0:case 11:case 15:break;case 1:if(z!==null){var P=z.memoizedProps,Ee=z.memoizedState,f=t.stateNode,c=f.getSnapshotBeforeUpdate(t.elementType===t.type?P:ft(t.type,P),Ee);f.__reactInternalSnapshotBeforeUpdate=c}break;case 3:var p=t.stateNode.containerInfo;p.nodeType===1?p.textContent=\"\":p.nodeType===9&&p.documentElement&&p.removeChild(p.documentElement);break;case 5:case 6:case 4:case 17:break;default:throw Error(d(163))}}catch(_){Se(t,t.return,_)}if(e=t.sibling,e!==null){e.return=t.return,j=e;break}j=t.return}return z=au,au=!1,z}function xr(e,t,n){var r=t.updateQueue;if(r=r!==null?r.lastEffect:null,r!==null){var l=r=r.next;do{if((l.tag&e)===e){var o=l.destroy;l.destroy=void 0,o!==void 0&&pi(t,n,o)}l=l.next}while(l!==r)}}function kl(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 hi(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 su(e){var t=e.alternate;t!==null&&(e.alternate=null,su(t)),e.child=null,e.deletions=null,e.sibling=null,e.tag===5&&(t=e.stateNode,t!==null&&(delete t[yt],delete t[cr],delete t[To],delete t[id],delete t[ad])),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 uu(e){return e.tag===5||e.tag===3||e.tag===4}function cu(e){e:for(;;){for(;e.sibling===null;){if(e.return===null||uu(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 mi(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=Zr));else if(r!==4&&(e=e.child,e!==null))for(mi(e,t,n),e=e.sibling;e!==null;)mi(e,t,n),e=e.sibling}function gi(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(gi(e,t,n),e=e.sibling;e!==null;)gi(e,t,n),e=e.sibling}var Fe=null,pt=!1;function Vt(e,t,n){for(n=n.child;n!==null;)du(e,t,n),n=n.sibling}function du(e,t,n){if(vt&&typeof vt.onCommitFiberUnmount==\"function\")try{vt.onCommitFiberUnmount(Ir,n)}catch{}switch(n.tag){case 5:Ve||Mn(n,t);case 6:var r=Fe,l=pt;Fe=null,Vt(e,t,n),Fe=r,pt=l,Fe!==null&&(pt?(e=Fe,n=n.stateNode,e.nodeType===8?e.parentNode.removeChild(n):e.removeChild(n)):Fe.removeChild(n.stateNode));break;case 18:Fe!==null&&(pt?(e=Fe,n=n.stateNode,e.nodeType===8?Po(e.parentNode,n):e.nodeType===1&&Po(e,n),qn(e)):Po(Fe,n.stateNode));break;case 4:r=Fe,l=pt,Fe=n.stateNode.containerInfo,pt=!0,Vt(e,t,n),Fe=r,pt=l;break;case 0:case 11:case 14:case 15:if(!Ve&&(r=n.updateQueue,r!==null&&(r=r.lastEffect,r!==null))){l=r=r.next;do{var o=l,i=o.destroy;o=o.tag,i!==void 0&&((o&2)!==0||(o&4)!==0)&&pi(n,t,i),l=l.next}while(l!==r)}Vt(e,t,n);break;case 1:if(!Ve&&(Mn(n,t),r=n.stateNode,typeof r.componentWillUnmount==\"function\"))try{r.props=n.memoizedProps,r.state=n.memoizedState,r.componentWillUnmount()}catch(a){Se(n,t,a)}Vt(e,t,n);break;case 21:Vt(e,t,n);break;case 22:n.mode&1?(Ve=(r=Ve)||n.memoizedState!==null,Vt(e,t,n),Ve=r):Vt(e,t,n);break;default:Vt(e,t,n)}}function fu(e){var t=e.updateQueue;if(t!==null){e.updateQueue=null;var n=e.stateNode;n===null&&(n=e.stateNode=new _d),t.forEach(function(r){var l=Id.bind(null,e,r);n.has(r)||(n.add(r),r.then(l,l))})}}function ht(e,t){var n=t.deletions;if(n!==null)for(var r=0;r<n.length;r++){var l=n[r];try{var o=e,i=t,a=i;e:for(;a!==null;){switch(a.tag){case 5:Fe=a.stateNode,pt=!1;break e;case 3:Fe=a.stateNode.containerInfo,pt=!0;break e;case 4:Fe=a.stateNode.containerInfo,pt=!0;break e}a=a.return}if(Fe===null)throw Error(d(160));du(o,i,l),Fe=null,pt=!1;var s=l.alternate;s!==null&&(s.return=null),l.return=null}catch(h){Se(l,t,h)}}if(t.subtreeFlags&12854)for(t=t.child;t!==null;)pu(t,e),t=t.sibling}function pu(e,t){var n=e.alternate,r=e.flags;switch(e.tag){case 0:case 11:case 14:case 15:if(ht(t,e),xt(e),r&4){try{xr(3,e,e.return),kl(3,e)}catch(P){Se(e,e.return,P)}try{xr(5,e,e.return)}catch(P){Se(e,e.return,P)}}break;case 1:ht(t,e),xt(e),r&512&&n!==null&&Mn(n,n.return);break;case 5:if(ht(t,e),xt(e),r&512&&n!==null&&Mn(n,n.return),e.flags&32){var l=e.stateNode;try{Hn(l,\"\")}catch(P){Se(e,e.return,P)}}if(r&4&&(l=e.stateNode,l!=null)){var o=e.memoizedProps,i=n!==null?n.memoizedProps:o,a=e.type,s=e.updateQueue;if(e.updateQueue=null,s!==null)try{a===\"input\"&&o.type===\"radio\"&&o.name!=null&&$i(l,o),Ql(a,i);var h=Ql(a,o);for(i=0;i<s.length;i+=2){var k=s[i],S=s[i+1];k===\"style\"?Xi(l,S):k===\"dangerouslySetInnerHTML\"?Ki(l,S):k===\"children\"?Hn(l,S):ke(l,k,S,h)}switch(a){case\"input\":$l(l,o);break;case\"textarea\":Wi(l,o);break;case\"select\":var w=l._wrapperState.wasMultiple;l._wrapperState.wasMultiple=!!o.multiple;var N=o.value;N!=null?pn(l,!!o.multiple,N,!1):w!==!!o.multiple&&(o.defaultValue!=null?pn(l,!!o.multiple,o.defaultValue,!0):pn(l,!!o.multiple,o.multiple?[]:\"\",!1))}l[cr]=o}catch(P){Se(e,e.return,P)}}break;case 6:if(ht(t,e),xt(e),r&4){if(e.stateNode===null)throw Error(d(162));l=e.stateNode,o=e.memoizedProps;try{l.nodeValue=o}catch(P){Se(e,e.return,P)}}break;case 3:if(ht(t,e),xt(e),r&4&&n!==null&&n.memoizedState.isDehydrated)try{qn(t.containerInfo)}catch(P){Se(e,e.return,P)}break;case 4:ht(t,e),xt(e);break;case 13:ht(t,e),xt(e),l=e.child,l.flags&8192&&(o=l.memoizedState!==null,l.stateNode.isHidden=o,!o||l.alternate!==null&&l.alternate.memoizedState!==null||(wi=_e())),r&4&&fu(e);break;case 22:if(k=n!==null&&n.memoizedState!==null,e.mode&1?(Ve=(h=Ve)||k,ht(t,e),Ve=h):ht(t,e),xt(e),r&8192){if(h=e.memoizedState!==null,(e.stateNode.isHidden=h)&&!k&&(e.mode&1)!==0)for(j=e,k=e.child;k!==null;){for(S=j=k;j!==null;){switch(w=j,N=w.child,w.tag){case 0:case 11:case 14:case 15:xr(4,w,w.return);break;case 1:Mn(w,w.return);var z=w.stateNode;if(typeof z.componentWillUnmount==\"function\"){r=w,n=w.return;try{t=r,z.props=t.memoizedProps,z.state=t.memoizedState,z.componentWillUnmount()}catch(P){Se(r,n,P)}}break;case 5:Mn(w,w.return);break;case 22:if(w.memoizedState!==null){gu(S);continue}}N!==null?(N.return=w,j=N):gu(S)}k=k.sibling}e:for(k=null,S=e;;){if(S.tag===5){if(k===null){k=S;try{l=S.stateNode,h?(o=l.style,typeof o.setProperty==\"function\"?o.setProperty(\"display\",\"none\",\"important\"):o.display=\"none\"):(a=S.stateNode,s=S.memoizedProps.style,i=s!=null&&s.hasOwnProperty(\"display\")?s.display:null,a.style.display=Yi(\"display\",i))}catch(P){Se(e,e.return,P)}}}else if(S.tag===6){if(k===null)try{S.stateNode.nodeValue=h?\"\":S.memoizedProps}catch(P){Se(e,e.return,P)}}else if((S.tag!==22&&S.tag!==23||S.memoizedState===null||S===e)&&S.child!==null){S.child.return=S,S=S.child;continue}if(S===e)break e;for(;S.sibling===null;){if(S.return===null||S.return===e)break e;k===S&&(k=null),S=S.return}k===S&&(k=null),S.sibling.return=S.return,S=S.sibling}}break;case 19:ht(t,e),xt(e),r&4&&fu(e);break;case 21:break;default:ht(t,e),xt(e)}}function xt(e){var t=e.flags;if(t&2){try{e:{for(var n=e.return;n!==null;){if(uu(n)){var r=n;break e}n=n.return}throw Error(d(160))}switch(r.tag){case 5:var l=r.stateNode;r.flags&32&&(Hn(l,\"\"),r.flags&=-33);var o=cu(e);gi(e,o,l);break;case 3:case 4:var i=r.stateNode.containerInfo,a=cu(e);mi(e,a,i);break;default:throw Error(d(161))}}catch(s){Se(e,e.return,s)}e.flags&=-3}t&4096&&(e.flags&=-4097)}function Cd(e,t,n){j=e,hu(e)}function hu(e,t,n){for(var r=(e.mode&1)!==0;j!==null;){var l=j,o=l.child;if(l.tag===22&&r){var i=l.memoizedState!==null||wl;if(!i){var a=l.alternate,s=a!==null&&a.memoizedState!==null||Ve;a=wl;var h=Ve;if(wl=i,(Ve=s)&&!h)for(j=l;j!==null;)i=j,s=i.child,i.tag===22&&i.memoizedState!==null?vu(l):s!==null?(s.return=i,j=s):vu(l);for(;o!==null;)j=o,hu(o),o=o.sibling;j=l,wl=a,Ve=h}mu(e)}else(l.subtreeFlags&8772)!==0&&o!==null?(o.return=l,j=o):mu(e)}}function mu(e){for(;j!==null;){var t=j;if((t.flags&8772)!==0){var n=t.alternate;try{if((t.flags&8772)!==0)switch(t.tag){case 0:case 11:case 15:Ve||kl(5,t);break;case 1:var r=t.stateNode;if(t.flags&4&&!Ve)if(n===null)r.componentDidMount();else{var l=t.elementType===t.type?n.memoizedProps:ft(t.type,n.memoizedProps);r.componentDidUpdate(l,n.memoizedState,r.__reactInternalSnapshotBeforeUpdate)}var o=t.updateQueue;o!==null&&gs(t,o,r);break;case 3:var i=t.updateQueue;if(i!==null){if(n=null,t.child!==null)switch(t.child.tag){case 5:n=t.child.stateNode;break;case 1:n=t.child.stateNode}gs(t,i,n)}break;case 5:var a=t.stateNode;if(n===null&&t.flags&4){n=a;var s=t.memoizedProps;switch(t.type){case\"button\":case\"input\":case\"select\":case\"textarea\":s.autoFocus&&n.focus();break;case\"img\":s.src&&(n.src=s.src)}}break;case 6:break;case 4:break;case 12:break;case 13:if(t.memoizedState===null){var h=t.alternate;if(h!==null){var k=h.memoizedState;if(k!==null){var S=k.dehydrated;S!==null&&qn(S)}}}break;case 19:case 17:case 21:case 22:case 23:case 25:break;default:throw Error(d(163))}Ve||t.flags&512&&hi(t)}catch(w){Se(t,t.return,w)}}if(t===e){j=null;break}if(n=t.sibling,n!==null){n.return=t.return,j=n;break}j=t.return}}function gu(e){for(;j!==null;){var t=j;if(t===e){j=null;break}var n=t.sibling;if(n!==null){n.return=t.return,j=n;break}j=t.return}}function vu(e){for(;j!==null;){var t=j;try{switch(t.tag){case 0:case 11:case 15:var n=t.return;try{kl(4,t)}catch(s){Se(t,n,s)}break;case 1:var r=t.stateNode;if(typeof r.componentDidMount==\"function\"){var l=t.return;try{r.componentDidMount()}catch(s){Se(t,l,s)}}var o=t.return;try{hi(t)}catch(s){Se(t,o,s)}break;case 5:var i=t.return;try{hi(t)}catch(s){Se(t,i,s)}}}catch(s){Se(t,t.return,s)}if(t===e){j=null;break}var a=t.sibling;if(a!==null){a.return=t.return,j=a;break}j=t.return}}var Nd=Math.ceil,xl=fe.ReactCurrentDispatcher,vi=fe.ReactCurrentOwner,at=fe.ReactCurrentBatchConfig,te=0,Oe=null,je=null,be=0,nt=0,On=bt(0),Te=0,Sr=null,an=0,Sl=0,yi=0,_r=null,Ge=null,wi=0,Dn=1/0,Pt=null,_l=!1,ki=null,Wt=null,El=!1,Bt=null,Cl=0,Er=0,xi=null,Nl=-1,jl=0;function Be(){return(te&6)!==0?_e():Nl!==-1?Nl:Nl=_e()}function Qt(e){return(e.mode&1)===0?1:(te&2)!==0&&be!==0?be&-be:ud.transition!==null?(jl===0&&(jl=ca()),jl):(e=le,e!==0||(e=window.event,e=e===void 0?16:wa(e.type)),e)}function mt(e,t,n,r){if(50<Er)throw Er=0,xi=null,Error(d(185));Yn(e,n,r),((te&2)===0||e!==Oe)&&(e===Oe&&((te&2)===0&&(Sl|=n),Te===4&&Kt(e,be)),Ze(e,r),n===1&&te===0&&(t.mode&1)===0&&(Dn=_e()+500,tl&&At()))}function Ze(e,t){var n=e.callbackNode;uc(e,t);var r=Dr(e,e===Oe?be:0);if(r===0)n!==null&&aa(n),e.callbackNode=null,e.callbackPriority=0;else if(t=r&-r,e.callbackPriority!==t){if(n!=null&&aa(n),t===1)e.tag===0?sd(wu.bind(null,e)):ls(wu.bind(null,e)),ld(function(){(te&6)===0&&At()}),n=null;else{switch(da(r)){case 1:n=ql;break;case 4:n=sa;break;case 16:n=Lr;break;case 536870912:n=ua;break;default:n=Lr}n=ju(n,yu.bind(null,e))}e.callbackPriority=t,e.callbackNode=n}}function yu(e,t){if(Nl=-1,jl=0,(te&6)!==0)throw Error(d(327));var n=e.callbackNode;if(Fn()&&e.callbackNode!==n)return null;var r=Dr(e,e===Oe?be:0);if(r===0)return null;if((r&30)!==0||(r&e.expiredLanes)!==0||t)t=zl(e,r);else{t=r;var l=te;te|=2;var o=xu();(Oe!==e||be!==t)&&(Pt=null,Dn=_e()+500,un(e,t));do try{Pd();break}catch(a){ku(e,a)}while(!0);Uo(),xl.current=o,te=l,je!==null?t=0:(Oe=null,be=0,t=Te)}if(t!==0){if(t===2&&(l=eo(e),l!==0&&(r=l,t=Si(e,l))),t===1)throw n=Sr,un(e,0),Kt(e,r),Ze(e,_e()),n;if(t===6)Kt(e,r);else{if(l=e.current.alternate,(r&30)===0&&!jd(l)&&(t=zl(e,r),t===2&&(o=eo(e),o!==0&&(r=o,t=Si(e,o))),t===1))throw n=Sr,un(e,0),Kt(e,r),Ze(e,_e()),n;switch(e.finishedWork=l,e.finishedLanes=r,t){case 0:case 1:throw Error(d(345));case 2:cn(e,Ge,Pt);break;case 3:if(Kt(e,r),(r&130023424)===r&&(t=wi+500-_e(),10<t)){if(Dr(e,0)!==0)break;if(l=e.suspendedLanes,(l&r)!==r){Be(),e.pingedLanes|=e.suspendedLanes&l;break}e.timeoutHandle=zo(cn.bind(null,e,Ge,Pt),t);break}cn(e,Ge,Pt);break;case 4:if(Kt(e,r),(r&4194240)===r)break;for(t=e.eventTimes,l=-1;0<r;){var i=31-ut(r);o=1<<i,i=t[i],i>l&&(l=i),r&=~o}if(r=l,r=_e()-r,r=(120>r?120:480>r?480:1080>r?1080:1920>r?1920:3e3>r?3e3:4320>r?4320:1960*Nd(r/1960))-r,10<r){e.timeoutHandle=zo(cn.bind(null,e,Ge,Pt),r);break}cn(e,Ge,Pt);break;case 5:cn(e,Ge,Pt);break;default:throw Error(d(329))}}}return Ze(e,_e()),e.callbackNode===n?yu.bind(null,e):null}function Si(e,t){var n=_r;return e.current.memoizedState.isDehydrated&&(un(e,t).flags|=256),e=zl(e,t),e!==2&&(t=Ge,Ge=n,t!==null&&_i(t)),e}function _i(e){Ge===null?Ge=e:Ge.push.apply(Ge,e)}function jd(e){for(var t=e;;){if(t.flags&16384){var n=t.updateQueue;if(n!==null&&(n=n.stores,n!==null))for(var r=0;r<n.length;r++){var l=n[r],o=l.getSnapshot;l=l.value;try{if(!ct(o(),l))return!1}catch{return!1}}}if(n=t.child,t.subtreeFlags&16384&&n!==null)n.return=t,t=n;else{if(t===e)break;for(;t.sibling===null;){if(t.return===null||t.return===e)return!0;t=t.return}t.sibling.return=t.return,t=t.sibling}}return!0}function Kt(e,t){for(t&=~yi,t&=~Sl,e.suspendedLanes|=t,e.pingedLanes&=~t,e=e.expirationTimes;0<t;){var n=31-ut(t),r=1<<n;e[n]=-1,t&=~r}}function wu(e){if((te&6)!==0)throw Error(d(327));Fn();var t=Dr(e,0);if((t&1)===0)return Ze(e,_e()),null;var n=zl(e,t);if(e.tag!==0&&n===2){var r=eo(e);r!==0&&(t=r,n=Si(e,r))}if(n===1)throw n=Sr,un(e,0),Kt(e,t),Ze(e,_e()),n;if(n===6)throw Error(d(345));return e.finishedWork=e.current.alternate,e.finishedLanes=t,cn(e,Ge,Pt),Ze(e,_e()),null}function Ei(e,t){var n=te;te|=1;try{return e(t)}finally{te=n,te===0&&(Dn=_e()+500,tl&&At())}}function sn(e){Bt!==null&&Bt.tag===0&&(te&6)===0&&Fn();var t=te;te|=1;var n=at.transition,r=le;try{if(at.transition=null,le=1,e)return e()}finally{le=r,at.transition=n,te=t,(te&6)===0&&At()}}function Ci(){nt=On.current,de(On)}function un(e,t){e.finishedWork=null,e.finishedLanes=0;var n=e.timeoutHandle;if(n!==-1&&(e.timeoutHandle=-1,rd(n)),je!==null)for(n=je.return;n!==null;){var r=n;switch(Mo(r),r.tag){case 1:r=r.type.childContextTypes,r!=null&&qr();break;case 3:Ln(),de(Ke),de(Ae),Ko();break;case 5:Bo(r);break;case 4:Ln();break;case 13:de(ve);break;case 19:de(ve);break;case 10:Ao(r.type._context);break;case 22:case 23:Ci()}n=n.return}if(Oe=e,je=e=Yt(e.current,null),be=nt=t,Te=0,Sr=null,yi=Sl=an=0,Ge=_r=null,rn!==null){for(t=0;t<rn.length;t++)if(n=rn[t],r=n.interleaved,r!==null){n.interleaved=null;var l=r.next,o=n.pending;if(o!==null){var i=o.next;o.next=l,r.next=i}n.pending=r}rn=null}return e}function ku(e,t){do{var n=je;try{if(Uo(),dl.current=ml,fl){for(var r=ye.memoizedState;r!==null;){var l=r.queue;l!==null&&(l.pending=null),r=r.next}fl=!1}if(on=0,Me=Pe=ye=null,gr=!1,vr=0,vi.current=null,n===null||n.return===null){Te=1,Sr=t,je=null;break}e:{var o=e,i=n.return,a=n,s=t;if(t=be,a.flags|=32768,s!==null&&typeof s==\"object\"&&typeof s.then==\"function\"){var h=s,k=a,S=k.tag;if((k.mode&1)===0&&(S===0||S===11||S===15)){var w=k.alternate;w?(k.updateQueue=w.updateQueue,k.memoizedState=w.memoizedState,k.lanes=w.lanes):(k.updateQueue=null,k.memoizedState=null)}var N=Bs(i);if(N!==null){N.flags&=-257,Qs(N,i,a,o,t),N.mode&1&&Ws(o,h,t),t=N,s=h;var z=t.updateQueue;if(z===null){var P=new Set;P.add(s),t.updateQueue=P}else z.add(s);break e}else{if((t&1)===0){Ws(o,h,t),Ni();break e}s=Error(d(426))}}else if(pe&&a.mode&1){var Ee=Bs(i);if(Ee!==null){(Ee.flags&65536)===0&&(Ee.flags|=256),Qs(Ee,i,a,o,t),Fo(In(s,a));break e}}o=s=In(s,a),Te!==4&&(Te=2),_r===null?_r=[o]:_r.push(o),o=i;do{switch(o.tag){case 3:o.flags|=65536,t&=-t,o.lanes|=t;var f=Hs(o,s,t);ms(o,f);break e;case 1:a=s;var c=o.type,p=o.stateNode;if((o.flags&128)===0&&(typeof c.getDerivedStateFromError==\"function\"||p!==null&&typeof p.componentDidCatch==\"function\"&&(Wt===null||!Wt.has(p)))){o.flags|=65536,t&=-t,o.lanes|=t;var _=Vs(o,a,t);ms(o,_);break e}}o=o.return}while(o!==null)}_u(n)}catch(R){t=R,je===n&&n!==null&&(je=n=n.return);continue}break}while(!0)}function xu(){var e=xl.current;return xl.current=ml,e===null?ml:e}function Ni(){(Te===0||Te===3||Te===2)&&(Te=4),Oe===null||(an&268435455)===0&&(Sl&268435455)===0||Kt(Oe,be)}function zl(e,t){var n=te;te|=2;var r=xu();(Oe!==e||be!==t)&&(Pt=null,un(e,t));do try{zd();break}catch(l){ku(e,l)}while(!0);if(Uo(),te=n,xl.current=r,je!==null)throw Error(d(261));return Oe=null,be=0,Te}function zd(){for(;je!==null;)Su(je)}function Pd(){for(;je!==null&&!ec();)Su(je)}function Su(e){var t=Nu(e.alternate,e,nt);e.memoizedProps=e.pendingProps,t===null?_u(e):je=t,vi.current=null}function _u(e){var t=e;do{var n=t.alternate;if(e=t.return,(t.flags&32768)===0){if(n=xd(n,t,nt),n!==null){je=n;return}}else{if(n=Sd(n,t),n!==null){n.flags&=32767,je=n;return}if(e!==null)e.flags|=32768,e.subtreeFlags=0,e.deletions=null;else{Te=6,je=null;return}}if(t=t.sibling,t!==null){je=t;return}je=t=e}while(t!==null);Te===0&&(Te=5)}function cn(e,t,n){var r=le,l=at.transition;try{at.transition=null,le=1,Td(e,t,n,r)}finally{at.transition=l,le=r}return null}function Td(e,t,n,r){do Fn();while(Bt!==null);if((te&6)!==0)throw Error(d(327));n=e.finishedWork;var l=e.finishedLanes;if(n===null)return null;if(e.finishedWork=null,e.finishedLanes=0,n===e.current)throw Error(d(177));e.callbackNode=null,e.callbackPriority=0;var o=n.lanes|n.childLanes;if(cc(e,o),e===Oe&&(je=Oe=null,be=0),(n.subtreeFlags&2064)===0&&(n.flags&2064)===0||El||(El=!0,ju(Lr,function(){return Fn(),null})),o=(n.flags&15990)!==0,(n.subtreeFlags&15990)!==0||o){o=at.transition,at.transition=null;var i=le;le=1;var a=te;te|=4,vi.current=null,Ed(e,n),pu(n,e),Gc(No),Ur=!!Co,No=Co=null,e.current=n,Cd(n),tc(),te=a,le=i,at.transition=o}else e.current=n;if(El&&(El=!1,Bt=e,Cl=l),o=e.pendingLanes,o===0&&(Wt=null),lc(n.stateNode),Ze(e,_e()),t!==null)for(r=e.onRecoverableError,n=0;n<t.length;n++)l=t[n],r(l.value,{componentStack:l.stack,digest:l.digest});if(_l)throw _l=!1,e=ki,ki=null,e;return(Cl&1)!==0&&e.tag!==0&&Fn(),o=e.pendingLanes,(o&1)!==0?e===xi?Er++:(Er=0,xi=e):Er=0,At(),null}function Fn(){if(Bt!==null){var e=da(Cl),t=at.transition,n=le;try{if(at.transition=null,le=16>e?16:e,Bt===null)var r=!1;else{if(e=Bt,Bt=null,Cl=0,(te&6)!==0)throw Error(d(331));var l=te;for(te|=4,j=e.current;j!==null;){var o=j,i=o.child;if((j.flags&16)!==0){var a=o.deletions;if(a!==null){for(var s=0;s<a.length;s++){var h=a[s];for(j=h;j!==null;){var k=j;switch(k.tag){case 0:case 11:case 15:xr(8,k,o)}var S=k.child;if(S!==null)S.return=k,j=S;else for(;j!==null;){k=j;var w=k.sibling,N=k.return;if(su(k),k===h){j=null;break}if(w!==null){w.return=N,j=w;break}j=N}}}var z=o.alternate;if(z!==null){var P=z.child;if(P!==null){z.child=null;do{var Ee=P.sibling;P.sibling=null,P=Ee}while(P!==null)}}j=o}}if((o.subtreeFlags&2064)!==0&&i!==null)i.return=o,j=i;else e:for(;j!==null;){if(o=j,(o.flags&2048)!==0)switch(o.tag){case 0:case 11:case 15:xr(9,o,o.return)}var f=o.sibling;if(f!==null){f.return=o.return,j=f;break e}j=o.return}}var c=e.current;for(j=c;j!==null;){i=j;var p=i.child;if((i.subtreeFlags&2064)!==0&&p!==null)p.return=i,j=p;else e:for(i=c;j!==null;){if(a=j,(a.flags&2048)!==0)try{switch(a.tag){case 0:case 11:case 15:kl(9,a)}}catch(R){Se(a,a.return,R)}if(a===i){j=null;break e}var _=a.sibling;if(_!==null){_.return=a.return,j=_;break e}j=a.return}}if(te=l,At(),vt&&typeof vt.onPostCommitFiberRoot==\"function\")try{vt.onPostCommitFiberRoot(Ir,e)}catch{}r=!0}return r}finally{le=n,at.transition=t}}return!1}function Eu(e,t,n){t=In(n,t),t=Hs(e,t,1),e=Ht(e,t,1),t=Be(),e!==null&&(Yn(e,1,t),Ze(e,t))}function Se(e,t,n){if(e.tag===3)Eu(e,e,n);else for(;t!==null;){if(t.tag===3){Eu(t,e,n);break}else if(t.tag===1){var r=t.stateNode;if(typeof t.type.getDerivedStateFromError==\"function\"||typeof r.componentDidCatch==\"function\"&&(Wt===null||!Wt.has(r))){e=In(n,e),e=Vs(t,e,1),t=Ht(t,e,1),e=Be(),t!==null&&(Yn(t,1,e),Ze(t,e));break}}t=t.return}}function Rd(e,t,n){var r=e.pingCache;r!==null&&r.delete(t),t=Be(),e.pingedLanes|=e.suspendedLanes&n,Oe===e&&(be&n)===n&&(Te===4||Te===3&&(be&130023424)===be&&500>_e()-wi?un(e,0):yi|=n),Ze(e,t)}function Cu(e,t){t===0&&((e.mode&1)===0?t=1:(t=Or,Or<<=1,(Or&130023424)===0&&(Or=4194304)));var n=Be();e=Nt(e,t),e!==null&&(Yn(e,t,n),Ze(e,n))}function Ld(e){var t=e.memoizedState,n=0;t!==null&&(n=t.retryLane),Cu(e,n)}function Id(e,t){var n=0;switch(e.tag){case 13:var r=e.stateNode,l=e.memoizedState;l!==null&&(n=l.retryLane);break;case 19:r=e.stateNode;break;default:throw Error(d(314))}r!==null&&r.delete(t),Cu(e,n)}var Nu;Nu=function(e,t,n){if(e!==null)if(e.memoizedProps!==t.pendingProps||Ke.current)Xe=!0;else{if((e.lanes&n)===0&&(t.flags&128)===0)return Xe=!1,kd(e,t,n);Xe=(e.flags&131072)!==0}else Xe=!1,pe&&(t.flags&1048576)!==0&&os(t,rl,t.index);switch(t.lanes=0,t.tag){case 2:var r=t.type;yl(e,t),e=t.pendingProps;var l=Cn(t,Ae.current);Rn(t,n),l=Go(null,t,r,e,l,n);var o=Zo();return t.flags|=1,typeof l==\"object\"&&l!==null&&typeof l.render==\"function\"&&l.$$typeof===void 0?(t.tag=1,t.memoizedState=null,t.updateQueue=null,Ye(r)?(o=!0,el(t)):o=!1,t.memoizedState=l.state!==null&&l.state!==void 0?l.state:null,Vo(t),l.updater=gl,t.stateNode=l,l._reactInternals=t,ri(t,r,e,n),t=ai(null,t,r,!0,o,n)):(t.tag=0,pe&&o&&Io(t),We(null,t,l,n),t=t.child),t;case 16:r=t.elementType;e:{switch(yl(e,t),e=t.pendingProps,l=r._init,r=l(r._payload),t.type=r,l=t.tag=Od(r),e=ft(r,e),l){case 0:t=ii(null,t,r,e,n);break e;case 1:t=Js(null,t,r,e,n);break e;case 11:t=Ks(null,t,r,e,n);break e;case 14:t=Ys(null,t,r,ft(r.type,e),n);break e}throw Error(d(306,r,\"\"))}return t;case 0:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ft(r,l),ii(e,t,r,l,n);case 1:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ft(r,l),Js(e,t,r,l,n);case 3:e:{if(qs(t),e===null)throw Error(d(387));r=t.pendingProps,o=t.memoizedState,l=o.element,hs(e,t),ul(t,r,null,n);var i=t.memoizedState;if(r=i.element,o.isDehydrated)if(o={element:r,isDehydrated:!1,cache:i.cache,pendingSuspenseBoundaries:i.pendingSuspenseBoundaries,transitions:i.transitions},t.updateQueue.baseState=o,t.memoizedState=o,t.flags&256){l=In(Error(d(423)),t),t=eu(e,t,r,n,l);break e}else if(r!==l){l=In(Error(d(424)),t),t=eu(e,t,r,n,l);break e}else for(tt=Ft(t.stateNode.containerInfo.firstChild),et=t,pe=!0,dt=null,n=fs(t,null,r,n),t.child=n;n;)n.flags=n.flags&-3|4096,n=n.sibling;else{if(zn(),r===l){t=zt(e,t,n);break e}We(e,t,r,n)}t=t.child}return t;case 5:return vs(t),e===null&&Do(t),r=t.type,l=t.pendingProps,o=e!==null?e.memoizedProps:null,i=l.children,jo(r,l)?i=null:o!==null&&jo(r,o)&&(t.flags|=32),Zs(e,t),We(e,t,i,n),t.child;case 6:return e===null&&Do(t),null;case 13:return tu(e,t,n);case 4:return Wo(t,t.stateNode.containerInfo),r=t.pendingProps,e===null?t.child=Pn(t,null,r,n):We(e,t,r,n),t.child;case 11:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ft(r,l),Ks(e,t,r,l,n);case 7:return We(e,t,t.pendingProps,n),t.child;case 8:return We(e,t,t.pendingProps.children,n),t.child;case 12:return We(e,t,t.pendingProps.children,n),t.child;case 10:e:{if(r=t.type._context,l=t.pendingProps,o=t.memoizedProps,i=l.value,se(il,r._currentValue),r._currentValue=i,o!==null)if(ct(o.value,i)){if(o.children===l.children&&!Ke.current){t=zt(e,t,n);break e}}else for(o=t.child,o!==null&&(o.return=t);o!==null;){var a=o.dependencies;if(a!==null){i=o.child;for(var s=a.firstContext;s!==null;){if(s.context===r){if(o.tag===1){s=jt(-1,n&-n),s.tag=2;var h=o.updateQueue;if(h!==null){h=h.shared;var k=h.pending;k===null?s.next=s:(s.next=k.next,k.next=s),h.pending=s}}o.lanes|=n,s=o.alternate,s!==null&&(s.lanes|=n),$o(o.return,n,t),a.lanes|=n;break}s=s.next}}else if(o.tag===10)i=o.type===t.type?null:o.child;else if(o.tag===18){if(i=o.return,i===null)throw Error(d(341));i.lanes|=n,a=i.alternate,a!==null&&(a.lanes|=n),$o(i,n,t),i=o.sibling}else i=o.child;if(i!==null)i.return=o;else for(i=o;i!==null;){if(i===t){i=null;break}if(o=i.sibling,o!==null){o.return=i.return,i=o;break}i=i.return}o=i}We(e,t,l.children,n),t=t.child}return t;case 9:return l=t.type,r=t.pendingProps.children,Rn(t,n),l=ot(l),r=r(l),t.flags|=1,We(e,t,r,n),t.child;case 14:return r=t.type,l=ft(r,t.pendingProps),l=ft(r.type,l),Ys(e,t,r,l,n);case 15:return Xs(e,t,t.type,t.pendingProps,n);case 17:return r=t.type,l=t.pendingProps,l=t.elementType===r?l:ft(r,l),yl(e,t),t.tag=1,Ye(r)?(e=!0,el(t)):e=!1,Rn(t,n),As(t,r,l),ri(t,r,l,n),ai(null,t,r,!0,e,n);case 19:return ru(e,t,n);case 22:return Gs(e,t,n)}throw Error(d(156,t.tag))};function ju(e,t){return ia(e,t)}function Md(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 st(e,t,n,r){return new Md(e,t,n,r)}function ji(e){return e=e.prototype,!(!e||!e.isReactComponent)}function Od(e){if(typeof e==\"function\")return ji(e)?1:0;if(e!=null){if(e=e.$$typeof,e===Le)return 11;if(e===Ie)return 14}return 2}function Yt(e,t){var n=e.alternate;return n===null?(n=st(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 Pl(e,t,n,r,l,o){var i=2;if(r=e,typeof e==\"function\")ji(e)&&(i=1);else if(typeof e==\"string\")i=5;else e:switch(e){case Re:return dn(n.children,l,o,t);case he:i=8,l|=8;break;case xe:return e=st(12,n,t,l|2),e.elementType=xe,e.lanes=o,e;case me:return e=st(13,n,t,l),e.elementType=me,e.lanes=o,e;case ge:return e=st(19,n,t,l),e.elementType=ge,e.lanes=o,e;case ie:return Tl(n,l,o,t);default:if(typeof e==\"object\"&&e!==null)switch(e.$$typeof){case ue:i=10;break e;case Qe:i=9;break e;case Le:i=11;break e;case Ie:i=14;break e;case Ne:i=16,r=null;break e}throw Error(d(130,e==null?e:typeof e,\"\"))}return t=st(i,n,t,l),t.elementType=e,t.type=r,t.lanes=o,t}function dn(e,t,n,r){return e=st(7,e,r,t),e.lanes=n,e}function Tl(e,t,n,r){return e=st(22,e,r,t),e.elementType=ie,e.lanes=n,e.stateNode={isHidden:!1},e}function zi(e,t,n){return e=st(6,e,null,t),e.lanes=n,e}function Pi(e,t,n){return t=st(4,e.children!==null?e.children:[],e.key,t),t.lanes=n,t.stateNode={containerInfo:e.containerInfo,pendingChildren:null,implementation:e.implementation},t}function Dd(e,t,n,r,l){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=to(0),this.expirationTimes=to(-1),this.entangledLanes=this.finishedLanes=this.mutableReadLanes=this.expiredLanes=this.pingedLanes=this.suspendedLanes=this.pendingLanes=0,this.entanglements=to(0),this.identifierPrefix=r,this.onRecoverableError=l,this.mutableSourceEagerHydrationData=null}function Ti(e,t,n,r,l,o,i,a,s){return e=new Dd(e,t,n,a,s),t===1?(t=1,o===!0&&(t|=8)):t=0,o=st(3,null,null,t),e.current=o,o.stateNode=e,o.memoizedState={element:r,isDehydrated:n,cache:null,transitions:null,pendingSuspenseBoundaries:null},Vo(o),e}function Fd(e,t,n){var r=3<arguments.length&&arguments[3]!==void 0?arguments[3]:null;return{$$typeof:K,key:r==null?null:\"\"+r,children:e,containerInfo:t,implementation:n}}function zu(e){if(!e)return Ut;e=e._reactInternals;e:{if(Jt(e)!==e||e.tag!==1)throw Error(d(170));var t=e;do{switch(t.tag){case 3:t=t.stateNode.context;break e;case 1:if(Ye(t.type)){t=t.stateNode.__reactInternalMemoizedMergedChildContext;break e}}t=t.return}while(t!==null);throw Error(d(171))}if(e.tag===1){var n=e.type;if(Ye(n))return ns(e,n,t)}return t}function Pu(e,t,n,r,l,o,i,a,s){return e=Ti(n,r,!0,e,l,o,i,a,s),e.context=zu(null),n=e.current,r=Be(),l=Qt(n),o=jt(r,l),o.callback=t??null,Ht(n,o,l),e.current.lanes=l,Yn(e,l,r),Ze(e,r),e}function Rl(e,t,n,r){var l=t.current,o=Be(),i=Qt(l);return n=zu(n),t.context===null?t.context=n:t.pendingContext=n,t=jt(o,i),t.payload={element:e},r=r===void 0?null:r,r!==null&&(t.callback=r),e=Ht(l,t,i),e!==null&&(mt(e,l,i,o),sl(e,l,i)),i}function Ll(e){if(e=e.current,!e.child)return null;switch(e.child.tag){case 5:return e.child.stateNode;default:return e.child.stateNode}}function Tu(e,t){if(e=e.memoizedState,e!==null&&e.dehydrated!==null){var n=e.retryLane;e.retryLane=n!==0&&n<t?n:t}}function Ri(e,t){Tu(e,t),(e=e.alternate)&&Tu(e,t)}function bd(){return null}var Ru=typeof reportError==\"function\"?reportError:function(e){console.error(e)};function Li(e){this._internalRoot=e}Il.prototype.render=Li.prototype.render=function(e){var t=this._internalRoot;if(t===null)throw Error(d(409));Rl(e,t,null,null)},Il.prototype.unmount=Li.prototype.unmount=function(){var e=this._internalRoot;if(e!==null){this._internalRoot=null;var t=e.containerInfo;sn(function(){Rl(null,e,null,null)}),t[St]=null}};function Il(e){this._internalRoot=e}Il.prototype.unstable_scheduleHydration=function(e){if(e){var t=ha();e={blockedOn:null,target:e,priority:t};for(var n=0;n<Mt.length&&t!==0&&t<Mt[n].priority;n++);Mt.splice(n,0,e),n===0&&va(e)}};function Ii(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11)}function Ml(e){return!(!e||e.nodeType!==1&&e.nodeType!==9&&e.nodeType!==11&&(e.nodeType!==8||e.nodeValue!==\" react-mount-point-unstable \"))}function Lu(){}function Ud(e,t,n,r,l){if(l){if(typeof r==\"function\"){var o=r;r=function(){var h=Ll(i);o.call(h)}}var i=Pu(t,r,e,0,null,!1,!1,\"\",Lu);return e._reactRootContainer=i,e[St]=i.current,sr(e.nodeType===8?e.parentNode:e),sn(),i}for(;l=e.lastChild;)e.removeChild(l);if(typeof r==\"function\"){var a=r;r=function(){var h=Ll(s);a.call(h)}}var s=Ti(e,0,!1,null,null,!1,!1,\"\",Lu);return e._reactRootContainer=s,e[St]=s.current,sr(e.nodeType===8?e.parentNode:e),sn(function(){Rl(t,s,n,r)}),s}function Ol(e,t,n,r,l){var o=n._reactRootContainer;if(o){var i=o;if(typeof l==\"function\"){var a=l;l=function(){var s=Ll(i);a.call(s)}}Rl(t,i,e,l)}else i=Ud(n,t,e,l,r);return Ll(i)}fa=function(e){switch(e.tag){case 3:var t=e.stateNode;if(t.current.memoizedState.isDehydrated){var n=Kn(t.pendingLanes);n!==0&&(no(t,n|1),Ze(t,_e()),(te&6)===0&&(Dn=_e()+500,At()))}break;case 13:sn(function(){var r=Nt(e,1);if(r!==null){var l=Be();mt(r,e,1,l)}}),Ri(e,1)}},ro=function(e){if(e.tag===13){var t=Nt(e,134217728);if(t!==null){var n=Be();mt(t,e,134217728,n)}Ri(e,134217728)}},pa=function(e){if(e.tag===13){var t=Qt(e),n=Nt(e,t);if(n!==null){var r=Be();mt(n,e,t,r)}Ri(e,t)}},ha=function(){return le},ma=function(e,t){var n=le;try{return le=e,t()}finally{le=n}},Xl=function(e,t,n){switch(t){case\"input\":if($l(e,n),t=n.name,n.type===\"radio\"&&t!=null){for(n=e;n.parentNode;)n=n.parentNode;for(n=n.querySelectorAll(\"input[name=\"+JSON.stringify(\"\"+t)+'][type=\"radio\"]'),t=0;t<n.length;t++){var r=n[t];if(r!==e&&r.form===e.form){var l=Jr(r);if(!l)throw Error(d(90));Un(r),$l(r,l)}}}break;case\"textarea\":Wi(e,n);break;case\"select\":t=n.value,t!=null&&pn(e,!!n.multiple,t,!1)}},qi=Ei,ea=sn;var Ad={usingClientEntryPoint:!1,Events:[dr,_n,Jr,Zi,Ji,Ei]},Cr={findFiberByHostInstance:qt,bundleType:0,version:\"18.3.1\",rendererPackageName:\"react-dom\"},$d={bundleType:Cr.bundleType,version:Cr.version,rendererPackageName:Cr.rendererPackageName,rendererConfig:Cr.rendererConfig,overrideHookState:null,overrideHookStateDeletePath:null,overrideHookStateRenamePath:null,overrideProps:null,overridePropsDeletePath:null,overridePropsRenamePath:null,setErrorHandler:null,setSuspenseHandler:null,scheduleUpdate:null,currentDispatcherRef:fe.ReactCurrentDispatcher,findHostInstanceByFiber:function(e){return e=la(e),e===null?null:e.stateNode},findFiberByHostInstance:Cr.findFiberByHostInstance||bd,findHostInstancesForRefresh:null,scheduleRefresh:null,scheduleRoot:null,setRefreshHandler:null,getCurrentFiber:null,reconcilerVersion:\"18.3.1-next-f1338f8080-20240426\"};if(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__<\"u\"){var Dl=__REACT_DEVTOOLS_GLOBAL_HOOK__;if(!Dl.isDisabled&&Dl.supportsFiber)try{Ir=Dl.inject($d),vt=Dl}catch{}}return Je.__SECRET_INTERNALS_DO_NOT_USE_OR_YOU_WILL_BE_FIRED=Ad,Je.createPortal=function(e,t){var n=2<arguments.length&&arguments[2]!==void 0?arguments[2]:null;if(!Ii(t))throw Error(d(200));return Fd(e,t,null,n)},Je.createRoot=function(e,t){if(!Ii(e))throw Error(d(299));var n=!1,r=\"\",l=Ru;return t!=null&&(t.unstable_strictMode===!0&&(n=!0),t.identifierPrefix!==void 0&&(r=t.identifierPrefix),t.onRecoverableError!==void 0&&(l=t.onRecoverableError)),t=Ti(e,1,!1,null,null,n,!1,r,l),e[St]=t.current,sr(e.nodeType===8?e.parentNode:e),new Li(t)},Je.findDOMNode=function(e){if(e==null)return null;if(e.nodeType===1)return e;var t=e._reactInternals;if(t===void 0)throw typeof e.render==\"function\"?Error(d(188)):(e=Object.keys(e).join(\",\"),Error(d(268,e)));return e=la(t),e=e===null?null:e.stateNode,e},Je.flushSync=function(e){return sn(e)},Je.hydrate=function(e,t,n){if(!Ml(t))throw Error(d(200));return Ol(null,e,t,!0,n)},Je.hydrateRoot=function(e,t,n){if(!Ii(e))throw Error(d(405));var r=n!=null&&n.hydratedSources||null,l=!1,o=\"\",i=Ru;if(n!=null&&(n.unstable_strictMode===!0&&(l=!0),n.identifierPrefix!==void 0&&(o=n.identifierPrefix),n.onRecoverableError!==void 0&&(i=n.onRecoverableError)),t=Pu(t,null,e,1,n??null,l,!1,o,i),e[St]=t.current,sr(e),r)for(e=0;e<r.length;e++)n=r[e],l=n._getVersion,l=l(n._source),t.mutableSourceEagerHydrationData==null?t.mutableSourceEagerHydrationData=[n,l]:t.mutableSourceEagerHydrationData.push(n,l);return new Il(t)},Je.render=function(e,t,n){if(!Ml(t))throw Error(d(200));return Ol(null,e,t,!1,n)},Je.unmountComponentAtNode=function(e){if(!Ml(e))throw Error(d(40));return e._reactRootContainer?(sn(function(){Ol(null,null,e,!1,function(){e._reactRootContainer=null,e[St]=null})}),!0):!1},Je.unstable_batchedUpdates=Ei,Je.unstable_renderSubtreeIntoContainer=function(e,t,n,r){if(!Ml(n))throw Error(d(200));if(e==null||e._reactInternals===void 0)throw Error(d(38));return Ol(e,t,n,!1,r)},Je.version=\"18.3.1-next-f1338f8080-20240426\",Je}var Au;function Zd(){if(Au)return Di.exports;Au=1;function y(){if(!(typeof __REACT_DEVTOOLS_GLOBAL_HOOK__>\"u\"||typeof __REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE!=\"function\"))try{__REACT_DEVTOOLS_GLOBAL_HOOK__.checkDCE(y)}catch(E){console.error(E)}}return y(),Di.exports=Gd(),Di.exports}var $u;function Jd(){if($u)return Fl;$u=1;var y=Zd();return Fl.createRoot=y.createRoot,Fl.hydrateRoot=y.hydrateRoot,Fl}var qd=Jd();/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const ef=y=>y.replace(/([a-z0-9])([A-Z])/g,\"$1-$2\").toLowerCase(),tf=y=>y.replace(/^([A-Z])|[\\s-_]+(\\w)/g,(E,d,U)=>U?U.toUpperCase():d.toLowerCase()),Hu=y=>{const E=tf(y);return E.charAt(0).toUpperCase()+E.slice(1)},Wu=(...y)=>y.filter((E,d,U)=>!!E&&E.trim()!==\"\"&&U.indexOf(E)===d).join(\" \").trim();/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */var nf={xmlns:\"http://www.w3.org/2000/svg\",width:24,height:24,viewBox:\"0 0 24 24\",fill:\"none\",stroke:\"currentColor\",strokeWidth:2,strokeLinecap:\"round\",strokeLinejoin:\"round\"};/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const rf=C.forwardRef(({color:y=\"currentColor\",size:E=24,strokeWidth:d=2,absoluteStrokeWidth:U,className:T=\"\",children:L,iconNode:B,...G},A)=>C.createElement(\"svg\",{ref:A,...nf,width:E,height:E,stroke:y,strokeWidth:U?Number(d)*24/Number(E):d,className:Wu(\"lucide\",T),...G},[...B.map(([Q,Z])=>C.createElement(Q,Z)),...Array.isArray(L)?L:[L]]));/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const Gt=(y,E)=>{const d=C.forwardRef(({className:U,...T},L)=>C.createElement(rf,{ref:L,iconNode:E,className:Wu(`lucide-${ef(Hu(y))}`,`lucide-${y}`,U),...T}));return d.displayName=Hu(y),d};/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const lf=[[\"path\",{d:\"M17.5 19H9a7 7 0 1 1 6.71-9h1.79a4.5 4.5 0 1 1 0 9Z\",key:\"p7xjir\"}]],Bu=Gt(\"cloud\",lf);/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const of=[[\"path\",{d:\"M15 3h6v6\",key:\"1q9fwt\"}],[\"path\",{d:\"M10 14 21 3\",key:\"gplh6r\"}],[\"path\",{d:\"M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6\",key:\"a6xqqp\"}]],Al=Gt(\"external-link\",of);/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const af=[[\"path\",{d:\"M10.733 5.076a10.744 10.744 0 0 1 11.205 6.575 1 1 0 0 1 0 .696 10.747 10.747 0 0 1-1.444 2.49\",key:\"ct8e1f\"}],[\"path\",{d:\"M14.084 14.158a3 3 0 0 1-4.242-4.242\",key:\"151rxh\"}],[\"path\",{d:\"M17.479 17.499a10.75 10.75 0 0 1-15.417-5.151 1 1 0 0 1 0-.696 10.75 10.75 0 0 1 4.446-5.143\",key:\"13bj9a\"}],[\"path\",{d:\"m2 2 20 20\",key:\"1ooewy\"}]],sf=Gt(\"eye-off\",af);/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const uf=[[\"path\",{d:\"M2.062 12.348a1 1 0 0 1 0-.696 10.75 10.75 0 0 1 19.876 0 1 1 0 0 1 0 .696 10.75 10.75 0 0 1-19.876 0\",key:\"1nclc0\"}],[\"circle\",{cx:\"12\",cy:\"12\",r:\"3\",key:\"1v7zrd\"}]],cf=Gt(\"eye\",uf);/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const df=[[\"path\",{d:\"m6 14 1.5-2.9A2 2 0 0 1 9.24 10H20a2 2 0 0 1 1.94 2.5l-1.54 6a2 2 0 0 1-1.95 1.5H4a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2h3.9a2 2 0 0 1 1.69.9l.81 1.2a2 2 0 0 0 1.67.9H18a2 2 0 0 1 2 2v2\",key:\"usdka0\"}]],ff=Gt(\"folder-open\",df);/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const pf=[[\"path\",{d:\"M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8\",key:\"v9h5vc\"}],[\"path\",{d:\"M21 3v5h-5\",key:\"1q7to0\"}],[\"path\",{d:\"M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16\",key:\"3uifl3\"}],[\"path\",{d:\"M8 16H3v5\",key:\"1cv678\"}]],hf=Gt(\"refresh-cw\",pf);/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const mf=[[\"path\",{d:\"M15.2 3a2 2 0 0 1 1.4.6l3.8 3.8a2 2 0 0 1 .6 1.4V19a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V5a2 2 0 0 1 2-2z\",key:\"1c8476\"}],[\"path\",{d:\"M17 21v-7a1 1 0 0 0-1-1H8a1 1 0 0 0-1 1v7\",key:\"1ydtos\"}],[\"path\",{d:\"M7 3v4a1 1 0 0 0 1 1h7\",key:\"t51u73\"}]],gf=Gt(\"save\",mf);/**\n * @license lucide-react v0.487.0 - ISC\n *\n * This source code is licensed under the ISC license.\n * See the LICENSE file in the root directory of this source tree.\n */const vf=[[\"rect\",{width:\"14\",height:\"20\",x:\"5\",y:\"2\",rx:\"2\",ry:\"2\",key:\"1yt0o3\"}],[\"path\",{d:\"M12 18h.01\",key:\"mhygvu\"}]],Vu=Gt(\"smartphone\",vf);function yf(){return m.jsx(\"div\",{className:\"bg-white rounded-lg border border-slate-200 p-6 mb-4\",children:m.jsx(\"div\",{className:\"flex items-start\",children:m.jsxs(\"div\",{className:\"flex-1\",children:[m.jsxs(\"div\",{className:\"flex items-center gap-3 mb-3\",children:[m.jsx(\"div\",{className:\"w-10 h-10 rounded-full bg-blue-50 flex items-center justify-center\",children:m.jsx(Bu,{className:\"w-6 h-6 text-blue-600\"})}),m.jsx(\"h2\",{className:\"text-slate-800\",children:\"DDNSTO 远程访问\"})]}),m.jsx(\"p\",{className:\"text-slate-600 text-sm mb-2\",children:\"DDNSTO 远程访问，不需要公网 IP、不需要开放端口。只需一个链接，即可从任何地方安全访问您的 NAS、路由器和桌面。\"}),m.jsxs(\"a\",{href:\"https://www.ddnsto.com\",target:\"_blank\",rel:\"noopener noreferrer\",className:\"inline-flex items-center gap-1 text-sm text-blue-600 hover:underline\",children:[\"了解更多\",m.jsx(Al,{className:\"w-3 h-3\"})]})]})})})}function wf({isRunning:y,isConfigured:E,hostname:d,address:U,deviceId:T,version:L,featEnabled:B,tunnelOk:G,onRefreshStatus:A}){const[Q,Z]=C.useState(!1),W={label:y?\"运行中\":\"已停止\",bgColor:y?\"bg-green-100\":\"bg-slate-200\",textColor:y?\"text-green-700\":\"text-slate-600\"},H=U&&U.trim().length>0?U:\"未配置\",q=Q,ae=G===!0,V=q?\"检查中...\":G===!0?\"正常\":G===!1?\"无法连接服务器\":\"未知\",Y=B===\"1\"||B===!0?\"已开启\":\"未开启\",we=T||\"-\",ze=async()=>{if(A){Z(!0);try{await A()}finally{Z(!1)}}};return m.jsxs(\"div\",{className:\"bg-white rounded-lg border border-slate-200 p-6 mb-4\",children:[m.jsx(\"h3\",{className:\"text-slate-800 mb-4\",children:\"运行状态\"}),m.jsxs(\"div\",{className:\"flex items-center justify-between pb-6 border-b border-slate-100\",children:[m.jsxs(\"div\",{className:\"flex items-center gap-4\",children:[m.jsx(\"span\",{className:`px-3 py-1 rounded-full text-sm ${W.bgColor} ${W.textColor}`,children:W.label}),E&&m.jsxs(\"div\",{className:\"flex items-center gap-2\",children:[m.jsx(\"span\",{className:\"text-sm text-slate-500\",children:\"远程访问域名：\"}),U&&U.trim().length>0?m.jsxs(\"a\",{href:H,target:\"_blank\",rel:\"noopener noreferrer\",className:\"text-sm text-blue-600 hover:underline flex items-center gap-1\",children:[H,m.jsx(Al,{className:\"w-3 h-3\"})]}):m.jsx(\"span\",{className:\"text-sm text-slate-500\",children:H})]})]}),m.jsx(\"div\",{className:\"flex items-center gap-2\",children:m.jsxs(\"button\",{onClick:ze,className:\"px-3 py-2 rounded-md text-blue-600 text-sm hover:bg-blue-50 transition-colors flex items-center gap-1\",children:[m.jsx(hf,{className:\"w-4 h-4\"}),\"刷新状态\"]})})]}),m.jsx(\"div\",{className:\"mt-6\",children:m.jsxs(\"div\",{className:\"flex items-center gap-2 text-sm text-slate-700\",children:[m.jsx(Bu,{className:\"w-4 h-4 text-slate-400\"}),q&&m.jsx(\"div\",{className:\"w-4 h-4 rounded-full border-2 border-slate-300 border-t-blue-600 animate-spin\"}),m.jsxs(\"h4\",{className:\"text-sm text-slate-700\",children:[\"服务器连接：\",ae?m.jsx(\"span\",{className:\"text-green-600\",children:V}):m.jsx(\"span\",{children:V}),\"｜ 设备 ID：\",we,\" ｜ 拓展功能：\",Y,L?` ｜ 版本：${L}`:\"\"]})]})})]})}function Qu({checked:y,onChange:E,label:d,id:U,disabled:T,containerClassName:L,...B}){return m.jsxs(\"div\",{className:`ddnsto-toggle-container ${L||\"\"}`,children:[d&&m.jsx(\"label\",{htmlFor:U,className:\"text-sm text-slate-700 mr-3 whitespace-nowrap\",children:d}),m.jsxs(\"label\",{className:\"ddnsto-toggle-switch\",\"aria-label\":d||\"toggle\",children:[m.jsx(\"input\",{id:U,type:\"checkbox\",checked:y,disabled:T,onChange:G=>E(G.target.checked),...B}),m.jsx(\"span\",{className:\"ddnsto-toggle-slider\",\"aria-hidden\":!0})]})]})}function kf({onSave:y,isInTab:E,token:d,enabled:U,advancedConfig:T,onRegisterSave:L,onTokenChange:B,onEnabledChange:G}){const[A,Q]=C.useState(d||\"\"),[Z,W]=C.useState(U);C.useEffect(()=>{Q(d||\"\")},[d]),C.useEffect(()=>{W(U)},[T,U]);const H=()=>{A.trim()&&y(A,Z?\"1\":\"0\",T)};return C.useEffect(()=>{L&&L(()=>H())},[L,A,Z,T]),m.jsxs(\"div\",{className:E?\"\":\"bg-white rounded-lg border border-slate-200 p-6 mb-4\",children:[!E&&m.jsxs(m.Fragment,{children:[m.jsx(\"h3\",{className:\"text-slate-800 mb-2\",children:\"手动配置\"}),m.jsx(\"p\",{className:\"text-xs text-slate-400 mb-6\",children:\"如果您已经在 DDNSTO 控制台获取了令牌，可以直接在此填写并启动插件。\"})]}),m.jsxs(\"div\",{className:\"space-y-5\",children:[m.jsx(\"div\",{className:\"pb-4\",children:m.jsxs(\"div\",{className:\"flex items-center gap-2\",children:[m.jsx(\"h4\",{className:\"text-sm text-slate-700\",children:\"启用 DDNSTO\"}),m.jsx(Qu,{checked:Z,onChange:q=>{W(q),G?.(q)},\"aria-label\":\"启用 DDNSTO\",containerClassName:\"ml-6\"})]})}),m.jsxs(\"div\",{children:[m.jsxs(\"div\",{className:\"flex items-center gap-2 mb-2\",children:[m.jsxs(\"label\",{className:\"text-sm text-slate-700\",children:[\"用户令牌（Token） \",m.jsx(\"span\",{className:\"text-red-500\",children:\"*\"})]}),m.jsxs(\"a\",{href:\"https://www.ddnsto.com/docs/guide/token.html\",target:\"_blank\",rel:\"noopener noreferrer\",className:\"text-xs text-blue-600 hover:underline flex items-center gap-1\",children:[\"如何查看用户令牌\",m.jsx(Al,{className:\"w-3 h-3\"})]})]}),m.jsx(\"div\",{className:\"relative\",children:m.jsx(\"input\",{type:\"text\",value:A,onChange:q=>{Q(q.target.value),B?.(q.target.value)},placeholder:\"请输入您的 DDNSTO 令牌\",className:\"w-full px-3 py-2 border border-slate-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500\"})}),m.jsx(\"p\",{className:\"text-xs text-slate-400 mt-1\",children:\"令牌将保存在路由器本地，请勿泄露。\"})]})]})]})}function xf({token:y,enabled:E,advancedConfig:d,onSave:U,isInTab:T,onRegisterSave:L}){const[B,G]=C.useState(d.feat_enabled===\"1\"),A=K=>K.feat_disk_path_selected?K.feat_disk_path_selected:K.mounts&&K.mounts.length>0?K.mounts[0]:\"\",[Q,Z]=C.useState(A(d)),[W,H]=C.useState(d.feat_port||\"3033\"),[q,ae]=C.useState(d.feat_username||\"ddnsto\"),[V,Y]=C.useState(d.feat_password||\"\"),[we,ze]=C.useState(!1),[ke,fe]=C.useState(d.index||\"\");C.useEffect(()=>{G(d.feat_enabled===\"1\"),Z(A(d)),d.feat_port&&H(d.feat_port),d.feat_username&&ae(d.feat_username),d.feat_password&&Y(d.feat_password),d.index!==void 0&&fe(d.index)},[d]);const Ce=()=>{U(y,E?\"1\":\"0\",{feat_enabled:B?\"1\":\"0\",feat_port:W,feat_username:q,feat_password:V,feat_disk_path_selected:Q,mounts:d.mounts,index:ke})};return C.useEffect(()=>{L&&L(()=>Ce())},[L,y,E,B,Q,W,q,V,ke,d.mounts]),m.jsxs(\"div\",{className:T?\"\":\"bg-white rounded-lg border border-slate-200 p-6 mb-4\",children:[!T&&m.jsx(\"h3\",{className:\"text-slate-800 mb-4\",children:\"高级功能\"}),m.jsxs(\"div\",{className:\"space-y-5\",children:[m.jsxs(\"div\",{children:[m.jsx(\"label\",{className:\"block text-sm text-slate-700 mb-2\",children:\"设备编号（可选）\"}),m.jsx(\"input\",{type:\"text\",value:ke,onChange:K=>fe(K.target.value),placeholder:\"\",className:\"w-full px-3 py-2 border border-slate-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500\"}),m.jsx(\"p\",{className:\"text-xs text-slate-400 mt-1\",children:\"如有多台设备id重复，请修改此编号（0～100），正常情况不需要修改\"})]}),m.jsxs(\"div\",{className:\"flex items-center gap-2\",children:[m.jsx(\"h4\",{className:\"text-sm text-slate-700\",children:\"启用拓展功能\"}),m.jsx(Qu,{checked:B,onChange:K=>G(K),\"aria-label\":\"启用拓展功能\",containerClassName:\"ml-6\"})]}),m.jsxs(\"div\",{className:\"flex items-center gap-2 -mt-2\",children:[m.jsx(\"p\",{className:\"text-xs text-slate-400\",children:\"启用后可支持控制台的「文件管理」及「远程开机」功能\"}),m.jsxs(\"a\",{href:\"https://www.ddnsto.com/docs/guide/advanced.html\",target:\"_blank\",rel:\"noopener noreferrer\",className:\"text-xs text-blue-600 hover:underline flex items-center gap-1 whitespace-nowrap\",children:[\"查看教程\",m.jsx(Al,{className:\"w-3 h-3\"})]})]}),B&&m.jsxs(\"div\",{className:\"space-y-4\",children:[m.jsxs(\"div\",{className:\"flex items-center gap-2\",children:[m.jsx(ff,{className:\"w-4 h-4 text-slate-600\"}),m.jsx(\"h5\",{className:\"text-sm text-slate-700\",children:\"WebDAV 服务配置\"})]}),m.jsxs(\"div\",{className:\"space-y-4 pl-6\",children:[m.jsxs(\"div\",{children:[m.jsx(\"label\",{className:\"block text-sm text-slate-600 mb-2\",children:\"可访问的文件目录\"}),m.jsx(\"select\",{value:Q,onChange:K=>Z(K.target.value),className:\"w-full px-3 py-2 border border-slate-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500 bg-white\",children:d.mounts&&d.mounts.length>0?d.mounts.map(K=>m.jsx(\"option\",{value:K,children:K},K)):m.jsx(\"option\",{value:\"\",disabled:!0,children:\"未检测到挂载点\"})}),m.jsx(\"p\",{className:\"text-xs text-slate-400 mt-1\",children:\"控制台上的文件管理将只能看到此目录及其子目录。\"})]}),m.jsxs(\"div\",{children:[m.jsx(\"label\",{className:\"block text-sm text-slate-600 mb-2\",children:\"服务端口\"}),m.jsx(\"input\",{type:\"text\",value:W,onChange:K=>H(K.target.value),placeholder:\"3033\",className:\"w-full px-3 py-2 border border-slate-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500\"})]}),m.jsxs(\"div\",{children:[m.jsx(\"label\",{className:\"block text-sm text-slate-600 mb-2\",children:\"授权用户名\"}),m.jsx(\"input\",{type:\"text\",value:q,onChange:K=>ae(K.target.value),placeholder:\"ddnsto\",className:\"w-full px-3 py-2 border border-slate-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500\"})]}),m.jsxs(\"div\",{children:[m.jsx(\"label\",{className:\"block text-sm text-slate-600 mb-2\",children:\"授权用户密码\"}),m.jsxs(\"div\",{className:\"relative\",children:[m.jsx(\"input\",{type:we?\"text\":\"password\",value:V,onChange:K=>Y(K.target.value),placeholder:\"设置访问密码\",className:\"w-full px-3 py-2 pr-10 border border-slate-300 rounded-md text-sm focus:outline-none focus:ring-2 focus:ring-blue-500\"}),m.jsx(\"button\",{type:\"button\",onClick:()=>ze(!we),className:\"absolute right-2 top-1/2 -translate-y-1/2 text-slate-400 hover:text-slate-600\",children:we?m.jsx(sf,{className:\"w-4 h-4\"}):m.jsx(cf,{className:\"w-4 h-4\"})})]})]})]})]})]})]})}function Sf({ddnstoToken:y,ddnstoEnabled:E,advancedConfig:d,onSave:U,saveBanner:T}){const[L,B]=C.useState(\"basic\"),G=C.useRef(null),A=C.useRef(),Q=C.useRef(),[Z,W]=C.useState(y||\"\"),[H,q]=C.useState(E===\"1\");C.useEffect(()=>{W(y||\"\")},[y]),C.useEffect(()=>{q(E===\"1\")},[E]);const ae=()=>{L===\"basic\"?A.current?.():Q.current?.()};return m.jsxs(m.Fragment,{children:[m.jsxs(\"div\",{className:\"bg-white rounded-lg border border-slate-200 mb-4\",children:[m.jsx(\"div\",{className:\"border-b border-slate-200 px-6\",children:m.jsx(\"div\",{className:\"flex items-center justify-between\",children:m.jsxs(\"div\",{className:\"flex items-center -mb-px\",children:[m.jsx(\"button\",{onClick:()=>B(\"basic\"),className:`px-4 py-4 text-sm border-b-2 transition-colors ${L===\"basic\"?\"border-blue-600 text-blue-600\":\"border-transparent text-slate-600 hover:text-slate-800\"}`,children:\"基础配置\"}),m.jsx(\"button\",{onClick:()=>B(\"advanced\"),className:`px-4 py-4 text-sm border-b-2 transition-colors ${L===\"advanced\"?\"border-blue-600 text-blue-600\":\"border-transparent text-slate-600 hover:text-slate-800\"}`,children:\"高级功能\"})]})})}),m.jsxs(\"div\",{ref:G,className:\"p-6\",children:[L===\"basic\"&&m.jsx(kf,{token:Z,enabled:H,advancedConfig:d,onSave:U,isInTab:!0,onRegisterSave:V=>{A.current=V},onTokenChange:W,onEnabledChange:q}),L===\"advanced\"&&m.jsx(xf,{token:Z,enabled:H,advancedConfig:d,onSave:U,isInTab:!0,onRegisterSave:V=>{Q.current=V}})]})]}),m.jsx(\"div\",{className:\"flex justify-end gap-3 mt-4\",children:m.jsxs(\"button\",{onClick:ae,disabled:!Z.trim(),className:\"ddnsto-btn ddnsto-btn-primary\",children:[m.jsx(gf,{className:\"ddnsto-btn-icon\"}),\"保存配置并应用\"]})}),T.state!==\"idle\"&&m.jsxs(\"div\",{className:[\"mt-2 rounded-md border px-3 py-2 text-sm\",T.state===\"loading\"?\"bg-blue-50 border-blue-200 text-blue-800\":\"\",T.state===\"success\"?\"bg-emerald-50 border-emerald-200 text-emerald-800\":\"\",T.state===\"error\"?\"bg-red-50 border-red-200 text-red-800\":\"\"].join(\" \"),children:[m.jsx(\"div\",{className:\"font-medium\",children:T.message}),T.description&&m.jsx(\"div\",{className:\"text-xs mt-1 opacity-80 break-words\",children:T.description})]})]})}const bn={auth:0,starting:1,binding:2,domain:3,checking:4};function _f({apiBase:y,csrfToken:E,deviceId:d,onboardingBase:U,onComplete:T,onRefreshStatus:L,isInTab:B}){const[G,A]=C.useState(!1),[Q,Z]=C.useState(U||\"https://www.kooldns.cn/bind\"),[W,H]=C.useState(`${U||\"https://www.kooldns.cn/bind\"}/#/auth?send=1&source=openwrt&callback=*`),[q,ae]=C.useState(\"auth\"),[V,Y]=C.useState(d||\"\"),[we,ze]=C.useState(\"\"),[ke,fe]=C.useState(\"\"),[Ce,K]=C.useState(!1),[Re,he]=C.useState(null),xe=C.useRef(\"auth\"),ue=E||(typeof window<\"u\"?window.ddnstoCsrfToken:\"\"),Qe=C.useCallback(g=>{ae(u=>bn[g]>bn[u]?g:u)},[]);C.useEffect(()=>{xe.current=q},[q]),C.useEffect(()=>{console.log(\"Onboarding iframe url:\",W)},[W]);const Le=C.useCallback(()=>{ae(\"auth\"),ze(\"\"),fe(\"\"),he(null),Y(d||\"\"),H(`${Q}/#/auth?send=1&source=openwrt&callback=*`)},[Qe,d,Q]);C.useEffect(()=>{const g=\"/#/auth?send=1&source=openwrt&callback=*\",u=U||\"https://www.kooldns.cn/bind\";Z(u),H(`${u}${g}`)},[U]),C.useEffect(()=>{Y(d||\"\")},[d]);const me=C.useCallback(async()=>{for(let v=0;v<20;v+=1){const M=await fetch(`${y}/admin/services/ddnsto/api/status`,{credentials:\"same-origin\"});if(M.ok){const X=(await M.json())?.data||{},O=X.deviceId||X.device_id||\"\";if(O&&Y(O),X.running)return{running:!0,deviceId:O}}await new Promise(b=>setTimeout(b,2e3))}throw new Error(\"ddnsto not running\")},[y]),ge=C.useCallback(async g=>{const u={url:g};ue&&(u.token=ue);const v=await fetch(`${y}/admin/services/ddnsto/api/onboarding/address`,{method:\"POST\",credentials:\"same-origin\",headers:{\"Content-Type\":\"application/json\",...ue?{\"X-LuCI-Token\":ue}:{}},body:JSON.stringify(u)});if(!v.ok)throw new Error(`HTTP ${v.status}`);const M=await v.json();if(!M?.ok)throw new Error(M?.error||\"save address failed\")},[y,ue]),Ie=C.useCallback(async(g,u)=>{K(!0),he(null);const v=V||d||\"\",M=`${Q}/#/bind?status=starting&token=${encodeURIComponent(g)}&sign=${encodeURIComponent(u)}${v?`&routerId=${encodeURIComponent(v)}`:\"\"}`;H(M),Qe(\"starting\");try{const b=await fetch(`${y}/admin/services/ddnsto/api/onboarding/start`,{method:\"POST\",credentials:\"same-origin\",headers:{\"Content-Type\":\"application/json\",...ue?{\"X-LuCI-Token\":ue}:{}},body:JSON.stringify({token:g})});if(!b.ok)throw new Error(`HTTP ${b.status}`);const X=await b.json();if(!X?.ok)throw new Error(X?.error||\"start failed\");L&&await L();const re=(await me())?.deviceId||V||d||\"\";if(bn[xe.current]>=bn.domain)return;const ee=`${Q}/#/bind?status=starting&routerId=${encodeURIComponent(re)}&token=${encodeURIComponent(g)}&sign=${encodeURIComponent(u)}`;H(ee),Qe(\"binding\"),Y(re)}catch{he(\"启动失败，请稍后重试\")}finally{K(!1)}},[Qe,y,d,ue,Q,L,me,Le,V]),Ne=C.useCallback(g=>{const u=g||V;if(!we||!ke||!u)return;const v=`${Q}/#/domain?sign=${encodeURIComponent(ke)}&token=${encodeURIComponent(we)}&routerId=${encodeURIComponent(u)}&netaddr=127.0.0.1&source=openwrt`;H(v),ae(\"domain\")},[ke,we,Q,V]),ie=C.useCallback(async g=>{H(`${Q}/#/check?url=${encodeURIComponent(g)}`),ae(\"checking\"),T();try{await ge(g),L&&await L()}catch{he(\"保存域名失败，请重试\")}},[Q,T,L,ge]),x=C.useCallback(()=>{A(!0),Le()},[Le]);C.useEffect(()=>{const g=u=>{if(!G)return;console.log(\"Onboarding message:\",u.data);const v=u.data;let M=v;if(typeof v==\"string\")try{M=JSON.parse(v)}catch{return}if(!M||typeof M!=\"object\")return;const b=M.data,O=b&&typeof b==\"object\"?b:M;if((typeof O.auth==\"string\"?O.auth:\"\")!==\"ddnsto\")return;const ee=typeof O.sign==\"string\"?O.sign:\"\",oe=typeof O.token==\"string\"?O.token:\"\",Ue=typeof O.step==\"string\"?O.step:\"\",fn=typeof O.status==\"string\"?O.status:\"\",Un=typeof O.url==\"string\"?O.url:\"\",Tt=O.success,An=typeof Tt==\"number\"?Tt:Number(Tt);if(ee&&oe&&q===\"auth\"&&!Ce){ze(oe),fe(ee),Ie(oe,ee);return}if(Ue===\"bind\"&&fn===\"success\"){const Zt=typeof O.router_uid==\"string\"?O.router_uid:V;Zt&&Y(Zt),Ne(Zt);return}Ue===\"domain\"&&Un&&An===0&&bn[xe.current]<bn.checking&&ie(Un)};return window.addEventListener(\"message\",g),()=>window.removeEventListener(\"message\",g)},[Ne,ie,Ce,Ie,G,q]);const I=()=>m.jsx(\"div\",{className:\"flex items-center justify-between mb-6\",children:m.jsx(\"h3\",{className:\"text-slate-800\",children:\"快速向导\"})});return G?m.jsxs(\"div\",{className:B?\"\":\"bg-white rounded-lg border border-slate-200 p-6 mb-4\",children:[!B&&I(),m.jsx(\"div\",{className:\"rounded-lg border border-slate-200 overflow-hidden\",children:m.jsx(\"iframe\",{src:W,title:\"快速向导\",className:\"w-full\",style:{width:\"100%\",height:\"70vh\",maxHeight:\"400px\",border:0},loading:\"lazy\"})})]}):m.jsxs(\"div\",{className:B?\"\":\"bg-white rounded-lg border border-slate-200 p-6 mb-4\",children:[!B&&I(),m.jsxs(\"div\",{className:\"text-center py-8\",children:[m.jsx(\"div\",{className:\"mb-4 flex justify-center\",children:m.jsx(\"div\",{className:\"w-16 h-16 rounded-full bg-blue-50 flex items-center justify-center\",children:m.jsx(Vu,{className:\"w-8 h-8 text-blue-600\"})})}),m.jsx(\"h4\",{className:\"text-slate-800 mb-2\",children:\"欢迎使用 DDNSTO！\"}),m.jsx(\"p\",{className:\"text-sm text-slate-600 mb-6 max-w-md mx-auto\",children:\"通过微信扫码登录，我们将引导您完成插件配置\"}),m.jsxs(\"button\",{onClick:x,className:\"ddnsto-btn ddnsto-btn-primary\",children:[m.jsx(Vu,{className:\"ddnsto-btn-icon\"}),\"开始配置\"]})]})]})}function Ef({config:y}){const[E,d]=C.useState(!1),[U,T]=C.useState(!1),[L,B]=C.useState(\"OpenWrt\"),[G,A]=C.useState(\"\"),[Q,Z]=C.useState(\"\"),[W,H]=C.useState(\"\"),[q,ae]=C.useState(\"\"),[V,Y]=C.useState(\"1\"),[we,ze]=C.useState({feat_enabled:\"0\",feat_port:\"\",feat_username:\"\",feat_password:\"\",feat_disk_path_selected:\"\",mounts:[],index:\"\"}),[,ke]=C.useState(null),[fe,Ce]=C.useState(null),[K,Re]=C.useState({state:\"idle\",message:\"\"}),he=C.useRef(),xe=(y?.api_base||\"/cgi-bin/luci\").replace(/\\/$/,\"\"),ue=y?.token||\"\",Qe=(y?.onboarding_base||\"https://www.kooldns.cn/bind\").replace(/\\/$/,\"\"),Le=C.useCallback((x,I,g,u)=>{he.current&&window.clearTimeout(he.current),Re({state:x,message:I,description:g}),u&&(he.current=window.setTimeout(()=>{Re({state:\"idle\",message:\"\"})},u))},[]);C.useEffect(()=>()=>{he.current&&window.clearTimeout(he.current)},[]);const me=C.useCallback(async()=>{try{const x=await fetch(`${xe}/admin/services/ddnsto/api/config`,{credentials:\"same-origin\"});if(!x.ok)throw new Error(`HTTP ${x.status}`);const g=(await x.json())?.data||{};g.address&&A(g.address),g.device_id!==void 0?Z(g.device_id):g.deviceId!==void 0&&Z(g.deviceId),g.version!==void 0&&H(g.version),g.token&&ae(g.token),g.enabled!==void 0&&Y(g.enabled),ze({feat_enabled:g.feat_enabled||\"0\",feat_port:g.feat_port||\"\",feat_username:g.feat_username||\"\",feat_password:g.feat_password||\"\",feat_disk_path_selected:g.feat_disk_path_selected||\"\",mounts:g.mounts||[],index:g.index||\"\"})}catch(x){console.error(\"Failed to fetch ddnsto config\",x)}},[xe]),ge=C.useCallback(async()=>{try{const x=await fetch(`${xe}/admin/services/ddnsto/api/status`,{credentials:\"same-origin\"});if(!x.ok)throw new Error(`HTTP ${x.status}`);const g=(await x.json())?.data||{};d(!!g.running),g.token_set&&T(!0),g.hostname&&B(g.hostname),g.device_id!==void 0?Z(g.device_id):g.deviceId!==void 0&&Z(g.deviceId),g.address&&A(g.address),g.version!==void 0&&H(g.version),ke(null)}catch(x){console.error(\"Failed to fetch ddnsto status\",x),ke(\"无法获取运行状态\")}},[xe]),Ie=C.useCallback(async()=>{try{const x=await fetch(`${xe}/admin/services/ddnsto/api/connectivity`,{credentials:\"same-origin\"});if(!x.ok)throw new Error(`HTTP ${x.status}`);const g=(await x.json())?.data||{};g.tunnel_ok!==void 0&&g.tunnel_ok!==null?Ce(g.tunnel_ok===!0):Ce(null)}catch(x){console.error(\"Failed to fetch ddnsto connectivity\",x),Ce(null)}},[xe]),Ne=C.useCallback(async()=>{await me(),await ge(),await Ie()},[me,ge,Ie]),ie=C.useCallback(async(x,I,g)=>{Le(\"loading\",\"正在保存配置...\",\"正在将配置写入路由器，请稍候\");try{const u=new URLSearchParams;ue&&u.append(\"token\",ue),u.append(\"ddnsto_token\",x),u.append(\"enabled\",I),u.append(\"feat_enabled\",g.feat_enabled),u.append(\"feat_port\",g.feat_port),u.append(\"feat_username\",g.feat_username),u.append(\"feat_password\",g.feat_password),u.append(\"feat_disk_path_selected\",g.feat_disk_path_selected),u.append(\"index\",g.index||\"\");const v=await fetch(`${xe}/admin/services/ddnsto/api/config`,{method:\"POST\",credentials:\"same-origin\",headers:{\"Content-Type\":\"application/x-www-form-urlencoded\",...ue?{\"X-LuCI-Token\":ue}:{}},body:u});if(!v.ok)throw new Error(`HTTP ${v.status}`);const M=await v.json();if(!M?.ok)throw new Error(M?.error||\"Save failed\");Le(\"success\",\"配置已保存并生效\",void 0,3e3),T(!0),await me(),await ge()}catch(u){console.error(\"Failed to save config\",u);const v=u instanceof Error?u.message:String(u);Le(\"error\",\"保存失败，请重试\",v,4e3)}},[xe,ue,me,ge]);return C.useEffect(()=>{me(),ge(),Ie()},[me,ge,Ie]),C.useEffect(()=>{const x=window.setInterval(ge,5e3);return()=>{window.clearInterval(x)}},[ge]),m.jsx(\"div\",{className:\"min-h-screen bg-slate-50\",children:m.jsx(\"main\",{children:m.jsxs(\"div\",{className:\"max-w-5xl mx-auto px-6 py-8\",children:[m.jsx(yf,{}),m.jsx(wf,{isRunning:E,isConfigured:U,hostname:L,address:G,deviceId:Q,version:W,featEnabled:we.feat_enabled,tunnelOk:fe,onRefreshStatus:Ne}),m.jsx(_f,{apiBase:xe,csrfToken:ue,deviceId:Q,onboardingBase:Qe,onRefreshStatus:Ne,onComplete:()=>T(!0)}),m.jsx(Sf,{ddnstoToken:q,ddnstoEnabled:V,advancedConfig:we,onSave:ie,saveBanner:K})]})})})}const Cf='/*! tailwindcss v4.1.3 | MIT License | https://tailwindcss.com */*,:before,:after,::backdrop{--tw-border-style: solid}@layer properties{@supports (((-webkit-hyphens: none)) and (not (margin-trim: inline))) or ((-moz-orient: inline) and (not (color: rgb(from red r g b)))){*,:before,:after,::backdrop{--tw-translate-x: 0;--tw-translate-y: 0;--tw-translate-z: 0;--tw-rotate-x: rotateX(0);--tw-rotate-y: rotateY(0);--tw-rotate-z: rotateZ(0);--tw-skew-x: skewX(0);--tw-skew-y: skewY(0);--tw-space-y-reverse: 0;--tw-border-style: solid;--tw-shadow: 0 0 #0000;--tw-shadow-color: initial;--tw-shadow-alpha: 100%;--tw-inset-shadow: 0 0 #0000;--tw-inset-shadow-color: initial;--tw-inset-shadow-alpha: 100%;--tw-ring-color: initial;--tw-ring-shadow: 0 0 #0000;--tw-inset-ring-color: initial;--tw-inset-ring-shadow: 0 0 #0000;--tw-ring-inset: initial;--tw-ring-offset-width: 0px;--tw-ring-offset-color: #fff;--tw-ring-offset-shadow: 0 0 #0000}}}@layer theme{:root,:host{--font-sans: ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\";--font-mono: ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace;--color-red-500: oklch(.637 .237 25.331);--color-amber-50: oklch(.987 .022 95.277);--color-amber-200: oklch(.924 .12 95.746);--color-amber-600: oklch(.666 .179 58.318);--color-green-50: oklch(.982 .018 155.826);--color-green-100: oklch(.962 .044 156.743);--color-green-200: oklch(.925 .084 155.995);--color-green-600: oklch(.627 .194 149.214);--color-green-700: oklch(.527 .154 150.069);--color-green-800: oklch(.448 .119 151.328);--color-blue-50: oklch(.97 .014 254.604);--color-blue-200: oklch(.882 .059 254.128);--color-blue-500: oklch(.623 .214 259.815);--color-blue-600: oklch(.546 .245 262.881);--color-blue-700: oklch(.488 .243 264.376);--color-slate-50: oklch(.984 .003 247.858);--color-slate-100: oklch(.968 .007 247.896);--color-slate-200: oklch(.929 .013 255.508);--color-slate-300: oklch(.869 .022 252.894);--color-slate-400: oklch(.704 .04 256.788);--color-slate-500: oklch(.554 .046 257.417);--color-slate-600: oklch(.446 .043 257.281);--color-slate-700: oklch(.372 .044 257.287);--color-slate-800: oklch(.279 .041 260.031);--color-white: #fff;--spacing: .25rem;--container-md: 28rem;--container-5xl: 64rem;--text-xs: .75rem;--text-xs--line-height: calc(1 / .75);--text-sm: .875rem;--text-sm--line-height: calc(1.25 / .875);--text-base: 1rem;--text-lg: 1.125rem;--text-xl: 1.25rem;--text-2xl: 1.5rem;--font-weight-normal: 400;--font-weight-medium: 500;--default-transition-duration: .15s;--default-transition-timing-function: cubic-bezier(.4, 0, .2, 1);--default-font-family: var(--font-sans);--default-font-feature-settings: var(--font-sans--font-feature-settings);--default-font-variation-settings: var(--font-sans--font-variation-settings);--default-mono-font-family: var(--font-mono);--default-mono-font-feature-settings: var(--font-mono--font-feature-settings);--default-mono-font-variation-settings: var(--font-mono--font-variation-settings)}}@layer base{*,:after,:before,::backdrop{box-sizing:border-box;border:0 solid;margin:0;padding:0}::file-selector-button{box-sizing:border-box;border:0 solid;margin:0;padding:0}html,:host{-webkit-text-size-adjust:100%;tab-size:4;line-height:1.5;font-family:var(--default-font-family, ui-sans-serif, system-ui, sans-serif, \"Apple Color Emoji\", \"Segoe UI Emoji\", \"Segoe UI Symbol\", \"Noto Color Emoji\");font-feature-settings:var(--default-font-feature-settings, normal);font-variation-settings:var(--default-font-variation-settings, normal);-webkit-tap-highlight-color:transparent}body{line-height:inherit}hr{height:0;color:inherit;border-top-width:1px}abbr:where([title]){-webkit-text-decoration:underline dotted;text-decoration:underline dotted}h1,h2,h3,h4,h5,h6{font-size:inherit;font-weight:inherit}a{color:inherit;-webkit-text-decoration:inherit;text-decoration:inherit}b,strong{font-weight:bolder}code,kbd,samp,pre{font-family:var(--default-mono-font-family, ui-monospace, SFMono-Regular, Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace);font-feature-settings:var(--default-mono-font-feature-settings, normal);font-variation-settings:var(--default-mono-font-variation-settings, normal);font-size:1em}small{font-size:80%}sub,sup{vertical-align:baseline;font-size:75%;line-height:0;position:relative}sub{bottom:-.25em}sup{top:-.5em}table{text-indent:0;border-color:inherit;border-collapse:collapse}:-moz-focusring{outline:auto}progress{vertical-align:baseline}summary{display:list-item}ol,ul,menu{list-style:none}img,svg,video,canvas,audio,iframe,embed,object{vertical-align:middle;display:block}img,video{max-width:100%;height:auto}button,input,select,optgroup,textarea{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}::file-selector-button{font:inherit;font-feature-settings:inherit;font-variation-settings:inherit;letter-spacing:inherit;color:inherit;opacity:1;background-color:#0000;border-radius:0}:where(select:is([multiple],[size])) optgroup{font-weight:bolder}:where(select:is([multiple],[size])) optgroup option{padding-inline-start:20px}::file-selector-button{margin-inline-end:4px}::placeholder{opacity:1;color:currentColor}@supports (color: color-mix(in lab,red,red)){::placeholder{color:color-mix(in oklab,currentColor 50%,transparent)}}textarea{resize:vertical}::-webkit-search-decoration{-webkit-appearance:none}::-webkit-date-and-time-value{min-height:1lh;text-align:inherit}::-webkit-datetime-edit{display:inline-flex}::-webkit-datetime-edit-fields-wrapper{padding:0}::-webkit-datetime-edit{padding-block:0}::-webkit-datetime-edit-year-field{padding-block:0}::-webkit-datetime-edit-month-field{padding-block:0}::-webkit-datetime-edit-day-field{padding-block:0}::-webkit-datetime-edit-hour-field{padding-block:0}::-webkit-datetime-edit-minute-field{padding-block:0}::-webkit-datetime-edit-second-field{padding-block:0}::-webkit-datetime-edit-millisecond-field{padding-block:0}::-webkit-datetime-edit-meridiem-field{padding-block:0}:-moz-ui-invalid{box-shadow:none}button,input:where([type=button],[type=reset],[type=submit]){appearance:button}::file-selector-button{appearance:button}::-webkit-inner-spin-button{height:auto}::-webkit-outer-spin-button{height:auto}[hidden]:where(:not([hidden=until-found])){display:none!important}body{background-color:var(--background);color:var(--foreground)}*{border-color:var(--border);outline-color:var(--ring)}@supports (color: color-mix(in lab,red,red)){*{outline-color:color-mix(in oklab,var(--ring) 50%,transparent)}}body{background-color:var(--background);color:var(--foreground);-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}:where(:not(:has([class*=\" text-\"]),:not(:has([class^=text-])))) h1{font-size:var(--text-2xl);font-weight:var(--font-weight-medium);line-height:1.5}:where(:not(:has([class*=\" text-\"]),:not(:has([class^=text-])))) h2{font-size:var(--text-xl);font-weight:var(--font-weight-medium);line-height:1.5}:where(:not(:has([class*=\" text-\"]),:not(:has([class^=text-])))) h3{font-size:var(--text-lg);font-weight:var(--font-weight-medium);line-height:1.5}:where(:not(:has([class*=\" text-\"]),:not(:has([class^=text-])))) h4,:where(:not(:has([class*=\" text-\"]),:not(:has([class^=text-])))) label,:where(:not(:has([class*=\" text-\"]),:not(:has([class^=text-])))) button{font-size:var(--text-base);font-weight:var(--font-weight-medium);line-height:1.5}:where(:not(:has([class*=\" text-\"]),:not(:has([class^=text-])))) input{font-size:var(--text-base);font-weight:var(--font-weight-normal);line-height:1.5}}@layer utilities{.absolute{position:absolute}.relative{position:relative}.inset-0{inset:calc(var(--spacing) * 0)}.top-1\\\\/2{top:50%}.right-2{right:calc(var(--spacing) * 2)}.z-10{z-index:10}.-mx-4{margin-inline:calc(var(--spacing) * -4)}.mx-auto{margin-inline:auto}.mt-0\\\\.5{margin-top:calc(var(--spacing) * .5)}.mt-1{margin-top:calc(var(--spacing) * 1)}.mt-2{margin-top:calc(var(--spacing) * 2)}.mt-4{margin-top:calc(var(--spacing) * 4)}.mt-6{margin-top:calc(var(--spacing) * 6)}.-mb-px{margin-bottom:-1px}.mb-1{margin-bottom:calc(var(--spacing) * 1)}.mb-2{margin-bottom:calc(var(--spacing) * 2)}.mb-3{margin-bottom:calc(var(--spacing) * 3)}.mb-4{margin-bottom:calc(var(--spacing) * 4)}.mb-6{margin-bottom:calc(var(--spacing) * 6)}.mb-8{margin-bottom:calc(var(--spacing) * 8)}.block{display:block}.flex{display:flex}.grid{display:grid}.inline-block{display:inline-block}.inline-flex{display:inline-flex}.h-0\\\\.5{height:calc(var(--spacing) * .5)}.h-3{height:calc(var(--spacing) * 3)}.h-4{height:calc(var(--spacing) * 4)}.h-5{height:calc(var(--spacing) * 5)}.h-6{height:calc(var(--spacing) * 6)}.h-8{height:calc(var(--spacing) * 8)}.h-10{height:calc(var(--spacing) * 10)}.h-12{height:calc(var(--spacing) * 12)}.h-16{height:calc(var(--spacing) * 16)}.h-40{height:calc(var(--spacing) * 40)}.min-h-screen{min-height:100vh}.w-3{width:calc(var(--spacing) * 3)}.w-4{width:calc(var(--spacing) * 4)}.w-5{width:calc(var(--spacing) * 5)}.w-6{width:calc(var(--spacing) * 6)}.w-8{width:calc(var(--spacing) * 8)}.w-10{width:calc(var(--spacing) * 10)}.w-11{width:calc(var(--spacing) * 11)}.w-12{width:calc(var(--spacing) * 12)}.w-16{width:calc(var(--spacing) * 16)}.w-40{width:calc(var(--spacing) * 40)}.w-full{width:100%}.max-w-5xl{max-width:var(--container-5xl)}.max-w-md{max-width:var(--container-md)}.flex-1{flex:1}.flex-shrink-0{flex-shrink:0}.translate-x-1{--tw-translate-x: calc(var(--spacing) * 1);translate:var(--tw-translate-x) var(--tw-translate-y)}.translate-x-6{--tw-translate-x: calc(var(--spacing) * 6);translate:var(--tw-translate-x) var(--tw-translate-y)}.-translate-y-1\\\\/2{--tw-translate-y: -50% ;translate:var(--tw-translate-x) var(--tw-translate-y)}.transform{transform:var(--tw-rotate-x) var(--tw-rotate-y) var(--tw-rotate-z) var(--tw-skew-x) var(--tw-skew-y)}.cursor-pointer{cursor:pointer}.grid-cols-2{grid-template-columns:repeat(2,minmax(0,1fr))}.grid-cols-8{grid-template-columns:repeat(8,minmax(0,1fr))}.grid-rows-8{grid-template-rows:repeat(8,minmax(0,1fr))}.flex-col{flex-direction:column}.items-center{align-items:center}.items-start{align-items:flex-start}.justify-between{justify-content:space-between}.justify-center{justify-content:center}.justify-end{justify-content:flex-end}.gap-0\\\\.5{gap:calc(var(--spacing) * .5)}.gap-1{gap:calc(var(--spacing) * 1)}.gap-2{gap:calc(var(--spacing) * 2)}.gap-3{gap:calc(var(--spacing) * 3)}.gap-4{gap:calc(var(--spacing) * 4)}.gap-8{gap:calc(var(--spacing) * 8)}:where(.space-y-3>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 3) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 3) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-4>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 4) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 4) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-5>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 5) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 5) * calc(1 - var(--tw-space-y-reverse)))}:where(.space-y-6>:not(:last-child)){--tw-space-y-reverse: 0;margin-block-start:calc(calc(var(--spacing) * 6) * var(--tw-space-y-reverse));margin-block-end:calc(calc(var(--spacing) * 6) * calc(1 - var(--tw-space-y-reverse)))}.gap-x-8{column-gap:calc(var(--spacing) * 8)}.gap-y-4{row-gap:calc(var(--spacing) * 4)}.overflow-hidden{overflow:hidden}.rounded{border-radius:.25rem}.rounded-full{border-radius:3.40282e38px}.rounded-lg{border-radius:var(--radius)}.rounded-md{border-radius:calc(var(--radius) - 2px)}.rounded-sm{border-radius:calc(var(--radius) - 4px)}.border{border-style:var(--tw-border-style);border-width:1px}.border-2{border-style:var(--tw-border-style);border-width:2px}.border-t{border-top-style:var(--tw-border-style);border-top-width:1px}.border-b{border-bottom-style:var(--tw-border-style);border-bottom-width:1px}.border-b-2{border-bottom-style:var(--tw-border-style);border-bottom-width:2px}.border-amber-200{border-color:var(--color-amber-200)}.border-blue-200{border-color:var(--color-blue-200)}.border-blue-600{border-color:var(--color-blue-600)}.border-green-200{border-color:var(--color-green-200)}.border-slate-100{border-color:var(--color-slate-100)}.border-slate-200{border-color:var(--color-slate-200)}.border-slate-300{border-color:var(--color-slate-300)}.border-transparent{border-color:#0000}.bg-amber-50{background-color:var(--color-amber-50)}.bg-blue-50{background-color:var(--color-blue-50)}.bg-blue-600{background-color:var(--color-blue-600)}.bg-green-50{background-color:var(--color-green-50)}.bg-green-100{background-color:var(--color-green-100)}.bg-green-600{background-color:var(--color-green-600)}.bg-slate-50{background-color:var(--color-slate-50)}.bg-slate-200{background-color:var(--color-slate-200)}.bg-slate-300{background-color:var(--color-slate-300)}.bg-slate-800{background-color:var(--color-slate-800)}.bg-white{background-color:var(--color-white)}.p-2{padding:calc(var(--spacing) * 2)}.p-3{padding:calc(var(--spacing) * 3)}.p-4{padding:calc(var(--spacing) * 4)}.p-6{padding:calc(var(--spacing) * 6)}.px-3{padding-inline:calc(var(--spacing) * 3)}.px-4{padding-inline:calc(var(--spacing) * 4)}.px-6{padding-inline:calc(var(--spacing) * 6)}.py-1{padding-block:calc(var(--spacing) * 1)}.py-2{padding-block:calc(var(--spacing) * 2)}.py-2\\\\.5{padding-block:calc(var(--spacing) * 2.5)}.py-4{padding-block:calc(var(--spacing) * 4)}.py-8{padding-block:calc(var(--spacing) * 8)}.pt-2{padding-top:calc(var(--spacing) * 2)}.pt-4{padding-top:calc(var(--spacing) * 4)}.pt-6{padding-top:calc(var(--spacing) * 6)}.pr-10{padding-right:calc(var(--spacing) * 10)}.pb-6{padding-bottom:calc(var(--spacing) * 6)}.pl-7{padding-left:calc(var(--spacing) * 7)}.text-center{text-align:center}.text-right{text-align:right}.text-sm{font-size:var(--text-sm);line-height:var(--tw-leading, var(--text-sm--line-height))}.text-xs{font-size:var(--text-xs);line-height:var(--tw-leading, var(--text-xs--line-height))}.break-all{word-break:break-all}.whitespace-nowrap{white-space:nowrap}.text-amber-600{color:var(--color-amber-600)}.text-blue-600{color:var(--color-blue-600)}.text-green-600{color:var(--color-green-600)}.text-green-700{color:var(--color-green-700)}.text-green-800{color:var(--color-green-800)}.text-red-500{color:var(--color-red-500)}.text-slate-300{color:var(--color-slate-300)}.text-slate-400{color:var(--color-slate-400)}.text-slate-500{color:var(--color-slate-500)}.text-slate-600{color:var(--color-slate-600)}.text-slate-700{color:var(--color-slate-700)}.text-slate-800{color:var(--color-slate-800)}.text-white{color:var(--color-white)}.transition-colors{transition-property:color,background-color,border-color,outline-color,text-decoration-color,fill,stroke,--tw-gradient-from,--tw-gradient-via,--tw-gradient-to;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}.transition-transform{transition-property:transform,translate,scale,rotate;transition-timing-function:var(--tw-ease, var(--default-transition-timing-function));transition-duration:var(--tw-duration, var(--default-transition-duration))}@media(hover:hover){.hover\\\\:bg-blue-50:hover{background-color:var(--color-blue-50)}}@media(hover:hover){.hover\\\\:bg-blue-700:hover{background-color:var(--color-blue-700)}}@media(hover:hover){.hover\\\\:bg-green-700:hover{background-color:var(--color-green-700)}}@media(hover:hover){.hover\\\\:bg-slate-50:hover{background-color:var(--color-slate-50)}}@media(hover:hover){.hover\\\\:text-slate-600:hover{color:var(--color-slate-600)}}@media(hover:hover){.hover\\\\:text-slate-800:hover{color:var(--color-slate-800)}}@media(hover:hover){.hover\\\\:underline:hover{text-decoration-line:underline}}.focus\\\\:ring-2:focus{--tw-ring-shadow: var(--tw-ring-inset, ) 0 0 0 calc(2px + var(--tw-ring-offset-width)) var(--tw-ring-color, currentcolor);box-shadow:var(--tw-inset-shadow),var(--tw-inset-ring-shadow),var(--tw-ring-offset-shadow),var(--tw-ring-shadow),var(--tw-shadow)}.focus\\\\:ring-blue-500:focus{--tw-ring-color: var(--color-blue-500)}.focus\\\\:outline-none:focus{--tw-outline-style: none;outline-style:none}.disabled\\\\:cursor-not-allowed:disabled{cursor:not-allowed}.disabled\\\\:bg-slate-300:disabled{background-color:var(--color-slate-300)}}:root,:host{--font-size: 16px;--background: #fff;--foreground: oklch(.145 0 0);--card: #fff;--card-foreground: oklch(.145 0 0);--popover: oklch(1 0 0);--popover-foreground: oklch(.145 0 0);--primary: #030213;--primary-foreground: oklch(1 0 0);--secondary: oklch(.95 .0058 264.53);--secondary-foreground: #030213;--muted: #ececf0;--muted-foreground: #717182;--accent: #e9ebef;--accent-foreground: #030213;--destructive: #d4183d;--destructive-foreground: #fff;--border: #0000001a;--input: transparent;--input-background: #f3f3f5;--switch-background: #cbced4;--font-weight-medium: 500;--font-weight-normal: 400;--ring: oklch(.708 0 0);--chart-1: oklch(.646 .222 41.116);--chart-2: oklch(.6 .118 184.704);--chart-3: oklch(.398 .07 227.392);--chart-4: oklch(.828 .189 84.429);--chart-5: oklch(.769 .188 70.08);--radius: .625rem;--sidebar: oklch(.985 0 0);--sidebar-foreground: oklch(.145 0 0);--sidebar-primary: #030213;--sidebar-primary-foreground: oklch(.985 0 0);--sidebar-accent: oklch(.97 0 0);--sidebar-accent-foreground: oklch(.205 0 0);--sidebar-border: oklch(.922 0 0);--sidebar-ring: oklch(.708 0 0)}.dark{--background: oklch(.145 0 0);--foreground: oklch(.985 0 0);--card: oklch(.145 0 0);--card-foreground: oklch(.985 0 0);--popover: oklch(.145 0 0);--popover-foreground: oklch(.985 0 0);--primary: oklch(.985 0 0);--primary-foreground: oklch(.205 0 0);--secondary: oklch(.269 0 0);--secondary-foreground: oklch(.985 0 0);--muted: oklch(.269 0 0);--muted-foreground: oklch(.708 0 0);--accent: oklch(.269 0 0);--accent-foreground: oklch(.985 0 0);--destructive: oklch(.396 .141 25.723);--destructive-foreground: oklch(.637 .237 25.331);--border: oklch(.269 0 0);--input: oklch(.269 0 0);--ring: oklch(.439 0 0);--font-weight-medium: 500;--font-weight-normal: 400;--chart-1: oklch(.488 .243 264.376);--chart-2: oklch(.696 .17 162.48);--chart-3: oklch(.769 .188 70.08);--chart-4: oklch(.627 .265 303.9);--chart-5: oklch(.645 .246 16.439);--sidebar: oklch(.205 0 0);--sidebar-foreground: oklch(.985 0 0);--sidebar-primary: oklch(.488 .243 264.376);--sidebar-primary-foreground: oklch(.985 0 0);--sidebar-accent: oklch(.269 0 0);--sidebar-accent-foreground: oklch(.985 0 0);--sidebar-border: oklch(.269 0 0);--sidebar-ring: oklch(.439 0 0)}html{font-size:var(--font-size);font-family:system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,Roboto,Helvetica Neue,Arial,sans-serif}@property --tw-translate-x{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-translate-y{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-translate-z{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-rotate-x{syntax: \"*\"; inherits: false; initial-value: rotateX(0);}@property --tw-rotate-y{syntax: \"*\"; inherits: false; initial-value: rotateY(0);}@property --tw-rotate-z{syntax: \"*\"; inherits: false; initial-value: rotateZ(0);}@property --tw-skew-x{syntax: \"*\"; inherits: false; initial-value: skewX(0);}@property --tw-skew-y{syntax: \"*\"; inherits: false; initial-value: skewY(0);}@property --tw-space-y-reverse{syntax: \"*\"; inherits: false; initial-value: 0;}@property --tw-border-style{syntax: \"*\"; inherits: false; initial-value: solid;}@property --tw-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-shadow-color{syntax: \"*\"; inherits: false}@property --tw-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-inset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-shadow-color{syntax: \"*\"; inherits: false}@property --tw-inset-shadow-alpha{syntax: \"<percentage>\"; inherits: false; initial-value: 100%;}@property --tw-ring-color{syntax: \"*\"; inherits: false}@property --tw-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-inset-ring-color{syntax: \"*\"; inherits: false}@property --tw-inset-ring-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}@property --tw-ring-inset{syntax: \"*\"; inherits: false}@property --tw-ring-offset-width{syntax: \"<length>\"; inherits: false; initial-value: 0;}@property --tw-ring-offset-color{syntax: \"*\"; inherits: false; initial-value: #fff;}@property --tw-ring-offset-shadow{syntax: \"*\"; inherits: false; initial-value: 0 0 #0000;}:root,:host{--ddn-bg: #f8fafc;--ddn-surface: #ffffff;--ddn-surface-muted: #f1f5f9;--ddn-border: #e2e8f0;--ddn-border-strong: #cbd5e1;--ddn-text-primary: #0f172a;--ddn-text-secondary: #475569;--ddn-text-muted: #64748b;--ddn-primary: #2563eb;--ddn-primary-strong: #1d4ed8;--ddn-input-bg: #ffffff;--ddn-disabled-bg: #e2e8f0;--ddn-disabled-text: #94a3b8;--ddn-divider: #e2e8f0;--ddn-spinner: #94a3b8}[data-darkmode=true],:host([data-darkmode=\"true\"]){--ddn-bg: #0f172a;--ddn-surface: #111827;--ddn-surface-muted: #1f2937;--ddn-border: #334155;--ddn-border-strong: #475569;--ddn-text-primary: #e5e7eb;--ddn-text-secondary: #cbd5e1;--ddn-text-muted: #94a3b8;--ddn-primary: #3b82f6;--ddn-primary-strong: #2563eb;--ddn-input-bg: #0b1220;--ddn-disabled-bg: #1f2937;--ddn-disabled-text: #64748b;--ddn-divider: #1f2937;--ddn-spinner: #cbd5e1}[data-darkmode=true],:host([data-darkmode=\"true\"]){color:var(--ddn-text-primary)}[data-darkmode=true] .bg-slate-50,:host([data-darkmode=\"true\"]) .bg-slate-50{background-color:var(--ddn-bg)!important}[data-darkmode=true] .bg-white,:host([data-darkmode=\"true\"]) .bg-white{background-color:var(--ddn-surface)!important;color:var(--ddn-text-primary)}[data-darkmode=true] .border-slate-200,:host([data-darkmode=\"true\"]) .border-slate-200,[data-darkmode=true] .border-slate-100,:host([data-darkmode=\"true\"]) .border-slate-100{border-color:var(--ddn-border)!important}[data-darkmode=true] .border-slate-300,:host([data-darkmode=\"true\"]) .border-slate-300{border-color:var(--ddn-border-strong)!important}[data-darkmode=true] .text-slate-800,:host([data-darkmode=\"true\"]) .text-slate-800,[data-darkmode=true] .text-slate-700,:host([data-darkmode=\"true\"]) .text-slate-700{color:var(--ddn-text-primary)!important}[data-darkmode=true] .text-slate-600,:host([data-darkmode=\"true\"]) .text-slate-600,[data-darkmode=true] .text-slate-500,:host([data-darkmode=\"true\"]) .text-slate-500{color:var(--ddn-text-secondary)!important}[data-darkmode=true] .text-slate-400,:host([data-darkmode=\"true\"]) .text-slate-400{color:var(--ddn-text-muted)!important}[data-darkmode=true] .bg-blue-50,:host([data-darkmode=\"true\"]) .bg-blue-50{background-color:#2563eb1f!important;color:var(--ddn-text-primary)}[data-darkmode=true] .bg-emerald-50,:host([data-darkmode=\"true\"]) .bg-emerald-50{background-color:#10b98124!important;color:var(--ddn-text-primary)}[data-darkmode=true] .bg-red-50,:host([data-darkmode=\"true\"]) .bg-red-50{background-color:#f871711f!important;color:var(--ddn-text-primary)}[data-darkmode=true] .border-b,:host([data-darkmode=\"true\"]) .border-b{border-color:var(--ddn-divider)!important}[data-darkmode=true] input,:host([data-darkmode=\"true\"]) input,[data-darkmode=true] select,:host([data-darkmode=\"true\"]) select,[data-darkmode=true] textarea,:host([data-darkmode=\"true\"]) textarea{background-color:var(--ddn-input-bg);color:var(--ddn-text-primary)}[data-darkmode=true] .animate-spin,:host([data-darkmode=\"true\"]) .animate-spin{border-color:var(--ddn-spinner)!important}',Nf=\".ddnsto-host{padding:16px 20px;background-color:#f8fafc;border-radius:16px;overflow:hidden}.ddnsto-host[data-darkmode=true]{background-color:#0b1220}.ddnsto-host #app{display:block}\",jf='.ddnsto-toggle-container{display:inline-flex;align-items:center}.ddnsto-toggle-switch{position:relative;display:inline-block;width:44px;height:22px;cursor:pointer}.ddnsto-toggle-switch input{opacity:0;width:0;height:0;position:absolute;inset:0;margin:0}.ddnsto-toggle-slider{position:absolute;cursor:pointer;inset:0;background-color:#e5e7eb;transition:.2s ease;border-radius:22px;border:1px solid #cbd5e1;box-shadow:0 1px 2px #0000000a inset}.ddnsto-toggle-slider:before{position:absolute;content:\"\";height:16px;width:16px;left:2px;top:2px;background-color:#fff;transition:.2s ease;border-radius:50%;box-shadow:0 1px 2px #0003}.ddnsto-toggle-switch input:checked+.ddnsto-toggle-slider{background-color:#3b82f6;border-color:#3b82f6}.ddnsto-toggle-switch input:checked+.ddnsto-toggle-slider:before{transform:translate(22px)}.ddnsto-toggle-switch input:focus-visible+.ddnsto-toggle-slider{box-shadow:0 0 0 3px #3b82f640}.ddnsto-toggle-switch input:disabled+.ddnsto-toggle-slider{opacity:.6;cursor:not-allowed}',zf=\".ddnsto-btn{display:inline-flex;align-items:center;justify-content:center;gap:.5rem;padding:.625rem 1.25rem;border-radius:.5rem;border:1px solid transparent;font-size:.875rem;font-weight:600;line-height:1.2;text-decoration:none;cursor:pointer;transition:background-color .15s ease,color .15s ease,box-shadow .15s ease,border-color .15s ease;user-select:none}.ddnsto-btn:focus-visible{outline:2px solid #2563eb;outline-offset:2px}.ddnsto-btn-primary{background-color:var(--ddn-primary);color:#fff;border-color:var(--ddn-primary-strong);box-shadow:0 1px 2px #00000014}.ddnsto-btn-primary:hover:not(:disabled){background-color:var(--ddn-primary-strong)}.ddnsto-btn-primary:active:not(:disabled){background-color:#1e3a8a}.ddnsto-btn:disabled,.ddnsto-btn[aria-disabled=true]{background-color:var(--ddn-disabled-bg);border-color:var(--ddn-border);color:var(--ddn-disabled-text);cursor:not-allowed;box-shadow:none}.ddnsto-btn-icon{width:1rem;height:1rem}\",Pf=\"ddnsto-theme\",Tf=y=>{const E=y.match(/\\d+/g);if(E&&E.length>=3)return{r:parseInt(E[0],10),g:parseInt(E[1],10),b:parseInt(E[2],10)};if(y.startsWith(\"#\")){const d=y.replace(\"#\",\"\");if(d.length===3)return{r:parseInt(d[0]+d[0],16),g:parseInt(d[1]+d[1],16),b:parseInt(d[2]+d[2],16)};if(d.length===6)return{r:parseInt(d.slice(0,2),16),g:parseInt(d.slice(2,4),16),b:parseInt(d.slice(4,6),16)}}return null},Rf=()=>{try{const y=localStorage.getItem(Pf);if(y===\"dark\"||y===\"light\")return y}catch{}if(window.matchMedia&&window.matchMedia(\"(prefers-color-scheme: dark)\").matches)return\"dark\";try{const y=getComputedStyle(document.body).backgroundColor,E=Tf(y);if(E)return .2126*E.r+.7152*E.g+.0722*E.b<128?\"dark\":\"light\"}catch{}return\"light\"},bl=(y,E)=>{y&&(E===\"dark\"?y.setAttribute(\"data-darkmode\",\"true\"):y.removeAttribute(\"data-darkmode\"))},jr={token:\"\",prefix:\"\",api_base:\"/cgi-bin/luci\",lang:\"zh-cn\",onboarding_base:\"https://web.ddnsto.com/openwrt-bind\"},zr=typeof window<\"u\"&&window.ddnstoConfig||{},Lf={token:zr.token??jr.token,prefix:zr.prefix??jr.prefix,api_base:zr.api_base??jr.api_base,lang:zr.lang??jr.lang,onboarding_base:zr.onboarding_base??jr.onboarding_base},gt=document.getElementById(\"root\")||document.getElementById(\"app\"),If=()=>{if(!document.head.querySelector(\"style[data-ddnsto-host]\")){const y=document.createElement(\"style\");y.setAttribute(\"data-ddnsto-host\",\"true\"),y.textContent=Nf,document.head.appendChild(y)}},Mf=gt?.hasAttribute(\"data-ddnsto-shadow\")||gt?.dataset.shadow===\"true\";let Ui=gt;const Ul=typeof window<\"u\"?Rf():\"light\";if(gt){If();const y=`${Cf}\n${jf}\n${zf}`;if(Mf&&gt.attachShadow){const E=gt.shadowRoot||gt.attachShadow({mode:\"open\"});if(!E.querySelector(\"style[data-ddnsto-style]\")){const d=document.createElement(\"style\");d.setAttribute(\"data-ddnsto-style\",\"true\"),d.textContent=y,E.appendChild(d)}Ui=E,bl(gt,Ul),bl(gt.parentElement,Ul)}else{if(!document.head.querySelector(\"style[data-ddnsto-style]\")){const E=document.createElement(\"style\");E.setAttribute(\"data-ddnsto-style\",\"true\"),E.textContent=y,document.head.appendChild(E)}bl(gt,Ul),bl(gt.parentElement,Ul)}Ui&&qd.createRoot(Ui).render(m.jsx(Kd.StrictMode,{children:m.jsx(Ef,{config:Lf})}))}\n"
  },
  {
    "path": "luci-app-eqosplus/Makefile",
    "content": "#\n# Copyright (C) 2006-2017 OpenWrt.org#\n# Copyright (C) 2022-2025 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-eqosplus\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nTHEME_NAME:=eqosplus\nPKG_NAME:=luci-app-$(THEME_NAME)\n\nPKG_LICENSE:=Apache-2.0\n\nLUCI_TITLE:=LuCI support for eqosplus.\nLUCI_DESCRIPTION:=LuCI support for Easy eqosplus(Support speed limit based on IP address).\nLUCI_DEPENDS:=+ip-full +tc +nftables +bc +kmod-ifb\nLUCI_PKGARCH:=all\n\nPKG_VERSION:=1.3.0\nPKG_RELEASE:=20251128\nPKG_MAINTAINER:=sirpdboy <herboy2008@gmail.com>\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/postinst\n#!/bin/sh\nrm -f /tmp/luci-*\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/eqosplus\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n\n"
  },
  {
    "path": "luci-app-eqosplus/luasrc/controller/eqosplus.lua",
    "content": "module(\"luci.controller.eqosplus\", package.seeall)\n-- Copyright 2022-2023 sirpdboy <herboy2008@gmail.com>\nfunction index()\n    if not nixio.fs.access(\"/etc/config/eqosplus\") then return end\n    entry({\"admin\", \"control\"}, firstchild(), \"Control\", 44).dependent = false\n\n    local e = entry({\"admin\", \"control\", \"eqosplus\"}, cbi(\"eqosplus\"), _(\"Eqosplus\"), 10)\n    e.dependent=false\n    e.acl_depends = { \"luci-app-eqosplus\" }\n    entry({\"admin\", \"control\", \"eqosplus\", \"status\"}, call(\"act_status\")).leaf = true\nend\n\nfunction act_status()\n    local sys  = require \"luci.sys\"\n    local e = {} \n     e.status = sys.call(\" busybox ps -w | grep eqosplus | grep -v grep  >/dev/null \") == 0  \n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json(e)\nend\n"
  },
  {
    "path": "luci-app-eqosplus/luasrc/model/cbi/eqosplus.lua",
    "content": "-- Copyright 2022-2023 sirpdboy <herboy2008@gmail.com>\n-- Licensed to the public under the Apache License 2.0.\nlocal sys = require \"luci.sys\"\nlocal ifaces = sys.net:devices()\nlocal WADM = require \"luci.tools.webadmin\"\nlocal ipc = require \"luci.ip\"\nlocal a, t, e\n\na = Map(\"eqosplus\", translate(\"Network speed limit\"))\na.description = translate(\"Users can limit the network speed for uploading/downloading through MAC, IP, and IP segments (192.168.110.00-192.168.10.200). The speed unit is MB/second.\")\na.template = \"eqosplus/index\"\n\nt = a:section(TypedSection, \"eqosplus\")\nt.anonymous = true\n\ne = t:option(DummyValue, \"eqosplus_status\", translate(\"Status\"))\ne.template = \"eqosplus/eqosplus\"\ne.value = translate(\"Collecting data...\")\n\n\nipi = t:option(ListValue, \"ifname\", translate(\"Interface\"), translate(\"Set the interface used for restriction, use pppoe-wan for dialing, use WAN hardware interface for DHCP mode (such as eth1), and use br-lan for bypass mode\"))\nipi.default = \"1\"\nipi:value(1,translate(\"Automatic settings\"))\nipi:value(\"br-lan\", translate(\"br-lan (LAN Bridge)\"))\nlocal function get_wan_interfaces()\n    local result = {}\n    local ubus = require \"ubus\"\n    \n    local conn = ubus.connect()\n    if not conn then\n        return result\n    end\n\n    local network_status = conn:call(\"network.interface\", \"dump\", {})\n    for _, iface in ipairs(network_status.interface) do\n        if iface.interface:match(\"^wan\") or iface.interface:match(\"^pppoe\") or iface.proto == \"pppoe\" then\n            local dev = iface.l3_device or iface.device\n            if dev then\n                table.insert(result, {\n                    name = dev,\n                    proto = iface.proto,\n                    logical_name = iface.interface\n                })\n            end\n        end\n    end\n\n    conn:close()\n    return result\nend\n\nlocal wan_ifaces = get_wan_interfaces()\nfor _, iface in ipairs(wan_ifaces) do\n    ipi:value(iface.name, translate(iface.name) .. (iface.proto == \"pppoe\" and \" (PPPoE)\" or \" (WAN)\"))\nend\n\nt = a:section(TypedSection, \"device\")\nt.template = \"cbi/tblsection\"\nt.anonymous = true\nt.addremove = true\n\ncomment = t:option(Value, \"comment\", translate(\"Comment\"))\ncomment.size = 8\n\ne = t:option(Flag, \"enable\", translate(\"Enabled\"))\ne.rmempty = false\ne.size = 4\n\nip = t:option(Value, \"mac\", translate(\"IP/MAC\"))\nip.size = 8\n\nlocal function get_devices()\n    local devices = {}\n    local seen_ips = {}\n    local ubus = require \"ubus\"\n    local conn = ubus.connect()\n    \n    local function get_hostname(ip)\n        local f = io.popen(\"nslookup \"..ip..\" 2>/dev/null | grep 'name =' | cut -d'=' -f2 | sed 's/\\\\.$//'\")\n        if f then\n            local name = f:read(\"*l\")\n            f:close()\n            if name and name ~= \"\" then\n                return name:match(\"^%s*(.-)%s*$\")\n            end\n        end\n        local leases_file = io.open(\"/tmp/dhcp.leases\", \"r\")\n        if leases_file then\n            for line in leases_file:lines() do\n                local mac, ip_lease, _, hostname = line:match(\"^(%S+)%s+(%S+)%s+(%S+)%s+(%S+)\")\n                if ip_lease == ip and hostname ~= \"*\" then\n                    leases_file:close()\n                    return hostname\n                end\n            end\n            leases_file:close()\n        end\n       return \"unknown\"\n    end\n    if conn then\n        local leases = conn:call(\"dhcp\", \"ipv4leases\", {}) or {}\n        for _, lease in ipairs(leases) do\n            if lease.ipaddr and lease.mac then\n                local hostname = lease.hostname or get_hostname(lease.ipaddr)\n                devices[#devices+1] = {\n                    ip = lease.ipaddr,\n                    mac = lease.mac:upper(),\n                    hostname = hostname,\n                    display = string.format(\"%s (%s) - %s\", lease.ipaddr, lease.mac:upper(), hostname)\n                }\n                seen_ips[lease.ipaddr] = true\n            end\n        end\n        conn:close()\n    end\n    local arp_cmd = io.popen(\"ip -4 neigh show dev br-lan 2>/dev/null\")\n    if arp_cmd then\n        for line in arp_cmd:lines() do\n            local ip_addr, mac = line:match(\"^(%S+)%s+.+%s+(%S+)%s+\")\n            if ip_addr and mac and mac ~= \"00:00:00:00:00:00\" and not seen_ips[ip_addr] then\n                mac = mac:upper()\n                local hostname = get_hostname(ip_addr)\n                devices[#devices+1] = {\n                    ip = ip_addr,\n                    mac = mac,\n                    hostname = hostname,\n                    display = string.format(\"%s (%s) - %s\", ip_addr, mac, hostname)\n                }\n                seen_ips[ip_addr] = true\n            end\n        end\n        arp_cmd:close()\n    end\n    table.sort(devices, function(a, b) return a.ip < b.ip end)\n    return devices\nend\n\nlocal devices = get_devices()\nfor _, dev in ipairs(devices) do\n    ip:value(dev.ip, dev.display)\nend\ndl = t:option(Value, \"download\", translate(\"Downloads\"))\ndl.default = '0.1'\ndl.size = 4\n\nul = t:option(Value, \"upload\", translate(\"Uploads\"))\nul.default = '0.1'\nul.size = 4\nfunction validate_time(self, value, section)\n        local hh, mm, ss\n        hh, mm, ss = string.match (value, \"^(%d?%d):(%d%d)$\")\n        hh = tonumber (hh)\n        mm = tonumber (mm)\n        if hh and mm and hh <= 23 and mm <= 59 then\n            return value\n        else\n            return nil, \"Time HH:MM or space\"\n        end\nend\n\ne = t:option(Value, \"timestart\", translate(\"Start control time\"))\ne.placeholder = '00:00'\ne.default = '00:00'\ne.validate = validate_time\ne.rmempty = true\ne.size = 4\n\ne = t:option(Value, \"timeend\", translate(\"Stop control time\"))\ne.placeholder = '00:00'\ne.default = '00:00'\ne.validate = validate_time\ne.rmempty = true\ne.size = 4\n\nweek=t:option(Value,\"week\",translate(\"Week Day(1~7)\"))\nweek.rmempty = true\nweek:value('0',translate(\"Everyday\"))\nweek:value(1,translate(\"Monday\"))\nweek:value(2,translate(\"Tuesday\"))\nweek:value(3,translate(\"Wednesday\"))\nweek:value(4,translate(\"Thursday\"))\nweek:value(5,translate(\"Friday\"))\nweek:value(6,translate(\"Saturday\"))\nweek:value(7,translate(\"Sunday\"))\nweek:value('1,2,3,4,5',translate(\"Workday\"))\nweek:value('6,7',translate(\"Rest Day\"))\nweek.default='0'\nweek.size = 6\n\nreturn a\n"
  },
  {
    "path": "luci-app-eqosplus/luasrc/view/eqosplus/eqosplus.htm",
    "content": "<%+cbi/valueheader%>\n<font class=\"eqosplus_status\"><%=pcdata(self:cfgvalue(section) or self.default or \"\")%></font>\n<%+cbi/valuefooter%>"
  },
  {
    "path": "luci-app-eqosplus/luasrc/view/eqosplus/index.htm",
    "content": "<% include(\"cbi/map\") %>\n<script type=\"text/javascript\">//<![CDATA[\n\tXHR.poll(2, '<%=luci.dispatcher.build_url(\"admin\", \"control\", \"eqosplus\", \"status\" )%>', null,\n\t\tfunction (x, result) {\n\t\t\tvar status = document.getElementsByClassName('eqosplus_status')[0];\n\t\t\tstatus.setAttribute(\"style\", \"font-weight:bold;\");\n\t\t\tstatus.setAttribute(\"color\", result.status ? \"green\" : \"red\");\n\t\t\tstatus.innerHTML = result.status ? '<%=translate(\"RUNNING\")%>' : '<%=translate(\"NOT RUNNING\")%>';\n\t\t}\n\t)\n//]]>\n</script>"
  },
  {
    "path": "luci-app-eqosplus/po/templates/eqosplus.pot",
    "content": "\nmsgid \"Eqosplus\"\nmsgstr \"\"\n\nmsgid \"Network speed limit\"\nmsgstr \"\"\n\nmsgid \"Running state\"\nmsgstr \"\"\n\nmsgid \"Not running\"\nmsgstr \"\"\n\nmsgid \"Running\"\nmsgstr \"\"\n\nmsgid \"Users can limit the network speed for uploading/downloading through MAC, IP, and IP segments (192.168.110.00-192.168.10.200). The speed unit is MB/second.\"\nmsgstr \"\"\n\nmsgid \"MAC/IP\"\nmsgstr \"\"\n\nmsgid \"Downloads\"\nmsgstr \"\"\n\nmsgid \"Uploads\"\nmsgstr \"\"\n\nmsgid \"Comment\"\nmsgstr \"\"\n\nmsgid \"Upload bandwidth(Mbit/s)\"\nmsgstr \"\"\n\nmsgid \"Download bandwidth(Mbit/s)\"\nmsgstr \"\"\n\nmsgid \"Start control time\"\nmsgstr \"\"\n\nmsgid \"Stop control time\"\nmsgstr \"\"\n\nmsgid \"Week Day(1~7)\"\nmsgstr \"\"\n\nmsgid \"Suggested feedback:\"\nmsgstr \"\"\n\nmsgid \"Set the interface used for restriction, use pppoe-wan for dialing, use WAN hardware interface for DHCP mode (such as eth1), and use br-lan for bypass mode\"\nmsgstr \"\"\n\nmsgid \"Rest Day\"\nmsgstr \"\"\n\nmsgid \"Workday\"\nmsgstr \"\"\n\nmsgid \"Automatic settings\"\nmsgstr \"\"\n\n"
  },
  {
    "path": "luci-app-eqosplus/po/zh_Hans/eqosplus.po",
    "content": "\nmsgid \"Eqosplus\"\nmsgstr \"定时限速\"\n\nmsgid \"Network speed limit\"\nmsgstr \"定时网速限制\"\n\nmsgid \"Running state\"\nmsgstr \"运行状态\"\n\nmsgid \"Not running\"\nmsgstr \"未运行\"\n\nmsgid \"Running\"\nmsgstr \"已运行\"\n\nmsgid \"Users can limit the network speed for uploading/downloading through MAC, IP, and IP segments (192.168.110.00-192.168.10.200). The speed unit is MB/second.\"\nmsgstr \"用户可以通过MAC、IP、IP段（192.168.10.100-192.168.10.200),限制上传/下载的网络速度。速度单位为MB/秒。。\"\n\nmsgid \"MAC/IP\"\nmsgstr \"MAC/IP\"\n\nmsgid \"Downloads\"\nmsgstr \"下载速度\"\n\nmsgid \"Uploads\"\nmsgstr \"上传速度\"\n\nmsgid \"Comment\"\nmsgstr \"备注\"\n\nmsgid \"Upload bandwidth(Mbit/s)\"\nmsgstr \"上传总带宽(Mbit/s)\"\n\nmsgid \"Download bandwidth(Mbit/s)\"\nmsgstr \"下载总带宽(Mbit/s)\"\n\nmsgid \"Start control time\"\nmsgstr \"起控时间\"\n\nmsgid \"Stop control time\"\nmsgstr \"停控时间\"\n\nmsgid \"Week Day(1~7)\"\nmsgstr \"星期(1~7)\"\n\nmsgid \"Suggested feedback:\"\nmsgstr \"建议反馈:\"\n\nmsgid \"Set the interface used for restriction, use pppoe-wan for dialing, use WAN hardware interface for DHCP mode (such as eth1), and use br-lan for bypass mode\"\nmsgstr \"设定用来限制网络速度的接口,拨号使用pppoe-wan,DHCP模式使用WAN口的硬件接口(如:eth1),通用使用br-lan接口\"\n\nmsgid \"Rest Day\"\nmsgstr \"休息日\"\n\nmsgid \"Workday\"\nmsgstr \"工作日\"\n\nmsgid \"Automatic settings\"\nmsgstr \"自动设置\"\n\n"
  },
  {
    "path": "luci-app-eqosplus/root/etc/config/eqosplus",
    "content": "\nconfig eqosplus\n\toption enabled '0'\n\toption download '1000'\n\toption upload '30'\n\toption ifname '1'\n\nconfig device\n\toption timestart '00:00'\n\toption week '0'\n\toption download '1'\n\toption timeend '23:55'\n\toption upload '1'\n\toption mac '192.168.10.10'\n\toption enable '0'\n\nconfig device\n\toption mac '192.168.10.10-192.168.10.200'\n\toption timestart '00:00'\n\toption timeend '00:00'\n\toption week '0'\n\toption download '0.1'\n\toption upload '0.1'\n\toption enable '0'\n\n"
  },
  {
    "path": "luci-app-eqosplus/root/etc/hotplug.d/iface/10-eqosplus",
    "content": "#!/bin/sh\n[ \"$ACTION\" = \"ifup\" ] && [ \"$INTERFACE\" = \"wan\" ] && {\n    sleep 5\n    /etc/init.d/eqosplus restart\n}"
  },
  {
    "path": "luci-app-eqosplus/root/etc/init.d/eqosplus",
    "content": "#!/bin/sh /etc/rc.common\n#\n# Copyright (C) 2025 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-eqosplus\n#\n\nSTART=99\nUSE_PROCD=1\n\nNAME=eqosplus\nLOCK=\"/var/lock/$NAME.lock\"\nCR=/etc/crontabs/root\n\nstart_instance() {\n\t procd_open_instance\n\t procd_set_param command /usr/bin/eqosplusctrl\n\t procd_set_param respawn\n\t procd_set_param stderr 1\n\t procd_close_instance\n}\n\n_eqosplus_start() {\n\t if [ \"$(grep -c 'option enable .1.' /etc/config/$NAME 2>/dev/null)\" -gt \"0\" ]; then\n\t if [ x$(uci -q get turboacc.config.sw_flow) = 'x1' ] || [ x$(uci -q get turboacc.config.sfe_flow) = 'x1' ]  ;then\n\t         uci -q set turboacc.config.sw_flow='0'\n\t         uci -q set turboacc.config.sfe_flow='0'\n\t\t uci -q set turboacc.config.hw_flow='0'\n\t\t uci commit turboacc\n\t\t /etc/init.d/turboacc restart\n\t  fi\n\t    touch $LOCK\n\t    eqosplus start\n\t    start_instance\n\t    (crontab -l ; echo \"00 1 * * * /etc/init.d/eqosplus start\") | sort - | uniq - | crontab -\n\t fi\n}\n\nstart_service(){\n\t[ -f $LOCK ] && exit\n\tstop_service\n\t_eqosplus_start\n\trm -f $LOCK\n}\n\nservice_triggers() {\n \t procd_add_reload_trigger 'eqosplus'\n}\n\nstop_service(){\n\tkill -9 $(busybox ps -w | grep 'eqosplusctrl' | grep -v 'grep' | awk '{print $1}') >/dev/null 2>&1\n\tsed -i '/eqosplus/d' $CR >/dev/null 2>&1\n\trm -f $LOCK 2>/dev/null\n\teqosplus stop\n}\n\n"
  },
  {
    "path": "luci-app-eqosplus/root/etc/uci-defaults/luci-eqosplus",
    "content": "#!/bin/sh\nchmod +x  /etc/init.d/eqosplus /usr/bin/eqosplus*\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@eqosplus[-1]\n\tadd ucitrack eqosplus\n\tset ucitrack.@eqosplus[-1].init=eqosplus\n\tcommit ucitrack\nEOF\n\n[ -s /etc/config/eqosplus ] || echo \"config eqosplus\" > /etc/config/eqosplus\n\nrm -f /tmp/luci-indexcache\nexit 0\n"
  },
  {
    "path": "luci-app-eqosplus/root/usr/bin/eqosplus",
    "content": "#!/bin/bash\n\n# Copyright (C) 2006 OpenWrt.org\n# Copyright 2022-2025 sirpdboy <herboy2008@gmail.com>\n\ncrrun=$1\ncrid=$2\nNAME=eqosplus\nIDLIST=\"/var/$NAME.idlist\"\nLOCK=\"/var/lock/$NAME.lock\"\nTMPID=\"/var/$NAME.tmpid\"\nLOG=\"/var/$NAME_log.log\"\n# idlist=`uci show $NAME | grep \"enable='1'\" | grep \"device\" | grep -oE '\\[.*?\\]' | grep -o '[0-9]' `\n\n\nif [ x$(uci get $NAME.@$NAME[0].ifname 2>/dev/null) = 'x1' ]; then\n    ifname=$(uci -q get network.lan.ifname)\n    [ \"x$ifname\" = \"x\" ] && ifname=\"device\" || ifname=\"ifname\"\n    dev=$(uci -q get network.wan.$ifname)\n    [ ! \"$dev\" ] && dev=br-lan\nelse\n    dev=$(uci -q get $NAME.@$NAME[0].ifname 2>/dev/null)\n    [ ! \"$dev\" ] && dev=br-lan\nfi\n\nbin_nft=$(which nft)\nbin_tc=$(which tc)\nbin_ip=$(which ip)\nDEBUG=1\n\nnft_type() {\n    if command -v nft >/dev/null; then\n        nftables_ver=\"true\"\n    fi\n}\n\n# Debug functions\ndbg_nft() {\n    [ \"${DEBUG:-0}\" -eq 0 ] || echo \"DEBUG: nft $*\"\n    $bin_nft \"$@\"\n}\n\ndbg_tc() {\n    [ \"${DEBUG:-0}\" -eq 0 ] || echo \"DEBUG: tc $*\"\n    $bin_tc \"$@\"\n}\n\ndbg_ip() {\n    [ \"${DEBUG:-0}\" -eq 0 ] || echo \"DEBUG: ip $*\"\n    $bin_ip \"$@\"\n}\n\nis_macaddr() {\n    ret=1\n    if echo \"$1\" | grep -qE '^([0-9A-Fa-f]{2}[-:]){5}[0-9A-Fa-f]{2}$'; then\n        ret=0\n    fi\n    return $ret\n}\n\n# 数值比较函数\nis_gt_zero() {\n    local value=$1\n    # 使用bc进行浮点数比较\n    echo \"$value > 0\" | bc -l 2>/dev/null | grep -q 1\n}\n\n# 转换为kbit\nto_kbit() {\n    local mb=$1\n    # MB/s 转 kbit/s: 1 MB/s = 8192 kbit/s\n    echo \"scale=0; $mb * 8192 / 1\" | bc 2>/dev/null || echo \"0\"\n}\n\n# Default commands\ntc=\"dbg_tc\"\nip=\"dbg_ip\"\nnft=\"dbg_nft\"\n\nnft_type\n\nstop_qos() {\n    for face in $(tc qdisc show 2>/dev/null | grep htb | awk '{print $5}'); do\n        $tc qdisc del dev $face root 2>/dev/null\n    done\n\n    $tc qdisc del dev ${dev} root 2>/dev/null\n    $tc qdisc del dev ${dev}_ifb root 2>/dev/null\n    $tc qdisc del dev ${dev} ingress 2>/dev/null\n        $ip link del dev ${dev}_ifb 2>/dev/null 2>&1\n\n    if [ -n \"$nftables_ver\" ]; then\n        $nft delete table inet ${NAME} 2>/dev/null\n        $nft delete table bridge ${NAME} 2>/dev/null\n    fi\n\n    echo \"\" > \"$IDLIST\" 2>/dev/null\n}\n\ninit_qosplus() {\n\n    insmod sch_htb 2>/dev/null\n    insmod act_mirred 2>/dev/null\n    insmod ifb 2>/dev/null\n    \n    $ip link del dev ${dev}_ifb 2>/dev/null\n    $ip link add dev ${dev}_ifb name ${dev}_ifb type ifb\n    $ip link set dev ${dev}_ifb up\n\n    $tc qdisc del dev ${dev} root 2>/dev/null\n    $tc qdisc add dev ${dev} root handle 1:0 htb default 1\n    $tc class add dev ${dev} parent 1:0 classid 1:1 htb rate 1000mbit ceil 1000mbit\n    \n    $tc qdisc del dev ${dev}_ifb root 2>/dev/null\n    $tc qdisc add dev ${dev}_ifb root handle 1:0 htb default 1\n    $tc class add dev ${dev}_ifb parent 1:0 classid 1:1 htb rate 1000mbit ceil 1000mbit\n    lanipaddr=$(uci -q get network.lan.ipaddr 2>/dev/null | awk -F '.' '{print $1\".\"$2\".\"$3\".0/24\"}')\n    if [ -n \"$lanipaddr\" ]; then\n        $tc filter add dev $dev parent 1:0 protocol ip prio 1 u32 match ip src \"$lanipaddr\" match ip dst \"$lanipaddr\" flowid 1:1\n        $tc filter add dev ${dev}_ifb parent 1:0 protocol ip prio 1 u32 match ip src \"$lanipaddr\" match ip dst \"$lanipaddr\" flowid 1:1\n    fi\n    $tc qdisc del dev ${dev} ingress 2>/dev/null\n    $tc qdisc add dev ${dev} ingress\n    $tc filter add dev ${dev} parent ffff: protocol all prio 2 u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ${dev}_ifb\n\n    if [ -n \"$nftables_ver\" ]; then\n        $nft delete table inet ${NAME} 2>/dev/null\n        $nft delete table bridge ${NAME} 2>/dev/null\n        \n        $nft add table inet ${NAME}\n        \n        $nft add chain inet ${NAME} mark_forward { type filter hook forward priority -200\\; policy accept\\; }\n        $nft add chain inet ${NAME} mark_output { type filter hook output priority -200\\; policy accept\\; }\n        $nft add chain inet ${NAME} mark_postrouting { type filter hook postrouting priority -200\\; policy accept\\; }\n    fi\n    \n    return 0\n}\n\n\ndel_id() {\n    local list_id=$1\n    id=$((list_id * 10 + 1000))\n    [ \"${DEBUG:-0}\" -eq 0 ] || echo \"D: del_id $@ --$id --$mac\"\n    $tc filter del dev ${dev} parent 1: handle 800::$(printf \"%x\" $id) 2>/dev/null\n    $tc class del dev ${dev} parent 1:1 classid 1:$id 2>/dev/null\n    $tc filter del dev ${dev}_ifb parent 1: handle 800::$(printf \"%x\" $id) 2>/dev/null\n    $tc class del dev ${dev}_ifb parent 1:1 classid 1:$id 2>/dev/null\n    mac=$(uci -q get $NAME.@device[$list_id].mac 2>/dev/null)\n    if [ -n \"$nftables_ver\" ] && [ -n \"$mac\" ]; then\n        if is_macaddr \"$mac\"; then\n            $nft delete rule inet ${NAME} mark_forward ether saddr $mac counter 2>/dev/null\n            $nft delete rule inet ${NAME} mark_output ether saddr $mac counter 2>/dev/null\n            $nft delete rule inet ${NAME} mark_postrouting ether saddr $mac counter 2>/dev/null\n        else\n            Z=$(echo $mac | awk -F '[/]' '{print $2}')\n            [ -n \"$Z\" ] && mac=$(echo $mac | awk -F '[/]' '{print $1}') || Z=32\n            $nft delete rule inet ${NAME} mark_forward ip saddr $mac/$Z counter 2>/dev/null\n            $nft delete rule inet ${NAME} mark_output ip saddr $mac/$Z counter 2>/dev/null\n            $nft delete rule inet ${NAME} mark_postrouting ip saddr $mac/$Z counter 2>/dev/null\n        fi\n    fi\n}\n\nadd_mac() {\n    local list_id=$1\n    id=$((list_id * 10 + 1000))\n    M0=$(echo $mac | cut -d : -f 1)$(echo $mac | cut -d : -f 2)\n    M1=$(echo $mac | cut -d : -f 3)$(echo $mac | cut -d : -f 4)\n    M2=$(echo $mac | cut -d : -f 5)$(echo $mac | cut -d : -f 6)\n    [ \"${DEBUG:-0}\" -eq 0 ] || echo \"D: add_mac $@ --id:$id --mac:$mac M012--$M0-$M1-$M2\"\n\n    if is_gt_zero \"$UL\"; then\n        if [ -n \"$nftables_ver\" ]; then\n            $nft add rule inet ${NAME} mark_forward ether saddr $mac counter meta mark set $id\n            $nft add rule inet ${NAME} mark_output ether saddr $mac counter meta mark set $id\n            $nft add rule inet ${NAME} mark_postrouting ether saddr $mac counter meta mark set $id\n        fi\n        $tc class add dev ${dev}_ifb parent 1:1 classid 1:$id htb rate \"${UL}kbit\" ceil \"${UL}kbit\" prio $id burst 15k cburst 15k\n        $tc qdisc add dev ${dev}_ifb parent 1:$id handle ${id}: sfq perturb 10\n\n        $tc filter add dev ${dev}_ifb parent 1: protocol ip prio $id handle $id fw flowid 1:$id\n\n        $tc filter add dev ${dev}_ifb parent 1: protocol ip prio $((id + 100)) u32 \\\n            match u16 0x0800 0xFFFF at -2 \\\n            match u16 0x${M2} 0xFFFF at -4 \\\n            match u32 0x${M0}${M1} 0xFFFFFFFF at -8 \\\n            flowid 1:$id\n    fi\n    if is_gt_zero \"$DL\"; then\n        $tc class add dev ${dev} parent 1:1 classid 1:$id htb rate \"${DL}kbit\" ceil \"${DL}kbit\" prio $id burst 15k cburst 15k\n        $tc qdisc add dev ${dev} parent 1:$id handle ${id}: sfq perturb 10\n\n        $tc filter add dev ${dev} parent 1: protocol ip prio $id u32 \\\n            match u16 0x0800 0xFFFF at -2 \\\n            match u32 0x${M1}${M2} 0xFFFFFFFF at -12 \\\n            match u16 0x${M0} 0xFFFF at -14 \\\n            flowid 1:$id\n    fi\n}\n\nadd_ip() {\n    local list_id=$1\n    id=$((list_id * 10 + 1000))\n    [ \"${DEBUG:-0}\" -eq 0 ] || echo \"D: add_ip $@ --$id --$mac\"\n    \n    Z=$(echo $mac | awk -F '[/]' '{print $2}')\n    [ -n \"$Z\" ] && mac=$(echo $mac | awk -F '[/]' '{print $1}') || Z=32\n    if is_gt_zero \"$UL\"; then\n        if [ -n \"$nftables_ver\" ]; then\n            $nft add rule inet ${NAME} mark_forward ip saddr $mac/$Z counter meta mark set $id\n            $nft add rule inet ${NAME} mark_output ip saddr $mac/$Z counter meta mark set $id\n            $nft add rule inet ${NAME} mark_postrouting ip saddr $mac/$Z counter meta mark set $id\n        fi\n        $tc class add dev ${dev}_ifb parent 1:1 classid 1:$id htb rate \"${UL}kbit\" ceil \"${UL}kbit\" prio $id burst 15k cburst 15k\n        $tc qdisc add dev ${dev}_ifb parent 1:$id handle ${id}: sfq perturb 10\n        $tc filter add dev ${dev}_ifb parent 1: protocol ip prio $id handle $id fw flowid 1:$id\n        $tc filter add dev ${dev}_ifb parent 1:0 prio $((id + 100)) protocol ip u32 \\\n            match ip src \"$mac\"/\"$Z\" \\\n            flowid 1:$id\n    fi\n    if is_gt_zero \"$DL\"; then\n        $tc class add dev ${dev} parent 1:1 classid 1:$id htb rate \"${DL}kbit\" ceil \"${DL}kbit\" prio $id burst 15k cburst 15k\n        $tc qdisc add dev ${dev} parent 1:$id handle ${id}: sfq perturb 10\n        $tc filter add dev ${dev} parent 1:0 prio $id protocol ip u32 \\\n            match ip dst \"$mac\"/\"$Z\" \\\n            flowid 1:$id\n    fi\n}\n\ncheck_time() {\n    local start=$1\n    local end=$2\n    local current=$(date +%H%M)\n    local start_min=$((10#${start:0:2}*60 + 10#${start:3:2}))\n    local end_min=$((10#${end:0:2}*60 + 10#${end:3:2}))\n    local current_min=$((10#${current:0:2}*60 + 10#${current:2:2}))\n    \n    if [[ $start_min -lt $end_min ]]; then\n        [[ $current_min -ge $start_min && $current_min -lt $end_min ]]\n    else\n        [[ $current_min -ge $start_min || $current_min -lt $end_min ]]\n    fi\n}\n\ncheck_list() {\n    local i=$1\n    local start_time=$(uci -q get $NAME.@device[$i].timestart 2>/dev/null)\n    local end_time=$(uci -q get $NAME.@device[$i].timeend 2>/dev/null)\n    local wweek=$(uci -q get $NAME.@device[$i].week 2>/dev/null)\n    local current_weekday=$(date +%u)\n    [ -z \"$start_time\" ] && [ -z \"$end_time\" ] && [ -z \"$wweek\" ] && return 0\n    \n    if [ -n \"$wweek\" ] && [ \"$wweek\" != \"0\" ]; then\n        local day_match=0\n        for day in $(echo $wweek | tr ',' ' '); do\n            [ \"$day\" -eq \"$current_weekday\" ] && day_match=1 && break\n        done\n        [ \"$day_match\" -eq 0 ] && return 1\n    fi\n    \n    if [ -n \"$start_time\" ] && [ -n \"$end_time\" ]; then\n        check_time \"$start_time\" \"$end_time\" || return 1\n    fi\n    \n    return 0\n}\n\ncase \"$crrun\" in\n    \"stop\")\n        stop_qos\n    ;;\n    \"start\")\n        stop_qos > /dev/null 2>&1\n        sleep 2\n        init_qosplus\n        idlist=$(uci show $NAME 2>/dev/null | grep \"enable='1'\" | grep \"device\" | grep -oE '\\[.*?\\]' | grep -o '[0-9]' | sort -nu | sed -e 's/^/!/g' -e 's/$/!/g' > $IDLIST; cat $IDLIST 2>/dev/null | sed -e 's/!//g')\n        \n        if [ ! -s \"$IDLIST\" ]; then\n            return 1\n        fi\n\n        device_count=0\n        for list in $(echo $idlist | sed -e 's/!//g'); do\n            if check_list $list; then\n                mac=$(uci -q get $NAME.@device[$list].mac 2>/dev/null)\n                download_mb=$(uci -q get $NAME.@device[$list].download 2>/dev/null)\n                upload_mb=$(uci -q get $NAME.@device[$list].upload 2>/dev/null)\n                comment=$(uci -q get $NAME.@device[$list].comment 2>/dev/null)\n                \n                # 转换为kbit\n                DL=$(to_kbit \"$download_mb\")\n                UL=$(to_kbit \"$upload_mb\")\n                \n                if [ -n \"$mac\" ]; then\n                    if is_macaddr \"$mac\"; then\n                        add_mac $list  >>$LOG\n                        echo \"✅ MAC限速: $comment ($mac) - 下载:${download_mb}MB/s(${DL}kbit/s) 上传:${upload_mb}MB/s(${UL}kbit/s)\"  >>$LOG\n                    else\n                        add_ip $list  >>$LOG\n                        echo \"✅ IP限速: $comment ($mac) - 下载:${download_mb}MB/s(${DL}kbit/s) 上传:${upload_mb}MB/s(${UL}kbit/s)\"  >>$LOG\n                    fi\n                    device_count=$((device_count + 1))\n                fi\n            else\n                [ -f \"$IDLIST\" ] && [ $(grep \"!${list}!\" \"$IDLIST\" 2>/dev/null | wc -l) -gt 0 ] && {\n                    del_id $list  >>$LOG\n                    sed -i \"/!$list!/d\" \"$IDLIST\" >/dev/null 2>&1\n                    comment=$(uci -q get $NAME.@device[$list].comment 2>/dev/null)\n                }\n            fi\n        done\n        echo \"EQOSPLUS限速服务启动完成，共配置 $device_count 个设备\"  >>$LOG\n        echo \"\"\n        echo \"当前限速状态:\"   >>$LOG\n        tc -s class show dev $dev | grep \"rate\" | head -5   >>$LOG\n        tc -s class show dev ${dev}_ifb | grep \"rate\" | head -5   >>$LOG\n\n    ;;\n    \"add\")\n        echo \"➕ 添加限速规则...\"\n        for list in $(echo $crid | sed -e 's/!//g' | sed 's/,/ /g'); do\n            mac=$(uci -q get $NAME.@device[$list].mac 2>/dev/null)\n            download_mb=$(uci -q get $NAME.@device[$list].download 2>/dev/null)\n            upload_mb=$(uci -q get $NAME.@device[$list].upload 2>/dev/null)\n            comment=$(uci -q get $NAME.@device[$list].comment 2>/dev/null)\n            DL=$(to_kbit \"$download_mb\")\n            UL=$(to_kbit \"$upload_mb\")\n            \n            if is_macaddr $mac; then\n                add_mac $list\n                echo \"✅ 添加MAC限速: $comment ($mac)\" >>$LOG\n            else\n                add_ip $list\n                echo \"✅ 添加IP限速: $comment ($mac)\" >>$LOG\n            fi\n        done\n    ;;\n    \"del\")\n        for list in $(echo $crid | sed -e 's/!//g' | sed 's/,/ /g'); do \n            comment=$(uci -q get $NAME.@device[$list].comment 2>/dev/null)\n            mac=$(uci -q get $NAME.@device[$list].mac 2>/dev/null)\n            del_id $list\n        done\n    ;;\n    \"status\")\n        echo \"EQOSPLUS限速服务状态\"\n        echo \"### 网络接口: $dev ###\"\n        echo \"# 下载队列统计 #\"\n        tc -s qdisc show dev $dev 2>/dev/null || echo \"无下载队列\"\n        echo \"# 下载类统计 #\"\n        tc -s class show dev $dev 2>/dev/null | grep -E \"class htb|rate [0-9]\" || echo \"无下载类\"\n        echo \"# 下载过滤器 #\"\n        tc -s filter show dev $dev parent 1: 2>/dev/null | head -10 || echo \"无下载过滤器\"\n        \n        echo \"### 虚拟接口: ${dev}_ifb ###\"\n        echo \"# 上传队列统计 #\"\n        tc -s qdisc show dev ${dev}_ifb 2>/dev/null || echo \"无上传队列\"\n        echo \"# 上传类统计 #\"\n        tc -s class show dev ${dev}_ifb 2>/dev/null | grep -E \"class htb|rate [0-9]\" || echo \"无上传类\"\n        echo \"# 上传过滤器 #\"\n        tc -s filter show dev ${dev}_ifb parent 1: 2>/dev/null | head -10 || echo \"无上传过滤器\"\n        \n        if [ -n \"$nftables_ver\" ]; then\n            echo \"### NFTables规则 ###\"\n            nft list table inet ${NAME} 2>/dev/null || echo \"没有NFTables规则\"\n        else\n            echo \"NFTables不可用\"\n        fi\n        \n        # 显示流量统计\n        echo \"### 流量统计 ###\"\n        echo \"下载流量:\"\n        tc -s class show dev $dev 2>/dev/null | grep \"Sent\" | head -5\n        echo \"上传流量:\"\n        tc -s class show dev ${dev}_ifb 2>/dev/null | grep \"Sent\" | head -5\n    ;;\n\nesac"
  },
  {
    "path": "luci-app-eqosplus/root/usr/bin/eqosplusctrl",
    "content": "#!/bin/sh\n\n# Copyright (C) 2006 OpenWrt.org\n# Copyright 2022-2025 sirpdboy <herboy2008@gmail.com>\nNAME=eqosplus\nIDLIST=\"/var/$NAME.idlist\"\nTMPID=\"/var/$NAME.tmpid\"\n\nidlist=`uci show $NAME | grep \"enable='1'\" | grep \"device\" | grep -oE '\\[.*?\\]' | grep -o '[0-9]' `\n\ncheck_list() {\n\ti=$1\n\tchecki='0'\n\tstart_time=$(uci -q get $NAME.@device[$i].timestart 2>/dev/null)\n\tend_time=$(uci -q get $NAME.@device[$i].timeend 2>/dev/null)\n\twweek=`uci -q get $NAME.@device[$i].week `\n\tcurrent_time=$(date +%H:%M)\n\tcurrent_weekday=$(date +%u)\n\tfor ww in `echo $wweek | sed 's/,/ /g' `; do \n\t\tif [ $current_weekday = $ww ] || [ 'x0' = x$ww ] ;then \n\t\t       [ \"$start_time\" = \"$end_time\" ] && checki='1' || { \n\t\t       \t   if  [ \"$start_time\" \\< \"$end_time\" ]; then\n\t\t\t       if  [ \"$current_time\" \\> \"$start_time\" ]  &&  [ \"$current_time\" \\< \"$end_time\" ] ; then\n\t\t       \t           checki='1'\n\t\t       \t       fi\n\t\t       \t   else \n\t\t\t       if [ \"$start_time\" \\> \"$end_time\" ] ; then\n\t\t\t          if [ \"$current_time\" \\< \"$start_time\" ] && [ \"$current_time\" \\> \"$end_time\" ] ; then\n\t\t       \t              checki='1'\n\t\t       \t          fi\n\t\t\t       fi\n\t\t\t   fi\n\t\t       \t}\n\t\tfi\n\tdone\n\treturn\n}\n\nidlistusr(){\n   checki='0'\n   [ -s $IDLIST ] || touch $IDLIST\n   for list in $idlist ;do\n\tcheck_list $list\n\tif [ $checki == '1' ] ; then\n\t     [ `cat $IDLIST  2>/dev/null | grep \"!${list}!\" | wc -l ` -gt 0 ] || { \n\t         eqosplus add $list\n\t         echo \"!${list}!\" >> $IDLIST ;  cat $IDLIST | sort | uniq  > $TMPID ;cat $TMPID >$IDLIST ;rm -rf $TMPID\n\t     }\n        else\n\t     [ `cat $IDLIST  2>/dev/null | grep \"!${list}!\" | wc -l ` -gt 0 ] && {\n\t         eqosplus del $list\n\t\t sed -i \"/!$list!/d\" $IDLIST >/dev/null 2>&1\n\t     }\n\tfi\n   done\n}\n\n\nwhile :;do\n\tsleep 30\n\tidlistusr\n\tsleep 30\ndone"
  },
  {
    "path": "luci-app-eqosplus/root/usr/share/rpcd/acl.d/luci-app-eqosplus.json",
    "content": "{\n\t\"luci-app-eqosplus\": {\n\t\t\"description\": \"Grant UCI access for luci-app-eqosplus\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"eqosplus\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"eqosplus\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-fastnet/Makefile",
    "content": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for fastnet\nLUCI_DEPENDS:=+fastnet\nLUCI_PKGARCH:=all\nPKG_VERSION:=0.7.2-r1\n# PKG_RELEASE MUST be empty for luci.mk\nPKG_RELEASE:=\nLUCI_MINIFY_CSS:=0\nLUCI_MINIFY_JS:=0\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n\n"
  },
  {
    "path": "luci-app-fastnet/luasrc/controller/fastnet.lua",
    "content": "module(\"luci.controller.fastnet\", package.seeall)\n\nfunction index()\n\tlocal fs = require \"nixio.fs\"\n\tif not fs.access(\"/etc/config/fastnet\") then\n\t\treturn\n\tend\n\n\tentry({\"admin\", \"services\", \"fastnet\"}, cbi(\"fastnet\"), _(\"FastNet\"), 50).dependent = true\n\tentry({\"admin\", \"services\", \"fastnet\", \"status\"}, call(\"action_status\")).leaf = true\nend\n\nfunction action_status()\n\tlocal sys = require \"luci.sys\"\n\tlocal uci = require \"luci.model.uci\".cursor()\n\tlocal http = require \"luci.http\"\n\n\tlocal function get_host()\n\t\tlocal host = http.getenv(\"HTTP_HOST\") or http.getenv(\"SERVER_NAME\") or \"\"\n\t\thost = host:gsub(\":%d+$\", \"\")\n\t\tif host == \"_redirect2ssl\" or host == \"redirect2ssl\" or host == \"\" then\n\t\t\thost = http.getenv(\"SERVER_ADDR\") or \"localhost\"\n\t\tend\n\t\treturn host\n\tend\n\n\tlocal running = (sys.call(\"pidof FastNet >/dev/null\") == 0)\n\tlocal host = get_host()\n\tlocal port = uci:get_first(\"fastnet\", \"fastnet\", \"port\") or \"3200\"\n\tlocal token = uci:get_first(\"fastnet\", \"fastnet\", \"token\") or \"\"\n\n\tlocal url = \"http://\" .. host .. \":\" .. port .. \"/\"\n\tif token ~= \"\" then\n\t\turl = url .. \"?token=\" .. token\n\tend\n\n\thttp.prepare_content(\"application/json\")\n\thttp.write_json({\n\t\trunning = running,\n\t\thost = host,\n\t\tport = port,\n\t\turl = url\n\t})\nend\n"
  },
  {
    "path": "luci-app-fastnet/luasrc/model/cbi/fastnet.lua",
    "content": "local sys = require \"luci.sys\"\nlocal uci = require \"luci.model.uci\".cursor()\nlocal http = require \"luci.http\"\n\nlocal m = Map(\"fastnet\", translate(\"FastNet\"))\nm.description = translate(\"FastNet provides network testing tools and a Web UI.\")\n\nlocal function get_host()\n\tlocal host = http.getenv(\"HTTP_HOST\") or http.getenv(\"SERVER_NAME\") or \"\"\n\thost = host:gsub(\":%d+$\", \"\")\n\tif host == \"_redirect2ssl\" or host == \"redirect2ssl\" or host == \"\" then\n\t\thost = http.getenv(\"SERVER_ADDR\") or \"localhost\"\n\tend\n\treturn host\nend\n\nlocal st = m:section(SimpleSection, translate(\"Status\"))\nlocal running = (sys.call(\"pidof FastNet >/dev/null\") == 0)\nlocal listen_port = uci:get_first(\"fastnet\", \"fastnet\", \"port\") or \"3200\"\nlocal token = uci:get_first(\"fastnet\", \"fastnet\", \"token\") or \"\"\nlocal url = \"http://\" .. get_host() .. \":\" .. listen_port .. \"/\"\nif token ~= \"\" then\n  url = url .. \"?token=\" .. token\nend\n\nst.template = \"fastnet/status\"\nst.running = running\nst.url = url\n\nlocal s = m:section(TypedSection, \"fastnet\", translate(\"Settings\"))\ns.anonymous = true\n\nlocal enabled = s:option(Flag, \"enabled\", translate(\"Enable\"))\nenabled.default = enabled.enabled\n\nlocal port = s:option(Value, \"port\", translate(\"Listen Port\"))\nport.datatype = \"port\"\nport.default = \"3200\"\n\nlocal token = s:option(Value, \"token\", translate(\"API Token\"))\ntoken.password = true\ntoken.rmempty = true\n\nlocal logger = s:option(Flag, \"logger\", translate(\"Enable Logging\"))\nlogger.rmempty = true\n\nreturn m\n"
  },
  {
    "path": "luci-app-fastnet/luasrc/view/fastnet/status.htm",
    "content": "<fieldset class=\"cbi-section\">\n\t<legend><%:Status%></legend>\n\t<div class=\"cbi-section-node\">\n\t\t<div class=\"cbi-value\">\n\t\t\t<label class=\"cbi-value-title\"><%:Status%></label>\n\t\t\t<div class=\"cbi-value-field\">\n\t\t\t\t<% if self.running then %>\n\t\t\t\t<span style=\"color: green; font-weight: bold\"><%:Running%></span>\n\t\t\t\t<% else %>\n\t\t\t\t<span style=\"color: red; font-weight: bold\"><%:Not running%></span>\n\t\t\t\t<% end %>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"cbi-value\">\n\t\t\t<label class=\"cbi-value-title\"><%:Open Web UI%></label>\n\t\t\t<div class=\"cbi-value-field\">\n\t\t\t\t<a href=\"<%=self.url%>\" target=\"_blank\" rel=\"noreferrer\"><%:Open Web UI%></a>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</fieldset>\n"
  },
  {
    "path": "luci-app-fastnet/po/zh_Hans/fastnet.po",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\nmsgid \"FastNet\"\nmsgstr \"FastNet\"\n\nmsgid \"FastNet provides network testing tools and a Web UI.\"\nmsgstr \"FastNet 提供网络测试工具与 Web 界面。\"\n\nmsgid \"Settings\"\nmsgstr \"设置\"\n\nmsgid \"Enable\"\nmsgstr \"启用\"\n\nmsgid \"Listen Host\"\nmsgstr \"监听地址\"\n\nmsgid \"Listen Port\"\nmsgstr \"监听端口\"\n\nmsgid \"API Token\"\nmsgstr \"访问 Token\"\n\nmsgid \"Enable Logging\"\nmsgstr \"启用日志\"\n\nmsgid \"Status\"\nmsgstr \"状态\"\n\nmsgid \"Running\"\nmsgstr \"运行中\"\n\nmsgid \"Not running\"\nmsgstr \"未运行\"\n\nmsgid \"Open Web UI\"\nmsgstr \"打开 Web 界面\"\n\n"
  },
  {
    "path": "luci-app-fastnet/root/etc/uci-defaults/50_luci-fastnet",
    "content": "#!/bin/sh\n\nrm -f /tmp/luci-indexcache\nexit 0\n\n"
  },
  {
    "path": "luci-app-fileassistant/Makefile",
    "content": "# From https://github.com/DarkDean89/luci-app-filebrowser\n# From https://github.com/stuarthua/oh-my-openwrt/tree/master/stuart/luci-app-fileassistant\n# This is free software, licensed under the Apache License, Version 2.0 .\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for Fileassistant\nLUCI_PKGARCH:=all\nPKG_VERSION:=1.0\nPKG_RELEASE:=5\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature"
  },
  {
    "path": "luci-app-fileassistant/htdocs/luci-static/resources/fileassistant/fb.css",
    "content": ".fb-container {\n    margin-top: 1rem;\n}\n.fb-container .cbi-button {\n    height: 1.8rem;\n}\n.fb-container .cbi-input-text {\n    margin-bottom: 1rem;\n    width: 100%;\n}\n.fb-container .panel-title {\n    padding-bottom: 0;\n    width: 50%;\n    border-bottom: none;\n}\n.fb-container .panel-container {\n    display: flex;\n    align-items: center;\n    justify-content: space-between;\n    padding-bottom: 1rem;\n    border-bottom: 1px solid #eee;\n}\n.fb-container .upload-container {\n    display: none;\n    margin: 1rem 0;\n}\n.fb-container .upload-file {\n    margin-right: 2rem;\n}\n.fb-container .cbi-value-field {\n    text-align: left;\n}\n.fb-container .parent-icon strong {\n    margin-left: 1rem;\n}\n.fb-container td[class$=\"-icon\"] {\n    cursor: pointer;\n}\n.fb-container .file-icon, .fb-container .folder-icon, .fb-container .link-icon {\n    position: relative;\n}\n.fb-container .file-icon:before, .fb-container .folder-icon:before, .fb-container .link-icon:before {\n    display: inline-block;\n    width: 1.5rem;\n    height: 1.5rem;\n    content: '';\n    background-size: contain;\n    margin: 0 0.5rem 0 1rem;\n    vertical-align: middle;\n}\n.fb-container .file-icon:before {\n    background-image: url(file-icon.png);\n}\n.fb-container .folder-icon:before {\n    background-image: url(folder-icon.png);\n}\n.fb-container .link-icon:before {\n    background-image: url(link-icon.png);\n}\n@media screen and (max-width: 480px) {\n    .fb-container .upload-file {\n        width: 14.6rem;\n    }\n    .fb-container .cbi-value-owner,\n    .fb-container .cbi-value-perm {\n        display: none;\n    }\n}\n"
  },
  {
    "path": "luci-app-fileassistant/htdocs/luci-static/resources/fileassistant/fb.js",
    "content": "String.prototype.replaceAll = function(search, replacement) {\n  var target = this;\n  return target.replace(new RegExp(search, 'g'), replacement);\n};\n(function () {\n  var iwxhr = new XHR();\n  var listElem = document.getElementById(\"list-content\");\n  listElem.onclick = handleClick;\n  var currentPath;\n  var pathElem = document.getElementById(\"current-path\");\n  pathElem.onblur = function () {\n    update_list(this.value.trim());\n  };\n  pathElem.onkeyup = function (evt) {\n    if (evt.keyCode == 13) {\n      this.blur();\n    }\n  };\n  function removePath(filename, isdir) {\n    var c = confirm('你确定要删除 ' + filename + ' 吗？');\n    if (c) {\n      iwxhr.get('/cgi-bin/luci/admin/nas/fileassistant/delete',\n        {\n          path: concatPath(currentPath, filename),\n          isdir: isdir\n        },\n        function (x, res) {\n          if (res.ec === 0) {\n            refresh_list(res.data, currentPath);\n          }\n      });\n    }\n  }\n\n  function installPath(filename, isdir) {\n    if (isdir === \"1\") {\n      alert('这是一个目录，请选择 ipk 文件进行安装！');\n      return;\n    }\n    var isipk = isIPK(filename);\n    if (isipk === 0) {\n      alert('只允许安装 ipk 格式的文件！');\n      return;\n    }\n    var c = confirm('你确定要安装 ' + filename + ' 吗？');\n    if (c) {\n      iwxhr.get('/cgi-bin/luci/admin/nas/fileassistant/install',\n        {\n          filepath: concatPath(currentPath, filename),\n          isdir: isdir\n        },\n        function (x, res) {\n          if (res.ec === 0) {\n            location.reload();\n            alert('安装成功!');\n          } else {\n            alert('安装失败，请检查文件格式!');\n          }\n      });\n    }\n  }\n\n  function isIPK(filename) {\n    var index= filename.lastIndexOf(\".\");\n    var ext = filename.substr(index+1);\n    if (ext === 'ipk') {\n      return 1;\n    } else {\n      return 0;\n    }\n  }\n\n  function renamePath(filename) {\n    var newname = prompt('请输入新的文件名：', filename);\n    if (newname) {\n      newname = newname.trim();\n      if (newname != filename) {\n        var newpath = concatPath(currentPath, newname);\n        iwxhr.get('/cgi-bin/luci/admin/nas/fileassistant/rename',\n          {\n            filepath: concatPath(currentPath, filename),\n            newpath: newpath\n          },\n          function (x, res) {\n            if (res.ec === 0) {\n              refresh_list(res.data, currentPath);\n            }\n          }\n        );\n      }\n    }\n  }\n\n  function chmodPath(filename, isdir) {\n    var newmod = prompt('请输入新的权限位（支持八进制权限位或者a+x格式）：', isdir === \"1\" ? \"0755\" : \"0644\");\n    if (newmod) {\n      iwxhr.get('/cgi-bin/luci/admin/nas/fileassistant/chmod',\n        {\n          filepath: concatPath(currentPath, filename),\n          newmod: newmod\n        },\n        function (x, res) {\n          if (res.ec === 0) {\n            refresh_list(res.data, currentPath);\n          }\n        }\n      );\n    }\n  }\n\n  function chownPath(filename) {\n    var newown = prompt('请输入新的用户名（支持用户名或用户名:群组格式）：', \"root\");\n    if (newown) {\n      iwxhr.get('/cgi-bin/luci/admin/nas/fileassistant/chown',\n        {\n          filepath: concatPath(currentPath, filename),\n          newown: newown\n        },\n        function (x, res) {\n          if (res.ec === 0) {\n            refresh_list(res.data, currentPath);\n          }\n        }\n      );\n    }\n  }\n\n  function openpath(filename, dirname) {\n    dirname = dirname || currentPath;\n    window.open('/cgi-bin/luci/admin/nas/fileassistant/open?path='\n      + encodeURIComponent(dirname) + '&filename='\n      + encodeURIComponent(filename));\n  }\n\n  function getFileElem(elem) {\n    if (elem.className.indexOf('-icon') > -1) {\n      return elem;\n    }\n    else if (elem.parentNode.className.indexOf('-icon') > -1) {\n      return elem.parentNode;\n    }\n  }\n\n  function concatPath(path, filename) {\n    if (path === '/') {\n      return path + filename;\n    }\n    else {\n      return path.replace(/\\/$/, '') + '/' + filename;\n    }\n  }\n\n  function handleClick(evt) {\n    var targetElem = evt.target;\n    var infoElem;\n    if (targetElem.className.indexOf('cbi-button-remove') > -1) {\n      infoElem = targetElem.parentNode.parentNode;\n      removePath(infoElem.dataset['filename'] , infoElem.dataset['isdir'])\n    }\n    else if (targetElem.className.indexOf('cbi-button-install') > -1) {\n      infoElem = targetElem.parentNode.parentNode;\n      installPath(infoElem.dataset['filename'] , infoElem.dataset['isdir'])\n    }\n    else if (targetElem.className.indexOf('cbi-button-edit') > -1) {\n      renamePath(targetElem.parentNode.parentNode.dataset['filename']);\n    }\n    else if (targetElem.className.indexOf('cbi-button-chmod') > -1) {\n      infoElem = targetElem.parentNode.parentNode;\n      chmodPath(infoElem.dataset['filename'] , infoElem.dataset['isdir']);\n    }\n    else if (targetElem.className.indexOf('cbi-button-chown') > -1) {\n      chownPath(targetElem.parentNode.parentNode.dataset['filename']);\n    }\n    else if (targetElem = getFileElem(targetElem)) {\n      if (targetElem.className.indexOf('parent-icon') > -1) {\n        update_list(currentPath.replace(/\\/[^/]+($|\\/$)/, ''));\n      }\n      else if (targetElem.className.indexOf('file-icon') > -1) {\n        openpath(targetElem.parentNode.dataset['filename']);\n      }\n      else if (targetElem.className.indexOf('link-icon') > -1) {\n        infoElem = targetElem.parentNode;\n        var filepath = infoElem.dataset['linktarget'];\n        if (filepath) {\n          if (infoElem.dataset['isdir'] === \"1\") {\n            update_list(filepath);\n          }\n          else {\n            var lastSlash = filepath.lastIndexOf('/');\n            openpath(filepath.substring(lastSlash + 1), filepath.substring(0, lastSlash));\n          }\n        }\n      }\n      else if (targetElem.className.indexOf('folder-icon') > -1) {\n        update_list(concatPath(currentPath, targetElem.parentNode.dataset['filename']))\n      }\n    }\n  }\n  function refresh_list(filenames, path) {\n    var listHtml = '<table class=\"cbi-section-table\"><thead><tr class=\"cbi-section-table-row cbi-rowstyle-2\">'\n      +'<td class=\"cbi-value-field\">文件</td>'\n      +'<td class=\"cbi-value-field\">所有者</td>'\n      +'<td class=\"cbi-value-field\">修改时间</td>'\n      +'<td class=\"cbi-value-field\">大小</td>'\n      +'<td class=\"cbi-value-field\">权限</td>'\n      +'<td class=\"cbi-section-table-cell\">操作</td>'\n      +'</tr></thead><tbody>';\n    if (path !== '/') {\n      listHtml += '<tr class=\"cbi-section-table-row cbi-rowstyle-2\"><td class=\"parent-icon\" colspan=\"6\"><strong>..</strong></td></tr>';\n    }\n    if (filenames) {\n      for (var i = 0; i < filenames.length; i++) {\n        var line = filenames[i];\n        if (line) {\n          var f = line.match(/(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+([\\S\\s]+)/);\n          var isLink = f[1][0] === 'z' || f[1][0] === 'l' || f[1][0] === 'x';\n          var o = {\n            displayname: f[9],\n            filename: isLink ? f[9].split(' -> ')[0] : f[9],\n            perms: f[1],\n            date: f[7] + ' ' + f[6] + ' ' + f[8],\n            size: f[5],\n            owner: f[3],\n            icon: (f[1][0] === 'd') ? \"folder-icon\" : (isLink ? \"link-icon\" : \"file-icon\")\n          };\n\t\t  \n\t\t  var install_btn = '<button class=\"cbi-button cbi-button-install\" style=\"visibility: hidden;\">安装</button>';\n          var index= o.filename.lastIndexOf(\".\");\n\t\t  var ext = o.filename.substr(index+1);\n          if (ext === 'ipk') {\n            install_btn = '<button class=\"cbi-button cbi-button-install\">安装</button>';\n          }\n\t\t  \n          listHtml += '<tr class=\"cbi-section-table-row cbi-rowstyle-' + (1 + i%2)\n            + '\" data-filename=\"' + o.filename + '\" data-isdir=\"' + Number(f[1][0] === 'd' || f[1][0] === 'z') + '\"'\n            + ((f[1][0] === 'z' || f[1][0] === 'l') ? (' data-linktarget=\"' + f[9].split(' -> ')[1]) : '')\n            + '\">'\n            + '<td class=\"cbi-value-field ' + o.icon + '\">'\n            +   '<strong>' + o.displayname + '</strong>'\n            + '</td>'\n            + '<td class=\"cbi-value-field cbi-value-owner\">'+o.owner+'</td>'\n            + '<td class=\"cbi-value-field cbi-value-date\">'+o.date+'</td>'\n            + '<td class=\"cbi-value-field cbi-value-size\">'+o.size+'</td>'\n            + '<td class=\"cbi-value-field cbi-value-perm\">'+o.perms+'</td>'\n            + '<td class=\"cbi-section-table-cell\">\\\n\t\t\t\t<button class=\"cbi-button cbi-button-edit\">重命名</button>\\\n                <button class=\"cbi-button cbi-button-remove\">删除</button>\\\n                <button class=\"cbi-button cbi-button-apply cbi-button-chmod\">改权限</button>\\\n                <button class=\"cbi-button cbi-button-apply cbi-button-chown\">改用户</button>'\n\t\t\t+ install_btn\n\t\t\t+ '</td>'\n            + '</tr>';\n        }\n      }\n    }\n    listHtml += \"</table>\";\n    listElem.innerHTML = listHtml;\n  }\n  function update_list(path, opt) {\n    opt = opt || {};\n    path = concatPath(path, '');\n    if (currentPath != path) {\n      iwxhr.get('/cgi-bin/luci/admin/nas/fileassistant/list',\n        {path: path},\n        function (x, res) {\n          if (res.ec === 0) {\n            refresh_list(res.data, path);\n          }\n          else {\n            refresh_list([], path);\n          }\n        }\n      );\n      if (!opt.popState) {\n        history.pushState({path: path}, null, '?path=' + path);\n      }\n      currentPath = path;\n      pathElem.value = currentPath;\n    }\n  };\n\n  var uploadToggle = document.getElementById('upload-toggle');\n  var uploadContainer = document.getElementById('upload-container');\n  var isUploadHide = true;\n  uploadToggle.onclick = function() {\n    if (isUploadHide) {\n      uploadContainer.style.display = 'inline-flex';\n    }\n    else {\n      uploadContainer.style.display = 'none';\n    }\n    isUploadHide = !isUploadHide;\n  };\n  var uploadBtn = uploadContainer.getElementsByClassName('cbi-input-apply')[0];\n  uploadBtn.onclick = function (evt) {\n    var uploadinput = document.getElementById('upload-file');\n    var fullPath = uploadinput.value;\n    if (!fullPath) {\n      evt.preventDefault();\n    }\n    else {\n      var formData = new FormData();\n      var startIndex = (fullPath.indexOf('\\\\') >= 0 ? fullPath.lastIndexOf('\\\\') : fullPath.lastIndexOf('/'));\n      formData.append('upload-filename', fullPath.substring(startIndex + 1));\n      formData.append('upload-dir', concatPath(currentPath, ''));\n      formData.append('upload-file', uploadinput.files[0]);\n      var xhr = new XMLHttpRequest();\n      xhr.open(\"POST\", \"/cgi-bin/luci/admin/nas/fileassistant/upload\", true);\n      xhr.onload = function() {\n        if (xhr.status == 200) {\n          var res = JSON.parse(xhr.responseText);\n          refresh_list(res.data, currentPath);\n          uploadinput.value = '';\n        }\n        else {\n          alert('上传失败，请稍后再试...');\n        }\n      };\n      xhr.send(formData);\n    }\n  };\n\n  document.getElementById('mkdir-toggle').onclick = function() {\n    var dirname = null;\n    if (dirname = prompt(\"请输入文件夹名称：\")) {\n      var formData = new FormData();\n      formData.append('path', currentPath);\n      formData.append('dirname', dirname);\n      var xhr = new XMLHttpRequest();\n      xhr.open(\"POST\", \"/cgi-bin/luci/admin/nas/fileassistant/mkdir\", true);\n      xhr.onload = function() {\n        if (xhr.status == 200) {\n          var res = JSON.parse(xhr.responseText);\n          refresh_list(res.data, currentPath);\n        }\n        else {\n          alert('创建失败，请稍后再试...');\n        }\n      };\n      xhr.send(formData);\n    }\n  };\n  document.addEventListener('DOMContentLoaded', function(evt) {\n    var initPath = '/';\n    if (/path=([/\\w]+)/.test(location.search)) {\n      initPath = RegExp.$1;\n    }\n    update_list(initPath, {popState: true});\n  });\n  window.addEventListener('popstate', function (evt) {\n    var path = '/';\n    if (evt.state && evt.state.path) {\n      path = evt.state.path;\n    }\n    update_list(path, {popState: true});\n  });\n\n})();"
  },
  {
    "path": "luci-app-fileassistant/luasrc/controller/fileassistant.lua",
    "content": "module(\"luci.controller.fileassistant\", package.seeall)\n\nfunction index()\n\n    entry({\"admin\", \"nas\"}, firstchild(), \"NAS\", 44).dependent = false\n\n    local page\n    page = entry({\"admin\", \"nas\", \"fileassistant\"}, template(\"fileassistant\"), _(\"文件助手\"), 1)\n    page.i18n = \"base\"\n    page.dependent = true\n\n    page = entry({\"admin\", \"nas\", \"fileassistant\", \"list\"}, call(\"fileassistant_list\"), nil)     \n    page.leaf = true\n\n    page = entry({\"admin\", \"nas\", \"fileassistant\", \"open\"}, call(\"fileassistant_open\"), nil)\n    page.leaf = true\n\n    page = entry({\"admin\", \"nas\", \"fileassistant\", \"delete\"}, call(\"fileassistant_delete\"), nil)\n    page.leaf = true\n\n    page = entry({\"admin\", \"nas\", \"fileassistant\", \"rename\"}, call(\"fileassistant_rename\"), nil)\n    page.leaf = true\n\n    page = entry({\"admin\", \"nas\", \"fileassistant\", \"upload\"}, call(\"fileassistant_upload\"), nil)\n    page.leaf = true\n\n    page = entry({\"admin\", \"nas\", \"fileassistant\", \"install\"}, call(\"fileassistant_install\"), nil)\n    page.leaf = true\n\n    page = entry({\"admin\", \"nas\", \"fileassistant\", \"mkdir\"}, call(\"fileassistant_mkdir\"), nil)\n    page.leaf = true\n\n    page = entry({\"admin\", \"nas\", \"fileassistant\", \"chmod\"}, call(\"fileassistant_chmod\"), nil)\n    page.leaf = true\n\n    page = entry({\"admin\", \"nas\", \"fileassistant\", \"chown\"}, call(\"fileassistant_chown\"), nil)\n    page.leaf = true\nend\n\nfunction list_response(path, success)\n    luci.http.prepare_content(\"application/json\")\n    local result\n    if success then\n        local rv = scandir(path)\n        result = {\n            ec = 0,\n            data = rv\n        }\n    else\n        result = {\n            ec = 1\n        }\n    end\n    luci.http.write_json(result)\nend\n\nfunction fileassistant_list()\n    local path = luci.http.formvalue(\"path\")\n    list_response(path, true)\nend\n\nfunction fileassistant_open()\n    local path = luci.http.formvalue(\"path\")\n    local filename = luci.http.formvalue(\"filename\")\n    local io = require \"io\"\n    local mime = to_mime(filename)\n\n    file = path..filename\n\n    local download_fpi = io.open(file, \"r\")\n    luci.http.header('Content-Disposition', 'inline; filename=\"'..filename..'\"' )\n    luci.http.prepare_content(mime)\n    luci.ltn12.pump.all(luci.ltn12.source.file(download_fpi), luci.http.write)\nend\n\nfunction fileassistant_delete()\n    local path = luci.http.formvalue(\"path\")\n    local isdir = luci.http.formvalue(\"isdir\")\n    path = path:gsub(\"<>\", \"/\")\n    path = path:gsub(\" \", \"\\ \")\n    local success\n    if isdir then\n        success = os.execute('rm -r \"'..path..'\"')\n    else\n        success = os.remove(path)\n    end\n    list_response(nixio.fs.dirname(path), success)\nend\n\nfunction fileassistant_rename()\n    local filepath = luci.http.formvalue(\"filepath\")\n    local newpath = luci.http.formvalue(\"newpath\")\n    local success = os.execute('mv \"'..filepath..'\" \"'..newpath..'\"')\n    list_response(nixio.fs.dirname(filepath), success)\nend\n\nfunction fileassistant_install()\n    local filepath = luci.http.formvalue(\"filepath\")\n    local isdir = luci.http.formvalue(\"isdir\")\n    local ext = filepath:match(\".+%.(%w+)$\")\n    filepath = filepath:gsub(\"<>\", \"/\")\n    filepath = filepath:gsub(\" \", \"\\ \")\n    local success\n    if isdir == \"1\" then\n        success = false  \n    elseif ext == \"ipk\" then\n        success = installIPK(filepath)\n    else\n        success = false\n    end\n    list_response(nixio.fs.dirname(filepath), success)\nend\n\nfunction installIPK(filepath)\n    luci.sys.exec('opkg --force-depends install \"'..filepath..'\"')\n    luci.sys.exec('rm -rf /tmp/luci-*')\n    return true;\nend\n\nfunction fileassistant_upload()\n    local fp\n    -- MUST setfilehandler before formvalue,\n    -- beacuse formvalue will parse form and write body to /tmp if filehandler not present\n    luci.http.setfilehandler(\n        function(meta, chunk, eof)\n            if not fp and meta and meta.name == \"upload-file\" then\n                local filename = luci.http.formvalue(\"upload-filename\")\n                local uploaddir = luci.http.formvalue(\"upload-dir\")\n                if not uploaddir or not filename then\n                    error(\"uploaddir or filename is nil\")\n                end\n                local filepath = uploaddir..filename\n                fp = io.open(filepath, \"w\")\n            end\n            if fp and chunk then\n                fp:write(chunk)\n            end\n            if fp and eof then\n                fp:close()\n            end\n      end\n    )\n\n    list_response(luci.http.formvalue(\"upload-dir\"), true)\nend\n\nfunction fileassistant_mkdir()\n    local path = luci.http.formvalue(\"path\")\n    local dirname = luci.http.formvalue(\"dirname\")\n    local success = os.execute('sh -c \\'cd \"'..path..'\" && mkdir -p \"'..dirname..'\"\\'')\n    list_response(path, success)\nend\n\nfunction fileassistant_chmod()\n    local path = luci.http.formvalue(\"filepath\")\n    local newmod = luci.http.formvalue(\"newmod\")\n    local success = os.execute('chmod '..newmod..' \"'..path..'\"')\n    list_response(nixio.fs.dirname(path), success)\nend\n\nfunction fileassistant_chown()\n    local path = luci.http.formvalue(\"filepath\")\n    local newown = luci.http.formvalue(\"newown\")\n    local success = os.execute('chown '..newown..' \"'..path..'\"')\n    list_response(nixio.fs.dirname(path), success)\nend\n\nfunction scandir(directory)\n    local i, t, popen = 0, {}, io.popen\n\n    local pfile = popen(\"ls -lh \\\"\"..directory..\"\\\" | egrep '^d' ; ls -lh \\\"\"..directory..\"\\\" | egrep -v '^d|^l'\")\n    for fileinfo in pfile:lines() do\n        i = i + 1\n        t[i] = fileinfo\n    end\n    pfile:close()\n    pfile = popen(\"ls -lh \\\"\"..directory..\"\\\" | egrep '^l' ;\")\n    for fileinfo in pfile:lines() do\n        i = i + 1\n        linkindex, _, linkpath = string.find(fileinfo, \"->%s+(.+)$\")\n        local finalpath;\n        if string.sub(linkpath, 1, 1) == \"/\" then\n            finalpath = linkpath\n        else\n            finalpath = nixio.fs.realpath(directory..linkpath)\n        end\n        local linktype;\n        if not finalpath then\n            finalpath = linkpath;\n            linktype = 'x'\n        elseif nixio.fs.stat(finalpath, \"type\") == \"dir\" then\n            linktype = 'z'\n        else\n            linktype = 'l'\n        end\n        fileinfo = string.sub(fileinfo, 2, linkindex - 1)\n        fileinfo = linktype..fileinfo..\"-> \"..finalpath\n        t[i] = fileinfo\n    end\n    pfile:close()\n    return t\nend\n\nMIME_TYPES = {\n    [\"txt\"]   = \"text/plain\";\n    [\"conf\"]   = \"text/plain\";\n    [\"ovpn\"]   = \"text/plain\";\n    [\"log\"]   = \"text/plain\";\n    [\"js\"]    = \"text/javascript\";\n    [\"json\"]    = \"application/json\";\n    [\"css\"]   = \"text/css\";\n    [\"htm\"]   = \"text/html\";\n    [\"html\"]  = \"text/html\";\n    [\"patch\"] = \"text/x-patch\";\n    [\"c\"]     = \"text/x-csrc\";\n    [\"h\"]     = \"text/x-chdr\";\n    [\"o\"]     = \"text/x-object\";\n    [\"ko\"]    = \"text/x-object\";\n\n    [\"bmp\"]   = \"image/bmp\";\n    [\"gif\"]   = \"image/gif\";\n    [\"png\"]   = \"image/png\";\n    [\"jpg\"]   = \"image/jpeg\";\n    [\"jpeg\"]  = \"image/jpeg\";\n    [\"svg\"]   = \"image/svg+xml\";\n\n    [\"zip\"]   = \"application/zip\";\n    [\"pdf\"]   = \"application/pdf\";\n    [\"xml\"]   = \"application/xml\";\n    [\"xsl\"]   = \"application/xml\";\n    [\"doc\"]   = \"application/msword\";\n    [\"ppt\"]   = \"application/vnd.ms-powerpoint\";\n    [\"xls\"]   = \"application/vnd.ms-excel\";\n    [\"odt\"]   = \"application/vnd.oasis.opendocument.text\";\n    [\"odp\"]   = \"application/vnd.oasis.opendocument.presentation\";\n    [\"pl\"]    = \"application/x-perl\";\n    [\"sh\"]    = \"application/x-shellscript\";\n    [\"php\"]   = \"application/x-php\";\n    [\"deb\"]   = \"application/x-deb\";\n    [\"iso\"]   = \"application/x-cd-image\";\n    [\"tgz\"]   = \"application/x-compressed-tar\";\n\n    [\"mp3\"]   = \"audio/mpeg\";\n    [\"ogg\"]   = \"audio/x-vorbis+ogg\";\n    [\"wav\"]   = \"audio/x-wav\";\n\n    [\"mpg\"]   = \"video/mpeg\";\n    [\"mpeg\"]  = \"video/mpeg\";\n    [\"avi\"]   = \"video/x-msvideo\";\n}\n\nfunction to_mime(filename)\n    if type(filename) == \"string\" then\n        local ext = filename:match(\"[^%.]+$\")\n\n        if ext and MIME_TYPES[ext:lower()] then\n            return MIME_TYPES[ext:lower()]\n        end\n    end\n\n    return \"application/octet-stream\"\nend"
  },
  {
    "path": "luci-app-fileassistant/luasrc/view/fileassistant.htm",
    "content": "<%+header%>\n\n<link rel=\"stylesheet\" href=\"/luci-static/resources/fileassistant/fb.css<%# ?v=PKG_VERSION %>\">\n<h2 name=\"content\">文件助手</h2>\n<fieldset class=\"cbi-section fb-container\">\n  <input id=\"current-path\" type=\"text\" class=\"current-path cbi-input-text\" value=\"/\"/>\n  <div class=\"panel-container\">\n    <div class=\"panel-title\">文件列表</div>\n    <button id=\"upload-toggle\" class=\"upload-toggle cbi-button cbi-button-edit\">上传</button>\n    <button id=\"mkdir-toggle\" class=\"upload-toggle cbi-button cbi-button-edit\">新建文件夹&hellip; </button>\n  </div>\n  <div class=\"upload-container\" id=\"upload-container\">\n    <input id=\"upload-file\" name=\"upload-file\" class=\"upload-file\" type=\"file\">\n    <button type=\"button\" class=\"cbi-button cbi-input-apply\">点我上传</button>\n  </div>\n  <div id=\"list-content\"></div>\n</fieldset>\n\n<script src=\"/luci-static/resources/fileassistant/fb.js<%# ?v=PKG_VERSION %>\"></script>\n\n<%+footer%>\n"
  },
  {
    "path": "luci-app-filebrowser/Makefile",
    "content": "# SPDX-License-Identifier: Apache-2.0\n#\n# Copyright (C) 2023 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI app for FileBrowser\nLUCI_PKGARCH:=all\nLUCI_DEPENDS:=+filebrowser\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js",
    "content": "'use strict';\n'require form';\n'require poll';\n'require rpc';\n'require uci';\n'require view';\n\nvar callServiceList = rpc.declare({\n\tobject: 'service',\n\tmethod: 'list',\n\tparams: ['name'],\n\texpect: { '': {} }\n});\n\nfunction getServiceStatus() {\n\treturn L.resolveDefault(callServiceList('filebrowser'), {}).then(function (res) {\n\t\tvar isRunning = false;\n\t\ttry {\n\t\t\tisRunning = res['filebrowser']['instances']['instance1']['running'];\n\t\t} catch (e) { }\n\t\treturn isRunning;\n\t});\n}\n\nfunction renderStatus(isRunning, port) {\n\tvar spanTemp = '<span style=\"color:%s\"><strong>%s %s</strong></span>';\n\tvar renderHTML;\n\tif (isRunning) {\n\t\tvar button = String.format('&#160;<a class=\"btn cbi-button\" href=\"http://%s:%s\" target=\"_blank\" rel=\"noreferrer noopener\">%s</a>',\n\t\t\twindow.location.hostname, port, _('Open Web Interface'));\n\t\trenderHTML = spanTemp.format('green', _('FileBrowser'), _('RUNNING')) + button;\n\t} else {\n\t\trenderHTML = spanTemp.format('red', _('FileBrowser'), _('NOT RUNNING'));\n\t}\n\n\treturn renderHTML;\n}\n\nreturn view.extend({\n\tload: function() {\n\t\treturn uci.load('filebrowser');\n\t},\n\n\trender: function(data) {\n\t\tvar m, s, o;\n\t\tvar webport = (uci.get(data, 'config', 'listen_port') || '8989');\n\n\t\tm = new form.Map('filebrowser', _('FileBrowser'),\n\t\t\t_('FileBrowser provides a file managing interface within a specified directory and it can be used to upload, delete, preview, rename and edit your files..'));\n\n\t\ts = m.section(form.TypedSection);\n\t\ts.anonymous = true;\n\t\ts.render = function () {\n\t\t\tpoll.add(function () {\n\t\t\t\treturn L.resolveDefault(getServiceStatus()).then(function (res) {\n\t\t\t\t\tvar view = document.getElementById('service_status');\n\t\t\t\t\tview.innerHTML = renderStatus(res, webport);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn E('div', { class: 'cbi-section', id: 'status_bar' }, [\n\t\t\t\t\tE('p', { id: 'service_status' }, _('Collecting data...'))\n\t\t\t]);\n\t\t}\n\n\t\ts = m.section(form.NamedSection, 'config', 'filebrowser');\n\n\t\to = s.option(form.Flag, 'enabled', _('Enable'));\n\t\to.default = o.disabled;\n\t\to.rmempty = false;\n\n\t\to = s.option(form.Value, 'listen_port', _('Listen port'));\n\t\to.datatype = 'port';\n\t\to.default = '8989';\n\t\to.rmempty = false;\n\n\t\to = s.option(form.Value, 'root_path', _('Root directory'));\n\t\to.default = '/mnt';\n\t\to.rmempty = false;\n\n\t\to = s.option(form.Flag, 'disable_exec', _('Disable Command Runner feature'));\n\t\to.default = o.enabled;\n\t\to.rmempty = false;\n\n\t\treturn m.render();\n\t}\n});\n"
  },
  {
    "path": "luci-app-filebrowser/po/templates/filebrowser.pot",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:62\nmsgid \"Collecting data...\"\nmsgstr \"\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:81\nmsgid \"Disable Command Runner feature\"\nmsgstr \"\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:68\nmsgid \"Enable\"\nmsgstr \"\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:31\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:33\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:48\n#: applications/luci-app-filebrowser/root/usr/share/luci/menu.d/luci-app-filebrowser.json:3\nmsgid \"FileBrowser\"\nmsgstr \"\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:49\nmsgid \"\"\n\"FileBrowser provides a file managing interface within a specified directory \"\n\"and it can be used to upload, delete, preview, rename and edit your files..\"\nmsgstr \"\"\n\n#: applications/luci-app-filebrowser/root/usr/share/rpcd/acl.d/luci-app-filebrowser.json:3\nmsgid \"Grant UCI access for luci-app-filebrowser\"\nmsgstr \"\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:72\nmsgid \"Listen port\"\nmsgstr \"\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:33\nmsgid \"NOT RUNNING\"\nmsgstr \"\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:30\nmsgid \"Open Web Interface\"\nmsgstr \"\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:31\nmsgid \"RUNNING\"\nmsgstr \"\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:77\nmsgid \"Root directory\"\nmsgstr \"\"\n"
  },
  {
    "path": "luci-app-filebrowser/po/zh_Hans/filebrowser.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Last-Translator: Automatically generated\\n\"\n\"Language-Team: none\\n\"\n\"Language: zh-Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:62\nmsgid \"Collecting data...\"\nmsgstr \"正在收集数据中...\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:81\nmsgid \"Disable Command Runner feature\"\nmsgstr \"禁用命令执行功能\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:68\nmsgid \"Enable\"\nmsgstr \"启用\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:31\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:33\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:48\n#: applications/luci-app-filebrowser/root/usr/share/luci/menu.d/luci-app-filebrowser.json:3\nmsgid \"FileBrowser\"\nmsgstr \"FileBrowser\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:49\nmsgid \"\"\n\"FileBrowser provides a file managing interface within a specified directory \"\n\"and it can be used to upload, delete, preview, rename and edit your files..\"\nmsgstr \"\"\n\"FileBrowser 提供指定目录下的文件管理界面，可用于上传、删除、预览、重命名和编\"\n\"辑文件。\"\n\n#: applications/luci-app-filebrowser/root/usr/share/rpcd/acl.d/luci-app-filebrowser.json:3\nmsgid \"Grant UCI access for luci-app-filebrowser\"\nmsgstr \"授予 luci-app-filebrowser 访问 UCI 配置的权限\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:72\nmsgid \"Listen port\"\nmsgstr \"监听端口\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:33\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:30\nmsgid \"Open Web Interface\"\nmsgstr \"打开 Web 界面\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:31\nmsgid \"RUNNING\"\nmsgstr \"运行中\"\n\n#: applications/luci-app-filebrowser/htdocs/luci-static/resources/view/filebrowser.js:77\nmsgid \"Root directory\"\nmsgstr \"根目录\"\n"
  },
  {
    "path": "luci-app-filebrowser/root/usr/share/luci/menu.d/luci-app-filebrowser.json",
    "content": "{\n\t\"admin/services/filebrowser\": {\n\t\t\"title\": \"FileBrowser\",\n\t\t\"action\": {\n\t\t\t\"order\": 30,\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"filebrowser\"\n\t\t},\n\t\t\"depends\": {\n\t\t\t\"acl\": [ \"luci-app-filebrowser\" ],\n\t\t\t\"uci\": { \"filebrowser\": true }\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-filebrowser/root/usr/share/rpcd/acl.d/luci-app-filebrowser.json",
    "content": "{\n\t\"luci-app-filebrowser\": {\n\t\t\"description\": \"Grant UCI access for luci-app-filebrowser\",\n\t\t\"read\": {\n\t\t\t\"ubus\": {\n\t\t\t\t\"service\": [ \"list\" ]\n\t\t\t},\n\t\t\t\"uci\": [ \"filebrowser\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"filebrowser\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-floatip/Makefile",
    "content": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for floatip\nLUCI_DEPENDS:=+floatip\nLUCI_PKGARCH:=all\nPKG_VERSION:=0.1.3-r2\n# PKG_RELEASE MUST be empty for luci.mk\nPKG_RELEASE:=\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n\n"
  },
  {
    "path": "luci-app-floatip/luasrc/controller/floatip.lua",
    "content": "module(\"luci.controller.floatip\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/floatip\") then\n\t\treturn\n\tend\n\n\tentry({\"admin\", \"services\", \"floatip\"}, cbi(\"floatip\"), _(\"FloatingGateway\"), 20).dependent = true\n\n\tentry({\"admin\", \"services\", \"floatip_status\"}, call(\"floatip_status\"))\nend\n\nfunction floatip_status()\n\tlocal sys  = require \"luci.sys\"\n\tlocal uci  = require \"luci.model.uci\".cursor()\n\n\tlocal status = {\n\t\trunning = not (sys.call(\"flock -sn /var/lock/floatip_loop.lock -c true >/dev/null\") == 0),\n\t}\n\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(status)\nend\n\n"
  },
  {
    "path": "luci-app-floatip/luasrc/model/cbi/floatip.lua",
    "content": "local m, s, o\n\nm = Map(\"floatip\", translate(\"FloatingGateway\"), translate(\"FloatingGateway allows two gateway within one lan which can switch between each other in case of a failure.\")\n\t.. \"<br>\" .. translate(\"Before using the FloatingGateway, ensure that the LAN interface is static address.\")\n\t.. \"<br>\" .. translate(\"Note that this service is actually a floating IP implementation. It only configures the IP address and does not modify the gateway advertised by the DHCP service, because the DHCP service is not necessarily provided by the local machine. It is named floating gateway because this is the most common usage scenario.\"))\n\nm:section(SimpleSection).template  = \"floatip_status\"\n\ns=m:section(NamedSection, \"main\", translate(\"Global settings\"))\ns.anonymous=true\n\no = s:option(Flag, \"enabled\", translate(\"Enable\"))\no.rmempty = false\n\no = s:option(ListValue, \"role\", translate(\"Node Role\"))\no.rmempty = false\no.widget = \"select\"\no:value(\"main\", translate(\"FG Preempt Node\"))\no:value(\"fallback\", translate(\"FG Fallback Node\"))\n\no = s:option(Value, \"set_ip\", translate(\"Floating Gateway IP\"), translate(\"This IP must be within any subnet of the LAN interface\"))\no.rmempty = false\no.datatype = \"or(ip4addr,cidr4)\"\n\no = s:option(Value, \"check_ip\", translate(\"FG Preempt Node IP\"))\no.datatype = \"ip4addr\"\no:depends(\"role\", \"fallback\")\n\no = s:option(Value, \"check_url\", translate(\"Check URL\"), translate(\"If status code of the URL is not 2xx, then release the floating IP and disable LAN port pinging\"))\no:depends(\"role\", \"main\")\n\no = s:option(Value, \"check_url_timeout\", translate(\"Check URL Timeout (s)\"), translate(\"Default is 5 seconds if not set\"))\no.datatype = \"uinteger\"\no:depends(\"role\", \"main\")\n\nreturn m\n"
  },
  {
    "path": "luci-app-floatip/luasrc/view/floatip_status.htm",
    "content": "<script type=\"text/javascript\">//<![CDATA[\n\tXHR.poll(5, '<%=url(\"admin/services/floatip_status\")%>', null,\n\t\tfunction(x, st)\n\t\t{\n\t\t\tvar tb = document.getElementById('floatip_status');\n\t\t\tif (st && tb)\n\t\t\t{\n\t\t\t\tif (st.running)\n\t\t\t\t{\n\t\t\t\t\ttb.innerHTML = '<br/><em style=\\\"color:green\\\"><%:The FloatingGateway service is running.%></em>';\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttb.innerHTML = '<br/><em style=\\\"color:red\\\"><%:The FloatingGateway service is not running.%></em>';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t);\n//]]></script>\n\n<fieldset class=\"cbi-section\">\n\t<legend><%:FloatingGateway Status%></legend>\n\t<p id=\"floatip_status\">\n\t\t<em><%:Collecting data...%></em>\n\t</p>\n</fieldset>\n"
  },
  {
    "path": "luci-app-floatip/po/zh_Hans/floatip.po",
    "content": "msgid \"FloatingGateway\"\nmsgstr \"浮动网关\"\n\nmsgid \"Running state\"\nmsgstr \"运行状态\"\n\nmsgid \"FloatingGateway allows two gateway within one lan which can switch between each other in case of a failure.\"\nmsgstr \"浮动网关可以让你在内网有两个相互备份的网关，出现问题会相互切换。\"\n\nmsgid \"The FloatingGateway service is running.\"\nmsgstr \"服务已启动\"\n\nmsgid \"The FloatingGateway service is not running.\"\nmsgstr \"服务未启动\"\n\nmsgid \"FloatingGateway Status\"\nmsgstr \"服务状态\"\n\nmsgid \"Collecting data...\"\nmsgstr \"收集数据...\"\n\nmsgid \"Node Role\"\nmsgstr \"节点角色\"\n\nmsgid \"FG Preempt Node\"\nmsgstr \"旁路由\"\n\nmsgid \"FG Fallback Node\"\nmsgstr \"主路由\"\n\nmsgid \"Floating Gateway IP\"\nmsgstr \"浮动网关 IP\"\n\nmsgid \"FG Preempt Node IP\"\nmsgstr \"旁路由 IP\"\n\nmsgid \"Check URL\"\nmsgstr \"检查 URL\"\n\nmsgid \"If status code of the URL is not 2xx, then release the floating IP and disable LAN port pinging\"\nmsgstr \"如果检查URL状态码不是2xx，则释放浮动IP，并禁止LAN口ping\"\n\nmsgid \"Check URL Timeout (s)\"\nmsgstr \"检查 URL 超时（秒）\"\n\nmsgid \"Default is 5 seconds if not set\"\nmsgstr \"默认5秒\"\n\nmsgid \"Before using the FloatingGateway, ensure that the LAN interface is static address.\"\nmsgstr \"使用浮动网关前需确保 LAN 接口是静态地址。\"\n\nmsgid \"Note that this service is actually a floating IP implementation. It only configures the IP address and does not modify the gateway advertised by the DHCP service, because the DHCP service is not necessarily provided by the local machine. It is named floating gateway because this is the most common usage scenario.\"\nmsgstr \"注意此服务实际是浮动 IP 的实现，仅配置 IP 地址，不会修改 DHCP 服务通告的网关，因为 DHCP 服务不一定由本机提供。取名浮动网关只是因为这是最常见的使用场景。\"\n\nmsgid \"This IP must be within any subnet of the LAN interface\"\nmsgstr \"此 IP 必须在 LAN 接口的任意一个子网范围内\"\n"
  },
  {
    "path": "luci-app-floatip/root/etc/uci-defaults/50_luci-floatip",
    "content": "#!/bin/sh\n\nrm -f /tmp/luci-indexcache /tmp/luci-indexcache.*\nexit 0\n"
  },
  {
    "path": "luci-app-gost/Makefile",
    "content": "# SPDX-License-Identifier: Apache-2.0\n#\n# Copyright (C) 2025 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for GOST\nLUCI_DEPENDS:=+gost\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n$(eval $(call BuildPackage,luci-app-gost))\n"
  },
  {
    "path": "luci-app-gost/htdocs/luci-static/resources/view/gost.js",
    "content": "// SPDX-License-Identifier: Apache-2.0\n/*\n * Copyright (C) 2025 ImmortalWrt.org\n */\n\n'use strict';\n'require form';\n'require poll';\n'require rpc';\n'require view';\n\nconst callServiceList = rpc.declare({\n\tobject: 'service',\n\tmethod: 'list',\n\tparams: ['name'],\n\texpect: { '': {} }\n});\n\nfunction getServiceStatus() {\n\treturn L.resolveDefault(callServiceList('gost'), {}).then(function(res) {\n\t\tlet isRunning = false;\n\t\ttry {\n\t\t\tisRunning = res['gost']['instances']['instance1']['running'];\n\t\t} catch (e) {}\n\t\treturn isRunning;\n\t});\n}\n\nfunction renderStatus(isRunning) {\n\tlet spanTmpl = '<em><span style=\"color:%s\"><strong>%s %s</strong></span></em>';\n\treturn spanTmpl.format(\n\t\tisRunning ? 'green' : 'red',\n\t\t_('GOST'),\n\t\tisRunning ? _('RUNNING') : _('NOT RUNNING')\n\t);\n}\n\nreturn view.extend({\n\trender: function() {\n\t\tlet m, s, o;\n\n\t\tm = new form.Map('gost', _('GOST'),\n\t\t\t_('A simple security tunnel written in Golang.'));\n\n\t\t/* Bug fix: 为状态栏段指定一个不存在的 UCI 类型，避免匹配实际配置节 */\n\t\ts = m.section(form.TypedSection, '_status');\n\t\ts.anonymous = true;\n\t\ts.render = function() {\n\t\t\tpoll.add(function() {\n\t\t\t\treturn L.resolveDefault(getServiceStatus()).then(function(isRunning) {\n\t\t\t\t\t/* Bug fix: 重命名变量以避免遮蔽外层 'require view' 中的 view 模块 */\n\t\t\t\t\tlet statusEl = document.getElementById('service_status');\n\t\t\t\t\tif (statusEl)\n\t\t\t\t\t\tstatusEl.innerHTML = renderStatus(isRunning);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn E('div', { class: 'cbi-section', id: 'status_bar' }, [\n\t\t\t\tE('p', { id: 'service_status' }, _('Collecting data…'))\n\t\t\t]);\n\t\t};\n\n\t\ts = m.section(form.NamedSection, 'config', 'gost');\n\n\t\to = s.option(form.Flag, 'enabled', _('Enable'));\n\t\to.rmempty = false;\n\n\t\to = s.option(form.Value, 'config_file', _('Configuration file'));\n\t\to.value('/etc/gost/gost.json');\n\t\to.datatype = 'path';\n\n\t\to = s.option(form.DynamicList, 'arguments', _('Arguments'));\n\t\to.validate = function(section_id, value) {\n\t\t\tif (section_id) {\n\t\t\t\tlet config_file = this.section.formvalue(section_id, 'config_file');\n\t\t\t\t/* Bug fix: 避免使用 ES2020 可选链 (?.) 以兼容旧版 JS 运行时 */\n\t\t\t\tlet args = this.section.formvalue(section_id, 'arguments');\n\n\t\t\t\tif (!config_file && (!args || !args.length))\n\t\t\t\t\treturn _('Expecting: %s').format(_('non-empty value'));\n\t\t\t}\n\n\t\t\treturn true;\n\t\t};\n\n\t\treturn m.render();\n\t}\n});\n"
  },
  {
    "path": "luci-app-gost/luasrc/controller/gost.lua",
    "content": "-- Copyright (C) 2025 ImmortalWrt.org\n-- SPDX-License-Identifier: Apache-2.0\n\nmodule(\"luci.controller.gost\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/gost\") then\n\t\treturn\n\tend\n\n\t-- luci 23.05+ 已通过 menu.d JSON 注册菜单，无需 Lua 控制器重复注册\n\tif nixio.fs.access(\"/usr/share/luci/menu.d/luci-app-gost.json\") then\n\t\treturn\n\tend\n\n\tlocal page\n\tpage = entry({\"admin\", \"services\", \"gost\"}, cbi(\"gost\"), _(\"GOST\"), 100)\n\tpage.dependent = true\nend\n"
  },
  {
    "path": "luci-app-gost/luasrc/model/cbi/gost.lua",
    "content": "-- Copyright (C) 2025 ImmortalWrt.org\n-- SPDX-License-Identifier: Apache-2.0\n\nlocal sys = require \"luci.sys\"\n\nm = Map(\"gost\", translate(\"GOST\"),\n\ttranslate(\"A simple security tunnel written in Golang.\"))\n\n-- 服务运行状态提示\nlocal running = (sys.call(\"pidof gost >/dev/null 2>&1\") == 0)\nlocal status_text = running\n\tand '<span style=\"color:green\"><strong>' .. translate(\"RUNNING\") .. \"</strong></span>\"\n\tor  '<span style=\"color:red\"><strong>' .. translate(\"NOT RUNNING\") .. \"</strong></span>\"\n\ns = m:section(TypedSection, \"gost\", translate(\"Service Status\"))\ns.anonymous = true\ns.addremove  = false\n\no = s:option(DummyValue, \"_status\", translate(\"Status\"))\no.rawhtml = true\no.default = status_text\n\n-- 基本设置\ns = m:section(NamedSection, \"config\", \"gost\", translate(\"Basic Settings\"))\ns.anonymous  = false\ns.addremove  = false\n\no = s:option(Flag, \"enabled\", translate(\"Enable\"))\no.rmempty = false\n\no = s:option(Value, \"config_file\", translate(\"Configuration file\"))\no:value(\"/etc/gost/gost.json\")\no.datatype = \"file\"\no.rmempty = true\n\no = s:option(DynamicList, \"arguments\", translate(\"Arguments\"))\no.rmempty = true\nfunction o.validate(self, value, section)\n\tlocal config_file = m:get(section, \"config_file\")\n\tif not config_file or config_file == \"\" then\n\t\tif not value or value == \"\" then\n\t\t\treturn nil, translatef(\"Expecting: %s\", translate(\"non-empty value\"))\n\t\tend\n\tend\n\treturn value\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-gost/po/templates/gost.pot",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:46\nmsgid \"A simple security tunnel written in Golang.\"\nmsgstr \"\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:71\nmsgid \"Arguments\"\nmsgstr \"\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:59\nmsgid \"Collecting data…\"\nmsgstr \"\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:67\nmsgid \"Configuration file\"\nmsgstr \"\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:65\nmsgid \"Enable\"\nmsgstr \"\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:78\nmsgid \"Expecting: %s\"\nmsgstr \"\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:34\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:36\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:45\n#: applications/luci-app-gost/root/usr/share/luci/menu.d/luci-app-gost.json:3\nmsgid \"GOST\"\nmsgstr \"\"\n\n#: applications/luci-app-gost/root/usr/share/rpcd/acl.d/luci-app-gost.json:3\nmsgid \"Grant UCI access for luci-app-gost\"\nmsgstr \"\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:36\nmsgid \"NOT RUNNING\"\nmsgstr \"\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:34\nmsgid \"RUNNING\"\nmsgstr \"\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:78\nmsgid \"non-empty value\"\nmsgstr \"\"\n"
  },
  {
    "path": "luci-app-gost/po/zh_Hans/gost.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Last-Translator: Automatically generated\\n\"\n\"Language-Team: none\\n\"\n\"Language: zh-Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:46\nmsgid \"A simple security tunnel written in Golang.\"\nmsgstr \"GO 语言实现的安全隧道。\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:71\nmsgid \"Arguments\"\nmsgstr \"参数\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:59\nmsgid \"Collecting data…\"\nmsgstr \"正在收集数据中…\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:67\nmsgid \"Configuration file\"\nmsgstr \"配置文件\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:65\nmsgid \"Enable\"\nmsgstr \"启用\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:78\nmsgid \"Expecting: %s\"\nmsgstr \"请输入：%s\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:34\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:36\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:45\n#: applications/luci-app-gost/root/usr/share/luci/menu.d/luci-app-gost.json:3\nmsgid \"GOST\"\nmsgstr \"GOST\"\n\n#: applications/luci-app-gost/root/usr/share/rpcd/acl.d/luci-app-gost.json:3\nmsgid \"Grant UCI access for luci-app-gost\"\nmsgstr \"授予 luci-app-gost 访问 UCI 配置的权限\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:36\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:34\nmsgid \"RUNNING\"\nmsgstr \"运行中\"\n\n#: applications/luci-app-gost/htdocs/luci-static/resources/view/gost.js:78\nmsgid \"non-empty value\"\nmsgstr \"非空值\"\n"
  },
  {
    "path": "luci-app-gost/root/etc/config/gost",
    "content": "config gost 'config'\n\toption enabled '0'\n\toption config_file '/etc/gost/gost.json'\n"
  },
  {
    "path": "luci-app-gost/root/etc/init.d/gost",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2025 ImmortalWrt.org\n# SPDX-License-Identifier: Apache-2.0\n\nUSE_PROCD=1\nSTART=99\nSTOP=10\n\n_append_arg() {\n\tprocd_append_param command \"$1\"\n}\n\nstart_service() {\n\tlocal enabled config_file\n\n\tconfig_load \"gost\"\n\tconfig_get_bool enabled \"config\" \"enabled\" \"0\"\n\t[ \"$enabled\" -eq 0 ] && return 0\n\n\tconfig_get config_file \"config\" \"config_file\" \"\"\n\n\tprocd_open_instance \"instance1\"\n\tprocd_set_param command /usr/bin/gost\n\n\tif [ -n \"$config_file\" ] && [ -f \"$config_file\" ]; then\n\t\tprocd_append_param command -C \"$config_file\"\n\tfi\n\n\tconfig_list_foreach \"config\" \"arguments\" _append_arg\n\n\tprocd_set_param respawn\n\tprocd_set_param stdout 1\n\tprocd_set_param stderr 1\n\tprocd_close_instance\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"gost\"\n}\n"
  },
  {
    "path": "luci-app-gost/root/usr/share/luci/menu.d/luci-app-gost.json",
    "content": "{\n\t\"admin/services/gost\": {\n\t\t\"title\": \"GOST\",\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"gost\"\n\t\t},\n\t\t\"depends\": {\n\t\t\t\"acl\": [ \"luci-app-gost\" ],\n\t\t\t\"uci\": { \"gost\": true }\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-gost/root/usr/share/rpcd/acl.d/luci-app-gost.json",
    "content": "{\n\t\"luci-app-gost\": {\n\t\t\"description\": \"Grant UCI access for luci-app-gost\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"gost\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"gost\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-homeproxy/Makefile",
    "content": "# SPDX-License-Identifier: GPL-2.0-only\n#\n# Copyright (C) 2022-2023 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=The modern ImmortalWrt proxy platform for ARM64/AMD64\nLUCI_PKGARCH:=all\nLUCI_DEPENDS:= \\\n\t+sing-box \\\n\t+firewall4 \\\n\t+kmod-nft-tproxy \\\n\t+ucode-mod-digest\n\nPKG_NAME:=luci-app-homeproxy\n\ndefine Package/luci-app-homeproxy/conffiles\n/etc/config/homeproxy\n/etc/homeproxy/certs/\n/etc/homeproxy/ruleset/\n/etc/homeproxy/resources/direct_list.txt\n/etc/homeproxy/resources/proxy_list.txt\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-homeproxy/README",
    "content": "TODO:\n- Subscription page slow response with a large number of nodes\n- Refactor nft rules\n- Move ACL settings to a dedicated page\n- Any other improvements\n"
  },
  {
    "path": "luci-app-homeproxy/htdocs/luci-static/resources/homeproxy.js",
    "content": "/*\n * SPDX-License-Identifier: GPL-2.0-only\n *\n * Copyright (C) 2022-2025 ImmortalWrt.org\n */\n\n'use strict';\n'require baseclass';\n'require form';\n'require fs';\n'require rpc';\n'require uci';\n'require ui';\n\nreturn baseclass.extend({\n\tdns_strategy: {\n\t\t'': _('Default'),\n\t\t'prefer_ipv4': _('Prefer IPv4'),\n\t\t'prefer_ipv6': _('Prefer IPv6'),\n\t\t'ipv4_only': _('IPv4 only'),\n\t\t'ipv6_only': _('IPv6 only')\n\t},\n\n\tshadowsocks_encrypt_length: {\n\t\t/* AEAD */\n\t\t'aes-128-gcm': 0,\n\t\t'aes-192-gcm': 0,\n\t\t'aes-256-gcm': 0,\n\t\t'chacha20-ietf-poly1305': 0,\n\t\t'xchacha20-ietf-poly1305': 0,\n\t\t/* AEAD 2022 */\n\t\t'2022-blake3-aes-128-gcm': 16,\n\t\t'2022-blake3-aes-256-gcm': 32,\n\t\t'2022-blake3-chacha20-poly1305': 32\n\t},\n\n\tshadowsocks_encrypt_methods: [\n\t\t/* Stream */\n\t\t'none',\n\t\t/* AEAD */\n\t\t'aes-128-gcm',\n\t\t'aes-192-gcm',\n\t\t'aes-256-gcm',\n\t\t'chacha20-ietf-poly1305',\n\t\t'xchacha20-ietf-poly1305',\n\t\t/* AEAD 2022 */\n\t\t'2022-blake3-aes-128-gcm',\n\t\t'2022-blake3-aes-256-gcm',\n\t\t'2022-blake3-chacha20-poly1305'\n\t],\n\n\ttls_cipher_suites: [\n\t\t'TLS_RSA_WITH_AES_128_CBC_SHA',\n\t\t'TLS_RSA_WITH_AES_256_CBC_SHA',\n\t\t'TLS_RSA_WITH_AES_128_GCM_SHA256',\n\t\t'TLS_RSA_WITH_AES_256_GCM_SHA384',\n\t\t'TLS_AES_128_GCM_SHA256',\n\t\t'TLS_AES_256_GCM_SHA384',\n\t\t'TLS_CHACHA20_POLY1305_SHA256',\n\t\t'TLS_ECDHE_ECDSA_WITH_AES_128_CBC_SHA',\n\t\t'TLS_ECDHE_ECDSA_WITH_AES_256_CBC_SHA',\n\t\t'TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA',\n\t\t'TLS_ECDHE_RSA_WITH_AES_256_CBC_SHA',\n\t\t'TLS_ECDHE_ECDSA_WITH_AES_128_GCM_SHA256',\n\t\t'TLS_ECDHE_ECDSA_WITH_AES_256_GCM_SHA384',\n\t\t'TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256',\n\t\t'TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384',\n\t\t'TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256',\n\t\t'TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256'\n\t],\n\n\ttls_versions: [\n\t\t'1.0',\n\t\t'1.1',\n\t\t'1.2',\n\t\t'1.3'\n\t],\n\n\tCBIStaticList: form.DynamicList.extend({\n\t\t__name__: 'CBI.StaticList',\n\n\t\trenderWidget: function(/* ... */) {\n\t\t\tlet dl = form.DynamicList.prototype.renderWidget.apply(this, arguments);\n\t\t\tdl.querySelector('.add-item ul > li[data-value=\"-\"]')?.remove();\n\t\t\treturn dl;\n\t\t}\n\t}),\n\n\tcalcStringMD5(e) {\n\t\t/* Thanks to https://stackoverflow.com/a/41602636 */\n\t\tlet h = (a, b) => {\n\t\t\tlet c, d, e, f, g;\n\t\t\tc = a & 2147483648;\n\t\t\td = b & 2147483648;\n\t\t\te = a & 1073741824;\n\t\t\tf = b & 1073741824;\n\t\t\tg = (a & 1073741823) + (b & 1073741823);\n\t\t\treturn e & f ? g ^ 2147483648 ^ c ^ d : e | f ? g & 1073741824 ? g ^ 3221225472 ^ c ^ d : g ^ 1073741824 ^ c ^ d : g ^ c ^ d;\n\t\t}, k = (a, b, c, d, e, f, g) => h((a = h(a, h(h(b & c | ~b & d, e), g))) << f | a >>> 32 - f, b),\n\t\tl = (a, b, c, d, e, f, g) => h((a = h(a, h(h(b & d | c & ~d, e), g))) << f | a >>> 32 - f, b),\n\t\tm = (a, b, c, d, e, f, g) => h((a = h(a, h(h(b ^ c ^ d, e), g))) << f | a >>> 32 - f, b),\n\t\tn = (a, b, c, d, e, f, g) => h((a = h(a, h(h(c ^ (b | ~d), e), g))) << f | a >>> 32 - f, b),\n\t\tp = a => { let b = '', d = ''; for (let c = 0; c <= 3; c++) d = a >>> 8 * c & 255, d = '0' + d.toString(16), b += d.substr(d.length - 2, 2); return b; };\n\n\t\tlet f = [], q, r, s, t, a, b, c, d;\n\t\te = (() => {\n\t\t\te = e.replace(/\\r\\n/g, '\\n');\n\t\t\tlet b = '';\n\t\t\tfor (let d = 0; d < e.length; d++) {\n\t\t\t\tlet c = e.charCodeAt(d);\n\t\t\t\tb += c < 128 ? String.fromCharCode(c) : c < 2048 ? String.fromCharCode(c >> 6 | 192) + String.fromCharCode(c & 63 | 128) :\n\t\t\t\t\tString.fromCharCode(c >> 12 | 224) + String.fromCharCode(c >> 6 & 63 | 128) + String.fromCharCode(c & 63 | 128);\n\t\t\t}\n\t\t\treturn b;\n\t\t})();\n\t\tf = (() => {\n\t\t\tlet c = e.length, a = c + 8, d = 16 * ((a - a % 64) / 64 + 1), b = Array(d - 1), f = 0, g = 0;\n\t\t\tfor (; g < c;) a = (g - g % 4) / 4, f = g % 4 * 8, b[a] |= e.charCodeAt(g) << f, g++;\n\t\t\ta = (g - g % 4) / 4, b[a] |= 128 << g % 4 * 8, b[d - 2] = c << 3, b[d - 1] = c >>> 29;\n\t\t\treturn b;\n\t\t})();\n\n\t\ta = 1732584193, b = 4023233417, c = 2562383102, d = 271733878;\n\t\tfor (e = 0; e < f.length; e += 16) {\n\t\t\tq = a, r = b, s = c, t = d;\n\t\t\ta = k(a, b, c, d, f[e +  0],  7, 3614090360), d = k(d, a, b, c, f[e +  1], 12, 3905402710),\n\t\t\tc = k(c, d, a, b, f[e +  2], 17,  606105819), b = k(b, c, d, a, f[e +  3], 22, 3250441966),\n\t\t\ta = k(a, b, c, d, f[e +  4],  7, 4118548399), d = k(d, a, b, c, f[e +  5], 12, 1200080426),\n\t\t\tc = k(c, d, a, b, f[e +  6], 17, 2821735955), b = k(b, c, d, a, f[e +  7], 22, 4249261313),\n\t\t\ta = k(a, b, c, d, f[e +  8],  7, 1770035416), d = k(d, a, b, c, f[e +  9], 12, 2336552879),\n\t\t\tc = k(c, d, a, b, f[e + 10], 17, 4294925233), b = k(b, c, d, a, f[e + 11], 22, 2304563134),\n\t\t\ta = k(a, b, c, d, f[e + 12],  7, 1804603682), d = k(d, a, b, c, f[e + 13], 12, 4254626195),\n\t\t\tc = k(c, d, a, b, f[e + 14], 17, 2792965006), b = k(b, c, d, a, f[e + 15], 22, 1236535329),\n\t\t\ta = l(a, b, c, d, f[e +  1],  5, 4129170786), d = l(d, a, b, c, f[e +  6],  9, 3225465664),\n\t\t\tc = l(c, d, a, b, f[e + 11], 14,  643717713), b = l(b, c, d, a, f[e +  0], 20, 3921069994),\n\t\t\ta = l(a, b, c, d, f[e +  5],  5, 3593408605), d = l(d, a, b, c, f[e + 10],  9,   38016083),\n\t\t\tc = l(c, d, a, b, f[e + 15], 14, 3634488961), b = l(b, c, d, a, f[e +  4], 20, 3889429448),\n\t\t\ta = l(a, b, c, d, f[e +  9],  5,  568446438), d = l(d, a, b, c, f[e + 14],  9, 3275163606),\n\t\t\tc = l(c, d, a, b, f[e +  3], 14, 4107603335), b = l(b, c, d, a, f[e +  8], 20, 1163531501),\n\t\t\ta = l(a, b, c, d, f[e + 13],  5, 2850285829), d = l(d, a, b, c, f[e +  2],  9, 4243563512),\n\t\t\tc = l(c, d, a, b, f[e +  7], 14, 1735328473), b = l(b, c, d, a, f[e + 12], 20, 2368359562),\n\t\t\ta = m(a, b, c, d, f[e +  5],  4, 4294588738), d = m(d, a, b, c, f[e +  8], 11, 2272392833),\n\t\t\tc = m(c, d, a, b, f[e + 11], 16, 1839030562), b = m(b, c, d, a, f[e + 14], 23, 4259657740),\n\t\t\ta = m(a, b, c, d, f[e +  1],  4, 2763975236), d = m(d, a, b, c, f[e +  4], 11, 1272893353),\n\t\t\tc = m(c, d, a, b, f[e +  7], 16, 4139469664), b = m(b, c, d, a, f[e + 10], 23, 3200236656),\n\t\t\ta = m(a, b, c, d, f[e + 13],  4,  681279174), d = m(d, a, b, c, f[e +  0], 11, 3936430074),\n\t\t\tc = m(c, d, a, b, f[e +  3], 16, 3572445317), b = m(b, c, d, a, f[e +  6], 23,   76029189),\n\t\t\ta = m(a, b, c, d, f[e +  9],  4, 3654602809), d = m(d, a, b, c, f[e + 12], 11, 3873151461),\n\t\t\tc = m(c, d, a, b, f[e + 15], 16,  530742520), b = m(b, c, d, a, f[e +  2], 23, 3299628645),\n\t\t\ta = n(a, b, c, d, f[e +  0],  6, 4096336452), d = n(d, a, b, c, f[e +  7], 10, 1126891415),\n\t\t\tc = n(c, d, a, b, f[e + 14], 15, 2878612391), b = n(b, c, d, a, f[e +  5], 21, 4237533241),\n\t\t\ta = n(a, b, c, d, f[e + 12],  6, 1700485571), d = n(d, a, b, c, f[e +  3], 10, 2399980690),\n\t\t\tc = n(c, d, a, b, f[e + 10], 15, 4293915773), b = n(b, c, d, a, f[e +  1], 21, 2240044497),\n\t\t\ta = n(a, b, c, d, f[e +  8],  6, 1873313359), d = n(d, a, b, c, f[e + 15], 10, 4264355552),\n\t\t\tc = n(c, d, a, b, f[e +  6], 15, 2734768916), b = n(b, c, d, a, f[e + 13], 21, 1309151649),\n\t\t\ta = n(a, b, c, d, f[e +  4],  6, 4149444226), d = n(d, a, b, c, f[e + 11], 10, 3174756917),\n\t\t\tc = n(c, d, a, b, f[e +  2], 15,  718787259), b = n(b, c, d, a, f[e +  9], 21, 3951481745),\n\t\t\ta = h(a, q), b = h(b, r), c = h(c, s), d = h(d, t);\n\t\t}\n\t\treturn (p(a) + p(b) + p(c) + p(d)).toLowerCase();\n\t},\n\n\tdecodeBase64Str(str) {\n\t\tif (!str)\n\t\t\treturn null;\n\n\t\t/* Thanks to luci-app-ssr-plus */\n\t\tstr = str.replace(/-/g, '+').replace(/_/g, '/');\n\t\tlet padding = (4 - str.length % 4) % 4;\n\t\tif (padding)\n\t\t\tstr = str + Array(padding + 1).join('=');\n\n\t\treturn decodeURIComponent(Array.prototype.map.call(atob(str), (c) =>\n\t\t\t'%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2)\n\t\t).join(''));\n\t},\n\n\tgetBuiltinFeatures() {\n\t\tconst callGetSingBoxFeatures = rpc.declare({\n\t\t\tobject: 'luci.homeproxy',\n\t\t\tmethod: 'singbox_get_features',\n\t\t\texpect: { '': {} }\n\t\t});\n\n\t\treturn L.resolveDefault(callGetSingBoxFeatures(), {});\n\t},\n\n\tgenerateRand(type, length) {\n\t\tlet byteArr;\n\t\tif (['base64', 'hex'].includes(type))\n\t\t\tbyteArr = crypto.getRandomValues(new Uint8Array(length));\n\t\tswitch (type) {\n\t\t\tcase 'base64':\n\t\t\t\t/* Thanks to https://stackoverflow.com/questions/9267899 */\n\t\t\t\treturn btoa(String.fromCharCode.apply(null, byteArr));\n\t\t\tcase 'hex':\n\t\t\t\treturn Array.from(byteArr, (byte) =>\n\t\t\t\t\t(byte & 255).toString(16).padStart(2, '0')\n\t\t\t\t).join('');\n\t\t\tcase 'uuid':\n\t\t\t\t/* Thanks to https://stackoverflow.com/a/2117523 */\n\t\t\t\treturn ([1e7]+-1e3+-4e3+-8e3+-1e11).replace(/[018]/g, (c) =>\n\t\t\t\t\t(c ^ crypto.getRandomValues(new Uint8Array(1))[0] & 15 >> c / 4).toString(16)\n\t\t\t\t);\n\t\t\tdefault:\n\t\t\t\treturn null;\n\t\t};\n\t},\n\n\tloadDefaultLabel(uciconfig, ucisection) {\n\t\tlet label = uci.get(uciconfig, ucisection, 'label');\n\t\tif (label) {\n\t\t\treturn label;\n\t\t} else {\n\t\t\tuci.set(uciconfig, ucisection, 'label', ucisection);\n\t\t\treturn ucisection;\n\t\t}\n\t},\n\n\tloadModalTitle(title, addtitle, uciconfig, ucisection) {\n\t\tlet label = uci.get(uciconfig, ucisection, 'label');\n\t\treturn label ? title + ' » ' + label : addtitle;\n\t},\n\n\trenderSectionAdd(section, extra_class) {\n\t\tlet el = form.GridSection.prototype.renderSectionAdd.apply(section, [ extra_class ]),\n\t\t\tnameEl = el.querySelector('.cbi-section-create-name');\n\t\tui.addValidator(nameEl, 'uciname', true, (v) => {\n\t\t\tlet button = el.querySelector('.cbi-section-create > .cbi-button-add');\n\t\t\tlet uciconfig = section.uciconfig || section.map.config;\n\n\t\t\tif (!v) {\n\t\t\t\tbutton.disabled = true;\n\t\t\t\treturn true;\n\t\t\t} else if (uci.get(uciconfig, v)) {\n\t\t\t\tbutton.disabled = true;\n\t\t\t\treturn _('Expecting: %s').format(_('unique UCI identifier'));\n\t\t\t} else {\n\t\t\t\tbutton.disabled = null;\n\t\t\t\treturn true;\n\t\t\t}\n\t\t}, 'blur', 'keyup');\n\n\t\treturn el;\n\t},\n\n\tuploadCertificate(_option, type, filename, ev) {\n\t\tconst callWriteCertificate = rpc.declare({\n\t\t\tobject: 'luci.homeproxy',\n\t\t\tmethod: 'certificate_write',\n\t\t\tparams: ['filename'],\n\t\t\texpect: { '': {} }\n\t\t});\n\n\t\treturn ui.uploadFile('/tmp/homeproxy_certificate.tmp', ev.target)\n\t\t.then(L.bind((_btn, res) => {\n\t\t\treturn L.resolveDefault(callWriteCertificate(filename), {}).then((ret) => {\n\t\t\t\tif (ret.result === true)\n\t\t\t\t\tui.addNotification(null, E('p', _('Your %s was successfully uploaded. Size: %sB.').format(type, res.size)));\n\t\t\t\telse\n\t\t\t\t\tui.addNotification(null, E('p', _('Failed to upload %s, error: %s.').format(type, ret.error)));\n\t\t\t});\n\t\t}, this, ev.target))\n\t\t.catch((e) => { ui.addNotification(null, E('p', e.message)) });\n\t},\n\n\tvalidateBase64Key(length, section_id, value) {\n\t\t/* Thanks to luci-proto-wireguard */\n\t\tif (section_id && value)\n\t\t\tif (value.length !== length || !value.match(/^(?:[A-Za-z0-9+\\/]{4})*(?:[A-Za-z0-9+\\/]{2}==|[A-Za-z0-9+\\/]{3}=)?$/) || value[length-1] !== '=')\n\t\t\t\treturn _('Expecting: %s').format(_('valid base64 key with %d characters').format(length));\n\n\t\treturn true;\n\t},\n\n\tvalidateCertificatePath(section_id, value) {\n\t\tif (section_id && value)\n\t\t\tif (!value.match(/^(\\/etc\\/homeproxy\\/certs\\/|\\/etc\\/acme\\/|\\/etc\\/ssl\\/).+$/))\n\t\t\t\treturn _('Expecting: %s').format(_('/etc/homeproxy/certs/..., /etc/acme/..., /etc/ssl/...'));\n\n\t\treturn true;\n\t},\n\n\tvalidatePortRange(section_id, value) {\n\t\tif (section_id && value) {\n\t\t\tvalue = value.match(/^(\\d+)?\\:(\\d+)?$/);\n\t\t\tif (value && (value[1] || value[2])) {\n\t\t\t\tif (!value[1])\n\t\t\t\t\tvalue[1] = 0;\n\t\t\t\telse if (!value[2])\n\t\t\t\t\tvalue[2] = 65535;\n\n\t\t\t\tif (value[1] < value[2] && value[2] <= 65535)\n\t\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\treturn _('Expecting: %s').format( _('valid port range (port1:port2)'));\n\t\t}\n\n\t\treturn true;\n\t},\n\n\tvalidateUniqueValue(uciconfig, ucisection, ucioption, section_id, value) {\n\t\tif (section_id) {\n\t\t\tif (!value)\n\t\t\t\treturn _('Expecting: %s').format(_('non-empty value'));\n\t\t\tif (ucioption === 'node' && value === 'urltest')\n\t\t\t\treturn true;\n\n\t\t\tlet duplicate = false;\n\t\t\tuci.sections(uciconfig, ucisection, (res) => {\n\t\t\t\tif (res['.name'] !== section_id)\n\t\t\t\t\tif (res[ucioption] === value)\n\t\t\t\t\t\tduplicate = true\n\t\t\t});\n\t\t\tif (duplicate)\n\t\t\t\treturn _('Expecting: %s').format(_('unique value'));\n\t\t}\n\n\t\treturn true;\n\t},\n\n\tvalidateUUID(section_id, value) {\n\t\tif (section_id) {\n\t\t\tif (!value)\n\t\t\t\treturn _('Expecting: %s').format(_('non-empty value'));\n\t\t\telse if (value.match('^[0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{4}-[0-9a-fA-F]{12}$') === null)\n\t\t\t\treturn _('Expecting: %s').format(_('valid uuid'));\n\t\t}\n\n\t\treturn true;\n\t}\n});\n"
  },
  {
    "path": "luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/client.js",
    "content": "/*\n * SPDX-License-Identifier: GPL-2.0-only\n *\n * Copyright (C) 2022-2025 ImmortalWrt.org\n */\n\n'use strict';\n'require form';\n'require network';\n'require poll';\n'require rpc';\n'require uci';\n'require validation';\n'require view';\n\n'require homeproxy as hp';\n'require tools.firewall as fwtool';\n'require tools.widgets as widgets';\n\nconst callServiceList = rpc.declare({\n\tobject: 'service',\n\tmethod: 'list',\n\tparams: ['name'],\n\texpect: { '': {} }\n});\n\nconst callReadDomainList = rpc.declare({\n\tobject: 'luci.homeproxy',\n\tmethod: 'acllist_read',\n\tparams: ['type'],\n\texpect: { '': {} }\n});\n\nconst callWriteDomainList = rpc.declare({\n\tobject: 'luci.homeproxy',\n\tmethod: 'acllist_write',\n\tparams: ['type', 'content'],\n\texpect: { '': {} }\n});\n\nfunction getServiceStatus() {\n\treturn L.resolveDefault(callServiceList('homeproxy'), {}).then((res) => {\n\t\tlet isRunning = false;\n\t\ttry {\n\t\t\tisRunning = res['homeproxy']['instances']['sing-box-c']['running'];\n\t\t} catch (e) { }\n\t\treturn isRunning;\n\t});\n}\n\nfunction renderStatus(isRunning, version) {\n\tlet spanTemp = '<em><span style=\"color:%s\"><strong>%s (sing-box v%s) %s</strong></span></em>';\n\tlet renderHTML;\n\tif (isRunning)\n\t\trenderHTML = spanTemp.format('green', _('HomeProxy'), version, _('RUNNING'));\n\telse\n\t\trenderHTML = spanTemp.format('red', _('HomeProxy'), version, _('NOT RUNNING'));\n\n\treturn renderHTML;\n}\n\nlet stubValidator = {\n\tfactory: validation,\n\tapply(type, value, args) {\n\t\tif (value != null)\n\t\t\tthis.value = value;\n\n\t\treturn validation.types[type].apply(this, args);\n\t},\n\tassert(condition) {\n\t\treturn !!condition;\n\t}\n};\n\nreturn view.extend({\n\tload() {\n\t\treturn Promise.all([\n\t\t\tuci.load('homeproxy'),\n\t\t\thp.getBuiltinFeatures(),\n\t\t\tnetwork.getHostHints()\n\t\t]);\n\t},\n\n\trender(data) {\n\t\tlet m, s, o, ss, so;\n\n\t\tlet features = data[1],\n\t\t    hosts = data[2]?.hosts;\n\n\t\t/* Cache all configured proxy nodes, they will be called multiple times */\n\t\tlet proxy_nodes = {};\n\t\tuci.sections(data[0], 'node', (res) => {\n\t\t\tlet nodeaddr = ((res.type === 'direct') ? res.override_address : res.address) || '',\n\t\t\t    nodeport = ((res.type === 'direct') ? res.override_port : res.port) || '';\n\n\t\t\tproxy_nodes[res['.name']] =\n\t\t\t\tString.format('[%s] %s', res.type, res.label || ((stubValidator.apply('ip6addr', nodeaddr) ?\n\t\t\t\t\tString.format('[%s]', nodeaddr) : nodeaddr) + ':' + nodeport));\n\t\t});\n\n\t\tm = new form.Map('homeproxy', _('HomeProxy'),\n\t\t\t_('The modern ImmortalWrt proxy platform for ARM64/AMD64.'));\n\n\t\ts = m.section(form.TypedSection);\n\t\ts.render = function () {\n\t\t\tpoll.add(function () {\n\t\t\t\treturn L.resolveDefault(getServiceStatus()).then((res) => {\n\t\t\t\t\tlet view = document.getElementById('service_status');\n\t\t\t\t\tview.innerHTML = renderStatus(res, features.version);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn E('div', { class: 'cbi-section', id: 'status_bar' }, [\n\t\t\t\t\tE('p', { id: 'service_status' }, _('Collecting data...'))\n\t\t\t]);\n\t\t}\n\n\t\ts = m.section(form.NamedSection, 'config', 'homeproxy');\n\n\t\ts.tab('routing', _('Routing Settings'));\n\n\t\to = s.taboption('routing', form.ListValue, 'main_node', _('Main node'));\n\t\to.value('nil', _('Disable'));\n\t\to.value('urltest', _('URLTest'));\n\t\tfor (let i in proxy_nodes)\n\t\t\to.value(i, proxy_nodes[i]);\n\t\to.default = 'nil';\n\t\to.depends({'routing_mode': 'custom', '!reverse': true});\n\t\to.rmempty = false;\n\n\t\to = s.taboption('routing', hp.CBIStaticList, 'main_urltest_nodes', _('URLTest nodes'),\n\t\t\t_('List of nodes to test.'));\n\t\tfor (let i in proxy_nodes)\n\t\t\to.value(i, proxy_nodes[i]);\n\t\to.depends('main_node', 'urltest');\n\t\to.rmempty = false;\n\n\t\to = s.taboption('routing', form.Value, 'main_urltest_interval', _('Test interval'),\n\t\t\t_('The test interval in seconds.'));\n\t\to.datatype = 'uinteger';\n\t\to.placeholder = '180';\n\t\to.depends('main_node', 'urltest');\n\n\t\to = s.taboption('routing', form.Value, 'main_urltest_tolerance', _('Test tolerance'),\n\t\t\t_('The test tolerance in milliseconds.'));\n\t\to.datatype = 'uinteger';\n\t\to.placeholder = '50';\n\t\to.depends('main_node', 'urltest');\n\n\t\to = s.taboption('routing', form.ListValue, 'main_udp_node', _('Main UDP node'));\n\t\to.value('nil', _('Disable'));\n\t\to.value('same', _('Same as main node'));\n\t\to.value('urltest', _('URLTest'));\n\t\tfor (let i in proxy_nodes)\n\t\t\to.value(i, proxy_nodes[i]);\n\t\to.default = 'nil';\n\t\to.depends({'routing_mode': /^((?!custom).)+$/, 'proxy_mode': /^((?!redirect$).)+$/});\n\t\to.rmempty = false;\n\n\t\to = s.taboption('routing', hp.CBIStaticList, 'main_udp_urltest_nodes', _('URLTest nodes'),\n\t\t\t_('List of nodes to test.'));\n\t\tfor (let i in proxy_nodes)\n\t\t\to.value(i, proxy_nodes[i]);\n\t\to.depends('main_udp_node', 'urltest');\n\t\to.rmempty = false;\n\n\t\to = s.taboption('routing', form.Value, 'main_udp_urltest_interval', _('Test interval'),\n\t\t\t_('The test interval in seconds.'));\n\t\to.datatype = 'uinteger';\n\t\to.placeholder = '180';\n\t\to.depends('main_udp_node', 'urltest');\n\n\t\to = s.taboption('routing', form.Value, 'main_udp_urltest_tolerance', _('Test tolerance'),\n\t\t\t_('The test tolerance in milliseconds.'));\n\t\to.datatype = 'uinteger';\n\t\to.placeholder = '50';\n\t\to.depends('main_udp_node', 'urltest');\n\n\t\to = s.taboption('routing', form.Value, 'dns_server', _('DNS server'),\n\t\t\t_('Support UDP, TCP, DoH, DoQ, DoT. TCP protocol will be used if not specified.'));\n\t\to.value('wan', _('WAN DNS (read from interface)'));\n\t\to.value('1.1.1.1', _('CloudFlare Public DNS (1.1.1.1)'));\n\t\to.value('208.67.222.222', _('Cisco Public DNS (208.67.222.222)'));\n\t\to.value('8.8.8.8', _('Google Public DNS (8.8.8.8)'));\n\t\to.value('', '---');\n\t\to.value('223.5.5.5', _('Aliyun Public DNS (223.5.5.5)'));\n\t\to.value('119.29.29.29', _('Tencent Public DNS (119.29.29.29)'));\n\t\to.value('117.50.10.10', _('ThreatBook Public DNS (117.50.10.10)'));\n\t\to.default = '8.8.8.8';\n\t\to.rmempty = false;\n\t\to.depends({'routing_mode': 'custom', '!reverse': true});\n\t\to.validate = function(section_id, value) {\n\t\t\tif (section_id && !['wan'].includes(value)) {\n\t\t\t\tif (!value)\n\t\t\t\t\treturn _('Expecting: %s').format(_('non-empty value'));\n\n\t\t\t\tlet ipv6_support = this.section.formvalue(section_id, 'ipv6_support');\n\t\t\t\ttry {\n\t\t\t\t\tlet url = new URL(value.replace(/^.*:\\/\\//, 'http://'));\n\t\t\t\t\tif (stubValidator.apply('hostname', url.hostname))\n\t\t\t\t\t\treturn true;\n\t\t\t\t\telse if (stubValidator.apply('ip4addr', url.hostname))\n\t\t\t\t\t\treturn true;\n\t\t\t\t\telse if ((ipv6_support === '1') && stubValidator.apply('ip6addr', url.hostname.match(/^\\[(.+)\\]$/)?.[1]))\n\t\t\t\t\t\treturn true;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn _('Expecting: %s').format(_('valid DNS server address'));\n\t\t\t\t} catch(e) {}\n\n\t\t\t\tif (!stubValidator.apply((ipv6_support === '1') ? 'ipaddr' : 'ip4addr', value))\n\t\t\t\t\treturn _('Expecting: %s').format(_('valid DNS server address'));\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\to = s.taboption('routing', form.Value, 'china_dns_server', _('China DNS server'),\n\t\t\t_('The dns server for resolving China domains. Support UDP, TCP, DoH, DoQ, DoT.'));\n\t\to.value('wan', _('WAN DNS (read from interface)'));\n\t\to.value('223.5.5.5', _('Aliyun Public DNS (223.5.5.5)'));\n\t\to.value('210.2.4.8', _('CNNIC Public DNS (210.2.4.8)'));\n\t\to.value('119.29.29.29', _('Tencent Public DNS (119.29.29.29)'));\n\t\to.value('117.50.10.10', _('ThreatBook Public DNS (117.50.10.10)'));\n\t\to.depends('routing_mode', 'bypass_mainland_china');\n\t\to.default = '223.5.5.5';\n\t\to.rmempty = false;\n\t\to.validate = function(section_id, value) {\n\t\t\tif (section_id && !['wan'].includes(value)) {\n\t\t\t\tif (!value)\n\t\t\t\t\treturn _('Expecting: %s').format(_('non-empty value'));\n\n\t\t\t\ttry {\n\t\t\t\t\tlet url = new URL(value.replace(/^.*:\\/\\//, 'http://'));\n\t\t\t\t\tif (stubValidator.apply('hostname', url.hostname))\n\t\t\t\t\t\treturn true;\n\t\t\t\t\telse if (stubValidator.apply('ip4addr', url.hostname))\n\t\t\t\t\t\treturn true;\n\t\t\t\t\telse if (stubValidator.apply('ip6addr', url.hostname.match(/^\\[(.+)\\]$/)?.[1]))\n\t\t\t\t\t\treturn true;\n\t\t\t\t\telse\n\t\t\t\t\t\treturn _('Expecting: %s').format(_('valid DNS server address'));\n\t\t\t\t} catch(e) {}\n\n\t\t\t\tif (!stubValidator.apply('ipaddr', value))\n\t\t\t\t\treturn _('Expecting: %s').format(_('valid DNS server address'));\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\to = s.taboption('routing', form.ListValue, 'routing_mode', _('Routing mode'));\n\t\to.value('gfwlist', _('GFWList'));\n\t\to.value('bypass_mainland_china', _('Bypass mainland China'));\n\t\to.value('proxy_mainland_china', _('Only proxy mainland China'));\n\t\to.value('custom', _('Custom routing'));\n\t\to.value('global', _('Global'));\n\t\to.default = 'bypass_mainland_china';\n\t\to.rmempty = false;\n\t\to.onchange = function(ev, section_id, value) {\n\t\t\tif (section_id && value === 'custom')\n\t\t\t\tthis.map.save(null, true);\n\t\t}\n\n\t\to = s.taboption('routing', form.Value, 'routing_port', _('Routing ports'),\n\t\t\t_('Specify target ports to be proxied. Multiple ports must be separated by commas.'));\n\t\to.value('', _('All ports'));\n\t\to.value('common', _('Common ports only (bypass P2P traffic)'));\n\t\to.validate = function(section_id, value) {\n\t\t\tif (section_id && value && value !== 'common') {\n\n\t\t\t\tlet ports = [];\n\t\t\t\tfor (let i of value.split(',')) {\n\t\t\t\t\tif (!stubValidator.apply('port', i) && !stubValidator.apply('portrange', i))\n\t\t\t\t\t\treturn _('Expecting: %s').format(_('valid port value'));\n\t\t\t\t\tif (ports.includes(i))\n\t\t\t\t\t\treturn _('Port %s alrealy exists!').format(i);\n\t\t\t\t\tports = ports.concat(i);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\to = s.taboption('routing', form.ListValue, 'proxy_mode', _('Proxy mode'));\n\t\to.value('redirect', _('Redirect TCP'));\n\t\tif (features.hp_has_tproxy)\n\t\t\to.value('redirect_tproxy', _('Redirect TCP + TProxy UDP'));\n\t\tif (features.hp_has_ip_full && features.hp_has_tun) {\n\t\t\to.value('redirect_tun', _('Redirect TCP + Tun UDP'));\n\t\t\to.value('tun', _('Tun TCP/UDP'));\n\t\t} else {\n\t\t\to.description = _('To enable Tun support, you need to install <code>ip-full</code> and <code>kmod-tun</code>');\n\t\t}\n\t\to.default = 'redirect_tproxy';\n\t\to.rmempty = false;\n\n\t\to = s.taboption('routing', form.Flag, 'ipv6_support', _('IPv6 support'));\n\t\to.default = o.enabled;\n\t\to.rmempty = false;\n\n\t\t/* Custom routing settings start */\n\t\t/* Routing settings start */\n\t\to = s.taboption('routing', form.SectionValue, '_routing', form.NamedSection, 'routing', 'homeproxy');\n\t\to.depends('routing_mode', 'custom');\n\n\t\tss = o.subsection;\n\t\tso = ss.option(form.ListValue, 'tcpip_stack', _('TCP/IP stack'),\n\t\t\t_('TCP/IP stack.'));\n\t\tif (features.with_gvisor) {\n\t\t\tso.value('mixed', _('Mixed'));\n\t\t\tso.value('gvisor', _('gVisor'));\n\t\t}\n\t\tso.value('system', _('System'));\n\t\tso.default = 'system';\n\t\tso.depends('homeproxy.config.proxy_mode', 'redirect_tun');\n\t\tso.depends('homeproxy.config.proxy_mode', 'tun');\n\t\tso.rmempty = false;\n\t\tso.onchange = function(ev, section_id, value) {\n\t\t\tlet desc = ev.target.nextElementSibling;\n\t\t\tif (value === 'mixed')\n\t\t\t\tdesc.innerHTML = _('Mixed <code>system</code> TCP stack and <code>gVisor</code> UDP stack.')\n\t\t\telse if (value === 'gvisor')\n\t\t\t\tdesc.innerHTML = _('Based on google/gvisor.');\n\t\t\telse if (value === 'system')\n\t\t\t\tdesc.innerHTML = _('Less compatibility and sometimes better performance.');\n\t\t}\n\n\t\tso = ss.option(form.Flag, 'endpoint_independent_nat', _('Enable endpoint-independent NAT'),\n\t\t\t_('Performance may degrade slightly, so it is not recommended to enable on when it is not needed.'));\n\t\tso.default = so.enabled;\n\t\tso.depends('tcpip_stack', 'mixed');\n\t\tso.depends('tcpip_stack', 'gvisor');\n\t\tso.rmempty = false;\n\n\t\tso = ss.option(form.Value, 'udp_timeout', _('UDP NAT expiration time'),\n\t\t\t_('In seconds.'));\n\t\tso.datatype = 'uinteger';\n\t\tso.placeholder = '300';\n\t\tso.depends('homeproxy.config.proxy_mode', 'redirect_tproxy');\n\t\tso.depends('homeproxy.config.proxy_mode', 'redirect_tun');\n\t\tso.depends('homeproxy.config.proxy_mode', 'tun');\n\n\t\tso = ss.option(form.Flag, 'bypass_cn_traffic', _('Bypass CN traffic'),\n\t\t\t_('Bypass mainland China traffic via firewall rules by default.'));\n\t\tso.rmempty = false;\n\n\t\tso = ss.option(form.ListValue, 'domain_strategy', _('Domain strategy'),\n\t\t\t_('If set, the requested domain name will be resolved to IP before routing.'));\n\t\tfor (let i in hp.dns_strategy)\n\t\t\tso.value(i, hp.dns_strategy[i]);\n\n\t\tso = ss.option(form.Flag, 'sniff_override', _('Override destination'),\n\t\t\t_('Override the connection destination address with the sniffed domain.'));\n\t\tso.default = so.enabled;\n\t\tso.rmempty = false;\n\n\t\tso = ss.option(form.ListValue, 'default_outbound', _('Default outbound'),\n\t\t\t_('Default outbound for connections not matched by any routing rules.'));\n\t\tso.load = function(section_id) {\n\t\t\tdelete this.keylist;\n\t\t\tdelete this.vallist;\n\n\t\t\tthis.value('nil', _('Disable (the service)'));\n\t\t\tthis.value('direct-out', _('Direct'));\n\t\t\tthis.value('block-out', _('Block'));\n\t\t\tuci.sections(data[0], 'routing_node', (res) => {\n\t\t\t\tif (res.enabled === '1')\n\t\t\t\t\tthis.value(res['.name'], res.label);\n\t\t\t});\n\n\t\t\treturn this.super('load', section_id);\n\t\t}\n\t\tso.default = 'nil';\n\t\tso.rmempty = false;\n\n\t\tso = ss.option(form.ListValue, 'default_outbound_dns', _('Default outbound DNS'),\n\t\t\t_('Default DNS server for resolving domain name in the server address.'));\n\t\tso.load = function(section_id) {\n\t\t\tdelete this.keylist;\n\t\t\tdelete this.vallist;\n\n\t\t\tthis.value('default-dns', _('Default DNS (issued by WAN)'));\n\t\t\tthis.value('system-dns', _('System DNS'));\n\t\t\tuci.sections(data[0], 'dns_server', (res) => {\n\t\t\t\tif (res.enabled === '1')\n\t\t\t\t\tthis.value(res['.name'], res.label);\n\t\t\t});\n\n\t\t\treturn this.super('load', section_id);\n\t\t}\n\t\tso.default = 'default-dns';\n\t\tso.rmempty = false;\n\t\t/* Routing settings end */\n\n\t\t/* Routing nodes start */\n\t\ts.tab('routing_node', _('Routing Nodes'));\n\t\to = s.taboption('routing_node', form.SectionValue, '_routing_node', form.GridSection, 'routing_node');\n\t\to.depends('routing_mode', 'custom');\n\n\t\tss = o.subsection;\n\t\tss.addremove = true;\n\t\tss.rowcolors = true;\n\t\tss.sortable = true;\n\t\tss.nodescriptions = true;\n\t\tss.modaltitle = L.bind(hp.loadModalTitle, this, _('Routing node'), _('Add a routing node'), data[0]);\n\t\tss.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]);\n\t\tss.renderSectionAdd = L.bind(hp.renderSectionAdd, this, ss);\n\n\t\tso = ss.option(form.Value, 'label', _('Label'));\n\t\tso.load = L.bind(hp.loadDefaultLabel, this, data[0]);\n\t\tso.validate = L.bind(hp.validateUniqueValue, this, data[0], 'routing_node', 'label');\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(form.Flag, 'enabled', _('Enable'));\n\t\tso.default = so.enabled;\n\t\tso.rmempty = false;\n\t\tso.editable = true;\n\n\t\tso = ss.option(form.ListValue, 'node', _('Node'),\n\t\t\t_('Outbound node'));\n\t\tso.value('urltest', _('URLTest'));\n\t\tfor (let i in proxy_nodes)\n\t\t\tso.value(i, proxy_nodes[i]);\n\t\tso.validate = L.bind(hp.validateUniqueValue, this, data[0], 'routing_node', 'node');\n\t\tso.editable = true;\n\n\t\tso = ss.option(form.ListValue, 'domain_resolver', _('Domain resolver'),\n\t\t\t_('For resolving domain name in the server address.'));\n\t\tso.load = function(section_id) {\n\t\t\tdelete this.keylist;\n\t\t\tdelete this.vallist;\n\n\t\t\tthis.value('', _('Default'));\n\t\t\tthis.value('default-dns', _('Default DNS (issued by WAN)'));\n\t\t\tthis.value('system-dns', _('System DNS'));\n\t\t\tuci.sections(data[0], 'dns_server', (res) => {\n\t\t\t\tif (res.enabled === '1')\n\t\t\t\t\tthis.value(res['.name'], res.label);\n\t\t\t});\n\n\t\t\treturn this.super('load', section_id);\n\t\t}\n\t\tso.depends({'node': 'urltest', '!reverse': true});\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(form.ListValue, 'domain_strategy', _('Domain strategy'),\n\t\t\t_('The domain strategy for resolving the domain name in the address.'));\n\t\tfor (let i in hp.dns_strategy)\n\t\t\tso.value(i, hp.dns_strategy[i]);\n\t\tso.depends({'node': 'urltest', '!reverse': true});\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(widgets.DeviceSelect, 'bind_interface', _('Bind interface'),\n\t\t\t_('The network interface to bind to.'));\n\t\tso.multiple = false;\n\t\tso.noaliases = true;\n\t\tso.depends({'outbound': '', 'node': /^((?!urltest$).)+$/});\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(form.ListValue, 'outbound', _('Outbound'),\n\t\t\t_('The tag of the upstream outbound.<br/>Other dial fields will be ignored when enabled.'));\n\t\tso.load = function(section_id) {\n\t\t\tdelete this.keylist;\n\t\t\tdelete this.vallist;\n\n\t\t\tthis.value('', _('Direct'));\n\t\t\tuci.sections(data[0], 'routing_node', (res) => {\n\t\t\t\tif (res['.name'] !== section_id && res.enabled === '1')\n\t\t\t\t\tthis.value(res['.name'], res.label);\n\t\t\t});\n\n\t\t\treturn this.super('load', section_id);\n\t\t}\n\t\tso.validate = function(section_id, value) {\n\t\t\tif (section_id && value) {\n\t\t\t\tlet node = this.section.formvalue(section_id, 'node');\n\n\t\t\t\tlet conflict = false;\n\t\t\t\tuci.sections(data[0], 'routing_node', (res) => {\n\t\t\t\t\tif (res['.name'] !== section_id) {\n\t\t\t\t\t\tif (res.outbound === section_id && res['.name'] == value)\n\t\t\t\t\t\t\tconflict = true;\n\t\t\t\t\t\telse if (res.node === 'urltest' && res.urltest_nodes?.includes(node) && res['.name'] == value)\n\t\t\t\t\t\t\tconflict = true;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (conflict)\n\t\t\t\t\treturn _('Recursive outbound detected!');\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t\tso.depends({'node': 'urltest', '!reverse': true});\n\t\tso.editable = true;\n\n\t\tso = ss.option(hp.CBIStaticList, 'urltest_nodes', _('URLTest nodes'),\n\t\t\t_('List of nodes to test.'));\n\t\tfor (let i in proxy_nodes)\n\t\t\tso.value(i, proxy_nodes[i]);\n\t\tso.depends('node', 'urltest');\n\t\tso.validate = function(section_id) {\n\t\t\tlet value = this.section.formvalue(section_id, 'urltest_nodes');\n\t\t\tif (section_id && !value.length)\n\t\t\t\treturn _('Expecting: %s').format(_('non-empty value'));\n\n\t\t\treturn true;\n\t\t}\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(form.Value, 'urltest_url', _('Test URL'),\n\t\t\t_('The URL to test.'));\n\t\tso.placeholder = 'https://www.gstatic.com/generate_204';\n\t\tso.validate = function(section_id, value) {\n\t\t\tif (section_id && value) {\n\t\t\t\ttry {\n\t\t\t\t\tlet url = new URL(value);\n\t\t\t\t\tif (!url.hostname)\n\t\t\t\t\t\treturn _('Expecting: %s').format(_('valid URL'));\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\treturn _('Expecting: %s').format(_('valid URL'));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t\tso.depends('node', 'urltest');\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(form.Value, 'urltest_interval', _('Test interval'),\n\t\t\t_('The test interval in seconds.'));\n\t\tso.datatype = 'uinteger';\n\t\tso.placeholder = '180';\n\t\tso.validate = function(section_id, value) {\n\t\t\tif (section_id && value) {\n\t\t\t\tlet idle_timeout = this.section.formvalue(section_id, 'idle_timeout') || '1800';\n\t\t\t\tif (parseInt(value) > parseInt(idle_timeout))\n\t\t\t\t\treturn _('Test interval must be less or equal than idle timeout.');\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t\tso.depends('node', 'urltest');\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(form.Value, 'urltest_tolerance', _('Test tolerance'),\n\t\t\t_('The test tolerance in milliseconds.'));\n\t\tso.datatype = 'uinteger';\n\t\tso.placeholder = '50';\n\t\tso.depends('node', 'urltest');\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(form.Value, 'urltest_idle_timeout', _('Idle timeout'),\n\t\t\t_('The idle timeout in seconds.'));\n\t\tso.datatype = 'uinteger';\n\t\tso.placeholder = '1800';\n\t\tso.depends('node', 'urltest');\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(form.Flag, 'urltest_interrupt_exist_connections', _('Interrupt existing connections'),\n\t\t\t_('Interrupt existing connections when the selected outbound has changed.'));\n\t\tso.depends('node', 'urltest');\n\t\tso.modalonly = true;\n\t\t/* Routing nodes end */\n\n\t\t/* Routing rules start */\n\t\ts.tab('routing_rule', _('Routing Rules'));\n\t\to = s.taboption('routing_rule', form.SectionValue, '_routing_rule', form.GridSection, 'routing_rule');\n\t\to.depends('routing_mode', 'custom');\n\n\t\tss = o.subsection;\n\t\tss.addremove = true;\n\t\tss.rowcolors = true;\n\t\tss.sortable = true;\n\t\tss.nodescriptions = true;\n\t\tss.modaltitle = L.bind(hp.loadModalTitle, this, _('Routing rule'), _('Add a routing rule'), data[0]);\n\t\tss.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]);\n\t\tss.renderSectionAdd = L.bind(hp.renderSectionAdd, this, ss);\n\n\t\tss.tab('field_other', _('Other fields'));\n\t\tss.tab('field_host', _('Host/IP fields'));\n\t\tss.tab('field_port', _('Port fields'));\n\t\tss.tab('fields_process', _('Process fields'));\n\n\t\tso = ss.taboption('field_other', form.Value, 'label', _('Label'));\n\t\tso.load = L.bind(hp.loadDefaultLabel, this, data[0]);\n\t\tso.validate = L.bind(hp.validateUniqueValue, this, data[0], 'routing_rule', 'label');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Flag, 'enabled', _('Enable'));\n\t\tso.default = so.enabled;\n\t\tso.rmempty = false;\n\t\tso.editable = true;\n\n\t\tso = ss.taboption('field_other', form.ListValue, 'mode', _('Mode'),\n\t\t\t_('The default rule uses the following matching logic:<br/>' +\n\t\t\t'<code>(domain || domain_suffix || domain_keyword || domain_regex || ip_cidr || ip_is_private)</code> &&<br/>' +\n\t\t\t'<code>(port || port_range)</code> &&<br/>' +\n\t\t\t'<code>(source_ip_cidr || source_ip_is_private)</code> &&<br/>' +\n\t\t\t'<code>(source_port || source_port_range)</code> &&<br/>' +\n\t\t\t'<code>other fields</code>.<br/>' +\n\t\t\t'Additionally, included rule sets can be considered merged rather than as a single rule sub-item.'));\n\t\tso.value('default', _('Default'));\n\t\tso.default = 'default';\n\t\tso.rmempty = false;\n\t\tso.readonly = true;\n\n\t\tso = ss.taboption('field_other', form.ListValue, 'ip_version', _('IP version'),\n\t\t\t_('4 or 6. Not limited if empty.'));\n\t\tso.value('4', _('IPv4'));\n\t\tso.value('6', _('IPv6'));\n\t\tso.value('', _('Both'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.MultiValue, 'protocol', _('Protocol'),\n\t\t\t_('Sniffed protocol, see <a target=\"_blank\" href=\"https://sing-box.sagernet.org/configuration/route/sniff/\">Sniff</a> for details.'));\n\t\tso.value('bittorrent', _('BitTorrent'));\n\t\tso.value('dns', _('DNS'));\n\t\tso.value('dtls', _('DTLS'));\n\t\tso.value('http', _('HTTP'));\n\t\tso.value('quic', _('QUIC'));\n\t\tso.value('rdp', _('RDP'));\n\t\tso.value('ssh', _('SSH'));\n\t\tso.value('stun', _('STUN'));\n\t\tso.value('tls', _('TLS'));\n\n\t\tso = ss.taboption('field_other', form.Value, 'client', _('Client'),\n\t\t\t_('Sniffed client type (QUIC client type or SSH client name).'));\n\t\tso.value('chromium', _('Chromium / Cronet'));\n\t\tso.value('firefox', _('Firefox / uquic firefox'));\n\t\tso.value('quic-go', _('quic-go / uquic chrome'));\n\t\tso.value('safari', _('Safari / Apple Network API'));\n\t\tso.depends('protocol', 'quic');\n\t\tso.depends('protocol', 'ssh');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.ListValue, 'network', _('Network'));\n\t\tso.value('tcp', _('TCP'));\n\t\tso.value('udp', _('UDP'));\n\t\tso.value('', _('Both'));\n\n\t\tso = ss.taboption('field_other', form.DynamicList, 'user', _('User'),\n\t\t\t_('Match user name.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', hp.CBIStaticList, 'rule_set', _('Rule set'),\n\t\t\t_('Match rule set.'));\n\t\tso.load = function(section_id) {\n\t\t\tdelete this.keylist;\n\t\t\tdelete this.vallist;\n\n\t\t\tuci.sections(data[0], 'ruleset', (res) => {\n\t\t\t\tif (res.enabled === '1')\n\t\t\t\t\tthis.value(res['.name'], res.label);\n\t\t\t});\n\n\t\t\treturn this.super('load', section_id);\n\t\t}\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Flag, 'rule_set_ip_cidr_match_source', _('Rule set IP CIDR as source IP'),\n\t\t\t_('Make IP CIDR in rule set used to match the source IP.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Flag, 'invert', _('Invert'),\n\t\t\t_('Invert match result.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.ListValue, 'action', _('Action'));\n\t\tso.value('route', _('Route'));\n\t\tso.value('route-options', _('Route options'));\n\t\tso.value('reject', _('Reject'));\n\t\tso.value('resolve', _('Resolve'));\n\t\tso.default = 'route';\n\t\tso.rmempty = false;\n\t\tso.editable = true;\n\n\t\tso = ss.taboption('field_other', form.ListValue, 'outbound', _('Outbound'),\n\t\t\t_('Tag of the target outbound.'));\n\t\tso.load = function(section_id) {\n\t\t\tdelete this.keylist;\n\t\t\tdelete this.vallist;\n\n\t\t\tthis.value('direct-out', _('Direct'));\n\t\t\tuci.sections(data[0], 'routing_node', (res) => {\n\t\t\t\tif (res.enabled === '1')\n\t\t\t\t\tthis.value(res['.name'], res.label);\n\t\t\t});\n\n\t\t\treturn this.super('load', section_id);\n\t\t}\n\t\tso.rmempty = false;\n\t\tso.depends('action', 'route');\n\t\tso.editable = true;\n\n\t\tso = ss.taboption('field_other', form.Value, 'override_address', _('Override address'),\n\t\t\t_('Override the connection destination address.'));\n\t\tso.datatype = 'ipaddr';\n\t\tso.depends('action', 'route');\n\t\tso.depends('action', 'route-options');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Value, 'override_port', _('Override port'),\n\t\t\t_('Override the connection destination port.'));\n\t\tso.datatype = 'port';\n\t\tso.depends('action', 'route');\n\t\tso.depends('action', 'route-options');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Flag, 'udp_disable_domain_unmapping', _('Disable UDP domain unmapping'),\n\t\t\t_('If enabled, for UDP proxy requests addressed to a domain, the original packet address will be sent in the response instead of the mapped domain.'));\n\t\tso.depends('action', 'route');\n\t\tso.depends('action', 'route-options');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Flag, 'udp_connect', _('connect UDP connections'),\n\t\t\t_('If enabled, attempts to connect UDP connection to the destination instead of listen.'));\n\t\tso.depends('action', 'route');\n\t\tso.depends('action', 'route-options');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Value, 'udp_timeout', _('UDP timeout'),\n\t\t\t_('Timeout for UDP connections.<br/>Setting a larger value than the UDP timeout in inbounds will have no effect.'));\n\t\tso.datatype = 'uinteger';\n\t\tso.depends('action', 'route');\n\t\tso.depends('action', 'route-options');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Flag, 'tls_record_fragment', _('TLS record fragment'),\n\t\t\t_('Fragment TLS handshake into multiple TLS records.'));\n\t\tso.depends('action', 'route');\n\t\tso.depends('action', 'route-options');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Flag, 'tls_fragment', _('TLS fragment'),\n\t\t\t_('Fragment TLS handshakes. Due to poor performance, try <code>%s</code> first.').format(\n\t\t\t\t_('TLS record fragment')));\n\t\tso.depends('action', 'route');\n\t\tso.depends('action', 'route-options');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Value, 'tls_fragment_fallback_delay', _('Fragment fallback delay'),\n\t\t\t_('The fallback value in milliseconds used when TLS segmentation cannot automatically determine the wait time.'));\n\t\tso.datatype = 'uinteger';\n\t\tso.placeholder = '500';\n\t\tso.depends('tls_fragment', '1');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.ListValue, 'resolve_server', _('DNS server'),\n\t\t\t_('Specifies DNS server tag to use instead of selecting through DNS routing.'));\n\t\tso.load = function(section_id) {\n\t\t\tdelete this.keylist;\n\t\t\tdelete this.vallist;\n\n\t\t\tthis.value('', _('Default'));\n\t\t\tthis.value('default-dns', _('Default DNS (issued by WAN)'));\n\t\t\tthis.value('system-dns', _('System DNS'));\n\t\t\tuci.sections(data[0], 'dns_server', (res) => {\n\t\t\t\tif (res.enabled === '1')\n\t\t\t\t\tthis.value(res['.name'], res.label);\n\t\t\t});\n\n\t\t\treturn this.super('load', section_id);\n\t\t}\n\t\tso.depends('action', 'resolve');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.ListValue, 'reject_method', _('Method'));\n\t\tso.value('default', _('Reply with TCP RST / ICMP port unreachable'));\n\t\tso.value('drop', _('Drop packets'));\n\t\tso.depends('action', 'reject');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Flag, 'reject_no_drop', _('Don\\'t drop packets'),\n\t\t\t_('<code>%s</code> will be temporarily overwritten to <code>%s</code> after 50 triggers in 30s if not enabled.').format(\n\t\t\t_('Method'), _('Drop packets')));\n\t\tso.depends('reject_method', 'default');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.ListValue, 'resolve_strategy', _('Resolve strategy'),\n\t\t\t_('Domain strategy for resolving the domain names.'));\n\t\tfor (let i in hp.dns_strategy)\n\t\t\tso.value(i, hp.dns_strategy[i]);\n\t\tso.depends('action', 'resolve');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Flag, 'resolve_disable_cache', _('Disable DNS cache'),\n\t\t\t_('Disable DNS cache in this query.'));\n\t\tso.depends('action', 'resolve');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Value, 'resolve_rewrite_ttl', _('Rewrite TTL'),\n\t\t\t_('Rewrite TTL in DNS responses.'));\n\t\tso.datatype = 'uinteger';\n\t\tso.depends('action', 'resolve');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Value, 'resolve_client_subnet', _('EDNS Client subnet'),\n\t\t\t_('Append a <code>edns0-subnet</code> OPT extra record with the specified IP prefix to every query by default.<br/>' +\n\t\t\t'If value is an IP address instead of prefix, <code>/32</code> or <code>/128</code> will be appended automatically.'));\n\t\tso.datatype = 'or(cidr, ipaddr)';\n\t\tso.depends('action', 'resolve');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_host', form.DynamicList, 'domain', _('Domain name'),\n\t\t\t_('Match full domain.'));\n\t\tso.datatype = 'hostname';\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_host', form.DynamicList, 'domain_suffix', _('Domain suffix'),\n\t\t\t_('Match domain suffix.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_host', form.DynamicList, 'domain_keyword', _('Domain keyword'),\n\t\t\t_('Match domain using keyword.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_host', form.DynamicList, 'domain_regex', _('Domain regex'),\n\t\t\t_('Match domain using regular expression.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_host', form.DynamicList, 'source_ip_cidr', _('Source IP CIDR'),\n\t\t\t_('Match source IP CIDR.'));\n\t\tso.datatype = 'or(cidr, ipaddr)';\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_host', form.Flag, 'source_ip_is_private', _('Match private source IP'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_host', form.DynamicList, 'ip_cidr', _('IP CIDR'),\n\t\t\t_('Match IP CIDR.'));\n\t\tso.datatype = 'or(cidr, ipaddr)';\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_host', form.Flag, 'ip_is_private', _('Match private IP'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_port', form.DynamicList, 'source_port', _('Source port'),\n\t\t\t_('Match source port.'));\n\t\tso.datatype = 'port';\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_port', form.DynamicList, 'source_port_range', _('Source port range'),\n\t\t\t_('Match source port range. Format as START:/:END/START:END.'));\n\t\tso.validate = hp.validatePortRange;\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_port', form.DynamicList, 'port', _('Port'),\n\t\t\t_('Match port.'));\n\t\tso.datatype = 'port';\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_port', form.DynamicList, 'port_range', _('Port range'),\n\t\t\t_('Match port range. Format as START:/:END/START:END.'));\n\t\tso.validate = hp.validatePortRange;\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('fields_process', form.DynamicList, 'process_name', _('Process name'),\n\t\t\t_('Match process name.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('fields_process', form.DynamicList, 'process_path', _('Process path'),\n\t\t\t_('Match process path.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('fields_process', form.DynamicList, 'process_path_regex', _('Process path (regex)'),\n\t\t\t_('Match process path using regular expression.'));\n\t\tso.modalonly = true;\n\t\t/* Routing rules end */\n\n\t\t/* DNS settings start */\n\t\ts.tab('dns', _('DNS Settings'));\n\t\to = s.taboption('dns', form.SectionValue, '_dns', form.NamedSection, 'dns', 'homeproxy');\n\t\to.depends('routing_mode', 'custom');\n\n\t\tss = o.subsection;\n\t\tso = ss.option(form.ListValue, 'default_strategy', _('Default DNS strategy'),\n\t\t\t_('The DNS strategy for resolving the domain name in the address.'));\n\t\tfor (let i in hp.dns_strategy)\n\t\t\tso.value(i, hp.dns_strategy[i]);\n\n\t\tso = ss.option(form.ListValue, 'default_server', _('Default DNS server'));\n\t\tso.load = function(section_id) {\n\t\t\tdelete this.keylist;\n\t\t\tdelete this.vallist;\n\n\t\t\tthis.value('default-dns', _('Default DNS (issued by WAN)'));\n\t\t\tthis.value('system-dns', _('System DNS'));\n\t\t\tuci.sections(data[0], 'dns_server', (res) => {\n\t\t\t\tif (res.enabled === '1')\n\t\t\t\t\tthis.value(res['.name'], res.label);\n\t\t\t});\n\n\t\t\treturn this.super('load', section_id);\n\t\t}\n\t\tso.default = 'default-dns';\n\t\tso.rmempty = false;\n\n\t\tso = ss.option(form.Flag, 'disable_cache', _('Disable DNS cache'));\n\n\t\tso = ss.option(form.Flag, 'disable_cache_expire', _('Disable cache expire'));\n\t\tso.depends('disable_cache', '0');\n\n\t\tso = ss.option(form.Flag, 'independent_cache', _('Independent cache per server'),\n\t\t\t_('Make each DNS server\\'s cache independent for special purposes. If enabled, will slightly degrade performance.'));\n\t\tso.depends('disable_cache', '0');\n\n\t\tso = ss.option(form.Value, 'client_subnet', _('EDNS Client subnet'),\n\t\t\t_('Append a <code>edns0-subnet</code> OPT extra record with the specified IP prefix to every query by default.<br/>' +\n\t\t\t'If value is an IP address instead of prefix, <code>/32</code> or <code>/128</code> will be appended automatically.'));\n\t\tso.datatype = 'or(cidr, ipaddr)';\n\n\t\tso = ss.option(form.Flag, 'cache_file_store_rdrc', _('Store RDRC'),\n\t\t\t_('Store rejected DNS response cache.<br/>' +\n\t\t\t'The check results of <code>Address filter DNS rule items</code> will be cached until expiration.'));\n\n\t\tso = ss.option(form.Value, 'cache_file_rdrc_timeout', _('RDRC timeout'),\n\t\t\t_('Timeout of rejected DNS response cache in seconds. <code>604800 (7d)</code> is used by default.'));\n\t\tso.datatype = 'uinteger';\n\t\tso.depends('cache_file_store_rdrc', '1');\n\t\t/* DNS settings end */\n\n\t\t/* DNS servers start */\n\t\ts.tab('dns_server', _('DNS Servers'));\n\t\to = s.taboption('dns_server', form.SectionValue, '_dns_server', form.GridSection, 'dns_server');\n\t\to.depends('routing_mode', 'custom');\n\n\t\tss = o.subsection;\n\t\tss.addremove = true;\n\t\tss.rowcolors = true;\n\t\tss.sortable = true;\n\t\tss.nodescriptions = true;\n\t\tss.modaltitle = L.bind(hp.loadModalTitle, this, _('DNS server'), _('Add a DNS server'), data[0]);\n\t\tss.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]);\n\t\tss.renderSectionAdd = L.bind(hp.renderSectionAdd, this, ss);\n\n\t\tso = ss.option(form.Value, 'label', _('Label'));\n\t\tso.load = L.bind(hp.loadDefaultLabel, this, data[0]);\n\t\tso.validate = L.bind(hp.validateUniqueValue, this, data[0], 'dns_server', 'label');\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(form.Flag, 'enabled', _('Enable'));\n\t\tso.default = so.enabled;\n\t\tso.rmempty = false;\n\t\tso.editable = true;\n\n\t\tso = ss.option(form.ListValue, 'type', _('Type'));\n\t\tso.value('udp', _('UDP'));\n\t\tso.value('tcp', _('TCP'));\n\t\tso.value('tls', _('TLS'));\n\t\tso.value('https', _('HTTPS'));\n\t\tso.value('h3', _('HTTP/3'));\n\t\tso.value('quic', _('QUIC'));\n\t\tso.default = 'udp';\n\t\tso.rmempty = false;\n\n\t\tso = ss.option(form.Value, 'server', _('Address'),\n\t\t\t_('The address of the dns server.'));\n\t\tso.datatype = 'or(hostname, ipaddr)';\n\t\tso.rmempty = false;\n\n\t\tso = ss.option(form.Value, 'server_port', _('Port'),\n\t\t\t_('The port of the DNS server.'));\n\t\tso.placeholder = 'auto';\n\t\tso.datatype = 'port';\n\n\t\tso = ss.option(form.Value, 'path', _('Path'),\n\t\t\t_('The path of the DNS server.'));\n\t\tso.placeholder = '/dns-query';\n\t\tso.depends('type', 'https');\n\t\tso.depends('type', 'h3');\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(form.DynamicList, 'headers', _('Headers'),\n\t\t\t_('Additional headers to be sent to the DNS server.'));\n\t\tso.depends('type', 'https');\n\t\tso.depends('type', 'h3');\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(form.Value, 'tls_sni', _('TLS SNI'),\n\t\t\t_('Used to verify the hostname on the returned certificates.'));\n\t\tso.depends('type', 'tls');\n\t\tso.depends('type', 'https');\n\t\tso.depends('type', 'h3');\n\t\tso.depends('type', 'quic');\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(form.ListValue, 'address_resolver', _('Address resolver'),\n\t\t\t_('Tag of a another server to resolve the domain name in the address. Required if address contains domain.'));\n\t\tso.load = function(section_id) {\n\t\t\tdelete this.keylist;\n\t\t\tdelete this.vallist;\n\n\t\t\tthis.value('', _('None'));\n\t\t\tthis.value('default-dns', _('Default DNS (issued by WAN)'));\n\t\t\tthis.value('system-dns', _('System DNS'));\n\t\t\tuci.sections(data[0], 'dns_server', (res) => {\n\t\t\t\tif (res['.name'] !== section_id && res.enabled === '1')\n\t\t\t\t\tthis.value(res['.name'], res.label);\n\t\t\t});\n\n\t\t\treturn this.super('load', section_id);\n\t\t}\n\t\tso.validate = function(section_id, value) {\n\t\t\tif (section_id && value) {\n\t\t\t\tlet conflict = false;\n\t\t\t\tuci.sections(data[0], 'dns_server', (res) => {\n\t\t\t\t\tif (res['.name'] !== section_id)\n\t\t\t\t\t\tif (res.address_resolver === section_id && res['.name'] == value)\n\t\t\t\t\t\t\tconflict = true;\n\t\t\t\t});\n\t\t\t\tif (conflict)\n\t\t\t\t\treturn _('Recursive resolver detected!');\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(form.ListValue, 'address_strategy', _('Address strategy'),\n\t\t\t_('The domain strategy for resolving the domain name in the address.'));\n\t\tfor (let i in hp.dns_strategy)\n\t\t\tso.value(i, hp.dns_strategy[i]);\n\t\tso.depends({'address_resolver': '', '!reverse': true});\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(form.ListValue, 'outbound', _('Outbound'),\n\t\t\t_('Tag of an outbound for connecting to the dns server.'));\n\t\tso.load = function(section_id) {\n\t\t\tdelete this.keylist;\n\t\t\tdelete this.vallist;\n\n\t\t\tthis.value('direct-out', _('Direct'));\n\t\t\tuci.sections(data[0], 'routing_node', (res) => {\n\t\t\t\tif (res.enabled === '1')\n\t\t\t\t\tthis.value(res['.name'], res.label);\n\t\t\t});\n\n\t\t\treturn this.super('load', section_id);\n\t\t}\n\t\tso.default = 'direct-out';\n\t\tso.rmempty = false;\n\t\tso.editable = true;\n\t\t/* DNS servers end */\n\n\t\t/* DNS rules start */\n\t\ts.tab('dns_rule', _('DNS Rules'));\n\t\to = s.taboption('dns_rule', form.SectionValue, '_dns_rule', form.GridSection, 'dns_rule');\n\t\to.depends('routing_mode', 'custom');\n\n\t\tss = o.subsection;\n\t\tss.addremove = true;\n\t\tss.rowcolors = true;\n\t\tss.sortable = true;\n\t\tss.nodescriptions = true;\n\t\tss.modaltitle = L.bind(hp.loadModalTitle, this, _('DNS rule'), _('Add a DNS rule'), data[0]);\n\t\tss.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]);\n\t\tss.renderSectionAdd = L.bind(hp.renderSectionAdd, this, ss);\n\n\t\tss.tab('field_other', _('Other fields'));\n\t\tss.tab('field_host', _('Host/IP fields'));\n\t\tss.tab('field_port', _('Port fields'));\n\t\tss.tab('fields_process', _('Process fields'));\n\n\t\tso = ss.taboption('field_other', form.Value, 'label', _('Label'));\n\t\tso.load = L.bind(hp.loadDefaultLabel, this, data[0]);\n\t\tso.validate = L.bind(hp.validateUniqueValue, this, data[0], 'dns_rule', 'label');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Flag, 'enabled', _('Enable'));\n\t\tso.default = so.enabled;\n\t\tso.rmempty = false;\n\t\tso.editable = true;\n\n\t\tso = ss.taboption('field_other', form.ListValue, 'mode', _('Mode'),\n\t\t\t_('The default rule uses the following matching logic:<br/>' +\n\t\t\t'<code>(domain || domain_suffix || domain_keyword || domain_regex)</code> &&<br/>' +\n\t\t\t'<code>(port || port_range)</code> &&<br/>' +\n\t\t\t'<code>(source_ip_cidr || source_ip_is_private)</code> &&<br/>' +\n\t\t\t'<code>(source_port || source_port_range)</code> &&<br/>' +\n\t\t\t'<code>other fields</code>.<br/>' +\n\t\t\t'Additionally, included rule sets can be considered merged rather than as a single rule sub-item.'));\n\t\tso.value('default', _('Default'));\n\t\tso.default = 'default';\n\t\tso.rmempty = false;\n\t\tso.readonly = true;\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.ListValue, 'ip_version', _('IP version'));\n\t\tso.value('4', _('IPv4'));\n\t\tso.value('6', _('IPv6'));\n\t\tso.value('', _('Both'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.DynamicList, 'query_type', _('Query type'),\n\t\t\t_('Match query type.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.ListValue, 'network', _('Network'));\n\t\tso.value('tcp', _('TCP'));\n\t\tso.value('udp', _('UDP'));\n\t\tso.value('', _('Both'));\n\n\t\tso = ss.taboption('field_other', form.MultiValue, 'protocol', _('Protocol'),\n\t\t\t_('Sniffed protocol, see <a target=\"_blank\" href=\"https://sing-box.sagernet.org/configuration/route/sniff/\">Sniff</a> for details.'));\n\t\tso.value('bittorrent', _('BitTorrent'));\n\t\tso.value('dtls', _('DTLS'));\n\t\tso.value('http', _('HTTP'));\n\t\tso.value('quic', _('QUIC'));\n\t\tso.value('rdp', _('RDP'));\n\t\tso.value('ssh', _('SSH'));\n\t\tso.value('stun', _('STUN'));\n\t\tso.value('tls', _('TLS'));\n\n\t\tso = ss.taboption('field_other', form.DynamicList, 'user', _('User'),\n\t\t\t_('Match user name.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', hp.CBIStaticList, 'rule_set', _('Rule set'),\n\t\t\t_('Match rule set.'));\n\t\tso.load = function(section_id) {\n\t\t\tdelete this.keylist;\n\t\t\tdelete this.vallist;\n\n\t\t\tuci.sections(data[0], 'ruleset', (res) => {\n\t\t\t\tif (res.enabled === '1')\n\t\t\t\t\tthis.value(res['.name'], res.label);\n\t\t\t});\n\n\t\t\treturn this.super('load', section_id);\n\t\t}\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Flag, 'rule_set_ip_cidr_match_source', _('Rule set IP CIDR as source IP'),\n\t\t\t_('Make IP CIDR in rule sets match the source IP.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Flag, 'rule_set_ip_cidr_accept_empty', _('Accept empty query response'),\n\t\t\t_('Make IP CIDR in rule-sets accept empty query response.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Flag, 'invert', _('Invert'),\n\t\t\t_('Invert match result.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.ListValue, 'action', _('Action'));\n\t\tso.value('route', _('Route'));\n\t\tso.value('route-options', _('Route options'));\n\t\tso.value('reject', _('Reject'));\n\t\tso.value('predefined', _('Predefined'));\n\t\tso.default = 'route';\n\t\tso.rmempty = false;\n\t\tso.editable = true;\n\n\t\tso = ss.taboption('field_other', form.ListValue, 'server', _('Server'),\n\t\t\t_('Tag of the target dns server.'));\n\t\tso.load = function(section_id) {\n\t\t\tdelete this.keylist;\n\t\t\tdelete this.vallist;\n\n\t\t\tthis.value('default-dns', _('Default DNS (issued by WAN)'));\n\t\t\tthis.value('system-dns', _('System DNS'));\n\t\t\tuci.sections(data[0], 'dns_server', (res) => {\n\t\t\t\tif (res.enabled === '1')\n\t\t\t\t\tthis.value(res['.name'], res.label);\n\t\t\t});\n\n\t\t\treturn this.super('load', section_id);\n\t\t}\n\t\tso.rmempty = false;\n\t\tso.editable = true;\n\t\tso.depends('action', 'route');\n\n\t\tso = ss.taboption('field_other', form.ListValue, 'domain_strategy', _('Domain strategy'),\n\t\t\t_('Set domain strategy for this query.'));\n\t\tfor (let i in hp.dns_strategy)\n\t\t\tso.value(i, hp.dns_strategy[i]);\n\t\tso.depends('action', 'route');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Flag, 'dns_disable_cache', _('Disable dns cache'),\n\t\t\t_('Disable cache and save cache in this query.'));\n\t\tso.depends('action', 'route');\n\t\tso.depends('action', 'route-options');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Value, 'rewrite_ttl', _('Rewrite TTL'),\n\t\t\t_('Rewrite TTL in DNS responses.'));\n\t\tso.datatype = 'uinteger';\n\t\tso.depends('action', 'route');\n\t\tso.depends('action', 'route-options');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Value, 'client_subnet', _('EDNS Client subnet'),\n\t\t\t_('Append a <code>edns0-subnet</code> OPT extra record with the specified IP prefix to every query by default.<br/>' +\n\t\t\t'If value is an IP address instead of prefix, <code>/32</code> or <code>/128</code> will be appended automatically.'));\n\t\tso.datatype = 'or(cidr, ipaddr)';\n\t\tso.depends('action', 'route');\n\t\tso.depends('action', 'route-options');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.ListValue, 'reject_method', _('Method'));\n\t\tso.value('default', _('Reply with REFUSED'));\n\t\tso.value('drop', _('Drop requests'));\n\t\tso.default = 'default';\n\t\tso.depends('action', 'reject');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.Flag, 'reject_no_drop', _('Don\\'t drop requests'),\n\t\t\t_('<code>%s</code> will be temporarily overwritten to <code>%s</code> after 50 triggers in 30s if not enabled.').format(\n\t\t\t\t_('Method'), _('Drop requests')));\n\t\tso.depends('reject_method', 'default');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.ListValue, 'predefined_rcode', _('RCode'),\n\t\t\t_('The response code.'));\n\t\tso.value('NOERROR');\n\t\tso.value('FORMERR');\n\t\tso.value('SERVFAIL');\n\t\tso.value('NXDOMAIN');\n\t\tso.value('NOTIMP');\n\t\tso.value('REFUSED');\n\t\tso.default = 'NOERROR';\n\t\tso.depends('action', 'predefined');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.DynamicList, 'predefined_answer', _('Answer'),\n\t\t\t_('List of text DNS record to respond as answers.'));\n\t\tso.depends('action', 'predefined');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.DynamicList, 'predefined_ns', _('NS'),\n\t\t\t_('List of text DNS record to respond as name servers.'));\n\t\tso.depends('action', 'predefined');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_other', form.DynamicList, 'predefined_extra', _('Extra records'),\n\t\t\t_('List of text DNS record to respond as extra records.'));\n\t\tso.depends('action', 'predefined');\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_host', form.DynamicList, 'domain', _('Domain name'),\n\t\t\t_('Match full domain.'));\n\t\tso.datatype = 'hostname';\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_host', form.DynamicList, 'domain_suffix', _('Domain suffix'),\n\t\t\t_('Match domain suffix.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_host', form.DynamicList, 'domain_keyword', _('Domain keyword'),\n\t\t\t_('Match domain using keyword.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_host', form.DynamicList, 'domain_regex', _('Domain regex'),\n\t\t\t_('Match domain using regular expression.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_host', form.DynamicList, 'source_ip_cidr', _('Source IP CIDR'),\n\t\t\t_('Match source IP CIDR.'));\n\t\tso.datatype = 'or(cidr, ipaddr)';\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_host', form.Flag, 'source_ip_is_private', _('Match private source IP'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_host', form.DynamicList, 'ip_cidr', _('IP CIDR'),\n\t\t\t_('Match IP CIDR with query response. Current rule will be skipped if not match.'));\n\t\tso.datatype = 'or(cidr, ipaddr)';\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_host', form.Flag, 'ip_is_private', _('Match private IP'),\n\t\t\t_('Match private IP with query response.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_port', form.DynamicList, 'source_port', _('Source port'),\n\t\t\t_('Match source port.'));\n\t\tso.datatype = 'port';\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_port', form.DynamicList, 'source_port_range', _('Source port range'),\n\t\t\t_('Match source port range. Format as START:/:END/START:END.'));\n\t\tso.validate = hp.validatePortRange;\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_port', form.DynamicList, 'port', _('Port'),\n\t\t\t_('Match port.'));\n\t\tso.datatype = 'port';\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('field_port', form.DynamicList, 'port_range', _('Port range'),\n\t\t\t_('Match port range. Format as START:/:END/START:END.'));\n\t\tso.validate = hp.validatePortRange;\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('fields_process', form.DynamicList, 'process_name', _('Process name'),\n\t\t\t_('Match process name.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('fields_process', form.DynamicList, 'process_path', _('Process path'),\n\t\t\t_('Match process path.'));\n\t\tso.modalonly = true;\n\n\t\tso = ss.taboption('fields_process', form.DynamicList, 'process_path_regex', _('Process path (regex)'),\n\t\t\t_('Match process path using regular expression.'));\n\t\tso.modalonly = true;\n\t\t/* DNS rules end */\n\t\t/* Custom routing settings end */\n\n\t\t/* Rule set settings start */\n\t\ts.tab('ruleset', _('Rule Set'));\n\t\to = s.taboption('ruleset', form.SectionValue, '_ruleset', form.GridSection, 'ruleset');\n\t\to.depends('routing_mode', 'custom');\n\n\t\tss = o.subsection;\n\t\tss.addremove = true;\n\t\tss.rowcolors = true;\n\t\tss.sortable = true;\n\t\tss.nodescriptions = true;\n\t\tss.modaltitle = L.bind(hp.loadModalTitle, this, _('Rule set'), _('Add a rule set'), data[0]);\n\t\tss.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]);\n\t\tss.renderSectionAdd = L.bind(hp.renderSectionAdd, this, ss);\n\n\t\tso = ss.option(form.Value, 'label', _('Label'));\n\t\tso.load = L.bind(hp.loadDefaultLabel, this, data[0]);\n\t\tso.validate = L.bind(hp.validateUniqueValue, this, data[0], 'ruleset', 'label');\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(form.Flag, 'enabled', _('Enable'));\n\t\tso.default = so.enabled;\n\t\tso.rmempty = false;\n\t\tso.editable = true;\n\n\t\tso = ss.option(form.ListValue, 'type', _('Type'));\n\t\tso.value('local', _('Local'));\n\t\tso.value('remote', _('Remote'));\n\t\tso.default = 'remote';\n\t\tso.rmempty = false;\n\n\t\tso = ss.option(form.ListValue, 'format', _('Format'));\n\t\tso.value('binary', _('Binary file'));\n\t\tso.value('source', _('Source file'));\n\t\tso.default = 'binary';\n\t\tso.rmempty = false;\n\n\t\tso = ss.option(form.Value, 'path', _('Path'));\n\t\tso.datatype = 'file';\n\t\tso.placeholder = '/etc/homeproxy/ruleset/example.json';\n\t\tso.rmempty = false;\n\t\tso.depends('type', 'local');\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(form.Value, 'url', _('Rule set URL'));\n\t\tso.validate = function(section_id, value) {\n\t\t\tif (section_id) {\n\t\t\t\tif (!value)\n\t\t\t\t\treturn _('Expecting: %s').format(_('non-empty value'));\n\n\t\t\t\ttry {\n\t\t\t\t\tlet url = new URL(value);\n\t\t\t\t\tif (!url.hostname)\n\t\t\t\t\t\treturn _('Expecting: %s').format(_('valid URL'));\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\treturn _('Expecting: %s').format(_('valid URL'));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t\tso.rmempty = false;\n\t\tso.depends('type', 'remote');\n\t\tso.modalonly = true;\n\n\t\tso = ss.option(form.ListValue, 'outbound', _('Outbound'),\n\t\t\t_('Tag of the outbound to download rule set.'));\n\t\tso.load = function(section_id) {\n\t\t\tdelete this.keylist;\n\t\t\tdelete this.vallist;\n\n\t\t\tthis.value('', _('Default'));\n\t\t\tthis.value('direct-out', _('Direct'));\n\t\t\tuci.sections(data[0], 'routing_node', (res) => {\n\t\t\t\tif (res.enabled === '1')\n\t\t\t\t\tthis.value(res['.name'], res.label);\n\t\t\t});\n\n\t\t\treturn this.super('load', section_id);\n\t\t}\n\t\tso.depends('type', 'remote');\n\n\t\tso = ss.option(form.Value, 'update_interval', _('Update interval'),\n\t\t\t_('Update interval of rule set.'));\n\t\tso.placeholder = '1d';\n\t\tso.depends('type', 'remote');\n\t\t/* Rule set settings end */\n\n\t\t/* ACL settings start */\n\t\ts.tab('control', _('Access Control'));\n\n\t\to = s.taboption('control', form.SectionValue, '_control', form.NamedSection, 'control', 'homeproxy');\n\t\tss = o.subsection;\n\n\t\t/* Interface control start */\n\t\tss.tab('interface', _('Interface Control'));\n\n\t\tso = ss.taboption('interface', widgets.DeviceSelect, 'listen_interfaces', _('Listen interfaces'),\n\t\t\t_('Only process traffic from specific interfaces. Leave empty for all.'));\n\t\tso.multiple = true;\n\t\tso.noaliases = true;\n\n\t\tso = ss.taboption('interface', widgets.DeviceSelect, 'bind_interface', _('Bind interface'),\n\t\t\t_('Bind outbound traffic to specific interface. Leave empty to auto detect.'));\n\t\tso.multiple = false;\n\t\tso.noaliases = true;\n\t\t/* Interface control end */\n\n\t\t/* LAN IP policy start */\n\t\tss.tab('lan_ip_policy', _('LAN IP Policy'));\n\n\t\tso = ss.taboption('lan_ip_policy', form.ListValue, 'lan_proxy_mode', _('Proxy filter mode'));\n\t\tso.value('disabled', _('Disable'));\n\t\tso.value('listed_only', _('Proxy listed only'));\n\t\tso.value('except_listed', _('Proxy all except listed'));\n\t\tso.default = 'disabled';\n\t\tso.rmempty = false;\n\n\t\tso = fwtool.addIPOption(ss, 'lan_ip_policy', 'lan_direct_ipv4_ips', _('Direct IPv4 IP-s'), null, 'ipv4', hosts, true);\n\t\tso.depends('lan_proxy_mode', 'except_listed');\n\n\t\tso = fwtool.addIPOption(ss, 'lan_ip_policy', 'lan_direct_ipv6_ips', _('Direct IPv6 IP-s'), null, 'ipv6', hosts, true);\n\t\tso.depends({'lan_proxy_mode': 'except_listed', 'homeproxy.config.ipv6_support': '1'});\n\n\t\tso = fwtool.addMACOption(ss, 'lan_ip_policy', 'lan_direct_mac_addrs', _('Direct MAC-s'), null, hosts);\n\t\tso.depends('lan_proxy_mode', 'except_listed');\n\n\t\tso = fwtool.addIPOption(ss, 'lan_ip_policy', 'lan_proxy_ipv4_ips', _('Proxy IPv4 IP-s'), null, 'ipv4', hosts, true);\n\t\tso.depends('lan_proxy_mode', 'listed_only');\n\n\t\tso = fwtool.addIPOption(ss, 'lan_ip_policy', 'lan_proxy_ipv6_ips', _('Proxy IPv6 IP-s'), null, 'ipv6', hosts, true);\n\t\tso.depends({'lan_proxy_mode': 'listed_only', 'homeproxy.config.ipv6_support': '1'});\n\n\t\tso = fwtool.addMACOption(ss, 'lan_ip_policy', 'lan_proxy_mac_addrs', _('Proxy MAC-s'), null, hosts);\n\t\tso.depends('lan_proxy_mode', 'listed_only');\n\n\t\tso = fwtool.addIPOption(ss, 'lan_ip_policy', 'lan_gaming_mode_ipv4_ips', _('Gaming mode IPv4 IP-s'), null, 'ipv4', hosts, true);\n\n\t\tso = fwtool.addIPOption(ss, 'lan_ip_policy', 'lan_gaming_mode_ipv6_ips', _('Gaming mode IPv6 IP-s'), null, 'ipv6', hosts, true);\n\t\tso.depends('homeproxy.config.ipv6_support', '1');\n\n\t\tso = fwtool.addMACOption(ss, 'lan_ip_policy', 'lan_gaming_mode_mac_addrs', _('Gaming mode MAC-s'), null, hosts);\n\n\t\tso = fwtool.addIPOption(ss, 'lan_ip_policy', 'lan_global_proxy_ipv4_ips', _('Global proxy IPv4 IP-s'), null, 'ipv4', hosts, true);\n\t\tso.depends({'homeproxy.config.routing_mode': 'custom', '!reverse': true});\n\n\t\tso = fwtool.addIPOption(ss, 'lan_ip_policy', 'lan_global_proxy_ipv6_ips', _('Global proxy IPv6 IP-s'), null, 'ipv6', hosts, true);\n\t\tso.depends({'homeproxy.config.routing_mode': /^((?!custom).)+$/, 'homeproxy.config.ipv6_support': '1'});\n\n\t\tso = fwtool.addMACOption(ss, 'lan_ip_policy', 'lan_global_proxy_mac_addrs', _('Global proxy MAC-s'), null, hosts);\n\t\tso.depends({'homeproxy.config.routing_mode': 'custom', '!reverse': true});\n\t\t/* LAN IP policy end */\n\n\t\t/* WAN IP policy start */\n\t\tss.tab('wan_ip_policy', _('WAN IP Policy'));\n\n\t\tso = ss.taboption('wan_ip_policy', form.DynamicList, 'wan_proxy_ipv4_ips', _('Proxy IPv4 IP-s'));\n\t\tso.datatype = 'or(ip4addr, cidr4)';\n\n\t\tso = ss.taboption('wan_ip_policy', form.DynamicList, 'wan_proxy_ipv6_ips', _('Proxy IPv6 IP-s'));\n\t\tso.datatype = 'or(ip6addr, cidr6)';\n\t\tso.depends('homeproxy.config.ipv6_support', '1');\n\n\t\tso = ss.taboption('wan_ip_policy', form.DynamicList, 'wan_direct_ipv4_ips', _('Direct IPv4 IP-s'));\n\t\tso.datatype = 'or(ip4addr, cidr4)';\n\n\t\tso = ss.taboption('wan_ip_policy', form.DynamicList, 'wan_direct_ipv6_ips', _('Direct IPv6 IP-s'));\n\t\tso.datatype = 'or(ip6addr, cidr6)';\n\t\tso.depends('homeproxy.config.ipv6_support', '1');\n\t\t/* WAN IP policy end */\n\n\t\t/* Proxy domain list start */\n\t\tss.tab('proxy_domain_list', _('Proxy Domain List'));\n\n\t\tso = ss.taboption('proxy_domain_list', form.TextValue, '_proxy_domain_list');\n\t\tso.rows = 10;\n\t\tso.monospace = true;\n\t\tso.datatype = 'hostname';\n\t\tso.depends({'homeproxy.config.routing_mode': 'custom', '!reverse': true});\n\t\tso.load = function(/* ... */) {\n\t\t\treturn L.resolveDefault(callReadDomainList('proxy_list')).then((res) => {\n\t\t\t\treturn res.content;\n\t\t\t}, {});\n\t\t}\n\t\tso.write = function(_section_id, value) {\n\t\t\treturn callWriteDomainList('proxy_list', value);\n\t\t}\n\t\tso.remove = function(/* ... */) {\n\t\t\tlet routing_mode = this.section.formvalue('config', 'routing_mode');\n\t\t\tif (routing_mode !== 'custom')\n\t\t\t\treturn callWriteDomainList('proxy_list', '');\n\t\t\treturn true;\n\t\t}\n\t\tso.validate = function(section_id, value) {\n\t\t\tif (section_id && value)\n\t\t\t\tfor (let i of value.split('\\n'))\n\t\t\t\t\tif (i && !stubValidator.apply('hostname', i))\n\t\t\t\t\t\treturn _('Expecting: %s').format(_('valid hostname'));\n\n\t\t\treturn true;\n\t\t}\n\t\t/* Proxy domain list end */\n\n\t\t/* Direct domain list start */\n\t\tss.tab('direct_domain_list', _('Direct Domain List'));\n\n\t\tso = ss.taboption('direct_domain_list', form.TextValue, '_direct_domain_list');\n\t\tso.rows = 10;\n\t\tso.monospace = true;\n\t\tso.datatype = 'hostname';\n\t\tso.depends({'homeproxy.config.routing_mode': 'custom', '!reverse': true});\n\t\tso.load = function(/* ... */) {\n\t\t\treturn L.resolveDefault(callReadDomainList('direct_list')).then((res) => {\n\t\t\t\treturn res.content;\n\t\t\t}, {});\n\t\t}\n\t\tso.write = function(_section_id, value) {\n\t\t\treturn callWriteDomainList('direct_list', value);\n\t\t}\n\t\tso.remove = function(/* ... */) {\n\t\t\tlet routing_mode = this.section.formvalue('config', 'routing_mode');\n\t\t\tif (routing_mode !== 'custom')\n\t\t\t\treturn callWriteDomainList('direct_list', '');\n\t\t\treturn true;\n\t\t}\n\t\tso.validate = function(section_id, value) {\n\t\t\tif (section_id && value)\n\t\t\t\tfor (let i of value.split('\\n'))\n\t\t\t\t\tif (i && !stubValidator.apply('hostname', i))\n\t\t\t\t\t\treturn _('Expecting: %s').format(_('valid hostname'));\n\n\t\t\treturn true;\n\t\t}\n\t\t/* Direct domain list end */\n\t\t/* ACL settings end */\n\n\t\treturn m.render();\n\t}\n});\n"
  },
  {
    "path": "luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/node.js",
    "content": "/*\n * SPDX-License-Identifier: GPL-2.0-only\n *\n * Copyright (C) 2022-2025 ImmortalWrt.org\n */\n\n'use strict';\n'require form';\n'require fs';\n'require uci';\n'require ui';\n'require view';\n\n'require homeproxy as hp';\n'require tools.widgets as widgets';\n\nfunction allowInsecureConfirm(ev, _section_id, value) {\n\tif (value === '1' && !confirm(_('Are you sure to allow insecure?')))\n\t\tev.target.firstElementChild.checked = null;\n}\n\nfunction parseShareLink(uri, features) {\n\tlet config, url, params;\n\n\turi = uri.split('://');\n\tif (uri[0] && uri[1]) {\n\t\tswitch (uri[0]) {\n\t\tcase 'anytls':\n\t\t\t/* https://github.com/anytls/anytls-go/blob/v0.0.8/docs/uri_scheme.md */\n\t\t\turl = new URL('http://' + uri[1]);\n\t\t\tparams = url.searchParams;\n\n\t\t\t/* Check if password exists */\n\t\t\tif (!url.username)\n\t\t\t\treturn null;\n\n\t\t\tconfig = {\n\t\t\t\tlabel: url.hash ? decodeURIComponent(url.hash.slice(1)) : null,\n\t\t\t\ttype: 'anytls',\n\t\t\t\taddress: url.hostname,\n\t\t\t\tport: url.port || '80',\n\t\t\t\tpassword: url.username ? decodeURIComponent(url.username) : null,\n\t\t\t\ttls: '1',\n\t\t\t\ttls_sni: params.get('sni'),\n\t\t\t\ttls_insecure: (params.get('insecure') === '1') ? '1' : '0'\n\t\t\t};\n\n\t\t\tbreak;\n\t\tcase 'http':\n\t\tcase 'https':\n\t\t\turl = new URL('http://' + uri[1]);\n\n\t\t\tconfig = {\n\t\t\t\tlabel: url.hash ? decodeURIComponent(url.hash.slice(1)) : null,\n\t\t\t\ttype: 'http',\n\t\t\t\taddress: url.hostname,\n\t\t\t\tport: url.port || '80',\n\t\t\t\tusername: url.username ? decodeURIComponent(url.username) : null,\n\t\t\t\tpassword: url.password ? decodeURIComponent(url.password) : null,\n\t\t\t\ttls: (uri[0] === 'https') ? '1' : '0'\n\t\t\t};\n\n\t\t\tbreak;\n\t\tcase 'hysteria':\n\t\t\t/* https://github.com/HyNetwork/hysteria/wiki/URI-Scheme */\n\t\t\turl = new URL('http://' + uri[1]);\n\t\t\tparams = url.searchParams;\n\n\t\t\t/* WeChat-Video / FakeTCP are unsupported by sing-box currently */\n\t\t\tif (!features.with_quic || (params.get('protocol') && params.get('protocol') !== 'udp'))\n\t\t\t\treturn null;\n\n\t\t\tconfig = {\n\t\t\t\tlabel: url.hash ? decodeURIComponent(url.hash.slice(1)) : null,\n\t\t\t\ttype: 'hysteria',\n\t\t\t\taddress: url.hostname,\n\t\t\t\tport: url.port || '80',\n\t\t\t\thysteria_protocol: params.get('protocol') || 'udp',\n\t\t\t\thysteria_auth_type: params.get('auth') ? 'string' : null,\n\t\t\t\thysteria_auth_payload: params.get('auth'),\n\t\t\t\thysteria_obfs_password: params.get('obfsParam'),\n\t\t\t\thysteria_down_mbps: params.get('downmbps'),\n\t\t\t\thysteria_up_mbps: params.get('upmbps'),\n\t\t\t\ttls: '1',\n\t\t\t\ttls_sni: params.get('peer'),\n\t\t\t\ttls_alpn: params.get('alpn'),\n\t\t\t\ttls_insecure: (params.get('insecure') === '1') ? '1' : '0'\n\t\t\t};\n\n\t\t\tbreak;\n\t\tcase 'hysteria2':\n\t\tcase 'hy2':\n\t\t\t/* https://v2.hysteria.network/docs/developers/URI-Scheme/ */\n\t\t\turl = new URL('http://' + uri[1]);\n\t\t\tparams = url.searchParams;\n\n\t\t\tif (!features.with_quic)\n\t\t\t\treturn null;\n\n\t\t\tconfig = {\n\t\t\t\tlabel: url.hash ? decodeURIComponent(url.hash.slice(1)) : null,\n\t\t\t\ttype: 'hysteria2',\n\t\t\t\taddress: url.hostname,\n\t\t\t\tport: url.port || '80',\n\t\t\t\tpassword: url.username ? (\n\t\t\t\t\tdecodeURIComponent(url.username + (url.password ? (':' + url.password) : ''))\n\t\t\t\t) : null,\n\t\t\t\thysteria_obfs_type: params.get('obfs'),\n\t\t\t\thysteria_obfs_password: params.get('obfs-password'),\n\t\t\t\ttls: '1',\n\t\t\t\ttls_sni: params.get('sni'),\n\t\t\t\ttls_insecure: params.get('insecure') ? '1' : '0'\n\t\t\t};\n\n\t\t\tbreak;\n\t\tcase 'socks':\n\t\tcase 'socks4':\n\t\tcase 'socks4a':\n\t\tcase 'socsk5':\n\t\tcase 'socks5h':\n\t\t\turl = new URL('http://' + uri[1]);\n\n\t\t\tconfig = {\n\t\t\t\tlabel: url.hash ? decodeURIComponent(url.hash.slice(1)) : null,\n\t\t\t\ttype: 'socks',\n\t\t\t\taddress: url.hostname,\n\t\t\t\tport: url.port || '80',\n\t\t\t\tusername: url.username ? decodeURIComponent(url.username) : null,\n\t\t\t\tpassword: url.password ? decodeURIComponent(url.password) : null,\n\t\t\t\tsocks_version: (uri[0].includes('4')) ? '4' : '5'\n\t\t\t};\n\n\t\t\tbreak;\n\t\tcase 'ss':\n\t\t\ttry {\n\t\t\t\t/* \"Lovely\" Shadowrocket format */\n\t\t\t\ttry {\n\t\t\t\t\tlet suri = uri[1].split('#'), slabel = '';\n\t\t\t\t\tif (suri.length <= 2) {\n\t\t\t\t\t\tif (suri.length === 2)\n\t\t\t\t\t\t\tslabel = '#' + suri[1];\n\t\t\t\t\t\turi[1] = hp.decodeBase64Str(suri[0]) + slabel;\n\t\t\t\t\t}\n\t\t\t\t} catch(e) { }\n\n\t\t\t\t/* SIP002 format https://shadowsocks.org/guide/sip002.html */\n\t\t\t\turl = new URL('http://' + uri[1]);\n\n\t\t\t\tlet userinfo;\n\t\t\t\tif (url.username && url.password) {\n\t\t\t\t\t/* User info encoded with URIComponent */\n\t\t\t\t\tuserinfo = [url.username, decodeURIComponent(url.password)];\n\t\t\t\t} else if (url.username) {\n\t\t\t\t\t/* User info encoded with base64 */\n\t\t\t\t\tuserinfo = hp.decodeBase64Str(decodeURIComponent(url.username)).split(':');\n\t\t\t\t\tif (userinfo.length > 1)\n\t\t\t\t\t\tuserinfo = [userinfo[0], userinfo.slice(1).join(':')]\n\t\t\t\t}\n\n\t\t\t\tif (!hp.shadowsocks_encrypt_methods.includes(userinfo[0]))\n\t\t\t\t\treturn null;\n\n\t\t\t\tlet plugin, plugin_opts;\n\t\t\t\tif (url.search && url.searchParams.get('plugin')) {\n\t\t\t\t\tlet plugin_info = url.searchParams.get('plugin').split(';');\n\t\t\t\t\tplugin = plugin_info[0];\n\t\t\t\t\tplugin_opts = (plugin_info.length > 1) ? plugin_info.slice(1).join(';') : null;\n\t\t\t\t}\n\n\t\t\t\tconfig = {\n\t\t\t\t\tlabel: url.hash ? decodeURIComponent(url.hash.slice(1)) : null,\n\t\t\t\t\ttype: 'shadowsocks',\n\t\t\t\t\taddress: url.hostname,\n\t\t\t\t\tport: url.port || '80',\n\t\t\t\t\tshadowsocks_encrypt_method: userinfo[0],\n\t\t\t\t\tpassword: userinfo[1],\n\t\t\t\t\tshadowsocks_plugin: plugin,\n\t\t\t\t\tshadowsocks_plugin_opts: plugin_opts\n\t\t\t\t};\n\t\t\t} catch(e) {\n\t\t\t\t/* Legacy format https://github.com/shadowsocks/shadowsocks-org/commit/78ca46cd6859a4e9475953ed34a2d301454f579e */\n\t\t\t\turi = uri[1].split('@');\n\t\t\t\tif (uri.length < 2)\n\t\t\t\t\treturn null;\n\t\t\t\telse if (uri.length > 2)\n\t\t\t\t\turi = [ uri.slice(0, -1).join('@'), uri.slice(-1).toString() ];\n\n\t\t\t\tconfig = {\n\t\t\t\t\ttype: 'shadowsocks',\n\t\t\t\t\taddress: uri[1].split(':')[0],\n\t\t\t\t\tport: uri[1].split(':')[1],\n\t\t\t\t\tshadowsocks_encrypt_method: uri[0].split(':')[0],\n\t\t\t\t\tpassword: uri[0].split(':').slice(1).join(':')\n\t\t\t\t};\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'trojan':\n\t\t\t/* https://p4gefau1t.github.io/trojan-go/developer/url/ */\n\t\t\turl = new URL('http://' + uri[1]);\n\t\t\tparams = url.searchParams;\n\n\t\t\t/* Check if password exists */\n\t\t\tif (!url.username)\n\t\t\t\treturn null;\n\n\t\t\tconfig = {\n\t\t\t\tlabel: url.hash ? decodeURIComponent(url.hash.slice(1)) : null,\n\t\t\t\ttype: 'trojan',\n\t\t\t\taddress: url.hostname,\n\t\t\t\tport: url.port || '80',\n\t\t\t\tpassword: decodeURIComponent(url.username),\n\t\t\t\ttransport: params.get('type') !== 'tcp' ? params.get('type') : null,\n\t\t\t\ttls: '1',\n\t\t\t\ttls_sni: params.get('sni')\n\t\t\t};\n\t\t\tswitch (params.get('type')) {\n\t\t\tcase 'grpc':\n\t\t\t\tconfig.grpc_servicename = params.get('serviceName');\n\t\t\t\tbreak;\n\t\t\tcase 'ws':\n\t\t\t\tconfig.ws_host = params.get('host') ? decodeURIComponent(params.get('host')) : null;\n\t\t\t\tconfig.ws_path = params.get('path') ? decodeURIComponent(params.get('path')) : null;\n\t\t\t\tif (config.ws_path && config.ws_path.includes('?ed=')) {\n\t\t\t\t\tconfig.websocket_early_data_header = 'Sec-WebSocket-Protocol';\n\t\t\t\t\tconfig.websocket_early_data = config.ws_path.split('?ed=')[1];\n\t\t\t\t\tconfig.ws_path = config.ws_path.split('?ed=')[0];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'tuic':\n\t\t\t/* https://github.com/daeuniverse/dae/discussions/182 */\n\t\t\turl = new URL('http://' + uri[1]);\n\t\t\tparams = url.searchParams;\n\n\t\t\t/* Check if uuid exists */\n\t\t\tif (!url.username)\n\t\t\t\treturn null;\n\n\t\t\tconfig = {\n\t\t\t\tlabel: url.hash ? decodeURIComponent(url.hash.slice(1)) : null,\n\t\t\t\ttype: 'tuic',\n\t\t\t\taddress: url.hostname,\n\t\t\t\tport: url.port || '80',\n\t\t\t\tuuid: url.username,\n\t\t\t\tpassword: url.password ? decodeURIComponent(url.password) : null,\n\t\t\t\ttuic_congestion_control: params.get('congestion_control'),\n\t\t\t\ttuic_udp_relay_mode: params.get('udp_relay_mode'),\n\t\t\t\ttls: '1',\n\t\t\t\ttls_sni: params.get('sni'),\n\t\t\t\ttls_alpn: params.get('alpn') ? decodeURIComponent(params.get('alpn')).split(',') : null\n\t\t\t};\n\n\t\t\tbreak;\n\t\tcase 'vless':\n\t\t\t/* https://github.com/XTLS/Xray-core/discussions/716 */\n\t\t\turl = new URL('http://' + uri[1]);\n\t\t\tparams = url.searchParams;\n\n\t\t\t/* Unsupported protocol */\n\t\t\tif (params.get('type') === 'kcp')\n\t\t\t\treturn null;\n\t\t\telse if (params.get('type') === 'quic' && ((params.get('quicSecurity') && params.get('quicSecurity') !== 'none') || !features.with_quic))\n\t\t\t\treturn null;\n\t\t\t/* Check if uuid and type exist */\n\t\t\tif (!url.username || !params.get('type'))\n\t\t\t\treturn null;\n\n\t\t\tconfig = {\n\t\t\t\tlabel: url.hash ? decodeURIComponent(url.hash.slice(1)) : null,\n\t\t\t\ttype: 'vless',\n\t\t\t\taddress: url.hostname,\n\t\t\t\tport: url.port || '80',\n\t\t\t\tuuid: url.username,\n\t\t\t\ttransport: params.get('type') !== 'tcp' ? params.get('type') : null,\n\t\t\t\ttls: ['tls', 'xtls', 'reality'].includes(params.get('security')) ? '1' : '0',\n\t\t\t\ttls_sni: params.get('sni'),\n\t\t\t\ttls_alpn: params.get('alpn') ? decodeURIComponent(params.get('alpn')).split(',') : null,\n\t\t\t\ttls_reality: (params.get('security') === 'reality') ? '1' : '0',\n\t\t\t\ttls_reality_public_key: params.get('pbk') ? decodeURIComponent(params.get('pbk')) : null,\n\t\t\t\ttls_reality_short_id: params.get('sid'),\n\t\t\t\ttls_utls: features.with_utls ? params.get('fp') : null,\n\t\t\t\tvless_flow: ['tls', 'reality'].includes(params.get('security')) ? params.get('flow') : null\n\t\t\t};\n\t\t\tswitch (params.get('type')) {\n\t\t\tcase 'grpc':\n\t\t\t\tconfig.grpc_servicename = params.get('serviceName');\n\t\t\t\tbreak;\n\t\t\tcase 'http':\n\t\t\tcase 'tcp':\n\t\t\t\tif (config.transport === 'http' || params.get('headerType') === 'http') {\n\t\t\t\t\tconfig.http_host = params.get('host') ? decodeURIComponent(params.get('host')).split(',') : null;\n\t\t\t\t\tconfig.http_path = params.get('path') ? decodeURIComponent(params.get('path')) : null;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'httpupgrade':\n\t\t\t\tconfig.httpupgrade_host = params.get('host') ? decodeURIComponent(params.get('host')) : null;\n\t\t\t\tconfig.http_path = params.get('path') ? decodeURIComponent(params.get('path')) : null;\n\t\t\t\tbreak;\n\t\t\tcase 'ws':\n\t\t\t\tconfig.ws_host = params.get('host') ? decodeURIComponent(params.get('host')) : null;\n\t\t\t\tconfig.ws_path = params.get('path') ? decodeURIComponent(params.get('path')) : null;\n\t\t\t\tif (config.ws_path && config.ws_path.includes('?ed=')) {\n\t\t\t\t\tconfig.websocket_early_data_header = 'Sec-WebSocket-Protocol';\n\t\t\t\t\tconfig.websocket_early_data = config.ws_path.split('?ed=')[1];\n\t\t\t\t\tconfig.ws_path = config.ws_path.split('?ed=')[0];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'vmess':\n\t\t\t/* \"Lovely\" shadowrocket format */\n\t\t\tif (uri.includes('&'))\n\t\t\t\treturn null;\n\n\t\t\t/* https://github.com/2dust/v2rayN/wiki/Description-of-VMess-share-link */\n\t\t\turi = JSON.parse(hp.decodeBase64Str(uri[1]));\n\n\t\t\tif (uri.v != '2')\n\t\t\t\treturn null;\n\t\t\t/* Unsupported protocols */\n\t\t\telse if (uri.net === 'kcp')\n\t\t\t\treturn null;\n\t\t\telse if (uri.net === 'quic' && ((uri.type && uri.type !== 'none') || !features.with_quic))\n\t\t\t\treturn null;\n\t\t\t/* https://www.v2fly.org/config/protocols/vmess.html#vmess-md5-%E8%AE%A4%E8%AF%81%E4%BF%A1%E6%81%AF-%E6%B7%98%E6%B1%B0%E6%9C%BA%E5%88%B6\n\t\t\t * else if (uri.aid && parseInt(uri.aid) !== 0)\n\t\t\t * \treturn null;\n\t\t\t */\n\n\t\t\tconfig = {\n\t\t\t\tlabel: uri.ps,\n\t\t\t\ttype: 'vmess',\n\t\t\t\taddress: uri.add,\n\t\t\t\tport: uri.port,\n\t\t\t\tuuid: uri.id,\n\t\t\t\tvmess_alterid: uri.aid,\n\t\t\t\tvmess_encrypt: uri.scy || 'auto',\n\t\t\t\ttransport: (uri.net !== 'tcp') ? uri.net : null,\n\t\t\t\ttls: uri.tls === 'tls' ? '1' : '0',\n\t\t\t\ttls_sni: uri.sni || uri.host,\n\t\t\t\ttls_alpn: uri.alpn ? uri.alpn.split(',') : null,\n\t\t\t\ttls_utls: features.with_utls ? uri.fp : null\n\t\t\t};\n\t\t\tswitch (uri.net) {\n\t\t\tcase 'grpc':\n\t\t\t\tconfig.grpc_servicename = uri.path;\n\t\t\t\tbreak;\n\t\t\tcase 'h2':\n\t\t\tcase 'tcp':\n\t\t\t\tif (uri.net === 'h2' || uri.type === 'http') {\n\t\t\t\t\tconfig.transport = 'http';\n\t\t\t\t\tconfig.http_host = uri.host ? uri.host.split(',') : null;\n\t\t\t\t\tconfig.http_path = uri.path;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'httpupgrade':\n\t\t\t\tconfig.httpupgrade_host = uri.host;\n\t\t\t\tconfig.http_path = uri.path;\n\t\t\t\tbreak;\n\t\t\tcase 'ws':\n\t\t\t\tconfig.ws_host = uri.host;\n\t\t\t\tconfig.ws_path = uri.path;\n\t\t\t\tif (config.ws_path && config.ws_path.includes('?ed=')) {\n\t\t\t\t\tconfig.websocket_early_data_header = 'Sec-WebSocket-Protocol';\n\t\t\t\t\tconfig.websocket_early_data = config.ws_path.split('?ed=')[1];\n\t\t\t\t\tconfig.ws_path = config.ws_path.split('?ed=')[0];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (config) {\n\t\tif (!config.address || !config.port)\n\t\t\treturn null;\n\t\telse if (!config.label)\n\t\t\tconfig.label = config.address + ':' + config.port;\n\n\t\tconfig.address = config.address.replace(/\\[|\\]/g, '');\n\t}\n\n\treturn config;\n}\n\nfunction renderNodeSettings(section, data, features, main_node, routing_mode) {\n\tlet s = section, o;\n\ts.rowcolors = true;\n\ts.sortable = true;\n\ts.nodescriptions = true;\n\ts.modaltitle = L.bind(hp.loadModalTitle, this, _('Node'), _('Add a node'), data[0]);\n\ts.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]);\n\n\tif (routing_mode !== 'custom') {\n\t\to = s.option(form.Button, '_apply', _('Apply'));\n\t\to.editable = true;\n\t\to.modalonly = false;\n\t\to.inputstyle = 'apply';\n\t\to.inputtitle = function(section_id) {\n\t\t\tif (main_node == section_id) {\n\t\t\t\tthis.readonly = true;\n\t\t\t\treturn _('Applied');\n\t\t\t} else {\n\t\t\t\tthis.readonly = false;\n\t\t\t\treturn _('Apply');\n\t\t\t}\n\t\t}\n\t\to.onclick = function(ev, section_id) {\n\t\t\tuci.set(data[0], 'config', 'main_node', section_id);\n\n\t\t\treturn this.map.save(null, true).then(() => {\n\t\t\t\tui.changes.apply(true);\n\t\t\t});\n\t\t}\n\t}\n\n\to = s.option(form.Value, 'label', _('Label'));\n\to.load = L.bind(hp.loadDefaultLabel, this, data[0]);\n\to.validate = L.bind(hp.validateUniqueValue, this, data[0], 'node', 'label');\n\to.modalonly = true;\n\n\to = s.option(form.ListValue, 'type', _('Type'));\n\to.value('direct', _('Direct'));\n\to.value('anytls', _('AnyTLS'));\n\to.value('http', _('HTTP'));\n\tif (features.with_quic) {\n\t\to.value('hysteria', _('Hysteria'));\n\t\to.value('hysteria2', _('Hysteria2'));\n\t}\n\to.value('shadowsocks', _('Shadowsocks'));\n\to.value('shadowtls', _('ShadowTLS'));\n\to.value('socks', _('Socks'));\n\to.value('ssh', _('SSH'));\n\to.value('trojan', _('Trojan'));\n\tif (features.with_quic)\n\t\to.value('tuic', _('Tuic'));\n\tif (features.with_wireguard && features.with_gvisor)\n\t\to.value('wireguard', _('WireGuard'));\n\to.value('vless', _('VLESS'));\n\to.value('vmess', _('VMess'));\n\to.rmempty = false;\n\n\to = s.option(form.Value, 'address', _('Address'));\n\to.datatype = 'host';\n\to.depends({'type': 'direct', '!reverse': true});\n\to.rmempty = false;\n\n\to = s.option(form.Value, 'port', _('Port'));\n\to.datatype = 'port';\n\to.depends({'type': 'direct', '!reverse': true});\n\to.rmempty = false;\n\n\to = s.option(form.Value, 'username', _('Username'));\n\to.depends('type', 'http');\n\to.depends('type', 'socks');\n\to.depends('type', 'ssh');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'password', _('Password'));\n\to.password = true;\n\to.depends('type', 'anytls');\n\to.depends('type', 'http');\n\to.depends('type', 'hysteria2');\n\to.depends('type', 'shadowsocks');\n\to.depends('type', 'ssh');\n\to.depends('type', 'trojan');\n\to.depends('type', 'tuic');\n\to.depends({'type': 'shadowtls', 'shadowtls_version': '2'});\n\to.depends({'type': 'shadowtls', 'shadowtls_version': '3'});\n\to.depends({'type': 'socks', 'socks_version': '5'});\n\to.validate = function(section_id, value) {\n\t\tif (section_id) {\n\t\t\tlet type = this.section.formvalue(section_id, 'type');\n\t\t\tlet required_type = [ 'anytls', 'shadowsocks', 'shadowtls', 'trojan' ];\n\n\t\t\tif (required_type.includes(type)) {\n\t\t\t\tif (type === 'shadowsocks') {\n\t\t\t\t\tlet encmode = this.section.formvalue(section_id, 'shadowsocks_encrypt_method');\n\t\t\t\t\tif (encmode === 'none')\n\t\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t\tif (!value)\n\t\t\t\t\treturn _('Expecting: %s').format(_('non-empty value'));\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\to.modalonly = true;\n\n\t/* Direct config */\n\to = s.option(form.ListValue, 'proxy_protocol', _('Proxy protocol'),\n\t\t_('Write proxy protocol in the connection header.'));\n\to.value('', _('Disable'));\n\to.value('1', _('v1'));\n\to.value('2', _('v2'));\n\to.depends('type', 'direct');\n\to.modalonly = true;\n\n\t/* AnyTLS config start */\n\to = s.option(form.Value, 'anytls_idle_session_check_interval', _('Idle session check interval'),\n\t\t_('Interval checking for idle sessions, in seconds.'));\n\to.datatype = 'uinteger';\n\to.placeholder = '30';\n\to.depends('type', 'anytls');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'anytls_idle_session_timeout', _('Idle session check timeout'),\n\t\t_('In the check, close sessions that have been idle for longer than this, in seconds.'));\n\to.datatype = 'uinteger';\n\to.placeholder = '30';\n\to.depends('type', 'anytls');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'anytls_min_idle_session', _('Minimum idle sessions'),\n\t\t_('In the check, at least the first <code>n</code> idle sessions are kept open.'));\n\to.datatype = 'uinteger';\n\to.placeholder = '0';\n\to.depends('type', 'anytls');\n\to.modalonly = true;\n\t/* AnyTLS config end */\n\n\t/* Hysteria (2) config start */\n\to = s.option(form.DynamicList, 'hysteria_hopping_port', _('Hopping port'));\n\to.depends('type', 'hysteria');\n\to.depends('type', 'hysteria2');\n\to.validate = hp.validatePortRange;\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'hysteria_hop_interval', _('Hop interval'),\n\t\t_('Port hopping interval in seconds.'));\n\to.datatype = 'uinteger';\n\to.placeholder = '30';\n\to.depends({'type': 'hysteria', 'hysteria_hopping_port': /[\\s\\S]/});\n\to.depends({'type': 'hysteria2', 'hysteria_hopping_port': /[\\s\\S]/});\n\to.modalonly = true;\n\n\to = s.option(form.ListValue, 'hysteria_protocol', _('Protocol'));\n\to.value('udp');\n\t/* WeChat-Video / FakeTCP are unsupported by sing-box currently\n\t * o.value('wechat-video');\n\t * o.value('faketcp');\n\t */\n\to.default = 'udp';\n\to.depends('type', 'hysteria');\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.ListValue, 'hysteria_auth_type', _('Authentication type'));\n\to.value('', _('Disable'));\n\to.value('base64', _('Base64'));\n\to.value('string', _('String'));\n\to.depends('type', 'hysteria');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'hysteria_auth_payload', _('Authentication payload'));\n\to.password = true\n\to.depends({'type': 'hysteria', 'hysteria_auth_type': /[\\s\\S]/});\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.ListValue, 'hysteria_obfs_type', _('Obfuscate type'));\n\to.value('', _('Disable'));\n\to.value('salamander', _('Salamander'));\n\to.depends('type', 'hysteria2');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'hysteria_obfs_password', _('Obfuscate password'));\n\to.password = true;\n\to.depends('type', 'hysteria');\n\to.depends({'type': 'hysteria2', 'hysteria_obfs_type': /[\\s\\S]/});\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'hysteria_down_mbps', _('Max download speed'),\n\t\t_('Max download speed in Mbps.'));\n\to.datatype = 'uinteger';\n\to.depends('type', 'hysteria');\n\to.depends('type', 'hysteria2');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'hysteria_up_mbps', _('Max upload speed'),\n\t\t_('Max upload speed in Mbps.'));\n\to.datatype = 'uinteger';\n\to.depends('type', 'hysteria');\n\to.depends('type', 'hysteria2');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'hysteria_recv_window_conn', _('QUIC stream receive window'),\n\t\t_('The QUIC stream-level flow control window for receiving data.'));\n\to.datatype = 'uinteger';\n\to.depends('type', 'hysteria');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'hysteria_revc_window', _('QUIC connection receive window'),\n\t\t_('The QUIC connection-level flow control window for receiving data.'));\n\to.datatype = 'uinteger';\n\to.depends('type', 'hysteria');\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'hysteria_disable_mtu_discovery', _('Disable Path MTU discovery'),\n\t\t_('Disables Path MTU Discovery (RFC 8899). Packets will then be at most 1252 (IPv4) / 1232 (IPv6) bytes in size.'));\n\to.depends('type', 'hysteria');\n\to.modalonly = true;\n\t/* Hysteria (2) config end */\n\n\t/* Shadowsocks config start */\n\to = s.option(form.ListValue, 'shadowsocks_encrypt_method', _('Encrypt method'));\n\tfor (let i of hp.shadowsocks_encrypt_methods)\n\t\to.value(i);\n\t/* Stream ciphers */\n\to.value('aes-128-ctr');\n\to.value('aes-192-ctr');\n\to.value('aes-256-ctr');\n\to.value('aes-128-cfb');\n\to.value('aes-192-cfb');\n\to.value('aes-256-cfb');\n\to.value('chacha20');\n\to.value('chacha20-ietf');\n\to.value('rc4-md5');\n\to.default = 'aes-128-gcm';\n\to.depends('type', 'shadowsocks');\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.ListValue, 'shadowsocks_plugin', _('Plugin'));\n\to.value('', _('none'));\n\to.value('obfs-local');\n\to.value('v2ray-plugin');\n\to.depends('type', 'shadowsocks');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'shadowsocks_plugin_opts', _('Plugin opts'));\n\to.depends('shadowsocks_plugin', 'obfs-local');\n\to.depends('shadowsocks_plugin', 'v2ray-plugin');\n\to.modalonly = true;\n\t/* Shadowsocks config end */\n\n\t/* ShadowTLS config */\n\to = s.option(form.ListValue, 'shadowtls_version', _('ShadowTLS version'));\n\to.value('1', _('v1'));\n\to.value('2', _('v2'));\n\to.value('3', _('v3'));\n\to.default = '1';\n\to.depends('type', 'shadowtls');\n\to.rmempty = false;\n\to.modalonly = true;\n\n\t/* Socks config */\n\to = s.option(form.ListValue, 'socks_version', _('Socks version'));\n\to.value('4', _('Socks4'));\n\to.value('4a', _('Socks4A'));\n\to.value('5', _('Socks5'));\n\to.default = '5';\n\to.depends('type', 'socks');\n\to.rmempty = false;\n\to.modalonly = true;\n\n\t/* SSH config start */\n\to = s.option(form.Value, 'ssh_client_version', _('Client version'),\n\t\t_('Random version will be used if empty.'));\n\to.depends('type', 'ssh');\n\to.modalonly = true;\n\n\to = s.option(form.DynamicList, 'ssh_host_key', _('Host key'),\n\t\t_('Accept any if empty.'));\n\to.depends('type', 'ssh');\n\to.modalonly = true;\n\n\to = s.option(form.DynamicList, 'ssh_host_key_algo', _('Host key algorithms'))\n\to.depends('type', 'ssh');\n\to.modalonly = true;\n\n\to = s.option(form.DynamicList, 'ssh_priv_key', _('Private key'));\n\to.password = true;\n\to.depends('type', 'ssh');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'ssh_priv_key_pp', _('Private key passphrase'));\n\to.password = true;\n\to.depends('type', 'ssh');\n\to.modalonly = true;\n\t/* SSH config end */\n\n\t/* TUIC config start */\n\to = s.option(form.Value, 'uuid', _('UUID'));\n\to.password = true;\n\to.depends('type', 'tuic');\n\to.depends('type', 'vless');\n\to.depends('type', 'vmess');\n\to.validate = hp.validateUUID;\n\to.modalonly = true;\n\n\to = s.option(form.ListValue, 'tuic_congestion_control', _('Congestion control algorithm'),\n\t\t_('QUIC congestion control algorithm.'));\n\to.value('cubic', _('CUBIC'));\n\to.value('new_reno', _('New Reno'));\n\to.value('bbr', _('BBR'));\n\to.default = 'cubic';\n\to.depends('type', 'tuic');\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.ListValue, 'tuic_udp_relay_mode', _('UDP relay mode'),\n\t\t_('UDP packet relay mode.'));\n\to.value('', _('Default'));\n\to.value('native', _('Native'));\n\to.value('quic', _('QUIC'));\n\to.depends('type', 'tuic');\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'tuic_udp_over_stream', _('UDP over stream'),\n\t\t_('This is the TUIC port of the UDP over TCP protocol, designed to provide a QUIC stream based UDP relay mode that TUIC does not provide.'));\n\to.depends({'type': 'tuic','tuic_udp_relay_mode': ''});\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'tuic_enable_zero_rtt', _('Enable 0-RTT handshake'),\n\t\t_('Enable 0-RTT QUIC connection handshake on the client side. This is not impacting much on the performance, as the protocol is fully multiplexed.<br/>' +\n\t\t\t'Disabling this is highly recommended, as it is vulnerable to replay attacks.'));\n\to.depends('type', 'tuic');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'tuic_heartbeat', _('Heartbeat interval'),\n\t\t_('Interval for sending heartbeat packets for keeping the connection alive (in seconds).'));\n\to.datatype = 'uinteger';\n\to.default = '10';\n\to.depends('type', 'tuic');\n\to.modalonly = true;\n\t/* Tuic config end */\n\n\t/* VMess / VLESS config start */\n\to = s.option(form.ListValue, 'vless_flow', _('Flow'));\n\to.value('', _('None'));\n\to.value('xtls-rprx-vision');\n\to.depends('type', 'vless');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'vmess_alterid', _('Alter ID'),\n\t\t_('Legacy protocol support (VMess MD5 Authentication) is provided for compatibility purposes only, use of alterId > 1 is not recommended.'));\n\to.datatype = 'uinteger';\n\to.depends('type', 'vmess');\n\to.modalonly = true;\n\n\to = s.option(form.ListValue, 'vmess_encrypt', _('Encrypt method'));\n\to.value('auto');\n\to.value('none');\n\to.value('zero');\n\to.value('aes-128-gcm');\n\to.value('chacha20-poly1305');\n\to.default = 'auto';\n\to.depends('type', 'vmess');\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'vmess_global_padding', _('Global padding'),\n\t\t_('Protocol parameter. Will waste traffic randomly if enabled (enabled by default in v2ray and cannot be disabled).'));\n\to.default = o.enabled;\n\to.depends('type', 'vmess');\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'vmess_authenticated_length', _('Authenticated length'),\n\t\t_('Protocol parameter. Enable length block encryption.'));\n\to.depends('type', 'vmess');\n\to.modalonly = true;\n\t/* VMess config end */\n\n\t/* Transport config start */\n\to = s.option(form.ListValue, 'transport', _('Transport'),\n\t\t_('No TCP transport, plain HTTP is merged into the HTTP transport.'));\n\to.value('', _('None'));\n\to.value('grpc', _('gRPC'));\n\to.value('http', _('HTTP'));\n\to.value('httpupgrade', _('HTTPUpgrade'));\n\to.value('quic', _('QUIC'));\n\to.value('ws', _('WebSocket'));\n\to.depends('type', 'trojan');\n\to.depends('type', 'vless');\n\to.depends('type', 'vmess');\n\to.onchange = function(ev, section_id, value) {\n\t\tlet desc = this.map.findElement('id', 'cbid.homeproxy.%s.transport'.format(section_id)).nextElementSibling;\n\t\tif (value === 'http')\n\t\t\tdesc.innerHTML = _('TLS is not enforced. If TLS is not configured, plain HTTP 1.1 is used.');\n\t\telse if (value === 'quic')\n\t\t\tdesc.innerHTML = _('No additional encryption support: It\\'s basically duplicate encryption.');\n\t\telse\n\t\t\tdesc.innerHTML = _('No TCP transport, plain HTTP is merged into the HTTP transport.');\n\n\t\tlet tls = this.map.findElement('id', 'cbid.homeproxy.%s.tls'.format(section_id)).firstElementChild;\n\t\tif ((value === 'http' && tls.checked) || (value === 'grpc' && !features.with_grpc)) {\n\t\t\tthis.map.findElement('id', 'cbid.homeproxy.%s.http_idle_timeout'.format(section_id)).nextElementSibling.innerHTML =\n\t\t\t\t_('Specifies the period of time (in seconds) after which a health check will be performed using a ping frame if no frames have been received on the connection.<br/>' +\n\t\t\t\t\t'Please note that a ping response is considered a received frame, so if there is no other traffic on the connection, the health check will be executed every interval.');\n\n\t\t\tthis.map.findElement('id', 'cbid.homeproxy.%s.http_ping_timeout'.format(section_id)).nextElementSibling.innerHTML =\n\t\t\t\t_('Specifies the timeout duration (in seconds) after sending a PING frame, within which a response must be received.<br/>' +\n\t\t\t\t\t'If a response to the PING frame is not received within the specified timeout duration, the connection will be closed.');\n\t\t} else if (value === 'grpc' && features.with_grpc) {\n\t\t\tthis.map.findElement('id', 'cbid.homeproxy.%s.http_idle_timeout'.format(section_id)).nextElementSibling.innerHTML =\n\t\t\t\t_('If the transport doesn\\'t see any activity after a duration of this time (in seconds), it pings the client to check if the connection is still active.');\n\n\t\t\tthis.map.findElement('id', 'cbid.homeproxy.%s.http_ping_timeout'.format(section_id)).nextElementSibling.innerHTML =\n\t\t\t\t_('The timeout (in seconds) that after performing a keepalive check, the client will wait for activity. If no activity is detected, the connection will be closed.');\n\t\t}\n\t}\n\to.modalonly = true;\n\n\t/* gRPC config start */\n\to = s.option(form.Value, 'grpc_servicename', _('gRPC service name'));\n\to.depends('transport', 'grpc');\n\to.modalonly = true;\n\n\tif (features.with_grpc) {\n\t\to = s.option(form.Flag, 'grpc_permit_without_stream', _('gRPC permit without stream'),\n\t\t\t_('If enabled, the client transport sends keepalive pings even with no active connections.'));\n\t\to.depends('transport', 'grpc');\n\t\to.modalonly = true;\n\t}\n\t/* gRPC config end */\n\n\t/* HTTP(Upgrade) config start */\n\to = s.option(form.DynamicList, 'http_host', _('Host'));\n\to.datatype = 'hostname';\n\to.depends('transport', 'http');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'httpupgrade_host', _('Host'));\n\to.datatype = 'hostname';\n\to.depends('transport', 'httpupgrade');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'http_path', _('Path'));\n\to.depends('transport', 'http');\n\to.depends('transport', 'httpupgrade');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'http_method', _('Method'));\n\to.value('GET', _('GET'));\n\to.value('PUT', _('PUT'));\n\to.depends('transport', 'http');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'http_idle_timeout', _('Idle timeout'),\n\t\t_('Specifies the period of time (in seconds) after which a health check will be performed using a ping frame if no frames have been received on the connection.<br/>' +\n\t\t\t'Please note that a ping response is considered a received frame, so if there is no other traffic on the connection, the health check will be executed every interval.'));\n\to.datatype = 'uinteger';\n\to.depends('transport', 'grpc');\n\to.depends({'transport': 'http', 'tls': '1'});\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'http_ping_timeout', _('Ping timeout'),\n\t\t_('Specifies the timeout duration (in seconds) after sending a PING frame, within which a response must be received.<br/>' +\n\t\t\t'If a response to the PING frame is not received within the specified timeout duration, the connection will be closed.'));\n\to.datatype = 'uinteger';\n\to.depends('transport', 'grpc');\n\to.depends({'transport': 'http', 'tls': '1'});\n\to.modalonly = true;\n\t/* HTTP config end */\n\n\t/* WebSocket config start */\n\to = s.option(form.Value, 'ws_host', _('Host'));\n\to.depends('transport', 'ws');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'ws_path', _('Path'));\n\to.depends('transport', 'ws');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'websocket_early_data', _('Early data'),\n\t\t_('Allowed payload size is in the request.'));\n\to.datatype = 'uinteger';\n\to.value('2048');\n\to.depends('transport', 'ws');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'websocket_early_data_header', _('Early data header name'));\n\to.value('Sec-WebSocket-Protocol');\n\to.depends('transport', 'ws');\n\to.modalonly = true;\n\t/* WebSocket config end */\n\n\to = s.option(form.ListValue, 'packet_encoding', _('Packet encoding'));\n\to.value('', _('none'));\n\to.value('packetaddr', _('packet addr (v2ray-core v5+)'));\n\to.value('xudp', _('Xudp (Xray-core)'));\n\to.depends('type', 'vless');\n\to.depends('type', 'vmess');\n\to.modalonly = true;\n\t/* Transport config end */\n\n\t/* Wireguard config start */\n\to = s.option(form.DynamicList, 'wireguard_local_address', _('Local address'),\n\t\t_('List of IP (v4 or v6) addresses prefixes to be assigned to the interface.'));\n\to.datatype = 'cidr';\n\to.depends('type', 'wireguard');\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'wireguard_private_key', _('Private key'),\n\t\t_('WireGuard requires base64-encoded private keys.'));\n\to.password = true;\n\to.depends('type', 'wireguard');\n\to.validate = L.bind(hp.validateBase64Key, this, 44);\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'wireguard_peer_public_key', _('Peer pubkic key'),\n\t\t_('WireGuard peer public key.'));\n\to.depends('type', 'wireguard');\n\to.validate = L.bind(hp.validateBase64Key, this, 44);\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'wireguard_pre_shared_key', _('Pre-shared key'),\n\t\t_('WireGuard pre-shared key.'));\n\to.password = true;\n\to.depends('type', 'wireguard');\n\to.validate = L.bind(hp.validateBase64Key, this, 44);\n\to.modalonly = true;\n\n\to = s.option(form.DynamicList, 'wireguard_reserved', _('Reserved field bytes'));\n\to.datatype = 'integer';\n\to.depends('type', 'wireguard');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'wireguard_mtu', _('MTU'));\n\to.datatype = 'range(0,9000)';\n\to.placeholder = '1408';\n\to.depends('type', 'wireguard');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'wireguard_persistent_keepalive_interval', _('Persistent keepalive interval'),\n\t\t_('In seconds. Disabled by default.'));\n\to.datatype = 'uinteger';\n\to.depends('type', 'wireguard');\n\to.modalonly = true;\n\t/* Wireguard config end */\n\n\t/* Mux config start */\n\to = s.option(form.Flag, 'multiplex', _('Multiplex'));\n\to.depends('type', 'shadowsocks');\n\to.depends('type', 'trojan');\n\to.depends('type', 'vless');\n\to.depends('type', 'vmess');\n\to.modalonly = true;\n\n\to = s.option(form.ListValue, 'multiplex_protocol', _('Protocol'),\n\t\t_('Multiplex protocol.'));\n\to.value('h2mux');\n\to.value('smux');\n\to.value('yamux');\n\to.default = 'h2mux';\n\to.depends('multiplex', '1');\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'multiplex_max_connections', _('Maximum connections'));\n\to.datatype = 'uinteger';\n\to.depends('multiplex', '1');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'multiplex_min_streams', _('Minimum streams'),\n\t\t_('Minimum multiplexed streams in a connection before opening a new connection.'));\n\to.datatype = 'uinteger';\n\to.depends('multiplex', '1');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'multiplex_max_streams', _('Maximum streams'),\n\t\t_('Maximum multiplexed streams in a connection before opening a new connection.<br/>' +\n\t\t\t'Conflict with <code>%s</code> and <code>%s</code>.').format(\n\t\t\t\t_('Maximum connections'), _('Minimum streams')));\n\to.datatype = 'uinteger';\n\to.depends({'multiplex': '1', 'multiplex_max_connections': '', 'multiplex_min_streams': ''});\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'multiplex_padding', _('Enable padding'));\n\to.depends('multiplex', '1');\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'multiplex_brutal', _('Enable TCP Brutal'),\n\t\t_('Enable TCP Brutal congestion control algorithm'));\n\to.depends('multiplex', '1');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'multiplex_brutal_down', _('Download bandwidth'),\n\t\t_('Download bandwidth in Mbps.'));\n\to.datatype = 'uinteger';\n\to.depends('multiplex_brutal', '1');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'multiplex_brutal_up', _('Upload bandwidth'),\n\t\t_('Upload bandwidth in Mbps.'));\n\to.datatype = 'uinteger';\n\to.depends('multiplex_brutal', '1');\n\to.modalonly = true;\n\t/* Mux config end */\n\n\t/* TLS config start */\n\to = s.option(form.Flag, 'tls', _('TLS'));\n\to.depends('type', 'anytls');\n\to.depends('type', 'http');\n\to.depends('type', 'hysteria');\n\to.depends('type', 'hysteria2');\n\to.depends('type', 'shadowtls');\n\to.depends('type', 'trojan');\n\to.depends('type', 'tuic');\n\to.depends('type', 'vless');\n\to.depends('type', 'vmess');\n\to.validate = function(section_id, _value) {\n\t\tif (section_id) {\n\t\t\tlet type = this.map.lookupOption('type', section_id)[0].formvalue(section_id);\n\t\t\tlet tls = this.map.findElement('id', 'cbid.homeproxy.%s.tls'.format(section_id)).firstElementChild;\n\n\t\t\tif (['anytls', 'hysteria', 'hysteria2', 'shadowtls', 'tuic'].includes(type)) {\n\t\t\t\ttls.checked = true;\n\t\t\t\ttls.disabled = true;\n\t\t\t} else {\n\t\t\t\ttls.disabled = null;\n\t\t\t}\n\t\t}\n\n\t\treturn true;\n\t}\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'tls_sni', _('TLS SNI'),\n\t\t_('Used to verify the hostname on the returned certificates unless insecure is given.'));\n\to.depends('tls', '1');\n\to.modalonly = true;\n\n\to = s.option(form.DynamicList, 'tls_alpn', _('TLS ALPN'),\n\t\t_('List of supported application level protocols, in order of preference.'));\n\to.depends('tls', '1');\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'tls_insecure', _('Allow insecure'),\n\t\t_('Allow insecure connection at TLS client.') +\n\t\t'<br/>' +\n\t\t_('This is <strong>DANGEROUS</strong>, your traffic is almost like <strong>PLAIN TEXT</strong>! Use at your own risk!'));\n\to.depends('tls', '1');\n\to.onchange = allowInsecureConfirm;\n\to.modalonly = true;\n\n\to = s.option(form.ListValue, 'tls_min_version', _('Minimum TLS version'),\n\t\t_('The minimum TLS version that is acceptable.'));\n\to.value('', _('default'));\n\tfor (let i of hp.tls_versions)\n\t\to.value(i);\n\to.depends('tls', '1');\n\to.modalonly = true;\n\n\to = s.option(form.ListValue, 'tls_max_version', _('Maximum TLS version'),\n\t\t_('The maximum TLS version that is acceptable.'));\n\to.value('', _('default'));\n\tfor (let i of hp.tls_versions)\n\t\to.value(i);\n\to.depends('tls', '1');\n\to.modalonly = true;\n\n\to = s.option(hp.CBIStaticList, 'tls_cipher_suites', _('Cipher suites'),\n\t\t_('The elliptic curves that will be used in an ECDHE handshake, in preference order. If empty, the default will be used.'));\n\tfor (let i of hp.tls_cipher_suites)\n\t\to.value(i);\n\to.depends('tls', '1');\n\to.optional = true;\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'tls_self_sign', _('Append self-signed certificate'),\n\t\t_('If you have the root certificate, use this option instead of allowing insecure.'));\n\to.depends('tls_insecure', '0');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'tls_cert_path', _('Certificate path'),\n\t\t_('The path to the server certificate, in PEM format.'));\n\to.value('/etc/homeproxy/certs/client_ca.pem');\n\to.depends('tls_self_sign', '1');\n\to.validate = hp.validateCertificatePath;\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.Button, '_upload_cert', _('Upload certificate'),\n\t\t_('<strong>Save your configuration before uploading files!</strong>'));\n\to.inputstyle = 'action';\n\to.inputtitle = _('Upload...');\n\to.depends({'tls_self_sign': '1', 'tls_cert_path': '/etc/homeproxy/certs/client_ca.pem'});\n\to.onclick = L.bind(hp.uploadCertificate, this, _('certificate'), 'client_ca');\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'tls_ech', _('Enable ECH'),\n\t\t_('ECH (Encrypted Client Hello) is a TLS extension that allows a client to encrypt the first part of its ClientHello message.'));\n\to.depends('tls', '1');\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'tls_ech_config_path', _('ECH config path'),\n\t\t_('The path to the ECH config, in PEM format. If empty, load from DNS will be attempted.'));\n\to.value('/etc/homeproxy/certs/client_ech_conf.pem');\n\to.depends('tls_ech', '1');\n\to.modalonly = true;\n\n\to = s.option(form.Button, '_upload_ech_config', _('Upload ECH config'),\n\t\t_('<strong>Save your configuration before uploading files!</strong>'));\n\to.inputstyle = 'action';\n\to.inputtitle = _('Upload...');\n\to.depends({'tls_ech': '1', 'tls_ech_config_path': '/etc/homeproxy/certs/client_ech_conf.pem'});\n\to.onclick = L.bind(hp.uploadCertificate, this, _('ECH config'), 'client_ech_conf');\n\to.modalonly = true;\n\n\tif (features.with_utls) {\n\t\to = s.option(form.ListValue, 'tls_utls', _('uTLS fingerprint'),\n\t\t\t_('uTLS is a fork of \"crypto/tls\", which provides ClientHello fingerprinting resistance.'));\n\t\to.value('', _('Disable'));\n\t\to.value('360');\n\t\to.value('android');\n\t\to.value('chrome');\n\t\to.value('edge');\n\t\to.value('firefox');\n\t\to.value('ios');\n\t\to.value('qq');\n\t\to.value('random');\n\t\to.value('randomized');\n\t\to.value('safari');\n\t\to.depends({'tls': '1', 'type': /^((?!hysteria2?|tuic$).)+$/});\n\t\to.validate = function(section_id, value) {\n\t\t\tif (section_id) {\n\t\t\t\tlet tls_reality = this.map.findElement('id', 'cbid.homeproxy.%s.tls_reality'.format(section_id)).firstElementChild;\n\t\t\t\tif (tls_reality.checked && !value)\n\t\t\t\t\treturn _('Expecting: %s').format(_('non-empty value'));\n\n\t\t\t\tlet vless_flow = this.map.lookupOption('vless_flow', section_id)[0].formvalue(section_id);\n\t\t\t\tif ((tls_reality.checked || vless_flow) && ['360', 'android'].includes(value))\n\t\t\t\t\treturn _('Unsupported fingerprint!');\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Flag, 'tls_reality', _('REALITY'));\n\t\to.depends({'tls': '1', 'type': 'anytls'});\n\t\to.depends({'tls': '1', 'type': 'vless'});\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'tls_reality_public_key', _('REALITY public key'));\n\t\to.password = true;\n\t\to.depends('tls_reality', '1');\n\t\to.rmempty = false;\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'tls_reality_short_id', _('REALITY short ID'));\n\t\to.password = true;\n\t\to.depends('tls_reality', '1');\n\t\to.modalonly = true;\n\t}\n\t/* TLS config end */\n\n\t/* Extra settings start */\n\to = s.option(form.Flag, 'tcp_fast_open', _('TCP fast open'));\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'tcp_multi_path', _('MultiPath TCP'));\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'udp_fragment', _('UDP Fragment'),\n\t\t_('Enable UDP fragmentation.'));\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'udp_over_tcp', _('UDP over TCP'),\n\t\t_('Enable the SUoT protocol, requires server support. Conflict with multiplex.'));\n\to.depends('type', 'socks');\n\to.depends({'type': 'shadowsocks', 'multiplex': '0'});\n\to.modalonly = true;\n\n\to = s.option(form.ListValue, 'udp_over_tcp_version', _('SUoT version'));\n\to.value('1', _('v1'));\n\to.value('2', _('v2'));\n\to.default = '2';\n\to.depends('udp_over_tcp', '1');\n\to.modalonly = true;\n\t/* Extra settings end */\n\n\treturn s;\n}\n\nreturn view.extend({\n\tload() {\n\t\treturn Promise.all([\n\t\t\tuci.load('homeproxy'),\n\t\t\thp.getBuiltinFeatures()\n\t\t]);\n\t},\n\n\trender(data) {\n\t\tlet m, s, o, ss, so;\n\t\tlet main_node = uci.get(data[0], 'config', 'main_node');\n\t\tlet routing_mode = uci.get(data[0], 'config', 'routing_mode');\n\t\tlet features = data[1];\n\n\t\t/* Cache subscription information, it will be called multiple times */\n\t\tlet subinfo = [];\n\t\tfor (let suburl of (uci.get(data[0], 'subscription', 'subscription_url') || [])) {\n\t\t\tconst url = new URL(suburl);\n\t\t\tconst urlhash = hp.calcStringMD5(suburl.replace(/#.*$/, ''));\n\t\t\tconst title = url.hash ? decodeURIComponent(url.hash.slice(1)) : url.hostname;\n\t\t\tsubinfo.push({ 'hash': urlhash, 'title': title });\n\t\t}\n\n\t\tm = new form.Map('homeproxy', _('Edit nodes'));\n\n\t\ts = m.section(form.NamedSection, 'subscription', 'homeproxy');\n\n\t\t/* Node settings start */\n\t\t/* User nodes start */\n\t\ts.tab('node', _('Nodes'));\n\t\to = s.taboption('node', form.SectionValue, '_node', form.GridSection, 'node');\n\t\tss = renderNodeSettings(o.subsection, data, features, main_node, routing_mode);\n\t\tss.addremove = true;\n\t\tss.filter = function(section_id) {\n\t\t\tfor (let info of subinfo)\n\t\t\t\tif (info.hash === uci.get(data[0], section_id, 'grouphash'))\n\t\t\t\t\treturn false;\n\n\t\t\treturn true;\n\t\t}\n\t\t/* Import subscription links start */\n\t\t/* Thanks to luci-app-shadowsocks-libev */\n\t\tss.handleLinkImport = function() {\n\t\t\tlet textarea = new ui.Textarea();\n\t\t\tui.showModal(_('Import share links'), [\n\t\t\t\tE('p', _('Support Hysteria, Shadowsocks, Trojan, v2rayN (VMess), and XTLS (VLESS) online configuration delivery standard.')),\n\t\t\t\ttextarea.render(),\n\t\t\t\tE('div', { class: 'right' }, [\n\t\t\t\t\tE('button', {\n\t\t\t\t\t\tclass: 'btn',\n\t\t\t\t\t\tclick: ui.hideModal\n\t\t\t\t\t}, [ _('Cancel') ]),\n\t\t\t\t\t'',\n\t\t\t\t\tE('button', {\n\t\t\t\t\t\tclass: 'btn cbi-button-action',\n\t\t\t\t\t\tclick: ui.createHandlerFn(this, () => {\n\t\t\t\t\t\t\tlet input_links = textarea.getValue().trim().split('\\n');\n\t\t\t\t\t\t\tif (input_links && input_links[0]) {\n\t\t\t\t\t\t\t\t/* Remove duplicate lines */\n\t\t\t\t\t\t\t\tinput_links = input_links.reduce((pre, cur) =>\n\t\t\t\t\t\t\t\t\t(!pre.includes(cur) && pre.push(cur), pre), []);\n\n\t\t\t\t\t\t\t\tlet allow_insecure = uci.get(data[0], 'subscription', 'allow_insecure');\n\t\t\t\t\t\t\t\tlet packet_encoding = uci.get(data[0], 'subscription', 'packet_encoding');\n\t\t\t\t\t\t\t\tlet imported_node = 0;\n\t\t\t\t\t\t\t\tinput_links.forEach((l) => {\n\t\t\t\t\t\t\t\t\tlet config = parseShareLink(l, features);\n\t\t\t\t\t\t\t\t\tif (config) {\n\t\t\t\t\t\t\t\t\t\tif (config.tls === '1' && allow_insecure === '1')\n\t\t\t\t\t\t\t\t\t\t\tconfig.tls_insecure = '1'\n\t\t\t\t\t\t\t\t\t\tif (['vless', 'vmess'].includes(config.type))\n\t\t\t\t\t\t\t\t\t\t\tconfig.packet_encoding = packet_encoding\n\n\t\t\t\t\t\t\t\t\t\tlet nameHash = hp.calcStringMD5(config.label);\n\t\t\t\t\t\t\t\t\t\tlet sid = uci.add(data[0], 'node', nameHash);\n\t\t\t\t\t\t\t\t\t\tObject.keys(config).forEach((k) => {\n\t\t\t\t\t\t\t\t\t\t\tuci.set(data[0], sid, k, config[k]);\n\t\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t\t\timported_node++;\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t});\n\n\t\t\t\t\t\t\t\tif (imported_node === 0)\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('No valid share link found.')));\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Successfully imported %s nodes of total %s.').format(\n\t\t\t\t\t\t\t\t\t\timported_node, input_links.length)));\n\n\t\t\t\t\t\t\t\treturn uci.save()\n\t\t\t\t\t\t\t\t\t.then(L.bind(this.map.load, this.map))\n\t\t\t\t\t\t\t\t\t.then(L.bind(this.map.reset, this.map))\n\t\t\t\t\t\t\t\t\t.then(L.ui.hideModal)\n\t\t\t\t\t\t\t\t\t.catch(() => {});\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\treturn ui.hideModal();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t})\n\t\t\t\t\t}, [ _('Import') ])\n\t\t\t\t])\n\t\t\t])\n\t\t}\n\t\tss.renderSectionAdd = function(/* ... */) {\n\t\t\tlet el = form.GridSection.prototype.renderSectionAdd.apply(this, arguments),\n\t\t\t\tnameEl = el.querySelector('.cbi-section-create-name');\n\n\t\t\tui.addValidator(nameEl, 'uciname', true, (v) => {\n\t\t\t\tlet button = el.querySelector('.cbi-section-create > .cbi-button-add');\n\t\t\t\tlet uciconfig = this.uciconfig || this.map.config;\n\n\t\t\t\tif (!v) {\n\t\t\t\t\tbutton.disabled = true;\n\t\t\t\t\treturn true;\n\t\t\t\t} else if (uci.get(uciconfig, v)) {\n\t\t\t\t\tbutton.disabled = true;\n\t\t\t\t\treturn _('Expecting: %s').format(_('unique UCI identifier'));\n\t\t\t\t} else {\n\t\t\t\t\tbutton.disabled = null;\n\t\t\t\t\treturn true;\n\t\t\t\t}\n\t\t\t}, 'blur', 'keyup');\n\n\t\t\tel.appendChild(E('button', {\n\t\t\t\t'class': 'cbi-button cbi-button-add',\n\t\t\t\t'title': _('Import share links'),\n\t\t\t\t'click': ui.createHandlerFn(this, 'handleLinkImport')\n\t\t\t}, [ _('Import share links') ]));\n\n\t\t\treturn el;\n\t\t}\n\t\t/* Import subscription links end */\n\t\t/* User nodes end */\n\n\t\t/* Subscription nodes start */\n\t\tfor (const info of subinfo) {\n\t\t\ts.tab('sub_' + info.hash, _('Sub (%s)').format(info.title));\n\t\t\to = s.taboption('sub_' + info.hash, form.SectionValue, '_sub_' + info.hash, form.GridSection, 'node');\n\t\t\tss = renderNodeSettings(o.subsection, data, features, main_node, routing_mode);\n\t\t\tss.filter = function(section_id) {\n\t\t\t\treturn (uci.get(data[0], section_id, 'grouphash') === info.hash);\n\t\t\t}\n\t\t}\n\t\t/* Subscription nodes end */\n\t\t/* Node settings end */\n\n\t\t/* Subscriptions settings start */\n\t\ts.tab('subscription', _('Subscriptions'));\n\n\t\to = s.taboption('subscription', form.Flag, 'auto_update', _('Auto update'),\n\t\t\t_('Auto update subscriptions and geodata.'));\n\t\to.rmempty = false;\n\n\t\to = s.taboption('subscription', form.ListValue, 'auto_update_time', _('Update time'));\n\t\tfor (let i = 0; i < 24; i++)\n\t\t\to.value(i, i + ':00');\n\t\to.default = '2';\n\t\to.depends('auto_update', '1');\n\n\t\to = s.taboption('subscription', form.Flag, 'update_via_proxy', _('Update via proxy'),\n\t\t\t_('Update subscriptions via proxy.'));\n\t\to.rmempty = false;\n\n\t\to = s.taboption('subscription', form.DynamicList, 'subscription_url', _('Subscription URL-s'),\n\t\t\t_('Support Hysteria, Shadowsocks, Trojan, v2rayN (VMess), and XTLS (VLESS) online configuration delivery standard.'));\n\t\to.validate = function(section_id, value) {\n\t\t\tif (section_id && value) {\n\t\t\t\ttry {\n\t\t\t\t\tlet url = new URL(value);\n\t\t\t\t\tif (!url.hostname)\n\t\t\t\t\t\treturn _('Expecting: %s').format(_('valid URL'));\n\t\t\t\t}\n\t\t\t\tcatch(e) {\n\t\t\t\t\treturn _('Expecting: %s').format(_('valid URL'));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\n\t\to = s.taboption('subscription', form.ListValue, 'filter_nodes', _('Filter nodes'),\n\t\t\t_('Drop/keep specific nodes from subscriptions.'));\n\t\to.value('disabled', _('Disable'));\n\t\to.value('blacklist', _('Blacklist mode'));\n\t\to.value('whitelist', _('Whitelist mode'));\n\t\to.default = 'disabled';\n\t\to.rmempty = false;\n\n\t\to = s.taboption('subscription', form.DynamicList, 'filter_keywords', _('Filter keywords'),\n\t\t\t_('Drop/keep nodes that contain the specific keywords. <a target=\"_blank\" href=\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Regular_Expressions\">Regex</a> is supported.'));\n\t\to.depends({'filter_nodes': 'disabled', '!reverse': true});\n\t\to.rmempty = false;\n\n\t\to = s.taboption('subscription', form.Value, 'user_agent', _('User-Agent'));\n\t\to.placeholder = 'Wget/1.21 (HomeProxy, like v2rayN)';\n\n\t\to = s.taboption('subscription', form.Flag, 'allow_insecure', _('Allow insecure'),\n\t\t\t_('Allow insecure connection by default when add nodes from subscriptions.') +\n\t\t\t'<br/>' +\n\t\t\t_('This is <strong>DANGEROUS</strong>, your traffic is almost like <strong>PLAIN TEXT</strong>! Use at your own risk!'));\n\t\to.rmempty = false;\n\t\to.onchange = allowInsecureConfirm;\n\n\t\to = s.taboption('subscription', form.ListValue, 'packet_encoding', _('Default packet encoding'));\n\t\to.value('', _('none'));\n\t\to.value('packetaddr', _('packet addr (v2ray-core v5+)'));\n\t\to.value('xudp', _('Xudp (Xray-core)'));\n\n\t\to = s.taboption('subscription', form.Button, '_save_subscriptions', _('Save subscriptions settings'),\n\t\t\t_('NOTE: Save current settings before updating subscriptions.'));\n\t\to.inputstyle = 'apply';\n\t\to.inputtitle = _('Save current settings');\n\t\to.onclick = function() {\n\t\t\treturn this.map.save(null, true).then(() => {\n\t\t\t\tui.changes.apply(true);\n\t\t\t});\n\t\t}\n\n\t\to = s.taboption('subscription', form.Button, '_update_subscriptions', _('Update nodes from subscriptions'));\n\t\to.inputstyle = 'apply';\n\t\to.inputtitle = function(section_id) {\n\t\t\tlet sublist = uci.get(data[0], section_id, 'subscription_url') || [];\n\t\t\tif (sublist.length > 0) {\n\t\t\t\treturn _('Update %s subscriptions').format(sublist.length);\n\t\t\t} else {\n\t\t\t\tthis.readonly = true;\n\t\t\t\treturn _('No subscription available')\n\t\t\t}\n\t\t}\n\t\to.onclick = function() {\n\t\t\treturn fs.exec_direct('/etc/homeproxy/scripts/update_subscriptions.uc').then((res) => {\n\t\t\t\treturn location.reload();\n\t\t\t}).catch((err) => {\n\t\t\t\tui.addNotification(null, E('p', _('An error occurred during updating subscriptions: %s').format(err)));\n\t\t\t\treturn this.map.reset();\n\t\t\t});\n\t\t}\n\n\t\to = s.taboption('subscription', form.Button, '_remove_subscriptions', _('Remove all nodes from subscriptions'));\n\t\to.inputstyle = 'reset';\n\t\to.inputtitle = function() {\n\t\t\tlet subnodes = [];\n\t\t\tuci.sections(data[0], 'node', (res) => {\n\t\t\t\tif (res.grouphash)\n\t\t\t\t\tsubnodes = subnodes.concat(res['.name'])\n\t\t\t});\n\n\t\t\tif (subnodes.length > 0) {\n\t\t\t\treturn _('Remove %s nodes').format(subnodes.length);\n\t\t\t} else {\n\t\t\t\tthis.readonly = true;\n\t\t\t\treturn _('No subscription node');\n\t\t\t}\n\t\t}\n\t\to.onclick = function() {\n\t\t\tlet subnodes = [];\n\t\t\tuci.sections(data[0], 'node', (res) => {\n\t\t\t\tif (res.grouphash)\n\t\t\t\t\tsubnodes = subnodes.concat(res['.name'])\n\t\t\t});\n\n\t\t\tfor (let i in subnodes)\n\t\t\t\tuci.remove(data[0], subnodes[i]);\n\n\t\t\tif (subnodes.includes(uci.get(data[0], 'config', 'main_node')))\n\t\t\t\tuci.set(data[0], 'config', 'main_node', 'nil');\n\n\t\t\tif (subnodes.includes(uci.get(data[0], 'config', 'main_udp_node')))\n\t\t\t\tuci.set(data[0], 'config', 'main_udp_node', 'nil');\n\n\t\t\tthis.inputtitle = _('%s nodes removed').format(subnodes.length);\n\t\t\tthis.readonly = true;\n\n\t\t\treturn this.map.save(null, true);\n\t\t}\n\t\t/* Subscriptions settings end */\n\n\t\treturn m.render();\n\t}\n});\n"
  },
  {
    "path": "luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/server.js",
    "content": "/*\n * SPDX-License-Identifier: GPL-2.0-only\n *\n * Copyright (C) 2022-2025 ImmortalWrt.org\n */\n\n'use strict';\n'require form';\n'require poll';\n'require rpc';\n'require uci';\n'require ui';\n'require view';\n\n'require homeproxy as hp';\n'require tools.widgets as widgets';\n\nconst callServiceList = rpc.declare({\n\tobject: 'service',\n\tmethod: 'list',\n\tparams: ['name'],\n\texpect: { '': {} }\n});\n\nconst CBIGenValue = form.Value.extend({\n\t__name__: 'CBI.GenValue',\n\n\trenderWidget(/* ... */) {\n\t\tlet node = form.Value.prototype.renderWidget.apply(this, arguments);\n\n\t\tif (!this.password)\n\t\t\tnode.classList.add('control-group');\n\n\t\t(node.querySelector('.control-group') || node).appendChild(E('button', {\n\t\t\tclass: 'cbi-button cbi-button-add',\n\t\t\ttitle: _('Generate'),\n\t\t\tclick: ui.createHandlerFn(this, handleGenKey, this.hp_options || this.option)\n\t\t}, [ _('Generate') ]));\n\n\t\treturn node;\n\t}\n});\n\nfunction getServiceStatus() {\n\treturn L.resolveDefault(callServiceList('homeproxy'), {}).then((res) => {\n\t\tlet isRunning = false;\n\t\ttry {\n\t\t\tisRunning = res['homeproxy']['instances']['sing-box-s']['running'];\n\t\t} catch (e) { }\n\t\treturn isRunning;\n\t});\n}\n\nfunction renderStatus(isRunning, version) {\n\tlet spanTemp = '<em><span style=\"color:%s\"><strong>%s (sing-box v%s) %s</strong></span></em>';\n\tlet renderHTML;\n\tif (isRunning)\n\t\trenderHTML = spanTemp.format('green', _('HomeProxy Server'), version, _('RUNNING'));\n\telse\n\t\trenderHTML = spanTemp.format('red', _('HomeProxy Server'), version, _('NOT RUNNING'));\n\n\treturn renderHTML;\n}\n\nfunction handleGenKey(option) {\n\tlet section_id = this.section.section;\n\tlet type = this.section.getOption('type')?.formvalue(section_id);\n\tlet widget = L.bind((option) => {\n\t\treturn this.map.findElement('id', 'widget.' + this.cbid(section_id).replace(/\\.[^\\.]+$/, '.') + option);\n\t}, this);\n\n\tconst callSingBoxGenerator = rpc.declare({\n\t\tobject: 'luci.homeproxy',\n\t\tmethod: 'singbox_generator',\n\t\tparams: ['type', 'params'],\n\t\texpect: { '': {} }\n\t});\n\n\tif (typeof option === 'object') {\n\t\treturn callSingBoxGenerator(option.type, option.params).then((res) => {\n\t\t\tif (res.result)\n\t\t\t\toption.callback.call(this, res.result).forEach(([k, v]) => {\n\t\t\t\t\twidget(k).value = v ?? '';\n\t\t\t\t});\n\t\t\telse\n\t\t\t\tui.addNotification(null, E('p', _('Failed to generate %s, error: %s.').format(type, res.error)));\n\t\t});\n\t} else {\n\t\tlet password, required_method;\n\n\t\tif (option === 'uuid')\n\t\t\trequired_method = 'uuid';\n\t\telse if (type === 'shadowsocks')\n\t\t\trequired_method = this.section.getOption('shadowsocks_encrypt_method')?.formvalue(section_id);\n\n\t\tswitch (required_method) {\n\t\t\tcase 'none':\n\t\t\t\tpassword = '';\n\t\t\t\tbreak;\n\t\t\tcase 'uuid':\n\t\t\t\tpassword = hp.generateRand('uuid');\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tpassword = hp.generateRand('hex', 16);\n\t\t\t\tbreak;\n\t\t}\n\t\t/* AEAD */\n\t\t((length) => {\n\t\t\tif (length && length > 0)\n\t\t\t\tpassword = hp.generateRand('base64', length);\n\t\t})(hp.shadowsocks_encrypt_length[required_method]);\n\n\t\treturn widget(option).value = password;\n\t}\n}\n\nreturn view.extend({\n\tload() {\n\t\treturn Promise.all([\n\t\t\tuci.load('homeproxy'),\n\t\t\thp.getBuiltinFeatures()\n\t\t]);\n\t},\n\n\trender(data) {\n\t\tlet m, s, o;\n\t\tlet features = data[1];\n\n\t\tm = new form.Map('homeproxy', _('HomeProxy Server'),\n\t\t\t_('The modern ImmortalWrt proxy platform for ARM64/AMD64.'));\n\n\t\ts = m.section(form.TypedSection);\n\t\ts.render = function() {\n\t\t\tpoll.add(() => {\n\t\t\t\treturn L.resolveDefault(getServiceStatus()).then((res) => {\n\t\t\t\t\tlet view = document.getElementById('service_status');\n\t\t\t\t\tview.innerHTML = renderStatus(res, features.version);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn E('div', { class: 'cbi-section', id: 'status_bar' }, [\n\t\t\t\t\tE('p', { id: 'service_status' }, _('Collecting data...'))\n\t\t\t]);\n\t\t}\n\n\t\ts = m.section(form.NamedSection, 'server', 'homeproxy', _('Global settings'));\n\n\t\to = s.option(form.Flag, 'enabled', _('Enable'));\n\t\to.rmempty = false;\n\n\t\ts = m.section(form.GridSection, 'server', _('Server settings'));\n\t\ts.addremove = true;\n\t\ts.rowcolors = true;\n\t\ts.sortable = true;\n\t\ts.nodescriptions = true;\n\t\ts.modaltitle = L.bind(hp.loadModalTitle, this, _('Server'), _('Add a server'), data[0]);\n\t\ts.sectiontitle = L.bind(hp.loadDefaultLabel, this, data[0]);\n\t\ts.renderSectionAdd = L.bind(hp.renderSectionAdd, this, s);\n\n\t\to = s.option(form.Value, 'label', _('Label'));\n\t\to.load = L.bind(hp.loadDefaultLabel, this, data[0]);\n\t\to.validate = L.bind(hp.validateUniqueValue, this, data[0], 'server', 'label');\n\t\to.rmempty = false;\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Flag, 'enabled', _('Enable'));\n\t\to.default = o.enabled;\n\t\to.rmempty = false;\n\t\to.editable = true;\n\n\t\to = s.option(form.Flag, 'firewall', _('Firewall'),\n\t\t\t_('Allow access from the Internet.'));\n\t\to.editable = true;\n\n\t\to = s.option(form.ListValue, 'type', _('Type'));\n\t\to.value('anytls', _('AnyTLS'));\n\t\to.value('http', _('HTTP'));\n\t\tif (features.with_quic) {\n\t\t\to.value('hysteria', _('Hysteria'));\n\t\t\to.value('hysteria2', _('Hysteria2'));\n\t\t\to.value('naive', _('NaïveProxy'));\n\t\t}\n\t\to.value('mixed', _('Mixed'));\n\t\to.value('shadowsocks', _('Shadowsocks'));\n\t\to.value('socks', _('Socks'));\n\t\to.value('trojan', _('Trojan'));\n\t\tif (features.with_quic)\n\t\t\to.value('tuic', _('Tuic'));\n\t\to.value('vless', _('VLESS'));\n\t\to.value('vmess', _('VMess'));\n\t\to.rmempty = false;\n\n\t\to = s.option(form.Value, 'address', _('Listen address'));\n\t\to.placeholder = '::';\n\t\to.datatype = 'ipaddr';\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'port', _('Listen port'),\n\t\t\t_('The port must be unique.'));\n\t\to.datatype = 'port';\n\t\to.validate = L.bind(hp.validateUniqueValue, this, data[0], 'server', 'port');\n\n\t\to = s.option(form.Value, 'username', _('Username'));\n\t\to.depends('type', 'http');\n\t\to.depends('type', 'mixed');\n\t\to.depends('type', 'naive');\n\t\to.depends('type', 'socks');\n\t\to.modalonly = true;\n\n\t\to = s.option(CBIGenValue, 'password', _('Password'));\n\t\to.password = true;\n\t\to.depends('type', 'anytls');\n\t\to.depends({'type': /^(http|mixed|naive|socks)$/, 'username': /[\\s\\S]/});\n\t\to.depends('type', 'hysteria2');\n\t\to.depends('type', 'shadowsocks');\n\t\to.depends('type', 'trojan');\n\t\to.depends('type', 'tuic');\n\t\to.validate = function(section_id, value) {\n\t\t\tif (section_id) {\n\t\t\t\tlet type = this.section.formvalue(section_id, 'type');\n\t\t\t\tlet required_type = [ 'anytls', 'http', 'mixed', 'naive', 'socks', 'shadowsocks', 'trojan' ];\n\n\t\t\t\tif (required_type.includes(type)) {\n\t\t\t\t\tif (type === 'shadowsocks') {\n\t\t\t\t\t\tlet encmode = this.section.formvalue(section_id, 'shadowsocks_encrypt_method');\n\t\t\t\t\t\tif (encmode === 'none')\n\t\t\t\t\t\t\treturn true;\n\t\t\t\t\t\telse if (encmode === '2022-blake3-aes-128-gcm')\n\t\t\t\t\t\t\treturn hp.validateBase64Key(24, section_id, value);\n\t\t\t\t\t\telse if (['2022-blake3-aes-256-gcm', '2022-blake3-chacha20-poly1305'].includes(encmode))\n\t\t\t\t\t\t\treturn hp.validateBase64Key(44, section_id, value);\n\t\t\t\t\t}\n\n\t\t\t\t\tif (!value)\n\t\t\t\t\t\treturn _('Expecting: %s').format(_('non-empty value'));\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t\to.modalonly = true;\n\n\t\t/* AnyTLS config */\n\t\to = s.option(form.DynamicList, 'anytls_padding_scheme', _('Padding scheme'),\n\t\t\t_('AnyTLS padding scheme in array.'));\n\t\to.depends('type', 'anytls');\n\t\to.modalonly = true;\n\n\t\t/* Hysteria (2) config start */\n\t\to = s.option(form.ListValue, 'hysteria_protocol', _('Protocol'));\n\t\to.value('udp');\n\t\t/* WeChat-Video / FakeTCP are unsupported by sing-box currently\n\t\t   o.value('wechat-video');\n\t\t   o.value('faketcp');\n\t\t*/\n\t\to.default = 'udp';\n\t\to.depends('type', 'hysteria');\n\t\to.rmempty = false;\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'hysteria_down_mbps', _('Max download speed'),\n\t\t\t_('Max download speed in Mbps.'));\n\t\to.datatype = 'uinteger';\n\t\to.depends('type', 'hysteria');\n\t\to.depends('type', 'hysteria2');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'hysteria_up_mbps', _('Max upload speed'),\n\t\t\t_('Max upload speed in Mbps.'));\n\t\to.datatype = 'uinteger';\n\t\to.depends('type', 'hysteria');\n\t\to.depends('type', 'hysteria2');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.ListValue, 'hysteria_auth_type', _('Authentication type'));\n\t\to.value('', _('Disable'));\n\t\to.value('base64', _('Base64'));\n\t\to.value('string', _('String'));\n\t\to.depends('type', 'hysteria');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'hysteria_auth_payload', _('Authentication payload'));\n\t\to.password = true;\n\t\to.depends({'type': 'hysteria', 'hysteria_auth_type': /[\\s\\S]/});\n\t\to.rmempty = false;\n\t\to.modalonly = true;\n\n\t\to = s.option(form.ListValue, 'hysteria_obfs_type', _('Obfuscate type'));\n\t\to.value('', _('Disable'));\n\t\to.value('salamander', _('Salamander'));\n\t\to.depends('type', 'hysteria2');\n\t\to.modalonly = true;\n\n\t\to = s.option(CBIGenValue, 'hysteria_obfs_password', _('Obfuscate password'));\n\t\to.password = true;\n\t\to.depends('type', 'hysteria');\n\t\to.depends({'type': 'hysteria2', 'hysteria_obfs_type': /[\\s\\S]/});\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'hysteria_recv_window_conn', _('QUIC stream receive window'),\n\t\t\t_('The QUIC stream-level flow control window for receiving data.'));\n\t\to.datatype = 'uinteger';\n\t\to.default = '67108864';\n\t\to.depends('type', 'hysteria');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'hysteria_recv_window_client', _('QUIC connection receive window'),\n\t\t\t_('The QUIC connection-level flow control window for receiving data.'));\n\t\to.datatype = 'uinteger';\n\t\to.default = '15728640';\n\t\to.depends('type', 'hysteria');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'hysteria_max_conn_client', _('QUIC maximum concurrent bidirectional streams'),\n\t\t\t_('The maximum number of QUIC concurrent bidirectional streams that a peer is allowed to open.'));\n\t\to.datatype = 'uinteger';\n\t\to.default = '1024';\n\t\to.depends('type', 'hysteria');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Flag, 'hysteria_disable_mtu_discovery', _('Disable Path MTU discovery'),\n\t\t\t_('Disables Path MTU Discovery (RFC 8899). Packets will then be at most 1252 (IPv4) / 1232 (IPv6) bytes in size.'));\n\t\to.depends('type', 'hysteria');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Flag, 'hysteria_ignore_client_bandwidth', _('Ignore client bandwidth'),\n\t\t\t_('Tell the client to use the BBR flow control algorithm instead of Hysteria CC.'));\n\t\to.depends({'type': 'hysteria2', 'hysteria_down_mbps': '', 'hysteria_up_mbps': ''});\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'hysteria_masquerade', _('Masquerade'),\n\t\t\t_('HTTP3 server behavior when authentication fails.<br/>A 404 page will be returned if empty.'));\n\t\to.depends('type', 'hysteria2');\n\t\to.modalonly = true;\n\t\t/* Hysteria (2) config end */\n\n\t\t/* Shadowsocks config */\n\t\to = s.option(form.ListValue, 'shadowsocks_encrypt_method', _('Encrypt method'));\n\t\tfor (let i of hp.shadowsocks_encrypt_methods)\n\t\t\to.value(i);\n\t\to.default = 'aes-128-gcm';\n\t\to.depends('type', 'shadowsocks');\n\t\to.modalonly = true;\n\n\t\t/* Tuic config start */\n\t\to = s.option(CBIGenValue, 'uuid', _('UUID'));\n\t\to.password = true;\n\t\to.depends('type', 'tuic');\n\t\to.depends('type', 'vless');\n\t\to.depends('type', 'vmess');\n\t\to.validate = hp.validateUUID;\n\t\to.modalonly = true;\n\n\t\to = s.option(form.ListValue, 'tuic_congestion_control', _('Congestion control algorithm'),\n\t\t\t_('QUIC congestion control algorithm.'));\n\t\to.value('cubic');\n\t\to.value('new_reno');\n\t\to.value('bbr');\n\t\to.default = 'cubic';\n\t\to.depends('type', 'tuic');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'tuic_auth_timeout', _('Auth timeout'),\n\t\t\t_('How long the server should wait for the client to send the authentication command (in seconds).'));\n\t\to.datatype = 'uinteger';\n\t\to.default = '3';\n\t\to.depends('type', 'tuic');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Flag, 'tuic_enable_zero_rtt', _('Enable 0-RTT handshake'),\n\t\t\t_('Enable 0-RTT QUIC connection handshake on the client side. This is not impacting much on the performance, as the protocol is fully multiplexed.<br/>' +\n\t\t\t\t'Disabling this is highly recommended, as it is vulnerable to replay attacks.'));\n\t\to.depends('type', 'tuic');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'tuic_heartbeat', _('Heartbeat interval'),\n\t\t\t_('Interval for sending heartbeat packets for keeping the connection alive (in seconds).'));\n\t\to.datatype = 'uinteger';\n\t\to.default = '10';\n\t\to.depends('type', 'tuic');\n\t\to.modalonly = true;\n\t\t/* Tuic config end */\n\n\t\t/* VLESS / VMess config start */\n\t\to = s.option(form.ListValue, 'vless_flow', _('Flow'));\n\t\to.value('', _('None'));\n\t\to.value('xtls-rprx-vision');\n\t\to.depends('type', 'vless');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'vmess_alterid', _('Alter ID'),\n\t\t\t_('Legacy protocol support (VMess MD5 Authentication) is provided for compatibility purposes only, use of alterId > 1 is not recommended.'));\n\t\to.datatype = 'uinteger';\n\t\to.depends('type', 'vmess');\n\t\to.modalonly = true;\n\t\t/* VMess config end */\n\n\t\t/* Transport config start */\n\t\to = s.option(form.ListValue, 'transport', _('Transport'),\n\t\t\t_('No TCP transport, plain HTTP is merged into the HTTP transport.'));\n\t\to.value('', _('None'));\n\t\to.value('grpc', _('gRPC'));\n\t\to.value('http', _('HTTP'));\n\t\to.value('httpupgrade', _('HTTPUpgrade'));\n\t\to.value('quic', _('QUIC'));\n\t\to.value('ws', _('WebSocket'));\n\t\to.depends('type', 'trojan');\n\t\to.depends('type', 'vless');\n\t\to.depends('type', 'vmess');\n\t\to.onchange = function(ev, section_id, value) {\n\t\t\tlet desc = this.map.findElement('id', 'cbid.homeproxy.%s.transport'.format(section_id)).nextElementSibling;\n\t\t\tif (value === 'http')\n\t\t\t\tdesc.innerHTML = _('TLS is not enforced. If TLS is not configured, plain HTTP 1.1 is used.');\n\t\t\telse if (value === 'quic')\n\t\t\t\tdesc.innerHTML = _('No additional encryption support: It\\'s basically duplicate encryption.');\n\t\t\telse\n\t\t\t\tdesc.innerHTML = _('No TCP transport, plain HTTP is merged into the HTTP transport.');\n\n\t\t\tlet tls_element = this.map.findElement('id', 'cbid.homeproxy.%s.tls'.format(section_id)).firstElementChild;\n\t\t\tif ((value === 'http' && tls_element.checked) || (value === 'grpc' && !features.with_grpc))\n\t\t\t\tthis.map.findElement('id', 'cbid.homeproxy.%s.http_idle_timeout'.format(section_id)).nextElementSibling.innerHTML =\n\t\t\t\t\t_('Specifies the time (in seconds) until idle clients should be closed with a GOAWAY frame. PING frames are not considered as activity.');\n\t\t\telse if (value === 'grpc' && features.with_grpc)\n\t\t\t\tthis.map.findElement('id', 'cbid.homeproxy.%s.http_idle_timeout'.format(section_id)).nextElementSibling.innerHTML =\n\t\t\t\t\t_('If the transport doesn\\'t see any activity after a duration of this time (in seconds), it pings the client to check if the connection is still active.');\n\t\t}\n\t\to.modalonly = true;\n\n\t\t/* gRPC config start */\n\t\to = s.option(form.Value, 'grpc_servicename', _('gRPC service name'));\n\t\to.depends('transport', 'grpc');\n\t\to.modalonly = true;\n\n\t\t/* gRPC config end */\n\n\t\t/* HTTP(Upgrade) config start */\n\t\to = s.option(form.DynamicList, 'http_host', _('Host'));\n\t\to.datatype = 'hostname';\n\t\to.depends('transport', 'http');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'httpupgrade_host', _('Host'));\n\t\to.datatype = 'hostname';\n\t\to.depends('transport', 'httpupgrade');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'http_path', _('Path'));\n\t\to.depends('transport', 'http');\n\t\to.depends('transport', 'httpupgrade');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'http_method', _('Method'));\n\t\to.depends('transport', 'http');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'http_idle_timeout', _('Idle timeout'),\n\t\t\t_('Specifies the time (in seconds) until idle clients should be closed with a GOAWAY frame. PING frames are not considered as activity.'));\n\t\to.datatype = 'uinteger';\n\t\to.depends('transport', 'grpc');\n\t\to.depends({'transport': 'http', 'tls': '1'});\n\t\to.modalonly = true;\n\n\t\tif (features.with_grpc) {\n\t\t\to = s.option(form.Value, 'http_ping_timeout', _('Ping timeout'),\n\t\t\t\t_('The timeout (in seconds) that after performing a keepalive check, the client will wait for activity. If no activity is detected, the connection will be closed.'));\n\t\t\to.datatype = 'uinteger';\n\t\t\to.depends('transport', 'grpc');\n\t\t\to.modalonly = true;\n\t\t}\n\t\t/* HTTP config end */\n\n\t\t/* WebSocket config start */\n\t\to = s.option(form.Value, 'ws_host', _('Host'));\n\t\to.depends('transport', 'ws');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'ws_path', _('Path'));\n\t\to.depends('transport', 'ws');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'websocket_early_data', _('Early data'),\n\t\t\t_('Allowed payload size is in the request.'));\n\t\to.datatype = 'uinteger';\n\t\to.value('2048');\n\t\to.depends('transport', 'ws');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'websocket_early_data_header', _('Early data header name'),\n\t\t\t_('Early data is sent in path instead of header by default.') +\n\t\t\t'<br/>' +\n\t\t\t_('To be compatible with Xray-core, set this to <code>Sec-WebSocket-Protocol</code>.'));\n\t\to.value('Sec-WebSocket-Protocol');\n\t\to.depends('transport', 'ws');\n\t\to.modalonly = true;\n\t\t/* WebSocket config end */\n\n\t\t/* Transport config end */\n\n\t\t/* Mux config start */\n\t\to = s.option(form.Flag, 'multiplex', _('Multiplex'));\n\t\to.depends('type', 'shadowsocks');\n\t\to.depends('type', 'trojan');\n\t\to.depends('type', 'vless');\n\t\to.depends('type', 'vmess');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Flag, 'multiplex_padding', _('Enable padding'));\n\t\to.depends('multiplex', '1');\n\t\to.modalonly = true;\n\n\t\tif (features.hp_has_tcp_brutal) {\n\t\t\to = s.option(form.Flag, 'multiplex_brutal', _('Enable TCP Brutal'),\n\t\t\t\t_('Enable TCP Brutal congestion control algorithm'));\n\t\t\to.depends('multiplex', '1');\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.Value, 'multiplex_brutal_down', _('Download bandwidth'),\n\t\t\t\t_('Download bandwidth in Mbps.'));\n\t\t\to.datatype = 'uinteger';\n\t\t\to.depends('multiplex_brutal', '1');\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.Value, 'multiplex_brutal_up', _('Upload bandwidth'),\n\t\t\t\t_('Upload bandwidth in Mbps.'));\n\t\t\to.datatype = 'uinteger';\n\t\t\to.depends('multiplex_brutal', '1');\n\t\t\to.modalonly = true;\n\t\t}\n\t\t/* Mux config end */\n\n\t\t/* TLS config start */\n\t\to = s.option(form.Flag, 'tls', _('TLS'));\n\t\to.depends('type', 'anytls');\n\t\to.depends('type', 'http');\n\t\to.depends('type', 'hysteria');\n\t\to.depends('type', 'hysteria2');\n\t\to.depends('type', 'naive');\n\t\to.depends('type', 'trojan');\n\t\to.depends('type', 'tuic');\n\t\to.depends('type', 'vless');\n\t\to.depends('type', 'vmess');\n\t\to.rmempty = false;\n\t\to.validate = function(section_id, value) {\n\t\t\tif (section_id) {\n\t\t\t\tlet type = this.map.lookupOption('type', section_id)[0].formvalue(section_id);\n\t\t\t\tlet tls = this.map.findElement('id', 'cbid.homeproxy.%s.tls'.format(section_id)).firstElementChild;\n\n\t\t\t\tif (['hysteria', 'hysteria2', 'tuic'].includes(type)) {\n\t\t\t\t\ttls.checked = true;\n\t\t\t\t\ttls.disabled = true;\n\t\t\t\t} else {\n\t\t\t\t\ttls.disabled = null;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\treturn true;\n\t\t}\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'tls_sni', _('TLS SNI'),\n\t\t\t_('Used to verify the hostname on the returned certificates unless insecure is given.'));\n\t\to.depends('tls', '1');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.DynamicList, 'tls_alpn', _('TLS ALPN'),\n\t\t\t_('List of supported application level protocols, in order of preference.'));\n\t\to.depends('tls', '1');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.ListValue, 'tls_min_version', _('Minimum TLS version'),\n\t\t\t_('The minimum TLS version that is acceptable.'));\n\t\to.value('', _('default'));\n\t\tfor (let i of hp.tls_versions)\n\t\t\to.value(i);\n\t\to.depends('tls', '1');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.ListValue, 'tls_max_version', _('Maximum TLS version'),\n\t\t\t_('The maximum TLS version that is acceptable.'));\n\t\to.value('', _('default'));\n\t\tfor (let i of hp.tls_versions)\n\t\t\to.value(i);\n\t\to.depends('tls', '1');\n\t\to.modalonly = true;\n\n\t\to = s.option(hp.CBIStaticList, 'tls_cipher_suites', _('Cipher suites'),\n\t\t\t_('The elliptic curves that will be used in an ECDHE handshake, in preference order. If empty, the default will be used.'));\n\t\tfor (let i of hp.tls_cipher_suites)\n\t\t\to.value(i);\n\t\to.depends('tls', '1');\n\t\to.optional = true;\n\t\to.modalonly = true;\n\n\t\tif (features.with_acme) {\n\t\t\to = s.option(form.Flag, 'tls_acme', _('Enable ACME'),\n\t\t\t\t_('Use ACME TLS certificate issuer.'));\n\t\t\to.depends('tls', '1');\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.DynamicList, 'tls_acme_domain', _('Domains'));\n\t\t\to.datatype = 'hostname';\n\t\t\to.depends('tls_acme', '1');\n\t\t\to.rmempty = false;\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.Value, 'tls_acme_dsn', _('Default server name'),\n\t\t\t\t_('Server name to use when choosing a certificate if the ClientHello\\'s ServerName field is empty.'));\n\t\t\to.depends('tls_acme', '1');\n\t\t\to.rmempty = false;\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.Value, 'tls_acme_email', _('Email'),\n\t\t\t\t_('The email address to use when creating or selecting an existing ACME server account.'));\n\t\t\to.depends('tls_acme', '1');\n\t\t\to.validate = function(section_id, value) {\n\t\t\t\tif (section_id) {\n\t\t\t\t\tif (!value)\n\t\t\t\t\t\treturn _('Expecting: %s').format('non-empty value');\n\t\t\t\t\telse if (!value.match(/^[^\\s@]+@[^\\s@]+\\.[^\\s@]+$/))\n\t\t\t\t\t\treturn _('Expecting: %s').format('valid email address');\n\t\t\t\t}\n\n\t\t\t\treturn true;\n\t\t\t}\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.Value, 'tls_acme_provider', _('CA provider'),\n\t\t\t\t_('The ACME CA provider to use.'));\n\t\t\to.value('letsencrypt', _('Let\\'s Encrypt'));\n\t\t\to.value('zerossl', _('ZeroSSL'));\n\t\t\to.depends('tls_acme', '1');\n\t\t\to.rmempty = false;\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.Flag, 'tls_dns01_challenge', _('DNS01 challenge'))\n\t\t\to.depends('tls_acme', '1');\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.ListValue, 'tls_dns01_provider', _('DNS provider'));\n\t\t\to.value('alidns', _('Alibaba Cloud DNS'));\n\t\t\to.value('cloudflare', _('Cloudflare'));\n\t\t\to.depends('tls_dns01_challenge', '1');\n\t\t\to.default = 'cloudflare';\n\t\t\to.rmempty = false;\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.Value, 'tls_dns01_ali_akid', _('Access key ID'));\n\t\t\to.password = true;\n\t\t\to.depends('tls_dns01_provider', 'alidns');\n\t\t\to.rmempty = false;\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.Value, 'tls_dns01_ali_aksec', _('Access key secret'));\n\t\t\to.password = true;\n\t\t\to.depends('tls_dns01_provider', 'alidns');\n\t\t\to.rmempty = false;\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.Value, 'tls_dns01_ali_rid', _('Region ID'));\n\t\t\to.depends('tls_dns01_provider', 'alidns');\n\t\t\to.rmempty = false;\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.Value, 'tls_dns01_cf_api_token', _('API token'));\n\t\t\to.password = true;\n\t\t\to.depends('tls_dns01_provider', 'cloudflare');\n\t\t\to.rmempty = false;\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.Flag, 'tls_acme_dhc', _('Disable HTTP challenge'));\n\t\t\to.depends('tls_dns01_challenge', '0');\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.Flag, 'tls_acme_dtac', _('Disable TLS ALPN challenge'));\n\t\t\to.depends('tls_dns01_challenge', '0');\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.Value, 'tls_acme_ahp', _('Alternative HTTP port'),\n\t\t\t\t_('The alternate port to use for the ACME HTTP challenge; if non-empty, this port will be used instead of 80 to spin up a listener for the HTTP challenge.'));\n\t\t\to.datatype = 'port';\n\t\t\to.depends('tls_dns01_challenge', '0');\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.Value, 'tls_acme_atp', _('Alternative TLS port'),\n\t\t\t\t_('The alternate port to use for the ACME TLS-ALPN challenge; the system must forward 443 to this port for challenge to succeed.'));\n\t\t\to.datatype = 'port';\n\t\t\to.depends('tls_dns01_challenge', '0');\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.Flag, 'tls_acme_external_account', _('External Account Binding'),\n\t\t\t\t_('EAB (External Account Binding) contains information necessary to bind or map an ACME account to some other account known by the CA.' +\n\t\t\t\t'<br/>External account bindings are \"used to associate an ACME account with an existing account in a non-ACME system, such as a CA customer database.'));\n\t\t\to.depends('tls_acme', '1');\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.Value, 'tls_acme_ea_keyid', _('External account key ID'));\n\t\t\to.password = true;\n\t\t\to.depends('tls_acme_external_account', '1');\n\t\t\to.rmempty = false;\n\t\t\to.modalonly = true;\n\n\t\t\to = s.option(form.Value, 'tls_acme_ea_mackey', _('External account MAC key'));\n\t\t\to.password = true;\n\t\t\to.depends('tls_acme_external_account', '1');\n\t\t\to.rmempty = false;\n\t\t\to.modalonly = true;\n\t\t}\n\n\t\to = s.option(form.Flag, 'tls_reality', _('REALITY'));\n\t\to.depends({'tls': '1', 'tls_acme': '0', 'type': /^(anytls|vless)$/});\n\t\to.depends({'tls': '1', 'tls_acme': null, 'type': /^(anytls|vless)$/});\n\t\to.modalonly = true;\n\n\t\to = s.option(CBIGenValue, 'tls_reality_private_key', _('REALITY private key'));\n\t\to.password = true;\n\t\to.hp_options = {\n\t\t\ttype: 'reality-keypair',\n\t\t\tparams: '',\n\t\t\tcallback: function(result) {\n\t\t\t\treturn [\n\t\t\t\t\t[this.option, result.private_key],\n\t\t\t\t\t['tls_reality_public_key', result.public_key]\n\t\t\t\t]\n\t\t\t}\n\t\t}\n\t\to.depends('tls_reality', '1');\n\t\to.rmempty = false;\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'tls_reality_public_key', _('REALITY public key'));\n\t\to.depends('tls_reality', '1');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.DynamicList, 'tls_reality_short_id', _('REALITY short ID'));\n\t\to.depends('tls_reality', '1');\n\t\to.rmempty = false;\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'tls_reality_max_time_difference', _('Max time difference'),\n\t\t\t_('The maximum time difference between the server and the client.'));\n\t\to.depends('tls_reality', '1');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'tls_reality_server_addr', _('Handshake server address'));\n\t\to.datatype = 'hostname';\n\t\to.depends('tls_reality', '1');\n\t\to.rmempty = false;\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'tls_reality_server_port', _('Handshake server port'));\n\t\to.datatype = 'port';\n\t\to.depends('tls_reality', '1');\n\t\to.rmempty = false;\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'tls_cert_path', _('Certificate path'),\n\t\t\t_('The server public key, in PEM format.'));\n\t\to.value('/etc/homeproxy/certs/server_publickey.pem');\n\t\to.depends({'tls': '1', 'tls_acme': '0', 'tls_reality': null});\n\t\to.depends({'tls': '1', 'tls_acme': '0', 'tls_reality': '0'});\n\t\to.depends({'tls': '1', 'tls_acme': null, 'tls_reality': '0'});\n\t\to.depends({'tls': '1', 'tls_acme': null, 'tls_reality': null});\n\t\to.validate = hp.validateCertificatePath;\n\t\to.rmempty = false;\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Button, '_upload_cert', _('Upload certificate'),\n\t\t\t_('<strong>Save your configuration before uploading files!</strong>'));\n\t\to.inputstyle = 'action';\n\t\to.inputtitle = _('Upload...');\n\t\to.depends({'tls': '1', 'tls_cert_path': '/etc/homeproxy/certs/server_publickey.pem'});\n\t\to.onclick = L.bind(hp.uploadCertificate, this, _('certificate'), 'server_publickey');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'tls_key_path', _('Key path'),\n\t\t\t_('The server private key, in PEM format.'));\n\t\to.value('/etc/homeproxy/certs/server_privatekey.pem');\n\t\to.depends({'tls': '1', 'tls_acme': '0', 'tls_reality': '0'});\n\t\to.depends({'tls': '1', 'tls_acme': '0', 'tls_reality': null});\n\t\to.depends({'tls': '1', 'tls_acme': null, 'tls_reality': '0'});\n\t\to.depends({'tls': '1', 'tls_acme': null, 'tls_reality': null});\n\t\to.validate = hp.validateCertificatePath;\n\t\to.rmempty = false;\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Button, '_upload_key', _('Upload key'),\n\t\t\t_('<strong>Save your configuration before uploading files!</strong>'));\n\t\to.inputstyle = 'action';\n\t\to.inputtitle = _('Upload...');\n\t\to.depends({'tls': '1', 'tls_key_path': '/etc/homeproxy/certs/server_privatekey.pem'});\n\t\to.onclick = L.bind(hp.uploadCertificate, this, _('private key'), 'server_privatekey');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.TextValue, 'tls_ech_key', _('ECH key'));\n\t\to.placeholder = '-----BEGIN ECH KEYS-----\\nACBE2+piYBLrOywCbRYU+ZpEkk8keeBlUXbKqLRmQ/68FwBL/g0ARwAAIAAgn8HI\\n93RfdV/LaDk+LC9H4h+4WhVBFmWKdhiT3vvpGi8ACAABAAEAAQADABRvdXRlci1z\\nbmkuYW55LmRvbWFpbgAA\\n-----END ECH KEYS-----';\n\t\to.monospace = true;\n\t\to.cols = 30\n\t\to.rows = 3;\n\t\to.hp_options = {\n\t\t\ttype: 'ech-keypair',\n\t\t\tparams: '',\n\t\t\tcallback: function(result) {\n\t\t\t\treturn [\n\t\t\t\t\t[this.option, result.ech_key],\n\t\t\t\t\t['tls_ech_config', result.ech_cfg]\n\t\t\t\t]\n\t\t\t}\n\t\t}\n\t\to.renderWidget = function(section_id, option_index, cfgvalue) {\n\t\t\tlet node = form.TextValue.prototype.renderWidget.apply(this, arguments);\n\t\t\tconst cbid = this.cbid(section_id) + '._outer_sni';\n\n\t\t\tnode.appendChild(E('div',  { 'class': 'control-group' }, [\n\t\t\t\tE('input', {\n\t\t\t\t\tid: cbid,\n\t\t\t\t\tclass: 'cbi-input-text',\n\t\t\t\t\tstyle: 'width: 10em',\n\t\t\t\t\tplaceholder: 'outer-sni.any.domain'\n\t\t\t\t}),\n\t\t\t\tE('button', {\n\t\t\t\t\tclass: 'cbi-button cbi-button-add',\n\t\t\t\t\tclick: ui.createHandlerFn(this, () => {\n\t\t\t\t\t\tthis.hp_options.params = document.getElementById(cbid).value;\n\n\t\t\t\t\t\treturn handleGenKey.call(this, this.hp_options);\n\t\t\t\t\t})\n\t\t\t\t}, [ _('Generate') ])\n\t\t\t]));\n\n\t\t\treturn node;\n\t\t}\n\t\to.depends('tls', '1');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.TextValue, 'tls_ech_config', _('ECH config'));\n\t\to.placeholder = '-----BEGIN ECH CONFIGS-----\\nAEv+DQBHAAAgACCfwcj3dF91X8toOT4sL0fiH7haFUEWZYp2GJPe++kaLwAIAAEA\\nAQABAAMAFG91dGVyLXNuaS5hbnkuZG9tYWluAAA=\\n-----END ECH CONFIGS-----';\n\t\to.monospace = true;\n\t\to.cols = 30\n\t\to.rows = 3;\n\t\to.depends('tls', '1');\n\t\to.modalonly = true;\n\t\t/* TLS config end */\n\n\t\t/* Extra settings start */\n\t\to = s.option(form.Flag, 'tcp_fast_open', _('TCP fast open'),\n\t\t\t_('Enable tcp fast open for listener.'));\n\t\to.depends({'network': 'udp', '!reverse': true});\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Flag, 'tcp_multi_path', _('MultiPath TCP'));\n\t\to.depends({'network': 'udp', '!reverse': true});\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Flag, 'udp_fragment', _('UDP Fragment'),\n\t\t\t_('Enable UDP fragmentation.'));\n\t\to.depends({'network': 'tcp', '!reverse': true});\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'udp_timeout', _('UDP NAT expiration time'),\n\t\t\t_('In seconds.'));\n\t\to.datatype = 'uinteger';\n\t\to.placeholder = '300';\n\t\to.depends({'network': 'tcp', '!reverse': true});\n\t\to.modalonly = true;\n\n\t\to = s.option(form.ListValue, 'network', _('Network'));\n\t\to.value('tcp', _('TCP'));\n\t\to.value('udp', _('UDP'));\n\t\to.value('', _('Both'));\n\t\to.depends('type', 'naive');\n\t\to.depends('type', 'shadowsocks');\n\t\to.modalonly = true;\n\n\t\to = s.option(widgets.DeviceSelect, 'bind_interface', _('Bind interface'),\n\t\t\t_('The network interface to bind to.'));\n\t\to.multiple = false;\n\t\to.noaliases = true;\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Flag, 'reuse_addr', _('Reuse address'),\n\t\t\t_('Reuse listener address.'));\n\t\to.modalonly = true;\n\t\t/* Extra settings end */\n\n\t\treturn m.render();\n\t}\n});\n"
  },
  {
    "path": "luci-app-homeproxy/htdocs/luci-static/resources/view/homeproxy/status.js",
    "content": "/*\n * SPDX-License-Identifier: GPL-2.0-only\n *\n * Copyright (C) 2022-2025 ImmortalWrt.org\n */\n\n'use strict';\n'require dom';\n'require form';\n'require fs';\n'require poll';\n'require rpc';\n'require uci';\n'require ui';\n'require view';\n\n/* Thanks to luci-app-aria2 */\nconst css = '\t\t\t\t\\\n#log_textarea {\t\t\t\t\\\n\tpadding: 10px;\t\t\t\\\n\ttext-align: left;\t\t\\\n}\t\t\t\t\t\\\n#log_textarea pre {\t\t\t\\\n\tpadding: .5rem;\t\t\t\\\n\tword-break: break-all;\t\t\\\n\tmargin: 0;\t\t\t\\\n}\t\t\t\t\t\\\n.description {\t\t\t\t\\\n\tbackground-color: #33ccff;\t\\\n}';\n\nconst hp_dir = '/var/run/homeproxy';\n\nfunction getConnStat(o, site) {\n\tconst callConnStat = rpc.declare({\n\t\tobject: 'luci.homeproxy',\n\t\tmethod: 'connection_check',\n\t\tparams: ['site'],\n\t\texpect: { '': {} }\n\t});\n\n\to.default = E('div', { 'style': 'cbi-value-field' }, [\n\t\tE('button', {\n\t\t\t'class': 'btn cbi-button cbi-button-action',\n\t\t\t'click': ui.createHandlerFn(this, () => {\n\t\t\t\treturn L.resolveDefault(callConnStat(site), {}).then((ret) => {\n                                        let ele = o.default.firstElementChild.nextElementSibling;\n\t\t\t\t\tif (ret.result) {\n\t\t\t\t\t\tele.style.setProperty('color', 'green');\n                                                ele.innerHTML = _('passed');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tele.style.setProperty('color', 'red');\n                                                ele.innerHTML = _('failed');\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t})\n\t\t}, [ _('Check') ]),\n\t\t' ',\n\t\tE('strong', { 'style': 'color:gray' }, _('unchecked')),\n\t]);\n}\n\nfunction getResVersion(o, type) {\n\tconst callResVersion = rpc.declare({\n\t\tobject: 'luci.homeproxy',\n\t\tmethod: 'resources_get_version',\n\t\tparams: ['type'],\n\t\texpect: { '': {} }\n\t});\n\n\tconst callResUpdate = rpc.declare({\n\t\tobject: 'luci.homeproxy',\n\t\tmethod: 'resources_update',\n\t\tparams: ['type'],\n\t\texpect: { '': {} }\n\t});\n\n\treturn L.resolveDefault(callResVersion(type), {}).then((res) => {\n\t\tlet spanTemp = E('div', { 'style': 'cbi-value-field' }, [\n\t\t\tE('button', {\n\t\t\t\t'class': 'btn cbi-button cbi-button-action',\n\t\t\t\t'click': ui.createHandlerFn(this, () => {\n\t\t\t\t\treturn L.resolveDefault(callResUpdate(type), {}).then((res) => {\n\t\t\t\t\t\tswitch (res.status) {\n\t\t\t\t\t\tcase 0:\n\t\t\t\t\t\t\to.description = _('Successfully updated.');\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 1:\n\t\t\t\t\t\t\to.description = _('Update failed.');\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 2:\n\t\t\t\t\t\t\to.description = _('Already in updating.');\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 3:\n\t\t\t\t\t\t\to.description = _('Already at the latest version.');\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\to.description = _('Unknown error.');\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\treturn o.map.reset();\n\t\t\t\t\t});\n\t\t\t\t})\n\t\t\t}, [ _('Check update') ]),\n\t\t\t' ',\n\t\t\tE('strong', { 'style': (res.error ? 'color:red' : 'color:green') },\n\t\t\t\t[ res.error ? 'not found' : res.version ]\n\t\t\t),\n\t\t]);\n\n\t\to.default = spanTemp;\n\t});\n}\n\nfunction getRuntimeLog(o, name, _option_index, section_id, _in_table) {\n\tconst filename = o.option.split('_')[1];\n\n\tlet section, log_level_el;\n\tswitch (filename) {\n\tcase 'homeproxy':\n\t\tsection = null;\n\t\tbreak;\n\tcase 'sing-box-c':\n\t\tsection = 'config';\n\t\tbreak;\n\tcase 'sing-box-s':\n\t\tsection = 'server';\n\t\tbreak;\n\t}\n\n\tif (section) {\n\t\tconst selected = uci.get('homeproxy', section, 'log_level') || 'warn';\n\t\tconst choices = {\n\t\t\ttrace: _('Trace'),\n\t\t\tdebug: _('Debug'),\n\t\t\tinfo: _('Info'),\n\t\t\twarn: _('Warn'),\n\t\t\terror: _('Error'),\n\t\t\tfatal: _('Fatal'),\n\t\t\tpanic: _('Panic')\n\t\t};\n\n\t\tlog_level_el = E('select', {\n\t\t\t'id': o.cbid(section_id),\n\t\t\t'class': 'cbi-input-select',\n\t\t\t'style': 'margin-left: 4px; width: 6em;',\n\t\t\t'change': ui.createHandlerFn(this, (ev) => {\n\t\t\t\tuci.set('homeproxy', section, 'log_level', ev.target.value);\n\t\t\t\treturn o.map.save(null, true).then(() => {\n\t\t\t\t\tui.changes.apply(true);\n\t\t\t\t});\n\t\t\t})\n\t\t});\n\n\t\tObject.keys(choices).forEach((v) => {\n\t\t\tlog_level_el.appendChild(E('option', {\n\t\t\t\t'value': v,\n\t\t\t\t'selected': (v === selected) ? '' : null\n\t\t\t}, [ choices[v] ]));\n\t\t});\n\t}\n\n\tconst callLogClean = rpc.declare({\n\t\tobject: 'luci.homeproxy',\n\t\tmethod: 'log_clean',\n\t\tparams: ['type'],\n\t\texpect: { '': {} }\n\t});\n\n\tconst log_textarea = E('div', { 'id': 'log_textarea' },\n\t\tE('img', {\n\t\t\t'src': L.resource('icons/loading.svg'),\n\t\t\t'alt': _('Loading'),\n\t\t\t'style': 'vertical-align:middle'\n\t\t}, _('Collecting data...'))\n\t);\n\n\tlet log;\n\tpoll.add(L.bind(() => {\n\t\treturn fs.read_direct(String.format('%s/%s.log', hp_dir, filename), 'text')\n\t\t.then((res) => {\n\t\t\tlog = E('pre', { 'wrap': 'pre' }, [\n\t\t\t\tres.trim() || _('Log is empty.')\n\t\t\t]);\n\n\t\t\tdom.content(log_textarea, log);\n\t\t}).catch((err) => {\n\t\t\tif (err.toString().includes('NotFoundError'))\n\t\t\t\tlog = E('pre', { 'wrap': 'pre' }, [\n\t\t\t\t\t_('Log file does not exist.')\n\t\t\t\t]);\n\t\t\telse\n\t\t\t\tlog = E('pre', { 'wrap': 'pre' }, [\n\t\t\t\t\t_('Unknown error: %s').format(err)\n\t\t\t\t]);\n\n\t\t\tdom.content(log_textarea, log);\n\t\t});\n\t}));\n\n\treturn E([\n\t\tE('style', [ css ]),\n\t\tE('div', {'class': 'cbi-map'}, [\n\t\t\tE('h3', {'name': 'content', 'style': 'align-items: center; display: flex;'}, [\n\t\t\t\t_('%s log').format(name),\n\t\t\t\tlog_level_el || '',\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'btn cbi-button cbi-button-action',\n\t\t\t\t\t'style': 'margin-left: 4px;',\n\t\t\t\t\t'click': ui.createHandlerFn(this, () => {\n\t\t\t\t\t\treturn L.resolveDefault(callLogClean(filename), {});\n\t\t\t\t\t})\n\t\t\t\t}, [ _('Clean log') ])\n\t\t\t]),\n\t\t\tE('div', {'class': 'cbi-section'}, [\n\t\t\t\tlog_textarea,\n\t\t\t\tE('div', {'style': 'text-align:right'},\n\t\t\t\t\tE('small', {}, _('Refresh every %s seconds.').format(L.env.pollinterval))\n\t\t\t\t)\n\t\t\t])\n\t\t])\n\t]);\n}\n\nreturn view.extend({\n\trender() {\n\t\tlet m, s, o;\n\n\t\tm = new form.Map('homeproxy');\n\n\t\ts = m.section(form.NamedSection, 'config', 'homeproxy', _('Connection check'));\n\t\ts.anonymous = true;\n\n\t\to = s.option(form.DummyValue, '_check_baidu', _('BaiDu'));\n\t\to.cfgvalue = L.bind(getConnStat, this, o, 'baidu');\n\n\t\to = s.option(form.DummyValue, '_check_google', _('Google'));\n\t\to.cfgvalue = L.bind(getConnStat, this, o, 'google');\n\n\t\ts = m.section(form.NamedSection, 'config', 'homeproxy', _('Resources management'));\n\t\ts.anonymous = true;\n\n\t\to = s.option(form.DummyValue, '_china_ip4_version', _('China IPv4 list version'));\n\t\to.cfgvalue = L.bind(getResVersion, this, o, 'china_ip4');\n\t\to.rawhtml = true;\n\n\t\to = s.option(form.DummyValue, '_china_ip6_version', _('China IPv6 list version'));\n\t\to.cfgvalue = L.bind(getResVersion, this, o, 'china_ip6');\n\t\to.rawhtml = true;\n\n\t\to = s.option(form.DummyValue, '_china_list_version', _('China list version'));\n\t\to.cfgvalue = L.bind(getResVersion, this, o, 'china_list');\n\t\to.rawhtml = true;\n\n\t\to = s.option(form.DummyValue, '_gfw_list_version', _('GFW list version'));\n\t\to.cfgvalue = L.bind(getResVersion, this, o, 'gfw_list');\n\t\to.rawhtml = true;\n\n\t\to = s.option(form.Value, 'github_token', _('GitHub token'));\n\t\to.password = true;\n\t\to.renderWidget = function() {\n\t\t\tlet node = form.Value.prototype.renderWidget.apply(this, arguments);\n\n\t\t\t(node.querySelector('.control-group') || node).appendChild(E('button', {\n\t\t\t\t'class': 'cbi-button cbi-button-apply',\n\t\t\t\t'title': _('Save'),\n\t\t\t\t'click': ui.createHandlerFn(this, () => {\n\t\t\t\t\treturn this.map.save(null, true).then(() => {\n\t\t\t\t\t\tui.changes.apply(true);\n\t\t\t\t\t});\n\t\t\t\t}, this.option)\n\t\t\t}, [ _('Save') ]));\n\n\t\t\treturn node;\n\t\t}\n\n\t\ts = m.section(form.NamedSection, 'config', 'homeproxy');\n\t\ts.anonymous = true;\n\n\t\to = s.option(form.DummyValue, '_homeproxy_logview');\n\t\to.render = L.bind(getRuntimeLog, this, o, _('HomeProxy'));\n\n\t\to = s.option(form.DummyValue, '_sing-box-c_logview');\n\t\to.render = L.bind(getRuntimeLog, this, o, _('sing-box client'));\n\n\t\to = s.option(form.DummyValue, '_sing-box-s_logview');\n\t\to.render = L.bind(getRuntimeLog, this, o, _('sing-box server'));\n\n\t\treturn m.render();\n\t},\n\n\thandleSaveApply: null,\n\thandleSave: null,\n\thandleReset: null\n});\n"
  },
  {
    "path": "luci-app-homeproxy/po/templates/homeproxy.pot",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:206\nmsgid \"%s log\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1456\nmsgid \"%s nodes removed\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/homeproxy.js:279\nmsgid \"/etc/homeproxy/certs/..., /etc/acme/..., /etc/ssl/...\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:609\nmsgid \"4 or 6. Not limited if empty.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:775\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1210\nmsgid \"\"\n\"<code>%s</code> will be temporarily overwritten to <code>%s</code> after 50 \"\n\"triggers in 30s if not enabled.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1086\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1105\n#: htdocs/luci-static/resources/view/homeproxy/server.js:768\n#: htdocs/luci-static/resources/view/homeproxy/server.js:787\nmsgid \"<strong>Save your configuration before uploading files!</strong>\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:664\nmsgid \"API token\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:670\nmsgid \"Accept any if empty.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1138\nmsgid \"Accept empty query response\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1399\nmsgid \"Access Control\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:647\nmsgid \"Access key ID\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:653\nmsgid \"Access key secret\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:669\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1146\nmsgid \"Action\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1056\nmsgid \"Add a DNS rule\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:933\nmsgid \"Add a DNS server\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:396\nmsgid \"Add a node\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:405\nmsgid \"Add a routing node\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:576\nmsgid \"Add a routing rule\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1320\nmsgid \"Add a rule set\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:156\nmsgid \"Add a server\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:975\nmsgid \"Additional headers to be sent to the DNS server.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:957\n#: htdocs/luci-static/resources/view/homeproxy/node.js:448\nmsgid \"Address\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:988\nmsgid \"Address resolver\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1020\nmsgid \"Address strategy\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:640\nmsgid \"Alibaba Cloud DNS\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:186\n#: htdocs/luci-static/resources/view/homeproxy/client.js:220\nmsgid \"Aliyun Public DNS (223.5.5.5)\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:266\nmsgid \"All ports\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:172\nmsgid \"Allow access from the Internet.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1040\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1382\nmsgid \"Allow insecure\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1041\nmsgid \"Allow insecure connection at TLS client.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1383\nmsgid \"Allow insecure connection by default when add nodes from subscriptions.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:874\n#: htdocs/luci-static/resources/view/homeproxy/server.js:482\nmsgid \"Allowed payload size is in the request.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:95\nmsgid \"Already at the latest version.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:92\nmsgid \"Already in updating.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:742\n#: htdocs/luci-static/resources/view/homeproxy/server.js:391\nmsgid \"Alter ID\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:678\nmsgid \"Alternative HTTP port\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:684\nmsgid \"Alternative TLS port\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1419\nmsgid \"An error occurred during updating subscriptions: %s\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1227\nmsgid \"Answer\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:429\n#: htdocs/luci-static/resources/view/homeproxy/server.js:176\nmsgid \"AnyTLS\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:245\nmsgid \"AnyTLS padding scheme in array.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:799\n#: htdocs/luci-static/resources/view/homeproxy/client.js:909\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1195\nmsgid \"\"\n\"Append a <code>edns0-subnet</code> OPT extra record with the specified IP \"\n\"prefix to every query by default.<br/>If value is an IP address instead of \"\n\"prefix, <code>/32</code> or <code>/128</code> will be appended automatically.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1072\nmsgid \"Append self-signed certificate\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:407\nmsgid \"Applied\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:400\n#: htdocs/luci-static/resources/view/homeproxy/node.js:410\nmsgid \"Apply\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:18\nmsgid \"Are you sure to allow insecure?\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:363\nmsgid \"Auth timeout\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:766\nmsgid \"Authenticated length\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:561\n#: htdocs/luci-static/resources/view/homeproxy/server.js:282\nmsgid \"Authentication payload\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:554\n#: htdocs/luci-static/resources/view/homeproxy/server.js:275\nmsgid \"Authentication type\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1335\nmsgid \"Auto update\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1336\nmsgid \"Auto update subscriptions and geodata.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:702\nmsgid \"BBR\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:235\nmsgid \"BaiDu\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:556\n#: htdocs/luci-static/resources/view/homeproxy/server.js:277\nmsgid \"Base64\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:323\nmsgid \"Based on google/gvisor.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1341\nmsgid \"Binary file\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:453\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1412\n#: htdocs/luci-static/resources/view/homeproxy/server.js:874\nmsgid \"Bind interface\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1413\nmsgid \"\"\n\"Bind outbound traffic to specific interface. Leave empty to auto detect.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:617\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1106\nmsgid \"BitTorrent\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1369\nmsgid \"Blacklist mode\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:365\nmsgid \"Block\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:612\n#: htdocs/luci-static/resources/view/homeproxy/client.js:640\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1092\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1102\n#: htdocs/luci-static/resources/view/homeproxy/server.js:869\nmsgid \"Both\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:343\nmsgid \"Bypass CN traffic\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:253\nmsgid \"Bypass mainland China\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:344\nmsgid \"Bypass mainland China traffic via firewall rules by default.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:627\nmsgid \"CA provider\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:221\nmsgid \"CNNIC Public DNS (210.2.4.8)\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:700\nmsgid \"CUBIC\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1239\nmsgid \"Cancel\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1077\n#: htdocs/luci-static/resources/view/homeproxy/server.js:756\nmsgid \"Certificate path\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:57\nmsgid \"Check\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:105\nmsgid \"Check update\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:217\nmsgid \"China DNS server\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:244\nmsgid \"China IPv4 list version\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:248\nmsgid \"China IPv6 list version\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:252\nmsgid \"China list version\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:629\nmsgid \"Chromium / Cronet\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1064\n#: htdocs/luci-static/resources/view/homeproxy/server.js:586\nmsgid \"Cipher suites\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:183\nmsgid \"Cisco Public DNS (208.67.222.222)\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:214\nmsgid \"Clean log\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:627\nmsgid \"Client\"\nmsgstr \"\"\n\n#: root/usr/share/luci/menu.d/luci-app-homeproxy.json:14\nmsgid \"Client Settings\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:664\nmsgid \"Client version\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:182\nmsgid \"CloudFlare Public DNS (1.1.1.1)\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:641\nmsgid \"Cloudflare\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:114\n#: htdocs/luci-static/resources/view/homeproxy/server.js:142\n#: htdocs/luci-static/resources/view/homeproxy/status.js:176\nmsgid \"Collecting data...\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:267\nmsgid \"Common ports only (bypass P2P traffic)\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:698\n#: htdocs/luci-static/resources/view/homeproxy/server.js:354\nmsgid \"Congestion control algorithm\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:232\nmsgid \"Connection check\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:255\nmsgid \"Custom routing\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:618\nmsgid \"DNS\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1047\nmsgid \"DNS Rules\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:924\nmsgid \"DNS Servers\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:872\nmsgid \"DNS Settings\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:639\nmsgid \"DNS provider\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1056\nmsgid \"DNS rule\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:179\n#: htdocs/luci-static/resources/view/homeproxy/client.js:749\n#: htdocs/luci-static/resources/view/homeproxy/client.js:933\nmsgid \"DNS server\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:635\nmsgid \"DNS01 challenge\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:619\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1107\nmsgid \"DTLS\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:136\nmsgid \"Debug\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/homeproxy.js:17\n#: htdocs/luci-static/resources/view/homeproxy/client.js:433\n#: htdocs/luci-static/resources/view/homeproxy/client.js:603\n#: htdocs/luci-static/resources/view/homeproxy/client.js:755\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1083\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1381\n#: htdocs/luci-static/resources/view/homeproxy/node.js:710\nmsgid \"Default\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:382\n#: htdocs/luci-static/resources/view/homeproxy/client.js:434\n#: htdocs/luci-static/resources/view/homeproxy/client.js:756\n#: htdocs/luci-static/resources/view/homeproxy/client.js:887\n#: htdocs/luci-static/resources/view/homeproxy/client.js:995\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1161\nmsgid \"Default DNS (issued by WAN)\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:882\nmsgid \"Default DNS server\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:377\nmsgid \"Default DNS server for resolving domain name in the server address.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:877\nmsgid \"Default DNS strategy\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:357\nmsgid \"Default outbound\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:376\nmsgid \"Default outbound DNS\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:358\nmsgid \"Default outbound for connections not matched by any routing rules.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1389\nmsgid \"Default packet encoding\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:606\nmsgid \"Default server name\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:364\n#: htdocs/luci-static/resources/view/homeproxy/client.js:466\n#: htdocs/luci-static/resources/view/homeproxy/client.js:684\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1033\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1382\n#: htdocs/luci-static/resources/view/homeproxy/node.js:428\nmsgid \"Direct\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1514\nmsgid \"Direct Domain List\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1428\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1473\nmsgid \"Direct IPv4 IP-s\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1431\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1476\nmsgid \"Direct IPv6 IP-s\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1434\nmsgid \"Direct MAC-s\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:123\n#: htdocs/luci-static/resources/view/homeproxy/client.js:151\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1422\n#: htdocs/luci-static/resources/view/homeproxy/node.js:499\n#: htdocs/luci-static/resources/view/homeproxy/node.js:555\n#: htdocs/luci-static/resources/view/homeproxy/node.js:568\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1115\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1368\n#: htdocs/luci-static/resources/view/homeproxy/server.js:276\n#: htdocs/luci-static/resources/view/homeproxy/server.js:289\nmsgid \"Disable\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:363\nmsgid \"Disable (the service)\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:787\n#: htdocs/luci-static/resources/view/homeproxy/client.js:899\nmsgid \"Disable DNS cache\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:788\nmsgid \"Disable DNS cache in this query.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:670\nmsgid \"Disable HTTP challenge\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:605\n#: htdocs/luci-static/resources/view/homeproxy/server.js:321\nmsgid \"Disable Path MTU discovery\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:674\nmsgid \"Disable TLS ALPN challenge\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:710\nmsgid \"Disable UDP domain unmapping\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1182\nmsgid \"Disable cache and save cache in this query.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:901\nmsgid \"Disable cache expire\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1181\nmsgid \"Disable dns cache\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:606\n#: htdocs/luci-static/resources/view/homeproxy/server.js:322\nmsgid \"\"\n\"Disables Path MTU Discovery (RFC 8899). Packets will then be at most 1252 \"\n\"(IPv4) / 1232 (IPv6) bytes in size.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:814\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1251\nmsgid \"Domain keyword\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:805\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1242\nmsgid \"Domain name\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:818\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1255\nmsgid \"Domain regex\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:427\nmsgid \"Domain resolver\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:347\n#: htdocs/luci-static/resources/view/homeproxy/client.js:446\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1174\nmsgid \"Domain strategy\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:781\nmsgid \"Domain strategy for resolving the domain names.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:810\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1247\nmsgid \"Domain suffix\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:600\nmsgid \"Domains\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:774\nmsgid \"Don't drop packets\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1209\nmsgid \"Don't drop requests\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:989\n#: htdocs/luci-static/resources/view/homeproxy/server.js:517\nmsgid \"Download bandwidth\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:990\n#: htdocs/luci-static/resources/view/homeproxy/server.js:518\nmsgid \"Download bandwidth in Mbps.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:770\n#: htdocs/luci-static/resources/view/homeproxy/client.js:776\nmsgid \"Drop packets\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1204\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1211\nmsgid \"Drop requests\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1375\nmsgid \"\"\n\"Drop/keep nodes that contain the specific keywords. <a target=\\\"_blank\\\" \"\n\"href=\\\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/\"\n\"Regular_Expressions\\\">Regex</a> is supported.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1367\nmsgid \"Drop/keep specific nodes from subscriptions.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:691\nmsgid \"\"\n\"EAB (External Account Binding) contains information necessary to bind or map \"\n\"an ACME account to some other account known by the CA.<br/>External account \"\n\"bindings are \\\"used to associate an ACME account with an existing account in \"\n\"a non-ACME system, such as a CA customer database.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1094\nmsgid \"\"\n\"ECH (Encrypted Client Hello) is a TLS extension that allows a client to \"\n\"encrypt the first part of its ClientHello message.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1109\n#: htdocs/luci-static/resources/view/homeproxy/server.js:835\nmsgid \"ECH config\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1098\nmsgid \"ECH config path\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:794\nmsgid \"ECH key\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:798\n#: htdocs/luci-static/resources/view/homeproxy/client.js:908\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1194\nmsgid \"EDNS Client subnet\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:873\n#: htdocs/luci-static/resources/view/homeproxy/server.js:481\nmsgid \"Early data\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:880\n#: htdocs/luci-static/resources/view/homeproxy/server.js:488\nmsgid \"Early data header name\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:489\nmsgid \"Early data is sent in path instead of header by default.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1211\nmsgid \"Edit nodes\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:612\nmsgid \"Email\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:414\n#: htdocs/luci-static/resources/view/homeproxy/client.js:590\n#: htdocs/luci-static/resources/view/homeproxy/client.js:942\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1070\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1329\n#: htdocs/luci-static/resources/view/homeproxy/server.js:148\n#: htdocs/luci-static/resources/view/homeproxy/server.js:166\nmsgid \"Enable\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:722\n#: htdocs/luci-static/resources/view/homeproxy/server.js:371\nmsgid \"\"\n\"Enable 0-RTT QUIC connection handshake on the client side. This is not \"\n\"impacting much on the performance, as the protocol is fully multiplexed.<br/\"\n\">Disabling this is highly recommended, as it is vulnerable to replay attacks.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:721\n#: htdocs/luci-static/resources/view/homeproxy/server.js:370\nmsgid \"Enable 0-RTT handshake\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:595\nmsgid \"Enable ACME\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1093\nmsgid \"Enable ECH\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:984\n#: htdocs/luci-static/resources/view/homeproxy/server.js:512\nmsgid \"Enable TCP Brutal\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:985\n#: htdocs/luci-static/resources/view/homeproxy/server.js:513\nmsgid \"Enable TCP Brutal congestion control algorithm\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1168\n#: htdocs/luci-static/resources/view/homeproxy/server.js:855\nmsgid \"Enable UDP fragmentation.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:328\nmsgid \"Enable endpoint-independent NAT\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:980\n#: htdocs/luci-static/resources/view/homeproxy/server.js:507\nmsgid \"Enable padding\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:846\nmsgid \"Enable tcp fast open for listener.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1172\nmsgid \"\"\n\"Enable the SUoT protocol, requires server support. Conflict with multiplex.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:612\n#: htdocs/luci-static/resources/view/homeproxy/node.js:748\n#: htdocs/luci-static/resources/view/homeproxy/server.js:338\nmsgid \"Encrypt method\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:139\nmsgid \"Error\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/homeproxy.js:237\n#: htdocs/luci-static/resources/homeproxy.js:271\n#: htdocs/luci-static/resources/homeproxy.js:279\n#: htdocs/luci-static/resources/homeproxy.js:297\n#: htdocs/luci-static/resources/homeproxy.js:306\n#: htdocs/luci-static/resources/homeproxy.js:317\n#: htdocs/luci-static/resources/homeproxy.js:326\n#: htdocs/luci-static/resources/homeproxy.js:328\n#: htdocs/luci-static/resources/view/homeproxy/client.js:195\n#: htdocs/luci-static/resources/view/homeproxy/client.js:207\n#: htdocs/luci-static/resources/view/homeproxy/client.js:211\n#: htdocs/luci-static/resources/view/homeproxy/client.js:230\n#: htdocs/luci-static/resources/view/homeproxy/client.js:241\n#: htdocs/luci-static/resources/view/homeproxy/client.js:245\n#: htdocs/luci-static/resources/view/homeproxy/client.js:274\n#: htdocs/luci-static/resources/view/homeproxy/client.js:504\n#: htdocs/luci-static/resources/view/homeproxy/client.js:518\n#: htdocs/luci-static/resources/view/homeproxy/client.js:521\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1357\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1362\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1365\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1507\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1539\n#: htdocs/luci-static/resources/view/homeproxy/node.js:488\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1131\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1302\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1356\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1359\n#: htdocs/luci-static/resources/view/homeproxy/server.js:235\n#: htdocs/luci-static/resources/view/homeproxy/server.js:618\n#: htdocs/luci-static/resources/view/homeproxy/server.js:620\nmsgid \"Expecting: %s\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:690\nmsgid \"External Account Binding\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:702\nmsgid \"External account MAC key\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:696\nmsgid \"External account key ID\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1237\nmsgid \"Extra records\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:86\nmsgid \"Failed to generate %s, error: %s.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/homeproxy.js:261\nmsgid \"Failed to upload %s, error: %s.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:140\nmsgid \"Fatal\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1374\nmsgid \"Filter keywords\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1366\nmsgid \"Filter nodes\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:630\nmsgid \"Firefox / uquic firefox\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:171\nmsgid \"Firewall\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:736\n#: htdocs/luci-static/resources/view/homeproxy/server.js:385\nmsgid \"Flow\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:428\nmsgid \"For resolving domain name in the server address.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1340\nmsgid \"Format\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:730\nmsgid \"Fragment TLS handshake into multiple TLS records.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:736\nmsgid \"\"\n\"Fragment TLS handshakes. Due to poor performance, try <code>%s</code> first.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:742\nmsgid \"Fragment fallback delay\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:842\nmsgid \"GET\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:256\nmsgid \"GFW list version\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:252\nmsgid \"GFWList\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1446\nmsgid \"Gaming mode IPv4 IP-s\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1448\nmsgid \"Gaming mode IPv6 IP-s\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1451\nmsgid \"Gaming mode MAC-s\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:36\n#: htdocs/luci-static/resources/view/homeproxy/server.js:38\n#: htdocs/luci-static/resources/view/homeproxy/server.js:827\nmsgid \"Generate\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:260\nmsgid \"GitHub token\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:256\nmsgid \"Global\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:759\nmsgid \"Global padding\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1453\nmsgid \"Global proxy IPv4 IP-s\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1456\nmsgid \"Global proxy IPv6 IP-s\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1459\nmsgid \"Global proxy MAC-s\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:146\nmsgid \"Global settings\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:238\nmsgid \"Google\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:184\nmsgid \"Google Public DNS (8.8.8.8)\"\nmsgstr \"\"\n\n#: root/usr/share/rpcd/acl.d/luci-app-homeproxy.json:3\nmsgid \"Grant access to homeproxy configuration\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:620\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1108\n#: htdocs/luci-static/resources/view/homeproxy/node.js:430\n#: htdocs/luci-static/resources/view/homeproxy/node.js:777\n#: htdocs/luci-static/resources/view/homeproxy/server.js:177\n#: htdocs/luci-static/resources/view/homeproxy/server.js:403\nmsgid \"HTTP\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:952\nmsgid \"HTTP/3\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:332\nmsgid \"\"\n\"HTTP3 server behavior when authentication fails.<br/>A 404 page will be \"\n\"returned if empty.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:951\nmsgid \"HTTPS\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:778\n#: htdocs/luci-static/resources/view/homeproxy/server.js:404\nmsgid \"HTTPUpgrade\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:744\nmsgid \"Handshake server address\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:750\nmsgid \"Handshake server port\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:974\nmsgid \"Headers\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:727\n#: htdocs/luci-static/resources/view/homeproxy/server.js:376\nmsgid \"Heartbeat interval\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:55\n#: htdocs/luci-static/resources/view/homeproxy/client.js:57\n#: htdocs/luci-static/resources/view/homeproxy/client.js:101\n#: htdocs/luci-static/resources/view/homeproxy/status.js:282\n#: root/usr/share/luci/menu.d/luci-app-homeproxy.json:3\nmsgid \"HomeProxy\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:58\n#: htdocs/luci-static/resources/view/homeproxy/server.js:60\n#: htdocs/luci-static/resources/view/homeproxy/server.js:129\nmsgid \"HomeProxy Server\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:535\nmsgid \"Hop interval\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:529\nmsgid \"Hopping port\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:826\n#: htdocs/luci-static/resources/view/homeproxy/node.js:831\n#: htdocs/luci-static/resources/view/homeproxy/node.js:865\n#: htdocs/luci-static/resources/view/homeproxy/server.js:437\n#: htdocs/luci-static/resources/view/homeproxy/server.js:442\n#: htdocs/luci-static/resources/view/homeproxy/server.js:473\nmsgid \"Host\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:669\nmsgid \"Host key\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:674\nmsgid \"Host key algorithms\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:581\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1061\nmsgid \"Host/IP fields\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:364\nmsgid \"\"\n\"How long the server should wait for the client to send the authentication \"\n\"command (in seconds).\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:432\n#: htdocs/luci-static/resources/view/homeproxy/server.js:179\nmsgid \"Hysteria\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:433\n#: htdocs/luci-static/resources/view/homeproxy/server.js:180\nmsgid \"Hysteria2\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:830\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1267\nmsgid \"IP CIDR\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:608\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1089\nmsgid \"IP version\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:610\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1090\nmsgid \"IPv4\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/homeproxy.js:20\nmsgid \"IPv4 only\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:611\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1091\nmsgid \"IPv6\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/homeproxy.js:21\nmsgid \"IPv6 only\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:297\nmsgid \"IPv6 support\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:506\nmsgid \"Idle session check interval\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:513\nmsgid \"Idle session check timeout\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:553\n#: htdocs/luci-static/resources/view/homeproxy/node.js:847\n#: htdocs/luci-static/resources/view/homeproxy/server.js:456\nmsgid \"Idle timeout\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:717\nmsgid \"\"\n\"If enabled, attempts to connect UDP connection to the destination instead of \"\n\"listen.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:711\nmsgid \"\"\n\"If enabled, for UDP proxy requests addressed to a domain, the original \"\n\"packet address will be sent in the response instead of the mapped domain.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:819\nmsgid \"\"\n\"If enabled, the client transport sends keepalive pings even with no active \"\n\"connections.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:348\nmsgid \"\"\n\"If set, the requested domain name will be resolved to IP before routing.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:804\n#: htdocs/luci-static/resources/view/homeproxy/server.js:425\nmsgid \"\"\n\"If the transport doesn't see any activity after a duration of this time (in \"\n\"seconds), it pings the client to check if the connection is still active.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1073\nmsgid \"\"\n\"If you have the root certificate, use this option instead of allowing \"\n\"insecure.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:326\nmsgid \"Ignore client bandwidth\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1285\nmsgid \"Import\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1232\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1311\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1313\nmsgid \"Import share links\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:336\n#: htdocs/luci-static/resources/view/homeproxy/server.js:860\nmsgid \"In seconds.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:937\nmsgid \"In seconds. Disabled by default.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:521\nmsgid \"\"\n\"In the check, at least the first <code>n</code> idle sessions are kept open.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:514\nmsgid \"\"\n\"In the check, close sessions that have been idle for longer than this, in \"\n\"seconds.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:904\nmsgid \"Independent cache per server\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:137\nmsgid \"Info\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1405\nmsgid \"Interface Control\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:560\nmsgid \"Interrupt existing connections\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:561\nmsgid \"Interrupt existing connections when the selected outbound has changed.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:507\nmsgid \"Interval checking for idle sessions, in seconds.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:728\n#: htdocs/luci-static/resources/view/homeproxy/server.js:377\nmsgid \"\"\n\"Interval for sending heartbeat packets for keeping the connection alive (in \"\n\"seconds).\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:665\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1142\nmsgid \"Invert\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:666\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1143\nmsgid \"Invert match result.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:775\nmsgid \"Key path\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1419\nmsgid \"LAN IP Policy\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:409\n#: htdocs/luci-static/resources/view/homeproxy/client.js:585\n#: htdocs/luci-static/resources/view/homeproxy/client.js:937\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1065\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1324\n#: htdocs/luci-static/resources/view/homeproxy/node.js:422\n#: htdocs/luci-static/resources/view/homeproxy/server.js:160\nmsgid \"Label\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:743\n#: htdocs/luci-static/resources/view/homeproxy/server.js:392\nmsgid \"\"\n\"Legacy protocol support (VMess MD5 Authentication) is provided for \"\n\"compatibility purposes only, use of alterId > 1 is not recommended.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:325\nmsgid \"Less compatibility and sometimes better performance.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:629\nmsgid \"Let's Encrypt\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:897\nmsgid \"\"\n\"List of IP (v4 or v6) addresses prefixes to be assigned to the interface.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:132\n#: htdocs/luci-static/resources/view/homeproxy/client.js:161\n#: htdocs/luci-static/resources/view/homeproxy/client.js:497\nmsgid \"List of nodes to test.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1036\n#: htdocs/luci-static/resources/view/homeproxy/server.js:566\nmsgid \"List of supported application level protocols, in order of preference.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1228\nmsgid \"List of text DNS record to respond as answers.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1238\nmsgid \"List of text DNS record to respond as extra records.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1233\nmsgid \"List of text DNS record to respond as name servers.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:193\nmsgid \"Listen address\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1407\nmsgid \"Listen interfaces\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:198\nmsgid \"Listen port\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:174\nmsgid \"Loading\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1335\nmsgid \"Local\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:896\nmsgid \"Local address\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:191\nmsgid \"Log file does not exist.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:184\nmsgid \"Log is empty.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:930\nmsgid \"MTU\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:150\nmsgid \"Main UDP node\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:122\nmsgid \"Main node\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:662\nmsgid \"Make IP CIDR in rule set used to match the source IP.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1135\nmsgid \"Make IP CIDR in rule sets match the source IP.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1139\nmsgid \"Make IP CIDR in rule-sets accept empty query response.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:905\nmsgid \"\"\n\"Make each DNS server's cache independent for special purposes. If enabled, \"\n\"will slightly degrade performance.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:331\nmsgid \"Masquerade\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1268\nmsgid \"\"\n\"Match IP CIDR with query response. Current rule will be skipped if not match.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:831\nmsgid \"Match IP CIDR.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:811\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1248\nmsgid \"Match domain suffix.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:815\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1252\nmsgid \"Match domain using keyword.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:819\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1256\nmsgid \"Match domain using regular expression.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:806\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1243\nmsgid \"Match full domain.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:854\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1292\nmsgid \"Match port range. Format as START:/:END/START:END.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:849\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1287\nmsgid \"Match port.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:835\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1272\nmsgid \"Match private IP\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1273\nmsgid \"Match private IP with query response.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:827\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1264\nmsgid \"Match private source IP\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:859\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1297\nmsgid \"Match process name.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:867\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1305\nmsgid \"Match process path using regular expression.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:863\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1301\nmsgid \"Match process path.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1096\nmsgid \"Match query type.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:647\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1120\nmsgid \"Match rule set.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:823\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1260\nmsgid \"Match source IP CIDR.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:844\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1282\nmsgid \"Match source port range. Format as START:/:END/START:END.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:839\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1277\nmsgid \"Match source port.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:643\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1116\nmsgid \"Match user name.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:579\n#: htdocs/luci-static/resources/view/homeproxy/server.js:261\nmsgid \"Max download speed\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:580\n#: htdocs/luci-static/resources/view/homeproxy/server.js:262\nmsgid \"Max download speed in Mbps.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:739\nmsgid \"Max time difference\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:586\n#: htdocs/luci-static/resources/view/homeproxy/server.js:268\nmsgid \"Max upload speed\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:587\n#: htdocs/luci-static/resources/view/homeproxy/server.js:269\nmsgid \"Max upload speed in Mbps.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1056\n#: htdocs/luci-static/resources/view/homeproxy/server.js:578\nmsgid \"Maximum TLS version\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:961\n#: htdocs/luci-static/resources/view/homeproxy/node.js:975\nmsgid \"Maximum connections\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:973\nmsgid \"\"\n\"Maximum multiplexed streams in a connection before opening a new connection.\"\n\"<br/>Conflict with <code>%s</code> and <code>%s</code>.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:972\nmsgid \"Maximum streams\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:768\n#: htdocs/luci-static/resources/view/homeproxy/client.js:776\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1202\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1211\n#: htdocs/luci-static/resources/view/homeproxy/node.js:841\n#: htdocs/luci-static/resources/view/homeproxy/server.js:452\nmsgid \"Method\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1048\n#: htdocs/luci-static/resources/view/homeproxy/server.js:570\nmsgid \"Minimum TLS version\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:520\nmsgid \"Minimum idle sessions\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:967\nmsgid \"\"\n\"Minimum multiplexed streams in a connection before opening a new connection.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:966\n#: htdocs/luci-static/resources/view/homeproxy/node.js:975\nmsgid \"Minimum streams\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:310\n#: htdocs/luci-static/resources/view/homeproxy/server.js:183\nmsgid \"Mixed\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:321\nmsgid \"Mixed <code>system</code> TCP stack and <code>gVisor</code> UDP stack.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:595\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1075\nmsgid \"Mode\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1164\n#: htdocs/luci-static/resources/view/homeproxy/server.js:850\nmsgid \"MultiPath TCP\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:944\n#: htdocs/luci-static/resources/view/homeproxy/server.js:500\nmsgid \"Multiplex\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:952\nmsgid \"Multiplex protocol.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:57\n#: htdocs/luci-static/resources/view/homeproxy/server.js:60\nmsgid \"NOT RUNNING\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1395\nmsgid \"NOTE: Save current settings before updating subscriptions.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1232\nmsgid \"NS\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:711\nmsgid \"Native\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:181\nmsgid \"NaïveProxy\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:637\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1099\n#: htdocs/luci-static/resources/view/homeproxy/server.js:866\nmsgid \"Network\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:701\nmsgid \"New Reno\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:774\n#: htdocs/luci-static/resources/view/homeproxy/node.js:791\n#: htdocs/luci-static/resources/view/homeproxy/server.js:400\n#: htdocs/luci-static/resources/view/homeproxy/server.js:417\nmsgid \"No TCP transport, plain HTTP is merged into the HTTP transport.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:789\n#: htdocs/luci-static/resources/view/homeproxy/server.js:415\nmsgid \"No additional encryption support: It's basically duplicate encryption.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1412\nmsgid \"No subscription available\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1437\nmsgid \"No subscription node\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1271\nmsgid \"No valid share link found.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:419\n#: htdocs/luci-static/resources/view/homeproxy/node.js:396\nmsgid \"Node\"\nmsgstr \"\"\n\n#: root/usr/share/luci/menu.d/luci-app-homeproxy.json:22\nmsgid \"Node Settings\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1217\nmsgid \"Nodes\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:994\n#: htdocs/luci-static/resources/view/homeproxy/node.js:737\n#: htdocs/luci-static/resources/view/homeproxy/node.js:775\n#: htdocs/luci-static/resources/view/homeproxy/server.js:386\n#: htdocs/luci-static/resources/view/homeproxy/server.js:401\nmsgid \"None\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:573\n#: htdocs/luci-static/resources/view/homeproxy/server.js:294\nmsgid \"Obfuscate password\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:567\n#: htdocs/luci-static/resources/view/homeproxy/server.js:288\nmsgid \"Obfuscate type\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1408\nmsgid \"Only process traffic from specific interfaces. Leave empty for all.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:254\nmsgid \"Only proxy mainland China\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:580\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1060\nmsgid \"Other fields\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:460\n#: htdocs/luci-static/resources/view/homeproxy/client.js:678\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1027\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1375\nmsgid \"Outbound\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:420\nmsgid \"Outbound node\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:696\nmsgid \"Override address\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:352\nmsgid \"Override destination\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:703\nmsgid \"Override port\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:353\nmsgid \"Override the connection destination address with the sniffed domain.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:697\nmsgid \"Override the connection destination address.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:704\nmsgid \"Override the connection destination port.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:843\nmsgid \"PUT\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:886\nmsgid \"Packet encoding\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:244\nmsgid \"Padding scheme\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:141\nmsgid \"Panic\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:464\n#: htdocs/luci-static/resources/view/homeproxy/server.js:210\nmsgid \"Password\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:967\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1346\n#: htdocs/luci-static/resources/view/homeproxy/node.js:836\n#: htdocs/luci-static/resources/view/homeproxy/node.js:869\n#: htdocs/luci-static/resources/view/homeproxy/server.js:447\n#: htdocs/luci-static/resources/view/homeproxy/server.js:477\nmsgid \"Path\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:911\nmsgid \"Peer pubkic key\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:329\nmsgid \"\"\n\"Performance may degrade slightly, so it is not recommended to enable on when \"\n\"it is not needed.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:936\nmsgid \"Persistent keepalive interval\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:855\n#: htdocs/luci-static/resources/view/homeproxy/server.js:464\nmsgid \"Ping timeout\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:630\nmsgid \"Plugin\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:637\nmsgid \"Plugin opts\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:848\n#: htdocs/luci-static/resources/view/homeproxy/client.js:962\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1286\n#: htdocs/luci-static/resources/view/homeproxy/node.js:453\nmsgid \"Port\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:276\nmsgid \"Port %s alrealy exists!\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:582\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1062\nmsgid \"Port fields\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:536\nmsgid \"Port hopping interval in seconds.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:853\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1291\nmsgid \"Port range\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:918\nmsgid \"Pre-shared key\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1150\nmsgid \"Predefined\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/homeproxy.js:18\nmsgid \"Prefer IPv4\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/homeproxy.js:19\nmsgid \"Prefer IPv6\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:678\n#: htdocs/luci-static/resources/view/homeproxy/node.js:903\nmsgid \"Private key\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:683\nmsgid \"Private key passphrase\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:583\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1063\nmsgid \"Process fields\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:858\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1296\nmsgid \"Process name\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:862\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1300\nmsgid \"Process path\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:866\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1304\nmsgid \"Process path (regex)\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:615\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1104\n#: htdocs/luci-static/resources/view/homeproxy/node.js:543\n#: htdocs/luci-static/resources/view/homeproxy/node.js:951\n#: htdocs/luci-static/resources/view/homeproxy/server.js:250\nmsgid \"Protocol\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:767\nmsgid \"Protocol parameter. Enable length block encryption.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:760\nmsgid \"\"\n\"Protocol parameter. Will waste traffic randomly if enabled (enabled by \"\n\"default in v2ray and cannot be disabled).\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1482\nmsgid \"Proxy Domain List\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1437\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1466\nmsgid \"Proxy IPv4 IP-s\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1440\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1469\nmsgid \"Proxy IPv6 IP-s\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1443\nmsgid \"Proxy MAC-s\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1424\nmsgid \"Proxy all except listed\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1421\nmsgid \"Proxy filter mode\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1423\nmsgid \"Proxy listed only\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:284\nmsgid \"Proxy mode\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:497\nmsgid \"Proxy protocol\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:621\n#: htdocs/luci-static/resources/view/homeproxy/client.js:953\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1109\n#: htdocs/luci-static/resources/view/homeproxy/node.js:712\n#: htdocs/luci-static/resources/view/homeproxy/node.js:779\n#: htdocs/luci-static/resources/view/homeproxy/server.js:405\nmsgid \"QUIC\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:699\n#: htdocs/luci-static/resources/view/homeproxy/server.js:355\nmsgid \"QUIC congestion control algorithm.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:599\n#: htdocs/luci-static/resources/view/homeproxy/server.js:307\nmsgid \"QUIC connection receive window\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:314\nmsgid \"QUIC maximum concurrent bidirectional streams\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:593\n#: htdocs/luci-static/resources/view/homeproxy/server.js:300\nmsgid \"QUIC stream receive window\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1095\nmsgid \"Query type\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1215\nmsgid \"RCode\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:622\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1110\nmsgid \"RDP\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:917\nmsgid \"RDRC timeout\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1142\n#: htdocs/luci-static/resources/view/homeproxy/server.js:709\nmsgid \"REALITY\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:714\nmsgid \"REALITY private key\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1147\n#: htdocs/luci-static/resources/view/homeproxy/server.js:730\nmsgid \"REALITY public key\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1153\n#: htdocs/luci-static/resources/view/homeproxy/server.js:734\nmsgid \"REALITY short ID\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:55\n#: htdocs/luci-static/resources/view/homeproxy/server.js:58\nmsgid \"RUNNING\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:665\nmsgid \"Random version will be used if empty.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:488\nmsgid \"Recursive outbound detected!\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1013\nmsgid \"Recursive resolver detected!\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:285\nmsgid \"Redirect TCP\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:287\nmsgid \"Redirect TCP + TProxy UDP\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:289\nmsgid \"Redirect TCP + Tun UDP\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:219\nmsgid \"Refresh every %s seconds.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:659\nmsgid \"Region ID\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:672\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1149\nmsgid \"Reject\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1336\nmsgid \"Remote\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1434\nmsgid \"Remove %s nodes\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1424\nmsgid \"Remove all nodes from subscriptions\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1203\nmsgid \"Reply with REFUSED\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:769\nmsgid \"Reply with TCP RST / ICMP port unreachable\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:925\nmsgid \"Reserved field bytes\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:673\nmsgid \"Resolve\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:780\nmsgid \"Resolve strategy\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:241\nmsgid \"Resources management\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:880\nmsgid \"Reuse address\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:881\nmsgid \"Reuse listener address.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:792\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1187\nmsgid \"Rewrite TTL\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:793\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1188\nmsgid \"Rewrite TTL in DNS responses.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:670\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1147\nmsgid \"Route\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:671\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1148\nmsgid \"Route options\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:396\nmsgid \"Routing Nodes\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:567\nmsgid \"Routing Rules\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:120\nmsgid \"Routing Settings\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:251\nmsgid \"Routing mode\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:405\nmsgid \"Routing node\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:264\nmsgid \"Routing ports\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:576\nmsgid \"Routing rule\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1311\nmsgid \"Rule Set\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:646\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1119\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1320\nmsgid \"Rule set\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:661\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1134\nmsgid \"Rule set IP CIDR as source IP\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1353\nmsgid \"Rule set URL\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:623\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1111\n#: htdocs/luci-static/resources/view/homeproxy/node.js:438\nmsgid \"SSH\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:624\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1112\nmsgid \"STUN\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1177\nmsgid \"SUoT version\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:632\nmsgid \"Safari / Apple Network API\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:569\n#: htdocs/luci-static/resources/view/homeproxy/server.js:290\nmsgid \"Salamander\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:152\nmsgid \"Same as main node\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:267\n#: htdocs/luci-static/resources/view/homeproxy/status.js:273\nmsgid \"Save\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1397\nmsgid \"Save current settings\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1394\nmsgid \"Save subscriptions settings\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1155\n#: htdocs/luci-static/resources/view/homeproxy/server.js:156\nmsgid \"Server\"\nmsgstr \"\"\n\n#: root/usr/share/luci/menu.d/luci-app-homeproxy.json:30\nmsgid \"Server Settings\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:607\nmsgid \"\"\n\"Server name to use when choosing a certificate if the ClientHello's \"\n\"ServerName field is empty.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:151\nmsgid \"Server settings\"\nmsgstr \"\"\n\n#: root/usr/share/luci/menu.d/luci-app-homeproxy.json:38\nmsgid \"Service Status\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1175\nmsgid \"Set domain strategy for this query.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:436\nmsgid \"ShadowTLS\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:644\nmsgid \"ShadowTLS version\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:435\n#: htdocs/luci-static/resources/view/homeproxy/server.js:184\nmsgid \"Shadowsocks\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:628\nmsgid \"Sniffed client type (QUIC client type or SSH client name).\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:616\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1105\nmsgid \"\"\n\"Sniffed protocol, see <a target=\\\"_blank\\\" href=\\\"https://sing-box.sagernet.\"\n\"org/configuration/route/sniff/\\\">Sniff</a> for details.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:437\n#: htdocs/luci-static/resources/view/homeproxy/server.js:185\nmsgid \"Socks\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:654\nmsgid \"Socks version\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:655\nmsgid \"Socks4\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:656\nmsgid \"Socks4A\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:657\nmsgid \"Socks5\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:822\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1259\nmsgid \"Source IP CIDR\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1342\nmsgid \"Source file\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:838\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1276\nmsgid \"Source port\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:843\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1281\nmsgid \"Source port range\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:750\nmsgid \"\"\n\"Specifies DNS server tag to use instead of selecting through DNS routing.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:796\n#: htdocs/luci-static/resources/view/homeproxy/node.js:848\nmsgid \"\"\n\"Specifies the period of time (in seconds) after which a health check will be \"\n\"performed using a ping frame if no frames have been received on the \"\n\"connection.<br/>Please note that a ping response is considered a received \"\n\"frame, so if there is no other traffic on the connection, the health check \"\n\"will be executed every interval.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:422\n#: htdocs/luci-static/resources/view/homeproxy/server.js:457\nmsgid \"\"\n\"Specifies the time (in seconds) until idle clients should be closed with a \"\n\"GOAWAY frame. PING frames are not considered as activity.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:800\n#: htdocs/luci-static/resources/view/homeproxy/node.js:856\nmsgid \"\"\n\"Specifies the timeout duration (in seconds) after sending a PING frame, \"\n\"within which a response must be received.<br/>If a response to the PING \"\n\"frame is not received within the specified timeout duration, the connection \"\n\"will be closed.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:265\nmsgid \"\"\n\"Specify target ports to be proxied. Multiple ports must be separated by \"\n\"commas.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:913\nmsgid \"Store RDRC\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:914\nmsgid \"\"\n\"Store rejected DNS response cache.<br/>The check results of <code>Address \"\n\"filter DNS rule items</code> will be cached until expiration.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:557\n#: htdocs/luci-static/resources/view/homeproxy/server.js:278\nmsgid \"String\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1322\nmsgid \"Sub (%s)\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1349\nmsgid \"Subscription URL-s\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1333\nmsgid \"Subscriptions\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1273\nmsgid \"Successfully imported %s nodes of total %s.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:86\nmsgid \"Successfully updated.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1233\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1350\nmsgid \"\"\n\"Support Hysteria, Shadowsocks, Trojan, v2rayN (VMess), and XTLS (VLESS) \"\n\"online configuration delivery standard.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:180\nmsgid \"\"\n\"Support UDP, TCP, DoH, DoQ, DoT. TCP protocol will be used if not specified.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:313\nmsgid \"System\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:383\n#: htdocs/luci-static/resources/view/homeproxy/client.js:435\n#: htdocs/luci-static/resources/view/homeproxy/client.js:757\n#: htdocs/luci-static/resources/view/homeproxy/client.js:888\n#: htdocs/luci-static/resources/view/homeproxy/client.js:996\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1162\nmsgid \"System DNS\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:638\n#: htdocs/luci-static/resources/view/homeproxy/client.js:949\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1100\n#: htdocs/luci-static/resources/view/homeproxy/server.js:867\nmsgid \"TCP\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1161\n#: htdocs/luci-static/resources/view/homeproxy/server.js:845\nmsgid \"TCP fast open\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:307\nmsgid \"TCP/IP stack\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:308\nmsgid \"TCP/IP stack.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:625\n#: htdocs/luci-static/resources/view/homeproxy/client.js:950\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1113\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1003\n#: htdocs/luci-static/resources/view/homeproxy/server.js:532\nmsgid \"TLS\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1035\n#: htdocs/luci-static/resources/view/homeproxy/server.js:565\nmsgid \"TLS ALPN\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:980\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1030\n#: htdocs/luci-static/resources/view/homeproxy/server.js:560\nmsgid \"TLS SNI\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:735\nmsgid \"TLS fragment\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:787\n#: htdocs/luci-static/resources/view/homeproxy/server.js:413\nmsgid \"TLS is not enforced. If TLS is not configured, plain HTTP 1.1 is used.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:729\n#: htdocs/luci-static/resources/view/homeproxy/client.js:737\nmsgid \"TLS record fragment\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:989\nmsgid \"\"\n\"Tag of a another server to resolve the domain name in the address. Required \"\n\"if address contains domain.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1028\nmsgid \"Tag of an outbound for connecting to the dns server.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1376\nmsgid \"Tag of the outbound to download rule set.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1156\nmsgid \"Tag of the target dns server.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:679\nmsgid \"Tag of the target outbound.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:327\nmsgid \"\"\n\"Tell the client to use the BBR flow control algorithm instead of Hysteria CC.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:187\n#: htdocs/luci-static/resources/view/homeproxy/client.js:222\nmsgid \"Tencent Public DNS (119.29.29.29)\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:510\nmsgid \"Test URL\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:138\n#: htdocs/luci-static/resources/view/homeproxy/client.js:167\n#: htdocs/luci-static/resources/view/homeproxy/client.js:530\nmsgid \"Test interval\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:538\nmsgid \"Test interval must be less or equal than idle timeout.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:144\n#: htdocs/luci-static/resources/view/homeproxy/client.js:173\n#: htdocs/luci-static/resources/view/homeproxy/client.js:546\nmsgid \"Test tolerance\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:628\nmsgid \"The ACME CA provider to use.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:878\nmsgid \"The DNS strategy for resolving the domain name in the address.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:600\n#: htdocs/luci-static/resources/view/homeproxy/server.js:308\nmsgid \"The QUIC connection-level flow control window for receiving data.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:594\n#: htdocs/luci-static/resources/view/homeproxy/server.js:301\nmsgid \"The QUIC stream-level flow control window for receiving data.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:511\nmsgid \"The URL to test.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:958\nmsgid \"The address of the dns server.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:679\nmsgid \"\"\n\"The alternate port to use for the ACME HTTP challenge; if non-empty, this \"\n\"port will be used instead of 80 to spin up a listener for the HTTP challenge.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:685\nmsgid \"\"\n\"The alternate port to use for the ACME TLS-ALPN challenge; the system must \"\n\"forward 443 to this port for challenge to succeed.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:596\nmsgid \"\"\n\"The default rule uses the following matching logic:<br/><code>(domain || \"\n\"domain_suffix || domain_keyword || domain_regex || ip_cidr || \"\n\"ip_is_private)</code> &&<br/><code>(port || port_range)</code> &&<br/\"\n\"><code>(source_ip_cidr || source_ip_is_private)</code> &&<br/\"\n\"><code>(source_port || source_port_range)</code> &&<br/><code>other fields</\"\n\"code>.<br/>Additionally, included rule sets can be considered merged rather \"\n\"than as a single rule sub-item.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1076\nmsgid \"\"\n\"The default rule uses the following matching logic:<br/><code>(domain || \"\n\"domain_suffix || domain_keyword || domain_regex)</code> &&<br/><code>(port \"\n\"|| port_range)</code> &&<br/><code>(source_ip_cidr || source_ip_is_private)</\"\n\"code> &&<br/><code>(source_port || source_port_range)</code> &&<br/\"\n\"><code>other fields</code>.<br/>Additionally, included rule sets can be \"\n\"considered merged rather than as a single rule sub-item.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:218\nmsgid \"\"\n\"The dns server for resolving China domains. Support UDP, TCP, DoH, DoQ, DoT.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:447\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1021\nmsgid \"The domain strategy for resolving the domain name in the address.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1065\n#: htdocs/luci-static/resources/view/homeproxy/server.js:587\nmsgid \"\"\n\"The elliptic curves that will be used in an ECDHE handshake, in preference \"\n\"order. If empty, the default will be used.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:613\nmsgid \"\"\n\"The email address to use when creating or selecting an existing ACME server \"\n\"account.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:743\nmsgid \"\"\n\"The fallback value in milliseconds used when TLS segmentation cannot \"\n\"automatically determine the wait time.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:554\nmsgid \"The idle timeout in seconds.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1057\n#: htdocs/luci-static/resources/view/homeproxy/server.js:579\nmsgid \"The maximum TLS version that is acceptable.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:315\nmsgid \"\"\n\"The maximum number of QUIC concurrent bidirectional streams that a peer is \"\n\"allowed to open.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:740\nmsgid \"The maximum time difference between the server and the client.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1049\n#: htdocs/luci-static/resources/view/homeproxy/server.js:571\nmsgid \"The minimum TLS version that is acceptable.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:102\n#: htdocs/luci-static/resources/view/homeproxy/server.js:130\nmsgid \"The modern ImmortalWrt proxy platform for ARM64/AMD64.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:454\n#: htdocs/luci-static/resources/view/homeproxy/server.js:875\nmsgid \"The network interface to bind to.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:968\nmsgid \"The path of the DNS server.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1099\nmsgid \"\"\n\"The path to the ECH config, in PEM format. If empty, load from DNS will be \"\n\"attempted.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1078\nmsgid \"The path to the server certificate, in PEM format.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:199\nmsgid \"The port must be unique.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:963\nmsgid \"The port of the DNS server.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1216\nmsgid \"The response code.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:776\nmsgid \"The server private key, in PEM format.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:757\nmsgid \"The server public key, in PEM format.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:461\nmsgid \"\"\n\"The tag of the upstream outbound.<br/>Other dial fields will be ignored when \"\n\"enabled.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:139\n#: htdocs/luci-static/resources/view/homeproxy/client.js:168\n#: htdocs/luci-static/resources/view/homeproxy/client.js:531\nmsgid \"The test interval in seconds.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:145\n#: htdocs/luci-static/resources/view/homeproxy/client.js:174\n#: htdocs/luci-static/resources/view/homeproxy/client.js:547\nmsgid \"The test tolerance in milliseconds.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:807\n#: htdocs/luci-static/resources/view/homeproxy/server.js:465\nmsgid \"\"\n\"The timeout (in seconds) that after performing a keepalive check, the client \"\n\"will wait for activity. If no activity is detected, the connection will be \"\n\"closed.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1043\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1385\nmsgid \"\"\n\"This is <strong>DANGEROUS</strong>, your traffic is almost like \"\n\"<strong>PLAIN TEXT</strong>! Use at your own risk!\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:717\nmsgid \"\"\n\"This is the TUIC port of the UDP over TCP protocol, designed to provide a \"\n\"QUIC stream based UDP relay mode that TUIC does not provide.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:188\n#: htdocs/luci-static/resources/view/homeproxy/client.js:223\nmsgid \"ThreatBook Public DNS (117.50.10.10)\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:723\nmsgid \"\"\n\"Timeout for UDP connections.<br/>Setting a larger value than the UDP timeout \"\n\"in inbounds will have no effect.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:918\nmsgid \"\"\n\"Timeout of rejected DNS response cache in seconds. <code>604800 (7d)</code> \"\n\"is used by default.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:491\nmsgid \"\"\n\"To be compatible with Xray-core, set this to <code>Sec-WebSocket-Protocol</\"\n\"code>.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:292\nmsgid \"\"\n\"To enable Tun support, you need to install <code>ip-full</code> and \"\n\"<code>kmod-tun</code>\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:135\nmsgid \"Trace\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:773\n#: htdocs/luci-static/resources/view/homeproxy/server.js:399\nmsgid \"Transport\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:439\n#: htdocs/luci-static/resources/view/homeproxy/server.js:186\nmsgid \"Trojan\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:441\n#: htdocs/luci-static/resources/view/homeproxy/server.js:188\nmsgid \"Tuic\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:290\nmsgid \"Tun TCP/UDP\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:947\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1334\n#: htdocs/luci-static/resources/view/homeproxy/node.js:427\n#: htdocs/luci-static/resources/view/homeproxy/server.js:175\nmsgid \"Type\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:639\n#: htdocs/luci-static/resources/view/homeproxy/client.js:948\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1101\n#: htdocs/luci-static/resources/view/homeproxy/server.js:868\nmsgid \"UDP\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1167\n#: htdocs/luci-static/resources/view/homeproxy/server.js:854\nmsgid \"UDP Fragment\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:335\n#: htdocs/luci-static/resources/view/homeproxy/server.js:859\nmsgid \"UDP NAT expiration time\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1171\nmsgid \"UDP over TCP\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:716\nmsgid \"UDP over stream\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:709\nmsgid \"UDP packet relay mode.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:708\nmsgid \"UDP relay mode\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:722\nmsgid \"UDP timeout\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:124\n#: htdocs/luci-static/resources/view/homeproxy/client.js:153\n#: htdocs/luci-static/resources/view/homeproxy/client.js:421\nmsgid \"URLTest\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:131\n#: htdocs/luci-static/resources/view/homeproxy/client.js:160\n#: htdocs/luci-static/resources/view/homeproxy/client.js:496\nmsgid \"URLTest nodes\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:690\n#: htdocs/luci-static/resources/view/homeproxy/server.js:346\nmsgid \"UUID\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:98\nmsgid \"Unknown error.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:195\nmsgid \"Unknown error: %s\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1135\nmsgid \"Unsupported fingerprint!\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1409\nmsgid \"Update %s subscriptions\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:89\nmsgid \"Update failed.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1392\nmsgid \"Update interval\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1393\nmsgid \"Update interval of rule set.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1404\nmsgid \"Update nodes from subscriptions\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1346\nmsgid \"Update subscriptions via proxy.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1339\nmsgid \"Update time\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1345\nmsgid \"Update via proxy\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1104\nmsgid \"Upload ECH config\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:995\n#: htdocs/luci-static/resources/view/homeproxy/server.js:523\nmsgid \"Upload bandwidth\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:996\n#: htdocs/luci-static/resources/view/homeproxy/server.js:524\nmsgid \"Upload bandwidth in Mbps.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1085\n#: htdocs/luci-static/resources/view/homeproxy/server.js:767\nmsgid \"Upload certificate\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:786\nmsgid \"Upload key\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1088\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1107\n#: htdocs/luci-static/resources/view/homeproxy/server.js:770\n#: htdocs/luci-static/resources/view/homeproxy/server.js:789\nmsgid \"Upload...\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:596\nmsgid \"Use ACME TLS certificate issuer.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1031\n#: htdocs/luci-static/resources/view/homeproxy/server.js:561\nmsgid \"\"\n\"Used to verify the hostname on the returned certificates unless insecure is \"\n\"given.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:981\nmsgid \"Used to verify the hostname on the returned certificates.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:642\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1115\nmsgid \"User\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1379\nmsgid \"User-Agent\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:458\n#: htdocs/luci-static/resources/view/homeproxy/server.js:203\nmsgid \"Username\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:444\n#: htdocs/luci-static/resources/view/homeproxy/server.js:189\nmsgid \"VLESS\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:445\n#: htdocs/luci-static/resources/view/homeproxy/server.js:190\nmsgid \"VMess\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:181\n#: htdocs/luci-static/resources/view/homeproxy/client.js:219\nmsgid \"WAN DNS (read from interface)\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1464\nmsgid \"WAN IP Policy\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:138\nmsgid \"Warn\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:780\n#: htdocs/luci-static/resources/view/homeproxy/server.js:406\nmsgid \"WebSocket\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1370\nmsgid \"Whitelist mode\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:443\nmsgid \"WireGuard\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:912\nmsgid \"WireGuard peer public key.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:919\nmsgid \"WireGuard pre-shared key.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:904\nmsgid \"WireGuard requires base64-encoded private keys.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:498\nmsgid \"Write proxy protocol in the connection header.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:889\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1392\nmsgid \"Xudp (Xray-core)\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/homeproxy.js:259\nmsgid \"Your %s was successfully uploaded. Size: %sB.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:630\nmsgid \"ZeroSSL\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1090\n#: htdocs/luci-static/resources/view/homeproxy/server.js:772\nmsgid \"certificate\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:716\nmsgid \"connect UDP connections\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1050\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1058\n#: htdocs/luci-static/resources/view/homeproxy/server.js:572\n#: htdocs/luci-static/resources/view/homeproxy/server.js:580\nmsgid \"default\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:53\nmsgid \"failed\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:776\n#: htdocs/luci-static/resources/view/homeproxy/server.js:402\nmsgid \"gRPC\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:818\nmsgid \"gRPC permit without stream\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:813\n#: htdocs/luci-static/resources/view/homeproxy/server.js:430\nmsgid \"gRPC service name\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:311\nmsgid \"gVisor\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/homeproxy.js:306\n#: htdocs/luci-static/resources/homeproxy.js:326\n#: htdocs/luci-static/resources/view/homeproxy/client.js:195\n#: htdocs/luci-static/resources/view/homeproxy/client.js:230\n#: htdocs/luci-static/resources/view/homeproxy/client.js:504\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1357\n#: htdocs/luci-static/resources/view/homeproxy/node.js:488\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1131\n#: htdocs/luci-static/resources/view/homeproxy/server.js:235\nmsgid \"non-empty value\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:631\n#: htdocs/luci-static/resources/view/homeproxy/node.js:887\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1390\nmsgid \"none\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:888\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1391\nmsgid \"packet addr (v2ray-core v5+)\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:50\nmsgid \"passed\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:791\nmsgid \"private key\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:631\nmsgid \"quic-go / uquic chrome\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:285\nmsgid \"sing-box client\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:288\nmsgid \"sing-box server\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1113\nmsgid \"uTLS fingerprint\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1114\nmsgid \"\"\n\"uTLS is a fork of \\\"crypto/tls\\\", which provides ClientHello fingerprinting \"\n\"resistance.\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:59\nmsgid \"unchecked\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/homeproxy.js:237\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1302\nmsgid \"unique UCI identifier\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/homeproxy.js:317\nmsgid \"unique value\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:500\n#: htdocs/luci-static/resources/view/homeproxy/node.js:645\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1178\nmsgid \"v1\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:501\n#: htdocs/luci-static/resources/view/homeproxy/node.js:646\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1179\nmsgid \"v2\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:647\nmsgid \"v3\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:207\n#: htdocs/luci-static/resources/view/homeproxy/client.js:211\n#: htdocs/luci-static/resources/view/homeproxy/client.js:241\n#: htdocs/luci-static/resources/view/homeproxy/client.js:245\nmsgid \"valid DNS server address\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:518\n#: htdocs/luci-static/resources/view/homeproxy/client.js:521\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1362\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1365\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1356\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1359\nmsgid \"valid URL\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/homeproxy.js:271\nmsgid \"valid base64 key with %d characters\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1507\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1539\nmsgid \"valid hostname\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/homeproxy.js:297\nmsgid \"valid port range (port1:port2)\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:274\nmsgid \"valid port value\"\nmsgstr \"\"\n\n#: htdocs/luci-static/resources/homeproxy.js:328\nmsgid \"valid uuid\"\nmsgstr \"\"\n"
  },
  {
    "path": "luci-app-homeproxy/po/zh_Hans/homeproxy.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Last-Translator: Automatically generated\\n\"\n\"Language-Team: none\\n\"\n\"Language: zh_Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:206\nmsgid \"%s log\"\nmsgstr \"%s 日志\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1456\nmsgid \"%s nodes removed\"\nmsgstr \"移除了 %s 个节点\"\n\n#: htdocs/luci-static/resources/homeproxy.js:279\nmsgid \"/etc/homeproxy/certs/..., /etc/acme/..., /etc/ssl/...\"\nmsgstr \"/etc/homeproxy/certs/...，/etc/acme/...，/etc/ssl/...\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:609\nmsgid \"4 or 6. Not limited if empty.\"\nmsgstr \"4 或 6。留空不限制。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:775\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1210\nmsgid \"\"\n\"<code>%s</code> will be temporarily overwritten to <code>%s</code> after 50 \"\n\"triggers in 30s if not enabled.\"\nmsgstr \"\"\n\"<code>%s</code> 在未启用的情况下，50 次触发后会在 30 秒内临时覆盖为 \"\n\"<code>%s</code>。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1086\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1105\n#: htdocs/luci-static/resources/view/homeproxy/server.js:768\n#: htdocs/luci-static/resources/view/homeproxy/server.js:787\nmsgid \"<strong>Save your configuration before uploading files!</strong>\"\nmsgstr \"<strong>上传文件前请先保存配置！</strong>\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:664\nmsgid \"API token\"\nmsgstr \"API 令牌\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:670\nmsgid \"Accept any if empty.\"\nmsgstr \"留空则不校验。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1138\nmsgid \"Accept empty query response\"\nmsgstr \"接受空查询响应\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1399\nmsgid \"Access Control\"\nmsgstr \"访问控制\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:647\nmsgid \"Access key ID\"\nmsgstr \"访问密钥 ID\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:653\nmsgid \"Access key secret\"\nmsgstr \"访问密钥\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:669\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1146\nmsgid \"Action\"\nmsgstr \"操作\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1056\nmsgid \"Add a DNS rule\"\nmsgstr \"新增 DNS 规则\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:933\nmsgid \"Add a DNS server\"\nmsgstr \"新增 DNS 服务器\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:396\nmsgid \"Add a node\"\nmsgstr \"新增节点\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:405\nmsgid \"Add a routing node\"\nmsgstr \"新增路由节点\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:576\nmsgid \"Add a routing rule\"\nmsgstr \"新增路由规则\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1320\nmsgid \"Add a rule set\"\nmsgstr \"新增规则集\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:156\nmsgid \"Add a server\"\nmsgstr \"新增服务器\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:975\nmsgid \"Additional headers to be sent to the DNS server.\"\nmsgstr \"发送到 DNS 服务器的附加标头。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:957\n#: htdocs/luci-static/resources/view/homeproxy/node.js:448\nmsgid \"Address\"\nmsgstr \"地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:988\nmsgid \"Address resolver\"\nmsgstr \"地址解析器\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1020\nmsgid \"Address strategy\"\nmsgstr \"地址解析策略\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:640\nmsgid \"Alibaba Cloud DNS\"\nmsgstr \"阿里云 DNS\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:186\n#: htdocs/luci-static/resources/view/homeproxy/client.js:220\nmsgid \"Aliyun Public DNS (223.5.5.5)\"\nmsgstr \"阿里云公共 DNS（223.5.5.5）\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:266\nmsgid \"All ports\"\nmsgstr \"所有端口\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:172\nmsgid \"Allow access from the Internet.\"\nmsgstr \"允许来自互联网的访问。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1040\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1382\nmsgid \"Allow insecure\"\nmsgstr \"允许不安全连接\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1041\nmsgid \"Allow insecure connection at TLS client.\"\nmsgstr \"允许 TLS 客户端侧的不安全连接。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1383\nmsgid \"Allow insecure connection by default when add nodes from subscriptions.\"\nmsgstr \"从订阅获取节点时，默认允许不安全连接。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:874\n#: htdocs/luci-static/resources/view/homeproxy/server.js:482\nmsgid \"Allowed payload size is in the request.\"\nmsgstr \"请求中允许的载荷大小。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:95\nmsgid \"Already at the latest version.\"\nmsgstr \"已是最新版本。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:92\nmsgid \"Already in updating.\"\nmsgstr \"已在更新中。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:742\n#: htdocs/luci-static/resources/view/homeproxy/server.js:391\nmsgid \"Alter ID\"\nmsgstr \"额外 ID\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:678\nmsgid \"Alternative HTTP port\"\nmsgstr \"替代 HTTP 端口\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:684\nmsgid \"Alternative TLS port\"\nmsgstr \"替代 HTTPS 端口\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1419\nmsgid \"An error occurred during updating subscriptions: %s\"\nmsgstr \"更新订阅时发生错误：%s\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1227\nmsgid \"Answer\"\nmsgstr \"回答\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:429\n#: htdocs/luci-static/resources/view/homeproxy/server.js:176\nmsgid \"AnyTLS\"\nmsgstr \"AnyTLS\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:245\nmsgid \"AnyTLS padding scheme in array.\"\nmsgstr \"AnyTLS 填充方案。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:799\n#: htdocs/luci-static/resources/view/homeproxy/client.js:909\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1195\nmsgid \"\"\n\"Append a <code>edns0-subnet</code> OPT extra record with the specified IP \"\n\"prefix to every query by default.<br/>If value is an IP address instead of \"\n\"prefix, <code>/32</code> or <code>/128</code> will be appended automatically.\"\nmsgstr \"\"\n\"将带有指定 IP 前缀的 <code>edns0-subnet</code> OPT 记录附加到每个查询。如果值\"\n\"是 IP 地址而不是前缀，则会自动添加 <code>/32</code> 或 <code>/128</code>。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1072\nmsgid \"Append self-signed certificate\"\nmsgstr \"追加自签名证书\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:407\nmsgid \"Applied\"\nmsgstr \"已应用\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:400\n#: htdocs/luci-static/resources/view/homeproxy/node.js:410\nmsgid \"Apply\"\nmsgstr \"应用\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:18\nmsgid \"Are you sure to allow insecure?\"\nmsgstr \"确定要允许不安全连接吗？\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:363\nmsgid \"Auth timeout\"\nmsgstr \"认证超时\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:766\nmsgid \"Authenticated length\"\nmsgstr \"认证长度\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:561\n#: htdocs/luci-static/resources/view/homeproxy/server.js:282\nmsgid \"Authentication payload\"\nmsgstr \"认证载荷\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:554\n#: htdocs/luci-static/resources/view/homeproxy/server.js:275\nmsgid \"Authentication type\"\nmsgstr \"认证类型\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1335\nmsgid \"Auto update\"\nmsgstr \"自动更新\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1336\nmsgid \"Auto update subscriptions and geodata.\"\nmsgstr \"自动更新订阅和地理数据。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:702\nmsgid \"BBR\"\nmsgstr \"BBR\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:235\nmsgid \"BaiDu\"\nmsgstr \"百度\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:556\n#: htdocs/luci-static/resources/view/homeproxy/server.js:277\nmsgid \"Base64\"\nmsgstr \"Base64\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:323\nmsgid \"Based on google/gvisor.\"\nmsgstr \"基于 google/gvisor。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1341\nmsgid \"Binary file\"\nmsgstr \"二进制文件\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:453\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1412\n#: htdocs/luci-static/resources/view/homeproxy/server.js:874\nmsgid \"Bind interface\"\nmsgstr \"绑定接口\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1413\nmsgid \"\"\n\"Bind outbound traffic to specific interface. Leave empty to auto detect.\"\nmsgstr \"绑定出站流量至指定端口。留空自动检测。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:617\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1106\nmsgid \"BitTorrent\"\nmsgstr \"BitTorrent\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1369\nmsgid \"Blacklist mode\"\nmsgstr \"黑名单模式\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:365\nmsgid \"Block\"\nmsgstr \"封锁\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:612\n#: htdocs/luci-static/resources/view/homeproxy/client.js:640\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1092\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1102\n#: htdocs/luci-static/resources/view/homeproxy/server.js:869\nmsgid \"Both\"\nmsgstr \"全部\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:343\nmsgid \"Bypass CN traffic\"\nmsgstr \"绕过中国流量\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:253\nmsgid \"Bypass mainland China\"\nmsgstr \"大陆白名单\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:344\nmsgid \"Bypass mainland China traffic via firewall rules by default.\"\nmsgstr \"默认使用防火墙规则绕过中国大陆流量。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:627\nmsgid \"CA provider\"\nmsgstr \"CA 颁发机构\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:221\nmsgid \"CNNIC Public DNS (210.2.4.8)\"\nmsgstr \"CNNIC 公共 DNS（210.2.4.8）\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:700\nmsgid \"CUBIC\"\nmsgstr \"CUBIC\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1239\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1077\n#: htdocs/luci-static/resources/view/homeproxy/server.js:756\nmsgid \"Certificate path\"\nmsgstr \"证书路径\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:57\nmsgid \"Check\"\nmsgstr \"检查\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:105\nmsgid \"Check update\"\nmsgstr \"检查更新\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:217\nmsgid \"China DNS server\"\nmsgstr \"国内 DNS 服务器\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:244\nmsgid \"China IPv4 list version\"\nmsgstr \"国内 IPv4 库版本\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:248\nmsgid \"China IPv6 list version\"\nmsgstr \"国内 IPv6 库版本\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:252\nmsgid \"China list version\"\nmsgstr \"国内域名列表版本\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:629\nmsgid \"Chromium / Cronet\"\nmsgstr \"Chromium / Cronet\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1064\n#: htdocs/luci-static/resources/view/homeproxy/server.js:586\nmsgid \"Cipher suites\"\nmsgstr \"密码套件\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:183\nmsgid \"Cisco Public DNS (208.67.222.222)\"\nmsgstr \"思科公共 DNS（208.67.222.222）\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:214\nmsgid \"Clean log\"\nmsgstr \"清空日志\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:627\nmsgid \"Client\"\nmsgstr \"客户端\"\n\n#: root/usr/share/luci/menu.d/luci-app-homeproxy.json:14\nmsgid \"Client Settings\"\nmsgstr \"客户端设置\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:664\nmsgid \"Client version\"\nmsgstr \"客户端版本\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:182\nmsgid \"CloudFlare Public DNS (1.1.1.1)\"\nmsgstr \"CloudFlare 公共 DNS（1.1.1.1）\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:641\nmsgid \"Cloudflare\"\nmsgstr \"Cloudflare\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:114\n#: htdocs/luci-static/resources/view/homeproxy/server.js:142\n#: htdocs/luci-static/resources/view/homeproxy/status.js:176\nmsgid \"Collecting data...\"\nmsgstr \"正在收集数据中...\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:267\nmsgid \"Common ports only (bypass P2P traffic)\"\nmsgstr \"仅常用端口（绕过 P2P 流量）\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:698\n#: htdocs/luci-static/resources/view/homeproxy/server.js:354\nmsgid \"Congestion control algorithm\"\nmsgstr \"拥塞控制算法\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:232\nmsgid \"Connection check\"\nmsgstr \"连接检查\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:255\nmsgid \"Custom routing\"\nmsgstr \"自定义路由\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:618\nmsgid \"DNS\"\nmsgstr \"DNS\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1047\nmsgid \"DNS Rules\"\nmsgstr \"DNS 规则\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:924\nmsgid \"DNS Servers\"\nmsgstr \"DNS 服务器\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:872\nmsgid \"DNS Settings\"\nmsgstr \"DNS 设置\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:639\nmsgid \"DNS provider\"\nmsgstr \"DNS 提供商\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1056\nmsgid \"DNS rule\"\nmsgstr \"DNS 规则\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:179\n#: htdocs/luci-static/resources/view/homeproxy/client.js:749\n#: htdocs/luci-static/resources/view/homeproxy/client.js:933\nmsgid \"DNS server\"\nmsgstr \"DNS 服务器\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:635\nmsgid \"DNS01 challenge\"\nmsgstr \"DNS01 验证\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:619\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1107\nmsgid \"DTLS\"\nmsgstr \"DTLS\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:136\nmsgid \"Debug\"\nmsgstr \"调试\"\n\n#: htdocs/luci-static/resources/homeproxy.js:17\n#: htdocs/luci-static/resources/view/homeproxy/client.js:433\n#: htdocs/luci-static/resources/view/homeproxy/client.js:603\n#: htdocs/luci-static/resources/view/homeproxy/client.js:755\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1083\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1381\n#: htdocs/luci-static/resources/view/homeproxy/node.js:710\nmsgid \"Default\"\nmsgstr \"默认\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:382\n#: htdocs/luci-static/resources/view/homeproxy/client.js:434\n#: htdocs/luci-static/resources/view/homeproxy/client.js:756\n#: htdocs/luci-static/resources/view/homeproxy/client.js:887\n#: htdocs/luci-static/resources/view/homeproxy/client.js:995\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1161\nmsgid \"Default DNS (issued by WAN)\"\nmsgstr \"默认 DNS（由 WAN 下发）\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:882\nmsgid \"Default DNS server\"\nmsgstr \"默认 DNS 服务器\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:377\nmsgid \"Default DNS server for resolving domain name in the server address.\"\nmsgstr \"用于解析服务器地址中的域名的默认 DNS 服务器。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:877\nmsgid \"Default DNS strategy\"\nmsgstr \"默认 DNS 解析策略\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:357\nmsgid \"Default outbound\"\nmsgstr \"默认出站\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:376\nmsgid \"Default outbound DNS\"\nmsgstr \"默认出站 DNS\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:358\nmsgid \"Default outbound for connections not matched by any routing rules.\"\nmsgstr \"用于未被任何路由规则匹配的连接的默认出站。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1389\nmsgid \"Default packet encoding\"\nmsgstr \"默认包封装格式\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:606\nmsgid \"Default server name\"\nmsgstr \"默认服务器名称\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:364\n#: htdocs/luci-static/resources/view/homeproxy/client.js:466\n#: htdocs/luci-static/resources/view/homeproxy/client.js:684\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1033\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1382\n#: htdocs/luci-static/resources/view/homeproxy/node.js:428\nmsgid \"Direct\"\nmsgstr \"直连\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1514\nmsgid \"Direct Domain List\"\nmsgstr \"直连域名列表\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1428\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1473\nmsgid \"Direct IPv4 IP-s\"\nmsgstr \"直连 IPv4 地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1431\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1476\nmsgid \"Direct IPv6 IP-s\"\nmsgstr \"直连 IPv6 地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1434\nmsgid \"Direct MAC-s\"\nmsgstr \"直连 MAC 地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:123\n#: htdocs/luci-static/resources/view/homeproxy/client.js:151\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1422\n#: htdocs/luci-static/resources/view/homeproxy/node.js:499\n#: htdocs/luci-static/resources/view/homeproxy/node.js:555\n#: htdocs/luci-static/resources/view/homeproxy/node.js:568\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1115\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1368\n#: htdocs/luci-static/resources/view/homeproxy/server.js:276\n#: htdocs/luci-static/resources/view/homeproxy/server.js:289\nmsgid \"Disable\"\nmsgstr \"禁用\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:363\nmsgid \"Disable (the service)\"\nmsgstr \"禁用（服务）\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:787\n#: htdocs/luci-static/resources/view/homeproxy/client.js:899\nmsgid \"Disable DNS cache\"\nmsgstr \"禁用 DNS 缓存\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:788\nmsgid \"Disable DNS cache in this query.\"\nmsgstr \"在本次查询中禁用 DNS 缓存。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:670\nmsgid \"Disable HTTP challenge\"\nmsgstr \"禁用 HTTP 验证\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:605\n#: htdocs/luci-static/resources/view/homeproxy/server.js:321\nmsgid \"Disable Path MTU discovery\"\nmsgstr \"禁用路径 MTU 探测\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:674\nmsgid \"Disable TLS ALPN challenge\"\nmsgstr \"禁用 TLS ALPN 认证\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:710\nmsgid \"Disable UDP domain unmapping\"\nmsgstr \"禁用 UDP 域名映射\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1182\nmsgid \"Disable cache and save cache in this query.\"\nmsgstr \"在本次查询中禁用缓存。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:901\nmsgid \"Disable cache expire\"\nmsgstr \"缓存永不过期\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1181\nmsgid \"Disable dns cache\"\nmsgstr \"禁用 DNS 缓存\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:606\n#: htdocs/luci-static/resources/view/homeproxy/server.js:322\nmsgid \"\"\n\"Disables Path MTU Discovery (RFC 8899). Packets will then be at most 1252 \"\n\"(IPv4) / 1232 (IPv6) bytes in size.\"\nmsgstr \"\"\n\"禁用路径 MTU 发现 (RFC 8899)。 数据包的大小最多为 1252 (IPv4) / 1232 (IPv6) \"\n\"字节。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:814\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1251\nmsgid \"Domain keyword\"\nmsgstr \"域名关键词\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:805\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1242\nmsgid \"Domain name\"\nmsgstr \"域名\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:818\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1255\nmsgid \"Domain regex\"\nmsgstr \"域名正则表达式\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:427\nmsgid \"Domain resolver\"\nmsgstr \"域名解析器\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:347\n#: htdocs/luci-static/resources/view/homeproxy/client.js:446\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1174\nmsgid \"Domain strategy\"\nmsgstr \"域名解析策略\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:781\nmsgid \"Domain strategy for resolving the domain names.\"\nmsgstr \"目标域名的解析策略。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:810\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1247\nmsgid \"Domain suffix\"\nmsgstr \"域名后缀\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:600\nmsgid \"Domains\"\nmsgstr \"域名\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:774\nmsgid \"Don't drop packets\"\nmsgstr \"不丢弃数据包\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1209\nmsgid \"Don't drop requests\"\nmsgstr \"不丢弃请求\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:989\n#: htdocs/luci-static/resources/view/homeproxy/server.js:517\nmsgid \"Download bandwidth\"\nmsgstr \"下载带宽\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:990\n#: htdocs/luci-static/resources/view/homeproxy/server.js:518\nmsgid \"Download bandwidth in Mbps.\"\nmsgstr \"下载带宽（单位：Mbps）。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:770\n#: htdocs/luci-static/resources/view/homeproxy/client.js:776\nmsgid \"Drop packets\"\nmsgstr \"丢弃数据包\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1204\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1211\nmsgid \"Drop requests\"\nmsgstr \"丢弃请求\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1375\nmsgid \"\"\n\"Drop/keep nodes that contain the specific keywords. <a target=\\\"_blank\\\" \"\n\"href=\\\"https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/\"\n\"Regular_Expressions\\\">Regex</a> is supported.\"\nmsgstr \"\"\n\"丢弃/保留 包含指定关键词的节点。支持<a target=\\\"_blank\\\" href=\\\"https://\"\n\"developer.mozilla.org/zh-CN/docs/Web/JavaScript/Guide/Regular_Expressions\\\">\"\n\"正则表达式</a>。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1367\nmsgid \"Drop/keep specific nodes from subscriptions.\"\nmsgstr \"从订阅中 丢弃/保留 指定节点\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:691\nmsgid \"\"\n\"EAB (External Account Binding) contains information necessary to bind or map \"\n\"an ACME account to some other account known by the CA.<br/>External account \"\n\"bindings are \\\"used to associate an ACME account with an existing account in \"\n\"a non-ACME system, such as a CA customer database.\"\nmsgstr \"\"\n\"EAB（外部帐户绑定）包含将 ACME 帐户绑定或映射到 CA 已知的其他帐户所需的信息。\"\n\"<br/>外部帐户绑定“用于将 ACME 帐户与非 ACME 系统中的现有帐户相关联，例如 CA \"\n\"客户数据库。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1094\nmsgid \"\"\n\"ECH (Encrypted Client Hello) is a TLS extension that allows a client to \"\n\"encrypt the first part of its ClientHello message.\"\nmsgstr \"\"\n\"ECH（Encrypted Client Hello）是一个 TLS 扩展，它允许客户端加密其 ClientHello \"\n\"信息的第一部分。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1109\n#: htdocs/luci-static/resources/view/homeproxy/server.js:835\nmsgid \"ECH config\"\nmsgstr \"ECH 配置\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1098\nmsgid \"ECH config path\"\nmsgstr \"ECH 配置路径\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:794\nmsgid \"ECH key\"\nmsgstr \"ECH 密钥\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:798\n#: htdocs/luci-static/resources/view/homeproxy/client.js:908\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1194\nmsgid \"EDNS Client subnet\"\nmsgstr \"ENDS 客户端子网\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:873\n#: htdocs/luci-static/resources/view/homeproxy/server.js:481\nmsgid \"Early data\"\nmsgstr \"前置数据\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:880\n#: htdocs/luci-static/resources/view/homeproxy/server.js:488\nmsgid \"Early data header name\"\nmsgstr \"前置数据标头\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:489\nmsgid \"Early data is sent in path instead of header by default.\"\nmsgstr \"前置数据默认发送在路径而不是标头中。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1211\nmsgid \"Edit nodes\"\nmsgstr \"修改节点\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:612\nmsgid \"Email\"\nmsgstr \"Email\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:414\n#: htdocs/luci-static/resources/view/homeproxy/client.js:590\n#: htdocs/luci-static/resources/view/homeproxy/client.js:942\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1070\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1329\n#: htdocs/luci-static/resources/view/homeproxy/server.js:148\n#: htdocs/luci-static/resources/view/homeproxy/server.js:166\nmsgid \"Enable\"\nmsgstr \"启用\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:722\n#: htdocs/luci-static/resources/view/homeproxy/server.js:371\nmsgid \"\"\n\"Enable 0-RTT QUIC connection handshake on the client side. This is not \"\n\"impacting much on the performance, as the protocol is fully multiplexed.<br/\"\n\">Disabling this is highly recommended, as it is vulnerable to replay attacks.\"\nmsgstr \"\"\n\"在客户端启用 0-RTT QUIC 连接握手。由于协议是完全复用的，这对性能影响不大。\"\n\"<br/>强烈建议禁用此功能，因为它容易受到重放攻击。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:721\n#: htdocs/luci-static/resources/view/homeproxy/server.js:370\nmsgid \"Enable 0-RTT handshake\"\nmsgstr \"启用 0-RTT 握手\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:595\nmsgid \"Enable ACME\"\nmsgstr \"启用 ACME\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1093\nmsgid \"Enable ECH\"\nmsgstr \"启用 ECH\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:984\n#: htdocs/luci-static/resources/view/homeproxy/server.js:512\nmsgid \"Enable TCP Brutal\"\nmsgstr \"启用 TCP Brutal\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:985\n#: htdocs/luci-static/resources/view/homeproxy/server.js:513\nmsgid \"Enable TCP Brutal congestion control algorithm\"\nmsgstr \"启用 TCP Brutal 拥塞控制算法。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1168\n#: htdocs/luci-static/resources/view/homeproxy/server.js:855\nmsgid \"Enable UDP fragmentation.\"\nmsgstr \"启用 UDP 分片。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:328\nmsgid \"Enable endpoint-independent NAT\"\nmsgstr \"启用端点独立 NAT\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:980\n#: htdocs/luci-static/resources/view/homeproxy/server.js:507\nmsgid \"Enable padding\"\nmsgstr \"启用填充\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:846\nmsgid \"Enable tcp fast open for listener.\"\nmsgstr \"为监听器启用 TCP 快速打开。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1172\nmsgid \"\"\n\"Enable the SUoT protocol, requires server support. Conflict with multiplex.\"\nmsgstr \"启用 SUoT 协议，需要服务端支持。与多路复用冲突。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:612\n#: htdocs/luci-static/resources/view/homeproxy/node.js:748\n#: htdocs/luci-static/resources/view/homeproxy/server.js:338\nmsgid \"Encrypt method\"\nmsgstr \"加密方式\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:139\nmsgid \"Error\"\nmsgstr \"错误\"\n\n#: htdocs/luci-static/resources/homeproxy.js:237\n#: htdocs/luci-static/resources/homeproxy.js:271\n#: htdocs/luci-static/resources/homeproxy.js:279\n#: htdocs/luci-static/resources/homeproxy.js:297\n#: htdocs/luci-static/resources/homeproxy.js:306\n#: htdocs/luci-static/resources/homeproxy.js:317\n#: htdocs/luci-static/resources/homeproxy.js:326\n#: htdocs/luci-static/resources/homeproxy.js:328\n#: htdocs/luci-static/resources/view/homeproxy/client.js:195\n#: htdocs/luci-static/resources/view/homeproxy/client.js:207\n#: htdocs/luci-static/resources/view/homeproxy/client.js:211\n#: htdocs/luci-static/resources/view/homeproxy/client.js:230\n#: htdocs/luci-static/resources/view/homeproxy/client.js:241\n#: htdocs/luci-static/resources/view/homeproxy/client.js:245\n#: htdocs/luci-static/resources/view/homeproxy/client.js:274\n#: htdocs/luci-static/resources/view/homeproxy/client.js:504\n#: htdocs/luci-static/resources/view/homeproxy/client.js:518\n#: htdocs/luci-static/resources/view/homeproxy/client.js:521\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1357\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1362\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1365\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1507\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1539\n#: htdocs/luci-static/resources/view/homeproxy/node.js:488\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1131\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1302\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1356\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1359\n#: htdocs/luci-static/resources/view/homeproxy/server.js:235\n#: htdocs/luci-static/resources/view/homeproxy/server.js:618\n#: htdocs/luci-static/resources/view/homeproxy/server.js:620\nmsgid \"Expecting: %s\"\nmsgstr \"请输入：%s\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:690\nmsgid \"External Account Binding\"\nmsgstr \"外部账户绑定\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:702\nmsgid \"External account MAC key\"\nmsgstr \"外部账户 MAC 密钥\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:696\nmsgid \"External account key ID\"\nmsgstr \"外部账户密钥标识符\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1237\nmsgid \"Extra records\"\nmsgstr \"附加记录\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:86\nmsgid \"Failed to generate %s, error: %s.\"\nmsgstr \"生成 %s 失败，错误：%s。\"\n\n#: htdocs/luci-static/resources/homeproxy.js:261\nmsgid \"Failed to upload %s, error: %s.\"\nmsgstr \"上传 %s 失败，错误：%s。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:140\nmsgid \"Fatal\"\nmsgstr \"致命\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1374\nmsgid \"Filter keywords\"\nmsgstr \"过滤关键词\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1366\nmsgid \"Filter nodes\"\nmsgstr \"过滤节点\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:630\nmsgid \"Firefox / uquic firefox\"\nmsgstr \"Firefox / uquic firefox\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:171\nmsgid \"Firewall\"\nmsgstr \"防火墙\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:736\n#: htdocs/luci-static/resources/view/homeproxy/server.js:385\nmsgid \"Flow\"\nmsgstr \"流控\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:428\nmsgid \"For resolving domain name in the server address.\"\nmsgstr \"用于解析服务器地址中的域名。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1340\nmsgid \"Format\"\nmsgstr \"格式\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:730\nmsgid \"Fragment TLS handshake into multiple TLS records.\"\nmsgstr \"将 TLS 握手分片为多个 TLS 记录\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:736\nmsgid \"\"\n\"Fragment TLS handshakes. Due to poor performance, try <code>%s</code> first.\"\nmsgstr \"分片 TLS 握手。由于性能较差，请先尝试 <code>%s</code>。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:742\nmsgid \"Fragment fallback delay\"\nmsgstr \"分片回退延迟\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:842\nmsgid \"GET\"\nmsgstr \"GET\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:256\nmsgid \"GFW list version\"\nmsgstr \"GFW 域名列表版本\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:252\nmsgid \"GFWList\"\nmsgstr \"GFWList\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1446\nmsgid \"Gaming mode IPv4 IP-s\"\nmsgstr \"游戏模式 IPv4 地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1448\nmsgid \"Gaming mode IPv6 IP-s\"\nmsgstr \"游戏模式 IPv6 地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1451\nmsgid \"Gaming mode MAC-s\"\nmsgstr \"游戏模式 MAC 地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:36\n#: htdocs/luci-static/resources/view/homeproxy/server.js:38\n#: htdocs/luci-static/resources/view/homeproxy/server.js:827\nmsgid \"Generate\"\nmsgstr \"生成\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:260\nmsgid \"GitHub token\"\nmsgstr \"GitHub 令牌\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:256\nmsgid \"Global\"\nmsgstr \"全局\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:759\nmsgid \"Global padding\"\nmsgstr \"全局填充\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1453\nmsgid \"Global proxy IPv4 IP-s\"\nmsgstr \"全局代理 IPv4 地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1456\nmsgid \"Global proxy IPv6 IP-s\"\nmsgstr \"全局代理 IPv6 地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1459\nmsgid \"Global proxy MAC-s\"\nmsgstr \"全局代理 MAC 地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:146\nmsgid \"Global settings\"\nmsgstr \"全局设置\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:238\nmsgid \"Google\"\nmsgstr \"谷歌\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:184\nmsgid \"Google Public DNS (8.8.8.8)\"\nmsgstr \"谷歌公共 DNS（8.8.8.8）\"\n\n#: root/usr/share/rpcd/acl.d/luci-app-homeproxy.json:3\nmsgid \"Grant access to homeproxy configuration\"\nmsgstr \"授予 homeproxy 访问 UCI 配置的权限\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:620\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1108\n#: htdocs/luci-static/resources/view/homeproxy/node.js:430\n#: htdocs/luci-static/resources/view/homeproxy/node.js:777\n#: htdocs/luci-static/resources/view/homeproxy/server.js:177\n#: htdocs/luci-static/resources/view/homeproxy/server.js:403\nmsgid \"HTTP\"\nmsgstr \"HTTP\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:952\nmsgid \"HTTP/3\"\nmsgstr \"HTTP/3\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:332\nmsgid \"\"\n\"HTTP3 server behavior when authentication fails.<br/>A 404 page will be \"\n\"returned if empty.\"\nmsgstr \"身份验证失败时的 HTTP3 服务器响应。默认返回 404 页面。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:951\nmsgid \"HTTPS\"\nmsgstr \"HTTPS\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:778\n#: htdocs/luci-static/resources/view/homeproxy/server.js:404\nmsgid \"HTTPUpgrade\"\nmsgstr \"HTTPUpgrade\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:744\nmsgid \"Handshake server address\"\nmsgstr \"握手服务器地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:750\nmsgid \"Handshake server port\"\nmsgstr \"握手服务器端口\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:974\nmsgid \"Headers\"\nmsgstr \"标头\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:727\n#: htdocs/luci-static/resources/view/homeproxy/server.js:376\nmsgid \"Heartbeat interval\"\nmsgstr \"心跳间隔\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:55\n#: htdocs/luci-static/resources/view/homeproxy/client.js:57\n#: htdocs/luci-static/resources/view/homeproxy/client.js:101\n#: htdocs/luci-static/resources/view/homeproxy/status.js:282\n#: root/usr/share/luci/menu.d/luci-app-homeproxy.json:3\nmsgid \"HomeProxy\"\nmsgstr \"HomeProxy\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:58\n#: htdocs/luci-static/resources/view/homeproxy/server.js:60\n#: htdocs/luci-static/resources/view/homeproxy/server.js:129\nmsgid \"HomeProxy Server\"\nmsgstr \"HomeProxy 服务端\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:535\nmsgid \"Hop interval\"\nmsgstr \"跳跃间隔\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:529\nmsgid \"Hopping port\"\nmsgstr \"跳跃端口\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:826\n#: htdocs/luci-static/resources/view/homeproxy/node.js:831\n#: htdocs/luci-static/resources/view/homeproxy/node.js:865\n#: htdocs/luci-static/resources/view/homeproxy/server.js:437\n#: htdocs/luci-static/resources/view/homeproxy/server.js:442\n#: htdocs/luci-static/resources/view/homeproxy/server.js:473\nmsgid \"Host\"\nmsgstr \"主机名\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:669\nmsgid \"Host key\"\nmsgstr \"主机密钥\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:674\nmsgid \"Host key algorithms\"\nmsgstr \"主机密钥算法\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:581\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1061\nmsgid \"Host/IP fields\"\nmsgstr \"主机/IP 字段\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:364\nmsgid \"\"\n\"How long the server should wait for the client to send the authentication \"\n\"command (in seconds).\"\nmsgstr \"服务器等待客户端发送认证命令的时间（单位：秒）。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:432\n#: htdocs/luci-static/resources/view/homeproxy/server.js:179\nmsgid \"Hysteria\"\nmsgstr \"Hysteria\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:433\n#: htdocs/luci-static/resources/view/homeproxy/server.js:180\nmsgid \"Hysteria2\"\nmsgstr \"Hysteria2\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:830\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1267\nmsgid \"IP CIDR\"\nmsgstr \"IP CIDR\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:608\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1089\nmsgid \"IP version\"\nmsgstr \"IP 版本\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:610\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1090\nmsgid \"IPv4\"\nmsgstr \"IPv4\"\n\n#: htdocs/luci-static/resources/homeproxy.js:20\nmsgid \"IPv4 only\"\nmsgstr \"仅 IPv4\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:611\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1091\nmsgid \"IPv6\"\nmsgstr \"IPv6\"\n\n#: htdocs/luci-static/resources/homeproxy.js:21\nmsgid \"IPv6 only\"\nmsgstr \"仅 IPv6\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:297\nmsgid \"IPv6 support\"\nmsgstr \"IPv6 支持\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:506\nmsgid \"Idle session check interval\"\nmsgstr \"空闲会话检查间隔\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:513\nmsgid \"Idle session check timeout\"\nmsgstr \"空闲会话检查超时\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:553\n#: htdocs/luci-static/resources/view/homeproxy/node.js:847\n#: htdocs/luci-static/resources/view/homeproxy/server.js:456\nmsgid \"Idle timeout\"\nmsgstr \"空闲超时\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:717\nmsgid \"\"\n\"If enabled, attempts to connect UDP connection to the destination instead of \"\n\"listen.\"\nmsgstr \"如果启用，尝试主动连接到目标的 UDP 而不是监听。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:711\nmsgid \"\"\n\"If enabled, for UDP proxy requests addressed to a domain, the original \"\n\"packet address will be sent in the response instead of the mapped domain.\"\nmsgstr \"\"\n\"如果启用，对于发送到域名的 UDP 代理请求，响应中将发送原始数据包地址而不是映射\"\n\"的域名。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:819\nmsgid \"\"\n\"If enabled, the client transport sends keepalive pings even with no active \"\n\"connections.\"\nmsgstr \"如果启用，客户端传输即使没有活动连接也会发送 keepalive ping。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:348\nmsgid \"\"\n\"If set, the requested domain name will be resolved to IP before routing.\"\nmsgstr \"如果设置，请求的域名将在路由前被解析为 IP 地址。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:804\n#: htdocs/luci-static/resources/view/homeproxy/server.js:425\nmsgid \"\"\n\"If the transport doesn't see any activity after a duration of this time (in \"\n\"seconds), it pings the client to check if the connection is still active.\"\nmsgstr \"\"\n\"如果传输在此时间段（单位：秒）后没有看到任何活动，它会向客户端发送 ping 请求\"\n\"以检查连接是否仍然活动。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1073\nmsgid \"\"\n\"If you have the root certificate, use this option instead of allowing \"\n\"insecure.\"\nmsgstr \"如果你拥有根证书，使用此选项而不是允许不安全连接。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:326\nmsgid \"Ignore client bandwidth\"\nmsgstr \"忽略客户端带宽\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1285\nmsgid \"Import\"\nmsgstr \"导入\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1232\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1311\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1313\nmsgid \"Import share links\"\nmsgstr \"导入分享链接\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:336\n#: htdocs/luci-static/resources/view/homeproxy/server.js:860\nmsgid \"In seconds.\"\nmsgstr \"单位：秒。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:937\nmsgid \"In seconds. Disabled by default.\"\nmsgstr \"单位：秒。默认禁用。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:521\nmsgid \"\"\n\"In the check, at least the first <code>n</code> idle sessions are kept open.\"\nmsgstr \"在检查中，至少保持前 <code>n</code> 个空闲会话处于打开状态。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:514\nmsgid \"\"\n\"In the check, close sessions that have been idle for longer than this, in \"\n\"seconds.\"\nmsgstr \"在检查中，关闭空闲时间超过此值的会话（单位：秒）。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:904\nmsgid \"Independent cache per server\"\nmsgstr \"独立缓存\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:137\nmsgid \"Info\"\nmsgstr \"信息\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1405\nmsgid \"Interface Control\"\nmsgstr \"接口控制\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:560\nmsgid \"Interrupt existing connections\"\nmsgstr \"中断现有连接\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:561\nmsgid \"Interrupt existing connections when the selected outbound has changed.\"\nmsgstr \"当选择的出站发生变化时中断现有连接。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:507\nmsgid \"Interval checking for idle sessions, in seconds.\"\nmsgstr \"空闲会话检查间隔（单位：秒）。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:728\n#: htdocs/luci-static/resources/view/homeproxy/server.js:377\nmsgid \"\"\n\"Interval for sending heartbeat packets for keeping the connection alive (in \"\n\"seconds).\"\nmsgstr \"发送心跳包以保持连接存活的时间间隔（单位：秒）。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:665\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1142\nmsgid \"Invert\"\nmsgstr \"反转\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:666\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1143\nmsgid \"Invert match result.\"\nmsgstr \"反转匹配结果\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:775\nmsgid \"Key path\"\nmsgstr \"证书路径\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1419\nmsgid \"LAN IP Policy\"\nmsgstr \"LAN IP 策略\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:409\n#: htdocs/luci-static/resources/view/homeproxy/client.js:585\n#: htdocs/luci-static/resources/view/homeproxy/client.js:937\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1065\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1324\n#: htdocs/luci-static/resources/view/homeproxy/node.js:422\n#: htdocs/luci-static/resources/view/homeproxy/server.js:160\nmsgid \"Label\"\nmsgstr \"标签\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:743\n#: htdocs/luci-static/resources/view/homeproxy/server.js:392\nmsgid \"\"\n\"Legacy protocol support (VMess MD5 Authentication) is provided for \"\n\"compatibility purposes only, use of alterId > 1 is not recommended.\"\nmsgstr \"\"\n\"提供旧协议支持（VMess MD5 身份验证）仅出于兼容性目的，不建议使用 alterId > \"\n\"1。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:325\nmsgid \"Less compatibility and sometimes better performance.\"\nmsgstr \"有时性能更好。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:629\nmsgid \"Let's Encrypt\"\nmsgstr \"Let's Encrypt\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:897\nmsgid \"\"\n\"List of IP (v4 or v6) addresses prefixes to be assigned to the interface.\"\nmsgstr \"分配给接口的 IP（v4 或 v6）地址前缀列表。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:132\n#: htdocs/luci-static/resources/view/homeproxy/client.js:161\n#: htdocs/luci-static/resources/view/homeproxy/client.js:497\nmsgid \"List of nodes to test.\"\nmsgstr \"要测试的节点列表。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1036\n#: htdocs/luci-static/resources/view/homeproxy/server.js:566\nmsgid \"List of supported application level protocols, in order of preference.\"\nmsgstr \"支持的应用层协议协商列表，按顺序排列。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1228\nmsgid \"List of text DNS record to respond as answers.\"\nmsgstr \"要响应的 DNS 记录列表。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1238\nmsgid \"List of text DNS record to respond as extra records.\"\nmsgstr \"要响应的附加 DNS 记录列表。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1233\nmsgid \"List of text DNS record to respond as name servers.\"\nmsgstr \"要响应的域名服务器（NS） DNS 记录列表。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:193\nmsgid \"Listen address\"\nmsgstr \"监听地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1407\nmsgid \"Listen interfaces\"\nmsgstr \"监听接口\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:198\nmsgid \"Listen port\"\nmsgstr \"监听端口\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:174\nmsgid \"Loading\"\nmsgstr \"加载中\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1335\nmsgid \"Local\"\nmsgstr \"本地\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:896\nmsgid \"Local address\"\nmsgstr \"本地地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:191\nmsgid \"Log file does not exist.\"\nmsgstr \"日志文件不存在。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:184\nmsgid \"Log is empty.\"\nmsgstr \"日志为空。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:930\nmsgid \"MTU\"\nmsgstr \"MTU\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:150\nmsgid \"Main UDP node\"\nmsgstr \"主 UDP 节点\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:122\nmsgid \"Main node\"\nmsgstr \"主节点\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:662\nmsgid \"Make IP CIDR in rule set used to match the source IP.\"\nmsgstr \"使规则集中的 IP CIDR 用于匹配源 IP。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1135\nmsgid \"Make IP CIDR in rule sets match the source IP.\"\nmsgstr \"使规则集中的 IP CIDR 匹配源 IP。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1139\nmsgid \"Make IP CIDR in rule-sets accept empty query response.\"\nmsgstr \"使规则集中的 IP CIDR 接受空查询响应。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:905\nmsgid \"\"\n\"Make each DNS server's cache independent for special purposes. If enabled, \"\n\"will slightly degrade performance.\"\nmsgstr \"独立缓存每个 DNS 服务器的结果以供特殊用途。启用后会略微降低性能。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:331\nmsgid \"Masquerade\"\nmsgstr \"伪装\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1268\nmsgid \"\"\n\"Match IP CIDR with query response. Current rule will be skipped if not match.\"\nmsgstr \"使用查询响应匹配 IP CIDR。如果不匹配，则跳过当前规则。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:831\nmsgid \"Match IP CIDR.\"\nmsgstr \"匹配 IP CIDR。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:811\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1248\nmsgid \"Match domain suffix.\"\nmsgstr \"匹配域名后缀。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:815\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1252\nmsgid \"Match domain using keyword.\"\nmsgstr \"使用关键词匹配域名。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:819\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1256\nmsgid \"Match domain using regular expression.\"\nmsgstr \"使用正则表达式匹配域名。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:806\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1243\nmsgid \"Match full domain.\"\nmsgstr \"匹配完整域名。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:854\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1292\nmsgid \"Match port range. Format as START:/:END/START:END.\"\nmsgstr \"匹配端口范围。格式为 START:/:END/START:END。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:849\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1287\nmsgid \"Match port.\"\nmsgstr \"匹配端口。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:835\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1272\nmsgid \"Match private IP\"\nmsgstr \"匹配私有 IP\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1273\nmsgid \"Match private IP with query response.\"\nmsgstr \"使用查询响应匹配私有 IP。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:827\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1264\nmsgid \"Match private source IP\"\nmsgstr \"匹配私有源 IP\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:859\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1297\nmsgid \"Match process name.\"\nmsgstr \"匹配进程名。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:867\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1305\nmsgid \"Match process path using regular expression.\"\nmsgstr \"使用正则表达式匹配进程路径。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:863\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1301\nmsgid \"Match process path.\"\nmsgstr \"匹配进程路径。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1096\nmsgid \"Match query type.\"\nmsgstr \"匹配请求类型。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:647\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1120\nmsgid \"Match rule set.\"\nmsgstr \"匹配规则集。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:823\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1260\nmsgid \"Match source IP CIDR.\"\nmsgstr \"匹配源 IP CIDR。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:844\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1282\nmsgid \"Match source port range. Format as START:/:END/START:END.\"\nmsgstr \"匹配源端口范围。格式为 START:/:END/START:END。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:839\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1277\nmsgid \"Match source port.\"\nmsgstr \"匹配源端口。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:643\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1116\nmsgid \"Match user name.\"\nmsgstr \"匹配用户名。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:579\n#: htdocs/luci-static/resources/view/homeproxy/server.js:261\nmsgid \"Max download speed\"\nmsgstr \"最大下载速度\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:580\n#: htdocs/luci-static/resources/view/homeproxy/server.js:262\nmsgid \"Max download speed in Mbps.\"\nmsgstr \"最大下载速度（Mbps）。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:739\nmsgid \"Max time difference\"\nmsgstr \"最大时间差\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:586\n#: htdocs/luci-static/resources/view/homeproxy/server.js:268\nmsgid \"Max upload speed\"\nmsgstr \"最大上传速度\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:587\n#: htdocs/luci-static/resources/view/homeproxy/server.js:269\nmsgid \"Max upload speed in Mbps.\"\nmsgstr \"最大上传速度（Mbps）。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1056\n#: htdocs/luci-static/resources/view/homeproxy/server.js:578\nmsgid \"Maximum TLS version\"\nmsgstr \"最大 TLS 版本\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:961\n#: htdocs/luci-static/resources/view/homeproxy/node.js:975\nmsgid \"Maximum connections\"\nmsgstr \"最大连接数\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:973\nmsgid \"\"\n\"Maximum multiplexed streams in a connection before opening a new connection.\"\n\"<br/>Conflict with <code>%s</code> and <code>%s</code>.\"\nmsgstr \"\"\n\"在打开新连接之前，连接中的最大多路复用流数量。与 <code>%s</code> 和 \"\n\"<code>%s</code> 冲突。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:972\nmsgid \"Maximum streams\"\nmsgstr \"最大流数量\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:768\n#: htdocs/luci-static/resources/view/homeproxy/client.js:776\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1202\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1211\n#: htdocs/luci-static/resources/view/homeproxy/node.js:841\n#: htdocs/luci-static/resources/view/homeproxy/server.js:452\nmsgid \"Method\"\nmsgstr \"方式\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1048\n#: htdocs/luci-static/resources/view/homeproxy/server.js:570\nmsgid \"Minimum TLS version\"\nmsgstr \"最低 TLS 版本\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:520\nmsgid \"Minimum idle sessions\"\nmsgstr \"最小空闲会话数\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:967\nmsgid \"\"\n\"Minimum multiplexed streams in a connection before opening a new connection.\"\nmsgstr \"在打开新连接之前，连接中的最小多路复用流数量。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:966\n#: htdocs/luci-static/resources/view/homeproxy/node.js:975\nmsgid \"Minimum streams\"\nmsgstr \"最小流数量\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:310\n#: htdocs/luci-static/resources/view/homeproxy/server.js:183\nmsgid \"Mixed\"\nmsgstr \"混合\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:321\nmsgid \"Mixed <code>system</code> TCP stack and <code>gVisor</code> UDP stack.\"\nmsgstr \"混合<code>系统</code> TCP 栈和 <code>gVisor</code> UDP 栈。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:595\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1075\nmsgid \"Mode\"\nmsgstr \"模式\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1164\n#: htdocs/luci-static/resources/view/homeproxy/server.js:850\nmsgid \"MultiPath TCP\"\nmsgstr \"多路径 TCP（MPTCP）\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:944\n#: htdocs/luci-static/resources/view/homeproxy/server.js:500\nmsgid \"Multiplex\"\nmsgstr \"多路复用\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:952\nmsgid \"Multiplex protocol.\"\nmsgstr \"多路复用协议。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:57\n#: htdocs/luci-static/resources/view/homeproxy/server.js:60\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1395\nmsgid \"NOTE: Save current settings before updating subscriptions.\"\nmsgstr \"注意：更新订阅前先保存当前配置。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1232\nmsgid \"NS\"\nmsgstr \"NS\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:711\nmsgid \"Native\"\nmsgstr \"原生\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:181\nmsgid \"NaïveProxy\"\nmsgstr \"NaïveProxy\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:637\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1099\n#: htdocs/luci-static/resources/view/homeproxy/server.js:866\nmsgid \"Network\"\nmsgstr \"网络\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:701\nmsgid \"New Reno\"\nmsgstr \"New Reno\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:774\n#: htdocs/luci-static/resources/view/homeproxy/node.js:791\n#: htdocs/luci-static/resources/view/homeproxy/server.js:400\n#: htdocs/luci-static/resources/view/homeproxy/server.js:417\nmsgid \"No TCP transport, plain HTTP is merged into the HTTP transport.\"\nmsgstr \"无 TCP 传输层, 纯 HTTP 已合并到 HTTP 传输层。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:789\n#: htdocs/luci-static/resources/view/homeproxy/server.js:415\nmsgid \"No additional encryption support: It's basically duplicate encryption.\"\nmsgstr \"无额外加密支持：它基本上是重复加密。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1412\nmsgid \"No subscription available\"\nmsgstr \"无可用订阅\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1437\nmsgid \"No subscription node\"\nmsgstr \"无订阅节点\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1271\nmsgid \"No valid share link found.\"\nmsgstr \"找不到有效分享链接。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:419\n#: htdocs/luci-static/resources/view/homeproxy/node.js:396\nmsgid \"Node\"\nmsgstr \"节点\"\n\n#: root/usr/share/luci/menu.d/luci-app-homeproxy.json:22\nmsgid \"Node Settings\"\nmsgstr \"节点设置\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1217\nmsgid \"Nodes\"\nmsgstr \"节点\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:994\n#: htdocs/luci-static/resources/view/homeproxy/node.js:737\n#: htdocs/luci-static/resources/view/homeproxy/node.js:775\n#: htdocs/luci-static/resources/view/homeproxy/server.js:386\n#: htdocs/luci-static/resources/view/homeproxy/server.js:401\nmsgid \"None\"\nmsgstr \"无\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:573\n#: htdocs/luci-static/resources/view/homeproxy/server.js:294\nmsgid \"Obfuscate password\"\nmsgstr \"混淆密码\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:567\n#: htdocs/luci-static/resources/view/homeproxy/server.js:288\nmsgid \"Obfuscate type\"\nmsgstr \"混淆类型\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1408\nmsgid \"Only process traffic from specific interfaces. Leave empty for all.\"\nmsgstr \"只处理来自指定接口的流量。留空表示全部。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:254\nmsgid \"Only proxy mainland China\"\nmsgstr \"仅代理中国大陆\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:580\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1060\nmsgid \"Other fields\"\nmsgstr \"其他字段\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:460\n#: htdocs/luci-static/resources/view/homeproxy/client.js:678\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1027\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1375\nmsgid \"Outbound\"\nmsgstr \"出站\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:420\nmsgid \"Outbound node\"\nmsgstr \"出站节点\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:696\nmsgid \"Override address\"\nmsgstr \"覆盖地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:352\nmsgid \"Override destination\"\nmsgstr \"覆盖目标地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:703\nmsgid \"Override port\"\nmsgstr \"覆盖端口\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:353\nmsgid \"Override the connection destination address with the sniffed domain.\"\nmsgstr \"使用嗅探到的域名覆盖连接目标。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:697\nmsgid \"Override the connection destination address.\"\nmsgstr \"覆盖目标连接地址。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:704\nmsgid \"Override the connection destination port.\"\nmsgstr \"覆盖目标连接端口。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:843\nmsgid \"PUT\"\nmsgstr \"PUT\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:886\nmsgid \"Packet encoding\"\nmsgstr \"数据包编码\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:244\nmsgid \"Padding scheme\"\nmsgstr \"填充方案\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:141\nmsgid \"Panic\"\nmsgstr \"崩溃\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:464\n#: htdocs/luci-static/resources/view/homeproxy/server.js:210\nmsgid \"Password\"\nmsgstr \"密码\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:967\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1346\n#: htdocs/luci-static/resources/view/homeproxy/node.js:836\n#: htdocs/luci-static/resources/view/homeproxy/node.js:869\n#: htdocs/luci-static/resources/view/homeproxy/server.js:447\n#: htdocs/luci-static/resources/view/homeproxy/server.js:477\nmsgid \"Path\"\nmsgstr \"路径\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:911\nmsgid \"Peer pubkic key\"\nmsgstr \"对端公钥\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:329\nmsgid \"\"\n\"Performance may degrade slightly, so it is not recommended to enable on when \"\n\"it is not needed.\"\nmsgstr \"性能可能会略有下降，建议仅在需要时开启。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:936\nmsgid \"Persistent keepalive interval\"\nmsgstr \"持久 keepalive 间隔\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:855\n#: htdocs/luci-static/resources/view/homeproxy/server.js:464\nmsgid \"Ping timeout\"\nmsgstr \"Ping 超时\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:630\nmsgid \"Plugin\"\nmsgstr \"插件\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:637\nmsgid \"Plugin opts\"\nmsgstr \"插件参数\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:848\n#: htdocs/luci-static/resources/view/homeproxy/client.js:962\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1286\n#: htdocs/luci-static/resources/view/homeproxy/node.js:453\nmsgid \"Port\"\nmsgstr \"端口\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:276\nmsgid \"Port %s alrealy exists!\"\nmsgstr \"端口 %s 已存在！\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:582\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1062\nmsgid \"Port fields\"\nmsgstr \"端口字段\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:536\nmsgid \"Port hopping interval in seconds.\"\nmsgstr \"端口跳跃间隔（单位：秒）。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:853\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1291\nmsgid \"Port range\"\nmsgstr \"端口范围\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:918\nmsgid \"Pre-shared key\"\nmsgstr \"预共享密钥\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1150\nmsgid \"Predefined\"\nmsgstr \"预定义\"\n\n#: htdocs/luci-static/resources/homeproxy.js:18\nmsgid \"Prefer IPv4\"\nmsgstr \"优先 IPv4\"\n\n#: htdocs/luci-static/resources/homeproxy.js:19\nmsgid \"Prefer IPv6\"\nmsgstr \"优先 IPv6\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:678\n#: htdocs/luci-static/resources/view/homeproxy/node.js:903\nmsgid \"Private key\"\nmsgstr \"私钥\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:683\nmsgid \"Private key passphrase\"\nmsgstr \"私钥指纹\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:583\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1063\nmsgid \"Process fields\"\nmsgstr \"进程字段\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:858\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1296\nmsgid \"Process name\"\nmsgstr \"进程名\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:862\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1300\nmsgid \"Process path\"\nmsgstr \"进程路径\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:866\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1304\nmsgid \"Process path (regex)\"\nmsgstr \"进程路径（正则表达式）\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:615\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1104\n#: htdocs/luci-static/resources/view/homeproxy/node.js:543\n#: htdocs/luci-static/resources/view/homeproxy/node.js:951\n#: htdocs/luci-static/resources/view/homeproxy/server.js:250\nmsgid \"Protocol\"\nmsgstr \"协议\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:767\nmsgid \"Protocol parameter. Enable length block encryption.\"\nmsgstr \"协议参数。启用长度块加密。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:760\nmsgid \"\"\n\"Protocol parameter. Will waste traffic randomly if enabled (enabled by \"\n\"default in v2ray and cannot be disabled).\"\nmsgstr \"协议参数。 如启用会随机浪费流量（在 v2ray 中默认启用并且无法禁用）。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1482\nmsgid \"Proxy Domain List\"\nmsgstr \"代理域名列表\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1437\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1466\nmsgid \"Proxy IPv4 IP-s\"\nmsgstr \"代理 IPv4 地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1440\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1469\nmsgid \"Proxy IPv6 IP-s\"\nmsgstr \"代理 IPv6 地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1443\nmsgid \"Proxy MAC-s\"\nmsgstr \"代理 MAC 地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1424\nmsgid \"Proxy all except listed\"\nmsgstr \"仅允许列表外\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1421\nmsgid \"Proxy filter mode\"\nmsgstr \"代理过滤模式\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1423\nmsgid \"Proxy listed only\"\nmsgstr \"仅允许列表内\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:284\nmsgid \"Proxy mode\"\nmsgstr \"代理模式\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:497\nmsgid \"Proxy protocol\"\nmsgstr \"代理协议\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:621\n#: htdocs/luci-static/resources/view/homeproxy/client.js:953\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1109\n#: htdocs/luci-static/resources/view/homeproxy/node.js:712\n#: htdocs/luci-static/resources/view/homeproxy/node.js:779\n#: htdocs/luci-static/resources/view/homeproxy/server.js:405\nmsgid \"QUIC\"\nmsgstr \"QUIC\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:699\n#: htdocs/luci-static/resources/view/homeproxy/server.js:355\nmsgid \"QUIC congestion control algorithm.\"\nmsgstr \"QUIC 拥塞控制算法。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:599\n#: htdocs/luci-static/resources/view/homeproxy/server.js:307\nmsgid \"QUIC connection receive window\"\nmsgstr \"QUIC 连接窗口\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:314\nmsgid \"QUIC maximum concurrent bidirectional streams\"\nmsgstr \"QUIC 最大双向并发流\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:593\n#: htdocs/luci-static/resources/view/homeproxy/server.js:300\nmsgid \"QUIC stream receive window\"\nmsgstr \"QUIC 流接收窗口\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1095\nmsgid \"Query type\"\nmsgstr \"请求类型\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1215\nmsgid \"RCode\"\nmsgstr \"RCode\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:622\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1110\nmsgid \"RDP\"\nmsgstr \"RDP\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:917\nmsgid \"RDRC timeout\"\nmsgstr \"RDRC 超时\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1142\n#: htdocs/luci-static/resources/view/homeproxy/server.js:709\nmsgid \"REALITY\"\nmsgstr \"REALITY\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:714\nmsgid \"REALITY private key\"\nmsgstr \"REALITY 私钥\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1147\n#: htdocs/luci-static/resources/view/homeproxy/server.js:730\nmsgid \"REALITY public key\"\nmsgstr \"REALITY 公钥\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1153\n#: htdocs/luci-static/resources/view/homeproxy/server.js:734\nmsgid \"REALITY short ID\"\nmsgstr \"REALITY 标识符\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:55\n#: htdocs/luci-static/resources/view/homeproxy/server.js:58\nmsgid \"RUNNING\"\nmsgstr \"运行中\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:665\nmsgid \"Random version will be used if empty.\"\nmsgstr \"如留空，则使用随机版本。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:488\nmsgid \"Recursive outbound detected!\"\nmsgstr \"检测到递归出站！\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1013\nmsgid \"Recursive resolver detected!\"\nmsgstr \"检测到递归解析器！\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:285\nmsgid \"Redirect TCP\"\nmsgstr \"Redirect TCP\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:287\nmsgid \"Redirect TCP + TProxy UDP\"\nmsgstr \"Redirect TCP + TProxy UDP\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:289\nmsgid \"Redirect TCP + Tun UDP\"\nmsgstr \"Redirect TCP + Tun UDP\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:219\nmsgid \"Refresh every %s seconds.\"\nmsgstr \"每 %s 秒刷新。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:659\nmsgid \"Region ID\"\nmsgstr \"区域 ID\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:672\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1149\nmsgid \"Reject\"\nmsgstr \"拒绝\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1336\nmsgid \"Remote\"\nmsgstr \"远程\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1434\nmsgid \"Remove %s nodes\"\nmsgstr \"移除 %s 个节点\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1424\nmsgid \"Remove all nodes from subscriptions\"\nmsgstr \"移除所有订阅节点\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1203\nmsgid \"Reply with REFUSED\"\nmsgstr \"回复 REFUSED\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:769\nmsgid \"Reply with TCP RST / ICMP port unreachable\"\nmsgstr \"回复 TCP RST / ICMP 端口不可达\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:925\nmsgid \"Reserved field bytes\"\nmsgstr \"保留字段字节\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:673\nmsgid \"Resolve\"\nmsgstr \"解析\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:780\nmsgid \"Resolve strategy\"\nmsgstr \"解析策略\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:241\nmsgid \"Resources management\"\nmsgstr \"资源管理\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:880\nmsgid \"Reuse address\"\nmsgstr \"复用地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:881\nmsgid \"Reuse listener address.\"\nmsgstr \"复用监听地址。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:792\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1187\nmsgid \"Rewrite TTL\"\nmsgstr \"重写 TTL\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:793\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1188\nmsgid \"Rewrite TTL in DNS responses.\"\nmsgstr \"在 DNS 响应中重写 TTL。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:670\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1147\nmsgid \"Route\"\nmsgstr \"路由\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:671\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1148\nmsgid \"Route options\"\nmsgstr \"路由选项\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:396\nmsgid \"Routing Nodes\"\nmsgstr \"路由节点\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:567\nmsgid \"Routing Rules\"\nmsgstr \"路由规则\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:120\nmsgid \"Routing Settings\"\nmsgstr \"路由设置\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:251\nmsgid \"Routing mode\"\nmsgstr \"路由模式\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:405\nmsgid \"Routing node\"\nmsgstr \"路由节点\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:264\nmsgid \"Routing ports\"\nmsgstr \"路由端口\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:576\nmsgid \"Routing rule\"\nmsgstr \"路由规则\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1311\nmsgid \"Rule Set\"\nmsgstr \"规则集\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:646\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1119\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1320\nmsgid \"Rule set\"\nmsgstr \"规则集\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:661\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1134\nmsgid \"Rule set IP CIDR as source IP\"\nmsgstr \"规则集 IP CIDR 作为源 IP\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1353\nmsgid \"Rule set URL\"\nmsgstr \"规则集 URL\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:623\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1111\n#: htdocs/luci-static/resources/view/homeproxy/node.js:438\nmsgid \"SSH\"\nmsgstr \"SSH\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:624\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1112\nmsgid \"STUN\"\nmsgstr \"STUN\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1177\nmsgid \"SUoT version\"\nmsgstr \"SUoT 版本\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:632\nmsgid \"Safari / Apple Network API\"\nmsgstr \"Safari / Apple Network API\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:569\n#: htdocs/luci-static/resources/view/homeproxy/server.js:290\nmsgid \"Salamander\"\nmsgstr \"Salamander\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:152\nmsgid \"Same as main node\"\nmsgstr \"保持与主节点一致\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:267\n#: htdocs/luci-static/resources/view/homeproxy/status.js:273\nmsgid \"Save\"\nmsgstr \"保存\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1397\nmsgid \"Save current settings\"\nmsgstr \"保存当前设置\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1394\nmsgid \"Save subscriptions settings\"\nmsgstr \"保存订阅设置\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1155\n#: htdocs/luci-static/resources/view/homeproxy/server.js:156\nmsgid \"Server\"\nmsgstr \"服务器\"\n\n#: root/usr/share/luci/menu.d/luci-app-homeproxy.json:30\nmsgid \"Server Settings\"\nmsgstr \"服务器设置\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:607\nmsgid \"\"\n\"Server name to use when choosing a certificate if the ClientHello's \"\n\"ServerName field is empty.\"\nmsgstr \"当 ClientHello 的 ServerName 字段为空时，选择证书所使用的服务器名称。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:151\nmsgid \"Server settings\"\nmsgstr \"服务器设置\"\n\n#: root/usr/share/luci/menu.d/luci-app-homeproxy.json:38\nmsgid \"Service Status\"\nmsgstr \"服务状态\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1175\nmsgid \"Set domain strategy for this query.\"\nmsgstr \"为此查询设置域名策略。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:436\nmsgid \"ShadowTLS\"\nmsgstr \"ShadowTLS\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:644\nmsgid \"ShadowTLS version\"\nmsgstr \"ShadowTLS 版本\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:435\n#: htdocs/luci-static/resources/view/homeproxy/server.js:184\nmsgid \"Shadowsocks\"\nmsgstr \"Shadowsocks\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:628\nmsgid \"Sniffed client type (QUIC client type or SSH client name).\"\nmsgstr \"嗅探到的客户端类型（QUIC 客户端类型或 SSH 客户端名称）。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:616\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1105\nmsgid \"\"\n\"Sniffed protocol, see <a target=\\\"_blank\\\" href=\\\"https://sing-box.sagernet.\"\n\"org/configuration/route/sniff/\\\">Sniff</a> for details.\"\nmsgstr \"\"\n\"嗅探协议，具体参见 <a target=\\\"_blank\\\" href=\\\"https://sing-box.sagernet.org/\"\n\"configuration/route/sniff/\\\">Sniff</a>。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:437\n#: htdocs/luci-static/resources/view/homeproxy/server.js:185\nmsgid \"Socks\"\nmsgstr \"Socks\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:654\nmsgid \"Socks version\"\nmsgstr \"Socks 版本\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:655\nmsgid \"Socks4\"\nmsgstr \"Socks4\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:656\nmsgid \"Socks4A\"\nmsgstr \"Socks4A\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:657\nmsgid \"Socks5\"\nmsgstr \"Socks5\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:822\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1259\nmsgid \"Source IP CIDR\"\nmsgstr \"源 IP CIDR\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1342\nmsgid \"Source file\"\nmsgstr \"源文件\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:838\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1276\nmsgid \"Source port\"\nmsgstr \"源端口\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:843\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1281\nmsgid \"Source port range\"\nmsgstr \"源端口范围\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:750\nmsgid \"\"\n\"Specifies DNS server tag to use instead of selecting through DNS routing.\"\nmsgstr \"指定使用的 DNS 服务器，而不是通过 DNS 规则选择。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:796\n#: htdocs/luci-static/resources/view/homeproxy/node.js:848\nmsgid \"\"\n\"Specifies the period of time (in seconds) after which a health check will be \"\n\"performed using a ping frame if no frames have been received on the \"\n\"connection.<br/>Please note that a ping response is considered a received \"\n\"frame, so if there is no other traffic on the connection, the health check \"\n\"will be executed every interval.\"\nmsgstr \"\"\n\"如果连接上没有收到任何帧，指定一段时间（单位：秒）后将使用 PING 帧执行健康检\"\n\"查。<br/>需要注意的是，PING 响应被视为已接收的帧，因此如果连接上没有其他流\"\n\"量，则健康检查将在每个间隔执行一次。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:422\n#: htdocs/luci-static/resources/view/homeproxy/server.js:457\nmsgid \"\"\n\"Specifies the time (in seconds) until idle clients should be closed with a \"\n\"GOAWAY frame. PING frames are not considered as activity.\"\nmsgstr \"\"\n\"指定闲置客户端应在多长时间（单位：秒）内使用 GOAWAY 帧关闭。PING 帧不被视为活\"\n\"动。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:800\n#: htdocs/luci-static/resources/view/homeproxy/node.js:856\nmsgid \"\"\n\"Specifies the timeout duration (in seconds) after sending a PING frame, \"\n\"within which a response must be received.<br/>If a response to the PING \"\n\"frame is not received within the specified timeout duration, the connection \"\n\"will be closed.\"\nmsgstr \"\"\n\"指定发送 PING 帧后，在指定的超时时间（单位：秒）内必须接收到响应。<br/>如果在\"\n\"指定的超时时间内没有收到 PING 帧的响应，则连接将关闭。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:265\nmsgid \"\"\n\"Specify target ports to be proxied. Multiple ports must be separated by \"\n\"commas.\"\nmsgstr \"指定需要被代理的目标端口。多个端口必须用逗号隔开。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:913\nmsgid \"Store RDRC\"\nmsgstr \"存储 RDRC\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:914\nmsgid \"\"\n\"Store rejected DNS response cache.<br/>The check results of <code>Address \"\n\"filter DNS rule items</code> will be cached until expiration.\"\nmsgstr \"\"\n\"存储被拒绝的 DNS 响应缓存。<br/><code>地址过滤 DNS 规则</code> 的检查结果将被\"\n\"缓存直到过期。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:557\n#: htdocs/luci-static/resources/view/homeproxy/server.js:278\nmsgid \"String\"\nmsgstr \"字符串\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1322\nmsgid \"Sub (%s)\"\nmsgstr \"订阅（%s）\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1349\nmsgid \"Subscription URL-s\"\nmsgstr \"订阅地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1333\nmsgid \"Subscriptions\"\nmsgstr \"订阅\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1273\nmsgid \"Successfully imported %s nodes of total %s.\"\nmsgstr \"成功导入 %s 个节点，共 %s 个。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:86\nmsgid \"Successfully updated.\"\nmsgstr \"更新成功。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1233\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1350\nmsgid \"\"\n\"Support Hysteria, Shadowsocks, Trojan, v2rayN (VMess), and XTLS (VLESS) \"\n\"online configuration delivery standard.\"\nmsgstr \"\"\n\"支持 Hysteria、Shadowsocks、Trojan、v2rayN（VMess）和 XTLS（VLESS）在线配置交\"\n\"付标准。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:180\nmsgid \"\"\n\"Support UDP, TCP, DoH, DoQ, DoT. TCP protocol will be used if not specified.\"\nmsgstr \"支持 UDP、TCP、DoH、DoQ、DoT。如未指定则使用 TCP 协议。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:313\nmsgid \"System\"\nmsgstr \"系统\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:383\n#: htdocs/luci-static/resources/view/homeproxy/client.js:435\n#: htdocs/luci-static/resources/view/homeproxy/client.js:757\n#: htdocs/luci-static/resources/view/homeproxy/client.js:888\n#: htdocs/luci-static/resources/view/homeproxy/client.js:996\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1162\nmsgid \"System DNS\"\nmsgstr \"系统 DNS\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:638\n#: htdocs/luci-static/resources/view/homeproxy/client.js:949\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1100\n#: htdocs/luci-static/resources/view/homeproxy/server.js:867\nmsgid \"TCP\"\nmsgstr \"TCP\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1161\n#: htdocs/luci-static/resources/view/homeproxy/server.js:845\nmsgid \"TCP fast open\"\nmsgstr \"TCP 快速打开\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:307\nmsgid \"TCP/IP stack\"\nmsgstr \"TCP/IP 协议栈\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:308\nmsgid \"TCP/IP stack.\"\nmsgstr \"TCP/IP 协议栈。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:625\n#: htdocs/luci-static/resources/view/homeproxy/client.js:950\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1113\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1003\n#: htdocs/luci-static/resources/view/homeproxy/server.js:532\nmsgid \"TLS\"\nmsgstr \"TLS\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1035\n#: htdocs/luci-static/resources/view/homeproxy/server.js:565\nmsgid \"TLS ALPN\"\nmsgstr \"TLS ALPN\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:980\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1030\n#: htdocs/luci-static/resources/view/homeproxy/server.js:560\nmsgid \"TLS SNI\"\nmsgstr \"TLS SNI\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:735\nmsgid \"TLS fragment\"\nmsgstr \"TLS 分片\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:787\n#: htdocs/luci-static/resources/view/homeproxy/server.js:413\nmsgid \"TLS is not enforced. If TLS is not configured, plain HTTP 1.1 is used.\"\nmsgstr \"不强制执行 TLS。如未配置 TLS，将使用纯 HTTP 1.1。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:729\n#: htdocs/luci-static/resources/view/homeproxy/client.js:737\nmsgid \"TLS record fragment\"\nmsgstr \"TLS 记录分片\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:989\nmsgid \"\"\n\"Tag of a another server to resolve the domain name in the address. Required \"\n\"if address contains domain.\"\nmsgstr \"\"\n\"用于解析本 DNS 服务器的域名的另一个 DNS 服务器的标签。如果服务器地址包括域名\"\n\"则必须。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1028\nmsgid \"Tag of an outbound for connecting to the dns server.\"\nmsgstr \"用于连接到 DNS 服务器的出站标签。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1376\nmsgid \"Tag of the outbound to download rule set.\"\nmsgstr \"用于下载规则集的出站标签。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1156\nmsgid \"Tag of the target dns server.\"\nmsgstr \"目标 DNS 服务器标签。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:679\nmsgid \"Tag of the target outbound.\"\nmsgstr \"目标出站标签。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:327\nmsgid \"\"\n\"Tell the client to use the BBR flow control algorithm instead of Hysteria CC.\"\nmsgstr \"让客户端使用 BBR 流控算法。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:187\n#: htdocs/luci-static/resources/view/homeproxy/client.js:222\nmsgid \"Tencent Public DNS (119.29.29.29)\"\nmsgstr \"腾讯公共 DNS（119.29.29.29）\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:510\nmsgid \"Test URL\"\nmsgstr \"测试 URL\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:138\n#: htdocs/luci-static/resources/view/homeproxy/client.js:167\n#: htdocs/luci-static/resources/view/homeproxy/client.js:530\nmsgid \"Test interval\"\nmsgstr \"测试间隔\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:538\nmsgid \"Test interval must be less or equal than idle timeout.\"\nmsgstr \"测试间隔时间必须小于或等于空闲超时时间。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:144\n#: htdocs/luci-static/resources/view/homeproxy/client.js:173\n#: htdocs/luci-static/resources/view/homeproxy/client.js:546\nmsgid \"Test tolerance\"\nmsgstr \"测试容差\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:628\nmsgid \"The ACME CA provider to use.\"\nmsgstr \"使用的 ACME CA 颁发机构。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:878\nmsgid \"The DNS strategy for resolving the domain name in the address.\"\nmsgstr \"解析域名的默认策略。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:600\n#: htdocs/luci-static/resources/view/homeproxy/server.js:308\nmsgid \"The QUIC connection-level flow control window for receiving data.\"\nmsgstr \"用于接收数据的 QUIC 连接级流控制窗口。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:594\n#: htdocs/luci-static/resources/view/homeproxy/server.js:301\nmsgid \"The QUIC stream-level flow control window for receiving data.\"\nmsgstr \"用于接收数据的 QUIC 流级流控制窗口。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:511\nmsgid \"The URL to test.\"\nmsgstr \"用于测试的 URL。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:958\nmsgid \"The address of the dns server.\"\nmsgstr \"DNS 服务器的地址。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:679\nmsgid \"\"\n\"The alternate port to use for the ACME HTTP challenge; if non-empty, this \"\n\"port will be used instead of 80 to spin up a listener for the HTTP challenge.\"\nmsgstr \"\"\n\"用于 ACME HTTP 质询的备用端口；如果非空，将使用此端口而不是 80 来启动 HTTP 质\"\n\"询的侦听器。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:685\nmsgid \"\"\n\"The alternate port to use for the ACME TLS-ALPN challenge; the system must \"\n\"forward 443 to this port for challenge to succeed.\"\nmsgstr \"\"\n\"用于 ACME TLS-ALPN 质询的备用端口； 系统必须将 443 转发到此端口以使质询成功。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:596\nmsgid \"\"\n\"The default rule uses the following matching logic:<br/><code>(domain || \"\n\"domain_suffix || domain_keyword || domain_regex || ip_cidr || \"\n\"ip_is_private)</code> &&<br/><code>(port || port_range)</code> &&<br/\"\n\"><code>(source_ip_cidr || source_ip_is_private)</code> &&<br/\"\n\"><code>(source_port || source_port_range)</code> &&<br/><code>other fields</\"\n\"code>.<br/>Additionally, included rule sets can be considered merged rather \"\n\"than as a single rule sub-item.\"\nmsgstr \"\"\n\"默认规则使用以下匹配逻辑：<br/><code>(domain || domain_suffix || \"\n\"domain_keyword || domain_regex || ip_cidr || ip_is_private)</code> &&<br/\"\n\"><code>(port || port_range)</code> &&<br/><code>(source_ip_cidr || \"\n\"source_ip_is_private)</code> &&<br/><code>(source_port || \"\n\"source_port_range)</code> &&<br/><code>其他字段</code>。此外，包含的所有规则\"\n\"集会被合并而不是独立生效。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1076\nmsgid \"\"\n\"The default rule uses the following matching logic:<br/><code>(domain || \"\n\"domain_suffix || domain_keyword || domain_regex)</code> &&<br/><code>(port \"\n\"|| port_range)</code> &&<br/><code>(source_ip_cidr || source_ip_is_private)</\"\n\"code> &&<br/><code>(source_port || source_port_range)</code> &&<br/\"\n\"><code>other fields</code>.<br/>Additionally, included rule sets can be \"\n\"considered merged rather than as a single rule sub-item.\"\nmsgstr \"\"\n\"默认规则使用以下匹配逻辑：<br/><code>(domain || domain_suffix || \"\n\"domain_keyword || domain_regex)</code> &&<br/><code>(port || port_range)</\"\n\"code> &&<br/><code>(source_ip_cidr || source_ip_is_private)</code> &&<br/\"\n\"><code>(source_port || source_port_range)</code> &&<br/><code>其他字段</\"\n\"code>。此外，包含的所有规则集会被合并而不是独立生效。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:218\nmsgid \"\"\n\"The dns server for resolving China domains. Support UDP, TCP, DoH, DoQ, DoT.\"\nmsgstr \"用于解析国内域名的 DNS 服务器。支持 UDP、TCP、DoH、DoQ、DoT。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:447\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1021\nmsgid \"The domain strategy for resolving the domain name in the address.\"\nmsgstr \"用于解析本 DNS 服务器的域名的策略。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1065\n#: htdocs/luci-static/resources/view/homeproxy/server.js:587\nmsgid \"\"\n\"The elliptic curves that will be used in an ECDHE handshake, in preference \"\n\"order. If empty, the default will be used.\"\nmsgstr \"将在 ECDHE 握手中使用的椭圆曲线，按优先顺序排列。留空使用默认值。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:613\nmsgid \"\"\n\"The email address to use when creating or selecting an existing ACME server \"\n\"account.\"\nmsgstr \"创建或选择现有 ACME 服务器帐户时使用的电子邮件地址。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:743\nmsgid \"\"\n\"The fallback value in milliseconds used when TLS segmentation cannot \"\n\"automatically determine the wait time.\"\nmsgstr \"当 TLS 分段无法自动确定等待时间时使用的回退值（单位：毫秒）。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:554\nmsgid \"The idle timeout in seconds.\"\nmsgstr \"空闲超时时间（单位：秒）。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1057\n#: htdocs/luci-static/resources/view/homeproxy/server.js:579\nmsgid \"The maximum TLS version that is acceptable.\"\nmsgstr \"可接受的最高 TLS 版本。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:315\nmsgid \"\"\n\"The maximum number of QUIC concurrent bidirectional streams that a peer is \"\n\"allowed to open.\"\nmsgstr \"允许对等点打开的 QUIC 并发双向流的最大数量。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:740\nmsgid \"The maximum time difference between the server and the client.\"\nmsgstr \"服务器和客户端之间的最大时间差。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1049\n#: htdocs/luci-static/resources/view/homeproxy/server.js:571\nmsgid \"The minimum TLS version that is acceptable.\"\nmsgstr \"可接受的最低 TLS 版本。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:102\n#: htdocs/luci-static/resources/view/homeproxy/server.js:130\nmsgid \"The modern ImmortalWrt proxy platform for ARM64/AMD64.\"\nmsgstr \"为 ARM64/AMD64 设计的现代 ImmortalWrt 代理平台。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:454\n#: htdocs/luci-static/resources/view/homeproxy/server.js:875\nmsgid \"The network interface to bind to.\"\nmsgstr \"绑定到的网络接口。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:968\nmsgid \"The path of the DNS server.\"\nmsgstr \"DNS 服务器的路径。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1099\nmsgid \"\"\n\"The path to the ECH config, in PEM format. If empty, load from DNS will be \"\n\"attempted.\"\nmsgstr \"PEM 格式的 ECH 配置路径。如果为空，将尝试从 DNS 加载。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1078\nmsgid \"The path to the server certificate, in PEM format.\"\nmsgstr \"服务端证书路径，需要 PEM 格式。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:199\nmsgid \"The port must be unique.\"\nmsgstr \"必须是唯一端口。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:963\nmsgid \"The port of the DNS server.\"\nmsgstr \"DNS 服务器的端口。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1216\nmsgid \"The response code.\"\nmsgstr \"响应代码。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:776\nmsgid \"The server private key, in PEM format.\"\nmsgstr \"服务端私钥，需要 PEM 格式。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:757\nmsgid \"The server public key, in PEM format.\"\nmsgstr \"服务端公钥，需要 PEM 格式。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:461\nmsgid \"\"\n\"The tag of the upstream outbound.<br/>Other dial fields will be ignored when \"\n\"enabled.\"\nmsgstr \"上游出站的标签。<br/>启用时，其他拨号字段将被忽略。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:139\n#: htdocs/luci-static/resources/view/homeproxy/client.js:168\n#: htdocs/luci-static/resources/view/homeproxy/client.js:531\nmsgid \"The test interval in seconds.\"\nmsgstr \"测试间隔时间（单位：秒）。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:145\n#: htdocs/luci-static/resources/view/homeproxy/client.js:174\n#: htdocs/luci-static/resources/view/homeproxy/client.js:547\nmsgid \"The test tolerance in milliseconds.\"\nmsgstr \"测试容差时间（单位：毫秒）。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:807\n#: htdocs/luci-static/resources/view/homeproxy/server.js:465\nmsgid \"\"\n\"The timeout (in seconds) that after performing a keepalive check, the client \"\n\"will wait for activity. If no activity is detected, the connection will be \"\n\"closed.\"\nmsgstr \"\"\n\"经过一段时间（单位：秒）之后，客户端将执行 keepalive 检查并等待活动。如果没有\"\n\"检测到任何活动，则会关闭连接。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1043\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1385\nmsgid \"\"\n\"This is <strong>DANGEROUS</strong>, your traffic is almost like \"\n\"<strong>PLAIN TEXT</strong>! Use at your own risk!\"\nmsgstr \"\"\n\"这是危险行为，您的流量将几乎等同于<strong>明文</strong>！使用风险自负！\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:717\nmsgid \"\"\n\"This is the TUIC port of the UDP over TCP protocol, designed to provide a \"\n\"QUIC stream based UDP relay mode that TUIC does not provide.\"\nmsgstr \"\"\n\"这是 TUIC 的 UDP over TCP 协议移植， 旨在提供 TUIC 不提供的基于 QUIC 流的 \"\n\"UDP 中继模式。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:188\n#: htdocs/luci-static/resources/view/homeproxy/client.js:223\nmsgid \"ThreatBook Public DNS (117.50.10.10)\"\nmsgstr \"微步在线公共 DNS（117.50.10.10）\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:723\nmsgid \"\"\n\"Timeout for UDP connections.<br/>Setting a larger value than the UDP timeout \"\n\"in inbounds will have no effect.\"\nmsgstr \"UDP 连接的超时时间。<br/>设置比入站的 UDP 超时更大的值将无效。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:918\nmsgid \"\"\n\"Timeout of rejected DNS response cache in seconds. <code>604800 (7d)</code> \"\n\"is used by default.\"\nmsgstr \"\"\n\"被拒绝的 DNS 响应缓存超时时间（单位：秒）。默认为 <code>604800（7 天）</\"\n\"code>。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:491\nmsgid \"\"\n\"To be compatible with Xray-core, set this to <code>Sec-WebSocket-Protocol</\"\n\"code>.\"\nmsgstr \"\"\n\"要与 Xray-core 兼容，请将其设置为 <code>Sec-WebSocket-Protocol</code>。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:292\nmsgid \"\"\n\"To enable Tun support, you need to install <code>ip-full</code> and \"\n\"<code>kmod-tun</code>\"\nmsgstr \"\"\n\"要启用 Tun 支持，您需要安装 <code>ip-full</code> 和 <code>kmod-tun</code>。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:135\nmsgid \"Trace\"\nmsgstr \"跟踪\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:773\n#: htdocs/luci-static/resources/view/homeproxy/server.js:399\nmsgid \"Transport\"\nmsgstr \"传输层\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:439\n#: htdocs/luci-static/resources/view/homeproxy/server.js:186\nmsgid \"Trojan\"\nmsgstr \"Trojan\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:441\n#: htdocs/luci-static/resources/view/homeproxy/server.js:188\nmsgid \"Tuic\"\nmsgstr \"Tuic\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:290\nmsgid \"Tun TCP/UDP\"\nmsgstr \"Tun TCP/UDP\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:947\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1334\n#: htdocs/luci-static/resources/view/homeproxy/node.js:427\n#: htdocs/luci-static/resources/view/homeproxy/server.js:175\nmsgid \"Type\"\nmsgstr \"类型\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:639\n#: htdocs/luci-static/resources/view/homeproxy/client.js:948\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1101\n#: htdocs/luci-static/resources/view/homeproxy/server.js:868\nmsgid \"UDP\"\nmsgstr \"UDP\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1167\n#: htdocs/luci-static/resources/view/homeproxy/server.js:854\nmsgid \"UDP Fragment\"\nmsgstr \"UDP 分片\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:335\n#: htdocs/luci-static/resources/view/homeproxy/server.js:859\nmsgid \"UDP NAT expiration time\"\nmsgstr \"UDP NAT 过期时间\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1171\nmsgid \"UDP over TCP\"\nmsgstr \"UDP over TCP\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:716\nmsgid \"UDP over stream\"\nmsgstr \"UDP over stream\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:709\nmsgid \"UDP packet relay mode.\"\nmsgstr \"UDP 包中继模式。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:708\nmsgid \"UDP relay mode\"\nmsgstr \"UDP 中继模式\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:722\nmsgid \"UDP timeout\"\nmsgstr \"UDP 超时\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:124\n#: htdocs/luci-static/resources/view/homeproxy/client.js:153\n#: htdocs/luci-static/resources/view/homeproxy/client.js:421\nmsgid \"URLTest\"\nmsgstr \"URLTest\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:131\n#: htdocs/luci-static/resources/view/homeproxy/client.js:160\n#: htdocs/luci-static/resources/view/homeproxy/client.js:496\nmsgid \"URLTest nodes\"\nmsgstr \"URLTest 节点\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:690\n#: htdocs/luci-static/resources/view/homeproxy/server.js:346\nmsgid \"UUID\"\nmsgstr \"UUID\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:98\nmsgid \"Unknown error.\"\nmsgstr \"未知错误。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:195\nmsgid \"Unknown error: %s\"\nmsgstr \"未知错误：%s\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1135\nmsgid \"Unsupported fingerprint!\"\nmsgstr \"不支持的指纹！\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1409\nmsgid \"Update %s subscriptions\"\nmsgstr \"更新 %s 个订阅\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:89\nmsgid \"Update failed.\"\nmsgstr \"更新失败。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1392\nmsgid \"Update interval\"\nmsgstr \"更新间隔\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1393\nmsgid \"Update interval of rule set.\"\nmsgstr \"规则集更新间隔。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1404\nmsgid \"Update nodes from subscriptions\"\nmsgstr \"从订阅更新节点\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1346\nmsgid \"Update subscriptions via proxy.\"\nmsgstr \"使用代理更新订阅。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1339\nmsgid \"Update time\"\nmsgstr \"更新时间\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1345\nmsgid \"Update via proxy\"\nmsgstr \"使用代理更新\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1104\nmsgid \"Upload ECH config\"\nmsgstr \"上传 ECH 配置\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:995\n#: htdocs/luci-static/resources/view/homeproxy/server.js:523\nmsgid \"Upload bandwidth\"\nmsgstr \"上传带宽\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:996\n#: htdocs/luci-static/resources/view/homeproxy/server.js:524\nmsgid \"Upload bandwidth in Mbps.\"\nmsgstr \"上传带宽（单位：Mbps）。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1085\n#: htdocs/luci-static/resources/view/homeproxy/server.js:767\nmsgid \"Upload certificate\"\nmsgstr \"上传证书\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:786\nmsgid \"Upload key\"\nmsgstr \"上传密钥\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1088\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1107\n#: htdocs/luci-static/resources/view/homeproxy/server.js:770\n#: htdocs/luci-static/resources/view/homeproxy/server.js:789\nmsgid \"Upload...\"\nmsgstr \"上传...\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:596\nmsgid \"Use ACME TLS certificate issuer.\"\nmsgstr \"使用 ACME TLS 证书颁发机构。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1031\n#: htdocs/luci-static/resources/view/homeproxy/server.js:561\nmsgid \"\"\n\"Used to verify the hostname on the returned certificates unless insecure is \"\n\"given.\"\nmsgstr \"用于验证返回证书上的主机名。如允许不安全连接，此配置无效。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:981\nmsgid \"Used to verify the hostname on the returned certificates.\"\nmsgstr \"用于验证返回证书上的主机名。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:642\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1115\nmsgid \"User\"\nmsgstr \"用户\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1379\nmsgid \"User-Agent\"\nmsgstr \"用户代理\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:458\n#: htdocs/luci-static/resources/view/homeproxy/server.js:203\nmsgid \"Username\"\nmsgstr \"用户名\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:444\n#: htdocs/luci-static/resources/view/homeproxy/server.js:189\nmsgid \"VLESS\"\nmsgstr \"VLESS\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:445\n#: htdocs/luci-static/resources/view/homeproxy/server.js:190\nmsgid \"VMess\"\nmsgstr \"VMess\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:181\n#: htdocs/luci-static/resources/view/homeproxy/client.js:219\nmsgid \"WAN DNS (read from interface)\"\nmsgstr \"WAN DNS（从接口获取）\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1464\nmsgid \"WAN IP Policy\"\nmsgstr \"WAN IP 策略\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:138\nmsgid \"Warn\"\nmsgstr \"警告\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:780\n#: htdocs/luci-static/resources/view/homeproxy/server.js:406\nmsgid \"WebSocket\"\nmsgstr \"WebSocket\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1370\nmsgid \"Whitelist mode\"\nmsgstr \"白名单模式\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:443\nmsgid \"WireGuard\"\nmsgstr \"WireGuard\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:912\nmsgid \"WireGuard peer public key.\"\nmsgstr \"WireGuard 对端公钥。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:919\nmsgid \"WireGuard pre-shared key.\"\nmsgstr \"WireGuard 预共享密钥。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:904\nmsgid \"WireGuard requires base64-encoded private keys.\"\nmsgstr \"WireGuard 要求 base64 编码的私钥。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:498\nmsgid \"Write proxy protocol in the connection header.\"\nmsgstr \"在连接头中写入代理协议。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:889\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1392\nmsgid \"Xudp (Xray-core)\"\nmsgstr \"Xudp (Xray-core)\"\n\n#: htdocs/luci-static/resources/homeproxy.js:259\nmsgid \"Your %s was successfully uploaded. Size: %sB.\"\nmsgstr \"您的 %s 已成功上传。大小：%sB。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:630\nmsgid \"ZeroSSL\"\nmsgstr \"ZeroSSL\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1090\n#: htdocs/luci-static/resources/view/homeproxy/server.js:772\nmsgid \"certificate\"\nmsgstr \"证书\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:716\nmsgid \"connect UDP connections\"\nmsgstr \"主动连接 UDP\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1050\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1058\n#: htdocs/luci-static/resources/view/homeproxy/server.js:572\n#: htdocs/luci-static/resources/view/homeproxy/server.js:580\nmsgid \"default\"\nmsgstr \"默认\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:53\nmsgid \"failed\"\nmsgstr \"失败\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:776\n#: htdocs/luci-static/resources/view/homeproxy/server.js:402\nmsgid \"gRPC\"\nmsgstr \"gRPC\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:818\nmsgid \"gRPC permit without stream\"\nmsgstr \"gRPC 允许无活动连接\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:813\n#: htdocs/luci-static/resources/view/homeproxy/server.js:430\nmsgid \"gRPC service name\"\nmsgstr \"gRPC 服务名称\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:311\nmsgid \"gVisor\"\nmsgstr \"gVisor\"\n\n#: htdocs/luci-static/resources/homeproxy.js:306\n#: htdocs/luci-static/resources/homeproxy.js:326\n#: htdocs/luci-static/resources/view/homeproxy/client.js:195\n#: htdocs/luci-static/resources/view/homeproxy/client.js:230\n#: htdocs/luci-static/resources/view/homeproxy/client.js:504\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1357\n#: htdocs/luci-static/resources/view/homeproxy/node.js:488\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1131\n#: htdocs/luci-static/resources/view/homeproxy/server.js:235\nmsgid \"non-empty value\"\nmsgstr \"非空值\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:631\n#: htdocs/luci-static/resources/view/homeproxy/node.js:887\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1390\nmsgid \"none\"\nmsgstr \"无\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:888\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1391\nmsgid \"packet addr (v2ray-core v5+)\"\nmsgstr \"packet addr (v2ray-core v5+)\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:50\nmsgid \"passed\"\nmsgstr \"通过\"\n\n#: htdocs/luci-static/resources/view/homeproxy/server.js:791\nmsgid \"private key\"\nmsgstr \"私钥\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:631\nmsgid \"quic-go / uquic chrome\"\nmsgstr \"quic-go / uquic chrome\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:285\nmsgid \"sing-box client\"\nmsgstr \"sing-box 客户端\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:288\nmsgid \"sing-box server\"\nmsgstr \"sing-box 服务端\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1113\nmsgid \"uTLS fingerprint\"\nmsgstr \"uTLS 指纹\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1114\nmsgid \"\"\n\"uTLS is a fork of \\\"crypto/tls\\\", which provides ClientHello fingerprinting \"\n\"resistance.\"\nmsgstr \"\"\n\"uTLS 是 \\\"crypto/tls\\\" 的一个分支，拥有抵抗 ClientHello 指纹识别的能力。\"\n\n#: htdocs/luci-static/resources/view/homeproxy/status.js:59\nmsgid \"unchecked\"\nmsgstr \"未检查\"\n\n#: htdocs/luci-static/resources/homeproxy.js:237\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1302\nmsgid \"unique UCI identifier\"\nmsgstr \"独立 UCI 标识\"\n\n#: htdocs/luci-static/resources/homeproxy.js:317\nmsgid \"unique value\"\nmsgstr \"独立值\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:500\n#: htdocs/luci-static/resources/view/homeproxy/node.js:645\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1178\nmsgid \"v1\"\nmsgstr \"v1\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:501\n#: htdocs/luci-static/resources/view/homeproxy/node.js:646\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1179\nmsgid \"v2\"\nmsgstr \"v2\"\n\n#: htdocs/luci-static/resources/view/homeproxy/node.js:647\nmsgid \"v3\"\nmsgstr \"v3\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:207\n#: htdocs/luci-static/resources/view/homeproxy/client.js:211\n#: htdocs/luci-static/resources/view/homeproxy/client.js:241\n#: htdocs/luci-static/resources/view/homeproxy/client.js:245\nmsgid \"valid DNS server address\"\nmsgstr \"有效 DNS 服务器地址\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:518\n#: htdocs/luci-static/resources/view/homeproxy/client.js:521\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1362\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1365\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1356\n#: htdocs/luci-static/resources/view/homeproxy/node.js:1359\nmsgid \"valid URL\"\nmsgstr \"有效网址\"\n\n#: htdocs/luci-static/resources/homeproxy.js:271\nmsgid \"valid base64 key with %d characters\"\nmsgstr \"包含 %d 个字符的有效 base64 密钥\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1507\n#: htdocs/luci-static/resources/view/homeproxy/client.js:1539\nmsgid \"valid hostname\"\nmsgstr \"有效主机名\"\n\n#: htdocs/luci-static/resources/homeproxy.js:297\nmsgid \"valid port range (port1:port2)\"\nmsgstr \"有效端口范围（port1:port2）\"\n\n#: htdocs/luci-static/resources/view/homeproxy/client.js:274\nmsgid \"valid port value\"\nmsgstr \"有效端口值\"\n\n#: htdocs/luci-static/resources/homeproxy.js:328\nmsgid \"valid uuid\"\nmsgstr \"有效 uuid\"\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/capabilities/homeproxy.json",
    "content": "{\n\t\"bounding\": [\n\t\t\"CAP_NET_ADMIN\",\n\t\t\"CAP_NET_BIND_SERVICE\",\n\t\t\"CAP_NET_RAW\",\n\t\t\"CAP_SYS_PTRACE\"\n\t],\n\t\"effective\": [\n\t\t\"CAP_NET_ADMIN\",\n\t\t\"CAP_NET_BIND_SERVICE\",\n\t\t\"CAP_NET_RAW\",\n\t\t\"CAP_SYS_PTRACE\"\n\t],\n\t\"ambient\": [\n\t\t\"CAP_NET_ADMIN\",\n\t\t\"CAP_NET_BIND_SERVICE\",\n\t\t\"CAP_NET_RAW\",\n\t\t\"CAP_SYS_PTRACE\"\n\t],\n\t\"permitted\": [\n\t\t\"CAP_NET_ADMIN\",\n\t\t\"CAP_NET_BIND_SERVICE\",\n\t\t\"CAP_NET_RAW\",\n\t\t\"CAP_SYS_PTRACE\"\n\t],\n\t\"inheritable\": [\n\t\t\"CAP_NET_ADMIN\",\n\t\t\"CAP_NET_BIND_SERVICE\",\n\t\t\"CAP_NET_RAW\",\n\t\t\"CAP_SYS_PTRACE\"\n\t]\n}\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/config/homeproxy",
    "content": "\nconfig homeproxy 'infra'\n\toption __warning 'DO NOT EDIT THIS SECTION, OR YOU ARE ON YOUR OWN!'\n\toption common_port '22,53,80,143,443,465,587,853,873,993,995,5222,8080,8443,9418'\n\toption mixed_port '5330'\n\toption redirect_port '5331'\n\toption tproxy_port '5332'\n\toption dns_port '5333'\n\toption dns_redirect '1'\n\toption ntp_server 'nil'\n\toption sniff_override '1'\n\toption udp_timeout ''\n\toption tun_name 'singtun0'\n\toption tun_addr4 '172.19.0.1/30'\n\toption tun_addr6 'fdfe:dcba:9876::1/126'\n\toption tun_mtu '9000'\n\toption table_mark '100'\n\toption self_mark '100'\n\toption tproxy_mark '101'\n\toption tun_mark '102'\n\nconfig homeproxy 'migration'\n\toption crontab '1'\n\nconfig homeproxy 'config'\n\toption main_node 'nil'\n\toption main_udp_node 'same'\n\toption dns_server '8.8.8.8'\n\toption china_dns_server '223.5.5.5'\n\toption routing_mode 'bypass_mainland_china'\n\toption routing_port 'common'\n\toption proxy_mode 'redirect_tproxy'\n\toption ipv6_support '1'\n\toption github_token ''\n\toption log_level 'warn'\n\nconfig homeproxy 'control'\n\toption lan_proxy_mode 'disabled'\n\tlist wan_proxy_ipv4_ips '91.105.192.0/23'\n\tlist wan_proxy_ipv4_ips '91.108.4.0/22'\n\tlist wan_proxy_ipv4_ips '91.108.8.0/22'\n\tlist wan_proxy_ipv4_ips '91.108.16.0/22'\n\tlist wan_proxy_ipv4_ips '91.108.12.0/22'\n\tlist wan_proxy_ipv4_ips '91.108.20.0/22'\n\tlist wan_proxy_ipv4_ips '91.108.56.0/22'\n\tlist wan_proxy_ipv4_ips '149.154.160.0/20'\n\tlist wan_proxy_ipv4_ips '185.76.151.0/24'\n\tlist wan_proxy_ipv4_ips '203.208.50.66/32'\n\tlist wan_proxy_ipv6_ips '2001:67c:4e8::/48'\n\tlist wan_proxy_ipv6_ips '2001:b28:f23c::/48'\n\tlist wan_proxy_ipv6_ips '2001:b28:f23d::/48'\n\tlist wan_proxy_ipv6_ips '2001:b28:f23f::/48'\n\tlist wan_proxy_ipv6_ips '2a0a:f280::/32'\n\nconfig homeproxy 'routing'\n\toption sniff_override '1'\n\toption default_outbound 'direct-out'\n\toption default_outbound_dns 'default-dns'\n\nconfig homeproxy 'dns'\n\toption dns_strategy 'prefer_ipv4'\n\toption default_server 'local-dns'\n\toption disable_cache '0'\n\toption disable_cache_expire '0'\n\nconfig homeproxy 'subscription'\n\toption auto_update '0'\n\toption allow_insecure '0'\n\toption packet_encoding 'xudp'\n\toption update_via_proxy '0'\n\toption filter_nodes 'blacklist'\n\tlist filter_keywords '重置|到期|过期|剩余|套餐'\n\tlist filter_keywords 'Expiration|Remaining'\n\nconfig homeproxy 'server'\n\toption enabled '0'\n\toption log_level 'warn'\n\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/resources/china_ip4.txt",
    "content": "1.1.8.0/24\n1.2.4.0/24\n1.8.1.0/24\n1.8.8.0/24\n1.12.0.0/14\n1.18.128.0/24\n1.24.0.0/13\n1.45.0.0/16\n1.48.0.0/14\n1.56.0.0/13\n1.68.0.0/14\n1.80.0.0/13\n1.88.0.0/14\n1.92.0.0/16\n1.94.0.0/15\n1.116.0.0/15\n1.118.2.0/24\n1.118.32.0/22\n1.118.36.0/24\n1.118.48.0/21\n1.118.64.0/19\n1.119.0.0/17\n1.119.128.0/18\n1.119.192.0/20\n1.119.208.0/22\n1.180.0.0/14\n1.184.0.0/15\n1.188.0.0/14\n1.192.0.0/13\n1.202.0.0/15\n1.204.0.0/14\n2.26.192.0/21\n2.56.255.0/24\n2.58.242.0/24\n2.59.151.0/24\n5.10.138.0/23\n5.10.140.0/24\n5.10.143.0/24\n5.181.219.0/24\n8.128.4.0/22\n8.128.32.0/19\n8.128.64.0/19\n8.128.96.0/20\n8.129.0.0/16\n8.130.0.0/15\n8.132.0.0/14\n8.136.0.0/13\n8.144.0.0/14\n8.148.0.0/19\n8.148.36.0/22\n8.148.41.0/24\n8.148.43.0/24\n8.148.64.0/18\n8.148.128.0/17\n8.149.0.0/16\n8.150.0.0/20\n8.150.16.0/21\n8.150.64.0/23\n8.152.0.0/13\n8.160.0.0/15\n8.162.0.0/18\n8.162.64.0/19\n8.163.0.0/16\n8.164.0.0/14\n8.168.0.0/15\n14.16.0.0/12\n14.102.156.0/22\n14.103.0.0/16\n14.104.0.0/13\n14.112.0.0/12\n14.134.0.0/15\n14.144.0.0/12\n14.204.0.0/15\n14.208.0.0/12\n14.241.232.0/21\n14.255.16.0/24\n14.255.238.0/24\n14.255.254.0/24\n16.2.142.0/23\n23.236.111.0/24\n23.247.128.0/24\n23.247.130.0/24\n27.0.128.0/24\n27.0.130.0/23\n27.0.164.0/22\n27.0.204.0/22\n27.0.208.0/21\n27.8.0.0/13\n27.16.0.0/12\n27.36.0.0/14\n27.40.0.0/13\n27.50.128.0/17\n27.98.224.0/19\n27.99.128.0/17\n27.106.204.0/22\n27.109.124.0/22\n27.112.0.0/21\n27.115.0.0/17\n27.128.0.0/15\n27.144.0.0/16\n27.148.0.0/14\n27.152.0.0/13\n27.184.0.0/13\n27.192.0.0/11\n27.224.0.0/14\n31.40.214.0/24\n31.57.10.0/24\n36.1.0.0/16\n36.4.0.0/14\n36.16.0.0/12\n36.32.0.0/14\n36.36.0.0/16\n36.40.0.0/13\n36.48.0.0/15\n36.50.226.0/24\n36.51.224.0/23\n36.51.226.0/24\n36.51.248.0/24\n36.51.253.0/24\n36.51.254.0/24\n36.56.0.0/13\n36.96.0.0/12\n36.112.0.0/15\n36.114.0.0/16\n36.128.0.0/10\n36.192.0.0/16\n36.206.0.0/16\n36.212.0.0/15\n36.214.0.0/16\n36.221.0.0/17\n36.248.0.0/14\n36.255.116.0/22\n36.255.128.0/22\n36.255.164.0/24\n38.111.220.0/23\n39.64.0.0/11\n39.96.0.0/13\n39.104.0.0/14\n39.108.0.0/16\n39.128.0.0/10\n40.0.176.0/20\n40.0.248.0/21\n40.72.0.0/15\n40.125.128.0/17\n40.126.64.0/18\n40.162.0.0/16\n40.198.10.0/24\n40.198.16.0/21\n40.198.24.0/23\n40.251.225.0/24\n40.251.227.0/24\n40.251.228.0/24\n42.0.128.0/17\n42.4.0.0/14\n42.48.0.0/15\n42.51.0.0/16\n42.52.0.0/14\n42.56.0.0/14\n42.62.0.0/17\n42.63.0.0/16\n42.80.0.0/15\n42.83.128.0/22\n42.83.132.0/23\n42.83.134.0/24\n42.83.144.0/22\n42.83.189.0/24\n42.83.190.0/24\n42.83.200.0/23\n42.84.0.0/14\n42.88.0.0/13\n42.96.128.0/17\n42.97.0.0/16\n42.99.0.0/18\n42.100.0.0/14\n42.120.0.0/15\n42.122.0.0/16\n42.123.64.0/18\n42.156.128.0/17\n42.157.128.0/21\n42.157.160.0/19\n42.157.192.0/21\n42.158.0.0/15\n42.176.0.0/13\n42.184.0.0/15\n42.186.0.0/16\n42.187.120.0/22\n42.187.128.0/17\n42.192.0.0/15\n42.194.12.0/24\n42.194.128.0/17\n42.199.240.0/22\n42.201.32.0/19\n42.201.64.0/21\n42.201.72.0/22\n42.201.76.0/23\n42.202.0.0/15\n42.224.0.0/12\n42.240.0.0/21\n42.240.8.0/22\n42.240.12.0/23\n42.240.16.0/23\n42.240.20.0/22\n42.240.48.0/24\n42.240.128.0/17\n42.242.0.0/15\n42.244.0.0/14\n42.248.0.0/15\n43.136.0.0/13\n43.144.0.0/15\n43.176.0.0/14\n43.180.0.0/16\n43.192.0.0/16\n43.193.0.0/18\n43.193.64.0/23\n43.194.0.0/20\n43.194.16.0/24\n43.195.0.0/20\n43.196.0.0/16\n43.224.12.0/22\n43.224.24.0/22\n43.224.52.0/23\n43.224.56.0/22\n43.224.80.0/22\n43.224.240.0/24\n43.225.76.0/22\n43.225.84.0/23\n43.225.87.0/24\n43.225.180.0/22\n43.225.208.0/22\n43.225.255.0/24\n43.226.32.0/19\n43.226.64.0/20\n43.226.116.0/22\n43.226.128.0/19\n43.226.164.0/22\n43.226.236.0/22\n43.227.56.0/21\n43.227.64.0/21\n43.227.80.0/20\n43.227.104.0/22\n43.227.140.0/22\n43.227.152.0/21\n43.227.160.0/20\n43.227.176.0/21\n43.227.192.0/19\n43.227.252.0/22\n43.228.0.0/19\n43.228.36.0/22\n43.228.40.0/21\n43.228.48.0/20\n43.228.64.0/21\n43.228.76.0/22\n43.228.204.0/22\n43.228.240.0/22\n43.229.48.0/22\n43.229.184.0/23\n43.229.216.0/22\n43.230.136.0/22\n43.230.221.0/24\n43.230.222.0/23\n43.231.41.0/24\n43.231.46.0/23\n43.231.96.0/20\n43.231.144.0/20\n43.231.160.0/21\n43.231.168.0/23\n43.231.170.0/24\n43.239.95.0/24\n43.239.120.0/22\n43.239.172.0/24\n43.240.0.0/22\n43.240.56.0/21\n43.240.72.0/22\n43.240.124.0/22\n43.240.128.0/22\n43.240.133.0/24\n43.240.136.0/22\n43.240.156.0/22\n43.240.192.0/21\n43.240.200.0/23\n43.240.202.0/24\n43.240.204.0/22\n43.240.220.0/22\n43.241.16.0/22\n43.241.48.0/24\n43.241.50.0/23\n43.241.76.0/22\n43.241.180.0/22\n43.241.208.0/20\n43.241.224.0/20\n43.241.240.0/22\n43.242.72.0/22\n43.242.84.0/22\n43.242.96.0/22\n43.242.152.0/21\n43.242.164.0/22\n43.242.180.0/22\n43.242.192.0/21\n43.242.252.0/22\n43.243.4.0/22\n43.243.12.0/22\n43.243.16.0/22\n43.243.88.0/22\n43.243.128.0/22\n43.243.136.0/22\n43.243.148.0/22\n43.243.156.0/22\n43.243.228.0/22\n43.243.232.0/22\n43.243.244.0/22\n43.247.4.0/24\n43.247.68.0/22\n43.247.84.0/22\n43.247.88.0/22\n43.247.100.0/22\n43.247.176.0/20\n43.247.196.0/22\n43.247.244.0/22\n43.247.248.0/22\n43.248.0.0/22\n43.248.48.0/22\n43.248.76.0/22\n43.248.96.0/21\n43.248.108.0/22\n43.248.112.0/21\n43.248.128.0/20\n43.248.184.0/21\n43.248.192.0/20\n43.248.232.0/22\n43.248.244.0/22\n43.249.0.0/23\n43.249.2.0/24\n43.249.136.0/22\n43.249.144.0/22\n43.249.168.0/22\n43.249.192.0/22\n43.249.236.0/22\n43.250.4.0/22\n43.250.32.0/22\n43.250.96.0/22\n43.250.112.0/22\n43.250.144.0/22\n43.250.168.0/22\n43.250.200.0/22\n43.250.236.0/22\n43.250.244.0/22\n43.251.4.0/22\n43.251.8.0/22\n43.251.36.0/22\n43.251.100.0/22\n43.251.232.0/22\n43.251.244.0/22\n43.252.48.0/24\n43.254.0.0/22\n43.254.8.0/22\n43.254.24.0/22\n43.254.44.0/22\n43.254.52.0/22\n43.254.88.0/22\n43.254.100.0/22\n43.254.104.0/23\n43.254.106.0/24\n43.254.116.0/22\n43.254.136.0/22\n43.254.140.0/23\n43.254.144.0/20\n43.254.168.0/21\n43.254.192.0/22\n43.254.200.0/22\n43.254.220.0/22\n43.254.224.0/20\n43.254.240.0/22\n43.254.248.0/21\n43.255.0.0/22\n43.255.68.0/22\n43.255.84.0/22\n43.255.96.0/22\n43.255.184.0/22\n43.255.200.0/22\n43.255.212.0/22\n43.255.224.0/21\n44.30.15.0/24\n44.30.28.0/24\n44.30.81.0/24\n44.31.42.0/24\n44.31.81.0/24\n44.31.96.0/24\n44.31.216.0/24\n44.32.143.0/24\n45.9.11.0/24\n45.12.88.0/24\n45.12.90.0/24\n45.40.192.0/18\n45.61.200.0/23\n45.61.226.0/24\n45.65.20.0/22\n45.67.223.0/24\n45.81.34.0/24\n45.112.232.0/22\n45.113.20.0/22\n45.113.24.0/22\n45.113.40.0/22\n45.113.200.0/22\n45.113.206.0/24\n45.114.189.0/24\n45.115.44.0/22\n45.115.144.0/22\n45.115.164.0/22\n45.115.200.0/22\n45.116.32.0/22\n45.116.52.0/22\n45.116.100.0/22\n45.116.140.0/22\n45.116.152.0/22\n45.116.208.0/22\n45.117.8.0/22\n45.117.68.0/22\n45.119.60.0/22\n45.119.68.0/22\n45.119.104.0/23\n45.119.116.0/22\n45.120.100.0/22\n45.120.164.0/22\n45.120.243.0/24\n45.123.117.0/24\n45.123.128.0/22\n45.123.168.0/21\n45.123.176.0/21\n45.124.20.0/22\n45.124.68.0/22\n45.124.76.0/22\n45.124.80.0/22\n45.124.124.0/22\n45.125.24.0/24\n45.125.44.0/22\n45.125.56.0/22\n45.126.112.0/22\n45.126.120.0/22\n45.127.129.0/24\n45.127.144.0/21\n45.135.149.0/24\n45.147.6.0/24\n45.150.236.0/23\n45.151.47.0/24\n45.202.64.0/22\n45.202.209.0/24\n45.202.210.0/23\n45.202.212.0/24\n45.248.8.0/22\n45.248.108.0/22\n45.249.212.0/22\n45.250.32.0/22\n45.250.39.0/24\n45.250.40.0/22\n45.250.152.0/23\n45.250.180.0/23\n45.250.184.0/22\n45.250.188.0/24\n45.251.2.0/23\n45.251.8.0/22\n45.251.20.0/22\n45.251.88.0/21\n45.251.100.0/22\n45.251.120.0/22\n45.252.0.0/22\n45.252.104.0/22\n45.253.24.0/22\n45.253.32.0/24\n45.253.60.0/22\n45.253.96.0/20\n45.253.112.0/21\n45.253.132.0/22\n45.253.136.0/21\n45.253.144.0/20\n45.253.160.0/19\n45.253.192.0/19\n45.253.224.0/20\n45.253.240.0/22\n45.254.8.0/22\n45.254.20.0/22\n45.254.48.0/23\n45.254.50.0/24\n45.254.64.0/20\n45.255.152.0/22\n47.92.0.0/14\n47.96.0.0/12\n47.112.0.0/13\n47.120.0.0/14\n49.4.0.0/18\n49.4.64.0/19\n49.4.96.0/21\n49.4.104.0/22\n49.4.108.0/23\n49.4.110.0/24\n49.4.112.0/21\n49.4.120.0/22\n49.4.124.0/23\n49.4.126.0/24\n49.4.128.0/22\n49.7.0.0/16\n49.52.0.0/14\n49.64.0.0/11\n49.112.0.0/13\n49.120.0.0/14\n49.128.223.0/24\n49.140.0.0/15\n49.208.0.0/14\n49.213.62.0/23\n49.221.26.0/23\n49.221.64.0/19\n49.221.128.0/19\n49.232.0.0/14\n49.239.192.0/18\n52.80.0.0/15\n52.82.0.0/17\n52.82.128.0/23\n52.82.131.0/24\n52.82.132.0/24\n52.82.134.0/23\n52.82.136.0/24\n52.82.144.0/23\n52.82.148.0/22\n52.82.160.0/21\n52.82.170.0/23\n52.82.172.0/22\n52.82.176.0/21\n52.82.184.0/23\n52.82.187.0/24\n52.82.188.0/23\n52.82.190.0/24\n52.82.192.0/18\n52.83.0.0/16\n52.130.0.0/15\n54.222.0.0/19\n54.222.32.0/21\n54.222.45.0/24\n54.222.46.0/23\n54.222.48.0/21\n54.222.57.0/24\n54.222.60.0/22\n54.222.64.0/23\n54.222.70.0/23\n54.222.72.0/21\n54.222.80.0/21\n54.222.88.0/22\n54.222.96.0/23\n54.222.100.0/22\n54.222.104.0/21\n54.222.112.0/22\n54.222.116.0/23\n54.222.128.0/17\n54.223.0.0/16\n58.16.0.0/13\n58.24.0.0/15\n58.30.0.0/15\n58.32.0.0/11\n58.67.128.0/17\n58.68.236.0/24\n58.68.247.0/24\n58.82.0.0/22\n58.83.17.0/24\n58.83.128.0/17\n58.87.64.0/18\n58.99.128.0/17\n58.100.0.0/15\n58.116.0.0/14\n58.128.0.0/13\n58.144.0.0/16\n58.154.0.0/15\n58.192.0.0/11\n58.240.0.0/12\n59.32.0.0/13\n59.40.0.0/15\n59.42.0.0/16\n59.44.0.0/14\n59.48.0.0/12\n59.64.0.0/12\n59.80.0.0/17\n59.81.8.0/23\n59.81.40.0/23\n59.81.46.0/24\n59.81.64.0/23\n59.81.82.0/23\n59.81.94.0/23\n59.81.102.0/23\n59.81.104.0/22\n59.82.0.0/17\n59.82.128.0/19\n59.83.192.0/19\n59.83.224.0/21\n59.83.232.0/22\n59.107.0.0/17\n59.108.0.0/16\n59.110.0.0/16\n59.111.0.0/20\n59.111.17.0/24\n59.111.18.0/23\n59.111.21.0/24\n59.111.22.0/24\n59.111.24.0/21\n59.111.32.0/24\n59.111.35.0/24\n59.111.36.0/24\n59.111.40.0/21\n59.111.64.0/19\n59.111.96.0/21\n59.111.104.0/23\n59.111.107.0/24\n59.111.109.0/24\n59.111.111.0/24\n59.111.112.0/21\n59.111.128.0/20\n59.111.144.0/24\n59.111.152.0/21\n59.111.160.0/21\n59.111.168.0/22\n59.111.173.0/24\n59.111.175.0/24\n59.111.178.0/23\n59.111.181.0/24\n59.111.182.0/23\n59.111.190.0/24\n59.111.192.0/23\n59.111.198.0/23\n59.111.203.0/24\n59.111.205.0/24\n59.111.211.0/24\n59.111.214.0/24\n59.111.224.0/21\n59.111.232.0/23\n59.111.236.0/24\n59.111.238.0/23\n59.111.240.0/22\n59.111.244.0/24\n59.111.248.0/21\n59.151.0.0/17\n59.152.36.0/24\n59.152.38.0/23\n59.153.4.0/23\n59.153.32.0/22\n59.153.92.0/22\n59.153.116.0/22\n59.153.164.0/22\n59.153.168.0/24\n59.172.0.0/14\n59.252.0.0/16\n60.0.0.0/11\n60.63.0.0/16\n60.160.0.0/11\n60.194.0.0/15\n60.200.0.0/24\n60.204.0.0/14\n60.208.0.0/12\n60.232.132.0/23\n60.232.244.0/23\n60.235.0.0/16\n60.245.128.0/17\n60.247.0.0/16\n60.252.0.0/16\n60.253.128.0/17\n60.255.0.0/16\n61.4.80.0/23\n61.10.96.0/20\n61.10.128.0/20\n61.10.160.0/20\n61.10.192.0/18\n61.15.0.0/18\n61.15.112.0/20\n61.15.128.0/17\n61.18.0.0/17\n61.28.20.0/24\n61.28.22.0/24\n61.28.49.0/24\n61.28.108.0/24\n61.28.112.0/20\n61.29.128.0/18\n61.47.128.0/18\n61.48.0.0/13\n61.87.192.0/18\n61.114.80.0/20\n61.128.0.0/10\n61.232.0.0/14\n61.237.0.0/16\n61.240.0.0/16\n61.241.0.0/17\n61.241.128.0/18\n61.241.192.0/19\n61.242.0.0/15\n62.72.181.0/24\n62.234.0.0/16\n63.140.0.0/24\n63.140.3.0/24\n64.188.38.0/23\n64.188.40.0/22\n64.188.44.0/23\n66.102.240.0/21\n66.102.248.0/22\n66.102.252.0/24\n66.102.254.0/23\n68.79.0.0/18\n69.163.104.0/24\n69.163.106.0/24\n69.163.123.0/24\n69.172.70.0/24\n69.230.192.0/18\n69.231.128.0/18\n69.234.192.0/18\n69.235.128.0/18\n71.131.192.0/18\n71.132.0.0/18\n71.136.64.0/18\n71.137.0.0/18\n72.163.240.0/23\n72.163.248.0/22\n74.114.51.0/24\n74.122.24.0/24\n77.73.8.0/24\n77.107.118.0/24\n81.23.208.0/20\n81.68.0.0/14\n81.173.18.0/23\n81.173.20.0/22\n81.173.28.0/24\n82.156.0.0/15\n84.54.2.0/23\n87.76.211.0/24\n87.76.221.0/24\n87.76.222.0/24\n87.254.207.0/24\n93.95.117.0/24\n93.183.14.0/24\n93.183.18.0/24\n94.191.0.0/17\n101.1.0.0/22\n101.2.172.0/22\n101.4.0.0/14\n101.16.0.0/12\n101.33.128.0/17\n101.34.0.0/15\n101.36.64.0/20\n101.36.128.0/17\n101.37.0.0/16\n101.39.0.0/16\n101.40.0.0/16\n101.42.0.0/15\n101.49.148.0/23\n101.49.206.0/23\n101.49.208.0/24\n101.49.212.0/24\n101.50.8.0/21\n101.50.56.0/22\n101.52.4.0/24\n101.52.6.0/24\n101.52.112.0/21\n101.52.124.0/22\n101.52.128.0/20\n101.52.204.0/22\n101.52.212.0/22\n101.52.216.0/21\n101.52.232.0/23\n101.52.236.0/22\n101.52.240.0/20\n101.53.100.0/22\n101.55.21.0/24\n101.64.0.0/13\n101.72.0.0/14\n101.76.0.0/15\n101.78.0.0/22\n101.80.0.0/12\n101.96.10.0/23\n101.96.128.0/23\n101.96.130.0/24\n101.96.132.0/23\n101.96.134.0/24\n101.96.142.0/23\n101.96.144.0/20\n101.96.192.0/18\n101.104.144.0/20\n101.104.160.0/20\n101.106.0.0/19\n101.124.0.0/20\n101.124.19.0/24\n101.124.22.0/24\n101.124.62.0/24\n101.125.0.0/22\n101.125.4.0/23\n101.125.6.0/24\n101.125.130.0/24\n101.125.250.0/23\n101.125.252.0/22\n101.126.0.0/18\n101.126.64.0/19\n101.126.96.0/20\n101.126.128.0/19\n101.126.172.0/22\n101.126.176.0/20\n101.126.192.0/19\n101.126.228.0/22\n101.126.232.0/21\n101.126.240.0/20\n101.128.0.0/22\n101.129.0.0/16\n101.132.0.0/15\n101.197.0.0/16\n101.198.0.0/22\n101.198.4.0/24\n101.198.160.0/19\n101.198.192.0/19\n101.199.48.0/20\n101.199.112.0/24\n101.199.128.0/23\n101.199.196.0/22\n101.199.252.0/22\n101.200.0.0/15\n101.203.172.0/22\n101.204.0.0/14\n101.224.0.0/13\n101.234.76.0/22\n101.236.0.0/18\n101.236.64.0/20\n101.236.128.0/17\n101.237.0.0/19\n101.237.33.0/24\n101.237.34.0/23\n101.237.36.0/22\n101.237.40.0/24\n101.237.128.0/20\n101.240.0.0/14\n101.245.0.0/17\n101.245.128.0/20\n101.245.144.0/22\n101.245.152.0/21\n101.245.160.0/20\n101.246.172.0/22\n101.246.176.0/20\n101.248.0.0/15\n101.251.0.0/22\n101.251.80.0/20\n101.251.128.0/19\n101.251.160.0/20\n101.251.176.0/22\n101.251.192.0/18\n101.252.0.0/15\n101.254.0.0/20\n101.254.32.0/19\n101.254.64.0/18\n101.254.128.0/17\n103.1.8.0/22\n103.1.20.0/22\n103.1.168.0/22\n103.2.108.0/22\n103.2.208.0/22\n103.3.96.0/22\n103.3.112.0/20\n103.3.128.0/22\n103.3.136.0/21\n103.3.152.0/21\n103.4.56.0/22\n103.5.52.0/24\n103.5.192.0/23\n103.5.194.0/24\n103.6.220.0/22\n103.7.140.0/23\n103.8.32.0/22\n103.8.52.0/22\n103.8.68.0/22\n103.8.220.0/22\n103.9.8.0/22\n103.9.252.0/22\n103.10.0.0/22\n103.10.84.0/22\n103.12.98.0/23\n103.12.184.0/22\n103.12.232.0/22\n103.13.12.0/24\n103.13.244.0/22\n103.14.78.0/24\n103.14.132.0/22\n103.14.136.0/22\n103.15.4.0/22\n103.16.124.0/22\n103.17.40.0/22\n103.17.228.0/22\n103.19.46.0/23\n103.19.64.0/22\n103.19.232.0/22\n103.20.32.0/22\n103.20.112.0/22\n103.20.128.0/22\n103.20.160.0/22\n103.20.248.0/22\n103.21.116.0/22\n103.21.140.0/22\n103.21.176.0/22\n103.22.188.0/22\n103.22.252.0/22\n103.23.8.0/22\n103.23.160.0/22\n103.24.116.0/22\n103.24.176.0/22\n103.24.228.0/22\n103.24.248.0/22\n103.25.20.0/22\n103.25.24.0/22\n103.25.36.0/22\n103.25.64.0/23\n103.25.156.0/24\n103.26.0.0/22\n103.26.64.0/22\n103.26.76.0/22\n103.27.24.0/22\n103.27.240.0/22\n103.28.8.0/24\n103.28.147.0/24\n103.28.204.0/22\n103.28.212.0/22\n103.29.16.0/22\n103.29.24.0/23\n103.29.136.0/22\n103.30.51.0/24\n103.30.148.0/24\n103.30.151.0/24\n103.31.48.0/22\n103.31.200.0/22\n103.31.236.0/22\n103.35.104.0/22\n103.35.254.0/24\n103.36.28.0/22\n103.36.36.0/22\n103.36.63.0/24\n103.36.96.0/22\n103.36.132.0/22\n103.36.136.0/22\n103.36.165.0/24\n103.36.168.0/24\n103.36.172.0/22\n103.36.192.0/20\n103.36.208.0/22\n103.36.220.0/22\n103.37.4.0/24\n103.37.7.0/24\n103.37.12.0/22\n103.37.18.0/23\n103.37.44.0/23\n103.37.46.0/24\n103.37.72.0/22\n103.37.100.0/22\n103.37.136.0/21\n103.37.144.0/20\n103.37.160.0/21\n103.37.172.0/22\n103.38.40.0/22\n103.38.92.0/23\n103.38.116.0/22\n103.38.224.0/22\n103.38.232.0/22\n103.38.252.0/23\n103.39.64.0/22\n103.39.200.0/21\n103.39.208.0/20\n103.39.224.0/21\n103.39.232.0/22\n103.40.12.0/22\n103.40.173.0/24\n103.40.174.0/23\n103.40.192.0/22\n103.40.232.0/22\n103.40.240.0/20\n103.41.0.0/22\n103.41.116.0/22\n103.41.164.0/22\n103.41.232.0/23\n103.42.76.0/22\n103.42.104.0/22\n103.43.134.0/23\n103.43.184.0/21\n103.43.240.0/23\n103.44.56.0/22\n103.44.80.0/22\n103.44.144.0/22\n103.44.168.0/22\n103.44.236.0/22\n103.44.240.0/20\n103.45.72.0/21\n103.45.128.0/19\n103.45.160.0/22\n103.45.168.0/23\n103.45.172.0/22\n103.45.176.0/20\n103.45.248.0/22\n103.46.12.0/22\n103.46.16.0/20\n103.46.32.0/19\n103.46.64.0/18\n103.46.128.0/21\n103.46.136.0/22\n103.46.168.0/22\n103.47.48.0/22\n103.47.80.0/22\n103.49.12.0/22\n103.49.196.0/24\n103.49.198.0/23\n103.50.91.0/24\n103.51.62.0/23\n103.52.100.0/22\n103.52.104.0/23\n103.52.172.0/22\n103.52.176.0/22\n103.52.196.0/22\n103.53.124.0/22\n103.53.208.0/24\n103.53.211.0/24\n103.55.172.0/22\n103.55.228.0/22\n103.56.60.0/22\n103.56.76.0/22\n103.56.100.0/22\n103.56.104.0/22\n103.56.152.0/22\n103.57.12.0/22\n103.57.136.0/23\n103.57.139.0/24\n103.59.112.0/22\n103.59.124.0/22\n103.59.148.0/22\n103.59.168.0/23\n103.60.32.0/22\n103.60.164.0/22\n103.60.228.0/23\n103.60.236.0/22\n103.61.60.0/22\n103.61.104.0/23\n103.61.153.0/24\n103.61.154.0/23\n103.61.188.0/22\n103.62.88.0/23\n103.63.160.0/20\n103.63.176.0/21\n103.63.244.0/22\n103.64.24.0/21\n103.64.140.0/22\n103.64.144.0/22\n103.64.152.0/21\n103.64.208.0/21\n103.65.8.0/22\n103.65.224.0/23\n103.66.32.0/22\n103.68.128.0/22\n103.69.16.0/22\n103.69.116.0/22\n103.70.8.0/22\n103.70.220.0/22\n103.71.68.0/22\n103.71.200.0/23\n103.71.202.0/24\n103.71.232.0/22\n103.72.113.0/24\n103.72.172.0/24\n103.73.48.0/24\n103.73.116.0/22\n103.73.136.0/21\n103.73.144.0/22\n103.73.204.0/22\n103.74.24.0/21\n103.74.48.0/22\n103.74.80.0/22\n103.75.107.0/24\n103.75.152.0/22\n103.76.60.0/22\n103.76.220.0/22\n103.76.224.0/22\n103.77.28.0/22\n103.77.72.0/22\n103.77.92.0/22\n103.77.132.0/22\n103.78.60.0/22\n103.78.126.0/23\n103.78.228.0/22\n103.79.24.0/22\n103.79.200.0/22\n103.79.228.0/24\n103.81.4.0/22\n103.81.48.0/22\n103.81.72.0/22\n103.81.123.0/24\n103.81.184.0/23\n103.81.200.0/22\n103.82.52.0/22\n103.82.224.0/22\n103.83.44.0/22\n103.83.72.0/22\n103.83.120.0/22\n103.85.84.0/22\n103.85.147.0/24\n103.85.164.0/22\n103.85.168.0/21\n103.85.176.0/22\n103.87.132.0/22\n103.87.180.0/22\n103.88.32.0/21\n103.88.64.0/22\n103.88.96.0/22\n103.89.184.0/21\n103.89.192.0/19\n103.89.224.0/21\n103.90.56.0/23\n103.90.80.0/22\n103.90.92.0/22\n103.90.152.0/22\n103.90.176.0/22\n103.90.188.0/22\n103.91.176.0/22\n103.91.208.0/22\n103.92.88.0/22\n103.93.180.0/22\n103.93.204.0/22\n103.94.12.0/22\n103.94.200.0/22\n103.95.68.0/22\n103.95.252.0/22\n103.96.8.0/22\n103.96.148.0/22\n103.96.214.0/23\n103.96.224.0/23\n103.97.60.0/24\n103.97.62.0/23\n103.97.112.0/23\n103.97.144.0/22\n103.98.15.0/24\n103.98.28.0/23\n103.98.44.0/22\n103.98.125.0/24\n103.98.127.0/24\n103.98.220.0/22\n103.98.248.0/23\n103.98.251.0/24\n103.98.252.0/22\n103.99.178.0/24\n103.100.64.0/22\n103.101.124.0/23\n103.101.180.0/22\n103.102.196.0/22\n103.102.200.0/22\n103.102.213.0/24\n103.102.214.0/24\n103.103.12.0/24\n103.103.36.0/24\n103.104.155.0/24\n103.104.252.0/22\n103.105.0.0/22\n103.105.12.0/22\n103.105.60.0/22\n103.105.180.0/22\n103.105.184.0/22\n103.105.200.0/23\n103.105.202.0/24\n103.105.220.0/22\n103.106.36.0/22\n103.106.252.0/22\n103.107.0.0/22\n103.107.216.0/21\n103.108.244.0/24\n103.108.247.0/24\n103.109.20.0/22\n103.110.132.0/22\n103.110.136.0/22\n103.111.64.0/24\n103.111.172.0/22\n103.113.4.0/22\n103.114.100.0/22\n103.114.158.0/23\n103.114.212.0/23\n103.114.236.0/22\n103.115.92.0/22\n103.115.120.0/22\n103.115.248.0/22\n103.116.76.0/23\n103.116.78.0/24\n103.116.92.0/22\n103.116.120.0/23\n103.116.123.0/24\n103.116.138.0/23\n103.116.206.0/23\n103.117.16.0/22\n103.117.220.0/22\n103.117.248.0/22\n103.118.52.0/22\n103.118.60.0/22\n103.118.173.0/24\n103.119.104.0/22\n103.119.224.0/22\n103.120.72.0/22\n103.120.88.0/22\n103.120.224.0/22\n103.121.52.0/22\n103.121.164.0/23\n103.121.166.0/24\n103.121.250.0/24\n103.122.48.0/22\n103.123.4.0/23\n103.124.182.0/23\n103.125.236.0/22\n103.126.1.0/24\n103.126.101.0/24\n103.126.102.0/23\n103.126.124.0/22\n103.131.138.0/23\n103.131.152.0/22\n103.131.179.0/24\n103.132.22.0/23\n103.132.212.0/23\n103.133.128.0/23\n103.135.160.0/22\n103.135.164.0/23\n103.135.192.0/23\n103.135.195.0/24\n103.135.196.0/22\n103.137.60.0/24\n103.138.156.0/23\n103.139.136.0/23\n103.139.212.0/23\n103.140.14.0/23\n103.140.152.0/23\n103.141.10.0/23\n103.142.82.0/23\n103.142.96.0/23\n103.142.220.0/23\n103.142.234.0/23\n103.143.16.0/22\n103.143.92.0/23\n103.143.230.0/24\n103.144.52.0/23\n103.144.66.0/23\n103.144.70.0/24\n103.144.158.0/23\n103.145.42.0/23\n103.145.90.0/24\n103.145.92.0/24\n103.146.126.0/23\n103.147.124.0/24\n103.149.181.0/24\n103.149.242.0/24\n103.149.244.0/22\n103.150.10.0/23\n103.150.24.0/23\n103.150.37.0/24\n103.150.164.0/23\n103.150.212.0/24\n103.151.4.0/23\n103.151.148.0/23\n103.151.228.0/23\n103.152.28.0/23\n103.152.56.0/23\n103.152.76.0/23\n103.152.150.0/23\n103.152.186.0/23\n103.152.224.0/24\n103.154.30.0/23\n103.154.41.0/24\n103.154.162.0/23\n103.155.76.0/23\n103.156.68.0/23\n103.156.174.0/23\n103.156.186.0/23\n103.158.0.0/23\n103.159.124.0/23\n103.161.220.0/23\n103.161.254.0/23\n103.162.10.0/23\n103.163.46.0/23\n103.163.180.0/24\n103.164.32.0/23\n103.165.110.0/23\n103.169.50.0/23\n103.169.62.0/23\n103.170.4.0/23\n103.170.212.0/23\n103.172.52.0/24\n103.172.191.0/24\n103.174.94.0/23\n103.175.197.0/24\n103.179.78.0/23\n103.180.108.0/23\n103.181.234.0/24\n103.183.66.0/23\n103.183.122.0/23\n103.183.124.0/23\n103.183.218.0/23\n103.184.46.0/23\n103.186.4.0/23\n103.186.108.0/23\n103.189.92.0/23\n103.189.154.0/23\n103.190.118.0/23\n103.190.122.0/23\n103.191.102.0/24\n103.191.242.0/23\n103.192.0.0/22\n103.192.8.0/21\n103.192.16.0/20\n103.192.132.0/22\n103.192.188.0/22\n103.192.208.0/21\n103.192.252.0/22\n103.193.188.0/22\n103.193.192.0/22\n103.196.64.0/24\n103.196.88.0/21\n103.197.0.0/22\n103.197.228.0/22\n103.198.60.0/22\n103.198.124.0/22\n103.200.136.0/21\n103.200.144.0/21\n103.200.220.0/22\n103.200.224.0/24\n103.201.192.0/24\n103.202.0.0/19\n103.202.32.0/20\n103.202.92.0/22\n103.202.96.0/20\n103.202.112.0/22\n103.202.120.0/21\n103.202.128.0/20\n103.202.144.0/22\n103.203.56.0/22\n103.203.96.0/22\n103.203.140.0/22\n103.203.216.0/22\n103.204.72.0/22\n103.205.4.0/22\n103.205.188.0/22\n103.205.192.0/22\n103.205.252.0/22\n103.207.228.0/22\n103.208.12.0/22\n103.208.48.0/22\n103.209.112.0/22\n103.209.136.0/22\n103.210.160.0/22\n103.210.170.0/23\n103.211.44.0/22\n103.211.220.0/22\n103.212.1.0/24\n103.212.2.0/24\n103.212.4.0/22\n103.212.12.0/22\n103.212.48.0/23\n103.212.109.0/24\n103.213.49.0/24\n103.213.50.0/23\n103.213.52.0/22\n103.213.60.0/22\n103.213.64.0/19\n103.213.96.0/22\n103.213.132.0/22\n103.213.144.0/23\n103.213.148.0/22\n103.213.160.0/19\n103.214.48.0/22\n103.215.36.0/22\n103.215.44.0/24\n103.215.140.0/22\n103.216.136.0/22\n103.216.152.0/22\n103.216.252.0/24\n103.217.184.0/21\n103.217.192.0/20\n103.218.216.0/22\n103.219.28.0/22\n103.219.32.0/21\n103.219.85.0/24\n103.219.86.0/23\n103.219.92.0/24\n103.219.100.0/23\n103.219.176.0/22\n103.219.184.0/22\n103.220.52.0/22\n103.220.56.0/22\n103.220.64.0/22\n103.220.92.0/22\n103.220.124.0/22\n103.220.128.0/19\n103.220.160.0/21\n103.220.240.0/22\n103.221.140.0/22\n103.222.33.0/24\n103.222.40.0/22\n103.222.176.0/21\n103.222.184.0/22\n103.222.216.0/22\n103.223.132.0/22\n103.223.144.0/20\n103.224.232.0/22\n103.226.57.0/24\n103.227.76.0/22\n103.227.80.0/22\n103.227.120.0/22\n103.227.136.0/22\n103.228.136.0/22\n103.228.160.0/22\n103.228.204.0/23\n103.228.208.0/22\n103.228.228.0/22\n103.229.148.0/22\n103.229.172.0/22\n103.229.212.0/22\n103.229.216.0/21\n103.229.236.0/22\n103.230.110.0/23\n103.230.200.0/22\n103.230.212.0/22\n103.230.236.0/22\n103.231.16.0/24\n103.231.64.0/21\n103.232.144.0/22\n103.232.166.0/23\n103.233.4.0/22\n103.233.52.0/22\n103.233.128.0/22\n103.233.162.0/23\n103.234.20.0/22\n103.234.56.0/22\n103.234.128.0/23\n103.234.131.0/24\n103.235.102.0/23\n103.235.136.0/22\n103.235.144.0/24\n103.235.220.0/22\n103.235.224.0/20\n103.235.244.0/22\n103.235.248.0/21\n103.236.52.0/22\n103.236.56.0/21\n103.236.64.0/19\n103.236.96.0/23\n103.236.98.0/24\n103.236.120.0/22\n103.236.244.0/22\n103.236.248.0/21\n103.237.8.0/22\n103.237.28.0/23\n103.237.176.0/20\n103.237.192.0/19\n103.237.224.0/20\n103.237.240.0/21\n103.237.248.0/23\n103.238.0.0/21\n103.238.16.0/22\n103.238.48.0/24\n103.238.52.0/22\n103.238.96.0/23\n103.238.98.0/24\n103.238.132.0/22\n103.238.144.0/22\n103.238.160.0/22\n103.238.184.0/24\n103.238.186.0/23\n103.238.188.0/22\n103.238.204.0/22\n103.239.68.0/22\n103.239.152.0/22\n103.239.184.0/23\n103.239.186.0/24\n103.239.192.0/22\n103.239.204.0/22\n103.239.224.0/22\n103.239.244.0/22\n103.240.16.0/22\n103.240.36.0/22\n103.240.84.0/22\n103.240.124.0/22\n103.240.244.0/22\n103.241.95.0/24\n103.242.128.0/24\n103.242.130.0/24\n103.242.168.0/23\n103.242.172.0/22\n103.242.212.0/22\n103.243.136.0/22\n103.243.252.0/22\n103.244.59.0/24\n103.244.64.0/22\n103.244.80.0/22\n103.244.232.0/22\n103.245.23.0/24\n103.245.128.0/22\n103.246.152.0/22\n103.247.168.0/22\n103.247.176.0/22\n103.247.191.0/24\n103.248.152.0/22\n103.248.224.0/22\n103.249.52.0/22\n103.249.136.0/24\n103.249.244.0/22\n103.249.252.0/22\n103.250.32.0/22\n103.250.104.0/22\n103.250.192.0/22\n103.250.216.0/22\n103.250.248.0/21\n103.251.32.0/22\n103.251.84.0/22\n103.251.96.0/22\n103.251.124.0/22\n103.251.160.0/22\n103.251.204.0/24\n103.251.207.0/24\n103.251.240.0/22\n103.252.36.0/24\n103.252.172.0/22\n103.252.248.0/22\n103.253.60.0/22\n103.253.204.0/22\n103.254.68.0/22\n103.254.76.0/22\n103.254.112.0/22\n103.254.188.0/22\n103.254.196.0/24\n103.255.68.0/22\n103.255.92.0/22\n103.255.140.0/22\n103.255.200.0/22\n104.192.94.0/23\n104.192.108.0/23\n104.192.110.0/24\n106.0.4.0/22\n106.2.37.0/24\n106.2.40.0/23\n106.2.42.0/24\n106.2.45.0/24\n106.2.46.0/23\n106.2.48.0/23\n106.2.51.0/24\n106.2.52.0/22\n106.2.56.0/22\n106.2.62.0/23\n106.2.64.0/20\n106.2.81.0/24\n106.2.82.0/23\n106.2.89.0/24\n106.2.92.0/22\n106.2.96.0/24\n106.2.100.0/22\n106.2.104.0/21\n106.2.112.0/21\n106.2.124.0/22\n106.2.128.0/19\n106.2.224.0/24\n106.2.232.0/21\n106.3.0.0/19\n106.3.32.0/20\n106.3.80.0/22\n106.3.88.0/21\n106.3.128.0/20\n106.3.144.0/22\n106.3.148.0/23\n106.3.151.0/24\n106.3.152.0/21\n106.3.192.0/20\n106.3.208.0/21\n106.3.224.0/21\n106.4.0.0/14\n106.8.0.0/15\n106.11.0.0/16\n106.12.0.0/17\n106.12.128.0/18\n106.12.192.0/19\n106.12.224.0/20\n106.12.240.0/21\n106.12.250.0/23\n106.12.252.0/23\n106.12.254.0/24\n106.13.0.0/16\n106.14.0.0/15\n106.16.0.0/14\n106.32.0.0/12\n106.48.16.0/21\n106.52.0.0/14\n106.56.0.0/14\n106.60.0.0/15\n106.62.0.0/16\n106.63.0.0/17\n106.74.0.0/16\n106.75.0.0/17\n106.75.128.0/18\n106.75.208.0/20\n106.75.224.0/19\n106.80.0.0/13\n106.88.0.0/14\n106.92.0.0/16\n106.108.0.0/14\n106.112.0.0/12\n106.224.0.0/14\n106.228.0.0/15\n106.230.0.0/16\n107.151.212.0/24\n107.190.229.0/24\n109.244.0.0/16\n110.6.0.0/15\n110.16.0.0/14\n110.40.0.0/24\n110.40.13.0/24\n110.40.14.0/23\n110.40.16.0/24\n110.40.128.0/17\n110.41.0.0/17\n110.41.128.0/18\n110.41.192.0/20\n110.41.208.0/23\n110.41.211.0/24\n110.41.212.0/22\n110.41.216.0/21\n110.41.224.0/19\n110.42.0.0/15\n110.51.0.0/16\n110.52.0.0/15\n110.56.0.0/16\n110.64.0.0/15\n110.72.0.0/15\n110.75.0.0/16\n110.76.0.0/18\n110.76.156.0/22\n110.76.184.0/22\n110.76.192.0/18\n110.77.0.0/17\n110.79.78.0/24\n110.80.0.0/13\n110.88.0.0/14\n110.94.0.0/17\n110.96.0.0/16\n110.100.0.0/16\n110.113.0.0/16\n110.114.0.0/16\n110.116.0.0/16\n110.120.0.0/16\n110.152.0.0/14\n110.156.0.0/15\n110.166.0.0/15\n110.173.8.0/21\n110.173.16.0/20\n110.173.32.0/20\n110.173.192.0/19\n110.176.0.0/12\n110.199.0.0/16\n110.203.0.0/23\n110.211.0.0/16\n110.218.0.0/15\n110.228.0.0/14\n110.236.0.0/15\n110.240.0.0/12\n111.0.0.0/10\n111.72.0.0/13\n111.85.0.0/16\n111.112.0.0/14\n111.116.0.0/15\n111.118.200.0/21\n111.120.0.0/14\n111.124.0.0/16\n111.126.0.0/15\n111.132.0.0/16\n111.148.0.0/16\n111.149.0.0/24\n111.160.0.0/13\n111.170.0.0/16\n111.172.0.0/14\n111.176.0.0/13\n111.186.0.0/15\n111.192.0.0/12\n111.208.121.0/24\n111.208.254.0/24\n111.210.0.0/20\n111.210.16.0/24\n111.211.192.0/18\n111.212.0.0/14\n111.221.28.0/24\n111.221.128.0/17\n111.222.0.0/16\n111.223.8.0/21\n111.224.0.0/14\n111.228.0.0/18\n111.229.0.0/16\n111.230.0.0/15\n111.235.156.0/22\n111.235.160.0/22\n111.235.164.0/23\n111.235.168.0/22\n111.235.172.0/23\n111.235.174.0/24\n111.235.178.0/23\n111.235.180.0/23\n111.235.182.0/24\n112.0.0.0/10\n112.64.0.0/14\n112.74.0.0/16\n112.80.0.0/12\n112.96.0.0/13\n112.109.128.0/17\n112.111.0.0/16\n112.112.0.0/14\n112.116.0.0/15\n112.122.0.0/15\n112.124.0.0/14\n112.132.0.0/16\n112.192.0.0/14\n112.196.208.0/24\n112.224.0.0/11\n113.0.0.0/13\n113.8.0.0/15\n113.12.0.0/14\n113.16.0.0/15\n113.18.0.0/16\n113.21.232.0/21\n113.24.0.0/14\n113.31.96.0/19\n113.31.144.0/20\n113.31.160.0/19\n113.44.0.0/16\n113.45.0.0/18\n113.45.64.0/19\n113.45.96.0/22\n113.45.102.0/23\n113.45.104.0/21\n113.45.112.0/22\n113.45.120.0/22\n113.45.128.0/17\n113.46.0.0/16\n113.47.0.0/18\n113.47.64.0/19\n113.47.96.0/21\n113.47.104.0/22\n113.47.110.0/24\n113.47.112.0/20\n113.47.128.0/18\n113.47.200.0/21\n113.47.216.0/21\n113.47.232.0/21\n113.47.240.0/20\n113.48.48.0/20\n113.48.127.0/24\n113.48.224.0/20\n113.49.0.0/19\n113.50.0.0/20\n113.50.32.0/24\n113.50.48.0/20\n113.50.64.0/20\n113.54.0.0/15\n113.56.0.0/15\n113.58.0.0/16\n113.59.0.0/17\n113.59.224.0/22\n113.62.0.0/15\n113.64.0.0/10\n113.128.0.0/15\n113.130.96.0/20\n113.130.112.0/21\n113.132.0.0/14\n113.136.0.0/13\n113.164.25.0/24\n113.194.0.0/15\n113.197.101.0/24\n113.197.103.0/24\n113.197.104.0/23\n113.200.0.0/15\n113.204.0.0/14\n113.208.112.0/21\n113.209.128.0/17\n113.213.0.0/18\n113.213.64.0/19\n113.213.96.0/20\n113.214.0.0/15\n113.218.0.0/15\n113.220.0.0/14\n113.224.0.0/12\n113.240.0.0/13\n113.248.0.0/14\n114.28.68.0/22\n114.28.72.0/21\n114.28.128.0/18\n114.28.229.0/24\n114.28.248.0/21\n114.55.0.0/16\n114.60.0.0/14\n114.64.0.0/16\n114.66.0.0/18\n114.66.72.0/21\n114.66.80.0/23\n114.66.236.0/22\n114.66.240.0/20\n114.67.16.0/21\n114.67.48.0/24\n114.67.57.0/24\n114.67.58.0/24\n114.67.60.0/23\n114.67.62.0/24\n114.67.64.0/18\n114.67.131.0/24\n114.67.136.0/24\n114.67.150.0/24\n114.67.152.0/22\n114.67.156.0/24\n114.67.159.0/24\n114.67.160.0/19\n114.67.192.0/18\n114.80.0.0/12\n114.96.0.0/13\n114.104.0.0/14\n114.110.0.0/20\n114.110.96.0/22\n114.111.0.0/23\n114.111.16.0/20\n114.111.180.0/22\n114.111.184.0/22\n114.111.188.0/23\n114.111.191.0/24\n114.112.4.0/23\n114.112.24.0/21\n114.112.32.0/19\n114.112.64.0/24\n114.112.66.0/24\n114.112.70.0/24\n114.112.72.0/21\n114.112.81.0/24\n114.112.82.0/24\n114.112.85.0/24\n114.112.86.0/24\n114.112.88.0/24\n114.112.91.0/24\n114.112.94.0/23\n114.112.96.0/21\n114.112.104.0/22\n114.112.136.0/21\n114.112.144.0/21\n114.112.200.0/21\n114.112.208.0/20\n114.113.63.0/24\n114.113.64.0/20\n114.113.80.0/22\n114.113.84.0/24\n114.113.88.0/21\n114.113.96.0/19\n114.113.144.0/20\n114.113.196.0/22\n114.113.200.0/24\n114.113.203.0/24\n114.113.208.0/21\n114.113.221.0/24\n114.113.223.0/24\n114.113.224.0/20\n114.114.112.0/21\n114.115.0.0/16\n114.116.0.0/15\n114.118.0.0/18\n114.118.64.0/19\n114.118.96.0/21\n114.119.10.0/24\n114.119.32.0/24\n114.119.117.0/24\n114.119.119.0/24\n114.132.0.0/16\n114.135.0.0/16\n114.138.0.0/15\n114.141.128.0/18\n114.142.142.0/23\n114.196.0.0/15\n114.212.0.0/14\n114.216.0.0/13\n114.224.0.0/11\n115.24.0.0/14\n115.28.0.0/15\n115.31.64.0/22\n115.32.0.0/19\n115.32.32.0/20\n115.32.52.0/22\n115.32.56.0/21\n115.32.64.0/19\n115.32.104.0/21\n115.32.120.0/21\n115.32.128.0/19\n115.33.0.0/19\n115.33.128.0/20\n115.44.0.0/15\n115.46.0.0/16\n115.48.0.0/12\n115.84.0.0/18\n115.85.192.0/18\n115.102.0.0/16\n115.120.0.0/17\n115.120.128.0/20\n115.120.144.0/23\n115.120.148.0/22\n115.120.152.0/21\n115.120.176.0/20\n115.120.192.0/18\n115.124.16.0/20\n115.148.0.0/14\n115.152.0.0/13\n115.168.0.0/14\n115.172.32.0/21\n115.172.46.0/23\n115.173.0.0/19\n115.175.0.0/18\n115.175.64.0/19\n115.175.96.0/21\n115.175.104.0/22\n115.175.108.0/23\n115.175.110.0/24\n115.175.112.0/20\n115.175.128.0/17\n115.180.0.0/17\n115.182.0.0/15\n115.190.0.0/16\n115.191.0.0/18\n115.191.64.0/20\n115.192.0.0/11\n115.224.0.0/12\n116.1.0.0/16\n116.2.0.0/15\n116.4.0.0/14\n116.8.0.0/14\n116.13.0.0/16\n116.16.0.0/12\n116.52.0.0/14\n116.56.0.0/15\n116.58.208.0/24\n116.62.0.0/15\n116.66.36.0/24\n116.66.48.0/23\n116.66.53.0/24\n116.66.54.0/23\n116.66.98.0/24\n116.66.123.0/24\n116.68.136.0/21\n116.68.176.0/21\n116.70.64.0/18\n116.76.0.0/15\n116.78.0.0/16\n116.85.1.0/24\n116.85.2.0/23\n116.85.13.0/24\n116.85.14.0/24\n116.85.16.0/23\n116.85.18.0/24\n116.85.64.0/20\n116.85.240.0/20\n116.90.80.0/20\n116.90.192.0/20\n116.95.0.0/16\n116.112.0.0/14\n116.116.0.0/15\n116.128.128.0/18\n116.128.200.0/21\n116.128.208.0/20\n116.128.224.0/19\n116.129.0.0/16\n116.130.0.0/15\n116.132.0.0/15\n116.135.0.0/16\n116.136.0.0/13\n116.144.0.0/14\n116.148.0.0/15\n116.153.0.0/16\n116.154.0.0/15\n116.162.0.0/16\n116.163.0.0/18\n116.165.0.0/16\n116.167.0.0/16\n116.168.0.0/14\n116.172.64.0/18\n116.172.128.0/17\n116.174.0.0/15\n116.176.0.0/14\n116.181.0.0/16\n116.182.0.0/16\n116.192.0.0/16\n116.193.16.0/23\n116.193.18.0/24\n116.196.0.0/21\n116.196.8.0/22\n116.196.12.0/23\n116.196.64.0/18\n116.196.129.0/24\n116.196.130.0/23\n116.196.132.0/22\n116.196.136.0/21\n116.196.144.0/21\n116.196.152.0/22\n116.196.156.0/23\n116.196.176.0/21\n116.196.192.0/21\n116.196.218.0/23\n116.196.220.0/22\n116.197.160.0/21\n116.198.0.0/18\n116.198.64.0/21\n116.198.72.0/22\n116.198.96.0/19\n116.198.144.0/20\n116.198.160.0/20\n116.198.176.0/21\n116.198.192.0/18\n116.199.0.0/17\n116.199.156.0/22\n116.204.0.0/17\n116.205.0.0/16\n116.207.0.0/16\n116.208.0.0/14\n116.213.45.0/24\n116.214.32.0/19\n116.214.128.0/22\n116.214.132.0/23\n116.214.134.0/24\n116.224.0.0/12\n116.242.0.0/16\n116.246.0.0/15\n116.248.0.0/15\n116.252.0.0/15\n116.254.104.0/21\n116.255.128.0/17\n117.8.0.0/13\n117.21.0.0/16\n117.22.0.0/15\n117.24.0.0/13\n117.32.0.0/13\n117.40.0.0/14\n117.44.0.0/15\n117.48.112.0/20\n117.48.128.0/19\n117.48.160.0/20\n117.48.192.0/24\n117.48.195.0/24\n117.48.196.0/22\n117.48.200.0/21\n117.48.216.0/23\n117.48.218.0/24\n117.48.220.0/22\n117.48.224.0/21\n117.48.232.0/23\n117.48.234.0/24\n117.48.236.0/22\n117.50.0.0/16\n117.51.0.0/17\n117.51.128.0/19\n117.51.160.0/23\n117.51.168.0/21\n117.57.0.0/16\n117.59.0.0/16\n117.60.0.0/14\n117.64.0.0/13\n117.72.0.0/23\n117.72.8.0/21\n117.72.16.0/23\n117.72.24.0/21\n117.72.32.0/19\n117.72.64.0/18\n117.72.144.0/20\n117.72.160.0/19\n117.72.192.0/19\n117.72.240.0/21\n117.72.255.0/24\n117.73.0.0/20\n117.73.16.0/21\n117.73.252.0/22\n117.74.64.0/20\n117.74.128.0/21\n117.74.136.0/22\n117.78.0.0/18\n117.79.80.0/20\n117.79.128.0/21\n117.79.144.0/20\n117.79.224.0/20\n117.79.241.0/24\n117.79.242.0/24\n117.80.0.0/12\n117.106.0.0/15\n117.112.0.0/13\n117.121.132.0/22\n117.122.192.0/18\n117.124.98.0/24\n117.124.231.0/24\n117.124.232.0/22\n117.124.236.0/23\n117.124.240.0/22\n117.124.244.0/24\n117.124.246.0/24\n117.126.0.0/16\n117.128.0.0/10\n118.24.0.0/15\n118.26.32.0/22\n118.26.48.0/22\n118.26.64.0/23\n118.26.68.0/23\n118.26.72.0/22\n118.26.96.0/21\n118.26.116.0/22\n118.26.120.0/24\n118.26.126.0/23\n118.26.128.0/22\n118.26.136.0/22\n118.26.160.0/20\n118.26.192.0/24\n118.26.194.0/23\n118.26.208.0/20\n118.26.240.0/20\n118.31.0.0/16\n118.64.0.0/21\n118.64.248.0/21\n118.65.0.0/21\n118.66.112.0/23\n118.66.184.0/24\n118.66.224.0/20\n118.66.248.0/21\n118.72.0.0/13\n118.80.0.0/15\n118.84.0.0/15\n118.88.32.0/19\n118.88.64.0/18\n118.88.128.0/17\n118.89.0.0/16\n118.102.16.0/20\n118.103.164.0/22\n118.112.0.0/13\n118.120.0.0/14\n118.124.0.0/15\n118.126.32.0/19\n118.126.64.0/18\n118.126.140.0/23\n118.126.142.0/24\n118.132.0.0/14\n118.144.0.0/16\n118.145.0.0/19\n118.145.32.0/20\n118.145.64.0/19\n118.145.96.0/20\n118.145.112.0/21\n118.145.128.0/19\n118.145.160.0/21\n118.145.176.0/20\n118.145.192.0/18\n118.178.0.0/16\n118.180.0.0/14\n118.184.128.0/17\n118.186.0.0/19\n118.186.32.0/24\n118.186.34.0/23\n118.186.36.0/22\n118.186.56.0/21\n118.186.64.0/21\n118.186.80.0/20\n118.186.96.0/20\n118.186.112.0/21\n118.186.160.0/19\n118.186.208.0/21\n118.186.240.0/21\n118.187.0.0/18\n118.187.64.0/19\n118.188.18.0/23\n118.188.20.0/22\n118.188.24.0/23\n118.190.0.0/16\n118.191.0.0/21\n118.191.8.0/22\n118.191.12.0/24\n118.191.128.0/22\n118.191.152.0/24\n118.191.192.0/23\n118.191.208.0/24\n118.191.216.0/24\n118.191.223.0/24\n118.191.224.0/24\n118.191.240.0/23\n118.192.20.0/24\n118.192.64.0/23\n118.192.67.0/24\n118.192.68.0/23\n118.192.70.0/24\n118.193.96.0/19\n118.194.32.0/19\n118.194.134.0/23\n118.194.240.0/21\n118.195.128.0/17\n118.196.0.0/16\n118.197.0.0/18\n118.197.64.0/19\n118.202.0.0/15\n118.204.0.0/17\n118.212.0.0/15\n118.215.192.0/19\n118.228.0.0/15\n118.230.0.0/16\n118.239.0.0/16\n118.242.0.0/22\n118.242.16.0/22\n118.242.24.0/22\n118.242.32.0/22\n118.242.40.0/24\n118.244.0.0/21\n118.244.128.0/17\n118.247.0.0/16\n118.248.0.0/13\n119.0.0.0/15\n119.2.128.0/17\n119.3.0.0/16\n119.4.0.0/14\n119.15.136.0/23\n119.15.140.0/23\n119.18.208.0/21\n119.18.224.0/24\n119.18.226.0/24\n119.18.234.0/24\n119.18.237.0/24\n119.23.0.0/16\n119.27.160.0/19\n119.28.28.0/24\n119.29.0.0/16\n119.31.192.0/19\n119.32.0.0/15\n119.34.0.0/16\n119.36.0.0/16\n119.37.0.0/23\n119.37.2.0/24\n119.37.12.0/24\n119.37.192.0/21\n119.38.0.0/21\n119.38.192.0/19\n119.39.0.0/16\n119.40.41.0/24\n119.40.64.0/20\n119.40.128.0/17\n119.41.0.0/16\n119.42.0.0/19\n119.42.136.0/21\n119.42.224.0/19\n119.44.0.0/22\n119.44.4.0/23\n119.44.7.0/24\n119.44.8.0/22\n119.44.12.0/24\n119.44.16.0/22\n119.44.20.0/23\n119.44.23.0/24\n119.44.24.0/22\n119.44.28.0/23\n119.44.45.0/24\n119.44.46.0/24\n119.44.50.0/23\n119.44.52.0/24\n119.44.56.0/21\n119.44.192.0/24\n119.44.200.0/24\n119.44.205.0/24\n119.44.208.0/22\n119.44.212.0/23\n119.44.214.0/24\n119.44.217.0/24\n119.44.218.0/23\n119.44.220.0/22\n119.44.224.0/20\n119.44.253.0/24\n119.44.254.0/23\n119.45.0.0/16\n119.48.0.0/13\n119.57.0.0/21\n119.57.8.0/23\n119.57.12.0/24\n119.57.16.0/21\n119.57.25.0/24\n119.57.28.0/22\n119.57.32.0/21\n119.57.44.0/22\n119.57.51.0/24\n119.57.52.0/22\n119.57.56.0/21\n119.57.64.0/19\n119.57.96.0/22\n119.57.100.0/23\n119.57.102.0/24\n119.57.112.0/20\n119.57.132.0/22\n119.57.136.0/21\n119.57.160.0/20\n119.57.190.0/23\n119.57.246.0/23\n119.57.248.0/21\n119.60.0.0/15\n119.62.0.0/16\n119.75.208.0/20\n119.78.0.0/15\n119.80.0.0/21\n119.80.8.0/22\n119.80.160.0/23\n119.80.162.0/24\n119.80.192.0/21\n119.80.200.0/22\n119.80.240.0/22\n119.80.248.0/21\n119.84.0.0/14\n119.88.128.0/17\n119.90.32.0/19\n119.91.0.0/16\n119.96.0.0/13\n119.108.0.0/15\n119.112.0.0/12\n119.128.0.0/12\n119.144.0.0/14\n119.148.160.0/20\n119.161.120.0/22\n119.161.124.0/24\n119.161.136.0/23\n119.161.138.0/24\n119.161.140.0/22\n119.161.154.0/23\n119.161.156.0/22\n119.162.0.0/15\n119.164.0.0/14\n119.176.0.0/12\n119.233.128.0/17\n119.235.128.0/24\n119.235.130.0/24\n119.235.136.0/24\n119.235.138.0/24\n119.235.143.0/24\n119.235.144.0/23\n119.235.151.0/24\n119.235.160.0/23\n119.235.167.0/24\n119.235.185.0/24\n119.248.0.0/14\n119.253.0.0/20\n119.253.32.0/19\n119.253.64.0/19\n119.254.0.0/16\n119.255.128.0/17\n120.0.0.0/12\n120.24.0.0/14\n120.31.66.0/23\n120.31.68.0/22\n120.31.128.0/20\n120.32.0.0/12\n120.48.0.0/16\n120.49.0.0/17\n120.49.192.0/18\n120.52.0.0/15\n120.55.0.0/16\n120.65.0.0/16\n120.68.0.0/14\n120.72.32.0/19\n120.72.160.0/24\n120.72.162.0/23\n120.72.164.0/22\n120.72.168.0/24\n120.72.170.0/23\n120.72.172.0/23\n120.72.174.0/24\n120.72.177.0/24\n120.72.178.0/24\n120.72.180.0/24\n120.72.182.0/23\n120.72.184.0/22\n120.72.188.0/23\n120.72.190.0/24\n120.76.0.0/14\n120.80.0.0/13\n120.92.0.0/17\n120.92.128.0/18\n120.92.192.0/19\n120.92.224.0/20\n120.94.0.0/15\n120.131.0.0/19\n120.131.88.0/21\n120.131.124.0/22\n120.132.0.0/18\n120.132.64.0/19\n120.132.96.0/20\n120.132.112.0/24\n120.132.117.0/24\n120.132.118.0/23\n120.132.120.0/21\n120.132.128.0/17\n120.133.0.0/16\n120.134.0.0/15\n120.136.16.0/21\n120.136.128.0/21\n120.136.140.0/22\n120.136.144.0/20\n120.136.160.0/20\n120.136.176.0/21\n120.136.184.0/22\n120.136.188.0/23\n120.136.190.0/24\n120.192.0.0/10\n121.0.16.0/20\n121.4.0.0/15\n121.8.0.0/13\n121.16.0.0/12\n121.32.0.0/14\n121.36.0.0/15\n121.39.255.0/24\n121.40.0.0/14\n121.46.0.0/20\n121.46.20.0/22\n121.46.128.0/21\n121.46.141.0/24\n121.46.192.0/21\n121.46.200.0/22\n121.46.224.0/20\n121.46.244.0/22\n121.46.248.0/22\n121.46.252.0/23\n121.46.254.0/24\n121.48.0.0/15\n121.51.0.0/16\n121.52.160.0/19\n121.52.208.0/20\n121.52.224.0/19\n121.55.0.0/18\n121.56.0.0/15\n121.58.0.0/17\n121.58.156.0/22\n121.59.4.0/22\n121.59.8.0/21\n121.60.0.0/14\n121.69.0.0/16\n121.70.0.0/17\n121.76.0.0/15\n121.79.128.0/20\n121.79.144.0/22\n121.79.148.0/24\n121.89.0.0/16\n121.91.104.0/21\n121.192.0.0/13\n121.201.0.0/17\n121.204.0.0/14\n121.224.0.0/12\n121.248.0.0/14\n121.255.0.0/16\n122.0.64.0/18\n122.4.0.0/14\n122.9.0.0/16\n122.10.133.0/24\n122.10.136.0/23\n122.10.160.0/24\n122.11.32.0/19\n122.13.0.0/16\n122.14.44.0/22\n122.14.62.0/24\n122.14.192.0/18\n122.48.0.0/16\n122.49.8.0/21\n122.49.16.0/20\n122.49.32.0/20\n122.51.0.0/16\n122.70.0.0/15\n122.72.16.0/24\n122.72.38.0/24\n122.84.0.0/16\n122.90.0.0/16\n122.91.0.0/17\n122.94.0.0/16\n122.96.0.0/15\n122.102.64.0/20\n122.112.0.0/22\n122.112.32.0/19\n122.112.132.0/22\n122.112.136.0/21\n122.112.144.0/20\n122.112.160.0/19\n122.112.192.0/18\n122.114.0.0/16\n122.115.0.0/20\n122.115.32.0/19\n122.115.224.0/20\n122.119.4.0/23\n122.119.12.0/22\n122.119.20.0/22\n122.119.24.0/23\n122.119.26.0/24\n122.119.32.0/24\n122.119.50.0/24\n122.119.73.0/24\n122.119.96.0/23\n122.119.110.0/23\n122.119.112.0/23\n122.119.114.0/24\n122.119.120.0/24\n122.119.122.0/24\n122.119.124.0/23\n122.119.129.0/24\n122.119.147.0/24\n122.119.160.0/23\n122.119.172.0/24\n122.119.180.0/22\n122.119.190.0/24\n122.119.224.0/22\n122.119.232.0/23\n122.119.236.0/24\n122.119.253.0/24\n122.136.0.0/13\n122.144.128.0/20\n122.144.144.0/23\n122.144.147.0/24\n122.144.152.0/23\n122.144.156.0/23\n122.144.161.0/24\n122.144.164.0/22\n122.144.168.0/22\n122.144.172.0/23\n122.144.178.0/23\n122.144.180.0/22\n122.144.192.0/21\n122.144.200.0/22\n122.144.206.0/23\n122.144.208.0/23\n122.144.211.0/24\n122.144.212.0/22\n122.144.216.0/21\n122.144.232.0/22\n122.144.236.0/23\n122.144.240.0/24\n122.144.248.0/23\n122.152.192.0/18\n122.156.0.0/14\n122.188.0.0/14\n122.192.0.0/14\n122.200.40.0/21\n122.200.68.0/23\n122.200.78.0/24\n122.200.82.0/24\n122.200.84.0/23\n122.200.86.0/24\n122.200.92.0/23\n122.200.104.0/22\n122.200.120.0/22\n122.200.124.0/24\n122.204.0.0/14\n122.224.0.0/12\n122.240.0.0/13\n122.248.48.0/21\n122.248.56.0/22\n123.4.0.0/14\n123.8.0.0/13\n123.49.192.0/23\n123.49.194.0/24\n123.49.231.0/24\n123.49.240.0/24\n123.49.242.0/23\n123.52.0.0/14\n123.56.0.0/15\n123.58.0.0/19\n123.58.32.0/23\n123.58.34.0/24\n123.58.36.0/24\n123.58.38.0/23\n123.58.40.0/21\n123.58.48.0/24\n123.58.50.0/24\n123.58.53.0/24\n123.58.54.0/23\n123.58.56.0/23\n123.58.59.0/24\n123.58.60.0/22\n123.58.64.0/24\n123.58.96.0/19\n123.58.160.0/20\n123.58.180.0/24\n123.58.182.0/23\n123.58.184.0/24\n123.58.186.0/23\n123.58.188.0/22\n123.58.224.0/19\n123.59.0.0/16\n123.60.0.0/16\n123.64.0.0/15\n123.66.0.0/16\n123.77.0.0/16\n123.88.0.0/15\n123.90.0.0/16\n123.96.0.0/15\n123.99.192.0/18\n123.101.0.0/16\n123.103.0.0/20\n123.103.16.0/21\n123.103.24.0/22\n123.103.28.0/23\n123.103.30.0/24\n123.103.40.0/21\n123.103.48.0/20\n123.103.64.0/18\n123.108.88.0/24\n123.108.208.0/22\n123.108.212.0/23\n123.108.220.0/22\n123.112.0.0/12\n123.128.0.0/13\n123.138.0.0/15\n123.144.0.0/12\n123.160.0.0/12\n123.177.0.0/16\n123.178.0.0/15\n123.180.0.0/14\n123.184.0.0/13\n123.196.112.0/20\n123.206.0.0/15\n123.232.0.0/14\n123.242.192.0/21\n123.244.0.0/14\n123.249.0.0/17\n123.253.226.0/24\n123.254.96.0/21\n124.14.1.0/24\n124.14.2.0/23\n124.14.5.0/24\n124.14.7.0/24\n124.14.8.0/21\n124.14.16.0/21\n124.14.64.0/18\n124.14.224.0/19\n124.16.0.0/15\n124.22.0.0/15\n124.28.192.0/18\n124.29.0.0/17\n124.31.0.0/16\n124.40.128.0/18\n124.42.0.0/17\n124.47.0.0/18\n124.64.0.0/15\n124.66.0.0/17\n124.67.0.0/16\n124.70.0.0/16\n124.71.0.0/17\n124.71.128.0/18\n124.71.192.0/19\n124.71.224.0/20\n124.71.250.0/24\n124.72.0.0/13\n124.88.0.0/13\n124.112.0.0/13\n124.126.0.0/15\n124.128.0.0/13\n124.151.0.0/16\n124.152.0.0/16\n124.160.0.0/13\n124.172.0.0/15\n124.174.0.0/16\n124.192.0.0/15\n124.196.12.0/23\n124.196.25.0/24\n124.196.26.0/23\n124.196.28.0/24\n124.196.30.0/23\n124.196.32.0/23\n124.196.40.0/22\n124.196.48.0/22\n124.196.52.0/23\n124.196.55.0/24\n124.196.56.0/23\n124.196.58.0/24\n124.196.66.0/24\n124.196.72.0/24\n124.196.77.0/24\n124.196.80.0/22\n124.196.84.0/23\n124.200.0.0/16\n124.201.0.0/17\n124.202.0.0/16\n124.203.176.0/20\n124.204.0.0/14\n124.220.0.0/14\n124.224.0.0/12\n124.240.0.0/17\n124.240.128.0/18\n124.243.192.0/18\n124.248.64.0/18\n124.250.0.0/15\n124.254.0.0/18\n125.32.0.0/12\n125.58.128.0/17\n125.62.0.0/18\n125.64.0.0/11\n125.98.122.0/23\n125.98.128.0/17\n125.104.0.0/13\n125.112.0.0/12\n125.171.0.0/16\n125.208.0.0/19\n125.208.32.0/20\n125.208.49.0/24\n125.210.0.0/15\n125.213.32.0/20\n125.214.96.0/19\n125.215.36.0/23\n125.215.40.0/24\n125.215.44.0/23\n125.215.48.0/24\n125.215.52.0/23\n125.215.54.0/24\n125.216.0.0/13\n125.254.128.0/19\n125.254.168.0/21\n125.254.176.0/21\n128.107.24.0/23\n128.108.0.0/16\n128.254.240.0/23\n128.254.243.0/24\n129.28.0.0/16\n129.204.0.0/16\n129.211.0.0/16\n129.227.29.0/24\n129.227.30.0/24\n129.227.146.0/23\n129.227.157.0/24\n129.227.158.0/23\n129.227.168.0/21\n129.227.192.0/23\n129.227.195.0/24\n130.36.146.0/23\n131.143.63.0/24\n131.228.96.0/23\n132.232.0.0/16\n132.237.134.0/24\n133.226.32.0/20\n134.175.0.0/16\n138.252.72.0/23\n138.252.97.0/24\n139.5.60.0/22\n139.9.0.0/18\n139.9.64.0/19\n139.9.96.0/23\n139.9.98.0/24\n139.9.100.0/22\n139.9.104.0/21\n139.9.112.0/20\n139.9.128.0/18\n139.9.192.0/19\n139.9.224.0/20\n139.9.240.0/21\n139.9.248.0/22\n139.129.0.0/16\n139.148.0.0/16\n139.155.0.0/16\n139.159.0.0/19\n139.159.32.0/22\n139.159.96.0/20\n139.159.112.0/22\n139.159.132.0/22\n139.159.136.0/21\n139.159.144.0/20\n139.159.160.0/19\n139.159.192.0/18\n139.170.0.0/16\n139.186.0.0/16\n139.189.0.0/16\n139.196.0.0/16\n139.198.0.0/15\n139.200.0.0/13\n139.208.0.0/13\n139.217.0.0/16\n139.219.0.0/16\n139.220.192.0/22\n139.220.240.0/22\n139.224.0.0/16\n139.226.0.0/15\n140.75.0.0/16\n140.143.0.0/16\n140.179.0.0/16\n140.205.0.0/16\n140.206.0.0/15\n140.210.0.0/24\n140.210.4.0/22\n140.210.8.0/21\n140.210.16.0/20\n140.210.32.0/22\n140.210.65.0/24\n140.210.67.0/24\n140.210.69.0/24\n140.210.70.0/24\n140.210.72.0/23\n140.210.75.0/24\n140.210.77.0/24\n140.210.78.0/23\n140.210.80.0/24\n140.210.83.0/24\n140.210.84.0/24\n140.210.87.0/24\n140.210.88.0/22\n140.210.92.0/24\n140.210.94.0/24\n140.210.96.0/19\n140.210.128.0/19\n140.210.192.0/19\n140.210.224.0/20\n140.224.0.0/16\n140.237.0.0/16\n140.240.0.0/16\n140.243.0.0/16\n140.246.0.0/16\n140.249.0.0/16\n140.250.0.0/16\n140.255.0.0/16\n143.20.246.0/24\n143.64.0.0/16\n144.0.0.0/16\n144.7.0.0/17\n144.12.0.0/16\n144.36.146.0/23\n144.48.64.0/22\n144.48.212.0/22\n144.48.252.0/22\n144.52.0.0/16\n144.79.10.0/23\n144.79.54.0/23\n144.79.70.0/23\n144.123.0.0/16\n144.225.186.0/24\n144.255.0.0/16\n145.14.71.0/24\n145.14.72.0/22\n145.14.81.0/24\n145.14.82.0/24\n145.14.84.0/24\n145.14.86.0/24\n145.14.88.0/24\n145.14.90.0/24\n146.56.192.0/18\n146.196.56.0/22\n146.196.68.0/22\n146.196.112.0/21\n146.222.79.0/24\n146.222.81.0/24\n146.222.94.0/24\n147.78.132.0/22\n148.70.0.0/16\n150.107.61.0/24\n150.129.136.0/22\n150.129.192.0/22\n150.129.252.0/22\n150.138.0.0/15\n150.158.0.0/16\n150.223.0.0/16\n150.242.56.0/22\n150.242.76.0/22\n150.242.80.0/22\n150.242.96.0/22\n150.242.156.0/22\n150.242.168.0/22\n150.242.184.0/22\n150.242.232.0/22\n150.242.238.0/23\n150.242.244.0/22\n150.242.248.0/22\n150.255.0.0/16\n151.247.148.0/23\n152.104.128.0/17\n152.136.0.0/16\n153.0.0.0/16\n153.3.0.0/16\n153.34.0.0/15\n153.36.0.0/15\n153.99.0.0/16\n153.101.0.0/16\n153.118.0.0/15\n154.8.48.0/20\n154.8.128.0/17\n154.19.43.0/24\n154.72.42.0/24\n154.72.44.0/24\n154.72.47.0/24\n154.89.32.0/20\n154.91.158.0/23\n154.197.128.0/17\n155.117.188.0/24\n155.126.176.0/23\n156.59.202.0/23\n156.59.204.0/23\n156.59.206.0/24\n156.59.216.0/24\n156.107.160.0/23\n156.107.170.0/24\n156.107.179.0/24\n156.107.181.0/24\n156.224.128.0/17\n156.227.239.0/24\n156.230.11.0/24\n156.232.9.0/24\n156.232.10.0/23\n156.237.104.0/23\n156.242.5.0/24\n157.0.0.0/16\n157.10.34.0/23\n157.10.105.0/24\n157.10.112.0/23\n157.15.94.0/23\n157.15.104.0/23\n157.18.0.0/16\n157.20.246.0/23\n157.61.0.0/16\n157.66.164.0/23\n157.119.28.0/22\n157.119.172.0/22\n157.119.252.0/22\n157.122.0.0/16\n157.148.0.0/16\n157.156.0.0/16\n157.255.0.0/16\n158.26.192.0/24\n158.26.194.0/24\n158.140.252.0/22\n159.27.0.0/16\n159.75.0.0/16\n159.226.0.0/16\n160.19.76.0/23\n160.19.208.0/23\n160.19.210.0/24\n160.20.18.0/23\n160.22.188.0/24\n160.25.194.0/23\n160.30.150.0/23\n160.30.230.0/23\n160.83.110.0/24\n160.187.128.0/23\n160.191.0.0/24\n160.191.195.0/24\n160.202.152.0/22\n160.202.212.0/22\n160.202.224.0/19\n160.250.14.0/23\n160.250.24.0/23\n160.250.84.0/23\n160.250.102.0/23\n161.163.0.0/21\n161.163.28.0/23\n161.189.0.0/16\n161.207.0.0/16\n162.14.0.0/16\n162.105.0.0/16\n163.0.0.0/16\n163.47.4.0/22\n163.53.44.0/22\n163.53.60.0/22\n163.53.88.0/21\n163.53.128.0/22\n163.53.168.0/22\n163.61.178.0/23\n163.61.202.0/23\n163.61.214.0/23\n163.125.0.0/16\n163.142.0.0/16\n163.177.0.0/16\n163.179.0.0/16\n163.204.0.0/16\n163.223.173.0/24\n163.223.178.0/23\n163.227.40.0/23\n163.228.0.0/16\n163.244.246.0/24\n165.101.70.0/23\n165.101.122.0/23\n165.101.208.0/23\n166.111.0.0/16\n167.139.0.0/16\n167.220.244.0/22\n168.160.0.0/17\n168.160.152.0/24\n168.160.158.0/23\n168.160.160.0/21\n168.160.168.0/24\n168.160.224.0/19\n171.8.0.0/13\n171.34.0.0/15\n171.36.0.0/14\n171.40.0.0/14\n171.44.0.0/16\n171.80.0.0/12\n171.104.0.0/13\n171.112.0.0/12\n171.208.0.0/12\n172.81.192.0/18\n173.39.200.0/23\n174.136.239.0/24\n175.0.0.0/12\n175.16.0.0/13\n175.24.0.0/15\n175.27.0.0/16\n175.30.0.0/15\n175.42.0.0/15\n175.44.0.0/16\n175.46.0.0/15\n175.102.0.0/19\n175.102.128.0/21\n175.102.178.0/23\n175.102.180.0/22\n175.102.184.0/24\n175.102.196.0/24\n175.146.0.0/15\n175.148.0.0/14\n175.152.0.0/14\n175.158.112.0/20\n175.160.0.0/12\n175.178.0.0/16\n175.184.128.0/18\n175.185.0.0/16\n175.186.0.0/15\n175.188.188.0/22\n175.190.24.0/21\n175.190.126.0/23\n180.76.16.0/20\n180.76.32.0/19\n180.76.64.0/18\n180.76.128.0/17\n180.77.0.0/16\n180.78.0.0/15\n180.84.0.0/15\n180.88.96.0/19\n180.88.128.0/18\n180.89.56.0/22\n180.89.60.0/23\n180.89.64.0/19\n180.91.192.0/20\n180.92.176.0/24\n180.95.128.0/17\n180.96.0.0/11\n180.129.128.0/17\n180.130.0.0/16\n180.136.0.0/13\n180.149.128.0/19\n180.150.176.0/20\n180.152.0.0/13\n180.160.0.0/12\n180.178.208.0/20\n180.178.224.0/21\n180.178.232.0/22\n180.178.248.0/21\n180.184.0.0/21\n180.184.8.0/23\n180.184.14.0/24\n180.184.16.0/24\n180.184.24.0/21\n180.184.32.0/19\n180.184.64.0/18\n180.184.128.0/20\n180.184.144.0/21\n180.184.152.0/22\n180.184.160.0/20\n180.184.176.0/21\n180.184.184.0/22\n180.184.190.0/23\n180.184.192.0/18\n180.186.38.0/23\n180.186.40.0/22\n180.186.44.0/24\n180.188.16.0/20\n180.188.32.0/20\n180.200.252.0/22\n180.201.0.0/16\n180.203.0.0/23\n180.203.3.0/24\n180.203.4.0/24\n180.208.0.0/15\n180.210.212.0/22\n180.212.0.0/15\n180.233.0.0/18\n180.235.64.0/21\n180.235.72.0/23\n182.18.5.0/24\n182.18.32.0/19\n182.18.72.0/21\n182.18.80.0/20\n182.18.96.0/19\n182.32.0.0/12\n182.48.96.0/20\n182.48.112.0/21\n182.50.8.0/21\n182.50.112.0/20\n182.51.114.0/23\n182.51.116.0/23\n182.51.118.0/24\n182.51.122.0/23\n182.51.124.0/24\n182.54.0.0/17\n182.61.0.0/18\n182.61.128.0/19\n182.61.192.0/22\n182.61.200.0/21\n182.61.208.0/20\n182.61.224.0/19\n182.80.0.0/13\n182.88.0.0/14\n182.92.0.0/16\n182.96.0.0/11\n182.128.0.0/12\n182.144.0.0/13\n182.157.0.0/16\n182.174.0.0/15\n182.200.0.0/13\n182.240.0.0/13\n182.254.0.0/16\n183.0.0.0/10\n183.64.0.0/13\n183.78.180.0/22\n183.81.180.0/22\n183.84.0.0/15\n183.91.39.0/24\n183.91.40.0/21\n183.91.48.0/21\n183.91.56.0/24\n183.91.61.0/24\n183.91.63.0/24\n183.91.144.0/20\n183.92.0.0/14\n183.128.0.0/11\n183.160.0.0/13\n183.168.0.0/15\n183.170.0.0/16\n183.172.0.0/14\n183.184.0.0/13\n183.192.0.0/10\n185.75.173.0/24\n185.75.174.0/24\n185.80.200.0/22\n185.183.84.0/24\n185.194.148.0/24\n185.201.226.0/23\n185.234.212.0/24\n188.131.128.0/17\n192.140.160.0/19\n192.140.208.0/21\n192.144.128.0/17\n192.163.11.0/24\n192.193.73.0/24\n192.208.13.0/24\n192.232.97.0/24\n193.9.44.0/24\n193.9.46.0/24\n193.112.0.0/16\n193.119.0.0/24\n193.119.4.0/24\n193.119.6.0/24\n193.119.8.0/24\n193.119.10.0/23\n193.119.12.0/23\n193.119.15.0/24\n193.119.17.0/24\n193.119.19.0/24\n193.119.20.0/23\n193.119.22.0/24\n193.119.25.0/24\n193.119.28.0/24\n193.119.30.0/24\n193.233.49.0/24\n194.15.39.0/24\n194.127.229.0/24\n194.138.202.0/23\n194.138.245.0/24\n194.231.140.0/24\n198.208.17.0/24\n198.208.19.0/24\n198.208.30.0/24\n198.208.61.0/24\n198.208.63.0/24\n198.208.67.0/24\n198.208.112.0/23\n199.182.239.0/24\n199.244.144.0/24\n202.1.86.0/23\n202.1.90.0/23\n202.1.110.0/23\n202.1.112.0/23\n202.4.128.0/19\n202.4.252.0/22\n202.6.202.0/23\n202.14.235.0/24\n202.14.236.0/23\n202.14.238.0/24\n202.30.124.0/24\n202.38.8.0/21\n202.38.64.0/18\n202.38.128.0/23\n202.38.132.0/23\n202.38.134.0/24\n202.38.140.0/23\n202.38.152.0/23\n202.38.164.0/22\n202.38.184.0/21\n202.38.192.0/18\n202.41.152.0/21\n202.41.241.0/24\n202.41.242.0/23\n202.41.244.0/22\n202.41.248.0/21\n202.46.39.0/24\n202.46.224.0/22\n202.46.228.0/23\n202.46.232.0/23\n202.47.104.0/21\n202.51.32.0/20\n202.55.0.0/19\n202.57.192.0/24\n202.57.196.0/22\n202.57.200.0/23\n202.57.204.0/23\n202.59.213.0/24\n202.59.214.0/23\n202.60.112.0/20\n202.60.132.0/22\n202.61.88.0/22\n202.62.112.0/22\n202.63.160.0/20\n202.65.96.0/24\n202.67.3.0/24\n202.69.4.0/23\n202.69.16.0/20\n202.72.112.0/20\n202.73.128.0/22\n202.73.208.0/20\n202.73.240.0/20\n202.75.208.0/20\n202.75.248.0/22\n202.80.192.0/22\n202.81.176.0/20\n202.84.17.0/24\n202.85.208.0/20\n202.89.96.0/24\n202.89.232.0/21\n202.90.20.0/22\n202.90.96.0/20\n202.91.176.0/21\n202.91.184.0/23\n202.91.186.0/24\n202.91.190.0/23\n202.91.224.0/20\n202.91.240.0/21\n202.91.248.0/22\n202.93.252.0/22\n202.95.0.0/19\n202.96.0.0/13\n202.104.0.0/14\n202.108.0.0/15\n202.110.0.0/16\n202.111.0.0/17\n202.111.128.0/18\n202.111.192.0/19\n202.111.230.0/24\n202.111.240.0/23\n202.111.242.0/24\n202.111.244.0/22\n202.111.248.0/24\n202.112.0.0/13\n202.120.0.0/15\n202.122.32.0/21\n202.122.112.0/21\n202.123.96.0/24\n202.123.98.0/24\n202.123.106.0/23\n202.123.108.0/24\n202.123.110.0/23\n202.125.176.0/20\n202.127.0.0/21\n202.127.12.0/22\n202.127.16.0/20\n202.127.40.0/21\n202.127.48.0/23\n202.127.144.0/20\n202.127.200.0/21\n202.127.216.0/21\n202.127.224.0/19\n202.130.0.0/19\n202.130.224.0/20\n202.130.240.0/21\n202.136.72.0/23\n202.136.208.0/21\n202.136.216.0/23\n202.136.218.0/24\n202.136.220.0/24\n202.136.222.0/23\n202.136.255.0/24\n202.140.140.0/22\n202.141.160.0/19\n202.142.16.0/20\n202.143.16.0/23\n202.143.100.0/22\n202.144.198.0/23\n202.148.96.0/19\n202.149.224.0/20\n202.150.16.0/20\n202.153.48.0/20\n202.158.160.0/19\n202.160.140.0/22\n202.164.0.0/20\n202.165.208.0/20\n202.168.160.0/19\n202.170.128.0/19\n202.170.216.0/21\n202.173.8.0/22\n202.173.14.0/23\n202.173.224.0/19\n202.179.240.0/20\n202.181.28.0/24\n202.181.120.0/21\n202.189.3.0/24\n202.189.4.0/22\n202.189.8.0/21\n202.189.16.0/21\n202.192.0.0/12\n203.0.104.0/21\n203.2.64.0/21\n203.2.112.0/21\n203.2.160.0/21\n203.3.80.0/21\n203.3.112.0/21\n203.6.224.0/20\n203.8.25.0/24\n203.8.30.0/24\n203.12.91.0/24\n203.12.93.0/24\n203.13.81.0/24\n203.15.0.0/20\n203.25.52.0/24\n203.25.208.0/20\n203.32.48.0/23\n203.32.68.0/23\n203.32.84.0/23\n203.32.203.0/24\n203.32.204.0/23\n203.32.212.0/24\n203.33.4.0/24\n203.33.7.0/24\n203.33.21.0/24\n203.33.26.0/24\n203.33.32.0/24\n203.33.63.0/24\n203.33.64.0/24\n203.33.67.0/24\n203.33.145.0/24\n203.33.156.0/24\n203.33.158.0/23\n203.33.174.0/24\n203.33.202.0/23\n203.33.206.0/23\n203.33.214.0/23\n203.33.224.0/23\n203.34.21.0/24\n203.34.27.0/24\n203.34.39.0/24\n203.34.48.0/23\n203.34.54.0/24\n203.34.56.0/23\n203.34.67.0/24\n203.34.69.0/24\n203.34.76.0/24\n203.34.92.0/24\n203.34.106.0/24\n203.34.113.0/24\n203.34.147.0/24\n203.34.150.0/24\n203.34.152.0/23\n203.34.161.0/24\n203.34.162.0/24\n203.34.232.0/24\n203.34.240.0/24\n203.34.242.0/24\n203.34.245.0/24\n203.34.251.0/24\n203.55.2.0/23\n203.55.4.0/24\n203.55.10.0/24\n203.55.13.0/24\n203.55.22.0/24\n203.55.30.0/24\n203.55.93.0/24\n203.55.101.0/24\n203.55.109.0/24\n203.55.110.0/24\n203.55.116.0/23\n203.55.119.0/24\n203.55.128.0/23\n203.55.146.0/23\n203.55.192.0/24\n203.55.196.0/24\n203.55.218.0/23\n203.55.221.0/24\n203.55.224.0/24\n203.56.1.0/24\n203.56.4.0/24\n203.56.12.0/24\n203.56.24.0/24\n203.56.38.0/24\n203.56.40.0/24\n203.56.46.0/24\n203.56.68.0/23\n203.56.82.0/23\n203.56.84.0/23\n203.56.95.0/24\n203.56.110.0/24\n203.56.121.0/24\n203.56.161.0/24\n203.56.169.0/24\n203.56.172.0/23\n203.56.175.0/24\n203.56.183.0/24\n203.56.185.0/24\n203.56.187.0/24\n203.56.192.0/24\n203.56.198.0/24\n203.56.201.0/24\n203.56.208.0/23\n203.56.210.0/24\n203.56.214.0/24\n203.56.216.0/24\n203.56.228.0/24\n203.56.232.0/24\n203.56.240.0/24\n203.56.252.0/24\n203.56.254.0/24\n203.57.5.0/24\n203.57.6.0/24\n203.57.12.0/23\n203.57.28.0/24\n203.57.39.0/24\n203.57.46.0/24\n203.57.58.0/24\n203.57.61.0/24\n203.57.66.0/24\n203.57.69.0/24\n203.57.70.0/23\n203.57.73.0/24\n203.57.90.0/24\n203.57.101.0/24\n203.57.109.0/24\n203.57.123.0/24\n203.57.157.0/24\n203.57.200.0/24\n203.57.202.0/24\n203.57.206.0/24\n203.57.222.0/24\n203.57.224.0/20\n203.57.249.0/24\n203.57.254.0/23\n203.62.2.0/24\n203.62.131.0/24\n203.62.139.0/24\n203.65.240.0/22\n203.76.208.0/21\n203.76.216.0/22\n203.76.240.0/22\n203.78.48.0/20\n203.79.0.0/23\n203.80.57.0/24\n203.80.144.0/20\n203.82.0.0/23\n203.83.56.0/21\n203.83.224.0/20\n203.86.0.0/19\n203.86.43.0/24\n203.86.44.0/23\n203.86.48.0/23\n203.86.51.0/24\n203.86.52.0/22\n203.86.60.0/23\n203.86.62.0/24\n203.86.64.0/19\n203.86.112.0/24\n203.86.254.0/23\n203.88.32.0/19\n203.88.192.0/19\n203.89.100.0/22\n203.90.128.0/18\n203.90.192.0/19\n203.91.32.0/19\n203.91.120.0/21\n203.93.0.0/18\n203.93.64.0/19\n203.93.96.0/20\n203.93.117.0/24\n203.93.120.0/21\n203.93.128.0/19\n203.93.160.0/20\n203.93.208.0/20\n203.93.224.0/19\n203.94.0.0/19\n203.95.0.0/23\n203.95.2.0/24\n203.95.4.0/22\n203.95.128.0/23\n203.99.20.0/22\n203.99.24.0/21\n203.100.92.0/22\n203.100.192.0/20\n203.104.32.0/20\n203.107.1.0/24\n203.107.2.0/24\n203.107.6.0/24\n203.107.13.0/24\n203.107.20.0/22\n203.107.26.0/23\n203.107.28.0/22\n203.107.32.0/19\n203.107.72.0/21\n203.107.80.0/21\n203.107.96.0/23\n203.107.116.0/22\n203.110.160.0/19\n203.110.208.0/20\n203.110.232.0/23\n203.114.244.0/22\n203.118.248.0/22\n203.119.25.0/24\n203.119.26.0/23\n203.119.28.0/22\n203.119.33.0/24\n203.119.80.0/22\n203.119.114.0/23\n203.119.128.0/19\n203.119.160.0/24\n203.119.168.0/21\n203.119.176.0/20\n203.119.192.0/18\n203.129.12.0/22\n203.130.40.0/21\n203.132.32.0/19\n203.133.240.0/21\n203.135.96.0/19\n203.148.0.0/18\n203.148.64.0/20\n203.148.86.0/23\n203.152.64.0/19\n203.156.192.0/18\n203.160.129.0/24\n203.160.192.0/19\n203.161.192.0/19\n203.166.160.0/22\n203.166.165.0/24\n203.166.166.0/24\n203.166.172.0/24\n203.166.177.0/24\n203.166.186.0/23\n203.166.188.0/23\n203.166.191.0/24\n203.168.0.0/19\n203.170.58.0/23\n203.174.4.0/24\n203.174.96.0/19\n203.175.128.0/19\n203.176.92.0/22\n203.176.168.0/24\n203.176.170.0/24\n203.187.160.0/19\n203.189.0.0/23\n203.189.6.0/23\n203.189.113.0/24\n203.189.115.0/24\n203.189.192.0/19\n203.189.240.0/22\n203.190.100.0/23\n203.191.0.0/23\n203.191.144.0/21\n203.192.1.0/24\n203.192.2.0/23\n203.192.4.0/22\n203.192.8.0/21\n203.192.16.0/24\n203.192.24.0/23\n203.193.224.0/19\n203.194.122.0/23\n203.194.124.0/24\n203.195.64.0/19\n203.195.113.0/24\n203.195.114.0/24\n203.195.118.0/23\n203.195.128.0/17\n203.196.0.0/21\n203.202.236.0/23\n203.207.64.0/19\n203.207.96.0/21\n203.207.104.0/22\n203.207.112.0/20\n203.207.128.0/18\n203.207.192.0/21\n203.207.200.0/22\n203.207.208.0/20\n203.207.224.0/19\n203.208.32.0/19\n203.209.224.0/19\n203.212.0.0/21\n203.212.8.0/22\n203.212.80.0/23\n203.215.232.0/23\n203.215.236.0/24\n203.223.17.0/24\n203.223.19.0/24\n203.223.20.0/23\n204.77.130.0/24\n205.198.19.0/24\n206.54.1.128/25\n206.54.9.0/24\n206.54.10.0/23\n206.54.12.0/22\n210.2.0.0/23\n210.2.4.0/24\n210.5.0.0/19\n210.5.56.0/21\n210.5.128.0/19\n210.12.0.0/16\n210.13.0.0/17\n210.13.192.0/19\n210.13.224.0/24\n210.13.227.0/24\n210.13.230.0/23\n210.13.232.0/24\n210.13.236.0/23\n210.13.238.0/24\n210.13.240.0/20\n210.14.64.0/20\n210.14.80.0/22\n210.14.84.0/24\n210.14.90.0/23\n210.14.92.0/22\n210.14.112.0/20\n210.14.128.0/19\n210.14.192.0/18\n210.15.0.0/17\n210.16.160.0/19\n210.21.0.0/17\n210.21.192.0/18\n210.22.0.0/19\n210.22.32.0/22\n210.22.48.0/20\n210.22.64.0/18\n210.22.128.0/17\n210.25.0.0/16\n210.26.0.0/15\n210.28.0.0/14\n210.32.0.0/12\n210.48.136.0/21\n210.51.0.0/16\n210.52.0.0/15\n210.72.0.0/17\n210.72.128.0/18\n210.72.192.0/19\n210.72.224.0/20\n210.72.240.0/23\n210.72.243.0/24\n210.72.245.0/24\n210.72.246.0/24\n210.73.0.0/17\n210.73.128.0/18\n210.73.192.0/22\n210.73.204.0/24\n210.73.208.0/20\n210.73.224.0/19\n210.74.0.0/20\n210.74.35.0/24\n210.74.36.0/23\n210.74.38.0/24\n210.74.40.0/22\n210.74.44.0/23\n210.74.47.0/24\n210.74.64.0/23\n210.74.107.0/24\n210.74.108.0/23\n210.74.128.0/18\n210.74.224.0/19\n210.75.0.0/18\n210.75.96.0/19\n210.75.192.0/18\n210.76.0.0/18\n210.76.64.0/19\n210.76.160.0/19\n210.76.192.0/19\n210.77.0.0/18\n210.77.64.0/19\n210.77.128.0/19\n210.77.176.0/22\n210.77.180.0/23\n210.77.182.0/24\n210.77.184.0/24\n210.77.189.0/24\n210.77.190.0/23\n210.77.192.0/18\n210.78.128.0/24\n210.78.134.0/23\n210.78.139.0/24\n210.78.144.0/23\n210.79.224.0/19\n210.82.0.0/15\n210.87.128.0/18\n210.185.192.0/18\n210.192.96.0/20\n210.192.116.0/22\n210.192.120.0/21\n211.64.0.0/13\n211.76.179.0/24\n211.80.0.0/13\n211.88.0.0/15\n211.90.0.0/17\n211.90.128.0/18\n211.90.192.0/20\n211.90.216.0/21\n211.90.224.0/19\n211.91.0.0/18\n211.91.64.0/19\n211.91.96.0/20\n211.91.120.0/21\n211.91.128.0/18\n211.91.216.0/21\n211.91.224.0/19\n211.92.0.0/17\n211.92.128.0/18\n211.92.192.0/19\n211.92.224.0/20\n211.92.244.0/22\n211.93.0.0/17\n211.93.128.0/20\n211.93.144.0/21\n211.93.160.0/19\n211.93.192.0/21\n211.93.200.0/23\n211.93.204.0/22\n211.93.211.0/24\n211.93.212.0/23\n211.93.224.0/19\n211.94.37.0/24\n211.94.64.0/18\n211.94.128.0/17\n211.95.0.0/17\n211.95.128.0/19\n211.95.192.0/18\n211.96.0.0/16\n211.97.0.0/17\n211.97.128.0/19\n211.97.160.0/21\n211.97.176.0/20\n211.97.192.0/18\n211.98.0.0/16\n211.99.8.0/21\n211.99.16.0/23\n211.99.25.0/24\n211.99.26.0/24\n211.99.28.0/22\n211.99.32.0/19\n211.99.64.0/18\n211.99.128.0/18\n211.99.192.0/19\n211.100.0.0/17\n211.100.192.0/20\n211.100.224.0/19\n211.101.0.0/18\n211.101.192.0/20\n211.101.232.0/21\n211.101.240.0/21\n211.102.80.0/20\n211.102.128.0/18\n211.102.192.0/23\n211.102.208.0/20\n211.102.240.0/21\n211.102.248.0/24\n211.103.0.0/16\n211.136.0.0/13\n211.144.9.0/24\n211.144.10.0/24\n211.144.12.0/22\n211.144.16.0/24\n211.144.18.0/23\n211.144.20.0/24\n211.144.22.0/24\n211.144.24.0/24\n211.144.27.0/24\n211.144.28.0/23\n211.144.32.0/19\n211.144.64.0/19\n211.144.96.0/23\n211.144.100.0/22\n211.144.104.0/22\n211.144.108.0/23\n211.144.110.0/24\n211.144.112.0/24\n211.144.114.0/23\n211.144.118.0/23\n211.144.120.0/21\n211.144.128.0/19\n211.144.192.0/18\n211.145.0.0/18\n211.145.64.0/20\n211.146.0.0/16\n211.147.0.0/18\n211.147.64.0/19\n211.147.128.0/18\n211.147.208.0/20\n211.147.224.0/19\n211.148.0.0/18\n211.148.128.0/17\n211.149.128.0/17\n211.150.0.0/18\n211.150.64.0/19\n211.150.98.0/24\n211.150.100.0/23\n211.150.114.0/23\n211.150.122.0/24\n211.150.124.0/23\n211.150.128.0/24\n211.151.0.0/16\n211.152.0.0/17\n211.152.192.0/22\n211.152.196.0/23\n211.152.208.0/20\n211.153.0.0/16\n211.154.0.0/19\n211.154.64.0/19\n211.154.128.0/17\n211.155.16.0/20\n211.155.32.0/19\n211.155.80.0/20\n211.155.108.0/22\n211.155.112.0/20\n211.155.128.0/19\n211.155.160.0/20\n211.155.176.0/22\n211.155.184.0/21\n211.155.224.0/21\n211.155.232.0/22\n211.155.236.0/24\n211.155.240.0/20\n211.156.0.0/19\n211.156.128.0/19\n211.156.176.0/20\n211.156.192.0/20\n211.156.208.0/21\n211.156.216.0/22\n211.156.220.0/23\n211.156.223.0/24\n211.157.0.0/19\n211.157.96.0/19\n211.157.128.0/18\n211.157.192.0/20\n211.157.219.0/24\n211.157.222.0/24\n211.157.224.0/19\n211.158.0.0/16\n211.159.64.0/21\n211.159.128.0/17\n211.160.0.0/22\n211.160.4.0/24\n211.160.9.0/24\n211.160.10.0/23\n211.160.14.0/23\n211.160.16.0/24\n211.160.18.0/23\n211.160.20.0/23\n211.160.22.0/24\n211.160.24.0/24\n211.160.27.0/24\n211.160.28.0/23\n211.160.36.0/23\n211.160.46.0/24\n211.160.62.0/24\n211.160.72.0/21\n211.160.80.0/20\n211.160.112.0/23\n211.160.115.0/24\n211.160.120.0/24\n211.160.160.0/19\n211.160.195.0/24\n211.160.196.0/24\n211.160.203.0/24\n211.160.205.0/24\n211.160.244.0/24\n211.160.246.0/23\n211.160.248.0/21\n211.161.0.0/20\n211.161.24.0/22\n211.161.32.0/20\n211.161.60.0/23\n211.161.62.0/24\n211.161.97.0/24\n211.161.101.0/24\n211.161.102.0/23\n211.161.120.0/21\n211.161.192.0/22\n211.161.203.0/24\n211.161.209.0/24\n211.161.221.0/24\n211.161.224.0/20\n211.162.0.0/21\n211.162.64.0/20\n211.162.119.0/24\n211.162.120.0/21\n211.162.200.0/22\n211.165.0.0/16\n211.166.0.0/16\n211.167.64.0/18\n211.167.128.0/19\n211.167.176.0/20\n211.167.224.0/19\n212.64.0.0/17\n212.100.186.0/24\n212.103.62.0/24\n212.129.128.0/17\n218.0.0.0/11\n218.56.0.0/13\n218.64.0.0/11\n218.96.0.0/24\n218.96.64.0/22\n218.96.104.0/22\n218.96.108.0/23\n218.96.126.0/23\n218.96.128.0/24\n218.96.241.0/24\n218.96.244.0/24\n218.96.255.0/24\n218.97.0.0/17\n218.97.160.0/19\n218.97.192.0/19\n218.97.240.0/20\n218.98.0.0/18\n218.98.96.0/21\n218.98.104.0/22\n218.98.108.0/23\n218.98.111.0/24\n218.98.112.0/20\n218.98.160.0/24\n218.98.176.0/21\n218.98.192.0/24\n218.100.88.0/21\n218.104.0.0/15\n218.106.0.0/16\n218.107.0.0/18\n218.107.128.0/17\n218.108.0.0/15\n218.185.240.0/21\n218.192.0.0/12\n218.213.85.0/24\n218.213.92.0/24\n218.240.0.0/18\n218.240.128.0/19\n218.240.160.0/21\n218.240.168.0/24\n218.240.176.0/20\n218.241.16.0/21\n218.241.96.0/20\n218.241.112.0/22\n218.241.116.0/23\n218.241.118.0/24\n218.241.121.0/24\n218.241.122.0/23\n218.241.124.0/22\n218.241.128.0/17\n218.242.0.0/16\n218.244.0.0/19\n218.244.44.0/22\n218.244.49.0/24\n218.244.52.0/23\n218.244.55.0/24\n218.244.56.0/23\n218.244.58.0/24\n218.244.128.0/18\n218.244.192.0/20\n218.244.224.0/19\n218.245.0.0/17\n218.246.0.0/19\n218.246.32.0/22\n218.246.48.0/22\n218.246.64.0/18\n218.246.160.0/19\n218.246.192.0/19\n218.247.0.0/18\n218.247.64.0/19\n218.247.128.0/17\n218.249.0.0/16\n218.252.0.0/17\n218.253.0.0/18\n219.72.0.0/16\n219.82.0.0/16\n219.83.160.0/19\n219.100.148.0/22\n219.117.16.0/20\n219.128.0.0/12\n219.144.0.0/14\n219.148.0.0/15\n219.150.0.0/16\n219.151.0.0/18\n219.151.128.0/17\n219.152.0.0/14\n219.156.0.0/15\n219.158.0.0/19\n219.158.32.0/20\n219.158.58.0/23\n219.158.60.0/22\n219.158.96.0/19\n219.158.128.0/17\n219.159.0.0/16\n219.216.0.0/13\n219.224.0.0/13\n219.232.0.0/17\n219.232.144.0/24\n219.232.160.0/19\n219.232.192.0/19\n219.233.0.0/16\n219.234.0.0/21\n219.234.16.0/20\n219.234.80.0/20\n219.234.96.0/19\n219.234.128.0/17\n219.235.0.0/20\n219.235.32.0/19\n219.235.64.0/18\n219.235.128.0/20\n219.235.144.0/21\n219.235.192.0/23\n219.235.207.0/24\n219.235.224.0/22\n219.235.228.0/23\n219.235.233.0/24\n219.235.234.0/24\n219.235.237.0/24\n219.235.251.0/24\n219.235.252.0/24\n219.235.255.0/24\n219.236.0.0/14\n219.242.0.0/15\n219.244.0.0/14\n220.101.192.0/19\n220.112.0.0/22\n220.112.8.0/24\n220.112.40.0/21\n220.112.50.0/23\n220.112.52.0/23\n220.112.54.0/24\n220.112.194.0/24\n220.112.196.0/24\n220.112.200.0/21\n220.113.0.0/19\n220.113.32.0/20\n220.113.96.0/21\n220.113.150.0/23\n220.113.152.0/23\n220.113.154.0/24\n220.114.250.0/23\n220.154.0.0/20\n220.154.16.0/22\n220.154.64.0/20\n220.154.80.0/22\n220.154.128.0/20\n220.154.147.0/24\n220.160.0.0/12\n220.176.0.0/14\n220.180.0.0/16\n220.181.0.0/17\n220.181.128.0/20\n220.181.144.0/24\n220.181.148.0/22\n220.181.152.0/21\n220.181.160.0/19\n220.182.0.0/18\n220.184.0.0/13\n220.192.0.0/16\n220.193.0.0/17\n220.194.0.0/16\n220.195.0.0/17\n220.195.128.0/19\n220.195.192.0/18\n220.196.0.0/16\n220.197.0.0/17\n220.197.160.0/19\n220.197.192.0/18\n220.198.0.0/15\n220.200.0.0/17\n220.200.128.0/20\n220.200.148.0/22\n220.200.152.0/21\n220.200.160.0/19\n220.200.192.0/18\n220.201.0.0/16\n220.202.0.0/16\n220.203.0.0/17\n220.203.128.0/18\n220.203.216.0/23\n220.203.220.0/22\n220.203.224.0/19\n220.205.0.0/16\n220.206.192.0/22\n220.207.0.0/22\n220.207.80.0/20\n220.207.176.0/22\n220.207.184.0/22\n220.207.254.0/23\n220.231.32.0/20\n220.231.128.0/17\n220.232.64.0/18\n220.234.0.0/16\n220.242.180.0/24\n220.243.128.0/20\n220.243.153.0/24\n220.243.154.0/23\n220.243.156.0/23\n220.243.176.0/20\n220.248.0.0/16\n220.249.0.0/17\n220.249.128.0/18\n220.249.192.0/19\n220.249.240.0/20\n220.250.0.0/17\n221.0.0.0/13\n221.8.0.0/14\n221.12.0.0/17\n221.12.128.0/18\n221.13.0.0/16\n221.14.0.0/15\n221.122.0.0/16\n221.123.0.0/24\n221.123.112.0/20\n221.123.128.0/17\n221.129.0.0/16\n221.130.0.0/15\n221.133.225.0/24\n221.133.226.0/24\n221.133.228.0/22\n221.133.232.0/23\n221.133.235.0/24\n221.133.244.0/23\n221.137.0.0/16\n221.174.0.0/17\n221.176.0.0/13\n221.192.0.0/14\n221.196.0.0/15\n221.198.0.0/16\n221.199.0.0/17\n221.199.128.0/18\n221.199.192.0/20\n221.199.224.0/19\n221.200.0.0/13\n221.208.0.0/12\n221.224.0.0/12\n222.16.0.0/12\n222.35.0.0/16\n222.42.115.0/24\n222.44.0.0/15\n222.49.128.0/17\n222.50.0.0/16\n222.59.128.0/17\n222.64.0.0/11\n222.125.0.0/16\n222.126.128.0/22\n222.126.132.0/23\n222.126.140.0/22\n222.126.144.0/24\n222.126.146.0/23\n222.126.148.0/22\n222.126.152.0/21\n222.126.160.0/20\n222.126.176.0/21\n222.126.184.0/22\n222.126.188.0/23\n222.126.192.0/22\n222.126.196.0/23\n222.126.200.0/22\n222.126.208.0/23\n222.126.212.0/22\n222.126.216.0/23\n222.126.228.0/23\n222.126.234.0/23\n222.126.236.0/22\n222.126.240.0/20\n222.128.0.0/12\n222.160.0.0/14\n222.166.240.0/20\n222.167.244.0/24\n222.168.0.0/13\n222.176.0.0/12\n222.192.0.0/11\n222.240.0.0/13\n222.248.0.0/15\n223.0.1.0/24\n223.0.2.0/24\n223.0.8.0/22\n223.0.12.0/23\n223.0.15.0/24\n223.0.16.0/24\n223.0.30.0/24\n223.0.40.0/23\n223.0.126.0/24\n223.2.0.0/15\n223.4.0.0/14\n223.8.0.0/13\n223.26.0.0/23\n223.27.184.0/22\n223.64.0.0/10\n223.128.0.0/15\n223.144.0.0/12\n223.160.0.0/20\n223.160.16.0/21\n223.160.112.0/20\n223.160.128.0/22\n223.160.134.0/23\n223.160.136.0/21\n223.160.144.0/20\n223.160.160.0/19\n223.160.192.0/19\n223.160.224.0/21\n223.160.232.0/22\n223.160.236.0/23\n223.161.194.0/23\n223.161.196.0/22\n223.161.200.0/21\n223.161.208.0/20\n223.161.224.0/19\n223.165.10.0/24\n223.165.12.0/24\n223.165.80.0/20\n223.166.0.0/15\n223.192.0.0/15\n223.198.0.0/15\n223.202.0.0/24\n223.202.67.0/24\n223.202.131.0/24\n223.202.132.0/24\n223.202.134.0/23\n223.202.211.0/24\n223.202.212.0/24\n223.203.3.0/24\n223.203.9.0/24\n223.203.96.0/24\n223.203.100.0/24\n223.210.0.0/19\n223.210.48.0/22\n223.212.0.0/14\n223.220.0.0/15\n223.223.176.0/20\n223.223.192.0/20\n223.240.0.0/13\n223.248.0.0/14\n223.252.194.0/24\n223.252.196.0/24\n223.252.199.0/24\n223.252.200.0/23\n223.252.202.0/24\n223.252.205.0/24\n223.252.209.0/24\n223.252.210.0/23\n223.252.212.0/24\n223.252.214.0/23\n223.252.221.0/24\n223.252.222.0/24\n223.255.236.0/22\n223.255.252.0/23\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/resources/china_ip4.ver",
    "content": "20260424052559\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/resources/china_ip6.txt",
    "content": "2001:250::/30\n2001:254::/31\n2001:256:100::/48\n2001:678:120::/48\n2001:678:53c::/48\n2001:678:10d0::/48\n2001:678:1184::/48\n2001:67c:ebc::/48\n2001:7fa:5::/48\n2001:c68::/32\n2001:cc0::/32\n2001:da8::/32\n2001:daa:1::/48\n2001:daa:2::/47\n2001:daa:4::/47\n2001:daa:6::/48\n2001:dc7::/32\n2001:dd8:1::/48\n2001:dd9::/48\n2001:df0:ac40::/48\n2001:df1:da00::/48\n2001:df3:3a80::/48\n2001:df3:8b80::/48\n2001:df5:4740::/48\n2001:df6:40::/48\n2001:df7:1480::/48\n2001:4510:400::/40\n2400:1160::/32\n2400:3200::/32\n2400:5280:f803::/48\n2400:54a0:21c2::/47\n2400:5a00::/32\n2400:5a60:2::/48\n2400:5f60::/32\n2400:6000::/32\n2400:6460::/39\n2400:6460:300::/40\n2400:6460:500::/40\n2400:6460:600::/40\n2400:6600::/32\n2400:6e60:1301::/48\n2400:75aa::/32\n2400:7bc0:20::/43\n2400:7fc0::/40\n2400:7fc0:220::/44\n2400:7fc0:240::/44\n2400:7fc0:2a0::/44\n2400:7fc0:2c0::/44\n2400:7fc0:4000::/40\n2400:7fc0:4100::/48\n2400:7fc0:6000::/40\n2400:7fc0:8000::/36\n2400:7fc0:a000::/36\n2400:7fc0:bb00::/40\n2400:7fc0:c000::/36\n2400:8200::/32\n2400:89c0:1010::/44\n2400:89c0:1050::/46\n2400:89c0:1130::/44\n2400:89c0:1150::/48\n2400:89c0:2100::/48\n2400:89c0:2200::/48\n2400:89c0:3010::/44\n2400:89c0:6000::/48\n2400:89c0:6100::/48\n2400:8fc0:571::/48\n2400:9020:f010::/46\n2400:9340::/32\n2400:9380:8001::/48\n2400:9380:8003::/48\n2400:9380:8021::/48\n2400:9380:8040::/48\n2400:9380:8140::/48\n2400:9380:8201::/48\n2400:9380:8301::/48\n2400:9380:9001::/48\n2400:9380:9009::/48\n2400:9380:9020::/47\n2400:9380:9050::/47\n2400:9380:9060::/48\n2400:9380:9071::/48\n2400:9380:9080::/47\n2400:9380:90b1::/48\n2400:9380:90b2::/47\n2400:9380:90b4::/46\n2400:9380:9121::/48\n2400:9380:9220::/47\n2400:9380:9250::/47\n2400:9380:9260::/48\n2400:9380:9271::/48\n2400:9380:9280::/47\n2400:9380:92b1::/48\n2400:9380:92b2::/47\n2400:9380:92b4::/46\n2400:95e0::/48\n2400:9600:8800::/48\n2400:9620::/32\n2400:a860:1::/48\n2400:a860:2::/47\n2400:a860:4::/47\n2400:a860:6::/48\n2400:a980::/29\n2400:ae00:1981::/48\n2400:b200::/32\n2400:b600::/32\n2400:b620::/48\n2400:b700::/48\n2400:be00::/48\n2400:cb80:e2e::/47\n2400:cb80:e30::/44\n2400:cb80:e40::/44\n2400:da00::/32\n2400:dd00::/28\n2400:ee00:ffec::/46\n2400:ee00:fff0::/44\n2400:f720::/32\n2400:fe00::/32\n2401:20::/40\n2401:20:1330::/46\n2401:800::/32\n2401:1160::/32\n2401:1320::/32\n2401:1d40::/32\n2401:2a00:f000::/43\n2401:2e00::/32\n2401:3480::/36\n2401:3480:2000::/48\n2401:3480:3000::/36\n2401:34a0::/31\n2401:3800::/32\n2401:70e0::/32\n2401:71c0::/48\n2401:7660::/48\n2401:8a00:11::/48\n2401:8a00:12::/48\n2401:8be0::/48\n2401:8d00::/46\n2401:8d00:4::/48\n2401:8d00:7::/48\n2401:8d00:8::/47\n2401:8d00:b::/48\n2401:8d00:c::/48\n2401:8d00:f::/48\n2401:8d00:14::/47\n2401:9a00::/44\n2401:9a00:10::/46\n2401:a140:1::/48\n2401:b180::/32\n2401:b400::/45\n2401:b400:8::/47\n2401:b400:11::/48\n2401:b400:14::/48\n2401:b400:16::/47\n2401:b400:20::/47\n2401:b680::/32\n2401:be00::/32\n2401:c020:6::/48\n2401:c020:8::/47\n2401:c020:14::/48\n2401:cb80::/32\n2401:cc00::/32\n2401:ce00::/32\n2401:d0e0:3::/48\n2401:d180::/46\n2401:d180:10::/47\n2401:d180:111::/48\n2401:d180:2120::/48\n2401:d920::/48\n2401:de00::/32\n2401:ec00::/32\n2401:f860:85::/48\n2401:f860:87::/48\n2401:f860:88::/47\n2401:f860:90::/48\n2401:f860:92::/47\n2401:f860:94::/48\n2401:f860:96::/47\n2401:f860:100::/40\n2401:fa00:40::/43\n2402:840:d000::/46\n2402:840:e000::/46\n2402:840:f000::/38\n2402:c60::/48\n2402:1440::/32\n2402:1460::/32\n2402:18a0::/32\n2402:2000::/32\n2402:20e0:f000::/48\n2402:3180::/46\n2402:3180:8000::/33\n2402:33e0::/32\n2402:36e0::/44\n2402:3c00::/32\n2402:3f80:1400::/40\n2402:4b80::/32\n2402:4e00::/32\n2402:5ec0::/32\n2402:6e80::/32\n2402:6f40::/48\n2402:6f40:2::/48\n2402:7d80::/48\n2402:7d80:240::/48\n2402:7d80:8888::/48\n2402:8bc0::/32\n2402:8cc0::/40\n2402:8cc0:200::/40\n2402:92c0::/48\n2402:93c0::/48\n2402:93c0:20::/48\n2402:93c0:100::/48\n2402:9a80::/32\n2402:a200::/32\n2402:b8c0:6::/48\n2402:b8c0:86::/48\n2402:b8c0:106::/48\n2402:b8c0:186::/48\n2402:d340::/32\n2402:db40:5100::/48\n2402:db40:5900::/48\n2402:db40:5f00::/46\n2402:dfc0::/44\n2402:dfc0:50::/44\n2402:e380:100::/40\n2402:e480::/32\n2402:e740::/32\n2402:e7c0::/32\n2402:e880::/48\n2402:ef40::/32\n2402:f000::/32\n2402:f140:ff00::/46\n2402:f140:ff04::/48\n2402:f140:ff10::/46\n2402:f140:ff14::/48\n2402:f8c0::/42\n2403:600::/32\n2403:c80::/32\n2403:1b80::/48\n2403:1ec0:1200::/48\n2403:1ec0:1400::/48\n2403:1ec0:1600::/48\n2403:1ec0:1610::/48\n2403:1ec0:1900::/48\n2403:1ec0:1910::/44\n2403:1ec0:1920::/43\n2403:1ec0:1940::/44\n2403:2040::/48\n2403:2b40::/32\n2403:3140::/32\n2403:4240::/32\n2403:4280::/47\n2403:4300::/32\n2403:4c80::/48\n2403:5c80::/48\n2403:6380:40::/46\n2403:6380:60::/44\n2403:6740::/48\n2403:6a00::/32\n2403:7580::/32\n2403:8080:101::/48\n2403:8c00::/32\n2403:9b00:2000::/48\n2403:9b00:2400::/48\n2403:9b00:6000::/48\n2403:a100::/48\n2403:a140:10::/48\n2403:a140:100::/40\n2403:a200::/32\n2403:ac00::/32\n2403:ad80:8008::/48\n2403:ad80:8047::/48\n2403:b400::/32\n2403:c980::/32\n2403:d400::/32\n2403:e7c0:3::/48\n2403:f4c0::/48\n2403:ffc0:1100::/40\n2403:ffc0:1200::/39\n2404:bc0:1::/48\n2404:bc0:4000::/43\n2404:bc0:4100::/43\n2404:bc0:4200::/43\n2404:bc0:4300::/44\n2404:bc0:4400::/43\n2404:bc0:4500::/43\n2404:bc0:4620::/44\n2404:bc0:4f00::/43\n2404:1c80::/32\n2404:3700::/48\n2404:4dc0::/32\n2404:6380::/48\n2404:6380:1000::/48\n2404:6380:8001::/48\n2404:6500:dcb3::/48\n2404:7180:a000::/48\n2404:7180:a010::/48\n2404:7180:aa00::/48\n2404:7180:aa10::/48\n2404:7180:b001::/48\n2404:7180:b002::/48\n2404:7180:b010::/48\n2404:7180:c001::/48\n2404:7180:c002::/48\n2404:7180:c011::/48\n2404:7180:c012::/48\n2404:7180:f000::/48\n2404:7180:f010::/48\n2404:7240::/33\n2404:7600::/32\n2404:7940::/32\n2404:c2c0::/40\n2404:c2c0:240::/44\n2404:c2c0:280::/44\n2404:c2c0:2c0::/44\n2404:c2c0:501::/48\n2404:c2c0:4000::/40\n2404:c2c0:4100::/48\n2404:c2c0:6000::/40\n2404:c2c0:8000::/36\n2404:c2c0:bb00::/40\n2404:c2c0:c000::/36\n2404:c300::/32\n2404:c940::/48\n2404:e280::/47\n2404:e5c0::/32\n2404:e8c0::/32\n2404:f4c0::/32\n2405:6c0:2::/48\n2405:6c0:4::/48\n2405:1480:1000::/48\n2405:1480:2000::/48\n2405:1480:3000::/47\n2405:3140:11::/48\n2405:3140:21::/48\n2405:3140:31::/48\n2405:66c0::/32\n2405:68c0:21::/48\n2405:6940::/48\n2405:6f00:c101::/48\n2405:6f00:c102::/48\n2405:6f00:c170::/47\n2405:6f00:c602::/48\n2405:7040:6000::/47\n2405:78c0:6e00::/43\n2405:8a40::/32\n2405:a900:ffee::/48\n2405:a900:fffe::/48\n2405:ad00::/32\n2405:b7c0::/32\n2405:d900::/32\n2405:e000::/32\n2405:f580::/32\n2405:f940::/32\n2406:280::/32\n2406:840:9000::/44\n2406:840:e080::/44\n2406:840:e0cf::/48\n2406:840:e0e0::/46\n2406:840:e0e4::/47\n2406:840:e0e8::/48\n2406:840:e10f::/48\n2406:840:e14f::/48\n2406:840:e260::/48\n2406:840:e620::/48\n2406:840:e666::/47\n2406:840:e720::/44\n2406:840:e80f::/48\n2406:840:eb00::/46\n2406:840:eb04::/47\n2406:840:eb07::/48\n2406:840:eb08::/48\n2406:840:eb0b::/48\n2406:840:eb0f::/48\n2406:840:ee40::/47\n2406:840:ee44::/48\n2406:840:ee4b::/48\n2406:840:ee4d::/48\n2406:840:eee5::/48\n2406:840:f200::/48\n2406:840:f203::/48\n2406:840:f380::/44\n2406:840:f860::/46\n2406:840:f868::/47\n2406:840:f86c::/48\n2406:840:fc80::/45\n2406:840:fc88::/48\n2406:840:fc8f::/48\n2406:840:fcd0::/48\n2406:840:fcf0::/46\n2406:840:fcf4::/47\n2406:840:fd40::/43\n2406:840:fd60::/48\n2406:840:fd67::/48\n2406:840:fd70::/48\n2406:840:fd77::/48\n2406:840:fd80::/48\n2406:840:fd87::/48\n2406:840:fd90::/44\n2406:840:fda0::/43\n2406:840:fdc0::/44\n2406:840:fe27::/48\n2406:840:fe90::/46\n2406:840:fe94::/48\n2406:840:fe96::/47\n2406:840:fe98::/46\n2406:840:feab::/48\n2406:840:feac::/48\n2406:840:feaf::/48\n2406:840:fec0::/48\n2406:840:fec4::/48\n2406:840:feca::/48\n2406:840:fecc::/47\n2406:840:fecf::/48\n2406:840:fed8::/48\n2406:840:fedf::/48\n2406:840:fef3::/48\n2406:840:fef9::/48\n2406:840:fefb::/48\n2406:840:fefc::/48\n2406:840:feff::/48\n2406:1080::/48\n2406:2700::/32\n2406:3340::/32\n2406:3d80::/32\n2406:4d00::/48\n2406:52c0::/32\n2406:5340:6666::/48\n2406:5340:8888::/48\n2406:6100::/32\n2406:b640:100::/48\n2406:b640:4100::/48\n2406:cac0::/40\n2406:cac0:200::/40\n2406:cf00::/48\n2406:cf00:1000::/43\n2406:d440:100::/43\n2406:d440:200::/43\n2406:d440:300::/43\n2406:d440:ff00::/48\n2406:d440:ffff::/48\n2406:e3c0::/32\n2406:e500::/33\n2407:23c0::/48\n2407:2840::/48\n2407:37c0::/32\n2407:5380::/32\n2407:6c40:1100::/48\n2407:6c40:1210::/48\n2407:6c40:1500::/48\n2407:6c40:1600::/40\n2407:8f40:2::/48\n2407:9f00::/32\n2407:ad80::/32\n2407:ae80::/32\n2407:b380:8000::/48\n2407:bc00::/32\n2407:c080::/35\n2407:c080:4000::/37\n2407:c080:5000::/37\n2407:c080:6000::/36\n2407:c080:8000::/36\n2407:d9c0::/32\n2408:4000::/22\n2408:8000::/48\n2408:8000:2::/47\n2408:8000:1000::/36\n2408:8000:2000::/35\n2408:8000:4000::/34\n2408:8000:8000::/33\n2408:8001::/32\n2408:8020::/30\n2408:8024::/31\n2408:8026::/32\n2408:802a:8000::/33\n2408:802c::/32\n2408:803e::/32\n2408:8056::/32\n2408:805c::/30\n2408:8060::/33\n2408:80c2::/33\n2408:80c5::/33\n2408:80ca::/33\n2408:80ca:8000::/34\n2408:80da::/33\n2408:80da:8000::/34\n2408:80e0:4000::/34\n2408:80e0:8000::/33\n2408:80e2::/33\n2408:80e9:4000::/34\n2408:80ea:4000::/34\n2408:80ea:8000::/33\n2408:80f0:4000::/34\n2408:80f0:8000::/33\n2408:80f1::/42\n2408:80f1:40::/43\n2408:80f1:70::/44\n2408:80f1:80::/41\n2408:80f1:100::/43\n2408:80f1:120::/44\n2408:80f1:160::/43\n2408:80f1:180::/43\n2408:80f1:1b0::/44\n2408:80f1:1c0::/43\n2408:80f1:1e0::/44\n2408:80f1:200::/40\n2408:80f5:4000::/34\n2408:80f9:4000::/34\n2408:80fa:4000::/34\n2408:80fa:8000::/33\n2408:8120:1::/48\n2408:8120:2::/48\n2408:8120:7000::/36\n2408:8140:2000::/48\n2408:815f:e000::/35\n2408:8181::/40\n2408:8181:6000::/40\n2408:8181:8000::/40\n2408:8181:a000::/40\n2408:8181:a220::/44\n2408:8181:e000::/40\n2408:8182:6000::/40\n2408:8182:c000::/40\n2408:8183:4000::/40\n2408:8183:8000::/40\n2408:81a2:2000::/35\n2408:81a2:4000::/35\n2408:81a3:6000::/35\n2408:81a3:c800::/48\n2408:81a3:ca66::/48\n2408:8206::/31\n2408:8208::/29\n2408:8210::/30\n2408:8214::/31\n2408:821a::/31\n2408:8220::/31\n2408:8226::/32\n2408:822a::/31\n2408:822e::/31\n2408:8230::/29\n2408:8238::/31\n2408:823c::/31\n2408:8240::/32\n2408:8244::/30\n2408:8248::/30\n2408:824c::/32\n2408:824e::/31\n2408:8250::/30\n2408:8254::/32\n2408:8256::/31\n2408:8258::/30\n2408:825c::/31\n2408:825f::/32\n2408:8260::/32\n2408:8262::/31\n2408:8264::/31\n2408:8266::/32\n2408:826a::/32\n2408:826c::/30\n2408:8270::/32\n2408:8274::/30\n2408:8278::/31\n2408:827a::/32\n2408:8306::/31\n2408:8308::/30\n2408:8310::/30\n2408:832a::/32\n2408:832e::/31\n2408:8330::/30\n2408:8338::/32\n2408:8340::/32\n2408:8344::/30\n2408:8348::/30\n2408:834e::/31\n2408:8350::/30\n2408:8354::/32\n2408:8356::/31\n2408:8358::/30\n2408:8360::/30\n2408:8364::/31\n2408:836c::/30\n2408:8374::/30\n2408:8378::/31\n2408:837a::/32\n2408:8406:100::/41\n2408:8406:180::/42\n2408:8406:d00::/41\n2408:8406:d80::/42\n2408:8406:1900::/41\n2408:8406:1980::/42\n2408:8406:2500::/41\n2408:8406:2580::/42\n2408:8406:3100::/41\n2408:8406:3180::/42\n2408:8406:3d00::/41\n2408:8406:3d80::/42\n2408:8406:4900::/41\n2408:8406:4980::/42\n2408:8406:5500::/41\n2408:8406:5580::/42\n2408:8406:6100::/41\n2408:8406:6180::/42\n2408:8406:6d00::/41\n2408:8406:6d80::/42\n2408:8406:7900::/41\n2408:8406:7980::/42\n2408:8406:8500::/41\n2408:8406:8580::/42\n2408:8406:9100::/41\n2408:8406:9180::/42\n2408:8406:9d00::/41\n2408:8406:9d80::/42\n2408:8406:a900::/41\n2408:8406:a980::/42\n2408:8406:b500::/41\n2408:8406:b580::/42\n2408:8407:500::/42\n2408:8409::/40\n2408:8409:100::/41\n2408:8409:1a0::/43\n2408:8409:1c0::/42\n2408:8409:200::/42\n2408:8409:c00::/40\n2408:8409:d00::/41\n2408:8409:da0::/43\n2408:8409:dc0::/42\n2408:8409:e00::/42\n2408:8409:1800::/40\n2408:8409:1900::/41\n2408:8409:19a0::/43\n2408:8409:19c0::/42\n2408:8409:1a00::/42\n2408:8409:2400::/40\n2408:8409:2500::/41\n2408:8409:25a0::/43\n2408:8409:25c0::/42\n2408:8409:2600::/42\n2408:8409:3000::/40\n2408:8409:3100::/41\n2408:8409:31a0::/43\n2408:8409:31c0::/42\n2408:8409:3200::/42\n2408:8409:3c00::/40\n2408:8409:3d00::/41\n2408:8409:3da0::/43\n2408:8409:3dc0::/42\n2408:8409:3e00::/42\n2408:8409:4800::/40\n2408:8409:4900::/41\n2408:8409:49a0::/43\n2408:8409:49c0::/42\n2408:8409:4a00::/42\n2408:8409:5400::/40\n2408:8409:5500::/41\n2408:8409:55a0::/43\n2408:8409:55c0::/42\n2408:8409:5600::/42\n2408:8409:6000::/40\n2408:8409:6100::/41\n2408:8409:61a0::/43\n2408:8409:61c0::/42\n2408:8409:6200::/42\n2408:8409:6c00::/40\n2408:8409:6d00::/41\n2408:8409:6da0::/43\n2408:8409:6dc0::/42\n2408:8409:6e00::/42\n2408:8409:7800::/40\n2408:8409:7900::/41\n2408:8409:79a0::/43\n2408:8409:79c0::/42\n2408:8409:7a00::/42\n2408:8409:8400::/40\n2408:8409:8500::/41\n2408:8409:85a0::/43\n2408:8409:85c0::/42\n2408:8409:8600::/42\n2408:8409:9000::/40\n2408:8409:9100::/41\n2408:8409:91a0::/43\n2408:8409:91c0::/42\n2408:8409:9200::/42\n2408:8409:9c00::/40\n2408:8409:9d00::/41\n2408:8409:9da0::/43\n2408:8409:9dc0::/42\n2408:8409:9e00::/42\n2408:8409:a800::/40\n2408:8409:a900::/41\n2408:8409:a9a0::/43\n2408:8409:a9c0::/42\n2408:8409:aa00::/42\n2408:8409:b400::/40\n2408:8409:b500::/41\n2408:8409:b5a0::/43\n2408:8409:b5c0::/42\n2408:8409:b600::/42\n2408:840c::/40\n2408:840c:200::/40\n2408:840c:d00::/40\n2408:840c:f00::/40\n2408:840c:1a00::/40\n2408:840c:1c00::/40\n2408:840c:2700::/40\n2408:840c:2900::/40\n2408:840c:3400::/40\n2408:840c:3600::/40\n2408:840c:4e00::/40\n2408:840c:5000::/40\n2408:840c:5b00::/40\n2408:840c:5d00::/40\n2408:840c:6800::/40\n2408:840c:6a00::/40\n2408:840c:7500::/40\n2408:840c:7700::/40\n2408:840c:8200::/40\n2408:840c:8400::/40\n2408:840c:8f00::/40\n2408:840c:9100::/40\n2408:840c:9c00::/40\n2408:840c:9e00::/40\n2408:840c:a900::/40\n2408:840c:ab00::/40\n2408:840c:b600::/40\n2408:840c:b800::/40\n2408:840c:c300::/40\n2408:840c:c500::/40\n2408:840c:d000::/40\n2408:840c:d200::/40\n2408:840c:dd00::/40\n2408:840c:de00::/40\n2408:840d::/42\n2408:840d:200::/42\n2408:840d:400::/42\n2408:840d:440::/43\n2408:840d:600::/42\n2408:840d:d00::/42\n2408:840d:f00::/42\n2408:840d:1100::/42\n2408:840d:1140::/43\n2408:840d:1300::/42\n2408:840d:1a00::/42\n2408:840d:1c00::/42\n2408:840d:1e00::/42\n2408:840d:1e40::/43\n2408:840d:2000::/42\n2408:840d:2700::/42\n2408:840d:2900::/42\n2408:840d:2b00::/42\n2408:840d:2b40::/43\n2408:840d:2d00::/42\n2408:840d:3400::/42\n2408:840d:3600::/42\n2408:840d:3800::/42\n2408:840d:3840::/43\n2408:840d:3a00::/42\n2408:840d:4e00::/42\n2408:840d:5000::/42\n2408:840d:5200::/42\n2408:840d:5240::/43\n2408:840d:5400::/42\n2408:840d:5b00::/42\n2408:840d:5d00::/42\n2408:840d:5f00::/42\n2408:840d:5f40::/43\n2408:840d:6100::/42\n2408:840d:6800::/42\n2408:840d:6a00::/42\n2408:840d:6c00::/42\n2408:840d:6c40::/43\n2408:840d:6e00::/42\n2408:840d:7500::/42\n2408:840d:7700::/42\n2408:840d:7900::/42\n2408:840d:7940::/43\n2408:840d:7b00::/42\n2408:840d:8200::/42\n2408:840d:8400::/42\n2408:840d:8600::/42\n2408:840d:8640::/43\n2408:840d:8800::/42\n2408:840d:8f00::/42\n2408:840d:9100::/42\n2408:840d:9300::/42\n2408:840d:9340::/43\n2408:840d:9500::/42\n2408:840d:9c00::/42\n2408:840d:9e00::/42\n2408:840d:a000::/42\n2408:840d:a040::/43\n2408:840d:a200::/42\n2408:840d:a900::/42\n2408:840d:ab00::/42\n2408:840d:ad00::/42\n2408:840d:ad40::/43\n2408:840d:af00::/42\n2408:840d:b600::/42\n2408:840d:b800::/42\n2408:840d:ba00::/42\n2408:840d:ba40::/43\n2408:840d:bc00::/42\n2408:840d:c300::/42\n2408:840d:c500::/42\n2408:840d:c700::/42\n2408:840d:c740::/43\n2408:840d:c900::/42\n2408:840d:d000::/42\n2408:840d:d200::/42\n2408:840d:d400::/42\n2408:840d:d440::/43\n2408:840d:d600::/42\n2408:840d:dd00::/42\n2408:840d:de00::/42\n2408:840e:dd00::/40\n2408:840e:de00::/40\n2408:840f:1e0::/46\n2408:840f:1e4::/47\n2408:8410::/30\n2408:8414::/31\n2408:8417::/32\n2408:8418::/32\n2408:841a::/31\n2408:841c::/31\n2408:841e::/32\n2408:8420::/31\n2408:8422::/32\n2408:8426::/31\n2408:842a::/31\n2408:842c::/32\n2408:842e::/32\n2408:8430::/31\n2408:8434::/30\n2408:8438::/31\n2408:843c::/30\n2408:8440::/31\n2408:8444::/30\n2408:8448::/32\n2408:844b::/32\n2408:844c::/30\n2408:8452::/31\n2408:8454::/32\n2408:8456::/31\n2408:8458::/30\n2408:845c::/31\n2408:8460::/30\n2408:8464::/31\n2408:8466::/32\n2408:8469::/32\n2408:846a::/31\n2408:846c::/30\n2408:8470::/31\n2408:8474::/30\n2408:8478::/31\n2408:847a::/32\n2408:84e1::/32\n2408:84e2::/31\n2408:84e4::/30\n2408:84e9::/32\n2408:84eb::/32\n2408:84ec::/30\n2408:84f0::/28\n2408:856c::/31\n2408:8606::/31\n2408:8608::/29\n2408:8610::/30\n2408:8614::/31\n2408:861a::/31\n2408:861c::/32\n2408:8620::/31\n2408:8624::/31\n2408:8626::/32\n2408:862a::/31\n2408:862d::/32\n2408:862e::/31\n2408:8630::/29\n2408:8638::/31\n2408:863c::/31\n2408:8640::/32\n2408:8642::/32\n2408:8644::/30\n2408:8648::/31\n2408:864c::/32\n2408:864e::/31\n2408:8650::/30\n2408:8656::/31\n2408:8658::/30\n2408:865c::/31\n2408:865f::/32\n2408:8660::/32\n2408:8662::/31\n2408:8664::/31\n2408:8666::/32\n2408:866a::/31\n2408:866c::/30\n2408:8670::/32\n2408:8674::/30\n2408:8678::/31\n2408:867a::/32\n2408:8706::/31\n2408:8708::/29\n2408:8710::/30\n2408:8719::/32\n2408:871a::/31\n2408:8720::/30\n2408:8726::/32\n2408:872b::/32\n2408:872f::/32\n2408:8730::/30\n2408:8734::/31\n2408:8736::/32\n2408:8738::/32\n2408:873c::/31\n2408:8740::/32\n2408:8742::/32\n2408:8744::/30\n2408:8748::/29\n2408:8752::/32\n2408:8756::/31\n2408:8758::/30\n2408:875c::/32\n2408:8760::/32\n2408:8762::/31\n2408:8764::/31\n2408:8766::/32\n2408:8768::/32\n2408:876a::/32\n2408:876c::/30\n2408:8770::/32\n2408:8772::/31\n2408:8774::/32\n2408:8776::/31\n2408:8778::/31\n2408:877a::/32\n2408:877c::/30\n2408:8806::/42\n2408:8806:40::/43\n2408:880c::/30\n2408:8810::/30\n2408:8814::/31\n2408:8818::/31\n2408:882c::/32\n2408:883a::/32\n2408:8844::/43\n2408:8856::/31\n2408:8858::/30\n2408:8862::/31\n2408:8864::/31\n2408:8866::/32\n2408:886e::/31\n2408:8872::/32\n2408:8878::/31\n2408:887e::/32\n2408:8906:20::/44\n2408:8907:9000::/44\n2408:890c::/31\n2408:8912::/31\n2408:8914::/30\n2408:891c::/32\n2408:8920::/32\n2408:8924::/32\n2408:892c::/32\n2408:8936::/32\n2408:893a::/32\n2408:8940::/32\n2408:8948::/32\n2408:894c::/32\n2408:894e::/32\n2408:8956::/31\n2408:8958::/30\n2408:8962::/31\n2408:8964::/31\n2408:8966::/32\n2408:896c::/32\n2408:896e::/31\n2408:8972::/32\n2408:8978::/30\n2408:897e::/32\n2408:8a00:c000::/36\n2408:8a00:d000::/37\n2408:8a00:e000::/35\n2408:8a01::/36\n2408:8a02:b110::/44\n2408:8a02:b120::/44\n2408:8a04:8000::/36\n2408:8a04:e000::/40\n2408:8a05:6000::/35\n2408:8a05:8000::/36\n2408:8a06::/47\n2408:8a06:100::/47\n2408:8a21:4000::/35\n2408:8a22:9200::/39\n2408:8a22:9400::/38\n2408:8a22:9800::/40\n2408:8a22:9a00::/39\n2408:8a22:9c00::/38\n2408:8a22:a000::/37\n2408:8a23:4000::/34\n2408:8a24:4000::/34\n2408:8a26:c000::/34\n2408:8a27:4000::/35\n2409:2000::/31\n2409:2002::/32\n2409:2003::/47\n2409:27fa::/48\n2409:27fa:f000::/48\n2409:27fb::/48\n2409:27fc::/48\n2409:27fe::/33\n2409:8000::/20\n240a:2000::/40\n240a:2001:100::/40\n240a:2001:1000::/36\n240a:4020:83a::/48\n240a:4020:883a::/48\n240a:4021:83a::/48\n240a:4021:883a::/48\n240a:4090:50::/48\n240a:4090:120::/48\n240a:4090:250::/48\n240a:4090:1000::/39\n240a:4090:1200::/40\n240a:4090:2010::/48\n240a:4090:2041::/48\n240a:4090:2061::/48\n240a:4090:3000::/39\n240a:4090:3200::/40\n240a:4090:5000::/39\n240a:4090:5200::/40\n240a:4090:7000::/39\n240a:4090:7200::/40\n240a:40b0:83a::/48\n240a:40b0:283a::/48\n240a:40b0:483a::/48\n240a:40b0:683a::/48\n240a:40c0:8000::/43\n240a:40c0:a000::/43\n240a:40c0:c000::/43\n240a:40c0:e000::/43\n240a:40c1::/43\n240a:40c1:2000::/43\n240a:40c1:4000::/43\n240a:40c1:6000::/43\n240a:40c1:a000::/43\n240a:40c1:c000::/43\n240a:40c1:e000::/43\n240a:40c2::/43\n240a:40c2:2000::/43\n240a:40c2:4000::/43\n240a:40c2:6000::/43\n240a:40c2:8000::/43\n240a:40c2:a000::/43\n240a:40c2:c000::/43\n240a:40c2:e000::/43\n240a:40c3::/43\n240a:40c3:2000::/43\n240a:40c3:4000::/43\n240a:40c3:6000::/43\n240a:40c3:8000::/43\n240a:40c3:a000::/43\n240a:40c3:c000::/43\n240a:40c3:e000::/43\n240a:40c4::/43\n240a:40c4:2000::/43\n240a:40c4:4000::/43\n240a:4280::/26\n240a:42c0::/27\n240a:42e0::/28\n240a:42f0::/29\n240a:42f8::/30\n240a:6001::/48\n240a:a000::/20\n240a:c000::/20\n240b:e001::/32\n240b:e002::/31\n240b:e004::/30\n240b:e008::/29\n240b:e010::/32\n240c:6::/47\n240c:6:3::/48\n240c:f:1::/48\n240c:4000::/22\n240c:c000::/20\n240d:4000::/21\n240e::/20\n2602:2e0:ff::/48\n2602:f46d:6::/48\n2602:f612::/40\n2602:f7ee:ee::/48\n2602:f92a:1314::/48\n2602:f92a:a440::/44\n2602:f92a:a46d::/48\n2602:f92a:a46f::/48\n2602:f92a:a470::/48\n2602:f92a:dead::/48\n2602:f93b:c00::/38\n2602:f9ba:a8::/48\n2602:f9f6:450::/48\n2602:fab0:11::/48\n2602:feda:1bf::/48\n2602:feda:1d1::/48\n2602:feda:1df::/48\n2602:feda:2d0::/44\n2602:feda:2f0::/44\n2605:9d80:8001::/48\n2605:9d80:8011::/48\n2605:9d80:8021::/48\n2605:9d80:8031::/48\n2605:9d80:8041::/48\n2605:9d80:8081::/48\n2605:9d80:9003::/48\n2605:9d80:9013::/48\n2605:9d80:9023::/48\n2605:9d80:9033::/48\n2605:9d80:9042::/48\n2605:9d80:9071::/48\n2605:9d80:9092::/48\n2804:1e48:9001::/48\n2804:1e48:9002::/48\n2a01:f100:1f8::/48\n2a04:3e00:1002::/48\n2a04:f580:8010::/47\n2a04:f580:8090::/48\n2a04:f580:8210::/47\n2a04:f580:8290::/48\n2a04:f580:9010::/48\n2a04:f580:9012::/47\n2a04:f580:9020::/48\n2a04:f580:9030::/48\n2a04:f580:9040::/48\n2a04:f580:9050::/48\n2a04:f580:9060::/48\n2a04:f580:9070::/48\n2a04:f580:9080::/48\n2a04:f580:9210::/48\n2a04:f580:9212::/47\n2a04:f580:9220::/48\n2a04:f580:9230::/48\n2a04:f580:9240::/48\n2a04:f580:9250::/48\n2a04:f580:9260::/48\n2a04:f580:9270::/48\n2a04:f580:9280::/48\n2a04:f580:9290::/48\n2a06:3600:e000::/40\n2a06:3600:fb00::/40\n2a06:3600:fc00::/38\n2a06:3605::/32\n2a06:3606::/31\n2a06:9f81:4600::/43\n2a06:9f81:4620::/44\n2a06:9f81:4640::/43\n2a06:a005:260::/43\n2a06:a005:280::/43\n2a06:a005:2a0::/44\n2a06:a005:a13::/48\n2a06:a005:1c40::/44\n2a09:b280:ff81::/48\n2a09:b280:ff83::/48\n2a09:b280:ff84::/47\n2a0a:2840::/30\n2a0a:2845:aab8::/46\n2a0a:2846::/48\n2a0a:6040:ec00::/40\n2a0a:6044:6600::/40\n2a0a:d681:e000::/40\n2a0a:d681:fb00::/40\n2a0a:d681:fc00::/38\n2a0b:2542::/48\n2a0b:4e07:b8::/47\n2a0c:9a40:8fc1::/48\n2a0c:9a40:8fc2::/47\n2a0c:9a40:8fc4::/48\n2a0c:b641:571::/48\n2a0c:b641:722::/47\n2a0e:aa01:1fff::/48\n2a0e:aa06::/40\n2a0e:aa06:490::/44\n2a0e:aa06:500::/44\n2a0e:aa06:520::/48\n2a0e:aa06:525::/48\n2a0e:aa06:541::/48\n2a0e:aa06:56a::/48\n2a0e:aa07:e01a::/47\n2a0e:aa07:e021::/48\n2a0e:aa07:e030::/48\n2a0e:aa07:e035::/48\n2a0e:aa07:e039::/48\n2a0e:aa07:e151::/48\n2a0e:aa07:e155::/48\n2a0e:aa07:e15f::/48\n2a0e:aa07:e160::/47\n2a0e:aa07:e162::/48\n2a0e:aa07:e16a::/48\n2a0e:aa07:e1a0::/44\n2a0e:aa07:e210::/48\n2a0e:aa07:e21c::/47\n2a0e:aa07:e220::/44\n2a0e:aa07:f0d0::/46\n2a0e:aa07:f0d4::/47\n2a0e:aa07:f0d8::/48\n2a0e:aa07:f0de::/47\n2a0e:b107:12b::/48\n2a0e:b107:272::/48\n2a0e:b107:740::/44\n2a0e:b107:c10::/48\n2a0e:b107:178d::/48\n2a0e:b107:178e::/48\n2a0f:1cc5:20::/44\n2a0f:1cc5:110::/44\n2a0f:1cc5:130::/44\n2a0f:1cc5:140::/44\n2a0f:1cc5:600::/47\n2a0f:1cc5:603::/48\n2a0f:1cc5:645::/48\n2a0f:1cc5:661::/48\n2a0f:1cc5:662::/48\n2a0f:1cc5:690::/48\n2a0f:1cc5:6a0::/48\n2a0f:1cc5:900::/40\n2a0f:1cc5:c01::/48\n2a0f:1cc5:f00::/46\n2a0f:1cc5:f04::/47\n2a0f:1cc5:f06::/48\n2a0f:1cc5:f08::/47\n2a0f:1cc5:fff::/48\n2a0f:1cc5:1310::/44\n2a0f:1cc5:1400::/48\n2a0f:1cc5:1c00::/47\n2a0f:1cc5:1c02::/48\n2a0f:1cc5:1c30::/48\n2a0f:1cc5:1cc0::/48\n2a0f:1cc5:1d10::/47\n2a0f:1cc5:1d14::/48\n2a0f:1cc5:2d01::/48\n2a0f:1cc5:2d03::/48\n2a0f:1cc5:ffff::/48\n2a0f:1cc6:b110::/47\n2a0f:2706::/32\n2a0f:6282:d000::/48\n2a0f:6284:300::/40\n2a0f:6284:400::/42\n2a0f:6284:440::/43\n2a0f:6284:3000::/39\n2a0f:6284:4c00::/44\n2a0f:6284:4c20::/44\n2a0f:6284:4c30::/48\n2a0f:6284:4c40::/43\n2a0f:6284:4c60::/44\n2a0f:6284:4c80::/43\n2a0f:6284:4ca0::/44\n2a0f:6284:4cd0::/44\n2a0f:6284:4f00::/40\n2a0f:6284:e000::/35\n2a0f:7803:f680::/44\n2a0f:7803:fa21::/48\n2a0f:7803:fa22::/47\n2a0f:7803:fa24::/46\n2a0f:7803:fe81::/48\n2a0f:7803:fe82::/48\n2a0f:85c1:ba5::/48\n2a0f:85c1:bfe::/48\n2a0f:85c1:ce1::/48\n2a0f:85c1:cf1::/48\n2a0f:9400:6110::/48\n2a0f:9400:7700::/48\n2a10:ccc6:66cc::/46\n2a12:cb46::/36\n2a12:cb47:ffff::/48\n2a12:f8c3::/36\n2a13:1800::/48\n2a13:1800:10::/48\n2a13:1800:80::/44\n2a13:1800:300::/44\n2a13:1801:180::/43\n2a13:a5c3:ff21::/48\n2a13:a5c3:ff50::/44\n2a13:a5c7:1800::/40\n2a13:a5c7:2121::/48\n2a13:a5c7:2801::/48\n2a13:a5c7:3100::/40\n2a13:a5c7:3301::/48\n2a13:a5c7:3302::/48\n2a13:a5c7:3304::/48\n2a13:a5c7:3306::/47\n2a13:a5c7:3309::/48\n2a13:aac4:f000::/44\n2a14:7c0:5103::/48\n2a14:4c41::/32\n2a14:67c1:70::/47\n2a14:67c1:74::/48\n2a14:67c1:702::/47\n2a14:67c1:a020::/48\n2a14:67c1:a023::/48\n2a14:67c1:a024::/48\n2a14:67c1:a02a::/48\n2a14:67c1:a02f::/48\n2a14:67c1:a040::/47\n2a14:67c1:a100::/43\n2a14:67c1:a121::/48\n2a14:67c1:a123::/48\n2a14:67c1:a125::/48\n2a14:67c1:a128::/48\n2a14:67c1:a144::/48\n2a14:67c1:b000::/48\n2a14:67c1:b065::/48\n2a14:67c1:b066::/48\n2a14:67c1:b068::/47\n2a14:67c1:b100::/46\n2a14:67c1:b105::/48\n2a14:67c1:b107::/48\n2a14:67c1:b110::/48\n2a14:67c1:b130::/46\n2a14:67c1:b134::/48\n2a14:67c1:b136::/48\n2a14:67c1:b141::/48\n2a14:67c1:b142::/47\n2a14:67c1:b146::/48\n2a14:67c1:b460::/44\n2a14:67c1:b4b0::/44\n2a14:67c1:b4e0::/44\n2a14:67c1:b500::/47\n2a14:67c1:b511::/48\n2a14:67c1:b514::/48\n2a14:67c1:b530::/44\n2a14:67c1:b561::/48\n2a14:67c1:b563::/48\n2a14:67c1:b578::/48\n2a14:67c1:b582::/48\n2a14:67c1:b586::/47\n2a14:67c1:b588::/47\n2a14:67c1:b590::/48\n2a14:67c1:b599::/48\n2a14:67c1:b5e0::/44\n2a14:67c1:c300::/40\n2a14:67c1:c600::/40\n2a14:67c2:800::/40\n2a14:67c2:c32::/48\n2a14:67c2:c64::/48\n2a14:67c3:30::/44\n2a14:67c3:c0::/48\n2a14:67c3:d0::/44\n2a14:67c3:520::/44\n2a14:67c3:e622::/48\n2a14:7580:730::/44\n2a14:7580:740::/44\n2a14:7580:777::/48\n2a14:7580:d000::/37\n2a14:7580:d800::/39\n2a14:7580:df00::/40\n2a14:7580:fe00::/40\n2a14:7580:ffe4::/48\n2a14:7580:fff4::/48\n2a14:7580:fff7::/48\n2a14:7580:fffa::/48\n2a14:7581:ffb::/48\n2a14:7581:30b6::/48\n2a14:7581:3100::/40\n2a14:7581:3401::/48\n2a14:7583:f224::/48\n2a14:7583:f228::/48\n2a14:7583:f22c::/48\n2a14:7583:f244::/48\n2a14:7583:f264::/48\n2a14:7583:f268::/48\n2a14:7583:f300::/46\n2a14:7583:f304::/47\n2a14:7583:f306::/48\n2a14:7583:f411::/48\n2a14:7583:f4f0::/47\n2a14:7583:f4f4::/48\n2a14:7583:f4fe::/48\n2a14:7583:f500::/48\n2a14:7583:f701::/48\n2a14:7583:f703::/48\n2a14:7583:f704::/46\n2a14:7583:f708::/46\n2a14:7583:f70c::/48\n2a14:7583:f743::/48\n2a14:7583:f744::/48\n2a14:7583:f764::/48\n2a14:7586:6100::/47\n2a14:7586:6103::/48\n2a14:7586:6104::/48\n2a14:7586:6107::/48\n2a14:7586:6110::/48\n2a14:7dc0:506::/48\n2c0f:f7a8:8011::/48\n2c0f:f7a8:8050::/48\n2c0f:f7a8:805f::/48\n2c0f:f7a8:8150::/48\n2c0f:f7a8:815f::/48\n2c0f:f7a8:8211::/48\n2c0f:f7a8:9020::/48\n2c0f:f7a8:9041::/48\n2c0f:f7a8:9211::/48\n2c0f:f7a8:9220::/48\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/resources/china_ip6.ver",
    "content": "20260424052559\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/resources/china_list.txt",
    "content": "0.zone\n00.net\n000.link\n000000.net\n0000001.xin\n000001.xin\n00000qpqp00000.com\n0000550xtz2.shop\n0000552bb0.shop\n0000552bb1.shop\n0000552bb2.shop\n0000552bb3.shop\n0000552bb4.shop\n0000f0deb5f4e6c3.com\n0000wb.com\n0001.xin\n000114.com\n00012023.com\n0001700.xin\n0002.xin\n0003399xtz1.shop\n0003399xtz2.shop\n00042.com\n00058.com\n0006111xtz2.shop\n0006266.com\n00063.xin\n000678.xin\n0006fc9541020.beer\n000700.com\n000714.xyz\n000793.com\n0007999ab0.shop\n0007999ab1.shop\n0007999ab2.shop\n0007999ab3.shop\n0007999ab4.shop\n0007999ab5.shop\n0007999ab6.shop\n0007999ab7.shop\n0007999ab8.shop\n0007999ab9.shop\n0008.xin\n00086.net\n000868adh1.shop\n000868agl1.shop\n000868atz2.shop\n0008bet.com\n0009.xin\n00091.xin\n000b0fb9410281.beer\n000dn.com\n000e.com\n000pc.net\n001.com\n001019.xin\n001060.com\n00117163.xyz\n001d628661009.beer\n001daima.com\n001fzc.com\n001jm.com\n001job.com\n001jp.com\n001kd.com\n001km.com\n001pp.com\n001pt.com\n001sj.net\n001tudou.com\n001u.com\n001u2.xin\n001wifi.com\n001win5.cc\n002.xin\n002049.com\n00257.com\n002574.com\n0028.xin\n002lzj.com\n0033.com\n00333118.com\n0037wan.com\n00394.net\n003caixukun.xin\n003store.com\n004.xin\n0044696.com\n004678.com\n004837963.xyz\n005.tv\n0056.com\n00563.com\n0058.com\n005854.xin\n00615.net\n00653.xin\n0066.com\n00665ba1f014ee0e.com\n00666.xin\n006shipin.org\n007.pub\n0073.com\n00772229.com\n00791.com\n007card.vip\n007gameapp10.com\n007manhua.com\n007shoes.com\n007swz.com\n007szx.com\n007yx.com\n008.bet\n00817.com\n00847.xin\n0086l.com\n0086org.com\n008n0l12145.xin\n008sport.com\n009.xin\n0098118.com\n009job.com\n009y.com\n00bx.com\n00cdn.com\n00cf.com\n00cha.com\n00cha.net\n00ef6bce51ccd47d.com\n00fkh408382.xin\n00hh.com\n00hzx.xin\n00i1xg5s3s.xin\n00ic.com\n00it.net\n00lfoo16454.xin\n00o5nm18258.xin\n00plri7b.xin\n00r9fexyub.xin\n00shu.com\n00shu.la\n00tera.com\n00tu.com\n00ukkgtc5.xin\n00ve1bg9.xin\n00wv.com\n00xu.com\n01-2--3.xin\n01-cf.com\n010.cc\n010123456.com\n010155.net\n0101cdn.com\n0101e.com\n0101game.online\n0101semi.com\n0101ssd.com\n010203.com\n010237.com\n01095113.com\n010b.com\n010bianhu.com\n010bjzs.com\n010cb.com\n010cns.com\n010dell.com\n010dh.com\n010dsmzyy.com\n010gaokao.com\n010huaer.com\n010huashi.com\n010jianzhan.com\n010lf.com\n010p.cc\n010shangpu.com\n010time.com\n010xiongdi.com\n010zaixian.com\n011.com\n011.xin\n011a4460e391a7f4.com\n0121.xin\n012233.com\n0123.xin\n0123401234.com\n0123456789.com\n0123f.xin\n0127.xin\n01291.xin\n01317.org\n01350.work\n0135135.com\n01368.com\n0138.com\n014.cc\n014.xin\n01401.com\n0142f5348f8cd094.com\n0143.xin\n014929.com\n014cbd7e810301.beer\n014esw24222.xin\n015.xin\n0158f80.com\n016.xin\n016sf.com\n018.xin\n018yun.xin\n019.xin\n019103.com\n01975cf969f20191.com\n019jb0sc.xin\n01a7d69861013.beer\n01be6bfabbd3024a.com\n01bzw.us\n01bzw.xyz\n01caijing.com\n01d55251a10241.beer\n01dou.com\n01f438bf710301.beer\n01ffa63e710261.beer\n01home.com\n01hour.com\n01hr.com\n01isp.com\n01isp.net\n01jinhua.com\n01jzw.com\n01ki.com\n01p.com\n01p6xc08451.xin\n01pxzw0737.xin\n01rv.com\n01skjj.com\n01studio.cc\n01teacher.com\n01wb.com\n01ww.xin\n01x13k30.xin\n01yo.com\n01yuanma.com\n01yun.com\n01zenith.net\n01zhuanche.com\n01zk.com\n01zph.com\n02-89910011.com\n020.com\n020.net\n0200.xin\n02000.xin\n02017.com\n0208.com\n020883.com\n020910.com\n020banjia.net\n020bdqn.net\n020gzjx.com\n020h.com\n020job.com\n020trvl.com\n020xue.com\n020ym.com\n020zp.net\n020ztc.com\n021-116114.com\n021.com\n021.net\n0214.com\n02156506666.net\n02163.com\n0217.xin\n021a5f9841009.beer\n021bolang.com\n021byb.com\n021dianyuan.com\n021dzjx.com\n021east.com\n021gjhb.com\n021huamei.com\n021huaying.com\n021images.com\n021images.vip\n021ja.com\n021jgyy.com\n021jingwei.com\n021kd.com\n021lawfirm.com\n021phone.com\n021ren.com\n021sports.com\n021tk.com\n021van.com\n021wfz.com\n021ye.com\n021yongzhuo.com\n021zhuang.com\n021zsb.com\n022003.com\n0222.xin\n0229.xin\n022china.com\n022meishu.com\n022s.com\n022shui.com\n022sunny.com\n022v.com\n023086.com\n023bc5v99h.xin\n023cj.com\n023cq.cc\n023dir.com\n023dns.com\n023fyy.com\n023gmdk.com\n023up.com\n023xfyy.com\n023xiaoyuan.com\n023yts.com\n023yy95.net\n023yynk.net\n023zhang.xin\n023zp.com\n02405.com\n024365.com\n0245.cc\n0245.net\n02456789.com\n0246b05e23a644b5.com\n024888.net\n024bj.com\n024eps.com\n024f9wrcm.xin\n024frde.com\n024fuchan.com\n024fuwu.com\n024heyi.com\n024hh.com\n024huada.com\n024jsq.com\n024zxw.com\n025.com\n025002.com\n02516.com\n025ct.com\n025kaiyi.com\n025nj.com\n025njtf.com\n025sc.com\n025tffs.com\n025tongfeng.com\n025tuanjian.com\n025tuopan.com\n025xl.com\n025zp.com\n0264032a252fcf53.com\n026hao.com\n026idc.com\n0270.cc\n027119.xin\n02712122.com\n02727.com\n02766667777.com\n0279.net\n027965888.net\n027accp.com\n027aige.com\n027ar51848.xin\n027art.com\n027chuxun.com\n027chwl.com\n027chx.com\n027cloud.com\n027dir.com\n027eat.com\n027hhl.com\n027hpedu.com\n027hpit.com\n027htxt.com\n027hxzy.com\n027hy.com\n027idc.com\n027jsxh.com\n027one.com\n027qjxh.com\n027qyy.com\n027tianlong.com\n027tytpf.com\n027wcbyy.com\n027yx.com\n027zb.com\n027zikao.com\n027zpw.com\n028-xhxgt.com\n0283home.com\n0289kh1448.xin\n028csc.com\n028desite.com\n028f.com\n028hema.com\n028kuaidai.com\n028ltzx.com\n028office.com\n028px.com\n028pxw.com\n028sh.com\n028sjkj.com\n028yyyy.com\n029200.com\n02924.com\n029558.com\n029900.com\n029gl.com\n029jiuda.com\n029judao.com\n029k.com\n029lvwo.com\n029shw.com\n029taihe.com\n029wsw.com\n029xxw.com\n029yjy.com\n029zp.com\n02b5c31e511032.beer\n02bjmbzoat.xin\n02d.com\n02fb56599d46ae7d.com\n02hm.com\n02kdid.com\n02lb.com\n02lu.com\n02shu.com\n02tf6d18201.xin\n02u21a0lka.xin\n02wan.com\n02wq.com\n02yc.com\n02z97426404.xin\n03.com\n030.xin\n030303.com\n030hag5r91.xin\n030mall.com\n030yo.xin\n0310it.com\n0311.cc\n031130.xyz\n03118888.com\n0311hd.com\n0311led.com\n0311wifi.com\n0315.center\n0316.cc\n0316366.com\n03167.com\n0316yun.com\n0320.work\n0321.xin\n03241119.xyz\n03256.xin\n0328.com\n032ab0b0a10292.beer\n033.com\n033033.com\n0333.xin\n03369709d10301.beer\n0349.xin\n035110000.com\n0351data.com\n0351fdc.com\n0352fang.com\n0354rcw.com\n0355fk.com\n0356.com\n0356f.com\n0357dc382faf80f5.com\n0357hz.com\n0359tv.com\n0368.com\n036yx.com\n0370-2221999.net\n0371jixie.com\n0371lianghao.com\n0371sou.com\n0371wang.com\n037398.com\n03770e40910272.beer\n0377auto.com\n0377ny.xin\n0378zz.com\n0379home.com\n0379wan.com\n037lcq08115.xin\n038d0addd10241.beer\n0391fc.com\n03964.com\n039r93jevs.xin\n03b2ef6fe1960045.com\n03bcyh2069.xin\n03cl.xin\n03cz8604316.xin\n03d882c8810271.beer\n03dq.com\n03f99b91610271.beer\n03fcw.com\n03fdcw.com\n03fugu.xin\n03k.org\n03m7pa17g.xin\n03ssif8zb.xin\n03supin.com\n03tc.com\n03u.com\n03wy.com\n03xs.com\n040.xin\n04052.xin\n04075k2xgr.com\n04085o08379.xin\n0411.com\n041101.com\n0411ct.com\n0411cxd.com\n0411e.com\n0411gh.com\n0411hd.com\n0411king.com\n0411xslvshi.com\n0411zssy.com\n0415123.com\n0416job.com\n041799.com\n0421wcbzk.com\n0427.com\n0429f95301011.beer\n0430.com\n0431cn.com\n0434.cc\n0437.com\n043j8118366.xin\n0444.xin\n0452e.com\n0453.com\n0453bc39456389ff.com\n0454.cc\n0455tv.com\n0455zd.com\n0456yun.com\n046.xin\n0460.com\n0470a.com\n0472.com\n04763.work\n0476vip.com\n048.xin\n0484.xin\n048o9ml5x3.xin\n049.com\n049.xin\n04a1to24453.xin\n04adca98c1022.beer\n04apr5bl.xin\n04be22jjkv.xin\n04c01e0ad4c891d7.com\n04db11e1ea504cf2.com\n04ip.com\n04l68n18142.xin\n04n1ns24180.xin\n04vfkt24311.xin\n05.gd\n050.xin\n0502.xin\n050400.com\n050504.xin\n0507c.xin\n0509.xin\n051058.com\n0510gcw.com\n0510gtgc.com\n0510syedu.com\n0510zyw.com\n0513.net\n0513.org\n0513011.com\n0513zs.com\n0514.com\n0514.net\n05148.cc\n0514gcw.com\n051591.com\n0515kf.com\n0515smw.com\n0515yc.com\n0515yy.com\n0516ds.com\n0516k.com\n0517.net\n0517cw.com\n0517man.com\n0517w.com\n0518home.com\n0518yy.com\n0523114.com\n05236.com\n052360.com\n0523bbs.net\n0523tx.net\n0523zp.com\n0523zz.com\n0527.xin\n05273.com\n0527zp.com\n0527zz.com\n05280.xin\n0529.xin\n052yx.com\n0531.com\n053135.com\n0531kt.com\n0531soso.com\n0531wt.com\n0532.com\n053217.com\n0532eu.com\n0533.net\n0534.com\n0534888.com\n0535-0411.com\n0535cp.com\n0535you.com\n05366196.com\n0536job.net\n0536qz.com\n0536weixin.com\n0537love.com\n0537ys.com\n0537yz.com\n0539fc.com\n053c.com\n0540.xin\n0543.xin\n0543bbs.com\n0543hr.com\n0544.xin\n054400.com\n0545.xin\n0546.xin\n0546fdc.com\n0549.xin\n0550.com\n055110.com\n055178.com\n0551wl.com\n0552jie.com\n0553zsw.com\n0554news.com\n0554qd.xin\n0554shdz.com\n0554zp.com\n0555fc.com\n0557100.com\n0558job.com\n0559hs.com\n0559jqdq.com\n055dq.xin\n0564abc.com\n0564shw.com\n0566job.com\n057.com\n057.xin\n0570fc.com\n0570zs.com\n057191.com\n0571crm.com\n0571gszc.com\n0571nh.com\n0571pu.com\n0571zp.com\n0572h.com\n0572home.com\n0572zpw.com\n0573fang.com\n0573ol.com\n0573ren.com\n0574bbs.com\n0574nbjg.com\n0575.host\n057555.com\n0575bbs.com\n0575jb.com\n0575life.com\n0575qs.com\n0575zhuji.com\n0576qq.com\n0577-it.com\n0577365.net\n0577cnw.com\n0577gyy.com\n0577home.net\n0577hr.com\n0577job.com\n0577qiche.com\n0578rencai.com\n05790.com\n0579818.com\n0579com.com\n0579fw.com\n057x.com\n05880a57e1022.beer\n058a2a0741016.beer\n058e001fc10251.beer\n058ed0543d61b235.com\n058idc.com\n05927.com\n0592dsw.com\n0592jj.com\n0592ui.com\n0592xl.com\n0594.com\n0594.work\n0594fake.com\n0594hyw.com\n0594sneaker.com\n0595.com\n0595a74c711012.beer\n0595job.com\n0595qz.com\n0595rc.com\n0596fc.com\n0597kk.com\n0597music.com\n0597ok.com\n0597seo.com\n0598777.com\n0598yu.com\n0599yx.com\n05bf51fa911012.beer\n05bq.com\n05by3k248.xin\n05cc8c4cc1023.beer\n05e44607310271.beer\n05idc.com\n05info.com\n05ja1g16464.xin\n05n2azbp.xin\n05p9uj1253.xin\n05rjxqsp5i.xin\n05sun.com\n05vauwva3.xin\n05vm.com\n05wan.com\n05wang.com\n05youxi.com\n060.xin\n0603.xin\n0605.com\n0609.com\n061.xin\n0616.xin\n0616a9dbe68fac9c.com\n0618.com\n0618.xin\n06192.com\n0623.xin\n062wfly8z.xin\n0631.xin\n063108.com\n0631rc.com\n0632.xin\n0632idc.com\n0633.xin\n0634.com\n0634.xin\n0635.com\n0635.xin\n06362.com\n064.xin\n065201.com\n065423cd010311.beer\n06555.com\n0660hf.com\n0663.net\n06639.xin\n0663job.com\n0666.xin\n0668.com\n06681.com\n0668gz.com\n067555.com\n06888.work\n068rolbmiz.xin\n069.xin\n0693f784d1023.beer\n06abc.com\n06b8ziwxjf.xin\n06climate.com\n06dc36591a49441c.com\n06ee1860c1015.beer\n06game.com\n06ik7744n.xin\n06ps.com\n06tn.com\n06z8mzlma.xin\n07.cc\n07.la\n070725.xyz\n07073.com\n07073h5.com\n07073vr.com\n0708.com\n0712f.com\n0712fang.com\n0714.com\n0714110.xin\n0715fc.com\n0715rc.com\n0715zp.com\n0716fw.com\n0716mr.com\n07177.com\n0718.cc\n0718qp.com\n0718xf.com\n072.xin\n0722fc.com\n0722zs.com\n0724c.com\n0725.com\n0728f.com\n0730188.com\n0730news.com\n073122.com\n0731777.com\n0731a.com\n0731cfw.com\n0731fdc.com\n0731hds.com\n0731i.com\n0731job.com\n0731mcw.com\n0731pgy.com\n0731tg.com\n0731wan.com\n0733news.com\n0734zpw.com\n0735.com\n07358.com\n0735jz.com\n0735zx.com\n0735zz.com\n0736fdc.com\n0736zp.com\n0736zz.com\n0738.cc\n0738rc.com\n073980.com\n0739qq.com\n0739tt.com\n073e5367a10292.beer\n073img.com\n073pic.com\n07430743.com\n0743fd8231024.beer\n0744114.com\n0744tv.com\n0746job.com\n0746news.com\n0750.xin\n0750rc.com\n0751.cc\n075238.com\n0752qc.com\n0753zz.com\n0755.net\n07551.com\n07551.net\n0755400.com\n075577777.com\n0755888.com\n0755910.com\n0755bdqn.com\n0755bzf.com\n0755caibao.com\n0755cts.com\n0755fm.com\n0755gty.com\n0755hao.com\n0755haoyu.com\n0755hj.com\n0755hz.com\n0755jz.net\n0755rc.com\n0755sszx.net\n0755yf.net\n0755zb.com\n0756fang.com\n0756idc.com\n0756tong.com\n0756zx.com\n0757fc.com\n0757info.com\n0757p.com\n0757rc.com\n0758net.com\n0759.pw\n0759home.com\n0759job.com\n0759k.com\n0759yc.com\n076.xin\n0760.com\n0760bw.com\n0760rc.com\n07629.org\n076299.com\n076299.net\n0762uu.com\n0763f.com\n076650.com\n07666.com\n0768000.com\n0769auto.com\n0769che.com\n0769king.xin\n0769net.com\n0769pf.com\n0769sun.com\n0769sx.com\n0769web.net\n0769yp.com\n076lvo.xyz\n076t0uhtl9.xin\n077.xin\n0771.com\n0771.tv\n07712008.com\n07715555555.com\n0771cts.com\n0771cyts.com\n0771fukang.com\n0771rc.com\n0772fang.com\n0772gcw.com\n0772job.com\n0772lou.com\n07743988888.com\n07752267777.com\n07754255555.com\n0775fcw.com\n0775jzw.com\n0775qc.com\n0775yzf.com\n0776.cool\n07761.com\n0776hr.com\n0779-2678999.com\n078.xin\n078079.com\n07890.com\n078bdd796e8b4b12.com\n07908.com\n0791abc.com\n0791br.com\n0791fuwu.com\n0791look.com\n0791qzw.com\n0792jj.net\n0792ju.com\n0792lsly.com\n0792u.com\n0793.tv\n07938.com\n0794zp.com\n0797122.com\n0797auto.com\n0797ayzp.com\n0797rs.com\n0797tuan.com\n0797zz.com\n0798.cc\n0799z.com\n079mxd.com\n07ba0de711020.beer\n07bmss01426.xin\n07cn.com\n07cn.net\n07e12xs2io.xin\n07f0798569af4d70.com\n07fe8668211012.beer\n07fea775dffd96d4.com\n07jfrv01301.xin\n07k6np0378.xin\n07kacm20339.xin\n07net01.com\n07ozikk8w3.xin\n07ren.com\n07sh.com\n07swz.com\n07u82t16391.xin\n07w97p18164.xin\n07zk7z26405.xin\n080.xin\n0800c988e1010.beer\n0801.xin\n0804.org\n080e068141ea500e.com\n081.com\n081.xin\n0813fs.com\n0817.net\n0817ch.com\n0817tv.com\n0818tuan.com\n0818tuangou.com\n082.xin\n0820.xin\n0827ug.com\n0830bbs.com\n0831.app\n0831home.com\n0832mh.com\n0835.com\n0835meiya.com\n0838.com\n0838che.com\n0839zp.com\n08424b74011032.beer\n0843d5944883e752.com\n085.com\n0852diaoyu.com\n0853rc.com\n0856st.com\n0857job.com\n0859job.com\n0859qp.com\n0859sy.com\n0860.xin\n086019.com\n08644.com\n0871aaa.com\n0873js.com\n0877zp.com\n0890.com\n08952.com\n0898.net\n089858.com\n0898888.com\n0898hq.com\n0898mmf.com\n0898uf.com\n089u.com\n08an.com\n08ar.com\n08b68dbbbf876114.com\n08c6.com\n08c8b537f1021.beer\n08c9f63d31021.beer\n08cms.com\n08fc8f0ee3f2768a.com\n08ky.com\n08px.com\n08qx.com\n08wojia.com\n08x1am20483.xin\n08zf.com\n0904.cool\n090901.xin\n090expo.com\n0912158.com\n0912app.com\n0912fdj.com\n0913ss.com\n0915531111.xin\n0916001.com\n0917.com\n0917888.com\n0917e.com\n0918f5dadde012c3.com\n0919123.com\n092394.com\n093.com\n0935e.com\n0937.cc\n0937.com\n0937.net\n0937js.com\n09388.xin\n0938edu.com\n0938net.com\n0939.net\n0939.xin\n093nd9.com\n094.xin\n0941.org\n09451.com\n0945a5ee91011.beer\n094j35.com\n095.xin\n095196555.com\n0951job.com\n09527.xin\n0952xh.com\n0959930d71015.beer\n096.xin\n0962xb24260.xin\n0963d9712a525457.com\n096663.com\n0972xxg.com\n0979.xin\n0990fc0011011.beer\n0991dj.com\n0991net.com\n0992.cc\n09928.xin\n09946.center\n09948.xin\n099913.com\n099b127ae166d8f1.com\n09aag016266.xin\n09b3045664731d42.com\n09c5062ea1020.beer\n09e12x16370.xin\n09ea354bd9542ba7.com\n09game.com\n09iatm1z.xin\n09lc5d12399.xin\n09mhncdop.xin\n09pay.xin\n09pj75gs09.xin\n09pzq024240.xin\n09rrqh7s62.xin\n09shijue.com\n09vvme1l.xin\n09xx5a24352.xin\n09z7wy3k.xin\n0a0fx7vz1l.xin\n0a2d.com\n0a2g5a04175.xin\n0a32mt201.xin\n0a64qa16273.xin\n0a6ri001390.xin\n0a8a112e8bb5045e.com\n0acrdtuhed.xin\n0ag8kg01470.xin\n0ape4t08268.xin\n0aq4hxqs.xin\n0ax2rjo3od.xin\n0axoa626262.xin\n0b145c21210e933c.com\n0b4xq91061.xin\n0b6e0659811021.beer\n0b8ky116130.xin\n0barrfplp.xin\n0bb261a6a46d766a.com\n0bb875c361022.beer\n0bbd0e535194e7f7.com\n0bddiq9a0q.xin\n0bdfe52341114.beer\n0bef0493410272.beer\n0bjasw18181.xin\n0bke7a16362.xin\n0bmfo404187.xin\n0bqa9826122.xin\n0bw82f20390.xin\n0bxed90150.xin\n0c3bjz070.xin\n0c449995810292.beer\n0c9a2959d10311.beer\n0c9b8639d1024.beer\n0car0.com\n0cname.com\n0cokid18352.xin\n0cq9hzrz.xin\n0cqpj504251.xin\n0d.work\n0d00.xin\n0d06e627dbe6654a.com\n0d263788316151cb.com\n0d3lnlkylu.xin\n0d49f571e1017.beer\n0daily.com\n0day.xin\n0ddvic16247.xin\n0de41y26132.xin\n0dian8.org\n0dm.com\n0dmhu412466.xin\n0dou490764.xin\n0dt83e18342.xin\n0du.net\n0du4br04412.xin\n0duw.com\n0duxs.com\n0dxkge0412.xin\n0e0c2e9e94622290.com\n0e38e883511032.beer\n0e706b6c62da3920.com\n0e76427381016.beer\n0e7o6216306.xin\n0easy.com\n0ecff3e99dce5b33.com\n0ee18d4c192243b3.com\n0efef58c41014.beer\n0efghij.com\n0egh661666.xin\n0eghje0112.xin\n0ek4sg08401.xin\n0emvvs04229.xin\n0en6hz2u.xin\n0ew4p6fb1.xin\n0f0lj908444.xin\n0f602h26461.xin\n0f63e6089d80dffe.com\n0fbcjwr4x2.xin\n0fbs03i1i.xin\n0fc45y3sbr.xin\n0fe5d43561011.beer\n0fe7e0a941011.beer\n0fep69v3.xin\n0fj5qx12422.xin\n0fl1j80347.xin\n0flnis04328.xin\n0fnkjai21b.xin\n0g13wzk4pj.xin\n0g1s.com\n0g5q5hrcbo.xin\n0g9l08zbsc.xin\n0ggt51agn0.xin\n0ggw7u16311.xin\n0gklqj5hal.xin\n0gmu6zwf87.xin\n0gouche.com\n0gps2ppnu9.xin\n0gtsz9jw.xin\n0gyyc924408.xin\n0h3lfj12415.xin\n0hbgmcs5gb.xin\n0he0.com\n0hgame.com\n0hl5ntdm0i.xin\n0hq7006r07.xin\n0hzxwa2471.xin\n0i-i0.com\n0i6js716143.xin\n0i71r4qg.xin\n0im9f31630.xin\n0iq8q8163.xin\n0iwgt324206.xin\n0j1oul247.xin\n0j3h9616299.xin\n0j4wdc8bs8.xin\n0j783008494.xin\n0jb520030.xin\n0jl3h724403.xin\n0k2u4didtd.xin\n0k6dm96.xin\n0ka.com\n0kdmutnc.xin\n0kee.com\n0kfq5e16254.xin\n0kkkkkt.com\n0km5ip01196.xin\n0kmny96j9gtb.xin\n0koxpnwfx.xin\n0krmre24376.xin\n0kt0nm0380.xin\n0l2nf218236.xin\n0l7mqk1284.xin\n0leb5s268.xin\n0lircg1235.xin\n0lw1ib2sa.xin\n0lzamwtu.xin\n0m7eaq04292.xin\n0m93wwr0.xin\n0mbvyf1437.xin\n0me14c18373.xin\n0mfbac1gsj.xin\n0mfqi124198.xin\n0mk9ht2449.xin\n0moju716460.xin\n0mrzee12192.xin\n0ms.one\n0ms65u0s8t.xin\n0mu4f8xw0k.xin\n0n469e12312.xin\n0n5hylf79s.xin\n0n663xtw.xin\n0nc13z04356.xin\n0nejoqlu3.xin\n0nelddmoha.xin\n0nk5dhsp.xin\n0nnk3nxyu3.xin\n0npkjexon.xin\n0nqxhrpw30.xin\n0nw2sq2622.xin\n0nzk4t3lrn.xin\n0o0o.xin\n0o1djo20199.xin\n0o6wqk24113.xin\n0o8lgn20118.xin\n0obhhr12439.xin\n0okm1a12139.xin\n0olgbi04133.xin\n0olut8.com\n0one.xin\n0oo70c26213.xin\n0or1h40327.xin\n0p21iz0729.xin\n0p2wrugphn.xin\n0p4ips24224.xin\n0p5i7dxr6y.xin\n0p901yay.xin\n0plpxp1898.xin\n0poho720169.xin\n0ptf4g04404.xin\n0pxrom71q8.xin\n0q5stv04123.xin\n0q9y3z18365.xin\n0qd9dnzon9.xin\n0qm88r0891.xin\n0qqczcn8l8.xin\n0r8ag0y7di.xin\n0range5.xin\n0rg.xin\n0rgojh0146.xin\n0rgu7ha3p.xin\n0rl.cc\n0rljmz01274.xin\n0rz.ltd\n0s73o26p67.com\n0s8s.com\n0sm.com\n0snd.cc\n0u.com\n0voice.com\n0x3.com\n0x3.me\n0x5.me\n0x6.me\n0x7.me\n0x9.me\n0xaa55.com\n0xff000000.com\n0xffffff.org\n0xiao.com\n0xjqlun2.work\n0xsky.com\n0xue.com\n0z.gs\n0zn5mg.asia\n1-123.com\n1-b.tc\n1-cs.net\n1-du.net\n1-luxury.com\n1-yuan.net\n1.biz\n1.cc\n100-tong.com\n100.com\n100.me\n100.travel\n10000.com\n100000w.com\n10000gd.tech\n10000idc.net\n10000job.com\n10000link.com\n10000post.com\n10000shequ.com\n10000tc.com\n10000yao.com\n10001wan.com\n100024.xyz\n1000360.com\n10006.info\n1000coco.com\n1000fun.com\n1000my.com\n1000phone.com\n1000phone.net\n1000plan.org\n1000qm.vip\n1000qs.com\n1000su.com\n1000thinktank.com\n1000tuan.com\n1000uc.com\n1000xuexi.com\n1000xun.com\n1000zhu.com\n10010.com\n10010.net\n10010.team\n10010400.net\n10010hb.net\n10010js.com\n10010ll.com\n10010nm.com\n1001g.com\n1001hw.com\n1001p.com\n100248.com\n10034.com\n100520.com\n100580.com\n100669.com\n1008011.com\n1008120.com\n10086.com\n10086.games\n10086.world\n1008656.com\n1008691.com\n10086kuaixiu.com\n100allin.com\n100alpha.com\n100ask.net\n100ask.org\n100audio.com\n100baisui.com\n100bt.com\n100chou.com\n100chui.com\n100cjc.com\n100credit.com\n100cup.com\n100d3.com\n100data.com\n100du.com\n100e.com\n100eby.com\n100eshu.com\n100exam.com\n100fang.com\n100font.com\n100guoji.com\n100hsl.com\n100incense.com\n100inn.cc\n100intlschool.com\n100ip.net\n100jg.com\n100jiapu.com\n100kk.com\n100ksw.com\n100lake.com\n100lbj.com\n100legend.com\n100loujia.com\n100market.net\n100md.com\n100mian.com\n100mmedia.net\n100nets.com\n100njz.com\n100nong.com\n100offer.com\n100old.com\n100pd.com\n100pei.com\n100ppi.com\n100puzzles.com\n100qu.net\n100run.com\n100shop.com\n100shuai.com\n100skin.com\n100stone.com\n100sucai.com\n100szy.com\n100t.com\n100tal.com\n100te.com\n100tiao1.net\n100tmt.com\n100tone.com\n100top1.com\n100try.com\n100tv.com\n100txy.com\n100vr.com\n100wa.com\n100web.store\n100weidu.com\n100wen.com\n100wsanguo.com\n100xgj.com\n100xhs.com\n100xiao.com\n100xin.com\n100xuexi.com\n100yangsheng.com\n100ycdn.com\n100ye.com\n100ye.net\n100yigui.com\n100yingcai.com\n100yiyao.net\n100zd.com\n100zhuang.com\n100zp.com\n101.com\n10100.com\n10100000.com\n10101111.com\n10101111cdn.com\n1010gamer.com\n1010jiajiao.com\n1010jz.com\n1010pic.com\n1010sh.com\n1010t.com\n101505.com\n10155.com\n1015600.com\n10185.com\n101hair.com\n101hr.com\n101jiajiao.com\n101weiqi.com\n1024.ink\n1024fuli.com\n1024g.com\n1024ie.com\n1024nic.com\n1024ss.com\n1024tools.com\n1024wl.com\n1024zx.com\n1026jz.com\n10284.com\n102no.com\n102pay.com\n103153.com\n10333.com\n10349.com\n10479.org\n1050qm.com\n105mr.com\n10625fffd42119ce.com\n10639888.com\n1065m.com\n10666114.net\n1073.com\n107788.com\n1088hg41.com\n108addf0811012.beer\n108ai.com\n108mir.com\n108pk.com\n108qi.com\n108sq.com\n108tian.com\n109.com\n109360.com\n10966.net\n109876543210.com\n109ya.com\n10bests.com\n10c5a16c51015.beer\n10de7e1f17f512b2.com\n10ec4a74b10281.beer\n10fang.com\n10gjkj.com\n10gt.com\n10guoying.com\n10huan.com\n10idc.com\n10isp.com\n10moons.com\n10pkpk.com\n10qq.com\n10r1.com\n10s1.com\n10sea.com\n10soo.com\n10tianqi.com\n10urzr3jk.icu\n10vps.com\n10yan.com\n110.com\n11000011.com\n1108cd985e95ad39.com\n110ask.com\n110clwz.com\n110disk.net\n110route.com\n110tm.com\n111.com\n111111111.com\n1111lm.com\n111237.com\n1113.cc\n1114.com\n11159.com\n11160066.com\n1116fad134.info\n1116fad135.info\n1116fad158.info\n1116fad167.info\n1116fad176.info\n11172222.com\n111867.com\n111com.net\n111wo.com\n111yao.com\n111zyw.com\n112112.com\n112192.com\n1122.com\n11222.com\n112682.com\n1128job.com\n112998.xyz\n112seo.com\n112wan.com\n11315.com\n1133.cc\n11343.com\n113989.com\n113dh.com\n113ya.com\n114-91.com\n1145858.com\n11467.com\n11478.com\n114837322.xyz\n114auto.com\n114best.com\n114blog.com\n114cbd.com\n114chn.com\n114db.com\n114dev.com\n114dg.com\n114dns.com\n114dns.net\n114dnss.com\n114gh.com\n114guoshu.com\n114hyw.com\n114hzw.com\n114ic.com\n114ic.net\n114jcw.com\n114menhu.com\n114mo.com\n114my.com\n114my.net\n114naliyou.com\n114oc.com\n114photo.com\n114piaowu.com\n114pinpai.com\n114qy.com\n114s.com\n114sf.com\n114shouji.com\n114study.com\n114ttg.com\n114ups.com\n114yygh.com\n114zhibo.com\n114zpw.com\n114zw.org\n115.com\n115155.xyz\n1156.com\n1156dns.com\n115800.com\n115cdn.com\n115cdn.de\n115cdn.net\n115cloud.com\n115cloud.net\n115img.com\n115meta.com\n115vod.com\n115wg.com\n115zb.com\n1163.com\n1166.com\n1168.tv\n11684.com\n116968.com\n116cd.com\n116cd.net\n116daohang.com\n116kj.com\n116yx.com\n11714ae0b1014.beer\n117915.com\n117a6af992d4208e.com\n117trip.com\n117y.com\n1181.com\n118114.net\n118360.com\n1188.com\n1188fc.com\n118cy.com\n118inns.com\n118jm.com\n118pan.com\n118ttc.com\n118wa.com\n1190119.com\n119120.org\n11951.com\n11992169.xyz\n119958.com\n119bid.com\n119lora.com\n119tx.com\n119you.com\n11bao.com\n11bz.com\n11cda806e11012.beer\n11cdn.cc\n11dmh.com\n11dns.com\n11fdj.com\n11fldxn.com\n11flow.com\n11g.com\n11gai.com\n11h5.com\n11haoka.com\n11job.com\n11job.net\n11ka.com\n11lx.com\n11meigui.com\n11pdf.com\n11player.com\n11rain.com\n11slotvip.cc\n11space.com\n11sun.com\n11wow.com\n11xotn7p.com\n11yinyuan.com\n11zhang.com\n120.net\n1204cm.com\n120918.com\n120ask.com\n120askimages.com\n120bid.com\n120btc.com\n120cihui.com\n120fd.com\n120it.com\n120jg.com\n120jhccz.com\n120jinyi.com\n120jxxh.com\n120kid.com\n120kq.com\n120naotan.com\n120scp.com\n120sg.com\n120shgc.com\n120spd.com\n120sun.com\n120top.com\n120x.net\n120ym.com\n121121.net\n12114rc.com\n1212.com\n12120.net\n12123.com\n121314.com\n121588.com\n121ask.com\n121down.com\n121ghs.com\n121mai.com\n121mu.com\n121wty.com\n122521.com\n12260808.xyz\n12272.vip\n1228xbdz7m.cfd\n12291.com\n122bid.com\n122c3e52810272.beer\n122cha.com\n122cn.net\n122law.com\n122w.net\n123-789.com\n123.cc\n12301.cc\n1230539.com\n12306.com\n12306bypass.com\n12308.com\n12308com.com\n1230t.com\n123123.net\n12315.com\n12316cn.com\n12317.com\n12317wan.com\n1231818.com\n12322app.com\n123242.com\n123245.com\n123254.com\n123294.com\n123295.com\n123326.com\n12333.com\n12333.org\n12333si.com\n12333tc.com\n123366.xyz\n1233dns.com\n1234.me\n12341288.com\n1234567.com\n123456edu.com\n123456wz.com\n12345b.com\n12345good.com\n12345good.net\n12348.net\n12349.net\n1234biao.com\n1234i.com\n1234n.com\n1234sy.com\n1234wu.com\n1234wu.net\n1234ye.com\n1234yes.com\n12354.com\n12355.net\n123624.com\n123635.com\n123641.com\n123652.com\n12365auto.com\n12366.com\n12366.net\n12366cn.com\n123684.com\n12369zb.com\n123773.com\n123842.com\n123860.com\n123865.com\n123888222.com\n123912.com\n123952.com\n123957.com\n123aa.com\n123aoe.com\n123baofeng.com\n123bo.com\n123boligang.com\n123du.cc\n123ems.com\n123fc.com\n123fh.com\n123haitao.com\n123haiwai.com\n123hala.com\n123hao.com\n123hdp.com\n123huaiyun.com\n123juzi.com\n123juzi.net\n123kanfang.com\n123langlang.com\n123lm.com\n123meiyan.com\n123menpiao.com\n123nice.net\n123ox.com\n123pan.com\n123panpay.com\n123pans.com\n123qibu.com\n123qy.com\n123shopee.com\n123si.org\n123slg.com\n123ths.com\n123u.com\n123v.net\n123webgame.com\n123wk.com\n123xfw.com\n123xueshu.com\n123yiche.com\n123ypw.com\n123yx.com\n124866.xyz\n125.la\n125180.com\n12530.com\n12533.com\n1256789.xyz\n12580.com\n12580.tv\n12580life.com\n12590d0ff10272.beer\n125cn.net\n125edu.com\n125job.com\n125p.com\n125school.com\n125visa.com\n125y.com\n125yan.com\n126.com\n126.fm\n126.net\n126blog.com\n126disk.com\n126doc.com\n126job.net\n126qiye.com\n127.com\n127.net\n1278721.com\n127xx.com\n127z.com\n128456.com\n1288.tv\n12880.com\n128d3a16610271.beer\n128qd.com\n128sy.com\n128uu.com\n12988.net\n129t.com\n12dzx.com\n12e6824e11013.beer\n12ef916d92d482fa.com\n12gang.com\n12h5.com\n12ha.com\n12kanshu.com\n12ketang.com\n12ky.com\n12miao.com\n12pk.com\n12sporting.com\n12yao.com\n12ym.com\n13.gs\n130.org\n130014.xyz\n130158.com\n131.com\n13100455400.com\n13112.com\n1312.vip\n13124.com\n13131313131.com\n1314.io\n1314520sz.com\n1314gl.com\n1314h.com\n1314study.com\n1314tkd.com\n1314wallet.com\n1314zf.com\n1314zhilv.com\n131cc.com\n1322.com\n13233.org\n132lawyer.com\n1330.net\n1332vp.com\n133300.com\n13377608388.com\n13384.com\n133998.com\n133u.com\n13482896776.com\n1350135.com\n135031.com\n135139.net\n135309.com\n135650.com\n13567.com\n1356789.com\n1357vip.com\n135958.com\n135995.com\n135bianjiqi.com\n135e.com\n135editor.com\n135edu.com\n135plat.com\n135yuedu.com\n136.com\n1360.com\n136136.com\n1362-rfwi.cc\n13636.com\n1366.com\n13667703999.com\n136bet.app\n136fc.com\n136hr.com\n136pic.com\n13707.net\n137139.com\n13720.com\n13726936178.com\n137365.com\n1374.com\n1377.com\n13793085458.com\n13793277711.com\n137home.com\n137y.com\n138.net\n13800.net\n13800100.co\n13800100.com\n1380898.com\n138379.com\n138gzs.com\n138job.com\n138pet.com\n138top.com\n138vps.com\n139.com\n139000.com\n13901559172.com\n1391.com\n13910.com\n139130.com\n139135.com\n1392189.com\n13937180868.com\n13980.com\n1399vip.com\n139cm.com\n139ee.com\n139erp.com\n139game.com\n139game.net\n139play.com\n139shop.com\n139talk.com\n139wanke.com\n139y.com\n139zhuti.com\n13a.com\n13c283b0710281.beer\n13cr.com\n13e7.com\n13ejob.com\n13freight.com\n13gm.com\n13jue.com\n13lm.com\n13q19b8wgb.com\n13qh.com\n13s.co\n13th.tech\n13ww.net\n13xiaoshuo.com\n13yx.com\n140414.com\n1404c4ce1d63a0d7.com\n1415926.com\n1415926.mobi\n141799c86c1ba267.com\n142857.red\n14294.com\n143614.xyz\n14498.com\n1451cn.com\n14565cabd1011.beer\n146368.com\n14776ac8e1022.beer\n147seo.com\n148-law.com\n1488.com\n148com.com\n148la.com\n14944.net\n14f99ce2609c0071.com\n14hj.com\n14play.net\n14xd.com\n14ygame.com\n150100.com\n150170.com\n1503.net\n150ce9517a529b73.com\n150cn.com\n151.hk\n1510game.com\n15111223344.com\n15140.com\n1515.website\n15153.com\n15166.com\n151733.com\n1518.com\n151m.net\n151rs.com\n151top.com\n151web.com\n15201.com\n15211223344.com\n152500.com\n1527ego.com\n153.com\n15311223344.com\n153332.xyz\n153g.net\n15426.org\n15440.org\n1545ts.com\n155.com\n155155155.xyz\n1556.net\n1559.com\n155idc.com\n156186.com\n156669.com\n156pay.com\n157110.com\n157300.net\n157seo.com\n158566.com\n1588.tv\n158c.com\n158wf.com\n159.com\n15982.com\n159shouji.com\n15beipk.com\n15bl.com\n15gg.com\n15gift.com\n15hr.com\n15hr.net\n15job.com\n15kuaixiu.com\n15lu.com\n15ms.com\n15scsc.com\n15sn.com\n15tianqi.com\n15tqw.com\n15wkd6i45lq3.com\n15xdd.com\n15yl.com\n15yunmall.com\n160.com\n1606c348011042.beer\n160c7443c1019.beer\n160dyf.com\n160job.com\n160yx.com\n16109.com\n161580.com\n1616.net\n16163.com\n1616n.com\n16177.net\n1617k.com\n1618.com\n1626.com\n163.cm\n163.com\n163.fm\n163.gg\n163.link\n163.lu\n163.net\n163110.com\n1633.com\n1633.store\n1633d.com\n163501.xyz\n163663.com\n1637.com\n163888.net\n1639f577b1022.beer\n163adl.com\n163cdn.com\n163cms.com\n163cn.link\n163cn.tv\n163cp.com\n163cs.com\n163fen.com\n163guangdong.com\n163guoqi.com\n163gz.com\n163henan.com\n163hot.net\n163hubei.com\n163hunan.com\n163img.com\n163jiasu.com\n163k.cc\n163k.com\n163kada.com\n163lady.com\n163liao.com\n163mail.cc\n163mail.com\n163mail.net\n163nos.com\n163ns.com\n163pinglun.com\n163py.com\n163qb.com\n163qikanlunwen.com\n163qiyukf.com\n163wh.com\n163yu.com\n163yun.com\n164580.com\n16466.com\n165123.com\n16537.ru\n16587.com\n165image.com\n165image.vip\n165tchuang.com\n165zhuji.com\n166.com\n166.net\n16612.cc\n166161.com\n166511.com\n1665213d91017.beer\n1666.com\n1668.net\n1668hk.com\n166cai.com\n166cdn.com\n166dns.com\n16757.com\n16768.com\n168-hx.com\n16816.com\n168267xz.com\n168338.com\n16835.com\n16838.com\n1686888.com\n1688.com\n16885.com\n16886000.com\n168866.com\n16888.com\n1688988.com\n1688b2b.com\n1688du.com\n1688e.com\n1688eric.com\n1688la.com\n1688lucky.com\n1688ru.com\n1688s.com\n1688tsw.com\n1688zhuce.com\n16899168.com\n168ad.cc\n168auto.com\n168chaogu.com\n168dc.com\n168dmj.com\n168dns.com\n168hs.com\n168job.com\n168kaifu.com\n168kk.com\n168kn.com\n168lyq.com\n168mlj.com\n168moliao.com\n168rcw.com\n168tea.com\n168tex.com\n168trucker.com\n168xiezi.com\n168zcw.com\n169.com\n169163.com\n16925500.xyz\n169369.com\n16949pcb.com\n1696.com\n169666.xyz\n169700.com\n16988.com\n16999.com\n169it.com\n169jk.com\n169ol.com\n16app.tv\n16boke.com\n16bus.net\n16buzhi.com\n16c1.com\n16ceshi.com\n16ds.com\n16fan.com\n16fc0df828e1570e.com\n16first.com\n16game.net\n16hyt.com\n16kang.com\n16ker.com\n16lao.com\n16map.com\n16p.com\n16pic.com\n16rd.com\n16sucai.com\n16type.com\n16tz.com\n16wl.cc\n16xx8.com\n17.com\n170.com\n170066.com\n17025.org\n170601.xyz\n17083731a1019.beer\n170hi.com\n170mv.com\n170tao.com\n170yy.com\n171026.com\n17167.com\n17173-inc.com\n17173.com\n17173.net\n17173cdn.com\n17173gc.com\n17173ie.com\n17173v.com\n17173vr.com\n17173vr.net\n17173yx.com\n17178.com\n1717pk.com\n1718china.com\n1718world.com\n171tax.com\n171win.net\n17207.com\n17293879b10261.beer\n172haoka.vip\n172l.com\n172mix.com\n172tt.com\n172xiaoyuan.com\n173.com\n173.hk\n173.tv\n1732.com\n1732.net\n17345.com\n17350.com\n17351.com\n17365h5.com\n1739705934745550.com\n173cs.com\n173eg.com\n173fahao.com\n173fc.com\n173fh.com\n173funny.com\n173ie.com\n173ie.net\n173kan.com\n173kw.com\n173kz.com\n173on.com\n173shouyou.com\n173shouyou.net\n173sy.com\n173tuku.com\n173uu.com\n173yeyou.com\n173yeyou.net\n173zb.com\n173zy.com\n1744.cc\n17495.com\n175045d8e62848be.com\n1755.com\n17566.com\n1758.com\n175aa.com\n175bar.com\n175cinemas.com\n175club.com\n175game.com\n175ha.com\n175hd.com\n175kh.com\n175pt.com\n175pt.net\n175sf.com\n175wan.com\n175yo.com\n17666.mobi\n1766bbs.com\n17673.com\n1768.com\n176quan.com\n176web.net\n1773.com\n1778.com\n177xfb.com\n178.com\n178.net\n178198.com\n178448.com\n1787.ink\n178768.com\n178800.cc\n178871.xyz\n17888.com\n178du.com\n178gg.com\n178hui.com\n178linux.com\n178rw.com\n178yy.com\n178zhaopin.com\n179.com\n179179.com\n1797.cc\n1797wan.com\n17986.net\n17989.com\n179cy.com\n179e.com\n17admob.com\n17ai.me\n17aifun.com\n17b.net\n17bang.ren\n17bdc.com\n17beijiang.com\n17bianji.com\n17biao.com\n17bigu.com\n17biying.net\n17bt.com\n17byh.com\n17c13ae4a36b8862.com\n17c8d205dbcbc534.com\n17cdn.com\n17ce.com\n17chacha.com\n17chdd.com\n17cma.com\n17coding.info\n17d.co\n17dao.com\n17dap.com\n17dawan.com\n17dc.com\n17ditu.com\n17dm.com\n17donor.com\n17dp.com\n17duu.com\n17emarketing.com\n17et.com\n17ex.com\n17f.co\n17fandai.com\n17fee.com\n17feia.com\n17fengguo.com\n17fengyou.com\n17fifa.com\n17font.com\n17foreign.com\n17forex.com\n17fpv.com\n17g.com\n17game.com\n17gaoda.com\n17getfun.com\n17golang.com\n17gouwuba.com\n17guagua.com\n17gwx.com\n17haibao.com\n17hc.com\n17house.com\n17hpl.com\n17huahua.com\n17huang.com\n17huayuan.com\n17huo.com\n17huodong.com\n17ic.com\n17itou.com\n17ivr.com\n17jc.net\n17jiaoyu.com\n17jiedu.org\n17jita.com\n17jzt.com\n17k.com\n17kan.cc\n17kgk.com\n17kjs.com\n17koko.com\n17kouyu.com\n17kqh.com\n17kss.com\n17kuxun.com\n17kxgame.com\n17kzy.com\n17lai.site\n17lele.net\n17lewan.net\n17lht.com\n17liuxue.com\n17ll.com\n17look.com\n17m3.com\n17meb.com\n17meiwen.com\n17mqw.com\n17ms.com\n17neo.com\n17oh.com\n17ok.com\n17only.net\n17p.co\n17p2mz326p.world\n17pa.com\n17palyba.com\n17popo.com\n17pr.com\n17pw.com\n17python.com\n17qcc.com\n17qiche.com\n17qiqu.com\n17qread.com\n17qzx.com\n17rd.com\n17rd.net\n17read.com\n17relax.com\n17roco.com\n17sfc.com\n17shanyuan.com\n17shenqi.com\n17smart.net\n17sort.com\n17startup.com\n17sucai.com\n17suzao.com\n17swan.com\n17syi.com\n17sysj.com\n17t.co\n17tanwan.com\n17taoca.com\n17taotaoa.com\n17taotaob.com\n17taotaoba.com\n17taotaoc.com\n17tcw.com\n17tigan.com\n17tiku.com\n17toushi.com\n17track.net\n17ttt.com\n17tx.com\n17u.com\n17u.net\n17u1u.com\n17u7.com\n17ugo.com\n17uhui.com\n17uhui.net\n17uoo.com\n17usoft.com\n17usoft.net\n17utt.com\n17uxi.com\n17v5.com\n17van.com\n17vin.com\n17vsell.com\n17wan7.com\n17wanba.com\n17wangdan.com\n17wansf.com\n17wanxiao.com\n17wclass.com\n17weike.com\n17wendao.com\n17whz.com\n17win.com\n17ww.cc\n17xianwan.com\n17xing.com\n17xsj.com\n17xueaoshu.com\n17xueba.com\n17xueshe.com\n17xuexi.com\n17xxl.com\n17xxw.com\n17y.com\n17ya.com\n17yaoqu.com\n17ym.org\n17you.com\n17yund.com\n17yunlian.net\n17yunzhijiao.com\n17yunzhijiao.net\n17yy.com\n17zhiliao.com\n17zhuangxiu.com\n17ziti.com\n17zjh.com\n17zub.com\n17zuoye.com\n17zuoye.net\n17zuqiu.com\n17zwd.com\n17zyxy.com\n17zyxy.net\n18.cm\n18000000001.com\n18023.com\n18095.com\n18095.work\n180disk.com\n180qt.com\n180yy.com\n1811d2af81022.beer\n181709bd610271.beer\n18176631811.com\n18183.com\n18183g.com\n18183sf.com\n181855.com\n1818hm.com\n181b5f7e71011.beer\n181ps.com\n181ue.com\n18251.org\n18263.vip\n182682.xyz\n182yg.org\n18318.com\n18375.com\n183me.com\n183post.com\n183read.cc\n183read.com\n1845p3hr95.com\n18488.com\n185185.com\n1857qc.net\n185c72b7d750569a.com\n1860sf.com\n1866.tv\n18665348887.com\n186688.com\n18713d3521023.beer\n1872001.com\n1873game.com\n1874.cool\n18778450600.com\n187997.com\n188.com\n188.net\n188.vip\n188158.com\n188187.xyz\n188188.org\n18837331771.com\n18856.com\n188628.com\n1888.com.mo\n18888.com\n188api.com\n188bifen.com\n188bio.com\n188hi.com\n188lanxi.com\n188mb.com\n188pi.com\n188soft.com\n188wan.com\n188yd.com\n189002.com\n1892139.com\n18937777777.com\n18999666.xyz\n189cha.com\n189che.com\n189cube.com\n189ebuy.com\n189jxt.com\n189read.com\n189sec.com\n189smarthome.com\n189store.com\n189works.com\n189young.com\n18aa28dfd1020.beer\n18art.art\n18av.com\n18d9535531011.beer\n18dao.info\n18daxue.com\n18db5cd8710292.beer\n18dx.com\n18fd54f1b1114.beer\n18fzl.com\n18guanjia.com\n18imall.com\n18inet.com\n18ishop.com\n18istore.com\n18join.com\n18juyou.com\n18l.net\n18ladys.com\n18link.com\n18ph.com\n18q.co\n18qh.com\n18qiang.com\n18qingqu.com\n18snf.com\n18touch.com\n18wk.com\n18yl.com\n18zhongyao.com\n18zhuanqian.com\n18zn.com\n18zp.com\n18zw.com\n19.com\n190.vip\n1900.live\n19000yy.com\n1900m.com\n1903beer.com\n1903it.com\n1904bus.com\n1905.com\n190757.com\n190cai.com\n19196.com\n19197a01ee502e4c.com\n1919game.net\n191game.com\n192ly.com\n192sm.com\n1931.com\n1934xjzy.com\n1937china.com\n1937cn.com\n1937nanjing.org\n193839.com\n193sihu.com\n194610.xyz\n1947.cc\n1949idc.com\n194nb.com\n195155.com\n195268032591463.icu\n195idc.com\n196b7adb23969e39.com\n196g.com\n196r.gg\n197.cc\n197.com\n197232.vip\n197784.com\n197854.com\n19789.com\n197924.com\n19799.com\n198358.com\n19840423.com\n198434.com\n198503.xyz\n198526.com\n1985cd.com\n1985qg.com\n19869.com\n1987619.com\n1987cn.com\n1987yp.com\n1988.tv\n19888.tv\n198game.com\n198game.net\n1990i.com\n199238.vip\n1993sc.com\n199508.com\n199604.com\n1997sty.com\n1998mall.com\n1998n.com\n1998r.com\n1999year.com\n199it.com\n199u2.com\n199yt.com\n19adulttoys.shop\n19c8.com\n19call.com\n19call.net\n19cntv.com\n19d1341dfd0a74d4.com\n19ed5ce761013.beer\n19lou.com\n19mini.com\n19mro.com\n19pay.net\n19ued.com\n19where.com\n19x19.com\n19yxw.com\n19zhan.com\n1a22.com\n1a4a282fe1010.beer\n1aa071e45acb08d2.com\n1aab715d01015.beer\n1ac6404321019.beer\n1afaecefe1014.beer\n1amen.com\n1ang.com\n1aq.com\n1auto.net\n1b0dbdb5310311.beer\n1b0y8tocaz24.com\n1b17.com\n1b1tech.com\n1b22e3a337fe5542.com\n1b3e11b2e88c6129.com\n1baf107ed1014.beer\n1boshu1.com\n1browser.net\n1bus.net\n1c0d1n1f0l1y.cc\n1c38.com\n1c767ba9310272.beer\n1c96b435fa52e4bf.com\n1cae.com\n1caifu.com\n1caitong.com\n1card1.com\n1cdakj.com\n1cent.xyz\n1checker.com\n1chong.com\n1cloudsp.com\n1cnmedia.com\n1cno.com\n1d0b8b3d1800debe.com\n1d1d100.com\n1d21653941c21219.com\n1d9z.com\n1dao99.com\n1date1cake.com\n1dcbzuv.com\n1dcdp4.com\n1de6de84b1017.beer\n1der-ad.com\n1diaocha.com\n1diary.me\n1drv.ws\n1e44f70c510272.beer\n1e9d98e731024.beer\n1ed3277798d157ac.com\n1f11.com\n1f1bc1d5310272.beer\n1f371be461017.beer\n1f6cd3ca611032.beer\n1f71060e75b35349.com\n1fangchan.com\n1fenlei.com\n1flash.net\n1foo.com\n1fooai.com\n1g31.com\n1gaifang.com\n1gbru.com\n1gcat.com\n1gdoutian.com\n1gesem.com\n1ggame.com\n1gow.net\n1haigtm.com\n1haitao.com\n1hangye.com\n1haogu.com\n1haosuo.com\n1hkt.com\n1hourlife.com\n1hshop.com\n1huamu.com\n1huizhan.com\n1hwz.com\n1ij6ut.com\n1iptv.com\n1j1x.com\n1jbest.com\n1jiesong.com\n1jkbie336689.com\n1ju.com\n1juhao.com\n1juzi.com\n1k100.com\n1k2k.com\n1ka123.com\n1kapp.com\n1kcx.hk\n1ke.net\n1kic.com\n1kkk.com\n1kmxc.com\n1kuang.com\n1kx.me\n1kxun.com\n1kyx.com\n1l1.cc\n1lan.tv\n1law.vip\n1liantu.com\n1ljx.com\n1look.tv\n1lou.com\n1lzs.com\n1m.net\n1m3d.com\n1m85.com\n1mall.com\n1maoshua.com\n1mdoutian.com\n1menjin.com\n1mfg.com\n1miba.com\n1mishu.com\n1mit.com\n1mjz.com\n1mmbie336689.com\n1mmed.com\n1more.com\n1mpi.com\n1ms.run\n1mushroom.com\n1mutian.com\n1mxian.com\n1n1v97c96h.com\n1nami.com\n1nfinite.ai\n1nmob.com\n1nongjing.com\n1note.life\n1nyz.com\n1o1o.xyz\n1o26.com\n1paibao.net\n1plas.com\n1pm2.com\n1ppt.com\n1pxs.com\n1q2q.com\n1qfa.com\n1qia.com\n1qianbao.com\n1qianbao.net\n1qirun.com\n1qishu.com\n1qit.com\n1qsf.com\n1qwe3r.com\n1r1g.com\n1renshi.com\n1rtb.com\n1rtb.net\n1safety.cc\n1sapp.com\n1shangbiao.com\n1shoucang.com\n1sj.tv\n1skp.com\n1smart.org\n1sohu.com\n1speaking.com\n1st56.com\n1stacks.net\n1stchip.com\n1styan.com\n1szq.com\n1t.gs\n1t1t.com\n1tai.com\n1tdw.com\n1textile.com\n1ting.com\n1tjob.com\n1tong.com\n1toon.com\n1tu-design.com\n1tu.com\n1tuikem.com\n1uo9djbnsr.com\n1uuc.com\n1wang.com\n1x3x.com\n1xbet88.com\n1xinzulin.com\n1xlala.cc\n1xmb.com\n1y.com\n1y0g.com\n1y2y.com\n1yabc.com\n1yangai.com\n1yaoda.com\n1yb.co\n1ycdn.com\n1yd.me\n1ydt.com\n1yinian.com\n1ysh.com\n1ytao.com\n1yunhui.com\n1yyg.com\n1zhangdan.com\n1zhanshou.com\n1zhao.org\n1zhe.com\n1zhengji.com\n1zhixue.com\n1zj.com\n1zjob.com\n1zu.com\n2-33.com\n2-class.com\n2-mm.net\n2.biz\n20001104.com\n2000200.com\n200022.xyz\n2000888.com\n2000dns.com\n2000new.com\n2000y.net\n20021002.xyz\n200218.com\n2003996ab2b800ac.com\n2003n.cc\n2003n.com\n2005net.net\n2006q.com\n20087.com\n2008php.com\n2008red.com\n2008zwe.com\n20091222.com\n200call.com\n200rtu04.bar\n200wan.com\n200y.com\n200zi.com\n201061.com\n201201.com\n2012jh.com\n20130123.com\n201314520.net\n2014.mobi\n20150.net\n201551.com\n2016os.com\n2016ruanwen.com\n2016win10.com\n20170228.com\n20171117.com\n2017338.com\n20174555.com\n20188.com\n2018zjjly.com\n20191209.xyz\n2019cdac.com\n201g.com\n202014.xyz\n202030.com\n2022.work\n202271.xyz\n2022cdnpl.com\n2023.com\n2023game.com\n2024qq.com\n2025.net\n202m.com\n202wan.com\n203328.com\n2048ai.net\n2048sj.com\n2049baby.com\n204cloud.com\n2050life.com\n2052ce12d523062f.com\n206zz.com\n207xz.com\n2080ly.com\n2093hd.com\n2099xs.com\n20e2554096acf2c6.com\n20fl.com\n20images10.com\n20images21.com\n20images25.com\n20images7.com\n20ju.com\n20kf.com\n20on.com\n20planet.com\n20qu.com\n20wx.com\n20xs.org\n20xue.com\n20xy.cc\n20yy.com\n20z.com\n21-sun.com\n210189.com\n210997.com\n210d6afa17b4823f.com\n210z.com\n2113.com\n2114.com\n2115.com\n211600.com\n21168.org\n21191.vip\n2119915.com\n211cad.com\n211d2977a10301.beer\n211hr.com\n211ic.com\n211zph.com\n212200.com\n212300.com\n212313.com\n2125.com\n212512124156.icu\n21263.net\n2128673cd1013.beer\n2130453ff61f34c1.com\n21322.org\n2133.com\n2133bbs.com\n21373.com\n2144.com\n2144gy.com\n215489736524785.icu\n2155.com\n215soft.com\n2165588.com\n216tt.com\n217.net\n21713.org\n2177s.com\n217wo.com\n21826aafe2a48426.com\n218318.com\n21869.org\n218996.com\n2189cok.com\n21ask.com\n21bcr.com\n21beats.com\n21bowu.com\n21bx.com\n21cake.com\n21cbr.com\n21cccc.com\n21ccnn.com\n21ccvn.com\n21cd.com\n21cloudbox.com\n21cn.com\n21cn.net\n21cnentmail.com\n21cnev.com\n21cnhr.com\n21cnjy.com\n21cnjy.net\n21cnsales.com\n21cnsungate.com\n21cntx.com\n21cos.com\n21cp.cc\n21cp.com\n21ctest.com\n21cto.com\n21dagong.com\n21datasheet.com\n21deal.com\n21dianyuan.com\n21dida.com\n21dtv.com\n21ejob.com\n21eline.com\n21epub.com\n21fid.com\n21food.com\n21gold.org\n21good.com\n21hifi.com\n21hospital.com\n21hyzs.com\n21ic.com\n21icsearch.com\n21ido.com\n21jiao.net\n21jingji.com\n21js.com\n21kan.com\n21kk.cc\n21ks.net\n21kunpeng.com\n21ld.com\n21maoyi.com\n21mcu.com\n21mmo.com\n21mould.net\n21na.com\n21our.com\n21qa.net\n21qphr.com\n21qupu.com\n21rv.com\n21shhr.com\n21shipin.com\n21shte.net\n21sjmg.com\n21sla.com\n21so.com\n21softs.com\n21spv.com\n21tb.com\n21teacher.com\n21tjsports.com\n21tx.com\n21tyn.com\n21uv.com\n21van.com\n21vbc.com\n21vbluecloud.com\n21vbluecloud.net\n21viacloud.com\n21vianet.com\n21voa.com\n21wecan.com\n21wenda.com\n21wenju.com\n21xc.com\n21xcx.com\n21xfbd.com\n21xianhua.com\n21xl.info\n21xuema.com\n21yangjie.com\n21yibiao.com\n21yq.com\n21ytv.com\n21zbs.com\n22.com\n220840.com\n220c.com\n221234.xyz\n221400job.com\n22145.com\n2217.com\n221700.com\n222.com\n22221111.com\n222579.com\n222abc999abc.com\n222bz.com\n222i.net\n222pcb.com\n2233488aa7.shop\n22336699.xyz\n2238202.com\n2239.com\n2243.com\n22442400.com\n2247.com\n224700.com\n224837439.xyz\n224m.com\n225.cc\n2255039.com\n2258.com\n2259.com\n225f360dca52f6cf.com\n225image.com\n225image.vip\n2265.com\n226500.com\n226531.com\n226969.xyz\n226yzy.com\n2280.com\n2281wa.ren\n2288.org\n2288116ab4.shop\n228job.com\n228tuchuang.com\n229.com\n2295.com\n2298.com\n22ba.com\n22baobei.com\n22bw.com\n22cc0971910251.beer\n22dm.com\n22edu.com\n22hd.com\n22lianmeng.com\n22lrc.com\n22mt.in\n22n.com\n22net.com\n22plc.com\n22pq.com\n22shop.com\n22tianbo.com\n22tj.com\n22vape.com\n22vd.com\n2305.org\n230890.com\n231083.com\n231122.com\n2317.com\n231e3dffa1010.beer\n2321111.com\n232232.xyz\n2323u.com\n2323wan.com\n232485.com\n2329.com\n233.com\n2330.com\n233000.com\n2333u.com\n23356.com\n233863.com\n2339.com\n233id.com\n233leyuan.com\n233lyly.com\n233netcloud.com\n233netpre.com\n233netpro.com\n233py.com\n233wo.com\n233xyx.com\n2344.com\n2345.cc\n2345.com\n2345.gd\n2345.net\n23456789.xyz\n23456v.com\n2345at.com\n2345cdn.com\n2345cdn.net\n2345download.com\n2345ff.com\n2345ii.com\n2345mbrowser.com\n2345soso.com\n234du.com\n234f.com\n234f0188110291.beer\n234fang.com\n2354b5daa10311.beer\n236306.com\n236400.com\n236501.xyz\n2366.com\n23673.com\n236z.com\n2375.org\n2375sj.com\n238000.net\n238090.com\n238e22bf310251.beer\n2392fe36a1019.beer\n239300.net\n23bei.com\n23book.com\n23class.com\n23cube.com\n23dns.com\n23do.com\n23du.com\n23e489f9600657c1.com\n23e4cb2581013.beer\n23img.com\n23job.net\n23kmm.com\n23ks.com\n23luke.com\n23mofang.com\n23qb.com\n23qb.net\n23qcw.com\n23sk.com\n23txt.com\n23us.so\n23us23us.com\n23uswx.com\n23uswx.info\n23uswx.net\n23wow.com\n23wx.cc\n23wx.io\n23xsw.cc\n23ye.com\n23yy.com\n23zw.com\n240yx.com\n24198ef3f855c8ff.com\n24331.org\n24335.org\n246546.com\n246b35da610272.beer\n246ys.com\n2478.com\n248.com\n2481e.com\n2486.org\n248xyx.com\n249m.com\n24av.com\n24bb0cd0c3b8480d.com\n24biao.com\n24dab50b3223e582.com\n24dq.com\n24geban.com\n24haowan.com\n24hmb.com\n24jiankong.com\n24k99.com\n24kplus.com\n24maker.com\n24money.com\n24om.com\n24shi.cc\n24th.com\n24timemap.com\n24u7tos.com\n24zbw.com\n250.cc\n2500.tv\n25000li.com\n2500city.com\n2500sz.com\n250340.com\n250a3526251.xin\n2512124740355.icu\n251400.com\n2523.com\n25285577.com\n2529.com\n253.com\n25395.vip\n253952.com\n253u.com\n2541.com\n254254.com\n254game.com\n2551aa29811031.beer\n255616.com\n2559e5f081017.beer\n255star.com\n25662zubo23739.com\n256app.com\n256cha.com\n25752.com\n258.com\n258288.com\n25847.com\n25892.com\n258ch.com\n258en.com\n258fuwu.com\n258sd.com\n258weishi.com\n258zw.com\n25992.com\n25az.com\n25dddaa6f10261.beer\n25dir.com\n25dx.com\n25fe391eb68e3f9c.com\n25game.com\n25ku.com\n25nc.com\n25pp.com\n25pyg.com\n25q7ekcc67.com\n25rk.com\n25tmw.com\n25un.com\n25wy.com\n25xg.com\n25xianbao.com\n25xm.com\n25xz.com\n25yi.com\n25yz.com\n260.net\n260068.com\n26210.org\n2628liao.com\n2629.com\n263-mail.net\n263.com\n263.net\n26330a8c11017.beer\n263cv.net\n263em.com\n263fc.com\n263idc.com\n263idc.net\n263live.net\n263vps.com\n263xmail.com\n263y.com\n264006.com\n264321.com\n264400.com\n26582.vip\n26595.com\n265g.com\n265h.com\n265xh.com\n266.com\n266.la\n266fbded61019.beer\n266wan.com\n2671111.net\n26779.org\n2677dl.com\n2678.com\n26785.org\n2686.com\n2688.com\n268v.com\n269.net\n26923.com\n26a9118418e77c84.com\n26c23b9f311042.beer\n26ce3e05310251.beer\n26d124fdb11032.beer\n26duc.com\n26e02ca8210272.beer\n26f4a1f8f10271.beer\n26host.com\n26joy.com\n26ks.cc\n26s.com\n26youxi.com\n270326012f82.icu\n270che.com\n270top.com\n27195.vip\n272500.com\n27270.com\n27399.com\n273u.com\n2743b3ed63ebb546.com\n27492.com\n275.com\n27512.org\n2755005.com\n277sy.com\n277t.com\n27813000.com\n2789a91661019.beer\n278wan.com\n279love.com\n279tt.com\n27al.com\n27cat.com\n27d7c9e9b3a34696.com\n27daili.com\n27l.com\n27tj.com\n27ws.com\n27xuexiao.com\n28.bet\n28.com\n281010.com\n28126.cc\n281669.vip\n281826.vip\n282626.xyz\n2827.com\n28283.com\n282g.com\n283d.com\n2848168.com\n28493.com\n2850.com\n28517.org\n2858999.com\n28715.vip\n288idc.com\n289.com\n2896.ro\n2898.com\n28beiduo.com\n28ce6d14004bae01.com\n28d4cc3671024.beer\n28d7baa3e1013.beer\n28e4cd79f1023.beer\n28eb96ed4da91317.com\n28gl.com\n28gua.com\n28ka.com\n28khy.com\n28qp.com\n28rv.com\n28sog.com\n28tui.com\n28yt.com\n28z9.com\n28zhe.com\n29029.com\n2903866.net\n291315.com\n2918.com\n29227e5771014.beer\n2925.com\n292775.com\n29293.com\n293.net\n29592.net\n296u.com\n29736.org\n29797.com\n2980.com\n29888.org\n299906.com\n29c17146910271.beer\n29c385dc5e75af06.com\n29ca702351014.beer\n29dnue.com\n29nh.com\n29wjns.com\n29xf.com\n2a965464310251.beer\n2agi.net\n2ai2.com\n2ai2.net\n2amok.com\n2apzhfa.xyz\n2av7.com\n2b079fbcd1009.beer\n2b71f0159d3b2d42.com\n2b7a44c2110251.beer\n2bbd099f5dc4d3aa.com\n2bkw.com\n2broear.com\n2bulu.com\n2bzq.com\n2c5bf25c11b8dc3e.com\n2c71b194031fc683.com\n2c883aeffbeef6c7.com\n2caipiao.com\n2ccc.com\n2chcn.com\n2cloo.com\n2cname.com\n2cq.com\n2cshop.com\n2cto.com\n2cubeglobal.com\n2cycd.com\n2cycomic.com\n2cyxw.com\n2cyzx.com\n2d1a542c1e340653.com\n2d261b4e6e641e43.com\n2d3d5d.net\n2d6cd83bf10261.beer\n2d8f1726e1d61d69.com\n2danji.com\n2db3d5c761abe51b.com\n2dcode.biz\n2df.me\n2dffbc61dea7ca0a.com\n2dfire.com\n2dfire.info\n2dmaker.com\n2dph.com\n2du.net\n2dyou.com\n2e30175771022.beer\n2e30a72a21023.beer\n2ea31935add3d6b0.com\n2eb4189e6451af49.com\n2ed1fefd710272.beer\n2ed5d.com\n2ed7d8ec410271.beer\n2ee8565103abf121.com\n2eka.cloud\n2emai.com\n2f.com\n2f24ad2dc10261.beer\n2facb31bb10272.beer\n2fda37d4c10292.beer\n2fz1.com\n2gdt.com\n2gei.com\n2girls1finger.org\n2google.com\n2haha.com\n2haitao.com\n2handsmt.com\n2haohr.com\n2heng.xin\n2hu.net\n2hua.com\n2i1i.com\n2ibook.com\n2ic.cc\n2ita.com\n2itcn.com\n2j88.com\n2jianli.com\n2k27cny7hx.cfd\n2k2k.com\n2kb.com\n2kfb.com\n2kk.cc\n2kka.com\n2kno.com\n2ktq.com\n2kxs.info\n2kxs.org\n2kxy.com\n2kzw.info\n2lian.com\n2liang.net\n2ll.co\n2loveyou.com\n2m2j.com\n2m3m.com\n2ma2.com\n2mcnxs.cc\n2mjob.com\n2mould.com\n2muslim.com\n2o.cx\n2or3m.com\n2p.biz\n2p.com\n2pcdn.com\n2q10.com\n2qsc.com\n2qupu.com\n2r3r.com\n2rich.net\n2sdx.com\n2sey.com\n2sjc.com\n2sonar.com\n2sx.net\n2t58.com\n2te.com\n2tianxin.com\n2tt.net\n2tubaobao.xyz\n2tx.com\n2umj.com\n2urch0.info\n2urg1y.info\n2urk3j.shop\n2uroz.info\n2v8d.com\n2v9t3xf9z2.com\n2vfun.com\n2w.com\n2w.ma\n2weima.com\n2xiazai.com\n2y9y.com\n2ychem.com\n2yq.org\n2yuanyy.com\n2yup.com\n2yx8.com\n2zhan.com\n2zhk.com\n2zimu.com\n2zzt.com\n3-3.me\n3-hospital-cqmu.com\n3.biz\n30.net\n3000.com\n300033.info\n30006124.xyz\n3000api.com\n3000idc.com\n3000soft.net\n3000test.com\n3000ways.com\n3000xs.cc\n3001.net\n300113.com\n300280.com\n300624.com\n3008268.com\n300hu.com\n300ppt.com\n300zi.com\n3011.net\n3016.com\n301688.com\n301mba.com\n301pk.com\n3023.com\n302302.xyz\n302423a641021.beer\n303c.com\n3044.com\n30583a8b910261.beer\n3062d65271020.beer\n306t.com\n3072ccba588e48d0.com\n308.app\n308.tv\n30888.com\n3099.net\n30aitool.com\n30c.org\n30cgy.com\n30daydo.com\n30fun.com\n30gaokao.com\n30ka.com\n30play.com\n30post.com\n30sche.com\n30th-feb.com\n30vps.com\n30w.co\n310game.com\n310s-2520.com\n310tv.com\n310v.com\n310v.net\n310win.com\n311.biz\n311100.com\n311wan.com\n312000.net\n31260939.com\n31264.org\n312green.com\n313033.com\n313515.com\n314pay.com\n315008.com\n3150315.com\n3152018.com\n3158.com\n3158bbs.com\n315958.com\n315banzhao.com\n315che.com\n315code.com\n315dian.com\n315fangwei.com\n315hyw.com\n315i.com\n315img.com\n315mro.com\n315online.com\n315rx.com\n315tech.com\n315tsz.com\n31609.com\n31668.com\n316watches.com\n3171688.com\n317608.com\n31793.com\n317hu.com\n318595.xyz\n3188.la\n318ek.com\n318jskyycq.com\n318yishu.com\n3198.com\n31998a86110251.beer\n319d3741ad1da914.com\n31amjs.com\n31b081b851019.beer\n31b675a9cce68585.com\n31bzjx.com\n31cg.com\n31d.net\n31doc.com\n31expo.com\n31fabu.com\n31food.com\n31games.com\n31gamestudio.com\n31huiyi.com\n31i9ti.com\n31idc.com\n31jf.com\n31jgj.com\n31knit.com\n31m49.com\n31maque.com\n31meijia.com\n31ml.com\n31mold.com\n31ns.info\n31pump.com\n31rent.com\n31sf.com\n31travel.com\n31wj.com\n31xj.com\n31yarn.com\n31yr.com\n320921.com\n320g.com\n321.net\n321002.com\n321009.com\n32109.com\n321274.com\n321321321.vip\n321a6d50a1009.beer\n321ba.com\n321cad.com\n321cy.com\n321fenx.com\n321go.com\n321key.com\n321mh.com\n321sq.com\n321tips.com\n321zou.com\n3223.com\n322799.com\n322h.com\n322wl.com\n3230.com\n32331.vip\n3234.com\n3235587.com\n3237.com\n324.com\n32414.com\n32495fe5f11042.beer\n325802.net\n3259.com\n325999.com\n3259b95be11032.beer\n3269.org\n32768k.net\n327aa34f510311.beer\n3280.com\n32800.com\n3283773e9dc5cde5.com\n3286.cc\n328f.com\n328vip.com\n3290.com\n32a5d6351989b210.com\n32cd.com\n32ka.com\n32kan.com\n32r.com\n32rsoft.com\n32us.com\n32wan.com\n32xp.com\n33.com\n3304399.com\n3304399.net\n330d5ba0e1024.beer\n33105.com\n331234.xyz\n3320.net\n3321.com\n3322.cc\n3322.net\n3322.org\n3322032.com\n33226163.xyz\n3323.com\n33230.org\n3323399.com\n332831.com\n333-555.com\n333.com\n33315.com\n333232.xyz\n333333.com\n333333.org\n3335665.com\n33360.com\n3336637.com\n3336639.com\n3336653.com\n3336657.com\n333666999.club\n3336670.com\n3336672.com\n3336673.com\n3336683.com\n3336691.com\n3337706.com\n3337723.com\n3337726.com\n3337729.com\n3337735.com\n3337736.com\n3337738.com\n3337739.com\n3337751.com\n3337756.com\n3337765.com\n3337780.com\n3337781.com\n3337782.com\n3337783.com\n3337785.com\n33380xl.com\n3338808.com\n3338863.com\n3338877.com\n333915.com\n3339999.net\n3339auto.com\n333a51.app\n333a58.app\n333bbb777kkk.com\n333cn.com\n333com85.app\n333com89.app\n333f.com\n333iy.com\n333job.com\n333ku.com\n333rh.com\n333wan.com\n333y3.com\n334433.xyz\n3344u.com\n334837632.xyz\n33519.com\n3356666.com\n3359.com\n33591.com\n336.com\n3361.com\n33655.net\n3366.com\n3366.net\n336685.com\n336688.net\n3366886633.com\n3366img.com\n3366ok.com\n336cfe9101009.beer\n336woool.com\n337000.com\n3377577c.app\n3377751e.app\n3377999c.app\n337y.com\n338336.com\n3387.com\n338888.net\n3389dh.com\n3393.com\n33988.net\n33aml.com\n33app.net\n33bus.com\n33dy.cc\n33erwo.com\n33fang.com\n33ip.com\n33iq.com\n33jianzhi.com\n33lc.com\n33ly.com\n33map.com\n33map.net\n33oncall.com\n33out.com\n33oz.com\n33subs.com\n33tool.com\n33trip.com\n33tui.com\n33yq.com\n34.com\n340888.com\n3419e2cbf10261.beer\n341d88b04156e9d3.com\n342200.com\n342jinbo.com\n34347.com\n345123.xyz\n3454.com\n3456-1.vip\n3456.cc\n3456.com\n3456.tv\n34563686.work\n34580.com\n345fk.com\n345huishou.com\n345idc.com\n3464.com\n346888.com\n346g4247o9.world\n348b60ac51011.beer\n34a14155f1016.beer\n34c5fe453528e605.com\n34f04e8d410291.beer\n34lou.com\n34wl.com\n34xian.com\n35.com\n35.net\n350.com\n350.net\n3500.com\n350200.com\n350211.net\n3503.com\n3504cde7b76a2cc9.com\n35091.cc\n350abc.net\n350c.com\n3516w.com\n35195.vip\n352.com\n3520.net\n352200.com\n3525.com\n3527.net\n353233.com\n3533.com\n35335.com\n3536.com\n35463.org\n354d7967c11032.beer\n3551.com\n3558b3020217b9a3.com\n355xx.com\n356123.com\n35617.vip\n35667.com\n3566t.com\n357.com\n357global.com\n358.com\n359203.com\n35941.com\n3595.com\n359798114.xyz\n35app.com\n35ba.com\n35d1.com\n35db4d2761021.beer\n35dxs.com\n35e0510ae11032.beer\n35go.net\n35inter.com\n35jk.com\n35kds.com\n35lz.com\n35nic.com\n35pic.com\n35sf.com\n35xss.com\n35zww.com\n36-7.com\n36.cc\n36.la\n360-g.net\n360-game.net\n360-jr.com\n360.com\n360.net\n3600.com\n3600.net\n3600d.com\n360114.com\n360118.com\n360424.com\n360500.com\n3608.com\n360abc.com\n360adlab.com\n360adlab.net\n360adlab.org\n360ads.com\n360aiyi.com\n360anyu.com\n360boclub.com\n360bsafe.com\n360buy.com\n360buyimg.com\n360buyinternational.com\n360byd.com\n360bzl.com\n360caifu.com\n360cdn.com\n360changshi.com\n360che.com\n360chezhan.com\n360chou.com\n360cloudwaf.com\n360daikuan.com\n360ddj.com\n360dlcdn.com\n360doc.com\n360doc.net\n360doc1.net\n360doc18.net\n360doc2.net\n360doc22.net\n360doc25.net\n360doc4.net\n360doc7.net\n360docs.net\n360doo.com\n360down.com\n360drm.com\n360eol.com\n360gann.com\n360gem.com\n360gogreen.com\n360gongju.com\n360gongkao.com\n360gtm.com\n360guanai.com\n360hapi.com\n360hifi.com\n360hitao.com\n360hqb.com\n360humi.com\n360huzhubao.com\n360hx.com\n360hy.com\n360hyzj.com\n360ic.com\n360imgcdn.com\n360in.com\n360insurancemall.com\n360jianzhu.com\n360jie.com\n360jinrong.net\n360jk.com\n360jq.com\n360jrjietiao.com\n360jrkt.com\n360kaixin.com\n360kan.com\n360kcsj.com\n360kj.net\n360ksbd.com\n360kuai.com\n360kuaixiao.com\n360kuaixue.com\n360kxr.com\n360lion.com\n360lj.com\n360lnk.com\n360loushi.com\n360midi.com\n360mkt.com\n360os.com\n360panyun.com\n360panyun.net\n360powder.com\n360qc.com\n360qd.com\n360qhcdn.com\n360qikan.com\n360qikan.net\n360qnw.com\n360qws.com\n360qyaq.com\n360safe.com\n360safedns.com\n360sdn.com\n360shouji.com\n360shouzhuan.com\n360shuke.com\n360shuoshuo.com\n360simg.com\n360sjrom.com\n360sky.com\n360so.com\n360sok.com\n360sou.com\n360sou.net\n360soucha.com\n360sousou.com\n360sportwatches.com\n360src.com\n360sres.com\n360stamp.com\n360taojin.com\n360tianma.com\n360timg.com\n360tong.net\n360top.com\n360totalsecurity.com\n360tpcdn.com\n360tres.com\n360tuan.com\n360u9.com\n360underwear.com\n360uu.com\n360vcloud.com\n360vrzy.com\n360webcache.com\n360wenmi.com\n360worldcare.com\n360wscdn.com\n360wulian.net\n360wyw.com\n360wzb.com\n360wzws.com\n360xh.com\n360xiaos.com\n360xiehui.com\n360xinyongka.com\n360xkw.com\n360xlab.com\n360xlab.net\n360xlab.org\n360xyws.com\n360yao.com\n360ybj.com\n360yijia.com\n360youtu.com\n360yuanshuo.com\n360yuxue.com\n360zebra.com\n360zhileng.com\n360zhushou.com\n360zhyx.com\n360zmr.com\n360zqaq.com\n360zqf.com\n360zuowen.com\n360zuqiu.com\n36130.com\n361757.com\n3618med.com\n361cv.com\n361dai.com\n361mogame.com\n361sport.com\n361zhao.com\n362.cc\n36267.vip\n363.com\n363.hk\n363.net\n363120.com\n363322014.com\n3636.tech\n363635.com\n363u.com\n364000.com\n36410.org\n36476.work\n365.com\n365.hk\n36500.com\n36500.net\n365128.com\n365135.com\n3652.com\n36524hua.com\n36543.com\n365500.com\n3656.com\n36578.com\n365960.com\n365autogo.com\n365azw.com\n365bh.cc\n365bj.com\n365bmc.com\n365bmw.com\n365book.net\n365cego.com\n365cgw.com\n365chanlun.com\n365chiji.com\n365css.com\n365cyd.com\n365cyd.net\n365daan.com\n365daygo.com\n365dhw.com\n365diandao.com\n365digitalonline.com\n365ditu.com\n365dmp.com\n365editor.com\n365eme.com\n365essay.com\n365f.com\n365fanyi.com\n365gangqin.com\n365gcd.net\n365gongchang.com\n365good.cc\n365heart.com\n365hele.com\n365hf.com\n365htk.com\n365huaer.com\n365huangjin.com\n365ibuy.com\n365icl.com\n365ime.com\n365j.com\n365jia.com\n365jiankang.com\n365jilin.com\n365jq.com\n365jw.com\n365jz.com\n365kan.tv\n365kandian.com\n365key.com\n365kl.net\n365liye.com\n365master.com\n365matrix.com\n365mmjg.com\n365mx.com\n365nongye.com\n365pcbuy.com\n365pingxuan.com\n365pk.com\n365pp.com\n365pr.net\n365pub.com\n365qipai365.com\n365rili.com\n365sec.com\n365sf89.com\n365shequ.com\n365sky.com\n365sydc.com\n365ta.com\n365time.com\n365ting.com\n365tkt.com\n365ttcz.com\n365tvip.com\n365vip.com\n365world.com\n365xiazai.com\n365xs.la\n365xuet.com\n365yarn.com\n365yg.com\n365you.com\n365yyf.com\n365zhaopin.com\n365zhuanrang.com\n365zmw.com\n365zsw.net\n365zzx.com\n3660bf60ab32baab.com\n36612345.com\n3663.com\n366300.com\n366666.net\n36683.com\n3669yx.com\n366club.com\n366ec.com\n366ec.net\n366kmpf.com\n366translation.com\n36706.com\n3673.com\n367edu.com\n36838.org\n36840.com\n36885.vip\n3688km.com\n368mall.com\n368tea.com\n369110.xyz\n36932.com\n36939.net\n369785.com\n3699.cc\n3699.co\n3699wan.com\n369cha.com\n369hui.com\n36ab8227e10311.beer\n36aw.com\n36dianping.com\n36dj.com\n36dong.com\n36hjob.com\n36jr.com\n36kr.com\n36kr.net\n36krcdn.com\n36krcnd.com\n36pnes36t0qs.com\n36qp.com\n36rv3j3.shop\n36tw.com\n36ve.net\n36yc.com\n36zpp.com\n37.com\n37021.com\n37051.cc\n370fd.com\n371.com\n371.net\n3710167.com\n37163.com\n371bus.com\n371love.com\n37201.com\n3721.vip\n3721520.com\n3721zh.com\n3722.com\n37274.com\n372951b2210301.beer\n3733.com\n3733game.com\n3737.com\n3737k.com\n373a5e2a6f8a3f9a.com\n373c0f3771021.beer\n373f.com\n373net.com\n373yx.com\n37439.com\n3761.com\n3768.org\n377466.com\n3774cd2332503d45.com\n379.com\n37937.com\n3794b0fa67e5f83b.com\n3798.com\n379art.com\n379bst.com\n37a15fd3b16897ba.com\n37biao.com\n37bjw.com\n37cbca02a1019.beer\n37cos.com\n37cs.com\n37cu.com\n37dh.com\n37game2.com\n37gjw.com\n37gogo.com\n37gowan.com\n37hr.com\n37k.com\n37kx1.com\n37laboratory.com\n37med.com\n37pps.com\n37see.com\n37su.com\n37swan.com\n37tang.com\n37tgy.com\n37wan.com\n37wan.net\n37wan.one\n37wanimg.com\n37wanwan.com\n37wanwancdn.com\n37women.com\n37www.com\n37wxwl.com\n37yzy.com\n37zone.com\n37zp.com\n3800920.com\n3800j.com\n380852.com\n380871.com\n38109222.com\n3816.net\n3817.com\n38198.org\n381pk.com\n3822edf4d1022.beer\n38387.app\n3839.com\n38393.org\n3839apk.com\n3839app.com\n3839app.net\n3839img.com\n3839pay.com\n3839pic.com\n3839vc.com\n3839video.com\n383k.com\n383yun.com\n3851120.com\n3856.cc\n38566.org\n385k.cc\n38711.cc\n38735.vip\n388g.com\n3892222.com\n38999h.vip\n38a9018e44a7da0f.com\n38b06119b10271.beer\n38blog.com\n38c99.com\n38ejed.com\n38film.com\n38hack.com\n38hot.net\n38hp.com\n38hzt.com\n38mhw.com\n38ra.com\n38xs.com\n38zp.com\n39.com\n39.net\n390seo.com\n391065.com\n3911.com\n3913.com\n3917.com\n391k.com\n392766.net\n393.com\n3937.com\n3939339.com\n394394.com\n3949006e510272.beer\n394afb34a1020.beer\n39507037133f.icu\n39655.com\n3975.com\n3975ad.com\n3975ad.xyz\n3975app.com\n3975cdn.com\n3977s.com\n398423277d755d82.com\n3987.com\n3993.com\n399s.com\n39amjs.com\n39ask.net\n39b86269e11031.beer\n39b8fe8f4c6f9dee.com\n39bfe802d10292.beer\n39center.com\n39clean.com\n39cs.com\n39d83s.com\n39dg.com\n39ej7e.com\n39f6e28d71009.beer\n39fei.com\n39fengliao.com\n39h83s.com\n39hd.com\n39health.com\n39jks.com\n39jz.com\n39kan.com\n39kf.com\n39meitu.com\n39mob.com\n39shubao.com\n39shuwu.com\n39txt.com\n39yst.com\n3a2dc2bd21023.beer\n3a2studio.com\n3a4.net\n3a4b5c.com\n3afbda6f11015.beer\n3ait.com\n3alv.com\n3aok.com\n3apz.com\n3aqj.com\n3avox.com\n3b13795054e3ac5a.com\n3b1aj.info\n3b1bm3f.shop\n3b1bvrwc.info\n3b1fcl.info\n3b1xgp.shop\n3b2479faf10301.beer\n3b2o.com\n3bag.ru\n3bf.cc\n3bfc4d6861010.beer\n3bu.com\n3c1bddb4110301.beer\n3c2p.com\n3c324f3ae10241.beer\n3c3t.com\n3c4c142e21021.beer\n3c5a7b25910281.beer\n3c6a1a5d01015.beer\n3c9035c3bd9e7599.com\n3cb106206b814b15.com\n3cf6c871511032.beer\n3chongmen.com\n3cjob.com\n3conline.com\n3cpp.org\n3ct.cc\n3d-apollo.com\n3d-chips.com\n3d-gold.com\n3d-medicines.com\n3d-stereovision.com\n3d2000.com\n3d2848f7811042.beer\n3d503a99384e0d4c.com\n3d66.com\n3d7ce8a16c0f8781.com\n3d9r.com\n3daima.com\n3dbody.com\n3dbt.com\n3dbuyu.com\n3dbuyu.net\n3dcat.live\n3ddaz.com\n3ddl.net\n3ddl.org\n3deazer.com\n3debut.com\n3ded4c0f310311.beer\n3dfcs.com\n3dgali.com\n3dgenomics.org\n3dhao.com\n3dhoo.com\n3dinlife.com\n3djulebu.com\n3dkunshan.com\n3dllc.cc\n3dllc.com\n3dly.com\n3dmaxvip.com\n3dmgame.com\n3dmgame.hk\n3dmgame.net\n3dmjiasu.com\n3dmomoda.com\n3dmxku.com\n3dnew.com\n3doe.com\n3drrr.com\n3dsdce.com\n3dsjw.com\n3dsnail.com\n3dtakers.com\n3dtank.com\n3dtoo.com\n3dwebyx.com\n3dwhere.com\n3dwwwgame.com\n3dxt.com\n3dxy.net\n3dzyw.com\n3e.net\n3e089a2bd1011.beer\n3e1f90ccd1016.beer\n3e306b2a010272.beer\n3e38c7206c1beb1a.com\n3e5da509e10271.beer\n3e6dfbe90c676f1d.com\n3ec933de211031.beer\n3echemical.com\n3edns.com\n3edu.net\n3efda91b710311.beer\n3elife.net\n3etimes.com\n3eyes.org\n3f20c121e6032c50.com\n3f4155b1310311.beer\n3f496850f89e7809.com\n3f5348d2ff43ee00.com\n3f73dbae64fefabb.com\n3f9b37df0629ada1.com\n3fahudong.com\n3fang.com\n3fantizi.com\n3fb762d23d09f297.com\n3fc5960c0be056ce.com\n3fcl8.net\n3fda.com\n3feb063cbf96bd40.com\n3fzipper.com\n3g-edu.org\n3g368.com\n3g48.com\n3g567.com\n3gbizhi.com\n3gcj.com\n3gdisk.com\n3gifs.com\n3glasses.com\n3gmfw.com\n3gmimo.com\n3gogogo.com\n3gosc.com\n3gpk.net\n3gqqw.com\n3gsou.com\n3gu.com\n3gwoool.com\n3gxk.net\n3h.com\n3h1i.com\n3h3.com\n3h77.com\n3haovip.com\n3healthcare.com\n3heyun.com\n3hhinvestment.com\n3hmedicalgroup.com\n3hmlg.com\n3incloud.com\n3ins.net\n3j3f.com\n3jdh.com\n3jhuyu.com\n3jidi.com\n3jlm.com\n3jrx.com\n3jzh.com\n3k.com\n3k3cn.com\n3ke.cc\n3kew.com\n3kid.com\n3kismet.com\n3kjs.com\n3kk.com\n3kmq.com\n3ko.com\n3kr.com\n3kyi.com\n3kzhushou.com\n3labtest.com\n3laohu.com\n3lbrand.com\n3lengjing.com\n3lmeter.com\n3lsoft.com\n3mbang.com\n3mh0yvx.com\n3miao.net\n3miko.xyz\n3mtw.com\n3mu.me\n3muzn.com\n3n1b.com\n3nbb.com\n3nfood.com\n3p8801.co\n3piaochong.com\n3png.com\n3polar.com\n3poo.com\n3pw.net\n3q2008.com\n3qdu.com\n3qdu.net\n3qdu.org\n3qdus.com\n3qhouse.com\n3qit.com\n3qj.com\n3qled.com\n3qwe.com\n3qxsw.com\n3qzone.cc\n3r.work\n3rcd.com\n3renhe.net\n3renwx.com\n3richman.com\n3rotber.com\n3rroll.com\n3s-guojian.com\n3s.work\n3s001.com\n3s78.com\n3scard.com\n3sjt.com\n3slift.com\n3snews.net\n3songshu.com\n3sribu.com\n3srobotics.com\n3stl.com\n3sunway.com\n3swg.com\n3t3.org\n3thiku.com\n3tilabs.com\n3tinkers.com\n3tmall.com\n3treesgroup.com\n3tstore.com\n3u.com\n3ukkht3yn3.work\n3unshine.com\n3uol.com\n3us.com\n3uww.cc\n3uww.com\n3v.do\n3vjia.com\n3vjuyuan.com\n3vsheji.com\n3wcoffee.com\n3wen.com\n3wfocus.com\n3wft.com\n3wka.com\n3wmm.com\n3wtuan.com\n3wyk.com\n3x7.com\n3xgd.com\n3xiaoniao.com\n3xiazai.com\n3xinhome.com\n3xyg.com\n3y1.com\n3y7h.com\n3yakj.com\n3ygww.com\n3yoqu.com\n3yt.com\n3yt.la\n3yun.net\n3yx.com\n3zbsy.com\n3zhijk.com\n3zhm.com\n3zmuseum.com\n3zonegame.com\n4-xiang.com\n4.biz\n4.plus\n400-lighting.com\n400.com\n40000-30000.com\n4000011520.com\n4000022282.com\n4000034168.com\n4000066666.com\n4000156651.com\n4000278400.com\n4000286188.com\n4000500521.com\n4000730138.com\n4000773040.com\n400078.com\n4000892990.com\n4000979797.com\n4000kbpe.bar\n4001006666.com\n4001113900.com\n4001180057.com\n400123.com\n4001581581.com\n4001817899.com\n4001890001.com\n4001961200.com\n400301.com\n400332.com\n40035.com\n400388.com\n4006055885.com\n4006216888.com\n4006300457.com\n4006339177.com\n4006510600.com\n4006631958.com\n4006695539.com\n4006758160.com\n4006787252.com\n4006800660.com\n4006806555.com\n4006906600.com\n4007051668.com\n4007108885.net\n4007112366.com\n4007123123.com\n4007777958.com\n4008-197-197.com\n4008000000.com\n4008005216.com\n4008075595.com\n4008103103.com\n4008107107.com\n4008109886.com\n4008117117.com\n4008123123.com\n4008258399.com\n4008338788.com\n4008600011.com\n4008618618.com\n4008787706.com\n4008800016.com\n4008824365.com\n4008863456.com\n4008880999.com\n4008880999.net\n4008885818.com\n4008cn.com\n4009.com\n4009515151.com\n4009870870.com\n4009991000.com\n4009997658.com\n400cx.com\n400dianhua.com\n400gb.com\n400ja.com\n400kaoyan.vip\n400lyw.com\n400num.com\n400qikan.com\n400taocan.com\n400vv.com\n400web.com\n4020.la\n40407.com\n404886.com\n404mzk.com\n404wan.com\n404youxi.com\n405400.com\n407wan.com\n4080517.com\n408399.com\n408399.net\n4087b09ee4632bb5.com\n408cf42720d8be86.com\n408ec542b10281.beer\n409a1957110311.beer\n409c27e4c1015.beer\n409d0a7b710241.beer\n40bw71.ren\n40c53fc1d11021.beer\n40cb.com\n40images15.com\n40images16.com\n40le.com\n40sishi.com\n40xk.com\n411-hospital.com\n41113.com\n41163.org\n41188.com\n41188844.com\n411au.com\n4132c3c4011021.beer\n413cd5ac210291.beer\n413xkyd.com\n414500.net\n415677.com\n416548ebbf96c1b9.com\n4166.net\n41739b0aa10301.beer\n417628.org\n4177.com\n41818.net\n419600.com\n419g.com\n41game.com\n41gw.com\n41huiyi.com\n41ms.com\n41wan.com\n41xt.com\n420d586841024.beer\n42144.com\n421db96b91011.beer\n42224b3c51016.beer\n422425.xyz\n422877.com\n4234.org\n4234cdn.com\n4234q.com\n42353.com\n423down.com\n4243.net\n425300.co\n425yx.com\n426.ltd\n426g.com\n42736c12558acabf.com\n4275.com\n429006.com\n42ed983e61019.beer\n42how.com\n42trip.com\n42verse.shop\n42xz.com\n430d6eba715dabb4.com\n4311.com\n432.com\n432520.com\n432b4376611021.beer\n43439g.com\n435000.com\n435200.com\n4355.com\n43578.com\n436400.com\n4366.com\n4366aa.com\n4366ga.com\n4366game.com\n4366pk.com\n4377.com\n437zhifu.com\n43803a8c410261.beer\n4393ce88a10272.beer\n4395e6c8b10291.beer\n4399-xyx.com\n4399.com\n4399.net\n43999yx.com\n4399api.com\n4399api.net\n4399biule.com\n4399data.com\n4399dmw.com\n4399doc.com\n4399er.com\n4399hdhh.com\n4399hhh.com\n4399i.net\n4399inc.com\n4399j.com\n4399mail.com\n4399pk.com\n4399sj.com\n4399swf.com\n4399sy.com\n4399wanju.com\n4399xyx.com\n4399youpai.com\n4399youxi.com\n4399yyy.com\n4399zmxy.com\n439f2bbb180aecab.com\n43cv.com\n43ns.com\n43xs.com\n43yl.com\n43zhubao.com\n4417.com\n44290f2c9bce56ed.com\n4444.cc\n44440fd0d212bb76.com\n4444448.com\n4445156.com\n44460.com\n44481.org\n444888qq.com\n4450044.com\n4450055.com\n4451199.com\n4451818.com\n44552003.com\n44629.com\n446dca1e17538cf6.com\n44719.org\n44749.net\n4480.cc\n4484.win\n44878s.com\n4488e4460a95a041.com\n448cee8738b7860d.com\n449393.vet\n44971.com\n44983.com\n4499.com\n44ff56d11fa53a9a.com\n44h.co\n44hr.com\n44jj.com\n44pq.cc\n44vs.com\n4502512122531.icu\n4506ecebe10292.beer\n45077.one\n450926731.xyz\n451057365.xyz\n451f46bd110281.beer\n453400.com\n453600.net\n45451.com\n4546.org\n455522.com\n45560ll.com\n45575.com\n45592.com\n455a525cfff81301.com\n456.net\n45656666.com\n456jy.com\n456ss.com\n456tt.com\n457.com\n457557.com\n4587.com\n4587c00611011.beer\n458kq.com\n459.org\n45app.com\n45fan.com\n45inst.com\n45io.com\n45it.com\n45ns.com\n45r.com\n45te.com\n45win.com\n45xie.com\n45yx.com\n461000.net\n462.com\n46245fb7d43c13a3.com\n46412.com\n4644440.vip\n46576.org\n46644.com\n46721.org\n46771313.com\n46809.org\n46940.vip\n4694393.com\n46ab3da510d4ccaf.com\n46cdn.vip\n46d7940171014.beer\n46eadc71881fb97a.com\n46mlsv.com\n46ps.com\n46xs.com\n4714da8871019.beer\n471f94eab9784273.com\n47295.com\n472ac621b11032.beer\n4735.com\n47365.com\n473787.com\n4738.com\n47462.org\n47473.com\n474b.com\n4765.com\n47787.com\n4779.com\n47819.com\n478bc6c1c10301.beer\n47964154c11021.beer\n479d8573510301.beer\n47daili.com\n47e17a13ee18fa43.com\n47gs.com\n47rq.com\n47zu.com\n480.cc\n480.hk\n4805555.com\n480e7c558d3d8aaa.com\n480image.com\n48251413f10281.beer\n48267.com\n48455m.com\n4846.com\n4848360.com\n48575.com\n48670.vip\n4869.cc\n487.com\n4871.org\n4888.com\n4888033.com\n4888777a14.shop\n4888g.vip\n48905.com\n48cdn.vip\n48hao.net\n48log.com\n49.com\n491.com\n4916a68576d64a34.com\n492288.com\n492f2622e64c138e.com\n4930.com\n49333g.com\n49333j.com\n49358.com\n493601.com\n49363.com\n4937711.com\n495.cc\n495495.com\n49568009.com\n4957b5fd7265b790.com\n496db29b7745a79c.com\n497-img.com\n497.com\n498.net\n499-img.com\n499n.com\n499youxi.com\n49app.com\n49e7fb6261023.beer\n49eb891471010.beer\n49ko.com\n49ms.net\n49pic.com\n49vps.com\n49wanwan.com\n49xia.com\n49you.com\n49yu.com\n49zz1110002a4.shop\n4a38863a11017.beer\n4a4779c371024.beer\n4abb.com\n4ading.com\n4anet.com\n4apx.com\n4aqq.com\n4b036c92244f5b1b.com\n4b145a7b110292.beer\n4b4d913d9b6506e9.com\n4b784b66f10311.beer\n4b9953f631024.beer\n4ba69ed8e10292.beer\n4bf85b0f61014.beer\n4c28539c4f10ad16.com\n4c37ebc131010.beer\n4c43edd99cd8bb40.com\n4c4866d8179d6f70.com\n4c55033b91010.beer\n4c645708fabd0e13.com\n4ccd82a0d11031.beer\n4ce.fun\n4ci.cc\n4cm.cc\n4cnzz.com\n4cun.com\n4d2bc4d7311031.beer\n4d458710811011.beer\n4d64c7aff11031.beer\n4dai.com\n4db.com\n4de7ab130011974d.com\n4dec3cfc0794efb4.com\n4dwan.com\n4e0e47ea71022.beer\n4e6fe7920a044f98.com\n4e7e414fd1015.beer\n4ebf1036c1010.beer\n4ee.ee\n4ef06207210281.beer\n4ef870db01022.beer\n4eglwkq.com\n4everdns.com\n4ewriting.com\n4f0b987b410311.beer\n4f411973f14e0f10.com\n4f61.com\n4f68340f5b6c21a9.com\n4f89.com\n4f9bf1e673931484.com\n4fang.net\n4fd4969ff1022.beer\n4fe55e9f6c893405.com\n4ggogo.com\n4gh6.com\n4glte.org\n4gqp.com\n4gtoefl.com\n4h44.com\n4h6s.com\n4hgame.com\n4hii.net\n4hmodel.com\n4hpy.com\n4inlook.com\n4jplus.com\n4k123.com\n4kbizhi.com\n4kdesk.com\n4kgood.com\n4kgou.com\n4kya.com\n4l.hk\n4lzr.com\n4ndwc.com\n4o.org\n4paradigm.com\n4pf6hb.com\n4pis.com\n4pnt.com\n4portun.com\n4px.com\n4pyun.com\n4q5q.com\n4qx.net\n4sai.com\n4sender.com\n4sender.net\n4sjob.com\n4sscrm.com\n4startime.com\n4tdf.com\n4thetooth.com\n4thworkshop.com\n4to66.com\n4w8.net\n4xiaoshuo.info\n4xiaoshuo.org\n4xseo.com\n4xx.me\n4y4.net\n4ye.cc\n4yt.net\n4yx.com\n4zt.com\n5-link.com\n5.biz\n50-jia.com\n500.com\n5000.com\n50004.com\n5000yan.com\n50011114.com\n50014455.com\n50016666.com\n50018.com\n50027.com\n500cache.com\n500d.me\n500doc.com\n500du.com\n500fd.com\n500gm.com\n500hj.com\n500px.me\n500talk.com\n500tb.com\n500wan.com\n500wancache.com\n500zhongcai.com\n5011.net\n501h.com\n501wan.com\n502258.com\n50257e08d1015.beer\n503118.com\n50331.net\n5033333.com\n503b2f379abaf979.com\n503error.com\n505035.com\n5054399.com\n5054399.net\n505uu.com\n5066.com\n506u5nf5j5.com\n50747.com\n507c7d240b2eae97.com\n5087.com\n508hdsys.com\n508mallsys.com\n508sys.com\n50915.org\n50970.com\n50bang.org\n50bangzh.com\n50cnnet.com\n50dacaaf86cda9cb85ee95577c9a522bf.com\n50pk.com\n50sht.com\n50union.com\n50vm.com\n50xiao.com\n50yc.com\n50yu.com\n50zera.com\n50zi.com\n50zw.co\n50zw.net\n51-cf.com\n51-jia.com\n51-visa.com\n51.am\n51.com\n51.la\n51.net\n5100.net\n51015kid.shop\n51056.org\n510560.com\n510erp.com\n510hb.com\n510xds.com\n510you.com\n51110.com\n51119.com\n5117.com\n511718.com\n5117sell.com\n5118.com\n5118img.com\n5119.net\n511m.com\n511mv.com\n511wan.com\n511wh.com\n511wx.com\n511yj.com\n512.vip\n5120.com\n5120bb.com\n51230.com\n51234g7.com\n51240.com\n512612.com\n51269017.com\n51298888.com\n512test.com\n512wx.com\n512youxi.com\n5132.com\n513337.com\n5137.cc\n51386.com\n5138zhuan.com\n513zp.com\n513zz.com\n514193.com\n514200.com\n5144wan.com\n51508.com\n51511.com\n5151888.xyz\n5151app.com\n5151sc.com\n5153.com\n51555.net\n51569.com\n5156lunwen.com\n5156xz.com\n51589.com\n5158wan.com\n515app.com\n515car.com\n515fa.com\n515ppt.com\n51643.com\n51656582.com\n51658042.com\n5166.info\n51661182.com\n5166ys.com\n516edu.com\n516ly.com\n516lyw.com\n5170d.com\n5173.com\n5173cdn.com\n51766.com\n5177cq.com\n517best.com\n517cdn.com\n517dv.com\n517ee.com\n517gf.com\n517hotel.com\n517huwai.com\n517idc.com\n517japan.com\n517job.com\n517la.com\n517la.net\n517lppz.com\n517mh.net\n517ming.com\n517mr.com\n517na.com\n517office.com\n517sc.com\n517tez.com\n517xc.com\n51802.com\n5184.com\n5184pass.com\n5185.cc\n51864.com\n51870.com\n5187g.com\n5188.com\n518ad.com\n518doc.com\n518h48fwg6.com\n518yp.com\n51926.org\n519397.com\n51969.com\n51985.net\n5199.cc\n5199.com\n51990d860a03b055.com\n5199yx.com\n51a.co\n51ads.com\n51aiclk.com\n51aimei.com\n51aiwan.com\n51app.com\n51art.com\n51ask.org\n51asm.com\n51asp.net\n51aspx.com\n51auto.com\n51autocar.net\n51autogo.com\n51awifi.com\n51b2b.com\n51babybuy.com\n51baigong.com\n51banban.com\n51banka.net\n51baocan.com\n51baoshui.com\n51bbcy.com\n51bbmm.com\n51bbo.com\n51besttea.com\n51bi.com\n51biaoqing.com\n51bidlive.com\n51bike.com\n51biz.com\n51bjrc.com\n51bmb.com\n51bokao.com\n51bonli.com\n51book.com\n51boshi.net\n51bras.com\n51bsi.com\n51bushou.com\n51buy.com\n51bxg.com\n51bzi.com\n51caiyou.com\n51callcenter.com\n51callu.net\n51camel.com\n51caocao.net\n51ccd.com\n51ccdn.com\n51cck.com\n51ccn.com\n51cdn.com\n51cdngo.com\n51cfm.com\n51cg.com\n51chang.com\n51changdu.com\n51changdu.xyz\n51changxie.com\n51chaoshang.com\n51chost.com\n51chouqian.com\n51chuanpiao.com\n51chuli.com\n51cir.com\n51cjyy.com\n51ckjr.com\n51clc.com\n51cmm.com\n51cnhr.com\n51cocoa.com\n51code.com\n51coma.com\n51comp.com\n51company.com\n51cosmo.com\n51cpm.com\n51create.center\n51credit.com\n51csr.com\n51cto.com\n51cube.com\n51cunzheng.com\n51cxsoft.com\n51czapp.com\n51dai.com\n51daifu.com\n51daima.com\n51daka.com\n51dangpu.com\n51daxueedu.com\n51dc.com\n51dcgg.com\n51dcw.com\n51device.com\n51dfc.com\n51diangu.com\n51diantang.com\n51diaocha.com\n51din.com\n51dingxiao.com\n51ditu.com\n51diyring.com\n51dmq.com\n51dns.com\n51docs.com\n51dojoy.com\n51dpub.com\n51drv.com\n51dszn.com\n51dugou.com\n51dz.com\n51dzrc.com\n51dzt.com\n51dzw.com\n51ean.com\n51ean.xin\n51easymaster.com\n51eb0685c11021.beer\n51ebo.com\n51ebooks.com\n51eduline.com\n51eim.com\n51ejz.com\n51ekt.com\n51ele.net\n51emin.com\n51emo.com\n51en.com\n51epei.com\n51eshop.com\n51etong.com\n51etr.com\n51f.com\n51facai.com\n51fangan.com\n51fangfu.com\n51fanli.com\n51fanli.net\n51fbpay.com\n51feibao.com\n51feitu.com\n51feiyu.com\n51fiber.net\n51finace.com\n51findwork.com\n51fire.xyz\n51fishplace.com\n51fl.com\n51fpg.com\n51fsw.com\n51fubei.com\n51fucai.com\n51fund.com\n51fxkj.com\n51fxzq.com\n51fytx.com\n51g3.com\n51g3.net\n51g4.com\n51gaifang.com\n51gamecard.com\n51ganjie.com\n51gaoji.com\n51gaoxiao.com\n51garlic.com\n51gdrc.com\n51gh.net\n51give.org\n51gjie.com\n51gjj.com\n51golife.com\n51gonggui.com\n51goods.vip\n51google.com\n51gouke.com\n51gowan.com\n51gox.com\n51gpt.com\n51gran.com\n51grb.com\n51grfy.com\n51growup.com\n51gszr.com\n51guanhuai.com\n51guoji.com\n51gzgk.com\n51h.co\n51h5.com\n51hailang.com\n51hanghai.com\n51hangkong.com\n51haojob.com\n51hbjob.com\n51hchc.com\n51hcw.com\n51hei.com\n51hejia.com\n51hgtg.com\n51hhjy.com\n51hicard.com\n51hika.com\n51hjk.com\n51hlife.com\n51hlife.net\n51homemoney.com\n51hosting.com\n51hostonline.com\n51houniao.com\n51hr.com\n51huaji.com\n51huanhuan.com\n51hunningtu.com\n51huoyou.com\n51hwzy.com\n51ibm.com\n51idc.com\n51ifind.com\n51ifonts.com\n51ima.com\n51img1.com\n51img2.com\n51img3.com\n51img5.com\n51img6.com\n51img7.com\n51img9.com\n51imo.com\n51ipc.com\n51ischool.com\n51itapp.com\n51itstudy.com\n51iwifi.com\n51ixuejiao.com\n51jb.com\n51jiabo.com\n51jiameng.com\n51jiang.com\n51jianxie.com\n51jiaoxi.com\n51jiecai.com\n51jiemeng.com\n51jingying.com\n51jinkang.com\n51jishu.com\n51jiuhuo.com\n51job.com\n51jobapp.com\n51jobcdn.com\n51jobdns.com\n51js.com\n51jt.com\n51jucaimi.com\n51juhe.com\n51jujibao.com\n51julebu.com\n51junde.com\n51junshi.com\n51kanmanhua.com\n51kanong.com\n51kaola.net\n51kaowang.com\n51kaxun.com\n51kehui.com\n51kf100.com\n51kids.com\n51kik.com\n51kim.com\n51kshen.com\n51kt.com\n51kuaizhuan.com\n51kupin.com\n51kywang.com\n51la.ink\n51la.net\n51labour.com\n51laibei.com\n51laiqiang.com\n51langtu.com\n51laohe.com\n51ldb.com\n51ldzx.com\n51lepai.com\n51lesheng.com\n51lg.com\n51lingji.com\n51link.com\n51liucheng.com\n51losangeles.com\n51lucy.com\n51lxrc.com\n51lzr.com\n51mag.com\n51maiquan.com\n51marryyou.com\n51mch.com\n51mdd.com\n51mdq.com\n51meeting.com\n51meigu.com\n51meiliao.com\n51meishu.com\n51miaoxin.com\n51microshop.com\n51miduoduo.com\n51miit.com\n51minsheng.com\n51miz.com\n51mmt.com\n51mnq.com\n51mo.com\n51mochu.com\n51mockup.com\n51mokao.com\n51mole.com\n51moot.net\n51mpa.net\n51mrp.com\n51msc.com\n51mta.com\n51niux.com\n51nod.com\n51nwt.com\n51offer.com\n51open.net\n51opone.com\n51ops.com\n51p.co\n51panhuo.com\n51papers.com\n51passion.com\n51peptide.com\n51pgzs.com\n51photo.vip\n51php.com\n51piao.com\n51piaohua.com\n51pibu.com\n51pigai.com\n51ping.com\n51pinwei.com\n51pla.com\n51pocket.com\n51pocket.net\n51poll.com\n51pos.com\n51pot.com\n51poweron.com\n51pptmoban.com\n51psj.com\n51puer.com\n51qc.com\n51qc.net\n51qianduan.com\n51qianguo.com\n51qianvisa.com\n51qicheng.com\n51qingjiao.com\n51qixing.net\n51qqt.com\n51qtg.com\n51qub.com\n51qudao888.com\n51qumi.com\n51quzhe.com\n51race.com\n51rc.com\n51read.site\n51recovery.com\n51relaw.com\n51rencai.com\n51render.com\n51renpin.com\n51rich.net\n51rong.com\n51room.com\n51rp.com\n51rry.com\n51rumo.com\n51rxzc.com\n51rz.org\n51sai.com\n51sanhu.com\n51sao.net\n51school.com\n51scw.net\n51sdj.com\n51sdx.com\n51search.net\n51seer.com\n51select.com\n51self.com\n51selling.com\n51sgg.cc\n51share.net\n51shashiji.com\n51shebao.com\n51shengxue.com\n51shenzhouyun.com\n51sheyuan.com\n51shizhi.com\n51shop.ink\n51shoubei.com\n51shoufei.net\n51shoushi.com\n51shubiao.com\n51shuobo.com\n51shyc.com\n51signing.com\n51sjht.com\n51sjm.com\n51sjsj.com\n51sjyx.com\n51sole.com\n51soulou.com\n51speeds.com\n51spjx.com\n51ssl.com\n51ste.com\n51sucaiyuan.com\n51suitui.com\n51sutong.com\n51sytx.com\n51szhk.com\n51taifu.com\n51talk.com\n51talkenglish.com\n51tanbao.com\n51tao.com\n51taonan.com\n51taoshi.com\n51taoshi.org\n51taowei.com\n51taoyang.com\n51tas.com\n51tb.me\n51tbox.com\n51test.net\n51testing.com\n51testing.net\n51testing.org\n51tgb.com\n51tiancai.com\n51tiangou.com\n51tie.com\n51tietu.net\n51tijian.com\n51tingyi.com\n51tiqianle.com\n51tjhr.com\n51togic.com\n51tonglu.com\n51tools.info\n51touch.com\n51toufang.com\n51tour.com\n51touxiang.com\n51toys.store\n51tra.com\n51tracking.com\n51trust.com\n51tuiyi.com\n51tunhuo.com\n51tv.com\n51tv.net\n51tvbao.com\n51tvrom.com\n51txapp.com\n51tys.com\n51tyty.com\n51tz.com\n51u.co\n51uc.com\n51ukf.com\n51uyi.com\n51vhost.net\n51vimeo.com\n51vip.biz\n51vv.com\n51vv.net\n51vv2.com\n51w.co\n51wangdai.com\n51wangming.com\n51wangpi.com\n51wanquan.com\n51wanxue.com\n51wcad.com\n51wcity.com\n51web.com\n51weblove.com\n51websec.com\n51weihu.com\n51weishi.com\n51weitao.net\n51wendang.com\n51wenzy.com\n51wf.com\n51wincai.com\n51windows.net\n51wj.com\n51wnl-cq.com\n51wnl.com\n51world.win\n51wp.com\n51wtp.com\n51wxjz.com\n51wydj.com\n51wyfl.com\n51wzg.com\n51wzxz.com\n51xbx.com\n51xcr.com\n51xcrc.com\n51xiancheng.com\n51xianwan.com\n51xiaolu.com\n51xingjy.com\n51xinhu.com\n51xinyuan.com\n51xnj.com\n51xuanmu.com\n51xuanxiao.com\n51xuanzhu.com\n51xue8.com\n51xuediannao.com\n51xuetang.com\n51xuetongxin.com\n51xuexiaoyi.com\n51xxsp.com\n51y5.com\n51y5.net\n51yabei.com\n51yajk.com\n51yanwang.com\n51yes.com\n51yey.com\n51yhdai.com\n51yhgj.com\n51yhzp.com\n51yidun.com\n51yilu.com\n51ying.net\n51yip.com\n51ykb.com\n51ymxc.com\n51ynedu.com\n51yonggao.com\n51you.com\n51youdian.com\n51yougo.com\n51youpin.com\n51youth.com\n51ys.com\n51ytg.com\n51yuansu.com\n51yuepin.com\n51yueqian.com\n51yugou.com\n51yund.com\n51yundong.me\n51ywx.com\n51yxcyy.com\n51yxky.com\n51yxwz.com\n51zan.com\n51zd.net\n51zghbh.com\n51zhangdan.com\n51zhantai.com\n51zheduoduo.com\n51zhi.com\n51zhishang.com\n51zhituwang.com\n51zhizhao.com\n51zhucai.com\n51zixiu.com\n51zjedu.com\n51zjxm.com\n51zmt.net\n51znt.com\n51znyx.com\n51zr.com\n51zsb.net\n51zsjc.com\n51ztzj.com\n51zwd.com\n51zx.com\n51zxw.net\n51zywl.com\n51zyzy.com\n51zzl.com\n51zzyjs.com\n52-ic.com\n52.vip\n520.com\n520.net\n5200tv.com\n520101.com\n520520520520520.com\n520730.com\n520740.com\n520810.xyz\n52091w.com\n520cc.com\n520cfc.com\n520chs.com\n520code.net\n520diandu.com\n520gexing.com\n520hello.com\n520hhht.com\n520homo.com\n520hspfb.com\n520im.com\n520it.com\n520lbl.com\n520link.com\n520love520.com\n520lpy.com\n520mingmei.com\n520mojing.com\n520ok.net\n520qr.net\n520switch.com\n520touxiang.com\n520txtba.com\n520way.com\n520xiazai.com\n520xp.com\n520xy8.com\n520yidui.com\n520zc.com\n520zg.net\n5210601.com\n52112.com\n5211game.com\n521251212122.icu\n52161.org\n52177.com\n521799.xyz\n521dayu.com\n521g.com\n521led.com\n521logo.com\n521qw.com\n521u.com\n521up.com\n521watch.com\n521xunlei.com\n52237377.com\n522de.com\n522gg.com\n523333.com\n52372.com\n5238333.com\n52393.com\n523c8cb891010.beer\n523touzi.com\n52419.net\n524399game.com\n525.life\n525069.com\n5251.net\n5251yx.com\n52524118.com\n5252b.com\n5253.com\n525566.com\n5258.net\n5258da.com\n525zb.com\n526183.com\n526266.com\n526537.xyz\n52676.com\n5269120.com\n526net.com\n527100.com\n52733999.com\n5277.com\n527fgame.com\n527ice.com\n527meeting.com\n527ss.com\n528045.com\n5281.net\n52841819.com\n528500.com\n528529.com\n52892.com\n528day.com\n5293.com\n52969.com\n52ai.com\n52ali88.com\n52alipay.com\n52aoteman.com\n52appok.com\n52asus.com\n52audio.com\n52bar.com\n52bishe.com\n52bjd.com\n52bji.com\n52bjy.com\n52blog.net\n52bluetooth.com\n52bus.com\n52bwg.com\n52by.com\n52caiyuan.com\n52car.net\n52ce.com\n52ch.net\n52cha.com\n52che.com\n52cik.com\n52ckd.com\n52click.net\n52cmajor.com\n52cnp.com\n52cnw.net\n52code.store\n52codes.net\n52cv.com\n52da.com\n52dangong.com\n52debug.net\n52design.com\n52desk.com\n52dian.com\n52dianbo.com\n52digua.com\n52dmtp.com\n52doc.com\n52dsy.com\n52dtv.com\n52dus.com\n52duzhe.com\n52dy.tv\n52dyy.com\n52dzxy.com\n52edns.com\n52edy.com\n52enku.com\n52eshu.com\n52etf.site\n52fangzi.com\n52fanxing.com\n52feijuba.com\n52fzwg.com\n52gaoge.com\n52gaoxiao.com\n52gg.com\n52ggd.com\n52gongju.net\n52grz.com\n52guzhuang.com\n52gvim.com\n52hardware.com\n52hb.com\n52hbl.com\n52hejia.com\n52help.net\n52hotel.net\n52hrtt.com\n52hrttpic.com\n52huaqiao.com\n52hwl.com\n52hxw.com\n52hyjs.com\n52ig.net\n52im.net\n52investing.com\n52inwet.com\n52ios.xyz\n52itstyle.vip\n52jdyy.com\n52jianpan.com\n52jiaoshi.com\n52jiaozhou.com\n52jiawei.com\n52jingsai.com\n52jinhu.com\n52jisu.com\n52jj.net\n52jrjy.com\n52js8.com\n52jscn.com\n52jubensha.com\n52juqingba.com\n52jxrc.com\n52jxt.com\n52kan.vip\n52kanxiaoshuo.com\n52kd.com\n52kejian.com\n52kfly.com\n52leho.com\n52liaoshen.com\n52liezheng.com\n52life.cc\n52linglong.com\n52lion.com\n52luohu.com\n52lvyou.com\n52m.co\n52mac.com\n52magic.net\n52maicong.com\n52mba.com\n52meirong.com\n52mengdong.com\n52met.com\n52mhw.com\n52miji.com\n52mip.com\n52ml.net\n52mqbiao.com\n52mtc.com\n52muban.com\n52muyou.com\n52mvp.com\n52nantong.net\n52niuka.com\n52njl.com\n52nyg.com\n52pcfree.com\n52photo.com\n52pht.com\n52pi.com\n52pi.net\n52pictu.com\n52pk.com\n52pk.net\n52pkvr.com\n52playgame.com\n52pojie.com\n52post.com\n52ppt.com\n52qixiang.com\n52qmct.com\n52queji.com\n52qumao.com\n52qupu.com\n52ra3.com\n52ranwen.net\n52rd.com\n52rental.com\n52rsjy.com\n52ruodian.com\n52samsung.com\n52shanghe.com\n52shangou.com\n52shehua.com\n52shici.com\n52shihu.com\n52shipping.com\n52shuw.cc\n52shuxue.com\n52solution.com\n52songshu.com\n52souluo.com\n52suda.com\n52survey.com\n52svip.cc\n52swine.com\n52t1.com\n52tc.co\n52tc.info\n52tesla.com\n52tgfc.com\n52thing.com\n52tian.net\n52tiny.com\n52tong.com\n52toolbox.com\n52toys.com\n52tps.com\n52tt.com\n52tup.com\n52tzs.com\n52udl.com\n52uhs.com\n52vps.com\n52w.co\n52wana.com\n52wanh5.cc\n52wenku.com\n52wlw.com\n52wmb.com\n52wower.com\n52wubi.com\n52xcyx.com\n52xianbao.com\n52xiaoshuowang.com\n52xie.com\n52xitong.com\n52xiuxian.com\n52xiyou.com\n52xsj.com\n52xuexi.net\n52xz.com\n52yawa.com\n52ybcj.com\n52yh.com\n52yitian.com\n52ykjob.com\n52youbian.com\n52youju.com\n52youpiao.com\n52youtu.com\n52yq.com\n52yushi.com\n52yuwan.com\n52ywan.com\n52yxyx.com\n52yyxk.com\n52z.com\n52zhaopin.com\n52zhifu.com\n52zixue.com\n52zjkj.com\n52zx.net\n52zxw.com\n52zy.com\n5306.com\n5308999.com\n53155.vip\n531pool.com\n532106.com\n53233.org\n532588.com\n533.com\n53326.com\n5334.com\n5338.org\n533y.com\n53431.com\n5345.com\n53471.com\n534d73a9411032.beer\n535fs.com\n535v.com\n5366.com\n5367.com\n5368111.com\n537300.com\n53797.vip\n537images20.com\n537images22.com\n537images41.com\n537images42.com\n537images45.com\n537images47.com\n5385s.com\n538618.com\n538a9b8b890bff34.com\n53920.net\n5395.com\n53957.tw\n53981.org\n539831.vip\n5399.com\n53af08566e5d84ef.com\n53ai.com\n53c0083250a165d1.com\n53chewu.com\n53dns.com\n53dns.net\n53dns.org\n53ee.com\n53info.com\n53iq.com\n53kf.com\n53miji.com\n53museum.org\n53nic.com\n53q517g14c.world\n53shop.com\n53shubiao.com\n53site.com\n53wan.com\n53win555.com\n53wy.com\n53xjd.com\n53yu.com\n53zaixian.com\n53zw.net\n54.com\n54.net\n5401da8c911031.beer\n5406622.com\n5406633.com\n540734621.xyz\n54114.com\n5414050.com\n5414900.com\n54268.com\n5433.com\n54391.com\n54406c82bf7d5705.com\n5442.com\n544521.xyz\n544e5adac11012.beer\n54540333.com\n54543.org\n545c.com\n546709.cc\n5467b.vip\n54780.org\n54948888.vip\n5499.com\n5499ok.com\n54ak.com\n54b03611f10271.beer\n54banana.com\n54benniao.com\n54doctor.net\n54doctors.net\n54dr.com\n54hcz.com\n54heb.com\n54im.com\n54jkw.com\n54job.com\n54kefu.net\n54ks.com\n54lol.com\n54maimai.com\n54md.com\n54mdown.com\n54op.com\n54pictu.com\n54traveler.com\n54tup.com\n54watch.com\n54xiaoshuo.com\n54young.com\n54youshi.com\n54yt.net\n54yuqing.com\n55.cc\n55.com\n55.la\n5500w.com\n550400.com\n550416.com\n5508.net\n5509.cc\n550d93f291021.beer\n5510928.com\n55114008.com\n551144.com\n55188.com\n55188.net\n551d811bb4ddf283.com\n5525game.com\n553356.com\n55344.com\n554030cc.com\n554488.com\n5548.net\n554baad62c869a7b.com\n55555.ink\n55555.io\n55555432.com\n55555558.com\n5555622ab0.shop\n5559000ab0.shop\n5559000ab7.shop\n555abc222abc.com\n555abc777abc.com\n555edu.net\n555tg6s98w9d8sw.com\n555yst.com\n5566.net\n5566292.com\n5566362.com\n5566592.com\n5566596.com\n5566752.com\n5566975.com\n5566ua.com\n5567.me\n556z.com\n557.net\n55726zubo56686.com\n55749.net\n557666a.com\n5577.com\n5577169.com\n5577411.com\n5577552.com\n5577690.com\n5577758.com\n5577860.com\n5577865.com\n5577937.com\n5577943.com\n5577956.com\n558.com\n5588.tv\n5588294.com\n5588492.com\n5588bet.com\n558idc.com\n559.cc\n55935.vip\n5595.cc\n5599.com\n5599.net\n5599785.com\n55b5f319e26f3e37.com\n55bbs.com\n55d0548671023.beer\n55d32c2b010271.beer\n55dai.com\n55dian.com\n55doc.com\n55duanzi.com\n55dushu.com\n55e5.com\n55g.cc\n55haitao.com\n55hike.com\n55hl.com\n55hl.net\n55ht5hn.shop\n55i8.com\n55idc.com\n55it.com\n55jisu.com\n55kantu.com\n55la.com\n55lu.com\n55r5.com\n55shantao.com\n55tour.com\n55tuan.com\n55y.cc\n55y5.com\n55zhoucheng.com\n55zs.com\n56.com\n560.im\n56015.com\n5606968d01021.beer\n56099443.com\n560e.com\n560wf.com\n5611.com\n56114.com\n56135.com\n56156.com\n5618.co\n5629.com\n56360.com\n564.cc\n564253a9b11042.beer\n56456c9fa1013.beer\n5648.cc\n56506666.com\n5654.com\n565656.com\n565882.com\n56597.vip\n566job.com\n566zhibo.com\n567.org\n567030.com\n56711.com\n567909.xyz\n567idc.com\n568.com\n5684.com\n5684t.net\n56851.net\n56885.net\n569.com\n5694.com\n56a.com\n56ad2ddadaebfb59.com\n56ads.com\n56beijing.org\n56bid.com\n56c.co\n56care.com\n56che.com\n56cheng.com\n56cheng.vip\n56china.com\n56clte.org\n56dagong.com\n56dichan.com\n56dq.com\n56dr.com\n56dr.net\n56dt.com\n56dz.com\n56ggb.com\n56gk.com\n56hb.com\n56home.org\n56idc.com\n56img.com\n56img.net\n56imgs.com\n56jg.com\n56join.com\n56kad.com\n56laile.com\n56linked.com\n56md.com\n56ml.com\n56mp.com\n56products.com\n56qq.com\n56shangpu.com\n56show.com\n56shuku.org\n56sing.com\n56steel.com\n56tchr.com\n56tim.com\n56tj.com\n56tv.org\n56uu.com\n56xiniao.com\n56ye.net\n56yun.com\n56zhibo.com\n57.net\n57017.work\n57023.com\n5707777.com\n571400.net\n571xz.com\n57357.vip\n574e313cc10272.beer\n5755.com\n57573zubo36833.com\n576.com\n57608.com\n5760x.com\n57648.com\n57665.com\n57676.com\n576tv.com\n57781.vip\n57781057.com\n577job.com\n57821.com\n57875.vip\n579666.com\n579idc.com\n57auto.com\n57bm.com\n57class.net\n57df3696bffd3eb4.com\n57dp.com\n57go.com\n57mail.com\n57px.com\n57qy.com\n57sh.com\n57tbs.com\n57tc.net\n57tibet.com\n57tuan.com\n57us.com\n57uu.com\n57www.com\n57yy.site\n57zhe.com\n58.com\n5800.com\n580114.com\n580168.com\n580590.com\n5805c102b11021.beer\n58091.xyz\n580ban.com\n580dns.com\n580eda.net\n580jz.net\n580k.com\n580tequan.com\n5811x.com\n58142404237055.icu\n58153.xyz\n58188.com\n58199.com\n582116.com\n58232.vip\n582hr.com\n583316.com\n583go.com\n58416.org\n5858.com\n5858xs.com\n58611.net\n58620888.com\n5866.com\n5867yh.com\n586jz.com\n587.cc\n58738.org\n587image.com\n5884.com\n588589.com\n5888.tv\n588fb105cf2606b5.com\n588ku.com\n588tao.com\n588yw.com\n588z.com\n5898yun.com\n58abb.com\n58antenna.com\n58auv.com\n58bd0ad4222284cf.com\n58bh.com\n58buy.com\n58chaiyou.com\n58che.com\n58cloud.com\n58coin.com\n58corp.com\n58dadi.com\n58daojia.com\n58demo.com\n58display.com\n58dns.me\n58dns.org\n58eventer.com\n58fkb.com\n58food.com\n58game.com\n58ganji-corp.com\n58ganji.com\n58ghost.com\n58hua.com\n58ib.com\n58iclick.com\n58insure.com\n58iwan.com\n58izl.com\n58jb.com\n58jixie.com\n58jmw.com\n58kad.com\n58kuaipai.com\n58kuku.com\n58lingshi.com\n58lovepet.com\n58meeting.com\n58mhg.com\n58moto.com\n58peilian.com\n58pic.com\n58pxe.com\n58q.org\n58q8.com\n58qz.com\n58shangban.com\n58supin.com\n58tg.com\n58trz.com\n58ubk.com\n58uxd.com\n58wan.com\n58wangwei.com\n58wanwan.com\n58wuji.com\n58xinghuo.com\n58xinrui.com\n58xs.com\n58xs.la\n58xueche.com\n58xuexi.com\n58yaoji.com\n58yiji.com\n58youtui.com\n58youxi.com\n58yuesao.com\n58z.net\n59.com\n5909.net\n590m.com\n59120.com\n591237.com\n59139.com\n59168.net\n59178.com\n5918656.com\n5918dyw.com\n591918.com\n591con.com\n591hx.com\n591master.com\n591moto.com\n591moto.net\n591mrzx.com\n591syd.com\n591wsh.com\n591wy.com\n591yhw.com\n592163.com\n59220ab771010.beer\n59232.org\n5923d.com\n592bet5.com\n592zn.com\n59370.com\n5945i.com\n595.bet\n595.cc\n59519.com\n5956777.com\n595818.com\n5959.vip\n5959068.com\n5959366.com\n5959510.com\n5959536.com\n5959540.com\n59598.com\n595dlxzbanone.com\n595image.com\n595image.vip\n595led.com\n596fc.com\n597.com\n597guilin.com\n597mm.com\n597rcw.com\n59852.vip\n59888888.xyz\n599.com\n59958b.com\n5999.tv\n59b1a9d9d1010.beer\n59b2b.com\n59baike.com\n59bf02cb03a7fbbb.com\n59dead1ce10301.beer\n59dun.com\n59f086f4910311.beer\n59f35373bf3f8e7d.com\n59ff599661017.beer\n59hi.com\n59iedu.com\n59iwh.com\n59jt.com\n59med.com\n59ni.com\n59pk.net\n59rj.com\n59store.com\n59w.net\n59wanmei.com\n59wj.com\n59yx.com\n5a1eacf0110241.beer\n5a6fed2321010.beer\n5a8.org\n5a828d12510272.beer\n5a8878b99c8f9160.com\n5a8a3d1d111021.beer\n5a9bf3726d2b09fa.com\n5aa212657a354b3e.com\n5aaa.com\n5acbd.com\n5adanci.com\n5adanhao.com\n5afc70ef010251.beer\n5ag.net\n5aivideo.com\n5aixia.com\n5aiyoo.com\n5ajob.com\n5any.com\n5aq.net\n5auto.net\n5axxw.com\n5b1c73dc010311.beer\n5b2b697bd748d07b.com\n5b39c2f791014.beer\n5b3znjecy.cfd\n5b529d4e711021.beer\n5ba6319c311011.beer\n5baike.com\n5ber.com\n5bite.com\n5biying.com\n5bjm.com\n5c407acb510301.beer\n5c554118a1021.beer\n5c84i.net\n5cb69e8045837fa9.com\n5ccic.com\n5cda.com\n5ce.com\n5ce08adc68995a7a.com\n5ceimg.com\n5cgo.com\n5cpod.com\n5d.ink\n5d116d676087d0e8.com\n5d170bdbce0cbe9b.com\n5d2ede2.com\n5d6d.com\n5d6d.net\n5d770c50c1016.beer\n5d7bcbb1a1022.beer\n5dao.cc\n5dashi.com\n5dc0af35081be08e.com\n5ddd.com\n5dfp.com\n5dfsd2.com\n5dgz.com\n5ding.com\n5dmail.net\n5dplay.net\n5ds.com\n5e17f526411011.beer\n5e17fc2cca2967e2.com\n5e2fd110b10301.beer\n5e40004d710251.beer\n5eaf8fd6c1024.beer\n5earena.com\n5earenacdn.com\n5eplay.com\n5eplaycdn.com\n5er0.com\n5etv.com\n5etz.com\n5ewin.com\n5f28dfaae1016.beer\n5f36b4f39ba574b7.com\n5f52903c110251.beer\n5f69826526db4f44.com\n5f9e6b1603f69b9b.com\n5fa26ed6d1024.beer\n5fen.com\n5fo.org\n5fun.com\n5fwan.com\n5g-smart.com\n5gcdnx.com\n5gh.com\n5gjoy.com\n5guanjianci.com\n5gwan.com\n5gxsd.com\n5gxt.com\n5gy.com\n5gzm.net\n5h.com\n5had0w.com\n5hffr1p22j.com\n5hoom.com\n5hte21mz.com\n5i.com\n5i366.com\n5i591.com\n5i5aj.com\n5i5j.com\n5i5t.com\n5i65.com\n5i9u.com\n5iag.com\n5iag.net\n5iape.com\n5ibear.com\n5ibug.net\n5icbs.com\n5ich.net\n5ichecker.com\n5ichong.com\n5icool.com\n5idc.com\n5idev.com\n5idhl.com\n5idream.net\n5iec.com\n5iecity.com\n5iexpress.com\n5ifapiao.com\n5ifit.com\n5iflying.com\n5ifund.com\n5igcc.com\n5igcw.com\n5iggci.com\n5igupiao.com\n5igzw.com\n5ihuish.com\n5iidea.com\n5ijk.net\n5ikang.com\n5iliao.com\n5ilog.com\n5ilr.com\n5ilrc.com\n5iluying.com\n5imeishi.com\n5imomo.com\n5imusic.com\n5imx.com\n5imxbbs.com\n5iops.com\n5ip9.com\n5ipatent.com\n5ipkwan.com\n5isanguo.com\n5isohu.com\n5iucn.com\n5iweix.com\n5iximai.com\n5ixuexiwang.com\n5iyoule.com\n5iyq.com\n5iyuyan.com\n5izzy.com\n5j.com\n5jingcai.com\n5jinzhishu.com\n5jjdw.com\n5jli.com\n5jue.com\n5jwl.com\n5k.work\n5k58.com\n5k5m.com\n5kaixin.net\n5kbox.com\n5kcrm.com\n5kcrm.net\n5kda.com\n5khouse.com\n5kmw.com\n5kwuke.com\n5lanren.com\n5lu.com\n5lux.com\n5m5m5m.com\n5mapk.com\n5mu.com\n5nd.com\n5nexus.com\n5nnj.com\n5o.com\n5ooq.com\n5opzl.com\n5opzl.net\n5pao.com\n5pb.net\n5pk.com\n5plus1.net\n5pub.com\n5q.com\n5qwan.com\n5qzone.net\n5r1.net\n5radar.com\n5rc.com\n5read.com\n5rfh44h5.cc\n5ring.com\n5ritt.com\n5rs.me\n5s4f.com\n5s5j.com\n5s886.com\n5seals.com\n5see.com\n5sem.com\n5sha.com\n5shubook.com\n5snow.com\n5sw.com\n5t6t.com\n5tangs.com\n5teacher.com\n5th.zone\n5thhospital.com\n5thspace.net\n5tmobi.com\n5tmovice.com\n5tqjogo.com\n5u18.com\n5u3d.com\n5u5u5u5u.com\n5uchina.com\n5ul.com\n5umao.com\n5upm.com\n5usport.com\n5uu8.com\n5uyk.com\n5v13.com\n5w123.com\n5w5.com\n5w52.com\n5w5w.com\n5waihui.com\n5wanpk.com\n5wapp.com\n5web.site\n5wx.org\n5wxw.com\n5wyxi.com\n5x54.com\n5xcg.com\n5xiaobo.com\n5xini.com\n5xmjm.com\n5xyouse.com\n5y6s.com\n5yang.cc\n5ydj.com\n5yhua.org\n5ykj.com\n5you.cc\n5you.com\n5youchou.com\n5zai.com\n5zd.com\n5zg.com\n5zhr.com\n5zls.com\n5zw.com\n6-china.com\n6-u.com\n6.biz\n60.net\n600064.com\n600083.com\n600086.com\n6000feet.com\n600146.net\n600200.com\n600208.net\n600216.com\n6002255.com\n600280.com\n600282.net\n600496.com\n600576.com\n6006.xin\n600689.com\n600711.com\n600822sh.com\n600895.com\n600df970611031.beer\n600yj.com\n601book.com\n602.com\n602ab6ff810251.beer\n602img.com\n60301c31eca86940.com\n603027.com\n603603b.com\n603603d.com\n603966.com\n603ee.com\n60414.agency\n6044faac164dbe06.com\n6046.net\n605-zy.com\n605276655648.icu\n60582ce6688bd14e.com\n60593.com\n605dns.com\n605f40b0b174f4ea.com\n605zy.co\n60606161.com\n60608787.com\n60623.org\n6066888.com\n606b558d310281.beer\n6071.com\n6073168.com\n607images15.com\n607images16.com\n607images36.com\n607images40.com\n608.vip\n6080d.com\n60951.my\n609999.xyz\n60dj.com\n60kan.com\n60mil.com\n60nm.com\n60oa.com\n60qc.com\n60wr.com\n60yp.com\n61.com\n610115.com\n610213.net\n61029.com\n6103g.com\n6104.tv\n6112.com\n61165.com\n611qk.com\n611res.com\n612.com\n6122cec31dfe86dd.com\n612345.com\n612459.com\n614e697c5fb7c42a.com\n6153.cc\n61611.net\n616167.com\n6164.com\n61658.com\n61677.com\n6168511.com\n6169966.com\n616a191f21009.beer\n616pic.com\n616wan.com\n6186.com\n6187wo.com\n6188.net\n6188cnc.com\n618bg.com\n618cj.com\n618day.com\n618hr.com\n618ky.com\n618tech.com\n618waihui.com\n61916.com\n61916.net\n61977.center\n61baobao.com\n61bb.com\n61bbw.com\n61cloud.net\n61diy.com\n61draw.com\n61ertong.com\n61gequ.com\n61hd.net\n61hr.com\n61ic.com\n61info.com\n61k.com\n61kezhan.com\n61mc.com\n61ok.com\n61psy.com\n61sheji.com\n61sou.com\n61tg.com\n61thi77ewg.com\n62.vip\n6202.com\n62115.com\n62126tt.com\n62212366.com\n6222251.com\n62456e3303420792.com\n624down.com\n62609e25011021.beer\n6266.cc\n62669.com\n626x.com\n628.com\n6285s.com\n62923.vip\n629973.com\n62ca01745cf46371.com\n62d6797ca064d36c.com\n62ddccc8810301.beer\n62dns.com\n62game.com\n62l.net\n62wy.com\n6300.net\n630book.cc\n630book.co\n630book.com\n630read.com\n630zw.org\n631r.xyz\n632121d3c4f46e67.com\n63243.com\n632news.com\n63329.pet\n6333.tv\n6334x.com\n633586c05c8f4543.com\n634.ag\n634d.com\n634image.com\n634image.vip\n6360.com\n6373.com\n63744c3e410292.beer\n637600.com\n6380.org\n6383.com\n638300.com\n6385844.com\n63860.vip\n639311.com\n63936b71f3e4ab6a.com\n6397869a4eb51a13.com\n63a795836312c99d.com\n63b4ff1aeff2818d.com\n63cj.com\n63fl.com\n63pe.com\n63u.net\n63yx.com\n63yy.com\n6406.org\n640640.com\n641.com\n642online.com\n64365.com\n644446.com\n64504.com\n645250.net\n6453.net\n64538.net\n646000.com\n6463.com\n64644444.com\n64783333.com\n648sy.com\n64dns.com\n64foot.com\n64gua.com\n64ma.com\n64mv.com\n64pay.com\n6501111.com\n65119.com\n651700.com\n652ebb57a11021.beer\n653697e101020.beer\n654320.com\n6543210.com\n654321wan.com\n655u.com\n655yx.com\n65601111.com\n656126.com\n65650000.com\n656gate.com\n658.com\n65875.com\n659595.com\n65993zubo26633.com\n65b01705c10261.beer\n65bb2d6d81010.beer\n65box.com\n65dataranking.com\n65ec0ea7f04562ad.com\n65liuxue.com\n65mhxy.com\n6600.org\n66016.com\n660378.com\n6605oo.com\n66083797.com\n660pp.com\n66123123.com\n66152.com\n66168.net\n6617.com\n66173yx.com\n662city.com\n662p.com\n66301cc.com\n6633102.com\n6633488.com\n6633696.com\n663661.com\n6636yy.com\n66378.com\n66388.net\n663jx.com\n66445.org\n66446200.com\n66460.com\n664e4037310291.beer\n6655.com\n6655.la\n6655304.com\n66580.com\n665888j.com\n665888s.com\n6660333.com\n666127.xyz\n666291.xyz\n6665.com\n666532.xyz\n666546.xyz\n666548.xyz\n66661s.com\n6666343ac4.shop\n6666519.net\n66665s.com\n66666.host\n666666.host\n6666m.vip\n6666ppt.com\n6666sa.com\n6666xsw.com\n6668dns.com\n6669832.com\n666bos.com\n666gps.com\n666idc.com\n666kuaishou.com\n666kuaishou.net\n666pic.com\n666post.com\n666scly.com\n666shuwu.com\n666wan.com\n666wan.net\n666wx.cc\n666xinxin.com\n66701288.com\n66747.org\n6677243.com\n667744.com\n6677cq.com\n667f46342ace5437.com\n66825.com\n668559.com\n6686.com\n6686a9.com\n6686x5.com\n6686x8.com\n6688.com\n668app.com\n668cdn.cc\n668cdn.xyz\n668lw.com\n668map.com\n668wan.com\n669167d4fc316421.com\n66930909.com\n669322.com\n6695.com\n66988.tv\n6699.fun\n6699129.com\n6699301.com\n6699343.com\n6699407.com\n6699408.com\n6699496.com\n6699497.com\n6699758.com\n6699784.com\n6699804.com\n6699811.com\n6699848.com\n6699873.com\n669cd3a3ea61d96f.com\n669pic.com\n669play.com\n669ye.com\n669zw.com\n66brl.com\n66c970e7e1011.beer\n66call.com\n66cn.com\n66ddf809c0cc0fb1.com\n66ds.net\n66good.com\n66han.com\n66huigo.com\n66ika.com\n66in.net\n66jiedai.com\n66l.cc\n66laws.com\n66mi.com\n66mobi.com\n66money.com\n66mz8.com\n66n.co\n66nao.com\n66nh.com\n66park.net\n66perfect.com\n66play.com\n66rjz.com\n66rom.com\n66rou.com\n66rpg.com\n66ruian.com\n66shouyou.com\n66sj.com\n66sy.com\n66team.com\n66to.net\n66ui.com\n66v.net\n66wc.com\n66web.com\n66weiyou.com\n66wmw.com\n66wz.com\n66xue.com\n66y.com\n66you.com\n66yyba.com\n66zhang.com\n66zhizu.com\n66zhuang.com\n67.com\n67017.com\n670e13a8f11042.beer\n6711.com\n6711img.com\n671845093759368.icu\n672m1z9ogj.world\n67318n.com\n674da9a521017.beer\n6758169ad1020.beer\n67623.com\n676z.com\n677.com\n677.vip\n6771112.com\n678119.com\n6786666.com\n6787.com\n67876.com\n6788888.net\n6789.net\n6789che.com\n6789g.com\n6789sm.com\n678cn.com\n678edu.net\n678ie.com\n678py.com\n678vr.com\n67921547311681.icu\n67a38421b10281.beer\n67a4488e31017.beer\n67az.com\n67cha.com\n67f4951a0c77434d.com\n67it.com\n67joy.com\n67mo.com\n67tool.com\n67wanwan.com\n67wx.com\n67y.com\n68.com\n68.gy\n68.vip\n680.com\n68120120.com\n6816.com\n682.com\n68211.com\n6822.com\n68287zubo85737.com\n682891.com\n682ff8a9c89d5d88.com\n6832123.com\n6840011.com\n6844.com\n685462.com\n68596e90010311.beer\n68606060.com\n68659061.com\n6868shop.com\n6868yx.com\n68716871.com\n68792999.com\n688539.com\n6887cc57c10251.beer\n6888.ee\n6888.tv\n688dns.com\n688mob.com\n688wz.net\n68955.com\n68978.net\n6899wan.com\n68apk.com\n68bbq.com\n68china.net\n68design.net\n68e5fc2c1344afb8.com\n68ecshop.com\n68gainian.com\n68h5.com\n68hanchen.com\n68hlw.com\n68hr.com\n68jcw.com\n68ke.com\n68mall.com\n68play.com\n68sign.com\n68team.com\n68u.co\n68web.net\n68websoft.com\n68zhan.net\n69090.com\n6912s.com\n6917.com\n69216.blog\n69260.com\n692657.com\n693.com\n6934.net\n693836.com\n693975.com\n69478.com\n695157.com\n695175.com\n69525.com\n695275.com\n695828.com\n695ljg.com\n696.cool\n696157.com\n69698689.com\n696b333851010.beer\n697e43da249f79cd.com\n698wan.com\n69916666.com\n699333.xyz\n69981.com\n699h5.com\n699pic.com\n69fd4a3dbd02f66c.com\n69g.com\n69hr.com\n69mok.com\n69shu.org\n69shuba.cc\n69tianqi.com\n69xiu.com\n69yc.com\n69ys.com\n69zw.com\n6a221afdbbe2d2e5.com\n6a2e6e54178e45a3.com\n6a3ad24293be062d.com\n6a4126ebcf94c39d.com\n6a8a.com\n6aas.com\n6ab81d83f7d83dbe.com\n6adj.com\n6an8.com\n6api.net\n6apt.com\n6b1813f5210261.beer\n6b3b.com\n6b3cfa277bae3b4b.com\n6b786q3e.work\n6bac9d15d10271.beer\n6bbk.com\n6bdns.com\n6c0f63385ed13b89.com\n6c6c.com\n6c7ccba3e11031.beer\n6cit.com\n6cmap.com\n6cnzz.com\n6d4d5.com\n6d4g.com\n6d576388add270c5.com\n6d63d3.com\n6d7d.com\n6d888.com\n6dan.com\n6dbx.com\n6dcg.com\n6de7eb04410311.beer\n6dfefa7039812445.com\n6diy.com\n6ds.me\n6du.in\n6duoyu.com\n6e212121910292.beer\n6e8a225320471153.com\n6e8fe57151019.beer\n6eat.com\n6edigital.com\n6ef102d0210261.beer\n6f25df38a10291.beer\n6f7b51b741014.beer\n6f8b82f9fbb439db.com\n6fast.com\n6fcsj.com\n6fe7c9d291017.beer\n6ff6313e475a7a32.com\n6fm4dcpj31.com\n6g5fd1a.com\n6gh4.com\n6ght.com\n6glz.com\n6h979.com\n6hd0hoc.com\n6hgame.com\n6hudong.com\n6huo.com\n6hwan.com\n6ict.com\n6ie6.com\n6ifang.com\n6juzi.com\n6jyi7mzae.com\n6jz.com\n6k11.com\n6k6g.com\n6k9k.com\n6ke.com\n6kw.com\n6kwan.com\n6kxz.com\n6laohu.com\n6li.com\n6lk.net\n6ll.com\n6lrt.com\n6ls.cc\n6m5m.com\n6miu.com\n6miu.net\n6my575.com\n6niu.com\n6nm6.com\n6our.com\n6p667.com\n6pctuhriw.com\n6pen.art\n6pifa.net\n6puppy.xyz\n6pzftj.com\n6r6992xeq1jho.cyou\n6ren.com\n6rencn.com\n6renyou.com\n6rooms.com\n6s4qki.com\n6s54.com\n6sfg.com\n6sq.net\n6t.com\n6t12.com\n6tcc.com\n6tennis.com\n6thhosp.com\n6tiantian.com\n6tie.com\n6tktrd.com\n6tt.com\n6tu.com\n6twrte12ft.com\n6uudy.com\n6v.com\n6v6.work\n6vdyg.com\n6wan.com\n6wtx.com\n6wwww.com\n6wz.co\n6x.studio\n6xcdn.com\n6xd.com\n6xigema.com\n6xiu.com\n6xw.com\n6yoo.com\n6young.site\n6yso.com\n6yxk.com\n6yxs.com\n6yyy7.com\n6z.net\n6z6z.com\n6ze.net\n6ziz.com\n6zu.com\n7-11bj.com\n7-che.com\n7-meeting.com\n7-mi.net\n7-vk.com\n7-wx.com\n70.cc\n70.net\n700618.com\n70098.com\n700chat.com\n700kan.com\n700live.com\n700megs.com\n700mh.com\n701.com\n703804.com\n70392.com\n70392.org\n70524.com\n706net.com\n707598.xyz\n707e518c610291.beer\n7080edu.com\n70822.com\n7089899.com\n7089dd.com\n7089gg.com\n70cq.com\n70dir.com\n70e.com\n70jj.com\n70ka.com\n70ppt.com\n70soft.com\n70ym.com\n70yx.com\n71.net\n7114.com\n7116.com\n7116dns.com\n711hospital.com\n711pr.com\n7120.com\n71360.com\n7139.com\n71390.com\n714.com\n714a0ffa611031.beer\n714b5653f10292.beer\n715083.com\n715288.com\n715300.com\n71556v.com\n71683.com\n71714.com\n7172737.com\n71757ae5f10241.beer\n7176.com\n717c.com\n717down.com\n718991.com\n71908.com\n7192.com\n719400.com\n719f06caf1017.beer\n71acg.com\n71acg.net\n71b394ce11114.beer\n71baomu.com\n71baomu.net\n71big.net\n71caigou.com\n71d7f1e121019.beer\n71dm.com\n71e.com\n71edge.com\n71edge.net\n71edge.work\n71elink.com\n71f68cc351015.beer\n71go.com\n71k.com\n71lady.com\n71p.net\n71tao.com\n71tech.com\n71txt.com\n71wl.com\n71wx.net\n71xe.com\n71xk.com\n72.com\n72017.net\n720582.com\n720health.com\n720static.com\n720think.com\n720ui.com\n720yes.com\n720yun.com\n720yuntu.com\n7210.com\n7211.com\n7214fa7e11011.beer\n72177.com\n7217kf2961.com\n721888.xyz\n72242s.com\n72257c.com\n72257e.com\n72257j.com\n72258q.com\n72287c.com\n72287h.com\n72287o.xyz\n7230.com\n7239ll.net\n723e7a5a510261.beer\n7245f7d6211012.beer\n724pride.com\n724pridecryogenics.com\n724pridetech.com\n72535276268b14e0.com\n7265a5ef31011.beer\n726p.com\n7273.com\n727380.com\n727d5e6cb1011.beer\n7280.com\n7291v.com\n7298.com\n72byte.com\n72ce.com\n72crm.com\n72crm.net\n72crm.org\n72d3bb672f4a6997.com\n72dj.com\n72dns.com\n72dns.net\n72e.net\n72en.com\n72g.com\n72gu.com\n72home.com\n72kjmb.com\n72la.com\n72max.com\n72qq.com\n72r.net\n72swk.com\n72whys.com\n72xit.com\n72xuan.com\n72y.co\n72yce.com\n72yun.com\n72zhan.com\n730d60bec10281.beer\n731.tv\n73110010.com\n7315297af11011.beer\n73232yx.com\n73261825f768447d.com\n732732.com\n73336zubo25326.com\n7337pay.com\n734969.com\n73573dd6a1023.beer\n7366cba131014.beer\n73676699.com\n737.com\n737698.xyz\n73789.com\n73850.org\n73864.org\n738888.xyz\n73925.work\n73980.org\n7399.com\n73bc.com\n73bt.com\n73card.com\n73d1708e01022.beer\n73ea00c7710272.beer\n73so.com\n73zw8.com\n74.com\n7415.com\n741b0fca410271.beer\n7428.net\n743forever.com\n7441a334d13a0000.com\n74478fd3b9cca85f.com\n744zy.com\n745998.xyz\n74615ee887a99dd7.com\n7474.com\n7477.com\n747wan.com\n749333.xyz\n74955.net\n74966.net\n74977.net\n74ad7537d1014.beer\n74cms.com\n74da6ad581020.beer\n74dns.com\n74f11ac633122c20.com\n74hao.com\n75.team\n75111.com\n75111.net\n75122d9a05f7a5a7.com\n751257.vip\n75184.com\n75271.com\n752d7cf9a8cd3341.com\n75367.com\n7543c79b410291.beer\n75510010.com\n756u.com\n7574.com\n75757.com\n7577.cc\n757dy.com\n7580.ltd\n7597af9ac1010.beer\n75982.com\n75a8f8759fc99775.com\n75b58faf61014.beer\n75d31e3ac62e6e53.com\n75g.co\n75ll.com\n75n474.com\n75pk.com\n75ww.com\n75xn.com\n76120.org\n7618.com\n761a.com\n7631.com\n7633sqw.com\n76474cf781f10d61.com\n7651.com\n766.com\n7663.com\n76676.com\n766899d4f1011.beer\n766er.com\n766test.com\n766vd.com\n766z.com\n7676.com\n767qkdj34u.com\n767stock.com\n76802.net\n76831.org\n76868.com\n7688.net\n7689.site\n76963.com\n769car.com\n76ab.com\n76baobao.com\n76bb.com\n76c9c1aa27766f1d.com\n76dongdong.com\n76ju.com\n76mz.com\n76pay.com\n76pf.com\n76y.com\n76zu.com\n77005163.xyz\n770539.com\n7711.com\n77112007.com\n77119159.com\n771633.com\n77169.com\n77169.net\n7717wan.com\n7722wx.com\n7723.com\n7723img.com\n7724.com\n7724yx.com\n7725.com\n77304.com\n77304y.com\n77313.com\n7733320.com\n7733352.com\n7733577.com\n7733706.com\n7733728.com\n7735.net\n77381v.com\n7744wan.com\n77521.com\n77545.com\n7755028.com\n7755056.com\n7755078.com\n7755267.com\n7755302.com\n7755306.com\n7755330.com\n7755360.com\n7756.org\n7759.com\n775jia.net\n776577.com\n7766.info\n7766.org\n7766060.com\n7766073.com\n7766090.com\n7766300.com\n7766362.com\n7766380.com\n7766398.com\n77670.org\n77745.com\n7777733.com\n777biubiu.com\n777dd.life\n777e.store\n777eee888eee.com\n777haoka.com\n777lala.com\n777moban.com\n777sy.com\n777yh.am\n7788.com\n7788310.com\n7788610.com\n7788js.com\n7789.com\n778buy.com\n7794.com\n77991.com\n7799358.com\n7799378.com\n77994008.com\n7799520.com\n779wan.com\n77ad.cc\n77bh.com\n77bike.com\n77bx.com\n77cr0ip236.com\n77dd23.com\n77de.com\n77dushu.com\n77dyy.net\n77ebooks.com\n77ed699516ed5193.com\n77ee6f16b1011.beer\n77eye.com\n77fanwen.com\n77gog.com\n77hd.com\n77hudong.com\n77itv.com\n77l.com\n77lux.com\n77music.com\n77nn.net\n77nt.com\n77nt.info\n77piano.com\n77pin.net\n77shu.com\n77shuku.la\n77shuku.org\n77shw.com\n77socks.com\n77tianqi.com\n77vcd.com\n77xmd.com\n77yx.com\n77zhangh.com\n77zhanghao.com\n77zn.com\n78.link\n78104.org\n78110.org\n781203.com\n78126dh.com\n7829t.com\n78302.com\n785836.com\n785956.com\n78654321.com\n78665.vip\n786e7138b09934b3.com\n78785z.com\n7881.com\n788111.com\n7888.com\n788899.com\n788v.com\n7890.net\n78901.net\n7899.cc\n789hi.com\n789hsw.com\n789win07.com\n78bar.com\n78dian.com\n78diy.com\n78dm.net\n78ee.com\n78fz.com\n78gk.com\n78hr.com\n78md.com\n78oa.com\n78os.com\n78plat.com\n78tp.com\n78v.com\n78yx.net\n79.biz\n790.com\n79008500.xyz\n790a8f76c10301.beer\n7928a82f311032.beer\n79332.agency\n793360.com\n793688.com\n79432.com\n7951ee2a510281.beer\n79521.cc\n7979u.com\n797sun.com\n7988.com\n798com.com\n798edu.com\n798ydh.com\n798zb.tv\n799.net\n79979.loan\n7997v.com\n7999.tv\n79999.net\n799job.com\n79abc.com\n79bb57f37108d1b9.com\n79ecb629691d165f.com\n79f9bf9e410292.beer\n79jr.com\n79tao.com\n79yougame.com\n79yx.com\n7a.cm\n7a1dd6b621020.beer\n7a1f7ba4211042.beer\n7a31jmf.com\n7a8k.com\n7a9b89eb3d333f2c.com\n7ade93e381021.beer\n7ahr.com\n7analytics.com\n7b2.com\n7b6466e191019.beer\n7b761738c10261.beer\n7bess.com\n7bip9h1k5s.com\n7c.com\n7c5ba8e2b10281.beer\n7c637ea6d10271.beer\n7c644b8a21013.beer\n7caiyun.com\n7capp.com\n7ccj.com\n7cdfad1816def43d.com\n7cgw.org\n7chacha.com\n7ci.com\n7cname.com\n7cnv.com\n7cv.com\n7cxk.com\n7cyn.com\n7d4b19ab710241.beer\n7d5y.com\n7d604703e1023.beer\n7d8fc91771017.beer\n7d9c2005e1015.beer\n7dah8.com\n7dc0d8dad10281.beer\n7dc20a92cc1da04d.com\n7didc.com\n7do.net\n7down.com\n7down.net\n7dsw.com\n7e.hk\n7e051eec511021.beer\n7e9dba1891021.beer\n7east.com\n7ed.net\n7edown.com\n7ee.com\n7f0107332e0db161.com\n7f36600721781324.com\n7f416cfd411012.beer\n7f86a2a17fcd5a5d.com\n7fa19203510241.beer\n7fa973f8c7bdcddb.com\n7fei.com\n7fff5701c5415d77.com\n7fgame.com\n7flowers.com\n7forz.com\n7fresh.com\n7glb.com\n7gongzhu.net\n7grandcross.com\n7gugu.com\n7hcn.com\n7head.icu\n7help.net\n7ho.com\n7hon.com\n7hua.com\n7icp.com\n7il.co\n7ipr.com\n7its.com\n7jia.com\n7jia2.com\n7jiaqi.com\n7jjjj.com\n7jk.com\n7juju.com\n7k35.com\n7k7k.com\n7k8k.com\n7ka.co\n7kk.com\n7kla.com\n7kla.net\n7ko.com\n7kww.net\n7littlemen.com\n7lk.com\n7luohu.com\n7lw.com\n7mah2.com\n7moor-fs1.com\n7moor-fs2.com\n7moor-zx.com\n7moor.com\n7msj.com\n7mx.com\n7mz3a.com\n7nepal.com\n7net.cc\n7oh.net\n7pa.com\n7paiqun.com\n7piq.com\n7po.com\n7q5.com\n7qile.com\n7quw.com\n7r7z.com\n7rdao.com\n7road.com\n7road.net\n7ronggame.com\n7runto.com\n7sef.com\n7sfashion.com\n7sodu.net\n7souti.com\n7sown.com\n7soyo.com\n7su.com\n7syc.com\n7t9.com\n7tapp.com\n7tenet.net\n7tgame.com\n7tnt.com\n7tou.com\n7tqy.com\n7tui.net\n7ugl.com\n7usa.net\n7uv.com\n7v6.net\n7vd7.com\n7vk.com\n7vyou.com\n7wan.com\n7wate.com\n7wee.com\n7wenta.com\n7wenyi.com\n7wkw.com\n7wnews.com\n7wsh.com\n7wsh.net\n7x24cc.com\n7x24s.com\n7x688.com\n7xdown.com\n7xiuxing.com\n7xm.net\n7xz.com\n7y5.net\n7y7.com\n7yc.com\n7yigame.com\n7youxi.com\n7yuki.com\n7yun.com\n7yun.org\n7yundns.com\n7yylucky.com\n7yz.com\n7yzone.com\n7z4bz6e2cp.world\n7zgame.com\n7zhan.com\n7zhou.com\n7zkj.com\n7zm.com\n7zz6.com\n7zzy.com\n8-008.com\n8.biz\n8.xyz\n80.hk\n80000.cc\n800423.com\n800507.com\n8006506.com\n8006511.com\n8006tu.com\n800713.com\n800820.net\n8008202191.com\n8008205555.com\n80088886.com\n800app.com\n800bamboo.com\n800best.com\n800best.net\n800bestapi.com\n800bestapp.com\n800bestex.com\n800book.net\n800buy.com\n800cdn.com\n800du.com\n800hr.com\n800jcw.com\n800li.net\n800lie.com\n800lj.com\n800mei.net\n800pharm.com\n800pifa.com\n800tu.com\n800tuan.com\n800tzw.com\n800vod.com\n800wen.com\n800xiaoshuo.com\n800xs.net\n800you.com\n800youhuo.com\n80166.com\n802203.com\n8025edaf81019.beer\n80351.com\n804c3f72a13dad45.com\n805481.com\n80585.com\n805a8702410281.beer\n8065f8f0f10261.beer\n807.com\n807d286522a4a453.com\n807df2a0610272.beer\n80800.vip\n8080bl.com\n8080i.com\n8081.net\n80811daa56184e5f.com\n8082audio.com\n8087sss.com\n8087vvv.com\n80899999.com\n808c6f532d08909b.com\n808xs.com\n8090.com\n8090.pk\n809090.xyz\n8090app.com\n8090cdn.com\n8090mt.com\n8090st.com\n8090vision.com\n8090yx.com\n8090yxs.com\n80982.org\n80a2a140710301.beer\n80baicai.biz\n80bi.com\n80c189b091016.beer\n80cz.net\n80data.net\n80day.com\n80dd7626911042.beer\n80den.com\n80dongli.com\n80host.com\n80kongjian.com\n80kuku.com\n80lou.com\n80paper.com\n80s.im\n80shihua.com\n80sjy.net\n80srz.com\n80test.com\n80txt.cc\n80txt.com\n80txt.la\n80vps.com\n80wifi.cc\n80x.co\n80xg.com\n80xs.la\n80zw.info\n81007.work\n8100ab16d11021.beer\n810840.com\n81138183c1024.beer\n81182479.com\n811sisp.com\n81241g43cj.world\n81257.com\n81265.com\n81265.net\n812813.com\n8130088.com\n81312.com\n81366j.com\n815.pub\n815008.com\n8158.com\n81593.com\n815ybw.com\n81629.com\n8162t.com\n81663344.com\n81677.com\n816798.net\n8169.com\n81730450affbad30.com\n817398.com\n81761.com\n818.com\n81813.com\n8181xw.com\n8181zx.com\n81835.com\n8185t.com\n8188.cc\n818cq.com\n818it.com\n818long.com\n818ps.com\n818tu.com\n818u.com\n818watch.com\n81988888.com\n81999.org\n81999999.com\n81art.com\n81book.com\n81comdns.com\n81ek.com\n81gfchina.com\n81guofang.com\n81hongshi.com\n81it.com\n81kx.com\n81lcd.com\n81man.com\n81pan.com\n81rzqh.cfd\n81tech.com\n81tt.net\n81xy.com\n81zhongwenx.com\n81zw.com\n81zw.la\n8203app.com\n8207hh.net\n8207uu.net\n82137777.com\n82158.com\n82250856.com\n822644.com\n8228.tv\n822ef055f1017.beer\n823238fa910271.beer\n82335966.com\n8243d76487f3a834.com\n8246.net\n8254ce48211021.beer\n8264.com\n82676666.com\n82686677.com\n82686699.com\n826pc.com\n826wan.com\n828385vip.com\n82859.com\n8289880.com\n828g.com\n828i.com\n82920.com\n8295099d311031.beer\n8295dc6e7e797638.com\n82987977.com\n829e30d07853f4fd.com\n82d5d0e4f10291.beer\n82e0dd98d1edbbb1.com\n82flex.com\n82ip.com\n82ky.com\n82l.net\n82pk.com\n8303.org\n83047.work\n83124.com\n83133.com\n83133.vip\n83152222.com\n8325.com\n8329607.com\n833006.net\n8333dhz.com\n8336.com\n83480900.com\n834834002.com\n834834009.com\n834834vip4.com\n835444.cc\n835images48.com\n835images55.com\n835images61.com\n835images73.com\n835images76.com\n835images83.com\n83661111.net\n83666.com\n83692.com\n83753751.com\n8379888.com\n8383.vip\n838413.com\n838dz.com\n83934.com\n83990567.com\n83edu.net\n83h87d.com\n83iiq501o2.com\n83kxs.com\n83mo7n9giq.com\n83x.cc\n84.com\n84.vc\n84008.com\n84185858.com\n8421.com\n84232.com\n84308.com\n84399.com\n844wan.com\n84560262.xyz\n845de4aca1019.beer\n845e4a87610292.beer\n846645d29f0aa91f.com\n84684.net\n8475.org\n8477.com\n848.com\n848.tv\n849558.com\n84d8388721016.beer\n84fk.com\n84ju.com\n84ke.com\n84ktv.com\n84ny.com\n84zcb.com\n850088.com\n850718.xyz\n8521.org\n85229666.com\n85253000.com\n85384.com\n853lab.com\n854255.com\n8543c0ee3b9082b5.com\n8558.org\n85657777.com\n85679999.com\n85791df5e89bcda6.com\n8579s.com\n857yx.com\n857zb1.tv\n85814.com\n85880234.com\n858game.com\n85c531cb9c14f457.com\n85f46a104256c205.com\n85jk.com\n85kf.com\n85sc.com\n85wp.com\n85xt.com\n86-import.com\n86.cc\n860029.com\n860527.com\n860598.com\n86079898.com\n8613.org\n861718.com\n86175.com\n861817.com\n86215.com\n86262.com\n863.cc\n863my.com\n863soft.com\n86516edu.com\n865211.com\n86586222.com\n86590.com\n866.com\n86656.net\n866ds.com\n8671099.com\n8673h.com\n86754.org\n867867jh.com\n8682.cc\n8684.com\n8686c.com\n8688g.com\n86933.com\n869d.com\n869v.com\n86a92644807597fa.com\n86amsdy.com\n86bdada6e1019.beer\n86bus.com\n86crk.com\n86ditu.com\n86dk.com\n86eh.com\n86eye.com\n86fis.com\n86fsp.com\n86game.com\n86gc.net\n86hcdnsuv.com\n86hh.com\n86hk.vip\n86hr.com\n86huoche.com\n86jg.com\n86joy.com\n86kang.com\n86kl.com\n86kongqi.com\n86lawyer.com\n86mai.com\n86mama.com\n86mdo.com\n86nb.com\n86office.com\n86pla.com\n86pm25.com\n86ps.net\n86rexian.com\n86sb.com\n86tec.com\n86tree.com\n86ty.com\n86uuu.com\n86wind.com\n86wol.com\n86xq.com\n86y.org\n86yqy.com\n87.vip\n870.com\n870818.com\n870q.com\n87111111.com\n87130000.com\n87131.vip\n87161.vip\n871659.org\n87188718.com\n872.cc\n872872.com\n8732365.com\n8733777251212.icu\n87388v.com\n875296.org\n8756s.com\n875902.vip\n8765043b5db2cbcb.com\n87654321.xyz\n8767.com\n876920.com\n8769d53.com\n876dns.com\n876web.com\n8770000.com\n87739b0fc18fe40a.com\n8775.com\n87753.net\n877771.xyz\n8779.com\n8782.org\n87870.com\n87872277.com\n878998.net\n87929796a10271.beer\n87949.cc\n8799.com\n87a37933611021.beer\n87b041a2019314d7.com\n87bc16a2fc6c4036.com\n87e1ed649c57575b.com\n87g.com\n87money.com\n87pk.com\n87vr.com\n87yy.com\n88-z.com\n88.com\n880.net\n8800.org\n880022.com\n8801.net\n880303.xyz\n880331.net\n88077777.com\n88090.com\n880sy.com\n880you.com\n88106.com\n88116008.com\n8811777.com\n881794d571016.beer\n881812c.com\n88183322.com\n88183355.com\n881ac9cfd560166d.com\n8821.com\n8822304.com\n88239001.com\n8825.com\n8828y.com\n88303887.com\n8831.app\n8831398.com\n88321268.com\n88360.com\n88362zubo95838.com\n8838sl.com\n883dai.com\n884358.com\n8844.com\n88453392.com\n8848.com\n8848phone.com\n8848y.com\n885.com\n8850006.com\n885210.net\n88582.com\n8860.net\n8864.com\n8866.org\n886623.com\n8866316aav.work\n8866316apt.work\n8866886688.com\n8867556d88.net\n8868.com\n88682089.app\n8868a16.app\n8868vip130.app\n886966.com\n886abc.com\n886cdead210292.beer\n886vps.com\n887367.com\n88737v.com\n88765.com\n887777.com\n887w.com\n888-8.com\n8880666.com\n888132.com\n8882258ab4.shop\n888484.xyz\n888608.xyz\n8886664ad2.shop\n88880809.com\n88887777.com\n8888800000.com\n8889997777.com\n888ban.com\n888chem.com\n888eee777eee.com\n888jiagong.com\n888pic.com\n888ppt.com\n888rj.com\n888twt.com\n888win12.com\n8890.com\n8890tu.com\n8896.com\n88966.net\n8899.net\n88995799.com\n8899yyy.vip\n889d9745511021.beer\n88adb49761022.beer\n88bank.com\n88bx.com\n88c3eaa9f1015.beer\n88caijing.com\n88cdn.com\n88dushu.com\n88fang.com\n88fe6607b11011.beer\n88gogo.com\n88h3.com\n88ht.com\n88icon.com\n88ipa.com\n88k.site\n88koo.com\n88la.cc\n88la.la\n88lan.com\n88laser.com\n88lmfff666.com\n88lmtupian.com\n88lot.com\n88meishi.com\n88mf.com\n88ming.net\n88order.com\n88pets.com\n88rpg.net\n88sup.com\n88sus.com\n88tang.com\n88tph.com\n88ttv.com\n88wbet.me\n88xiaoshuo.com\n88xr.org\n88y5.com\n88ysg.com\n88zha.com\n88zjzy.com\n89006006.com\n890bf715220716f3.com\n8910.io\n89178.com\n8926174358102.icu\n8928.org\n892qipai.com\n89303.com\n89438.com\n894994.com\n89538777.com\n89567.cc\n89609335.com\n8961zx.com\n896de44003a72c48.com\n896qipai.com\n89713742a93610e3.com\n897cdb929ebd7ee2.com\n898.travel\n89801133.com\n89808222.com\n8980cc.com\n8989118.com\n8989jt.com\n8989u.com\n8999.cc\n89b12b5e3ff8085c.com\n89dj.com\n89doc.com\n89ds.com\n89f0e4a1603d3372.com\n89f9ee46410292.beer\n89qw.com\n89uu.com\n8a.hk\n8a10847841cdf19b.com\n8a53ccb021015.beer\n8ab113871fb000b2.com\n8ah.cc\n8ao8ao.com\n8aza.com\n8b0dead347366514.com\n8b2.net\n8b3efd3d91017.beer\n8b753196c6c34891.com\n8b92b52bd10301.beer\n8badedce210292.beer\n8bb.com\n8bcd9.com\n8bce394a2cdc5541.com\n8bd02a5c35c9ab25.com\n8bo.com\n8btc-ops.com\n8btc.com\n8btm.com\n8c657a4ba5616b4f.com\n8ce7bc1173775468.com\n8cname.com\n8cnet.com\n8d36745b85e5711c.com\n8d6a9a22611032.beer\n8d7c51ca60de7bc5.com\n8d8215f2d2278f42.com\n8d99e9f8b690b895.com\n8ddbf947e1020.beer\n8dei.com\n8dexpress.com\n8dn.com\n8dol.com\n8dou.com\n8dp.net\n8dt.com\n8dudata.com\n8dus.com\n8dwww.com\n8e5da0c5911031.beer\n8e8z.com\n8eda52911f4518b6.com\n8ee1834c110272.beer\n8eeea09bc1009.beer\n8europe.com\n8f72500e910271.beer\n8faa7.com\n8fe.com\n8fenxiang.com\n8ggq.com\n8gl.com\n8gov.com\n8gui.com\n8gyu.com\n8hgame.com\n8hsleep.com\n8i8b.com\n8jdns.net\n8jie8.com\n8jxn.com\n8jzw.cc\n8k69vb6421.com\n8k7k.com\n8kana.com\n8kjl34x2gj08.com\n8kmm.com\n8kwebs.com\n8kzw.com\n8l8e.com\n8lag.com\n8le8le.com\n8lhx.com\n8liuxing.com\n8lj.cc\n8llp.com\n8lun.com\n8m8t.com\n8mcn.com\n8mhh.com\n8mi.tech\n8minzk.com\n8miu.com\n8miu.net\n8mkt.com\n8moom.com\n8mpaoche.com\n8ms.xyz\n8n2.com\n8n6n.com\n8njy.com\n8o9o.com\n8pig.com\n8pingce.com\n8pu.com\n8qwe5.com\n8qzy.com\n8rn4u.com\n8rs8i.com\n8s123.com\n8shop.cc\n8so.net\n8tennis.com\n8tgh.com\n8tool.club\n8tupian.com\n8tupian.net\n8u18.com\n8u58.com\n8uid.com\n8uyx.com\n8wan.com\n8win.com\n8win.net\n8wiu.com\n8wq.com\n8wss.com\n8wym.com\n8x5vviy4r2.com\n8x6x.com\n8xs.org\n8xz8.com\n8yao2hds35sv.com\n8ydsp.com\n8ym8.com\n8ytech.com\n8yx.com\n8z.net\n8zhuayu.cc\n8ziben.com\n8zntx.com\n8zy.com\n9-xin.com\n9-zhuce.com\n9.biz\n9.xyz\n90.cc\n900.la\n900.vc\n9000wy.com\n900112.com\n900501.xyz\n900cha.com\n900d8ac6110261.beer\n900php.com\n900ppt.com\n900yi.com\n90123.com\n9018.net\n90231611e4973cbb.com\n90370.com\n904e0d2ba10241.beer\n9056b8f915baba58.com\n90576.com\n90686.com\n906you.com\n90747.pro\n9090cdndns.com\n90a7597f835b14bd.com\n90ao.com\n90b5d42ca1016.beer\n90c6.com\n90dao.com\n90ers.com\n90game.bet\n90ko.net\n90lhd.com\n90qh.com\n90sheji.com\n90sjimg.com\n90tank.com\n90vm.com\n90wmoyu.com\n90yang.com\n90yk.com\n90zm.net\n91-box.com\n91.com\n91.plus\n9100.ink\n9105.cc\n9105.com\n91084.com\n910app.com\n910play.com\n911.cc\n911.vip\n91103d3a31014.beer\n9111.tv\n91118.com\n91160.com\n911zy.com\n912355.com\n912366.com\n9125flying.com\n912688.com\n912hf.com\n912k.com\n912yx.com\n91300.com\n9133.com\n9136.com\n91360.com\n91378.com\n913aefac85f5bf8f.com\n913pc.com\n913vr.com\n913you.com\n9149df3441020.beer\n915.com\n915.tv\n9154wan.com\n91558.com\n915658.com\n91583.com\n91588kf.org\n915d.tv\n916360.net\n9166yx.com\n916m.com\n917.com\n9170.com\n917st.com\n91827364592013.icu\n91827364592018.icu\n9186.com\n9188.com\n9188.work\n918canyin.com\n918dxs.com\n918fg.com\n918ka.cc\n918rc.com\n919.com\n9191mr.com\n9191net.com\n9191steel.com\n9191zx.com\n9193.com\n91985.com\n9199.com\n919watch.com\n91ac.com\n91act.com\n91ajs.com\n91all.net\n91anjian.com\n91art.net\n91baby.com\n91boshi.net\n91boshuo.com\n91bushou.com\n91carnet.com\n91cdkey.com\n91cha.com\n91changxie.com\n91chengguo.com\n91convert.com\n91ctc.com\n91cy.app\n91cy.cc\n91czxs.com\n91daizhang.com\n91danji.com\n91datong.com\n91dba.com\n91dbb.com\n91dbq.com\n91ddcc.com\n91ddedu.com\n91dict.com\n91dnso.com\n91doujin.com\n91dub.com\n91duba.com\n91duobaoyu.com\n91em.com\n91es.com\n91exam.org\n91exiu.com\n91facts.com\n91fangan.com\n91fifa.com\n91fyt.com\n91game.com\n91goodschool.com\n91haigui.com\n91haiju.com\n91haoka.com\n91haoke.com\n91health.net\n91hecheng.com\n91hmi.com\n91https.com\n91huayi.com\n91huayi.net\n91hui.com\n91huifu.com\n91huoke.com\n91huola.com\n91hy.com\n91idc.gg\n91ifx.com\n91ios.com\n91ios.fun\n91ivr.com\n91jbz.com\n91jf.com\n91jiabohui.com\n91jiafang.com\n91jianguo.com\n91jin.com\n91jinjindai.com\n91jinrong.com\n91jinshu.com\n91jiujige.com\n91jkj.com\n91jkys.com\n91jlb.com\n91jm.com\n91jmw.com\n91job.com\n91join.com\n91jtg.com\n91k7.com\n91kami.com\n91kq.com\n91kw.net\n91laihama.com\n91laiz.com\n91ld.com\n91lda.com\n91lewei.com\n91listen.com\n91lsf.com\n91lx.com\n91m.co\n91maibiao.com\n91maths.com\n91meitu.com\n91mh.me\n91miaoshou.com\n91muou.icu\n91muzhi.com\n91ninthpalace.com\n91nzh.com\n91pandian.com\n91pdf.com\n91petct.com\n91php.com\n91post.com\n91pusi.com\n91q.com\n91quce.com\n91qycl.com\n91rjz.com\n91ronghui.com\n91ruyu.com\n91saishi.com\n91sd.com\n91sem.cc\n91sfdj.com\n91shenfan.com\n91short.com\n91shouce.com\n91smart.net\n91soer.com\n91soker.com\n91sotu.com\n91soumu.com\n91sph.com\n91sst.com\n91strategy.com\n91student.com\n91suan.com\n91suke.com\n91switch.com\n91syun.com\n91taojin.com\n91taoke.com\n91ting.net\n91toolbox.com\n91tty.com\n91tvb.cc\n91tw.net\n91up.com\n91vpn.com\n91vps.com\n91vrchat.com\n91vst.com\n91waijiao.com\n91waitang.com\n91wan.com\n91wangcai.com\n91wangyx.com\n91way.com\n91weimai.com\n91wenmi.com\n91wenwen.net\n91wllm.com\n91wujia.com\n91wutong.com\n91wzg.com\n91x.org\n91xch.com\n91xcm.com\n91xfw.com\n91xiake.com\n91xiazai.com\n91xinshang.com\n91xjcs.com\n91xsj.com\n91xunyou.com\n91xxt.com\n91xy.com\n91y.com\n91yao.com\n91yinpin.com\n91yixun.com\n91yk.com\n91yong.com\n91you.com\n91youban.com\n91youchai.com\n91youxi.com\n91yoyo.net\n91yu.com\n91yuedu.com\n91yunxiao.com\n91yunying.com\n91yxbox.com\n91zhongkao.com\n91zhuti.com\n91znyx.com\n91zxw.com\n92.net\n920uc.com\n921.com\n9211.com\n9217fdb98dcc13a8.com\n9217web.com\n92220556.com\n92220558.com\n92220577.com\n92220668.com\n92220701.com\n92220760.com\n92224i.net\n92224s.com\n922997xtz2.shop\n923f92a4e1df1753.com\n924747.com\n925g.com\n925ps.com\n926kf.com\n92751437c39b61ee.com\n927927.com\n927953.com\n927game.com\n928.sale\n928vbi.com\n928xpj.com\n92913.com\n929825.com\n92987.com\n9299.net\n929g.com\n929vip.shop\n92anycall.com\n92ay.com\n92bbs.net\n92bce178d60f5a3e.com\n92cf4088b1014.beer\n92cloud.com\n92demo.com\n92dp.com\n92dpw.com\n92dydh.com\n92e483231a9103f8.com\n92fa.com\n92fox.com\n92gyw.com\n92hidc.net\n92jzh.com\n92kaifa.com\n92kk.com\n92le.com\n92lm.com\n92lucky.com\n92mp.com\n92nas.com\n92ni.com\n92scj.com\n92shuoshuo.com\n92sucai.com\n92to.com\n92txt.cc\n92u93e.com\n92wan.com\n92wudao.com\n92wx.com\n92wx.la\n92wy.com\n92xygame.com\n92y.co\n92yanqing.com\n92yo.com\n92zc.com\n92zhiqu.com\n92zuqu.com\n930a48879eaa652b.com\n930hh.com\n9312.net\n93126.org\n93135.com\n931931jh.com\n933.moe\n933332.xyz\n93376v.com\n934dsw.com\n934hd.com\n93636.com\n93692zubo66936.com\n936u.com\n9377.com\n937791.com\n9377a.com\n9377d.com\n9377df.com\n9377g.com\n9377j.com\n9377ja.com\n9377os.com\n9377s.com\n9377z.com\n9378.com\n93913.com\n939394.xyz\n939397.vet\n93966.com\n93977v.com\n93984.org\n93e8209f610272.beer\n93eu.com\n93fbf3a7f10281.beer\n93gaokao.com\n93hdw9.com\n93jiang.com\n93jx.net\n93kk.com\n93land.com\n93lh.com\n93njf0.com\n93pk.com\n93sdk.com\n93sem.com\n93soso.com\n93trf.com\n93tyy.com\n93wgames.com\n93yo.com\n93you.com\n93zp.com\n94001.com\n94001.vip\n940177.com\n940304.xyz\n94113162.xyz\n94117.net\n941adu.com\n941gb.com\n942mc.com\n94362.com\n9437803d210271.beer\n944.com\n94445.com\n9453job.com\n945d3447ed068dbd.com\n945n48.com\n946000.com\n9466.com\n947fd9a0011042.beer\n94831.com\n9486483.com\n948hj.com\n9495.com\n94994.com\n949949.com\n94ab.com\n94ad.com\n94afx.com\n94beb5b921021.beer\n94cb.com\n94cto.com\n94fcb6f5810241.beer\n94gan.net\n94goo.com\n94he38.com\n94i5.com\n94kuai.com\n94mxd.com\n94nw.com\n94php.com\n94q.com\n94qy.com\n94rmb.com\n94rp.com\n94te.com\n94xy.com\n94you.net\n94ys.com\n95-1.vip\n95.com\n95001111.com\n95007.com\n95013.com\n95021.com\n950901.com\n950c6df3c6ee90b1.com\n95105105.com\n95105369.com\n95105555.com\n95105888.com\n95105899.com\n9512.net\n951280.com\n951368.com\n95158.com\n95169.com\n95191.com\n95195.com\n951dns.com\n95262.com\n9527cha.com\n9527cloud.com\n9527dns.com\n9527g.com\n95303.com\n95311.com\n9533.org\n953yx.com\n95408.com\n9540f8f83e1e7a8c.com\n95447.com\n95504.net\n95504test.com\n95508.com\n95516.com\n95516.net\n95526.mobi\n95528.com\n9553.com\n9557.com\n95572.com\n95579.com\n95580.net\n95588.com\n95598pay.com\n95599.hk\n955yes.com\n9560.cc\n95600.vip\n9564.com\n95659.org\n9567.com\n95684f80222b921a.com\n957431860395659.icu\n95779.com\n958358.com\n9588.com\n95890.com\n959.com\n9595111.vip\n9596yy.com\n95a.co\n95b.co\n95bd.com\n95dns.cc\n95dushu.com\n95dushu.net\n95e.co\n95en.com\n95epay.com\n95fenapp.com\n95ib.com\n95ip.com\n95jizhang.com\n95k.com\n95links.com\n95ns.net\n95px.com\n95shubao.info\n95to59.com\n95xiu.com\n95ye.com\n95yijing.com\n95zh.com\n96005656.com\n960123.com\n960638.com\n96090090.com\n96096kp.com\n960rc.com\n961.com\n9610.com\n96110.org\n9611111.com\n96138.net\n96160.cc\n96189.com\n96189.tv\n9618968.com\n96192.com\n962.net\n962007.com\n962168.com\n962222.net\n96225.com\n962360.com\n962518.com\n962600.com\n96262.com\n96335.com\n96355.com\n96369.net\n963695.com\n96382zubo66756.com\n963999.com\n96459.com\n964yx.com\n965.one\n96519.org\n96528.com\n96533.com\n965373.com\n96558.com\n9655bcfbe1022.beer\n96567.com\n96590.net\n9663.com\n9665.com\n966599.com\n9665yx.com\n9666666.com\n9666sr.com\n9669.com\n966zlnfjuza4oloh2bk.app\n96804.com\n96811.com\n96811.net\n96822.com\n968309.com\n968550.com\n96856.org\n9686000.com\n96877.net\n968816.com\n9688896.com\n968pk.com\n969009.com\n9692bc70da600f84.com\n969368.com\n96966.com\n969g.com\n96ac893dd11011.beer\n96b25c0edb71ca11.com\n96caifu.com\n96cc09c581022.beer\n96ce3cebe11042.beer\n96daa24471013.beer\n96dp.com\n96eaa004b05872ae.com\n96f2d.com\n96flw.com\n96hq.com\n96kaifa.com\n96lh.net\n96lou.com\n96ni.net\n96pk.com\n96sdk.com\n96sir.com\n96weixin.com\n96yx.com\n96zxue.com\n97.biz\n97.cc\n9700hg.com\n970mhz.com\n97111.work\n9718.com\n9718game.com\n972.com\n9724.com\n9736s.com\n97576.com\n97616.net\n97654.com\n97665.com\n97775.com\n9778.com\n977k.com\n977zy.com\n97866.com\n9787.com\n978clouds.com\n978s.com\n97936.com\n97971166.com\n97971188.com\n97972209.com\n97973.com\n97973309.com\n97973399.com\n97975508.com\n97976608.com\n9797cp2.com\n9797ly.com\n9797x4.com\n9797x7.com\n9799.com\n9799251212480.icu\n97a12bb360b26d1c.com\n97add.com\n97bacdab676db530.com\n97ce6cbd010292.beer\n97d9f793c1022.beer\n97doc.com\n97f6185064157973.com\n97gg.net\n97go.com\n97jiayou.com\n97jindianzi.com\n97jz.com\n97kid.com\n97kks.com\n97lp.com\n97lpw.com\n97ol.com\n97rp.com\n97rx.com\n97ting.com\n97ui.com\n97uimg.com\n97wd.com\n97wyw.com\n97xdj.net\n97zm.com\n98.com\n98.ma\n9800.com\n98030.center\n980512.com\n980cje.com\n981.ee\n98182.com\n98187411.com\n984g.com\n985.so\n985900.com\n985dh.com\n985hezi.com\n985ks.com\n985ks.net\n985sy.com\n98612.com\n9862ad1f310292.beer\n98654.com\n987.com\n9873.com\n9876game.com\n9877.com\n987app.com\n987dns.com\n987you.com\n98809.com\n988848a9d1013.beer\n988878.com\n98892.com\n988sl.com\n9891.com\n9891760ee2389285.com\n989198.com\n98945.org\n9898049.com\n98982201.com\n98982202.com\n98982288.com\n98982601.com\n98983355.com\n98984422.com\n98986688.com\n9898758.com\n98987729.com\n9898c.com\n9898jh2.com\n98b8cd6b21011.beer\n98cloud.com\n98d4c586f11012.beer\n98du.com\n98e774f505d78b1a.com\n98ep.com\n98eye.com\n98k4.com\n98lm.com\n98mc.cc\n98mp.com\n98nice.com\n98one.com\n98t.la\n98t.net\n98tang.com\n98tsg.com\n98w.co\n98weixin.com\n98xiaoshuo.com\n98xz.com\n98yl.com\n98zhibo.com\n98znz.com\n98zw.com\n99.com\n99113guoji.com\n99114.com\n99118.com\n9911yx.com\n99166.com\n9917.com\n9918.tv\n99193.com\n991fd1ce91009.beer\n991kang.com\n991quka.com\n9928.tv\n99357b59811012.beer\n9939.com\n993937.com\n99394.com\n993h.com\n9942.org\n99442.com\n9944wb.com\n99469.com\n994wan.com\n9950air.com\n9951.cc\n995120.net\n99520.love\n996.com\n996007.icu\n9963.org\n996404.xyz\n9965dns.com\n9966.com\n9966.org\n9966333.com\n9966886699.com\n996996.com\n996a.com\n996box.com\n996dns.com\n996pic.com\n996sdk.com\n9973.com\n997788.com\n998.com\n9981ypk.com\n9982.com\n998231.com\n998274.com\n99844666.com\n99887w.com\n998917.com\n99895.org\n998jk.com\n998jx.com\n998law.com\n998tool.com\n9991.com\n999120.net\n999125.com\n999136.xyz\n999178.com\n999765.xyz\n999777.com\n9998.tv\n99988866.xyz\n9999224xtz1.shop\n99999dns.com\n999abc333abc.com\n999ask.com\n999brain.com\n999d.com\n999d743c51022.beer\n999inandon.com\n999mywine.com\n999shengqian.com\n999tea.com\n999welder.com\n999wx.com\n99aiji.net\n99aly.com\n99bdf.com\n99biaozhun.com\n99bill.com\n99bo.cc\n99box.com\n99brand.com\n99bs.club\n99caiba.com\n99cc.com\n99cfw.com\n99cha.com\n99cloud.net\n99corley.com\n99count.com\n99danji.com\n99ddd.com\n99dingding.com\n99down.com\n99dushu.com\n99dushuzu.com\n99dw.com\n99eo.com\n99eyao.com\n99fang.com\n99fei.net\n99fenlei.com\n99fund.com\n99fund.org\n99haoche.com\n99haoling.com\n99hdf.com\n99hkjf.com\n99huodong.xyz\n99ielts.com\n99inf.com\n99inn.cc\n99jee.com\n99jianzhu.com\n99jiasu.com\n99jiasu.net\n99jrk.com\n99kf.com\n99kt.com\n99ku.cc\n99ku.vip\n99kypay.com\n99leidun.com\n99max.me\n99mc.com\n99meihua.com\n99meiju.tv\n99mk.info\n99mk.la\n99mk.net\n99mssj.com\n99mst.com\n99music.net\n99n.me\n99nets.me\n99pdf.com\n99ppt.com\n99qh.com\n99qibang.com\n99qimingzi.com\n99qumingzi.com\n99read.com\n99shi.com\n99shou.com\n99sj.com\n99sky.com\n99sun.com\n99sushe.com\n99sy.co\n99thz.com\n99tianji.com\n99tongxuelu.com\n99uri.com\n99weiqi.com\n99wj.com\n99wuxian.com\n99xr.com\n99xueshu.com\n99youmeng.com\n99ys.com\n99yunshi.com\n99yx.com\n99zihua.com\n99zuowen.com\n99zzw.com\n9a04d8da811031.beer\n9a9m.com\n9aca7ec4f5ae25e5.com\n9ailai.com\n9aimai.com\n9air.com\n9amts.com\n9aoduo.com\n9aola.com\n9b09eea7810251.beer\n9b11b109-ab3d-4193-ac60-79cc19b3e76d.link\n9b37f3cc81011.beer\n9bb4cf93e10261.beer\n9bianli.com\n9c0c0433602d188a.com\n9c67282f22796ac6.com\n9c941a3b41021.beer\n9ca4b8eca1019.beer\n9cao9.com\n9cb.com\n9ccapital.com\n9ce69ea6b10272.beer\n9cfa10ad910291.beer\n9che.com\n9chew.com\n9clive.com\n9conn.net\n9d19.com\n9d47e2c251009.beer\n9d86072bbc545262.com\n9d87bc4302122ef4.com\n9damao.com\n9damao.net\n9day.cc\n9db.cc\n9ddm.com\n9de3c7ffb10291.beer\n9deli.com\n9dfb917ee1019.beer\n9dfx.com\n9dian.info\n9dida.net\n9dinn.com\n9douyu.com\n9dreams.net\n9droom.com\n9duw.com\n9dwork.com\n9e707bdb763386bf.com\n9eacc080d10291.beer\n9ead.com\n9eae58cbc333acf8.com\n9earth.com\n9efca2b9a1009.beer\n9eip.com\n9ele.com\n9etravel.com\n9f113d434f8c49f0.com\n9f7ef6acd10291.beer\n9fapi.com\n9fav.com\n9fb8d5b6bff66a4d.com\n9fbank.com\n9fe3e7d4c10311.beer\n9fh5.com\n9first.com\n9flb.com\n9fmk.com\n9fo.com\n9fonecard.com\n9fpuhui.com\n9fs.com\n9fzt.com\n9fzt.net\n9g8g.com\n9gg.cc\n9ghao.com\n9gt.net\n9he.com\n9hier.com\n9host.org\n9hou.com\n9ht.com\n9i0i.com\n9icad.com\n9icode.net\n9icy.com\n9idudu.com\n9igcw.com\n9ihb.com\n9ihome.com\n9ijf.com\n9ilrc.com\n9ilu.com\n9imobi.com\n9inx.com\n9ioldgame.com\n9iphp.com\n9ishe.com\n9ist.com\n9iwz.net\n9ixf.com\n9j9y.com\n9ji.com\n9juewu.com\n9jx.com\n9k01.com\n9k9k.com\n9ka.vip\n9kcs.com\n9kd.com\n9kff.com\n9kkk.xyz\n9kld.com\n9kus.com\n9laidu.net\n9linux.com\n9liuda.com\n9ljr84.xyz\n9longe.net\n9man.com\n9mayi.com\n9miao.com\n9mic.com\n9nali.com\n9newlive.com\n9ngames.com\n9niu.com\n9now.net\n9ok.com\n9om.com\n9one.cc\n9open.com\n9orange.com\n9p.net\n9pinke.com\n9pk.net\n9pkw.com\n9qu.com\n9ria.com\n9sb.net\n9sgx.com\n9shadow.com\n9skb.com\n9skm.com\n9sky.com\n9slab.com\n9sleep.org\n9sug.com\n9syw.com\n9t-tech.com\n9taobao.com\n9taohao.com\n9tax.com\n9to.com\n9tong.com\n9tonglian.com\n9tov.com\n9u8u.com\n9upk.com\n9vf.com\n9w1an.com\n9w9.com\n9wad.com\n9wee.com\n9wee.net\n9wuli.com\n9wwx.com\n9xdb.com\n9xgame.com\n9xiazaiqi.com\n9xic.com\n9xinli.com\n9xiu.com\n9xiuzb.com\n9xo9.com\n9xs.org\n9xu.com\n9xun.com\n9ya.net\n9yao.com\n9yaocn.com\n9yc.com\n9ye.com\n9yiban.com\n9you.com\n9you.net\n9yread.com\n9yue.com\n9yuntu.com\n9yuonline.com\n9yz.com\n9zas5.com\n9zhen.com\n9znet.com\n9zx.com\na-b.cc\na-du.net\na-isv.org\na-jazz.com\na-liai.com\na-map.co\na-map.link\na-map.vip\na-startech.com\na-sy.com\na-xun.com\na0318.com\na049636971024.beer\na04d48409e40ca3f.com\na0598.com\na0770.com\na0bi.com\na0c77.com\na0d73230f9d52dfb.com\na0fca7a55be096ef.com\na135.net\na142b5e7511011.beer\na1789.com\na18.ltd\na1891cc2258a919b.com\na1a22678d1019.beer\na1coin.xyz\na21fs.com\na29e2657018e645b.com\na2dongman.com\na2e1c81dce0fd3ce.com\na2gu2.com\na30437f3510292.beer\na32bd427dd.skin\na335cb802c120705.com\na33a8c8c81011.beer\na3p4.net\na40dc409e2ea86b1.com\na42c6d113874e1f3.com\na44aeaeac1016.beer\na45e4f5fd10272.beer\na465a95641016.beer\na490cce2411032.beer\na4da96ae511032.beer\na4s6.com\na4size.net\na4xvv2g18l.com\na5.net\na5089302099a537e.com\na5380a8e41016.beer\na5399.com\na549543886.asia\na5600.com\na58cd776cc.baby\na5b.cc\na5idc.com\na5idc.net\na5j.cc\na5lt.com\na5xiazai.com\na5y.net\na61cee76f4df41b1.com\na632079.me\na6562752811032.beer\na6h8.com\na6ksw.net\na7.com\na700in.ren\na7479032d1014.beer\na74be6c3e1021.beer\na756716251017.beer\na75d755806b1095d.com\na7647e3f151b4a5d.com\na766.com\na789.org\na7a13fde51022.beer\na7c6e291d10292.beer\na7d4bd3ce10281.beer\na7dcb6d9011032.beer\na7shun.com\na8.com\na83c8524b88a06ae.com\na87807b4811031.beer\na87f34a60cf36893.com\na88b9f894719c3d8.com\na88dc138be.run\na8f947.com\na8tg.com\na8u.net\na8z8.com\na909ed7022b1ecc1.com\na9188.com\na963.com\na96b32e2b1015.beer\na9998f7ed11042.beer\na9c7f491710251.beer\na9market.com\na9vg.com\na9x9.com\naa-lsk.com\naa03010iiko.com\naa08072678.xyz\naa152.com\naa360.net\naa433d1b51013.beer\naa43z7.com\naa4491.com\naa50b44761011.beer\naa56238652.com\naa5c82aeb10271.beer\naa65535.com\naa6666.com\naa67678156.com\naa6f0397a3cf50d7.com\naa76858896.com\naa77kk.com\naa84c23fc4aa335a.com\naaalawfirm.com\naaalogisticsgroup.com\naaareplicawatch.com\naaawz.cc\naaayu.com\naaayun.com\naabooo.com\naabqn.com\naac3442de07869c0.com\naacoptics.com\naactp.net\naad5.com\naadcloud.com\naadongman.com\naads-cng.net\naafanke.cc\naafxw.com\naai07251mu.com\naai07260mu.com\naai07280mu.com\naakss.com\naaltosemi.com\naamets.com\naamev.com\naamgame.com\naamgame.mobi\naamgame.net\naamsmart.com\naanroute.net\naap5.com\naapinche.org\naardio.com\naaronlam.xyz\naaspt.net\naastartups.com\naatccn.com\naateda.com\naauc.net\naaucwbe.com\naavisa.com\naawvw.com\naaxinwen.net\naaygw.com\naaym.net\naayu.today\naayun.icu\naazao.com\nab-sm.com\nab126.com\nab173.com\nab1989.com\nab365.com\nab839c2562b8ae05.com\nabaa.cc\nabacaipu.com\nabackup.com\nabaizx.com\nabang.com\nabaoge.com\nabatour.com\nabbbio.com\nabbisko.com\nabbooa.com\nabbreviat.com\nabbyschoice.net\nabbyychina.com\nabc-ca.com\nabc-love.com\nabc119.tv\nabc12366.com\nabc151.com\nabc188.com\nabc369.net\nabc4game.com\nabc56692388.com\nabc59783718.com\nabc7722.com\nabcache.com\nabcbank.shop\nabcdd10006.icu\nabcdd10032.icu\nabcdd10034.icu\nabcdd10046.icu\nabcdocker.com\nabcdv.net\nabcerikk8.com\nabcfintech.com\nabcgonglue.com\nabchina.com\nabchinalife.com\nabcjiaoyu.com\nabckantu.com\nabcleasing.com\nabclogs.com\nabcpost.com.au\nabcrcw.com\nabcs8.com\nabcsbank.com\nabctime.com\nabcve.com\nabcxb.com\nabcxx.net\nabcxyzkk.xyz\nabcydia.com\nabd007.com\nabddn.com\nabdf002.com\nabe-sz.com\nabe-tech.com\nabeacon.com\nabedu.net\nabef6142010291.beer\nabesmoke.com\nabhouses.com\nabiechina.com\nabifsey.com\nabitcg.com\nabite.com\nabiz.com\nabkou.com\nable-elec.com\nablejeans.com\nablesci.com\nablesky.com\nabletive.com\nablman.com\nabloz.com\nably.fan\nabmjc.com\nabnen.com\nabnotebook.com\naboatedu.com\naboboo.com\naboilgame.com\nabond.net\nabordy.com\naboutcg.com\naboutcg.net\naboutcg.org\naboutgk.com\naboutmy.name\naboutnew.net\naboutyun.com\naboveyunbo.com\nabox.plus\nabpuvw.com\nabreader.com\nabslw.com\nabsoloop.com\nabsst.com\nabtd.net\nabtnetworks.com\nabtpaper.com\nabtt266.com\nabublue.com\nabundancen.com\nabuquant.com\nabusi.net\nabusky.com\nabuyun.com\naby.pub\nabykt.com\nabyssdawn.com\nac.fun\nac268.com\nac3ba49731016.beer\nac57.com\nac6891953e265977.com\nac78416978de6213.com\nacabridge.net\nacachina.com\nacademygkusa.com\nacademypublication.com\nacadn.com\nacb365.com\nacbiot.com\nacc3.net\nacc5.com\naccdisplay.com\naccelerateg.com\nacceleratet.com\naccelink.com\nacceptablt.com\naccessads.net\naccessgood.com\naccessibility-union.com\naccessibility-union.net\naccessibilityunion.com\naccessicp.com\naccessoft.com\naccesspath.com\naccgame.com\naccio.ai\naccio.com\nacclb.com\nacconsys.com\naccopower.com\naccount.htcvive.com\naccr.cc\naccsh.org\nacctdns.net\naccu.cc\naccuramed.com\naccurate-china.com\naccurate520.com\naccxiaoheihe.com\nacdianyuan.com\nacdnrvh.com\nace-info.com\nace-pow.com\nace-rubber.com\nace06a98610272.beer\nace113.com\nacejoy.com\nacelamicro.com\naceoo.com\nacepanel.net\nacesheep.com\nacetace.com\nacetaffy.club\nacetar.com\nacewill.net\nacexpress.org\nacfechina.org\nacflow.com\nacftu.org\nacfun.com\nacfun.net\nacfunchina.com\nacfunchina.net\nacg.gd\nacg.tv\nacg.xin\nacg169.com\nacg17.com\nacg183.com\nacg18s.com\nacg4.com\nacg6.com\nacgdb.com\nacggit.com\nacgist.com\nacglivefan.com\nacgmc.com\nacgorg.com\nacgpic.net\nacgpp.net\nacgrenwu.com\nacgres.com\nacgsan.com\nacgsky.win\nacgtofe.com\nacgtubao.com\nacguxhda.com\nacgvideo.com\nacgvr.com\nacgwolf.com\nacgzc.com\nacgzyj.com\nachiming.com\nachizi.com\nacing.com\nacingame.com\nacirclea.com\nacirno.com\nacjw.net\nackjled.com\nacloud.com\nacloudbaas.com\nacloudrender.com\nacmcoder.com\nacmec-e.com\nacmemob.com\nacmetranslation.com\nacmoba.com\nacmsearch.com\nacmturc.com\nacnow.net\naco-musical.com\nacobt.tech\nacoloo.com\nacoolread.com\nacpf-cn.org\nacplay.net\nacq42.com\nacqiche.com\nacqyjg.com\nacrel-eem.com\nacrel-microgrid.com\nacrel-znyf.com\nacrossmetals.com\nacroview.com\nacs.org\nacshoes.com\nacsrq.com\nact-telecom.com\nactacams.com\nactamath.com\nactbbs.com\nactcn.net\nacthao.com\nacthd123.com\nactime.net\nactions-semi.com\nactionsky.com\nactivation-gp.com\nactiveclub.net\nactivepower.net\nactivity-dy.com\nactivity-wbsj.com\nactivity-zhendingtech.com\nactivity01.com\nactivity02.com\nactivity03.com\nactivity04.com\nactivity05.com\nactivitybyte.com\nactoys.com\nactoys.net\nactranslation.com\nactself.me\nactuive.com\nacuangle.net\nacumoxj.com\nacwapowercn.com\nacwifi.net\nacwing.com\nacwlkj.com\nacxk.net\nacxxg.com\nad-cn.net\nad-diamond.com\nad-gone.com\nad-goods.com\nad-squirrel.com\nad-survey.com\nad-young.com\nad110.com\nad22b2e021014.beer\nad2b0298510251.beer\nad321.cc\nad5.com\nad518.com\nad7.com\nad77.com\nad778.com\nada-post.com\nadamahf.com\nadamcdn.com\nadamcoder.com\nadamerck.net\nadanachina.com\nadanxing.com\nadaog.com\nadapay.tech\nadas.com\nadbana.com\nadbgz.com\nadbiding.com\nadbkwai.com\nadbvllc.cfd\nadbxb.com\nadc-expo.com\nadcdn.com\nadcomeon.com\nadcotechina.com\naddaad.com\naddchina.com\naddgog.com\naddimmar168.com\naddinghome.com\naddnewer.com\naddog.vip\naddoom.com\naddpcn.com\naddpv.com\naddww.com\naddx.live\nade8.com\nadeasyx.com\nadeaz.com\nadebang.com\nadebibi.com\nadeccogroupcn.com\nadellock.com\nadesk.com\nadeskpro.com\nadexplain.com\nadfaith.com\nadfortest.com\nadfunlink.com\nadfuns.com\nadfyt.com\nadg-dental.com\nadgomob.com\nadguardprivate.com\nadhei.com\nadhimalayandi.com\nadhubbj.xyz\nadhudong.com\nadi-whatsepp.com\nadianshi.com\nadiexpress.com\nadigifactory.com\nadiic.com\nadinall.com\nadinju.com\nadipman.net\nadjdds.com\nadjucai.com\nadjuz.com\nadjwl.com\nadjyc.com\nadkjpx.com\nadkwai.com\nadl163.com\nadl888.com\nadlainortye.com\nadlefee.com\nadlefei.com\nadlo.net\nadluckin.com\nadm88888.com\nadm999.com\nadmai.com\nadmaimai.com\nadmama.com\nadmamax.com\nadmbucket.com\nadmile.xyz\nadmin04.com\nadmin10000.com\nadmin345.com\nadmin5.com\nadmin5.net\nadmin6.com\nadmin88.com\nadmincdn.com\nadminer.com\nadmintony.com\nadminxe.com\nadminxy.com\nadmobclick.com\nadmobile.mobi\nadmonitor.org\nadmqr.com\nadmsger.com\nadmsidea.com\nadmtvs.com\nadmunan.com\nadmxh.com\nadnineplus.com\nadnrhy.com\nadnyg.com\nadobe-tool.com\nadobeae.com\nadobeedu.com\nadoebike.com\nadonest.com\nadongyu.com\nadoregeek.com\nadoutu.com\nadparticle.com\nadpchina.com\nadpfm513.com\nadplusx.com\nadpsh.com\nadqtt.net\nadquan.com\nads66.com\nads8.com\nadsalecdn.com\nadsalecprj.com\nadsame.com\nadscover.com\nadsctl.com\nadseye.com\nadseyeservice.com\nadsfancy.com\nadshonor.net\nadshuju.com\nadsjdy.com\nadslr.com\nadsmogo.com\nadsmogo.mobi\nadsmogo.net\nadssaas.com\nadssap.com\nadsspr.com\nadstarcharm.com\nadsue.com\nadsuni.com\nadszs.com\nadt100.com\nadtaipo.com\nadtchrome.com\nadtianmai.com\nadtime.com\nadtmm.com\naduan.cc\nadubest.com\naduer.com\nadukwai.com\nadult-stem-cells.com\nadunicorn.com\nadunimax.com\nadunioncode.com\nadunite.com\nadups.com\naduspot.com\nadutou.com\nadutp.com\nadvanced-microsemi.com\nadvanced-pneumatics.com\nadventsoft.org\nadvertcn.com\nadvich.com\nadview.com\nadvisionhorizon.com\nadvlion.com\nadvuser.com\nadwangmai.com\nadwanji.com\nadwebcloud.com\nadwep.com\nadwery.com\nadwetec.com\nadwintech.com\nadwke.com\nadwo.com\nadwork.net\nadx.ms\nadx.pw\nadxflow.com\nadxhi.com\nadxhome.com\nadxiaozi.com\nadxiuqia.com\nadxliangmei.com\nadxmax.com\nadxmq.com\nadxpand.com\nadxqd.com\nadxvip.com\nadxwork.com\nadxyun.com\nadyoc.com\nadyounger.com\nadyuedong.com\nadyun.com\nadzhongdian.com\nadzhp.cc\nadzhp.net\nadzhp.site\nadznb.com\nadzshd.com\nae-inbr.xin\nae0f9d6cf11021.beer\nae1234.com\nae224e62eb93c42a.com\nae256.com\nae3a6d6e09359c15.com\nae58c58c051aacd9.com\nae5de9f6f1021.beer\nae60.com\nae7b5112dd1be127.com\naebell.com\naebiz.net\naec188.com\naecbattery.com\naecc-mall.com\naecichina.com\naecname.com\naecsian.com\naeec9b62d1016.beer\naeenergy.com\naeenets.com\naeespace.com\naegcar.com\naegis-env.com\naegisafe.com\naegisx.net\naegonthtf.com\naehyok.com\naeicei.com\naeink.com\naeinsen.com\naekyungnb.com\naemedia.org\naemoban.com\naeneag.xyz\naeo-cctv.com\naeolustyre.com\naeonbuy.com\naeonmall-china.com\naeonmed.com\naeoto.net\naepku.com\naeqfuyc.com\naerchs.com\naerdai.com\naerfaying.com\naerivon.net\naero-shenyang.com\naerochina.net\naerocityholding.com\naerofugia.com\naes-beijing.org\naesimka.com\naesoftland.com\naestheticbutler.xyz\naesucai.com\naevit.xyz\naexpec.com\naf122.com\naf165fa2910261.beer\naf26a21252823cc6.com\naf36.com\naf360.com\naf4bfc60f11011.beer\naf8d4587126e00c0.com\nafaisouth.com\nafang.com\nafanti100.com\nafarway.com\nafbd4a3905a4a9a5.com\nafca-asia.org\nafca6b82c11032.beer\nafcec.com\nafcfsf.xyz\nafdian.com\nafdian.net\nafdiancdn.com\nafdsc.com\nafdvr.com\nafe-whatsepp.com\nafea4f9221023.beer\nafeica.com\nafengblog.com\nafengsoft.com\nafenxi.com\naffann.com\naffluenze.com\nafgame.com\nafhao.com\nafirstsoft.com\nafj.cc\nafjk.com\nafjob88.com\naflink.com\naflytec.com\nafrican-styles.com\nafriendx.com\nafrindex.com\nafshanghai.org\nafszc.com\naft1v1.com\naft56.com\naftersale-amazon.com\naftersales.cc\naftvc.com\nafudan.com\nafunapp.com\nafuvip.com\nafzhan.com\nag03.com\nag8.com\nagcen.com\nagcloudcs.com\nagconnect.link\nage.tv\nage06.com\nage6000.com\naged100.com\nagedm.app\nagefans.com\nagel-tech.com\nagelocer.com\nagenge.com\nagenow.com\nagentyun.com\naggresmart.com\naghcdn.com\nagi360.xyz\nagile-china.com\nagileex.com\naginomoto.com\nagiquery.com\nagiso.com\nagitationi.com\nagitekservice.com\naglory.com\nagmos012.com\nagnaw.com\nagoow.com\nagora.io\nagoralab.co\nagpolis.com\nagrantsem.com\nagriotcloud.com\nagrittex.com\nagrochemshow.com\nagrodt.com\nagrofairs.com\nagrosg.com\nagrowingchina.com\nagstt.com\nagtech.ltd\nagucn.com\nagui.cc\nagumd.com\nagv-amr.com\nagvag.com\nagxs.net\nah-inter.com\nah-suuwaa.com\nah-zl.com\nah12333.com\nah163.com\nah163.net\nah3c.com\nah788.com\nah7907.com\nah8.cc\nah9yu.com\nahacpp.com\nahaec.com\nahaiba.com\nahaiba.net\nahalei.com\nahanxun.com\nahaohao.com\nahaoyw.com\nahatjt.com\nahauto.com\nahbagy.org\nahbanker.com\nahbb.cc\nahbbsun.com\nahbbtv.com\nahbrt.com\nahbsxh.com\nahbxgwy.com\nahbys.com\nahbzgs.com\nahbztv.com\nahbzxnykj.com\nahbzyy.com\nahc.ink\nahcaijing.com\nahcaw.com\nahceisc.com\nahcfrc.com\nahchanye.com\nahcnb.com\nahcoating.com\nahcsdz.com\nahcyfc.com\nahczqy.com\nahczwater.com\nahdaer.com\nahdahda.com\nahdbsst.com\nahdci.com\nahdf56.com\nahdfjt.com\nahdhf.com\nahdjbh.com\nahdngj.com\nahdohpiechei.com\nahdsez.com\nahdxj.com\nahdzfp.com\naheading.com\nahean.com\nahetyy.com\nahfda.com\nahfeixi.com\nahfensitong.com\nahfg.net\nahfgb.com\nahfszx.com\nahfytx.com\nahgae.com\nahgkw.org\nahglj.com\nahgssh.com\nahguangbo.com\nahgyrn.com\nahgzedu.com\nahhaige.com\nahhanmi.com\nahhaoze.com\nahhbxh.com\nahhcbiotech.com\nahhdb.com\nahhhjx.com\nahhkedu.com\nahhngsjt.com\nahhnsz.net\nahhome.com\nahhouse.com\nahhsxyy.com\nahhtzx.com\nahhwdp.com\nahhyzn.com\nahhzi.com\nahianzhang.com\nahiib.com\nahinv.com\nahipi.com\nahitv.com\nahjdq.com\nahjgxy.com\nahjiankong.com\nahjinyu.com\nahjixi.com\nahjk.com\nahjkjt.com\nahjlcd.com\nahjoe.com\nahjpgroup.com\nahjsexam.com\nahjszls.com\nahjtxx.com\nahjyec.com\nahjzjy.com\nahjzw.com\nahjzzs.com\nahkds.com\nahkemi.com\nahkende.com\nahkjksw.com\nahkjwx.com\nahkxsoft.com\nahlca.org\nahlib.com\nahlife.com\nahljnews.com\nahlqgs.com\nahlsm1.com\nahltgroup.com\nahluqiao.com\nahlxb.com\nahlyjt.com\nahlzgd.com\nahmif.com\nahmky.com\nahmwgroup.com\nahnanfang.com\nahnec.com\nahnluh.com\nahnmc.com\nahno-tool.com\nahnxs.com\nahohai.com\nahome365.com\nahomezc.com\nahougn.com\nahpdkj.com\nahphi.com\nahplm.com\nahqian.com\nahqmdq.com\nahqxsw.com\nahrccp.com\nahrcu.com\nahrcw.com\nahread.com\nahrenji.com\nahrenkun.com\nahrsksw.net\nahrunzi.com\nahs.pub\nahsalt.com\nahscl.com\nahscxyy.com\nahsea.com\nahsfdxrmyy.com\nahshbszyyy.com\nahsj-group.com\nahsjxjy.com\nahsjyxh.com\nahspxh.com\nahsqjt.com\nahssgs.com\nahssnews.com\nahsthzx.com\nahswyz.com\nahsxkyb.com\nahsxscsw.com\nahsyj.com\nahsylsy.com\nahsz.tv\nahszbx.com\nahteacher.com\nahtelit.com\nahtlbyby.com\nahtongyuan.com\nahtrq.com\nahtxyyjt.com\nahtypg.com\nahuano.com\nahubbs.com\nahudows.com\nahuyi.com\nahwater.net\nahwbkf.com\nahwjnews.com\nahwjxx.com\nahwmw.com\nahwmyy.com\nahwnqzs.com\nahwnwl.com\nahwwnews.com\nahwwx.com\nahwxcs.com\nahwxhr.com\nahxcyy.com\nahxmgk.com\nahxunbu.com\nahxwkj.com\nahxyol.com\nahydnet.com\nahyessoft.com\nahyijiali.com\nahyiqing.com\nahyouchengedu.com\nahyouth.com\nahyqx.com\nahysxh.com\nahyuning.com\nahyx.cc\nahyx.net\nahyyxh.com\nahyzzx.com\nahzcw.cc\nahzp.com\nahzs10000.com\nahzssw.com\nahztsh.com\nahzxy.com\nahzyw.com\nai-abc.com\nai-anchor.com\nai-augmented.com\nai-cai.com\nai-cctv.com\nai-classes.com\nai-cool.com\nai-daxue.com\nai-factory.com\nai-indestry.com\nai-qingchang.com\nai-rtc.com\nai-start.com\nai-test.com\nai-thinker.com\nai-vip.net\nai-ways.com\nai-yuanjing.com\nai.cc\nai.run\nai012.com\nai0513.com\nai257.com\nai572.com\nai7.com\nai7.org\naiacfo.org\naiacgn.com\naiagain.com\naiagain.net\naiage.com\naiaigame.com\naiaigu168.com\naiaitie.com\naialbb.com\naianno.com\naiaor.com\naiappx.com\naiba.com\naibaimm.com\naibang.com\naibang.run\naibangbaoxian.net\naibanges.com\naibank.com\naibank.link\naibao.com\naibaocloud.com\naibaogao.com\naibaohu.com\naibaov.com\naibaoxian.com\naibase.com\naibeike.com\naibiaomei.com\naibiaow.com\naibing.cc\naibll.com\naibo123.com\naiboce.com\naiboco.com\naibookba.com\naibreeno.com\naibrm.com\naibwz.asia\naic707.com\naicai.com\naicaicdn.com\naicailang.com\naicairen.com\naicait.com\naicccloud.com\naicdn.com\naicdn.work\naicdn2.com\naicdn3.com\naicdn4.com\naicdn5.com\naichagu.com\naichaicp.com\naichan.info\naichangbaishan.com\naichaoxing.com\naichat.net\naichat1234.com\naichehome.com\naichi-zhe.com\naichinaw.com\naichunjing.com\naiclicash.com\naiclk.com\naicloud.com\naicoauto.com\naicode.cc\naicoinstorge.com\naiconn.com\naicsemi.com\naicsuk.net\naicthink.com\naicu8.com\naicunfu.com\naicunxibao.com\naicydb.com\naida64.cc\naida64cn.com\naidabest.com\naidai.com\naidaijia.com\naidaily.com\naidaiz.com\naidalan.com\naidangbao.com\naidanji.com\naidapeid.com\naidaxing.com\naidaxue.com\naidcgroup.net\naidcstore.net\naideep.com\naidenleong.com\naidianji.net\naidiao.com\naidien.fun\naidigong.com\naidimedia.com\naidjyun.com\naidlearning.net\naidlux.com\naidoctor.world\naidoczh.com\naidog.com\naidong-ai.com\naidong.me\naidonghai.com\naidoor.net\naidouzuji.com\naidpaper.com\naidream.website\naidrive.com\naidubuluo.com\naidugame.com\naiduoka.com\naidusk.com\naidusk.org\naiduwenxue.com\naidynamic.com\naidytt.com\naiec-alliance.com\naieco.org\naiecoms.com\naiegde.com\naiegle.com\naiema.com\naiemy.com\naieok.com\naier020.com\naier021.com\naier0431.com\naier0755.com\naier0771.com\naier0775.com\naierchina.com\naierfano.com\naierhb.com\naierhs.com\naierlz.com\naieryk.com\naierzy.com\naievsge.com\naieye8.com\naiezu.com\naifabu.com\naifacelab.com\naifamu.com\naifanfan.com\naifang.com\naifanyi.net\naifcdn.com\naifei.com\naifei.info\naifengjie.com\naifengkeji.com\naifenlei.com\naifont.com\naifooler.com\naifoxtech.com\naifu10.com\naifu360.com\naifuturex.com\naifuwus.com\naifuxi.com\naigame.com\naigame100.com\naiganggu.com\naigc-cloud.com\naigc369.com\naigcarena.com\naigccdn.com\naigclsp.com\naigcxm.com\naige010.com\naigei.com\naigewc.com\naigexing.com\naigexing.net\naigo.com\naigobook.com\naigodiy.com\naigodlike.com\naigou.com\naigrammar.net\naigtek.com\naiguhuishou.com\naiguilai.com\naiguo.tech\naigupiao.com\naihaisi.com\naihala.com\naihanfu.com\naihanfu.net\naihangtian.com\naihao.org\naihecong.com\naihehuo.com\naihelp.net\naihelpcn.net\naihero100.com\naihke.com\naihoge.com\naihotel.com\naihst8.com\naihua1998.com\naihuajia.com\naihuaju.com\naihuau.com\naihuazhou.com\naihubs.net\naihuhua.com\naihuishou.com\naii-alliance.org\naiia.xin\naiibii.com\naiig.cc\naiihu.com\naiijournal.com\naiimg.com\naiimooc.com\naiioii.com\naiit.me\naiitec.com\naiiup.com\naiji66.com\naijiajiankang.com\naijianji.com\naijiatui.com\naijiayou.com\naijingu.com\naijishu.com\naijiuku.com\naijizhang.net\naijuhome.com\naik.com\naikaixin.com\naikaiyuan.com\naikan669.com\naikan8.com\naikanba.cc\naikang.com\naikanggroup.com\naikeapp.com\naikep.com\naiketour.com\naikf.com\naikonchem.com\naikucun.com\nail-online.moe\nailaba.com\nailabs.xin\nailai6.com\nailbaba.me\nailemon.net\nailete.com\nailewan.com\naileyun.net\naili.com\nailiao360.com\nailibang.com\nailibi.com\nailingmao.com\nailinux.net\nailinzhou.com\nailipu.com\nailite.com\nailiyun.com\nailom.com\nailongmiao.com\nailuckyboy.com\nailugroup.com\nailuluz.com\nailuntan.com\nailvxing.com\naim-ec.com\naimaker.space\naimap.com\naimatech.com\naimatrix.ai\naimcx.com\naimeas.com\naimeideni.com\naimeifen.vip\naimeike.tv\naimeilid.com\naimengang.com\naimergroup.com\naimeter.com\naimgroupcn.com\naimicron.com\naimilebc.com\naimin1979.com\naimingmed.com\naimingtai.com\naimipay.net\naimiplay.com\naimo.work\naimo2o.com\naimoeart.com\naimoge.com\naimoneshoes.com\naimoon.com\naimsen.com\naimu-app.com\nainas.cc\nainb01010zh.com\nainb12251zh.com\nainiapp.com\nainirobot.com\nainiseo.com\nainiu.net\nainixing.com\nainm.cc\nainol.com\nainuoedu.com\nainyi.com\naioclinic.com\naioexpress.com\naiops.com\naioptics.com\naiotoolbox.com\naip-gz.com\naip.net\naipage.com\naipai.com\naipaike.com\naipaixt.asia\naipaiyinghua.com\naipark.com\naiparkvip.com\naipay.cloud\naipcc-gz.com\naipedu.net\naipenglai.com\naipgy.com\naiphz.com\naipiaxi.com\naipingxiang.com\naipintuan.com\naipiwu.com\naippt.com\naiprose.com\naipu-waton.com\naipuo.com\naipz.com\naiqfd.com\naiqgy.com\naiqi-pharma.com\naiqiangua.com\naiqianxq.com\naiqibaba.com\naiqicha.com\naiqiche.com\naiqin.com\naiqingyu1314.com\naiqisoft.com\naiqiye.cc\naiqiyi.com\naiqiyicloud-mgmt.com\naiqiyicloud.com\naiqiyicloud.net\naiqiyivip.com\naiqle.com\naiqu.com\naiqu.design\naiquxs.com\naiqygogo.com\nair-level.com\nair-matters.com\nair-matters.io\nair-world.com\nair.cc\nairacm.com\nairbft.com\nairboo.com\nairchangan.com\nairchina.com\nairchinacargo.com\nairchinagroup.com\nairchinaim.com\nairchinamedia.com\naircourses.com\naircx.bid\nairdali.com\nairdoc.com\nairdropin.com\nairenche.com\nairepay.net\nairfex.net\nairguilin.com\nairj.website\nairjd.com\nairkunming.com\nairland1966.com\nairleaderchina.com\nairmart.vip\nairmate-china.com\nairmb.com\nairmobyte.com\nairnut.com\nairoha.com.tw\nairpipetech.com\nairpointshop.com\nairportcip.com\nairportcn.com\nairsavvi.com\nairshipads.ru\nairspa.net\nairstar-finance.com\nairstar.com\nairstarfinance.com\nairstarfinance.net\nairtac.com\nairtofly.com\nairtu.me\nairwh.com\nairworksoft.com\naisaohuo.com\naisbeijing.com\naise.chat\naisecurius.com\naisee.tv\naiseeking.com\naiseminar.com\naisenseinc.com\naishangba.info\naishangba.org\naishangyangyu.com\naisharenet.com\naishengji.com\naishenhua.com\naishenqi.net\naishuge.cc\naishuge.la\naishukong.com\naishuola.com\naishushu3.com\naishuttler.com\naisidi.com\naisila.com\naisilipu.com\naisin-sh.com\naisino.com\naisinogd.com\naisinogz.com\naisitool.com\naisixiang.com\naiskr.com\naisky.cc\naiskycn.com\naislharrow.com\naisnogames.com\naisojie.com\naisou.club\naisoutv.com\naispeech.com\naisportsapp.com\naispreadtech.com\naistar.site\naistar666.com\naistudio-app.com\naisx.cc\naisy.com\naitangyou.com\naitaotu.com\naitcfw.com\naite.xyz\naitecar.com\naitecc.com\naitechforsafety.com\naitemall.com\naiterent.com\naitesu.com\naitetech.com\naitiancheng.com\naitielu.com\naiting.com\naitists.com\naititia.com\naitiyu.com\naitkcn.com\naitntnews.com\naito.auto\naitoolwang.com\naitrans.net\naitransfy.com\naituan.com\naituanche.com\naitutor100.com\naitutu.cc\naitype.net\naiufida.com\naiutdns.com\naiuxdesign.com\naiuxian.com\naiuxstudio.com\naiv5.cc\naivaylaco.com\naiveola.com\naivivo.com\naiviy.com\naiviysoft.com\naivote.com\naiwaly.com\naiwan4399.com\naiwan91.com\naiwanba.net\naiwanma99.com\naiwatchs.com\naiwebsec.com\naiwei365.net\naiweibang.com\naiweibk.com\naiweline.com\naiwenyi.com\naiwisland.com\naiworkspace.com\naiwuzhou.com\naiww.com\naixag.com\naixcoder.com\naixiangtan.com\naixiaoduo.com\naixiaoka.net\naixiaola.com\naixiaomedia.com\naixiashu.com\naixiashu.info\naixiashu.net\naixiatxt.com\naixiawx.com\naixiaxs.com\naixiaxsw.com\naixiezuobao.com\naixifan.com\naixigua.com\naixin-ins.com\naixin-life.com\naixin-life.net\naixinmusic.com\naixinwechat.com\naixinwu.org\naixiu.net\naixiuyingyu.com\naixq.com\naixs.info\naixs.org\naixue.net\naixuebanban.com\naixueche.com\naixuedai.com\naixuejun.com\naixuekku.com\naixuesheng.net\naixuetang.com\naixuexi.com\naixyy.com\naixzu.com\naiya.live\naiya8.com\naiyaapp.com\naiyamax.com\naiyangedu.com\naiyanqing.com\naiyaopai.com\naiyecdn.com\naiyewj.com\naiyewjc.com\naiyichuan.com\naiyidu.com\naiyinghun.com\naiyingli.com\naiyingshi.com\naiyinteli.com\naiyishu.com\naiyisoft.com\naiyituo.com\naiyjs.com\naiykj.com\naiyo99.com\naiyong.work\naiyongaiwan.com\naiyou.com\naiyoumi.com\naiyouxi.com\naiyouzj.com\naiyoweia.com\naiysm.com\naiyue520.com\naiyuke.com\naiyunxiao.com\naiyy.org\naizaoqi.com\naizgtc.com\naizhan.com\naizhantj.com\naizhanzhe.com\naizhengli.com\naizhet.com\naizhibo.net\naizhishang.com\naizhugong.com\naizools.com\naizuna.com\naizuopin.com\naizusheng.com\najbcloud.com\najbtv.com\najcass.com\najcctv.com\najclass.com\najedu.com\najfcxx.com\najgts.com\najhchem.com\najhimalayanqf.com\najiang.net\najihuo.com\najinga.com\najiu.xin\najiuqian.com\najkcdn.com\najkdns2.com\najkfc.com\najkimg.com\najkinclude.com\najlty.com\najmide.com\najpysz.com\najrcb.com\najs-app.com\najs17.com\najtmy.com\najuhao.com\najutwatch.com\najwang.com\najxhgy.com\najyg.com\najzq.com\nak-d.tripcdn.com\nak-medical.net\nak-v.tripcdn.com\nak.cc\nak0.tw\nak03150hou.com\nak03211hou.com\nak03220hou.com\nak03230hou.com\nak1ak1.com\nak47ids.com\naka700.com\naka700.net\nakadns88.net\nakadns99.net\nakaifa.com\nakailibrary.com\nakamai.com\nakashadata.com\nakashic.cc\nakaxin.com\nakbchina.com\nakbe.com\nakbing.com\nakbkgame.com\nakcomemetals.com\nakdashang.vip\nakdns.net\nakeeps.com\nakesobio.com\nakey.im\nakey.me\nakey.work\nakeyun.com\nakgjgs.com\nakhlwyy.com\nakhtm.com\nakhy.com\naki-game.com\naki-game.net\naki-game2.com\naki-game2.net\nakile.net\nakjianding.com\nakkogear.com\naklyw.com\nakng.net\nakniu.com\nakoeva.com\nakomr.com\nakoo0509uis.com\nakpig.com\nakplayer.com\nakppt.net\nakptfe.com\nakr-developers.com\nakru.plus\nakscan.com\nakspeedy.com\nakswjt.com\naksxw.com\naku.pub\nakuziti.com\nakylq.com\nakymmzs.com\nal-jin.com\nal8l.com\nalabmed.com\nalaboshuiyan.com\nalacun.com\naladdin-assets.com\naladdin-e.com\naladdin-reagent.com\naladdinedu.com\naladdinnet.com\nalafy.com\nalai.net\nalameal.com\nalanyhq.com\nalavr.com\nalayanew.com\nalayu.com\nalayunchina.com\nalazv.com\nalbeche.com\nalbertaz.com\nalc-iot.com\nalcasset.com\nalcha.com\nalcty.com\nalcy.cc\naldeee.com\naldf.online\naldgo.com\naldnew.com\naldsd.com\naldtop.com\naldwx.com\naledeco-hk.com\naleenote.com\nalenable.com\nalertover.com\nalevelwx.com\nalexhaohao.com\nalexinea.com\nalexpad.fun\nalexyan.cc\nalfa-x.sbs\nalfachemar.com\nalfafull.com\nalfingfuda.com\nalgkfd.com\nalgogear.com\nalgorithmart.com\nalh6.com\nalhug.com\nalhywj.com\nali-api-test.net\nali-cdn.com\nali-expo.com\nali-gtm-01.net\nali-gtm-pressure.com\nali-health.com\nali-restore.net\nali-star.com\nali213.com\nali213.net\nali37.net\naliadvance.com\naliajj.com\nalialipay.com\nalianhome.com\naliapp-inc.com\naliapp.com\naliapp.org\naliappcdn.com\nalibaba\nalibaba-inc.com\nalibaba.com\nalibaba.net\nalibabacapital.com\nalibabachengdun.com\nalibabachengdun.net\nalibabacloud.com\nalibabacorp.com\nalibabadesign.com\nalibabadns.com\nalibabadoctor.com\nalibabafonts.com\nalibabafoundation.com\nalibabafuturehotel.com\nalibabagroup.com\nalibabaonline.com\nalibabapictures.com\nalibabaplanet.com\nalibabastars.com\nalibabatech.org\nalibabatechqa.com\nalibabaued.com\nalibabausercontent.com\nalibjyun.com\nalibjyun.net\nalibole.com\nalibtc.com\nalibtrip.com\nalibuybuy.com\nalic.com\nalicache.com\nalicall.com\nalicaptcha.com\nalicdm.com\nalicdn.com\nalicloud.com\nalicloudapi.com\nalicloudccp.com\nalicloudlayer.com\nalicloudsec.com\nalicloudwaf.com\nalicontainer.com\nalictf.com\nalidata.org\nalidayu.com\naliddmall.com\nalidns.com\nalidns.net\naliedge.com\nalienfans.net\naliensidea.com\nalientek.com\naliexpress-media.com\naliexpress.com\naliexpress.ru\naliexpress.us\nalifabu.com\nalifanyi.com\nalifejk.com\nalifenxiao.com\naligames.com\naligaofang.com\naligenie.com\naligfwaf.com\nalighting.com\nalihd.net\nalihealth.hk\nalihh.com\nalihuahua.com\naliimg.com\naliiotapp.com\nalijijinhui.org\nalijk.com\nalikunlun.com\nalikunlun.net\nalili.tech\naliliying.com\naliloan.com\naliluya.com\nalimama.com\nalimebot.com\nalimmdn.com\nalinx.com\nalinx.vip\naliog.com\nalionexpo.com\nalipan.com\nalipansou.com\nalipay\nalipay-corp.com\nalipay-eco.com\nalipay-inc.com\nalipay-traffic.com\nalipay.com\nalipay.hk\nalipay.net\nalipayauto.com\nalipaycs.com\nalipaydesign.com\nalipaydev.com\nalipaydns.com\nalipayhk.com\nalipaylog.com\nalipaymo.com\nalipayobjects.com\nalipayplus.com\nalipcsec.com\naliplay.com\naliplus.com\nalippm.com\naliqiche.com\naliqq.cc\naliresearch-internal.com\naliresearch.com\nalirtc.com\nalirui.com\nalisealing-pre.com\nalisealing-sit.com\nalisealing-uat.com\nalisealing.com\nalishine.net\naliso.cc\nalisoft.com\nalisolarlight.com\nalisports.com\nalitchina.com\nalithefox.net\nalithon.com\nalitrip.com\nalitrip.hk\nalittle-tea.com\nalittlesoldier.com\naliued.com\naliunicorn.com\naliuv.com\nalivcr.com\nalivecdn.com\nalivv.com\naliway.com\naliwd.com\naliwears.com\naliwork.com\naliwx.net\nalixiaomi.com\nalixiaoyouhui.com\nalixixi.com\nalixox.com\naliyiyao.com\naliyizhan.com\naliyue.net\naliyun-esa.net\naliyun-inc.com\naliyun-iot-share.com\naliyun.com\naliyun.org\naliyun.xin\naliyunbaas.com\naliyunbaike.com\naliyuncdn.com\naliyuncdn.net\naliyunceng.com\naliyuncname.xyz\naliyuncs.com\naliyuncsslb.com\naliyuncsslbintl.com\naliyunddos0002.com\naliyunddos0003.com\naliyunddos0005.com\naliyunddos0006.com\naliyunddos0007.com\naliyunddos0010.com\naliyunddos0011.com\naliyunddos0012.com\naliyunddos0014.com\naliyunddos0015.com\naliyunddos0017.com\naliyunddos0018.com\naliyunddos0019.com\naliyunddos0020.com\naliyunddos0023.com\naliyunddos0024.com\naliyunddos0025.com\naliyunddos0026.com\naliyunddos0027.com\naliyunddos0029.com\naliyunddos0030.com\naliyunddos1001.com\naliyunddos1002.com\naliyunddos1003.com\naliyunddos1004.com\naliyunddos1005.com\naliyunddos1006.com\naliyunddos1007.com\naliyunddos1008.com\naliyunddos1009.com\naliyunddos1010.com\naliyunddos1011.com\naliyunddos1012.com\naliyunddos1013.com\naliyunddos1014.com\naliyunddos1015.com\naliyunddos1016.com\naliyunddos1017.com\naliyunddos1018.com\naliyunddos1019.com\naliyunddos1020.com\naliyunddos1021.com\naliyunddos1022.com\naliyunddos1023.com\naliyunddos1024.com\naliyunddos1025.com\naliyunddos1026.com\naliyunddos1027.com\naliyunddos1028.com\naliyunddos1029.com\naliyunddos1030.com\naliyundrive.cloud\naliyundrive.com\naliyundrive.net\naliyunduncc.com\naliyundunwaf.com\naliyunedu.net\naliyunfile.com\naliyunfuwuqi.com\naliyunga.com\naliyunga0004.com\naliyunga0005.com\naliyunga0006.com\naliyunga0007.com\naliyunga0008.com\naliyunga0009.com\naliyunga0010.com\naliyunga0011.com\naliyunga0012.com\naliyunga0013.com\naliyunga0014.com\naliyunga0015.com\naliyunga0016.com\naliyunga0017.com\naliyunga0018.com\naliyunga0019.com\naliyunga0020.com\naliyunga0021.com\naliyunga0022.com\naliyunga0023.com\naliyunga0024.com\naliyunga0025.com\naliyunga0026.com\naliyunga0027.com\naliyunga0028.com\naliyunga0029.com\naliyunga0030.com\naliyunga0031.com\naliyunga0032.com\naliyunga0033.com\naliyunga0034.com\naliyunga0035.com\naliyunga0036.com\naliyunga0037.com\naliyunga0038.com\naliyunga0039.com\naliyunga0040.com\naliyunga0041.com\naliyunga0042.com\naliyunga0043.com\naliyunga0044.com\naliyunga0045.com\naliyunga0046.com\naliyunga0047.com\naliyunga0048.com\naliyunga0049.com\naliyunga0050.com\naliyunga860004.com\naliyunga8601.com\naliyunga8602.com\naliyunga8603.com\naliyungf.com\naliyungrtn.com\naliyunhelp.com\naliyunhn.com\naliyunidaas.com\naliyunj.com\naliyunjiasu.cloud\naliyunlive.com\naliyunlivetest.com\naliyunos.com\naliyunparking.com\naliyunpds.com\naliyunqifu.com\naliyunrtc.com\naliyunssl3.com\naliyunvpc.com\naliyunwaf.com\naliyunwaf1.com\naliyunwaf2.com\naliyunwaf3.com\naliyunwaf4.com\naliyunwaf5.com\naliyunx.com\nalizhaopin.com\nalizhizhu.com\nalizila.com\nalkpharm.com\nalkuyi.com\nall-in-data.com\nall3c.com\nall4seiya.net\nallapp.link\nallawnfs.com\nallawno.com\nallawntech.com\nallbrightlaw.com\nallchips.com\nallcitygo.com\nallcitysz.net\nalldk.com\nalldobetter.com\nalldragon.com\nalleadprint.com\nallenmarket.com\nallfang.com\nallfootballapp.com\nallfunnies.com\nallgamesky.com\nallhistory.com\nalliancebrh.com\nallianz360.com\nallicdata.com\nallied-corp.com\nalliedrongda.com\nallinbots.com\nallinfinance.com\nallinpay.com\nallinpaygx.com\nallinpayhb.com\nallinpaysz.com\nallinso.com\nalllandnet.com\nalllget.com\nalllook.tv\nallmaga.net\nallmed-china.com\nallmei.com\nallnow.com\nalloyteam.com\nallpay.xin\nallpayx.com\nallpku.com\nallposs.com\nallrace.com\nallred.vip\nallsafeip.com\nallsaintsmusic.com\nallschool.com\nallschoolcdn.com\nallsenseww.com\nallshiping.com\nallshopwatch.com\nallspark-cn.com\nallstack.net\nallstatics.com\nallstor.org\nalltechmed.com\nalltion-cn.com\nalltoall.net\nalltobid.com\nalltopposts.com\nalltosun.com\nalltuu.cc\nalltuu.com\nallvalue.com\nallwellsports.com\nallweyes.com\nallwin368.com\nallwinnertech.com\nallwinso.com\nallyes.com\nallyes.net\nallyfurn.com\nallystar.com\nallyvn.com\nalminecn.com\nalmondoy.com\nalnan.com\nalo7.com\naloha-ukulele.com\nalonemonkey.com\nalong96.com\nalongsky.com\nalookweb.com\nalpha-browser.com\nalpha-star.org\nalphabiopharma.com\nalphabole.com\nalphassl.com\nalphay.com\nalrailpha.com\nalskbc.com\nalsolife.com\nalsovalue.com\nalszxyy.com\naltamob.com\naltratek.com\naltstory.com\naltwavehub.cfd\naltxw.com\nalu-ledprofile.com\naluaa.com\naluminiumchina.com\naluntan.com\nalwaysnb.com\nalwayzev.com\nalwindoor.com\nalxw.com\nalyasset.com\nalyisheng.com\nalypw.com\nalyzq.com\nalzls.com\nalzscl.com\nam-sino.com\nam1116.com\nam774.com\nam810.net\nam89.com\namaiche.com\namallb2b.com\namalrob.com\namantang.com\namanyi.com\namap.com\namapauto.com\namarsoft.com\namassfreight.com\namasswww.com\namaxchina.com\namayad.com\namazfit.com\namazingsys.com\namazom-update.com\nambassadorchina.com\namberbj.com\namberedu.com\namberhotelsgroup.com\namberknit.com\nambier.net\nambition-soft.com\nambow.com\namcarebsh.com\namcaresz.com\namcarewl.com\namcfortune.com\namchamchina.org\namcvoyages.com\namdotibet.com\namec-inc.com\namegroups.org\nameisx.com\namemv.com\namemv.net\nameow.xyz\namericachineselife.com\namethystum.com\namexpressnetwork.com\nameya360.com\namflowbikes.com\namflower.com\namgbs.com\namgepic.com\namh.sh\namhimalayanet.com\namhl.net\namiao.co\namicc.com\namijiaoyu.com\namindbox.com\naminglinux.com\namishii.com\namishow.com\namivian.com\namiyabot.com\namo-solar.com\namo9.com\namobbs.com\namoe.cc\namonxu.com\namoydxmed.com\namp-intl.com\nampcn.com\namperobots.com\namphenol-auto.com\namphenol-industrial.com\namphenol-jet.com\namphibiachina.org\namplesky.com\namplly.com\nampmake.com\nampxl.com\namqyl.com\nams-aigc.com\namsky.cc\namsoveasea.com\namssro.net\namswater.com\namtbbs.org\namtf18.com\namtjt.com\namtron-ic.com\namuletj.com\namuletor.com\namuluze.com\namunion.com\namusic.shop\namyart360.com\namymx.org\namyroutes.com\namysql.com\namyxun.com\namz123.com\namz520.com\namz800.com\namzcaptain.com\namzcfo.com\namzdh.com\namzkeys.com\namzmm.com\namzndns-cn.biz\namzndns-cn.com\namzndns-cn.net\nan1health.com\nan2.net\nan68.com\nanalog.com\nanalogfoundries.com\nanalysysdata.com\nanan123.vip\nanan666.com\nanandoor.com\nanandzhang.com\nananlighting.com\nananpet.com\nanao.vip\nanatuprak.com\nanav.com\nanbang-life.com\nanbanggroup.com\nanbaool.com\nanbokeji.net\nancbk.com\nancda.com\nancdwqob.asia\nancesours.com\nanchnet.com\nancii.com\nancun.com\nanda-cn.com\nanda-tech.com\nandaike.com\nandakc.com\nandan.me\nandazr.com\nandcaifu.com\nandemed.com\nandertechs.com\nandes.tech\nandesbrain.com\nandeshengtec.com\nandfx.net\nandgele.com\nandhj.com\nandpay.me\nandreader.com\nandroid-doc.com\nandroid-studio.org\nandroidesk.com\nandroidga.com\nandroidinvest.com\nandroidmi.com\nandroidmov.com\nandroidonline.net\nandroidperformance.com\nandroidtea.com\nandtosi.com\nandwi.com\nandygcj.com\nandyx.net\nane56.com\naneasystone.com\nanei.tv\nanestcang.com\nanetuo.com\nanf-z.com\nanfan.com\nanfangnews.com\nanfangzb.com\nanfeng.com\nanfensi.com\nanfine-healthcare.com\nanfipet.com\nangeeks.com\nangel-game.net\nangel-hospital.com\nangel-medical.net\nangel-usa.com\nangelacon.com\nangelakillian.com\nangelarabbit.com\nangelcrunch.com\nangelhome.org\nangeljjangnara.com\nangell-studio.com\nangelmom.org\nangeltranslation.com\nangelyeast.com\nangelyeast.ru\nangelyeast.xyz\nangine.tech\nangleebeauty.com\nanglo-chinese.com\nangogotech.net\nangrymailer.com\nangrymiao.com\nangui.org\nanguilasia.com\nanguomob.com\nangustar.com\nangwei.net\nanhei2.com\nanhei3.net\nanheng.com\nanhengcloud.com\nanheyu.com\nanhkgg.com\nanhouse.com\nanhuaedu.com\nanhuanjia.com\nanhui-expressway.net\nanhui365.net\nanhuiaia.com\nanhuicta.com\nanhuigaokao.com\nanhuihr.com\nanhuihuayun.com\nanhuijszp.com\nanhuilife.com\nanhuimeijia.com\nanhuimobile.com\nanhuinews.com\nanhuiry.com\nanhuisjx.com\nanhuisuya.com\nanhuiwine.com\nanhuiyun.com\nanhuizk.com\nani-sh.com\naniccw.net\naniceapp.com\nanicoga.com\nanictdns.click\nanictdns.store\nanijue.com\nanileyehospital.org\nanimalchina.com\nanimate.art\nanimationcritics.com\nanimetamashi.com\nanimetaste.net\nanischools.com\nanitama.net\naniu.com\naniu.so\naniu.tv\naniworld.tv\nanjgas.com\nanji-ceva.com\nanji-logistics.com\nanji-tonghui.com\nanji66.net\nanjia.com\nanjiala.com\nanjialaw.com\nanjian.com\nanjianghu.net\nanjiangshi.com\nanjiechem.com\nanjiecorp.com\nanjifood.com\nanjilog.com\nanjimicro.com\nanjismart.com\nanjixg.com\nanjoyfood.com\nanjubao.com\nanjujituan.com\nanjuke.com\nanjukestatic.com\nankai.com\nankang.net\nankang06.org\nankangfulu.com\nankangtong.com\nankangwang.com\nankaotong.com\nankebio.com\nankelife.com\nankeni.net\nanker-in.com\nankerjiedian.com\nankevip.com\nankeyunda.com\nankianki.com\nankichina.net\nankki.com\nankobot.com\nankogroup.com\nankuai.net\nanl-cn.com\nanlai.com\nanlaiye.com\nanlewo.com\nanlian.co\nanliantest.com\nanlibaby.com\nanlilaw.com\nanlink.com\nanlitai.com\nanlogic.com\nanlu.net\nanlu114.com\nanlusy.com\nanmco8.com\nanmeisheng.com\nanmo.com\nanmobc.com\nanmpserver.com\nanmumchina.com\nann9.com\nannabelz.com\nannainj.com\nannearkham.com\nanneijun.com\nannelhair.com\nannhe.net\nanniekids.net\nannil.com\nannoron.com\nannto.com\nannuoxun.com\nanoah.com\nanonym-hi.com\nanosmcloud.com\nanoyi.com\nanpig.com\nanpsk.org\nanpu119.com\nanpush.com\nanpuzx.com\nanqingonline.com\nanqingwt.com\nanqingzhiyun.com\nanqn.com\nanqu.com\nanquan.info\nanquan.org\nanquanbao.com\nanquanjs.com\nanquanke.com\nanquanone.com\nanquanssl.com\nanquantong.com\nanquanzhao.com\nanran233.com\nanrangas.com\nanranhs.com\nanrayer.com\nanren.org\nanrenmind.com\nanrenxmed.com\nanrlm.com\nanruan.com\nanruichina.com\nansendun.com\nanshahouse.com\nanshibuff.com\nanshiduo.com\nanshig.com\nanshinko.com\nanshism.com\nanshunfiber.com\nanshunholdinggroup.com\nanshuntech.ltd\nansiding.com\nansimeter.com\nansky.com\nansteelgroup.com\nansucai.com\nansuner.com\nansxtech.com\nant-biz.com\nant-cloud.net\nant-financial.com\nant-open.com\nanta.com\nantaifans.com\nantaiib.com\nantairui.net\nantangbusiness.com\nantao.hk\nantaq.com\nantbank.hk\nantbuyhot.com\nantchina.com\nantcloud-miniprogram.com\nantcut.com\nantdigital.com\nantebao.com\nantebo.com\nantekoptics.net\nantespace.com\nantewer.com\nantfans.com\nantfin-inc.com\nantfin.com\nantfinancial-corp.com\nantforecast.com\nantfortune.com\nantgroup.com\nantgv.com\nantibanads.com\nantibodychina.com\nanticheatexpert.com\nantiquelearn.com\nantiviruspcsuite.com\nantiy.com\nantiy.net\nantmoe.com\nantom.com\nantpcdn.com\nantpedia.com\nantping.com\nantplay888.com\nantriver.com\nantrol.com\nantsdaq.com\nantso.com\nantsoo.com\nantspainter.org\nantto.cc\nantuan.com\nantuan365.com\nantuni.com\nantuofh.com\nantutu.com\nantutu.net\nantvr.com\nantwork.link\nantyikangih.com\nanw.red\nanweilan.com\nanweishi.com\nanweizhi.com\nanwen.cc\nanwfm.com\nanwha-auto.com\nanxia.com\nanxiangkeji.net\nanxiaoer.com\nanxin.com\nanxin.link\nanxin168.com\nanxin360.com\nanxin360.net\nanxinapk.com\nanxinbianmei.com\nanxindavisa.com\nanxinfloor.com\nanxinfloors.com\nanxinlirong.com\nanxinmai.com\nanxinssl.com\nanxintrust.com\nanxinwangdun.com\nanxinyisheng.com\nanxinzhonghui.com\nanxiu.com\nanxiw.com\nanxjm.com\nanxunshihui.com\nany123.com\nany8.com\nanyan.com\nanyang100.com\nanyangedu.com\nanyant.com\nanybeen.com\nanybox.com\nanychem.com\nanycoh.com\nanycross.com\nanycubic.com\nanye.xyz\nanyelse.com\nanyew.com\nanyforprint.com\nanyforweb.com\nanygame.info\nanyihua.com\nanyimai.com\nanyizn.com\nanyka.com\nanyknew.com\nanyline.org\nanymcu.com\nanymetre.com\nanyni.com\nanynote.org\nanyolife.com\nanyong.net\nanyoy.com\nanyrtc.io\nanyrui.win\nanysafer.com\nanyscdn.com\nanyskygame.com\nanysql.net\nanystandards.com\nanytesting.com\nanytocopy.com\nanyun100.com\nanyunjianzhan.com\nanyv.net\nanyview.net\nanyway.fm\nanyway.red\nanywlan.com\nanywood.com\nanyxz.com\nanzerclub.com\nanzext.com\nanzhen.org\nanzhengshipin.com\nanzhi.com\nanzhiguolv.com\nanzhitan.com\nanzhixun.com\nanzhuauto.com\nanzhuo.com\nanzhuo.me\nanzhuoapk.com\nanzhuoe.com\nanzhuoshouzhuan.com\nanzmy.com\nanzogame.com\nanzow.com\nao-di.com\nao-hua.com\naoao365.com\naoaob.com\naoasign.com\naobacore.com\naobaishi.com\naobanghb.com\naoboor.com\naobosoft.com\naocde.com\naocdn.com\naoch.com\naochengcdn.com\naocslb.com\naocter.net\naodabo.tech\naodaliyaqianzheng.com\naodbw.com\naoddoll.com\naode8.com\naodeline.com\naodeng.cc\naodianyun.com\naodingsy.com\naoecq.com\naoedi.com\naoerdz.com\naoetech.com\naofanxx.com\naofeida.com\naofenghuanjing.com\naofenglu.com\naofs.vip\naogocorp.com\naograph.com\naoguan.com\naoguansteel.com\naoguanwns.com\naohaosiyq.com\naohuasports.com\naohuatextiles.com\naojauto.com\naojia-oil.com\naojiahuashare.com\naojian.net\naojian2.net\naojiaostudio.com\naojiyingyu.com\naojiyouxue.com\naoju.net\naokang.com\naokangsports.com\naolai.com\naolaigo.com\naoligei.site\naolijsj.com\naolinjy.com\naolinpharma.com\naoliongame.com\naolvyou.com\naolylcd.com\naomao.com\naomeikeji.com\naomolit.com\naomygodstatic.com\naonaotu.com\naoni.cc\naoofu.com\naoogee.com\naoohu.com\naoongmob.com\naooooz.com\naopayun.com\naoqiangtc.com\naorankj.com\naoratec.com\naoscdn.com\naoscom.net\naosenm.com\naosens.com\naoseo.com\naoserp.com\naoshine.com\naoshitang.com\naoshite.net\naoshowsh.com\naoshu.com\naosikazyimage.com\naosong.com\naosoo.com\naoswtc.com\naotaidianqi.com\naotchina.com\naotian.com\naoto.com\naotoso.com\naotrip.net\naotuzuche.com\naotxland.com\naoun.ltd\naovud.com\naowei-sh.com\naowei.com\naowenmarketing.com\naoxiang100.com\naoxingrelang.com\naoxintong.com\naoxsb.com\naoy-power.com\naoya-hk.com\naoyanchang.com\naoyangzg.com\naoyanwl.com\naoye.com\naoyige.com\naoyii.com\naoyiluoad.com\naoyor.com\naoyotech.com\naoyou.cc\naoyou.com\naoyou365.com\naoyoulife.com\naoyoux.com\naoyu100.com\naoyuanlives.com\naoyunque.com\naozare-acemak.com\naozare-avernai.com\naozhanls.com\naozhougoufang.com\nap-china.com\nap1983.com\nap88.com\nap8888.com\napaas-zone-test.com\napabi.com\napad.pro\napartments-bj.com\napayun.com\napbiao.com\napcc2.com\napcdns.com\napcdns.net\napclc.com\napcso.com\napcta.com\napcups.org\napcupse.com\napdcdn.com\nape8.com\napearth.com\napecloud.ltd\napecome.com\napehorse.com\napeloa.com\napesk.com\napet.vip\napetdog.com\napetops.com\napevolo.com\napexhuntingau.com\napexmic.com\napexquartzstone.com\napextechnik.com\napeyun.com\napfeien.com\napgoview.com\naphidic.com\napi-expo.com\napi-forwards.com\napi-m.com\napi-vod-qcloud.com\napi.anythinktech.com\napi.so\napiairasia.com\napiandroid.com\napicase.io\napicgate.com\napichina.com\napickup.com\napicloud.com\napifabric.net\napifox.com\napifoxmock.com\napigateway.info\napigwtencent.com\napilyzy.com\napim.work\napimkt.net\napipost.net\napira.org\napirc.org\napiseven.com\napispace.com\napistd.com\napitask.com\napitd.net\napitutu.com\napiunion.com\napiview.com\napizl.com\napizza.cc\napizza.net\napjingsi.com\napk02061oo.xyz\napk3.com\napk4399.com\napk8.com\napkbus.com\napkdv.com\napkevery.com\napkhot.com\napkj.com\napkpackagesys.com\napkplug.com\napkrj.com\napkxz.com\napkyx.com\napkzu.com\naplaybox.com\naplnk.com\naplum-inc.com\naplum.com\naplus100.com\napluscap.com\naplusda.org\naplusunion.com\napmarry.com\napmbooth.com\napme-magnetics.com\napmengfan.com\napmgmedical.com\napmvista.com\napnring.com\napodaenvi.com\napollo-platform.com\napollo-share.com\napollo.auto\napolloon-group.com\napollopump.com\napollotop.com\napous.com\napowo.com\napowogame.com\napoyl.com\napp-router.com\napp001.com\napp0772.com\napp111.com\napp111.org\napp1116.app\napp16688.com\napp168.cc\napp17.com\napp178.com\napp2006.com\napp2pixel.com\napp86.com\napp887.com\nappadhoc.com\nappadhoc.net\napparest.com\nappbi.com\nappbk.com\nappbocai.com\nappbsl.com\nappbw.com\nappbz.info\nappbza.com\nappchina.com\nappchizi.com\nappcms.org\nappcoo.com\nappcool.com\nappcpa.co\nappcpa.net\nappcpx.com\nappcup.com\nappdao.com\nappdi.com\nappdown.info\nappdp.com\nappeasou.com\nappeeres.com\nappfeng.com\nappfimo.com\nappganhuo.com\nappgenuine.com\nappia.vip\nappicad.net\nappicplay.com\nappidfx.com\nappifan.com\nappinn.com\nappjiagu.com\nappkaifa.com\nappkefu.com\napplausefz.com\napple-corer.com\napple-x2.xyz\napple110.com\napple114.com\napple17.club\napple4.us\napple523.club\napple886.com\nappleadstech.com\napplebl.com\napplejp.cloud\napplemei.com\napplepopo.com\nappletuan.com\napplex.net\napplezhang.com\napplinzi.com\napplm.com\napplogcdn.com\napplogo.net\napplon.net\napplysquare.com\napplysquare.net\nappmifile.com\nappmiu.com\nappnode.com\nappol.com\nappollochina.com\nappotronics.com\nappqv.com\napprovebook.com\napps-solayer.org\napps121.com\nappscan.io\nappsflower.com\nappsflyer-cn.com\nappshike.com\nappshop.cc\nappsimg.com\nappsina.com\nappso.com\nappstorehuan.com\napptao.com\napptaxi.net\napptrackerlink.com\nappubang.com\nappublisher.com\nappurl.cc\nappurl.me\nappvipshop.com\nappweb1.com\nappweiyuan.com\nappwill.com\nappwuhan.com\nappwuhan.net\nappxzz.com\nappyao.com\nappying.com\nappykt.com\nappyouni.com\nappzhigong.com\nappzhonghua.com\naprche.net\napriltq.com\naprunchuang.com\napsdai.com\napsfon.com\napsgo.com\napsoto.com\napspharm.com\naptchina.com\naptchip.com\naptdn.net\naptenon.com\napubond.com\napusic.com\napwuyou.com\naq2y.com\naqara.com\naqb.so\naqbxcdn9.com\naqbz.org\naqc100.com\naqd-tv.com\naqdcdn.com\naqdesk.com\naqdlt.net\naqdstatic.com\naqee.net\naqfen.com\naqgygc.com\naqhospital.com\naqidb.org\naqioo.com\naqisite.com\naqjx.com\naqjz.net\naqlife.com\naqniu.com\naqpta.com\naqqcx.com\naqrose.com\naqrsblg.com\naqsc.org\naqsiqauto.com\naqtd.com\naqtowngas.com\naqtwpc.com\naqtwwx.net\naqtwwxemail.com\naqtxt.net\naqua-worth.com\naquabk.com\naquacity-tj.com\naquair-china.com\naquanliang.com\naquanutriera.com\naquanyou.com\naquapipetech.com\naquaterramail.com\naquathlondenice.com\naquaticowatch.com\naquayee.com\naquazhuhai.com\naqueck.com\naqumon.com\naqxx.org\naqyad.com\naqyqqy.com\naqyun.com\naqyzm.com\naqzpw.com\naqzt.com\naqzyzx.com\nar-max.com\nar0101.com\narabsquash.com\naragexpo.com\naraldite2014.com\naranya.cc\narapp.online\naray1981.com\narayzou.com\narbays.com\narc-uds.com\narcas-da.com\narcdmi.com\narchaeuscapital.com\narchcollege.com\narchcookie.com\narchcy.com\narchermind.com\narcheros.com\narchgo.com\narchgrid.xyz\narchi-motive.com\narchiant.com\narchina.com\narchiname.com\narchio.pro\narchiposition.com\narchitbang.com\narchrd.net\narchsummit.com\narco.design\narcsoftai.com\narcstack.club\narcteryx-log.com\narctic007.com\narcticray.com\narctiler.com\narctime.org\nard-china.com\nardmon.com\nardsec.com\nareader.com\narealx.com\narebz.com\narefly.com\narenabreakoutcn.com\narerberte.com\nareweloongyet.com\narextecn.com\narglasses.work\nargylehotels.com\narhoo.com\nariacraft.net\narielcosmetic.com\narin-elec.com\narinchina.com\narisastar.com\nark301.com\narkfeng.xyz\narkfwq.com\narkid.cc\narkid.org\narkntools.app\narkoo.com\narkrdigital.com\narkread.com\narks.red\narksz.com\narliki.com\narlmy.me\narm9.net\narm9home.net\narmbbs.net\narmchina.com\narmdesigner.com\narmfly.com\narmin.cc\narminuntor.com\narmourtires.com\narmracolostrumes.site\narmsrock.com\narmsword.com\narmvm.com\narmystar.com\narnstbearing.com\narocmag.com\naroseks.com\narowanahome.com\narp.cc\narpbox.com\narpun.com\narqinge.com\narrbid.com\narromaxinc.com\narrow-sh.com\narrow-tower.com\narrowceramic.com\narrowos.net\narrowwardrobe.com\nars-china.com\narswp.com\narswz.com\nart-ba-ba.com\nart-child.com\nart-coding.com\nart138.com\nart238.com\nartacode.com\nartaime.com\nartbookinchina.com\nartcg.design\nartcool.com\nartcto.com\nartdata.net\nartebuy.com\nartech-graphite.com\nartemedhospital.com\narterytek.com\nartexamcq.com\nartfinace.com\nartfoxlive.com\nartgogo.com\narthals.ink\narthing.org\narthome163.com\narthubdam.com\narthurchiao.art\narthurpharma.com\narticclothes.com\narticle.cool\nartimg.net\nartinchip.com\nartisan-cloud.com\nartisan-tek.com\nartistry-club.com\nartistrylab.net\nartlianhe.com\nartlinkart.com\nartlnk.com\nartmuseumonline.org\nartnchina.com\nartop-sh.com\nartopgroup.com\nartopia-group.com\nartp.cc\nartpangu.com\nartpro.com\nartpro.vip\nartproglobal.com\nartrade.com\nartrobot.com\nartron.net\nartronartdata.com\nartronimages.com\nartrus.net\narts-nj.com\nartsbuy.com\nartshanghaifair.com\nartsoa.com\nartverse.work\nartvisioncg.com\nartwaker.com\nartwe.com\nartwun.com\nartww.com\nartxun.com\narvato-ocs.com\narvinhk.com\naryasec.com\nas-doll.com\nas-hitech.com\nas.mr\nas01271kkp.xyz\nas02010kkp.xyz\nas16.com\nas3f.com\nas5.com\nas66588.com\nasa-asia.com\nasasd.online\nasatiles.com\nasattitude.com\nasbazainville.org\nasc-events.org\nasc-wines.com\nascend-bio.com\nascendgene.com\nascendgz.com\nascenpower.com\nascentawits.com\naschina.org\naschip.com\naschtj.com\nasciima.com\nasczwa.com\nasczxcefsv.com\nasd.red\nasd868.com\nasdbfjoiug.com\nasdeshan.com\nasdf-bj.net\nasdf010.com\nasdlkjf.com\nasdx.io\nasean-china-center.org\naseann.com\naseanparts.com\nasemi360.com\nasemi99.net\nasen-pharm.com\naseoc.com\naseoe.com\nasf4asgfrxc.com\nasfuwu.com\nasfzl.net\nasgezhi.com\nashan.org\nashidc.com\nashining.com\nashoucang.com\nashqgpxy.com\nashsilent.com\nashvsash.net\nasi-midea.com\nasia-cdn.com\nasia-dns.com\nasia-sh.com\nasiabt.com\nasiaci.com\nasiacold.com\nasiacool.com\nasiacorp.net\nasiadvb.net\nasiae.com\nasiaeap.com\nasiaecs.com\nasiafactor.com\nasiafm.hk\nasiafm.net\nasiagreenfund.com\nasiaidc.net\nasiainfo-sec.com\nasiainfo.com\nasiainfo.org\nasiainfodata.com\nasiametallurgical.com\nasianev.com\nasianewsphoto.com\nasianmetal.com\nasiarobot.net\nasiaseiki.com\nasiasymbol.com\nasiatelco.com\nasiayun.com\nasiet.net\nasifadeaway.com\nasilu.com\nasim-emc.com\nasimi8.com\nasit.cc\nasjnu.com\nask.amd.com\naskbrisk.com\naskci.com\naskdd.org\naskdiandian.com\naskemq.com\nasketchup.com\naskk.cc\nasklib.com\nasklink.com\naskpanda.cc\naskququ.com\naskraste.com\nasktao.com\nasktempo.com\nasktug.com\naskxt.org\nasleyu.com\naslk2018.com\nasls.space\nasm64.com\nasmasm.com\nasmlc.com\nasmr.gay\nasmr.red\nasnlab.com\nasnlab.org\nasnowsz.com\naso.ink\naso100.com\naso114.com\naso120.com\nasoasm.com\nasosde.com\nasosoaiid.com\nasp168.com\nasp300.com\nasp300.net\nasp8php.com\naspbc.com\naspcms.com\naspiration-cn.com\naspirationtesting.com\naspire-info.com\naspirecn.com\naspiresun.com\naspnet.tech\naspsky.net\naspx.cc\naspxhome.com\nasqhr.com\nasqql.com\nasr-cn.com\nasrmicro.com\nassassinscreedcodenamejade.com\nassemblydragon.com\nasset-us-store.msi.com\nasset-vendor-event.msi.com\nasset.msi.com\nassets-global.viveport.com\nassets.uxengine.net\nassrt.net\nassyrb.com\nastbbs.com\nasterfusion.com\nasteriavs.com\nastestech.com\nastfc.com\nasthis.net\nastipaint.com\nastra-biotech.com\nastraintel.com\nastral-vector.com\nastroai-in.com\nastroaio.com\nastron.ac\nastronergy.com\nastropulsion.com\nastrostanleystudio.com\nasty664.com\nasujp.com\nasurada.zone\nasus-sh.com\nasussmart.com\nasusw.net\nasvm.net\naswetalk.net\nasxrpcb.com\nasxw.net\nasxzcn.com\nasyzonline.com\naszhuyuan.com\nat-e.com\nat0086.net\nat188.com\nat317.com\nat58.com\nat78.com\nat98.com\nata-edu.com\nata-test.net\natacchina.com\natanyu.com\natatech.org\natats.shop\natb.so\natbug.com\natc-sh.com\natcc360.com\natchip.com\natcloudbox.com\natcontainer.com\natcpu.com\naterminal.net\natfeng.com\natgbiotechnology.com\natguigu.com\natguigu.org\nathaitao.com\nathensgamulch.com\nathmapp.com\nathub.com\natianqi.com\natidesoft.com\natido.com\natimeli.com\nating.info\natjoqgi.com\natk-film.com\natk.pro\natk.store\natkgear.com\natlab.ai\natlaslovestravel.com\natlhb.com\natlmall.com\natlxm.com\natmbox.com\natmcu.com\natmib.com\natmlimited.com\natmob.com\natob100.com\natobo.com\natollbath.com\natom-hitech.com\natomgameteam.com\natomgit.com\natomgit.net\natomhike-en.com\natomhike.com\natomic-art.com\natomlife.net\natomlock.com\natpanel.com\natrenew.com\natri.ink\natriptech.com\natrustdns.com\nats6355866.com\natshph.com\natstudy.com\natsws.com\nattacker.fit\nattainsgroup.com\nattendees.link\natticus.vip\nattomotion.com\nattop.com\nattri.mobi\nattribuly.com\natukjhesk.com\natum-tech.net\natuoyi.com\natwbz.com\natwtech.net\natyomi.com\natyun.com\natyun.net\natzjg.net\natzlinux.com\natzuche.com\nau-daiwa.shop\naube-archi.com\naubemobile.com\naubor-ind.com\naubye.com\naucanlink.com\nauchexpo.com\naucnln.com\naudan2011.com\naudatex.ch\naudatex.com\naudatex.net\naudio-gd.com\naudio-technica-hz.com\naudio-y.com\naudio160.com\naudioadx.com\naudiobuy.cc\naudiocn.com\naudiocn.net\naudiocn.org\naudiofamily.net\naudiotop.net\naudiowell.com\naudiowell.net\naudiowellzq.com\naudioxj.com\nauditcn.com\naudlabs.com\naudtools.com\naufewb.com\naugix.me\naugsky.com\naugurit.com\naugustcn.com\nauiou.com\naulacn.com\nauldey.com\naumantruck.com\naunapi.com\nauniontech.com\naunload.com\nauoda.net\nauok.run\nauozzjs.lol\naupu.net\naura-el.com\nauroapi.com\naurogon.com\nauromcs.com\naurora-jy.com\naurora-oa.com\naurorauo.com\naurumdriver.vip\naus.cc\nausaview.com\nausbio.com\nausca-oils.com\nausdn.com\nausdream.org\naushinelyn.com\naushy.com\nausner.net\nausnutria.com\nausny.com\nausperbio.com\nauspous.com\naussino.net\naustargroup.com\naustarstudy.com\naustraliaxy.com\nausunpharm.com\nauthbus.com\nauthing-inc.co\nauthing.co\nauthing.com\nauto-ccpit.org\nauto-changchun.com\nauto-ekontrol.com\nauto-expos.com\nauto-learning.com\nauto-made.com\nauto-mooc.com\nauto-purify.com\nauto-testing.net\nauto-union.net\nauto-wo.com\nauto1768.com\nauto18.com\nauto318.com\nauto328.com\nauto510.com\nauto6s.com\nautoahk.com\nautoai.com\nautobaidu.com\nautobaojun.com\nautobit.xyz\nautobizreview.com\nautocamel.com\nautochinashow.org\nautochinazh.com\nautochips.com\nautochongqing.com\nautodl.com\nautodmp.com\nautodnsv1.com\nautodnsv1.net\nautodwg.com\nautoecosystems.com\nautoengine.com\nautoesd.com\nautofull.net\nautogslb.com\nautohao.com\nautohenan.com\nautoho.com\nautohome.com\nautohome.tel\nautohr.org\nautohunan.com\nautoij.com\nautoitx.com\nautojiaoyi.com\nautojingji.com\nautojs.org\nautomall365.com\nautomsen.com\nautonavi.com\nautoparts-yoto.com\nautopartsdk.com\nautopeitao.com\nautophagy.net\nautoqingdao.com\nautosey.com\nautoshafa.com\nautoshanghai.org\nautosmt.net\nautostreets.com\nautosup.com\nautothinker.net\nautounicom.com\nautovideo.club\nautovolke.com\nautowelds.com\nautowise.ai\nautoz.net\nautozi.com\nautumndesires.com\nauwincmc.com\naux-home.com\nauxgroup.com\nauy07161km.com\nauy07170km.com\nauy07180km.com\nauy07190km.com\nauy07200km.com\nauy07201km.com\nauy07211km.com\nauy07230km.com\nauyou.com\nav-ic.com\nav199.com\nav2.me\nav269.com\nav380.net\nav77.org\navadairy.com\navalon233.com\navanpa.com\navanzacorp.com\navaryholding.com\navatamveda.com\navatarmind.com\navatarmobi.com\navatr.com\navaya.hk\navc-mr.com\navc-ott.com\navdgw.com\navemaria.fun\naves.art\navfline.com\navgh5.com\navgnati.com\navgnatii.com\navgroft.com\naviationsnip.com\navic-acs.com\navic-apc.com\navic.com\navichina.com\navicnews.com\navicsec.com\navicsgt.com\navicui.com\navilive.com\navinex.com\navischina.com\navivaqueen.com\navl-hitec.com\navlinsight.com\navlsec.com\navlyun.com\navlyun.net\navlyun.org\navnpc.com\navoscloud.com\navp76.com\navp76.net\navpic.xyz\navptec.com\navq360.com\navrvi.com\navstar4.com\navt-cn.com\navtechcn.com\navtt830.com\navuejs.com\naw-ol.com\naw.cc\nawaker.net\nawaliwa.com\nawardsequence.com\nawc618.com\nawcloud.com\nawcn.cc\nawehunt.com\nawemeughun.com\nawemeuglang.com\nawemeugsoul.com\nawemeugwave.com\naweray.com\nawfggc.com\nawhouse.art\nawi-intl.com\nawinic.com\nawmote.com\naword.net\nawotuan.com\nawoyun.com\nawsamazonlab.com\nawsdns-cn-00.com\nawsdns-cn-00.net\nawsdns-cn-01.biz\nawsdns-cn-01.net\nawsdns-cn-02.biz\nawsdns-cn-02.net\nawsdns-cn-03.biz\nawsdns-cn-04.net\nawsdns-cn-05.biz\nawsdns-cn-05.net\nawsdns-cn-06.com\nawsdns-cn-06.net\nawsdns-cn-07.biz\nawsdns-cn-07.com\nawsdns-cn-07.net\nawsdns-cn-09.biz\nawsdns-cn-09.com\nawsdns-cn-09.net\nawsdns-cn-10.com\nawsdns-cn-11.biz\nawsdns-cn-11.com\nawsdns-cn-12.biz\nawsdns-cn-12.net\nawsdns-cn-14.biz\nawsdns-cn-14.com\nawsdns-cn-15.net\nawsdns-cn-16.biz\nawsdns-cn-16.net\nawsdns-cn-17.biz\nawsdns-cn-17.com\nawsdns-cn-17.net\nawsdns-cn-18.biz\nawsdns-cn-18.net\nawsdns-cn-19.biz\nawsdns-cn-19.net\nawsdns-cn-20.biz\nawsdns-cn-20.com\nawsdns-cn-20.net\nawsdns-cn-21.biz\nawsdns-cn-21.net\nawsdns-cn-22.com\nawsdns-cn-22.net\nawsdns-cn-23.com\nawsdns-cn-23.net\nawsdns-cn-24.biz\nawsdns-cn-24.com\nawsdns-cn-24.net\nawsdns-cn-25.com\nawsdns-cn-25.net\nawsdns-cn-26.com\nawsdns-cn-27.biz\nawsdns-cn-27.com\nawsdns-cn-28.biz\nawsdns-cn-28.net\nawsdns-cn-29.biz\nawsdns-cn-31.net\nawsdns-cn-33.biz\nawsdns-cn-33.net\nawsdns-cn-34.com\nawsdns-cn-34.net\nawsdns-cn-35.biz\nawsdns-cn-35.net\nawsdns-cn-36.biz\nawsdns-cn-36.com\nawsdns-cn-36.net\nawsdns-cn-37.biz\nawsdns-cn-37.com\nawsdns-cn-37.net\nawsdns-cn-38.net\nawsdns-cn-39.biz\nawsdns-cn-39.com\nawsdns-cn-39.net\nawsdns-cn-40.biz\nawsdns-cn-40.com\nawsdns-cn-40.net\nawsdns-cn-41.biz\nawsdns-cn-41.com\nawsdns-cn-41.net\nawsdns-cn-42.biz\nawsdns-cn-42.com\nawsdns-cn-43.biz\nawsdns-cn-44.biz\nawsdns-cn-44.com\nawsdns-cn-44.net\nawsdns-cn-45.biz\nawsdns-cn-45.com\nawsdns-cn-45.net\nawsdns-cn-46.biz\nawsdns-cn-46.com\nawsdns-cn-46.net\nawsdns-cn-47.biz\nawsdns-cn-47.com\nawsdns-cn-47.net\nawsdns-cn-48.biz\nawsdns-cn-48.com\nawsdns-cn-48.net\nawsdns-cn-49.biz\nawsdns-cn-50.biz\nawsdns-cn-50.net\nawsdns-cn-51.biz\nawsdns-cn-51.com\nawsdns-cn-52.biz\nawsdns-cn-52.com\nawsdns-cn-52.net\nawsdns-cn-53.com\nawsdns-cn-54.biz\nawsdns-cn-54.net\nawsdns-cn-55.biz\nawsdns-cn-55.com\nawsdns-cn-55.net\nawsdns-cn-56.biz\nawsdns-cn-56.net\nawsdns-cn-57.com\nawsdns-cn-58.biz\nawsdns-cn-58.com\nawsdns-cn-58.net\nawsdns-cn-59.biz\nawsdns-cn-59.net\nawsdns-cn-60.biz\nawsdns-cn-60.com\nawsdns-cn-60.net\nawsdns-cn-61.biz\nawsdns-cn-62.biz\nawsdns-cn-62.com\nawsdns-cn-62.net\nawsdns-cn-63.biz\nawsdns-cn-63.com\nawsdns-cn-63.net\nawsdns-vip.com\nawsok.com\nawsonamazon.com\nawspaas.com\nawspony.com\nawstar.net\nawtmt.com\nawuming.com\nawx1.com\nawyerwu.com\nawyx.xyz\nax196.com\nax2nc4.ren\naxa123.com\naxatp.com\naxbsec.com\naxbur.com\naxcf.com\naxentbath.com\naxera-tech.com\naxfys.com\naxhimalayancc.com\naxhjfobr.shop\naxhub.im\naxiang.com\naxiaoxin.com\naxiba66.com\naxic6906.com\naxilone-shunhua.com\naxinsur.com\naxisfluid.com\naxjm-ex.com\naxjsw.com\naxjx.com\naxmro.com\naxmw.com\naxnsc.com\naxoij.com\naxq66.com\naxqqq.com\naxqswm.net\naxs8.com\naxshuyuan.com\naxuer.com\naxuexiw.com\naxunyou.com\naxure.us\naxureshop.com\naxureux.com\naxxsw.org\naxybio.com\naxyxt.com\naxzchou.com\nay-china.com\nay-health.com\nay001.com\nay001.net\nay2fy.com\nay57.com\nay5y.com\nay99.net\nayalm.com\nayatuan.com\naybwg.org\naycav.com\naycgu.com\naychfy.com\nayctgy.com\naydaojia.com\naye.ink\nayfdc.com\nayfy.com\nayfyfy.com\nayguge.com\nayhmjy.com\nayhuowan.com\nayhyxg.com\nayi800.com\nayibang.com\nayidada.com\nayijx.com\nayilaile.com\nayilian.com\nayjewelry.com\nayjs.net\naykj.net\nayklgas.com\naymym.com\naynchem.com\nayoushu.com\nayqy.net\nayrbs.com\nayrc.cc\nayrc.net\nayrmt.com\nayrq.com\naysbxxh.com\nayshq.com\naysjhod.xyz\naysjyjjh.com\nayudasalud.com\nayump.com\nayunlian.com\nayuren.com\nayuyun.com\nayw.ink\nayxz.com\nayzzxx.com\naz009.com\nazad.asia\nazbingxin.com\nazbq.org\nazchcdna.com\nazchcdnb.com\nazchcdnc.com\nazchcdnd.com\nazchcdne.com\nazchcdnf.com\nazchcdng.com\nazchcdnh.com\nazchcdni.com\nazchcdnj.com\nazchcdnk.com\nazchcdnl.com\nazchcdnm.com\nazchcdnn.com\nazchcdno.com\nazchcdnp.com\nazchcdnq.com\nazchcdnr.com\nazchcdns.com\nazf010.com\nazhimalayanvh.com\nazhituo.com\nazhubaby.com\nazjy88.com\nazmcode.com\nazonete.com\nazooo.com\nazoyacdn.com\nazoyagroup.com\nazp315.com\nazpdl.com\nazpdl.net\nazt365.com\nazuiblc.com\nazure-wave.com\nazure.cc\nazureflying.com\nazuremigrate.download.prss.microsoft.com\nazuremigratetest.download.prss.microsoft.com\nazurestackhub.download.prss.microsoft.com\nazurestackhubuat.download.prss.microsoft.com\nazuretouch.net\nazurew.com\nazureyun.com\nazxdiy.com\nazy288.com\nazycjd.com\nazyfy.com\nazz.net\nazzdm.com\nb-chem.com\nb-cro.com\nb-eurochina.com\nb-fairy.com\nb-k-automation.com\nb-raymedia.com\nb.biz\nb01.net\nb02f0d7f3745ba7c.com\nb041e427810281.beer\nb07cceaf011012.beer\nb08.com\nb082392de1024.beer\nb13075593271.com\nb13bc577fd.run\nb18e55f8a1010.beer\nb19a352d2336941a.com\nb1bj.com\nb1n.net\nb1qg.com\nb214bd8861009.beer\nb2216419b1013.beer\nb22fb6d6d1015.beer\nb23.tv\nb230756fa1114.beer\nb230ed9d61010.beer\nb262a49751023.beer\nb27ceaa1053.skin\nb287f400810291.beer\nb29f45a5b10271.beer\nb29gj.com\nb2b-builder.com\nb2b.biz\nb2b123.com\nb2b168.com\nb2b168.net\nb2b168.org\nb2b3.com\nb2b6.com\nb2b818.com\nb2bdq.com\nb2bgo.com\nb2bic.com\nb2bkk.com\nb2bname.com\nb2bvip.com\nb2bvip.net\nb2byao.com\nb2c-28loops.com\nb2c.biz\nb2cedu.com\nb2clouds.com\nb2jiaxiao.com\nb2q.com\nb2star.com\nb3198a37310281.beer\nb3727743007e8b15.com\nb384f2fff3e6d159.com\nb3b97f52c55246d7.com\nb3inside.com\nb3log.org\nb3logfile.com\nb40e80b301022.beer\nb44fd0fd51014.beer\nb4ca25f717d58cac.com\nb5.com\nb510qh.shop\nb5232b4da6e285b2.com\nb53358ed31009.beer\nb555b.com\nb5669d7a0a.vip\nb5a3f14042830b91.com\nb5b6.com\nb5b6308ab4859018.com\nb5csgo.plus\nb5esports.me\nb5m.com\nb6098130711042.beer\nb612.me\nb612kaji.com\nb643bce461009.beer\nb6522.com\nb670bffdf1021.beer\nb68f0a844eec7fff.com\nb6a531b371011.beer\nb6cc0921b1024.beer\nb6r.com\nb71ea195f05f569c.com\nb71ef13941015.beer\nb75c5da009ac3871.com\nb76ad11181024.beer\nb7av.com\nb7e314d4810241.beer\nb7eeeb26810241.beer\nb812824ed173a8c0.com\nb83d11444463a621.com\nb883481331023.beer\nb8b4ix7bj.com\nb8e4d120a10271.beer\nb8kk.com\nb8yx.com\nb9127b1b510292.beer\nb93a0ccdfcd1d26c.com\nb93df4bea4666064.com\nb963aae3c10272.beer\nb9a3e87f01023.beer\nb9ad.com\nb9bdc7d62dfb0e5e.com\nb9noqayb1s.work\nba-li.com\nba08e2f96f675d22.com\nba1400.com\nba20db47708bc51f.com\nba7jcm.live\nbaacloud32.com\nbaae91ac810311.beer\nbaalchina.net\nbaaniarts.com\nbaba-blog.com\nbaba12.com\nbababian.com\nbababus.com\nbabady.com\nbabai.cc\nbabaicai.com\nbabaike.com\nbabaimi.com\nbaballs.com\nbabao.com\nbabapi.com\nbabawar.com\nbabaxiong.com\nbabedy.com\nbabeijiu.com\nbabeword.com\nbabifood.com\nbabiguoguo.com\nbabolchina.com\nbaboshan.com\nbabsoft.net\nbabuxiang2005.com\nbaby-bus.com\nbaby-joy.com\nbaby577.com\nbaby611.com\nbaby7blog.com\nbaby868.com\nbabybus.com\nbabybus.org\nbabycdn.com\nbabymoro.com\nbabymozart.cc\nbabyqiming.com\nbabytree.com\nbabytreeimg.com\nbacaizi.com\nbacaola.com\nbacaoo.com\nbacaosh.com\nbacic5i5j.com\nbackaudio.com\nbackdata.net\nbackendman.com\nbackmany.com\nbackoffice-cms.com\nbackupdesktopcloud.com\nbacninhlocalguide.com\nbacocis.com\nbacts.com\nbacyfzjt.com\nbadambiz.com\nbadapple.pro\nbadazhou.com\nbademeiji.com\nbadmintoncn.com\nbadmintone.com\nbadong.net\nbadou.com\nbadouxueyuan.com\nbadu.com\nbadudns.cc\nbadwe.com\nbaeapps.com\nbaertt.com\nbaetyl.tech\nbaf566dfd40e3413.com\nbafangjuhe.com\nbafangwy.com\nbaful.net\nbag198.com\nbagb2b.com\nbagevent.com\nbags163.com\nbagsnet.com\nbagstory.net\nbagtree.com\nbaguichong.com\nbaguilingyun.com\nbagxs.com\nbahealpharma.com\nbahecloud.com\nbahens.com\nbahepark.com\nbai.com\nbaian-group.com\nbaiao.com\nbaibaipei.com\nbaibaoyun.com\nbaibm.com\nbaibo8.com\nbaibomedia.com\nbaibu.com\nbaic-group.com\nbaicai.asia\nbaicai.com\nbaicaijie09.com\nbaicaio.com\nbaicaiyouxuan.com\nbaicaolu.net\nbaicaosoft.com\nbaiccapital.com\nbaiccl.com\nbaicdnx.com\nbaicells.com\nbaicfc.com\nbaicheng.com\nbaichengtax.com\nbaichengyuehua.com\nbaichuan-ai.com\nbaichuan.tech\nbaichuanhd.com\nbaichuanhudong.com\nbaichuannet.vip\nbaichuanweb.com\nbaicizhan.com\nbaicizhan.org\nbaiclouds.com\nbaicmotor.com\nbaicmotorsales.com\nbaicrx.com\nbaicuoa.com\nbaidajob.com\nbaidao.com\nbaideled.com\nbaidenafu.com\nbaidesz.com\nbaidevalve.com\nbaideye.com\nbaidiapp.com\nbaidinet.com\nbaidu\nbaidu-bank.com\nbaidu-cdn.com\nbaidu-cdn.net\nbaidu-int.com\nbaidu-itm.com\nbaidu-mgame.com\nbaidu-nj.com\nbaidu-tech.com\nbaidu-wenxue.com\nbaidu.cc\nbaidu.com\nbaidu.hk\nbaidu.mobi\nbaidu120.cc\nbaidu123.com\nbaiduads.com\nbaiduapp.com\nbaidubaidubaidu.net\nbaidubce.com\nbaidubcr.com\nbaidubos.com\nbaiducloudapi.com\nbaiducontent.com\nbaidudaquan.com\nbaidudw.com\nbaidufe.com\nbaidufree.com\nbaiduhtml5.com\nbaiduhui.com\nbaidujinshu.com\nbaidulook.com\nbaiduor.com\nbaidupan.com\nbaidupcs.com\nbaidupcs.net\nbaidupeixun.com\nbaidusmartapps.com\nbaidustatic.com\nbaidusx.cc\nbaidusx.com\nbaidutab.com\nbaidutieba.com\nbaidutt.com\nbaiduux.com\nbaiduwaf.com\nbaiduwebgame.com\nbaiduwpan.com\nbaiduxiaodai.com\nbaiduxiaoshuo.com\nbaiduyangguang.org\nbaiduyun.com\nbaiduyun.wiki\nbaiduyuncdn.com\nbaiduyuncdn.net\nbaiduyundns.com\nbaiduyundns.net\nbaiduyunsousou.com\nbaiduyunwaf.com\nbaiduzjn.com\nbaieryk.com\nbaifae.com\nbaifang.in\nbaifangdianqi.com\nbaifangzh.com\nbaifeiyue.com\nbaifendian.com\nbaifubao.com\nbaigebao.com\nbaigebg.com\nbaigehuidi.com\nbaigeseo.com\nbaigo.net\nbaigolf.com\nbaigongbao.com\nbaigougou.com\nbaigouwanggong.com\nbaiguitang.com\nbaihangbao.com\nbaihangdai.com\nbaihaocha.com\nbaihe.com\nbaiheee.com\nbaihelove.com\nbaihemedical.com\nbaihemob.com\nbaihezi.com\nbaihong.com\nbaihongsoft.com\nbaihuayan.com\nbaihui.com\nbaihui.live\nbaihui168.com\nbaihuibio.com\nbaihuillq.com\nbaihuiyaoye.com\nbaihuwang.com\nbaiila.com\nbaiinfo.com\nbaijia.com\nbaijiacloud.com\nbaijiahulian.com\nbaijiantest.com\nbaijiasheping.com\nbaijiaxingwang.com\nbaijiayun.com\nbaijiayuncdn.com\nbaijiegroup.com\nbaijiexiu.com\nbaijincdn.com\nbaijingapp.com\nbaijiudl.com\nbaijob.com\nbaijunjz.com\nbaijunyao.com\nbaijus.net\nbaijuyi.com\nbaikaigroup.com\nbaikalasia.com\nbaikalminer.com\nbaikalyq.com\nbaikangyun.com\nbaike.com\nbaikecs.com\nbaiked.com\nbaikehuanjing.com\nbaikemy.com\nbaikemy.net\nbaikeshiji.com\nbaikeshijie.com\nbaikevod.com\nbaikewenda.com\nbaikexueshe.com\nbaikezh.com\nbailb.com\nbailepin.com\nbailiaijia.com\nbailiangroup.com\nbailiann.com\nbailiban.com\nbailiguangmang.com\nbailing.online\nbailing88.com\nbailingdanci.com\nbailingjk.net\nbailinsi.net\nbailitech.com\nbailitools.com\nbailitop.com\nbailizw.com\nbailucloud.com\nbailvanquan.xyz\nbaima.com\nbaimao-expo.com\nbaimao.com\nbaimaohui.net\nbaimatech.com\nbaimda.com\nbaimei.com\nbaimeidashu.com\nbaimiao.tech\nbaimiaoapp.com\nbaimin.com\nbaina.com\nbainaben.com\nbainaruibusiness.com\nbaineng.cc\nbainmedical.net\nbainus.com\nbaiousen.com\nbaiozhuntuixing.com\nbaipin.pw\nbaipu365.com\nbaiqian.com\nbaiqiangart.com\nbaiqiangyl.com\nbaiqianxin.com\nbaiqiaogame.com\nbaiqishi.com\nbaiqiso.com\nbaiqiyaoye.com\nbaiquefahuasi.com\nbairenzbg.org\nbairoe.com\nbaironginc.com\nbairuitech.com\nbaisainuo.com\nbaise.cc\nbaise123.vip\nbaise1314.com\nbaisecn.com\nbaiselife.com\nbaiselyw.com\nbaiseshiyu.com\nbaiseylj.com\nbaiseyun.com\nbaisha.com\nbaishan-cloud.com\nbaishan-cloud.net\nbaishan-gateway.com\nbaishan.com\nbaishancdnx.com\nbaishancdnx.net\nbaishancloud.com\nbaishancloud.org\nbaishandnsx.com\nbaishandnsx.net\nbaishangeek.com\nbaishanyun.com\nbaishicha.com\nbaishimeipai.com\nbaishinetwork.com\nbaishishuju.com\nbaishixi.xyz\nbaishuku.la\nbaishulou.net\nbaishunet.com\nbaishuyun.com\nbaishuzhai.cc\nbaishuzhai.com\nbaisihan.com\nbaisiterzh.com\nbaisiweiting.com\nbaisu.cc\nbaisuifc.shop\nbaisuizhixiang.com\nbaitahe.net\nbaitaihuge.com\nbaitanheichang.com\nbaitaoidc.com\nbaitdu.com\nbaite666.com\nbaithu.com\nbaitianinfo.com\nbaitiao.com\nbaitomould.com\nbaitongplastics.com\nbaitongwang.com\nbaitu.com\nbaitugu.com\nbaituibao.com\nbaiu.com\nbaiven.com\nbaiwandz.com\nbaiwang.com\nbaiwangjs.com\nbaiwen100.com\nbaiwenbao.com\nbaiwujt.com\nbaiwulin.com\nbaiwushi168.com\nbaiwutong.com\nbaiwv.com\nbaixiangfood.com\nbaixiangnews.com\nbaixiaosheng.net\nbaixiaoxs.com\nbaixihuang.com\nbaixing.com\nbaixing.net\nbaixingjob.com\nbaixingyllh.com\nbaixiong.info\nbaixiu.org\nbaiyang.com\nbaiyangseo.com\nbaiyaohy.com\nbaiycap.net\nbaiye5.com\nbaiyewang.com\nbaiyi.shop\nbaiyi181.com\nbaiyiba.com\nbaiyikc.com\nbaiying.com\nbaiyinggd.com\nbaiyintouzi.com\nbaiyishequ.com\nbaiyizg.com\nbaiyjk.com\nbaiyou100.com\nbaiyu.tech\nbaiyujingfeng.com\nbaiyumedia.com\nbaiyun-hotel.com\nbaiyunairport.com\nbaiyunholding.com\nbaiyunhuojia.com\nbaiyunmh.com\nbaiyunpump.com\nbaiyunxitong.com\nbaiyuyu.com\nbaiyyy.com\nbaizengtech.com\nbaizhan.net\nbaizhanke.com\nbaizhanlive.com\nbaizhouniao.com\nbaizhu.cc\nbaizlink.com\nbajasaechina.com\nbajie1.com\nbajiebofang.com\nbajiexinxi.net\nbajintech.com\nbaka.im\nbaka.plus\nbakaxl.com\nbakbitionb.com\nbakclass.com\nbakerdavid.shop\nbakingerp.com\nbaklib.com\nbakpower.com\nbakshifen.com\nbakstotre.com\nbala.cc\nbalance-net.com\nbalancer-sh.com\nbaldc.com\nbaldor-tech.com\nbaletu.com\nbalift.com\nbalihe.com\nbalijieji.com\nbalimtoy.com\nbalingtxt.com\nballdollars.com\nballgametime.com\nballpure.com\nballtv.cc\nbaltamatica.com\nbaltamatica.net\nbama-supercon.com\nbamaiwo.com\nbamalifelong.com\nbamaol.cc\nbamaol.com\nbamashenspring.com\nbamatea.com\nbamaying.com\nbamboofactorychina.com\nbambooolab.com\nbambu-lab.com\nbambulab.com\nbamengame.com\nbamensq.com\nbamenzhushou.com\nbamuwu.com\nbamuyu.com\nbananafather.com\nbananain.com\nbananalighter.com\nbananau.com\nbananaumbrella.com\nbananaunder.com\nbanban.work\nbanbang.com\nbanbanjia8.com\nbanbao22.com\nbanbijiang.com\nbancai.com\nbancheng08.fun\nbanchengyun.com\nbanchuan.net\nbanciyuan.me\nbandainamcoshanghai.com\nbandao.com\nbandaoapp.com\nbandari.net\nbandayun.com\nbandcevent.com\nbandcoder.com\nbandeyu.com\nbandianli.com\nbandoristation.com\nbandvr.com\nbanfubbs.com\nbangandi.com\nbangbang.com\nbangbang93.com\nbangbanghuoyun.com\nbangbendi.com\nbangboss.com\nbangbuy.com\nbangcaiwu.com\nbangcheng0769.com\nbangchengchem.com\nbangcle.com\nbangcn.com\nbangdao-tech.com\nbanggeen.com\nbanggo.com\nbanghaiwai.com\nbangivf.com\nbangjiantong.com\nbangjigroup.com\nbangju.net\nbangkaixin.com\nbangkao.com\nbangkaow.com\nbangkebao.com\nbangkehui.com\nbanglianai.com\nbangmai.com\nbangninji.com\nbangnixia.com\nbangnizexiao.com\nbangongtuku.com\nbangongyi.com\nbangongziyuan.com\nbangqi66.com\nbangqike.com\nbangqu.com\nbangrong.com\nbangsee.com\nbangshouwang.com\nbangtaixcl.com\nbangthink.com\nbangtukj.com\nbanguanjiabc.com\nbangwo8.com\nbangwo8.net\nbangwoting.com\nbangxuetang.com\nbangyike.com\nbangzechem.com\nbangzhuta.com\nbanji001.com\nbanjia1680.com\nbanjiajia.com\nbanjiang.cc\nbanjiekuaiji.com\nbanjing.com\nbanjixiaoguanjia.com\nbanjuanshu.com\nbanjunxingkeji.com\nbank-139.com\nbank-of-china.com\nbank-of-tianjin.com\nbankalliance.net\nbankcomm.com\nbankcomm.com.mo\nbankcomm.com.tw\nbankcz.com\nbankgz.com\nbankhr.com\nbankksw.com\nbanklilv.com\nbankofbbg.com\nbankofchangsha.com\nbankofchina.com\nbankofdl.com\nbankofshanghai.com\nbankofshanghai.net\nbankofsv.com\nbankoftianjin.com\nbankoftieling.com\nbankofvolc.com\nbankofyk.com\nbanksteel.com\nbankyellowriver.com\nbanlikanban.com\nbanma.com\nbanmaaike.com\nbanmacdn.com\nbanmadayuwen.com\nbanmaedu.com\nbanmaerp.com\nbanmagushi.com\nbanmajsq.com\nbanmajz.net\nbanmamedia.com\nbanmasiwei.com\nbanmasrf.com\nbanmasusuan.com\nbanmayingyu.com\nbanmeng.com\nbanmi.mobi\nbannei.com\nbanner668.com.hk\nbanqumusic.com\nbansha.com\nbanshangong.com\nbanshier.com\nbantangapp.com\nbantangbuy.com\nbantouyan.com\nbanwagong.men\nbanwagongcn.com\nbanwagongzw.com\nbanwo365.com\nbanwoo.net\nbanwoyo.net\nbanwugongsi.com\nbanxiaomazaojiao.com\nbanxiayue.com\nbanye.tech\nbanyiyi.com\nbanyuetan.org\nbanyuetanapp.com\nbanyuetanedu.com\nbanyuetanxcx.com\nbanyunjuhe.com\nbanzhe.xyz\nbanzhuti.com\nbanzou.name\nbanzouzhizuo.com\nbao-fang.com\nbao-hulu.com\nbao12333.com\nbao265.com\nbao315.com\nbao369.com\nbaoanchina.com\nbaob123.com\nbaobanli.com\nbaobao001.com\nbaobao88.com\nbaobaobang.com\nbaobaoqiming.site\nbaobaoshu.com\nbaobei360.com\nbaobeicang.com\nbaobeigezi.com\nbaobeihr.com\nbaobeihuijia.com\nbaobeio.com\nbaobeita.com\nbaobeituan.com\nbaobeiy.com\nbaocdn.com\nbaochaojianghu.com\nbaochunyiran.com\nbaocps.com\nbaocuicoin.com\nbaodan100.com\nbaodan360.com\nbaodaohealth.com\nbaodaren.net\nbaodery.com\nbaodian.com\nbaodigs.com\nbaodu.com\nbaoduys.com\nbaofeng.com\nbaofeng.la\nbaofeng.net\nbaofeng365.com\nbaofon.com\nbaofoo.com\nbaofoo.net\nbaofu.art\nbaofu.com\nbaofu.info\nbaofull.com\nbaofumuye.com\nbaogang.info\nbaogao.com\nbaogao.store\nbaogaobox.com\nbaogaoku.com\nbaogaoting.com\nbaoge.net\nbaogebei.com\nbaoguangtai.com\nbaoguogroup.com\nbaohanghr.com\nbaohebao.com\nbaohongbao.net\nbaohua-pec.com\nbaohuagroup.com\nbaohuatravel.com\nbaohuaxia.com\nbaohuiming.net\nbaoimg.net\nbaoinsurance.com\nbaoji-marathon.com\nbaoji3g.com\nbaojia.com\nbaojiagaiye.com\nbaojian.com\nbaojiazhijia.com\nbaojiegy.com\nbaojijob.com\nbaojinews.com\nbaojinling.com\nbaojule.com\nbaojun.net\nbaojunev.com\nbaokan.tv\nbaokang.com\nbaokanhuicui.com\nbaokao.net\nbaokaodaxue.com\nbaoke-cn.com\nbaoku.com\nbaokuaishou.com\nbaokuandi.com\nbaokutreasury.com\nbaolansz.com\nbaoliannet.com\nbaolic.com\nbaolijuyuan.org\nbaolizx.com\nbaolong.biz\nbaolong.com\nbaoltx.com\nbaolu.store\nbaomaxs.com\nbaomei.tv\nbaomi.com\nbaomi365.com\nbaomidou.com\nbaomihua.com\nbaoming.com\nbaoming.work\nbaomingge.com\nbaomitu.com\nbaoneng.com\nbaoqin.com\nbaoqingvip.com\nbaor.work\nbaoruan.com\nbaoruisi.com\nbaoshe.net\nbaoshe01.com\nbaoshengcable.com\nbaoshengele.com\nbaoshenggroup.com\nbaoshuanglong.com\nbaoshuiguoji.com\nbaoshuiguoji.net\nbaoshuo.ren\nbaoshuo.xyz\nbaosight.com\nbaosiwushidhex.work\nbaosteel.com\nbaosteel.info\nbaosteelpackaging.com\nbaostock.com\nbaotadns.com\nbaotaiclad.com\nbaotaikonggu.com\nbaotang5.com\nbaotime.com\nbaotoulawyer.com\nbaotounews.com\nbaotoushizx.com\nbaotuba.com\nbaotuo.cc\nbaowu.com\nbaowuenergy.com\nbaowugroup.com\nbaoxian.com\nbaoxian72.com\nbaoxianhai.com\nbaoxianjie.net\nbaoxianqi.com\nbaoxianshichang.com\nbaoxiaobar.com\nbaoxiaohe.com\nbaoxiaoke.com\nbaoxinchewang.com\nbaoxingmuye.com\nbaoxinleasing.com\nbaoxins.com\nbaoxiu.com\nbaoxiu.net\nbaoxuexi.com\nbaoxuexiedu.com\nbaoyagroup.com\nbaoyang1.com\nbaoyang888.com\nbaoyegroup.com\nbaoyehb.com\nbaoyejs.com\nbaoying.com\nbaoyizn.com\nbaoyt.com\nbaoyuanchem.com\nbaoyueai.com\nbaoyuekj.com\nbaoyuncm.com\nbaoyung.com\nbaoyuntong.com\nbaoz.net\nbaozang.com\nbaozengzhang.com\nbaozhenart.com\nbaozheng.cc\nbaozhenlu.com\nbaozhilin.com\nbaozhuang.biz\nbaozhuangren.com\nbaozi.fun\nbaozi178.com\nbaozijishu.com\nbaozipu.com\nbaozou.com\nbaozoudi.com\nbaozoumanhua.com\nbaozugongkeji.com\nbaozun.com\nbaozy.com\nbapengpc.com\nbaping.com\nbaqi28.com\nbaqiu.com\nbarhuta.com\nbarjiang.com\nbarlosi.com\nbarman.vip\nbaron-bj.com\nbaronyhotels.com\nbaronzhang.com\nbarretlee.com\nbartender.cc\nbartistar.online\nbartymedical.com\nbasechem.org\nbasecity.com\nbased-edu.com\nbaseopendev.com\nbasequan.com\nbasestonedata.com\nbashan.com\nbashenghuo.com\nbashigao.com\nbashuhuapai.com\nbashuku.com\nbasiccat.org\nbasicfinder.com\nbasischina.com\nbastcn.com\nbasunlighting.com\nbat-sz.com\nbatchat.com\nbatengtiyu1.com\nbatian.net\nbatman.plus\nbatmanit.com\nbatmsg.com\nbatplay.com\nbattery-cert.com\nbattery-expo.com\nbattery8.com\nbatterydir.com\nbatterykey.com\nbattle-fsd.com\nbattlecare.net\nbattleofballs.com\nbatupian.net\nbaufortune.com\nbauschlombchina.com\nbawagon.com\nbawanglongbengye.com\nbawjxt.net\nbawu.net\nbaxiami.com\nbaxichina.com\nbaxisuye.com\nbaydn.com\nbaye.tech\nbayee.cc\nbayescom.com\nbayimob.com\nbayinh.com\nbaykee.net\nbaynoe.com\nbayucar.com\nbayuche.com\nbayuegua.com\nbayueju.com\nbayunhome.com\nbayuxuexiao.net\nbayzedhealthcare.com\nbazaarjewelrychina.com\nbazai.com\nbazhan.com\nbazhepu.com\nbazhong.com\nbazhongol.com\nbazhua.me\nbazhuay.com\nbazhuayu.cc\nbazhuayu.com\nbazhuayukeji.com\nbazi.cloud\nbazi.run\nbazi.xin\nbazi5.com\nbaziguwen.com\nbazizeri.com\nbb-game.com\nbb-hy.com\nbb-pco.com\nbb06.com\nbb361a58c1015.beer\nbb39977653.com\nbb3a14ca57af4d81.com\nbb52e27c75560d3f.com\nbb730b04b6cc8c57.com\nbbanp.com\nbbaod.com\nbbaqw.com\nbbb1415.com\nbbbaaa.com\nbbbao.com\nbbbb.com\nbbbcdns.com\nbbbmq.com\nbbbms.com\nbbbtgo.com\nbbc54c1281125042.com\nbbcagroup.com\nbbcayy.com\nbbchin.com\nbbctop.cc\nbbctop.com\nbbdj.com\nbbdservice.com\nbbdup.com\nbbecpsc.com\nbbef-tech.com\nbbef.com\nbbeshop.com\nbbez.com\nbbfkjkh.com\nbbfoxgame.com\nbbfstore.com\nbbfytsn.com\nbbgdex.com\nbbgsite.com\nbbgstatic.com\nbbguangcai.com\nbbhou.com\nbbicn.com\nbbioo.com\nbbjgr.com\nbbk.com\nbbk000.com\nbbkantu.com\nbbkys.com\nbblcdn.com\nbblmw.com\nbblops.com\nbbmuwwxyk.com\nbbmy.net\nbbobo.com\nbbonfire.com\nbbosu.com\nbbphonix.xyz\nbbpph.com\nbbpu.com\nbbqcdn.com\nbbqe.com\nbbqk.com\nbbqk.net\nbbqming.com\nbbqwhg.com\nbbrmedia.com\nbbrtv.com\nbbs-alsontech.com\nbbs0415.com\nbbs0551.com\nbbs1x.net\nbbscloud.com\nbbsds.com\nbbsls.net\nbbsmc.net\nbbsnet.com\nbbsufida.com\nbbsut.com\nbbsxp.com\nbbszjj.com\nbbtang.info\nbbtcaster.com\nbbteapress.com\nbbtengfeizaixian.com\nbbthy.net\nbbtkid.com\nbbtpress.com\nbbtwatch.com\nbbugifts.com\nbbunion.com\nbbvjs.com\nbbw-portnet.com\nbbwcec.com\nbbwcq.com\nbbwfish.com\nbbwgw.com\nbbwhy.com\nbbwict.com\nbbwoils.com\nbbwotc.com\nbbwport.com\nbbwport.net\nbbwrc.com\nbbwse.com\nbbwunisco.com\nbbxarq.com\nbbxinwen.com\nbbxinwen.net\nbbxstjx.com\nbbydsol.com\nbbzhh.com\nbbzhi.com\nbbzhsw.com\nbbzxky.fun\nbc150.com\nbc4785bd211012.beer\nbc5539.com\nbc754c518ef6127a.com\nbc966.com\nbcaacademy.org\nbcactc.com\nbcb5.com\nbcbjjy.com\nbcbksbx.com\nbcbpm.com\nbcbvi.com\nbccastle.com\nbccn.net\nbccnsoft.com\nbccoder.com\nbccv.com\nbcdaren.com\nbcdnx.com\nbcdy.net\nbce-cdn.com\nbce-cdn.net\nbce0619341023.beer\nbceapp.com\nbcebos.com\nbcedns.com\nbcedns.net\nbcedocument.com\nbcegc.com\nbcehost.com\nbcehosts.com\nbceidaas.com\nbceimg.com\nbcelive.com\nbcevod.com\nbcewaf.com\nbcf1ef2511022.beer\nbcfmglobal.com\nbcfy188.com\nbcgf.cc\nbcghotel.com\nbchdemo.site\nbchlkj.com\nbchrt.com\nbcisz.org\nbcitb.com\nbcjkcloud.com\nbcjp.net\nbclcraft.com\nbcmcdn.com\nbcmonomial.xyz\nbcn.cc\nbcpcn.com\nbcpgame.com\nbcpharma.com\nbcplab.com\nbcpmdata.com\nbcreat.com\nbcrjl.com\nbcrmtzx.com\nbcryo.com\nbcsfoong.com\nbcshipgo.com\nbcsloong.com\nbcsytv.com\nbctdtx.com\nbctest.com\nbctts.com\nbcty365.com\nbcvbw.com\nbcvdmovie.com\nbcwangluo.net\nbcxgame.com\nbcxgps.com\nbcxww.com\nbcy.net\nbcyimg.com\nbczcdn.com\nbczyyy.com\nbd-caict.com\nbd-gti.com\nbd-union.com\nbd001.net\nbd0afb0887.xin\nbd3be95d910301.beer\nbd682bc7d22322eb.com\nbd689.com\nbd7kzs.site\nbdactivity.com\nbdaenviro.com\nbdajob.com\nbdall.com\nbdapark.com\nbdatu.com\nbdbae.com\nbdc-rays.com\nbdcb.cc\nbdcgz.com\nbdchangtujs.com\nbdchina.com\nbdcloudapi.com\nbdclouddns.com\nbdcn-media.com\nbddhospital.com\nbddlm.com\nbde5fc098b5291bf.com\nbdebid.com\nbdeceimg.com\nbdegnine.com\nbdf2.com\nbdfczx.com\nbdfmj.com\nbdfmkj.com\nbdfyy999.com\nbdfzcd.net\nbdfzkyy.com\nbdg-brain.com\nbdgamelive.com\nbdgp.cc\nbdgqx.com\nbdgslb.com\nbdgw.cc\nbdhdtv.com\nbdhengding.com\nbdhhome.com\nbdhulanwang.com\nbdimg.com\nbdinfo.net\nbdispatch.com\nbdispatch.net\nbdjz.vip\nbdkyr.com\nbdlcqjw.com\nbdmozon.com\nbdmyandex.com\nbdns-api-test.net\nbdns-boe.com\nbdns-boe.net\nbdns-gtm-01.net\nbdns-gtm-pressure.com\nbdns-restore.net\nbdns-test.com\nbdns-test.net\nbdo-dahua.com\nbdpan.com\nbdpnt.com\nbdppe.net\nbdqn027.com\nbdqn666.com\nbdqnwh.com\nbds-cn.com\nbds666.com\nbdsagslb.com\nbdsagslbtest.com\nbdsana.com\nbdsd.design\nbdsgx.com\nbdshengce.com\nbdshuang.com\nbdsimg.com\nbdsj.net\nbdspacetime.com\nbdstar.com\nbdstatic.cc\nbdstatic.com\nbdsytime.com\nbdszh.vip\nbdtianchang.com\nbdtic.com\nbdtjrcv.com\nbdtm.net\nbdtsc.com\nbduapp.com\nbdurl.net\nbdvending.com\nbdwater.com\nbdwhyscjh.com\nbdwkxz.com\nbdwm.net\nbdwork.com\nbdxc.com\nbdxdgs.com\nbdxiguaimg.com\nbdxigualive.com\nbdxiguastatic.com\nbdxiguavod.com\nbdxpa.com\nbdxx.net\nbdxyykj.com\nbdxyz.com\nbdycdn.com\nbdycdn.net\nbdydns.com\nbdydns.net\nbdyhhb.com\nbdylzbyy.com\nbdymkt.com\nbdysc.com\nbdysite.com\nbdysites.com\nbdyz.xyz\nbdzhipin.com\nbdzjdsagslb.com\nbe-xx.com\nbe1775.com\nbe1dbb20578c1b79.com\nbe20e436e111e1f7.com\nbe30d71aea370488.com\nbe7076f2b2ff2953.com\nbe79d8d36f962bd6.com\nbe84433f5ce02a66.com\nbe896b364b76c6df.com\nbe90.com\nbeadwallet.com\nbeamweldingmachine.com\nbeancomm.com\nbeantechyun.com\nbear20.com\nbearead.com\nbeargoo.com\nbearingclub.com\nbearrental.com\nbearsing.com\nbearyboard.com\nbearychat.com\nbeastush.com\nbeasure.com\nbeatbeatone.com\nbeats-digital.com\nbeatsbydre.com\nbeaucare.org\nbeautifulbank.com\nbeautifulcarrot.com\nbeautifullinux.com\nbeautifulzzzz.com\nbeaverbio.com\nbeb688d9cad7d208.com\nbebhmongb.com\nbechangedt.com\nbecker-china.com\nbeckwai.com\nbeckyroom.com\nbecod.com\nbecomingcelia.com\nbecominggroup.com\nbecukwai.com\nbeduu.com\nbee-core.com\nbee-net.com\nbee-station.com\nbee3d.com\nbeebeepop.com\nbeebeeto.com\nbeecook.com\nbeedancing.com\nbeeeeego.com\nbeeflower-cn.com\nbeegoedu.com\nbeejoygames.com\nbeelink.com\nbeep365.com\nbeeplay123.com\nbeeshow.tv\nbeespal.com\nbeestor.com\nbeeui.com\nbeeweart.com\nbefar.com\nbegcl.com\nbegeel.com\nbegindcc.com\nbego.cc\nbegoto.com\nbegowin.com\nbehake.com\nbehao.net\nbehaviac.com\nbehe.com\nbehrenswatches.com\nbehrenswatches.shop\nbei1688.com\nbeiamp.net\nbeianw.com\nbeibaobang.com\nbeibaozq.com\nbeibei.com\nbeibenkc.com\nbeicaiyuan.com\nbeicdn.com\nbeichende.com\nbeicity.com\nbeidasoft.com\nbeidd.com\nbeidian.com\nbeidisi.com\nbeidoou.com\nbeidou.org\nbeidou66.com\nbeidouchong.com\nbeidouedu.net\nbeidouone.com\nbeidousafety.org\nbeidouxingxueche.com\nbeiduolab.com\nbeierbio.com\nbeierchina.net\nbeierjin.net\nbeieryouxi.com\nbeifa.com\nbeifang.net\nbeifangfoshifen.com\nbeifangjiaoyu.com\nbeifeng.com\nbeifuni.com\nbeigangyouxuan.com\nbeigedi.com\nbeigonggroup.com\nbeiguorc.com\nbeihai365.com\nbeihai97.com\nbeihaidc.com\nbeihaigame.com\nbeihailihe.com\nbeihaimayi.com\nbeihaiqiuzhi.com\nbeihaireexpo.com\nbeihaiwuyeguanli.com\nbeihaiwz.com\nbeihan.net\nbeihansoft.com\nbeihuasoft.com\nbeihuo.net\nbeiing.net\nbeijin100.com\nbeijing-air.com\nbeijing-chopard.com\nbeijing-girardperregaux.com\nbeijing-halfmarathon.com\nbeijing-hmo.com\nbeijing-hualian.com\nbeijing-kids.com\nbeijing-lipin.com\nbeijing-marathon.com\nbeijing-office.com\nbeijing-time.org\nbeijing-tokyo.com\nbeijing101.com\nbeijing120.com\nbeijing518.com\nbeijingaierfei.com\nbeijingapt.com\nbeijingbang.com\nbeijingbaomu.com\nbeijingbio.tech\nbeijingcenterforthearts.com\nbeijingcustoms.com\nbeijingfenxiangkeji.com\nbeijingfire.com\nbeijingfojiao.com\nbeijinggobroadhospital.com\nbeijingguoyitang.com\nbeijinghopemedcare.com\nbeijinghuafu.com\nbeijinghuiyizhongxin.com\nbeijinglandbridge.com\nbeijingnongjiayuan.com\nbeijingnorthstar.com\nbeijingrc.com\nbeijingrc.net\nbeijingsanchi.com\nbeijingtaixie.com\nbeijingtoon.com\nbeijingtrucks.com\nbeijingwatch.com\nbeijingxiantour.com\nbeijingxinzhuoyue.com\nbeijingyouxi.com\nbeijingyuanxin.com\nbeijingzc.com\nbeijingzoo.com\nbeijinxuetang.com\nbeijiu.ink\nbeijzc.com\nbeikeba.com\nbeikeiot.com\nbeikeread.com\nbeikongyun.com\nbeilayl.com\nbeileike.com\nbeileimaoedu.com\nbeiletoys.com\nbeilewh.com\nbeilianjd.com\nbeilile.com\nbeilin.ltd\nbeilinbox.com\nbeiliufuyang.com\nbeimai.com\nbeimeihongfeng.com\nbeimeizhijia.com\nbeimeizhiying.com\nbeinglab.com\nbeingmate.com\nbeipenggroup.com\nbeipy.com\nbeiqujy.com\nbeirangroup.com\nbeiren-tech.com\nbeiren.cc\nbeiren.com\nbeironsign.com\nbeirunjie.com\nbeise.com\nbeisen.com\nbeisenapp.com\nbeisencloud.com\nbeisencorp.com\nbeisenpaas.com\nbeisenyl.com\nbeismei.com\nbeitaguoguo.com\nbeitaichufang.com\nbeitao8.com\nbeitown.com\nbeitre.com\nbeiwaibest.com\nbeiwaiclass.com\nbeiwaiguoji.com\nbeiwaionline.com\nbeiwaiqingshao.com\nbeiwo.com\nbeiww.com\nbeixibaobao.com\nbeixingmh.com\nbeiyijt.com\nbeiyinqi.com\nbeiyiskjc.com\nbeiyongzhan.com\nbeiyu.xin\nbeiyuwangxiao.com\nbeizhua.com\nbeizi.biz\nbeiziman.com\nbej9.com\nbejirog.com\nbejson.com\nbekko.com\nbelarusvisacenter.com\nbelfone.com\nbelgiumvisacenterd.com\nbeliefbiomed.com\nbeliefy.com\nbelimked.com\nbelle8.com\nbelletrip.com\nbellinlaser.com\nbelllan.com\nbelloai.com\nbeloj.com\nbelray-coffee.com\nbeltandroadforum.org\nbeltxman.com\nbelverra.com\nbemanicn.com\nbemfa.com\nbemhome.com\nbenbenlong.com\nbenber-tech.com\nbenber.com\nbenbun.com\nbencaopu.com\nbendan.website\nbendi5.com\nbendibao.com\nbendijin.net\nbendis.cc\nbendiso.com\nbendiw.cc\nbendizhidao.com\nbenduo.net\nbenewake.com\nbenfuip.com\nbengbeng.com\nbengbufan.com\nbengden.com\nbengfa.biz\nbenghuai.com\nbengku.com\nbengou.com\nbengrong.com\nbengtie.com\nbengyechina.com\nbengzhanc.com\nbenhs.com\nbeniao.com\nbenjamin.fun\nbenkejieye.com\nbenkua.com\nbenlai.com\nbenlailife.com\nbenlaisy.com\nbenling-sh.com\nbenliuxinwen.com\nbenlizu.com\nbenlkjc.com\nbenlong.vip\nbenma.com\nbenmi.com\nbenmu-health.com\nbennybu.fun\nbenpsbp.com\nbenqhospital.com\nbenqmedicalcenter.com\nbenqmedicalcentersz.com\nbensewang.com\nbenshouji.com\nbensiea.com\nbenweitang.com\nbenweng.com\nbenxiang.com\nbenyh.com\nbenyouhui.com\nbenyuannet.com\nbenzhb.com\nbenzhibbs.com\nbenzhiwangluo.com\nbenztto.com\nbeodesj.com\nbeony.com\nbeook.com\nbepal.pro\nbepurestandards.com\nbequ6.com\nbequ6.org\nbequgew.com\nbequgexs.com\nbequgezw.com\nbequw.com\nbequwx.org\nberchina.com\nberens-china.com\nberfen.com\nbergerda.com\nberlinchan.com\nberlinix.com\nbernouly.com\nberrydigi.com\nberrygenomics.com\nbersella-ai.cc\nbersilion.com\nbertadata.com\nberui.com\nberylbot.com\nbes.ren\nbesbranding.com\nbescar.com\nbeschannels.com\nbescity.com\nbescloud.com\nbesclouds.com\nbescn.com\nbesg-bee.com\nbesget.com\nbeshtech.com\nbesile.com\nbesino.com\nbesonchina.com\nbessystem.com\nbest-display.com\nbest-inc.com\nbest-intl-school.com\nbest-lookstone.com\nbest1.com\nbest198.com\nbest66.me\nbest73.com\nbestadprof.com\nbestapp.wiki\nbestarzx.com\nbestatic.com\nbestb2b.com\nbestbeibao.com\nbestblower.com\nbestcdn.vip\nbestcem.com\nbestchoiceco.com\nbestcloudcdn.com\nbestclouddns.com\nbestcood.com\nbestcovered.com\nbestcrossborder.com\nbestdataclub.com\nbestdo.com\nbestdon.net\nbestdosas.com\nbestechnic.com\nbestedm.net\nbesteduchina.com\nbester-cn.com\nbestexpresser.com\nbestfood517.com\nbestfuturevip.com\nbestgo.com\nbesthairextensions.com\nbesthub.tech\nbesticity.com\nbestincapi.com\nbestincapp.com\nbestjy.net\nbestkids.net\nbestlec.com\nbestlee.net\nbestlosslessmusic.com\nbestmate.net\nbestmoban.com\nbestomro.com\nbestone.com\nbestone.vip\nbestopview.com\nbestpay.net\nbestpeng.com\nbestqliang.com\nbestraylaser.com\nbestreplicheitalia.com\nbestrhy.com\nbestsdwan.com\nbestshinhwa.com\nbestsign.info\nbestsign.tech\nbestsignuniversal.com\nbestsrc.com\nbeststeel-sh.com\nbestsungas.com\nbestsuppliers.com\nbestswifter.com\nbesttrav.com\nbestugali.com\nbestv6.com\nbestvcdn.com\nbestvcdn.net\nbestviewstock.com\nbestwa.com\nbestwatch.cc\nbestwatchaaa.com\nbestwaysh.com\nbestwehotel.com\nbestweshop.com\nbestwesternfelicityshenzhen.com\nbestzone.org\nbestzumo.com\nbet007.com\nbet2268.com\nbet2396.com\nbet33040.com\nbet365uo.com\nbet3739.com\nbet505.app\nbet5993.com\nbet6598.com\nbet6737.com\nbet6755.com\nbet8.cm\nbeta-dns.com\nbetaband.net\nbetadance.net\nbetaenv.com\nbetaflare.com\nbetahub.tech\nbetaidc.com\nbetamao.me\nbetaquantity.com\nbetasmart.tech\nbetavolt.tech\nbetawm.com\nbetazixun.com\nbetcctv.com\nbetely.com\nbethh777.com\nbetokapp.com\nbetop-cn.com\nbetop365.com\nbetophall.com\nbettapharma.com\nbettbio.com\nbetter-cn.com\nbetter365.com\nbetterclyde.com\nbetteredu.net\nbetteryeah.com\nbetterzip.net\nbetterzipcn.com\nbetwayasia.org\nbeuyinm.com\nbeva.com\nbevol.com\nbewellbio.com\nbewg.net\nbewgnn.com\nbeyebe.com\nbeyond-perfection.com\nbeyondbit.com\nbeyondcompare.cc\nbeyondcomparepro.com\nbeyondfund.com\nbeyondh.com\nbeyonditsm.com\nbeyondq.com\nbeyonds.com\nbeyondsungroup.com\nbeyoner.net\nbeyotime.com\nbezbzsyf.com\nbf-jxqc.com\nbf-z.com\nbf-zhengzhou.com\nbf07e33c810281.beer\nbf35.com\nbf99.com\nbfcdnbf.com\nbfcdnrd.com\nbfcdnsc.com\nbfchayuan.com\nbfcmovie.com\nbfdcloud.com\nbffyun.com\nbffzb.com\nbfgho.com\nbfhdp1120.com\nbfhmj.com\nbfikuncdn.com\nbfimg.com\nbfjr.com\nbfnbgame.com\nbfqh.com\nbfqifu.com\nbfqtchayuan.com\nbfscoc.com\nbfsea.xyz\nbfsmy.com\nbfssj.com\nbfsu-artery.net\nbfsutw.com\nbft-robot.com\nbftq.com\nbftv.com\nbfvvs.com\nbfw.wiki\nbfxiuxianqipai.com\nbfxpj888.com\nbfyx.com\nbfyx.net\nbfzhan.com\nbg45.com\nbg7ywl.com\nbgbfds.com\nbgbk.org\nbgbluesky.com\nbgccn.com\nbgctv.com\nbgdeco.com\nbgdzsw.com\nbgfl.net\nbggd.com\nbghc.net\nbghgw.com\nbghmj.com\nbgi-graphene.com\nbgi.com\nbgic.com\nbgici.com\nbgigc.com\nbgjbq.com\nbgk100.com\nbgkj.pro\nbgl88.com\nbglmzm.com\nbgmfans.com\nbgmrecord.com\nbgnyl.com\nbgosp.com\nbgrdh.com\nbgri.com\nbgrimm.com\nbgrwgglz.com\nbgs123.com\nbgsdk.net\nbgsdyz.com\nbgsyb.com\nbgteach.com\nbgtwater.com\nbgucu.com\nbgv888.com\nbgvalve.com\nbgwcsz.com\nbgwl.net\nbgwxc.com\nbgxcl.com\nbgxu.com\nbgyfhh.com\nbgyfhyx.com\nbgyhotel.com\nbgyhotels.com\nbgypc.com\nbgypsc.com\nbgyshop.com\nbgyvfs.net\nbgzchina.com\nbgzx365.com\nbh-lay.com\nbh-mangrove.com\nbh-med.com\nbh-xhhd.com\nbh1t.com\nbh3.com\nbh5.com\nbh568.com\nbh8sel.com\nbhabb.com\nbhbd-alliance.org\nbhccn.com\nbhcd.net\nbhcgky.com\nbhcpu.com\nbhcyhotel.com\nbhcyts.cc\nbhcyy.com\nbhczxx.com\nbhdata.com\nbhdl520.com\nbhdns.com\nbhdxfsyy.com\nbhdyjs.com\nbhecard.com\nbheyy.com\nbhfc.net\nbhfeiyang.com\nbhfz114.com\nbhghy.com\nbhgjjy.com\nbhgmarketplace.com\nbhgroups.com\nbhgsb.com\nbhhfsc.com\nbhhospital.com\nbhhsx.com\nbhhthl.com\nbhhzjt.com\nbhidi.com\nbhiv.pro\nbhjcsc.com\nbhjinghao.com\nbhjjj360.com\nbhjuxian.com\nbhkyxy.com\nbhlib.com\nbhlietu.com\nbhlqjt.com\nbhluoer.com\nbhlyw.net\nbhnet.net\nbhnge.com\nbhnsh.com\nbhpcc.com\nbhpiano.com\nbhpiston.com\nbhqd6688.com\nbhqzyy.com\nbhrencai.com\nbhrssp.com\nbhsanfan.com\nbhsbdcdjzx.com\nbhsence.com\nbhsgnk.com\nbhshtksp.com\nbhshunhui.com\nbhshyy.com\nbhsr.com\nbhszyyy.com\nbhtv.cc\nbhuitong.com\nbhuvgy.com\nbhwzdnweys.com\nbhxww.com\nbhxx.net\nbhxxpt.com\nbhxz.net\nbhybskq.com\nbhyby.com\nbhyintan.com\nbhyueda.com\nbhyuu.com\nbhzck.club\nbhzck.xyz\nbhzd88.com\nbhzdzx.net\nbhzhu203.com\nbhzp.net\nbhzpw.com\nbhzw.com\nbhzyxy.net\nbi-ci.com\nbi-sage.site\nbi4sight.com\nbi5u.com\nbi8brp.com\nbian-fengwei.com\nbianbao.net\nbianbu.xyz\nbiancheng.net\nbiancui.com\nbiandangroup.com\nbiandiantong.com\nbiandouyun.com\nbiandown.com\nbianews.com\nbianfeng.com\nbianfengkuailai.com\nbianhaiyun.com\nbianjianzen.com\nbianjiebao.com\nbianjiqi.net\nbianjiyi.com\nbianju.me\nbianlei.com\nbianlifeng.com\nbianlun.net\nbianmachaxun.com\nbianminwang.com\nbianpingyou.com\nbianquchina.com\nbianquzyk.com\nbiantaishuo.com\nbiantongzixun.com\nbianwa.com\nbianwanjia.com\nbianxian.com\nbianxianmao.com\nbianxianwu.com\nbianxiazai.com\nbianyifang.com\nbianyuandaigou.com\nbianzhia.com\nbianzhile.com\nbianzhirensheng.com\nbiao12.com\nbiaobaini.com\nbiaoceo.com\nbiaoda.me\nbiaodan.info\nbiaodan100.com\nbiaodiancloud.com\nbiaodiandichan.com\nbiaodianfu.com\nbiaofaw.com\nbiaoge.com\nbiaoge.me\nbiaohs.com\nbiaoju01.com\nbiaomi.com\nbiaopan8.com\nbiaopeibao.com\nbiaopu.cloud\nbiaoqing.com\nbiaoqing888.com\nbiaoqingjia.com\nbiaoqingwen.com\nbiaoshixinyi.com\nbiaoshula.com\nbiaosucdn.com\nbiaotianxia.com\nbiaotuan.com\nbiaotukeji.com\nbiaoyi.com\nbiaozhaozhao.com\nbiaozhiku.com\nbiaozhun.org\nbiaozhun8.com\nbiaozhuns.com\nbib0.com\nbibaodao.com\nbibenet.com\nbibibi.net\nbibigpt.co\nbibiku.com\nbible.vip\nbicido.com\nbicobrand.com\nbicoin.info\nbicomoptics.com\nbicpaedu.com\nbicredit.xin\nbicv.com\nbicyc.com\nbid-view.com\nbidchance.com\nbiddingx.com\nbidemi.com\nbidepharm.com\nbidepharmatech.com\nbidgojp.com\nbidianbao.com\nbidianer.com\nbidingxing.com\nbidizhaobiao.com\nbidns.net\nbidtoolads.com\nbiduo.cc\nbiduobao.com\nbiduoxs.com\nbiduwenxue.com\nbidwhy.com\nbie-plc.com\nbiec.com\nbiechila.com\nbiede.com\nbiedoul.com\nbiekanle.com\nbiema.com\nbiept.com\nbieshu.com\nbietongfeng.com\nbieyangapp.com\nbieyelighting.com\nbifabu.com\nbifengxia.com\nbifiv.com\nbiftsce.com\nbig-bit.com\nbig-shanghai.com\nbig5network.com\nbigaaa.net\nbigaka.com\nbigan.net\nbigbaicai.com\nbigballbiz.club\nbigbangux.com\nbigbenmeng.com\nbigbigai.com\nbigbigsun.com\nbigbigwon.com\nbigbigwork.com\nbigbrosci.com\nbigbrx.com\nbigcakegame.com\nbigcat.com\nbigcloud.click\nbigda.com\nbigdata-expo.org\nbigdata.ren\nbigdatacq.com\nbigdatasafe.org\nbigdatastudy.net\nbigdatawuhan.com\nbigddg.com\nbige0.com\nbigecko.com\nbigehudong.com\nbigemao.com\nbigemap.com\nbigerdata.com\nbigerwall.com\nbigeshuju.com\nbigesj.com\nbigeyes.com\nbiggaming.online\nbiggerlens.com\nbiggeryun.com\nbigherdsman.com\nbigjpg.com\nbigniu.com\nbignox.com\nbigo.sg\nbigo.tv\nbigogm.com\nbigoledog.com\nbigolive.tv\nbigops.com\nbigplayers.com\nbigpt8.com\nbigqiao.com\nbigquant.com\nbigrnet.com\nbigtide.com\nbiguiyuan.net\nbiguo100.com\nbiguolunwen.com\nbiguotk.com\nbigwayseo.com\nbigwh.com\nbigwinepot.com\nbigwww.com\nbigxiao.com\nbigyulin.com\nbigzhong.com\nbihaipack.com\nbihe0832.com\nbihongbo.com\nbihoo.com\nbihu.com\nbihu.work\nbihuatuku.net\nbihubao.com\nbihuoji.com\nbiikan.com\nbiioii.com\nbiji.com\nbijiago.com\nbijiagou.com\nbijianzw.com\nbijiao.org\nbijiasso.com\nbijiatu.com\nbijienetworks.com\nbijingdi.com\nbijirim.com\nbijixia.net\nbijsc.com\nbikecool.com\nbikehome.cc\nbikehome.net\nbiketo.com\nbiketour-giant.com\nbiking-m.com\nbilalipay.com\nbilandtech.com\nbilezu.com\nbilfinance.com\nbiliapi.com\nbiliapi.net\nbilibil.com\nbilibili.cc\nbilibili.co\nbilibili.com\nbilibili.li\nbilibili.net\nbilibili996.com\nbilibiligame.co\nbilibiligame.net\nbilibilihelper.com\nbilibilipay.com\nbilibiliq.com\nbilicdn1.com\nbilicdn2.com\nbilicdn3.com\nbilicdn4.com\nbilicdn5.com\nbilicomic.com\nbilicomics.com\nbiligame.co\nbiligame.com\nbiligame.net\nbiligo.com\nbiligx.com\nbilihot.com\nbiliimg.com\nbiliintl.co\nbiliintl.com\nbilimanga.net\nbilinl.com\nbilinovel.com\nbiliui.com\nbilive.com\nbilivideo.com\nbilivideo.net\nbiliyu.com\nbill-jc.com\nbillchn.com\nbillionaireboard.com\nbillionbottle.com\nbillionconnect.com\nbillionfocus.com\nbillionseo.com\nbillowlink.com\nbillu.cc\nbillwang.net\nbilnn.com\nbim-times.com\nbimant.com\nbimawen.com\nbimface.com\nbimfmchina.com\nbimhuite.com\nbimige.net\nbimiwu.com\nbimjoy.com\nbimsa.net\nbinancezh.kim\nbinancezh.link\nbinary-semi.com\nbinaryai.net\nbinaryai.tech\nbinbinbiji.com\nbinbinyl.com\nbincailiuxue.com\nbinfang.com\nbinfenniao.com\nbinfenquzu.com\nbinfenshikong.com\nbinfenyeke.com\nbinfenyingyu.com\nbinfenzhilv.com\nbing400.com\nbingchenvacuum.com\nbingd.com\nbingdian01.com\nbingdoc.com\nbingdou.site\nbingfan.com\nbingganqy.com\nbinggo.com\nbingguner.com\nbinghelengmei.com\nbingjo.com\nbingjun.cc\nbinglai.net\nbinglanggu.com\nbinglianhuajianzhan.com\nbingliekeji.com\nbinglixue.com\nbingninglaowu.com\nbingo321.com\nbingocinemas.com\nbingoenglish.com\nbingolink.biz\nbingosci.com\nbingqipu.net\nbingquan.com\nbingshandashu.com\nbingsin.com\nbingtuannet.com\nbinguo.me\nbingxs.com\nbingyan.net\nbingyandianqi.com\nbingyongjin.vip\nbingyuanhb.com\nbingzunkeji.com\nbinhaiinv.com\nbinhaiwater.com\nbinhangtech.com\nbinjie.fun\nbinjie.site\nbinligzj.com\nbinliwatch.com\nbinmt.cc\nbinmtplus.com\nbinnong.com\nbinpang.me\nbinqsoft.com\nbinstream.live\nbinuoniu.com\nbinxin.com\nbinzc.com\nbinzhi.com\nbinzhikeji.com\nbinzhouw.com\nbinzz.com\nbio-dxzf.com\nbio-equip.com\nbio-fount.com\nbio-fuyang.com\nbio-info-trainee.com\nbio-island.com\nbio-protocol.org\nbio-review.com\nbio1000.com\nbio360.net\nbio4p.com\nbiobiopha.com\nbiobw.org\nbiocause.com\nbiocellcharger.com\nbioceltech.com\nbiochemsafebuy.com\nbiocloud.net\nbiocome.com\nbiocompounds.com\nbiodiscover.com\nbiodiscover.net\nbiodx.com\nbioeast.com\nbiogeeker.com\nbiogo.net\nbiogot.com\nbioguoke.com\nbiohf.com\nbiohong.com\nbiohuaxing.com\nbiohyalux.com\nbiohymn.com\nbioinfo-scrounger.com\nbiokangtai.com\nbiokerun.com\nbioktech.com\nbiolab.xyz\nbioligo.com\nbiolihe.com\nbiome-expo.com\nbiomedicchina.com\nbiominhai.com\nbionav.cc\nbionovapharma.com\nbioon.com\nbioon.net\nbiopotentia.com\nbiorule.com\nbioscenepharma.com\nbiosci-cq.com\nbioscienceres.com\nbioshineking.com\nbiosmelt.com\nbiosrepair.com\nbiosschina.com\nbiostar-pharm.com\nbiostatistic.net\nbiosune.com\nbiotanon.com\nbiotecan.com\nbiotech-meds.com\nbiotechina.com\nbiotechwell.com\nbiothink.tech\nbioustar.com\nbiovector.net\nbiovip.com\nbioway-pku.com\nbioxtime.com\nbipaihang.com\nbipvcn.com\nbiqg8.com\nbiqige.cc\nbiqiuge.com\nbiqu.ge\nbiqu6.com\nbiquan8.com\nbiqubao.com\nbiqubao10.com\nbiqubu.com\nbiqudu.com\nbiqudu.tv\nbiqufu.com\nbiqugao.cc\nbiquge.info\nbiquge.la\nbiquge123.com\nbiquge8.com\nbiquge9.cc\nbiquge99.cc\nbiqugeg.com\nbiqugena.com\nbiquges.com\nbiqugesk.org\nbiqugex.com\nbiqugexs.com\nbiqugexs.la\nbiqugexsapp.com\nbiqugexsw.com\nbiqugezw.us\nbiqugg.org\nbiqugo.net\nbiqugu.cc\nbiqukai.com\nbiqukan.com\nbiquke.com\nbiquke.la\nbiquke.me\nbiquku.la\nbiqukun.com\nbiqukun.la\nbiquluo.com\nbiqupai.com\nbiqusa.com\nbiqushu.com\nbiqusk.com\nbiqusoso.com\nbiquw.com\nbiquw.info\nbiquw.la\nbiquwo.com\nbiquwo.net\nbiquwx.la\nbiquxs.com\nbiquyue.com\nbiquzw.info\nbiqwo.com\nbiransign.com\nbird.art\nbird4d.com\nbirdback.org\nbirdol.com\nbirdotech.com\nbirdwork.com\nbirentech.com\nbisairi.com\nbisco777.bet\nbisenaccess.com\nbisenet.com\nbisenpark.com\nbisgz.com\nbishen.ink\nbishengoffice.com\nbishengyuan.com\nbisheziliao.com\nbishijie.com\nbishuiwan.com\nbisjigang.com\nbison-technologies.com\nbisonglighting.com\nbisonscm.com\nbisp.com\nbistream.net\nbit-coin-cash.asia\nbitahub.com\nbitauto.com\nbitautoimg.com\nbitautotech.com\nbitbe.at\nbitbrowser.net\nbitcar.com\nbitcron.com\nbitdave.fun\nbitdefender-cn.com\nbiteabc.com\nbitech-automotive-wuhu.com\nbitecoin.com\nbiteedu.com\nbitekou.com\nbitell.com\nbitenn.com\nbitett.com\nbitgo.cc\nbitgo.net\nbitguai.com\nbithosts.net\nbitiful.com\nbitiful.net\nbitintelligence.net\nbitjd.com\nbitjia.com\nbitky.cc\nbitlib.cc\nbitmain.vip\nbitmingw.com\nbitmoe.com\nbitol.net\nbitongtech.com\nbitonloop.com\nbitosscdn.com\nbitqiu.com\nbitscn.com\nbitsde.com\nbitse.com\nbitvh.com\nbitzsoft.com\nbiubiu.tv\nbiubiu001.com\nbiuged.com\nbiulie.com\nbiusoft.com\nbiwangxiao.com\nbiwuke.com\nbixiaxs.net\nbixishang.com\nbixu.cc\nbixu.me\nbixuecrm.com\nbixueke.com\nbiya.ltd\nbiyabi.com\nbiyan8.com\nbiyangwang.com\nbiyao.com\nbiye.net\nbiyehome.net\nbiyele.com\nbiyelunwenjiance.com\nbiyequna.com\nbiyequnar.com\nbiyezheng8.com\nbiyi.net\nbiyidc.com\nbiyingniao.com\nbiyinjishi.com\nbiyong007.com\nbiyork.com\nbiyou.tech\nbiyouxue.com\nbiyuandi.com\nbiyuansh.com\nbiyuanshuiwu.com\nbiyuwu.cc\nbiyuzg.com\nbiz-abroad.com\nbiz-east.com\nbiz-email.net\nbiz178.com\nbiz37.net\nbiz72.com\nbizatmobile.com\nbizcent.com\nbizchallenge.net\nbizcharts.net\nbizcn-test.com\nbizcn.com\nbizcn.net\nbizcn666.com\nbizconfstreaming.com\nbizhi360.com\nbizhi88.com\nbizhigq.com\nbizhimiao.com\nbizhiquan.com\nbizhiwang.com\nbizhixia.com\nbizhizj.com\nbizhizu.com\nbizhongchou.com\nbizmoto.com\nbiznewscn.com\nbizopsmall.com\nbizpai.com\nbizsmooth.com\nbizsmooth.org\nbizsn.com\nbizsofts.com\nbizvane.com\nbj-big.com\nbj-brother.com\nbj-brsf.com\nbj-bts.com\nbj-byjz.com\nbj-cronda.com\nbj-dahon.com\nbj-dsmzyy.com\nbj-fm.com\nbj-fxh.com\nbj-git.com\nbj-hengdeli.com\nbj-ipcf.org\nbj-jzgg.com\nbj-klws.com\nbj-kpn.com\nbj-nego.com\nbj-pr.com\nbj-px.com\nbj-sea.com\nbj-syc.com\nbj-sydc.com\nbj-tencentclb.cloud\nbj-tencentclb.com\nbj-tencentclb.net\nbj-tencentclb.work\nbj-tvart.com\nbj-tygy.com\nbj-win.com\nbj-wjh.com\nbj-yt.com\nbj-zkhb.com\nbj003.com\nbj0yx.com\nbj1.api.bing.com\nbj1000e.com\nbj148.org\nbj159zx.com\nbj1777.com\nbj17z.com\nbj2scmm.com\nbj315.org\nbj35.com\nbj360.com\nbj42195.com\nbj51.org\nbj520.com\nbj597.com\nbj5i5j.com\nbj5iodzgyi.com\nbj7z.com\nbj80.com\nbj918.com\nbj96007.com\nbjadks.com\nbjadmix.com\nbjadn.net\nbjagro.com\nbjaja.com\nbjanjili.com\nbjartmuseum.com\nbjatv.com\nbjbaidianfeng.com\nbjbalb.com\nbjbaodao.net\nbjbb.com\nbjbeichen.com\nbjbeifangjx.com\nbjbfdt.com\nbjbkwy.com\nbjblackhole.com\nbjbna.com\nbjbpi.com\nbjbrew.com\nbjbtfu.com\nbjbus.com\nbjbywx.com\nbjbzc.com\nbjbzszxy.com\nbjc-ent.com\nbjcae.com\nbjcag.com\nbjcancer.org\nbjcankao.com\nbjcapital.com\nbjcathay.com\nbjcatzgroup.com\nbjcdc.org\nbjcdomain.com\nbjceis.com\nbjcgtrain.com\nbjchishengkeji.com\nbjchunxin.com\nbjcjl.net\nbjcjyt.com\nbjckkj.com\nbjclover.com\nbjcls.net\nbjcma.com\nbjcoco.com\nbjcomic.net\nbjcomm.com\nbjcomparison.com\nbjconrad.com\nbjcontinent.com\nbjcorona.com\nbjcpjzhyxh.com\nbjcrg.com\nbjcsfx.com\nbjcshy.com\nbjcsyg.com\nbjcta.net\nbjcxdf.com\nbjcxqd.com\nbjcycg.com\nbjcyjt.com\nbjcymt.com\nbjcymyy.com\nbjcyzg.com\nbjd-mc.com\nbjdcfy.com\nbjdclib.com\nbjddtm.com\nbjdf110.com\nbjdfrw.com\nbjdfxj.com\nbjdhwy.com\nbjdiaoyu.com\nbjdjc.com\nbjdllti.com\nbjdongxin.com\nbjdp2p.com\nbjdragon.com\nbjdsppa.com\nbjdth.com\nbjdw.org\nbjdwl.net\nbjdxfsxx.com\nbjdxzxy.com\nbjdyhsy.com\nbjdyyc.com\nbjeasycom.com\nbjebc.com\nbjeesa.org\nbjef.com\nbjei.com\nbjent.org\nbjepea.com\nbjesg.com\nbjesound.com\nbjewaytek.com\nbjexmail.com\nbjexx.com\nbjfc.cc\nbjflc.com\nbjfmart.com\nbjfpw.com\nbjfqy.com\nbjfriendshiphotel.com\nbjfsali.com\nbjftfy.com\nbjfzst.com\nbjgas.com\nbjgasgh.com\nbjgastx.com\nbjgcl.com\nbjgdkn.com\nbjgdzx.com\nbjgfa.com\nbjggk.com\nbjggxh.com\nbjgjjcapital.com\nbjgjjmxy.com\nbjgjtjk.com\nbjgk.com\nbjglxf.com\nbjglxt.com\nbjgongteng.com\nbjgongyu.com\nbjgoodwill.com\nbjgree.net\nbjgujibaohu.com\nbjgumu.com\nbjguodu.com\nbjgvpn.amd.com\nbjgvpn2.amd.com\nbjgxs.com\nbjgymq.com\nbjgyzjw.com\nbjgyzs.com\nbjgzc.com\nbjhaiguang.com\nbjhaijixing.com\nbjhanlin.com\nbjhdcp.com\nbjhdhm.com\nbjhdnet.com\nbjhdrx.com\nbjhee.com\nbjhengchi.com\nbjhengjia.net\nbjhenson.com\nbjherbest.com\nbjhgbjgs.com\nbjhlgw.com\nbjhmcm.com\nbjhmyq.com\nbjhouse.com\nbjhrha.com\nbjhsyk.com\nbjhsyuntai.com\nbjhszp.com\nbjhtlckj.com\nbjhtzsgs.com\nbjhuaxin.com\nbjhuiqi.net\nbjhuizhu.com\nbjhwbr.com\nbjhwtx.com\nbjhwxy.com\nbjhx110.com\nbjhxqh.com\nbjhxzlyy.com\nbjhytjxjg.com\nbjhzkq.com\nbjhzzs.com\nbjiab.com\nbjiae.net\nbjiaep.com\nbjicpark.com\nbjicrm.com\nbjidc.net\nbjidit.com\nbjinfobank.com\nbjipwqzx.com\nbjitic.com\nbjiwex.com\nbjjbbayy.com\nbjjbls.com\nbjjchf.com\nbjjdwx.com\nbjjfsd.com\nbjjgyy.com\nbjjhhft.com\nbjjhhn.com\nbjjhsw.com\nbjjihui.com\nbjjingdong.com\nbjjinl.com\nbjjinming.com\nbjjinsong.com\nbjjiuhe.com\nbjjizhun.com\nbjjjst.com\nbjjk66.com\nbjjkglxh.org\nbjjkw.net\nbjjmzh.com\nbjjnrl.com\nbjjnzf.com\nbjjqe.com\nbjjqzyy.com\nbjjr-tencentclb.cloud\nbjjr-tencentclb.com\nbjjr-tencentclb.net\nbjjr-tencentclb.work\nbjjsj.com\nbjjsschool.net\nbjjstyyzzyy.com\nbjjsyy.com\nbjjszyyy.com\nbjjtat.com\nbjjubao.org\nbjjuli.com\nbjjzjt.com\nbjjzjxhyxh.com\nbjjzsc.com\nbjjzzpt.com\nbjk30.com\nbjkaihua.com\nbjkaihua.net\nbjkcsj.com\nbjkdhy.com\nbjkdvm.com\nbjkeyscin.com\nbjkgedu.com\nbjknrt.com\nbjkqj.com\nbjkqyx.com\nbjkrtwl.com\nbjkswy.com\nbjktaz.com\nbjktwe.com\nbjkxgroup.com\nbjl777.com\nbjlacc.com\nbjlangbo.com\nbjlanqiao.com\nbjlaw995.com\nbjlcs-tech.com\nbjlevsoft.com\nbjlg.com\nbjljzw888.com\nbjlkhd.net\nbjllsy.com\nbjlmg.com\nbjlongview.com\nbjlot.com\nbjltsj.com\nbjltwp.com\nbjltxk.com\nbjlyjszx.com\nbjlysy001.com\nbjlyw.com\nbjmailqq.com\nbjmama.com\nbjmama.net\nbjmamiai.com\nbjmania.com\nbjmantis.net\nbjmda.com\nbjmeikao.com\nbjmerson.com\nbjmjm.com\nbjmslp.com\nbjmti.com\nbjmts.net\nbjmxkn.com\nbjmxxh.com\nbjmxy.net\nbjmylike.com\nbjmzdx.org\nbjmzw.com\nbjn2ms.net\nbjnai.net\nbjnaxl.com\nbjnhsw.com\nbjnja.com\nbjnkzx.com\nbjnsr.com\nbjnxgbyy.com\nbjota.com\nbjp321.com\nbjpag.com\nbjpcyd.com\nbjpfh.com\nbjpifu.com\nbjpinweixuan.com\nbjpmhyxh.com\nbjpowernode.com\nbjppa.com\nbjpryk.com\nbjqcjdcj.com\nbjqh.org\nbjqhgjj.com\nbjqichezl.com\nbjqingyang.com\nbjqlg.com\nbjqtbase.com\nbjqtfifthbase.com\nbjqtforthbase.com\nbjqtsecbase.com\nbjqtthirdbase.com\nbjqtti.com\nbjqyjjlb.com\nbjqykc.com\nbjqzhd.com\nbjraee.com\nbjrc.com\nbjrcb.com\nbjrdhx.com\nbjretech.com\nbjreview.com\nbjrjgj.com\nbjrjtdkj.com\nbjrjyy.com\nbjrlzyw.com\nbjrock.com\nbjrqjt.com\nbjrtcdn.com\nbjrtjt.com\nbjrun.com\nbjrussia-art.com\nbjrwdx.com\nbjry.com\nbjsasc.com\nbjsava.com\nbjsbnet.com\nbjscfl.com\nbjscszh.com\nbjscyxh.com\nbjsdcm.net\nbjsdeyy.com\nbjsdfz.com\nbjsdgroup.com\nbjsdr.org\nbjsfdr.com\nbjsfrj.com\nbjsftzxyjhyy.com\nbjsgzgs.com\nbjshaet.com\nbjshdjy.com\nbjsheng.com\nbjshgzzxh.com\nbjshowinfilm.com\nbjsiasun.com\nbjsinglewindow.com\nbjsj5.com\nbjsjds.com\nbjsjgyy.com\nbjsjsch12333.com\nbjsjstxyy.com\nbjsjsyly.com\nbjsjwl.com\nbjskjzs.com\nbjsoho.com\nbjsound.com\nbjsoyo.com\nbjsptf.com\nbjspw.com\nbjsrc.com\nbjsrmyy.com\nbjsryc.com\nbjssjsyy.com\nbjsskdn.com\nbjstcc.com\nbjstjy.com\nbjsubway.cc\nbjsubway.com\nbjsuewin.com\nbjsxdgzc.com\nbjsxjt.com\nbjsxt.com\nbjsydq.com\nbjsyhy.org\nbjsyqw.com\nbjsytv.com\nbjsyzy.com\nbjszhd.net\nbjszlsjt.com\nbjtaihua.com\nbjtcf.com\nbjtcy.com\nbjtdhkj.com\nbjtelecom.net\nbjtieke.com\nbjtitle.com\nbjtjhn.com\nbjtjw.net\nbjtjzx.com\nbjtkyy.com\nbjtmjr.com\nbjtndao.org\nbjtobacco.com\nbjtonghui.com\nbjtongjian.com\nbjtopli.com\nbjtqcy.com\nbjtradestar.com\nbjtth.org\nbjttsf.com\nbjtvnews.com\nbjtxc.com\nbjtysj.com\nbjtyzh.org\nbjtzeduyun.com\nbjtzfy.com\nbjtzzg.com\nbju-flo.com\nbjucd.com\nbjun.tech\nbjunionstar.net\nbjuri.com\nbjvps.net\nbjvtc.com\nbjweizhifu.com\nbjwenchen.com\nbjwenyu.com\nbjwftd.com\nbjwfz.com\nbjwhds.com\nbjwhmedia.com\nbjwig.com\nbjwkhotel.com\nbjwkzl.com\nbjwpjs.com\nbjwqxh.com\nbjwt.com\nbjwwhc.com\nbjwyseo.com\nbjxa.com\nbjxchjxx.com\nbjxcloud.com\nbjxcsy.net\nbjxdfk.com\nbjxf315.com\nbjxhly.com\nbjximei.com\nbjxingma.com\nbjxingzheng.com\nbjxinku.com\nbjxjyy666.com\nbjxjzyy.com\nbjxku.com\nbjxtjmsb.com\nbjxtkj.com\nbjxueche.net\nbjxwcq.com\nbjxwx.com\nbjxx.vip\nbjxx8.com\nbjxxw.com\nbjxyjf.com\nbjxyjy.com\nbjxzlou.com\nbjxzxw.com\nbjyah.com\nbjyald.com\nbjyc.online\nbjycwa.com\nbjycxh.com\nbjyczb.com\nbjydzy.com\nbjyestar.com\nbjyhjt.net\nbjyhwy.com\nbjyingge.com\nbjyingyun.com\nbjyirui.com\nbjyizhimei.com\nbjylhyxh.com\nbjyme.com\nbjyn.com\nbjyouth.net\nbjypw.com\nbjyqsj.com\nbjysxh.com\nbjysyunsheng.com\nbjyszb.com\nbjythd.com\nbjyuantong.com\nbjyubing.com\nbjyueshenzj.com\nbjyujinxiang.com\nbjywt.com\nbjyxl.com\nbjyyb.net\nbjyyun.com\nbjyzfjj.com\nbjzalaw.com\nbjzaxy.com\nbjzbb.com\nbjzbkj.com\nbjzcha.com\nbjzcth.com\nbjzg.com\nbjzgh.org\nbjzgh12351.org\nbjzghd.com\nbjzhaxikj.net\nbjzhiborui.com\nbjzhishi.com\nbjzhongyi.com\nbjzhsx.com\nbjzkgc.com\nbjzkgr.com\nbjzkhs.com\nbjzklk.com\nbjzklp.com\nbjzmdlsxs.com\nbjzmkm.com\nbjzmqj.com\nbjznkq.net\nbjznnt.com\nbjzph.com\nbjzqw.com\nbjzrzc.com\nbjzs.cc\nbjzs114.com\nbjzsxccm.com\nbjzunlaotang.com\nbjzwbc.com\nbjzwhz.com\nbjzwx.com\nbjzwzx.com\nbjzxcp.com\nbjzxsf.net\nbjzxyy.com\nbjzy360.com\nbjzybaoan.com\nbjzybc.com\nbjzyjt.com\nbjzyrxgs.com\nbjzysx.com\nbjzzcb.com\nbjzzdb.com\nbjzzrx.com\nbjzzschool.com\nbk-cdn.com\nbk-cdn01.com\nbk3r.com\nbk41.net\nbk5u.com\nbkaivl2daed.com\nbkapigw.com\nbkapps.com\nbkbgame.com\nbkbyxa.com\nbkcloud.cc\nbkclouds.cc\nbkcode.net\nbkdou.com\nbkeconomy.com\nbkill.com\nbkill.net\nbkjia.com\nbkjk-inc.com\nbkjk.com\nbkjk123.com\nbkjpress.com\nbkjsemi.com\nbkkchina.com\nbkn.cc\nbkneng.com\nbknzdh.com\nbkpcn.com\nbkqq.com\nbkrgame.com\nbkscc.com\nbktencent.com\nbktsj.com\nbkuax.com\nbkvps.com\nbkweek.com\nbkzzy.com\nbl.com\nbl0757.com\nbl91.com\nbla01.com\nblack-unique.com\nblackbirdsport.com\nblackdir.com\nblackdragon.com\nblackeep.com\nblackh4t.org\nblackint3.com\nblackluxury.com\nblackshark.com\nblackswancake.com\nblackxl.org\nblazefire.com\nblazefire.net\nblazingnight.cfd\nblazor.zone\nblbilibili.com\nblbl.online\nblbx.com\nblctsy.com\nbld365.com\nbldaea.store\nbldimg.com\nbldlive.com\nbldpharm.com\nbldybbb.com\nbldz.com\nbldzlsb.com\nbleege.com\nblemall.com\nblendercn.org\nblessedbin.com\nblestech.com\nblgl8.com\nblgxhn.com\nblhdazhe.com\nbliao.com\nblibao.com\nblibee.com\nblibee.net\nblicube.com\nblimage.com\nbliner.me\nbling.link\nblingabc.com\nblinghour.com\nblingoffice.com\nblissmall.net\nblizzardcn.com\nblju.com\nblksails.net\nbllsbz.com\nblm.net\nblmpb.com\nblockchain.hk\nblockchain123.com\nblockchainlabs.org\nblockmeta.com\nblockob.com\nblocrepresents.com\nblog.htc.com\nblog.htcvive.com\nblog.vive.com\nblogcdn-dns.net\nblogchina.com\nblogchina.org\nblogchinese.com\nblogcn.co\nblogfeng.com\nbloggern.com\nbloghub.fun\nblogjava.net\nblogofmusic.com\nblogou.com\nblogqun.com\nblogturn.com\nblogways.net\nblogwe.com\nblogxuan.com\nbloom-powder.com\nbloomage.com\nbloomagebiotech.com\nbloomchiic.com\nbloomgamer.com\nbloomtoursvip.com\nbloqp.com\nblossommo.com\nblossomwed.com\nbloves.com\nblovestorm.com\nblowawards.com\nblowing-mould.com\nblowmoldmachines.com\nblpack.com\nblqugex.cc\nblqx.com\nblqy.com\nblr206.com\nblschain.com\nblshthb.com\nblskye.com\nblsw.cc\nblsweda.com\nblsx.com\nblszf.hk\nblszhifa.com\nblszyy.com\nbltyyls.com\nbltzw.com\nblue-city.com\nblue-skylandscape.com\nblue-zero.com\nblue0123.com\nblueaggrestore.com\nbluearchive-cn.com\nbluebeebox.com\nbluebellalingerie.com\nbluebellls.com\nbluebirdme.com\nblueboxasia.com\nbluebridge-amc.com\nbluebullcn.com\nbluebungalow-au.com\nbluecardpay.com\nbluecardsoft.com\nbluecardsoft.net\nbluecatyun.com\nbluecefa.com\nbluecity.com\nbluecloudprod.com\nblued.com\nbluedarti.com\nbluedgames.com\nbluedhealth.com\nbluedimg.com\nbluedon.com\nbluedoorindex.com\nbluedotcc.com\nbluefite.com\nbluefocus.com\nbluefocusgroup.com\nblueglass.vip\nbluegogo.com\nbluegoon.com\nbluehn.com\nblueidea.com\nbluek.org\nbluelettercn.org\nbluelightfuse.com\nbluelive.me\nbluenotechina.com\nblueocean-china.net\nblueplus.cc\nbluepoch.com\nbluesdream.com\nblueseaict.com\nbluesharkinfo.com\nblueshow.net\nblueskykong.com\nblueskyschool.net\nblueskystudy.com\nblueskyxn.com\nblueslc.tech\nbluesoleil.com\nbluestep.cc\nbluetime.com\nbluetowngroup.com\nbluetrum.com\nbluewhaleremote.com\nbluezz.net\nblurdev.com\nblw.moe\nblwire.com\nblxfc.com\nblxs.info\nblxs.la\nblycctv.com\nblyun.com\nblzls.xyz\nblzpw.net\nblzsjx.com\nbm-inv.com\nbm-mc.com\nbm001.com\nbm0392.com\nbm12166.org\nbm369.net\nbm50ue2uwnj7.com\nbm8.tv\nbmbios.com\nbmbn100.com\nbmbqwater.com\nbmc-medical.com\nbmcedu.net\nbmcx.com\nbmdbr.com\nbmdxcx.com\nbme-assemble.com\nbme-clock.com\nbme-grow.com\nbme-introduce.com\nbme-invite.com\nbme-mp.com\nbme-wx.com\nbmeicn.com\nbmema.org\nbmeol.com\nbmfsm.com\nbmh1958.com\nbmimage.com\nbmjet.com\nbmjzkj.com\nbml365.com\nbmlink.com\nbmlxkj.com\nbmm-assemble.com\nbmm-clock.com\nbmm-grow.com\nbmm-introduce.com\nbmm-invite.com\nbmm-mp.com\nbmm-wx.com\nbmmmd.com\nbmmsteel.com\nbmob.site\nbmobapp.com\nbmobcloud.com\nbmobpay.com\nbmolive.help\nbmoook.com\nbmosecuritylogin.com\nbmp.ovh\nbmpj.net\nbmrtech.com\nbmrtjt.com\nbms16.com\nbmser.com\nbmshow.com\nbmtrip.com\nbmw8033.com\nbmwallpaper.com\nbmwchina.cloud\nbmwnc.com\nbmxinfang.com\nbmyl2.com\nbmzxw.com\nbn21.com\nbnacg.com\nbnbba.com\nbnbcamp.com\nbnblogs.cc\nbnbtrip.com\nbnc66.com\nbnchina.com\nbncp.xyz\nbncwork.com\nbncyh.com\nbndsfc.com\nbnhelm.com\nbnhshiguan.com\nbnjyks.com\nbnk-jaoptions.com\nbnncn.com\nbnnd.net\nbnnnk.com\nbnocode.com\nbntyh.com\nbnup.com\nbnupg.com\nbnwin.com\nbnxf.online\nbnysq.com\nbnyy.com\nbnzone.com\nbo-blog.com\nbo0s.com\nbo56.com\nboadge.com\nboai.com\nboai120.com\nboaigx.com\nboaihospital.com\nboairl.com\nboaiswgs.com\nboanits.com\nboao.press\nboaoforum.org\nbob-cardif.com\nbob-leasing.com\nbob.com\nbobaow.com\nbobbns.com\nbobcare.com\nbobcfc.com\nbobcoder.cc\nbobdirectbank.com\nbobdog.com\nboblog.com\nbobmao.com\nbobo.com\nbobo2008.com\nbobo91.com\nbobobird.com\nbobohome.store\nbobopic.com\nboboyq.com\nbobswatchstore.com\nbobtranslate.com\nboc-leasing.com\nbocai.life\nbocaicms.com\nbocaiwawa.com\nbocamchina.com\nboccfc.cc\nboce.com\nboce003.com\nbocep2c.com\nbocetest.com\nbocfullertonbank.com\nbocgins.com\nbochaai.com\nbochengmed.com\nbochkonline.com\nbochyun.com\nbocichina.com\nbocifco.com\nbocifunds.com\nbociim.com\nbocim.com\nbocins.com\nbocohz.com\nbocomcc.com\nbocommleasing.com\nbocommlife.com\nbocommtrust.com\nbocondalian.com\nbocsolution.com\nbodaedu.net\nbodahu.com\nbodatek.net\nbode-e.com\nbodestone.com\nbodiantrading.com\nboditechgx.com\nbodoai.com\nbodocn.com\nbodu.com\nboduhappiness.com\nbodyguard007.com\nboe.com\nboendejc.com\nboerchina.com\nboerzg.com\nbof98.com\nbofangw.com\nbofyou.com\nbog.ac\nbogaochem.com\nbogokj.com\nboguanpaimai.com\nbogute.com\nboguub.com\nbohaiadx.com\nbohaigs.com\nbohaileasing.com\nbohailife.net\nbohaishibei.com\nbohaisports.com\nbohaiyun.com\nbohaoclub.com\nbohe.com\nbohejiasuqi.com\nbohewangluo.com\nbohu.co\nbohua.com\nbohuanchina.com\nbohuasanhe.com\nbohui-tech.com\nbohuigk.com\nbohuihe.com\nbohuitalent.com\nboilerinfo.net\nboill.com\nboincdn.live\nboiots.com\nbojianger.com\nbojiaojituan.com\nbojicdmo.com\nbojie.bid\nbojolight.com\nbojoy.net\nbojun-import.com\nboka.vc\nbokaishi.com\nbokao2o.com\nboke.com\nboke.one\nboke.pw\nboke112.com\nboke8.net\nbokecc.com\nbokecs.net\nbokee.com\nbokee.net\nbokesoft.com\nbokesoftware.com\nbokexia.com\nbokeyz.com\nboktour.com\nbokunwatch.com\nbolaa.com\nbolan.net\nbolaninfo.com\nbolanjr.com\nboldfrontierdesign.com\nboldseas.com\nbole-china.com\nbole.com\nbole.name\nbole766.com\nbolead.com\nboledir.com\nbolegs.com\nbolehu.net\nbolei99.com\nboleihg.com\nbolejiang.com\nbolejiaoxue.com\nbolelink.com\nbolexiaozhao.com\nbolin1688.com\nbolink.club\nbolken.com\nbolo.me\nbolo.video\nbolongxm.com\nbolq.com\nboltp.com\nboluogouwu.com\nboluomee.com\nboluomeet.com\nboluomi01.com\nboluoyun.com\nboluoyunyu.com\nboluozaixian.com\nbom.ai\nbom2buy.com\nbomanair.com\nbomeeting.net\nbomin-china.com\nbominelec.com\nboming-sc.com\nbomman.com\nbomyg.com\nbon-top.com\nbon-wine.com\nbonan.vip\nbonbonbongame.com\nbond120.com\nbond520.com\nbondent.com\nbondlady.com\nboneboat.com\nbonepuppy.com\nbonestgattiwatch.com\nbongm.com\nbongmi.com\nbongv.com\nbongwell.com\nboningad.xyz\nbonjour.bio\nbonkee.net\nbonkgb.com\nbonree.com\nboobooke.com\nboodo.com\nbooea.com\nbooen.co\nbooeoo.com\nboohee.com\nbook118.com\nbook1993.com\nbookabc.net\nbookapka.com\nbookask.com\nbookdao.com\nbookdown.net\nbookedu.com\nbookersea.com\nbookfedex.com\nbookfeel.com\nbooking001.com\nbookingtee.com\nbookinlife.net\nbooknest.net\nbookof.com\nbookqi.com\nbooks51.com\nbookschina.com\nbooksgoo.com\nbookshadow.com\nbookshi.com\nbookshoptw.com\nbookshuku.com\nbooksky.cc\nbookskys.com\nbooksn.com\nbooksos.net\nbooktxt.com\nbooktxt.net\nbookuu.com\nbookxnote.com\nboolan.com\nboolaw.com\nboole-tech.com\nboolv.com\nboomallha.com\nboonew.com\nboonoo.net\nboooba.com\nboooming.com\nboooog.net\nbooop.net\nboopwater.com\nboosj.com\nboost77.com\nboostsolar.com\nboosyi.com\nbootcdn.net\nbootcss.com\nbootmb.com\nbootstrapmb.com\nboox.com\nbooyu-import.com\nbooz88.com\nbopai.com\nbopaisemi.com\nbopinquwei.online\nbopuyun.com\nboqianpvm.com\nboqii.com\nboqiicdn.com\nboqugew.com\nboracaybestdeals.com\nborain.com\nborcci.com\nborderlessbd.com\nborenhospital.com\nborlonclan.com\nborn-tw.com\nborn123.com\nborninsummer.com\nboroyf.com\nborpor.com\nborscon.com\nborui-group.com\nborui1001.com\nboruipinggu.com\nboruiqin.com\nboruisx.com\nboruixun.com\nboruiyanjiu.com\nborun-sun.com\nboruntong.com\nboryou.com\nbos.xin\nboscuser.com\nbosdsoft.com\nboseclub.com\nboseip.com\nbosen-fuji.com\nbosenrui.com\nbosera.com\nbosera.com.hk\nboshgame.com\nboshi.tv\nboshihoujob.com\nboshijob.com\nboshika.com\nboshixitong.com\nboshungame.com\nbosi12315.com\nbosibest.com\nbosidata.com\nbosideng.com\nbosideng.me\nbosideng.net\nbosigame.com\nbosikj.com\nboslon.com\nbosmaa.com\nbosmarter.com\nbosmia.com\nbosomchina.com\nbosondata.net\nbosong.online\nbosonnlp.com\nbosonshop.com\nboss-young.com\nbosscdn.com\nbossco.cc\nbosscome.com\nbossgoo.com\nbossgy.com\nbosshr.com\nbossincom.com\nbosszhipin.com\nbostonis.org\nbosunman.com\nbotaogroup.com\nbotaoo.com\nbotaopac.com\nbote777.org\nbotemotor.com\nbotnet.cc\nbotny.com\nbotocard.com\nboton-tech.com\nbotongr.com\nbotorange.com\nbotsfy.com\nbotslab.com\nbottlekj.com\nbouffalolab.com\nbountech.com\nbountyteam.com\nboway.com\nboweifeng.com\nbowerp.com\nbowok.com\nbowu66.com\nbowuzhi.fm\nbox-anchor.com\nbox-z.com\nbox3.fun\nboxdouyin.com\nboxiaole.com\nboxilink.com\nboxim.online\nboxisign.com\nboxmoe.com\nboxuegu.com\nboxueio.com\nboxui.com\nboxunyt.com\nboxz.com\nboy-toy.net\nboya300.com\nboyaa.com\nboyaapoker.com\nboyaastar.com\nboyaceo.com\nboyais.com\nboyamedia.com\nboyamicro.com\nboyaobang.com\nboyasoftware.com\nboyaxun.com\nboydwang.com\nboyi.co\nboyikang.com\nboyingsj.com\nboyinhotel.com\nboyishu.me\nboylondonchina.com\nboyoucy.com\nboyouquan.com\nboysky.com\nboyuan-pharma.com\nboyuan.com\nboyuan.net\nboyuanchemical.com\nboyuanjiaxin.com\nboyue.com\nboyuecasting.com\nboyueedu.com\nboyuemobile.com\nboyuesh.com\nboyunso.com\nboyuntu.com\nboyuonline.com\nbozhihua.com\nbozhong.com\nbozifs.com\nbp1w.com\nbpaykwai.com\nbpec.com\nbpgjuice.net\nbpimg.com\nbpmlt.com\nbpmuseum.com\nbppan.com\nbpqwxsh.com\nbpsemi.com\nbpteach.com\nbpuvuun0xg.com\nbpxxfw.com\nbpxxvo.com\nbpztsxx.com\nbq04.com\nbqb.xyz\nbqbh.org\nbqfy.com\nbqg8.cc\nbqg8.la\nbqg99.cc\nbqgjt.work\nbqgwap.com\nbqgxsw.com\nbqjeep212.com\nbqlcev.com\nbqpoint.com\nbqq8.com\nbqqpx.com\nbqrdh.com\nbqsnn.com\nbqteng.com\nbqu123.com\nbqyhb.com\nbr-cn.com\nbr737.com\nbra-cdche.com\nbrabus-china.com\nbragood.com\nbrain1981.com\nbrainmed.com\nbrainqaf.com\nbrand-isv.com\nbrand24k.com\nbrand4x4.com\nbrandcn.com\nbrandpano.com\nbrandsitejp.com\nbrandvista.com\nbrasaude.com\nbrasilcn.com\nbraveybelief.com\nbravognss.com\nbrazzaleqingdao.com\nbrcpower.com\nbre-line56.com\nbre-linex.com\nbreadtrip.com\nbreathfilm.com\nbreenomeet.cc\nbreeze-chem.com\nbrentron.com\nbrewbeerwiki.org\nbrewersmix.com\nbrg0.com\nbrgame.app\nbrgame.vip\nbrick4.com\nbrickmachinery.net\nbricksball.com\nbricktou.com\nbricsgo.com\nbridge-image.com\nbridgee.net\nbridgelawfirm.com\nbrighost.com\nbright-gene.com\nbright-trend.com\nbright21cn.com\nbrightdairy.com\nbrightdecolighting.com\nbrightfood.com\nbrightliao.com\nbrightmeat.com\nbrilliance-auto.com\nbrilliant-optoelectronics.com\nbringbuys.com\nbringspring.com\nbrire.com\nbritesemi.com\nbrlinked.com\nbrlmed.com\nbrmnq.com\nbrmyx.com\nbroad-ocean.com\nbroad.com\nbroad.org\nbroadair.net\nbroadbio.com\nbroadcom-wuxi.com\nbroadcredit.org\nbroadex-tech.com\nbroadon.net\nbroadskytech.com\nbroadview-auto.com\nbrochef.com\nbronzesoft.com\nbroqiang.com\nbrosmed.com\nbrother-bsh.com\nbrother-cn.net\nbrother-movie.com\nbrotherchem.com\nbrowurl.com\nbrpcb.com\nbrsiee.com\nbrsnzp.com\nbrtbeacon.com\nbrtbeacon.net\nbrtn.org\nbrtpawn.com\nbrttc.com\nbrtv.xyz\nbrtvcloud.com\nbrunoxu.com\nbrxjzp.com\nbrxtal.com\nbryzq.com\nbs-56.com\nbs-dolfin.net\nbs-lab.com\nbs-marathon.com\nbs-yc.com\nbs008.com\nbs2005.com\nbsagit.com\nbsbgjj.com\nbsbkjt.com\nbsbydd.com\nbscabank.com\nbsccdn.com\nbsccdn.net\nbscdns.com\nbscdnweb.com\nbscea.org\nbscedge.com\nbscgslb.com\nbsclink.com\nbscomc.com\nbscsjsn.com\nbscstorage.com\nbscstorage.net\nbsctg.com\nbscxypx.com\nbsd-lifescience.com\nbsd4fz.com\nbsdcdsy.com\nbsdexp.com\nbsdfyyls.com\nbsdongxin.com\nbsdt1688.com\nbsehk.com\nbseqp.com\nbserc.com\nbsgcnc.com\nbsgoal.com\nbsgsgl.com\nbsgslb.com\nbsgz.com\nbsh-safety.com\nbsh-tech.com\nbsh.com\nbshare.com\nbshark.com\nbshdmotor.com\nbshgem.com\nbshmzx.com\nbshsrl.com\nbshu.com\nbsida.com\nbsidu.com\nbsitcn.com\nbsjhlx.com\nbsjyjt.com\nbskrt.com\nbskuav.com\nbslongyin.com\nbsmatrix.com\nbsmjdjzx.com\nbsmy.cc\nbsnljt.com\nbsnniubi.com\nbspapp.com\nbsping.com\nbsquant.com\nbsrczpw.com\nbsrkt.com\nbsrmyy.com\nbsrse.com\nbssfy.com\nbssgnkyy.com\nbst-lab.com\nbstatics.com\nbstbattery.com\nbstchemical.com\nbsteel.net\nbstgjg777.com\nbstinfo.com\nbstj.com\nbstjiaoyu.com\nbstjt.com\nbstzcs.com\nbsurl.cc\nbswtan.com\nbswxw.com\nbsxhly.com\nbsxiaoshuo.com\nbsxldl.com\nbsxyzsdec.com\nbsybx.com\nbsydns.com\nbsydns.net\nbsyjrb.com\nbsyjt.com\nbsyrimw.xyz\nbsyxx.com\nbsyyjt.com\nbsz666.com\nbszhly.com\nbszip.me\nbszxtl.com\nbszyqc.com\nbt-club.com\nbt6.club\nbt66.tv\nbtaxwy.com\nbtb8.com\nbtbat.com\nbtbctex.com\nbtc-precisionmedical.com\nbtc114.com\nbtc38.com\nbtc789.com\nbtcbbs.com\nbtcbca.com\nbtcbtc.tech\nbtcc886.com\nbtccjt.com\nbtcha.com\nbtclass.net\nbtcqingbao.com\nbtcside.com\nbtcwatch.com\nbtcxue.com\nbtd56.com\nbtdad.live\nbtdad17.xyz\nbtdair.com\nbtdog.com\nbtdos.com\nbtdy.com\nbtechina.com\nbtgame.com\nbtgcjs.com\nbtgdt.com\nbtgljt.com\nbtgtravel.com\nbth.vip\nbthhotels.com\nbthlt.com\nbthome.com\nbthuifu.com\nbthxjd.com\nbthyhb.com\nbtiii.com\nbtime.com\nbtjhcc.com\nbtjtfz.com\nbtjy.net\nbtjzgc.com\nbtl-cn.com\nbtltl.com\nbtmayi.cc\nbtmeiju.com\nbtnotes.com\nbtophr.com\nbtorange.com\nbtosolar.com\nbtp-pharm.com\nbtpig.com\nbtplay.net\nbtpxbf.com\nbtrbdf.com\nbtropdi.xyz\nbtsemi.com\nbtshidai.com\nbtspreads.com\nbtsteel.com\nbtten.com\nbttiantang.cc\nbttiantang.com\nbtttg.com\nbttzy.com\nbtv.org\nbtvcd.net\nbtvcloud.com\nbtwater.com\nbtwmw.net\nbtwoa.com\nbtwob.net\nbtxintong.com\nbtydjxc.com\nbtyhkj.com\nbtyijiaxueyuan.com\nbtyou.com\nbtytgj.com\nbtzbjt.com\nbtzgamepkg.com\nbtzhcc.com\nbtzthb.com\nbtzyc.com\nbuaaer.com\nbubaigei.com\nbubalusplus.com\nbubbb.com\nbubugao.com\nbubuko.com\nbubuol.com\nbubuying.net\nbubuyouqian.com\nbubuzheng.com\nbubuzou.com\nbucg.com\nbucg6.com\nbuchang.com\nbuchaq.com\nbuchina.net\nbucid.com\nbuckydrop.com\nbucuo100.com\nbucuoba.com\nbudao.com\nbudao24.com\nbudhano.com\nbudiankj.com\nbudikeji.com\nbuding.tv\nbudingmore.com\nbudingscan.com\nbudiot.com\nbudou.com\nbudui.com\nbueryx.com\nbufan.com\nbuff8.com\nbuffaloex.com\nbuffst.com\nbufpay.com\nbughz.com\nbugjump.net\nbugku.com\nbugnull.com\nbugscan.net\nbugscaner.com\nbugtags.com\nbugu120.com\nbugua.com\nbuguangdeng.com\nbugukj.com\nbugutime.com\nbugxia.com\nbuhuyo.com\nbuickcare.net\nbuidea.com\nbuild-decor.com\nbuild8.com\nbuild9s.io\nbuilddecor.org\nbuildface.com\nbuildhr.com\nbuilding9s.io\nbuildjob.net\nbuildnewapp.com\nbuildwaterexpo.com\nbuka365.com\nbuke999.com\nbukesiyi8.com\nbukeyi.net\nbulaisi.com\nbulaoge.net\nbulapingc.com\nbulbsquare.com\nbulejie.com\nbullads.net\nbullcome.com\nbullmachinery.com\nbullvet.net\nbuluanmai.com\nbululusexdoll.com\nbumenkeji.com\nbumiu.com\nbundor.com\nbundpic.com\nbundsummit.org\nbungba.com\nbunze.com\nburead.com\nburgud.com\nburnelltek.com\nburningvocabulary.com\nburongyi.com\nbus365.com\nbus6e.com\nbus84.com\nbusbaoche.com\nbushangban.com\nbushi123.com\nbusilinq.com\nbusinessconnectchina.com\nbusinesssaga.com\nbusinessweekchina.com\nbusionline.com\nbusituzi.com\nbusnc.com\nbustoprint.com\nbustruckexpo.com\nbut7.com\nbutair.com\nbutao.com\nbutel.com\nbutian.net\nbutiao.com\nbutjx.com\nbutongshe.com\nbutterapis.com\nbutton-nt.com\nbuxia.net\nbuxian8.com\nbuxiuga.com\nbuy-bar.com\nbuy-copi888.com\nbuy-copys888.com\nbuy0596.com\nbuyanshufa.com\nbuyaocha.com\nbuycoor.com\nbuydeem.com\nbuydouke.com\nbuyfine.net\nbuyhot.vip\nbuyi9.com\nbuyiju.com\nbuyjingxi.com\nbuyjk.com\nbuylabel.com\nbuyoudao.com\nbuysun.net\nbuysweet.com\nbuyu1314.com\nbuyueyuyun.com\nbuyun.co\nbuzao.net\nbuzhi.com\nbuzhibushi.com\nbva68.com\nbvcxd.com\nbvfcdn.com\nbvfcdn2.com\nbvgv.com\nbvmc.cc\nbvseo.com\nbw1006.com\nbw30yun.com\nbw40.net\nbw8848.com\nbwae.org\nbwangel.me\nbwave.cc\nbwbeer.com\nbwbot.org\nbwchinese.com\nbwcj.com\nbwcjxt.com\nbwda.net\nbwell-tec.com\nbweyi.com\nbwfapiao.com\nbwfhmall.com\nbwgqwea.com\nbwgrt.com\nbwhero.com\nbwhgsb.com\nbwie.net\nbwin2808.com\nbwjf.com\nbwlc.net\nbwmelon.com\nbwoer.com\nbwokai.com\nbwpx.com\nbwsm.org\nbwsoft.net\nbwtlab.com\nbwton.com\nbwxsj.com\nbwxxw.com\nbwzhcs.com\nbx0byte.com\nbx169.com\nbx1k.com\nbx24k.com\nbxbest.net\nbxcc.vip\nbxd365.com\nbxdaka.com\nbxdbf.com\nbxdlkj.com\nbxfish360.net\nbxgcb.com\nbxgdl.com\nbxgdunhua.com\nbxgkzy.com\nbxgmmw.com\nbxgshengwang.com\nbxgt.com\nbxgycfsb.com\nbxhaibao.com\nbxjob.net\nbxjyxx.net\nbxkejian.com\nbxktv.com\nbxldz.com\nbxltw.com\nbxmd51.com\nbxnfsy.com\nbxnjmj.com\nbxpedia.com\nbxr.im\nbxrfund.com\nbxshscc.xyz\nbxsnews.com\nbxtag.com\nbxwatch.com\nbxwljt.com\nbxwst.com\nbxwx.cc\nbxwx.io\nbxwx.tv\nbxxhtsw.com\nbxxy.com\nbxyuer.com\nbxzc123.com\nbxzczx.com\nbxzhiku.com\nbxzxw.com\nby-health.com\nby-leasing.com\nby56.com\nby6.app\nby6sx.com\nby899.com\nbyai.com\nbybieyang.com\nbybily.com\nbyboai.com\nbybon.com\nbybutter.com\nbyc168.com\nbyclean.net\nbyd.auto\nbyd.com\nbydauto.com\nbydglobal.com\nbydhaiyang.com\nbydit.com\nbydmax.com\nbydoceanauto.com\nbydpcic.com\nbydq.com\nbydsfy.com\nbydyhos.com\nbyefy.com\nbyf.com\nbyfen.com\nbyfen.net\nbyfunds.com\nbygamesdk.com\nbygpu.com\nbygqlsj.xyz\nbyguitar.com\nbygw.net\nbyhao.net\nbyhiv.com\nbyhlds.com\nbyhlds.net\nbyhua.com\nbyi.pw\nbyjd.com\nbykszb.com\nbylw.com\nbylwcc.com\nbylwjc.com\nbymygf.com\nbymz.net\nbynesyy.com\nbynezyy.com\nbynmc.com\nbynonco.com\nbynrnews.com\nbynsyh.com\nbyodonline.com\nbypanghu.xyz\nbypbn.com\nbypos.net\nbyqsc.net\nbyr-navi.com\nbyr.cc\nbyr.wiki\nbyread.com\nbyrhkj.com\nbys120.com\nbysb.net\nbyshf.com\nbyshjg.com\nbyshr.com\nbysocket.com\nbyspharm.com\nbystack.com\nbystatic.com\nbysxfz.com\nbyszc.com\nbytapp.com\nbytcm.com\nbyte-dns.com\nbyte-dns.net\nbyte-edge.com\nbyte-edgeworker.com\nbyte-gslb.com\nbyte-test.com\nbyte-test.net\nbyte-ticket.com\nbyte.online\nbyte00.com\nbyte00.net\nbyte000.com\nbyte008.com\nbyteac.com\nbyteacct.com\nbyteacctimg.com\nbyteactivity.com\nbyteactivity11.com\nbyteactivity12.com\nbyteadverts.com\nbyteapi.com\nbyteapk.com\nbytecdn.com\nbytecdn.net\nbytecdntp.com\nbytecho.net\nbytecimg.com\nbytecloud.com\nbyted-dast.com\nbyted-edu.com\nbyted-static.com\nbyted-ug.com\nbyted.org\nbytedance-boe.net\nbytedance.com\nbytedance.net\nbytedance.org\nbytedanceapi.com\nbytedancehermestest.com\nbytedanceoss.net\nbytedancevod.com\nbytedcdn.com\nbytedeliver.com\nbytedgames.com\nbytedns.com\nbytedns.net\nbytedns1.com\nbytedns2.com\nbytedns3.com\nbytedns4.com\nbytedns5.com\nbytedns6.com\nbytedns7.com\nbytednsdoc.com\nbytedsocial.com\nbyteedu.com\nbyteeffecttos.com\nbytefae.com\nbytefast.net\nbytefcdn.com\nbytefcdnrd.com\nbytegecko.com\nbytegeckoext.com\nbytegle.site\nbytegle.tech\nbytegoofy.com\nbytegrowth.com\nbytegslb.com\nbytehwm.com\nbyteics.com\nbyteics.net\nbyteimg.com\nbyteimgc.com\nbyteinspire.com\nbyteisland.com\nbytelb.net\nbytelb000.net\nbytell.net\nbytemaimg.com\nbytemastatic.com\nbytemedi.com\nbytemelody.com\nbytenew.com\nbytenewst.com\nbyteoc.com\nbyteorg.com\nbyteorge.com\nbyteox.com\nbytepoker.fun\nbyteq8u.net\nbytescm.com\nbytesfield.com\nbytesim.com\nbytesmanager.com\nbytespeech.com\nbytesslb.net\nbytesus.com\nbytesyscdn.com\nbytetcc.com\nbytetech.info\nbytetos.com\nbytetraffic.net\nbytetstatic.com\nbytetstatic.net\nbyteug.com\nbytevalk.com\nbytevcloudvod.com\nbytevdn-boe.com\nbytevdn.com\nbytewars.cc\nbytewebservice.com\nbyteww.com\nbytexns.com\nbytexns.net\nbytexservice.com\nbytezhi.com\nbythealthy.com\nbythewayer.com\nbytianshankd.com\nbyts.com\nbytter.com\nbytzjt.com\nbyvast.com\nbyw.lol\nbyxrmyy.net\nbyxsnzg.com\nbyxtzn.com\nbyxue.com\nbyxx.com\nbyxy.com\nbyyapp.com\nbyyc.net\nbyydkj.net\nbyyfy.net\nbyytfy.com\nbyzhihuo.com\nbyzjbyq.com\nbyzkj.com\nbyzoro.com\nbyzp.com\nbyzsyy.com\nbyzt.net\nbyzxy.com\nbz-e.com\nbz01.com\nbz55.com\nbz889.com\nbzbgr.com\nbzbs.net\nbzbyzk.com\nbzchaxun.com\nbzcjw.com\nbzcm.net\nbzcm88.com\nbzcw8.com\nbzd6688.com\nbzddrive.com\nbzfar.com\nbzfpms.com\nbzfwq.com\nbzfwy.com\nbzfwzs.com\nbzfxb.com\nbzfxw.com\nbzgd.com\nbzglyfjq.com\nbzgwl.com\nbzhou.cc\nbzhslyj.com\nbzjsjt.com\nbzjulihg.com\nbzjw.com\nbzkad.com\nbzko.com\nbzlxzl.com\nbzmfxz.com\nbzmhm.com\nbzname.com\nbzonl.com\nbzqmz.com\nbzrb.net\nbzrqfd.com\nbzsanyuan.com\nbzsb.info\nbzsoso.com\nbzszxyy.com\nbzszyjx.com\nbzszyy.com\nbzszyy123.com\nbzt120.com\nbztdxxl.com\nbzvtc.com\nbzwater.com\nbzwz.com\nbzwzw.com\nbzxinwen.com\nbzxz.net\nbzxzk.net\nbzy.net\nbzy2015.com\nbzzpw.com\nbzzxq.com\nc-119.com\nc-3.moe\nc-abc.site\nc-ame.com\nc-banner.com\nc-c.com\nc-canyin.com\nc-china.com\nc-cpp.com\nc-ctrip.com\nc-discover.com\nc-estbon.com\nc-fehong.com\nc-fol.net\nc-jet.com\nc-lodop.com\nc-markaudio.com\nc-nin.com\nc-ps.net\nc-rst.com\nc-snd.com\nc-sz.com\nc-t.work\nc-thme.com\nc-vcc.com\nc-wms.com\nc-yl.com\nc03b92b501009.beer\nc098d113b11031.beer\nc0c0b511e1009.beer\nc114.net\nc122e63a111031.beer\nc133.com\nc1a8330703dc6f12.com\nc1ass.com\nc1channel.com\nc1el.com\nc1km1.com\nc1km4.com\nc1s.com\nc2427457b16e03ea.com\nc27619fb01019.beer\nc2ax1yu599.com\nc2h4.org\nc360dn.com\nc369a0f0611031.beer\nc3806.com\nc3810.com\nc39cb900df.run\nc3acg.com\nc3b9cd3fb10311.beer\nc3crm.com\nc3pool.org\nc3x.me\nc4006.com\nc4008.com\nc400c.cc\nc402f6df11021.beer\nc4190cb63e65819b.com\nc41b1d28472ea27c.com\nc437dfd45f96b488.com\nc43c3cb111011.beer\nc469f14b911012.beer\nc4752e8a51.vip\nc47cb27580c5de6b.com\nc49.com\nc495f3eb10d6cf13.com\nc4c6c49a6453534d.com\nc4d.com\nc4d.live\nc4datc.com\nc4dcn.com\nc4dco.com\nc4dpro.com\nc4dsky.com\nc4hcdn.com\nc4ys.com\nc4yx.com\nc50forum.com\nc516b5c2510272.beer\nc53c4e56510281.beer\nc54sauo3y85m2g.com\nc558624c4b6f5f42.com\nc578801be1009.beer\nc57e6607c10292.beer\nc57fbfc585.skin\nc5a13eec21010.beer\nc5a7e584ed460dcd.com\nc5b27c7c01019.beer\nc5b3c3db298ea985.com\nc5b6bpoq7q.world\nc5bf2b35337761f4.com\nc5game.com\nc5iot.com\nc6133f7f98120d7f.com\nc631dlc0br.com\nc658e6a643fe3a95.com\nc659e27c366ae634.com\nc6a0cbdfa0be06e6.com\nc6bad2ad01020.beer\nc6c.com\nc6n708.ren\nc7.net\nc7032.com\nc705e5bdb71ae01d.com\nc7197.com\nc7200.com\nc7233.com\nc73567b858ce4908.com\nc7526.com\nc77200.com\nc77c.com\nc7878.com\nc7bc68c2811032.beer\nc7c1jx3ikk.bar\nc7c8.com\nc7fffvip16.com\nc7fffvip29.com\nc7g.com\nc7games.org\nc7vvv.com\nc7y.com\nc835249c31017.beer\nc837c4e951009.beer\nc8571e9ad7689b0a.com\nc88a8ae86f58a489.com\nc8a8b0af81014.beer\nc8f8537d91013.beer\nc9018.com\nc919.sbs\nc944748d38bcc258.com\nc953b5d8b1013.beer\nc969.com\nc9b5b03e0ef62dc0.com\nc9c855b3da9b3b66.com\nc9d1d314b98f8fe3.com\nc9e8e19a411012.beer\nc9ec9c2f0c2de043.com\nc9o8nlanfm.work\nca-aicc.com\nca-sme.org\nca-smefs.com\nca-tencentclb.cloud\nca-tencentclb.com\nca-tencentclb.net\nca-tencentclb.work\nca001.com\nca002.com\nca003.com\nca0d7b2da10271.beer\nca163.net\nca168.com\nca2e9ea18bedfdf2.com\nca315.com\nca39.com\nca5d4ce601013.beer\nca800.com\nca91a5eb7ed4495e.com\nca9ce6rv872ce1.com\ncaa830d2710251.beer\ncaa86.org\ncaaa-spacechina.com\ncaaad.com\ncaacbook.com\ncaacchina.org\ncaacsri.com\ncaagei.com\ncaagov.com\ncaakee.com\ncaaladi.com\ncaanb.com\ncaapa.org\ncaasai.com\ncaasbuy.com\ncaasse.com\ncaayee.com\ncab346ef31016.beer\ncabbagebox.com\ncabbeen.com\ncabc-online.com\ncabee.org\ncabhr.com\ncabinetbuy.com\ncableabc.com\ncabletiegun.com\ncabling-system.com\ncabplink.com\ncabr-fire.com\ncac-citc.com\ncac2667b8c265fb8.com\ncacakp.com\ncacc-sf.org\ncacfo.com\ncacfo.net\ncache4ever.com\ncache666.com\ncachekit.com\ncachemoment.com\ncachiyeung.com\ncackui.com\ncacpp.com\ncacre.org\ncacs-summit.com\ncacsec.com\ncacter.com\ncactiapi.com\ncactifans.com\ncactmc.com\ncad1688.com\ncad2688.com\ncad5.com\ncad8.net\ncad888.com\ncada.cc\ncaddcc.com\ncadenzayueqi.com\ncadforex.com\ncadict.net\ncadmon.net\ncadreg.com\ncadrolift.com\ncadzhuan.com\ncadzj.com\ncadzxw.com\ncaecc.com\ncaeda-cxrh.com\ncaeef787f1694f47.com\ncaeerr.com\ncaeete.net\ncaefa.org\ncaein.com\ncaeri-te.com\ncaes.store\ncaexpo.com\ncaexpo.org\ncafachine.com\ncafagame.com\ncafamuseum.org\ncaffci.org\ncagentle.com\ncagetest.com\ncageystone.com\ncagoe.com\ncahkms.org\ncai-ba.com\ncai110.com\ncai58t.com\ncai88.com\ncaiacn.com\ncaiair.com\ncaian.net\ncaibangzi.com\ncaibaojian.com\ncaibaopay.com\ncaibaotao.com\ncaibeike.com\ncaibihui.com\ncaibowen.net\ncaicao.net\ncaidan2.com\ncaidao1.com\ncaidao8.com\ncaidaocloud.com\ncaidian.com\ncaidian365.com\ncaidianqu.com\ncaiens.com\ncaifei.net\ncaifengprinting.com\ncaifu.com\ncaifu500.net\ncaifupai.com\ncaifuxingketang.com\ncaifuxingmingxue.com\ncaifuzhongwen.com\ncaigaowang.com\ncaigeqiu.vip\ncaigou2003.com\ncaigou365.com\ncaigoubao.cc\ncaiguayun.com\ncaiguu.com\ncaih.com\ncaihanlin.com\ncaihcloud.com\ncaihcom.com\ncaihdata.com\ncaiheht.com\ncaihong.com\ncaihong5g.com\ncaihong8888.com\ncaihongbashi.net\ncaihongche.com\ncaihongduoduo.com\ncaihongjia.com\ncaihongjianzhan.com\ncaihongmeng.com\ncaihongqi.com\ncaihongsheying.com\ncaihongto.com\ncaihongx.com\ncaihoo.com\ncaihuapak.com\ncaihuicloud.com\ncaihuoxia.com\ncaiips.com\ncaij100.com\ncaijing365.com\ncaijingche.com\ncaijingmobile.com\ncaijingnews.net\ncaijingwu.com\ncaijinyuan.com\ncaijiruanjian.com\ncaijj.com\ncaike.com\ncaiku.cc\ncaiku.com\ncaikuai91.com\ncaikuaitoutiao.com\ncaikuo.com\ncailele.com\ncailianpress.com\ncailiao.com\ncailiaoniu.com\ncailiaoren.com\ncailutong.com\ncaimaiba.com\ncaimei365.com\ncaimitech.com\ncaimogu.cc\ncaimogu.net\ncaimomo.com\ncainachina.com\ncaing.com\ncainiao-inc.com\ncainiao-inc.net\ncainiao.com\ncainiaobaoka.com\ncainiaocc.com\ncainiaojc.com\ncainiaojiaocheng.com\ncainiaoxueyuan.com\ncainiaoya.com\ncainiaoyizhan.com\ncainongnet.com\ncainuan365.com\ncaipiaogu.com\ncaipintu.com\ncaipopo.com\ncaipucaipu.com\ncaiqizhe.com\ncairenhui.com\ncairongquan.com\ncairot.com\ncairuijun.com\ncaisan.io\ncaishen.ai\ncaishenpo.com\ncaishenyy.com\ncaishuiedu.com\ncaisixiang.com\ncaistc.com\ncaistv.com\ncait.com\ncait1981.com\ncaitaimg2.com\ncaitaw.com\ncaitun.com\ncaituyou.com\ncaiu8.com\ncaiwan.com\ncaiweiming.com\ncaiwennews.com\ncaiwu51.com\ncaiwuchina.com\ncaixadirectaanalisar.com\ncaixin.com\ncaixinfoundation.org\ncaixinmedia.com\ncaixinonline.com\ncaiyeml.pw\ncaiyicloud.com\ncaiyiduo.com\ncaiyu.com\ncaiyuemedical.com\ncaiyun.com\ncaiyunai.com\ncaiyunapp.com\ncaiyuncdn.com\ncaiyunhub.com\ncaiyunyi.com\ncaizhaowang.com\ncaizhihr.com\ncaj11.com\ncake400.com\ncake6.com\ncalatopia.com\ncalawei.com\ncalb-tech.com\ncalccn.com\ncaldigit.net\ncaledoniancable.com\ncalendar520.com\ncalgoncarbon-china.com\ncali-light.com\ncali999.net\ncallbei.com\ncallcenter88.com\ncallergen.com\ncallmekeji.com\ncallmysoft.com\ncallrui.com\ncaloinfo.com\ncalorietech.com\ncalt.com\ncalterah.com\ncalvinneo.com\ncamartsphotography.com\ncambm.com\ncambodiafang.com\ncambricon.com\ncamc.cc\ncamcap.us\ncamcard.com\ncamce-rc.com\ncamdihg.com\ncame-online.org\ncamera360.com\ncameraunion.net\ncamhen.com\ncamilliar.com\ncamir.org\ncamnpr.com\ncamoryapps.com\ncampanilechina.com\ncampari1987.com\ncampbicycle.com\ncampgreenbox.com\ncampingcn.com\ncampiu.com\ncampus-app.net\ncampuschina.org\ncampushoy.com\ncampusphere.net\ncampusplus.com\ncamscanner.com\ncamsnetec.com\ncamyu.net\ncan-dao.com\ncan-gas.com\ncan-lead.com\ncan.tv\ncana.space\ncanaan-creative.com\ncanaanmt.com\ncanadaae.net\ncanalmuseum.net\ncanasy.com\ncanature.com\ncanbaojin.com\ncancda.net\ncancer361.com\ncandiabiotech.com\ncandou.com\ncandybook.com\ncandyhaw.com\ncandylab.net\ncandypay.com\ncandystars.net\ncanet.com\ncanevent.com\ncanfire.net\ncang-jia.net\ncang.com\ncangdu.org\ncangfengzhe.com\ncanghaiip.com\ncanghaimachine.com\ncanglanghospital.com\ncangmang.xyz\ncangoonline.com\ncangowin.com\ncangpie.com\ncangqiang.com\ncangqiongkanshu.com\ncangshui.net\ncangshutun.com\ncangxiaoer.com\ncangxitianli.com\ncangya.com\ncangzhouhd.com\ncanhighcenter.com\ncanhot.net\ncaniculab.com\ncanidc.com\ncanjio.com\ncankao100.com\ncankaoshouce.com\ncankaoxiaoxi.com\ncankaoxx.com\ncanlanjy.com\ncannelton.org\ncanonpumps.com\ncanpdu.com\ncanpoint.net\ncanpopo.com\ncanrill.com\ncansee.net\ncansemitech.com\ncansine.com\ncantoge.com\ncantonbio.com\ncantonde.com\ncantonfairad.com\ncantontower.com\ncanvcan.com\ncanway.net\ncanwayit.com\ncanwaysoft.com\ncanxingmedia.com\ncanyin.cc\ncanyin.com\ncanyin168.com\ncanyin2017.com\ncanyin375.com\ncanyin88.com\ncanyincha.com\ncanyinzixun.com\ncanyouchina.com\ncanyousoftware.com\ncanyuanzs.com\ncaoanhospital.com\ncaobao.com\ncaocaobusiness.cc\ncaocaocustomer.cc\ncaocaoglobal.com\ncaocaojourney.cc\ncaocaokeji.net\ncaocaomarketing.cc\ncaocaomedia.cc\ncaocaoproduct.cc\ncaocaopromotion.cc\ncaocaoservice.cc\ncaocaosx.com\ncaocaotravel.cc\ncaocaotrip.cc\ncaocaotrip.com\ncaochai.com\ncaochai.net\ncaochen.net\ncaogen.com\ncaogenb2b.com\ncaogong.org\ncaohai.com\ncaohaifeng.com\ncaohejing.com\ncaohua.com\ncaoke.net\ncaoliao.net\ncaomall.net\ncaomei.wiki\ncaomeipai.com\ncaomeishuma.com\ncaomeixz7.xyz\ncaoniang.com\ncaonimazuzong.com\ncaonmp.com\ncaos-china.org\ncaoshiyabo.com\ncaotama.com\ncaotianmiao.com\ncaotu66.com\ncaovan.com\ncaoxianfc.com\ncaoxie.com\ncaoxudong.info\ncaoyudong.com\ncapablist.com\ncapatue.com\ncapellahotelsanya.com\ncapitalcloud.net\ncapitaleco-pro.com\ncapitalip.org\ncapitalonline.net\ncapitaltoday.com\ncapjfx.club\ncapjoy.com\ncappdr.org\ncaps-china.org\ncapsuleshanghai.com\ncaptain-cro.com\ncapturetheflag.fun\ncapvision.com\ncapwhale.com\ncaqzlsgs.com\ncar-metaverse.com\ncar0575.com\ncar2sharechina.com\ncar369.com\ncar388.com\ncarapk.com\ncarben.me\ncarbinpower.com\ncarbonbiking.com\ncarbononegroup.com\ncarbonscn.com\ncarbonxprogram.com\ncarcav.com\ncarcdn.com\ncardaudio.com\ncardbaobao.com\ncardcmb.com\ncardcn.com\ncardinfolink.com\ncardlan.com\ncardlogroup.com\ncardniu.com\ncardniudai.com\ncardplus.work\ncardqu.com\ncardyang.com\ncare-challenge.com\ncare110.com\ncaredear.com\ncareduka.com\ncareerchina.com\ncareerexe.com\ncareerintlinc.com\ncareerqihang.com\ncareersky.org\ncarefiber.work\ncareked.com\ncarelifefood.com\ncarellicpa.com\ncarertec.com\ncareuc.com\ncarezb.com\ncargai.com\ncargeer.com\ncargo001.com\ncargodiscovery.com\ncargofee.com\ncargosmart.com\ncaribgalaxy.com\ncarimg.com\ncarisen.com\ncarivisa.com\ncarking001.com\ncarlinkin.com\ncarmov.com\ncarmucn.com\ncarnegiebj.com\ncarnoc.com\ncarodpiano.com\ncarp56.com\ncarpoly.com\ncarrotchou.blog\ncarrotchou.com\ncars001.com\ncarschina.com\ncarsmp3.com\ncart-med.com\ncartaocontinente-ptssta.cfd\ncartech8.com\ncartersda.com\ncarthane.com\ncartimen.com\ncartoonwin.com\ncartx.cloud\ncarutoo.com\ncarxinwen.com\ncarxoo.com\ncaryoud.com\ncarzd.com\ncarzenplus.com\ncarzone365.com\ncarzyuncle.com\ncas01.com\ncasarocinante.com\ncasarte.com\ncasbin.com\ncasbin.org\ncasboc.com\ncascadepharm.com\ncasctcp.com\ncasdoor.com\ncasdoor.org\ncase-platformhealth.com\ncase91.com\ncasear.net\ncasece.org\ncaseinnoo.com\ncasemic.com\ncashbackok.com\ncashbus.com\ncashcatads.com\ncashtoutiao.com\ncashwaytech.com\ncasia.com\ncasibase.com\ncasic-addsino.com\ncasic-t.com\ncasic.com\ncasic304.com\ncasic3s.com\ncasicloud.com\ncasicyber.com\ncasis.work\ncasjob.com\ncaslease.com\ncasmeit.com\ncasmita.com\ncasmn.com\ncasnb.com\ncasp.hk\ncaspte.com\ncasqy.com\ncasszzy.com\ncastbd.com\ncastelu.com\ncastiron-bathtub.com\ncastlepeakhospital.moe\ncastyum.com\ncasvino.com\ncasvisor.com\ncasvm.com\ncasystar.com\ncasyueda.com\ncat-cn.com\ncat898.com\ncatalike.com\ncatalyst-loading.com\ncatcat321.com\ncatchingdoll.com\ncatchyrime.com\ncatering-shizuoka.com\ncatfish-cms.com\ncatguo.com\ncathassist.org\ncathayagroup.com\ncatia-china.com\ncatic-dde.com\ncaticgz.com\ncaticol.com\ncatjc.com\ncatl.com\ncato-chem.com\ncato-travel.com\ncatofes.com\ncattsoft.com\ncattsp.com\ncatugbio.com\ncatv.net\ncatv114.com\ncatweiqi.com\ncatyun.cc\ncaua1988.com\ncaua99.com\ncaup.net\ncaupd.com\ncaupdbj.com\ncauvet.com\ncav-ad.com\ncavca.org\ncawae.net\ncaxa.com\ncaxx.net\ncayzlh.com\ncazpw.com\ncazx.net\ncb-h.com\ncb07fef6ccb66c8e.com\ncb6037f1b10261.beer\ncb8888.shop\ncb8a5dff61011.beer\ncb8e405b81014.beer\ncbaleague.com\ncbbn.net\ncbc32120f1014.beer\ncbca.net\ncbcechina.com\ncbcgroup.net\ncbcie.com\ncbcloud123.com\ncbcsnote.com\ncbcuri.com\ncbd-china.com\ncbd0512.com\ncbd263.com\ncbdcn.com\ncbdd9912fb913294.com\ncbdio.com\ncbdstest.download.prss.microsoft.com\ncbdz13.com\ncbe21.com\ncbea.com\ncbec365.com\ncbecok.com\ncbecx.com\ncbeeexpo.com\ncbes21.com\ncbex.com\ncbf92cea38c259ee.com\ncbfau.com\ncbgcloud.com\ncbhb.biz\ncbi360.net\ncbiachina.com\ncbiao.com\ncbice.com\ncbiec.com\ncbiec.net\ncbigame.com\ncbinews.com\ncbismb.com\ncbitft.com\ncbivisa.com\ncbj1998.com\ncbjq.com\ncbjuice.com\ncbjy520.com\ncbjzw.org\ncbmexpo.com\ncbmf.org\ncbminfo.com\ncbmsci.com\ncbmwz.net\ncbn.me\ncbndata.com\ncbndata.org\ncbnri.org\ncbnweek.com\ncboad.com\ncbquan.com\ncbsbearing.com\ncbsrc.com\ncbtgc.com\ncbtimer.com\ncburi.com\ncbvac.com\ncbvvt.com\ncbvx8.com\ncbxs.net\ncby.me\ncbzr.com\ncc-airshow.com\ncc-honor.com\ncc-image.com\ncc-pharming.com\ncc-q.com\ncc-uavia.com\ncc.cd\ncc.co\ncc06040d408f65b1.com\ncc0808.com\ncc11bh.com\ncc1588.com\ncc55k.com\ncc707.com\ncc7m.com\ncc8.cc\ncc86.com\ncc89aba4a2ccad27.com\ncca135.com\nccabchina.com\nccai.cc\nccall.cc\nccamc.co\nccaon.com\nccapbook.com\nccapedu.com\nccartd.com\nccarting.com\nccasn.com\nccasy.com\nccatcloud.com\nccatnet.com\nccawz.com\nccb.com\nccbb6be551024.beer\nccbcos.com\nccbec-shenzhen.com\nccbecexpo.com\nccbflift.com\nccbft.com\nccbfund.com\nccbfutures.com\nccbhome.net\nccbiam.com\nccbleasing.com\nccbnd.com\nccbookfair.com\nccbpcn.com\nccbpension.com\nccbride.com\nccbxt.com\nccc-ch.com\nccc-chn.com\ncccamtop.com\ncccbs.net\ncccc-capital.com\ncccc-sdc.com\ncccc-sjer.com\ncccc58.com\ncccc8cccccc.cc\nccccccccccc.cc\ncccccd.com\ncccclc-gd.com\ncccclc.com\nccccoe.cc\nccccoe.com\nccccsg.com\ncccdun.com\ncccdzxw.com\ncccf-cloud.com\ncccitu.com\ncccity.cc\ncccking.com\nccckq.com\ncccm-em120.com\ncccmat.com\ncccmii.com\ncccmtf.com\ncccnec.com\ncccovvv.com\ncccpan.com\ncccppp.com\ncccsql.com\nccctspm.org\ncccwaf.com\ncccyun.cc\nccd86.com\nccddb877c1024.beer\nccdma.org\nccdol.com\ncce-china.com\ncce0bd02011032.beer\nccea.pro\ncceato.com\nccebbs.com\nccedia.com\nccedisp.com\nccedpw.com\nccedtu.com\nccee.com\ncceea.net\ncceep.com\nccement.com\nccen.net\nccepc.com\ncces2006.org\nccesda.com\nccets.com\nccfddl.com\nccfeb.com\nccflow.org\nccfourth.com\nccfta.com\nccgaa.com\nccgdc.com\nccgff.com\nccgfie.com\nccggd.com\nccgim.com\nccgjbus.com\nccgogogo.com\nccgoyi.com\nccgs120.net\nccgslb.com\nccgslb.net\nccgxk.com\ncchaosheng.com\ncchc-hyd.com\ncchccc.com\ncchcch.com\ncchengr.com\ncchezhan.com\ncchfound.org\ncchlgame.com\ncchorse.com\ncchorse.net\ncchoubo.com\ncchpu.com\ncci-intervention.com\nccia-cleaning.org\nccia.xin\ncciaiot.org\ncciatv.com\nccic-8.com\nccic-auto.com\nccic-lab.com\nccic-set.com\nccic.com\nccic2.com\ncciccloud.com\nccice.com\nccicgd.com\nccicgx.com\nccicsd.com\nccidcom.com\nccidconsulting.com\ncciddata.com\ncciddesign.com\nccidedu.com\nccidexpo.com\nccidgroup.com\nccidnet.com\nccidreport.com\nccidsmart.com\nccidthinktank.com\nccidwise.com\ncciea.com\nccieh3c.com\nccifc.org\nccig.com\nccigchina.com\nccinchina.com\nccip.ren\nccipp.org\nccirm.org\nccit360.com\nccita.net\nccitimes.com\nccitu.com\ncciup.com\nccj88.com\nccjec.com\nccjhdljs.com\nccjkncdc.com\nccjkwjjedu.com\nccjoo.com\nccjoy.com\nccjoyland.com\nccjs120.com\nccjt.com\nccjxcn.com\nccjytv.com\nccjzzj.com\ncckefu1.com\ncckefu3.com\ncckggroup.com\nccknbc.cc\ncckyedu.com\ncclawer.com\ncclawnet.com\ncclbook.com\ncclcn.com\nccle5.com\nccler.com\ncclexpo.com\ncclgpx.com\ncclimg.com\ncclinux.org\ncclndx.com\ncclolcc.com\ncclqme.xyz\nccluster.net\ncclyun.com\nccm-1.com\nccm-hardware.com\nccm99.com\nccmama.com\nccmcgc.com\nccmdl.adobe.com\nccmdls.adobe.com\nccme.cc\nccmfcm.com\nccmicroera.com\nccmn.net\nccmodel.com\nccmw.net\nccn.ren\nccn360.com\nccnbdh.com\nccnee.com\nccnew.com\nccngx.com\nccnovel.com\nccnovo.com\nccnpic.com\nccnt.com\nccoalnews.com\nccoaonline.com\nccoco.vip\nccode.cc\nccoi.ren\ncconn.cc\nccoop.net\nccoopg.com\nccops.net\nccopyright.com\nccostm.com\nccotcm.com\nccoymc.com\nccp3060.com\nccpaie.com\nccpc.io\nccpc360.com\nccpgssd.com\nccpit-academy.org\nccpit-sichuan.org\nccpit-sx.org\nccpit-tga.org\nccpit.org\nccpitbj.org\nccpitbm.org\nccpitbuild.org\nccpitcft.com\nccpitcq.org\nccpitecc.com\nccpitfujian.org\nccpitgs.com\nccpitgx.org\nccpithebei.com\nccpithn.org\nccpitjinan.org\nccpitjs.org\nccpitlight.org\nccpitln.org\nccpitnb.org\nccpitsd.com\nccpittex.com\nccpittj.org\nccpitxiamen.org\nccpitxian.org\nccplay.cc\nccplay.com\nccpnt.org\nccpod.com\nccprec.com\nccproxy.com\nccps56.com\nccqctg.com\nccqf.com\nccqg.com\nccqtgb.com\nccqtm.com\nccqyj.com\nccrate.cc\nccrc.com\nccrfmed.com\nccrgt.com\nccrici.com\nccrjk.com\nccrjkf.com\nccrjw.com\nccsacacasfdghh.com\nccschangsha.com\nccscrbyy.com\nccsedqrmyy.com\nccsfuchan.com\nccskqyy.com\nccsngqyy.com\nccsnpower.com\nccsp365.com\nccssmm.com\nccst.cc\nccsuu.com\nccswuhan.com\nccsx.net\nccsxlyy.com\ncct-g.com\ncct-lab.com\ncct365.net\ncctalent.com\ncctalk.com\ncctalk.net\ncctash.com\ncctaw.com\ncctbn.com\ncctc.cc\ncctcce.com\ncctcct.com\ncctcdn.com\ncctek.com\ncctg.cc\ncctheze.com\ncctime.com\ncction.com\ncctlife.com\ncctmt.com\ncctocloud.com\ncctpgm.com\ncctpress.com\ncctry.com\ncctsz.com\ncctu.org\ncctv-19.com\ncctv-caijing.com\ncctv-peiyin.com\ncctv-star.com\ncctv.com\ncctv0002.com\ncctv13cctv13.com\ncctv18.com\ncctv4g.com\ncctv5bo.com\ncctvcdn.net\ncctvcj.com\ncctvctpc.com\ncctvdyt.com\ncctvfendou.com\ncctvfinance.com\ncctvjingji.com\ncctvmall.com\ncctvpic.com\ncctvplus.com\ncctvsdyxl.com\ncctvse.net\ncctvweishi.com\ncctvxftx365.com\ncctw.cc\ncctypx.com\ncctzz.net\nccughc.net\nccunf.com\nccutchi.com\nccv160.com\nccv168.com\nccview.net\nccvui.com\nccwcw.com\nccwcyw.com\nccwifi.cc\nccwl.net\nccwonline.com\nccwonline.net\nccwork.com\nccwow.cc\nccwqtv.com\nccwto.net\nccxcn.com\nccxcredit.com\nccxhfk.com\nccybeta.cc\nccydkj.com\nccygmy.com\nccyia.com\nccynice.com\nccyts.com\nccyunmai.com\nccyyxx.com\ncczel.com\ncczjyy.com\ncczk.com\ncczkdmkj.com\ncczq.com\ncczq.net\ncczxyjhyy.com\ncd-cxh.com\ncd-estt.com\ncd-hk.net\ncd-hss.com\ncd-kc.com\ncd-motorshow.com\ncd-ox.com\ncd-pa.com\ncd-psychologist.com\ncd-rail.com\ncd-sd.com\ncd-tencentclb.cloud\ncd-tencentclb.com\ncd-tencentclb.net\ncd-tencentclb.work\ncd-web.org\ncd-wx.com\ncd-wx.net\ncd-zc.com\ncd00c44f211031.beer\ncd120.com\ncd12371.com\ncd1958.com\ncd20.net\ncd2120.com\ncd23f.com\ncd3120.com\ncd365689f11012.beer\ncd37wan.com\ncd3hospital.com\ncd42195.com\ncd58.com\ncd6.com\ncd658ad6a610b9a5.com\ncd7a871ab11011.beer\ncd7yy.com\ncdabon.com\ncdacz.com\ncdadata.com\ncdadsj.com\ncdairport.com\ncdajcx.com\ncdajzp.com\ncdamdi.com\ncdanet.org\ncdangel.com\ncdapex.com\ncdaten.com\ncdb-leasing.com\ncdbaidu.com\ncdbdsec.com\ncdbfb.net\ncdbokon.com\ncdborz.com\ncdbsdyk.com\ncdbsfund.com\ncdc80b3514292771.com\ncdcbj.com\ncdcbn.com\ncdcc.ink\ncdccic.com\ncdccpit.org\ncdcea.org\ncdcgames.net\ncdchjyy.com\ncdchuandong.com\ncdcitypark.com\ncdcoslm.com\ncdcxhl.com\ncdcyts.com\ncddayun.com\ncddc56.com\ncddengji.com\ncddgg.com\ncddgg.net\ncddjip.com\ncddlhx.com\ncddlkj.net\ncddq120.com\ncddscj.com\ncddsgk.com\ncde-os.com\ncdea4d2cb10261.beer\ncdeaa.com\ncded23c0b11011.beer\ncdedu.com\ncdeledu.com\ncdenvironment.com\ncdfanmu.com\ncdfcjg.com\ncdfcn.com\ncdfeimi.com\ncdfer.com\ncdfgsanya.com\ncdfgt.com\ncdfhnmall.com\ncdfhnms.com\ncdfinger.com\ncdfmembers.com\ncdfortis.com\ncdfsunrise.com\ncdfuwuqi.com\ncdgas.com\ncdgdad.com\ncdgdp.com\ncdggq.com\ncdggzy.com\ncdgjbus.com\ncdgmgd.com\ncdgoufang.com\ncdgowell.com\ncdgql.com\ncdgrf.com\ncdgtw.net\ncdgxfz.com\ncdgxq.com\ncdgxsyzx.com\ncdgxxy.net\ncdh3c.com\ncdhaiguang.com\ncdhfund.com\ncdhglsc.com\ncdhgr.com\ncdhjsw.com\ncdhke.com\ncdhkxy.com\ncdhld.com\ncdhr.net\ncdhrsip.org\ncdhsgb.com\ncdhtgroup.com\ncdhtgs.com\ncdhtrq.com\ncdhuaying.com\ncdhxdq.com\ncdii-leasing.com\ncdirs.com\ncditv.tv\ncdjcow.com\ncdjfwy.com\ncdjhqczl.com\ncdjiaoan.com\ncdjingfeng.com\ncdjituan.com\ncdjnrc.com\ncdjsjlxh.com\ncdjsjx.com\ncdjtzhtc.com\ncdjxjy.com\ncdjzso.com\ncdjzw.com\ncdjzzg.com\ncdkeynogap.com\ncdkf.com\ncdkjbg.com\ncdkjw.org\ncdks.run\ncdkyfc.com\ncdlaobing.com\ncdlbmy.com\ncdlbyl.com\ncdlchd.com\ncdlgp.com\ncdliangwang.com\ncdlingsou.com\ncdlsym.com\ncdlvbao.com\ncdlxqn.com\ncdmcaac.com\ncdmddyf.com\ncdmfund.org\ncdmgiml.com\ncdmhwh.com\ncdmjwater.com\ncdms-china.com\ncdn-build.com\ncdn-build.net\ncdn-cba.com\ncdn-cdn.net\ncdn-dodo.com\ncdn-gw-dv.net\ncdn-gw-dv.vip\ncdn-hotels.com\ncdn-speed.com\ncdn-static.farfetch-contents.com\ncdn-uc.cc\ncdn-v.com\ncdn.fun\ncdn.ist\ncdn.jetbrains.com\ncdn.samsung.com\ncdn.shanghai.nyu.edu\ncdn.show\ncdn.vin\ncdn000.com\ncdn08.com\ncdn1.vip\ncdn1008.com\ncdn1218.com\ncdn16.com\ncdn20.com\ncdn20.info\ncdn20.org\ncdn2000.com\ncdn2020.com\ncdn30.com\ncdn30.info\ncdn30.org\ncdn3344.com\ncdn35.com\ncdn365gnlc.vip\ncdn365lc.vip\ncdn40.com\ncdn56.com\ncdn86.com\ncdn86.net\ncdn90.com\ncdn90.net\ncdn90.org\ncdn99.com\ncdnb.net\ncdnbbb.net\ncdnbuild.com\ncdnbuild.net\ncdnbye.com\ncdnc.org\ncdncache.com\ncdncache.net\ncdncdncdn.com\ncdncenter.com\ncdncg.com\ncdnchatgpt.com\ncdnchushou.com\ncdncl.net\ncdnclouds.net\ncdncode.com\ncdnczydwl.com\ncdnddd.com\ncdnddd.net\ncdndm.com\ncdndm5.com\ncdndm5.net\ncdndns.vip\ncdndns1.com\ncdndns2.com\ncdndo.com\ncdndoctor.com\ncdndu.com\ncdnet110.com\ncdnetdns.net\ncdnetworks.net\ncdnexus.com\ncdnf.cc\ncdngia.com\ncdngot.com\ncdngslb.com\ncdngslb8.com\ncdngtm.com\ncdnhhh.net\ncdnhub.net\ncdnhwc1.com\ncdnhwc10.com\ncdnhwc2.com\ncdnhwc3.com\ncdnhwc4.com\ncdnhwc5.com\ncdnhwc6.com\ncdnhwc8.com\ncdnhwc9.com\ncdnhwcajk17.com\ncdnhwcatq08.com\ncdnhwcbni108.com\ncdnhwcbqs106.com\ncdnhwcbzj102.com\ncdnhwcchh18.com\ncdnhwccmz121.com\ncdnhwcedi10.com\ncdnhwcedt124.com\ncdnhwcggk22.com\ncdnhwcgnc118.com\ncdnhwcgqa21.com\ncdnhwchcg02.com\ncdnhwcibv122.com\ncdnhwcjlg112.com\ncdnhwcjog12.com\ncdnhwcjsb120.com\ncdnhwckfz116.com\ncdnhwckon103.com\ncdnhwcljk104.com\ncdnhwcllh11.com\ncdnhwclxu105.com\ncdnhwclxw05.com\ncdnhwcoem01.com\ncdnhwcohm19.com\ncdnhwcoph123.com\ncdnhwcprh113.com\ncdnhwcpsd13.com\ncdnhwcqgw115.com\ncdnhwcqir15.com\ncdnhwcqve117.com\ncdnhwcqwg14.com\ncdnhwctnm107.com\ncdnhwctxz24.com\ncdnhwcuim119.com\ncdnhwcupf06.com\ncdnhwcurq03.com\ncdnhwcvix16.com\ncdnhwcxcy07.com\ncdnhwczba04.com\ncdnhwczjt20.com\ncdnhwczmn114.com\ncdnhwczth23.com\ncdnhwcztu09.com\ncdnhwczxh101.com\ncdnidc.net\ncdnjs8888.com\ncdnjson.com\ncdnjtzy.com\ncdnkxy.com\ncdnle.com\ncdnle.net\ncdnlinkcloud.com\ncdnlinking.com\ncdnmama.com\ncdnmaster.com\ncdnmg.com\ncdnnx.com\ncdnok.com\ncdnoutcheck.com\ncdnpe.com\ncdnqttdispatcher01.com\ncdnrl.com\ncdnsvc.com\ncdntip.com\ncdntipbak.com\ncdntips.com\ncdntips.net\ncdntxt.com\ncdnudns.com\ncdnunion.com\ncdnvp.com\ncdnvpn.net\ncdnvue.com\ncdnwaf.net\ncdnxcrpl.vip\ncdnyoyun.com\ncdnyt69.com\ncdnyyds999.com\ncdoers.com\ncdpgroupltd.com\ncdqcnt.com\ncdqcp.com\ncdqcw.net\ncdqcxy.com\ncdqczx.com\ncdqmw.net\ncdqph.com\ncdqsng.com\ncdqss.com\ncdqszz.com\ncdqzcz.com\ncdrbs.net\ncdrcb.com\ncdren.net\ncdrich.com\ncdrjob.com\ncdronghai.com\ncdrqxh.com\ncdrsigc.com\ncdrtvu.com\ncdruzhu.com\ncds-seal.com\ncdsb.com\ncdsb.mobi\ncdscdscdn.com\ncdsenfa.com\ncdsgsz.com\ncdshangceng.com\ncdshishi.net\ncdshx.com\ncdsixun.com\ncdsjjy.com\ncdsjtech.com\ncdskdxyy.com\ncdsledu.net\ncdslsxh.com\ncdslsxh.org\ncdsme.com\ncdsns.com\ncdsnzx.com\ncdspace.net\ncdsslz.net\ncdsuns.com\ncdswjs.com\ncdswx.net\ncdsxdd.com\ncdsxlc.com\ncdt-ec.com\ncdt-md.com\ncdt-re.com\ncdtcxh.org\ncdtianda.com\ncdtkdw.com\ncdtlev.com\ncdtlxx.net\ncdtnrq.com\ncdtszn.net\ncdtyxx999.com\ncdtz.net\ncdu.cc\ncduncname.com\ncdvcloud.com\ncdvisor.com\ncdwulian.com\ncdxdyy.com\ncdxrdz.com\ncdxsxbx.com\ncdxw.net\ncdxwcx.com\ncdxwxy.com\ncdxydb.com\ncdydlx.com\ncdyee.com\ncdyestar.com\ncdyfy.com\ncdygdq.com\ncdyj56.com\ncdylzx.net\ncdynt.com\ncdyouhui.com\ncdyrjygs.com\ncdysxx.com\ncdysxy.com\ncdyushun.com\ncdyywz.com\ncdyzhotel.com\ncdzdgw.com\ncdzgh.com\ncdzgzs.com\ncdzhuoyu.com\ncdzimo.com\ncdzixun.net\ncdzjryb.com\ncdzk.com\ncdzk.net\ncdzk.org\ncdzls.net\ncdzongtian.com\ncdzp8.com\ncdzrjdgc.com\ncdzs.org\ncdzuche.com\ncdzvan.com\ncdzxy.com\ncdzzhn.com\nce-air.com\nce04.com\nce2293.com\nce247ce247.shop\nce33m7.com\nce71jubc2.com\ncea45b9f61023.beer\nceacq.com\nceair.com\nceairdutyfree.com\nceairgroup.com\nceaj.org\nceamg.com\nceba.tech\ncebbank.com\ncebcn.com\ncebike.com\nceblease.com\ncebpubservice.com\ncebu.vip\ncecafdb.org\ncecb2b.com\ncecbh.com\ncecc-cx.com\nceccen.com\ncecdc.com\ncece-mall.com\ncece.com\ncece.la\ncecesat.com\ncecewu.com\ncecgw.com\ncecgx.com\ncechoice.com\ncecisp.com\ncecloud.com\ncecloudcs.com\ncecmath.com\ncecom.cc\nceconline.com\nceconlinebbs.com\ncecport.cc\ncecport.com\ncecxtal.com\nceda-fluid.com\ncedachina.org\ncedarhd.com\ncedfxub.org\ncediy.com\ncedock.com\nceeger.com\nceegpower.com\nceeia.com\nceeji.net\nceepower.com\nceepsp.com\nceeunion.com\ncef114.com\nceggd.com\ncehiy.com\ncehome.com\ncehuan.com\ncehuashen.com\ncehui8.com\ncei1958.com\nceiaec.org\nceibs.edu\nceibsonline.com\nceic.com\nceice.org\nceicloud.com\nceicsz.net\nceiea.com\nceigd.com\nceinettgt.com\nceitcl.com\ncekeis.com\ncekid.com\ncelebpalace.com\ncelebritywallpapershq.com\ncelgenpharm.com\ncelhr.com\nceliang.net\ncelinlawyers.com\nceliss.com\ncell-gene.com\ncell-origin.com\ncellcook.com\ncellixsoft.com\ncellocation.com\ncellprobio.com\ncellprotek.com\ncells-net.com\ncells-net.net\ncellwise-semi.com\ncelucasn.com\ncelwk.com\ncemat-asia.com\ncematsh.com\ncement365.com\ncementren.com\ncemho.com\ncemni.com\ncemodule.com\ncemsurveys.com\ncemsurveys.net\ncemyun.com\ncen-li.com\ncenano-china.com\ncenbel.com\ncenbest.com\ncenboomh.com\ncencimeter.com\ncencs.com\ncendes-arch.com\ncengceng.chat\ncengcloud.net\nceniiat.com\ncenjiasu.com\ncenkersz.com\ncenn.com\ncennjt.com\ncenray-ic.com\ncensh.com\ncentainfo.com\ncentaland.com\ncentanet.com\ncentauriglobal.com\ncentbrowser.net\ncentec.com\ncententcymbals.com\ncenterm.com\ncentit.com\ncentong.com\ncentos.bz\ncentralchina.com\ncentralsolomon.com\ncentrechina.com\ncentricsoftwarechina.com\ncentrincloud.com\ncentrixlink.com\ncentrmus.com\ncentroidtec.com\ncentrostuditaliani.com\ncentury-carrier.com\ncentury-cn.com\ncentury21cn.com\ncenturycreation.com\ncenturyenglish.com\ncenturystar.net\ncenturytrip.com\ncenuan.com\ncenvan.net\ncenvandns.com\ncenwan.com\ncenwaymaterials.com\ncenwor.com\ncenwoy.com\ncenxinews.com\ncenya.com\nceobiao.com\nceoeo.com\nceoim.com\nceolaws.net\nceolearn.com\nceook.com\nceotx.com\nceowww.com\nceoxq.com\nceozero.com\ncepark.com\ncepea.com\ncepeta.com\ncepin.com\nceping.com\nceping365.com\ncepmh.com\nceppea.net\nceppedu.com\nceprei.com\nceprei.org\ncer.net\nceracdn.net\nceradir.com\ncerambath.org\nceramicschina.com\nceramsoc.com\ncercg.com\ncere.cc\nceremony79.com\ncerestools.com\ncernet.com\ncernet.net\ncernet2.net\ncersign.com\ncersp.com\ncerticn.com\ncertificatey.com\ncertlab.org\nces-transaction.com\ncese2.com\ncesfn.com\ncesfutures.com\nceshanmi.com\nceshi.com\nceshi112.com\nceshigo.com\nceshigu.com\nceshiren.com\ncesinet.com\ncesipc.com\ncesko-dl.com\ncespc.com\ncestco.com\ncesu.net\ncetanfa.wiki\ncetc33.com\ncetc52.com\ncetc55.com\ncetccloud.com\ncetceg.com\ncetcio.com\ncetcmotor.com\ncetcssi.com\ncetgps.com\ncethik.com\ncetkmh.com\ncetsteam.com\ncetzig.com\nceultimate.com\nceve-market.org\ncevsn.com\ncewud.com\nceydz.com\nceyice.net\nceyige.com\ncezhu.net\ncf-china.info\ncf-ns.com\ncf-ns.net\ncf-ns.site\ncf-ns.tech\ncf01e170e475757b.com\ncf115.com\ncf69.com\ncf6ea43741014.beer\ncf8587a521017.beer\ncfachina.org\ncfanlost.com\ncfb30e2181013.beer\ncfbond.com\ncfc365.com\ncfca-c.org\ncfccd.com\ncfcf1958.com\ncfchem.com\ncfchi.com\ncfchint.com\ncfcpn.com\ncfd-china.com\ncfd163.com\ncfdp.org\ncfdwater.com\ncfecq.com\ncfedu.net\ncfei.net\ncfej.net\ncfeks.com\ncffote.com\ncfgbj.com\ncfgfr.com\ncfgjwl.com\ncfgpu.com\ncfgyp.com\ncfhfz.com\ncfhi.com\ncfhpc.org\ncfhuodong.cc\ncfhuodong.com\ncfido.com\ncfiec.net\ncfimg.com\ncfishsoft.com\ncfjbqc.com\ncfjqr.com\ncfjzyxh.com\ncfkjgx.com\ncflab.net\ncfldcn.com\ncflm.com\ncflpla.com\ncfluid.com\ncfm119.com\ncfmcc.com\ncfmeutencent.com\ncfmmc.com\ncfmna-tencent.com\ncfmoto.com\ncfmseatencent.com\ncfnotes.com\ncfoft.online\ncfogc.com\ncfogc.net\ncfpa.team\ncfrlr.com\ncfsbcn.com\ncfscar.com\ncfsggjt.com\ncfsino.com\ncfss.cc\ncfsuper.com\ncftcredit.com\ncftea.com\ncftecgroup.com\ncftest7.com\ncftest8.com\ncftsupport.com\ncftzqinzhou.com\ncfucn.com\ncfunctions.com\ncfund108.com\ncfuture.shop\ncfvvv.com\ncfxydefsyy.com\ncfxyfsyy.com\ncfxyjy.com\ncfyedu.com\ncfyy.cc\ncfyygf.com\ncfyzs.com\ncfzpw.com\ncfzq.com\ncfztq.com\ncg-ku.com\ncg-orz.com\ncg-schools.com\ncg009.com\ncg100iii.com\ncg1993.com\ncg3da.com\ncg98.com\ncg99.com\ncgacar.com\ncgadmob.com\ncgahz.com\ncgames.com\ncgangs.com\ncgboo.com\ncgbtek.com\ncgc.press\ncgcable.com\ncgcg01010ht.com\ncgcg01060ht.com\ncgcss.com\ncgdbia.com\ncgdeuvip.com\ncgdg.com\ncgdown.com\ncge.cc\ncgebio.com\ncgebook.com\ncgeinc.com\ncgejournal.com\ncger.com\ncgguy.com\ncggygs.com\ncghhospital.org\ncghospital.com\ncgicop.com\ncgiia.com\ncgiumuo.xyz\ncgjoy.com\ncgjoy.net\ncgke.com\ncgkjvip.com\ncgksw.com\ncgktudr.xyz\ncgl.cc\ncglw.com\ncglzw.net\ncgmama.com\ncgmantou.com\ncgmao.com\ncgmcc.net\ncgmjh.com\ncgmodel.com\ncgmol.com\ncgmxw.com\ncgnei.com\ncgnjy.com\ncgnmc.com\ncgnne.com\ncgoec-tencentclb.cloud\ncgoec-tencentclb.com\ncgoec-tencentclb.net\ncgoec-tencentclb.work\ncgonet.com\ncgowater.com\ncgown.com\ncgpbatech.com\ncgplayer.com\ncgplusplus.com\ncgreentown.com\ncgris.net\ncgrpark.com\ncgrzzl.com\ncgsec.com\ncgsfusion.com\ncgsoft.net\ncgtblog.com\ncgtn.com\ncgtsg.com\ncgtsj.com\ncgtsj.org\ncgtyhk.com\ncgtz.com\ncguardian.com\ncgufo.com\ncguiw.com\ncgutech.com\ncgvoo.com\ncgwang.com\ncgwenjian.com\ncgwic.com\ncgws.com\ncgxcig.net\ncgxdm.com\ncgxia.com\ncgxlzdm.com\ncgxm.net\ncgylke.com\ncgylw.com\ncgyou.com\ncgyouxi.com\ncgyu.com\ncgzair.com\ncgzj.com\ncgzy.net\ncgzyw.com\nch-auto.com\nch-chip.com\nch-gk.com\nch-guerrant.com\nch-tools.com\nch-water.com\nch.com\nch028.net\nch12333.com\nch9888.com\nch999.com\nch999img.com\ncha-china.org\ncha-tm.com\ncha127.com\ncha138.com\nchaba123.com\nchabansheng.com\nchabeichong.com\nchacd.com\nchacewang.com\nchacha.com\nchachaba.com\nchachawenshu.com\nchache-cn.com\nchache808.com\nchacheku.com\nchachengji.com\nchacihai.com\nchacuo.net\nchadianhua.net\nchadoc.com\nchaej.com\nchafanhou.com\nchafei.net\nchagee.com\nchaguan.center\nchahua.org\nchahui.com\nchahuo.com\nchaic.com\nchaichefang.com\nchaiderl.com\nchaiding.com\nchaidongpower.com\nchaihezi.com\nchaijing.com\nchaimage.com\nchain.cc\nchain56.com\nchaincar.com\nchaincatcher.com\nchaindd.com\nchainedbox.com\nchainhd.com\nchainknow.com\nchainlinkpcp.com\nchainlinkwork.com\nchainnode.com\nchainpharm.com\nchainsql.net\nchaint.net\nchainwinlaw.com\nchaiqian88.com\nchaishiguan.com\nchaitin.com\nchaizz.com\nchajiage.com\nchajian5.com\nchajiandaquan.com\nchajianxw.com\nchajiayuan.com\nchajie.com\nchajn.org\nchakahao.com\nchakahui.com\nchakonghao.com\nchakuaizhao.com\nchalaili.com\nchalangautozone.com\nchalaoshi.de\nchalcochem.com\nchalieco.com\nchallenge-21c.com\nchallenge-design.com\nchalwin.com\nchamcfae.com\nchamei.com\nchameiwang.com\nchamfond.com\nchamiji.com\nchampconsult.com\nchampion-ic.com\nchampionasia.hk\nchampionmkt.com\nchampionunion.com\nchampsely.com\nchan.ink\nchance-ad.com\nchanced112.com\nchancel.ltd\nchandao.net\nchandashi.com\nchandi.biz\nchandixiu.com\nchanfine.com\nchang-xiang.com\nchangan.biz\nchangancap.com\nchanganfunds.com\nchanganren.com\nchangantaihe.com\nchangba-ktv.com\nchangba.com\nchangbaapi.com\nchangbaapp.com\nchangbaimg.com\nchangbalive.com\nchangbiyuan.com\nchangchun-ccpit.com\nchangchunmarathon.com\nchangchunwater.com\nchangda.life\nchangdaore.com\nchangdunovel.com\nchangergroup.com\nchangfa.com\nchangfaproperties.com\nchangfaqifu.com\nchangfengpacking.com\nchangfengsteeltube.com\nchangfon.com\nchanghaigfrp.com\nchanghe-suzuki.com\nchanghe.com\nchanghe.tech\nchangheauto.com\nchanghedayun.com\nchangheng88.com\nchanghong-network.com\nchanghong.com\nchanghongit.com\nchanghongnetwork.net\nchanghu12333.com\nchanghualaw.com\nchanghuist.com\nchangingie.com\nchangingtek.com\nchangjiangdata.com\nchangjiangjin.com\nchangjiangtimes.com\nchangjianxy.com\nchangjingtong.com\nchangjiulogistics.com\nchangjiuqiche.com\nchangker.com\nchangkezhe.com\nchanglipeixun.com\nchangliuabc.com\nchangloong.com\nchangloong.net\nchangmengyun.com\nchangning.net\nchangpingquzhongxiyijieheyiyuan.com\nchangpu3d.com\nchangqingshu.net\nchangqu.cc\nchangshabdc.com\nchangshang.com\nchangshaship.com\nchangshatong.com\nchangshazrkj.com\nchangshengmobi.com\nchangshengshangye.com\nchangshengyiliao.com\nchangshiban.com\nchangshizu.com\nchangshouchemgroup.com\nchangshu-marathon.com\nchangshunhuojia.com\nchangtong2800.com\nchangtounet.com\nchangtubus.com\nchanguanjia.com\nchangwang.com\nchangwankeji.com\nchangwei.asia\nchangx.com\nchangxianchem.com\nchangxiao.co\nchangxiaow.com\nchangxie.com\nchangxingyun.com\nchangxuew.com\nchangyan.com\nchangyegroup.com\nchangyifan.com\nchangyin-lab.com\nchangying.com\nchangyizu.com\nchangyonggame.com\nchangyou.com\nchangyoyo.com\nchangyuangroup.com\nchangyudz.com\nchangyushengwu.com\nchangzhinews.com\nchanjet.com\nchanjue.net\nchanluntan.com\nchanmama.com\nchannelbeyond.com\nchanningsun.bid\nchanpay.com\nchanpin100.com\nchanpindashi.com\nchansemt.com\nchanshi.vip\nchanway.net\nchanwind.com\nchanxuan.com\nchanxuehezuo.com\nchanzhi.org\nchao-cn.com\nchao-fan.com\nchaoart.com\nchaobohui.com\nchaodamould.com\nchaodavalves.com\nchaodu123.com\nchaofan.com\nchaofanlin.com\nchaofanshuma.com\nchaofantian.com\nchaoge.press\nchaogejiaoyu.com\nchaogu1688.com\nchaohuatech.com\nchaohuishou.com\nchaoji.com\nchaojibiaodan.com\nchaojibiaoge.com\nchaojibuy.com\nchaojicdn.com\nchaojifan.com\nchaojihetong.com\nchaojijianli.com\nchaojiping.homes\nchaojituzi.net\nchaojiying.com\nchaojiyun.com\nchaokaixin.net\nchaolean.com\nchaoliangkj.com\nchaoliangyun.com\nchaoliuguan.com\nchaolongbus.com\nchaoluoluo.com\nchaonanclub.com\nchaonanrc.com\nchaonei.com\nchaopaiyizu.com\nchaopx.com\nchaoren.com\nchaoschina.com\nchaosec.com\nchaoshanren.com\nchaoshen.cc\nchaoshengboliuliangji.com\nchaoshengxin.com\nchaoshi168.com\nchaosqh.com\nchaosw.com\nchaov.com\nchaowanjoy.com\nchaoweb.com\nchaowei-machine.com\nchaoxibiao.net\nchaoxin.com\nchaoxing.cc\nchaoxing.com\nchaoxingv.com\nchaoyang.com\nchaoyi996.com\nchaoyinjiu.com\nchaoyuesd.com\nchaozhenht.com\nchaozhoudaily.com\nchaozhouyin.com\nchaozuo.com\nchapangzhan.com\nchapaofan.com\nchaping.tv\nchappell1811.com\nchar123.com\ncharcaius.com\ncharge-mobile.com\nchargedot.com\nchargerlab.com\nchargerlink.com\nchariotpharm.com\ncharlinserver.online\ncharllena.com\ncharlottedaviesrmt.com\ncharlsdata.com\ncharmdeer.com\ncharmingglobe.com\ncharmkeytextile.com\ncharmsunfund.com\nchartboost-china.com\nchase-secure55.wiki\nchasedorisu.com\nchaseyanyu.net\nchashebao.com\nchashudi.com\nchat12m.cfd\nchat14da.cfd\nchat2db-ai.com\nchat778.com\nchatairc.com\nchatanywhere.tech\nchatartpro.com\nchateaustarriver.com\nchatglm.site\nchatgptboke.com\nchatm.com\nchatmindai.net\nchatnos.com\nchatqp.net\nchatvgx.com\nchatyygpt.com\nchawo.com\nchaxiaow.com\nchaxinyu.net\nchaxun.biz\nchaxunchina.com\nchaxunfapiao.com\nchaxunjiao.com\nchayanfamily.com\nchayangge.com\nchaye.com\nchayeo.com\nchayu.com\nchayueshebao.com\nchayuqing.com\nchaz.fun\nchazhengla.com\nchazidian.com\nchaziyu.com\nchazuo.com\nchazuo.net\nchazuowang.com\nchbcnet.com\nchbdunt.com\nchblt.com\nchbml.com\nchbpp.com\nchce-expo.com\nchcedo.com\nchceg.com\nchceshi001.com\nchcmu.com\nchcnav.com\nchcoin.com\nchcompass.com\nchcontrol.com\nchcpay.com\nchda.net\nchdajob.com\nchdelphin.com\nchdies.com\nchdmc.com\nchdqyy.com\nchdtp.com\nche-shijie.com\nche-youhui.com\nche.com\nche0.com\nche101.com\nche168.com\nche168.net\nche2.com\nche300.com\nche314.com\nche777.com\ncheaa.com\ncheaa.org\ncheaca.org\ncheapdoma.com\ncheaphost.me\ncheapreplicawatch.com\ncheapviagraws.com\ncheapyou.com\ncheari.com\ncheasa.org\ncheatmaker.org\nchebaba.com\nchebada.com\nchebaipishu.com\nchebianjie.com\nchebianjie.net\nchebiao.cc\nchebiao.net\nchebrake.com\nchecar.mobi\nchechakj.com\nchechaoxue.com\nchecheng.com\nchechong.com\nchechuan.com\ncheci.org\ncheck.cc\ncheckaigc.com\ncheckip.pw\ncheckmath.net\ncheckoo.com\ncheckpass.net\ncheckzeit.com\ncheckzoo.com\nchecom.net\nchediandian.com\nchedongxi.com\ncheduo.com\ncheegu.com\ncheerfun.dev\ncheerjoy.com\ncheersee.com\ncheersofa.com\ncheerspublishing.com\ncheersson.com\ncheertech.ltd\ncheerycouture.com\ncheetahfun.com\ncheetahgames.com\ncheetahgo.net\ncheetahmobile.com\nchefafa.com\nchefugao.com\ncheguo.com\nchegva.com\nchehang168.com\nchehejia.com\nchehui.com\ncheil.site\nchejianding.com\nchejingjie.com\nchekuaipai.com\nchelajanitorial.com\nchelangauto.com\nchelifang.com\nchelink.com\nchellex.com\nchelun.com\nchem-stone.com\nchem17.com\nchem234.com\nchem31.com\nchem36.com\nchem365.net\nchem366.com\nchem960.com\nchem99.com\nchemalink.net\nchemao.com\nchembeango.com\nchembible.com\nchembk.com\nchemcd.com\nchemchina.com\nchemcp.com\nchemcyber.com\nchemdodgen.com\nchemdrug.com\nchememall.com\nchemfish.com\nchemgogo.com\nchemi-tech.com\nchemicalbook.com\nchemicalreagent.com\nchemingpian.com\nchemishequ.com\nchemm.com\nchemmade.com\nchemmerce.com\nchemmuseum.com\nchemnet.com\nchemourscg.com\nchempacific-china.com\nchemptc.com\nchemrc.com\nchemsrc.com\nchemtour.com\nchemwells.com\nchemwith.com\nchemyouth.com\nchemyq.com\nchen-design.com\nchen.fun\nchenag.com\nchenall.net\nchenapp.com\nchenbo.info\nchenduaomei.com\nchener.net\nchenfan.info\ncheng-sen.com\ncheng.xin\nchengaizixun.com\nchengan-web.com\nchengan.tech\nchengbanggroup.com\nchengcai.net\nchengchuanren.com\nchengde-jz.com\nchengdebank.com\nchengdegj.com\nchengdegroup.com\nchengdewater.com\nchengdu-expat.com\nchengduair.com\nchengdubao.com\nchengdufanyi.com\nchengdun.com\nchengdurail.com\nchengduzhishang.com\nchengegeya.com\nchenger0711.com\nchengezhao.com\nchengfankj.com\nchengfeilong.com\nchengfengboli.com\nchengfengerlai.com\nchenggnet.com\nchenggongguiji.com\nchenghai.cc\nchenghct.com\nchenghen.com\nchenghua888.com\nchenghuijituan.com\nchenghuiqian.xyz\nchengji-inc.com\nchengjianjituan.com\nchengjing.com\nchengjinholdinggroup.com\nchengkao365.com\nchenglang.net\nchenglangyun.com\nchenglil.com\nchenglin.name\nchenglinpak.com\nchenglispv.com\nchengliwang.com\nchengloongcishan.org\nchenglou.net\nchengmei.games\nchengmeiyouxuan.com\nchengpeiquan.com\nchengrang.com\nchengrengaokaobaoming.com\nchengrenjiaoyu1.com\nchengruide.com\nchengshan.com\nchengshidingxiang.com\nchengshiguanjia.com\nchengshijun.com\nchengshu.com\nchengsmart.com\nchengtaijiaju.com\nchengtay.com\nchengtianxiajy.com\nchengtiexinxi.com\nchengtongjz.com\nchengtu.com\nchengwei.com\nchengweitx.com\nchengxiangqian.com\nchengxiangzhineng.com\nchengxiaoliu.com\nchengxingjicj.com\nchengxinyouxuan.com\nchengxua.com\nchengxuan.com\nchengyangyang.com\nchengye-capital.com\nchengyi.press\nchengyitex.com\nchengyouyun.com\nchengyuanwenquan.com\nchengyucidian.net\nchengyun.com\nchengyuwan.com\nchengzhaoxi.xyz\nchengzhinj.com\nchengzijianzhan.cc\nchengzijianzhan.com\nchengzivr.com\nchenhe.cc\nchenhe.me\nchenhr.com\nchenhuangxun.com\nchenhui.org\nchenjia.me\nchenjiehua.me\nchenjinghealth.com\nchenjt.com\nchenkeiot.com\nchenksoft.com\nchenlb.com\nchenlianfu.com\nchenliangroup.com\nchenlinux.com\nchenlinzuwu.com\nchenlong.com\nchenmingpaper.com\nchenmomo.com\nchennianyoupin.com\nchenpe.com\nchenplus.com\nchenpon.com\nchenpot.com\nchenroot.com\nchenruixuan.com\nchenruo.net\nchens.life\nchenshipin.com\nchensuyang.com\nchenva.com\nchenwenwl.com\nchenxiao.cc\nchenxin99.com\nchenxinghb.com\nchenxingweb.com\nchenxisoft.com\nchenxm.cc\nchenxuehu.com\nchenxuhou.com\nchenxunyun.com\ncheny.org\nchenyang.com\nchenyanghg.com\nchenyea.com\nchenyifaer67373.com\nchenyistyle.com\nchenyongqi.com\nchenyou123.com\nchenyu.me\nchenyudong.com\nchenyuemz.com\nchenyuwulian.com\nchenyuxia.com\nchenyyds.com\nchenzao.com\nchenzhicheng.com\nchenzhongkj.com\nchenzhongtech.com\ncheonhyeong.com\ncheoo.com\ncheoz.com\ncherentec.com\ncheriexsky.love\ncherry-ai.com\nchervonauto.com\nchervongroup.com\ncheryholding.com\ncheryjaguarlandrover.com\ncherylalopes.com\ncherymanuals.com\ncheshenghuo.com\ncheshi-img.com\ncheshi.com\ncheshi111.com\ncheshi18.com\ncheshijie.com\ncheshipin.com\ncheshirex.com\ncheshizh.com\nchesicc.com\nchesicc.net\nchesir.com\nchesir.net\nchesono.com\nchessease.net\nchestercharles.com\nchesthospital.com\nchesudi.com\nchetiansi.com\nchetodeng.com\nchetuanwang.net\nchetuobang.com\nchetx.com\nchetxia.com\nchetxt.com\nchevip.com\nchevlen.com\ncheweiguanjia.com\nchewen.com\nchewulin.com\nchexian9.com\nchexiancha.com\nchexiang.com\nchexiaoliang.net\nchexinmeng.com\nchexiu.com\nchextx.com\nchexun.com\nchexun.net\ncheyaoshi.com\ncheyian.com\ncheyipai.com\ncheyishang.com\ncheyisou.com\ncheyou123.com\ncheyuan.com\ncheyun.com\ncheyuu.com\nchezhanri.com\nchezhibao.com\nchezhubidu.com\nchezhutech.com\nchezhuzhinan.com\nchezizhu.com\nchezvi.com\nchfsmartad.com\nchgcw.com\nchghouse.org\nchgi.net\nchgie.com\nchglmp.com\nchgreenway.com\nchgry.com\nchgzfls.com\nchhqtest.com\nchhua.com\nchhuc.org\nchhw.com\nchhzm.com\nchi2ko.com\nchi588.com\nchi86.com\nchianbaohan.com\nchibanting.com\nchichuang.com\nchickfrp.com\nchiconysquare.com\nchicopharm.com\nchida.org\nchidafeiji.com\nchidaolian.com\nchidaoni.com\nchidaoni.net\nchidaotv.com\nchidd.net\nchidowl.com\nchidudata.com\nchidutech.com\nchiefmore.com\nchiefpharma.com\nchieftin.org\nchietom.com\nchihao.com\nchihe.so\nchihealbio.com\nchiheba.com\nchiheshan.com\nchihkao.com\nchihm.com\nchiji-h5.com\nchiji.app\nchildjia.com\nchildlib.org\nchildrentheatre.org\nchileaf.com\nchili3d.com\nchillyroom.com\nchilwee.com\nchimboon.com\nchimbusco.com\nchimelong.com\nchimezi.com\nchimoph.com\nchin-fine.com\nchina-10.com\nchina-3.com\nchina-315.com\nchina-ah.com\nchina-anhe.com\nchina-applefix.com\nchina-asahi.com\nchina-aseanbis.com\nchina-audit.com\nchina-autotech.com\nchina-b.com\nchina-baiyun.com\nchina-bdh.com\nchina-bee.com\nchina-bestmind.com\nchina-bicycle.com\nchina-biding.com\nchina-bluestar.com\nchina-bme.com\nchina-borun.com\nchina-boy.org\nchina-boya.com\nchina-caa.org\nchina-caihua.com\nchina-cale.com\nchina-capsule.com\nchina-cas.org\nchina-cba.net\nchina-cbn.com\nchina-cbs.com\nchina-ccc.org\nchina-ccie.com\nchina-ccii.com\nchina-ccw.com\nchina-cdig.com\nchina-cdt.com\nchina-ceco.com\nchina-ced.com\nchina-ceec-cooperation.com\nchina-cet.com\nchina-cfa.org\nchina-chair.com\nchina-channel.com\nchina-chca.org\nchina-chigo.com\nchina-cicc.org\nchina-citytour.com\nchina-clearing.com\nchina-cloud.com\nchina-cmca.org\nchina-cmd.org\nchina-cnic.com\nchina-co.com\nchina-coc.org\nchina-consulate.org\nchina-core.com\nchina-cotton.org\nchina-cpu.co\nchina-cpu.com\nchina-cri.com\nchina-csm.org\nchina-cssc.org\nchina-denox.com\nchina-designer.com\nchina-dingjie.com\nchina-drama.com\nchina-drm.net\nchina-dt.com\nchina-dtv.com\nchina-eaea.com\nchina-ecee.com\nchina-eia.com\nchina-embassy.org\nchina-engine.net\nchina-entercom.com\nchina-enterprise.com\nchina-epa.com\nchina-erzhong.com\nchina-fangyuan.com\nchina-fei.com\nchina-feininger.com\nchina-fire.com\nchina-fishery.com\nchina-flash.com\nchina-flower.com\nchina-futian.com\nchina-g.com\nchina-galaxy-inv.com\nchina-gehang.com\nchina-genius.com\nchina-gg.com\nchina-giant.com\nchina-gnd.com\nchina-goffen.com\nchina-gold.com\nchina-goldcard.com\nchina-greenfund.com\nchina-greenlighting.com\nchina-gwy.com\nchina-hechang.com\nchina-hengyuan.com\nchina-hhsj.com\nchina-highway.com\nchina-holiday.com\nchina-hongfei.com\nchina-house.com\nchina-hp.com\nchina-hrg.com\nchina-htdl.com\nchina-huamin.com\nchina-huazhou.com\nchina-hulong.com\nchina-hushan.com\nchina-hxzb.com\nchina-hzd.com\nchina-iace.com\nchina-ida.com\nchina-inse.com\nchina-invests.net\nchina-ipif.com\nchina-isotope.com\nchina-j.com\nchina-jianan.com\nchina-jinlong.com\nchina-jit.com\nchina-jlt.com\nchina-jm.org\nchina-jxcf.com\nchina-kaidiwt.com\nchina-kaihua.com\nchina-kaoshi.com\nchina-key.com\nchina-khgroup.com\nchina-kids-expo.com\nchina-kids-fair.com\nchina-kingmold.com\nchina-knobs.com\nchina-lantu.com\nchina-latv.com\nchina-lawoffice.com\nchina-led.net\nchina-light-guides.com\nchina-lithium.com\nchina-liye.com\nchina-logistics.com\nchina-longgong.com\nchina-lottery.net\nchina-lsh.com\nchina-m2m.com\nchina-mcc.com\nchina-mile.com\nchina-moutai.com\nchina-mt.org\nchina-mx.net\nchina-nengyuan.com\nchina-nlp.com\nchina-nns.com\nchina-norbin.com\nchina-npa.org\nchina-nsftz.com\nchina-obgyn.net\nchina-office-solutions.com\nchina-orientgroup.com\nchina-oulu.com\nchina-pa.org\nchina-packcon.com\nchina-payments.com\nchina-pcba.com\nchina-pengye.com\nchina-pharmacy.com\nchina-pinyuan.com\nchina-planet.com\nchina-pub.com\nchina-qiao.com\nchina-qjbz.org\nchina-radiology.com\nchina-re.net\nchina-refrigerants.com\nchina-ric.com\nchina-riscv.com\nchina-russia.org\nchina-sand.com\nchina-sce.com\nchina-sea.net\nchina-season.com\nchina-security.com\nchina-see.com\nchina-seeq.com\nchina-sfc.com\nchina-shancun.com\nchina-shimo.com\nchina-shjyx.com\nchina-shufan.com\nchina-shugaung.net\nchina-sites.com\nchina-slate.com\nchina-smartech.com\nchina-sorsa.org\nchina-soyea.com\nchina-spirulina.net\nchina-springs.com\nchina-sss.com\nchina-stainless.com\nchina-sunshine.com\nchina-sz.com\nchina-thk.com\nchina-tin.com\nchina-tisense.com\nchina-tje.com\nchina-tongyu.com\nchina-topplus.com\nchina-tops.com\nchina-tower.com\nchina-toy-expo.com\nchina-train.net\nchina-tsac.com\nchina-uju.com\nchina-up.com\nchina-valve.com\nchina-vcom.com\nchina-vision.org\nchina-vn.com\nchina-vo.org\nchina-wanlin.com\nchina-warping.com\nchina-waste.com\nchina-weldnet.com\nchina-whwaterexpo.com\nchina-ws.org\nchina-wss.com\nchina-xb.com\nchina-xcsy.com\nchina-xian.com\nchina-xiba.com\nchina-xiuzheng.com\nchina-xzgec.com\nchina-xzkg.com\nchina-yaguang.com\nchina-yansheng.com\nchina-yd.com\nchina-yiang.com\nchina-yida.com\nchina-yinda.com\nchina-yintai.com\nchina-yongfeng.com\nchina-yt-expo.com\nchina-yuanfang.com\nchina-yuli.com\nchina-yxt.com\nchina-zbycg.com\nchina-zeiss.com\nchina-zhongda.net\nchina-zikao.com\nchina-zjj.net\nchina-zrg.com\nchina-zysj.com\nchina.com\nchina.mintel.com\nchina000799.com\nchina001.com\nchina12345.net\nchina12365.com\nchina124.com\nchina17.net\nchina1baogao.com\nchina1f.com\nchina2000.org\nchina3-15.com\nchina30s.com\nchina35.com\nchina356.com\nchina3gpp.com\nchina4a.org\nchina5e.com\nchina60.com\nchina6688.com\nchina724.com\nchina777.org\nchina918.org\nchina95.com\nchina95.net\nchina95.xyz\nchina9y.com\nchinaab.com\nchinaacc.com\nchinaacme.net\nchinaacryl.com\nchinaadec.com\nchinaadren.com\nchinaadvance.com\nchinaaeri.com\nchinaaet.com\nchinaagrisci.com\nchinaags.net\nchinaagv.com\nchinaahth.com\nchinaairer.com\nchinaamc.com\nchinaant.com\nchinaant.net\nchinaapper.com\nchinaarabcf.org\nchinaaris.com\nchinaartificialstone.com\nchinaasaservice.com\nchinaasc.org\nchinaaseanenv.org\nchinaaseanfertilizer.com\nchinaasic.com\nchinaath.com\nchinaautoms.com\nchinaautoregs.com\nchinaautosupplier.com\nchinaave.org\nchinaaviationdaily.com\nchinab4c.com\nchinababy365.com\nchinabac.com\nchinabaike.com\nchinabaiker.com\nchinabancai.com\nchinabaoan.com\nchinabaogao.com\nchinabashan.com\nchinabattery.org\nchinabbtravel.com\nchinabdh.com\nchinabeego.com\nchinabeer.net\nchinabencaogangmu.com\nchinabenson.com\nchinabesteasy.com\nchinabeston.com\nchinabeverage.org\nchinabgao.com\nchinabge.com\nchinabid315.com\nchinabidding.cc\nchinabidding.com\nchinabiddingzb.com\nchinabigdata.com\nchinabigwin.com\nchinabike.net\nchinabim.com\nchinabird.org\nchinablackcat.com\nchinablowers.com\nchinabmi.com\nchinabn.org\nchinabooktrading.com\nchinaboyun.com\nchinabreed.com\nchinabrightstone.com\nchinabsb.com\nchinabuildingcentre.com\nchinabulk.com\nchinabus.info\nchinabuses.com\nchinabuy1002.com\nchinabxwx.com\nchinabym.com\nchinabyte.com\nchinabzp.com\nchinac.com\nchinac3.com\nchinacable.com\nchinacace.org\nchinacache.com\nchinacache.net\nchinacacm.org\nchinacaj.net\nchinacamel.com\nchinacapac.com\nchinacapg.com\nchinacarbide.com\nchinacars.com\nchinacasa.org\nchinacatel.com\nchinacba.org\nchinaccia.com\nchinaccm.com\nchinaccsi.com\nchinacct.org\nchinacdc.com\nchinacdnb2b.com\nchinacelacforum.org\nchinacenn.com\nchinacentrifuge.com\nchinaceot.com\nchinaceotv.com\nchinacfa.com\nchinacfi.net\nchinacfo.net\nchinacft.org\nchinacge.com\nchinachangbo.com\nchinachangfang.com\nchinachant.com\nchinachaoyang.com\nchinacharityfederation.org\nchinachemnet.com\nchinachild.org\nchinachina.net\nchinachugui.com\nchinachuntian.com\nchinaciaf.org\nchinacib.com\nchinacid.org\nchinacie.org\nchinacil.com\nchinacir.com\nchinacity.net\nchinacitywater.org\nchinacld.com\nchinaclean.org\nchinacleanexpo.com\nchinacljt.com\nchinacma.org\nchinacmo.com\nchinacoal.com\nchinacoatingnet.com\nchinacoffee.vip\nchinacomix.com\nchinaconch.com\nchinacondiment.com\nchinaconsulatesf.org\nchinaconsun.com\nchinaconveyor.com\nchinacordblood.org\nchinacosco.com\nchinacourt.org\nchinacpda.com\nchinacpda.org\nchinacqme.com\nchinacqpgx.com\nchinacqsb.com\nchinacraa.org\nchinacrane.net\nchinacrankshaft.com\nchinacreator.com\nchinacrops.org\nchinacrosspoint.com\nchinacrt.com\nchinacses.org\nchinacsf.com\nchinacsky.com\nchinactv.com\nchinaculture.org\nchinacustomsdata.com\nchinacxjs.org\nchinacyx.com\nchinadachi.com\nchinadafen.com\nchinadafeng.com\nchinadaily.net\nchinadailyglobal.com\nchinadais.net\nchinadaja.com\nchinadance.com\nchinadart.com\nchinadas.net\nchinadatapay.com\nchinadatatrading.com\nchinadbs.com\nchinaddn.com\nchinaddos.com\nchinadds.net\nchinadentalshow.com\nchinadep.com\nchinadewei.com\nchinadforce.com\nchinadianji.com\nchinadianming.com\nchinadidao.com\nchinadipl.com\nchinadjba.com\nchinadkec.com\nchinadmoz.org\nchinadns.com\nchinadns.org\nchinadongchu.com\nchinadougong.com\nchinadra.com\nchinadrtv.com\nchinadrum.net\nchinadsl.net\nchinaduo.com\nchinadyt.com\nchinadz.com\nchinadzfp.com\nchinadzyl.com\nchinae.net\nchinaeastlaw.com\nchinaebizal.com\nchinaebr.com\nchinaecnet.com\nchinaeda.org\nchinaedu.com\nchinaedu.net\nchinaedunet.com\nchinaedunewsw.com\nchinaefu.net\nchinaega.com\nchinaehs.net\nchinaeia.org\nchinaeinet.com\nchinaeinv.com\nchinaejiao.com\nchinaembassy.at\nchinaepoxy.com\nchinaepu.com\nchinaequity.net\nchinaerdos.com\nchinaerospace.com\nchinaesf.net\nchinaeshare.com\nchinaesm.com\nchinaet.net\nchinaev100.com\nchinaeve.com\nchinaexam.org\nchinaexpo365.com\nchinaexpressair.com\nchinafa.org\nchinafangxing.com\nchinafarad.com\nchinafarming.com\nchinafashionbao.com\nchinafasten.com\nchinafastpcb.com\nchinafbdq.com\nchinafcx.com\nchinafeiting.com\nchinafert-gov.com\nchinaffmpeg.com\nchinafga.org\nchinafiber.com\nchinafic.org\nchinafilm.com\nchinafilmhy.com\nchinafilms.net\nchinafinancenet.com\nchinafinanceonline.com\nchinafininfo.com\nchinafishtv.com\nchinafix.com\nchinaflashmarket.com\nchinaflier.com\nchinafolklore.org\nchinafoma.com\nchinafoodj.com\nchinafoodsltd.com\nchinaforklift.com\nchinafpd.net\nchinafph.com\nchinafpma.org\nchinafranchiseexpo.com\nchinafruitime.com\nchinafsl.com\nchinaftat.org\nchinafuda.com\nchinafudaoban.com\nchinafumao.com\nchinafxd.com\nchinafxkj.com\nchinag.pro\nchinagames.net\nchinagayles.com\nchinagb.net\nchinagb.org\nchinagba.com\nchinagcl.com\nchinagdda.com\nchinagdn.com\nchinaghwl.com\nchinagiftsfair.com\nchinaglassnet.com\nchinagoldcoin.net\nchinagoldgroup.com\nchinagongcheng.com\nchinagoods.com\nchinagosun.com\nchinagp.net\nchinagpay.com\nchinagps.cc\nchinagrandauto.com\nchinagrandinc.com\nchinagrazia.com\nchinagreenbio.com\nchinagreentown.com\nchinagrid.net\nchinagrowthcapital.com\nchinagslb.com\nchinagslb.net\nchinagsrc.com\nchinagungho.org\nchinaguohuan.com\nchinaguyao.com\nchinagwy.com\nchinagwy.net\nchinagwy.org\nchinagwyw.org\nchinagzn.com\nchinahacker.com\nchinahaixun.com\nchinaham.com\nchinahanang.com\nchinahao.com\nchinahaochuan.com\nchinaharp.com\nchinahazelnut.com\nchinahbj.com\nchinahbjob.com\nchinahengying.com\nchinahho.com\nchinahhxh.com\nchinahighnew.com\nchinahightech.com\nchinahighto.com\nchinahighway.com\nchinahiron.com\nchinahiron.ltd\nchinahiyou.com\nchinahj.club\nchinahkidc.net\nchinahky.com\nchinahnjs.com\nchinahongdu.net\nchinahonghui.net\nchinahongying.com\nchinahorologe.com\nchinahorse.org\nchinahosesupply.com\nchinahotelgz.com\nchinahpa.org\nchinahqjjw.com\nchinahr.com\nchinahrd.net\nchinahrt.com\nchinahsdp.com\nchinahte.com\nchinahtz.com\nchinahualai.com\nchinahuashan.com\nchinahuaxicun.com\nchinahuaxue.com\nchinahuben.com\nchinahudong.com\nchinahugong.com\nchinahuizhanjie.com\nchinahumo.com\nchinahvacr.com\nchinahw.net\nchinahylq.com\nchinahyyj.com\nchinahzkj.com\nchinaiat.com\nchinaiatb.org\nchinaidcnet.com\nchinaidcnet.net\nchinaido.com\nchinaidr.com\nchinaief.net\nchinaielts.org\nchinaiern.com\nchinaiia.org\nchinaiiss.org\nchinainfoseek.com\nchinainout.com\nchinainsbrokers.com\nchinaiol.com\nchinaiprlaw.com\nchinairn.com\nchinairport.net\nchinait.vip\nchinaitcapital.com\nchinaitlab.com\nchinaiut.com\nchinajan.com\nchinajcz.com\nchinajeweler.com\nchinajfj.com\nchinajienuo.com\nchinajierda.com\nchinajinguo.com\nchinajinlong.com\nchinajinsheng.com\nchinajinzhan.com\nchinajinzhou.com\nchinajiuquan.com\nchinajj.org\nchinajjz.com\nchinajnhb.com\nchinajoiner.net\nchinajorson.net\nchinajoy.net\nchinajs120.com\nchinajsc.com\nchinajsjmxh.com\nchinajsxx.com\nchinajungong.com\nchinajuva.com\nchinajyhj.com\nchinajyjxh.com\nchinajyxdh.com\nchinajyy.net\nchinajzqc.com\nchinakab.com\nchinakangping.com\nchinakangyue.com\nchinakaoyan.com\nchinakeon.com\nchinakewei.com\nchinakidville.com\nchinakiln.net\nchinakingho.com\nchinakingland.com\nchinakingo.com\nchinakinzo.com\nchinaklb.com\nchinakong.com\nchinakongzi.org\nchinakqn.com\nchinakshx.com\nchinaksi.com\nchinakuangshi.com\nchinakyzl.com\nchinalabexpo.com\nchinalabs.com\nchinalahigh.com\nchinalancoo.com\nchinalandpress.com\nchinalanhua.com\nchinalao.com\nchinalaobao.com\nchinalawbook.com\nchinalawedu.com\nchinalawinfo.com\nchinalawyer.co\nchinalawyeryn.com\nchinaleather.com\nchinaleather.org\nchinaledger.com\nchinalep.org\nchinalibs.net\nchinalicensing.org\nchinalicensingexpo.com\nchinalifang.com\nchinalims.net\nchinalingshan.com\nchinalink.tv\nchinalions.com\nchinaliriver.com\nchinalive.com\nchinaliyou.com\nchinalm.org\nchinalonghu.com\nchinalowcarb.com\nchinalpharm.com\nchinalsjt.com\nchinalubricant.com\nchinalulutong.com\nchinalure.com\nchinalushan.com\nchinaluxury.net\nchinalww.com\nchinalxnet.com\nchinamadas.com\nchinamae.com\nchinamags.org\nchinamani.com\nchinamaohong.com\nchinamap.com\nchinamaven.com\nchinambn.com\nchinamca.com\nchinamcache.com\nchinamcloud.com\nchinamea.org\nchinameat.net\nchinamedicinej.com\nchinamendu.com\nchinamenwang.com\nchinamerger.com\nchinametro.net\nchinameyer.com\nchinamie.org\nchinamingyan.net\nchinamining.com\nchinamission.be\nchinamissun.com\nchinamobile.com\nchinamobiledevice.com\nchinamost.net\nchinamotian.com\nchinamsa.org\nchinamssp.com\nchinamule.com\nchinamuscle.org\nchinamusical.net\nchinamworld.com\nchinamypp.com\nchinananda.com\nchinananyang.com\nchinanbb.com\nchinanet-sh.com\nchinanet.cc\nchinanet88.com\nchinanetcenter.com\nchinanetidc.com\nchinanetsun-dns.com\nchinanetsun.com\nchinanev.net\nchinaneweast.com\nchinanewera.com\nchinanewkey.com\nchinanews.com\nchinanim.com\nchinaningbo.com\nchinanmi.com\nchinanrb.com\nchinanums.com\nchinanwa.com\nchinaobp.com\nchinaoceanwide.com\nchinaoct.com\nchinaoly.com\nchinaomp.com\nchinaonebuild.com\nchinaonstreetparking.com\nchinaonward.net\nchinaopc.org\nchinaopen.com\nchinaopticsvalley.com\nchinaore.com\nchinaorff.com\nchinaorff.org\nchinaorganicchem.com\nchinaorientgroup.com\nchinaott.com\nchinaott.net\nchinapag.com\nchinapandi.com\nchinapanocean.com\nchinapantheum.com\nchinapantom.com\nchinapaper.net\nchinaparking.org\nchinapastel.com\nchinapay.com\nchinapayhongkong.com\nchinapbw.com\nchinapcd.com\nchinape168.com\nchinapearlk.com\nchinapeier.com\nchinapelletizer.com\nchinapeople.com\nchinapet.com\nchinapet.net\nchinapharm.net\nchinaphp.com\nchinaphper.com\nchinapilotage.org\nchinapipe.net\nchinapiston.com\nchinaplasonline.com\nchinaplat.com\nchinapm.org\nchinapnr.com\nchinaportrait.org\nchinaports.com\nchinapost-life.com\nchinapoto.com\nchinapower.org\nchinapowerbi.com\nchinapp.com\nchinapp.net\nchinapsy.com\nchinapubmed.net\nchinapuleather.com\nchinapusirui.com\nchinapv.org\nchinaqcb.com\nchinaqfc.com\nchinaqi.net\nchinaqigong.com\nchinaqikan.com\nchinaqingtian.com\nchinaqipeihui.com\nchinaqjydxh.com\nchinaql.org\nchinaqoe.net\nchinaquickpcb.com\nchinaqunsheng.com\nchinaqw.com\nchinaray-oled.com\nchinarayying.com\nchinarca.com\nchinardr.com\nchinardr.net\nchinaredstar.com\nchinaredsun.com\nchinareform.net\nchinaren.com\nchinarenzhi.com\nchinaresin.com\nchinarespiratory.org\nchinarjw.com\nchinarta.com\nchinartlaw.com\nchinaruiji.com\nchinarun.com\nchinarunau.com\nchinarzfh.com\nchinasaat.com\nchinasalestore.com\nchinasanbai.com\nchinasanc.com\nchinasantian.com\nchinasareview.com\nchinasatcom.com\nchinasbm-eet.com\nchinasbm.com\nchinasciencejournal.com\nchinascope.com\nchinascopefinancial.com\nchinascpjy.com\nchinascrap.com\nchinascsoft.com\nchinasecuritization.org\nchinaseed114.com\nchinasexq.com\nchinasg.com\nchinashadt.com\nchinashenglu.com\nchinashengmao.com\nchinashj.com\nchinashop.cc\nchinashpp.com\nchinashunyi.com\nchinasia.org\nchinasie.com\nchinasigma.com\nchinasiia.com\nchinasilk.com\nchinasilkmuseum.com\nchinasilver.hk\nchinasinew.com\nchinasinging.com\nchinasiwei.com\nchinaslc.com\nchinasmartpay.com\nchinasmcc.com\nchinasmp.com\nchinasnow.net\nchinasnto.com\nchinasnw.com\nchinaso.com\nchinasoftbank.com\nchinasofti.com\nchinasoftinc.com\nchinasoftosg.com\nchinasooa.com\nchinasoushang.com\nchinaspringtown.com\nchinasrg.com\nchinasrif.com\nchinassbc.com\nchinassl.com\nchinassl.net\nchinasspp.com\nchinastarlogistics.com\nchinastationeryfair.com\nchinasti.com\nchinastoneforest.com\nchinasufa.com\nchinasunglow.com\nchinasuntree.com\nchinasupercloud.com\nchinasuperwool.com\nchinaswa.org\nchinaswim.com\nchinaswimmer.com\nchinasws.com\nchinasydw.org\nchinaszma.com\nchinataa.org\nchinatai.com\nchinatairun.com\nchinataitan.com\nchinataiwan.org\nchinatalent.org\nchinatalentgroup.com\nchinatat.com\nchinatechie.com\nchinatechie.net\nchinatechinsights.com\nchinatelecom.com.hk\nchinatelecom.com.mo\nchinatelecomglobal.com\nchinatelecomhk.com\nchinatelecomiot.com\nchinatelling.com\nchinatet.com\nchinatex.com\nchinatex.net\nchinatex.org\nchinatg.com\nchinathinksbig.com\nchinatianyin.com\nchinatibetnews.com\nchinaticket.com\nchinatikfans.com\nchinatimber.org\nchinatimes.cc\nchinatiner.com\nchinatiredealer.com\nchinatla.com\nchinatle.com\nchinatlzm.com\nchinatmco.com\nchinatongjia.com\nchinatopbrands.net\nchinatoplon.com\nchinatourguide.com\nchinatpm.com\nchinatpm.net\nchinatrace.org\nchinatranslation.net\nchinatravel.net\nchinatravelacademy.com\nchinatraveldepot.com\nchinatruck.org\nchinatrucks.com\nchinatsi.com\nchinatsp.com\nchinatt.com\nchinattas.com\nchinattl.com\nchinatungsten.com\nchinatupai.com\nchinatv-net.com\nchinatyco.com\nchinatypical.com\nchinau.cc\nchinaufo.com\nchinaui.com\nchinauidesign.com\nchinauma.com\nchinauma.net\nchinaums.com\nchinaun.net\nchinaunicom-a.com\nchinaunicom.com\nchinaunionpay.com\nchinaunionpay.net\nchinauniversalasset.com\nchinaunix.com\nchinaunix.net\nchinaunix.org\nchinauo.com\nchinauos.com\nchinauos.net\nchinaups.com\nchinaus.com\nchinauwei.com\nchinava.net\nchinavalin.com\nchinavas.com\nchinavcpe.com\nchinavfx.net\nchinavid.com\nchinavideo.org\nchinavideos.net\nchinaviewstone.com\nchinaviolin.net\nchinavipsoft.com\nchinavisual.com\nchinavivers.com\nchinaviwon.com\nchinavr.net\nchinawanbang.com\nchinawanda.com\nchinawanlitrans.com\nchinawatchnet.com\nchinawaterexpo.com\nchinawatertech.com\nchinawch.com\nchinawebber.com\nchinawebmap.com\nchinaweiyu.com\nchinaweizheng.com\nchinawepon.com\nchinawerewolf.com\nchinawie.com\nchinawindnews.com\nchinawinjoy.com\nchinawiserv.com\nchinawitmedia.com\nchinawr.net\nchinaws.net\nchinawssdxh.com\nchinawudang.com\nchinawulong.com\nchinawutong.com\nchinawutong.net\nchinawuyuan.com\nchinawxfoundry.com\nchinaxiaokang.com\nchinaxidian.com\nchinaxinge.com\nchinaxingye.com\nchinaxinhuaair.com\nchinaxinport.com\nchinaxintu.com\nchinaxinzhi.com\nchinaxiuqi.com\nchinaxiv.com\nchinaxiv.net\nchinaxiv.org\nchinaxpp.com\nchinaxq.com\nchinaxqf.com\nchinaxuchuan.com\nchinaxuehang.com\nchinaxueqian.com\nchinaxwcb.com\nchinaxy.com\nchinaxzrc.com\nchinayacht.org\nchinayadea.com\nchinayanghe.com\nchinayanming.com\nchinayaojiang.com\nchinayarn.com\nchinaybx.com\nchinaygj.com\nchinayigui.com\nchinayikangyaoye.com\nchinayinyi.com\nchinayis.com\nchinayishuhua.com\nchinaymc.com\nchinayms.com\nchinayongfa.com\nchinayoubang.com\nchinayounao.com\nchinayouthpower.org\nchinays.com\nchinayuanwang.com\nchinayucai.com\nchinayulin.com\nchinayunlang.com\nchinayuns.com\nchinayuqiu.com\nchinayyhg.com\nchinayyjx.com\nchinaz.com\nchinaz.net\nchinazbd.com\nchinazbj.com\nchinazh.net\nchinazhaoye.com\nchinazhifu.com\nchinazhijiang.com\nchinazhz.com\nchinazikao.com\nchinazipper.org\nchinazjgc.com\nchinazjph.com\nchinazjy.com\nchinazkjc.com\nchinazmhb.com\nchinazmob.com\nchinaznj.com\nchinazns.com\nchinaznyj.com\nchinazov.com\nchinazsgroup.com\nchinaztg.com\nchinazwds.com\nchinazxjc.com\nchinazxt.com\nchinazy.org\nchinca.org\nchindices.com\nchine-info.com\nchinee.com\nchinemiss.com\nchinese-no1.com\nchinese315.org\nchineseacc.com\nchineseafs.org\nchineseall.com\nchinesechip.com\nchinesecio.com\nchineseconsulate.org\nchineseembassy.org\nchinesehongker.com\nchinesejk.com\nchineselaw.com\nchineselighting.org\nchinesemale.com\nchinesemedical.net\nchinesemeter.com\nchinesemooc.org\nchinesemoocs.org\nchinesepaper-cut.com\nchineserose.com\nchinesetown.net\nchingan.com\nchingkun.com\nchingli.com\nchingmi.com\nchinjpd.com\nchinlingo.com\nchinrt.com\nchinsc.com\nchint.com\nchint.net\nchintanneng.com\nchintautomation.com\nchintautoparts.com\nchintcable.com\nchintim.com\nchinulture.com\nchip37.com\nchipcoo.com\nchipcreation.com\nchipdance.com\nchipdebug.com\nchipeasy.com\nchiphell.com\nchiphometek.com\nchiplayout.net\nchipmanufacturing.org\nchiponeic.com\nchipown.com\nchippacking.com\nchipsbank.com\nchipsec.com\nchipsgo.com\nchipsir.com\nchipup.com\nchipwing.com\nchipyun.com\nchiq-cloud.com\nchiralquest.com\nchisage.com\nchisai.tech\nchisc.net\nchishine3d.com\nchishoes.com\nchitic.com\nchitu.com\nchitudexiaozhi.com\nchitus.com\nchivast.com\nchivox.com\nchivoxapp.com\nchiway-repton.com\nchiwayedu.com\nchiwayind.com\nchiwigogo.com\nchixia.com\nchixm.com\nchixuyun.com\nchiyanjiasu.com\nchiyekeji.com\nchiyifen.com\nchiyufeng.com\nchizao.com\nchizhou.cc\nchizhoubus.com\nchizhouchacha.com\nchizhouhospital.com\nchizhoujob.com\nchizhouren.com\nchiznews.com\nchj-care.com\nchjchina.com\nchjgg.com\nchjiye.com\nchjso.com\nchjyw.org\nchkee.com\nchkschool.com\nchlbiz.com\nchlingkong.com\nchlmfm.com\nchlmiao.com\nchloe99.com\nchlxj.com\nchmc.cc\nchmecc.org\nchmed.net\nchmgames.com\nchmia.org\nchmod0777kk.com\nchmti.com\nchn-cstc.com\nchn-das.com\nchn-new-9sport.com\nchn0769.com\nchn112.com\nchn168.com\nchnart.com\nchnau99999.com\nchnbook.org\nchnboxing.com\nchnbsg.com\nchnchi.com\nchnci.com\nchncia.org\nchncomic.com\nchncon.com\nchncopper.com\nchncpa.org\nchncwds.com\nchndaqi.com\nchndeli.com\nchndesign.com\nchndoi.com\nchndoi.net\nchndoi.org\nchnews.net\nchnfi.com\nchnfund.com\nchngalaxy.com\nchngc.net\nchngsl.com\nchnjet.com\nchnlanker.com\nchnmed.com\nchnmodel.com\nchnmus.net\nchnmusic.org\nchnpac.com\nchnpec.com\nchnppmuseum.com\nchnpush.com\nchnqiang.com\nchnqifeng.com\nchnqsedu.com\nchnrailway.com\nchnroad.com\nchnso.com\nchnsuv.com\nchntel.com\nchnxw.com\nchocei.com\nchofei.com\nchofn.com\nchofn.net\nchofn.org\nchofnipr.com\nchoiceform.com\nchomixbiotech.com\nchong4.net\nchongbuluo.com\nchongchi.com\nchongdawang.com\nchongdeedu.com\nchongdiantou.com\nchongdk.net\nchongdugou.net\nchonger.org\nchongfabianli.com\nchongguanglawfirm.com\nchongjisyj.com\nchongjiyashiji.com\nchongkongwang999.com\nchongmingzhuce.com\nchongnengjihua.com\nchongqingbbs.com\nchongqingdongjin.com\nchongqingrenpin.com\nchongqingyoupin.com\nchongqu.com\nchongso.com\nchongsoft.com\nchongwenwen.com\nchongwu.cc\nchongwudian.com\nchongwujiaoyi.com\nchongwunet.com\nchongya.vip\nchongyejia.com\nchongyike.com\nchongyitang.org\nchongyunpowu.com\nchongzhi.com\nchongzuo.club\nchonka.com\nchontdoled.com\nchonton.com\nchoosepickhere.com\nchoositon.com\nchooway.com\nchopetto.com\nchosign.com\nchoubag.com\nchouchoujiang.com\nchouchoumao.com\nchoujue.net\nchoukang.com\nchoupangxia.com\nchouqu.com\nchouti.com\nchoututech.com\nchowtaiseng.com\nchplayer.com\nchq360.com\nchrent.com\nchrice.net\nchrieschina.com\nchristophero.xyz\nchrmn.com\nchroad.com\nchrome64.com\nchrome666.com\nchromecj.com\nchromedownloads.net\nchromefor.com\nchromegw.com\nchromeliulanqi.com\nchromezj.com\nchronusartcenter.org\nchrstatic.com\nchs.pub\nchs5e.com\nchsbs.com\nchsdl.com\nchsdpharma.com\nchsgw.com\nchshcms.com\nchshcms.net\nchshsaas.com\nchsmarttv.com\nchsndt.org\nchspra.com\nchspv.com\nchste.com\nchszzy.com\nchtcmotor.com\nchtf.com\nchtfund.com\nchtgc.com\nchtjf.com\nchtmxp.com\nchtpe.com\nchtwm.com\nchu-ying.com\nchu0.com\nchu110.com\nchu21.com\nchu58.com\nchuairan.com\nchuaizhe.com\nchualamdimsum.com\nchuan-s.com\nchuanbojiang.com\nchuanboyi.com\nchuandaizc.com\nchuandasolar.com\nchuandong.com\nchuang-fan.com\nchuang-pin.com\nchuangansou.com\nchuangcache.com\nchuangcdn.com\nchuangchangnet.com\nchuangchenwangluo.com\nchuangcifang.com\nchuangdaxx.com\nchuangduyouyue.com\nchuangen.com\nchuangfeixin.com\nchuanggallery.com\nchuanghe.net\nchuanghui-cn.com\nchuangjiangx.com\nchuangjie.com\nchuangjing.com\nchuangkem.com\nchuangkeup.com\nchuangkit.com\nchuanglan.com\nchuangli.net\nchuanglian.net\nchuanglinggame.com\nchuangliukeji.com\nchuangluo.com\nchuangmaoshanghai.com\nchuangmei8.com\nchuangongsi.com\nchuangseo.com\nchuangshiwl.com\nchuangshiyuli.com\nchuangtie.com\nchuangtoo.com\nchuangx.org\nchuangxin.com\nchuangxinapi.com\nchuangxinbateng.com\nchuangxinoa.com\nchuangxuan.xyz\nchuangyebaba.com\nchuangyehai.com\nchuangyejia.com\nchuangyetv.com\nchuangyijisu.com\nchuangyimao.com\nchuangyiqifu.com\nchuangyisai.com\nchuangyiwh.com\nchuangyouqi.com\nchuangyuan.ltd\nchuangyuejoy.com\nchuangzaoshi.com\nchuangzuoniu.com\nchuanhai.net\nchuanhuan.com\nchuanjiaoban.com\nchuanke.com\nchuanloo.com\nchuanmeixing.com\nchuannan.net\nchuanpuyun.com\nchuanqi.com\nchuanqiart.com\nchuanqibbs.com\nchuanshanjia.work\nchuanshanqundao.com\nchuansong.me\nchuansongme.com\nchuantangjitrade.com\nchuantec.com\nchuantiegroup.com\nchuantu88.com\nchuanxincao.net\nchuanye.com\nchuanyejinxuan.xyz\nchuanyifu.com\nchuanyinet.com\nchuanying365.com\nchuanying520.com\nchuanyuanbang.com\nchuanyuapp.com\nchuanzhen.com\nchuapp.com\nchuasu.com\nchuban.cc\nchubanyun.me\nchubaohui.com\nchucheng.wiki\nchuchujie.com\nchuchur.com\nchufaba.me\nchufw.com\nchuge8.com\nchugou360.com\nchuguo.tech\nchuguo78.com\nchuguohao.com\nchuguoqu.com\nchuhai.group\nchuhaige.com\nchuhailiqi.com\nchuimg.com\nchuinet.com\nchuisax.com\nchuishen.xyz\nchuixue.com\nchuiyue.com\nchuizi.net\nchujian.xyz\nchujing-electric.com\nchujingapp.com\nchujuan.net\nchujunkeji.com\nchukong-inc.com\nchukonggame.com\nchukou1.com\nchukouplus.com\nchuleg.com\nchumenwenwen.com\nchun-wang.com\nchun-xiang.com\nchundi.com\nchundi.org\nchunengauto.com\nchunfengapp.com\nchunfengxing.com\nchungkwong.cc\nchunhaijx.com\nchunhingplasticbags.com\nchunhuinongye.com\nchunjiangvalve.com\nchunjingban.net\nchunlan.com\nchunliangpai.com\nchunliao.net\nchunloo.com\nchunmen.com\nchunmi.com\nchunqiuhong.com\nchunsheng.com\nchunshuitang.com\nchunshuizhijia.com\nchunsuns.com\nchuntaoyisheng.com\nchuntsuan.com\nchunxing-group.com\nchunxuanmao.com\nchunxudianqi.com\nchunyiscdk.com\nchunyu.me\nchunyu.mobi\nchunyuqiufeng.com\nchunyuyisheng.com\nchunzuo.com\nchuoemg.work\nchuolitech.com\nchuquan.me\nchurenjixie.com\nchuruisy.com\nchusan.com\nchusenscm.com\nchuseo.com\nchushan.com\nchushang027.com\nchushi.cool\nchushihome.com\nchushiji.com\nchushixiu.com\nchushou.tv\nchushu.org\nchushu123.com\nchutianlaser.com\nchutianzhinu.com\nchuxindata.com\nchuxingpay.com\nchuxingyouhui.com\nchuxinhd.com\nchuxinhudong.com\nchuxinvip.com\nchuxueyun.com\nchuyaer.com\nchuyigao.com\nchuyu.me\nchuzhaobiao.com\nchvacuum.com\nchvoice.com\nchw818.com\nchwang.com\nchwedu.com\nchwlsq.com\nchxchips.com\nchxent.com\nchxin-oil.com\nchxq.org\nchxyl.com\nchxyq.com\nchyitech.com\nchysoft.net\nchyw.pub\nchyxx.com\nchyyyygl.com\nchz.cc\nchzhkeji.com\nchzhsw.com\nchzhw.com\nchzpw.com\nchzsks.com\nchzwater.com\nchzybj.com\nci-cn.com\nci-du.com\nci-ele.com\nci-xing.com\nci123.com\nci800.com\nciaie.com\ncialisrxmsn.com\nciallo.cc\nciaoca.com\nciapst.org\ncibaike.com\ncibawl.com\ncibfintech.com\ncibia.org\ncibn.cc\ncibn.com\ncibnlive.com\ncibnott.net\ncibntv.net\ncibnvst.com\nciboedu.org\ncibonet.com\ncibresearch.com\ncibuser.com\ncic-js.com\ncicadayun.com\ncicaf.com\ncicba.net\ncicc.com\nciccfund.com\ncicconline.com\nciccphoto.com\nciccwargame.com\nciccwm.com\nciceme.com\ncicfexpo.com\ncicg.tech\nciciec.com\ncicihappy.com\ncicmag.com\ncicnn.com\ncicoe.net\ncicphoto.com\ncict.com\ncidf.net\ncidi.ai\ncidianbao.com\ncidiancn.com\ncidianso.com\nciding.cc\ncidschina.com\nciduw.com\ncie-lgr.com\ncieaast.com\nciec-expo.com\nciec.com\nciect.com\nciecte.com\nciecworld.com\nciedata.com\ncieet.com\nciepe.com\ncietac-hb.org\ncietac-sc.org\ncietac.org\nciezn.com\ncifa-china.com\ncifalshanghai.org\ncifco.net\nciff-gz.com\ncifm.com\ncifnews.com\ncifoo.com\nciftis.org\ncig-cq.com\ncigadesign.com\ncigarambassador.com\ncigh.com\ncignacmb-ipmi.com\ncignacmb.com\ncignacmbamc.com\ncignacmbuser.com\ncigtech.com\nciguang.com\ncih-index.com\ncihai123.com\ncihexpo.com\ncihua.net\nciiccq.com\nciicgat.com\nciichr.com\nciicjs.com\nciicsh.com\nciidoo.com\nciie.org\nciif-expo.com\nciiplat.com\ncijiasu.com\ncijiyun.com\ncikelink.com\ncilgroup.org\nciliba.life\ncilin.org\ncilishenqi.cc\ncilogo.com\ncim2025.net\ncimamotor.com\ncimc-tianda.com\ncimc.com\ncimccity.com\ncimcdlem.com\ncimcjm.com\ncimclogistics.com\ncimcreefertrailer.com\ncimcvehiclesgroup.com\ncimen.club\ncimic.com\ncimicgroup.com\ncimictiles.com\nciming-bj.com\nciming-sh.com\nciming.com\ncimingaoya.com\ncimingbj.com\ncimingsy.com\ncimsic.com\ncimtshow.com\ncinacom.net\ncinasoft.com\ncindaflc.com\ncindasc.com\ncindasoft.com\ncinehello.com\ncineplexsn.com\ncingta.com\nciniao.me\ncinic.com\ncinsee.com\ncinsos.com\ncio114.com\ncio360.net\ncioage.com\ncioln.help\nciomp-cggc.com\nciopharma.com\nciotimes.com\nciotour.com\nciou.com\ncioxom-top.com\ncip.cc\ncipgtrans.com\ncipherupcloud.com\nciplawyer.com\ncippe.net\nciprun.com\ncipscom.com\ncipukj.com\ncipunited.com\ncircday.com\ncircleharmonyhealth.com\ncirclelog.com\ncircuitboardchips.com\ncirmall.com\ncirrowings.com\ncirs-ck.com\ncirs-group.com\ncirs-reach.com\ncirscn.com\ncisbeijing.com\ncisdish.com\ncisgz.com\ncisia.org\ncismef.com\ncisskwt.com\ncistds.org\ncistsports.com\ncisuntech.com\ncit168.com\ncitahub.com\ncitaq.com\nciteaexample.com\ncitegalleries.com\ncitexpo.org\ncitgc.com\ncitiais.com\ncitic\ncitic-wealth.com\ncitic.com\nciticbank.com\nciticbankuser.com\nciticcard.com\nciticdameng.com\nciticenvirotech.com\nciticfunds.com\nciticguoanbn.com\ncitichmc.com\nciticleasing.com\nciticnetworks.com\ncitics.com\nciticsf.com\nciticsinfo.com\nciticsteel.com\ncitie-gd.com\ncitiraise.com\ncitisa.org\ncitiz.net\ncitizenmech.com\ncitreport.com\ncits-jl.com\ncits-sz.net\ncitsbj.com\ncitscq.com\ncitscsc.com\ncitsgbt.com\ncitsgs.com\ncitsguilin.com\ncitshq.com\ncitsp.net\ncitsqd.net\ncitssh.com\ncitswx.com\ncitsxa.com\ncitsyn.com\ncitszz.com\ncitvc.com\ncity12580.com\ncity199.com\ncity8.com\ncity8090.com\ncitybrain.com\ncitygf.com\ncityhui.com\ncityhuitech.com\ncitylinker.com\ncityoncenter.com\ncityos.com\ncitypaly.com\ncitys114.com\ncitysbs.com\ncitysz.net\ncitytogo.com\ncityup.org\ncitywy.com\nciunofor.com\ncivicswarm.com\ncivigas.com\ncivilizec.com\ncivilness.com\nciviw.com\nciweek.com\nciweekforum.com\nciweekly.com\nciwei.net\nciweimao.com\nciweishixi.com\nciweiyuedui.com\nciwong.com\nciwong.net\nciwork.net\ncixcomputing.com\ncixibank.com\ncixiedu.net\ncixtech.com\ncixuanfuw.com\nciyagroup.com\nciyew.com\nciyitech.com\nciyocon.com\nciyoga.org\nciyuan.men\nciyuanji.com\nciyuans.com\nciyun.link\nciyynodegroup.cyou\ncizip.com\ncj0515.com\ncj120.com\ncj5bs.com\ncj5bs.net\ncj8.ren\ncjaljs.com\ncjasen.com\ncjavapy.com\ncjbeng.com\ncjbjedu.com\ncjbxt.com\ncjccb.com\ncjchina.net\ncjcn.com\ncjdcw.com\ncjdg.com\ncjdropshipping.com\ncjdsp.com\ncjeduw.com\ncjftb.com\ncjhospital.com\ncjhxfund.com\ncjhydrogen.com\ncjia.com\ncjiahome.com\ncjienc.com\ncjiit.com\ncjitri.com\ncjj365.cc\ncjjd01.com\ncjjd02.com\ncjjd03.com\ncjjd04.com\ncjjd05.com\ncjjd06.com\ncjjd07.com\ncjjd08.com\ncjjd09.com\ncjjd10.com\ncjjd11.com\ncjjd12.com\ncjjd13.com\ncjjd14.com\ncjjd15.com\ncjjd16.com\ncjjd17.com\ncjjd18.com\ncjjd19.com\ncjjd20.com\ncjjhb.com\ncjjhk.com\ncjjjs.com\ncjjnff.com\ncjk3d.net\ncjkhd.com\ncjkihgroup.com\ncjkjks.com\ncjkt.com\ncjkz.com\ncjlap.com\ncjlulu.com\ncjm.so\ncjmakeding.com\ncjmit.com\ncjmkt.com\ncjmr.org\ncjmx.com\ncjmxhedu.com\ncjn.com\ncjnas.com\ncjnis.com\ncjol.com\ncjrcsc.com\ncjs-lwh.love\ncjsc.com\ncjsgegs.com\ncjshipin.net\ncjsic.com\ncjslcg.com\ncjspd.com\ncjsy.net\ncjsyedu.com\ncjtl.com\ncjtmsp.com\ncjtouzi.com\ncjveg.com\ncjwcjyy.com\ncjwlb.com\ncjww.com\ncjx2.com\ncjxqjt.com\ncjxz.com\ncjycode.com\ncjys.net\ncjyun.org\ncjyy6789.com\ncjyyw.com\ncjzcb.com\ncjzcgl.com\ncjzsy.com\ncjzww.com\ncjzx.net\ncjzzc.com\nck-coinmcap.lol\nck0771.com\nck100.com\nck180.net\nck586.com\nck830.com\nck921.com\nckair.com\nckan.tv\nckbv165.org\nckd-mbd.com\nckd.im\nckd.so\nckd8.com\nckdzb.com\nckefu.com\nckernel.org\nckeyan17.com\nckeyan17.net\nckeyedu.com\nckfxx.com\nckhdvt.com\nckia.org\nckimg.com\nckj100.com\nckj1000.com\nckjr001.com\nckjryy.com\nckpharm.com\nckplayer.com\nckqjyjq.xyz\ncksct.com\ncksic.com\ncksschool.com\ncksx.org\ncktshare.com\nckuai.com\nckw205.com\nckxx.net\nckzcc.com\nckzhaoyaojing.com\nckzhijiaedu.com\ncl-acg.com\ncl-kongtiao.com\ncl-power.com\ncl0438.com\ncl0579.com\ncl2.apple.com.edgekey.net.globalredir.akadns.net\ncl2009.com\ncl868.com\nclady.cc\nclaiks.com\nclam-itc.com\nclamc.com\nclamptek.com\nclangcn.com\nclangtx.com\nclanzx.net\nclapreptile.com\nclaritywallpaper.com\nclassa-z.com\nclasscms.com\nclassic023.com\nclassinpaas.com\nclassmateer.com\nclasspassincn.com\nclasspod.com\nclasspodcdn.com\nclaviercn.com\nclawchat.com\nclawhub-mirror.com\nclay-wangzhi.com\nclayidols.com\nclb6.net\nclboss.com\nclbu.club\nclbug.com\nclbz666.com\nclcgq.com\nclcindex.com\nclclibrary.com\nclcoolyun.com\nclcs.cc\nclcwwyj.com\nclcz.com\ncldfsv.com\ncldisk.com\nclean-cn.com\ncleandfd.com\ncleanupsys.com\nclear-sz.com\nclear888.com\nclearaki.com\nclearcrane.com\ncleargrass.com\nclearmediatech.com\nclearofchina.com\nclearsky360.com\ncleartone.club\nclevercn.net\ncleveroom.com\nclewm.net\nclfcgc.com\nclfdked.icu\nclfile.com\nclfzsn.com\nclgcxs.com\nclgslc.com\nclhimalayanxx.com\nclhqcyx.com\ncli.im\nclianjie.com\nclickfuntech.com\nclicksdiy.com\nclicksun.net\nclickwifi.net\nclidone.com\nclient51.com\nclifford-hospital.org\ncliffordtrading.com\ncliim.com\ncliim.net\nclijc.com\nclimedic.com\nclinbrain.com\nclivia.fun\nclj178.com\ncljport.com\ncljtscd.com\ncljtwr.com\ncljtzycw.com\nclled.com\ncllk.net\nclloz.com\nclmmw.com\nclmpg.com\nclngaa.com\ncloooud.com\ncloopen.com\ncloopen.net\ncloopm.com\ncloseli.work\nclosertb.site\nclothes178.com\nclothinggg.store\nclothjob.com\nclothr.com\nclotliu.com\nclouclip.com\ncloud-b2b.com\ncloud-beijing.com\ncloud-dahua.com\ncloud-dns.net\ncloud-frame.com\ncloud-hebi.com\ncloud-hub.co\ncloud-industry-delivery.site\ncloud-link.com\ncloud-links.net\ncloud-neofussvr.sslcs.cdngc.net\ncloud-ningbo.com\ncloud-ordos.com\ncloud-rtc.com\ncloud-rtc.net\ncloud-scdn-ns.net\ncloud-scdn-ns.tech\ncloud-scdn.com\ncloud-shenzhen.com\ncloud-shiyan.com\ncloud-sun.com\ncloud-wuhan.com\ncloud-xian.com\ncloud-xm.com\ncloud-zhaoqing.com\ncloud-zhongwei.com\ncloud21cn.com\ncloud301.net\ncloud56.net\ncloud887325.com\nclouda.com\ncloudacc1.com\ncloudacc1.net\ncloudajs.org\ncloudangelfunds.com\ncloudanqing.com\ncloudappl.com\ncloudbaoshan.com\ncloudbase.net\ncloudbeibei.com\ncloudbility.com\ncloudbinzhou.com\ncloudbool.com\ncloudcachetci.com\ncloudcc.com\ncloudcdn.net\ncloudcdns.com\ncloudcdns.net\ncloudcdnvip.com\ncloudcflare.com\ncloudchangde.com\ncloudchangsha.com\ncloudchangzhou.com\ncloudchaozhou.com\ncloudchengde.com\ncloudchengdu.com\ncloudchinese.com\ncloudchuzhou.com\ncloudcross.com\ncloudcsp.com\ncloudczs.com\nclouddalian.com\nclouddatong.com\nclouddcs.com\nclouddiffuse.xyz\nclouddig.com\nclouddn.com\nclouddongying.com\nclouddream.net\ncloudencent.com\ncloudflare-cn.com\ncloudflare.fun\ncloudflareanycast.net\ncloudflarecn.net\ncloudflareglobal.net\ncloudflareinsights-cn.com\ncloudflareip.com\ncloudflareperf.com\ncloudflareprod.com\ncloudflarestaging.com\ncloudflarestoragegw.com\ncloudfoshan.com\ncloudfront-cn.net\ncloudfuqing.com\ncloudganzhou.com\ncloudgap.net\ncloudgfw.com\ncloudgfw.net\ncloudgoing.com\ncloudguangzhou.com\ncloudguarding.com\ncloudgx.net\ncloudhaidong.com\ncloudhefei.com\ncloudhengshui.com\ncloudhin.com\ncloudhlo.com\ncloudhost.link\ncloudhua.com\ncloudhuaihua.com\ncloudhuizhou.com\ncloudhvacr.com\ncloudidaas.com\ncloudinnov.com\ncloudinward.com\ncloudiplc.com\ncloudjinan.com\ncloudjinchang.com\ncloudjingzhou.com\ncloudjining.com\ncloudjiujiang.com\ncloudkirin.com\ncloudkunming.com\ncloudleshan.com\ncloudlijiang.com\ncloudlishui.com\ncloudluohe.com\ncloudluoyang.com\ncloudlvs.com\ncloudmarket-apigw.com\ncloudmaster.hk\ncloudmeishan.com\ncloudmes.io\ncloudminds.com\ncloudmob.vip\ncloudmob.xyz\ncloudmountainproducts.com\ncloudnanan.com\ncloudnanjing.com\ncloudnanning.com\ncloudnantong.com\ncloudnapps.com\ncloudnet.world\ncloudnetb2b.com\ncloudouc.com\ncloudp.cc\ncloudpense.com\ncloudpnr.com\ncloudquanzhou.com\ncloudrmt.com\ncloudroom.com\nclouds1000.com\ncloudsanya.com\ncloudsation.com\ncloudsconverge.com\ncloudsec1.com\ncloudsec1.net\ncloudsee.com\ncloudsee.net\ncloudseeplus.com\ncloudseetech.com\ncloudserver01.com\ncloudses.com\ncloudsgis.com\ncloudshanghai.com\ncloudshaoyang.com\ncloudshenfuxingqu.com\ncloudsiping.com\ncloudsite.vip\ncloudskysec.com\ncloudstencent.com\ncloudstudio-app.net\ncloudstudio.club\ncloudstudio.net\ncloudstudio.run\ncloudstudio.work\ncloudsuqian.com\ncloudswift.cloud\ncloudtalkers.com\ncloudtangshan.com\ncloudtencents.com\ncloudtianjin.com\ncloudtomicro.com\ncloudtongchuan.com\ncloudtongliang.com\ncloudtopo.com\ncloudtrans.com\ncloudtui.com\ncloudv.cdnetworks.com\ncloudvast.com\ncloudvdn.com\ncloudvogue.com\ncloudvse.com\ncloudwalk.com\ncloudweinan.com\ncloudwise.ai\ncloudwise.com\ncloudxiangtan.com\ncloudxianyou.com\ncloudxining.com\ncloudxns.com\ncloudyanan.com\ncloudyancheng.com\ncloudyantai.com\ncloudyee.com\ncloudyinchuan.com\ncloudyo.net\ncloudyouku.com\ncloudytrace.com\ncloudytrace.org\ncloudyueyang.com\ncloudyuncheng.com\ncloudyuxi.com\ncloudzhongshan.com\ncloudzhuhai.com\nclpcdn.com\nclpga.org\nclqccy.com\nclqcgsgw.com\nclqctxc.com\nclqrmyy.com\nclroi.com\ncls-a.com\ncls-c.com\ncls.cc\nclsbhs.com\nclsgd.com\nclshanghai.com\nclsj.com\nclsshare.com\nclssn.com\nclssnews.com\nclsz-group.com\nclto.cc\ncltt.org\nclub-pc.com\nclubcarev.com\nclubhy.com\nclubske.com\ncluerich.com\nclx360.com\nclxlb.com\nclxsbj.com\nclxsczx.com\nclyiyuan.com\nclz.me\nclzd.com\nclzd.fun\nclzqm.com\nclzqxp.com\nclzt.com\nclzyqche.com\ncm-analysis.com\ncm-health.com\ncm-inv.com\ncm-iov.com\ncm-worklink.com\ncm233.com\ncm3721.com\ncm442.com\ncmacredit.org\ncmaif.com\ncmaifz.com\ncmakaoj.com\ncmanuf.com\ncmastd.com\ncmb-leasing.com\ncmbajia.com\ncmbchina.biz\ncmbchina.com\ncmbchina.net\ncmbchinawm.com\ncmbi.com.hk\ncmbimg.com\ncmbuat.com\ncmbwinglungbank.com\ncmbwlb.com\ncmbyc.com\ncmca-view.com\ncmcc.in\ncmccb2b.com\ncmcconenet.com\ncmccsim.com\ncmcgd.com\ncmcha.org\ncmcink.com\ncmcloud.org\ncmclound.com\ncmcm.com\ncmcmadmin.com\ncmcmapp.com\ncmcmcdn.com\ncmcmcmai.com\ncmcmpc.com\ncmcmsecurity.com\ncmcmserv.com\ncmcmtrans.com\ncmco-cn.com\ncmcrcw.com\ncmct22.com\ncmctea.net\ncmd.tw\ncmd5.com\ncmd5.la\ncmd5.org\ncmd8.com\ncmda-ccs.com\ncmda.net\ncmdcxls.com\ncmdpe.com\ncmdschool.org\ncmdsir.com\ncmdw.vip\ncme-am.com\ncme-cq.com\ncme021.com\ncmea-crtc.com\ncmec.com\ncmechina.net\ncmedia360.com\ncmedns.com\ncmeii.com\ncmejob.com\ncmenergyshipping.com\ncmer-ningbo.com\ncmer.com\ncmerdi.com\ncmersz.com\ncmes.org\ncmf.biz\ncmf.ltd\ncmfchina.com\ncmfish.com\ncmfspay.com\ncmft.com\ncmfu.com\ncmfwiper.com\ncmgadx.com\ncmgame.com\ncmgchengdu.com\ncmgdb.com\ncmge.com\ncmgemooc.com\ncmgn.cc\ncmgos.com\ncmgrasp.com\ncmhello.com\ncmhijs.com\ncmhk.com\ncmic.site\ncmicapm.com\ncmidc.net\ncming.com\ncmiotcd.com\ncmiyu.com\ncmjz.net\ncmlog.com\ncmltzz.com\ncmmaap.com\ncmmchn.com\ncmmim.com\ncmnetech.com\ncmnxt.com\ncmo2o.com\ncmoc.com\ncmodel.com\ncmodes.com\ncmol.com\ncmpassport.com\ncmpay.com\ncmpe360.com\ncmpedu.com\ncmpo1914.com\ncmr-co.com\ncmread.com\ncmreltd.com\ncmri.cc\ncmrid.com\ncms1924.org\ncms258.com\ncmschina.com\ncmscmc.org\ncmseasy.cc\ncmsfg.com\ncmsjournal.net\ncmsk1979.com\ncmskchp.com\ncmskcrm.com\ncmsta.org\ncmstop.com\ncmstp.com\ncmswin.com\ncmt1993.com\ncmt7.com\ncmtauto.com\ncmtdi.com\ncmtopdr.com\ncmtrq.com\ncmtv1.com\ncmu1h.com\ncmudental.com\ncmugx.com\ncmuliang.com\ncmviking.com\ncmvtc.com\ncmwb.com\ncmwin.com\ncmxrcw.com\ncmykjx.net\ncmypsc.com\ncmys.cc\ncmyunerp.com\ncmyynet.com\ncmzd.com\ncmzi.com\ncmzj.net\ncmzyk.com\ncn\ncn-5.com\ncn-833.org\ncn-ab.com\ncn-aci.com\ncn-bldc.com\ncn-bowei.com\ncn-boxing.com\ncn-c114.net\ncn-caa.com\ncn-cav.com\ncn-cddc.com\ncn-cdn1.skymansion.net\ncn-ceramic.com\ncn-cg.com\ncn-chenguang.com\ncn-comfort.com\ncn-cr.com\ncn-elite.com\ncn-em.com\ncn-ferment.com\ncn-food.net\ncn-ghtube.com\ncn-goldeneagle.com\ncn-hbs.com\ncn-healthcare.com\ncn-healthclass.com\ncn-heipa.com\ncn-huaguang.com\ncn-huar.com\ncn-hw.net\ncn-immunotech.com\ncn-kanghong.com\ncn-lance.net\ncn-lcd.com\ncn-lingte.com\ncn-lq.net\ncn-mingda.com\ncn-msedge.net\ncn-mw.com\ncn-natural.com\ncn-only.com\ncn-psy.com\ncn-railway.net\ncn-rcqc.com\ncn-roofexpert.com\ncn-school.com\ncn-sdf.com\ncn-shine.com\ncn-soft.com\ncn-tf.com\ncn-tom.com\ncn-truck.com\ncn-unitech.com\ncn-vending.com\ncn-visa.com\ncn-weida.com\ncn-wisely.com\ncn-witmed.com\ncn-xsl.com\ncn-zhentai.com\ncn-zhongrui.com\ncn.bing.com\ncn.bing.net\ncn.eset.com\ncn.mm.bing.net\ncn.net\ncn.online.standardchartered.com\ncn.pool.ntp.org\ncn.sc.com\ncn.vc\ncn.windowssearch.com\ncn0-6.com\ncn006.com\ncn010w.com\ncn0434.com\ncn0577.net\ncn0713.com\ncn0851.com\ncn0917.com\ncn11185.com\ncn12365.org\ncn156.com\ncn168.com\ncn18k.com\ncn2030.com\ncn22.net\ncn2che.com\ncn2rv.com\ncn314.com\ncn357.com\ncn360cn.com\ncn365a.com\ncn365c.com\ncn365d.com\ncn365e.com\ncn3wm.com\ncn486.com\ncn49.com\ncn4e.com\ncn51.com\ncn5135.com\ncn6szx.com\ncn880.com\ncn939.com\ncn99.com\ncnaa123.com\ncnaaa.com\ncnaaa.net\ncnaaa6.com\ncnaaa7.com\ncnaaa8.com\ncnaaa9.com\ncnaai.com\ncnabc.com\ncnaca.org\ncnacg.cc\ncnacgc.com\ncnaction.com\ncnad.com\ncnaf.com\ncnafc.org\ncnagcoin.com\ncnaidc.com\ncnaifm.com\ncnain.online\ncnaio.net\ncnaiplus.com\ncnair.com\ncnaja.com\ncnal.com\ncnalu.com\ncnambition.com\ncname-cdn.com\ncname-syd.com\ncname123.net\ncname88.com\ncnamegslb.com\ncnameip.xyz\ncnamexingzuoy.com\ncnamico.com\ncnanzhi.com\ncnaomeng.com\ncnatom.com\ncnats.com\ncnautofinance.com\ncnautonews.com\ncnautotool.com\ncnb.cool\ncnb.run\ncnb.space\ncnbabylon.com\ncnball.net\ncnbanbao.com\ncnbang.net\ncnbaosi.com\ncnbaowen.net\ncnbct.org\ncnbeinuo.com\ncnbfjt.com\ncnbidding.com\ncnbio.net\ncnbiocell.com\ncnbis.com\ncnbis.org\ncnbizmedia.com\ncnbjx.com\ncnbksy.com\ncnbkw.com\ncnblogs.com\ncnblogs.vip\ncnblower.com\ncnbm-njks.com\ncnbmltd.com\ncnbmtech.com\ncnbmys.com\ncnbnl.com\ncnboat.com\ncnbonly.com\ncnbooking.net\ncnbooks.org\ncnbp.net\ncnbrass.com\ncnbsm.com\ncnbugs.com\ncnbuses.com\ncnbysc.com\ncnbzol.com\ncnbzs.com\ncnc-bga-oca.com\ncnc-gd.net\ncnc-school.com\ncnca.net\ncncad.net\ncncaifu.com\ncncame.com\ncncanghai.com\ncncapital.net\ncncapital.org\ncncbpc.com\ncncc.bingj.com\ncnccac.com\ncnccchina.com\ncnccdn.com\ncnccea.com\ncncdh2.com\ncncdn.com\ncncdnx.com\ncncdomain.com\ncncecci.com\ncncecsci.com\ncncecyc.com\ncncfans.com\ncncgdns.net\ncncgw.org\ncnchainnet.com\ncnchangyi.com\ncnchaowei.com\ncnchemmy.com\ncncheng.com\ncnchezhan.com\ncnchospital.com\ncnchu.com\ncncico.com\ncncjichuang.com\ncncjishu.com\ncncjj.com\ncncjmjg.com\ncnclead.com\ncncljt.com\ncncloud.com\ncncma.org\ncncmrn.com\ncncms.com\ncncmun.com\ncncn.com\ncncn.net\ncncnbd.com\ncncncn.com\ncncnet.net\ncncnki.com\ncncolour.com\ncncompute.com\ncncoolm.com\ncncopter.com\ncncosmic.com\ncncotton.com\ncncourt.org\ncncqcloud.com\ncncqcy.com\ncncqsw.com\ncncqti.com\ncncr-it.com\ncncrk.com\ncncrony.com\ncncruise.com\ncncrypt.com\ncncsen.com\ncncsj.net\ncncsparetools.com\ncnctg.net\ncnction.com\ncnctrip.com\ncncwkj.com\ncncxjyu.com\ncndailu.com\ncndaizi.com\ncndao.com\ncndata.com\ncndatacom.com\ncndbl.com\ncndc-pl.com\ncndcpta.com\ncndds.com\ncndelong.com\ncndesign.com\ncndesk.com\ncndezhong.com\ncndf.net\ncndfdt.com\ncndfele.com\ncndfilm.com\ncndhl.com\ncndhotels.com\ncndi-bj.com\ncndi.com\ncndids.com\ncndingli.com\ncndingxi.com\ncndits.com\ncndl.vip\ncndledu.com\ncndmaterial.com\ncndns.com\ncndns5.com\ncndnscn.com\ncndoct.com\ncndog.net\ncndongrun.com\ncndongxiao.com\ncndoornet.com\ncndoors.com\ncndqjc.com\ncndrealty.com\ncndsnet.com\ncndtour.com\ncndw.com\ncndy.org\ncndzh.com\ncndzq.com\ncndzys.com\ncne-motor.com\ncne-om.com\ncne.com\ncnean.com\ncnecc.com\ncnechc.com\ncnecport.com\ncnedulaw.net\ncneeex.com\ncnegood.com\ncnegov.com\ncnegov.org\ncnelc.com\ncnelecom.net\ncnelite.org\ncneln.net\ncnemb.com\ncnena.com\ncneol-dns.net\ncneonl.com\ncnep001.com\ncnepaper.com\ncnepaper.net\ncnepub.com\ncnerlang.com\ncnetea.net\ncnetec.com\ncnetsec.com\ncnexp.net\ncnexpo.com\ncnexps.com\ncneyoo.com\ncnezsoft.com\ncnfanews.com\ncnfantasia.com\ncnfarasia.com\ncnfashion.net\ncnfca.com\ncnfce.net\ncnfcyy.com\ncnfczn.com\ncnfczy.com\ncnfeat.com\ncnfeol.com\ncnfeol.net\ncnfg.cc\ncnfia.com\ncnfiberhome.com\ncnfin.com\ncnfina.com\ncnfirst.net\ncnfish.com\ncnfisher.com\ncnfjwz.com\ncnfla.com\ncnflyinghorse.com\ncnfol.com\ncnfolimg.com\ncnfood.com\ncnforever.com\ncnforex.com\ncnfosale.com\ncnfpc.com\ncnfpia.org\ncnfpzz.com\ncnfq.com\ncnfrag.com\ncnfrey.com\ncnfrp.com\ncnfrp.net\ncnfruit.com\ncnfth.com\ncnfuhuaqi.com\ncnfuyin.org\ncnfxc.com\ncnfxj.org\ncnfyyj.com\ncnfzflw.com\ncngal.org\ncnganen.com\ncngaosu.com\ncngaoxiu.com\ncngb.org\ncngba.com\ncngbdl.com\ncngbol.net\ncngdhl.com\ncngin.com\ncngjtx.com\ncngma.com\ncngold.org\ncngoldres.com\ncngolf.tv\ncngongfu.com\ncngrain.com\ncngreatop.com\ncngreenfield.com\ncngsda.net\ncngsf.com\ncngslb.com\ncngslb.net\ncnguangxing.com\ncnguibao.com\ncnguibie.com\ncngulu.com\ncngwv.com\ncngwzj.com\ncngxbj.com\ncngxjy.com\ncngxsmj.com\ncngyff.com\ncngyi.com\ncnh5.net\ncnhacker.com\ncnhaifan.com\ncnhalo.net\ncnhanjia.com\ncnhantide.com\ncnhanxing.com\ncnhaomen.com\ncnhaoshengyi.com\ncnhbql.com\ncnhbstock.com\ncnhbtc.com\ncnhcb.com\ncnhd.com\ncnheader.com\ncnhemiao.com\ncnhenda.com\ncnhengkai.com\ncnhhgjx.com\ncnhhl.com\ncnhiger.com\ncnhiker.com\ncnhis.cc\ncnhis.com\ncnhli.com\ncnhls.com\ncnhlsxe.com\ncnhnb.com\ncnhongke.org\ncnhonker.com\ncnhow.net\ncnhqt.com\ncnhsjz.com\ncnhsw.net\ncnhszx.com\ncnhuafag.com\ncnhuafas.com\ncnhuanya.com\ncnhubei.com\ncnhuoche.com\ncnhvacrnet.com\ncnhwjt.com\ncnhyc.com\ncnhyjt.com\ncnhyky.com\ncnhzsc.com\ncnhzz.com\ncniao5.com\ncnibx.com\ncniceberg.com\ncnicif.com\ncnielts.com\ncniiib.com\ncnimg.elex.com\ncnimporter.com\ncninfo.net\ncninj.com\ncninnovatel.com\ncninsure.net\ncninternetdownloadmanager.com\ncnios.net\ncnipa-gd.com\ncnipa-hb.com\ncnipa-pesc.com\ncnipa-sc.com\ncnipa-tj.com\ncnipai.com\ncnipr.com\ncnirtrade.com\ncnispgroup.com\ncnitblog.com\ncniteyes.com\ncniti.com\ncnitom.com\ncnitpm.com\ncnitv.net\ncnix.cc\ncnjccrusher.com\ncnjdz.net\ncnjecc.com\ncnjf.com\ncnjffb.com\ncnjfsilk.com\ncnjgtec.com\ncnjhyg.com\ncnjiajun.com\ncnjiali.com\ncnjiaolian.com\ncnjingchu.com\ncnjingtong.com\ncnjingyigroup.com\ncnjiuze.com\ncnjiwang.com\ncnjj.com\ncnjjwb.com\ncnjkzxw.com\ncnjlc.com\ncnjnsb.com\ncnjob.com\ncnjournals.com\ncnjournals.net\ncnjournals.org\ncnjp-exp.com\ncnjpetr.org\ncnjrna.com\ncnjsdz.com\ncnjunhe.com\ncnjunnet.com\ncnjunzilan.com\ncnjurry.com\ncnjurui.com\ncnjxl.com\ncnjxol.com\ncnjyky.com\ncnjyw.net\ncnjzb.com\ncnjzgroup.com\ncnk8.com\ncnkaile.com\ncnkang.com\ncnkanshu.com\ncnkefa.com\ncnkeg.com\ncnkesai.com\ncnkeyboard.com\ncnkgraph.com\ncnkh.com\ncnki.net\ncnki.vip\ncnkicheck.info\ncnkidoi.com\ncnkidoi.net\ncnkidoi.org\ncnkinect.com\ncnkingjoy.com\ncnkis.net\ncnkivip.net\ncnkix.com\ncnkizw.com\ncnklog.com\ncnkly.com\ncnknowledge.com\ncnkosun.com\ncnkpgs.com\ncnkuai.com\ncnky.net\ncnkyz.com\ncnlampholder.com\ncnlandport.com\ncnlang.org\ncnlanhui.com\ncnlanling.com\ncnlaunch.com\ncnlaw.net\ncnlawweb.net\ncnlcg.com\ncnldedu.com\ncnldzc.com\ncnledw.com\ncnlianjie.com\ncnliequan.com\ncnlight.com\ncnlightnet.com\ncnlink8.com\ncnlinka.com\ncnlishuai.com\ncnlist.com\ncnlist.org\ncnlive.com\ncnliveimg.com\ncnljxh.com\ncnlng.com\ncnlongkou.net\ncnlot.net\ncnlso.com\ncnluan.com\ncnlubadd.com\ncnluolun.com\ncnlushan.com\ncnlwg.com\ncnmagtec.com\ncnmanhua.com\ncnmansi.com\ncnmarathon.net\ncnmarinefan.com\ncnmattson.com\ncnmcl.net\ncnmdy.com\ncnmec.biz\ncnmeiwei.com\ncnmf.net\ncnmhg.com\ncnmhh.work\ncnmia.org\ncnmie.com\ncnmill.com\ncnmineqs.net\ncnminiorange.com\ncnmjcn.com\ncnmjcn.cyou\ncnmjcn.net\ncnmjin.net\ncnmla.com\ncnmmsc.org\ncnmo.com\ncnmobile.net\ncnmods.net\ncnmods.org\ncnmoershu.com\ncnmooc.org\ncnmp3.com\ncnmsl.net\ncnmsn.com\ncnmsn.net\ncnmstl.net\ncnmtpt.com\ncnmuseum.com\ncnmysoft.com\ncnn-wali.com\ncnn100.com\ncnnaihuo.com\ncnnb.com\ncnnbfdc.com\ncnnbsa.com\ncnncbhy.com\ncnncguilin.com\ncnndns.com\ncnnetsec.com\ncnneweragx.com\ncnnfootballclub.com\ncnnic.net\ncnnice.com\ncnnmol.com\ncnnorge.com\ncnnorip.org\ncnnosolar.com\ncnnot.com\ncnnpz.com\ncnns.net\ncnntzr.com\ncnnuo.com\ncnnx.net\ncnnyye.org\ncnobin.org\ncnod.net\ncnoddt.com\ncnoic.com\ncnoil.com\ncnolnic.com\ncnolnic.net\ncnolnic.org\ncnonjx.com\ncnonline.org\ncnoocengineering.com\ncnoocltd.com\ncnool.net\ncnopendata.com\ncnops.xyz\ncnoptec.com\ncnork.com\ncnosr.com\ncnoswiki.com\ncnoutdoor.com\ncnovirt.com\ncnovtec-chamber.com\ncnpaf.net\ncnpaiwei.com\ncnpaiwo.com\ncnpanda.net\ncnparking.org\ncnpatent.com\ncnpatrickstar.com\ncnpcbidding.com\ncnpcgas.com\ncnpcmall.com\ncnpdccutter.com\ncnpenjing.com\ncnpereading.com\ncnpfjt.com\ncnpghouse.com\ncnpgjt.com\ncnphar.net\ncnpharm.com\ncnphotec.com\ncnphotos.net\ncnpickleball.com\ncnpickups.com\ncnpicl.com\ncnpiecgb.com\ncnpiecsb.com\ncnpkm.com\ncnpl-ltl.com\ncnplanetary.com\ncnplugins.com\ncnpmjs.org\ncnpoli.com\ncnponer.com\ncnpot.com\ncnpou.com\ncnpoultry.com\ncnpowdernet.com\ncnpowdertech.com\ncnpp100.com\ncnppa.org\ncnpressphoto.com\ncnprofit.com\ncnprs.com\ncnpsec.com\ncnpubc.com\ncnpubg.com\ncnpv.com\ncnpxyy.com\ncnpython.com\ncnqc.com\ncnqcc.com\ncnqd.net\ncnqiang.com\ncnqichun.com\ncnqifeng88.com\ncnqjw.com\ncnqr.org\ncnquanjing.com\ncnqwt.com\ncnradio.com\ncnraksmart.com\ncnrancher.com\ncnrceo.com\ncnrcloudfm.com\ncnrdm.com\ncnrdn.com\ncnreagent.com\ncnree.com\ncnrencai.com\ncnrepair.com\ncnrepark.com\ncnrft.com\ncnrhwq.com\ncnricc.com\ncnrih.com\ncnrj45.com\ncnrmall.com\ncnrmc.com\ncnrmobile.com\ncnrotech.com\ncnrouter.com\ncnrsj.com\ncnrubbermachinery.com\ncnrunda.com\ncnrunlin.com\ncnrust.com\ncnrv.io\ncns.hk\ncnsaes.org\ncnsal.com\ncnsanf.com\ncnsantech.com\ncnsav.com\ncnsb.org\ncnsbjy.com\ncnsc8.com\ncnsce.net\ncnscee.com\ncnsciedu.com\ncnscn.com\ncnscnet.com\ncnscore.com\ncnsdb.com\ncnsdjxw.com\ncnseay.com\ncnseeq.com\ncnsesan.com\ncnsetsail.com\ncnsfk.com\ncnshende.com\ncnshexinji.com\ncnshiri.com\ncnshjy.com\ncnshuizu.com\ncnshzm.com\ncnside.com\ncnsihai.com\ncnsikao.com\ncnsilkworm.com\ncnsimeng.com\ncnsimin.com\ncnsiwu.com\ncnskg.com\ncnskyit.com\ncnsleep.org\ncnslpa.com\ncnsnpj.com\ncnsnvc.com\ncnso.org\ncnsoc.org\ncnsoftbei.com\ncnsoftnews.com\ncnsolarwind.com\ncnsolomo.com\ncnsorl.com\ncnspeed.com\ncnspeedtest.com\ncnspeedtest.net\ncnsphoto.com\ncnsrack.com\ncnssr.org\ncnssssl.com\ncnste.org\ncnstock.com\ncnsudong.com\ncnsug.com\ncnsun.net\ncnsunbird.com\ncnsundin.com\ncnsuning.com\ncnsuv.com\ncnsuzi.com\ncnswds.com\ncnswy.net\ncnsynews.com\ncnsz.org\ncnszjlt.com\ncnszxw.com\ncnszyzz.com\ncntagore.com\ncntaiping.com\ncntally.com\ncntan.net\ncntangka.com\ncntapp.com\ncntaz.com\ncntc.com\ncntech.com\ncnten.com\ncnteno.com\ncntex-ian.org\ncntexjob.com\ncntexnet.com\ncntgol.com\ncntheory.com\ncnthinkers.com\ncntingyun.com\ncntjq.net\ncntle.com\ncntlfs.com\ncntofu.com\ncntopgear.com\ncntoplead.com\ncntour365.com\ncntplus.com\ncntrades.com\ncntranslators.com\ncntries.com\ncntronics.com\ncntslawfirm.com\ncntuw.com\ncntv.com\ncntvan.com\ncntwg.com\ncntyjt.com\ncntywhcm.com\ncnu.cc\ncnuninet.net\ncnuozu.com\ncnur.com\ncnuschool.org\ncnutcon.com\ncnvcs.com\ncnvf.com\ncnvfq.com\ncnvn.net\ncnvps.com\ncnvtech.com\ncnwa.com\ncnwaci.com\ncnwaishi.com\ncnwaking.com\ncnwansun.com\ncnwaternews.com\ncnwb.net\ncnwbwb.com\ncnwear.com\ncnweblog.com\ncnwebshow.com\ncnweiju.com\ncnweiming.com\ncnweisou.com\ncnwest.com\ncnwhc.com\ncnwindows.com\ncnwinenews.com\ncnwood-ipp.org\ncnwsgj.com\ncnwtn.com\ncnwutong.com\ncnww1985.com\ncnww9.com\ncnwxw.com\ncnwzd.com\ncnwzhd.com\ncnxad.com\ncnxcjt.com\ncnxclm.com\ncnxct.com\ncnxds.com\ncnxdw.com\ncnxfans.com\ncnxhacker.com\ncnxhyp.com\ncnxiangyan.com\ncnxiantao.com\ncnxianzai.com\ncnxiaobai.com\ncnxiaoyuan.com\ncnxibu.com\ncnxieku.com\ncnxile.com\ncnxincai.com\ncnxingoplastics.com\ncnxishui.net\ncnxk.com\ncnxklm.com\ncnxmxf.com\ncnxnmy.com\ncnxos.com\ncnxox.com\ncnxulong.com\ncnxunren.com\ncnxuntu.com\ncnxyk.com\ncnxzm.com\ncnyada.net\ncnyanglao.com\ncnyce.com\ncnydgroup.com\ncnyeig.com\ncnyibs.com\ncnyings.com\ncnyipu.com\ncnyixun.com\ncnyouhao.com\ncnypa.org\ncnys.com\ncnytgy.com\ncnyw.net\ncnywinfo.com\ncnyydj.com\ncnzcn.net\ncnzdfm.com\ncnzdhg.com\ncnzgc.com\ncnzgcec.com\ncnzhanting.com\ncnzhanzhang.com\ncnzhengmu.com\ncnzhepai.com\ncnzhhy.com\ncnzhiyuanhui.com\ncnzhjk.com\ncnzhongcha.com\ncnzhongzhuan.com\ncnzici.com\ncnzjdd.com\ncnzjj.com\ncnzjol.com\ncnzkzg.com\ncnznfy.com\ncnzps.com\ncnzrc.com\ncnzscx.com\ncnzskj.com\ncnzsqh.com\ncnzsrf.com\ncnzsyz.com\ncnzweal.com\ncnzxsoft.com\ncnzxwh.com\ncnzy56.com\ncnzyao.com\ncnzz.com\ncnzz.net\ncnzzla.com\ncnzznz.com\nco-effort.com\nco-farming.com\nco-inclusion.org\nco-mall.net\nco-mens.com\nco-plant.com\nco-sail.com\nco-trust.com\nco188.com\nco188cdn.com\nco1in.me\nco2coin.org\ncoach-edu.com\ncoach-japanese.com\ncoahr.net\ncoalcloud.net\ncoalstudy.com\ncoantec.com\ncoaoo.com\ncoastalcitycinema.com\ncoatingol.com\ncobenet.com\ncobetterfiltration.com\ncobioer.com\ncoboak.com\ncobtecinternational.com\ncobuy.net\ncobvgroup.com\ncocas.cc\ncocav.com\ncocfan.com\ncochemist.com\ncochicon.com\ncocia.org\ncoco413.com\ncocoachina.com\ncocodiy.com\ncocogoat.work\ncocohealthcare.com\ncocololo.com\ncoconuet.com\ncocoon-data.com\ncocophp.com\ncocoren.com\ncocos.com\ncocos.org\ncocos2d-x.org\ncocos2d.org\ncocos2dx.net\ncocosgame.net\ncocounion.com\ncocozq.com\ncocss.com\ncodante.org\ncode-abc.com\ncode-by.org\ncode222.com\ncode369.com\ncode666.com\ncode84.com\ncodeachange.com\ncodeages.work\ncodeaha.com\ncodebaoku.com\ncodebe.org\ncodebuddy.info\ncodebuddy.net\ncodebuddy.pro\ncodebuddy.work\ncodebus.net\ncodebye.com\ncodechina.net\ncodecomeon.com\ncodedefault.com\ncodeeeee.com\ncodeflying.net\ncodeforge.com\ncodehy.com\ncodeidc.com\ncodeios.com\ncodekissyoung.com\ncodekk.com\ncodelife.cc\ncodemart.com\ncodenews.cc\ncodeofchina.com\ncodepku.com\ncodeplayer.vip\ncodeplaygames.com\ncodeprj.com\ncodepub.com\ncoder.work\ncoder100.com\ncoder4.com\ncoder55.com\ncoderbee.net\ncoderclock.com\ncodercto.com\ncoderhuo.tech\ncoderli.com\ncodernav.com\ncoderplanets.com\ncoderprepares.com\ncodersec.net\ncodersrc.com\ncoderyuan.com\ncoderzh.com\ncodes51.com\ncodesdq.com\ncodesoft.hk\ncodesoftchina.com\ncodess.cc\ncodetop.cc\ncodewd.com\ncodeweblog.com\ncodeweixin.com\ncodewoody.com\ncodex-watch.com\ncodezh.com\ncodezyw.com\ncodigoscript.com\ncoding-io.com\ncoding-newsletter.com\ncoding-pages.com\ncoding.love\ncoding.me\ncoding.net\ncoding3min.com\ncodingapp.com\ncodingchangeworld.com\ncodingcorp.net\ncodingdao.com\ncodingke.com\ncodingsky.com\ncodingwhy.com\ncodingyang.com\ncodj.net\ncodm.com\ncodming.com\ncodmwest.com\ncodoon.com\ncodooncdn.com\ncoelmont.com\ncoeusssyp.com\ncofco-capital.com\ncofco-trust.com\ncofco.com\ncofcoet.com\ncofcofuturesintl.com\ncofcoko.com\ncofcosp.com\ncofcotrading.com\ncofeed.com\ncoffee-hdl.com\ncoffee-iot.com\ncoffee-script.org\ncoffee08.com\ncoffeecdn.com\ncoffeejp.com\ncoffeeofchina.com\ncoffeeteaimagazine.com\ncofferxm.com\ncofile.net\ncofly.com\ncofool.com\ncofortest.com\ncogcpa.org\ncogdelschool.com\ncogitosoft.com\ncognizepower.com\ncogobuy.com\ncogolinks.com\ncogonline.com\ncogskl.com\ncohim.com\ncohl.com\ncohuatech.com\ncoicjs.org\ncoin007.com\ncoin163.com\ncoinabc.com\ncoinall.live\ncoinall.ltd\ncoincsd.com\ncoindog.com\ncoinglo.store\ncoinhaven.store\ncoinnice.com\ncoinrobotics.com\ncoins-carnival.com\ncoinsky.com\ncoinvs.com\ncoinyue.com\ncokll.com\ncokutau.com\ncolahotpot.com\ncolasmart.com\ncoldextrusion.com\ncoldfunction.com\ncoldlake1.com\ncoldlar.com\ncoli688.com\ncolineapp.com\ncolinker.com\ncolipu.com\ncollaborate.download.prss.microsoft.com\ncollaborateppe.download.prss.microsoft.com\ncollect-med.com\ncollect-v6-51.la\ncollege-ing.com\ncollt.org\ncolly-pink.com\ncollycn.com\ncolobu.com\ncolocess.com\ncolor-measure.com\ncolor365.com\ncolorbird.com\ncolorfulclouds.net\ncolorfulltech.net\ncolorimeter.com\ncoloros.com\ncoloros.net\ncolortechchina.com\ncolorv.com\ncoloryr.com\ncolosseo7143.xyz\ncolourlife.com\ncolumbia-china.com\ncolumbia-kaiyuan.com\ncolumbia-wuxi.com\ncom.fi\ncom.mp\ncom.tv\ncom4loves.com\ncomac.cc\ncomake.online\ncombestlogistics.com\ncombiosz.com\ncombocn.com\ncombofin.com\ncombomen.com\ncombosm.com\ncombpm.com\ncombss.com\ncomdeep.com\ncome-bio.com\ncomebond.com\ncomebt.com\ncomefilm.com\ncomeken.com\ncomeorg.com\ncomestuff.com\ncomet.cc\ncomeyes.com\ncomflowy.com\ncomfylink.com\ncomiai.com\ncomic520.com\ncomicdd.com\ncomicer.com\ncomicfans.net\ncomicv.com\ncomicyu.com\ncomiis.com\ncominbio.com\ncomingchina.com\ncomlan.com\ncomlbs.com\ncommchina.net\ncomme.work\ncommunicatte.com\ncomnergy.com\ncomocloud.net\ncompal.com\ncompanydns.com\ncompassedu.hk\ncompevt.com\ncompgoo.com\ncomplant.com\ncomplemeny.com\ncomplexstudio.net\ncomponentcn.com\ncompose99.com\ncomposolder.com\ncompoundsemiconductorchina.net\ncomprame.com\ncomputeinit.com\ncomputer26.com\ncomra.org\ncomsenz.com\ncomseoer.com\ncomsharp.com\ncomway-mro.com\ncomweixin.com\ncomwin-sh.com\ncon-star.com\ncon.sh\ncon3c.com\nconan06.com\nconantoptical.com\nconbagroup.com\nconceptan.com\nconchdate.com\nconchdesktop.com\nconco-esd.com\nconcordiashanghai.org\nconcordmedical.com\nconcox.net\nconcretehr.com\nconda-group.com\ncondorchina.com\ncone-x.com\nconele.com\nconergas.net\nconew.com\nconextweb.com\nconfluxrpc.com\nconghua.com\ncongmiqq.com\ncongratulatiy.com\ncongresobolivariano.org\ncongrongfund.com\ncongtoo.com\ncongtoukaishi.com\ncongwuku.com\ncongyicn.com\ncongzao.com\ncongzhi.com\nconhagroup.com\nconlerpharm.com\nconodmedical.com\nconoha.vip\nconpak.com\nconpak.com.hk\nconquerom.com\nconquerore.com\nconshow.com\nconsiderice.com\nconslive.com\nconsmation.com\nconsole-integration.cdnetworks.com\nconsole.cdnetworks.com\nconstao.com\nconstar-gd.com\nconstgroup.com\ncontent4ads.com\ncontentchina.com\ncontentstore.htcvive.com\ncontrolinai.com\nconuo.com\nconvertlab.com\nconvoypayments.com\ncony-tech.com\nconyedit.com\nconyli.cc\ncoo1read.com\ncoobar.com\ncoobos.com\ncooboys.com\ncooc-china.com\ncoocaa.com\ncoocaatv.com\ncoocare.com\ncoocent.net\ncoodesker.com\ncoodir.com\ncoodove.com\ncoofandy.com\ncoofans.com\ncooffee.net\ncooh5.com\ncoohua.com\ncooioo.com\ncookcai.com\ncookicut.com\ncookie4you.com\ncookiezhong.com\ncool-admin.com\ncool-de.com\ncool-play.com\ncoolact.net\ncoolaf.com\ncoolapk.com\ncoolapkmarket.com\ncoolapkmarket.net\ncoolaw.com\ncoolban.com\ncoolbcloud.com\ncoolbuy.com\ncoolcar.cc\ncoolccloud.com\ncoolcode.org\ncoolcode.tech\ncoolcou.com\ncooldock.com\ncooldu.com\ncooleasy.net\ncoolecho.net\ncoolecloud.com\ncoolexe.com\ncoolfd.com\ncoolgaga.com\ncoolgamebox.com\ncoolgua.net\ncoolight.cool\ncoolkaba.com\ncoolkit.cc\ncoolkk.net\ncoolku.cc\ncoollf.com\ncoolmitech.com\ncoolnull.com\ncoolook.org\ncoolool.com\ncoolpad.com\ncoolping.com\ncoolqi.com\ncoolsdream.com\ncoolshark.com\ncoolsite.vip\ncoolsite360.com\ncoolsphoto.com\ncooltechsh.com\ncooltui.com\ncooltuku.com\ncooluc.com\ncoolwarmsy.com\ncoolweb.work\ncoolwei.com\ncoolxcloud.com\ncoolxigua.com\ncoolyun.com\ncoolzcloud.com\ncoomix.net\ncoomo99.com\ncoomodel.com\ncoonote.com\ncooole.com\ncoooolfan.com\ncoooz.com\ncoopcc.com\ncooperningbo.com\ncoor.work\ncoordsx.com\ncootek.com\ncootekos.com\ncootekservice.com\ncoovee.com\ncoovee.net\ncoowor.com\ncooyun.com\ncop.cdnetworks.com\ncopl.com.hk\ncopperalliance.asia\ncopperhome.net\ncopyedu.com\ncopyfuture.com\ncopythelink.com\ncopywatchstyle.com\ncor-games.com\ncoralset.com\ncore-biopharma.com\ncorebai.com\ncoreesports.net\ncorehalo.com\ncoreldrawchina.com\ncoremakingsolutions.com\ncorerain.com\ncorex-design.com\ncorgichina.com\ncorlercar888.com\ncoros.com\ncorp-email.com\ncorp.cc\ncorpallies.com\ncorpautohome.com\ncorpease.net\ncorpize.com\ncorpring.com\ncorreoc.asia\ncoryes.com\ncos-beauty.com\ncos-show.com\ncos126.com\ncosbuluo.com\ncoschat.com\ncosco-logisticsqd.com\ncosco.com\ncoscon.com\ncoscoshipping.com\ncoscoshippingenergy.com\ncosdnsresolve-wxzf.com\ncosdnsresolve.com\ncosedm.com\ncosen.net\ncoshelper.com\ncoshin.com\ncoship.com\ncosideabl.com\ncosinedu.com\ncosineg.com\ncosize.com\ncosjiang.com\ncoslinic.com\ncosmileonly.com\ncosmo-lady.com\ncosmoplat.com\ncosmoschem.com\ncosmosource.com\ncosmx.com\ncosoar.com\ncosofteck.com\ncosplay8.com\ncosplayla.com\ncostku.com\ncostuan.com\ncosunter.com\ncosxu.com\ncosyjoy.com\ncosz.com\ncotek-robotics.com\ncotong.com\ncotticoffee.com\ncottonchina.org\ncotv.tv\ncouas.com\ncouns.com\ncouplefish.com\ncouponover.info\ncouqiao.net\ncourage-magnet.com\ncoursegraph.com\ncourtesya.com\ncousz-gd.com\ncovcec.com\ncoverequire.com\ncoverweb.cc\ncovinda.com\ncovoart.com\ncovtv.com\ncowarobot.com\ncowcs.com\ncowealth.com\ncowellhealth.com\ncowlevel.net\ncowrycare.com\ncowtransfer.com\ncoyigroup.com\ncoyis.com\ncoyotebio-lab.com\ncoyuk.com\ncoyuns.net\ncoze.site\ncozonenet.com\ncp-keji.com\ncp0556.com\ncp121.com\ncp2804.com\ncp365.org\ncp7iys8fp.com\ncpa51.com\ncpaddress.com\ncpaed.org\ncpajia.com\ncpakg.com\ncpass.com\ncpatrk.net\ncpbao.com\ncpc.cc\ncpcaauto.com\ncpcadata.com\ncpcccac.com\ncpcell.com\ncpcep.com\ncpciei.org\ncpcni.net\ncpcphone.com\ncpcw.com\ncpdad.com\ncpdaily.com\ncpdasoft.com\ncpdhd.com\ncpdyj.com\ncpe-fund.com\ncpecc.net\ncpeccgx.net\ncpema.org\ncpeol.net\ncpepgc.com\ncpfia.org\ncpfwzs.com\ncpg-motor.com\ncphfgg.com\ncphiic.com\ncphoto.net\ncphoto.org\ncphu.org\ncpiano.com\ncpiaoju.com\ncpiccdn.com\ncpicfiber.com\ncpicfunds.com\ncpidi.com\ncpihualai.com\ncpitsh.org\ncpixe.com\ncpjltx.com\ncplamc.com\ncplotus.com\ncpm1000.com\ncpmiao.net\ncpmrc.org\ncpnalb.org\ncpo.xyz\ncpo2o.com\ncpolar.com\ncpolive.com\ncpooo.com\ncposchool.com\ncpp-prog.com\ncpp114.com\ncpp32.com\ncppb-wg.com\ncppblog.com\ncppc123.com\ncppdebug.com\ncppfoto.com\ncpph.com\ncpplay.com\ncppoly.com\ncpppf.org\ncppszw.com\ncpqrmyy.com\ncproton.com\ncps1688.com\ncps800.com\ncpsbeijing.org\ncpse.com\ncpsenglish.com\ncpt-world.com\ncpt123.com\ncpt564.com\ncptae.com\ncptc56.com\ncptmcp.com\ncptn.tv\ncptv2018.com\ncpu114.com\ncpu668.com\ncpu7.com\ncpubbs.com\ncpuchaopin.com\ncpudj.com\ncpuh2.com\ncpury.com\ncpuxn.com\ncpwlx.com\ncpwnews.com\ncpwzb.com\ncpzls.com\ncpzst.com\ncpzyrj.com\ncq-cable.com\ncq-city.com\ncq-ct.com\ncq-ct.tech\ncq-eatge.com\ncq-gyw.com\ncq-md.com\ncq-ns.com\ncq-pf.com\ncq-qqcg.com\ncq-rongjia.com\ncq-sound.com\ncq-tencentclb.cloud\ncq-tencentclb.com\ncq-tencentclb.net\ncq-tencentclb.work\ncq-wnl.com\ncq-yj.com\ncq-yt.com\ncq168.com\ncq315house.com\ncq3a.com\ncq5135.com\ncq556.com\ncq6.com\ncq69.com\ncq6969.com\ncq8.com\ncq96868.com\ncq9yuan.com\ncqaaa.com\ncqace.com\ncqaflopack.com\ncqai.vip\ncqaihua.com\ncqaky.com\ncqallcure.com\ncqange.com\ncqangel.com\ncqanmei.com\ncqapg.com\ncqaso.com\ncqatec.com\ncqbafumen.com\ncqbayy.com\ncqbbzyy.com\ncqbdfeng.com\ncqbfc.com\ncqbm2007.com\ncqbnedu.com\ncqbnjsjt.com\ncqbnrc.com\ncqbntv.com\ncqbode.com\ncqbondrite.com\ncqbosai.com\ncqbshyy.com\ncqbwjc.net\ncqbys.com\ncqc-ts.com\ncqc.so\ncqcartest.com\ncqcasin.com\ncqcatr.com\ncqcb.com\ncqcbank.com\ncqcbd-jbc.com\ncqcbl.com\ncqccci.com\ncqccn.com\ncqccsic.com\ncqcdbs.com\ncqcdc.org\ncqcdxl.com\ncqcfe.com\ncqchinabase.com\ncqchuangjing.com\ncqcico.com\ncqcig.com\ncqciig.com\ncqcitymedia.com\ncqcjnj.com\ncqcjxx.com\ncqcklib.com\ncqcmi.com\ncqcmxy.com\ncqcoal.com\ncqcp.net\ncqcpt.com\ncqcrane.com\ncqcrossmobil.com\ncqcsic.com\ncqcssk120.com\ncqcsskyy.com\ncqcy.com\ncqcyhuagong.com\ncqcyxyxh.com\ncqczx.com\ncqdahan.com\ncqdai.com\ncqdailynews.com\ncqdaming.com\ncqdashun.com\ncqdayou.com\ncqdc.com\ncqdcg.com\ncqdcgj.com\ncqddpaint.com\ncqddyl.com\ncqddzx.com\ncqdent.com\ncqdggs.com\ncqdianxin.com\ncqdic.com\ncqdingqi.com\ncqdingyan.com\ncqdj.cc\ncqdjzyy.com\ncqdkj.com\ncqdky.com\ncqdongnanhospital.com\ncqdongyang.com\ncqdpt.com\ncqdting.com\ncqduoliu.com\ncqe.cc\ncqeca.org\ncqedo.com\ncqedu.online\ncqeec.com\ncqelyy.com\ncqem.net\ncqemme.com\ncqenergy.com\ncqest.com\ncqetcvip.com\ncqeyeyy.com\ncqfdcxy.com\ncqfesco.com\ncqfic.com\ncqfind.com\ncqfire.com\ncqfjly.com\ncqflct.com\ncqfmbank.com\ncqfus.com\ncqfuyou.com\ncqfygzfw.com\ncqgaoke.com\ncqgc.com\ncqgdcy.com\ncqgdkf.com\ncqgearbox.com\ncqgewerv.com\ncqggwx.com\ncqggx.com\ncqggzy.com\ncqgh.org\ncqgj.net\ncqglcj.com\ncqglion.com\ncqgmfw.com\ncqgnhg.com\ncqgrain.com\ncqgreat.com\ncqgsdb.com\ncqgtjt.com\ncqguangren.com\ncqguangrong.com\ncqguli.com\ncqguohua.com\ncqguorui.com\ncqgwd.com\ncqgwy.org\ncqgwzx.com\ncqgxjscy.com\ncqgxqsmartedu.com\ncqgyjsxy.com\ncqgyjt.com\ncqgymsxx.com\ncqgyzone.com\ncqgz.com\ncqgzdlgc.com\ncqgzf.net\ncqh2o.com\ncqhac.com\ncqhansa.com\ncqhaofeng.com\ncqhasin.com\ncqhbcy.net\ncqhbzh.com\ncqhejuda.com\ncqhengbogroup.com\ncqhengding.com\ncqhengr.com\ncqhewin.com\ncqhhm.com\ncqhimalayanky.com\ncqhjj.com\ncqhjjt.com\ncqhjyzl.com\ncqhkcdns.com\ncqhkyy.com\ncqhma.com\ncqhnbsb.com\ncqhncd.com\ncqhongshuangda.com\ncqhouse.net\ncqhrjd.com\ncqhsjs.com\ncqhtu.com\ncqhushan.com\ncqhwr.com\ncqhwzs.com\ncqhxdbj666.com\ncqhxeye.com\ncqhxf.com\ncqhxfk.com\ncqhxgf.com\ncqhxyy.com\ncqhxzz.net\ncqhyd.com\ncqhydraulic.com\ncqhyjtss.com\ncqhyky.com\ncqhylab.com\ncqhyyy120.com\ncqhz510.com\ncqhzjy.com\ncqiic.com\ncqiivc.com\ncqindex.com\ncqink.com\ncqinstinct.com\ncqioe.com\ncqios.com\ncqiot.cc\ncqipa.com\ncqipc.net\ncqirobot.com\ncqiss.com\ncqit.com\ncqiter.com\ncqiti.com\ncqitic.com\ncqivc.com\ncqj.net\ncqjat.com\ncqjbrc.com\ncqjchg.com\ncqjdc.com\ncqjdgc.com\ncqjdgyx.com\ncqjdjczx.com\ncqjet.com\ncqjgx.com\ncqjhfk.com\ncqjhgczx.com\ncqjhsy.com\ncqjhtxy.com\ncqjiangxue.com\ncqjiaxian.com\ncqjieli.com\ncqjiexun.com\ncqjingyu.com\ncqjizhi.com\ncqjj.net\ncqjjnet.com\ncqjkhb.com\ncqjlyy.net\ncqjnjs.com\ncqjnkgjt.com\ncqjnw.org\ncqjob.com\ncqjpyg.com\ncqjsaq.com\ncqjsd.com\ncqjtedu.com\ncqjtsn.com\ncqjunan.com\ncqjx.net\ncqjy.com\ncqjyfcyy.com\ncqjyhuida.com\ncqjyn.com\ncqjyxh.com\ncqjzxy.com\ncqjzy.com\ncqkangshan.com\ncqkaogu.com\ncqkbjd.com\ncqkcyy.com\ncqkdtui1.com\ncqkeguan.com\ncqkejufu.com\ncqkepu.com\ncqkerui.com\ncqkexun.com\ncqkeye.com\ncqkfb.com\ncqkhjt.cc\ncqkjb.com\ncqkjwx.com\ncqkjzyxy.com\ncqknls.com\ncqkqinfo.com\ncqkqjt.com\ncqkundian.com\ncqkx.com\ncqkxhospital.com\ncqkytech.com\ncqkytq.com\ncqlaifu.com\ncqlandtower.com\ncqlba.com\ncqlbjg.com\ncqld.com\ncqlfn.com\ncqlhyy.com\ncqlibo.com\ncqlilan.com\ncqlincom.com\ncqlinrui.com\ncqliving.com\ncqljhr.com\ncqljjrjd.com\ncqljjt.com\ncqljmjs.com\ncqljzp.com\ncqlkuav.com\ncqllfood.com\ncqlonghoo.com\ncqloway.com\ncqlp.com\ncqlpa.com\ncqls.work\ncqlummy.com\ncqlxzjzx.com\ncqlyckj.com\ncqlydc.com\ncqlys.com\ncqlyy.com\ncqlzz.com\ncqmaika.com\ncqmama.net\ncqmanzhong.com\ncqmarathon.com\ncqmas.com\ncqmbkq.com\ncqmbyy.com\ncqmcu.com\ncqmeidoing.com\ncqmeiyuan.com\ncqmiaoa.com\ncqmiaochi.com\ncqminghua.com\ncqmlmh.com\ncqmmgo.com\ncqmmjt.com\ncqmpf.com\ncqmsdq.com\ncqmstech.com\ncqmtek.com\ncqmtswkj.com\ncqmva.com\ncqmw.com\ncqmylike.com\ncqmzj.com\ncqnc.cc\ncqncnews.com\ncqndl.com\ncqnetcn.com\ncqnews.net\ncqnhn.com\ncqnht.com\ncqnkhz4j8nmhqp.com\ncqnongzi.com\ncqntdq.com\ncqnurse.com\ncqnx.com\ncqnydb.com\ncqooc.com\ncqpac.com\ncqpartek.com\ncqpbx.com\ncqpearlriver.com\ncqpeidu.com\ncqpeixin.com\ncqpet120.com\ncqpfh.com\ncqpfjt.com\ncqpfmz.com\ncqph.com\ncqphar.com\ncqpix.com\ncqpost.com\ncqpump.com\ncqpwt.com\ncqpwy.com\ncqpwz.com\ncqpx.cc\ncqpzjc.com\ncqqcjzsj.com\ncqqgsafe.com\ncqqgx.com\ncqqianggu.com\ncqqiujing.com\ncqqiyi.com\ncqqjyy.com\ncqqnb.net\ncqqnjt.com\ncqqp.com\ncqqsys.com\ncqqsyy.com\ncqqttk.com\ncqqxxny.com\ncqrafk.com\ncqrailway.com\ncqranxie.com\ncqrc.net\ncqrcb.com\ncqrcdsc.com\ncqrcfl.com\ncqrfym.com\ncqrig.com\ncqrksw.com\ncqrm.com\ncqrmb.com\ncqrmrq.com\ncqrqdx.com\ncqrwys.com\ncqryxfp.com\ncqs-hm.com\ncqsaea.com\ncqsamr.com\ncqscmy.net\ncqsdei.com\ncqsdzy.com\ncqsfqcpj.com\ncqsfybjy.com\ncqsgczjxx.org\ncqshenou.com\ncqshic.com\ncqship.com\ncqshoucheng.com\ncqshrq.com\ncqshulan.com\ncqshyzx.com\ncqsifang.com\ncqsj365.com\ncqsjb.com\ncqsjbc.com\ncqsjd.xyz\ncqsjky.com\ncqsjnzx.com\ncqsjsyy.com\ncqslhjx.com\ncqslim.com\ncqslim.net\ncqsms.net\ncqsoft.org\ncqsongshan.com\ncqspx.com\ncqsq.com\ncqssgf.com\ncqsta.com\ncqstgxy.com\ncqstjt.com\ncqstjzx.com\ncqstudents.com\ncqsuoqi.com\ncqswah.com\ncqswjjx.com\ncqswxcy.com\ncqsx.net\ncqsxdb.com\ncqsxedu.com\ncqsxhb.com\ncqsxjsj.com\ncqsxrj.com\ncqsxsl.com\ncqsyjq.com\ncqsyjz.com\ncqsymj.com\ncqsyz.com\ncqszfy.com\ncqsznyy.com\ncqsztech.com\ncqszyy.com\ncqszyyhyxh.com\ncqszzs.com\ncqt-top.com\ncqtalent.com\ncqtally.co\ncqtally.com\ncqtanlaoda.com\ncqtaotan.com\ncqtbyy.com\ncqtctech.com\ncqtea.com\ncqtfjs.com\ncqtiantai.com\ncqtieba.com\ncqtkjj.com\ncqtkyy.com\ncqtl.org\ncqtlskj.com\ncqtn.com\ncqtnfs.com\ncqtqzx.com\ncqtrans.com\ncqtransit.com\ncqtrend.com\ncqtresearch.com\ncqtrvl.com\ncqttech.com\ncqtuoda.com\ncqtxyy.com\ncqtyanglao.com\ncqtynpx.com\ncquae.com\ncquc.net\ncqud.net\ncqudp.com\ncqukf.com\ncqulit.com\ncquni.com\ncqvantai.com\ncqvavo.com\ncqvcet.com\ncqvip.com\ncqvip.vip\ncqvist.net\ncqw.cc\ncqwanli.com\ncqwanshang.com\ncqwater.net\ncqwbdq.com\ncqwbgg.com\ncqweh.com\ncqwenbo.com\ncqwest.com\ncqwin.com\ncqwlg.com\ncqwlzz.com\ncqwsnews.net\ncqwsrmyy.com\ncqwszjs.com\ncqwtqc.com\ncqwtqx.com\ncqwulong.net\ncqwuxi.com\ncqwxnews.net\ncqwzax.com\ncqwzwh.com\ncqwzwl.com\ncqxayl.com\ncqxcx.net\ncqxdfpr.com\ncqxdjgxx.com\ncqxdnzyy.com\ncqxdyy.com\ncqxfxh.com\ncqxh120.com\ncqxhdc.com\ncqxhyz.com\ncqxianfeng.com\ncqxiheng.com\ncqxinge.com\ncqxingyun.com\ncqxinhua.com\ncqxinshuo.com\ncqxitou.com\ncqxj-hospital.com\ncqxjr.net\ncqxm-group.com\ncqxnyy.com\ncqxpxt.com\ncqxqz.com\ncqxshs.com\ncqxsxt.com\ncqxszx.net\ncqxtcx.com\ncqxwdb.com\ncqxwtx.com\ncqxxly.net\ncqxxt.com\ncqxyfl.com\ncqxygf.com\ncqxyjc.com\ncqxzxy.com\ncqybhr.com\ncqybxl.com\ncqyc.com\ncqyc.net\ncqycqzyy.com\ncqydgz.com\ncqydxy.com\ncqyestar.com\ncqyfjs.com\ncqyfkgjt.com\ncqyfsk.com\ncqygfm.com\ncqyhpx.com\ncqyhss.com\ncqyhyq.com\ncqyingang.com\ncqyisen.com\ncqyixiao.com\ncqyljgxx.com\ncqym120.com\ncqynzz.com\ncqyongfeng.com\ncqyouloft.com\ncqyqjz.com\ncqysgyy.com\ncqysp.com\ncqysxx.com\ncqysxy.com\ncqyti.com\ncqytjt.com\ncqytjzgc.com\ncqytsw.com\ncqytu.com\ncqytyk.com\ncqyu.com\ncqyuanjing.com\ncqyuhong.com\ncqyunshi.com\ncqyuxing.com\ncqyuzhoujx.com\ncqyx999.com\ncqyxlx.com\ncqyxzz.com\ncqyygz.com\ncqyyjc.com\ncqyysx.com\ncqyyzy.com\ncqyznews.com\ncqzbcg.com\ncqzcjw.com\ncqzct.com\ncqzdrl.com\ncqzgl.com\ncqzgzdh.com\ncqzhihaolaw.com\ncqzhongxingyuan.com\ncqzhqyjt.com\ncqzikao.com\ncqzike.com\ncqzjt.com\ncqzk.net\ncqzkjs.com\ncqzls.com\ncqzoan.com\ncqzq6.com\ncqzql.com\ncqzrsh.com\ncqzskj.com\ncqzuxia.com\ncqzww.com\ncqzxmoto.com\ncqzxrmyy.com\ncqzxwx.com\ncqzxzlyy.com\ncqzyktqxxh.com\ncqzymj.com\ncqzyx.net\ncqzyyd.com\ncqzyzs.com\ncqzz.net\ncqzzcd.com\ncr-artisan.com\ncr-cts.com\ncr-expo.com\ncr-leasing.com\ncr-newenergy.com\ncr-nielsen.com\ncr-power.com\ncr11gcsgd.com\ncr15g.com\ncr173.com\ncr175.com\ncr18g.com\ncr19gj.com\ncr20g.com\ncr6868.com\ncr8gc.com\ncrabchina.com\ncracmedu.org\ncraer.com\ncraftcontact.com\ncraftria.com\ncraftsb2b.com\ncraigmaher.net\ncraim.net\ncrandom.com\ncrane-china.cc\ncrane-net.com\ncranewh.com\ncrash.work\ncravatar.com\ncrazepony.com\ncrazybig.fun\ncrazyenglish.com\ncrazyflasher.com\ncrazyjs.org\ncrazyming.com\ncrazymoneys.com\ncrazyones.world\ncrazyphper.com\ncrazypm.com\ncrazyrtc.com\ncrazywong.com\ncrbbg.com\ncrbc.com\ncrbeverage.com\ncrbiopharm.com\ncrc-bj.com\ncrc.com.hk\ncrc.hk\ncrc81.com\ncrcapm.com\ncrcccl.com\ncrccfl.com\ncrccig.com\ncrcctc.com\ncrcebg.com\ncrcegsd.com\ncrcement.com\ncrcgas.com\ncrchi.com\ncrclogistics.com\ncrcrfsp.com\ncrcsz.com\ncrct.com\ncrctrust.com\ncrdyf.com\ncre.net\ncread.com\ncreality.com\ncrealitycloud.com\ncreatby.com\ncreatecdigital.com\ncreatepoint.qti.qualcomm.com\ncreatew.com\ncreatewf.com\ncreati5.com\ncreation-bj.com\ncreationventure.com\ncreative-micro.com\ncreativityeco.com\ncreator-sh.com\ncreatreme.com\ncreatunion.com\ncreavidia.com\ncrec4.com\ncrec4mc.com\ncrecexpo.com\ncrecg-jt.com\ncrecg.com\ncrecgi.com\ncrechan.com\ncrecohe.com\ncrecshif.com\ncrectgroup.com\ncrecu.com\ncred.com\ncredibleglass.com\ncredit100.com\ncreditcn.com\ncredithc.com\ncreditrepairjournal.com\ncreditsailing.com\ncreditzuji.com\ncreegc.com\ncreflux.net\ncreia.net\ncreo-support.com\ncrep-led.com\ncrepcrep.com\ncreplus.net\ncrestv.com\ncret-bio.com\ncrewcn.com\ncrfchina.com\ncrfsdi.com\ncrgdpharm.com\ncrgecent.com\ncrggcn.com\ncrgkxl.com\ncrgy.com\ncrhealthcare.com.hk\ncri-grandera.com\ncriarabic.com\ncric.com\ncric2009.com\ncricbigdata.com\ncricchina.com\ncrieasyfm.com\ncrienglish.com\ncriezfm.com\ncrifan.org\ncrifst.com\ncrimoon.net\ncrimoscow.com\ncrinductance.com\ncrisydney.com\ncriwashington.com\ncrjfw.com\ncrl.globalsign.net\ncrl.kaspersky.com\ncrlf0710.com\ncrlg.com\ncrlintex.com\ncrm.cc\ncrm1001.com\ncrmch.com\ncrmclick.com\ncrmeb.com\ncrmeb.net\ncrmicro.com\ncrmip.com\ncrmyy.com\ncrnews.net\ncrodigy.com\ncrodigynat.com\ncroot.com\ncroplifechina.org\ncross-border-public.com\ncross-zone.com\ncrossborderlion.com\ncrossingstar.com\ncrossingstarstudio.com\ncrossmo.com\ncrossoverchina.com\ncrosswaycn.com\ncrov.com\ncrown-chain.com\ncrowndth.com\ncrowya.com\ncrpaas.com\ncrpcg.com\ncrpharm.com\ncrracelve.com\ncrrcgc.cc\ncrrjz.com\ncrs811.com\ncrsc.cc\ncrscm.com\ncrsky.com\ncrsn168.com\ncrtc-hr.com\ncrtdri.com\ncrtg.com\ncrtrcloud.com\ncrtrust.com\ncrtyhr.com\ncrucg.com\ncruelcoding.com\ncrukings.com\ncrvc.com\ncrvic.org\ncrwnt.com\ncrx4.com\ncrxdl.com\ncrxsoso.com\ncry33.com\ncrysound.com\ncrystaledu.com\ncrystalskeleton.com\ncryuantafund.com\ncs-air.com\ncs-airport.com\ncs-cjl.com\ncs-cydq.com\ncs-eval.com\ncs-jinwei.com\ncs-pos.com\ncs-video.com\ncs-xf.com\ncs0799.com\ncs090.com\ncs12333.com\ncs12d.com\ncs2-aipn.com\ncs27.com\ncs2c.com\ncs2ccloud.com\ncs2pw.com\ncs30.net\ncs451.com\ncs48.com\ncs528.com\ncs53.com\ncs6zhong.com\ncsaimall.com\ncsair.com\ncsairdutyfree.com\ncsairholiday.com\ncsairshop.com\ncsapa.org\ncsarw.org\ncsaspx.com\ncsau.com\ncsbes.com\ncsbew.com\ncsbme.org\ncsbtv.com\ncsbyjy.com\ncsc100.com\ncsc108.com\ncsc86.com\ncscac.net\ncscan.co\ncscatv.com\ncscdf.org\ncscec.com\ncscec1b-bj.com\ncscec1b.net\ncscec7b.com\ncscec81.com\ncscec8bud.com\ncscecbjadi.com\ncscecparking.com\ncsci.hk\ncscjedu.com\ncsclc.com\ncscmgg.com\ncsct-china.com\ncscxsemi.com\ncsd568.com\ncsdc.info\ncsdczx.com\ncsdeshang.com\ncsdewater.com\ncsdh.com\ncsdhe.com\ncsdhxx.com\ncsdiy.wiki\ncsdk.com\ncsdn.com\ncsdn.net\ncsdn.work\ncsdyjs.net\ncsdyx.com\ncse-bidding.com\ncsea1991.org\ncsebank.com\ncsec-tencentclb.cloud\ncsec-tencentclb.com\ncsec-tencentclb.net\ncsec-tencentclb.work\ncsemc.com\ncseptc.net\ncserveriip.com\ncserwen.com\ncseve.com\ncsflgg.com\ncsflwl.com\ncsfounder.com\ncsfreezer.com\ncsftyy.com\ncsfudu.com\ncsgasgroup.com\ncsgcjxxh.com\ncsgcyy.com\ncsgdjtxy.com\ncsgfjc.com\ncsghy.com\ncsgjhzzx.com\ncsgjjgxx.com\ncsgjjt.com\ncsgkjt.com\ncsgocn.net\ncsgongshui.com\ncsgpc.org\ncsgwexpo.com\ncsgxyl.com\ncshaodu.com\ncsharpkit.com\ncshbl.com\ncshbxy.com\ncshcp.com\ncshijian.com\ncshixi.com\ncshltx.com\ncshnac.com\ncshnkj.com\ncshrzc.com\ncshslf.com\ncshst.com\ncshuanyu.com\ncshufanyi.com\ncshxdc.com\ncshxschool.com\ncshypg.com\ncshzywkj.com\ncsiamd.com\ncsic-711.com\ncsic612.com\ncsic6801.com\ncsic76.com\ncsicmakers.com\ncsicpl.com\ncsictec.net\ncsiea.net\ncsig158.com\ncsiic.com\ncsilp.com\ncsimcc.com\ncsisolar.com\ncsj-stcloud.com\ncsjcs.com\ncsjdeveloper.com\ncsjgwy.com\ncsjiexin.com\ncsjitian.com\ncsjkjs.com\ncsjkjt.com\ncsjmould.com\ncsjmzy.com\ncsjplatform.com\ncsjqfz.com\ncsjsdz.com\ncsjtys.net\ncsjtz.com\ncsjunwei.com\ncsjvision.com\ncsjwang.com\ncskaoyan.com\ncskefu.com\ncskjgc.com\ncskliz.com\ncskrl.com\ncsksoft.net\ncskx.com\ncskxjk.com\ncslbbs.net\ncslfans.com\ncslgfd.com\ncslkjt.com\ncslou.com\ncslxzx.com\ncslyrc.com\ncsmadik.com\ncsmall.com\ncsmama.net\ncsmar.com\ncsmbcx.com\ncsmc-cloud.com\ncsmedlab.com\ncsmh-semi.com\ncsmjzs.com\ncsmscon.com\ncsmxh.com\ncsmzxy.com\ncsnbgsh.com\ncsnhjyxx.com\ncsnhszjy.com\ncsnhw.com\ncsnzxl.com\ncsoly.com\ncsomdmyxy.com\ncsomick.com\ncspasz.org\ncspbj.com\ncspcbaike.com\ncspda.net\ncspengyuan.com\ncspiii.com\ncspmk.com\ncspplaza.com\ncspro.org\ncspruc.com\ncsptia.org\ncsqsg.com\ncsrcare.com\ncsrcbank.com\ncsrcsc.com\ncsrda.com\ncsres.com\ncsrgm.com\ncsrlzyw.com\ncsrunhe.com\ncss-js.com\ncss3er.com\ncss6.com\ncss88.com\ncssaaa.com\ncssbe.com\ncssbkj.com\ncssbyy.com\ncssccq.com\ncsscia.com\ncsscmall.com\ncssdsyy.com\ncsseplastic.com\ncssf.cc\ncssf.com\ncssf.net\ncssforest.org\ncssfybjy.com\ncssg-ahi.com\ncsshenda.com\ncsshenyu.com\ncsshjdxh.com\ncsshuobo.com\ncssjzy.com\ncsslcloud.net\ncssmagic.net\ncssmoban.com\ncssqt.com\ncssthxx.com\ncsstoday.net\ncssuez.com\ncssywgy.com\ncsszone.net\ncst119.com\ncst6.com\ncstccloud.org\ncstcloud.net\ncstcq.com\ncsteamian.work\ncstech.ltd\ncsteelnews.com\ncstexun.com\ncsthxx.com\ncstianye.com\ncstimer.net\ncsto.com\ncstonepharma.com\ncstong.net\ncstparking.com\ncstriker1407.info\ncstuotian.net\ncstxgz.com\ncsuboy.com\ncsuct.com\ncsudgroup.com\ncsuedu.com\ncsundec.com\ncsunews.com\ncsur.fun\ncsvii.com\ncsvw.com\ncsw333.com\ncswamp.com\ncswef.org\ncsweigou.com\ncsweiwei.com\ncswszy.com\ncsxbank.com\ncsxdf.com\ncsxiangfeng.com\ncsxingfutemple.org\ncsxingya.com\ncsxinhua.com\ncsxinshun.com\ncsxinxu.com\ncsxjedu.com\ncsxjzx.com\ncsxsjc.com\ncsxsrcw.com\ncsxww.com\ncsy17.com\ncsyamei.com\ncsyestar.com\ncsygz5c6qk.best\ncsykgs.com\ncsylxy.com\ncsylzx.net\ncsyrtcs.com\ncsysgz.com\ncsytv.com\ncsyunkj.com\ncsyuwei.com\ncszec.com\ncszhgjzx.com\ncszhjt.com\ncszhonghui.com\ncszhxf119.com\ncszit.com\ncszjgj.com\ncszjzx.com\ncszkzn.com\ncszlgs.com\ncszn120.com\ncszpra.com\ncszsjy.com\ncsztv.com\ncszuxing.com\ncszx.com\ncszyedu.com\ncszyjsxx.com\ncszykt.com\nct-cdm.com\nct-emall.com\nct-laser.com\nct-parking.com\nct108.com\nct52.com\ncta613.org\nctaca.com\nctags.net\nctalive.com\nctans.com\nctaweb.org\nctb50.com\nctbcdn.com\nctbcleasing.com\nctbjia888.com\nctbpsp.com\nctbyq.net\nctc-ctc.com\nctc-zj.com\nctc.lol\nctc100.com\nctcai.com\nctcdn.com\nctcdn.net\nctcdnov.net\nctce8.com\nctcefive.com\nctcisz.com\nctcloudmeeting.com\nctcmo.com\nctcnj.net\nctcnn.com\nctcnpa.com\nctcontents.com\nctcsci.com\nctcsz.com\nctcwri.org\nctcxzgs.com\nctdatacare.com\nctdcdn.com\nctdcn.com\nctdisk.com\nctdns.net\nctdsb.com\nctdsb.net\nctdzsk.com\nctea-ctea.org\ncteaw.com\ncteb.com\nctecdcs.com\nctech-alpha.com\ncteic.com\nctex.org\nctexcel.com\nctexcel.com.hk\nctexw.com\nctfhub.com\nctfile.com\nctfile.net\nctfmall.com\nctfo.com\nctftools.com\nctfund.com\nctgapp.com\nctgcdn.com\nctghealthy.com\nctghr.com\nctghro.com\nctgia.com\nctgne.com\ncthcdn.com\ncthcdn.net\ncthgjx.com\ncthh9mnv.com\ncthhmu.com\ncthj-co.com\ncthuwork.com\ncthuwork.net\ncthy.com\ncti-cert.com\nctibet.com\nctic-lab.com\nctic-labs.com\nctiea.com\nctiforum.com\nctiku.com\nctils.com\nctimall.com\nctime.com\nctiot.info\nctis-cn.com\nctjin.com\nctjituan.com\nctjl.net\nctjsoft.com\nctkon.com\nctkq.com\nctlcdn.com\nctlcdn.net\nctldl.windowsupdate.com\nctlife.tv\nctma.net\nctmcq.com\nctmgid.com\nctmon.com\nctmwow.com\nctn1986.com\nctnma.com\nctntech.com\nctnyypt.com\nctnz.net\nctobsnssdk.com\nctocio.com\nctoclub.com\nctongonline.com\nctoutiao.com\nctovcdn.com\nctpdd.com\nctr-media.info\nctrcw.net\nctrender.com\nctrip-ttd.hk\nctrip.co.id\nctrip.co.kr\nctrip.com\nctrip.my\nctrip.sg\nctripbiz.com\nctripbuy.hk\nctripc.com\nctripcorp.com\nctripgslb.com\nctripins.com\nctripqa.com\nctrmi.com\ncts010.com\nctsbw.com\nctsec.com\nctsfreight.com\nctsgx.com\nctshk.com\nctsho.com\nctsitravel.com\nctsmed.com\nctsscs.com\nctssd.com\nctsto.com\nctszh.com\nctszs.com\ncttbj.com\ncttgd.com\ncttip.org\ncttms.com\ncttpptrs-pt.cfd\ncttptru-pt.icu\ncttq.com\ncttsd.com\ncttv.co\nctuaa.com\nctv56.org\nctvpost.com\nctvrd.org\nctvwx.com\nctwx.net\nctwxc.com\nctxcdn.com\nctxcdn.net\nctxcollect.com\nctxcpa.com\nctxirang.com\ncty9.com\nctycdn.com\nctycdn.net\nctyny.com\nctyo.com\nctyun.net\nctyun.online\nctyuncdn.net\nctyuninner.com\nctyunwaf.com\nctyunwaf1.com\nctzb.com\nctzcdn.com\nctzcdn.net\nctzg.com\ncu-air.com\ncu5gaia.com\ncuaa.net\ncuahmap.com\ncuav.net\ncubavcenter.com\ncubead.com\ncubegoal.com\ncubejoy.com\ncubespace.city\ncubestation.com\ncubicise.com\ncubie.cc\ncubing.com\ncubox.pro\ncucdc.com\ncuchost.com\ncucldk.com\ncuctv.com\ncudaojia.com\ncueber.com\ncuebzzy.com\ncuelog.com\ncufeyk.com\ncugala.com\ncuggw.com\ncugroup.com\ncugstore.com\ncuhnj.com\ncui1000.com\ncuihuan.net\ncuijiahua.com\ncuilai.com\ncuiniaoedu.com\ncuiniuhui.com\ncuiqingcai.com\ncuiru123.com\ncuiruo.com\ncuirushi.com\ncuiuc.com\ncuiv.com\ncuixingreen.com\ncuixueshe.com\ncuiyongjian.com\ncujs.com\ncuketest.com\ncul-studies.com\nculaiwan.com\nculdata.com\nculia.org\nculiangwang.org\nculturemagasin.com\ncumboly.com\ncumen.fun\ncummins-cq.com\ncumtenn.com\ncumulon.com\ncunan.com\ncuncunle.com\ncunfang.com\ncunhao.net\ncunliangtech.com\ncunnar.com\ncunshao.com\ncunylyu.work\ncunyoulu.com\ncunzhen.vip\ncunzj.com\ncuobiezi.net\ncuonc.com\ncuopen.net\ncuoss.com\ncuour-edu.com\ncuour.com\ncuour.org\ncuoxin.com\ncupdapp.com\ncupdata.com\ncupddns.com\ncupddns.net\ncupdns.com\ncupfox.com\ncupinn.com\ncuplayer.com\ncuplayer.net\ncupmcn.com\ncuppot.com\ncurlc.com\ncurrent.vc\ncursor.zone\ncurtisasia.com\ncusdvs.com\ncusdvs.net\ncusteel.com\ncustomizedfasteners.com\ncustomsapp.com\ncustomskh.org\ncustouch.com\ncustpref.com\ncutemidi.com\ncuteng.com\ncutepet-hk.com\ncutieshop153.com\ncutowallpaper.com\ncutv.com\ncuuhn.com\ncuumo.com\ncux.cc\ncuz.cx\ncuzz.site\ncvc898cvc.com\ncvchome.com\ncvcri.com\ncvftc.net\ncvicse.com\ncvicseks.com\ncvillazc.com\ncvmart.net\ncvmassageocs.com\ncvn-china.com\ncvoazsxs.cfd\ncvoesnzau.cfd\ncvoit.com\ncvonet.com\ncvoon.com\ncvrobot.net\ncvszavosz.icu\ncvtapi.com\ncvte.com\ncvtestatic.com\ncvtvcn.com\ncwag.com\ncwbaike.com\ncwbgp.space\ncwbpsi.com\ncwcec.com\ncwdma.org\ncwdtf.com\ncwems.com\ncwestc.com\ncweun.org\ncwewater.com\ncwfls.com\ncwgarnet.com\ncwgsdl.com\ncwhnh.com\ncwiaj.com\ncwjedu.com\ncwjt.com\ncwlchina.com\ncwliupaotea.com\ncwmcs.com\ncwmtn.com\ncwmzyyy.com\ncwq.com\ncwst.net\ncwtc.com\ncwun.org\ncwxzx.com\ncwyan.com\ncwz12123.com\ncwzdgroup.com\ncwzww.com\ncx-smarthome.com\ncx.cc\ncx001.com\ncx312.com\ncx368.com\ncx580.com\ncx930.net\ncxacg.com\ncxas.com\ncxbbattery.com\ncxbiji.com\ncxbio.com\ncxbsx.com\ncxbz958.com\ncxc233.com\ncxcc.me\ncxcentury.com\ncxcijiedu.com\ncxcyds.com\ncxdm-tech.com\ncxdqkj.com\ncxdz2000.com\ncxf1999.com\ncxfccs.com\ncxfuwu.com\ncxgame.net\ncxgeo.com\ncxgj56.com\ncxglmc.com\ncxglys.com\ncxgw.com\ncxh99.com\ncxhan.com\ncxhl365.net\ncxhr.com\ncxhuoyun.com\ncxhyy.com\ncxic.com\ncximg.com\ncxisc.com\ncxjrh.com\ncxjt.net\ncxju.com\ncxkfwn.com\ncxkjjy.com\ncxkyz.com\ncxlyzj.com\ncxmoe.com\ncxmt.com\ncxmtc.net\ncxnyjt.com\ncxnykjy.com\ncxory.com\ncxpharm.com\ncxqex.com\ncxql.net\ncxrczpw.com\ncxsdszx.com\ncxsk.work\ncxsm.com\ncxstar.com\ncxsteel.com\ncxstgc.com\ncxsw3d.com\ncxta.com\ncxthhhhh.com\ncxtld.com\ncxtrip.cc\ncxtuku.com\ncxumol.com\ncxvlog.com\ncxw.com\ncxwl.com\ncxwyf.net\ncxxjs.com\ncxy521.com\ncxy61.com\ncxy7.com\ncxybattery.com\ncxycsx.vip\ncxydh.xyz\ncxydw.net\ncxyfjd.com\ncxylfc.com\ncxylx.com\ncxyob.com\ncxytiandi.com\ncxyule.com\ncxyxiaowu.com\ncxyxwl.com\ncxyyls.com\ncxyym.com\ncxz.com\ncxzg.com\ncxzntc.com\ncxzw.com\ncxzyjt.com\ncy-cdn.com\ncy-coo.com\ncy-credit.com\ncy-email.com\ncy-isp.com\ncy-isp.net\ncy-jg.com\ncy-jm.com\ncy-mmm.com\ncy-pharm.com\ncy-scm.com\ncy-ymtw.com\ncy.com\ncy2009.com\ncy365.com\ncy580.com\ncy88.com\ncyagen.com\ncyalarm.com\ncyanhillcapital.com\ncyanpeach.com\ncyb-bot.com\ncyb800.com\ncybaojian.com\ncyberspace.com\ncybertogether.net\ncyberway-china.net\ncybstar.com\ncybtc.com\ncyc2018.xyz\ncychaiqian.com\ncyclemixcn.com\ncyclewell.com\ncyclingchina.net\ncyclone-robotics.com\ncyclonemoto.com\ncycnet.com\ncycoo.com\ncyctapp.com\ncyd5918.com\ncydiaa.com\ncydiakk.com\ncydow.com\ncyegushi.com\ncyfeng.com\ncyfengchao.com\ncyflscb.com\ncyfyydyfy.com\ncygbdst.com\ncygia.com\ncygs.com\ncygse.com\ncyhazyy.com\ncyhlwhb.com\ncyhlwmt.com\ncyhm.com\ncyhone.com\ncyhx98.com\ncyicts.com\ncyida.com\ncyie.com\ncyikao.com\ncyimking.com\ncyjcloud.com\ncyjhfm.com\ncyjiasu.com\ncyjjw.net\ncyjlighting.com\ncyjoycity.com\ncyjsh.com\ncyjysb.com\ncyjyxxw.com\ncyjzzd.com\ncyk-cable.com\ncyktqdrp.com\ncylaowu.com\ncylh.com\ncylink.bond\ncylong.com\ncymcgs.com\ncynee.net\ncynovan.com\ncyo.cc\ncyol.com\ncyol.net\ncyou-inc.com\ncyoupic.com\ncyouzai.com\ncypatent.com\ncypharma.com\ncyphouse.com\ncypmedia.com\ncypresstel.com\ncyprestar.com\ncyqyfyxh.com\ncyr168.com\ncyruc.com\ncyrx.com\ncys.world\ncysq.com\ncystool.com\ncyswkj.com\ncyswxa.com\ncysy-cn.com\ncysygroup.com\ncyszxyy.com\ncyt369.com\ncytcard.com\ncytoniche.com\ncytosinlab.com\ncyts.com\ncytsdl.com\ncytslinkage.com\ncytsls.com\ncytsonline.com\ncytstibet.com\ncytuig.com\ncyuandao.com\ncyudun.net\ncyuew.com\ncyuntech.com\ncyuyin.com\ncyvalve.com\ncywetc.com\ncywl.org\ncywlxy.com\ncywyjj.com\ncyxh.org\ncyxigua.com\ncyxny.net\ncyxshop.com\ncyy18.com\ncyyangqiguan.com\ncyycdn.com\ncyyo.vip\ncyypscl.com\ncyyself.name\ncyyvip.com\ncyzl.com\ncyzm.net\ncyzs97.com\ncyzwb.com\ncyzywl.com\ncyzzzz.com\ncz-toshiba.com\ncz-yk.com\ncz.cc\ncz121.com\ncz128.com\ncz88.net\ncz89.com\nczb365.com\nczbanbantong.com\nczbank.com\nczbcpaint.com\nczbq.net\nczbtv.com\nczbx18.com\nczcarbon.com\nczcdt.com\nczcgewater.com\nczchuanlin.com\nczchyz.com\nczcia.com\nczcid.com\nczclzc.com\nczcqly.com\nczctech.com\nczdaiwei.com\nczddbearing.com\nczdingming.com\nczdlj.com\nczdqyy.com\nczdsfy.com\nczduxinban.com\nczdyrmyy.com\nczech-visacenter.com\nczedu.com\nczepb.com\nczey.com\nczfangshuo.com\nczfcdp.com\nczfcw.com\nczfdc.com\nczfesco-mg.com\nczfhdmls.com\nczfph.com\nczgcsb.com\nczgd.tv\nczgdly.com\nczgjj.com\nczgjj.net\nczgmjsj.com\nczgongzuo.com\nczgtjt.com\nczguangfu.org\nczhaobiao.com\nczhbgx.com\nczhjs.com\nczhmjx.com\nczhtff.com\nczhuayuansuye.com\nczie.net\nczifi.org\nczinfo.net\nczitc.com\nczjake.com\nczjdgz.com\nczjdjt.com\nczjdu.com\nczjfa.com\nczjiangteng.com\nczjilijia.com\nczjju.com\nczjlsb.com\nczjoel.com\nczjpw.com\nczjsy.com\nczjyzx.net\nczkbdq.net\nczkctl.com\nczkingdee.com\nczlgj.com\nczlingke.com\nczlkgy.com\nczlsgz.com\nczlskj.com\nczlxgc.net\nczmarathon.net\nczmc.com\nczmh.com\nczmstt.com\nczmw.com\nczmypx.com\ncznengshuo.com\ncznewcom.com\nczolgame.com\nczongyi.com\nczopen.com\nczpbxc.com\nczpoly.com\nczpv.net\nczqingzhifeng.com\nczqqkj.com\nczrcw.com\nczrjh.com\nczrmyy.com\nczrsymt.com\nczsafjx.com\nczsbtjx.com\nczsfy.com\nczsldy.com\nczsmk.com\nczsrc.com\nczsrmyy.com\nczsshb.com\nczstx.net\nczswdx.com\ncztaojiu.com\ncztour.com\ncztrjs.com\ncztv.cc\ncztv.com\ncztv.tv\ncztvcdn.com\ncztvcloud.com\ncztzkg.com\nczur.com\nczvv.net\nczwie.com\nczws.com\nczwsg5.com\nczwxbyq.com\nczwxtz.com\nczxiu.com\nczxixi.com\nczxixigu.com\nczxr.net\nczxthmls.com\nczxuexi.com\nczxxp.com\nczxxw.com\nczxy.com\nczyabo.com\nczyefy.com\nczyfxd.com\nczyl.cc\nczyongfeng.com\nczypcb.com\nczyuxing.com\nczyxba.com\nczzqp.com\nczzsw.com\nczzy-edu.com\nczzyc.com\nczzyvideo.com\nczzzbwg.com\nd-controls.com\nd-ctrip.com\nd-d.design\nd-heaven.com\nd-innovation.com\nd-long.com\nd-robotics.cc\nd-stars.net\nd-techs.com\nd-wolves.com\nd.cg\nd.design\nd00.net\nd03jd.com\nd05512bf210292.beer\nd0be5a65855b67f1.com\nd0bf4234011011.beer\nd0ff97cf35c6a919.com\nd11180a781015.beer\nd1226c9c010311.beer\nd13fa03a1909beae.com\nd163.net\nd17.cc\nd1be4a4fdf902c14.com\nd1c73dbb1de91850.com\nd1cm.com\nd1com.com\nd1cy.com\nd1dengju.com\nd1dytt.com\nd1ev.com\nd1f20dc1910272.beer\nd1f25004011021.beer\nd1f41d7b74d2717d.com\nd1ld.com\nd1lx.com\nd1miao.com\nd1mm.com\nd1net.com\nd1rcw.com\nd1sm.net\nd1xf.net\nd1xn.com\nd1xny.com\nd1y.cc\nd20d0896ac7f79d3.com\nd22fa4e66e2dbda2.com\nd23c41a0511031.beer\nd27c2e00d10251.beer\nd2940a1d3924e37f.com\nd2core.com\nd2film.com\nd2kdi2ss.com\nd2scdn.com\nd2shost.com\nd2ty.com\nd2ziran.com\nd30c8d2641021.beer\nd3490d69fd4b2039.com\nd3581247411021.beer\nd3bc311b910311.beer\nd3ch.com\nd3cn.net\nd3e5f7g9.work\nd3eurostreet.com\nd3f.com\nd3games.com\nd3iz9md.com\nd3tt.com\nd3zone.com\nd4000.com\nd406dc73a1016.beer\nd475a937d0e92b96.com\nd48c3443110281.beer\nd4cd5439c1009.beer\nd4ctech.com\nd54a00143de85b64.com\nd56c84cfb4a786f7.com\nd58.net\nd5a18ed7b2f74e45.com\nd5h.net\nd5power.com\nd5render.com\nd5xs.net\nd65d6.com\nd65fee3222cbaf80.com\nd6861213910261.beer\nd6ffdb55d1009.beer\nd7585a05210281.beer\nd777.com\nd7e29629277.luxe\nd7ftpecw.work\nd7vg.com\nd7w.net\nd7ytrv7yxa.com\nd837c367d34d7bb5.com\nd8e8664c05df452c.com\nd8fb1ffab10251.beer\nd8th.com\nd90eeacb0ed722f9.com\nd920c164caf0ebba.com\nd959fb95dd5cc433.com\nd9741b1859dfcfee.com\nd99net.net\nd9b5cc7f82ccfc18.com\nd9j8.com\nd9js.com\nd9k99.com\nd9ym.com\nda-mai.com\nda-quan.net\nda.anythinktech.com\nda.biz\nda01.com\nda3h.com\nda563c3c21010.beer\nda88.net\ndaai.fun\ndaanbar.com\ndaanche.com\ndaangene.com\ndaanjiexi.com\ndaanwang.com\ndaanwo.com\ndaanxi.com\ndaas-auto.com\ndaba.com\ndabai4.com\ndabaicai.com\ndabaicai.org\ndabaidaojia.com\ndabaise.com\ndabangong.com\ndabangsoft.com\ndabanke.com\ndabao123.com\ndabao22.com\ndabaoge.host\ndabaoku.com\ndabapiao.com\ndabaqian.com\ndabeiduo.com\ndabiaoji.info\ndabiaojituan.com\ndabieshu.com\ndabin69.com\ndabingseo.com\ndabjy.com\ndaboluo.net\ndabusi.com\ndacai.com\ndacang.ltd\ndacankao.com\ndacankao.net\ndacaomei.com\ndacbiotech.com\ndaccc.com\ndaccf.com\ndachanet.com\ndachao.com\ndachaokn.com\ndachaoshan.org\ndachengbiochemical.com\ndachengge.com\ndachenglaw.com\ndachengsh.com\ndachengshuiwu.com\ndachengzi.net\ndachkj.com\ndachuanchina.com\ndachuizichan.com\ndachun.tv\ndachushicai.com\ndad86b446ac9f8b7.com\ndada114.net\ndada360.com\ndadaabc.com\ndadagame.com\ndadagem.xyz\ndadajiasu.com\ndadaogroup.com\ndadaojiayuan.com\ndadaqipai.com\ndadasasa.com\ndadasou.com\ndadateach.com\ndadayou.com\ndadclab.com\ndaddybaby.com\ndaddymami.net\ndaddysweety.com\ndadeedu.com\ndadetong.com\ndadicinema.com\ndadighost.com\ndadikid.net\ndadisalt.com\ndadiwang.com\ndadiyimao.com\ndadongwu.com\ndadou.com\ndaduoduo.com\ndaduofa.com\ndadushixiecheng.com\ndaeac4faf10292.beer\ndaerzhu.com\ndaeshin-china.com\ndaf-rs.com\ndaf30622c1010.beer\ndafaji.com\ndafang24.com\ndafangtour.net\ndafangya.com\ndafanshu.com\ndafaun.com\ndafenghk.com\ndafenghk.net\ndafmgroup.com\ndafork.com\ndafosi.org\ndagangcheng.com\ndagongcredit.com\ndagongnet.com\ndagongtech.com\ndaguan.com\ndaguangnews.com\ndagufood.com\ndaguiot.com\ndaguipc.com\ndagun.net\ndaguzhe.com\ndagyujt.com\ndahachuxing.com\ndahai96.com\ndahainan.com\ndahaiwater.com\ndahaiyang.com\ndahan-sports.com\ndahanghaiol.com\ndahangroup.com\ndahangsky.com\ndahangzhou.com\ndahantc.com\ndahanyinbang.com\ndahanyu.com\ndahao-dahao.com\ndahaoexpo.com\ndaheapp.com\ndahecube.com\ndahei.com\ndaheng-image.com\ndaheng-imaging.com\ndaheng-imavision.com\ndahengit.com\ndahepiao.com\ndahetest.com\ndahongba.net\ndahongtec.com\ndahongtool.com\ndahouduan.com\ndahua-cpa.com\ndahua-ferrules.com\ndahuaab.com\ndahuabloc.com\ndahuaddns.com\ndahuagong.com\ndahualan.com\ndahuap2p.com\ndahuap2pcloud.com\ndahuasurvey.com\ndahuatech.com\ndahuawang.com\ndahuhg.com\ndahuifuwu.com\ndahuodong.com\ndai-shi.com\ndai361.com\ndaiaotech.com\ndaiban0571.com\ndaibanke.com\ndaibi.com\ndaicelchina.com\ndaicuo.cc\ndaicuo.net\ndaidaicp.com\ndaidaipu.com\ndaidongxi.com\ndaigege.com\ndaigou.com\ndaigraphia.com\ndaihaobiao.com\ndaihing.com\ndaijuchuang.net\ndaijun.com\ndaikandq.com\ndaikuan.com\ndaili321.com\ndailianmama.com\ndailianqun.com\ndailiantong.com\ndailianzj.com\ndailiba.com\ndailidaili.com\ndailijizhang.cc\ndailiweishang.com\ndailugou.com\ndailybing.com\ndailygn.com\ndailyqd.com\ndaimafans.com\ndaimagongfang.com\ndaimami.com\ndaimao.work\ndaimawang.com\ndaimay.com\ndaimg.com\ndainiter.com\ndairao.net\ndaishangqian.com\ndaishanmarathon.com\ndaishu.com\ndaishucha.com\ndaishujiankang.com\ndaishutijian.com\ndaisyfin.com\ndaita.red\ndaittotrade.com\ndaivc.com\ndaiwofly.com\ndaiwoqu.com\ndaixiaji.net\ndaixiaobao.com\ndaixiaomi.com\ndaixiaorui.com\ndaixiehyl.com\ndaiyanbao.com\ndaiyanmama.com\ndaiyinzi.com\ndaizitouxiang.com\ndajan.com\ndajiabao.com\ndajiachou.com\ndajiadou6.com\ndajiadu8.com\ndajiaka.com\ndajialaikan.com\ndajialawyer.com\ndajianet.com\ndajiang365.com\ndajiangsai.org\ndajiangtai.com\ndajianhui.com\ndajianyouju.com\ndajiashequ.com\ndajiashuo.com\ndajiazhao.com\ndajiazhongyi.com\ndajiazulin.com\ndajibacdn.com\ndajibapass.com\ndajie.com\ndajieimg.com\ndajilin.com\ndajinan.com\ndajingdiao.com\ndajingmed.com\ndajixie.com\ndajke.com\ndajudeng.com\ndajuntech.com\ndajuyuan.net\ndaka.net\ndakage.com\ndakahr.com\ndakamao8.com\ndakangchem.com\ndakangmedical.com\ndakao100.com\ndakao8.com\ndakao8.net\ndakapath.com\ndakaruanwen.com\ndakasi.com\ndakedakedu.com\ndakejie.com\ndakekj.com\ndakele.com\ndakw.xyz\ndalaba.com\ndalanyouxi.com\ndalao.net\ndalaosz.com\ndaleigroup.com\ndalelingtea.com\ndali-group.com\ndalian-chuanpiao.com\ndalianair-china.com\ndalianbus.com\ndaliancs.com\ndalianiso.com\ndalianjiaojing.com\ndalianshengmi.com\ndaliansky.net\ndaliantyre.com\ndalianwater.com\ndalianxianting.com\ndaliaolaser.com\ndaliapp.net\ndalidaily.com\ndalidm.com\ndalifa.com\ndaliha.com\ndalipan.com\ndalisanta.com\ndalongkeji.com\ndalongyun.com\ndaltonbio.com\ndalu.net\ndaluma.com\ndaluo.com\ndaluom.com\ndaluwang.net\ndaluxinxi.com\ndalvhe.com\ndalvlaw.com\ndalwiaavieru.com\ndalwiaebulon.com\ndalwiakieyne.com\ndalwiaresham.com\ndalwl.work\ndalyfeds.com\ndamai.com\ndamaicheng.com\ndamaimed.com\ndamao.city\ndamatu1.com\ndamddos.com\ndameisheng.com\ndameiweb.com\ndameng.com\ndamiercapital.com\ndamijing.com\ndamingweb.com\ndamiw.com\ndamixs.biz\ndamndigital.com\ndamo-academy.com\ndamodel.com\ndamonroller.com\ndamostar.com\ndamotu.com\ndamoyang.com\ndamuchong.com\ndamuite.com\ndan-my.com\ndan-sing.com\ndan8gui.com\ndanale.com\ndanaleplatform.com\ndanaonao.org\ndanaqsy.com\ndanatlas.com\ndanbagui.com\ndanbaodan.com\ndance365.com\ndanceinchina.org\ndancf.com\ndanchuangglobal.com\ndancihu.com\ndancingcg.com\ndancizhan.com\ndandaiqh.com\ndandan818.com\ndandang.org\ndandanhou.net\ndandanjiang.tv\ndandanman.com\ndandanplay.com\ndandantang.com\ndandanvoice.com\ndandanz.com\ndandanzkw.com\ndanding.com\ndanding.fun\ndandinghuayi.com\ndandongbank.com\ndandou.com\ndanews.cc\ndang-jian.com\ndang3.com\ndangaocn.com\ndangaoss.com\ndangbei.com\ndangbei.net\ndangbeiprojector.com\ndangbiao.com\ndangcdn.com\ndangdaiyiyao.com\ndangdang.com\ndangdj.com\ndangguai.com\ndanghongyun.com\ndanghuan.com\ndangjian.com\ndangjianwang.com\ndangjinguiping.com\ndangpu.com\ndangtianle.com\ndangwan.com\ndangzhi.com\ndangzhi.net\ndangzhu.net\ndangzhuntianqi.com\ndanhao51.com\ndanhaowang.org\ndanhuaer.com\ndanhuangyun.com\ndaniao.org\ndanilelxp.com\ndaningcenter.com\ndaningdaning.com\ndaningtv.com\ndaniopack.com\ndaniuguwang.com\ndaniuit.com\ndaniujiaoyu.com\ndaniushiwan.com\ndaniuwangxiao.com\ndanji100.com\ndanji6.com\ndanji8.com\ndanji9.com\ndanjiang.com\ndanjuanapp.com\ndanjuanfunds.com\ndanjuantaxi.com\ndanjuantec.com\ndanke.com\ndankegongyu.com\ndankexiaoyuan.com\ndanlan.org\ndanlancare.com\ndanlanlove.com\ndanlingfuyou.com\ndanlirencomedy.com\ndanlu.net\ndanmaku.live\ndanmaku.tv\ndanmakupie.com\ndanmi.com\ndanming-ic.com\ndanmo.com\ndanmofun.com\ndanmoshui.com\ndanmu.com\ndanniao.com\ndanotest.com\ndanpin.com\ndanqi.com\ndanten.org\ndanteng.me\ndantengge.org\ndantin.com\ndantins.com\ndantuvc.com\ndanxia.com\ndanxin.net\ndanyang.com\ndanzhaoedu.com\ndanzhou8.com\ndao-fu.com\ndao123.com\ndao3.fun\ndao42.com\ndao50.com\ndaoapp.io\ndaoapp.me\ndaoboime.com\ndaochen.com\ndaocloud.io\ndaocloud.vip\ndaocloudapp.com\ndaodao.com\ndaodaojizhang.com\ndaodaozz.com\ndaodejing.org\ndaodian100.com\ndaodianfu.com\ndaodoc.com\ndaododo.com\ndaoduoduo.com\ndaofengdj.com\ndaoguo.com\ndaohang198.com\ndaohang4.com\ndaohang88.com\ndaohangtx.com\ndaohu123.com\ndaohui.net\ndaohuo.shop\ndaoiqi.com\ndaoisms.org\ndaojia-inc.com\ndaojia.com\ndaojiale.com\ndaojialianmeng.com\ndaojishiqi.com\ndaojishiwang.com\ndaokers.com\ndaokeyuedu.com\ndaokoudai.com\ndaomengad.com\ndaomengren.com\ndaomicfo.com\ndaomuol.com\ndaonong.com\ndaopei.net\ndaopub.com\ndaoqin.net\ndaoran.tv\ndaoru.in\ndaoruimi.com\ndaoscript.org\ndaoshui.com\ndaotin.com\ndaotour.com\ndaotudashi.com\ndaovay.com\ndaovoice.io\ndaoxiangcun.com\ndaoxila.com\ndaoxila.net\ndaoyoudao.com\ndaoyu.fun\ndaoyu.me\ndaoyu8.com\ndaoyumiao.com\ndaozhao.com\ndapai8.com\ndapan.com\ndapei.cc\ndapenggangguanchang.com\ndapenti.com\ndapingshidai.com\ndapiniu.com\ndappdiscover.com\ndapustor.com\ndaqi.com\ndaqiao.host\ndaqiguanli.com\ndaqihui.com\ndaqing8080.com\ndaqiso.com\ndaqizhong.com\ndaqo.com\ndaqqd.com\ndaqsoft.com\ndaquan.com\ndaquan.la\ndaquangroup.com\ndaquncnc.com\ndaraz.com\ndaraz.lk\ndaraz.pk\ndare-auto.com\ndarehui.com\ndaren.today\ndarenfund.com\ndarenjiazu.com\ndarensky.com\ndareu.com\ndarewayhealth.com\ndarkcloudpiece.com\ndarkmi.com\ndarknight.games\ndarmao.com\ndarongcheng.com\ndarryring.com\ndartchina.com\ndartou.com\ndartzon.com\ndaruan.com\ndarwinlearns.com\ndasctf.com\ndasfbio.com\ndasfjd.com\ndashanghaizhuce.com\ndashangu.com\ndashen520.com\ndashen8.com\ndashengji.com\ndashengpan.com\ndashengshan.com\ndashengzuji.com\ndashenquan.com\ndashentv.com\ndashenw.com\ndashet.com\ndashgame.com\ndashi518.com\ndashichang.work\ndashigame.com\ndashikou.com\ndashisx.com\ndashitech.com\ndashiyou.com\ndashu.com\ndashubaba.com\ndashuju123.com\ndasiyingyu.com\ndasong108.com\ndasoujia.com\ndassm.com\ndasuan110.com\ndasuanwang.com\ndasung.com\ndasungtech.com\ndat881.com\ndata-speaker.com\ndata380.com\ndata4h.com\ndata5u.com\ndata86.com\ndata86.net\ndata985.com\ndataarobotics.com\ndatacaciques.com\ndatacanvas.com\ndatacname.com\ndatacomo.com\ndatacvg.com\ndatadragon.net\ndataduoduo.com\ndataesb.com\ndataeye.com\ndatafun.vip\ndatag.vip\ndatagear.tech\ndatagrand.com\ndatahome2026.com\ndatahubtrack.com\ndatahuif.com\ndataie.com\ndataing.com\ndatang.com\ndatang.net\ndatangnxp.com\ndatangweishi.com\ndatangyouxi-inc.com\ndatangyouxia.com\ndatangyouxib.com\ndatangyouxic.com\ndatangyouxie.com\ndatangzww.com\ndataodu.com\ndataojo.com\ndataoke.com\ndatarelab.com\ndatarj.com\ndatasheet.hk\ndatasheet5.com\ndatastoragesummit.com\ndatatang.com\ndatatech-info.com\ndatatist.com\ndatatocn.com\ndatatool.vip\ndatauseful.com\ndataxcrm.com\ndatayes.com\ndatazt.com\ndatealive.com\ndatebao.com\ndatepj.com\ndatesdata.com\ndatia-inspect.com\ndatianmen.com\ndatk.anythinktech.com\ndatong.info\ndatongjianshe.com\ndatongtaxi.com\ndatuc.com\ndaugres.com\ndauteen.com\ndav01.com\ndavdian.com\ndavidlovezoe.club\ndavincimotor.com\ndavinfo.com\ndavost.com\ndavycloud.com\ndawangling.com\ndawawa.com\ndaweiai.com\ndaweijita.com\ndaweisoft.com\ndaweiyishu.com\ndawenbo.com\ndawenling.com\ndawenming.com\ndawensk.com\ndawenxue.net\ndawenxue.org\ndawnarc.com\ndawndiy.com\ndawnjs.com\ndawnlab.me\ndawnled.net\ndawntech.net\ndawuhanapp.com\ndawurencai.com\ndawuyu.com\ndawx.com\ndawx.net\ndaxfix.com\ndaxia.com\ndaxiang91.com\ndaxianghuyu.com\ndaxiangkeji.com\ndaxianglingke.com\ndaxianglink.com\ndaxiangqun.net\ndaxiangshouche.com\ndaxianzuji.com\ndaxicn.com\ndaxiit.com\ndaxiongxueyixue.com\ndaxishi.com\ndaxitouzi.com\ndaxue52.com\ndaxuecidian.com\ndaxuecn.com\ndaxueit.com\ndaxuejiayou.com\ndaxuelu.com\ndaxuepc.com\ndaxuesoutijiang.com\ndaxuetian.com\ndaxuewang.com\nday66.com\ndayaguqin.com\ndayainfo.com\ndayang.group\ndayangjt.com\ndayangliangyou.com\ndayangmotorcycle.com\ndayangmuye.com\ndayangshop.com\ndayangsz.com\ndayanmei.com\ndayanyanglao.com\ndayanzai.me\ndayapress.com\ndayayu.com\ndayclover.com\ndaydao.com\ndayday.plus\ndaydaymap.com\ndaydays.com\ndaydaytest.com\ndaydayup123.com\ndaydx.com\ndaye.hk\ndayee.com\ndayehome.com\ndayesmart.com\ndayezheng.com\ndayhao.com\ndayhellohotel.com\ndayhr.com\ndayi100.com\ndayichang.com\ndayifund.org\ndayihangqing.com\ndayila.net\ndayilive.com\ndayima.com\ndayin.com\ndayin.la\ndayin8.com\ndayinhu.com\ndayinjiqudong.com\ndayinmao.com\ndayinpai.com\ndayinpiano.com\ndayirc.com\ndayishengwu.com\ndayitea.com\ndayiwater.com\ndayong.name\ndayoo.com\ndayrui.com\ndayscamera.com\ndaysou.com\ndayspringpharma.com\ndayss.com\ndaysview.com\ndayu-group.com\ndayu-valve.com\ndayu.com\ndayu.work\ndayuanqy.com\ndayuansouti.com\ndayuanzong.com\ndayucdn.com\ndayucdntip.com\ndayue.com\ndayue8.com\ndayugame.net\ndayugf.com\ndayugslb.com\ndayukaoshi.com\ndayukeji.com\ndayulego.com\ndayulegobak.com\ndayungroup.com\ndayuntongzhou.com\ndayup.org\ndayustudy.com\ndayutukun.com\ndayuzy.com\ndaza168.com\ndazanggui.org\ndazhangfang.com\ndazhangqiu.com\ndazhantai.com\ndazhe5.com\ndazheda.com\ndazhengtop.com\ndazhenzimiao.com\ndazhewa.com\ndazhicorp.com\ndazhistudy.com\ndazhitech.com\ndazhixue.com\ndazhong-valve.com\ndazhong.com\ndazhongbanben.com\ndazhonghr.com\ndazhongkanche.com\ndazhoumzj.com\ndazhoushan.com\ndazhouwater.com\ndazhu1988.com\ndazhuangwang.com\ndazhuangyan.com\ndazibo.com\ndazidazi.com\ndazijia.com\ndaziya.com\ndazizhuanqian.net\ndazoread.com\ndazpin.com\ndaztoutiao.com\ndazuhang.com\ndazui.com\ndazuichazi.com\ndazzle-fashion.com\ndb-cache.com\ndb.ci\ndb162.com\ndb23bc6de1024.beer\ndb2b0d032aefa755.com\ndb5f9bf125415ac9.com\ndb6bfe859b7825fc.com\ndb6f227cfb009078.com\ndb8b41ie5.com\ndb9w.com\ndb9x.com\ndba95a0a82447ac3.com\ndbank.com\ndbankcdn.com\ndbankcdn.ru\ndbankcloud.asia\ndbankcloud.com\ndbankcloud.eu\ndbankcloud.ru\ndbankedge.asia\ndbankedge.net\ndbanote.com\ndbaobao.com\ndbatmb.com\ndbbqb.com\ndbc2000.net\ndbcdh.com\ndbcsq.com\ndbdna.com\ndbe5c181b58111e2.com\ndbf71743f55a8ff4.com\ndbh123.net\ndbjsjt.com\ndbkan.com\ndbkuaizi.com\ndblgf.com\ndbljj.com\ndbmailserver.com\ndbmall.com\ndbmeta.net\ndbnuo.com\ndbpan.com\ndbparking.com\ndbqf.xyz\ndbqgg.com\ndbs724.com\ndbscar.com\ndbshop.net\ndbss360.com\ndbtclub.com\ndbyun.net\ndbzy5.com\ndc-cn.com\ndc0792.com\ndc168cc6a2fe73d3.com\ndc568.com\ndc5febe781010.beer\ndc625.com\ndc8c1b13e8a9a886.com\ndcarapi.com\ndcarimg.com\ndcarlive.com\ndcarstatic.com\ndcarvod.com\ndcatgame.com\ndcb-group.com\ndcb123.com\ndcccji.com\ndcdapp.com\ndcdkjx.com\ndcdnx.com\ndceb32e758290eed.com\ndcef3671664fa11b.com\ndcement.com\ndcexport.work\ndcf365.com\ndcg.microsoft.com\ndcg123.com\ndcgqt.com\ndcgsi.com\ndcgstd.com\ndchotel.net\ndcic-china.com\ndcits.com\ndckgjt.com\ndckj19.com\ndckygroup.com\ndcloud.io\ndcloud.xin\ndcloudlive.com\ndcloudlive.net\ndclouds.cloud\ndcloudstc.com\ndcloudstc.net\ndclygroup.com\ndcmagcn.com\ndcmk17.com\ndcn01.ps4.update.playstation.net\ndcn01.ps5.update.playstation.net\ndcpc.com\ndcpfb.com\ndcqsq.com\ndcsapi.com\ndcshow.com\ndcsjw.com\ndcsme.org\ndcsq.com\ndcstack.org\ndcutp.com\ndcwucu.com\ndcxnews.com\ndcxx.vip\ndcxzmxa.com\ndcybkj.com\ndcyiyao.com\ndcyjc.com\ndcyz.com\ndcyzq.com\ndczcsc.com\ndczkj.com\ndczy168.com\ndd-advisor.com\ndd-gz.com\ndd-img.com\ndd.ci\ndd.ma\ndd001.net\ndd01.com\ndd0415.net\ndd0513702337fb4b.com\ndd0d7e15310311.beer\ndd128.com\ndd2007.com\ndd208.com\ndd369.com\ndd373.com\ndd4.com\ndd536adb110272.beer\ndd666mir.com\ndd903b8fbe36755d.com\nddadaal.me\nddahr.net\nddbiquge.cc\nddbiquge.com\nddbiu.com\nddblquge.cc\nddbqgtxt.cc\nddcdn.com\nddcheshi.com\nddcits.com\nddcorp.net\nddcsjw.com\nddcwl.com\nddd-china.com\ndddazhe.com\nddddns.net\nddddocr.com\nddddyres.com\ndddfe.com\ndddgong.com\ndddja.com\ndddki.com\ndddkq.com\ndddwan.com\ndde-desktop.org\nddedush.com\nddfans.com\nddfchina.com\nddfresh.net\nddfzb.com\nddgjjj.com\nddguanhuai.com\nddhly.com\nddhy.com\nddiaas.com\nddianle.com\nddimg.mobi\nddimg.net\ndding.net\nddj123.com\nddjjzz.com\nddjk.com\nddjs-cn.com\nddjsyx.com\nddkanqiu.cc\nddkanqiu.net\nddkanqu.com\nddkids.com\nddkt365.com\nddky.com\nddle.cc\nddlequ.com\nddmaicai.net\nddmap.com\nddmc.mobi\nddmer.com\nddmogo.com\nddnddn.com\nddnscn.com\nddnspod.com\nddnsto.com\nddnx.com\nddong.com\nddonplan.com\nddooo.com\nddoor.net\nddos.com\nddos567.net\nddosc.com\nddosendns.com\nddosfh.com\nddoshy.com\nddosjq.xyz\nddove.com\nddpai.com\nddpoc.com\nddqcw.com\nddsaas.com\nddsiojf.xyz\nddsk.la\nddsm.com\nddstarapp.com\nddsy.com\nddtk.vip\nddtsg.com\nddtugame.com\nddtxgame.com\nddun.com\nddunyun.com\nddurl.to\ndduser.mobi\ndduwork.com\nddvaj.com\nddweilai.com\nddwgame.com\nddwhm.com\nddwjs.com\nddxhx.com\nddxhyl.com\nddxq.mobi\nddxs.vip\nddxsku.com\nddxstxt8.com\nddyjapp.com\nddyqh.com\nddyun.com\nddyun123.com\nddyylczz.com\nddyylczzs.com\nddz.com\nddzf.cc\nddzhj.com\nddzl.net\nddzls.net\nddzn.tech\nddznzj.com\nddztv.com\nddzui.com\nddzuqin.com\nddzuwu.com\nde-ele.com\nde-moe.org\nde-tencentclb.cloud\nde-tencentclb.com\nde-tencentclb.net\nde-tencentclb.work\nde0.cc\nde1000.com\nde123.net\nde1919.com\nde2edec3011032.beer\nde56.com\nde83cc01111.xin\nde9745f491023.beer\ndeaconhousewuxi.com\ndeadnine.com\ndeafchina.com\ndeahu.com\ndealsbank.com\ndealsmake.com\ndeansys.com\ndear520dear.com\ndearclick.com\ndearda.com\ndearedu.com\ndearisland.com\ndeartree.com\ndearxuan.com\ndeasun.com\ndeathearth.com\ndeau-cable.com\ndeb1c7bad11031.beer\ndebao.com\ndebao123.com\ndebaochina.com\ndebbe32e10b635a7.com\ndeben.me\ndebug.moe\ndebugdump.com\ndebugo.com\ndebuycn.com\ndecansmd.com\ndecard.com\ndecd5279411012.beer\ndecent-china.com\ndecentcapital.com\ndecerp.cc\ndechang-chem.com\ndechingroup.com\ndechlogi.com\ndechong.site\ndechua.com\ndeckmanager.net\ndeclous.com\ndecohome.cc\ndecoration.ltd\ndecorcn.com\ndecwhy.com\ndeczh.com\ndede-zj.com\ndede168.com\ndedeadmin.com\ndedebiz.com\ndedecms.com\ndedecms8.com\ndedecmsmuban.com\ndedecmsplus.com\ndedeeims.com\ndedegg.com\ndedejs.com\ndedemao.com\ndedesos.com\ndedezhuji.com\ndeebio.com\ndeeceal.com\ndeehon.com\ndeemos.com\ndeep-os.com\ndeep56.com\ndeepblog.net\ndeepc.cc\ndeepcloudsdp.com\ndeepcoin.red\ndeepcool.com\ndeepdone.work\ndeepepg.com\ndeepermobile.com\ndeepfast.com\ndeepin-ai.com\ndeepin.com\ndeepin.org\ndeepinghost.com\ndeepinmind.com\ndeepinos.org\ndeepinout.com\ndeepinstall.com\ndeepleaper.com\ndeeplearn.me\ndeeplearn.work\ndeepmd.net\ndeepoon.com\ndeeprouter.org\ndeepseapioneer.com\ndeepseek.com\ndeepseeksvc.com\ndeepsheet.net\ndeeptechchina.com\ndeeptrain.net\ndeeptrip.com\ndeepvinci.tech\ndeepvps.com\ndeer-express.com\ndeerex.com\ndeerfieldbch.com\ndeerhappy.com\ndeerjet.com\ndeerma.com\ndeernice.com\ndeexchina.com\ndef5feeaeb220776.com\ndefair.online\ndefcoding.com\ndefeng999.com\ndefineabc.com\ndefoen.com\ndefofy.com\ndefoile.com\ndefuv.com\ndefvul.com\ndegitec-jiangyin.com\ndeguoguanjia.com\ndehe99.com\ndeheheng.com\ndeheng.com\ndehengclinic.com\ndehenglaw.com\ndehsm.com\ndehua.net\ndehuaca.com\ndehuigroup.com\ndehuisk.com\ndehuiyuan.com\ndehumidifierchina.com\ndeifgs.com\ndeikuo.com\ndejia-shijiebei1.com\ndejiart.com\ndejiplaza.com\ndekeego.com\ndekekc.com\ndekls.com\ndekonglife.com\ndektw.com\ndekuncn.com\ndekunyy.com\ndekyy.com\ndel.pub\ndelaiyun.cloud\ndelanauto.com\ndele.com\ndeli-tools.com\ndelib2b.com\ndelibao.com\ndelicacyup.com\ndelicloud.com\ndelilegal.com\ndelin-sh.com\ndelingkeji.com\ndelinklab.com\ndelipu.cc\ndelishi.com\ndeliworld.com\ndelixi-electric.com\ndelixi.com\ndelixidrive.com\ndeliyun.com\ndell-alw.com\ndell-brand.com\ndell027.com\ndellecs.com\ndellemc-solution.com\ndellenglish.com\ndellfuwuqi.com\ndellhpibm.com\ndellrsm.com\ndellzj.com\ndelong-group.com\ndelonggou.com\ndelonix.group\ndelovabio.com\ndelphi-connect.com\ndelphijiaocheng.com\ndeltaverse.net\ndelun-group.com\ndelunyk.com\ndeluxewatchbox.com\ndeluxworld.com\ndeluya.com\ndemanmedical.com\ndemark-jgkj.com\ndemaxmedical.com\ndemingzi.com\ndemix.cc\ndemixc.com\ndemizhongbao.com\ndemlution.com\ndemo-15.work\ndemo1024.com\ndemo8.com\ndemodashi.com\ndemogic.com\ndemon.tw\ndemonlee.tech\ndemososo.com\ndenachina.com\ndenaircompressor.com\ndeng88.com\ndenganliang.com\ndengbaogonggao.com\ndengbi8.com\ndengbiao.com\ndengdingsheng.com\ndengfengwater.com\ndengguobi.com\ndenghao.org\ndenghaoxuan.com\ndenghuo.com\ndengkanwen.com\ndengmoe.com\ndengni.org\ndengta120.com\ndengtabao.com\ndengtacj.com\ndengtadaka.com\ndengxiaolong.com\ndengxiaopingnet.com\ndeniulor.com\ndenon-proaudio.com\ndenopark.com\ndenson168.com\ndentistshow.com\ndenverokie.com\ndenza.cloud\ndenzacloud.com\ndeosen.com\ndeosin.com\ndep-star.com\ndepailed.com\ndepamu.com\ndependdns.com\ndephir.com\ndeppon.com\ndepthlink.com\ndepuchem.com\ndeqingbank.com\ndercase.com\nderekchou.com\nderenbs.com\nderlook.com\nderucci.com\nderun-env.com\nderunbao.com\nderunss.com\nderuxi.com\nderzh.com\ndes8.com\ndesano.com\ndesay.com\ndesaysv.com\ndeserts.io\ndeshaus.com\ndesheng-edu.com\ndesheng-school.com\ndesheng.net\ndeshengdachem.com\ndeshenghonglan.com\ndeshengtea.com\ndeshengzj.com\ndeshicheng.com\ndesign-engine.org\ndesign006.com\ndesignjiaoshi.com\ndesignkit.com\ndesignmoma.com\ndesignshidai.com\ndesignsketchskill.com\ndesignuuu.com\ndesignwithlove.org\ndesignyunasai.com\ndesk-site.com\ndeskcar.com\ndeskcity.com\ndeskcity.org\ndeskguanjia.com\ndeskpool.com\ndesktop-calculator.com\ndesktopcal.com\ndeskwc.com\ndesnerboats.com\ndesoonproduct.com\ndestoon.com\ndesunpv.com\ndesuntech.com\ndeswfggabc.work\ndetailroi.com\ndetaisy.com\ndeteufelde.shop\ndetion.com\ndetonfan.com\ndetonger.com\ndetu.com\ndev-dh.com\ndev59.com\ndevashen.com\ndevask.net\ndevbean.net\ndevblogs.microsoft.com\ndevclub.cc\ndevdir.biz\ndevedu.net\ndevelenv.com\ndeveloper.htcvive.com\ndeveloper.microsoft.com\ndeveloper.vive.com\ndevelopers.pub\ndevelopwechat.com\ndevelopweixin.com\ndevelpress.com\ndevemi.com\ndevework.com\ndevexel-tech.com\ndevexel.com\ndevexpresscn.com\ndevicewell.com\ndevil0629.com\ndevio.org\ndevops-dev.com\ndevotiongroup.com\ndevourad.com\ndevpss.com\ndevsapp.net\ndevsiki.com\ndevskyr.com\ndevtang.com\ndevui.design\ndevweixin.com\ndevzeng.com\ndeweier.com\ndeweisi.net\ndewmobile.net\ndewu.com\ndewu.net\ndewucdn.com\ndewumall.com\ndewx.net\ndexejhyxh.com\ndexi009.com\ndexian.mobi\ndexingroup.com\ndexingrv.com\ndexinhr.com\ndexinmobi.com\ndexinquan.com\ndexinrq.com\ndexinsg.com\ndexiya.com\ndextercai.com\ndexuee.com\ndexueedu.com\ndexunyun.com\ndexxg.com\ndeyangbk.com\ndeyatech.com\ndeyayk.com\ndeyecloud.com\ndeyeehome.com\ndeyerchem.com\ndeyi.com\ndeyi.net\ndeyicc.com\ndeyijijin.org\ndeyiso.com\ndeyle-electric.com\ndeyouec.com\ndeyoulife.com\ndeyuan.fun\ndeyuantextile.com\ndeyun.fun\ndezhanyigou.com\ndezhongmobi.com\ndezhoudaily.com\ndezhoulawyer.com\ndezhuyun.com\ndezstia.com\ndf-1912.com\ndf-college.com\ndf-gd.com\ndf-nissanfc.com\ndf-nissanfl.com\ndf0535.com\ndf321b81208721f1.com\ndf33.com\ndf3n43m.com\ndf81.com\ndf9377.com\ndf962388.com\ndfb232ce910241.beer\ndfcfs.com\ndfcfw.com\ndfcms.net\ndfcx-bj.com\ndfdaily.com\ndfdd-toubiaole.com\ndfdinsin.com\ndfdtt.com\ndfebda0512.vip\ndfedu.com\ndfeeb7ee91022.beer\ndfev.net\ndffcw.net\ndfggq.com\ndfgiso.com\ndfgsb.com\ndfgsz.com\ndfham.com\ndfhog.com\ndfhon.com\ndfhr.com\ndfhrc.com\ndfhy888.com\ndfi09181kq.com\ndfine.tech\ndfjyun.com\ndfkhgj.com\ndfkj.cc\ndflmtc.com\ndflzm.com\ndflzmxs.com\ndfmc.com\ndfmcastrol.com\ndfmingya.com\ndfnzhp.com\ndfpost.com\ndfpz.net\ndfqcmy.com\ndfqy.com\ndfratings.com\ndfrcb.com\ndfs168.com\ndfshurufa.com\ndfshw.com\ndfshysw.com\ndfsjsoft.com\ndfsmw.com\ndfsouth.com\ndfss-club.com\ndfstw.com\ndfsyjm.com\ndftcdq.com\ndftryy.com\ndftyyls.com\ndftzj.com\ndfwl.net\ndfwlg.com\ndfxq.com\ndfxqc.com\ndfxwdc.com\ndfxy.net\ndfxyw.com\ndfy027.com\ndfyanyi.com\ndfyapp.com\ndfyl-luxgen.com\ndfyne.cz\ndfynet.com\ndfyoo.com\ndfysgs.com\ndfysscy.com\ndfysw.net\ndfyuan.com\ndfyyc.com\ndfyzx.com\ndfzbsh.com\ndfzk.com\ndfzmzyc.com\ndfzxvip.com\ndfzyxy.net\ndg-360lhx.com\ndg-dns.com\ndg-dx.com\ndg-hanxin.com\ndg-mall.com\ndg-niuniu.com\ndg-tcm.com\ndg11185.com\ndg121.com\ndg456.com\ndg688.com\ndgaefi.org\ndgaiia.com\ndgbaineng.com\ndgbgw.com\ndgbia.com\ndgbyxny.com\ndgbzy.com\ndgcct.com\ndgchenghe.com\ndgcia.com\ndgcpkl.com\ndgddh.xyz\ndgdq1688.com\ndgdqw.com\ndgdydd.com\ndgegbj.com\ndgeia.com\ndgg.net\ndggcyy.com\ndggdk.com\ndgggs.com\ndgghy.com\ndggjqw.com\ndggjyy.com\ndggosungroup.com\ndggq.com\ndggxxh.com\ndggywx.com\ndghgzm.com\ndghjt.com\ndghobo17.com\ndghonggao.net\ndghqmotor.com\ndghuafuli.com\ndginfo.com\ndgjijiagong668.com\ndgjiuqi.com\ndgjoy.co\ndgjwsy.com\ndgjx.net\ndgjxmk.com\ndgjy.net\ndgkj888.com\ndglpool.com\ndglyjx.com\ndglyyun.com\ndglzd.com\ndgmama.net\ndgn.cc\ndgndf.com\ndgnekon.com\ndgnet.net\ndgnkj.com\ndgobch.com\ndgod.net\ndgouyijiance.com\ndgovp.com\ndgozp.com\ndgpenghao.com\ndgphospital.com\ndgpp.com\ndgprj.com\ndgpump86.com\ndgqczz.com\ndgqianguan.com\ndgqjj.com\ndgqzxx.net\ndgrbcj.com\ndgrcw.com\ndgrsa.org\ndgruizhi.com\ndgrunhe.com\ndgs-td2.com\ndgsbtjx.com\ndgsfweb.com\ndgshifeng.com\ndgshunjin.com\ndgsltx.com\ndgsme.org\ndgspk.com\ndgswhg.com\ndgsztyy.com\ndgt-factory.com\ndgtianbao.xin\ndgtle.com\ndgtn1718.org\ndgtpcj.com\ndgtungwah.com\ndgtuoyue.com\ndgtzjt.com\ndgw888.com\ndgweierwj.com\ndgweitian.com\ndgwia.com\ndgwlhj.com\ndgwtrl.com\ndgxbjg.com\ndgxinde.net\ndgxue.com\ndgxxz.com\ndgxzxjj.com\ndgyanda.com\ndgyejia.com\ndgyhsb.com\ndgyian.com\ndgyibiao.com\ndgykz.com\ndgylec.com\ndgyq-water.com\ndgysdx.com\ndgytdz.com\ndgyuanyi.com\ndgyw.cc\ndgzaixing.com\ndgzcsy.net\ndgzhihongjx.com\ndgzhisen.com\ndgzj.com\ndgzp.com\ndgzx.net\ndgzz1.com\ndh.cx\ndh01.com\ndh0580.com\ndh08126.net\ndh33660.com\ndh3t.com\ndh5idnf.com\ndh7373.com\ndh7999.com\ndh810.com\ndh818.com\ndh9191.com\ndh978.com\ndhaitun.com\ndhaof.com\ndhasgf.com\ndhb.hk\ndhb168.com\ndhboy.com\ndhbs86.com\ndhchain.com\ndhcooker.com\ndhdly.com\ndhg858a07.shop\ndhgfhgsfg.com\ndhgsqjcnd.com\ndhgsqjcnj.com\ndhgsqjcnm.com\ndhguanye.com\ndhgz.com\ndhh-gz.com\ndhhqfw.com\ndhidcw.com\ndhimavision.com\ndhj3413.com\ndhjt.com\ndhkm.vip\ndhkq120.com\ndhkqyy.com\ndhl-online.com\ndhl-y.info\ndhl8o3x5.bond\ndhlfki.shop\ndhlijg.bond\ndhlvux.asia\ndhlzhif.asia\ndhmeri.com\ndhmsnyy.com\ndhppa.com\ndhqfz.com\ndhqtech.com\ndhrcbank.com\ndhrest.com\ndhrest2.com\ndhs-sports.com\ndhsrmyy.com\ndhszyy.net\ndht5867.com\ndhtest.com\ndhtopology.com\ndhtv.tv\ndhuili.com\ndhvisiontech.com\ndhw-wiremesh.com\ndhw22.com\ndhwooden.com\ndhxx.com\ndhyct.com\ndhyjaqa.com\ndhyz.net\ndhzfgm.com\ndhznib.com\ndi1k.com\ndi3ke.com\ndi7cn.net\ndi88.net\ndiablohu.com\ndiact.com\ndiaidi.com\ndiaigame.com\ndialogue32.com\ndialoguechinefrance.com\ndiamondfavour.net\ndiamondfsd.com\ndiamondinnovations.cfd\ndian-ai.com\ndian-stable.com\ndian.so\ndian123.com\ndian234.com\ndian5.com\ndian500.com\ndian68.net\ndianapp.com\ndianbaobao.com\ndianbb.com\ndianbio.com\ndianbo.org\ndianbobao.com\ndianbucuo.com\ndiancang.xyz\ndianchacha.com\ndianchizhijia.com\ndianchouapp.com\ndiandanbao.com\ndiandao.org\ndiandaxia.com\ndiandeng.tech\ndiandian.com\ndiandian.net\ndiandianmeijia.com\ndiandiannuo.com\ndiandianqi.com\ndiandianshu.com\ndiandianwaimai.com\ndiandianys.com\ndiandianzhe.com\ndiandong.com\ndiandongche.biz\ndianfanyingyu.com\ndianfengcms.com\ndianfuji.com\ndiangan.org\ndiangeapp.com\ndiangong8.com\ndiangongbao.com\ndiangongjiang.com\ndiangongwu.com\ndianhen.com\ndianhong.com\ndianhou.com\ndianji007.com\ndianjianggame.com\ndianjiangrcw.com\ndianjiangxin.cc\ndianjihr.com\ndianjin123.com\ndianjinghu.com\ndianjingzhe.com\ndianjipinpai.com\ndianjiqi.com\ndiankeji.com\ndianlanbao.com\ndianlanyibiao.com\ndianli.com\ndianli08.com\ndianli100.com\ndianlinet.com\ndianlut.com\ndianlut.net\ndianmi365.com\ndiannaoban.com\ndiannaodian.com\ndiannaodiy.net\ndiannaoxianka.com\ndianopen.com\ndianou.com\ndianpifa.com\ndianping.com\ndianpingba.com\ndianpushuo.com\ndianqikaiguan.com\ndianqizazhi.com\ndianqugame.com\ndianranart.com\ndianremo1688.com\ndianrong.com\ndianru.com\ndianru.net\ndians.net\ndiansan.com\ndianshanchina.com\ndianshang.com\ndianshangmulu.com\ndianshangyi.com\ndianshi.com\ndianshihome.com\ndianshijia.com\ndianshu119.com\ndiansu-cdn.net\ndiantads.com\ndiantangzuyi.com\ndiantonghudong.com\ndiantoushi.com\ndiantui.net\ndianwanhezi.com\ndianwannan.com\ndianwanshidai.com\ndianwantu.com\ndianwo98.com\ndianwoba.com\ndianwoda.com\ndianwolf.com\ndianwoyou.com\ndianxian.net\ndianxian8.com\ndianxiandianlanchang.com\ndianxiaobao.net\ndianxiaomi.com\ndianxin.com\ndianxin.net\ndianxinnews.com\ndianxinos.com\ndianyacloud.com\ndianyingshow.com\ndianyingwenxue.com\ndianyong123.com\ndianyongqi.com\ndianyuan.com\ndianzhanggui.net\ndianzhangzhipin.com\ndianzheli.com\ndianzhenkeji.com\ndianzhentan.com\ndianzhi.com\ndianzhong.com\ndianzi6.com\ndianziaihaozhe.com\ndianzihetong.net\ndianzixuexi.com\ndianzizhao.com\ndiaoben.com\ndiaochapai.com\ndiaochapai.net\ndiaochatong.com\ndiaocnc.com\ndiaoding.biz\ndiaojiang.com\ndiaokeji.net\ndiaosaas.com\ndiaosi.net\ndiaosiweb.net\ndiaosu9.com\ndiaosu98.com\ndiaosunet.com\ndiaosuoju.net\ndiaox2.com\ndiaoy.com\ndiaoyan001.com\ndiaoyou.com\ndiaoyoupai.com\ndiaoyu.com\ndiaoyu123.com\ndiaoyu365.com\ndiaoyuren.com\ndiaoyuwang.com\ndiaoyuweng.com\ndiary365.net\ndiaxue.com\ndiazha.com\ndibaifang.com\ndibang18.com\ndibaotong.com\ndibchina.com\ndibcn.com\ndiboot.com\ndibunet.com\ndic123.com\ndicastal.com\ndichan.com\ndichan.net\ndichanlao.com\ndichanren.com\ndichanw.com\ndichedai.com\ndicila-china.com\ndicksflashsale-vip.com\ndicom365.com\ndictall.com\ndida110.com\ndida365.com\ndidabds.com\ndidacar.com\ndidachuxing.com\ndidamall.com\ndidao.com\ndidaoshidai.com\ndidapaper.com\ndidapinche.com\ndidatravel.com\ndidatxt.com\ndidctf.com\ndideu.com\ndidi-food.com\ndidi-trip.com\ndidi.xin\ndidialift.com\ndidiapp.com\ndidibuluo.com\ndidichuxing.com\ndididadidi.com\ndididapiao.com\ndididi88.com\ndidiglobal.com\ndidimobility.com\ndidiopenapi.com\ndidipai.com\ndidiqiche.com\ndidishijie.com\ndidispace.com\ndidistatic.com\ndiditaxi.com\ndidiwuxian.com\ndidixk.com\ndidiyun.com\ndidiyun.org\ndidiyunapi.com\ndiducoder.com\ndiebian.net\ndieclock.com\ndiemoe.net\ndieniao.com\ndieqiu.com\ndiershoubing.com\ndietfd.com\ndiexuan.net\ndiexun.com\ndieyanli.com\ndifanapp.com\ndifersports.com\ndiffusefuture.com\ndiffusenetwork.com\ndig-gy.com\ndigcredit.com\ndigeeker.com\ndigi-wo.com\ndigigd.com\ndigihail.com\ndigihuman.com\ndigiic.com\ndigiinfr.com\ndigimons.net\ndigirepub.com\ndigisky.com\ndigit3ds.com\ndigital-hangzhou.com\ndigital-ren.com\ndigitalchina.com\ndigitalchinahealth.org\ndigitalcloudshield.com\ndigitalcnzz.com\ndigitalcq.com\ndigitaldrew.net\ndigitalfiles.org\ndigitaling.com\ndigitaljx.com\ndigitalmanu.com\ndigitalvolvo.com\ndigitalwuhan.com\ndigitalwuhan.net\ndigitalyili.com\ndigitclouds.com\ndigitguangdong.com\ndigitimetech.com\ndigitlink.net\ndigitser.net\ndigitwater.com\ndigiwin.com\ndigiwoods.com\ndigiwork.com\ndigod.com\ndigoexpress.com\ndigsur.com\ndigu.com\ndigu.plus\ndigu365.com\ndigua.com\ndiguage.com\ndiguazu.com\ndihaobedding.com\ndihaopipe.com\ndihaowa.com\ndihuaikeji.com\ndiiqu.com\ndijianggroup.com\ndijingchao.com\ndijiuban.com\ndikeqc.com\ndili360.com\ndili365.com\ndilidili.com\ndiliy.com\ndima-industry.com\ndimei88.com\ndimeng.vip\ndimensi-9.com\ndimenspace.com\ndimg04.tripcdn.com\ndimocap.com\ndimolabel.com\ndimsmary.tech\ndimsolo.com\ndimtown.com\ndinais.com\ndinarspeculator.com\ndindin.com\nding-chuang.com\nding-liang.com\ndingbang99.com\ndingcaicai.com\ndingcooltech.com\ndingdachuxing.com\ndingdandao.com\ndingdangchem.com\ndingdanggj.com\ndingdangjia.net\ndingdangnao.com\ndingdanxia.com\ndingdatech.com\ndingdd.com\ndingdean.com\ndingdi.com\ndingdian001.com\ndingdiange.org\ndingdiann.com\ndingdiann.net\ndingdiansk.com\ndingdianxs.la\ndingdianzw.com\ndingding.com\ndingding.xin\ndingdingdan.com\ndingdingdoctor.com\ndingdingkaike.com\ndingdingtingche.com\ndingdingzn.com\ndingdone.com\ndingdongcloud.com\ndingdongebusiness.com\ndingdongmao.com\ndingdongxiaoqu.com\ndingdx.com\ndingefactory.com\ndingertai.com\ndingfubang.com\ndinggebaojian.com\ndinggou.org\ndinggu.net\ndinghaiec.com\ndinghantech.com\ndinghengjc.com\ndinghu.com\ndinghuakuai.com\ndinghuaren.com\ndinghui.org\ndinghuo123.com\ndinghuo365.com\ndinghuoche.com\ndinghuovip.com\ndingjiwangluo.com\ndingkeji.com\ndinglia.com\ndingliangame.com\ndinglianhuanbao.com\ndinglicom.com\ndinglipin.net\ndinglongchem.com\ndinglongjx.com\ndinglutang.com\ndingoa.com\ndingqiao.cc\ndingqiaoks.com\ndingqibao.com\ndingqidong.com\ndingqingyun.com\ndingrongxd.com\ndingrtc.com\ndingruxin.com\ndingsheng.com\ndingso.com\ndingtalent.com\ndingtalk.com\ndingtalk.net\ndingtalkapps.com\ndingtalkcloud.com\ndingtangzqx.com\ndingteam.com\ndingtoo.com\ndingweilishi.com\ndingwenacademy.com\ndingxiang-inc.com\ndingxikeji.com\ndingxinwen.com\ndingxiushipin.com\ndingxutonghui.com\ndingyang.com\ndingyanqf.com\ndingyantec.com\ndingyao17.com\ndingyue-ele.com\ndingyueads.com\ndingzhijl.com\ndingzhoudaily.com\ndingzhourencai.com\ndiningcity.asia\ndinju.com\ndinpay.com\ndinsense.com\ndinte.work\ndinyocasa.com\ndinzd.com\ndiodecy.com\ndioenglish.com\ndiomasce.com\ndionly.com\ndiopic.net\ndious-f.com\ndipan.com\ndipephoto.com\ndipont.com\ndippstar.com\ndiqiuw.com\ndiqua.com\ndir001.com\ndir28.com\ndirectui.com\ndis9.net\ndisccrds.com\ndiscount-polska.store\ndiscourse-studies.com\ndiscoversources.com\ndiscoveryriflescope.com\ndiscrepancye.com\ndiscuz.chat\ndiscuz.com\ndiscuz.net\ndiscuz.org\ndiscuz.vip\ndiscuzfans.net\ndiscuzlab.com\ndisenjn.com\ndishanhuanbao.com\ndishen.com\ndishuge.com\ndishuizhijia.com\ndisimy.com\ndislux.com\ndislytegame.com\ndismall.com\ndisplink.com\ndistantmeaning.com\ndistinctclinic.com\nditai.fun\nditan.com\nditan360.com\nditian-tech.com\nditianshanhe.com\nditiefuli.com\nditiezu.com\nditiezu.net\nditrit.com\nditu.live.com\ndituhui.com\ndituw.net\ndituwuyou.com\ndituyi.com\ndiugai.com\ndiuta.com\ndiuut.com\ndivcss5.com\ndivepai.com\ndiving-fish.com\ndivizg.com\ndivoiotcloud.com\ndiwork.com\ndiwuyuan.com\ndixinkj.com\ndixintong.com\ndiy10.com\ndiyahz.com\ndiybcq.com\ndiydiymall.com\ndiygogogo.com\ndiygw.com\ndiyhi.com\ndiyibox.com\ndiyicai.com\ndiyidan.com\ndiyidan.net\ndiyidanhao.com\ndiyiedu.com\ndiyifanwen.com\ndiyifanwen.net\ndiyigaokao.com\ndiyihuifu.com\ndiyiliuxue.com\ndiyinews.com\ndiyishijian.com\ndiyixiazai.com\ndiyixin.com\ndiyiyou.com\ndiyiyt.com\ndiyiyunshi.com\ndiyiziti.com\ndiyleyuan.com\ndiymianmo.com\ndiymysite.com\ndiynova.com\ndiyosl.com\ndiypda.com\ndiyring.cc\ndiyyh.com\ndiyzhen.com\ndizalpharma.com\ndizgslb.com\ndizh.net\ndizhimei.com\ndizhu.org\ndizhuche.com\ndiziguiwang.com\ndizishu.com\ndizzylab.net\ndj-dj.net\ndj.net\ndj.tc\ndj10.com\ndj134.com\ndj16.com\ndj175.com\ndj193.com\ndj63.com\ndj89.com\ndj92.cc\ndj92cc.com\ndj96.com\ndj97.com\ndj99.com\ndjbh.net\ndjbhjg.net\ndjbx.com\ndjc8888.com\ndjcc.com\ndjcp099.com\ndjcscs.com\ndjcx.cc\ndjdjapp.com\ndjdkk.com\ndjdsh.com\ndjduoduo.com\ndjec.net\ndjeconomic.com\ndjf.com\ndjf313.com\ndjfensi.com\ndjfrj.com\ndjgy.com\ndjhxn.com\ndji.com\ndji.ink\ndji.net\ndjiang.net\ndjiavip.com\ndjicdn.com\ndjigate.com\ndjiits.com\ndjiops.com\ndjiservice.org\ndjjgj.com\ndjjlseo.com\ndjjw.com\ndjjyzly.com\ndjkgongshui.com\ndjkk.com\ndjkpai.com\ndjksh.com\ndjksq.com\ndjkxl.com\ndjlcom.net\ndjlmvip.com\ndjlsoft.net\ndjm-bj.com\ndjmillison.com\ndjserver.center\ndjsh5.com\ndjstechpc.com\ndjstg.com\ndjtpf.com\ndjtpt.com\ndjtt.com\ndjttw.com\ndjtz.net\ndju8.com\ndjunf.com\ndjuu.com\ndjwjsj.com\ndjxcable.com\ndjxww.com\ndjy517.com\ndjye.com\ndjyg.shop\ndjyinyue.com\ndjyjob.com\ndjymjsw.com\ndjyule.com\ndjzhj.com\ndjzr88.com\ndjzyg.com\ndk-lexus.com\ndk8s.com\ndkashop.com\ndkcloudlive.com\ndkdangle.com\ndkdgroup.com\ndkdlsj.com\ndkdsfrwety.xyz\ndkewl.com\ndkfinancing.com\ndkgyw.com\ndkhg23.com\ndkhs.com\ndkjiaoyang.com\ndkjmy.com\ndkjmyq.com\ndklogs.net\ndkmol.net\ndknsankf.com\ndkntgc.com\ndksgames.com\ndkskcloud.com\ndktad.com\ndktzjt.com\ndku51.com\ndky.cc\ndkybpc.com\ndkykyt5516.vip\ndkzt.com\ndkzx.net\ndl-hf.com\ndl-hr.com\ndl-kg.com\ndl-meitu.com\ndl-rc.com\ndl.delivery.mp.microsoft.com\ndl0728.com\ndl23zx.com\ndl2link.com\ndl56.net\ndl8z.com\ndlairport.com\ndlbaohuang.com\ndlbbdk.com\ndlbbs.com\ndlbh.net\ndlbiotech.com\ndlcaic.com\ndlcsos.com\ndld56.com\ndldlsw.com\ndldm.com\ndle-news.xyz\ndledu.com\ndlfederal.com\ndlfeyljt.com\ndlfy-metalparts.com\ndlg-expo.com\ndlgouji.com\ndlgslb.net\ndlgwbn.com\ndlgxbl.com\ndlhaibaobio.com\ndlhope.com\ndlhospital.com\ndlhuayang.com\ndlhwjq.com\ndljczb.com\ndljianbing.com\ndljierui.com\ndljlxx.com\ndljrw.com\ndljs.net\ndljsjt.com\ndlkldz.com\ndlkykycc55.com\ndllawyers.org\ndllzj.com\ndlmeasure.com\ndlmianshuiche.com\ndlmonita.com\ndlmyzf.com\ndlmzk.com\ndlnel.com\ndlnel.org\ndlnyzb.com\ndlonng.com\ndlosri.com\ndlouf.com\ndlphoschem.com\ndlpuwan.com\ndlqcgz.com\ndlrkb.com\ndls88.com\ndlsccn.com\ndlsgs.com\ndlshian.com\ndlsjyy.com\ndlsqb.com\ndlssa.com\ndlsstax.com\ndlsunworld.com\ndlszywz.com\ndlteacher.com\ndltm.net\ndltobacco.com\ndltubu.com\ndlvalve.com\ndlw-lighting.com\ndlw360.com\ndlw666.com\ndlwang.vip\ndlwjdh.com\ndlwmkj.com\ndlwx369.com\ndlxgjy.com\ndlxk.com\ndlxmicro.com\ndlxww.com\ndly56.com\ndlyy365.com\ndlzb.com\ndlzbxx.com\ndlzj.net\ndlzs-audio.com\ndlztb.com\ndlzxyy.com\ndlzyc.com\ndm-hr.net\ndm004.net\ndm0775.com\ndm21.com\ndm300.com\ndm456.co\ndm5.com\ndm591.com\ndm5u.com\ndm67.com\ndm9.com\ndma13.org\ndmacg.net\ndmaking.com\ndmall.com\ndmallcdn.com\ndmallovo.com\ndmb168.com\ndmcdn.com\ndmd968.com\ndmdaili.com\ndmeg88.com\ndmeiti.com\ndmeiti.net\ndmeng.net\ndmentt.help\ndmgapp.com\ndmgeek.com\ndmggb.com\ndmgpark.com\ndmguo.com\ndmgyta.com\ndmgytb.com\ndmhlj.com\ndmhmusic.com\ndmhy.com\ndmicrobe.com\ndmiug.com\ndmjk120.com\ndmjnb.com\ndmjvip.com\ndmm.ink\ndmmaterial.com\ndmooo.com\ndmpdmp.com\ndmpdsp.com\ndmplugin.net\ndmqhyadmin.com\ndmqst.com\ndmqwl.com\ndmread.com\ndmrta.com\ndmrtb.com\ndms365.com\ndmssc.net\ndmtemp.com\ndmtg.com\ndmtgy.com\ndmu-1.com\ndmvvv.com\ndmxs.net\ndmyy.cc\ndmzfa.com\ndmzgame.com\ndmzj.com\ndmzlcn.com\ndmzx.com\ndmzzbjb.net\ndn.com\ndn23.com\ndn580.com\ndn8188.com\ndnake-park.com\ndnatupu.com\ndnbbn.com\ndnbbs.com\ndnbiz.com\ndncable.com\ndndc.cloud\ndnettvbox.com\ndnfziliao.com\ndngswin7.com\ndngz.net\ndnhcc.com\ndningbo.com\ndnion.com\ndnjd.com\ndnjsb.com\ndnlunwen.com\ndnmall.com\ndnmcn.com\ndnnunion.com\ndnole.com\ndnparking.com\ndnpz.net\ndnpz123.com\ndnqc.com\ndnrenfang.com\ndns-diy.com\ndns-dns.net\ndns-sky.com\ndns-url.com\ndns-waf.com\ndns.com\ndns.la\ndns.pub\ndns002.com\ndns0755.net\ndns100.net\ndns110.com\ndns123.net\ndns12345.com\ndns200.net\ndns2008.com\ndns567.com\ndns6132.com\ndns666.com\ndns6868.com\ndns800.com\ndnsabc.com\ndnsany.com\ndnsapi12.com\ndnsbbzj.com\ndnsbubu.com\ndnsce.com\ndnscnc.com\ndnsdaquan.com\ndnsddos.com\ndnsdizhi.com\ndnse0.com\ndnse0.net\ndnse1.com\ndnse1.net\ndnse2.com\ndnse2.net\ndnse3.com\ndnse3.net\ndnse4.com\ndnse4.net\ndnse5.com\ndnse5.net\ndnse6.com\ndnse6.net\ndnse7.com\ndnse7.net\ndnse9.com\ndnse9.net\ndnsfamily.com\ndnsfast.online\ndnsff.com\ndnsfox.net\ndnsgtm.com\ndnsgulf.net\ndnsh6666.com\ndnshe.com\ndnsidentity.com\ndnsinside.net\ndnsip.com\ndnsip.net\ndnsis.net\ndnsjia.com\ndnsjiasu001.com\ndnslin.com\ndnsmeasurement.com\ndnsmsn.com\ndnsng.net\ndnsns5.com\ndnsns6.com\ndnsnut.com\ndnsnw.com\ndnso.fun\ndnsoe1.com\ndnsoe2.com\ndnsoe3.com\ndnsoe4.com\ndnsoe5.com\ndnsoe6.com\ndnsoray.net\ndnsour.com\ndnspai.com\ndnspig.com\ndnspod.com\ndnspod.mobi\ndnspod.net\ndnspod.org\ndnspood.net\ndnsppdd.com\ndnspro.icu\ndnsrw.com\ndnss.vip\ndnssina.com\ndnstest.vip\ndnstx88.cc\ndnsurl.net\ndnsv1.com\ndnsv1.net\ndnsv2.com\ndnsv2.net\ndnsv20.com\ndnsv3.com\ndnsv3.net\ndnsv4.com\ndnsv4.net\ndnsv5.com\ndnsv5.net\ndnsv8.net\ndnsvcache.com\ndnsvhost.com\ndnsvip1.net\ndnsw7777.com\ndnswa.com\ndnswhk.com\ndnswind.net\ndnsx9.cc\ndnsxdp.com\ndnsxv1.com\ndnsxv1.net\ndnsxv2.net\ndnsxv3.com\ndnsxv3.net\ndnsxv4.com\ndnsxv4.net\ndnsxv5.com\ndnsxv5.net\ndnsy8888.com\ndnsyy.net\ndnszftp.com\ndnszh.com\ndnszw.com\ndnurse.com\ndnv-group.com\ndnwxwww.com\ndnxtc.net\ndnxttech.com\ndny123.com\ndny8.com\ndnyywl.com\ndnzh.org\ndnzhuti.com\ndnzjds.com\ndnzp.com\ndo-global.com\ndo-won.com\ndo123.net\ndo1618.com\ndo1999.com\ndo35.com\ndoabit.com\ndoata.net\ndobe-game.com\ndobechina.com\ndobest.com\ndobosc.com\ndobunkan.com\ndoc-baidu.org\ndoc163.com\ndoc361.net\ndoc88.com\ndoccamera.com\ndocer.com\ndocexcel.net\ndocin.com\ndocin.net\ndockerinfo.net\ndockerone.com\ndockerpull.pw\ndockone.io\ndockx.app\ndoclass.com\ndocn.net\ndocodgroup.com\ndocoi.cc\ndocpe.com\ndocs.cdnetworks.com\ndocs.oracle.com\ndocschina.org\ndocshare.org\ndocsj.com\ndocsmall.com\ndocsou.com\ndoctor-network.com\ndoctorbridge.com\ndoctorcom.com\ndoctorkickstart.com\ndoctorscrap.com\ndoctoryou.ai\ndocuarea.org\ndocuments.cdnetworks.com\ndocx88.com\ndocxz.com\ndoczj.com\ndodjoy.com\ndodo8.com\ndodobook.net\ndodoca.com\ndodoeasy.com\ndodoedu.com\ndodoh5.com\ndodonecq.com\ndodonew.com\ndodovip.com\ndoducity.com\ndoercn.com\ndoergob.com\ndoerhr.com\ndoerjob.com\ndoffry.com\ndofolong.com\ndog-e-clothing.com\ndog089a-a66.com\ndogain.com\ndoganinsaatemlak.com\ndogecast.com\ndogecdn.com\ndogecloud.com\ndogecoin.studio\ndogedns.com\ndogedoge.com\ndogevideo.com\ndogfight360.com\ndogfuzhu.com\ndoggygosubs.com\ndoghun.com\ndoglg.com\ndoglobal.net\ndogmr.com\ndogwhere.com\ndogyun.com\ndoh.plus\ndoh.pub\ndohai.com\ndohia.com\ndohuo.com\ndoibns.com\ndoii.cc\ndoingv.com\ndoit.am\ndoitim.com\ndoitwiki.com\ndoiua.com\ndoki8.com\ndolcn.com\ndolfincdnx.com\ndolfincdnx.net\ndolfindns.net\ndolfindnsx.com\ndolfindnsx.net\ndolgma.com\ndolike.com\ndoll-leaves.com\ndoll-zone.com\ndollphoin.site\ndollun.com\ndolovely.net\ndolphin-browser.com\ndolphin-global.com\ndolphin.com\ndolphincube.com\ndolphinpaper.com\ndolphinphp.com\ndom-3d.net\ndomabio.com\ndomaingz.com\ndomigewear.com\ndomilight.com\ndomob-inc.com\ndomobcdn.com\ndomor.net\ndomp4.cc\ndomp4.net\ndondonwenda.com\ndone-home.com\ndonews.com\ndong-shou.com\ndong-xu.com\ndong10.com\ndongaigc.com\ndongannews.com\ndongao.com\ndongaoacc.com\ndongaocloud.com\ndongba.com\ndongbao-cn.com\ndongbao120.com\ndongbaoshengwu.com\ndongbd.com\ndongbeishifandaxue.com\ndongbing.wiki\ndongboauto.com\ndongbochem.com\ndongbosy.com\ndongbucaijing.com\ndongcai.net\ndongcaibao.com\ndongcaibaoxian.com\ndongcaijijin.com\ndongchali.net\ndongchedi.com\ndongchediapp.com\ndongcheng120.com\ndongchenghotels.com\ndongcheyun.com\ndongchuangipr.com\ndongchuanmin.com\ndongdao.net\ndongdianqiu.com\ndongdong.world\ndongdongaijia.com\ndongdongliu.com\ndongdongmai.com\ndongdongwenda.com\ndongdongzu.com\ndongeejiao.com\ndongfahouse.com\ndongfang-heater.com\ndongfang-sisal.com\ndongfang-wh.com\ndongfang.com\ndongfang77.com\ndongfangfuli.com\ndongfanglicaishi.com\ndongfangnews.com\ndongfangnuojin.com\ndongfangqb.com\ndongfangtech.net\ndongfangzi.cafe\ndongfeng-honda-ur-v.com\ndongfeng-honda.com\ndongfeng-nissan.com\ndongfeng-robot.com\ndongfeng.net\ndongfengem.com\ndongfengtc.com\ndongfengtrucks.com\ndongfou.com\ndongfund.com\ndonggaoshiye.com\ndongge.com\ndongguanguoyao.com\ndongguantoday.com\ndonghaidl.com\ndonghaifunds.com\ndonghaileasing.com\ndonghailighter.com\ndonghaotest.com\ndonghetea.com\ndonghongzx.com\ndonghuangshanquan.com\ndonghugroup.com\ndonghui.tech\ndonghuihospital.com\ndonghulvdao.com\ndonghushequ.com\ndongjian.cc\ndongjiao.cc\ndongjiaoapp.com\ndongjiaotn.com\ndongjiax.com\ndongjin-cn.com\ndongjinyu.com\ndongjueonline.com\ndongjujituan.com\ndongjun.cc\ndongjungroup.com\ndongjunhui.com\ndongkafei.com\ndongkelun.com\ndongkouren.com\ndonglaishun.com\ndonglangroup.com\ndongli720.com\ndonglidianji.com\ndonglin.org\ndonglinchem.com\ndonglingying.cc\ndonglinkeji.com\ndonglishuzhai.net\ndonglivillage.com\ndongliw.com\ndonglizhixin.com\ndonglongfm.com\ndongman.la\ndongmansoft.com\ndongmanwang.com\ndongmanxingkong.com\ndongmanzx.com\ndongmiban.com\ndongmk.com\ndongnanmaifeng.com\ndongnanshan.com\ndongnanwangjia.com\ndongni100.com\ndongniao.net\ndongnienglish.com\ndongniyingyu.com\ndongpeng.net\ndongpengjieju.com\ndongpingren.com\ndongputech.com\ndongqiang.com\ndongqiniqin.com\ndongqiudi.com\ndongqiudi.net\ndongri.com\ndongricn.com\ndongrv.com\ndongsentire.com\ndongsenzs.com\ndongshengdasha.com\ndongshiju.com\ndongshou.com\ndongshunxinxi.com\ndongsport.com\ndongtai588.com\ndongtaijt.com\ndongteng.cc\ndongting.com\ndongtu.com\ndongua.com\ndongwm.com\ndongxi.net\ndongxingkonggu.com\ndongxingnet.com\ndongxong.com\ndongxu.com\ndongyanggas.com\ndongyangmotor.com\ndongyao.ren\ndongyaods.com\ndongyaowuliu.com\ndongyewenhua.com\ndongyimg.com\ndongyin.com\ndongyin.net\ndongyixiang.com\ndongyoutu.com\ndongyuansl.com\ndongyuetruck.com\ndongyun.biz\ndongyun01.com\ndongzee.com\ndongzhougroup.com\ndongzhuandi.com\ndongzhuoyao.com\ndongzsec.com\ndonhonet.net\ndoniv.net\ndonlim.com\ndonnor.com\ndonoo.net\ndonper.com\ndontfar.com\ndonvv.com\ndoodoobird.com\ndoofull.com\ndoohe.com\ndooioo.com\ndookay.com\ndooland.com\ndoonsec.com\ndooo.cc\ndoooor.com\ndoooor.net\ndoor-expo.com\ndooready.com\ndoorhr.com\ndoorqr.com\ndoorzo.app\ndoorzo.net\ndoosunggroup.com\ndoov5g.com\ndooya.com\ndopa.com\ndopic.net\ndopo-online.net\ndopoil.com\ndopool.com\ndora-control.cdnetworks.com\ndora-family.com\ndorapp.com\ndorcen.com\ndoremi.ink\ndorgean.com\ndorole.com\ndorpule.com\ndorrr.com\ndoseeing.com\ndoserv.com\ndoservice.com\ndoshome.com\ndosilicon.com\ndosk.win\ndosnap.com\ndospy.com\ndossav.com\ndossen.com\ndostor.com\ndosxs.com\ndot.pub\ndotaindex.com\ndotamax.com\ndotcpp.com\ndotdotnews.com\ndoteck.com\ndotgate.com\ndothantech.com\ndoticloud.com\ndotty-china.com\ndotwe.org\ndou.bz\ndou.li\ndou6.cc\ndoubaijiu.com\ndouban.com\ndouban.fm\ndoubanio.com\ndoubao.com\ndoubaocdn.com\ndoubaozhidao.com\ndoubean.com\ndoubilm.com\ndoubimeizhi.com\ndoublearrow.net\ndoublecoinholdings.com\ndoubleeagle-group.com\ndoublestarmingren.com\ndoublewin123.com\ndoublleclinic.com\ndoubo03.com\ndouboshi.net\ndouc.cc\ndoucang.com\ndoucanlk.xyz\ndoucehua.com\ndouchacha.com\ndouco.com\ndoudang.com\ndoudehui.com\ndoudeke.com\ndoudier.com\ndoudou.com\ndoudou.fun\ndoudou.in\ndoudou1217.com\ndoudou520.online\ndoudouad.com\ndoudoubird.com\ndoudouditu.com\ndoudouguo.com\ndoudouknot.com\ndoudouso.com\ndoufan.tv\ndoufm.net\ndougong.net\ndougongyun.com\ndouguo.com\ndouguo.net\ndouhao.com\ndouhaomei.com\ndouhua.net\ndouhuameiquan.com\ndouhuawenxue.com\ndouhuaxiongmao.com\ndouhuibuy.com\ndouhuomall.com\ndoujis.com\ndoukantv.com\ndoukeji.com\ndoukou.com\ndoulaicha.com\ndoulaidu.cc\ndoulaidu8.cc\ndoule-ref.com\ndouleyun.net\ndoulongyun.com\ndoumenqu.com\ndoumi.com\ndoumiip.com\ndoumistatic.com\ndoumob.com\ndouniwan.org\ndoupai.cc\ndoupay.com\ndoupocangqiong1.com\ndoupuer.com\ndouqi.com\ndouqq.com\ndoushen.com\ndoushisan.com\ndousonvalve.com\ndoutian.me\ndoutianshequ.com\ndoutub.com\ndoutuimao.net\ndoutukeji.com\ndoutushe.com\ndouwanweb.com\ndouxiangtao.com\ndouxie.com\ndouya2.com\ndouyabo.com\ndouyacun.com\ndouyadaili.com\ndouyar.com\ndouyin.com\ndouyin766.com\ndouyinact.com\ndouyinact.net\ndouyincdn.com\ndouyinclips.com\ndouyincloud.net\ndouyincloud.run\ndouyinec.com\ndouyinfe.com\ndouyingequ.com\ndouyinhanyu.com\ndouyinliving.com\ndouyinmusicclips.com\ndouyinmusicpromotion.com\ndouyinmusicvideo.com\ndouyinpay.com\ndouyinpic.com\ndouyinshortvideo.com\ndouyinstatic.com\ndouyinvideo.net\ndouyinvod.click\ndouyinvod.com\ndouyinxs.com\ndouyongtuan.com\ndouyou100.com\ndouyu.com\ndouyu.tv\ndouyuex.com\ndouyuscdn.com\ndouyushepin.com\ndouyutv.com\ndouzaimai.com\ndouzi.com\ndouzihuyu.com\ndouzijiasu.com\ndovechina.com\ndovepay.com\ndovesky.com\ndovov.com\ndowater.com\ndowebok.com\ndoweidu.com\ndowell-health.com\ndowhere.com\ndown10s.com\ndown123.cc\ndown123.me\ndown199.com\ndown568.com\ndown6.com\ndownabc.com\ndownbei.com\ndowncc.com\ndowncodes.com\ndownfi.com\ndowng.com\ndownhand.com\ndownjoy.com\ndownke.com\ndownkr.com\ndownkuai.com\ndownload-cn.msi.com\ndownload.microsoft.com\ndownload.visualstudio.microsoft.com\ndownload.windowsupdate.com\ndownloadcenter.samsung.com\ndownloads.ltd\ndownok.com\ndownos.com\ndownpp.com\ndownqa.com\ndownsave.com\ndownwn.com\ndownxia.com\ndownxing.com\ndownxy.com\ndownyi.com\ndownza.com\ndowv.com\ndowway.com\ndowyuan.com\ndoxo.fun\ndoxue.com\ndoxygen.io\ndoyeah.com\ndoyee.com\ndoyoimg.com\ndoyoo.net\ndoyoudo.com\ndoyouhike.net\ndozview.com\ndp.tech\ndp168.com\ndp2u.com\ndpanel.cc\ndpangzi.com\ndpcafc.com\ndpcq1.net\ndpcyjt.com\ndpd-hul.cfd\ndpdfsd.com\ndpdp.net\ndpdpt-prtra.cfd\ndper.com\ndpfile.com\ndpgz.com\ndpifloor.com\ndpin100.com\ndpjszs.com\ndpkyz.com\ndplor.com\ndplord.com\ndplslab.com\ndpma.cc\ndpn.net\ndpqct.com\ndptech.com\ndptechnology.net\ndptel.com\ndpurat.com\ndpw.pub\ndpwl.net\ndpxkjw.com\ndpxq.com\ndpy8.com\ndq123.com\ndq247.com\ndq3c.com\ndq800.com\ndq99.net\ndqccc.cc\ndqccc.com\ndqcccc.com\ndqdaily.com\ndqdbrc.com\ndqdg.cc\ndqdgame.com\ndqdm.com\ndqguo.com\ndqhsrq.com\ndqhui.com\ndqhyxh.com\ndqiis.com\ndqjob88.com\ndqlaketour.com\ndqlnyy.com\ndqntv.com\ndqntwl.com\ndqoooo.com\ndqpi.net\ndqpkb.com\ndqpu.com\ndqrailing.com\ndqshdj.com\ndqshjt.com\ndqsjt.com\ndqsldz.com\ndqsq.net\ndqsy.net\ndqtzdt.com\ndqyadong.net\ndqyfapiao.com\ndqyouqi.com\ndqyq.com\ndqzboy.com\ndqzrrq.com\ndqzsteel.com\ndr-bj.com\ndr-jm.com\ndr-ku.com\ndr009.com\ndraftstatic.com\ndrageasy.com\ndragon-chem.com\ndragon-download.msi.com\ndragon-guide.net\ndragon-hotel.com\ndragonballcn.com\ndragonest.com\ndragonfgame.com\ndragonfly.fun\ndragonlab.org\ndragonlcm.com\ndragonnewsru.com\ndragonsea-china.com\ndragonseagroup.com\ndragonspringwater.com\ndragontrail.com\ndragontsc.com\ndragonwell-jdk.io\ndragonyq.com\ndrakeet.com\ndramasclub.com\ndramx.com\ndrartisan.com\ndrasy.net\ndratio.com\ndrawyoo.com\ndrbdp.com\ndrcact.com\ndrcbank.com\ndrcg8.com\ndrclvs.com\ndrcnetdns.com\ndrcuiyutao.com\ndrdwy.com\ndream-loft.com\ndream-marathon.com\ndream.ren\ndream211.com\ndreamad.mobi\ndreamai.fun\ndreamavatar.com\ndreambig.work\ndreamboys.org\ndreamcast.hk\ndreamchasercapital.com\ndreame.tech\ndreamershop.com\ndreamkite.net\ndreammeta.net\ndreamo100.com\ndreampiggy.com\ndreams-travel.com\ndreamshell.cc\ndreamspark.download.prss.microsoft.com\ndreamsparkuat.download.prss.microsoft.com\ndrearry.com\ndreawer.com\ndrebella.com\ndressmeup-hk.com\ndrgou.com\ndrice.cc\ndriect-jajpviewd00.com\ndriect-sntpjpviewa08.com\ndriectjp-jeobnksad01.com\ndrinkmagazine.asia\ndrinkpoem.com\ndrip.im\ndripcar.com\ndriver114.com\ndriverchina.com\ndriverdevelop.com\ndrivergenius.com\ndrivers.amd.com\ndriverzeng.com\ndriverzj.com\ndrivethelife.com\ndrjou.cc\ndrlai.com\ndrli.group\ndrlmeng.com\ndrm-lic-dom.net\ndrm-x.com\ndrmaml.com\ndrmsoft.net\ndrockart.com\ndroi.com\ndroiapps.com\ndroiseewd.com\ndroitstock.com\ndroiyou.com\ndrokozz.club\ndropsec.xyz\ndrouma.com\ndrp321.com\ndrpika.com\ndrry.site\ndrscrewdriver.com\ndrscrm.com\ndrsmilehealth.com\ndrsrp.com\ndrstour.com\ndrtyf.com\ndrugadmin.com\ndrugfuture.com\ndruggcp.net\ndrughk.com\ndrugoogle.com\ndruid.vip\ndrupalla.com\ndrupalproject.org\ndrvceo.com\ndrvi.net\ndrvsky.com\ndrxexpo.com\nds-360.com\nds-lg.com\nds028.com\nds123456.com\nds5f.com\ndsary.com\ndsb.ink\ndsbaike.com\ndsblog.net\ndscbs.com\ndscq.com\ndsdbxg.com\ndsdod.com\ndsdyf.com\ndseman.com\ndser.com\ndsfdy.com\ndsfjh.vip\ndsfpz.com\ndsfuse.com\ndsfzcz.com\ndsfzh.com\ndsgaokao.com\ndshigao.com\ndshltech.com\ndshrc.com\ndsilicone.com\ndsjt.com\ndskb.co\ndskj-ops.com\ndsktjt.com\ndskystudio.com\ndslbuy.com\ndslr120.com\ndslrpark.com\ndslt.tech\ndslvts.com\ndslwk.com\ndslyy.com\ndsm888.com\ndsmxp.com\ndsmyiyuan.com\ndsmzyy.com\ndsmzyy120.com\ndsnpz.com\ndsnzyy120.com\ndsook.com\ndsp.com\ndspczg.pw\ndspga.com\ndspgo.com\ndspmt.com\ndspwhy.com\ndsq.com\ndsqzls.com\ndsqzxyy.com\ndsrepark.com\ndss.hk\ndsspinfo.com\ndsssp.com\ndsstudio.tech\ndssz.com\ndst.gov.mo\ndstcar.com\ndstfsbc.com\ndstguanwang.com\ndsti.net\ndsw6.com\ndswjcms.com\ndswljt.com\ndswmt.com\ndswql.com\ndswx.cc\ndswzxh.com\ndsx.ac\ndsx2020.com\ndsxdn.com\ndsxliuxue.com\ndsxys.pro\ndsyqt.com\ndsyun.com\ndsz.cc\ndt-paint.com\ndt-stor.com\ndt123.net\ndt830.com\ndtao.com\ndtcj.com\ndtcms.net\ndtcoalmine.com\ndtcxw.com\ndtdcjt.net\ndtdream.com\ndtdxcw.com\ndtechcn.com\ndtfjw.com\ndthgdq.com\ndthr.com\ndtidc.com\ndtime.com\ndtjh-bj.com\ndtjhgs.com\ndtlpt.com\ndtlqg.com\ndtlty.com\ndtmbw.com\ndtmiller.com\ndtminds.com\ndtmuban.com\ndtnews.net\ndtq.com\ndtrcb.com\ndtrcw.net\ndts007.com\ndtssyy.com\ndtstack.com\ndtstatic.com\ndtston.com\ndttc-icp.com\ndttt.net\ndtuosh.com\ndtuyun.com\ndtwave.com\ndtxww.com\ndtxxjq.com\ndtysky.moe\ndtyunxi.com\ndtyzg.com\ndtzj.com\ndu-hope.com\ndu-xiaomai.com\ndu.biz\ndu7.com\ndu8.com\ndualaid.com\ndualspace.com\ndualspacetech.com\nduan.red\nduangks.com\nduanju.com\nduanju.fun\nduanjuzi.com\nduanlonggang.com\nduanmale.com\nduanmeiwen.com\nduanqu.com\nduanrong.com\nduanshipin.vip\nduanshu.com\nduantian.com\nduanwdm.com\nduanwenxue.com\nduanwenxue8.com\nduanxb.com\nduanxiansen.com\nduanxianxia.com\nduanxin.com\nduanxin520.com\nduanxindao.com\nduanzaixian.vip\nduanzao001.com\nduanzikuaizui.com\nduanziya.com\nduapp-preview.com\nduapp.com\nduapp.net\nduapps.com\nduasrdwb.com\nduba.cc\nduba.com\nduba.net\ndubairen.com\ndubao123.com\ndubbing.tech\ndubbingx.com\ndubbo.io\nduble.live\ndubola.com\ndubprince.com\ndubyc.com\nducafecat.com\nducafecat.tech\nducar.cc\nduchina.com\nduckycn.com\nduckyset.com\ndudong.com\ndudongsheji.com\nduduaa.com\ndudubashi.com\ndududm.com\ndudujb.com\nduduji.com\ndudujuzi.com\ndudulu.org\ndudutalk.com\nduduwo.com\nduelcn.com\ndugoogle.com\ndugrqnn.xyz\nduguying.net\nduhao.net\nduhaobao.net\ndui.ai\ndui88.com\nduia.com\nduiai.com\nduibiao.com\nduibiao.org\nduibimao.com\nduiduihuishou.com\nduiduilian.com\nduiduipengds.com\nduijie666.com\nduikuang.com\nduimg.com\nduimin.com\nduiopen.com\nduipu.com\nduishu.com\nduitang.com\nduitangwang.com\nduitianhe.com\nduiyou360.com\nduiz.net\nduizhuang.com\ndujiabieshu.com\ndujin.org\ndujixiao.com\ndujiza.com\ndujun.io\ndukang.com\ndukechiang.com\nduketop1.com\ndukharo.com\ndukku.com\ndukuai.com\ndule.cc\ndulesocks.com\nduliangaotu.com\ndulife.com\ndulifei.com\ndullr.com\ndulwich.org\ndumall.com\ndumanhua.com\ndumasoftware.com\ndumi0898.com\ndumpapp.com\ndun.la\ndun555.com\ndun599.com\ndunan.net\ndunanac.com\ndunankeji.com\ndunbaigo.com\ndundianwang.com\ndungeon-server.com\ndungkarime.com\ndunhuang-yueqi.com\ndunhuang.com\ndunhuangtour.com\ndunjiaodu.com\ndunkhome.com\ndunstanhardcastle.com\ndunsuan.com\ndunwang.com\ndunzhiwang.com\nduoao.com\nduobiyi.com\nduocaish.com\nduocaitou.com\nduocengban.org\nduochang.cc\nduodaa.com\nduodanke.com\nduodele.com\nduodian.com\nduodiwan.com\nduodunj.com\nduoduo.link\nduoduo123.com\nduoduo365.com\nduoduobang365.com\nduoduocdn.com\nduoduocm.com\nduoduodashi.com\nduoduoipo.com\nduoduopan.com\nduoduoshipin.vip\nduoduoyin.com\nduoduoyoucai.com\nduoduoyouli888.com\nduoduoyuncai.com\nduoduozb.com\nduodutek.com\nduoduwang.com\nduoerpharmacy.com\nduofriend.com\nduofugroup.com\nduogouhui.com\nduohuanbao.com\nduohui.co\nduoic.com\nduokaima.com\nduokaiwang.com\nduokaiya.com\nduokaiyun.com\nduokan.com\nduokanbox.com\nduoke.com\nduoke.net\nduokebao.net\nduokebo.com\nduoku.com\nduolabao.com\nduolabaocdn.com\nduoladayin.com\nduolahua.com\nduolaika.com\nduolaima.com\nduolapiao.com\nduolatom.com\nduolawk.asia\nduolayunwang.com\nduole.com\nduolebaohuang.com\nduolebh.com\nduolebo.com\nduolegame.com\nduolegd.com\nduolegj.com\nduolegouji.com\nduolemahjong.com\nduolemajiang.com\nduolemao.com\nduolepdk.com\nduolephz.com\nduolesj.com\nduolesk.com\nduolexing.com\nduolexq.com\nduoliheng.com\nduoliucui.com\nduoluodeyu.com\nduomai.com\nduomeng.fun\nduomi.com\nduomian-static.com\nduomian.com\nduomiao.pro\nduomicheng.com\nduominuo.com\nduomiyou.com\nduomni.com\nduomo3205.xyz\nduomob.com\nduomoyu.com\nduomu.hk\nduomu.tv\nduonvlangceo.com\nduopaiad.com\nduopao.com\nduopei.cc\nduopei.xyz\nduopingka.com\nduoqu.com\nduorenwei.com\nduorou.com\nduorou.me\nduorou42.com\nduosai.com\nduose.com\nduosenfashion.com\nduoshan.com\nduoshitong.com\nduoshoubang.com\nduoshuo.com\nduososo.com\nduost.com\nduotai.net\nduotaoli.com\nduote.com\nduotegame.com\nduoteyx.com\nduotin.com\nduotoupiao.com\nduotuscdn.com\nduowan.com\nduowanns.com\nduoweijt.com\nduoweisoft.com\nduowenlvshi.com\nduoxinqi.com\nduoxue.com\nduoyewu.com\nduoyi.com\nduoying.com\nduoyinsu.com\nduoyoumi.com\nduozhi.com\nduozhuayu.com\nduozhuayu.net\nduoziwang.com\ndup2.org\ndupingzu.com\nduplo-shandong.com\ndupola.net\ndur9.com\nduread8.com\ndurkcell.com\ndurkeesox.net\ndurkflex.net\ndurongjie.com\ndusaiphoto.com\ndusao.vip\ndusays.com\ndusdn.com\ndusdn.net\ndushaofei.com\ndushewang.com\ndushi118.com\ndushicn.com\ndushifen.com\ndushiliren.net\ndushiquan.net\ndushu.com\ndushu.io\ndushu263.com\ndushu365.com\ndushu369.com\ndushu66.com\ndushudaren.com\nduskonlinestore.com\ndustess.com\ndustglobal.com\ndusulang.com\ndute.me\ndutenews.com\ndutils.com\ndutyfreeyun.com\ndutype.com\nduuchin.com\nduunion.com\nduusuu.com\nduwenxue.com\nduwenz.com\nduwenzhang.com\nduwfi.org\nduxiaomai.net\nduxiaoman-int.com\nduxiaoman.com\nduxiaomanfintech.com\nduxiaomanfund.com\nduxiaomantech.com\nduxiu.com\nduxuetang.com\nduyandb.com\nduyao001.com\nduyaonet.com\nduyixing.com\nduyunfk.com\nduyunshi.com\nduzelong.com\nduzhe.com\nduzhoumo.com\ndv37.com\ndv58.com\ndvagent.com\ndvbbs.net\ndvbcn.com\ndvbei.com\ndvd2017.com.tw\ndvdc100.com\ndvidc.com\ndvmama.com\ndvmission.com\ndvr163.com\ndvrdydns.com\ndvsadive.com\ndvvvs.com\ndw-microbiology.com\ndw4.co\ndwbxg.com\ndwdds.com\ndwforging.com\ndwgbj.com\ndwgszc.com\ndwgwatch.com\ndwhub.net\ndwidc.com\ndwinput.com\ndwion.com\ndwjkgl.com\ndwjpwf.com\ndwjxz.com\ndwmoniqi.com\ndwntme.com\ndwoke.com\ndwq.com\ndwrh.net\ndwsedu.com\ndwsgases.com\ndwstatic.com\ndwstock.com\ndwt.life\ndww11.com\ndwwin.com\ndwxyamaha.com\ndwyeuy.com\ndwywood.com\ndwywooden.com\ndwz.lc\ndwzhs.com\ndwzjd.com\ndx-job.com\ndx-marine.com\ndx-tech.com\ndx00.net\ndx10000.com\ndx2008.com\ndx86.com\ndxbei.com\ndxcc.org\ndxclinics.com\ndxda.com\ndxdl1688.com\ndxdlw.com\ndxe520.com\ndxecs.com\ndxf6.com\ndxfbk.com\ndxfblog.com\ndxgg.co\ndxguanxian.org\ndxhuafu.net\ndxinzf.com\ndxjs.com\ndxjt2013.com\ndxjzz666.com\ndxlfile.com\ndxm-cdn.com\ndxm-int.com\ndxm-yibai.com\ndxmjinr.com\ndxmjuhe.com\ndxmlcf.com\ndxmlcfintech.com\ndxmpay.com\ndxmstatic.com\ndxmwx.com\ndxmyqh.com\ndxncyy.com\ndxnky.com\ndxnt.com\ndxnwyjw.com\ndxper.net\ndxpmedia.com\ndxqck.com\ndxqjg.com\ndxqyy.com\ndxr.com\ndxrc.com\ndxs8.com\ndxsaxw.com\ndxsbb.com\ndxsclass.com\ndxsdermyy.com\ndxshtb.com\ndxsk.com\ndxsng.com\ndxsport.com\ndxsrmyy.com\ndxsvr.com\ndxszx.com\ndxton.com\ndxtradedata.com\ndxtyy.com\ndxuexi.com\ndxwei.com\ndxwfgg.com\ndxxxfl.com\ndxxzjgdgs.com\ndxy.com\ndxy.me\ndxy.net\ndxyan.org\ndxyb.com\ndxycdn.com\ndxyer.com\ndxyff.com\ndxys.pro\ndxyykj.com\ndxzanzhu.com\ndxzhz.com\ndxzk88.com\ndxzq.net\ndxztc.com\ndxzw.com\ndxzx.com\ndy-bus.com\ndy-hospital.com\ndy120.net\ndy163.cc\ndy172.com\ndy1905.net\ndy2018.com\ndy2066.com\ndy3j.com\ndy558.com\ndyaobo2029.com\ndybeta.com\ndycar.net\ndyccb.net\ndycdn.com\ndycic.net\ndycjy.com\ndycloud.run\ndycloudbk.com\ndycmyl.com\ndycnchem.com\ndycom365.com\ndycyw.com\ndydab.com\ndydata.io\ndydt.net\ndye-ol.com\ndyechina.com\ndyedu.net\ndyemp.com\ndyets-cn.com\ndyfc.net\ndyfm200.com\ndyfsp88.wiki\ndyg-hec.com\ndygf.com\ndygmotor.com\ndygod.org\ndygyjs.com\ndygzs.com\ndyhculture.com\ndyhengli.com\ndyhgames.com\ndyhjw.com\ndyhongshun.com\ndyhuidong.com\ndyhxgame.com\ndyjqd.com\ndyjqlrj.com\ndyjs.com\ndyjw.info\ndyjxjt.com\ndyjxsj.com\ndyjymy.com\ndykszx.com\ndykz66.com\ndylc.com\ndyls.app\ndyly.com\ndylyghm.com\ndymatic.com\ndymexhealthcare.com\ndyml.net\ndymusictape.com\ndymusicvideo.com\ndynabook-dbh.com\ndynavolt.net\ndynguyeniq.com\ndyonr.com\ndypf8.com\ndyqc.com\ndyqh.info\ndyqm888.com\ndyrbw.com\ndyrcb.net\ndyrmt.com\ndyrs.cc\ndyrtg.com\ndysday.com\ndysgydlc.com\ndyshf.com\ndyshortvideo.com\ndysj.com\ndysji.com\ndyspcdntip.com\ndythmy.com\ndytmgm.com\ndytss.com\ndytt2028.cc\ndytt789.com\ndytt7899.com\ndytt8.net\ndytt89.com\ndytuj6zs26.com\ndyvideotape.com\ndywcc.com\ndywuyuan.com\ndywxs.com\ndywzx.com\ndyxldjy.com\ndyxsdwm.com\ndyxtw.com\ndyxuexin.com\ndyxw.com\ndyxz.la\ndyxzyy.com\ndyys.com\ndyysdhv.xyz\ndyysoft.net\ndyyy120.com\ndyzdx.com\ndyzpw.com\ndyzs163.com\ndyzsart.com\ndyzxw.org\ndz-ailive.com\ndz-ic.net\ndz-x.net\ndz-z.com\ndz.tt\ndz000.com\ndz0566.com\ndz11.com\ndz137.com\ndz169.com\ndz19.net\ndz1982.com\ndz211.com\ndz31hao.com\ndz88.com\ndz98.com\ndzabosn.com\ndzbarcode.com\ndzbchina.com\ndzbdq.com\ndzblo.com\ndzboligang.com\ndzbxk.com\ndzcch.com\ndzcj.tv\ndzcjw.com\ndzcmedu.com\ndzcnc.com\ndzcolor.com\ndzcrcgas.com\ndzdesign.cc\ndzdiy.com\ndzdu.com\ndzdvip.com\ndzdxs.net\ndzdzzd.com\ndzemotor.com\ndzfang.com\ndzfc.com\ndzfjsm.com\ndzfwjd.com\ndzgg.com\ndzglsb.net\ndzgxq.com\ndzh.link\ndzhlive.com\ndzhope.com\ndzhqexpo.com\ndziuu.com\ndzjc.com\ndzjkw.net\ndzjob.net\ndzjzg.com\ndzkbw.com\ndzkx.org\ndzlaa.com\ndzlems.net\ndzljy.com\ndzllzg.com\ndzlndygh.com\ndzmachines.com\ndzmhospital.com\ndzng.com\ndzoptics.com\ndzp.tv\ndzpc.net\ndzpezp.com\ndzpk.com\ndzpklite.com\ndzpknews.com\ndzqrmyy.com\ndzqu.com\ndzqxj.com\ndzr120.com\ndzrbs.com\ndzrcd.com\ndzronghui.com\ndzrsteel.com\ndzs2004.com\ndzsaas.com\ndzsaascdn.com\ndzsc.com\ndzsdg.com\ndzsg.com\ndzsjgroup.com\ndzsjtjt.com\ndzsm.com\ndzspzx.com\ndzsrcw.com\ndzst999.com\ndzszlsyxgs.com\ndztester.com\ndztugongbu.net\ndztv.tv\ndztz168.com\ndzvv.com\ndzw3.com\ndzwad.com\ndzwebs.net\ndzwindows.com\ndzwork.net\ndzwww.com\ndzwww.net\ndzwy.com\ndzxsw.net\ndzxw.net\ndzxwnews.com\ndzxxzy.com\ndzxzh.com\ndzy.link\ndzybk.com\ndzyqc.com\ndzyule.com\ndzyysb.com\ndzyzj.com\ndzz.cc\ndzzcgs.com\ndzzgsw.com\ndzzoffice.com\ndzzui.com\ndzzy88.com\ndzzyisp.com\ne-10031.com\ne-adcon.com\ne-ande.com\ne-bidding.org\ne-buychina.com\ne-byte.com\ne-cbest.com\ne-celap.com\ne-chinalife.com\ne-cig-market.com\ne-ciie.com\ne-cloudstore.com\ne-cookies.net\ne-cspc.com\ne-cuc.com\ne-czt.com\ne-elitech.com\ne-eway.com\ne-fangtong.com\ne-flyinc.com\ne-fong.com\ne-ging.com\ne-ging.net\ne-giordano.com\ne-gooo.com\ne-guofu.com\ne-hongw.com\ne-hqins.com\ne-huaxue.com\ne-icco.com\ne-jianxiu.com\ne-jitp-dom.com\ne-jitp-dom.net\ne-jitp-glo.com\ne-jitp-glo.net\ne-jjj.com\ne-jlt.com\ne-kawai.com\ne-kays.com\ne-length.com\ne-lining.com\ne-mallchina.com\ne-mmt.com\ne-nci.com\ne-nebula.com\ne-net.hk\ne-onekey.com\ne-peilian.com\ne-picclife.com\ne-pointchina.com\ne-power.vip\ne-pxn.com\ne-qdpm.com\ne-readbook.com\ne-ruikd.com\ne-seenet.com\ne-sleb.com\ne-sscard.com\ne-tecsun.com\ne-tiller.com\ne-ufnb.com\ne-uniongroup.com\ne-vaulting.com\ne-xina.com\ne-xp05.vip\ne0453.com\ne0514.com\ne0575.com\ne0734.com\ne0838.com\ne12345.com\ne1288.com\ne1299.com\ne12e.com\ne13000d6f1019.beer\ne151475d71020.beer\ne1617.com\ne1988.com\ne213155.com\ne21cn.com\ne22a.com\ne23dns.net\ne24c.com\ne253.com\ne27e02c891010.beer\ne2capp.com\ne2edesign.com\ne2esoft.com\ne2say.com\ne307586127f21050.com\ne32047a8e21fbc0a.com\ne32a01b94145bb23.com\ne3492587711012.beer\ne360e.com\ne363172a110241.beer\ne365mall.com\ne36b9a1c210301.beer\ne3861.com\ne38647b2411b17c3.com\ne399.com\ne3j.co\ne3ol.com\ne4008.com\ne43bb71e710272.beer\ne44e4e8c11020.beer\ne452a362210291.beer\ne495f363ae7187cf.com\ne4d0c1f1d1021.beer\ne4e4c4415fd53198.com\ne4l4.com\ne4xk2cvh.work\ne508250086b14d75.com\ne53w.com\ne5413.com\ne5865f69dee0.xyz\ne58860e249bf56ad.com\ne58b70798965b223.com\ne58f8d5eb11032.beer\ne5a743f9511d287d.com\ne5d929dd82a164f1.com\ne5d9384f510292.beer\ne5e333e55e5e3d.xyz\ne5hc.com\ne5n.com\ne5sj.com\ne5tech.com\ne600.com\ne656gps.com\ne65u.com\ne66609.com\ne68cname.com\ne6ad1d0761021.beer\ne6gps.com\ne763.com\ne77b0ff1f10241.beer\ne7890.com\ne7ba7566e10291.beer\ne7cc97fab56d13b6.com\ne7cn.net\ne7e6.net\ne7e7e7.com\ne7f60ece99e82d92.com\ne7flash.com\ne7lang.com\ne7wan.com\ne7wei.com\ne7z.net\ne8034d5ac1022.beer\ne80bf18e978d9e37.com\ne80fb4ced1015.beer\ne81fd4b49ca5e6a4.com\ne836g.com\ne88u.com\ne890.com\ne8bfeae1bf34023d.com\ne8cfdb0ee10272.beer\ne9527ad346cb0157.com\ne9797.com\ne9898.com\ne99999.com\nea-china.com\nea-retina.com\nea-xing.com\nea360.com\nea3w.com\nea65d2a2f16d6b8c.com\nea6d86dbe8e3e423.com\nea7c8805e10241.beer\nea89f50fde822303.com\neabax.com\neachnet.com\neachsee.com\neachtravel.com\neachwave.com\neadianqi.com\neaeacn.com\neaecis.com\neaf341cc30c286cf.com\neafifaonline2.com\neagle-sight.com\neaglebgm.com\neaglebrandgroup.com\neagleceramics.com\neaglecoin.com\neaglejt.com\neaglemale.com\neaglenos.com\neagleyun.com\neagllwin.com\neagonxc.com\neagsen.com\neaibot.com\neaka365.com\neal-ceair.com\neallcn.com\neallerp.com\neamn.net\neanfang.com\neanmed.com\neap2.net\neapchina.net\near0.com\neardatek.com\nearlytrip.fun\nearningapp.info\nearth-science.net\nearth-traveller.com\nearth2037.com\nearthdq.com\nearthedu.com\nearthstar-cloud.com\nearture.org\neasck.com\neascs.com\neasea.net\neasebar.net\neasecation.net\neaseconvert.com\neasefun.info\neaseheal.com\neasemob.com\neaserun.com\neasesale.com\neasesdk.com\neaseslb.com\neasetuner.com\neaseus.com\neaseyedelivery.com\neashu.com\neasi-tech.com\neasilysend.com\neasipass.com\neasipay.net\neasitcn.com\neasiu.com\neasonad.com\neasou.com\neast-regis.com\neast.net\neast263.com\neastall.com\neastar-group.com\neastbest.com\neastbuy.com\neastchinafair.com\neastcmc.com\neastcom-group.com\neastcom-sw.com\neastcom.com\neastcom.site\neastcompeace.com\neastcoms.com\neastday.com\neastdesign.net\neastdrama.com\neastdushi.com\neasteat.com\neastecloud.com\neastecp.com\neastelsoft.com\neastent.com\neastern-tek.com\neasternalong.com\neasternpose.com\neastforever.com\neastfu.com\neasthc.com\neasthome.com\neastib.com\neasticloud.com\neastjl.com\neastjq.com\neastled.com\neastlen.com\neastlending.com\neastmab.com\neastmannplastics.com\neastmarathon.com\neastmoney.com\neastmoneyfutures.com\neastmoneyloans.com\neastmoneysec.com\neastobacco.com\neastpharm.com\neastpump.com\neastshanghaifair.com\neastsilver.com\neastsoo.com\neastspacelight.com\neaststarbio.com\neasttone.com\neastunion.net\neastups.com\neastwin-zc.com\neastwinn.com\neastwudpharma.com\neastyule.com\neasu.net\neasugar.com\neasy-all.net\neasy-china.com\neasy-dotnet.com\neasy-eai.com\neasy-ent.com\neasy-h5.com\neasy-linkholiday.com\neasy-mock.com\neasy-signing.com\neasy163.net\neasy2world.com\neasy361.com\neasy888.com\neasyapple.net\neasyar.com\neasyarvr.com\neasybug.org\neasyclean.fun\neasydarwin.org\neasyder.com\neasydo.work\neasydoc.net\neasyeda.com\neasyfang.com\neasyfapiao.com\neasyfunfun.com\neasygame2021.com\neasygametime.com\neasygovm.com\neasyhaitao.com\neasyhin.com\neasyidc.com\neasylabplus.com\neasyliao.com\neasyliao.net\neasylinkin.com\neasylinkin.net\neasymule.com\neasynet.vip\neasypakk.com\neasypayx.com\neasyrecovery.cc\neasyrecovery.net\neasyrecoverychina.com\neasyrecoverycn.com\neasyscholar.cc\neasysensor.net\neasysofthome.com\neasyswoole.com\neasytifen.com\neasytimetv.com\neasytite.com\neasytocn.com\neasytogophuket.com\neasytomessage.com\neasytouch-manager.com\neasytouch.com\neasytrip.com\neasyv.cloud\neasywza.com\neasyya.com\neasyzw.com\neaton-samc.com\neatonbusbar.com\neatuo.com\neavic.com\neawh.com\neaydu.com\neayh.com\neaymusic.com\neayou.com\neayuan.com\neayyou.com\neazypharm.com\neazytec-cloud.com\neb-ind.com\neb0de9d6bc52f2d0.com\neb10c842d10291.beer\neb623580160e8cbc.com\neb80.com\neb94ccc9625d8539.com\nebadfbe1278533ae.com\nebadu.net\nebaifo.com\nebaina.com\nebaixing.com\nebama.net\nebancom.com\nebangchina.com\nebank96518.com\nebanma.com\nebanshu.net\nebaodai.com\nebaoquan.org\nebaotech.com\nebasset.com\nebb6ea72919edea2.com\nebbcb476210291.beer\nebbf2f9101016.beer\nebchina.com\nebchinaintl.com\nebchinatech.com\nebcvm.org\nebdan.net\nebdoor.com\nebfb8c1c2f714608.com\nebfcn.com\nebfkc.com\nebfortune.com\nebgic.com\nebibi.com\nebico.com\nebidbid.com\nebidding.com\nebigear.com\nebiobuy.com\nebiomall.com\nebiotrade.com\nebioweb.com\nebjfinance.com\nebjservice.com\neblockschina.com\nebls-group.com\nebnew.com\nebocert.com\nebookmen.com\nebopark.com\neboxmaker.com\nebpftravel.com\nebptp.com\nebrun.com\nebscn-am.com\nebscn.com\nebseek.com\nebsfw.com\nebt.group\nebtang.com\nebtcbank.com\nebtrust.com\nebuckler.com\nebullienceconsultancy.com\nebumbrella.com\nebuy16.com\nebuy1718.com\nebways.com\nebyet.com\nebyte.com\nec-ae.com\nec-cloudtech.com\nec-dns.com\nec-founder.com\nec-sz.com\nec-world.com\nec.com\nec07yxgd11.com\nec233.com\nec3s.com\nec45f2d84111f960.com\nec4ca59341009.beer\nec4e54545d0e31fa.com\nec51.com\nec6056a95386f752.com\nec8j.com\necac1cd921021.beer\necadi.com\necaidian.com\necaihr.com\necamzone.cc\necanmed.com\necaptechnology.com\necaray.com\necare365.com\necarechina.com\necarxgroup.com\necb43b6f5064acc6.com\necbcamp.com\necboo.com\necbos.com\necbuy.net\neccang.com\neccc-china.com\neccdnx.com\neccn.com\neccnmall.com\necco-market.com\neccpos.com\necdag.net\necdnx.com\necduo.com\nece-global.com\neceibs.com\neceibs.net\neceibs20.com\necej.com\necer.com\necerdns.com\necerimg.com\necf-gov.com\necgci.com\necgoods.com\necgtool.com\nechanceyun.com\nechangye.com\nechao8.com\nechargenet.com\necharpile.com\nechatsoft.com\nechead.com\nechemsrc.com\nechepiao.com\nechiele.com\nechinacareers.com\nechinacities.com\nechinagov.com\nechinalife.org\nechinatobacco.com\necho-isoftstone.com\necho188.com\nechoing.tech\nechoteen.com\nechovelle.com\nechu-cable.com\nechuaren.com\nechunlan.com\nechuzhou.com\neci-everconn.com\neciawards.org\necice06.com\necinnovations.com\necitic.com\neciticcfc.com\necjobhome.com\necjson.com\neckwai.com\necloud-gdu.com\necloud.hk\necmc-nj.com\necmould.com\necnpl.net\necnu.net\necnuas.com\necnudec.com\neco-seavol.com\neco-system.xyz\necoalchina.com\necocn.org\necodreamers.com\necoland-plan.com\necoliving168.com\necolovo.com\necom-lightapp.com\necomanbiotech.com\necombdapi.com\necombdimg.com\necombdpage.com\necombdstatic.com\necombdvod.com\necomoter.com\necontactsplus.com\necool.site\necoplastech.com\necoprint.tech\necorr.org\necotourgroup.com\necouser.net\necovacs.com\necovacsgroup.com\necowrd.com\necp-cloud.com\necp-cloud.net\necphk.com\necplf.com\necppn.com\necpsrplus.com\necqd.com\necqun.com\necr-global.com\necrrc.com\necs6.com\necsage.net\necscoupon.com\necscpu.com\necshop.com\necshop123.com\necsits.com\necspartner.com\necsponline.com\necsxs.com\nectdno.com\nectencent.com\nectnno.com\nectnno.org\nectrip.com\necuc123.net\necukwai.com\necustmde.com\necv360.com\necvv.com\necwan77.net\necydm.com\necyti.com\necyzm.com\ned-textile.com\ned21.cc\ned2k.vip\ned2kers.com\ned2kk.com\ned403ab821011.beer\ned77fc33a10241.beer\ned834dbe3264d3a0.com\neda-china.com\neda1024.com\neda2.com\neda365.com\neda365.net\neda4bf686e3ac7d4.com\neda7fb17710272.beer\nedaboss.com\nedadoc.com\nedagit.com\nedai.com\nedaibo.com\nedaili.com\nedaixi.com\nedaizhijia.com\nedajob.com\nedaka.org\nedaocha.com\nedata100.com\nedatahome.com\nedatop.com\nedawiki.com\nedaxiang.com\nedazhang.com\nedb-tech.com\nedcba.com\nedcdfg.com\nedcfda.com\neddic.net\neddingpharm.com\neddong.com\neddycjy.com\nede35.com\nededian.com\nedefang.net\nedengjiang.com\nedesson.com\nedge-byted.com\nedge-cluster-hk-pre.com\nedgefn.net\nedgegslb.com\nedgekey88.net\nedgemec.com\nedgeone-ai-dev.com\nedgeone-ai.com\nedgeone-browser-rendering-dev.com\nedgeone-browser-rendering.com\nedgeone.ai\nedgeone.app\nedgeone.cool\nedgeone.run\nedgeone.site\nedgeonedy1.com\nedgeonev1.com\nedgeonev1.net\nedgeonev2.com\nedgeonev2.net\nedgeonev3.com\nedgeonev3.net\nedgeonev4.com\nedgeonev4.net\nedgeonev5.com\nedgeonev5.net\nedgep.net\nedgesrv.com\nedgetls.xyz\nedhic.com\nedi198.com\nedianda.com\nedianshang.com\nediantec.com\nedianyun.com\nedianzu.com\nediaoyu.com\nediconf.org\nedifier.com\nedimob.com\nedingzhuan.com\nedisec.net\neditorjianying.com\neditsprings.com\nediuschina.com\nedlcaster.com\nedmcn.net\nedmseller.com\nedns.com\nedojia.com\nedong.com\nedongeejiao.com\nedongli.net\nedongyun.com\nedoou.com\nedowning.net\nedozx.com\nedqgk.com\nedragongame.com\nedrawsoft.com\nedream-tech.com\nedsionte.com\nedspay.com\nedt2017.com\nedt2018.com\nedtsoft.com\nedty.com\nedu-cj.com\nedu-edu.com\nedu-nw.com\nedu03.com\nedu0851.com\nedu1488.com\nedu24o1.com\nedu24ol.com\nedu4399.com\nedu510.com\nedu5a.com\nedu63.com\nedu777.com\nedu84.com\nedu84.net\nedu88.com\neduaaf.com\neduaiplat.com\neduancm.com\neduapaashwc.com\neduardoam.com\neduartisan.com\neducg.net\neduchn.net\neducoder.net\nedudc.net\nedudigital123.com\neduease.com\neduego.com\neduei.com\neduglobal.com\neduglobalchina.com\neduhuoshi.com\nedui.fun\neduic-sh.com\neduiso.com\nedujia.com\nedujianshe.com\nedujiaoyu.com\nedukuang.com\nedulawonline.com\nedulivevideo.com\nedumail.pub\nedumine.net\nedumq.com\nedumsys.com\neduour.com\nedupm.com\nedurck.com\nedushi.com\nedusoho.com\nedusoho.net\nedusy.net\nedutalkingdata.com\nedutao.com\nedutime.net\nedutrackconsult.com\nedutxw.com\neduu.com\neduuu.com\neduwenzheng.com\neduwest.com\neduwo.com\neduwx.com\nedux.design\neduxcxportal.com\neduxiji.net\neduydt.com\neduyf.com\neduyo.com\neduzb.com\neduzhai.net\neduzhixin.com\neduzs.net\nedwiv.com\nedxmy.cc\nee-nav.com\nee067e33bd637916.com\nee123.net\nee1234.com\nee409d6370bfc826.com\nee45560.com\nee68.com\nee6da7410adfd3aa.com\nee702ec398aaecfd.com\nee99.net\neeban.com\neebbk.com\neebbk.net\neeboard.com\neechina.com\neecnt.com\neecourse.com\neecso.com\needevice.com\needns.com\needzvv.com\neee-eee.com\neee4.com\neeeam.com\neeedri.com\neeedu.net\neeeen.com\neeeetop.com\neeeff.com\neeekkk.com\neeeknow.com\neeeqi.net\neees.cc\neeetb.com\neeezahomemena.com\neefans.com\neefcdn.com\neeff.net\neefocus.com\neefung.com\neegem.com\neehk.net\neehu.com\neei168.com\neeio99.com\neeioe.com\neeju.com\neelly.com\neema.info\neenzo.com\neeook.com\neeparking.com\neepw.com\neeqiu.com\neeskill.com\neeso.net\neestar.com\neetoday.com\neetop.com\neetrend.com\neetrust.com\neeuetqbv.shop\neevision.com\neeworld.com\neeworm.com\neexiaoshuo.com\neeyd.com\neeyxs.com\neeyy.com\neeyys.com\neezml.com\nef-cdn.com\nef17145aecd7dd06.com\nef360.com\nef360.net\nef369594911012.beer\nefang.tv\nefangcdn.com\nefangwang.com\nefapiao.com\nefasco.com\nefashionchina.com\nefashioncloud.com\nefb6ff0d81022.beer\nefbf407b011021.beer\nefchina.org\nefe.cc\nefengqing.com\nefesco.com\neff-soft.com\neff85fd9610292.beer\neffapp.com\nefficient.hk\neffirst.com\neffood.net\nefglobal-gy.com\nefivestar.com\nefl-tech.com\neflagcomm.com\neflybird.com\neflycloud.com\neflydns.net\nefmac.net\nefnchina.com\neforclub.com\nefotile.com\nefount.com\nefoxconn.com\nefpp.com\neftime.com\nefucms.com\nefueloil.com\nefuin.com\nefunchina.com\nefuncn.com\nefunent.com\nefunq.com\nefusc.com\nefwh.com\nefy-tech.com\nefzhou.com\nefzzs.com\negainnews.com\negbt.net\negcmedia.com\negeel.com\negfb2221.com\neggbnk.com\neggrj.com\neghimalayanak.com\neghnmj.xyz\negjqgs.com\nego-robotics.com\negoint.com\negongzheng.com\negooad.com\negood995.com\negoonet.com\negotops.com\negou.com\negou68.com\negouz.com\negovsum.com\negpctiz.com\negpharm.com\negqch.link\negrdrill.net\negreatworld.com\negret-labs.org\negret.com\negridconsulting.com\negrowads.com\negsea.com\negshuyuan.com\negsssy.com\negt365.com\negu365.com\neguangjie.com\neguantao.com\negwealth.hk\negxlx.com\nehafo.com\nehaier.com\nehaini.com\nehaiwang.com\nehang.com\nehanglian.com\nehangtian.com\nehaohai.com\nehaoyao.com\nehaoyao.us\nehclglobal.com\nehealthcareforum.com\nehecd.com\nehedco.com\nehejun.com\nehengjian.com\neheren.com\nehetech.com\neheyin.com\nehijoy.com\nehinvest.hk\nehnasia.com\nehnchina.com\nehome-env.com\nehome5.com\nehome8.com\nehomeclouds.com\nehomeday.com\nehousechina.com\nehowbuy.com\nehowbuy.net\nehrel.com\nehschina.com\nehsy.com\nehtcn.com\nehualu.com\nehuarun.com\nehuatai.com\nehuataifund.com\nehub.net\nehui.net\nehuijing.com\nehujia.com\nehuoke.com\nehuoyan.com\nehuoyun.com\nehutu.com\nehuyao.com\nehuzhu.com\nei6nd.com\neia-data.com\neia543.com\neiacloud.com\neiafans.com\neiccmall.com\neickaopei.com\neicodesign.com\neicourse.com\neicp.net\neicp.vip\neicuhq.xyz\neiczz.com\neid-sft.com\neidcenter.com\neidlink.com\neidtokencloud.com\neifini.com\neightbridge.com\neightedu.com\neigpay.com\neihtfire.com\neiicn.com\neiisys.com\neiixx.com\neijiucq.com\neilieili.cc\neimoney.com\neinfo-tech.com\neingdong.com\neinkcn.com\neinsteintiles.com\neintone.com\neiot.com\neisoo.com\nejamad.com\nejc56.com\nejcms.com\nejcop.com\nejdrone.com\nejdyin.com\nejectu.com\nejecx.com\nejee.com\nejeegroup.com\nejfeng.com\nejhimalayanje.com\nejia7.net\nejiacn.com\nejianlong.com\nejianmedia.com\nejiawang.cc\nejiayou.com\nejiayu.com\nejie.me\nejiecheng.com\nejinshan.net\nejion.net\nejktj.com\nejmrh.com\nejomoo.com\nejoo.cc\nejoy.com\nejoy365.com\nejoy365hk.com\nejrfood.com\nejsoon.win\nejtieyi.com\nejtsyc.com\neju.com\nejudata.com\nejuhome.com\nejunshi.com\nejustcn.com\nejy365.com\nek-edu.com\nek1ng.com\nekaidian.com\nekan001.com\nekang99.com\nekangji.com\nekaobang.com\nekaoyan.com\nekaoyan365.com\nekclubinternational.com\nekdoc.com\nekecdn.com\nekewy.com\nekimmigration.com\neking-tech.com\nekingair.com\nekingtopwood.com\nekoooo.com\neks0451.com\nekuaibao.com\nekumao.com\nekumb.com\nekuzy.com\nekweixin.com\nekwing.com\nekxx.net\nelabinfo.com\nelabpic.com\nelaina.vin\nelaiter.com\nelameyal.com\nelane.com\nelangchina.com\nelanking.com\nelanp.com\nelanso.com\nelanw.com\nelascloud.com\nelawoffice.net\nelbmodel.com\neldamu.com\neldawa.com\nele.me\nele.to\nele001.com\nele1.com\nele12.com\nelec100.com\nelecfans.com\nelecfans.net\nelecinfo.com\nelecloud8.com\nelecrystal.com\nelecshop.com\nelecspn.com\neleduck.com\nelefang.com\nelefirst.com\nelegant-prosper.com\nelegsant.com\nelelx.com\neleme.hk\neleme.io\nelemecdn.com\nelement3ds.com\nelementaw.com\nelementfresh.com\nelenet.me\nelephant-base.com\nelephantrobotics.com\neleui.net\nelevator-expo.com\nelex-tech.net\nelexcon.com\nelextec.com\nelfartworld.com\nelfinbook.com\nelfjs.com\nelht.com\nelian5.com\nelianhong.com\nelianmeng.vip\neliansy.com\nelianwiz.com\neliaoxuke.com\nelicht.com\nelikeme.com\nelikeme.net\nelimautism.org\neling.me\nelingka.com\nelingyun.com\nelinzy.com\nelita.work\nelite-shooters.com\nelitecrm.com\nelitenexusgroup.com\nelitesland.com\nelitetie.com\nelitimes.com\neliwang.com\nelkpi.com\nellassay.com\nellechina.com\nellemen.com\nelleschool.com\nelliotxing.com\nelmerlxy.com\nelmerzhang.com\neloancn.com\nelong-edm.com\nelong.com\nelong.net\nelongai.com\nelonghotel.com\nelongshine.com\nelongstatic.com\nelongtrip.com\nelontest.com\neloonggame.com\neloongsun.com\nelpcon.com\nelpland.com\nelpont.net\nelpsky.com\nels001.com\nelsker.com\nelsz5.xyz\neltmall.com\neltt.org\neltws.com\neluxiu.com\neluying.com\nelvgufen.com\nelvshi.com\nelvxing.net\nelxk.com\nelysia.beauty\nem86.net\nemai.com\nemail.fund\nemaileds.com\nemailflame.com\nemailuo.com\nemailxqq.com\nemak.hk\nemakerzone.com\nemall001.com\nemao.com\nemao.net\nemaozi.com\nemapgis.com\nemarbox.com\nemarketingw.com\nemas-poc.com\nematong.com\nemaup.com\nemavil.com\nemax.cc\nembcom.net\nembed-cloudstudio.net\nembed.cc\nembedfire.com\nembedhq.org\nembedmcu.com\nembedsky.com\nembedtrain.org\nembedu.org\nembedunion.com\nembedway.com\nembest-tech.com\nembryform.com\nembryochina.com\nembsky.com\nemby.men\nemby.yun\nembyvip.org\nemcbj.com\nemcdir.com\nemcsosin.com\nemdoor.com\nemea.cdnetworks.com\nemed.cc\nemeiju.com\nemeixian.com\nemeixs.com\nemengju.com\nemeok.com\nemepu.com\nemeratech.com\nemergencyexit.xyz\nemfuture.com\nemilechouriet.com\nemiltorres.com\nemin123.com\neminsheng.com\nemiretasnbd.com\nemjianshen.com\nemjob.com\nemlinix.com\nemlog.net\nemmmn.com\nemodor.com\nemoji6.com\nemojimobile.com\nemoriko.com\nemotibot.com\nemotofine.com\nemots.cc\nemoyu.com\nemqx.cloud\nemqx.com\nemqx.net\nemr-volces.com\nems-audio.com\nems517.com\nemsepc.com\nemshost.com\nemshua.com\nemsym.com\nemtana.com\nemtcm.com\nemtronix.com\nemtx.com\nemu999.net\nemuban.com\nemuch.net\nemuchong.com\nemugif.com\nemui.com\nemui.tech\nemuia.com\nemulatedlab.com\nemumax.com\nemupic.com\nemushroom.net\nemwan.com\nemzexzfp.com\nen-micro.com\nen.tm\nen51.com\nen5static.com\nen8848.com\nen998.com\nenacdn.biz\nenacdn.info\nenacdn.net\nenaiter.com\nename.com\nename.net\nenantiotech.com\nenappstore.com\nenbamaoyi.com\nenbrands.com\nencthinking.com\nenderbbs.fun\nenderuixm.com\nendianpp.com\nendovastec.com\nendowa-auto.com\nendress.store\nendurance-shinmaywa.com\nenec.net\nenelcn.com\nenergy-greenland.com\nenergy-root.com\nenergy-zj.com\nenergychina.press\nenergyhz.com\nenerpat.net\nenet16.com\nenet16.net\nenet360.com\nenet369.com\nenetedu.com\nenfi.vip\nenflame-tech.com\nenfodesk.com\nenforever.com\neng24.com\nengeniustec.com\nengeyuan.com\nengkoo.com\nengley.com\nenglibrary.com\nenglish163.com\nenglishdict.cc\nenglishmasterclub.com\nenglishtimes.cc\nengloncar.com\nengpx.com\nengr-z.com\nenguo.com\nengz.net\nengzai.com\nenianteam.com\nenicn.com\neniu.com\nenjerr.com\nenjlink.com\nenjoy.link\nenjoy1992.com\nenjoy3c.com\nenjoycare.com\nenjoydiy.com\nenjoyfe.com\nenjoyglobal.net\nenjoying3d.com\nenjoykorea.net\nenjoymeet.com\nenjoynowapp.com\nenjoyor.net\nenjoyyue.com\nenjoyz.com\nenketu.com\nenkichen.com\nenkj.com\nenkris.com\nenlaide.com\nenlightent.com\nenlistsecurely.com\nenmonster.com\nenmotech.com\nenmuo.com\nenn-ng.com\nennenergy.com\nennew.com\nennewpower.com\nennews.com\nennmt.com\nennobay.com\nennocad.com\nennovabio.com\nennpet.com\nennpower.com\nennresearch.com\nenovatemotors.com\nenoya.com\nenpapers.com\nenpht.com\nenpower-sd.com\nenpowermicro.com\nenproscm.com\nenqoo.com\nenread.com\nenricgroup-sh.com\nenrlb.com\nenroo.com\nenroobbs.com\nenruida.com\nenruigroup.com\nenrz.com\nens4.com\nenshide.com\nenshijob.com\nensignworld.com\nenstylement.com\nent001.com\nent120.com\nentengll.com\nenterdesk.com\nenterdesk.net\nentive.com\nentstudy.com\nentts.com\nenunix.com\nenuomachinery.net\nenvi-ch.com\nenvisionagents.com\nenvisioncn.com\nenwing-tech.com\nenxicled.com\nenyamusical.com\nenyugame.net\nenzj.com\neo-edgefunctions.com\neo-edgefunctions2.com\neo-edgefunctions3.com\neo-edgefunctions4.com\neo-edgefunctions5.com\neo-edgefunctions6.com\neo-edgefunctions7.com\neo-edgefunctions8.com\neo-edgefunctions9.com\neo-ns.com\neo-preview.com\neo-shieldspace.com\neo-vod.com\neo-vod1.com\neo-vod2.com\neo-vod3.com\neo-vod4.com\neo-vod5.com\neo-vpcgw.com\neoacc2.com\neoacme-dev.com\neoaluminium.com\neobuwieplonline.com\neoeandroid.com\neoemarket.com\neoemarket.net\neoffcn.com\neofreqctrl.com\neofreqctrlbk.com\neogamewechat.com\neoivisa.com\neojofdrzei4.com\neolce.com\neolink.com\neolinker.com\neomgames.net\neomoo.com\neomoy.com\neonad.org\neonlytech.com\neonun.com\neoof.net\neoofoo.com\neooioo.com\neoopoo.com\neooqoo.com\neoouoo.com\neoovoo.com\neoriver.com\neorzea.moe\neosantpool.com\neoss-hj.com\nep-china.net\nep-zl.com\nep12.com\nep365.com\nep8u.com\nepaas.net\nepaiclub.com\nepailive.com\nepalfish.com\nepandian.com\nepanshi.com\nepark.cc\nepassway.com\nepay.com\nepaynfc.com\nepbiao.com\nepchina.com\nepcnn.com\nepcservicio.com\nepcsw.com\nepd3.com\nepday.com\nepeaksport.com\nepeimall.com\nepeo.net\nepermarket.com\nepesr.com\nepet.com\nepetbar.com\nepetpet.com\nepexpo-asia.com\nepfrontier.com\nepg-power.com\nephen.me\nephua.com\nepian1.com\nepiaogo.com\nepibiotek.com\nepicgamesspot.com\nepichust.com\nepinautomation.com\nepinduo.com\nepinga.com\nepinhoo.com\nepinv.com\nepinzu.com\nepjike.com\nepjob88.com\nepkey.com\neplove.com\nepluspvy.com\nepnnel.com\nepoos.com\neportyun.com\neprcw.com\neprezi.com\neps-tigermed.com\nepsea.com\nepshw.com\nepstsoft.com\neptchina.com\neptsz.com\nepub360.com\nepubit.com\nepweike.com\nepwitkey.com\nepwk.com\nepzcw.com\nepzwxs.com\neq321.com\neqding.com\neqh5.com\neqicha.com\neqidi.com\neqie.com\neqifa.com\neqigou.com\neqingdan.com\neqixiu.com\neqiyingxiao.com\neqlky.com\neqmis.com\neqmobi.com\neqnvip.com\neqoavtbu.com\neqq.net\nequalocean.com\nequdong.net\nequipmentimes.com\neqxiu.com\neqxiul.com\neqxiuzhan.com\neqyn.com\ner07.com\neraclean.com\neraedu.com\neral.com\neran123.com\neranet-dns.com\neranet.com\neranqi.com\nerapp.run\nerbadu.com\nerbingimg.com\nercc.cc\nercfh.com\nerda.cloud\nerdaicms.com\nerdangame.xyz\nerdangjiade.com\nerdiamond.com\nerdianzhang.com\nerdong.site\nerdosedu.com\nerdosrcb.com\nerdossysw.com\nerelcn.com\nerentalcarpro.com\nereter.com\nereuiib.com\nerfang-ic.com\nergeapp.com\nergecdn.com\nergedd.com\nergediandian.com\nergeduoduo.com\nergengtech.com\nergengtv.com\nergouzi.fun\nerhlyc.club\nerhss.org\nerhua.cc\neric-bot.com\nericdeng.net\nerichfund.com\neriqua.com\nerji.com\nerji.hk\nerji.net\nerjianglin.com\nerjiren.com\nerk8.com\nerke.com\nerkuai.com\nerldoc.com\nerlo.vip\nerlou.com\nermain.com\nermao.com\nermao.live\nermeiti.com\nermiao.com\nernaonet.com\nernest.me\nernxzc.com\neroacg.com\neromesalo.com\nerongdu.com\nerp321.com\nerp321.net\nerpang.cc\nerpingge.com\nerpwd.com\nerro.life\nersantian.com\nershicimi.com\nersjk.com\nersoso.com\nersuo.com\nert.icu\nert7.com\nerthb.online\nertmineq.com\nertongkongjian.com\nertongtuku.com\nertoutiao.com\nerun.cloud\nerun360.com\nervtqeq1206.vip\nerw.cc\nerxin360.com\nerxitong.com\nerya100.com\neryajf.net\neryanet.com\neryi.org\neryyutu.com\nerzzz.com\nes-soccer.com\nes100.com\nes2q.com\nes86.com\nes9e.com\nesa2000.com\nesafenet.com\nesandcloud.com\nesavip.com\nesbedu.com\nesbook.cc\nesc.show\nescdn.com\nescjy.com\nesclt.net\nescortevenly.com\nesdaxiagu.com\nesde.cc\nesdhm.net\nesemseo.com\nesenagro.com\nesensoft.com\nesgforum.com\nesgz.com\neshangle.com\nesheep.com\neshenlin.com\neshimin.com\neshine-logistics.com\neshiyun.info\neshop-switch.com\neshopb2c.com\neshow365.com\neshufa.com\neshuizong.com\neshukan.com\neshzp.com\nesilk.net\nesinidc.com\nesipark.com\nesjlf.com\nesjson.com\nesk365.com\neskedu.com\neskimall.com\neskysky.com\neslosity.com\neslygroup.com\nesmartwave.com\nesnai.com\nesnai.net\nesni.tech\nesnpc.com\nesoboy.com\nesoho.org\neson.org\nesoo.org\nesoogle.com\nesou.biz\nesoua.com\nesound.vip\nesouou.com\nespeedpost.com\nesplus.club\nespnlol.com\nesports-console.com\nesportsreg.com\nesr.com\nessaystar.com\nessca.com\nessclick.com\nessemi.com\nessencefund.com\nesseniot.com\nessent-tech.com\nession.com\nessjj.com\nesstglobal.com\nessurl.com\nesswye.com\nessxp.com\nessyy.com\nestandonhotel.com\nesteellink.com\nestelchina.com\nestonegroup.com\nestory365.com\nestrongs.com\nesttools.com\nestudychinese.com\nestun.com\nesudai.com\nesugimoto.com\nesun21.com\nesun88.com\nesune.com\nesunny.com\nesunresin.com\nesurging.com\neswin.com\neswincomputing.com\neswlnk.com\neswxj.com\neswzx.com\nesxlt.com\neszmall.com\nesztsg.org\nesztyg.com\neszwdx.com\neszyb.com\net-api.com\net-cdn.com\net-fine.com\net001.com\net0731.com\net363.com\net59.com\netagri.com\netang.com\netao.com\netaog.com\netaswisswatch.com\netbet.com\netccenter.com\netccenters.com\netcchebao.com\netcgsx.com\netchcb.com\netcifk.vip\netcifw.vip\netciwe.vip\netcsd.com\netcsx.com\netcupor.cc\netczs.net\netczx.com\netelux.com\neternalsys.com\neterngroup.com\netescape.com\netest8.com\neteste.com\netf.group\netf88.com\netfcjz.com\netfiber.net\netg56.com\nethainan.com\nethan.pub\nethercap.com\nethereum.work\netian365.com\netiantian.com\netiantian.net\netimeusa.com\netitgo.com\netiv.me\netjournals.com\netjy.com\netlong.com\netmoc.com\netmtoy.com\netmwanju.com\netocrm.com\netokzt.site\netolies.com\netomlink.com\neton-tech.com\netonetech.com\netonfood.com\netong.com\netongchem.com\netongguan.com\netonjx.com\netonkidd.com\netonkids.com\netool.cc\netoote.com\netoote.net\netoplive.com\netoprun.com\netoptour.com\netoubao.com\netoujie.com\netovl.org\netowncapital.com\netownestate.com\netpass.com\netpcar.com\netplat.com\netpowers.com\netrack01.com\netrack02.com\netrack03.com\netrack04.com\netrack05.com\netrack07.com\netrack08.com\netradegx.com\netransfar.com\netranshare.com\netrasemi.com\netrd.org\netrol.com\netrump.net\nets100.com\netsc-tech.com\netsingshan.com\netsoon.com\netsstar.com\nett-cn.com\nett.cc\nettabiotech.com\nettbl.org\nettdnsv.com\nettdnsv.net\nettinn.com\nettshop.com\netu6.com\netuan.com\netuan123.com\netudu.com\netuogroup.com\netuoyi.com\netuschool.org\netxcs.com\netycx.com\netyy.com\netyyy.com\netz927.com\netzj.net\netzqw.com\netzzy.com\neu4cn.com\neub-inc.com\neuci-software.com\neucure.com\neudic.net\neuejia.com\neuetsp.website\neueui.com\neufc.org\neuforums.com\neui.cc\neuibe.com\neuino.com\neulike.com\neulixos.com\neumt.com\neur-go.com\neurasia.edu\neurasiacasinolasvegas.com\neuratao.com\neureka.name\neurkon.com\neuroasia-p.com\neurochinesedaily.com\neurofinscn.com\neuropapa.com\neurope.com.hk\neuropewatch.com\neuropewatch.com.hk\neursell.com\neusercenter.com\neushophq.com\neusoftbank.com\neuwan.com\neuzw.net\nev123.com\nev123.net\nev3ds.com\nev88.com\nev98.com\neva-group.com\neva001.com\nevacellbio.com\nevan.xin\nevancg.com\nevanway.net\nevask360.com\nevcar.com\nevcard.com\nevcard.vip\nevcrrc.com\nevdays.com\nevdo.vip\neve.moe\nevebattery.com\nevefashion.com\nevening.me\neventown.com\nevents.pub\neveqbow.xyz\never9527.com\neverbox.net\neverbright.com\neverbright21.com\neverbrightlaw.com\neverbrightphotonics.com\nevercarecn.com\neverdns.com\neverdrawing.com\nevereasycom.com\neveredit.net\neveret.org\nevergrande.com\nevergrandeauto.com\nevergrandeservice.com\nevergrandespring.com\nevergreen-plastics.com\nevergreen2012.org\neverichgroup.com\neverisker.com\neverknight.net\neverlight-space.com\nevernakedcake.com\neverpay.org\neverrobot.com\neversino.com\neverspry.com\neverstar.xyz\neverstray.com\neversun-chn.com\neverybodysuo.com\neverychina.com\neverydo.com\neveryinch.net\neveryonejun.com\neveryouthtech.com\nevestemptation.com\nevewan.com\nevfchina.com\nevget.com\nevgezphv.com\nevhui.com\nevideostb.com\nevileyesaint.com\nevilleaker.com\nevinchina.com\nevisa99.com\nevisionics.com\nevisugo.com\nevketang.com\nevkworld.net\nevlightpro.com\nevlook.com\nevmam-tbrat.com\nevobserver.com\nevoc.com\nevocqd.com\nevotrue.com\nevpartner.com\nevpowergroup.com\nevtcn.com\nevtrust.com\nevyy.net\nevzhidao.com\nevznl.org\nevzs.com\new-wirestripping.com\new80.com\new80.net\new80yun.com\new9z.com\newaga.com\newang.com\newaninfo.com\newarecomputer.com\newaterchina.com\newatt.com\newceo.com\newdcloud.com\newebeditor.net\newebsoft.com\newecha.com\newei.com\neweiqi.com\neweirong.com\neweis.com\newemt.com\newen.co\newenyan.com\newhnzmqncm7.com\newidecloud.com\newidewater.com\newidewater.net\newie.net\newin007.com\newinshine.com\newinshocks.com\newoka.com\newomail.com\neworksglobal.com\neworldship.com\newpeinfo.com\newqcxz.com\newrrpuquc1.com\newsaas.com\newstudy.com\newt360.com\newteacher.com\newtp.com\newtp.org\newu.cc\newuzhen.com\newzqsyuc.link\nex-energybattery.com\nex-silver.com\nex-starch.com\nex360.com\nexact-ic.com\nexam100.net\nexam58.com\nexam76.com\nexam8.com\nexamcoo.com\nexamda.com\nexamebook.com\nexamk.com\nexampx.com\nexamw.com\nexands.com\nexaphotons.com\nexasic.com\nexbaotuan.com\nexbapp.com\nexbot.net\nexc-resin.com\nexc118.com\nexcake.com\nexcalibur.link\nexcarepharm.com\nexcbio.com\nexcean.com\nexceedconn.com\nexcegroup.com\nexcegroupur.com\nexcel8.com\nexcel880.com\nexcelbbx.net\nexcelcn.com\nexcelhome.net\nexcellbio.com\nexcellencegroupfoundation.com\nexcelpharma.com\nexcelpx.com\nexcm.net\nexcoino.com\nexd.design\nexdoll.com\nexedus.com.co\nexeedcars.com\nexemplifyt.com\nexexm.com\nexezhanqun.com\nexfree.com\nexhera.com\nexhobby.com\nexia.xyz\nexiaoba.com\nexiliumgf.com\nexinee.com\nexingbao.com\nexiqu.com\nexllog.com\nexmailgz.com\nexmailqq.com\nexmay.com\nexmetis.com\nexmoo.com\nexmrw.com\nexnpk.com\nexntech.com\nexound.com\nexp99.com\nexpba.com\nexpdns.net\nexpec-tech.com\nexpensiveg.com\nexpin.site\nexpingworld.com\nexpiredns.net\nexpirenotification.com\nexpirepausedns.com\nexpku.com\nexplinks.com\nexplorehainan.com\nexplorexd.com\nexpo-china.com\nexpo-nb.com\nexpocemat.com\nexpodmc.com\nexpoeye.net\nexpohsp.com\nexpolifestyle.com\nexponingbo.com\nexpoon.com\nexpoooo.com\nexpoquan.com\nexpotu.com\nexpowindow.com\nexpozh.com\nexpressboo.com\nexpresscompanynetwork.com\nexpreview.com\nexprun.com\nexpsky.com\nexquisite-automotive.com\nexscapesmoke.com\nexsvc.net\next2fsd.com\nextech-sh.com\nexteriorm.com\nexternalcoop.com\nextfans.com\nextqq.com\nextron-tech.com\nextscreen.com\nextstars.com\nexuanfang.cc\nexuanpin.com\nexuanshi.com\nexuekt.com\nexueshi.com\nexuezhe.com\nexyws.org\ney100.com\ney3g.com\ney99.com\neyacn.com\neyangfan.com\neyangguang.com\neyangzhen.com\neyao168.com\neyaobei.com\neyaodev.xyz\neyar.com\neyasglobal.com\neyasgloble.com\neybond.com\neybook.com\neycfhb.com\neycms.net\neydata.net\neydns.com\neye023.com\neye024.com\neye025.com\neye027.com\neye0510.com\neye0515.com\neye0561.com\neye0712.com\neye0731.com\neye0746.com\neye0770.com\neye0771.com\neye0773.com\neye0774.com\neye0775.com\neye0776.com\neye0777.com\neye0779.com\neyeabc.com\neyee.com\neyeofcloud.com\neyeofcloud.net\neyepetizer.net\neyeplay.org\neyesar.com\neyeshenzhen.com\neyeso.net\neyhsj.com\neyili.com\neyingchuang.com\neyingyubao.com\neyiwu.com\neyiyoxz.xyz\neyoodns.com\neyoogo.com\neyou.com\neyou.net\neyoubaidu.com\neyoucms.com\neyouct.com\neyoumb.com\neyoungindustry.com\neyourbusiness.com\neyouwx.com\neyprint.com\neyspwkg.com\neyuangong.com\neyuconnect.com\neyugame.com\neyunidc.com\neyunzhu.com\neyuyan.com\neyuyan.la\neyuyao.com\neyuzhu.com\neywedu.com\neywedu.net\neywedu.org\neyy168.com\neyy8.vip\neyyyye.com\neyz.ink\nez-leaf.com\nez01.com\nezagoo.com\nezaiai.com\nezca.org\nezchip.tech\nezcname.com\nezcpt.com\nezcun.com\nezdnscenter.com\nezeeship.com\nezeroshop.com\nezfuns.com\nezhangdan.com\nezhangu.com\nezhayan.com\nezhicai.com\nezhijiantuoluo.com\nezhiwan.com\nezhou.com\nezhousetech.com\nezhu.com\nezhun.com\nezhupei.com\nezindie.com\neziot.com\nezjhw.com\nezlippi.com\nezliushao.com\nezloo.com\neznowdns.com\neznowdns.net\nezone-h5.com\nezonsport.com\nezpro.pro\nezreal.cool\nezrent.hk\nezrpro.com\nezshou.com\nezsuperfans.com\neztcn.com\neztest.org\neztvnet.com\nezucoo.com\nezviz.com\nezwan.com\nezwanjia.com\nezwise.com\nezzls.com\nezzxw.com\nf-0.cc\nf-biology.com\nf-dou.com\nf-insight.com\nf-stack.org\nf.biz\nf.cx\nf008.com\nf015dfc4510292.beer\nf049443d111032.beer\nf0580.com\nf0758.com\nf08ecb0455f06f18.com\nf09qgja1.com\nf0f21399311031.beer\nf1-shanghai.com\nf11w.com\nf130.com\nf139.com\nf14ed7c801022.beer\nf1943w.com\nf1d28bdd11019.beer\nf1zd.com\nf26.cc\nf2c8017f110281.beer\nf2cca7592f8a0441.com\nf2time.com\nf2zd.com\nf315.cc\nf32365.com\nf3322.net\nf3322.org\nf33eb245b1022.beer\nf385e7fcd1013.beer\nf397350c0958109e.com\nf3bed1ef51013.beer\nf3ff28a3e1015.beer\nf40ca6aa911042.beer\nf419a55f61023.beer\nf41g.com\nf42cccb808.forum\nf442165e29dbca6e.com\nf44b9bd1fe4e913f.com\nf49f8e0421015.beer\nf4a107d7a11012.beer\nf4b2ed8f711011.beer\nf4e2a302f1016.beer\nf52o04oylrbmfw.com\nf537.com\nf542d8de71022.beer\nf5432.com\nf54321.com\nf54c463ad528b39a.com\nf567c912a077aacc.com\nf5cs.com\nf5ec7553b5ec6ea3.com\nf5fa5ff8ef7379ba.com\nf5gh.com\nf5sd.com\nf5yx.com\nf66a747451016.beer\nf69a662cb11031.beer\nf6b06c2d5821c34e.com\nf6c62f7ab11031.beer\nf6d4a4f461010.beer\nf6yc.com\nf704204fa11021.beer\nf71f38e6a1015.beer\nf746c2da252336a6.com\nf7777.net\nf79ca805111881f6.com\nf79f9e5b71019.beer\nf7aa9093710281.beer\nf7chinavip.com\nf7e84829210281.beer\nf7yuncdn.com\nf800909401015.beer\nf8167007e7bf667d.com\nf831fb9ce11031.beer\nf8e772f41348c086.com\nf8fm.com\nf92ec0629f52f064.com\nf94fa469f5680337.com\nf9ee74bf602c79cf.com\nf9f4a38021013.beer\nfa-part.com\nfa-today.com\nfa-tojoin.com\nfa2da1f5b1024.beer\nfa80a608ec3e1ead.com\nfaadcf6d01009.beer\nfaakee.com\nfaanw.com\nfaayoo.com\nfabang.com\nfabao365.com\nfabaofoundation.com\nfabaogou.com\nfabiao.com\nfabiaoqing.com\nfabigbig.com\nfablusa.com\nfabpo.com\nfabu114.com\nfaburuanwen.com\nfabuzhushou.com\nfacaishu.com\nfacang.com\nfacash.com\nface-plus-plus.com\nface100.net\nface2ai.com\nfaceboer.com\nfacebookol.com\nfacebooksx.com\nfacecloud.net\nfacedic.com\nfaceface2.com\nfacehufu.com\nfaceid.com\nfacejoking.com\nfacephoto.com\nfaceplusplus.com\nfacernt.com\nfaceu.com\nfaceu.mobi\nfaceu.net\nfaceui.com\nfaceunity.com\nfachcloud.com\nfacri.com\nfactchina.com\nfactj.com\nfactube.com\nfad9e7ce5a0de13c.com\nfada12888888.work\nfadada.com\nfadesky.com\nfadfunds.com\nfadior.cc\nfadoudou.com\nfadoushi.com\nfadsc.com\nfadsfasd.asia\nfadui.com\nfaer.work\nfafa9.com\nfafaku.com\nfafawang.com\nfafeng.com\nfafuli.com\nfagaoshi.com\nfageka.com\nfagua.net\nfaguowenhua.com\nfahai.com\nfahuolianmeng.com\nfaidev.cc\nfaidns.com\nfaieduusr.com\nfaihdusr.com\nfaimallusr.com\nfaioo.com\nfaipod.com\nfair-guard.com\nfair1688.com\nfairguard.net\nfairguard.tech\nfairhr.com\nfairkwa.com\nfairplaycloud.com\nfairso.com\nfairygui.com\nfairysen.com\nfairysoft.net\nfairysoftware.com\nfairytest.com\nfaiscm.com\nfaisco.com\nfaisys.com\nfaiusr.com\nfaiusrd.com\nfaiww.com\nfajiayun.com\nfajihao.com\nfakamiao.com\nfakamiao.shop\nfakeloc.cc\nfakeluxurywatches.com\nfalconnet.app\nfalconsending.com\nfalcontalent.com\nfaloo.com\nfamascro.com\nfameile.net\nfameirui.com\nfamen163.com\nfamenbaike.com\nfamens.com\nfamens.vip\nfamensi.com\nfamily-marathon.com\nfamilyincloud.com\nfamilykoloro.com\nfamilylifemag.com\nfamilyzuji.com\nfaminuo.com\nfamiyou.com\nfamobiotech.com\nfamousoffice.com\nfamoustone.com\nfamulei.com\nfan-lun.com\nfan-md.com\nfan-tastic.fun\nfan-xun.com\nfan88.com\nfanai.com\nfanbook.mobi\nfancl-vip.com\nfancyapi.com\nfancydmp.com\nfancydsp.com\nfancyecommerce.com\nfancygo.xyz\nfancysmp.com\nfancysocialtalk.com\nfandcode.com\nfandengds.com\nfandian.com\nfandiankeji.com\nfandongxi.com\nfane8.com\nfanerkongjian.com\nfanfannet.com\nfanfou.com\nfang-te.com\nfang-zhou.com\nfang.com\nfang.xin\nfang24k.com\nfang33.com\nfang668.com\nfang91.com\nfang99.cc\nfang99.com\nfangbaba.xyz\nfangbei.org\nfangcang.com\nfangcece.com\nfangchan.com\nfangche.net\nfangchengbao.com\nfangchengbaoapp.com\nfangchengganglvxingshe.com\nfangchip.com\nfangcloud.com\nfangcunshan.xyz\nfangda-specialsteels.com\nfangda.com\nfangdacarbon.com\nfangdaijisuanqi.com\nfangdaquan.com\nfangdd.com\nfangdichanceo.com\nfangdr.com\nfangdudu.com\nfangfa.net\nfanggeek.com\nfangguan6.com\nfanghenet.com\nfangheng.com\nfanghua120.com\nfanghuafu.com\nfanghuihui.com\nfangjia.com\nfangjiadp.com\nfangjinsuo.com\nfangkeduo.net\nfangkewang.com\nfangko.com\nfangkuai.com\nfangkuai.link\nfangkuaiwang.com\nfangkuaiyi.com\nfanglb.com\nfangle.com\nfangliju.com\nfanglimei.com\nfanglinad.com\nfanglitong.com\nfangma.com\nfangming.com\nfango8.com\nfangpaiwang.com\nfangqk.com\nfangrun.com\nfangshan.us\nfangshanzi.com\nfangsheji.com\nfangshengaxle.com\nfangsi.net\nfangstar.com\nfangtan007.com\nfangtangtv.com\nfangte.com\nfangtian.net\nfangtong.com\nfangtx.com\nfangwei315.com\nfangweima.com\nfangwuzaixian.com\nfangxfang.com\nfangxian.org\nfangxiaobao.net\nfangxiaoer.com\nfangxin.com\nfangxinbao.com\nfangxinbiao.com\nfangxinmai.com\nfangxinzhuomian.com\nfangxu.work\nfangyanzazhi.com\nfangyb.com\nfangyi.com\nfangyiai.com\nfangyou.com\nfangyouquan.com\nfangyouw.com\nfangyuan-group.com\nfangyuan365.com\nfangyuanhp.com\nfangyuannew1zycdn.cc\nfangyunlin.com\nfangzd.com\nfangzew.com\nfangzhengip.com\nfangzhengshufa.com\nfangzhenxiu.com\nfangzhipeng.com\nfangzhouad.com\nfangzhoukonggu.com\nfangzhoulawyer.com\nfangzhouqihang.com\nfangzhoushidai.com\nfangzhouyanglao.com\nfangzongguan.com\nfanhai-hk.com\nfanhaib.com\nfanhaic.com\nfanhangame.ltd\nfanhaoyue.com\nfanhar.com\nfanhonghua.net\nfanhougame.com\nfanhuaholdings.com\nfanhuan.com\nfanhuan.org\nfanhuishou.com\nfanin.cc\nfaniuwenda.com\nfanjianhome.com\nfanjinyan.com\nfanjunyang.zone\nfankebang.com\nfankhome.com\nfankuweb.com\nfanli.com\nfanli001.net\nfanlibei.com\nfanlihe.com\nfanlihi.com\nfanlihotels.com\nfanlitou.com\nfanlv.fun\nfanmeilantian.com\nfanmimi.com\nfanmingming.com\nfanmugua.net\nfannaojiputi.com\nfanooo.com\nfanpaijidian.com\nfanpanjidain.com\nfanpusoft.com\nfanqianbb.com\nfanqiang.com\nfanqianxs.com\nfanqianzhushou.com\nfanqie.im\nfanqiecopyright.com\nfanqiejiang.net\nfanqienovel.com\nfanqieopen.com\nfanqieopenpic.com\nfanqieopenstatic.com\nfanqieopenvod.com\nfanqier.com\nfanqiesdk.com\nfanqiesdkpic.com\nfanqiesdkstatic.com\nfanqiesdkvod.com\nfanqietianqi.com\nfanqievv.com\nfanqiewin10.com\nfanqiexitong.com\nfanquanwang.com\nfanruan.com\nfanruanclub.com\nfanryes.com\nfans35.com\nfans8.com\nfanshicekong.com\nfanshigang.com\nfanshui.net\nfansiji.com\nfansimg.com\nfansjoy.net\nfansobattery.com\nfansoon.com\nfansx.com\nfansyes.com\nfantablade.com\nfantaiai.com\nfantaicdn.net\nfantaitech.com\nfantanggame.com\nfantasticbin.com\nfantatech.com\nfantawild.com\nfante.com\nfantibody.com\nfantnet.com\nfantong.com\nfantsida.com\nfanttec.com\nfantuan.hk\nfanuc666.com\nfanuchdf.com\nfanw8.com\nfanwantianyu.com\nfanwe.com\nfanwen118.com\nfanwenbaike.com\nfanwenq.com\nfanwenzhan.com\nfanwubi.org\nfanxian.com\nfanxiang.com\nfanxianw.com\nfanxiaojian.com\nfanxing.com\nfanxingliveshow.com\nfanxingshidaitech.com\nfanxuefei.com\nfany-eda.com\nfany-online.com\nfanyantao.com\nfanyeda.com\nfanyedu.com\nfanyi.com\nfanyi1234.com\nfanyiba.net\nfanyibase.com\nfanyigou.com\nfanyigou.net\nfanyijia.com\nfanyiqi.net\nfanyishang.com\nfanyitec.com\nfanyouvip.com\nfanyu.com\nfanyu.work\nfanyuip.com\nfanzehua.com\nfanzhidu.com\nfanzhiyang.com\nfapharm.com\nfapiao.com\nfapiao365.com\nfapiaobang.com\nfaq-whtasapp.com\nfaq-whtasapp.net\nfaqianjia.com\nfaqiren.com\nfar-china.com\nfar123.com\nfar800.com\nfaraconix.com\nfaradayfuturecn.com\nfaradynamics.com\nfareastcontainers.com\nfarenhui.com\nfarennews.com\nfarerdak.com\nfarfir.com\nfarisl.com\nfarmasino.com\nfarmkd.com\nfarmsec.com\nfarsee2.com\nfarsightdev.com\nfarsiightppc.com\nfas-bee.com\nfasensor.com\nfashaoyou.net\nfashengba.com\nfashilawfirm.com\nfashionan.com\nfashionszshow.com\nfashiontrenddigest.com\nfashuounion.com\nfasionchan.com\nfast-eyes.com\nfast-heat-cartridge-heaters.com\nfast.im\nfastadmin.net\nfastapi.net\nfastbuild.run\nfastcdn.com\nfastchina.net\nfastdo.cc\nfastener-cn.net\nfastener.cc\nfastgz.com\nfastidea.cc\nfastidea.me\nfastindexs.com\nfastliii.com\nfastmirror.net\nfastmirror.org\nfastmis.com\nfastmock.site\nfastmovie88.com\nfastmyna.com\nfaston56.com\nfastonetech.com\nfastoper.com\nfastposter.net\nfastreportcn.com\nfastsdwan.com\nfastsilver.press\nfastsoc.com\nfastsoso.cc\nfaststatics.com\nfastx-ai.com\nfat-tail.com\nfat999.com\nfatangmedia.com\nfatbobman.com\nfateadm.com\nfatedier.com\nfateqi.com\nfatfreader.com\nfatherai.com\nfatiao.pro\nfatier.com\nfatoan.com\nfatvg.com\nfaussefrance.com\nfaussemontrerolex.com\nfavang.com\nfavdeb.com\nfavopen.com\nfavoreducation.com\nfavorites.ren\nfaw-vw.com\nfaw.com\nfawan.com\nfaway.com\nfawmc.com\nfawsoft.com\nfawulu.com\nfawuzaixian.com\nfaxdns.com\nfaxdns.net\nfaxianjingpin.com\nfaxianla.com\nfaxianlaw.com\nfaxianpindao.com\nfaxingbao.com\nfaxingchina.com\nfaxingcn.com\nfaxingsj.com\nfaxingzhan.com\nfaxiufang.com\nfaxuan.net\nfaxy-tech.com\nfayfans.com\nfayifa.com\nfayimen.com\nfayiyi.com\nfayufaguo.com\nfazhijx.com\nfazz.fun\nfb32dc52302e6b9b.com\nfb46cd5483f029aa.com\nfb4bc82f71019.beer\nfb56.com\nfbaichuan.com\nfbank.com\nfbatop.com\nfbf6c93bf10272.beer\nfbflex.com\nfbjsgf.com\nfbkjapp.com\nfbku.com\nfblife.com\nfblsj.com\nfbnxb.com\nfbook.net\nfbpaas.com\nfbsjedu.com\nfbuy365.com\nfbxslw.com\nfbyvalve.com\nfc-smartglobal.xyz\nfc0531.com\nfc0633.com\nfc224220480630b3.com\nfc3e2b88fc5254c9.com\nfc571.com\nfc62.com\nfc811.com\nfc858.com\nfc92322b910311.beer\nfcachinagsdp.com\nfcai.com\nfcapp.run\nfcb16888.com\nfcbox.com\nfcboxmall.com\nfcbs999.com\nfcbsgroup.com\nfcbu.com\nfcc8aa32d10251.beer\nfcchbj.com\nfccs.com\nfccscar.com\nfccxgjg.com\nfcczp.com\nfcd2448c6211c5a6.com\nfcdecb0b610261.beer\nfcg01.com\nfcg0770.com\nfcgasj.com\nfcgby.com\nfcgfcjy.com\nfcgfzjy.com\nfcggsj.com\nfcghbxx.com\nfcglib.com\nfcgsaps.com\nfcgsnews.com\nfcgstzjt.com\nfcguoan.com\nfcgxt.com\nfcgzjchy.com\nfcgzph.com\nfcgzrkq.com\nfcgzrzyqxyj.com\nfchospital.com\nfcjjdbsc.com\nfcjjt.com\nfcjob.net\nfcjob88.com\nfcjtaobao.com\nfcjuxian.com\nfckpw.com\nfclassroom.com\nfcldaf.com\nfcljt.com\nfclouddns.net\nfcloudpaas.com\nfcnes.com\nfcnode.net\nfcpawn.com\nfcpiao.com\nfcpowerup.com\nfcqjc.com\nfcrc114.com\nfcs1.com\nfcsc.com\nfcsccz.com\nfcsdzly.xyz\nfcseiko.com\nfcstor.com\nfcsubcn.cc\nfcsubcn.pro\nfctaiwan.com\nfcto.rest\nfcuit.com\nfcvvip.com\nfcw0633.com\nfcw6.com\nfcwei.com\nfcwr8.com\nfcwyglyxgs.com\nfcxxh.org\nfcxzb.com\nfcz.ink\nfcz360.com\nfczhongwang.com\nfczlpt.com\nfczlsc.com\nfczst.com\nfczx.com\nfd-capital.com\nfd-trust.com\nfd-yy.com\nfd-zj.com\nfd08a9f9a1016.beer\nfd7c.com\nfdbatt.com\nfdc0746.com\nfdcjj.org\nfdcyun.com\nfdczbstatic.com\nfdd0cd79c10281.beer\nfdeent.org\nfdeer.com\nfdevops.com\nfdf46bd061024.beer\nfdfhtl.com\nfdfinvoice.com\nfdgearbox.com\nfdjskf.com\nfdjzu.com\nfdkfloor.com\nfdkm88.com\nfdlbeckwai.com\nfdleckwai.com\nfdlt.net\nfdmhmm.com\nfdooo.com\nfdqc.com\nfdren.com\nfdrobot.com\nfdtsgs.com\nfdttgroup.com\nfdx-fund.com\nfdxww.com\nfdxxjs.com\nfdzcxy.com\nfdzq.com\nfdzyy.com\nfdzzjs.com\nfe-cable.com\nfe15a959f1020.beer\nfe232d4b510271.beer\nfe2x.cc\nfe520.com\nfe7f9abcbf8e1dd2.com\nfeadi.com\nfeanton.com\nfeapp.net\nfeatchina.com\nfebbab1472011af4.com\nfecc.cc\nfecify.com\nfecmall.com\nfecn.net\nfecshop.com\nfedlearner.net\nfedte.cc\nfeeair.com\nfeeclouds.com\nfeedcoop.net\nfeedcoopapi.com\nfeedsp.com\nfeeeco.com\nfeehi.com\nfeejii.com\nfeekr.com\nfeel-bar.com\nfeelcars.com\nfeelchat.net\nfeelec.net\nfeelnowtrip.com\nfeelsoar.com\nfeemoo.com\nfeemoo.vip\nfeepan.com\nfeeprint.com\nfeesing.com\nfeeyan.com\nfeeye.com\nfeeyo.com\nfeeyun.com\nfefd203.xin\nfegine.com\nfeheadline.com\nfehelper.com\nfehorizon.com\nfei580.com\nfeiair.com\nfeiauto.com\nfeibajiasu.com\nfeibaokeji.com\nfeiben-starter.com\nfeibians.com\nfeibing.tech\nfeibisi.com\nfeibisi.org\nfeibit.com\nfeibo.com\nfeichangrice.com\nfeichicloud.com\nfeichong.net\nfeicool.com\nfeicui168.com\nfeicui99.com\nfeicuishuo.com\nfeicuiwuyu.com\nfeida-china.net\nfeidacrusher.com\nfeidaep.com\nfeidagroup.com\nfeidaoboke.com\nfeidavalve.com\nfeidazuanji.com\nfeidee.com\nfeidee.net\nfeidi.com\nfeidiao.com\nfeidou.com\nfeie.work\nfeierlaiedu.com\nfeiersmart.com\nfeifandesign.com\nfeifanindustry.com\nfeifantxt.com\nfeifantxt.net\nfeifdx.com\nfeifei.com\nfeifeiboke.com\nfeifeishijie.com\nfeifeixitong.com\nfeifeiziyuan.com\nfeifustudio.com\nfeigang.net\nfeige.ee\nfeigeblog.com\nfeigo.fun\nfeihe.com\nfeihe168.com\nfeiheair.com\nfeihengip.com\nfeihongtec.com\nfeihu.me\nfeihua.com\nfeihuadns.com\nfeihuo.com\nfeihutaoke.com\nfeijie.org\nfeijing88.com\nfeijipan.com\nfeijiu.net\nfeijiuzs.com\nfeijix.com\nfeijs.com\nfeikework.com\nfeikongbao.com\nfeiku.com\nfeikua.net\nfeiliao.com\nfeilihua.com\nfeiliks.com\nfeiliu.com\nfeilixi888.com\nfeilu.cc\nfeilvway.com\nfeimalv.com\nfeimao666.com\nfeimaoweb.com\nfeimaoyun.com\nfeimawaiqin.com\nfeimayun.com\nfeimogames.com\nfeimooo.com\nfeimosheji.com\nfeimoustex.net\nfeinews.com\nfeiniao.name\nfeiniaomy.com\nfeiniaowangluo.com\nfeiniu.com\nfeinno.com\nfeiphp.com\nfeipin.com\nfeipin.net\nfeipinzhan.com\nfeipr.com\nfeiq18.com\nfeirar.com\nfeiruikeji.com\nfeisaidi.com\nfeisan.net\nfeishu-3rd-party-services.com\nfeishu-boe.net\nfeishu-pre.net\nfeishu.net\nfeishuapp-cdn.net\nfeishuapp.com\nfeishucdn.com\nfeishudoc.com\nfeishuhuiyi.com\nfeishuimg-boe.com\nfeishuimg-pre.com\nfeishuimg.com\nfeishukacdn.com\nfeishumeetings.com\nfeishuoffice.com\nfeishuopenplatformrecord.com\nfeishupkg.com\nfeishuvc.com\nfeishuwx.net\nfeishuzw.net\nfeisiplus.com\nfeistech.com\nfeisu.com\nfeisuwx.org\nfeisuxs.com\nfeisuzhibo.com\nfeitaomall.com\nfeitengsoft.com\nfeitent.com\nfeitian001.com\nfeitianma.com\nfeitianwu7.com\nfeitsui.com\nfeituo126.com\nfeiwan.net\nfeiwentianxia.com\nfeixian.cc\nfeixiansoft.com\nfeixiaodata.com\nfeixiaoqiu.com\nfeixiong.tv\nfeixue666.com\nfeixuege.com\nfeixueteam.net\nfeiyang.com\nfeiyang.hk\nfeiyang233.club\nfeiyang971.com\nfeiyangholiday.com\nfeiyangjm.com\nfeiyangstar.com\nfeiyiblog.com\nfeiyin2016.com\nfeiying-china.com\nfeiyit.com\nfeiyouyun.com\nfeiyu.com\nfeiyuapi.com\nfeiyue.online\nfeiyueconglin.com\nfeiyuhu.com\nfeiyun.cc\nfeiyunjs.com\nfeiyuteam.com\nfeizan.com\nfeizhaojun.com\nfeizhiyi.com\nfeizhu.com\nfeizhuke.com\nfeizhupan.com\nfeizhuqwq.com\nfeizutrip.com\nfeizw.net\nfelicitysolar.com\nfeling.net\nfelink.com\nfelix021.com\nfelizpg.com\nfelmvip.com\nfelo-ev.com\nfemrice.com\nfen360.com\nfenbaner.net\nfenbei.com\nfenbeijinfu.com\nfenbeitong.com\nfenbi.com\nfenbike.com\nfenbilantian.com\nfenbu.net\nfenby.com\nfencescn.com\nfenchuan8.com\nfenda.com\nfendytech.com\nfenfen.com\nfenfenriji.com\nfenfentang.com\nfenfenwz.com\nfenfenyu.com\nfenfenzh.cc\nfeng-du.com\nfeng.com\nfeng.pub\nfeng1.com\nfengakj.com\nfengaomedical.com\nfengba888.com\nfengbangleasing.com\nfengbao.com\nfengbaowo.com\nfengbohan.com\nfengbolive.com\nfengbuy.com\nfengcaijiaju.com\nfengchaoyuan.com\nfengche.us\nfengchengroup.com\nfengchizixun.com\nfengchuanba.com\nfengchui.cc\nfengchusheng.com\nfengcms.com\nfengcx.com\nfengdu.com\nfengdu365.com\nfengdufrp.com\nfengduqi.com\nfengduxiaoshuo.com\nfengedu.com\nfengeek.com\nfengei.com\nfengeini.com\nfengex.com\nfengfeng.cc\nfenggangzulin.com\nfenggongliangrenju.com\nfenggui-baking.com\nfenghaibin.com\nfenghenever.com\nfenghong.tech\nfenghua001.com\nfenghuangcanyin.com\nfenghuangxs.com\nfenghui-motor.com\nfenghuidongman.com\nfenghuo.cc\nfenghuoyunji.com\nfengimg.com\nfengj.com\nfengji.net\nfengjiawang.net\nfengjierc.com\nfengjing.com\nfengjinggroup.com\nfengjinketang.com\nfengjr.com\nfengjx.com\nfengkeji.com\nfengkongbao.com\nfengkongcloud.com\nfengkuangzaoren.com\nfengkui.net\nfenglao.org\nfengli.com\nfengli.su\nfengliankeji.com\nfenglichem.com\nfenglingroup.com\nfenglinjiu.com\nfenglinlab.com\nfenglu-alu.com\nfengmaniu.com\nfengmap.com\nfengmeng.net\nfengmios.com\nfengnayun.com\nfengniao.com\nfengniaohd.com\nfengniaojianzhan.com\nfengone.com\nfengousm.com\nfengpintech.com\nfengread.com\nfengse.com\nfengshangroup.com\nfengshangweekly.com\nfengshankeji.com\nfengshi8888.com\nfengshigroup.com\nfengsung.com\nfengsutb.com\nfengtai.tv\nfengtalk.com\nfengtao365.com\nfengtaochanglai.com\nfengtianz.com\nfengtingsmart.com\nfengtupic.com\nfengwanyx.com\nfengwatch.com\nfengwenyi.com\nfengwo.com\nfengwohao.com\nfengxb.com\nfengxian110.com\nfengxianrc.com\nfengxianwater.com\nfengxiaotx.com\nfengxing007.com\nfengxinglihua.com\nfengxuan.co\nfengyan.cc\nfengyang.fun\nfengyeholding.com\nfengyitong.name\nfengyixin.com\nfengyuangufen.com\nfengyuncad.com\nfengyuncx.com\nfengyunlu.com\nfengyunmusic.net\nfengyunpdf.com\nfengyushan.com\nfengyx.com\nfengzegroup.com\nfengzhan.vip\nfengzhangame.net\nfengzhao.net\nfengzigame.com\nfengzusw.com\nfenha.net\nfenhong123.com\nfenhuo360.com\nfenixmall.com\nfenjiji.net\nfenjj.com\nfenke.com\nfenking.club\nfenlei168.com\nfenlei265.com\nfenleidao.com\nfenleihu.com\nfenlekeji.com\nfenliu.net\nfenmitech.com\nfennessy.hk\nfenqile.com\nfenqix.com\nfenqubiao.com\nfens.me\nfensaas.com\nfensebook.com\nfenshua123.com\nfensishenghuo.com\nfenssy.com\nfentorsolar.com\nfenxi.cc\nfenxi.com\nfenxi.org\nfenxiangdashi.com\nfenxianglife.com\nfenxiti.com\nfenxm.com\nfenxmi.com\nfenxuekeji.com\nfenyu.net\nfenyucn.com\nfenzhi.com\nfenzhi.net\nfenzijr.com\nfeotech.com\nfequan.com\nferlie.net\nferlytc.com\nfermatmind.com\nferqwo.sbs\nferro-alloys.com\nfescoadecco.com\nfescoadeccochongqing.com\nfescoadeccozhejiang.com\nfescogroup.com\nfescoguangdong.com\nfescojinan.com\nfeso.tech\nfestaint.com\nfetiononline.com\nfettesgz.com\nfeverales.com\nfeverassets.net\nfevermi.com\nfevia.work\nfevte.com\nfeydj.com\nfeyer-tc.com\nff14.cloud\nff54.ink\nff63.com\nff722fbac1011.beer\nffalcon.com\nffan.com\nffasp.com\nffb199e9266142c6.com\nffbc6bb121021.beer\nffbc82f8d1013.beer\nffbook.cc\nffbuddy.com\nffc540c0611031.beer\nffca028de10292.beer\nffcell.com\nffcloudcdn.com\nffdbj.com\nffe06ebc91024.beer\nffe0be9f91019.beer\nffeeii.com\nffepower.com\nfffont.com\nffhome.com\nffis.me\nffj.cc\nffls-edu.com\nffmobi.com\nffmomola.com\nffnmu.com\nffpedia.com\nffpw1688.com\nffquan.com\nffreeslott.com\nffsgame.com\nffsky.com\nfftcc.com\nfftub.com\nffxivhuntcn.com\nffy.com\nffyoo.com\nffzww.com\nfg.cc\nfg114.com\nfgba.net\nfgcndigital.com\nfgeekcloud.com\nfgfed.com\nfggyw.com\nfghi34.com\nfgi90.com\nfgidna.com\nfgkj.cc\nfglt.net\nfgnwct.com\nfgo.wiki\nfgowiki.com\nfgq.net\nfgtxnews.com\nfgvisa.net\nfh01.com\nfh1551.com\nfh21.com\nfh21static.com\nfh77.net\nfh86.com\nfh888.com\nfhaircut.com\nfhb971.com\nfhclm.com\nfhcomp.com\nfhd001.com\nfheb-four.com\nfheb-six.com\nfhfxys.com\nfhgame.com\nfhgjds.com\nfhguotai.com\nfhl05161ps.com\nfhldns.com\nfhldns.net\nfhlmotor.com\nfhlun.com\nfhmion.com\nfhmooc.com\nfhmv.com\nfhonest.com\nfhoverseas.com\nfhrlw.com\nfhsfilm.com\nfht360.com\nfhtao.com\nfhtj.com\nfhtlw.com\nfhtre.com\nfhvalley.com\nfhwlgs.com\nfhwzx.com\nfhycedu.com\nfhycs.com\nfhyl56.net\nfhyx.com\nfhyx.hk\nfhzggame.com\nfhzl.co\nfi-play.com\nfi0.cc\nfi11.com\nfi7.cc\nfi94.com\nfia-china.com\nfibercrops.com\nfiberglasschina.com\nfiberhome.com\nfiberhomegroup.com\nfibocom.com\nfibodata.com\nfibrlink.net\nficochina.net\nficowshen.com\nfiehff.com\nfieldcommunicator.net\nfifa666.com\nfifaschool.com\nfifedu.com\nfifsky.com\nfigure-it.com\nfiifh.com\nfiil.com\nfiinote.com\nfiio.com\nfiio.net\nfilcochina.com\nfile.tripcdn.com\nfilediag.com\nfilez.com\nfilfox.info\nfillersmart.com\nfillseo.com\nfilm-yuelongchina.com\nfilteringlist.com\nfily.fun\nfim34s.com\nfimky.com\nfimmu.com\nfin-shine.com\nfinaleden.com\nfinaltheory.me\nfinance365.com\nfinancetcloud.com\nfinanceun.com\nfinancialdatamining.com\nfinancialstreetforum.com\nfinchina.com\nfinclip.com\nfinddanandlaura.com\nfinderweb.net\nfindhro.com\nfindic.com\nfindic.kr\nfindic.tw\nfindic.us\nfindlawimg.com\nfindlinked.com\nfindmyfun.xyz\nfindmyrepair.com\nfindoout.com\nfindshu.net\nfindxk.com\nfindxz.com\nfindyou.xin\nfindzd.com\nfinebey.com\nfinebi.com\nfineex.com\nfineforming.com\nfineheads.com\nfineidc.com\nfineimmu.com\nfinelybook.com\nfiner2.com\nfinereport.com\nfinereporthelp.com\nfineset.com\nfinesilver.store\nfinetooling.com\nfineui.com\nfinewatchcare.com\nfineway.com\nfinewyx.com\nfineyoga.com\nfinezb.com\nfingard.com\nfinger-cnc.com\nfingerflyapp.com\nfingerjoys.com\nfingerstylechina.com\nfingertc.com\nfingu.com\nfingu.net\nfinjetchemical.com\nfinndy.com\nfinogeeks.com\nfinovo.com\nfinshell-cib.com\nfintechinchina.com\nfintechquan.com\nfinupfriends.com\nfinupgroup.com\nfinzfin.com\nfinzjr.com\nfiocco-group.com\nfir.vip\nfiradio.net\nfire233.com\nfire2333.com\nfire24h.com\nfirebirdprint.com\nfirebit.com\nfiredata119.com\nfireemblem.net\nfireemulator.com\nfireflyacg.com\nfiregz.com\nfirerock.tech\nfiretry.com\nfirevale.com\nfirhq.com\nfirm-lithium.com\nfirst-panel.com\nfirst-swg.com\nfirstarpc.com\nfirstdrs.com\nfirstfood-cn.com\nfirstlinkapp.com\nfirstmetcs.net\nfirstonesource.com\nfirstp2p.com\nfirstproduction.net\nfirstpvm.com\nfirsunbioscience.com\nfirwinds.site\nfiscan007.com\nfisdhu.com\nfish2bird.com\nfish3000.com\nfishcn.com\nfisherac.com\nfisherv.com\nfishfay.com\nfishfd.com\nfishflying.net\nfishin2boat.com\nfishing-sh.com\nfishing-sinkers.com\nfishingjoy.com\nfishingmarkets.com\nfishings.biz\nfishlee.net\nfishmobi.com\nfishqc.org\nfishros.com\nfishs.com\nfishtui.com\nfishwantg.com\nfishyoung.com\nfit-start.co\nfit120.net\nfit2cloud.com\nfitgroup.com\nfitit100.com\nfitoneapp.com\nfittentech.com\nfittingcn.com\nfiu07021kl.com\nfiu07040kl.com\nfiu07050kl.com\nfiu07060kl.com\nfiu07070kl.com\nfiu07090kl.com\nfiui.org\nfivecakes.com\nfivedo.net\nfiveplus.com\nfivestarsolar.com\nfivision-tech.com\nfix666.com\nfixdown.com\nfixhdd.org\nfixmath.com\nfiyta.com\nfj-atfz.com\nfj-ba.com\nfj-cc.com\nfj-eprint.com\nfj-jima.com\nfj-kn.com\nfj10010.com\nfj133165.com\nfj173.net\nfj2000.com\nfj3c.net\nfj888.com\nfj95560.com\nfj96336.com\nfj987.com\nfjbcjt.com\nfjbdex.com\nfjber.com\nfjbgwl.com\nfjbiopharma.com\nfjbk.org\nfjbyjs.com\nfjc001.com\nfjce.com\nfjcee.com\nfjcgxc.com\nfjcid.com\nfjcoop.com\nfjcqjy.com\nfjcredit.com\nfjctw.net\nfjctyz.net\nfjcyl.com\nfjcyl.org\nfjdaily.com\nfjdaze.com\nfjdc.xyz\nfjdf.vip\nfjdfxy.com\nfjdh.com\nfjdkjt.com\nfjdygljt.com\nfjdzmy.com\nfjeca.com\nfjejjt.com\nfjepn.com\nfjetc.com\nfjeverone.com\nfjfgroup.com\nfjfhsteel.com\nfjfoxiang.com\nfjfs.net\nfjfxjt.com\nfjfzsx.com\nfjgczjxh.com\nfjgdwl.com\nfjgkedu.com\nfjgsgl.com\nfjgtfood.com\nfjguanyue.com\nfjgwy.org\nfjhaizu.com\nfjhcw.com\nfjhospital.com\nfjhps.com\nfjhrjt.com\nfjhsjg.com\nfjhssy.com\nfjhuayagroup.com\nfjhxbank.com\nfjhxcaee.com\nfjhxvc.com\nfjii.com\nfjjcjy.com\nfjjcled.com\nfjjgn396.com\nfjjianxin.com\nfjjmylbx.com\nfjjnsn.com\nfjjoyz.com\nfjjsp01.com\nfjjszg.com\nfjjyt.net\nfjjyxy.com\nfjjzjt.com\nfjkdxh.com\nfjkqyy.com\nfjkst.com\nfjlawyers.net\nfjlb.com\nfjlcjs.com\nfjlcjt.com\nfjleixin.com\nfjlg.com\nfjlh.com\nfjlib.net\nfjllsn.com\nfjlstz.net\nfjlszbc.com\nfjly.com\nfjlygroup.com\nfjlyrmyy.com\nfjlyzls.com\nfjlzy.com\nfjm.info\nfjmap.net\nfjmego.com\nfjmh.com\nfjmlh.com\nfjmotor.net\nfjmstc.com\nfjmzw.com\nfjndqx.com\nfjndwb.com\nfjnet.com\nfjnhjt.com\nfjotic.com\nfjpca.com\nfjpcz.com\nfjpicc.com\nfjpit.com\nfjpta.com\nfjptdy.com\nfjptyz.com\nfjptzs.com\nfjptzx.com\nfjptzyt.com\nfjqfkg.com\nfjqjsw.com\nfjrclh.com\nfjrcw.com\nfjrmyy.com\nfjrtv.net\nfjsafxh.com\nfjsalt.com\nfjsanheng.com\nfjsdn.com\nfjsdsrmyy.com\nfjsdxy.com\nfjsdzj.com\nfjsen.com\nfjsenda.com\nfjsfa.org\nfjsfjyl.com\nfjsfy.com\nfjshgx.com\nfjshjy.net\nfjsj.com\nfjsjkyy.com\nfjsmjj.com\nfjssjt.com\nfjstfc.com\nfjstjt.com\nfjstmgcjzhyxh.com\nfjsxqy.com\nfjsxyqygl.com\nfjsyyhyxh.com\nfjszx.com\nfjtd-logistics.com\nfjtelecom.com\nfjtianya.com\nfjtp.net\nfjtv.net\nfjtzlt.com\nfjvs.org\nfjwanan.com\nfjwjgs.com\nfjwr.xyz\nfjwxj.com\nfjwzjt.com\nfjxfgroup.com\nfjxhfx.com\nfjxhyw.com\nfjxhyy.com\nfjxiehe.com\nfjxn.com\nfjxsxx.com\nfjxwx.com\nfjxxal.com\nfjybyjjysos.com\nfjyc8.com\nfjycw.com\nfjydnews.com\nfjyfjsjt.com\nfjyklc.com\nfjyunba.com\nfjyxdm.com\nfjyxgl.com\nfjyy.org\nfjyyjt.com\nfjzbgf.com\nfjzikao.net\nfjzixun.com\nfjzol.com\nfjzx.org\nfjzyxx.com\nfjzzct.com\nfk100.com\nfkask.net\nfkblog.org\nfkbuff.com\nfkcaijing.com\nfkdex.com\nfkdmg.com\nfkdxg.com\nfkeduwxxcx.com\nfkesfg.com\nfkgou.com\nfkguolu.com\nfkhdactive.com\nfkhdview.com\nfkhongdan.com\nfklhb.com\nfklngy.com\nfktool.com\nfkw.com\nfkw100.com\nfkwapi.com\nfkwatchtw.com\nfkwvya4035.vip\nfkyuer.com\nfkyun.com\nfkyxt.com\nfl-game.net\nfl0632.com\nfl160.com\nfl168.com\nfl365.com\nfl5.co\nfl580.com\nflacc.com\nflagchem.com\nflairmicro.com\nflamecdn.com\nflamesky.org\nflamingcold.com\nflan1688.com\nflaredup.com\nflash8.net\nflash8f.com\nflashcat.cloud\nflashgame163.com\nflashgene.com\nflashkrypton.com\nflashmemoryworld.com\nflashsalesfb.store\nflashv8.com\nflashwar.com\nflashwing.net\nflashwolfcn.com\nflashxsport.com\nflaskflock.com\nflatsh.com\nflawcache.com\nflclb.com\nflduo.com\nfle078.com\nflebm.com\nfleeper.com\nfleetlogd.com\nfleety.com\nflexifont.com\nfleyun.com\nflfc5999.com\nflgame.net\nflhimalayandn.com\nfliggy.com\nfliggy.hk\nflightroutes24.com\nflikfill.com\nflintech.org\nflintos.com\nflip.fun\nfliplus.com\nflleasing.com\nflmgr.net\nflml.cc\nfloatcamellia.com\nfloatingislandapps.com\nfloatmaze.com\nflockypet.com\nflomoapp.com\nfloorb2b.com\nflora009.work\nflorentiavillage.com\nflourish-fs.com\nflowchemchina.com\nflower188.com\nflower33.com\nflowerknows.co\nflowever.net\nflowinnglobal.com\nflowlbkj.com\nflowportal.com\nflowtechgd.com\nflowtechsh.com\nflpsz.com\nflpwb.com\nflqrmyy.com\nflrcw.com\nflstudiochina.com\nfltau.com\nfltcsb.com\nfltrp.com\nfluke-ig.com\nflumatic.com\nflutterchina.club\nflvcd.com\nflvlog.com\nflvpw.com\nflvsp.com\nflvurl.net\nflwatertech.com\nflxc.net\nflxdns.com\nflxzz.com\nfly-exp.com\nfly139.com\nfly160.com\nfly1999.com\nfly2lan.cc\nfly3949.com\nfly63.com\nfly84.com\nfly998.com\nflyadx.com\nflyai.com\nflyancctv.com\nflycc.net\nflyco.com\nflycua.com\nflydigi.com\nflyenglish.com\nflyertea.com\nflyertrip.com\nflyfishx.com\nflyfunny.com\nflygo.net\nflygon.net\nflyhand.com\nflyingeffect.com\nflyingpigeon1936.com\nflyme.com\nflyme.net\nflymeauto.com\nflymeos.com\nflymeyun.com\nflyml.net\nflymobi.biz\nflymodem.net\nflymopaper.com\nflyneutron.com\nflysand.com\nflysheeep.com\nflytcloud.com\nflytexpress.com\nflzc.com\nflzhan.com\nfm-uivs.com\nfm058.com\nfm0754.com\nfm0758.com\nfm086.com\nfm120.com\nfm365.com\nfm3838.com\nfm4399.com\nfm520.com\nfm6w.com\nfm875.com\nfm918.net\nfm960.net\nfmbimg.com\nfmc123.com\nfmcoprc.gov.mo\nfmd360.com\nfmetro.net\nfmi33.com\nfminers.com\nfmjmm.com\nfmkefu.com\nfmkpharm.com\nfmmob.com\nfmscm.com\nfmsdlb.com\nfmsh.com\nfmssrc.com\nfmswift.net\nfmtmed.com\nfmtt6.xyz\nfmwei.com\nfmwhahaha.com\nfmy90.com\nfmyunlv.com\nfn-mart.com\nfn-tech.com\nfn010.com\nfnconn.com\nfnedge.net\nfnetlink.com\nfnf-foods.com\nfnfcutlery.com\nfnhealth.com\nfnji.com\nfnji.net\nfnjiasu.com\nfnjs.cc\nfnjsq.com\nfnkq.com\nfnkslift.com\nfnkvision.com\nfnlvshi.com\nfnmobi.com\nfnnas.com\nfnnas.net\nfnnsh.com\nfnnspa.com\nfnos.net\nfnrcw.com\nfnrczp.com\nfnsbqvz.com\nfnscore.com\nfnwlzz.com\nfnxzyy.com\nfnyes.com\nfnysb.com\nfob123.com\nfob580.com\nfobaoyou.com\nfobbusinessforum.com\nfobcentury.com\nfobmy.com\nfobshanghai.com\nfocaj.com\nfocalbrand.com\nfocalhot.com\nfocc.cc\nfochot.com\nfocigc.com\nfocobio.com\nfocofish.com\nfoctek.com\nfocus-efc.com\nfocus-eloan.com\nfocus-fusion.com\nfocuschina.com\nfocusight.net\nfocussend.com\nfocustock.com\nfodaba.com\nfodexin.com\nfodian.net\nfodizi.com\nfodizi.net\nfodlab.com\nfodonline.com\nfofa.info\nfofa.so\nfofcn.tech\nfofen.com\nfofstudio.net\nfofuai.com\nfogcloud.io\nfohohr.com\nfoidn.com\nfoisonad.com\nfoisongroup.com\nfojiaonet.com\nfojiaoyongpin.com\nfokstone.com\nfoldur.com\nfolidaymall.com\nfolij9nry5cxy8.com\nfollowintg.com\nfollowsteel.com\nfolou.com\nfondcosplay.com\nfoneplatform.com\nfonian.com\nfonsview.com\nfont.im\nfont6.com\nfontgoods.com\nfontke.com\nfontong.com\nfontoohotels.com\nfontowns.com\nfontsfile.com\nfontshow.com\nfontvip.com\nfontyi.com\nfonye.com\nfoodaily.com\nfoodbk.com\nfoodciexpo.com\nfoodex360.com\nfoodjx.com\nfoodkz.com\nfoodmate.net\nfoodqs.com\nfoods1.com\nfoodsc.net\nfoodspace.net\nfoodspjm.com\nfoodszs.com\nfoodu14.com\nfoofish.net\nfooher.com\nfoojoo.com\nfookunion.com\nfookwood.com\nfookyik.com\nfooleap.org\nfoomx.com\nfoooooot.com\nfoosheng.com\nfootball8888.store\nfootballdown.com\nfootbig.com\nfootgamer.com\nfootseen.com\nfoovoo.com\nfooww.com\nfoqian.com\nfor-she.com\nfor512.com\nfor68.com\nforbeschina.com\nforbetty.com\nforbuyers.com\nforceclouds.com\nforcecreat.com\nforcemz.net\nforcger.com\nforcloudcdn.com\nford.com\nfordgo.com\nforecam.com\nforeignapi.com\nforeignserver.com\nforemostgroup.com\nforenose.com\nforerunnercollege.com\nforeseahealth.com\nforesealife.com\nforeseamall.com\nforesightfund.com\nforesl.com\nforestfood.com\nforestmusicnanjing.com\nforestpolice.net\nforestpolice.org\nforevernine.com\nforeveross.com\nforeweld.com\nforface3d.com\nforgame.com\nforindata.com\nforkeji.com\nforkliftnet.com\nforlinx.com\nform-create.com\nformeasy.cc\nformeneed.com\nformessengers.com\nformingcn.com\nformssi.com\nformtalk.net\nformysql.com\nfornass.com\nfornature.com\nforrealbio.com\nforrelaxing.com\nforrerri.com\nforshine.net\nforsol.net\nforsou.com\nforthxu.com\nfortiortech.com\nfortrustpower.com\nfortunatelyt.com\nfortune-co.com\nfortunebs.net\nfortunehair.com\nfortunepdc.com\nfortunevc.com\nforwardgroup.com\nforwe.store\nforwell-parking.com\nforyone.com\nforyou56.com\nforyouge.com\nforyougroup.com\nforys-at.com\nfos.cc\nfoscam.com\nfoshanaosibo.com\nfoshanmuseum.com\nfoshannews.com\nfoshannews.net\nfoshanplus.com\nfoshanpower.com\nfoshion.com\nfosss.org\nfosstea.com\nfosun-uhi.com\nfosun.com\nfosunhealth.com\nfosunholiday.com\nfosunmetal.com\nfosunpharma.com\nfosunwanbang.com\nfotao9.com\nfotile.com\nfotileglobal.com\nfotilestyle.com\nfotomore.com\nfotoplace.cc\nfotosay.com\nfototuan.com\nfoturn.com\nfou.net\nfoumobile.com\nfounder.com\nfounder.net\nfounderaipu.com\nfounderbn.com\nfounderchip.com\nfoundereagle.com\nfounderff.com\nfounderfu.com\nfounderic.com\nfounderinternational.com\nfounderit.com\nfounderpcb.com\nfounderpod.com\nfoundersc.com\nfoundertech.com\nfoundertype.com\nfounpad.com\nfour-faith.com\nfourco-inc.com\nfourfaithwater.com\nfovmy.com\nfow.ink\nfowep.com\nfox-studio.net\nfox008.com\nfoxconn.com\nfoxconnmall.com\nfoxera.com\nfoxirj.com\nfoxmail.com\nfoxphp.com\nfoxqq.com\nfoxtable.com\nfoxuc.com\nfoxugame.com\nfoxwaf.com\nfoxwho.com\nfoxwq.com\nfoxzld.com\nfoyuan.net\nfozhidaoxs.cc\nfozl.sg\nfpaixfl.com\nfpc-nb.com\nfpccn.com\nfpcn.net\nfpdclub.net\nfpdisplay.com\nfpdvision.com\nfpe-china.com\nfpg.com.tw\nfpga-china.com\nfpgabbs.com\nfpgakey.com\nfpgaw.com\nfphis.com\nfphs.cc\nfphs5.com\nfpi-inc.com\nfpliu.com\nfpoll.net\nfpsace.com\nfpsjk.com\nfpstt.com\nfpwap.com\nfpxz.net\nfpyy120.com\nfq688.com\nfqapps.com\nfqbnbg1311.vip\nfqfilm.com\nfqghj.net\nfqgyljt.com\nfqhospital.com\nfqis.xin\nfqjob.net\nfqlook.com\nfqnovel-op.com\nfqnovel.com\nfqnovelim.com\nfqnovelop.com\nfqnovelpic.com\nfqnovelstatic.com\nfqnovelvod.com\nfqpai.com\nfqrsw.com\nfquwcs3089.vip\nfqvpc.online\nfqworld.org\nfqxdw.com\nfqxs.org\nfqxsw.cc\nfr-trading.com\nfr0528.art\nfr2007.com\nfractal-technology.com\nfraeco.com\nfraee.com\nfragpunk.com\nfragrance.ink\nfrainfo.com\nframemaker.com\nfranceqz.com\nfrancissoung.com\nfranckfw.com\nfrancochinois.com\nfrankenman.group\nfrankyrobot.com\nfranzsandner.com\nfraproperty.com\nfrcisforce.com\nfrdic.com\nfread.com\nfredamd.com\nfredestiny.com\nfree-863.com\nfree-api.com\nfree-coin.org\nfree-doctor.com\nfree-e.net\nfree-img.com\nfree9.net\nfreebuf.com\nfreebz.net\nfreecomm.net\nfreedgo.com\nfreedirlist.com\nfreedomscm.com\nfreedoonline.com\nfreegeeker.com\nfreehpcg.com\nfreeidea.win\nfreejishu.com\nfreekaobo.com\nfreekaoyan.com\nfreelycode.com\nfreelynb.com\nfreelynet.cloud\nfreelynet.com\nfreemancn.com\nfreemindworld.com\nfreemoban.com\nfreemudgame.com\nfreemypay.com\nfreeoa.net\nfreeovp.com\nfreeqingnovel.com\nfreeshoppingchina.com\nfreessl.org\nfreestman.com\nfreestyle666.com\nfreetech.com.hk\nfreetiku.com\nfreeuid.com\nfreevm.com\nfreewhale.net\nfreeydch.com\nfreeyun.com\nfreezhw.com\nfreezl.net\nfrefloya.com\nfrensworkz.com\nfreqchina.com\nfresh-ideas.cc\nfreshfresh.com\nfreshhema.com\nfreshippo.com\nfreshippomarket.com\nfreshiz.xyz\nfreshnewsnet.com\nfreshtrgetgendyalert.xyz\nfrgsupps.store\nfrhelper.com\nfriendeye.com\nfriends-exchange.com\nfriends8.com\nfriendship-match.com\nfrigate-cn.video\nfright-tattoo.com\nfrigidpine.com\nfringe-zero.com\nfrisobaby.com\nfristweb.org\nfrlawyer.com\nfrler.com\nfrodzo.club\nfroglesson.com\nfrombyte.com\nfromgeek.com\nfromshandong.com\nfromwiz.com\nfrontierbiotech.com\nfrontjs.com\nfrontopbd.com\nfrontpharm.com\nfrontstreetcoffee.com\nfrontwize.com\nfrost-s.com\nfrostchina.com\nfrostwell.cc\nfrostwell.net\nfrostwing98.com\nfrp-act.com\nfrp-air.com\nfrp-all.com\nfrp-any.com\nfrp-arm.com\nfrp-bag.com\nfrp-bar.com\nfrp-bid.com\nfrp-box.com\nfrp-boy.com\nfrp-bus.com\nfrp-china.net\nfrp-dad.com\nfrp-dog.com\nfrp-egg.com\nfrp-end.com\nfrp-era.com\nfrp-fan.com\nfrp-fee.com\nfrp-fog.com\nfrp-fox.com\nfrp-fun.com\nfrp-gap.com\nfrp-gas.com\nfrp-gym.com\nfrp-hat.com\nfrp-hen.com\nfrp-hip.com\nfrp-hub.com\nfrp-ice.com\nfrp-jar.com\nfrp-key.com\nfrp-kit.com\nfrp-lab.com\nfrp-leg.com\nfrp-mad.com\nfrp-mix.com\nfrp-mom.com\nfrp-net.com\nfrp-now.com\nfrp-nut.com\nfrp-off.com\nfrp-oil.com\nfrp-one.com\nfrp-own.com\nfrp-pen.com\nfrp-put.com\nfrp-rib.com\nfrp-rug.com\nfrp-run.com\nfrp-say.com\nfrp-sea.com\nfrp-shy.com\nfrp-six.com\nfrp-ski.com\nfrp-sun.com\nfrp-tag.com\nfrpapp.com\nfrt.ltd\nfrtgraphite.com\nfruitday.com\nfrysb.com\nfrytea.com\nfrzmh.com\nfs-ade.com\nfs-bus.com\nfs-czx.com\nfs-eliza.com\nfs-qiyun.com\nfs-yld.net\nfs.microsoft.com\nfs0757.com\nfs121.com\nfs1982.com\nfs31.com\nfs58.com\nfs7000.com\nfsabwy.com\nfsaii.com\nfsbankonline.com\nfsbldjd.com\nfsbqgd.com\nfsccjy.com\nfsccyy.com\nfschems.com\nfschico.com\nfscinda.com\nfscjfm.com\nfscjkj.net\nfscm.tech\nfscmjt.com\nfscsps.com\nfsdxzhpt.com\nfsecity.com\nfseig.com\nfseport.com\nfsesa.com\nfsfsfz.com\nfsfund.com\nfsfy.com\nfsgas.com\nfsgbly.com\nfsgcw.com\nfsgechao.com\nfsggb.com\nfsgplus.com\nfsgzhg.com\nfshczf.com\nfshd.com\nfshh1688.com\nfshj118.com\nfshones.com\nfshpharm.com\nfshsfl.com\nfshsl.com\nfshuiren.com\nfshyschool.net\nfshzg.com\nfsigc.com\nfsight.ai\nfsightai.com\nfsilon.com\nfsjgchina.com\nfsjgw.com\nfsjinlan.com\nfsjinma.com\nfsjoy.com\nfsjrl.com\nfsjsdtc.com\nfsjx.org\nfsjy.net\nfsky.pro\nfskzpw.com\nfslgz.com\nfslinker.com\nfsllq.com\nfslsg.com\nfsltsmhjq.com\nfslyx.com\nfsmama.com\nfsmcled.com\nfsmeeting.com\nfsmi818.com\nfsoet.com\nfsohu.com\nfsoptronics.com\nfsou.com\nfspage.com\nfspcdn.com\nfspinqiu.com\nfspits.com\nfspride.com\nfspt.net\nfspublic.com\nfsruibin.com\nfssdbjyy.com\nfssdlhyxh.com\nfsspc.com\nfssptjj.com\nfsstone.com\nfsswsxh.com\nfst-pipe.net\nfstaoci.com\nfstcb.com\nfstgs.com\nfsthr.com\nfstrhb.com\nfstvgo.com\nfsukj.com\nfswater.com\nfswateraso.net\nfswchina.com\nfswk.com\nfsxchina.com\nfsxinquan.com\nfsxsj.net\nfsxzygz.com\nfsy6.com\nfsyanhe.com\nfsygroup.com\nfsyhlz.com\nfsylr.com\nfsyq.net\nfsysyy.com\nfsytss.com\nfsyule.net\nfsyuncai.com\nfsyxg.com\nfsyy.net\nfsyyy.com\nfszhihuiyan.com\nfszhiko.com\nfszyjx.com\nft.tech\nft12.com\nft22.com\nft98.com\nftaro.com\nftbj.net\nftcoaster.com\nftd.nz\nftdevice.com\nftesop.com\nftfast.com\nftfund.com\nftfx.ink\nfthformal.com\nfthgz.com\nfthimalayandb.com\nftium4.com\nftlcloud.com\nftls.xyz\nftlzghz.com\nftmespro.com\nftnwater.com\nftoc.com\nftourcn.com\nftp.pet\nftsafe.com\nftsfund.com\nftswcc.com\nfttrs.com\nftuan.com\nftwafer.com\nftxad.com\nftxft.com\nftxgame.com\nftxia.com\nftxsoccer.com\nftylw.com\nftzbq.com\nftzn.net\nftzx.com\nfu-guan.com\nfu-rui.com\nfu2zu.com\nfu57.com\nfu62.vip\nfuanna.com\nfubabafumama.com\nfubangauctions.com\nfubaochem.com\nfubaofei.com\nfubonchina.com\nfubonplastic.com\nfuca-china.com\nfucantec.com\nfuchaipower.com\nfuchaoqun.com\nfuchen33.com\nfuchengshicai.com\nfuchuangyu.com\nfucnm.com\nfucol.club\nfuczx.com\nfuda.com\nfuda120.com\nfudaguangzhou.com\nfudahospital.com\nfudaiapp.com\nfudajishu.com\nfudajn.com\nfudakang.com\nfudancell.com\nfudanglp.com\nfudanmed.com\nfudanpress.com\nfudasafe.com\nfudayiyao.com\nfudian-bank.com\nfudongdong.com\nfudu167.com\nfudubao.com\nfuduwang.com\nfuduxiao.com\nfuduxuexiao.com\nfuedf.org\nfuel-lab.com\nfuelcellchina.com\nfuermu.com\nfufeng-group.com\nfufuidc.com\nfufuok.com\nfugary.com\nfugetech.com\nfuguangchina.com\nfuguangwater.com\nfuguantang.com\nfuhai360.com\nfuhancapital.com\nfuhanziben.com\nfuhaoku.com\nfuhefu.com\nfuheng.org\nfuhouyin.com\nfuhuibao.club\nfui.im\nfuiou.com\nfuioupay.com\nfujfu.com\nfujiabin.com\nfujianbenz.com\nfujiangames.com\nfujianguofu.com\nfujianmei.com\nfujianrc.com\nfujianryt.com\nfujiansme.com\nfujianyinruan.com\nfujincenter.com\nfujinguo.com\nfujinjiazheng.com\nfujinotrade.com\nfujutec.com\nfuka.cc\nfukangjixie.com\nfukangqipai.com\nfukangyuanyanglao.com\nfuke39.com\nfukexie.com\nfulanka.com\nfulantv.com\nfulengen.com\nfuliansheng.com\nfuliao.com\nfuliaotech.com\nfuliba.com\nfulicat.com\nfulimin.org\nfulin.org\nfuling.com\nfulinpm.com\nfulinsujiao.com\nfulinxiuxian.com\nfuliquan.com\nfulishemusic.com\nfulitec.com\nfuliti.com\nfuliw.net\nfull-way.com\nfullcopecb.icu\nfullde.com\nfullhan.com\nfullics.com\nfulllinks.com\nfullluckcalendar.com\nfullsemitech.com\nfullstack.love\nfulltech.work\nfulltruckalliance.com\nfulou.life\nfultree.com\nfulu.com\nfulykong.com\nfuma-carbide.com\nfumake.com\nfumaofawu.com\nfumi.com\nfumiaoyinpin.com\nfumin.com\nfumu.com\nfumubang.com\nfumuhui.com\nfun.tv\nfun2ex.com\nfun4go.com\nfuncdn.com\nfuncrea.com\nfunctionads.com\nfunctionaltextilesshanghai.com\nfunctorz.com\nfund001.com\nfundebug.com\nfundebug.net\nfundegroup.com\nfundog.cc\nfundrive.com\nfundxy.com\nfunenc.com\nfunengscm.com\nfuneralchain.com\nfunfungolf.com\nfungichina.com\nfungj.com\nfunhillmedia.com\nfunhillrm.com\nfuni.com\nfuni365.com\nfunik.com\nfuniutang.net\nfunjsq.com\nfunkoonlinegb.club\nfunletu.com\nfunliving.com\nfunmz.com\nfunnet.net\nfunnycore.com\nfunnycorelive.com\nfunnyplaying.com\nfunnysphere.com\nfunpaer.com\nfunplay66.com\nfunqipai.com\nfunsens.com\nfunshareamusement.com\nfunshion.com\nfunshion.net\nfunshion.tv\nfunshipin.com\nfuntouchos.com\nfuntoygame.com\nfunvba.com\nfunwear.com\nfunxun.com\nfunyard-hotels.com\nfunzm.com\nfupanwang.com\nfupin832.com\nfuragon.com\nfurama-beihai.com\nfurderdriving.com\nfurenchina.com\nfurenkeji.com\nfurielec.com\nfurongedu.com\nfurrybar.com\nfurrychina.com\nfuruijiaju.vip\nfuruise.com\nfusaide.com\nfusheng-group.com\nfushengal.com\nfushibao.com\nfushite.com\nfusiling.com\nfusion-inte.com\nfusion.design\nfusionappl.com\nfusure.com\nfusureum.com\nfuta.eu\nfutaike.net\nfutang.org\nfute.com\nfutianlvshi.com\nfutongquartz.com\nfutu5.com\nfutuau.com\nfutuesop.com\nfutufin.com\nfutuhn.com\nfutuniuniu.com\nfutunn.com\nfuture-sh.com\nfutureengineer.org\nfuturejuzhen.vip\nfuturenetlab.com\nfutureprize.org\nfuturescontest.com\nfutustatic.com\nfututrade.com\nfututrustee.com\nfuwa.org\nfuwahgroup.com\nfuwai.com\nfuwaliuxue.com\nfuwei.com\nfuweifilms.com\nfuweivision.com\nfuweiwang.com\nfuweizn.com\nfuwit.com\nfuwj.com\nfuwo.com\nfuwu7.com\nfuwuce.com\nfuwucms.com\nfuwuqinet.com\nfuwuqu.com\nfuxila.com\nfuxinbank.com\nfuxinews.com\nfuxinghf.com\nfuxingtech.com\nfuxingwang.com\nfuxuanji-jp.com\nfuxunpay.com\nfuyang.com\nfuyang.net\nfuyangbio.com\nfuyangjituan.com\nfuyangren.org\nfuyangtv.com\nfuyaogroup.com\nfuyaozb.com\nfuyaozhubao.com\nfuyingdai.com\nfuyingkeji.com\nfuyingyanke.com\nfuyiou.com\nfuyiwang.net\nfuyou.online\nfuyou888.com\nfuyoubank.com\nfuyougame.com\nfuyoukache.com\nfuyuan5.com\nfuyuan6.com\nfuyuehotels.com\nfuyunbj.com\nfuyuncc.com\nfuyunjiasu.com\nfuyuzhe.com\nfuz.cc\nfuzadu.com\nfuzamei.com\nfuzeetech.com\nfuzegame.com\nfuzfu.net\nfuzhenghos.com\nfuzhhc.com\nfuzhimao.com\nfuzhoufashi.com\nfuzhuangwang.com\nfuzhugo.com\nfuziche.com\nfvfvxs.com\nfview.com\nfvo2o.com\nfvti.com\nfw-12365.com\nfw365.online\nfw4.co\nfw4.me\nfwbsjnakjabdname.com\nfwcfwg.com\nfwcranes.com\nfwcx315.com\nfwdq.com\nfwdqw.com\nfwfly.com\nfwhzxxgbyy.com\nfwljmwf.com\nfwlxtc.com\nfwqje67h.work\nfwqlt.com\nfwqtg.net\nfws-china.com\nfwtoys.com\nfwvv.net\nfwwevez.xyz\nfwxgx.com\nfx-plc.com\nfx120.net\nfx168api.com\nfx168news.com\nfx168vip.com\nfx3q.com\nfx678.com\nfx678.net\nfx678img.com\nfx678red.com\nfx696.com\nfx898.com\nfxbaogao.com\nfxccp1296.com\nfxcdev.com\nfxclass.net\nfxcsxb.com\nfxcw.com\nfxdp.com\nfxe0898.com\nfxeyee.com\nfxeyetips.com\nfxfbx.com\nfxfcyy.com\nfxgjwy.com\nfxgz8.com\nfxhaoke.com\nfxian.org\nfxiaoke.com\nfxingw.com\nfxjia.shop\nfxkedu.com\nfxkjnj.com\nfxlbb.com\nfxlbl.com\nfxltsbl.com\nfxm.so\nfxo2opt.com\nfxpai.com\nfxpan.com\nfxpharm.com\nfxrcw.net\nfxsh.com\nfxsou.com\nfxsw.net\nfxt365.com\nfxtrip.com\nfxtrips.com\nfxw.la\nfxwe.com\nfxxww.net\nfxxz.com\nfxyf99.com\nfxzb.vip\nfxzhj.com\nfxzhjapp.com\nfxzygc.com\nfy-connect.com\nfy-game.com\nfy-mold.com\nfy027.com\nfy169.net\nfy1938.com\nfy2d.com\nfy35.com\nfy65.com\nfy6b.com\nfyaaz.org\nfyab.net\nfyage.com\nfyak.net\nfyal.net\nfyan.net\nfyapi.net\nfyat.net\nfyau.net\nfyaw.net\nfybiji.com\nfybj.net\nfybjsd.com\nfyblogs.com\nfybxw.com\nfycpu.com\nfycrcgas.com\nfyddj.com\nfyddjys.com\nfydeos.com\nfydvtu.com\nfyec.net\nfyeds.com\nfyeds0.com\nfyeds1.com\nfyeds2.com\nfyeds3.com\nfyeds4.com\nfyeds5.com\nfyeds6.com\nfyeds7.com\nfyeds8.com\nfyeds9.com\nfyedu.net\nfyeedu.net\nfyehare.com\nfyfch.com\nfygame.com\nfygdrs.com\nfygi.com\nfygift.com\nfygjyljt.com\nfygmbc.com\nfygroup.com\nfygsoft.com\nfyigou.com\nfyjl.org\nfyjsz.net\nfyjzyxh.com\nfylcg.com\nfyleasing.com\nfyluo.com\nfymaduoji.com\nfymall0.com\nfymall1.com\nfymall2.com\nfymall3.com\nfymall4.com\nfymall5.com\nfymall6.com\nfymall7.com\nfymall8.com\nfymall9.com\nfymallqa0.com\nfymallqa1.com\nfymallqa2.com\nfymallqa3.com\nfymallqa4.com\nfymallqa5.com\nfymallqa6.com\nfymallqa7.com\nfymallqa8.com\nfymallqa9.com\nfynas.com\nfynb.net\nfynews.net\nfypage.com\nfypt.net\nfyqyjt.com\nfyrc.net\nfyrcbk.com\nfyrexian.com\nfyrmyy.com\nfyrqgs.com\nfyrwzz.com\nfyscs.com\nfysfzk.com\nfysip.com\nfysoft3.com\nfysyy.com\nfytcw.com\nfythbkj.com\nfytire.com\nfytschool.com\nfytxonline.com\nfytz.net\nfyuanpack.com\nfyun.cc\nfyun.org\nfyvart.com\nfywip.com\nfywx.cc\nfyxhlink.com\nfyxtzc.com\nfyxxcl.com\nfyxxwb.com\nfyxz.com\nfyydnz.cc\nfyynlx.com\nfyyy.com\nfyzku.com\nfyzls.com\nfyzp.net\nfz-aefi.com\nfz-energy.com\nfz-gf.com\nfz0752.com\nfz222.com\nfz2sc.com\nfz597.com\nfzahw.com\nfzaqjy.com\nfzbbk.com\nfzbdcj.com\nfzbidding.com\nfzbingo.com\nfzbm.com\nfzccpit.org\nfzcollege.org\nfzcpos.com\nfzcrg.com\nfzcyjh.com\nfzddg.com\nfzdmag.com\nfzdzyun.com\nfzec-tencentclb.cloud\nfzec-tencentclb.com\nfzec-tencentclb.net\nfzec-tencentclb.work\nfzele.com\nfzengine.com\nfzentertainment.com\nfzetyy.com\nfzfhg.com\nfzfinancing.com\nfzfrp.com\nfzfu.com\nfzfzjx.com\nfzg360.com\nfzghy.com\nfzgolden.com\nfzhlkx.com\nfzhqzx.net\nfzhzxh.com\nfzithome.com\nfzjdct.com\nfzjingzhou.com\nfzjs.work\nfzjxr.com\nfzjxw.com\nfzkjg.com\nfzl7.com\nfzlawyers.net\nfzlbar.com\nfzlean.com\nfzlft.com\nfzlizhi.net\nfzlol.com\nfzmama.net\nfzmetro.net\nfzmtr.com\nfzn.cc\nfzport.com\nfzqywater.com\nfzrsrc.com\nfzs.com\nfzsdtkq.com\nfzsdyyy.com\nfzshouji.com\nfzslyy.com\nfzswgc.com\nfzswjt.com\nfzswyc.com\nfzsybj.com\nfzthinking.com\nfzvcolco.com\nfzwater.com\nfzwcn.com\nfzwhzn.com\nfzwqq.com\nfzwtqx.com\nfzwxxcx.com\nfzxiaomange.com\nfzxm.com\nfzyfan.com\nfzyfs.net\nfzyinghe.com\nfzyun.net\nfzyvis.com\nfzyz.net\nfzzhaobiao.com\nfzzhtc.com\nfzzhuoyi.com\nfzzixun.com\nfzzpw.net\nfzzqcdn.com\ng-biomed.com\ng-bits.com\ng-digital4ud.com\ng-film.com\ng-hi.com\ng-medon.com\ng-proxy.com\ng-spin.com\ng-tar.com\ng-var.com\ng.biz\ng00gle.vip\ng052m43e2ghn.com\ng1080.com\ng12e.com\ng12e.org\ng15wt3ci68.com\ng188.net\ng1c5.com\ng1d.net\ng1f5.com\ng1yx.com\ng2.link\ng20chn.org\ng2ak5.com\ng2h3.com\ng2us.com\ng2work.com\ng32365.com\ng3d.org\ng3img.com\ng3user.com\ng3voip.com\ng3wei.com\ng4weixin.com\ng59p.com\ng5h.com\ng5h4.com\ng5kj.com\ng63.fun\ng66667777.com\ng768r.com\ng77775555.com\ng77776666.com\ng7bd307de.skin\ng80mx.com\ng82btd54.work\ng88885555.com\ng88886666.com\ng8hh.com\ng983.com\ng9china.com\nga-me.com\nga-zn.com\nga002.com\ngaaamee.com\ngaapqcloud.com\ngaaptest.com\ngac-capital.com\ngac-nio.com\ngacfca.com\ngacfcasales.com\ngacfiatauto.com\ngachn.com\ngaclib.net\ngacmotor.com\ngacrnd.com\ngacsofinco.com\ngadlee.com\ngae-pro.com\ngaeadata.com\ngaeamobile-inc.net\ngaeamobile.net\ngaetausohyei.com\ngafata.com\ngafei.com\ngafencuchina.com\ngagacafe.com\ngagaga.icu\ngagaga.tech\ngagahi.com\ngai.net\ngaiabiohx.com\ngaiamount.com\ngaiaworkforce.com\ngaibang365.com\ngaibar.com\ngaibieshu.net\ngaicas.com\ngaigeshen.work\ngainchip.com\ngainda.net\ngaineng.net\ngainet.com\ngainifyads.com\ngainscha.com\ngaintop.com\ngairuo.com\ngaisen.ltd\ngaishichina.com\ngaishitongshu.com\ngaitu.com\ngaituba.com\ngaitubao.com\ngaituya.com\ngaixingchang.com\ngaixue.com\ngaiyadajidali.com\ngaiyazhanlan.com\ngaizhui.com\ngajerseys.com\ngajsk.com\ngal3d.info\ngala-v.com\ngalaxix.com\ngalaxus.work\ngalaxy-geely.com\ngalaxy-immi.com\ngalaxyappstore.com\ngalaxyasset.com\ngalaxycarepair.com\ngalaxyfont.com\ngalaxyinfo.com\ngalaxymagnets.com\ngalaxyoversea.com\ngalileo.work\ngalsun.com\ngaludisu.info\ngalvincdn.com\ngamder.cc\ngamdream.com\ngame-as.com\ngame-client.com\ngame-props.com\ngame-reign.com\ngame10000.com\ngame112233.com\ngame123.space\ngame12315.com\ngame13.com\ngame2.com\ngame234.com\ngame332.com\ngame3vs7novel.com\ngame499.com\ngame5.com\ngame5399.com\ngame773.com\ngame798.com\ngame80s.com\ngame89.com\ngame900.com\ngame9012.com\ngame95.cc\ngameabc.com\ngameabc2.com\ngameabc2.net\ngameapida.com\ngameapp.club\ngamebar.com\ngamebean.com\ngamebean.net\ngamebee.net\ngamebonfire.com\ngamebto.com\ngamecat.fun\ngamecatstudio.com\ngamecomb.com\ngamecps.com\ngamed9.com\ngamedachen.com\ngamedo.org\ngameducky.com\ngameegg.com\ngameexp.com\ngamefang.com\ngamefeile.com\ngamefm.com\ngamegamept.com\ngamege.com\ngameggg.com\ngamegocenter.com\ngamegocenter.net\ngamehaopu.com\ngamehome.tv\ngameinns.com\ngameitop.com\ngamejym.com\ngamekee.com\ngamekezhan.com\ngamekuaishou.com\ngamelet.games\ngameley.com\ngameloop.com\ngameloop.fun\ngamemale.com\ngamemcu.com\ngamemei.com\ngamemili.com\ngamenow.club\ngameol.com\ngamepingce.com\ngamepp.com\ngamer520.net\ngamerboom.com\ngameres.com\ngamerhome.com\ngamerhome.net\ngamermake.com\ngamersky.com\ngamersky.net\ngamerstorm.com\ngamesh.com\ngameshr.com\ngamesifu.com\ngametanzi.com\ngametaptap.com\ngametdd.com\ngametea.com\ngametea.net\ngamethk.com\ngamett.net\ngamewifi.net\ngamewower.com\ngamexdd.com\ngamexhb.com\ngamexun.com\ngameyiming.com\ngameyisi.com\ngameyj.com\ngamfe.com\ngammabicycle.com\ngammatimes.com\ngamutsoft.com\ngamux.org\ngamxex.com\ngan-ren.com\nganboo.com\nganduee.com\ngangbao365.com\ngangbogroup.com\ngangduotech.com\nganggangguoji.com\nganggg.com\ngangguan8.com\ngangguana.com\nganghaowang.com\ngangjiajieli.com\ngangpaibao.com\ngangqinpu.com\ngangqinxiansheng.com\ngangshenglian.com\ngangtise.com\ngangwan.com\ngangyu.org\ngangyuan.com\nganhao.vip\nganji.com\nganjiangrc.com\nganjiangvpn.com\nganjiazheng.com\nganjin.com\nganjistatic1.com\nganjistatic2.com\ngank-studio.com\ngank.io\ngankang.com\ngankao.com\ngankaomao.com\ngankaosheng.com\ngankgames.com\ngankh5.com\nganlj.com\nganlongjt.com\nganlv.net\nganlvji.com\nganniu.com\nganode.org\nganqi.com\nganqi.net\nganqing10.com\nganrobot.com\nganso.net\ngansuairport.com\ngansumuseum.com\ngansuyouxi.com\ngantanhao.com\ngantanhao.vip\ngantong.net\nganwan.com\nganxb2.com\nganxi.com\nganxianw.com\nganxianzhi.win\nganxinet.com\nganyeah.com\nganyu.com\nganyu.org\nganyu8.net\nganyurc.com\nganzhe.com\nganzhishi.com\nganzhong.net\nganzitv.com\ngao-shou.com\ngao.bo\ngao.com\ngao7.com\ngao7gao8.com\ngaoan.net\ngaobei.com\ngaobiao.xyz\ngaobohealthcare-sh.com\ngaocangyun.com\ngaoce.cc\ngaocegege.com\ngaochun.info\ngaoda8.com\ngaodage.com\ngaodangbiao.com\ngaode.com\ngaodilicai.com\ngaodimed.com\ngaoding.com\ngaoduan.cc\ngaoduanqianzheng.com\ngaoduguoji.com\ngaodun.com\ngaodunwangxiao.com\ngaofacable.com\ngaofangcache.com\ngaofangm.com\ngaofangz.com\ngaofans.com\ngaofeie.com\ngaofen.com\ngaofenplatform.com\ngaofenzi.org\ngaofushuai.com\ngaogpress.com\ngaoguai.com\ngaogulou.com\ngaohaipeng.com\ngaohangip.com\ngaoheconsult.com\ngaohr.com\ngaohuasec.com\ngaoimg.com\ngaojer.com\ngaoji.ren\ngaojie.com\ngaojihealth.com\ngaojima.com\ngaojipro.com\ngaojitui.com\ngaojiua.com\ngaokao.com\ngaokao365.com\ngaokao789.com\ngaokaobaoming.com\ngaokaohelp.com\ngaokaomeishu.com\ngaokaopai.com\ngaokaoq.com\ngaokaozhiku.com\ngaokaozhitongche.com\ngaokeny.com\ngaokin.com\ngaokowl.com\ngaokw.com\ngaokzx.com\ngaolian.com\ngaoligroup.com\ngaolihanjie.com\ngaolouimg.com\ngaomeif.com\ngaomeluo.com\ngaominews.com\ngaomon.net\ngaopaiwood.com\ngaopeng.com\ngaopin.tech\ngaopinimages.com\ngaopost.com\ngaoqidian.com\ngaoqingdianshi.com\ngaoqinghua.com\ngaoqingpai.com\ngaoqiwenda.com\ngaoqixhb.com\ngaoqixie.com\ngaore.com\ngaosafe.com\ngaosan.com\ngaoseng.com\ngaoshou.me\ngaoshouvr.com\ngaoshouyou.com\ngaosiedu.com\ngaosivip.com\ngaosouyi.com\ngaosu.com\ngaosudu.com\ngaotang.cc\ngaotangwang.com\ngaotieshike.com\ngaotu006.club\ngaotu007.club\ngaotu100.com\ngaotu11.com\ngaotuxueyuan.com\ngaowoip.com\ngaoxiaobang.com\ngaoxiaodashi.com\ngaoxiaoit.com\ngaoxiaojob.com\ngaoxiaoo.com\ngaoxiaozp.com\ngaoxin123.com\ngaoxincarbon.com\ngaoxinedu.com\ngaoxinedu.net\ngaoxinjy.com\ngaoxitech.com\ngaoyawang.com\ngaoyizaixian.com\ngaoyoujob.com\ngaozhaiedu.com\ngaozhentang.com\ngaozhidazhuan.com\ngaozhongwuli.com\ngaozhouba.com\ngaozi365.com\ngap.hk\ngapitech.com\ngaqcloud.com\ngaqcloud.net\ngaqcloud1.com\ngaqcloud2.com\ngaqcloudbackup.com\ngaqcloudbackup.net\ngara.cc\ngarage-bastide.com\ngardencn.com\ngardenhotel.com\ngardenhotelshanghai.com\ngarfopg.org\ngarleden.com\ngarmuri.com\ngarnoc.com\ngarnor.com\ngarphy.com\ngarply.com\ngaryee.com\ngas-analyzers.com\ngas-scrubber.com\ngas-turbine-parts.com\ngas775.com\ngas800.com\ngasfw.com\ngasgoo.com\ngasgood.com\ngashr.com\ngashw.com\ngaspeedup.com\ngaspim.com\ngasshow.com\ngastank-china.com\ngastronomy.gov.mo\ngate-dhgames.com\ngateface.com\ngateweb3.cc\ngateweb3.io\ngather-dns.com\ngaudie.org\ngaugan.com\ngaush.com\ngautomator.com\ngavill.com\ngavindesign.com\ngavinzh.com\ngaxgame.com\ngaxrmyy.com\ngayzyhh.com\ngaze.run\ngazemd.com\ngazx.org\ngb324.com\ngb55009.com\ngb56.net\ngb5842.com\ngbacd.com\ngbase8a.com\ngbasebi.com\ngbasig.com\ngbdex.com\ngbdz.net\ngbeca.org\ngbffchina.com\ngbgba.com\ngbgcn.com\ngbhome.com\ngbiac.net\ngbicdn.com\ngbicom.com\ngbictc.com\ngbimg.com\ngbma.org\ngbofd.com\ngbox.pub\ngboxchina.com\ngbphar.com\ngbrgz.com\ngbskptu1044.vip\ngbsrobot.com\ngbstape.com\ngbt88.com\ngbtranswins.com\ngbvh.com\ngbw114.com\ngc-zb.com\ngc0771.com\ngc1616.com\ngc39.com\ngc48tdh6gm.com\ngc73.com\ngc91.com\ngcable.tv\ngccdn.net\ngccgz.com\ngcchina.com\ngccmgw.com\ngccrcw.com\ngcdcrs.com\ngcexlab3.com\ngcgd.net\ngcgzjt.com\ngchao.com\ngchbs.com\ngchhotels.com\ngci-china.com\ngcihotel.net\ngciig.com\ngcimg.net\ngcjc.com\ngcjgxx.com\ngcjlkj.com\ngcjr.com\ngcjy.info\ngckychina.com\ngcl-et.com\ngcl-perovskite.com\ngcl-power.com\ngcld.net\ngclhgc.com\ngcloudcs.com\ngcloudcstest.com\ngcloudcstestonly.com\ngclouddolphin.com\ngcloudf.com\ngcloudgbs.com\ngcloudsdk.com\ngcloudsvcs.com\ngcmc.cc\ngcok.com\ngcomtechnology.com\ngcopt.com\ngcoreinc.com\ngcores.com\ngcpok.com\ngcpunion.org\ngcs66.com\ngcscmp.com\ngcstorage.com\ngctianshanxh.com\ngctong.com\ngctzsh.com\ngcwdp.com\ngcwduoduo.com\ngcwith.com\ngcykj.com\ngcyts.com\ngcyy08.com\ngczyg.com\ngd-chenxing.com\ngd-chuangfu.com\ngd-dl.com\ngd-esa.com\ngd-haijing.com\ngd-hcsj.com\ngd-hongyuegroup.com\ngd-hskj.com\ngd-hstech.com\ngd-huadi.com\ngd-id.com\ngd-jinzhanggui.com\ngd-jxjy.com\ngd-kexin.com\ngd-linux.com\ngd-linux.org\ngd-ls.com\ngd-lt.com\ngd-realfaith.com\ngd-shenhua.com\ngd-tianchen.com\ngd-tianyue.com\ngd-wanxi.com\ngd-weisi.com\ngd-xrsd.com\ngd1580.com\ngd165.com\ngd2000.org\ngd2h.com\ngd32.com\ngd32mcu.com\ngd3n.com\ngd56114.com\ngd563.com\ngd9d.com\ngda086.com\ngdaa.ltd\ngdadjs.com\ngdadri.com\ngdaep.com\ngdahua.com\ngdaia.net\ngdaii.com\ngdairport.com\ngdanano.com\ngdandun.com\ngdapi.net\ngdarcu.net\ngdase.com\ngdass.org\ngdatacube.net\ngdatc.net\ngdbailin.com\ngdbainengbao.com\ngdbaishun.net\ngdbbk.com\ngdbhnk.com\ngdbicyclexh.com\ngdbidding.com\ngdbita.com\ngdbljd.com\ngdbmh.com\ngdbsjd.com\ngdbzkz.com\ngdbzkz.org\ngdcaa.com\ngdcaia.com\ngdcaward.com\ngdcayyebh.com\ngdccaa.com\ngdcci.com\ngdccus.org\ngdcdsh.com\ngdceg.com\ngdcgkg.com\ngdchanbo.com\ngdchess.com\ngdchjt.com\ngdcia.org\ngdcic.net\ngdcjrhcjh.com\ngdcjtd.com\ngdcjxx.com\ngdcocodemer.com\ngdcoop.com\ngdcopper.com\ngdcordblood.org\ngdcost.com\ngdcow.com\ngdcreate.com\ngdcsgj.com\ngdctaa.com\ngdctcd.com\ngdctdb.com\ngdctpark.com\ngdcts.com\ngdctsvisa.com\ngdctsy.com\ngdcvi.net\ngdcxc2c.com\ngdcxxy.net\ngdcygp.com\ngdcyl.org\ngdczedu.net\ngdczkj.com\ngdczyy.com\ngddata.net\ngddci.com\ngddcjt.com\ngddcm.com\ngddelux.com\ngddeqing.com\ngddfpaper.com\ngddfund.com\ngddg.cc\ngddhn.com\ngddianchuang.com\ngddidg.com\ngddikasi.com\ngddingxin.com\ngddjauto.com\ngddlaaa.com\ngddlkj.com\ngddmsmc.com\ngddqfs.com\ngddqfs.net\ngddrcgzjt.com\ngddsjt.com\ngddtop.com\ngddyhb168.com\ngddysl.com\ngddz0769.com\ngde.cc\ngdeams.com\ngdebidding.com\ngdecn.com\ngdedia.com\ngdedu123.com\ngdeeia.com\ngdefair.com\ngdeia.com\ngdems.com\ngdepi.com\ngdevops.com\ngdfanhua.com\ngdfcjz.com\ngdfeiyang.com\ngdfenxiao.com\ngdfggvfsd.asia\ngdfgq.club\ngdfjsh.org\ngdfplaza.com\ngdfs.com\ngdfsg-yxva.vip\ngdfshx.com\ngdfuji.com\ngdfushefanghuxiehui.com\ngdfzsy.com\ngdgajt.com\ngdganhua.com\ngdgassoc.com\ngdgcjhf.com\ngdgczb.com\ngdggkf.com\ngdghg.com\ngdgkfn.com\ngdgkty.com\ngdgowe.com\ngdgpc.net\ngdgrsw.com\ngdguangdong.com\ngdguozhi.com\ngdgwyw.com\ngdgxxbw.com\ngdgzhengzhou.com\ngdgzrb.com\ngdhairun.com\ngdhaoma.com\ngdhbsh.com\ngdhchina.com\ngdhcsh.com\ngdhdbxg.com\ngdhdgc.com\ngdhengdian.com\ngdhfjt.com\ngdhfkg.com\ngdhhgroup.com\ngdhhjs.net\ngdhhotels.com\ngdhjtz.com\ngdhjzs.com\ngdhla.com\ngdhmgc.com\ngdhongsha.com\ngdhpwx.com\ngdhqzy.com\ngdhsbid.com\ngdhtcm.com\ngdhuana.com\ngdhuaxun.net\ngdhuaya.com\ngdhwater.com\ngdhwgf.com\ngdhwjl.com\ngdhxgf.com\ngdhylhh.com\ngdhzsb.com\ngdicoou.com\ngdida.org\ngdie.com\ngdinfo.net\ngdinin.com\ngdinm.com\ngdinsa.org\ngdinsight.com\ngdipa.org\ngdippa.com\ngdiso.com\ngdj-tech.com\ngdjdxh.com\ngdjdxy.com\ngdjhh.com\ngdjiabao.com\ngdjinge.com\ngdjinguan.net\ngdjingyin.com\ngdjinzong.com\ngdjiutu.com\ngdjky.com\ngdjlfood.com\ngdjlxh.org\ngdjly.com\ngdjs120.com\ngdjshd.com\ngdjugong.com\ngdjuhan.com\ngdjuntai.com\ngdjxjy.com\ngdjxzs.com\ngdjydg.com\ngdjysteel.com\ngdjyw.com\ngdjyyy.com\ngdkailin.com\ngdkcsj.com\ngdkepler.com\ngdkingma.com\ngdkjb.com\ngdkjk56.com\ngdkjw.com\ngdkjzy.net\ngdks168.com\ngdkszx.com\ngdktzx.com\ngdkxpcb.com\ngdkyhj.com\ngdkz88.com\ngdlaoan.com\ngdlgsw.com\ngdlgxy.com\ngdlighting.com\ngdlii.com\ngdlinefly.com\ngdlingjie.net\ngdlins.com\ngdliontech.com\ngdlkjt.com\ngdlmetc.com\ngdlnpumps.com\ngdlsgz.com\ngdlswl.com\ngdly-motor.com\ngdlz.com\ngdmagam.com\ngdmain.com\ngdmca.org\ngdmhjjt.com\ngdmia.com\ngdminda.com\ngdmm.com\ngdmoa.org\ngdmschina.com\ngdmtjt.com\ngdmuah.com\ngdmusah.com\ngdmuseum.com\ngdmzh.com\ngdmztv.com\ngdnanbo.com\ngdnbdaqi.com\ngdnd2016.com\ngdnengyuan.com\ngdneptunus.com\ngdnewmedia.cc\ngdnfu.com\ngdnfzb.com\ngdnhci.com\ngdnin.com\ngdniubang.com\ngdnjuae.com\ngdnybank.com\ngdnyjt.com\ngdofun.com\ngdoip.com\ngdojbk.com\ngdokpackaging.com\ngdolai.com\ngdomall.com\ngdou.com\ngdpace.com\ngdpdd.com\ngdpengquan.com\ngdpia.com\ngdprm.com\ngdprm.net\ngdpsc.org\ngdpysc.com\ngdqcxcl.com\ngdqianliang.com\ngdqianyou.com\ngdqlxh.com\ngdquannong.com\ngdqxjt.com\ngdqynews.com\ngdrc.com\ngdrc360.com\ngdrc365.com\ngdrcu.com\ngdrdcy.com\ngdrfyy.com\ngdronggang.com\ngdroro.com\ngdrqj.org\ngdrsrc.com\ngdruien.com\ngdruisheng.com\ngdrxyy.com\ngdrxzx.com\ngdryc.com\ngds-huanbaogroup.com\ngds-services.com\ngdsa.com\ngdsaipu.com\ngdsalt.com\ngdsanlian.com\ngdsanling.com\ngdsbaxh.com\ngdscse.net\ngdsday.com\ngdsdays.com\ngdsdkg.com\ngdsdwan.com\ngdsdyy.com\ngdsflbs.com\ngdsfpharma.com\ngdsfsgl.com\ngdsgd.com\ngdsgj.com\ngdsgjgxh.com\ngdshcm.com\ngdshe.org\ngdshunna.net\ngdshuojin.com\ngdsia.net\ngdsjqr.com\ngdsjx.com\ngdsjxjy.com\ngdskfz.com\ngdskills.com\ngdskin.com\ngdslrobot.com\ngdslwl.com\ngdsme.org\ngdsoftpark.com\ngdspeedtest.com\ngdsports.net\ngdsqyg.com\ngdsrcw.com\ngdssie.com\ngdsspt.net\ngdst.cc\ngdstc.group\ngdstie.com\ngdstlab.com\ngdsugar.com\ngdsunfly.com\ngdsunhot.com\ngdsunli.com\ngdsuxie.com\ngdswgc.com\ngdswine.com\ngdsxgd.com\ngdsxgf.com\ngdsytech.com\ngdsyy.org\ngdsyzxsz.com\ngdszjgdj.org\ngdszkw.com\ngdszsl.com\ngdszxh.com\ngdtaihao.com\ngdtap.com\ngdtc.cc\ngdtcoin.com\ngdtcyy.com\ngdtengen.com\ngdtengnan.com\ngdtex.com\ngdtextbook.com\ngdtianrun.com\ngdtianshanoa.com\ngdtichy.com\ngdtimg.com\ngdton.com\ngdtongda.com\ngdtongjiang.com\ngdtongyi.com\ngdtravel.com\ngdtri.com\ngdtstream.com\ngdttaph.com\ngdttc.com\ngdtu.org\ngdtx56.com\ngdtykj.net\ngdtz888.com\ngdtzb.com\ngdu-tech.com\ngduaee.com\ngdunis.com\ngdunt.com\ngdupi.com\ngdus.cc\ngdutbbs.com\ngdveren.com\ngdvolunteer.net\ngdwanlv.com\ngdwanshun.com\ngdwbyq.com\ngdwca.com\ngdwczb.com\ngdweilaisw.com\ngdwha.org\ngdwia.com\ngdwlcloud.com\ngdwld.com\ngdwlife.com\ngdwsa.com\ngdwse.com\ngdwsrc.net\ngdww.com\ngdwxyf.com\ngdwz.com\ngdxdf.com\ngdxdpg.com\ngdxdy.com\ngdxfl.com\ngdxindun.com\ngdxinqiang168.com\ngdxinxiang.com\ngdxise.com\ngdxjzx.org\ngdxmsx.com\ngdxscode.com\ngdxsn.com\ngdxueyin.com\ngdxxb.com\ngdxy.vip\ngdxych.com\ngdybkjjt.com\ngdyd.com\ngdydgj.com\ngdydzb.com\ngdyeb.com\ngdygsk.com\ngdyhgn.com\ngdyhsp.com\ngdyiyou.com\ngdykhb.net\ngdylhp.com\ngdyngl.com\ngdyouyes.com\ngdypt.com\ngdyqxc.com\ngdyslyh.org\ngdysnk.com\ngdysxh.com\ngdytc.com\ngdytxh.com\ngdyuanshun.com\ngdyuasa.com\ngdyuegou.com\ngdyuhi.com\ngdyunxiao.com\ngdyunyin.net\ngdyxc.com\ngdyyjgxh.com\ngdyyyy.net\ngdz.co\ngdzbha.com\ngdzcjt.net\ngdzd-motor.com\ngdzdbidding.com\ngdzgjl.com\ngdzgy.com\ngdzhcx.com\ngdzhenxing.com\ngdzhiding.com\ngdzhig.com\ngdzhonghua.com\ngdzhongpeng.com\ngdzhongshan.com\ngdzjdl.com\ngdzjqy.com\ngdzp.org\ngdzrlj.com\ngdzs2018.cc\ngdzs2018.vip\ngdzskj.tech\ngdzsxx.com\ngdzszt.com\ngdztbz.com\ngdzuoxie.com\ngdzxgj.com\ngdzxmm.com\ngdzy5413.com\ngdzygroup.com\ngdzygy.com\ngdzyinvest.com\ngdzyjnw.com\ngdzz114.com\ngdzzjc.com\ngdzzw.net\ngdzzz.com\nge-garden.net\nge100.com\ngeakr.com\ngeality.com\ngeapu.com\ngear5.me\ngearbbs.net\ngearfront.net\ngearkr.com\ngearpharma.com\ngearsnet.com\ngeatmap.com\ngeautos.com\ngebaiwan.com\ngebchina.com\ngebertech.com\ngebilaoshi.com\ngebinlong.com\ngebiqu.com\ngec123.com\ngeci123.com\ngecimi.com\ngecpc.com\ngedi2099.com\ngedou8.com\ngedoumi.com\ngedu.org\ngeeboo.com\ngeebook.com\ngeedai.com\ngeedu.com\ngeeetech.com\ngeeeu.com\ngeehy.com\ngeejing.com\ngeek-docs.com\ngeek-papa.com\ngeek-share.com\ngeek32.com\ngeekbang.com\ngeekbang.org\ngeekbangtech.com\ngeekcar.com\ngeekcar.net\ngeekclo.com\ngeekdata.com\ngeekdaxue.co\ngeekdive.com\ngeekefu.com\ngeekercloud.com\ngeekerconsulting.com\ngeekerhua.com\ngeekfans.com\ngeeklab.work\ngeeklei.com\ngeekluo.com\ngeekmaker.com\ngeekman.vip\ngeeknev.com\ngeekpark.net\ngeekpwn.com\ngeekpwn.org\ngeeksblog.cc\ngeeksman.com\ngeektcp.com\ngeektutu.com\ngeeku.net\ngeekwom.com\ngeekxia.com\ngeekxue.com\ngeekzhao.me\ngeekzl.com\ngeelevel.com\ngeely-auto-gtm.com\ngeely-test.com\ngeely.com\ngeely.pe\ngeelycv.com\ngeelyholding.com\ngeelylaos.com\ngeelyminiprogram.com\ngeelyph.com\ngeelysc.com\ngeement.com\ngeeqee.com\ngeermunews.com\ngeermurmt.com\ngeeseteam.com\ngeesic.com\ngeespace.com\ngeetest.com\ngeevisit.com\ngeewaza.com\ngeexek.com\ngeezn.com\ngegame.site\ngegeailu.org\ngegedao.com\ngegejia.com\ngegemm.work\ngegeselect.hk\ngegeyingshi.com\ngehaowu.com\ngehope.com\ngehua.com\ngehua.net\ngei-journal.com\ngei.pw\ngei6.com\ngeicloud.com\ngeihuasuan.com\ngeihui.com\ngeilicdn.com\ngeilijiasu.com\ngeilijiasu.net\ngeiliwx.com\ngeimian.com\ngeindex.com\ngeiniwan.com\ngeisnic.com\ngeizan.cc\ngelaha.com\ngelicang.net\ngeline.net\ngelinya.com\ngeliqi.net\ngellec.com\ngelonghui.com\ngelu.me\ngelufu.com\ngem-soft.com\ngemac-cn.com\ngembotech.com\ngemchina.com\ngemdale.com\ngemei.com\ngemelai.com\ngemiaomiao.org\ngemii.cc\ngemini-galaxy.com\ngemini530.net\ngemjz.com\ngemled-tech.com\ngempharmatech.com\ngempoll.com\ngemuedu.com\ngenchim.com\ngendan5.com\ngendantong.com\ngendone.com\ngenegeo.com\ngeneliunx.com\ngenelotus.com\ngenepharma.com\ngeneral-power.com\ngeneralfushi.com\ngeneralichina.com\ngeneraltouch.com\ngeneralwatertech.com\ngenergy-technology.com\ngenericfixer.com\ngenerosbio.com\ngenesis-rock.com\ngeneskies.com\ngenetalks.com\ngenevoyager.com\ngeneway-bio.com\ngeneworldcn.com\ngenfleet.com\ngengchuangz.com\ngengfuwang.com\ngenghai.com\ngengius.com\ngengleyuan.com\ngengls.org\ngengnie.com\ngengsan.com\ngengshangpin.com\ngengstar.com\ngengzhongbang.com\ngenhousebio.com\ngeni4s.com\ngenial.vip\ngeniatech.com\ngenie-robot.com\ngeniusafc.com\ngeniusara.com\ngeniuscn.com\ngeniusite.com\ngenmiao.com\ngenobank.org\ngenomeditech.com\ngenrace.com\ngenscript.com\ngensee.com\ngenshinimpact.com\ngenshinimpact.moe\ngenshuixue.com\ngenstars.com\ngentags.com\ngentags.net\ngentco.com\ngentechchina.com\ngentize.com\ngenudite.com\ngenuine-bio.com\ngenuway.com\ngenvict.com\ngenway.net\ngeo-compass.com\ngeo.kaspersky.com\ngeo2k.com\ngeoactivity.net\ngeoai.com\ngeoforcechip.com\ngeogsci.com\ngeoharbour.com\ngeohey.com\ngeoidc.com\ngeolong.com\ngeometryauto.com\ngeons.host\ngeorginaarmadas.com\ngeosheen.com\ngeospatialsmart.com\ngeotmt.com\ngeovisearth.com\ngepcc.com\ngephb.com\ngepresearch.com\ngepubbs.com\ngepush.com\ngeren-jianli.com\ngerenjianli.com\ngerenshuoming.com\ngerhard-china.com\ngermmc.com\ngeruihuate.com\ngeruishuiwu.com\ngeruisi-bio.com\ngerzz.com\ngesanghua.org\ngescosteel.com\ngescs.com\ngesedna.com\ngesedna.net\ngesep.com\ngeshitong.net\ngeshui.com\ngeshui100.com\ngeshui99.com\ngeshuiba.com\ngesuo.com\ngeswl.com\nget-shell.com\nget.vip\nget233.com\ngetbs.com\ngetcai.com\ngetconnectplus.com\ngetddhospi.com\ngetehu.com\ngetelighting.com\ngetgetai.com\ngethover.com\ngetiis.com\ngetiot.tech\ngetkwai.com\ngetmarkman.com\ngetpm.com\ngetquicker.net\ngetrebuild.com\ngetsays.com\ngetsetgadget.com\ngetsurfboard.com\ngettopacoustic.com\ngetu.fun\ngetui.com\ngetui.net\ngetui.vip\ngetvidi.co\ngewala.com\ngewara.com\ngewei-wh.com\ngewei.com\ngeweng.com\ngewu.vc\ngewuer.com\ngewuzhixiang.com\ngexiao.me\ngexiaocloud.com\ngexinda.com\ngexing.com\ngexing.me\ngexings.com\ngexingshuo.com\ngexingzipai.com\ngexiong.com\ngexiuyixibai.org\ngeyawatch.com\ngeyevalve.com\ngeyifudi.com\ngeyo.com\ngeyoukj.com\ngezida.com\ngezila.com\ngezipu8.net\ngezivisa.com\ngf-cloud.com\ngf-funds.com\ngf-metals.com\ngf-nj.com\ngf.app\ngf.cc\ngf139.com\ngf1579.com\ngf7979cn.com\ngfan.com\ngfanstore.com\ngfbk.net\ngfbzb.com\ngfbzb.net\ngfcdn.xyz\ngfcity.com\ngfcname.com\ngfcvisa.com\ngfd178.com\ngfdj99665.com\ngfdns.net\ngfdsa.net\ngfedu.com\ngfedu.net\ngffirm.com\ngffwq.com\ngfglb.com\ngfhealthcare.com\ngfjeah-rhjeb6.com\ngfjl.org\ngflad.com\ngflz.com\ngfmpv.com\ngfnormal00ai.com\ngfnormal00am.com\ngfnormal01ab.com\ngfnormal01ad.com\ngfnormal01af.com\ngfnormal01ag.com\ngfnormal01ah.com\ngfnormal01aj.com\ngfnormal01at.com\ngfnormal02ab.com\ngfnormal02af.com\ngfnormal02am.com\ngfnormal02ap.com\ngfnormal03ae.com\ngfnormal03al.com\ngfnormal03aq.com\ngfnormal04ai.com\ngfnormal04ak.com\ngfnormal04ao.com\ngfnormal04ar.com\ngfnormal05af.com\ngfnormal05ah.com\ngfnormal05ap.com\ngfnormal05aq.com\ngfnormal05ar.com\ngfnormal06ai.com\ngfnormal06as.com\ngfnormal06at.com\ngfnormal07ac.com\ngfnormal07ah.com\ngfnormal07ai.com\ngfnormal08ag.com\ngfnormal08as.com\ngfnormal08at.com\ngfnormal09ag.com\ngfnormal09aq.com\ngfnormal09ar.com\ngforward.org\ngfoxsoft.net\ngfren.org\ngfrtrttweet.com\ngfslgy.com\ngfsz.net\ngftiec.com\ngfttek.com\ngftuan.com\ngfun.me\ngfund.com\ngfvip00ae.com\ngfvip01ad.com\ngfvip02aa.com\ngfvip04ah.com\ngfvip04al.com\ngfvip05ae.com\ngfvip05ag.com\ngfvip05aj.com\ngfvip05am.com\ngfvip06ae.com\ngfvip07ab.com\ngfvip08ab.com\ngfvip08ac.com\ngfvip08an.com\ngfvip08at.com\ngfxaa.com\ngfxcamp.com\ngfxtr1.com\ngfxy.com\ngfzihua.com\ngfzj.us\ngg-lb.com\ngg-led.com\ngg.com\ngg122.net\ngg1994.com\nggac.net\nggai12180cp.com\nggaiyan.com\nggas.com\nggbamy.com\nggbanfu.com\nggbondtech.com\nggbygx.com\nggcimbar.com\nggcj.com\nggcx.com\nggcykf.com\nggdata.com\nggecc.com\nggecgc.com\nggemo.com\nggeye.com\nggfsfy.com\nggfswy.com\nggg42.com\nggg868.com\ngggcn.com\ngggfyl.com\ngggg5.com\nggghny.com\ngggjs.com\ngggqa.com\ngggrp.com\ngggua.com\ngggwg.com\ngggzhi.com\ngggzpw.com\ngghb.cloud\ngghcgg.com\ngghosp.net\ngghs.info\ngghualong.com\ngghx120.com\ngghy.org\ngginto.com\nggjcpm.com\nggjpay.com\nggjrw.com\nggjstz.com\nggjszp.com\nggjt.com\nggjtfw.com\nggksw.com\nggkuai.com\nggl.com\ngglenglish.com\ngglkw.net\ngglmg.com\nggmlechi.com\nggmm55.com\nggmm777.com\nggmsw.com\nggnqmy.com\nggo.net\nggo10150lq.com\nggoplay.com\nggowan.com\nggqule.com\nggqunshanmuye.com\nggqx.com\nggrcw.com\nggren.net\nggrsmy.com\nggrsrc.com\nggsafe.com\nggsfcw.com\nggshfmy.com\nggshmy.com\nggslxs.com\nggsq.cc\nggtime.com\nggtjx.com\nggtrj.com\nggttvc.com\nggunk1tn.com\nggwan.com\nggwan.net\nggweb.net\nggweijie.com\nggwlxx.com\nggwxmuye.com\nggwzpf120.com\nggxarq.com\nggxdsmzx.com\nggxhx.com\nggxiaolinmy.com\nggxinzhitaimy.com\nggxjhk.com\nggxsjz.com\nggxue.com\nggxx.net\nggy.net\nggy775.com\nggyouyu.com\nggysc.com\nggysfw.com\nggytc.com\nggyx666.com\nggyy100.com\nggzbbj.com\nggzc.net\nggzgc.com\nggzha.com\nggzhaf.com\nggzs.me\nggzuhao.com\nggzx.net\ngh-fm.com\ngh-reagent.com\ngh-shipping.com\ngh8s.com\nghatg.com\nghboke.com\nghbxrj.com\nghc168.com\nghcec.com\nghcis.com\nghcxzb.com\nghddi.org\nghdoor.com\nghed119.com\nghedu.com\nghfdc.org\nghgglobal.com\nghglzx.com\nghgy.com\nghhyjc.com\nghibliwiki.org\nghitcsh.com\nghitest.com\nghjbh123.com\nghlawyer.net\nghlearning.com\nghlshb.com\nghlykj.com\nghmba.com\nghmcchina.com\nghmd448.com\nghmisnet.com\ngho5.com\nghoffice.com\nghost-him.com\nghost008.com\nghost11.com\nghost32.net\nghost64.com\nghostchu.com\nghostoact.com\nghostsf.com\nghostwin7win8.com\nghostxp2.com\nghostxpsp3.net\nghostxx.com\nghoxz.com\nghparking.com\nghpepower.com\nghproxy.cc\nghpy3333.com\nghpym.com\nghrepower.com\nghrlib.com\nghs.net\nghschool.com\nghsd16888.com\nghsense.com\nghsmc.com\nghsmpwalmart.com\nght-china.com\nght120.com\nghtech.com\nghtianshancn.com\nghtt.net\nghturbine.com\nghtzgs.com\nghwgame.com\nghxi.com\nghxsw.com\nghyg.com\nghyhjsw.com\nghyl888.com\nghzhushou.com\nghzs.com\nghzs666.com\ngiabbs.com\ngiaimg.com\ngialen.com\ngiant-china.com\ngiant-cycling-lifestyle.com\ngiantaircompressor.com\ngiantcdn.com\ngiantet.com\ngiantgd.com\ngiantkone.com\ngiao.me\ngibcp.com\ngicasa.com\ngiccoo.com\ngicfg.com\ngicp.net\ngidepay.com\ngiecds.com\ngiexya.com\ngif5.net\ngiffox.com\ngifhome.com\ngifshow.com\ngiftres.com\ngiftsbeijing.com\ngifu-pr.com\ngiga-da.com\ngiga-science.com\ngigaget.com\ngigbl.com\ngigpayroll.com\ngihg.com\ngihiji.com\ngiho.com\ngiihg.com\ngiikin.com\ngiiktop.com\ngiiso.com\ngijsq.com\ngildata.com\ngilieye.com\ngiltbridge.com\ngiltworld.com\ngimcyun.com\ngimhoy.com\ngimmgimm.com\ngimoo.net\ngimsh.com\ngin-vue-admin.com\nginde.com\nginfon.com\ngingerbreadstudio.cc\ngingyan.com\nginlong.com\nginshio.org\nginwa.com\ngio.ren\ngio07231rp.com\ngio07250rp.com\ngioccc.com\ngiocdn.com\ngiomeru.com\ngionee.com\ngionee.net\ngioneemobile.net\ngioner.com\ngiordano.com\ngiorgiomorandihotels.com\ngiraff3.com\ngirdear.net\ngirl13.com\ngirls-frontline.com\ngirlsfighters.com\ngirlw.net\ngiscafer.com\ngiserdqy.com\ngispark.org\ngissaas.com\ngissinggroup.com\ngissky.net\ngistc.com\ngit-repo.info\ngit-star.com\ngitcafe.ink\ngitclone.com\ngitcode.com\ngitcode.host\ngitcode.net\ngitee.com\ngitee.io\ngithang.com\ngithub-zh.com\ngithubim.com\ngithubshare.com\ngitinn.com\ngitiu.com\ngitlib.com\ngitmirror.com\ngitnoteapp.com\ngitom.com\ngitpp.com\ngitsea.com\ngitshell.com\ngitv.tv\ngityuan.com\ngityx.com\ngiveda.com\ngiyu8.com\ngizaworks.com\ngizwits.com\ngj62.com\ngjbaek.ren\ngjcars.com\ngjceshi9.com\ngjcha.com\ngjcoil.com\ngjcweb.com\ngjcxgs.com\ngjdk100.com\ngjds.vip\ngjdwzp.com\ngjfmxd.com\ngjghy.com\ngjgzpw.com\ngjhgroup.com\ngjhl.com\ngjj.cc\ngjjcxw.com\ngjjiaxiao.com\ngjjnhb.com\ngjjsbz.com\ngjkdwl.com\ngjl15.com\ngjlease.com\ngjmbwxpt.com\ngjmbwxzx.com\ngjmrk.com\ngjnlyd.com\ngjpdh.com\ngjrwls.com\ngjsj.com\ngjsun.com\ngjsy.org\ngjtmu.com\ngjtool.com\ngjtt.net\ngjw.com\ngjw123.com\ngjwca.org\ngjwl123.com\ngjwlyy.com\ngjxh.org\ngjxx.com\ngjxzq.com\ngjydz.com\ngjyfish.com\ngjyuxiang.com\ngjyys.com\ngjzfw.com\ngjzy.com\ngk-cn.com\ngk-net.com\ngk-z.com\ngk.ink\ngk.link\ngk100.com\ngk114.com\ngk99.com\ngkcyc.com\ngkczgs.com\ngkczp.com\ngkfb.com\ngkgzj.com\ngkhxtc.com\ngki88.com\ngkjzy.com\ngkket.com\ngkkxd.com\ngklx.net\ngkmao.com\ngkmems.com\ngkmhq.com\ngkmotor.com\ngkong.com\ngkoo.net\ngkoudai.com\ngkqcw.com\ngkqxfsl.xyz\ngkrpgtee.com\ngkshanghai.com\ngkshuju.com\ngktianshanjd.com\ngkuresx.com\ngkwo.net\ngkxd.com\ngkxs.com\ngkxx.com\ngkyly.com\ngkzhan.com\ngkzj.com\ngkzj.net\ngkzpfw.com\ngkzppt.com\ngkzq.mobi\ngkzqxc.com\ngkzxw.com\ngkzy.com\ngkzy100.com\ngkzyb.com\ngkzzd.com\ngkzzy.com\ngl-data.com\ngl-mes.com\ngl-qf.com\ngl-uav.com\ngl-zj.com\ngl102.com\ngl114.net\ngl170.com\ngl17u.com\ngl18.com\ngl258.com\ngl2mt.com\nglab.online\nglacierluo.com\ngladcc.com\ngladdigit.com\nglafamily.com\nglamever.com\nglamourred.com\nglamourtrains.com\nglanimaltrade.com\nglanu.com\nglaproject.com\nglasercom.com\nglass-ciac.com\nglassbottleproducer.com\nglasseasy.com\nglassmicro.com\nglavo.site\nglaway.com\nglawyer.net\nglb3.com\nglb4.com\nglb6.com\nglbaishen.com\nglbdns.com\nglblkq.com\nglby118.com\nglbyhotel.com\nglbyjdjt.com\nglcablesy.com\nglcanyin.net\nglcape.com\nglcct.com\nglcht.com\nglchunchao.com\nglchuyun.com\nglcits.com\nglclcsy.com\nglcszy.com\ngldaewoo.com\ngldjc.com\ngleasy.com\nglecan.com\nglelec.com\ngleyy.com\nglface.com\nglfangzhen.com\nglfdfcyy.com\nglflyy.com\nglfpii.com\nglfund.com\nglfyjg.com\nglgangyu.com\nglgcsj.com\nglgda.com\nglgdst.com\nglgeneng.com\nglggh.com\nglgh.org\nglghy.com\nglgnmt.com\nglgsoft.com\nglgst.com\nglgtzc.com\nglgyzn.com\nglgzlq.com\nglhcjs.com\nglhckj.com\nglhclv-kool.com\nglhdq.com\nglhfmy.com\nglhfsy.com\nglhmmr.com\nglhnkj.com\nglhospital.com\nglhrzx.com\nglhsylqx.com\nglhtpcb.com\nglhuade.com\nglhuashi.com\nglhuayue.com\nglhycy.com\nglhygjlxs.com\nglhzhotel.com\nglhzzx.com\nglicon.design\nglifegame.com\nglinfo.com\nglinkmedia.com\nglinksure.com\ngljcss.com\ngljdjt.com\ngljiatianxia.com\ngljiayu.com\ngljieli.com\ngljinbao.com\ngljinfeng.com\ngljinhui.com\ngljinshan.com\ngljkfhq.com\ngljlw.com\ngljshy.com\ngljshz.com\ngljsjl.com\ngljtkg.com\ngljtxjy.com\ngljygd.com\ngljykj.com\ngljyrj.com\ngljzgs.com\nglk7.com\nglkgjt.com\nglkths.com\ngllcit.com\ngllfyy.com\nglljsh.com\nglljy.com\ngllshan.com\ngllstz.com\nglludiyan.com\ngllue.com\ngllue.me\ngllue.net\ngllxsb.com\ngllycs.com\nglmama.com\nglmapper.com\nglmayo.com\nglmbc.com\nglmingke.com\nglmmodels.com\nglncn.com\nglnewstar.com\nglo-slotsimulator.com\ngloamingtechnology.com\nglobal-dba.com\nglobal-download.acer.com\nglobal-harbor.com\nglobal-idc.net\nglobal-jf.com\nglobal-ks-cdn.com\nglobal-leader.com\nglobal-otc.com\nglobal-scsl.com\nglobal-tio2.com\nglobal56.com\nglobalaccentchinese.com\nglobalauthorid.com\nglobalbaike.com\nglobalbuy.cc\nglobalchangan.com\nglobalcho.com\nglobalesim.shop\nglobaletrust.com\nglobalgeopark.org\nglobalhardwares.com\nglobalimporter.net\nglobalizex.com\nglobalmil.com\nglobalnevs.com\nglobalpingbao.com\nglobalscanner.com\nglobalsign.com\nglobalsigncdn.com\nglobalslb.net\nglobalso.com\nglobalso.site\nglobalsources.com\nglobalsourcingbiz.com\nglobalstech.com\nglobalston.com\nglobaltenpay.com\nglobaltradecoo.com\nglobalvisa888.com\nglobalx-nest.com\nglobebill.com\nglobecancer.com\nglobeedu.com\nglobrand.com\nglobusevents.com\nglodon.com\nglofang.com\nglofiy.work\ngloraledu.com\ngloriahotels.com\ngloriamedia.com\nglorygarment.com\nglorysoft.com\ngloryview.com\nglorze.com\nglosellers.com\nglosku.com\nglosspp.com\nglowapp.fun\nglowapp.vip\nglowoman.org\nglpenhui.com\nglplyf.com\nglqh.com\nglqshb.com\nglquanji.com\nglrcjob.com\nglrcw.com\nglreading.com\nglredu.com\nglriverside.com\nglrmyy.com\nglruixin.com\nglsanhua.com\nglsdhnt.com\nglseed.com\nglsgmr.com\nglshimg.com\nglsjf.com\nglsmy024.com\nglssgolf.com\nglsstm.com\nglsxdlkj.com\nglsxr.com\nglsyjd.com\nglsyjgs.com\nglsytzjt.com\nglt365.com\ngltop.com\ngltsg.com\ngltvs.com\ngltx.tech\ngltzjt.com\ngluebon.com\nglumes.com\nglvroc.com\nglvs.com\nglwangcheng.com\nglwuhong.com\nglwxw.net\nglwyhd.com\nglxcc.net\nglxcjt.com\nglxd.com\nglxhzs.com\nglxiaoyaohu.com\nglxinhu.com\nglxkbz.com\nglxsyx.vip\nglxwdb.com\nglxxjx.com\nglxyjx.com\nglxyrn.com\nglyhjc.com\nglyhy.com\nglyjk.com\nglylgg.com\nglyltl.com\nglyndwrsway.com\nglyphara.com\nglyslydjq.com\nglyummy.com\nglyxc.com\nglyxjtgc.com\nglz8.com\nglzcqy.com\nglzdgx.com\nglzeasun.com\nglzfst.com\nglzh-szzx.site\nglzhcyy.com\nglzhealth.com\nglzip.com\nglzizhu.com\nglzj88.com\nglzmn.com\nglzrflx.com\nglzsjc.com\nglzthz.com\nglztj.com\nglzx.net\nglzyjt.com\nglzzjy.com\ngm-scm.com\ngm016.com\ngm193.com\ngm3.win\ngm35.com\ngm3studio.com\ngm825.com\ngm825.net\ngm86.com\ngm88.com\ngm99game.net\ngmacsaic.com\ngmacsaic.net\ngmanhua.com\ngmatg.com\ngmaxbiopharm.com\ngmbbs.net\ngmbuluo.com\ngmcc.net\ngmcinnov.com\ngmcmonline.com\ngmdeng.com\ngmdt9b.com\ngmdun.com\ngmecn.com\ngmed.cc\ngmedata.com\ngmeditech.com\ngmedtech.com\ngmem.cc\ngmeri.com\ngmerit.com\ngmertc.com\ngmfc.cc\ngmfintl.com\ngmg.so\ngmgc.info\ngmgitc.com\ngmhub.com\ngmhuijin.com\ngmhysj.com\ngmi1001.com\ngmilesquan.com\ngmiot.net\ngmjk.com\ngmm01.com\ngmmicro.com\ngmmsj.com\ngmmtcc.com\ngmoe.cc\ngmoj.net\ngmonline-all.com\ngmpbj.com\ngmqd.com\ngmquickapp.com\ngmrmyy.com\ngmsec.net\ngmsolid.com\ngmssl.org\ngmsyun.com\ngmt-china.org\ngmt-cn.com\ngmtacoa.com\ngmtv.cc\ngmtzy.com\ngmugmu.com\ngmw.com\ngmwiki.com\ngmxmym.ren\ngmya.net\ngmyihua.com\ngmylj.com\ngmz88.com\ngmzhushou.com\ngmzi.com\ngmzm.org\ngmzp.net\ngmzx.com\ngn168.com\ngn301.xyz\ngnber.com\ngncebest88.com\ngndaily.com\ngndown.com\ngneec.com\ngneec3.com\ngneec4.com\ngneec5.com\ngneec7.com\ngneedu.com\ngnehr.com\ngnete.com\ngnetis.com\ngnetpg.com\ngng92.com\ngngnk.com\ngnhome.com\ngnhpc.com\ngnice-it.com\ngnict.com\ngninstruments.com\ngnitif.com\ngnla02051qp.com\ngnla02070qp.com\ngnla02071qp.com\ngnlearn.com\ngnnzfw.com\ngnrcbank.com\ngnrnye.com\ngnrtv.com\ngnsschips.center\ngnssinfo.com\ngnssopenlab.org\ngnt8.com\ngnvip.net\ngnway.cc\ngnway.com\ngnway.org\ngnzad.com\ngnzrk.com\ngo-admin.com\ngo-behind.one\ngo-gddq.com\ngo-goal.com\ngo.cc\ngo007.com\ngo108.com\ngo1314.com\ngo2aaron.com\ngo2eu.com\ngo2map.com\ngo2yd.com\ngo300.com\ngo5kvsiay5wx.com\ngoalchina.net\ngoalhi.com\ngoalmapapp.com\ngoapk.com\ngobanma.com\ngobasearcher.com\ngobelike.net\ngobivc.com\ngobroadhealthcare-sh.com\ngobroadhealthcare.com\ngobyd.com\ngocarjourney.com\ngocashback.com\ngocchina.com\ngocdn.cc\ngocea.net\ngoceshi.com\ngoclee.com\ngocn.vip\ngocye.com\ngodaily.org\ngodasai.com\ngodbiao.com\ngodblessrail.com\ngodblessyuan.com\ngoddelivery.com\ngoddessxzns.com\ngodele.com\ngodgy.xyz\ngodic.net\ngodida.com\ngodlu.com\ngodo.pub\ngodoor.com\ngodotcn.com\ngodsendcn.com\ngodsheepteam.com\ngodsignal.com\ngodweiyang.com\ngodwolf.com\ngoeasy.io\ngoelia1995.com\ngoepe.com\ngoertek.com\ngoetheslz.com\ngofarqzyy.com\ngoforandroid.com\ngoframe.org\ngofreeplay.com\ngofrp.org\ngogbuy.com\ngoglew5sn.com\ngogo.so\ngogo123.com\ngogo123.net\ngogoauc.com\ngogocn.com\ngogofly.com\ngogolinux.com\ngogooffer.com\ngogoqq.com\ngogoup.com\ngoherbalfood.com\ngohighfund.com\ngoho.co\ngohoedu.com\ngohomesafe.org\ngohomesh.com\ngohong.com\ngoi08130kh.com\ngoi08160kh.com\ngoing-link.com\ngojiaju.com\ngojira.net\ngokaigai.com\ngoke.com\ngokemicro.com\ngokols.com\ngokuai.com\ngolahsg.com\ngolang8.com\ngolanger.com\ngolangroadmap.com\ngolangw.com\ngolaravel.com\ngold-dragon-castings.com\ngold-seagull.com\ngold-v.com\ngold58.com\ngold678.com\ngoldav.net\ngolday666.com\ngolday999.com\ngolday9999.com\ngoldbj.com\ngoldbox.vip\ngolden-bamboo.com\ngolden-book.com\ngolden-infor.com\ngolden-soft.com\ngolden-spri.com\ngolden3t.net\ngoldenad.net\ngoldenbeechina.com\ngoldenexpogroup.com\ngoldengoosee.com\ngoldengreengolf.com\ngoldenhighway-chem.com\ngoldenholiday.com\ngoldenhome.cc\ngoldening.com\ngoldenken.com\ngoldenladies.com\ngoldenname.com\ngoldennumis.store\ngoldenseaair.com\ngoldentec.com\ngoldenthroat.com\ngoldentom.com\ngoldfoil.com\ngoldgov.com\ngoldgrid.com\ngoldhoe.com\ngoldksoft.com\ngoldlion-china.com\ngoldlion-info.com\ngoldmadon.com\ngoldmantis.com\ngoldmarkrealestate.com\ngoldmt.net\ngoldstone-group.com\ngoldstone-investment.com\ngoldstonepack.com\ngoldsunchn.com\ngoldsunmachinery.com\ngoldsupplier.com\ngoldvole.com\ngoldwaterhk.com\ngoldwind.com\ngolenpower.com\ngolfvv.com\ngolink.com\ngolinkapi.com\ngolinkcn.com\ngolinkgroup.com\ngolinksworld.com\ngolive-tv.com\ngolivetv.tv\ngoluckcity.com\ngoluckyvip.com\ngolue.com\ngomaeps.com\ngomanlift.com\ngomeart.com\ngomecloud.com\ngomegj.com\ngomeholdings.com\ngomehome.com\ngomeplus.com\ngomo.com\ngomocdn.com\ngomvyxvm.com\ngona-semi.com\ngonever.com\ngong-xin.com\ngong123.com\ngongao.net\ngongbaike.com\ngongbi.net\ngongbiaoku.com\ngongboshi.com\ngongcdn.com\ngongchang.com\ngongcheng168.com\ngongchengbing.com\ngongchengjn.com\ngongchou.com\ngongchu.com\ngongfubb.com\ngongfudou.com\ngongji58.com\ngongjiao.com\ngongjiao160.com\ngongjiaomi.com\ngongjiyun.com\ngongju.com\ngongju5.com\ngongjux.com\ngongkaohub.com\ngongkaoleida.com\ngongkaowo.com\ngongkong.com\ngongkong001.com\ngongkongbpo.com\ngongkongedu.com\ngongkongjia.com\ngongkongke.com\ngongkongmall.com\ngongkongsaas.com\ngonglf.com\ngonglve.net\ngongmo1688.com\ngongmutang.com\ngongnou.com\ngongpin.net\ngongpingjia.com\ngongqiu.biz\ngongshang120.com\ngongshiku.com\ngongsibao.com\ngongsijiaoyi.com\ngongsizhang.com\ngongsizhijia.com\ngongwuxing.com\ngongxiangcj.com\ngongxiao8.com\ngongxiaodaji.com\ngongxifc.com\ngongxuanwang.com\ngongxueyun.com\ngongye360.com\ngongyefengshan.com\ngongyeku.com\ngongyelian.com\ngongyeyun.com\ngongyeyunwang.com\ngongyi.la\ngongyi.net\ngongyi.xin\ngongyicn.org\ngongyidaily.com\ngongying405.com\ngongyingshang.biz\ngongyingshi.com\ngongyipuhui.com\ngongyishibao.com\ngongyou.com\ngongyouhui.com\ngongyoumishu.com\ngongzhao.net\ngongzhao.work\ngongzhou.com\ngongzhou.net\ngongzhun.com\ngongzicp.com\ngongzufudinzu.com\ngongzuobaogao.xyz\ngongzuoshouji.net\ngongzuoyun.org\ngonsun.com\ngonvvama.net\ngonxt.com\ngonyn.com\ngoo17.com\ngooagoo.com\ngooann.com\ngoobai.com\ngoobye.net\ngood-display.com\ngood-expo.com\ngood-import.com\ngood.cc\ngood1230.com\ngood321.net\ngood519.com\ngoodacc.net\ngoodally.hk\ngoodao.net\ngoodapk.com\ngoodbaby.com\ngoodbabygroup.com\ngoodbaike.com\ngoodcang.com\ngoodcloud.xyz\ngooddr.com\ngooddu.com\ngoode-china.com\ngoodealwigs.com\ngoodeeis.com\ngoodesocket.com\ngoodfamily.cc\ngoodfamily.com\ngoodgongshi.com\ngoodgupiao.com\ngoodid.com\ngoodix.com\ngoodjd.com\ngoodjili.com\ngoodjob100.com\ngoodk88.com\ngoodkejian.com\ngoodlcm.com\ngoodlift.net\ngoodluckcalendar.com\ngoodmorening.com\ngoodnic.net\ngoododo.com\ngoodonecn.com\ngoodprogrammer.org\ngoodqq.net\ngoodrain.com\ngoodschool.world\ngoodsid.com\ngoodsku.com\ngoodstudydayup.com\ngoodtea.cc\ngoodtech.live\ngoodtp.com\ngoodwe.com\ngoodwillcis.com\ngoodwillresource.com\ngoodwyee.com\ngoodyoungtea.com\ngoofish.com\ngooge.ink\ngoogle-hub.com\ngoogle444.com\ngooglebbs.net\ngooglenav.com\ngoogleplus.party\ngoogleppy.com\ngooglevip8.com\ngooglevoice.org\ngoogley8rb.com\ngoogleyixia.com\ngoogoc.com\ngoogol-power.com\ngoogolpark.com\ngoogvv.com\ngoolemall.com\ngoolink.org\ngoome.net\ngoomj.com\ngoonemei.com\ngooo8.com\ngoooc.net\ngooogua.com\ngooooal.com\ngooood.hk\ngoootech.com\ngoootu.com\ngoopush2025.com\ngooray.com\ngoosai.com\ngoosail.com\ngooseeker.com\ngootho.com\ngootoai.com\ngoowine.com\ngooxi.com\ngooyo.com\ngoozp.com\ngopedu.com\ngopeed.com\ngoplaycn.com\ngopos.hk\ngoproxy.cc\ngoproxy.io\ngorebuy.com\ngoregxa.com\ngorichox.com\ngorouter.info\ngorse.com\ngortune.com\ngosailgis.com\ngoshijia.com\ngoshopjp.com\ngosinoic.com\ngoskygroup.com\ngosonly.com\ngospelwin.com\ngost-pct.com\ngosun.com\ngosun.ltd\ngosuncdn.com\ngosuncdn.net\ngosuncn.com\ngosunm.com\ngotechcn.com\ngotechina.com\ngoten.com\ngothe3.com\ngoto-game.com\ngoto-game.mobi\ngoto-game.net\ngoto-game.org\ngotobath.com\ngotocdn.com\ngotocoding.com\ngotodn.com\ngotofreight.com\ngotohui.com\ngotohz.com\ngotohzrb.com\ngotoip.net\ngotoip1.com\ngotoip11.com\ngotoip2.com\ngotoip3.com\ngotoip4.com\ngotoip55.com\ngotoip88.com\ngotokeep.com\ngotolink.net\ngotonav.com\ngotonets.com\ngotopsoft.com\ngotostudyroom.com\ngotoubi.com\ngotozhuan.com\ngotran.com\ngotvg.com\ngou.com\ngoubrand.com\ngouchezj.com\ngoufang.com\ngoufw.com\ngougoujp.com\ngouguoyin.com\ngouhai.com\ngouhao.com\ngouhaowang.com\ngouhuasuan.shop\ngoujianwu.com\ngoukk.com\ngoukuai.com\ngoulegu.com\ngoulew.com\ngoulong.com\ngoumee.com\ngoumin.com\ngoupautomation.com\ngoupsec.com\ngoupuzi.com\ngourmet114.com\ngoushh.com\ngouso.com\ngousu.com\ngoutanzi.com\ngouwanmei.com\ngouwubang.com\ngouwudang.com\ngouwuke.com\ngouwule.com\ngouwuyu.com\ngouyoukeji.com\ngov-static.tech\ngovagroup.com\ngovfz.com\ngovisionox.net\ngovjc.com\ngovmade.com\ngovqcloud.com\ngovuln.com\ngovwq.com\ngowan8.com\ngoweb1.cc\ngoweb2.net\ngoweb3.net\ngoweike.net\ngowinamc.com\ngowincms.com\ngowinlease.com\ngowinxp.com\ngowlc.net\ngowmo.com\ngowonganinn.com\ngoww.net\ngoyihu.com\ngoyoo.com\ngozap.com\ngozongroup.com\ngozyq.com\ngp-tm.com\ngp1903.com\ngp1907.com\ngp241.com\ngp259.com\ngp451.com\ngp51.com\ngp88888.com\ngp891.com\ngpai.net\ngpall.net\ngpautobid.com\ngpbbs.net\ngpbeta.com\ngpboke.com\ngpcang.com\ngpcqjy.com\ngpd.hk\ngpdi.com\ngper.club\ngpetrip.com\ngpfang.net\ngpgwx.com\ngpl-express.com\ngplayspace.com\ngplqdb.com\ngplus-lab.com\ngpmii.net\ngpmro.com\ngpnewtech.com\ngpost-ge.cfd\ngpowersoft.com\ngppapp.com\ngpqnrc.com\ngps009.net\ngps010.net\ngps123.org\ngps16888.com\ngpsbao.com\ngpsgx.net\ngpslook.net\ngpsonextra.net\ngpsoo.net\ngpsov.com\ngpspw.net\ngpsrcw.com\ngpsspg.com\ngpstool.com\ngpsuu.com\ngpszlsc.com\ngpticket.org\ngptkong.com\ngpubgm.com\ngpuez.com\ngpuztrvt.com\ngpxiv5kew4mvk.com\ngpxxz.com\ngpxygpfx.com\ngpxz.com\ngpxzw.com\ngpyck.com\ngpydxl.com\ngq-rose.com\ngq60.com\ngqbmt.com\ngqget.com\ngqgkj.com\ngqhmt.com\ngqjd.net\ngqjtgs.com\ngqjx.net\ngqk.tv\ngqpyh.com\ngqqsm.com\ngqsj.cc\ngqsoso.com\ngqsyk.com\ngqsym.com\ngqt168.com\ngqxtq.com\ngr-hospital.com\ngra-moissanitesorg.com\ngrablan.com\ngrabsun.com\ngrace2015.site\ngracece.com\ngraceelectron.com\ngracelaser.com\ngracg.com\ngradaimmi.com\ngradgroup.com\ngradgroup.net\ngraduallylift.com\ngrafytek.com\ngrainedu.com\ngrainstorage.net\ngrand-tec.com\ngrandcitytours.com\ngranddongshan.com\ngrandee-elevator.com\ngrandelazio.com\ngrandhopebio.com\ngrandinsight.com\ngrandioes.com\ngrandkol.com\ngrandlisboa.com\ngrandlisboapalace.com\ngrandloong.com\ngrandomics.com\ngrandpharm.com\ngrandqueen.com\ngrandskylightgardenshenzhen.com\ngrandskylightshenzhenguanlan.com\ngrandwaylaw.com\ngrapchina.org\ngraphene.tv\ngraphmovie.com\ngraphmovies.com\ngrass98.com\ngrassmoon.net\ngraueneko.xyz\ngravity-engine.com\ngraz.quest\ngrcbank.com\ngrchina.com\ngrcwzx.com\ngreat-future.com\ngreatagroup.com\ngreatbit.com\ngreatesting.com\ngreathink.com\ngreatld.com\ngreatoo.com\ngreatopensource.com\ngreatops.net\ngreatopt.com\ngreatpowercn.com\ngreatran.com\ngreatroma.com\ngreatsk.com\ngreatsoftman.com\ngreatsolid.com\ngreatssp.com\ngreatstargroup.com\ngreatstartools.com\ngreatwallmusic.com\ngreatwuyi.com\ngredmedic.com\ngree-jd.com\ngree.com\ngreebox.com\ngreedc.com\ngreedongaohotel.com\ngreefinance.com\ngreejt.com\ngreen-cpc.com\ngreen-holdings.com\ngreen-sh.com\ngreen12306.com\ngreencharm.com\ngreenchengjian.com\ngreendh.com\ngreenism.net\ngreenits.net\ngreenlandcn.com\ngreenlandsc.com\ngreenpine.cc\ngreenswolf.com\ngreentomail.com\ngreentownchina.com\ngreenvalleypharma.com\ngreenwater.cc\ngreenwaychina.org\ngreenwicher.com\ngreenwood-park.com\ngreenxf.com\ngreenxiazai.com\ngreepi.com\ngreeyun.com\ngrender.com\ngreplay.com\ngrescw.com\ngretf.com\ngreyli.com\ngreywolfcdn.net\ngreywolffast.com\ngreywolfns.com\ngrfexpo.com\ngrfyw.com\ngrg2013.com\ngrgaoren.com\ngrgbanking.com\ngrgreecv.com\ngrgroup.cc\ngrgsecurity.com\ngrgtest.com\ngrgvision.com\ngrgyintong.com\ngrid2048.com\ngridsum.com\ngridsumdissector.com\ngridy.com\ngrikin.com\ngrinm.com\ngrirem.com\ngritgen.com\ngritpharma.com\ngrjzjt.com\ngrksc.com\ngrmxdy.com\ngrnuo.com\ngroad.net\ngronhi.com\ngroovymedicine.com\ngrouk.com\ngroundsun.com\ngroup-purchasing.com\ngroup-spl.com\ngroup-wenyuan.com\ngroupfangyuan.com\ngrouphx.com\ngroupjh.com\ngroupjx.com\ngrouplus.com\ngroupshenxi.com\ngrowatt.com\ngrowful.com\ngrowingio.com\ngrowthbox.net\ngrpindex.com\ngrria.net\ngrs-syphu.com\ngrspet.com\ngrstz.com\ngrt-china.com\ngrtrelay.com\ngrtsports.com\ngrumplesgroup.com\ngruntjs.net\ngruposeimex.com\ngrxxw.com\ngryltop.com\ngryphline.com\ngryu.net\ngryw666.com\ngrzmz.com\ngrzq.com\ngs-cdn.com\ngs090.com\ngs12122.com\ngs14.com\ngs1cn.org\ngs2.ww.prod.dl.playstation.net\ngs307.com\ngs6699.com\ngsadds.com\ngsafc.com\ngsafety.com\ngsaxns.com\ngsbankchina.com\ngsbankmall.com\ngscaishui.com\ngscblog.com\ngscdn.pub\ngschaos.club\ngscidc.net\ngsdk.tv\ngsdpw.com\ngsdswz.com\ngsdtfx.com\ngsdyjsgs.com\ngseen.com\ngsensebot.com\ngsfilter.net\ngsflcp.com\ngsfrj.com\ngsfybjy.com\ngsfycloud.com\ngsfzb.com\ngsgltz.com\ngsgs10086.com\ngsgundam.com\ngshangju.com\ngshis.net\ngshmhotels.com\ngshmzs.com\ngshopper.com\ngshqqcx.shop\ngshrgroup.com\ngsi24.com\ngsicpa.net\ngsidy.com\ngsjb.com\ngsjkjt.com\ngsjqtv.com\ngsjt-cn.com\ngsjt56.com\ngsjtky.com\ngsk801310hh.com\ngsk801311hh.com\ngskaiwei.com\ngskfzxyy.com\ngskjpt.com\ngsktraining.com\ngskwai.com\ngsl.cc\ngslbauto.com\ngslbdns.com\ngslbdns.net\ngslmw.net\ngsmpers.com\ngsmuban.com\ngsnhcg.com\ngsnytz.com\ngsp11-cn.ls.apple.com\ngsp12-cn.ls.apple.com\ngspaceteam.com\ngspst.com\ngspt.com\ngspxonline.com\ngsqstudio.com\ngsrc.com\ngsrcb.net\ngsrcu.com\ngsrcw.com\ngsrecv.com\ngsrl.net\ngsrwfyy.com\ngss56.com\ngssag.com\ngssbh.com\ngssey.com\ngsshylsh.com\ngssjyxrmyy.com\ngsskyst.com\ngssltxrmyy.com\ngsslxh.com\ngsstargroup.com\ngsstic.com\ngsstock.com\ngsstsdgs.com\ngsswtz.com\ngst-china.net\ngst.prod.dl.playstation.net\ngstarcad.com\ngsthq.com\ngstonegames.com\ngstsz.com\ngstzyyy.com\ngswjxjzx.com\ngswljt.com\ngswz.com\ngsx009.com\ngsxb.net\ngsxcdn.com\ngsxetc.com\ngsxgw.com\ngsxservice.com\ngsxtj.com\ngsyc.icu\ngsydxzyy.com\ngsysportwear.com\ngsyth.com\ngsyxjyw.com\ngsyygh.com\ngszhaopin.com\ngszlyy.com\ngszph.com\ngszq.com\ngszsc.com\ngszybw.com\ngszyi.com\ngszytcm.com\ngszyy.com\ngt-generator.com\ngt-oil.com\ngt-semi.com\ngt47xc.com\ngt520.com\ngtac.cc\ngtadata.com\ngtags.net\ngtajl.com\ngtan.com\ngtaos.com\ngtarcade.com\ngtarsc.com\ngtastart.com\ngtaxqh.com\ngtbuy.work\ngtc-power.com\ngtcedu.com\ngtcfla.net\ngtcfzp.com\ngtcim.com\ngtd-china.com\ngtder.club\ngtdgc.com\ngtdlife.com\ngtdreamlife.com\ngtdsc.com\ngter.net\ngtetern.com\ngtfund.com\ngtg56.com\ngtgqw.com\ngtgres.com\ngtht.com\ngthzc.com\ngti56.com\ngtibee.com\ngtig-esen.com\ngtig.com\ngtiggm.com\ngtimg.com\ngtinno.com\ngtja-allianz.com\ngtja.com\ngtjadev.com\ngtjaqh.com\ngtjazg.com\ngtjgzt.com\ngtjiaoyu.com\ngtjt.com\ngtk-china.com\ngtkj.tech\ngtkl.net\ngtlggy.com\ngtlrxt.com\ngtm-a1b2.com\ngtm-a1b3.com\ngtm-a1b4.com\ngtm-a1b5.com\ngtm-a1b6.com\ngtm-a1b7.com\ngtm-a1b8.com\ngtm-a1b9.com\ngtm-a2b2.com\ngtm-a2b3.com\ngtm-a2b4.com\ngtm-a2b5.com\ngtm-a2b6.com\ngtm-a2b7.com\ngtm-a2b8.com\ngtm-a2b9.com\ngtm-a3b1.com\ngtm-a3b3.com\ngtm-a3b4.com\ngtm-a3b5.com\ngtm-a3b6.com\ngtm-a3b7.com\ngtm-a3b8.com\ngtm-a3b9.com\ngtm-a4b1.com\ngtm-a4b2.com\ngtm-a4b3.com\ngtm-a4b4.com\ngtm-a4b5.com\ngtm-a4b6.com\ngtm-a4b7.com\ngtm-a4b8.com\ngtm-a4b9.com\ngtm-a5b1.com\ngtm-a5b2.com\ngtm-a5b3.com\ngtm-a5b4.com\ngtm-a5b5.com\ngtm-a6b1.com\ngtm-a6b2.com\ngtm-a6b3.com\ngtm-a6b4.com\ngtm-citycloud.com\ngtm-host.com\ngtm-i1d1.com\ngtm-i1d2.com\ngtm-i1d6.com\ngtm-i1d7.com\ngtm-i1d8.com\ngtm-i1d9.com\ngtm-i2d3.com\ngtm-i2d4.com\ngtm-i2d6.com\ngtm-i2d8.com\ngtm-i2d9.com\ngtm-we.com\ngtm.pub\ngtmlufax.com\ngtmsh.com\ngtn9.com\ngtobal.com\ngtphotonics.com\ngtpso.com\ngtqzg.com\ngtradedata.com\ngts.work\ngtshebei.com\ngtsnzp.com\ngttctech.com\ngttxidc.com\ngtuanb.com\ngtuu.com\ngtx-sh.com\ngtxf.com\ngtxh.com\ngtxp2.com\ngtycn.net\ngtyztpt.com\ngtzlw.com\ngtzszy.com\ngtzxhk.com\ngtzxsg.com\ngtzy123.com\ngu166.com\ngu360.com\ngua123.com\nguabu.com\nguaguay.com\nguahao-inc.com\nguahao.com\nguahao114.com\nguahaoe.com\nguahaowang.com\nguaiguai.com\nguaihou.com\nguaiku.com\nguaileicp.com\nguaili.org\nguailuo.com\nguailuzi.com\nguaitao.cc\nguaixun.com\nguajibao.club\nguajibao.me\nguajibaola.com\nguakaoba.com\nguan-shi.com\nguan.com\nguan5.com\nguanaitong.com\nguance.com\nguanchangnongmu.com\nguanchao.site\nguanchiad.com\nguancibaoku.com\nguandan.com\nguandan888.com\nguandang.net\nguandata.com\nguandianle.com\nguang-yuan.com\nguang.com\nguangbali.com\nguangbao-uni.com\nguangbo.net\nguangbogroup.com\nguangcimh.com\nguangdamr.com\nguangdauser.com\nguangdianyun.tv\nguangdiu.com\nguangdong-hotel.com\nguangdong1039.com\nguangdonggames.com\nguangdonglianxing.com\nguangdonglong.com\nguangdongrc.com\nguangdongtaiji.com\nguangdongtianxi.com\nguangdongwater.com\nguangdongyunchen.com\nguangdv.com\nguangfan.com\nguangfeng.com\nguangfulingyuan.com\nguanggao.com\nguanghan-marathon.com\nguanghe.tv\nguanghuayigou.com\nguanghui.com\nguangjie5u.com\nguangjieba.com\nguangjiela.com\nguangjinghb.com\nguangjipharm.com\nguangjiubusiness.com\nguangjiucompany.com\nguangju123.com\nguangjuke.com\nguangka.com\nguangkatf.com\nguangli88.com\nguanglikou.com\nguanglilvyuan.com\nguanglingroup.com\nguanglongsoft.com\nguangming.com\nguangmintou.com\nguangnengquan.com\nguangraoluntan.com\nguangruijixie.com\nguangsai.cc\nguangshaxy.com\nguangshenghang.com\nguangsuan.com\nguangsuss.com\nguangte-ne.com\nguangtuikeji.com\nguanguigroup.com\nguanguser.com\nguangwaifu.com\nguangwei.com\nguangxi910.com\nguangxibiaoxie.com\nguangxicarbon.com\nguangxichunhui.com\nguangxigames.com\nguangxiguozhi.com\nguangxihaihui.com\nguangxihongji.com\nguangxijiazhi.com\nguangxijinhang.com\nguangxilindakejimeiliyaoshang.com\nguangxilonghua.com\nguangxima.com\nguangximinhang.com\nguangxinengyuan.com\nguangxipubeihuaheng.com\nguangxircw.com\nguangxishangfu.com\nguangxishuizhiyangzhigongsi.com\nguangxisichujiadao.com\nguangxixinchan.com\nguangxixinyan.com\nguangxixinyuwanzixun.com\nguangxiyijie.com\nguangxizbq.com\nguangxizhonghui.com\nguangxizhutingqi.com\nguangxunsd.com\nguangya-group.com\nguangyapan.com\nguangyi.net\nguangyinghj.com\nguangyuancare.com\nguangyuangroup.com\nguangyuanjt.com\nguangyuanmarathon.com\nguangyuhb.com\nguangyv.com\nguangzhitui.com\nguangzhou-logistics.com\nguangzhou-marathon.com\nguangzhouamc.com\nguangzhoudazhong.com\nguangzhougy.com\nguangzhouxiehe.com\nguangzhouyibo.com\nguangzhouzaiyu.com\nguangzhuiyuan.com\nguangzizai.com\nguanhaiwei.com\nguanhaobio.com\nguanhejx.com\nguanhou.com\nguanhoulz.com\nguanhuaju.com\nguanjiajf.com\nguanjunjg.com\nguankou.net\nguanlannet.com\nguanli360.com\nguanlixi.com\nguanliyun.com\nguanmeikj.com\nguannews.com\nguanngxu.com\nguanpark.com\nguanpindiaosu.com\nguanquanapp.com\nguanrenjiaoyu.com\nguanshanbaodian.com\nguanshang1998.com\nguanshangyu.cc\nguanshenggz.com\nguansong.com\nguansre.com\nguantao.com\nguanting.com\nguanvip8.com\nguanwang.cc\nguanwang.com\nguanwangbao.com\nguanwangdaquan.com\nguanwangshijie.com\nguanwangyun.com\nguanwuxiaoer.com\nguanxf.com\nguanxian.org\nguanxiaokai.com\nguanxingyule.com\nguanxingyun.com\nguanxintec.com\nguanxxg.com\nguanyezipper.com\nguanyierp.com\nguanyinshan.com\nguanyiyun.com\nguanzhongrc.com\nguanzhu.mobi\nguanzhulian.com\nguanzhunet.com\nguanziheng.com\nguapaijia.com\nguardease.com\nguardrailchina.com\nguatedu.com\nguatuwang.com\nguazhuan.com\nguazi-apps.com\nguazi.com\nguazi.net\nguazi75637736.cc\nguazipai.com\nguazistatic.com\nguazixs.com\nguba.com\nguba163.com\ngubaike.com\ngubo.org\ngucciblog.net\nguccistar.com\ngucheng.com\nguchengnews.com\nguchengxiangye.com\ngucihand.com\ngucn.com\ngucunpark.net\ngudeapp.com\ngudemanage.com\ngudianwenxue.com\ngudongtech.com\ngufengmh9.com\ngufenxueshu.net\ngug66.com\ngugeapps.net\ngugexs.com\ngugezg.com\ngugong.net\ngugu.fun\ngugu5.com\ngugu6.com\ngugud.com\ngugudang.com\nguguread.com\ngugushuzi.com\nguguyu.com\nguguyun.com\nguguyuyin.com\nguguzhu.com\nguhantai.com\nguhei.net\nguheshuyuan.com\nguhuozaiol.com\ngui333.com\ngui66.com\nguibi.com\nguicaiyun.com\nguichanghj.com\nguichuideng.com\nguichuxing.com\nguidecari.com\nguidechem.com\nguideir.com\nguideofsh.com\nguiderank-app.com\nguifan.cc\nguifancha.com\nguifanku.com\nguifeng.net\nguifun.com\nguigang688.com\nguigu.org\nguigushi2.com\nguihaikj.com\nguihejr.com\nguihua.com\nguihuangfood.com\nguihuayun.com\nguiji.com\nguijingchina.com\nguijinshu.com\nguijitech.com\nguijob.com\nguikai888.com\nguikangmaterials.com\nguikuan.com\nguilinaohu.com\nguilincyjt.com\nguilinhd.com\nguilinhengda.com\nguilinihg.com\nguilinjiaqi.com\nguilinjizhuangxiang.com\nguilinlife.com\nguilinlv.com\nguilinoutdoor.com\nguilinpharma.com\nguilinruntai.com\nguilinsongyu.com\nguilintianhu.com\nguilintravel.com\nguilinzhiyuan.com\nguiluohuang.com\nguimamuye.com\nguimengjob.com\nguimengning.com\nguimengshangeng.com\nguinsoft.com\nguipeibao.com\nguipin.com\nguiqingkeji.com\nguiqv.com\nguirong.com\nguiscn.com\nguishangtong.com\nguishanhotel.com\nguishequ.com\nguisteel.com\nguitan.com\nguitang.com\nguitang.fun\nguitarpro.cc\nguitarq.com\nguitongmy.com\nguitu18.com\nguiwang.org\nguiweilian.com\nguixiaozi.com\nguixue.com\nguiyangmarathon.com\nguiyingclub.net\nguiyuhuanbao.com\nguiyuntai.com\nguizeco.com\nguizheng.net\nguizhenghe.com\nguizhenwei.com\nguizhougames.com\nguizhougas.com\nguizhoushengyang.com\nguizhutanglao.com\ngujianba.com\ngujing.com\ngujinshici.com\ngujiushu.com\ngujiyx.com\ngukaculture.com\ngukaifu.com\ngukaihu.com\ngukun.com\ngulandscape.com\nguliem.com\ngulinglong.com\ngulinrongmei.com\ngullmap.com\ngulltour.com\ngulongbbs.com\ngulove.com\ngulu.tv\ngulu001.com\ngulugj.com\ngululu.com\nguluyou.com\ngumade.com\ngumang.com\ngumaor.com\ngumeng.net\ngumiji.com\ngumingnc.com\ngumo.pro\ngumodels.com\ngumpmall.com\ngundambattle.com\ngunshitech.com\ngunsuo.com\nguo-kai.com\nguo7.com\nguo98.com\nguoad.com\nguoanaz.com\nguoanclub.com\nguoanele.com\nguoanqi.com\nguoanwine.com\nguoaoqiyuan.com\nguobaihui.com\nguobaoyou.com\nguobiao99.com\nguobiaotest.com\nguobin120.com\nguoboshi.com\nguocaipps.com\nguocaiqinghai.com\nguocar.com\nguochaos.com\nguocool.com\nguocuijingju.com\nguodashi.com\nguodatzjt.com\nguodegang.org\nguodi.net\nguodiana.com\nguodingnet.com\nguodongbaohe.com\nguodongtech.com\nguodongtechnology.com\nguodouw.com\nguodu.com\nguodu.hk\nguodushidai.com\nguofanglab.com\nguofen.com\nguofenchaxun.com\nguofenchaxun.net\nguofeng.com\nguofenkong.com\nguogongxin.com\nguoguangmold.com\nguoguo-app.com\nguoguojie.com\nguohanlawfirm.com\nguohaokeji.com\nguohongxin.com\nguohu360.com\nguohua88.com\nguohuapharm.com\nguohuarf.com\nguohuayule.com\nguoing.com\nguoji.biz\nguoji.pro\nguojiang.tv\nguojianglive.com\nguojiayikao.com\nguojiayixuekaoshi.com\nguojiazhiyezige.com\nguojidaigou.com\nguojiexpress.com\nguojijinjia.com\nguojimami.com\nguojing-tech.com\nguojiseka.com\nguojiwuye.com\nguojixiao.com\nguojixuexiao.net\nguojixuexiao.org\nguojiyujiaxueyuanzongbu.com\nguojizhanlanhui.com\nguojj.com\nguojusoft.com\nguokang.com\nguokelonghui.com\nguoketest.com\nguokeyun.com\nguokongqixie.com\nguokr.com\nguokr.io\nguokr.net\nguoku.com\nguolaiwanba.com\nguolan.com\nguolannewmaterial.com\nguole.fun\nguoli.com\nguolianchem.com\nguolianglab.org\nguolin.tech\nguolisec.com\nguolong365.com\nguolongplastic.com\nguoluonews.com\nguolv.com\nguolv.net\nguomai.cc\nguomaoreducer.com\nguomeijiayuanxiaoxue.com\nguomeikuaidi.com\nguomiaokeji.com\nguomin999.com\nguominpension.com\nguomob.com\nguomu.com\nguoocang.com\nguopeiwang.com\nguopika.com\nguoping123.com\nguopop.tech\nguoqi.org\nguoqi365.com\nguoqinwang.com\nguorongfei.com\nguoruijx.com\nguoshengtech.com\nguoshi.com\nguosujt.com\nguotaijsh.com\nguotailiangyou.com\nguotangauto.com\nguotongglobal.com\nguoturen.com\nguotv.com\nguowai.org\nguoweijt.com\nguoweistem.com\nguoweitong.com\nguowuwushu.com\nguoxiehao.com\nguoxikonggu.com\nguoxinbj.com\nguoxinlanqiao.com\nguoxinmac.com\nguoxinqh.com\nguoxintek.com\nguoxue.com\nguoxue123.com\nguoxuedashi.com\nguoxuemeng.com\nguoxuemi.com\nguoxuwang.com\nguoyang.cc\nguoyang.work\nguoyangtech.com\nguoyc.online\nguoyice.com\nguoyihuake.com\nguoyitang.org\nguoyu.com\nguoyu.link\nguoyue.games\nguoyuegroup.com\nguoyuejituan.com\nguoyunjc.com\nguoyusec.com\nguoyutec.com\nguozaoke.com\nguozh.net\nguozhangroup.com\nguozhanjiaoyu.com\nguozhen.net\nguozhenyi.com\nguozhivip.com\nguozhuan.com\nguozhuangxincai.com\nguozi.org\nguoziyx.com\nguozucq.org\ngupang.com\ngupaoedu.com\ngupei.com\ngupen.com\ngupiao135.com\ngupiao168.com\ngupiao8.com\ngupiaoq.com\ngupiaowajue.com\ngupowang.com\ngupt.net\ngupuu.com\ngupzs.com\nguqiankun.com\nguqiu.com\nguqu.net\nguronge.com\ngurukeji.com\ngurun.cc\ngushengwang.com\ngushequ.com\ngushi.ci\ngushi.com\ngushi160.com\ngushi365.com\ngushiai.com\ngushici.com\ngushicimingju.com\ngushidaquan.cc\ngushidi.com\ngushiji.cc\ngushiju.net\ngushiwen.org\ngusspro.com\ngusucaishui.com\ngusuwang.com\nguteke.com\ngutlighting.com\ngutou.com\ngutousoft.com\ngutx.org\nguwan.com\nguwantj.com\nguweimin.com\nguwendao.net\nguwenxs.com\nguwenxuexi.com\nguwu121.com\nguxiang.com\nguxunw.com\nguyizisha.com\nguyuehe.com\nguyuehome.com\nguyuenglish.com\nguyungame.com\nguzhang.com\nguzhangting.com\nguzhenm.com\nguzhongtrade.com\nguzuci.com\nguzwiayz.com\ngvg-redsun.com\ngvgoo.com\ngvi-tech.com\ngvlocalization.com\ngvoiceplat.com\ngvt1-cn.com\ngvt2-cn.com\ngw-dv.vip\ngw-ec.com\ngw.craft.moe\ngw4.cc\ngw66.vip\ngw7jpuouik.com\ngwacoe.com\ngwamcc.com\ngwauto.com\ngwbfc.com\ngwblighting.com\ngwc.net\ngwcdncloud.com\ngwdang.com\ngwdqsb.com\ngwdzkj.com\ngweike.com\ngwell.cc\ngwenorcasv1.com\ngwepy.org\ngwetech.com\ngwfls.com\ngwfx.net\ngwgl168.com\ngwgsc.com\ngwi.cc\ngwidc.com\ngwin-cn.com\ngwinbody.com\ngwjakzzx.com\ngwjinan.com\ngwm-global.com\ngwmapp-h.com\ngwmapp-w.com\ngwmfc.com\ngwmmarathon.com\ngwmsoft.com\ngwnsxx.com\ngwnz.com\ngworg.com\ngwozai.com\ngwpdi.com\ngwpp.net\ngwpstools.com\ngwrcw.com\ngwsdns.com\ngwtt.com\ngwvpsceping.com\ngwwg.com\ngwxeda.com\ngwy.com\ngwyclass.com\ngwyoo.com\ngwyou.com\ngwypxw.com\ngwysydw.com\ngwyzk.com\ngwyzwb.com\ngwzft.com\ngwzhinan.com\ngwzwfw.com\ngwzyxh.com\ngx-antai.com\ngx-aozhan.com\ngx-biosensor.com\ngx-ds.net\ngx-etrans.com\ngx-hengyuan.com\ngx-hm.com\ngx-lc.com\ngx-newmedia.com\ngx-royalpartners.com\ngx-stbd.com\ngx-wl.com\ngx-xc.com\ngx-xjyx.com\ngx-yidaiyilu.com\ngx-zy.com\ngx10010.com\ngx121.com\ngx12333.net\ngx12580.net\ngx163.com\ngx1g.com\ngx3j.net\ngx4485.com\ngx5127.com\ngx516.com\ngx51766.com\ngx5f.com\ngx79.com\ngx81jxzl.com\ngx966888.com\ngxaas.net\ngxabd.net\ngxacjs.com\ngxacto.com\ngxadt.com\ngxadwh.com\ngxaedu.com\ngxahjy.com\ngxaids.com\ngxairlines.com\ngxaist.com\ngxaixier.com\ngxalt.com\ngxanchen.com\ngxankao.com\ngxantu.com\ngxany.com\ngxaoma.com\ngxar.com\ngxarl.com\ngxasjc.com\ngxasjn.com\ngxawjmy.com\ngxaxjy.com\ngxaxpc.com\ngxayn.com\ngxb.io\ngxbaichen.com\ngxbaidu.net\ngxbaidutg.com\ngxbaifugch.com\ngxbaikuang.com\ngxbakj.com\ngxbaozhiyue.com\ngxbasic.com\ngxbbwsw.com\ngxbbwyl.com\ngxbcf.com\ngxbcgjg.com\ngxbcjc.com\ngxbckj.com\ngxbdcx.com\ngxbdtx.com\ngxbeiente.com\ngxbest.xyz\ngxbeyy.com\ngxbf.net\ngxbgdl.com\ngxbgtf.com\ngxbhgas.com\ngxbhjg.com\ngxbhlg.com\ngxbhly.net\ngxbian.com\ngxbiandao.com\ngxbidding.com\ngxbihongkeji.com\ngxbinhai.com\ngxbiyang.com\ngxblfs.com\ngxbltz.com\ngxbml.com\ngxbmmy.com\ngxbngs.com\ngxbochi.com\ngxboning.com\ngxbotlan.com\ngxbqba.com\ngxbqkj.com\ngxbr668.com\ngxbre.com\ngxbrm.com\ngxbs.net\ngxbscbh.com\ngxbsfj.com\ngxbsky.com\ngxbsnx.com\ngxbssyy.com\ngxbstlxx.com\ngxbsyjsw.com\ngxbtjt.com\ngxbtka.com\ngxbtnz.com\ngxbtsc.com\ngxbtsy.com\ngxbtxc.com\ngxbygs.com\ngxbyjxc.com\ngxbykj.com\ngxbyrcb.com\ngxbys.com\ngxbyw.com\ngxbyx.com\ngxbzjx.com\ngxcae.com\ngxcaining.com\ngxcaiyiduo.com\ngxcampus.com\ngxcards.com\ngxcareer.com\ngxcast.com\ngxcatv.com\ngxcbjs.com\ngxcbljt.com\ngxccblg.com\ngxccedu.com\ngxccjt.com\ngxcd.pw\ngxcdc.com\ngxceg.com\ngxcei.com\ngxcerc.com\ngxcexxzx.com\ngxcfjx.com\ngxcgmf.com\ngxcgzh.com\ngxch168.com\ngxchanghe.com\ngxchangjiangpn-jinnuo.com\ngxchbf.com\ngxchem.com\ngxchengjian.com\ngxchengmei.com\ngxchengyun.com\ngxchlrf.com\ngxchr.com\ngxchuanghua.com\ngxchuanlan.com\ngxchuen.com\ngxchunmao.com\ngxchuxin.com\ngxcic.net\ngxcimc.com\ngxcj.cc\ngxcj.net\ngxcjcl.com\ngxcjgt.cc\ngxcjn.com\ngxcjtc.com\ngxclkj.com\ngxclzz.com\ngxcmgr.com\ngxcmicc.com\ngxcncec.com\ngxcnjx.com\ngxcodemaker.com\ngxcors.com\ngxcounty.com\ngxcpa.com\ngxcq188.com\ngxcqm.com\ngxcr.cc\ngxcrcw.com\ngxcrh.net\ngxcrjm.com\ngxcro.com\ngxcrzxgs.com\ngxcschem.com\ngxcscm.com\ngxcsfc.com\ngxcskj.com\ngxcsmed.com\ngxcsmx.com\ngxcsqj.com\ngxcsycj.com\ngxcsypm.com\ngxcszm.com\ngxctc.net\ngxctd.com\ngxcthb.com\ngxcti.com\ngxctzb.com\ngxcuiping.com\ngxcvuedu.com\ngxcw.com\ngxcxhb.com\ngxcxxny.com\ngxcxyx.com\ngxcyaq.com\ngxcyhjt168.com\ngxcyzs.com\ngxcz88.com\ngxczm.com\ngxcznews.com\ngxcznews.net\ngxczrc.com\ngxdadu.com\ngxdairy.com\ngxdajin.com\ngxdajixiong.com\ngxdake.com\ngxdanbao.com\ngxdangan.com\ngxdansi.com\ngxdanzo.com\ngxdaos.com\ngxdaosheng.com\ngxdbdl.com\ngxdbxrmyy.com\ngxdco.net\ngxdcwh.com\ngxddcs.com\ngxddtz.com\ngxddzl.com\ngxdegas.com\ngxdetdq.com\ngxdfjt.com\ngxdfzx.com\ngxdhgy.com\ngxdhhb.com\ngxdhyy.com\ngxdiba.com\ngxdicai.com\ngxdig.com\ngxdingyi.com\ngxdingyu.com\ngxdkjmy.com\ngxdkyr.net\ngxdljz.com\ngxdltech.com\ngxdlxy.com\ngxdlzl.com\ngxdmds.com\ngxdmsq.com\ngxdmtrade.com\ngxdmw.com\ngxdna.com\ngxdnu.com\ngxdong.com\ngxdongce.com\ngxdongfangshi.com\ngxdonghong.com\ngxdongkai.com\ngxdoulaibo.com\ngxdqtg.com\ngxdrh.com\ngxds1.com\ngxdse.com\ngxdslyy.com\ngxdslyyls.com\ngxdsoms.com\ngxdsxf.com\ngxdsyl.com\ngxdtchem.com\ngxdtiot.com\ngxdtjl.com\ngxdtsc.com\ngxdunshen.com\ngxduomeishi.com\ngxduyi.com\ngxdx5.com\ngxdxbj.com\ngxdxcredit.com\ngxdxdt.com\ngxdxjs.com\ngxdxlk.com\ngxdxlxs.com\ngxdycpa.com\ngxdygs.com\ngxdygx.com\ngxdyxjd.com\ngxdyyj.com\ngxea.com\ngxeaq.com\ngxecard.com\ngxecm.com\ngxeduyun.net\ngxegoo.com\ngxehy.com\ngxeits.com\ngxej.net\ngxelang.com\ngxenews.com\ngxeph.com\ngxept.com\ngxeqjx.com\ngxeqx.com\ngxer.net\ngxeszx.com\ngxevc.com\ngxewa.com\ngxfag.com\ngxfaj.com\ngxfanghu.com\ngxfanlian.com\ngxfanlu.com\ngxfanxing.com\ngxfanyayoga.com\ngxfcq.com\ngxfcw.com\ngxfengjie.com\ngxfenglei.com\ngxfengxingjq.com\ngxffjt.com\ngxfhjs.com\ngxfhny.com\ngxfhxx.com\ngxfi.net\ngxfigroup.com\ngxfin.com\ngxfinfr.com\ngxfjly.com\ngxflm.com\ngxflpg.com\ngxfls.com\ngxflzx.com\ngxfm.net\ngxfmmy.com\ngxfnt.com\ngxforestry.com\ngxfrhb.com\ngxfsms.com\ngxfssy.com\ngxfsty.com\ngxfswl.com\ngxfsxrmyy.com\ngxfsyljt.com\ngxftu.org\ngxfushun.com\ngxfusui.com\ngxfuxue.com\ngxfuyuan.com\ngxfxhjwy.com\ngxfxly.com\ngxfxm.com\ngxfxwh.com\ngxfxzb.com\ngxfybj.com\ngxfygp.com\ngxfysteel.com\ngxfyzx.com\ngxfzf.com\ngxfzkkj.com\ngxfzpg.com\ngxfzyjs.com\ngxg1978.com\ngxgaia.com\ngxgangji.com\ngxgangxin.com\ngxgangyuan.com\ngxganhua.com\ngxgaoling.com\ngxgaotong.com\ngxgaoyao.com\ngxgaoyou.com\ngxgaty.com\ngxgba.com\ngxgbdb.com\ngxgbkj.com\ngxgbx.com\ngxgcedu.com\ngxgcfscl.com\ngxgcjs.com\ngxgczxjt.com\ngxgd192.com\ngxgdbg.com\ngxgdhg.com\ngxgdlsp.com\ngxgdpg.com\ngxgdyy.com\ngxgdyz.com\ngxgeek.com\ngxgentle.com\ngxgf.net\ngxgfsh.com\ngxggcmc.com\ngxggdq.com\ngxggfhsmy.com\ngxgghx.com\ngxggm.com\ngxghfs.com\ngxghjt.com\ngxghpg.com\ngxghyysc.com\ngxghzh.com\ngxgj.com\ngxgjgc.com\ngxgjgg.com\ngxgjh.com\ngxgjjl.com\ngxgjjt.com\ngxgjny.com\ngxgjzy.com\ngxgkzzr.com\ngxgl588.com\ngxglft.com\ngxglgcjs.com\ngxglhd.com\ngxglhx.com\ngxgljhgc.com\ngxgljy.com\ngxglkg.com\ngxglnykj.com\ngxglory.com\ngxglyl.com\ngxglys.com\ngxglzj.com\ngxglzs.com\ngxgm.net\ngxgmgc.com\ngxgmjhc.com\ngxgmtx.com\ngxgndxdl.com\ngxgoldpool.com\ngxgongyinglian.com\ngxgoodfirst.com\ngxgp123.com\ngxgpo.com\ngxgpzhtc.com\ngxgqdz.com\ngxgqsn.com\ngxgrasp.com\ngxgree.com\ngxgrtech.com\ngxgryy.com\ngxgsgl.com\ngxgsgs.com\ngxgshb.com\ngxgswlhy.com\ngxgsxy.com\ngxgsyy.com\ngxgszb.com\ngxgtdg.com\ngxgtdl.com\ngxgtghy.com\ngxgttt.com\ngxgtxny.com\ngxgtzb.com\ngxgtzx.com\ngxguanghui.com\ngxguangxin.com\ngxguangyi.com\ngxguantai.com\ngxguanyu.com\ngxguerte.com\ngxguicheng.com\ngxguijiu.com\ngxguimei.com\ngxguiping.com\ngxguiren.com\ngxguirun.com\ngxguite.com\ngxguixing.com\ngxguiyang.com\ngxguizhiyuan.com\ngxguoda.com\ngxguoen.com\ngxguojian.com\ngxguojingjiuye.com\ngxguoyang.com\ngxguyu.com\ngxgwmb.com\ngxgwyw.org\ngxgxjc.com\ngxgxncplm.com\ngxgxun.com\ngxgyfy.com\ngxgyh.com\ngxgymsxx.com\ngxgyrq.com\ngxgyyclc.com\ngxgyyy.com\ngxgzlm.com\ngxgztyy.com\ngxgzy.com\ngxgzzn.com\ngxhaibao.com\ngxhalw.com\ngxhanhe.com\ngxhanlin.com\ngxhaojian.com\ngxhaorun.com\ngxhaozhi.com\ngxharui.com\ngxhb8.com\ngxhbcyxh.com\ngxhbedu.com\ngxhbs.com\ngxhc120.com\ngxhc18.com\ngxhc365.com\ngxhcht.com\ngxhclw.com\ngxhcmr.com\ngxhcnf.com\ngxhcwy.com\ngxhcyk.com\ngxhczx.com\ngxhdaf.com\ngxhddj.com\ngxhddq.com\ngxhdsy.com\ngxhealth.xin\ngxheda.com\ngxhefei.com\ngxheguan.com\ngxhengda.com\ngxheyumaoyi.com\ngxhezhixin.com\ngxhfba.com\ngxhfdqsb.com\ngxhfyy.com\ngxhg.net\ngxhghg.com\ngxhgjm.com\ngxhgkj.com\ngxhgx.net\ngxhgzb.com\ngxhgzc.com\ngxhh.com\ngxhhgc.com\ngxhhgs.com\ngxhhhb.com\ngxhhig.com\ngxhhjk.com\ngxhhjt.net\ngxhhmed.com\ngxhhzsjt.com\ngxhigreen.com\ngxhis.net\ngxhjbw.com\ngxhjjt.net\ngxhjky.com\ngxhjly.com\ngxhjsh.com\ngxhjsz.com\ngxhjwy.com\ngxhjzbcyy.com\ngxhjzx.com\ngxhkd.com\ngxhkdq.com\ngxhkdyf.com\ngxhkgy.com\ngxhkjc.com\ngxhkjt.com\ngxhl.com\ngxhlc.com\ngxhljx.com\ngxhlun.com\ngxhlx.net\ngxhly168.com\ngxhmba.com\ngxhmcm.com\ngxhmdjt.com\ngxhnyt.com\ngxhongchuan.com\ngxhonggang.com\ngxhongning.com\ngxhongshimuye.com\ngxhongyunsi.com\ngxhongzh.com\ngxhope.org\ngxhospital.com\ngxhouse.com\ngxhovi.com\ngxhpxrmyy.com\ngxhqh.com\ngxhqjy.com\ngxhqtest.com\ngxhqwh.com\ngxhqxmgl.com\ngxhrcjz.com\ngxhrkj.com\ngxhs.site\ngxhsba.com\ngxhsjgs.com\ngxhsltd.com\ngxhsry.com\ngxhsshj.com\ngxhsshjzl.com\ngxhstars.com\ngxhsxcl.com\ngxhsxxkj.com\ngxhsykj.com\ngxhszb.com\ngxhtjx.com\ngxhtl.com\ngxhtte.com\ngxhuabao.com\ngxhuachi.com\ngxhuachuang.com\ngxhuadu.com\ngxhuaen.com\ngxhuahui.com\ngxhuanbaojt.com\ngxhuaqu.com\ngxhuar.com\ngxhuaxing.com\ngxhuaxintech.com\ngxhui.com\ngxhuicuibencao.com\ngxhuifa.com\ngxhuihuang.com\ngxhuiji.com\ngxhuijvtong.com\ngxhuiming.com\ngxhuitong.com\ngxhuiwanger.com\ngxhuolong.com\ngxhxbook.com\ngxhxgg.com\ngxhxgroup.com\ngxhxh.com\ngxhxysgs.com\ngxhxyyjt.com\ngxhxzyh.com\ngxhyart.com\ngxhydq.com\ngxhyey.com\ngxhygg.com\ngxhyhs.com\ngxhykglass.com\ngxhyq.com\ngxhyscl.com\ngxhysm.com\ngxhyww.com\ngxhyxf.com\ngxhyxt.com\ngxhyz168.com\ngxhyzixun.com\ngxhyzx.net\ngxhzgjyy.com\ngxhzjsgc.com\ngxhzkj.com\ngxhzsbwg.com\ngxhzsqyg.com\ngxhztqt.com\ngxhzxk.com\ngxhzxw.com\ngxhzyd.com\ngxi.ink\ngxiang.org\ngxibvc.net\ngxic.club\ngxic.net\ngxicc.net\ngxicpa.com\ngxidc.com\ngxidi.com\ngxind.com\ngxinf.com\ngxinfo.org\ngxinfotec.com\ngxipo.net\ngxjajc.com\ngxjaw.com\ngxjbhb.com\ngxjbk.com\ngxjbyy.com\ngxjcbf.com\ngxjccj.com\ngxjch.com\ngxjckc.com\ngxjcqt.com\ngxjcxcl.com\ngxjcxy.com\ngxjcy.com\ngxjcys.com\ngxjdcb.com\ngxjdgc.com\ngxjdgczx.com\ngxjdgyxx.com\ngxjdxs.com\ngxjeyy.com\ngxjf99.com\ngxjfdz.com\ngxjfx.com\ngxjg199.com\ngxjgdj.com\ngxjgea.com\ngxjghy.com\ngxjgjjc.com\ngxjgjstzjt.com\ngxjgjt.com\ngxjgyj.com\ngxjgyjgs.com\ngxjgzcb.com\ngxjgzppc.com\ngxjhcj.com\ngxjhgczx.com\ngxjhgd.com\ngxjhgs.com\ngxjhjcw.com\ngxjhjdsb.com\ngxjhjs.com\ngxjhky.com\ngxjhsj.com\ngxjhygs.com\ngxjhzj.com\ngxjiahua.com\ngxjiangyong.com\ngxjianhong.com\ngxjianlan.com\ngxjianrong.com\ngxjianyi.com\ngxjiaohang.com\ngxjiasheng.com\ngxjiatai.com\ngxjichang.com\ngxjiebai.com\ngxjiefeng.com\ngxjien.com\ngxjigeng.com\ngxjigeyuan.com\ngxjihu.com\ngxjinan.com\ngxjingsheng.com\ngxjinhai.com\ngxjinhuiauto.com\ngxjinjiang.com\ngxjinsu.com\ngxjinsui.com\ngxjintu.com\ngxjirui.com\ngxjiufa.com\ngxjiuxincpa.com\ngxjiuyi.com\ngxjiuyi99.com\ngxjixu.com\ngxjiyu.com\ngxjjb.com\ngxjjfds.com\ngxjjfjt.com\ngxjjgy.com\ngxjjh.com\ngxjjyb.com\ngxjkamc.com\ngxjkhj.com\ngxjkjg.com\ngxjkjyjc.com\ngxjkwy.com\ngxjl99.com\ngxjla.com\ngxjlbw.com\ngxjljz.com\ngxjlkj.com\ngxjlnm.com\ngxjlrc.com\ngxjlsc.com\ngxjm.vip\ngxjmggs.com\ngxjmxx.com\ngxjmxy.com\ngxjmzg.com\ngxjnbgzx.com\ngxjowy.com\ngxjpfs.com\ngxjpjs.com\ngxjpjy.com\ngxjptw.com\ngxjqgs.com\ngxjqt.com\ngxjqyy.com\ngxjrxy.com\ngxjrzl.com\ngxjs.net\ngxjsd56.com\ngxjsfs.com\ngxjshu.com\ngxjsstjt.com\ngxjstkj.com\ngxjsws.com\ngxjsxny.com\ngxjsxszn.com\ngxjt.net\ngxjt001.com\ngxjtaq.com\ngxjtjx.com\ngxjtkyy.com\ngxjtpg.com\ngxjtsa.com\ngxjtscm.com\ngxjtsjy.com\ngxjttz.com\ngxjttzjt.com\ngxjtyab.com\ngxjtysxx.com\ngxjtzb.com\ngxjuancheng.com\ngxjub.com\ngxjugu.com\ngxjuhw.com\ngxjunan.com\ngxjunhe.com\ngxjunliang.com\ngxjxcloud.com\ngxjxsy.com\ngxjxwh.com\ngxjycjsb.com\ngxjyfdc.com\ngxjyfkj.com\ngxjygljt.com\ngxjyh.store\ngxjyhb.com\ngxjyjs168.com\ngxjyjt.com\ngxjyjz.com\ngxjyxxw.com\ngxjyy.com\ngxjyzl.com\ngxjyzyw.com\ngxjz123.com\ngxjzcy.com\ngxjzdt.com\ngxjzht.com\ngxjzhxd.com\ngxjzj-hotel.com\ngxjzj.com\ngxjzjc.com\ngxjzjl.com\ngxjznet.com\ngxjzw12315.com\ngxjzy.com\ngxjzzbdl.com\ngxkaifan.com\ngxkangtian.com\ngxkaoba.com\ngxkcjc.com\ngxkcmy119.com\ngxkdefy.com\ngxkdjc.com\ngxkdjd.com\ngxkdjsq.com\ngxkefei.com\ngxkehong.com\ngxkelite.com\ngxkesui.com\ngxkfl.com\ngxkfy.com\ngxkhjt.com\ngxkhkj.com\ngxkhn.com\ngxkhxxcl.com\ngxkiwi.com\ngxkjd.com\ngxkjdns.com\ngxkjdsj.com\ngxkjec.com\ngxkjhb.com\ngxkjjt.com\ngxkjl.com\ngxkjs.com\ngxkjzy.com\ngxkl.com\ngxkld.com\ngxklyy.com\ngxkmkny.com\ngxkongshan.com\ngxkorbel.com\ngxkqjt.com\ngxkqty.com\ngxkrqz.com\ngxkrui.com\ngxkrx.com\ngxkrzc.com\ngxksdl.com\ngxksdt.com\ngxksjx.net\ngxksxf.com\ngxktdl.com\ngxktzk.com\ngxktzx.com\ngxkunzhen.com\ngxkyjc.com\ngxkzxx.com\ngxlanbowang.com\ngxlanco.com\ngxlancogroup.com\ngxlanlian.com\ngxlansheng.com\ngxlbang.com\ngxlbbwg.com\ngxlbgf.com\ngxlbi.com\ngxlbzszy.com\ngxlcclean.com\ngxlcgy.com\ngxlcjsjt.com\ngxlclsyf.com\ngxlcpp.com\ngxlcwater.com\ngxlcxs.com\ngxld168.com\ngxlddq.com\ngxldgjgpj.com\ngxldjs.com\ngxldpc.com\ngxldzn.com\ngxlecheng.com\ngxlek.com\ngxlelin.com\ngxlfzl.com\ngxlgwl.com\ngxlgxx.com\ngxlh168.com\ngxlhcx.com\ngxlhgjg.com\ngxlhhb.com\ngxlhjc.com\ngxlhxn.com\ngxlianci.com\ngxliangjian.com\ngxliangla.com\ngxlianguan.com\ngxliangyun.com\ngxlianye.com\ngxlianying.com\ngxlib.com\ngxlihua.com\ngxlimu.com\ngxliri.com\ngxlituo.com\ngxliuhang.com\ngxliuqiaojidian.com\ngxlixin.com\ngxliyugs.com\ngxljgc.com\ngxljh.com\ngxljjt.com\ngxljjz.com\ngxljxs.com\ngxlk.net\ngxlke.com\ngxlkjy.com\ngxlkl.net\ngxllcb.com\ngxllsw888.com\ngxllxl.com\ngxlmjt.com\ngxlmzs.com\ngxlongfa.com\ngxlonsen.com\ngxlove.vip\ngxlqgcy.com\ngxlqjs.com\ngxlqkg.com\ngxlqsd.com\ngxlryl.com\ngxlscf.com\ngxlsfy.com\ngxlsfz.com\ngxlsnm.com\ngxlstc.com\ngxlswhg.com\ngxltbaoan.com\ngxlteng.com\ngxltgjg.com\ngxltjj.com\ngxltm.com\ngxltmyjt.com\ngxltzy.com\ngxluhai.com\ngxlulian.com\ngxluogui.com\ngxluyun.com\ngxlvjian.com\ngxlvtong.com\ngxlvwang.com\ngxlwdsslgy.com\ngxlwlc.com\ngxlwt.com\ngxlxgg.com\ngxlxs2008.com\ngxlxs2008.net\ngxlxsn.com\ngxlxxl.com\ngxlxyun.com\ngxly66.com\ngxlyb.com\ngxlycq.com\ngxlycs.com\ngxlycwb.com\ngxlycyxh.com\ngxlyghy.com\ngxlygyl.com\ngxlyhbkj.com\ngxlyjt.com\ngxlzbbw.com\ngxlzck.com\ngxlzdyc.com\ngxlzgcc.com\ngxlzgdjt.com\ngxlzhm.com\ngxlzlk.com\ngxlzpc.com\ngxlzsh.com\ngxlzsmk.com\ngxlztz.com\ngxlzwl.com\ngxlzxrmyy.com\ngxlzxt.com\ngxlzzc.com\ngxlzzh.net\ngxma123.com\ngxmacc.com\ngxmailu.com\ngxmanyy.com\ngxmaocai.com\ngxmbh.com\ngxmbs.com\ngxmdgroup.com\ngxmdjt.com\ngxmeiao.com\ngxmeiduo.com\ngxmeike.com\ngxmetalking.com\ngxmggg.com\ngxmiao.com\ngxmiaoshu.com\ngxminglian.com\ngxmingshi.com\ngxmj.org\ngxmjyy.com\ngxmjzs.com\ngxmk.net\ngxmlba.com\ngxmlyjy.com\ngxmmhgs.com\ngxmmkt.com\ngxmoking.com\ngxmqhb.com\ngxmscbs.com\ngxmsg.com\ngxmsgy.com\ngxmtzn1658.com\ngxmuch.com\ngxmuwmfy.com\ngxmuyfy.com\ngxmuzi.com\ngxmxc.com\ngxmxin.com\ngxmyjc.com\ngxmykj.com\ngxmylink.com\ngxmytzsn.com\ngxmzb.net\ngxmzcl.com\ngxmzjwy.com\ngxmzkj.com\ngxmzly.com\ngxmznzs.com\ngxnantong.com\ngxnapd.com\ngxnbjc.com\ngxnccq.com\ngxncgd.com\ngxnctzjt.com\ngxndcxswyxgs.com\ngxnddq.com\ngxndgg.com\ngxnewen.com\ngxnfxny.com\ngxnfyk.com\ngxnhjk.com\ngxnjqj.com\ngxnjsy.com\ngxnjy.com\ngxnjzj.com\ngxnk.com\ngxnkjgnc.com\ngxnkxjry.com\ngxnkyy.com\ngxnkyy.net\ngxnmkj.com\ngxnmzj.com\ngxnncj.com\ngxnnclt.com\ngxnndghb.com\ngxnnedu.com\ngxnnfx.com\ngxnnhexiexinli.com\ngxnnip.com\ngxnnjn.com\ngxnnjqgg.com\ngxnnjw.com\ngxnnkfzx.com\ngxnnks.com\ngxnnlsz.com\ngxnnlyd.com\ngxnnmudz.com\ngxnnncp.com\ngxnnsdyy.com\ngxnnsmfbl.com\ngxnnsy.com\ngxnntfx.com\ngxnnthch.com\ngxnntn.com\ngxnnws.com\ngxnnxny.com\ngxnnybskq.com\ngxnnyihui.com\ngxnnyxjx.com\ngxnnzj.com\ngxnongmu.com\ngxnpzbx.com\ngxnsjt.com\ngxntjz.com\ngxnumba.com\ngxnun.net\ngxnwjt.com\ngxnxdb.com\ngxnxgd.com\ngxnydq.com\ngxnymt.com\ngxnzjz.com\ngxnzzy.com\ngxoc168.com\ngxoem.com\ngxok.com\ngxosjc.com\ngxota.com\ngxota.net\ngxoulian.com\ngxouwen.com\ngxp.cc\ngxp2.com\ngxpanda.com\ngxpangbo.com\ngxpbs.com\ngxpeh.com\ngxpfyy.com\ngxpgfood.com\ngxpgft.com\ngxpggj.com\ngxpghj.com\ngxphc.com\ngxphd.com\ngxphj.com\ngxpingen.com\ngxpinn.com\ngxpjzs.com\ngxpljt.com\ngxpnzp.com\ngxpost.com\ngxppw.com\ngxptids.com\ngxptkc.com\ngxptyy.com\ngxpu.com\ngxpuyi.com\ngxpxdj.com\ngxpykj.com\ngxqcjs.com\ngxqcw.com\ngxqddfxf.com\ngxqdkj.com\ngxqfjzzs.com\ngxqgjx.com\ngxqgps.com\ngxqhcm.com\ngxqhjc.com\ngxqhtec.com\ngxqianhan.com\ngxqianrong.com\ngxqianshuo.com\ngxqianyuan.com\ngxqiba.com\ngxqihu.com\ngxqihuan.com\ngxqingchang.com\ngxqintang.com\ngxqiyang.com\ngxqiyuan.com\ngxqkcm.com\ngxqljt.com\ngxqllc.com\ngxqmk.com\ngxqnjc.com\ngxqqxcl.com\ngxqrhb.com\ngxqrjy.com\ngxqs.org\ngxqszl.com\ngxqtgroup.com\ngxqtszxc.com\ngxqyjy.com\ngxqykj.com\ngxqymc.com\ngxqymy.com\ngxqzdx.com\ngxqzez.com\ngxqzfz.com\ngxqzk.com\ngxqzrc.com\ngxqzrm.com\ngxqztv.com\ngxqztz.net\ngxqzxjh.com\ngxqzxw.com\ngxqzxyd.com\ngxqzyz.com\ngxqzzy.com\ngxrasafety.com\ngxrayhome.com\ngxrc.com\ngxrcda.com\ngxrcgs.com\ngxrcosta.com\ngxrcpx.com\ngxrcw.com\ngxrcyj.com\ngxrczc.com\ngxrdgroup.com\ngxrdjy.com\ngxrenheng.com\ngxrfys.com\ngxrgjd.com\ngxrgwl.com\ngxrhdl.com\ngxrijia.com\ngxrjf.com\ngxrjyy.com\ngxrkyy.com\ngxrmzs.com\ngxrnzb.com\ngxroad.com\ngxrongpin.com\ngxrongwang.com\ngxrqsjhz.com\ngxrsjc.com\ngxrskyy.com\ngxrsmllab.com\ngxrtbtc.com\ngxruiheng.com\ngxruipai.com\ngxruizhen.com\ngxrunteng.com\ngxrxdt.com\ngxrxsy.com\ngxrxsyjz.com\ngxrygc.com\ngxrzd.com\ngxrzgczx.com\ngxsad.net\ngxsag.com\ngxsailian.com\ngxsanchuan.com\ngxsanleng.com\ngxsanli.com\ngxsanyo.com\ngxsbcj.com\ngxsbfdc.com\ngxsbzz.com\ngxsc88.com\ngxscbxg.com\ngxsccl.com\ngxscjn.com\ngxscjx.com\ngxsckj.net\ngxscq.com\ngxscse.com\ngxscsw.com\ngxsd.net\ngxsdem.com\ngxsdpx.com\ngxsdy.com\ngxseal.com\ngxsejy.com\ngxsell.com\ngxsenge.net\ngxsenhao.com\ngxsenzhou.com\ngxsfcm.com\ngxsfht.com\ngxsfjd.com\ngxsgcgpt.com\ngxsgip.com\ngxsgys.com\ngxshangbeng.com\ngxshangjia.com\ngxshanglong.com\ngxshangyou.com\ngxshanyixing.com\ngxshbs.com\ngxshck.com\ngxshdl.com\ngxshebei.com\ngxshenglu.com\ngxshengwei.com\ngxshenyi.com\ngxshgk.com\ngxshile.com\ngxshiteng.com\ngxshixinde.com\ngxshizhi.com\ngxshjy.com\ngxshjz.com\ngxshny.com\ngxshoufeng.com\ngxshouji.com\ngxshtf.com\ngxshua.com\ngxshuairun.com\ngxshudao.com\ngxshuibao.com\ngxshuixie.com\ngxshunxiu.com\ngxshxc.com\ngxshxf.com\ngxshxlpx.com\ngxshyy.com\ngxshz01.com\ngxshzyzs.com\ngxsika.com\ngxsilk.com\ngxsjc.com\ngxsjgs.com\ngxsjmilk.com\ngxsjmy.com\ngxsjsd.com\ngxsjtz.com\ngxsjwh.com\ngxskf.com\ngxsksw.com\ngxsksy.com\ngxsl.com\ngxslbj.com\ngxslcc.com\ngxslyj.com\ngxslyy.com\ngxsme.net\ngxsmkt.com\ngxsngc.com\ngxsntp.com\ngxsnzw.com\ngxspas.com\ngxspri.com\ngxsrkj.com\ngxsrtz.com\ngxsrwl.com\ngxsrxlzxyxzrgs.com\ngxssjz.com\ngxssmg.com\ngxssrs.com\ngxstarship.com\ngxstd.com\ngxsthb.com\ngxsthnt.com\ngxstkw.com\ngxstzx.com\ngxsubat.com\ngxsuda.com\ngxsunwin.com\ngxsut.com\ngxsuyun.com\ngxswgd.com\ngxswsw.com\ngxswzps.com\ngxsxbj.com\ngxsxhw.com\ngxsy.org\ngxsycpa.com\ngxsydg.com\ngxsygg.com\ngxsyh.com\ngxsyzs.com\ngxszf.net\ngxszgp.com\ngxszjf.com\ngxszjk.com\ngxszyy.com\ngxtagrm.com\ngxtaiping.com\ngxtaishi.com\ngxtaiyinuo.com\ngxtalc.com\ngxtangmi.com\ngxtcdpp.com\ngxtckj.com\ngxtcq.com\ngxtcsys.com\ngxtdg.com\ngxtenger.com\ngxtengsong.com\ngxtesjy.com\ngxtfgg.com\ngxtfmy.com\ngxtfxx.com\ngxthcpa.com\ngxthxxkj.com\ngxthyy.com\ngxtianmiao.com\ngxtianpin.com\ngxticket.com\ngxtizi.com\ngxtjddc.com\ngxtjksj.com\ngxtjsnzg.com\ngxtk.com\ngxtkzx.com\ngxtlgd.com\ngxtljnhb.com\ngxtltzjt.com\ngxtmh.com\ngxtmhzx.com\ngxtmrs.com\ngxtmsy.com\ngxtodo.com\ngxtonghui.com\ngxtongji.com\ngxtongtai.com\ngxtongzhu.com\ngxtopart.com\ngxtp2021.com\ngxtrwhy.com\ngxtskq.com\ngxtslr.com\ngxttcc.com\ngxttjs.com\ngxttjt.com\ngxtuipin.com\ngxtuliao.com\ngxtuoen.com\ngxtuoyi.com\ngxtuscity.com\ngxtxjk.com\ngxtxpec.com\ngxty.com\ngxty.ltd\ngxtydt.com\ngxtydzqy.com\ngxtyjc.com\ngxtykj.com\ngxtyw.com\ngxtywj.com\ngxtyymxcgs.com\ngxtzh.net\ngxtznn.com\ngxtzpx.com\ngxtztech.com\ngxucreate.com\ngxue.net\ngxufl.com\ngxufz.com\ngxuit.com\ngxumi.com\ngxupdi.com\ngxups.com\ngxuzf.com\ngxvideo.net\ngxvolardda.com\ngxwanchao.com\ngxwanchun.com\ngxwbl.com\ngxwcll.com\ngxwcwl.com\ngxwdgg.com\ngxwdjt.com\ngxweibo.net\ngxweipeng.com\ngxweite.com\ngxwellsun.com\ngxwenlian.com\ngxwenyutech.com\ngxwgdq.com\ngxwgjf.com\ngxwhsy.com\ngxwhwy.com\ngxwjkj.com\ngxwjs.com\ngxwjwswkj118.com\ngxwjxl.com\ngxwjxsbcj.com\ngxwjyllh.com\ngxwkhb.com\ngxwkxcl.com\ngxwmj168.com\ngxwmpco.com\ngxwofi.com\ngxwogan.com\ngxwohua.com\ngxwoqi.com\ngxwqwh.com\ngxwskq.com\ngxwsxt.com\ngxwtai.com\ngxwtba.com\ngxwtrlzy.com\ngxwtt.com\ngxwtzy.com\ngxwudun.com\ngxwuyan.com\ngxwuzi.com\ngxwx.com\ngxwxbjsy.com\ngxwxjy.com\ngxwxjz.com\ngxwxtyn.com\ngxwzgroup.com\ngxwzhh.co\ngxwzj.com\ngxwzjt.com\ngxwzjx.com\ngxwzlhh.com\ngxwzsz.com\ngxwztv.com\ngxwzxhyq.com\ngxwzyl.com\ngxxbx.com\ngxxbysy.com\ngxxbzm.com\ngxxdbp.com\ngxxdit.com\ngxxdpc.com\ngxxdzx.com\ngxxfbfg.com\ngxxfgg.com\ngxxfky.com\ngxxfsl.com\ngxxfz.com\ngxxgg.com\ngxxgle.com\ngxxgpower.com\ngxxgrj.com\ngxxgty.com\ngxxh58.com\ngxxhb.com\ngxxhgj.com\ngxxhgroup.com\ngxxhgs.com\ngxxhn.com\ngxxhsd.com\ngxxhtax.com\ngxxhtsj.com\ngxxhtx.com\ngxxhtzp.com\ngxxhz.com\ngxxhzp.com\ngxxiangxing.com\ngxxiangyi88.com\ngxxiaofu.com\ngxxiaolong.net\ngxxielang.com\ngxxijiang.com\ngxxilin.com\ngxxin.com\ngxxinchai.com\ngxxingfu.com\ngxxingxing.com\ngxxingyao.com\ngxxinhui.com\ngxxinrui.net\ngxxinxiang.com\ngxxinye.com\ngxxinyi.com\ngxxinzhihai.com\ngxxiyuanep.com\ngxxjcz.com\ngxxjry.com\ngxxjsy.com\ngxxkai.com\ngxxkgs.com\ngxxkhj.com\ngxxkslgy.com\ngxxldl.com\ngxxlhkj.com\ngxxlk.com\ngxxlkj.com\ngxxls.com\ngxxlyc.com\ngxxlzxs.com\ngxxlzyc.com\ngxxmglzx.com\ngxxmjjs.com\ngxxmyjs.com\ngxxndz.com\ngxxpgd.com\ngxxqsm.com\ngxxrf.com\ngxxrwl.com\ngxxrxmgl.com\ngxxrzb.com\ngxxstz.com\ngxxsy.com\ngxxszx.com\ngxxszy.net\ngxxtlq.com\ngxxundongtech.com\ngxxuyang.com\ngxxw.com\ngxxwjs.net\ngxxy.online\ngxxydhb.com\ngxxyh.net\ngxxyhwhcb.com\ngxxyrbc.com\ngxxyybc.com\ngxxyydl.com\ngxxyzx.com\ngxxzbjy.com\ngxxzbzh.com\ngxxzlx.com\ngxxztcm.com\ngxxzwd.com\ngxyaan.tech\ngxyali.com\ngxyanggong.com\ngxyasuoji.com\ngxybsw.com\ngxybyy.com\ngxyc.net\ngxycjy.com\ngxycwh.com\ngxycwy.com\ngxycykj.com\ngxycysw.com\ngxyd.com\ngxydbg.com\ngxydbgjj.com\ngxyddyf.com\ngxydeye.com\ngxydfs.com\ngxydh.com\ngxydn.com\ngxydsc.com\ngxydspm.com\ngxydtaxi.com\ngxydxf.com\ngxyefang.com\ngxyesf.com\ngxyete.com\ngxyfck.com\ngxyfdz.com\ngxyfkj.com\ngxyfm.com\ngxyfxc.com\ngxygfund.com\ngxyglw.com\ngxygys.com\ngxyhdq.com\ngxyhgcjcxxw.com\ngxyhjgjt.com\ngxyhjt.com\ngxyhmy.net\ngxyhtz.com\ngxyhxx.com\ngxyicheng.com\ngxyidao.com\ngxyide.com\ngxyih.com\ngxyingchuang.com\ngxyingdi.com\ngxyinglun.com\ngxyingyue.com\ngxyinniyuan.com\ngxyintian.com\ngxyinyulanyingguigang.com\ngxyixin.com\ngxyiz.com\ngxyj.com\ngxyjcy.com\ngxyjdc.com\ngxyjhb.com\ngxyjmc.com\ngxyjzx.com\ngxykjd.com\ngxylct.com\ngxyldfyy.com\ngxylgyx.com\ngxylink.com\ngxyljf.com\ngxyllc.com\ngxylms.com\ngxylnews.com\ngxyls.com\ngxylsjsp.com\ngxylswkj.com\ngxympay.com\ngxynjx.com\ngxynlts.com\ngxyoj.com\ngxyongjiehb.com\ngxyongsheng.com\ngxyongzhitai.com\ngxyos.com\ngxypdc.com\ngxypjy.com\ngxypnh.com\ngxyqjc.com\ngxysbt.com\ngxysbz.com\ngxysccsh.com\ngxyskz.com\ngxyslkj.com\ngxysqj.com\ngxyss.com\ngxytdyf.com\ngxytgc.com\ngxytk.com\ngxytsy.com\ngxytzx.com\ngxyuanan.com\ngxyuanfeng.com\ngxyuansheng.com\ngxyuanyun.com\ngxyuchuan.com\ngxyunhua.com\ngxyunsen.com\ngxyunsheng.com\ngxyunxiang.com\ngxyuqiaoshiye.com\ngxyushengwenhua.com\ngxyuyun.com\ngxyx168.com\ngxyx1688.com\ngxyxdl.com\ngxyxjt.com\ngxyxlx.com\ngxyxsh.com\ngxyxtkj.com\ngxyxyy.com\ngxyy.net\ngxyykj.com\ngxyyun.com\ngxyyyc.com\ngxyyzwy.com\ngxyz120.com\ngxyzems.com\ngxyzh.com\ngxyzhhb.com\ngxyzjc.com\ngxyzrmyy.com\ngxyzt.com\ngxyzxf119.com\ngxyzyy.com\ngxzanwen.com\ngxzbfm.com\ngxzbkj.com\ngxzbzh.com\ngxzc888.com\ngxzcab.com\ngxzcfd.com\ngxzchz.com\ngxzcjh.com\ngxzckj.com\ngxzclq.com\ngxzcpsw.com\ngxzcs.com\ngxzdsj.com\ngxzdyg.com\ngxzecai.com\ngxzepu.com\ngxzero.com\ngxzfjg.com\ngxzfnz.com\ngxzfzx.com\ngxzfzy.com\ngxzgdl.com\ngxzghsp.com\ngxzgsy.com\ngxzgt.com\ngxzgtz.com\ngxzh.ltd\ngxzh666.com\ngxzhdq.com\ngxzhenghua.com\ngxzhenhang.com\ngxzhentao.com\ngxzhgz.com\ngxzhicui.com\ngxzhihui.com\ngxzhisai.com\ngxzhixing.com\ngxzhiyuanxing.com\ngxzhizhi.com\ngxzhjj.com\ngxzhkj.com\ngxzhlw.com\ngxzhnm.com\ngxzhongshui.com\ngxzhongta.com\ngxzhongzhai.com\ngxzhp.com\ngxzhpm.com\ngxzhshxx.com\ngxzhunchengbg.com\ngxzhzb.com\ngxzhzy.com\ngxziheng.com\ngxzj-metal.com\ngxzjjs.com\ngxzjjtgs.com\ngxzjy.com\ngxzkl.com\ngxzky.com\ngxzkzs.com\ngxzlcs.com\ngxzldt.com\ngxzljt.com\ngxzljx.net\ngxzlnm.com\ngxzls.com\ngxzlsb.net\ngxzm.vip\ngxzmjg.com\ngxzmlm.com\ngxzmrl.com\ngxzmtech.com\ngxzmzz.com\ngxznym.com\ngxzongjun.com\ngxzoxn.com\ngxzpjx.com\ngxzpw.org\ngxzrdk.com\ngxzrjc.com\ngxzrxf.com\ngxzscloud.com\ngxzsgl.com\ngxzsjzsj.com\ngxzslfz.com\ngxzsnm.com\ngxzspg.com\ngxzssmart.com\ngxzstsg.com\ngxzstzjtgs.com\ngxzsyy.com\ngxzszw.com\ngxzt.com\ngxzt148.com\ngxzt99.com\ngxztbf.com\ngxztzs.com\ngxzunx.com\ngxzuojiang.com\ngxzwhw.com\ngxzwjt.com\ngxzwxx.com\ngxzxgl.com\ngxzxht.com\ngxzxmy.net\ngxzxrh.com\ngxzy.com\ngxzydl.com\ngxzyfs.com\ngxzygygs.com\ngxzyhb.com\ngxzyjl.com\ngxzyjsgc.com\ngxzyky.com\ngxzymodel.com\ngxzypg.com\ngxzytx.com\ngxzyxysy.com\ngxzyyt.com\ngxzyzb.com\ngxzzcpa.com\ngxzzd.com\ngxzztkj.com\ngxzzxin.com\ngy-ggy.com\ngy120.net\ngy1688led.com\ngy2025.com\ngy328.com\ngy3y.com\ngy794c.com\ngy7n.com\ngy818.com\ngyaqyy.com\ngyb086.com\ngybcq.com\ngybsn.com\ngybyscy.com\ngybyxsy1588.com\ngycharm.com\ngycode.com\ngyddos.com\ngydfsy.com\ngydongli.com\ngyedu.net\ngyersf.com\ngyfensuiji.com\ngyfwyy.com\ngyfyy.com\ngygmhs.com\ngygmk.club\ngyhapp.com\ngyhb68.com\ngyhdsj.com\ngyhht.com\ngyhimalayanul.com\ngyhj.org\ngyhm.cc\ngyidc.net\ngyii.com\ngyip.net\ngyjc88.com\ngyjdgs.com\ngyjiangyuan.com\ngyjs.net\ngykgcqtm.com\ngykggz.com\ngykghb.com\ngykgsx.com\ngykqyy.com\ngylcxo.xyz\ngyljc.com\ngylwgjsyxx.com\ngylwyy.com\ngylxq.com\ngym0boy.com\ngymama.com\ngymbo-online.com\ngymxbl.com\ngymy.cc\ngyncb.net\ngynsh.net\ngynyzp.com\ngyouapp.com\ngypmsl.com\ngypserver.com\ngypump.com\ngypzkat.com\ngyqcw.com\ngyqqd.com\ngyqrmyy.com\ngyr.cc\ngyrcw.com\ngyrmyy.com\ngyrqfd.com\ngyrsy.com\ngyscw.com\ngysdzy.com\ngyseals.com\ngyshwl.online\ngysk.com\ngysou.com\ngysq.org\ngysrmyy.com\ngystarch.com\ngystars.com\ngystatic.com\ngystc.com\ngyswzys.com\ngytcwb.com\ngytxnc.com\ngytzkg.com\ngyuancdn.com\ngyurt.com\ngywlhypt.com\ngywxedu.com\ngywygl.com\ngyxdkjdl.com\ngyxtyy.com\ngyxuan.com\ngyxww.net\ngyxx.com\ngyxx365.com\ngyyb.com\ngyycc.com\ngyypw.com\ngyyuli.com\ngyyywcpx.com\ngyzdh.com\ngyzdkq.com\ngyzfbz.net\ngyzhtc.com\ngz-begreen.com\ngz-best.com\ngz-chantou.com\ngz-chengkao.com\ngz-cjjl.com\ngz-cmc.com\ngz-cube.com\ngz-data.com\ngz-ejoy.com\ngz-goam.com\ngz-gree.com\ngz-haohushan.com\ngz-hipower.com\ngz-huayuan.com\ngz-hz.com\ngz-julong.com\ngz-junan.com\ngz-lodihair.com\ngz-ltjx.com\ngz-mrt.com\ngz-notary.com\ngz-shanguang.com\ngz-spi.com\ngz-tencentclb.cloud\ngz-tencentclb.com\ngz-tencentclb.net\ngz-tencentclb.work\ngz-wx.com\ngz-xinghe.com\ngz-xinyu.com\ngz-xt.com\ngz-zhongshang.com\ngz.com\ngz007.net\ngz0668.com\ngz111.com\ngz121.com\ngz162.com\ngz1hua.com\ngz304.com\ngz360.com\ngz4399.com\ngz4u.net\ngz51la.com\ngz528.com\ngz583.com\ngz91.com\ngzac.org\ngzads.com\ngzanquan.com\ngzap.net\ngzaptech.net\ngzasp.net\ngzate.com\ngzautojet.com\ngzbaozhilin.com\ngzbawei.com\ngzbeaton.com\ngzbic.com\ngzbiogene.com\ngzbl.com\ngzblssly.com\ngzboji.com\ngzbookcenter.com\ngzbt020.com\ngzbus.com\ngzbxyy120.com\ngzbycq.com\ngzbyyy.com\ngzbzsport.com\ngzbzx.net\ngzcablec.com\ngzcancer.com\ngzcars.net\ngzccb.com\ngzccigroup.com\ngzccvs.com\ngzceia.com\ngzch120.com\ngzchangke.com\ngzchangzhe.com\ngzchenggeng.com\ngzchj.net\ngzchts.com\ngzchuanghe.com\ngzchupai.com\ngzci.net\ngzcihui.com\ngzcjjs.com\ngzcl999.com\ngzcmer.com\ngzcmjl.com\ngzcn.net\ngzcots.com\ngzcppa.com\ngzcqs.com\ngzcrdzbk.com\ngzcsgs.com\ngzcsjg.com\ngzcxhd.com\ngzcxlm.org\ngzcycling.com\ngzczjd.com\ngzdahyxh.com\ngzdai.com\ngzdaily.com\ngzdangaopeixun.com\ngzdaochen.com\ngzdaqi.com\ngzdata.net\ngzdayue.com\ngzdbx.com\ngzdcsmt.com\ngzdensity.com\ngzdi.com\ngzdia.com\ngzdingan.com\ngzdingjie.com\ngzdingyu.com\ngzdingyue.com\ngzdingyun.com\ngzdisheng.com\ngzdjy.org\ngzdli.com\ngzdqyy.com\ngzdryy.com\ngzdsw.com\ngzdtg.com\ngzduguo.com\ngzdysx.com\ngzebpubservice.com\ngzedu.com\ngzeic.com\ngzenxx.com\ngzeryun.com\ngzexpo.com\ngzfc.net\ngzfengmao.com\ngzfezx.com\ngzfgxh.com\ngzfi.com\ngzfin.com\ngzfirst.com\ngzfisher.com\ngzfk01.com\ngzfodak.com\ngzforge.com\ngzfpa.net\ngzfqyy.com\ngzfrldz.com\ngzfsnet.com\ngzfuk.net\ngzgajy.com\ngzgas.com\ngzgayy.com\ngzgccs.com\ngzgccxkj.com\ngzgcg.com\ngzgdkq.com\ngzgdwl.com\ngzgelandi.com\ngzghic.com\ngzghyy.com\ngzgj.net\ngzgjcm.com\ngzgjxny.com\ngzglgcjt.com\ngzgljx.com\ngzgmjcx.com\ngzgongsizhuce.com\ngzguangjia.com\ngzguidian.com\ngzgx020.com\ngzgxysjx.com\ngzgyetc.com\ngzh6.com\ngzhaigu.com\ngzhakj.com\ngzhand.com\ngzhangcha.com\ngzhatao.com\ngzhbchy.com\ngzhc365.com\ngzhclw.com\ngzhcpcb.com\ngzhd.net\ngzhd56.com\ngzhdcs.com\ngzhe.net\ngzhengdian.com\ngzhengdou.com\ngzheyoukeji.com\ngzhfschool.com\ngzhifi.com\ngzhkl.com\ngzhkzyyy.com\ngzhm.com\ngzhntec.com\ngzhornet.com\ngzhotelgroup.com\ngzhpaier.com\ngzhpgroup.com\ngzhphb.com\ngzhpyy.com\ngzhpzz.net\ngzhrsa.org\ngzhsh.com\ngzhstars.net\ngzhtdz.com\ngzhtinfo.com\ngzhuake.cc\ngzhuamei.net\ngzhuayan.com\ngzhuiwan.com\ngzhuiyk.com\ngzhuiyun.com\ngzhwgg.com\ngzhwsp.com\ngzhx04.com\ngzhx09.com\ngzhx10.com\ngzhxaq.com\ngzhxyyhos.com\ngzhygk.com\ngzhysy.com\ngzhzcj.com\ngzidc.com\ngziec.net\ngzitvs.com\ngzitwm.net\ngzj568.com\ngzjbjx.com\ngzjbwm.com\ngzjc2016.com\ngzjeeseng.com\ngzjgpy.com\ngzjhotel.com\ngzjiada.com\ngzjiaw.com\ngzjiehun.com\ngzjiema.com\ngzjingsha.com\ngzjinsong.com\ngzjiunuo.com\ngzjizhong.com\ngzjk120.com\ngzjkfk.com\ngzjkfund.com\ngzjkjl.com\ngzjkqh.com\ngzjkyljt.com\ngzjlp.com\ngzjlwl.com\ngzjlwy.com\ngzjlxh.com\ngzjmyy.com\ngzjob.net\ngzjpad.com\ngzjqd.com\ngzjrkg.com\ngzjs020.com\ngzjsxh.com\ngzjt.cc\ngzjtch.com\ngzjtjx.com\ngzjtjy.com\ngzjtxh.com\ngzjtxx.net\ngzjtzy.net\ngzjunbo.net\ngzjunyu.com\ngzjuqi.com\ngzjvcom.com\ngzjxchem.com\ngzjyh.com\ngzjykj.com\ngzjyme.com\ngzjyypt.com\ngzjz-auto.com\ngzjzc.com\ngzkaiheng.com\ngzkaiyue.com\ngzkangyuan.com\ngzkcsj.com\ngzkcsjw.com\ngzking.com\ngzkint.com\ngzkmbg.com\ngzkofa.com\ngzktm.com\ngzkuaiyingyong.com\ngzkunmao.com\ngzkydzyyy.com\ngzlarc.com\ngzlawyer.org\ngzlex.com\ngzlgsyxx.com\ngzli.com\ngzliancun.com\ngzlib.org\ngzlig.com\ngzlight.com\ngzliyuanhb.com\ngzljsl.com\ngzlnholdings.com\ngzlsgy.com\ngzlt.net\ngzlujiao.com\ngzlushun56.com\ngzlutong.com\ngzluxlife.com\ngzlwrc.com\ngzlwycft-tencentclb.cloud\ngzlwycft-tencentclb.com\ngzlwycft-tencentclb.net\ngzlwycft-tencentclb.work\ngzlyhlawyer.com\ngzlz307.com\ngzlzfm.com\ngzm1.com\ngzmama.com\ngzmath.com\ngzmc668.com\ngzmcg.com\ngzmcgjcpt.com\ngzmediaclick.com\ngzmedri.com\ngzmeichang.com\ngzmiden.com\ngzminjia.com\ngzmiyuan.com\ngzmlfcyy.com\ngzmofa.com\ngzmould.com\ngzmpc.com\ngzmri.com\ngzmstech.com\ngzmtr.com\ngzmtrticket.com\ngzmylike.com\ngzmzedu.com\ngznaturn.com\ngznbsyy.com\ngzncstudios.com\ngznemo.com\ngznftz.com\ngzngn.com\ngznict.com\ngznotes.com\ngznw.com\ngznxbank.com\ngznyjj.com\ngznypfk.com\ngzocl.com\ngzomick.com\ngzopen-tencentclb.cloud\ngzopen-tencentclb.com\ngzopen-tencentclb.net\ngzopen-tencentclb.work\ngzoyrr.com\ngzpaco.com\ngzpeite.com\ngzpeiyou.com\ngzpfs.com\ngzpg.net\ngzpgroup.com\ngzpgs.com\ngzph.net\ngzpinda.com\ngzpma.com\ngzpoint.com\ngzpotent.com\ngzppa.org\ngzprg.com\ngzprobig.com\ngzpy120.net\ngzpydlc.com\ngzpyxz.net\ngzqbd.com\ngzqiche.com\ngzqixun-tech.com\ngzqljxd.com\ngzqsts.com\ngzqunsheng.com\ngzqygl.com\ngzqz.com\ngzrand.com\ngzrandr.com\ngzrch.com\ngzrcqf.com\ngzrecruit.com\ngzredpine.com\ngzrh.com\ngzrishun.com\ngzrkt.com\ngzrobot.com\ngzrobots.com\ngzrqhyxh.com\ngzrrj.com\ngzrskh.com\ngzrsksxxw.com\ngzrtnet.com\ngzrycl.com\ngzsaf.com\ngzsbdq.com\ngzscbio.com\ngzschknyy.com\ngzscjrh.com\ngzsdwrmyy.com\ngzselon.com\ngzsenergy.com\ngzsenzheng.com\ngzsewage.com\ngzsg.org\ngzsgczb.com\ngzshaudio.com\ngzsheraton.com\ngzshiran.com\ngzshuangbao.com\ngzshuimh.com\ngzshujuhui.com\ngzshyk.com\ngzsiyuan.com\ngzsj.live\ngzsjgxcl.com\ngzsjjs.com\ngzsjyzx.com\ngzsjzzsxh.com\ngzskysoil.com\ngzslyy.com\ngzsonic.com\ngzsouth.com\ngzspm.com\ngzspring.com\ngzspt.com\ngzsq.com\ngzsqkfyy.com\ngzsqmxx.com\ngzsrmyy.com\ngzsrunda.com\ngzssltzinc.com\ngzssnzx.com\ngzssyyy.com\ngzstarship.com\ngzsttc.com\ngzstv.com\ngzstw.com\ngzstyq.com\ngzsu.net\ngzsuike.com\ngzsums.net\ngzsunny.com\ngzsw168.com\ngzswgf.com\ngzswjs.com\ngzsxds.com\ngzsyyxh.com\ngzszfgjj.com\ngzszgas.com\ngzszgyjt.com\ngzszjl.com\ngzszsj.com\ngzszyy.com\ngztaiyou.com\ngztalx.com\ngztamude.com\ngztcdj.com\ngztcm3.com\ngztea.vip\ngzteacher.com\ngztextiles.com\ngztfgame.com\ngzthfy.com\ngzthrc.com\ngztig.com\ngztime.cc\ngztit.com\ngztlgc.com\ngztopkt.com\ngztoptour.com\ngztotem.com\ngztowngas.com\ngztrseo.com\ngztszl.com\ngzttjt.com\ngztv.com\ngztvu.com\ngztwkadokawa.com\ngztxcw.com\ngztxedu.com\ngztxfood.com\ngztyjx.com\ngztyre.com\ngztyyedu.com\ngztz.org\ngztz120.com\ngzu521.net\ngzuc.net\ngzuci.com\ngzucm-yhyy.com\ngzuni.com\ngzupdc.com\ngzv6.com\ngzvalex.com\ngzvstc.net\ngzw.net\ngzwanbao.com\ngzwanju.com\ngzwanzhou.com\ngzwarriortech.com\ngzwaterinvest.com\ngzwatersupply.com\ngzwcfjd.com\ngzwcit.com\ngzwcjs.com\ngzweicai.com\ngzweix.com\ngzwhir.com\ngzwjnt.com\ngzwlcyjt.com\ngzwoman.org\ngzwonbo.com\ngzwrit.com\ngzwrjt.com\ngzwshd.com\ngzwswjc.com\ngzwtqx.com\ngzwxzf-tencentclb.cloud\ngzwxzf-tencentclb.com\ngzwxzf-tencentclb.net\ngzwxzf-tencentclb.work\ngzwynet.com\ngzwzhw.com\ngzxdd.com\ngzxdf.com\ngzxdzlyy.com\ngzxf35.com\ngzxhcbfx.com\ngzxhce.com\ngzxhhs.net\ngzxianc.com\ngzxiaoban.com\ngzxict.com\ngzxijiu.com\ngzxinfo.com\ngzxjgc.com\ngzxrsqj.com\ngzxswh.com\ngzxsyy.com\ngzxszf.com\ngzxue.com\ngzxulang.com\ngzxwtjy.com\ngzxxm.com\ngzxxtiyu.com\ngzxxty168.com\ngzxy.net\ngzxyh.com\ngzxyprint.com\ngzxzjy.com\ngzyajs.com\ngzyangai.com\ngzybao.com\ngzycdy.com\ngzych.vip\ngzycsjgs.com\ngzyct.com\ngzydnewmaterial.com\ngzydong.com\ngzydwh.com\ngzyfjsjt.com\ngzyflw.com\ngzyhg.vip\ngzyiagu.com\ngzyilongprinting.com\ngzyitsy.com\ngzylhyzx.com\ngzyouai.com\ngzyowin.com\ngzyqtlxs.com\ngzyqwl.net\ngzysnkyy.com\ngzytgf.com\ngzyucai.com\ngzyucai.net\ngzyxedu.net\ngzyxls.com\ngzyxtech.com\ngzyycg.com\ngzyyjt.net\ngzyyma.com\ngzyytj.com\ngzyywz.net\ngzyz699.com\ngzzarts.com\ngzzbdl.com\ngzzc-logistics.com\ngzzcs.com\ngzzdgg.com\ngzzdkg.com\ngzzdqy.net\ngzzfrl.com\ngzzgresin.com\ngzzhanmei.com\ngzzhitu.com\ngzzhixin.com\ngzzhrong.com\ngzzjgf.com\ngzzjtx.com\ngzzkjc.net\ngzzkzj.com\ngzzkzsw.com\ngzzldq.com\ngzzlfw.com\ngzzliot.com\ngzzmedu.com\ngzzoc.com\ngzzongsi.com\ngzzoo.com\ngzzqy.net\ngzzrdc007.com\ngzzulin.com\ngzzwis.com\ngzzx.cc\nh-ceo.com\nh-cled.com\nh-college.com\nh-diode.com\nh-heguo.com\nh-partners.com\nh-shgroup.com\nh-ui.net\nh-world.com\nh-zl.net\nh0591.com\nh0758.net\nh12.net\nh12345.com\nh128.com\nh13.mobi\nh14z.com\nh2-bank.com\nh2fc.net\nh2gl.com\nh2o-china.com\nh2os.com\nh2vm.com\nh2weilai.com\nh3806.com\nh3807.com\nh389.com\nh3c.com\nh3c.com.hk\nh3cfuwuqi.com\nh3dns.net\nh3ue2s.com\nh3wog.com\nh3yun.com\nh4088.com\nh4k5.com\nh4sud3rr4pmu.com\nh5-share.com\nh5-x.com\nh5-yes.com\nh5.net\nh51.com\nh51h.com\nh554.com\nh55u.com\nh576.com\nh5abc.com\nh5anli.com\nh5app.com\nh5avu.com\nh5cn.com\nh5data.com\nh5designer.com\nh5ds.com\nh5eco.com\nh5faner.com\nh5gamecdn.club\nh5gd.com\nh5gdsvip.com\nh5gdvip.com\nh5in.net\nh5jun.com\nh5king.com\nh5kuai.com\nh5ky.com\nh5le.com\nh5login.work\nh5ma.com\nh5mc.com\nh5mgd.com\nh5mo.com\nh5mota.com\nh5mugeda.com\nh5no1.com\nh5pack.com\nh5po.com\nh5shuo.com\nh5taotao.com\nh5tpl.com\nh5uc.com\nh5util.com\nh5video.shop\nh5wap.com\nh5war.com\nh5youxi.com\nh5yunban.com\nh5zhifu.com\nh61889.com\nh6295.com\nh6969.com\nh6app.com\nh6room.com\nh6ru.net\nh7ec.com\nh7fpuyk8.com\nh863.com\nh99998888.com\nh99999999.com\nha-airport.com\nha47.net\nha95158.com\nha97.com\nhaawking.com\nhabadog.com\nhabbygames.com\nhabctv.com\nhabwjc.com\nhach-hanna.com\nhachicnc.com\nhacjkq.com\nhack0nair.me\nhack520.com\nhack58.com\nhack6.com\nhackav.com\nhacker5t2ohub.com\nhackerav.com\nhackernews.cc\nhackhome.com\nhackhp.com\nhackhw.com\nhacking-linux.com\nhackinn.com\nhackjie.com\nhackliu.com\nhacknical.com\nhackp.com\nhackpascal.net\nhackrf.net\nhackroad.com\nhackyh.com\nhacori.com\nhacpai.com\nhaczjob.com\nhadax.com\nhadewu.com\nhadobi.com\nhadsky.com\nhaeicr.world\nhaers.com\nhaersgroup.com\nhaeye.net\nhafei.com\nhafuyoufk.com\nhagaozhong.com\nhagibis.com\nhaguan.com\nhaguworld.com\nhaha168.com\nhaha33.com\nhaha360.com\nhaha365.com\nhaha9911.com\nhahack.com\nhahaertong.com\nhahait.com\nhahajing.com\nhahasou.com\nhahasz.com\nhahaurl.com\nhahawen.com\nhahayouxi.com\nhahazhao.com\nhahon.com\nhahour.com\nhai-jiang.com\nhai.pet\nhai360.com\nhaianbank.com\nhaianbm.com\nhaianedu.net\nhaianw.com\nhaianyaoye.com\nhaianzhuangshi.com\nhaibao.com\nhaibaobaoxian.com\nhaibaofoods.com\nhaibaoptech.com\nhaibaoyl.com\nhaibaoyouxi.com\nhaibeinews.com\nhaibian.com\nhaibianshibei.com\nhaibowh.com\nhaiboyi.com\nhaica.cc\nhaicent.com\nhaichangchina.com\nhaichangoceanpark.com\nhaichen-logistics.com\nhaichuang3d.com\nhaichufang.com\nhaici.com\nhaicj.com\nhaicnh.com\nhaicoder.net\nhaidaibao.com\nhaidaike.com\nhaidaoteam.com\nhaidaotrip.com\nhaidaozhu.com\nhaidegroup.com\nhaidian-marathon.com\nhaidii.com\nhaidilao.com\nhaidilao.net\nhaidilao.us\nhaidubooks.com\nhaidutouzi.net\nhaier-ioc.com\nhaier.com\nhaier.hk\nhaier.net\nhaiercash.com\nhaierfinancial.com\nhaiermoney.com\nhaiershequ.com\nhaiershui.com\nhaiersmarthomes.com\nhaierubic.com\nhaieruplus.com\nhaifangbest.com\nhaifanwu.com\nhaifuhospital.com\nhaige.com\nhaigeek.com\nhaigeer.com\nhaigehome.com\nhaigoose.com\nhaigouyan.com\nhaigugroup.com\nhaigui001.com\nhaihepharma.com\nhaihetour.com\nhaihuainternational.com\nhaihub.co\nhaihuishou.com\nhaiintelligent.com\nhaijia.org\nhaijianchuxing.com\nhaijianstock.com\nhaijiaonet.com\nhaijiaoshi.com\nhaijiasu.com\nhaijizq.com\nhaijob.com\nhaijt.com\nhaijudoc.com\nhaijunda.com\nhaikegroup.com\nhaikejin.com\nhaikele.com\nhaikeoutdoor.com\nhaiketrip.com\nhaikouvw.com\nhaikouwater.com\nhailanchem.com\nhailanggroup.com\nhailea.com\nhaili-spitzer.com\nhailiang.com\nhailiangbio.com\nhailiangedu.com\nhailiangip.com\nhailiangstock.com\nhailiangxinxi.com\nhailichemical.com\nhailidoctor.com\nhaililiang.com\nhailin.com\nhailongfoods.com\nhailouw.com\nhailunpiano.com\nhailuoai.com\nhailuowu.com\nhaima.com\nhaima.me\nhaima001.com\nhaimacloud.com\nhaimacloudpc.com\nhaimaiyun.com\nhaiman.io\nhaimaoji.com\nhaimawan.com\nhaimeec.com\nhaimi.com\nhaimian.com\nhaimin.net\nhaimini.com\nhaimosic.com\nhaina.com\nhaina.net\nhainaguangdian.com\nhainajc.com\nhainan.net\nhainan0898.net\nhainanairlines.com\nhainancom.com\nhainancp.com\nhainandc.com\nhainanfp.com\nhainanfz.com\nhainanjiuzi.com\nhainanjk.com\nhainanlawyer.org\nhainanlecheng.com\nhainanruiyuan.com\nhainanwangdai.com\nhainanyouxi.com\nhainanyumu.com\nhainanzuojia.com\nhainawater.com\nhainayun.net\nhainiaowo.com\nhainic.com\nhaining.com\nhaining.tv\nhainingnews.net\nhainiubl.com\nhainiugo.com\nhainiuxy.com\nhainuotech.com\nhaiotsys.com\nhaipal.com\nhaipengtoy.com\nhaipinggroup.com\nhaipuzhiwu.com\nhaiqianghm.com\nhaiqigame.com\nhaiqingyanyu.com\nhaiqisoft.com\nhaiqq.com\nhaiqu.vip\nhair43.com\nhair8.net\nhairbobo.com\nhairboxonline.com\nhairenren.com\nhairology.net\nhairongsw.com\nhairuichem.com\nhairuituo.com\nhairunce.com\nhairunmedia.com\nhairunpictures.com\nhairxmf.com\nhairycrabs.com\nhaisco.com\nhaisenyouxi8.com\nhaishengfrp.com\nhaishensl.com\nhaishiyiliao.com\nhaishui.cc\nhaishun.com\nhaishuokj.com\nhaishuu.com\nhaisongta.com\nhaita.io\nhaitaibrowser.com\nhaitaichina.com\nhaitakuajing.com\nhaitangmm.com\nhaitangw.cc\nhaitangw.net\nhaitao.co\nhaitaohub.com\nhaitaoj.com\nhaitaolab.com\nhaitaotong.com\nhaitaozu.org\nhaitian-food.com\nhaitian-group.com\nhaitian.com\nhaitiangroup.com\nhaitianhome.com\nhaitianpm.com\nhaitianshuiwu.com\nhaitl.com\nhaitong.com\nhaitongjiaoyu.com\nhaitou.cc\nhaitou360.com\nhaitoujia.com\nhaituie.com\nhaitunshenghuo.com\nhaitunvoice.com\nhaitunwallet.com\nhaitunzhidao.com\nhaitunzixi.com\nhaituoqi.com\nhaitutech.com\nhaiwaicat.com\nhaiwaichongzhi.com\nhaiwaihuafei.com\nhaiwaimoney.com\nhaiwaioo.com\nhaiwaiyou.com\nhaiwaiyoujia.com\nhaiwangbuyu.com\nhaiwanxinxi.com\nhaiwd.com\nhaiwei-tech.com\nhaiweili.com\nhaiwell.com\nhaiwen-law.com\nhaiwenky.com\nhaiwu.com\nhaixiachina.com\nhaixiangkuajing.com\nhaixin.com\nhaixin5.com\nhaixindichan.com\nhaixinews.com\nhaixing6.com\nhaixingbangfu.com\nhaixingcloud.com\nhaixinhui.com\nhaixinpatent.com\nhaixiulive.com\nhaixiumv.com\nhaixiutv.com\nhaixiuvv.com\nhaixuan.com\nhaixue.com\nhaixuemeili.com\nhaixuyun.com\nhaiyang-group.com\nhaiyang.net\nhaiyi701.com\nhaiyiai.tech\nhaiyingmt.com\nhaiyingshuju.com\nhaiyisoft-gz.com\nhaiyisoft.com\nhaiymobi.com\nhaiyong.site\nhaiyuangabion.com\nhaiyuangabiou.com\nhaiyuetechltd.com\nhaiyun.me\nhaizhangs.com\nhaizhanweb.com\nhaizhenzhu.com\nhaizhikj.com\nhaizhlink.com\nhaizhoumo.com\nhaizhu.vip\nhaizhuyx.com\nhaizitong.com\nhaiziwang.com\nhaizol.com\nhajt-cn.com\nhaju.com\nhajw.com\nhajzhyxh.com\nhakaimg.com\nhakchina.com\nhakczz.com\nhakfqyy.com\nhakonespring.com\nhakuya.work\nhalade.com\nhalcyonz.com\nhalead.com\nhalfrost.com\nhaligame.com\nhalixun.com\nhaljl.com\nhalloar.com\nhallofix.com\nhalobear.com\nhalomobi.com\nhalopepper.com\nhalsplastics.com\nhaluan2u.com\nhaluoha.com\nhaluolinks.com\nhalvie.com\nham.xin\nhamdl.com\nhamedal.com\nhaminol.com\nhammypuff.com\nhamu.site\nhanabi-live.com\nhanas.com\nhanascitygas.com\nhanbi.live\nhanbige.com\nhanboshi.com\nhanbridge.org\nhanchacha.com\nhanchao9999.com\nhancibao.com\nhancloud.com\nhanclouds.com\nhand-china.com\nhandanhuizhong.com\nhandanjob.com\nhandanyz.com\nhandcn.com\nhandday.com\nhandelic.com\nhandelsen.com\nhandern.com\nhandisele.com\nhandone.com\nhandongkj.com\nhandongruanjian.com\nhandpk.com\nhandsfree.work\nhandu.com\nhanduyishe.com\nhandyfriendship.com\nhanergy.com\nhanex.cc\nhanfakg.com\nhanfan.cc\nhanfei.net\nhanfeiyl.com\nhanfugong.com\nhanganxian.com\nhangbohaorun.com\nhangcha-forklift.com\nhangchow.org\nhangdagroup.com\nhangdaowangluo.com\nhangdaxinli.com\nhangdianzhizao.com\nhangduhc.com\nhangf.com\nhanggao.net\nhangge.com\nhanghaimeng.com\nhanghang.com\nhanghangcha.com\nhanghangohye.com\nhangjia-tech.com\nhangjianet.com\nhangjiayun.com\nhangjizulin.com\nhangkong.com\nhangkongxx.com\nhanglorygroup.com\nhangnakeji.com\nhangongjk.com\nhangpai.org\nhangpu-topsys.com\nhangruntech.com\nhangshitech.com\nhangsi-bio.com\nhangtianride.com\nhangtu-china.com\nhangtunggroup.com\nhanguangbaihuo.com\nhangugc.monster\nhanguu.com\nhangw.com\nhangwei-media.com\nhangxinyiqi.xin\nhangyan.co\nhangyang.com\nhangyecloud.com\nhangzhiqiao.com\nhangzhouboiler.com\nhangzhoueda.com\nhangzhouexpo.com\nhangzhoufujikura.com\nhangzhoujizhang.com\nhangzhoujx.com\nhangzhouleili.com\nhangzhouluohu.com\nhangzhoumengfa.com\nhangzhouqisheng.com\nhangzhousports.com\nhangzhoutianqi114.com\nhangzhouweifeng.com\nhangzhouyiyao.com\nhangzhouyq.com\nhangzhouzehe.com\nhanhai.net\nhanhaiqikan.com\nhanhe-cable.com\nhanhongchina.com\nhanhoo.com\nhanhua.com\nhanhuatin.com\nhanihanrf.com\nhanjea.com\nhanjianbing.org\nhanjiaying.com\nhanjie.biz\nhanjjl.com\nhanju-tv.org\nhanjuejituan.com\nhanjutv.com\nhankaiacademy.com\nhankaikeji.com\nhankchina.com\nhanke1688.com\nhankeer.org\nhankemaoyi.com\nhanking.com\nhankinggroup.com\nhankmo.com\nhankunlaw.com\nhanlanad.com\nhanlei.org\nhanlin-tech.net\nhanlin.com\nhanlin.press\nhanlindong.com\nhanlinedu.com\nhanlinzhijia.com\nhanlinzhijia.net\nhanlka.com\nhanlongpiju.com\nhanlunjx.com\nhanmaa.com\nhanmads.com\nhanmaidj.com\nhanmaker.com\nhanmeilin.com\nhanmembrane.com\nhanmozhai.com\nhanniulaser.com\nhannor.com\nhannto.com\nhanon.cc\nhanpian.tv\nhanpokou.com\nhanpupharm.com\nhanqigroup.com\nhanqinghb.com\nhanqunfeng.com\nhanrunbt.com\nhans-ad.com\nhansaoxinxi.xyz\nhanschen.site\nhansenexpo.com\nhansetile.com\nhanshinkiki-xuzhou.com\nhansholdings.com\nhanshow.com\nhansight.com\nhanslaser.com\nhanslaser.net\nhansme.com\nhansong-china.com\nhanspower.com\nhanspub.org\nhansrobot.com\nhanstong.com\nhansuku.com\nhansunic.com\nhanswine.net\nhant.cc\nhantang59.com\nhantangxintong.com\nhantangzy.com\nhantecables.com\nhantele.com\nhanterry.com\nhantev.com\nhantinghotels.com\nhantongrc.com\nhantongsteel.com\nhanvitools.com\nhanvon.com\nhanvonmfrs.com\nhanvontouch.com\nhanwa-ch.com\nhanweb.com\nhanwei1234.com\nhanweimetal.com\nhanwenzhongyi.com\nhanximeng.com\nhanxinsheng.com\nhanxuew.com\nhanyanggroup.com\nhanyangmoto.com\nhanyanseed.com\nhanyaohuanbao.com\nhanyi.com\nhanyi.studio\nhanyipo.com\nhanyou.com\nhanyougame.com\nhanyouwang.com\nhanyu.me\nhanyuansh.com\nhanyuguoxue.com\nhanyulaoshi.com\nhanyutai.com\nhanyuwatch.com\nhanyya.com\nhanzhesh.com\nhanzhong123.com\nhanzhonggas.com\nhanzhoulaser.com\nhanzify.org\nhanziguan.com\nhao-shangliang.com\nhao.ac\nhao.gg\nhao.ink\nhao0517.com\nhao0724.com\nhao0770.com\nhao120.cc\nhao123-hao123.com\nhao123.com\nhao123.com.sg\nhao123.net\nhao123.ph\nhao12306.com\nhao123img.com\nhao123n.com\nhao1358.com\nhao136.com\nhao163.com\nhao184.com\nhao1cm.com\nhao22.com\nhao222.com\nhao222.net\nhao2345.com\nhao24.com\nhao245.com\nhao251.com\nhao268.com\nhao315.cc\nhao315.com\nhao353.com\nhao360.com\nhao394.com\nhao3gp.com\nhao5.net\nhao528.com\nhao568.com\nhao6.com\nhao61.net\nhao695.com\nhao7188.com\nhao753.com\nhao76.com\nhao774.com\nhao86.com\nhaoad.org\nhaoamc.com\nhaoayi.xyz\nhaobangni.com\nhaobangscm.com\nhaobtc.com\nhaocaa.com\nhaocai.com\nhaocaiqi.net\nhaocang.com\nhaochang.tv\nhaochangyou.com\nhaoche1.com\nhaoche51.com\nhaochedai.com\nhaocheedai.com\nhaochehui.com\nhaochengda.net\nhaochenmo.cc\nhaochi123.com\nhaochijixie.com\nhaochimei.com\nhaochu.com\nhaochuguo.com\nhaocw.com\nhaodai.com\nhaodanku.com\nhaodaquan.com\nhaodekuai.com\nhaodevps.com\nhaodewap.com\nhaodewap.net\nhaodf.com\nhaodf.org\nhaodiany.com\nhaodiaoyu.com\nhaodingdan.com\nhaodisoft.com\nhaodiy.net\nhaodns123.cc\nhaodns789.cc\nhaodns999.cc\nhaodongdong.com\nhaodou.com\nhaodro.com\nhaoduck.com\nhaoduhe.com\nhaoduo.vip\nhaoduobao6.com\nhaoduofangs.com\nhaoduojiaju.com\nhaoduorou.net\nhaoduoziti.com\nhaoe123.com\nhaoejia.com\nhaoeyou.com\nhaofabiao.com\nhaofakeji.com\nhaofan005.com\nhaofang.net\nhaofang007.com\nhaofang5.com\nhaofangkankan.com\nhaofangyu999.com\nhaofeng-group.com\nhaofenshu.com\nhaofenxiao.net\nhaofly.net\nhaofs.com\nhaofz.com\nhaoge500.com\nhaogedu.com\nhaogj8.com\nhaogongzhang.com\nhaohaizi.com\nhaohan-data.com\nhaohanfw.com\nhaohanguo.com\nhaohanju.com\nhaohanjx.com\nhaohanpower.tech\nhaohanstar.com\nhaohao8888.com\nhaohaodoc.com\nhaohaowan.com\nhaohaowan.net\nhaohaoxiuche.com\nhaohaoxz.com\nhaohaoyx.com\nhaohaozhu.com\nhaohead.com\nhaoht123.com\nhaohuan.com\nhaohuanjiao.com\nhaohuoa.com\nhaohuoyuan.com\nhaohxs.com\nhaointl.com\nhaoinvest.com\nhaoji.me\nhaojiao.cc\nhaojiao.net\nhaojiaolian.com\nhaojie.work\nhaojing.org\nhaojit.com\nhaojixie.cc\nhaojixiong.com\nhaoju5.com\nhaojue.com\nhaojue163.com\nhaojushe.com\nhaoka88.com\nhaokale.com\nhaokan.com\nhaokan5.com\nhaokanbu.com\nhaokanqq.com\nhaokanshipin.com\nhaokavip.com\nhaoke100.com\nhaokebang.net\nhaokebio.com\nhaokecheng.com\nhaokejie.com\nhaokeyun.vip\nhaokongbu123.com\nhaokoo.com\nhaoku.net\nhaokuaiya.com\nhaolaba.com\nhaolangtech.com\nhaolaoshi.tv\nhaolawyer.com\nhaole.com\nhaoled9999.com\nhaolexiang.com\nhaolidayiliao.com\nhaolietou.com\nhaolifa.com\nhaolike.com\nhaoliners.net\nhaoling.cc\nhaolints.com\nhaoliv.com\nhaolizi.net\nhaolongsci.com\nhaolvbt.com\nhaolyy.com\nhaoma.com\nhaoma123.com\nhaomagujia.com\nhaomai.net\nhaomaikeji.com\nhaomaishe.com\nhaomaishou.com\nhaomaitong.com\nhaomaizhizao.com\nhaomaku.com\nhaomei-alu.com\nhaomenke.com\nhaomifi.com\nhaomingguan.com\nhaommn.com\nhaomo-tech.com\nhaomove.com\nhaomzl.com\nhaonames.com\nhaonic.com\nhaoniu1.com\nhaonongzi.com\nhaooyuan.com\nhaopeixun.com\nhaoqdl.com\nhaoqiao.com\nhaoqihb.com\nhaoqikan.com\nhaoqiutiyu.com\nhaoqixingstem.com\nhaoqu.net\nhaoqu99.com\nhaoqun.vip\nhaoranbio.com\nhaorantech.com\nhaorc.com\nhaoread.com\nhaoreagent.com\nhaorencai.net\nhaorooms.com\nhaoruanmao.com\nhaoruo.com\nhaosd.com\nhaoseals.com\nhaosedaohang.com\nhaosenchina.com\nhaoservice.com\nhaosf.com\nhaosf.net\nhaoshangqi.com\nhaoshanxi.com\nhaosheng168.com\nhaoshengmall.com\nhaoshengyin.org\nhaoshenqi.com\nhaoshici.com\nhaoshifamen.com\nhaoshipin123.com\nhaoshiqi.net\nhaoshsh.com\nhaoshuaji.com\nhaoshudi.com\nhaoshun666.com\nhaoshunjia.com\nhaoshunjx.com\nhaoshuntm.com\nhaoshuo.com\nhaoshuyou.net\nhaoshuyun.com\nhaositone.com\nhaosix.com\nhaoso.com\nhaosou.com\nhaosou.net\nhaosou123.com\nhaoss.vip\nhaost.com\nhaostay.com\nhaosulu.com\nhaote.com\nhaotengly.com\nhaotgame.com\nhaotianhuyu.com\nhaotihui.com\nhaotijin.com\nhaoting.com\nhaotm.com\nhaotonggg.com\nhaotoufa.com\nhaotougao.com\nhaotougu.com\nhaotoys.com\nhaott.com\nhaotu3.com\nhaotui.com\nhaotyn.com\nhaouc.com\nhaowa.com\nhaowaicaijing.com\nhaowallpaper.com\nhaowandeni.com\nhaowang.shop\nhaowangjiaohospital.com\nhaowangpu.com\nhaowanma.info\nhaowanok.com\nhaowanyou.com\nhaowen100.com\nhaowenbo.com\nhaowenshi.com\nhaowu.com\nhaowu.link\nhaowuguo.com\nhaowusong.com\nhaowuyunji.com\nhaoxg.net\nhaoxiana.com\nhaoxiangmachine.com\nhaoxiangyundong.com\nhaoxiaoguo.net\nhaoxingchen.com\nhaoxingcn.com\nhaoxingroup.com\nhaoxinpinggu.com\nhaoxintaikj.com\nhaoxipu.com\nhaoxitong.com\nhaoxiu.net\nhaoxiyou.com\nhaoxue.com\nhaoxue360.com\nhaoxueche.com\nhaoxuee.com\nhaoxyx.com\nhaoyangmao18.com\nhaoyao.com\nhaoyao163.com\nhaoyaofs.com\nhaoyaogo.com\nhaoychuang.com\nhaoyetaoci.com\nhaoyintong123.com\nhaoyisheng.com\nhaoyishu.com\nhaoyong.cc\nhaoyou666.com\nhaoyouidc.com\nhaoyouqian.com\nhaoyouxi.cc\nhaoyouyinxiang.com\nhaoyuanxiao.com\nhaoyue.com\nhaoyue28.com\nhaoyuepu.com\nhaoyun.life\nhaoyun13.com\nhaoyun56.com\nhaoyunbb.com\nhaoyunlaisz.com\nhaoyunlawyer.com\nhaoyunma.com\nhaoyuntech.com\nhaoyunwuyou.com\nhaoyusw.com\nhaozai120.com\nhaozaishop.com\nhaozhai.com\nhaozhanhui.com\nhaozhebao.com\nhaozhexie.com\nhaozhihs.com\nhaozhougroup.com\nhaozhuan.vip\nhaozhuangji.com\nhaozhuji.net\nhaozi.net\nhaozi.xyz\nhaozip.com\nhaozjj.com\nhaozke.com\nhaozongjie.com\nhaozu.com\nhaozuojia.com\nhapco-cn.com\nhapg-hitachi.com\nhapi123.net\nhapids.com\nhapingapp.com\nhapjs.org\nhaplat.net\nhappi123.com\nhappigo.com\nhappiness9999.com\nhappy-ti.com\nhappy-vpn.com\nhappy88.com\nhappycodeboy.com\nhappycoding.online\nhappydino.com\nhappyelements.com\nhappyeo.com\nhappyet.org\nhappyev.com\nhappyhlddz.com\nhappyjuzi.com\nhappykb.com\nhappykey6.com\nhappylivelife.com\nhappymmall.com\nhappynic.com\nhappypingpang.com\nhappyplaygame.net\nhappysky.org\nhappystudy.cc\nhappytimenet.com\nhappyvalley.link\nhappywalk.net\nhappyya.com\nhapying.com\nhaqu.com\nhaquan.cc\nharbin-electric.com\nharbin123.com\nharborhousehome.com\nharbourmooc.com\nhardcc.com\nhardcoresir.net\nhardhard.work\nhardkr.com\nhardspell.com\nhardware114.com\nhareonsolar.com\nhariogame.com\nharj120.com\nharleyydavidsale.shop\nharmay.com\nharmight.com\nharmony-et.com\nharmony3.com\nharmony4s.com\nharmonyos.com\nharmonywatch.com\nharmyy.com\nharog.net\nharpost.com\nharpping.com\nharryhorsemedia.com\nharrynull.tech\nharrypottermagicawakened.com\nharseen.com\nharsom.com\nhart-worldwide.com\nharvestcm.com\nharvesthanger.com\nharworld.com\nharworld.work\nharzone.com\nhasaf.com\nhasbyk.com\nhasco-group.com\nhasea.com\nhasee.com\nhasee.net\nhasen-cn.com\nhashnest.com\nhashyrmyy.com\nhasivo.com\nhaskqyy.com\nhasoltd.com\nhaspig.com\nhassbian.com\nhassfull.com\nhasstatic.com\nhastenpharma.com\nhasuhasu.com\nhatanggame.com\nhatangqp.com\nhatangyx.com\nhatelifu.club\nhatfav.com\nhatjedu.com\nhatlonely.com\nhatoem.com\nhatro.cc\nhatter.ink\nhaval-global.com\nhave.ink\nhavefun.im\nhavevisa.com\nhavewo.com\nhawagame.com\nhawanyx.com\nhawbel.com\nhaweigroup.com\nhawjob.com\nhawjwl.com\nhawkaoe.net\nhawkeye.fun\nhawkfilter.com\nhawkhai.com\nhawtaimotor.com\nhaxdjx.com\nhaxm.com\nhaxwx.cc\nhayao.com\nhayaoym.com\nhayge.com\nhaygo.com\nhayi.cc\nhayseen.com\nhazp.net\nhazpw.org\nhazq.com\nhb-163.com\nhb-ecloud.com\nhb-gjj.com\nhb-green.com\nhb-hengda.com\nhb-jn.com\nhb-ly.com\nhb-sx.net\nhb-water.com\nhb-ws.com\nhb-xydq.com\nhb-young.com\nhb0561.com\nhb0771.com\nhb10000.com\nhb10000sale.com\nhb1000kv.com\nhb110.cc\nhb12333.com\nhb191.com\nhb2h.com\nhb30.com\nhb3rm.com\nhb500.com\nhb56.cc\nhb96369.com\nhb96568.com\nhbaas.com\nhbaec.com\nhbafa.com\nhbafxh.org\nhbahyy.com\nhbairport.com\nhbanbao.com\nhbaog.com\nhbapia.vip\nhbasstu.net\nhbbaidu.com\nhbbfyfy.com\nhbbidcloud.com\nhbbidding.com\nhbblxb.com\nhbbmjd.com\nhbbnqy.com\nhbbrgd.com\nhbbst99.com\nhbbsw.vip\nhbbutler.com\nhbbwg.net\nhbbxpx.com\nhbbyb.com\nhbbzyys.org\nhbca110.com\nhbcbly.com\nhbccp.org\nhbccpit.org\nhbcdc.com\nhbcdyz.com\nhbcg.cc\nhbchen.com\nhbchufeng.com\nhbcjh.net\nhbcjkcfwjt.com\nhbcjlq.com\nhbcjw.com\nhbcjxx.com\nhbcl.ltd\nhbclgg.com\nhbcljyc.com\nhbclqcw.com\nhbcoal.com\nhbcof.com\nhbcofco.com\nhbcourt.org\nhbct-wiremesh.com\nhbctgs.com\nhbcthotels.com\nhbctic.com\nhbctjk.com\nhbctjt.com\nhbcwt.com\nhbcxpm.com\nhbcyclub.com\nhbcydlqc.com\nhbcyyy.com\nhbdangyang.com\nhbdckj.com\nhbddjt.com\nhbddrn.com\nhbdefon.com\nhbdfmlw.com\nhbdjcc.com\nhbdjk.com\nhbdmia.com\nhbdschem.com\nhbdssb.com\nhbdtjqj.com\nhbdx-kdyy.com\nhbdzcg.com\nhbdzky.com\nhbdzxx.com\nhbeda.org\nhbedky.com\nhbeducloud.com\nhbeeia.com\nhbekt.com\nhbema.net\nhbepec.com\nhbfesco.com\nhbfie.org\nhbfintech.com\nhbfootball.com\nhbfoundry.org\nhbfqyjt.com\nhbfsh.com\nhbfy.com\nhbfybj.com\nhbfyhb.com\nhbfzb.com\nhbg66.club\nhbgajg.com\nhbgbdst.com\nhbgcxj.com\nhbgdsfy.com\nhbgdwl.com\nhbgis.org\nhbgj-3.com\nhbgj.com\nhbgk.net\nhbglky.com\nhbglobal.com\nhbgr.net\nhbgrb.net\nhbgroups.com\nhbgsetc.com\nhbgswl.com\nhbgwy.org\nhbgydxw.com\nhbgzh.com\nhbha027.com\nhbhaolinju.com\nhbhcdn.com\nhbhcgt.com\nhbhdhd.com\nhbhjrzzl.com\nhbhm.net\nhbhml.com\nhbhmxx.com\nhbhongrunxwy.com\nhbhqzyc.com\nhbhtcm.com\nhbhtgroup.com\nhbhtxx.com\nhbhuamei.com\nhbhuipu.com\nhbhxbb.com\nhbhxgroup.com\nhbhyychem.com\nhbhz.net\nhbiclqc.com\nhbicpa.org\nhbidc.net\nhbifeng.com\nhbinitiate.com\nhbipdc.com\nhbisco.com\nhbisv.com\nhbitg.com\nhbjbjt.net\nhbjcgjg.com\nhbjcgy.com\nhbjcxy.com\nhbjdxt.com\nhbjgwl.com\nhbjhc.com\nhbjhkfcyy.com\nhbjhpx.com\nhbjia.net\nhbjinnong.com\nhbjinshenglan.com\nhbjir.com\nhbjjrb.com\nhbjk114.com\nhbjkjt.com\nhbjmcjjt.com\nhbjmyljs.com\nhbjob88.com\nhbjomay.com\nhbjpim.com\nhbjsinfo.com\nhbjsxg.com\nhbjtfwxh.com\nhbjtjsjt.com\nhbjttz.com\nhbjtwljtyxgs.com\nhbjtwlpt.com\nhbjtzb.com\nhbjubao.com\nhbjxad.com\nhbjxjy.org\nhbjxjyw.com\nhbjxym.com\nhbjy.net\nhbjyjmzg.com\nhbjzgw.com\nhbjzxh.com\nhbjzzx.com\nhbkggroup.com\nhbkgy.com\nhbkj-sic.com\nhbklsl.com\nhbkqw.com\nhbksw.com\nhbky.com\nhbkyby.com\nhbkzw.com\nhblbjg.com\nhblccy.com\nhblds.com\nhbldwx.com\nhblhfrp.com\nhblhnykj.com\nhbliti.com\nhblq.com\nhblszzyy.com\nhbltyh.com\nhbltzb.com\nhbltzx.com\nhblxxx.com\nhblynk.com\nhbm360.com\nhbmajiang.com\nhbmchina.com\nhbmes.com\nhbmingjie.com\nhbmmtt.com\nhbn68.com\nhbnews.net\nhbnewsoft.com\nhbneww.com\nhbnfxm.com\nhbnholdings.com\nhbnxb.net\nhbnyfzjt.com\nhbnz.net\nhbomick.com\nhbooker.com\nhboxs.com\nhbpangu.net\nhbpch.com\nhbpengxi.com\nhbpic5.com\nhbpictures.com\nhbppa.org\nhbpryy.com\nhbptzsbw.com\nhbpukang.com\nhbpvc.com\nhbpx.net\nhbqcxy.com\nhbqingteng.com\nhbqmys.com\nhbqndc.com\nhbqtgg.com\nhbqydz.com\nhbqyxy.com\nhbr-caijing.com\nhbrbmedia.com\nhbrc.com\nhbrchina.org\nhbrchinese.org\nhbrcxcl.com\nhbrd.net\nhbrdt.com\nhbrebond.com\nhbrfxh.com\nhbriso.com\nhbrmhospital.com\nhbrsks.co\nhbrsks.net\nhbrsksw.com\nhbruiao.com\nhbruicai.com\nhbrunfeng.com\nhbrunlin.com\nhbryzx.net\nhbrzkj.com\nhbs-nd.com\nhbscd.com\nhbsczx.com\nhbsczzxy.com\nhbsdenterprise.com\nhbseasky.com\nhbsfdx.com\nhbsfedu.com\nhbsfjtgs.com\nhbsgsq.com\nhbshanhe.com\nhbshengbangwl.com\nhbshgzx.com\nhbshichang.com\nhbshls.com\nhbshunda.com\nhbsia.org\nhbsjym.com\nhbsjzyxh.com\nhbskw.com\nhbslft.com\nhbslndx.com\nhbslxzx.com\nhbsmservice.com\nhbsmtxh.com\nhbsmwljt.com\nhbsql.com\nhbsrjt.com\nhbsrjyy.com\nhbssfw.com\nhbssttz.com\nhbsszx.com\nhbstars.com\nhbsti.com\nhbstoo.com\nhbsunlink.com\nhbswjt.com\nhbswkj.com\nhbswmyyxgs.com\nhbsxkyy.com\nhbsxly.com\nhbsxwljt.com\nhbsxzjw.com\nhbsygw.com\nhbsz120.com\nhbszbykj.com\nhbszfw.com\nhbszjsjt.com\nhbszlcc.com\nhbszsv.com\nhbsztv.com\nhbszxyjhyy.com\nhbszzk.com\nhbszzx.com\nhbtcmu.com\nhbtcw.com\nhbtea.com\nhbtengniu.com\nhbtjryp.com\nhbtlh.com\nhbtljg.com\nhbtmjt.com\nhbtobacco.com\nhbtqzx.com\nhbtvc.com\nhbtycp.com\nhbtycyjt.com\nhbtyxh.com\nhbun.net\nhbvtc.net\nhbwanhao.com\nhbwanrun.com\nhbweid.com\nhbwenchang.com\nhbwh.net\nhbwhcyw.com\nhbwhcyxh.com\nhbwhexpo.com\nhbwhjj.com\nhbwjs.com\nhbwljm.com\nhbwlykt.com\nhbwsrc.net\nhbwuxue.com\nhbwuye.com\nhbww.org\nhbxcw.com\nhbxdf.com\nhbxgzls.com\nhbxhfc.com\nhbxhxkj.com\nhbxinfadi.com\nhbxingchi.com\nhbxmcy.com\nhbxot.com\nhbxtzx.com\nhbxtzy.com\nhbxxy.com\nhbxyjob.com\nhbxytc.com\nhbyangyuan.com\nhbyczk.com\nhbydsg.com\nhbydsy.com\nhbyh0561.com\nhbyhfcyy.com\nhbyidu.com\nhbyisen.com\nhbyjfs.com\nhbylgov.com\nhbyljf.com\nhbylzx.com\nhbymfswz.com\nhbynet.net\nhbyouyunyouke.com\nhbyoyo.com\nhbyqtl.com\nhbysfhm.com\nhbyt56.com\nhbyuanhao.com\nhbyunxi.net\nhbyunyang.net\nhbyybwff.com\nhbyysw.com\nhbzaxh.com\nhbzbw.com\nhbzcpg.com\nhbzgjx.com\nhbzh.net\nhbzhan.com\nhbzhjxzz.com\nhbzhonghai.com\nhbzjjk.com\nhbzjrx.com\nhbzjzb.com\nhbzknet.com\nhbzkw.com\nhbzkzxw.com\nhbzm.cc\nhbzmw.com\nhbzncz.com\nhbzqzx.com\nhbzsb.com\nhbzst.com\nhbzszy.net\nhbztn.com\nhbzuojia.com\nhbzyjsjt.com\nhbzzzzw.com\nhc-byq.com\nhc-cdn.com\nhc-overseas.com\nhc-ph.com\nhc-software.com\nhc-sre.com\nhc-testing.com\nhc01.com\nhc121.com\nhc12306.com\nhc23.com\nhc360.com\nhc376.com\nhc39.com\nhc3yy.com\nhc6756.com\nhc79.com\nhc943.com\nhca258.com\nhcaj.com\nhcazb.com\nhcbbs.com\nhcbnjy.com\nhcbuy.com\nhcbyq.com\nhcc11.com\nhcccia.com\nhccenter.net\nhcciot.com\nhcclhealthcare.com\nhccoeutg.com\nhccpcba.com\nhcdamai.com\nhcdyhr.com\nhceia.com\nhcepay.com\nhcfac888.com\nhcfc168.com\nhcftyy.com\nhcgaokong.com\nhcgbhq.com\nhcglzj.com\nhcgroup.com\nhcgtravels.com\nhch518.com\nhchbblg.com\nhchbsb.com\nhchezhu.com\nhchik.com\nhchina.com\nhchlidc.com\nhchliot.com\nhchongren.com\nhcicloud.com\nhcinfo.tech\nhcj1952.com\nhcjike.com\nhcjt.cc\nhckg.com\nhckj.org\nhclonely.com\nhclouder.com\nhcmiraefund.com\nhcmofen.com\nhcnaimo.com\nhcpharm.com\nhcqixinhb.com\nhcqxbj.com\nhcrlm.com\nhcschengtou.com\nhcsd123.com\nhcsdhgjzx.com\nhcsemitek.com\nhcshangwu.com\nhcsilk.com\nhcsjddc.com\nhcsound.com\nhcswgx.com\nhcsyjt.com\nhct-test.com\nhctxf.org\nhcty.com\nhctzbj.com\nhcvac.com\nhcwebsite.com\nhcwh.ltd\nhcwhjd.com\nhcwiki.com\nhcwljy.com\nhcx123.com\nhcx99.com\nhcxcw.com\nhcxfjq.com\nhcxwdb.com\nhcxxy.com\nhcxy6.com\nhcyacg.com\nhcydit.com\nhcyea.com\nhcykt.com\nhcypzy.com\nhczc.com\nhczfgjj.com\nhczl.com\nhczm1.com\nhczq.com\nhczr.com\nhczs.com\nhczsbj.com\nhczshb.com\nhczxmr.com\nhczyw.com\nhczzw.com\nhd-english.com\nhd-english.net\nhd-mw.com\nhd-tvb.com\nhd-u.com\nhd.gg\nhd027.com\nhd123.com\nhd123.net\nhd12333.com\nhd199.com\nhd199.net\nhd2h.com\nhd3p.com\nhd88.cc\nhd8y.com\nhdabc.com\nhdanc.com\nhdanheng.com\nhdarea.club\nhdavchina.com\nhdb.com\nhdbaichuan.com\nhdbgjt.com\nhdbp.com\nhdbus.net\nhdbz.net\nhdcms.net\nhdcy123.com\nhdd-group.com\nhddata.net\nhddgood.com\nhddid.com\nhddlion.com\nhddznet.com\nhdeexpo.com\nhdeso.com\nhdfax.com\nhdfimg.com\nhdfybjy.com\nhdgetters.com\nhdh.im\nhdhjtz.com\nhdhosp.com\nhdhospital.com\nhdhui.com\nhditec.com\nhdj.me\nhdjad.com\nhdjingwei.com\nhdjt.net\nhdjwj.com\nhdjx.org\nhdjxpx.com\nhdkcsjxh.com\nhdks.net\nhdksjp.com\nhdkwa.com\nhdkylin.work\nhdl-watch.com\nhdlcdns.com\nhdlchina.com\nhdletv.com\nhdlogo.com\nhdlstage.com\nhdlsxh.com\nhdltest.com\nhdlzmdb.com\nhdmiaoc.com\nhdmnw.com\nhdmooncake.com\nhdmryy.com\nhdmtv168.com\nhdmv.org\nhdnd01.com\nhdnychina.com\nhdp88.com\nhdph.com\nhdpyqa.com\nhdpyqc.com\nhdpyqd.com\nhdpyqf.com\nhdqyf.club\nhdrcw.com\nhdsay.net\nhdschina.com\nhdschools.org\nhdsdyyy.com\nhdslb.com\nhdslb.net\nhdslb.org\nhdsmgw.com\nhdtgtm.com\nhdtonghe.com\nhdtyre.com\nhduofen.com\nhdurl.me\nhdw99.com\nhdwbcloud.com\nhdwbsaas.com\nhdwebpyqa.com\nhdwebpyqc.com\nhdwebpyqe.com\nhdwjc.com\nhdwtpay.com\nhdwzz.com\nhdxing.net\nhdxweb.com\nhdxxg.com\nhdxxw.com\nhdxynet.com\nhdyanke.com\nhdyouxi.com\nhdyu.com\nhdyujiu.com\nhdyxgame.com\nhdyxi.com\nhdyy95.com\nhdyzsw.com\nhdzbgs.com\nhdzc.com\nhdzc.net\nhdzcwlian.com\nhdzp.com\nhdzp.net\nhdzuoye.com\nhdzxyy.com\nhe-edu.com\nhe-ku.com\nhe-one.com\nhe17.com\nhe1j.com\nhe29.com\nhe2d.com\nheacn.net\nhead-way.com\nheadconsultant.com\nheader.cc\nheading123.com\nheadingfilter.com\nheadphoneclub.com\nheadscm.com\nheag.com\nhealforce.com\nhealrna.com\nhealth-china.com\nhealth-foru.asia\nhealthan.net\nhealthbbs.net\nhealthcareol.net\nhealthcareyun.com\nhealthcn.com\nhealthgv.com\nhealthjd.com\nhealthr.com\nhealthybaike.com\nhealthych.com\nhealthydigitallife.com\nhealzentx.com\nheanyo.com\nhearfly.com\nhearstchina.com\nheart-game.com\nheartide.com\nheartinsti.com\nheartxin.com\nheating-sh.com\nheatingtrace.com\nheavenlywind.cc\nheavenonearthhealingalternatives.com\nheavly1.com\nhebangdianzi.com\nhebbank.com\nhebbc.org\nhebbr.com\nhebca.com\nhebcar.com\nhebecc.com\nhebeeb.com\nhebei.cm\nhebeieb.com\nhebeifanlin.com\nhebeifc.com\nhebeifeimeng.com\nhebeigwy.org\nhebeihazhi.com\nhebeihualang.com\nhebeijd.com\nhebeijia.com\nhebeijiaxin.com\nhebeilyxh.com\nhebeiminglan.com\nhebeimutian.com\nhebeinongzi.com\nhebeisaixin.com\nhebeishifei.com\nhebeishuangning.com\nhebeisia.com\nhebeitongtai.com\nhebeiwl.net\nhebeiwulian.com\nhebeiyouxi.com\nhebeizuqiu.net\nheben-eng.com\nhebetextile.com\nhebgcdy.com\nhebgsetc.com\nhebgtjt.com\nhebi99.com\nhebiia.org\nhebimalasong.com\nhebinhospital.com\nhebisf.com\nhebitv.com\nhebiw.com\nhebjxw.com\nhebjy.com\nhebkjs.com\nhebl.name\nhebmj.com\nhebmusic.com\nhebngc.com\nhebnx.com\nhebolaw.com\nhebooming.com\nhebotc.com\nhebpi.com\nhebpolicycube.com\nhebradio.com\nhebsg.net\nhebshanggu.com\nhebtig.com\nhebtv.com\nhebwlfdc.com\nhebxakj.com\nhebxyjt.com\nhebyjxh.com\nhebzd.com\nhebzhy.com\nhebzljx.com\nhec-al.com\nhec-changjiang.com\nhecaijing.com\nhecdn.com\nhecdn.net\nhechaji.com\nhechanghuyu.com\nhechangshipin.com\nhechangtech.com\nhechengeco.com\nhechiguotou.com\nhechijinxin.com\nhechuang.info\nhechuangxinxi.xyz\nhechuann.com\nheclife.com\nheclouds.com\nhecoe.com\nhecpharm.com\nhedaoapp.com\nhedaozi.com\nhedasudi.com\nhedaweb.com\nhedgehogbio.com\nhedgehogrock.com\nhedlaonga.com\nhedongli.com\nhedpump.com\nhedu.net\nheduibu.com\nheduismart.com\nhedysx.com\nheec.com\nheeeeeh.com\nheeeepin.com\nheemoney.com\nheenee.com\nheepay.com\nheerit.com\nhefagear.com\nhefei.cc\nhefeifc.com\nhefeilaws.com\nhefeimarathon.com\nheflc.com\nhefls.net\nhefunoodles.com\nhegii.com\nhegouvip.com\nhegsryjq.com\nhehagame.com\nhehang.net\nhehecam.com\nhehecamera.com\nhehejin.com\nhehesheng.com\nheheshouyou.com\nhehesy.com\nhehewan.com\nheheyx.com\nhehooo.com\nhehouse.com\nhehuapei.com\nhei.red\nheibai.net\nheibaicao.com\nheibaige.com\nheibailianmeng.com\nheibaimeng.com\nheibaixiaoyuan.com\nheibandongcha.com\nheibanwa.mobi\nheibaow.com\nheibaowuliu.com\nheibian.com\nheicha.com\nheicheng51.com\nheidaren.com\nheidiankeji.com\nheigaga.com\nheightindustry.com\nheiguang.com\nheiguang.net\nheiha.net\nheihei.com\nheiheiyuyin.com\nheihekeji.com\nheijiao.net\nheijiaovip.com\nheike07.com\nheilanhome.com\nheilei.com\nheilifun.com\nheilongjianggames.com\nheiluo.com\nheima010.com\nheima8.com\nheimabao.com\nheimac.net\nheimadao.com\nheimadata.com\nheimai666.com\nheimajijin.com\nheimalanshi.com\nheimaoseo.org\nheimaoseojishu.com\nheimaoshe.com\nheimaying.com\nheimeiai.com\nheimeng.net\nheimizhou.com\nheiniubao.com\nheiniufeiye.com\nheinote.com\nheinw.com\nheirenlei.com\nheisha.net\nheishao.net\nheishenhua.com\nheishou.org\nheistbeer.com\nheitao.com\nheitao2014.com\nheitaosan.com\nheitiane123.com\nheitu.com\nheitukeji.com\nheiwahospital.com\nheiwangke.net\nheixi.com\nheiyan.com\nheiyan.org\nheiyange.com\nheiyanimg.com\nheiying.cc\nheiyu.cc\nheiyu.space\nheiyunxitong.com\nheizhushoes.com\nhejia-china.com\nhejiang.com\nhejiangroup.com\nhejiantech.com\nhejichip.com\nhejicut.com\nhejin588.com\nhejujk.com\nhejun.com\nhejxf.com\nheketai.com\nhekouxin.com\nheku.org\nhel168.com\nhelensbar.com\nheliang.cc\nhelianhealth.com\nhelianwap.com\nhelichina.com\nheliforklift.com\nhelight.info\nhelijia.com\nhelingqi.com\nhelipay.com\nhelishun.com\nhelitzc.com\nheliuyan.com\nhello-fpga.com\nhello-inc.com\nhello1010.com\nhello123.com\nhellobanma.com\nhellobike.com\nhellobiye.com\nhellocq.com\nhellocq.net\nhellodive.com\nhellof1.com\nhelloflask.com\nhellogame.net\nhellogithub.com\nhellogitlab.com\nhelloglobal.com\nhellogroup.vip\nhellogslb.com\nhellohnb.com\nhellohuohu.com\nhelloimg.com\nhelloinstruments.com\nhellojava.com\nhellokid.com\nhellokidvip.com\nhellomeowlab.com\nhellomida.com\nhellonitrack.com\nhellopcb.com\nhellorf.com\nhellostreetcat.com\nhellotalk8.com\nhellotw.com\nhellotyping.com\nhelloweba.com\nhelloweba.net\nhellowebfont.com\nhellowgame.com\nhelloworld.net\nhelloxjn.com\nhelloxkb.com\nhelloyao.com\nhelmicro.com\nhelmtower.com\nhelnon.com\nhelo11.com\nhelohub.com\nhelp-w.com\nhelpmeng.com\nhelpmepick.net\nhelps.live\nhelpson.com\nhelpton.com\nhelptousa.com\nhelpweixin.com\nhelunyun.com\nheluowenhua.net\nhelywin.com\nhema.ren\nhema.wiki\nhemahuashi.com\nhemaish.com\nhemajs.com\nhemamax.com\nhemanc.com\nhemanzi.com\nhemaos.com\nhemaread.com\nhemaxiaofen.com\nhemayouxi.com\nhemayouxi.net\nhemayun.com\nhemayx.com\nhemetal.com\nhempelgroup.com\nhen360.com\nhenai.com\nhenaiwan.com\nhenan100.com\nhenanart.com\nhenanbojin.com\nhenance.com\nhenanfucai.com\nhenangames.com\nhenaninfo.com\nhenanjianling.com\nhenanjiqiren.com\nhenanjubao.com\nhenanrc.com\nhenansha.com\nhenanshengtang.com\nhenansyj.com\nhenanxinjiang.com\nhenanyikayi.com\nhenanyixue.com\nhenanzhida.com\nhenanzhulongjx.com\nhenanzsb.com\nhenau.net\nhenbt.com\nhencin.com\nhencoder.com\nhendera.com\nhenduofang.com\nheng-f.com\nheng98.com\nhengan-instruments.com\nhengansl.com\nhengaodebj.com\nhengbao.com\nhengbaochuju.com\nhengbinzl.com\nhengbogroup.com\nhengchangda.com\nhengdafilm.com\nhengdafuji.com\nhengdawenbo.com\nhengdaxincai.com\nhengdayun.com\nhengdeegroup.com\nhengdian.com\nhengdianfilm.com\nhengdianworld.com\nhengdrive.com\nhengdulaw.com\nhengfang.com\nhengfasd.com\nhengfengtires.com\nhengfujz.com\nhenggufood.com\nhenghe-group.com\nhenghe666.com\nhenghengmao.com\nhenghongjixie.com\nhengjiafish.net\nhengjianyy.com\nhengjiatouzi.com\nhengjiecdn.com\nhengjiu-pt.com\nhengjixiaofang.com\nhengkun.com\nhengli.com\nhengliguoji.com\nhenglihotels.com\nhengqian.com\nhengqifeng.com\nhengqijy.com\nhengqikuaiji.com\nhengqinmarathon.com\nhengrui.com\nhengruisensor.com\nhengshan01.com\nhengshanpharm.com\nhengshengpark.com\nhengshuilaobaigan.net\nhengshuiyake.com\nhengtai-law.com\nhengtaiboyuan.com\nhengtiansoft.com\nhengtianyun.com\nhengtonggf.com\nhengtonggroup.com\nhengtonglog.com\nhengtongzhineng.com\nhengxiangtaji.com\nhengxinjinshu.com\nhengxinyongli.com\nhengxucapital.com\nhengxueedu.com\nhengyagongshui.com\nhengyan.com\nhengyankeji.com\nhengyemould.com\nhengyi.com\nhengyimining.com\nhengyishihua.com\nhengyoux.com\nhengyu.work\nhengyuansilk.com\nhengyuanzn.com\nhengyudata.com\nhengyuefund.com\nhengyulighting.com\nhenha.com\nhenhaoji.com\nhenku.com\nhenkuai.com\nhenkung.com\nhenlius.com\nhenluoli.com\nhenmimang.com\nhenningchem.com\nhenovcom.com\nhenrayglass.com\nhenri.ren\nhensctai.com\nhensgroup.com\nhenzan.com\nhenzanapp.com\nheodoraiu.com\nhepalink.com\nhepan.com\nhepan.org\nhepartshome.com\nhepatox.org\nhepingdao.net\nhepmall.com\nhepost.com\nhepu123.com\nhepurc.com\nhepuwang.com\nhepuweilai.com\nhepuxw.com\nheqingloong.com\nhercity.com\nhercules-logistics.com\nhercules-micro.com\nherdacdn.com\nherdar.com\nherdcloud.com\nherdpcdn.com\nherdsric.com\nhere120.com\nhere325.com\nherecdn.com\nheredlift.com\nherenit.com\nherllamo-med.com\nherllamo.com\nhermod1.com\nhero-geek.com\nhero.com\nherocoming.com\nheroesports.com\nherogame.com\nherohr.net\nheroic-ltd.com\nheroje.com\nheroone.com\nherosanctuary.com\nheroskate.com\nherostart.com\nheroworld.net\nherrel.com\nherrywatch.com\nherstime.com\nherta.space\nherton.net\nhertzhu.com\nheryipharma.com\nheshanghuitong.com\nheshdity.com\nheshecasa.com\nheshimilk.com\nheshui.com\nheshuyun.com\nheson10.com\nhesongwang.com\nhesppe.com\nhessianhealth.com\nhestudio.net\nheta.tech\nhetaigroup.net\nhetaixin.com\nhetao101.com\nhetaoa.com\nhetaoapis.com\nhetaobiancheng.com\nhetaodaxue.com\nhetaointernal.com\nhetaolin.com\nhetaousercontent.com\nhetaoxingqiu.com\nhetianlab.com\nhetianyu.cc\nhetongamp.com\nhetunzu.com\nhetusoft.com\nheu8.com\nheungkong.com\nheupxtct.work\nheuvan.com\nhewaner.com\nhewascreen.com\nheweather.com\nheweather.net\nhewebgl.com\nheweifurniture.com\nhewukeji.com\nhexaamc.com\nhexagonsemi.com\nhexchip.com\nhexdo.com\nhexgears.com\nhexi-electric.com\nhexian.ltd\nhexianbbs.com\nhexiangroup.com\nhexianrc.com\nhexiaoxiang.com\nhexicomtech.com\nhexie.cc\nhexieshaanxi.com\nhexilai.com\nhexin-puleather.com\nhexinchemical.com\nhexindai.com\nhexinli.org\nhexinwanjia.com\nhexiny.com\nhexinyu.com\nhexmeet.com\nhexsen.com\nhextower.com\nhexun.com\nhexun.com.tw\nhexuncaizhi.com\nhexuu.com\nheyang.cc\nheyang365.com\nheycan.com\nheycloudy.co\nheycode.com\nheycomrades.com\nheycross.com\nheycsm.com\nheydayinfo.com\nheygears.com\nheyi.com\nheyiguangye.com\nheyiguoyuan.com\nheyimiao.com\nheyingcn.com\nheyingedu.com\nheyinshiliu.com\nheyix.com\nheymeo.net\nheymeowfm.com\nheymore.com\nheyou51.com\nheyplus.com\nheyria.com\nheytap.com\nheytapcloud.com\nheytapcs.com\nheytapdownload.com\nheytapimage.com\nheytapmobi.com\nheytapugc.com\nheytea.com\nheythings-iot.com\nheytime.com\nheyuanstone.com\nheyuanxw.com\nheyuedi.com\nheyun100.com\nheyunnet.com\nheywhale.com\nheywoodsminiprogram.com\nheyyo.com\nhez70.com\nheze.cc\nhezebus.com\nhezegd.com\nhezejob.com\nhezejtjt.com\nhezelawyers.org\nhezepharm.com\nhezeribao.com\nhezeswjt.com\nhezhidongli.com\nhezhong-china.com\nhezhongyihua.com\nhezhouhuatong.com\nhezhoujcy.com\nhezi.com\nhezibook.com\nhezijia.com\nhezimi.com\nhezongyy.com\nhezuvip.com\nhf-alu.com\nhf-aw.com\nhf-iflysse.com\nhf0779.com\nhf10000.com\nhf12345.vip\nhf168.net\nhf365.com\nhf3owy4.sbs\nhf777.com\nhf960.com\nhfabiao.com\nhfairport.com\nhfanss.com\nhfbaogao.com\nhfbaozi.com\nhfbcjt.com\nhfbeta.com\nhfbtv.com\nhfbz.com\nhfcentury.com\nhfchosp.com\nhfchzyy120.com\nhfcsbc.com\nhfdaoyuan.com\nhfdsgs.com\nhfeec-tencentclb.cloud\nhfeec-tencentclb.com\nhfeec-tencentclb.net\nhfeec-tencentclb.work\nhffhq.com\nhffoil.com\nhffund.com\nhffy.com\nhfgcxx.com\nhfgdjt.com\nhfgip.com\nhfgjj.com\nhfgxbus.com\nhfhm.com\nhfhouse.com\nhfhuamei.com\nhfi-health.com\nhfish.net\nhfjnxh.com\nhfjscn.com\nhfjsj.com\nhfjtjt.com\nhfjxwz.com\nhfjzzsxh.com\nhfkeheng.com\nhfkenfan.com\nhfkjsd.com\nhfkktt.com\nhfksmdl.com\nhflbysm.com\nhfleda.net\nhflengku.com\nhflp88.com\nhflube.com\nhfly.net\nhflz.com\nhfmama.com\nhfmdzx.com\nhfmt.net\nhfmxs.com\nhfnuola.com\nhfoj.net\nhfplg.com\nhfpx.cc\nhfqgmagnet.com\nhfqinhang.com\nhfray.com\nhfrc.net\nhfrcbc.com\nhfrsggff.com\nhfsava.com\nhfshec.com\nhfsia.com\nhfsid.com\nhfspxh.com\nhfssw.com\nhfsszgcxh.com\nhfswcz.com\nhft-sz.com\nhftfund.com\nhfthink.com\nhftogo.com\nhftsoft.com\nhftx-jt.com\nhfw.cc\nhfx.net\nhfxczj.com\nhfyestar.com\nhfykd.com\nhfykt.com\nhfyouqi.com\nhfyt365.com\nhfyuqin.com\nhfyyhyxh.com\nhfyylcy.com\nhfzfzlw.com\nhfzhengxu.com\nhfzjxh.com\nhfzkgw.com\nhfzls.com\nhfzssw.com\nhg-automation.com\nhg-capacitor.com\nhg-daigou.com\nhg-valves.com\nhg1218.com\nhg12333.com\nhg5177.com\nhg568.com\nhg8880.org\nhg9895.com\nhga994.com\nhgaas.com\nhgame.com\nhgcapsule.com\nhgcha.com\nhgchess.com\nhgcitech.com\nhgepc.com\nhgfdrf.com\nhghngroup.com\nhghsd.com\nhgicreate.com\nhgimage.com\nhgitv.com\nhgj.com\nhgj668.com\nhgjart.com\nhgjl.net\nhgjob.com\nhgk-group.com\nhglaser.com\nhgmai.com\nhgmri.com\nhgnc.net\nhgo06070uyi.com\nhgo06071uyi.com\nhgo06080uyi.com\nhgo06081uyi.com\nhgo06090uyi.com\nhgo06091uyi.com\nhgo06101uyi.com\nhgo06111uyi.com\nhgobox.com\nhgoqi.com\nhgptech.com\nhgqizhong.com\nhgqrx.com\nhgs001.com\nhgscn.com\nhgsfy.com\nhgsj.com\nhgskjc.com\nhgskyray.com\nhgsyiyuan.com\nhgszyyy.com\nhgto.cc\nhgty5533.com\nhgty663.com\nhgty7598.com\nhguduo.com\nhgvalve.com\nhgveejt270.vip\nhgxxgz.com\nhgxxgz.net\nhgyrnk.com\nhgyys.com\nhgzk.com\nhgzkb.com\nhgzrt.com\nhgzxgz.com\nhgzxgz.net\nhgzxzc.com\nhgzyxy.com\nhh-gltd.com\nhh-honghu.com\nhh-jt.com\nhh-medic.com\nhh-pcbs.com\nhh-pmp.com\nhh-post.com\nhh.global\nhh010.com\nhh04050aoik.com\nhh6666.com\nhh88hh.com\nhhaqpx.com\nhhax.org\nhhbraider.com\nhhbwff.com\nhhchampion.com\nhhchsw.com\nhhcjjy.com\nhhclby.com\nhhcn.com\nhhcx-led.com\nhhcyt.com\nhhczy.com\nhhdglm.com\nhhdjc.com\nhhdna.net\nhhfdjz.com\nhhfxw.com\nhhglys.com\nhhh.tm\nhhh233.net\nhhh800.com\nhhh885.com\nhhhg258.com\nhhhji.com\nhhhkpb.com\nhhhoo.com\nhhhstz.com\nhhhtfdj.com\nhhhtfin.com\nhhhtscf.com\nhhhtyg.com\nhhitgroup.com\nhhjctest.com\nhhjgqh.com\nhhjsyxh.com\nhhjtcn.com\nhhju.com\nhhk365.com\nhhkaobo.com\nhhkin.com\nhhking.com\nhhkmls.com\nhhl1916.com\nhhlwchem.com\nhhmage.com\nhhmajiang.com\nhhmanhua.net\nhhnykg.com\nhhnynews.com\nhho-hawater.com\nhhojs.com\nhholy.com\nhhozw.com\nhhpcbs.com\nhhpj.net\nhhpmzp.com\nhhqs.xyz\nhhrcard.com\nhhrcw.com\nhhrdc.com\nhhrsks.com\nhhsilk.com\nhhsoftinfo.com\nhhsw6688hxcdn.com\nhhtmm.com\nhhtravel.com\nhhtvc.com\nhhup.com\nhhuubb.com\nhhuubb.net\nhhvv.com\nhhwenjian.com\nhhwindowmesh.com\nhhwl88.com\nhhxfqc.com\nhhxnycl.com\nhhxnyqc.com\nhhy0.com\nhhycdk.com\nhhygame.com\nhhygames.com\nhhytm.com\nhhyungu.com\nhhyy.com\nhhyy100.com\nhhzls.com\nhhzm88.com\nhhzyjng.com\nhi-54.com\nhi-books.com\nhi-cloud.net\nhi-davids.com\nhi-gtd.com\nhi-lead.com\nhi-linux.com\nhi-mantech.com\nhi-roy.com\nhi-sm.com\nhi-spider.com\nhi-techspring.com\nhi-trend.com\nhi0755.net\nhi138.com\nhi169.net\nhi1718.com\nhi2000.com\nhi2000.net\nhi772.com\nhi9377.com\nhiaiabc.com\nhiao.com\nhiapk.com\nhiascend.com\nhiascend.net\nhiavr.com\nhibace.com\nhibace.net\nhibbw.net\nhibea.com\nhibelarus.com\nhibgm.com\nhibixin.com\nhibogroup.com\nhibor.net\nhibor.org\nhibt.net\nhibtc.org\nhibuzz.net\nhiby.com\nhibymusic.com\nhic.cloud\nhicamelia.com\nhicane.com\nhiccupx.xyz\nhicdma.com\nhiceon.com\nhichain.com\nhicheng.net\nhichina.com\nhichina.net\nhichipharm.com\nhichips.com\nhicitech.com\nhiclc.com\nhicling.com\nhicloud.com\nhicnhm.com\nhicomp.com\nhiconey.com\nhiconics-zn.com\nhiconics.com\nhicoo.net\nhicosmo.com\nhicp.net\nhicsharp.com\nhicss.net\nhiczp.com\nhidery.com\nhidesigncloud.com\nhidist.com\nhiditie.com\nhidna.net\nhidreamai.com\nhidva.com\nhiechangzhou.com\nhiecheimaetu.com\nhiencode.com\nhienshi.com\nhiersun-ido.com\nhiesquire.com\nhifangjia.com\nhifar.net\nhifengli.com\nhifi168.com\nhificat.com\nhifidig.com\nhifidiy.net\nhifime.net\nhifiok.com\nhifishuo.com\nhifiveai.com\nhifkw.com\nhifkw.xin\nhifleet.com\nhifly.mobi\nhifly.tv\nhifpga.com\nhifreud.com\nhifuntv.com\nhifuture.com\nhigame123.com\nhiger.com\nhigeshi.com\nhiggmm.net\nhigh-genius.com\nhigh20-playback.com\nhigh21-playback.com\nhigh22-playback.com\nhigh24-playback.com\nhigh25-playback.com\nhighdigitizing.com\nhighfaststudio.com\nhighfel.com\nhighfundcorp.com\nhighgo.com\nhighhope.com\nhighleveltrans.com\nhighlightoptics.com\nhighlionceramic.com\nhighlm.com\nhighly.cc\nhighsharp.com\nhighstar.com\nhightac.com\nhightopo.com\nhighwayguitar.com\nhigoldgroup.net\nhigon.com\nhigoshipping.com\nhigrand.com\nhiguchi.xyz\nhigy.org\nhiheartgo.com\nhihell.com\nhihocoder.com\nhihonor.com\nhihonorcdn.com\nhihonorcloud.com\nhihope.org\nhii-go.com\nhiido.com\nhiido.net\nhiigame.net\nhiiibrand.com\nhiiyun.com\nhijackorg.net\nhijiangxi.com\nhijiaoshi.com\nhijin.vip\nhijoys.com\nhik-cloud.com\nhik-express.com\nhik-park.com\nhikailink.com\nhikari-ch.com\nhikauto.com\nhikcreate.com\nhikemobile.com\nhikerfans.com\nhikihj.com\nhikinginternational.com\nhikiot.com\nhiklife.com\nhikmall.com\nhikoon.com\nhikops.com\nhikparking.com\nhikrobotics.com\nhiksemitech.com\nhikstor.com\nhikstorage.com\nhikunpeng.com\nhikunpeng.net\nhikvision-jl.com\nhikvision.com\nhikvisionauto.com\nhikyun.com\nhilantu.com\nhilau.com\nhilbcd.com\nhile-bio.com\nhileap.com\nhilemic.com\nhilfv.com\nhiliad.com\nhiliwi.com\nhillelmilwaukee.org\nhilllei.com\nhillstonenet.com\nhillyton.com\nhilo8.com\nhiloletswin.com\nhilonggroup.com\nhiloong.com\nhilqq.com\nhiluluke.com\nhima.auto\nhimado.com\nhimaker.com\nhimalaya.cool\nhimanufacture.com\nhimarking.com\nhimawari-japan.com\nhimehear.com\nhimeidian.com\nhimengyou.com\nhimetoo.com\nhimile.com\nhimin.com\nhimmpat.com\nhimoral.com\nhimorale.com\nhimorfei.com\nhin.cool\nhinabian.com\nhinabiotech.com\nhinavi.net\nhinocn.com\nhinotravel.com\nhinpy.com\nhinsyeow.org\nhintsnet.com\nhiofd.com\nhiooq0417.com\nhiosu.com\nhioug.com\nhiparking.com\nhipcam.net\nhipcapi.com\nhiphi.com\nhiphop8.com\nhiphotonics.com\nhipiao.com\nhipole.com\nhippoanimation.com\nhippter.com\nhipu.com\nhiputian.com\nhiqiyu.com\nhirain.com\nhiram1009-dw.org\nhirata-cn.com\nhirata-hts.com\nhirede.com\nhiregex.com\nhireye.com\nhirige.com\nhirisemed.com\nhirisun.com\nhiroop.com\nhirosspac.com\nhirossz.com\nhirtk.com\nhirunsport.com\nhis.sh\nhisaka-china.com\nhisavana.com\nhiscene.com\nhisdnoc.com\nhisense-home.com\nhisense-plaza.com\nhisense-syxs.com\nhisense.com\nhisensehitachi.com\nhisensekf.com\nhisern.com\nhishouhui.com\nhisilicon.com\nhisiphp.com\nhislota.com\nhismarttv.com\nhisoar.com\nhisoft.com\nhisofts.com\nhisonracking.com\nhistorychina.net\nhisugar.com\nhisunplas.com\nhisupplier.com\nhit180.com\nhitachi-helc.com\nhitalk.com\nhitalkers.com\nhitao.com\nhitbot.cc\nhitctf.com\nhite.me\nhitechfrp.com\nhiteksoft.com\nhitergas.com\nhitevision-solution.com\nhitevision-solutions.com\nhitevision.com\nhitgk.com\nhitnology.com\nhitoor.com\nhitouch.com\nhitoupiao.com\nhitour2005.com\nhitozumi.com\nhitpound.com\nhitqs.com\nhitrip.info\nhitsame.com\nhitui.com\nhitv.com\nhiusers.com\nhiveshared.com\nhivi.com\nhivictor.net\nhiwafer.com\nhiwaysemi.com\nhiwayslaw.com\nhiwbb.com\nhiwechats.com\nhiweixiu.com\nhiwelcom.com\nhiwifi.com\nhiwiyi.com\nhiwms.com\nhiworld.com\nhiwuhuan.com\nhixgo.com\nhixianchang.com\nhixiaoe.com\nhixuexiao.net\nhiyd.com\nhiyongche.com\nhiyouib.com\nhiyouqu.com\nhiyun.site\nhiyun.tv\nhizaoan.com\nhizh.net\nhizhecheng.com\nhizj.net\nhizom.com\nhizyw.com\nhizyy.com\nhj-bits.com\nhj-ienergy.com\nhj-mail.com\nhj-pack.com\nhj01.com\nhj1951.com\nhj217.com\nhj44103a1.shop\nhjapi.com\nhjasiancenter.com\nhjbbs.com\nhjbxw.com\nhjcadc.com\nhjchee.com\nhjcjifen.com\nhjckjt.com\nhjclass.com\nhjcm.net\nhjcpl.com\nhjd111.shop\nhjd123.com\nhjdhdduekcdie.com\nhjdict.com\nhjdns.com\nhjdns.net\nhjdshop.cc\nhjdzn.com\nhjenglish.com\nhjg365.com\nhjgcd.com\nhjgrp.com\nhjgtjt.com\nhjhrcloud.com\nhjido.com\nhjiesuan.com\nhjinternationalhotel.com\nhjiuye.com\nhjjg.com\nhjjh.com\nhjjt.net\nhjjunhua.com\nhjkhjkl.com\nhjkklj.com\nhjksjx.com\nhjlrw.com\nhjlw.com\nhjmarathon.com\nhjmtzb.com\nhjpcc.com\nhjpp.net\nhjr-exchange.com\nhjren.com\nhjsj.com\nhjtag.com\nhjunkel.com\nhjw169.com\nhjw68.com\nhjwsky.com\nhjwsxzz.com\nhjwxcps.com\nhjxcl.com\nhjxhg.com\nhjxry.com\nhjxsjx.com\nhjxtv.com\nhjy1314.com\nhjyanxue.com\nhjyc.com\nhjygame.com\nhjyl.org\nhjyyjt.com\nhjz4.com\nhjz518.com\nhjzlg.com\nhjzzcl.com\nhk-island.hk\nhk-jztzjt.com\nhk-pwc.com\nhk-sz.com\nhk-tencentclb.cloud\nhk-tencentclb.com\nhk-tencentclb.net\nhk-tencentclb.work\nhk-titan.com\nhk-vstart.com\nhk-xin.com\nhk.uy\nhk0523.com\nhk603.hk\nhk8668.com\nhk9.com\nhkaco.com\nhkaima.com\nhkance.com\nhkance.xyz\nhkanews.com\nhkaohua.com\nhkbchina.com\nhkca.club\nhkcd.com\nhkcgart.com\nhkchat.app\nhkcna.hk\nhkcoalition.com\nhkcpr.com\nhkctgbus.com\nhkcts.com\nhkctshotels.com\nhkctsmembers.com\nhkcwdc.com\nhkdfc.com\nhkdfgroup.com\nhkdqgroup.com\nhkdzxs.com\nhkeig.com\nhkexpressworld.com\nhkfc.hk\nhkfcchina.com\nhkfdi.com\nhkfe.hk\nhkfljt.com\nhkgcloudcs.com\nhkgcr.com\nhkgj07.com\nhkgjcz.com\nhkgol.com\nhkgsw.com\nhkgtedu.com\nhkgwater.com\nhkhdsyxx.com\nhkinsu.com\nhkinur.com\nhkjinxin.com\nhkjnn.com\nhkjsrent.com\nhkklock.com\nhkkuaiyixiu.com\nhklego.com\nhklmoto.com\nhklmxcx.com\nhklsqc.com\nhkm168.com\nhkmedtime.com\nhkmeinian.com\nhkmipo.com\nhkmjd.com\nhknbc.com\nhknet-inc.com\nhkoke.com\nhkpep.com\nhkproperty.com\nhkqbh.com\nhkroyal.com\nhkrsoft.com\nhksc888.com\nhkscxh.com\nhkslg520.com\nhkstv.tv\nhkt4.com\nhktheone.com\nhktidg.com\nhku-szh.org\nhkvisen.com\nhkwb.net\nhkwzig.com\nhkxbjt.com\nhkxen.com\nhkxtech.org\nhky360.com\nhkyukai.vip\nhkyxfgs.com\nhkyykq.com\nhkzlcm.com\nhl-bandao.com\nhl-brushes.com\nhl-epay.com\nhl-hengsheng.com\nhl95.com\nhl95001.com\nhlapi.com\nhlashop.com\nhlb2020.com\nhlbcks.com\nhlbe365.com\nhlbeixiu.com\nhlbeixiu.net\nhlbf.net\nhlblz.com\nhlbn.cc\nhlbryy.com\nhlcdn.cc\nhlchsw.com\nhlcm.net\nhlcode.net\nhld558.com\nhldbtv.com\nhldedu.com\nhldfcom.com\nhldgajjzd.com\nhldgp.com\nhldhouse.com\nhldhuanbao.com\nhldjob.com\nhldjz8.com\nhldmzg.com\nhldnews.com\nhldszxyy.com\nhlduanjian.com\nhledu.net\nhlej.com\nhlekk.org\nhletong.com\nhlgad.com\nhlgcj.com\nhlgdata.com\nhlgnet.com\nhlgnet.net\nhlhfjt.com\nhlhjapp.com\nhlhmf.com\nhlhqdj.com\nhlhs.cc\nhlhyc.com\nhlj10031ip.com\nhljcqjy.com\nhljdata.net\nhljgvc.com\nhljgwy.net\nhljgzkj.com\nhljhgckj.com\nhljiasen.com\nhljjjb.com\nhljjkfp.com\nhljjytkj.com\nhljpm.com\nhljpost.com\nhljradio.com\nhljrcc.com\nhljsdm.com\nhljszjxhw.com\nhljtchina.com\nhljtcm.com\nhljtv.com\nhljtx.com\nhljucm.net\nhljxgs.com\nhljyestar.com\nhljyqnj.com\nhljyushi.com\nhljzc.net\nhljzl.icu\nhlkd.pro\nhlkkwl.com\nhlkncse.com\nhlktech.com\nhlkznsb.com\nhllinks.com\nhllives.com\nhlmmold.com\nhlnhw.com\nhlnmg.com\nhlnpic.com\nhlnpm.com\nhlo-trade.com\nhloong.com\nhlqiaojia.com\nhlqxj.com\nhlread.com\nhlsdq.com\nhlsimu.com\nhlstlyy.com\nhltmsp.com\nhltx.net\nhlupr.com\nhlvitamin.com\nhlw1588.com\nhlwarp.com\nhlwidc.com\nhlwjnm.com\nhlwwhy.com\nhlxky.com\nhlxstipark.com\nhlxsykd.com\nhlxsz.com\nhlxy.com\nhly.com\nhlybar.com\nhlyds.com\nhlyiq.com\nhlytec.com\nhlyy8.com\nhlyykp.com\nhlzaojia.com\nhlzq.com\nhlzqgs.com\nhlzzkj.com\nhm-3223.net\nhm-optics.com\nhm025.com\nhm120.com\nhm152n.com\nhm163.net\nhm16888.net\nhm169.com\nhm588.com\nhm5988.com\nhmadgz.com\nhmarathon.com\nhmbzfjt.com\nhmchina.com\nhmcl.net\nhmdx.net\nhmedu.com\nhmeili.com\nhmf-china.com\nhmfxw.com\nhmgbtv.com\nhmgj.com\nhmgreat.com\nhminvestment.com\nhmj666.com\nhmjblog.com\nhmjc.org\nhmkp.org\nhmlan.com\nhmlcar.com\nhmltec.com\nhmly666.cc\nhmmachine.com\nhmmryk.com\nhmnst.com\nhmoe.link\nhmplay.com\nhmqg.com\nhmqjsb.com\nhmrczp.com\nhmreuj.com\nhmrsrc.com\nhmsemi.com\nhmszkj.com\nhmtgo.com\nhmting.com\nhmtnew.com\nhmtoday.com\nhmtrhf.com\nhmus.net\nhmwdj.com\nhmwzjs.com\nhmx-led.com\nhmxixie.com\nhmxw.com\nhmxx.net\nhmyzs.com\nhmz.com\nhmz8.com\nhmzhtc.cc\nhmzhtc.com\nhmzixin.com\nhmzjzx.com\nhmzs.net\nhmzx163.com\nhn-binglang.com\nhn-cbec.com\nhn-hwqjxh.com\nhn-medical.com\nhn-xqlhw.com\nhn0746.com\nhn165.com\nhn96520.com\nhn9mu.com\nhnacargo.com\nhnacgs.com\nhnaec.com\nhnaec.org\nhnaee.com\nhnafxh.com\nhnagroup.com\nhnagroup.net\nhnainfrastructure.com\nhnair.com\nhnair.net\nhnaiya.com\nhnamdi.com\nhnangel.com\nhnanqi.com\nhnapay.com\nhnasatc.com\nhnaues.com\nhnbaili.net\nhnbemc.com\nhnbidding.com\nhnbits.com\nhnblc.com\nhnbljy.com\nhnblly.com\nhnbntv.com\nhnbrush.com\nhnbsq.com\nhnbtcy.com\nhnccpit.org\nhnceg.com\nhncfa.com\nhncgkgjt.com\nhnchaosu.com\nhnchemtech.com\nhnchuangj.net\nhnchuangxiangkj.com\nhncj.com\nhncloud.com\nhncmsx.com\nhncnedu.com\nhncost.com\nhncourt.org\nhncpu.com\nhncreate.com\nhncsart.com\nhncsmtr.com\nhncsvod.com\nhnct56.com\nhnctw.com\nhncu.net\nhncwc.com\nhncxwater.com\nhncytxly.com\nhncyzx.com\nhndbsp.com\nhndca.com\nhndcyg.com\nhndec.com\nhndfbg.com\nhndfsrmyy.com\nhndgxh.com\nhndhsyjt.com\nhndlhx.com\nhndlks.com\nhndmtjc.com\nhndnews.com\nhndpf.org\nhndpx.com\nhnds88.com\nhndscg.com\nhndsyy.com\nhndt.com\nhndxzte.com\nhndybus.com\nhndysx.com\nhndz413.com\nhndzxh.com\nhnechz.com\nhnedition.com\nhnedutv.com\nhnerkang.com\nhnetn.com\nhnetyy.net\nhnfa.org\nhnfapiao.com\nhnfcis.com\nhnfcjr.com\nhnfck.com\nhnfjz.com\nhnfles.com\nhnfudu.com\nhnfyqmj.com\nhnfysg.com\nhngajs.com\nhngangjiegou.com\nhngbjy.com\nhngdkg.com\nhngh.org\nhnghzl.com\nhngjj.net\nhngjx.com\nhngks.com\nhngoldcorp.com\nhngpmall.com\nhngqjc.com\nhngs.net\nhngscloud.com\nhngsetc.com\nhngtrust.com\nhngwg.com\nhngwkj.net\nhngwmt.com\nhngwy.org\nhngwzk.com\nhngx.net\nhngyms.com\nhnh.cc\nhnhaofang.com\nhnhbyxdq.com\nhnhcrn.com\nhnhdxd.com\nhnhflqgc.com\nhnhho.com\nhnhj.net\nhnhjjx.com\nhnhlpp.com\nhnhnled.com\nhnhp.com\nhnhsjt.com\nhnht56.com\nhnhtdg.com\nhnhw.com\nhnhwly.com\nhnhxin.com\nhnhxs.com\nhnhxxk.com\nhnhyfm.com\nhnhylx.com\nhnhyrc.com\nhnhyt.com\nhniec.org\nhniic.com\nhnijunhai.com\nhninsure.com\nhnisca.org\nhniso.net\nhnisvc.com\nhnitedu.org\nhnjbwh.com\nhnjcly.com\nhnjg.com\nhnjiabao.com\nhnjing.com\nhnjing.net\nhnjinmaizi.com\nhnjkjn.com\nhnjkw.net\nhnjme.com\nhnjmsk.com\nhnjshzy.com\nhnjsrcw.com\nhnjtcl.com\nhnjttz.com\nhnjudarhr.com\nhnjuhuo.com\nhnjyyz.com\nhnjzy.org\nhnkcjt.com\nhnks.com\nhnksgf.com\nhnktgame.com\nhnktzz.com\nhnkxy.com\nhnkygas.com\nhnkzy.com\nhnlantian.com\nhnlat.com\nhnlawyer.org\nhnlbdl.com\nhnleisu.com\nhnlens.com\nhnliangku.com\nhnlipu.com\nhnlshm.com\nhnltcw.com\nhnlxq.com\nhnlzhd.com\nhnlzw.net\nhnmangshan.com\nhnmcymy.com\nhnmdtv.com\nhnmgjr.com\nhnming.com\nhnmjyy.com\nhnmks.com\nhnmlqianpan.com\nhnmqtt.com\nhnmrffm888.com\nhnmsg.com\nhnmsw.com\nhnmudi.com\nhnmuseum.com\nhnmyjt.com\nhnmzmy.com\nhnnanshang.com\nhnnbwdiaosu.com\nhnnews.cc\nhnnhyy.com\nhnninglian.com\nhnnkyy.com\nhnnx.com\nhnnxs.com\nhnnyrzzl.com\nhnnzwhyy.com\nhnoak.com\nhnoceanrace.com\nhnoexpo.com\nhnol.net\nhnoscar.com\nhnpdig.com\nhnpfw.com\nhnpic.com\nhnpm.cc\nhnpolice.com\nhnpta.com\nhnptschool.net\nhnpwholesale.com.au\nhnqczy.com\nhnqfseed.com\nhnqinshi.com\nhnqlhj.com\nhnqljj.com\nhnqljt.com\nhnqnw.com\nhnquxing.com\nhnquyou.com\nhnqz.net\nhnradio.com\nhnrcjl.com\nhnrcjob.com\nhnrcsc.com\nhnrcsc.net\nhnrczpw.com\nhnredcross.com\nhnrich.net\nhnrmb.com\nhnrmtjg.com\nhnrmzy.com\nhnrpc.com\nhnrrco.com\nhnrsks.com\nhnrszhjc.com\nhnryly.com\nhns4j.com\nhns5j.com\nhnsbxl.com\nhnsd2fz.com\nhnsdfz.org\nhnsdzjy.com\nhnsdzsrmyy.com\nhnsfdc.com\nhnsfjy.net\nhnsggzy.com\nhnsghsljt.com\nhnsgkb.com\nhnshengben.com\nhnshqfz.com\nhnshuntian.com\nhnshyzx.com\nhnsiia.com\nhnsilane.com\nhnsite.cc\nhnsiwei.com\nhnsjgroup.com\nhnsjlh.com\nhnsjrd.com\nhnsktc.com\nhnskxy.com\nhnsky.net\nhnslsdxy.com\nhnslshyxh.com\nhnslxh.com\nhnslytz.com\nhnsnnews.com\nhnsoftedu.com\nhnsong.net\nhnsqtg.com\nhnsrmyy.com\nhnsrmyy.net\nhnssjn.com\nhnssyxx.com\nhnst.org\nhnstandards.com\nhnster.com\nhnstguolu.net\nhnstjsjt.com\nhnswljt.com\nhnswsjy.com\nhnswxy.com\nhnsyda.com\nhnsygroup.com\nhnsyhj.com\nhnsyhm.com\nhnsyu.net\nhnsyyq.com\nhnsyzls.com\nhnsyzxyy.com\nhnszn.com\nhnszyxy.com\nhntba.com\nhntbpm.com\nhntchq.com\nhntcm.com\nhntcmc.net\nhntele.com\nhnthrq.com\nhntiannuo.net\nhntianyue.com\nhntic.com\nhnticai.com\nhntican.com\nhntkg1.com\nhntky.com\nhntlxh.com\nhntncdn.com\nhntobacco.com\nhntqb.com\nhntv.tv\nhntxcd.com\nhntxxy.com\nhntzyy.com\nhnubbs.com\nhnucc.com\nhnukai.com\nhnwanglong.com\nhnwbxx.com\nhnwca.com\nhnwcl.com\nhnwczx.com\nhnwd.com\nhnwdhk.com\nhnwhg.org\nhnwhjy.com\nhnwisecom.com\nhnwlcm.com\nhnwlxh.com\nhnwlxh.net\nhnwlycg.com\nhnwsbz.com\nhnwtqx.com\nhnwwsjzx.com\nhnwyxx.com\nhnwz8.com\nhnwzinfo.com\nhnxdf.com\nhnxfpfb.com\nhnxggas.com\nhnxhdn.com\nhnxhnews.com\nhnxhyl.com\nhnxingda.com\nhnxljkj.com\nhnxmht.com\nhnxtkg.com\nhnxttv.com\nhnxunch.com\nhnxuntang.com\nhnxxc.com\nhnxxt.net\nhnxxyz.com\nhnxzctec.com\nhnyanglao.com\nhnyaoshan.com\nhnyaosi.com\nhnydf.net\nhnydgl.com\nhnyesf.com\nhnyfkj.com\nhnyichang.com\nhnyingfang.com\nhnyinhan.com\nhnyixiao.com\nhnysfww.com\nhnytgt.com\nhnyuanhong.com\nhnyuanyou.com\nhnyuedu.com\nhnyunji.com\nhnyunsutong.com\nhnyunzhiyi.com\nhnyuyuhui.com\nhnyydg.com\nhnyygroup.com\nhnyyws.com\nhnyyxj.com\nhnyyyfsyy.com\nhnyyyz.com\nhnyzfwlkj.com\nhnyzzy.com\nhnzdjsj.com\nhnzfcgxh.com\nhnzfgjj.com\nhnzhangkun.com\nhnzhaobiao.com\nhnzhijiang.com\nhnzhongzhuan.com\nhnzhouyi.com\nhnzhy.com\nhnzjgdkj.com\nhnzjip.com\nhnzjj.com\nhnzjyl.com\nhnzkclouds.com\nhnzkhbsb.com\nhnzlyy.com\nhnzm.vip\nhnzoc.com\nhnzose.com\nhnzqw.com\nhnzrjy.com\nhnzrsc.com\nhnzsbw.com\nhnzsxh.com\nhnztb.org\nhnztdq.com\nhnztfs.com\nhnztqzjx.com\nhnzxyy.com\nhnzycfc.com\nhnzyfs.com\nhnzyfy.com\nhnzywh.xyz\nhnzyxckj.com\nhnzyydx.com\nhnzyzx.com\nhnzzjob.com\nhnzzlh.com\nhnzzms.com\nhnzzrc.com\nhoau.net\nhobalab.com\nhobby-eagle.net\nhobbyboss.com\nhobosgroup.com\nhocheymed.com\nhochitech.com\nhocode.com\nhocodo.com\nhodgen-china.com\nhodiasflavor.com\nhodo170.com\nhodoop.com\nhoehub.com\nhofcc.com\nhogacn.com\nhogasky.com\nhogesoft.com\nhoghu.com\nhogon17.com\nhoho123.com\nhoho666.com\nhohode.com\nhoilon.com\nhoing.net\nhoisen.com\nhojonn.com\nhok5v5.com\nhokai.com\nhokori.online\nhokparts.com\nhold168.com\nholder-pharm.com\nholdhr.com\nholdsteel.com\nholdtwo.com\nholichip.com\nholike.com\nholiland.com\nholine.com\nholkx.com\nholleykingkong.com\nhollischuang.com\nhollwingroup.com\nhollycrm.com\nhollysource.com\nhollysys.com\nhollyuc.com\nhollywant.com\nholmesbio.com\nholmesian.org\nholoalpha.com\nholoremax.com\nholsauto.com\nholteksupport.com\nholyfunny.com\nholymalls.com\nholyxiongan.com\nhome0311.com\nhome0538.com\nhome0668.com\nhome133.com\nhome178.com\nhome898.com\nhomearch.com\nhomearch.shop\nhomearch.store\nhomearch.vip\nhomeartschina.com\nhomebaseradiators.com\nhomebehind.com\nhomecdn.com\nhomed.me\nhomedgroup.com\nhomedo.com\nhomeindus.com\nhomeinframes.com\nhomeinmists.com\nhomeinns.com\nhomeintour.com\nhomekeji.com\nhomeking365.com\nhomekingcdn.com\nhomekoo.com\nhomekoocdn.com\nhomelandhotel.com\nhomelandol.com\nhomesir110.com\nhomestyler.com\nhometex114.com\nhometexjoin.com\nhometexnet.com\nhometol.com\nhomey-household.com\nhomeyao.com\nhomhow.com\nhommk.com\nhomolo.com\nhomolo.net\nhomsoboard.com\nhomsuncap.com\nhomylogistics.com\nhomyu.com\nhonaenergy.com\nhonbro.com\nhonchmedia.com\nhonco88.com\nhonda-sundiro.com\nhonder.com\nhondugroup.com\nhonestmc.com\nhonestread.com\nhonesty-environ.com\nhonf.net\nhong-lawfirm.com\nhong-shun.com\nhongbao.com\nhongbao.sh\nhongbao.show\nhongbaoli.com\nhongbeibang.com\nhongbeicn.com\nhongbizi.org\nhongbo-group.com\nhongbo-sh.com\nhongbo100.com\nhongboluo.com\nhongcesys.com\nhongchangpawn.com\nhongchisw.com\nhongchuangholding.com\nhongda-steeltube.com\nhongdaishu.com\nhongdamach.com\nhongdatec.com\nhongdefund.com\nhongdian.com\nhongdianfund.com\nhongdongpumps.com\nhongdou.com\nhongdoufm.com\nhongdoulive.com\nhongen.com\nhongfasi.net\nhongfengye.com\nhongfuloi.com\nhongganshebei.net\nhongguogame.com\nhongguoyouxi.com\nhonghaibengye.com\nhonghaish.com\nhonghe-tech.com\nhongheiku.com\nhonghu-muffler.com\nhonghuajz.com\nhonghuotai.com\nhonghusaas.com\nhonghusoft.com\nhongjia138.com\nhongjiang.info\nhongjibp.com\nhongjiejia.com\nhongjigroupsz.com\nhongjin2.com\nhongjing-wh.com\nhongjing.com\nhongjing3.com\nhongjingedu.com\nhongjinleather.com\nhongkang-life.com\nhongkegd.com\nhongkeyun.com\nhongkongairlines.com\nhongkonganran.com\nhongkongmeixie.com\nhongku.com\nhongkun-tech.com\nhongkunjinfu.com\nhonglan123.com\nhonglans.com\nhonglimfg.com\nhonglimingbiao.com\nhonglipai.net\nhonglumedia.com\nhongm.com\nhongmaoshiye.com\nhongmeiti.com\nhongmeiti.net\nhongmen.cc\nhongmen.com\nhongmingbus.com\nhongmo.xyz\nhongmoka.com\nhongmu.com\nhongniang.com\nhongniuzyimage.com\nhongpai.com\nhongpig.com\nhongqi.tv\nhongqiangmjg.com\nhongqiaochina.com\nhongqipharma.com\nhongqipress.com\nhongrenyiyuan.com\nhongrida.com\nhongrinongye.com\nhongrizi.com\nhongru.com\nhongruihuanjing.com\nhongruike.com\nhongsanban.com\nhongsat.com\nhongsegs.com\nhongsejiqing.com\nhongsenlin.com\nhongshan.com\nhongshang-led.com\nhongsheng-group.com\nhongsheng.shop\nhongshi88.com\nhongshigroup.com\nhongshipaint.com\nhongshizi.org\nhongshn.xyz\nhongshu.com\nhongshunet.com\nhongshunth.com\nhongshuxiao.com\nhongsong.club\nhongsong.info\nhongsungifts.com\nhongta.com\nhongtaijixie.com\nhongtair.com\nhongtaiscp.com\nhongtaiwy.com\nhongtastock.com\nhongtelecom.com\nhongtong588.com\nhongtongtube.com\nhongttel.com\nhongtu.net\nhongtu56.com\nhongtucad.com\nhongtunetwork.com\nhongvv.com\nhongwenfeh.com\nhongwu.com\nhongwuhuan.com\nhongxiangzaixian.com\nhongxiaolong.com\nhongxingdl.com\nhongxingdl.love\nhongxinglin.com\nhongxingshangye.com\nhongxingzhonggong.com\nhongxingzn.com\nhongxiu.cc\nhongxiu.com\nhongxiu158.com\nhongyan-e.com\nhongyan.info\nhongyangsoft.com\nhongyangxiezi.com\nhongyanhr.com\nhongyanjin.com\nhongyanliren.com\nhongyans.com\nhongyantruck.com\nhongyaomall.com\nhongyawang.com\nhongyejixie.com\nhongyewuyang.com\nhongyi5.com\nhongyikun.com\nhongyimarine.com\nhongyirong.com\nhongyu-qi.com\nhongyuanpharm.com\nhongyuanqh.com\nhongyue.com\nhongyugroup.com\nhongyugz.com\nhongyumedical.com\nhongyunduo.com\nhongyuntx.com\nhongyunvren.com\nhongyuzps.com\nhongze.net\nhongze365.com\nhongzerc.com\nhongzetai.com\nhongzhengchem.com\nhongzhentextile.com\nhongzhigongzuowang.com\nhongzhoukan.com\nhongzhuangyuan.com\nhongzhuojituan.com\nhonhan.ltd\nhonkaiimpact3.com\nhonkaistarrail.com\nhonkonlaser.com\nhonlyu.com\nhonor.com\nhonorfair.com\nhonorfile.com\nhonorofkings.com\nhonpc.com\nhonpery.com\nhonsea.com\nhonson-china.com\nhonsonch.com\nhonstarmemory.com\nhonsuntec.com\nhonyanwl.com\nhonycapital.com\nhonyfunds.com\nhonyone.com\nhonyuan.net\nhooan.net\nhoodinn.com\nhoodong.com\nhooenergy.com\nhooh5.com\nhookan.com\nhoolai.com\nhoolaigames.com\nhoolee8.com\nhoolinks.com\nhoolo.tv\nhoonup.com\nhoop-archi.com\nhoopchina.com\nhoopugames.net\nhoosho.com\nhooshun.com\nhoosuntec.com\nhooya.hk\nhooyagroup.com\nhooyoo.com\nhope-bridge.com\nhope-m.com\nhopebank.com\nhopebeauty.com\nhopebiol.com\nhopebook.net\nhopechart.com\nhopecool.com\nhopeda.com\nhopegoocdn.com\nhopehook.com\nhopemedinc.com\nhopenoah.com\nhoperun.com\nhopes-tech.com\nhopetrip.com.hk\nhopexr.com\nhophingfood.com\nhopoot.com\nhopsontong.com\nhorace-liu.com\nhorain.net\nhoran.cc\nhorchips.com\nhori-gz.com\nhori3d.com\nhoribaprecision.com\nhorigames.com\nhorion.com\nhorionsw.com\nhorizon-china.com\nhorizon.ai\nhorizon.auto\nhorizon.cc\nhorizonfuelcell.com\nhorizonlawyers.com\nhorizonrcg.com\nhorizonsanya.com\nhorju.com\nhorn-yacht.com\nhornetcorn.com\nhorosama.com\nhorou.com\nhorphoto.com\nhorsebrowser.com\nhorsechinaone.com\nhorti-expo2019.com\nhortor-comic.com\nhortor.net\nhortor002.com\nhortor005.com\nhortor020.com\nhortorgames.com\nhorwathhtl-cn.com\nhosane.com\nhoscogroup.com\nhosgs.com\nhoshinesilicon.com\nhoshiroko.com\nhosjoy.com\nhoslen-sh.com\nhosn168.com\nhosno7.com\nhosonglass.com\nhosory.com\nhosowin.com\nhospit.net\nhospital-cqjs.com\nhospital-cqmu.com\nhospital2.com\nhospitalkg.com\nhospitalshy.com\nhospitalstar.com\nhospite.com\nhost263.com\nhost888.net\nhostacc.net\nhostacc1.com\nhostacc2.com\nhostadm.net\nhostbbs.net\nhostbuf.com\nhostdie.com\nhostgw.net\nhostidc.net\nhostkvm.com\nhostloc.me\nhostmonit.com\nhostoexp.com\nhostxen.com\nhot-test.org\nhot0755.com\nhotalk.com\nhotata.com\nhotborn.com\nhotchenghong.com\nhotcoin.com\nhotdb.com\nhoteamsoft.com\nhoteastday.com\nhotel-noir-film.com\nhotel-ochsen-hardheim.com\nhotelbaijin.com\nhotelcis.com\nhotelgg.com\nhoteljianguo.com\nhotelpanpacific.com\nhotelsjianguo.com\nhotelvi.com\nhotelyunos.com\nhotent.com\nhotent.xyz\nhotgamehl.com\nhotgopark.com\nhotiis.com\nhotkey123.com\nhotkidclub.com\nhotking.com\nhotlcd.com\nhotlinegames-jp.net\nhotnewx.com\nhotone.com\nhotoneaudio.com\nhotoos.com\nhotpotstq.com\nhotpub.com\nhotread.com\nhotsales.net\nhotsnow.club\nhotsnow.org\nhotsoonapp.com\nhotsoonapp.net\nhotsoonvideo.com\nhotsoonvideo.net\nhotsoonzb.com\nhotsoonzb.net\nhotssp.com\nhotstoday.com\nhottechsemi.com\nhottui.com\nhotwatchsreplica.com\nhotwind.net\nhotwindbox.com\nhotwon.com\nhotxf.com\nhotyihao.com\nhou5.com\nhoucaller.com\nhoudao.com\nhoudao.net\nhoudask.com\nhoudewl.com\nhoudy.com\nhoufaka.com\nhoufangyiyao.com\nhouge.com\nhouhoucn.com\nhoujiji.com\nhoujt.com\nhoukai.com\nhoukuanshop.com\nhoulangsports.com\nhoumoai.com\nhoungfuh.com\nhouniaohao.com\nhouniaotrip.com\nhouniaoyc.com\nhoupukeji.com\nhouqigo.com\nhouqinbao.com\nhouqun.net\nhouquner.com\nhourt-cert.com\nhourui-arch.net\nhouse086.com\nhouse178.com\nhouse365.com\nhouse5.net\nhouse510.com\nhouse86.com\nhouseimg.com\nhouseoftantra.org\nhoushaoan.com\nhousoo.com\nhouwenfei.com\nhouwuedu.com\nhouxue.com\nhouyicaiji.com\nhouyuantuan.com\nhouzhibo.com\nhouzhiwang.com\nhouzi8.com\nhovfree.com\nhowbuy.com\nhoweipharm.com\nhowelllighting.com\nhowellsto.com\nhowjoin.com\nhowlapm.com\nhowmay.com\nhowsci.com\nhowtoing.com\nhowxm.com\nhowyouinternational.com\nhowzhi.com\nhoxing.com\nhoxue.com\nhoyakeji.com\nhoyatod.com\nhoyi-tech.com\nhoyibox.xyz\nhoyip.com\nhoyo.link\nhoyoverse.com\nhozest.com\nhozin.com\nhozonauto.com\nhp-marathon.com\nhp.com\nhp123.com\nhp888.com\nhpbgb.com\nhpblog.net\nhpc.cloud\nhpcang.com\nhpccake.com\nhpccube.com\nhpculturegroup.com\nhpeft.com\nhpepea.com\nhpgamestream.com\nhpglw.com\nhpgzf.com\nhph123.com\nhphwa.com\nhpichina.org\nhpicorp.net\nhpigc.com\nhpjd.com\nhplyy.com\nhpmicro.com\nhpnfjx.com\nhpoi.net\nhprt.com\nhprx.com\nhps-sh.com\nhpstore-china.com\nhpstore.cc\nhptea.com\nhpv112.com\nhpwin.com\nhpwjs.com\nhpwu.com\nhpwxc.com\nhpyiqi.com\nhpyk.com\nhpzhatu.com\nhq-mart.com\nhq-minerals.com\nhq0564.com\nhq114.net\nhq88.com\nhqbd.com\nhqbnb.com\nhqbuy.com\nhqbuycdn.com\nhqc-china.com\nhqcanyin.com\nhqcg1984.com\nhqchip.com\nhqcr.com\nhqdlsn.com\nhqdoc.com\nhqdoor.com\nhqengroup.com\nhqepay.com\nhqew.com\nhqew.net\nhqewimg.com\nhqfastner.com\nhqgjzz.com\nhqgq.com\nhqhb.com\nhqhl.net\nhqhop.com\nhqhospital.com\nhqhot.com\nhqhtfl.com\nhqidi.com\nhqis.org\nhqiye.com\nhqjcjj.com\nhqjy.com\nhqls.com\nhqnqz.com\nhqpcb.com\nhqps.com\nhqqt.com\nhqresearch.org\nhqrvs.com\nhqsec.com\nhqsgw.com\nhqshuaimi.com\nhqsmartcloud.com\nhqsoft.cc\nhqswuye.com\nhqthw.com\nhqtong.com\nhqts.com\nhqubbs.com\nhquu.net\nhqvchina.com\nhqwhw.com\nhqwx.com\nhqxlad.com\nhqyc.com\nhqygyg.com\nhqyj.com\nhqyjng.com\nhqyjsuccess.com\nhqyl.com\nhqys.net\nhqyt.net\nhqytgyh.com\nhqyun.com\nhqyxjy.com\nhqyzx.com\nhqzhou.com\nhqzxecd.asia\nhr-channel.com\nhr-mp.com\nhr-self.com\nhr002.com\nhr025.com\nhr0571.com\nhr0660.com\nhr0715.com\nhr0752.com\nhr0753.com\nhr0766.com\nhr0915.com\nhr1000.com\nhr10000.com\nhr135.com\nhr2002.com\nhr2003.com\nhr2trainer.com\nhr33.com\nhr369.com\nhr3ds.com\nhr448.com\nhr510.com\nhr5156.com\nhr558.net\nhr668.com\nhr730.com\nhr763.com\nhr78.net\nhr9000.com\nhr987.com\nhrayw.com\nhrb-dg.com\nhrbanlv.com\nhrbaodian.com\nhrbar.com\nhrbbcf.com\nhrbbleasing.com\nhrbeduy.com\nhrbesd.com\nhrbj.net\nhrbjianchewang.com\nhrbjishunbanjia.com\nhrbjunxin.com\nhrbmama.com\nhrbmilan.com\nhrbpattern.com\nhrbpolarland.com\nhrbpt.com\nhrbshuiwu.com\nhrbswx.com\nhrbtv.net\nhrbuyu.com\nhrbyafeng.com\nhrbzdty.com\nhrbzhsd.com\nhrbzyy.com\nhrcf168.com\nhrcfc.com\nhrday.com\nhrddqc.com\nhref.lu\nhrenh.com\nhrexam.com\nhrfc.net\nhrflc.com\nhrfoods.com\nhrgsmz.com\nhrgxyy.com\nhrhuiyi.com\nhrhy365.com\nhrintl.com.hk\nhrjextruders.com\nhrjkjt.com\nhrloo.com\nhrm100.com\nhrmarket.net\nhrmtgroup.com\nhro-cosmetics.com\nhroot.co\nhroot.com\nhrpackage.com\nhrrsj.com\nhrs100.com\nhrsalon.org\nhrsay.com\nhrsee.com\nhrsel.com\nhrsoft-china.com\nhrsteelpipe.com\nhrtechchina.com\nhrtfin.com\nhrtn.net\nhrtsea.com\nhrtx.com\nhruikang.com\nhrvouge.com\nhrwuu.com\nhrxiongan.com\nhrxz.com\nhrzy.cc\nhs-bianma.com\nhs-biopharm.com\nhs-defense.com\nhs-fe.com\nhs-outlets.com\nhs-sz.com\nhs.net\nhs13z.net\nhs2z.net\nhs326.com\nhs499.com\nhs5g.com\nhs65.com\nhs85.com\nhsakyy.com\nhsay.com\nhsayi.com\nhsbank.cc\nhsbbs.com\nhsbdc.com\nhsbianma.com\nhscarbonfibre.com\nhscbw.com\nhscc.com\nhscfjt.com\nhschina.net\nhscn.com\nhscode.net\nhscode123.com\nhsdbg.com\nhsdcw.com\nhsddyy.com\nhsdfzp.com\nhsdjxh.org\nhsdjz.com\nhseda.com\nhsehome.com\nhsehome.org\nhsez.net\nhsfh56.com\nhsfund.com\nhsfyyy.com\nhsfzexsg.com\nhsfzxjy.site\nhsg2oi3c.com\nhsgf.net\nhsgjj.com\nhsgjysj.com\nhshan.com\nhshdyw.com\nhshhlj.com\nhshj.cc\nhshl360.com\nhshsjy.com\nhshsxkj.com\nhshton.com\nhshuiyi.com\nhsijqa.com\nhsjk.com\nhsjkaoyan.com\nhsjpgzx.com\nhsjrhy.com\nhsjt1983.com\nhsjy.com\nhsjy.net\nhskehong.com\nhskgchina.com\nhskun.com\nhsleu.com\nhslid.net\nhslight.net\nhslvshan.com\nhslxhl.com\nhsly.org\nhsm-intl.com\nhsmap.com\nhsmdb.com\nhsmob.com\nhsmrt.com\nhsnewsnet.com\nhsoow.com\nhspeletizadora.com\nhspharm.com\nhspm.net\nhspress.net\nhsqh.net\nhsqhfunds.com\nhsqhospital.com\nhsqjfw.com\nhsqt888.com\nhsqyy.com\nhsrc.tv\nhsrcw.com\nhsrexpo.com\nhsrjtk.com\nhsrtd.club\nhssdk.com\nhssdtest.com\nhssenglish.com\nhssjyj.com\nhsskyy.com\nhsslab.com\nhssrc.com\nhssyy.com\nhsszfx.com\nhst.com\nhst1966.net\nhstars.net\nhstbroker.com\nhstczkj.com\nhstd.com\nhstong.com\nhstpizza.com\nhstspace.com\nhstypay.com\nhstyre.com\nhsufuchifoods.com\nhsuyeung.com\nhswatersupply.com\nhsweb.me\nhswell.com\nhswkzy.com\nhswlkj.com\nhswmb.com\nhswzyh.com\nhswzyj.com\nhsx99.com\nhsxedu.com\nhsxt.com\nhsxt.net\nhsy188.com\nhsyaguanjg.com\nhsyanyi.com\nhsybyh.com\nhsyk023.com\nhsysupply.com\nhsyuntai.com\nhsyunyi.com\nhsyyf.me\nhsyymusic.com\nhsyzg.net\nhszk.org\nhszq6.com\nhszq8.com\nhszsb.org\nhszsfz.com\nhszsz.com\nhsztbzx.com\nhszw.org\nhszxlzx.com\nhszy8.com\nhszyy8.com\nhszzsyzx.net\nhszzzx.net\nht-cao.com\nht-chem.com\nht-med.com\nht-motor.com\nht-rc.com\nht-saae.com\nht-tech.com\nht-valve.com\nht0775.com\nht1832.com\nht88.com\nht9.com\nhtai51.com\nhtaizhou.com\nhtanwang.com\nhtaocloud.com\nhtback.com\nhtbmsc.com\nhtc-media.com\nhtcases.com\nhtcis.net\nhtcrrc.com\nhtcxfund.com\nhtcxms.com\nhtd2000.com\nhtdata.com\nhtdtire.com\nhtdxcl.com\nhteacher.net\nhtech360.com\nhteos.com\nhtexam.com\nhtexam.net\nhtfcn.com\nhtffund.com\nhtfilter.com\nhtfoxit.com\nhtfpartner.com\nhtfutures.com\nhtg520.com\nhtgjjl.com\nhtgkdz.com\nhtguosheng.com\nhtgwf.com\nhth.com\nhti-instrument.com\nhtidc.com\nhtinfor.com\nhtinns.com\nhtinnsjm.com\nhtinv.com\nhtjinju.com\nhtjob.net\nhtjs.net\nhtjsq.com\nhtjsq.mobi\nhtkaoyan.com\nhtkgsx.com\nhtknow.com\nhtky365.com\nhtml5-app.com\nhtml5china.com\nhtml5code.net\nhtml5dw.com\nhtml5mark.com\nhtml5plus.org\nhtml5train.com\nhtml5tricks.com\nhtmlai.com\nhtmleaf.com\nhtmlsucai.com\nhtmycn.com\nhtnice.com\nhtong.com\nhtoo.vip\nhtood.com\nhtool.com\nhtqjy.com\nhtqyy.com\nhtrip.biz\nhts-auto.com\nhtsamc.com\nhtsc.com\nhtsec.com\nhtsec.net\nhtsham.com\nhtsjj.com\nhtslauto.com\nhtsprings.com\nhttdsj.com\nhtths.com\nhttingshu.com\nhttpcanary.com\nhttpcn.com\nhttpdns.pro\nhttpsok.com\nhttpssl.com\nhtucloud.com\nhtudata.com\nhtudns.com\nhturl.cc\nhtv123.com\nhtvaas.com\nhtvcentral.com\nhtwcq.com\nhtwed.com\nhtwx.net\nhtx.cc\nhtxgcw.com\nhtxgssb.com\nhtxrc.com\nhtxxpx.com\nhtxy.net\nhtycs.com\nhtyduck.com\nhtyhm.com\nhtyou.com\nhtys.cc\nhtys123.com\nhtyswzzgw.com\nhtyunwang.com\nhtzdj.com\nhtzdznjs.com\nhtzhgd.com\nhtzipr.com\nhu.com\nhua-chips.com\nhua-lan.com\nhua-yong.com\nhua.com\nhua1000.com\nhua168.com\nhua5.com\nhuaaiangel.com\nhuaan-cpa.com\nhuaao-trust.com\nhuaaojiaoyu.com\nhuaaoranqi.com\nhuaaosoft.com\nhuaaotech.com\nhuaat.com\nhuabaike.com\nhuaban.com\nhuaban.net\nhuabanimg.com\nhuabanpro.com\nhuabbao.com\nhuabeicw.com\nhuabian.com\nhuabianyl.com\nhuabo.net\nhuabocam.com\nhuabokeji.com\nhuabot.com\nhuabuqi.com\nhuacai-tech.com\nhuacai.com\nhuacaijia.com\nhuacaobk.com\nhuacaole.com\nhuacemedia.com\nhuachang-alu.com\nhuachengenjoy.com\nhuachengjx.com\nhuachenholdings.com\nhuachenit.com\nhuachenyuanyang.com\nhuachuangroup.net\nhuaco908.com\nhuacolor.com\nhuacooling.com\nhuada120.com\nhuadabz.com\nhuadachem.com\nhuadan.com\nhuadehyd.com\nhuaderack.com\nhuadian360.com\nhuadiansc.com\nhuadie.com\nhuadihealth.com\nhuadiplan.com\nhuadonghospital.com\nhuadongmedia.com\nhuadongtrack.com\nhuadream.com\nhuaduanbio.com\nhuadun315.com\nhuaduocai.net\nhuaease.net\nhuaeda.com\nhuaer.cc\nhuafaceg.com\nhuafagroup.com\nhuafaih.com\nhuafajituan.com\nhuafang.com\nhuafangdichan.com\nhuafangzhou.com\nhuafasports.com\nhuafatech.com\nhuafeimould.com\nhuafeng-al.com\nhuafeng.com\nhuafengaw.com\nhuafens.com\nhuafer.cc\nhuafu.com\nhuagolf.com\nhuagongkaoyan.com\nhuagujs.com\nhuaguoshan.com\nhuaguoyuan.com\nhuagupai.com\nhuahai-gz.com\nhuahaibiochem.com\nhuahaige.com\nhuahaijiaju.com\nhuahaipharm.com\nhuahanart.com\nhuahanbook.com\nhuahao.com\nhuahengbio.com\nhuahengrobot.com\nhuahengsk.com\nhuahong-group.com\nhuahonggk.com\nhuahongjt.com\nhuahtc.com\nhuahua777.com\nhuahuacaocao.com\nhuahuaka.com\nhuahuamaoyi.com\nhuahuan.com\nhuahuihealth.com\nhuahuizhineng.com\nhuahuo.com\nhuai.gg\nhuaian.com\nhuaiangj.com\nhuaiansgyy.com\nhuaibaobei.com\nhuaibei.com\nhuaibeihosp.com\nhuaicai.cc\nhuaien.com\nhuaigang.com\nhuaihai.tv\nhuaihaixiang.com\nhuaijiufu.com\nhuaimg.com\nhuaimi.com\nhuain.com\nhuainanhy.com\nhuainannet.com\nhuainanren.net\nhuainanzi.com\nhuainet.com\nhuairen588.com\nhuairougreatwallmarathon.com\nhuairtv.com\nhuairui59.com\nhuaitao.vip\nhuaixin88.com\nhuaiyangnews.com\nhuaji.com\nhuaji.store\nhuajia.cc\nhuajiakeji.com\nhuajialishe.com\nhuajian-al.com\nhuajiangai.com\nhuajiankang.com\nhuajianmed.com\nhuajiantong.com\nhuajiao.com\nhuajiaow.com\nhuajiaowu.com\nhuajicnc.com\nhuajieai.com\nhuajifen.com\nhuajin100.com\nhuajinct.com\nhuajing-inf.com\nhuajingsec.com\nhuajingyun.com\nhuajuanma.com\nhuajuanyun.com\nhuajuhotel.com\nhuajx.com\nhuakaifilter.com\nhuake-weixin.com\nhuakewang.com\nhuakeyun.com\nhuakpower.com\nhualady.com\nhualaikeji.com\nhualaiyun.com\nhualala.com\nhualan-tech.com\nhualanbio.com\nhualay.net\nhualet.org\nhualewl.net\nhualiandie.com\nhualiandressing.com\nhualianmining.com\nhualiantv.com\nhualianxin.com\nhualing-pm.com\nhualingjiangong.com\nhualiuniversity.com\nhualong-sz.com\nhualongholding.com\nhualongxiang.com\nhualu5.com\nhualumedia.com\nhualuwood.com\nhualv.com\nhualvtu.com\nhuaman.pub\nhuamanlou.cc\nhuamanlou.com\nhuamao.com\nhuamaobook.com\nhuamaorice.com\nhuamaoshuo.com\nhuamedicine.com\nhuameili.net\nhuameiyuezi.com\nhuamengxiaoshuo.com\nhuami.com\nhuamou.com\nhuamu.com\nhuamuwo.com\nhuan-tai.com\nhuan.tv\nhuananauctionctf.com\nhuananyiyao.com\nhuananzhi.com\nhuanbao.com\nhuanbaoscx.com\nhuanbearing.com\nhuanbeieloan.com\nhuanbeiloan.com\nhuanbeipic.com\nhuandie.com\nhuandonglg.com\nhuane.net\nhuanenet.com\nhuanergy.com\nhuanfeng580.com\nhuang-biao.com\nhuang-jerryc.com\nhuang-jiang.com\nhuangbaoche.com\nhuangbaoquan.com\nhuangbowei.com\nhuangchujunyulong.com\nhuangchun.net\nhuangdao.in\nhuangdao.net\nhuangdc.com\nhuangea.com\nhuangfusl.net\nhuanggangmarathon.com\nhuanggao.net\nhuanggaole.com\nhuangguanluo.com\nhuangh.com\nhuanghaicollege.com\nhuanghanlian.com\nhuanghegongshui.com\nhuanghehr.com\nhuanghepiao.com\nhuanghuacheng.com\nhuangjiemin.com\nhuangjihuang.com\nhuangka.com\nhuangkong.net\nhuanglei.me\nhuangli.com\nhuangli8.com\nhuangliangbo.com\nhuanglong.com\nhuangma.com\nhuangqi1688.com\nhuangshaotian.com\nhuangshimarathon.com\nhuangwei.me\nhuangwei.pro\nhuangxin.dev\nhuangxinwei.com\nhuangyao.work\nhuangye.net\nhuangye51.com\nhuangye88.com\nhuangye88.net\nhuangyifan.com\nhuangyixiaoshuo.com\nhuangyuehe.com\nhuangyuhui.net\nhuangyunkun.com\nhuangzz.xyz\nhuanhaoba.com\nhuanhuanhuishou.com\nhuanhuanxin.com\nhuanhuba.com\nhuanidc.com\nhuanju.net\nhuanjutang.com\nhuanjuyun.com\nhuanle.com\nhuanle800.com\nhuanlecdn.com\nhuanledd.com\nhuanlefish.com\nhuanleguang.com\nhuanletang.com\nhuanlewan.net\nhuanlingpharm.com\nhuanlingxiuxian.com\nhuanlj.com\nhuanmusic.com\nhuanong1688.com\nhuanongdao.com\nhuanpeng.com\nhuanpingge.com\nhuanq.com\nhuanqiu-ltd.com\nhuanqiu.com\nhuanqiu.org\nhuanqiu56.com\nhuanqiuauto.com\nhuanqiuchuguo.com\nhuanqiujiemi.com\nhuanqiukexue.com\nhuanqiumil.com\nhuanqiutape.com\nhuanqiuw.com\nhuanqiuyimin.com\nhuanqu-tec.com\nhuanqunquan.com\nhuansengifts.com\nhuanshoulv.com\nhuante.com\nhuantest.com\nhuanting.cc\nhuantour.com\nhuanuomenye.com\nhuanwen.com\nhuanwenwen.com\nhuanxi.com\nhuanxia.com\nhuanxiangji.com\nhuanximedia.com\nhuanxinchem.com\nhuanxinfluoro.com\nhuanxing1904.com\nhuanxingedu.com\nhuanxio.com\nhuanxiongdd.com\nhuanxiyl.com\nhuanyatour.com\nhuanyingzq.com\nhuanyouji.com\nhuanyuantech.com\nhuanyudns.com\nhuanyule.com\nhuanyumid.com\nhuanyutv.com\nhuanzhu101.com\nhuanzhucv.com\nhuaoe.com\nhuaon.com\nhuaougas.com\nhuapai.com\nhuapiaoer.com\nhuapiaoliang.com\nhuapinwang.com\nhuapontshengchem.com\nhuaqiaobang.com\nhuaqidigital.com\nhuaqin.com\nhuaqinchi.com\nhuaqingkeji.net\nhuaqingtax.com\nhuaqiu.com\nhuaraytech.com\nhuaren-scm.com\nhuarenyingyu.com\nhuarenyizhan.com\nhuari-furniture.com\nhuari.com\nhuaroem.com\nhuarongdao.com\nhuarongled.com\nhuarui.work\nhuarui1952.com\nhuaruiaero.com\nhuaruicom.com\nhuaruidns.com\nhuaruisales.com\nhuas.co\nhuasadata.com\nhuash.com\nhuashangcbbtv.com\nhuashangedu.com\nhuashanglawyer.com\nhuashangtop.com\nhuashen-edu.com\nhuashen-group.com\nhuashen6.com\nhuasheng-automation.com\nhuasheng100.com\nhuashengchn.com\nhuashengdaili.com\nhuashenghaoche.com\nhuashengjia100.com\nhuashengls.com\nhuashengshiyan.com\nhuashengtoutiao.com\nhuashi-sh.com\nhuashi.cc\nhuashi6.com\nhuashichang.com\nhuashidongman.com\nhuashijie.art\nhuashilm.com\nhuashipharmacymtalionlineybpay.com\nhuashitong.net\nhuashphoto.com\nhuashui.com\nhuashuitax.com\nhuashunxinan.net\nhuashuowork.com\nhuasimtour.com\nhuasiwood.com\nhuasongwang.com\nhuasu.net\nhuasuankeji.com\nhuasuhui.com\nhuasuokeji.com\nhuasyun.com\nhuatai-elec.com\nhuatai-pb.com\nhuatai.com\nhuatai1993.com\nhuataiyc.com\nhuatan365.com\nhuatec.com\nhuatech.net\nhuategas.com\nhuatengsci.com\nhuati.cc\nhuatian-hotel.com\nhuatian.net\nhuatianxiangsu.com\nhuatong-logistics.com\nhuatongcloud.com\nhuatu.com\nhuatugz.com\nhuatuo007.com\nhuatuowenda.com\nhuatuoyf.com\nhuaue.com\nhuavisa.com\nhuawan.com\nhuawangzhixun.com\nhuawanyun.com\nhuawe.com\nhuawei-3com.com\nhuawei-eu.store\nhuawei.asia\nhuawei.com\nhuawei.eu\nhuawei.ru\nhuaweiacad.com\nhuaweiapaas.com\nhuaweicloud-dns.com\nhuaweicloud-dns.net\nhuaweicloud-dns.org\nhuaweicloud-idme.com\nhuaweicloud-koophone.com\nhuaweicloud-smn.com\nhuaweicloud-smn.net\nhuaweicloud.com\nhuaweicloudapis.com\nhuaweicloudsite.com\nhuaweicloudwaf.com\nhuaweidevice.com\nhuaweidevice.tel\nhuaweidun.com\nhuaweifile.com\nhuaweiita.com\nhuaweils.com\nhuaweimall.com\nhuaweimarine.com\nhuaweimossel.com\nhuaweioneaccess.com\nhuaweirtc.com\nhuaweisafedns.com\nhuaweishop.net\nhuaweisoft.com\nhuaweisre.com\nhuaweistatic.com\nhuaweiuniversity.com\nhuaweiyun.com\nhuaweizdl.com\nhuawenwin.com\nhuawo-wear.com\nhuawote.com\nhuaxi.net\nhuaxi100.com\nhuaxia.com\nhuaxia77.com\nhuaxiabeidou.com\nhuaxiaeye.com\nhuaxiaf.com\nhuaxiagg.com\nhuaxiajianyan.com\nhuaxiald.com\nhuaxialiangzi.com\nhuaxiangdiao.com\nhuaxianpai.com\nhuaxianzhaopin.com\nhuaxiao5.com\nhuaxiaobaokeji.com\nhuaxiapawn.com\nhuaxiashiwen.com\nhuaxiasz.com\nhuaxiataike.com\nhuaxiazi.com\nhuaxin303.com\nhuaxinbaojie.com\nhuaxincem.com\nhuaxing.com\nhuaxingas.com\nhuaxingchem.com\nhuaxinhz.com\nhuaxinorthop.com\nhuaxinpark.com\nhuaxiong.com\nhuaxirc.com\nhuaxj.net\nhuaxuezoo.com\nhuaxumag.com\nhuaxunbaili.com\nhuaxunholdings.com\nhuayang.net\nhuayanghui.net\nhuayangsolar.com\nhuayanwater.com\nhuayaocc.com\nhuayaody.com\nhuaye.com\nhuayi-faucet.com\nhuayicn.com\nhuayidiaosu.com\nhuayielec.com\nhuayijiahe.com\nhuayilawfirm.com\nhuayilighting.com\nhuayimedia.com\nhuayiming.com\nhuayin114.com\nhuayingglass.com\nhuayingrc.com\nhuayingsc.com\nhuayinhealth.com\nhuayinjapan.com\nhuayinlab.com\nhuayinyiliao.com\nhuayitaitech.com\nhuayitongkeji.com\nhuayitongtai.com\nhuayiwork.com\nhuayiyunxinxi.com\nhuayou.com\nhuayoumengze.com\nhuayoutianyu.com\nhuayuan-print.com\nhuayuanlcd.com\nhuayuchaxiang.com\nhuayue119.com\nhuayueivf.com\nhuayufilter.com\nhuayug.com\nhuayuhua.com\nhuayulandmarkhotel.com\nhuayun.com\nhuayunfl.com\nhuayuzj.com\nhuazhangautomation.com\nhuazhanggroup.com\nhuazhanwire.com\nhuazhen-gs.com\nhuazhen2008.com\nhuazhen2008.net\nhuazhengcaiwu.com\nhuazhengwuye.com\nhuazhenjiaoyu.com\nhuazhiedu.com\nhuazhiweilai.com\nhuazhixingchina.com\nhuazhongcar.com\nhuazhongcnc.com\nhuazhongtimes.com\nhuazhu.com\nhuazhuanapp.com\nhuazhucorp.com\nhuazirc.com\nhubamdi.com\nhubashihuo.com\nhubcyts.com\nhubei88.com\nhubeiamc.com\nhubeibbs.net\nhubeibidding.com\nhubeichengji.com\nhubeici.com\nhubeidaily.net\nhubeifc.com\nhubeifurui.com\nhubeigongfu.com\nhubeihome.net\nhubeiip.com\nhubeijingjunf.com\nhubeikj.com\nhubeinet.com\nhubeipbx.com\nhubeiport.com\nhubeiqiche.org\nhubeiwsd.com\nhubeixuekao.com\nhubeiyanjiusheng.com\nhubeiyongtai.com\nhubeizhengao.com\nhubiao168.com\nhubiazhi.com\nhubing.online\nhubpd.com\nhubsound.com\nhubstudio.vip\nhubulab.com\nhubwd.com\nhubwiz.com\nhuc08.com\nhucais.com\nhucdn.com\nhuceg.com\nhuceo.com\nhuchaowei.com\nhucheng100.com\nhuchihuchi.com\nhudai.com\nhudong.com\nhudong100.com\nhudong100.net\nhudong100.org\nhudongad.com\nhudongba.com\nhudongcdn.com\nhudongku.net\nhudun.com\nhudunsoft.com\nhuduntech.com\nhuelead.com\nhuenhuenfood.com\nhufangkeji.com\nhufangyun.com\nhufe.cc\nhugane.com\nhugcar.com\nhugd.com\nhugecdn168.com\nhugecore.net\nhugeland.com\nhugetall.com\nhugong-js.com\nhugong.com\nhuhaha.net\nhuhanba.com\nhuhaoyang.com\nhuhexian.com\nhuhoo.com\nhuhoo.net\nhuhua.net\nhuhuang.net\nhuhudi.com\nhuhuguanjia.com\nhuhui-sh.com\nhuhustory.com\nhuhutian.com\nhuhutong315.com\nhui-ben.com\nhui-chao.com\nhui.net\nhui10.com\nhui10.net\nhui100.com\nhui43.com\nhui800.com\nhui800.net\nhuians.com\nhuibag.com\nhuibiao-group.com\nhuibiaoinfo.com\nhuibo.com\nhuibojob.com\nhuiboparking.com\nhuiborobot.com\nhuicaishui.net\nhuiche.com\nhuiche100.com\nhuicheimg.com\nhuichenbz.com\nhuichenghuijia.com\nhuichengip.com\nhuichengy.com\nhuichewang.com\nhuichongduo.com\nhuichuangjialife.com\nhuichuangzhanlan.com\nhuicx7.com\nhuida18.com\nhuidabbs.com\nhuidafrp.com\nhuidagroup.com\nhuidan.net\nhuidang.com\nhuidaocaishui.com\nhuidaqg.com\nhuidawanan.com\nhuidazhe.vip\nhuiddo.com\nhuide-medical.com\nhuiderui.com\nhuideyecai.com\nhuidian.net\nhuidiantech.com\nhuidu.com\nhuidu.net\nhuidu001.com\nhuiduogang.com\nhuiemall.com\nhuierming.com\nhuierp.com\nhuifachina.com\nhuifacms.com\nhuifayun.com\nhuifeng-zj.com\nhuifengtools.com\nhuifengxinxi.com\nhuifengzhuzao.com\nhuifenqi.com\nhuifu.com\nhuifudashi.com\nhuifusihai.com\nhuifutz.com\nhuifuzhinan.com\nhuigaiji.com\nhuigao-magnetics.com\nhuigezi.org\nhuiguanwang.com\nhuih110.com\nhuihaha.com\nhuihaicenter.com\nhuihaicn.com\nhuihaiyiyao.com\nhuihe56.com\nhuihefz.com\nhuihengmedical.com\nhuihestone.com\nhuihezx.com\nhuihua365.com\nhuihua8.com\nhuihuaren.com\nhuii.cc\nhuiidea.com\nhuiji.wiki\nhuijiame.com\nhuijian-land.com\nhuijiangroup.com\nhuijiaoyun.com\nhuijiazhileng.com\nhuijidata.com\nhuijie.shop\nhuijiegroup.com\nhuijiewei.com\nhuijimall.com\nhuijing.org\nhuijinggroup.com\nhuijingwl.com\nhuijinshang.com\nhuijinwater.com\nhuijistatic.com\nhuijitrans.com\nhuijiwiki.com\nhuiju.cool\nhuijucn.com\nhuikao8.com\nhuikex.com\nhuikundz.com\nhuila88.com\nhuilaimi.com\nhuilan-online.com\nhuilan.com\nhuilanfoundation.org\nhuilanyujia.com\nhuiliangapp.com\nhuilianyi.com\nhuililong.com\nhuilintyre.com\nhuilinwang.com\nhuilitc.com\nhuiliu.net\nhuiliubao.com\nhuilm.com\nhuilog.com\nhuilongsen.com\nhuilongtech.com\nhuilunbio.com\nhuilv8.com\nhuilvbiao.com\nhuilvwang.com\nhuilvyankuang.com\nhuilw.com\nhuilyn.com\nhuimaiche.com\nhuimaihs.com\nhuiman.net\nhuimee.com\nhuimee.net\nhuimei.net\nhuimeijiaozi.com\nhuimeisports.com\nhuimeiyp.com\nhuimeizr.com\nhuimengchem.com\nhuimengya.com\nhuimiaokeji.com\nhuimin111.com\nhuimincz.com\nhuimingcn.com\nhuimingjia.com\nhuimwang.com\nhuinaimei.com\nhuing.net\nhuinkj.net\nhuion.com\nhuiqia.net\nhuiqianfan.com\nhuiqibaike.com\nhuiqiyidiantong.com\nhuiqiyu.com\nhuiqk.com\nhuiqudsp.com\nhuiqunchina.com\nhuiquzu.com\nhuirde.com\nhuirenshenbao.com\nhuirenyy.com\nhuiris.com\nhuiruanzhuang.com\nhuirui-tech.com\nhuirui1688.com\nhuisem.com\nhuisencapital.com\nhuisenky.com\nhuishandairy.com\nhuishangbao.com\nhuishangol.com\nhuishantech.com\nhuisheng.fm\nhuishengaudio.com\nhuishenghuiying.com\nhuishenghuo.ink\nhuishengqianzhushou.com\nhuishida.com\nhuishou1680.com\nhuishoubao.com\nhuishoubaojiadan.com\nhuishouigbt.com\nhuishoujie.com\nhuishoujiuwu.com\nhuishoushang.com\nhuishouyx.com\nhuishuaka.com\nhuishuirencai.com\nhuishuitech.com\nhuisituo.com\nhuisj.com\nhuisky.com\nhuisou.com\nhuisports.com\nhuisuanzhang.com\nhuisucn.com\nhuisuoping.com\nhuitao.net\nhuitaoche.com\nhuitaoyouhui.com\nhuitengpipe.com\nhuitongqingsuan.com\nhuitoubj.com\nhuitouche.com\nhuitoukao.com\nhuitoukefood.com\nhuitouyan.com\nhuitouyu.com\nhuitouzi.com\nhuitu.com\nhuitu.tech\nhuitu8.com\nhuitun.com\nhuiun.com\nhuiurl.com\nhuivo.com\nhuiwang.net\nhuiweikeji.com\nhuiwenda.com\nhuiwww.com\nhuixianginvest.com\nhuixiangtiandi.com\nhuixiaoer.com\nhuixiaoer.net\nhuixineducation.com\nhuixinggroup.com\nhuixingsoft.com\nhuixinli.com\nhuixinyiyuan.com\nhuixinyt.com\nhuixinyun.com\nhuixsw.com\nhuixuanjiasu.com\nhuixueba.net\nhuiyan315.com\nhuiyangranqi.com\nhuiyankan.com\nhuiyanzhi.com\nhuiyaohuyu.com\nhuiybb.com\nhuiyda.com\nhuiyelaw.com\nhuiyi-123.com\nhuiyi365.net\nhuiyi8.com\nhuiyi9e.com\nhuiyiabc.com\nhuiyiai.net\nhuiyicq.net\nhuiyihealth.com\nhuiyinxun.com\nhuiyizhuo.com\nhuiyou.com\nhuiyou027.com\nhuiyouhotels.com\nhuiyuandao.com\nhuiyuanjia.net\nhuiyuansoft.com\nhuiyuantang.com\nhuiyuanyy.com\nhuiyucn.com\nhuiyuehz.com\nhuiyumedia.com\nhuiyundong.net\nhuiyutools.com\nhuize.com\nhuizecdn.com\nhuizeyoupin.com\nhuizhaofang.com\nhuizhek.com\nhuizhengmachinery.com\nhuizhiguanghua.com\nhuizhihuyu.com\nhuizhijiaxun.com\nhuizhilin.com\nhuizhilin.net\nhuizhimob.com\nhuizhioptech.com\nhuizhou-marathon.com\nhuizhouf.com\nhuiziyuan.net\nhuizone.com\nhuizuche.com\nhuizucloud.com\nhuizuoyuezi.com\nhuizustore.com\nhujia.org\nhujiang.com\nhujianggroup.com\nhujibbs.com\nhujingnb.com\nhuke88.com\nhukeck.com\nhukecs.com\nhukelc.com\nhukenb.com\nhukexyy.com\nhukou021.com\nhukou365.com\nhukuangroup.com\nhulai.com\nhulianfang.com\nhulianmaibo.com\nhulianwangchuangye.com\nhulichuang.mobi\nhulinhong.com\nhulixin.com\nhuliyx.com\nhulubaba.com\nhuluboshi.com\nhuludz.com\nhuluer.com\nhuluip.com\nhuluip.tech\nhuluo.com\nhulusaas.com\nhulusi.com\nhulutrip.com\nhuluwa.cc\nhuluwa365.com\nhuluwa8.com\nhuluxia.com\nhuluxia.net\nhuluzc.com\nhumaiyouxi.com\nhumanplustech.com\nhumanrights-china.org\nhumanwellcaps.com\nhumanwellhb.com\nhumaotec.com\nhumblit.com\nhumengyun.com\nhumensec.com\nhuming.com\nhummcars.com\nhumpline.com\nhunaen.com\nhunan-changda.com\nhunan-huasheng.com\nhunan100km.com\nhunanbestall.com\nhunancatv.com\nhunaneu.com\nhunangaozhi.com\nhunangy.com\nhunanhaihong.com\nhunaniptv.com\nhunanjz.com\nhunanpea.com\nhunantv.com\nhunanxingxin.com\nhunanyuneng.com\nhunanzp.com\nhunanzy.com\nhunau.net\nhunbei.com\nhunbei1.com\nhunbei2.com\nhunbei3.com\nhunbei4.com\nhunbei5.com\nhunbohui.info\nhunbys.com\nhunche.net\nhunchun123.com\nhundredcent.com\nhundsun.com\nhundun.net\nhundx.com\nhunger-valley.com\nhungfei.com\nhungsh.store\nhunli100.com\nhunlian100.com\nhunlihu.com\nhunlihu1.com\nhunlihu2.com\nhunlihunli.com\nhunliji.com\nhunlimama.com\nhunlimao.com\nhunmiao.com\nhunsh.net\nhuntchance.com\nhuntermailfocus.com\nhunteron.com\nhuntic.com\nhuntkey.com\nhuntkeydiy.com\nhuntsbot.com\nhunuo.com\nhunyinyiyuan.com\nhuo07100hy.com\nhuo07110hy.com\nhuo07120hy.com\nhuo07140hy.com\nhuo07150hy.com\nhuo07160hy.com\nhuoas.com\nhuoban.com\nhuobanbot.com\nhuobanhuyu.com\nhuobanimg.com\nhuobanjs.com\nhuobanniu.com\nhuobaowang.com\nhuobaoweishang.com\nhuobaoyx.com\nhuobi.io\nhuocai.com\nhuochai.cc\nhuochai.mobi\nhuoche.com\nhuoche.net\nhuoche.wiki\nhuocheba.com\nhuocheci.com\nhuochehuan.com\nhuochepiao.com\nhuochepiao.net\nhuocheso.com\nhuocms.com\nhuodao.hk\nhuodong.org\nhuodong.store\nhuodong5.com\nhuodonghezi.com\nhuodonghui.net\nhuodongjia.com\nhuodongju.com\nhuodongpro.com\nhuodongshu.com\nhuodongwang.com\nhuodongxing.com\nhuodongzhongguo.com\nhuofar.com\nhuofutp.com\nhuogongdian.com\nhuohao8.com\nhuohoo.com\nhuohuacdn.com\nhuohuahudong.com\nhuohudun.com\nhuohuo.com\nhuoideas.com\nhuoji.com\nhuojiaba.com\nhuojitui.com\nhuoju365.com\nhuokebao.net\nhuokeying.com\nhuokeyuan.com\nhuolala.co\nhuolala.work\nhuole.com\nhuolea.com\nhuoli.com\nhuolieniao.com\nhuolieyun.com\nhuolinhe.com\nhuolishaonianwang.com\nhuolug.com\nhuomakeji.com\nhuomao.com\nhuomaotv.com\nhuomaqun.com\nhuoming.com\nhuomujin.com\nhuonan.net\nhuonao.com\nhuoniuniu.com\nhuopinyuan.com\nhuopu.com\nhuoqibao.com\nhuoqiuw.com\nhuosdk.com\nhuoshan.cc\nhuoshan.club\nhuoshan.com\nhuoshancdn.com\nhuoshangroup.com\nhuoshanimg.com\nhuoshanlive.com\nhuoshanparty.com\nhuoshanstatic.com\nhuoshante8.com\nhuoshanvideo.net\nhuoshanvod.com\nhuoshanxiaoshipin.net\nhuoshanzhibo.com\nhuoshanzhibo.net\nhuoshanzhufang.com\nhuoshen.com\nhuoshen99.com\nhuoshi.shop\nhuosu.com\nhuowan.com\nhuowanes.com\nhuoxiaoyi.com\nhuoxing24.com\nhuoxingyu.com\nhuoxingzi.com\nhuoxun.com\nhuoyan.com\nhuoyan.io\nhuoyanio.com\nhuoyantu.com\nhuoyanyunying.com\nhuoyfish.com\nhuoying.com\nhuoying666.com\nhuoyuan.mobi\nhuoyugame.com\nhuoyuyan.com\nhuoziyin.com\nhupan.com\nhupanedu.com\nhupanoled.com\nhupo.com\nhupo.tv\nhupozhidao.com\nhupu.com\nhupu.io\nhupucdn.com\nhupun.com\nhur05100kns.com\nhur05101kns.com\nhur05111kns.com\nhur05120kns.com\nhur05121kns.com\nhurom.vip\nhurricane618.me\nhurricanechip.com\nhurun.net\nhurx04.xyz\nhurys.com\nhusadw.com\nhusenji.com\nhushangcaifu.com\nhusini.net\nhusiyang.com\nhust-laser.com\nhust-snde.com\nhust-wuxi.com\nhust.cc\nhust.online\nhustcad.com\nhustlife.com\nhustlzp.com\nhustmei.com\nhustnews.com\nhustoj.com\nhustonline.net\nhustp.com\nhustsofc.tech\nhustunique.com\nhustwenhua.net\nhustxb.com\nhustyy.com\nhusubao.com\nhutaojie.com\nhutaolinight.com\nhutegy.com\nhutew.com\nhutong-school.com\nhutong360.com\nhutongcdn.com\nhutoufeng.net\nhutui9.com\nhutuii.com\nhutusi.com\nhuuhoo.com\nhuuing.com\nhuwaibbs.com\nhuwaizb.com\nhuwatech.club\nhuway.com\nhuweihuang.com\nhuweishen.com\nhuwi8.com\nhux6.com\nhuxianwang.com\nhuxiaofan.com\nhuxiaoshi.com\nhuxiji999.com\nhuxijizhongguo.com\nhuxingroup.com\nhuxishiye.com\nhuxiu.com\nhuxiu.link\nhuxiucdn.com\nhuya.com\nhuyajs.com\nhuyall.com\nhuyanapp.com\nhuyanbao.com\nhuyanjie.com\nhuyaos.com\nhuyaruanwen.com\nhuyatvns.com\nhuyayue.com\nhuyn.com\nhuyouxiong.com\nhuyueidc.com\nhuyuekj.com\nhuyuncdn.com\nhuyuning.com\nhuyuxx.com\nhuzhan.com\nhuzhang.com\nhuzhao1.com\nhuzheng.org\nhuzhongxin.com\nhuzhoumj.com\nhuzhoumuseum.com\nhuzicaotang.com\nhuzwater.com\nhvacstar.com\nhvchan.com\nhvcnitl.com\nhvcxo.com\nhvdiy.com\nhvread.com\nhvsgqlo.xyz\nhvtong.com\nhw-ai.com\nhw-go.net\nhw-supply.com\nhw-tm.com\nhw100k.com\nhw3static.com\nhw555.com\nhw99.com\nhwactive.com\nhwad.net\nhwagain.com\nhwait.com\nhwangda.com\nhwanw.com\nhwaq.cc\nhwashi.com\nhwasmart.com\nhwastro.com\nhwasunpharma.com\nhwatson.com\nhwavi.org\nhwbanaa.com\nhwbaoan.com\nhwbfxp5030.vip\nhwbim.com\nhwbs.org\nhwbz.net\nhwccpc.com\nhwcdnsre.com\nhwcloudlive.com\nhwclouds-dns.com\nhwclouds-dns.net\nhwclouds.com\nhwclouds.mobi\nhwclouds.net\nhwclouds.org\nhwcloudsite.com\nhwcloudvis.com\nhwclzq.com\nhwcpb.com\nhwcrazy.com\nhwehs.com\nhweimall.com\nhweventgrid.com\nhwfcw.com\nhwgis.com\nhwhidc.com\nhwht.com\nhwj.com\nhwjianmo.com\nhwjm-mold.com\nhwjyw.com\nhwlifting.com\nhwlpz.com\nhwlxuz.work\nhwocloud.com\nhwoled.com\nhworld.com\nhwpan.com\nhwrecruit.com\nhwshu.com\nhwsupplychain.com\nhwtelcloud.com\nhwtrip.com\nhwtzdl.com\nhwwt2.com\nhwwt8.com\nhwxc.com\nhwxda.com\nhwxfc.com\nhwxjp.com\nhwxnet.com\nhwxuanliuqi.com\nhwyton.com\nhwyxxx.com\nhwzn.com\nhwzuku.com\nhwzyjt.com\nhx-parking.com\nhx-qt.com\nhx-r.com\nhx008.com\nhx008.net\nhx110.com\nhx1h.com\nhx2car.com\nhx2cars.com\nhx36.net\nhx416.com\nhx5658.com\nhx818.com\nhx8886.com\nhx95.com\nhx99.net\nhxacc.com\nhxage.com\nhxbdf120.com\nhxbdxled.com\nhxbl.com\nhxbsth.com\nhxbus.net\nhxc-power.com\nhxccc.org\nhxcd.net\nhxcdn.net\nhxchem.net\nhxchx.org\nhxclouds.com\nhxcsbj.com\nhxct.com\nhxct.ltd\nhxd56.com\nhxdec.com\nhxdi.com\nhxdkfp.com\nhxdkj88.com\nhxdrisk.com\nhxdsbgg.com\nhxdspa.com\nhxdtekf.com\nhxen.com\nhxepawn.com\nhxf111.com\nhxfilm.com\nhxfjw.com\nhxfy888.com\nhxfzzx.com\nhxgame.net\nhxgqw.com\nhxgro.com\nhxgroup.com\nhxgs.com\nhxgs.net\nhxgwott.com\nhxhaoyu.com\nhxhost.com\nhxhssw.com\nhxiangjia.com\nhxing.com\nhxinq.com\nhxjbh.com\nhxjhcloud.com\nhxjinqiao.com\nhxjiot.com\nhxjiqi.com\nhxjnyy.com\nhxjsjkj.com\nhxjstech.com\nhxjwang.com\nhxjxs.com\nhxjxsw.com\nhxkba.com\nhxkfh.com\nhxkgjt.com\nhxkj.cc\nhxkj.vip\nhxkq.net\nhxkq.org\nhxkqyxzz.net\nhxland.com\nhxlbc.com\nhxlbd.com\nhxledu.com\nhxlhjt.com\nhxljjt.com\nhxlot.com\nhxlsw.com\nhxltcj.com\nhxlxx.com\nhxm5.com\nhxmeishi.com\nhxmlyy.com\nhxmryy.com\nhxnews.com\nhxnk.com\nhxny.com\nhxnygx.com\nhxpdd.com\nhxposuiji.com\nhxq123456.com\nhxqc.com\nhxqc.mobi\nhxqcgf.com\nhxqcjt.com\nhxqgczx.com\nhxqnj.org\nhxqtedu.com\nhxqu.com\nhxr100.com\nhxrc.com\nhxsd.com\nhxsd.tv\nhxseal.com\nhxsec.com\nhxsjjt.com\nhxsmart.com\nhxsme.org\nhxspjt.com\nhxssyy.com\nhxstrive.com\nhxsts.com\nhxsyjt.net\nhxt5.com\nhxtk.com\nhxtrip.com\nhxtxxw.com\nhxtzgroup.com\nhxwglm.com\nhxx.net\nhxxkw.org\nhxxl6.com\nhxyd.cc\nhxydup.com\nhxyjw.com\nhxys.com\nhxytea.com\nhxytw.com\nhxyxt.com\nhxyyw.com\nhxz.ink\nhxzf9.com\nhxzlsgs.com\nhy-china.com\nhy-express.com\nhy-f.com\nhy-la.com\nhy-lamp.com\nhy-titan.com\nhy-tp.com\nhy-zr.com\nhy017.com\nhy01888.com\nhy031.com\nhy05190134.com\nhy053.com\nhy074.com\nhy118.com\nhy120.com\nhy12048.com\nhy123.com\nhy1234567.com\nhy163.com\nhy169.com\nhy1862.com\nhy2046.com\nhy219.com\nhy237.com\nhy254.com\nhy261.com\nhy2809.com\nhy296.com\nhy341.com\nhy345.com\nhy346.com\nhy36098.com\nhy375.com\nhy3804.com\nhy385.com\nhy4.cc\nhy410.com\nhy439.com\nhy4445.com\nhy450.com\nhy453.com\nhy464.com\nhy5353.com\nhy552.com\nhy5553.com\nhy563.com\nhy576.com\nhy628.com\nhy636.com\nhy679.com\nhy702.com\nhy7050.com\nhy732.com\nhy762.com\nhy7703.com\nhy7756.com\nhy8881.com\nhy9698.com\nhy9905.com\nhyagrochem.com\nhyagv.com\nhyahm.com\nhyaimed.com\nhyakkaryouran.date\nhyb2b.com\nhybase.com\nhybbs.net\nhybbtree.com\nhybiome.com\nhybssy.com\nhyc.com\nhyccw.com\nhycdn.com\nhycet.com\nhycfw.com\nhycgy.com\nhyckjic.com\nhycn.com\nhydarts.com\nhydbest.com\nhyddd.com\nhydesolar.com\nhydravizoficial.info\nhydst.com\nhydun.com\nhydz999.com\nhydzfp.com\nhydzswyxgs.com\nhyec.com\nhyedu.com\nhyexpo.com\nhyext.com\nhyey.com\nhyeycg.com\nhyflc.com\nhyfutures.com\nhyfxbj.com\nhyfyuan.com\nhyggfx.com\nhygkit.com\nhygmgroup.com\nhygoldcup.com\nhygxbgd.com\nhygy361.com\nhyham.com\nhyhcdn.com\nhyhdtg.com\nhyhhgroup.com\nhyhjzc.com\nhyhl66.com\nhyhospital.com\nhyhqjt.com\nhyhro.com\nhyhscm.com\nhyht.fun\nhyhuo.com\nhyhxt.net\nhyhy.cc\nhyhyn.com\nhyilp.com\nhyimmi.com\nhyipchina.com\nhyj999.com\nhyjgxx.com\nhyjhgy.com\nhyjnpx.com\nhyjxmx.com\nhykang.com\nhykcsoft.com\nhykiln.com\nhykj.cc\nhyl1.tv\nhylanda.com\nhylandslaw.com\nhylicreate.com\nhylik.net\nhylname.com\nhymake.com\nhymall.net\nhymater.com\nhymcu.com\nhymicrofiber.com\nhymicrosystem.com\nhymjy.net\nhymson.com\nhynet.co\nhynetek.com\nhynews.net\nhyngj.com\nhynixic.com\nhynpay.com\nhynyw.com\nhyocr.com\nhyouda.com\nhyp-arch.com\nhypefolio.com\nhypefolio.net\nhyper.sh\nhyper3d.ai\nhypercachenet.com\nhypercachenode.com\nhypergryph.com\nhypergryph.net\nhyperguestai.com\nhypers.com\nhypersilicon.com\nhypersnap.net\nhyperstrong.com\nhyphencargo.com\nhyplc.com\nhypnotherapyforeverybody.com\nhyppmm.com\nhyptec.com\nhypyimei.com\nhyqcw.com\nhyqdxcl.com\nhyrainbow.com\nhysbz.com\nhysec.com\nhyseim.com\nhyshengnian.org\nhyshi.net\nhysound.com\nhysteeltube.com\nhyswcn.com\nhyswjt.net\nhysyyl.com\nhysz.net\nhyt01.com\nhyt368.com\nhytbj.com\nhytch.com\nhytcshare.com\nhytd.com\nhytera.com\nhytxhd.com\nhytzqb.com\nhyun.cc\nhyundai-chhm.com\nhyundai-hmtc.com\nhyuuhit.com\nhyuyy.com\nhywater.net\nhywaternet.com\nhywh1999.com\nhywjjz.com\nhywx.com\nhyx1927.com\nhyxiang888.xyz\nhyxrmt.com\nhyxsoft.com\nhyxt.com\nhyy99.com\nhyybj.com\nhyyf.net\nhyyl.net\nhyyoa.com\nhyypjs.com\nhyyun.com\nhyyykj.net\nhyyyy.net\nhyyzy.com\nhyzc.com\nhyzc.net\nhyzcservice.com\nhyzenhospital.com\nhyzhcdn.com\nhyzhihe.com\nhyznjs.com\nhyzui.com\nhz-alw.com\nhz-bdqn.com\nhz-ch.com\nhz-delixi.com\nhz-emc.com\nhz-etest.com\nhz-expo.com\nhz-gaoke.com\nhz-gn.com\nhz-hospital.com\nhz-jsyg.com\nhz-kedi.com\nhz-moon.com\nhz-pharm.com\nhz-polar.com\nhz-spring.net\nhz-tire.com\nhz-tt.com\nhz-winone.com\nhz-xiaofei.com\nhz-xin.com\nhz-zhuce.com\nhz-zq.com\nhz2jx.com\nhz2y.com\nhz3201.com\nhz3ds.com\nhz3y.com\nhz66.com\nhz6z.com\nhz7hospital.com\nhz8z.net\nhz9hospital.com\nhzabjt.com\nhzaee.com\nhzahy.com\nhzaiguojiang.com\nhzairport.com\nhzajjt.com\nhzallina.com\nhzamcare.com\nhzaoz.com\nhzapu.com\nhzapuqi.com\nhzaygb.com\nhzazh.com\nhzbcdp.com\nhzbcxg.com\nhzbh.com\nhzbhjy.com\nhzbhsh.com\nhzbianqing.com\nhzbianqu.com\nhzbike.com\nhzbjwy.com\nhzbk.net\nhzbojin.com\nhzbomed.com\nhzbook.com\nhzboxing.com\nhzboxuan.com\nhzbpm.com\nhzbx.com\nhzbxm.com\nhzc.com\nhzcables.com\nhzcbparking.com\nhzcbs.com\nhzccb.net\nhzcctech.com\nhzcd120.com\nhzcda.com\nhzcdhcyy.com\nhzcdycyy.com\nhzcdyyhc.com\nhzcdyyyc.com\nhzcekong.com\nhzch.org\nhzchaoxiang.com\nhzchengdun.com\nhzchengdun.net\nhzchgj.com\nhzcjtz.com\nhzcmc.com\nhzcmdq.com\nhzcnc.com\nhzcollege.com\nhzcopyright.com\nhzcourse.com\nhzctjs.com\nhzctkj.com\nhzctxh.com\nhzcy.com\nhzczjt.com\nhzdajiangdong.com\nhzdare.com\nhzddwk.com\nhzdelian.com\nhzdely.com\nhzdgjc.com\nhzdjr.com\nhzdjy.com\nhzdledu.com\nhzdlrj.com\nhzdmpower.com\nhzdongyu.com\nhzdq.com\nhzdsrmyy.com\nhzdtv.tv\nhzdx.com\nhzebang.com\nhzec-tencentclb.cloud\nhzec-tencentclb.com\nhzec-tencentclb.net\nhzec-tencentclb.work\nhzecsemir.com\nhzeeec.com\nhzeg.com\nhzelec.com\nhzepd.com\nhzeyun.com\nhzfc.cc\nhzfc365.com\nhzfeat.com\nhzfeiyao.com\nhzfesco.com\nhzfj.com\nhzfllbj.com\nhzfolo.com\nhzfpay.com\nhzfstz.com\nhzfucai.net\nhzfuturehos.com\nhzfwq.com\nhzfzxh.com\nhzgcec.com\nhzgcgl.com\nhzggfw.com\nhzgh.org\nhzgjj.com\nhzglsb.com\nhzgmwl.com\nhzgolong.com\nhzgoyuan.com\nhzgrow.com\nhzgrys.net\nhzgthb.com\nhzguode.com\nhzguojiao.com\nhzgwzn.com\nhzgxr.com\nhzgymd.com\nhzgzsoft.com\nhzh0775.com\nhzh1.com\nhzhadx.com\nhzhanbo.com\nhzhchj.com\nhzhcia.com\nhzhcloud.com\nhzhebei.com\nhzhehua.com\nhzhehui.com\nhzhengding.com\nhzhengtong.com\nhzhf.com\nhzhfdc.com\nhzhfzx.com\nhzhike.com\nhzhisoft.com\nhzhkai.com\nhzhl666.com\nhzhlcc.com\nhzhlgzx.net\nhzhlpt.com\nhzhltec.com\nhzhm888.com\nhzhnano.com\nhzhnzdh.com\nhzhqdj.com\nhzhqqz.com\nhzhr.com\nhzhssy.com\nhzhstb.com\nhzhtlh.com\nhzhuning.com\nhzhuti.com\nhzhx.com\nhzhxfy88888.com\nhzhxsy.com\nhzhy163.com\nhzhyqp.com\nhziam.com\nhzimc.com\nhzinfo.com\nhzins.com\nhzins.net\nhzj7.com\nhzjbzg.com\nhzjcbg.com\nhzjcp.com\nhzjcqczl.com\nhzjcxh.com\nhzjdi.net\nhzjiaro.com\nhzjiaxiao.com\nhzjie7.com\nhzjingxian.com\nhzjinlu.com\nhzjiuyimo.com\nhzjizhun.com\nhzjlcs.com\nhzjljt.com\nhzjmjl.com\nhzjndz.com\nhzjqhy.com\nhzjsjl.com\nhzjtfw.com\nhzjtgcjt.com\nhzjtjl.com\nhzjtjypt.com\nhzjunglepay.com\nhzjuzhi.com\nhzjxapp.com\nhzjxhy.com\nhzjxj.com\nhzjxmd.com\nhzjyks.net\nhzjynet.com\nhzjywl.net\nhzjzjc.com\nhzjzmed.com\nhzjzxh.com\nhzkaiming.com\nhzkangji.com\nhzkayo.com\nhzkcck.com\nhzkemengda.com\nhzkesheng.com\nhzkjcyy.com\nhzkjgf.com\nhzkjn.com\nhzkln.com\nhzklyy.com\nhzkqyyjt.com\nhzkszx.com\nhzlange.com\nhzlawyer.net\nhzlczx.com\nhzleaper.com\nhzleshun.com\nhzlgzs.net\nhzliangdong.com\nhzlingxing.com\nhzljlyy.com\nhzlp.com\nhzlqgroup.com\nhzlrbiotech.com\nhzlrhb.com\nhzlug.org\nhzlyhs.com\nhzmama.net\nhzman.net\nhzmansheng.com\nhzmantu.com\nhzmba.com\nhzmcd.com\nhzmctech.com\nhzmdch.com\nhzmdcnc.com\nhzmeizhuo.com\nhzmest.com\nhzmetro.com\nhzmgdj.com\nhzmixc.com\nhzmkdq.com\nhzmobius.com\nhzmogo.com\nhzmrcar.com\nhzmsholding.com\nhzmt001.com\nhzmtg.com\nhzmtjx.com\nhzmxkj.net\nhzmygg.com\nhzmylike.com\nhzncc.com\nhznet.tv\nhznetwk.com\nhznewface.com\nhznews.com\nhznkg.com\nhznrkj.com\nhznsh.com\nhzntjt.com\nhznunxc.com\nhznzcn.com\nhzok.net\nhzorganicchem.com\nhzou.net\nhzpcs.com\nhzpgc.com\nhzpswy.com\nhzpzs.net\nhzqfy.com\nhzqiuxue.com\nhzqj.com\nhzqjdz.net\nhzqlpt.com\nhzqsn.com\nhzqszl.com\nhzqvod.com\nhzqx.com\nhzqxbg.com\nhzqyhydrogen.com\nhzr1.com\nhzragine.com\nhzranqu.com\nhzrc.com\nhzrczx.net\nhzrdjt.com\nhzredream.com\nhzrib.com\nhzriyue.com\nhzrjjg.com\nhzrjkf.com\nhzrjmy.com\nhzrlciec.com\nhzrlhy.com\nhzrobam.com\nhzrqgf.com\nhzrsl.com\nhzrxsoft.com\nhzs2sc.com\nhzsaifang.com\nhzsanjiaomao.com\nhzsaso.com\nhzsbysj.com\nhzsbz.com\nhzsco.com\nhzscxsj.com\nhzsdjzgs.com\nhzsdlrmyy.com\nhzsdyfzfxxx.com\nhzseedcorp.com\nhzsgjj.com\nhzsh666.com\nhzshanjie.com\nhzshantai.com\nhzshengjia.com\nhzshudian.com\nhzshuren.com\nhzshw.com\nhzsjnxh.org\nhzslgf.com\nhzslgzx.com\nhzsmbio.com\nhzsnowcom.com\nhzsource.com\nhzsp.com\nhzspeed.com\nhzsports.net\nhzsqhb.com\nhzsqsmart.com\nhzsswjt.com\nhzstad.com\nhzstad88.com\nhzstar.com\nhzstarshuaier.com\nhzsteel.com\nhzstlzxyy.com\nhzsun.com\nhzsunup.com\nhzswmotor.com\nhzswysyy.com\nhzszls.com\nhzszyyy.com\nhztbc.com\nhztchj.com\nhztcm.net\nhztdjt.com\nhzteaexpo.com\nhztek.com\nhzthinker.net\nhztianchuang.com\nhztianlang.com\nhztiger.com\nhztssy.com\nhztuoliang.com\nhztvmg.com\nhztx.com\nhztzkj.net\nhzvillas.com\nhzvtc.net\nhzwan.com\nhzwatch.com\nhzwaye.com\nhzweiheng.com\nhzwentou.com\nhzwer.com\nhzwf.link\nhzwgc.com\nhzwindpower.com\nhzwlt.com\nhzwluo.com\nhzwmhp.com\nhzwmw.com\nhzwomenmarathon.com\nhzwotu.com\nhzwqscl.com\nhzwsa.com\nhzwsjyjt.com\nhzwtech.com\nhzwyx.net\nhzx.center\nhzx8188.com\nhzxbcs.com\nhzxddt.com\nhzxded.com\nhzxdfpr.com\nhzxdship.com\nhzxiangbin.com\nhzxiangshang.com\nhzxiaoya.com\nhzxinglong-ip.com\nhzxiyuege.com\nhzxma.com\nhzxqf.com\nhzxsjgxx.com\nhzxsjtzt.com\nhzxuanming.com\nhzxuhong.com\nhzxy888.com\nhzxyns.com\nhzxywlkj.com\nhzyanglao.com\nhzyaohao.com\nhzyapu.com\nhzyb.com\nhzyestar.com\nhzyhjg.com\nhzyhzp.com\nhzyidc.com\nhzyjd.com\nhzyllh.com\nhzylpco.com\nhzyn888.com\nhzyoka.com\nhzyoushu.com\nhzyqys.com\nhzyread.com\nhzyuejie.com\nhzyuewan.com\nhzywinf.com\nhzyxart.com\nhzyye.com\nhzyys.com\nhzyz.net\nhzyzxx.net\nhzzbco.com\nhzzckg.com\nhzzfxx.com\nhzzh.com\nhzzhaobiao.com\nhzzhhd.com\nhzzhileng.com\nhzzhiwei.com\nhzzhjs.com\nhzzhonggang.net\nhzzhonghao.com\nhzzhuode.com\nhzzhyl.com\nhzzhzm.com\nhzzjjsgc.com\nhzzjzk.com\nhzzkj.net\nhzzp.com\nhzzpko3186.vip\nhzzqzc.com\nhzzrmc.com\nhzzsfs.com\nhzzsxh.com\nhzztkj.com\nhzzuyin.com\nhzzx365.com\nhzzxyjhyy.com\nhzzxyy.com\nhzzzpt.com\ni-27.name\ni-520.net\ni-bei.com\ni-bestmind.com\ni-bigdatas.net\ni-click.com\ni-conference.org\ni-excellence.com\ni-f.work\ni-fanr.com\ni-firefly.com\ni-haitao.com\ni-hifi.com\ni-ktv.com\ni-lewan.com\ni-lu.cc\ni-m.dev\ni-manji.com\ni-markit.com\ni-md.com\ni-miguo.com\ni-mock.com\ni-modec.com\ni-mofang.com\ni-morefun.com\ni-mylab.com\ni-neeq.com\ni-now.com\ni-oranges.com\ni-same.com\ni-sensjs.com\ni-shu.com\ni-shunxi.com\ni-size.com\ni-swimmer.com\ni-tetris.com\ni-tongfang.com\ni-touchpanel.com\ni-vista.org\ni-weichuan.com\ni-xiaohaibao.com\ni-xinnuo.com\ni-xoron.com\ni-z-e.com\ni.dell.com\ni007.vip\ni027.com\ni0349.com\ni0469.com\ni0734.com\ni0746.com\ni075.com\ni0766.com\ni0898.org\ni11r.com\ni121.net\ni1236.net\ni1608.com\ni16949.com\ni171.com\ni1758.com\ni1766.com\ni178.info\ni1r.cc\ni2863.com\ni2abc.com\ni2eas.com\ni2finance.net\ni2ya.com\ni360mall.com\ni369.com\ni3839.com\ni3abox.com\ni3ciebwk6ixfb.com\ni3done.com\ni3dpworld.com\ni3geek.com\ni3gt.com\ni3smot.com\ni3vsoft.com\ni3yuan.com\ni3z.cc\ni4px.com\ni4t.com\ni51game.com\ni52tt.com\ni5399.com\ni56r.com\ni588ku.com\ni5a6.com\ni5i6.net\ni5p.com\ni5sto.com\ni5tea.com\ni66wan.com\ni6879.com\ni72.com\ni7car.com\ni7fh.com\ni7gg.com\ni7ol.com\ni7play.com\ni7txt.cc\ni8956.com\ni8i8i8.com\ni8toys.com\ni8tq.com\ni91pv.com\ni965300.com\ni987.com\ni9978.net\ni9dhjx.ru\ni9mr.com\ni9rht.com\ni9star.com\nia-shenzhen.com\niaapc.org\niacstar.com\niaddata.com\niadmob.com\niadmore.com\niadpush.com\niadtracker.com\niaeac.org\niagefans.com\niai-robot.com\niaion.com\niaitao.com\niaixue.com\niajl.org\nialicdn.com\nialloc.com\niamabio.com\niambocai.com\niameduwork.com\niamfisher.net\niamips.com\niamle.com\niamlintao.com\niamlm.com\niamshuaidi.com\niamsujie.com\niamtxt.com\niamvloger.com\niamvlogger.com\niamxcb.com\niamxiaoming.net\niamxk.com\nianbaby.com\niandun.com\nianvisa.com\nianxing.com\niaocwbk.com\niaoligame.com\niaoyou.com\niaozi.com\niaozu.com\niape-js.com\niapijy.com\niapkk.com\niapolo.com\niappdaily.com\niapple123.com\niappler.net\niapps.im\niappsafe.com\niappsign.com\niappstoday.com\niapptry.com\niarlejz.com\niars-wuhan.com\niask-media.com\niask.com\niask.in\niaskhot.com\niasmr.cc\niat-auto.com\niautodaily.com\niautodraw.com\niautopress.com\niavira.com\niaviva.com\niavlife.com\niaxure.com\niazhi.com\nib-china.com\nib3-gogin.com\nibabyjoy.com\nibadboy.net\nibailve.com\nibaiqiu.com\nibaitiao.com\nibaizhu.com\nibanana.club\nibanbu.com\nibanggo.com\nibangkf.com\nibangquan.com\nibangtiao.com\nibanma.net\nibanquan.com\nibantang.com\nibanyu.com\nibaobay.com\nibaoji.cc\nibaoji.com\nibaossl.com\nibaotu.com\nibaoxiu.net\nibaralioho.com\nibashu.net\nibayapp.com\nibb2b.com\nibbwhat.com\nibcet.org\nibczy.com\nibdxigualive.com\nibdxiguavod.com\nibee360.com\nibeidiao.com\nibeifeng.com\nibeiig.com\nibenxi.com\nibestapp.com\nibestfanli.com\nibeta.me\nibianma.com\nibicn.com\nibidian.com\nibiji.com\nibingniao.com\nibiquge.info\nibiquge.la\nibiquge.net\nibiquges.com\nibiquges.info\nibiquges.org\nibiquke.com\nibiquku.la\nibiquxs.info\nibiquxs.net\nibiquzw.info\nibireme.com\nibituo.com\nibixiaxs.com\nibkcn.com\nibkstore.com\nibl520.com\niblimg.com\niblog.ren\nibloger.net\niblue.com\niblue.me\nibluefrog.com\nibluesocial.com\niblwl.com\nibm-dns.com\nibmfwqdl.com\nibmhz.com\nibmwclub.com\nibobscs.com\nibodao.com\nibodyhome.com\niboohee.com\nibook8.com\nibooker.cc\nibooloo.com\nibornclinic.com\nibossay.com\nibox.art\niboxpay.com\nibreader.com\nibribery.com\nibrilife.com\nibroadlink.com\nibruce.info\nibscdn.com\nibtsat.com\nibucm.com\nibuick.com\nibuscloud.com\nibuscloud.net\nibuychem.com\nibw.cc\nibytedapm.com\nic-bro.com\nic-captain.com\nic-itssc.org\nic-king.com\nic-ldo.com\nic-leasing.com\nic-mag.com\nic-spic.com\nic-valley.com\nic001.org\nic2china.com\nic37.com\nic71.com\nic72.com\nic98.com\nic9cube.com\nica-alliance.org\nicabcm.org\nicaew-china.com\nicafe8.com\nicafe8.net\nicai.vip\nicaidao.com\nicaifu.com\nicaile.com\nicall.me\nican-x.com\nican365.net\nicandata.com\nicaneasy.com\nicangshu111.com\nicanvideo.com\nicarbonx.com\nicardfinancial.com\nicaredbd.com\nicasiso.com\nicastlewar.com\nicax.org\nicbc\nicbc-at.com\nicbc-axa.com\nicbc-cz.com\nicbc-ltd.com\nicbc-uk.com\nicbc-us.com\nicbc.ae\nicbc.be\nicbc.jp\nicbcamg.com\nicbcasia.com\nicbcindia.com\nicbcit.com\nicbcleasing.com\nicbcme.ae\nicbcmy.com\nicbcparis.fr\nicbcpl.com\nicbcstandard.com\nicbcstandardbank.com\nicbcstandardresources.com\nicbcstandardsecurities.com\nicbcswiss.com\nicbcwallet.com\nicbeexpo.com\nicbkus.com\nicbuy.com\nicc.link\niccchina.com\niccessh.org\niccgame.com\niccgame.net\nicchaoren.com\niccidchaxun.com\niccircle.com\niccsz.com\nicctbs.org\niccvlog.com\nicdeal.com\nicdemi.com\nicdmall.com\nicdn2.com\nicdream.com\nicdt-conf.com\nice.work\nice1000.org\nice138.com\niceasy.com\nicebear.me\nicebound.cc\nicecloud-car.com\nicedropper.com\niceflowsoft.com\nicefoxgame.com\nicehotisland.com\niceinto.com\nicekylin.online\nicemle.org\nicentown.com\nicepie.net\niceread.com\niceriverbj.com\nicesimba.com\nicesofts.com\nicevpn.org\nicewingcc.com\nicewoo.com\nicfans.com\nicfcc.com\nicfgblog.com\nicfqs.com\nicfusions.com\nicg.cc\nicgbl.org\nicgebm.org\nicgoo.net\nicgu.com\nich8.com\nichacha.com\nichanfeng.com\nichang8.com\nichangtou.com\nichanyu.com\nichaoshangyue.com\nichaotao.com\nichaotu.com\nichat800.com\nichatcn.com\nichdata.com\nicheese.net\nichehome.com\nichemsafe.com\nichenfu.com\nichengli.com\nichengsi.com\nichengyun.net\nichennan.com\nicheruby.net\nicheshi.com\nichezhan.com\nichhlj.com\nichika.cc\nichinaceo.com\nichinaenergy.com\nichong123.com\nichongdao.com\nichtcm.com\nichuanglan.com\nichuangye.com\nichuanyi.com\nichuguang.com\nichunqiu.com\nichunt.com\nichzh.com\niciba.com\niciba.net\nicicicic.com\nicignacmb.com\nicinfo.net\nicirculation.com\nicitizens.net\nicitymobile.com\nicixun.com\niciyuan.com\nicjs.ink\nickeep.com\nicketang.com\nickey.cc\nickimg.com\niclabcn.com\niclicash.com\niclickstatic.com\nicliexpo.com\nicljt.com\nicloud-power.com\nicloudcity.com\nicloudgslb.com\nicloudnative.io\nicloudnews.net\niclouds.work\nicloudv6.com\nicloudwaf.com\nicmaxgroup.com\nicme14.org\nicminer.com\nicmomo.com\nicmp.link\nicmsdev.com\nicnal.com\nicnano-tech.com\nicncpc.com\nicnjob.com\nicnkr.com\nicntv.tv\nicntv.xyz\nicntvcdn.com\nico-deli.com\nicoat.cc\nicoc.bz\nicoc.in\nicoc.me\nicoc.vc\nicodelogic.com\nicoderobot.com\nicofchina.com\nicomuimi.com\niconntech.com\nicoolby.com\nicoonal.xyz\nicoou.com\nicoremail.net\nicos8.com\nicosky.com\nicostapp.com\nicosz.com\nicot.com\nicourse163.com\nicourse163.org\nicourses163.com\nicourses163.org\nicourt.cc\nicp.red\nicp100.net\nicp21.com\nicpapi.com\nicpbcm.org\nicpcdn.com\nicpcw.com\nicpdaili.com\nicpdf.com\nicpenguin.com\nicpenguin.net\nicphu.com\nicpisp.net\nicpkuaiban.net\nicplishi.com\nics-sec.com\nicshanghai.com\nicsisia.com\nicslx.com\nicsoc.net\nicson.com\nicspec.com\nicsprout.com\nicstreet.com\nicsuns.com\nicswb.com\nict18.com\nict361.com\nict88.com\nictbda.com\nictcsr.org\nictdns.cloud\nictdns.icu\nictdns.store\nictdns.tech\nictehi.com\nictest8.com\nictlce.com\nictown.com\nictp-ap.org\nictpaas.com\nictun.com\nictuniv.com\niculture.cc\nicustomslawyer.com\nicv-ip.com\nicvcs.com\nicver.com\nicvip.com\nicxbk.com\nicxinli.com\nicy-capital.com\nicytown.com\nicyuyan.net\nicz.com\niczhiku.com\niczoom.com\nid-bear.com\nid-photo-verify.com\nid57.com\nid6.me\nida-a.org\nidachu.com\nidacn.org\nidadt.com\nidailycar.com\nidaima.com\nidangyang.com\nidanpianji.com\nidaocao.com\nidaotuo.com\nidasai.com\nidatacube.com\nidataforces.com\nidatage.com\nidatagx.com\nidataway.com\nidatawz.com\nidayer.com\nidbhost.com\nidc-icp.com\nidc002.com\nidc021.com\nidc027.net\nidc029.com\nidc123.com\nidc129.com\nidc1680.com\nidc180.com\nidc218.com\nidc31.com\nidc35.com\nidc4.com\nidc400.com\nidc45.com\nidc789.com\nidc917.com\nidcay.com\nidcbdy.com\nidcbest.com\nidcbest.hk\nidccenter.net\nidcchacha.com\nidccom.net\nidccun.com\nidcd.com\nidcdoc.com\nidceb.com\nidcfengye.com\nidcgcloudcs.com\nidchz.com\nidchz.net\nidcicp.com\nidcicpdns.com\nidcjf.com\nidckx.com\nidcloudbase.com\nidcmz.com\nidcoffer.com\nidcpu.com\nidcquan.com\nidcsec.com\nidcser.com\nidcsh.com\nidcsmart.com\nidcsp.com\nidcspy.com\nidcspy.net\nidcss.com\nidctalk.com\nidctq.com\nidcug.com\nidcum.net\nidcun.com\nidcvendor.com\nidcvip.net\nidcwn.com\nidcwp.com\nidcys.com\nidcyunwei.org\nidczone.net\nidd1.com\niddddg.com\nideabody.com\nideacarbon.org\nideacms.net\nideacreated.com\nideaflow.pro\nideagou.com\nideaintellij.com\nidealbags.com\nidealcontrol.com\nidealdeposition.com\nidealeer.com\nidealideapromos.com\nidealjj.com\nidealshanghai.com\nideanote.cc\nideapool.tv\nideappt.com\nidearhanyu.com\nideasr.com\nideassoft.com\nideation.love\nideazhao.com\nideepin.com\nidejian.com\nidejian.net\niden123.com\nidepu.org\nidesktopcal.com\nidevbase.com\nidgeeks.net\nidgou.com\nidgvc.com\nidianchou.com\nidianfa.com\nidiankj.com\nidianshijia.com\nidiaoyan.com\nidigi.net\nidingju.com\nidlegog.com\nidloves.com\nidlpc.win\nidmchina.net\nidmzj.com\nidnscloud.com\nido-love.com\nido512.com\nidoacg.com\nidocbank.com\nidocv.com\nidodb.com\nidol001.com\nidolmoba.com\nidom.me\nidong.ren\nidongde.com\nidongdong.com\nidongniu.com\nidongzhi.com\nidooshu.com\nidosend.com\nidotools.com\nidoupiao.com\nidouqu.com\nidourl.com\nidouyinliving.com\nidouyinpic.com\nidouyinstatic.com\nidouyinvod.com\nidouzi.com\nidoyun.com\nidqqimg.com\nidreamsky.com\nidreamsoft.com\nidrools.com\nidrwl.com\nidscn.net\nidshi.com\nidsoo.com\nidspub.net\nidss.shop\nidsuipai.com\nidtcdn.com\nidtechwh.com\nidu9.com\niduba.com\niduiying.com\nidukaqi.com\niduochong.com\niduodou.com\niduokan.net\niduomi.cc\nidux-vw.com\nidwzs.com\nidwzx.com\nidx365.com\nie13.com\nie515.com\nie525.com\nie57.com\nie815.com\nie915.com\nie935.com\nieasn.com\nieasou.com\nieasy123.com\nieasyclick.net\nieasytech.com\nieasytest.net\nieayoio.com\niecdn.com\niecidc.com\niecity.com\niecool.com\niecworld.com\nieduchina.com\nieduglobe.com\nieechina.com\nieee-jas.net\nieeepower.com\nieeewifi.com\nieeod0.com\nieepa.org\nieevchina.com\niefang.com\niefans.net\nieffect.cc\nieforever.com\niefrd.com\niefxz.com\niegcom.com\niegourl.com\nieh-hz.com\niehou.com\nieisystem.com\niejiu.com\nieliulanqi.net\nieltsabc.com\nieltsonlinetests.com\niemailforce.com\niemblog.com\niemiq.com\niemnet.xyz\niemouepk.com\nienglish.store\nienjoys.com\nienjoys.mobi\nientire.biz\niepcn.com\niepose.com\nieppcn.com\nierze.com\niesdouyin.com\niesdouyin.net\nieshs.com\nieshs.net\nieshuodong.net\nieshuoshan.com\nieshuoshan.net\niessay100.com\nietdata.com\nietheivaicai.com\nietheme.com\nietrcd.com\nievision.com\niewb.net\niewie.org\niewoai.com\niewzx.com\niex-group.com\niexx.com\nieyecloud.com\niezuo.com\nif1f.com\nifabao.com\nifabiao.com\nifaclub.com\nifactz.com\nifanbei.com\nifangarden.com\nifangka.com\nifanpu.com\nifanr.com\nifanr.in\nifanrcloud.com\nifanrusercontent.com\nifanrx.com\nifareast.com\nifatrabbit.com\nifaxin.com\nifaxin.org\nifconfig.cc\nifcresidence.com\nifdian.net\nifeart.ltd\nifedge.com\nifeehei.xyz\nifeilian.com\nifeimo.com\nifeng.com\nifengcdn.com\nifengcu.com\nifenghui.com\nifengidc.com\nifengimg.com\nifengli.com\nifenglian.com\nifenglife.com\nifengmap.com\nifengo.com\nifengpai.com\nifengqun.com\nifenguo.com\nifengweekly.com\nifengwoo.com\nifengyin.com\nifensi.com\nifenxi.com\nifenxiang.cc\nifere.com\nifeve.com\niffline.com\nifindever.com\nifintechnews.com\nifireeye.com\nifireflygame.com\nifish7.com\nifitbox.com\nifjing.com\nifjqq.com\nifkeji.com\niflix.com\niflow.work\niflowercity.com\niflyadx.com\niflyaiedu.com\niflydatahub.com\niflydocs.com\niflygse.com\niflyhealth.com\niflying.com\niflyink.com\niflyiot.com\niflynote.com\niflyread.com\niflyrec.com\niflyresearch.com\niflysec.com\niflytek.com\niflytektstd.com\niflytoy.com\nifmtech.com\nifnews.com\nifonelab.net\nifonts.com\niforce-ad.com\niforce-media.com\nifoxfactory.com\nifoxhui.com\nifread.com\nifreecdn.com\nifreecomm.com\nifreedom.icu\nifreedom001.com\nifreetalk.com\nifreeurl.com\nifresh.mobi\nifromvr.com\nifscity.com\nifseclabs.com\nifshot.com\nifundstore.com\nifunmac.com\nifutest.com\nifutureworks.com\nifxtx.com\nifzxs.cc\nifzzw.com\nigaichong.com\nigame007.com\nigame58.com\nigamecj.com\nigandan.com\nigao7.com\nigaoda.com\nigaokaopai.com\nigaosheng.com\nigarwin.com\nigbill.com\nigdzc.com\nigea-un.org\nigeak.com\nigeciku.com\nigeekbar.com\nigeekys.com\nigehuo.com\nigeidao.com\nigelou.com\nigenetech.com\nigengmei.com\nigeshui.com\nigetget.com\nigetmall.net\nigetui.com\nigevin.info\nigexin.com\nigimu.com\nigkbroker.com\niglda.com\niglqh.com\nigo180.com\nigocctv.com\nigome.com\nigomkt.com\nigoodgame.com\nigooma.com\nigou.com\nigoyx.com\nigps123.com\nigpsport.com\nigptex.com\nigreatdream.com\nigrs.org\nigta.vip\nigtm-a101.com\nigtm-b101.com\nigtm-c101.com\nigtm-d101.com\nigtm-e101.com\nigtm-meeting-tencent.com\nigtm-yuanbao.com\nigtm.pub\niguaka.com\niguangdiu.com\niguanyu.com\niguazutraffic.xyz\niguder.com\niguitar.me\niguizao.com\niguming.net\nigumo.cc\niguoguo.net\niguopin.com\niguoplay.com\niguowan.com\niguoyin.com\niguxuan.com\nigwfmc.com\nigwzx.com\nigxbaidu.net\nihacksoft.com\nihaier.com\nihaima.com\nihaique.net\nihaiu.com\nihaiyan.com\nihanbridge.com\nihanghai.com\nihanhua.com\nihani.tv\nihansen.org\nihanshi.com\nihaohaoxuexi.com\nihaoma.icu\nihaoqu.com\nihaoxi.com\nihaozhuo.com\nihappy.vip\nihappystudio.com\nihappystudio.net\nihasl.com\nihdt.tv\nihdty.com\nihealthcoming.com\nihei5.com\niheima.com\nihello.cc\nihelpy.net\nihemuu.com\nihenda.com\nihengheng.com\nihepa.com\nihggccampaign.com\nihicon.com\nihigee.com\nihint.me\nihisce.com\nihitui.com\nihitun.com\nihkk.net\nihlimtv.com\nihmch.com\nihnhr.com\nihomefnt.com\nihomesoft.net\nihongde.com\nihongma.com\nihongmeng.tech\nihongpan.com\nihonker.com\nihotchip.com\nihou.com\nihourglass.club\nihowguide.com\nihqfo.org\nihr360.com\nihrscloud.com\nihst8.com\nihstatic.com\nihtcboy.com\nihtmlcss.com\nihtwmi.yachts\nihuaben.com\nihuan.me\nihuang.org\nihuanling.com\nihuanque.com\nihuayou.com\nihuazhan.net\nihuge.net\nihui.com\nihuidian.com\nihuigo.com\nihuipao.com\nihuisida.net\nihuman.com\nihumand.com\nihuntto.com\nihuoli.com\nihuoqiu.com\nihuoshanimg.com\nihuoshanlive.com\nihuoshanstatic.com\nihuoshanvod.com\nihuoyan.com\nihupo.com\nihuyi.com\nihwrm.com\nihxlife.com\nihyhs.com\nihying.cc\nihykb.com\nihypnus.com\nihypo.net\nihytv.com\nihzzy.com\nii.td\nii010.com\nii090.com\nii35.com\nii77.com\niianews.com\niiaq.net\niiast.com\niiauuw.com\niibechina.com\niibq.com\niicall.com\niicats.com\niicha.com\niicheese.com\niicp.net\niicz.cc\niidns.com\niidx.fun\niieii.com\niiesz.com\niieye.cc\niii80.com\niiiaaa.com\niiiddd.com\niiiib.com\niiiimg.com\niiijk.com\niiiview.net\niikuzhan.com\niikx.com\niinhotel.com\niinorii.com\niiolink.com\niiong.com\niipcloud.com\niipiano.com\niirii.com\niirpwigs.com\niis7.com\niis7.net\niis8.com\niischool.com\niisfree2.com\niisp.com\niispbdy.com\niissnan.com\niitang.com\niitcp.com\niithz.com\niitol.com\niituku.com\niivd.net\niivey.com\niiwoo.com\niiyi.com\niiyiyi.com\nijatv.com\nijh.cc\nijheng.com\nijia120.com\nijia360.com\nijiandao.com\nijiangyin.com\nijianji.com\nijiaoxue.net\nijiatv.com\nijicai.com\nijie.com\nijiebao.com\nijiedian.com\nijiela.com\nijieo.com\nijindun.com\nijingdi.com\nijingyi.com\nijinshan.com\nijinzhuan.com\nijishu.cc\nijiwei.com\nijiwen.com\nijizhi.com\nijjnews.com\nijkuhygabc.work\nijkxt.com\nijml.net\nijnqc.com\nijovo.com\nijq.tv\nijsi.org\nijson.com\nijsp.net\nijuanshi.com\nijuer.com\nijuhepay.com\nijunhai.com\nijunxun.com\nijuzhong.com\nijxuitr.com\nijycnd.com\nijzhang.com\nik123.com\nik3cloud.com\nikafan.com\nikahe.com\nikaixun.com\nikaka.com\nikanchai.com\nikang.com\nikanoo.com\nikantu365.com\nikaolaa.com\nikaowu.com\nikcd.net\nikcest.org\nikck.com\nikcrm.com\nikcw.com\nikdmjx.com\nike-global.com\nikebukuro777.org\nikeled.com\nikemeng.com\nikepu.com\nikgambwqeqnv.com\nikhimalayaniq.com\nikj123.com\nikj168.com\nikjds.com\nikjtao.com\nikjxc.com\nikmoo.com\nikmt.net\nikncn.com\nikonfx.com\nikongjian.com\nikongjun.com\nikonke.com\nikoori.com\nikozn.com\nikqtcbva.com\niksea.com\nikuai8-wifi.com\nikuai8.com\nikuaicai.com\nikuailian.com\nikuaimi.com\nikuaiyue.com\nikuajing.com\nikuayou.com\nikuju.com\nikunac.com\nikuncdnfb.com\nikunpay.com\nikupan.me\nikx.me\nikxnes04.com\nikyy.cc\nikzybf.com\nil8r.com\nilab-x.com\nilabilab.com\nilaisa.com\nilaitui.com\nilangqu.com\nilanni.com\nilanyao.com\nilanzou.com\nilaoyou.com\nilaozhu.com\nilaw13.com\nilaw66.com\nilawpress.com\nilazycat.com\nilcweloc.com\nilea-roswell.org\nileadsun.com\nileapcloud.com\nileci.com\nileedarson.com\nileehoo.com\nileju.com\nileopard.com\nileshua.com\niletou.com\nilewan.com\niliangcang.com\nilianwo.com\nilianyue.com\nilibrand.com\nilifesmart.com\nilikemanga.com\nilingdai.com\nilinki.net\nilinkmall.com\nilinkone.com\nilinksure.com\nilinuxkernel.com\nilinyi.net\nilishi.net\nilivehouse.com\nilixiangguo.com\niliyu.com\nilkwork.com\nilll.xyz\nilmgq.com\nilohas.com\niloli.bid\niloli.xin\nilongre.com\nilongterm.com\nilonhoo.com\niloveanan.com\nilovechao.com\nilovefishc.com\niloveopened.com\nilovey.live\niloveyouxi.com\nilovezuan.com\nilovezz.com\nilsungf.com\nilucky.net\niluckysf.net\niluezhi.com\nilufan.com\niluhang.com\nilustrepro.com\niluvatar.ai\niluvatar.com\nilux.ai\nilvxing.com\nilxdh.com\nilxtx.com\nilydjk.com\nilz.me\nim-cc.com\nim-ch.com\nim.ci\nim286.com\nim286.net\nim2maker.com\nim323.com\nim577.com\nim5i.com\nimaccn.com\nimachina.com\nimaegoo.com\nimage-tech.vip\nimageaccelerate.com\nimageedu.com\nimagefuture101.com\nimagehub.cc\nimagelol.com\nimageoss.com\nimageplusplus.com\nimageplusplus.net\nimagepy.org\nimagerjt.com\nimages-cache.com\nimages.samsung.com\nimages3.tripcdn.com\nimagestoryai.com\nimageter.com\nimagetotxt.com\nimagiclouds.com\nimaginde.com\nimagineadtech.com\nimags-google.com\nimaibo.net\nimaicai.mobi\nimaijia.com\nimaitu.com\nimalljoy.com\nimallvip.com\nimalun.com\nimandarin.net\nimanke.com\nimao2.com\nimaojiang.com\nimarketchina.com\nimarkr.com\nimaschina.com\nimatlas.com\nimayitxt.com\nimazingchina.com\nimbackr.com\nimbeiyu.com\nimblog.in\nimbtk.com\nimcart.com\nimcclinics.com\nimcec.org\nimchinese.net\nimcn.me\nimcome.net\nimcoming.com\nimconlinereg.com\nimcq.net\nimd-marketing.com\nimdadui.com\nimdmedical.com\nimdo.co\nimdodo.com\nimdst.com\nimedao.com\nimedcloudimage.com\nimedera.com\nimedicalai.com\nimedlab.net\nimedp.com\nimeete.com\nimeete.net\nimeete1.com\nimeete2.com\nimeete3.com\nimeete4.com\nimeeton.com\nimefuture.com\nimeidb.com\nimeihei.com\nimeimama.com\nimeiren.com\nimeirongyi.com\nimeishike.com\nimeitools.com\nimeitou.com\nimelai.com\nimeme.tv\nimetacloud.com\nimeyahair.com\nimfirewall.com\nimfooww.com\nimg-space.com\nimg-static.tech\nimg-sys.com\nimg.beauty\nimg.ink\nimg.net\nimg.run\nimg.samsungapps.com\nimg.vin\nimg001.com\nimg005.com\nimg168.net\nimg16888.com\nimg4399.com\nimg898.com\nimgbed.link\nimgcdc.com\nimgchr.com\nimgcook.com\nimgdd.cc\nimgdianying.com\nimgdianyingoss.com\nimge.cc\nimgeek.net\nimgeek.org\nimgets.com\nimgii.com\nimgkr.com\nimglefeng.com\nimglink.win\nimgmarket.net\nimgmg.com\nimgo.tv\nimgs.ovh\nimgscdn.com\nimgse.com\nimgsha.com\nimgsina.com\nimgsohu.com\nimgtex.com\nimgtg.com\nimgurl.org\nimgyzzy.com\nimgzy360.com\nimhan.com\nimhdr.com\nimhuchao.com\nimiaomeng.com\nimibaby.net\nimibao.com\nimicome.com\nimifun.com\nimigu.com\nimiker.com\nimile-inc.com\nimile.com\nimindmap.cc\nimitui.com\nimixpark.com\nimjiayin.com\nimkero.net\nimkevinyang.com\nimlaidian.com\nimlazy.ink\nimlb2c.com\nimlianai.com\nimlianpu.com\nimliuyi.com\nimlizhi.com\nimmediate49.com\nimmeee.com\nimmfast.com\nimmi520.com\nimmiexpo.com\nimmiknow.com\nimmivip.com\nimmomo.com\nimmomogame.com\nimmotors.com\nimmune-path.com\nimmusician.com\nimmviragroup.com\nimnerd.org\nimnight.com\nimnks.com\nimobile-ent.com\nimoe.me\nimoe.tech\nimoeer.com\nimofan.com\nimoffice.com\nimok.net\nimok.run\nimoke.org\nimol.cc\nimolive.tv\nimoo.com\nimooc.com\nimoocc.com\nimop.com\nimosi.com\nimotao.com\nimotion.group\nimoto.love\nimou.com\nimovideo.ru\nimp3.net\nimpcochina.com\nimperfectionstudio.com\nimperial-vision.com\nimperialsprings.com\nimperialspringsforum.org\nimpk.cc\nimpnails.com\nimportingtochina.com\nimprod.works\nimprove-ai.com\nimprove-medical.com\nimpta.com\nimqianduan.com\nimqq.com\nimqq.net\nimquzan.com\nimrfresh.com\nimrobotic.com\nimroc.cc\nimscv.com\nimsharecenter.com\nimshu.cc\nimshusheng.com\nimsilkroad.com\nimsinoexpo.com\nimsle.com\nimsun.net\nimsyy.com\nimtaweb.net\nimtics.com\nimtmp.net\nimtrwqjier3.com\nimtuan.com\nimtyimages.vip\nimudgame.com\nimugeda.com\nimuke.com\nimummybiz.com\nimusicking.com\nimvictor.tech\nimvtc.com\nimwaco.com\nimwallet.com\nimweb.io\nimweia.com\nimwexpo.com\nimwork.net\nimwzh.com\nimx365.net\nimxh.com\nimxiaomai.com\nimxingzhe.com\nimxpan.com\nimycdn.com\nimycloud.com\nimydns.net\nimyfone.club\nimyike.com\nimyouxin.com\nimys.net\nimyshare.com\nimyuedu.com\nimyushu.com\nimzego.com\nimzhanghao.com\nimzhongxin.com\nimzhuomo.com\nimzudian.com\nimzy.ink\nin-driving.com\nin-en.com\nin-freight.com\nin-int.com\nin-tencentclb.cloud\nin-tencentclb.com\nin-tencentclb.net\nin-tencentclb.work\nin.th\nin001.com\nin66.com\nin800.com\nin853.com\nin955.com\ninabr.com\ninad.com\ninadvanceof.com\ninaink.com\ninav.site\ninbeing.net\ninbilin.com\ninbooker.com\ninboyu.com\ninc365.com\nincake.net\nincensechina.com\ninch.red\ninchitech.com\nincker.com\nincloudexpo.com\nincomperlite.com\nincomrecycle.com\nincopat.com\nincreasedct.com\nincsg.com\ninctrip.com\nind-map.com\nind4.net\nind9ed.com\nindetek-lab.com\nindexea.com\nindexedu.com\nindexedu.net\nindexfor.fun\nindexmob.com\nindics.com\nindielight.net\nindienova.com\nindier.com\nindigobeijing.com\nindmi.com\nindochinatraveladvisor.com\nindonesia-daily.com\nindubd.com\nindustrybamboo.com\nindustryillusion.com\ninduta.com\ninekoxia.com\ninengyuan.com\ninesa-it.com\ninesa.com\ninetech.fun\ninetmaster.net\ninewhope.com\ninewoffice.com\ninewskeji.com\ninexbot.com\ninfarts.net\ninferoey.com\ninfertilitybridge.com\ninfimotion.com\ninfineon-autoeco.com\ninfini-ai.com\ninfinisign.com\ninfinitescript.com\ninfinity8ball.com\ninfinitynewtab.com\ninfinitytab.com\ninflyway.com\ninfo-insur.com\ninfo-monitor.com\ninfo-onesky.com\ninfo.cc\ninfo10.com\ninfo110.com\ninfo35.com\ninfobidding.com\ninfobigdata.com\ninfocloud.cc\ninfoeach.com\ninfohand.net\ninfohpc.com\ninfoier.com\ninfoldgames.com\ninfomorning.com\ninfong.net\ninfoobs.com\ninfoodfamily.com\ninfoq.com\ninfoqstatic.com\ninforbus.com\ninforeenviro.com\ninforguard.net\ninformrack.com\ninforsec.org\ninfosoft.cc\ninfovc.com\ninfoview.com\ninfowuxi.com\ninfoxgame.com\ninfoxiao.com\ninframe.mobi\ninftab.com\ninfyniclick.com\ninfzm.com\ning10bbs.com\ningageapp.com\ningags.com\ningaoyt.biz\ningcore.com\ningdan.com\ningeek.com\ningenic.com\ningkee.com\ningping.com\ningping.net\ningzhong.com\ninhalpharma.com\ninhdd.com\ninhe.com\ninhe365.com\ninheweb.com\ninhuawei.com\nini5.com\ninibiru.com\ninicoapp.com\ninidc.net\nininin.com\ninitaa.com\ninitac.com\ninitaf.com\ninitah.com\ninitaj.com\ninitbb.com\ninitcc.com\ninitdd.com\ninitff.com\ninitialview.com\ninitjj.com\ninitkk.com\ninitll.com\ninitmm.com\ninitnn.com\ninitpp.com\ninitqq.com\ninitroot.com\ninitrr.com\ninittt.com\ninituu.com\ninitvv.com\ninitww.com\ninitxa.com\ninitxb.com\ninitxx.com\ninitzz.com\ninja.com\ninjectionmachine.com\ninjoinic.com\nink4you.com\ninkankan.com\ninkcc.net\ninkcn.com\ninke.com\ninke.tv\ninkeygo.com\ninkonlife.com\ninkonote.com\ninktok.com\ninkuai.com\ninkwai.com\ninlandschool.com\ninlaylink.com\ninlighting.org\ninlishui.com\ninliuzhou.com\ninluckcalendar.com\ninmeng.net\ninmense.site\ninmuu.com\ninmyshow.com\ninnatek.com\ninnnnnn.com\ninno3d.cc\ninnobm.com\ninnocn.com\ninnocomn.com\ninnodealing.com\ninnofidei.com\ninnogenpharm.com\ninnohere.com\ninnojoy.com\ninnolcon.com\ninnomd.org\ninnomddesign.com\ninnopack97.com\ninnoplayfun.com\ninnopro.cc\ninnos.com\ninnotechx.com\ninnotek-co.com\ninnotimegood.com\ninnotron.com\ninnov-xsystem.com\ninnovagt.com\ninnovane.com\ninnovatedigital.com\ninnovationmetal.com\ninnoventbio.com\ninnover.com\ninnoveronline.com\ninnovidcn.com\ninnovisgroup.com\ninnovmedicine.com\ninnvitor.com\nino3w.com\ninoherb.com\ninoneh5.com\ninong.net\ninoteexpress.com\ninovance-automotive.com\ninovogen.com\ninovppg.com\ninovpu.com\ninping.com\ninpla.net\ninplayable.com\ninputmore.com\ninqan.com\ninrice.com\ninrice.zone\ninrugao.com\nins110.com\ninsagee.com\ninsarticle.com\ninsenz.com\ninshion.com\ninshotapp.com\ninsigma-elec.com\ninsistence.tech\ninsmoin.com\ninsnail.com\ninsneu.com\ninsnex.com\ninsome.com\ninspeed.biz\ninspirecloud.com\ninspmobi.com\ninspur.com\ninspurcloudoss.com\ninspuronline.com\ninspurpower.com\ninspurpower.org\ninsta360.com\ninstafogging.com\ninstallgreat.com\ninstallwage.com\ninstantinfographicspresence.com\ninstitution2.com\ninstome.com\ninstrument95.com\ninsulators-china.com\ninsun-china.com\ninswindow.com\ninsxz.com\ninsytone.com\nint-agri.com\nint2018.com\nint800.com\nintaek.com\nintdmp.com\nintecheye.com\nintecol-10iwc.com\nintedc.com\nintegrity-funds.com\nintekey.com\nintel-space.com\nintelcupid.com\nintellect.black\nintelligen.ltd\nintelligence-electricity.net\nintelligentmanufactory.com\nintelvisioncn.com\nintencent.com\ninter-credit.net\ninter-rock.com\ninter1908.net\ninteractivebrokers.hk\ninterchinawater.com\ninterface003.com\ninteriorous.com\ninternational-gfe.nvidia.com\ninternationalbrand.net\ninternbird.com\ninternetke.com\ninternettrademark.com\nintertid.com\ninterval.im\nintimerent.com\nintlgame.com\nintlqydd.info\nintlscdn.com\nintmedic.com\nintmes.com\nintohard.com\nintomod.com\nintopet.com\nintostarry.com\nintovfx.com\nintowz.com\nintozgc.com\nintple.com\nintramirror.com\nintsavi.com\nintseamultiply.com\nintsig.com\nintsig.net\nintvolunteer.com\nintwho.com\nintwing.com\ninuobi.com\ninuorui.com\ninuu6.com\ninuyasha.love\ninvaluablu.com\ninveno.com\ninverter.so\ninvescogreatwall.com\ninvest-data.com\ninvestassistant.com\ninvestbjdx.com\ninvestgohn.com\ninvestoday.net\ninvestorscn.com\ninveststkitts.org\ninvocean.com\ninvoee.com\ninvzible.com\ninwaishe.com\ninwatch.cc\ninwuoo.com\ninxedu.com\ninxni.com\ninxunoffice.com\ninyota.com\ninzone-auto.com\ninzotek.com\nioa365.com\nioage.com\nioasaas.com\niocdn.cc\niocrest.com\nioe-times.com\niofange.com\nioffershow.com\nioffice100.com\niofomo.com\nioigamer.net\nioiosafe.com\nioiox.com\nioiox.net\nioioz.com\niok.la\niol8.com\nioms.cc\nionchi.com\nioncol.com\nioneball.com\nionewu.com\niongentherapeutics.com\niooeoo.com\niooqoo.com\nioozu.com\niopenhec.com\niophthalmology.net\niopiopl.com\nioppo.net\nioptics.org\niorca.net\niornnl.xyz\nios114.com\nios222.com\nios98.com\niosask.com\nioser.fun\niosfengwo.com\nioshacker.net\niosi.vip\niosre.com\niosrxwy.com\nioswg.com\niosyyds.com\nioszc.com\nioszn.com\niot-cas.com\niot-dc.com\niot-tencent.com\niot.moe\niot0.net\niot1001.com\niot101.com\niot688.com\niot889.com\niotachem.com\niotbay.com\niotfair.net\niotku.com\niotmag.com\niotmore.com\niotpai.com\niotrix.net\niotronic.tech\niotrouter.com\niots.vip\niotsafe.net\niotshifang.com\niotweixin.com\niotwrt.com\niotxing.com\niotxx.com\niotyeas.com\niotyes.com\niouluo.com\nioxqm.com\nioxray.com\nioxunyun.com\nip-cdn.com\nip-guard.net\nip-hercules.com\nip-soc.com\nip008.com\nip138.com\nip159.com\nip181.com\nip192.com\nip33.com\nip3366.net\nip518.com\nip66.com\nip66.net\nip669.com\nip77.net\nip777xxx.com\nip87.com\nip938.com\nipackbynewstep.com\nipadown.com\nipadump.com\nipadview.com\nipaiban.com\nipail.com\nipalfish.com\nipalmap.com\nipampas.com\nipanda.com\nipanda.net\nipandao.com\nipandata.com\nipangcai.com\nipanocloud.com\nipanta.com\nipaobuji.com\nipaochaxun.com\nipaomi.com\nipaotuan.com\nipapark.com\nipason.com\nipay.so\nipaylinks.com\nipcelou.com\nipchaxun.com\nipchaxun.net\nipcmen.com\nipcodm.com\nipcorecatalog.com\nipctest.com\nipcwifi.com\nipdaili.com\nipdatacloud.com\nipddz.com\nipdfmaster.com\nipdftool.com\nipdodo.com\nipdsms.com\nipduoduo.cc\nipduoduo.com\nipdz.me\nipease.net\nipehr.com\nipeijiu.com\nipengchen.com\nipengtai.com\niper2.com\nipetct.com\nipexp.com\nipfeibiao.com\nipfen.com\nipfsbit.com\nipgoal.com\nipguishu.com\niphonediule.com\nipin.com\nipinba.com\nipingke.com\nipingyao.com\nipinyou.com\nipip.net\nipjingling.com\nipjisuanqi.com\nipktv.com\nipku.com\niplascloud.com\niplay11g.com\niplay365.com\niplaypy.com\niplaysoft.com\niplcn.com\niplusmed.com\niplwin999.com\nipmay.com\nipmi.cc\nipmoniqi.com\nipmost.com\nipmotionmc.com\nipmph.com\nipo.hk\nipo.la\nipo1688.com\nipo3.com\nipoceo.com\niposeidonbussiness.com\niposeidoncdn.com\niposeidongame.com\nipostalcode.com\nipple.net\nipplus360.com\nippsport.com\nippzone.com\nipr007.com\nipr114.net\nipr123.com\niprabc.com\niprchn.com\niprdaily.com\niprdp.net\nipresst.com\niproyal.co\niprtop.com\niprub.com\niprun.com\nips.com\nips8.com\nipsebe.com\nipshu.com\nipshudi.com\nipsmap.com\nipssh.net\niptalent.com\niptrm.com\nipts.com\niptvlm.com\niptvzj.com\nipuer.com\nipuu.net\nipv4.host\nipv4dns.com\nipv6-only.com\nipv6dns.com\nipv6radar.com\nipv6testingcenter.com\nipwuji.com\nipyy.com\niq123.com\niq33.com\niqalliance.org\niqbuud.lol\niqbxq.com\niqcrj.com\niqdedu.com\niqdii.com\niqdnet.com\niqhmh.com\niqianggou.com\niqianjin.com\niqianyue.com\niqianzhan.com\niqiaowai.com\niqidian.com\niqihang.com\niqilu.com\niqilun.com\niqimengkj.com\niqinbao.com\niqingguo.com\niqingren.com\niqingua.com\niqingyi.com\niqinshuo.com\niqinzhou.com\niqishu.la\niqiyi.com\niqiyiedge.com\niqiyiedge.net\niqiyih5.com\niqiyipic.com\niqmie.com\niqnew.com\niqoo.com\niqr.cc\niqtianshanmw.com\niquanba.com\niquanben.net\niquanfen.com\niquanpai.com\niquanwai.com\niquaveizeeru.com\nique.com\niquegui.com\niquhuo.com\niquickfish.com\niqujing.com\niqunix.com\niqunix.store\niqupdate.com\niqxbf.com\niqxedu.com\nirain.in\nirainone.com\niranmahanair.com\niranshao.com\niraoping.com\nirbsh.com\nirc-risk.com\nircmnr.com\nireader.com\nireader.live\nireadercity.com\nireaderm.com\nireadweek.com\nireadyit.com\nirealbest.com\nirealcare.com\nirealtech.com\nirecyclingtimes.com\niredwhale.com\nireeda-tech.com\nirelandvisacenter.com\niremaker.com\niremax.hk\niremax.net\niresarch.com\niresearchad.com\niresearchchina.com\nirest.tv\nirestapp.com\nirexy.com\niridescent.ink\nirisdt.com\nirisdt.net\nirisgw.com\nirisgw.net\nirising.me\nirlianmeng.com\nirmleader.com\nirober.com\nirobotbox.com\nirockbunny.com\niroing.com\nironfishchina.com\nirongbei.com\nironghui.com\nirootech.com\nirort.com\nirouteros.com\nirqpa.work\nirrichina.com\nirs01.com\nirs01.net\nirs03.com\nirskj.com\nirsnp.com\nirtouch.com\niruanmi.com\niruanshi.com\niruidian.com\niruixing.com\nirunner.mobi\niryoucai.com\nis-programmer.com\nis02041qqp.xyz\nis36.com\nis404.com\nis686.com\nisa-hsse.com\nisa1751.com\nisagzfls.com\nisagzlw.com\nisagzlwis.com\nisagzlws.com\nisagzsc.com\nisagzth.com\nisahome.net\nisaieg.com\nisamanhua.com\nisameforum.org\nisapt.com\nisawhis.com\nisawhs.com\nisawuhan.com\nisay365.com\nisay365.net\nisayabc.com\nisbdai.org\niscanchina.com\niscrv.com\nisdox.com\nisdpp.com\niseacat.com\niseafood.shop\nisealsuite.com\nisecsp.com\niseedog.com\niseekids.com\nisellerpal.com\nisenruan.com\niseoku.com\nisf.ink\nisfashion.com\nisfdz.com\nisfirst.net\nisgo.com\nish168.com\nishaanxi.com\nishaibiao.com\nishala.com\nishang.net\nishanghome.com\nishangman.com\nishangtong.com\nishangu.com\nishanjian.com\nishansong.com\nishaohuang.com\nisharepc.com\nisheely.com\nisheji.com\nisheji5.com\nishell.cc\nishenbao.com\nishengxue.com\nishenping.com\nishenyou.com\nishijing.com\nishipoffshore.com\nishouhong.com\nishoujizhuan.com\nishouka.com\nishouping.com\nishowchina.com\nishowx.com\nishubao.org\nishugui.com\nishuirong.com\nishuiyun.com\nishumei.com\nishuocha.com\nishuqi.com\nishuqi.net\nishuquge.com\nishuquge.la\nishuquge.org\nishuw.com\nisi-gf.com\nisiabio.com\nisign.ren\nisigqno.com\nisigu.com\nisilent.me\nisilicontech.com\nisiluke.net\nisiluke.org\nisilvermaterials.com\nisimcere.com\nisinosig.com\nisixiang.com\nisixue.com\nisjike.com\niskryou.com\nisky000.com\niskyjoy.com\niskyone.com\niskysoft.com\nislandren.com\nisli.cc\nislide.cc\nisluo.com\nismartgo.com\nismarthealth.com\nismartware.com\nismdeep.com\nisme.pub\nismisv.com\nismsms.org\nismx8.com\nisnnapp.com\nisnsz.com\niso-est.com\niso-iso9000.com\niso2004.com\niso37001rz.com\niso9001rz.com\nisobar.tech\nisocgw.net\nisoftstone.com\nisogx.com\nisolves.com\nisong520.com\nisongcontrol.com\nisoqh.com\nisorange.com\nisorenzheng.org\nisosh.com\nisotoo.com\nisoucai.com\nisoudy.com\nisoyes.com\nisoying.com\nisoyu.com\nisozhijia.com\nisp.cx\nispcache.net\nispecial.xyz\nispqcloud.com\nisrcb.com\nisres.com\niss-ms.com\nisscloud.com\nissconline.com\nissedu365.com\nissjj.com\nissks.com\nist-zl.com\nistarshine.com\nistartsurf.com\nistcw.com\nistoreos.com\nistpei.com\nistrongcloud.com\nistrongcloud.net\nistylepdf.com\nisuanyun.com\nisudaji.com\nisuike.com\nisummi.com\nisun.org\nisunon.com\nisunton.com\nisurecloud.net\nisuzhou.me\nisv-tech.com\nisvee.com\nisvjcloud.com\nisvjd.com\nisvup.com\niswbm.com\nisweek.com\niswifting.com\niswweb.com\nisxtv.com\nisyour.love\nit-bound.com\nit007.com\nit0772.net\nit120.cc\nit165.net\nit168.com\nit2021.com\nit2168.com\nit224.com\nit322.com\nit376.com\nit399.com\nit478.com\nit5.cc\nit525.com\nit528.com\nit578.com\nit610.com\nit666.com\nit689.com\nit707.com\nit7t.com\nit8.com\nit8g.com\nit918.com\nit985.com\nit9g.com\nitab.link\nitacademy.download.prss.microsoft.com\nitacademyuat.download.prss.microsoft.com\nitaconicacid.com\nitaic.org\nitailai.com\nitaiping.com\nitakeeasy.com\nitalyvisacenterd.com\nitamt.com\nitangbole.com\nitangyuan.com\nitanlian.com\nitany.com\nitany.org\nitanzi.com\nitao.com\nitaoke.org\nitaokecms.com\nitaored.com\nitaotuo.com\nitaoxiaoshuo.com\nitasci.com\nitav-gz.com\nitayao.com\nitbaizhan.com\nitbegin.com\nitblw.com\nitboth.com\nitbour.com\nitboy.net\nitbug.shop\nitbulo.com\nitbulu.com\nitbuy.com\nitbyte.net\nitc.vip\nitcdlf.com\nitceo.com\nitchaguan.com\nitcm.com\nitcn.cc\nitcodemonkey.com\nitcpn.net\nitcqf.org\nitczh.com\nitdabao.com\nitdai.com\nitdayang.com\nitddo2page.com\nitdevnow.com\nitdks.com\nitdog-dns.com\nitdog.com\nitdog.plus\nitdoisp.com\nitdoor.net\nitdos.com\nitdos.net\nitdp-china.org\niteam-dress.com\niteblog.com\nitechate.com\nitedou.com\niteer.net\nitek-training.com\nitelecloud.com\nitensoft.com\niter168.com\nitest.info\nitetc.org\nitexamprep.com\niteye.com\nitfanr.cc\nitfaster.com\nitfeed.com\nitfenghui.com\nitfly.net\nitfox.net\nitfsw.com\nitfw5.com\nitgd.net\nitgeeker.net\nitgege.com\nitgemini.net\nitgochina.com\nitgoodboy.com\nitgsa.com\nithard.com\nitheat.com\nitheima.com\nitheima.net\nithenticatecn.com\nithey.com\nithlj.com\nithome.com\nithome.net\nithor.com\nithor.net\nithothub.com\nithov.com\nithuangw.com\nitiankong.com\nitiankong.net\nitianliao.com\nitiexue.net\nitigergrowth.com\nitigergrowtha.com\nitigerup.com\nitilxf.com\nitilzj.com\nitimotor.com\nitingwa.com\nitjoy.net\nitjspx.com\nitjuzi.com\nitkuku.com\nitlic.com\nitlog.vip\nitlu.org\nitlz.net\nitma.org\nitmakes.com\nitmanager.club\nitmanbu.com\nitmind.net\nitmoocs.com\nitmop.com\nitmuch.com\nitmuke.com\nitmyhome.com\nitnavs.com\nitnb.cc\nitnec.org\nitnihao.com\nitnxs.com\nitoec.org\nitoegd.com\nitogame.com\nitoka.com\nitokit.com\nitokoo.com\nitongcheng.cc\nitonghui.com\nitonglian.com\nitongzhi.com\nitopcoupon.com\nitopers.com\nitophis.com\nitopplay.com\nitopsdk.com\nitotii.com\nitouchchina.com\nitougu.com\nitoumi.com\nitoutiao.co\nitoutiaoimg.com\nitoutiaoliving.com\nitoutiaostatic.com\nitoutiaovod.com\nitower-soft.com\nitoyfx.com\nitpon.com\nitpow.com\nitptg.com\nitpub.net\nitpux.com\nitpwd.com\nitqaq.com\nitrace.cc\nitrackstar.com\nitredu.com\nitrid.com\nitrip.com\nitripsh.com\nitrolexshop.com\nitruelife.com\nitruke.com\nitrus.com\nitruscloud.com\nitrusign.com\nitry.com\nits114.com\nitsapu.com\nitsdz.com\nitshai.com\nitshubao.com\nitsiwei.com\nitsk.com\nitslaw.com\nitsmephoto.net\nitsoku.com\nitsto.com\nitsun.com\nitsvse.com\nittellyou.com\nittft.com\nittime.com\nitto100.com\nittribalwo.com\nituad.com\nituchong.com\nituite.com\nituopeng.com\niturco.com\nitutu.tv\nituu.net\nituun.com\nituut.com\nitv.video\nitvcn.com\nitvssp.com\nitwanger.com\nitwlw.com\nitwork.club\nitwsms.com\nitxe.net\nitxia.club\nitxp365.com\nitxst.com\nitxtbook.com\nitxueyuan.com\nityears.com\nityg.com\nitying.com\nityizu.com\nitylq.com\nityouknow.com\nityxb.com\nitzhai.com\nitzhimei.com\nitzhp.com\nitzjj.com\nitzm.com\nitzmx.com\nitzmx.net\niu18.com\niu95522.com\niuban.com\niucars.com\niucdn.com\niuctrip.com\niufida.com\niuinns.com\niuiu.site\niujkegbpo.xyz\niumemo.com\niuni.com\niunv.com\niuoooo.com\niusersurvey.com\niusertracker.com\niusmob.com\niuynfg.com\niv06.com\niv2i.com\niva-schmetz.com\nivali.com\nivanli.cc\nivban.com\nivcheng.com\nivdchina.org\nivdys.com\nivemusic.net\niventoy.com\niverycloud.com\nivfchina.net\nivfdhc.com\nivfuture.com\nivideostar.com\niviewui.com\nivinkon.com\nivipi.com\nivips.site\nivistang.com\nivixivi.com\nivknow.com\nivolces.com\nivon.work\nivqamtkr.com\nivrwan.com\nivsky.com\nivu4e.com\nivvajob.com\nivwen.com\nivxiaoyuan.com\nivy-school.org\nivybaby.me\nivydad.com\nivykit.com\nivypha.com\nivypub.org\nivyschools.com\nivysci.com\nivysun.net\nivywing.me\niwala.net\niwan4399.com\niwan78.com\niwanbei.com\niwanboy.com\niwangding.com\niwangnan.com\niwanoutdoor.com\niwanshow.com\niwanws.com\niwapan.com\niwatani-gz.com\niwatch365.com\niwatertech.com\niway-tech.com\niwcoo.com\niwebad.com\niwebchoice.com\niwecan.net\niweek.ly\niweekapi.com\niweidu.net\niweixiu120.com\niweju.com\niwellen.com\niwen1.com\niwencai.com\niwenchuan.com\niwenson.com\niwewin.net\niwgame.com\niwhalecloud.com\niwhopro.com\niwhr.com\niwhr.org\niwiki.com\niwin10.net\niwingchina.com\niwiscloud.com\niwishwed.com\niwith-smart.com\niwithu.net\niwjw.com\niwmmob.com\niwncomm.com\niwooji.com\niwopop.com\niwordnet.com\niwordshow.com\niwosai.com\niwpai.com\niwshang.com\niwte-expo.com\niwteexpo.com\niwuchen.com\niwurexs.info\niwurexs.net\niwurexs.org\niwwwwwi.com\niwxapi.com\niwyvi.com\niwzbz.com\niwztc.com\niwzwh.com\niwzwy.com\nix-edu.com\nixbk.fun\nixbk.net\nixbren.net\nixdc.org\nixfc.net\nixgvideo.com\nixianlai.com\nixiaochengxu.cc\nixiaoma.com\nixiatxt.com\nixigua.com\nixiguavideo.com\nixilou.com\niximo.com\nixingfei.com\nixinglu.com\nixingmei.com\nixingpan.com\nixingyan.com\nixinqing.com\nixintu.com\nixinwei.com\nixinwenjie.com\nixinwu.com\nixinyou.com\nixiqi.com\nixiumei.com\nixiupet.com\nixiway.com\nixizang.com\nixmtx.com\nixmu.net\nixpsge.com\nixpub.net\nixs.la\nixsz.com\nixuanquge.com\nixuanshu.net\nixuenong.com\nixueshu.com\nixueyi.com\nixueyi.net\nixunke.com\nixxzx.com\nixy68.com\nixywy.com\nixzzcgl.com\niy-cd.com\niyamusic.com\niyangxi.com\niyaou.com\niyatt.com\niyawoqu.com\niyaxi.com\niyaxin.com\niyaya.com\niyaya.info\niyb.tm\niybtv.com\niycsky.com\niydsj.com\niydu.net\niyeeda.com\niyemao.cc\niyenei.com\niyeren.com\niyiji.com\niyincaishijiao.com\niyingdi.com\niyingji.com\niyint.com\niyiou.com\niyiqi.com\niyishengyuan.com\niyitu.com\niyiyu.com\niymark.com\niyocloud.com\niyong.com\niyongpdf.com\niyooread.com\niyoou.com\niyoucai.com\niyoudui.com\niyouhun.com\niyoujia.com\niyoujiao.net\niyouke.com\niyoule.com\niyouman.com\niyouqian.com\niyouxia.com\niyouxin.com\niyouxun.com\niyruan.com\niysj.com\niytc.net\niytcdn.com\niyuan.ltd\niyuanpei.cc\niyue.pub\niyuedan.com\niyuedian.com\niyuezhang.net\niyun.com\niyunbao.com\niyunbiao.com\niyunche.com\niyunmai.com\niyunmu.com\niyunnan.travel\niyunshu.com\niyunv.com\niyunxh.com\niyunxiao.com\niyunyue.com\niyunzk.com\niyuren.com\niyuxiyang.com\niyxing.com\niyxku.com\niyyin.com\niyz168.com\nizacholsm.com\nizaodao.com\nizatcloud.net\nizazamall.com\nizb.pub\nizdatatech.com\nizenith.co\nizestchina.com\nizgfu.com\nizhailong.com\nizhanchi.com\nizhangan.com\nizhangchu.com\nizhangheng.com\nizhaohe.com\nizhaoo.com\nizhaowo.com\nizhenxin.com\nizhihuicheng.net\nizhihuo.com\nizhikang.com\nizhiliao.com\nizhiqun.com\nizhishi.com\nizhixiu.com\nizhuanfa.com\nizhuce.com\nizhuose.com\nizhuyue.com\nizihun.com\niziyo.com\nizjj.com\nizmzg.com\nizpan.com\nizpec.com\nizqdn.com\nizstz.com\nizsvip.com\nizt8.com\niztigcpk.com\nizto.com\niztwp.com\niztzq.com\nizuche.com\nizuchebao.com\nizuchecdn.com\nizuciw.com\nizuichun.com\nizuiyou.com\nizumicn.com\nizywang.com\nizyz.org\nizz.cc\nj-dun.com\nj-gsexpress.com\nj-h-k.com\nj-smu.com\nj-techcnc.com\nj-test.com\nj-ui.com\nj03og.app\nj0g0.com\nj1000plan.org\nj1998.com\nj1j5q683cj.world\nj2822.com\nj2ee.cc\nj2up.com\nj3cx.com\nj43439.com\nj4lpr.com\nj5.cc\nj5k6.com\nj66.net\nj8.net\nj8j9.com\nj95a.com\nj99h8.com\nj9pic.com\nja-cloud.com\njaadee.com\njaadee.net\njab88.com\njabansk-auymon.com\njabizb.com\njabpark.com\njabrehoo.com\njaccsz.com\njacheng.com\njackeylea.com\njackon.me\njackxiang.com\njacky-blog.com\njackyang.me\njackytong.com\njackyyf.com\njackzhu.com\njacoll.com\njacxw.com\njadeclass.com\njademond.net\njadetowerccrc.com\njadewd.com\njadyf.com\njaeapp.com\njaebanke-jocelyou.com\njaebanke-nochujapazsn20.com\njaebanke-nochujapazsn5.com\njaecdn.com\njaedu.com\njaeger-hello.com\njaeosc.com\njaf-china.com\njafeney.com\njafie.org\njafron.com\njafronclub.com\njafroninternational.com\njagjj.com\njaguar-guangdong.com\njaifang.com\njaja123.com\njaka.com\njakabiotech.com\njakeai.com\njakehu.me\njalorsoft.com\njamalube.net\njamcz.com\njamidol.com\njamms.org\njammyfm.com\njampotgames.com\njanbao.net\njandan.com\njandan.net\njane7.com\njanezhang.com\njanezt.com\njangho.com\njangyuanzhao.com\njanpn.com\njanrain.biz\njanrainservices.com\njansonco.com\njapanhr.com\njapansoufun.com\njarczpw.com\njarencai.com\njarhu.com\njarods.org\njarvisw.com\njasangroup.com\njasbasnkilonau6.com\njasminer.com\njasolar.com\njason-z.com\njason5.xyz\njasongj.com\njasongzy.com\njasonsemicon.com\njasonwatches.com\njasonzk.com\njasperxu.com\njasuoenergy.net\njatcochina.com\njava-er.com\njava1234.com\njava2000.net\njavabikes.com\njavaboy.org\njavacui.com\njavaer.xyz\njavaeye.com\njavamilk.org\njavanav.com\njavascriptcn.com\njavatang.com\njavawind.net\njavaxxz.com\njavazhiyin.com\njavazx.com\njavbuy.xyz\njavier.io\njawouue.com\njaxcx.com\njay.tg\njaya.cc\njayce.icu\njayfc.com\njayfu.tk\njayjw.com\njayxhj.com\njaz581.com\njazlxs.com\njazzyear.com\njb100.com\njb1000.com\njb51.com\njb51.net\njbaier023.com\njbaobao.com\njbb.one\njbbzcorp.com\njbcz.tv\njbddoors.com\njbdhome.com\njbdown.com\njbdown.net\njbedu.net\njbelf.com\njbepharm.com\njbers.com\njbiev.com\njbjc.org\njbjdgroup.com\njbjw.net\njbknx.com\njblogistics.com\njbote.com\njbpmhk.com\njbpzs.com\njbryun.com\njbs-kj.com\njbsmartcity.com\njbsx88.com\njbt.ink\njbtlj.com\njbtxy.net\njbwave.com\njbwtm.com\njbxy.com\njbyy120.com\njbzj.com\njbzpw.com\njbzwread.com\njbzyk.com\njbzyw.com\njc-ai.com\njc-dl.net\njc-hr.com\njc-pcba.com\njc-saas.com\njc0531.com\njc170.com\njc315.com\njc35.com\njc56.com\njc615cezcq.world\njc808.com\njc85.com\njc88.net\njc899.com\njca-china.org\njcancer.org\njcashore.com\njcbjbcak.com\njcbmt.com\njcbq.net\njccchina.com\njcceram.com\njccinema.com\njccjtwl.com\njccpay.com\njccsoc.com\njccug.com\njcdd.com\njcebid.com\njcecom.com\njcedu.org\njcetglobal.com\njcex.com\njcf94.com\njcgcn.com\njcgcw.com\njchat.io\njchl.com\njchla.com\njchouse.org\njchunuo.com\njchxmc.com\njcjjwx.com\njckjsc.com\njcku.com\njclab.net\njclegend.com\njcloud-cache.com\njcloud-cache.net\njcloud-cdn.com\njcloud-live.com\njcloud-oss.com\njcloud.com\njcloudcache.com\njcloudcache.net\njcloudcs.com\njclouddn.com\njclouddns.com\njclouddns.net\njcloudec.com\njcloudedge.com\njcloudedge.net\njcloudgslb.com\njcloudgslb.net\njcloudimg.com\njcloudimg.net\njcloudlb.com\njcloudlb.net\njcloudlive.com\njcloudlv.com\njcloudoss.com\njcloudresolve.com\njcloudresolve.net\njcloudss.com\njcloudstatic.com\njcloudstatic.net\njcloudvideo.com\njcloudvideo.net\njcloudwaf.com\njcloudwaftest.com\njcloudwaftest.net\njclps.com\njcmeh.com\njcmob.net\njcnano.com\njcnk120.com\njcno.net\njcnqqnf.com\njcodecraeer.com\njcorv.org\njcpeixun.com\njcpesz.com\njcqzw.com\njcrb.com\njcrcw.com\njcrgyy.com\njcscp.org\njcsfs.com\njcsjt.com\njcsrsj.com\njcssolar.com\njcsy66.com\njcszhtc.com\njctmj.net\njctrans-shantou.com\njctrans.com\njcumbrella.com\njcvba.com\njcwgk.com\njcwgo.com\njcwiki.net\njcwjdg.com\njcwljt.com\njcwxiao.com\njcxzlsgs.com\njcyad.com\njcyai.com\njcyes.com\njcys120.com\njcys12366.com\njcyspt.com\njcyx2019.com\njcyxds.com\njczb.vip\njczc.vip\njczh100.com\njczhijia.com\njczhiyao.com\njcznzb.com\njd-88.com\njd-app.com\njd-bbs.com\njd-credit.com\njd-df.com\njd-ex.com\njd-ex.net\njd-fm.com\njd-hospital.com\njd-link.com\njd-sprot-eur.shop\njd-zd.com\njd.co\njd.com\njd.hk\njd.shop\njd100.com\njd120.com\njd360.hk\njd37.com\njd5.com\njdair.net\njdallianz.com\njdapi.com\njdb-ware.com\njdb100.com\njdbbs.com\njdbbx.com\njdbchina.com\njdbhw.com\njdbjba.com\njdbox.xyz\njdbpcb.com\njdburl.com\njdbusiness.com\njdcache.com\njdcaipu.com\njdcapital.com\njdcdn.com\njdcloud-api.com\njdcloud-api.net\njdcloud-edu.com\njdcloud-elite.com\njdcloud-elive.com\njdcloud-livebuy.com\njdcloud-mail.com\njdcloud-openapi.com\njdcloud-oss.com\njdcloud-scdn.net\njdcloud-scdn.tech\njdcloud-scdndns.com\njdcloud-yd.com\njdcloud.com\njdcloudai.solutions\njdcloudcache.com\njdcloudcache.net\njdcloudcdn.com\njdcloudcdn.net\njdcloudcs.com\njdclouddns.com\njdclouddns.net\njdcloudedge.com\njdcloudedge.net\njdcloudlb.com\njdcloudlb.net\njdcloudlive.com\njdcloudlive.net\njdcloudnaming.net\njdcloudresolve.com\njdcloudresolve.net\njdcloudshop.com\njdcloudsite.com\njdcloudstatic.com\njdcloudstatic.net\njdcloudstatus.com\njdcloudstatus.net\njdcloudvideo.com\njdcloudvideo.net\njdcloudwaf.com\njdcmmc.com\njdcmoly.com\njdcontent.com\njdcq.net\njdcsww.com\njdctky.com\njdd-global.com\njdd-hub.com\njddaojia.shop\njddapeigou.com\njddaw.com\njdddata.com\njddebug.com\njddglobal.com\njddj.com\njddmoto.com\njddtv.com\njddyl.com\njdedu.net\njdemall.com\njdface.com\njdfair.com\njdfcloud.com\njdfeijing.com\njdfinance.com\njdfjx.com\njdfmgt.com\njdfryl.com\njdfschool.com\njdfw1.com\njdfybjy.com\njdfzm.com\njdgogo.com\njdgsgl.com\njdgslb.com\njdgslb.net\njdgzf.net\njdh.com\njdh.healthcare\njdhmediajd.com\njdhospital.com\njdhuafeng.com\njdhyplay.com\njdianfei.com\njdindustry.com\njdis.org\njdiy.club\njdjgq.com\njdjingmai.com\njdjinrong.com\njdjob88.com\njdjrdns.com\njdjt.com\njdjygold.com\njdkcb.com\njdkjxy.com\njdl.com\njdl8.com\njdlgw.com\njdlhb.com\njdlhpt.com\njdlingyu.com\njdlingyu.net\njdmwk.com\njdmy.com\njdnews.net\njdon.com\njdpay.com\njdpaydns.com\njdplay.com\njdpta.com\njdpz44.com\njdreader.net\njdrns.com\njdrq.net\njds-china.com\njdsafe.com\njdsha.com\njdsjy.com\njdsmartkf.com\njdsry.com\njdss.cc\njdsyjc.com\njdt-precision.com\njdtiot.com\njdtjy.com\njdtxgc.com\njdunion.com\njduoduo.com\njdvisa.com\njdw001.com\njdw2.com\njdwdc.com\njdweixiao.com\njdwgame.com\njdwl.com\njdwmfj.com\njdworldwide.com\njdwxwz.com\njdwxzp.com\njdx.com\njdxc.net\njdxfw.com\njdxlt.com\njdxs.com\njdxsr.com\njdxyydf.com\njdxzz.com\njdy.com\njdycdn.com\njdydevelop.com\njdyfy.com\njdylb.com\njdyou.com\njdypf.com\njdyyeb.com\njdzdeyy.com\njdzeduyun.com\njdzj.com\njdzjw.com\njdzkw.com\njdzmc.com\njdzol.com\njdzol.net\njdzrcw.com\njdzs.com\njdzwang.com\njeacar.com\njean.cd\njeanphy.online\njeanssalon.com\njeanswest.com\njeawin.com\njeawincdn.com\njechobio.com\njectronic.com\njedi-games.com\njedoo.com\njee-cn.com\njeeanlean.com\njeecg.com\njeecg.org\njeecms.com\njeee.ltd\njeejen.com\njeepay.com\njeepay.vip\njeeplus.org\njeepyy.com\njeequan.com\njeerun.com\njeesci.com\njeeseen.com\njeesite.com\njeewong.com\njeeyaa.com\njeeyee.com\njeeyor.com\njefen.com\njeffdingzone.com\njeffjade.com\njeffreyitstudio.com\njeflon.com\njegotrip.com\njehudf.com\njekeen.com\njelleybrown.com\njellow.club\njellow.site\njellymoo.com\njellythink.com\njemincare.com\njemoic.com\njengcloud.com\njenno-cn.com\njenomc.com\njeom.org\njeongen.com\njeoshi.com\njepekale.com\njereh-gas.com\njereh-network.com\njereh.com\njerei.com\njeremycn.com\njerpx.com\njerrytom.xyz\njerryzou.com\njescard.com\njesdatools.com\njesgoo.com\njesie.org\njesiro.com\njesoncom.com\njesselauristonlivermore.com\njesselivermore.com\njestq.com\njet-ego.com\njet-logistics.com\njet-ok.com\njetechtool.com\njetgroup-cn.com\njetgroup-nb.com\njethoo.com\njethro.fun\njetionservice.com\njetlogistic.com\njetmobo.com\njetneed.com\njetsum.com\njetsum.net\njeulover.com\njeuronghotels.com\njevolpu.com\njewellery.gold\njewellworld.com\njewelryseeds.com\njewelryshanghai.com\njexus.org\njeyi.com\njeywatch.com\njf-biaotw.com\njf-motor.com\njf-r.com\njf1898.com\njf1969.com\njf258.com\njf900.com\njf9p.com\njfagroup.com\njfbcb.com\njfbuilding.com\njfchinese.com\njfcjt.com\njfcoo.com\njfdaily.com\njfedu.net\njfgjwl.com\njfgou.com\njfh.com\njfhzfsn.com\njfinal.com\njfinfo.com\njfj3419.com\njfjt.cc\njflparking.com\njflswl.com\njfpal.com\njfq.com\njfrogchina.com\njfrschool.com\njfsc.com\njfshare.com\njfstatic.com\njftech.com\njftianshancn.com\njfwb.com\njfwypay.com\njfxiaopaoqi.com\njfydgame.com\njfyf.cc\njfyiyao.com\njfyskw.com\njfz.com\njfzhcx.com\njfzhiyao.com\njg058.com\njg1060.com\njg1994.com\njg91.com\njgcarbide.com\njgchat.net\njgcjjt.com\njgdq.org\njgdun.com\njgdx.com\njgew3d.com\njgfarm.com\njgg.hk\njgg09.com\njggame.net\njghstar.com\njgjapp.com\njglh.com\njglm.cc\njgs-ds.com\njgscct.com\njgsdaily.com\njgsemicon.com\njgstour.com\njgsxfw.com\njgtc315.com\njguanjia.com\njgums.com\njguo.com\njgxb120.com\njgxzy.com\njgy.com\njgyljt.com\njgyun.net\njgzx.org\njgzyw.com\njh-dzcl.com\njh-sh.com\njh-trace.com\njh-uav.com\njh0516.com\njh3737.com\njh3j.com\njh597.com\njh5l.com\njh8k.com\njh96095.com\njhak.com\njhaoyou.com\njhcb.net\njhcfz.com\njhcheku.com\njhcms.com\njhconba.com\njhctbank.com\njhddsz.com\njhdmro.com\njhdpower.com\njhdxjk.com\njhenten.com\njhfl.com\njhforever.com\njhfsata.com\njhgolfcarts.com\njhgroup525.com\njhgtgb.com\njhgykt.com\njhhospital.com\njhhygl.com\njhi.cc\njhjt.xyz\njhjunda.com\njhjy.net\njhkao.com\njhkj.work\njhkuajing.com\njhltsl.com\njhm2012.com\njhmnew.com\njhmwo.com\njhnsh.com\njhnsyh.com\njhonge.net\njhonse.com\njhotel-shanghai.com\njhpm.cc\njhqrmyy.com\njhqshfly.com\njhrcbank.com\njhrcsc.com\njhrcw.com\njhsairport.com\njhsc201ddd211svds.com\njhscl.net\njhscm.com\njhscrm.com\njhsddjd.com\njhsjttz.com\njhspa6.com\njhszyy.com\njhtmsf.com\njhuishou.com\njhvsr.com\njhwaimai.com\njhwdp.com\njhwvjjw.com\njhxcms.com\njhxjd.com\njhxl.org\njhxms.com\njhxrmyy.com\njhxzlsgs.com\njhydns01.com\njhydns05.com\njhygame.com\njhyongyou.com\njhypcy.com\njhytech.com\njhyusqo.com\njhyz.net\njhzdhjt.com\njhzhizao.com\njhzhkj.com\njhzhuji.com\njhzoo.com\nji-pai.com\nji-zhun.com\nji.ci\nji7.com\njia.com\njia12.com\njia300.com\njia360.com\njia400.com\njia86.cc\njiaads.com\njiaaohuanbao.com\njiaapps.com\njiabaiwang.net\njiabangcnc.com\njiabaoyuanlin.com\njiabasha.com\njiaben.com\njiaboojc.com\njiacai001.com\njiacaitc.com\njiachangshichutieqi.com\njiacheng88.com\njiachong.com\njiadafoods.com\njiadapaper.com\njiadeqy.com\njiadingjiaxiao.com\njiadingqiang.com\njiadounet.com\njiadule.com\njiaduobao.ru\njiae.com\njiaenderen.com\njiaenhospital.com\njiafang168.com\njiafenqi.com\njiafu68.com\njiafuda.com\njiagedan.com\njiagela.com\njiagle.com\njiagoo.com\njiagoo.net\njiagouyun.com\njiaguanlaw.com\njiaguboshi.com\njiaguhome.com\njiagulun.com\njiagumen.com\njiagumima.com\njiaguowenhua.com\njiaguwenxf.com\njiahecare.com\njiaheu.com\njiahewushe.com\njiahua-sz.com\njiahuacinema.com\njiahuaming.com\njiahui.com\njiahuism.com\njiain.net\njiaji.com\njiaji28.net\njiajia-china.com\njiajia.tv\njiajiagroup.com\njiajiakt.com\njiajiangcake.com\njiajiao114.com\njiajiao400.com\njiajiaoban.com\njiajimao.com\njiajingink.com\njiajiyp.com\njiaju.cc\njiaju.com\njiajuimg.com\njiajuketang.com\njiajumi.com\njiajurenwu.com\njiajuservice.com\njiajuwo.com\njiajuxialiang.org\njiajuzhuliu.com\njiakao.com\njiakaobaodian.com\njiakaodashi.com\njiakaokemuyi.com\njiakelai.com\njiakexs.com\njialanling.com\njialaxin.cc\njialebao.cc\njialecc.com\njialei168.com\njialez.com\njialiangad.com\njialianzg.com\njialinep.com\njialiwood.com\njialiyoukuang8.com\njialongsports.com\njialvzc.com\njiamei123.com\njiameidental.com\njiameigj.com\njiameng.com\njiamengbang.net\njiamengfei.com\njiamens.com\njiami110.com\njiamiantech.com\njiaminghi.com\njiamingwenhua.com\njiamisoft.com\njian-jie.com\njian.net\njian27.com\njianada-qianzheng.com\njianae.com\njianai.love\njianai360.com\njianavi.com\njianayangzhiguo01.com\njianbaizhan.com\njianbangchem.com\njianbangjiaoyu.com\njianbaolife.com\njianbihua.com\njianbihua.org\njianbihua360.com\njianbing.com\njiancai.com\njiancaijia.com\njiancaik.com\njiancenj.com\njiancent.com\njiancepai.com\njiancepaper.com\njianchacha.com\njianchiapp.com\njianchihu.net\njiandaima.com\njiandan.net\njiandantianqi.com\njiandanxinli.com\njiandaopay.com\njiandaoyun.com\njiandati.com\njiandiao.com\njianeryi.com\njianfc.com\njianfei.com\njianfei.net\njianfeiba.com\njianfeibaike.com\njianfeidaren.com\njianfengstudio.com\njiang11.com\njiang7.com\njiangbeijituan.com\njiangbeimach.com\njiangbeishuicheng.com\njiangbeiyiyuan.com\njiangbeiyiyuan.net\njiangchaochina.com\njiangcp.com\njiangduoduo.com\njiangguimei.asia\njiangguo.net\njianghaiqu.net\njianghaosm.com\njianghehuagong.com\njianghuamem.com\njianghui.xyz\njiangidea.com\njiangjiuren.com\njiangjizhong.com\njiangkk.com\njianglinminingindustry.com\njiangmama.net\njiangmike.com\njiangmin.com\njiangnan-group.com\njiangnanmarket.org\njiangningwater.com\njiangongdata.com\njiangongw.com\njiangpaipinpai.com\njiangpinjiangxin.com\njiangqiaomuye.com\njiangque.com\njiangruyi.com\njiangshankeji.com\njiangshanlihong.com\njiangshi.org\njiangshi99.com\njiangsudanzhao.com\njiangsuedu.net\njiangsufilm.com\njiangsufootball.org\njiangsugqt.org\njiangsugwy.org\njiangsukj.com\njiangsulvhe.com\njiangsumobile.com\njiangsurc.com\njiangsurhi.com\njiangsusx.com\njiangsuzhongpin.com\njiangtai.com\njiangtuoedu.com\njianguo.tv\njianguoyun.com\njiangweishan.com\njiangxiatech.com\njiangxing.pub\njiangxinkeji.club\njiangxiol.com\njiangxirc.com\njiangxiwater.com\njiangxiwuliu.com\njiangxueqiao.com\njiangyan.tv\njiangyoushang.com\njiangyu.org\njiangzheba.com\njiangzidushu.com\njiangzikanshu.com\njiangziyuedu.com\njiangzuoku.net\njianhaobao.com\njianhuagroup.com\njianhuasheng.com\njianhuavalve.com\njianhucheng.com\njianhui.org\njianhuw.com\njianianle.com\njianidc.com\njianjian.tv\njianjiaobuluo.com\njianjutec.com\njiankang123.net\njiankang13.com\njiankanghebei.com\njiankangsn.com\njiankangyouyi.com\njianke-fangzhou.com\njianke.cc\njianke.com\njianke.net\njiankong.com\njiankongbao.com\njiankunchina.com\njianlc.com\njianlc.net\njianli-sky.com\njianli.com\njianli88.com\njianliao.com\njianliben.com\njianliduo.com\njianlimoban-ziyuan.com\njianlisheji.com\njianliw.com\njianlixiu.com\njianliyuan.com\njianloubao.com\njianlow.com\njianlu365.com\njianmaidi.com\njianmao.net\njianmeicao.com\njianmeng.net\njianmite.com\njianmuhub.com\njianniang.com\njianpaimeiye.com\njianpeicn.com\njianpian.info\njianpu.net\njianpu6.com\njianpu8.com\njianpu99.net\njianq.com\njianqiaochina.com\njianqimao.com\njianqiyl.com\njianran360.com\njianshe99.com\njiansheku.com\njianshen8.com\njianshenmi.com\njianshiduo.com\njianshihui.net\njianshionline.com\njianshu.com\njianshu.io\njianshu.tech\njianshuapi.com\njianshukeji.com\njiansuji001.com\njiansujihm.com\njiantaokj.com\njiantuku.com\njianwang360.com\njianweidata.com\njianweitv.com\njianwenapp.com\njianwulian.com\njianxi-materials.com\njianxinchemical.com\njianxinyun.com\njianxiyasi.com\njianyanjia.com\njianyechina.com\njianyefans.com\njianyewx.com\njianying.com\njianyixinli.com\njianyu360.com\njianyujiasu.com\njianyuweb.com\njianyv.com\njianzeppt.com\njianzhan110.com\njianzhan580.com\njianzhanbao.net\njianzhangongsi.com\njianzhe.com\njianzhi8.com\njianzhian.com\njianzhiba.net\njianzhibao.com\njianzhidaxue.com\njianzhidou.com\njianzhikeji.com\njianzhikeji.net\njianzhimao.com\njianzhiwangzhan.com\njianzhiweike.net\njianzhiyixin.com\njianzhong-edu.com\njianzhusheying.com\njiao15.com\njiaoben.net\njiaobu365.com\njiaobuser.com\njiaochengzhijia.com\njiaoda306.com\njiaodian.pub\njiaodj.com\njiaodong.net\njiaodonghr.com\njiaofei123.com\njiaohezhen.com\njiaohuilian.com\njiaohuiyun.com\njiaohusheji.net\njiaojiang.com\njiaokaitech.com\njiaoko.com\njiaoliuqu.com\njiaomai.com\njiaonan.net\njiaonan.tv\njiaonizuocai.com\njiaopei.com\njiaoping.com\njiaoshirencai.com\njiaoshizhaopin.net\njiaoshizhuye.com\njiaoshoubang.com\njiaoshouhuayuan.com\njiaotu.men\njiaoya.com\njiaoyanyun.com\njiaoyf.com\njiaoyibao.com\njiaoyimao.com\njiaoyin.com\njiaoyixia.com\njiaoyizhu.com\njiaoyu361.com\njiaoyuangroup.com\njiaoyudao.com\njiaoyumao.com\njiaoyundiandongmen.com\njiaoyunw.com\njiaoyuwo.com\njiaoyuzhan.net\njiaozhou.net\njiapin.com\njiapu.tv\njiapuvip.com\njiaqiangban.com\njiaqianglian.com\njiaqing900.com\njiaren.org\njiarenrecycle.com\njiarenvip.com\njiarenzs.com\njiaruitec.com\njiasale.com\njiashejianyan.com\njiashengguangdian.com\njiashida5618.com\njiashiguoji168.com\njiashuangkuaizi.com\njiashuba.com\njiashule.com\njiasou.cc\njiass.cc\njiasu.work\njiasubook.com\njiasucai.com\njiasuhui.com\njiasule.com\njiasule.net\njiasule.org\njiasulian.com\njiataizic.cc\njiataizir.cc\njiatejijin.com\njiatengflycdn.com\njiathis.com\njiatongyitu.com\njiatop.com\njiatuhui.com\njiatui.com\njiatushuke.com\njiatx.com\njiawei.com\njiawei.xin\njiawentrans.com\njiawin.com\njiawonongye.com\njiawutech.com\njiawuzhanzheng.org\njiawuzi.com\njiaxianggame.com\njiaxianghudong.com\njiaxiangxm.com\njiaxiao.pub\njiaxiao100.com\njiaxiaozhijia.com\njiaxiaozhilian.com\njiaxichina.net\njiaxincloud.com\njiaxingren.com\njiaxinkg.com\njiaxinxuetang.com\njiaxiweb.com\njiaxuanwl.com\njiaxuejiyin.com\njiaxun.com\njiay.press\njiayans.net\njiayaw.com\njiayi56.com\njiayin618.com\njiayiss.com\njiayougo.com\njiayoujsq.com\njiayouxueba.com\njiayu.net\njiayu.yoga\njiayuan-ev.com\njiayuan-law.com\njiayuan.com\njiayuanzhang.com\njiayudata.com\njiayue.tech\njiayuehua.com\njiayuhongwedding.com\njiayusx.com\njiazaishanghai.com\njiazhao.com\njiazhao7.com\njiazhaoba.com\njiazhi.online\njiazhichem.com\njiazhoulvke.com\njiazhua.com\njiazhuang.com\njiazhuang6.com\njiazile.com\njiazuo.cc\njibai.com\njibao.online\njibencaozuo.com\njibi.net\njibing57.com\njibite.fun\njicaibao.com\njicaifund.com\njicaixinke.com\njice.io\njichangbus.com\njichangdaba.com\njiche.com\njicheng.net\njichengzao.net\njichuangke.com\njiclip.com\njicnj.com\njicon.net\njicyun.com\njidacheng.com\njidanpu.com\njidantuoshebei.com\njide.com\njidekan.com\njideos.com\njidi.com\njidiancdn.com\njidianwang.com\njidivr.com\njidiw.com\njidouauto.com\njidubook.com\njidujiao.com\njidujiasu.com\njidukeji.com\njieanjiaotong.com\njiebai.com\njiebanchuyou.com\njiebaodz.com\njiebaogroup.com\njiebide.xin\njiecang.com\njiecangtubemotors.com\njiechengcehui.com\njiechengcloud.com\njiechikeji.com\njiechuang.com\njiedaibao.com\njiediankeji.com\njiefadg.com\njiefanglinli.net\njiefu.com\njiefu.net\njiefuku.com\njiegames.com\njiege.pro\njiegeng.com\njiegon.com\njiehua-chem.com\njiehua.com\njiehualv.com\njiehuapharma.com\njiehuigroup.com\njiehun021.com\njiehun027.com\njiehunmishu.com\njiejichengshi.com\njiejing.fun\njiekenmould.com\njiekon.com\njiekou.ltd\njieku.com\njielaigroup.com\njieliapp.com\njielibj.com\njieligo.net\njielijs.com\njieling.net\njielong-printing.com\njielong.co\njielong.com\njielongcorp.com\njielongdaquan.com\njielongguanjia.com\njielou.net\njiemaiyang.com\njiemeng.cc\njiemeng.tw\njiemeng8.com\njiement.com\njiemian.com\njiemin.com\njiemo.net\njiemodui.com\njiemoselect.com\njienyl.com\njiepai.net\njiepaids.com\njiepang.com\njiepei.com\njieqi.com\njieqian.co\njieqibg.com\njieqinwang.com\njierengz.com\njieri2.com\njierili.com\njieruchaosheng.com\njiese.org\njiesen365.com\njieshangwei.com\njieshengit.com\njieshimt8.com\njieshitong.com\njieshu.me\njieshui8.com\njieshuitech.com\njieshuwang.com\njietu365.com\njietuhb.com\njietuosh.com\njietusoft.com\njieweijt.com\njiewen.run\njiexi.net\njiexitz.com\njiexiuyiyuan.com\njiexunyun.net\njieyang.la\njieyanri.com\njieyigroup.net\njieyitong.net\njieyou.com\njieyou.pro\njieyougame.com\njieyoulai888.com\njieyoutsg.com\njieyue.net\njieyuechina.com\njieyuechina.net\njifang360.com\njifang365.com\njifang369.com\njifenapp.com\njifencity.com\njifenfu.net\njifengkj.com\njifengyun.com\njifenh.com\njifenyi.com\njifenyouhuidui.com\njifenzhi.com\njifugk.com\njifulei.com\njigao616.com\njigaojituan.com\njigecili.com\njiguangdaili.com\njiguangdanci.com\njiguanglan.com\njiguo.com\njiguzuo.com\njihai8.com\njihaoba.com\njihegui.com\njihehuaban.com\njihex.com\njihexian.com\njiheyun.com\njihot.com\njihuachina.com\njihuadyes.com\njihuanshe.com\njihubear.com\njihui88.com\njihujiasuqi.com\njihulab.com\njihuoma.com\njihuoniao.com\njihuoyx.com\njiiaa.com\njiimore.com\njijia.com\njijiaerp.com\njijiagames.com\njijiang5.com\njijiangep.com\njijianzhineng.com\njijiaoyu.com\njijidi.com\njijie168.com\njijigugu.club\njijijijin.com\njijing.site\njijinhao.com\njijitec.com\njijiyouxuan.com\njijuduo.com\njikabao.com\njikaicai.com\njike.city\njike.com\njike.info\njike800.com\njikecdn.com\njikedata.com\njikedingyue.com\njikedog.com\njikefan.com\njikegou.net\njikeiot.cloud\njikejiang.com\njikejiazhuang.com\njikejishu.com\njikeq.com\njiketuchuang.com\njikewan.com\njikexiaojiang.com\njikexiu.com\njikexueyuan.com\njikipedia.com\njikklfexh.com\njikstatic.com\njikuai.work\njilailawyer.com\njilaoshi.com\njiletaotao.com\njili20.com\njiliguala.com\njilingames.com\njilingwy.org\njilinmarathon.com\njilinshuiwu.com\njilinxiangyun.com\njiliuwang.net\njiliyun.com\njilongsw.com\njilu.info\njiluchengshi.com\njiluer.com\njilulijob.com\njiluyu.org\njilvfaka.com\njimagroup.com\njimakj.com\njimay.com\njimei-cn.com\njimeilm.com\njimeisilk.com\njimeng.com\njimeng.mobi\njimetec.com\njimi168.com\njimicn.com\njimifashion.com\njimihu.com\njimilier.com\njimingbao.com\njimistore.com\njimmoo.com\njimoedu.net\njimu.com\njimubox.com\njimuc.com\njimucake.com\njimujiazx.com\njimuyk.com\njin-huang.net\njin-wang.net\njin-xiang.com\njin-xin.com\njin10.com\njin10x.com\njinan-marathon.com\njinan7.com\njinanfu.net\njinanguanggao.com\njinanhaofang.com\njinanhualian.com\njinankingyue.com\njinanxww.com\njinbangedu.com\njinbaobeiqiming.com\njinbaoidc.com\njinbaonet.com\njinbi-an.com\njinbiaochi.com\njinbiaohui.com\njinbiaojv.com\njinbifun.com\njinbilianmeng.com\njinbitou.net\njinbondt.com\njincaicaiwu.com\njincao.com\njincaocw.com\njincdn.com\njincece.com\njinchanggps.com\njinchanqunale.com\njincheng56dl.com\njinchengdingjs.com\njinchengmf.com\njinchengpharm.com\njinchuang.org\njinchuanrmt.com\njinchutou.com\njincin.com\njindaixx.com\njindaoshangwu.com\njindati.com\njinde-logistics.com\njindianweb.com\njindianyishi.com\njindidata.com\njindidq.com\njinding.cc\njindingfm.com\njindongsoft.com\njindoushiqi.com\njinducw.com\njindun007.net\njindun9.com\njindunfan.com\njindunkeji.com\njinduoduo.net\njinengtisheng.com\njinenrunze.com\njinergy.com\njinerkang.com\njinfan-keji.com\njinfanda.com\njinfangka.com\njinfengcx.com\njinfengpaint.com\njinfengwine.com\njinfh.net\njinfuzi.com\njing-tong.com\njing-xian.com\njingangfuhui.com\njingangjing.com\njingangjing.net\njingankerrycentre.com\njingansicbd.com\njingbantong.com\njingbo.net\njingbotech.com\njingc.com\njingcai360.net\njingcaipaint.com\njingcaituijian.com\njingch.net\njingchang.tv\njingchengban.com\njingchengwl.com\njingchi.net\njingchuhao.com\njingchurc.com\njingdajiance.com\njingdaka.com\njingdapcb.com\njingdata.com\njingdeyx.com\njingdianju.com\njingdianlaoge.com\njingdianxitong.com\njingdiao.com\njingdigital.com\njingdong.com\njingdongdaili.com\njingdongjinrong.com\njingdongyouxuan.com\njingdudai.com\njingdukaoyan.com\njingdw.com\njingge.com\njinggeng.net\njinggon.com\njinggong-auto.com\njinggongvalve.com\njingguan.ai\njinggui.com\njinghaishop.com\njinghandianzi.com\njinghangapps.com\njingheiot.com\njinghesh.net\njinghonggroup.com\njinghongmedical.com\njinghongsh.com\njinghua.com\njinghuans.com\njinghuaqimo.com\njinghuazhijia.com\njinghudianqi.com\njinghuitang.com\njingjia.net\njingjia.org\njingjia6.com\njingjiamicro.com\njingjiang.com\njingjiasc.com\njingjiawang.com\njingjiayl.com\njingjidaokan.com\njingjie360.com\njingjiezhileng.com\njingjitech.com\njingjiu.com\njingju.com\njingjuok.com\njingjusc.com\njingkaiyuan.com\njingkan.net\njingkaowang.com\njingkebio.com\njingkeleici.com\njingkeyiqi.com\njingkids.com\njingkunagro.com\njinglawyer.com\njinglian88.com\njingliangad.com\njingling.group\njinglingbaoai.com\njinglingbiaozhu.com\njinglingshuju.com\njinglou8.com\njingluemall.com\njingluole.com\njingme.net\njingmedicine.com\njingmeiti.com\njingmen.com\njingmiguangliangg.com\njingmiliangju.com\njingnei.net\njingnengpower.com\njingoal.com\njingos.com\njingpai.com\njingpaidang.com\njingpaihao.com\njingpainet.com\njingpinhui.com\njingpinke.com\njingpt.com\njingqizhitongche.com\njingqueyun.com\njingrongshuan.com\njingruigroup.com\njingsailian.com\njingsh.com\njingshanbus.com\njingshibang.com\njingshibianhuren.com\njingshicd.com\njingshistudy.com\njingshizyy.com\njingshun-wl.com\njingshzh.com\njingsocial.com\njingtai-group.com\njingtang.xyz\njingtanggame.com\njingtao58.com\njingtuitui.com\njingtuliutongchu.work\njingtum.com\njingua168.com\njinguanauto.com\njingugroup.net\njinguilvyou.com\njingutrust.com\njingvo.com\njingwacenter.com\njingwah.com\njingwei.link\njingwei.net\njingweizhichuang.com\njingwuhui.com\njingwxcx.com\njingxi.com\njingxi.net\njingxiang.work\njingxianglawfirm.com\njingxinad.com\njingxinclass.com\njingyakt.com\njingyanben.com\njingyanbus.com\njingyangzhijia.com\njingyanlib.com\njingyanshu.com\njingyeco.com\njingyeqian.com\njingyi186.com\njingyimetal.com\njingyinb.com\njingyingshenghua.com\njingyingyicheng.com\njingyitech.com\njingyiyiyao.com\njingyougz.com\njingytech.com\njingyuan.com\njingyuelaw.com\njingyuetang.com\njingyunos.com\njingyunyilian.com\njingyuweike.com\njingyuxiaoban.com\njingyuyun.com\njingzhengu.com\njingzhi5.com\njingzhouxw.com\njingzhu-bio.com\njingzhusz.com\njingzong.org\njinhaigroup.com\njinhaihujingqu.com\njinhaisujiao.com\njinhe-energy.com\njinheamc.com\njinher.com\njinheshiye.com\njinhevip.com\njinhongchina.com\njinhonggroup.com\njinhongnl.com\njinhu.me\njinhuapp.com\njinhuatv.com\njinhuawatch.com\njinhuazhe.com\njinhuo.net\njinhusns.com\njinhutour.com\njinianbi.com\njiniance8.com\njinianri.com\njining.com\njiningcoal.com\njiningjj.com\njiniu.work\njiniutech.com\njinjia.com\njinjiang-group.com\njinjiang.com\njinjiang.tv\njinjianghotels.com\njinjianginns.com\njinjiangwater.com\njinjiaomh.com\njinjie.tech\njinjiedu.com\njinjieshengwu.com\njinkaijia.com\njinkan.org\njinkanghospital.com\njinkaoedu.com\njinke.com\njinkedatex.com\njinkeholdings.com\njinkejoy.com\njinkex.com\njinkezhexin.com\njinkongauto.com\njinkopower.com\njinkosolar.com\njinkoubaodian.com\njinkoucaigou.com\njinku.com\njinkunlaw.com\njinlaiba.com\njinlaijinwang.com\njinlangbo.com\njinlanqihua.com\njinlanzuan.com\njinletx.com\njinlianchu.com\njinling.com\njinlingholdings.com\njinlinghotel.com\njinlinghotels.com\njinlingjiajiao.com\njinlishenghuo.com\njinliufu.net\njinliyang.net\njinliyu.cc\njinlonggeishui.com\njinluowater.net\njinluzl.com\njinlvkeji.com\njinlyb.com\njinma-int.com\njinmabrand.com\njinmajia.com\njinmalvyou.com\njinmao-ti.com\njinmao88.com\njinmaodigital.com\njinmaofoundry.com\njinmaopartners.com\njinmaowy.com\njinmaozs.com\njinmeiji.com\njinmenrc.com\njinmi.com\njinming.net\njinmixuetang.com\njinmogame.com\njinmuinfo.com\njinnong.cc\njinpacs.com\njinpai365.com\njinpanlab.com\njinpengecologyhotel.com\njinpin.xyz\njinpu.com\njinpupvc.com\njinqi2023.com\njinqiang.online\njinqiangjc.com\njinqianguan.com\njinqianma.com\njinqiaojob.com\njinqiaopu.com\njinqiexia.com\njinqigroup.com\njinqijian.com\njinqingdz.com\njinqiunc.com\njinqiuzhu.com\njinquanpharm.com\njinqunla.com\njinr.com\njinri.red\njinridiaoyu.com\njinriguanzhu.cc\njinrilife.com\njinriningxiang.com\njinrirm.com\njinrishici.com\njinritemai-inc.com\njinritemai.com\njinritoutiao.com\njinriwushi.com\njinrixing.cc\njinrongbaguanv.com\njinrongchaoshi.com\njinrongdianli.com\njinronghu.com\njinrongren.net\njinrui-tech.com\njinruimedical.com\njinruism.com\njinrunsoft.com\njins-cn.com\njinse.com\njinsebook.com\njinsehuaqin.com\njinsenforestry.com\njinsha120.com\njinshacapital.com\njinshakemei.com\njinshanapi.com\njinshandaolu.com\njinshangdai.com\njinshangji.com\njinshanglawfirm.com\njinshangroup.net\njinshangtechnology.com\njinshanip.cc\njinshanju.com\njinshanmz.com\njinshasitemuseum.com\njinshengceramics.com\njinshengtang.net\njinsheyi.com\njinshi-nj.com\njinshier66.com\njinshileasing.com\njinshisoft.com\njinshitan.com\njinshixun.com\njinshmgw.com\njinshu.org\njinshuai.com\njinshuangding.com\njinshuiyuncai.com\njinshuju.co\njinshuju.com\njinshuju.cool\njinshuju.net\njinshuju.org\njinshujuapp.com\njinshujucdn.com\njinshujufiles.com\njinshuluoshui.com\njinshun.com\njinshuschool.com\njinshutuan.com\njinsiwei.com\njintaiwh.com\njintajx.com\njintanwang.com\njintdev.com\njintelisi.com\njinti.com\njintianjihao.com\njintiankansha.me\njintone.com\njintonghua.com\njintouep.com\njintouwangdai.com\njintuituiapp88.com\njinwaimai.com\njinweitec.com\njinwucdn.com\njinxiang114.com\njinxianglian.net\njinxidao.com\njinxinqh.com\njinxiu266.com\njinxuliang.com\njinxun.cc\njinyaco.com\njinyafu.com\njinyawei.com\njinyici.com\njinyidun.com\njinyindao.com\njinying.com\njinyinghotels.com\njinyingimage.com\njinyongwang.com\njinyoukai.com\njinyuan.pro\njinyuanbiochem.com\njinyuancopper.com\njinyuangejiaju.com\njinyuanlight.com\njinyunal.com\njinyunjob.com\njinyunweb.com\njinyuzd.cc\njinzhao.me\njinzheled.com\njinzhengjt.com\njinzhidagl.com\njinzhijiance.com\njinzhongbus.com\njinzhou315.com\njinzhou360.com\njinzhougroup.com\njinzhouoffice.com\njinzhucaifu.com\njinzhuoqy.com\njinzjy.com\njinzunjy.com\njioluo.com\njiongcun.com\njiongji.com\njiongtoutiao.com\njiongyaya.com\njiont.com\njionz.com\njiou.me\njiouyun.com\njipd.com\njiping.site\njipinsoft.com\njipinwww.com\njiqid.com\njiqie.com\njiqimao.com\njiqirenku.com\njiqish.com\njiqizhixin.com\njiqrxx.com\njiqw.com\njirehhz.com\njirengu.com\njirenqi.com\njiri10.com\njiri28.com\njirong.com\njirongyunke.net\njirou.com\njisapower.com\njisec.com\njisheyun.com\njishi3.com\njishicloud.com\njishicn.com\njishigou.net\njishigu.com\njishirili.com\njishitailai.com\njishiyuboke.com\njishubai.com\njishuchi.com\njishukong.com\njishulink.com\njishuoshuo.com\njishusongshu.com\njishux.com\njishuzf.com\njisi17.com\njisikaer.com\njissbon.com\njisu-cnd.com\njisu1688.com\njisuanke.com\njisuanla.com\njisuanzt.com\njisuapi.com\njisuchou.com\njisuim.com\njisuimage.com\njisuimg.com\njisujie.com\njisukandian.com\njisunton.com\njisuoffice.com\njisupdf.com\njisupdfeditor.com\njisupdftoword.com\njisupe.com\njisutodo.com\njisutp.com\njisuts.com\njisutui.vip\njisuwebapp.com\njisuwz.com\njisuxia.com\njisuye.com\njisuyilaixingpiyan.com\njisuziyuanbf.com\njita.fun\njita.im\njita5.com\njitaba.net\njitabang.com\njitadaren.com\njitadog.com\njitailian.com\njitaivalve.com\njitangcn.com\njitao.tech\njitapai.com\njitapu.com\njitapuji.com\njitashe.org\njitavip.com\njitetech.com\njitgame.com\njitianhz.com\njitriroad.com\njittbang.com\njitucdn.com\njitukaisuo.com\njituofuture.com\njituotech.com\njituwang.com\njiu-b.com\njiuaidu.com\njiuaizhihe.com\njiuanchem.com\njiuanyy.com\njiub.net\njiubaju.com\njiubawan.com\njiubuhua.com\njiucaicaijing.com\njiucaigongshe.com\njiucaishuo.com\njiuce.com\njiuchenglaw.com\njiuchet.shop\njiuchutong.com\njiucool.org\njiudafu.com\njiudaifu.com\njiudianhudong.com\njiudianjiu.com\njiudianrong.com\njiudianxing.com\njiudianyongpin.com\njiuding-group.com\njiudingcapital.com\njiudinggroup.com\njiudingref.com\njiufengsuye.com\njiugang.com\njiugangbid.com\njiuguijiu000799.com\njiuhantang365.com\njiuhengmake.com\njiuhewj.com\njiuhongwang.com\njiuhua0566.com\njiuhuaiwenxue.com\njiuhuang.com\njiuhuashan.cc\njiuhuishou.com\njiuhuoba.com\njiuishizanjin.com\njiujiange.com\njiujiangjx.com\njiujipos.com\njiujiuhuyu.com\njiujiuyunhui.com\njiujiuzu.com\njiujun.net\njiujunqifu.com\njiukaicable.com\njiuku.cc\njiuku.com\njiuligroup.com\njiulku.com\njiull.com\njiulong120.com\njiulve.com\njiumaojiu.com\njiumaster.com\njiumei.com\njiumei168.com\njiumei8.com\njiumeisheng.com\njiumentongbu.com\njiunile.com\njiuniok.com\njiupaicom.com\njiupainews.com\njiupaipay.com\njiuq.com\njiuqianwan.group\njiuqianwanjituan.com\njiuqijz.com\njiuqings193004.asia\njiuqings21833.asia\njiuquan.cc\njiuqucloud.com\njiuquhe.com\njiurichem.com\njiurong.com\njiuruigroup.com\njius.net\njiusanedu.com\njiuse.cloud\njiuse2.cloud\njiuse3.cloud\njiushengas.com\njiushiadx.com\njiushigong.com\njiushixing.com\njiushui.tv\njiusi.com\njiusi.net\njiusibz.com\njiusihengyuan.com\njiusili.com\njiusitm.com\njiusko.com\njiutaigroup.com\njiutong100.com\njiutongqu.com\njiutu.net\njiutw.com\njiuwa.net\njiuwan.com\njiuwang.shop\njiuwanshan.net\njiuwei.net\njiuweick.com\njiuweige.com\njiuxian.com\njiuxianfeng.com\njiuxiaobao.vip\njiuxihuan.net\njiuxinban.com\njiuxing.com\njiuxing818.com\njiuxingtang.online\njiuxinsolar.com\njiuxu.com\njiuxusb.com\njiuyan.info\njiuyanchuanmei.com\njiuyang.com\njiuyangongshe.com\njiuyaowangluo.com\njiuyejia.com\njiuyew.com\njiuyezhinan.com\njiuyf.com\njiuyi120.com\njiuyiwenhe.com\njiuyue919.com\njiuyuehuyu.com\njiuyuu.com\njiuzg.com\njiuzhai.com\njiuzhaigou-china.com\njiuzhang.com\njiuzheng.com\njiuzhenge.com\njiuzhilan.com\njiuzhinews.com\njiuzhoupharma.com\njiuzhouzb.com\njiuzhuanzhuan.com\njiuzungame.com\njiway.net\njiweichengzhu.com\njiweixin168.com\njiwu.com\njiwucdn.com\njixiang-ht.com\njixiang-tech.com\njixiang800.com\njixiangjili.com\njixiangyou.com\njixianku.com\njixiao100.com\njixiaoedu.com\njixie100.net\njixie5.com\njixie5188.com\njixiecun.com\njixiehonghong.com\njixiejiaoyu.com\njixieshi.com\njixieshigong.com\njixiew360.com\njixiewz.com\njixinbbd.com\njixinet.com\njixixx.com\njixuanw.com\njixueedu.com\njixuninfo.com\njixunjsq.com\njixunlyq.com\njiyaogroup.com\njiyi.art\njiyi.biz\njiyida-logistics.com\njiyifa.com\njiyikj.com\njiyili.net\njiyin-tech.com\njiyin2020.com\njiyixcx.com\njiyou-tech.com\njiyoujia.com\njiyouwang.com\njiyouzhan.com\njiyuantour.com\njiyue-auto.com\njiyuncn.com\njiyunhudong.com\njiyunhudong.net\njiyuntang.com\njiyusi.com\njiyx.com\njizbmedia.com\njizhan.com\njizhangla.com\njizhaotang.com\njizhazha.com\njizhiba.com\njizhida.com\njizhihd.com\njizhihezi.com\njizhimobi.com\njizhiyouke.com\njizhouyoupin.com\njizhuba.com\njizhuomi.com\njizhutaoke.com\njizustore.com\njj-1918.com\njj-inn.com\njj00.com\njj0833.com\njj20.com\njj59.com\njj831.com\njj99.icu\njjbang.com\njjbank.net\njjbbs.com\njjbctv.com\njjbdns.com\njjbearings.com\njjbhn.com\njjbisai.com\njjblogs.com\njjbnews.xyz\njjcbw.com\njjccb.com\njjcclt.com\njjcdn.com\njjcoffetel.cc\njjcoffetels.com\njjcpe.com\njjcs66.com\njjcto.com\njjdd.com\njjdede.com\njjdqshy.com\njjecn.com\njjedu.com\njjedu.net\njjeglobal.com\njjfinder.com\njjfuzu.com\njjg630.com\njjgsxc.com\njjh11.com\njjhb.com\njjhgame.com\njjhgamedns.com\njjhh.com\njjhlkqn.com\njjhuifu.com\njjhuolang.com\njjhuoyan.com\njjhza.win\njjidc.com\njjiehao.com\njjinfo.com\njjisp.com\njjj555.com\njjjaaa.com\njjjcjt.com\njjjjjertqqo2222.com\njjjkj.com\njjjlll.org\njjkeq.com\njjkjnet.com\njjkk.org\njjkucunxie.com\njjldbk.com\njjldxz.com\njjledu.net\njjlgbj.com\njjlhbs.com\njjlvu.com\njjlysh.com\njjmatch.com\njjmfc.com\njjmh.com\njjmkids.com\njjmmw.com\njjnshop.com\njjnz.com\njjonline.org\njjqj.net\njjr.vip\njjrau1656.com\njjrc.net\njjrw.com\njjsedu.org\njjshome.com\njjsip.com\njjtang.com\njjtianshangi.com\njjtonline.com\njjtravel.com\njjttjx.com\njjwdz.com\njjwli.com\njjwsx.com\njjwxc.com\njjwxc.net\njjwxc.org\njjxxk.com\njjxyls.com\njjy118.com\njjycw.net\njjygym.com\njjypyz.com\njjys188.com\njjyx.com\njjyz.net\njjyz360.com\njjzc168.com\njjzdm.com\njjzfgjj.com\njjzls.com\njjzyy.com\njjzyy.org\njk-bms.com\njk-px.com\njk.com\njk126.com\njk13.net\njk169.net\njk2h.com\njk33zu6.org\njk37du.com\njk3a.com\njk51.com\njk725.com\njk90.com\njkangbao.com\njkapi.com\njkb7.com\njkbexp.com\njkbl.com\njkc8.com\njkchemical.com\njkcn365.com\njkcorkpads.com\njkcsjd.com\njkd.com\njkd360.com\njkdsz.com\njkelec.com\njkh-ym.com\njkhapp.com\njkhcfz.com\njkhds872.com\njkhealth.vip\njkimg.net\njkjiekuan.com\njkjzt.com\njkkefv.com\njkl6.com\njkllbd.com\njklsjm.com\njklughj.work\njknanotech.com\njkouu.com\njkpan.cc\njkpj.com\njkqdl.com\njkqingman.com\njkrcw.net\njkt-tencentclb.cloud\njkt-tencentclb.com\njkt-tencentclb.net\njkt-tencentclb.work\njktcom.com\njktong.com\njktower.com\njkuntp.com\njkwatch99.com\njkwshk.tv\njkx.cc\njkxds.net\njkxedu.com\njkximg.com\njkxw168.com\njkyc.com\njkydt.com\njkypeg.com\njkyule.com\njkzhilu.com\njkzl.com\njkzn365.com\njl-er.com\njl-jssk.com\njl0435.com\njl0775.com\njl1mall.com\njl465.com\njl519.com\njl54.org\njl7y.com\njladi.com\njlafw.com\njlairports.com\njlakes.org\njlandmeditech.com\njlaod.com\njlaoj.com\njlaqjdjt.com\njlbhtc.com\njlbjcs.com\njlbkjt.com\njlbry.com\njlc-3dp.com\njlc-bbs.com\njlc-cad.com\njlc-cam.com\njlc-cnc.com\njlc-code.com\njlc-dfm.com\njlc-drm.com\njlc-ecad.com\njlc-erp.com\njlc-fpc.com\njlc-gw.com\njlc-jh.com\njlc-layout.com\njlc-pcb.com\njlc-smt.com\njlc-zh.com\njlc.com\njlccad.com\njlccam.com\njlccnc.com\njlccpit.com\njlcdfm.com\njlcecad.com\njlceda.com\njlcerp.com\njlcfa.com\njlcmc.com\njlcops.com\njlcsj.com\njlcsmt.com\njldjam.com\njldpvc.com\njlfba.com\njlg66.com\njlgf.com\njlginyo.com\njlgjjt.com\njlguorui.com\njlguowen.com\njlgxmob.com\njlgyjj.com\njlhc.com\njlhdq.com\njlhnw.com\njlhs.net\njlhtcm.com\njlhxjt.com\njlhzyanxue.com\njlinh.com\njljcxy.com\njljcz.com\njljgdj.org\njljnkj.com\njljob88.com\njljzzs.com\njlkfapp.com\njlkgj.com\njlkj.cc\njlkjgroup.com\njllihua.com\njllyzxyy.com\njlmhk.com\njlmhw.com\njlmuban.com\njlnku.com\njlnls.com\njlonline.com\njlpay.com\njlq.com\njlqsugar.com\njlrfx.com\njlriza.com\njlrtvu.com\njlsdesyxx.com\njlsdwj.com\njlsdzgckcy.com\njlsebhyy.com\njlsegx.com\njlsemi.com\njlsfcyy.com\njlsgjt.com\njlsjsjlhgczxxh.com\njlsjsxxw.com\njlsports.com\njlspr.com\njlsqwyy.com\njlsrc.com\njlsrmyy.net\njlstt.com\njlsw.cc\njlswansen.com\njlsyqzyy.com\njlszlyy.com\njlt01.com\njltchina.com\njlthcc4596.vip\njltq.com\njltrq.com\njltu.net\njlty56.com\njltzgfgs.com\njlwater.com\njlwlw.com\njlxfw.com\njlxhyy.com\njlxtxny.com\njlylwater.com\njlyr2.com\njlysgjzx.com\njlystatic.com\njlytzk.com\njlzhongdong.com\njlzkb.com\njlzsoft.com\njlzyz.com\njm-gallium.com\njm-machines.com\njm-talents.com\njm1ph.com\njm2046.com\njm233333.com\njm3f.com\njm3q.com\njmads.net\njmbao.com\njmbbs.com\njmbon.com\njmbus.net\njmch12333.com\njmchn.com\njmd-china.com\njmd-leatherbag.com\njmdedu.com\njmdna.com\njmdns.com\njmed.com\njmeii.com\njmeizs.com\njmev.com\njmgle.com\njmglg.com\njmgo.com\njmgsgs.com\njmhaofa.com\njmhapp.com\njmhd8.com\njmhjh.org\njmhs.net\njmi365.com\njmj-pharma.com\njmj.cc\njmj1995.com\njmjc.tech\njmjxc.com\njmjzy.com\njmkj.com\njmkx.com\njmkxjt.com\njmlanguan.com\njmlfood.com\njmlk.co\njmmsn.com\njmmuseum.com\njmnk300.com\njmonline.org\njmp-cn.com\njmp.gd\njmqy.com\njmqyjt.com\njmrb.com\njmrcw.com\njmsqw.com\njmstatic.com\njmstation.com\njmsxsw.com\njmt-bio.com\njmtnt.com\njmtsg.com\njmwater.com\njmxckj.com\njmxiangyi.com\njmxlmc.com\njmxw.net\njmycapacitor.com\njmycbus.com\njmyleather.com\njmyna.net\njmyqsl.com\njmzcgs.com\njmzgo.com\njmzhangfu.com\njmzns.com\njn-bank.com\njn-cits.com\njn001.com\njn1535.com\njn172.com\njn720.com\njn80.com\njnadi.net\njnairport.com\njnbaibo.com\njnbank.cc\njnbbbyy.com\njnbctv.com\njnbosai.com\njnbuscard.com\njncarw.com\njncec.com\njncfcj.com\njncfjt.com\njncgzl.com\njnchsd.com\njncjjt.com\njncjsgroup.com\njncncq.com\njncyx.com\njndfzt.com\njndssd.com\njndvisa.com\njndwyy.com\njndzx.com\njnec-tencentclb.cloud\njnec-tencentclb.com\njnec-tencentclb.net\njnec-tencentclb.work\njnesc.com\njnexpert.com\njnfx.com\njnfxny.com\njngaobo.com\njngcxy.com\njnghm.com\njngjj.net\njngl.net\njnhb.com\njnhi.com\njnhongyun9.com\njnhouse.com\njnhwjt.com\njnhxzc.com\njnhyyy.com\njnhzxx.com\njnjfwzhs.com\njnjingxin.com\njnjj.com\njnjpkj.com\njnjszl.com\njnkason.com\njnkj.org\njnky.com\njnlab.com\njnlc.com\njnlgzs.com\njnltwy.com\njnmama.com\njnmc.com\njnnc.com\njnnews.tv\njnoec.com\njnpfsoft.com\njnpjyy.com\njnqzyy.com\njnrain.com\njnreli.com\njnrmyy.com\njnruilun.com\njnryc.com\njns168.com\njnshijia.com\njnshu.com\njnsjzyxh.com\njnskqyy.com\njnslyy.com\njnsmjt.com\njnsms.com\njnstdc.com\njnszhqyy.com\njntcg.com\njntig.com\njntinchina.com\njntyhl.com\njnubio.com\njnw.cc\njnwb.net\njnwenlian.com\njnwinner.com\njnxdgs.com\njnxtzdh.com\njnxydefsxx.com\njnyczx.com\njnydgm.com\njnyng.com\njnyyjt.com\njnzcsyj.com\njnzhuoxin.com\njnzjzx.net\njnzl.com\njnzongchi.com\njnzwgzs.com\njnzx.cc\njnzycw.com\njo-loagm06.com\njob-sky.com\njob006.com\njob0575.net\njob0663.com\njob0722.com\njob0728.com\njob0768.com\njob088.com\njob0917.com\njob10000.com\njob1001.com\njob120.com\njob168.com\njob1998.com\njob225.com\njob2299.com\njob250.com\njob263.com\njob36.com\njob510.com\njob5156.com\njob5588.com\njob5678.com\njob592.com\njob788.com\njob88.com\njob910.com\njob9151.com\njob916.com\njobbaidu.com\njobbole.com\njobcdp.com\njobch263.com\njobcn.com\njobczrc.com\njobeast.com\njobef.com\njobgojob.com\njobhb.com\njobhuaibei.com\njobi5.com\njobidc.com\njobinhe.net\njobjm.com\njobjy.com\njobloser.com\njobosoft.vip\njobpin.com\njobsalon.net\njobsdigg.com\njobsitechina.com\njobsun.com\njobtiku.com\njobtong.com\njobui.com\njobuy.com\njobvvv.com\njobxinpg.com\njobyp.com\njocat.com\njocgreatwall.com\njocite.com\njoclabor.net\njocltd.com\njoctech.com\njocund-gift.com\njodoll.com\njoe92.com\njoessem.com\njohhan.com\njohnlz.com\njohnmedia.com\njohogames.com\njohouse.com\njoi09110pt.com\njoiest.com\njoinchitchat.com\njoindata.net\njoineonlux.com\njoinf.com\njoiningss.com\njoinkchem.com\njoinpay.com\njoinquant.com\njoinsen.com\njoinsuns.com\njoint-harvest.com\njointas.com\njointech-cn.com\njointekbusiness.com\njointforce.com\njointown.com\njoinusad.com\njoinval.com\njoinway.com\njoinwaylawfirm.com\njoinwee.com\njojo000.vip\njojoread.com\njojoreading.com\njoke66.com\njokecommunity.com\njokecommunity.net\njoker.li\njokerbai.com\njolimark.com\njollerge.com\njollylifelhq.com\njollyspring.com\njoloplay.com\njomocdn.net\njomodns.com\njomodns.net\njomoxc.com\njomoxd.com\njonesroadbeautyrebate.com\njongtay.com\njonhuu.com\njonllen.com\njonln.com\njonny.vip\njonrmal.com\njonsbo.com\njonvie.com\njooancloud.com\njoobot.com\njooioo.com\njoojcc.com\njoojtech.com\njoojzz.com\njoomla.work\njoomobx.com\njoooz.com\njoowhee.com\njoox.com\njooxemail.com\njooyacn.com\njooyoo.net\njooyuu.com\njoozone.com\njoqoo.com\njosen.net\njosephcz.xyz\njoshreso.com\njoshua317.com\njotop.com\njotrin.com\njouav.com\njouder.com\njoudou.com\njoulwatt.com\njournalmc.com\njournalsay.com\njourneyui.com\njourserv.com\njouypub.com\njovcloud.com\njovetech.com\njovision.com\njovisionai.com\njovmall.com\njowto.com\njoy-air.com\njoy-nb.com\njoy110.com\njoy147.com\njoy5151.com\njoya-electric.com\njoyact.com\njoyami.com\njoyanglab.com\njoyapi.com\njoyargroup.com\njoycity.mobi\njoydin.com\njoyes.com\njoyfire.net\njoyforce.com\njoygames.com\njoyglory.com\njoyglue.com\njoyhc.com\njoyi.com\njoyinchem.com\njoying.com\njoyingbox.com\njoyingtrip.com\njoyinpharma.com\njoyintour.com\njoyinvleah.com\njoyj.com\njoylawyer.com\njoymeng.com\njoyncleon.com\njoynext.com\njoyochem.com\njoyocosmetics.com\njoyoget.com\njoyoucnc.com\njoyoung.com\njoyours2019.com\njoyowo.com\njoyplus.tv\njoyshebao.com\njoyslink.com\njoyson.com\njoyssl.com\njoystay.net\njoysung.com\njoysunsh.com\njoytest.org\njoytourvip.com\njoytrav.com\njoytraveller.com\njoytunescn.com\njoytype.com\njoyu.com\njoyuai.com\njoyugas.com\njoyulf.com\njoyware.com\njoywellsemi.com\njoywii.net\njoywok.com\njoyworkshop.com\njoywplace.website\njoyy.com\njoyyan.com\njoyyang.com\njoyyinc.com\njoyyued.com\njozhaopinopin.com\njozne.com\njp-daigou.com\njp-moco.com\njp-tencentclb.cloud\njp-tencentclb.com\njp-tencentclb.net\njp-tencentclb.work\njp.com\njp.run\njp0663.com\njp95.com\njpbeta.net\njpcec.com\njpchinapress.com\njpcoalboss.com\njpddc.com\njpedo.com\njpeen.com\njperation.com\njpfmor.com\njpg.cm\njpghd.com\njpgjzzs.com\njpgreat7.com\njphot.net\njpisp.com\njpjc315.com\njpkankan.com\njpkix.com\njpmetro.com\njpmorganchina.com\njpmsg.com\njpnettech.com\njpnlink.xyz\njpqgxy.com\njprtyun.com\njpsdk.com\njpseek.com\njpshuntong.com\njpsmile.com\njpspecsz.com\njpsto.com\njptab.com\njpthome.com\njptoe.com\njpush.io\njpushoa.com\njpvat.com\njpwb.cc\njpwb.net\njpwind.com\njpwindow.com\njpwky.com\njpwxapp.com\njpxm.com\njpxue.com\njpxww.com\njpyoo.com\njpyssc.com\njpzx.net\njpzy01.com\njq-school.com\njq22.com\njq33.com\njqbar.com\njqcool.net\njqdzw.com\njqgc.com\njqhtml.com\njqkgjt.com\njqlv.com\njqnbp.com\njqncp.com\njqpress.com\njqr.com\njqr5.com\njqrc.net\njqrc88.com\njqrkc.com\njqs4463333a7.shop\njqs4463333a9.shop\njqsite.com\njqsmm.com\njqtxxedk.com\njquan.ink\njquee.com\njquery123.com\njqueryfuns.com\njquerywidget.com\njqwater.com\njqwwq.com\njqyljt.com\njqyou.com\njqzhuangshi.com\njqzjop.com\njqzplat.com\njqzw.com\njr-soft.com\njr123.com\njr18.com\njr2019.com\njravity.com\njrbiopharma.com\njrbobbin.com\njrc-tech.com\njrdaimao.com\njrexam.com\njrfcg.com\njrgang.com\njrgaofu.com\njrhot.com\njrj.com\njrjiekuan.com\njrjingshan.com\njrjr.com\njrlady.com\njrlm81.com\njrlxym.com\njrmf360.com\njrmianban.com\njrnba.cc\njrntv.com\njrpengze.com\njrq39d1r8.com\njrqiwen.com\njrqzw.net\njrs-live-football.com\njrs-live-score.com\njrs-live-z.com\njrs-watch-live.com\njrs-yc-hupu.com\njrsncn.com\njrss.com\njrszw.com\njrteck.com\njrtgroup.net\njrtx.site\njrwenku.com\njrxtp.com\njrxzj.com\njryccm.com\njryghq.com\njryssj.com\njryzt.com\njrzj.com\njrzp.com\njs-aeg.com\njs-aerfa.com\njs-cct.com\njs-cxjt.com\njs-dw.com\njs-emap.com\njs-gear.com\njs-gojo.com\njs-haiyao.com\njs-jiatai.com\njs-jinhua.com\njs-jwt.com\njs-leader.com\njs-lottery.com\njs-paper.com\njs-powerstone.com\njs-rongzheng.com\njs-seeker.com\njs-shenghang.com\njs-talents.com\njs-weilong.com\njs-xny.com\njs-ym.com\njs-zk.com\njs.design\njs04999.com\njs0573.com\njs118114.com\njs165.com\njs178.com\njs3.org\njs3n.com\njs7xc.com\njs811.com\njs9499.com\njs96008.com\njs96777.com\njsadkg.com\njsaeit.com\njsaes.com\njsafc.net\njsahj.com\njsaik.com\njsanbo.com\njsaopa.com\njsape.com\njsarchi.com\njsartcentre.org\njsase.com\njsatcm.com\njsb-syleasing.com\njsbaidu.com\njsballs.com\njsbank.org\njsbc.com\njsbcfl.com\njsbeiyang.com\njsbestop.com\njsbexam.com\njsbfgg.com\njsbgj.com\njsblj.com\njsbsxh.com\njsbzwh.com\njscba.org\njsccn.com\njscdn.ink\njscdwlw.com\njsceb.com\njscelltech.com\njschahua.com\njschanglong.com\njschangshou.com\njsche.net\njschuangnuo.com\njschunxing.com\njschy.com\njscj-elec.com\njscj.com\njsckw.org\njsclearing.com\njscmjt.com\njscnc.net\njscncg.com\njscndata.com\njscnnet.com\njsconi.com\njsconnect.com\njscrg.com\njscsbz.com\njscsdr.com\njscsfc.com\njscssimg.com\njscts.com\njscz55.com\njsd-jasper.com\njsd.cc\njsd2021.com\njsdagua.com\njsdas.com\njsdcly.com\njsddbs.com\njsddhjt.com\njsddz.net\njsdebang.com\njsdehui.com\njsdesign1.com\njsdesoft.com\njsdgb.com\njsdghfw.com\njsdhjssyjt.com\njsdjwood.com\njsdkdzw.com\njsdljn.com\njsdmirror.com\njsdonglai.com\njsdrc.com\njsdsad.com\njsduopin.net\njsdyyt.com\njsdz16.com\njsdzb.com\njsdzgc.com\njsdzlm.com\njseconomy.com\njsedu114.com\njseduinfo.com\njseea.com\njseepub.com\njsehealth.com\njsendian.com\njsenews.com\njseoptics.com\njsep.com\njsepa.com\njser.io\njsessh.com\njsexpressway.com\njsfish.net\njsfj.net\njsfls.com\njsfmly.com\njsfof.com\njsform.com\njsform3.com\njsfqhwsb.com\njsfreiburg.net\njsft.com\njsfw8.com\njsfwpt.com\njsfxw.com\njsfycdn3.com\njsfyjt.com\njsfywater.com\njsfyxh.net\njsgbds.com\njsgc.com\njsgc168.com\njsgcbank.com\njsgcjyw.com\njsgclaw.com\njsgdsb.com\njsgerrard.com\njsggwhy.com\njsgh.org\njsghfw.com\njsgho.com\njsgho.net\njsghx.com\njsgian.com\njsgjksl.com\njsgjl.net\njsgkw.org\njsgogogo.com\njsgoldenbridge.com\njsgongwei.com\njsgpa.com\njsgrb.com\njsgssb.com\njsgsyy.com\njsguohua.com\njsguolv.com\njsgwyw.org\njsgx.net\njsgxgf.com\njsgyrcb.com\njsgzgz.com\njsh.com\njshaipeng.com\njshaite.com\njshaman.com\njshanchao.com\njshaorungroup.com\njsharer.com\njshasy.com\njshazz.com\njshbank.com\njshcsoft.com\njshcxn.com\njshdata.com\njshddx.com\njshdwh.com\njshealth.com\njshemc.com\njshfgroup.com\njshgfm.com\njshggroup.com\njshgyb.com\njshhjkjt.com\njshhqc.com\njshhzssj.com\njshiway.com\njshj.org\njshkht.com\njshlfd.com\njshmrcb.com\njshnh.com\njshqjt.com\njshr.net\njshrconsult.com\njshrtfl.com\njshsoft.com\njsht88.net\njshtcm.com\njshtjt88.com\njshtocean.com\njshtsteel.com\njshuachen.com\njshuafu.com\njshuana.com\njshuanya.com\njshuaxiagroup.com\njshuaxicun.com\njshwyy.com\njshy.com\njshy1688.com\njshykg.com\njshysj.com\njshywl.net\njshyzh.com\njshyzh.net\njshzfzjt.com\njshzzx.com\njsi.cc\njsifa.org\njsinfo.net\njsinnopharm.com\njsiport.com\njsirfe.com\njsjajt.com\njsjcjx.com\njsjclykz.com\njsjd.cc\njsjdgy.com\njsjdjt.com\njsjdrcb.com\njsjdzf.com\njsjeda.com\njsjffj.com\njsjfz.com\njsjgbxg.com\njsjgtz.com\njsjhtz.com\njsjiami.com\njsjianli.com\njsjianye.net\njsjinfu.com\njsjinghui.com\njsjinqi.com\njsjiuda.com\njsjj120.com\njsjjedu.com\njsjjy.com\njsjkx.com\njsjky.com\njsjkzx.com\njsjljg.com\njsjljy.com\njsjnsw.com\njsjnw.org\njsjrtzjt.com\njsjs.cc\njsjs1982.com\njsjsgroup.com\njsjskgjt.com\njsjszgz.com\njsjtxx.com\njsjunma.com\njsjwkg.com\njsjxh03.com\njsjyrcb.com\njsjyyz.com\njsjzd.com\njsk365.com\njskale.com\njskchem.com\njskh.com\njskhfm.com\njskjcms.com\njskjgc.com\njskjgroup.com\njsklcy.com\njskly.com\njskoso.com\njskpcg.org\njskuajing.com\njskunquan.com\njskwt.com\njskxjl.com\njslcjt.com\njsldweb.com\njsldxcl.com\njslegal.com\njslhgroup.com\njslhjg.com\njslida.net\njslife.net\njslijiang.com\njslink.com\njslmarathon.com\njslottery.com\njslpk.com\njslszz.com\njsltgcjt.com\njslvzhigu.com\njsly001.com\njslyjc.com\njslysp.com\njsmda.org\njsmfk.com\njsmian.com\njsminstar.com\njsmjys.com\njsmkyy.com\njsmo.xin\njsmodeling.com\njsmolfa.com\njsmrmf.com\njsmsg.com\njsmxgs.com\njsmxkj.com\njsmxw.com\njsna.work\njsnaier.com\njsnewexpo.com\njsningyi.com\njsnjck.com\njsnjjg.com\njsnkmy.com\njsnol.com\njsnovel.com\njsntg.com\njsntgas.com\njsnx.net\njsnxs.com\njsnydefy.com\njsnydsfy.com\njsnzhb.com\njsocr.com\njsomick.com\njsonin.com\njsososo.com\njspaint.com\njspang.com\njspatch.com\njspcgjg.com\njspcinc.com\njspdg.com\njspeople.com\njspesz.com\njsph.net\njsphjr.com\njsphp.net\njspoh.com\njspp.com\njspwc.com\njspxcms.com\njsq886.com\njsqcyjsq.com\njsqdsx.com\njsqiuying.com\njsqlawer.com\njsqstg.com\njsqt.com\njsr.cc\njsrail.com\njsrc.com\njsrcsc.com\njsrcu.com\njsrdgg.com\njsrdsw.com\njsrea.com\njsrenshi.com\njsrgjy.net\njsrhzh.com\njsright.com\njsrongjin.com\njsrpebh.com\njsrrcb.com\njsrsks.com\njsrsrc.com\njsruifeng.net\njsruiyin.com\njsrun.net\njsrun.pro\njsrxjt.com\njss52018.com\njssaikang.com\njssalt.com\njssbaoxian.com\njssbjt.com\njssc.cc\njssczxh.com\njssdezyy.com\njssdh.com\njssem.com\njssfgl.com\njssfx.com\njssfzg.com\njssgjjt.com\njssgjs.com\njsshasczzyy.com\njsshfcw.com\njsshhzx.com\njsshichuang.com\njsshow.net\njsshrzx.com\njsshuangxin.com\njsshuntai.com\njssia.org\njssihuan.com\njssjchyxh.com\njssjiu.com\njssjrfw.com\njssjxgyw.com\njssks.com\njssling.com\njssltz.com\njssnrcb.com\njssoar.com\njssqwx.com\njsssha.com\njsssrj.com\njsssy.com\njsstgs.com\njsstt.com\njsstyt.com\njssunhui.com\njssunlord.com\njssutong.com\njssuty.com\njssuwei.com\njsswordshop.com\njssyj.com\njssytc.com\njssyyy.net\njstcm.com\njstedu.com\njstex.com\njstextile.com\njstfdz.com\njsthinktank.com\njsthjsgc.com\njsti.com\njstianniao.com\njstide.com\njstigd.com\njstjjs.com\njstlcyy.com\njstlgn.com\njstljs.com\njstore.site\njstoys.net\njstsks.com\njstti.com\njstv.com\njstve.org\njstxb.com\njstxdm.com\njstxrcb.net\njstxry.com\njsty.com\njstyaz.com\njstygroup.com\njstyjzsg.com\njstywl.com\njstzhospital.com\njstzjy.net\njstzloveyuebao.com\njstzrcb.com\njstzzg.net\njsuc.com\njsuedc.net\njsuhuzhi.com\njsure.com\njsurehealth.com\njsw118.com\njsw988.com\njswater.net\njswb.com\njswcc.com\njswch.net\njswebcall.com\njsweiqi.com\njsweixiu.com\njswel.com\njswenguang.com\njswenjin.com\njswfgroup.com\njswjkj.net\njswmw.com\njswonderful.com\njswrhjkj.com\njswspocapi.com\njswsxx.com\njswtc.net\njswukong.com\njswuyang.com\njswwl.com\njswx-ej.com\njswxhy.com\njswxjx.com\njswxmax.com\njswyglw.com\njswyjt.com\njswyw.com\njswzjt.com\njsxbxcl.com\njsxcra.com\njsxcx.com\njsxdf.com\njsxdyh.com\njsxfedu.com\njsxggx.com\njsxgjt.com\njsxhljt.com\njsxhrcb.com\njsxht.com\njsxhw.org\njsxhy.net\njsxiangtanzi.com\njsxiaoguo.com\njsxiaoshi.com\njsxiechang.com\njsxihu.com\njsxinfeng.com\njsxinfly.com\njsxionghuojxzz.com\njsxlhb.com\njsxmw.com\njsxpbc.com\njsxq.com\njsxtsw.com\njsxxzh.com\njsxy.biz\njsxyfy.com\njsxyjt.com\njsxzgjzx.com\njsxzkingdee.com\njsxzty.com\njsy666.xyz\njsybjt.com\njsybjz.com\njsyc-marathon.com\njsycmc.com\njsycport.com\njsycsy.com\njsyczls.com\njsyd139.com\njsydns15.com\njsyefc.com\njsyes123.com\njsyf88.com\njsyfxcl.com\njsyghw.com\njsyhkf.com\njsyhxl.com\njsyinba.com\njsyixin.com\njsyjjt.com\njsyks.com\njsyks.net\njsyksw.com\njsyljz.com\njsymjt.com\njsyongbao.com\njsypj.com\njsypyg.com\njsysafe.com\njsysedu.com\njsysxx.net\njsyt.group\njsytsw.com\njsyun.cc\njsyunhao.com\njsywjt.com\njsyxep.com\njsyxh.org\njsyxrcb.com\njsyypump.com\njsyzht.com\njsz.asia\njsz120.com\njszbtb.com\njszca.com\njszcqy.com\njszdlssws.com\njszf.org\njszfy.com\njszg.org\njszhaobiao.com\njszhiping.com\njszhjsjtgs.com\njszhongci.com\njszhongte.com\njszjcg.com\njszjgg.net\njszjgroup.com\njszjrqrd.com\njszjscl.com\njszjsx.com\njszjw.com\njszjxh.com\njszjzf.com\njszkrz.com\njszks.com\njszlgjg.com\njszlyy.com\njszmgj.com\njszmly.com\njszn.ink\njsznstny.com\njszpw.net\njszs-group.com\njszs.com\njszsgroup.cc\njszwpx.com\njszxsw.com\njszygp.com\njszygs.com\njszyjsjt.com\njszyyguoji.com\njszzks.com\njszzxjhk.com\njt-ele.com\njt-it.com\njt000.com\njt111.com\njt120.com\njt26wzz.com\njt56w.com\njt62.com\njt91.com\njta-travel.org\njtamac.com\njtamc.com\njtbole.com\njtbtech.com\njtcjd.com\njtcopper.com\njtexpress.com\njtfcg.com\njtfengtou.com\njtfulfillment.com\njtg2g.com\njtggame.com\njtgloble.com\njtgzfw.com\njtj-kr.com\njtjiaoyu.com\njtjms-ae.com\njtjms-br.com\njtjms-eg.com\njtjms-mx.com\njtjms-sa.com\njtjob.net\njtjr99.com\njtjt.info\njtjyfw.net\njtkjbike.com\njtktkj.com\njtlculture.com\njtlfans.com\njtlw.com\njtlzj.net\njtlzx.com\njtm-food.com\njtm.pub\njtmedical.com\njtn.com\njtnlk.com\njtnsh.com\njto8.com\njtpipeline.com\njtrauto.com\njtrobots.com\njtso.net\njtsp98.com\njttv.net\njttzsy.com\njtv123.com\njtwmall.com\njtxa.net\njtxmtxy.com\njtxys8.com\njtyjy.com\njtystz.com\njtyxh.com\njtzjedu.com\njtzyjt.com\nju1212.com\nju33.com\nju51.com\nju53.com\nju8811.com\nju8856.com\njuaiyou.com\njuanbao.com\njuandou.com\njuangua.com\njuanyunkeji.com\njuaq.com\njubaihuijia.com\njubaiye.com\njubaozang.com\njuben108.com\njuben98.com\njuc365.com\njucaiw.com\njucanw.com\njucdn.net\njucelin.com\njucheng01.net\njuchengvi.com\njuchuangbio.com\njuchuangfushi.com\njucool.com\njucuiwangluo.com\njudajia.com\njudehahh.tech\njudns.com\njudong-1.com\njudouapp.com\njuduoping.com\njue.so\njuebankongjian.com\njuecan.com\njuedui100.com\njueduilingyu.com\njuefeng.com\njuehuo.com\njuejin.im\njuejinchain.com\njuejinqifu.com\njuemei.com\njuemuren4449.com\njueqijy.com\njuequling.com\njuerguea.com\njuewei.com\njuexiang.com\njuexiaotime.com\njuexinw.com\njueywo.com\njufa-composite.com\njufa.vip\njufaanli.com\njufair.com\njufeng313.com\njufengcap.com\njufengcompany.com\njufenginfo.com\njufengshang.com\njufengwuxi.com\njufoinfo.com\njugao.com\njugezi.com\njugongdan.com\njuguang.com\njuguifu.com\njuhaihui.com\njuhangye.com\njuhaokan.org\njuhaokanya.com\njuhaom.cc\njuhaom.com\njuhe.com\njuhe5.com\njuhebang.com\njuheweb.com\njuhomai.com\njuhome.net\njuhuasuan.com\njuhui581.com\njuhuicloud.com\njuhuisuan.com\njuhuiwan.com\njuhuiwan.net\njui.org\njuicefs.com\njuicycouture-diaperbags.org\njuij.fun\njuiju.com\njuj66.com\njuji123.com\njujianggcz.com\njujiangkk.com\njujiangktz.com\njujiaobaby.com\njujiaonet.com\njujias.com\njujie.com\njujienet.com\njujin8.com\njujinpcb.com\njujoy.com\njujumao.com\njukan.net\njuke200.com\njukebao.com\njukejia.com\njuketai.net\njukeyouxuan.com\njukuu.com\njulaibao.com\njulang88.com\njulanggroup.com\njulanhp.com\njulanling.com\njulebu.co\njulecn.com\njulefun.com\njuli-china.com\njuliandianqi.com\njuliang8.com\njuliangcili.com\njulianghttp.com\njuliangip.com\njuliangyinqing.com\njuliangyinqing.net\njulifenti.com\njuligroup.com\njulihuang.com\njulink.net\njulisjj.com\njulive.com\njuliym.com\njuliyuemeng.com\njulong.cc\njulongchina.com\njulonggr.com\njuluape.com\njulycn.com\njulydate.com\njulyedu.com\njulysong.com\njumanhua.com\njumanlou.com\njumbo-wpc.com\njumbot.net\njumei.com\njumeinet.com\njumengco.com\njumengren.com\njumengtbs.net\njumi-cdn.com\njumi.com\njumi18.com\njumin.cc\njuming-xz.com\njuming.com\njumingwang.com\njumo2.icu\njumold.com\njumore.com\njump-center.com\njump-game.com\njump301.com\njumpjumpcat.com\njumple.com\njumppo.com\njumpserver.org\njumpstar-tech.com\njumpvg.com\njumpw.com\njumpwgame.com\njumpwo.com\njumsz.com\njumwayholdings.com\njun-hai.com\njun.la\njun4.com\njunahotels.com\njunankeji.com\njunanres.com\njunanshengwu.com\njunao147.com\njunaotiyu.com\njunce.com\njuncyun.com\njundacheng.com\njundaobaoan.com\njundui.net\njundushan.com\njunengdingli.com\njuneyao.com\njuneyaoair.com\njuneyaoairlines.com\njunezx.com\njunfalipin.com\njunfull.com\njungewang.com\njunhaocn.com\njunhe.com\njunhegroup.com\njunhunxiaoshuo.com\njuniontech.com\njunjing.net\njunjingsuodao.com\njunjue888.com\njunka.com\njunkai.net\njunlanhotels-hp.com\njunlebaoruye.com\njunlee.net\njunli.net\njunlian.me\njunlinsz.com\njunlongtech.com\njunmoseo.com\njunnanhao.com\njunong360.com\njunpengtouzhi.xyz\njunph.com\njunpin.com\njunpin360.com\njunpinclub.com\njunpinghui.com\njunpinhui.com\njunpinmall.com\njunpinzhi.com\njunqing360.com\njunrunrenli.com\njunsaozg.com\njunshanggame.com\njunshencm.com\njunshi.com\njunshi881.com\njunshidao.com\njunshifuxin.com\njunshijia.com\njunshijidi.com\njunshipharma.com\njunshis.com\njunshishu.com\njunshitt.com\njunshizhanlue.com\njuntec.com\njuntu.com\njunwu262.com\njunxinmed.com\njunxunkji.com\njunyao.tech\njunyi-auto.com\njunyimeng.com\njunying.com\njunyisj.com\njunyouxuan.com\njunyudns.com\njunyuewl.com\njunyushop.com\njunzehb.com\njunzhenggroup.com\njunzhi.com\njunzhuan.com\njunziboxue.com\njunzimen.com\njunziqian.com\njunziyize.com\njuooo.com\njupiterlauncher.com\njupup.com\njuqi.com\njuqianwh.com\njuqibike.com\njuqingla.com\njuqk.net\njuquanquanapp.com\njurcc.net\njuren.com\njurenqi.com\njurongfangchan.com\njurongrencai.com\njurp.net\njusdasr.com\njuseey.com\njusen2008.com\njusha.com\njushe.org\njushen.co\njushequ.net\njushequan.com\njushewang.com\njushi.com\njushigj.com\njushihui.com\njushikk.com\njushiwangedu.com\njushri.com\njushtong.com\njushuitan-inc.com\njushuitan.com\njushuitan.net\njushuo.com\njusiot.com\njusoucn.com\njussevent.com\njusssports.com\njusssportsvenue.com\njusstickets.com\njussyun.com\njust-plain.fun\njust4coding.com\njust4fun.site\njust998.com\njustalkcloud.com\njustar-cn.com\njustbbs0.com\njustbilt.com\njustbon.com\njustep.com\njustering.com\njustinbot.com\njustjavac.com\njustlove.work\njustmyblog.net\njustnowmn.com\njustpodmedia.com\njustsy.com\njusttop.com\njustwe.site\njutao.com\njutean.com\njutengjiqi.com\njutingshop.com\njutone.com\njutongbao.online\njutubao.com\njutuike.com\njutuilian.com\njuuhe.com\njuvefans.com\njuwa.net\njuwan.com\njuwang.com\njuwangmedia.com\njuwanhezi.com\njuwanshe.com\njuweixin.com\njuxia.com\njuxian.com\njuxiang3d.com\njuxieyun.com\njuxiiangyou.com\njuxin.tv\njuxingj.com\njuxinguanjian.com\njuxinhuizhi.com\njuxuan.net\njuxuecms.com\njuxuewen.com\njuyang-chem.com\njuyanwenjuan.com\njuyebwg.com\njuyingele.com\njuyingonline.com\njuyisuliao.com\njuyoubao.com\njuyoukuaisong.net\njuyouqu.com\njuyoutang.com\njuyoutv.cc\njuyouxi.com\njuyouxuan.vip\njuyuan.com\njuyuewang.net\njuyun.tv\njuyutube.com\njuyuweb.net\njuzhen.com\njuzhen.io\njuzhentech.com\njuzhenyun.org\njuzhi720.com\njuzhiliang.com\njuzhiyuan.com\njuzhongjoy.com\njuzicon.com\njuzicy.com\njuzifenqi.com\njuzijiudian.com\njuzikong.com\njuzilicai.com\njuzimi.cc\njuzioo.com\njuziseo.com\njuziss.com\njuzistore.com\njuzisy.com\njuziwulian.com\njuzix.io\njuzizhoutou.net\njuzone.cc\njuzui.com\njuzzi-ec.com\njv07.com\njvbhotel.com\njvcxp.com\njvdebao.com\njvgnwn.sbs\njvmai.com\njvniubi.com\njvpin.vip\njvrong.com\njvshangwang.com\njvshi.net\njvtianshanuu.com\njvyou.net\njw100.net\njw1588.com\njwappgc.com\njwautoparts.com\njwbf.online\njwbl.com\njwdili.com\njwedit.net\njwetech.com\njwfun.com\njwgb.net\njwgf.com\njwick-switch.com\njwipc.com\njwkj.site\njwl100.com\njwsaas.com\njwsem.com\njwshy.com\njwsm123.com\njwtherapeutics.com\njwview.com\njwwey.com\njwygou.com\njwyun.net\njwzhn.com\njwzykg.com\njx-189.com\njx-amc.com\njx-bank.com\njx09.com\njx116114.com\njx139.com\njx163-cname.com\njx163.com\njx188.com\njx3box.com\njx3mogu.com\njx3pve.com\njx3yymj.com\njx4.com\njx530.com\njx8.net\njx878.com\njxage.com\njxairport.com\njxausoft.com\njxawe.org\njxbhwl.com\njxbinhong.com\njxbond.com\njxbscbd.com\njxc4.com\njxcar.com\njxcat.com\njxcb.net\njxcc.com\njxccb.com\njxcdkjfz.com\njxcfs.com\njxchaguan.com\njxckd.shop\njxcsedu.com\njxct.work\njxcua.com\njxdcnc.com\njxdcost.com\njxdcw.com\njxdhhbhg.com\njxdiguo.com\njxdinfo.com\njxdlzy.com\njxdouliang.com\njxdown.com\njxdx.com\njxdxxt.com\njxdyf.com\njxdyk65ay.com\njxdyyy.com\njxdzx.com\njxeca.com\njxedgroup.com\njxedt.com\njxedu.net\njxeduyun.com\njxenglish.com\njxep.net\njxetv.com\njxexpressway.com\njxey.com\njxfeng.com\njxfhomes.org\njxfls.com\njxfrjs.com\njxfxky.com\njxg1.com\njxg866.com\njxga.com\njxgazx.com\njxgcxy.net\njxgdhb.com\njxgdw.com\njxgis.com\njxgs.cc\njxgtzxc.com\njxgwy.org\njxgztv.com\njxh2000.net\njxheming.com\njxhesyy.com\njxhjxy.com\njxhmjx.com\njxhmxxjs.com\njxhswhcb.com\njxhuahang.com\njxhxmed.com\njxhyxx.com\njxiaolan.com\njxic.com\njximage.com\njxjatv.com\njxjdgy.com\njxjee.com\njxjia.net\njxjianwei.com\njxjktzjt.com\njxjmzc.com\njxjob.net\njxjrw.com\njxjt666.com\njxjuwentech.com\njxjx6.com\njxjywater.com\njxkeda.com\njxkjzb.com\njxkp.com\njxksw.net\njxlgjd.com\njxln.com\njxlong.com\njxlpjt.com\njxlsxy.com\njxlvs.com\njxlwgame.com\njxlygo.com\njxmhp.com\njxmj.com\njxmlkd.com\njxmrfire.com\njxmy18.com\njxncyy.com\njxndxuebao.com\njxnjy.com\njxnongjiayuan.com\njxnxs.com\njxnyc.net\njxpdf.com\njxphone.com\njxpp.com\njxpta.com\njxqcw.com\njxqy.city\njxqyfw.com\njxrays.com\njxrcgame.com\njxrcw.cc\njxrcw.com\njxrczp.com\njxrjxh.com\njxrmtzx.com\njxropan.com\njxrqgs.com\njxrqhy.com\njxrsrc.com\njxrtv.com\njxrtvu.com\njxsdfz.com\njxsedu.com\njxsenyang.com\njxsfjzsh.com\njxsg.com\njxshangyou.com\njxshyzhx.com\njxsilkpark.com\njxsj-vtech.com\njxsjgjt.com\njxsjxh.com\njxsjypt.com\njxslsyy.com\njxsltz.com\njxslyw.com\njxsrfdc.com\njxsrjt.com\njxsrra.com\njxssjx.com\njxssjy.com\njxstm.com\njxsuji.com\njxswjt.com\njxswskj.com\njxswzjx.com\njxsxdz.com\njxszxyjhyy.com\njxszyy.com\njxt1314.com\njxt189.com\njxtcxh.com\njxteacher.com\njxtech.net\njxthz.net\njxtransfer.com\njxtutechan.com\njxtvbbs.com\njxtvshop.com\njxtwkj.com\njxtxzzw.com\njxtyzx.org\njxtzw.com\njxunicom.com\njxveg.org\njxw12328.com\njxwan.com\njxwmanage.com\njxwmsj.com\njxwxai.com\njxwz.net\njxx7.com\njxxdf.com\njxxdxy.com\njxxhdn.com\njxxhsd.com\njxxinzhe.com\njxxnyqc.com\njxxs.net\njxycqy.com\njxyczs.com\njxydt.com\njxygroup.com\njxyhys.com\njxyige.com\njxyjxy.com\njxyqw.com\njxysedu.com\njxytech.com\njxyuging.com\njxyushan.com\njxyy.net\njxzbx.com\njxzeto.com\njxzikao.net\njxzl.cc\njxzxtec.com\njxzyx.com\njy-leasing.com\njy-mach.com\njy-sz.net\njy.cc\njy0604.com\njy0832.com\njy135.com\njy163.net\njy1991.com\njy391.com\njy510.com\njy6d.com\njyacg.com\njyacht.com\njyaochi.com\njyarton.com\njybase.net\njyblife.com\njyboo.com\njycbank.com\njycinema.com\njycloudgslb.com\njycloudgslb.net\njydc.com\njydj.net\njydoc.com\njydonghu.com\njydtu.com\njyebank.com\njyebfz.com\njyecc.com\njyeoo.com\njyeoo.net\njyfcyy.com\njyfprinting.com\njyfund.com\njyfwyun.com\njyg-lighting.com\njygch.com\njygjsq.com\njyglass.net\njygo.cc\njygpu.com\njygsdyrmyy.com\njyguagua.com\njygyl.com\njygz.com\njygz.org\njyh.com\njyhcd.com\njyhmz.com\njyhome.com\njyhwcl.com\njyhyfintax.com\njyhzsc.com\njyimg.com\njyinns.com\njyip.net\njyjhkj.com\njyjjc.com\njyjk.com\njyjxtech.com\njykm88.com\njykss.com\njykuaidi.com\njyl88.com\njylight.cc\njylink.com\njyltx.com\njylw.com\njylxbc.com\njymhb.com\njymredu.com\njynews.net\njynongye.com\njynyrc.com\njyoptical.com\njypc.org\njypecdn3.com\njypipes.com\njypmm.com\njyqcw.com\njyqingfeng.com\njyqxz2015.com\njyrcjl.com\njyrcw.com\njyrczp.com\njyrlzy.com\njyrmtzx.com\njyrmyy.com\njyrq.net\njyry.com\njys0755.com\njys6z.com\njysbcj.com\njysd.com\njysedu.com\njyseeds.com\njyshare.com\njyshoubao.com\njysld.com\njysmtech.com\njysper.net\njysq.net\njyss.com\njyss.net\njysteels.com\njysu.com\njysyyey.com\njysyzk.com\njysyzx.net\njytaier.com\njytcdq.com\njytek.com\njytjsgyp.com\njytmachinery.com\njytrump.com\njytwp.com\njyubbs.com\njywanrun.com\njywfgg.com\njywlcm.com\njywmgs.com\njywxq.com\njyxdyzx.com\njyykyy.com\njyyun.com\njyzb01.com\njyzc.com\njyzhongg.com\njyzz666.com\njyzzdq.com\njyzzx.com\njz-hy.com\njz-ins.com\njz-job.com\njz-marathon.com\njz0045.com\njz08.com\njz100.com\njz177.com\njz182.com\njz26666.com\njz36666.com\njz5u.com\njz6.com\njz60.com\njz6868.com\njz68888.com\njzac.org\njzagile.com\njzb.com\njzbar.net\njzbull.com\njzcbank.com\njzchou.com\njzcmfw.com\njzctmy.com\njzcxptm.com\njzda001.com\njzdd.com\njzdlgroup.com\njzdwh.com\njzedu24.com\njzerp.com\njzfz.net\njzg12315.com\njzgc-school.com\njzgchy.com\njzgcjsysjzz.com\njzgczz.com\njzgede.com\njzggzy.com\njzgjbus.com\njzgjj.com\njzhfz.com\njzhkr.com\njzhlgg.com\njzhospital.com\njzhuishou.com\njzhx.net\njzhy5.com\njzj2009.com\njzj9999.com\njzjgift.com\njzjt.com\njzking.com\njzkjjt.com\njzlt100.com\njzmbti.com\njzmjtjn.xyz\njzmlzy.com\njzmob.com\njzmsmj.com\njzmt.net\njznygf.com\njznyjt.com\njzongguan.com\njzpat.com\njzptt.com\njzpu.com\njzpx.net\njzq9pzcz8b.world\njzqe.com\njzqlyptall.com\njzrb.com\njzrc.net\njzrsks.com\njzsbs.com\njzsbxxh.com\njzsc.net\njzsc8.com\njzsec.com\njzsf.com\njzsgzmhjyxgs.com\njzsjyksy.com\njzsos.com\njzsousuo.com\njzsszyjzx.com\njzsxinyudianqi.com\njzsyy.com\njzszdq.com\njzszzx.com\njztey.com\njztsjx.com\njztvnews.com\njztvxmt.com\njztweb.com\njzty.com\njztylxx.com\njztzw.net\njzwcom.com\njzwl66.com\njzwxfrp.com\njzx.com\njzxian.com\njzxjcf.com\njzxs.com\njzygczx.com\njzyqyb.com\njzyqzypg.com\njzyx.com\njzzfyw.com\njzzhw.com\njzzls.com\njzzx.com\njzzypt.com\nk-boxing.com\nk-dyn.com\nk-kbox.com\nk-res.net\nk.biz\nk0898.com\nk0rz3n.com\nk12.vip\nk12china.com\nk12kc.com\nk12zx.com\nk165.com\nk166.org\nk1815.com\nk1u.com\nk1wave.com\nk22.xyz\nk2os.com\nk3072.com\nk365.asia\nk366.com\nk369.com\nk382.com\nk3cdn.com\nk3yes.com\nk43439.com\nk518.com\nk5hp4qte.work\nk5n.com\nk6uk.com\nk73.com\nk780.com\nk8.com\nk8008.com\nk8k8k8.com\nk8ser.com\nk8smeetup.com\nk8stech.net\nk913.com\nk99.cc\nka20.com\nka5188.com\nkaaass.net\nkaadas.com\nkaaer.org\nkaayou.com\nkaayou.net\nkaayun.com\nkaba365.com\nkabapay.com\nkabasiji.com\nkaboy.net\nkabu1.com\nkaceie.com\nkachecn.com\nkacheren.com\nkacper.fun\nkada.com\nkada163.com\nkadang.com\nkaduoduohk.com\nkaeryun.com\nkafangtech.com\nkafeng.com\nkagirl.net\nkah8.com\nkahaozhushou.com\nkahha.com\nkahuodong.com\nkai-lun.net\nkai-ying.com\nkaiba315.com\nkaibanglaw.com\nkaiboer.com\nkaichejiqiao.com\nkaichengschool.com\nkaicn.com\nkaidanbao.com\nkaidany.com\nkaidapack.com\nkaidechem.com\nkaidianbang.com\nkaidicloud.com\nkaidydrilling.com\nkaierda.com\nkaifabang.com\nkaifae.com\nkaifage.com\nkaifakuai.com\nkaifama.com\nkaifamei.com\nkaifangkecheng.com\nkaifapiao.com\nkaifaxhl.com\nkaifaxueyuan.com\nkaifayun.com\nkaifu.com\nkaifu1.com\nkaifubiao.com\nkaifubiao123.com\nkaigao.com\nkaige68.com\nkaigongyi.com\nkaiguo.com\nkaihei.co\nkaihong.com\nkaihu51.com\nkaihuaeva.com\nkaihuia.com\nkaijia-smt.com\nkaijia.com\nkaijiage.com\nkaijiejinrong.com\nkaijieunion.com\nkaijiudian.net\nkaikeba.com\nkailang17.com\nkaili-group.com\nkailinchem.com\nkailing.pub\nkailinjt.com\nkailitech.com\nkaimanhua.com\nkaimen360.com\nkaimenhong.org\nkaimg.com\nkaimitech.com\nkaipai.com\nkaipanhong.com\nkaipanla.com\nkaipuyun.com\nkaipuyun.net\nkaiqiancq.com\nkaiqiu.cc\nkaiqsz.com\nkaiquan.com\nkairui.tech\nkairunjinshu.com\nkaisacst.com\nkaisagroup.com\nkaisahotel.com\nkaisalong.com\nkaisamicf.org\nkaishan-pv.com\nkaishancomp.com\nkaishangroup.com\nkaishigo.com\nkaishikan.com\nkaishuhezi.com\nkaishujia.com\nkaishustory.com\nkaitai668.com\nkaitaibh.com\nkaitaishotblasting.com\nkaitaku.xyz\nkaiteer17.com\nkaitianad.com\nkaitiancloud.com\nkaiting.cc\nkaiwenda.com\nkaiweneducation.com\nkaiwind.com\nkaixia.com\nkaixin.com\nkaixin00.com\nkaixin001.com\nkaixin100.com\nkaixinbao.com\nkaixindou.net\nkaixinguopiao.com\nkaixinguopiaowu.net\nkaixinhui.com\nkaixinhui.net\nkaixinit.com\nkaixinjiehun.com\nkaixinlu.com\nkaixinvv9.com\nkaixinzuqin.com\nkaixue.io\nkaiyanapp.com\nkaiygame.com\nkaiyi.cool\nkaiyihome.com\nkaiyinedu.com\nkaiyuan.me\nkaiyuanbusiness.com\nkaiyuancn.com\nkaiyuangroup.cc\nkaiyuanhospital.com\nkaiyuanhotels.com\nkaiyuanweilaikeji.com\nkaiyuedoors.com\nkaiyueyun.com\nkaiyun.com\nkaiyun.net\nkaiyun360.com\nkaiyuncare.com\nkaiyunwu.net\nkaizhan.com\nkajicam.com\nkajishou.com\nkaka.com\nkaka996.com\nkakacl.net\nkakadown.com\nkakalili.com\nkakamobi.com\nkakappt.com\nkakashuzi.net\nkakatx.com\nkakayigui.com\nkakayuy.net\nkaken-china.com\nkaku-scdn.com\nkaku.tv\nkakucloud.com\nkalading.com\nkalamitsibeach.com\nkalazan.com\nkalcaddle.com\nkaleesh.com\nkalefans.com\nkalegou.com\nkalifang.com\nkaliorg.com\nkalugaqueen.com\nkaluli.com\nkamaqc.com\nkameng98.com\nkamenwang.com\nkamfat.net\nkami.vip\nkami5.com\nkamidox.com\nkamisamak.com\nkamitemall.com\nkammtown.com\nkamoasia.com\nkamopos.com\nkamtao.com\nkamwu.com\nkan.cc\nkan0512.com\nkan3721.com\nkanbaobei.com\nkanbing.net\nkancaibao.com\nkanchao.com\nkanchuan.com\nkandao.com\nkandaoni.com\nkandedongguan.com\nkandegang.net\nkandehotelhuizhou.com\nkandian.com\nkandian.net\nkandian.tv\nkandian5.com\nkandianbao.com\nkandianshi.com\nkandianzixun.com\nkandzww.com\nkanfangjilu.com\nkanfeidie.com\nkang-li.com\nkang-zhuo.com\nkang7.com\nkangai8.com\nkangame.tv\nkangantu.com\nkangbaifoundation.com\nkangbatv.com\nkangbeijia.com\nkangbidz.com\nkangbixing.com\nkangchun.com\nkangdacolorful.com\nkangdaep.com\nkangdajiuzhou.com\nkangdalawyers.com\nkangdamed.net\nkangdexin.com\nkangdns.com\nkangehao.com\nkangepian.com\nkangerfugroup.com\nkangfenhui.com\nkangfenmao.com\nkanggui.com\nkanghe.com\nkanghu.net\nkanghuash.com\nkanghuayun.com\nkanghui.com\nkanghuicy.com\nkanghuwang.com\nkangjiachildcare.com\nkangjian.com\nkangjian888.com\nkangjiezx.net\nkangkang.com\nkanglaohui.com\nkangle.net\nkanglepharm.com\nkanglisha.com\nkangliyaoye.com\nkangnai.com\nkangpeining.com\nkangpugroup.com\nkangq.com\nkangqiao-sh.com\nkangre.com\nkangrunpharm.com\nkangshuai.biz\nkangsibeauty.com\nkangtaiwang.com\nkangting.com\nkangtor.com\nkangufen.com\nkanguo.com\nkanguowai.com\nkangxi55wlsf.com\nkangxiang.com\nkangxidi.com\nkangxin.com\nkangyang51.com\nkangyiqiye.com\nkangyuntang.com\nkangze.com\nkangzhi.com\nkangzhimei.net\nkangzhiqiao.com\nkanimg.com\nkaniuquan.com\nkanixiaoxia.com\nkanjia.com\nkanjian.com\nkanjianxinli.com\nkankan.com\nkankan.run\nkankan365.cc\nkankancity.com\nkankanews.com\nkankanlive.com\nkankanmi.com\nkankannews.com\nkankanpiao.com\nkankantu.com\nkankanyn.com\nkankanyulewang.com\nkankanzhijian.com\nkanketv.com\nkankezw.com\nkankun-smartplug.com\nkanman.com\nkanniao.com\nkanong.com\nkanongyun.com\nkanqibao.com\nkanqiye.com\nkanqq.com\nkanqu.com\nkanrang.com\nkanrang.net\nkansdk.com\nkansea.com\nkanshangjie.com\nkanshijie.cc\nkanshu.com\nkanshu5.net\nkanshu58.cc\nkanshuge.com\nkanshuhai.com\nkanshushi.com\nkansp.com\nkantao.net\nkantianqi.net\nkantop.net\nkantsuu.com\nkantu.com\nkanwuye.com\nkanwz.net\nkanxue.com\nkanyaji.com\nkanyijie.com\nkanyixue.com\nkanyouxi.com\nkanyouxi.tv\nkanyun.com\nkanzhekou.com\nkanzhun.com\nkanzuixian.com\nkao100.com\nkao750.com\nkao8.cc\nkao910.com\nkaoaa.com\nkaobeitu.com\nkaochong.com\nkaochongqing.com\nkaodaojy.com\nkaodongli.com\nkaoersi.com\nkaogua.com\nkaoguobao.com\nkaojiaoshi.com\nkaojionline.com\nkaojuan.com\nkaola.com\nkaola.com.hk\nkaola100.com\nkaolacam.net\nkaolacdn.com\nkaolafm.com\nkaolafm.net\nkaolawenku.com\nkaom.net\nkaomeiyuan.com\nkaonaw.com\nkaonenyi.com\nkaonun.com\nkaopenhs.com\nkaopu001.com\nkaopubao.com\nkaopujinfu.com\nkaopuyun.com\nkaopuyun.net\nkaoqin.com\nkaoqintong.net\nkaoqinyi.com\nkaoruo.com\nkaoshenzazhi.com\nkaoshi110.com\nkaoshi365.com\nkaoshi86.com\nkaoshibao.com\nkaoshibb.com\nkaoshidian.com\nkaoshixing.com\nkaoshizixun.com\nkaosite.com\nkaostedu.com\nkaotipai.com\nkaowana.com\nkaowang.com\nkaowx.com\nkaoyan.com\nkaoyan.org\nkaoyan1v1.com\nkaoyanbox.net\nkaoyancas.com\nkaoyancas.net\nkaoyango.com\nkaoyanjun.com\nkaoyanking.com\nkaoyanmiji.com\nkaoyansiji.com\nkaoyanwin.com\nkaoyaya.com\nkaozc.com\nkaozh.com\nkaozhiye.com\nkap666.com\nkapokshenzhen.com\nkaquanbao.com\nkaratetrend.com\nkargocard.com\nkarl-led.com\nkarlzhou.com\nkarrytech.com\nkartlover.com\nkascend.com\nkashangwl.com\nkashen.com\nkashen8.com\nkashengauto.com\nkasitesoft.com\nkaslyju.com\nkasscloud.com\nkataliya.net\nkate-kanebo.net\nkatongji.com\nkatvr.com\nkatyusha.net\nkava-auto.com\nkavaparts.com\nkaven.xyz\nkavience.com\nkawahdinosaur.com\nkawasakijp.com\nkawata-group.com\nkawoka.com\nkayajiuhui.com\nkayhanfamily.com\nkayipgroup.com\nkayougame.com\nkaytrip.com\nkaytune.com\nkazakcnr.com\nkazhifu.com\nkazithai.com\nkazl.com\nkb.com\nkb54.com\nkb9.com\nkbans.com\nkbao123.com\nkbcdn.com\nkbcmw.com\nkbcool.com\nkbdfans.com\nkbgogo.com\nkbgok.com\nkbiquge8.com\nkbjcn.com\nkbkyy.com\nkblcdn.com\nkblin.com\nkbmlifesci.com\nkbn-zhejiang.com\nkbnhp.com\nkbnqy.com\nkbobo.com\nkboth.com\nkbrightlaw.com\nkbscd.net\nkbscloud.com\nkbsml.com\nkbspheres.com\nkbtingdu.com\nkbyun.com\nkc-keycool.com\nkc0011.net\nkc87.com\nkcbebank.com\nkccidc.com\nkccn.net\nkcdn0.com\nkcdnvip.com\nkcfei.com\nkchance.com\nkchezhan.com\nkchile.com\nkchuhai.com\nkci-gz.com\nkciptv.com\nkcjpharma.com\nkcjyyjzzs.com\nkcloudidc.com\nkcm120.com\nkcmice.com\nkcouxp.com\nkcqcjt.com\nkcrcb.com\nkcrea.cc\nkctgov.com\nkctzgroup.com\nkcwiki.org\nkcyuri.com\nkczhaosheng.com\nkd010.com\nkd100.com\nkd120.com\nkd128.com\nkd315.com\nkd58.com\nkd9000.com\nkdadj.com\nkdaec.com\nkdatacenter.com\nkdatu.com\nkdcloud.com\nkdclub.net\nkdcnu.com\nkdefu.com\nkdf.ink\nkdgcsoft.com\nkdhj-edu.net\nkdige.com\nkdkefu.com\nkdkh.com\nkdlgs.com\nkdnet.net\nkdniao.com\nkdpt.net\nkdr163.com\nkdrmd.com\nkdroid.club\nkds100.com\nkdslife.com\nkdt.im\nkdued.com\nkdweibo.com\nkdzs.com\nkdzwy.com\nkdzxedu.com\nke-chuang.com\nke.com\nke51.com\nke6.com\nke82.com\nke86.com\nke8u.com\nkeai.icu\nkeaidian.com\nkeaiq.com\nkean1688.com\nkeanrui.com\nkeaopt.com\nkeba.host\nkebango.com\nkeberosteri.com\nkebi.biz\nkebide.com\nkebingzao.com\nkeboyunxiao.com\nkebvalves.com\nkeceyun.com\nkechengbiao.net\nkechengkeli.com\nkechuang.org\nkechuangai.com\nkechuangfu.com\nkeda-digital.com\nkeda-group.com\nkeda-u.com\nkeda.com\nkeda.fun\nkedabai.com\nkedacom.com\nkedaifu.com\nkedang.net\nkedanm.com\nkedaotech.com\nkede-auto.com\nkede.com\nkedefamen.com\nkedi.cc\nkedian-tech.com\nkedianduo.com\nkedidairy.com\nkedingyun.com\nkedou.com\nkeduxinxi.com\nkedwyz.com\nkeede.com\nkeejuu.com\nkeen-dental.com\nkeenbow.com\nkeenonrobot.com\nkeensky.com\nkeep.com\nkeep999.com\nkeepc.com\nkeepcdn.com\nkeepchen.com\nkeeper.work\nkeepfightinghxz.xyz\nkeepke.com\nkeepmobi.com\nkeepnight.com\nkeepsoft.net\nkeepyoga.com\nkeerdapower.com\nkeerqinmuseum.com\nkeerworld.com\nkeetalks.com\nkeewin.com\nkeey.sh\nkefeijn.com\nkefenxi.com\nkefoo.com\nkefu01.com\nkefutoutiao.com\nkefuzu.com\nkege.com\nkehaohao.com\nkehou.com\nkehu51.com\nkehuaapp.com\nkehuan-upward.com\nkehuda.com\nkehuduan.com\nkehuzhichi.com\nkehuzhichi.net\nkeil345.com\nkeinsci.com\nkeithbo.com\nkejet.com\nkejet.net\nkeji100.net\nkejian.design\nkejianx.com\nkejibear.net\nkejicut.com\nkejihai.com\nkejik.com\nkejilie.com\nkejimeixue.com\nkejingyuan.com\nkejinlianmeng.com\nkejinshou.com\nkejiqi.com\nkejishou.net\nkejitai.com\nkejitechangsheng.com\nkejitian.com\nkejiwang.cc\nkejiweixun.com\nkejudati.com\nkekaku.com\nkekaoxing.com\nkekaoyun.com\nkeke.moe\nkeke289.com\nkekebaby.com\nkekedj.com\nkekegold.com\nkekenet.com\nkekeniu.com\nkekeshici.com\nkekeyuyin.com\nkekkyy.com\nkekoku.com\nkeky.org\nkeladuoww.com\nkeladuoyy.com\nkelaisz.com\nkelanjt.com\nkelankqs.com\nkeldamedical.com\nkele8.com\nkelehuyu.com\nkeleqiu.com\nkelete.com\nkeliangtek.com\nkelibiao.com\nkelikt.com\nkelimotor.com\nkelinpower.com\nkelinsoft.com\nkelon.com\nkelong-chemical.com\nkelong-powder.com\nkelongding.com\nkeloop.com\nkelorlink.com\nkelphome.com\nkelu.org\nkelun.com\nkeluokelie.com\nkeluyjs.com\nkema66.com\nkemaicrm.com\nkeman.com\nkemavip.com\nkeme.work\nkemiaotai.com\nkemicro.com\nkemike888.com\nkemov.com\nken-tools.com\nken.io\nkename.com\nkenaqz.com\nkenbotong.com\nkendingde.com\nkendryte.com\nkeneng.org\nkenflo.com\nkenfor.com\nkenfor.net\nkengatoki.com\nkengdie.com\nkengic.com\nkengwan.com\nkenistab.com\nkeniu.com\nkeniub.com\nkeniuxy.com\nkenjieer.com\nkenkapacking.com\nkenpai.com\nkenpains.com\nkenshu.cc\nkenshuhu.com\nkensuntec.com\nkentier.com\nkentxxq.com\nkenuonet.com\nkenweini.com\nkenxon.com\nkenzochina.com\nkeoaeic.org\nkeovo.net\nkepusky.com\nkeputech.com\nkeqiaojob.com\nkeqii.com\nkequcps.com\nker58.com\nkercan.net\nkercoras.com\nkerisom.com\nkerlala.com\nkernel-sh.com\nkernel.cc\nkernelfood.com\nkernelmed.com\nkernelnote.com\nkerneltravel.net\nkerntech-asp.com\nkerric-china.com\nkerryparkside.com\nkeruibell.com\nkeruigroup.com\nkeruiiai.com\nkeruilai.com\nkeruilait.com\nkeruisifan.com\nkeruknowledge.com\nkerun2010.com\nkerundegroup.net\nkerust.com\nkeruyun.com\nkeruyun.net\nkery-pharm.com\nkerysoft.com\nkesci.com\nkesheng.com\nkeshenwei.com\nkeshizhongguo.com\nkesion.com\nkesiyunlai.com\nkesonco.com\nkesong.co\nkesong520.com\nkesonic.com\nketangpai.com\nketechdigital.com\nketianguanye.com\nketingkeji.com\nketingzhuangxiu.com\nketofbx.net\nkevinems.com\nkevinjiang.info\nkevinlq.com\nkevke.com\nkewu.cc\nkewucool.com\nkexgfv.com\nkexianggroup.com\nkexin001.com\nkexinbiotech.com\nkexincpa.com\nkexing100.com\nkexingchem.com\nkexinggy.com\nkexinhaoma.org\nkexinshe.com\nkexinyun.org\nkexu.com\nkexue.com\nkexue.fm\nkexuezixunzzs.com\nkexuna.com\nkey-iot.com\nkeyboardancer.com\nkeyboardingonline.net\nkeycom-ip.com\nkeydak.com\nkeydatas.com\nkeyde.com\nkeyfc.net\nkeygotech.com\nkeyi.mobi\nkeyibao.com\nkeyigroup.com\nkeyingchem.com\nkeyipump.com\nkeylol.com\nkeymantek.com\nkeymedbio.com\nkeymoe.com\nkeyoo.com\nkeyoou.com\nkeyray-hk.com\nkeyshot.cc\nkeytherapharma.com\nkeyto168.com\nkeytoix.vip\nkeyu66.com\nkeyuanpharma.com\nkeyubio.com\nkeyuejiazheng.com\nkeyueng.com\nkeyunchaxun.com\nkeyunidc.com\nkeyunlaser.com\nkeyunsoft.com\nkeyyaam.com\nkezehb.com\nkezhaozhao.com\nkezhi.tech\nkf.ai\nkf155yy.com\nkf3msfm.com\nkf5.com\nkf911.com\nkf9977.com\nkfadx.tech\nkfand.com\nkfang.xin\nkfb126.com\nkfb163.com\nkfcbest.com\nkfcdn.com\nkfchiheng.com\nkfcjrl.com\nkfd3sm2c.com\nkfdcc.com\nkffone.com\nkfganquan.com\nkfhome.com\nkfhty.com\nkfj.cc\nkfjd.com\nkfjyd.com\nkfjyjt.com\nkflhgs.com\nkfmanager.com\nkfqizhongji.com\nkfsddj.com\nkfskxy.com\nkfvcca.com\nkfw001.com\nkfzdh.com\nkfzhinan.com\nkfzimg.com\nkfzls.com\nkg-power.com\nkg.com\nkghbcn.com\nkgimg.com\nkgipr.com\nkgithub.com\nkgnmkj.com\nkgogame.com\nkguaq.com\nkgzyy.com\nkh-zx.com\nkh84.com\nkhdatasolutions.com\nkhdyly.com\nkhfwedu.com\nkhhospital.com\nkhidi.com\nkhlgamen.com\nkhly.com\nkhlysc.com\nkhmhvlw.com\nkhnhw.com\nkhotyn.com\nkhqihuo.com\nkhruiming.com\nkhs1994.com\nkhworidtour.com\nkhysct.com\nki-pa.com\nkiaic.com\nkiana.love\nkiapmyf.xyz\nkibinggroup.com\nkickoffo.site\nkicontech.com\nkid17.com\nkidikidi.net\nkidsccshow.com\nkidscoding8.com\nkidsdown.com\nkidseq.net\nkidsflab.org\nkidsfoto.net\nkidspsy.com\nkidsthomas.com\nkidsyun.com\nkidulte.com\nkidulty.com\nkiees.com\nkiiik.com\nkiijoy.com\nkiinii.com\nkiiyi.com\nkijifept.com\nkikiwon.com\nkikoplay.fun\nkikusuitape.com\nkikuu.com\nkilamanbo.com\nkililife.com\nkilldb.com\nkillerheelsphotography.org\nkilo1kw.com\nkiloai.com\nkimberley-technology.com\nkimderlite.com\nkimi.ai\nkimi.com\nkimi.link\nkimi.pub\nkimiss.com\nkimiss.net\nkimiter.com\nkimleo.net\nkimqi.net\nkimsom.com\nkimxz.com\nkina.cc\nkinbull.com\nkindechem.com\nkindlelib.com\nkindobest.com\nkindredous.com\nkindsoft.net\nking-capital.com\nking-rain.com\nking-strong.com\nkingandkey.com\nkingandwood.com\nkingarad.com\nkingbank.com\nkingboritape.com\nkingborn.org\nkingbos.com\nkingbrother.com\nkingcheergame.com\nkingcloud.com\nkingcloudad.com\nkingclouddns.com\nkingcms.com\nkingdaychina.com\nkingdee-soft.com\nkingdee.com\nkingdee.com.tw\nkingdee.org\nkingdeemall.com\nkingdeestar.com\nkingdeeyun.com\nkingdelgc.com\nkingdom-ceramic.com\nkingdomfishing.com\nkingdomsolar.net\nkingdraw.com\nkingdun.net\nkingexplorer.com\nkingfu-china.com\nkingfulai.com\nkinggoo.com\nkinggrid.com\nkinghomechina.com\nkingidc.net\nkinginfo.com\nkingjee-tech.com\nkingjee.com\nkingjin-sh.com\nkingkaid.com\nkingland119.com\nkingleen.net\nkingliton.com\nkinglory.com\nkinglymotor.com\nkinglyuan.com\nkingmagic.co\nkingmagnet.com\nkingmb.com\nkingmylab.com\nkingnare.com\nkingnet.com\nkingnetdc.com\nkingnettech.com\nkingoit.com\nkingosoft.com\nkingpower-cn.com\nkingrack.com\nkingray-tech.com\nkingreader.com\nkingrein.com\nkingroot.net\nkings3d.com\nkingsemi.com\nkingsh.store\nkingshan2002.com\nkingsley-cq.com\nkingslicer.com\nkingsmen-gc.com\nkingsoft-office-service.com\nkingsoft.com\nkingsoft.net\nkingsoftstore.com\nkingsrich.com\nkingst.org\nkingstarmedical.com\nkingstartech.com\nkingston.group\nkingstronbio.com\nkingsunedu.com\nkingsungmedical.com\nkingsunpower.com\nkingsunsoft.com\nkingtaifook.com\nkingtroldata.com\nkingtysin.com\nkingview.com\nkingwisoft.com\nkingyield.com\nkingyon.com\nkingyork.com\nkingzom.com\nkinhom.com\nkinhoo.com\nkinlong.com\nkinpan.com\nkinpn.com\nkinpoway.com\nkinqee.com\nkinsec.com\nkinte-ind.com\nkintiger.com\nkintn.com\nkintowe.com\nkinval.com\nkinwong.com\nkinzhan.com\nkinzoncap.com\nkiomodesign.com\nkira.cool\nkirakuapp.com\nkirgen.com\nkiriko-china.com\nkirin-tech.com\nkirincloud.net\nkirinmach.com\nkirinvm.com\nkirkcloud.com\nkiscoca.com\nkisdee.com\nkisence.com\nkisilicon.com\nkisops.com\nkiss998.com\nkisskisso.com\nkissyj.com\nkissyui.com\nkiswo.com\nkit-lee.me\nkitic.net\nkitiu.com\nkitking.com\nkitontech.com\nkitstown.com\nkitty.su\nkituin.fun\nkiun24ok.com\nkivend.net\nkivo.fun\nkivo.wiki\nkiwa-tech.com\nkiwenlau.com\nkiwifarms.net\nkiwifarms.st\nkiwimoore.com\nkiwisec.com\nkiyuu.club\nkj-ic.com\nkj-pcb.com\nkj021.com\nkj1d.com\nkj2100.com\nkj3.com\nkj400.com\nkj521.com\nkjb2c.com\nkjcdn.com\nkjcenter.com\nkjchina.com\nkjchuang.com\nkjcity.com\nkjcmxx.com\nkjcxpp.com\nkjcyfz.com\nkjdb.org\nkjeport.com\nkjfhe.com\nkjfns.com\nkjgcl.com\nkjghyjy.com\nkjhaoyun.com\nkjimg.com\nkjingbao.com\nkjiuye.com\nkjjcrm.com\nkjjl100.com\nkjjxjy.com\nkjjxl.com\nkjjzm.com\nkjkd.com\nkjkp.com\nkjks.net\nkjkxun.com\nkjlww.com\nkjmofang.com\nkjmte.com\nkjmti.com\nkjpmconsulting.com\nkjr365.com\nkjrs365.com\nkjson.com\nkjsv.com\nkjt.com\nkjtbao.com\nkjtianshanxu.com\nkjtong.com\nkjtpay.com\nkjutf-uejfncpo72u.com\nkjw.cc\nkjwlxt.com\nkjwugx.com\nkjycx.com\nkjyicdn.com\nkjykcdn.com\nkjyun123.com\nkjzhan.com\nkjzj.com\nkjzx.net\nkjzxtk.com\nkk-china.com\nkk1.vip\nkk169.com\nkk18.com\nkk1bie336689.com\nkk30.com\nkk30.net\nkk3g.net\nkkabc.com\nkkapp.com\nkkcache.net\nkkcapture.com\nkkcdn.net\nkkcha.com\nkkcharge.com\nkkcoo.com\nkkcursor.com\nkkdaxue.com\nkkddosdns.com\nkkdgroup.com\nkkdict.com\nkkdnsv1.com\nkkdownload.com\nkkdzpt.com\nkkeji.com\nkkexcel.com\nkkfesw.com\nkkffdns.com\nkkfw.net\nkkgithub.com\nkkguan.com\nkkgwy.com\nkkh-global.com\nkkhaitao.com\nkkid.vip\nkkidc.com\nkkj2.com\nkkjiaofei.com\nkkjs.tech\nkkk5.com\nkkkwww.com\nkkkxj.com\nkklishi.com\nkklxj.com\nkkmall.org\nkkmar.com\nkkmh.com\nkkmicro.com\nkkmop.com\nkkong.vip\nkkrb.net\nkksmg.com\nkksofts.com\nkkt.com\nkktian.com\nkktijian.com\nkktv1.com\nkktv5.com\nkktv8.com\nkkuu.com\nkkwafdns.com\nkkwan.cc\nkkx.net\nkkxnb.com\nkkxxiazai.com\nkkyoo.com\nkkyp.shop\nkkyuan.com\nkkyuedu.com\nkkzj.com\nkkzs.io\nkkzycdn.com\nkl1l5.com\nkl321.com\nkl688.com\nklandk.com\nklbn100.com\nklbyjt.com\nklchemicals.net\nklclear.com\nklcsb.com\nkldhq.com\nklgkm.com\nklhpw.com\nklhuyan.com\nklianfa.com\nklicen.com\nklingai.com\nklingxai.com\nklinlee.com\nklisedu.com\nkliwu.com\nkljiyou.com\nkljtc.com\nkllife.com\nklmnf.com\nklmy118114.com\nklmybbs.com\nklmymarathon.com\nklmyssn.com\nklner.com\nklniu.com\nklpbbs.com\nklqcb.com\nklqy.com\nkltgt.com\nkltjn.com\nkltong.com\nklub11.com\nklv5qu.com\nklvtu.com\nklwxq.com\nklx-tech.com\nklxksci.com\nklxsw.com\nklxuexi.com\nklyang.com\nklzhlogistics.com\nkm.com\nkm10z.net\nkm169.net\nkm18.net\nkm1818.com\nkm28.com\nkm5858.com\nkm8z.net\nkmail.com\nkmaoxx.com\nkmapp.net\nkmbbs.com\nkmbdqn.com\nkmcha.com\nkmcits.com\nkmcits0716.com\nkmcsg.com\nkmcxedu.com\nkmcxg.com\nkmcz365.com\nkmd8888.com\nkmdctz.com\nkmdcwt.com\nkmdn.net\nkmdns.net\nkmeecc.com\nkmeila.com\nkmeitu.com\nkmf.com\nkmfengli.com\nkmg-jd.com\nkmgdgs.com\nkmguolv.com\nkmgybsr.com\nkmhpc.net\nkmhwtz.com\nkmjt.net\nkmlcl.com\nkmlhh.com\nkmljexb.xyz\nkmmama.com\nkmmdkj.com\nkmoe0.com\nkmplayercn.com\nkmqcwx.com\nkmqianneng66.com\nkmqsaq.com\nkmread.com\nkmrfidtag.com\nkmrijie.com\nkmron.com\nkms.pub\nkmssgd.com\nkmsz.net\nkmszy.com\nkmteruite.com\nkmthy.com\nkmtlbj.com\nkmtlfckyy.com\nkmtrh.org\nkmtxzs.com\nkmvtc.net\nkmw.cc\nkmw.com\nkmwatersupply.com\nkmway.com\nkmwx.net\nkmxkh.com\nkmxyj.com\nkmy100.com\nkmyanyou.com\nkmyestar.com\nkmykt.com\nkmyzzx.com\nkmzhihuitong.com\nkmzp.com\nkmzscc.com\nkmzx.com\nkmzx.org\nkn-light.com\nkn-nanjing.com\nkn0sky.com\nkn120.com\nknbmotor.com\nknewbi.com\nknewone.com\nknewsmart.com\nknfeco.com\nknight-un.com\nknightedge.com\nknightli.com\nkninebox.com\nknj-nanjing.com\nknn-nj.com\nknnnd.com\nknockdream.com\nknotesapp.com\nknow-act.com\nknow88.com\nknowapartments.com\nknowfashionstyle.com\nknowhowedu.com\nknowingclouds.com\nknowingcloudvip.com\nknowingyun.com\nknowledgedp.com\nknowledgu.com\nknowlink-assets.com\nknownpcb.com\nknownsec.com\nknowsafe.com\nknowsurface.com\nknowyourself.cc\nknoya.com\nknscq.com\nknsheng.com\nknsyxw.com\nknt-nj.com\nkntc.win\nkntn.tech\nknvps.com\nknxchina.org\nknzlcq.com\nko0.com\nkoal.com\nkoalacam.net\nkoalareading.com\nkoalasolo.com\nkoba8.com\nkobelco-zh.com\nkobox.tv\nkocla.com\nkodcloud.com\nkoderover.com\nkodmp.com\nkoenli.com\nkof-kol.club\nkofficemart.com\nkofuf.com\nkofunion.net\nkogfc.net\nkohergroup.com\nkoiclub.net\nkoikreative.com\nkoinocn.com\nkoioawq.com\nkojihjnklka.asia\nkojtech.com\nkok.plus\nkokojia.com\nkokophp.com\nkolarmy888.com\nkolcc.com\nkole8.com\nkolemay.com\nkolleracademy.com\nkolrank.com\nkolstore.com\nkolyun.com\nkomect.com\nkometo.com\nkompasszdcom.site\nkonami.cc\nkoncoo.com\nkonekomoe.com\nkonfan.net\nkongai.org\nkongao.com\nkongapi.com\nkongbugushi.com\nkongdao.com\nkongduan.com\nkongfz.com\nkongge.com\nkongjianjia.com\nkongjibusiness.com\nkongjie.com\nkongjieshijie.com\nkongjitang.com\nkongjun.com\nkongkangroup.com\nkonglei.com\nkonglonggu.com\nkongming-inc.com\nkongqinengrebeng.com\nkongquecheng.com\nkongqueyuzd.cc\nkongrong.com\nkongtiao163.com\nkongtiao365.com\nkongwu2022.com\nkongzhi.net\nkongzhiji.com\nkongzhong.com\nkonka.com\nkonkamobile.com\nkonkasnow.com\nkonkek2.com\nkonlan.com\nkonotaku.com\nkooaoo.com\nkoobeemobile.com\nkoobone.com\nkoocdn.com\nkooci.net\nkoodi98.com\nkoofang.com\nkoofun.com\nkoogua.com\nkook.vip\nkookong.com\nkoolcenter.com\nkooldns.com\nkoolearn.com\nkoolproxy.com\nkoolyun.com\nkoomao.com\nkoopass.com\nkoorun.com\nkooshui.com\nkooteam.com\nkoovin.com\nkoowo.com\nkooxoo.com\nkopebe.com\nkopisee.com\nkopitokein.com\nkopiurerolex.com\nkoplayer.com\nkopperchem.com\nkoreabt.com\nkoreaxing.com\nkorirl.com\nkormee.com\nkornsweets.com\nkoronsoft.com\nkorosensei.com\nkorrun.com\nkortatb.com\nkortrong.com\nkotei-info.com\nkotoo.com\nkotoyoshi.com\nkoubei.com\nkoubeikc.com\nkoucai.com\nkouchouwang.net\nkouclo.com\nkoudai.com\nkoudai8.com\nkoudaigou.net\nkoudaili.com\nkoudaionline.com\nkoudaionline.net\nkoudaitiku.com\nkoudaitong.com\nkoudashijie.com\nkouer.com\nkouer.net\nkougukougu.work\nkouhao8.com\nkoukao.net\nkoukao.org\nkouke5.com\nkoukoutu.com\nkoukuko.com\nkoumakan.cc\nkouqiangba.com\nkoushare.com\nkouss.com\nkouxin.com\nkouxin.net\nkouyijia.com\nkouyu100.com\nkouzi.com\nkovemoto.com\nkowa-dental.com\nkowa103.com\nkowloonhospital.com\nkoyuki.cc\nkoz.moe\nkpblw.com\nkpbyd.com\nkpdhk.com\nkpfans.com\nkpfcw.com\nkphm88.com\nkphwchem.com\nkpjushi.com\nkpkpw.com\nkplanet.vip\nkpmqg.com\nkpoll.net\nkppcsem.com\nkprepublic.com\nkpt5.com\nkptour.com\nkpwcmb.com\nkpyy239.com\nkpyy258.com\nkpzip.com\nkpzip.net\nkpzpw.com\nkpzs.com\nkpzuan.com\nkq-cnmia.com\nkq36.com\nkq39.com\nkq520.net\nkq7.com\nkq81.com\nkq88.com\nkqalevel.com\nkqapi.com\nkqgeo.com\nkqgyl.com\nkqj123.com\nkqjtj.com\nkqjtj.net\nkqlink.com\nkqmmm.com\nkqopg.app\nkqqy.com\nkqw.com\nkqwh231122.com\nkqwlxxjs.com\nkqzlzx.com\nkqzp.net\nkr-cell.com\nkr-tencentclb.cloud\nkr-tencentclb.com\nkr-tencentclb.net\nkr-tencentclb.work\nkr.com\nkr126.com\nkra-5at.com\nkrahag.com\nkrak12.com\nkraken30.com\nkrbk.com\nkrd168.com\nkrdrama.com\nkrenzheng.com\nkridol.com\nkriszhang.com\nkrones-group.com\nkrones.com\nkrpano.tech\nkrqcitie.com\nkrszf.com\nkrtdl.com\nkrxz.com\nkrzb.net\nkrzzjn.com\nks-cdn.com\nks-cdn1.com\nks-cdnv6.com\nks-fag.com\nks-live.com\nks-spring.com\nks-terminals.com\nks-wg.com\nks1688.com\nks321.com\nks365.org\nks5.uno\nks51.com\nks5u.com\nksair.com.tw\nksapisrv.com\nksbao.cc\nksbao.com\nksbbs.com\nksbm.com\nksc-test.com\nkscac.com\nkscbigdata.cloud\nkscbpkf.com\nkscdns.com\nkschuangku.com\nkscloudapi.com\nksco.cc\nkscord.com\nksdedu.com\nksdhgy.com\nksdown.com\nksecit.com\nksedt.com\nkseibitools.com\nksense.com\nksfang.com\nksgnr.com\nkshahn.com\nkshaoteng.com\nkshfgf.com\nkshjn.com\nkshot.com\nkshot.net\nkshtxf.com\nkshuwx.com\nkshwtj.com\nksjgs.com\nksjhaoka.com\nksjxgs.com\nkskwai.com\nkslccb.com\nkslyt.com\nksmend.com\nksmiai.com\nksmingl.com\nksmjmj.com\nksmmed.com\nksmobile.com\nksmq5a9kxzmr.com\nksndsa.com\nksnows.com\nksoapp.com\nksokay.com\nksops.com\nksord.com\nksosoft.com\nkspays.com\nkspeeder.com\nkspkg.com\nksrc001.com\nksren.com\nksrenfan.com\nksria.com\nksrmtzx.com\nksrmyy.org\nksrsy.com\nksruanjian.com\nkss4.com\nkssip.msi.com\nkssjkj.com\nksslxh.com\nkst-cn.com\nkst100.com\nkst365.com\nkstao.com\nkstengcai.com\nkstnjscl.com\nkstore.space\nkstore.vip\nkstv.com\nksupdate.com\nksust.com\nkswcd.com\nkswxjnjs.com\nksx88.com\nksxfgc.com\nksxianda.com\nksydns.com\nksydx.com\nksyiqiwan.com\nksyll.com\nksyna.com\nksyun.com\nksyun.net\nksyunad.com\nksyuncdn-k1.com\nksyuncdn.com\nksyuncs.com\nksyungslb.com\nksyungslb2.com\nksyunv5.com\nksyunv6.com\nksyunwaf.com\nksyxmc.com\nkszhuanjia.com\nkszlzz.com\nkszpw.com\nkszxzsxh.com\nkt007.com\nkt10000.com\nkt286.com\nkt40.com\nkt5u.com\nktallong.com\nktang1.com\nktazg.com\nktbiao.com\nktc-med.com\nktcomposite.com\nktctjt.com\nktcupdate.com\nkting.info\nktkt.com\nktlshu.vip\nktlstbg.com\nktmap.com\nktmv.com\nktmwan.net\nktplay.com\nktq8e0zm.work\nktrcn.com\nktrlight.com\nktstny.com\nktswjt.com\nktt-automation.com\nktu56.com\nktuner.store\nktv.com\nktvc8.com\nktvdaren.com\nktvme.com\nktvsky.com\nktwap.net\nktxuexi.com\nktyunlianjie.com\nku25.com\nku33a.net\nku6.com\nku6.net\nku6cdn.com\nku6img.com\nku82.com\nku90.com\nku968.com\nku987.com\nkua365.com\nkuaaa.com\nkuabaobao.com\nkuadu.com\nkuafuai.net\nkuai-fei.com\nkuai-ying.com\nkuai.ma\nkuai65.com\nkuai666bj7tu65rkdz82.com\nkuai666bjeve6ks43qyw4vc8.com\nkuai666bjs3gsymi6v4h5pz.com\nkuai666kysktrxmwici27.com\nkuai666vs5aq9o3ytdgp.com\nkuai7.com\nkuai8.com\nkuaiads.com\nkuaiapps.com\nkuaibaobei.com\nkuaibiao2000.com\nkuaicad.com\nkuaicha365.com\nkuaicha888.com\nkuaichala.com\nkuaichale.com\nkuaidadi.com\nkuaidaili.com\nkuaidi.com\nkuaidi100.com\nkuaidi321.com\nkuaidihe.com\nkuaidihelp.com\nkuaidihome.com\nkuaidilab.com\nkuaidim.com\nkuaidizs.com\nkuaiduizuoye.com\nkuaiduwen.com\nkuaiex.com\nkuaifaka.com\nkuaifaka.net\nkuaifawu.com\nkuaifeng.com\nkuaifuinfo.com\nkuaigames.com\nkuaigeng.com\nkuaigou.co\nkuaiguohui.com\nkuaih5.com\nkuaihaodai.com\nkuaihecaishui.com\nkuaihou.com\nkuaihuoyun.com\nkuaihz.com\nkuaiji.com\nkuaiji.so\nkuaiji521.com\nkuaiji66.com\nkuaijianji.com\nkuaijiepaotui.com\nkuaijilunwen.com\nkuaijinniu.com\nkuaijipeixunlg.com\nkuaijishizi.com\nkuaijisishu.com\nkuaijitong.com\nkuaijizheng365.com\nkuaikan.ink\nkuaikanad.com\nkuaikanmanhua.com\nkuaikao.com\nkuaikaoti.com\nkuaikuaicloud.com\nkuaila.com\nkuailails.com\nkuailaiwz.com\nkuaile-u.com\nkuaile8.com\nkuaile800.com\nkuailedo.com\nkuailekaishi.com\nkuailelunwen.com\nkuailepipixia.com\nkuailetongyao.com\nkuailexs.com\nkuailexue.com\nkuaileyouxuan.com\nkuailezu.com\nkuailiyu.com\nkuailiyu.net\nkuailon.com\nkuailvzaixian.com\nkuaimai.com\nkuaimi.com\nkuaimi.net\nkuaiming.com\nkuaipandata.com\nkuaipao.run\nkuaipao8.com\nkuaipianer.com\nkuaipin.work\nkuaipiyun.com\nkuaipng.com\nkuaiqi.net\nkuaiqikan.com\nkuaiqin.com\nkuaiqushuiyin.com\nkuairen88.com\nkuaishangkf.com\nkuaishebao.com\nkuaishiedu.com\nkuaishou-gz.com\nkuaishou.com\nkuaishouapp.com\nkuaishouapp.net\nkuaishouapps.com\nkuaishouba.com\nkuaishougroup.com\nkuaishoupay.com\nkuaishouzt.com\nkuaishuru.net\nkuaisu.com\nkuaisushu-cnd.com\nkuaisuyun.com\nkuaitijian.com\nkuaitouad.com\nkuaitu.cc\nkuaitu666.com\nkuaitui365.com\nkuaiwan.com\nkuaiwenyun.com\nkuaixiazai.com\nkuaixue.com\nkuaiyan.com\nkuaiyankanshu.org\nkuaiyiad.com\nkuaiyilicai.com\nkuaiyingxiao88.com\nkuaiyingyong.vip\nkuaiyizu.net\nkuaiyong.com\nkuaiyoujia.com\nkuaiyouxi.com\nkuaiyuepu.com\nkuaiyugo.com\nkuaiyunds.com\nkuaizhan.com\nkuaizhang.com\nkuaizhaogong.com\nkuaizhe.com\nkuaizhihui.com\nkuaizhou123.com\nkuaizi.co\nkuaizip.com\nkuaizitech.com\nkuaizitech.net\nkuaizupu.com\nkuajing.com\nkuajing.hk\nkuajing84.com\nkuajingketang.cc\nkuajingmaihuo.com\nkuajingnet.com\nkuajingvs.com\nkuajingx.com\nkuajingyan.com\nkuajingyang.com\nkuajingzhushou.com\nkuajinzhifu.com\nkuakao.com\nkuakao.net\nkuake8.com\nkuaming.com\nkuandaige.com\nkuanfans.com\nkuanff.com\nkuanfutong.com\nkuang-chi.com\nkuang-chi.org\nkuangchan.biz\nkuangdacn.com\nkuangdi.com\nkuangjijia.com\nkuangjiwan.com\nkuangmaidz.com\nkuangming.com\nkuangshitech.com\nkuangshun.com\nkuangxiangit.com\nkuangyeyuan.com\nkuangyi.com\nkuangyuantrade.com\nkuanhuacheng.com\nkuanye.net\nkuark.com\nkuashou.com\nkuayuegroup.com\nkubercloud.com\nkubesre.xyz\nkubey.cc\nkubikeji.com\nkuboluo.com\nkuche.com\nkuchechina.com\nkuchuan.com\nkucoin-in.work\nkucunguanli.online\nkudapp.com\nkudianvip.com\nkudiaoyu.com\nkudingyu.com\nkudou.org\nkuems.com\nkufangwuyou.com\nkufaxian.com\nkufei.com\nkuge.cc\nkugoo.com\nkugou.com\nkugou.la\nkugou.net\nkugouaudio.com\nkugouipv6.com\nkugoukid.com\nkugouliveshow.com\nkugouringtone.com\nkugousenior.com\nkugoustore.com\nkugouvoice.com\nkugouyouth.com\nkuguanyi.com\nkugz.com\nkuhao360.com\nkuheju.com\nkuhii.com\nkuhimalayandp.com\nkuicc.com\nkuigkj.com\nkuihe.com\nkuihuakeji.com\nkuihuayaoye.com\nkuihuo.com\nkuike.ltd\nkuiniuca.com\nkuishiba.com\nkujiale.com\nkujiang.com\nkujiang.net\nkuk8.com\nkuka-xj.com\nkuka001.com\nkukagroup.com\nkukahome.com\nkukankeji.com\nkukasofa.com\nkuke.com\nkuke99.com\nkukecloud.com\nkukseo.com\nkukuda.net\nkukulv.com\nkukupig.com\nkukushouhou.com\nkukushow.com\nkukushu.com\nkukuspeak.com\nkukuw.com\nkukuxiu.com\nkuledushu.com\nkuleiman.com\nkulekeji.com\nkulemi.com\nkulengvps.com\nkuletco.com\nkuli.ren\nkuliwang.net\nkuman.com\nkumanju.com\nkumao.vip\nkumaoyun.com\nkumeiwp.com\nkumhosunny.com\nkumiao.com\nkumiao.vip\nkumifeng.com\nkun-pharm.com\nkun66.xyz\nkunchuang.com\nkunduo.com\nkungfucloud.com\nkungfuenglish.com\nkunguankeji.com\nkunguanyx.net\nkunjuke.com\nkunkkawu.com\nkunkundev.com\nkunkunyu.com\nkunlexf.com\nkunlunaq.com\nkunlunar.com\nkunlunca.com\nkunluncan.com\nkunlunce.com\nkunlundns.com\nkunlunea.com\nkunlungem.com\nkunlunger.com\nkunlungr.com\nkunlunhuf.com\nkunlunjk.com\nkunlunjue.com\nkunlunjyk.com\nkunlunle.com\nkunlunli.com\nkunlunno.com\nkunlunpi.com\nkunlunra.com\nkunlunsa.com\nkunlunsc.com\nkunlunsl.com\nkunlunso.com\nkunlunta.com\nkunlunvi.com\nkunlunwe.com\nkunlunxin.com\nkunlunyb.com\nkunmingbc.com\nkunmingguolv.net\nkunmingkanghui.com\nkunpengkg.com\nkunpengtn.com\nkunpo.cc\nkunruijs.com\nkunshandx.com\nkunst-x.com\nkuntaihotel.com\nkuntin.com\nkunyamedical.com\nkuo-yi.com\nkuobuy.com\nkuocaicdn.com\nkuocaidns.com\nkuocaiyun.com\nkuoo8.com\nkuosheng.com\nkuosheng.net\nkuotu.com\nkuozang.com\nkuozhan.net\nkupaisky.com\nkupan.cc\nkupao.com\nkuqi.com\nkuqin.com\nkuraboshanghai.com\nkureader.com\nkurobbs.com\nkurogame-service.com\nkurogame-service.xyz\nkurogame.com\nkurogame.net\nkurogame.xyz\nkurogames-ads.com\nkurogames-global.com\nkurogames.com\nkurokingdom.com\nkuroko.info\nkurtizanki-spb.com\nkurz-sh.com\nkusdk.com\nkusen888.com\nkushe.net\nkushou.com\nkushouwang.net\nkushuzw.com\nkusnc17.com\nkuso.xyz\nkusouji.com\nkut3974vc.com\nkutianxia.com\nkutianxia.net\nkutinai.com\nkutj.com\nkutongji.com\nkutuan.com\nkuuke.com\nkuvun.com\nkuwan8.com\nkuwanapp.com\nkuwanbang.com\nkuwanjitar.com\nkuwen.net\nkuwuu.com\nkuwwz.com\nkuxi100.com\nkuxiaoji.com\nkuxiaomiao.com\nkuxiaoshuo.com\nkuxiaozhu.com\nkuxiuktv.com\nkuxueedu.com\nkuy8.com\nkuyh.com\nkuyibu.com\nkuyin123.com\nkuyinxiu.com\nkuyinxiuxiu.com\nkuyinyun.com\nkuyiso.com\nkuyiyun.com\nkuyoo.com\nkuyouyun.com\nkuyumall.com\nkuyun.com\nkuzhange.com\nkuzhazha.com\nkuzhengame.com\nkuzu.com\nkv-kva.com\nkvenjoy.com\nkviso.com\nkvogues.com\nkvov.com\nkvps85.com\nkw007.com\nkwai-group.com\nkwai666.com\nkwaiadapp.com\nkwaiads.com\nkwaibusiness.com\nkwaicdn.com\nkwaicdnx.com\nkwaie65eu4gvs1943.com\nkwaigobuy.com\nkwaigroup.com\nkwailai.com\nkwailala.com\nkwailbs.com\nkwailine.com\nkwailocallife.com\nkwailocation.com\nkwaim.com\nkwairr9aw56vso581r.com\nkwairtc.com\nkwaiselfcdn.com\nkwaishop.com\nkwaishouapp.com\nkwaishouapp.net\nkwaitalk.com\nkwaitv.com\nkwaiww7t3qi8x217.com\nkwaixiaodian.com\nkwaiying.com\nkwaizt.com\nkwangfeng.com\nkwggroupholdings.com\nkwicdn.com\nkwimgs.com\nkwinbon.com\nkwise-log.com\nkwkf.com\nkwniu.com\nkwong-tech.com\nkws123.com\nkwt56.com\nkwtgs.com\nkwtzn.com\nkwudor.com\nkwwblcj.com\nkwx.gd\nkwxcj.com\nkwxjh.net\nkx-turbo.com\nkx001.com\nkx139.com\nkx1978.com\nkx1d.com\nkx778.com\nkx7p.com\nkxapps.com\nkxb100.com\nkxbox.com\nkxccjjt.com\nkxceping.com\nkxcq.com\nkxdaili.com\nkxdao.com\nkxdao.org\nkxdpm.com\nkxdw.com\nkxiaoshuo77.com\nkxinyk.com\nkxji.com\nkxjlzx.com\nkxjsys.com\nkxl100.com\nkxlc.com\nkxll.com\nkxload.com\nkxmas.com\nkxmrg.com\nkxoalq.com\nkxow.com\nkxparking.com\nkxphy.com\nkxq520.com\nkxqo2ev.com\nkxscience.com\nkxt.com\nkxtjt.com\nkxtoo.com\nkxtui.com\nkxtwz.com\nkxue.com\nkxwell.com\nkxx2.com\nkxxsc.com\nkxxxl.com\nkxyyf.com\nky-express.com\nky.cc\nky.live\nky393834.com\nky595images.com\nky5yx.com\nky6yx.com\nky7yx.com\nky958.com\nkybapp.com\nkybapp.net\nkybcrm.com\nkybimg.com\nkyboye.com\nkybyun.com\nkych5.com\nkydbp.com\nkydev.net\nkydl308015.vip\nkydl308029.vip\nkydzfl.com\nkye-erp.com\nkye.vip\nkyec.cc\nkyedu.cc\nkyemall.com\nkyfey.com\nkygroup.ltd\nkygso.com\nkyhtech.com\nkyhyxy.com\nkyj168.com\nkyjlhz.com\nkyjxy.com\nkyk.cc\nkykjgroup.com\nkylc.com\nkyleduo.com\nkyligence.io\nkylin-os.com\nkylinlot.com\nkylinmobi.com\nkylinos.com\nkylinpet.com\nkylpharm.com\nkymjs.com\nkyo.hk\nkyoceraconnect.com\nkyppt.com\nkyrcw.com\nkysjhx.com\nkyslb.com\nkysnxt.com\nkysygs.com\nkytijian.com\nkyuedu.com\nkyv5.com\nkyvipw.org\nkyw4y0s.com\nkywiremesh.com\nkyxdloan.com\nkyxh.com\nkyxsw.org\nkyy6.com\nkyzhpt.com\nkyzs.com\nkyzyj.com\nkz.cc\nkz321.com\nkzcpm.com\nkzeaa.com\nkzgui.com\nkzk1.com\nkzmyhome.com\nkzo.moe\nkzrcw.com\nkzread.com\nkzrqicae.com\nkztsjj.com\nkzwr.com\nkzwx.net\nkzyzz.com\nl-zb.com\nl.biz\nl069.com\nl178.info\nl1yu.com\nl2cn.com\nl2h.site\nl2t7.cc\nl2z4l.net\nl3gt9.com\nl68.net\nl6qmpykq.work\nl799vk4qe2.com\nl7audiolab.com\nl85r.com\nl99.com\nla-bbs.net\nla-chinata.hk\nla-mo.com\nla-technology.com\nla31.com\nlaawoo.com\nlab-bst.com\nlab-easttitan.com\nlab-rm.com\nlab-z.com\nlabaoxian.com\nlabbang.com\nlabbase.net\nlabbuy.net\nlabel-printing-factory.com\nlabgogo.com\nlabi.com\nlabisart.com\nlabixiao.xin\nlabno3.com\nlabuladong.online\nlabview.help\nlabxing.com\nlabzj.com\nlacaoshi.com\nlacesar.com\nlackeeden.com\nlacngs.com\nlacocrea.com\nladiyoga.com\nladjzs.com\nlady177.com\nlady361.com\nlady75.com\nlady8844.com\nladybirdedu.com\nladydaily.com\nladyhua.com\nladymetro.com\nladyol.com\nladyw.com\nladyw.net\nlaecloud.com\nlaey.net\nlaf.run\nlafaso.com\nlafayettewines.com\nlafy.org\nlafybjy.com\nlagou.com\nlagouevents.com\nlagoujobs.com\nlaguaba.com\nlaguke.com\nlahuashanbx.com\nlahuolaozao.com\nlai-ai.com\nlaianbbs.com\nlaiba.shop\nlaibafu.com\nlaibeiparking.com\nlaibokeji.com\nlaibot.com\nlaichon.com\nlaichou.com\nlaichuanfeng.com\nlaidacai.com\nlaidazi.com\nlaidingba.com\nlaidudu.com\nlaifen.net\nlaifeng.com\nlaifeng.net\nlaifenqi.com\nlaifu.net\nlaigame7.com\nlaigame7.net\nlaigaokao.com\nlaigong.com\nlaihua.com\nlaijiawen.com\nlaijishaofang.com\nlaijuba.com\nlaikan.com\nlaikanxia.com\nlaikanxing.com\nlaikanxs.com\nlaike.net\nlaikeerp.com\nlaiketui.com\nlailaieshop.com\nlailaihui.com\nlailibai.com\nlailin.xyz\nlailinzhihui.com\nlailook.net\nlaima-tech.com\nlaimaidi.com\nlainse.store\nlainzy.net\nlaipei.net\nlaiqi.net\nlaiqm.com\nlaiqukankan.com\nlaiqy.com\nlaird-tek.com\nlaisai.com\nlaishui.info\nlaisizuji.com\nlaisj.com\nlaitelaide.com\nlaituia.com\nlaituijian.net\nlaiwang.com\nlaiwo.com\nlaiwu.net\nlaiwuyizhong.com\nlaixi.com\nlaixiangzuji.com\nlaixindianzi.com\nlaixiukeji.com\nlaixs.com\nlaixueedu.com\nlaixuexi.cc\nlaiyagushi.com\nlaiye.com\nlaiyifen.com\nlaiyincat.com\nlaiyouhui.net\nlaiyouxi.com\nlaiytech.com\nlaiyu.com\nlaizee.com\nlaizhouba.com\nlaizhouba.net\nlaizhoujob.com\nlaizi.net\nlajoson.com\nlakala.com\nlakecn.com\nlakeregionfitness.com\nlakwdian.com\nlalaba.com\nlalaedu.com\nlalavision.com\nlalawaimai.com\nlalkk.com\nlamahui.com\nlamaison-arting.com\nlamall.com\nlambda.hk\nlamborlogistics.com\nlameixs.com\nlamiu.com\nlamost.org\nlamoton.com\nlampbi.com\nlampouomo.com\nlamuba.com\nlamwatch.com\nlamyu.com\nlan-bridge.com\nlan-lin.com\nlan-ning.com\nlan1001.com\nlanall.com\nlanapartments.com\nlanbenjia.com\nlanbing510.info\nlanbinimall.com\nlanbts.com\nlanbula.com\nlancdn.com\nlancecity.net\nlancern.xyz\nlanchenglv.com\nlanchuanhuanbao.com\nlancn.net\nlancome-beauty.com\nlancong.net\nlanconvey.com\nlancunwater.com\nlancygroup.com\nland136.com\nlanda-solenoid.com\nlandai.com\nlandaiwood.com\nlandbond.com\nlandbridge.com\nlandchina.com\nlanded.cc\nlandhonor.com\nlandi.com\nlandian.vip\nlandian.xyz\nlandiannews.com\nlanding-med.com\nlandingbj.com\nlandintheair.com\nlanditrip.com\nlandizs.com\nlandjs.com\nlandmedium.com\nlandong.com\nlandraco.com\nlandray.com\nlandroads.com\nlandscape.vip\nlandscapek.com\nlandspace.com\nlandtu.com\nlandui.com\nlanduicdn.com\nlanduncn.com\nlandunxiaofang.com\nlandwind.com\nlandzestate.com\nlandzg.com\nlandzy.com\nlanecn.com\nlanfanapp.com\nlanfc.com\nlanfcw.com\nlanfeicastle.com\nlanfeitech.com\nlanfeiwine.com\nlanfeng.net\nlanfucai.com\nlanfucaijing.com\nlanfw.com\nlang8.net\nlangan-group.com\nlangao.com\nlangchao.com\nlangchaosh.com\nlangchi.com\nlangduqi.com\nlangemedtech.com\nlangfang.com\nlangfang12345.com\nlangfangfc.com\nlangfly.com\nlanggine.com\nlanghao-medical-platform.com\nlanghuansoft.net\nlangjian.work\nlangkaiwenhua.com\nlangkawipower.com\nlangke.com\nlangke.tv\nlangkoo.com\nlangkun.com\nlanglangjiajiao.com\nlanglangy.com\nlanglib.com\nlanglive.com\nlangmanzg.com\nlangqing.club\nlangren001.com\nlangren8.com\nlangrencard.com\nlangrenclub.com\nlangrensha.net\nlangruiyun.com\nlangsajiasi.com\nlangsong.site\nlangtao.cc\nlangtaojin.com\nlangtongpos.com\nlanguageclass.cc\nlanguang.com\nlanguershiton.com\nlangukeji.com\nlangwei.net\nlangxi.org\nlangxi.xyz\nlangxingys.com\nlangxiyuyou.com\nlangyintech.com\nlangzezs.com\nlanh.love\nlanhanba.net\nlanhao.name\nlanhu.com\nlanhuajituan.com\nlanhuapp.com\nlanhuasoft.com\nlanhuhu.com\nlanhui.com\nlanin.tech\nlanindex.com\nlanjie100.com\nlanjie520.com\nlanjing.vip\nlanjingads.com\nlanjinger.com\nlanjingerp.com\nlanjingfm.com\nlanjingmembrane.com\nlanjings.com\nlanjingtmt.com\nlanjingzf.com\nlankecloud.com\nlankeji.com\nlanlanlife.com\nlanlanwork.com\nlanlinghospital.com\nlanlingtuliao.com\nlanlnk.com\nlanlv.com\nlanmaiedu.com\nlanmao.com\nlanmaokeji.com\nlanmaos.com\nlanmicloud.com\nlanmit.com\nlanmiyun.com\nlanniuh.com\nlanniuyun.com\nlanohotel.com\nlanosso.com\nlanou3g.com\nlanovamedicines.com\nlanpiankeji.com\nlanpuele.com\nlanpv.com\nlanpw.com\nlanpye.com\nlanqb.com\nlanqi.com\nlanqibing.com\nlanqingkeji.com\nlanqiudi.com\nlanrar.com\nlanree.com\nlanreelh.com\nlanrenbijia.com\nlanrenclub.com\nlanrenexcel.com\nlanrenmb.com\nlanrents.com\nlanrentuku.com\nlanrenzhaofang.com\nlanrenzhijia.com\nlanrenzhoumo.com\nlanruitech.com\nlansancn.com\nlanscn.com\nlansedir.com\nlansedongli.com\nlansha.tv\nlanshan.com\nlanshanae.com\nlanshanweb.com\nlanshauk.com\nlanshenniao.com\nlanshizi.com\nlanshou.net\nlansors.com\nlansscl.com\nlansun-pumps.com\nlansurcn.com\nlantiangufen.com\nlantianyu.net\nlantinglou.com\nlantumap.com\nlantushiji.com\nlanuss.com\nlanvote.com\nlanwa.net\nlanwei.org\nlanwoncloudfilm.com\nlanwuzhe.com\nlanxiangji.com\nlanxinbase.com\nlanxincn.com\nlanxincomputing.com\nlanxing123.com\nlanxiniu.com\nlanxiongsports.com\nlanxixiaowu.com\nlanxum.com\nlanyaa.com\nlanying.site\nlanyingwang.com\nlanyu.net\nlanyue.com\nlanyun.net\nlanyunbrand.com\nlanyunbusiness.com\nlanyuncloud.com\nlanyuncms.com\nlanyunone.com\nlanyusf.com\nlanzchina.com\nlanzhouvw.com\nlanzhuwh.com\nlanzn.com\nlanzog.com\nlanzong6.com\nlanzou.com\nlanzoub.com\nlanzouc.com\nlanzoue.com\nlanzouf.com\nlanzoug.com\nlanzouh.com\nlanzoui.com\nlanzouj.com\nlanzouk.com\nlanzoul.com\nlanzoum.com\nlanzouo.com\nlanzoup.com\nlanzouq.com\nlanzous.com\nlanzout.com\nlanzouu.com\nlanzouv.com\nlanzouw.com\nlanzoux.com\nlanzouy.com\nlanzov.com\nlanzun.net\nlao.si\nlaobaicai.net\nlaobaigan-hs.com\nlaoban100.com\nlaobandq.com\nlaobanfa.com\nlaobangban.com\nlaobanmail.com\nlaobi.icu\nlaobinggun.com\nlaobingmi.com\nlaobuxie.com\nlaocen.com\nlaodao.cc\nlaodaoyun.com\nlaodong.me\nlaodong66.com\nlaodongfa.com\nlaoduo.net\nlaoduzhe.com\nlaoevisa.gov.la\nlaofengwei.com\nlaofu.online\nlaofuzhou.net\nlaoge.xyz\nlaogongshuo.com\nlaogu.cc\nlaogu.com\nlaohaoren.com\nlaohu.com\nlaohu8.com\nlaohuabao.com\nlaohuangli.net\nlaohucaijing.com\nlaohuyun.com\nlaojiuxitong.com\nlaojuhui.com\nlaoke.com\nlaolai.com\nlaolaishou.com\nlaolaomiyou.com\nlaoliang.net\nlaoliboke.com\nlaolieren.com\nlaolieren.shop\nlaoliuceping.com\nlaoma.cc\nlaomaoniu.com\nlaomaotao.com\nlaomaotao.net\nlaomaotao.org\nlaomaotaopan.com\nlaomatou.com\nlaomo.me\nlaomoe.com\nlaomu.net\nlaonanren.cc\nlaonian100.com\nlaoniushuju.com\nlaopao.org\nlaoqiange.club\nlaoqianzhuang.com\nlaoren.com\nlaosiji.com\nlaosunit.com\nlaotiaomao.com\nlaowalens.com\nlaowuxx.com\nlaoxiangji.com\nlaoxianhui.com\nlaoxiezi.com\nlaoxuean.com\nlaoxuehost.com\nlaoxuehost.net\nlaoxuezhuji.com\nlaoy.net\nlaoyancheng.com\nlaoyaoba.com\nlaoyi0773.com\nlaoyoujiaju.com\nlaoyouyun.com\nlaoyouzhibo.com\nlaoyuanji.com\nlaoyuegou.com\nlaoyuge.com\nlaozhaopian5.com\nlaozicloud.com\nlaozu.com\nlaozuo.org\nlapc.cc\nlapin365.com\nlaplace-semi.com\nlapostea.cfd\nlapulace.com\nlaravel-admin.org\nlaravelacademy.org\nlarenla.com\nlarge.net\nlark-passport-qa-sg.net\nlarkapp.com\nlarkcloud.com\nlarkcloud.net\nlarkfn.com\nlarkoffice.com\nlarkofficeapp-boe.com\nlarkofficeapp-pre.com\nlarkofficeapp.com\nlarkofficeboe.com\nlarkofficecdn.com\nlarkofficeimg.com\nlarkofficepkg.com\nlarkofficepre.com\nlarkroad.com\nlarksuite.com\nlarksuiteimg-boe.com\nlarksuiteimg-pre.com\nlarkworld.com\nlarmace.com\nlarryms.com\nlarscheng.com\nlarsonlimited.com\nlaruence.com\nlasashengdi.com\nlaschina.org\nlascn.net\nlaserfair.com\nlaserjg.com\nlashou.com\nlasji.net\nlasmasas.com\nlast2win.com\nlastdream.net\nlastline.tech\nlategege.com\nlatepost.com\nlatexeasy.com\nlatexlive.com\nlatexstudio.net\nlatin100.com\nlatinhui.com\nlatitudeda.com\nlattebank.com\nlattecake.com\nlattefinance.com\nlattice.vip\nlaungee.com\nlaurelfilms.com\nlauyoo.com\nlavago.com\nlavandehotels.com\nlavapm.com\nlavaradio.com\nlavdrzv.xyz\nlaw-lib.com\nlaw-star.com\nlaw-wei.com\nlaw01.net\nlaw6888.com\nlawasst.com\nlawaxi.net\nlawbang.com\nlawbridge.org\nlawbus.net\nlawen.org\nlawen2.org\nlawh.fun\nlawinfochina.com\nlawipcompass.com\nlawke.com\nlawlawing.com\nlawlh1688.com\nlawlingyun.com\nlawnewscn.com\nlawparks.com\nlawrencetsui.com\nlawsdata.com\nlawtimeimg.com\nlawugu.com\nlawxin.com\nlawxp.com\nlawyee.com\nlawyee.net\nlawyee.org\nlawyer186.com\nlawyerbridge.com\nlawyerchina.org\nlawyermr.com\nlawyerpass.com\nlawyershanghai.net\nlax-pro.com\nlaxarq.com\nlaxmok.com\nlayaair.com\nlayabox.com\nlayinfo.com\nlayleen.com\nlaymauchina.com\nlayoutad.com\nlaysky.com\nlayui.com\nlayuicdn.com\nlayz.net\nlazada.co.id\nlazada.co.th\nlazada.com\nlazada.com.my\nlazada.com.ph\nlazada.sg\nlazada.vn\nlazcdn.com\nlaze.cc\nlazyaudio.com\nlazybios.com\nlazycat.cloud\nlazycatmicroserver.com\nlazycomposer.com\nlazydim.com\nlazyer.net\nlazymap.com\nlazyren.com\nlazystones.com\nlb-yz.com\nlb0398.com\nlb5.com\nlb54hon504ke.com\nlbbb.cc\nlbbee.com\nlbbniu.com\nlbctjt.com\nlbctrl.com\nlbd-group.com\nlbd99.com\nlbddd.com\nlbdj.com\nlbedu.com\nlbesec.com\nlbexps.com\nlbf123.com\nlbgold.com\nlbgoo.com\nlbgttc.com\nlbhdbl.com\nlbhgle.com\nlbinin.com\nlbjljc.com\nlbjn.cc\nlbjsfz.com\nlbjtjt.com\nlbkaiguan.com\nlbkrs.com\nlbmobi.com\nlbrencai.com\nlbsdermyy.com\nlbsdmy.com\nlbsrmyy.com\nlbswjt.com\nlbszx.com\nlbtek.com\nlbtp.com\nlbu.cc\nlbv1.com\nlbwbw.com\nlbx777.com\nlbx777.net\nlbxcn.com\nlbxcrmyy.com\nlbxdrugs.com\nlbxdyfgx.com\nlbxjkyf.com\nlbycwx.com\nlbyeyaji.com\nlbyq.com\nlbysgz.com\nlbzuo.com\nlc-cn-e1-shared.com\nlc-cn-n1-ayaqc.com\nlc-cn-n1-npxfk.com\nlc-cn-n1-shared.com\nlc-cn-n1-thovg.com\nlc-led.net\nlc-news.com\nlc-rc.com\nlc044.love\nlc1001.com\nlc123.net\nlc1618.com\nlc365.net\nlc442.com\nlc787.com\nlcang.com\nlcatgame.com\nlcayun.com\nlcbdf.net\nlcboai.com\nlcbtv.com\nlccareer.com\nlccdn.net\nlcchem.com\nlcchgg.com\nlccmw.com\nlccyy.com\nlccz.com\nlcddjm.com\nlcdhome.net\nlcdtz.com\nlcdushi.com\nlcdwiki.com\nlcdzsww.com\nlcenn.com\nlcfby.com\nlcfcw.com\nlcfgjs.com\nlcfile.com\nlcftech.com\nlcfw.co\nlcgdbzz.org\nlcgjcj.com\nlcgod.com\nlchdf.work\nlchfunv.xyz\nlchot.com\nlchzzs.com\nlcisb.com\nlciuyou.com\nlcjh.com\nlcjrfg.com\nlcjxj.com\nlcjyg.com\nlckeshun.com\nlckfb.com\nlckiss.com\nlcloudcdn.com\nlcmack.com\nlcmhbl.com\nlcmpn.com\nlcnichia.com\nlcofjp.com\nlcofo.com\nlcoss.com\nlcouncil.com\nlcpdu.com\nlcpumps.com\nlcqixing.com\nlcqjsjxxx.com\nlcqwdz.com\nlcrc.ltd\nlcrcbank.com\nlcsepu.com\nlcsgxjt.com\nlcsrmyy.com\nlcsrw.com\nlcsssg.com\nlcsyzp.com\nlctech-inc.com\nlctsggzz.com\nlcux.net\nlcwl.net\nlcxtgs.com\nlcxwfc.com\nlcxzyy.com\nlcycgg.com\nlcyff.com\nlcyhdl.com\nlcyidc.com\nlcyinsu.com\nlcykgg.com\nlcyp.net\nlcyrny.com\nlcysc.com\nlcywhx.com\nlcyyfj.com\nlcyzh.com\nlczbgc.com\nlczm.com\nlczq.com\nlczyjsxx.com\nlczyun.com\nlczyy.com\nld-pd.com\nld-powder.com\nld0766.com\nld12366.com\nld173.com\nld246.com\nldaq2005.com\nldb.cc\nldbj.com\nldbmcs.com\nldd.me\nlddengine.com\nlddgo.net\nldfdcw.com\nldgjj.com\nldgslb.com\nldhrd.com\nldhy.click\nldj-edujy.com\nldjt-china.com\nldkftz.com\nldkj-zs.com\nldkqyy.com\nldmap.net\nldmnq.com\nldngj.shop\nldoooo.com\nldplayer.net\nldqxn.com\nldrcw.com\nldseals.com\nldshijie.com\nldshj.com\nldsink.com\nldstark.com\nldtdn.com\nldtec.com\nldtech168.com\nldteq.com\nldwxiao.com\nldxiang.com\nldycdn.com\nldydh.com\nldygo.com\nldyz365.com\nldzcgs.com\nldzxyy.com\nle-feng.com\nle-wan.com\nle.com\nle365.cc\nle4.com\nle4ker.me\nle4le.com\nle5le.com\nle8.com\nle855.com\nle890.com\nleacol.com\nleadada.com\nleadal.com\nleadal.net\nleadamc.com\nleadclimb.org\nleadcoretech.com\nleadding.com\nleaddo.com\nleader-e.com\nleader609.com\nleader755.com\nleaderhero.com\nleaderlawyer.com\nleadernano.com\nleaderobot.com\nleadervc.com\nleadge.com\nleading-chem.com\nleadingpharm.com\nleadintelligent.com\nleadlan.com\nleadleo.com\nleadmanbio.com\nleadmap.net\nleadmedpharm.com\nleadmicro.com\nleadmoad.com\nleado-pharma.com\nleadong.com\nleadrd.com\nleadrive.com\nleadshiptech.com\nleadstong.com\nleadvc.com\nleadvsion.com\nleadway-china.com\nleadwaytk.com\nleadyo.com\nleadzees.com\nleaferjs.com\nleaforbook.com\nleaftools.net\nleafword.com\nleagcard.com\nleagpoint.com\nleagsoft.com\nleaguesun.com\nleakeyun.com\nlean.ren\nleangoo.com\nleanote.com\nleansoftx.com\nleanwind.com\nleanyon.com\nleap-pc.com\nleapahead.vip\nleapfive.com\nleaping.games\nleapmie.com\nleapmmw.com\nleapmotor.com\nlearn-quantum.com\nlearndiary.com\nlearnfuture.com\nlearningsj.com\nlearnku.com\nlearsun.com\nleatherhr.com\nleautolink.com\nleavescn.com\nleawin.com\nleayin.com\nleb-china.com\nlebanban.com\nlebang.com\nlebang.net\nlebi2.com\nlebilp.com\nlebinwl.com\nlebocode.com\nlebome.com\nlebopark.com\nlebosky.com\nleboweb.com\nlecai.com\nlecai08.com\nlecake.com\nlechain.com\nlechange.com\nlechangxia.cc\nleche.com\nlechebang.com\nlecheng18.com\nlechengdz.com\nlechengyunfu.com\nlechinepay.com\nlechuangzhe.com\nlecloud.com\nlecloudapi.com\nlecloudapis.com\nlecoinfrancais.org\nlecomposites.com\nlecong56.com\nleconiot.com\nlecoo.com\nlecreperoyaloak.com\nlecu8.com\nlecuiwangluo.com\nlecuntao.com\nled-zulin.com\nled661.com\nledanji.com\nledcax.com\nledchina-sh.com\nledctl.com\nlede.com\nledger-phrase.com\nledguhon.com\nledhyzm.com\nledianyun.com\nlediaocha.com\nledmary.com\nledo.com\nledouwan.com\nledouya.com\nledsdk.com\nledth.com\nledtoplight.net\nledu.com\nledu365.com\nleduimg.com\nlee-tieguo.com\nleeaon.com\nleeco.com\nleefanmr.com\nleehon.com\nleelen.com\nleeleo.vip\nleenzee.com\nleenzhu.com\nleeon.me\nleesdog.space\nleeshen.net\nleesoar.com\nleesou.com\nleetcode-cn.com\nleetcodechina.com\nleetro.com\nleeuu.com\nleevol.com\nleevy.net\nleewiart.com\nlefang365.com\nlefanglj.com\nlefeng.com\nleffercode.com\nleftfm.com\nleftlady.com\nleftshadow.com\nleftso.com\nlefu8.com\nlefuzuwu.com\nlegalsiri.com\nlegend-si.com\nlegendsec.com\nlegendsemi.com\nlegion.com.hk\nlegou456.com\nlegowechat.com\nlegu.cc\nlegu168.com\nleguyu.com\nleha.com\nlehaitv.com\nlehe.com\nlehecai.com\nlehibay.com\nlehihi.com\nleho.com\nlehuadisplay.com\nlehuipay.com\nlehuiso.com\nlei001.com\nleiaomold.com\nleibei.cc\nleiboyiqi.com\nleidacj.com\nleidianip.com\nleigod.com\nleigodjsq.com\nleihetg.com\nleihuo.net\nleijue.net\nleijun.com\nleike.cc\nleikeji.com\nleilei3dprinter.com\nleileiluoluo.com\nleilong158.com\nleimengjixie.com\nleimi.com\nleimingtech.com\nleimingtelab.com\nleimudata.com\nleiniao.com\nleiniao365.com\nleining-shield.com\nleiouxiong.com\nleiphone.com\nleishen-lidar.com\nleishencloud.com\nleishenhuyu.com\nleishenlaser.com\nleishouwin.cc\nleisoon.com\nleisu-ty.net\nleisu.com\nleisu123.com\nleisuapi.com\nleisureer.com\nleisurelypanda.com\nleitaibio.com\nleitaigongsi.com\nleiting.com\nleitingcn.com\nleitingjunshi.com\nleitool.com\nleiue.com\nleixiaofeng.net\nleixinbuild.com\nleixue.com\nleiyediaoche.com\nleiyunge.com\nleiyunge.net\nleji.com\nlejiachao.com\nlejian.com\nlejiao.tv\nlejiaolexue.com\nlejiaotech.com\nlejiashu.com\nlejj.com\nleju.com\nlejucaijing.com\nlejuliang.com\nlejunwl.com\nlekan.com\nlekannews.com\nlekazc.com\nlekevr.com\nlekoukou.com\nlektec.com\nlekuya.com\nlelaer.com\nlelai.com\nlele-lezhong.com\nlelecdn.com\nleleda.com\nleledp.com\nlelehuyu.com\nleleju.com\nleleketang.com\nlelelala.net\nlelepyq.com\nleletv.com\nleletv.net\nlelinly.com\nlelongpp.com\nlemai.com\nlemaker.com\nlemall.com\nlemedu.com\nlemeitu.com\nlemeng.center\nlemengcloud.com\nlemengfun.com\nlemiwan.com\nlemiyigou.com\nlemo360.com\nlemobar.com\nlemoes.com\nlemon4.club\nlemonban.com\nlemonnovel.com\nlemonpiggy.com\nlemonplus.asia\nlemonsay.com\nlemonttt.com\nlemonvp.com\nlemonyd.com\nlemote.com\nlempstack.com\nlemurbrowser.com\nlen.ink\nlenauth.com\nlenbenelectric.com\nlenciel.com\nlendy520.com\nlenfocus.com\nlengcat.com\nlengdou.net\nlenget.com\nlenglengyu.com\nlengliwh.com\nlenglv.com\nlengshuiji.org\nlengxiaohua.com\nlengxiaohua.net\nlengyankj.com\nlengzzz.com\nleniugame.com\nleniy.org\nlenmy.com\nlenogo.com\nlenosoft.com\nlenosoft.net\nlenovator.com\nlenovo.com\nlenovo.com.cdn.cloudflare.net\nlenovo.net\nlenovocloudos.com\nlenovoconnect.com\nlenovoeservice.com\nlenovofile.com\nlenovogame.com\nlenovohci.com\nlenovohuishang.com\nlenovoimage.com\nlenovomm.com\nlenovomobile.com\nlenovonetapp.com\nlenovonowgo.com\nlenovopoc.com\nlenovoprinter.com\nlenovoprinter.net\nlenovots.com\nlenovouat.com\nlenovows.com\nlenovozdl.com\nlenschine.com\nlenslifephoto.com\nlensuo.com\nlenwoo.com\nlenzhao.com\nleoao-inc.com\nleoao.com\nleocode.net\nleogd.com\nleolin86.com\nleonblog.net\nleoogo.com\nleopardtale.com\nleopump.com\nleozwang.com\nlepaicm.com\nlepiaoyun.com\nlepidard.com\nleptv.com\nlepumedical.com\nleqi.us\nleqian.com\nleqiaobh.com\nleqiaobhyy.com\nleqiku.com\nleqiuba.com\nleqiuzbc.org\nlequ.com\nlequanip.com\nlequgo.com\nlequji.com\nlequz.com\nlequzh.com\nlercar.com\nlergao.com\nlergle.com\nlerist.dev\nlers168.com\nlers168.net\nlersang.com\nlertao.com\nlerye.com\nlesejie.com\nleshangzs.com\nleshangzx.com\nleshanvc.com\nleshare.work\nleshi123.com\nleshiguang.com\nleshow.com\nleshu.com\nleshuatech.com\nleshuazf.com\nleshuwu.com\nlesimao.net\nlesjob.com\nlesjulo.com\nleslie-cheung.com\nlesofn.com\nlesonccl.com\nlesoon.com\nlesou.net\nlespark.us\nlesports.com\nless-bug.com\nless-more.net\nlesscode.work\nlesso.com\nlestcg.com\nletabc.com\nletang666.com\nletao.com\nletaoedu.com\nletaoren.com\nletbonchina.com\nleter.io\nletianbiji.com\nletianshanec.com\nletim-auto.com\nletinet.com\nleting.io\nletoour.com\nletotur.com\nletou8.com\nletoursport.com\nletright.com\nletrychina.com\nlets-study.com\nletschuhai.com\nletsebuy.com\nletsfilm.org\nletsgaga.com\nletsinno.com\nletssepub.com\nletsvisa.com\nlettercloud.net\nletuinet.com\nletuixiaokefu.com\nleturich.org\nletushu.com\nletv.com\nletvapp.net\nletvcdn.com\nletvcloud.com\nletvimg.com\nletvlb.com\nletvstore.com\nletwind.com\nletwx.com\nletyo.com\nleuok.com\nlevcauto.com\nlevect.com\nlevel8cases.com\nlevelinfinite.com\nlevenx.com\nlewaimai.com\nlewang.ltd\nlewangame.net\nlewawa.com\nlewbin.com\nlewen.la\nlewenba.cc\nlewenlou.la\nlewenn.com\nlewenqu.com\nlewenss.com\nlewenxsw.com\nlewifi.com\nlex.download.prss.microsoft.com\nlexar.com\nlexed.org\nlexiaigame.com\nlexiang-app.com\nlexiang-asset.com\nlexiang-asset.net\nlexiang-ops.com\nlexiangla.com\nlexiangla.net\nlexiangzuji.com\nlexin.com\nlexin001.com\nlexinchina.com\nlexoncloud.net\nlexuat.download.prss.microsoft.com\nlexue-cloud.com\nlexue.com\nlexueying.com\nlexun.com\nlexun.net\nlexuncaishui.com\nlexuntimes.com\nleya920.com\nleyaep.com\nleyan.com\nleyantech.com\nleyaoyao.com\nleyaoyao.org\nleyard.com\nleybc.com\nleyi007.com\nleyifan.com\nleying.com\nleying365.com\nleyingtt.com\nleyishandong.com\nleyixue.com\nleyonb.com\nleyoo.com\nleyoujia.com\nleyu.com\nleyuanhr.com\nleyue100.com\nleyuglobal.com\nleyun365.com\nleyuncn.com\nleyungame.com\nleyunge.com\nleyuxyz.com\nleyuz.com\nlezai.com\nlezai.org\nlezhao.com\nlezhi.com\nlezhi99.com\nlezhibo.com\nlezhiot.com\nlezhiyun.com\nlezhuan168.com\nlezhuan365.com\nlezhuanwang.net\nlezhudai.com\nlezhufenqi.com\nlezhun.com\nlezi.com\nlezuan.net\nlezuan11.com\nlezuan9.com\nlezuocai.com\nlf126.net\nlf127.net\nlfan.net\nlfang.com\nlfbxw.com\nlfcharge.com\nlfcmw.com\nlfdjex.com\nlfekaj.help\nlfex.com\nlffloor.com\nlfggzz.com\nlfhacks.com\nlfhospital.net\nlfhygl.com\nlficanton.com\nlfjsly.com\nlfjx88.com\nlfkjgh.com\nlfksqzj.com\nlfmxc.com\nlfppt.com\nlfqysm.com\nlfrczp.com\nlfszk.com\nlftdzd.com\nlfungame.com\nlfwin.com\nlfx20.com\nlfxww.com\nlfywood.com\nlfyx.ink\nlfyzjck.com\nlfzhaopin.com\nlg-lg.com\nlg-pump.com\nlg1024.com\nlg198.com\nlg5.co\nlg5.com\nlgbzj.com\nlgcdz.com\nlgctshanghai.com\nlgcx.com\nlgdisplayproduct.com\nlgdxtech.com\nlgexam.com\nlgfdcw.com\nlgfzgroup.com\nlghd111.com\nlghlncl.com\nlgimg.com\nlgimic.com\nlglmf.com\nlglmf.net\nlgmi.com\nlgo100.com\nlgpic.com\nlgpj.net\nlgpm.com\nlgrcbank.com\nlgshouyou.com\nlgstatic.com\nlgtzkg.com\nlguohe.com\nlgvf.com\nlgwy.net\nlgxly.com\nlgyanglao.com\nlgyszl.com\nlgyudiao.com\nlgyzyy.com\nlgzowo.com\nlgzzu.com\nlh-ep.com\nlh-lx.com\nlh.link\nlh168.net\nlh17.net\nlh36524.com\nlh75.com\nlhasa.icu\nlhbbj.com\nlhbgchina.com\nlhconst.com\nlhcreditevaluation.com\nlhcy168.com\nlhdbgs.com\nlhdeer.com\nlhdown.com\nlhdxz.com\nlhenet.net\nlhey.com\nlhgcxx.com\nlhguomy.xyz\nlhgz.net\nlhh.la\nlhhy.net\nlhihg.com\nlhjdfs.com\nlhjol.com\nlhjws.com\nlhjy.net\nlhjyw.vip\nlhjzlw.com\nlhkaye.com\nlhkgs.com\nlhl.zone\nlhl7.com\nlhmj.com\nlhmp.cc\nlhovoxcx.work\nlhp-cdn-game.online\nlhp-cdn-update.online\nlhpharma.com\nlhratings.com\nlhrbszb.com\nlhs-arts.org\nlhs11.com\nlhs99.com\nlhsdjxy.com\nlhsoso.com\nlhszyxx.com\nlhulan.com\nlhvlkgbkjmrnc.com\nlhwill.com\nlhwytj.com\nlhxhwl.com\nlhyc3888.com\nlhyiliao.com\nlhytgroup.com\nlhzq.com\nli-ca.com\nli-ning.com\nli-on.com\nli-world.com\nli-yuan.com\nli.auto\nli63.com\nli91.com\nliageren.com\nlian-ou.com\nlianaibiji.com\nlianaixingwei.com\nlianaiyx.com\nlianbei66.com\nlianchuang.com\nlianchuanghj.com\nliancsoft.com\nlianda.fun\nliandaomobi.com\nliandaquan.com\nliande.cc\nlianfawy.com\nlianfengqy.com\nlianfengwh.com\nliang520.com\nliangc.com\nliangchan.net\nliangchanba.com\nliangduapp.com\nliangduiban.com\nlianggao.com\nlianghuadashi.com\nliangjan.com\nliangjiangbashu.com\nliangjianghu.com\nliangjiangroup.com\nliangjiangwuye.com\nliangjihui.com\nliangjiu.shop\nliangka.vip\nliangkun.net\nliangle.com\nlianglimi.com\nlianglunshijie.com\nliangnuo.com\nliangpinbiji.com\nliangqikeji.com\nliangrisheng.com\nliangrunbio.com\nliangshunet.com\nliangtian-tech.com\nlianguowang.com\nliangwanjianshe.com\nliangwei.cc\nliangxinyao.com\nliangyi.com\nliangyi360.com\nliangyiyy.com\nliangyuan.com\nliangzhishu.com\nliangziheikeji.com\nlianhaikeji.com\nlianhanghao.com\nlianhaokeji.com\nlianhejiaju.com\nlianhengkj.com\nlianhengtec.com\nlianhepaimai.com\nlianhuangroup.com\nlianjia.com\nlianjianode.xyz\nlianjianxsw.com\nlianjiasm.com\nlianjie.in\nlianjiezhe.com\nlianjingdq.com\nlianjixia.com\nliankaa.com\nliankebio.com\nliankenet.com\nlianku.xin\nliankuaiche.com\nlianle.com\nlianli168.com\nlianlian.com\nlianlianlvyou.com\nlianlianpay-inc.com\nlianlianpay.com\nlianliantao.net\nlianliantaoshop.com\nlianlianz.com\nlianlife.com\nlianliwork.com\nlianluo.com\nlianmeng.la\nlianmeng.link\nlianmeng.work\nlianmenhu.com\nlianmishu.com\nlianni.com\nlianok.com\nlianouyiyuan.com\nlianpingroup.com\nlianpunet.com\nlianqi.net\nlianqigong.com\nliansaipiao.com\nlianshang.com\nlianshijie.com\nlianshun.cc\nliansn.com\nliansuo.com\nliantianhong.com\nliantongcar.com\nliantu.com\nliantuobank.com\nliantuofu.com\nlianty.com\nlianwangtech.com\nlianwen.com\nlianwifi.com\nlianwo8.com\nlianwwl.com\nlianxianjia.com\nlianxinapp.com\nlianxinkj.com\nlianyi.com\nlianyins.com\nlianyiwater.com\nlianyuannongye.com\nlianyungangforum.org\nlianzhixiu.com\nlianzhong.com\nlianzhongyun.com\nlianzhoupc.com\nlianzhuli.com\nlianzifang.com\nliao1.com\nliao98.com\nliaobagua.com\nliaocheng.cc\nliaochuo.com\nliaode.com.tw\nliaogu.com\nliaogx.com\nliaoing.com\nliaoji.com\nliaojiu.net\nliaokong.com\nliaoliao.com\nliaoningmoduo.com\nliaoningpharm.com\nliaosam.com\nliaotiantu.com\nliaoworking.com\nliaoxiwenhua.com\nliaoxuefeng.com\nliaoyuanchats.com\nliaoyuanedu.org\nliaozhai.tv\nliauto.com\nlib520.com\nliba.com\nliba88.com\nlibaclub.com\nlibai.com\nlibaidns.com\nlibaishuo.com\nlibao007.com\nlibaopay.com\nlibawall.com\nliberlive-music.com\nlibertynlp.com\nlibforest.com\nlibinx.com\nlibiotech.com\nlibisky.com\nliblib.art\nliblib.cloud\nliblib.tv\nlibmk.com\nlibomarathon.com\nlibreofficechina.org\nlibsou.com\nlibssh.com\nlibsys.net\nlibtop.com\nlibvideo.com\nlic-bcbc.com\nlic-slf-dom.com\nlic-slf-dom.net\nlicai.com\nlicai18.com\nlicaie.com\nlicaigc.com\nlicaike.com\nlicaiker.com\nlicaimofang.com\nlicaishouyi.com\nlicaixu.com\nlicaiyaoye.com\nlicancan.com\nlicaoz.com\nlicat.com\nlicc.tech\nlichangtai.com\nlichangtao.com\nlichangwen.net\nlichee.pro\nlichenglove.com\nlichengwu.net\nlichenjy.com\nlichimedicine.com\nlichiwei.com\nlichong.work\nlichuang.ren\nlicic.net\nlickeji.com\nlickscreen.com\nlicomsh.com\nlicqi.com\nlida100.com\nlidakang.com\nlidamicron.com\nlidar360.com\nlideapower.com\nlidebiotech.com\nlidebo.com\nlidecheng.com\nlidepower.com\nlidg-fueltank.com\nlidianchizu.com\nlidianren.com\nlidihuo.com\nliding.me\nlidlsalevipeu.shop\nlidodo.com\nlidu6.com\nlidw.com\nlie.icu\nliebao.live\nliebaoh5.com\nliebaoidc.com\nliebaopay.com\nliebaovip.com\nliebiao.com\nliebigwatch.com\nliebo.com\nliechan.com\nliedaoshou.com\nlieguo.com\nlieguozhi.com\nliehunwang.com\nliehuo.net\nliehuosoft.com\nliejin99.com\nlieju.com\nlieketao.com\nlielema.com\nliemingwang.com\nlienew.com\nliepin.com\nliepin8.com\nliepincc.com\nlierda.com\nlierdapark.com\nlierfang.com\nliermusic.com\nliesauer.net\nlieshi.net\nlieshuku.com\nlietou-edm.com\nlietou-static.com\nlietou.com\nlietou007.com\nlietuwang.com\nliewen.cc\nliewen.la\nliexing-ai.com\nliexing.com\nlieyingjt.com\nlieyou.com\nlieyouqi.com\nlieyuncapital.com\nlieyunpro.com\nlieyunwang.com\nliezhe.com\nliezhun.com\nlif8.com\nlifan.com\nlife-2028sport.com\nlifebook.red\nlifediary.shop\nlifeeu.com\nlifefunkingdom.org\nlifegc.com\nlifegreenmedical.com\nlifeng.in\nlifengshoe.com\nlifeofguangzhou.com\nlifesense.com\nlifetimecables.com\nlifetm.com\nlifetmt.com\nlifetmt.net\nlifetmt.org\nlifeup.vip\nlifevc.com\nlifevccdn.com\nlifeweeker.com\nlifeyk.com\nlifeyn.net\nlifezb.com\nlifo-fj.com\nlifotronic.com\nlifox.net\nlifrog.com\nlifushop.com\nlifves.com\nlify.vip\nligendpower.com\nligetz.com\nlighos.com\nlight-cos.com\nlight-player.com\nlight3moon.com\nlightalk.com\nlightalk.me\nlightblue.net\nlightbox.games\nlighte-tech.com\nlightgx.com\nlighthg.com\nlighting-china.net\nlightingchina.com\nlightinit.com\nlightky.com\nlightlygame.com\nlightmake.site\nlightonus.com\nlightpassport.com\nlightsaber.com\nlightspeed-dc.com\nlightspeed-lic.com\nlightspeed-og.com\nlightstrade.com\nlightxi.com\nlightyy.com\nligonggong.com\nliguanchina.com\nliguangtaogroup.com\nliguosong.com\nlih-invest.com\nlihang-expo.com\nlihaoshuyuan.com\nliheiat.xyz\nliheng1688.com\nlihengjh.com\nlihetong.com\nlihong.net\nlihongcctv.com\nlihtao.com\nlihua.com\nlihuadonghua.com\nlihuamuye.com\nlihuashouji.com\nlihuasoft.net\nlihui.net\nlihuia.com\nlihun66.com\nliigou.com\nlijiabaijc.com\nlijiabrasstube.com\nlijiajia.com\nlijiajia.net\nlijiangbooks.com\nlijiangcun.com\nlijiangriver.com\nlijiankai.com\nlijiejiaju.com\nlijigang.com\nlijinghua.club\nlijingquan.net\nlijinxincai.com\nlijinzhang.com\nlijishi.com\nlijizhong.com\nlijjj.com\nlikamao.com\nlikangwei.com\nlike.video\nlike996.icu\nlikeaboat2023.com\nlikeacg.com\nlikebuy.com\nlikecha.com\nlikechuxing.com\nlikecs.com\nlikee.video\nlikeface.com\nlikefar.com\nlikefont.com\nlikeji.net\nlikejianzhan.com\nlikelic.com\nlikepoems.com\nlikeshare-tech.com\nlikeshuo.com\nliketm.com\nliketry.com\nliking.site\nlikingfit.com\nlikuli.com\nlikuso.com\nlilacbbs.com\nlilaigroup.com\nlilanz.com\nlili.cc\nliliangji.com\nlilinwei.com\nlilishare.com\nlilisi.com\nlilith.com\nlilithgame.com\nlilithgames.com\nlilvb.com\nlilygo.cc\nlilysamericandiner.com\nlimabaoxian.com\nlimaoqiu.com\nlimebenifit.com\nlimei.com\nlimei.org\nlimeiltd.com\nlimian.com\nliminglight.com\nlimingtech.com\nliminjie714.com\nliminwang.com\nlimit-animation.com\nlimless.com\nlimobai.com\nlin-jiang.com\nlinakesi.com\nlinancity.com\nlinaoyiqi.com\nlinban.com\nlinchangyu.com\nlinchuangsy.com\nlincoc.com\nlindapatent.com\nlinde-china.com\nlindmik.com\nlindybag.com\nline-gate.com\nlinearbuyic.com\nlinearmotor.net\nlineartracklight.com\nlinecg.com\nlineget.site\nlinekong.com\nlinelayout.com\nlinestartech.com\nlinewell.com\nlinewow.com\nlinezing.com\nlinfan.com\nlinfeicloud.com\nlinfen365.com\nlinfeng.tech\nlinfenwater.net\nling-shi.com\nlingangholding.com\nlingangic.com\nlingaoren.com\nlingbao-e.com\nlingboxauto.com\nlingceu.com\nlingd.com\nlingdi.net\nlingdianksw.com\nlingdong.net\nlingdongweilai.com\nlingdongwuliu.com\nlingdu.love\nlingduan-sh.com\nlingduohome.com\nlingdz.com\nlingfengyun.com\nlingganjia.com\nlinggao.vip\nlinggu.com\nlinghanggroup.com\nlinghit.com\nlinghitai.com\nlinghonggroup.com\nlinghua-logistics.com\nlinghuidzsw.com\nlinghuoai.com\nlingji666.com\nlingjiaocheng.com\nlingjing.com\nlingjiptai.com\nlingjoin.com\nlingjuad.com\nlingjumobile.com\nlingkaba.com\nlingkebang.com\nlingkou.com\nlingkou.xyz\nlingkuyun.com\nlingla.com\nlinglingkaimen.com\nlinglingmo.site\nlinglong.dev\nlinglongart.com\nlinglonglife.com\nlinglongtech.com\nlingmao.tech\nlingmeijie.com\nlingmeng888.com\nlingmovie.com\nlingnanpass.com\nlingo-ace.com\nlingodeer.net\nlingosail.com\nlingostarcdn.com\nlingowhale.com\nlingphone.net\nlingquanb.com\nlingqumall.com\nlingrengame.com\nlingrn.com\nlingruipc.com\nlingruofeng.com\nlingshangkaihua.com\nlingshangmeien.com\nlingshenxing.com\nlingshenxl.com\nlingshi.com\nlingshimiyu.com\nlingshou.com\nlingshulian.com\nlingshunlab.com\nlingsiqiwu.com\nlingsky.com\nlingsoul.com\nlingti.com\nlingtiao.com\nlingtingmusic.com\nlingtings.com\nlingtong.info\nlingtool.com\nlingtu.com\nlingtuan.com\nlingumob.com\nlinguoguang.com\nlingw.net\nlingwe.com\nlingwh.com\nlingwu66.com\nlingxi360.com\nlingxianfund.com\nlingxicloud.com\nlingxigames.com\nlingxing.com\nlingxingcai.com\nlingxingkj.com\nlingxiuwenlv.com\nlingxmall.com\nlingy.cc\nlingyanghuyu.com\nlingyi.org\nlingyihanhua.com\nlingyiitech.com\nlingyiliebian.com\nlingyinsi.com\nlingyinsi.org\nlingyiwanwu.com\nlingyuan.design\nlingyue-digital.com\nlingyuecloud.com\nlingyuedianzi.com\nlingyuint.com\nlingyun.com\nlingyun.net\nlingyun5.com\nlingyuncw.com\nlingyunip.com\nlingyunquan.com\nlingyuok.com\nlingzhanwenhua.com\nlingzhilab.com\nlingzhitech.com\nlingzhtech.com\nlinhaigroup.com\nlinhaiwangdai.com\nlinhao.net\nlinhuatz.com\nlinhuiba.com\nlining.com\nlining0806.com\nlinjia.me\nlinjieapp.com\nlinjin.net\nlinjunlong.com\nlink-ai.tech\nlink-nemo.com\nlink-trans.com\nlink27.com\nlink2lib.com\nlink2shops.com\nlink3.cc\nlinkadsapi.com\nlinkbook.tech\nlinkbroad.com\nlinkbux.com\nlinkchant.com\nlinkchina.hk\nlinkcubecloud.net\nlinkdesign.tech\nlinkdialy.com\nlinkeabc.com\nlinkease.com\nlinked-f.com\nlinked-reality.com\nlinkedbyx.com\nlinkedhope.com\nlinkedin-event.com\nlinkedkeeper.com\nlinkedme.cc\nlinkedsee.com\nlinker.cc\nlinkernetworks.com\nlinkeye.net\nlinkfinancier.com\nlinkflowtech.com\nlinkfruits.com\nlinkfunny.com\nlinkgou.com\nlinkh5.com\nlinkh5.xyz\nlinkhaitao.com\nlinkheer.com\nlinkiebuy.com\nlinkingcloud.com\nlinkist.net\nlinknewideas.com\nlinkoing.com\nlinkolder.com\nlinkon.me\nlinkontek.com\nlinkpai.com\nlinkpro.tech\nlinkr.com\nlinkrall-trk.com\nlinkresearcher.com\nlinks-china.com\nlinksdao.com\nlinksfield.net\nlinksgood.com\nlinkshop.com\nlinksoon.net\nlinkstars.com\nlinkstec.com\nlinksunet.com\nlinktech.hk\nlinktom.com\nlinktom.net\nlinktree.vip\nlinktt.com\nlinkunbin.com\nlinkunjc.com\nlinkvans.com\nlinkvfx.com\nlinkwebll.com\nlinli580.com\nlinlikuaipao.com\nlinliyz.com\nlinlongnewmaterials.com\nlinlongyun.com\nlinlongyx.com\nlinmi.cc\nlinmujianghome.com\nlinni.com\nlinnsea.com\nlinnxin.com\nlinnyou.com\nlinovel.net\nlinovelib.com\nlinoya.com\nlinpx.com\nlinqujob.com\nlinqumarathon.com\nlinruanwangluo.com\nlins-bros.com\nlinshang.com\nlinshaoqian.work\nlinshi.cc\nlinshigong.com\nlinshimuye.com\nlinshiyongling.com\nlinsn.com\nlinstitute.net\nlint2.com\nlintai.tech\nlintaicnc.com\nlintcode.com\nlintec-china.com\nlintey.com\nlintongrc.com\nlintonpharm.com\nlintui.com\nlinuo-paradigma.com\nlinuo.com\nlinuopv.com\nlinuoshi.com\nlinuottc.com\nlinux-code.com\nlinux-ren.org\nlinux.zone\nlinux178.com\nlinux265.com\nlinux5.net\nlinuxba.com\nlinuxbaike.com\nlinuxbaodian.com\nlinuxboy.net\nlinuxcool.com\nlinuxde.net\nlinuxdiyf.com\nlinuxdot.net\nlinuxea.com\nlinuxeden.com\nlinuxeye.com\nlinuxgogo.com\nlinuxidc.com\nlinuxidc.net\nlinuxjoy.com\nlinuxmi.com\nlinuxpanda.tech\nlinuxpk.com\nlinuxprobe.com\nlinuxsir.com\nlinuxso.com\nlinuxtone.org\nlinuxyunwei.com\nlinuxyw.com\nlinwushuang.fun\nlinx-info.com\nlinyafeng.com\nlinyang.com\nlinyekexue.net\nlinyi.net\nlinyibus.net\nlinyiren.com\nlinyizhizhiyuan.com\nlinyouquan.net\nlinyufan.com\nlinzhou.store\nlinzhuotech.com\nlinzhuxin.com\nlinzihy.com\nlion1ou.tech\nlionaka.com\nlionit.net\nlionkingsoft.com\nlionmac.com\nlionmobo.com\nlionmobo.net\nlionsgx.com\nlipian.com\nlipiji.com\nlipilianghang.com\nlipin.com\nlipin51.com\nlipind.com\nlipinduihuan.com\nlipro.com\nlipro.net\nlipu.net\nlipuhome.com\nlipush.com\nlipuxixi.com\nliqinet.com\nliqinyi.com\nliquan.com\nliqucn.com\nliquidnetwork.com\nliqun.org\nliqun.vip\nliquncommercialgroup.com\nliqungroup.com\nliqunshop.com\nliqwei.com\nlirenliye.com\nliriansu.com\nliriji.com\nlirui.name\nlis99.com\nlisdn.com\nlisenergy.com\nlisheng.gold\nlishengstone.com\nlishi-test.com\nlishi6.com\nlishi7.com\nlishibk.com\nlishibu.com\nlishichunqiu.com\nlishicloud.com\nlishiip.com\nlishiming.net\nlishimingren.com\nlishixiaozhi.com\nlishixinzhi.com\nlishizhishi.com\nlishuhang.me\nlishuhao.ltd\nlishui.com\nlishuichayuan.com\nlisigroup.com\nlisihouseware.com\nlisizhang.com\nlisp123.com\nlissgx.com\nlistary.net\nlistarypro.com\nlisteneer.com\nlisteningo.com\nlistenpa.com\nlistentide.com\nlistentoworld.com\nlistenvod.com\nlistno1.com\nlistong.com\nlisure.com\nlisz.me\nlitangkj.com\nlitaow.com\nlitaparking.com\nlitchiads.com\nlitchon.com\nlite-miniprogram-1.com\nlite-miniprogram-5.com\nlitecdncname.com\nlitecoin.ink\nlitecoin.ren\nlitefeel.com\nlitemob.net\nliteng-industry.com\nlitessl.com\nlithomaterial.com\nlithub.cc\nlitian268.com\nlitianchina.com\nliticool.club\nlitilala.site\nlitilala.xyz\nlititop.group\nlitiww.mobi\nlitofu.com\nlitongsupply.com\nlitongtech.com\nlitosim.com\nlitree.com\nlitten.me\nlittle-star.love\nlittle-sun.com\nlittleboy.net\nlittlegeek.work\nlittlehero.xyz\nlittleqiu.net\nlittleroost.net\nlittlesheep.com\nlittlesix.mobi\nlittlesproutsdk.com\nlittleswan.com\nlituo666.com\nliu-he.com\nliu-kevin.com\nliu16.com\nliuar.xin\nliubaocha.com\nliucao.vip\nliuchengguanli.com\nliuchengming.com\nliuchengtu.com\nliuchengtu.net\nliuchenkeji.com\nliuchuo.net\nliudanking.com\nliudaoxiang.com\nliudatxt.com\nliudatxt.org\nliudayadan.com\nliudian6.com\nliudon.com\nliudon.org\nliudu.com\nliufanggroup.com\nliugejava.com\nliugezhou.online\nliugj.com\nliugm.com\nliugong.com\nliugongac.com\nliugongam.com\nliugonggroup.com\nliuguofeng.com\nliuhanyu.com\nliuhaolin.com\nliuhubang.com\nliujiagd.com\nliujiajia.me\nliujian666.com\nliujiangblog.com\nliujiaoyidai.com\nliujijun.com\nliujinkai.com\nliujto.com\nliujunworld.com\nliujy.com\nliukai.net\nliukebao.com\nliulan.net\nliulanqi.net\nliulantao.com\nliulian.com\nliulianga.com\nliuliangcanmou.com\nliuliangdada.com\nliulianggo.com\nliuliangguo.com\nliuliangka.pro\nliulianglf.com\nliuliangmima.club\nliuliangmima.vip\nliuliangzu.com\nliulianqi123.com\nliuliguo.com\nliulin.cc\nliulishuo.com\nliulishuo.work\nliulisyb.org\nliuliushe.net\nliulixuexiao.com\nliulj.com\nliulv.net\nliumapp.com\nliumeinet.com\nliuming.work\nliumuzulin.com\nliumx.com\nliunian.info\nliunianbanxia.com\nliunn.com\nliuqh.icu\nliurq.com\nliushen.fun\nliushidong.com\nliushuishiyin.com\nliusibo.com\nliusteel.com\nliusu-kyimm.com\nliusu.me\nliusuping.com\nliuts.com\nliuwamiaoji.com\nliuweihotel.com\nliuwo.com\nliuxianan.com\nliuxianjt.com\nliuxiaoer.com\nliuxiaofan.com\nliuxiaotong.com\nliuxing.com\nliuxingw.com\nliuxinli.com\nliuxuchao.com\nliuxue.com\nliuxue114.com\nliuxue360.com\nliuxue86.com\nliuxuegang.site\nliuxuehr.com\nliuxuekw.com\nliuxuesmd.com\nliuxuetown.com\nliuxuewind.com\nliuxueyun.com\nliuxx.com\nliuyang.com\nliuyangfcw.com\nliuyangjob.com\nliuyanzhao.com\nliuyifei.cc\nliuyiguo.com\nliuyimin4.com\nliuyixiang.com\nliuyua.xyz\nliuyunflow.com\nliuyunliumeng.com\nliuyuntian.com\nliuzaoqi.com\nliuzhihang.com\nliuzhixiang.com\nliuzhiyugzs.com\nliuzhosoft.com\nliuzhoufushan.com\nliuzhoukaichuang.com\nliuzhourm.com\nliuzhousteel.com\nliuzhuni.com\nliuziyoudu.com\nliuzongyang.com\nliuzy88.com\nlivanauto.com\nlive-flashscore.com\nlive-helps.com\nlive-qiudidai.com\nlive-ssport.com\nlive-voip.com\nlive123.cc\nlive800.com\nliveapp.ink\nlivebong68.com\nlivecdnstatic.com\nlivechina.com\nlivecourse.com\nlivehwc4.com\nliveinau.com\nlivejh.com\nliveme.com\nlivemediav.com\nlivemook.com\nlivenmall.com\nliver-surgery.net\nlivesone.net\nlivesupport24x7.com\nliveuc.net\nliveupdate-cn.msi.com\nlivevideostack.com\nliving.ai\nlivnj.com\nlivotre.com\nliwai.com\nliwanggui.com\nliwanght.com\nliweiauto.com\nliweicar.com\nliweijia.com\nliweijituan.com\nliweiliang.com\nliwenzhou.com\nliwi.cc\nliwinon.com\nliwojx.com\nliwoxiao.com\nliwucheng.com\nliwumaoapp.com\nliwushuo.com\nliwuzhi.art\nlixcx.com\nlixfaf.com\nlixiaedu.com\nlixiang.com\nlixianghuanbao.com\nlixiangoa.com\nlixiangshu.net\nlixianhezi.com\nlixianhua.com\nlixiaocrm.com\nlixiaolu.org\nlixiaoskb.com\nlixiaoyun.com\nlixiaozhe.com\nlixinapp.com\nlixinger.com\nlixingyong.com\nlixinpharm.com\nlixuan360.com\nlixueba.com\nlixueduan.com\nlixuejiang.com\nliyan365.com\nliyang1.com\nliyangbit.com\nliyanggroup.com\nliyangic.com\nliyangrc.com\nliyangtuopan.com\nliyanmobi.com\nliyaochao.com\nliyegroup.com\nliyi99.com\nliyinewmaterial.com\nliyingfei.com\nliyinka.com\nliyu8.com\nliyuan1999.com\nliyuan99.com\nliyuan99.vip\nliyuanchun.net\nliyuanheng.com\nliyuanhospital.com\nliyuanresort.com\nliyuansz.com\nliyugang.com\nliyujn.com\nliyunde.com\nliyunkm.com\nliyunshuwu.com\nliyuplay.com\nliyx.fun\nliyx.net\nlizaberese.com\nlizaike.com\nlizhehaozhongyi.com\nlizhenauto.com\nlizhenglai.com\nlizhenwang.com\nlizhi.com\nlizhi.fm\nlizhi.io\nlizhi.shop\nlizhi110.com\nlizhifilm.com\nlizhifm.com\nlizhiinc.com\nlizhijitang.com\nlizhilive.com\nlizhiqi.com\nlizhiqiang.name\nlizhiqp.com\nlizhiweike.com\nlizhongyi.com\nlizhujue98.com\nlizi.com\nlizihang.com\nlizikeji.vip\nlizilaw.com\nliziqiche.com\nlizitongxue.com\nliziwu.net\nliziyuan.com\nlizq.host\nlj-audio.com\nlj-bank.com\nlj168.com\nljbao.net\nljbbj.com\nljcdn.com\nljclz.work\nljflavor.com\nljh.cool\nljhjgc.com\nljhjny.com\nljia.com\nljia.net\nljjcyy.com\nljjlb.net\nljjq.com\nljjyjt.com\nljk.cc\nljkangyang.com\nljlcd.com\nljlj.cc\nljlmdns.com\nljlqw.com\nljmeng.site\nljmyy120.com\nljqhju.com\nljqxjjhbc.com\nljrbw.com\nljs.fun\nljsdk.com\nljsy2017.com\nljsz.xyz\nljth.hk\nljtx.com\nljw113.com\nljwebs.com\nljwit.com\nljwlz.com\nljxqzy.com\nljxww.com\nljz-talentapt.com\nljzfin.com\nlk-jd.com\nlk0355.com\nlk361.com\nlk366.com\nlkalpos.com\nlkcash.com\nlkcgyl.com\nlkchemical.com\nlkcoffee.com\nlkdt.work\nlke.hk\nlkfan.com\nlkg888.com\nlkgame.com\nlkgk.net\nlkgshq.com\nlkhaowu.com\nlki2.org\nlkjujm.com\nlkkbrand.com\nlkkcdn.com\nlkkdesign.com\nlkker.com\nlkkued.com\nlkme.cc\nlknvcti.com\nlkong.com\nlkong.net\nlkpc.com\nlkqihang.com\nlksmarttech.com\nlkssite.vip\nlkszj.info\nlktz.net\nlkuaiy.com\nlkxfeda.com\nlkyljt.com\nlkyou.com\nll-hao123.com\nll1024.com\nll5856.com\nllang.net\nllaoyou.com\nllbzy.com\nllcat.tech\nlldlf.com\nllever.com\nllewan.com\nllgjx.com\nllgkm.com\nllguandongyan.com\nllguangli.com\nllguangli30.com\nllhlkftzjt.com\nllidc.com\nllinkslaw.com\nlljgame.com\nlljsq.net\nlljyx.com\nllku.com\nlllcn.com\nllllx7.com\nlllpv.com\nllmtrend.com\nllmworld.net\nllongwill.com\nllqsq.com\nllrj.net\nllrsz.com\nlls.moe\nlls11100ko.com\nllsapp.com\nllscdn.com\nllskjt.com\nllsops.com\nllsserver.com\nllssite.com\nllsttapp.com\nllsun.com\nlltoken.com\nlltskb.com\nllumar-cn.com\nllwx.net\nllx168.com\nllxj119.com\nllxx.cc\nllxzl.com\nllxzu.com\nllyj.net\nllyweb.com\nllyy.org\nllyyx.com\nllzg.com\nllzxedu.net\nlm263.com\nlm335.com\nlm9999.com\nlmacc.com\nlmanmo.com\nlmanucell.com\nlmbct.com\nlmbest.com\nlmdouble.com\nlmengcity.com\nlmjtgs.com\nlmjx.net\nlmjzd.com\nlmkggf.com\nlmkzx.com\nlmlc.com\nlmlq.com\nlmnano.com\nlmnsaas.com\nlmonkey.com\nlmparcel.com\nlmqt.com\nlms.pub\nlmschina.net\nlmscp.com\nlmtutou.com\nlmtw.com\nlmu5.com\nlmujp.work\nlmwlhh.com\nlmwljz.com\nlmwmm.com\nlmylgs.com\nlmzitie.com\nlmzt.com\nln-map.com\nln-rc.com\nln525.com\nlnairport.com\nlnamphp.com\nlnast.net\nlnbaiyun.com\nlnbdsc.com\nlnbybc.com\nlnbyy.net\nlncbp.com\nlncct.com\nlncjxy.com\nlncldapi.com\nlncmcc.com\nlncmxy.com\nlncnw.com\nlnddhxq.com\nlndhdx.com\nlndnw.com\nlndwkj.com\nlndxpt3.com\nlndxptssl.com\nlneab.com\nlnemci.com\nlnenergy.net\nlnes.net\nlnest.com\nlnfdcxh.org\nlnfssy.com\nlnfzb.com\nlngche.com\nlngwy.org\nlnhddq.com\nlnhotels.com\nlnhygy.com\nlnicc-dl.com\nlnicp.com\nlninfo.com\nlnjfyc.com\nlnjmlnykjfzyxzrgs.com\nlnjpedu.com\nlnjzxy.com\nlnk0.com\nlnkdjt.com\nlnlawyers.net\nlnlc2.net\nlnldsw.com\nlnlib.net\nlnlon-zdh.com\nlnlotto.com\nlnme1q1qa.com\nlnmtc.com\nlnmu3h.com\nlnnoo.com\nlnok.net\nlnpatcm.com\nlnpenger.com\nlnphar.com\nlnpjw.com\nlnqwe.com\nlnrbxmt.com\nlnrcu.com\nlnrsks.com\nlnsenhai.com\nlnsent.com\nlnsgczb.com\nlnsqxj.xyz\nlnsrmyy.com\nlnsslhyxh.com\nlnsyzx.com\nlnszyjt.com\nlntenghui.com\nlntvu.com\nlntycp.com\nlnvipsoft.com\nlnwish.com\nlnwoo.com\nlnxmt.com\nlnxysf.com\nlnyahui.com\nlnydjt.com\nlnyxcj.com\nlnyyzyxy.com\nlnzcj.com\nlnzhongka.com\nlnzhqy.com\nlnzsks.com\nlnzy-edu.com\nlnzzpf.com\nlo97.com\nloac.cc\nloadingbay.com\nloansliml.com\nlocal-ip.online\nlocal.hk\nlocalxcafe.com\nlocatran.com\nlocez.com\nlocimg.com\nlockchat.app\nlockfans.com\nlockin.com\nlockinchina.com\nlocklauncher.com\nlockscreenimg.com\nlocnavi.com\nlocojoy.com\nlocoy.com\nlocoyposter.com\nlocren.com\nloctek.com\nlocvps.com\nlocvps.net\nlodashjs.com\nloexu.com\nloftcn.com\nlofter.com\nloftshine.com\nlofu.net\nlog-research.com\nlog1992.com\nlogacg.com\nlogclub.com\nlogdmentincomepay.sbs\nlogi.im\nlogi100.com\nlogicdsp.com\nlogin.cdnetworks.com\nlogiseasy.com\nlogisteed-sc.com\nlogistics-ea.com\nlogisticstech.com\nlogo-emblem.com\nlogo123.net\nlogo2008.net\nlogo888.com\nlogo9.net\nlogoaa.com\nlogobiaozhi.com\nlogodao.com\nlogodashi.com\nlogohhh.com\nlogoly.pro\nlogoqq.com\nlogory.com\nlogoshe.com\nlogosheji.com\nlogoshejishi.com\nlogosj.com\nlogovps.com\nlogowk.com\nlogozhizuowang.com\nlogwing.com\nlogwirecloud.com\nlohaa.com\nlohalink.com\nlohand.com\nlohasor.com\nlohjs.com\nlohkahhotels.com\nloho88.com\nlohu.info\nloj.ac\nloji.com\nloke123.com\nlokenchem.com\nlokyi.name\nlol99.com\nlolaroseglobal.com\nlolbuku.com\nloldan.com\nloldk.com\nloli.by\nloli.cloud\nloli.ee\nloliapi.com\nlolicon.team\nloliloli.moe\nloliloli.net\nlolimoe.cc\nlolitawardrobe.com\nloljy.com\nlolkeng.com\nlollipopo.com\nlolmax.com\nlolmf.com\nlolmz.com\nlolopool.com\nlolphp.com\nloltmall.com\nlolxy.com\nlolyculture.net\nlomge.com\nlomoment.com\nlomon.com\nlomowo.com\nloncent.com\nloncin.com\nloncinindustries.com\nlonderful.com\nlondonermacaoresort.com\nlonelystar.org\nlonery.com\nlonfoor.com\nlong-horn.com\nlong-photo.com\nlong-term.net\nlong.ge\nlong5.com\nlong7.com\nlonganlaw.com\nlongau.com\nlongbenren.com\nlongbridgeapp.com\nlongbridgehk.com\nlongcai.com\nlongcai027.com\nlongchangjixiekeji.com\nlongcheer.com\nlongchunbajiao.com\nlongclouds.com\nlongcore.com\nlongdameishi.com\nlongdaoyun.com\nlongde.com\nlongdear.com\nlongdear.net\nlongdian.com\nlongdiandianli.com\nlongduwang.com\nlongease.net\nlongfanshipping.com\nlongfengmarathon.com\nlongfor.com\nlongfu360.com\nlongguanjia.so\nlonghan.cc\nlonghoo.net\nlonghorn-auto.com\nlonghu.net\nlonghua.net\nlonghuafilm.com\nlonghufengyun.com\nlonghuiren.com\nlonghuquan.com\nlonghuvip.com\nlongi.com\nlongigroup.com\nlongjcun.com\nlongjiazuo.com\nlongjisteel.com\nlongjisz.com\nlongjitour.com\nlongjoy.net\nlongjunjiayuan.com\nlongk.com\nlongkui.site\nlongkunjituan.com\nlongkuntech.com\nlonglijituan.com\nlonglingas.com\nlongliqicom.com\nlongluo.me\nlonglycn.com\nlongmaosoft.com\nlongmarchspace.com\nlongmaywuliu.com\nlongmeicn.com\nlongmen-pharma.com\nlongmen.net\nlongmenedutech.com\nlongmeng.com\nlongmenshuju.com\nlongming.com\nlongmingdns.com\nlongnanke.com\nlongo.ltd\nlongoo.com\nlongood.com\nlongpokeji.com\nlongquan-baojian.com\nlongquecdn.com\nlongre.com\nlongrich.com\nlongsailing.net\nlongsan.com\nlongshanchemical.com\nlongshangrc.com\nlongsheng.com\nlongsheng988.com\nlongshine.com\nlongsok.com\nlongsto.com\nlongstonechina.com\nlongsunhd.com\nlongsys.com\nlongtaifoods.com\nlongtec.com\nlongtugame.com\nlongtuojixie.com\nlongu.com\nlongwangshipin.com\nlongwaycabinet.com\nlongwenedu.com\nlongwiki.org\nlongwin.org\nlongwintoys.com\nlongwisedata.com\nlongwisepr.com\nlongwx.com\nlongxi-tech.net\nlongxia.com\nlongxianwen.net\nlongxinfa.com\nlongxinglong.com\nlongxinli.com\nlongxintec.com\nlongxuan.ren\nlongyanbus.com\nlongyar.com\nlongygo.com\nlongyi-uav.com\nlongyin.net\nlongyinok.com\nlongyistudio.com\nlongyiyy.com\nlongyu.cc\nlongyucq.com\nlongyuedu.com\nlongyuegs.com\nlongyusheng.org\nlongyutec.com\nlongzhou.cc\nlongzhu.com\nlongzhu.tv\nlongzhudagroup.com\nlongzhulive.com\nlonhcloud.net\nlonleaf.com\nlonlife.org\nlonmedcn.com\nlonsoon.com\nlontengsteel.com\nlontiumsemi.com\nlontrue.com\nlonyon.com\nloocall.com\nloocode.com\nloodd.com\nlooeen.com\nlooeo.com\nlooeoo.com\nloogoo.com\nloohuo.com\nlooioo.com\nlookae.com\nlookao.com\nlookbaby.com\nlookbravo.com\nlookchem.com\nlookgame.com\nlooking-car.com\nlookr.cc\nlooktm.com\nlooktmt.com\nlookvin.com\nloome.net\nloonapp.com\nloong3d.com\nloongdriving.com\nloongnix.com\nloongnix.org\nloongon.com\nloongshine.com\nloongsin.com\nloongson.org\nloongsonclub.com\nloongtravel.com\nloongxy.com\nloonlog.com\nlooooker.com\nloooooong.com\nlooquan.com\nloorin.com\nloovee.com\nlooyu.com\nlooyuoms.com\nlooyush.com\nlopetech.net\nloping151.site\nlopmall.com\nlopss.com\nlopwon.com\nlordabbettchina.com\nlorefree.com\nlorhf.com\nloring.xyz\nlorzeal-zj.com\nlosergogogo.com\nlossyou.com\nlostdeer.xyz\nlostphp.com\nlostsakura.com\nlot-ml.com\nlotevision.com\nlotianshangx.com\nlotlab.org\nlotour.com\nlotour.net\nlotpc.com\nlotpen.com\nlotsmv.com\nlottery-sports.com\nlotusair.net\nlotusdata.com\nlotuseed.com\nlotut.com\nloubobooo.com\nlouding.com\nloudseas.com\nlouge.ltd\nlouislivi.com\nlouisvuittonbags.club\nloukky.com\nloulanwang.com\nloupan.com\nlouruo.com\nloushi.com\nlousj.com\nlousw.com\nlouyue.com\nlovcuty.com\nlove-freedom.com\nlove-math-edu.com\nlove.tv\nlove21cn.com\nlove3721.com\nlove5201314.net\nlove5209420.com\nlove85g.com\nloveabc.net\nlovean.com\nloveapp.com\nlovebizhi.com\nlovedword.com\nloveforvenus.com\nlovefree.cc\nlovehaimi.com\nlovehhy.net\nlovehifi.com\nloveifgames.com\nloveinhere.com\nloveinhtw.com\nlovejavascript.com\nlovejia.win\nlovelacelee.com\nlovelian.com\nloveliao.com\nlovellacountry.com\nlovelyping.com\nlovelytooth.com\nlovemojito.com\nlovengame.com\nloveniwed.com\nloveota.com\nloveota.net\nlovepd.com\nloverdoor.com\nlovesec.com\nloveshang.com\nlovesoo.org\nlovestu.com\nlovetan.net\nloveteemo.com\nloveu.life\nloveuav.com\nlovev.com\nlovevibe1.com\nlovewith.me\nlovfp.com\nlovgiin.com\nlovingedmond.com\nlovol.com\nlovology.com\nloxpo.com\nloyalvalleycapital.com\nloyar.com\nloyi.net\nloyo.cc\nloystnetwork.com\nlp.fyi\nlp023.com\nlp025.com\nlp1901.com\nlp91.com\nlpaec.com\nlpcheng.com\nlpcues.com\nlpd8888.com\nlpetl.com\nlpfile.com\nlpgjkd.com\nlph119.com\nlpllol.com\nlpmas.com\nlpou.online\nlppz.com\nlppzimg.com\nlpq1688.com\nlprcx.com\nlprogram.site\nlpsckf.com\nlpsign88.com\nlpspt.com\nlpswz.com\nlpszstv.com\nlptiyu.com\nlpxinjuhui.com\nlpxinke.com\nlpxt.com\nlpxuqi2057.vip\nlpzine.com\nlq5u.com\nlqaafgq.com\nlqabr.com\nlqbby.com\nlqbj.com\nlqbj66.com\nlqfeather.com\nlqgy.com\nlqhualang.com\nlqjob88.com\nlqjt.com\nlqjyw.net\nlqlst.com\nlqpos.vip\nlqqm.com\nlqrcb.com\nlqsbcl.net\nlqschool.net\nlqsilicon.com\nlqtzjy.com\nlqwang.com\nlqxcl.com\nlqxshop.com\nlqxyljt.com\nlqyaopin.com\nlqyfsx.com\nlqyqjt.com\nlqzh.me\nlqzp.com\nlqzwdj.com\nlr-amm.com\nlr-link.com\nlr8888.com\nlrc99.com\nlrcb.net\nlrceu.com\nlrcku.com\nlrdcq.com\nlrhold.net\nlricn.com\nlrist.com\nlrkdzx.com\nlrkj.net\nlrlz.com\nlrmation.com\nlrnya.com\nlrs001.com\nlrscloud2.com\nlrscloud3.com\nlrswl.com\nlrt-tech.com\nlrts.me\nlrvin.com\nls-doll.com\nls-gb.com\nls-hospital.com\nls.link\nls0358.com\nls0513.com\nls102.com\nls1935.com\nls520.net\nls605.com\nls666.com\nlsbankchina.com\nlsbchina.com\nlsbin.com\nlsbj365.com\nlsbtly.com\nlsccb.com\nlscstz.com\nlscsw168.com\nlsdfood.com\nlsdjwl.com\nlsdzk.com\nlserp.com\nlsfcj.com\nlsfwpt.com\nlsfyw.net\nlsgenius.com\nlsgqys.com\nlsgrandtheatre.com\nlsgw.com\nlsgwebmall.com\nlsgzn.com\nlsh-cat.com\nlshdw.cc\nlshfreda.com\nlshitv.com\nlshou.com\nlshzj.com\nlsij3km.com\nlsit.net\nlsjgcx.com\nlsjiancai.com\nlsjkj.com\nlsjlp8.com\nlsjnwxly.com\nlsjo.com\nlsjrcdn.com\nlsjtjs.com\nlsjxck.com\nlsjxww.com\nlskejisoft.com\nlskem.com\nlskj1993.com\nlskjkf.com\nlskong.com\nlsldjyw.com\nlslfs.com\nlslgzn.com\nlslihai.com\nlsmaps.com\nlsmtjy.com\nlsmzt.cc\nlsnm.com\nlsoos.com\nlspjy.com\nlsplayer.com\nlsqcjjt.com\nlsqedu.com\nlsqmx.com\nlsqpay.com\nlsqqy.com\nlsqv.com\nlsqx.com\nlsqy398.com\nlsrbs.net\nlsrfzy.com\nlsrmyy.com\nlssdexternal.com\nlssggzy.com\nlssjt.com\nlsswjt.com\nlsszgh.com\nlst1000.com\nlstazl.com\nlstest.com\nlstt-app.com\nlsttapp.com\nlsttappmoney.com\nlsttapppro.com\nlsttappspace.com\nlsttappweb.com\nlsttappworks.com\nlsttmoney.com\nlsttnews.com\nlsttonline.com\nlsttpro.com\nlsttrich.com\nlsttweb.com\nlsttworks.com\nlstx.vip\nlsun.net\nlsuoled.com\nlsup.net\nlswfw.com\nlswgy.com\nlswld.com\nlswqw.com\nlsxrmtzx.com\nlsxuantong.com\nlsxxkj.net\nlsyart.com\nlsyhh.com\nlsys2002.com\nlszi.net\nlszj.com\nlszjy.com\nlszjyj.com\nlsznk.com\nlsznkyy.com\nlszp.cc\nlszyy.net\nlszzg.com\nlt-edu.net\nlt-info.net\nlt-shanghai.com\nlt-tree.com\nlt-uv.com\nlt3c.com\nlt7293333.com\nltaaa.com\nltaaa.net\nltao.com\nltd.com\nltdcdn.com\nltdspot.com\nltesting.net\nltfwzs.com\nltggc.com\nltggzy.com\nltgtm.com\nlth.xyz\nlthqdl.com\nltidc.com\nltie.org\nltimg.net\nltjczx.com\nltjianhe.com\nltkgjt.com\nltkqjt.com\nltl5210.com\nltld.net\nltly.so\nltnic.com\nltoit.com\nltp-cloud.com\nltp.ai\nltplighting.com\nltpower.net\nltsbbs.com\nltsc.vip\nltsf.com\nltsj2005.com\nltski.com\nltswxy.com\nlttconn.com\nlttmgc.com\nlttvip.com\nltwkw.com\nltwy.com\nltxbbs.com\nltxjob.com\nltxsw.co\nltxxgcxx.com\nltxys.com\nlty.fun\nltyears.com\nltzsjt.com\nltzxw.com\nltzz666.com\nlu.com\nlu0.com\nlu17996.com\nlu35.com\nlua.ren\nlua99.com\nluan.ma\nluan163.com\nluaninfo.com\nluanren.com\nluanup.com\nluanwater.com\nluanxian114.com\nluanzhougucheng.com\nluastudio.net\nluatos.com\nluba360.com\nluban-furniture.com\nlubandata.com\nlubanjianye.com\nlubanlebiao.com\nlubanner.com\nlubanpm.com\nlubanshop.com\nlubanso.com\nlubansoft.com\nlubanu.com\nlubaocar.com\nlubeichem.com\nlubiao.com\nlubotv.com\nluboyun.com\nluchengas.com\nluchentech.com\nluchenwater.com\nluchuang.com\nluciaz.me\nlucifer.ren\nluck-number.com\nluck808.com\nluckao.com\nluckeeinc.com\nluckforcalendar.com\nluckincalendar.com\nluckincdn.com\nluckincoffee.co\nluckincoffee.com\nluckincoffeecdn.com\nlucklnk.com\nluckmail.net\nluckup.cc\nlucky.gd\nlucky286.com\nlucky8k.com\nluckyair.net\nluckychipsmaster.com\nluckycoffee.com\nluckyop.com\nluckysf.net\nluckyxp.net\nlucode.net\nluctonchongqing.com\nluctoncq.com\nluctonshanghai.com\nludaocn.com\nludaopei-bjyz.com\nludashi.com\nludashicdn.com\nludashisafe.com\nludayq.com\nludedc.com\nludengtyn.com\nludeqi.com\nludiban.com\nludongyy.com\nludosuperstar.com\nludou.org\nludown.com\nludoworld.net\nludu319.com\nlueasygi.com\nluebin.com\nluedian.com\nluenmei.com\nlueqiu.com\nluexpo.com\nlueyue.com\nluezhi.com\nlufahouse.com\nlufangjia.com\nlufax.com\nlufaxcdn.com\nlufengwuliu.net\nlufengzhe.com\nlufff.com\nluffy.cc\nluffycity.com\nlufunds.com\nlugangsoft.com\nlugick.com\nlugong.net\nlugouqiaojiu.com\nluguisc.com\nluhai.net\nluhaioil.com\nluhao198.com\nluhaoche.com\nluhe.net\nluhehospital.com\nluhu.co\nluhua.cc\nluhuadong.com\nluhuiwl.com\nlujiaming.com\nlujiandairy.com\nlujianxin.com\nlujiazuiforum.org\nlujingtao.com\nlujiya.com\nlujun9972.win\nlukachen.com\nlukafei.com\nlukechina.com\nlukiwod.org\nlukiya.com\nlukou.com\nlukuanart.com\nlul8.com\nlula.fun\nlulala.com\nlulaoshi.info\nlulinux.com\nlulisteel.com\nlulubei.com\nlulufind.com\nlulugda.icu\nluluhong.com\nluluju.com\nlum114.com\nlumai.net\nlumen-chip.com\nlumiai.com\nlumin.tech\nlumingtec.com\nlumiunited.com\nlumosfun.com\nlunalotus.online\nlunannews.com\nlunar2013.com\nlunatdteteask.cfd\nlundao.pub\nluneng.com\nlungai.com\nlunkuokeji.com\nlunlunapp.com\nlunwengo.net\nlunwenlib.com\nlunwenstudy.com\nlunwentong.com\nlunwenxiazai.com\nlunzima.net\nluobo020.com\nluobo360.com\nluobotou.org\nluobowin8.com\nluoboxia.com\nluochen.com\nluochenyl.com\nluochenzhimu.com\nluodian.com\nluodw.cc\nluoergai.com\nluofk.xyz\nluoganpump.com\nluogu.org\nluohanacademy.com\nluohanyu.cc\nluohuedu.net\nluojiaci.net\nluojiadeyi.com\nluojiji.com\nluojilab.com\nluojiweiye.com\nluokuang.com\nluolai.com\nluolai.tech\nluolaoguai.com\nluolatu.com\nluoli.net\nluolikong.net\nluoluoluoluo.xyz\nluomanxincai.com\nluomanyueqi.com\nluomapan.com\nluomi.com\nluomor.com\nluoniushan.com\nluoo.net\nluoohu.com\nluooqi.com\nluopan.com\nluoqiu.us\nluoqiuzw.com\nluori.net\nluoshendao.com\nluoshu.com\nluoshuanchangjia.com\nluosi.com\nluosifen888.com\nluosika.com\nluosimao.com\nluosoft.com\nluotiannews.com\nluotianyi.vc\nluotuo101.com\nluotuobang.net\nluotuoshop.net\nluowandianzi.com\nluowave.com\nluoxiang.com\nluoxiangcheliang.com\nluoxiaozi.com\nluoxinyaoye.com\nluoxudong.com\nluoxue.com\nluoyangdx.com\nluoyangkeji.com\nluoyangmalasong.com\nluoyechenfei.com\nluoying66.com\nluoyingsh.com\nluoyuanhang.com\nluozhiyun.com\nluozhongxu.com\nluozongle.com\nlup2p.com\nlupaworld.com\nluping.com\nluqidong.com\nlure123.com\nlurefans.com\nlurelogs.com\nlurenshuwx.com\nluruba.com\nlurun68.com\nlusen.com\nluseng.cc\nlush-mount.com\nlushangroups.com\nlushaojun.com\nlushifu.net\nlushu.com\nlusongsong.com\nluspet.com\nlussac.net\nluster3ds.com\nlustervision.com\nlustre-pharma.com\nlusun.com\nlusure-pharma.com\nluszy.com\nlutao.com\nluteng888.com\nlutongda.com\nlutonggroup.com\nlutongnet.com\nluv66.com\nluvoras.store\nluwei.me\nluweiwater.com\nluxads.net\nluxe.co\nluxemon.com\nluxiangba.com\nluxiangdong.com\nluxiangwu.net\nluxiaoche.com\nluxichemical.com\nluxiwang.com\nluxshare-ict.com\nluxtarget.com\nluxuanart.com\nluxuqing.com\nluxury-ceramics.com\nluxury2008.com\nluxurybrandmall.com\nluxurychina.org\nluxurymany.com\nluxuryshopwatch.com\nluxvisions-inno.com\nluyanghui.com\nluyanhui.com\nluyaodz.com\nluye-pharm.com\nluye.com\nluyecanyin.com\nluyijiaoyu.com\nluyinla.com\nluyinzhushou.com\nluyitong.com\nluyor.net\nluyouqi.com\nluyouqi.net\nluyouwang.com\nluyouwang.net\nluyouxia.com\nluyouxia.net\nluyusheji.com\nluyusoft.com\nluzewangluo.com\nluzexi.com\nluzhonggonglu.com\nluzhou.net\nluzhoubs.com\nluzhoufood.com\nluzhouok.com\nlv74.com\nlv96.com\nlvanol.com\nlvbad.com\nlvban365.com\nlvbang.tech\nlvbeijingtour.com\nlvbenma.com\nlvbitte.com\nlvbogas.com\nlvcai.biz\nlvcampaign.com\nlvcchong.com\nlvchanghuanbao.com\nlvchayun.com\nlvchehui.com\nlvcheng.com\nlvchengba.com\nlvchicar.com\nlvd.cc\nlvdawei.com\nlvdhb.com\nlvdingjia.com\nlvdishandong.com\nlvdongip.com\nlvdxs.com\nlve-china.com\nlvfang.cc\nlvfapiao.com\nlvgangss.com\nlvgou.com\nlvgset.com\nlvguo.net\nlvhuawei.work\nlvirahoe.com\nlvjhx.com\nlvjiaoya121.com\nlvjieplus.com\nlvjinsuo.com\nlvjiwang.com\nlvjuelaw.com\nlvjuf.com\nlvjunzx.com\nlvkcn.com\nlvke.wiki\nlvkhouse.com\nlvkun.site\nlvlian5.com\nlvluowang.com\nlvlvlvyou.com\nlvmae.com\nlvmall.com.tw\nlvmama.com\nlvmenglvye.com\nlvmifo.com\nlvmushan.com\nlvneng.com\nlvnengliang.com\nlvpai114.com\nlvpin100.com\nlvpu-chem.com\nlvqingqichangjia.com\nlvrdn.com\nlvren.com\nlvruanhome.com\nlvsan.com\nlvsanxia.com\nlvse.com\nlvsenbao.com\nlvsetxt.com\nlvsexitong.com\nlvshidaxia.com\nlvshiguan.com\nlvshiminglu.com\nlvshou.com\nlvshou.net\nlvshunmuseum.org\nlvsiport.com\nlvsongguo.com\nlvtds.com\nlvtingzs.com\nlvtu100.com\nlvtudiandian.com\nlvtuwa.com\nlvwan.com\nlvwang.com\nlvwenhan.com\nlvwmb.com\nlvxiaoer.net\nlvxing.net\nlvxunlaw.com\nlvyahoo.com.tw\nlvye.com\nlvye.org\nlvyestudy.com\nlvyetong.com\nlvyidoor.com\nlvyinba.com\nlvyinbar.com\nlvyou168.net\nlvyou521.com\nlvyoubei.com\nlvyouf.com\nlvyoukan.com\nlvyounong.com\nlvyouw.net\nlvysz.com\nlvyuanjj.com\nlvyuanpam.com\nlvyuetravel.com\nlvzeep.com\nlvzheng.com\nlw0591.com\nlw0634.net\nlw5188.com\nlw54.com\nlwalb.online\nlwccc.net\nlwcj.com\nlwd3699.com\nlwdjc.com\nlwebapp.com\nlwfengji.net\nlwfmzh.com\nlwgsw.com\nlwguitar.com\nlwhouse.com\nlwinst.com\nlwjl.com\nlwjt.net\nlwjy.net\nlwlm.com\nlwlocks.com\nlwlt.net\nlwlzy.com\nlwnews.net\nlwons.com\nlwork.com\nlwrcb.com\nlwshanghai.org\nlwshuku.info\nlwsy.org\nlwtylqx.com\nlwwandong.com\nlwxgds.com\nlwxs.com\nlwxs11.com\nlwxstxt.com\nlwzls.com\nlx.cok.elexapp.com\nlx.pub\nlx.run\nlx138.com\nlx167.com\nlx2.cok.elex.com\nlx2.cok.elexapp.com\nlx3.cok.elexapp.com\nlx598.com\nlx688.com\nlxapk.com\nlxbio.net\nlxblog.com\nlxbtrip.com\nlxccl.com\nlxcdns.com\nlxcvc.com\nlxdfs.com\nlxdms.com\nlxdns.com\nlxdns.info\nlxdns.net\nlxdns.org\nlxdp.net\nlxdus.com\nlxdvs.com\nlxdvs.info\nlxdvs.org\nlxdvsss.com\nlxf.me\nlxg2016.com\nlxgcf.com\nlxhg.com\nlxhkair.com\nlxhro.com\nlxhuwai.com\nlxhuwai.net\nlxhz-avionics.com\nlxi.me\nlxjapp.com\nlxjcjg.com\nlxjiasu.com\nlxkj.site\nlxlinux.net\nlxns.net\nlxny.vip\nlxq7t234u.shop\nlxrcsc.com\nlxsales.com\nlxsec.com\nlxsk.com\nlxt55094.com\nlxtianhu.com\nlxting.com\nlxtuig77.com\nlxtuyoo.com\nlxtuyoogame.com\nlxtuyou.com\nlxway.com\nlxway.net\nlxwlcn.com\nlxxarq.com\nlxxdyzx.com\nlxxm.com\nlxyai.com\nlxybaike.com\nlxydoor.com\nlxyedu.com\nlxyes.com\nlxyjxsb.com\nlxykjsz.com\nlxyl020.com\nlxyl028.com\nlxyl053.com\nlxyl070.com\nlxyl071.com\nlxyl219.com\nlxyl247.com\nlxyl328.com\nlxyl335.com\nlxyl353.com\nlxyl355.com\nlxyl375.com\nlxyl539.com\nlxyl803.com\nlxyl954.com\nlxyl980.com\nlxyllawfirm.com\nlxyswl.com\nlxzjjt.com\nlxzrmyy.com\nlxzwedu.com\nly-eps.com\nly-jz.com\nly-qiche.com\nly-sky.com\nly.com\nly1by1.com\nly200-cdn.com\nly200.com\nly2y.com\nly321.com\nly333.com\nly39zx.com\nly522.com\nly6s.com\nly93.cc\nlyagyd.com\nlyangchuanbo.com\nlyauto.com\nlybdfqh.com\nlybol.com\nlybtmy.com\nlybus.com\nlybybz.com\nlycheer.net\nlyckw.com\nlycs-arc.com\nlyd-china.com\nlyd6688.com\nlydaas.com\nlydezx.net\nlydfyy.com\nlydhb888.com\nlydownload.net\nlydpjx.com\nlydsy.com\nlyduanzao.com\nlydyyy.com\nlyecs.com\nlyenet.org\nlyf.com\nlyfangc.com\nlyfc.com\nlyfc001.com\nlyfff.com\nlyfsgy.com\nlyfz.net\nlyg.live\nlyg001.com\nlyg01.net\nlyg1.com\nlyg12371.com\nlyg321.com\nlyg800.com\nlygcec.com\nlygchkq.com\nlygcjjt.com\nlygcsyy.com\nlygdfrcb.com\nlygend.com\nlygent.com\nlygfdc.com\nlygfish.com\nlygfybj.com\nlyggm.com\nlyggmyk.com\nlyghi.com\nlyghs.net\nlyghtyy.com\nlygjdf.com\nlygjkw.com\nlygjkwljt.com\nlygjtjt.com\nlygjtkgjt.com\nlygktj.com\nlygl.net\nlygmedia.com\nlygnews.com\nlygou.cc\nlygrc.net\nlygsgt.com\nlygshjd.com\nlygshlxh.com\nlygxwmarathon.com\nlygxwxqrmyy.com\nlygyyjt.com\nlygyyw.com\nlyh666.asia\nlyh8888.com\nlyhb88.com\nlyhendry.com\nlyhero.com\nlyhkh.com\nlyhomestayinn.com\nlyhuadu.com\nlyhx.net\nlyia.org\nlyihub.com\nlyilife.com\nlyjiuzhou.com\nlyjksw.com\nlyjob.net\nlyjq9gwob.com\nlyjunshi.com\nlyjwatch.com\nlyjy.net\nlyjyfw.net\nlyjyjt.com\nlyjys.com\nlylangchao.com\nlyldhg.com\nlylend.com\nlylhkq.com\nlylme.com\nlylxjxc.com\nlymarathon.com\nlymmasu.xyz\nlymy1684.com\nlyngrhec.sbs\nlynkco-test.com\nlynkco.com\nlynlzqy.com\nlynne.ink\nlynr.com\nlyobs.com\nlyou123.com\nlyouoa.com\nlypb.com\nlypd.com\nlypdl.com\nlypower.com\nlypyxx.com\nlyqckyzz.com\nlyqgm.com\nlyqlm.com\nlyquanshunmall.com\nlyrc.cc\nlyrcw.com\nlyric-robot.com\nlyrics.run\nlysafety.com\nlyscjc.com\nlyshangdu.com\nlyshark.com\nlyshenglu.com\nlyshgs.com\nlysk.net\nlysksw.com\nlyslsw.com\nlysq.com\nlysqzs.com\nlysswjt.com\nlysteel.com\nlyswjt.com\nlysxtv.com\nlysy360.com\nlysyzx.com\nlyszls.com\nlyszxyy.com\nlythw.com\nlytoufang.com\nlytpw.com\nlytq.com\nlytuanxue.com\nlyuncloud.com\nlyunle.com\nlyunweb.com\nlyunx.com\nlyvnee.com\nlywenlv.com\nlywf.me\nlywhxy.com\nlywtpx.com\nlywww.com\nlywxww.com\nlyxinhua.com\nlyxltv.com\nlyxsjmm.com\nlyxyxx.com\nlyy99.com\nlyyapp.com\nlyyg.com\nlyyzedu.com\nlyz810.com\nlyzaix.com\nlyzb.com\nlyzb33.app\nlyzfgjj.com\nlyzggs.com\nlyzhanlang.com\nlyzlzz.com\nlyzp100.com\nlyzyxy.com\nlz-qs.com\nlz-redeem.com\nlz-risun.com\nlz-veoliawater.com\nlz12328.com\nlz310.com\nlz520.net\nlzabcd.com\nlzahzn.com\nlzailin.com\nlzane.com\nlzaotw.com\nlzarays.com\nlzb.im\nlzbank.com\nlzbaosteel.com\nlzbcjt.com\nlzbhmy.com\nlzc369.com\nlzcasting.com\nlzcbnews.com\nlzccb.com\nlzcf.net\nlzchcnc.com\nlzchenhui.com\nlzchjs.com\nlzcits.com\nlzcrjs.com\nlzctbyq.com\nlzcyjt.com\nlzdchotel.com\nlzdcic.com\nlzdd.com\nlzdfxj.com\nlzdjjd.com\nlzdql.com\nlzdsqcysgs.com\nlzdsyy.com\nlzdxb888.com\nlzdxdyyy.com\nlzdymy.com\nlzdyyy.com\nlzetyy.com\nlzeweb.com\nlzfcjys.com\nlzfdjt.com\nlzfjq.com\nlzfqty.com\nlzfssp2007.com\nlzftah.com\nlzfyhgm.com\nlzfzct.com\nlzgas.com\nlzgbdst.com\nlzgd.net\nlzghmy.com\nlzgjcxkj.com\nlzgjschool.com\nlzgkyq.com\nlzgm.com\nlzgps.com\nlzgryy.com\nlzhanghai.com\nlzhaoteng.com\nlzhdtk.com\nlzhean.com\nlzhf.com\nlzhhuinong.com\nlzhjuszs.com\nlzhl.online\nlzhmmr.com\nlzhongdian.com\nlzhpo.com\nlzhrobot.com\nlzhszhyy.com\nlzhtwl.com\nlzhuali.com\nlzhuinong.com\nlzhygame.com\nlzhyjd.com\nlzihospital.com\nlziig.com\nlzimall.com\nlzimc.com\nlzjchina.com\nlzjcm.com\nlzjd.com\nlzjiajuw.com\nlzjingda.com\nlzjldj.com\nlzjoy.com\nlzjuhu.com\nlzjyy.com\nlzkajc.com\nlzkczy.com\nlzkjedu.com\nlzklkqyy.com\nlzknpco.com\nlzkojj.com\nlzky.com\nlzl98.com\nlzlatc.com\nlzlcba.com\nlzlgyy.com\nlzlhpq.com\nlzlj.com\nlzljc.com\nlzljmall.com\nlzlmyyl.com\nlzlqc.com\nlzlrxx.com\nlzlsl.com\nlzlsy.com\nlzltong.com\nlzltool.com\nlzlxylsf.com\nlzlygs.com\nlzmachine.net\nlzmaoliu.com\nlzmbhj.com\nlzmckq.com\nlzmei.com\nlzmljdzx.com\nlzmoyin.com\nlzmun.com\nlzmy123.com\nlznbjz.com\nlznetease.com\nlznrlmxh.com\nlzoam.com\nlzolm.com\nlzorient.com\nlzpfei.com\nlzpmia.com\nlzppt.com\nlzprocess.com\nlzqjjx.com\nlzqjsm.com\nlzqqpcts.com\nlzqxjx.com\nlzranqi.com\nlzrfc.com\nlzrfhg.com\nlzrimd.com\nlzrkjx.com\nlzrmzx.com\nlzro.net\nlzrq.com\nlzry.com\nlzsajzl.com\nlzsansong.com\nlzsb.org\nlzsey.com\nlzseygs.com\nlzseyy.com\nlzsfdq.com\nlzsfy.com\nlzsgmf.com\nlzsjhjx.com\nlzskqyy.com\nlzskx.com\nlzslgcj.com\nlzslong.com\nlzsmedia.com\nlzsq.net\nlzsrsj.com\nlzsunspot.com\nlzswmsj.com\nlztb.com\nlztdzy.com\nlzteli.com\nlztlcyxx.com\nlztvnet.com\nlztx123.com\nlztxw.com\nlztzgroup.com\nlzweidaoyou.com\nlzwg.com\nlzwi.fun\nlzwls.com\nlzwopu.com\nlzwsgs.com\nlzwx.com\nlzxbook.com\nlzxfmc.com\nlzxinjiu.com\nlzxinwenwang.com\nlzxishaj.com\nlzxjet.com\nlzxlgg.com\nlzxnqt.com\nlzxqlgwl.com\nlzxqm.com\nlzxqsmwl.com\nlzxqswjt.com\nlzxrmtzx.com\nlzxrmyy.com\nlzxy.com\nlzyd.com\nlzydby.com\nlzyec.com\nlzyfoods.net\nlzygpm.com\nlzyhcy.com\nlzyhdyf.com\nlzyisheng.com\nlzyizhu.com\nlzylkf.com\nlzylqc.com\nlzyoushang.com\nlzyrwz.com\nlzytbl.com\nlzyts.com\nlzyuantong.com\nlzyun.vip\nlzyxfs.com\nlzyxsoft.net\nlzyyy.com\nlzyz.fun\nlzyz.org\nlzyzbz.com\nlzyzx.net\nlzyzxzyy.com\nlzzcloud.net\nlzzf.com\nlzzg365.com\nlzzgljj.com\nlzzhdq.com\nlzzhhq.com\nlzzhongke.com\nlzzkzs.com\nlzzl.net\nlzzlsoft.com\nlzznbyq.com\nlzzrgas.com\nlzzy.net\nlzzyy.com\nm-edu.com\nm-hero.com\nm-rainbow.com\nm.travelzoo.com\nm1.run\nm123.com\nm1315.com\nm176.net\nm186.net\nm188.com\nm1905.com\nm1938.com\nm1ok.com\nm1page.com\nm1world.com\nm1xia.com\nm2ez.com\nm2mlib.com\nm2mzy.com\nm2time.net\nm3-cloud.com\nm3cqjc3og6.com\nm3guo.com\nm3kaiye.com\nm43ocq1uoj.com\nm448.com\nm5bn.com\nm5m6x0vh.com\nm5stack.com\nm6.run\nm7686d7aw5.com\nm7hwocyo67.com\nm8.com\nm818.com\nm9.run\nm937.com\nm999.com\nm9dz.com\nma-china.com\nma.run\nma3office.com\nma3you.com\nma5000.com\nmaa.plus\nmaaend.com\nmaanhui.com\nmaasdk.com\nmabangerp.com\nmabaozhuyun.com\nmabiji.com\nmabotech.com\nmac169.com\nmac189.com\nmac69.com\nmac89.com\nmacabc.com\nmacaobusinessnews.com\nmacaotourism.gov.mo\nmacapp8.com\nmacappbox.com\nmacat.vip\nmacaucentral.com\nmacauchenguangji.com\nmacaumonthly.net\nmacauo2o.com\nmacaupass.com\nmaccms.site\nmaccmsbox.com\nmaccura.com\nmacdaxue.com\nmacgene.com\nmacgood.com\nmachaojin.com\nmachenike.com\nmachine-information.com\nmachine-jh.com\nmachine-visions.com\nmachine35.com\nmachinery4stone.com\nmachloop.cc\nmachloop.com\nmachloop.net\nmachmall.com\nmachtalk.net\nmacjb.com\nmackentan.com\nmackext.com\nmacmao.com\nmacmicst.com\nmacocn.com\nmacoshome.com\nmacpeers.com\nmacrolake.com\nmacroprocess.com\nmacrosan.com\nmacrosilicon.com\nmacrounion.com\nmacrowing.com\nmacrozheng.com\nmacrr.com\nmacs.vip\nmacsc.com\nmacsem.com\nmacshuo.com\nmacsky.net\nmacsz.com\nmacv.com\nmacw.com\nmacxf.com\nmacxin.com\nmacxz.com\nmacz.com\nmaczd.com\nmaczhi.com\nmaczj.com\nmaczl.com\nmadaicaifu.com\nmadailicai.com\nmadajiefood.com\nmadaomall.com\nmadboxi.com\nmadefuns.com\nmadeinchinastone.com\nmadewei.com\nmadiancan.com\nmadio.net\nmadisonboom.com\nmadissonline.com\nmadmalls.com\nmadouvip.com\nmadouym.com\nmadsam.work\nmadserving.com\nmaemo.cc\nmaershan.org\nmafa.tech\nmafadns.com\nmafengs.com\nmafengwo.com\nmafengwo.net\nmafengwoo.com\nmaff.com\nmag10000.com\nmagadanryba.com\nmagaoedu.com\nmagcloud.net\nmagecorn.com\nmagedu.com\nmagentochina.org\nmagewell.com\nmagfx-jbkk.com\nmagi.com\nmagic-school.com\nmagich5page.com\nmagicleaders.com\nmagicneko.com\nmagicnetmall.com\nmagics-ad.com\nmagics.plus\nmagictavern.com\nmagicw3.com\nmagicwatchface.com\nmagicwinmail.com\nmagireco.moe\nmagma.ink\nmagnotel.com\nmagook.com\nmagpiepharma.com\nmagtechjournal.com\nmaguang.net\nmagvision.com\nmahailushu.com\nmahjongai.net\nmahjongcup.com\nmahjongcup.net\nmahoupao.com\nmahua.com\nmahuatalk.com\nmai.com\nmaianhao.com\nmaibaapp.com\nmaibaihuo.com\nmaibangbang.net\nmaibaokeji.com\nmaibuymai.com\nmaichawang.com\nmaiche.com\nmaiche168.com\nmaicheme.com\nmaichuang.net\nmaicro.com\nmaicuole.com\nmaidang.cool\nmaidangao.com\nmaidelong.com\nmaidengju.net\nmaideyi.com\nmaidiancy.com\nmaidige.com\nmaiditu.com\nmaidong100.com\nmaidongxi.com\nmaidou.com\nmaidouke.com\nmaidrom.net\nmaiduo.com\nmaie.name\nmaifjb.com\nmaigoo.com\nmaihaoche.com\nmaihaojiu.com\nmaihaome.com\nmaihaowan.com\nmaihaowuyou.com\nmaihaoyou.com\nmaihehd.com\nmaihengqi.com\nmaihuacha.com\nmaihuominiapps.com\nmaihuwai.com\nmaijia.com\nmaijiakan.com\nmaijiaw.com\nmaijiazhichi.com\nmaijichuang.net\nmaijiemedia.com\nmaikami.vip\nmaikongjian.com\nmail163.com\nmail4399.com\nmaila88.com\nmaileds.com\nmailehudong.com\nmailejifen.com\nmailetian.com\nmailianou.com\nmailiku.com\nmailixing.com\nmailizc.com\nmailpanda.com\nmailshanguo.com\nmailyun.net\nmaimaibao.com\nmaimaiche.com\nmaimaidx.cc\nmaimaigongkong.com\nmaimaimaiw.com\nmaimemo.com\nmaimemostatus.com\nmaimiaotech.com\nmainaer.com\nmainaffyn-dev.com\nmaindown4399.com\nmaine1688.com\nmainlandip.com\nmainlandmed.com\nmainshe.com\nmaintao.com\nmainwww.com\nmainyou.com\nmaipu.com\nmaipyi.com\nmaiqun.vip\nmaiqunwang.com\nmairoot.com\nmairuan.com\nmairuancn.com\nmairuanwang.com\nmaisanqi.com\nmaiscrm.com\nmaiseed.com\nmaishebei.com\nmaishitv.com\nmaishou88.com\nmaishoumm.com\nmaisry.net\nmaissn.com\nmaisu.vip\nmaisucai.com\nmaisui1.com\nmaitao.com\nmaitaowang.com\nmaitegao.com\nmaitewang.com\nmaitix.com\nmaitix.net\nmaitu.cc\nmaituan.com\nmaitube.com\nmaiuspharma.com\nmaiwe.com\nmaiweikj.com\nmaixhub.com\nmaixiaba.com\nmaixiang.net\nmaixiaodao.com\nmaixinxin.com\nmaiya91.com\nmaiyadi.com\nmaiyanju.com\nmaiyaole.com\nmaiyayk.com\nmaiyuesoft.com\nmaiyuren.com\nmaizer.pw\nmaizhi.com\nmaizhixiu.com\nmaizhuanbao.com\nmaiziedu.com\nmaizipo.com\nmaizuo.com\nmajia99.com\nmajiamen.com\nmajiang520.com\nmajilive.com\nmajor-epoch.com\nmajorbio.com\nmajorprecious.com\nmajorsec.com\nmajsoul.com\nmaka.im\nmaka.mobi\nmakaevent.com\nmakaidong.com\nmakaiqian.com\nmake-w0rld-static.club\nmakeapp.co\nmakeblock.com\nmakecn.net\nmakedie.me\nmakeding.com\nmakeeu.com\nmakefang.com\nmakefont.com\nmakelie.com\nmakelove.la\nmakenv.com\nmakeoptim.com\nmakepic.net\nmakepolo.com\nmakepolo.net\nmakerbio.com\nmakeronly.com\nmakeronsite.com\nmaketion.com\nmakeweiyuan.com\nmaking.link\nmala123.com\nmalabeibei.com\nmalagis.com\nmalait.com\nmalajikuai.com\nmalata.com\nmalaysia-mdac.com\nmaldiveszh.com\nmaldun.com\nmales120.com\nmalifenlawyer.com\nmalifuke.org\nmalimalihome.net\nmalingguzhai.com\nmaliquankai.com\nmaliuliu.com\nmall-builder.com\nmall.com\nmallchina.net\nmallchina.org\nmallcoo.net\nmallhaha.com\nmallocfree.com\nmallshow.net\nmallstaroa.com\nmallzhe.com\nmallzto.com\nmalmam.com\nmalong.com\nmalong.plus\nmaloyonline.com\nmalsmiles.com\nmaltm.com\nmama100.com\nmamacn.com\nmamahao.com\nmamahuo.com\nmamayz.com\nmambasms.com\nmambike.com\nmamcharge.com\nmamecn.com\nmamicode.com\nmamioo.com\nmamoe.net\nmamsh.org\nmamumall.com\nman6.org\nmanagershare.com\nmanamana.net\nmanben.com\nmanbetxoo.com\nmanbetxrr.com\nmanboker.com\nmanbu.cc\nmanchengpiaoxiang.com\nmanco-logistics.com\nmanction.com\nmandao-tech.com\nmandarinedu.org\nmandarinhouse.com\nmandarinmorning.net\nmandashu.com\nmande-car.com\nmandian.com\nmandiankan.com\nmandnsv1.com\nmandnsv1.net\nmandudu.com\nmanduhu.com\nmanew.com\nmanewvr.com\nmanfen.net\nmanfen5.com\nmanfenyufa.com\nmanfred-auto.com\nmanfrottoclub.com\nmangafuna.site\nmangafuna.xyz\nmanganesenanhai.com\nmangg.com\nmangguo.com\nmangguo168.com\nmangguonews.com\nmangjianghuole.com\nmangocity.com\nmangoebike.com\nmangoent.com\nmangoerp.com\nmangogame.com\nmangolm.com\nmangomob.net\nmangoru.site\nmangpielb.com\nmangren.com\nmangrovetek.com\nmangrovetreeresort.com\nmangroviarestaurant.com\nmangtian.com\nmangtuhuyu.com\nmanguo42.com\nmangxia.com\nmangxuewang.com\nmangzhongbrand.com\nmangzitian.com\nmangzx.com\nmanhinggroup.com\nmanhua1.com\nmanhua365.com\nmanhua8.net\nmanhuacheng.com\nmanhuadaohang.com\nmanhualang.com\nmanhuang.org\nmanhuapi.com\nmanhuaren.com\nmanhuatai.com\nmanjiwang.com\nmankebao.com\nmankewenxue.cc\nmanlaxy.com\nmanlaxycloud.com\nmanli.ltd\nmanlinggame.com\nmanlinwood.com\nmanluoni.com\nmanluotuo.com\nmanmanapp.com\nmanmanbuy.com\nmanmango.com\nmanmankan.com\nmanmanzou.com\nmanmeilp.com\nmanmeng168.com\nmanmu.net\nmannian.com\nmanogk.com\nmanongdao.com\nmanonggu.com\nmanongjc.com\nmanosp.com\nmanpianyi.com\nmanpowergrc.com\nmanrong.win\nmanshaoco.com\nmanshijian.com\nmantachina.com\nmantangc.com\nmantewei.com\nmantianfei.net\nmantusy.com\nmanulife-sinochem.com\nmanuscripk.com\nmanwahholdings.com\nmanxing.net\nmanxiu-law.com\nmanyacan.com\nmanylaw.com\nmanyoo.net\nmanyou.com\nmanyoujing.net\nmanyoukeji2024.com\nmanyoumao.com\nmanyupay.com\nmanzhai.net\nmanzhan.com\nmanzu365.com\nmanzuo.com\nmanzuocaipu.com\nmanzx.com\nmao-shen.com\nmao.fan\nmao35.com\nmaobob123.com\nmaobotv.com\nmaobugames.com\nmaodou.com\nmaodouapp.com\nmaodouketang.com\nmaoercdn.com\nmaoflag.net\nmaogang.com\nmaogepingbeauty.com\nmaogepingedu.com\nmaogp.com\nmaogua.com\nmaogumaogu.com\nmaogx.win\nmaoha.com\nmaohongdz.com\nmaojiaoque.com\nmaojiuxs.com\nmaokangbio.com\nmaoken.com\nmaoln.com\nmaolog.com\nmaomao365.com\nmaomaoche.com\nmaomaoxue.com\nmaomaoyuanma.com\nmaomijiaoyi.com\nmaomilingyang.com\nmaomob.com\nmaomp.com\nmaomp.icu\nmaono.com\nmaopaoya.com\nmaopuyouxi.com\nmaoqitian.com\nmaoqiumail.com\nmaoshanger.com\nmaotao.net\nmaotiangroup.com\nmaotuan.net\nmaotuying.com\nmaowotao.com\nmaoxia007.com\nmaoxiangai.com\nmaoxinhang.com\nmaoxinquan.net\nmaoxiongtv.com\nmaoyachen.com\nmaoyan.com\nmaoyanqing.com\nmaoye-smd.com\nmaoyi.biz\nmaoyidi.com\nmaoyigu.com\nmaoyingaipu.com\nmaoyouxi.com\nmaoyun.com\nmaoyuncloud.com\nmaozhishi.com\nmaozhuar.com\nmaozhuashow.com\nmap-tencent.com\nmap17.com\nmap456.com\nmap456.net\nmapabc.com\nmapbar.com\nmapeng.net\nmapfarm.com\nmapgis.com\nmapgx.com\nmaphuan.com\nmapks.com\nmaple-game.com\nmaple.ren\nmaplecheck.tech\nmaplef.net\nmapmapping.com\nmappn.com\nmaproelec.com\nmaptalks.com\nmapvq.com\nmaqingbo.com\nmaqinnews.com\nmararun.com\nmarathonbm.com\nmarathonchangsha.com\nmarazziguide.com\nmarchinfo.com\nmarco-bj.com\nmarcopolochina.com\nmarginalk.com\nmariedalgar.com\nmarimekko-hots.com\nmarine-dancer.com\nmarinedancer.com\nmarioall.com\nmarioin.com\nmariowap.com\nmarisfrolg.com\nmaritime-dg.com\nmarkdown.xyz\nmarkdream.com\nmarkedboat.com\nmarketingconv.com\nmarketingforce.com\nmarkfairwhale.com\nmarkiapp.com\nmarkji.com\nmarkjour.com\nmarkmall.com\nmarkmiao.com\nmarknum.com\nmarkorchem.com\nmarkorhome.com\nmarksmile.com\nmarkson.hk\nmarljoy.com\nmarmot-cloud.com\nmaro6.com\nmarry5.com\nmars-block.com\nmarshal-ceramics.com\nmarshallscarlett.shop\nmarshotspot.com\nmarssenger.com\nmarstor.com\nmarstv.com\nmarsvis.com\nmartech365.com\nmartin8023.com\nmartincl2.me\nmartinlofts.com\nmarto.cc\nmarvelunlimitedresources.com\nmaryek.net\nmarylandtenthcavalry.org\nmas10010.com\nmas300275.com\nmasastack.com\nmascaw.com\nmasdjy.com\nmaseek.com\nmasej.com\nmaseven.com\nmasff.com\nmasgjjt.com\nmasgw.com\nmashang98.com\nmashangfangxin.com\nmashangfl.com\nmashangmai.com\nmashangshijie.com\nmashangxue123.com\nmashiro.me\nmashrabiya-screen.com\nmasiao.com\nmasikkk.com\nmasjfc.com\nmasjinquan.com\nmaslink.com\nmaslong.com\nmason-led.com\nmason-optics.com\nmaspiece.com\nmasqhboat.com\nmass-evo.com\nmassage-hospital.com\nmassclouds.com\nmasscrunch.com\nmassestech.com\nmassx.com\nmasszxyy.com\nmasteam.com\nmaster-home.com\nmastercardnucc.com\nmasterchefworks.com\nmasterfy.com\nmastergo.com\nmasterkongchef.com\nmasterlab.vip\nmasterofmalteu.shop\nmasterofsoccer.com\nmastersay.com\nmastersim123.com\nmastodonhub.com\nmasttoards.com\nmastv.cc\nmastvnet.com\nmasyi.com\nmasyunrui.com\nmat-rev.com\nmat-test.com\nmatao.com\nmatch-much.com\nmatchboxnetwork.com\nmatchsaas.com\nmatchupexpo.com\nmatchvs.com\nmate.vip\nmateair.com\nmater-rep.com\nmatfron.com\nmath168.com\nmathartsys.com\nmathchina.com\nmathcn.com\nmathfan.com\nmathleague.hk\nmathoe.com\nmathpretty.com\nmati.hk\nmatistyle.com\nmatlabsky.com\nmatoaudio.com\nmatocloud.com\nmatongxue.com\nmatpool.com\nmatpool.net\nmatrix-chem.com\nmatrix-net.tech\nmatrixchuang.com\nmatrixerse.com\nmatrixscrm.com\nmatrixsens.com\nmatsubayashi-op.com\nmatsuri.icu\nmatsuri.site\nmatt33.com\nmattressmachinery.net\nmauu.me\nmawei.live\nmawentao.com\nmawhome.com\nmax-c.com\nmaxamchina.com\nmaxd.cloud\nmaxdo.net\nmaxfinesthair.com\nmaxfor-tool.com\nmaxgamehub.com\nmaxgj.net\nmaxhub.com\nmaxhub.vip\nmaxiang.info\nmaxiang.io\nmaxiaobang.com\nmaximajt.com\nmaximfiber.com\nmaxing128.com\nmaxinovel.com\nmaxio-tech.com\nmaxitas.com\nmaxjia.com\nmaxkamsofarms.com\nmaxket.com\nmaxlu.net\nmaxmindpharma.com\nmaxng.cc\nmaxok.com\nmaxonc.com\nmaxonesemi.com\nmaxonesoft.com\nmaxowen.com\nmaxpda.com\nmaxqiu.com\nmaxreader.la\nmaxreader.net\nmaxscend.com\nmaxsewing.com\nmaxspeedgf.com\nmaxtop.online\nmaxuscloud.com\nmaxviewrealty.com\nmaxway-logistics.com\nmaxwealthfund.com\nmaxwi.com\nmaxxipoint.com\nmay.ltd\nmaya09.com\nmaya777.com\nmayabot.com\nmayahuashi.com\nmayanchina.com\nmaybe2016.com\nmaycpay.com\nmaycur.com\nmaydeal.com\nmaydo.group\nmayerse.com\nmayi.com\nmayiangel.com\nmayicms.com\nmayihr.com\nmayiic.com\nmayikankan.com\nmayikt.vip\nmayima.net\nmayishebao.com\nmayishoubei.com\nmayitek.com\nmayitxt.com\nmayiui.com\nmayiw.com\nmayiwenku.com\nmayiwsk.com\nmayiyx.com\nmayizhuanlan.com\nmaylandresort.com\nmaylove2333.com\nmayora-sh.com\nmayshijia.com\nmaysun.net\nmayswind.net\nmayunbj.com\nmaywant.com\nmaywonenergy.com\nmazakii.com\nmazarine-ap.com\nmazc.org\nmazey.net\nmazhan.com\nmazhen.tech\nmazhizuo.com\nmazida.com\nmb-go.com\nmb2p.com\nmb5u.com\nmba518.com\nmbabao.com\nmbachina.com\nmbadashi.com\nmbadbaedu.com\nmbajs.com\nmbalib.com\nmbanggo.com\nmbaobao.com\nmbatrip.com\nmbazl.com\nmbazsw.com\nmbb0760.com\nmbb180.com\nmbbrowser.com\nmbbs.cc\nmbcloud.com\nmbd.pub\nmbdkjsw.com\nmbestway.com\nmbg06260pg.com\nmbg06270pg.com\nmbg06290pg.com\nmbg06301pg.com\nmbgo.com\nmbian.com\nmbiaohui.com\nmbigfish.com\nmbimc.com\nmbinary.xyz\nmbiosh.com\nmbitrres.net\nmbkfj1656.com\nmbksh.com\nmblaudio.com\nmbldbb.com\nmblog.club\nmblu.com\nmblyun.com\nmbo-china.com\nmbokee.com\nmbs.download.prss.microsoft.com\nmbsifu.com\nmbsuat.download.prss.microsoft.com\nmbti16cc.com\nmbtools.work\nmbwxzx.hk\nmbysrobot.com\nmbzhu.net\nmc-biolab.com\nmc-ccpit.com\nmc-dj.com\nmc-f.com\nmc-test.com\nmc-user.com\nmc-xborder.com\nmc.cc\nmc520.com\nmc91.com\nmc9y.net\nmcake.com\nmcbaas.work\nmcbang.com\nmcbao.com\nmcbbs.co\nmcbbs.jp\nmcbbs.net\nmcbeam.pro\nmcc460.pub.3gppnetwork.org\nmccbim.com\nmccchina.com\nmcchcdn.com\nmccshhospital.com\nmcd.cc\nmcdchina.net\nmcdemo.show\nmcdsusan.com\nmcdvisa.com\nmcearnmore.com\nmcecy.com\nmceebbs.com\nmcepchina.org\nmcfound.net\nmcfui.work\nmcfun.tv\nmcfxw.com\nmcgsjt.com\nmchanmai.com\nmchat.com\nmchifi.com\nmchim.net\nmchost.guru\nmchpk.com\nmchuiji.com\nmchweb.net\nmchxx.net\nmcidc.net\nmcit.tech\nmcjd.net\nmckuai.com\nmckumf5ii4.com\nmcloudvr.com\nmcmap.cc\nmcmarkets.com\nmcmaster-asia.com\nmcmqyc.com\nmcmsmp.com\nmcmssc.com\nmcmtek.com\nmcmusic.hk\nmcnav.net\nmcneko.com\nmcnjigou.com\nmcobj.com\nmcohmygod.com\nmcoo.cc\nmcooks.com\nmcool.com\nmcpemaster.com\nmcpfks.com\nmcpmaid.com\nmcq93.app\nmcqy.net\nmcsafebox.com\nmcsgis.com\nmcshuo.com\nmctcn.com\nmcu-home.com\nmcue.cc\nmcufan.com\nmcuisp.com\nmcusky.com\nmcuzj.com\nmcuzone.com\nmcuzx.net\nmcw99.com\nmcwell66.com\nmcwizrd.com\nmcwshop.com\nmcx666.com\nmcxyzt.cc\nmcxzs.com\nmcyhfl.com\nmcypls.com\nmcyz.com\nmczhihui.com\nmczmb.org\nmczwlt.net\nmczyz.com\nmczz.net\nmd-hmjt.com\nmd-pms.com\nmd5ma.com\nmdapp.tv\nmdbchina.com\nmdbimg.com\nmdclub.org\nmdddg.com\nmddj.com\nmddlsa.com\nmdeasydiagnosis.com\nmdeer.com\nmdex.co\nmdex.com\nmdfkyiyuan.com\nmdfors.com\nmdfull.com\nmdhky.com\nmditie.com\nmdjgjjt.com\nmdkj1.com\nmdl.ink\nmdlf.xyz\nmdm.plus\nmdmccq.com\nmdmmm.com\nmdmt.com\nmdnice.com\nmdouvip.com\nmdouwz.com\nmdpda.com\nmdpetrotech.com\nmdrmyy.com\nmdsin.com\nmdsmos.com\nmdsyzx.com\nmdtu.com\nmdupc.com\nmdvdns.com\nmdwyservice.com\nmdxs.com\nmdxw.work\nmdy-edu.com\nmdybk.com\nmdydt.net\nmdymedical.com\nmdyseducation.org\nmdyuepai.com\nmdzgjx.com\nmdzx.net\nme-city.com\nme-game.com\nme-tencent.com\nme1.ltd\nme360.com\nme361.com\nme4399.com\nmeadin.com\nmeaningfulcloud.com\nmeanwell.cc\nmeb.com\nmebhaoya.com\nmebo.com\nmebtf.com\nmebyk.com\nmecaraiotp.org\nmechatim.com\nmechina.org\nmechr.com\nmechrevo.com\nmecoxlane.com\nmecru.com\nmecsz.com\nmecue.cc\nmed-123.com\nmed-linket.com\nmed-water.com\nmed123.com\nmed126.com\nmed139.com\nmed66.com\nmeda.cc\nmedbotsurgical.com\nmedcaren.com\nmedcmz.com\nmeddatas.com\nmedebound.com\nmedejob.com\nmedeming.com\nmedia.paperclipclub.net\nmediastory.cc\nmediatek.com\nmediav.com\nmediaxinan.com\nmedical-union.com\nmedicalqc.com\nmedicexam.net\nmediecogroup.com\nmedifinit.com\nmedilinkthera.com\nmedinoah.com\nmediparksh.com\nmeditrustbroker.com\nmeditrusthealth.com\nmediumvis.com\nmedixcloud.com\nmedkaoyan.net\nmedlander.com\nmedlinkchina.com\nmedlinker.com\nmedlinker.net\nmedme.net\nmedmeeting.org\nmednovogroup.com\nmedproad.com\nmedrc.net\nmedreading.com\nmedris-china.com\nmedscrm.com\nmedstarcorp.com\nmedsuture.com\nmedtechshare.com\nmedtimes-hk.com\nmedtion.com\nmedwant.com\nmeecec.com\nmeegobeta.com\nmeegoe.com\nmeekdai.com\nmeeket.com\nmeeshow.com\nmeet-in-shanghai.net\nmeet99.com\nmeetbf.com\nmeetfave.com\nmeethall.com\nmeethome.com\nmeeting.so\nmeeting666.com\nmeetingmeet.com\nmeetingrj.com\nmeetlawyer.com\nmeetsite.com\nmeetsocial.com\nmeetsoho.com\nmeetsprring.com\nmeetuvip.com\nmeetwhale.com\nmeetxian.com\nmeetyoumuseum.com\nmeetzoom.net\nmeexx.xyz\nmefcl.com\nmefenglife.com\nmefenlife.com\nmega555net10.org\nmegaemoji.com\nmegaer.com\nmegagamelog.com\nmegagenchina.com\nmegahugo.net\nmegajoy.com\nmegalithwatch.com\nmegarobo.com\nmegasig.com\nmegawords.cc\nmegcup.com\nmegmeet-welding.com\nmegobike.com\nmegou8.com\nmeguo.com\nmeguri.app\nmeguri.moe\nmegvii-inc.com\nmegvii.com\nmeheco.com\nmehecointl.com\nmei-shu.com\nmei-shu.net\nmei.com\nmei1.com\nmei1.info\nmeia.me\nmeianclean.com\nmeianjuwang.com\nmeiaoju.com\nmeiba.com\nmeibaiwu.com\nmeibanla.com\nmeibei.com\nmeibg.com\nmeibgroup.com\nmeican.com\nmeicanstatic.com\nmeichen.cc\nmeichengchongdian.com\nmeichenindustry.com\nmeichibao.com\nmeichuanchuan.com\nmeichuanmei.com\nmeichunmed.com\nmeici.com\nmeida.com\nmeidaifu.com\nmeidanylon.com\nmeidaogg.com\nmeidaojia.com\nmeide-casting.com\nmeidebi.com\nmeidecloud.com\nmeideng.net\nmeidepump.net\nmeidongauto.com\nmeidunyipin.com\nmeidusacloud.com\nmeierbei.com\nmeifang.com\nmeifang8.com\nmeifangquan.com\nmeifazhan.com\nmeifengli.com\nmeigeinc.com\nmeigongyun.com\nmeiguanjia.net\nmeiguiauto.com\nmeiguiwxw.com\nmeiguo-qianzheng.com\nmeiguogouwu.com\nmeiguoxiaoxue.com\nmeiguoxq.com\nmeigushe.com\nmeih5.net\nmeiheups.com\nmeihouyun.com\nmeihu99.com\nmeihua.info\nmeihuainfo.com\nmeihuapacking.com\nmeihuboyue.com\nmeihudong.com\nmeihutong.com\nmeiji-icecream.com\nmeijia51.com\nmeijiadaren.com\nmeijiaedu.com\nmeijiandaojia.com\nmeijianpin.com\nmeijiashang.com\nmeijiavip.com\nmeijiebijia.com\nmeijieclub.com\nmeijiedaka.com\nmeijiehang.com\nmeijiehezi.com\nmeijieku.com\nmeijiequan.com\nmeijieu.com\nmeijiexia.com\nmeijieyizhan.com\nmeijiezaixian.com\nmeijiezaixian.net\nmeijipharma.net\nmeijipower.com\nmeijiu.com\nmeijubo.com\nmeijufans.com\nmeijuniao.net\nmeijuq.com\nmeijust.com\nmeika360.com\nmeikai1979.com\nmeikanguo.com\nmeikankeji.com\nmeikao.com\nmeikeda.net\nmeikevideo.com\nmeikongte.com\nmeikr.com\nmeiktv.com\nmeiku123.com\nmeilandianzi.com\nmeilanrilan.com\nmeilaoshi.com\nmeili-inc.com\nmeili-oh.com\nmeili43.com\nmeilichengren.com\nmeilidongnanya.com\nmeiligaosu.com\nmeilijia.com\nmeilijian.com\nmeiling.com\nmeilishuo.com\nmeilishuo.net\nmeilisite.com\nmeiliwang.org\nmeiliworks.com\nmeiljiaqi.com\nmeilunmeijia.com\nmeilvtong.com\nmeimedical.com\nmeimeidu.com\nmeimeifa.com\nmeimeiriji.com\nmeimeiyouxin.com\nmeimianjiafang.com\nmeiming8.com\nmeimingbao.net\nmeimingteng.com\nmeimingxuan.com\nmeinali.com\nmeinenggas.com\nmeinenggou.com\nmeinv.com\nmeiobrand.com\nmeionetech.com\nmeip0.me\nmeip1.me\nmeip4.me\nmeipai.com\nmeipaixiu.com\nmeipeng518.com\nmeipian.me\nmeipian2.com\nmeipingmeiwu.com\nmeipuapp.com\nmeipvip.net\nmeiqia.com\nmeiqiacloud.com\nmeiqiausercontent.com\nmeiqinedu.com\nmeiquankongjian.com\nmeirenchong.com\nmeirijinrong.com\nmeiritv.net\nmeirixz.com\nmeiriyiwen.com\nmeirong.net\nmeirongchuang.com\nmeirongshanghai.com\nmeishai.com\nmeishanjob.com\nmeishanren.com\nmeishe-app.com\nmeisheapp.com\nmeishesdk.com\nmeishi.cc\nmeishi13.com\nmeishichina.com\nmeishiffx.online\nmeishij.net\nmeishijr.com\nmeishilife.com\nmeishiqin.com\nmeishischool.com\nmeishiwangluo.com\nmeishizuofa.com\nmeishow.com\nmeishu.com\nmeishubao.com\nmeishutuku.com\nmeisilin.com\nmeisubq.com\nmeisupic.com\nmeitangdehulu.com\nmeitanjianghu.com\nmeitanwang.com\nmeite.com\nmeitegou.com\nmeitianhui.com\nmeitianzuche.com\nmeitie.com\nmeitifagao.com\nmeitong-tech.com\nmeitq.com\nmeitu-int.com\nmeitu-mobile.com\nmeitu.com\nmeitu.net\nmeituaccount.com\nmeituan.com\nmeituan.net\nmeitubase.com\nmeitubeauty.com\nmeitubf.com\nmeitubox.com\nmeitucam.com\nmeitucamera.com\nmeitucoffee.com\nmeitudashi.com\nmeitudata.com\nmeituduoduo.com\nmeitufamily.com\nmeitufans.com\nmeitugif.com\nmeituhezi.com\nmeituhuahua.com\nmeituinside.com\nmeitukankan.com\nmeitukiss.com\nmeitumail.com\nmeitumob.com\nmeitumobile.com\nmeitumv.com\nmeitun.com\nmeituncdn.com\nmeitupaipai.com\nmeitupic.com\nmeitupingzi.com\nmeituriji.com\nmeiturom.com\nmeitushijie.com\nmeitushop.com\nmeitushouji.com\nmeitusiyu.com\nmeitusnap.com\nmeitustat.com\nmeitustatic.com\nmeitustore.com\nmeitutaotao.com\nmeitutg.com\nmeitutietie.com\nmeituxiangji.com\nmeituxiaopu.com\nmeituxiu.com\nmeituxiuxiu.com\nmeituyidong.com\nmeituyuan.com\nmeituyun.com\nmeiwafuying.com\nmeiweibf.com\nmeiweigroup.com\nmeiweis.com\nmeiweishudan.com\nmeiwulist.com\nmeixin.com\nmeixincdn.com\nmeixinl.com\nmeixinqi.com\nmeixiong5.com\nmeiya.com\nmeiyaapp.com\nmeiyacup.com\nmeiyan.chat\nmeiyan.com\nmeiyan.tech\nmeiyanstatic.com\nmeiyatour.com\nmeiye.art\nmeiyedana.com\nmeiyi.ai\nmeiyixinrui.com\nmeiyou.com\nmeiyue.com\nmeiyujt.net\nmeiyuko.com\nmeiyuwang.com\nmeizhan.com\nmeizhandian.com\nmeizhanggui.cc\nmeizhi-cn.com\nmeizhou.com\nmeizhou.net\nmeizitu.net\nmeizu.com\nmeizu.com.hk\nmeizu.net\nmeizuapi.com\nmejorrelojes.com\nmejxw.com\nmeke8.com\nmekedoo.com\nmeldingcloud.com\nmelecode.com\nmelizhi.com\nmellowactivy.com\nmellowgroups.com\nmelon-eptc.com\nmelon.cdnetworks.com\nmelon.icu\nmeloong.com\nmelotgroup.com\nmemblaze.com\nmemewan.com\nmemeyin.com\nmemeyule.com\nmemfiredb.com\nmemofun.net\nmemorieslab.com\nmemoverflow.com\nmems.me\nmemsconsulting.com\nmemsensing.com\nmemsflex.com\nmemsic.com\nmemuplay.com\nmemuu.com\nmemyy.com\nmen.ci\nmenchuang.biz\nmenchuang58.com\nmenci.xyz\nmendale.com\nmendd.com\nmenducn.com\nmeng-model.com\nmeng2u.com\nmeng3.com\nmeng800.com\nmengaite.com\nmengarchitects.com\nmengat.com\nmengbige.com\nmengchongzu.com\nmengdian.com\nmengdie.com\nmengdoc.com\nmengdoctor.com\nmengdodo.com\nmengensha.com\nmengfm.com\nmenggang.com\nmenggaole.com\nmenghuimengtu.com\nmenghunli.com\nmengjiagames.com\nmengjianjiemeng.com\nmengkang.net\nmengkm.com\nmenglan.com\nmenglechong.com\nmenglegame.com\nmenglu.com\nmengmayw.com\nmengmei.org\nmengniang.tv\nmengniuarla.com\nmengniuir.com\nmengou.net\nmengqingpo.com\nmengqiuju.com\nmengsang.com\nmengso.com\nmengte.online\nmengtian.com\nmengtuiapp.com\nmengvlog.com\nmengxi.com\nmengxiang.com\nmengxiangeka.com\nmengxintianxia.com\nmengxyz.com\nmengya.com\nmengyanggroup.com\nmengyin.cc\nmengyou.org\nmengzhou.com\nmengzhuangxiu.com\nmengziyuan.com\nmengzuji.com\nmenhu.io\nmenksoft.com\nmenpad.com\nmenpiao.com\nmenpiaotuangou.com\nmenshiny.com\nmentamob.com\nmentorsc.com\nmentrends.com\nmenubarx.app\nmenwee.com\nmenww.com\nmenwww.com\nmenxue.com\nmenyuannews.com\nmeoof-pet.com\nmeovse.com\nmeow.plus\nmeowcat.org\nmepai.me\nmepcec.com\nmepoem.com\nmeppon.com\nmeqlm.org\nmerach.com\nmercedes-benzarena.com\nmerchaincargo.com\nmercitime.com\nmereith.com\nmergeek.com\nmerivox.net\nmerklechina.com\nmerkpd.com\nmerlinmedicine.com\nmernrza.com\nmero-db.com\nmerries-china.com\nmerroint.com\nmerryhome.com\nmerucario.com\nmescroll.com\nmeshiot.com\nmesince.com\nmesnac.com\nmesonart.com\nmesou.net\nmesowe.com\nmesresearch.com\nmessawith.com\nmessecloud.com\nmeta-stone.com\nmeta-verse.co\nmeta-xuantan.com\nmeta.law\nmetacd.com\nmetal-min.com\nmetal-tube.com\nmetal.com\nmetalchina.com\nmetalrevolution.com\nmetalsinfo.com\nmetalyoung.com\nmetaoptronics.com\nmetaplanet3023.com\nmetasecurities.com\nmetastonecorp.com\nmetastudioxr.com\nmetastudy.vip\nmetasyun.com\nmetatube.pro\nmetavatar.cc\nmetaversemolecule.com\nmetawalle.com\nmetax-tech.com\nmetayuanjing.com\nmetcn.com\nmeten.com\nmeteni.com\nmeteric.com\nmetersbonwe.com\nmetin520.com\nmetispharma.com\nmetmt.com\nmetnews.net\nmetong.com\nmetools.info\nmetro-3d.com\nmetroer.com\nmetrofastpass.com\nmetropolohotels.com\nmetroshield.com\nmetrowatch.net\nmetstr.com\nmetword.co\nmeu95otw4967t.com\nmeuicat.com\nmeutu.com\nmevionchina.com\nmew.fun\nmewchan.com\nmewx.art\nmexingroup.com\nmexontec.net\nmexxum.com\nmeyet.net\nmeyoufreight.com\nmeyum1688.com\nmezhiyu.com\nmezw.com\nmf-y.com\nmf08s.com\nmf1288.com\nmf999.com\nmfaeb.ltd\nmfbrjc.com\nmfbuluo.com\nmfcad.com\nmfcad.net\nmfcpx.com\nmfcteda.com\nmfcyun.com\nmfdl666.com\nmfdns.com\nmfdzqj.com\nmfexcel.com\nmfg-magnets.com\nmfgchn.com\nmfhcd.com\nmfinetech.com\nmfisp.com\nmfjl.wiki\nmfjxcn.com\nmfk.com\nmflady.com\nmfniu.com\nmfpad.com\nmfpay.net\nmfqqx.com\nmfqyw.com\nmfsj1908.com\nmftianshanam.com\nmftvideo.com\nmfunz.com\nmfwxpay.com\nmfxlawyer.com\nmfzl.net\nmfzxcs.com\nmg-cdn.com\nmg-pen.com\nmg21.com\nmg3721.com\nmgcan.com\nmgd5.com\nmgdq.net\nmgdzz.com\nmgenbio.com\nmgenware.com\nmgff.com\nmgfty.com\nmgfy88.com\nmggtech.vip\nmgh2-lab.com\nmgjianshe.com\nmgkj.vip\nmgkjht.com\nmgl9.com\nmglhx.com\nmglip.com\nmgm255.com\nmgmgrandsanya.com\nmgmovie.net\nmgmusic.vip\nmgnav.com\nmgobe-webattle.com\nmgogo.com\nmgongkong.com\nmgplay.com.tw\nmgs123.com\nmgsdk.com\nmgse.info\nmgskfjfod25.com\nmgskfjfod31.com\nmgskfjfod40.com\nmgslb.com\nmgslb.net\nmgslb.org\nmgsp.fun\nmgtv.com\nmgtv2025.com\nmgw999.com\nmgwxw.com\nmgxf.com\nmgxzsy.com\nmgys.cc\nmgyxw.net\nmgyyw.com\nmgzf.com\nmgzxzs.com\nmh-rjgb.com\nmh160.cc\nmh456.com\nmh51.com\nmh9.cc\nmhacn.com\nmhacn.net\nmhaoma.com\nmhbras.com\nmhcharging.com\nmhealth100.com\nmhfotos.com\nmhhf.com\nmhhf.net\nmhi-ac.com\nmhinele.com\nmhito.net\nmhkami.com\nmhkcomment.com\nmhnzww.com\nmhome.com\nmhotels.design\nmhpdf.com\nmhpin.com\nmhrooz.xyz\nmhskso.sbs\nmht.la\nmht.tw\nmhtclub.com\nmhtes.com\nmhtyd.com\nmhtzjt.com\nmhv2.net\nmhw315.com\nmhwck.com\nmhwh168.com\nmhwmm.com\nmhwy2.com\nmhxk.com\nmhxzhkl.com\nmhystatic.com\nmhyun.net\nmhzd.cc\nmhzd.net\nmi-ae.net\nmi-cache.com\nmi-customer.com\nmi-dong.com\nmi-dun.com\nmi-fds.com\nmi-fds.net\nmi-idc.com\nmi-img.com\nmi-img1.com\nmi-img2.com\nmi-img3.com\nmi-img4.com\nmi-img5.com\nmi-static.com\nmi.com\nmi0.cc\nmi1.cc\nmia.com\nmiaibox.com\nmiak.work\nmian520.com\nmianbao.com\nmiancp.com\nmiandanbx.com\nmianfa.org\nmianfeiic.com\nmianfeiquming.com\nmianfeiwendang.com\nmianfeiwucan.org\nmianfeiziti.com\nmianhuatang.cc\nmianhuatang.la\nmianjue.com\nmiankousucai.com\nmianmoi.com\nmianshiya.com\nmianshui365.com\nmianwai.com\nmianyangauto.com\nmianyanghuida.com\nmianyaojsj.com\nmianyazulin.com\nmianzhouhotel.com\nmiao-lang.com\nmiao15777790078.com\nmiaobe.com\nmiaobige.com\nmiaobolive.com\nmiaoche.com\nmiaocode.com\nmiaodiyun.com\nmiaodongbar.com\nmiaodongshenghuo.com\nmiaogongzi.cc\nmiaogongzi.net\nmiaohuiyanyi.com\nmiaojibrand.com\nmiaokaikeji.com\nmiaokaiyun.com\nmiaokan.com\nmiaokan100.com\nmiaolaoshi.com\nmiaolianyunapp.com\nmiaolingbio.com\nmiaomaicar.com\nmiaomiaolock.com\nmiaomiaowork.com\nmiaomiaoxue.com\nmiaomiaoz.com\nmiaomiaozhe.com\nmiaomiaozhua.com\nmiaomu.com\nmiaomuzhan.com\nmiaoo.me\nmiaopai.com\nmiaoqutimes.com\nmiaosha.com\nmiaoshou.cc\nmiaoshou.com\nmiaoshou.net\nmiaoshoucdn.com\nmiaoshufang.com\nmiaoshuwu.com\nmiaoshuzhai.net\nmiaoso.com\nmiaostreet.com\nmiaov.com\nmiaovps.com\nmiaoweijianfei.com\nmiaowenhk.com\nmiaowlabs.com\nmiaowutech.com\nmiaoxiazai.com\nmiaoyanai.com\nmiaoyin.pw\nmiaoyun.link\nmiaozanba.com\nmiaozao.com\nmiaozhan.com\nmiaozhen.com\nmiaozhun.com\nmiaozhunjing.net\nmiaozuo.com\nmiaxis.com\nmiaxis.net\nmibao.com\nmibaoxian.com\nmibei.com\nmic-s.com\nmicai.com\nmicai315.com\nmicaihu.net\nmicaiying.com\nmicamika.com\nmicang.com\nmicblo.com\nmice-gz.org\nmicecn.com\nmichaelapp.com\nmichoi.com\nmichong.com\nmichplay.com\nmiclle.com\nmico.io\nmicode.net\nmicoe.com\nmicro-bee.com\nmicro-bridge.com\nmicro-game-client.com\nmicro-x.net\nmicroad-cn.com\nmicroaiav.com\nmicrobeee.com\nmicrobell.com\nmicrobt.com\nmicrocai.org\nmicrocardio.com\nmicrochampion.com\nmicrodiag.com\nmicrodreams.com\nmicroesim.com\nmicrofotos.com\nmicrofountain.com\nmicronetpay.com\nmicrorui.net\nmicrosate.com\nmicrosoftsa.com\nmicrosoftuwp.com\nmicrostarsoft.com\nmicrostern.com\nmicrosword.net\nmicrotrading.com\nmicrovcard.com\nmicrovirt.com\nmicrovoip.com\nmicrowear.com\nmicrowoo.com\nmicrowu.com\nmicroxiang.com\nmicroyan.com\nmicrozuji.com\nmictormedical.com\nmicu.hk\nmicw.com\nmicyjz.com\nmid-link.net\nmidaapi.com\nmidadata.com\nmidainc.com\nmidanyi.com\nmidasbuy.com\nmiddleschoolcounselor.com\nmidea-buy.com\nmidea-group.com\nmidea-hotwater.com\nmidea.com\nmidea.com.tr\nmideabiomedical.com\nmideadc.com\nmideaepay.com\nmideaepayuat.com\nmideav.com\nmideazy.com\nmidecopharm.com\nmidi-cn.com\nmidian.com\nmidiclouds.com\nmidicn.com\nmidifan.com\nmidingdong.com\nmidiplus.com\nmidita.com\nmiditools.net\nmidiyinyue.com\nmidlele.com\nmidonglab.com\nmidongtech.com\nmidongtech.xyz\nmidu.com\nmiduiedu.com\nmidukanshu.com\nmiduoke.net\nmidureader.com\nmidust.com\nmidway.run\nmieco.net\nmiecod.com\nmieevents.com\nmiemie.la\nmiercn.com\nmieseng.com\nmifacelive.com\nmifan365.com\nmifangba.com\nmifanli.com\nmifanlicdn.com\nmifei.com\nmifeng.plus\nmifengchengshi.com\nmifengv.com\nmifengvv.com\nmifengxiuchang.com\nmifengzd.com\nmifengzhibo.com\nmifenlife.com\nmifispark.com\nmifjhgq.xyz\nmifon.com\nmifpay.com\nmifwl.com\nmigames.com\nmigelab.com\nmightsquare.com\nmiglioriorologi.com\nmigood.net\nmigu.store\nmigucloud.com\nmigufm.com\nmigufun.com\nmigugu.com\nmiguku.com\nmigumaotrip.com\nmigutv.com\nmiguvideo.com\nmiguyu.com\nmihanw.com\nmihayo.com\nmihayou.com\nmihopacking.com\nmihoyo.com\nmihoyocg.com\nmihoyocloud.com\nmihoyogift.com\nmihoyomall.com\nmihuachat.com\nmihuangame.com\nmihuashi.com\nmihuatown.com\nmihui.com\nmihui365.com\nmihulu.com\nmihuwa.com\nmiicp.com\nmiidc.com\nmiidii.tech\nmiidim.com\nmiiee.com\nmiiiw.com\nmiiiw.net\nmiinaa.com\nmiinsurtech.com\nmiit-icdc.org\nmiit-kjcg.com\nmij.cc\nmijewelries.com\nmiji8.com\nmijia.tech\nmijian360.com\nmijiannet.com\nmijiayou.com\nmijiayoupin.com\nmijifen.com\nmijisou.com\nmijwed.com\nmika123.com\nmike-x.com\nmikeauth.com\nmikechen.cc\nmikecrm.com\nmikemessiha.com\nmikeoperfect.com\nmikesent-awareness-02.com\nmikesent-awareness-04.com\nmikesent.net\nmikeyouxi.com\nmikge.com\nmikika.com\nmiko007.com\nmikoshu.me\nmiku.ink\nmiku01.cc\nmikuac.com\nmikublog.com\nmikucdn.com\nmikuclub.fun\nmikudm.com\nmikumikumi.xyz\nmilan.com\nmilan520.com\nmilanshishang.com\nmilanvip.com\nmilchips.com\nmileage.vip\nmilejia.com\nmilemovie.com\nmileshub.net\nmilianshe.com\nmiliantech.com\nmiliao.com\nmilido.vip\nmilihua.com\nmilike.com\nmilimao.com\nmilimili.tv\nmiliol.com\nmiliol.org\nmilipictures.com\nmilitadowatch.com\nmiliyo.com\nmilkjpg.com\nmilliant.com\nmilliway-ic.com\nmillnovel.com\nmilnews.com\nmilo-star.com\nmiloktv.com\nmiloli.info\nmilsay.com\nmilu.com\nmilubtyx.com\nmilusybt.com\nmilvtong.com\nmilvzn.com\nmilyf.com\nmimangfei.com\nmimayun.com\nmimeihui.com\nmimi123.vip\nmimi518.com\nmimidi.com\nmimimeu.com\nmimiteng.com\nmimixiaoke.com\nmimiyc.net\nmimo51.com\nmimomim.com\nmimoprint.com\nmimouse.net\nmimvp.com\nminapp.com\nminapp.xin\nmincdn.com\nmind-home.net\nmind-medi.work\nmindai.com\nmindcherish.com\nmindcontroles.com\nmindechem.com\nmindlabpros.site\nmindmanagerchina.com\nmindmapper.cc\nmindmm.com\nmindpin.com\nmindray.com\nmindshow.fun\nmindsun.com\nmindway-sz.com\nminebbs.com\nminecraftxz.com\nminecraftzw.com\nminegoods.com\nminei.com\nmineplugin.org\nmineraltown.net\nminerfun.com\nminerhome.com\nminesage.com\nminewtech.com\nminfengmuye.com\nminfengtianfu.com\nminfufa.com\nming-med.com\nming-men.com\nminganmed.com\nmingbianji.com\nmingbiao001.com\nmingbiaohao.com\nmingcalc.com\nmingchao.com\nmingchaoonline.com\nmingchaoyouxi.com\nmingchu.co\nmingci.org\nmingcihospital.com\nmingcloud.net\nmingczh.com\nmingdanwang.com\nmingdao.com\nmingdao.net\nmingdao8.com\nmingdaocloud.com\nmingdazhongxue.com\nmingdejx.com\nmingdongman.com\nmingdutech.com\nmingechina.com\nmingfengtang.com\nmingfucdn.com\nmingfucloud.com\nmingfudns.com\nmingfuyun.com\nminghaoshangwu.com\nminghecloud.com\nmingheng-group.com\nmingheyaoye.com\nmingheyiyao.com\nminghezhi.com\nminghuatang.com\nminghuaxinda.com\nminghui.com\nminghuishijia.com\nmingin.com\nmingjiachina.com\nmingjian.com\nmingjian365.com\nmingjignfang.com\nmingjinglu.com\nmingjiudu.com\nmingjuyoupin.com\nmingkj.com\nminglian.com\nminglunlaw.com\nmingmen-tech.com\nmingpian.biz\nmingpian.net\nmingqi.co\nmingqian666.com\nmingqu.xyz\nmingr.com\nmingren888.com\nmingricctv.com\nmingrsoft.com\nmingshi100.com\nmingshi100.net\nmingshi51.com\nmingshi58.com\nmingshiedu.com\nmingshisanling.com\nmingsoft.net\nmingstar.net\nmingtaimed.com\nmingtaokeji.com\nmingtejia.com\nmingtian.com\nmingtou.com\nmingxigu.com\nmingxingku.com\nmingxinglai.com\nmingxuan.store\nmingya.mobi\nmingyang100.com\nmingyangtek.com\nmingyangyinhe.com\nmingyannet.com\nmingyantong.com\nmingyaohui.com\nmingyaoruci.com\nmingyaweb.com\nmingyi.com\nmingyihui.net\nmingyou360.com\nmingyu-porcelain.com\nmingyuanfund.com\nmingyuanmuye.com\nmingyuanyun.com\nmingyueqingfengshe.com\nmingzhi-tech.com\nmingzhucable.com\nmingzhujs.com\nmingzhuoedu.com\nmingzhuxiaoshuo.com\nmingzihui.com\nminhang.cc\nminhangshi.com\nminhow.com\nmini-audio.com\nmini-banana.com\nmini-ease.com\nmini-program-acc.com\nminiadx.com\nminiaixue.com\nminiapida.com\nminiapp.fun\nminiapp360.com\nminiappss.com\nminibai.com\nminibg.com\nminiblink.net\nminidaxue.com\nminidso.com\nminieye.cc\nminieye.tech\nminigame.com\nminigameam.com\nminigui.com\nminigui.org\nminihaowan.com\nminiluck.com\nminimaituan.com\nminimax.chat\nminimaxi.com\nmining120.com\nmininglamp.com\nminip-service.com\nminipacs.com\nminiprogramadmin.com\nminirizhi.com\nminisforum.com\nminishops.co\nminiso-au.com\nminiso.com\nminisoyo.com\nministudy.com\nminitiao.com\nminiui.com\nminixiazai.com\nminiyounger.com\nminjichem.com\nminkave.com\nminking.cc\nminleai.com\nminli.com\nminmetals.com\nminor-tech.com\nminovapharma.com\nminpayment.com\nminqiao.com\nminra.com\nminretail.com\nminshangjie.com\nminshengec.com\nminshengjob.com\nminshenglife.com\nminshop.com\nminstrans.com\nmintaibank.com\nmintake.com\nmintaylor.com\nmintimate.cc\nmintix.store\nmintmuse.com\nmintrust.com\nmints-id.com\nminunix.com\nminxing365.com\nminxiwang.com\nminxue.net\nminyukji.com\nminyunit.cool\nminz.press\nminzu56.net\nmionerxrospeo.com\nmionexmailerc2.com\nmionexmailero1.com\nmiooku.com\nmiospay.com\nmiot-spec.org\nmiotech.com\nmipa.fun\nmipahui.com\nmipangwang.com\nmipay.com\nmipay.net\nmipcdn.com\nmipengine.com\nmipengine.org\nmipkj.com\nmiplus.cloud\nmippaper.com\nmipplan.com\nmipplan.org\nmipuo.com\nmipush.com\nmiqixuan.net\nmiquapp.com\nmir4399.com\nmir6.com\nmiracdn.com\nmiraclelaser.com\nmiracleplus.com\nmiraclevision.com\nmiraclevision.net\nmiracomotor.com\nmirahomes.shop\nmiratama.com\nmiravia.es\nmiredian.com\nmirgaga.net\nmiri.site\nmirmzhy.com\nmirreal.net\nmirrorcast.tv\nmirrorchyan.com\nmisaka.center\nmisakamoe.com\nmisall.com\nmiscd.com\nmishang.com\nmishangkeji.com\nmishuhome.com\nmisiai.com\nmisintlschool.com\nmiso-lab.com\nmispos.cc\nmisrm.com\nmissevan.com\nmissfresh.net\nmisshachina.com\nmisshcl.com\nmissionhillschina.com\nmissjia.net\nmisslele.com\nmisstar.com\nmissyuan.net\nmisuland.com\nmisunly.com\nmitalk.com\nmitang.com\nmitangtuan.com\nmitao.bar\nmitaoping.com\nmitaowu.com\nmitay.net\nmiteno.com\nmitertec.com\nmitesi.com\nmitotoo.com\nmitsubishielectric-mesh.com\nmitsuha.space\nmitsuiplastics-shanghai.com\nmittrchina.com\nmituancm.com\nmituyuedu.com\nmitvos.com\nmitvos.net\nmiued.com\nmiui.com\nmiuiver.com\nmiulab.com\nmiusi.co\nmiuss.icu\nmiutour.com\nmiutrip.com\nmiwaimao.com\nmiwap.com\nmiwifi.com\nmiwuad.com\nmiwuzhentan.com\nmix-planet.com\nmix.moe\nmixbao.com\nmixcapp.com\nmixcm.com\nmixdesk.net\nmixdo.net\nmixian88.com\nmixiaojin.com\nmixin.cc\nmixinshe.com\nmixiong.tv\nmixkr.com\nmixly.org\nmixmind.com\nmixmoe.com\nmixpwr.com\nmixrnb.com\nmixueedu.com\nmixvvideo.com\nmiyabaobei.com\nmiyaboke.com\nmiyachat.com\nmiyanlife.com\nmiyapay.com\nmiyateam.com\nmiyatech.com\nmiyilink.com\nmiyoushe.com\nmiyouu.com\nmiyuangz.com\nmiyun-ecomarathon.com\nmiyun.com\nmiyun360.com\nmiyuncms.com\nmizhai.com\nmizhe.com\nmizhiji.com\nmizhimedia.com\nmizhionline.com\nmizhizbf.vip\nmizhuan.me\nmizone.cc\nmizuda.com\nmizuki2.com\nmj110.net\nmj567.com\nmj85.com\nmjasoft.com\nmjatm.com\nmjcec.com\nmjceo.com\nmjecu.com\nmjgxsc.com\nmjgysm.com\nmjh5.com\nmjia.cc\nmjjcn.com\nmjjq.com\nmjlong.com\nmjlsh.com\nmjmjm.com\nmjmobi.com\nmjoys.com\nmjqishi.com\nmjt288.com\nmjtcsb.com\nmjtom.com\nmjttt.com\nmjxhgdl.com\nmjxpay.com\nmjyg.com\nmjylbj.com\nmjyun.com\nmjyx.com\nmjyxkf.com\nmjzcnd.com\nmjzhcl.com\nmjzj.com\nmjzq.net\nmk-yiliao.com\nmk169.com\nmk2048.com\nmk5.xyz\nmkaq.org\nmkb0898.com\nmkf.com\nmki7rxcwmfe7c.com\nmkjump.com\nmkkcn.com\nmklimg.com\nmklist.com\nmkmchina.com\nmkn666.com\nmkpum.com\nmkpush.com\nmkqh.com\nmkqst.com\nmkrobot.org\nmkrviu.sbs\nmkshell.com\nmkstone.club\nmksucai.com\nmktcreator.com\nmktdatatech.com\nmktoys.com\nmktzb.com\nmktzr.com\nmkvcn.com\nmkwhat.com\nmkzcdn.com\nmkzhan.com\nmkzhan.net\nmkzhou.com\nmkzoo.com\nmlabc.com\nmlairport.com\nmlayt14.com\nmlbaikew.com\nmlc.cc\nmlexpo.com\nmlfjnp.com\nmlfkc.net\nmlgj.com\nmlgxw.org\nmlhimalayanxt.com\nmlhld.com\nmlibaba.com\nmlibrarys.com\nmliev.com\nmlink.tv\nmlinkapp.com\nmlinks.cc\nmlinks.co\nmlito.com\nmlj122.com\nmlj125.com\nmlj130.com\nmlj162.com\nmlj194.com\nmlj36.com\nmlj93.com\nmljtevy.com\nmljydoors.com\nmlkmba.com\nmllj.net\nmlmcms.com\nmlmtz.com\nmlnk.me\nmlnsoft.net\nmlocso.com\nmlogcn.com\nmlpzes05.com\nmlqdpdgf.sbs\nmlrcn.com\nmlrlzy.com\nmlrzsj.com\nmlsbmw.com\nmlsh.net\nmlsub.net\nmlszp.com\nmlt.pub\nmltrans.net\nmlunwen.com\nmlwanwan.com\nmlwdpx.com\nmlwed.com\nmlwplus.com\nmlwu.net\nmlxks.com\nmlxx.com\nmlycdn.com\nmlychee.com\nmlyfc.net\nmlyfcyy.com\nmlyns.com\nmlyx.com\nmlzs2008.com\nmm-sh.com\nmm.com\nmm111.net\nmm131.kim\nmm1357.com\nmm138.com\nmm2hservices.com\nmm3yy.com\nmm8mm8.com\nmmall.com\nmmaqa.com\nmmarket.com\nmmatch.tech\nmmbang.com\nmmbang.info\nmmbang.net\nmmbao.com\nmmbest.com\nmmbjq.com\nmmbread.com\nmmc-data.com\nmmcl.net\nmmcloud.com\nmmcos.com\nmmdtt.com\nmmegg.com\nmmfad.com\nmmfusheng.com\nmmgl.net\nmmgo.com\nmmgogo.com\nmmgoodcar.com\nmmhygame.com\nmmi-shanghai.com\nmmia.com\nmmim8.com\nmmj.vip\nmmjbh.com\nmmjynet.com\nmmjzxh.com\nmmkkiivv.com\nmmlessin.com\nmmllllasjd.com\nmmmglobalgroup.com\nmmmmmmm.com\nmmmnote.com\nmmmrz.com\nmmmtech.com\nmmods.site\nmmogg.net\nmmoist.com\nmmonly.cc\nmmoser.work\nmmosite.com\nmmqidian.com\nmmrcw.com\nmms591.com\nmmsase.com\nmmsccn.com\nmmscoo.com\nmmsfw.com\nmmsk.com\nmmstat.com\nmmt3000.com\nmmtch.com\nmmtx.net\nmmuaa.com\nmmww.com\nmmxchina.com\nmmxiaowu.com\nmmxmmx.com\nmmyj.com\nmmyxshop.com\nmmyz.net\nmmzcn.com\nmmzh.com\nmmzj.com\nmn-soft.com\nmnancheng.com\nmnbvbqw.com\nmnbvdfg.com\nmnbvtgv.com\nmndqlib.net\nmnengine.com\nmnfqw.org\nmnihyc.com\nmnjj.group\nmnkan.com\nmnpc.net\nmnwan.com\nmnwww.com\nmnxhj.com\nmo-co.com\nmo298.com\nmo2g.com\nmo7.cc\nmo9.com\nmoa06181ju.com\nmoa06190ju.com\nmoa06191ju.com\nmoa06210ju.com\nmoa06211ju.com\nmoa06221ju.com\nmoa06240ju.com\nmoa06250ju.com\nmoage.com\nmob.com\nmob55.com\nmobaders.com\nmobai.sbs\nmobaibox.com\nmoban.com\nmobanhao.com\nmobanjing.com\nmobanku.com\nmobanlane.com\nmobanma.com\nmobantiankong.com\nmobantu.com\nmobanwang.com\nmobanyun.com\nmobao.online\nmobaoo.net\nmobartsgame.com\nmobawan.com\nmobayx.com\nmobcells.com\nmobcent.com\nmobcloud.mobi\nmobdna.com\nmobeehome.com\nmobgi.com\nmobgroupbuy.com\nmobiapp.cloud\nmobibao.com\nmobibrw.com\nmobike.com\nmobileanjian.com\nmobilebone.org\nmobiledissector.com\nmobilegamebase.com\nmobilegamecdn.com\nmobilelegends.com\nmobilemgr-global.com\nmobilemgr-global.net\nmobileppp.com\nmobiletrain.org\nmobileztgame.com\nmobispeaker.com\nmobjump.com\nmobjz.com\nmobkeeper.com\nmobking.biz\nmoblazer.com\nmobmore.com\nmobo168.com\nmoboage.com\nmoboplayer.com\nmobotap.com\nmobring.co\nmobrtb.com\nmobsdks.com\nmobsurl.com\nmobtou.com\nmobvoi.com\nmobwan.com\nmocache.com\nmocafilm.com\nmocartoon.com\nmochafengbao.com\nmochai.store\nmochateam.com\nmochi.website\nmochiwang.com\nmochouu.com\nmoci6.com\nmockingbot.com\nmockuai.com\nmocn.cc\nmoco-mall.com\nmocreak.com\nmocusez.site\nmocuz.com\nmodao.cc\nmodao.com\nmodao.io\nmodaogz.com\nmodashi.net\nmodb.cc\nmodb.pro\nmodelarts-infer.com\nmodelarts-maas.com\nmodelevel.com\nmodelltd.com\nmodelones.com\nmodelscope.net\nmodelwhale.com\nmodeng178.com\nmodengtianshi.com\nmoderatep.com\nmodernavenue.com\nmoderner.com\nmoderno2.com\nmodernsky.com\nmodernweekly.com\nmodevol.com\nmodian.com\nmodianverse.com\nmodificatiy.com\nmodooplay.com\nmodouwangluo.com\nmodstart.com\nmodudaojia.com\nmodujx11.com\nmodujx13.com\nmodujx14.com\nmodujx15.com\nmodujx16.com\nmoduyun.com\nmodxz.com\nmoe-box.com\nmoe.im\nmoe.so\nmoe.tips\nmoe.xin\nmoe123.com\nmoe123.org\nmoe321.com\nmoeclub.org\nmoedot.net\nmoeelf.com\nmoefactory.com\nmoefantasy.com\nmoefou.org\nmoegirl.org\nmoegirl.tw\nmoehot.com\nmoehu.org\nmoehui.com\nmoeid.com\nmoejp.com\nmoeking.me\nmoeli123.com\nmoemiao.net\nmoerlong.com\nmoetu.club\nmoetu.org\nmoetuji.com\nmoeub.com\nmoeworld.tech\nmoex.ink\nmoeyuuko.com\nmoeyy.xyz\nmoezx.cc\nmofacdnode.com\nmofadns.online\nmofahou.com\nmofang.com\nmofang.jp\nmofangchuxing.com\nmofangge.com\nmofanghr.com\nmofangshe.com\nmofangwang.com\nmofangyu.com\nmofanodes.com\nmofashi.ltd\nmofavideo.com\nmofazhu.com\nmoffettai.com\nmofile.com\nmofishgames.com\nmofoun.com\nmofunenglish.com\nmogao.com\nmogezhouyi.com\nmogher.com\nmogoedit.com\nmogohd.com\nmogojob.com\nmogoo.com\nmogoroom.com\nmogu.com\nmogu.io\nmogua.co\nmogucdn.com\nmoguding.net\nmoguf.com\nmogujia.com\nmogujie.com\nmogujie.org\nmogujielive.com\nmogumiao.com\nmogutong.com\nmoguv.com\nmoguvet.com\nmoguyun.com\nmoh.cc\nmoh7.com\nmohangkeji.net\nmohjdvh.com\nmohou.com\nmohu.org\nmohuishou.com\nmoihu.com\nmoimg.net\nmoissture.com\nmoith.com\nmoji.com\nmoji001.com\nmoji002.com\nmojicb.com\nmojicdn.com\nmojichina.com\nmojichina.net\nmojidict.com\nmojidoc.com\nmojie.app\nmojie.co\nmojie.kim\nmojieai.com\nmojitest.com\nmojitok-c.com\nmojocube.com\nmojusteel.com\nmojy.xyz\nmokahr.com\nmokamrp.com\nmokatyper.com\nmokayuedu.com\nmokeyjay.com\nmoko.cc\nmokra.house\nmokxing.com\nmolbase.com\nmolbase.net\nmolcoo.com\nmoldinginductor.com\nmoldnano.com\nmoleecel.com\nmolefitting.com\nmolerose.com\nmolesdn.com\nmolibaike.com\nmolihe.cc\nmolihua.net\nmolihuadami.com\nmolilian.com\nmolilier.com\nmolimoli.tech\nmoliplayer.com\nmolipy.com\nmoliqiji.com\nmolishe.com\nmolixiangce.com\nmollervilla.com\nmolt.win\nmolwater.com\nmolygoo.com\nmom001.com\nmoma-hz.com\nmombuybuy.com\nmoment.fun\nmomentad.com\nmomentcake.com\nmomhui.com\nmomishi.com\nmommygf.com\nmomo35.com\nmomoapk.com\nmomobako.com\nmomocdn.com\nmomoda8.com\nmomokuba.com\nmomooyo.com\nmomotn.com\nmomoyu.cc\nmomoyu.com\nmomoyuyouxi.com\nmomzs.com\nmonadyneed.com\nmonaite.com\nmonarch-sw.com\nmondaymorningmtg.com\nmoneak.com\nmonengu.com\nmonengugame.com\nmoneydata.hk\nmonfetch.com\nmongac.com\nmonhun.fun\nmonidai.com\nmonidata.com\nmoniex-verifyb.com\nmonika.love\nmonkeylsp.com\nmonknow.com\nmono.work\nmonolink.net\nmonph.com\nmonsterlin.com\nmontage-tech.com\nmonternet.com\nmontnets.com\nmontres8.com\nmonurhineas.com\nmonv.com\nmonxin.com\nmoocollege.com\nmooctest.net\nmoodmoon.com\nmoodoon.com\nmoogos.com\nmooiee.com\nmoojing.com\nmoojnn.com\nmoolsun.com\nmoomoo.com\nmoomooequity.com\nmoomootrustee.com\nmoomv.com\nmoon-insight.com\nmoonbasa.com\nmoonbio.com\nmoonbitlang.com\nmoonbt.com\nmooncell.wiki\nmoonfly.net\nmoongood.com\nmooninbox.com\nmoonjer.com\nmoonlian.com\nmoonsec.com\nmoonsees.com\nmoonshot.ai\nmoonstatistics.com\nmoonton.com\nmoontonapp.com\nmoontontech.net\nmoonvy.com\nmoonvy.cool\nmooooc.com\nmooool.com\nmooore.net\nmoooyu.com\nmoore.ren\nmoore8.com\nmoorecat.com\nmooreelite.com\nmooreiot.com\nmoorext.com\nmoowo.com\nmooyuu.com\nmooyy.com\nmop.com\nmopaas.com\nmopair-erm.net\nmopcn.com\nmopei8.com\nmoper.me\nmoper.net\nmopicer.com\nmopin.cc\nmopo.com\nmopoint.com\nmopsky.com\nmopxz.com\nmoqie.com\nmoqiehome.com\nmoqifei.com\nmoqikaka.com\nmoqilin.net\nmoqing.com\nmoqingtk.com\nmoqipobing.com\nmoqiwanba.com\nmoqu8.com\nmoquanad.com\nmoquseo.com\nmoraex.com\nmorange.shop\nmordernstone.com\nmorechinese.cc\nmoreck.com\nmoredian.com\nmorefood.com\nmorefreegame.com\nmorefun-philippines.com\nmorefuntengyun.com\nmoregy.com\nmoreless.io\nmorelink.net\nmoremeat.com\nmorequick.net\nmoresing.com\nmorestep.com\nmoretickets.com\nmorevfx.com\nmorewis.com\nmorewiscloud.com\nmorganstanleyhuaxin.com\nmorgendesign.com\nmorihei.net\nmorketing.com\nmorketinglearn.com\nmorketingsummit.com\nmorlab.com\nmorning.work\nmorningcore.com\nmorninghan.com\nmorninginn.com\nmorningwhistle.com\nmorong-elec.com\nmorrisco.cc\nmorstar.net\nmoschat.com\nmoseacg.com\nmoseeker.com\nmosesenglish.com\nmosgcj.com\nmoshanghotel.com\nmoshanghua.net\nmosheng520.com\nmoshengliang.com\nmoshike.com\nmoshou.com\nmoshua.net\nmoshuai.cc\nmosoga.net\nmossimo.net\nmossle.com\nmostch.com\nmostmob.com\nmostsd.com\nmosuzi.com\nmotanku.com\nmotel168.com\nmotherchildren.com\nmotic-electric.com\nmotie.com\nmotieimg.com\nmotiezw.com\nmotilive.com\nmotimaster.com\nmotimo.com\nmotisky.com\nmoto-one.com.hk\nmoto17.com\nmoto8.com\nmoto8.net\nmotomatu.com\nmotooy.com\nmotor-comm.com\nmotormade.com\nmotowoo.com\nmotuo2.com\nmou.ge\nmou.ren\nmouldbbs.com\nmouldnews.com\nmoulem.com\nmoumi.com\nmounriver.com\nmountor.net\nmounui.com\nmouraeodor.com\nmouralanco.com\nmouratoriousi.com\nmousesquadca.org\nmoushei.com\nmousycoder.com\nmout.me\nmoutaichina.com\nmova-tech.com\nmovcam.com\nmovebroad.com\nmovelaser.com\nmovesky.net\nmovie365.tv\nmoviemore.com\nmoviereviewtoday.com\nmovit-tech.com\nmowan123.com\nmoweather.com\nmowgz.com\nmowowo.com\nmoxfive.xyz\nmoxiai.com\nmoxian.com\nmoxiang.plus\nmoxiaoying.com\nmoxidongman.com\nmoxin.me\nmoxing.net\nmoxingbk.com\nmoxingfans.com\nmoxingyun.com\nmoxiu.com\nmoxiu.net\nmoxuangenet.com\nmoyangmoyang.com\nmoyann.com\nmoyol.com\nmoyoyo.com\nmoypk.com\nmoyubuluo.com\nmoyugroup.com\nmoyunteng.com\nmoz8.com\nmozartsemi.com\nmozhan.com\nmozheanquan.com\nmozhedun.com\nmozhenhau.com\nmozichina.com\nmozigu.net\nmozillaonline.com\nmozillazg.com\nmoziqing.com\nmozouyan.com\nmp.cc\nmp17.com\nmp333player.com\nmp4ba.com\nmp4cn.com\nmpaascloud.com\nmpacc.cc\nmpacc.com\nmpacc.net\nmpackchina.com\nmpaidata.com\nmpass.club\nmpbza.com\nmpcloudapp.com\nmpdn.fun\nmpdsj.com\nmph11.com\nmphdx.com\nmpiano.com\nmplus.tech\nmpmc-china.com\nmpnbenefits.download.prss.microsoft.com\nmpnbenefitsrtl.download.prss.microsoft.com\nmpnbenefitsrtluat.download.prss.microsoft.com\nmpoa.vip\nmpopkart.com\nmpqddg.club\nmps.live\nmpserverless.com\nmpsoft.net\nmpxiaomi.net\nmpxx.net\nmqant.com\nmqc168.com\nmqcoffee.com\nmqhospital.com\nmqikan.com\nmqmgroup.com\nmqqurl.com\nmqqy.com\nmqrouter.com\nmqsyr.com\nmqttdkx.vip\nmqttx.app\nmquanquan.com\nmqxpyy.com\nmqxww.com\nmqyu.com\nmqzoneapp.com\nmr-ping.com\nmr77.com\nmr91.com\nmrbanana.com\nmrbird.cc\nmrbook114.com\nmrcrm.com\nmrcywang.com\nmrdede.com\nmrdoc.pro\nmrdooku.com\nmrduan.com\nmrenbaike.com\nmrentea.com\nmrhallacg.com\nmrhe.net\nmrhs.cc\nmrjeke.com\nmrjiang.com\nmrjjxw.com\nmrlian.club\nmrlika.com\nmrlxc51byo.com\nmrmfsc.ltd\nmro365.com\nmro9.com\nmroall.com\nmrobao.com\nmrpyq.com\nmrqf.com\nmrqoxfvs.com\nmrqxs.com\nmrrvendor.com\nmrsdgg.com\nmrsingsing.com\nmrsjzt.com\nmrsta.com\nmrtoss03.com\nmrts.com\nmru-taste.com\nmrutaste.com\nmrvcdn.com\nmrw.so\nmrwish.net\nmrxiao.net\nmrxwlb.com\nmryunwei.com\nmryys.com\nmrzhenggang.com\nms08067.com\nms211.com\nms315.com\nms6666111.com\nmsanjia.com\nmsbank.com\nmscbsc.com\nmscdntrip.com\nmschcdn.com\nmscland.org\nmscodecloud.com\nmsd-facing.com\nmsddp.com\nmsdkpass.com\nmsdn.download.prss.microsoft.com\nmsdn.hk\nmsdnwogaosuni.com\nmsdnxitong.com\nmsdpmarathon.com\nmsdprc.com\nmsdprod-ad.download.prss.microsoft.com\nmsfpay.com\nmsftonlinelab.com\nmsg.work\nmsgamego.com\nmsgcarry.com\nmsgtjj.com\nmsh2020.com\nmshandong.com\nmshao.com\nmshare.cc\nmshareservices.com\nmshchina.com\nmshishang.com\nmshot.com\nmshouyou.com\nmshw.net\nmshxw.com\nmsits.com\nmsjingmi.com\nmsjpay.com\nmsjy123.com\nmskoo.com\nmslmc.net\nmsltbio.com\nmslzk.com\nmsm.moe\nmsmartlife.com\nmsmbjp.com\nmsndvr.com\nmsny.cc\nmsolok.com\nmspace.cc\nmspacecd.com\nmspharm.com\nmsproduct.download.prss.microsoft.com\nmsproductuat.download.prss.microsoft.com\nmsstatic.com\nmst-jc.com\nmstatik.com\nmstchina.com\nmstxx.com\nmsunland.com\nmsweekly.com\nmsxf.com\nmsxf.net\nmsxiaobing.com\nmsxt.com\nmsxxg.com\nmsy5.com\nmsyc.cc\nmsyidai.com\nmsyos.com\nmsysk.com\nmszdld.com\nmszdld.net\nmszlyoozo.com\nmszmapp.com\nmszq.com\nmszsx.com\nmszxyh.com\nmt-bbs.com\nmt-viki.com\nmt-wire.com\nmt180.com\nmt3.com\nmt77.com\nmt888vip.com\nmtab.cc\nmtadvert.com\nmtadx.com\nmtaokj.com\nmtavip.com\nmtblj.com\nmtchome.com\nmtcn.net\nmtcnsoft.com\nmtcsys.com\nmtcx99.com\nmtcxsw.com\nmtcxx.com\nmtcyz.com\nmtdpai.com\nmtdpgame.com\nmtdz.com\nmte-shenzhen.com\nmtedu.com\nmtex.work\nmtfpos.com\nmtgchina.com\nmthlyp.com\nmthreads.com\nmti100.com\nmtiancity.com\nmtianshitong.com\nmtide.net\nmtime.com\nmtimg.net\nmting.info\nmtitest.com\nmtizt.com\nmtjiangsu.com\nmtk.com.tw\nmtk114.com\nmtkdy.com\nmtketang.com\nmtkgvip.com\nmtkpacker.com\nmtksj.com\nmtlyp.work\nmtm.mo\nmtmos.com\nmtmss.com\nmtmssdn.com\nmtmssdn0.com\nmtmt.tech\nmtmyw.com\nmtnets.com\nmtnets.net\nmtoou.info\nmtrmart.com\nmtschina.com\nmtsjgf.com\nmtspark.com\nmttlab.com\nmttsq.com\nmtty.com\nmtv123.com\nmtvip.cc\nmtw.so\nmtwine.com\nmtwl.net\nmtxshop.com\nmtxyx.com\nmtxzs.com\nmtyun.com\nmtzcjy.com\nmtzqb.com\nmtzscp.com\nmtzuichen.com\nmu69.com\nmuaedge.com\nmubanjianli.com\nmubanwan.com\nmubixueyuan.com\nmubon.net\nmubu.com\nmubucm.com\nmucanzhe.com\nmucf.cc\nmucfc.com\nmuch001.com\nmuchangqing.com\nmuchcloud.com\nmuchong.com\nmudanauto.com\nmudgj.com\nmudiaotx.com\nmudongguang.com\nmudotarot.com\nmudu.com\nmudu.tv\nmuduhs.com\nmufengyue.com\nmuftc.com\nmuge.info\nmugeda.com\nmuguang.me\nmuguayuan.com\nmuhai.net\nmuhan.co\nmuhan.ltd\nmuhou.net\nmuhoujiemi.com\nmuhuo.chat\nmuidar.com\nmuimg.com\nmuin.cc\nmuinsoft.com\nmujiangquan.com\nmujihotel-beijing.com\nmujin.net\nmujj.us\nmujoy.sg\nmukenano.com\nmukewang.com\nmukongyun.com\nmukool.com\nmulangbrand.com\nmulanlake.com\nmulazim.com\nmulightapp.com\nmulinsen.com\nmulinyun.com\nmulti-parking.com\nmulticonceptslink.com\nmultilingual-volc.com\nmultimodalmatch.com\nmultiplym.com\nmulunspring.com\nmumayi.com\nmumbuy365.com\nmumingfang.com\nmumunv.com\nmumuplayer.com\nmumuxili.com\nmunantonio.com\nmuncard.com\nmundane.ink\nmuniao.com\nmunling.com\nmunue.com\nmuomou.com\nmupao.com\nmupceet.com\nmuqianyun.com\nmuquan.com\nmuquan.net\nmurata-china.com\nmurdermysterypa.com\nmurl.tv\nmurongtech.com\nmurphysec.com\nmurphyyi.com\nmuryi.net\nmuse.ltd\nmuselab-tech.com\nmusenxi.com\nmuser168.com\nmuseradio.net\nmusestudio.net\nmusetransfer.com\nmushafa.net\nmusialmarketing.com\nmusic-search.org\nmusic4x.com\nmusicchina-expo.com\nmusiccia.com\nmusicd.cc\nmusicdu.com\nmusicedu8.com\nmusiceol.com\nmusicgw.com\nmusicheng.com\nmusiciansfriendsaleusa.shop\nmusikid.com\nmusiness.vip\nmuslimwww.com\nmuspost.icu\nmussgirl.store\nmustangbattery.com\nmustbull.com\nmustelanivalis.com\nmustshipdealyy.shop\nmustups.net\nmusyder.com\nmutean.com\nmutian.net\nmutianyugreatwall.com\nmutieffect.com\nmutouxb.com\nmutouyu.com\nmutualhunter.com\nmuwai.com\nmuwaifanzhiliao.com\nmuwenxi.com\nmux5.com\nmuxin.fun\nmuxiulin.com\nmuyangkuaibao.com\nmuyao.asia\nmuyee.com\nmuyer.com\nmuyeseed.com\nmuyewx.com\nmuyidc.com\nmuyingjie.com\nmuyingzhijia.com\nmuyuanfoods.com\nmuyuanpharm.com\nmuyuanwuliu.com\nmuyuekj0.com\nmuyuge.net\nmuyun.work\nmuyunsoft.com\nmuzhi.us\nmuzhibot.com\nmuzhicao.com\nmuzhifm.com\nmuzhigame.com\nmuzhiwan.com\nmuzhun.com\nmuziang.com\nmuzigame.com\nmuzijie.com\nmuzisoft.com\nmuziyueqiu.com\nmuzsj.com\nmuzuhui.com\nmvad.com\nmvashanghai.org\nmvhere.com\nmvoicer.com\nmvorgexv.com\nmvote.net\nmvpdj.com\nmvpmeta.com\nmvpmob.com\nmvprpg.com\nmvpsky.com\nmvs-intel.com\nmvtianshanlr.com\nmvwchina.com\nmvyxws.com\nmw.com\nmw1950.com\nmwadx.com\nmwave.tech\nmwcdns.com\nmwclg.com\nmwcloudcdn.com\nmwcloudcdn.info\nmwcname.com\nmwdfawg.com\nmweda.com\nmwemp.com\nmwjournalchina.com\nmwkj.net\nmwm.moe\nmwquicio.com\nmwrf.net\nmwrfabc.com\nmwstore.com\nmwtee.com\nmwtg.vip\nmww.so\nmwyzhcdn.com\nmwzhtc.com\nmx-china.net\nmx-fm.com\nmx-industry.com\nmx-xz.com\nmx007.com\nmx175.com\nmx3g.com\nmx520.com\nmxarts.com\nmxbc.com\nmxbc.net\nmxbiao.com\nmxchip.com\nmxddp.com\nmxde.com\nmxdia.com\nmxdjzj.com\nmxdmf.com\nmxdpark-gs.com\nmxdraw.com\nmxdraw3d.com\nmxdx.net\nmxew.com\nmxflutter.com\nmxfy.com\nmxgogo.com\nmxguan.com\nmxhaitao.com\nmxhichina.com\nmxifund.com\nmxitie.com\nmxitres.com\nmxj.cx\nmxjd.com\nmxjtedu.com\nmxjyxx.com\nmxk.cc\nmxkjai.com\nmxklchina.com\nmxmem.com\nmxnavi.com\nmxnxs.com\nmxnzp.com\nmxomo.com\nmxpharm.com\nmxqe.com\nmxria.com\nmxsa2178.club\nmxsyzen.com\nmxtcn.com\nmxtronics.com\nmxun.com\nmxw3.com\nmxweiqi.com\nmxwz.com\nmxxjh.com\nmxyinghang.com\nmxyn.com\nmxzgame.com\nmxzx123.net\nmxzzzs.com\nmy-cpaas.com\nmy-hlb.work\nmy-imcloud.com\nmy-le.com\nmy-ndns.com\nmy-qcloud.com\nmy-summit.com\nmy-tcloud.com\nmy.st.com\nmy0511.com\nmy0511.net\nmy0513.com\nmy0534.com\nmy0538.com\nmy0551.com\nmy0832.com\nmy089.com\nmy120.org\nmy147.com\nmy1616.net\nmy22.art\nmy22.fun\nmy22.info\nmy2852.com\nmy2space.com\nmy2w.com\nmy399.com\nmy3w.com\nmy4399.com\nmy510.com\nmy51y.com\nmy5v.com\nmy68.com\nmy7v.com\nmy88316666.com\nmy9166.com\nmy91app.com\nmy91game.net\nmy9527.com\nmy97.net\nmya92f.icu\nmyagric.com\nmyaijarvis.com\nmyaiwecom.com\nmyalicdn.com\nmyalirtc.com\nmyallvalue.com\nmyanjian.com\nmyanmarembassy.com\nmyanmarembassybeijing.com\nmyapp.com\nmyapp.ltd\nmyaqsh.com\nmyarena7.com\nmyarowanas.com\nmyauth.us\nmybabya.com\nmybarrefitness.com\nmybdqn.com\nmybj.com\nmybjx.net\nmybluefox.com\nmybosc.com\nmyboyan.com\nmybu.net\nmybwallet.com\nmybxg.com\nmycaidan.com\nmycaigou.com\nmycaijing.com\nmycar168.com\nmycar58.com\nmycaraok.com\nmycarbar.com\nmycardgame.net\nmychery.com\nmychery.net\nmychuguan.com\nmychunyan.net\nmyckjr.com\nmycleanmymac.com\nmycloudstudy.com\nmyclub2.com\nmycnc.org\nmycodes.net\nmycollect.net\nmycolorcity.com\nmycolorway.com\nmycoov.com\nmycos.cc\nmycos.com\nmycos.net\nmycos.org\nmycospxk.com\nmycosresearch.net\nmycoss.com\nmycoss.net\nmycoss.org\nmycplife.com\nmycreate.net\nmycyjg.com\nmydadui.com\nmydao.net\nmydatetime.info\nmydcis.net\nmydcyj.com\nmydeal.asia\nmydf.net\nmydical.com\nmydidadi.com\nmydigi.net\nmydigit.net\nmydigitex.com\nmydisk.work\nmydnns.com\nmydns8.com\nmydnser.com\nmydnspod.net\nmydnsw.com\nmydoc.io\nmydoc123.com\nmydown.com\nmydrivers.com\nmydyt.com\nmyecer.com\nmyechannel.com\nmyechinese.com\nmyeclipsecn.com\nmyekp.net\nmyeriri.com\nmyex.cc\nmyezdns.com\nmyfans.cc\nmyfdmg.com\nmyfhospital.com\nmyfrfr.com\nmyfun7.com\nmyfund.com\nmyfushun.com\nmygaks.com\nmygame66.com\nmygame82.com\nmygame88.com\nmygisdel.com\nmygjp.com\nmygobatv.com\nmygolbs.com\nmyguancha.com\nmygymchina.com\nmygzb.com\nmyhard.com\nmyhayo.com\nmyhc.net\nmyherocn.com\nmyhexin.com\nmyhithink.com\nmyhjw.vip\nmyhkw.com\nmyhl-china315.com\nmyhm.org\nmyhomeok.com\nmyhongzuan.com\nmyhopu.com\nmyhostadmin.net\nmyhscodes.com\nmyhuaweicloud-custom.com\nmyhuaweicloud-date.com\nmyhuaweicloud-koodrive.com\nmyhuaweicloud-obs.com\nmyhuaweicloud.com\nmyhuilv.com\nmyhuizhan.com\nmyhwcdn.com\nmyhwclouds.com\nmyhwclouds.net\nmyhxy.com\nmyidc.club\nmyider.com\nmyie.me\nmyie9.com\nmyimis.com\nmyip.la\nmyiplay.com\nmyir-tech.com\nmyirtech.com\nmyitit.com\nmyityun.com\nmyjh.net\nmyjianzhu.com\nmyjiedian.com\nmyjob.com\nmyjob500.com\nmyjujing.com\nmyk3.com\nmykans.com\nmykarry.com\nmykd.cc\nmykeeta.com\nmykeeta.net\nmykqyy.com\nmykscdn.com\nmykuaidi.com\nmykuaiji.com\nmylbabao.com\nmylguoji.com\nmylhh.com\nmylibs.org\nmylightsite.com\nmylike.cc\nmylike.com\nmylike120.com\nmylikechat.com\nmylikesz.com\nmylikeyk.com\nmylinkapp.hk\nmylitboy.com\nmyliwu.net\nmylotushealth.com\nmylovehome.com\nmylsfw.com\nmyluohan.com\nmym001.com\nmym195.com\nmymaitian.com\nmymanhua.com\nmymaudio.com\nmymember.ltd\nmymetal.net\nmymhotel.com\nmyminapp.com\nmymlsoft.com\nmymofun.com\nmymoive.com\nmymova.com\nmymuwu.net\nmynatapp.cc\nmynb8.com\nmynee.com\nmyo.ink\nmyoas.com\nmyoas.net\nmyodatech.com\nmyoed.com\nmyoldtime.com\nmyopenwrt.org\nmyoppo.com\nmyorbita.net\nmyottad.com\nmyouhua.com\nmyouth.net\nmyp17.com\nmyp2pch.net\nmypaas.com\nmyparallelstory.com\nmypcrun.com\nmypethome.com\nmypharma.com\nmypian.com\nmypiao.com\nmypiaojia.com\nmypitaya.com\nmypity.com\nmypiwik.com\nmypm.net\nmyprad.com\nmypscloud.com\nmypsy365.com\nmypx.org\nmyqbosuppportt.com\nmyqcloud.com\nmyqcloud.net\nmyqee.com\nmyqqdd.com\nmyqqjd.com\nmyr9.com\nmyra2.com\nmyrb.net\nmyreadcloud.com\nmyreadme.com\nmyrice.com\nmyrightone.com\nmyrqjt.com\nmyrtb.net\nmyrtx.com\nmyrunners.com\nmysbaojie.com\nmysecretrainbow.com\nmysecrettop.com\nmysemlife.com\nmyseot.com\nmyshipjob.com\nmyshopex.com\nmyshoptago.com\nmyshou.com\nmyshow360.net\nmyshow800.com\nmyshown.com\nmysinamail.com\nmysipo.com\nmysiteres.com\nmysm888.com\nmysmth.net\nmysongktv.com\nmysore-yoga.com\nmyspain.org\nmysql360.com\nmysqlab.net\nmysqlpub.com\nmyssl.com\nmystao.com\nmystarch.com\nmysteel.com\nmysteel.net\nmysteelcdn.com\nmysteelcms.com\nmysticalcard.com\nmysubmail.com\nmysupa.com\nmysuperdns.com\nmysvw.com\nmysybt.com\nmyt126.com\nmytaizhou.net\nmytanwan.com\nmytaofun.com\nmytencentes.com\nmythbird.com\nmythcall.com\nmythcare.com\nmythidea.com\nmythroad.net\nmythsman.com\nmythware.com\nmythware.net\nmytianchang.com\nmytijian.com\nmytju.com\nmytokenapi.com\nmytokenpocket.vip\nmytoptown.com\nmytrix.me\nmytt.com\nmytv365.com\nmytvgame.com\nmytxly.com\nmyuall.com\nmyubbs.com\nmyuclass.com\nmyun.tv\nmyunke.com\nmyusmile.online\nmyvipsalon.com\nmyvs.download.prss.microsoft.com\nmyvsoncloud.com\nmyvsuat.download.prss.microsoft.com\nmywakao.com\nmywaymeta.com\nmyweb888.com\nmyweimai.com\nmywhh.com\nmywinch.com\nmywirebox.com\nmywll.com\nmyworld6.com\nmyxxts.club\nmyxxts.com\nmyxycjh.com\nmyxypt.com\nmyyerrol.xyz\nmyyishu.com\nmyyjs.com\nmyyoudao.com\nmyypark.com\nmyyx618.com\nmyyx915.com\nmyyzd.com\nmyzaker.com\nmyzfw.com\nmyzhenai.com\nmyzhidao.com\nmyzhiniu.com\nmyzte.com\nmyztxyy.com\nmyzxsx.com\nmyzxyy.com\nmyzyy.com\nmyzyzy.com\nmz186.com\nmz52.com\nmz6.net\nmz99.com\nmzbei.com\nmzbkw.com\nmzboss.com\nmzcsdf.com\nmzdscm.com\nmzeyes.com\nmzfanyi.vip\nmzfile.com\nmzfpay.com\nmzfsm.com\nmzfxw.com\nmzgroup.vip\nmzgtuan.com\nmzh.ren\nmzhb.com\nmzhen.com\nmzhfm.com\nmzhu8.com\nmzhujia.com\nmzjiacheng.com\nmzjinyan.com\nmzklg.com\nmzli.club\nmzlittc.com\nmzlwxw.com\nmzlx88.com\nmzlxcl.com\nmzmjyy.com\nmzone.site\nmzqbt.com\nmzrcw.com\nmzread.com\nmzres.com\nmzrmyy.com\nmzsdsyy.com\nmzsemi.com\nmzsky.cc\nmzsmn.com\nmzsrmyy.com\nmzssysmyxgs.com\nmzsvn.com\nmztgame.com\nmztspa.com\nmzty.com\nmztzzx.com\nmzuimg.net\nmzwu.com\nmzxstar.com\nmzxun.com\nmzy0.com\nmzyege.com\nmzyfz.com\nmzyjfcn.com\nmzyun.ren\nmzyunyin.com\nmzyz.com\nmzzhgcc.com\nmzzjw.com\nmzzyk.com\nmzzzn.work\nn-bros.net\nn.biz\nn0808.com\nn0vadesktop.com\nn12345.com\nn13.club\nn1b.com\nn2017.com\nn21.cc\nn21ce.com\nn283nser4cjz.com\nn3sd.com\nn459.com\nn5w.com\nn62f.vip\nn63.com\nn69.com\nn78785.com\nn7maufn.sbs\nn802.com\nn8soft.com\nn9z.net\nna.ci\nnaaln.com\nnabluemedia.com\nnaboyi.com\nnabucuo.com\nnac88.com\nnachuan.com\nnacuiwei.com\nnadianshi.com\nnadioutdoor.com\nnadu8.com\nnaec-cn.com\nnaeeo.com\nnaeraxitang.com\nnagagame.net\nnagain.com\nnagar-setu.com\nnagcloudcs.com\nnagekuai.com\nnagezan.net\nnahuayuan.com\nnahuiyi.com\nnahuo.com\nnahuo8.com\nnahuo9.com\nnaibabiji.com\nnaibago.com\nnaicha99.com\nnaichabiao.com\nnaideceas.com\nnaids.com\nnaifei.pro\nnaifeistation.com\nnaifenzhiku.com\nnaijian.net\nnail-auto.com\nnails7.com\nnaimal.com\nnaimei.com\nnaipan.com\nnaiping.net\nnaisuanbeng.com\nnaitang.com\nnaitta.com\nnaiveadmin.com\nnaiveblue.com\nnaiwch.com\nnaixi.com\nnaixi.org\nnaixuecha.com\nnaiyouxuexi.com\nnajingtech.com\nnajyj.net\nnakedsail.com\nnakeli-biotech.com\nnakevip.com\nnaknor.com\nnakong.com\nnalanchuanmei.com\nnalanxi.com\nnalati.com\nnalichi.com\nnalook.com\nname2012.com\nname321.net\nnameidi.com\nnamejin.com\nnamepre.com\nnameserver.fit\nnamesilodns.com\nnami.com\nnamibox.com\nnamichong.com\nnamihair.com\nnamipan.com\nnamiso.com\nnamisoft.com\nnamitiyu.com\nnamkwonglog.com\nnamoc.org\nnan-cable.com\nnan1688.com\nnana.center\nnanbeige.com\nnanbeijt.com\nnanbeiyou.com\nnanbeiyu.shop\nnanbushenghuo.com\nnancalelectric.com\nnancc.com\nnancharencai.com\nnanchigroup.com\nnanchu.com\nnanchunhz.com\nnandaauto.com\nnandasoft-its.com\nnandasoft.com\nnandiu.com\nnandu.com\nnandufoundation.org\nnanerjia.com\nnanfang-pump.com\nnanfangfood.com\nnanfen.com\nnanfu.com\nnanguache.com\nnanguakexue.biz\nnanguakexue.com\nnangualin.com\nnanguaxia.vip\nnanguowl.com\nnangxia.com\nnanhaibank.com\nnanhaicorp.com\nnanhaisw.com\nnanhaitoday.com\nnanhexinxi.com\nnanhua.net\nnanhuabx.com\nnanhuafunds.com\nnanhuangic.com\nnanhuazaobao.net\nnanhufund.com\nnanhujianshe.com\nnanhunnvjia.com\nnanhuwang.com\nnanjbjjt.com\nnanjet.com\nnanjianggroup.com\nnanjiaogroup.com\nnanjing-pharma.com\nnanjing-reagent.com\nnanjing.com\nnanjingboiler.com\nnanjingbtkt.com\nnanjingbyby.com\nnanjingchenxi.com\nnanjingelectric.com\nnanjinggaopeng.com\nnanjinghuihe.com\nnanjinghuojia.net\nnanjinglf.org\nnanjingludeng.com\nnanjingtianqi114.com\nnanjingttym.com\nnanjingxinxu.com\nnanjingyinuo.com\nnanjixiong.com\nnankaimba.org\nnanlangshengwu.com\nnanlew.com\nnanlingwater.com\nnanlingzr.com\nnanlong.com\nnanmodesign.com\nnanning-marathon.com\nnanninginfo.com\nnanningmhw.com\nnanningmuseum.com\nnanningnongjiao.com\nnanningrcw.com\nnanningtech.com\nnanningxiaoou.com\nnanningyouhua.com\nnanningyuexing.com\nnannjlnk.com\nnanobody-biolab.com\nnanochrom.com\nnanoeast.net\nnanoer.net\nnanoinglobal.com\nnanomicro.com\nnanomotions.com\nnanomxenes.com\nnanosic.com\nnanpowan.com\nnanpu.vip\nnanpua.com\nnanputuo.com\nnanqi.org\nnanqiangbusiness.com\nnanrentu.cc\nnanrenwa.com\nnanrenwo.net\nnanrenzhi.com\nnanshanfuzi.net\nnanshanlvyou.com\nnanshanski.com\nnanshe-tech.com\nnanshiw.com\nnanss.com\nnantaihu.com\nnantong-hst.com\nnantongfeixu.com\nnantonghua.net\nnantoujituan.com\nnanvi.com\nnanxi.me\nnanxiang.info\nnanxingmac.com\nnanxinwang.com\nnanxueqx.com\nnanxunfb.com\nnanyangcable.com\nnanyangdianlan.com\nnanyangzb.com\nnanyinwealth.com\nnanyuecloud.com\nnanyuenews.com\nnanyuetong.com\nnanzao.com\nnanzhougroup.com\nnaobaocun.com\nnaobiao.com\nnaoda.net\nnaoffer.com\nnaokor.com\nnaokr.com\nnaominet.live\nnaono.cc\nnaosiling.com\nnaozhong.net\nnaozoejnnwzjaz.work\nnapengzn.com\nnapiantian.com\nnaqing-tech.com\nnaquan.com\nnaquan.org\nnaradafoundation.org\nnaradahotels.com\nnaradapower.com\nnaris-china.com\nnarkii.com\nnarochina.com\nnaruto.red\nnarwal.com\nnarwaltech.com\nnas-ya.com\nnascrew.com\nnase.tech\nnasenwangluo.net\nnasfreight.com\nnasge.com\nnasgetinfo.com\nnashwork.com\nnasimobi.com\nnasinet.com\nnaslab.club\nnastcorp.com\nnasyeo.com\nnasyun.com\nnat123.com\nnatachem.com\nnatapp.cc\nnatapp1.cc\nnatapp4.cc\nnatappfree.cc\nnatashayana.shop\nnatbbs.com\nnatchecker.com\nnatergy.com\nnatfrp.com\nnationalchip.com\nnationalee.com\nnationsky.com\nnationstech.com\nnativosink.com\nnatnps.com\nnattest-china.com\nnaturali.io\nnaturaltfc.com\nnaturalvision.org\nnature-museum.net\nnatureholisticwellness.com\nnaturesvariety-china.com\nnatywish.com\nnauac.com\nnaupd.com\nnav-cn.com\nnavchina.com\nnavgnss.com\nnavigastar.com\nnavimentum.com\nnavinfo.com\nnaxcx.com\nnaxiaozhu.com\nnaxide.com\nnayatec.com\nnayei.com\nnayuansu.com\nnazarstudios.com\nnazhidj.com\nnazhilong.com\nnazo.fun\nnb-bailing.com\nnb-jf.com\nnb-jiale.com\nnb-medicalsystem.com\nnb160.com\nnb4ds7c13d.com\nnb591.com\nnba98k.com\nnbabm.com\nnbahero.com\nnbahi.com\nnbaidai.com\nnbakan8.com\nnball.cc\nnbamyl.com\nnbaoke.com\nnbappliance.com\nnbaqmq.com\nnbaqsj.com\nnbaqx.com\nnbaxiaoshuo.com\nnbbiao.com\nnbbjack.com\nnbbull.com\nnbbuxiutie.com\nnbcbd.com\nnbcentre.com\nnbchao.com\nnbchen.com\nnbcqjy.org\nnbcsgo.com\nnbctg.com\nnbcyts.com\nnbdavid.com\nnbdeli.com\nnbdeli.net\nnbdeyy.com\nnbdisco.com\nnbdkj.com\nnbdpress.com\nnbdyf.com\nnbdyyy.com\nnbegame.com\nnbegame.net\nnbelec.com\nnbenl.com\nnbfeyy.com\nnbfkgs.com\nnbfox.com\nnbgdjt.com\nnbginnovations.com\nnbgj.net\nnbgjwl.com\nnbgodo.com\nnbgong.com\nnbgree.com\nnbgy.com\nnbhao.org\nnbhechang.com\nnbhhgroup.com\nnbhky.com\nnbhxmr.com\nnbhysj.com\nnbidifund.com\nnbimer.com\nnbit6d.com\nnbjcae.com\nnbjcds.com\nnbjingyong.com\nnbjisi.com\nnbjit.com\nnbjlw.com\nnbjnw.com\nnbjoyo.com\nnbjttz.com\nnbjzjn.com\nnbjzzsw.com\nnbkaisheng.com\nnbkc-rp.com\nnbkdl.com\nnbkjcx.com\nnbkqyy.com\nnblhlyy.com\nnblhwy.com\nnblilong.com\nnblongzhan.com\nnblwhb.com\nnblyhy.com\nnbmai.com\nnbmedicalsystem.com\nnbmiao.com\nnbmidun.com\nnbmpzs.com\nnbmylike.com\nnbmyy.com\nnbmzyl.com\nnbnnn.xyz\nnbocc.com\nnbocqdm.xyz\nnbosco.com\nnbpathcent.org\nnbpmia.com\nnbpolytheatre.com\nnbqixing.com\nnbqwrc.com\nnbrawwater.com\nnbrcg.com\nnbrcw.com\nnbren.net\nnbrj.com\nnbrlzy.com\nnbruili.com\nnbscxh.com\nnbsdjyy.com\nnbsfgy.com\nnbshunjian.com\nnbshuoxue.com\nnbshzwyy.com\nnbsijian.com\nnbslkg.com\nnbslxh.com\nnbsmjt.com\nnbsp99.com\nnbsqbank.com\nnbsti.net\nnbstjt.com\nnbstrans.com\nnbsz.com\nnbszgd.com\nnbt.ren\nnbtlwl.com\nnbtobacco.com\nnbttbn.com\nnbtzjd.com\nnbtzsh.com\nnbuci.com\nnbudp.com\nnbunicom.com\nnbuser.com\nnbvps.net\nnbwaf.net\nnbwan.net\nnbwbw.com\nnbweldingtorch.com\nnbwelldon.com\nnbwetc.com\nnbwhg.com\nnbwskj666.com\nnbxdjt.com\nnbxiaoshi.net\nnbxry.com\nnbxsjg.com\nnbxsrc.com\nnbyang.com\nnbyeda.com\nnbyjrf.com\nnbyouth.com\nnbyyz.com\nnbyzyy.com\nnbzhongxin.com\nnbzhuzhai.com\nnbzjpc.com\nnbzsq.com\nnbzxgj.com\nnbzyenergy.com\nnc-bio.com\nnc189.net\nnc530.com\nncarzone.com\nncawzs.com\nncboo.com\nncc-cma.net\nnccqj.com\nnccurbanmayfair.com\nncderuida.com\nncdxbbs.com\nncepujournal.com\nncfcsa.org\nncfgroup.com\nncfimg.com\nncfjj.com\nncfwx.com\nncfz.com\nncgprq.com\nnch-bg.com\nnchq.cc\nnchtech.com\nnchycw.com\nncidbj.com\nnciyuan.com\nncjrailway.com\nnclqq.com\nncmbio.com\nncmem.com\nncmtkj.com\nncmtr.com\nncnynl.com\nncogvki.xyz\nncpa-classic.com\nncpc.biz\nncpqh.com\nncpssd.org\nncq8.com\nncqiche.com\nncsdyyy.com\nncshxd.com\nncsjhf.com\nncsxy.com\nncsyco.com\nnctry.com\nnctvcloud.com\nnctzsj.com\nncu.me\nncvt.net\nncvtmi.com\nncwckj.com\nncwsxh.org\nncwsxx.com\nncxhrc.com\nncxinshou.com\nncxuw.com\nncyscb.com\nncyunqi.com\nnczfgjj.com\nnczfj.com\nnczxst.com\nnczxwl.com\nnczy.com\nnd15.com\nnd56.com\nnd597.com\nndapp.com\nndbzteck.com\nndcimgs.com\nndcjl.com\nndcpp.com\nndcppx.com\nndcyx.com\nnddaily.com\nnddnrm.com\nnddst.com\nndfdc.com\nndgchina.com\nndgf.net\nndgzy.com\nndhx.net\nndhys.com\nndiip.com\nndj520.com\nndjtwl.com\nndkhn.com\nndkybio.com\nndmh.com\nndoo.net\nndpharm.com\nndsad.com\nndsbbs.com\nndscsoft.com\nndser.net\nndsyy.com\nndszgb.com\nnduoa.com\nnduoshousi.com\nnduotuan.com\nndvfxyvj.sbs\nndxlj.com\nndyt.com\nndzfl.com\nndzls.net\nne01.com\nne21.com\nne365.com\nne56.com\nneapme.com\nnearcharge.com\nneardi.com\nnearsnet.com\nnease.net\nneashow.com\nneat-reader.com\nneatifyapp.com\nneboer.site\nnebulogy.com\nneccsh.com\nnecool.com\nnedfon.co\nnedigitals.com\nneeca.net\nneefood.com\nneegle.net\nneeinn.com\nneep.shop\nneeq.cc\nneets.cc\nneeu.com\nnei-mao.com\nnei.tm\nneigou.com\nneihan.net\nneihancommunity.net\nneihandiantai.com\nneihanfly.com\nneihang.net\nneihanshequ.com\nneimaowang.com\nneimenggugames.com\nneisha.cc\nneitui.com\nneituixiaowangzi.com\nneixiong8.net\nneko.pub\nnekoarch.cc\nnelkshuhe.com\nnellit.info\nnellit.net\nnellit.xyz\nnelson-textiles.com\nnelsonjulia.shop\nnelumbosp.com\nnengapp.com\nnengdarack.com\nnenggeimall.com\nnenghaoidc.com\nnengqiang.com\nnengrui.com\nnengshida.com\nnengshouwangluo.com\nnengyuanxx.com\nnenufm.com\nnenup.com\nnenzei.com\nneo-yiming.com\nneo.org\nneo1989.net\nneoap.com\nneobiochina.com\nneoease.com\nneofaith.net\nneofussvr.sslcs.cdngc.net\nneohytung.com\nneojos.com\nneolee.com\nneolix.net\nneomodulus.com\nneoremind.com\nneoscholar.com\nneoschool.com\nneosey.com\nneoyon.com\nnep-logistics.com\nnephele.tripcdn.com\nneptcn.com\nneptunus.com\nneqtahotelshanghai.com\nnercdtv.org\nnercel.com\nnerin.com\nnero-cn.com\nnerocats.com\nnerochat.com\nnerve-corp.com\nnervepotato.com\nnes-auto.com\nnesbbs.com\nnesmt.org\nnesoso.com\nnesox.com\nnespressochina.com\nnestgene.com\nnestlechinese.com\nnesyouxi.net\nnet-add.com\nnet-measure.net\nnet-rope.com\nnet-sharp.com\nnet-swift.com\nnet-times.net\nnet0516.com\nnet111.info\nnet130.com\nnet199.com\nnet2345.net\nnet263.com\nnet767.com\nnetac.com\nnetandtv.com\nnetat.net\nnetbian.com\nnetbirds.com\nnetbooo.com\nnetchina100.com\nnetcoc.com\nnetcolc.cc\nnetconst.com\nnetcoretec.com\nnetcute.com\nnetded.com\nnetease-inc.com\nnetease.com\nnetease.im\nneteasegame.com\nneteasegame.net\nneteasegames.com\nneteasegames.net\nnetentsec.com\nnetesee.com\nnetgamecar.com\nnetge.com\nnetherlandvcenter.com\nnethonghe.com\nnetianshannu.com\nnetiler.com\nnetinfi.com\nnetinfi.net\nnetingcn.com\nnetitest.com\nnetkao.com\nnetman123.com\nnetnoease.com\nnetor.net\nnetpi.me\nnetpoint25.com\nnetposa.com\nnetqd.com\nnetsmell.com\nnetspreading.com\nnetstatic.net\nnetsun.com\nnetswise.com\nnetsyq.com\nnett.to\nnetvp.net\nnetwork-hk.com\nnetworkbench.com\nnetworkesl.com\nnetworklinkpro.com\nnetworklo.com\nnetzonesoft.com\nnetzz.net\nneu-reality.com\nneucrack.com\nneuedu.com\nneunn.com\nneupaas.com\nneuqsoft.com\nneuroxiv.com\nneuroxiv.net\nneusemi.com\nneusncp.com\nneusoft.com\nneusoftmedical.com\nneutrontek.com\nneux.studio\nnevadaheladosjujuy.com\nnevem.com\nnew-elegance.com\nnew-mobi.com\nnew-thread.com\nnew0633.com\nnew1cloud.com\nnew253.com\nnew669.com\nnew7.com\nnewacademic.net\nnewaigou.com\nnewaircloud.com\nnewamigo.net\nnewamstar.com\nnewansha.com\nnewapi.com\nnewaq.com\nnewasp.com\nnewasp.net\nnewayz.com\nnewbakers.com\nnewbandeng.com\nnewbanker.com\nnewbd.com\nnewbeaconhotels.com\nnewbeebook.com\nnewbeebox.com\nnewbenglish.com\nnewbook8.com\nnewcapec.net\nnewcentral.com\nnewcentury-edu.com\nnewcger.com\nnewchainbase.com\nnewchieve.com\nnewchinabeach.org\nnewchinalife.com\nnewcitygz.com\nnewclasses.org\nnewclouddenfender.com\nnewcoder.com\nnewcosemi.com\nnewdao.net\nnewday.me\nnewdreamgroup.com\nnewdroid.net\nnewdruginfo.com\nnewdu.com\nnewdun.com\nnewe.tv\nnewelementchina.com\nnewer2001.com\nnewevcar.com\nneweyezs.com\nnewft.com\nnewglp.com\nnewgscloud.com\nnewharbour.net\nnewhb.com\nnewhbdoor.com\nnewhopbattery.com\nnewhopeagri.com\nnewhopegroup.com\nnewhqnotary.com\nnewhtml.net\nnewhua.com\nnewikou.com\nnewistock.com\nnewjg.com\nnewkunhua.com\nnewland-edu.com\nnewlandaidc.com\nnewlandcomputer.com\nnewlandnpt.com\nnewlesson.com\nnewlifex.com\nnewlink.com\nnewlixon.com\nnewlongbj.com\nnewlongma.com\nnewluobo.com\nnewmaker.com\nnewman.mobi\nnewmargin.com\nnewmorehot.com\nnewnanbao.com\nnewnewle.com\nnewniu.com\nnewoasis.cc\nnewoo.com\nneworiental.org\nneworldedu.org\nnewposture.vip\nnewqjsteel.com\nnewrathon.com\nnewrizon.com\nnews-cdn.site\nnews18a.com\nnewsccn.com\nnewscctv.net\nnewseasoft.com\nnewsgd.com\nnewsgu.com\nnewsgx.com\nnewshengwei.com\nnewshs.com\nnewsighting.com\nnewsing.com\nnewskj.com\nnewskj.org\nnewskyunion.com\nnewsletter-cn.com\nnewsletter-nespresso.com\nnewslqy.com\nnewsmth.com\nnewsmth.net\nnewsmy-car.com\nnewsmy.com\nnewsmyshop.com\nnewsn.net\nnewspluse.com\nnewssc.net\nnewssc.org\nnewstarpress.com\nnewstartsoft.com\nnewstjk.com\nnewsungroup.com\nnewsungroup.net\nnewsv5.com\nnewsxc.com\nnewsxcar.com\nnewsxy.com\nnewsyc.com\nnewszjk.com\nnewtab123.com\nnewtalentaward.com\nnewtao.work\nnewtimeai.com\nnewtimevalve.com\nnewtonghua.com\nnewtop100.com\nnewtouch-elec.com\nnewtouch.com\nnewtranx.com\nnewtrip.com\nnewume.com\nnewupbank.com\nnewvfx.com\nnewvisionvc.com\nnewvr.com\nnewwatchesale.com\nnewxing.com\nnewxitong.com\nnewxry.com\nnewxue.com\nnewyanshamall.com\nnewyifagroup.com\nnewyishi.com\nnewyorkerdownunder.com\nnewyorkluxurywatch.com\nnewyoton.com\nnewyx.net\nnewzealandvscenter.com\nnewzgc.com\nnewzhizao.com\nnewzhongyuan.com\nnexaparty.com\nnexmoe.com\nnexon.to\nnext-bei.com\nnext-playground.com\nnextclass.club\nnextclass.com\nnextday.im\nnextech-x.com\nnextjoy.com\nnexto2o.com\nnextpcb.com\nnextriskcontrol.com\nnextrt.com\nnextstudios.com\nnexttao.com\nnextvid.net\nnextworkshop.net\nnextyu.com\nnexus-holding.com\nnexus.dell.com\nnexusapex.cfd\nnexusedgeio.com\nnexushd.org\nneyetwatcher.com\nnezhu.com\nneznanskyphoto.com\nnf-ref.com\nnf.video\nnf108.com\nnf56.com\nnfbdc154.org\nnfc315.com\nnfcic.com\nnfcmag.com\nnfcreader.net\nnfcs-med.com\nnfcs-medical.com\nnfdx.net\nnffq.net\nnffund.com\nnfgjhr.com\nnfksjkfs.com\nnflchina.com\nnflsxl.com\nnfmedia.com\nnfmrtfv.com\nnfnews.com\nnfpeople.com\nnfqbyp.com\nnfs-china.com\nnfschina.com\nnfsyx.com\nnftrr.com\nnfvalve.com\nnfwl168.com\nnfxsy.com\nnfyeya.com\nnfyny.com\nnfyun.vip\nnfyy.com\nnfyyzcfy.com\nnfzhouyi.com\nnfzmy.com\nnfzzh.com\nng-alain.com\nng021.com\nnga.wiki\nngaa.info\nngaa.shop\nngaacdn.com\nngaacdn.net\nngaagslb.com\nngaagslb.net\nngabbs.com\nngacn.cc\nngarihealth.com\nngbbs.com\nngc-marine.com\nngcgears.com\nngctransmission.com\nngcz.tv\nngedu.net\nngfcyy.com\nngfjkzps.com\nngh6.com\nngicer.com\nnginstar.net\nngjjtg.com\nngkjjt.com\nngksz.com\nngmap.com\nngmco.net\nngmyt.com\nngnice.com\nngnlink.net\nngo.com\nngotcmszh.com\nngread.com\nngrok.cc\nngs1685.com\nngswgs.com\nngtravelercn.com\nngty556.com\nngwxw.com\nngxn.com\nngzyxx.com\nnh.com\nnh2h.com\nnh56.com\nnhaidu.com\nnhaidu.net\nnhcec.com\nnhcilab.com\nnhcsw.com\nnhd-mart.com\nnhdacrw.xyz\nnhdia.com\nnhdmd.com\nnhfyyy.com\nnhganggeban.com\nnhhongyi.com\nnhjjlt.com\nnhkaiyang.com\nnhkeysu.com\nnhlq.com\nnhmuni.com\nnhnexpo.com\nnhnst.com\nnhooo.com\nnhspd.com\nnhwa-group.com\nnhxz.com\nnhygkj.com\nnhzb.com\nnhzhaopin.com\nnhzj.com\nnhzs.com\nni8.com\nni93.com\nnianchu.net\nnianhuawan.com\nniankawang.com\nnianlingjisuanqi.com\nnianlun010.com\nniannz.com\nnianqin.cc\nnianqin123.com\nnianshao.me\nniansir.com\nniao95.com\nniaobulashi.com\nniaocms.com\nniaogebiji.com\nniaola.com\nniaoquan.fun\nniaosuangao.online\nniaowoclub.com\nniaoyun.com\nniba.com\nnibaguai.com\nnibaku.com\nnibj.com\nnibomu.com\nnic.ren\nnicaicheng.com\nnicaifu.com\nnicaifu.net\nnice-app.com\nnice-china.com\nnice1688.com\nnicebing.com\nnicebooker.com\nnicecdn.com\nnicefilm.com\nniceguo.com\nniceinno.com\nniceios.com\nniceisp.com\nnicekid.com\nnicelabel.cc\nniceloo.com\nnicenergy.com\nnicesnow.com\nnicetheme.xyz\nnicetuan.net\nnicewatch.cc\nnicexf.com\nniceyea.com\nnicezhuanye.com\nnichuanbo.com\nnickbussok.com\nnicksxs.com\nnicky1605.com\nnicolaszhao.com\nniconiconi.cc\nnicosu.com\nnicot-motor.com\nnicotine.vip\nnics365.com\nnicsbuy.com\nnicwind.com\nnidecms.com\nnidiandaojia.com\nnie.io\nnieapps.com\nniegobrand.com\nniegoweb.com\nnielsenccdata.tv\nnies.org\nniexiaotao.com\nnieyou.com\nnifdc.com\nnifengz.com\nnightanddaythegame.com\nnightcity.pub\nnightmare.press\nnihao.net\nnihaoafrica.org\nnihaodd.com\nnihaotv.net\nnihaotw.com\nnihaowang.com\nnihil.cc\nnihonngo.site\nniiam.com\nniiceda.com\nniiddm.com\nniimbot.com\nniiwoo.com\nnikanpian.com\nnike-inc.com.tw\nnike.host\nnike666.com\nnikefans.com\nnikkisoft.com\nnikkiup2u2.com\nnikkon-china.com\nnilai.com\nnileloan.com\nnimitzvac.com\nnimolife.com\nnimzx.com\nnindeli.com\nnine-rivers.com\nninebot-link.com\nninebot.com\nnineplaying.com\nnineroad.com\nninesix.cc\nninestargroup.com\nninestarmall.com\nninetylab.com\nnineya.com\nning0370.com\nningban.com\nningbo-airport.com\nningbocat.com\nningboenlighten.com\nningboexport.com\nningbofy.com\nningborunner.com\nningbotianxia.com\nningbotm.net\nningbowater.com\nningdo.com\nningdong.com\nninghao.net\nninghuoban.com\nningidc.com\nningkangyuan.com\nningkekeji.com\nninglutech.com\nningma.com\nningmengdou.com\nningmengyun.com\nningshing.com\nningtingche.com\nningto.com\nnington.com\nningxi.com\nningxiacaijing.com\nningxiagames.com\nningxiahuangheyun.com\nningxingxing.com\nningzhe.net\nningzhi.net\nningzhishidai.com\nningzhitec.com\nninjacn.com\nninjadq.com\nninomiya.store\nnint.com\nnintaus.com\nninthpalace360.com\nninthpalace520.com\nnio.com\nnio08310lt.com\nnioapis.com\nniozhr.com\nniparts.com\nnipei.com\nnipic.com\nnipponcore.com\nnischina.org\nnishuoa.com\nnissmi.com\nnitaitag.com\nnittoseiki-cn.com\nniu-tu.com\nniu.com\nniua.com\nniuacc.com\nniuaniua.com\nniuap.com\nniubalun.com\nniubb.net\nniubibsn.com\nniubihonghong.net\nniubilai.com\nniubilety.com\nniubixia.com\nniubo.cc\nniuboli.com\nniucache.com\nniucdn.com\nniuche.com\nniuclass.net\nniucodata.com\nniudai120.com\nniudashu.com\nniudie.cc\nniufang.net\nniufun.com\nniug8.com\nniugame.net\nniugp.com\nniuguwang.com\nniuhuagong.com\nniujinniu.com\nniuk12020gi.com\nniukk.com\nniuming147.com\nniunai.com\nniuniu-dns.com\nniuniufund.com\nniuniutui.com\nniupiano.com\nniupianwang.com\nniupinhui.com\nniupu.com\nniuqia.com\nniurenqushi.com\nniurosoft.com\nniuschools.com\nniushe.com\nniushield.online\nniushoushan.net\nniutech.com\nniutk.com\nniutoushe.com\nniutrans.com\nniuwk.com\nniuxgame77.com\nniuxiaoer.net\nniuxyun.com\nniuyou5.com\nniuyuan.com\nniuza.com\nniuzhigongzuo.com\nniuzhu.com\nniuzhuan-test.com\nnivtc.com\nniwangwang.com\nniwodai.com\nniwodai.net\nniwota.com\nniwoxuexi.com\nnixi.win\nnixingtao.com\nnixwang.com\nniyingseo.com\nnizhan888.com\nnizi88.com\nnizkeyboard.com\nnj-anruitai.com\nnj-bl.com\nnj-bw.com\nnj-chishun.com\nnj-control.com\nnj-deli.com\nnj-dhl.com\nnj-gw.com\nnj-halfmarathon.com\nnj-hr.com\nnj-huaqiang.com\nnj-hust.com\nnj-jp.com\nnj-jy.com\nnj-kejin.com\nnj-kk.com\nnj-maici.com\nnj-nanhuai.com\nnj-newhope.com\nnj-qiyiguo.net\nnj-reagent.com\nnj-ss.com\nnj-tencentclb.cloud\nnj-tencentclb.com\nnj-tencentclb.net\nnj-tencentclb.work\nnj-test.com\nnj-tongrentang.com\nnj-tops.com\nnj-tq.com\nnj-xyzs.com\nnj-zhengze.com\nnj-zhongbo.com\nnj-zj.com\nnj0827.net\nnj12320.org\nnj127.com\nnj13z.net\nnj1937.org\nnj29jt.net\nnj303yy.com\nnj63.com\nnj87.com\nnjabsw.net\nnjaces.com\nnjacme.com\nnjajjt.com\nnjajt.com\nnjaline.com\nnjanmu.com\nnjaolian.com\nnjaoti.com\nnjatl.com\nnjavc.com\nnjbaisou.com\nnjbaoxun.com\nnjbdhb.com\nnjbestway.com\nnjbhec.com\nnjbhhb.net\nnjbiaochen.com\nnjbj888.com\nnjbnw.com\nnjbpvi.org\nnjbsby.com\nnjbtkt.com\nnjbx.com\nnjbx.work\nnjbytyq.com\nnjc100.com\nnjcangong.com\nnjcaringmedical.com\nnjcatv.net\nnjcbcmjt.com\nnjccwei.com\nnjcdata.com\nnjcedu.com\nnjcgs.com\nnjchanke.com\nnjchengyi.com\nnjchina.com\nnjcitygas.com\nnjcjby.com\nnjcjszyy.com\nnjcjzz.com\nnjcky.com\nnjcl-gear.com\nnjclwlkj.com\nnjcmotor.com\nnjcmsj.com\nnjcnmc.com\nnjcomptech.com\nnjctcm.com\nnjcttq.com\nnjcw.com\nnjcwlk.com\nnjcxj.com\nnjcyt99.com\nnjd1.com\nnjdapaidang.com\nnjdatang.com\nnjdewo.com\nnjdftl.com\nnjdfwb.com\nnjdfzg.com\nnjdianyong.com\nnjdiip.com\nnjdndz.com\nnjdnjt.com\nnjdq-ld.com\nnjdqgytg.com\nnjdtyx.com\nnjdzjcyq.com\nnjdzn.com\nnjeport.com\nnjfdyy.com\nnjfjkj.com\nnjfk.net\nnjfkdq.com\nnjfklngl.com\nnjflt.com\nnjfmz.com\nnjforge.com\nnjfuruisi.com\nnjfybjy.com\nnjfzad.com\nnjfzdc.com\nnjfzjc.com\nnjfzm.net\nnjgaokai.com\nnjgb.com\nnjgcct.com\nnjgcyy.com\nnjgdbus.com\nnjgdhb.com\nnjgdjg.com\nnjgdmm.com\nnjgean.com\nnjggk.com\nnjgh.org\nnjghes.com\nnjghgf.com\nnjgjj.com\nnjgjngq.com\nnjgjsj.com\nnjgjyy.com\nnjgljy.com\nnjglobalielts.com\nnjglsx.com\nnjglyy.com\nnjgn.com\nnjgreen.net\nnjgsmach.com\nnjguangkui.com\nnjgulan.com\nnjguochu.com\nnjguotong.com\nnjguoxuan.com\nnjgy.net\nnjgyjx.com\nnjgzm.com\nnjhanrui.com\nnjhbyl.com\nnjhctest.com\nnjhcyq.com\nnjhd025.com\nnjhddl.com\nnjhdzy.com\nnjhengda.com\nnjhengyou.com\nnjheyang.com\nnjhgame.com\nnjhightech.com\nnjhipower.com\nnjhjgs.com\nnjhjyy.com\nnjhkyq.com\nnjhmmr.com\nnjhnzx.com\nnjhonest.com\nnjhongfa.com\nnjhonghu.com\nnjhongya.com\nnjhoutai.com\nnjhrjt.com\nnjhsjt.com\nnjhszoo.com\nnjhtg.com\nnjhtjt.com\nnjhuachuang.com\nnjhuatian.com\nnjhuatong.com\nnjhuazhu.com\nnjhunyan.com\nnjhxnpx.com\nnjhxzx.com\nnjhy-elec.com\nnjhy-tech.com\nnjhzypiano.com\nnjiabe.com\nnjiairport.com\nnjianzhan.com\nnjibmfwq.com\nnjicg.com\nnjicia.com\nnjiec.com\nnjiig.com\nnjimi.com\nnjjbsc.com\nnjjcbio.com\nnjjdzl.com\nnjjgfckyy.com\nnjjgjs.com\nnjjgzlgl.com\nnjjhjt.com\nnjjht.com\nnjjiancai.com\nnjjianguo.com\nnjjiantian.com\nnjjienuo.com\nnjjifei.com\nnjjknkyy.com\nnjjn.com\nnjjnrc.com\nnjjnwzyy.com\nnjjnzc.com\nnjjrc.com\nnjjrkj.com\nnjjspzx.com\nnjjst.com\nnjjsxy.com\nnjjsyy.com\nnjjtjl.com\nnjjttt.com\nnjjtxx.org\nnjjundong.com\nnjjunpu.com\nnjjuntong.com\nnjjwkj.com\nnjjxtz.com\nnjjz.net\nnjjzsensor.com\nnjjzyxh.com\nnjkaifeng.com\nnjkaiguan.com\nnjkcsj.com\nnjkeeryq.com\nnjkefayuan.com\nnjkerun.com\nnjkeystone.com\nnjkhhb.com\nnjkhly.com\nnjkilter.com\nnjklclear.com\nnjkongte.com\nnjkoopan.com\nnjkpdz.com\nnjkq.net\nnjkskn.com\nnjkzgjj.com\nnjl114.com\nnjlanwu.com\nnjletop.com\nnjlg56.com\nnjlhzn.com\nnjlianyang.com\nnjlietou.com\nnjlike.com\nnjlingyun.com\nnjliterature.org\nnjlizhuo.com\nnjljhy.com\nnjljjy.com\nnjljscl.com\nnjlkjc.com\nnjlndl.com\nnjlofty.com\nnjlonsen.com\nnjloyalty.net\nnjlrxx.com\nnjlsw.com\nnjltxx.com\nnjluye.com\nnjlyc.com\nnjlyjt.com\nnjlzsx.net\nnjmama.com\nnjmapp.com\nnjmatx.com\nnjmbwxzx.com\nnjmdzx.net\nnjmeisai.com\nnjmes.org\nnjmjs.com\nnjmjzn.com\nnjmkt.com\nnjml120.com\nnjmlxy.com\nnjmoon.com\nnjmsdk.com\nnjmuseum.com\nnjmuseumadmin.com\nnjmwwl.com\nnjnanlin.com\nnjnanmu.com\nnjnaws.com\nnjndgl.com\nnjnemin.com\nnjnewgreen.com\nnjnfwl.com\nnjnhsx.net\nnjnhyx.net\nnjnii.com\nnjningyi.com\nnjnkxt.com\nnjnkzz.com\nnjnpfl.com\nnjntdj.com\nnjnwyy.com\nnjnysoft.com\nnjnzrs.com\nnjodu.com\nnjouman.com\nnjpeptide.com\nnjpkwater.com\nnjpkzyy.com\nnjpmp.com\nnjpuao.com\nnjpud.com\nnjpujiang.com\nnjq.net\nnjqchyxh.com\nnjqhjy.net\nnjqihong.com\nnjqinghai.com\nnjqxrc.com\nnjrbjd.com\nnjrealway.com\nnjrgrj.com\nnjrjt.com\nnjrmzx.com\nnjrnk.com\nnjrs119.com\nnjrsks.net\nnjrsxh.com\nnjruipu.com\nnjruisen.com\nnjrunk.com\nnjrzkj.com\nnjsadz.com\nnjsanhui.com\nnjsdjt.com\nnjsdyy.com\nnjsech.com\nnjsech.net\nnjsenwo.com\nnjservo.com\nnjsfyb.com\nnjshengde.com\nnjshenglue.com\nnjshsh.com\nnjshsw.com\nnjsimba.com\nnjsjz.com\nnjskxlyy.com\nnjskxlyy.net\nnjslaq.com\nnjslawyers.org\nnjsljy.com\nnjsme.com\nnjsmz.com\nnjspkj.com\nnjspkrmyy.com\nnjsqxqyy.com\nnjsrsyxx.com\nnjsspeek.com\nnjstht.com\nnjstia.com\nnjstudy.com\nnjstx.net\nnjstzbxxx.com\nnjsujing.com\nnjsunchem.com\nnjsunlord.com\nnjsunshine.com\nnjswgs.com\nnjswkj.com\nnjsxfxh.com\nnjsyue.com\nnjsyxy.com\nnjszxyy.com\nnjszy.com\nnjtaihong.com\nnjtapery.com\nnjtechsafety.com\nnjteyun.com\nnjtgdq.com\nnjthgy.com\nnjthsp.com\nnjtjyq.com\nnjtn.com\nnjtobacco.com\nnjtoyo.com\nnjtqw.com\nnjtrabon.com\nnjtransplant.com\nnjtrh.com\nnjtrq.com\nnjtst.com\nnjuchem.com\nnjued.com\nnjuoe.com\nnjupco.com\nnjust.pub\nnjuup.com\nnjuwh.com\nnjvcare.com\nnjvkd.com\nnjw88.com\nnjwbjj.com\nnjwcjx.com\nnjwds.com\nnjweixiao.com\nnjweiyi6.com\nnjwmbj.com\nnjwpdi.com\nnjwqqx.com\nnjwrr.com\nnjwsp.com\nnjwtm.com\nnjwtqx.com\nnjwuhe.com\nnjwww.net\nnjwx.com\nnjwz.net\nnjwzjsw.com\nnjxax.com\nnjxcj.com\nnjxfcft-tencentclb.cloud\nnjxfcft-tencentclb.com\nnjxfcft-tencentclb.net\nnjxfcft-tencentclb.work\nnjxiaochi.com\nnjxizebio.com\nnjxjjsjt.com\nnjxkyy.net\nnjxlhd.com\nnjxlxx.com\nnjxnjt.com\nnjxsmz.com\nnjxty.com\nnjxueyun.com\nnjxushang.com\nnjxwyl.com\nnjxxrc.com\nnjxyyy.com\nnjxzwh.com\nnjyafeng.com\nnjyaoze.com\nnjycwy.com\nnjydky.com\nnjyec.com\nnjyhhj.com\nnjyhznkj.com\nnjyjglxh.com\nnjyjxh.com\nnjyjzz.com\nnjyouwin.com\nnjypk.com\nnjyqhj.com\nnjyqkj0ksyz.com\nnjyqmj.com\nnjyspharma.com\nnjysw.com\nnjytian.com\nnjytyy.com\nnjyuanlang.com\nnjyule.club\nnjyulong.com\nnjyuyuan.com\nnjyxdq.com\nnjyy.com\nnjyy.name\nnjyydl.com\nnjyyhyxh.com\nnjyysf.net\nnjyz.net\nnjyzdl.com\nnjyzgz.com\nnjyzmj.com\nnjzb.net\nnjzb.org\nnjzdhotel.com\nnjzdyq.com\nnjzdyy.com\nnjzec.com\nnjzefeng.com\nnjzfy.com\nnjzhengluan.com\nnjzhengyuan.com\nnjzhituo.com\nnjzhongtuo.com\nnjzhsw.com\nnjzhuce.com\nnjzhzx.net\nnjzikao.com\nnjzj.net\nnjzjamc.com\nnjzkwiot.com\nnjzkyy.com\nnjzqzs.com\nnjzrdq.com\nnjzsgroup.com\nnjzxgy.com\nnjzxxyy.com\nnjzychemical.com\nnjzywangluo.com\nnjzztyl.com\nnk-sh.com\nnk8686.com\nnkf-pharma.com\nnkiec.com\nnkjy.com\nnkks378.org\nnkscdn.com\nnkshw.com\nnkuytzv.com\nnkygty.com\nnkzy.com\nnlark.com\nnlbgt.com\nnlecloud.com\nnlhszc.com\nnliniz.com\nnlinkline.com\nnlktj.com\nnlogn.art\nnlpjob.com\nnlplab.com\nnls1853.com\nnlsc.group\nnlscan.com\nnlteck.com\nnlttms.com\nnlww168.com\nnlxn.com\nnlypx.com\nnlyzzzxrmyy.com\nnlzpw.com\nnlzpy.com\nnm178.net\nnm8yx.com\nnmb-bj.com\nnmbcp.com\nnmbfxy.com\nnmboat.com\nnmbxd1.com\nnmbyh.com\nnmcoo.com\nnmcpo.com\nnmet168.com\nnmgbaiju.com\nnmgchina.cc\nnmgczx.com\nnmgd.com\nnmgfood.net\nnmgfrank.com\nnmgfy.com\nnmggwy.org\nnmggyy.com\nnmghhjt.com\nnmghtszkj.com\nnmgjdxy.com\nnmgjkmc.com\nnmgjtjt.com\nnmgjxjy.com\nnmgjyzh.com\nnmgjzyxh.com\nnmglabs.com\nnmglawyer.com\nnmgmarathon.com\nnmgmzys.com\nnmgonline.com\nnmgrsksw.com\nnmgswkj.com\nnmgswtz.com\nnmgup.com\nnmgwhly.com\nnmgwxgs.com\nnmgyjszx.com\nnmimi.com\nnmjtzy.com\nnmjyl.com\nnmkjxy.com\nnmliao.cc\nnmlpa.com\nnmod.net\nnmpfkj.com\nnmrdata.com\nnmrxw.com\nnmsl.gs\nnmslwsnd.com\nnmt2.com\nnmtyxy.com\nnmufh.com\nnmvps.com\nnmwbk.com\nnmweidian.com\nnmxc.ltd\nnmxxprt.com\nnmzh.net\nnn-jinlun.com\nnn-tct.com\nnn.com\nnn12333.com\nnn1yy.com\nnn1zx.com\nnn2fy.com\nnn2yy.com\nnn3yy.com\nnn4yy.com\nnn4z.com\nnn5itt.com\nnn5yy.com\nnn6yy.com\nnn6zx.com\nnn7yy.com\nnn8yy.com\nnn9yy.com\nnnairport.com\nnnanyang.com\nnnayd.com\nnnbanrui.com\nnnbbrn.com\nnnbdfyy.com\nnnbnutritionchina.com\nnnboao.com\nnnbooster.com\nnnboyi.com\nnnbsjyk.com\nnnbtl.com\nnnbupin.com\nnnbyg.com\nnncbre.com\nnncc626.com\nnncg1688.com\nnnch.net\nnnchuangliang.com\nnnchyy.com\nnncj.com\nnncjnkyy.com\nnncjyy.com\nnncjzc.com\nnnclgs.com\nnncnjh.com\nnnctjt.com\nnnctzcfz.com\nnncwsoft.com\nnncxjh.cc\nnncydyf.com\nnncytz.com\nnndache.com\nnndascom.com\nnndayuan.com\nnnddssaaddeeyy.com\nnnddxd.com\nnndegas.com\nnndims.com\nnndj168.com\nnndjg.com\nnndjxcl.com\nnndsj.co\nnndssk.com\nnnduyi.com\nnndya.com\nnndylm.com\nnndz3xu7.com\nnnedqp.com\nnnedu.com\nnnewn.com\nnnfae.com\nnnfcetyy.com\nnnfcxx.com\nnnfdys.com\nnnflkyz.com\nnnflzyyy.com\nnnfrp.com\nnnfsw.com\nnnfwwb.com\nnnfwzl.com\nnngdjt.com\nnngeo.com\nnnggzxc.com\nnngj.com\nnngjj.com\nnngjjx.com\nnnglbj.com\nnngljc888.com\nnngreenscm.com\nnngrhj.com\nnngtbw.com\nnnguphoto.com\nnngxqscy.com\nnngyds.com\nnnhaidong.com\nnnhaoyuan.com\nnnhbsl.com\nnnhccc.com\nnnhccl.com\nnnhcszc.com\nnnhengfu.com\nnnhh8.com\nnnhhhbgs.com\nnnhkdz.com\nnnhlgx.com\nnnhltz.com\nnnhmcj.com\nnnhongbei.com\nnnhpbbs.com\nnnhqcy.com\nnnhqjd.com\nnnhrsip.com\nnnhtsy.com\nnnhuaxin.com\nnnhuaxiong.com\nnnhuishi.com\nnnhwxh.com\nnnhxgg.com\nnnhxwygs.com\nnnhytyy.com\nnnhzkj888.com\nnnhzt.com\nnnippsp.com\nnnit30.com\nnnjajt.com\nnnjajt.xyz\nnnjdgl.com\nnnjgsd.com\nnnjht.com\nnnjhwy.com\nnnjiangmei.com\nnnjieshuo.com\nnnjingchu.com\nnnjingda.com\nnnjingyuan.com\nnnjiuji.com\nnnjiuzhidu.com\nnnjj120.com\nnnjjk.com\nnnjjtgs.com\nnnjkjzs.com\nnnjkwy.com\nnnjl.com\nnnjmskj.com\nnnjnwg.com\nnnjr.co\nnnjsdsoft.com\nnnjsgy.com\nnnjsypx.com\nnnjsza.com\nnnjszlsb.com\nnnjt.com\nnnjtjt.com\nnnjtkt.com\nnnjtyq.com\nnnjuheli.com\nnnjunliang.com\nnnjxbs.com\nnnjy100.com\nnnjzd.com\nnnjzybl.com\nnnkailong.com\nnnkcy.com\nnnkeerlab.com\nnnkeruan.com\nnnkeyuan.com\nnnkhjq.com\nnnkin.com\nnnkj77.com\nnnkqfs.com\nnnkxnz.com\nnnlanfang.com\nnnlfcm.com\nnnlgjt.com\nnnlib.com\nnnljhb.com\nnnljoa.com\nnnljsw.com\nnnlsbl.com\nnnlvdu.com\nnnlwoo.com\nnnlxart.com\nnnlxs.com\nnnlyjp.com\nnnlzhs.com\nnnmama.com\nnnmhzc.com\nnnminghe.com\nnnmingyuanyun.com\nnnmjm.com\nnnmsjdgs.com\nnnmutong.com\nnnmyst.com\nnnmzfy.com\nnnmzof.com\nnnn.vip\nnnn666.com\nnnnen.com\nnnnews.net\nnnngs.com\nnnnntv.com\nnnnuo.com\nnnpckj.com\nnnpma.com\nnnpml.com\nnnpnzx.com\nnnpp.vip\nnnpurapple.com\nnnqh.net\nnnqianfan.com\nnnqmjy.com\nnnqsk.com\nnnrbsoa.com\nnnrc.net\nnnrfjc.com\nnnrig.com\nnnrkz.com\nnnrongjie.com\nnnruixin.com\nnnrxzm.com\nnnryf.com\nnnrzfw.com\nnnsanke.com\nnnsatai.com\nnnsbc.com\nnnsc6.com\nnnscsy.com\nnnsdygs.com\nnnsenhong.com\nnnsftz.com\nnnsg520.com\nnnsgx.com\nnnshengan.com\nnnshenghua.com\nnnshzhg.com\nnnsirui.com\nnnsjcgs.com\nnnslx.com\nnnslzy.com\nnnsmk.com\nnnsmy.com\nnnsqr.com\nnnsrjsnzp.com\nnnssyjs.com\nnnstbss.com\nnnsugar.com\nnnsuoyu.com\nnnsupeng.com\nnnswdx.com\nnnsxd.com\nnnsygs.com\nnnsylq.com\nnnsymy.com\nnnsynldc.com\nnnsynqzyyy.com\nnnsz.com\nnnszwl.com\nnnt0.net\nnntaichu.com\nnnthink.com\nnntlj.com\nnntlyy.com\nnntobo.com\nnnttsoft.com\nnntuobang.com\nnntxw.com\nnntzgz.com\nnnups.com\nnnwb.com\nnnwhg.com\nnnwilking.com\nnnwitkey.com\nnnwk.net\nnnwow.com\nnnwrxd.com\nnnwsgl.com\nnnwtgs.com\nnnwxtzgs.com\nnnwysc.com\nnnwytl.com\nnnxchda.com\nnnxcx.com\nnnxczxjt.com\nnnxdj.com\nnnxfz.com\nnnxiehehospital.com\nnnxinxiang.com\nnnxiyun.com\nnnxjtf.com\nnnxknkyy.com\nnnxl.net\nnnxmbh.com\nnnxqy.com\nnnxsypco.com\nnnxt.net\nnnxxzl.com\nnnybf.com\nnnybskq.com\nnnych.com\nnnydcs.com\nnnyfjc.com\nnnyhjc.com\nnnyhtx.com\nnnyhxl.com\nnnyingxuan.com\nnnyiya.com\nnnyjpco.com\nnnykx.com\nnnylhz.com\nnnynrc.com\nnnyongzhou.com\nnnysart.com\nnnyunying.com\nnnyy17.com\nnnyypc.com\nnnyyq.com\nnnyyyy.com\nnnzc.net\nnnzdbz.com\nnnzgh.org\nnnzgkj.com\nnnzhaoguan.com\nnnzhenyukj.com\nnnzhnm.com\nnnzhuoli.com\nnnzjjckj.com\nnnzjqc.com\nnnzksy.com\nnnzkzs.com\nnnzljx.com\nnnzmyx.com\nnnzn1.com\nnnzp.com\nnnzp.net\nnnzp8.com\nnnzw168.com\nnnzxtx.net\nnnzyjob.com\nno-mad-world.club\nno1news.com\nno8ms.com\nnoahedu.com\nnoaheducation.com\nnoahgroup.com\nnoahhealthcare.com\nnoahpharm.com\nnoahsnail.com\nnoahsoft-vn.com\nnoahteck.com\nnoahwm.com\nnoarter.com\nnobb.cc\nnobel120.com\nnoblefashion.hk\nnobleliftgroup.com\nnoblove.com\nnocang.com\nnocare.com\nnoclyt.com\nnocobase.com\nnocode-tech.com\nnocode.com\nnocode.host\nnod32jihuoma.com\nnodcloud.com\nnode-is.green\nnode1link.xyz\nnodeing.com\nnodejs999.com\nnodekey.com\nnodelayusdtcasino.com\nnodeme.site\nnodepacific.com\nnodpcba.com\nnoeic.com\nnohost.pro\nnohup.cc\nnoipto.host\nnoirphoenix.studio\nnoizztv.com\nnokeeu.com\nnokia-sbell.com\nnokia.press\nnokia88.com\nnokurack.com\nnolanchou.com\nnolibox.com\nnologo.tech\nnolovr.com\nnomax.vip\nnome.com\nnomuaexander.com\nnomuaheridan.com\nnomuamarcia.com\nnomura-nset.com\nnomuraoi-sec.com\nnonfemet.com\nnongbaike.net\nnongbaotong.com\nnongcun5.com\nnongcundating.com\nnongfadai.com\nnongfuspring.com\nnonggan.com\nnonghushi.vip\nnongji1688.com\nnongji1958.com\nnongji360.com\nnongjiao.com\nnongjiaoyun.com\nnongjitong.com\nnongjx.com\nnongkeyu.com\nnongli.com\nnongli.net\nnonglirili.net\nnongmintv.com\nnongnet.com\nnongpin88.com\nnongplay.com\nnongshang.com\nnongxinyin.com\nnongyao001.com\nnongye.tv\nnongyedns.com\nnongyelu.com\nnongyemen.com\nnongyie.com\nnongyu.net\nnonobank.com\nnoobboss.com\nnoobkrf.com\nnoobmb.com\nnoobn6.com\nnoobofficial.com\nnoobsb.com\nnoobshanhe.com\nnoobtime618.com\nnoobvip.com\nnoobwatches.com\nnoobyard.com\nnoobyy.com\nnoobzz.net\nnoodba.com\nnoogel.xyz\nnoomuuhapmav.com\nnoonaspizza.com\nnoonnoora.com\nnoontec.com\nnoops.me\nnooshen.com\nnootoo.com\nnooxion.com\nnoposion.com\nnor-land.com\nnoratechpharma.com\nnorchem-pharma.com\nnordicic.com\nnordicways.com\nnordikr.com\nnordkete.com\nnordonfire.com\nnordritools.com\nnorinco-vehicle.com\nnorinco.com\nnorincogroup-ebuy.com\nnorionpro.com\nnorislam.com\nnoritzd.com\nnormanes.com\nnormar8888.com\nnormcore.com\nnormstar.net\nnorroybioscience.com\nnorsencn.com\nnorth30degrees.com\nnorthbundforum.com\nnorthdy.com\nnorthernlights.ink\nnorthland-bio.com\nnorthsoar.com\nnorthtexascribs.com\nnorthtimes.com\nnosec.org\nnosoul99.com\nnossmoke.com\nnosub.net\nnosuchfield.com\nnosugar.tech\nnosugartech.com\nnot3.com\nnotbucai.com\nnote52.com\nnotedeep.com\nnotetao.com\nnotetech.org\nnotification-list.com\nnotion.pet\nnotonlymoon.com\nnotrisk.com\nnouriz.com\nnouvelles247.com\nnova-test.com\nnovaicare.com\nnovapps.com\nnovastagepharma.com\nnovastargame.net\nnovaxinli.com\nnovel-supertv.com\nnovelbio.com\nnovelfm.com\nnovelfmpic.com\nnovelfmstatic.com\nnovelfmvod.com\nnovell.me\nnovelquickapp.com\nnovelquickapppic.com\nnovemideas.com\nnovo-auto.com\nnovo-biotech.com\nnovocool.com\nnovocranes.com\nnovodriv.com\nnovogene.com\nnovosns.com\nnovotelcitygate.com\nnovots.com\nnovtecgroup.com\nnovtium.com\nnow-cn.net\nnowapi.com\nnowbeta.com\nnowchip.com\nnowcndns.com\nnowcoder.com\nnowcoder.net\nnowcoder.org\nnowec.com\nnowhttps.com\nnowmsg.com\nnowo.com\nnowodds.com\nnowre.com\nnowscore.com\nnowtop.net\nnowxz.com\nnoxgroup.com\nnoxpadelsale.com\nnoxxxx.com\nnoyes88.com\nnp176.com\nnpbbs.net\nnpbeta.com\nnpc233.com\nnpcka.com\nnpedi.com\nnpfls.com\nnphoto.net\nnpi-sh.com\nnpilasers.com\nnpjzjx.com\nnplusgroup.com\nnplusgroup.net\nnpmmirror.com\nnpmss.com\nnpmtrend.com\nnpoall.com\nnpodevelopment.org\nnpp-battery.com\nnpp.cc\nnpqx.com\nnprc.net\nnpsdyyy.com\nnpsel.com\nnptpark.com\nnptparking.com\nnptwedding.com\nnpub.net\nnpuxs.com\nnpxsw.com\nnpz.com\nnq6.com\nnq8.net\nnqctek.com\nnqez.com\nnqjt.com\nnqlai.com\nnqqpp.com\nnqyz.org\nnr-esc.com\nnrb.cc\nnrbbearing.com\nnrdzqwd.com\nnrec.com\nnri-beijing.com\nnrisc.com\nnrmchina.com\nnrmtc.com\nnrsfh.com\nnrsg.net\nnruan.com\nnrwspt.com\nnrzb0.com\nns-china.net\nns1.hk\nns1011.com\nns168.net\nns222s.com\nns365.net\nns5n.com\nns6s6.com\nns8d.com\nnsbdjssy.com\nnsbeta.info\nnsccsc.com\nnschctw.com\nnscloudwaf.com\nnscscc.com\nnscscc.org\nnsd-at.com\nnsdfx.net\nnsdic.com\nnsdszsyxx.com\nnsdt.cloud\nnseac.com\nnsecsoft.com\nnseia.com\nnsemii.com\nnsfocus-sase.com\nnsfocus.com\nnsfocus.net\nnsforce.net\nnsfz.net\nnsfzqhkg.net\nnsgz.net\nnshen.net\nnshzpks.com\nnsig.com\nnsini.com\nnsiqoaks.com\nnsisfans.com\nnsiuqsjaza.com\nnskfagcn.com\nnsknsk.com\nnskwj.com\nnsm-electrical.com\nnsmodel.com\nnsoad.com\nnsqtlcdn.cc\nnsqtlcdn.info\nnsrcup.com\nnsrfww.com\nnsrjlb.com\nnsrmarine.com\nnsseii.com\nnssf.work\nnsshare.com\nnsstream.com\nnsswa.org\nnstfhg.com\nnstggroup.com\nnsuci.com\nnsuuu.com\nnsw58.com\nnsw88.com\nnsw99.com\nnswhj.com\nnswscp.com\nnswyun.com\nnswzs.com\nnsxdns.com\nnsxww.com\nnsydt.com\nnsyhwakrkq2.com\nnsynu.com\nnszmz.com\nnszone.com\nnszxsyxx.com\nnszynd66ggbcx.com\nnt.app\nnt.cc\nnt56.net\nnt6y.com\nntalker.com\nntaow.com\nntc-lft.com\nntc.sh\nntcaac.com\nntcchina.com\nntce.com\nntcfy.com\nntdingke.com\nntdjk.com\nntdsyy.com\nntdvf.com\nntes53.com\nntesmail.com\nntesunn.com\nntfabu.com\nntfan.com\nntfegd.xyz\nntflk.com\nntfsformac.cc\nntfssh.com\nnthcl.com\nnthfw.com\nnthongda.com\nnthysp.com\nnti56.com\nntiee.com\nntjgjt.com\nntjgpx.com\nntjhbw.com\nntjhzy.com\nntjob88.com\nntjoy.com\nntjsxy.com\nntjymall.com\nntjzyxh.com\nntkfqjy.com\nntlcjd.com\nntmlxm.com\nntmyexp.com\nntneuro.org\nntp.felixc.at\nntp123.com\nntpcb.com\nntpcn.com\nntpharma.com\nntptimeserver.com\nntqcct.com\nntqfdq.com\nntrailway.com\nntrc.com\nntrcb.com\nntrun.com\nntsanxin.com\nntsgx.com\nntsuye.com\nnttui.com\nntwikis.com\nntwzy.com\nntxx.net\nntxz.net\nntyodspt.com\nntyodspt.net\nntyswlkj.com\nntyy888.com\nntzhcs.com\nnu1l.com\nnu36.vip\nnuan.chat\nnuan.io\nnuan.org\nnuancaixs.com\nnuancepharma.com\nnuandao.com\nnuanjiayuan.com\nnuannuanapp.com\nnuannuanzu.com\nnuanpaper.com\nnuanque.com\nnuanshi100.com\nnuantingapp.com\nnuantong8.com\nnuanyuehanxing.com\nnubb.com\nnubia.cc\nnubia.com\nnubia.mobi\nnucc.com\nnucleisys.com\nnuctech.com\nnuedc-ti.com\nnuedcchina.com\nnufans.net\nnufrr.com\nnug08010lu.com\nnug08011lu.com\nnug08030lu.com\nnug08031lu.com\nnuhcpf.com\nnuhighbio.com\nnuist.pro\nnulipin.com\nnullice.com\nnullno.com\nnullprivate.com\nnum1dns.com\nnum2020.com\nnumans.cc\nnumemory.com\nnunaios.com\nnuo5.com\nnuoan.com\nnuobaike.com\nnuobeiliao.com\nnuobeirack.com\nnuobz.com\nnuocdn.com\nnuodaguandao.com\nnuodefund.com\nnuodepharm.com\nnuoder.com\nnuoerchina.com\nnuofanpay.com\nnuoguangsh.com\nnuohotel.com\nnuoji.com\nnuoke147.com\nnuomi.com\nnuomicikoi.com\nnuomili.com\nnuomiphp.com\nnuomisi.com\nnuona.com\nnuonuo.com\nnuoshell.com\nnuoshou2023.com\nnuosike.com\nnuoxun.com\nnuoyahao.com\nnuoyasite.com\nnuoye.xyz\nnuozhan.com\nnuozhensh.com\nnuptec.com\nnuqixi.com\nnurotron.com\nnursesky.com\nnusudia.org\nnuszar.xyz\nnutdh.com\nnutra-max.com\nnutriease.com\nnutriera.com\nnutrilite-farm.com\nnutsbp.com\nnutspace.com\nnutstart.com\nnutstore.net\nnutstorehq.com\nnutzam.com\nnuvoltatech.com\nnuvoton-m0.com\nnuvoton-mcu.com\nnuxtv.com\nnuxue.com\nnuyoahbk.com\nnv2118.com\nnvans.com\nnvcam.net\nnvcong.com\nnvgate16.nvidia.com\nnvhaiz.com\nnvidia-china.com\nnvkan.com\nnvpuse.com\nnvpuwo.com\nnvsay.com\nnvshenfan.com\nnvsheng.com\nnvshengjie.com\nnvshuyun.com\nnvsip.com\nnvwu.com\nnvyouguoji.com\nnvzhanshen.com\nnvziwu.com\nnw-host.com\nnw0898.com\nnwbiotec.com\nnwct.me\nnwdlink.com\nnweon.com\nnwncd.com\nnwshotel.com\nnwzg.net\nnx-sc.com\nnx.cm\nnx12346.com\nnx5.com\nnxadmin.com\nnxcells.com\nnxcrb.com\nnxdns.net\nnxeduyun.com\nnxengine.com\nnxez.com\nnxgangyi.com\nnxgjbyy.com\nnxgtjt.com\nnxgyzb.com\nnxhongshanhe.com\nnxin.com\nnxist.com\nnxit.us\nnxjwl.com\nnxlayer2.com\nnxls.com\nnxly766.com\nnxmy.com\nnxnba.com\nnxnews.net\nnxnmedia.com\nnxnresearch.com\nnxny.com\nnxpta.com\nnxrmyy.com\nnxrrvmy.com\nnxrte.com\nnxruixin.com\nnxsjgd.com\nnxstjt.com\nnxsyy.com\nnxtf.net\nnxtianshangb.com\nnxwly.com\nnxxdns.com\nnxxh.net\nnxxhr.com\nnxxinhaoyuan.com\nnxxllt.com\nnxxmqy.com\nnxxzyimg.com\nnxyqs.com\nnxyqs.net\nnxyxh.net\nnxyy.asia\nnxzcah.com\nnxzhnyyjy.com\nnxzwnews.net\nny-yy.com\nny1988.com\nny2000.com\nnya.ink\nnyaacat.com\nnyat.app\nnyato.com\nnybai.com\nnybaidu.net\nnybw.net\nnybyggx.com\nnyckidsclub.com\nnyd7y.com\nnydsrrsh.com\nnyefy.com\nnyfzx.com\nnyhnx.com\nnyhpyq.com\nnyjvbs.xyz\nnyjy-china.com\nnylingshang.com\nnync.com\nnypd520.com\nnyrmyy.com\nnysenba.com\nnysgjgs.com\nnyshipyard.com\nnyshszh.com\nnyshui.com\nnysswq.com\nnywz.net\nnyxg.vip\nnyxgs.com\nnyxiecheng.com\nnyxlzy.com\nnyxr-home.com\nnyxx365.com\nnyxz166.com\nnyyfy.com\nnyzdjj.com\nnyzy.com\nnz86.com\nnz998.com\nnzb555.com\nnzbdw.com\nnzcxh.com\nnzggroup.com\nnzghotel.com\nnzhnb.com\nnziku.com\nnzkd.com\nnzl09250oa.com\nnzlw.com\nnzmice.com\nnzqyowk.com\nnzrlzy.com\nnzsensing.com\nnzsiteres.com\nnzw6.com\nnzwgs.com\nnzxww.com\nnzygyt.com\no--o.win\no-home.com\no-hr.com\no-netcom.com\no-star.cc\no0-2.com\no02231aokk.com\no02251aokk.com\no03011aokk.com\no03080aokk.com\no0310o.com\no03121aokk.com\no0o0w.com\no136.com\no2123.com\no2ee.com\no2moment.com\no2o4.com\no2oa.net\no2obill.com\no2ocms.com\no2ocn.com\no2oexpo.com\no2onet.com\no2packs.com\no2pcn.com\no2ting.com\no365cn.com\no37o.net\no3ndix.com\no571.com\no6s.net\no7h.net\no8u3n4q7fe.com\no92mv1ik.baby\noa025.com\noa0351.com\noa7day.com\noa8000.com\noa8858.com\noabc.cc\noabg.net\noachee.com\noacrm.com\noact.net\noadz.com\noafocus.net\noahelp.com\noahelp.net\noaimai.com\noait360.com\noak-amc.com\noaloft.com\noaloft.net\noalur.com\noameibang.com\noaooa.com\noaqi.com\noasesalliance.com\noasistry.com\noatenglish.com\noatos.com\noauto.com\noayqwkhg.com\noaz.cc\nobagame.com\nobai.cc\nobaku.com\nobeesmedia.com\nobeishi.com\nobesu.com\nobetal.com\nobins.net\nobj.cc\nobj6.com\nobjccn.io\nobjcer.com\nobjcoding.com\nobkoro1.com\nobolee.com\noborad.com\nobowin.com\nobrao.com\nobsapp.net\nobsbot.com\nobsidian-display.com\nobsworks.com\nobtelecom.com\nobyee.com\nocahs.com\nocale.net\nocamar.com\nocar.tv\noccasionishoes.club\noccpay.com\nocd120.com\noceanaircorp.com\noceanbase.com\noceanbites123.com\noceancloudapi.com\noceancus.com\noceandatas.com\noceando.cloud\noceanengine.com\noceanhood.com\noceanol.com\noceanorama.com\noceanpine.net\noceanplayable.com\noceantime.org\nocent.net\nocetest.com\nocfess.com\nocft.com\nochirly.com\nochsystems.com\nocic-static.com\nocici.com\nocideal.com\nocimg.com\noclean.com\noclkj.com\nocn187.com\nocnttv.com\nocpuritech.com\nocsjs.com\nocsp.us.cdnetworks.com\nocssaas.com\noct-asia.com\noct-cts.com\noctbay.com\noctcommercial.com\nocteshow.com\noctgulou.com\noctholding.com\nocthotels.com\noctinn.com\noctmami.com\nocto.fm\noctocathub.com\noctoparse.com\noctopus31.com\noctopusgame.com\noctre.com\noctsszj.com\noctsunshine.com\noctwuhan.com\noculist.net\nocwms.com\nocypo.org\nodaily.news\nodalong.com\nodao.com\nodeasports.com\nodict.net\nodinichina.com\nodinjc.com\nodinjilin.com\nodinliu.com\nodlkj.com\nodohx.org\nody8.com\nodypw.com\nodyzj.com\noealy.com\noeasy.org\noec365.com\noecr.com\noectib.com\noedtech.com\noedun.com\noeebee.com\noeeee.com\noejournal.org\noelove.com\noemao.com\noemhouse.com\noemnew.com\noempromo.com\noemresource.com\noemsoc.download.prss.microsoft.com\noemsocuat.download.prss.microsoft.com\noemssl.cn.cdn.cloudflare.net\noeob.net\noepkgs.net\noepkgs.org\noesell.com\noetsi.com\nof3d.com\nofcard.com\nofcms.com\nofdreader.net\nofenka.com\noffcn.com\noffer-wow.com\nofferpluscn.com\noffersloc.com\nofferstrack.net\noffice-cn.net\noffice-kagu1.com\noffice68.com\noffice8hour.com\nofficeaid.com\nofficeaid02.com\nofficebai.com\nofficebay.net\nofficecdn.microsoft.com\nofficectrl.com\nofficemkt.download.prss.microsoft.com\nofficemktuat.download.prss.microsoft.com\nofficese.com\nofficesoftcn.com\nofficeweb365.com\nofficezhushou.com\nofficezy.com\noffodd.com\noffshoremedia.net\nofgame.net\nofidc.com\nofo.com\nofopp.com\nofpay.com\nofpay365.com\nofuns.com\nofweek.com\nofweek.net\nofyoo.com\nogame3.com\nogaoxiao.com\nogccdn.com\nogl-dragon.com\noh100.com\noh4k.com\nohausyt.com\nohedu.net\nohgnylbp.shop\nohipic.com\nohltjt.com\nohltk.com\nohneen.com\nohohklp.xyz\nohqly.com\nohtly.com\nohtpc.com\nohuam.com\nohyee.cc\noi-wiki.com\noi-wiki.org\noi3g.com\noia05041klq.com\noia05050klq.com\noia05051klq.com\noiaqye7985.com\noicat.com\noicp.io\noicp.net\noicp.vip\noicq88.com\noicto.com\noidchina.org\noigcn.com\noigps.com\noiine.com\noiinhand.info\noilchem.net\noilcn.com\noildigital.com\noilepay.com\noilmooc.com\noinbag.com\noincp.com\noinva5yl.com\noioidesign.com\noioiok.com\noioj.net\noishi-tm.com\noiwas.com\noiz611.com\nojcdn.com\nojhdt.com\nojidacp.com\nojkjt.com\nojpal.com\nok-meeting.com\nok-skins.com\nok0415.com\nok06.com\nok096.com\nok100i.work\nok123.com\nok126.net\nok1616.com\nok165.com\nok168.com\nok183.com\nok206.com\nok3w.net\nok619.com\nok888883.com\nok9624.com\noka-vip.com\nokaapps.com\nokad.com\nokada-china.com\nokadwin.com\nokair.net\nokaoyan.com\nokayapi.com\nokaybio.com\nokbao.com\nokbase.net\nokbmf.com\nokbuy.com\nokcard.com\nokcdnns.com\nokchang.com\nokchexian.com\nokcxo.com\nokdai.com\nokdcc.com\nokdd.net\nokemu.com\nokex.vip\nokeycar.com\nokfang.com\nokgoes.com\nokhimalayanzi.com\nokhqb.com\nokidc.com\nokideaad.com\nokii.com\nokjc.one\nokjike.com\nokjk.co\nokk123.com\nokki.com\nokktee.com\noklaapp.com\noklink.com\noklinklink.com\nokmao.com\nokmart.com\nokmyapp.com\nokng.com\nokokw.com\nokooo.com\nokoooimg.com\nokplife.com\nokpp01040.xyz\nokpush.com\nokr.com\nokrecovery.com\noks.ltd\noksec.net\noksun.com\noksvn.com\noktamall.com\noktjy.com\noktools.xyz\noktranslation.com\noktukids.com\nokuer.com\nokuma-byjc.com\nokvnet.com\nokweb.info\nokwuyou.com\nokxr.com\nokyueche.com\nol-cdn.com\nol-img.com\nolabo.net\nolacio.com\nolakeji.com\nolami.ai\nolatop.com\nolcdn.com\noldboyedu.com\noldcat.me\noldding.net\noldj.net\noldmanemu.net\noldmantvg.net\noldpan.me\nole-vod.com\nolecn.com\noleoad.com\noli-wolong.com\noliannews.com\nolidun.com\nolinone.com\nolipharma.com\noliver.ren\noliveryang.net\nollomall.com\nolmhedbg.cc\nolo4.com\nolokitchen.com\noltfm.com\nolwsz.com\nolxd.com\nolympicmuseum-nj.org\nolymtech.com\nolymvax.com\nolys88.com\nolzz.com\nomacloud.com\nomarea.com\nomarte.com\nomaten.com\nombuy.com\nomccsh.com\nomchain.com\nomcube.com\nomedsc.com\nomeet.cc\nomegatravel.net\nomegaxyz.com\nomen.com\nomgxy.com\nomiaozu.com\nomicsclass.com\nomicshare.com\nomicshare.net\nomifanyi.com\nomigr.com\nomlzx.com\nomlzz.com\nommoo.com\nomni-pharma.com\nomnijoi.com\nomnivision-group.com\nomnshoes.com\nomobi.cc\nomooo.com\nomooo.net\nomos88.com\nomowork.com\nompchina.net\nompower.cc\nomronmed.com\noms-elevator.com\nomsheji.com\nomsmy.com\nomso2o.com\nomycar.cc\nomyerp.com\non-sun.com\nonaliyun.com\noncanyin.com\nonccc.com\noncdp.com\nonceai.com\nonceoa.com\nonche.net\noncity.cc\none-all.com\none-cdn.com\none-netbook.com\none-punch.win\none.edu.kg\none918.com\nonealert.com\noneapm.com\noneasp.com\nonebash.com\nonebiji.com\nonebox.site\nonebrowser.net\nonebuygz.com\nonecoder.site\nonecommunity-asia.com\noneconnectft.com\nonedi.net\nonediankeji.com\nonedict.com\nonedns.net\noneflys.com\nonefoot365.com\nonegg.site\nonegobrand.com\nonegreen.net\nonehome.me\nonehousesh.com\noneic.com\nonein.com\noneinf.com\noneitfarm.com\noneiwff.com\nonekey.cc\nonekeyghost.com\nonekeyrom.com\noneleafchina.com\nonelic.work\nonelife-love.com\nonelinkplus.com\nonelnk.com\nonemtservers.com\nonenice.tech\noneniceapp.com\nonenoter.com\noneonewrite.com\noneplus.com\noneplus6666.com\noneplusbbs.com\noneplusmobile.com\nonescorpion.com\noneself.icu\noneshao.com\nonesight.com\nonespacechina.com\nonesun-china.com\nonething.net\nonethingc.com\nonethingcloud.com\nonethingd.com\nonethingn.com\nonethingpcs.com\nonethingtech.net\nonetop.net\nonetts.com\noneuedu.com\nonev.cat\nonevcat.com\noneway.mobi\nonewedesign.com\nonewo.com\nonewos.com\nonewsimg.com\nonewsvod.com\nonewtech.com\nonexinli.com\nonexmail.com\nonexunge.com\noneyac.com\nonezapp.com\nonezh.com\nonfun.net\nongoalconveying.com\nongoaltech.com\nonijiang.com\nonishi-cn.com\nonixhiend.com\nonjobedu.com\nonkocares.com\nonlady.net\nonline-cmcc.net\nonline-edu.org\nonline-phaidon.shop\nonlinecn.com\nonlineding.com\nonlinedown.net\nonlinekr.com\nonlinenic.net\nonlinesjtu.com\nonlinesurvey.work\nonlinexijiang.com\nonlly.com\nonloon.net\nonly-memory.com\nonly-moment.com\nonly4.work\nonlyedu.com\nonlyedu.net\nonlyeduit.com\nonlygamefans.com\nonlyidc.com\nonlylady.com\nonlyling.com\nonlyliuxue.com\nonlymr.com\nonlypat.com\nonlyred.net\nonlyrobotedu.com\nonlyrubberparts.com\nonlystem.com\nonlywem.com\nonnets1.xyz\nono-bbb.com\nonochem.com\nonrunningshop.com\nonsiteclub.com\nontall.com\nontheroadstore.com\nonthetrip.com\nonthink.com\nonwaf.com\nonwear.net\nonwork.com\nonwsw.com\nonyealink.com\nonyi.net\nonyuan.com\nonyxcina.com\nonyxwater.net\noo14.com\noo365.com\nooamjs.work\noobao.net\noocct.com\noocheoo.com\nooclab.com\noodii.com\noofont.com\noofos-sandals.net\noogcw.com\noogps.com\noogsy.com\noohdear.com\nooiii.com\noojsq.com\noolap.com\noomake.com\nooniu.com\noonne.com\noooccc.com\nooofoo.com\nooogo.com\noooiove.com\nooojogo.com\nooomm.com\nooooai.com\noooooooooo213.com\nooopic.com\noopswow.com\noopz.vip\noortgslb.com\noortos.tech\nootu.cc\noouee.com\noouyan.com\noov.cc\nooxoo.net\nooxxc.com\nooyyee.com\nop86.net\nopadlink.com\nopahnet.com\nopaidb.com\nopal-qt.com\nopalhk.com\nopark.com\nopatseg.com\nopcool.com\nopdown.com\nopectek.com\nopen-ct.com\nopen-douyin.com\nopen-falcon.com\nopen-falcon.org\nopen-open.com\nopen-search.org\nopen-verify.cc\nopen1024.com\nopen147.com\nopen189.net\nopenaboc.com\nopenadx.com\nopenai.wf\nopenailab.com\nopenanolis.org\nopenapp.run\nopenasic.org\nopenatom.club\nopenbayes.com\nopenbcs.com\nopencas.org\nopencitybrain.org\nopencloudgpt.online\nopencloudos.org\nopencloudos.tech\nopencourt.vip\nopendatalab.com\nopendns123.com\nopenedv.com\nopenerp.hk\nopeneuler.org\nopeneuler.sh\nopenew.com\nopenfans.org\nopenfde.com\nopenfrp.net\nopengame0.com\nopengcc.org\nopengslb.com\nopenharmonyproject.com\nopenhippy.com\nopeninstall.com\nopeninstall.io\nopenintelliedge.tech\nopenke.net\nopenlanguage.com\nopenlaw.work\nopenlayers.vip\nopenlearning.com\nopenlink.cc\nopenloong.org\nopenloongson.org\nopenluat.com\nopenmidas.com\nopenmmlab.com\nopenmv.cc\nopenos.org\nopenqa.com\nopenrasp.com\nopenrasp.info\nopenrasp.net\nopenrasp.org\nopenredcloud.com\nopenrice.com\nopenrtbadx.com\nopensoce.com\nopensplendid.com\nopenssw.com\nopenswap.space\nopentrust.net\nopenuc.com\nopenvela.com\nopenwbs.com\nopenwrt.ai\nopenwrt.pro\nopenxiaoniu.com\nopenxsea.com\noperachina.com\nopfed.com\nopfibre.com\nopgw-oppc.com\nopjmw1.ren\nopkjh.com\noplay.net\noplinking.com\noplus.com\noplustrust.com\nopmaterial.com\nopp2.com\noppein.com\nopplestore.com\noppo.com\noppoer.me\noppofind.com\noppojia.com\noppomobile.com\noppopay.com\nopportunuity.com\nopposales.com\nopposhop.in\nopposhore.com\noppowork.com\nopqnext.com\noprtb.com\nopsapp.com\nopshields.com\nopsjuas.shop\nopskb.com\nopskumu.com\nopstatistics.com\nopstool.com\nopt-os.com\noptaim.com\noptbbs.com\nopticres.com\nopticsjournal.net\noptimix.asia\noptimized-ai.com\noptinetchina.com\noptiondoma.com\noptmv.com\noptol.net\noptomedic.com\noptuk2.com\noptzmx.com\nopus-gaming.com\nopwill.com\nopython.com\noqss.com\noqwizd.com\noqwnfambg.com\nor-sun.com\noraev.com\norafl.com\noralpractice.com\norange-ci.net\norange2h.com\norangeapk.com\norangeclk.com\norangelovely.com\norangemum.com\norangenews.hk\norangepi.org\norangesgame.com\norangetage.com\norangevip.com\noraper.com\norasos.com\noray.com\noray.net\noraybox.com\noraycn.com\norayer.com\norayimg.com\norbiepharm.com\norbitmes.com\norcadt.com\norchid-lanhua.com\norchome.com\norcode.com\norcony.com\nordchaos.com\nordedr.com\norderorigin.com\nordinaryroad.tech\nordosbank.com\nordosqyjt.com\nordostonghui.com\norebotech.com\norepainc.com\norfactory.com\norg-hddnf.vip\norg-tollsi.cc\norgano-sz.com\norgcc.com\norggd.com\norgleaf.com\noriemac.com\norient-fund.com\norient-opto.com\norient-safety.com\norientaldata.com\norientalgas.com\norientalpearltower.com\norientalplaza.com\norientalwisdom.com\norientcable.com\norientcasa.com\norientengg.com\norientfoods.net\norientgene.com\norientgolf.com\norientgroup.com\norientpc.com\norientpowertech.com\norientscape.com\norienttextile.com\norienttumor.com\norientzj.com\norientzr.com\norifound.com\noriginalimg.com\noriginalkindergarten.com\noriginalstatic.com\noriginalvod.com\norigincn.com\noriginlee.com\noriginoo.com\noriginpic.com\noriginsilicon.com\noriginwater.com\norigloria.com\norihard.com\noriphant.com\noritive.com\noriza.com\norjlight.com\norleto.com\norm-compressor.com\norolay.com\norsoon.com\norspr.com\norstatic.com\norsun.cc\nortc.cc\nortmk.com\norvibo.com\norz-dns.com\norz.asia\norz520.com\norz6.com\norztip.com\nos-easy.com\nos-os.com\nos-v.com\nos7blue.com\nosaaa.com\nosakacopyshop.com\nosase.net\nosbdf.com\nosbean.com\nosbkj.com\nosbzr.com\nosc.cool\noscaches.com\noscarzhoud.com\noschina.com\noschina.io\noschina.net\noscs1024.com\nosechina.com\nosee-dig.com\noseminfo.com\noserror.com\nosf2f.net\nosfipin.com\nosgchina.org\nosgervirtual.com\nosgraph.com\nosgz.com\noshadan.com\noshield.com\noshome.com\noshoplive.com\noshwhub.com\nosicgroup.com\nosizx.com\nosjiaju.com\nosk-clean.com\noskwai.com\noskwai.net\noslaw.net\nosm-pearls.com\nosmanbio.com\nosmundacn.com\nosnvuqwlsjakf.com\noso6.com\nosogoo.com\nosoos.com\nososn.com\nosp.io\nospchina.com\nospod.com\nosportsmedia.com\nospp.com\nospuq.org\nosredm.com\nosrelease.download.prss.microsoft.com\noss-cn-beijing-aliyuncs.com\noss.link\nossdshxh.com\nosslan.com\nosuxrq.com\nosvlabs.com\nosw3c.com\noswdj.com\noswhy.com\nosx.cx\nosxxy.com\nosyunwei.com\notakirispring.org\notbmall.com\notc-china.com\notcgd.com\notcms.com\notkglass.com\notm.ink\notms.com\notoeasy.com\notomedream.com\notosaas.com\notp-express.com\notpub.com\notqyzk7mx2t8.com\nott4china.com\nottai.com\nottcn.com\nottcn.help\nottffss.net\nottshopping.net\nottssp.com\nottv.tv\notuxu.com\notype.com\nou163.com\nou99.com\nouapi.com\noubauneereid.com\noubiix.lol\noubk.com\nouchang.net\nouchengzl.com\nouchgzee.com\noucuibo.com\noudapay.com\noudas.tech\noudianyun.com\nouei-sc-mulohomasi.com\noufa-travel.com\noufengblog.com\noufusoft.com\nougei.com\nouhua.info\nouhui.org\nouies88.com\nouj.com\noujiangroup.net\noujistore.com\noukan.online\noukyx.com\noulagongshi.com\noulehdtv.com\noulgp.com\nouliwang.com\noulongauto.com\nouluwind.com\nouluyun.com\noulvnet.com\noumaan.com\noumakspt.com\noume.cc\noumengke.com\nouming.com\noumoo.com\nounh.org\nounoe.com\nounuoyq.com\nouo7.com\nouou.com\nouou.icu\nououbet.com\nouougo.com\noupaigroup.com\noupeng.com\noupengcloud.net\noupula.com\noupuzw.com\nouqo05161luj.com\nour100.net\nour360vr.com\nourai.ws\nourail.com\nourats.com\nouravr.com\nourbloom.com\nourbluecity.com\nourcargo.com\nourcdns.com\nourchem.com\nourcm.net\nourdian.com\nourdlbs.com\nourdomains.com\nourdvs.com\nourdvs.info\nourdvs.net\nourdvsss.com\nourdvsssvip.com\nourdxz.com\nourdxz.info\nourdxz.org\noureman.com\nourep.com\nourfdn.com\nourgame.com\nourger.com\nourglb.com\nourglb.net\nourglb0.com\nourglb0.info\nourglb0.net\nourglb0.org\nourhf.com\nourhlb.com\nourhlb.info\nourhlb.org\nourhy.net\nourjay.com\nourjewel.com\nourjg.com\nourjiangsu.com\nourjs.com\nourjz.com\nourl.co\nourleadchina.com\nourlife365.com\nourltc.com\nourmate.net\nourmis.com\nourpalm.com\nourplat.net\nourplay.net\nourqm.com\nourren.com\noursakura.com\nourschool.cc\noursec1.com\noursec2.com\nourseo.net\noursmc.com\nourstech.com\nourtour.com\nourunited.com\nourwebat.com\nourwebcdn.com\nourwebcdn.info\nourwebcdn.net\nourwebcdn.org\nourwebhttps.com\nourwebpic.com\nourwebpic.info\nourwebpic.net\nourwebpic.org\nourwebpicvip.com\nouryao.com\nousaikj.com\noushangstyle.com\noushidiban.net\noushinet.com\noushisheng.com\noushivoyages.com\nousweixin.com\noutbrandlink.com\noutes.com\noutfit7.com\noutfit7.net\noutlets365.com\noutletscn.com\noutman.press\noutsoo.com\nouvps.com\nouwost.com\nouxiangxiezhen.com\nouyada.com\nouyade.com\nouyanghuasi.net\nouyaoxiazai.com\nouyeel.com\nouyingyimin.com\nouyizs.com\nouyu158.com\nouzhaorj.com\nouzhou.cc\nouzhougoufang.com\nov5.org\novalechina.com\novaqrzcw.com\novcreative.com\novdlb.com\novdream.com\novear.info\novellpump.com\noversea-ks-cdn.com\noverseasops.com\noverseaspharm.com\novertrue.me\noverturechina.com\novglass.com\novhlb.com\novhlb.net\novicnet.com\novital.com\novital.net\novjpvk.org\novmgc.com\novopark.com\novopic.com\novqq.com\novrvo.com\novscdns.com\novscdns.net\novuems.com\novupre.com\novuwork.com\novxe.com\nowalle.com\noway.mobi\nowecn.com\noweidata.com\noweis-tech.com\nowent.net\nowenzhang.com\nowgels.com\nowinchina.com\nowl-go.com\nowlxjz.lol\nowo.cab\nowocloud.net\nowoit.com\nowseals.com\nowsgo.com\nowspace.com\nowulia.com\nox11.com\noxbridgedu.org\noxerr.net\noxiang.com\noxiaohua.com\noxiranchem.com\noxrm.com\noxygenos.com\noxyry.com\noya365.com\noyalee.com\noyewifi.com\noygteapq.com\noym56lm.com\noyohyee.com\noyonyou.com\noyoozo.com\noyospider.com\noyoumo.com\noysd.com\noywtv.com\noyya.com\noyz61nhz8.com\noyzns.com\nozocenter.com\nozonabc.com\nozonbigsell.com\nozoninfo.com\nozouckzr.com\nozsmartbuy.com\nozxw.com\nozzair.org\nozzyad.com\np-an.com\np-dragon.com\np-e-china.com\np-er.com\np-i.vip\np-pass.com\np-sig-dom.com\np-sig-dom.net\np.biz\np.cdn.persaas.dell.com\np023.com\np0371.com\np0431.com\np04e.com\np0y.com\np1.com\np12345.com\np2cdn.com\np2hp.com\np2p001.com\np2p178.com\np2pbbs.net\np2pchina.com\np2pcq.com\np2peye.com\np2peye.net\np2psearchers.com\np2ptouhang.com\np3-china.com\np4pp.com\np555.cc\np5w.net\np6air.com\np6sai.com\np77777777.com\np7game.com\np80.net\np8811.com\np8games.com\np96q3p1m93.world\np99998888.com\npa.ci\npa18.com\npa1pa.com\npaahu.com\npaalermat.com\npaascloud.net\npaat.com\npabulika.com\npacdn.com\npacebms.com\npacfc.com\npacgatelaw.com\npacicanschool.com\npacificchinaaero.com\npacificimmi.com\npacificphar.com\npacilution.com\npackagesddn.win\npackertec.com\npacketmania.net\npacksky.com\npacktom.com\npackty.com\npacmantwo.com\npacs-plus.com\npactera.com\npadao.org\npadasuo.net\npadddy.vip\npaddlepaddle.org\npaddlewaver.com\npadh.net\npadns.com\npadtf.com\npaer.work\npafj.net\npafwl.com\npag.art\npagd.net\npageadmin.net\npagechoice.com\npagechoice.net\npagedoo.com\npagescube.com\npageseagle.com\npagetu.com\npahx.com\npahys.com\npai.video\npaiago.com\npaiangmedical.com\npaiangstudy.com\npaibanxia.com\npaibaohy.com\npaichen.net\npaichi.com\npaicoding.com\npaidai.com\npaidui.com\npaiduidai.com\npaigepian.com\npaihang114.com\npaihang360.com\npaihang8.com\npaihb.com\npaihotels.cc\npaihuisy.com\npaikew.com\npaiky.com\npaiky.net\npailitao.com\npailixiang.com\npaimaprint.com\npaime.com\npaiming.net\npaintinghere.org\npaints.market\npaipai.com\npaipai123.com\npaipaibang.com\npaipaiimg.com\npaipay.net\npaipianbang.com\npairmb.com\npaishi.com\npaitol.com\npaivideo.com\npaiwan.com\npaixiangxian.com\npaixin.com\npaixueche.net\npaiyidan.net\npaiyuyy.com\npaizhaofanyi.net\npaizhe.com\npaizi.com\npaizi.net\npaizia.com\npaizin.com\npaizishop.com\npajkb.com\npajkdc.com\npajktj.com\npajt.com\npal-fin.com\npalace-international.com\npalanceli.com\npaldq.com\npallasa.com\npally-travel.com\npalm-ad.com\npalm-h.com\npalm.tech\npalma-battery.com\npalmda.com\npalmebook.com\npalmeread.com\npalmestore.com\npalmexpo.com\npalmfungames.com\npalmjoys.com\npalmpay-inc.com\npalmpay.com\npalmpk.com\npalmtrends.com\npalmyou.com\npaloinino.com\npalomachina.com\npamahotel.com\npamica.com\npamss.net\npan-good.com\npan-ics.com\npan-key.com\npan131.com\npan58.com\npan8.net\npanabit.com\npanaihua.com\npanasiashipping.com\npanasonic-door.com\npanasonicmall.com\npanawincn.com\npanbaidu.net\npanbrake.com\npanchinasports.com\npanchip.com\npanchuang.net\npanda-home.com\npanda-js-power.com\npanda.ren\npanda98.com\npanda995.xyz\npandabus.cc\npandadairy.com\npandadastudio.com\npandafoundation.org\npandagreen.com\npandahome.org\npandainc.cc\npandaminer.com\npandapaint.net\npandara.xyz\npandaremit.com\npandateacher.com\npandatv.com\npandax.wiki\npandolia.net\npanduoduo.net\npanel-cn.com\npangbo51.com\npangbu.com\npangcheng.com\npangdago.com\npangdasc.com\npangdly.com\npangeng.vip\npanggugu.com\npanghuasheng.com\npangjun.com\npangku.com\npangku01.com\npangmao56.com\npangmaovc.com\npangod.com\npangodsxbj.com\npangoing.com\npangolin-dsp-toutiao-b.com\npangolin-dsp-toutiao.com\npangolin-sdk-toutiao-b.com\npangolin-sdk-toutiao.com\npangolin-sdk-toutiao1.com\npangolin-sdk-toutiao2.com\npangolin-sdk-toutiao3.com\npangolin-sdk-toutiao4.com\npangomicro.com\npangqiu.com\npangshare.com\npangshu.com\npangsuan.com\npangu.io\npangubox.com\npanguhotel.com\npanguidc.com\npangukj.com\npangusheng.com\npanguso.com\npangxieke.com\npangyuan.com\npanjiayuan.com\npanjin.net\npanjindamibest.com\npanjk.com\npanku.cc\npankuaisou.com\npanlai.com\npanlan.com\npanli.com\npanlv.net\npannacloud.com\npanocom.com\npanoeade.com\npanomix.com\npanoramastock.com\npanothers.com\npanpanfood.com\npanpanzsw.com\npanpass.net\npanpay.com\npanplayable-toutiao-b.com\npanplayable-toutiao.com\npanqiincs.me\npanqishu.com\npanruikj.com\npanshenlian.com\npanshi101.com\npanshianquan.com\npanshihudong.com\npanshiminerals.com\npanshixk.com\npanshiyun.com\npanshy.com\npansino-solutions.com\npanso.pro\npansoso.com\npansou.com\npansousuo.com\npantherhealthcare.com\npantonechina.com\npantower.com\npantrysbest.com\npantuitui.com\npantum.com\npanwangkeji.com\npanweizeng.com\npanxsoft.com\npanyiyun.com\npanyouwl.com\npanyun.com\npanyunkj.com\npanyuwater.com\npaoao.net\npaodoo.com\npaojiao.com\npaoka.com\npaokucloud.com\npaolanhuanbao.com\npaomo.com\npaomochengxingji.com\npaopao.com\npaopaoche.net\npaopaohd.com\npaopaosz.com\npaoshuba.cc\npaoshuba.org\npaoxue.com\npaozhengtong.com\npaozw.org\npapa21.com\npapa91.com\npapago.hk\npapajohnschina.com\npapajohnshanghai.com\npapapa.tv\npapatya.store\npapazw.com\npapegames.com\npaper-translation.com\npaper.tv\npaper120.net\npaperang.com\npaperask.com\npaperbert.com\npaperbus.com\npaperbye.com\npaperccb.com\npaperclipglobal.com\npapercool.com\npaperdb.com\npapereasy.com\npaperge.com\npaperinsight.net\npaperisok.com\npapernew.net\npaperok.com\npaperonce.org\npaperopen.com\npaperpass.com\npaperpass.org\npaperpp.com\npaperrater.net\npaperright.com\npapers.cool\npapersay.com\npapersee.com\npapertime.cc\npapertime.shop\npapertime.vip\npaperweekly.site\npaperword.com\npaperyy.com\npapocket.com\npapuanewguineans.com\npaquapp.com\nparallelsras.com\nparatera.com\nparawikis.com\nparduscycle.com\nparentshk.com\nparis-girafe.com\nparisblackpride.org\nparkbees.com\nparketech.com\nparkicloud.com\nparking520.com\nparkinginfoweb.com\nparkingjet.com\nparkingos.club\nparkingpda.com\nparkingquickly.com\nparkingsaas.com\nparkingwang.com\nparkmecn.com\nparkonroad.com\nparkshen.com\nparkviewgreen.com\nparkwaychina.com\nparkworld.net\nparkyardhotel.com\nparsein.com\npartinchina.com\npartner-group.com\npartner.cdnetworks.com\npartnerboost.com\nparty68.com\npaschermontre.to\npasco.cc\npasecng.com\npasertech.com\npashu5.org\npass7.cc\npasser-by.com\npassfab.com\npassfab.tw\npassion120.com\npassiongroupltd.com\npassip.xyz\npassnat.com\npasswordkeyboard.com\npat-edu.com\npat-edu.org\npatachina.org\npatchallin.com\npatchew.org\npatek.website\npatekphilippe.website\npatent9.com\npatentguru.com\npatexplorer.com\npatfun.com\npatheagames.com\npatholancet.com\npathologycn.com\npatiencepoker.com\npatsev.com\npatsnapglobal.com\npatv123.com\npaul-corp.com\npaul.pub\npaulzzh.com\npauwaypower.com\npavay.com\npavayjt.com\npavilionshenzhenhotel.com\npaxdn.com\npaxgl.com\npaxhz.com\npaxini-robot.net\npay-in.com\npay-lakala.com\npay-ly.com\npaybaike.com\npaydxm.com\npayeco.com\npayititi.com\npaykwai.com\npaylf.com\npaympay.com\npaynews.net\npaypaytech.com\npaytollbyv.world\npaytollvfd.world\npb89.com\npbaohza.com\npbc-dcep.com\npbcan.com\npbcedu.net\npbcft.com\npbchizhou.com\npbdpw.com\npbiso.com\npbkrs.com\npblie.com\npbqdhty.com\npbrcw.net\npbsvpn.com\npbtcw.com\npbtlpm.com\npbtsl.com\npbtt.net\npbtxt.com\npbyz.net\npc-120.com\npc-daily.com\npc.wiki\npc02.com\npc028.com\npc120.com\npc15.net\npc168.com\npc18.net\npc186.com\npc34.com\npc360.net\npc51.com\npc520.net\npc521.net\npc5210.com\npc528.net\npc55.com\npc6.com\npc699.com\npc6a.com\npc768.com\npc89.com\npc8h.com\npc9.com\npcapqz.com\npcasl.com\npcauto.com\npcb-hl.com\npcb-membraneswitch.com\npcb3.com\npcb818.com\npcbask.com\npcbba.com\npcbbar.com\npcbbbs.com\npcbeta.com\npcbhunt.com\npcbjob.com\npcbserve.com\npcbsheji.com\npcbtech.net\npcbtime.com\npccm88.com\npccpa.hk\npccppc.com\npcdan.net\npcdn100.com\npcdnhome.com\npcdog.com\npcdrv.com\npcdtg.com\npceggs.com\npceva.net\npcfphs.com\npcfreetime.com\npcgeshi.com\npcgogo.com\npcgta.cc\npch.pub\npchome.com\npchome.net\npchpic.net\npcidv.com\npciiss.com\npcitc.com\npcitech.com\npcjsq.com\npcljl.com\npcmgr-global.com\npcmgr-global.net\npcmoe.net\npcoic.com\npcoof.com\npcoyx.com\npcpc521.com\npcpop.com\npcpresent.com\npcqudong.com\npcr9170.com\npcscedu.com\npcsee.org\npcsfc.com\npcshou.com\npcsjsm.com\npct86.com\npctutu.net\npctvx.com\npcw365.com\npcwcn.com\npcweb3.com\npcwenti.com\npcwgu.com\npcwl.com\npcxitongcheng.com\npcyangguangban.com\npcysy.com\npcz.net\npczhi.com\npd-italent.com\npd-sts.com\npd120.com\npd17.com\npdafans.com\npdai.tech\npdb2.com\npdbeta.com\npdd-fapiao.com\npdd.net\npddcdn.com\npddeu.com\npddglobalhr.com\npddim.com\npddpic.com\npddugc.com\npddxfd.com\npdeepmatrix.com\npdf.la\npdf00.com\npdf1122.com\npdfangchan.com\npdfbianji.com\npdfdo.com\npdfexpert.cc\npdffsy.com\npdfjia.com\npdflibr.com\npdfxd.com\npdfzj.com\npdgohome.com\npdgzf.com\npdhr.com\npdidc.com\npdie-expo.com\npdinvestmentgroup.com\npdlib.com\npdlnn.com\npdloscar.com\npdm.tech\npdnob.com\npdosgk.com\npdrcfw.com\npdreading.com\npdreamer.com\npdryx.com\npdscb.com\npdsey.com\npdsgjj.com\npdshouse.com\npdsjycm.com\npdskgb.com\npdswater.com\npdsxww.com\npdty123.com\npduoduo.vip\npdvc.com\npdvisa.com\npdwxo.vip\npdxx.net\npdxxg.com\npdzls.com\npe-exhibition.com\npe.vc\npe8.com\npe898.com\npeace-read.com\npeacebird.com\npeaceboat.net\npeacepetro.com\npeacha.net\npeacockedu.com\npeak-labs.com\npeaksport.com\npeakyun.cc\npeal.cc\npear.hk\npearlinpalm.com\npearvideo.com\npeasrch.com\npeatour.com\npebellows.com\npeccn.com\npechoin.com\npecmgd.com\npecoo.com\npediatrixtherapeutics.com\npediy.com\npedli.com\npeekpipai.com\npeento.com\npeepic.com\npeerkennel.com\npegbiocq.com\npeidibrand.com\npeidu.com\npeihao.space\npeihu-lyjkgl.com\npeihuyi.com\npeijiamedical.com\npeijian8.net\npeikua.com\npeilian.com\npeiluming.com\npeiluyou.com\npeipusci.com\npeise.net\npeisebiao.com\npeiwan.tv\npeiwanlu.com\npeiwantv.com\npeixianedu.com\npeixiang.com\npeixinbao.com\npeixinkj.com\npeixinyi.com\npeixun.net\npeixun360.com\npeixun5.com\npeixune.com\npeixunla.com\npeixunmatou.com\npeixunxue.com\npeiyake.com\npeiyicha.com\npeiyin.net\npeiyinge.com\npeiyingefiles.com\npeiyingo.com\npeiyinshenqi.club\npeiyinxiu.com\npeiyou.com\npeiyouwang.com\npeiyue.com\npeizi.com\npejdw.com\npejxjy.com\npekhongyuan.com\npeksung.com\npelejs.com\npelorseating.com\npemap.com\npemch.com\npenavicoxm.com\npending-renewal-domain.com\npengbaoxuan.com\npengboguandao.com\npengchengenergy.com\npengchenglx.com\npengfei.com\npenghh.fun\npenging.com\npengke.com\npenglei.name\npengliao.com\npengpailaw.com\npengqi.club\npengqian.win\npengrl.com\npengrui-ssj.com\npengshancy.com\npengtuzm.com\npenguin-logistics.space\npengxinziyuan.com\npengyaou.com\npengyihotel.com\npengyou.com\npengyou.net\npengyoukan.com\npengyuanled.com\npengyucpa.com\npengyuwei.net\npengzhihui.xyz\npenhuijiqi.com\npeninsula-med.com\npenlingaizao.com\npenno-pallet.com\npensunny.com\npentalaser.com\npentaq.com\npentatomic.com\npentiw.com\npenxiangge.com\npenyouw.com\npenzai.com\npenzealcn.com\npeople-squared.com\npeople78.com\npeople78.net\npeopleapp.com\npeopleart.tv\npeopledailyhealth.com\npeopledailypress.com\npeoplehealthdata.com\npeoplekg.com\npeoplelamp.com\npeoplemooc.com\npeoplerail.com\npeoplewang.com\npeopleyuqing.com\npepresource.com\npepsimeipai.com\npeptide-china.com\nperfect-input.com\nperfect99.com\nperfectdiary.com\nperfecttradinghk.com\nperfectwatchen.com\nperfertw.com\nperfma.net\nperopero.net\nperoperogames.com\npersagy.com\nperseverany.com\npersonabook.net\npersonpsy.org\nperspectivar.com\npescms.com\npesiv.com\npesrmyy.com\npesyun.com\npet-mri.com\npet86.com\npetaindonesia.org\npetalmail.com\npetalmaps.com\npetalsdata.com\npetctchina.com\npetctw.com\npeter-zhou.com\npeterjxl.com\npetersonjace.shop\npetersonlian.com\npetgugu.com\npethr.com\npetkit.com\npetkoo.com\npetktasia.com\npetly.net\npetmrchina.com\npetmrs.com\npetope.com\npetpcb.com\npetpetin.com\npetrexchina.com\npetroren.com\npetrostaroil.com\npetrvet.com\npetssky.com\npewax88.com\npewld.com\npewsc.com\npexue.com\npf.net\npf110.com\npf168.com\npfcexpress.com\npfhoo.com\npfinno.com\npfjekm.org\npfmmedicalchina.com\npft12301.cc\npftianshanno.com\npfwx.com\npfzhiliao.com\npg-leak.com\npg114.net\npgbee.com\npgc.tv\npgcaststone.com\npgcog.com\npgdz.com\npgdz4422.com\npggho.com\npghqa.org\npgidw.com\npgive.com\npgjcqm.com\npgjxo.com\npgl-world.com\npglstatp-toutiao-b.com\npglstatp-toutiao.com\npgmcatalyst.com\npgos.cc\npgosglobal.com\npgpop.com\npgq.win\npgqcw.com\npgqjz7733.com\npgrm.site\npgsql.tech\npgxqw.net\npgxxw.com\npgy6.com\npgyapi.com\npgyer.com\npgyidc.com\npgyy.com\npgyy.vip\npgzs.com\npgzx.net\nph-fc.com\nph365.bond\nph66.com\nphaenothera.com\nphaetonsemi.com\nphalapi.net\nphantasy.life\npharaohvisionstudios.com\npharbers.com\npharm81.mobi\npharmacn.com\npharmacodia.com\npharmacyyf.com\npharmalego.com\npharmcube.com\npharmengin.com\npharmglass.com\npharmproc.com\npharmzs.com\npharnexcloud.com\npharscin.com\nphaser-china.com\nphb01.com\nphb123.com\nphbang.net\nphcoal.com\nphedu.net\nphemu.net\nphenom-sem.com\nphet.fan\nphezzan.com\nphgll.com\nphhongyu.com\nphicomm.com\nphilanthropy.xin\nphilipswechat.com\nphilisense.com\nphiljang.work\nphirda.com\nphirs.com\nphjqs.com\nphjt.com\nphlexing.com\nphmacn.com\nphnamedns.com\nphnixhome.com\nphnixpool.com\npho.so\nphodal.com\nphoemix.net\nphoenix-ea.com\nphoenixfilters.net\nphoenixos.com\nphoenixtea.org\nphoenixtv.com\nphoent.com\nphoer.net\nphome.net\nphone580.com\nphonecoolgame.com\nphonegap.me\nphonegap100.com\nphonelinksoft.com\nphonertech.com\nphopic.com\nphosun.com\nphotc.com\nphoto0086.com\nphoto3050.com\nphoto889.com\nphotocnc.com\nphotocome.com\nphotohn.com\nphotoncounts.com\nphotonpay.com\nphotops.com\nphotosks.vip\nphotozoomchina.com\nphp-note.com\nphp-oa.com\nphp100.com\nphp168.com\nphp168.net\nphp318.com\nphpbbchina.com\nphpbloger.com\nphpcashshare.com\nphpchina.com\nphpcom.net\nphpcomposer.com\nphpconchina.com\nphpcoo.com\nphpddt.com\nphpdr.net\nphpe.net\nphpernote.com\nphperservice.com\nphperz.com\nphpfs.com\nphpha.com\nphphub.org\nphpjiami.com\nphpjiayuan.com\nphpkaiyuancms.com\nphplife.net\nphpor.net\nphpsong.com\nphpspider.org\nphpstat.net\nphpub.mobi\nphpv.net\nphpwc.com\nphpwc.info\nphpweb.net\nphpweblog.net\nphpxs.com\nphpyun.com\nphsb.com\nphysicalchina.com\nphysicalchina.vip\nphysicalclub.com\nphysike.com\nphysoe.com\nphyuan.com\nphyy.com\nphzg.com\npi7.com\npiaget-hello.com\npianbar.net\npianbingji.com\npiankuai.com\npianohl.com\npianor.com\npianoun.com\npianpian.net\npiantou.net\npianyilo.com\npianyit.com\npianyiwan.com\npiao.com\npiao.tips\npiao88.com\npiao95.com\npiaobing.com\npiaobuy.com\npiaochong.com\npiaocom.com\npiaodaren.com\npiaode.ren\npiaodian.net\npiaododo.com\npiaodown.com\npiaogj.com\npiaogroup.com\npiaohomeinn.com\npiaohua.com\npiaojubao.com\npiaolia.com\npiaoliang.com\npiaoliusan.com\npiaoniu.com\npiaoqianqian.com\npiaoquantv.com\npiaoshen.com\npiaotian.org\npiaotongyun.com\npiaowutong.cc\npiaowutong.com\npiaoxian.net\npiaoxingqiu.com\npiaoyi.org\npiaoyun.net\npiaozone.com\npiasy.com\npiaviation.com\npic-cname.cc\npic-png.com\npic.tripcdn.com\npic16.com\npic21.com\npic315.com\npic3733.com\npic720.com\npicacgp.com\npicatown.com\npicbling.com\npicc.com\npiccamc.com\npicchealth.com\npiccjs.com\npicdlb.com\npicdns.com\npicing.com\npickme.cc\npicooc.com\npicosmos.net\npicovr.com\npicoxr.com\npicp.io\npicp.net\npicsandquotes.com\npicsays.com\npictureknow.com\npicup.shop\npicxiaobai.com\npicyourmix.com\npicyq.com\npidcn.com\npidoutv.com\npidru.com\npiececool.com\npieceofbake.net\npieeco.com\npiekee.com\npiekee.net\npieshua.com\npifa.bz\npifa333.com\npiflogistics.com\npifukezaixian.com\npig4cloud.com\npig66.com\npigai.org\npigcms.com\npighaihe.com\npigji.com\npigmentlc.com\npigmoral.tech\npigonline.org\npigsq.com\npigsty.cc\npigv5.com\npigx.vip\npigyun.com\npihitech.com\npihmh.com\npiimg.com\npiios.com\npikacn.com\npikoplay.com\npikpak.me\npikpakdrive.com\npil0txia.com\npilaipiwang.com\npilidns.com\npilifu.com\npilimeng.com\npimaoji.com\npimax.com\npimei.com\npimgeek.com\npimormebwf.com\npin-color.net\npin18pin.com\npin2eat.com\npin5i.com\npinan1688.com\npinbaitai.com\npinbaiyan.com\npinbang.com\npinbayun.com\npinble.com\npinble.net\npincai.com\npinchain.com\npinchedashi.com\npinchetang.com\npincn.com\npinda.com\npinduoduo.com\npinduoduo.net\npinelephant.com\npinestoneasset.com\npinfangw.com\npinfeng.group\npinfun.com\nping-an.net\nping-jia.net\nping-qu.com\nping99.com\npingan.com\npingan.com.hk\npingancdn.com\npinganfang.com\npinganfu.net\npingansilu.org\npinganventures.com\npinganwj.com\npinganyun.com\npinganzhengxin.com\npinganzhengyang.com\npingcap.com\npingce.net\npingchuangyl.com\npingcode.com\npingcode.tech\npingcoo.com\npingdingshan.me\npingdurc.com\npingevip.com\npingfangx.com\npingfanli.com\npingfenbang.com\npinggao.com\npinggaogroup.com\npinggu.com\npinggu.org\npingguobaoxiu.com\npingguodj.com\npingguoid.com\npingguolv.com\npinghe.com\npinghu.tech\npinghui-cn.com\npingjiata.com\npingmudiy.com\npingnanlearning.com\npingnantong.com\npingnuosoft.com\npingpangwang.com\npingpingw.com\npingpingze.com\npingplusplus.com\npingpongx.com\npingpongx.org\npingshu365.com\npingshu8.com\npingshuku.com\npingshuocoal.com\npingshuxiazai.com\npingstart.com\npinguan.com\npinguo.us\npingwest.com\npingxiangzhifa.com\npingxiaow.com\npingxuan123.com\npingxx.com\npingyin.cc\npingzishuo.com\npinhaohuo.com\npinhui001.com\npinidea.co\npinjiago.com\npinjiao.com\npinjiaolian.com\npinjie.cc\npinjieqicai.com\npinjiesj.com\npinkecity.com\npinkehao.com\npinkertech.com\npinkoichina.com\npinkou.com\npinla.com\npinlyu.com\npinmanduo.com\npinmuch.com\npinocchiowb.com\npinpai-bang.com\npinpai1.com\npinpai37.com\npinpaihuoyuan.com\npinpailiu.com\npinpaime.com\npinpointloc.com\npinpopt.site\npinqugongxiangktv.com\npinqukeji.com\npinshu.com\npinsuodesign.com\npintangshi.com\npintechpharma.com\npintreel.com\npintu360.com\npintuan.com\npintuanya.com\npintuer.com\npintuju.com\npintuxiu.net\npinuc.com\npinwaiyi.com\npinweiqifu.com\npinxianghui.com\npinxianghui.net\npinyafang.com\npinyinxiang.com\npinyuan.cc\npinyuew.com\npinzhenglh.com\npinzhi.org\npinzhi365.com\npinzhikeji.net\npinzs.com\npioneer-pharma.com\npioneer-pku.com\npioneerchina.com\npioneerep.com\npioneernews.cc\npioneersci.com\npipa.com\npipacoding.com\npipahealth.com\npipaw.com\npipaw.net\npipedetect.com\npipegg.com\npipgame.com\npipikou.com\npipikun.com\npipilu.com\npipimp3.com\npipipi.net\npipipifa.com\npipishu.com\npipiti.com\npipix.com\npipixue.com\npipsemi.com\npipuda.com\npiqs.com\npiscesys.com\npisx.com\npitayaio.com\npiuqiupia.com\npivotacp.com\npivotautomotive.com\npiwxal.work\npixbe.com\npixcakeai.com\npixcakes.com\npixcheese.com\npixe44lrifted.com\npixelauth.com\npixeldance.com\npixelgame.net\npixepf.sbs\npixiaojiang.com\npixivic.com\npixpark.net\npiyanzi.com\npiyipiba.com\npj-666.com\npj-road.com\npj.com\npj0099.com\npj09.com\npj334.org\npj39800.com\npj50.com\npj57.com\npj62049.com\npj73.com\npjbest.com\npjcn.org\npjf.name\npjgear.com\npjgjg.com\npjhome.net\npjhubs.com\npjjjw.com\npjjyzx.com\npjlyds.com\npjob.net\npjtime.com\npjtka.com\npk106.com\npk137.com\npk2234.com\npk38.com\npk532.com\npk7o.com\npk995.com\npkbeta.com\npkbff.com\npkbigdata.com\npkcity.com\npkfish.com\npkfj.xyz\npkfun.com\npkgame.com\npkghund.com\npkgklk.com\npki.plus\npkm360.com\npkma.cc\npko123.com\npkoplink.com\npkpmjc.com\npkpmsoft.com\npkpuke.com\npkq.xyz\npksf8.com\npksfc.com\npksky.com\npkslow.com\npkt-cable.com\npku-cele.com\npku-hc.com\npku-hit.com\npku-lvxin.com\npku666.com\npkucare.com\npkucarenjk.com\npkucnooch.com\npkufh.com\npkufi.com\npkugac.com\npkulaw.com\npkulaws.com\npkulb.com\npkuncii.com\npkunn.com\npkuph.com\npkuphqd.com\npkupuzzle.art\npkurc.com\npkusky.com\npkusp.com\npkuszh.com\npkutourism.com\npkuxue.com\npkvs.com\npkwenku.com\npl999.com\nplaidc.com\nplalzhang.com\nplanary-yz.com\nplanckled.com\nplanetariuminsight.site\nplanetarylighting.com\nplanetmeican.com\nplanpelham.com\nplantb2b.com\nplantname.xyz\nplantnutrifert.org\nplantower.com\nplas-cn.com\nplasdata.com\nplastics-machinery-equipment.com\nplasway.com\nplateno.cc\nplateno.com\nplatenogroup.com\nplatform-cn.com\nplatform.dell.com\nplatinum-traveller.com\nplatinumchina.com\nplay-analytics.com\nplay-cdn10.com\nplay-cdn11.com\nplay-cdn13.com\nplay-cdn14.com\nplay-cdn16.com\nplay-cdn19.com\nplay-cdn2.com\nplay-cdn20.com\nplay-cdn7.com\nplay.craft.moe\nplay68.com\nplay700.com\nplay910.com\nplay920.com\nplaycase.com\nplaychd.com\nplaycomet.jp\nplaycool.com\nplaycrab.com\nplaydanji.com\nplayerinfinite.com\nplayezu.com\nplayfifa.com\nplaygm.cc\nplayhousemag.com\nplaylu.com\nplayorcas.com\nplaypangu.com\nplaytai.com\nplaytai.net\nplaywonderful.com\nplaywxgame.com\nplayyx.com\nplayzy.com\nplb1.com\nplbig.com\nplc100.com\nplc11.com\nplcent.com\nplchinese.com\nplcjs.com\nplcloud.com\nplctlab.com\nplentypolymer.com\npleo-securelogin.com\nplesk-cn.com\nplex2.com\nplexpt.com\nplfrog.com\nplll-fluid.com\nplob.org\nplopco.com\nplottersyservicioshdz.com\nplpwz.com\nplsbd.com\nplsdeyy.com\nplsfybjy.com\npltgd.com\npluosi.com\npluralitycn.com\nplures.net\nplus-chem.com\nplus-space.com\nplus3gallery.com\nplusco-tech.com\nplusgantt.com\nplusplus7.com\nplusplustu.com\nplusrtc.com\nplutoer.com\nplutuspay.com\npluveto.com\nplvideo.net\nplxao.com\nplxfgroup.com\nplxww.com\nplycd.com\nplyh.com\nplyhjt.net\nplyygs.com\nplyz.net\nplzly.com\nplzx.net\nplzyll.com\npm-china.com\npm-leader.com\npm-summit.org\npm222.com\npm25.com\npm265.com\npm28.com\npm360.com\npmallstore.com\npmcaff.com\npmceo.com\npmcj-group.com\npmcrobot.com\npmd5.com\npmdak.com\npmdaniu.com\npmdled.com\npmdoudou.com\npmdown.com\npmhfd.org\npmichina.org\npmish-tech.com\npmkiki.com\npmovie.com\npmparkchina.com\npmph.com\npmphai.com\npmphmooc.com\npmptuan.com\npmquanzi.com\npmr66.com\npmsmzyy.com\npmtalk.club\npmtemple.com\npmtown.com\npmway.com\npmx-nanho.com\npmxprecision.com\npmxsd.com\npmyes.com\npmyuanxing.com\npn1waq.com\npnetp.org\npnfang.com\npnfq.com\npng.pub\npngbag.com\npngsucai.com\npnol.net\npnst8.com\npntagkyy.com\npntkyy.com\npntryy.com\npnty1688.com\npnwww.com\npnxct.com\npnxyrykj.com\npnzpw.com\npo.co\npo7ryumvkx34.com\npoacefex.shop\npobaby.net\npobasoft.com\npochanguanliyanjiu.com\npochezu.com\npocketcloud.vip\npocketdigi.com\npocketuni.net\npockpower.com\npocomagnetic.com\npocosite.com\npocsuite.org\npodcast.xyz\npodfest.tech\npodinns.com\npodjiasu.org\npodunjiasu.com\npoem88.com\npoemlife.com\npoemschina.com\npofang.com\npohaier.com\npohover.com\npoikm.com\npoint-memory.com\npoiuytw.com\npoizon.com\npoj.org\npojianyunfu.com\npoke203.com\npoke88.com\npokemmc.com\npokemon-unitepgame.com\npokemon.vip\npokerbros.net\npokermate.net\npoketb.com\npolamus.com\npolariton.life\npolarloco.com\npolars.cc\npolarxiong.com\npolaxiong.com\npolayoutu.com\npolebrief.com\npolingba.com\npolo-king.com\npoloxue.com\npoluosenko.com\npoly-gx.com\npoly-pm.com\npolycd.com\npolycent.com\npolycinemas.com\npolycn.com\npolycom-jl.com\npolyflowenergy.com\npolyhotel.com\npolyhotels.com\npolyinno.com\npolyreymed.com\npolytheatre.com\npolyv.net\npolywuye.com\npolyxfb.com\npomears.com\npomeloyun.com\npomkl.com\npomoho.com\npondernext.com\nponging.store\nponkong.com\nponley.com\npontite.com\npony.ai\nponyai-cn.com\nponycool.com\nponyemu.com\nponyfk.com\nponytest.com\nponytestqd.com\nponytestsh.com\nponytestsz.com\npoo1.club\npooban.com\npooeoo.com\npoofoo.com\npooioo.com\npook.com\npookcdn.com\npooketools.com\npoorren.com\npop-bags.com\npop-fashion.com\npop-shoe.com\npop136.com\npop365.com\npop800.com\npopcj.com\npopcustoms.com\npopdg.com\npopgo.org\npopkart.tv\npopkx.com\npoploli.com\npopmart.com\npopmartfans.cc\npopmtstyle.com\npopoffices.com\npopoho.com\npopoim.com\npopovivi.com\npopoxiu.com\npopqiu.com\npopsoft.com\npopss.biz\npopumed.com\npopupgrade.com\npoputar.com\npopziti.com\nporation-vac-tech.com\nporlockz.com\nport-m.com\nportalcdn.cdnetworks.com\nportcontainer.com\nporthebei.com\nportjs.com\nportjs.net\nportjswl.com\nportlyg.com\nportmansevenstars.com\nports-intl.com\nportsgmt.com\nporttong.com\nportugal-visacenter.com\nporu-mro.com\nporyf.com\npos58.com\npos580.com\nposbar.com\nposcerwatch.com\nposeidong.com\nposeidonqianshui.com\nposfree.com\nposge.com\nposmcc.com\nposn.net\npospalit.com\npospos.com\npost-delivered.today\npost163.com\npost183.net\npostarlight.com\npostdelivered.today\nposterlabs.com\npostgres.fun\npostgresqlchina.com\npostjson.com\npostnord.xin\npostpony.com\npostxin.com\nposyn.com\nposzjia.com\npotalapalace.com\npotassiumnitrate-zx.com\npotato.gold\npotensic.com\npotevio.com\npothros.asia\npotianji.net\npotnsik-faastink898.com\npotomaccottage.com\npotops.com\npotplayer.org\npotplayercn.com\npouchcontainer.io\npouquiagievu.com\npouser.net\npova-elc.com\npower-rail.com\npower-sprayer.com\npower86.com\npower8t.com\npowerapp.io\npowerbeijing-ec.com\npowerbeijing.com\npowerbibbs.com\npowercdn.com\npowerchina-intl.com\npowerchinaleasing.com\npowerchinanewenergy.com\npowerchinashow.com\npowerchinayun.com\npowercx.com\npowerde.com\npowereasy.net\npowerex1.com\npowerflow-tech.com\npowerfulchina.com\npowerhubei.com\npoweric-china.com\npowerlandtech.com\npowerlaw.ai\npowerleaderidc.com\npowerliber.com\npowerlong.com\npowerlongmuseum.com\npowerma.net\npowermaxcorp.com\npoweron.cc\npowerpigs.net\npowerpms.com\npowerrsoft.com\npowerskystudio.com\npowerstationofart.com\npowerstonetech.com\npowertensors.ai\npowertradepro.com\npowervision.me\npowerworldgd.com\npowerxene.com\npowpegxw.com\npowzamedia.com\npoxiaowy.com\npoxiaoxinxi.com\npoyang.com\npoyour.com\npozou.com\npp.cc\npp100.com\npp1o.com\npp25.com\npp250.com\npp30.com\npp365.com\npp373.com\npp51.com\npp540.com\npp63.com\npp8.com\npp918.com\npp9l.com\nppad.com\nppaiss.com\nppbizon.com\nppbnchina.com\nppcho.com\nppcn.net\nppcode.com\nppcost.com\nppdai.com\nppdaicdn.com\nppdaicorp.com\nppdd.com\nppdesk.com\nppdqk.com\nppduck.com\nppdys.vip\nppfeng.com\nppforging.com\nppgallery.com\nppgame.com\nppgg.in\nppgmm.com\nppgslb.com\npphimalayanrt.com\npphqq.com\nppia-china.com\nppinfra.com\nppio.cloud\nppio.work\nppj.io\nppjtc.net\nppkankan01.com\nppkjinc.com\nppkoo.com\npplib.net\npplive.com\npplive.net\npplm1996.com\npplp.info\nppm-htv.com\nppm2.com\nppmake.com\nppmm.org\nppmoney.com\nppnews.vip\nppos.com\nppp.gold\nppparking.net\npppcar.com\npppet.net\npppie.com\npppiii.com\npppnnm.com\npppoevps.com\nppppic.com\nppppoints.com\nppq.me\npprxcdn.com\npps.tv\nppsao.com\nppsimg.com\nppsoftw.com\nppspain.com\nppsport.com\nppstream.com\nppstream.net\nppstv.com\nppstv.net\nppsurl.com\nppsz.net\nppt118.com\nppt20.com\nppt360.com\nppt920.com\npptair.com\npptbest.com\npptboss.com\npptbz.com\npptelf.com\nppter8.com\nppthi-hoo.com\npptianliao.com\npptiyu.com\npptkj.net\npptmall.net\npptniu.com\npptsq.com\npptstore.net\npptsupermarket.com\npptui.com\npptutor.com\npptv.com\npptv5.com\npptvdata.com\npptvimg.com\npptvnet.com\npptvyun.com\npptxy.com\nppurl.com\nppvi.net\nppwan.com\nppwang.com\nppwenda.com\nppwfa.com\nppwow.cc\nppwwyyxx.com\nppx520.com\nppxclub.com\nppxiaoshuowang.com\nppximg.com\nppxm.com\nppxmw.com\nppxs.net\nppxstatic.com\nppxsw.co\nppxvod.com\nppxwo.com\nppzhan.com\nppzhilian.com\nppzuche.com\nppzw.com\npqdtcn.com\npqneq.com\npqpo.me\npqt-bearing.com\npqtygsfkv.com\npqyhigh.com\npqylow.com\npqymiddle.com\npqyvzr56aceitx.com\npqzhichan.com\npr020.com\npr027.com\npr0771.com\npradabao.com\npratic-cnc.com\nprayaya.com\nprayaya.net\nprayaya.org\nprcedu.com\nprcee.org\nprcfe.com\nprcvalve.com\nprecision-biotech.com\nprecision-biz.com\npreludeid.com\npremedglobal.com\npresenceall.com\npressmine.com\nprestodb-china.com\nprestolite-bj.com\nprettech.com\npreyp.net\nprfc-cn.com\nprfog.com\nprhljt.com\npricl.com\nprimadiagnostic.com\nprimarychina.com\nprime-care.com\nprime-semi.com\nprime3c.com\nprimegene.net\nprimerachina.com\nprimeton.com\nprincechem.com\nprint86.com\nprinterwhy.net\nprinthome.com\nprinthr.com\nprintidea.art\nprintlake.com\nprivateapi.xyz\nprivatess.win\nprivspace.net\nprizesapp.com\nprjdrj.com\nprkfyy.com\nprnewspress.com\npro001.com\npro400.com\nproangela.com\nproav-china.com\nprocar.cc\nprocesson.com\nprocetpoeinjector.com\nprochembio.com\nprociss.com\nprocivi.net\nprodcam.cc\nprodcutmodel.com\nproductivity.wiki\nproginn.com\nprogramfan.com\nprogrammer.ink\nprogrammercarl.com\nprogramschool.com\nprogress-cn.com\nprogressingeography.com\nproject-oa.com\nproject-snow.com\nprojectaker.com\nprojector-jl.com\nprojector-window.com\nprojectserval.com\nproleantech.com\nprolog-int.com\nprolto.com\npromise-sz.com\npromisingedu.com\npronax.tech\npronetway.com\nprophecyi.com\nproposalt.com\npropsad.com\nproresearch.org\npros-view.com\nprositsole.com\nprostar-cn.com\nprotect-file.com\nprotong.com\nprotontechcn.com\nproup.club\nprovidence-chemicals.com\nprowine-shanghai.com\nproximabeta.com\nproxypass.net\nproya-group.com\nproya.com\nproyy.com\nprpracg.com\nprs-9hospital.com\nprs-motion.com\nprsgl.com\nprteco.com\nprts.wiki\nprtscttposty.cfd\nprttech.com\nprvchina.com\nprwlyy.com\nprxxff.com\npryk0755.com\nprzhushou.com\nprzwt.com\nps-boat.com\nps123.net\nps12345.com\nps173.com\nps288.com\nps314.com\nps616.com\nps9d.com\npsaiwave.com\npsald.com\npsb888.com\npsbc-ubank.com\npsbc.com\npsc4d.com\npscddos.com\npsd1403.com\npsd8.com\npsdee.com\npsdiv.com\npse-meti.com\npsfjz.com\npsjdhhnkjahbn.cfd\npsjia.com\npsjxty.com\npsjyedu.com\npslkzs.com\npsmartcloud.com\npsnine.com\npsoneart.com\npsp99.com\npsr-china.com\npsrar.com\npsrss.com\npstatp.com\npstips.net\npstxg.com\npsvalve.com\npsy-1.com\npsychcn.com\npsychspace.com\npsylife.com\npsysoper.com\npsyzg.com\npsznh.com\npszwatch.com\npszx.com\npszxw.net\npt-link.com\npt597.com\npt80.net\npt963.com\npt97.com\nptacn.com\nptah-tech.com\nptausercontent.com\nptbchina.com\nptbus.com\nptc-asia.com\nptdsh.com\nptfdc.com\nptfe-rod.com\nptfish.com\nptfish.org\nptgcn.com\npthceshi.com\npthejzb.com\npthksw.com\npthxuexi.com\npthxx.com\npthxxw.com\nptimg.org\nptkckj.com\nptkill.com\nptmind.com\nptmzr.com\nptnrjt.com\nptools.fun\nptorch.com\nptotour.com\nptpcp.com\nptrcw.com\npts-ai-texture.com\npts-testing.com\npts.games\nptshare.org\nptszgh.org\nptteng.com\nptwbs.net\nptweixin.com\nptx123.com\nptxie.com\nptxyrcw.com\nptxz.com\nptyg.com\nptyly.com\nptyoubike.com\nptyqm.com\nptyx.com\npu-bg.com\npu-ling.com\npu1kj.com\npu600.com\npu82.vip\npuaas.com\npuai999.com\npuaihospital.net\npuamap.com\npuata.info\npubbcsapp.com\npubchn.com\npubg.plus\npubg8x.com\npubghelper.com\npubgkam.com\npubgtool.com\npubgwesk.art\npubgzh-cn.vip\npublic6.com\npubliccms.com\npublicdns.cc\npubmed007.com\npubmedplus.com\npubone.cc\npubrain.com\npubtian.com\npubukeji.com\npubwinol.com\npubyun.com\npubyun.net\npubyun.org\npucijiankang.com\npudding.cc\npudetouzi.com\npudie.net\npudijt.com\npudn.com\npudongwater.com\npudutech.com\npuduzhai.com\npuem.org\npuer10000.com\npuercn.com\npuersai.com\npuertea.com\npufalianzheng.com\npufewev.store\npuffergames.com\npugba.com\npuh3.com\npuhebiopharma.com\npuhedesign.com\npuhja.work\npuhler.com\npuhuacapital.com\npuhuahui.com\npuhuaxincai.com\npuidc.com\npuiedu.com\npuikiuxinyi.com\npujia8.com\npujiaba.com\npujiaziwang.com\npujie.com\npujingjt888.com\npujiugame.com\npukinte.com\npule.com\npulinmed.com\npulisi.com\npulixingfu.com\npullwave.com\npullword.com\npullywood.com\npulogroup.com\npumcderm.net\npumpisok.com\npumpzc.com\npunaide.com\npunanhospital.com\npunchbox.info\npungboo.com\npuoke.com\npuoraiatorcubt.icu\npuppetchina.com\npuppy888.com\npupu168.com\npupuapi.com\npupufz.com\npupugo.com\npupumall.com\npupumall.net\npupurazzi.com\npupuwang.com\npurang.com\npurcotton.com\npureage.info\npurebuy.club\npureh2b.com\npurekindfund.com\npuremild.com\npurenyy.com\npuresnake.com\npuresys.net\npurewhite.io\npurified-group.com\npuritysilvers.store\npurolatorko.com\npuronglong.com\npurplehi.com\npurplelec.com\npurpose36.com\npurui020.com\npuruimachinery.com\npusa123.com\npusa365.com\npush-herbchem.com\npush2u.com\npushauction.com\npushcfg.com\npushgrid.net\npushi-ngp.com\npushigao.com\npushihao.com\npushiyb.com\npushjoy.com\npushplus.plus\npushthink.com\npushtime.net\npushyzheng.com\npusicapital.com\npusupvc.com\npusure.com\nputaoa.com\nputaocdn.com\nputaogame.com\nputaojiu.com\nputaotec.com\nputclub.com\nputdb.com\nputdl.com\nputian-nst.com\nputian508.com\nputitt.com\nputonsoft.com\nputop.net\npuusa.net\npuwenlong.com\npuworld.com\npuwww.com\npuxiang.com\npuxindesign.com\npuxun.co\npuyewx.com\npuyideshiye.com\npuyimed.com\npuyuan-electric.com\npuzeyf.com\npuzzle8.com\npuzzles100.com\npv001.com\npv001.net\npv138.com\npv265.com\npvc-diban.net\npvc123.com\npvpin.com\npvzbaike.com\npw-partners.com\npw1999.com\npw88.com\npwand.com\npwdding.icu\npwithe.com\npwjptdg.xyz\npwjt.com\npwkss.com\npwkyyb.com\npwmat.com\npwmqr.com\npwns.fun\npwnyun.com\npword.net\npwrd.com\npwrdoverseas.com\npwsannong.com\npwsz.com\npwypx.com\npwypyq.com\npx0571.com\npx0769.com\npx1039.com\npx33.com\npx5a.com\npxb7.com\npxbgp.com\npxc33.com\npxcn168.com\npxcoex.com\npxdier.net\npxemba.com\npxene.com\npxhuiben.com\npxrczpw.com\npxsfybjy.com\npxsrmyy.com\npxtbhb.com\npxtcm.com\npxtu.com\npxtx.com\npxuiamz.com\npxvps.com\npxwsemi.com\npxx.io\npxykyy.com\npxyuan.com\npxyyjt.com\npxzhbsq.com\npxzj.com\npy-axa.com\npy1080p.com\npy1314.com\npy168.com\npy2y.com\npy3.io\npy3study.com\npy94.com\npyadx.com\npyasfunds.com\npybrother.com\npychina.com\npychina.org\npydp888.com\npydvu.com\npyedu.cc\npyeec.com\npyer.net\npyer.site\npyfb001.com\npyhead.com\npyhosp.com\npyjdgj.com\npyjkd.com\npyjt.net\npyker.com\npylonghai.com\npymeng.com\npymh.com\npyneo.com\npyou.com\npysdsysc.com\npyshszh.com\npystar.com\npyt2021.com\npytesgroup.com\npython-abc.xyz\npython100.com\npython51.com\npythonclub.org\npythoner.com\npythonheidong.com\npythonke.com\npythonlion.com\npythonthree.com\npythontip.com\npytk.net\npytool.com\npytorchtutorial.com\npywangqi.com\npyxhh.work\npyxjiang.com\npyxk.com\npyxrc.com\npyxwapp.com\npyxww.com\npyycz.com\npyynsm.com\npyzhbc.com\npyzls.com\npyzwy.com\npz028.com\npz6.com\npzboy.com\npzcgw.com\npzdf.com\npzds.com\npzfc.com\npzfcw.com\npzhccb.com\npzhdahe.com\npzhedu.com\npzhl.net\npzhol.com\npzhqx.com\npzhqz.com\npzhr.com\npzhwater.com\npzhwyw.com\npzjdimg.com\npzjiadian.com\npzlink.com\npzmls.com\npznews.com\npznrfsy.com\npznsh.com\npzoom.com\npzpu.com\npzrex.com\npzzc.net\npzzx.com\nq-alumni.com\nq-bakery.com\nq-dazzle.com\nq-parking.com\nq-supreme.com\nq.biz\nq1.com\nq1cm.com\nq1qfc323.com\nq2ak.com\nq2cdn.com\nq2d.com\nq2zy.com\nq36f.icu\nq38519je8o.world\nq5.com\nq66x11b6c2wfg57.sbs\nq6c.com\nq6haqi.com\nq6u.com\nq77777777.com\nq83v5haaz.com\nq88b.net\nq88c.net\nq96bq8m39p.world\nqa114.com\nqacctv.com\nqacn.net\nqafone.cc\nqakkan.vip\nqalex.com\nqamemc.com\nqapi.cc\nqaqa555.com\nqaros.com\nqast.com\nqaxanyu.com\nqaxanyuv6.com\nqaxcloudwaf.com\nqaxwzws.com\nqaynak.com\nqazasd.com\nqazdsa.com\nqazso.com\nqaztool.com\nqazxsdc.com\nqbangmang.com\nqbao.cc\nqbaobei.com\nqbb6.com\nqbboss.com\nqbd888.com\nqbdgame.com\nqbewux.xyz\nqbfnp.com\nqbgxl.com\nqbide.com\nqbihui.com\nqbiqu.com\nqbitai.com\nqbj.cc\nqbjrxs.com\nqbjwater.com\nqbox.me\nqbox.net\nqbtxt.net\nqbtzjt.com\nqbview.com\nqbxz.com\nqc-hr.com\nqc-shanghaipathology.com\nqc101.com\nqc188.com\nqc6.com\nqc99.com\nqca.org\nqcaipiao.com\nqcbaas.com\nqcbone.com\nqcc.com\nqcc.qualcomm.com\nqccip.com\nqcckyc.com\nqccost.com\nqccr.com\nqccrm.com\nqcdne.com\nqcdnlog.com\nqcdntest.com\nqcdntest.net\nqcds.com\nqcdy.com\nqcdyj.com\nqcenglish.com\nqcgm.net\nqcgq168.com\nqchcm.com\nqches.com\nqchouses.com\nqchsym.com\nqchxt.com\nqcjslm.com\nqckuaizhi.com\nqclc.com\nqclivecdn.com\nqcloud-edumall.com\nqcloud.com\nqcloud.la\nqcloudapps.com\nqcloudcdn.com\nqcloudcdnsrc.com\nqcloudcjgj.com\nqcloudclass.com\nqcloudcos.com\nqcloudcos.net\nqcloudecdn.com\nqclouder.com\nqcloudestate.com\nqcloudgme.com\nqcloudgslb.com\nqcloudimg.com\nqcloudipv6.com\nqcloudmail.com\nqcloudmarket.com\nqcloudns.com\nqcloudocdn.com\nqcloudoceanus.com\nqcloudsmartiot.com\nqcloudtcic.com\nqcloudteo.com\nqcloudtiw.com\nqcloudtrip.com\nqcloudtt.com\nqcloudwaf.com\nqcloudwzgj.com\nqcloudzygj.com\nqcly.love\nqcly.xyz\nqcmgkids.com\nqcmod.xyz\nqcmoe.com\nqcmrjx.com\nqcmuzhi.com\nqcoco.com\nqconbeijing.com\nqconshanghai.com\nqcplay.com\nqcq3.com\nqcql.com\nqcr.cc\nqcrencai.com\nqcrlvip.com\nqcrqll.com\nqcsh8.net\nqcsj.com\nqcstudy.com\nqct100.com\nqctm.com\nqctsw.com\nqctx88.com\nqcvbs1296.com\nqcwan.com\nqcwh2021.com\nqcwhxx.com\nqcwlseo.com\nqcwp.com\nqcwxjs.com\nqcxrby.com\nqcxs.com\nqcxzls.com\nqcy.com\nqcymall.com\nqcyoung.com\nqcyuns.com\nqczb.app\nqd-dy.com\nqd-metro.com\nqd-mls.com\nqd-weimob.com\nqd.ink\nqd0513.com\nqd256.com\nqd5itt.com\nqd8.com\nqd8kbq0.shop\nqdac.cc\nqdaeon.com\nqdaiia.com\nqdaily.com\nqdairlines.com\nqdairport.com\nqdauction.com\nqdbdsk.com\nqdbhuh.com\nqdbocweb.com\nqdby.com\nqdcaijing.com\nqdcars.com\nqdccb.com\nqdccdl.com\nqdcloudsolution.com\nqdcu.com\nqdcykg.com\nqdcz.com\nqdd.gd\nqdd.gg\nqdd.la\nqdd2223338a2.shop\nqdd2223338a9.shop\nqddfxfpx.com\nqddlchb.com\nqddown.com\nqddsjx.com\nqddsta.com\nqdeastsea.net\nqdedu.net\nqderzhong.net\nqdexam.com\nqdezc.work\nqdfik.com\nqdfnscy.com\nqdfuer.com\nqdfuns.com\nqdgaoshanyun.com\nqdgjj.com\nqdgw.com\nqdgxjt.com\nqdgxqrc.com\nqdhantang.com\nqdhengyong.com\nqdhetian.net\nqdhkhospital.com\nqdhmsoft.com\nqdhongyunxing.com\nqdhonmon.com\nqdhr.net\nqdhsty.com\nqdhualing.com\nqdhuaren.com\nqdhw.com\nqdhwjs.com\nqdingnet.com\nqdipc.com\nqdjimo.com\nqdjingchengyiqi.com\nqdjjwsjf.com\nqdjttzjt.com\nqdjunyi.com\nqdjxhz.com\nqdjyjtdzsw.com\nqdkefu.com\nqdkelinde.com\nqdkingst.com\nqdkmjc.com\nqdkpdy.com\nqdlanrun.com\nqdlcl.com\nqdlib.net\nqdliding.com\nqdlinghaiba.com\nqdlives.com\nqdliye.com\nqdlongre.com\nqdlpay.com\nqdlups.com\nqdlyxx.com\nqdmama.net\nqdmcxh.com\nqdmm.com\nqdmswx.com\nqdn4ydsg3s.com\nqdnsyh.com\nqdnxsyy.com\nqdnzrmyy.com\nqdpdjx.com\nqdport.com\nqdpr.com\nqdqiche.com\nqdqihang.com\nqdqs.com\nqdrcsc.com\nqdreads.com\nqdsay.com\nqdsbx.com\nqdsdeyljt.com\nqdsdyjt.com\nqdshebao.com\nqdshoufei.com\nqdshuiche.com\nqdslcs.com\nqdsmjxh.com\nqdspr.com\nqdsrmyy.com\nqdsxtkj.com\nqdsysj.com\nqdsyxh.com\nqdtaide.com\nqdtech.ai\nqdtgood.com\nqdthgs.com\nqdtianxintai.com\nqdtrrh.com\nqdtxdzgc.com\nqduhwq.com\nqdurl.cc\nqdwebim.com\nqdwenxue.com\nqdwpa.com\nqdwxnet.com\nqdxfgy.com\nqdxgn.com\nqdxgysy.com\nqdxhd.com\nqdxhs.vip\nqdxtcw.com\nqdycdx.com\nqdyijiamei.com\nqdyiyi.com\nqdyuzhengtang.com\nqdyxbyy.com\nqdyztang.com\nqdzhengkang.com\nqdzhv.com\nqdzkmj.com\nqdzls.com\nqdznjt.com\nqdzx.net\nqdzxyy.com\nqdzz.com\nqe32.com\nqebk.com\nqechu.com\nqeebike.com\nqeecc.com\nqeejoo.com\nqeeka.com\nqeeniao.com\nqeerd.com\nqefee.com\nqegcdn.com\nqeoacc.com\nqeoacc.net\nqeoagphm.com\nqeodns.com\nqeodns.net\nqeqnet.com\nqera.online\nqerwsoft.com\nqeteshcn.com\nqeto.com\nqetoken.com\nqeyrhhy.com\nqf-meter.com\nqfang.com\nqfangimg.com\nqfbcs.com\nqfbio.com\nqfbwcd.xyz\nqfcgroup.com\nqfclo.com\nqfdeng.com\nqfdengn.com\nqfedu.com\nqfeiche.com\nqfiee.com\nqfihdr.com\nqfns1.com\nqfpay.com\nqfpq.com\nqfrost.com\nqfrxyl.com\nqfsh.com\nqfsyj.com\nqftimg.com\nqftouch.com\nqfull.com\nqfun.com\nqfvip.net\nqfwl.com\nqfxcha.com\nqg.net\nqg108.com\nqgb2b.com\nqgbnzb.com\nqgbzyzl.com\nqgcyjq.org\nqgenius.com\nqgfund.com\nqgggxxw.com\nqggj.com\nqggzszk.org\nqgjzsc.com\nqgkjacc.com\nqgodb.com\nqgpx.com\nqgqc.shop\nqgqy.com\nqgren.com\nqgsydw.com\nqgtql.com\nqgtsvvm1278.vip\nqgvps.com\nqgwzjs.com\nqgxl.org\nqgyqshz.com\nqgysj.org\nqgyyzs.net\nqgzb.net\nqgzxx.com\nqgzzz.com\nqh-cdn.com\nqh-dl.com\nqh-hospital.org\nqh-lb.com\nqh.com\nqh24.com\nqh4321.com\nqh6bc.com\nqh9y.com\nqhangyun.com\nqhass.org\nqhball.com\nqhbtv.com\nqhcby.com\nqhcdn.com\nqhch520.com\nqhchcb.com\nqhclass.com\nqhcro.com\nqhcswhh.com\nqhcuvj3143.vip\nqhd-marathon.com\nqhd.net\nqhdast.com\nqhdatongnews.com\nqhdcm.com\nqhderwei.com\nqhdgjj.com\nqhdglc.com\nqhdjgyy.com\nqhdlcdn.com\nqhdnews.com\nqhdnxgyy.com\nqhdren.com\nqhduhu.com\nqhdvtc.com\nqhdxgps.com\nqhdxw.com\nqhdzyy.com\nqhea.com\nqhee-ma.com\nqhee.com\nqhfx.net\nqhfzcp.com\nqhgas.com\nqhgufen.com\nqhgwh.com\nqhholding.com\nqhhxnw.com\nqhimg.com\nqhimgs.com\nqhimgs0.com\nqhimgs1.com\nqhimgs2.com\nqhimgs3.com\nqhimgs4.com\nqhimgs5.com\nqhimgs6.com\nqhimi.com\nqhjyks.com\nqhkyfund.com\nqhlhfund.com\nqhlingwang.com\nqhlyou.com\nqhm123.com\nqhmed.com\nqhmgf.com\nqhmsg.com\nqhnews.com\nqhong.net\nqhpcc.com\nqhpta.com\nqhrch.com\nqhrcsc.com\nqhres.com\nqhres2.com\nqhrqxh.com\nqhsat.com\nqhsdzs.com\nqhsetup.com\nqhsklw.com\nqhsrmyy.com\nqhssyy.com\nqhstatic.com\nqhsxf.net\nqhtdow.help\nqhtf-china.com\nqhtibetan.com\nqhtui.com\nqhtycp.com\nqhtysz.com\nqhtyzx.com\nqhuah.com\nqhupdate.com\nqhwmw.com\nqhwptyn.com\nqhwww.com\nqhxcjt.com\nqhxzlsgs.com\nqhyccd.com\nqhyh.com\nqhyhq.com\nqhyimin.com\nqhylns.com\nqhysjt.com\nqhytyyvx.com\nqhyzzzs.com\nqhzpw.com\nqi-auto.com\nqi-che.com\nqi-ju.com\nqi-wen.com\nqi10.com\nqi18.com\nqi58.com\nqiaijt.com\nqiaiju.com\nqiaiou.com\nqiak.com\nqialol.com\nqian-gua.com\nqian-lai.com\nqian.lu\nqianaolawyer.com\nqianbao.com\nqianbaocard.com\nqianbaogroup.com\nqianbaohr.com\nqianbeibei.shop\nqianbi360.com\nqianbianapi.com\nqianbianma.com\nqianbianxiazai.com\nqiancangwms.com\nqiancha.cc\nqianchenglvdong.com\nqianchengrh.com\nqianchengriben.com\nqianchiyun.com\nqiancipai.com\nqiandai.com\nqiandao.com\nqiandaoapp.com\nqiandaoapp.net\nqiandaocdn.com\nqiandaohu.cc\nqiandaqian.com\nqiandaren.com\nqiandd.com\nqiandeups.com\nqianduan.com\nqianduanheidong.com\nqianfan.app\nqianfan.tv\nqianfan123.com\nqianfan365.com\nqianfanwanmu.com\nqianfanyun.com\nqianfeng.com\nqiang100.com\nqiangbus.com\nqiangchezu.com\nqiangchuan.com\nqiangfu.xyz\nqianggen.com\nqianggen.net\nqianggou5.com\nqiangjin.org\nqiangka.com\nqianglihuifu.com\nqiangmi.com\nqiangqiang5.com\nqiangren.com\nqiangsenhg.com\nqiangshengyanhua.com\nqiangumeitan.com\nqiangungun.com\nqianguyihao.com\nqiangyingjituan.com\nqiangyinli.com\nqianhai12315.com\nqianhaiaiaitie.com\nqianhaibs.com\nqianhaipower.com\nqianhong.com\nqianhuajie.com\nqianhuanhulian.com\nqianhuaweb.com\nqianinfo.com\nqianjia.com\nqianjianggas.com\nqianjiangwang.com\nqianjiapp.com\nqianjiawen.net\nqianjiayue.com\nqianjing.com\nqianjingdesign.com\nqianjingkeji.com\nqianju.org\nqianka.com\nqiankoo.com\nqiankun6.com\nqiankungroup.com\nqiankunshopping.com\nqiankunxin.com\nqianlai778.com\nqianlaiye.com\nqianlht.com\nqianliao.net\nqianliao.tv\nqianliaowang.com\nqianliht.com\nqianliii.com\nqianlima.com\nqianlimafile.com\nqianlimazb.com\nqianling.pw\nqianlinkj.com\nqianlong.com\nqianluxiaoshuo.com\nqianmaiapp.com\nqianmaidao.com\nqianmi.com\nqianmingyun.com\nqianmiyun.com\nqianmoqi.com\nqianmoufirm.com\nqianmu.org\nqiannahotel.com\nqianniu.com\nqianp.com\nqianpailive.com\nqianpen.com\nqianpin.com\nqianping.work\nqianqi.net\nqianqian.com\nqianqiankeji.xyz\nqianqiantao.com\nqianrengang.com\nqianrenge.com\nqianrihong.net\nqianrong.me\nqianselight.com\nqianshanren.com\nqianshengqian.com\nqianshuixing.com\nqiansiw.com\nqiant.net\nqiantangke.com\nqiantubao.asia\nqiantucdn.com\nqianuni.com\nqianvisa.com\nqianwa.com\nqianwanku.com\nqianwen.com\nqianxiangbank.com\nqianxibj.net\nqianximiye.com\nqianxin.com\nqianxincdn.com\nqianxinet.com\nqianxingniwo.com\nqianxingwl.com\nqianxs.com\nqianxuecloud.com\nqianxuew.com\nqianxueyunke.com\nqianxun.com\nqianxunclub.com\nqianxungroup.com\nqianxuntrip.com\nqianyan.biz\nqianyan001.com\nqianye88.com\nqianyierp.com\nqianyikeji.com\nqianyinedu.com\nqianyingzhi.com\nqianyuangx.com\nqianyuewenhua.xyz\nqianyuncare.com\nqianyuwang.com\nqianzhan.com\nqianzhan123.com\nqianzhanhl.com\nqianzhengbanliliucheng.com\nqianzhengdaiban.com\nqianzhou.shop\nqianzhu8.com\nqianzhuvisa.com\nqiao-cn.com\nqiao88.com\nqiaobo.net\nqiaobocnc.com\nqiaobuqiao.com\nqiaobutang.com\nqiaoclouds.com\nqiaodan.com\nqiaofangyun.com\nqiaofanxin.com\nqiaoh.com\nqiaohewei.cc\nqiaohu.com\nqiaohuapp.com\nqiaohumall.com\nqiaoji8.com\nqiaojiamuxian.com\nqiaojiang.tv\nqiaolianyimin.com\nqiaolishuiwu.com\nqiaomaren.com\nqiaomi.com\nqiaomu.ai\nqiaomukeji.com\nqiaoqiaoyun.com\nqiaoshang.org\nqiaoshisui.com\nqiaoshoujituan.com\nqiaosidea.com\nqiaotu.com\nqiaoxuanhong.com\nqiaoxuesi.com\nqiaoyi.org\nqiaoyinkg.com\nqiaoyue66.com\nqiaozhuangjia.com\nqiaozuji.com\nqiaqa.com\nqiaqiafood.com\nqiawei.com\nqibali.com\nqibaodwight.org\nqibazaixian.com\nqibingdaojia.com\nqibingwang.com\nqibo168.com\nqiboleqipai.com\nqibosoft.com\nqibox.com\nqibuge.com\nqibuluo.com\nqicaispace.com\nqicaizulinwang.com\nqichacha.co\nqichacha.com\nqichacha.net\nqichamao.com\nqichang56.com\nqichangqing.com\nqichangv.com\nqichecailiao.com\nqichechaoren.com\nqichedaquan.com\nqicheedu.com\nqichegeyin.com\nqichehot.com\nqichejingwei.com\nqichelian.com\nqicheliliang.com\nqichemen.com\nqichemoxing.net\nqichengplus.com\nqichepeijian.com\nqichepinpai.com\nqicheq.com\nqichequan.net\nqichetansuo.com\nqichetong.com\nqichexin.com\nqichexl.com\nqichezhan.net\nqichuang.com\nqichunfdc.com\nqichunzp.com\nqicolor.com\nqicp.net\nqicp.vip\nqictools.com\nqida100.com\nqidaile.com\nqideshuiwu.com\nqideyun.com\nqidi-edu.com\nqidian-cos-backup.com\nqidian-cos.com\nqidian.com\nqidian688.com\nqidianbox.com\nqidianjob.com\nqidianla.com\nqidianmm.com\nqidianpw.com\nqidiantu.com\nqidic.com\nqidisheng.com\nqidiwang.com\nqidong.name\nqidongcha.com\nqidongnews.com\nqidongyx.com\nqidou.com\nqidulp.com\nqiduo.net\nqie.tv\nqiecdn.com\nqieerxi.com\nqiejingsu.com\nqiekao.com\nqiekj.com\nqieman.com\nqiepai.com\nqieracing.com\nqierge.com\nqieta.com\nqieyike.com\nqieying.com\nqieyou.com\nqiezibenpao.com\nqiezic.com\nqiezip.com\nqifake.com\nqifan1.com\nqifandianlansh.com\nqifangw.com\nqifeiy.com\nqifeiye.com\nqifeizn.com\nqifeng-safety.com\nqifeng.com\nqifenxiao.com\nqifu.me\nqifub.com\nqifuip.com\nqigonggate.com\nqigongworld.net\nqigousoft.com\nqiguagua.com\nqigumi.com\nqiguo.com\nqiguoread.com\nqihanbio.com\nqihangcrrc.com\nqihangw.com\nqihaoip.com\nqihaoqu.com\nqihaxiaoshuo.com\nqihejy.com\nqihepaimai.com\nqihihi.com\nqihoo.com\nqihoo.net\nqihu.com\nqihu.org\nqihuaa.xyz\nqihuangpuji.com\nqihuangshuyuan.com\nqihuangzhishu.com\nqihuapi.com\nqihucdn.com\nqihuiai.com\nqihuiwang.com\nqihuorumen.com\nqii404.me\nqiieer.net\nqiigame.com\nqiivoo.com\nqijedu.com\nqijee.com\nqijiadianzi.com\nqijian99.com\nqijianzs.com\nqijiapay.com\nqijiayoudao.net\nqijilvxing.com\nqijishow.com\nqijishu.com\nqijiyun.vip\nqijizuopin.com\nqijuan.com\nqijucn.com\nqikan.com\nqikanchina.com\nqikanmulu.com\nqikanvip.com\nqikanw.com\nqike-cloud.com\nqikegu.com\nqikekeji.com\nqikoo.com\nqikouu.com\nqikqiak.com\nqiku.com\nqikuaibao.com\nqikucdn.com\nqikula.com\nqilaijian.com\nqilang.net\nqilanxiaozhu.co\nqilanxiaozhu.net\nqilanxiaozhu.vip\nqilaoshicaishui.com\nqilecms.com\nqiliangjia.com\nqiliaokj.com\nqilindao.com\nqiling.org\nqilinnet.com\nqilinshuixiang.com\nqilinxuan.net\nqilinyiqi88.com\nqilitech.ltd\nqiliuxs.com\nqilong.com\nqilongtan.com\nqilongyoule.com\nqilu-pharma.com\nqiluce.com\nqiludb.com\nqiluhospital.com\nqiluhr.com\nqilupaint.com\nqiluyidian.mobi\nqiluyidian.net\nqima-inc.com\nqimaiz.com\nqimao.com\nqimi.com\nqimiaosenlin.com\nqiming.tech\nqimingcx.com\nqimingjiang.com\nqimingpian.com\nqimingvc.com\nqimingventures.com\nqimingxing.com\nqimingzi.net\nqiminzi.com\nqimodesign.com\nqimser.com\nqimu86.com\nqinbei.com\nqinbing.com\nqincai.com\nqincaigame.com\nqinchacha.com\nqinchuan.com\nqinchugudao.com\nqincj.me\nqinco.net\nqindaohotel.com\nqinde.net\nqineasy.com\nqinengdongfang.com\nqiner520.com\nqinfenpharm.com\nqing-feng.com\nqing-shan.com\nqing-tian.com\nqing.me\nqing.su\nqing5.com\nqingbh.com\nqingcache.com\nqingcaige.com\nqingcdn.com\nqingcheng.com\nqingchengfaren.com\nqingchenyu.com\nqingchunbank.com\nqingchunlu.com\nqingcigame.com\nqingclass.com\nqingclasscdn.com\nqingcloud.com\nqingcongxiaoyuan.com\nqingcty.com\nqingdan.com\nqingdao-port.com\nqingdao-port.net\nqingdaochina.org\nqingdaogxt.com\nqingdaokohap.com\nqingdaolawyer.org\nqingdaomaidige.com\nqingdaomedia.com\nqingdaomeixie.com\nqingdaomuseum.com\nqingdaonengyuan.com\nqingdaonews.com\nqingdaoport.net\nqingdaoren.com\nqingdaoshenghao.com\nqingdelan.com\nqingdou.ltd\nqingdou.net\nqingdou.vip\nqingdouw.com\nqingf001.com\nqingfanqie.com\nqingfeichina.com\nqingfengchuxing.com\nqingfengjiaoyu.com\nqingflow.com\nqingfo.com\nqingful.com\nqingfuwu.com\nqingfuwucdn.com\nqingfuwucdn.net\nqingge666.com\nqinggl.com\nqinggonggroup.com\nqingguo.com\nqinghaigames.com\nqinghaihuaer.com\nqinghe-sh.com\nqinghe.tv\nqinghedaxue.com\nqinghua.cc\nqinghua2017.com\nqinghuan.com\nqinghuaonline.com\nqinghuaxuezi.com\nqinghuo.net\nqingicon.com\nqingjiaocloud.com\nqingju.com\nqingkai.net\nqingkan.tw\nqingkaoyan.com\nqingkeji.com\nqingkongfy.xyz\nqingkuaipdf.com\nqingkuajing.com\nqingkuw.com\nqinglan.info\nqinglanbaseanycast.com\nqinglanbaseunicast.com\nqinglanji.com\nqinglianfood.com\nqingliange.com\nqingliangkeji.com\nqingliaoapp.com\nqinglidashi.com\nqingliezhiquan.com\nqinglin.net\nqingline.net\nqinglingvip.com\nqinglinong.com\nqinglm.com\nqinglue.com\nqinglue.net\nqinglvpin.com\nqingly.ink\nqingmail.com\nqingmayun.com\nqingmei.me\nqingmh.com\nqingmo.com\nqingmob.com\nqingmucdn.com\nqingmuit.com\nqingmutec.com\nqingmuxinli.com\nqingnianlvxing.com\nqingniantuzhai.com\nqingnianwang.com\nqingpanduola.com\nqingpin.vip\nqingping.co\nqingqikeji.com\nqingqin.com\nqingqingmedia.com\nqingqj.com\nqingque.co\nqingqujie.com\nqingquyp.com\nqingr.com\nqingrenw.com\nqingruanit.net\nqingruyun.com\nqingshanpaper.com\nqingshigame.com\nqingshou.online\nqingshow.net\nqingshuo.com\nqingshuxuetang.com\nqingsongcdn.com\nqingsongchou.com\nqingsongjituan.com\nqingsonngxx.com\nqingstor.com\nqingsucai.com\nqingtajiao.com\nqingtaoke.com\nqingteng-inc.com\nqingteng168.com\nqingtengzhilian.com\nqingtian16265.com\nqingtiancms.net\nqingting.fm\nqingting123.com\nqingtingfm.com\nqingtingip.com\nqingtingjh.com\nqinguanjia.com\nqingui123.com\nqinguoag.com\nqingwabs.com\nqingwk.com\nqingxianrenminyiyuan.com\nqingxiaoyun.com\nqingxinjs.com\nqingxuetang.com\nqingxun.com\nqingyantek.com\nqingyeyun.com\nqingyi.com\nqingying.net\nqingyuangroup.com\nqingyuanshihua.com\nqingyun-it.com\nqingyun.com\nqingyuntrip.com\nqingyunzu.com\nqingzhanshi.com\nqingzhicheng.com\nqingzhifeng.com\nqingzhiwenku.com\nqingzhou5.com\nqingzhouip.com\nqinheng.com\nqinhuaiziyun.com\nqiniu-enterprise.com\nqiniu.co\nqiniu.com\nqiniu.in\nqiniu.io\nqiniu.org\nqiniu.us\nqiniuapi.com\nqiniuapp.com\nqiniublob.com\nqiniucc.com\nqiniucdn.com\nqiniucloud.net\nqiniucs.com\nqiniudn.com\nqiniudns.com\nqiniudns.net\nqiniudns2.com\nqiniug.com\nqiniuimg.com\nqiniuinc.com\nqiniuio.com\nqiniukodo.com\nqiniup.com\nqiniupkg.com\nqiniuqcdn.com\nqiniurs.com\nqiniutek.com\nqinla.com\nqinlake.com\nqinlaobo.com\nqinlaoke.net\nqinlinad.com\nqinlinkeji.com\nqinms.com\nqinnongbank.com\nqinpu.com\nqinpuwang.com\nqinqiang.org\nqinqin.com\nqinqin.net\nqinqingshipin.com\nqinqinxiaobao.com\nqinqishuhua.org\nqinronmedia.com\nqinronread.com\nqinrun.com\nqins.com\nqinshantang.com\nqinshihu.com\nqinsilk.com\nqinsmoon.com\nqinsuanbazi.com\nqinxiand.com\nqinxing.xyz\nqinxue.com\nqinxue100.com\nqinxue365.com\nqinxuye.me\nqinyangtv.com\nqinyuanyang.com\nqinyukehuan.com\nqinzhe.com\nqinzhou.net\nqinzhou360.com\nqinzhou8.com\nqinzhouit.com\nqinzibuy.com\nqinzidna.com\nqionghaif.com\nqionghi.com\nqiongming.com\nqiow.net\nqipai.com\nqipai007.com\nqipaifan.com\nqipamaijia.com\nqipayuan.com\nqipeipu.com\nqipeiren.com\nqipeiwuyou365.com\nqipeng.com\nqipinshangji.com\nqiqao.com\nqiqi2000.com\nqiqiboke.com\nqiqids.com\nqiqilab.com\nqiqipu.com\nqiqiuyu.com\nqiqiuyun.net\nqiqjc.com\nqiqu.cc\nqiquanwl.com\nqiquha.com\nqiqumaker.com\nqiquw.info\nqiquwen.com\nqiquyou.com\nqire123.com\nqirebook.com\nqiredy.com\nqiremanhua.com\nqirui.com\nqiruikeji2019.com\nqisankeji.com\nqisaoba.com\nqisbook.com\nqishenghuo.com\nqishengliang.com\nqishiruye.com\nqishixitong.com\nqishu.vip\nqishui.com\nqishunbao.com\nqishuta.info\nqishuta.la\nqishuta.net\nqishuta.org\nqisi.co\nqisool.com\nqita.love\nqitaifu.com\nqitaijiuye.com\nqiti88.com\nqitian-tech.com\nqitianchina.com\nqitianpower.com\nqitongxq.com\nqituowang.com\nqiu-ai.com\nqiu630.com\nqiuball.com\nqiubiaoqing.com\nqiufaqf.com\nqiufengblog.com\nqiuhua.com\nqiujieda.com\nqiujuer.net\nqiujunya.com\nqiukuixinxi.com\nqiumei100.com\nqiumeiapp.com\nqiumibao.com\nqiumijia.com\nqiumiwu.com\nqiupuwang.com\nqiuqiusd.com\nqiuquan.cc\nqiushi.com\nqiushibaike.com\nqiushile.com\nqiushu.cc\nqiushu.info\nqiushubang.com\nqiushuzw.com\nqiutan.com\nqiutianaimeili.com\nqiutiangear.com\nqiuvps.com\nqiuweili.com\nqiuwen.wiki\nqiuwu.net\nqiuxian.com\nqiuxiao.com\nqiuxietang.com\nqiuxue360.com\nqiuxueshe.com\nqiuyewang.com\nqiuyexitong.com\nqiuyueli.com\nqiuzhang.com\nqiuzhijiangtang.com\nqiuziti.com\nqiwang2025.com\nqiwangming.com\nqiwei.com\nqiwenhui.com\nqiwenqi.com\nqiwenya.com\nqiwiotch.com\nqiwo.cc\nqixia.ltd\nqixiangwang.com\nqixigame.com\nqixin.com\nqixin007.com\nqixin18.com\nqixin19.com\nqixincha.com\nqixing123.com\nqixingcr.com\nqixingquan.com\nqixingtang.com\nqixinpro.com\nqixintian.com\nqixinworks.com\nqixiu88.com\nqixiushouce.com\nqixoo.com\nqixuan888.com\nqixuny.com\nqiye.la\nqiye163.com\nqiye8848.com\nqiyeboao.com\nqiyedata.net\nqiyegongqiu.com\nqiyegongqiu.net\nqiyeku.com\nqiyelipin.com\nqiyenet.net\nqiyes.com\nqiyeshangpu.com\nqiyeshangpu.net\nqiyesou.com\nqiyetong.com\nqiyetoupiao.com\nqiyeweixin.com\nqiyewenhua.net\nqiyeyougou.com\nqiyeyouxiang.net\nqiyi.com\nqiyi.video\nqiyikeji.com\nqiyimusic.com\nqiyipic.com\nqiyiw.com\nqiyou.com\nqiyoubangbang.com\nqiyouji.com\nqiyoujiage.com\nqiyoutuo.com\nqiyouwang.com\nqiyouworld.com\nqiytech.com\nqiyu-lighting.com\nqiyu99.com\nqiyuanai.com\nqiyuange.com\nqiyuanxuetang.net\nqiyucloud.com\nqiyue.com\nqiyuebio.com\nqiyuesuo.com\nqiyujiasu.com\nqiyujoy.com\nqiyukf.com\nqiyukf.net\nqiyuniot.com\nqiyuns3.com\nqiyuntong.com\nqiyunxinfu.com\nqiyutech.tech\nqiyutianxia.com\nqizbov8115.vip\nqizhao.com\nqizheplay.com\nqizhidao.com\nqizhihaotian.com\nqizhong166.com\nqizhu.org\nqizhu18.com\nqizhuyun.com\nqizi.cc\nqizuang.com\nqizubang.com\nqj-group.com\nqj-robot.com\nqj023.com\nqj175.com\nqj26.com\nqj99.net\nqjbchina.com\nqjbxw.com\nqjcode.com\nqjcrcgas.com\nqjcz.com\nqjdchina.com\nqjfy.com\nqjhlw.com\nqjhm.com\nqjia.com\nqjiajk.com\nqjidea.com\nqjimage.com\nqjis.com\nqjjfin.com\nqjjmw.com\nqjmotor.com\nqjnice.com\nqjrc.com\nqjren.com\nqjsalia.com\nqjsalib.com\nqjsb88.com\nqjslngy.com\nqjsmartech.com\nqjtourism.com\nqjwenming.com\nqjwh.xyz\nqjwhzs.com\nqjwjw.com\nqjxgold.com\nqjystang.com\nqjzl.com\nqjzyy.com\nqk365.com\nqkagame.com\nqkan.com\nqkang.com\nqkblh.com\nqkcdn.com\nqkeke.com\nqkhg.com\nqking.ink\nqkisp.com\nqkixeld.xyz\nqkkj88.com\nqkkjd.com\nqkl234.com\nqknode.com\nqknown.com\nqktoutiao.com\nqkttapp.com\nqkua.com\nqkvop.com\nqkyamkl.com\nqkyxzx.com\nqkzj.com\nql-cellbank.com\nql-msx.com\nql-spe.com\nql009.com\nql18.mobi\nql1d.com\nql361.com\nql361.shop\nqlan99.com\nqlbchina.com\nqlbk.com\nqlchat.com\nqldgd.com\nqldz.store\nqldzj.com\nqledu.net\nqlelectrons.com\nqlhimalayantm.com\nqlidc.com\nqlife-lab.com\nqling.com\nqlinyun.com\nqlippie.com\nqlivecdn.com\nqlivecloud.com\nqlivertc.com\nqlivertc2.com\nqlivewebrtc.com\nqlivewebrtc2.com\nqll-times.com\nqlmec.com\nqlmf.com\nqlmoney.com\nqlnonwoven.com\nqlotc.net\nqlrc.com\nqlrc114.com\nqls.fun\nqls70.com\nqlteacher.com\nqluu.com\nqlwyjy.com\nqlxiaozhan.com\nqlxyedu.com\nqlxzj.com\nqlydw.com\nqlyjt.com\nqlyygl.com\nqlyyqd.com\nqlzygs.com\nqm.net\nqm119.com\nqm120.com\nqm2009.com\nqm41.com\nqm69.com\nqm989.com\nqmacro.com\nqmail.com\nqmango.com\nqmceo.com\nqmconfig.com\nqmcro.com\nqmei.me\nqmei.vip\nqmeikq.com\nqmhd87.com\nqmhimalayanpz.com\nqmhkids.com\nqmht.com\nqmht.mobi\nqmjianli.com\nqmniu.com\nqmoji.net\nqmqm.net\nqmrms.com\nqmrobot.com\nqmsea.com\nqmsjmfb.com\nqmtj.net\nqmtjgame.com\nqmtmedia.com\nqmtv.com\nqmvchina.com\nqmwtp.com\nqmwyy.com\nqmxny.com\nqmxphoto.com\nqmxrmt.com\nqmxyc.com\nqmyc.ltd\nqmyq.com\nqmyyl.com\nqmz5.com\nqmz99.com\nqmzhibo.com\nqmzs.com\nqn200.com\nqnali.com\nqnapcn.com\nqnbar.com\nqncd.com\nqncha.com\nqnchrome.com\nqndb.net\nqnfcdn.com\nqnfyg.com\nqngas.com\nqngcjx.com\nqnget.com\nqngslb.com\nqngygf.com\nqnhdkj.com\nqnhuifu.com\nqnjslm.com\nqnjyjt.com\nqnl1.com\nqnlinking.com\nqnlj.com\nqnmlgb.tech\nqnqcdn.com\nqnqcdn.net\nqnsdk.com\nqnssl.com\nqnvipmall.com\nqnvipxd.com\nqnw.cc\nqnydns.com\nqnydns.net\nqnzrmyy.com\nqnzyy.com\nqoder.ai\nqoder.com\nqolai.com\nqooboo.com\nqoocc.com\nqooic.com\nqooioo.com\nqookar.com\nqookkagames.com\nqoros.com\nqorosauto.com\nqosnet.xyz\nqosq.com\nqouteall.fun\nqp108.com\nqp110.com\nqp46.com\nqp49.com\nqp666.com\nqpaimg.com\nqpb187.com\nqpdca.com\nqpdiy.com\nqpgame.com\nqpgczx.com\nqphospital.com\nqpjjku.com\nqpjylm.com\nqpkaifa.com\nqplus.com\nqplusstatic.com\nqpoc.com\nqpstar.com\nqpwater.com\nqpxiaoshuo.com\nqpz.com\nqpzq.net\nqq-xmail.com\nqq.cc\nqq.com\nqq.design\nqq.do\nqq.md\nqq.net\nqq.travel\nqq.zone\nqq11999.com\nqq123.xin\nqq1398.com\nqq163.cc\nqq163.com\nqq163.net\nqq190.com\nqq190.net\nqq260.com\nqq2tdd0xx.com\nqq3366.net\nqq499.com\nqq5.com\nqq52o.me\nqq5818.com\nqq620.com\nqq745.com\nqq7c.com\nqq933.com\nqq937.com\nqq999q.com\nqq9v.com\nqqai.net\nqqaiqin.com\nqqan.com\nqqb.pub\nqqbiaoqing.com\nqqbibile.com\nqqbrowser.mobi\nqqbytrans.com\nqqcdn.com\nqqcfw.net\nqqcg.com\nqqcjw.com\nqqclass.com\nqqclock.com\nqqcnop366.vip\nqqddc.com\nqqdiannao.com\nqqdiannaoguanjiadl.com\nqqdna.com\nqqdr.com\nqqdzzb.win\nqqe2.com\nqqeml.com\nqqeo.com\nqqexmail.net\nqqexpert.com\nqqfamily.com\nqqgameapp.com\nqqgamedesign.com\nqqgamemall.com\nqqgames.com\nqqgb.com\nqqgd.com\nqqgexing.com\nqqgexingqianming.com\nqqgfw.com\nqqgpw.com\nqqgx.com\nqqgygd.com\nqqgyhk.com\nqqhangjia.com\nqqhaoma.com\nqqhaoma.net\nqqhbx.com\nqqhjy.com\nqqhn.net\nqqhot.com\nqqhrnews.com\nqqhubei.com\nqqhwb.com\nqqiac.com\nqqimage.net\nqqimg.net\nqqjapan.com\nqqje.com\nqqjia.com\nqqjiyu.com\nqqjjsj.com\nqqjm.com\nqqju.com\nqqkj66.com\nqqkjj.com\nqqkkb.com\nqqkrmotors.com\nqqku.com\nqqkw.com\nqqmail.com\nqqmail.email\nqqmapyx.com\nqqmc.com\nqqmcc.org\nqqmda.com\nqqmra.com\nqqmtc.com\nqqmusic.com\nqqmusic.store\nqqnaozhong.com\nqqnn.net\nqqopenapp.com\nqqor.com\nqqpao.com\nqqpharm.com\nqqpifu.com\nqqplusapp.com\nqqpuke.org\nqqq.tv\nqqq937.com\nqqqiyemail.com\nqqqiyeyouxiang.com\nqqqmmm.com\nqqqv.press\nqqrain.com\nqqread.com\nqqrizhi.com\nqqro.com\nqqscb.com\nqqservice.mobi\nqqsgame.com\nqqsgjy.com\nqqsgmob.com\nqqsgplay.com\nqqshidao.com\nqqshuoshuo.com\nqqsk.com\nqqski.com\nqqsm.com\nqqsort.com\nqqspark.com\nqqssly.com\nqqstudent.com\nqqsurvey.net\nqqswzx.com\nqqt.com\nqqteacher.com\nqqtest.com\nqqtf.com\nqqthj.com\nqqtjmgg.com\nqqtlr.com\nqqtool8.com\nqqtouxiangzq.com\nqqtu8.cc\nqqtu8.com\nqqtz.com\nqquanquan.com\nqqumall.com\nqqun.com\nqqurl.com\nqqwangming6.com\nqqwebapp.com\nqqwiki.com\nqqwinner.com\nqqwjx.com\nqqwmba.net\nqqwmly.com\nqqwwr.com\nqqwxmail.com\nqqwys.net\nqqxmail.com\nqqxs.la\nqqxsnew.net\nqqxsnew5.com\nqqxsw.co\nqqxx.net\nqqxzb-img.com\nqqxzb.com\nqqy189.com\nqqya.com\nqqyewu.com\nqqymail.com\nqqyn.com\nqqyouju.com\nqqywf.com\nqqyy.com\nqqzby.net\nqqzfw.com\nqqzhi.com\nqqzi.net\nqqzimu.com\nqqzimu.net\nqqzl.cc\nqqzmly.com\nqqzu.com\nqqzyw.com\nqqzywang.com\nqqzzz.net\nqr-batch.com\nqr25.com\nqrcpu.com\nqrgiant.com\nqrmanhua.com\nqrobot.com\nqrprt.com\nqrtest.com\nqrtz.co\nqrx.cc\nqrzxx.com\nqs-jt.net\nqs12315.com\nqs5.org\nqs921.com\nqsap-group.com\nqsbank.cc\nqsbbs.net\nqsbdc.com\nqsboy.com\nqscharge.com\nqschou.com\nqsebao.com\nqsedu.com\nqsedus.com\nqseeking.com\nqsfcw.com\nqsfm.net\nqsgx-pt.com\nqshang.com\nqshealth.com\nqsiedu.com\nqsiso.com\nqsjsjt.com\nqsjt.com\nqsjxzz.com\nqskggf.com\nqskj.net\nqskretkf.com\nqsl.pub\nqsmchina.com\nqsmis.com\nqsmutual.com\nqsnctf.com\nqsnovel.com\nqspfw.com\nqspfwadmin.com\nqss-lb.com\nqssec.com\nqstatic.com\nqstbg.com\nqstcorp.com\nqstsking.com\nqsw.la\nqswk.com\nqswnet.com\nqsxiaoshuo.com\nqsxiu.com\nqsxuke.com\nqsxzls.com\nqsyfunds.com\nqsyy.net\nqszs.com\nqszt.com\nqszt.net\nqt-edu.com\nqt.com\nqt119.com\nqt56yun.com\nqt6.com\nqt86.com\nqtaeixd.com\nqtav.org\nqtbig.com\nqtbtp.com\nqtcb.net\nqtccolor.com\nqtck.net\nqtcn.org\nqtctc.org\nqtdebug.com\nqtdream.com\nqtedu.net\nqteng.net\nqter.org\nqtest8.com\nqtgz.cc\nqth8.com\nqthinker.net\nqtke.com\nqtkj.love\nqtlcdn.com\nqtlcdn.net\nqtlcdn360.info\nqtlcdn360.xin\nqtlcdn360.xyz\nqtlcdncn.info\nqtlcn.com\nqtlcname.com\nqtlglb.com\nqtlglb.info\nqtlgslbcn.com\nqtlgslbcn.info\nqtlgslbcn.net\nqtmojo.com\nqto-pay.com\nqtonghua.com\nqtool.net\nqtrun.com\nqtshe.com\nqtshisan.com\nqtshu.com\nqtshu.la\nqtslog.com\nqtsyw.com\nqttc.net\nqttunion.com\nqtu8.com\nqtumist.com\nqtvnews.com\nqtw555.com\nqtx.com\nqtyd.com\nqu2000.com\nqu2345.com\nqu247.com\nqu67.com\nqua.com\nquaita.com\nqualcomm-challenge.com\nqualcomm.cn.cdn.cloudflare.net\nquality666.com\nqualtekgz.com\nquan.mx\nquan007.com\nquan05.com\nquan365.com\nquanaichina.com\nquanbailing.com\nquancang.com\nquandashi.com\nquanduoduo.com\nquanerp.com\nquanfangtong.net\nquanfangtongvip.com\nquanfeng.tech\nquanfensi.com\nquanfs.com\nquanguoban.com\nquanguoyoubian.com\nquangushi.com\nquanhuaoffice.com\nquanji.la\nquanji.net\nquanjiamei.com\nquanjiaowang.com\nquanjing.com\nquanjingke.com\nquanjinglian.com\nquanjunkeji.com\nquanjuwuye.com\nquankexia.com\nquanlaoda.com\nquanlego.com\nquanlitu.com\nquanlv66.com\nquanma51.com\nquanmaigo.com\nquanmaihuyu.com\nquanmama.com\nquanmamaimg.com\nquanmamaonline.com\nquanmeipai.com\nquanmin-game.com\nquanmin.tv\nquanmin110.com\nquanminbagua.com\nquanminbb.com\nquanminfu.com\nquanoukeji.com\nquanqiuwa.com\nquanqiuweishang.com\nquanquanapp.net\nquanriai.com\nquansheng-group.com\nquanshi.com\nquanshuge.com\nquanshui.net\nquansucloud.com\nquantacn.com\nquantaoyougou.com\nquantil.com\nquantilcn.net\nquantilng.com\nquantobio.com\nquantongfu.com\nquantuantuan.com\nquantum-etc.com\nquantum-info.com\nquantumsc.online\nquanwai100.com\nquanwiki.com\nquanxi.cc\nquanxiangyun.com\nquanxiankeji.com\nquanxiaoha.com\nquanxinfu.com\nquanyaotong.com\nquanyin.xyz\nquanyueqk.com\nquanyuesc.com\nquanzhanketang.com\nquanzhi.com\nquanzhifu.net\nquanzhougastronomy.com\nquanziapp.com\nquaolai.com\nquarkbook.com\nquarkers.com\nquartzhy.com\nquasarchs.com\nquaspa.com\nquazero.com\nquba360.com\nqubang.cc\nqubaobei.com\nqubiankeji.com\nqucai.com\nqucanzhan.com\nquce001.com\nquceaiqing.com\nquchao.net\nqucheng.com\nquclouds.com\nqudaiji.com\nqudajie.com\nqudao168.com\nqudaowuyou.com\nqudayun.com\nqudingshui.com\nqudong.com\nqudong51.net\nqudong9.com\nqudou100.com\nqudushu.com\nquduzixun.com\nqueceng.com\nquechao.vip\nquechen.com\nquectel.com\nqueenl.com\nquefan.com\nquegame.com\nquegui.run\nquehu.com\nqueji.tw\nquenergysemi.com\nqueniuaa.com\nqueniuab.com\nqueniuai.com\nqueniuak.com\nqueniual.com\nqueniuam.com\nqueniubc.com\nqueniubd.com\nqueniubf.com\nqueniubg.com\nqueniubh.com\nqueniubi.com\nqueniubk.com\nqueniubl.com\nqueniubm.com\nqueniubn.com\nqueniubq.com\nqueniubt.com\nqueniucdn.com\nqueniucdn.net\nqueniucf.com\nqueniucg.com\nqueniuck.com\nqueniucl.com\nqueniucm.com\nqueniucn.com\nqueniuco.com\nqueniucs.com\nqueniucw.com\nqueniucx.com\nqueniucz.com\nqueniuda.com\nqueniudd.com\nqueniude.com\nqueniudf.com\nqueniudg.com\nqueniudl.com\nqueniudns.com\nqueniudns.net\nqueniudo.com\nqueniudt.com\nqueniuee.com\nqueniueg.com\nqueniueh.com\nqueniuei.com\nqueniueq.com\nqueniuer.com\nqueniues.com\nqueniuez.com\nqueniufa.com\nqueniufc.com\nqueniufg.com\nqueniufi.com\nqueniufj.com\nqueniufm.com\nqueniufr.com\nqueniufw.com\nqueniufz.com\nqueniugd.com\nqueniugm.com\nqueniugslb.com\nqueniugslb.net\nqueniugt.com\nqueniugv.com\nqueniugw.com\nqueniugz.com\nqueniuhe.com\nqueniuhg.com\nqueniuhl.com\nqueniuhp.com\nqueniuhx.com\nqueniuhy.com\nqueniuhz.com\nqueniuib.com\nqueniuic.com\nqueniuif.com\nqueniuig.com\nqueniuih.com\nqueniuin.com\nqueniuiq.com\nqueniuit.com\nqueniuiv.com\nqueniuiy.com\nqueniuja.com\nqueniujd.com\nqueniuje.com\nqueniujf.com\nqueniujg.com\nqueniujq.com\nqueniujz.com\nqueniukk.com\nqueniukq.com\nqueniukr.com\nqueniuks.com\nqueniukt.com\nqueniukw.com\nqueniukx.com\nqueniukz.com\nqueniulb.com\nqueniulf.com\nqueniulg.com\nqueniuli.com\nqueniulp.com\nqueniulr.com\nqueniuls.com\nqueniulu.com\nqueniulv.com\nqueniulz.com\nqueniumc.com\nqueniumd.com\nqueniumf.com\nqueniumh.com\nqueniumn.com\nqueniumo.com\nqueniumy.com\nqueniund.com\nqueniunh.com\nqueniuni.com\nqueniunq.com\nqueniuns.com\nqueniuny.com\nqueniunz.com\nqueniuod.com\nqueniuog.com\nqueniuop.com\nqueniuos.com\nqueniuot.com\nqueniuoy.com\nqueniupa.com\nqueniupc.com\nqueniupe.com\nqueniupg.com\nqueniupj.com\nqueniupl.com\nqueniupq.com\nqueniupz.com\nqueniuqe.com\nqueniuqj.com\nqueniuql.com\nqueniuqm.com\nqueniuqt.com\nqueniuqu.com\nqueniuqy.com\nqueniuqz.com\nqueniurc.com\nqueniurj.com\nqueniurk.com\nqueniurq.com\nqueniuru.com\nqueniurv.com\nqueniurx.com\nqueniusa.com\nqueniusf.com\nqueniusg.com\nqueniush.com\nqueniusi.com\nqueniusj.com\nqueniuso.com\nqueniusp.com\nqueniusr.com\nqueniusv.com\nqueniusy.com\nqueniusz.com\nqueniutc.com\nqueniute.com\nqueniutn.com\nqueniutt.com\nqueniutx.com\nqueniutz.com\nqueniuua.com\nqueniuuc.com\nqueniuuf.com\nqueniuuk.com\nqueniuum.com\nqueniuuq.com\nqueniuus.com\nqueniuuy.com\nqueniuvb.com\nqueniuvc.com\nqueniuvg.com\nqueniuvi.com\nqueniuvk.com\nqueniuvq.com\nqueniuvu.com\nqueniuvx.com\nqueniuwb.com\nqueniuwf.com\nqueniuwh.com\nqueniuwk.com\nqueniuwq.com\nqueniuwx.com\nqueniuwz.com\nqueniuxd.com\nqueniuxe.com\nqueniuxk.com\nqueniuxr.com\nqueniuxx.com\nqueniuxy.com\nqueniuxz.com\nqueniuyb.com\nqueniuyf.com\nqueniuyg.com\nqueniuyk.com\nqueniuys.com\nqueniuyu.com\nqueniuyz.com\nqueniuza.com\nqueniuzd.com\nqueniuzf.com\nqueniuzh.com\nqueniuzl.com\nqueniuzp.com\nqueniuzu.com\nqueniuzv.com\nqueniuzy.com\nqueniuzz.com\nqueryrecord.com\nquesela.com\nqueshu.com\nquestyleaudio.com\nquestyleshop.com\nquexiaoxian.com\nqueyang.com\nqufair.com\nqufaya.com\nqufeisoft.com\nqufeizhou.com\nqufenqi.com\nqufenqian.vip\nqufu123.com\nqufumarathon.com\nqufushi.com\nqufutuan.com\nqugame.com\nquguonet.com\nquhaidiao.com\nquheqihuo.com\nquhua.com\nquhuaxue.com\nquhuhao.com\nquhuichang.net\nquhuo.net\nquick-global.com\nquick-touch.com\nquickapi.net\nquickbass.com\nquickcan.com\nquickcep.com\nquickddns.com\nquickdetection.com\nquickingdata.com\nquickjoy.com\nquicklaser.com\nquicklyopen.com\nquickpark.cc\nquicksdk.com\nquicksdk.net\nquickswan.com\nquicktvui.com\nquickwis.com\nquiksx.cfd\nquilimen.com\nquimg.com\nquji.com\nqujiangyizhong.com\nqujie365.com\nqujingm.com\nqujishu.com\nqujunde.com\nquk.cc\nqukaa.com\nqukan.cc\nqukanok.com\nqukanshu.com\nqukantoutiao.net\nqukanvideo.com\nquklive.com\nqukuai.com\nqukuaila.com\nqulaoshi.com\nqule8.com\nquledu.net\nqulianaiba.com\nqulishi.com\nquluying.com\nqulv.com\nqumaihuishou.com\nqumaishu.com\nqumaiyao.com\nqumaw.com\nqumi.com\nqumifeng.com\nquming.com\nqumingdashi.com\nquminglemei.com\nqumitech.com\nqun-net.com\nqun.hk\nqun100.com\nqun7.com\nquna.com\nqunaer.com\nqunagai.com\nqunale888.com\nqunaly.com\nqunar.com\nqunar.ink\nqunarcdn.com\nqunarzz.com\nqunba.com\nqunchi.com\nquncrm.com\nqunfengjixie.com\nqunfenxiang.net\nqunhai.net\nqunhaohotel.com\nqunhaolawfirm.com\nqunhei.com\nqunhequnhe.com\nqunjielong.com\nqunke.com\nqunkeng.com\nqunliao.info\nqunligroup.com\nqunmi.vip\nqunniao.com\nqunonnet.com\nqunsou.co\nqunteng.net\nquntengnet.com\nquntuishou.com\nqunwin.com\nqunxiang.club\nqunxingcable.com\nqunxingvc.com\nqunyaninfo.com\nqunyingkeji.com\nqunzh.com\nqunzhuquan.com\nqunzou.com\nquoffice.com\nquotationi.com\nqupeiyin.com\nqupingce.com\nquqi.com\nquqike.com\nquqingting.com\nquqiuhun.com\nququabc.com\nququyou.com\nquqxphdm.com\nqusem.com\nqushiw.com\nqushixi.net\nqushoumiao.com\nqushuba.com\nqushuiying.net\nqutaiwan.com\nqutanme.com\nqutaojiao.com\nqutaovip.com\nqutecall.com\nqutechat.com\nqutemessenger.com\nqutetalk.com\nqutevoice.com\nquthing.com\nqutianshanav.com\nqutingting.com\nqutoutiao.net\nqutouwang.com\nqutu.com\nqutuancan.com\nqutuiwa.com\nqutuly.com\nquumii.com\nquvisa.com\nquwan.com\nquwangming.com\nquweiwu.com\nquwenqing.com\nquwentxw.com\nquwj.com\nquwm.com\nquword.com\nquwuxian.com\nquxds.com\nquxianchang.com\nquxiang.work\nquxianzhuan.com\nquxiaxia.com\nquxingdong.com\nquxintiaodong.com\nquxiu.com\nquxuan.com\nquyangyizhong.com\nquyaoya.com\nquyibao.com\nquyinginc.com\nquyixian.com\nquyiyuan.com\nquyou.net\nquyouhui.net\nquyu.net\nquyundong.com\nquzhiwen.com\nquzhuanxiang.com\nquzhubao.com\nquzwx123.org\nquzz88.com\nquzzgames.com\nqvdv.net\nqvip.net\nqvkanwen.com\nqvlz.com\nqvpublish.com\nqvxz.com\nqw5599.com\nqwbk.cc\nqwe1e.com\nqweather.com\nqweather.net\nqweatherapi.com\nqwebapp.com\nqwen.ai\nqwenlm.ai\nqwepgmyz.vip\nqwerdns.com\nqwerhost.com\nqwfync.com\nqwgg.com\nqwgt.com\nqwimm.com\nqwing.com\nqwmtjj360.vip\nqwocs.com\nqwpo2018.com\nqwps.net\nqwq.link\nqwq.moe\nqwq.ren\nqwq.trade\nqwqk.net\nqwqoffice.com\nqwrmt.com\nqwsy.com\nqwuylnl.com\nqwvv.com\nqwwz.com\nqx-era.com\nqx-kj.com\nqx-semi.com\nqx.com\nqx100.com\nqx1000.com\nqx10086.net\nqx100years.com\nqx121.com\nqx162.com\nqx66.cc\nqx818.com\nqxad.com\nqxbnkj.com\nqxbsk.com\nqxckjr.com\nqxcu.com\nqxdaojia.com\nqxdcc.com\nqxen.com\nqxfun.com\nqxgcsc.com\nqxhospital.com\nqxhqxh.com\nqxioqq4283.vip\nqxiu.com\nqxjeff.com\nqxka.com\nqxkp.net\nqxlib.com\nqxllq.com\nqxme.com\nqxmugen.com\nqxnav.com\nqxndt.com\nqxnecn.com\nqxnic.com\nqxnzx.com\nqxozm.com\nqxqing.com\nqxqxa.com\nqxrcw.com\nqxsdq.com\nqxsfjq.com\nqxshucai.com\nqxswk.com\nqxteacher.com\nqxtongcheng.com\nqxtour.com\nqxtxt.com\nqxueji4167.vip\nqxueyou.com\nqxw.cc\nqxw18.com\nqxwoiv.com\nqxwz.com\nqxxsjk.com\nqxy777.com\nqxyjssb.com\nqxzc.net\nqxzsw.com\nqxzxp.com\nqy-marathon.com\nqy-office.com\nqy-polymer.com\nqy-qq.com\nqy-tencentclb.cloud\nqy-tencentclb.com\nqy-tencentclb.net\nqy-tencentclb.work\nqy.com\nqy.net\nqy266.com\nqy57.com\nqy6.com\nqyaninfo.com\nqybc.com\nqybhl.com\nqyc2008.com\nqycn.com\nqycn.net\nqycn.org\nqycname.com\nqycylinder.com\nqyd-rf.com\nqydimg.com\nqydqw.com\nqydsj.com\nqyer.com\nqyerstatic.com\nqyestar.com\nqyfw168.com\nqyg12.com\nqyg30.com\nqyg447.com\nqyg9.com\nqygbet140.vip\nqygbet381.vip\nqygbet427.vip\nqygjyey.com\nqyglzz.com\nqygvip128.com\nqygvip40.com\nqyhgsb.com\nqyhl.vip\nqyhr.org\nqyhxy365.com\nqyiliao.com\nqyins.com\nqyinter.com\nqyjg.com\nqyjidianqi.com\nqyjks.com\nqykh2009.com\nqykjedu.com\nqymdb.com\nqymgc.com\nqyous.com\nqyrb.com\nqyrcbank.com\nqyrcrs.com\nqyrx.cc\nqysbj.com\nqysd.net\nqysgf.com\nqysport.com\nqysrmyy.com\nqyssgame.com\nqysulian.com\nqysuliao.com\nqyszyyy.com\nqyt.com\nqyt1902.com\nqytdesign.com\nqytranslation.com\nqytst.com\nqytxhy.com\nqyunapp.com\nqyuner.com\nqyuns.net\nqywater.net\nqywcom.com\nqywd.com\nqywww.net\nqyx888.com\nqyxa-tencentclb.cloud\nqyxa-tencentclb.com\nqyxa-tencentclb.net\nqyxa-tencentclb.work\nqyxxpd.com\nqyxzfw.com\nqyyt.com\nqyyun.cloud\nqyzba.club\nqyzc.net\nqyzlgame.com\nqyzss.com\nqz-jk.com\nqz100.com\nqz123.com\nqz456.com\nqz5z.com\nqz828.com\nqz96811.com\nqz97.net\nqzair.com\nqzbbs.com\nqzbgzz.com\nqzbhgyl.com\nqzbhzy.com\nqzbwjx.com\nqzccbank.com\nqzchuxing.com\nqzcia.com\nqzcklm.com\nqzclfc.com\nqzcns.com\nqzct.net\nqzda.com\nqzdatasoft.com\nqzdswy.com\nqzdxcj888.com\nqzdyyy.com\nqzesx.net\nqzeyy.com\nqzfwckj.com\nqzg123.com\nqzgc.net\nqzgchj.com\nqzgfyy.com\nqzgjjp.com\nqzgkwy.com\nqzhaite.com\nqzhlkj.net\nqzhmyy.com\nqzhmzx.com\nqzhospital.com\nqzhrkj.com\nqzhsjc.com\nqzhslw.com\nqzhuye.com\nqzhxshipping.com\nqzimg.com\nqzj2.com\nqzjcd.com\nqzjgxx.com\nqzjhscl.com\nqzjhsd.com\nqzjianwo.com\nqzjkw.net\nqzjy029.com\nqzjycc.com\nqzjzyy002.com\nqzkangfu.com\nqzkcw.com\nqzkey.com\nqzkjyy.com\nqzks.com\nqzktzc.com\nqzlanwei.com\nqzld.com\nqzldkj.com\nqzljjq.com\nqzlo.com\nqzlog.com\nqzlwnm.com\nqzmktjt.com\nqzmtgs.com\nqznovel.com\nqznovelpic.com\nqznovelstatic.com\nqznovelvod.com\nqznxt.com\nqzone.cc\nqzone.com\nqzoneapp.com\nqzonei.com\nqzqcfw.com\nqzqcw.com\nqzqiye.com\nqzqn8.com\nqzqstudio.com\nqzqxd.com\nqzqxw.com\nqzrbx.com\nqzrc.com\nqzrcsc.com\nqzrcw.com\nqzread.com\nqzrencai.com\nqzsdkj.com\nqzsfy.com\nqzsgyxx.com\nqzshangwu.com\nqzshly.com\nqzsmxx.com\nqzsqsnhdzx.com\nqzssdy.com\nqzsx168.com\nqzsystem.com\nqzsyy.com\nqzszyy.com\nqzt520.com\nqztc.vip\nqztingche.com\nqztour.com\nqztsecurity.com\nqztszls.com\nqztvxwgj.com\nqzwb.com\nqzwgw.com\nqzww.com\nqzxdianzi.com\nqzxkeji.com\nqzxx.com\nqzyckhzx.com\nqzylyp.com\nqzynhhmm.com\nqzyonyou.com\nqzyuchao.com\nqzyun.net\nqzyz.com\nqzyzt.com\nqzzdtc.com\nqzze.com\nqzzgdl.com\nqzzhedu.com\nqzzhonghan.com\nqzzhwk.com\nqzzjchy.com\nqzzljx.com\nqzzn.com\nqzzpw.net\nqzzres.com\nqzzsbx.com\nqzzyyy.com\nqzzzg.net\nr-china.net\nr-tms.net\nr.bing.com\nr.biz\nr12345.com\nr147emh.com\nr1y.com\nr2009.com\nr220.cc\nr2coding.com\nr2yx.com\nr302.cc\nr51.net\nr5g.cc\nr5k.com\nr5tao.com\nr77777777.com\nr8.com\nr8.net\nr8856.com\nr8857.com\nr8876.com\nr89gr9gr.ink\nr8hr7.net\nr9922.com\nr9t1.com\nra022.com\nra2ol.com\nraas1.com\nrabbit1117.com\nrabbitbbs.com\nrabbitpre.com\nrabbitpre.me\nrabbitserve.com\nrabook.com\nrabschina.com\nrace604.com\nracent.com\nracetigertiming.com\nrachina.org\nracing-china.com\nracktray.com\nracpro.net\nracsd.com\nracymj.com\nradar-ev.com\nradiate-electronics.com\nradicalmail.net\nradida.com\nradio1964.com\nradio366.com\nradiotj.com\nradiowar.org\nradissoncollection-wuxi.com\nradius-america.com\nradleybagssaleuk.org\nraeblog.com\nrafflesmedicalchina.com\nragdgs.com\nragnarokcn.com\nraharyanto.com\nrahisystems-cn.com\nraidc.com\nrail-metro.com\nrail-transit.com\nrailcn.net\nrails365.net\nrailsctc.com\nrailshj.com\nrailwaybill.com\nrailworkschina.com\nraina.tech\nrainbond.com\nrainbowcn.com\nrainbowred.com\nrainbowsoft.org\nrainbutterfly.xyz\nrainclassroom.com\nraindi.net\nraineggplant.com\nraingray.com\nrainhj.com\nrainhz.com\nraink.org\nrainlain.com\nrainng.com\nrainso.com\nrainwe.com\nrainyun.com\nraise-win.com\nraisecom.com\nraisedsun.com\nraisewebdesign.com\nraisingsun.xyz\nraiyi.com\nrajaluck.work\nrajax-inc.com\nrajax.me\nrajyj.com\nrakinda-aidc.com\nrakinda-xm.com\nrakutabichina.com\nrakvps.com\nramadaplaza-ovwh.com\nramboplay.com\nramostear.com\nrampingup.com\nramsdei.com\nramventures.com\nramwaybat.com\nrancat.im\nrandengseo.com\nrandongada.com\nrandongma.com\nrandyandtheresa.com\nranfenghd.com\nrangercd.com\nrangnihaokan.com\nrango.fun\nrangotec.com\nrangti.com\nrangxue.com\nrangzong.com\nranhou.com\nrankingonline.jp\nranknowcn.com\nranliao.biz\nranling.com\nranqibiao.net\nrantu.com\nranwen.net\nranwen.org\nranwena.com\nranxi.net\nranyangrent.com\nranzhi.net\nranzhi.org\nraobee.com\nraoke.net\nraoluns.com\nraonie.com\nraorao.com\nrap-pro.com\nrapidppt.com\nrapoo.com\nrapospectre.com\nrarbt.fun\nrarcbank.com\nrarelit.net\nrarone.com\nrashanghai.org\nrashost.com\nraspigeek.com\nrastargame.com\nrat.dev\nrat3c.com\nrate2003.com\nrationalwh.com\nratogh.com\nratoo.net\nrauto.com\nravenna0943.xyz\nraverstern.site\nrawanfa.com\nrawchen.com\nraxtone.com\nray-joy.com\nray1988.com\nray8.cc\nraycham.com\nraycim.com\nraycloud.com\nraycom-inv.com\nraycuslaser.com\nraydata-asset.com\nraydata-mobile.com\nraydata-open.com\nraydata-web.com\nraydata.cc\nraydata.info\nraydata.pro\nraydataasset.com\nraydatamobile.com\nraydataopen.com\nraydataweb.com\nraydonet.com\nrayenergytech.com\nrayfalling.com\nrayfaydata.com\nraygame3.com\nraygame4.com\nrayiantway.com\nrayjoy.com\nraykite.club\nraykite.com\nraykite.info\nraykite.net\nraykite.vip\nraykite.xyz\nrayli.com\nraylink.live\nraymage.com\nraymx-micro.com\nraynext.info\nrayoptek.com\nrayp.com\nrayps.com\nrayrjx.com\nrayseasc.com\nraysgo.com\nraysilicon.com\nraystek-p.com\nraystesting.com\nraysync.cloud\nraysyun.com\nraythonsoft.com\nraytine.com\nraytoon.net\nrayuu.com\nrayvision-tech.com\nrayvision.com\nraywit.com\nrazerapi.com\nrazersynapse.com\nrazerzone.com\nrazrlele.com\nraztb.com\nrb-parking.com\nrb32.com\nrb400.com\nrbi-china.com\nrbischina.org\nrbkwater.com\nrbladycrusaders.com\nrbotai.com\nrbqq.com\nrbtxw.com\nrbz1672.com\nrbzarts.com\nrbzygs.com\nrc-ev.com\nrc0817.com\nrc1001.com\nrc114.com\nrc120.com\nrc168.com\nrc3cr.com\nrc775.com\nrcaiv.com\nrcbc888.com\nrcbuying.com\nrccaijing.com\nrccchina.com\nrcche.com\nrcdang.com\nrcesssc.com\nrcfans.com\nrcgus.com\nrchsrc.com\nrchudong.com\nrcjypx.com\nrclbbs.com\nrclhome.com\nrclolci.com\nrclrow.com\nrclsemi.com\nrcmarble.com\nrcmxw.com\nrcnep.com\nrcolab.com\nrcpx.cc\nrcswo.com\nrcsxzx.com\nrcunxyn.com\nrcuts.com\nrcwl.net\nrcyd.net\nrcyjw.com\nrcyxdk.com\nrcz.cc\nrczhuyu.com\nrczp.org\nrczx.com\nrd-cn.com\nrd-game.com\nrd351.com\nrdacs.com\nrdadiy.com\nrdamicro.com\nrdbuy.com\nrdcolg.net\nrdcv1.com\nrdcv1.net\nrddesign.cc\nrddoc.com\nrdedu.net\nrdfis.com\nrdfybk.com\nrdfz.com\nrdgcs.com\nrdgcw.com\nrdgz.org\nrdgzxx.net\nrdhyw.com\nrdidc.com\nrdjmgg.com\nrdmicro.com\nrdnsdb.com\nrdplat.com\nrdqczl.com\nrdqh.com\nrdsdk.com\nrdsms.net\nrdwork.com\nrdxmt.com\nrdyjs.com\nrdympjoqbu.work\nrdzjw.com\nrdzs.com\nrdzx.net\nrdzy.net\nre25.vip\nreabam.com\nreach-ad.com\nreach-biology.com\nreachace.com\nreachauto.com\nreachsh.com\nreachsurgical.com\nreachtone.com\nreachwin.net\nreact-china.org\nreact.mobi\nread678.com\nreadboy.com\nreadceo.com\nreaddsp.com\nreadend.net\nreaders365.com\nreadfollow.com\nreadfree.net\nreadgps.com\nreadhb.com\nreadhr360.com\nreadhub.me\nreadke.com\nreadlevel.com\nreadlink.com\nreadlishi.com\nreadm.tech\nreadmeok.com\nreadnos.com\nreadnovel.com\nreadpai.com\nreadpaper.com\nreadpaul.com\nreadse.com\nreadten.net\nreadu.net\nready4go.com\nreai120.com\nrealape.com\nrealapp.xin\nrealbiogroup.com\nrealcybertron.com\nrealfoodiescompost.com\nrealforcechina.com\nrealibox.com\nrealks.com\nreallct.com\nrealliniot.com\nrealmax-sh.com\nrealmebbs.com\nrealmemobile.com\nrealmofswords.com\nrealor.net\nrealsee-cdn.com\nrealsee.com\nrealshark.com\nrealtech-inc.com\nrealtek-rtd.com\nrealtimecn.com\nrealtorforce.ca\nrealxen.com\nrealyuan.com\nreanda.com\nreapdaro.com\nreardatchina.com\nreasonclub.com\nrebang.today\nrebatesme.com\nrebdy.com\nrebo-group.com\nrechaos.com\nrechulishebei.com\nrecitymedia.com\nreckfeng.com\nrecodeal.com\nrecolighting.com\nreconova.com\nrecordpharm.com\nrecovery-soft.com\nrecovery-transfer.com\nrecoye.com\nrecuvachina.com\nrecycle366.com\nred-apple.net\nred-yellow.net\nredapplechina.com\nredatoms.com\nredbaby.com\nredbascket.com\nredbeeai.com\nredcome.com\nredcross-hx.com\nredcross-sha.org\nreddogchina.com\nredearth.com\nredefine.ltd\nredenmc.com\nredfcv.com\nredflag-linux.com\nredflagseed.com\nredhome.cc\nredhongan.com\nredhtc.com\nredianduanzi.com\nredianmao.com\nredianyuansu.com\nredianyule.com\nredianzixun.com\nrediao.com\nredidc.com\nredisfans.com\nredmagic.com\nredmart.com\nredmou.com\nrednetdns.com\nrednote.com\nrednote.life\nrednotecdn.com\nredocn.com\nredodopower.com\nredoop.com\nredou.com\nredoufu.com\nredox-med.com\nredphon.com\nredq.cc\nredraingame.com\nredrcd.com\nredream.com\nredredsquare.com\nredsea888.com\nredsh.com\nredshu.com\nredstarwine.com\nredstonewill.com\nredsun-nsh.com\nredsun-rp.com\nredsungd.com\nredsungz.com\nredtriphome.com\nredug8dqjjktoapmdfmqymrvi0iupi.com\nreduxingxuan.com\nredyue.com\nredyue.org\nreed-sinopharm.com\nreedoun.com\nreeidc.com\nreeiss.com\nreeji.com\nreenoo.com\nreenoo.net\nreeoo.com\nrefined-x.com\nrefineidea.com\nrefire.com\nrefond.com\nreformdata.org\nreg007.com\nregal-marathon.com\nregal-raptor.com\nregenchem.com\nregengbaike.com\nregexlab.com\nregexr-cn.com\nreglogo.net\nregltd.com\nregtm.com\nregulatory-ledger-transaction-check.com\nreguo.com\nrehiy.com\nrehn.cc\nreht.com\nrehtt.com\nrehuwang.com\nreibootmac.com\nreignwood.com\nreilybrand.com\nreinness.com\nrejesafe.com\nrejushe.com\nrek8.com\nrekong.com\nrekonquer.com\nrekoo.com\nrekoo.net\nrela.me\nrelangbang.com\nrelangdata.com\nrelativelk.com\nrelaychina.org\nrelayx.io\nrelenger.com\nreliabiotech.com\nreliangbiao.com\nreliao.tv\nrellet.com\nreloadbuzz.com\nrelxtech.com\nrelxyanyou.com\nrely87779777.com\nremaijie.net\nremapcity.com\nremax-bj.com\nremenxs.cc\nremixai.com\nremixicon.com\nremo-ai.com\nremodelife.com\nremotcon.mobi\nremoteaps.com\nremotedu.com\nremyhumanhairextension.com\nrenai-edu.com\nrenaihospital.com\nrenaishiyao.com\nrenaissancehotelhuizhou.com\nrenaren.com\nrenbenai.com\nrenbenzhihui.com\nrenbj.com\nrencaijia.com\nrencaijob.com\nrencheng1991.com\nrendajingjiluntan.com\nrenderbus.com\nrenderincloud.com\nrendeyixue.com\nrendiyu.com\nrendna.com\nrendoc.com\nrenead.com\nrenegade-project.org\nrenelgroup.net\nrenergy-me.com\nrenew-cmda.com\nrenew-cn.com\nrenfei.net\nrenfutm.com\nrenguokeji.com\nrenhaocw.com\nrenhe888.com\nrenhebusiness.com\nrenhence.com\nrenhuaicode.com\nrenji.com\nrenjian.com\nrenjiaoshe.com\nrenjiyiyuan.com\nrenkky.com\nrenle.com\nrenleisheji.com\nrenlijia.com\nrenliwo.com\nrenlu.net\nrenmaiku.com\nrenmaitong.com\nrenminkaiguan.com\nrenminyixue.com\nrenny.ren\nrenping.cc\nrenren-inc.com\nrenren-x.com\nrenren.com\nrenren.io\nrenrenbeidiao.com\nrenrenchaxun.com\nrenrenche.com\nrenrencou.com\nrenrendai.com\nrenrendoc.com\nrenrenfinance.com\nrenrening.com\nrenrenlun.com\nrenrenmoney.com\nrenrenpeizhen.com\nrenrenshaike.com\nrenrenshe.com\nrenrenshipu.com\nrenrensousuo.com\nrenrenstudy.com\nrenrensucai.com\nrenrentou.com\nrenrentrack.com\nrenrenyee.com\nrenrk.com\nrenruihr.com\nrenrunkeji.com\nrensa-hanno.com\nrensheng123.com\nrenshouks.com\nrenshouren.com\nrent.work\nrenwen.com\nrenwenyishu.com\nrenwuduo.com\nrenwuji.com\nrenwulian.com\nrenwumatou.com\nrenyiwei.com\nrenzaoshu.com\nrenzhemao.com\nrepai.com\nrepaiapp.com\nrepair5g.com\nrepanso.com\nrepian.com\nreplays.net\nreplica.club\nreplicabest.cc\nreplicachinawatch.vip\nreplicahot.cc\nreplicais.com\nreplicaluxury.cc\nreplicareloj.es\nreplicasale.cc\nreplicashop.cc\nreplicasreloj.com\nreplicasrelojlujo.com\nreplicaswiss.co\nreplicaswissclocks.com\nreplicawatchaaa.cc\nreplicawatchhot.com\nreplicawatchshipping.com\nreplicawatchshop.cc\nreplicawatchsshop.cc\nreplicheorologio.com\nrepliquemontresdeluxe.fr\nrepliquesuisse.co\nrepont.com\nreportify.cc\nreportrc.com\nreportway.org\nreprogenix.com\nreptilesworld.com\nreputatioy.com\nreqable.com\nreqgvheo.com\nrergdfh.com\nreseetech.com\nresemblancey.com\nresemi.com\nreservehemu.com\nresheji.com\nresistor.today\nresnics.com\nresnowshop.com\nresona-wujl.com\nresone-shinab.com\nresowolf.com\nrespeaonsct.com\nrespect-lab.com\nrespondaudio.com\nrespusher.com\nresset.com\nresturbo.com\nresuly.me\nretailo2o.com\nretalltech.com\nretiehe.com\nretopon.com\nretouchpics.com\nreturn.net\nreturnc.com\nreveetech.com\nrevefrance.com\nrevenuads.com\nreviosky.com\nrevolut.ltd\nrevolutwebapp.com\nrew65.com\nrewanyouxi.com\nrewnat.xyz\nreworlder.com\nrewuwang.com\nrexcdn.com\nrexdf.org\nrexinyisheng.com\nrexsee.com\nrexueqingchun.com\nreyinapp.com\nreyun.com\nrezhanwang.com\nrf-bed.com\nrf-china.com\nrf-link.com\nrf.com\nrf.hk\nrfaexpo.com\nrfc2cn.com\nrfchina.com\nrfcreader.com\nrfdl88.com\nrfeyao.com\nrffan.info\nrfgjhz.com\nrfhhzx.com\nrfid-e.com\nrfidcardcube.com\nrfidfans.com\nrfidnfk.com\nrfidtech.cc\nrfilter.com\nrfjd.com\nrfjq.com\nrfk.com\nrfmwave.com\nrfthunder.com\nrfylyp.com\nrg-marathon.com\nrg-pharma.com\nrg950.com\nrgaxobcs.com\nrgble.com\nrgdse.shop\nrgkjyp.com\nrgoo.com\nrgrcb.com\nrgsgnj.com\nrgslb.com\nrgtjf.com\nrgxw.com\nrgyh6t.com\nrgyun.com\nrgzbgroup.hk\nrh31.com\nrh98.com\nrhce.cc\nrhcncpa.com\nrhcqmu.com\nrhctwy.com\nrhcyl.com\nrheaeco.com\nrheemchina.com\nrhexe.com\nrhhz.net\nrhine-inc.com\nrhinosgamestwhk.com\nrhinoxky.com\nrhjoyhotel.org\nrhkj.com\nrhky.com\nrhnewmaterials.com\nrhoadshomebuyers.com\nrhonghai.com\nrhphos.com\nrhsj520.com\nrhspring.com\nrhtimes.com\nrhtzjt.com\nrhusen03.com\nrhwatchcn.com\nrhwatches.com\nrhyme.cc\nrhypw.com\nri-china.com\nriande.com\nrianico.tech\nriaway.com\nribaoapi.com\nribaocdn.com\nribencun.com\nribenguwan.com\nribio.com\nribolia.com\nricebook.com\nricequant.com\nriceyun.com\nrich-chang.com\nrich-fc.com\nrich-futures.com\nrich-healthcare.com\nrichardfw.com\nricheninfo.com\nrichhurry.com\nrichiecn.com\nrichinfer.net\nrichkays.com\nrichlandsfarm.com\nrichlifeads.ru\nrichong.com\nrichseafood.com\nrichsuntrade.com\nrichtech123.com\nrichtechcn.com\nrichtj.com\nricklj.com\nrickyfabrics.com\nrickysu.com\nrictos.com\nridgepole.com\nrido-ja.com\nriecent.com\nrifagroup.com\nrifapm.com\nrifubao.com\nrigen-bio.com\nrigerna.com\nrigger-micro.com\nrightknights.com\nrightpaddle.com\nrigol.com\nrigouwang.com\nrigums.xyz\nriitao.com\nriji001.com\nriji100zi.com\nrijigu.com\nrijiwang.com\nrikua.com\nrili11.com\nrili19.com\nrilijingling.com\nrilingpec.com\nriliri.com\nrilvtong.com\nrim20.com\nrimaiwang.com\nrin9.com\nringdoll.com\nringerswesternauoff.com\nringofelysium.com\nringpu.com\nrining.com\nrinlink.com\nrinvay.cc\nrioalc.com\nriogene.com\nriolu.lol\nriowine.com\nripic.xyz\nrippletek.com\nriqicha.com\nrisc-v1.com\nriscv-dev.tech\nriscv-mcu.com\nriscv-summit.com\nrisde.com\nrise99.com\nrisecenter.com\nrisechina.org\nriselinkedu.com\nrisen-pharma.com\nrisencn.com\nrisenenergy.com\nrisesoft.net\nriseyears.com\nrisfond.com\nrishiqing.com\nrishuncn.com\nrising-eo.com\nrisingauto.com\nrisinggas.com\nriskbird.com\nriskivy.com\nrisongtc.com\nrisuiwd.com\nrisun.com\nriswing.com\nritaichina.com\nritao.hk\nritaojiang.com\nritaomeng.com\nritarpower.com\nrivalsa.net\nriveralydia.shop\nrivergame.net\nriverinepm.com\nriverlimittech.net\nrivocean.com\nriwise.com\nrix-dl.com\nriya.cc\nriyingkj.com\nriyuandianzi.com\nriyuexing.org\nriyuezhuan.com\nriyugo.com\nriyutool.com\nrizbbs.com\nrizhao.net\nrizhaociming.com\nrizhaogongshui.com\nrizhaokjg.com\nrizhaosteel.com\nrizhaoxl.com\nrizhili.com\nrizhiyi.com\nrizhuti.com\nrj.link\nrj.net\nrj668.com\nrj889.net\nrjaaa.com\nrjcopy.com\nrjdownd.com\nrjetech.com\nrjeye.com\nrjfc110.com\nrjgcz.com\nrjghome.com\nrjh0.com\nrjhcsoft.com\nrjitxy.com\nrjlqq.com\nrjoy.com\nrjpharm.com\nrjpharma.com\nrjreducer.com\nrjs.com\nrjsjmbwx.com\nrjsos.com\nrjtx.net\nrjty.com\nrjxzjx.com\nrjzxw.com\nrk-light.com\nrk120.com\nrkanr.com\nrkaq110.com\nrkcfmfm97.com\nrkckth.com\nrkdatabase.com\nrkddzda.com\nrkeji.com\nrkgaming.com\nrkkgyy.com\nrklive888.com\nrksec.com\nrkvir.com\nrkzxhyy.com\nrl-consult.com\nrl1vypwyd2.com\nrlair.net\nrljydt.com\nrlkj.com\nrlkj.net\nrlmeijia.com\nrlnk.net\nrlreader.com\nrlsofa.net\nrltyll.com\nrlw27.com\nrlydw.com\nrlyl.net\nrlzdh.com\nrlzyxa.com\nrm.run\nrmall-solution.com\nrmb.sh\nrmbbk.com\nrmbgame.net\nrmbgd.com\nrmburl.com\nrmcteam.org\nrmcvqq.sbs\nrmejk.com\nrmgvx.com\nrmhospital.com\nrmjiaju.com\nrmjtxw.com\nrmny.tech\nrmrbwc.com\nrmrun.com\nrmsznet.com\nrmttjkw.com\nrmtyun.com\nrmwxgame.com\nrmxiongan.com\nrmysjzx.com\nrmzs.net\nrmzszp.com\nrmzt.com\nrmzxb.com\nrn-core.com\nrn-hswh.com\nrnfengwo.com\nrngdyy.com\nrngmoe.com\nrngtest.com\nrnhospital.com\nrnhy.net\nrnmachine.com\nrnote.com\nro50.com\nroad-group.com\nroadhb.com\nroadjava.com\nroadlady.com\nroadoor.com\nroadqu.com\nroadsignads.com\nroadtoempress.com\nroadwaygroup.com\nroai.shop\nroaing.com\nrobam.com\nrobbyant.com\nrobei.com\nroboeyeai.com\nrobomaster.com\nroboneo.com\nroboo.com\nrobook.com\nrobopeak.net\nroborock.com\nrobosense.ai\nrobot-ai.org\nrobot-china.com\nrobotech-log.com\nrobotime.com\nrobotiot.org\nrobotphoenix.com\nrobotplaces.com\nroboxx.ltd\nroc-cnc.com\nroca026.com\nrocaircraft.com\nrocar.net\nrochat.tech\nrock-chips.com\nrockbrain.net\nrockbundartmuseum.org\nrockdata.net\nrockemb.com\nrockerfm.com\nrockflow.tech\nrockjitui.com\nrocklogistic.com\nrockontrol.com\nrockorca.com\nrockrobo.com\nrockru.com\nrockx.pub\nrocky.hk\nrockyaero.com\nrockyenglish.com\nrockyglass.com\nroclee.com\nrocoswatch.com\nrocxgroups.com\nroffar.com\nroguelike.com\nroguelitegames.com\nrohm-chip.com\nroidmi.com\nroii.cc\nroiland.com\nrojewel.com\nrokeyyan.com\nrokid.com\nrokidcdn.com\nrokub.com\nroland-china.com\nrolipscn.com\nrollupjs.com\nrom100.com\nrom333.com\nromantic-ltd.com\nromantic214.com\nromens.cloud\nromhui.com\nromielf.com\nromjd.com\nromleyuan.com\nromney-lighting.com\nromo.tech\nromonupark.com\nromzhijia.net\nromzj.com\nronbaymat.com\nroncoo.com\nrondygroup.com\nrong-data.com\nrong-edge.com\nrong-rtc.com\nrong-sheng.com\nrong100.com\nrong360.com\nronganjx.com\nronganquan.com\nrongba.com\nrongbiz.com\nrongbiz.net\nrongbst.com\nrongcfg.com\nrongchain.com\nrongchaodichan.com\nrongcheer.com\nrongchenjx.com\nrongdasoft.com\nrongdatamall.com\nrongded.com\nrongdeji.com\nrongechain.com\nronggangcity.com\nronggongyeya.com\nrongguang-sh.com\nronghai.com\nronghedai.com\nronghotels.com\nronghuajixie.com\nronghub.com\nronghuiad.com\nronghuisign.com\nrongji.com\nrongjiagroup.com\nrongkang.com\nrongkao.com\nrongkeyiyuan.com\nrongledz.com\nrongmaowl.com\nrongmei.net\nrongnav.com\nrongnews.com\nrongqu.net\nrongroad.com\nrongsheng.biz\nrongshiedu.com\nrongshu.com\nrongshuweb.com\nrongshuxia.com\nrongstone.com\nrongtai-arch.com\nrongtai-china.com\nrongtongworld.com\nrongwenest.com\nrongwengroup.com\nrongxingroup.com\nrongxuancast.com\nrongyanshe.com\nrongyao666.com\nrongyaozhiguang.com\nrongyi.com\nrongyilian.net\nrongyimao.com\nrongyitechnology.com\nrongyizhaofang.com\nrongyuechem.com\nrongzhitong.com\nrongzhongleasing.com\nrongzhongloan.com\nrongzhougucheng.com\nrongzi.com\nronpharm.com\nrontgens.com\nroobo.com\nrooderscooters.com\nrooee.com\nroof325.com\nroogames.com\nrookmemorizevoluntary.com\nroongeimahwo.com\nroosur.com\nroot-servers.world\nroot1111.com\nrootcloud.com\nrootguide.org\nrootintech.com\nroouoo.com\nropefitting.com\nropinsite.com\nror-game.com\nrorotoo.com\nros-lab.com\nros6.com\nrosabellass.store\nrosaryshelties.com\nrosbox.net\nrosdn.com\nrose.ren\nrosecmsc.com\nrosedata.com\nrosefinchfund.com\nrosepie.com\nrosesandgold.fun\nrosewin.com\nrosin-china.com\nrosirs-edu.com\nrosmontis.com\nrosnas.com\nrosoo.net\nrossoarts.com\nrossoarts.net\nrossopharm.com\nrossroma.com\nroswiki.com\nroszj.com\nrotai.com\nrotom-x.com\nrotora-china.com\nrotorgroup.com\nrouding.com\nrouexdmv.com\nroujiaosuo.com\nroukabz.com\nroule.org\nroundexpo.com\nroundyule.com\nrouruan.com\nroushidongwu.com\nrousin.com\nroute78asia.com\nrouter.tw\nrouterclub.com\nrouteryun.com\nroutewize.com\nroutuan.com\nrouxiutang.com\nrouzao.com\nrouzhitang.com\nrovbox.com\nrowa.com\nrowcan.com\nrowlib.com\nroxinq.com\nroxmotor.com\nroyalsh.net\nroyalym.com\nroyole.com\nroyotech.com\nroyqh.net\nroywang.com\nrp-field.com\nrp-pet.com\nrpa-cn.com\nrpaii.com\nrpfieldcdn.com\nrpg99.com\nrpgmoba.com\nrpo5156.com\nrprnolz.com\nrpy.net\nrq.run\nrqb99.com\nrqgtzit.com\nrqjtp.com\nrqkr.com\nrqrcw.com\nrqrlxx.com\nrqyy.com\nrqyz.com\nrr-sc.com\nrr365.com\nrrajz.com\nrrb365.com\nrrbay.com\nrrbjt.com\nrrbus.com\nrrchem.com\nrrcimg.com\nrrdtz.com\nrrfed.com\nrrfmn.com\nrrimg.com\nrrioo.com\nrrjc.com\nrrkf.com\nrrky.com\nrrl360.com\nrrlicai.com\nrrmj.tv\nrrppt.com\nrrrdai.com\nrrrrdaimao.com\nrrrxz.com\nrrs.com\nrrsurg.com\nrrswl.com\nrrting.net\nrrtv.vip\nrrwtp.com\nrrxf.online\nrrxh5.cc\nrrxiu.cc\nrrxiu.me\nrrxiu.net\nrrxiuh5.cc\nrrzu.com\nrrzuji.com\nrrzwl.com\nrrzxw.net\nrs-xrys.com\nrs485.net\nrsachina.org\nrscazvdbfpbyzqdvpy1m.com\nrscazvdbfpbyzqdvpylm.com\nrscygroup.com\nrsdcw.com\nrsdgd.com\nrsdsgy.com\nrsdxjd.com\nrsdyy.com\nrsdznjj.com\nrsfang.net\nrshao.com\nrshaoapp.com\nrshdsz.com\nrshf88.com\nrshjgc.com\nrsjq.org\nrsjytx.com\nrskjx.com\nrsl.cc\nrslg-china.com\nrsm.download.prss.microsoft.com\nrsnmxd.com\nrsnschina.com\nrsplcdcs.com\nrspwj.com\nrsq111.com\nrsrlzysc.com\nrss.ink\nrsscc.com\nrssdtec.com\nrssso.com\nrsttdsaaas.icu\nrsttest.com\nrsty77.com\nrsuedu.com\nrsun.com\nrsw163.com\nrswaf.com\nrswl.cc\nrsxc01.com\nrsxmgl.com\nrsybattery.com\nrsyzs.com\nrszfg.com\nrszkw.com\nrt-blend.com\nrt-ics.com\nrt-thread.com\nrt-thread.io\nrt-thread.org\nrtacdn-os.com\nrtahengtai.com\nrtalink.com\nrtb5.com\nrtbasia.com\nrtbbox.com\nrtbmax.com\nrtbpb.com\nrtbtmc.com\nrtbwave.com\nrtc-web.com\nrtc-web.io\nrtcdeveloper.com\nrtddisplay.com\nrtdsoft.com\nrtf1688.com\nrtfcode.com\nrtfcpa.com\nrtftq.org\nrtfund.com\nrtfzfl.com\nrthpc.com\nrti-investor.com\nrtjxssj.com\nrtmap.com\nrtmobi.cc\nrtprc.org\nrtrrx.com\nrtsaas.com\nrtsac.org\nrtsc-gift.com\nrtxapp.com\nrtxonline.com\nrtxplugins.com\nrtxuc.com\nrtyxpt.com\nrtyy.com\nru5sq.com\nrua93.online\nruan.cloud\nruan8.com\nruanchaomin.com\nruanduo.com\nruandy.com\nruanfujia.com\nruanjian60.com\nruanjiandown.com\nruanjianwuxian.com\nruanjianya.net\nruanjiesh.com\nruankao.com\nruankaodaren.com\nruankaokao.com\nruanko.com\nruanmei.com\nruansky.com\nruansky.net\nruantiku.com\nruanwen.la\nruanwen.tv\nruanwengfa.com\nruanwenhui.com\nruanwenkezhan.com\nruanwenlala.com\nruanwenpu.com\nruanwenshijie.com\nruanx.net\nruanyuan.net\nruazi.com\nrubaoo.com\nrubbervalley.com\nrubinn.com\nruby-china.com\nruby-china.org\nrubyconfchina.org\nrubyer.me\nrubyfoods.com\nrucedu.net\nruchee.com\nruchu.club\nruczzy.com\nrue123.com\nrueiran.com\nruesu.com\nrufei.ren\nrufengda.com\nruffhousetraining.com\nrufida.com\nrugao35.com\nrugaobbs.com\nruguoapp.com\nruguojiaoyu.com\nruhaivip.com\nruhnn.com\nrui.plus\nruiaiad.com\nruian.com\nruianfang.com\nruianrz.com\nruibai.com\nruibaigroup.com\nruibangwl.com\nruiccm.com\nruichengmedia.com\nruichun120.com\nruicitijian.com\nruida.org\nruidaedu.com\nruidaen.com\nruidan.com\nruidang.com\nruidaxx.com\nruidengkeji.com\nruideppt.com\nruideppt.net\nruidongcloud.com\nruidroid.xyz\nruidsp.com\nruiduobao.com\nruienkj.com\nruifang-tech.com\nruifengchemical.com\nruifengdisplay.com\nruifengjk.com\nruifuwatch.com\nruige.com\nruigedf.com\nruigezx.com\nruigushop.com\nruihaimeifeng.com\nruihaozhanlan.com\nruihengyiliao.com\nruiheyuanny.com\nruihongip.com\nruihuajw.com\nruihuaxinxi.com\nruihuo.com\nruiii.com\nruiinsurance.com\nruijie.com\nruijiehuanbao.com\nruijienetworks.com\nruijiery.com\nruijieyun.com\nruijinginfo.com\nruijinintl.com\nruijinyy.com\nruikangjinshu.com\nruilibi.com\nruilimr.com\nruilinblw.com\nruiniucn.com\nruiniweier.com\nruipai.com\nruipengkeji.com\nruipengpet.com\nruipupharma.com\nruiscz.com\nruisheng.cc\nruishengseal.com\nruisilc.com\nruisizt.com\nruisong.tv\nruisu.cc\nruit56.com\nruitairt.com\nruite-tec.com\nruitengmaoyi.com\nruitian.com\nruitiancapital.com\nruitianjc.com\nruiuav.com\nruivihome.com\nruiwant.com\nruiwen.com\nruiwenruanjian.com\nruixhz.com\nruixiangbest.com\nruixiangdy.com\nruixin-eht.com\nruixing.cc\nruixueys.com\nruixuncw.com\nruixunidc.com\nruixunidc.net\nruiyang-ra.com\nruiying3d.com\nruiyingkeji.com\nruiyitech.com\nruiyuanchina.com\nruiyuanobserve.com\nruiyun.com\nruiyunit.com\nruize66.com\nruizhi-group.com\nruizhipak.com\nruizhiqi.com\nruizib.com\nruizong-gz.com\nrujiazg.com\nrujiu.net\nrukechina.com\nruketang.com\nrukodilla.com\nrulandchem.com\nrulei.vip\nrulejianzhan.com\nrulianshi.la\nrumeibox.com\nrumodesign.com\nrumosky.com\nrumt-sg.com\nrumt-zh.com\nrunbaijia.com\nrunboyun.com\nrunca.net\nruncmd.com\nruncobo.com\nruncome.com\nrundamedical.com\nrundapv.com\nrunde666.net\nrundefit.com\nrundejy.com\nrundeschool.com\nrunergy.com\nrunff.com\nrunforint.com\nrunfox.com\nrunfujin.com\nrunhe.org\nrunhengfdc.com\nrunhuayou.biz\nrunjf.com\nrunjian.com\nrunjiapp.com\nrunkodo.com\nrunkunoptics.com\nrunlaijituan.com\nrunmang.com\nrunnar.com\nrunner-corp.com\nrunnerbar.com\nrunning8.com\nrunningcheese.com\nrunninginchina.org\nrunningman-fan.com\nrunnoob.com\nrunnuokeji.com\nrunoob.com\nrunpho.com\nrunqi-nj.com\nrunqijx.com\nrunsheng.com\nrunshenggk.com\nrunsky.com\nrunsunedu.net\nruntimebj.com\nruntimeedu.com\nruntimewh.com\nruntronic.com\nruntuchem.com\nrunwanxin.com\nrunwise.co\nrunwith.cc\nrunxun.com\nrunzechuanmei.com\nrunzefluidsystem.com\nrunzeyuan.com\nrunzi.cc\nruochu.com\nruodian360.com\nruofeisinian.com\nruohang.com\nruohuo.net\nruokuai.com\nruonei.com\nruons.com\nruoren.com\nruoshui.com\nruosoft.com\nruoxia.com\nruoyer.com\nruoyi.vip\nruozedata.com\nruozhu.shop\nruqimobility.com\nruralwomengd.org\nruseer.com\nrusforest-sh.com\nrushan.com\nrushb.net\nrushi.net\nrushihu.com\nrushivr.com\nrushiwowen.org\nrushmail.com\nrushui.net\nrussellluo.com\nrustc.cloud\nrustdesk.work\nrustfisher.com\nrustfs.com\nrustvnt.com\nrutbr.com\nruthout.com\nruthus.com\nrutron.net\nruu6373.com\nruubypay.com\nruvar.com\nruvisas.com\nruwen5.org\nruxiaoyi.com\nruyig.com\nruyigou.com\nruyile.com\nruyiqiming.com\nruyishi.com\nruyo.cc\nruyo.net\nruyu.com\nruyuecx.com\nruyuexs.com\nruzong.com\nruzw.com\nrv28.com\nrv2go.com\nrvacvzhru.com\nrvcore.com\nrvedu.com\nrvfdp.com\nrvgyckhp.com\nrvkol.com\nrvmcu.com\nrwb66.com\nrwd.hk\nrwdls.com\nrwjiankang.com\nrwjtgc.com\nrwkv.com\nrwosf.space\nrwsignal.com\nrwtext.com\nrwxqfbj.com\nrwys.com\nrx-copper.com\nrx-semi.com\nrxbj.com\nrxcrs.com\nrxftw.com\nrxgl.net\nrxhospital.com\nrxhui.com\nrxhysm.com\nrxian.com\nrxjhbaby.com\nrxjt.co\nrxkjcn.com\nrxljzy.com\nrxndt.com\nrxshc.com\nrxwsls.net\nrxxdny.com\nrxyjqz.com\nrxys.com\nrxyushangfw.com\nry0663.com\nry0751.com\nryanbencapital.com\nryanchem.com\nryansu.tech\nrybbaby.com\nrybridge.com\nrybyurom.com\nrycc.net\nryd-group.com\nrydbatt.com\nrydermedical.com\nrydth5.com\nryeex.com\nrygits.com\nryjer.com\nryjiaoyu.com\nryjoin.com\nrylfj.com\nrylinkworld.com\nrymcu.com\nrymdh.com\nrymooc.com\nryone.net\nrypeixun.com\nrypenwu.com\nrysy9191.com\nrytad.com\nrytx.com\nrytyaofang.com\nryweike.com\nryx.store\nryxiut.com\nryxiut.net\nryxkf.com\nryyqh.com\nrz-cm.com\nrz.com\nrz.sb\nrz0375.com\nrz1158.com\nrz520.com\nrzaide.com\nrzbxgc.com\nrzcdc.com\nrzcdz2.com\nrzfanyi.com\nrzfdc.com\nrzfyu.com\nrzglgc.com\nrzhr.com\nrzhushou.com\nrzhybh.com\nrzkj999.com\nrzline.com\nrzltech.com\nrzmeijia.com\nrzok.net\nrzport.com\nrzrc114.com\nrzsf.com\nrzspx.com\nrzszp.com\nrzv5.com\nrzv7.com\nrzx.me\nrzzyfw.com\ns-02.com\ns-captcha-r1.com\ns-famed.com\ns-jl.com\ns-ns.com\ns-pia.org\ns-q-s.net\ns-reader.com\ns-ss.cc\ns-tech.com\ns-ts.net\ns-xsenyuan.com\ns-yue.com\ns-zone.com\ns.xyz\ns0599.com\ns0nnet.com\ns0p6s02x28.com\ns10000.com\ns135.com\ns163.com\ns1979.com\ns1blsecgerto.com\ns1blseclvira.com\ns1craft.com\ns1gh.com\ns1mple.cc\ns1mplecode.com\ns2ceda.com\ns2cinc.com\ns2g2b2c.com\ns361.com\ns369.com\ns3s9.com\ns4g5.com\ns4y6lhotaw.com\ns4yd.com\ns575.com\ns5ex.com\ns5s5.me\ns6uu.com\ns72c.com\ns74xr605gt.monster\ns8.pw\ns8dj.com\ns8x1.com\ns936.com\ns9377.com\ns98s2.com\ns9hospital.com\ns9yun.com\nsa-ec.com\nsa-log.com\nsa-tencentclb.cloud\nsa-tencentclb.com\nsa-tencentclb.net\nsa-tencentclb.work\nsa-token.cc\nsa20.com\nsa516gr70.com\nsa96.com\nsaaas.com\nsaagasports.com\nsaasddos.com\nsaasops.tech\nsaasruanjian.com\nsaasta.net\nsaaswaf.com\nsaayaa.com\nsaberqq.com\nsabxg.com\nsac-china.com\nsacdr.net\nsachenpharm.com\nsact-digital.com\nsadidc.com\nsae-china.org\nsaebbs.com\nsaec.cc\nsaegedu.com\nsaen.com\nsaf158.com\nsafbon.com\nsafdsafea.com\nsafeb2b.com\nsafecenter.com\nsafedocumentview.com\nsafeglp.com\nsafehoo.com\nsafejmp.com\nsafejmp.net\nsafeluck.com\nsafemini.club\nsafeneeds.com\nsafenext.com\nsafetyimg.com\nsafetystatic.com\nsafetyvod.com\nsafround.com\nsagetrc.com\nsagewc-exp.com\nsagigame.net\nsagsaas.com\nsagw.com\nsahcqmu.com\nsaheo.com\nsahvyw8.sbs\nsaibeiip.com\nsaibeinews.com\nsaibo.com\nsaiboauto.com\nsaiboyy.com\nsaic-audi.mobi\nsaic-finance.com\nsaic-gm.com\nsaic-group.com\nsaicdh.com\nsaicdt.com\nsaicfinance.com\nsaicgmac.com\nsaicgmf.com\nsaicgroup.com\nsaichenglogistics.com\nsaicjg.com\nsaicmaxus.com\nsaicmg.com\nsaicmobility.com\nsaicmotor.com\nsaicyun.com\nsaiczd.com\nsaiday.com\nsaidouwang.com\nsaiduo888.com\nsaige.com\nsaihu.com\nsaihuahong.com\nsaihuitong.com\nsaike.com\nsaikerept.com\nsaikr.com\nsail-lab.net\nsail.name\nsail2world.com\nsailaweiwangluo.com\nsailfansclub.com\nsaili.science\nsailingyun.com\nsailipaint.com\nsailongmetal.com\nsailrnal.com\nsailungroup.com\nsailunkeji.com\nsailuntire.com\nsailway-china.com\nsaiminprecision.com\nsaimogroup.com\nsaimoliku.com\nsainacoffee.com\nsaintcos.hk\nsainteco.com\nsaintgreenchem.com\nsaintic.com\nsaintyear.com\nsaipujianshen.com\nsaipujiaoyu.com\nsairaicc.com\nsairui020.com\nsaisaiwa.com\nsaitenm.com\nsaiterobot.com\nsaivsi.com\nsaiway.com\nsaiyou999.com\nsaiyouedu.net\nsaiyun.net\nsaiyunyx.com\nsaizhi.com\nsaj110.com\nsajs.com\nsakata.one\nsaki.cc\nsakura.vin\nsakura286.ink\nsakway.com\nsaky.site\nsalabs.org\nsaladvideo.com\nsalamatcharity.org\nsalasolo.com\nsale8.com\nsaleenauto.com\nsaleforin.com\nsalesdish.com\nsalesman-bd.com\nsalg-sichuanair.com\nsaliai.com\nsalogs.com\nsalongweb.com\nsalutecc.asia\nsam-tec.com\nsamanhua.net\nsamanlehua.com\nsamasty.com\nsame-tech.com\nsamebar.com\nsameled.com\nsamhotele.com\nsaming.com\nsamirchen.com\nsamite.cc\nsamitead.com\nsamool.com\nsampux.com\nsamsph.com\nsamsrchina.com\nsamsuncn.net\nsamsunganycar.com\nsamsungcloudcn.com\nsamsungconnectivity.com\nsamsunghealthcn.com\nsamsungroaming.com\nsamsungyx.com\nsamton.net\nsamyang.cc\nsamyuong.com\nsamzhe.com\nsan-health.net\nsan-mu.com\nsan-sheng.net\nsan-tuo.com\nsan-u.com\nsan-yang.com\nsan.net\nsanabuy.com\nsanaemio.com\nsanan-e.com\nsananyiliao.com\nsanau.com\nsanbaiyun.com\nsanbanggs.com\nsanbangwt.com\nsanbao-steel.com\nsanbao0563.com\nsanbum.com\nsancaiheast.com\nsancanal.com\nsanchuangke.com\nsancov.com\nsandaha.com\nsandai.net\nsandbean.com\nsandcomp.com\nsandeepin.com\nsandegroup.com\nsandinggas.com\nsandload.com\nsanduoyun.com\nsanen.online\nsanfangshun.com\nsanfen666.com\nsanfengyun.com\nsanfer.com\nsanfi.com\nsanfinehospital.com\nsanfo.com\nsanfu.com\nsangaopatent.com\nsangbang.com\nsangem.com\nsangerbio.com\nsangfor.com\nsangfor.net\nsangfor.org\nsangforcloud.com\nsangfordns.com\nsangle.com\nsangmifort.com\nsangon.com\nsangongzai.net\nsangsir.com\nsangsongtech.com\nsangumc.com\nsanguocard.com\nsanguoh5.com\nsanguohero.com\nsanguoq.com\nsanguosha.com\nsanguows.com\nsanguozz.com\nsangxingxi.com\nsangxuesheng.com\nsanhao.com\nsanhaoradio.com\nsanhaostreet.com\nsanhe-medical.com\nsanhepile.com\nsanheqin.com\nsanhetimburly.com\nsanheyongjia.com\nsanhome.com\nsanhuagroup.com\nsanhuan.com\nsanhucidiao.cc\nsaniwaveltd.com\nsanjiahospital.com\nsanjiang.com\nsanjiangdai.com\nsanjiangtourism.com\nsanjiasoft.com\nsanjieke.com\nsanjiexc.com\nsanjinjiake.com\nsanjinpufa.com\nsanjiusk.net\nsanjiuxs.com\nsanjun.com\nsankengriji.com\nsanki-e.com\nsanki-suzhou.com\nsankki.com\nsankougift.com\nsankton.com\nsankuai.com\nsankumao.com\nsanlan123.com\nsanlei.net\nsanlengbio.com\nsanlian-group.com\nsanlian-machine.com\nsanlianpump.com\nsanligm.com\nsanliwenhua.com\nsanlovalve.com\nsanmanuela.com\nsanmanuela.net\nsanmao.com\nsanmaoyou.com\nsanmiaocdn.com\nsanmicun.com\nsannewschool.com\nsanniaokeji.com\nsanpowergroup.com\nsanpuzhiyao.com\nsanqianzhihui.com\nsanqin.com\nsanqindaily.com\nsanqinyou.com\nsanqiu.org\nsanquan.com\nsanrangas.com\nsanrenwenku.com\nsanritzgroup.com\nsansancloud.com\nsansg.com\nsanshanwuyuan.org\nsanshiok.com\nsanshua.com\nsansitech.com\nsansky.net\nsantaihu.com\nsantanjob.com\nsantelvxing.com\nsantezjy.com\nsantianfilter.net\nsantiego.ink\nsantiyun.com\nsantongit.com\nsantostang.com\nsanvo.com\nsanway.tech\nsanweihou.com\nsanweimoxing.com\nsanweiyiti.org\nsanweiyunfuwu.com\nsanwen.com\nsanwen.net\nsanwen8.com\nsanwer.com\nsanxao.com\nsanxia-china.com\nsanxia.com\nsanxiamc.com\nsanxiao56.com\nsanxiaomingshi.com\nsanxiapharm.com\nsanxige.com\nsanxin-med.com\nsanxinbook.com\nsanxing.com\nsanxinwin.com\nsanxinzgjx.com\nsanya1.com\nsanyaairport.com\nsanyachloe.com\nsanyajob.com\nsanyamotor.com\nsanyanblockchain.com\nsanyangma.com\nsanyastar.com\nsanyawater.com\nsanyecao.com\nsanyegame.com\nsanyenet.com\nsanyewu.com\nsanyexin.com\nsanyglobal.com\nsanygroup.com\nsanyhi.com\nsanyibao.com\nsanyichemical.com\nsanyipos.com\nsanyou123.com\nsanyouco.com\nsanyoumed.com\nsanyoutj.com\nsanyuanbaobao.com\nsanyuanqian.com\nsanyuantc.com\nsanyuanzn.com\nsanyue.com\nsanyuesha.com\nsanzangwang.com\nsanzao.xyz\nsanzei.com\nsanzer.com\nsanzhimeihua.com\nsanzijing.org\nsanzinfo.com\nsanzkf.com\nsao-ma.com\nsao-tencentclb.cloud\nsao-tencentclb.com\nsao-tencentclb.net\nsao-tencentclb.work\nsao.ren\nsaohua.com\nsaoic.com\nsaolei123.com\nsaolife.com\nsaomadc.com\nsaomadiancan.com\nsaoniuhuo.com\nsaop.cc\nsaoshu.org\nsaoso.com\nsaowen.net\nsap-nj.com\nsap1000.com\nsapphiretech.store\nsaraba1st.com\nsardchina-lmgt.com\nsarft.net\nsarosgame.com\nsasacity.com\nsasecurity.com\nsass.hk\nsasscss.com\nsasseur.com\nsasseur1989.com\nsassi2956.xyz\nsast.fun\nsast.net\nsat0.net\nsatcomiot.com\nsatgssb.com\nsating-tech.com\nsator.tech\nsatpro.com\nsatrip.com\nsaturdaysoft.com\nsaturnbird.com\nsaublenew.com\nsavastan0.biz\nsavilehotelgroup.com\nsavokiss.com\nsavouer.com\nsawenow.com\nsawuatsurgical.com\nsaxydc.com\nsaxyit.com\nsaxysec.com\nsayabear.com\nsayatoo.com\nsayll.com\nsaylover.com\nsayloving.com\nsayodevice.com\nsaywash.com\nsayyas.com\nsazeoq8158.vip\nsb1secapply4.com\nsbaoe.com\nsbc-mcc.com\nsbf56.com\nsbh15.com\nsbhimalayanml.com\nsbird.xyz\nsbjd88.com\nsbjxyq.com\nsbk-h5.com\nsbkh5.com\nsbkk8.com\nsbl-ruseldau.com\nsblseceorf.com\nsblsechuorb3.net\nsblsecorgan.com\nsbmscs.com\nsbnkca.com\nsbnkjl.com\nsbo2.com\nsbooktxt.com\nsbpiping.com\nsbr-info.com\nsbrczx.com\nsbs-mag.com\nsbscn.com\nsbsjk.com\nsbt-sh.com\nsbt56.com\nsbtjt.com\nsbtzy.net\nsbwl.com\nsbwxz.com\nsbxh.org\nsbycjy.com\nsbzj.com\nsc-001.net\nsc-aaa.com\nsc-admc.com\nsc-dl.com\nsc-edu.com\nsc-glas.com\nsc-hstar.com\nsc-jiaoyu.com\nsc-pd.com\nsc-tianyu.com\nsc-troy.com\nsc-wx.com\nsc-xngs.com\nsc.gg\nsc115.com\nsc119.cc\nsc157.com\nsc1588.com\nsc1618.com\nsc168.com\nsc2c.com\nsc2car.com\nsc2p.com\nsc2yun.com\nsc518.com\nsc666.com\nsc788.com\nsc946.com\nsc96655.com\nscaffi.com\nscagz.com\nscansmt.com\nscanv.com\nscarbbs.com\nscarclinic-cn.com\nscardtech.com\nscarlet-box.com\nscasqhwz.com\nscatc.net\nscavc.com\nscbaidu.com\nscbaijia.com\nscbao.com\nscbaopo.org\nscbgaudio.com\nscbh15.com\nscbid.com\nscbnrq.com\nscbotai.com\nscbuilder.com\nscbxmr.com\nscbyx.net\nsccbj.com\nsccchina.net\nscccyts.com\nsccea.net\nsccens.net\nsccia8888.com\nsccin.com\nsccita.org\nsccjjtjy.com\nscclssj.com\nscclzn.com\nsccm.cc\nsccmlj.com\nsccnfb.com\nsccnn.com\nsccnnc.com\nsccq.net\nscctjywy.com\nsccts.com\nscctsw.com\nsccvc.com\nsccwz.com\nsccxbe.com\nsccyxh.com\nscdanzhao.net\nscdbzzw.com\nscdccb.com\nscdcs.net\nscdengbang.com\nscdn.im\nscdn.io\nscdn0077.com\nscdn08xd.com\nscdn0wcp.com\nscdn0wes.com\nscdn0xks.com\nscdn10a7.com\nscdn12zo.com\nscdn1dcz.com\nscdn1e8v.com\nscdn1eul.com\nscdn1kjh.com\nscdn2kw9.com\nscdn2lhh.com\nscdn323r.com\nscdn3t09.com\nscdn40kn.com\nscdn43uu.com\nscdn46r9.com\nscdn4cpe.com\nscdn4esv.com\nscdn4iy4.com\nscdn4usw.com\nscdn549v.com\nscdn67mw.com\nscdn6e40.com\nscdn7c4e.com\nscdn7gsf.com\nscdn7ma2.com\nscdn8ksq.com\nscdn8ppt.com\nscdn98um.com\nscdnacsj.com\nscdnazo0.com\nscdnbi9w.com\nscdnbiar.com\nscdnc77s.com\nscdncloud.com\nscdndn0v.com\nscdndns.com\nscdndns.net\nscdndsa6.com\nscdndtma.com\nscdne3lt.com\nscdne60t.com\nscdneb5k.com\nscdnebrq.com\nscdneufe.com\nscdnf3v6.com\nscdnf80r.com\nscdnfu51.com\nscdng.com\nscdng8js.com\nscdnga.com\nscdngc.com\nscdngs0h.com\nscdnguqg.com\nscdnh957.com\nscdnhagn.com\nscdnhfua.com\nscdnhou6.com\nscdnhwc.com\nscdnifld.com\nscdnioyt.com\nscdnirdl.com\nscdnj3in.com\nscdnj8do.com\nscdnjfj2.com\nscdnjk59.com\nscdnkeuo.com\nscdnl05m.com\nscdnl3bk.com\nscdnl46h.com\nscdnl9cm.com\nscdnmba2.com\nscdnmnrz.com\nscdnmo3m.com\nscdnmogt.com\nscdnmskl.com\nscdnn4t9.com\nscdnndj2.com\nscdnnm9o.com\nscdnnrib.com\nscdnnub6.com\nscdno55z.com\nscdno5zl.com\nscdnoklx.com\nscdnokqh.com\nscdnooyg.com\nscdnpe31.com\nscdnq6rc.com\nscdnqjg9.com\nscdnqkxi.com\nscdnqo8s.com\nscdnqrty.com\nscdnqumc.com\nscdnr7p2.com\nscdnr932.com\nscdnrlm1.com\nscdnrvy1.com\nscdnsmjc.com\nscdnsvg4.com\nscdnt1h7.com\nscdnt9n9.com\nscdntop.com\nscdntucs.com\nscdntxla.com\nscdnucc5.com\nscdnukio.com\nscdnulx9.com\nscdnurea.com\nscdnv7uq.com\nscdnvij7.com\nscdnvip.com\nscdnw4kb.com\nscdnwehb.com\nscdnwljp.com\nscdnwmp0.com\nscdnwpqy.com\nscdnwwp9.com\nscdnxgev.com\nscdny1t3.com\nscdnydiw.com\nscdnygb7.com\nscdnywwp.com\nscdnzrch.com\nscdri.com\nscdyjyzx.com\nscdytv.com\nscdyzx.com\nscdz120.com\nscdzmw.com\nsce-re.com\nscea.co\nsceci.net\nsceeo.com\nsceia.org\nscemrq.com\nscengine.com\nscenictc.com\nscensmart.com\nscetop.com\nscezju.com\nscflcp.com\nscfsino.com\nscfzbs.com\nscg-archi.com\nscgc.net\nscgchc.com\nscgckj.com\nscgglm.com\nscgh114.com\nscghsd.com\nscghseed.com\nscgis.net\nscgj56.net\nscgkw.net\nscgra.com\nscgxhq.com\nscgxlc.com\nscgyjt.com\nscgzyun.com\nsch-szu.com\nschbrain.com\nschbrilliant.com\nschcnc.com\nschdxww.com\nschengle.com\nschielecn.com\nschimalayanuz.com\nschk777.com\nschkxy.com\nschlzn.com\nschneidercampus.com\nscholarmate.com\nscholat.com\nschool51.com\nschool888.com\nschoolpi.net\nschoopia.com\nschstv.com\nscht.cc\nschwarzeni.com\nschwr.com\nschxzx.com\nsci-bioland.com\nsci-fifans.net\nsci-gz.com\nsci-hub.ee\nsci-hub.shop\nsci-inv.com\nsci-it.com\nsci99.com\nscialyze.com\nscianet.org\nsciasc.com\nscichina.com\nscicn.net\nscidict.org\nsciecure.com\nsciedu.org\nsciencecity.net\nsciencehr.net\nsciencep.com\nsciengine.com\nscienjus.com\nscientop.com\nscientrans.com\nscienward.net\nscies.org\nscievent.com\nscifans.com\nscigy.com\nsciimg.com\nsciirc.com\nscijet.com\nscilucy.com\nscimall.cc\nscimall.org\nscimao.com\nscimee.com\nscinormem.com\nscinorwater.com\nscio.icu\nsciping.com\nsciscanpub.com\nscisky.com\nscistor.com\nscisun.com\nscitechoutlet.com\nscitycase.com\nscixh.com\nsciyard.com\nsciyon.com\nscjcce.com\nscjcdl.com\nscjhg.com\nscjhhb.com\nscjhyq.com\nscjjdd.com\nscjjn.com\nscjjrb.com\nscjk.com\nscjmm.com\nscjrm.com\nscjty.com\nscjuchuang.com\nscjygd.com\nscjyx.com\nscjyxw.com\nscjyzb.net\nscjyzbxh.com\nscjz-led.com\nscjzjyjc.com\nscjzy.net\nsckje.com\nsckrskj.com\nsckxjd.com\nscl-cn.com\nsclanyingkj.com\nsclf.org\nsclive.net\nscll.cc\nscloudgda.com\nsclrjc.com\nsclsnk.com\nsclssz.com\nsclsyz.com\nsclvb.com\nsclyxw.com\nsclzfq.com\nscm121.com\nscmccboss.com\nscmchem.com\nscmfair.com\nscmor.com\nscmroad.com\nscmsky.com\nscmttec.com\nscmxtv.com\nscmy120.com\nscmydb.com\nscmylike.com\nscmyns.com\nscncbus.com\nscncgz.net\nscnj.tv\nscnjnews.com\nscnjw.com\nscnleee.com\nscntv.com\nscntzjrqfd.com\nscnufl.com\nscnyw.com\nsco-marathon.com\nscodereview.com\nscoee.com\nscommander.com\nscoowx.com\nscoregg.com\nscpgj.com\nscpgroup.com\nscpidi.com\nscpolicec.com\nscqckypw.com\nscqcp.com\nscqjxh.com\nscqstv.com\nscqy100.com\nscraij.com\nscrape.center\nscratch5.com\nscratchmirror.com\nscratchmirror.net\nscrc168.com\nscrcnet.org\nscrcu.com\nscredcross.com\nscrft.com\nscriptjc.com\nscrmtech.com\nscrqw.com\nscrsw.net\nscrsy.net\nscrumcn.com\nscs-jianyu.com\nscscms.com\nscsddyf.com\nscsdzxh.org\nscsdzzx.com\nscsema.com\nscsfjt.com\nscsgkyy.com\nscshzx.com\nscsia.org\nscsjnxh.org\nscsjsd.com\nscslfd.com\nscsltjt.com\nscsmzy.com\nscsntv.com\nscssdd.com\nscsstjt.com\nscsuhuigy.com\nscswyy.com\nscsxth.com\nscsyaszyyy.com\nscsyytj.com\nscszsw.com\nscszxy.com\nsctbc.net\nsctcd.com\nsctcm120.com\nsctdzl.com\nsctes.com\nsctfia.com\nsctfleasing.com\nsctgo.com\nsctindustries.com\nsctm.cc\nsctobacco.com\nsctodr.com\nsctszh.com\nscttwy.com\nsctv-tf.com\nsctv.com\nsctvcloud.com\nsctvf.com\nsctvgo.com\nsctx.com\nsctyhx.com\nsctyxy.net\nsctzsbhy.com\nscubamew.com\nscudcn.com\nscufida.com\nscujj.com\nscunionpay.com\nscusec.org\nscutech.com\nscutedu.org\nscuvc.com\nscw98.com\nscwdwl.com\nscwhx.com\nscwj.net\nscwlylqx.com\nscwmwl.com\nscwqxh.com\nscwy.net\nscwyzx.com\nscxd56.net\nscxdf.com\nscxinkang.com\nscxjyw.com\nscxsls.com\nscyanzu.com\nscyarui.com\nscybjc.com\nscybxx.com\nscyc.cc\nscych.org\nscyesz.com\nscyf.xyz\nscylzx.net\nscymob.com\nscyongqin.com\nscyqfhw.com\nscyqjs.com\nscysxh.org\nscytyy.net\nscyvu.org\nscyxcm.com\nscyyhyxh.com\nscyyxh.com\nsczg.com\nsczgzb.com\nsczht.com\nsczlsgs.com\nsczshz.net\nsczsie.com\nsczsxx.com\nsczuanshen.com\nsczw.com\nsczxmr.com\nsczycp.com\nsczyh30.com\nsczytx.com\nsd-cancer.com\nsd-cellbank.com\nsd-chengdasteel.com\nsd-chengde.com\nsd-eh.com\nsd-ex.com\nsd-fjzy.com\nsd-gold.com\nsd-gree.com\nsd-guotai.com\nsd-jiuyang.com\nsd-jnyz.com\nsd-kb.com\nsd-keyuan.com\nsd-nand.com\nsd-port.com\nsd-portfh.com\nsd-rtn.com\nsd-sangte.com\nsd-sanju.com\nsd-sma.com\nsd-xd.net\nsd-xingshun.com\nsd-yihao.com\nsd-ysjt.com\nsd001.com\nsd11185.com\nsd173.com\nsd2000.com\nsd2008.cc\nsd235.com\nsd235.net\nsd5g.com\nsdacid.com\nsdailong.com\nsdaofu.com\nsdapo.net\nsdaswq.com\nsdawhuagong.com\nsdaxue.com\nsdazgs.com\nsdbao.com\nsdbaoding.com\nsdbaowei.com\nsdbeidou.com\nsdbeta.com\nsdbetter.com\nsdbgk.com\nsdbjm.com\nsdbkxh.com\nsdbochen.net\nsdbqfw.com\nsdbx.org\nsdbys.com\nsdca119.com\nsdcbcm.com\nsdcbcnc.com\nsdccg.com\nsdcclh.com\nsdcfdq.net\nsdcgc.com\nsdchelv.com\nsdchem.net\nsdcheshi.com\nsdchild.com\nsdchina.com\nsdchuangyi.com\nsdcia.net\nsdcjtz.com\nsdclimber.com\nsdcmc.net\nsdcoke.com\nsdcpd.com\nsdcqjy.com\nsdcqjyjt.com\nsdcxgk.com\nsdcxjl.com\nsdcxslzj.com\nsdcyun.com\nsdcz.com\nsddagongrubber.com\nsddaqi.com\nsddcbz.com\nsddcp.com\nsddcxm.com\nsddep.com\nsddermyy.com\nsddeznsm.com\nsddfnk.com\nsddhpharm.com\nsddory.com\nsddp.net\nsddstore.com\nsddtzx.com\nsdduojing.com\nsddyfxjc.com\nsddyzl.com\nsddyzy.com\nsddzinfo.com\nsddzrljx.com\nsdebank.com\nsdeca.org\nsdeclhnfz.com\nsdecloud.com\nsdecu.com\nsdecx.com\nsdedu.net\nsdedubook.com\nsdeer.com\nsdeerlive.com\nsdenews.com\nsdepci.com\nsdepi.com\nsderp.com\nsdewj.com\nsdey.net\nsdeyei-h.edu\nsdfeid.com\nsdfey.com\nsdffqaz.com\nsdfhyl.com\nsdflc.com\nsdflon.com\nsdfon.com\nsdfscm.com\nsdftc.com\nsdfuer.net\nsdfxcv.com\nsdfxyoule.com\nsdfybj.com\nsdfz.net\nsdfztz.com\nsdg-china.com\nsdgakj.com\nsdgckg.com\nsdgdwljt.com\nsdgdxt.com\nsdgh.net\nsdgho.com\nsdghrq.com\nsdghtz.com\nsdghzy.net\nsdglobaltrade.com\nsdglql.com\nsdgmjiaoyun.com\nsdgren.com\nsdgsdggg.xyz\nsdgsgcjsjt.com\nsdgsjc.com\nsdgslb.com\nsdgslbc.com\nsdgswl.com\nsdgsxcljt.com\nsdgsxxjt.com\nsdgt1985.com\nsdguanfeng.com\nsdguanzhou.com\nsdguguo.com\nsdgw.com\nsdgwlc.com\nsdgwy.org\nsdgxdb.com\nsdgxzn.com\nsdgykg.com\nsdgyslfz.com\nsdgzkg.com\nsdhack.com\nsdhbcl.com\nsdhdssd.com\nsdhead.com\nsdheguogroup.com\nsdhengxingroup.com\nsdhfsh.com\nsdhgu.com\nsdhitg.com\nsdhmdp.com\nsdhmjt.net\nsdhmkj.com\nsdhnt.com\nsdhofa.com\nsdholding.com\nsdhongdaglass.com\nsdhoukang.com\nsdhqcp.com\nsdhqedu.net\nsdhrjt.net\nsdhsg.com\nsdhshbgs.com\nsdhsie.com\nsdhslqgj.com\nsdhsrh.com\nsdhssfjt.com\nsdht666.com\nsdhtkt.com\nsdhtwl.com\nsdhualigongshui.com\nsdhuanneng.com\nsdhxem.com\nsdhxf.com\nsdhxjl.com\nsdhxsj.com\nsdhydl.com\nsdhynytc.com\nsdhzgs.com\nsdi23.com\nsdiandian.com\nsdiccapital.com\nsdicgdny.com\nsdicgxxny.com\nsdicin.com\nsdicpower.com\nsdicqzdefd.com\nsdictktrust.com\nsdictrade.com\nsdicvc.com\nsdigc.com\nsdiitu.com\nsdinfo.net\nsdiread.com\nsditol.com\nsdj-tech.com\nsdj88.com\nsdjcf.com\nsdjcsh.com\nsdjcw.com\nsdjiance.com\nsdjiankan.com\nsdjianmei.com\nsdjingdao.com\nsdjinghan.com\nsdjinhuihb.com\nsdjinke.com\nsdjkdq.com\nsdjky.com\nsdjlxh.com\nsdjnlf.com\nsdjnwx.com\nsdjrg.com\nsdjsen.com\nsdjtbd.com\nsdjtcx.com\nsdjtzyxy.com\nsdjujiang.com\nsdjuliangnet.com\nsdjulong.net\nsdjuming.com\nsdjuxiang.com\nsdjwg.com\nsdjxgj.com\nsdjys.org\nsdjzgt.com\nsdjzhc.com\nsdjzsemi.com\nsdkamaiduo.com\nsdkbalance.com\nsdkclick.com\nsdkdch.com\nsdkeli.com\nsdkjjt.com\nsdkjnn.com\nsdklh.com\nsdklss.work\nsdknext.com\nsdkserver.com\nsdksrv.com\nsdlaien.com\nsdland-sea.com\nsdland-sea.net\nsdlcbyq.com\nsdlfhbkj.com\nsdlgjycm.com\nsdlinqu.com\nsdlivc.com\nsdljdj.com\nsdlkqx.com\nsdllrc.com\nsdlmzb.com\nsdlongli.com\nsdlookchemical.com\nsdlqgf.com\nsdlsgroup.com\nsdlsjszp.com\nsdlsxrmyy.com\nsdludian.com\nsdluqiao.com\nsdlvbang.com\nsdlvjuren.com\nsdlvtai.com\nsdlvxing.com\nsdlxsj.com\nsdly35.com\nsdlyjygs.com\nsdlysz.com\nsdm0377.com\nsdmctech.com\nsdmdcm.com\nsdmecl.com\nsdmic.com\nsdmingquan.com\nsdmingshan.com\nsdmjkc.com\nsdmta.com\nsdmtfy.com\nsdmuhua.com\nsdmuseum.com\nsdmyzsgs.com\nsdndzb.com\nsdnfv.org\nsdnh.net\nsdnjsbc.com\nsdnlab.com\nsdnsbd.com\nsdnxs.com\nsdnydb.com\nsdo-shabake.com\nsdo.com\nsdocapp.com\nsdodk.com\nsdodo.com\nsdointl.com\nsdoke.com\nsdongpo.com\nsdoprofile.com\nsdoyhg.com\nsdpag.com\nsdpea.org\nsdpku.com\nsdplt.com\nsdptem.com\nsdpua.com\nsdpxyq.com\nsdqcgs.com\nsdqcpc.com\nsdqljh.com\nsdqlkr.com\nsdqmy.com\nsdqoi2d.com\nsdqsqx.com\nsdqte.com\nsdqu.com\nsdqyjtzfzcjh.com\nsdqyslt.com\nsdrail.com\nsdrcu.com\nsdricom.com\nsdrixingchem.com\nsdrmyy.com\nsdrongya.com\nsdrszp.com\nsdrtgk.com\nsdruile.com\nsdruiqi.com\nsdrunfujia.com\nsdrunse.com\nsdrxtf.com\nsdsaifute.com\nsdsalt.com\nsdsansen.com\nsdsazgs.com\nsdsazxh.com\nsdsbjp.com\nsdschdlxxhyxh.com\nsdsdbjt.com\nsdsdiy.com\nsdsdjxh.com\nsdsdsoft.com\nsdsdzx.com\nsdsenrong.com\nsdseshealth.com\nsdsfjy.com\nsdsgwy.com\nsdshangya.com\nsdshgk.com\nsdshihua.com\nsdshitu.com\nsdshshb.com\nsdsifang.net\nsdsihuanpharm.com\nsdsinometal.com\nsdsj.com\nsdsjhhyxh.com\nsdsjzyxh.com\nsdsldsyy.com\nsdsmartlogistics.com\nsdsmefina.com\nsdspyyy.com\nsdsrhb.com\nsdssiliao.com\nsdstdc.com\nsdsteelrz.com\nsdstet.com\nsdstg.com\nsdstrong.com\nsdstslyy.com\nsdstudy.vip\nsdswitch.com\nsdswtz.com\nsdsxw.com\nsdsxwz.net\nsdsytgcl.com\nsdsyyxh.com\nsdszbzz.com\nsdtadm.com\nsdtaikai.com\nsdtcck.com\nsdtdata.com\nsdtdfz.com\nsdteleiptv.com\nsdtender.com\nsdteya.com\nsdtianjing.com\nsdtkgl.com\nsdtlpm.com\nsdtlyyjt.com\nsdtryyjt.com\nsdtugongbucj.com\nsdtvjiankang.com\nsdtwxx.com\nsdtxmq.com\nsdtylq.net\nsdtzcn.com\nsdtzsb.net\nsdu8cvc.com\nsduept.com\nsduod.com\nsdushu.com\nsdvps.com\nsdwan.work\nsdwcpm.com\nsdwdhj.com\nsdwdxl.com\nsdweiji.com\nsdweima.com\nsdweiye.com\nsdwen.com\nsdwenlian.com\nsdwenlv.com\nsdwfvc.com\nsdwgyy.com\nsdwinnerbio.com\nsdwkhvac.com\nsdwljqtzjt.com\nsdwlsym.com\nsdwscgs.com\nsdwtd.com\nsdwtqqysj.com\nsdwtqx.com\nsdwtyy.com\nsdx.microsoft.com\nsdxawy.com\nsdxgty.com\nsdxhce.com\nsdxhjtgs.com\nsdxianweisumi.com\nsdxiaoman.com\nsdxietong.com\nsdxinboao.com\nsdxinglu.com\nsdxingya.com\nsdxitong.com\nsdxjnrqjt.com\nsdxjpc.com\nsdxl.com\nsdxli.win\nsdxlkjgf.com\nsdxnetcafe.com\nsdxsgas.com\nsdxszhny.com\nsdxszs.com\nsdxtsz.com\nsdxtxh.com\nsdxvisa.com\nsdxwyy.net\nsdxxjmgg.com\nsdxyxhj.com\nsdxzt.com\nsdyftr.com\nsdyhne.com\nsdyhqp.com\nsdyifeng.com\nsdyinshuachang.com\nsdyizhibi.com\nsdylhg.com\nsdyndcjx.com\nsdysjcc.com\nsdytsh.com\nsdyuanbao.com\nsdyxmall.com\nsdyyebh010.com\nsdyyjsxy.com\nsdyypt.net\nsdyzzyzdh.com\nsdzamy.com\nsdzbcg.com\nsdzckj.com\nsdzdb.com\nsdzdxm.com\nsdzgfj.com\nsdzhidian.com\nsdzhongjiu.com\nsdzhx.com\nsdzhxk.com\nsdzjxx.com\nsdzk.co\nsdzktd.com\nsdznlh.com\nsdznzx.com\nsdzpw.com\nsdzpw.net\nsdzrm.com\nsdzs.com\nsdzssj.com\nsdzsyl.com\nsdztkj.com\nsdztxxkj.com\nsdzx.net\nsdzydfy.com\nsdzzdzkj.com\nse7ej39i9g.best\nsea-group.org\nsea-gullmall.com\nseaarea.com\nseacatcry.com\nseacxy.com\nseaflysoft.com\nseafrom.com\nseagull-digital.com\nseagullwatch.com\nseagullwatches.com\nseahisun.com\nseaide.com\nsealaly.net\nsealand100.com\nsealandtableware.com\nsealeadbattery.com\nsealien.net\nsealimg.com\nsealion360.com\nsealos.run\nsealyun.com\nseamanhome.com\nseamaty.com\nseaning.com\nseanya.com\nseanyxie.com\nseaps.org\nseapsoft.com\nsearch616.com\nsearcheasy.net\nsearchpstatp.com\nsearchstatic.com\nsearchtb.com\nsearchtoutiaolive.com\nseashinepm.com\nseasj.com\nseaskyapp.com\nseasonperiod.com\nseasouthgy.com\nseassoon.com\nseastarasset.com\nseasungame.com\nseasungames.com\nseasunwbl.com\nseatent.com\nseatonjiang.com\nseatopcq.com\nseavalve.com\nseavo.com\nseawardhyacinth.com\nseayao.net\nseayee.com\nseayoo.com\nseayooassets.com\nseazor.com\nseblong.com\nsebug.net\nsec-in.com\nsec-mail.cloud\nsec-motor.com\nsec-wiki.com\nsecaibi.com\nsecbug.cc\nsecbug.org\nseccw.com\nsecdoctor.com\nsecdriver.com\nsecec.com\nsecfree.com\nsecisland.com\nsecjia.com\nseclover.com\nseco-rukutin-co-jp.com\nsecoo.com\nsecooart.com\nsecooimg.com\nsecote.com\nsecpulse.com\nsecretflow.com\nsecretgardenresorts.com\nsecretmine.net\nsecrss.com\nsecrui.com\nsecshow.net\nsecsib-eliaslias.com\nsecsib-kendal.com\nsecsilo.com\nsectigochina.com\nsectigochina.com.cdn.cloudflare.net\nsecu100.net\nsecure-83a.com\nsecure-ch-ase03.online\nsecure-chasle026.ink\nsecure-chasle029.wiki\nsecure-chasle039.wiki\nsecure-chasle049.ink\nsecureqin.net\nsecuritycn.net\nsecurityeb.com\nsecurityinsight.com\nsecutimes.com\nsecwk.com\nsecwx.com\nsecxun.com\nseducix.com\nsee-far.com\nsee-source.com\nsee100n.com\nseebon.com\nseebug.org\nseecmedia.net\nseed-china.com\nseedasdan.org\nseedchina.com\nseeddsp.com\nseedit.cc\nseedit.com\nseedland.cc\nseedlandss.com\nseedpace.com\nseedsufe.com\nseeed.cc\nseegif.com\nseehealth.net\nseehu.net\nseek114.com\nseekbetter.me\nseekchem.com\nseekcy.com\nseekfunbook.com\nseekhill.com\nseekingsoft.com\nseeklane.com\nseekswan.com\nseekwavetech.com\nseelvyou.com\nseemmo.com\nseemse.com\nseentao.com\nseepomotor.com\nseepomotor.net\nseerbigdata.com\nseerking.com\nseermylife.com\nseersecret.com\nseesawcoffee.com\nseesea.site\nseeseed.com\nseetacloud.com\nseetao.com\nseetong.com\nseewellintl.net\nseewin-edu.com\nseewo.com\nseewoedu.com\nseewoll.com\nseexpo.com\nseeya-tech.com\nseeyii.com\nseeyon.com\nseeyonoversea.com\nseeyouhealth.com\nseeyouweb.com\nseeyouyima.com\nsefonsoft.com\nsegacnsh.com\nsegapi.com\nsegbuy.com\nsegmentfault.com\nsegmentfault.net\nsegotep.com\nsegwayrobotics.com\nsehand.com\nsehimalayanqj.com\nseida.tech\nseijoin.com\nseilway.com\nseily.com\nseirobotics.net\nseis-jun.xyz\nseisman.info\nseiyuex.com\nsejai.com\nsejianghu.com\nsekede.net\nsekorm.com\nselboo.com\nselectdataset.com\nselenlictio.com\nselet4.com\nselfiecity.com\nselfservicechina.com\nselfwhostudio.com\nselgrospl.com\nselinuxplus.com\nsellerspace.com\nsellersprite.com\nsellfox.com\nsellingexpress.net\nselypan.com\nsem123.com\nsem17.com\nsemem99.com\nsemeye.com\nsemgz.com\nsemi-casi.com\nsemi.design\nsemiconductorpower.com\nsemiconshop.com\nsemidata.info\nsemiee.com\nsemight.com\nsemigraph.net\nsemiinsights.com\nsemir.com\nsemiway.com\nsemiwebs.com\nsempk.com\nsemptian.com\nsemsay.com\nsemw-sh.com\nsenaocargo.com\nsenbeijia.com\nsencdn.com\nsencha-china.com\nsenco.cc\nsencomu.com\nsend2boox.com\nsenda360.com\nsendbp.com\nsendcloud.net\nsendcloud.org\nsenderline.com\nsenderline.net\nsendestar.com\nsendijt.com\nsendong.com\nsendpioneer.com\nsends.cc\nsendsharedfiles.com\nsenfa.net\nsenge-dq.com\nsenge.com\nsenggama.online\nsenguo.cc\nsenguo.com\nsengxian.com\nsengzai.com\nsenhai.com\nsenhaix.com\nsenhe.com\nsenior.auto\nseniverse.com\nsenkah.com\nsenken-international.com\nsenlianshop.com\nsenlinjimore.com\nsenmiaoliuxue.com\nsenmiaoschool.com\nsenorsen.com\nsenpet.com\nsenphoto.org\nsenpian.com\nsenra.me\nsensate.hk\nsense-hk.com\nsenseagro.com\nsenselock.com\nsenseluxury.com\nsenser.group\nsensertek.com\nsensesw.com\nsensetime.com\nsenseyun.com\nsensivo.com\nsensors-iot.net\nsensorsdata.com\nsensorsdatavip.com\nsenssun.com\nsenszx.com\nsentaihb.com\nsentaijs.com\nsentaiwpc.com\nsentcss.com\nsentdream.net\nsenteauto.com\nsenthink.com\nsentosemi.com\nsentuxueyuan.com\nsentyeasy.com\nsenwas.com\nsenyada.com\nsenyao1718.com\nsenyou.com\nsenypc.com\nsenyuanhi.com\nsenyuanzhonggong.com\nseo-lv.com\nseo.tm\nseo1158.com\nseo123.net\nseo178.com\nseo371.com\nseo628.com\nseobti.com\nseocxw.com\nseodaniel.com\nseofangfa.com\nseoipo.com\nseokoubei.com\nseoqx.com\nseosdc.com\nseosiguan.com\nseosn.com\nseotcs.com\nseovx.com\nseowhy.com\nseoxiaoxin.com\nseoxuetang.com\nsep.cc\nsepact.com\nsepcc.com\nsepco1.com\nsepfocus.com\nsepimcsemi.com\nseppec.com\nseptinn.com\nseptwolves-group.com\nseptwolves.com\nsepu.net\nsepumps.com\nsequ.biz\nsequoiacap.com\nsequoiadb.com\nsereypath.com\nserholiu.com\nseridc.com\nseridoat.com\nservasoft.com\nserveclouds.com\nserverless-devs.com\nserverproof.net\nservice86.com\nservicemesher.com\nservicewechat.com\nserviceweixin.com\nservilabmedical.com\nsesamestreetenglishchina.com\nsesamewatermelon.com\nsescar.com\nsescie.com\nseseds.com\nsesier.com\nsetb2b.com\nsetdg.net\nseteuid0.com\nsetshop.vip\nseuic.com\nsevb.com\nseven-meters.com\nseven7777.eu\nsevendatas.com\nsevenhei.com\nsevenseas-china.com\nsevensem.com\nsevnday.com\nsevnz.com\nsewise.com\nsex291roushipin.wiki\nsex2ribenwuma.wiki\nsex2xiaoluoli.wiki\nsex2yingtaoshipin.wiki\nsexytea2013.com\nseyoo.net\nseyuma-cn.com\nsf-airlines.com\nsf-auto.com\nsf-bearing.com\nsf-bsd.com\nsf-card.com\nsf-china.com\nsf-cityrush.com\nsf-dsc.com\nsf-express.com\nsf-financial.com\nsf-freight.com\nsf-international.com\nsf-intra-city.com\nsf-jf.com\nsf-js.com\nsf-laas.com\nsf-pay.com\nsf-saas.com\nsf-zs.net\nsf007.com\nsf024.com\nsf2021.com\nsf34.com\nsf7.net\nsf888.net\nsfacg.com\nsfadx.com\nsfair.com\nsfata.com\nsfb-100.com\nsfbest.com\nsfbuy.com\nsfc9oyfmqg.work\nsfcar.hk\nsfccn.com\nsfcdn.org\nsfcservice.com\nsfdiban.com\nsfdrums.com\nsfdy13168.com\nsfdzh.com\nsfecr.com\nsffdj.com\nsfgj.org\nsfgy.org\nsfhaa.com\nsfht.com\nsfi-sh.com\nsfile2012.com\nsfitcdp.com\nsfjddna.com\nsfjdml.com\nsfjsgroup.com\nsfjt.co\nsfjx888.com\nsfkedu.com\nsfkj-tech.com\nsfkj.vip\nsfkjweb.com\nsflep.com\nsflmfls.com\nsflqw.com\nsflshz.com\nsfmianhua.com\nsfndns.com\nsforest.in\nsfpgmk.com\nsfplay.net\nsfqzj.com\nsfrmt.com\nsfs-cn.com\nsfsdds.com\nsfshuiwu.com\nsfsigroup.com\nsfsw2000.com\nsfsyenergy.com\nsftj.net\nsftnow.com\nsfund.com\nsfvip1.com\nsfwl.co\nsfwljt.com\nsfwxf.com\nsfy-gmc.com\nsfyb.com\nsfybee.com\nsfydns.com\nsfygroup.com\nsfys365.com\nsfystatic.com\nsfzj123.com\nsfzk.org\nsg-che.com\nsg-gemsy.com\nsg-gzy.com\nsg-micro.com\nsg-tencentclb.cloud\nsg-tencentclb.com\nsg-tencentclb.net\nsg-tencentclb.work\nsg.work\nsg163.com\nsg169.com\nsg91.net\nsg92.com\nsgameglobal.com\nsgamer.com\nsgautomotive.com\nsgbll.com\nsgccdn.com\nsgcctd.com\nsgcctop.com\nsgcec.com\nsgcgis.com\nsgchangxun.com\nsgchinese.com\nsgcyjy.com\nsgda.cc\nsgdmobile.com\nsge.sh\nsgfsm.com\nsgjlkyjx.com\nsgjq.net\nsgjsgf.com\nsgjwb.com\nsgjy169.com\nsgjyq.com\nsgla.com\nsglituo.com\nsgliulian.com\nsgllk.com\nsgmart.com\nsgmlink.com\nsgmsonline.com\nsgmw.com\nsgmwlu.com\nsgmwsales.com\nsgnet.cc\nsgou.com\nsgpjbg.com\nsgplink.xyz\nsgpsea.com\nsgqd.com\nsgqqxh.org\nsgrastudio.com\nsgrbcm.com\nsgrcw.com\nsgshero.com\nsgshuyuan.com\nsgsic.com\nsgsotools.com\nsgst.prod.dl.playstation.net\nsgsugou.com\nsgsxw.com\nsgsxybiz.com\nsgsyxx.net\nsgt21.com\nsgthzb.com\nsgtmos.com\nsguo.com\nsgvalve.com\nsgvbot.com\nsgwjjc.com\nsgwk.info\nsgy-it.com\nsgyaogan.com\nsgyeyou.com\nsgyhux.com\nsgyouxi.com\nsgyscom.com\nsgyzyun.club\nsgzb2.com\nsgzm.com\nsgzww.com\nsgzww.net\nsgzxedu.com\nsh-3ai.com\nsh-agilebot.com\nsh-aia.com\nsh-anfang.org\nsh-anrong.com\nsh-aquarium.com\nsh-arpm.com\nsh-autofair.com\nsh-azjiadeli.com\nsh-baolai.com\nsh-biobond.com\nsh-chenghuan.com\nsh-chimbusco.com\nsh-datastone.com\nsh-deem.com\nsh-delixi.com\nsh-desu.com\nsh-dongbiao.com\nsh-eastwes.com\nsh-edi.com\nsh-eshow.com\nsh-fdtw.com\nsh-fxgz.com\nsh-fy.com\nsh-game.com\nsh-gelanlishi.com\nsh-gexing.com\nsh-gsg.com\nsh-henderson-metropolitan.com\nsh-hengyuan.com\nsh-hilead.com\nsh-hitech.com\nsh-hlrubber.com\nsh-holfer.com\nsh-holiday.com\nsh-hs.com\nsh-hting.com\nsh-huate.com\nsh-huayang.com\nsh-hwbaoan.com\nsh-hywin.com\nsh-italent.com\nsh-iwatani.com\nsh-jiapeng.com\nsh-jingjin.com\nsh-jinxiang.com\nsh-jjsb.com\nsh-jkyy.com\nsh-jzgroup.com\nsh-kechen.com\nsh-kelai.com\nsh-kingsun.com\nsh-kr.net\nsh-lengdong.com\nsh-liangxin.com\nsh-likun.com\nsh-livemusic.com\nsh-meluck.com\nsh-minghui.com\nsh-ncn.com\nsh-nemoto.com\nsh-oca.com\nsh-pet.com\nsh-pn.com\nsh-pp.com\nsh-printing.com\nsh-prosperity.com\nsh-prosun.com\nsh-putai.com\nsh-puwei.com\nsh-real.com\nsh-recycle.org\nsh-rfid.com\nsh-ryjx.com\nsh-saic.com\nsh-sed.com\nsh-service.com\nsh-sfc.com\nsh-sgl.com\nsh-shenming.com\nsh-shuguang.com\nsh-sict.com\nsh-sinodiet.com\nsh-smartstate.com\nsh-soa.com\nsh-srcb.com\nsh-ssci.com\nsh-tangfeng.com\nsh-tayor.com\nsh-tencentclb.cloud\nsh-tencentclb.com\nsh-tencentclb.net\nsh-tencentclb.work\nsh-ticket.com\nsh-tm.com\nsh-valve.com\nsh-warwick.com\nsh-web.net\nsh-xinao.com\nsh-xixuan.com\nsh-yajia.com\nsh-yano.com\nsh-ybxhz.com\nsh-yichen.com\nsh-yuai.com\nsh-yuy.com\nsh-zbfm.com\nsh002.com\nsh1011.com\nsh112.com\nsh12320.com\nsh148.org\nsh17.com\nsh1nk1n-shokd.com\nsh1nk1n-shokf.com\nsh414.com\nsh4th.com\nsh51766.com\nsh5mcc.com\nsh5y.com\nsh600696.com\nsh601200.com\nsh83.xyz\nsh8y.com\nsh91.com\nsh9130.com\nsh9156.com\nsha-steel-yx.com\nsha-steel.com\nsha2777.com\nsha990.com\nshaaidata.com\nshaangu.com\nshaanxigas.com\nshaanxiiot.com\nshaanxirk.com\nshaanxita.com\nshaanyaogroup.com\nshabc.com\nshabc.net\nshabidding.com\nshabiyun.com\nshachong8.com\nshacumox.com\nshadafang.com\nshadc-tencentclb.cloud\nshadc-tencentclb.com\nshadc-tencentclb.net\nshadc-tencentclb.work\nshaddockfishing.com\nshadiao.pro\nshaduizi.com\nshaduruanjian8.com\nshafa.com\nshafaguanjia.com\nshagangcapital.com\nshagyy.com\nshaidc.com\nshairport.com\nshaisino.com\nshaizai.com\nshajdog.com\nshajuta.com\nshakingcloud.com\nshala99.com\nshalashike.com\nshalfoil.com\nshall-buy.com\nshallserve.cc\nshamiao.com\nshan-yu-tech.com\nshan.com\nshanbay.com\nshanbotv.com\nshancemall.com\nshanchuangjiaoyu.com\nshancui1688.com\nshanda960.com\nshandacasual.net\nshandagames.com\nshandaz.com\nshandechina.xin\nshandian666.com\nshandiandaili.com\nshandiangou.com\nshandianhuifu.com\nshandiansiwei.com\nshandingdang.com\nshandingmenye.com\nshandjj.com\nshandong-energy.com\nshandongair.com\nshandongbadun.com\nshandongbojun.com\nshandonggangxie.com\nshandonggk.com\nshandonghaiyang.com\nshandonghealthcare.com\nshandonghuahai.com\nshandonghuaye.com\nshandongjiapeng.com\nshandongjuli.com\nshandonglanhua.com\nshandongqinuo.com\nshandongruyi.com\nshandongsannong.com\nshandongyunpin.com\nshandw.com\nshanedit.com\nshanfengguigang.com\nshang-chain.com\nshang-ma.com\nshang-xia.com\nshang0898.com\nshang168.com\nshang360.com\nshangair.com\nshangame.com\nshanganzixun.com\nshangate.com\nshangbangzhuan.com\nshangbanla.net\nshangbanzugroup.com\nshangbaolai.com\nshangbiao.com\nshangbiao.store\nshangbiaocheng.com\nshangbopharm.com\nshangbw.com\nshangc.net\nshangc123.net\nshangcaifanyi.com\nshangchao668.com\nshangchuanba.com\nshangcon.com\nshangdagc.com\nshangdandan.com\nshangdaotong.com\nshangdejy.com\nshangdian.biz\nshangdiguo.com\nshangdu.com\nshangdu.info\nshangeyun.com\nshangfang56.com\nshangfox.com\nshanggame.com\nshanggong-zj.com\nshanghai-air.com\nshanghai-at.com\nshanghai-channel.com\nshanghai-electric.com\nshanghai-idea.com\nshanghai-intex.com\nshanghai-leather.com\nshanghai-map.net\nshanghai-parking.com\nshanghai-pictures.com\nshanghai-sports.com\nshanghai-test.com\nshanghaiahte.com\nshanghaiairport.com\nshanghaiairporttour.com\nshanghaiamts.com\nshanghaiata.com\nshanghaiba.org\nshanghaibaokai.com\nshanghaibaomu.com\nshanghaibaoxie.com\nshanghaicaiyi.com\nshanghaicg.net\nshanghaichannel.net\nshanghaichemical.com\nshanghaiconcerthall.org\nshanghaiconcrete.com\nshanghaicredit.org\nshanghaicup.com\nshanghaidaily.com\nshanghaidelong.com\nshanghaidisneyresort.com\nshanghaidite.com\nshanghaigm.com\nshanghaigobroadhospital.com\nshanghaihino.com\nshanghaihuanli.com\nshanghaiinvest.com\nshanghaiiot.org\nshanghaijinyimaoyi.com\nshanghailima.com\nshanghailm.com\nshanghaimaling.com\nshanghaimart.com\nshanghaimaxicheng.com\nshanghaimengtaishangcheng.com\nshanghaimetal.com\nshanghaimuseum.net\nshanghainb.com\nshanghaining.com\nshanghaionstar.com\nshanghaiparker.com\nshanghaipower.com\nshanghaiqihu.com\nshanghaiqilu.com\nshanghaiql.org\nshanghairanking.com\nshanghairc.com\nshanghairolexmasters.com\nshanghaishuangyanpi.com\nshanghaishuxie.com\nshanghaitianqi114.com\nshanghaitower.com\nshanghaitrust.com\nshanghaivast.com\nshanghaivet.com\nshanghaiwater.com\nshanghaiweicon.com\nshanghaixuejia.com\nshanghaiyinyang.com\nshanghaiyk.com\nshanghaiyouxi.com\nshanghaizhaxinhospital.com\nshanghaizhenji.com\nshanghcat.com\nshanghongbei.com\nshanghuiai.com\nshanghuiwww.com\nshanghuiyi.com\nshangjieiot.com\nshangjilian.com\nshangjingsh.com\nshangjinssp.com\nshangjinuu.com\nshangjixin.com\nshangketang.com\nshangli-tea.com\nshanglin.net\nshanglischool.com\nshanglp.com\nshangluo.co\nshanglushan.com\nshanglv51.com\nshangnaxue.cc\nshangnaxue.net\nshangpai123.com\nshangpin.com\nshangpinshou.com\nshangpo.com\nshangpu-china.com\nshangpusou.com\nshangpuzhan.com\nshangquanquan.com\nshangque.com\nshangrao-marathon.com\nshangshaban.com\nshangshancm.com\nshangshang.com\nshangshangke.me\nshangshangoa.com\nshangshangsp.com\nshangshi360.com\nshangshici.com\nshangshiwl.com\nshangshouweb.com\nshangshu.com\nshangshuce.com\nshangshuyixue.com\nshangtaiw.com\nshangtao.net\nshangtao360.com\nshangtianhui.com\nshangtongda.com\nshangtuf.com\nshanguanjixie.com\nshanguansoft.com\nshangui.cc\nshangusec.net\nshangwb.com\nshangwu168.com\nshangwulink.com\nshangxue.com\nshangxueba.com\nshangyejihua.com\nshangyekj.com\nshangyexinzhi.com\nshangyouze.com\nshangyu-marathon.com\nshangyuan029.com\nshangyubank.com\nshangyuer.com\nshangzhang.com\nshangzhibo.tv\nshanhaifuture.com\nshanhainengyuan.com\nshanhaitujian.com\nshanhaizhanji.com\nshanhe.com\nshanhe.kim\nshanhe01.com\nshanheknit.com\nshanheyule.com\nshanhs.com\nshanhu188.com\nshanhu99.com\nshanhuijiangtang.com\nshanhuu.com\nshanjianzhan.com\nshanjinqh.com\nshanjuinformation.com\nshankaisports.com\nshankejingling.com\nshanks.link\nshanliao.com\nshanliaoapp.com\nshanling.com\nshanlinjinrong.com\nshanlink.com\nshanlinshengwu.com\nshanliulian.com\nshanmeixincai.com\nshanniaorecycle.com\nshannon-sys.com\nshannonai.com\nshanqing.net\nshanqu.cc\nshanqx.com\nshanrongmall.com\nshanse8.com\nshanshan-business.com\nshanshan.com\nshanshangame.com\nshanshanhc.com\nshanshanim.vip\nshanshanku.com\nshanshantech.com\nshanshoufu.com\nshanshuihotel.com\nshanshuiwl.com\nshansteelgroup.com\nshante.me\nshantoujingrui.com\nshantoumama.com\nshantui.com\nshantuimall.com\nshanwan.com\nshanwan.store\nshanwanli.com\nshanweinews.net\nshanweirc.com\nshanweiyule.com\nshanwel.com\nshanwxxg.com\nshanxiangjiaoyu.com\nshanxiaobai.com\nshanxichess.com\nshanxidiy.com\nshanxigames.com\nshanxigas.com\nshanxigwy.org\nshanxihaoshengtong.com\nshanxijianzhuzizhi.com\nshanximuseum.com\nshanxinj.com\nshanxiol.com\nshanxiranqi.com\nshanxishangren.com\nshanxishizheng.com\nshanxiumao.com\nshanxiuxia.com\nshanyang666.com\nshanyangwang.com\nshanyaogroup.com\nshanyaoo.com\nshanyaoyjy.com\nshanyemangfu.com\nshanyetang.com\nshanyhs.com\nshanyishanmei.com\nshanyougame.com\nshanyu.com\nshanyuankj.com\nshanyuanms.com\nshanyue.tech\nshanyuechina.com\nshanyzx.com\nshanzhen.com\nshanzhen.me\nshanzhildq.com\nshanzhonglei.com\nshanzhuyou.com\nshaoanlv007.com\nshaoerbc.org\nshaoerwushu.org\nshaogefenhao.com\nshaogood.com\nshaojiu.com\nshaoke.com\nshaolinjingwu.com\nshaolintagou.com\nshaolinwushuxuexiao.com\nshaolinwy.com\nshaolvjt.com\nshaomingyang.com\nshaoniandream.com\nshaoshangwang.org\nshaoshilei.com\nshaoxiao.net\nshaoxing330.com\nshaoxingwater.com\nshaoyangnews.net\nshaoyuncloud.com\nshaphar.com\nshapharqx.com\nshaphc.org\nshaqing.com\nshaqm.com\nshare1diantong.com\nshare2dlink.com\nshare2uu.com\nshare404.com\nshareate.com\nsharecharger.com\nsharecore.net\nsharedaka.com\nsharegog.com\nshareinstall.com\nshareinstall.net\nshareintelli.com\nshareitthrough.com\nsharejs.com\nsharelogis.com\nsharemoon.club\nshareoneplanet.org\nsharesdns.com\nsharetome.com\nsharetrace.com\nsharevdi.com\nsharewaf.com\nsharexbar.com\nsharexiang.com\nsharingclass.vip\nsharjahmadrasa.com\nsharkisland.store\nsharkselection.com\nsharkshopping.com\nsharpbai.com\nsharpheel.com\nsharpmobi.com\nsharpon.com\nshasx.com\nshatian.org\nshautomuseum.com\nshavpn.amd.com\nshavpn2.amd.com\nshawdo.com\nshawnzeng.com\nshaxian.biz\nshayugg.com\nshayujizhang.com\nshayuweb.com\nshazc.com\nshb.ltd\nshbangde.com\nshbangdian.com\nshbaoli.com\nshbars.com\nshbbq.net\nshbear.com\nshbetterway.com\nshbg.org\nshbicycle.com\nshbike.com\nshbio.com\nshbiochip.com\nshbizhen.com\nshbj.com\nshbjfc.com\nshbkfyy.com\nshbkwai.com\nshbl8.com\nshbnrj.com\nshbobo.com\nshboka.com\nshbpump.com\nshbqmp.com\nshbtpm.com\nshbxzp.com\nshbyer.com\nshbyw.com\nshcaco3.com\nshcancer.com\nshcas.net\nshcc-horizon.com\nshcce.com\nshccig.com\nshccineg.com\nshccio.com\nshccpx.net\nshccxy.com\nshcd.cc\nshcell.com\nshcell.org\nshcellgroup.com\nshcfcd.com\nshchangshun.com\nshchnkyy.com\nshchyy.net\nshcifco.com\nshckgs.com\nshclearing.com\nshclgc.net\nshcljoy.com\nshclkj.com\nshcmer.com\nshcmhr.com\nshcnfb.com\nshcngz.com\nshcsdq.com\nshcsinfo.com\nshcstheatre.com\nshcwmotor.com\nshcxbyjt.com\nshcya.com\nshcz.com\nshczssyq.com\nshczyy.com\nshdafw.com\nshdancecenter.com\nshdasa.com\nshdata.com\nshdatagroup.com\nshdcjt.com\nshdftz.com\nshdgm.com\nshdingzhidental.com\nshdirong.com\nshdjt.com\nshdmic.com\nshdmt.net\nshdmu.com\nshdnjt.com\nshdouxie.com\nshdpa.com\nshdrc.org\nshdrkj.com\nshdsd.com\nshdsn.com\nshdsqs.com\nshdszc.com\nshdxgraphene.com\nshdxk.com\nshdy.com\nshdy168.com\nshdyiy.com\nshdyty.com\nshdzep.com\nshdzfp.com\nshe120.com\nsheasyoffice.com\nshebao.net\nshebao100.com\nshebao5.com\nshebao520.com\nshebaomi.com\nshebaotong.com\nshebaowang.com\nshebaozhaopian.com\nshebiaotm.com\nsheboo.com\nsheca.com\nshedejie.com\nshedongyun.com\nshedoor.com\nshedunews.com\nsheec-tencentclb.cloud\nsheec-tencentclb.com\nsheec-tencentclb.net\nsheec-tencentclb.work\nsheencity.com\nsheenrun.com\nsheentec.com\nsheep11.com\nsheepmats.com\nsheinet.com\nsheji.com\nshejibao.com\nshejiben.com\nshejibiji.com\nshejidaren.com\nshejidaxue.com\nshejidedao.com\nshejidna.com\nshejijia.com\nshejijingsai.com\nshejiku.net\nshejinu.com\nshejipi.com\nshejiqun.com\nshejis.com\nshejiwo.net\nshejixf.com\nshejiyizhou.com\nshejiyue.com\nsheketiandi.com\nshekou.com\nshelive.net\nshellpub.com\nshellsec.com\nshelter-china.com\nshelterdome.net\nshelwee.com\nshen-grh.com\nshen-nao.com\nshen-xi.com\nshen321.com\nshenanhui.com\nshenbabao.com\nshenbanglawyer.com\nshenbinghang.com\nshenbisheji.com\nshencai-china.com\nshencaiceshi.com\nshenchai.com\nshenchengkeji.com\nshenchengtou.com\nshenchigroup.com\nshenchuang.com\nshenchunhui.com\nshencut.com\nshenda-group.com\nshendatong.com\nshendiaoqzj.com\nshendoow.com\nshendu.cc\nshendu.com\nshendu123.com\nshendugho.com\nshenduliaojie.com\nshenduwang.com\nshenduwin10.com\nshenduwin7.com\nshenduxiyin.com\nshenfagg.com\nshengangzc.com\nshengaohua.com\nshengbaihui.com\nshengbangshenghua.com\nshengbaoluo.com\nshengcai.net\nshengcaijinrong.com\nshengcaiyoushu.com\nshengcaozhiwang.com\nshengcekeji.com\nshengchan.biz\nshengdan.com\nshengdaosoft.com\nshengdaprint.com\nshengdawood.com\nshengdecw.com\nshengdianhuadg.com\nshengdianhuadk.com\nshengejing.com\nshengenqianzheng.com\nshengenv.com\nshengfajiaohua.com\nshengfanwang.com\nshenghan.org\nshenghefilms.com\nshengheplastic.com\nshenghongpec.com\nshenghu.cc\nshenghua-fire.com\nshenghuabao.net\nshenghuaem.com\nshenghuagroup.com\nshenghuaxi.com\nshenghui56.com\nshenghuigd.com\nshenghuo365.com\nshenghuojia.com\nshenghuorili.com\nshenghuowo.com\nshengjie-logistics.com\nshengjing360.com\nshengjinghe.com\nshengjinglinye.com\nshengjiu.com\nshengjoy.com\nshengjuewl.com\nshengli.com\nshenglongit.com\nshengmaapp.com\nshengmage.com\nshengming.net\nshengminghitech.com\nshengniuuz.com\nshengpay.com\nshengqian51.com\nshengquan.com\nshengqugames.com\nshengren.work\nshengrungroup.com\nshengsci.com\nshengshengkang.com\nshengshizhicheng.com\nshengtai.com\nshengtaigroup.net\nshengtian.com\nshengtiangroup.com\nshengtongedu.com\nshengtuanyouxuan.com\nshenguang.com\nshengwu.store\nshengwu01.com\nshengxiao.net\nshengxiaobj.com\nshengxiaochemical.com\nshengxin.ren\nshengxingholdings.com\nshengxinquan.net\nshengxuxu.com\nshengyan985.com\nshengyedq.com\nshengyeji.com\nshengyi.ai\nshengyi.biz\nshengyizhuanjia.com\nshengyuan.com\nshengyuancc.com\nshengzhaoli.com\nshengzhujiage.com\nshenhaoinfo.com\nshenhexin.com\nshenhexin.vip\nshenheyuan.net\nshenhongfei.com\nshenhongmao.com\nshenhua.cc\nshenhuachina.com\nshenhudong.com\nsheniaoren.com\nsheniaorenw.com\nshenjianggroup.com\nshenjiangyy.com\nshenjing.com\nshenjumiaosuan.com\nshenkai.com\nshenkelong.com\nshenkexin.com\nshenkong.net\nshenlan02.com\nshenlanbao.com\nshenlaohr.com\nshenling.com\nshenlintech.com\nshenma-inc.com\nshenma.com\nshenmabaike.com\nshenmadsp.com\nshenmapay.com\nshenmayouxi.com\nshenmeipharm.com\nshenmikj.com\nshenmo.com\nshenmojiaoyu.com\nshenmou.com\nshennongjiazhaopin.com\nshennongpharma.com\nshennwu.com\nshenou.com\nshenousz.com\nshenpinwu.com\nshenpojie.com\nshenpowang.com\nshenpucw.com\nshenqhy.com\nshenqisou.com\nshenqiwunet.com\nshenqizhilv.com\nshenquol.com\nshenrongda.com\nshenrongjidian.com\nshenruan.org\nshenruapp.com\nshenshang.org\nshenshi777.com\nshenshiads.com\nshenshijituan.com\nshenshitech.org\nshenshoucdn.com\nshenshouwl.com\nshenshouyouxi.com\nshenshu.info\nshenshuo.net\nshenshuw.com\nshenshuxs.org\nshensuantang.com\nshensuokeji.com\nshenta.net\nshentongchina.com\nshentongdata.com\nshentongkuaidi.com\nshenweibengye.com\nshenweimicro.com\nshenweisupport.com\nshenweixiangjiao.com\nshenxianhua.com\nshenxianyu.cc\nshenxijixie.com\nshenxingroup.com\nshenxm.com\nshenxuanche.com\nshenyang2car.com\nshenyangoffice.com\nshenyd.com\nshenyecg.com\nshenyehd.com\nshenyeyunying.com\nshenyinhudong.com\nshenyou.tv\nshenyu.me\nshenyuanquan.com\nshenyunkeji.com\nshenyunlaw.com\nshenyunmedical.com\nshenyunwang.com\nshenzan.com\nshenzaokeji.com\nshenzaole.com\nshenzhekou.com\nshenzhen-kuaiji.com\nshenzhen-world.com\nshenzhenair.com\nshenzhenbianhua.com\nshenzhencefa.com\nshenzhenew.com\nshenzheninvestment.com\nshenzhenjgw.com\nshenzhenlianhua.com\nshenzhenmakerfaire.com\nshenzhenshouxin.com\nshenzhenshuixie.com\nshenzhentong.com\nshenzhentour.com\nshenzhenware.com\nshenzhenygx.com\nshenzhenyuren.com\nshenzhoublm.com\nshenzhouen.com\nshenzhoufu.com\nshenzhoupharma.com\nshenzhyu.work\nshepai1688.com\nshephe.com\nshepinw.com\nshequfu.com\nshequfu.net\nsherc.net\nsherlockkk.com\nsherlocky.com\nsherowm.com\nsheshui.com\nshesoleshoes.com\nshetu66.com\nsheui.com\nshevdc.org\nshewang.net\nsheweikeji.com\nshexcloud.com\nshexgrp.com\nshexian100.com\nshexiannet.com\nshexpocenter.com\nsheying001.net\nsheyingtg.com\nsheyou.com\nsheyuan.com\nshezaixian.com\nshezfy.com\nshfa120.com\nshfamily.com\nshfangshui.com\nshfayy.com\nshfcw.com\nshffjt.com\nshfft.co\nshfft.com\nshfgzl.com\nshfigaro.com\nshfilmart.com\nshfilmmuseum.org\nshfinechem.com\nshfirstrehab.com\nshfoxmotor.com\nshfq.com\nshfrp.com\nshfswl.com\nshfte.com\nshfxrc.com\nshfy2020.com\nshgao.com\nshgaoxin.net\nshgbc.org\nshgbit.com\nshgbitcloud.com\nshgci.com\nshgedu.com\nshggzy.com\nshgjj.com\nshgjq.com\nshgkh.com\nshgkl.com\nshgkw.org\nshglgf.com\nshgpo.com\nshgsec.com\nshgsic.com\nshgskj.com\nshgtheatre.com\nshgushi.com\nshgyg.com\nshgymy.com\nshhanqiao.com\nshharborcity.com\nshhbgm.com\nshhcjt.com\nshhcpm.com\nshhd17.com\nshhdouyue.com\nshhebio.com\nshhella.com\nshhenghesh.com\nshheywow.com\nshhic.com\nshhigher.com\nshhiminhm.com\nshhkcc.com\nshhkfw.com\nshhksports.com\nshhkyy.com\nshhl56.com\nshhlgroup.com\nshhmbio.com\nshhmu.net\nshholdingeu.com\nshhorse.com\nshhqcft-tencentclb.cloud\nshhqcft-tencentclb.com\nshhqcft-tencentclb.net\nshhqcft-tencentclb.work\nshhqcftfzhj-tencentclb.cloud\nshhqcftfzhj-tencentclb.com\nshhqcftfzhj-tencentclb.net\nshhqcftfzhj-tencentclb.work\nshhqcftfzhjtencentclb.cloud\nshhqgc.com\nshhrp.com\nshhtqn.com\nshhuaerkang.com\nshhuayi.com\nshhuayitz.com\nshhuazhen.com\nshhugong.com\nshhuihai.com\nshhuke.com\nshhuo.com\nshhushi.com\nshhuu.com\nshhweili.com\nshhws.com\nshhxbk.com\nshhxpx.com\nshhxyy.com\nshhxzq.com\nshhyanqing.com\nshhyhy.com\nshhzcj.com\nshi-ming.com\nshiabank.com\nshianzhixuan.com\nshibaili.com\nshibangchina.com\nshibangsy.com\nshibei.com\nshibeiht.com\nshibeiou.com\nshibeixuan.com\nshibolm.com\nshibor.org\nshicai.biz\nshicaidai.com\nshicaizhanlan.com\nshicehao.com\nshichangbu.com\nshichengbao.com\nshichengyi.com\nshichuangsj.com\nshichuangyi.com\nshichuedu.com\nshichuihui.com\nshicigequ.com\nshicishe.com\nshiciyun.com\nshicuojue.com\nshida66.com\nshidaedu.vip\nshidai5d.com\nshidaohospital.com\nshidapx.com\nshidastudy.com\nshide.com\nshidegroup.com\nshidenggui.com\nshidianbaike.com\nshidianguji.com\nshidianwandao.com\nshidiao136.com\nshidicn.com\nshidoukeji.com\nshidutuozhan.com\nshiepmexpo.com\nshifair.com\nshifan.org\nshifanedu.com\nshifang.tech\nshifansheng.com\nshifd.net\nshifeiti.com\nshifen.com\nshifendaodu.com\nshifendaojia.com\nshifeng.com\nshifenyuedu.com\nshigaoshan.com\nshiguanai.com\nshiguanghuyu.com\nshiguangpu.com\nshiguangxu.com\nshiguangyouju.com\nshiguanyinger-jg.com\nshihua-group.com\nshihuantong.com\nshihuishuo.com\nshijiala.com\nshijian.cc\nshijian.org\nshijiancn.com\nshijianla.com\nshijianping.com\nshijiaok.com\nshijicloud.com\nshijie2.com\nshijiebang.com\nshijiechaoshi.com\nshijieditu.net\nshijiemap.com\nshijieminghua.com\nshijiemingren.com\nshijiesanqingshan.com\nshijieshijian.net\nshijiexia.com\nshijieyouxi.com\nshijiezz.com\nshijihr.com\nshijihulian.com\nshijiong.com\nshijiqingqing.com\nshijiretailo2o.com\nshijiudao.com\nshijiufang.com\nshijqq.com\nshijuan1.com\nshijue.me\nshijueju.com\nshijuenian.com\nshikangsi.com\nshikaricharters.com\nshikee.com\nshikelang.cc\nshikongdaoyu.com\nshiku.co\nshilehui.com\nshileizuji.com\nshilian.com\nshilian.net\nshilicdn.com\nshilincn.com\nshilitie.net\nshiliuai.com\nshiliupo.com\nshiluetl.com\nshiluoji.com\nshimano-fishchina.com\nshimaoco.com\nshimaoenergy.com\nshimaogroup.com\nshimaostargroup.com\nshimaotong.com\nshimaowy.com\nshimen.org\nshimengcs.com\nshimengyuan.com\nshimengzhanghao.com\nshimge.com\nshimiduanju.com\nshiming.com\nshiminjia.com\nshimizuchem.com\nshimo.im\nshimo.run\nshimodev.com\nshimoko.com\nshimolife.com\nshimonote.com\nshimotx.com\nshimowendang.com\nshin-kinojseh.com\nshinberto.com\nshinco.com\nshindaichem.com\nshine-consultant.com\nshine-ic.com\nshine-tech.net\nshineacc.com\nshinechina.com\nshinefeel.com\nshinelon.com\nshineoptics.com\nshineray-motors.com\nshinerayad.com\nshinescan.tech\nshinetsu.shop\nshineu.com\nshineway.com\nshinewaytech.com\nshinewing.com\nshinewonder.com\nshineyie.com\nshineyue.com\nshinger.com\nshinianonline.com\nshining-electric.com\nshining3d.com\nshiningmidas.com\nshiningnew.com\nshiningpharm.com\nshink1n-ojasaoq.com\nshinkin-jpo-coy.com\nshinkinopsae.com\nshinnytech.com\nshinva.net\nshinycg.com\nshinye-ortho.com\nshinyway.org\nshinzoom.com\nshiove.com\nship-gps.net\nship.sh\nship56.net\nshipai123.com\nshipfinder.com\nshipgce.com\nshipgroup.net\nshiphr.com\nshipin163.com\nshipin520.com\nshipinzhibojian.com\nshipoe.com\nshippingate.com\nshippingchina.com\nshippingwhale.com\nshipry.com\nships66.com\nshipservice.org\nshiptux.com\nshipurili.com\nshipuxiu.com\nshipxy.com\nshiqi.me\nshiqiao.com\nshiqichuban.com\nshiqidu.com\nshiqitech.com\nshiqu.com\nshiquan56.com\nshiquask.com\nshiqutech.com\nshirenzuojia.com\nshiritianchengtech.com\nshirongzhaoye.com\nshisanzhi.com\nshiseidochina.com\nshishacharcoal.net\nshishagame.com\nshishangd.com\nshishangfengyun.com\nshishifanyi.com\nshishijia.com\nshishike.com\nshishiwater.com\nshiso9001.net\nshisongya.com\nshisukeji.com\nshitac.com\nshitac.net\nshitairen.com\nshitestunion.work\nshiti.net\nshitianxia.vip\nshitoc.com\nshitou.com\nshitouboy.com\nshitoulm.com\nshitourom.com\nshitsu.co.jp\nshituyikao.com\nshiwaiyun.net\nshiwanbaijiu.com\nshiwang1688.com\nshiwangyun.com\nshiweisemi.com\nshiwenlu.com\nshixiangren.com\nshixiaojin.com\nshixibiaozhi.com\nshixijob.net\nshixingceping.com\nshixinhua.com\nshixinyufang.com\nshixiseng.com\nshixiu.net\nshixun365.com\nshixunhao.com\nshixunsuda.com\nshixunwl.com\nshiyan.com\nshiyanbar.com\nshiyanbar.net\nshiyangdr.com\nshiyanhospital.com\nshiyanjia.com\nshiyanlou.com\nshiyculture.com\nshiye.org\nshiyebian.net\nshiyebian.org\nshiyedanwei.net\nshiyi.co\nshiyi11.com\nshiyibao.com\nshiyicdn.com\nshiyide.com\nshiyifacai.com\nshiyingbao.com\nshiyiyj.com\nshiyiyx.com\nshiyong.com\nshiyongjun.biz\nshiyou-electric.com\nshiyouflooring.com\nshiyouhome.com\nshiyousan.com\nshiyu.pro\nshiyu.zone\nshiyuandx.com\nshiyue.com\nshiyuegame.com\nshiyueliangpin.com\nshiyund.com\nshiyus.com\nshiyutianqi.com\nshizhanxia.com\nshizhiad.work\nshizhuang-inc.com\nshizhuolin.com\nshizhuonet.com\nshj6789.com\nshjakfyy.com\nshjaming.com\nshjayson.com\nshjb600838.com\nshjcm3d.com\nshjd.org\nshjdceo.com\nshjdjx.com\nshjglaser.com\nshjgu.com\nshjh120.com\nshjhjc.com\nshjiabu.com\nshjinbao.com\nshjincan.com\nshjingmi.com\nshjingxu.com\nshjinnengzuche.com\nshjlnzyy.com\nshjob.work\nshjr-tencentclb.cloud\nshjr-tencentclb.com\nshjr-tencentclb.net\nshjr-tencentclb.work\nshjsit.com\nshjsrg.com\nshjsst.com\nshjstl.com\nshjsxh.com\nshjt.net\nshjtos.com\nshjtw.com\nshjtxx.net\nshjus.com\nshjvguan.com\nshjx-group.com\nshjy18.com\nshjy8888.com\nshjyou.com\nshjyyx.com\nshjzfs.com\nshjzfutures.com\nshjzzjf.net\nshkaihang.com\nshkamoer.com\nshkcn.com\nshkcsj.com\nshkdchem.com\nshkdfua.com\nshkdtfyf.vip\nshkewen.com\nshkg.net\nshkhzc.com\nshkingchem.com\nshkjb.com\nshkjcable.com\nshkjjs.com\nshkjqp.com\nshkjsoft.com\nshkkl.com\nshklsw.com\nshkm.com\nshkpzx.com\nshkuangjing.com\nshkypump.com\nshlab.tech\nshlangao.com\nshlawserve.com\nshlayout.com\nshlcxby.com\nshld.com\nshldfm.com\nshlhbxg.com\nshliafvzc.com\nshliangshi.com\nshlianlu.com\nshlingang.com\nshlinjiang.com\nshlitc.com\nshlixin.com\nshll-gs.com\nshlll.net\nshlmth.com\nshlongtai.com\nshlp.com\nshlpk.com\nshlsnk.com\nshlsyb.com\nshlungu.com\nshlys.com\nshmaas.net\nshmama.net\nshmarathon.com\nshmaur.com\nshmbjy.org\nshmds.com\nshmds.vip\nshmedia.tech\nshmengyang.com\nshmet.com\nshmetro.com\nshmfmr.net\nshmhtv.com\nshmhzp.com\nshmljm.com\nshmockup.com\nshmog.org\nshmondial.com\nshms-expo.com\nshmtu.net\nshmusic.org\nshmusicschool.com\nshmylike.com\nshmzgroup.com\nshnaile.com\nshnanfang.com\nshnayw.com\nshnb12315.com\nshnbsh.com\nshneuro.org\nshneweye.com\nshnmnm.com\nshnne.com\nshnsyh.com\nshnti.com\nshoasis.net\nshoasisholding.com\nshobserver.com\nshockerli.net\nshockley-elect.com\nshoegaze.com\nshoeshr.com\nshofine.com\nshojo.cc\nshokan.org\nshokdown.com\nshokw.com\nshokz-comm.org\nsholaser.com\nshollper.com\nshomop.com\nshomyq.com\nshonfer.com\nshootmedia.net\nshop-isv.com\nshop265.com\nshop2cn.com\nshopbackdrop.com\nshopchaoren.com\nshopeesell.com\nshopeesz.com\nshopesv.com\nshopex123.com\nshopimgs.com\nshopin.net\nshopjyh.com\nshoplazza.com\nshopline123.com\nshopmaxmb.com\nshopnc.net\nshoppingchain.net\nshoppkk.com\nshopplus.vip\nshoprobam.com\nshopscrm.com\nshopss.com\nshoptop.com\nshopwatchus.com\nshopwind.net\nshopxo.net\nshopxo.vip\nshopxx.net\nshopyy.com\nshorcut88.com\nshorologe.com\nshortof.com\nshotnba.com\nshou-qi.com\nshoubaiart.com\nshoubanjiang.com\nshoubaodan.com\nshoubashou.net\nshoubb.com\nshoubiaohuishou.com\nshoubiaowang.com\nshoubuluo.com\nshoucangyaji.com\nshouce.ren\nshouce365.com\nshouchaoba.com\nshoucheng123.com\nshoudayy.net\nshoudian.com\nshoudian.info\nshoudian.org\nshoudu.org\nshouduit.com\nshoudurc.com\nshoudurx.com\nshoufaw.com\nshoufm.com\nshoufu.com\nshougongke.com\nshougongke.net\nshougoumingbiao.com\nshouhaoche.com\nshouhoubang.com\nshouhougou.com\nshouhui.com\nshouhuigroup.com\nshouhuisoft.com\nshouhuojiyun.com\nshouhuola.com\nshouji.com\nshouji.racing\nshouji10086.com\nshouji315.org\nshouji56-img.com\nshouji56.com\nshoujibao.net\nshoujidai.com\nshoujiduoduo.com\nshoujihuifu.com\nshoujikanshu.net\nshoujimi.com\nshoujitouping.com\nshoujiwan.com\nshoujixs.net\nshoujixs.org\nshoukaigufen.com\nshoukala.com\nshoukangyiyuan.com\nshoukayun.com\nshoulian.org\nshoumaquan.com\nshoumizhibo.com\nshoumm.com\nshounaoxuexiao.com\nshouqi-zuche.com\nshouqianba.com\nshouqibus.com\nshouqicar.com\nshouqiev.com\nshouqu.me\nshoushenlvcheng.com\nshoutai.com\nshoutanjjj.com\nshouxi.com\nshouxieke.net\nshouxieti.com\nshouxihu.net\nshouxiphotos.com\nshouyao.com\nshouyao8.com\nshouyaoholding.com\nshouye-wang.com\nshouyhui.com\nshouyihuo.com\nshouyinbei.net\nshouying.tv\nshouyou.com\nshouyoubus.com\nshouyoucdn.com\nshouyoudao.com\nshouyoujz.com\nshouyouqianxian.com\nshouyoushenqi.com\nshouyoutv.com\nshouyouzhijia.net\nshouzhang.com\nshouzhangapp.com\nshouzhitao.com\nshouzhuanzhidao.com\nshovesoft.com\nshow160.com\nshowaamericanstory.com\nshowapi.com\nshowchina.org\nshowcitytimes.net\nshowcome.net\nshowdoc.cc\nshowerlee.com\nshowfay.com\nshowgame.com\nshowing9.com\nshowjoy.com\nshowkey.com\nshowl.com\nshowmeai.tech\nshowmebug.com\nshowmesse.net\nshowroomshanghai.com\nshowse.com\nshowself.com\nshowshell.com\nshowstart.com\nshowtao.com\nshowxiu.com\nshowxue.com\nshowyu.com\nshoyoo.com\nshpans.com\nshpanyou.com\nshpbs.com\nshpd.net\nshpdh.org\nshpdjq.com\nshpedi.com\nshpenquan.com\nshpgt.com\nshpgx.com\nshphschool.com\nshpiano.com\nshpingda.com\nshppa.net\nshps518.com\nshpsncp.com\nshpyedu.com\nshqec.com\nshqi7.net\nshqinghe.com\nshqipai.org\nshqkxh.org\nshqmxx.com\nshqncs.com\nshqpxc.com\nshqswlgs.com\nshqunlu.com\nshqxjx.com\nshqyg.com\nshrail.com\nshrbank.com\nshrca.org\nshrcb.com\nshrcdy.com\nshrenqi.com\nshresource.com\nshrgjt.com\nshrlig.com\nshrmpump.com\nshrmw.com\nshrrjt.com\nshrtlnks.com\nshruanjie.com\nshruisong.net\nshry.net\nshryou.com\nshsaic.net\nshsajt.com\nshsanfang.com\nshsanfine.com\nshsanji.com\nshsanwei.com\nshsbnu.net\nshsby.com\nshsc-valve.com\nshscce.com\nshsci.org\nshscsc.com\nshsctec.com\nshsd-elec.com\nshsdjsj.com\nshsdnet.com\nshsee.com\nshsfkyy.com\nshsfxxh.com\nshsgbm.com\nshsgyq.com\nshshenbo.com\nshshilin.com\nshshinfo.com\nshshuhui.com\nshshunfeng.com\nshshuxiao.com\nshshzu.com\nshsid.org\nshsinhu.com\nshsipo.com\nshsixun.com\nshsjb.com\nshsjcb.com\nshsjgj.com\nshsjjh.com\nshskin.com\nshsktower.com\nshskyland.com\nshslqxh.com\nshsmzj.com\nshsoong-chingling.com\nshsot.com\nshsparkwater.com\nshspdq.com\nshsportschool.com\nshsq.vip\nshsrdzs.com\nshssdc.com\nshssp.org\nshstcm.com\nshstone.org\nshstyxh.com\nshsunny.com\nshswim.com\nshsxjy.com\nshsyf.com\nshsyzn.online\nshsz17.com\nshszsoft.com\nshtalentgroup.com\nshtannet.com\nshtaoism.com\nshtazy.com\nshtbi.com\nshtdgj.com\nshtdsc.com\nshtefu.com\nshtfqx.com\nshtgds.com\nshthbanz.com\nshthediyya.com\nshtianhe.cc\nshtianye.com\nshtianyuqiche.com\nshtic.com\nshtimessquare.com\nshtion.com\nshtopshow.com\nshtour.org\nshtqzs.com\nshtrhospital.com\nshtsn.com\nshtsp.com\nshtutian.com\nshtw.cc\nshtwjiebao.com\nshtxcj.com\nshtydic.com\nshu-ju.net\nshu163.com\nshuaigeshe.com\nshuaigun.com\nshuaihuajun.com\nshuaiku.com\nshuaiming.com\nshuainiba.com\nshuaipiao.com\nshuaishou.com\nshuaiy.com\nshuaji.com\nshuaji.net\nshuajibao.com\nshuajizhijia.net\nshuakazhijia.com\nshuame.com\nshuang-feng.com\nshuang-sen.com\nshuangcheng.net\nshuangda-pump.com\nshuangguan.net\nshuanghancn.com\nshuangheng.com\nshuanghui.net\nshuangjing.net\nshuangkou.net\nshuangkuai.co\nshuangle888.com\nshuangliang-boiler.com\nshuanglin.com\nshuanglingroup.com\nshuanglongdong.com\nshuangmatbs.com\nshuangmei2008.com\nshuangniaoslhl.com\nshuangqingtech.com\nshuangtao.com\nshuangtiantech.com\nshuangtuan.com\nshuangxian.com\nshuangxingcaisu.com\nshuangxingseed.com\nshuangxinhui.com\nshuangyanjie.com\nshuangyingmenye.net\nshuangyingsx.com\nshuangyuejn.com\nshuangzheng.org\nshuangzhong.com\nshuashuaapp.com\nshuashuati.com\nshuazhibo.com\nshubiaob.com\nshubl.com\nshucai001.com\nshucai123.com\nshucaixiaoshuo.com\nshuchengdt.com\nshuchongread.com\nshuchuandata.com\nshucong.com\nshudaoge.com\nshudaojt.com\nshudaowl.com\nshudaxia.com\nshudi8.com\nshudianwang.com\nshudongpoo.com\nshudouzi.com\nshuduntech.com\nshuerjia.com\nshufa.com\nshufa.org\nshufa121.com\nshufa360.com\nshufa520.com\nshufaai.com\nshufabao.net\nshufafin.com\nshufaji.com\nshufajia.cc\nshufami.com\nshufashibie.com\nshufaway.com\nshufawu.com\nshufazidian.com\nshufaziti.com\nshufe.com\nshufenggaoke.com\nshuge.org\nshuge9.com\nshuguang.com\nshuguanggroup.com\nshuguanghuayuan.com\nshuhai.com\nshuhaidata.com\nshuhaige.net\nshuhaisc.com\nshuhaitz.com\nshuhaochaxun.com\nshuhegroup.com\nshuhenglib.com\nshuhonggz.com\nshuhua.com\nshuhuast.com\nshuhuawu.com\nshuhui9.com\nshui12366.com\nshuibaogs.com\nshuibengxinghao.com\nshuicao.cc\nshuichan.cc\nshuichan51.com\nshuichuyu.com\nshuidichou.com\nshuididabingchou.net\nshuidigongyi.com\nshuidiguanjia.com\nshuidihealth.com\nshuidihuzhu.com\nshuidihuzhu.net\nshuidike.com\nshuidiopen.com\nshuiditech.com\nshuidixy.com\nshuidyd.com\nshuifuhuanbao.com\nshuigongye.com\nshuiguo.com\nshuiguobang.com\nshuihulu.com\nshuijing100.com\nshuijingka.com\nshuijingwanwq.com\nshuijingwuyu.com\nshuijingyibai.com\nshuijinshunzhuang.com\nshuiku.cc\nshuiliangye.com\nshuiliantong.com\nshuiliaosheji.com\nshuiligroup.com\nshuilongtouapp.com\nshuimiao.net\nshuimofang.net\nshuimoshi.net\nshuimozhuan.net\nshuimui.com\nshuimujiaju.com\nshuimuyulin.com\nshuinfo.com\nshuini.biz\nshuionland.com\nshuipingce.com\nshuipo.com\nshuisj.com\nshuitexxkj.com\nshuitou001.com\nshuiwushi.com\nshuiwushi.net\nshuixin.tech\nshuiyaohuo.com\nshuiye.cc\nshuiyinbao.com\nshuiyinwang.com\nshuiyinyu.com\nshuiyinyun.com\nshuiyoucam.com\nshuiyugame.com\nshuiyuwenquan.com\nshuizhi360.com\nshuizhifenxi.com\nshuizhili.com\nshuizilong.com\nshujiangweike.com\nshujiariji.com\nshujike.com\nshuju.net\nshujuapi.com\nshujuba.net\nshujubang.com\nshujubo.com\nshujujishi.com\nshujulin.com\nshujupie.com\nshujutang.com\nshujuwa.net\nshujuxian1688.com\nshukeba.com\nshukeju.com\nshukemobile.com\nshukingfashion.com\nshukoe.com\nshukongwang.com\nshuku99.com\nshukuai.com\nshukuai.net\nshukuai3.com\nshukuajing.com\nshukuge.com\nshukun.press\nshukwai.com\nshulanapp.com\nshulanedu.com\nshulanhealth.com\nshulb.com\nshulex-voc.com\nshuliangtec.com\nshulidata.com\nshuling.vip\nshulink.com\nshuliyun.com\nshuma7.com\nshumaidata.com\nshumayin.com\nshumazhaopian.com\nshumeipai.net\nshumenol.com\nshumensy.com\nshumiao.com\nshumiimg.com\nshumilou.org\nshumo.com\nshun176.com\nshunanholding.com\nshunbangsaifu.com\nshunchangzhixing.com\nshunchaojinshu.com\nshuncom.com\nshundaoyun.com\nshunde-marathon.com\nshundecity.com\nshundehr.com\nshundeplus.com\nshunderen.com\nshunfalighting.com\nshunfangw.com\nshunfeng.cc\nshunguang.com\nshunhaiwang.com\nshunhejieshui.com\nshunhengkn.com\nshunhongny.com\nshunhualithium.com\nshunhuishou.com\nshunjing.xin\nshunjunys.com\nshunlitm.com\nshunmi.com\nshunnengnet.com\nshunnengoil.com\nshunqi.com\nshunscom.com\nshunshikj.com\nshunshunliuxue.com\nshuntian.cc\nshuntongtong.com\nshunwang.com\nshunwoit.com\nshunyagroup.com\nshunygroup.com\nshunyoubio.com\nshunyuwater.com\nshuoba.org\nshuobao.com\nshuobozhaopin.com\nshuocdn.com\nshuodedui.com\nshuoedu.com\nshuofangw.com\nshuohong.net\nshuoji1688.com\nshuojuchaxu.com\nshuoman.com\nshuomingshuku.com\nshuoshuojie.net\nshuoshuojuzi.com\nshuoshuokong.com\nshuoshuokong.org\nshuoshuomi.com\nshuoshuoxinqing.com\nshuowan.com\nshuozhiwu.com\nshupackaging.com\nshupaiyun.com\nshupeng.com\nshuqi.com\nshuqiandiqiu.com\nshuqiaozt.com\nshuqiapi.com\nshuqiread.com\nshuqireader.com\nshuqistat.com\nshuquge.com\nshuquge.la\nshuquta.com\nshuquxs.com\nshuquzw.la\nshuqw.com\nshuren100.com\nshushangai.com\nshushangyun.com\nshushihome.com\nshushindo.com\nshushubuyue.com\nshushubuyue.net\nshusw.com\nshutcm.com\nshuti.com\nshutong1680.com\nshutong5858.com\nshutonginfo.com\nshutu.cc\nshutwin.com\nshuwangxing.com\nshuwenxianyun.com\nshuwulou.com\nshuxiangmenhu.com\nshuxiangmuye.com\nshuxiayun.com\nshuxinsp.com\nshuxinyc.com\nshuxuehua.com\nshuxuejia.com\nshuxuejingwei.com\nshuxuet.com\nshuxueweb.com\nshuxueyingyong.com\nshuya-china.com\nshuyan-biotech.com\nshuyang.tv\nshuyangba.com\nshuye.com\nshuyeedu.com\nshuyeidc.com\nshuyfdc.com\nshuyong.net\nshuyuanchina.org\nshuyuewu.co\nshuyun.com\nshuzhi9.com\nshuzhiduo.com\nshuzhou.cc\nshuzibao.com\nshuzifuyu.com\nshuzigd.com\nshuzigonggao.com\nshuziguanxing.com\nshuzijihuo.com\nshuzilm.com\nshuzisharing.com\nshuzixiaoyuan.com\nshuzixindong.com\nshuziyuedong.com\nshuzong.com\nshwbs.org\nshwdbjgs.com\nshwdir.com\nshwebspace.com\nshweiqi.org\nshwexpo.com\nshwhl.com\nshwilling.com\nshwkwai.com\nshwoody.com\nshwpbbs.com\nshwpg.com\nshws.org\nshwsfy.com\nshwsg.net\nshwszdh.com\nshwtqx.com\nshwuji.com\nshwx.com\nshwxzf-tencentclb.cloud\nshwxzf-tencentclb.com\nshwxzf-tencentclb.net\nshwxzf-tencentclb.work\nshwxzfjpyzc-tencentclb.cloud\nshwxzfjpyzc-tencentclb.com\nshwxzfjpyzc-tencentclb.net\nshwxzfjpyzc-tencentclb.work\nshwyky.net\nshwzjt.com\nshwzoo.com\nshwzsh.com\nshx11.xyz\nshxaby.com\nshxayy.com\nshxbe.com\nshxcj.com\nshxcoal.com\nshxdnt.com\nshxgroup.net\nshxiaoran.com\nshxibank.com\nshxichina.com\nshxil.com\nshxinbodi.com\nshxincn.com\nshxinhua.net\nshxinping.net\nshxjkjt.com\nshxjycqxx.com\nshxkyy.com\nshxlpe.com\nshxmbzcl.com\nshxmhjs.com\nshxnetwork.com\nshxrcw.com\nshxrmtzx.com\nshxrmyy.com\nshxseer.com\nshxsj.com\nshxsjedu.com\nshxuanming.net\nshxuou.com\nshxwcb.com\nshxxyun.com\nshxy.net\nshxyou.com\nshyahs.com\nshyanke.com\nshyanpu.com\nshyaoxu.com\nshyclouds.net\nshycqf.com\nshydjscl.com\nshydxsy.com\nshyestar.com\nshyfci.com\nshygdz.com\nshyhgj.com\nshyhhema.com\nshyihuoh.com\nshyingt.asia\nshyirijian.com\nshyisai.com\nshykx.com\nshykz123456.com\nshylwlkj.com\nshymhk.com\nshyndec.com\nshyongci.com\nshyongwo.com\nshyongzeng.com\nshyouai.com\nshyoudao.com\nshyouhuan.com\nshyouth.net\nshypzx.com\nshyrcb.com\nshyrcw.com\nshyrcw.net\nshyrjt.com\nshysjt.com\nshyuanye.com\nshyueai.com\nshyueyanghospital.com\nshyuhuankj.com\nshyumin.net\nshyuwl.com\nshyuzhai.com\nshywly.com\nshyx-bio.com\nshyxhy.com\nshyxi5.com\nshyxwz.com\nshyy6688.com\nshyygh.com\nshyyp.net\nshyywz.com\nshyyy.com\nshyyyl.com\nshyz07.com\nshyzj.com\nshyzjsxh.com\nshyzsd.com\nshzaiguan.com\nshzbc.com\nshzbh.com\nshzbkj.com\nshzf.com\nshzfsy.com\nshzfzz.net\nshzgauto.com\nshzgd.org\nshzgt56.com\nshzh.net\nshzhanling.com\nshzhanmeng.com\nshzhiyingedu.com\nshzhongru.com\nshzhuran.com\nshzhyx.com\nshziyi.com\nshzjy.com\nshzkb.com\nshzkbc.com\nshzkbj.com\nshzkie.com\nshzkvalve.com\nshzkw.org\nshzm.org\nshzq.com\nshzrx.com\nshzs2013.com\nshzsgroup.com\nshzsun.com\nshzuibaichi.com\nshzunma.com\nshzxkq.com\nshzychem.com\nshzymp.com\nshzytzj.com\nshzyw.com\nshzzks.com\nsi-bao.com\nsi-en.com\nsi-era.com\nsi-in.com\nsi-win.com\nsi.cdn.dell.com\nsia1995.net\nsiad-c.com\nsiaedu.net\nsialiagames.com.tw\nsian.cc\nsiaoao.com\nsias-sha.com\nsiasun.com\nsiasuncare.com\nsibangde.com\nsibfi.com\nsibida.net\nsibinwave.com\nsibojin.com\nsibpt.com\nsibsnet.org\nsibuzyn.com\nsic8d.net\nsicarrier.com\nsicc.cc\nsicent.com\nsicheng.net\nsicher-elevator.com\nsichuan163.com\nsichuanair.com\nsichuanbh.com\nsichuanbojiesports.com\nsichuancancer.org\nsichuannpo.com\nsichuanyunzhan.com\nsichw.com\nsiciciyu.com\nsicimano.com\nsickcn.com\nsicosemi.com\nsicreat.com\nsid.cc\nsidande.com\nsidike.com\nsidlgroup.com\nsidri.com\nsidvc.com\nsiec-ccpit.com\nsiengine.com\nsienwater.com\nsieredu.com\nsieryun.com\nsif.com\nsifalu.com\nsifangbazhu.tech\nsifangclub.com\nsifanggroup.com\nsifangoa.com\nsifangvideo.com\nsifary.com\nsifayun.com\nsiff.com\nsifky.com\nsifou.com\nsig-am.com\nsigachem.com\nsigas-group.com\nsigchina.com\nsightp.com\nsiglent.com\nsiglff.com\nsigma.run\nsigmachip.com\nsigmamed.net\nsigmastarsemi.com\nsigmcdn.com\nsigmob.com\nsigmoblive.com\nsign-say.com\nsignage911.com\nsigncc.com\nsigndo.com\nsigninpod.com\nsigujian.com\nsihai-inc.com\nsihaidj.com\nsihaigongkao.com\nsihaishuyuan.com\nsihaitv.com\nsiheal.com\nsihociho.com\nsihonghui.com\nsihongjob.com\nsihongxian.com\nsihoo.com\nsihotels.com\nsihuanpharm.com\nsihui-electric.com\nsihuisoft.com\nsihuixiqu.com\nsihuiyiliao.com\nsihuizhongyi.com\nsiia-sh.com\nsiicenv-wuhan.com\nsiicfl.com\nsiicshc.com\nsiii.xyz\nsiilu.com\nsiixu.com\nsijiaomao.com\nsijijun.com\nsijinchuanbo.com\nsijiwater.com\nsijiweinong.com\nsikantech.com\nsikem.net\nsikiedu.com\nsikuwu.com\nsikuyi5838.asia\nsikuyun.net\nsilanggame.com\nsilasbuchanan.shop\nsildyn.com\nsileadinc.com\nsilenceper.com\nsilexmicro.com\nsilianmall.com\nsiliansensor.com\nsiliantecai.com\nsiliaobaba.com\nsiliaokelijixie.com\nsilicon-magic.com\nsilicongo.com\nsiliconvisionlabs.com\nsilikron.com\nsilinchen.com\nsiling.com\nsilingge.com\nsilique.com\nsilkpresent.com\nsilkroad-ec.com\nsilkroad24.com\nsilkroadtechnologies.com\nsilktrek.com\nsillumin.com\nsillydong.com\nsiloon.com\nsilucar.com\nsilucg.com\nsiludao.com\nsiluecai.com\nsiluke.cc\nsiluke.info\nsilukex.com\nsiluwu.com\nsilvmark.store\nsim800.com\nsimaek.com\nsimagic.com\nsimaguo.com\nsimanuo.com\nsimapple.com\nsimat-sh.com\nsimbajs.com\nsimcere.com\nsimcgroup.com\nsimchip.com\nsimcolux.com\nsimcom.com\nsimcomm2m.com\nsimcu.com\nsimei.cc\nsimei.vip\nsimei8.com\nsimengadx.com\nsimengqifu.com\nsimglo.com\nsimhaoka.com\nsimiam.com\nsimici3.com\nsimicloud.com\nsimij.com\nsimiki.org\nsimingkuai.com\nsimingtang.com\nsimkeway.com\nsimmtime.com\nsimochina.com\nsimon96.online\nsimope.com\nsimp.red\nsimperfect.com\nsimplecreator.net\nsimpledatas.com\nsimplexue.com\nsimpread.pro\nsimsci.net\nsimu-tech.com\nsimu800.com\nsimul-china.com\nsimullink.com\nsimulway.com\nsimuwang.com\nsimwe.com\nsimxhs.com\nsin-jiang-law.com\nsin0sites.com\nsina-cf.com\nsina.com\nsina.lt\nsina.net\nsinaapp.com\nsinacdn.com\nsinacloud.com\nsinacloud.net\nsinadaxue.com\nsinaedge.com\nsinaemc.com\nsinaft.com\nsinaimg.com\nsinalog.com\nsinaluming.com\nsinan.fun\nsinanet.com\nsinanya.com\nsinaquyong.com\nsinas3.com\nsinashow.com\nsinastorage.com\nsinasws.com\nsinauda.com\nsinawap.com\nsinawf.com\nsinbam.com\nsincerelyone.com\nsincetech.com\nsincetimes.com\nsinct.com\nsindsun.com\nsinepharm.com\nsinereal.com\nsinesafe.com\nsinesemi.com\nsineva-robot.com\nsineva.com\nsinf-test.net\nsinf.net\nsinflb.net\nsinforcon.com\nsinfotek.com\nsingaporepaya.com\nsingbon.com\nsingchy.com\nsingdown.com\nsingfosolar.com\nsingfun.com\nsinggnetworkcdn.com\nsinghead.com\nsinglecool.com\nsinglegraindatabiz.com\nsingmaan.com\nsingoo.cc\nsingpao.com\nsingse.com\nsingsun.net\nsingtaonet.com\nsingtown.com\nsingularity-ai.com\nsingularmedical.net\nsingulato.com\nsingworld.net\nsinictek.com\nsinitek.com\nsinldo.com\nsinlu.net\nsino-agri.com\nsino-composite.com\nsino-corrugated.com\nsino-cr.com\nsino-customs.com\nsino-epa.com\nsino-foldingcarton.com\nsino-gps.com\nsino-heavymach.com\nsino-info.net\nsino-life.com\nsino-manager.com\nsino-pharm.com\nsino-pigment.com\nsino-sfcc.com\nsino-tcm.com\nsino-trading.com\nsino-training.com\nsino-web.net\nsinoagentsh.com\nsinoancher.com\nsinoaqr.com\nsinoaquafilter.com\nsinoassist.com\nsinoassistance.com\nsinobaron.com\nsinobasalt.com\nsinobasedm.com\nsinobel.com\nsinobestbio.com\nsinobo.com\nsinobp.com\nsinobrook.com\nsinocache.net\nsinocare.com\nsinocars.com\nsinocax.com\nsinochem-guangdong.com\nsinochem-zhfl.com\nsinochem.com\nsinochemb2c.com\nsinochemehc.com\nsinochemintl.com\nsinochemitc.com\nsinochemjiangsu.com\nsinochemoilmarketing.com\nsinochempharma.com\nsinochip.net\nsinoclick.com\nsinocoalchem.com\nsinocopy.com\nsinodh.com\nsinodingcheng.com\nsinodis.com\nsinodrive.com\nsinoec.net\nsinoevin.com\nsinofarm.net\nsinofo.com\nsinofo.group\nsinofusite.com\nsinog2c.com\nsinogeo.com\nsinoglorygroup.com\nsinogslb.net\nsinogt.com\nsinohb.com\nsinohotel.com\nsinohowe.com\nsinohsc.com\nsinohx.com\nsinohydro.com\nsinoid.com\nsinoinfosec.com\nsinoing.net\nsinoinnovel.com\nsinoins.com\nsinointeractive.com\nsinoiov.com\nsinokap.com\nsinolease.com\nsinolinchem.com\nsinolinchemintl.com\nsinolines.com\nsinolion.net\nsinologyinstitute.com\nsinolub.com\nsinolube.com\nsinoluhong.com\nsinoma-suzhou.com\nsinomach-auto.com\nsinomachint.com\nsinomags.com\nsinomapping.com\nsinomaps.com\nsinomatech.com\nsinomatin.com\nsinomcu.com\nsinomep.com\nsinonet.org\nsinonsh.com\nsinontech.com\nsinoo.cc\nsinooceangroup.com\nsinooceanland.com\nsinopatho.com\nsinopec-usa.com\nsinopec.com\nsinopecgroup.com\nsinopecgx.com\nsinopechyzx.com\nsinopecnews.com\nsinopecpay.com\nsinopecsales.com\nsinopecsenmeifj.com\nsinopharm-fj.com\nsinopharm-fl.com\nsinopharm-gz.com\nsinopharm-henan.com\nsinopharm.com\nsinopharmdbj.com\nsinopharmholding.com\nsinopharmhospital.com\nsinopharmintl.com\nsinopharmlrt.com\nsinopharmsx.com\nsinopharmzl.com\nsinophex.com\nsinopipevalve.com\nsinopont.com\nsinopr.org\nsinoprinterparts.com\nsinoqy.com\nsinorda.com\nsinoreagent.com\nsinort.com\nsinorusfocus.com\nsinosam.com\nsinoshan.com\nsinosig.com\nsinosilica.com\nsinosms.com\nsinoss.com\nsinoss.net\nsinostargroup.com\nsinosteel.com\nsinosun.com\nsinosuntop.com\nsinotau.com\nsinotechline.com\nsinotf.com\nsinotide.com\nsinotn.com\nsinotone.net\nsinotph.com\nsinotrans.com\nsinotruk.com\nsinotrukinternational.com\nsinotrust-group.com\nsinoturning.com\nsinovale.com\nsinovast.com\nsinovatech.com\nsinovatio.com\nsinovationmed.com\nsinovationventures.com\nsinovel.com\nsinovoice.com\nsinowaycarbon.com\nsinowbs.com\nsinowbs.org\nsinowealth.com\nsinowealth.com.hk\nsinowel.com\nsinowheelbarrow.com\nsinowinfiber.com\nsinoxk.com\nsinoxlube.com\nsinozhongyuan.com\nsinozoc-ex.com\nsinreweb.com\nsinrey.com\nsinro.com\nsinsam.com\nsinsche.com\nsintaho.com\nsintaytour.com\nsintien.com\nsintoacct.com\nsintu.com\nsinture.com\nsinvofund.com\nsinvta.com\nsinyoung.site\nsinyuan.com\nsinyuee.com\nsinzk.com\nsiobp.com\nsiomxity.com\nsiomxity.net\nsipai.com\nsipaphoto.com\nsipatsaw.com\nsipcdc.com\nsipco.com\nsipedu.net\nsipedu.org\nsipeed.com\nsipgl-lcl.com\nsipgzct.com\nsiphrd.com\nsipingseo.com\nsipmsg.com\nsipo-sc.com\nsiposchina.com\nsipprh.com\nsipsenegal.org\nsipujy.com\nsipurd.com\nsiqiangame.com\nsiqiquan.org\nsiqxmg4256.vip\nsir3.com\nsir66.com\nsiranbio.com\nsireda.com\nsirenyouxiang.com\nsirfang.com\nsirweara.com\nsiryin.com\nsiscantech.com\nsiscmag.com\nsisder.com\nsisdown.com\nsisen.com\nsisensing.com\nsishui123.com\nsishuojixie.com\nsishuok.com\nsishuxuefu.com\nsisi-smu.org\nsisigad.com\nsisijiyi.com\nsisp-china.com\nsissiok.com\nsisuts.com\nsiswin.com\nsitande.com\nsitangtech.com\nsitc.com\nsite-digger.com\nsite119.com\nsiteapp-static.com\nsitejiu.com\nsitekc.com\nsiteonlinetest.com\nsithc.com\nsitiaoyu.com\nsitobiotech.com\nsitong.net\nsitongedu.org\nsitongzixun.com\nsitrigroup.com\nsitronics-sh.com\nsituationk.com\nsitudata.com\nsiud.com\nsivlab.com\nsiwaman.com\nsiweidaotu.com\nsiweiearth.com\nsiweikongjian.net\nsiweiw.com\nsiwuprint.com\nsix.club\nsixflower.com\nsixianchina.com\nsixiang.im\nsixianggangyin.com\nsixiju.com\nsixjoy.com\nsixstaredu.com\nsixu.life\nsixue.tech\nsixuexiazai.com\nsixunited.com\nsixyin.com\nsiyanhui.com\nsiyetian.com\nsiyi007.com\nsiyrcw.com\nsiyuan.cc\nsiyuan.me\nsiyuanedu.com\nsiyuanmall.com\nsiyuanren.com\nsiyuanyl.com\nsiyuhome.net\nsiyunyatwo.com\nsiyuweb.com\nsizebid.com\nsizeofvoid.net\nsizhicn.com\nsizuo.com\nsj-airpurge.com\nsj-hospital.org\nsj-lawyer.com\nsj-marathon.com\nsj-tmdi.com\nsj0763.com\nsj123.com\nsj33.net\nsj3g.com\nsj51.net\nsj6rgxtjg3tmb.com\nsj998.com\nsjawards.com\nsjaz.com\nsjbutton.com\nsjbyj.com\nsjcamzone.cc\nsjcomic.com\nsjcybz.com\nsjdongwang.com\nsjdshd.com\nsjdzp.com\nsjdzp.net\nsjebh.com\nsjetdz.com\nsjf029.com\nsjfcdn.com\nsjfh168.com\nsjfpro.com\nsjfzxm.com\nsjg8.com\nsjgle.com\nsjgo365.com\nsjgskaipiao.com\nsjhcip.com\nsjhfkhgut009.com\nsjhfrj.com\nsjhgo.com\nsjhl.cc\nsjhoffice.com\nsjhong.net\nsjhuatong.com\nsjhy.net\nsjhykt.com\nsjizx.com\nsjjob88.com\nsjjt001.com\nsjjzm.com\nsjkj.net\nsjlbearing.com\nsjlexpress.com\nsjlgc.com\nsjlhlawyer.com\nsjlvyou.com\nsjm-zdh.com\nsjm.life\nsjmao.net\nsjmdh.com\nsjmeigao.com\nsjmp3.com\nsjmwsw.com\nsjono.com\nsjooo.com\nsjpif.net\nsjpjyx.com\nsjq315.com\nsjqcj.com\nsjqmtlm.com\nsjrwzz.com\nsjsbk.com\nsjsei.com\nsjsgdzx.com\nsjsheji.com\nsjsrm.com\nsjsydq.com\nsjszt.com\nsjtickettech.com\nsjtm.me\nsjtug.org\nsjtusummer.org\nsjtxt.com\nsjtxt.la\nsjtype.com\nsjvi.net\nsjwec-tencentclb.cloud\nsjwec-tencentclb.com\nsjwec-tencentclb.net\nsjwec-tencentclb.work\nsjwj.com\nsjwl.xyz\nsjwt.net\nsjwtlm.com\nsjwx.info\nsjwyx.com\nsjxinxiwang.com\nsjxqn.com\nsjxs.la\nsjxtcw.com\nsjxydc.com\nsjxyit.com\nsjxysec.com\nsjxyx.com\nsjxzc.com\nsjy-art.org\nsjy2.com\nsjycbl.com\nsjyhotel.com\nsjyl.com\nsjysz.com\nsjyt.net\nsjytech.com\nsjyx.com\nsjyybz.com\nsjyyt.com\nsjyyy.com\nsjz-marathon.com\nsjz.cc\nsjz110.cc\nsjz44z.com\nsjz7.com\nsjzbasha.com\nsjzbwx.com\nsjzcfjd.com\nsjzcmw.com\nsjzez.com\nsjzfeitai.com\nsjzfls.com\nsjzgxwl.com\nsjzhr.com\nsjzhushou.com\nsjzjifeng.com\nsjzjinliulin.com\nsjzjkqgs.com\nsjzjtjt.com\nsjzkz.com\nsjzlg.com\nsjzlgz.com\nsjzmama.com\nsjznuanjieks.com\nsjzonline.com\nsjzpco.org\nsjzqcrl.com\nsjzrbapp.com\nsjzrmyz.com\nsjzshunbang.com\nsjzslnyhy.com\nsjzswtz.com\nsjzszz.com\nsjztd.com\nsjzthdz.com\nsjzxfy.com\nsjzxh.com\nsjzxtsh.com\nsjzxyy.com\nsjzyb.com\nsjzyes.com\nsjzys.com\nsjzysdz.com\nsjzysgz.com\nsjzyxh.com\nsjzyz.net\nsjzzbxh.com\nsjzzxmm.com\nsjzzyy.com\nsk163.com\nsk1999.com\nsk1z.com\nsk2w.net\nskatehere.com\nskcto.com\nskd6.com\nskd62.com\nskdj5.com\nskdlabs.com\nske.cc\nskeo.net\nsketchcn.com\nsketchupbar.com\nsketchupbbs.com\nskf-bearing.net\nskg.com\nskhb.com\nskidstorm.com\nskieer.com\nskimit.net\nskinjc.com\nskinme.cc\nskinpp.com\nskip-links.com\nskjcsc.com\nskl.net\nskland.com\nsklbce.org\nskldoor.com\nsklinux.com\nskmgc.com\nsknbj.com\nskomart.com\nskongmx.com\nskp-beijing.com\nskpssz.com\nskrskrskrskr.com\nsksdwl.com\nsksight.com\nskslfd.com\nskstravel.com\nskswz.com\nsktcdn.com\nsktecfibre.com\nsktfaker.com\nskuking.com\nskusoft.com\nskwfls.com\nskxox.com\nskxsj.com\nsky-deep.com\nsky-fire.com\nsky-ing.com\nsky-mobi.com\nsky123th.com\nsky1shop.com\nsky350.com\nskyai.tech\nskyallhere.com\nskyao.io\nskyapp1.tv\nskyard.com\nskyart.site\nskybility.com\nskybluek.com\nskybogroup.com\nskybright-group.com\nskycaiji.com\nskycedu.com\nskycham.com\nskycloudsoftware.com\nskycn.com\nskycn.net\nskycnc.com\nskycoleasing.com\nskycorp.com\nskydodi.com\nskydust.net\nskyeaglee.com\nskyecs.com\nskyee360.com\nskyfeather.online\nskyfollowsnow.pro\nskyfont.com\nskyfox.org\nskyhand.vip\nskyheng.com\nskyislets.com\nskyleon.com\nskylerzhang.com\nskymoons.com\nskymoons.net\nskymp4.cc\nskynan.com\nskynicecity.com\nskynj.com\nskype-china.net\nskype-tom.com\nskypixel.com\nskypuretech.com\nskyray-instrument.com\nskyray-water.com\nskyrelay-ic.com\nskyrichpower.com\nskyrivers.org\nskyrj.com\nskysea.com\nskysgame.com\nskysriver.com\nskysrt.com\nskyton123.com\nskyts.net\nskytv.cc\nskyue.com\nskyw.cc\nskywalkeryacht.com\nskywavewifi.com\nskywek.com\nskywellcorp.com\nskywldh.com\nskywork.ai\nskyworkcdn.com\nskyworth-ac.com\nskyworth-cloud.com\nskyworth-ea.com\nskyworth.com\nskyworthbox.com\nskyworthdigital.com\nskyworthdigitaliot.com\nskyworthds.com\nskyworthev.com\nskyworthiot.com\nskyworthlighting.com\nskyworthnj.com\nskyworthznxyj.com\nskyxinli.com\nskyxvpn.com\nskyyin.org\nskyzhan.com\nskznsb.com\nsl.al\nsl.fun\nsl.ink\nsl512.com\nsl916.com\nsl91d.com\nslaccas.com\nslagta.com\nslaidor.com\nslamtec.com\nslanissue.com\nslanmedia.com\nslatic.net\nslbauto.com\nslbiop.com\nslcad.com\nslchos.com\nslcyber.icu\nsldhc.com\nsldns1.com\nslduntong.com\nsle.group\nsleele.com\nsleepboy.com\nsleepwearinc.com\nslegetank.com\nslengy.com\nsleton.com\nslfwq.com\nslgegc.com\nslhwyy.com\nslicejobs.com\nslidestalk.com\nslingbearings.com\nslink8.com\nslinli.com\nsliun.com\nsljkj.com\nsljob88.com\nslk1.net\nslkg1949.com\nsllai.com\nsllngy.com\nsllssrq.com\nslodon.net\nsloer.com\nslofdoro.com\nslogra.com\nslot-china.com\nslot4.net\nslotb.vip\nslotph.vip\nslovakia-visacenter.com\nslovenia-visacenter.com\nslowdark.com\nslpi1.com\nslpm.net\nslpmg.com\nslrbs.com\nslreactor.com\nslready.com\nslshareservices.com\nslspcn.com\nslssx.com\nslsteel.com\nslswd.com\nslswx7.com\nsltg2019.com\nsltgj.com\nslthxx.com\nsltv.net\nsltxantonline.com\nsluyu.com\nslwh-dfh.com\nslwwedding.com\nslybjp.com\nslyld.com\nslyxmobi.com\nslzsxx.com\nslzww.com\nsm-check.com\nsm-cq.com\nsm-main.com\nsm0.fun\nsm160.com\nsm160.net\nsm3s.com\nsm597.com\nsm96596.com\nsmall-master.com\nsmallfighter.com\nsmalljun.com\nsmallpdfer.com\nsmallyuan.com\nsmarch.com\nsmarchit.com\nsmart-hengdi.com\nsmart-idc.net\nsmart-ptt.com\nsmart-rise.com\nsmart.com\nsmart2pay.com\nsmart365ol.com\nsmart400.com\nsmartautoclub.com\nsmartbgp.com\nsmartbunniemen.com\nsmartcar.zone\nsmartcarrace.com\nsmartchn.com\nsmartcity.team\nsmartcitysz.com\nsmartcloudcon.com\nsmartcom.cc\nsmartdeep.com\nsmartdeer.com\nsmartdeer.work\nsmartdot.com\nsmartedm.com\nsmarteredu.net\nsmartermicro.com\nsmartgaga.com\nsmarthey.com\nsmarthomecn.com\nsmarthuayan.com\nsmartisan.com\nsmartisanos.com\nsmartisantv.com\nsmartjoygames.com\nsmartlifein.com\nsmartlinkio.com\nsmartlinku.com\nsmartmad.com\nsmartmapx.com\nsmartmidea.net\nsmartmore.com\nsmartoct.com\nsmartont.net\nsmartpigai.com\nsmartpoweriot.com\nsmartqilu.net\nsmartroomcn.com\nsmarts-isoftstone.com\nsmartsenstech.com\nsmartsteps.com\nsmartstudy.com\nsmarttaixing.com\nsmartwebee.com\nsmartx-cn.com\nsmartx.com\nsmartxiantao.com\nsmartyao.com\nsmartyoke.com\nsmartyun8.com\nsmartzzx.com\nsmarun.com\nsmaryun.com\nsmasmj.com\nsmb956101.com\nsmbc-cardzj0.club\nsmbinn.com\nsmbxw.com\nsmc18.com\nsmc3s.com\nsmcalia.com\nsmcalib.com\nsmcbnokkiduran.com\nsmcbnokkihabak.com\nsmcbnokkirederc.com\nsmcec.com\nsmcic.net\nsmcsrj.com\nsmd-automation.com\nsmd88.com\nsmdcn.net\nsmdiban.net\nsmdmark.com\nsmdx.net\nsmdxx.com\nsme-cn.com\nsme8718.com\nsmebb.com\nsmec-cn.com\nsmedi.com\nsmei.net\nsmeia.net\nsmeiic.com\nsmemo.info\nsmeok.com\nsmetumen.com\nsmf1888.com\nsmfsgs.com\nsmfyun.com\nsmgpt.com\nsmgstar.com\nsmgstv.com\nsmgtech.net\nsmhsw.com\nsmhyplay.com\nsmianao.com\nsmianet.com\nsmic-sh.com\nsmicc.com\nsmicrobe.com\nsmics.com\nsmil888.com\nsmile2012.com\nsmileangelfoundation.org\nsmilec.cc\nsmilefil.com\nsmileyan.com\nsmilingwhitebear.com\nsmithcn.com\nsmjstcy.com\nsmkeji.com\nsmkgc.com\nsmkmake.com\nsmknow.com\nsmkxyjy.com\nsmlaw8.com\nsmlqcl.com\nsmmc.com\nsmmiki.com\nsmo-clinplus.com\nsmo-software.com\nsmoba.net\nsmobird.cc\nsmogfly.cloud\nsmogfly.club\nsmogfly.com\nsmogfly.net\nsmogflycloud.com\nsmogflycloud.net\nsmohan.net\nsmoothgroup.cc\nsmoreroll.com\nsmovie168.com\nsmowo.com\nsmpg888.com\nsmppw.com\nsmq.ltd\nsmqh.com\nsmrmyy.com\nsms18.com\nsms9.net\nsmsbao.com\nsmshos.com\nsmshx.com\nsmskb.com\nsmslk1.com\nsmslk2.com\nsmslkcoffee.com\nsmsot.com\nsmsvifv.com\nsmswgy.com\nsmswriter.com\nsmsyun.cc\nsmt-dip.com\nsmt.net\nsmt2000.com\nsmtcdn.com\nsmtcdns.com\nsmtcdns.net\nsmtchinamag.com\nsmtcl.com\nsmtdc.com\nsmtdwx.com\nsmthome.net\nsmtphub.org\nsmtro.com\nsmtsmt.com\nsmtso.com\nsmtsvs.com\nsmttouch.com\nsmtukuzy.com\nsmtul.com\nsmtvip.com\nsmtw.com\nsmtworld.com\nsmucdn.com\nsmudc.com\nsmuszh.com\nsmuszsh.com\nsmvip8.com\nsmwd.tech\nsmxdiy.com\nsmxgjj.com\nsmxin.com\nsmxr.com\nsmxrcw.net\nsmxs.com\nsmxyi.com\nsmxzls.com\nsmyfinancial.com\nsmyhvae.com\nsmynn.com\nsmyx.net\nsmyxxj.com\nsmyyhj.com\nsmyz.net\nsmzdm.com\nsmzdmimg.com\nsmzdwan.com\nsmzhongran.com\nsmzjy.cc\nsmzrmyy.com\nsmzsffb.com\nsmzy.com\nsn-epe.com\nsn12333.com\nsn180.com\nsn511.com\nsnack-show.com\nsnai.edu\nsnail.com\nsnail007.com\nsnailgame.net\nsnailovet.com\nsnailsleep.net\nsnailyun.com\nsnap-buy.com\nsnapany.com\nsnapemoji.net\nsnapgenshin.com\nsnaplabdevelop.com\nsnapp.ir\nsnapp.site\nsnapp.taxi\nsnappcloud.io\nsnappea.com\nsnapplay.com\nsnappmaps.ir\nsnaptube.app\nsnbcnyjt.com\nsnbiopharm.com\nsnbkf34.com\nsncoda.com\nsnctaa.com\nsnd-cia.com\nsnd-stig.com\nsnd-yy.com\nsnda.com\nsndcc.cc\nsndgroup.com\nsndhr.com\nsndks.com\nsndnt.com\nsndo.com\nsndvc.com\nsndzrg0.org\nsneac.com\nsneb3.com\nsnedu.com\nsneducloud.com\nsneia.org\nsnfic.com\nsnfox.com\nsnfzsw.com\nsngct.com\nsnh48.com\nsnhere.com\nsnhrm.com\nsnibe.com\nsniec.net\nsnieri.com\nsnimay.com\nsniuw.com\nsnjairport.com\nsnjbs.com\nsnjjiu.com\nsnjt.com\nsnkjol.com\nsnkshoe.com\nsnkyat.com\nsnltty.com\nsnlxgk.com\nsnmandarin.com\nsnmi.com\nsnmxzls.com\nsnnd.co\nsnoba.net\nsnobten.com\nsnodehome.com\nsnoone.com\nsnor-china.com\nsnowballfinance.com\nsnowballsecurities.com\nsnowballtech.com\nsnowbeasts.com\nsnowdream.tech\nsnowflake.pink\nsnowkey.com\nsnowlotusgroup.com\nsnowyimall.com\nsnpac.com\nsnps.tech\nsnptc.com\nsnrat.com\nsnren.com\nsnrtv.com\nsnrunning.com\nsns-china.com\nsnscz.com\nsnsfun.cc\nsnsfun.com\nsnsii.com\nsnsnb.com\nsnsqw.com\nsnssdk.com\nsnsyhg.com\nsnsyx.com\nsntba.com\nsnto.com\nsnuoen.com\nsnupg.com\nsnv1.com\nsnxw.com\nsnycloud.com\nsnynas.com\nsnyu.com\nsnzfj.net\nsnzhao.com\nsnzhny.com\nsnzsxh.com\nso.car\nso.com\nso03290koaq.com\nso03300koaq.com\nso04060koaq.com\nso04061koaq.com\nso123.com\nso126.com\nso50.com\nso666gslb.com\nso8848.com\nso9l.com\nsoapphoto.com\nsoar-chem.com\nsoargift.com\nsoarpower.com\nsoarwatch.com\nsoaryoof.com\nsoauto.com\nsobaidupan.com\nsobereva.com\nsobeycache.com\nsobeycloud.com\nsobeylingyun.com\nsobeylive.com\nsobili.com\nsobone.com\nsobot.com\nsobot.io\nsoboten.com\nsobute.com\nsocang.com\nsocay.com\nsoccerbar.cc\nsocchina.net\nsoche8.com\nsochengyi.com\nsochips.com\nsocial-touch.com\nsocialark.net\nsocialbasecustomercontent.com\nsocialbaseusercontent.com\nsocialbeta.com\nsocialjia.com\nsocialpls.com\nsocket.tw\nsocolar.com\nsocomic.com\nsocool-tech.com\nsocoologo.com\nsocotton.com\nsocpk.com\nsodalife.xyz\nsodamc.com\nsodao.com\nsodasoccer.com\nsodayang.com\nsodc8.com\nsodexo-cn.com\nsodhef.com\nsodig.com\nsodino.com\nsodion.net\nsodocloud.com\nsody123.com\nsoeasysdk.com\nsoeo.net\nsofa-webbing.com\nsofabiao.com\nsofan.one\nsofang.com\nsofangche.com\nsofasofa.io\nsofastack.tech\nsofeiya.net\nsofi-tech.com\nsofoo.com\nsofreight.com\nsoft128.com\nsoft2005.com\nsoft50.com\nsoft5566.com\nsoft568.com\nsoft6.com\nsoft778.com\nsoft8.net\nsoft808.com\nsoft8899.com\nsoftabc.com\nsoftbank.best\nsoftbanks.net\nsoftbar.com\nsoftbingo.net\nsoftdownd.com\nsoftgostop.com\nsofthome.cc\nsoftjinzhou.com\nsoftmall.net\nsoftrobottech.com\nsoftscdn.com\nsoftsz.com\nsofttest.com\nsoftware.download.prss.microsoft.com\nsoftwarechn.com\nsoftwarecn.com\nsoftweek.net\nsoftwhy.com\nsoftwincn.com\nsoftworker.com\nsofujinyu.com\nsofun.com\nsogaa.net\nsogalqd.com\nsogaokao.com\nsogeche.com\nsogo.com\nsogoke.com\nsogood360.com\nsogou-compress.com\nsogou-diskmgr.com\nsogou-inc.com\nsogou-inner.com\nsogou-kantu-pic.com\nsogou-kantu.com\nsogou-op.org\nsogou-pdf.com\nsogou-wallpaper.com\nsogou.com\nsogou.net\nsogoucdn.com\nsogoucdndl.com\nsogouimecdn.com\nsogowan.com\nsogw.cc\nsoharp.com\nsohfvx3149.vip\nsoho-yiming.com\nsoho3q.com\nsohoblink.com\nsohochina.com\nsohodd.com\nsohonow.com\nsohotask.com\nsohu\nsohu-inc.com\nsohu.com\nsohu.net\nsohuapps.com\nsohucs.com\nsohuhistory.com\nsohuiw.com\nsohunjug.com\nsohuns.com\nsohuora.com\nsohurdc.com\nsohusce.com\nsohuu.com\nsoicp.com\nsojex.net\nsojiang.com\nsojiang.net\nsojianli.com\nsojixun.com\nsojiyin.com\nsojoline.com\nsojson.com\nsojump.com\nsoke17.com\nsoken-sz.com\nsokoban.ws\nsokon.com\nsoku.com\nsokuba.com\nsokutu.com\nsokyotw.com\nsolaking.com\nsolanyun.com\nsolar-engine.com\nsolarbao.com\nsolarbe.com\nsolarbio.com\nsolarcare.com\nsolarchin.com\nsolareast.com\nsolarf.net\nsolaridc.com\nsolarspace.com\nsolarzoom.com\nsolasmat.com\nsoldeazy.com\nsoldierstory-toys.com\nsolelybio.com\nsolepic.com\nsoletower.com\nsoliao.com\nsolidifyk.com\nsolidigm-asdf.com\nsolidigm-nvme.com\nsolidigm-zxcv.com\nsolidot.org\nsolidstatelion.com\nsoliner.com\nsolipharma.com\nsolitaire47.com\nsolo-launcher.com\nsolochex.com\nsoloknight.xyz\nsolomath.com\nsolooncontrols.com\nsolosea.com\nsolotoon.com\nsolove.design\nsolsticeorbit.cfd\nsolution9.net\nsolvyou.com\nsom88.net\nsomacisgraphic.hk\nsomama.com\nsomamobi.com\nsomd5.com\nsomdom.com\nsomeabcd.com\nsomenchina.com\nsomenmian.com\nsomething8.com\nsometracking.com\nsomo.so\nsomode.com\nsomode.net\nsomsds.com\nsonbest.com\nsoncci.com\nsong001.com\nsongcn.com\nsongcwh.com\nsongduwuye.com\nsongguike.com\nsongguo.com\nsongguo7.com\nsongguobox.com\nsongguojiankang.com\nsonghaifeng.com\nsonghaoyun.com\nsonghaozhi.com\nsonghengnet.com\nsonghualan.com\nsonghuwan.com\nsongjiangjituan.com\nsongker.com\nsonglei.net\nsonglicnc.com\nsongmaogroup.com\nsongqinnet.com\nsongshanlab.com\nsongshitang.com\nsongshizhao.com\nsongshuai.com\nsongshudiandian.com\nsongshuhui.net\nsongshujiedan.com\nsongshushuo.com\nsongsongruanwen.com\nsongsongyingxiao.com\nsongsongyun.com\nsongtaox.com\nsongtasty.com\nsongtianlube.com\nsongtsam.com\nsongwang168.com\nsongxiaocai.com\nsongxiaojin.com\nsongxing.net\nsongyang.net\nsongyangcn.com\nsongyanjiaye.com\nsongyi.net\nsongyongzhi.com\nsongyuan163.com\nsongyuan58.com\nsongyuanlove.com\nsongyuanshuisi.com\nsongzhaopian.com\nsongzi100.com\nsongziren.com\nsongzixian.com\nsonhoo.com\nsonhoshin.com\nsonicmodel.net\nsonicrhino.cc\nsoniu.net\nsonkwo.com\nsonkwo.hk\nsonoscapebrasil.com\nsonoschina.com\nsontan.net\nsonybbs.com\nsonyong.com\nsonyselect.net\nsoo56.com\nsooal.com\nsooauto.com\nsoocang.com\nsoochowchem.com\nsoocor.com\nsoodao.com\nsooele.com\nsoofel.com\nsoogf.com\nsoogif.com\nsoohaid.com\nsoojs.com\nsooker.com\nsoolinen.com\nsoolou.net\nsoolun.com\nsoomal.com\nsoon.guru\nsoonku.net\nsoonv.com\nsoonwill.com\nsoonyo.com\nsooopu.com\nsooopu.org\nsoopat.com\nsoopay.net\nsooroo.com\nsooshong.com\nsooshu.net\nsoosmart.com\nsoosox.com\nsootmoor.com\nsootoo.com\nsootool.net\nsoovalve.com\nsoovvi.com\nsooxie.com\nsooxue.com\nsooyooj.com\nsoozhu.com\nsoozhuozhou.com\nsopaidea.com\nsoperson.com\nsophgo.com\nsophgo.vip\nsophnet.com\nsopic.org\nsopowcore.net\nsoq.com\nsoqicrm.com\nsoqqq.com\nsoquano.com\nsorftime.com\nsoripan.net\nsorswitch.com\nsortdoor.com\nsos919.com\nsosaf.com\nsosdx.com\nsosg.net\nsoship.com\nsoshoo.com\nsoso.com\nsosoba.org\nsosobtc.com\nsosoled.com\nsosolight.com\nsosomp.com\nsosonc.com\nsosonsk.com\nsosoo.net\nsosorank.com\nsososnap.com\nsososteel.com\nsosotec.com\nsosoyunpan.com\nsosoyy.com\nsosuo.name\nsosyao.com\nsotake.com\nsotemall.com\nsothink.com\nsotongwang.com\nsotouv.com\nsotoy.net\nsotu114.com\nsotunet.com\nsou-yun.com\nsou.com\nsou58.com\nsoua.com\nsouaiche.com\nsouajki.com\nsouajki.net\nsoubao.net\nsoucai.com\nsoucangjie.com\nsouche-fin.com\nsouche-inc.com\nsouche.com\nsoucod.com\nsoudao.com\nsoudoc.com\nsoudron.com\nsouduanzu.com\nsoueast-motor.com\nsouebao.com\nsoufair.com\nsoufang.com\nsoufang998.com\nsoufun.com\nsoufunimg.com\nsouge.cc\nsouget.com\nsougou.com\nsougu001.com\nsouha.net\nsouho.cc\nsouho.net\nsouiaico.com\nsouid.com\nsouidc.com\nsouidc.org\nsoukecheng.net\nsoukuyou.com\nsoulapp.me\nsoulgame.mobi\nsoulsky.net\nsoulteary.com\nsoulu365.com\nsouluo.net\nsouluojie.com\nsouluopai.com\nsoulwonderland.com\nsound-force.com\nsoundai.info\nsoundconch.com\nsoundems.com\nsoundgroup.com\nsoundnybio.com\nsoundpeats.com\nsoundstay.com\nsoupan.info\nsoupf.net\nsoupin.com\nsoupingguo.com\nsoupu.com\nsoupv.com\nsouqian.com\nsouqiantu.com\nsouqiu8.com\nsour-lemon.com\nsource.tutorabc.com\nsource3g.com\nsourcecodebeat.com\nsourcecodecap.com\nsourcecodeserver.com\nsourcegcdn.com\nsourcelandchina.com\nsoushai.com\nsousou.com\nsousou.pro\nsousoudus.com\nsousuoshidai.com\nsousuotu.com\nsouthbeauty.com\nsouthbeautygroup.com\nsouthchip.com\nsouthcn.com\nsouthei.com\nsouthernfund.com\nsouthernmindict.net\nsouthernpec.com\nsouthgis.com\nsouthmoney.com\nsouthnews.cc\nsouthnews.net\nsouthseagy.com\nsouthsurvey.com\nsouthyule.com\nsoutiyun.com\nsoutudi.so\nsoutushenqi.com\nsouvi.com\nsouvr.com\nsouwuxing.com\nsouxia.com\nsouxue8.com\nsouxuexiao.com\nsouxw.com\nsouya.com\nsouyidai.com\nsouyue.mobi\nsouyue.vip\nsouyunku.com\nsouyute.com\nsouziti.com\nsov2ex.com\nsovell.com\nsoven.com\nsowang.com\nsoweather.com\nsowellwell.com\nsowin.com\nsowotech.com\nsowu.com\nsoxpai.com\nsoxyc.com\nsoya-protein.com\nsoyim.com\nsoyixia.net\nsoyiyuan.com\nsoyjg.com\nsoyo-dg.com\nsoyohui.com\nsoyoung.com\nsoyouso.com\nsoyunion.com\nsoyx123.com\nsozdata.com\nsozhe.com\nsozhen.com\nsozyb.com\nsp.cc\nsp168.com\nsp588.cc\nsp588.net\nsp888.net\nsp910.com\nspace1688.com\nspacechina.com\nspaceestar.com\nspacei.net\nspacemit.com\nspacesystech.com\nspacety.com\nspamc.com\nspanishknow.com\nsparenode.com\nspark-page.com\nspark-page0.com\nspark-page1.com\nspark-page2.com\nspark-page3.com\nspark-page4.com\nspark-page5.com\nspark-page6.com\nspark-page7.com\nspark-page8.com\nspark-page9.com\nspark4y.com\nsparkdeep.com\nsparkeduapi.com\nsparkeducdn.com\nsparkgis.com\nsparkletour.com\nspasvo.com\nspawor.com\nspay365.com\nspbao.com\nspbo.com\nspbycdn.biz\nspbycdn.com\nspbycdn.info\nspc365.com\nspcc-cn.com\nspcc-silk.com\nspccmc.com\nspcdntip.com\nspcdntipbak.com\nspcywang.com\nspdbh5.com\nspdbuser.com\nspdcat.com\nspddir.com\nspdex.com\nspdiy.com\nspdl.com\nspdydns.com\nspdyidea.com\nspeakout.hk\nspecchemind.com\nspecialcdnstatus.com\nspectorfilm.com\nspectrafusion.cfd\nsped-ssss-pppp-eeee-dddd.com\nspeechless.pw\nspeed-hz.com\nspeedaf.com\nspeedcdns.com\nspeedcdns.info\nspeedcdns.org\nspeedmanager.net\nspeednt.com\nspeedpdf.com\nspeedsz.net\nspeedws.com\nspeedws.info\nspeedws.org\nspeedzonerc.com\nspeiyou.com\nsperogenix.com\nspfbiotech.com\nspforum.net\nspfosd.com\nspg-ls.com\nspgacmotorsc.com\nspgcw.com\nspgykj.com\nsph00852.com\nsphcchina.com\nsphchina.com\nsphkids.com\nsphmc.org\nsphsine.com\nspibj.com\nspic-coalcg.com\nspicaceshi.asia\nspiccq.com\nspicescn.com\nspicezee.com\nspicgx.com\nspicgxnp.com\nspicgz.com\nspicjs.com\nspiiker.com\nspin-view.com\nspiritframe.org\nspirithy.com\nspischolar.com\nspiwcn.com\nsplaybow.com\nsplayer.work\nspldlkj.com\nsplendecor.com\nsplmcn.com\nspmcn.com\nspnchinaren.com\nspochikj.com\nspoience.com\nspointdesign.com\nsporposten.today\nsport-syy.com\nsportman.cc\nsportnanoapi.com\nsportq.com\nsports-100.com\nsportsdt.com\nsporui.com\nspoto.net\nspotpear.com\nspouyashop.com\nspph-sx.com\nspplnet.com\nspprec.com\nspr-atm.com\nsprayv.com\nsprda.org\nspreadtrum.com\nspreton.com\nspring-mall.com\nspring4all.com\nspring56.com\nspringairlines.com\nspringcocoon.com\nspringpharma.net\nspringtour.com\nspringx.fun\nsprint-tech.com\nsprixin.com\nspsb114.com\nspsicloudport.com\nspsisctgroup.com\nspsisncl.com\nspsy.org\nsptcc.com\nsptccn.com\nspthome.com\nsptv-1.com\nspug.cc\nspvtime.com\nspwj.com\nspxgas.net\nspyouxi.com\nspzb.com\nspzp.com\nspzs.com\nsq-ks.com\nsq-newstar.com\nsq.cc\nsq1996.com\nsq23.com\nsq521.com\nsq523.com\nsq580.com\nsq581.com\nsqa-chn.com\nsqage.com\nsqchunqiu.com\nsqdaily.com\nsqeatin.com\nsqezz.com\nsqfcw.com\nsqfgc.com\nsqgg.cc\nsqggzy.com\nsqgwh.com\nsqhec.com\nsqhx.com\nsqis.com\nsqj-jiuyousport.com\nsqj888.com\nsqjk123.com\nsqjrc.com\nsqjsxy.com\nsqjt.com\nsqjtcy.com\nsqjvx.org\nsqkb.com\nsqklrq.com\nsql110.com\nsqlpub.com\nsqlsec.com\nsqluck.com\nsqmarathon.com\nsqmn666.com\nsqphb.com\nsqqmall.com\nsqqmtj.com\nsqqnh.org\nsqrc.net\nsqrcw.com\nsqreader.com\nsqrsks.com\nsqrtthree.com\nsqrush.com\nsqs373.com\nsqshmzx.net\nsqsjt.net\nsqstudio.com\nsqswjt.com\nsqsyy.com\nsquare16.org\nsquarecn.com\nsquarefong.com\nsquirrelboiler.com\nsqwenhua.com\nsqxww.com\nsqyai.com\nsqyhw.com\nsqzjg.com\nsqzs.com\nsqzw.com\nsqzyxy.com\nsr-139.com\nsrcb.com\nsrcbcz.com\nsrcbeijing.com\nsrccdn.com\nsrccdn2.com\nsrcge.com\nsrcgsre.com\nsrcmsh.com\nsrcqeece.com\nsre.ink\nsrell.com\nsrfip.com\nsrgnmsrg.com\nsrgow.com\nsriappalam.com\nsribs.com\nsric.fun\nsrichina.org\nsrici.com\nsritsoft.com\nsrixon-china.com\nsrlfl.com\nsrlzzp.com\nsrmyy.com\nsrrcw.com\nsrrsh.com\nsrrtvu.com\nsrschool.net\nsrslyy.com\nsrsq.club\nsrt365.com\nsrtong.com\nsrun.com\nsrvbus.com\nsrw00.com\nsrworld.net\nsrx3.net\nsrxiayunbusiness.com\nsrxww.com\nsrxzz.com\nsrygz.com\nsrzc.com\nsrzdq.com\nsrzx.com\nsrzx100.com\nsrzxjt.com\nss-ceo.com\nss-smartech.com\nss03.net\nss1969.com\nss2007.com\nss246.com\nss256.com\nss28.com\nss8899888.com\nssalegs.store\nssaocorp.com\nssawhotels.com\nssaxx.com\nssaya.win\nssbbww.com\nssbgzzs.com\nssbifen.com\nssbjf.com\nssbjsy.com\nssbx.me\nssby.cc\nssby66.com\nssc-mcc.com\nsscanmou.com\nsscefsol.com\nsscejia.com\nsscha.com\nsschengtou.com\nsscity.org\nsscms.com\nsscmwl.com\nsscom.vip\nssctp.com\nsscy.net\nssdaex.com\nssdata.com\nssdax.com\nssdfans.com\nssdp.com\nssdzg.com\nsseinfo.com\nssf.cc\nssfb86.com\nssfei.com\nssfetsz.org\nssffx.com\nssfqsfvd.com\nssgedm.com\nssgeek.com\nssgsemi.com\nssgz.com\nsshr.net\nssia.cc\nssidc.net\nssidc.org\nssine.cc\nssine.ink\nssipex.com\nssis.asia\nssish.com\nssjj2.com\nssjjss.com\nssjjtt.com\nssjlicai.com\nssjljk.com\nssjytc.com\nssjyxx.com\nsskc360.com\nsskgame.com\nsskoo.com\nssky123.com\nssl-zs.cc\nsslaaa.com\nsslad.com\nsslawy.com\nsslceshi.com\nsslchaoshi.com\nsslchina.com\nsslcity.com\nssldun.com\nssldun.vip\nssleye.com\nsslibrary.com\nsslnode.com\nsslso.com\nssltgm.com\nssmc-sz.com\nssmchina.org\nssmec.com\nssmedic.com\nssmept.com\nssmys.com\nssmysh.com\nssnewyork.com\nssnm.xyz\nssnuo-ch.com\nssofair.com\nssoffo.com\nssoouu.com\nssp.group\nsspaas.com\nsspai.com\nsspai.me\nsspeeddns.com\nsspjizb.com\nssports.com\nssports.net\nssptqt.com\nssqgx.com\nssqtt.com\nssqzj.com\nssrcdn.com\nssrcr.com\nssreader.com\nssrjzs.com\nssrlzy.net\nsss.wiki\nsss348499.com\nsss437942.com\nsss495830.com\nsss850697.com\nssscdn.com\nsssch.net\nssses.net\nssslgs.com\nsssmro.com\nsssmy.com\nssso.com\nsst-ic.com\nsst-sd.com\nsst-sz.com\nsstlp.com\nssuip.com\nssw777734dh1.shop\nsswater.com\nsswchina.com\nsswl315.com\nssws.tv\nssxcycy.com\nssxf.net\nssxjd.com\nssxpxjt.com\nssxx.site\nssxxp.com\nssyapi.com\nssyar.com\nssycw.com\nssydt.com\nssyer.com\nssyssf.com\nssywh.com\nssyxlx.com\nssyxmall.com\nssyzx.net\nsszgit.com\nsszhg.com\nsszjnc.com\nsszsj.cc\nst-jzx.com\nst-recovery.com\nst.dl.pinyuncloud.com\nst001.com\nst12121.net\nst123.com\nst180.com\nst3tzmp6gg.work\nstaarphewas.org\nstacf.com\nstachina.org\nstackboom.xin\nstackcc.com\nstackoom.com\nstackoverflow.club\nstackoverflow.wiki\nstage1st.com\nstage3rd.com\nstaginfo.com\nstaidson.com\nstandard-groups.com\nstandardcn.com\nstandardshop.net\nstandardsofchina.com\nstandteam.net\nstanlyview.com\nstaofchina.com\nstapharma.com\nstar-charge.com\nstar-elink.com\nstar-engine.com\nstar-kid.com\nstar-linear.com\nstar-meeting.com\nstar-new-material.com\nstar-river.com\nstar365.com\nstar7game.com\nstar7th.com\nstar8.net\nstararc-coating.com\nstarbaby.cc\nstarbaby.com\nstarbaysoft.com\nstarcharge.com\nstardata360.com\nstarde.net\nstardict.net\nstardict.org\nstards.com\nstardust2000.com\nstarduster.me\nstarfishcloud.com\nstarfivetech.com\nstargame.com\nstarhalo.mobi\nstaringos.com\nstarkai.com\nstarkettle.com\nstarlakelab.com\nstarlink.uno\nstarlu.com\nstarm.cc\nstarming.com\nstarooo.com\nstarpainters.net\nstarpiao.com\nstarrails.com\nstarrevs.com\nstarrockinvest.com\nstarrtc.com\nstarrydyn.com\nstarryfrp.com\nstarrymed.com\nstarrysurvey.com\nstars-one.site\nstarschina.com\nstarscube.com\nstarsharbor.com\nstarsino.com\nstarsmicrosystem.com\nstarsshine1.com\nstarstech.cc\nstarswar.org\nstartcarlife.com\nstartcatcher.com\nstartcomca.net\nstartdt.com\nstartech.ltd\nstarting2000.com\nstartogether1.com\nstartos.com\nstartos.org\nstartup-partner.com\nstarwarschina.com\nstarway.net\nstarwaycomm.com\nstarworldgames.com\nstarworldmacau.com\nstarwsn.com\nstarxn.com\nstaryea.com\nstat-nba.com\nstat08.com\nstat18.com\nstatic.cdnetworks.com\nstatic.eprintsw.com\nstatic.tripcdn.com\nstatic163.net\nstaticaa.com\nstaticdn.net\nstaticec.com\nstaticfile.net\nstaticfile.org\nstatickksmg.com\nstatics.cc\nstaticsdd.com\nstaticsoe.com\nstaticsoem.com\nstaticswin.com\nstationpc.com\nstatsinstall.xyz\nstatuslarkoffice.com\nstay-bullish.com\nstaybrowser.com\nstaycu.com\nstbieshu.com\nstboy.com\nstbs100.com\nstc2002.com\nstcaimcu.com\nstcfa.org\nstcfile.com\nstcmcu.com\nstcmcudata.com\nstcmih.com\nstcn.com\nstcy168.com\nstcyzls.com\nstdaily.com\nstdard.com\nstdhgd.com\nstdicloud.com\nstdlibrary.com\nstdmm.org\nstdout.pub\nstdwp.com\nste56.com\nstea2008.com\nsteam302.xyz\nsteambig.com\nsteamboxs.com\nsteamchina.com\nsteamcn.com\nsteamdd.com\nsteamdt.com\nsteamgift.site\nsteamhost.info\nsteammm.com\nsteampp.net\nsteamproxy.net\nsteampy.com\nsteamrepcn.com\nsteamxdf.com\nstec.net\nstecn.org\nstedu.net\nsteel-mate.com\nsteel-spot.com\nsteeljs.com\nsteelkey.com\nsteelphone.com\nsteelsearcher.com\nstefg.org\nstegameskins.com\nsteinberg-cn.com\nstelinno.com\nstellarplayer.com\nstemceltech.com\nstep-by-step.tech\nstep-motor.com\nstepelectric.com\nstepsigriner.com\nstereorise.com\nsteriguardmed.com\nstexc.online\nstfile.com\nstg8.com\nstgiantfilms.com\nstgowan.com\nsthforme.com\nsthfsteel.com\nsthifi.com\nsthke.com\nsthospital.com\nsticksgame.com\nstjinfa.com\nstjinguan.com\nstjjxh.com\nstkfanli.com\nstklt.com\nstlb520.com\nstmaoyi.com\nstmbuy.com\nstmjsociety.com\nstmybj.com\nstnn.cc\nstnts.com\nsto-express.com\nstocke.com\nstockhn.com\nstockradar.net\nstockren.com\nstockstar.com\nstockwei.com\nstofund.org\nstointl.com\nstojf.com\nstone139.com\nstone168.com\nstone365.com\nstonebtb.com\nstonebuy.com\nstoneios.com\nstoneleague.com\nstoneo2o.com\nstonepoll.com\nstonepoll.net\nstonescloud.com\nstonesm.com\nstoneu.com\nstonexp.com\nstor-age.com\nstor-helper.com\nstorage-asset.msi.com\nstorcezon.com\nstore12.com\nstoreapi.net\nstorecorefulfillment.download.prss.microsoft.com\nstoreedge.microsoft.com\nstoreedgefd.dsx.mp.microsoft.com\nstorkapp.me\nstormorai.com\nstory520.com\nstoryboardworld.com\nstoryren.com\nstosolution.com\nstourweb.com\nstourweb.net\nstovol.club\nstoyard.com\nstpolice.com\nstpos.net\nstqiyuan.com\nstql.com\nstql.org\nstr-mo.com\nstraitchain.com\nstrategy-sight.com\nstray-soul.com\nstreamax.com\nstreamaxtech.com\nstreamcomputing.com\nstreamlakeapi.com\nstreffy.com\nstrinova.com\nstrong-light.com\nstrong-study.com\nstrongfc.com\nstrongflc.com\nstrongled.com\nstshuizhi.com\nstsmt.com\nstssugar.com\nstswjx.com\nstszcm.com\nstt-bearing.com\nsttanso.com\nsttcq.com\nsttry.com\nstu-lab.com\nstu-works.com\nstu51.com\nstubbornhuang.com\nstuda.net\nstudentboss.com\nstudioartiz.com\nstudstu.com\nstudy-cloud.com\nstudy163.com\nstudyems.com\nstudyez.com\nstudyfor.work\nstudyfr.net\nstudyget.com\nstudygolang.com\nstudyhub.fun\nstudyingtours.com\nstudypay.com\nstudyquicks.com\nstudytime.xin\nstudyuser.com\nstudyvip.com\nstuhome.net\nstuhui.com\nstuky.net\nstulip.org\nstuliving.com\nstuln.com\nstunnel.vip\nstupid77.com\nstupidet.com\nstuq.com\nsturgeonnews.com\nstutimes.com\nstvf.com\nstvgame.com\nstwj.com\nstwyxh.com\nstxfjs.com\nstxsw.com\nstylecdn.com\nstylechina.com\nstyles-sys.com\nstzc.com\nstzzx.com\nsu-jiao.com\nsu-long.com\nsuaee.com\nsuan5.com\nsuanbanyun.com\nsuanchang.com\nsuandao.com\nsuanguaju.com\nsuanjiayun.com\nsuanjuzi.com\nsuanpin.com\nsuanst.com\nsuansuangua.com\nsuanya.com\nsuapp.me\nsuawin.com\nsubangjia.com\nsubaonet.com\nsubaoxw.com\nsubaru-li.org\nsubeiflower.com\nsubelf.net\nsubingkang.com\nsubinwechat.com\nsubline.org\nsubo.net\nsubom.net\nsubond.com\nsubuy.com\nsucai.com\nsucai77.com\nsucai999.com\nsucaibar.com\nsucaidao.com\nsucaifu.com\nsucaijiayuan.com\nsucaijishi.com\nsucainiu.com\nsucaiplus.com\nsucaisucai.com\nsucaitu.cc\nsucaiw.com\nsuccess001.com\nsuccesshr.com\nsuccez.com\nsucdri.com\nsuch-game.com\nsuchasplus.com\nsuchengmeizhan.com\nsuchugao.com\nsucjg.com\nsucop.com\nsucoupon.com\nsudaizhijia.com\nsudaoa.com\nsudasuta.com\nsudawuye.com\nsuddenfix.com\nsudecoating.com\nsudoinfotech.com\nsudu-67ph.com\nsudu-72ub.com\nsudu-ab6h.com\nsudu-by4e.com\nsudu-du9k.com\nsudu-kay6.com\nsudu-me6n.com\nsudu-pq2y.com\nsudu-q6wk.com\nsudu-r8gh.com\nsudu-sq56.com\nsudu-tf42.com\nsudu-xu9b.com\nsudu-y94k.com\nsudu123.net\nsuducha.com\nsududa.com\nsudundns.com\nsudupower.net\nsudusite.com\nsuease.com\nsuemor.com\nsueon.com\nsufachina.com\nsufangxu.com\nsufeinet.com\nsufoma.com\nsufont.com\nsufybkt.com\nsufycdn.com\nsugaov.com\nsugar5.club\nsugarall365.com\nsugarenergy.com\nsugarguo.com\nsugarle.com\nsugessofficial.com\nsugon.com\nsugou.com\nsuguangxx.com\nsugwedding.com\nsuhaoyy.com\nsuhedj.com\nsuhedz.com\nsuhergroup.com\nsuhuishou.com\nsui.com\nsui.me\nsuibao-jiaozhu.com\nsuibao.com\nsuibiji.com\nsuibo.org\nsuiji123.com\nsuijinetworks.com\nsuijunlaowu.com\nsuilengea.com\nsuileyoo.com\nsuimeng.la\nsuinikan.com\nsuiningwang.com\nsuiniyi.com\nsuiqiao.com\nsuirui.com\nsuishenyun.net\nsuishouji.com\nsuishouxie.com\nsuishouzj.com\nsuisuihu.com\nsuisuijiang.com\nsuitaichem.com\nsuitdaily.com\nsuiunited.com\nsuixianwang.net\nsuixin8.com\nsuixingpay.com\nsuixinzulin.com\nsuixkan.com\nsuixw.com\nsuiyichong.com\nsuiyifa.com\nsuiyiju.com\nsuiyuanjian.com\nsuizhoushi.com\nsuizui.net\nsujh.net\nsujia.cc\nsujiagroup.com\nsujiao1668.com\nsujw.com\nsujx.net\nsukean.com\nsukeler.com\nsukeyun.com\nsuki.club\nsuki.moe\nsukimon.me\nsukiu.net\nsukkaw.com\nsukneyu.com\nsukoshi.xyz\nsukoutu.com\nsukvm.com\nsulabs.net\nsulaixue.com\nsulamp.com\nsulandscape.com\nsuleapi.com\nsuliaodingzhi.com\nsuliaojian.com\nsulicn.com\nsulitui.com\nsuluf.com\nsulvwenhua.com\nsumaart.com\nsumaarts.com\nsumapay.com\nsumatang.com\nsumavision.com\nsumcl.com\nsumec.com\nsumedu.com\nsumeme.com\nsumer.work\nsumgotea.com\nsumian.com\nsumiao.net\nsumiaowang.com\nsumibuy.com\nsumkoo.com\nsumkoo.net\nsumly.net\nsummall.com\nsummercampschina.com\nsummerfarm.net\nsummerlight.com\nsummerlight.name\nsummerpalace-china.com\nsummitpharmachina.com\nsummitviewcapital.com\nsumoon.com\nsumrday.net\nsumscope.com\nsumuda.tech\nsumwin.com\nsumzc.com\nsumzi.com\nsun-ada.net\nsun-coo.com\nsun-create.com\nsun-feel.com\nsun-hua.com\nsun-park.com\nsun-wish.com\nsun0769.com\nsun0769ns.com\nsun0816.com\nsun66.net\nsuna-opto.com\nsunaas.com\nsunacctg.com\nsunalytools.com\nsunari17.com\nsunasia.com\nsunbelife.com\nsunbl.com\nsunbloger.com\nsunbo.com\nsunbo367.com\nsunborngame.com\nsunbowhospital.com\nsunboxsoft.com\nsunboyu.com\nsuncereltd.com\nsuncjm.com\nsundan.com\nsundaydragon.com\nsundayvision.net\nsundns.com\nsundray.com\nsunear.net\nsunease.net\nsunemc.com\nsuner.cc\nsunera-cn.com\nsunergyworks.com\nsunflowerscf.com\nsunfounder.cc\nsunfreight-logistics.com\nsunfront.com\nsunft.com\nsungainyeast.com\nsungari1995.com\nsungent.com\nsungesoft.com\nsungine.com\nsunglow-tec.com\nsungoal.org\nsungoedu.com\nsungroup-energy.com\nsungshu.com\nsunhan.vip\nsunhante.com\nsunhepower.com\nsunhongs.com\nsunhospital.net\nsunhuhotel.com\nsuninf.net\nsuninfo.com\nsuning.com\nsuningbank.com\nsuningcdn.com\nsuningcloud.com\nsuningdns.com\nsuningestate.com\nsuninggslb.net\nsuningholdings.com\nsuninghotels.com\nsuningmail.com\nsuningpay.com\nsuningyunyou.com\nsunjex.com\nsunjiadai.xyz\nsunjianjian.com\nsunjs.com\nsunkeydata.com\nsunland.vip\nsunlandlaw.com\nsunlands.com\nsunlandstudy.com\nsunlandvip.com\nsunlandzk.com\nsunleader.net\nsunlife-everbright.com\nsunlight-tech.com\nsunlogging.com\nsunlogin.com\nsunlogin.net\nsunlons.com\nsunlordinc.com\nsunlune.com\nsunmarr.com\nsunmeihotel.com\nsunmen.com\nsunmi.com\nsunmingxia.com\nsunmmio.com\nsunmmm.com\nsunmnet.com\nsunmoonepe.com\nsunnatech.com\nsunnercn.com\nsunnergp.com\nsunnsoft.com\nsunny90.com\nsunnyaiot.com\nsunnychina.com\nsunnyfly.com\nsunnyhaitai.com\nsunnyhf.com\nsunnylab.work\nsunnylawyer.com\nsunnyms.com\nsunnyoptical.com\nsunnyos.com\nsunnyplas.com\nsunnypure.com\nsunnyqi.com\nsunnysemi.com\nsunnyxx.com\nsunocean.life\nsunofbeaches.com\nsunofus.org\nsunon-china.com\nsunon-power.com\nsunonln.com\nsunorensolar.com\nsunorlng.com\nsunowe.com\nsunowo.com\nsunpala.com\nsunpapergroup.com\nsunpeed.com\nsunpowergroup.biz\nsunprocn.com\nsunpun.com\nsunrain.com\nsunrate.com\nsunray2000.com\nsunresin.com\nsunresin.net\nsunrisedutyfree.com\nsunrisegroupcn.com\nsunrisenan.com\nsunrisesha.com\nsunrizetech.com\nsunrtb.com\nsunrtnet.com\nsunsea.net\nsunseekerpower.com\nsunsetcare-mirrortech.com\nsunsharer.com\nsunshine-power.net\nsunshine-sino.com\nsunshinecoasthomesearch.com\nsunsili.com\nsunsilu.com\nsunsine.com\nsunspotfund.com\nsunstarasia.com\nsuntech-metal.com\nsuntech-power.com\nsuntechospital.com\nsuntgj.com\nsuntimehousehold.com\nsuntop168.com\nsuntray.com\nsuntrayoa.com\nsuntront.com\nsunup.name\nsunup3d.com\nsunupcg.com\nsunus-china.com\nsunvim.com\nsunvio.com\nsunwardcap.com\nsunwatt.com\nsunwaygas.com\nsunwayland.com\nsunwaypharm.com\nsunways-portal.com\nsunwayworld.com\nsunwayx.com\nsunweihu.com\nsunweiwei.com\nsunwellpower.com\nsunwin-china.com\nsunwin2001.com\nsunwinon.com\nsunwoda.com\nsunwoodacoustic.com\nsunxiaoning.com\nsunxisc.com\nsunyaholding.com\nsunyansong.com\nsunyard.com\nsunyea.com\nsunyet.com\nsunyitech.com\nsunyoads.com\nsunyuu.com\nsunywo.com\nsunzhongwei.com\nsunzn.com\nsuo.im\nsuobao8.com\nsuobifa.com\nsuobuy.com\nsuoer-group.com\nsuofeiya.com\nsuofeiyashop.com\nsuoge.net\nsuolong.com\nsuoluomei.com\nsuorang.com\nsuosihulian.com\nsuotn.com\nsuoxin5.com\nsuoyiren.com\nsupafa.com\nsupaq.com\nsuparc.com\nsupcname.com\nsupcompute.com\nsupcon.com\nsupconauto.com\nsupconit.com\nsupdri.com\nsupeeder.com\nsupei.com\nsuper-king.net\nsuper-mt.com\nsuperace.com\nsuperacme.com\nsuperaicdn.com\nsuperayi.com\nsuperbed.cc\nsuperboss.cc\nsuperbrandmall.com\nsuperbrowser.com\nsuperbrowser.hk\nsuperbuy.com\nsuperbuyy.com\nsupercachenet.com\nsupercachenode.com\nsupercalnow.com\nsupercarrier8.com\nsupercrm.com\nsuperdns.org\nsuperepoxyresin.com\nsuperfix.com\nsuperhcloud.com\nsuperic.com\nsuperiorscope.com\nsuperjq.com\nsuperlib.com\nsuperlib.net\nsuperlink.mobi\nsuperlinkscm.com\nsuperlitetech.com\nsuperljq01.com\nsupermap.com\nsupermap.io\nsupermapcloud.com\nsupermapol.com\nsupernode.pro\nsuperpb.com\nsuperpowercn.com\nsuperqq.com\nsuperrrai77.com\nsupers.ltd\nsupersharket.com\nsupersocket.net\nsuperstar-med.com\nsuperstarkennel.com\nsuperstars.vip\nsupertime-malting.com\nsupertracker.net\nsupertrw.com\nsupervisionus.com\nsupervote.cc\nsuperwrt.com\nsuperyd.com\nsuperyears.com\nsuperzl.com\nsupesite.com\nsupesoft.com\nsupet.com\nsupgroups.com\nsuplaymart.com\nsupman.com\nsupmea.com\nsupmeter.com\nsupmil.com\nsupmil.net\nsupoin.com\nsupool.com\nsupor.com\nsuporgroup.com\nsuporpharm.com\nsupplierlist.com\nsupplygw.com\nsupplywater.com\nsupport-cn.samsung.com\nsupport.amd.com\nsupreme-oe.com\nsupwisdom.com\nsupwk.com\nsuqian360.com\nsuqianhospital.com\nsuqing.com\nsuqishi.com\nsuqnn.com\nsuqun-group.com\nsurely.cool\nsurerp.com\nsurface.download.prss.microsoft.com\nsurfacetreatmentgroup.com\nsurfacetreatmenttechnology.com\nsurfcg.com\nsurge.run\nsurgerii.com\nsurgerycast.com\nsurgi-plan.com\nsurmounthat.com\nsurperverse.com\nsurprising.studio\nsursen.com\nsursenelec.com\nsursung.com\nsurtime.com\nsuruicloud.com\nsurun-tech.com\nsurvey.work\nsurveyhills.com\nsurveyqq.com\nsurveyrtk.com\nsurveyunion.com\nsurvivor99.com\nsurwit.com\nsuryee.com\nsuseage.com\nsushijiameng.com\nsushiyanglao.com\nsushui.com\nsuso56.com\nsusong1.com\nsusong51.com\nsusongbbs.com\nsusoul.com\nsustcra.com\nsustech.online\nsusudm.com\nsusun.cc\nsusungroup.com\nsutanapp.com\nsuteidc.com\nsuteshop.com\nsuting123.com\nsutpc.com\nsutune.me\nsutuobang.com\nsuujee.com\nsuuny0826.com\nsuv-trip.com\nsuv666.com\nsuwen.org\nsuxiangsj.com\nsuxiazai.com\nsuxieban.com\nsuxiege.com\nsuxing.me\nsuxuejiaoyu.com\nsuxx0.com\nsuyangroup.com\nsuyuantuliao.com\nsuyuening.com\nsuyugame.com\nsuyujoy.com\nsuyun.net\nsuyunc.com\nsuyunj.com\nsuyur.com\nsuyutech.com\nsuyuzz.com\nsuz-vpn.amd.com\nsuzhongyy.com\nsuzhou-marathon.com\nsuzhou-otsuka.com\nsuzhouballettheatre.com\nsuzhoubank.com\nsuzhoubeili.com\nsuzhoubond.com\nsuzhoucitymarathon.com\nsuzhoudyh.com\nsuzhouexpo.com\nsuzhoufashion.com\nsuzhouhengtai.com\nsuzhouhui.com\nsuzhoujicai.com\nsuzhouleasing.com\nsuzhoulinsen.com\nsuzhousj.com\nsuzhouyabao.com\nsuzip.com\nsuzport.com\nsuzuki-china.com\nsuzuki-shanghai.com\nsvconcloud.com\nsve.cc\nsveir.xyz\nsvell.net\nsvenhetin.com\nsvfrrg.com\nsvgoptronics.com\nsvimeng.com\nsvinsight.com\nsvip5-applefix.com\nsvip51.com\nsvipdog.com\nsvipgulr.com\nsviping.com\nsvlik.com\nsvmxxaq.com\nsvn999.com\nsvnbucket.com\nsvnspot.com\nsvp6.com\nsvpchina.org\nsvrvr.com\nsvw-volkswagen.com\nsvwuc.com\nsvyun.com\nsw-bllp.com\nsw-zh.com\nsw0013.com\nsw163.com\nsw2008.com\nsw996.com\nswakopuranium.com\nswan366.com\nswanchemical.com\nswang8.com\nswangwx.com\nswanhub.co\nswaqds.com\nswarma.net\nswat-js.com\nswatou.com\nswaywm.com\nswbbsc.com\nswceb.com\nswchina.org\nswckc.com\nswdcmg.com\nswdyz.com\nsweet-data.com\nsweetalkos.com\nsweetjing.cc\nsweetlove.cc\nsweetmartmarketing.com\nsweetome.com\nsweetread.net\nsweetrouble.com\nsweetystory.com\nswelder.com\nswellfun.com\nswfc-shanghai.com\nswfzjt.com\nswg36.com\nswgocean.com\nswgzs.com\nswgzy.com\nswhydyj.com\nswhysc.com\nswift-at.com\nswift51.com\nswiftfintech.com\nswifthumb.com\nswiftjava.com\nswiftlet.net\nswijoy.com\nswip.group\nswirebev.com\nswirecocacola.com\nswisdom.cc\nswissgenie.com\nswissrepicass.com\nswissreplicas.cc\nswisswatcheshot.com\nswisswatchx.com\nswit-battery.com\nswit.cc\nswitchb2b.com\nswitchxiazai.com\nswitzerland-visacenter.com\nswjjshfw.com\nswjoy.com\nswjsj.com\nswjtjt.com\nswkedou.com\nswkong.com\nswkpe.tw\nswliuxue.com\nswltools.com\nswnic.com\nswofcare.com\nswomc.net\nswoole.com\nswordair.com\nswordart.online\nswordofmorning.com\nswords.center\nswordtt.com\nswpubar.com\nswq242xc54.com\nswrjzxw.com\nswsbw.com\nswsegroup.com\nswskj.com\nswsm.net\nswsmu.com\nswstsg.com\nswt0.com\nswtpu.com\nswufe-online.com\nswupdl.adobe.com\nswwy.com\nswxk.cc\nswxxvr.com\nswyun.net\nswz001.com\nswzj.com\nswzx.com\nsx-merryland.com\nsx-moen.com\nsx-seafood.com\nsx1211.com\nsx189.com\nsx267.com\nsx311.cc\nsxaec.com\nsxafz.com\nsxalu.com\nsxand.com\nsxase.com\nsxasuykzx2sq.icu\nsxatcm.com\nsxbada.com\nsxbang.net\nsxbawy.com\nsxbctv.com\nsxbdf.com\nsxbest.com\nsxbjedu.com\nsxbpa.com\nsxbuszp.com\nsxbychem.com\nsxcahosp.com\nsxccb.com\nsxcd-gyl.com\nsxcgzh.com\nsxchangshengjt.com\nsxcig.com\nsxcitygas.com\nsxclassiclighting.com\nsxcm.net\nsxcntv.com\nsxcoal.com\nsxcp.com\nsxctf.com\nsxcxgf.com\nsxcxldjy.com\nsxcyts.com\nsxcywy.com\nsxczdz.com\nsxd408.com\nsxdagang.com\nsxddy.com\nsxdkj.com\nsxds.com\nsxdyrq.com\nsxdzyp.com\nsxepa.org\nsxepc.com\nsxetcedu.com\nsxfl.org\nsxfoundation.com\nsxfu.org\nsxgbs.com\nsxgdtv.com\nsxggec.com\nsxggzp.com\nsxgjj.com\nsxglpx.com\nsxgoo.com\nsxgq.net\nsxgrw.com\nsxgs.com\nsxgsps.com\nsxhbjt.com\nsxhbjtshj.com\nsxhctv.com\nsxhhwl.com\nsxhhyy.com\nsxhimalayanqd.com\nsxhiway.com\nsxhjrc.com\nsxhkstv.com\nsxhkxy.com\nsxhlcc.com\nsxhlfjt.com\nsxhlxy.com\nsxhm.com\nsxhongyuan.com\nsxhospital.com\nsxhtss.com\nsxhtyy.com\nsxhtyy.net\nsxhwhb.com\nsxhwls.com\nsxhxbank.com\nsxisa.org\nsxjant.com\nsxjbswyy.com\nsxjcdyy.com\nsxjd-cn.com\nsxjdfreight.com\nsxjdpm.com\nsxjg-wl.com\nsxjgkg.com\nsxjhzsgc.com\nsxjianli.com\nsxjinfengjiuye.com\nsxjky.com\nsxjmfxky.com\nsxjntech.com\nsxjtyhjt.com\nsxjwlkj.com\nsxjxdyqfw.com\nsxjxsc0.org\nsxjybk.com\nsxjzxww.com\nsxkbzc.com\nsxkzxt.com\nsxlcdn.com\nsxldns.com\nsxlfwl.com\nsxlhrj.com\nsxlib.com\nsxlljm.com\nsxlottery.net\nsxlpd.com\nsxls.com\nsxltsj.com\nsxluxiang.com\nsxmda.net\nsxmhgas.com\nsxmty.com\nsxmxwh.com\nsxmyh.com\nsxncb.com\nsxnxs.com\nsxnxxny.com\nsxnycl.com\nsxol.com\nsxpgb.com\nsxplc.com\nsxpmg.com\nsxpmpos.com\nsxprgc.com\nsxpta.com\nsxpyzg.com\nsxpyzx.com\nsxqingyi.com\nsxqzy.com\nsxrb.com\nsxrbw.com\nsxrcw.net\nsxrczx.com\nsxrekord.com\nsxri.net\nsxrom.com\nsxrqrlxh.com\nsxrqxny.com\nsxrszdh.com\nsxrtv.com\nsxrxgs.com\nsxs56.com\nsxs8818.com\nsxsa.org\nsxsanwei.com\nsxsapi.com\nsxscwl.com\nsxsedu.net\nsxsfdxylsyzx.com\nsxsfky.com\nsxsfyyy.com\nsxsgs.com\nsxshjhyxh.com\nsxshu.com\nsxsim.com\nsxsimg.com\nsxsjgy.com\nsxsjzyxh.com\nsxslhg.com\nsxslnews.com\nsxsme.org\nsxsmtgyxh.com\nsxsng.com\nsxsoft.com\nsxsqxj.com\nsxsqyjxh.org\nsxsrmyy.com\nsxsslz.net\nsxssyh.com\nsxswfzjt.com\nsxsyyxh.com\nsxsyyxh.net\nsxszw.net\nsxtbu.net\nsxtcm.com\nsxtgedu.net\nsxtianjian.com\nsxtourgroup.com\nsxtourism.com\nsxtppm.com\nsxtqsl.com\nsxtracking.com\nsxtv6.com\nsxtvs.com\nsxudqg.com\nsxuyr2nx.com\nsxvtc.com\nsxwbedu.com\nsxwbs.com\nsxwetalent.com\nsxwlyhzp.com\nsxworker.com\nsxwpyx.com\nsxwq.com\nsxwstcm.com\nsxwtdyd.com\nsxww.com\nsxxfj.com\nsxxjdz.com\nsxxl.com\nsxxrmyy.com\nsxxsmjh.com\nsxxt.net\nsxxw.net\nsxxyfw.com\nsxxynews.com\nsxxzpt.com\nsxy7.com\nsxyasen.com\nsxyckjr.com\nsxycpc.com\nsxycrb.com\nsxycys.com\nsxygsj.com\nsxyj.net\nsxyqgs.asia\nsxyrxb.com\nsxyxqk.com\nsxyyc.net\nsxyyzcj.com\nsxzcrq.com\nsxzhaobiao.com\nsxzhongfei.com\nsxzhyy.com\nsxzkzs.com\nsxzlycl.com\nsxzlyy.com\nsxzq.com\nsxzxsdf.com\nsxzydj.com\nsxzyfy.com\nsxzytech.com\nsy-game.com\nsy-home.com\nsy-yy.com\nsy021.com\nsy118.com\nsy12306.com\nsy12328.com\nsy17.com\nsy1994.com\nsy1z.com\nsy2k.com\nsy2z.com\nsy3.com\nsy76.com\nsyais.com\nsybasebbs.com\nsyberos.com\nsyberq.com\nsybj.com\nsybxpu.com\nsybygx.com\nsycaijing.com\nsycdtz.com\nsychlon.com\nsycontroller.com\nsycreader.com\nsycsgj.com\nsycxzx.net\nsydaxxw.com\nsydcch.com\nsydcdjt.com\nsydey.com\nsydfty.com\nsydhyg.com\nsydjwl.com\nsydkidsedu.com\nsydneyglobaltimes.com\nsydtgd.com\nsydw.net\nsydw8.com\nsydxdl.com\nsyeamt.com\nsyeg-ev.com\nsyepia.org\nsyetyy.com\nsyf.ink\nsyfabiao.com\nsyfb2021.com\nsyfj.net\nsyfly007.com\nsyfw.com\nsyfyyy.com\nsyg315.com\nsygcjs.com\nsygcjsxh.com\nsygd.com\nsygjj.com\nsygjzx.com\nsyglyg.com\nsygnew.com\nsyh666.com\nsyhccs.com\nsyhfxsh.com\nsyhhidc.com\nsyhhkj.com\nsyhl.vip\nsyhlgg.com\nsyholdings.com\nsyhospital.com\nsyhouse.net\nsyhsfzl.com\nsyhsxb.com\nsyhuayang.com\nsyhzdj.net\nsyhzx.com\nsyhzzf.com\nsyiae.com\nsyiptv.com\nsyitgz.com\nsyjcly.com\nsyjiancai.com\nsyjkqzw.com\nsyjlp.com\nsyjsq.com\nsyjt.com\nsyjtwlzx.com\nsyjtzm.com\nsyjyzl.com\nsyjzedu.com\nsyk2023.com\nsykezheng.com\nsykfff.com\nsykong.com\nsykt520.com\nsylangyue.xyz\nsylaryun.com\nsylc.xyz\nsylincom.com\nsylixos.com\nsylm2022.com\nsylmg.com\nsylnyx.com\nsyltgl.com\nsymama.com\nsymarathon.com\nsymbiote.work\nsymboltek.com\nsymf-crm.com\nsymtc.com\nsyn-tron.com\nsyn029.com\nsynacast.com\nsynball.com\nsync.sh\nsyncedoffplanet.com\nsyncozymes.com\nsyngars.com\nsyngenemed.com\nsynjones.com\nsynjones.net\nsynnchem.com\nsynochip.com\nsynodc.com\nsynology-cn.com\nsynologyssb.com\nsyntao.com\nsynyan.net\nsynyi.com\nsynykj.net\nsyobserve.com\nsyoits.com\nsyoker.com\nsyoseo.com\nsyounggroup.com\nsypglass.com\nsypole.com\nsypost.com\nsypost.net\nsypvm.com\nsyq666.com\nsyr-sce.com\nsyranqi.com\nsyrc.org\nsyrcb.net\nsyrczpw.com\nsyreads.com\nsyrecovery.com\nsyrhkj.com\nsyrinxchina.com\nsyrqgas.com\nsyrszs.com\nsys-ele.com\nsys321.com\nsyscan360.com\nsyscan360.net\nsyscan360.org\nsysceo.com\nsysceo.net\nsyscxp.com\nsysdyy120.com\nsysengi.com\nsyshell.com\nsyshospital.com\nsyshospital.org\nsyshosts.net\nsysjnl.com\nsysjoint.com\nsysmaster.online\nsysmini.com\nsysmls.com\nsysnfj.com\nsysshine.com\nsystedata.com\nsystemsci.org\nsystemserviceable.com\nsystoon.com\nsysu-pharm.com\nsysucc.com\nsysuschool.com\nsysush.com\nsyswgw.com\nsysx.tech\nsysxhz.com\nsysydz.net\nsysyhfj.com\nsysysjnk.com\nsyt1000.com\nsytcke.com\nsytfgroup.com\nsythealth.com\nsytjcc.com\nsytlj.com\nsytlw.com\nsyttgame.com\nsytuku.com\nsyuan.com\nsyuan.net\nsyue.com\nsyw6.com\nsywg.com\nsywgy.com\nsywtqc.com\nsyx-ac.com\nsyxb.com\nsyxidao.com\nsyxjjsw.com\nsyxlgame.com\nsyxt.cc\nsyxw.xyz\nsyxwang.com\nsyxwnet.com\nsyxzhongyi.com\nsyyan.site\nsyyc.com\nsyygjs.com\nsyyjs.com\nsyyl.org\nsyylfh.com\nsyyqls.com\nsyysjt.com\nsyyx.com\nsyyy99.com\nsyyyd.com\nsyyyj.com\nsyyyking.com\nsyyzhpc.com\nsyzdhyb.com\nsyzjjt.com\nsyzlzz.com\nsyzoukan.com\nsyzpw.com\nsyzsgroup.com\nsz-3a.com\nsz-acuvu.com\nsz-amc.com\nsz-baile.com\nsz-bst.com\nsz-building.com\nsz-byg.com\nsz-cbea.com\nsz-cerberus.com\nsz-changfeng.com\nsz-changhong.com\nsz-coin.com\nsz-czzc.com\nsz-dfl.com\nsz-dns.net\nsz-ebest.com\nsz-edsy.com\nsz-ekl.com\nsz-el.com\nsz-etong.com\nsz-expressway.com\nsz-fesco.com\nsz-fukuda.com\nsz-function.com\nsz-gaokai.com\nsz-hbwy.com\nsz-hdenergy.com\nsz-hengdeyuan.com\nsz-hiragawa.com\nsz-huashi.com\nsz-huayuan.com\nsz-hyauto.com\nsz-hzt.com\nsz-iso.com\nsz-jiahong.com\nsz-jlc.co\nsz-jlc.com\nsz-jyd.net\nsz-kaito.com\nsz-keli.com\nsz-khgroup.com\nsz-ky.com\nsz-kye.com\nsz-lcsc.com\nsz-lzyy.com\nsz-map.com\nsz-matro.com\nsz-mtr.com\nsz-myjs.com\nsz-news.com\nsz-osckj.com\nsz-printing.com\nsz-qb.com\nsz-rlx.com\nsz-sunway.com\nsz-suwan.com\nsz-talant.com\nsz-tianmai.com\nsz-trip.com\nsz-tyjx.com\nsz-ua.com\nsz-xingfu.com\nsz-xiran.com\nsz-yian.com\nsz-ytq.com\nsz-zhenghe.com\nsz002329.com\nsz0429.com\nsz121.com\nsz1905.com\nsz1978.com\nsz1z.com\nsz2048.com\nsz240.com\nsz2g.com\nsz315.org\nsz3dp.com\nsz3e.com\nsz3gao.com\nsz56t.com\nsz5983.com\nsz7h.com\nsz800.com\nsz836.com\nsz886.com\nsz910.com\nsz96296.com\nszaaci.com\nszacc.com\nszaccl.com\nszaction.com\nszadf.com\nszadna.net\nszadst.com\nszaeia.com\nszagera.com\nszahotel.com\nszai.com\nszaiaitie.com\nszaicx.com\nszaid.com\nszaima.com\nszaipx.com\nszairport.com\nszaisino.com\nszaiten.com\nszaixian.com\nszajsj.com\nszamc.com\nszande.com\nszanjun.com\nszaojin.com\nszas.com\nszastcg.com\nszaudio.com\nszaudio.net\nszaupd.com\nszautism.com\nszbaba.com\nszbaicao.com\nszbaike.com\nszbaleng.com\nszbaoly.com\nszbaoming.com\nszbattery.org\nszbayy.com\nszbazx.com\nszbbs.org\nszbcase.com\nszbcfurniture.com\nszbdyd.com\nszbdzs.com\nszbeilu.com\nszbeilu888.com\nszbhwk.com\nszbhyy.com\nszbia.com\nszbih.com\nszbike.com\nszbim.com\nszbinying.com\nszbiu.com\nszbnrj.com\nszboehospital.com\nszbojay.com\nszbosen.com\nszbosk.com\nszbrandweek.com\nszbryq.com\nszbubu.com\nszbwgy.com\nszbyzn.com\nszc-ic.com\nszca.com\nszcat.org\nszcatic.com\nszcbc.com\nszcfjt.com\nszcfyi.com\nszcgc.com\nszcgkg.com\nszch-cn.com\nszchengli.com\nszchengyue.com\nszchilink.com\nszchunqiu.com\nszcic.com\nszcidg.com\nszclbxf.com\nszcleanair.com\nszclxzx.com\nszcmer.com\nszcnpiec.com\nszcogo.com\nszcompare.com\nszcp.com\nszcsot.com\nszcssx.com\nszcswater.com\nszctch.com\nszctkj.net\nszcttlab.com\nszctyx.com\nszcua.org\nszcw.com\nszcwdz.com\nszcxjscl.com\nszcy-fintech.com\nszcy99.com\nszczjy.com\nszczkjgs.com\nszdaily.com\nszdcjd.com\nszddns.net\nszdesigncenter.org\nszdesigner.org\nszdesy.com\nszdf.com\nszdhjt.com\nszdiantu.com\nszdihang.com\nszdiyibo.com\nszdkgssb.com\nszdljt.com\nszdlsjj.com\nszdn1ms.com\nszdpi.com\nszdprt.com\nszdrse.com\nszds.com\nszdsit.com\nszdtwcw.com\nszdunan.net\nszduopin.com\nszdwwy.com\nszdwxy.com\nszdwyy.com\nszdx189.com\nszdxfsrhyy.com\nszdz123.com\nszdzczp.com\nszeant.com\nszeastroc.com\nszeasyin.com\nszebus.net\nszecowater.com\nszects.com\nszed.com\nszeds.com\nszedu.net\nszeeg.com\nszegddc.com\nszeholiday.com\nszeia.com\nszelab.com\nszelanpo.com\nszelec.cc\nszelight.com\nszelink.com\nszepiao.com\nszerye.com\nszesens.com\nszetop.com\nszeua.org\nszeunon.com\nszeverich.com\nszfa.com\nszfachina.org\nszfangzhouhd.com\nszfc.net\nszfcol.com\nszfda.net\nszfdg.com\nszfdzx.com\nszfengtu88.com\nszffmr.com\nszfg.net\nszfglass.com\nszfirstplastic.com\nszfiu.com\nszfjt.com\nszfolo.com\nszforter.com\nszftfybj.com\nszftzx.net\nszftzy.com\nszfutong.com\nszfuture.com\nszfw.org\nszfx.com\nszfxdev.com\nszfyhd.com\nszfyzb.com\nszfzx.org\nszgalaxy.com\nszgangdi.com\nszgays.org\nszgcyy.com\nszggzy.com\nszghedu.com\nszghgw.com\nszgky.com\nszgla.com\nszglby.com\nszglsf.com\nszgraphene.com\nszgreenhulk.com\nszgrjt.com\nszgsjc.com\nszgt.com\nszgthr.com\nszguanai.com\nszguanghua.com\nszguante.com\nszguixiang.com\nszguoxin.com\nszgwin.com\nszgwsd.com\nszgymz.com\nszgztg.com\nszh.com\nszha.org\nszhaian.com\nszhaicao.com\nszhailan.com\nszhaochuang.com\nszharmony.com\nszhb.org\nszhddq.com\nszhdy.com\nszhdyic.com\nszhenglian.com\nszhetai.com\nszhfwd.com\nszhgmd.com\nszhgong.com\nszhightondz.com\nszhiross.com\nszhjwybj.com\nszhk.com\nszhkhui.com\nszhlodz.com\nszhlsg.com\nszhmjp.com\nszhmkeji.com\nszhnsz.com\nszhome.com\nszhomeimg.com\nszhongshe.com\nszhospital.com\nszhot.com\nszhq.com\nszhqgf.com\nszhqyy.com\nszhqyy120.com\nszhr.com\nszhrh.com\nszhri.com\nszhsdpa.com\nszhstjt.com\nszhsx.net\nszhtp.com\nszhua-gao.net\nszhuace.com\nszhuarong.com\nszhuayilong.com\nszhubei.com\nszhuhang.com\nszhulian.com\nszhuodong.com\nszhvac.org\nszhvs.com\nszhwad.com\nszhxbiz.com\nszhytrip.com\nszhzsd.com\nszhzzl.com\nszicbe.com\nszicc.net\nszicpa.org\nszida.org\nszider.com\nszieg.com\nszihl-bayarea.com\nszihl-port.com\nsziia.org\nszind.com\nszinvent.com\nsziota.com\nszitcare.com\nsziton.com\nszitsa.org\nszjags.com\nszjawest.com\nszjbz.cc\nszjcmr.com\nszjcyljt.com\nszjcyy.com\nszjcyyy.com\nszjdsd.com\nszjfh.com\nszjg.net\nszjgjt.com\nszjhxjt.com\nszjianan.com\nszjiansheng.net\nszjianuo.com\nszjiazhao.com\nszjiexikeji.com\nszjinhejs.com\nszjinhuanyu.com\nszjinke.com\nszjinxinzh.com\nszjitu.com\nszjjedu.com\nszjkhd.com\nszjkp.com\nszjkxh.com\nszjkyun.com\nszjlkt.com\nszjlwul.com\nszjr-tencentclb.cloud\nszjr-tencentclb.com\nszjr-tencentclb.net\nszjr-tencentclb.work\nszjsgroup.com\nszjsjlxh.com\nszjsjt.com\nszjtxm.com\nszjuhaozn.com\nszjunchuang.com\nszjunfei.com\nszjunlin.com\nszjunrong.com\nszjuquan.com\nszjuwx.com\nszjuyou.com\nszjxcft-tencentclb.cloud\nszjxcft-tencentclb.com\nszjxcft-tencentclb.net\nszjxcft-tencentclb.work\nszjxgroup.com\nszjxj.com\nszjy.cc\nszjyos.com\nszjys.net\nszjys1888.com\nszjytx.com\nszjyxtech.com\nszjzdcjt.com\nszkdxx.com\nszkeda.com\nszkegao.net\nszkente.com\nszkete.com\nszkgdesign.com\nszkingdom.com\nszkinks.com\nszkjcn.com\nszkjjs.com\nszkjxh.com\nszknet.com\nszknk.net\nszknys.com\nszknyy.com\nszkoa.com\nszkobo.com\nszkosun.com\nszkqyy.com\nszkrd.com\nszl724.com\nszlaituo.com\nszlande.com\nszlangwei.com\nszlanyou.com\nszlawyers.com\nszlc9.com\nszlcsc.com\nszlcwy.com\nszldcc.com\nszlddb.com\nszlddj.com\nszldzb.com\nszledia.org\nszleezen.com\nszlgzxyy.com\nszlhtram.com\nszlianhua.com\nszlianya.net\nszlightlink.com\nszlihuam.com\nszlilun.com\nszline9.com\nszlinglewangluo.com\nszlingsheng.com\nszlmxx.com\nszlnjt.com\nszlnxh.com\nszlongyu.com\nszlottery.org\nszlqjt.com\nszlsnk.com\nszlswl8.com\nszltech.com\nszltlh.com\nszltour.com\nszltwlw.com\nszlunhua.com\nszluxon.com\nszlvbarcode.com\nszlwbj.com\nszlwtech.com\nszlxl100.com\nszlzsd.com\nszmadigi.com\nszmagellan.com\nszmall.com\nszmama.com\nszmama.net\nszmaxima.com\nszmb.cc\nszmc.net\nszmcjsjt.com\nszmcjt.com\nszmcob.com\nszmctc.com\nszmcy.com\nszmea.net\nszmedtech.com\nszmengqukj.com\nszmgci.com\nszmhthb.com\nszmicrogate.com\nszmieps.com\nszmii.com\nszmil.com\nszmjd.com\nszmjlcd.com\nszmkd.com\nszmrcd.com\nszmsjs.com\nszmslaser.com\nszmtc.com\nszmtxny.com\nszmtzc.com\nszmuseum.com\nszmwzs.com\nszmylike.com\nszmynet.com\nszmys.com\nszmywin.com\nszmyxc.com\nszn360.com\nsznaibeng.com\nsznbm.com\nsznecn.com\nsznewbest.com\nsznews.com\nsznewworld.com\nsznffc.com\nsznfwt.net\nszngdz.com\nszniego.com\nszniushi.com\nsznj91.com\nsznnhg.com\nszns-marathon.com\nsznsyy.net\nsznumberone.com\nsznwriterhouse.work\nszny189.com\nsznyfz.com\nsznyyznnj.com\nszobk.com\nszol.net\nszolgj.com\nszolxd.com\nszonline.net\nszooo.com\nszoxstand.com\nszp168.com\nszpa.com\nszpa.org\nszpan-china.com\nszpckj.com\nszpclab.com\nszped.com\nszpengfa.net\nszpgm.com\nszpiaoyi.com\nszpldq.net\nszpllp.com\nszplus.com\nszpmi.org\nszporter.com\nszpowerfly.com\nszpra.com\nszprl.com\nszptxx.com\nszputy.com\nszqf.org\nszqhlx.com\nszqhtkyy.com\nszqhyf.com\nszqiangu.com\nszqinyuan.com\nszqjxh.com\nszqp.site\nszqsq.com\nszqt.net\nszquanli.com\nszqycl.com\nszqyw.net\nszqzsd.com\nszrba.org\nszrc-hr.com\nszrcaj.com\nszrcb.com\nszrcfw.com\nszrch.com\nszrfdq.com\nszrfstar.com\nszrgsh.com\nszrhg.com\nszrj.net\nszrlaw.net\nszrrjc.com\nszrsks.com\nszrswj.com\nszrtcpa.com\nszruilan.com\nszrunning.com\nszryc.com\nszrzxh.com\nszs189.com\nszsaibao.com\nszsailong.com\nszsaiwei.com\nszsamr.com\nszsandt.com\nszsangbo.com\nszschj.com\nszschl.com\nszsci.net\nszscree.com\nszsczx.com\nszsdhjt.com\nszsdjrmyy.com\nszsdsrmyy.com\nszseafoodexpo.com\nszseasons.com\nszsemicon.com\nszsep.com\nszsewo.com\nszsfgc.com\nszsh.com\nszshtjm.com\nszshuangjin.com\nszshuori.com\nszshutao.com\nszshwy.com\nszsia.com\nszsing.com\nszsjtjj.com\nszsjxxpt.com\nszskd.com\nszsky.com\nszslcyy.com\nszslhssy.com\nszsmk.com\nszsmyg.com\nszsnk.com\nszsoa.org\nszsolutia.com\nszsongmao.com\nszsorch.com\nszsptk.com\nszsq.net\nszsrs.com\nszssct.com\nszssda.com\nszssep.com\nszssfor.com\nszsswcs.com\nszsszx.com\nszsta.org\nszstar.com\nszstariver.com\nszstartec.com\nszsti.org\nszstndzsw.com\nszstyle.cc\nszsuanli.com\nszsunlaser.com\nszsunwin.com\nszsupvan.com\nszswgcjc.com\nszswjc.com\nszswjs.com\nszsycft-tencentclb.cloud\nszsycft-tencentclb.com\nszsycft-tencentclb.net\nszsycft-tencentclb.work\nszsyyxh.org\nszszjt.com\nszszlm.com\nszszpx.com\nszsztj.com\nsztaijier.com\nsztalent.org\nsztanzo.com\nsztara.com\nsztbjs.com\nsztc.com\nsztcg.com\nsztd123.com\nszte.com\nsztechand.com\nszted.com\nsztexun.com\nszteyin.com\nsztgxc.com\nsztgxx.com\nsztheatre.com\nszthekey.com\nszthxf.com\nsztiaocao.com\nsztino.com\nsztkc.com\nsztkd.com\nsztljyjt.com\nsztmjz.com\nsztncm.com\nsztongwang.com\nsztopbrand.com\nsztower.com\nsztoys.com\nsztqjf.com\nsztreeent.com\nsztspi.com\nsztw96933.com\nsztxcpa.com\nsztxsz.com\nsztxw.com\nszty56.com\nsztz.org\nsztzzs.com\nszuavia.org\nszudad.com\nszunionlab.com\nszurta.org\nszvannylove.com\nszvca.com\nszvft.com\nszvi-bo.com\nszvsdpco.com\nszwa.com\nszwaishi.com\nszwale.com\nszwanghong.com\nszwata.com\nszwb.com\nszwblm.com\nszwchy.com\nszwdny.com\nszwego.com\nszweidi.com\nszweijubao.com\nszweita.com\nszwfhp.com\nszwfzs.com\nszwghl.com\nszwgmf.com\nszwgroup.com\nszwhcycyw.com\nszwhxy.com\nszwldq.com\nszword.com\nszwsm.com\nszwstui.com\nszwtsd.com\nszwudao.com\nszwuyukeji.com\nszwwco.com\nszwzjt.com\nszwzzxyy.com\nszx-ray.com\nszx-tencentclb.cloud\nszx-tencentclb.com\nszx-tencentclb.net\nszx-tencentclb.work\nszx58.com\nszxbbus.com\nszxbjt.com\nszxbyx.com\nszxcqfw.com\nszxcrq.com\nszxcxkf.com\nszxcyl.com\nszxdfpr.com\nszxdhj.com\nszxdzb.com\nszxfgcw119.com\nszxhdz.com\nszxihu.com\nszxijili.com\nszxinghe.net\nszxinjiaxin.com\nszxinjicheng.com\nszxinyixin.com\nszxiot.com\nszxlga.com\nszxljc.com\nszxlxzb.com\nszxs.work\nszxsdmy.com\nszxsshb.com\nszxtiot.com\nszxuexiao.com\nszxuw.com\nszxwlkj.com\nszxxj.com\nszxxtx.com\nszxxw.com\nszxyjd.com\nszxyxbkle.com\nszyake.com\nszyakeda.com\nszyansai.com\nszyazhi.com\nszybio.com\nszycil.com\nszyclmarathon.com\nszydtx.com\nszydxx.net\nszydyy.com\nszyfai.com\nszyfdz.net\nszygcgpt.com\nszyh.org\nszyhja.com\nszyhoa.com\nszyhznkj.com\nszyibei.com\nszyichengjd.com\nszyin.com\nszyingduoduo.com\nszyinglian.com\nszyingzhan.com\nszyink.com\nszyixx.com\nszyiyue.com\nszyjedu.com\nszyljt.com\nszymweb.com\nszyns.com\nszypfb.com\nszyptx.net\nszyqjzxh.com\nszyran.com\nszys.net\nszys119.com\nszysjt.com\nszysmpay.com\nszystea.com\nszysxx.com\nszyt-hosp.com\nszyuda88.com\nszyundingschool.com\nszyuxin.com\nszyweibo.com\nszyxue.com\nszyxwdz.com\nszyxwkj.com\nszyy0373.com\nszyyda.com\nszyyt.com\nszyyx.com\nszyzsy.com\nszzbmy.com\nszzesee.com\nszzfbt.com\nszzfgjj.com\nszzh365.com\nszzhangchu.com\nszzhaodaxin.com\nszzhijun.com\nszzhsponge.com\nszzhuoju.com\nszzkgk.com\nszzljg.com\nszzntech.com\nszznzn.com\nszzoan.com\nszzoo.net\nszzs360.com\nszzscq.com\nszzsivf.com\nszzunbao.com\nszzuting.com\nszzx100.com\nszzxgzy.net\nszzyjt.net\nszzyqc.net\nszzyqy.com\nszzytech.com\nszzywxkj.com\nt-angel.com\nt-d.chat\nt-d.tv\nt-dsyy.com\nt-firefly.com\nt-gafa.com\nt-io.org\nt-npm.com\nt-ocean.com\nt-t.live\nt-tlearning.com\nt-v.com\nt-workshop.com\nt.biz\nt.tt\nt0001.com\nt003005.com\nt00ls.cc\nt00ls.net\nt00y.com\nt016vip28.com\nt016vip7.com\nt0377.com\nt086.com\nt1.ink\nt10.com\nt105.com\nt11.co\nt123yh.xyz\nt139.com\nt178.info\nt1networks.com\nt1qq.com\nt1tms.com\nt1y4.com\nt1y5.com\nt20000.com\nt2audio.net\nt2cn.com\nt2uu.com\nt3315.com\nt3j4.com\nt3p58.com\nt3yanzheng.com\nt47888.com\nt49cdn.com\nt4x3.com\nt4z5p5s9k4q3m4h4m3.org\nt5.work\nt50888.com\nt528.com\nt56.net\nt56jy.net\nt5tm.com\nt5xs.com\nt66.com\nt6q.com\nt7114.com\nt7805.com\nt79d6.com\nt7rt5.com\nt7y8.com\nt7z.cc\nt85.net\nt888w.com\nt8f.com\nt8tcdn.com\nt8tms.com\nt8ui6xzkw.shop\nt99677.com\nt9in.com\nt9tms.com\nta-ly.com\nta-shang.com\nta26.com\nta313.com\nta39.com\ntaaas.org\ntaagoo.com\ntabalt.net\ntabbitbrowser.com\ntabbypro.com\ntabbywork.com\ntableauxmly.com\ntabuzhe.com\ntabxexplorer.com\ntachangxing.com\ntacool.com\ntactan.net\ntadiao365.com\ntadsim.com\ntadsim.net\ntadu.com\ntadyz.com\ntaeapp.com\ntaeee.com\ntafeihu.com\ntag.gg\ntagen-pm.com\ntagjjt.com\ntaglyst.com\ntagold.net\ntagoo.club\ntagphi.net\ntaguage.com\ntaguxdesign.com\ntahoecn.com\ntahua.net\ntai-liang.com\ntai1000.com\ntai3399.com\ntai87.com\ntaian.com\ntaianmedia.com\ntaiantang.net\ntaibumall.com\ntaicang.info\ntaicent.com\ntaichi-graphics.com\ntaichi-maker.com\ntaichuan.com\ntaichuan.net\ntaici.com\ntaicihome.com\ntaicike.com\ntaida-china.com\ntaida100.com\ntaidao.net\ntaidaxincai.com\ntaidichina.com\ntaidu.com\ntaiduhome.com\ntaiergroup.com\ntaifeng.co\ntaifengfans.com\ntaifua.com\ntaig.com\ntaigaoxiao.com\ntaihaikj.com\ntaihainet.com\ntaihe-hr.com\ntaihe.com\ntaihealthcare.com\ntaihecap.com\ntaihechengjian.com\ntaihehospital.com\ntaihemedia.com\ntaihopaint.com\ntaihuachem.com\ntaihuapharm.com\ntaihuawj.com\ntaihuboiler.com\ntaihucn.com\ntaihuoniao.com\ntaihutour.com\ntaihuwang.com\ntaihuwater.com\ntaihuxue.com\ntaihuyuan.com\ntaihuzimi.com\ntaiji.com\ntaijidf.com\ntaijiewuliu.com\ntaijiny.com\ntaijio.com\ntaijs.com\ntaijutv.com\ntaikaibyq.com\ntaikaihuanbao.com\ntaikancnc.com\ntaikang.com\ntaikanginv.com\ntaikangjsnc.com\ntaikanglife.com\ntaikanglife.net\ntaikangonline.com\ntaikangonline.net\ntaikangph.com\ntaikangzhijia.com\ntaikeji.com\ntaikewei.com\ntaikongmedia.com\ntaikoohui.com\ntaikoyc.com\ntaikr.com\ntailgdd.com\ntailingood.com\ntailixiangjiao.com\ntaillkang.com\ntailong.com\ntaimei.com\ntaimi100.com\ntaimls.com\ntainengchong.com\ntaininge.online\ntainingrencai.com\ntaiorient.com\ntaiott.com\ntaipingyangshuiwu.com\ntaipumed.com\ntaiqiedu.com\ntaiqigame.com\ntaiquan.com\ntairock.com\ntairos.cc\ntairos.net\ntairos.tech\ntairui-ad.com\ntais3.com\ntaisantech.com\ntaisenfurniture.com\ntaishangroup.com\ntaishansports.com\ntaishanxq.com\ntaishanyy.com\ntaisuyun.com\ntaitonglj.com\ntaiwandao.tw\ntaiwanwii.com\ntaiweiholding.com\ntaiwoagri.com\ntaiwu.com\ntaixi.cc\ntaixigas.com\ntaixingren.com\ntaixirobot.com\ntaixubio.com\ntaixuguoji.com\ntaiyangd.com\ntaiyanghttp.com\ntaiyechem.com\ntaiyin117.com\ntaiyiplus.com\ntaiyocablecn.com\ntaiyou.fund\ntaiyuanguanye.com\ntaiyuanqy.com\ntaizhoucitymarathon.com\ntaizhouwater.com\ntaizibao.com\ntajd.net\ntajiduo.com\ntakebackthegrid.org\ntakesend.com\ntakfat.com\ntakhogroup.com\ntakstar.com\ntakumi-cnc.com\ntakungpao.com\ntakusogroup.com\ntakwang.net\ntal-china.com\ntal.com\ntalbrain.com\ntalebase.com\ntalegenes.com\ntalentable.com\ntalentlin.com\ntalentran.com\ntalents-tech.com\ntalentsmag.com\ntalentspotgroup.com\ntalicai.com\ntaliove.com\ntaljdns.com\ntalk-cloud.net\ntalk-fun.com\ntalk853.com\ntalk915.com\ntalkgw.com\ntalkingchina.com\ntalkingdata.com\ntalkingdata.net\ntalkinggame.com\ntalkingnews.net\ntalkwithtrend.com\ntalkxj.com\ntalkyun.com\ntallgu.com\ntalmdhome.com\ntaluo.com\ntaluo5.com\ntaluoji.com\ntalzjsj.com\ntamaegis.com\ntamarace.com\ntamayaki.com\ntamc8.com\ntamensay.com\ntamersunion.net\ntamigos.com\ntamigroup.com\ntamlab.net\ntamll.com\ntan-gtr.com\ntan.cc\ntan07.com\ntan14.net\ntan8.com\ntanapk.com\ntanaqul.org\ntanbao178.com\ntanbo.name\ntanboer.com\ntancdn.com\ntanchinese.com\ntandehao.com\ntanewmaterial.com\ntang-lei.com\ntanganlingshi.com\ntangbai.cc\ntangbolitangci.com\ntangchendoor.com\ntangdaoya.com\ntangdou.com\ntangdouddn.com\ntangdouedn.com\ntangdoufdn.com\ntangdouhdn.com\ntangdouimg.com\ntangdouz.com\ntangeche.com\ntangfc.com\ntanggu11g.com\ntangguobaohe.com\ntanghu.net\ntanghushi.com\ntangjie.me\ntangjihuang.com\ntangkabj.com\ntanglei.name\ntangmingint.com\ntangoic.com\ntangongye.com\ntangpai.cc\ntangping.com\ntangqingtuia1.com\ntangrenmedia.com\ntangruiqian.com\ntangsanshu.com\ntangsem.com\ntangshan-marathon.com\ntangshanliulin.net\ntangshuang.net\ntangshui.net\ntangsongys.com\ntangsuanradio.com\ntangtang.org\ntanguan.net\ntangux.com\ntangwai.com\ntangxia.xin\ntangxiagoodview.com\ntangyeedu.com\ntangyoufushi.fun\ntangyuan.com\ntanhaibo.net\ntanho.com\ntanjigroup.com\ntanjing.online\ntanjiyongjun.com\ntankeai.com\ntankmm.com\ntankprint.online\ntanksuv.com\ntankywoo.com\ntanling.com\ntanlive.com\ntanlong.org\ntanluxia.com\ntanma.tech\ntanmer.com\ntanpaifang.com\ntanpoqiuer.com\ntanshudata.com\ntansiling.com\ntansoole.com\ntantaly.com\ntantan123.com\ntantanapp.com\ntantu.com\ntantu.info\ntantuw.com\ntanv.com\ntanwan.com\ntanwan123.net\ntanwanmao.net\ntanwanyx.com\ntanweime.com\ntanwuapp.com\ntanx.com\ntanxingfuli.com\ntanxinyu.work\ntanxuling.com\ntanyu.mobi\ntanyuantech.com\ntanzhouwater.com\ntao-che-wei.com\ntao-jiujiu.com\ntao-star.com\ntao-studio.net\ntao-wu.com\ntao008.com\ntao123.com\ntao3.cc\ntao33.com\ntao37.com\ntao3c.com\ntao66.com\ntao800.com\ntao8090.com\ntaoa.com\ntaoad.com\ntaoart.com\ntaoban.com\ntaobao\ntaobao-img.com\ntaobao.com\ntaobao.global\ntaobao.net\ntaobao.org\ntaobao.tw\ntaobao1111.com\ntaobaocdn.com\ntaobaocity.com\ntaobc.com\ntaobeihai.com\ntaobeike.com\ntaobiaozu.com\ntaoc.cc\ntaocange.com\ntaocdn.com\ntaoche.com\ntaocheche.com\ntaoci.com\ntaoci163.com\ntaocibao.com\ntaocijiaju.com\ntaocloudx.com\ntaocz.com\ntaodake.com\ntaodang8.com\ntaodaso.com\ntaodaxiang.com\ntaodianla.com\ntaodingzhi.cc\ntaodiqupu.com\ntaodocs.com\ntaodu.com\ntaoduoke.com\ntaodushi.cc\ntaoerge.com\ntaoex.com\ntaofake.com\ntaofang.com\ntaofanghaiju.com\ntaofeige.com\ntaofen8.com\ntaofont.com\ntaogede.com\ntaogegou.com\ntaogutang.com\ntaohao6.com\ntaohaoba.com\ntaohaobang.com\ntaohaoge.com\ntaohaoqu.com\ntaohaowan.com\ntaohhui.com\ntaohua.com\ntaohuaqizhi.com\ntaohuazu.net\ntaohuazu.pw\ntaohui.pub\ntaohuren.com\ntaoic.com\ntaojiaju8090.com\ntaojianghu.com\ntaojiji.com\ntaojindi.com\ntaojingame.com\ntaojingroup.com\ntaojinhudong.com\ntaojinji.com\ntaojinyi.com\ntaoke.com\ntaokewenan.com\ntaokezhushou.com\ntaokouling.com\ntaoktv.com\ntaoku.com\ntaokuaibiao.com\ntaolale.com\ntaoliangroi.com\ntaolinzhen.com\ntaolvtong.com\ntaolx.com\ntaomanhua.com\ntaomee.com\ntaomeiju.com\ntaomeixie.com\ntaomike.com\ntaoming.com\ntaomingshi.com\ntaomingyan.com\ntaomr.com\ntaonanfu.com\ntaonienie.com\ntaoniu.com\ntaoniupin.com\ntaooo.cc\ntaopb.com\ntaopian.org\ntaopiaopiao.com\ntaopic.com\ntaopinquan.com\ntaopuwang.com\ntaopxx.com\ntaoq.net\ntaoqao.com\ntaoquanquan.com\ntaor.work\ntaoruinyuan.com\ntaosaas.com\ntaosdata.com\ntaosha.club\ntaoshengtc.com\ntaoshouyou.com\ntaoshu.com\ntaoshuashua.net\ntaoshudang.com\ntaosj.com\ntaotao.com\ntaotaocar.com\ntaotaogeren.xyz\ntaotaoit.com\ntaotaosports.com\ntaoth.com\ntaotian.com\ntaotu8.net\ntaou.com\ntaourl.com\ntaowangzhan.com\ntaoweng.site\ntaoxiangyoushu.com\ntaoxiaolu.com\ntaoxie.com\ntaoxie.com.tw\ntaoxuemiao.com\ntaoxv.com\ntaoyi-support.com\ntaoyitu.com\ntaoyizhu.com\ntaoyougou.com\ntaoyuanc.com\ntaoyuewenhua.net\ntaoyutaole.com\ntaozg.store\ntaozhanyun.com\ntaozhibook.com\ntaozhuo.com\ntaozhutu.com\ntap-ad.com\ntapafun.com\ntapai.com\ntapaijiu.com\ntapapis.com\ntapapks.com\ntapas.net\ntapbooster.net\ntapd-app.com\ntapdata.net\ntapdb.com\ntapdb.net\ntapenjoy.com\ntapimg.com\ntapjoytech.com\ntapotiexie.com\ntappile.com\ntapque.com\ntaprls.com\ntaprls.net\ntapsvc.com\ntaptap-api.com\ntaptap.com\ntaptapcode.com\ntaptapdada.com\ntapulsads.ru\ntapurl.com\ntaraniss.com\ntarcoist.com\ntarczp.com\ntarenacn.com\ntarenwang.net\ntargetportion.com\ntarisland-zh.com\ntaro.zone\ntarotchina.net\ntarsier-infra.com\ntarsocial.com\ntartscenter.com\ntasaiwang.com\ntaschb.com\ntashine.com\ntasiyun.com\ntask51.com\ntaskcity.com\ntasly.com\ntaslypharma.com\ntastespirit.com\ntastien-external.com\ntastientech.com\ntastysteak.com\ntaswwx.com\ntaszk.com\ntaszls.com\ntatatimes.com\ntataxingqiu.com\ntatazu.com\ntaterli.com\ntatfook.com\ntatstm.com\ntattoo77.com\ntattooo.net\ntaurentech.net\ntauris.com\ntaurus66.com\ntaurusxin.com\ntav-global.com\ntav-global.net\ntavsiktlig.com\ntax-edu.net\ntax.vip\ntax100.com\ntaxchina.com\ntaxdata.tax\ntaxjiangkewang.com\ntaxksec.com\ntaxnote.org\ntaxspirit.com\ntaxtaoj.xyz\ntaxuspharm.com\ntaxwen.com\ntayohya.com\ntazai.com\ntazhe.com\ntazts.com\ntb-whatsapp.com\ntb.biz\ntb.pub\ntb4gv2cp5z.com\ntb51.net\ntb58.net\ntbaas.tech\ntbadc.com\ntbadesign.org\ntbaiq.com\ntbankw.com\ntbapp.com\ntbcache.com\ntbh5.com\ntbhcc.com\ntbhelper.com\ntbinq.com\ntbizmail.com\ntbjt18.com\ntbjtss.com\ntbk-app.com\ntbkf.net\ntbkong.com\ntbl-import.com\ntblk.me\ntbmcas.com\ntbmkt.com\ntbnimg.com\ntboxn.com\ntbpark.com\ntbq168.com\ntbqjx.com\ntbreeden.com\ntbs321.com\ntbsandbox.com\ntbsite.net\ntbt-tuning.com\ntbt168.com\ntbtopc.com\ntburl.in\ntbuser.com\ntbwyl.com\ntbxsw.com\ntbyfsoft.com\ntc-21.com\ntc-mining.com\ntc-semi.com\ntc0770.com\ntc108.com\ntc118.com\ntc12580.com\ntc199.net\ntc29.com\ntc29.net\ntc471cyhud.com\ntc58.net\ntc880.com\ntc9011.com\ntc911.vip\ntc930.com\ntcbqcloud.com\ntccfjt.com\ntccrtzyxgs.com\ntccxfw.com\ntcdinfo.com\ntcdj.com\ntcdneo.com\ntcdneo.net\ntcdnext.com\ntcdnhw.com\ntcdnhw.net\ntcdnkc.com\ntcdnkcbak.com\ntcdnlive.com\ntcdnlivebak1.com\ntcdnlivebak2.com\ntcdnlp.com\ntcdnos.com\ntcdnos.net\ntcdntip.com\ntcdnv3.com\ntcdnvod.com\ntcdnvodbak.com\ntcdnvodnew.com\ntcdnvp.com\ntcecps.org\ntced-transsion.com\ntcedshare.com\ntceic.com\ntcenn.com\ntceratronix.com\ntcfhty.com\ntcfmglobal.com\ntcgcardgame.com\ntcgdxyb.xyz\ntcggkj.com\ntcgke.com\ntcgsw.com\ntchbgz.com\ntchbsb.com\ntchong.com\ntchy.net\ntchzt.com\ntchzx.com\ntciplay.com\ntcisct.com\ntcjdcapital.com\ntcjx688.com\ntckjfast.com\ntckjhigh.com\ntckwj.com\ntcl-cctv.com\ntcl.com\ntclbusiness.com\ntclclouds.com\ntcljd.com\ntclking.com\ntclkqn.com\ntclogx.com\ntcloud19.com\ntcloudbase.com\ntcloudbase.net\ntcloudbaseapi.com\ntcloudbaseapp.com\ntcloudbasegateway.com\ntcloudbasestatic.com\ntcloudbh.com\ntcloudbi.com\ntclouddrive.com\ntcloudedu.com\ntcloudfamily.com\ntcloudhw.com\ntcloudhw.net\ntcloudit.com\ntcloudit.net\ntcloudlive.com\ntcloudscdn.com\ntcloudscdn.net\ntcltech.com\ntclyjg.com\ntcm100.com\ntcm360.com\ntcmer.com\ntcmfrj.com\ntcmmh.com\ntcmppcloud.com\ntcmwindow.com\ntcnen.com\ntcnews.cc\ntcnvmms.com\ntcoejox.shop\ntcomall.com\ntcp.hk\ntcp.mk\ntcp.pub\ntcp5.com\ntcping8.com\ntcqmj.com\ntcrcb.com\ntcrcsc.com\ntcs-y.com\ntcsae.org\ntcsasac.com\ntcsdk.com\ntcsdzz.com\ntcseny.com\ntcsisu.com\ntcsnake.com\ntcspbj.com\ntcstzg.com\ntcsurg.org\ntctask.com\ntctip.com\ntctong.com\ntctpwebank.com\ntctpwebankcdn.net\ntctpxwebank.com\ntctran.com\ntctz.com\ntcvywoh.com\ntcwqqdy.guru\ntcwt.net\ntcxmt.com\ntcxw.cc\ntcxwg.com\ntcxx1985.com\ntcxys.com\ntcxzj.com\ntcy1688.com\ntcy365.com\ntcy365.net\ntcyad.com\ntcyfw.com\ntcylgslb.com\ntczgwzw.com\ntczj.net\ntczmled.com\ntd-sf.com\ntd-tech.com\ntd22.com\ntd2cn.com\ntd300321.com\ntd776.com\ntd96.com\ntd98.com\ntdances.com\ntdasz.com\ntdatamaster.com\ntdataspace.com\ntdbbj.com\ntdchats.us\ntdchatvip.us\ntddmp.com\ntdfsm.com\ntdgdy.org\ntdgod.com\ntdiac.com\ntdict.com\ntdimg.com\ntdjxhb.com\ntdkchina.com\ntdmall.cc\ntdmoli2.com\ntdmta.com\ntdns127.com\ntdnsdlovs1.com\ntdnsdlovs2.com\ntdnsdlovs3.com\ntdnsdlovs4.com\ntdnsdlovs5.com\ntdnsdp.com\ntdnsdpovs1.com\ntdnsdpovs2.com\ntdnsdpovs3.com\ntdnsdpovs4.com\ntdnsdpovs5.com\ntdnsliveovs1.com\ntdnsliveovs2.com\ntdnsliveovs3.com\ntdnsliveovs4.com\ntdnsliveovs5.com\ntdnsspovs1.com\ntdnsspovs2.com\ntdnsspovs3.com\ntdnsspovs4.com\ntdnsspovs5.com\ntdnssticovs1.com\ntdnssticovs2.com\ntdnssticovs3.com\ntdnssticovs4.com\ntdnssticovs5.com\ntdnsv1.com\ntdnsv1.net\ntdnsv10.com\ntdnsv10.net\ntdnsv11.com\ntdnsv11.net\ntdnsv12.com\ntdnsv12.net\ntdnsv13.com\ntdnsv13.net\ntdnsv14.com\ntdnsv14.net\ntdnsv2.com\ntdnsv2.net\ntdnsv3.com\ntdnsv3.net\ntdnsv4.com\ntdnsv4.net\ntdnsv5.com\ntdnsv5.net\ntdnsv6.com\ntdnsv6.net\ntdnsv7.com\ntdnsv7.net\ntdnsv8.com\ntdnsv8.net\ntdnsv9.com\ntdnsv9.net\ntdnsvodovs1.com\ntdnsvodovs2.com\ntdnsvodovs3.com\ntdnsvodovs4.com\ntdnsvodovs5.com\ntdnsx1.com\ntdotapp.com\ntdpress.com\ntdqs.com\ntdrffh.com\ntds-1300.com\ntdsf.asia\ntdsfiles.com\ntdshbao.com\ntdsjbj.com\ntdtbd.com\ntdtec.com\ntdun.com\ntduou.com\ntdwan.com\ntdxz.net\ntdyxmoto.com\ntdzntech.com\ntdzyw.com\nte-ch.tech\nte-silicone.com\nte160.com\nte5.com\nte6.com\ntea-gd.com\ntea26.com\ntea7.com\nteach365.com\nteachblog.net\nteachclinic.com\nteachcn.net\nteachercn.com\nteachers211.com\nteachertc.com\nteakki.com\nteaku.com\nteallang.com\ntealui.com\nteamall.cc\nteambition.com\nteambition.net\nteambitionapis.com\nteamlogs.com\nteamminus.com\nteamotto.net\nteamshub.com\nteamtop.com\nteamtopgame.com\nteandy.com\nteatreexy.com\ntebaidu.com\ntebiao.net\ntebie6.com\ntebiefuza.cloud\ntebiezan.com\ntebiezhuan.com\nteboncapital.com\ntec73.com\ntecbbs.com\ntecenet.com\ntech-long.com\ntech-mx.com\ntech-now.com\ntech-sem.com\ntech-sonic.net\ntech002.com\ntech1024.com\ntech110.net\ntech2ipo.com\ntech2real.com\ntech4joy.com\ntechan.com\ntechannet.com\ntechanshop.com\ntechantong.net\ntechbeat.net\ntechbrood.com\ntechdow.com\ntechfine.net\ntechflowpost.com\ntechgastronomy.com\ntechgogogo.com\ntechigh.net\ntechingrid.net\ntechmiao.com\ntechmoris.com\ntecho.chat\ntecho.pub\ntecho.show\ntechoke.com\ntechonegame.com\ntechqianmo.com\ntechsir.com\ntechsize.com\ntechtmt.com\ntechtop.com\ntechuangyi.com\ntechub.news\ntechug.com\ntechvisum.com\ntechwalker.com\ntechwell-cn.com\ntechwin.com\ntechxue.com\nteclast.com\ntecmz.com\ntecochina.net\ntecolighting.com\ntecompharma.com\ntecreal.com\ntecunonline.com\ntecyle.com\nteda-veolia.com\ntedagas.com\ntedahotel.com\ntedahr.com\ntedaich.com\ntedaniu.com\ntedastock.com\nteddycc.com\nteddymobile.net\ntedushi.com\ntedx.net\ntedy.cc\nteejia.com\nteeqee.com\ntefact.com\ntefl-china.net\ntefscloud.com\ntefscloud.net\ntefshipping.com\ntegongji.com\ntegoushe.com\ntegvzpvz.com\ntehang.com\ntehub.com\ntehuituan.com\nteilei.com\ntejiabiao.com\ntejiawang.com\ntek-asia.com\ntekkenthree.com\ntekshanghai.com\ntekuaijie.com\ntel01.com\ntelaideyouxue.com\nteld.net\ntelecomhb.com\ntelecomhr.com\ntelecomjs.com\ntelefen.com\ntelegerlam.cc\ntelegramcn.co\ntelegramggo.com\ntelegramtoke.com\ntelegramyug.cc\ntelegroiam.cc\ntelehr.com\nteleinfoo.com\ntelekoml.cfd\nteleland.net\ntelemgrasm.cc\nteleows.com\ntelergaemoam.cc\ntelevivi.com\ntelfri.net\nteligen-cloud.com\nteligen.net\nteliute.org\ntelking.com\ntell520.com\ntellgen.com\ntelling.com\ntellingtech.com\ntelllove520.com\ntellmachgd.com\ntelnet404.com\ntelongzn.com\ntelpo.com\ntelrgeam.cc\ntelsda.com\ntelu.net\ntelunsu.net\ntem.pw\ntemaiapi.com\ntemaiku.com\ntemch.net\ntemedical.com\ntemox.com\ntemp.im\ntempersyi.com\nten.design\ntenag.com\ntenant-zone-dev.com\ntenbilliongame.com\ntencdns.com\ntencdns.net\ntencenst.com\ntencent-blackboard.com\ntencent-cloud.com\ntencent-cloud.net\ntencent-education.com\ntencent-gcloud.com\ntencent-gf.com\ntencent-qejs.com\ntencent-stock.com\ntencent.co.id\ntencent.com\ntencent.com.hk\ntencent.design\ntencent.net\ntencentads.com\ntencentads.net\ntencentanxin.com\ntencentapigw.com\ntencentapis.com\ntencentapp.com\ntencentapps.com\ntencentbh.com\ntencentbyod.com\ntencentcc.com\ntencentcdb.com\ntencentcds.com\ntencentcfs.com\ntencentciam.com\ntencentclb.cc\ntencentclb.cloud\ntencentclb.com\ntencentclb.host\ntencentclb.info\ntencentclb.link\ntencentclb.net\ntencentclb.online\ntencentclb.plus\ntencentclb.pro\ntencentclb.site\ntencentclb.space\ntencentclb.team\ntencentclb.tech\ntencentclb.vip\ntencentclb.work\ntencentclb.zone\ntencentcloud-aiot.com\ntencentcloud-demo.com\ntencentcloud.com\ntencentcloud.io\ntencentcloudapi.com\ntencentcloudapp.com\ntencentcloudbase.com\ntencentcloudbase.net\ntencentcloudclub.com\ntencentcloudcore.com\ntencentcloudcr.com\ntencentcloudcs.com\ntencentcloudga.com\ntencentcloudga001.com\ntencentcloudga001.net\ntencentcloudga002.com\ntencentcloudga002.net\ntencentcloudga003.com\ntencentcloudga003.net\ntencentcloudga004.com\ntencentcloudga004.net\ntencentcloudga005.com\ntencentcloudga005.net\ntencentcloudga006.com\ntencentcloudga006.net\ntencentcloudga007.com\ntencentcloudga007.net\ntencentcloudga008.com\ntencentcloudga008.net\ntencentcloudga009.com\ntencentcloudga009.net\ntencentcloudga010.com\ntencentcloudga010.net\ntencentcloudga011.com\ntencentcloudga011.net\ntencentcloudga012.com\ntencentcloudga012.net\ntencentcloudga013.com\ntencentcloudga013.net\ntencentcloudga014.com\ntencentcloudga014.net\ntencentcloudga015.com\ntencentcloudga015.net\ntencentcloudga016.com\ntencentcloudga016.net\ntencentcloudga017.com\ntencentcloudga017.net\ntencentcloudga018.com\ntencentcloudga018.net\ntencentcloudga019.com\ntencentcloudga019.net\ntencentcloudga020.com\ntencentcloudga020.net\ntencentcloudga021.com\ntencentcloudga021.net\ntencentcloudga022.com\ntencentcloudga022.net\ntencentcloudga023.com\ntencentcloudga023.net\ntencentcloudga024.com\ntencentcloudga024.net\ntencentcloudga025.com\ntencentcloudga025.net\ntencentcloudga026.com\ntencentcloudga026.net\ntencentcloudga027.com\ntencentcloudga027.net\ntencentcloudga028.com\ntencentcloudga028.net\ntencentcloudga029.com\ntencentcloudga029.net\ntencentcloudga030.com\ntencentcloudga030.net\ntencentcloudipv6.com\ntencentcloudlab.com\ntencentcloudlive.com\ntencentcloudmarket.com\ntencentcloudmq.com\ntencentcloudns.com\ntencentcloudsandbox.com\ntencentcloudsec.com\ntencentcloudses.com\ntencentcloudsso.com\ntencentcls.com\ntencentcmq.com\ntencentcode.com\ntencentcomics.com\ntencentconsulting.com\ntencentcos.cloud\ntencentcos.com\ntencentcos.net\ntencentcs.com\ntencentcsms.com\ntencentdayu.com\ntencentdb.com\ntencentddos.com\ntencentdevices.com\ntencentdigitalassistant.com\ntencentdmp.com\ntencentdms.com\ntencentedi.com\ntencentehs.com\ntencenteiam.com\ntencentelasticsearch.com\ntencentemr.com\ntencentes.com\ntencentexpert.com\ntencentfanyi.com\ntencentff.com\ntencentfilm.com\ntencentfoundation.org\ntencentga.com\ntencentgames.co\ntencentgames.us\ntencentgme.com\ntencentgse.com\ntencentgy.com\ntencenthangjia.com\ntencentiam.com\ntencenticp.com\ntencentid.com\ntencentidaas.com\ntencentidentity.com\ntencentimage.com\ntencentimage.net\ntencentiotcloud.com\ntencentiotmedia.com\ntencentipv6.com\ntencentlegalservices.com\ntencentlink.com\ntencentlkfz.com\ntencentlog.com\ntencentmail.com\ntencentmdb.com\ntencentmeeting.com\ntencentmfa.com\ntencentmind.com\ntencentmovie.com\ntencentmusic.com\ntencentoa.com\ntencentoceanus.com\ntencentpay.com\ntencentproxy.com\ntencentrce.com\ntencentrcpcsdk.com\ntencentresearch.com\ntencentrio.com\ntencentscf.com\ntencentsecsdk.com\ntencentserverless.com\ntencentservicewatcher.com\ntencentses.com\ntencentsite.com\ntencentsmhcname.com\ntencentsmhuc.com\ntencentsource.com\ntencentstart.com\ntencentsuite.com\ntencentsurvey.com\ntencentsurvey.net\ntencenttcr.com\ntencenttdai.com\ntencenttdmq.com\ntencenttds.com\ntencenttid.com\ntencenttione.com\ntencenttree.com\ntencenttrtc.com\ntencenttymaas.com\ntencentud.com\ntencentvpc.com\ntencentweiban.com\ntencentwemeet.club\ntencentwepark.com\ntencentwf.com\ntencentwm.com\ntencentwukong.com\ntencentxinge.com\ntencentyouth.com\ntencentyun.com\ntencentzhzf.com\ntenchii.com\ntencity.com\ntendacn.com\ntendata.net\ntendawifi.com\ntendbcluster.com\ntendbcluster.net\ntendcloud.com\ntendcode.com\ntenddata.com\ntenddata.net\ntendfo.com\ntendis.net\ntendrones.com\ntendyron.com\ntengamy.com\ntenganxinxi.com\ntengbai-it.com\ntengbenyueji.com\ntengbo.cc\ntengchangjiancai.com\ntengchu.com\ntengdatumu.com\ntengdawl.com\ntengdazuche.com\ntengen.com\ntengfangyun.com\ntengfeidn.com\ntengfeijob.com\ntengfeizhida.com\ntengfun.com\ntenghen.com\ntenghesmart.com\ntenghoo.com\ntengkackjr.com\ntengkaxx.com\ntenglong.net\ntenglonggroup.com\ntengmed.com\ntengmoney.com\ntengning.net\ntengnu999.com\ntengnuobx.com\ntengrant.com\ntengshengchina.com\ntengshiauto.com\ntengtiegongyi.com\ntengwen.com\ntengxuan.net\ntengxunlct.com\ntengxunqiye.com\ntengxunqiyeyou.com\ntengy.com\ntengya.com\ntengyang666.com\ntengye-vc.com\ntengyeshiye.com\ntengyu-group.com\ntengyuejz.com\ntengyunqq.com\ntengzhihh.com\ntengzhipp.com\ntengzhou0632.com\ntengzhuan.com\ntenhot.net\ntenio.com\ntenjia.cc\ntenjincn.com\ntenkent.com\ntenlonstudio.com\ntenmh.com\ntennny.com\ntennoo.com\ntenorforman.com\ntenorshare.com\ntenorshare.tw\ntenovatech.com\ntenpay.com\ntenqent.com\ntenrays.com\ntensafe.com\ntensgpt.com\ntenshi.cc\ntensorchip.com\ntensorflownews.com\ntensorlet.org\ntensuntrans.com\ntensure.com\ntensynchina.com\ntentech.club\ntentrue.com\ntentx.com\ntenwowfood.com\ntenwukong.com\ntenxapp.com\ntenxcloud.com\ntenxcloud.net\ntenyn.com\nteo-rum.com\nteoacc.com\nteoacc.net\nteown.com\ntepcb.com\ntepin.hk\ntequanma.com\nterabuy.com\nterapark.com\nterapines.com\nterencemusic.com\nteresahowarddoula.com\nteridge.com\nterminal.icu\nterminus.io\nterose.com\nterra-master.com\nterran.tech\nterransforce.com\nterratribes.com\nterrypacking.com\nterrytec.com\nteruide.net\ntese5.com\ntesery.com\ntesexiu.com\nteshenqi.com\ntesight.com\ntesiro.com\ntesolsh.com\ntesoon.com\ntest-cignacmb.com\ntestbird.com\ntestcoo.com\ntestdemo.work\ntesteb.com\ntesteck.com\ntesterhome.com\ntestict.com\ntestingpai.com\ntestinsight.net\ntestlrq.com\ntestmrrvendor.com\ntestroad.org\ntestrust.com\ntestshm.com\ntestsparkling.com\ntestwaf.com\ntestwo.com\ntestxy.com\ntesys.online\ntetcm.com\ntetegu.com\nteteyu.com\ntetrisone.com\ntetuijiudian.com\nteuhui.com\ntevachem.com\ntex68.com\ntexasholdemcup.com\ntexasholdemcup.net\ntexpage.com\ntexpageusercontent.com\ntexpro-group.com\ntextaihua.com\ntextin.com\ntexzhongtao.com\nteyonds.com\nteyop.com\ntez-tencentclb.cloud\ntez-tencentclb.com\ntez-tencentclb.net\ntezhengma.com\ntezhongzhuangbei.com\ntezign.com\ntf-bm.com\ntf.wiki\ntf56.com\ntfauto.net\ntfax.com\ntfbestea.com\ntfbird.com\ntfbkw.com\ntfbx.net\ntfcaijing.com\ntfcloud.com\ntfclub.com\ntfcsz.com\ntfdsb.org\ntfedu.net\ntfeic.com\ntfengyun.com\ntff.bz\ntfg2.com\ntfgame.vip\ntfgas.com\ntfgvb.com\ntfidc.net\ntfkj.games\ntfkyj.com\ntflzhongkongban.com\ntfme.com\ntfmywood.com\ntfogc.com\ntfogc.net\ntfoison.com\ntfol.com\ntfoyin.com\ntfrl.net\ntfs906.com\ntfsb.net\ntfsino.com\ntfsmy.com\ntftplay.com\ntfvisa.com\ntfxqrmyy.com\ntfyum.net\ntfzikao.com\ntfzq.com\ntg-vision.com\ntg-vision.net\ntg0123.com\ntg1234.com\ntg138.com\ntgametalent.com\ntgbus.com\ntgcid.org\ntgcondo.com\ntgcook.com\ntgcyber.com\ntgect.com\ntgeosmart.com\ntgjbs.work\ntgjh.com\ntgking.net\ntgkjjg.com\ntgldfm.com\ntgljw.com\ntglxh.com\ntgnet.com\ntgo-ai.com\ntgovcloud.com\ntgprocs.net\ntgr365.com\ntgshiguan.com\ntgslsst.com\ntgstech.com\ntgtenty.com\ntgtest.site\ntgtianshanga.com\ntguangxue.com\ntgzhz.com\ntgzwmk.xyz\nth-sjy.com\nth-tencentclb.cloud\nth-tencentclb.com\nth-tencentclb.net\nth-tencentclb.work\nth-water.net\nth.bing.com\nth21333.com\nth38.com\nth99.com\nthaicn.com\nthailycare.com\nthaivor.com\nthaiyellowpagesusa.com\nthakjsbyy.com\nthamco.com\nthanju.com\nthankbabe.com\nthankyou99.com\nthankyoumaris.com\nthanmelin.com\nthape.com\nthatinterpreter.net\nthatsmags.com\nthatsmandarin.com\nthatwind.com\nthboiler.com\nthcad.net\nthcantech.com\nthcf168.com\nthclouds.com\nthdangzhun.com\nthdb.com\nthe-dahan.com\nthe4can.com\nthe5fire.com\nthe9.com\ntheantiagingshow.com\nthearenacapital.com\nthearyong.com\ntheateliercouture.com\nthebeastshop.com\nthebeijinger.com\nthebeijingnews.com\nthebird-air.com\nthebizark.com\nthebuddycreative.com\nthecalicocafepa.com\nthecfa.info\nthechois.cc\nthecodeway.com\nthedatasys.com\nthederma.com\ntheduapp.com\nthedutchman.org\nthefastcdns.com\nthefastfile.com\nthefastimg.com\nthefastmake.com\nthefastvideo.com\nthefatherofsalmon.com\nthefilehosting.com\nthefrodo.com\nthegiac.com\nthegoods.asia\nthegraduation.store\nthegreatwall-china.com\nthehanshow.com\ntheheirism.com\ntheicstock.com\nthejamy.com\nthejiangmen.com\nthejie.com\nthejoyrun.com\nthekunlunbeijing.com\nthekunlunjingan.com\nthelalu.com\nthelarkcloud.com\nthelastsky.com\nthemebetter.com\nthemediumtx.org\nthemeoffices.com\nthemeol.com\nthemex.net\nthemisweeps.com\nthemixc.com\nthemulian.com\nthemumian.com\nthemusiqu.com\nthen9.com\nthenburn.com\nthenew123.com\nthenewhotel.com\nthenewstreams.com\nthenextravelmarket.com\ntheoborn.com\ntheoreticalw.com\ntheorychina.org\nthepeak.com.my\nthepoemforyou.com\nthepredictivemodel.com\nthepresidentialhotel.com\nthepsychscrivener.com\nthepuli.com\ntherasaganga.com\ntheseshepherd.com\nthesetech.com\nthesmartmelon.com\nthesofabedshop.com\ntheszt.com\nthetali.com\nthethirdmedia.com\nthetigerhood.com\nthetollroadsc.icu\nthetongji.com\nthetoplab.com\nthetype.cloud\nthevaldezfamily.com\nthevideosworld.com\ntheweina.com\nthewestinpazhou.com\nthewhitedragons.com\nthewowa.com\nthewrittencoach.com\nthexinji.com\nthexnode.com\ntheytree.com\nthfdc.net\nthfdcsoft.com\nthffc.com\nthgkyy.com\nthgsjt.com\nthief.im\nthiemechina.com\nthinbug.com\nthingclub.com\nthingjs.com\nthingskit.com\nthinheal.com\nthink-mall.com\nthink-way.net\nthinkcloudlab.com\nthinkcmf.com\nthinkdid.com\nthinkdream.com\nthinkeffective-usa.com\nthinkeridea.com\nthinkerride.com\nthinkerx.com\nthinkindrupal.com\nthinkive.com\nthinkjs.org\nthinkpad.com\nthinkprinter.net\nthinkraz.com\nthinksrc.com\nthinkstu.com\nthinkvo.com\nthinkyea.com\nthinkyeah.com\nthinla.com\nthinmoo.com\nthinvent.com\nthirtyindiantrail.com\nthis6.com\nthishealthsummit.com\nthismomentinamerica.org\nthisnew.com\nthisshop.com\nthiztech.com\nthjb.net\nthjiang.com\nthjjhs.com\nthjunshi.com\nthkconn.com\nthkill.com\nthm3u8.com\nthmall.com\nthmfvb.com\nthmins.com\nthmnet.com\nthmovie.com\nthmz.com\nthmzedu.com\nthny.cc\nthomanmustore.shop\nthomasschools.com\nthoreco.com\nthorn.red\nthorne-eco.org\nthosefree.com\nthoughtworkers.org\nthrbs.com\nthreadcn.com\nthreatbook.com\nthreatbook.net\nthreetong.com\nthreewater.net\nthrive-chemicals.com\nthronechina.com\nthroughyourlens.org\nthrrip.space\nths123.com\nths8.com\nthsj.com\nthsolar.com\nthsware.com\nthtfpc.com\nthufeng.net\nthumbenv.com\nthumedialab.com\nthundercdn.com\nthundercdn.net\nthundercloud.group\nthunderflash.net\nthunderobot.com\nthunderplaygame.com\nthundersoft.com\nthunderurl.com\nthunis.com\nthunisoft.com\nthunlp.org\nthupdi.com\nthvow.com\nthwater.com\nthwgetsy.com\nthwiki.cc\nthwpmanage.com\nthxddb.com\nthxdx.com\nthxflt.com\nthxnr.com\nthxtg.org\nthxy.org\nthxyy.com\nthyoo.com\nthyristors.org\nthyuu.com\nthz56.com\nthzab.com\nthztv.net\nthzu.cc\nti-node.com\nti-solar.com\nti0s.com\nti360.org\ntiamaes.com\ntian-gang.com\ntian-jie.com\ntian-run.com\ntian-ting.ink\ntian10.com\ntianan-cyber.com\ntianan-insurance.com\ntianan-life.com\ntianan.com\ntianan.net\ntiananaq.com\ntiananchem.com\ntiananmenchenglou.com\ntianapi.com\ntianbaosi.com\ntianbiao.net\ntiancaixing.com\ntiancaixing.net\ntiancao360.com\ntiancehang.com\ntianchanggongjiao.com\ntianchenalum.com\ntianchengas.com\ntianchi.com\ntianchihao.com\ntianchu.com\ntianchuixiang.com\ntianchy.com\ntiancichina.com\ntiancity.com\ntiancitycdn.com\ntiandi.com\ntiandirenfarm.com\ntianditao.com\ntianditu.com\ntiandiyoyo.com\ntiandizw.com\ntianduntech.com\ntiandy.com\ntianehui.net\ntianfeiyu.com\ntianfeng.cc\ntianfu-stone.com\ntianfucaijing.com\ntianfugroup.com\ntianfuhui.xin\ntianfupic.com\ntianfusoftwarepark.com\ntiangaicha.com\ntiangang.com\ntiangen.com\ntiangou.xyz\ntianhai.info\ntianhai2002.com\ntianhaixing.com\ntianhebus.com\ntianhejiayi.com\ntianheoil.com\ntianhepiano.com\ntianheplaza.com\ntianhetech.com\ntianhongchina.com\ntianhongdiaosu.com\ntianhonglaser.com\ntianhongsunshine.com\ntianhuixile.com\ntianhujy.com\ntianiot.com\ntianji368.com\ntianjiachem.com\ntianjiang-tech.com\ntianjiarun.com\ntianjibio.com\ntianjigame.com\ntianjigu.com\ntianjihr.com\ntianjimedia.com\ntianjin-air.com\ntianjin-iwc.com\ntianjin-marathon.com\ntianjin-patek.com\ntianjinbbs.com\ntianjinbohaileasing.com\ntianjingames.com\ntianjinwe.com\ntianjiyy.com\ntiankang.com\ntiankong.com\ntiankonghuyugames.com\ntiankuojy.com\ntianlaiedu.com\ntianlaijiaoyu.com\ntianlaikge.com\ntianlailive.com\ntianlala.com\ntianli-blog.club\ntianlian.com\ntianlijianshe.com\ntianliwindpower.com\ntianlongshop.com\ntianlun.net\ntianlun100.com\ntianlunano.com\ntianlungas.com\ntianma3600.com\ntianmaijigou.com\ntianmalvyou.com\ntianmao.com\ntianmapharma.com\ntianmarketing.com\ntianmawx.com\ntianmaying.com\ntianmidian.com\ntianmimiclub.com\ntianmu.mobi\ntianmu.net\ntianmuds.com\ntianmumusic.com\ntianmunews.com\ntianmupe.com\ntiann90.com\ntiannbo.com\ntiannengcarbon.com\ntiannilaw.com\ntianning.xyz\ntianninghr.com\ntiannucoating.com\ntiannv.com\ntianpeng.com\ntianpu.com\ntianqi.cc\ntianqi.com\ntianqi24.com\ntianqi321.com\ntianqiaojuyuan.com\ntianqiaoyishuzhongxin.org\ntianqiapi.com\ntianqicloud.com\ntianqihoubao.com\ntianqiip.com\ntianqijun.com\ntianqilithium.com\ntianqistatic.com\ntianqiweiqi.com\ntianqiyubao3.com\ntianqiyubao4.com\ntianqiyubao9.com\ntianqizhixin.com\ntianqu.com\ntianquangs.com\ntianquetech.com\ntianqunnet.com\ntianrkl.com\ntianrow.com\ntianruihr.com\ntianrunshunteng.com\ntianruo.net\ntianruoyun.com\ntiansdl.com\ntiansenjituan.com\ntianshan277.com\ntianshanxt.com\ntianshengdiyi.com\ntianshengholdings.com\ntianshenyule.com\ntianshiyiyuan.com\ntianshugame.com\ntianshungroup.com\ntiansu-china.com\ntiantaichina.com\ntiantaienergy.com\ntiantailaw.com\ntiantaishebei.com\ntiantaivideo.com\ntiantanbio.com\ntiantang100.com\ntiantang6.com\ntiantangnian.com\ntiantanpark.com\ntiantaocs.com\ntiantaxx.com\ntiantexing.com\ntianti.com\ntiantianbannixue.com\ntiantiancaige.com\ntiantiancaipu.com\ntiantianfm.com\ntiantianfunds.com\ntiantianleshuiguo.com\ntiantianquce.com\ntiantiansoft.com\ntiantiantiaosheng.com\ntiantianxieye.com\ntiantianxuexi.com\ntiantingfm.com\ntiantis.com\ntiantonglaw.com\ntianvalue.com\ntianwang.com\ntianwenca.com\ntianwt.com\ntianwugroup.com\ntianxia70.com\ntianxiajiameng.com\ntianxiajiaoyi.com\ntianxiamaimai.com\ntianxiang.com\ntianxianmao.com\ntianxiaputao.com\ntianxiaquanchengapp.com\ntianxiawangxiao.com\ntianxiawushi.com\ntianxiawuzei.org\ntianxiaxiao.net\ntianxiaxinyong.com\ntianxiayouxi.com\ntianxiayouyue.com\ntianxin100.vip\ntianxing.com\ntianxingjianyiliao.com\ntianxinkeji.com\ntianya.com\ntianya.tv\ntianya66.com\ntianyabook.com\ntianyaclub.com\ntianyaluedu.com\ntianyancha.com\ntianyancha.net\ntianyangqz.com\ntianyanqifu.com\ntianyaruanwen.com\ntianyaui.com\ntianyecollege.com\ntianyi1368.com\ntianyibook.com\ntianyid78.com\ntianyihy.net\ntianyiidc.com\ntianyijue.com\ntianyinzaixian.com\ntianyisc.com\ntianyitop.com\ntianyiwangxiao.com\ntianyon.com\ntianyongcheng.com\ntianyuanfishing.com\ntianyuanjiudian.com\ntianyuanpet.com\ntianyucangqiongxiaoshuo.com\ntianyuchaye.com\ntianyuimg.com\ntianyujidi.com\ntianyutest.com\ntianyuyuan.com\ntianzeqiti.com\ntianzequan.com\ntianzhao.net\ntianzhishui.com\ntianzhitong.net\ntianzhuo.com\ntianzhuobj.com\ntianzijiaoyu.com\ntianziweb.net\ntianzongyouxi.com\ntiaodao.com\ntiaofang.com\ntiaoguangbolimo.com\ntiaohao.com\ntiaohaoba.com\ntiaoka.com\ntiaomama.com\ntiaomaruanjian.com\ntiaona.com\ntiaooo.com\ntiaotiao.store\ntiaotiaotang.net\ntiaovon.com\ntiaoyue.xyz\ntiaozhanbei.net\ntiatiatoutiao.com\ntibaitong.com\ntibet3.com\ntibet4wd.com\ntibetanbible.org\ntibetannet.com\ntibetcn.com\ntibetcnr.com\ntibetcul.com\ntibetculture.net\ntibetcyts.com\ntibethospital.com\ntibetpic.com\ntiboshi.org\ntic-gx.com\ntica.com\nticachina.com\nticketdashi.com\nticketmars.com\nticp.io\nticp.net\nticpayidr.com\nticpsh.com\nticstore.com\nticwear.com\ntidaas.com\ntidb.ai\ntidb.io\ntidb.net\ntidbcloud.com\ntide-china.com\ntide.fm\ntidejd.com\ntidemedia.com\ntidepharm.com\ntidesec.com\ntideswing.fun\ntidi.mobi\ntiduyun.com\ntieba.com\ntiebaimg.com\ntiebanzi.com\ntiebaobei.com\ntiedan2019.com\ntiegu.com\ntiehuatu.com\ntiejiang.org\ntiejiong.com\ntiejunmedia.com\ntiekuangshi.com\ntielemao.com\ntielingcn.com\ntielu.cc\ntielu.org\ntielu123.com\ntielujob.com\ntiemeeting.com\ntiemu.com\ntieniujixie.com\ntiens.com\ntiepishihu.com\ntieque.net\ntiesan.com\ntieshuwang.net\ntietie.la\ntietuku.com\ntietuo.work\ntieweishi.com\ntieww.com\ntiexing.com\ntiexing.net\ntiexiuyugudao.com\ntiexue.net\ntiexuedanxin.net\ntieyang.com\ntieyou.com\ntiezhima.com\ntiezis.com\ntifenxi.com\ntiger-code.com\ntiger-info.com\ntiger-motion.com\ntiger2doudou.com\ntigerbbs.com\ntigerbrokers.com\ntigerbrokers.net\ntigerdns.com\ntigeresop.com\ntigerfintech.com\ntigermed.net\ntigermedgrp.com\ntigersecurities.com\ntigeryun.com\ntigr.link\ntiham.com\ntijian001.com\ntijian123.com\ntijianbao.com\ntijianshangmen.com\ntijianzhuanjia.com\ntijox.cc\ntijox.com\ntijox.hk\ntijox.net\ntijox.org\ntik-tokapi.com\ntik2019.com\ntikersport.com\ntiktoknewaccount.com\ntiktokrow-cdn.com\ntikuol.com\ntikv.org\ntileywy.com\ntillcn.com\ntillglance.com\ntimanetworks.com\ntimbrd.com\ntime-weekly.com\ntime-year.com\ntimecoo.com\ntimedg.com\ntimedl.com\ntimedoo.com\ntimeep.com\ntimelate.com\ntimelessq.com\ntimemachine.icu\ntimenetwork.tech\ntimeofdate.com\ntimeoutbeijing.com\ntimeoutcn.com\ntimeoutshanghai.com\ntimephread.com\ntimepill.net\ntimeread.com\ntimeread.net\ntimesartmuseum.com\ntimesboom.com\ntimescollege.com\ntimesdf-hn.com\ntimesfortune.com\ntimesndt.com\ntimesoutlets.com\ntimestock.co\ntimetickme.com\ntimeticktick.com\ntimetw.com\ntimev.com\ntimevary.com\ntimewelder.com\ntimez.com\ntimi78.com\ntimibase.com\ntiming360.com\ntimitime.com\ntimiwc.com\ntimjx.com\ntimmerse.com\ntimsgrank-apphome65.com\ntimzuu.com\ntinavi.com\ntinengwang.com\ntinetcloud.com\ntinfinite.com\ntinfo.com\nting22.com\nting27.com\nting55.com\nting89.com\ntingbook.com\ntingchewei.net\ntingchucontrol.com\ntingclass.com\ntingfun.net\ntinghaohr.com\ntinghen.com\ntinghongzz.com\ntingjiandan.com\ntingke8.com\ntingkez.com\ntinglifangs.com\ntingmall.com\ntingmei.com\ntingmimi.net\ntingmubeef.com\ntingniukeji.com\ntingood.com\ntingpiting.com\ntingroom.com\ntingshubao.net\ntingshumi.com\ntingshuo51.com\ntingshuowan.com\ntingsonglaw.com\ntingtao.net\ntingtingfm.com\ntingtingwo.com\ntingvision.com\ntingxi8.com\ntingxiangzu.com\ntingxiaoyou.com\ntingyulou.com\ntingyun.com\ntingyutech.net\ntiniangroup.com\ntinigame.xyz\ntinkad.com\ntinkerpatch.com\ntinktek.net\ntinman798.net\ntinning-automation.com\ntinsecret.com\ntinstu.com\ntinwod.com\ntinychen.com\ntinycms.xyz\ntinyems.com\ntinyfeng.com\ntinyflare.com\ntinygroup.org\ntinylab.org\ntinymind.com\ntinypixos.com\ntinyservices.net\ntinywan.com\ntinyyuan.com\ntipaipai.com\ntipask.com\ntipdm.com\ntipdm.org\ntipray.com\ntiprpress.com\ntipsoon.com\ntiqcdn.com\ntiqiaa.com\ntiqianle.com\ntirechina.net\ntiremay.com\ntiruna-cn.com\ntiscend.com\ntisgame.com\ntisi.org\ntisino.com\ntisiwi.com\ntisohinge.com\ntisptech.com\ntita.com\ntita.net\ntitamobi.com\ntitan007.com\ntitan24.com\ntitanar.com\ntitanlaw.com\ntitanm.com\ntitanmatrix.com\ntitans-ele.com\ntitansci.com\ntitapark.com\ntitianshanfz.com\ntititxt.com\ntitloteka.com\ntitussb.com\ntivitv.com\ntiwb.com\ntiwu.net\ntixa.com\ntixaapp.com\ntixue.net\ntiyamat.com\ntiye.me\ntiyeji.com\ntiyep.com\ntiyucdn.com\ntiyufeng.com\ntiyuguoji.com\ntiyule.com\ntiyusaishi.com\ntiyushe.com\ntiyuxiu.com\ntizi.com\ntizi365.com\ntizoinfo.com\ntj-fch.com\ntj-guangxin.com\ntj-kingdee.com\ntj-model.com\ntj-un.com\ntj0573.com\ntj20.com\ntj2022.com\ntj316bxg.com\ntj47zx.net\ntj9.co\ntjab.org\ntjafxh.com\ntjaide.com\ntjbb.com\ntjbearing.com\ntjbh.com\ntjbhnews.com\ntjboai.com\ntjbpi.com\ntjbsq.com\ntjbus.com\ntjbxingbian.com\ntjcamp.com\ntjcaoshiyabo.com\ntjcecp.com\ntjcep.com\ntjchangxing.com\ntjchildrenshospital.com\ntjcid.com\ntjckjr.com\ntjcn.org\ntjcondom.com\ntjcta.org\ntjculture.com\ntjcyts.com\ntjczjxsb.com\ntjdeviser.com\ntjdewy.com\ntjdrzc.com\ntjdyf.com\ntjeco-city.com\ntjeti.com\ntjfengfan.com\ntjfer.com\ntjflcpw.com\ntjfxdx.com\ntjfytech.com\ntjgcs.com\ntjgdjt.com\ntjgg88.com\ntjghw.com\ntjgmcg.com\ntjgportnet.com\ntjgtgd.com\ntjhgmc.com\ntjhmsj.com\ntjhtcpvc.com\ntjhyzyxy.com\ntji.io\ntjian.com\ntjinsuo.com\ntjj.com\ntjjfrh.com\ntjjhqyy.com\ntjjiaotong.com\ntjjinglang.com\ntjjt360.com\ntjjtjt.net\ntjjwt.com\ntjjwwl.com\ntjjzzls.com\ntjkache.com\ntjkeheng.com\ntjkj300.com\ntjkp-tools.com\ntjkpzx.com\ntjkx.com\ntjkximg.com\ntjllhbkj.com\ntjluohuzhijia.com\ntjmama.com\ntjmcgc.com\ntjmhc.com\ntjmldy.com\ntjmuch.com\ntjnjw.com\ntjoy.biz\ntjpa-china.org\ntjpma.org\ntjpme.com\ntjportnet.com\ntjq.com\ntjqiqiu.com\ntjqq.cc\ntjrenliziyuan.com\ntjrenmu.com\ntjruien.com\ntjsjnxh.com\ntjsjwygg.com\ntjsjx.com\ntjskq.com\ntjskqyy.com\ntjsptech.com\ntjst.net\ntjstats.com\ntjsylhh.com\ntjszyy.com\ntjtele.com\ntjtjshengtu.com\ntjtongrentang.com\ntjtrust.com\ntjtsxd.com\ntjtum.work\ntjtvc.com\ntjubbs.net\ntjumc.com\ntjupdi.com\ntjuzj.com\ntjwatergroup.com\ntjwch.com\ntjwch.org\ntjwenjie.com\ntjwf.com\ntjwj88.com\ntjwmschool.net\ntjxdzhonda.com\ntjxinyu.com\ntjxiqi.com\ntjxunlei888.com\ntjxxcl.com\ntjxz.cc\ntjydyt.com\ntjyun.com\ntjzb.com\ntjzcsj.com\ntjzfcg.com\ntjzfhgcj.com\ntjzhongyiyao.com\ntjzhyj.com\ntjznjt.com\ntjzxyy.com\ntjzyec.com\ntjzyefy.com\ntjzyfw.com\ntjzymob.com\ntk-life.com\ntk-rays.com\ntk-xiong.com\ntk.anythinktech.com\ntk163.com\ntk233.xyz\ntk315.com\ntkas2019.com\ntkchina.com\ntkckjr.com\ntkcn.cc\ntkd-suzhou.com\ntkfashion.club\ntkfff.com\ntkgame.com\ntkhealthcare.com\ntkjzym.com\ntkll12131nb.com\ntkmedicare.com\ntkpension.com\ntkplusemi.com\ntkrlab.com\ntktjwhyy.com\ntktk123.com\ntkw.cc\ntkwcn.com\ntkww.hk\ntkxb.net\ntkxlglyy.com\ntkxxd.net\ntkxyy.com\ntky001.com\ntkzqv.com\ntl-finechem.com\ntl-self.com\ntl-shida.com\ntl-tek.com\ntl-vogue.com\ntl100.com\ntl2y.com\ntl50.com\ntl88.net\ntlang.com\ntlbapm.com\ntlbsbigdata.com\ntlby120.com\ntlbyx.com\ntlcbf.com\ntlcharity.com\ntlcssk.com\ntlfw.net\ntlfzkj.com\ntlgas.com\ntlgslb.com\ntlhjjc.com\ntlhmhd.com\ntlink.io\ntlinkaccess.com\ntlinkaccess2.com\ntlinx.com\ntliveapi.com\ntliveapi2.com\ntliveapp.com\ntliveauth.com\ntliveauth2.com\ntlivecdn.com\ntlivecdnv1.com\ntlivecdnv2.com\ntlivecdnv3.com\ntlivecdnv4.com\ntlivecloud.com\ntlivecontroller.com\ntlivecontroller2.com\ntlivedal.com\ntlivedal2.com\ntlivedeliver.com\ntlivedispatch.com\ntlivedispatch2.com\ntlivedns.com\ntlivedns2.com\ntlivednsv1.com\ntlivegslb.com\ntlivehttpdns.com\ntlivehttpdns2.com\ntliveigtm.com\ntliveigtm2.com\ntliveigtm3.com\ntlivemcdn.com\ntlivemcdnsched.com\ntliveplay.com\ntliveplaydemo.com\ntliveproxy.com\ntliveproxy2.com\ntlivepush.com\ntlivepush2.com\ntlivertc.com\ntlivertc2.com\ntlivesdk.com\ntlivesdk2.com\ntlivesdkconfig.com\ntlivesdkconfig2.com\ntlivesource.com\ntlivesrc.com\ntlivesrc2.com\ntlivesrcaccess.com\ntlivesrcaccess2.com\ntlivesrcapp.com\ntlivesrcapp2.com\ntlivesrcdemo.com\ntlivesrcschedule.com\ntlivesrcschedule2.com\ntlivessl.com\ntlivessl2.com\ntlivestability.com\ntlivestability2.com\ntlivestream.com\ntlivestream2.com\ntliveupload.com\ntliveupload2.com\ntliveweb.com\ntliveweb2.com\ntlivewebrtc.com\ntlivewebrtc2.com\ntlivewebrtcpush.com\ntlivewebrtcpush2.com\ntlivewebrtcpushsch.com\ntlivewebrtcpushsch2.com\ntljas.com\ntljcw.com\ntljob8001.com\ntljwbj.com\ntljx.net\ntlkuazr.com\ntlomo.com\ntloongroup.com\ntlqwine.com\ntlrcbk.com\ntlryjg.com\ntlsj-hd.com\ntlsy.vip\ntlt5.com\ntlte.com\ntltesoft.com\ntltuan.net\ntltzg.com\ntlu5.com\ntlwanjishan.com\ntlwk.net\ntlwok.com\ntlxwjx.com\ntlxxw.com\ntly.cloud\ntlyz.net\ntlzey.com\ntlzhjt.com\ntlzyxy.com\ntm-auto.com\ntm0755.com\ntm1949.com\ntm51.com\ntm5ad.com\ntmaill.com\ntmall\ntmall.com\ntmall.hk\ntmall.ru\ntmallalicdn.com\ntmallgenie.com\ntmallgenieapi.com\ntmallplay.net\ntmallvvv.com\ntmallyc.com\ntmaotech.com\ntmbbs.com\ntmc-youqun.com\ntmcdn.net\ntmctool.com\ntmecd.com\ntmeiju.com\ntmetb.net\ntmfcloud.com\ntmgdb.com\ntmhong.com\ntmhtour.com\ntmhttc.com\ntmianyang.com\ntmigrate.com\ntmirob.com\ntmisp.com\ntmjbee.com\ntmjd123.com\ntmjiasuqi.com\ntmjj.com\ntmjob88.com\ntmkoo.com\ntmmini.com\ntmoxrobot.com\ntmqd.me\ntmqmqj.com\ntmrcw.com\ntmrenergy.com\ntms-in.org\ntms56.com\ntms8.com\ntmscnz.com\ntmsemi.com\ntmsf.com\ntmshare123.com\ntmsmh.com\ntmsmq.com\ntmsx.net\ntmtforum.com\ntmtmw.com\ntmtpost.com\ntmtpost.net\ntmtsmartlife.com\ntmtsmartrun.com\ntmtsp.com\ntmuaih.com\ntmusoft.com\ntmuyun.com\ntmwcn.com\ntmwxxcx.com\ntmwzs.com\ntmxmall.com\ntmxxw.com\ntmxz.me\ntn2000.com\ntnarzc.com\ntnas.link\ntnas.online\ntnblog.net\ntnblt.com\ntnbz.com\ntnccdn.com\ntndsjka.com\ntnebula.net\ntnedu.com\ntnettms.com\ntngcjx.com\ntngdigital.com.my\ntnodenow.com\ntnong.com\ntnsou.com\ntnyoo.com\ntnzuwu.com\nto-future.net\nto2025.com\nto4f.com\nto8to.com\nto999.com\ntoast.pub\ntoaw.net\ntobaccochina.com\ntobaccosz.com\ntobebetterjavaer.com\ntoberp.com\ntobetopone.com\ntobnews.com\ntobo1688.com\ntobosu.com\ntobsnssdk.com\ntochgo.com\ntochinajob.com\ntocomtech.com\ntocosc.com\ntocreating.com\ntoday36524.com\ntoday99.com\ntodaycache.net\ntodaydunhuang.com\ntodayguizhou.com\ntodaygx.com\ntodayidc.com\ntodayintnet.com\ntodayios.com\ntodayisp.net\ntodaymedtech.com\ntodaynic.com\ntodaypublish.com\ntodayyj.com\ntodesk.com\ntodgo.com\ntodoen.com\ntodokeji.com\ntodokit.xyz\ntodolist.chat\ntodolist.email\ntodolist.pub\ntodonow.com\ntodoyi.com\ntodreamer.com\ntoec-gdgs.com\ntoec-iot.com\ntoec.com\ntoecsec.com\ntofeat.com\ntofengmi.com\ntofflon.com\ntofine.com\ntogoalad.com\ntogocareer.com\ntogogo.net\ntogoo.com\ntohfox.com\ntohosting.com\ntohosting.net\ntohours.com\ntoidea.com\ntoiue.com\ntokcoder.com\ntokeiaat.com\ntokeimall080.com\ntokeisuisukopi.com\ntoken-ad.com\ntoken-sensor.com\ntokenglish.com\ntokensky.net\ntokimekiclub.org\ntol24.com\ntollpaymentbv.vip\ntom.cat\ntom.com\ntom163.net\ntom61.com\ntomatogames.com\ntomatolei.com\ntomatooflove.com\ntomax.xyz\ntomdiy.com\ntomley.com\ntommsoft.com\ntomonline-inc.com\ntompda.com\ntomson-group.com\ntomson-riviera.com\ntomwx.net\ntonbao.com\ntone-sun.com\ntonebj.com\ntonechemical.com\ntonehk.com\ntonewinner.com\ntong-pao.com\ntong-run.com\ntongaokeji.com\ntongbanjie.com\ntongbaoyun.com\ntongbb.net\ntongbu.com\ntongbupan.com\ntongbusj.com\ntongceyiliao.com\ntongchaba.com\ntongcheng.cc\ntongchengbx.com\ntongchengchaku.com\ntongchengir.com\ntongchengqun.vip\ntongchengxuanshang.com\ntongchouba.com\ntongda2000.com\ntongdanet.com\ntongdaohui.com\ntongdaonews.com\ntongdaotv.com\ntongdayun.com\ntongdelove.com\ntongdinggroup.com\ntongdun.net\ntongdy.com\ntongfangpc.com\ntongfei.tech\ntongfengkh.com\ntongfu.net\ntongfudun.com\ntongfugroup.com\ntonggao.info\ntongguanbao.net\ntonghanguav.com\ntonghuan.com\ntonghuiqiye.com\ntongji.com\ntongjia.com\ntongjiai.com\ntongjijs.com\ntongjiniao.com\ntongjipf.com\ntongkask.com\ntongleer.com\ntonglei.com\ntonglian.com\ntongliangrc.com\ntongliaowang.com\ntonglichang.com\ntonglingwulian.com\ntonglize.com\ntongmengge.com\ntongmengguo.com\ntongniguoji.com\ntongoiltools.com\ntongpiao.com\ntongquee.com\ntongrenchina.org\ntongrentang.com\ntongrentangjb.com\ntongrentangkj.com\ntongrenyouxi.online\ntongsha.com\ntongshanbank.com\ntongshiling.net\ntongshuai.com\ntongshun6.com\ntongsuo.net\ntongtaiamc.com\ntongtech.com\ntongtex-fashion.com\ntongtianta.site\ntongtongtong.com\ntongtongyilian.com\ntongtool.com\ntongtut.com\ntongwang.net\ntongwei.com\ntongwo.net\ntongxi.net\ntongxiang.net\ntongxianghuicn.com\ntongxiangshun.com\ntongxiclub.com\ntongxiehui.net\ntongxigroup.com\ntongxin.com\ntongxin.org\ntongxingbao123.com\ntongxinghui.com\ntongxinky.com\ntongxinmao.com\ntongxiong.com\ntongxue.com\ntongxue365.com\ntongxue8.com\ntongxuepie.com\ntongyangship.com\ntongyaoplay.com\ntongyavisa.com\ntongye.biz\ntongye56.com\ntongyehuanbao.com\ntongyi.com\ntongyicm.com\ntongyidrying.com\ntongyiplastic.com\ntongyist.com\ntongyonggroup.com\ntongyongpe.net\ntongyongts.com\ntongyongzs.com\ntongyoujiancai.com\ntongyu369.com\ntongyuan.cc\ntongyuangas.com\ntongyuanos.com\ntongyue.com\ntongyuheavy.com\ntongzecn.com\ntongzhuo100.com\ntongzhuodn.com\ntongzicha.com\ntongzsf.com\ntonhwa.com\ntoniandguychina.com\ntonitech.com\ntonki-tpms.com\ntonksz.com\ntonlyele.com\ntonnn.com\ntonnp.com\ntonsontec.com\ntontian.com\ntontime.com\ntontsen.com\ntony-bro.com\ntonycrane.cc\ntonysfarm.com\ntonze.com\ntoobiao.com\ntoocf.com\ntoocle.com\ntoodaylab.com\ntoodudu.com\ntool.la\ntool.lu\ntool56.com\ntool77.com\ntooleemesse.com\ntoolgg.com\ntoolkk.com\ntoolmall.com\ntoolmao.com\ntoolnb.com\ntoolonline.net\ntools.team\ntoolscat.com\ntoolsjy.com\ntooltt.com\ntoolwa.com\ntooming.com\ntoomoss.com\ntoonechem.com\ntooopen.com\ntooseo.com\ntootour.com\ntoouoo.com\ntop-cnc.com\ntop-dianjingfeng.com\ntop-elan.com\ntop-shanghai.com\ntop-trust.com\ntop100school.com\ntop100summit.com\ntop147.com\ntop168.com\ntop1game.com\ntop263.net\ntop2fun.com\ntop3456.com\ntop4xlc.com\ntop6000.com\ntopbester.com\ntopbiol.com\ntopbiz360.com\ntopbook.cc\ntopbridge.asia\ntopcanchina.com\ntopcdb.com\ntopcentenviro.com\ntopcheer.com\ntopchitu.com\ntopcj.com\ntopcomm.co\ntopcpu.net\ntopcrab.com\ntopcsic.com\ntopcto50.com\ntopdodo.com\ntopdoge123-a.com\ntope365.com\ntopeastic.com\ntopeditsci.com\ntopeet.com\ntopeetboard.com\ntopexhib.net\ntopfisc.com\ntopflames.com\ntopfo.com\ntopfreeweb.net\ntopgoer.com\ntopgprs.com\ntopgslb.com\ntopgus.com\ntophant.com\ntophold.com\ntophr.net\ntophub.app\ntophub.fun\ntopideal.com\ntopit.pro\ntopit5.com\ntopjoy.com\ntopjoycloud.com\ntopkhealth.com\ntopku.com\ntoplanit.com\ntoplee.com\ntoplevel.ink\ntoploong.com\ntopmba.mobi\ntopmediai.com\ntopnic.net\ntopnokycusdtcasino.com\ntopomel.com\ntoppdu.com\ntopperuse.com\ntopping.pro\ntoppingaudio.com\ntoppkg.com\ntoppollen.com\ntoppps.com\ntoppridehk.com\ntopproio.com\ntopqh.net\ntoprand.com\ntoprender.com\ntoprocn.com\ntopsage.com\ntopsayauto.com\ntopscan.com\ntopsedu.com\ntopsem.com\ntopsim.cc\ntopsmartinfo.com\ntopsmt.com\ntopsresearch.com\ntopsrx.com\ntopstar.art\ntopstarltd.com\ntopsunholdings.com\ntopsunleisure.com\ntopsunpower.cc\ntoptastewin.com\ntopthink.com\ntopthink.net\ntoptiao.com\ntoptopn.com\ntoptopone.com\ntoptubeco.com\ntopuc.com\ntopunix.com\ntopv1.com\ntopwalk.com\ntopway.org\ntopwaysoft.com\ntopwidgets.com\ntopwinchance.com\ntopwinfo.com\ntopxgun.com\ntopxiu.com\ntopxlc.com\ntopxlc6.com\ntopys.com\ntopyun.tv\ntopyun.vip\ntopzj.com\ntorch.plus\ntorcstark.com\ntoromotor.com\ntorovo.com\ntorphan.com\ntorrealcielo.com\ntoscdn.com\ntoshiba-gtbs.com\ntoshiba-semicon-storage.com\ntoshiba-thpc.com\ntoshiba-tnis.com\ntoshow.com\ntosohbioscience.net\ntosonet.com\ntosound.com\ntospur.com\ntosstar5117.com\ntosuai.com\ntosunk.com\ntotainfo.com\ntotalacg.com\ntotenchina.com\ntotiot.com\ntotochina.com\ntotodi.com\ntotope.com\ntotoro.pub\ntototang.com\ntotren.com\ntotwoo.com\ntotwoseal.com\ntou-tiao.com\ntoubang.tv\ntoucdn.com\ntouch-ck.com\ntouch-massageandholistictherapies.com\ntouch-moblie.com\ntouch4.me\ntouchat.online\ntouchealth.com\ntouchelf.com\ntouchev.com\ntouchjoin.com\ntouchjoint.com\ntouchmark.art\ntouchngo.com.my\ntouchsh.com\ntouchsprite.com\ntouchsprite.net\ntouchstudio.net\ntouchxd.com\ntouclick.com\ntouduyu.com\ntoufu321.com\ntougongjiao.com\ntougub.com\ntouhou.casa\ntouhou.cd\ntouhou.market\ntouhoudog.net\ntoujidao.com\ntouker.com\ntoumiao.com\ntoupb.com\ntouqikan.com\ntour110.com\ntourboxtech.com\ntourenwang.com\ntourgansu.com\ntourhr.com\ntourjob.net\ntourongjia.com\ntourongzi.org\ntoursbms.com\ntourscool.com\ntourunion.com\ntourye.com\ntourzhenjiang.com\ntourzj.com\ntoushibao.com\ntoushivip.com\ntoutiao.com\ntoutiao.org\ntoutiao11.com\ntoutiao12.com\ntoutiao13.com\ntoutiao14.com\ntoutiao15.com\ntoutiaoapi.com\ntoutiaoapp.com\ntoutiaobashi.com\ntoutiaobus.com\ntoutiaocdn.com\ntoutiaocdn.net\ntoutiaocloud.com\ntoutiaocloud.net\ntoutiaogood.com\ntoutiaohao.com\ntoutiaohao.net\ntoutiaoimg.com\ntoutiaoimg.net\ntoutiaojingyan.com\ntoutiaojisu.com\ntoutiaolite.com\ntoutiaolite1.com\ntoutiaolite2.com\ntoutiaoliving.com\ntoutiaonanren.com\ntoutiaopage.com\ntoutiaopan.com\ntoutiaopanapi.com\ntoutiaopic.com\ntoutiaoribao.net\ntoutiaostatic.com\ntoutiaovod.com\ntoutiaowap.com\ntoutiaowap.net\ntoutiaoyule.com\ntoutiaozb.com\ntoutoufc.com\ntoutoupiao.com\ntouwenzi.com\ntouwho.com\ntouxiang8.com\ntouxiang88.com\ntouxiangkong.com\ntouying.com\ntouzhijia.com\ntouzi.com\ntouzid.com\ntouzikuaibao.com\ntouzime.com\ntouzime.net\ntouzitiandi.com\ntouzizn.com\ntowavephone.com\ntowelltech.com\ntower.im\ntower0788.com\ntowinor.com\ntowmy.com\ntowngasenergy.com\ntowngasvcc.com\ntownsky.com\ntownsungroup.com\ntowntour.net\ntowords.com\ntowry.me\ntoxingwang.com\ntoybaba.com\ntoycloud.com\ntoyean.com\ntoyota-nanning.com\ntoyoures.com\ntoyoutesting.com\ntoysir.com\ntoysol.com\ntp-data.com\ntp-hivi.com\ntp82.com\ntpadx.com\ntpbook.com\ntpccoo.com\ntpdmp.com\ntpdz.net\ntpe-tencentclb.cloud\ntpe-tencentclb.com\ntpe-tencentclb.net\ntpe-tencentclb.work\ntpfangchan.com\ntphdled.com\ntpimg.xyz\ntpjhr.com\ntpjwww.com\ntpkey.com\ntplcd100.com\ntplife.com\ntplogincn.com\ntpooo.com\ntpoxiaozhan.com\ntpqxb.com\ntprtc.com\ntps138.info\ntpsbp.com\ntpsea.com\ntpsge.com\ntpshleasing.com\ntpsns.com\ntpstatic.net\ntpsxs.com\ntpszw.com\ntpturang.com\ntpuda.com\ntpumlir.org\ntpy100.com\ntpy119.com\ntpyboard.com\ntpykyy.com\ntpyzq.com\ntpzlj.com\ntqads.com\ntqapp.com\ntqapp.net\ntqcj.com\ntqcp.net\ntqcpc.com\ntqcrane.com\ntqcto.com\ntqdianbiao.com\ntqedu.net\ntqgxb.com\ntqhj88.com\ntqiantu.com\ntqip.com\ntqkgjt.com\ntql.ink\ntqle.com\ntqmall.com\ntqmba.com\ntqmdp.net\ntqmy168.com\ntqpac.com\ntqqa.com\ntqqyun.com\ntqrobodrive.com\ntqschool.net\ntqshfw.com\ntqshfw.net\ntquic.net\ntquyi.com\ntqw5.com\ntqwqq.com\ntqybw.net\ntr-test-ali.net\ntr-test.net\ntr-testboe.net\ntr89.com\ntrace4me.com\ntracefact.net\ntracegd.com\ntraceint.com\ntracestour.com\ntracevision.tv\ntracker.ink\ntrackingio.com\ntrackingmore.com\ntracup.com\ntracyclass.com\ntradaquan.com\ntradeblazer.net\ntradeleo.com\ntrademanager.com\ntrademessenger.com\ntradeplus.cc\ntradesns.com\ntradesou.com\ntradevv.com\ntradew.com\ntradingcomps.com\ntradinghero.com\ntradow.com\ntradplus.com\ntradplusad.com\ntrae.guru\ntrafstore.com\ntraineexp.com\ntrainingipv6.com\ntrainnets.com\ntrainsimchina.com\ntrait-wholesale.com\ntraktalent.com\ntranbbs.com\ntraneasygo.cc\ntranlion.com\ntranplanet.com\ntrans-china.com\ntrans4e.com\ntranscendchina.com\ntranscenta.com\ntransduck.com\ntranser-cn.com\ntransfarchem.com\ntransfarzl.com\ntransformer-cn.com\ntransformers.run\ntransfriend.com\ntransfu.com\ntransfun.net\ntranslatego.net\ntranslatellm.asia\ntranslationchina.com\ntransmission-china.org\ntransmonkey.com\ntransmonkey.net\ntransn.com\ntransnanning.com\ntransparcel.com\ntransportjp.com\ntransrush.com\ntranssion-os.com\ntranssscoco.com\ntransthera.com\ntranswarp.io\ntranswiki.org\ntranwit.com\ntratamientoalcohol.com\ntratao.com\ntravel-x.cc\ntravel6.co.uk\ntravelgo.com\ntraveling-exhibitions.com\ntravellaureate.com\ntravellingwithhotel.com\ntravellinkdaily.com\ntravelsky.com\ntravelsky.net\ntravelwuhan.com\ntravelyee.com\ntrawind.com\ntreatgut.com\ntreazr.store\ntreehousesub.com\ntreesir.pub\ntreetwins.com\ntreeyee.com\ntrekin.space\ntrend6.com\ntrendiano.com\ntrendimedia.com\ntrendingstar.tech\ntrendsbulletin.com\ntrendsmag.com\ntrendsmen.com\ntrendtokyo.com\ntrendy-global.com\ntrenrde.com\ntressgroup.com\ntretars.com\ntrevias.store\ntrewbnhj.vip\ntrexiu.com\ntrfgvb.com\ntrfkyy.com\ntrftpe.com\ntrgauto.cfd\ntrgis.com\ntrhealth.net\ntrhj.net\ntrhly.com\ntrhos.com\ntrhui.com\ntrhxt.com\ntriggerdelivery.com\ntrinasolar.com\ntrinitigame.com\ntrinova-tech.com\ntrioisobardev.com\ntriolion.com\ntriopen.com\ntriowin.com\ntrip169.com\ntrip8080.com\ntripbaba.com\ntripbe.com\ntriphr.com\ntripleuuu.com\ntriplexservice.com\ntripnearby.com\ntripodeck.com\ntripolers.com\ntripsanxia.net\ntriptt.com\ntripurx.com\ntripvivid.com\ntripwirechina.com\ntriring.com\ntrisfal.com\ntristarinc.com\ntriton-games.com\ntritoninfo.net\ntrizenai.com\ntrizinfo.tech\ntrizlaser.com\ntrizmed.com\ntrjcn.com\ntrjcn.net\ntrjddq.com\ntrkj.com\ntrkjbj.com\ntrl.center\ntrleader.com\ntrli.club\ntrmedical.net\ntrnjm.com\ntrnox.com\ntroika-design.com\ntroila.com\ntrojantesting.com\ntronixin.com\ntronlife.com\ntronlong.com\ntronly.com\ntronsmart.com\ntropcdn.com\ntroubles.work\ntroxchina.com\ntrpc.center\ntrpc.group\ntrpc.tech\ntrpcdn.net\ntrqjrp.xyz\ntrs-logistics.com\ntrsjgdj.com\ntrsoft.vip\ntrsoft.xin\ntrsol.com\ntrswtz.com\ntrt.hk\ntrtb.net\ntrtc.io\ntrtccloud.com\ntrtccloud.net\ntrtcrecover.com\ntrthealth.com\ntrtpazyz.com\ntrucker365.com\ntrucklc.com\ntrueart.com\ntruebuty.com\ntruechine.com\ntruedian.com\ntruedream.ltd\ntrueeyu.com\ntrueful.com\ntruekex.com\ntrueland.net\ntrueme.net\ntruerun.com\ntruesing.com\ntruestudio.tech\ntrufun.net\ntruimo.com\ntrumpeter-china.com\ntrumsense.com\ntrunktech.com\ntrusfort.com\ntrusit.net\ntrusple.com\ntrust-mro.com\ntrust-one.com\ntrust400.com\ntrusta-lawyer.com\ntrustasia.com\ntrustcn.com\ntrustdecision.com\ntrustedsign.com\ntrustexporter.com\ntrustie.net\ntrustkernel.com\ntrustlife.com\ntrustmo.com\ntrustmover.com\ntrustmta.com\ntrustutn.org\ntrustwe.com\ntrutes.com\ntruthsinfo.com\ntruzem.com\ntrvok.com\ntrwl.net\ntryfun.com\ntryine.com\ntryineapp.com\ntrykan.com\ntrylmr.com\ntrymoka.com\ntryudesk.com\ntryurbest.com\ntryxue.com\ntryz.net\ntrzhineng.com\nts-bus.com\nts-cooling.com\nts-jiabo.com\nts-juheng.com\nts-marathon.com\nts-precision.com\nts-watch.com\nts.cc\nts0775.com\nts100.com\nts166.net\nts16949px.com\nts16949rz.org\nts3.hk\nts3.ink\nts3.vip\nts56xh.com\ntsa-lp.com\ntsa-page.com\ntsa-page0.com\ntsa-page1.com\ntsa-page2.com\ntsa-page3.com\ntsa-page4.com\ntsa-page5.com\ntsa-page6.com\ntsbjschool.com\ntsbtv.tv\ntschina.com\ntscichina.com\ntscorona.com\ntsdaodao.com\ntsdjg.com\ntsdxb.com\ntsecdapi.com\ntsefang.com\ntsepcn.com\ntses.net\ntsflc.com\ntsfqw.com\ntsg-online.net\ntsggx.com\ntsgks.com\ntsgyun.com\ntshaisen.com\ntshe.com\ntshe.me\ntsheducation.net\ntshell.online\ntshengqi888.com\ntshmkj.com\ntshock.cc\ntshtech.com\ntsichuan.com\ntsinergy.com\ntsing-jn.com\ntsingaero.com\ntsinghua-getinfo.com\ntsinghua-sz.org\ntsinghua-vc.com\ntsinghua-wx.org\ntsinghuaic.com\ntsinghuajournals.com\ntsinghuan.com\ntsinghuawoman.com\ntsinghuawuxigz.net\ntsinghydrogen.com\ntsingj.com\ntsingmicro.com\ntsingming.com\ntsingoofoods.com\ntsingpost.com\ntsingshang.com\ntsingtek.com\ntsingtoo.com\ntsingtuo.com\ntsingyangroup.com\ntsingyanresearch.com\ntsj-js.com\ntsj-tsy.com\ntsjtsy.com\ntsk-fixture.com\ntskscn.com\ntslib.net\ntsljzs.com\ntslongtai.com\ntslsmart.com\ntslt.tech\ntsluping.com\ntsm-license-test.com\ntsm-license.com\ntsm-yuntrust.com\ntsm52dc.com\ntsmtkj.com\ntsn-tencentclb.cloud\ntsn-tencentclb.com\ntsn-tencentclb.net\ntsn-tencentclb.work\ntsorder.com\ntsp189.com\ntsparkling.com\ntspsy.com\ntspweb.com\ntsqw.com\ntsrcw.com\ntsrenli.com\ntsrnjs.com\ntsrqjt.com\ntsrqjtfc.com\ntsruifeng.com\ntssns.net\ntsstorry.com\ntssyedu.com\ntssyjt.com\ntstvxmt.com\ntsubakichina.com\ntsukistar.fun\ntsunbull.com\ntswjs.net\ntswjs.org\ntswljt.com\ntswnanning.com\ntswuby.com\ntsxcfw.com\ntsxcx.xyz\ntsxjt.com\ntsxtgj.com\ntsxw66.com\ntsycdn.com\ntsyexmail.com\ntsykf.com\ntsyvps.com\ntsyzm.com\ntszh.net\ntszhjk.com\ntszlsgs.com\ntszxhosp.com\ntszyzx.com\ntt-app.com\ntt-bike.com\ntt-ly.com\ntt286.com\ntt65org.com\ntt787.com\ntt818k.com\ntt919.com\ntt96596.com\nttaidu.com\nttalkai.com\nttbba.com\nttbbss.com\nttbyte.com\nttbyte.net\nttcad.com\nttcl.cc\nttdailynews.com\nttdnsa.com\nttdown.com\nttdsw.com\nttechhk.com\nttfly.com\nttfuav.com\nttg8.com\nttgan.com\nttge.ru\nttggxx.com\nttgjx.com\nttgood.com\nttgslb.com\nttgtm.com\nttgwm.com\nttgxlx.com\ntthaoduo.com\ntthigo.com\ntthunder.com\nttic.cc\nttigame.com\nttime.com\nttionya.com\nttj5.com\nttjianbao.com\nttjisu.com\nttkdex.com\nttkefu.com\nttkuan.com\nttlock.com\nttmark.com\nttmass.com\nttmd5.com\nttmm.vip\nttmn.com\nttmnq.com\nttmv.com\nttn8.com\nttnea.com\nttnongli.com\nttnqh.com\nttongda.com\nttpaicdn.com\nttpaihang.com\nttpaper.com\nttpet.com\nttpharm.com\nttplayer.co\nttplayer.com\nttpod.com\nttpp.com\nttppoo.com\nttpx.net\nttq.com\nttq.so\nttqiancheng.com\nttriqi.com\ntts8.com\nttshengbei.com\nttship.com\nttshuba.cc\nttshuba.net\nttsim.com\nttsim.net\nttsmk.com\nttstream.com\nttsz8.com\ntttang.com\ntttarot.com\ntttcykt.com\ntttelephone.com\nttthing.com\ntttiti.com\ntttkkt.com\nttttt22222.com\ntttuangou.net\ntttxf.com\ntttz.com\nttunion.com\nttwanjia.com\nttwebview.com\nttwifi.net\nttwqw.com\nttwx.com\nttwxh.com\nttxn.com\nttxs123.net\nttxs7.com\nttxsapp.com\nttxsonline.com\nttxuanpai.com\nttxx8888.com\nttyec.com\nttyfp.com\nttyfund.com\nttyinfo.com\nttyingqiu.com\nttyjf.com\nttymq.com\nttyongche.com\nttyqm.com\nttysq.com\nttyuyin.com\nttyy800.vip\nttyyuuoo.com\nttz.com\nttzcw.com\nttzubao.com\nttzw365.com\nttzyw.com\ntu54o7863tbf6.com\ntu8.cc\ntu93.biz\ntu960.com\ntuan800.com\ntuan800.net\ntuanai.com\ntuanbohui.com\ntuanche.com\ntuancu.com\ntuandai.com\ntuanduishuo.com\ntuang.club\ntuangai.com\ntuangouba.com\ntuanidc.net\ntuanimg.com\ntuanitgx.com\ntuanjiebao.com\ntuanjuwang.com\ntuanlin.net\ntuanmeme.com\ntuanok.com\ntuanpibao.com\ntuanping.com\ntuanshan.com\ntuantuangame.com\ntuantuanshou.com\ntuanxue360.com\ntuanxue360.net\ntuanyougou.com\ntuanyuan520.com\ntuanyx.com\ntuanziai.com\ntubachina.com\ntubanginfo.com\ntubangzhu.com\ntubaobao.com\ntubaobaoqm.com\ntubaoveneer.com\ntubaoyz.com\ntubatu.com\ntube-cat.com\ntubebbs.com\ntubiaoxiu.com\ntubie.art\ntuboshu.com\ntuboshuxinxi.xyz\ntuboxu.com\ntubutu.com\ntuchong.com\ntuchong.net\ntuchuangs.com\ntuchuiwang.com\ntuchuiwang.net\ntucoo.com\ntudai.cc\ntudai.com\ntudan.cc\ntudan.vip\ntudou.com\ntudoupe.com\ntudouseo.com\ntudouui.com\ntudouxy01.com\ntudouyx.com\ntudu.com\ntudu.im\ntuer.me\ntuer123.com\ntuf3a353.com\ntuganjue.com\ntugemedical.com\ntugoo.net\ntugou.com\ntugoucx.com\ntuguaishou.com\ntuguan.net\ntuguiyao-gd.com\ntuhaiba.com\ntuhaogroup.com\ntuhaokuai.com\ntuhu.com\ntuhu.org\ntuhu.work\ntui18.com\ntui33.com\ntuiaaaa.com\ntuiaaae.com\ntuiaaaf.com\ntuiaaag.com\ntuiabq.com\ntuiapple.com\ntuibear.com\ntuiberry.com\ntuiclick.com\ntuicool.com\ntuicross.com\ntuidaniu.com\ntuidc.com\ntuideli.com\ntuidragon.com\ntuifeiapi.com\ntuifish.com\ntuiguang91.com\ntuiguangdns.com\ntuiguangjia.com\ntuijiantong.com\ntuijianxin.com\ntuijie.cc\ntuikemima.com\ntuikemima.net\ntuikemohe.com\ntuili.com\ntuilidashi.xin\ntuilie.com\ntuilisr.com\ntuiliu.net\ntuilixy.net\ntuimob.com\ntuimotuimo.com\ntuimy.com\ntuinei.com\ntuipeanut.com\ntuipear.com\ntuipinpai.com\ntuiplay.com\ntuirice.com\ntuishao.net\ntuishark.com\ntuishubang.com\ntuishuge.com\ntuishujun.com\ntuisnake.com\ntuistone.com\ntuitiger.com\ntuitui.info\ntuitui99.com\ntuituifang.com\ntuituitang.com\ntuiwen.net\ntuixiu.com\ntuiyi.cc\ntuizx.com\ntujia.com\ntujiacdn.com\ntujian.com\ntujiandan.com\ntujidu.com\ntujixiazai.com\ntuke88.com\ntukedu.com\ntukkk.com\ntuku.com\ntukujia.com\ntukuppt.com\ntulading.com\ntuleminsu.com\ntuling123.com\ntulingdns.com\ntulipsport.com\ntuliu.com\ntulsj.com\ntumajewelry.com\ntumanyi.com\ntumchina.com\ntumengtech.com\ntumicomm.com\ntumormed.com\ntumukaoyan.com\ntumukeji.com\ntumwf.com\ntumyu.com\ntuna.wiki\ntunanhuashi.com\ntungee.com\ntungkong.com\ntungraymhe.com\ntungs.store\ntungshungroup.com\ntungsten-alloy.com\ntungsten-bar.com\ntungsten-copper.com\ntungsten-jewellery.com\ntungsten-powder.com\ntungwah.com\ntunhe.com\ntunhent.com\ntunionfans.com\ntuniu.cc\ntuniu.com\ntuniu.net\ntuniu.org\ntuniucdn.com\ntuniuglobal.com\ntuniuins.com\ntuniuops.net\ntunynet.com\ntuo-pan.com\ntuoaa.com\ntuobeng.net\ntuocad.com\ntuodan.tech\ntuodaneee.com\ntuodangclub.com\ntuodanlab.com\ntuodanyy.com\ntuohuangzu.com\ntuojiebiotech.com\ntuojunedu.com\ntuolajieightscore.com\ntuoluozhuan.net\ntuoniaox.com\ntuopaishedecta.com\ntuopan808.com\ntuopu.com\ntuoren.com\ntuotoo.com\ntuotuozu.com\ntuoweisi.com\ntuoyuan619.com\ntuoyuantec.com\ntuozhe8.com\ntuozheng168.com\ntuozhilight.com\ntupian1.com\ntupian114.com\ntupian1234.com\ntupian365.com\ntupiancunchu.com\ntupiankucdn.com\ntupianseo.com\ntupianyun.com\ntupianzj.com\ntupu360.com\ntuputech.com\ntupuw.com\ntuqiangcn.com\ntuqou.com\ntuquu.com\nturangyq.com\nturboes.com\nturbomail.org\nturingapi.com\nturingbook.com\nturingdi.com\nturingfraud.net\nturinggear.com\nturingtopia.com\nturnitin.org.in\nturnitinuk.net\nturs-ptt.icu\nturtle-sir.com\nturui-robots.com\nturuio.com\ntus-health.com\ntusapi.com\ntusay.net\ntuscbec.com\ntuscdn.com\ntusdesign.com\ntusdk.com\ntusenergy.com\ntushare.org\ntushare.pro\ntushencn.com\ntushifu.com\ntusholdings.com\ntushu007.com\ntushumi.cc\ntushumi.com\ntushuokeji.net\ntusij.com\ntusiot.com\ntusmedicine.com\ntusooo.com\ntuspark.com\ntuspass.com\ntuspass.net\ntusstar.com\ntustt.com\ntusu.cc\ntusuguanjiage.com\ntusujiu.com\ntutdown.com\ntutechanhb.com\ntutengcloud.com\ntutengdai.com\ntutuapp.com\ntutucloud.com\ntutudati.com\ntutuge.me\ntutuguai.com\ntutuim.com\ntutupan.com\ntuvrblog.com\ntuwan.com\ntuwandata.com\ntuwangwang.com\ntuwanjun.com\ntuwazhundian.com\ntuweng.com\ntuwenzhibo.com\ntuxi.com\ntuxiangyan.com\ntuxiaobei.com\ntuxing.art\ntuxing2010.com\ntuxingren.com\ntuxiu.com\ntuxun.fun\ntuya.com\ntuyacn.com\ntuyansuo.com\ntuyaya.com\ntuye.com\ntuyiqi.com\ntuyitu.com\ntuyiyi.com\ntuyoo.com\ntuyou.me\ntuyougame.com\ntuyoujp.com\ntuyoumi.com\ntuyouvpn.com\ntuyouxinxi.net\ntuzhan.com\ntuzhan.net\ntuzhanai.com\ntuzhanh5.com\ntuzhaozhao.com\ntuzhijie.com\ntuzhizhijia.com\ntuzhongit.com\ntuzi123.com\ntuzi8.com\ntuziip.com\ntv-live-cctv.com\ntv-live-tvsou.com\ntv002.com\ntv121.com\ntv189.com\ntv2-zuqiu.com\ntv20806.com\ntv373.com\ntvandnet.com\ntvants.com\ntvapk.com\ntvapk.net\ntvbbj.com\ntvblack.com\ntvcbj.com\ntvcbook.com\ntvccc.org\ntventry.com\ntvfanqie.com\ntvfuwu.com\ntvguo.tv\ntvhf.com\ntvhuan.com\ntvjianshen.com\ntvkuai.com\ntvmao.com\ntvmcloud.com\ntvmining.com\ntvoao.com\ntvodapi.com\ntvodapibk.com\ntvos.com\ntvt.im\ntvt85.com\ntvuctgze.com\ntvxio.com\ntvzhe.com\ntvzn.com\ntw-joly.com\ntw-yun.com\ntw2sm.com\ntwanxi.com\ntwatchesmall.com\ntwbuild.org\ntwcczhu.com\ntwcoal.com\ntwd2.me\ntwd2.net\ntwdxdl.com\ntweakcube.com\ntwh5.com\ntwheixiong.com\ntwinkledeals.com\ntwinkstar.com\ntwinsel.com\ntwinsenliang.net\ntwistysocks.com\ntwk.cc\ntwoarmy.com\ntwoear.com\ntwowinit.com\ntwplink.xyz\ntws.com\ntwsapp.com\ntwscholar.com\ntwsns.com\ntwsz-cq.com\ntwszs.com\ntwtes18.com\ntwtime.vip\ntwtstudio.com\ntwty.vip\ntwwtn.com\ntwwtn.net\ntwyuxin.com\ntwyxi.com\ntwzgn.com\ntwzilla.com\ntwzmd.com\ntwzui6.com\ntx-exhibition.com\ntx-livetools.com\ntx-trans.com\ntx009.com\ntx1588.com\ntx163.com\ntx321.com\ntx365.com\ntx5d.com\ntx8j.com\ntxbanche.com\ntxbapp.com\ntxbimg.com\ntxbond.com\ntxbyod.com\ntxcap.com\ntxcdns.com\ntxcdns.net\ntxcfgl.com\ntxcgoo.com\ntxclivecdn.com\ntxcloudlive.com\ntxcm365.com\ntxcm365.net\ntxcmapp.com\ntxcode.com\ntxcx.com\ntxcx.tech\ntxcxjd.com\ntxcxpt.com\ntxczawlfpj5.com\ntxdai.com\ntxdl1.com\ntxdl1.net\ntxdl2.com\ntxdl2.net\ntxdyt.com\ntxdzw.com\ntxelive.com\ntxelvb.com\ntxeo.net\ntxfba.com\ntxfeiyu.com\ntxffp.com\ntxfund.com\ntxga.com\ntxgirl1.com\ntxgirl2.com\ntxhsya.com\ntxhttpdns.net\ntxhy1699.com\ntxie.club\ntxitech.com\ntxjhqh.com\ntxjscl.com\ntxjsjgs888.com\ntxjy689.com\ntxlctong.com\ntxleshare.com\ntxlivecdn.com\ntxlivecdn2.com\ntxlt.com\ntxlunwenw.com\ntxlzp.com\ntxmcu.com\ntxmdb.com\ntxmkf.com\ntxon.net\ntxooo.com\ntxqcw.net\ntxqq.com\ntxqq789.com\ntxresearch.com\ntxrjy.com\ntxrpic.com\ntxrz.com\ntxrzx.com\ntxscdn.com\ntxsdk.com\ntxsec.com\ntxsf.com\ntxssw.com\ntxstatic.com\ntxt101.com\ntxt321.com\ntxt81.com\ntxtag-secure.world\ntxtagsceru.cc\ntxtagscerw.cc\ntxtbbs.com\ntxtduo.com\ntxtelsig.com\ntxtshuku.org\ntxttgj.com\ntxttool.com\ntxtxr.com\ntxtyxg.com\ntxuwft6117.vip\ntxvat.com\ntxvideo1.com\ntxvideo2.com\ntxwb.com\ntxweekly.com\ntxwestart.com\ntxwm.com\ntxwy.com\ntxwy.com.tw\ntxx66.com\ntxxy.com\ntxxzc.com\ntxy8.com\ntxyapp.com\ntxybio.com\ntxybk.com\ntxyes.com\ntxyfwq.com\ntxyscdn.com\ntxyscdn.net\ntxzb.app\ntxzing.com\ntxzqzb.com\ntxzuranji.com\nty-archdesign.com\nty-group.net\nty-im.com\nty-magnet.com\nty-tyre.com\nty-xxl.com\nty.ink\nty1970.com\nty2y.com\nty360.com\nty3w.net\nty8621.com\ntybai.com\ntyboard.net\ntyc100.com\ntyc13804.com\ntyc13810.com\ntyc13867.com\ntyccdn888.com\ntychemical.com\ntychio.net\ntycimages.com\ntyclport.com\ntycqxs.com\ntycredit.com\ntydao.com\ntydcdn.com\ntydesyxx.com\ntydevice.com\ntydgas.com\ntydns.cc\ntyduanju.com\ntyeat.com\ntyeec.net\ntyepi.com\ntyfo.com\ntygameworld.com\ntygckj.com\ntyh120.com\ntyhjrbl.com\ntyhjzx.com\ntyi365.com\ntyihome.com\ntyjd.cc\ntyjnkj.com\ntyjsq.com\ntykd.com\ntykmedicines.com\ntylls.com\ntym001.com\ntymcdn.com\ntymotor.cc\ntyn.cc\ntynlwx.com\ntynxy.com\ntyorient.com\ntyouai.com\ntypany.com\ntype.so\ntypecho.work\ntypechodev.com\ntypechx.com\ntypeeasy.net\ntyphoon.vip\ntypicalchn.com\ntypora.net\ntyprotech.com\ntyqian.com\ntyqxzx.com\ntyrantg.com\ntyrbl.com\ntyrbw.com\ntyread.com\ntysdmh.com\ntysih.com\ntysj365.com\ntyst.cc\ntyszy.com\ntytgigty.com\ntytlj.com\ntytuyoo.com\ntytzy.com\ntytzyyy.com\ntytzzy.com\ntyuanlv.com\ntyust.net\ntyuyan.com\ntyuyan.net\ntywangcai.com\ntywbw.com\ntywh.com\ntywheels.com\ntywx.com\ntywxw.la\ntyxcdn.com\ntyxcdn.net\ntyy6.com\ntyymt.com\ntyzh.com\ntyzhjx.com\ntyzhyun.com\ntyzs8.com\ntyzspy.com\ntz-dsp.com\ntz-water.com\ntz100.com\ntz118802.com\ntz121.com\ntz12306.com\ntz1288.com\ntz13897.com\ntz13898.com\ntz1980.com\ntz2100.com\ntz777666.com\ntz8733.com\ntz887.com\ntz8966.com\ntz94.com\ntzada.com\ntzbank.com\ntzbank.net\ntzbao.com\ntzcpa.com\ntzcul.com\ntzcz.com\ntzedu.org\ntzfdc.com\ntzfeilu.com\ntzfeize.xyz\ntzfile.com\ntzgamepkg.com\ntzgcjie.com\ntzggzj.com\ntzgjjt.com\ntzgsjc.com\ntzhledu.net\ntzhospital.com\ntzhwcc.com\ntzjob.com\ntzjxl.com\ntzjyjt.com\ntzjz123.com\ntzjzsw.com\ntzkameng.com\ntzkciz.com\ntzlib.net\ntzlmt.com\ntzm66.com\ntzme.net\ntzmem.com\ntzpaper.com\ntzqby.com\ntzqingzhifeng.com\ntzqytv.com\ntzrc.com\ntzres.com\ntzrl.com\ntzsfhxx.com\ntzshipping.net\ntzsnw.com\ntzsports.com\ntzsti.com\ntzsucai.com\ntzswatch.com\ntzswfz.com\ntzsz.net\ntzszyy.com\ntztledu.com\ntztrq.com\ntztusi.com\ntzujian.com\ntzvec.com\ntzvtc.com\ntzwpco.com\ntzxingtang.com\ntzxwzx.com\ntzyiyuantuan.com\ntzyongda.com\ntzyun.com\ntzyy-sh.com\ntzyyao.com\ntzyyjt.com\ntzzhkj.com\ntzzhtc.com\ntzzls.com\ntzzp.com\ntzzszb.com\ntzzx.net\nu-camera.com\nu-carloan.com\nu-cdn.net\nu-con-dom.com\nu-con-dom.net\nu-lights.com\nu-link.org\nu-mro.com\nu-om.com\nu-qun.com\nu-road.com\nu-sharing.work\nu-softtech.com\nu-speedex.com\nu-workshop.com\nu.biz\nu.sb\nu.tools\nu005.com\nu0351.com\nu0537.com\nu062.com\nu10010.com\nu10086.com\nu14.com\nu148.net\nu17.com\nu17i.com\nu17t.com\nu1d1.com\nu21a.com\nu22e.com\nu235.net\nu2j2ha.com\nu2sz.com\nu3dc.com\nu3dcn.com\nu3dol.com\nu3v3.com\nu4u5.com\nu4u5.tv\nu51.com\nu51.me\nu520.net\nu58.com\nu581.com\nu5wan.com\nu69cn.com\nu6ex.com\nu72.net\nu78785.com\nu7u9.com\nu88.com\nu8ad.com\nu8e.com\nu8see.com\nu8sy.com\nu8yx.com\nu966.com\nu9baoku.xyz\nu9h.com\nu9time.com\nu9u8.com\nu9u9.com\nu9wan.com\nuabkrsj.xyz\nuahh.site\nuancf.com\nuandi-wireless.com\nuangee.com\nuao-online.com\nuao.so\nuascent-iot.com\nuatmrrvendor.com\nuauc.net\nuavtjxh.com\nuavvv.com\nuaxk.com\nub-os.com\nubaiyi.com\nubangmang.com\nubao.com\nubc-bearing.com\nubccn.com\nubeethiesemo.com\nubeihai.com\nubesh.com\nubestkid.com\nubetween.com\nubgame.com\nubibibi.com\nubicdn.com\nubiquant.com\nubismartparcel.com\nubits.club\nubixai.com\nubixioe.com\nubja.vip\nublese.com\nubmconlinereg.com\nubmsinoexpo.com\nubnt.com\nuboat100.com\nuborn.net\nuboxol.com\nubs001.com\nubssdic.com\nubt.tripcdn.com\nubtrobot.com\nubuant.com\nubuntukylin.com\nubuuk.com\nubuylogi.com\nuc-union.com\nuc108.com\nuc123.com\nuc129.com\nuc138.com\nuc1z.com\nuc2008.com\nuc23.net\nuc56.com\nuc666.com\nucacc.com\nucai123.com\nucaiyun.com\nucancs.com\nucanrobot.com\nucantech.com\nucantech.net\nucany.net\nucarinc.com\nucassc.com\nucb6.com\nucbug.com\nuccastore.com\nuccbikes.com\nuccpd.com\nucdchina.com\nucdok.com\nucdrs.net\nucfly.com\nucgslb.com\nucgslb.info\nucgslb.net\nuchangdi.com\nuchiha.ltd\nuchis.com\nuchoice.cc\nuchuanbo.com\nucicq.com\nucigl.com\nucjoy.com\nucl0ud.com\nucloud-edm.com\nucloud365.com\nucloudadmin.com\nucloudapi.com\nucloudgda.com\nucloudnaming.com\nucloudnaming.info\nucloudnaming.net\nucloudoss.com\nuclouds3.com\nucloudstack.com\nucloudstack.net\nucloudstor.com\nucloudufile.com\nucly.net\nucmmine.com\nucnaming.com\nucnaming.info\nucnaming.net\nucnano.com\nucnest.com\nucpaas.com\nucpchina.com\nucpopo.com\nucren.com\nucsanya.com\nucss.ninja\nuctrac.com\nuctwydx.com\nucun.tech\nucuntech.com\nucuuc.com\nucw.pub\nucweb.com\nucxsw.com\nucying.com\nuczzd.com\nuczzd.net\nudache.com\nudalogistic.com\nudamall.com\nudangjia.com\nudasauto.com\nudashi.com\nudbac.com\nudcgroup.com\nudcn.com\nuddtrip.com\nudecig.com\nudelivrs.com\nudeskcs.com\nudeskglobal.com\nudfspace.com\nudiannet.com\nudid.vin\nudns.dev\nudonmai.com\nudows.com\nudragons.com\nudream.com\nudrig.com\nudsdown.xyz\nudship.com\nudsstudio.com\nudxd.com\nuebilling.com\nuebuilder.net\nuecook.com\nued1.com\nuedbet.bet\nuedbox.com\nuedna.com\nueep.com\nueeshop.com\nueg.cc\nuehchina.com\nuehtml.com\nueibo.com\nueiibi.com\nuelike.com\nuemo.net\nueno-china.com\nuenu.com\nueoqex.help\nueren.com\nuestcedu.com\nuestcliuxue.com\nuesw215.xin\nuetianshanyp.com\nueuz.com\nuewaf.com\nuez.com\nuf-crm.com\nuf-tobacco.com\nufancycase.com\nufanw.com\nufcap.com\nufcs.com\nufenqi.com\nufhost.com\nufhosted.com\nufida-lcwy.com\nufidaoa.com\nufileos.com\nufirefly.com\nufizl.com\nufkwm.com\nuflowx.com\nufo.club\nufo110.net\nufoer.com\nufojoy.com\nufolm.com\nuformwater.com\nufsoo.com\nufyct.com\nug.link\nugainian.com\nugapi.com\nugapk.com\nugbb.com\nugc-up-dom.com\nugc-up-dom.net\nugdesk.com\nugdocker.link\nugdtimg.com\nuggame.com\nuggd.com\nugirls.tv\nugmars.com\nugmjd.com\nugnas.com\nugnx.net\nugo-china.com\nugojp.com\nugong.com\nugoshop.com\nugostar.com\nugreen.cloud\nugreengroup.com\nugshare-img.com\nugslb.com\nugslb.info\nugslb.net\nugslb2.net\nugsnx.com\nugubl.net\nugurl.cc\nugxsd.com\nuhabo.com\nuhaom.com\nuhaozu.com\nuhasadmin.com\nuhcmu.com\nuhi02121uik.xyz\nuhi02130uik.xyz\nuhomecp.com\nuhomes.com\nuhomesplus.com\nuhouzz.com\nuhp.cc\nuhs68.com\nuhuibao.com\nuhuitong.com\nuhuocn.com\nuhut.com\nuhzcdn.com\nui-lab.com\nui100day.com\nui63.com\nuibep.com\nuibhealthcare.com\nuibmm.com\nuicats.com\nuicmall.com\nuicom.net\nuid75.com\nuidec.com\nuidev.tech\nuidev.xyz\nuihacker.com\nuiiiuiii.com\nuijtcareers.cfd\nuik.cc\nuil.ink\nuileader.com\nuimix.com\nuincall.com\nuincall400.com\nuinchat.com\nuincom400.com\nuino.com\nuipaas-assets.com\nuipower.com\nuiren.net\nuisdc.com\nuisee.com\nuisheji.com\nuishijie.com\nuisnetwork.com\nuisrc.com\nuiste.com\nuit-sz.com\nuitab.com\nuitool.net\nuiu.cc\nuiuihub.com\nuiwow.com\nujakn.com\nujia007.com\nujian.cc\nujianchina.net\nujiao.net\nujiaoshou.com\nujinbi.com\nujing.online\nujintan.com\nujipin.com\nujiuye.com\nujmjk.com\nujnfdfv.com\nuju365.com\nujxs.com\nuk-edu.com\nuk-st.com\nukanshu.com\nukeban.com\nukelink.com\nuker.net\nukh5.com\nukiea.com\nukin-tech.com\nukingtech.com\nuklga.work\nukluhu.com\nukongm.com\nukonline2000.com\nukoo.net\nukosgolfcart.com\nukpass.org\nukpathway.com\nukpayment.xin\nukrainevisacenter.com\nuku6.com\nukubang.com\nukui.org\nukupu.com\nukusk12.com\nukvisacenterd.com\nukworldsale.com\nulab360.com\nulamps.com\nulanzou.com\nulapia.com\nule.com\nule.hk\nuleapp.com\nulecdn.com\nuleek.net\nulgrobot.com\nuliang.vip\nuliangwang.com\nuliaobao.com\nulife.com\nulife.group\nulikecam.com\nulikecam.mobi\nulikecam.net\nulikepic.com\nulikestatic.com\nulinix.com\nulinix.tv\nulinkcollege.com\nulixirglobal.com\nulpay.com\nultracachenode.com\nultraeda.com\nultramanol.com\nultrapay.net\nultrarisc.com\nultrasonice.com\nulucu.com\nulvac-shanghai.com\nulvac-suzhou.com\num.run\numajor.net\numaman.com\numasoft.com\numate.net\numb.ink\numbpay.com\numc-ai.com\numcloud.com\numdac.com\numeijiaju.com\numeng.co\numeng.com\numeng100.com\numengcloud.com\numenglog.com\numetal.com\numetrip.com\numexair.com\numfintech.com\numgg.biz\numihome.com\numindex.com\numinsky.com\numiplus.com\numiwi.com\numiwx.com\numjicanvas.com\numl-tech.com\numlchina.com\numlife.net\numpay.com\numpxkvtt.com\nums86.com\numsamd.com\numsns.com\numtrack.com\numtrack0.com\numtrack1.com\numtrack2.com\numv0.com\numv5.com\numva-china.com\numvcard.com\numvsoft.com\nun-bug.com\nun10086.com\nun1c0de.xyz\nuna-ad.com\nuna-campaign.com\nunachina.org\nunaming.info\nunaming.net\nunbank.info\nuncbd.com\nunccr.com\nuncfa.org\nuncitys.com\nuncle-ad.com\nuncle-chen.com\nunclecheers.com\nuncleda.com\nuncledesk.com\nunclenoway.com\nunclenoway.net\nunclenowayapi.com\nuncletalk.com\nunclicks.com\nuncoverman.com\nunder-5.shop\nunderfill.cc\nuneed.com\nuneede.com\nunfish.net\nungifts.com\nuni-cent.com\nuni-forest.com\nuni-perfect.com\nuni-ubi.com\nunibeauty.net\nunibizp.com\nunicde.com\nunicloud.com\nunicloudgov.com\nunicloudsrv.com\nunicmicro.com\nunicom\nunicom-cz.com\nunicomgd.com\nunicomjnwy.com\nunicomlife.com\nunicompayment.com\nunicompayment.net\nunicompayment.org\nunicomtest.com\nunicon-hibar.com\nunietec.net\nunifl-networks.com\nuniflows.com\nunifound.net\nunifull.com\nunifuncs.com\nunifycarbon.com\nunigress.com\nuniham.net\nunihertz.com\nunilaw.net\nunilumin.com\nunimasdata.com\nunimtx.com\nuninf.com\nuninstall-tools.com\nuninto.com\nuniny.com\nunion-4.com\nunion-game.com\nunion-net.com\nunion-tio2.com\nunion-wifi.com\nunion178.com\nunion400.com\nunion555.com\nunioncom.cc\nunioncyber.net\nunionli.com\nunionpay.com\nunionpay.net\nunionpay95516.cc\nunionpayintl.com\nunionpaysecure.com\nunionsy.com\nuniontech.com\nuniostay.com\nuniow.com\nunipack-tech.com\nuniproud.com\nuniscope.com\nunisdigital.com\nunisedu.com\nunisemicon.com\nunisguard.com\nunishy.com\nunisiot.com\nunisoc.com\nunisonal.com\nunisound.com\nunispc.com\nunispim.com\nunissoft.com\nunistc.com\nunistrong.com\nunistrument.com\nuniswdc.com\nuniswl.com\nunitaxgd.com\nunited-bearing.com\nunited-imaging.com\nunited-sqwater.com\nunited-water.com\nunitedbank.ltd\nunitedds.com\nunitedmoney.com\nunitek-it.com\nunitemotor.com\nunitexlogistics.com\nuniteyun.com\nunithinker.com\nunitrans-agency.com\nunitrans-group.com\nunitree.com\nunitree.work\nunittec.com\nunitweld.com\nunitworld.net\nunitymanual.com\nunityonehold.com\nuniv-bio.com\nuniversity-hr.com\nuniview.com\nunivista-isg.com\nunivsport.com\nuniwaf.com\nunixhot.com\nunixidc.com\nunixtitan.net\nunjmz.com\nunjs.com\nunkzyy3201.vip\nunlcn.com\nunlgroup.com\nunlimax.com\nunlimithealth.com\nunlitui.com\nunmou.com\nunn114.com\nunncahs.net\nunnnnn.com\nunogenius.com\nunomedicalgroup.com\nunparts.net\nunpcn.com\nunpluggedatknight.com\nunpmcc.com\nunqu.com\nunsedu.com\nunsemi.com.tw\nunshan.com\nunspay.com\nunsuv.com\nuntbbsdwarfs.com\nunvmax.com\nunwtonews.com\nunyx.com\nunzg.com\nuoboc.com\nuochen.com\nuodoo.com\nuodzhx.com\nuoeee.com\nuoevtxmx.com\nuoften.com\nuoj.ac\nuoko.com\nuokon.com\nuomg.com\nuomo.cc\nuonglong.store\nuonline-sh.com\nuonline-sh.net\nuono4521.com\nuonone.com\nuooconline.com\nuoolu.com\nuooss.com\nuoozi.com\nuoria.com\nuos56.com\nuostools.com\nuotoo.com\nuouin.com\nuouo123.com\nuovz.com\nup-et.com\nup-pharma-gx.com\nup-pharma.com\nup135.com\nup360.com\nup368.com\nup37.com\nup4dev.com\nup62.org\nup71.com\nupai.com\nupaidui.com\nupaiyun.com\nupanboot.com\nupanok.com\nupanshadu.com\nupantool.com\nupashance.com\nupbiao.com\nupbuilder.info\nupbz.net\nupc-cn.com\nupcave.com\nupcd.org\nupcdn.net\nupchina.com\nupchinapro.com\nupchinaproduct.com\nupd.kaspersky.com\nupdate1.cyou\nupdate2.cyou\nupdate8.com\nupdeals.com\nupdf.com\nupdrv.com\nupe.net\nupecp.com\nupengyou.com\nupengyou.net\nupesn.com\nupetmart.com\nupfos.com\nuphicoo.com\nupho2015.com\nuphong.com\nupimgku.com\nupimgt.com\nupin.com\nupkao.com\nupkk.com\nupkuajing.com\nuplookedu.com\nuplooking.com\nupluck.cc\nupnono.com\nupowerchain.com\nuppershop.hk\nupppt.com\nupqzfile.com\nupqzfilebk.com\nuprimer.net\nups.ksmobile.net\nups001.com\nups88.net\nupsapp.com\nupsclan.com\nupseller.com\nupskyshanghai.com\nupst86.com\nupsunet.com\nuptom.com\nuptougu.com\nupu-opt.com\nupupbug.com\nupupoo.com\nupupview.com\nupupw.net\nupvixusa.com\nupvr.net\nupwater.net\nupwith.me\nupx8.com\nupyun.com\nupzxt.com\nupzxt.net\nuq-express.com\nuqbike.com\nuqche.com\nuqee.com\nuqeegame.com\nuqiba.com\nuqidata.com\nuqidong.com\nuqidong.net\nuqipower.com\nuqite.com\nuqitong.com\nuqseo.com\nuqualities.com\nuqude.com\nuqulive.com\nuqz.com\nurart.cc\nurbanchina.org\nurbanfind.club\nurbanmatters.com\nurbansocialwork.org\nurbetter.com\nurbetter.net\nurbtix.hk\nurcb.com\nurcove-hotels.com\nurhimalayanak.com\nuri6.com\nuril6.com\nuriminzokkiri.com\nurit.com\nuritebio.com\nuritest.com\nuriwh.com\nurl.cy\nurlos.com\nurlsecajog.com\nuroandrologyseries.com\nurocancer.org\nurology.wiki\nurongda.com\nurovo.com\nurovoworld.com\nurq7wvyumzfdi5.com\nurs-china.com\nursb.me\nurselect.com\nurtrust.com\nurumqi-air.com\nurumqimarathon.com\nurumqimtr.com\nus-ex.com\nus-qianzheng.com\nus.ci\nus0.me\nusa-gam.com\nusa-idc.com\nusaapcups.com\nusaas.net\nusaedu.net\nusaeu.com\nusagoodclothes.com\nusalink.xyz\nusao8.com\nusaphoenixnews.com\nusapschool.com\nusashopcn.com\nusayouma.com\nusbing.com\nusbserver.com\nusbzh.com\nusbzl.com\nuschinagreenfund.com\nuscnk.com\nuscntv.com\nuscoin.gold\nusdcny.net\nusdtmall.com\nuse-tencentclb.cloud\nuse-tencentclb.com\nuse-tencentclb.net\nuse-tencentclb.work\nuse-trust.com\nuseasp.net\nuseaudio.com\nusecubes.com\nuselesses.com\nusensejn.com\nuserbp.com\nuserhostting.com\nuserresearch.net\nuseryun.net\nuseso.com\nushaqi.com\nushendu.com\nushengame.com\nushinef.com\nushknews.com\nushui.com\nushui.net\nusidt.com\nusing.club\nusingwin.com\nusinspirationfcg.com\nusitour.com\nusitrip.com\nusj.cc\nusjticketing.com\nuslawchina.com\nuslk.net\nusmile.com\nusn.cc\nusniuku.com\nusnook.com\nusocialplus.com\nusoftchina.com\nusoi.net\nusonetrip.com\nuspard.com\nusportnews.com\nusqiaobao.com\nusryinc.com\nusst.store\nustack.com\nustalk.com\nustarl.com\nustbtc.com\nustc.edu\nustcers.com\nustui.com\nusuredata.com\nusus.ltd\nusuuu.com\nusw-tencentclb.cloud\nusw-tencentclb.com\nusw-tencentclb.net\nusw-tencentclb.work\nuszcn.com\nutan.com\nutanbaby.com\nutbon.com\nutc-ic.com\nutcbag.com\nutchk.org\nutctherapeutics.com\nutec.cc\nutecbj.com\nutecexpress.com\nutepo.com\nutermux.dev\nutfinancing.com\nutgd.net\nutiao.com\nutofairy.com\nutogame.com\nutom.design\nutoper.com\nutopiafar.com\nutoppromo.com\nutourworld.com\nutovr.com\nutrainee.com\nutransm.com\nutrustamc.com\nutsource.net\nuttjhu.xyz\nutuqafcr.com\nutvhk.com\nuu-baidu.com\nuu-proxy.com\nuu-xs.net\nuu.cc\nuu1.com\nuu11.com\nuu1314.com\nuu178.com\nuu22332.com\nuu375.com\nuu456.com\nuu66.com\nuu661.com\nuu6o.com\nuu89.com\nuu898.com\nuuaa.net\nuuaoz.com\nuucall.com\nuucc.cc\nuucin.com\nuucl.vip\nuucnn.com\nuucqrdmk.com\nuueasy.com\nuuedutech.com\nuufund.com\nuufuns.com\nuugai.com\nuugame.com\nuugtv.com\nuuhdedu.com\nuuhimalayanqm.com\nuuid.online\nuuimg.com\nuukkuu.com\nuuliaoning.com\nuulucky.com\nuulux.com\nuumachine.com\nuume.com\nuumeitu.com\nuumnu.com\nuunice.com\nuunt.com\nuuoog.com\nuupages.com\nuupan.net\nuupaotui.com\nuupaper.com\nuupei.com\nuupoop.com\nuupt.com\nuupython.com\nuus8.com\nuusama.com\nuusee.com\nuusense.com\nuusky.com\nuusoo.net\nuustory.com\nuustv.com\nuutils.com\nuutop.com\nuutrip.net\nuutytp.com\nuuu.ovh\nuuu9.com\nuuujjj.com\nuuulan.com\nuuumi.net\nuuuo.com\nuuusss.com\nuuutu.com\nuuvisa.com\nuuvps.com\nuuwldh.com\nuuwtq.com\nuuwx.la\nuuxlink.com\nuuxn.com\nuuxoo.com\nuuxs.info\nuuxs.tw\nuuyoyo.com\nuuzham.com\nuuzhufu.com\nuuzo.net\nuuzu.com\nuuzuonline.com\nuuzuonline.net\nuuzz.com\nuuzz.net\nuuzzw.com\nuv25h.com\nuvcdns.com\nuvledtek.com\nuvsec.com\nuvwhd.com\nuw3c.com\nuw9.net\nuwa4d.com\nuwan.com\nuwaysoft.com\nuwenku.com\nuwn.com\nuwntek.com\nuworter.com\nuwparking.com\nux18.com\nux87.com\nuxacn.com\nuxdc.net\nuxdzpmz.com\nuxiangzu.com\nuxianhu.com\nuxicp.com\nuxier.com\nuxin.com\nuxin001.com\nuxingroup.com\nuxiting.com\nuxiu.vip\nuxpi.net\nuxuncloud.com\nuy5.net\nuya04170okq.com\nuya04171okq.com\nuya04180okq.com\nuya04181okq.com\nuya04201okq.com\nuyan.cc\nuyang.co\nuyanip.com\nuyanke.com\nuycnr.com\nuyesee.com\nuygtbsmw.vip\nuyhjnm.com\nuyi2.com\nuyiban.com\nuyiqggpa.com\nuymfybcf.shop\nuyou.com\nuyouii.cool\nuyouqu.com\nuyshipin.com\nuyueread.com\nuyun-cdn.com\nuyunad.com\nuyunbaby.com\nuyuncdn.com\nuyuncdn.net\nuyunce.com\nuyunche.com\nuyuuy.xyz\nuzai.com\nuzaicdn.com\nuzhika.com\nuzhuangji.net\nuzing.net\nuzise.com\nuzkqymgs.com\nuzshare.com\nuzzf.com\nv-56.com\nv-jitp-dom.com\nv-jitp-dom.net\nv-jitp-glo.com\nv-jitp-glo.net\nv-mate.mobi\nv-simtone.com\nv-suan.com\nv-vay.com\nv.to\nv007.net\nv0719.com\nv11-360.org\nv114.com\nv15cdn.com\nv15i.com\nv1kf.com\nv1lady.com\nv1pin.com\nv1sj.com\nv1tx.com\nv1zhushou.com\nv2b3.com\nv2ex.cc\nv2kt.com\nv2vm.com\nv2xdatacenter.com\nv2xdatasource.com\nv2xengine.com\nv3.com\nv3best.com\nv3edu.org\nv3mh.com\nv4.cc\nv479.com\nv4dwkcv.com\nv5.cc\nv5.com\nv5.net\nv50307shvkaa.art\nv51124-3.qpon\nv51124-3a.qpon\nv51124.qpon\nv5875.com\nv5cg.com\nv5dun.net\nv5fox.com\nv5kf.com\nv5ppt.com\nv5shop.com\nv5tv.com\nv5waf.com\nv61.com\nv66v66.com\nv6c.cc\nv6eq34ykhek5.com\nv6lvs.com\nv6ok.com\nv78q.com\nv814.com\nv84tz11w7.com\nv89.com\nv8gb.com\nv977.com\nv9b5n91.com\nva-etong.com\nva05ex1.org\nvaakwe.com\nvaatn.com\nvacepcvu.com\nvacmic.com\nvadxq.com\nvaedu.net\nvaeliu.com\nvafox.net\nvaicdn.com\nvaillant99.com\nvailogchina.com\nvakku.com\nvaliant-cn.com\nvalinbl.com\nvalinresources.com\nvalogin.com\nvaluablety.com\nvaluablexmail.com\nvalue500.com\nvaluecome.com\nvaluedshow.com\nvaluepr.net\nvalueq-sea.com\nvalueq.com\nvalueur.com\nvalurise.com\nvalveshow.com\nvalvewbg.com\nvamachina.com\nvamaker.com\nvan-long.com\nvanbaolu.com\nvanbyte.com\nvance-commerce.com\nvanch.net\nvancheer.com\nvanchip.com\nvanchiptech.com\nvancl.com\nvanclimg.com\nvancss.com\nvanda.cc\nvandream.com\nvanform.com\nvangelinu.com\nvangotech.com\nvanguardstars.com\nvanjee.net\nvanjoin.com\nvankang.com\nvanke-hotels.com\nvanke.com\nvankeclub.com.hk\nvankeservice.com\nvankeservice.mobi\nvankeweekly.com\nvankeytech.com\nvanlinkon.com\nvanmai.com\nvanmatt.com\nvanokey.com\nvanqun.com\nvanrui.com\nvansungroup.com\nvanvi-cn.com\nvanvps.com\nvanward.com\nvanwardsmart.com\nvanyee.net\nvanzol.com\nvaopo.com\nvapepie-web.com\nvapps.me\nvaptcha.com\nvaptcha.net\nvarchserverqa.com\nvarena.com\nvariflight.com\nvarlt.com\nvarmilo.com\nvarsalmed.com\nvart.cc\nvarygroup.com\nvasdgame.com\nvasee.com\nvaslco.com\nvasoon.com\nvastlandsc.com\nvastman.com\nvastsea.com\nvastteq.com\nvatech-china.com\nvattenvalve.com\nvauoo.com\nvautoshow.com\nvayakid.com\nvaydeer.com\nvayol.com\nvayuan.com\nvazyme.com\nvazymemedical.com\nvbaiu.com\nvbango.com\nvbaof.com\nvbaoxian-cib.com\nvbbobo.com\nvbc08090op.com\nvbc08100op.com\nvbc08101op.com\nvbidc.com\nvbio-pharma.com\nvbiquge.com\nvbkhk.com\nvbkrhk.com\nvbmnmy.com\nvbsemi.com\nvbyko.org\nvc800.com\nvcaif.com\nvcarepharmatech.com\nvcbeat.net\nvcc808.site\nvcchar.com\nvcd.io\nvcdnga.com\nvcg.com\nvchangyi.com\nvchiy.com\nvcimg.com\nvcinchina.com\nvckbase.com\nvclass.com\nvclbroker.com\nvclbrokers.com\nvcled.com\nvcloud-byte.com\nvcloudapi.com\nvcloudgtm.com\nvcloudlive.net\nvcloudstc.net\nvcloudvod.net\nvcltrade.com\nvclusters.com\nvcnews.com\nvcomic.com\nvcomputes.com\nvconew.com\nvconew3.com\nvcooline.com\nvcore.hk\nvcpdemo.com\nvcredit.com\nvcrfiw.lol\nvcsmemo.com\nvcspark.com\nvctianshanvs.com\nvctnepj.monster\nvcxpe.com\nvdaye.com\nvdbet.com\nvdfly.com\nvdiagnostic.com\nvdian.com\nvdisk.me\nvdjg65fh3ac-aw1u.com\nvdlya.com\nvdncache.com\nvdncloud.com\nvdndc.com\nvdnsv.com\nvdobiotech.com\nvdolady.com\nvdongchina.com\nvdson888.com\nvdyoo.com\nvdyoo.net\nve-imcloud.com\nve-trafficroute.com\nve-trafficroute.net\nve70.com\nvearne.cc\nvebaike.com\nvec-contracting.com\nvecentek.com\nveckinc.com\nveclightyear.com\nvecloudgame.com\nvecrp.com\nvector-engine.com\nvectorplaces.com\nvedamobi.com\nvedcdnlb.com\nvedeng.com\nveding.com\nvedsalb.com\nveecar.com\nveefdev.com\nveelink.com\nveeqi.net\nveer.com\nveervr.tv\nveeteam.com\nveevlink.com\nveew-alb-cn1.com\nveew-alb-cn2.com\nveew-alb-ts.com\nvefast-fa.com\nveg520.com\nvegalb.com\nvegslb.com\nvegtm.net\nveicplive.com\nveikei.com\nveilytech.com\nveinbase.com\nveirun.com\nveiso.vip\nveitor.net\nvejianzhan.com\nveken.com\nvekinerp.com\nvelasx.com\nvelep.com\nvelledq.com\nvelocaps.com\nvelouras.shop\nvemarsdev.com\nvemarsstatic.com\nvemic.com\nvemte.com\nvemvm.com\nvenbbs.com\nvendor-src-eo.com\nvendue.vip\nvenlvcloud.com\nventoy.net\nvenucia.com\nvenuscn.com\nvenusgroup.asia\nvenusmedtech.com\nvenusong.site\nvephp.com\nveqxiu.net\nver.cc\nvergilisme.com\nverify5.com\nverisilicon.com\nverisyno.com\nversa-ai.com\nversolsolar.com\nversoventure.com\nvertciot.com\nvertical-china.com\nvertu.com\nvertuonline.com\nvery361.com\nveryapex.com\nveryark.com\nverycd.com\nverycdn.net\nverychem.com\nverydg.com\nverydoc.net\nverydu.net\nverydz.com\nveryevent.com\nverygrass.com\nverygslb.com\nverygslb.net\nveryhappy.pw\nveryhuo.com\nveryide.com\nveryim.com\nverykuai.com\nverym.com\nveryns.com\nveryok.net\nveryol.com\nverypan.com\nverysource.com\nverystar.net\nverysync.com\nveryvp.com\nveryweibo.com\nverywind.com\nveryxiang.com\nveryzhun.com\nves100.com\nvestack-beta.com\nvestack-cicd.com\nvestack-preview.com\nvestack-sandbox.com\nvestack.cloud\nvesystem.com\nvetoolchain.com\nvetscloud.com\nvevor.net\nvevorstatic.com\nvez.me\nvf5c.com\nvfcdnrd.com\nvfcpay.com\nvfcsz.com\nvfe.cc\nvfinemusic.com\nvfocus.net\nvftfishing.com\nvfuiov.sbs\nvfuke.net\nvfund.org\nvfvdf.com\nvfx123.com\nvg.com\nvg173.com\nvgabc.com\nvgbaike.com\nvgctradeunion.com\nvghall.com\nvghimalayandm.com\nvghimalayanet.com\nvgjump.com\nvglook.com\nvgnclub.com\nvgoapp.com\nvgogbuy.com\nvgooo.com\nvgover.com\nvgoyun.com\nvgtime.com\nvgunxpkt.com\nvgvmotor.com\nvgyuhu.com\nvhall.com\nvhallyun.com\nvhao123.com\nvhengdata.com\nvhgu5ivtew.com\nvhiphop.com\nvhong.com\nvhostcp.com\nvhostgo.com\nvhshub.com\nvhsinsurtech.com\nvhxaw.com\nvhzhaopin.com\nvi-mayman.com\nvi1zen.com\nvi21.net\nvi586.com\nvia-cert.com\nviablife.com\nviaeda.com\nvial.cc\nviarmour.com\nviayoo.com\nviberom.com\nvibrou.com\nvibunion.com\nvic18.com\nvicanquan.com\nvicbio.com\nvicchen.me\nvicigaming.com\nvicitymall.com\nvickn.com\nvicl.net\nvicome.com\nvicovico.com\nvicp.cc\nvicp.fun\nvicp.io\nvicp.net\nvicpalm.com\nvicpv.com\nvicrab.com\nvicsdf.com\nvicsz.com\nvictoriassecretclearance.online\nvictory-inflight.com\nvictorybio.com\nviczz.com\nvid12060hl.com\nvida-bio.com\nviday.org\nvideaba.com\nvideasoft.com\nvideo-study.com\nvideo-voip.com\nvideo2b.com\nvideocc.net\nvideofty.com\nvideohudong.com\nvideohupu.com\nvideoincloud.com\nvideojj.com\nvideomind.cloud\nvideomind.net\nvideoplus.cc\nvideotomp3.site\nvideougc.com\nvideoxiaoyouxi.com\nvideoyx.com\nvidmate.mobi\nvidmate.net\nvidmatefilm.org\nvidz.asia\nviecoo.com\nvieg.net\nvientao.com\nviewcoder.com\nviewstock.com\nviewtool.com\nviewtrans.com\nvifaka.com\nvigogroup.com\nvigorgb.com\nvigorousxy.com\nvigtel.com\nvigtm-meeting-tencent.com\nviigee.com\nviiixcpe.com\nviisan.com\nviitalk.com\nviixin.com\nvijingsmart.com\nvijos.org\nvijs.net\nvikduo.com\nvikecn.com\nvikilife.com\nvilives.com\nvillachina.com\nvillasbalirent.com\nviltd.com\nvim8.org\nvimage1.com\nvimage2.com\nvimage3.com\nvimage4.com\nvimdesign.com\nvimge.com\nvimicro.com\nvimiix.com\nvimin.cc\nvimiy.com\nvims04.com\nvimsky.com\nvin114.net\nvin17.com\nvincentqin.tech\nvinchin.com\nvindapaper.com\nvinehoo.com\nvinetreetents.com\nvingoojuice.com\nvinjn.com\nvinkdong.com\nvinlion.com\nvinsondata.com\nvioletgo.com\nviolinstudy.net\nviolinww.com\nvip-chn.com\nvip-lexiang.com\nvip-vip-yzzy.com\nvip-wifi.com\nvip.com\nvip10000.club\nvip120.com\nvip1280.net\nvip150.com\nvip360.work\nvip3659k.com\nvip7337.com\nvip7787.com\nvip800.com\nvip8849.com\nvip9982.net\nvipabc.com\nvipabcyun.com\nvipappsina.com\nvipbaihe.com\nvipbcw.com\nvipbla.com\nvipbuluo.com\nvipcaocao.com\nvipchina.com\nvipcto.com\nvipdlt.com\nvipersaudio.com\nvipexam.org\nvipfashion.com\nvipfengfei.com\nvipfengxiao.com\nvipfenxiang.com\nvipfinal.com\nvipflonline.com\nvipglobal.hk\nvipgouyouhui.com\nvipgs.net\nvipgslb.com\nvipguanjia.net\nviphxw.com\nvipiao.com\nvipjingdong.com\nvipjinron.com\nvipjr.com\nvipkaoyan.net\nvipkid.com\nvipkidcdn.com\nvipkidresource.com\nvipkidstatic.com\nvipkj.net\nviplao.com\nvipleyuan.com\nvipliangmei.com\nviplux.com\nvipmaillist.com\nvipmalljf.com\nvipmro.com\nvipmro.net\nviponlyedu.com\nviposs.com\nvippapi.com\nvippluspai.com\nvipqdd.com\nvipqlz.com\nvipreading.com\nvips100.com\nvipshare.com\nvipshop.com\nvipshopyao.com\nvipshou.com\nvipsinaapp.com\nvipskill.com\nvipslib.com\nvipsmt.com\nvipsoft.cc\nvipsrc.com\nvipstatic.com\nvipstore.com\nviptijian.com\nvipwzswl.com\nvipxap.com\nvipxdns.com\nvipxdns.info\nvipxdns.net\nvipxf.com\nvipxs.la\nvipyl.com\nvipyyzz.com\nvipyz-cdn1.com\nvipzhuanli.com\nviqq.com\nvirbox.com\nvircloud.net\nvireala.com\nvireala.net\nvirosin.org\nvirscan.org\nvirtaicloud.com\nvirtualevent.net\nvirtualworld.pub\nvirtupharmako.com\nvirusdefender.net\nvisa027.com\nvisa163.com\nvisa198.com\nvisa800.com\nvisaai.com\nvisabao.com\nvisacits.com\nvisactor.com\nvisadeguo.com\nvisaforchina.org\nvisaforkorea-bj.com\nvisaforkorea-cd.com\nvisaforkorea-gz.com\nvisaforkorea-qd.com\nvisaforkorea-sh.com\nvisaforkorea-wh.com\nvisahuanqiu.com\nvisajx.com\nvisanc.com\nvisas.to\nvisasoo.com\nvisaun.com\nvisbodyfit.com\nviscosefibre.com\nviseator.com\nvisfarm.com\nvishavideo.com\nvisheng.com\nvishoor.com\nvisinextek.com\nvision-nj.com\nvision-systems-china.com\nvisionandview.com\nvisionarytech.ltd\nvisionbbs.com\nvisionchinashow.net\nvisioncloudapi.com\nvisionhacker.com\nvisionly.org\nvisionmax-sh.com\nvisionstar-tech.com\nvisionunion.com\nvisionvera.com\nvisirobot.com\nvisitsanya.com\nvisitsz.com\nviskem.com\nvismaasale.shop\nvismadeal.shop\nvista-china.net\nvista123.com\nvistahelmets.com\nvistastory.com\nvisu-autotec.com\nvisualchina.com\nvisvachina.com\nvisvn.com\nvitagou.com\nvitagou.hk\nvitalgen.com\nvitaloffice.life\nvitalxyz.com\nvitarn.com\nvitasoy-chn.com\nvitechliu.com\nviterbi-tech.com\nvitesexpo.com\nvitian.vip\nviu777.co\nvivaia.com\nvivaiaschweiz.com\nvivantecorp.com\nvivaylien.com\nvivcms.com\nvivebest.com\nvividict.com\nvivijk.com\nviviv.com\nviviwin.com\nvivo.com\nvivo.xyz\nvivoglobal.com\nvivojia.com\nvivojrkj.com\nvivokb.com\nvivosjpt.com\nvivotc.com\nviwik.com\nvixiu.com\nvixue.com\nviyouhui.com\nviyuan.com\nvizo-dns.com\nvjia.com\nvjianshen1688.com\nvjiazu.com\nvjie.com\nvjifen.com\nvjread.com\nvjshi.com\nvjtchina.com\nvk6.me\nvk8.co\nvkaijiang.com\nvkbaby.com\nvkehu.com\nvkemai.com\nvkjsq.com\nvkoolhf.com\nvkoopp.com\nvkoq4kyzmj.com\nvkrqtir.xyz\nvksir.zone\nvksoft.com\nvku6.com\nvkua.com\nvkxiazai.com\nvlabstatic.com\nvlabvod.com\nvlan.fun\nvland-official.com\nvlandgroup.com\nvlcable.com\nvliang.com\nvlight.me\nvlightv.com\nvlink.cc\nvlinkage.com\nvlinkapi.com\nvlinke.com\nvlion.mobi\nvlong.tv\nvlongbiz.com\nvlportal.download.prss.microsoft.com\nvlrzgf.sbs\nvlss.com\nvlssu.com\nvlwwu.com\nvm.sg\nvm7.com\nvm888.com\nvmaes.com\nvmall-hw.com\nvmall.cloud\nvmall.com\nvmallres.com\nvmanhua.com\nvmartaw.com\nvmax-lighting.com\nvmaxhome.com\nvmaya.com\nvmdns.xyz\nvmdo.net\nvmecum.com\nvmengblog.com\nvmeti.com\nvmic.xyz\nvmicloud.com\nvmiua.com\nvmkj.net\nvmlib.com\nvmoiver.com\nvmonkey.mobi\nvmovier.cc\nvmoviercdn.com\nvmsky.com\nvmtdf.com\nvmtnet.com\nvmuboh.com\nvmuhyu.site\nvmylan.com\nvnadssb.com\nvname.com\nvnanke.com\nvnet.com\nvnet.mobi\nvniddlg.xyz\nvnlin.com\nvnnox.com\nvnpy.com\nvnvn33.com\nvnzmi.com\nvoa365.com\nvobao.com\nvoc.ai\nvocalmiku.com\nvoccdn.com\nvocinno.com\nvocotype.com\nvod-backup.net\nvod-bk-qcloud.com\nvod-content.com\nvod-content.net\nvod-eo.com\nvod-igtm.com\nvod-pro.com\nvod-qcloud.com\nvod-test.com\nvod-upload.com\nvodapis.com\nvodapisbk.com\nvodasafe.com\nvoddlb.com\nvodecn.com\nvodehr.com\nvodeoapi.com\nvodeoapibk.com\nvodeointernal.com\nvodeshop.com\nvodinternal.com\nvodinternalbk.com\nvodjk.com\nvodn-valve.com\nvodone.com\nvodplayvideo.com\nvodplayvideo.net\nvodpro-upload.com\nvodpro-upload1.com\nvodpro-upload2.com\nvodpro-uploadbk.com\nvodtcbk.com\nvodxl-qcloud.com\nvoguecafebeijing.com\nvoguechinese.com\nvoguelife.net\nvohringer.com\nvoice9.com\nvoicedic.com\nvoicer.info\nvoicer.me\nvoidking.com\nvojs.tv\nvokop.com\nvolc-dns.com\nvolc-dns.net\nvolc-dns.pub\nvolc-embed.com\nvolcadocean.com\nvolcadvc.com\nvolcalb.com\nvolcanicengine.com\nvolcano-force.com\nvolcanospring.com\nvolcautovod.com\nvolcbiz.com\nvolcca.com\nvolccdn.com\nvolccdn1.com\nvolccdn2.com\nvolccloudidentity.com\nvolcddos.com\nvolcddos001.com\nvolcdem.com\nvolcdn.com\nvolcdns-test.com\nvolcdns-test.net\nvolcdns.com\nvolcdns.pub\nvolceapi.com\nvolceapplog.com\nvolcecr.com\nvolcecw.com\nvolcengine-dns.com\nvolcengine-dns.net\nvolcengine.com\nvolcengine.net\nvolcenginealb.com\nvolcengineapi.com\nvolcenginedns.com\nvolcenginedns.net\nvolcenginepaas.com\nvolces.com\nvolcfake.com\nvolcfcdn.com\nvolcfcdnbyte.com\nvolcfcdndvs.com\nvolcfcdndvs1.com\nvolcfcdndvs2.com\nvolcfcdnplus.com\nvolcfcdnrd.com\nvolcfcdnsc.com\nvolcfxgjrtm.com\nvolcgroup.com\nvolcgslb-mlt.com\nvolcgslb.com\nvolcgtm.com\nvolchina.com\nvolciad.com\nvolcimagex.com\nvolcimagex.net\nvolcimagextest.com\nvolclivedvs.com\nvolcmagicpage.com\nvolcmcdn1.com\nvolcmcdn2.com\nvolcmcdn3.com\nvolcmcdn4.com\nvolcmcdnalias.com\nvolcmgs.com\nvolcmlt.com\nvolcmusecdn.com\nvolcocic.com\nvolcopjrtm.com\nvolcpartner.com\nvolcpartner.net\nvolcsirius.com\nvolcsiriusbd.com\nvolcspaceeduc.com\nvolctracer.com\nvolctrack.com\nvolctraffic.com\nvolctranscdn.com\nvolcvideo.com\nvolcvms.com\nvolcvod.com\nvolcwaf.com\nvolcwaf001.com\nvoldp.com\nvoleai.com\nvolic.download.prss.microsoft.com\nvolit.com\nvolkswagen-anhui.com\nvolleyballchina.com\nvolleychina.org\nvoltmemo.com\nvomicer.com\nvoming.com\nvommatec.com\nvoneseals.com\nvonets.com\nvonng.com\nvonwei.com\nvoo0.com\nvooct.com\nvooec.com\nvooedit.com\nvoole.com\nvoolea.com\nvoolga.net\nvoopoo.com\nvoovlive.com\nvoovlive.net\nvoovmeeting.com\nvoovnow.com\nvortexfun.com\nvot8.com\nvote001.com\nvote8.com\nvotianxia.com\nvoto.cc\nvotwo.com\nvoxlearning.com\nvoxpie.com\nvoycn.com\nvp6.co\nvpabrand.com\nvpal.com\nvpalstatic.com\nvpansou.com\nvpascare.com\nvpath.net\nvpay8.com\nvpbus.com\nvpcs.com\nvpea.ca\nvpgame.com\nvpgamecdn.com\nvpiaotong.com\nvpie.net\nvpimg1.com\nvpimg2.com\nvpimg3.com\nvpimg4.com\nvpkupfti.sbs\nvplay8.com\nvplayer.net\nvpmagic.com\nvpn39.com\nvpnsoft.net\nvpnvpn.com\nvpquc9rn.com\nvps-vacuum.com\nvps.dance\nvps.im\nvps234.com\nvps55.com\nvps911.com\nvpsaa.com\nvpsaa.net\nvpscang.com\nvpsce.com\nvpser.com\nvpser.net\nvpsguo.com\nvpshu.com\nvpsjxw.com\nvpsno.com\nvpsoff.net\nvpsor.com\nvpsplayer.com\nvpspurchase.com\nvpsss.net\nvpssw.com\nvpsvip.com\nvpsvsvps.com\nvpszh.com\nvptek.com\nvq7736.com\nvqaq.com\nvqjuice.com\nvqpwg.work\nvqq.com\nvqs.com\nvqu.show\nvqudo.com\nvqudochina.com\nvr-cat.com\nvr186.com\nvr2.tv\nvr42.com\nvrbeing.com\nvrbi.viveport.com\nvrbig.com\nvrbrothers.com\nvrbt.mobi\nvrcfo.com\nvrdiamondtools.com\nvrindabg.com\nvrjie.com\nvrmajor.com\nvrnew.com\nvrnos.com\nvrp3d.com\nvrpinea.com\nvrpowder.com\nvrqjcs.com\nvrqq.org\nvrrw.net\nvrtyg.com\nvrupup.com\nvrvlink.com\nvrvmanager.com\nvrwuhan.com\nvrzb.com\nvrzhijia.com\nvrzwk.com\nvrzwk.net\nvs-gascloud.com\nvs.cm\nvs2a.com\nvsaker.com\nvsamhos.com\nvsane.com\nvsaol.com\nvsbclub.com\nvsbuys.com\nvscode.download.prss.microsoft.com\nvscops.com\nvsean.net\nvsearch.club\nvsens.com\nvshangdaili.com\nvsharecloud.com\nvsharing.com\nvshoucang.com\nvsjwtcdn.com\nvslai.com\nvsnoon.com\nvsnoon.net\nvsnoon.org\nvsochina.com\nvsocloud.com\nvsoon.net\nvsooncat.com\nvsooncloud.com\nvsoontech.com\nvsping.com\nvspk.com\nvsread.com\nvssou.com\nvsszan.com\nvstarstatic.com\nvstart.net\nvstecs.com\nvstmv.com\nvstonefund.com\nvstonewealth.com\nvstou.com\nvsun.com\nvsx10.com\nvsxue.com\nvsyo.com\nvsyy.net\nvt-pharm.com\nvtache.com\nvtcsy.com\nvteamgroup.com\nvtears.com\nvtepai.com\nvtepai.net\nvtibet.com\nvtijian.com\nvtmyfbax.vip\nvtool.vip\nvtoshop.com\nvtoutiao.cc\nvtradex.com\nvtrois.com\nvtron.site\nvtstar.net\nvtuzx.com\nvtydgv.org\nvue-js.com\nvue88.com\nvuejs.press\nvuepush.com\nvuevideo.net\nvulbox.com\nvulcan.dl.playstation.net\nvulrange.com\nvultr1.com\nvultrcn.com\nvultrvps.com\nvumstar.com\nvunion.net\nvuphub.com\nvurl.fun\nvurl.link\nvurl.pro\nvurl.tech\nvurl3.vip\nvutimes.com\nvuz.me\nvv-tool.com\nvv.cc\nvv1628.cc\nvv27.com\nvv3111.com\nvv8.com\nvv881.com\nvv8yx.com\nvv91.com\nvv91.net\nvvbin.com\nvvebo.vip\nvvfeng.com\nvvgroup.com\nvvhan.com\nvvhunter.com\nvvic.com\nvving.vip\nvvipcdn.com\nvviptuangou.com\nvvjob.com\nvvlian.com\nvvmeiju.com\nvvo2o.com\nvvpgwg.xyz\nvvpncdn.com\nvvstc.com\nvvtor.com\nvvup.net\nvvvdj.com\nvvvtt.com\nvvxue.com\nvvzero.com\nvw888.com\nvwaycn.com\nvwe5pjt0jq.com\nvwhulian.com\nvwkbh1674.com\nvwo50.club\nvwvvwv.com\nvwwmsd.com\nvx56.com\nvxe.com\nvxia.net\nvxiaocheng.com\nvxiaoxin.com\nvxinyou.com\nvxixi.com\nvxo7tu.com\nvxocok3197.vip\nvxras.com\nvxsnk.com\nvxuepin.com\nvxuey.com\nvxv.ink\nvxwo.com\nvxxsfxxs.com\nvxxx.vip\nvycool.com\nvyin.com\nvynior.com\nvyuan8.com\nvz.download.prss.microsoft.com\nvz41.com\nvzan.cc\nvzan.com\nvzbvhfql.com\nvzhang.net\nvzhantong.com\nvzhifu.net\nvzhou.net\nvzhuanba.com\nvzhuji.com\nvzhuo.com\nvzhushou.com\nvzidc.com\nvzimu.net\nvzklb.com\nvzkoo.com\nvzone.me\nvzuu.com\nw-e.cc\nw-startech.com\nw-zhong.com\nw.biz\nw032.com\nw0663.com\nw0y.com\nw10a.com\nw10xitong.com\nw123w.com\nw18.net\nw1989.com\nw1b.com\nw218.com\nw2gou.com\nw2solo.com\nw333.com\nw3cbus.com\nw3ccoo.com\nw3cfba6ufr.com\nw3cfuns.com\nw3chtml.com\nw3cjava.com\nw3cplus.com\nw3cschool.cc\nw3ctalk.com\nw3ctech.com\nw3cways.com\nw3h5.com\nw3pop.com\nw3so.com\nw3techservices.com\nw3tool.com\nw3tt.com\nw3xue.com\nw5.com\nw61usi4a.org\nw6pdp.com\nw7.cc\nw7000.com\nw7ghost.net\nw918.com\nw9188wan.com\nwa5.com\nwa5as4.com\nwaaaat.com\nwaakee.com\nwaaku.com\nwaakuu.com\nwaasee.com\nwabcw.info\nwabestdealmall.com\nwabuw.com\nwacai.com\nwacai365.com\nwacaijizhang.com\nwacaiyun.com\nwacaoren.net\nwacdn.com\nwader1714.com\nwadkj.com\nwaduanzi.com\nwae-logistics.com\nwaerfa.com\nwaesedu.com\nwaf-website.com\nwaf.one\nwafatea.com\nwafcn.com\nwafunny.com\nwafzi.com\nwagen.cc\nwagonsclub.com\nwaha.cc\nwahahakid.org\nwaheaven.com\nwahlap.com\nwahlap.net\nwahsanggroup.com\nwahtaisz.com\nwahuto.com\nwahyao.com\nwaibao123.com\nwaibao12333.com\nwaibaodashi.com\nwaibou.com\nwaifushangcheng.com\nwaig8.com\nwaigamer.com\nwaigf.com\nwaigi.org\nwaiguofang.com\nwaihui321.com\nwaihui580.com\nwaihui888.com\nwaihuigu.net\nwaihuo.com\nwaiji.com\nwailaishop.com\nwailaizhe.com\nwailianluntan.com\nwailiantu.com\nwailianvisa.com\nwaima.com\nwaimai.com\nwaimai.zone\nwaimai101.com\nwaimai361.com\nwaimaimingtang.com\nwaimaiwanjia.com\nwaimaob2c.com\nwaimaoniu.com\nwaimaoniu.net\nwaimaoribao.com\nwaimaozhuge.com\nwaimungfire.com\nwainconnector.com\nwaipojia.com\nwaipoxin.com\nwaiqicha.com\nwaiqin365.com\nwaisnj.com\nwaiting.monster\nwaitingfy.com\nwaitsun.com\nwaiwmhsb.org\nwaiyuedu.com\nwaizaowang.com\nwajiquan.com\nwajueji.com\nwajufo.com\nwakeai.tech\nwakedata.com\nwakeofgods.com\nwakeup.fun\nwakingsands.com\nwakkaa.com\nwakuai.com\nwal8.com\nwalanwalan.com\nwalatao.com\nwalekan.com\nwali.com\nwali123.com\nwalibao.com\nwalimaker.com\nwalk-live.com\nwalker-fan.com\nwalkera.com\nwalkingpad.com\nwalkkind.com\nwalknode.com\nwalkthechat.com\nwallcoo.com\nwallcoo.net\nwalle-web.io\nwallet.io\nwalletio.io\nwallmatechina.com\nwallstcn.com\nwallstreetcn.com\nwallswitch.com\nwalltu.com\nwallyt.net\nwalre.com\nwalsongreenhouse.com\nwalton-xuzhou.com\nwaltzsy.com\nwaluer.com\nwalvax.com\nwamawama.com\nwamila.com\nwan-ka.com\nwan.cc\nwan.com\nwan1234.com\nwan123x.com\nwan32.com\nwan5d.com\nwan68.com\nwan73.com\nwan77.com\nwan8.com\nwan886.com\nwan898.com\nwan95.com\nwanadalu.com\nwanandroid.com\nwanbaapp.com\nwanbexpress.com\nwanbgame.com\nwanbiao800.com\nwanbiaogs.com\nwanbiaohao.com\nwanbushu.com\nwanbuyu.com\nwancai.com\nwancaiinfo.com\nwancaomei.com\nwanchangerp.com\nwanchaohotels.com\nwanche100.com\nwanche168.com\nwanchemi.com\nwancheng168.com\nwanchengwenku.com\nwanchuweilai.com\nwanci.cc\nwancibp.com\nwancili.com\nwanda-cti.com\nwanda-gh.com\nwanda-group.com\nwandacinemas.com\nwandaclub.cc\nwandacm.com\nwandafilm.com\nwandahotelinvestment.com\nwandahotels.com\nwandanji.cc\nwandaph.com\nwandaplazas.com\nwandarealm.com\nwandavista.com\nwandawic.com\nwandhao.com\nwandhi.com\nwanding.net\nwandingwangluo.com\nwandipay.com\nwandodo.com\nwandoer.com\nwandongli.com\nwandoudou.com\nwandouip.com\nwandoujia.com\nwanduoduo.com\nwaneziyuan.com\nwanfangche.com\nwanfangdata.com\nwanfangtech.com\nwanfangtech.net\nwanfantian.com\nwanfayun.com\nwanfoquan.com\nwanfucc.com\nwanfudaluye.com\nwanfukang.cc\nwanfuqianqiu.com\nwang\nwang-li.com\nwang-nan.com\nwang-russell.cc\nwang1314.com\nwang1314.net\nwanga.me\nwangaiche.com\nwangamela.com\nwangan.com\nwanganke.com\nwangbaobao.org\nwangbaobei.com\nwangbaoqiang-cloudcdn.com\nwangbixi.com\nwangcaio2o.com\nwangcaiwang.com\nwangcanmou.com\nwangchanggou.com\nwangchao.de\nwangchujiang.com\nwangchunsheng.com\nwangcms.com\nwangdafeed.com\nwangdahn.com\nwangdai114.com\nwangdai555.com\nwangdaibdt.com\nwangdaicaifu.com\nwangdaidongfang.com\nwangdaiguancha.com\nwangdaishikong.com\nwangdaisj.com\nwangdaitiandi.com\nwangdalao.com\nwangdali.net\nwangdaodao.com\nwangdianchaxun.com\nwangdianmaster.com\nwangdingchang321.xyz\nwangdingcup.com\nwangdongjie.com\nwangdu.site\nwangduanwifi.com\nwangeda.com\nwangeditor.com\nwangejiba.com\nwangfujing.com\nwanggongwang.com\nwanggou.com\nwangguai.com\nwanghaifeng.net\nwanghanyue.com\nwanghao.me\nwanghe.tv\nwanghong.zone\nwanghongluo.com\nwanghualang.com\nwanghuinet.com\nwanghz.com\nwangid.com\nwangjianshuo.com\nwangjiezhe.com\nwangjm.com\nwangjubao.com\nwangjumeng.xin\nwangjun.art\nwangjunwei.com\nwangkangzhong.com\nwangkewang.com\nwangkl.com\nwangkong.com\nwangle.com\nwangligroup.com\nwangling.net\nwanglingyue.com\nwanglong.com\nwanglu.info\nwangluoxiangmu.com\nwanglv.com\nwanglv.vip\nwangmei360.com\nwangmeng.com\nwangmingdaquan.cc\nwangmou.com\nwangniuwms.com\nwangpeiaiot.com\nwangpiao.com\nwangpiao.net\nwangpu.net\nwangqc.com\nwangqi.com\nwangqingzx.com\nwangren.com\nwangrunze.com\nwangshidi.com\nwangshitou.com\nwangshu.la\nwangshuashua.com\nwangshugu.com\nwangsu.com\nwangsu.net\nwangsucloud.com\nwangsuedge.com\nwangsuedge.net\nwangsutong.com\nwangt.cc\nwangtingrui.com\nwangtongtong.com\nwangtu.com\nwanguan.com\nwanguanwl.com\nwanguo-outlets.com\nwanguokang.com\nwanguotong.com\nwangwanglive.com\nwangwango.com\nwangweiluo.com\nwangwo.net\nwangxc.club\nwangxiangyule.com\nwangxianyuan.com\nwangxiao.net\nwangxiaobao.cc\nwangxiaobao.com\nwangxie.org\nwangxing.com\nwangxingcs.com\nwangxinhao.com\nwangxinlicai.com\nwangyangyang.vip\nwangyanpiano.com\nwangye6.com\nwangyeyixia.com\nwangyikai.com\nwangyin.com\nwangyinmao.com\nwangyou.com\nwangyou.ink\nwangyou2.com\nwangyouhangkong.com\nwangyuan.com\nwangyuedaojia.com\nwangyulue.com\nwangyunchuan.com\nwangyunf.com\nwangyuwang.com\nwangzhan123.net\nwangzhan31.com\nwangzhan360.com\nwangzhan5.com\nwangzhanbao.cc\nwangzhanbianji.com\nwangzhanchi.com\nwangzhantuiguang.net\nwangzhanzj.com\nwangzhe.com\nwangzhengzhen.com\nwangzhennan.com\nwangzherongyao.com\nwangzhuanz.com\nwanh5.com\nwanhea.com\nwanhebin.com\nwanheweb.com\nwanhi.com\nwanhongbao.com\nwanhongindigo.com\nwanhongji.com\nwanhu888.com\nwanhuabao.com\nwanhuaes.com\nwanhuahai.com\nwanhuajing.com\nwanhui365.com\nwanhuicar.com\nwanhuida888.com\nwanhuiya.com\nwanhumotor.com\nwanhunet.com\nwanimal1983.org\nwanjia.org\nwanjiacc.com\nwanjiachupin.com\nwanjiaiot.com\nwanjiashe.com\nwanjiashow.com\nwanjidashi.com\nwanjiedata.com\nwanjiedu.com\nwanjiejixie.com\nwanjing111.com\nwanjiquan.com\nwanjunshijie.com\nwanjutoy.com\nwanka5.com\nwankacn.com\nwankacn.net\nwankamall.com\nwanke123.com\nwanke798.com\nwanku.com\nwanlaiwang.com\nwanli.com\nwanli.org\nwanlian-group.com\nwanlicd.com\nwanliduo.com\nwanliniu.com\nwanlitong.com\nwanlongdianqi.com\nwanlongjituan.com\nwanmaco.com\nwanmei.com\nwanmei.net\nwanmeilink.com\nwanmeilr.com\nwanmeiyunjiao.com\nwanmi.com\nwanmingpiano.com\nwannaenergy.com\nwannaexpresso.com\nwanneng56.com\nwannengxiaoge.com\nwannengzj.com\nwannianli.mobi\nwannianli.net\nwannianli3.com\nwannianli7.com\nwannianli8.com\nwannianli9.com\nwannianqingjianzhan.com\nwannuoda.com\nwanplus.com\nwanpufeiliu.com\nwanqianyun.com\nwanqiula.com\nwanqutong.com\nwanren.com\nwanruihuanjing.com\nwanrungj.com\nwansanzu.com\nwansf.com\nwanshahao.com\nwanshancha.com\nwanshangding.com\nwanshanshuju.com\nwanshifu.com\nwanshifuapp.com\nwanshitong.com\nwanshouyou.net\nwanshu.com\nwanshuiqing.com\nwanshuiwater.com\nwanshulou.com\nwanshuyun.com\nwansixie.com\nwansongpu.com\nwansusyj.com\nwant-want.com\nwantexe.com\nwantgame.net\nwantiangroup.com\nwantiku.com\nwantong-tech.net\nwantowan.com\nwantquotes.net\nwantuju.com\nwantumusic.com\nwantwords.net\nwantwu.com\nwantxt.cc\nwanwan4399.com\nwanwan88.com\nwanwang.com\nwanwang.space\nwanwang.xin\nwanweiedu.com\nwanweixin.com\nwanwu.com\nwanwudezhi.com\nwanwuelian.com\nwanwumall.com\nwanwusc.com\nwanwushuo.com\nwanwuxia.com\nwanwuzhinan.com\nwanxia.com\nwanxiangauto.com\nwanxiangleasing.com\nwanxiangqihang.com\nwanxiangyouxian.com\nwanxiaochu.com\nwanxie.cc\nwanxiquan.com\nwanyabox.com\nwanyan.com\nwanyanwang.com\nwanye.cc\nwanyi.pw\nwanyico.com\nwanyijizi.com\nwanyiwang.com\nwanyol.com\nwanyoo.com\nwanyouw.com\nwanyouxi.com\nwanyouxi7.com\nwanyr.com\nwanyuannews.com\nwanyuanxiang.com\nwanyuanyun.com\nwanyuenet.com\nwanyuhengtong.com\nwanyuhudong.com\nwanyujy.com\nwanyumi.com\nwanyunshuju.com\nwanyuproperty.com\nwanyuwang.com\nwanyx.com\nwanzaiwater.com\nwanzecc.com\nwanzhizr.com\nwanzhoujob.com\nwanzhoumls.com\nwanzhoumo.com\nwanzhua.com\nwanzhuang.com\nwanzhuangkj.com\nwanzhucdn.com\nwanzi.cc\nwanzi.com\nwanzia.com\nwanzjhb.com\nwanzuile.com\nwaodown.com\nwaoh.fun\nwaoo.cc\nwapadv.com\nwaptt.com\nwaptw.com\nwar-sky.com\nwaralert.net\nwarchina.com\nwarcraftchina.com\nwarframeofficial.com\nwarhammertech.com\nwarmchina121.com\nwarmjar.com\nwarnp.org\nwarom.com\nwarriorshoes.com\nwarriortire.com\nwarsk.com\nwarsongmobile.com\nwarstudy.com\nwarsu.com\nwarting.com\nwaruixinxi.com\nwarwww.com\nwasabi.fun\nwasair.com\nwasanfeng.com\nwasd.plus\nwasdj.com\nwasee.com\nwashpayer.com\nwashun.com\nwashuw.com\nwasintek.com\nwasoinfo.com\nwasonchina.com\nwasu.com\nwasu.tv\nwasucnc.com\nwatch-space.com\nwatch-top.net\nwatch1905.com\nwatch4s.com\nwatchadmin.com\nwatchdios.com\nwatchds.com\nwatcheschep.com\nwatchlead.com\nwatchok.net\nwatchreplica.co\nwatchreplicaswiss.com\nwatchrm.com\nwatchshfw.com\nwatchsos.com\nwatchstor.com\nwatchtop.com\nwatchtraveler.com\nwatchwxfw.com\nwatchzb.com\nwater-cube.com\nwater520.com\nwater8848.com\nwaterchina.com\nwaterdp.com\nwaterdropfilter.com\nwaterenping.com\nwatergasheat.com\nwatergdd.com\nwaterjhh.com\nwaterlytech.com\nwatermc.org\nwatershowcg.com\nwatertek.com\nwatertu.com\nwateryx.com\nwatyuan.com\nwauee.com\nwauee.net\nwave-optics.com\nwavecn.com\nwavecommittee.com\nwavedsp.tech\nwavefront-optics.com\nwaveopt.com\nwaveshare.net\nwaveup.work\nwavezones.com\nwavideo.tv\nwavpub.com\nwawacm.com\nwawayaya.net\nwawayu.tv\nwawlhld.com\nwaxiaoxia.com\nwaxpi.com\nwaxrain.com\nwaxxh.me\nway2solo.com\nwayboosz.com\nwaycdn.com\nwaycloud.info\nwayenbio.com\nwayhu.cc\nwayhu8.com\nwaylon.online\nwaynetechs.com\nwayos.com\nwayosbill.com\nwayoulegal.com\nwayoumi.com\nwayoxi.com\nwaypons.com\nwaysundata.com\nwaytit.com\nwaytoagi.com\nwayupss.store\nwayzim.com\nwazhuti.com\nwb133.com\nwb321.com\nwb521.net\nwb699.com\nwb86.com\nwbangdan.com\nwbanz.com\nwbb-electric.com\nwbbcdn.com\nwbcm55.com\nwbd99.com\nwbecrisfro.com\nwbeexpo.com\nwbgt.net\nwbh-sh.com\nwbhgwbnd.com\nwbiao.co\nwbiao.com\nwbiao120.com\nwbiaohome.com\nwbimg.com\nwbncp.com\nwbo529.com\nwboll.com\nwbolt.com\nwbpvc.com\nwbrks.com\nwbsdz.com\nwbstar.com\nwbsz.com\nwbt5.com\nwbtech.com\nwbtrans.com\nwbw.im\nwbwbwb.net\nwbxcx.net\nwbxinxi.com\nwbzd.net\nwc44.com\nwcansoft.com\nwcbygame.com\nwccbee.com\nwcccc.cc\nwccg.tech\nwcd.im\nwcdc.center\nwcfang.com\nwch-ic.com\nwch17.com\nwch666.com\nwchfgd.com\nwcjbb.com\nwcjbb.net\nwcjm.org\nwclbox.com\nwcloud.com\nwcode.net\nwcp.hk\nwcqjyw.com\nwcsapi.com\nwcsapi.net\nwcsfa.com\nwcsteasker.com\nwcuhdi.com\nwcwlmobi.com\nwcxjs.com\nwcxsw.com\nwcyecs.com\nwd-ljt.com\nwdace.com\nwdad.cc\nwdashi.com\nwdaveh5game.com\nwdazgscbxh2.com\nwddcn.com\nwddns.net\nwddream.com\nwdexam.com\nwdf1tz.com\nwdf1tz.net\nwdfangyi.com\nwdfxw.net\nwdgf.com\nwdghy.com\nwdiur.com\nwdiyi.com\nwdj21.com\nwdjimg.com\nwdjky.com\nwdkao.com\nwdklchina.com\nwdkmall.com\nwdku.net\nwdkud6.com\nwdldl.com\nwdmagnet.com\nwdmcake.com\nwdmuz.com\nwdmyksm.com\nwdnld.com\nwdomob.com\nwdpharma.com\nwdpower.com\nwdres.com\nwdsdjxh.com\nwdsj2.com\nwdsjz.com\nwdsk.net\nwdstory.com\nwdsz.net\nwdtec.cc\nwdtuishu.com\nwduw.com\nwdw88.com\nwdwd.com\nwdwlb.com\nwdxmzy.com\nwdxtub.com\nwdycenter.com\nwdyiyuan.com\nwdyserver.com\nwdyxgames.com\nwdyy.com\nwdzj.com\nwdzx.com\nwe-ai.work\nwe-pass.com\nwe-vmaxgroup.com\nwe.com\nwe1130.com\nwe123.com\nwe2.name\nwe278.com\nwe2marry.com\nwe378.com\nwe4399.com\nwe4game.com\nwe54.com\nwe556.com\nwe7.cc\nweachat.net\nweadoc.com\nweakyon.com\nwealink.com\nweand.com\nweaoo.com\nweapp.com\nweapp.me\nweareing.store\nwearemanner.com\nweareqy.com\nwearesellers.com\nwearosbox.com\nweartrends.com\nweasing.com\nweatherat.com\nweathercn.com\nweatherdt.com\nweatherol.com\nweavatar.com\nweavi.com\nweaview.com\nweb-rakouetnsei.net\nweb-tinker.com\nweb0518.com\nweb0898.net\nweb100.cc\nweb176.com\nweb1800.com\nweb2008.com\nweb2060.com\nweb20share.com\nweb265.net\nweb3.xin\nweb3389.com\nweb360.pw\nweb3caff.com\nweb3gate.cc\nweb3gate.io\nweb3ling.com\nweb3radio.com\nweb89.net\nweb930.com\nwebacc.net\nwebacg.com\nwebadminsystem66.com\nwebank.com\nwebankapp.com\nwebankcdn.net\nwebanktcftp.net\nwebankwealth.com\nwebankwealthcdn.net\nwebankwld.com\nwebankwyd.com\nwebarcx.com\nwebcamx666.com\nwebdissector.com\nwebdns263.com\nwebetter-ad.com\nwebfalse.com\nwebfont.com\nwebfoss.com\nwebfreecounter.com\nwebfunny.com\nwebfuwu.com\nwebgame138.com\nwebgame163.com\nwebgamehome.com\nwebgetstore.com\nwebgzs.com\nwebhek.com\nwebiolotech.com\nwebjike.com\nwebjx.com\nwebkaka.com\nwebkdcdn.com\nwebkf.net\nwebkv.com\nwebmaster.me\nwebmaster5u.com\nwebmulu.com\nwebnovel.com\nwebok.me\nwebok.net\nwebond.net\nwebpackjs.com\nwebportal.cc\nwebportalapi.com\nwebpower.asia\nwebpowerchina.com\nwebqxs.com\nwebresource.tripcdn.com\nwebrtc.win\nwebsaru.net\nwebsbook.com\nwebsec1.com\nwebsec1.net\nwebsem.cc\nwebseo9.com\nwebshao.com\nwebshu.net\nwebsitecname.com\nwebsjcdn.com\nwebsjy.com\nwebsky.biz\nwebsocket-test.com\nwebsoso.com\nwebsztz.com\nwebterren.com\nwebtrncdn.com\nwebui.fun\nwebullbroker.com\nwebuy.ai\nwebuy.vip\nwebview.tech\nwebworker.tech\nwebxgame.com\nwebxin.com\nwebyang.net\nwebyounger.com\nwebzzcdn.com\nwecanbio.com\nwecare-bio.com\nwecarepet.com\nwecash.net\nwecasting.com\nwecenter.com\nweceshi.com\nwechat.com\nwechat.design\nwechat.org\nwechat77.com\nwechatapp.com\nwechatapp.us\nwechatauthdemo.com\nwechatdevelop.com\nwechatify.net\nwechatlegal.com\nwechatlegal.net\nwechatmessenger.com\nwechatmessenger.us\nwechatpay-global.com\nwechatpay.com\nwechatpay.com.hk\nwechatpay.com.my\nweclassroom.com\nwecloud.io\nwecloudx.com\nwecom.work\nwecomput.com\nwecrm.com\nwecrm.net\nwecycling.com\nwed2008.com\nwed6.com\nwedate.me\nwedcm.com\nweddingeeos.com\nweddingos.com\nwedengta.com\nwedev.cool\nwedeveloper.com\nwedfairy.com\nwedn.net\nwedoany.com\nwedoctor.com\nwedoexpress.com\nwedolook.com\nwedooapp.com\nwedumedical.com\nweebei.com\nweebia.com\nweedo3d.org\nweedong.com\nweeet.com\nweefang.com\nweeiy.com\nweekus.com\nweelv.com\nweeqoo.com\nweeyun.com\nwefans.com\nwefinger.club\nwefitos.com\nweflywifi.com\nwefunol.com\nwegame.com\nwegameapi.com\nwegamedesign.com\nwegamedeveloper.com\nwegamemail.com\nwegameplus.com\nwegamex.com.hk\nwegdj.com\nwegene.com\nwego-healthcare.com\nwegooooo.com\nwehandbio.com\nwehefei.com\nwehelpwin.com\nweherepost.com\nwehichina.com\nwei-ben.com\nwei-li.com\nwei-ze.com\nwei2008.com\nwei6.com\nwei688.com\nweiaixiaoshuo.com\nweianet.com\nweiba66.com\nweibanan.com\nweibang.vip\nweibangong.com\nweibanzhushou.com\nweibo.com\nweibo.tv\nweibocdn.com\nweibochem.com\nweibohelper.com\nweiboi.com\nweibolj.com\nweibomingzi.com\nweibopay.com\nweiboreach.com\nweibosci.com\nweiboums.com\nweibowang.net\nweiboyi.com\nweibozn.com\nweibu.com\nweibusi.net\nweicaifu.com\nweicaixun.com\nweicewang.com\nweichai.com\nweichaipower.com\nweichaishi.com\nweichengchemical.com\nweicher-sz.com\nweichewl.com\nweichuanbo.com\nweichuangtech.com\nweichuming.com\nweico.cc\nweico.com\nweicogif.com\nweicon.cc\nweicot.com\nweicunmall.com\nweida888.com\nweidanbai.com\nweidanci.com\nweidansj.com\nweidaoliu.com\nweidian-inc.com\nweidian.cc\nweidian.com\nweidian.gg\nweidianfans.com\nweidiango.com\nweidianmishu.com\nweidianyuedu.com\nweidibio.com\nweidoufu.com\nweidown.com\nweidulinchang.com\nweiduruanjian.com\nweiengift.com\nweifengchina.com\nweifenghr.com\nweifengke.com\nweifengtang.com\nweifenpay.com\nweiforyou.net\nweifrom.com\nweifujd.com\nweigangdairy.com\nweigangqin.com\nweigaogroup.com\nweigaoholding.com\nweigaoyaoye.com\nweige2006.com\nweige55.com\nweighcb.com\nweighment.com\nweigongju.org\nweiguan.com\nweiguang.cc\nweiguanlaw.com\nweihai.tv\nweihaibsy.com\nweihaicollege.com\nweihaifengji.com\nweihaihaiwang.com\nweihaisheng.com\nweihaobang.com\nweihaoyi.com\nweiheshidai.com\nweihua-newmaterial.com\nweihua2.com\nweihuagroup.com\nweihubao.com\nweihuijob.com\nweihuitel.com\nweihulian.com\nweihuo.site\nweihz.net\nweii.cc\nweiixxin.com\nweijia1999.com\nweijiancloud.com\nweijianmen.com\nweijingzhijia.com\nweijinsuo.com\nweijiu.org\nweijiuxin.com\nweijizongbao.com\nweijj.com\nweijq.com\nweiju.net\nweijuju.com\nweikao.com\nweikaowu.com\nweikasen.com\nweike.fm\nweike21.com\nweikeimg.com\nweikelink.com\nweikengtech.com\nweikenhair.com\nweikeqi-biotech.com\nweikerifu.com\nweikuw.com\nweilai555.com\nweilaicaijing.com\nweilaili.com\nweilairzdb.com\nweilaishidai.com\nweilaitianwang.com\nweilaitianwang.info\nweilaitiku.com\nweilaiyunxiao.com\nweilaizhaiju.com\nweilaizhushou.com\nweilan.com\nweilan27.com\nweilandog.com\nweilanhaian.com\nweilanliuxue.com\nweilanwl.com\nweilayun.com\nweile.com\nweileapp.com\nweilegetu.com\nweilekuiming.com\nweilenicetime.com\nweileryiyt.com\nweiliangsport.com\nweilindct.com\nweiling520.com\nweilingapp.com\nweilinggame.com\nweilinovel.net\nweilitoutiao.net\nweilongshipin.com\nweimaelectric.com\nweimagroup.com\nweimai.com\nweimaitu.com\nweimaqi.net\nweimeigu.net\nweimeiyijing.com\nweimi24.com\nweimiaocaishang.com\nweimibio.com\nweimingchem.com\nweimingcq.com\nweimingedu.com\nweimingkids.com\nweimingxt.com\nweimisystem.com\nweimizhengxing.com\nweimob.com\nweimob.net\nweimobapp.com\nweimobcloud.com\nweimobdc.com\nweimobqa.com\nweimobwmc.com\nweimoka.com\nweinan.cc\nweinisongdu.com\nweinm.com\nweinuo.work\nweiot.net\nweipaitang.com\nweipe.vip\nweiphone.net\nweiphp.com\nweipinchu.com\nweiping.com\nweipu-he.com\nweipu.com\nweipu.live\nweipugroup.com\nweipuhj.com\nweiputek.com\nweiq.com\nweiqi.cc\nweiqiaocy.com\nweiqiaoyun.com\nweiqidaxing.com\nweiqiming.com\nweiqinfang.com\nweiqing120.com\nweiqingbao.cc\nweiqiok.com\nweiqitv.com\nweiquyx.com\nweiren.com\nweirenjob.com\nweiresearch.com\nweiribio.com\nweiruipai.net\nweisanyun.com\nweisay.com\nweishadian.com\nweishaizi.com\nweishan.cc\nweishan2015.com\nweishang99.net\nweishangagent.com\nweishangmh.com\nweishangshijie.com\nweishangtui.vip\nweishengrc.com\nweishi.com\nweishi016.com\nweishi024.com\nweishi100.com\nweishigz.com\nweishipin.com\nweishishuyuan.com\nweisiliang.com\nweismarts.com\nweistang.com\nweisuda.net\nweisurvey.com\nweisurvey.net\nweisuyun.com\nweisuyun.net\nweisyun.com\nweitehui.com\nweitietl.com\nweitiewang.com\nweitoupiao.com\nweituibao.com\nweitunit.com\nweituo.com\nweituobang.net\nweitupian.com\nweitushe.com\nweituya.com\nweiunity.com\nweivd.com\nweiwall.com\nweiwangpu.com\nweiwangvip.com\nweiwanjia.com\nweiweixiao.net\nweiweiyi.com\nweiwenjia.com\nweiwom.com\nweiwss.com\nweiwuhui.com\nweixianmanbu.com\nweixiaoduo.com\nweixiaohan.com\nweixiaoi.com\nweixiaoqu.com\nweixiaotong.com\nweixiaov.club\nweiximusic.com\nweixin-001.com\nweixin.com\nweixin12315.com\nweixinbang.com\nweixinbiaoqing.com\nweixinbridge.com\nweixincall.com\nweixindadang.com\nweixindevelop.com\nweixing.com\nweixingate.com\nweixingmap.com\nweixingon.com\nweixingongzuoshi.com\nweixingshexiangji.net\nweixingv.com\nweixinhost.com\nweixinhow.com\nweixinjia.net\nweixinjiajia.com\nweixinju.com\nweixinkd.com\nweixinmvp.com\nweixinnft.com\nweixinpy.com\nweixinqing.com\nweixinqn.com\nweixinqz.com\nweixinrensheng.com\nweixinsir.com\nweixinsxy.com\nweixinxx.com\nweixinyidu.com\nweixinyunduan.com\nweixistyle.com\nweixiu.name\nweixiu2.com\nweixiuchu.com\nweixiuka.com\nweixjn.com\nweixue100.com\nweixueyuan.net\nweixun.com\nweixun998.com\nweixuncj.com\nweixunyunduan.net\nweiyan.me\nweiyan000.com\nweiyangx.com\nweiyanjiang.com\nweiyapaper.com\nweiye-alu.com\nweiye.me\nweiyes.com\nweiyi.com\nweiyi.link\nweiyiqibj.com\nweiyitec.com\nweiyituku.com\nweiyituliao.com\nweiyiwangluo.com\nweiyoubot.com\nweiyours.com\nweiyouxi.com\nweiyu98.com\nweiyueliang.com\nweiyueread.com\nweiyun.com\nweiyun001.com\nweiyunchong.com\nweiyunfushi.com\nweiyunjian.com\nweiyuntop.com\nweiyunyingxiang.com\nweizhanabc.com\nweizhangjilu.com\nweizhangwang.com\nweizhanle.com\nweizhi.com\nweizhike.club\nweizhipin.com\nweizhishu.com\nweizhivet.com\nweizhoudaoly.com\nweizhuangfu.com\nweizhuanji.com\nweizoom.com\nweizunkj.com\nweja-hospital.com\nwejianzhan.com\nwejias.com\nwejizan.com\nwejizan.ink\nwejoydata.com\nweka.life\nwekbo.com\nweknow.io\nwekuo.com\nwelain.com\nwelansh.com\nwelaw.com\nwelchmat.com\nwelcome-lt.com\nwelcrm.com\nweledpower.com\nwelefen.com\nweleve.com\nwelfull.com\nwelgwiyan.com\nweliads.com\nwelian.com\nwelidaimkt.com\nwelife001.com\nwelife100.com\nwelinkpark.com\nwelk.co\nwell-dns.com\nwell-js.com\nwell-trust.com\nwellaide.com\nwellav.com\nwellcee.com\nwellhope.net\nwelljoint.com\nwelllinkio.com\nwellnj.com\nwellnode.com\nwellongmedical.com\nwellpie.com\nwellplas.com\nwellreach.com\nwells-shipping.com\nwellselectronic.com\nwellsepoxy.com\nwellsoon.com\nwellswam.com\nwelltonhotel.com\nwelltrend-edu.com\nwellwhales.com\nwelove520.com\nwelovead.com\nwelqua.com\nwelzek.com\nwemart.com\nwemdsm.com\nweme.fun\nwemeche.com\nwemediacn.com\nwemomo.com\nwemorefun.com\nwems.net\nwemtime.com\nwemvp.com\nwenai.net\nwenancehua.com\nwenancn.com\nwenandaquan.com\nwenangou.com\nwenanwang.com\nwenanzhe.com\nwenbagu.com\nwenbo.cc\nwenbofund.com\nwenbothinktank.com\nwencaischool.com\nwencan.com\nwenchain.com\nwenda1000.com\nwenda123.com\nwendabaike.com\nwendahu.com\nwendaifu.com\nwendal.net\nwendangdaquan.com\nwendangmao.net\nwendangwang.com\nwendangxiazai.com\nwendax.com\nwendaxiaowu.com\nwendns.com\nwendoc.com\nwendougee.com\nwendu.com\nwenduedu.com\nwendumao.com\nwenfangcn.com\nwenfangjushe.com\nwenfangnet.com\nwenfenggroup.com\nwengbi.com\nwengegroup.com\nwengem.com\nwengkui.com\nwengmeiling.com\nwenguang.com\nwenguangta.com\nwenguangzhineng.com\nwenguo.com\nwenhao123.com\nwenhaofan.com\nwenhetong.com\nwenhua.cc\nwenhuakejiao.com\nwenhualvyou.net\nwenhui.space\nwenidc.com\nwenjian.net\nwenjianbaike.com\nwenjiangbus.com\nwenjiangs.com\nwenjiasu.com\nwenjingnetwork.com\nwenjingzhai.com\nwenjiwu.com\nwenju666.com\nwenjuan.cc\nwenjuan.com\nwenjuan.link\nwenjuan.ltd\nwenjuan.net\nwenjuan.pub\nwenjuanba.com\nwenjuanbang.com\nwenjuanshow.com\nwenjuntech.com\nwenkaoba.com\nwenkeju.com\nwenku.in\nwenku.net\nwenku365.com\nwenku7.com\nwenku8.cc\nwenku8.com\nwenku8.net\nwenkub.com\nwenkudao.com\nwenkudaquan.com\nwenkunet.com\nwenkuvip.com\nwenkuwenku.com\nwenkuxiazai.net\nwenlc.com\nwenli-china.com\nwenlian123.com\nwenliangedu.com\nwenlvnews.com\nwenlvpai.com\nwenmeng.com\nwenmi114.com\nwenmingban.com\nwenneart.com\nwenpie.com\nwenqy.com\nwenroo.com\nwenrouge.com\nwenryxu.com\nwensang.com\nwensb.org\nwenshaktv.com\nwenshannet.com\nwenshen.net\nwenshenba.com\nwenshendaka.com\nwenshenku.com\nwenshenxiu.com\nwenshuba.com\nwenshubang.com\nwenshushu.com\nwensiluo.com\nwensli.com\nwenstech.com\nwensuocaster.com\nwentab.com\nwentihu.com\nwentiquan.net\nwentiyi.com\nwentong.com\nwenweipo.com\nwenwen.com\nwenwo.com\nwenwu8.com\nwenwuchina.com\nwenxiaha.com\nwenxiaobai.com\nwenxiaoyou.com\nwenxiaozhan.com\nwenxiaozhan.net\nwenxin-ge.com\nwenxinapp.com\nwenxingonline.com\nwenxiql.com\nwenxiu.com\nwenxuan.news\nwenxue100.com\nwenxue360.com\nwenxueapp.com\nwenxuedu.com\nwenxuem.com\nwenxuemi6.com\nwenxuemm.com\nwenxuesk.com\nwenxuesk.info\nwenxuesk.net\nwenxuesk.org\nwenxuetiandi.com\nwenyaguan.com\nwenyaqi.net\nwenyi188.com\nwenyijcc.com\nwenyoutai.com\nwenyouyun.com\nwenytao.com\nwenyu6.com\nwenyuanenviron.com\nwenyucdn.com\nwenyupages.com\nwenzaizhibo.com\nwenzhangba.com\nwenzhanghui.com\nwenzheng.club\nwenzhihuai.com\nwenzhouchayuan.com\nwenzhoushuke.com\nwenzhousx.com\nwenziyuan.com\nweoathome.com\nwepiao.com\nwepie.com\nwepieoa.com\nweplayapp.com\nweplaybubble.com\nweplayer.cc\nweplaymore.com\nweplus.com\nweproedu.com\nweq.me\nweqoocu.com\nwerewolf.online\nwerfactory.com\nwerings.store\nwerkai.com\nwerlchem.com\nwesane.com\nwescrm.com\nwesdom.me\nweshaketv.com\nweshape3d.com\nweshine.im\nweshineapp.com\nwesiedu.com\nwesimiot.com\nwesing-game.com\nwesingapp.com\nwest-motion.com\nwest.xyz\nwest263.com\nwest95582.com\nwest999.com\nwestanpharma.com\nwestaport.com\nwestarcloud.com\nwestbund.art\nwestbund.com\nwestchinago.com\nwestcits.com\nweste.net\nwestendwell.ca\nwestfutu.com\nwestinfosoft.com\nwestingz.com\nwestlake-vacuum.com\nwestlakedata.com\nwestlakegenetech.com\nwestlakeinst.com\nwestlakeomics.com\nwestleadfund.com\nwestmining.com\nwestmininggroup.com\nwestmonth.com\nwestonecloud.com\nwestpac.group\nwestsecu.com\nwestsh.com\nwestsummitcap.com\nwesure100.com\nwetab.link\nwetest.host\nwetest.net\nwetest.org\nwetestlab.net\nwetherm.com\nweti.me\nweton.net\nwetools.com\nwetools.pro\nwetrial.com\nwetruetech.com\nwetry.shop\nwetuc.com\nwetv.vip\nwetvinfo.com\nweui.io\nweuschool.com\nwevul.com\nwewillpro.com\nwewinpe.com\nwework-pro.com\nwework-studio.com\nweworkcloudesk.com\nwewuhu.com\nwex5.com\nwex7.com\nwexcdn.com\nwexiaocheng.com\nwexin.com\nwey.com\nweyee.com\nweyesimg.com\nweyhd.com\nweyic.com\nweyo.me\nwezeit.com\nwezhan.hk\nwezhan.net\nwezhan.us\nwezhibo.net\nwezhibo.tv\nwezhicms.com\nwezhuiyi.com\nwezonet.com\nwf.pub\nwf121.com\nwf163.com\nwf66.com\nwfaozhuo.com\nwfbbs.com\nwfc805.com\nwfcgs.com\nwfdaily.com\nwfdata.club\nwfdj.net\nwfdqzx.com\nwfdsjls.com\nwfdyes.com\nwfeil.com\nwfek.com\nwff168.com\nwffc120.com\nwffms.com\nwfhbjg.com\nwfhlxy.com\nwfiltericf.com\nwfilterngf.com\nwfits.com\nwfjec.com\nwfjgzs.com\nwfjienuo.com\nwfjimg.com\nwfjsd.com\nwfjtjy.com\nwfkji.com\nwflgjx.com\nwflps.com\nwflushebei.com\nwfmzjscl.com\nwfrcsc.com\nwfsanshan.com\nwfshiliyy.com\nwfswjt.com\nwfsydzxyy.com\nwfsyzx.net\nwftdrh.com\nwftihvn.xyz\nwftvqcm.com\nwfuyu.com\nwfwzg.xyz\nwfy.pub\nwfzbjx.com\nwfzczdh.com\nwfzqhb.com\nwfzssz.com\nwg-views.com\nwg999.com\nwgc2025.com\nwgce.space\nwghai.net\nwghaos.com\nwghostk.com\nwghpdi.com\nwgimg.com\nwgl-group.com\nwglh.com\nwglm.net\nwgm66.com\nwgmf.com\nwgmotor.com\nwgnds.com\nwgoic.com\nwgos.com\nwgppt.com\nwgpsec.org\nwgtechjx.com\nwgxdxx.com\nwgxy.com\nwgxy.net\nwgy.cc\nwh-anhua.com\nwh-aojie.com\nwh-badges.com\nwh-baidu.com\nwh-bus.com\nwh-charity.com\nwh-china.com\nwh-dongjiang.com\nwh-haipu.com\nwh-hsun.com\nwh-motorshow.com\nwh-mx.com\nwh-swhj.com\nwh-yuanhang.com\nwh10000.com\nwh100idc.com\nwh111.com\nwh119.com\nwh12345szzx.com\nwh50.com\nwh5yy.com\nwh6yy.com\nwh6z.com\nwh702g.ren\nwhabl.net\nwhaee.com\nwhafxh.org\nwhagcg.com\nwhairport.com\nwhale-king.com\nwhale-plus.com\nwhale123.com\nwhalecloud.com\nwhalefall.space\nwhaleskts.com\nwhalet.com\nwhaleunique.com\nwhalipaycs.com\nwhampoa-design.com\nwhatbuytoday.com\nwhatchina.com\nwhatfugui.com\nwhatsns.com\nwhatswebyuo.com\nwhattheybuy.com\nwhaudio.com\nwhbahyxh.com\nwhbaishitong.com\nwhbbs.com\nwhbc2000.com\nwhbcrs.com\nwhbear.com\nwhbec.com\nwhbester.com\nwhbgdt.com\nwhbgy.net\nwhbhst.com\nwhbj88.com\nwhbjdn.com\nwhbts.com\nwhbuilding.com\nwhbwj.com\nwhbws.com\nwhbx.org\nwhcaijing.net\nwhcat.net\nwhcbank.com\nwhcbd.net\nwhcbs.com\nwhccb.com\nwhcch802.com\nwhcdc.org\nwhcdwater.com\nwhcfjsjt.com\nwhcfjt.com\nwhcfs.org\nwhcgtx.com\nwhchem.com\nwhchip.com\nwhcibe.com\nwhcjfc.com\nwhcjfq.com\nwhcjkq.com\nwhcotton.com\nwhcqedu.com\nwhcsfzjt.com\nwhcst.com\nwhcsyc.com\nwhctcii.com\nwhctfcjt.com\nwhctjg.com\nwhctv.com\nwhcx.group\nwhcx365.com\nwhcyit.com\nwhdayy.com\nwhdckj.com\nwhdhgd.com\nwhdjxx.com\nwhdlfu.com\nwhdlkj.com\nwhdonde.com\nwhdqhj.com\nwhdrawing.com\nwhdsck.com\nwhdsyy.com\nwhdxhzx.com\nwhec-tencentclb.cloud\nwhec-tencentclb.com\nwhec-tencentclb.net\nwhec-tencentclb.work\nwhecb.com\nwhecloud.com\nwhecn.com\nwhedu.net\nwhee.com\nwhenchat.net\nwhenever-online.com\nwherexpress.com\nwherxian.com\nwhetc.com\nwhevt.com\nwhewash.com\nwhfamous.com\nwhfanyi.com\nwhfazun.com\nwhfeiyou.com\nwhfengli.com\nwhfilter.com\nwhfles.com\nwhfmg.org\nwhfph.com\nwhgas.com\nwhgayy.com\nwhgdgjt.com\nwhggjk.com\nwhggjtjs.com\nwhggvc.net\nwhggzc.com\nwhgh.org\nwhghjt.com\nwhgjzt.com\nwhgk.com\nwhglkf.com\nwhgmbwg.com\nwhgnjt.com\nwhgnyy.com\nwhgtgh.com\nwhguangguyun.com\nwhguanshan.com\nwhguo.com\nwhgwbn.net\nwhgyt.com\nwhhaifang.com\nwhhaiyue.com\nwhhdcz.com\nwhhdgk.com\nwhhdjzzl.com\nwhhdky.com\nwhhdmt.com\nwhhengchang.com\nwhhexin.com\nwhhhealth.com\nwhhhxy.com\nwhhjjt.com\nwhhjpharm.com\nwhhkbyg.com\nwhhkgjt.com\nwhhksj.com\nwhhmgroup.com\nwhhmmbl.com\nwhhouse.com\nwhhpaccp.com\nwhhr.com\nwhhryd.com\nwhhsg.com\nwhhtjg.com\nwhhtjt.com\nwhhtyl.com\nwhhuatian.com\nwhhuayou.com\nwhhxi.com\nwhhxnz.com\nwhhxyk.com\nwhhykg.com\nwhhysound.com\nwhhyyy.com\nwhhzhn.com\nwhhztcm.com\nwhhzyj.com\nwhib.com\nwhicec.com\nwhichmba.net\nwhicu.com\nwhidc.com\nwhidf.com\nwhidy.net\nwhiee.com\nwhiie-expo.com\nwhimsywarpgame.cc\nwhinfo.net\nwhir.net\nwhisperto.net\nwhite-collar.net\nwhite-dolphin.com\nwhitebox.im\nwhitecat.com\nwhitecdnx.com\nwhitegem.net\nwhitemedia-china.com\nwhiteswanhotels.com\nwhizen.com\nwhjaco.com\nwhjbh.com\nwhjclgs.com\nwhjdsjfkdfd.cfd\nwhjf.com\nwhjh120.com\nwhjhb.org\nwhjiahai.com\nwhjiaoy.com\nwhjinlong.com\nwhjjhbj.com\nwhjkcj.com\nwhjkct.com\nwhjksyxx.com\nwhjldj.com\nwhjm.com\nwhjrjjt.com\nwhjrjt.com\nwhjrjy.com\nwhjst.com\nwhjsxx.com\nwhjtjt.com\nwhjuren.com\nwhjxbaby.com\nwhjy.net\nwhjylh.com\nwhjyx.com\nwhjyxh.com\nwhjyxx.com\nwhjzxh.com\nwhjzxx.com\nwhjzy.net\nwhjzyxh.org\nwhk.hk\nwhkakaxi.com\nwhkc.com\nwhkcy.com\nwhkingdom.com\nwhkjdxyy.com\nwhkjz.com\nwhkqd.com\nwhkxzl.com\nwhkykj.com\nwhlabor.com\nwhland.com\nwhlangxing.com\nwhleishen.com\nwhlexue.com\nwhlgchache.com\nwhlib.com\nwhlido.com\nwhljyl.com\nwhlkwy.com\nwhlovehome.com\nwhlpa.com\nwhlrhd.com\nwhlynk.com\nwhmama.com\nwhmc2005.com\nwhmdedu.com\nwhmeigao.com\nwhmf8.com\nwhminwei.com\nwhmj.org\nwhmlcy.net\nwhmnls.com\nwhmnrc.com\nwhmnx.com\nwhmoocs.com\nwhmvc.net\nwhmxrj.com\nwhmylike.cc\nwhmylikekq.com\nwhmzkf.com\nwhnewcando.com\nwhnfc.com\nwhnyd.com\nwho.cx\nwho2o.com\nwhoami.akamai.net\nwhoiscx.com\nwhoisreminder.net\nwhoisspy.ai\nwholefreshposts.com\nwhongtec.com\nwhoolala.com\nwhooyan.com\nwhoregamer.com\nwhovii.com\nwhpantosoft.com\nwhpanva.com\nwhpcschool.com\nwhphbc.com\nwhplmd.com\nwhpma.org\nwhptc.org\nwhpx.net\nwhqcbj.com\nwhqcpx.com\nwhqcst.com\nwhqianxing.com\nwhqjjt.com\nwhqtdjy.com\nwhqtgqbwg.com\nwhqunyu.com\nwhqyw.com\nwhrango.com\nwhrayy.com\nwhrazf.com\nwhrcbank.com\nwhrenai.com\nwhres.net\nwhrhkj.com\nwhrj.com\nwhrl.net\nwhrsip.com\nwhrszx.com\nwhrtmpay.com\nwhrtyycg.com\nwhsctgs.com\nwhsdhyy.com\nwhsdsyy.com\nwhsgj.com\nwhsgyy.com\nwhsir.com\nwhsjfs.com\nwhsjytyy.com\nwhskq.com\nwhsladz.com\nwhsladz.net\nwhsmzc.com\nwhsql.org\nwhsrc.com\nwhsthjtzjt.com\nwhsundata.com\nwhsw.net\nwhswcyy.com\nwhswx.com\nwhsxsy88.com\nwhsy.org\nwhsyy.net\nwhszniao.com\nwhtaxi.com\nwhtbglass.com\nwhtbgroup.com\nwhtbq.com\nwhtcm.com\nwhtcsz.com\nwhtdcb.com\nwhtdlx.com\nwhtdsc.com\nwhtfzy.com\nwhthgy.com\nwhtime.net\nwhtmhh.com\nwhtongyun.com\nwhtonhe.com\nwhtpgbyy.com\nwhtpi.com\nwhtpyy.com\nwhtpyzx.com\nwhtran.com\nwhtryg.com\nwhtryine.com\nwhtsapp-part.team\nwhtto.com\nwhttsy.com\nwhtuff.com\nwhtxcloud.com\nwhtzb.org\nwhu-cveo.com\nwhu.pt\nwhualong.com\nwhucopm.com\nwhudfr.com\nwhudows.com\nwhuh.com\nwhuhzzs.com\nwhulabs.com\nwhulc.com\nwhunitedvet.com\nwhuss.com\nwhut-px.com\nwhutech.com\nwhuznhmedj.com\nwhvkk.com\nwhvms.com\nwhwanshun.com\nwhwat.com\nwhwater.com\nwhwd.com\nwhwdky.com\nwhweb.net\nwhwebsite.com\nwhweiying.com\nwhweo.com\nwhwgcm.com\nwhwindplus.com\nwhwjnwn522.vip\nwhwkzc.com\nwhwm.net\nwhwm.org\nwhwomensmarathon.com\nwhwtqx.com\nwhwuyan.com\nwhwx2018.com\nwhwxxy.com\nwhwz.com\nwhx0621.com\nwhxcepc.com\nwhxcy.com\nwhxh.com\nwhxhdn.com\nwhxrjt.com\nwhxsdn.com\nwhxunw.com\nwhxwxzxc.com\nwhxy.net\nwhxysz.net\nwhybh2015.com\nwhycan.com\nwhycw.com\nwhyec.com\nwhyenjoy.com\nwhyesi.fun\nwhyestar.com\nwhyicheng.com\nwhyimingkeji.com\nwhyinzhimei.com\nwhyiqitong.com\nwhyky.com\nwhyongwei.com\nwhyrtc.com\nwhys558.com\nwhysb.org\nwhysdomain.com\nwhyshop.com\nwhysodiao.com\nwhysw.org\nwhysx.com\nwhysxc2c.com\nwhyun.com\nwhyuntai.com\nwhyunzhou.fun\nwhyushang.com\nwhyyhy.com\nwhyyjt.com\nwhyyy.com\nwhyzrcb.com\nwhzb.com\nwhzbdw.com\nwhzc2008.com\nwhzdyy.com\nwhzglc.com\nwhzh-cw.com\nwhzhanyi.com\nwhzhaopin.net\nwhzhjty.com\nwhzhongzhi.com\nwhzhtd.com\nwhzhzxmr.com\nwhzjyy.com\nwhzjzxy.com\nwhzkb.com\nwhzph.com\nwhzsrc.com\nwhzszy.com\nwhzwzk.com\nwhzwzs.com\nwhzxht.com\nwhzxzls.com\nwhzydz.com\nwhzys.com\nwhzzhb.com\nwibaidu.com\nwicep.com\nwicp.net\nwicp.vip\nwicresoft.com\nwidgetable.net\nwiduu.com\nwietone.com\nwifenxiao.com\nwifi.com\nwifi188.com\nwifi33.com\nwifi6667.com\nwifi8.com\nwifiapi.net\nwifibanlv.com\nwifichain.com\nwificstia.com\nwifidog.pro\nwifidown.com\nwifigx.com\nwifihell.com\nwifijy.com\nwifilu.com\nwifimsl.com\nwifinew.com\nwifinews.com\nwifiniu.com\nwifire.net\nwifisdk.net\nwifishenqi.com\nwifivpn.net\nwifiwx.com\nwifizj.com\nwifussion.com\nwigenbio.com\nwiicha.com\nwiihey.com\nwiihg.com\nwiinkle.com\nwiiteer.com\nwiitrans.com\nwiiun.com\nwiiyi.com\nwikicaring.com\nwikiexpo.com\nwikiimgs.com\nwikimbti.com\nwikipediaxx.icu\nwildcardx.net\nwilddog.com\nwilddream.net\nwildfire.work\nwildfirechat.net\nwildgun.net\nwildhorde.com\nwildto.com\nwildwind.com\nwildwindpharm.com\nwilhb.com\nwillapps.com\nwillcdn.com\nwilliameva.com\nwilliamslullaby.com\nwillingchem.com\nwillingchina.com\nwillnanobio.com\nwillsemi.com\nwillsfitness.net\nwillwin91.com\nwiloon.com\nwimetro.com\nwimiar.com\nwin-haoxiang-win.com\nwin-ke.com\nwin-man.com\nwin007.com\nwin1032.com\nwin1064.com\nwin10cjb.com\nwin10com.com\nwin10d.com\nwin10gw.com\nwin10h.com\nwin10net.com\nwin10set.com\nwin10w.net\nwin10win.com\nwin10world.com\nwin10ww.com\nwin10xitong.com\nwin10zyb.com\nwin3000.com\nwin310.com\nwin4000.com\nwin71234.com\nwin7china.com\nwin7en.com\nwin7qijian.com\nwin7qjb.com\nwin7xzb.com\nwin8.net\nwin866.com\nwin8china.com\nwin8e.com\nwin8xiazai.com\nwinallseed.com\nwinasdaq.com\nwinature.com\nwinbaicai.com\nwinbaoxian.com\nwinbjb.com\nwinbond-ic.com\nwinbons.com\nwinbywin.com\nwincellchina.com\nwincheers.com\nwincheers.net\nwincologistics.com\nwincome.group\nwincomn.com\nwincoprint.net\nwind.ink\nwind.moe\nwindaka.com\nwindbg.download.prss.microsoft.com\nwindcoder.com\nwindesign.cc\nwindeyenergy.com\nwindfone.com\nwindfonts.com\nwindin.com\nwindmsn.com\nwindoor168.com\nwindows10.pro\nwindows10zj.com\nwindows11.pro\nwindows7en.com\nwindowstool.net\nwindowszj.com\nwindpayer.com\nwinds.red\nwindsbridge.com\nwindsns.com\nwindspeedbike.com\nwindtch.com\nwindtourgame.com\nwine-world.com\nwine9.com\nwinebar-pur.com\nwinegame.net\nwinekee.com\nwinemagz.com\nwinenice.com\nwines-info.com\nwinesinfo.com\nwinesou.com\nwineworld.vip\nwinex-hk.com\nwinex-sh.com\nwinfang.com\nwinfreeinfo.com\nwing-cafe.com\nwing-id.com\nwing-max.com\nwingconn.com\nwinglinetrans.com\nwinglungbank.com\nwingmob.com\nwingon-travel.com\nwingtecher.com\nwinheadhunter.com\nwinhealth.hk\nwinhealthgroups.com\nwinhlb.com\nwinhong.com\nwinicssec.com\nwinjoinit.com\nwinkingworks.com\nwinkkie.com\nwinksi.com\nwinlongtech.com\nwinmoes.com\nwinndoo.com\nwinner-hitech.com\nwinner-rbt.com\nwinner9.com\nwinnerholding.com\nwinnermicro.com\nwinnerracing.com\nwinnerway.com\nwinnet.cc\nwinningdq.com\nwinos.me\nwinotes.net\nwinotmk.com\nwinowe.com\nwinpe.cc\nwinpex-cn.com\nwinpexgroup.com\nwinrim.com\nwinrobot360.com\nwinsalesaas.com\nwinsenseos.com\nwinshang.com\nwinshangdata.com\nwinsing.net\nwinspay.com\nwinstandard.com\nwinstoncc.com\nwinsui.com\nwinsun3d.com\nwinsurface.com\nwintalent.com\nwintaosaas.com\nwinteam500.com\nwintech-nano.com\nwintechchina.com\nwintimechina.com\nwinto100.com\nwintodoor.com\nwintom.net\nwintooo.com\nwintopedu.com\nwintrueholding.com\nwintxt.com\nwinvk.com\nwinvod.com\nwinvvv.com\nwinwebmail.com\nwinwin-co.com\nwinwin-hotel.com\nwinwin7.com\nwinwinchemical.com\nwinxiang.com\nwinxp8.com\nwinxuan.com\nwinxuancdn.com\nwinyoungreading.com\nwinziss.com\nwinzonelaw.com\nwio2o.com\nwiot.host\nwipanda.com\nwipcc.org\nwireless-driver.com\nwireless-tag.com\nwirelesschina-summit.com\nwiremesh001.com\nwiremeshforfilter.com\nwirlesshare.com\nwis-park.com\nwisbiom.com\nwisburg.com\nwiscargo.com\nwischina.org\nwisder.net\nwisdoing.com\nwisdom-braun.com\nwisdomcmmi.com\nwisdomep.com\nwisdompharma.com\nwisdomwz.com\nwisdontech.com\nwisdri.com\nwise-iot.com\nwise99.com\nwiseah.com\nwiseasy.com\nwisebond.net\nwisecity.net\nwisecotech.com\nwisedoo.com\nwisedsp.net\nwisedu.com\nwiseetec.com\nwisefx.com\nwisegotech.com\nwiseimp.com\nwisekingsurgical.com\nwiselong.cc\nwiselong.com\nwisenjoy.com\nwisentbioproductschina.com\nwiseqx.com\nwiseuc.com\nwisevector.com\nwisewatercloud.com\nwish-hightech.com\nwish3d.com\nwishcad.com\nwishdown.com\nwishisp.com\nwishtec.com\nwisiyilink.com\nwison-engineering.com\nwison.com\nwispower.com\nwisrc.com\nwistapharma.com\nwistone.com\nwiswonder.com\nwit-parking.com\nwit0.com\nwitcp.com\nwitersen.com\nwith366.com\nwithcdn.com\nwithmedia.net\nwithoutpain.net\nwithpinbox.com\nwithqiuliang.com\nwithwheat.com\nwithwinds.com\nwithzz.com\nwitintech.com\nwitkeyschool.com\nwitmart.net\nwitnew.net\nwitontek.com\nwitrn.com\nwitspring.com\nwittf.ink\nwityx.com\nwiwide.com\nwiwide.net\nwixdigital.com\nwiyun.com\nwiz03.com\nwizitek.com\nwizsci.com\nwj-chem.com\nwj-hospital.com\nwj-hr.com\nwj-lean.com\nwj-park.com\nwj001.com\nwj0556.com\nwj166.com\nwjacloud.com\nwjajw.com\nwjasset.com\nwjbfwzx.com\nwjccx.com\nwjcd.net\nwjceo.com\nwjcjt.com\nwjctg.com\nwjdaily.com\nwjdhcms.com\nwjdiy.com\nwjdiy.net\nwjedu.net\nwjeryuan.com\nwjfcw.com\nwjfilm.com\nwjgdyy.com\nwjgglm.com\nwjgslb.com\nwjhh666.com\nwjhotelgroup.com\nwjhouses.com\nwjhr.net\nwjhtxx.com\nwjiaxing.com\nwjin.cc\nwjinmiao.com\nwjjfjt.com\nwjjyxxw.com\nwjkjxcx.com\nwjlxmedia.com\nwjmh8.com\nwjnin.cc\nwjqcw.com\nwjqwy.com\nwjqyw.com\nwjrcb.com\nwjs.com\nwjshw.com\nwjsldy.com\nwjsms.net\nwjsw.com\nwjtr.com\nwjttl.com\nwjtzyg.com\nwjvusw.shop\nwjwuqiang.com\nwjx.com\nwjxcdn.com\nwjy01.com\nwjyanghu.com\nwjyh.com\nwjyt-china.org\nwjyw.com\nwjzp.cc\nwjzpgz.com\nwk2.com\nwk515.com\nwk78.com\nwka8.com\nwkai.cc\nwkandian.com\nwkanx.com\nwkbins.com\nwkbrowser.com\nwkcw.net\nwkddkyy.com\nwkdimg.com\nwkdty.com\nwkepu.com\nwkhub.com\nwkimg.com\nwkjhd.com\nwkkshu.com\nwklken.me\nwkmic.com\nwknky1296.com\nwkopen.com\nwkread.com\nwksc.com\nwkshipark.com\nwktfkj.com\nwktline.com\nwkwl9.com\nwkxxw.com\nwkyx520.com\nwkzf.com\nwkzk.com\nwkzstencent.com\nwkzuche.com\nwkzw.me\nwl369.com\nwl890.com\nwlaforum.com\nwlai.vip\nwlaiy.com\nwlanadmin.com\nwlanbanlv.com\nwlcbnews.com\nwlcbw.com\nwlcxx.com\nwldbs.com\nwldlr.com\nwldmarket.com\nwlds.net\nwldsb.com\nwldservice.com\nwlerp.com\nwlfce.com\nwlfimms.com\nwlgkk.com\nwlgooo.com\nwlgou.com\nwlhcc.com\nwlhyjx.com\nwlhyxh.com\nwlinfor.com\nwljhealth.com\nwljyyjy.com\nwlkgo.com\nwlkst.com\nwlku.com\nwll-xyz.com\nwllxcl.com\nwllxx.com\nwllxy.net\nwlmf.vip\nwlmq.com\nwlmqedu.com\nwlmqhytd.com\nwlmqrc.com\nwlmqrsks.com\nwlmqwb.com\nwlmqxht.com\nwlnh.net\nwlnkaep.xyz\nwlnmp.com\nwlnnosu.xyz\nwlol.com\nwlphp.com\nwlplove.com\nwlpmmm.store\nwlqtpolytheatre.com\nwlrcw.com\nwlsgjslgy.com\nwlski.com\nwlstock.com\nwlsx.net\nwltieyaoban.com\nwltong.com\nwluotx.com\nwlw-jcdlcxzx.com\nwlwj.com\nwlwltech.com\nwlwx.com\nwlwx.la\nwlwx.org\nwlxit.com\nwlxmall.com\nwlxtbj.com\nwlxww.com\nwlyfw.com\nwlyjbl.com\nwlyongli.com\nwlysjt.com\nwlyyjt.com\nwlzni.com\nwlzp.com\nwlzp.vip\nwlzz666.com\nwm-dream.vip\nwm-imotor.com\nwm-motor.com\nwm090.com\nwm18.com\nwm23.com\nwmathor.com\nwmb2b.com\nwmbluegame.com\nwmc-bj.net\nwmc-gba.net\nwmc95588.com\nwmcloud.com\nwmcn.com\nwmdang.com\nwmfanyi.com\nwmhcn.net\nwmiao.com\nwmidgroup.com\nwmimg.com\nwming.com\nwmintl.com\nwmiyx.com\nwmjk.net\nwmjrc.com\nwmjt.net\nwmjygg.net\nwmjyqd.net\nwmjyszba.com\nwmksj.com\nwmlip.com\nwmnetwork.cc\nwmok.com\nwmp169.com\nwmphp.com\nwmpic.me\nwmproxy.net\nwmpvp.com\nwmpyol.com\nwmqt.net\nwmqzyyy.com\nwms100.com\nwmsjsteam.com\nwmsjyun.com\nwmslz.com\nwmsub.com\nwmupd.com\nwmvideo.com\nwmviv.com\nwmwm.com\nwmxba.com\nwmxcjj.com\nwmxke.com\nwmxpro.com\nwmxue.com\nwmxxgy.com\nwmxxgz.com\nwmxxwh.com\nwmxxxj.com\nwmy-ad.com\nwmyqdmm.com\nwmzhe.com\nwmzkt.com\nwmzp.cc\nwmzyw.com\nwn1998.com\nwn51.com\nwn789.com\nwnark.com\nwnbsq.com\nwnchengtou.com\nwncpp.net\nwndj.net\nwndoor.com\nwndroid.com\nwnevia.com\nwnform.com\nwnhuifu.com\nwniec.com\nwniecm.com\nwnjdtz.com\nwnkbyon.com\nwnkj88.com\nwnlbs.com\nwnllx.com\nwnlpromain.com\nwnlproyunying.com\nwnlprozhanxing.com\nwnlprozijia.com\nwnluo.com\nwnlwedu.com\nwnnyjx.com\nwnote.com\nwnp.com\nwnplayer.net\nwnqapp.com\nwnqianbao.com\nwnrb.net\nwnrcw.com\nwns8181.com\nwns888.com\nwns8888.com\nwns99938.com\nwnshouhu.com\nwnspic.com\nwnspicbk.com\nwnsqzone.com\nwnsqzonebk.com\nwnssedu.com\nwnszxyy.com\nwntool.com\nwntzjt.com\nwnuos.com\nwnwb.com\nwnxfs.com\nwnylyx.com\nwnzc.com\nwnzctc.com\nwnzhbb.com\nwnzy.net\nwo-smart.com\nwo-voyage.com\nwo.cc\nwo116114.com\nwo186.tv\nwo1wan.com\nwo685.com\nwo87.com\nwoa.com\nwoaap.com\nwoai310.com\nwoaidu.org\nwoaihaoyouxi.com\nwoaihuahua.com\nwoaihuoshan.com\nwoaipu.com\nwoaiseo.net\nwoaishouban.com\nwoaivps.com\nwoaixiao.com\nwoaiyt.com\nwoaizhitu.com\nwoaizr.com\nwoaizuji.com\nwoaoo.net\nwoaoocdn.com\nwobaif.com\nwobangzhao.com\nwobeili.com\nwobocn.com\nwobu2.com\nwoc.space\nwoc88.com\nwocaoseo.net\nwochacha.com\nwochaw.com\nwoda.com\nwodasi.com\nwodavip.com\nwode.bid\nwode.im\nwodeabc.com\nwodecaipu.com\nwodecrowd.com\nwodecun.com\nwodedagong.com\nwodeev.com\nwodegongzi.com\nwodescw.com\nwodeshebao.com\nwodeshucheng.com\nwodeweiquan.com\nwodeyt.com\nwodidashi.com\nwodingche.com\nwodjob.com\nwodocx.com\nwodown.com\nwodu518.com\nwodunyun.com\nwoeoo.com\nwofan.net\nwofang.com\nwofangwang.com\nwofficebox.com\nwofjhs.com\nwofuwater.com\nwogame.net\nwogaosuni.com\nwogg.net\nwogoo.com\nwohenizaiyiqi.com\nwoheschool.com\nwohst8.com\nwohuishou.club\nwoi3d.com\nwoiauto.com\nwoiles.com\nwoiwrj.com\nwoiyu.com\nwojiacloud.com\nwojiaoni.com\nwojiuhuanle.com\nwok.com\nwokaola.com\nwokeji.com\nwokende.com\nwokew.com\nwoko.cc\nwol.tv\nwolai.com\nwolaidai.com\nwolansw.com\nwolegou.net\nwolei-tech.com\nwolezhibo.com\nwolf.cc\nwolfbolin.com\nwolfcstech.com\nwolfgo.com\nwolfguandan-01.com\nwolfguandan-02.com\nwolfguandan-03.com\nwolfguandan-04.com\nwolfguandan-05.com\nwolfogre.com\nwolianw.com\nwolidou.com\nwolife.com\nwolighting.com\nwoliuda.com\nwologic.net\nwolong-beng.com\nwolong.com\nwolonge.com\nwolongge.com\nwolongmedia.com\nwolongyin.com\nwolongyoule.com\nwolunliuliangji.org\nwolwo.ltd\nwolwobiotech.com\nwom186.com\nwomai.com\nwomaiapp.com\nwomailink.com\nwoman91.com\nwomanforces.com\nwomanfriend.com\nwomei.org\nwomeifilm.com\nwomeimenye.com\nwomen-heart.com\nwomenjie.com\nwomenofchina.com\nwonadea.com\nwonder-link.net\nwonder.wiki\nwondercv.com\nwonderful-pr.com\nwonderfulnonwoven.com\nwonderfulsz.com\nwonderjk.com\nwonderkun.cc\nwonderscloud.com\nwondersgroup.com\nwondershare.cc\nwondershare.com\nwondershare.com.br\nwondershare.jp\nwondershare.net\nwondersmemory.com\nwonderstar027.com\nwonderyouxi.com\nwondko.com\nwonengxing588.com\nwonflavour.com\nwonfulplaza.com\nwongcw.com\nwongpeace.com\nwoniu.com\nwoniu8.com\nwoniubaoxian.com\nwoniucloud.com\nwoniuge.com\nwoniugm.com\nwoniuhuoche.com\nwoniupai.net\nwoniutrip.com\nwonjarobot.com\nwonmay.com\nwonmay.net\nwonnder.com\nwononme.com\nwonote.com\nwonpearl.com\nwonplug.net\nwoo.im\nwood-china.com\nwood168.net\nwood888.net\nwoodbridgebath.com\nwoodbunny.com\nwoodchina.com\nwoodnn.com\nwoodsbrosrental.com\nwoodu.me\nwoofee-laser.com\nwooffice.net\nwooide.com\nwoola.net\nwooltex.org\nwooolab.com\nwooomooo.com\nwooqx.com\nwoordee.com\nwoosiyuan.com\nwoosmart.com\nwoowtcprc.com\nwooxhome.com\nwooyun.org\nwoozooo.com\nwopaiyi.com\nwopaw.com\nwopop.com\nwopti.net\nwopus.org\nwoqifoundation.com\nwoqu.com\nwoquyun.com\nword666.com\nwordfc.com\nwordlm.com\nwordplay.work\nwordpress.la\nwordscan.net\nwordscheck.com\nwordstorming.com\nwordsunny.com\nworkbenchapi.com\nworkchat.com\nworkec.com\nworkehr.com\nworkerman.net\nworkhelpmanila.com\nworkpcb.com\nworksoho.com\nworktile.com\nworktilemail.com\nworkyun.com\nworld-machining.com\nworld-pet.org\nworld3dmodel.com\nworld68.com\nworldbangmai.com\nworldbearingshub.com\nworldbuy.cc\nworldcps.com\nworldfcdn.com\nworldgoodvoices.com\nworldh5.com\nworldhello.net\nworldhotel.com\nworldhub.market\nworldinout.com\nworldjiasu.com\nworldmr.net\nworldnyjx.com\nworldpathclinic.com\nworldpowerliftingchina.com\nworldrobotconference.com\nworlds-slotsimulator.com\nworldsteel.net\nworlduc.com\nworldwarner.com\nworldwayhk.com\nworldwu.com\nwort.cloud\nworthgarden.com\nworthtech.net\nworuide.net\nworxperience.com\nwosai-inc.com\nwosaimg.com\nwosenmedia.com\nwoshanit.com\nwoshao.com\nwoshenghotel.com\nwoshi100.com\nwoshipm.com\nwoshipt.com\nwoshiqian.com\nwosign.com\nwosigndoc.com\nwoskj2.com\nwotangka.com\nwotaoka.com\nwotingpingshu.com\nwotokol.com\nwotransfer.com\nwotrus.com\nwotrust.com\nwotta.net\nwotuan.com\nwotucdn.com\nwotula.com\nwouju.com\nwouu.net\nwow.fun\nwowamazingthings.com\nwowbbs.com\nwowcat.net\nwowchina.com\nwowenda.com\nwowenwen.com\nwowgf.com\nwowo6.com\nwowogroup.com\nwowoit.com\nwowomaifang.com\nwowoohr.com\nwowops.com\nwowoqq.com\nwowoshijie.com\nwowotech.net\nwowotuan.com\nwowoyoo.com\nwowoyou.com\nwowoyou.net\nwowozhe.com\nwowqu.cc\nwowtb.com\nwowtran.com\nwowzx.net\nwoxian.com\nwoxiaoyun.com\nwoxihuan.com\nwoxiu.com\nwoxuexue.com\nwoxuyuan.com\nwoyao998.com\nwoyaobaoliang.com\nwoyaodayin.com\nwoyaogexing.com\nwoyaojiaju.com\nwoyaoqiudai.com\nwoyaosai.com\nwoying.com\nwoyo.com\nwoyonghj.com\nwoyoo.com\nwoyouche.com\nwoyouzhuce.com\nwozaixiaoyuan.com\nwozhangwan.com\nwozhishang.com\nwozhongla.com\nwozhuan.com\nwozhuye.com\nwp-hz.com\nwpan123.com\nwpceo.com\nwpcio.com\nwpcsh.com\nwpdaxue.com\nwpdian.com\nwpengapp.com\nwpeu.net\nwpeyes.com\nwpgdadatong.com\nwpgdadawant.com\nwpglb.com\nwphonelife.com\nwphun.com\nwping.org\nwpjam.com\nwpk8.com\nwporder.com\nwproedu.com\nwps.com\nwpscdn.com\nwpsdns.com\nwpsep.net\nwpsgo.com\nwpske.com\nwpsmail.net\nwpsoffice.com\nwpsplus.com\nwpt.la\nwptao.com\nwptea.com\nwpued.com\nwpurl.cc\nwpweixin.com\nwpxap.com\nwpyou.com\nwpzhiku.com\nwpzysq.com\nwq96f9.com\nwqbook.com\nwqc.so\nwqchat.com\nwqcsjt.com\nwqdian.com\nwqdian.net\nwqdsq.com\nwqebl.org\nwqgp.com\nwqhfw.com\nwqhome.com\nwqhunqing.com\nwqian.net\nwqiis.com\nwqingjian.com\nwqketang.com\nwqlml.com\nwqlrvp3510.vip\nwqoiyz.com\nwqop2018.com\nwqshe.com\nwqstatic.com\nwqtool.com\nwqxsw.com\nwqxuetang.com\nwqycq.com\nwqyunpan.com\nwqzsc36ou356m.com\nwqzx.net\nwr88.cc\nwrating.com\nwrcdn.com\nwrdtech.com\nwrfou.com\nwright9.com\nwrite-bug.com\nwritebp.com\nwritingo-editor.com\nwritingo.net\nwrjzj.com\nwrkdih.com\nwrlsw.com\nwrltxt.com\nwrlwx.com\nwrmjk.com\nwrsa.net\nwrshg.com\nwrtauto.com\nwrtnode.cc\nwrtnode.com\nwrtsz.com\nwrxdsm.com\nws.ksmobile.net\nwsaf.net\nwsandos.com\nwsbkwai.com\nwsbuluo.com\nwscdn30.com\nwscdns.com\nwscdns.info\nwscdns.org\nwscdnss.com\nwsce-expo.com\nwscgdns.com\nwsche.com\nwscloudcdn.com\nwscloudcdn.org\nwsclouddns.com\nwscloudsec.com\nwscloudvpn.com\nwsclsb.net\nwscn.net\nwscncdn.com\nwscont1.apps.microsoft.com\nwscont2.apps.microsoft.com\nwscp.shop\nwscrm.net\nwscso.com\nwscstrace.com\nwscvdns.com\nwsdianzi.com\nwsdks.com\nwsdlb.com\nwsdqd56.com\nwsdvs.com\nwsdvs.info\nwsdvs.org\nwsecar.com\nwseen.com\nwselearning.com\nwselearning.net\nwsf1234.com\nwsfdl.com\nwsfdn.com\nwsfff.com\nwsfgx.com\nwsfnk.com\nwsgeogen.com\nwsgjj.com\nwsgjp.com\nwsglb.com\nwsglb.net\nwsglb0.com\nwsglb0.info\nwsglb0.org\nwsglw.com\nwsglw.net\nwsgph.com\nwsgri.com\nwsgtm1.com\nwsgtm3.com\nwshang.com\nwshbzc.com\nwshengda2009.com\nwshenm.com\nwshifen.com\nwshili.com\nwshost.cc\nwshoto.com\nwshr.com\nwshtgame.com\nwshttpdns.com\nwsimen.com\nwsipv6.com\nwsisp.com\nwsisp.net\nwsjgd688.com\nwsjtxia.com\nwskam.com\nwskj16818.xyz\nwsks.net\nwskwai.com\nwslivehls.com\nwsljf.xyz\nwsngb.com\nwsonh.com\nwsoso.com\nwsoss.com\nwsound.cc\nwsoversea.info\nwsoversea.net\nwsqejt.com\nwsrsj.com\nwsrxw.com\nwss.cc\nwss.email\nwss.ink\nwss.pet\nwss.show\nwss.zone\nwssafe.net\nwssanguo.com\nwssdns.com\nwsssec.com\nwsstplay.com\nwssvs.com\nwssvs.net\nwssyun.com\nwsszzx.com\nwstong.com\nwstx.com\nwsukwai.com\nwsurl.cc\nwswebcdn.com\nwswebcdn.info\nwswebcdn.org\nwswebpic.com\nwswebpic.info\nwswebpic.org\nwsxa.com\nwsxc.me\nwsxcme.com\nwsxjzp.com\nwsxsdf.com\nwsy.com\nwsy400.com\nwsy7.com\nwsyhn.com\nwsysdg.com\nwsyuanlin.com\nwsyxmall.com\nwszwhg.net\nwt-tech.com\nwt168.com\nwt222.com\nwta-web.org\nwtaluo.com\nwtango.com\nwtardseo26x6ts8tss0-dfs1.com\nwtbds.com\nwtbworld.com\nwtc-conference.com\nwtcmirni.com\nwtcxs.com\nwtd56.com\nwtdex.com\nwtdms.com\nwtecl.com\nwtfeng.com\nwtiharbin.com\nwtimm.com\nwting.info\nwtkj.site\nwtliker.com\nwtmicrowave.com\nwtmtest.com\nwtn-bearing.com\nwto-btb.com\nwto168.net\nwto9000.com\nwtoip.com\nwtojob.com\nwtoutiao.com\nwtown.com\nwtraff.com\nwts999.com\nwtsimg.com\nwtsm.net\nwtsoft.net\nwtszx.com\nwttai.com\nwttms.com\nwtuce.com\nwtwvision.com\nwtxcdn.com\nwtxcon.com\nwtzw.com\nwu-mart.com\nwu-mi.com\nwu.run\nwu123.com\nwu35.com\nwu37.com\nwu7zhi.com\nwuage.com\nwuahihotel.com\nwuaihanfu.com\nwuaiso.com\nwuaitec.com\nwuan888.com\nwubaiyi.com\nwubaiyi.net\nwubaiyi.vip\nwubashangban.com\nwubeizi.com\nwubiba.com\nwubixuexi.com\nwubizi.net\nwublock123.com\nwubuxianjing.com\nwubx.net\nwuchenxu.com\nwuchou.org\nwuchuanghui.com\nwuchucloud.com\nwuchucloud.net\nwuchuyun.com\nwuchuyun.net\nwucuoxs.com\nwucuozi.com\nwuczfj.com\nwudaai.com\nwudage.com\nwudajucheng.com\nwudangpai.com\nwudangshan.com\nwudao.com\nwudao28.com\nwudaotech.com\nwudaotv.com\nwudeli.com\nwudihan.com\nwudingfadian.com\nwuduyi.com\nwueasy.com\nwufafuwu.com\nwufan88.com\nwufangzhai.com\nwufazhuce.com\nwufun.net\nwufunb.com\nwug4.com\nwuganpark.com\nwugongdong.com\nwuguiyunwei.com\nwuguyufen.com\nwugx.net\nwuhaidaily.com\nwuhaijy.com\nwuhan-guide.com\nwuhan-tour.net\nwuhan.com\nwuhananyu.com\nwuhanbaituo.com\nwuhanbiennial.com\nwuhanbus.com\nwuhanchengqi.com\nwuhancityofdesign.com\nwuhandaishu.com\nwuhanev.com\nwuhanfuke120.com\nwuhanfukeyy.com\nwuhanghyy.com\nwuhanhexin.com\nwuhanins.com\nwuhanjingce.com\nwuhankb.com\nwuhankq.com\nwuhanlanqing.com\nwuhanlengji.com\nwuhanly.com\nwuhanmarathon.org\nwuhanmeigao.com\nwuhanmetro.com\nwuhanopen.org\nwuhanparking.com\nwuhanpe.com\nwuhanpep.com\nwuhanport.com\nwuhanrt.com\nwuhansanzhen.com\nwuhanshiliantong.shop\nwuhansport.com\nwuhanta.com\nwuhantianqi114.com\nwuhantskj.com\nwuhanunion.com\nwuhanup.com\nwuhanwyg.com\nwuhanyushidai.com\nwuhanzhenye.com\nwuhao13.xin\nwuhexxg.com\nwuhongsheng.com\nwuht.net\nwuhu.cc\nwuhubtv.com\nwuhues.com\nwuhujianshe.com\nwuhukj.fun\nwuhusanlian.com\nwuhuwater.com\nwuhuzr.com\nwuhzx.com\nwui5.com\nwuip.com\nwuji-edu.com\nwuji.com\nwujianghongyi.com\nwujianghr.com\nwujiangtong.com\nwujiayi.vip\nwujicode.com\nwujie.net\nwujiecaifu.com\nwujiehd.com\nwujiehuyu.com\nwujiemed.com\nwujiexiang.com\nwujieyouth.com\nwujiit.com\nwujijiasu.com\nwujinimg.com\nwujinpp.com\nwujintool.com\nwujinwater.com\nwujiok.com\nwujisite.com\nwujistatic.com\nwujitang.com\nwujixiaoshuo.com\nwujixsw.info\nwujogroup.com\nwujue.com\nwukaikai.tech\nwukao.com\nwukong.com\nwukong.la\nwukongbjb.com\nwukongkf.com\nwukongks.com\nwukonglicai.com\nwukongphp.com\nwukongrom.com\nwukongsearch.com\nwukongshuo.com\nwukongtj.com\nwukongtongji.com\nwukongwenda.com\nwukongyz.com\nwukypay.com\nwul.ai\nwulannews.com\nwuli.wiki\nwuliangroup.com\nwuliannanjing.com\nwuliaoo.com\nwuliaosi.com\nwuliaozhuan.com\nwuliapi.com\nwulicdn.com\nwulincdn.com\nwulincun.com\nwulinfeng8.com\nwuling.com\nwulingauto.com\nwulingnev.com\nwulingzy.com\nwulinn.com\nwulintang.net\nwuliok.com\nwuliucat.com\nwuliuhangye.com\nwuliujie.com\nwuliuren.com\nwuliuyun.com\nwulong365.com\nwuluoyun.com\nwulvxing.com\nwumai.net\nwumart.com\nwumii.com\nwumii.tv\nwuming.com\nwupdec.com\nwupk.com\nwuqi-micro.com\nwuqing.cc\nwuqiong.info\nwuqizhen.com\nwuqutu.com\nwurenjifanzhi.com\nwurenjihangyexiehui.com\nwuruihong.com\nwuscn.com\nwuse.com\nwuse.ink\nwusen.net\nwuseng.net\nwusetu.art\nwushang.com\nwushen.com\nwushifublog.com\nwushuangol.com\nwushuangtech.com\nwushuangzl.com\nwushuhenan.com\nwushuibao.com\nwushupeixunban.com\nwushuzw.com\nwushuzw.org\nwusong.com\nwusuhan.com\nwusunjiance.net\nwusunk.com\nwusuobuneng.com\nwusuobuneng.org\nwuta-cam.com\nwuta.cc\nwutaishanfojiao.com\nwutanyuhuatan.com\nwuteaclub.com\nwutep.com\nwuthreat.com\nwutianqi.com\nwutongchain.com\nwutongguo.com\nwutongtec.com\nwutongzi.com\nwutos.com\nwutuojia.com\nwuuconix.link\nwuuxiang.com\nwuwangnongseed.com\nwuweijob.com\nwuweiyou.com\nwuwenjun.net\nwuwuju.com\nwuxi5h.com\nwuxi9h.com\nwuxiairport.com\nwuxiamt.com\nwuxianhaibao.com\nwuxiantu.com\nwuxiatools.com\nwuxiatu.com\nwuxibiologics.com\nwuxibus.com\nwuxicxl.com\nwuxidiagnostics.com\nwuxihospital.com\nwuxihqyy.com\nwuxijf.com\nwuxijia.com\nwuxijiekang.com\nwuximarathon.com\nwuximediaglobal.com\nwuximhc.com\nwuxin.info\nwuxin.work\nwuxinban.com\nwuxingmu.com\nwuxingzuji.com\nwuxinhua.com\nwuxinmuye.com\nwuxipark.com\nwuxiph.com\nwuxishuangfan.com\nwuxishuangyou.com\nwuxisj.com\nwuxitianlang.com\nwuxiwang.net\nwuxiwanli.com\nwuxiwenlv.com\nwuxiworld.com\nwuxixdc.com\nwuxixz.com\nwuxiyishi.com\nwuxizazhi.com\nwuxizazhi.net\nwuxjob.com\nwuxs.org\nwuxue.cc\nwuxuwang.com\nwuxzx.com\nwuyabuluo.com\nwuyanauto.com\nwuyang-honda.com\nwuyangkeji.com\nwuyangmotor.com\nwuyangplatform.com\nwuyantonglun.org\nwuyazi.com\nwuyecao.net\nwuyechaorenrcw.com\nwuyenews.com\nwuyetongxin.com\nwuyetoutiao.com\nwuyi.link\nwuyida.com\nwuyijt.com\nwuyishan.net\nwuyixinyi.com\nwuylh.com\nwuyongwang.com\nwuyou.com\nwuyou.net\nwuyoudagong.com\nwuyoufang.com\nwuyougroup.com\nwuyoujianding.com\nwuyoushow.com\nwuyousy.com\nwuyouyun.cc\nwuyouyun.com\nwuys.com\nwuyuan.cc\nwuyublog.com\nwuyueart.com\nwuyueit.com\nwuyuidc.com\nwuyukang.com\nwuyumin.com\nwuyuntaxue.com\nwuyutai.com\nwuz7.com\nwuzao.com\nwuzhaiba.com\nwuzhenfestival.com\nwuzhenpay.com\nwuzhenwic.org\nwuzhenwucun.com\nwuzhi.me\nwuzhicms.com\nwuzhiq.com\nwuzhiwei.net\nwuzhong.com\nwuzhongdc.com\nwuzhongwater.com\nwuzhoucj.com\nwuzhoucloud.com\nwuzhoudonghui.com\nwuzhouhotels.com\nwuzhoumed.com\nwuzhouqianzheng.com\nwuzhourcw.com\nwuzhouwahson.com\nwuzhuiso.com\nwuzi8.com\nwuzx.com\nwvidc.com\nwvshare.com\nww-77660.com\nww2bbs.net\nww8899.com\nwware.org\nwwejds.com\nwwenglish.com\nwwenglish.org\nwwentua.com\nwwfchina.org\nwwhlian.com\nwwjia.com\nwwjie.com\nwwk888.com\nwwlcargo.com\nwwldz.com\nwwmhdq.com\nwwnet.vip\nwwrcw.net\nwwsgh.com\nwwsq.tv\nwwstat.com\nwww-11187.com\nwww-4466666.com\nwww-666789.com\nwww-76244.com\nwww-jabuank-co-jp.net\nwww.adobe.com\nwww.amd.com\nwww.cdnetworks.com\nwww.cg\nwww.com.my\nwww.dell.com\nwww.djivideos.com\nwww.epsonconnect.com\nwww.gov.mo\nwww.htc.com\nwww.microsoft.com\nwww.nike.com\nwww.redhat.com\nwww.samsung.com\nwww.st.com\nwww.tutorabc.com\nwww.uz0.xyz\nwww.vive.com\nwww.viveport.com\nwww.volvocars.com\nwww100789.com\nwww11ic-shinkni-ib-jp.com\nwww2489.com\nwww48-365365.com\nwww5929.com\nwww9912.com\nwwwer.net\nwwwfkw.com\nwwwic.net\nwwwimages.adobe.com\nwwwimages2.adobe.com\nwwwwqq.com\nwwxrmyy.com\nwwxxg.com\nwx-api.net\nwx-data.com\nwx-jsj.com\nwx-xdxc.com\nwx-yn.com\nwx-youyan.net\nwx.com\nwx135.com\nwx2h.com\nwx2share.com\nwx4.cc\nwx8g.com\nwx8h.com\nwx8s.com\nwx920.com\nwx939.com\nwxagame.com\nwxagyy.com\nwxamedia.com\nwxamkfyy.com\nwxappclub.com\nwxappvideo.com\nwxatech.com\nwxavu.com\nwxaz.net\nwxb.com\nwxb3d.com\nwxbaoming.com\nwxbiao.com\nwxbjyy.com\nwxbkw.com\nwxblockchain.com\nwxboiler.com\nwxboilerchina.com\nwxbrandway.com\nwxbsgc.com\nwxccfz.com\nwxccl.net\nwxcec.net\nwxcha.com\nwxchaoshengbo.com\nwxchildren.com\nwxchina.com\nwxchuguan.com\nwxchunleikeji.com\nwxcig.com\nwxcjfzjt.com\nwxcloudrun.com\nwxcnc.com\nwxcnpa.com\nwxcsgd.com\nwxcts.com\nwxddlfsq.com\nwxdegroup.com\nwxdesk.com\nwxdfgc.com\nwxdhnt.com\nwxdianju.com\nwxdtsj.com\nwxdw.info\nwxeditor.com\nwxedu.net\nwxeic.com\nwxf.com\nwxfhqchina.com\nwxfls.net\nwxfncjd.com\nwxfr.net\nwxfsdff.com\nwxfsgj.com\nwxfxw.com\nwxgamemini.com\nwxgamemini.work\nwxgateway.com\nwxggxx.com\nwxgjyy.com\nwxglyy.com\nwxgmkt.com\nwxgongkaike.com\nwxgrcpa.com\nwxgxjt.com\nwxhaifa.com\nwxhand.com\nwxhbjt.com\nwxhbzx.com\nwxhcgbds.com\nwxhdzg.com\nwxhgglc.com\nwxhgsrm.com\nwxhkexpress.com\nwxhledu.com\nwxhlhg.com\nwxhlzx.com\nwxhon.com\nwxhongqiao.com\nwxhouse.com\nwxhrm.com\nwxhsgkjt.com\nwxhstx.net\nwxhtkfyy.com\nwxhudong.com\nwxhxyk.com\nwxhyts.com\nwxhyzf.com\nwxiao.net\nwxiaoai.com\nwxiat.com\nwxidg.com\nwxivzhvp.com\nwxjava.com\nwxjcgas.com\nwxjgxx.com\nwxjh120.com\nwxjiaogun.com\nwxjieyang.com\nwxjkedu.com\nwxjmar.com\nwxjmsyzdxx.com\nwxjoi.com\nwxjsgs.com\nwxjshx.com\nwxjsxqc.com\nwxjsxy.com\nwxjtyf.com\nwxjx123.com\nwxjzh.com\nwxkj666.com\nwxkjwlw.com\nwxkml.com\nwxkou.com\nwxkpharma.com\nwxlagame.com\nwxlele.com\nwxlight.com\nwxlivecdn.com\nwxlongda.com\nwxlongre.com\nwxlpool.com\nwxlxjy.com\nwxlydhb.com\nwxmama.com\nwxmetro.net\nwxmolegames.com\nwxmovie.com\nwxmuseum.com\nwxnacy.com\nwxngh.com\nwxp114.com\nwxp2022.vip\nwxpangu.com\nwxpayui.com\nwxphp.com\nwxpmc.com\nwxq.today\nwxqcgc.com\nwxqxbxg.com\nwxrb.com\nwxrc.com\nwxrcgz.com\nwxrcw.com\nwxrrd.com\nwxsbank.com\nwxscreen.com\nwxscxxx.com\nwxsd.com\nwxsdezyyy.com\nwxsell.com\nwxsemzx.com\nwxsemzxyy.com\nwxsgf.com\nwxshake.com\nwxshgs.com\nwxshiteng.com\nwxshops.co\nwxshuku.la\nwxskysy.com\nwxslzf.com\nwxsohu.com\nwxsswgs.com\nwxsteed.com\nwxstztg.com\nwxsywater.com\nwxsyyxh.com\nwxszjt.com\nwxt2020.com\nwxtaihujx.com\nwxtcm.com\nwxtcxny.com\nwxtdf.com\nwxthe.com\nwxtj.com\nwxtj10086.com\nwxtpb.com\nwxtrirh.com\nwxtrust.com\nwxtyjt.com\nwxtyyy.com\nwxtyzyyy.com\nwxurls.com\nwxuse.tech\nwxutil.com\nwxw120.com\nwxwerp.com\nwxwjk5.com\nwxwmdq.com\nwxworklive.com\nwxwtblg.com\nwxwzt.com\nwxxd.co\nwxxfltg.com\nwxxfzx.com\nwxxrh.com\nwxxsh.net\nwxxsjyk.com\nwxxsyg.com\nwxxuetao.com\nwxxyxnb.com\nwxy1314.com\nwxyhgk.com\nwxyhhosp.com\nwxyljgxx.com\nwxyongji.com\nwxystour.com\nwxyuannuo.com\nwxyxrc.com\nwxyzedu.net\nwxzfkj.com\nwxzhongcai.com\nwxzpw8.com\nwxzq.com\nwxzwb.com\nwxzxw.com\nwxzzz.com\nwy000.com\nwy100.com\nwy182000.com\nwy213.com\nwy213.net\nwy2fy.com\nwy34.com\nwy6000.com\nwya1.com\nwybgs.com\nwybosch.com\nwybzdwss.com\nwycad.com\nwycfw.com\nwycsyyjt.com\nwydbw.com\nwydljx.com\nwydns.com\nwyduihua.com\nwyfluorine.com\nwygkmitk.com\nwyh138.com\nwyhef.com\nwyhos.fun\nwyins.cc\nwyins.net\nwyjianzhan.com\nwyjsq.com\nwyk8.com\nwykefu.com\nwykw.com\nwyl.cc\nwylylxx.com\nwyn88.com\nwynca.com\nwyndhamchangshasouth.com\nwyndhamgrandxian.com\nwyndhamsanya.com\nwynnstools.com\nwyptk.com\nwypxj.com\nwyrj.net\nwyrlzy.com\nwysaid.org\nwysap.com\nwysbglza.vip\nwysfgc.com\nwyshuoshuo.com\nwysls.com\nwysm88.com\nwyteam.net\nwytracir.com\nwytx.net\nwytype.com\nwytzgl.com\nwyuetec.com\nwywsdx.com\nwywy.ltd\nwywy6.com\nwywyx.com\nwyx365.com\nwyxokokok.com\nwyxzxyjhyy.com\nwyydsb.xin\nwyyve.com\nwyzc.com\nwyzg.org\nwyzxsd.com\nwyzyz.org\nwz-cjjt.com\nwz-emauto.com\nwz-goodcarbide.com\nwz-tea.com\nwz-zhongheng-zy.com\nwz-zhongheng.com\nwz01.com\nwz121.com\nwz132.com\nwz141.com\nwz16.net\nwz5.cc\nwz5.com\nwzadri.com\nwzaigo.com\nwzbb.com\nwzbhct.com\nwzbks.com\nwzbox.net\nwzbyjt.com\nwzcbd.com\nwzcfjt.com\nwzcggroup.com\nwzchayuan.com\nwzcl.net\nwzclxx.com\nwzdjy.com\nwzdlqj.com\nwzdsb.net\nwzdslyy.com\nwzdyn.com\nwzer.net\nwzes.net\nwzfg.com\nwzfou.com\nwzg0898.com\nwzg6.com\nwzgbj.com\nwzgemsmall.com\nwzghy.com\nwzguolian.com\nwzgyjt.com\nwzgytz.com\nwzh.kim\nwzhealth.com\nwzhibo.net\nwzhibo.tv\nwzhonghe.com\nwzhosp.com\nwzhouhui.com\nwzhouhui.net\nwzhphg.com\nwzhuanzhong.com\nwzhust.com\nwzhxlx.com\nwziii.com\nwzime.com\nwzits.com\nwzjbbus.com\nwzjcsc.com\nwzjrtzjt.com\nwzjsjtzcpt.com\nwzjsxx.com\nwzjxdyf.com\nwzjxyq.com\nwzkelineng.com\nwzkex.com\nwzkuailu.com\nwzkygroup.com\nwzlcgf.com\nwzlgjt.com\nwzlijingyuanlin.com\nwzlingyun.com\nwzlyqy.com\nwzlysz.com\nwzm.com\nwzmc.net\nwzmfgs.com\nwzmryy.com\nwzmtr.com\nwznas.com\nwznfgs.com\nwznyfz.com\nwzofjt.com\nwzojk.com\nwzoka.com\nwzotai.com\nwzpcw.com\nwzpkus.com\nwzplc.com\nwzport.com\nwzpy.com\nwzqbhsls.com\nwzqingou.com\nwzqmt.com\nwzqsyy120.com\nwzrc.com\nwzrc.net\nwzrclt.com\nwzrdwl2.com\nwzright.com\nwzrjsp.com\nwzrm-hospital.com\nwzrssip.com\nwzrygcht.com\nwzsee.com\nwzshe.com\nwzshuidian.com\nwzsky.net\nwzspinneret.com\nwzsrmyy.com\nwzssx.net\nwzstsj.com\nwzsxj.net\nwzsz.net\nwzsz.org\nwztf121.com\nwztianshanfs.com\nwztlink1013.com\nwztsy.com\nwzty.ltd\nwzu.com\nwzwqs.com\nwzwtrlyy.com\nwzxchem.com\nwzxclc.com\nwzxianggui.com\nwzxinchang.com\nwzxinfeng.com\nwzxmkj.com\nwzxszx.net\nwzxywj.com\nwzy2.com\nwzy6.com\nwzyc.com\nwzyds.com\nwzyestar.com\nwzyzdyf.com\nwzz1809.com\nwzzbdz.com\nwzzbtb.com\nwzzcd.com\nwzzhchem.com\nwzzjzxx.com\nwzzlovesli.com\nwzznft.com\nwzzp.com\nwzzpw.net\nwzzqqh.com\nwzzsfd.com\nwzzww.com\nwzzyhp.com\nwzzysm.com\nx-abt.com\nx-bull.com\nx-cloud.cc\nx-cmd.com\nx-droners.com\nx-imagine.com\nx-jishu.com\nx-kicks.com\nx-mol.com\nx-newedu.com\nx-peng.com\nx-ray.work\nx-storm.com\nx-tetris.com\nx-vsion.com\nx0246.com\nx0769.com\nx1106y.mobi\nx11263.com\nx11296.com\nx118.net\nx1abo.com\nx23118.com\nx23119.com\nx23qb.com\nx23us.us\nx23wxw.com\nx2552.com\nx2intell.com\nx315.com\nx3322.net\nx3366.com\nx33699.com\nx33yq.org\nx3china.com\nx3cn.com\nx431.com\nx4dp.com\nx5dj.com\nx5zs.com\nx64go.com\nx64pro.com\nx66597.com\nx69zw.com\nx6d.com\nx6tb.com\nx6x8.com\nx72y.com\nx7game.com\nx7sy.com\nx7z.cc\nx81zw.co\nx81zw2.com\nx821.com\nx86android.com\nx86pi.com\nx8ds.com\nx8sb.com\nxa-bank.com\nxa-online.com\nxa-psj.com\nxa.com\nxa189.net\nxa30zx.com\nxa4.com\nxa8yuan.com\nxa9t.com\nxaaycz.com\nxabaotu.com\nxabbs.com\nxabpo.com\nxacademy.cc\nxacbank.com\nxacg.info\nxachangda.com\nxachangxing.com\nxachanhe.com\nxachyy.com\nxacitywall.com\nxaclcrm.com\nxacnnic.com\nxacsjsedu.com\nxactad.net\nxacxxy.com\nxacyyxq.com\nxadamai.com\nxadlwx.com\nxadsa.com\nxadwyy.com\nxadyyy.com\nxaeaa.com\nxaecong.com\nxaedumedia.com\nxaent.com\nxafc.com\nxafish.com\nxafzjy.com\nxagdyz.com\nxagkwl.com\nxagmsm.com\nxaguanggu.com\nxagxp.com\nxahc971.com\nxahhp.com\nxahmqy.com\nxahr.net\nxahttd.com\nxahuapu.net\nxahuayi.com\nxahuilong.com\nxahxgy.com\nxahxp.com\nxaidc.com\nxainjo.com\nxaixs.org\nxajfwy.com\nxajiason.com\nxajjk.com\nxajjn.com\nxajjwy.com\nxajob.com\nxajx.com\nxajxcw.com\nxakaili.com\nxakjgzz.com\nxakqby.com\nxakrlab.com\nxalanq.com\nxalawyer.net\nxalhar.net\nxalyd.com\nxamama.net\nxaminim.com\nxamv.com\nxanahotelle.com\nxanhr.com\nxank120.com\nxanway.com\nxany6.com\nxaocao.com\nxaoji.com\nxaonline.com\nxaoyao.com\nxapcn.com\nxapi.ltd\nxaqhgas.com\nxarc.net\nxarlm.com\nxarongdi.com\nxarptec.com\nxarqba352.vip\nxarxbio.com\nxaseastar.com\nxasfyw.com\nxasgxy.com\nxashl.com\nxashuiwu.com\nxashzhjz.com\nxasimonds.com\nxasrc.com\nxasrite.com\nxasun.com\nxaswx.com\nxasyx.com\nxatc168.com\nxatielu.com\nxatourismgroup.com\nxatvs.com\nxatyds.com\nxatyz.com\nxatzj.com\nxauat-hqc.com\nxaudiopro.com\nxavierbrooks.shop\nxavua.com\nxawb.com\nxawdcy.com\nxawdslzp.com\nxawdz.com\nxaweather.com\nxawscu.com\nxawyjx.com\nxaxcgx.com\nxaxddz.com\nxaxydr.com\nxaxzlsgs.com\nxayabx.com\nxayestar.com\nxaygddc.com\nxayhedu.com\nxayizhou.com\nxayzjc.com\nxazbts.com\nxazcit.com\nxazls.com\nxazmkm.com\nxazwy.com\nxazysoft.net\nxazyy.com\nxazzs.com\nxb.app\nxb0.cc\nxb2s.com\nxba123.com\nxbaixing.com\nxbaodi.com\nxbaofun.com\nxbase.cloud\nxbase.xyz\nxbatu.com\nxbauto.com\nxbb8.com\nxbbaoan.com\nxbceo.com\nxbcjy.com\nxbcloudprint.com\nxbcpsjk.com\nxbd61.com\nxbdgps.com\nxbds.cc\nxbdym.com\nxbec-tencentclb.cloud\nxbec-tencentclb.com\nxbec-tencentclb.net\nxbec-tencentclb.work\nxbeian.com\nxbequge.com\nxbeta.info\nxbext.com\nxbfashion.com\nxbfnet.com\nxbfzb.com\nxbgjw.com\nxbhb.net\nxbhjgg.com\nxbhy.com\nxbiao.com\nxbidc.com\nxbiqiku.net\nxbiqiku2.com\nxbiquge.la\nxbiqugu.info\nxbiqugu.net\nxbiquke.com\nxbiquwx.la\nxbiquzw.com\nxbirder.com\nxbitw.net\nxbjianzhan.com\nxbjob.com\nxbjtkj.com\nxbk.icu\nxbkjvip.com\nxblaw.com\nxblou.com\nxblqb.com\nxblqugex.cc\nxblsign.com\nxblyw.com\nxbmbw.com\nxbmiaomu.com\nxbniao.com\nxbnj.net\nxbongbong.com\nxboot.org\nxboxfan.com\nxbpex.com\nxbptc.com\nxbrl-cn.org\nxbrother.com\nxbtest.com\nxbtw.com\nxbuwrp.sbs\nxbuyees.com\nxbw0.com\nxbwbh.com\nxbwebyun.com\nxbxgame.com\nxbxxb.com\nxbxxz.com\nxbzlapp.com\nxc-fc.com\nxc-fund.com\nxc-js.com\nxc05x.com\nxc1000.com\nxc2500.com\nxcabc.com\nxcao.win\nxcape.cc\nxcar.com\nxcarimg.com\nxcb-family.com\nxcbank.com\nxcbbtf.com\nxcc.com\nxccrugs.com\nxccy.cc\nxcdesign.net\nxcdn.global\nxcdngyc.vip\nxcdntp.vip\nxcdssy.com\nxcedu.net\nxcex.net\nxcfuer.com\nxcfunds.com\nxcgbb.com\nxcgbie.com\nxcgogo.club\nxcgogo.site\nxcgp.com\nxcgui.com\nxcgwk.com\nxcgyy175.org\nxcharger.net\nxchjw.org\nxchr-group.com\nxchsgy.com\nxchuxing.com\nxciic.com\nxcj.com\nxcjd.net\nxcjincheng.com\nxcjmcnc.com\nxcjtjt.com\nxcjyxx.com\nxckfsq.com\nxckgq.com\nxckpjs.com\nxckssw.com\nxckszx.com\nxclawyers.org\nxcljs.com\nxcloudbase.com\nxcmad.com\nxcmg-dkrob.com\nxcmg.com\nxcmgmall.com\nxcmobi.com\nxcmsports.com\nxcnchinese.com\nxcncp.com\nxcnv.com\nxcode.me\nxcoder.in\nxcommon.com\nxcoodir.com\nxcot.com\nxcpapa.site\nxcpapa.xyz\nxcpxssx.com\nxcq2022.com\nxcq518.com\nxcqpayy.com\nxcqxcq.com\nxcrc.net\nxcrmyy.com\nxcsc.com\nxcshaifen.com\nxcstuido.com\nxcsyy.com\nxctmr.com\nxcultur.com\nxcurrency.com\nxcvdd.xyz\nxcvec.com\nxcvmbyte.com\nxcvvs.com\nxcwhjj.com\nxcx-x.com\nxcxd-inc.com\nxcxd1997.com\nxcxjpd.com\nxcxvs.com\nxcxwo.com\nxcxymw.com\nxcxzks.com\nxcxzww.com\nxcyg.net\nxczhmzb.com\nxczhsh.com\nxczim.com\nxczzs.com\nxd-tech.com\nxd-world.com\nxd.com\nxd0.co\nxd0.com\nxd0731.com\nxd56b.com\nxd57.com\nxd8888.net\nxda.show\nxdadang.com\nxdapp.com\nxdbcb8.com\nxdbin.com\nxdc.at\nxdcdn.com\nxdcdn.net\nxdcg100.com\nxddpay.com\nxde.com\nxdebike.com\nxdf99.com\nxdfckjz.com\nxdfpr.com\nxdfsjj.com\nxdgalaxy.com\nxdggd.com\nxdgj.com\nxdgkwl.com\nxdglt.com\nxdgogogo.com\nxdhcn.com\nxdhelp.com\nxdhyty.com\nxdiarys.com\nxdingerp.com\nxdiscuz.com\nxdj-sz.com\nxdja.com\nxdjcgs.com\nxdju.com\nxdjunxiao.com\nxdjy369.com\nxdkb.net\nxdkjjy.com\nxdkjpx.com\nxdmb.xyz\nxdmssp.com\nxdn001.com\nxdn10000.com\nxdn2.com\nxdnice.com\nxdnote.com\nxdnphb.com\nxdnsvip.com\nxdnsvip.info\nxdocin.com\nxdowns.com\nxdpaomo.com\nxdper.com\nxdpipe.com\nxdpjump.com\nxdplt.com\nxdpvp.com\nxdqtech.com\nxdressy.com\nxdrig.com\nxdrqsb.com\nxdrtc.com\nxdrun.com\nxdsipo.com\nxdsp.mobi\nxdsyzzs.com\nxdter.com\nxdtev.com\nxdtool.com\nxdtos.com\nxduim.com\nxdundq.work\nxduoo.com\nxduoyu.com\nxduph.com\nxdwan.com\nxdweilai.com\nxdwyx.com\nxdxct.com\nxdxdsz.com\nxdxialingying.com\nxdxiaoshuo.com\nxdxmsy.com\nxdxmwang.com\nxdyanbao.com\nxdyjt.com\nxdystar.com\nxdytuliao.com\nxdyy.net\nxdyy100.com\nxdyyws.com\nxdzhsw.com\nxdzu.net\nxed.plus\nxedaojia.com\nxedaojia.net\nxedge.cc\nxeeger.com\nxeeok.com\nxefan.com\nxege.org\nxegnfwkju.com\nxegymyb.xyz\nxehedu.com\nxeknow.com\nxeltek-cn.com\nxen0n.name\nxender.com\nxenium.mobi\nxepher.fun\nxesabc.com\nxesapp.com\nxescdn.com\nxesdns.com\nxesee.com\nxesimg.com\nxesv5.com\nxet.tech\nxetimes.com\nxetlk.com\nxetslk.com\nxev-connectivity.com\nxevd.co\nxevddy.com\nxeylon.com\nxf-fund.com\nxf-gtm.com\nxf-world.org\nxf-yun.com\nxf.com\nxf0797.com\nxf119.xin\nxf1233.com\nxf21.com\nxf24ms.com\nxf3z.com\nxf4hs.com\nxf5z.com\nxfabs.com\nxfadx.com\nxfannix.com\nxfaqwlw.com\nxfb315.com\nxfbst.com\nxfcjn.com\nxfcn.com\nxfconnect.com\nxfcqc.com\nxfdown.com\nxfdp.net\nxfdwz.com\nxfdyb.com\nxfehc.com\nxfeng.me\nxffbb.com\nxffox.com\nxfguo.org\nxfhx.com\nxfinfr.com\nxfisp.com\nxfj100.com\nxfjcw.com\nxfjw.net\nxfjxs.com\nxflapp.com\nxflimg.com\nxfliusheng.com\nxflstatic.com\nxfltd.net\nxfmspps.com\nxfnano.com\nxfocus.net\nxfocus.org\nxforceplus.com\nxfpaas.com\nxfpass.com\nxfpg119.com\nxfplay.com\nxfprecise.com\nxframework.org\nxft123.com\nxftransa.com\nxfun233.com\nxfusion.com\nxfwed.com\nxfwindow.com\nxfx02.com\nxfx168.com\nxfxb.net\nxfxglass.com\nxfyousheng.com\nxfypaper.com\nxfyun.com\nxfzc.com\nxfzhsf.com\nxfzllht.com\nxfztgxt.com\nxg-techgroup.com\nxg1234.com\nxg38.com\nxgamecenter.com\nxgamevip.com\nxgantt.net\nxgate.com\nxgc002.com\nxgc004.com\nxgc09.com\nxgccm.com\nxgcp.asia\nxgcs55.com\nxgcsczyc.com\nxgcsfz.com\nxgd.com\nxgd666.com\nxgdfz.com\nxgdown.com\nxgdq.com\nxgdqsn.com\nxggj56.com\nxggjj.com\nxghylt.com\nxgimi.com\nxgimi.net\nxgiu.com\nxgj-info.com\nxgjdyjjt.com\nxgjgas.com\nxgjjw.com\nxgkwx.com\nxglgift.com\nxglist.com\nxgllreport.com\nxglopto.com\nxglpa.com\nxgn-cy.com\nxgo.cc\nxgost.com\nxgp365.com\nxgpharma.com\nxgqq.com\nxgqyy.com\nxgsdk.com\nxgsdpm.com\nxgss.net\nxgsxt.net\nxgsyun.com\nxgt2014.com\nxgtea.com\nxgwx.net\nxgxedu.com\nxgxsignage.com\nxgyszj.com\nxgz.cc\nxgzbwdj.com\nxgzdhj.com\nxgzrs.com\nxh-arch.com\nxh-health.com\nxh-silicone.com\nxh.com\nxh0523.com\nxh1958.com\nxh39.com\nxhaiwai.com\nxhante.com\nxhay1122.com\nxhbaoguan.net\nxhboke.com\nxhbosn.com\nxhby.net\nxhbycm.net\nxhcct.com\nxhclaw.com\nxhclub.net\nxhcpa.net\nxhcpas.com\nxhcs.com\nxhctcm.com\nxhd.org\nxhdjx.com\nxhdnwct.com\nxhdpay.com\nxhdxly.com\nxhedu.net\nxhfk120.net\nxhforex.com\nxhg.com\nxhgame.com\nxhgamesdk.com\nxhgjyc.com\nxhgz.com\nxhh.pw\nxhhd6.com\nxhhdd.cc\nxhhhzs.com\nxhhos.com\nxhidc.com\nxhily.com\nxhintech.com\nxhj.com\nxhj.info\nxhjaty.com\nxhjianglong.com\nxhjingling.com\nxhjj.com\nxhjkgj.com\nxhjnyy.com\nxhjs168.com\nxhjt.com\nxhjyxxw.com\nxhkt.tv\nxhlcsl.com\nxhlld002.shop\nxhlsgs.com\nxhma.com\nxhmedia.com\nxhmwxy.com\nxhnews.net\nxhostserver.com\nxhpfw.com\nxhpiano.com\nxhpr.net\nxhqbapp.com\nxhqqt.com\nxhrczp.com\nxhs.com\nxhscdn.com\nxhscdn.net\nxhsd.com\nxhsd.net\nxhsea.com\nxhsf.com\nxhslink.com\nxhslw.com\nxhsmlt.com\nxhsrmyy.com\nxhsxmt.com\nxhsyqx.com\nxhsyww.com\nxhtheme.com\nxhtw.com\nxhtwb.com\nxhtxgroup.com\nxhu2.com\nxhu218.com\nxhuaian.com\nxhup.club\nxhw520.com\nxhwater.com\nxhwcdasha.com\nxhwhouse.com\nxhwtech.com\nxhwx100.com\nxhwyzsd.com\nxhxcedu.com\nxhxgt.com\nxhxhr.com\nxhxsw.com\nxhy.com\nxhyd.com\nxhygroup.com\nxhyksha.xyz\nxhylbfyy.com\nxhyljt.com\nxhysh.com\nxhytd.com\nxhyun.vip\nxhzysg.com\nxi-9.com\nxi-soft.com\nxi.biz\nxi.su\nxi5jie.com\nxia1ge.com\nxiaa.net\nxiabingbao.com\nxiabor.com\nxiabu.com\nxiacai.com\nxiacaopu.net\nxiache.net\nxiachufang.com\nxiadaolieche.com\nxiadele.com\nxiaditu.com\nxiadts.com\nxiadu.com\nxiafenfa.com\nxiagaoqing.com\nxiagepian.com\nxiageyy.com\nxiaguanzhan.com\nxiagujian.com\nxiaheng.net\nxiaiot.com\nxiajuan88.com\nxiakefyz.com\nxiakeol.com\nxialingying.cc\nxialv.com\nxiamag.com\nxiamai.net\nxiame.com\nxiamen888.com\nxiamenair.com\nxiamenbg.com\nxiamenfojiao.com\nxiamenhuandongmarathon.com\nxiamenjiyang.com\nxiamentianqi114.com\nxiamenwater.com\nxiami.com\nxiami.net\nxiamo.fun\nxiamoyun.com\nxiamp4.com\nxian-feng.com\nxian-tourism.com\nxian-yao.com\nxian.com\nxianayi.net\nxianbao.fun\nxianbao.net\nxianbao5.com\nxianbdj.com\nxianbeikeji.com\nxianbey.com\nxiancaotang.com\nxianchengyou.com\nxiancn.com\nxiandaihospital.com\nxiandaimuye.com\nxiandaiyuwen.com\nxiandanjia.com\nxiandengdengguan.com\nxiandp.com\nxianer.net\nxianfae.com\nxianfan2022.com\nxianfengjiayuan.com\nxianfengsg.com\nxianfengyiyao.com\nxiang.com\nxiang.xin\nxiang5.com\nxiang578.com\nxiangange.com\nxianganquan.com\nxianganyu.com\nxiangauto.com\nxiangbababus.com\nxiangbala.net\nxiangbinmeigui.com\nxiangbojiubo.com\nxiangbosoft.com\nxiangcoin.com\nxiangcun.cc\nxiangcun.com\nxiangcunxiaoshuo.com\nxiangdian.com\nxiangdian.store\nxiangguo.com\nxiangguohe.com\nxiangha.com\nxianghuanji.com\nxianghumarathon.com\nxianghunet.com\nxianghus.com\nxiangjiamuye.com\nxiangjiang-amc.com\nxiangjiasz.com\nxiangjiayaoyehz.com\nxiangkanwang.com\nxiangkesi.com\nxiangley.com\nxiangliuzi.com\nxianglongpharm.com\nxianglute.com\nxiangmaita.com\nxiangming.site\nxiangmu.com\nxiangni.com\nxiangniya.com\nxiangoo.com\nxiangpeach.com\nxiangpi.com\nxiangpu24fa.com\nxiangqiai.com\nxiangqianpos.com\nxiangqigame.com\nxiangqin7.com\nxiangqishan.com\nxiangqiyouxi.com\nxiangqu.com\nxiangrikui.com\nxiangrikuijianzhan.com\nxiangrikuisite.com\nxiangruichina.com\nxiangruizulin.com\nxiangshang360.com\nxiangshangban.com\nxiangshanpark.com\nxiangshe.com\nxiangshengbao.com\nxiangshengnet.com\nxiangshi.cc\nxiangshi.video\nxiangshitan.com\nxiangshuheika.com\nxiangshunjy.com\nxiangsidi.com\nxiangsw.com\nxiangtaiyun.com\nxiangtaole.com\nxiangtatech.com\nxiangtuan.xyz\nxiangtx.com\nxianguo.com\nxianguomall.com\nxianguotea.com\nxiangw.com\nxiangwushuo.com\nxiangxiangmf.com\nxiangxihe.com\nxiangxinggroup.com\nxiangxingnet.com\nxiangyang-marathon.com\nxiangyang.net\nxiangyangwater.com\nxiangyi.co\nxiangyiai.com\nxiangyilxj.com\nxiangyu-group.com\nxiangyue.life\nxiangyueedu.com\nxiangyueliangyuan.com\nxiangyuezhongxue.com\nxiangyujiankang.com\nxiangyuncdn.com\nxiangyungx.com\nxiangyuyaoye.com\nxiangzhan.com\nxiangzhiren.com\nxiangzhuyuan.com\nxiangzi.ltd\nxiangzi.tech\nxiangzuanjiang.com\nxiangzukeji.com\nxianjian.com\nxianjian10.com\nxianjiaosuo.com\nxianjichina.com\nxianjiqun.com\nxianjzyxh.org\nxiankabao.com\nxiankan.com\nxianlai.work\nxianlaicd.com\nxianlaigame.com\nxianlaihy.com\nxianlaivip.com\nxianlan315.com\nxianliao.me\nxianlife.com\nxianliming.com\nxianmaiyangsheng.com\nxianmeilai.com\nxianmeisc.com\nxianningmarathon.com\nxianniu.com\nxianniu.net\nxianniuzu.com\nxiannvhu.com\nxianpinyun.com\nxianpp.com\nxianrail.com\nxianrenzhang.net\nxianshangzixun.com\nxianshangzixun.net\nxianshiqiba.com\nxianshishangmao.com\nxianshu.com\nxianshua.net\nxianshuabao.com\nxianshufang.com\nxiansimo.com\nxiansuan.com\nxiantao-marathon.com\nxiantao.com\nxianweizhang.com\nxianxiadao.com\nxianxiadao.net\nxianxiazhuanjz.com\nxianxueba.com\nxianyang888.com\nxianyer.com\nxianyongyong.com\nxianyouhe.com\nxianyuange.com\nxianyudanji.net\nxianyugame.com\nxianyugouwu.com\nxianyuso.com\nxianyuvr.com\nxianyuwang.com\nxianyuyouxi.com\nxianzhanget.com\nxianzhi.net\nxianzhice.com\nxianzhid.com\nxianzhongwang.com\nxianzidaer.com\nxianzilaishui.com\nxiao-an.com\nxiao-bo.com\nxiao-new.com\nxiao100.com\nxiao2she.com\nxiao688.com\nxiao84.com\nxiaoa.name\nxiaoac.com\nxiaoaiassist.com\nxiaoaiscan.net\nxiaoaisound.com\nxiaoangel.com\nxiaoantech.com\nxiaoantech.net\nxiaoao.com\nxiaoapp.io\nxiaoba001.com\nxiaobai.com\nxiaobaibar.net\nxiaobaipan.com\nxiaobaishiji.com\nxiaobaishixi.com\nxiaobaitool.net\nxiaobaiupin.com\nxiaobaivr.com\nxiaobaixitong.com\nxiaobal.com\nxiaobangbaoxian.com\nxiaobangguihua.com\nxiaobangtouzi.com\nxiaobao360.com\nxiaobaodt.com\nxiaobaoming.com\nxiaobaoonline.com\nxiaobaostudio.com\nxiaobeibike.com\nxiaobeigl.com\nxiaobeiyangji.com\nxiaobeizuqin.com\nxiaobianli8.com\nxiaobingxitong.com\nxiaobool.com\nxiaobot.net\nxiaobu.tech\nxiaobu121.com\nxiaobuwq.com\nxiaocanapp.com\nxiaocanhulian.com\nxiaocantech.com\nxiaocaoo.com\nxiaocaoyun.com\nxiaoce.fun\nxiaocen.com\nxiaochamao.com\nxiaoche001.com\nxiaocheng.com\nxiaochengxu029.com\nxiaochengxucms.com\nxiaochi198.com\nxiaochixiang.com\nxiaochuanyun.com\nxiaocifang.com\nxiaocms.com\nxiaocx.org\nxiaoda.fun\nxiaodaijl.com\nxiaodaka.net\nxiaodangxian.com\nxiaodanzi.com\nxiaodao0.com\nxiaodaotv.com\nxiaodaozhi.com\nxiaodapei.com\nxiaodengvip.com\nxiaodian.com\nxiaodian.so\nxiaodianweb.com\nxiaodigu.com\nxiaoding110.com\nxiaodingchui.com\nxiaodiyouxi.com\nxiaodongrui.com\nxiaodongxier.com\nxiaodoubi.com\nxiaodoukj.com\nxiaodoushebao.com\nxiaodouzuche.com\nxiaoduoai.com\nxiaoduseo.com\nxiaodutv.com\nxiaody.com\nxiaoe-assets.com\nxiaoe-live.com\nxiaoe-materials.com\nxiaoe-tech.com\nxiaoe-tools.com\nxiaoecloud.com\nxiaoeeye.com\nxiaoeknow.com\nxiaoenai.com\nxiaoerjiren.com\nxiaoeryi.com\nxiaoetong.com\nxiaofany.com\nxiaofeng.org\nxiaofengtv.com\nxiaofubao.com\nxiaofuzi.net\nxiaogan.com\nxiaogd.net\nxiaogegelive.com\nxiaogj.com\nxiaogou111.com\nxiaogou222.com\nxiaogou333.com\nxiaogou444.com\nxiaogou555.com\nxiaogou666.com\nxiaogou777.com\nxiaogou888.com\nxiaogou999.com\nxiaogouds.com\nxiaogouh5.com\nxiaogouzhineng.com\nxiaoguaniu.com\nxiaoguikuaipao.com\nxiaoguo101.com\nxiaoguosq.com\nxiaoguowenhua.com\nxiaoguoyi.com\nxiaogushi.com\nxiaohansong.com\nxiaohe-jiankang.com\nxiaohe666.com\nxiaoheihegame.com\nxiaoheima.com\nxiaohelive.com\nxiaohengmaidan.com\nxiaohi.cc\nxiaohongchun.com\nxiaohongjituan.com\nxiaohongshu-mycdn.com\nxiaohongshu.com\nxiaohongshu.net\nxiaohongshulvyou.com\nxiaohouyisheng.com\nxiaohouyunyin.com\nxiaohu8.com\nxiaohua8.com\nxiaohuabaichu.com\nxiaohuabuluo.com\nxiaohuai.com\nxiaohuangji.com\nxiaohuanxiong.com\nxiaohuazhuo.com\nxiaohucloud.com\nxiaohufev.com\nxiaohulu.com\nxiaohun.net\nxiaohuochai.cc\nxiaohuochai.site\nxiaohuohu.com\nxiaohus.com\nxiaohuwl.com\nxiaoi.com\nxiaoi.me\nxiaoice.com\nxiaoj.com\nxiaoji.com\nxiaoji001.com\nxiaojian.site\nxiaojiaokeji.com\nxiaojiaoyar.com\nxiaojiaoyu.com\nxiaojiaoyu100.com\nxiaojing.work\nxiaojing360.com\nxiaojinzi.com\nxiaojiuwang.com\nxiaojl.com\nxiaojp.com\nxiaojuchefu.com\nxiaojudeng.com\nxiaojukeji.com\nxiaojupeijian.com\nxiaoka.tv\nxiaokache.com\nxiaokakj.com\nxiaokanba.com\nxiaokanglongjiang.com\nxiaokao.com\nxiaokaxiu.com\nxiaokcdn.com\nxiaokcehui.com\nxiaoke.space\nxiaoke101.com\nxiaokeai.com\nxiaokeduo.com\nxiaokepu.com\nxiaokesoso.com\nxiaokudang.com\nxiaokuihua.net\nxiaokusha.com\nxiaolachuxing.com\nxiaolajiao.com\nxiaolanapp.com\nxiaolanben.com\nxiaolangtt.com\nxiaolantiao.com\nxiaole.com\nxiaoleimob.com\nxiaolianbao.com\nxiaoliangkou.com\nxiaolianhb.com\nxiaoliebian.com\nxiaolii.com\nxiaolikj.online\nxiaolin.in\nxiaolinbysj.com\nxiaolincoding.com\nxiaolinsi.com\nxiaolintj.com\nxiaolinwl.com\nxiaoliqing.net\nxiaolizhuli.com\nxiaolizupai.com\nxiaolong.li\nxiaoluboke.com\nxiaolun.net\nxiaoluxuanfang.com\nxiaoluyouxuan.com\nxiaoluyy.com\nxiaoluzhidian.com\nxiaolvji.com\nxiaolxiao.com\nxiaoma.com\nxiaoma.net\nxiaomachuxing.com\nxiaomagaojian.com\nxiaomai.live\nxiaomai5.com\nxiaomaidong.com\nxiaomaigongkao.com\nxiaomaigui.com\nxiaomaiketang.com\nxiaomaiuzu.com\nxiaomajia.com\nxiaomaomi.online\nxiaomaomv.com\nxiaomape.com\nxiaomark.com\nxiaomashijia.com\nxiaomaxitong.com\nxiaomayi.net\nxiaomazhixing.com\nxiaomei.cc\nxiaomeiti.com\nxiaomeng1235.com\nxiaomi.com\nxiaomi.hk\nxiaomi.net\nxiaomi.org\nxiaomi.tw\nxiaomiaozai.com\nxiaomicorp.com\nxiaomicorp.net\nxiaomicp.com\nxiaomidns.com\nxiaomidns.net\nxiaomiev.com\nxiaomiinc.com\nxiaomiinc.net\nxiaomimimo.com\nxiaomimobile.com\nxiaominet.com\nxiaominfo.com\nxiaomingjianzhan.com\nxiaomingtaiji.cc\nxiaomingtaiji.com\nxiaomingtaiji.net\nxiaominr.com\nxiaomiqiu.com\nxiaomiquan.com\nxiaomirom.com\nxiaomisa.com\nxiaomisa.net\nxiaomisa.org\nxiaomishu.com\nxiaomiw.cc\nxiaomiwear.com\nxiaomixiaoai.com\nxiaomiyoupin.com\nxiaomlove.com\nxiaomor.com\nxiaomu.cc\nxiaomuji.info\nxiaomuzhi.com\nxiaomy.net\nxiaomyc.com\nxiaonaodai.com\nxiaonaonao.org\nxiaonei.com\nxiaonengren.com\nxiaoni.com\nxiaoniaofei.com\nxiaoniba.com\nxiaoniu66.com\nxiaoniuben.com\nxiaoniuds.com\nxiaoniuhululu.com\nxiaopai.vip\nxiaopaitech.com\nxiaopaotec.com\nxiaopeiqing.com\nxiaopeng.com\nxiaophy.com\nxiaopi.com\nxiaopinchuxing.com\nxiaopinw.com\nxiaopiu.com\nxiaoqiandao.com\nxiaoqiangge.com\nxiaoqiling.com\nxiaoqingtou.com\nxiaoqinre.com\nxiaoqiqiao.com\nxiaoqiweb.com\nxiaoquba.com\nxiaoqueshe.com\nxiaoquyijia.com\nxiaorizi.me\nxiaorui.cc\nxiaoruibao.com\nxiaoshengping.com\nxiaoshentongzongbu.com\nxiaoshidata.com\nxiaoshijie.com\nxiaoshituina.vip\nxiaoshouhudong.com\nxiaoshourc.com\nxiaoshouyi.com\nxiaoshuapp.com\nxiaoshuiguo.com\nxiaoshujiang.com\nxiaoshuo.com\nxiaoshuo1-sm.com\nxiaoshuo2-sm.com\nxiaoshuo520.com\nxiaoshuoba.com\nxiaoshuobi.cc\nxiaoshuodaquan.com\nxiaoshuohui.net\nxiaoshuoli.com\nxiaoshuowu.com\nxiaoshuxiong.com\nxiaositv.com\nxiaot.com\nxiaota.com\nxiaotangketang.com\nxiaote.com\nxiaote.net\nxiaotee.com\nxiaotengyouxi.com\nxiaotiancai.com\nxiaoting.com\nxiaotongqq.com\nxiaotud.com\nxiaotuzhan.com\nxiaou2014.com\nxiaoupan.com\nxiaowang.net\nxiaowangshen.com\nxiaowangyun.com\nxiaowangzi777.com\nxiaowazi.com\nxiaoweichen.com\nxiaoweigod.com\nxiaoweijia.net\nxiaoweijiankang.com\nxiaoweirobot.com\nxiaowiba.com\nxiaowm.com\nxiaowuwl.com\nxiaoxia.vip\nxiaoxiaapi.com\nxiaoxiang.club\nxiaoxiangbz.com\nxiaoxiangtoutiao.com\nxiaoxiangxueyuan.com\nxiaoxiangyoupin.com\nxiaoxiaodangan.com\nxiaoxiaoketang.com\nxiaoxiaomo.com\nxiaoxiaoshuo.com\nxiaoxiaotong.org\nxiaoxiaoyouxuan.com\nxiaoxichangliu.com\nxiaoxili.com\nxiaoxinbk.com\nxiaoxineye.com\nxiaoxinrili.com\nxiaoxintoutiao.com\nxiaoxintuku.com\nxiaoxiong360.com\nxiaoxiongjita.com\nxiaoxiongmeishu.com\nxiaoxiongxitong.com\nxiaoxiongyouhao.com\nxiaoxiongzhoupu.com\nxiaoxitech.com\nxiaoxiuapp.com\nxiaoxusd.com\nxiaoya56.com\nxiaoyanjiusheng.com\nxiaoyantong.com\nxiaoyanwenxue.com\nxiaoyaodsx.com\nxiaoyaoxi.com\nxiaoyaoyou.com\nxiaoyastar.com\nxiaoyatong.com\nxiaoyegejitar.com\nxiaoyejidian.com\nxiaoyejixie.com\nxiaoyeren.com\nxiaoyezi.com\nxiaoyezu.com\nxiaoyi.com\nxiaoyiads.com\nxiaoyida.com\nxiaoyida.net\nxiaoyiduoduo.com\nxiaoying.co\nxiaoying.com\nxiaoying.tv\nxiaoyingxiong.com\nxiaoyingzhenxuan.com\nxiaoyisysreset.com\nxiaoyizhiqu.com\nxiaoyou66.com\nxiaoyouxi.co\nxiaoyouxi.com\nxiaoyouxi100.com\nxiaoyouxiqun.com\nxiaoyouzb.net\nxiaoyu.com\nxiaoyuananquantong.com\nxiaoyuankousuan.com\nxiaoyuansouti.com\nxiaoyuansouti.xyz\nxiaoyuanyun2.com\nxiaoyuanzhao.com\nxiaoyuanzhaopin.net\nxiaoyuer.com\nxiaoyujia.com\nxiaoyun.com\nxiaoyusan.com\nxiaoyusanchou.com\nxiaoyutiao.com\nxiaoyuxitong.com\nxiaoyuzhoufm.com\nxiaoz.me\nxiaozhang365.com\nxiaozhao365.com\nxiaozhen.com\nxiaozhenpaotui.com\nxiaozhibaoxian.com\nxiaozhibo.com\nxiaozhimed.com\nxiaozhiyun.com\nxiaozhongjishu.com\nxiaozhoumo.com\nxiaozhu.com\nxiaozhu.hk\nxiaozhu158.com\nxiaozhu2.com\nxiaozhua.com\nxiaozhuangzhuang.com\nxiaozhuanhao.com\nxiaozhustatic1.com\nxiaozhustatic2.com\nxiaozhustatic3.com\nxiaozlife.com\nxiaozu365.com\nxiaozuan8.com\nxiaozuanbike.com\nxiaozufan.com\nxiaozujian.com\nxiaozuowen.net\nxiapac.com\nxiapilu.com\nxiappt.com\nxiapu.co\nxiaqu.org\nxiaqunfeng.cc\nxiarenzhuxin.com\nxiarj.com\nxiashanet.com\nxiataoseo.com\nxiatou.com\nxiaw.net\nxiawan8.com\nxiawen.tv\nxiawuyouke.com\nxiaxs.info\nxiaxs.la\nxiayixing.com\nxiayx.com\nxiazai.live\nxiazai126.com\nxiazai16.com\nxiazai163.com\nxiazaiba.com\nxiazaicc.com\nxiazaidizhi.cc\nxiazaijidi.com\nxiazais.com\nxiazaitool.com\nxiazaiwx.com\nxiazhougroup.com\nxibaike.com\nxibaiwang.com\nxibanyaqz.com\nxibao100.com\nxibeicanyin.com\nxibeidev.com\nxiberia.net\nxibojiaoyu.com\nxibu168.com\nxibujuece.com\nxiburongmei.com\nxicaijing.com\nxicaishe.com\nxicaodesign.com\nxichengo.com\nxichongsm.com\nxichu.net\nxichuan001.com\nxichuangzhu.com\nxici.com\nxici.net\nxicp.net\nxidesheng.com\nxidian.cc\nxidibuy.com\nxidie.com\nxidiglobal.com\nxiduobaby.com\nxie22.com\nxiebanyun.com\nxiebao18.com\nxieboke.net\nxiecdn.com\nxieche.com\nxieche.net\nxiecheng.com\nxiechuangw.com\nxiedaimala.com\nxiedajia.com\nxiedao.com\nxiediantong.com\nxiefenxiang.com\nxiegangsir.com\nxiege.net\nxiegekt.com\nxiehehp.com\nxiehejx.com\nxiehekjkf.com\nxiehepcb.com\nxiehouit.com\nxiehuiyi.com\nxiejiahe.com\nxiejianji.com\nxiejiaxin.com\nxiejing.com\nxieliaofa.com\nxielijiaoyu.com\nxieliqun.com\nxiemm.com\nxiesk.com\nxietonghuaxue.com\nxiexiaoyuan.com\nxiexin.com\nxiexinbao.com\nxiexingcun.com\nxieyangzhe.com\nxieyimao.com\nxieyudatea.com\nxiezewen.com\nxiezi.tech\nxiezilouzulinwang.com\nxieziqiu.net\nxiezixiansheng.com\nxiezuocat.com\nxiezuoye.com\nxiezuoyisi.com\nxifangw.com\nxifenfei.com\nxifengboke.com\nxifenggroup.com\nxifengjiuzhaoshang.com\nxifu120.com\nxifumi.com\nxigaogen.com\nxiggua.com\nxigo.tv\nxigou100.com\nxigoubao.com\nxigua.com\nxigua110.com\nxiguaapp.com\nxiguabook.com\nxiguaji.com\nxiguang.xyz\nxiguaplayer.com\nxiguashipin.net\nxiguavideo.net\nxigushan.com\nxigushan.net\nxigushi.com\nxihabang.com\nxihachina.com\nxihaiannews.com\nxihaianrc.com\nxihangzh.com\nxihawan8.com\nxihaxueche.com\nxihazsww.com\nxihegp.com\nxiherencai.com\nxihuan.me\nxihusgh.com\nxiimoon.com\nxiinnn.com\nxiji-express.com\nxiji.com\nxijie.com\nxijie888.com\nxijinfa.com\nxijing01.com\nxijingjianzhan.com\nxijingjianzhan0.com\nxijingjianzhan1.com\nxijingjianzhan2.com\nxijingjianzhan3.com\nxijingjianzhan4.com\nxijingjianzhan5.com\nxijingjianzhan6.com\nxijingjianzhan7.com\nxijingjianzhan8.com\nxijingjianzhan9.com\nxikang365.net\nxikcloud.com\nxikii.com\nxikoutourism.com\nxikrs.com\nxikuan.com\nxikuqi.com\nxilaijian.com\nxilaiping.com\nxilanggufen.com\nxilddt.com\nxilehongniang.com\nxilele.com\nxilexuan.com\nxileyougame.com\nxili.fan\nxilian-group.com\nxiliangjituan.com\nxilichi.com\nxiliguoji.com\nxilinjie.com\nxilinsi.org\nxilinx-ic.com\nxilipy.com\nxilish.com\nxilitang.com\nxiliulou.com\nxilu.com\nxiluoxuan.com\nxilvlaw.com\nxima.org\nxima.tv\nximalaya.com\nximalaya.fm\nximalaya.men\nximalaya.tv\nximalayadata.com\nximalayaos.com\nximeiapp.com\nximeigroup.com\nximendou.com\nximenwai.com\nximgs.net\nximiplay.com\nximitools.com\nximiyouxi.com\nximmerse.com\nximogo.com\nximuw.com\nxin-health.com\nxin-manganese.com\nxin-yao.com\nxin.com\nxin.science\nxin.xin\nxin1234.com\nxin21.xyz\nxin3721.com\nxin6.net\nxinac.net\nxinanjr.com\nxinanrui.com\nxinansec.com\nxinaogas.com\nxinaoyun.com\nxinba.com\nxinbaicai.com\nxinbalive.com\nxinbear.com\nxinbiaocha.com\nxinbiaochijiaoyu.com\nxinboaa.com\nxinbqg.com\nxincache.com\nxincai.com\nxincailiao.com\nxincainet.com\nxincaise.com\nxincaitong.net\nxincanshu.com\nxinceremed.com\nxincg.com\nxincha.com\nxinchacha.com\nxinchaipower.com\nxinchanfeng.com\nxinchangol.com\nxinchao.com\nxinchaoss.com\nxinchego.com\nxinchenai.com\nxincheng.com\nxinchengbio.com\nxinchengge13.com\nxinchengyue.com\nxincheping.com\nxinchess.com\nxinchong.com\nxinchuanbo.com\nxinchuang-bio.com\nxinchukj.com\nxincj.com\nxincmm.com\nxincode.com\nxincomm.com\nxinda-bio.com\nxindachem.com\nxindaifu.com\nxindalawyer.com\nxindaohang123.com\nxindasulian.com\nxindawz.com\nxinde.org\nxindemarinenews.com\nxindetihuiya.com\nxindexuexi.com\nxindianti.com\nxindingdianxsw.com\nxindingwealth.com\nxindns.com\nxindong.com\nxindongdinglv.com\nxindonghuyu123.com\nxindu.cc\nxinduo.com\nxinduoad.com\nxinenw.com\nxiner-membrane.com\nxineurope.com\nxinexpress.com\nxinfaholding.com\nxinfangcidian.com\nxinfangsheng.com\nxinfei.com\nxinfeijituan.com\nxinfeipengjixie.com\nxinfeiyu.net\nxinfenggxgroup.com\nxinfengji.com\nxinfengming.com\nxinfenlei.com\nxinfinite.net\nxinfox.net\nxinfree.com\nxinfuhk.com\nxinfushe.com\nxinfuyouxi.com\nxinfuyun.net\nxing-su.com\nxing73.com\nxingames.com\nxingaochengtai.com\nxingb.net\nxingbangfl.com\nxingbo.tv\nxingchao1.com\nxingchengb.org\nxingchenjia.com\nxingcheshixian.com\nxingchiauto.com\nxingchuangcar.com\nxingchuangtiandi.com\nxingdatrip.com\nxingdong.co\nxingdongliu.com\nxinge.com\nxinge.la\nxinge365.com\nxingechemical.com\nxingechina.com\nxingefuwu.com\nxingeshan.com\nxingezhan.com\nxingfagroup.com\nxingfeiinc.com\nxingfudu.com\nxingfufangdai.com\nxingfulaonian.com\nxingfulizhaofang.com\nxingfuu.com\nxinggan.net\nxingganggas.com\nxingguanggongkao.com\nxinghai365.com\nxinghaigroup.com\nxinghaiwaimai.com\nxinghan.vip\nxinghangdao.com\nxinghantec.com\nxinghaoyun8.com\nxinghejoy.com\nxinghengedu.com\nxingheoa.com\nxinghuaport.com\nxinghuazixun.com\nxinghuo100.com\nxinghuo365.com\nxinghuoxiaoshuo.com\nxinghy.com\nxinghy56.com\nxingjiagames.com\nxingjiaoyun.com\nxingjiesj.com\nxingjijy.com\nxingjimob.com\nxingjuhe.com\nxingjun-group.com\nxingkec.com\nxingkeqi.com\nxingketech.com\nxingkong.link\nxingkongfy.xyz\nxingkongmt.com\nxingkupai.com\nxinglai.com\nxinglan.co\nxingliao.work\nxingliju.com\nxinglin-tech.com\nxinglingyingxue.com\nxinglinpukang.com\nxinglizhou.vip\nxingloo.com\nxingmima.com\nxingming.com\nxingming.net\nxingmuyi.com\nxingnuo.cc\nxingongjiaoyu.com\nxingpai.com\nxingpaibilliard.com\nxingpan.com\nxingpin.com\nxingqier.com\nxingqisihuishou.com\nxingqiu.tv\nxingqiu520.com\nxingqu11.com\nxingquanke.com\nxingren.com\nxingronghealthcare.com\nxingrongn.com\nxingruan.com\nxingrui-cn.com\nxingrunkg.com\nxingse.net\nxingseapp.com\nxingshangnet.com\nxingshawater.com\nxingshen.com\nxingshu.com\nxingshuishuiwu.net\nxingshulin.com\nxingsteel.com\nxingsuyun58.com\nxingtai.net\nxingtai0319.com\nxingtai123.com\nxingtaishipping.com\nxingtan.one\nxingtan001.com\nxingtangzp.com\nxingtongsw.com\nxingtu.com\nxingtui520.com\nxinguad.com\nxinguangjian.com\nxinguge.com\nxinguida.com\nxinguizhou.com\nxingumin.net\nxinguodu.com\nxingvps.com\nxingwajiang.com\nxingwan001.com\nxingxing.com\nxingxingbao.com\nxingxingjizhang.com\nxingxingzaixian.fun\nxingxingzu.com\nxingyangroup.com\nxingyao.com\nxingyaomob.com\nxingyaoss.com\nxingyaowa.com\nxingyaozhilian.com\nxingye.work\nxingye1.com\nxingyeace.com\nxingyeai.com\nxingyeddz.com\nxingyigz.com\nxingyihaiyang.com\nxingyin.com\nxingying2018.com\nxingyizhai.com\nxingyongli.com\nxingyou99.com\nxingyoucai.com\nxingyuan-hb.com\nxingyuan.com\nxingyuebike.com\nxingyuebio.com\nxingyuedoor.com\nxingyuehuyu.com\nxingyuhuwai.com\nxingyunb.com\nxingyunba.com\nxingyungroup.com\nxingyunol.com\nxingyusoft.net\nxingyutc.com\nxingyuyouxi.com\nxingzh.xyz\nxingzhean.com\nxingzhige.com\nxingzhilan.com\nxingzi-vision.com\nxingzou.art\nxingzoushu.com\nxingzuo.com\nxingzuomi.com\nxingzuopei.com\nxingzuowu.com\nxingzuoyundns.com\nxinhaiglobal.com\nxinhaimineral.com\nxinhaiminingepc.com\nxinhaimininggroup.com\nxinhaisoft.com\nxinhaitravel.com\nxinhanhd.com\nxinhanhr.com\nxinhanyx.com\nxinhaolian.com\nxinhaoqi.net\nxinhaosi.com\nxinhay.com\nxinhe99.com\nxinhechina.com\nxinhecq.com\nxinhedjq.com\nxinhengshui.net\nxinheshenggroup.com\nxinheyun.net\nxinhongru.com\nxinhua-news.com\nxinhua.org\nxinhua08.com\nxinhuaapp.com\nxinhuachongming.com\nxinhuachuanmeijs.com\nxinhuacu.com\nxinhuaiot.com\nxinhuamm.net\nxinhuanet.com\nxinhuanet.ltd\nxinhuapo.com\nxinhuaprs.com\nxinhuapub.com\nxinhuaqipai.com\nxinhuashe.org\nxinhuashudian.com\nxinhuasuye.com\nxinhuawang.com\nxinhuawz.com\nxinhuaxmt.com\nxinhuayimin.com\nxinhuazhiyun.com\nxinhuoq.com\nxinhuozhi.com\nxining-marathon.com\nxiniu.com\nxiniu3d.com\nxiniugushi.com\nxiniushu.com\nxiniuyun.com\nxiniuz.com\nxinjiadiy.com\nxinjianggames.com\nxinjianggou.com\nxinjiangqinglvyou.com\nxinjiangroup.com\nxinjiashangtou.com\nxinjidian.com\nxinjifangchan.com\nxinjimo.com\nxinjingst.com\nxinjingxiang.com\nxinjinqiu.com\nxinjiren.com\nxinjisuan.net\nxinjiyuan.net\nxinju.fun\nxinjuc.com\nxinjunshi.net\nxinjunshicn.net\nxinke-semi.com\nxinkuai.com\nxinlangtupian.com\nxinlanshengbc.com\nxinle.com\nxinle366.com\nxinleineng.com\nxinleshan.com\nxinleshiyiyuan.com\nxinlexie.com\nxinli001.cc\nxinli001.com\nxinli001.xyz\nxinli001wx.com\nxinli10.com\nxinliangxiang.com\nxinliceping.com\nxinlifudao.com\nxinlilw.com\nxinlinghuayuan.com\nxinlingletu.com\nxinlip.com\nxinliwanju.com\nxinlixinli.net\nxinlong-holding.com\nxinluex.com\nxinlvtu.com\nxinlvyy.com\nxinmaizj.com\nxinmanduo.com\nxinmanhua.net\nxinmanyuan.com\nxinmaotao.net\nxinmei365.com\nxinmeihu.com\nxinmeijiutian.com\nxinmeinuo.com\nxinmem.com\nxinmenglife.com\nxinmeow.com\nxinmeti.com\nxinmima.com\nxinminghui.com\nxinminheng.com\nxinmintian.vip\nxinmizx.com\nxinnakj.com\nxinnet.com\nxinnetdns.com\nxinnetvip.com\nxinniangjie.com\nxinnianhua.com\nxinnong.com\nxinnong.net\nxinnuodazu.com\nxino-tech.com\nxinorngyk.com\nxinouhk.com\nxinoujixie.com\nxinpa.com\nxinpeihu.net\nxinpg.com\nxinpianchang.com\nxinpianyugao.com\nxinpin-ip.com\nxinping.cc\nxinpingmu.com\nxinpinhe.com\nxinpinmao.com\nxinpintoutiao.com\nxinpupower.com\nxinpure.com\nxinqidian-sh.com\nxinqigu.com\nxinqingyulu.com\nxinqite.com\nxinqiucc.com\nxinqiyejia.com\nxinqtech.com\nxinquanedu.com\nxinquji.com\nxinranliu.me\nxinray.com\nxinray.net\nxinrenxinshi.com\nxinri.com\nxinrong88.com\nxinrui-games.com\nxinrui-pharm.com\nxinrui.biz\nxinruipiao.com\nxinruiweb.com\nxinsanbanbao.com\nxinsankeji.com\nxinsdn.com\nxinsenz.com\nxinsf.cc\nxinshangmeng.com\nxinshangshangxin.com\nxinshengdagroup.com\nxinshengku.com\nxinshengsemi.com\nxinshi525.com\nxinshiba.com\nxinshipu.com\nxinshishen.com\nxinshouyou.com\nxinshouzhanzhang.com\nxinshuge.net\nxinshuiny.com\nxinshuru.com\nxinsilu.com\nxinsource.com\nxinss.com\nxinss.net\nxinstall.com\nxinstatic.com\nxinszy.com\nxintaikeji.com\nxintairen.com\nxintairencai.com\nxintaishequ.com\nxintaizhou.com\nxintajixie.com\nxinteenergy.com\nxintengmenchuang.com\nxintheme.com\nxintiandi.com\nxintianw.com\nxintianya.net\nxintiao100.com\nxintiaogroup.com\nxintiaoyouxi.com\nxintongconference.com\nxintongwang.com\nxintrum.com\nxintuan.com\nxintucdn.com\nxintuosoft.com\nxintv.com\nxinwangcj.com\nxinwanr.com\nxinweier.com\nxinweiyun.com\nxinwell.com\nxinwen365.com\nxinwen520.net\nxinwengao.net\nxinwengood.com\nxinwenke.com\nxinwenlianbo.tv\nxinwo.com\nxinwuji.com\nxinwulan.com\nxinxe.com\nxinxi28.com\nxinxianghui.com\nxinxianshilb.com\nxinxiansk.com\nxinxianwang.com\nxinxiaochina.com\nxinxiaodian.com\nxinxiaoqi.com\nxinxiaozu.com\nxinxiehe.com\nxinxifabu.net\nxinxinapp.net\nxinxing-marathon.com\nxinxing001.com\nxinxing100.com\nxinxing91.com\nxinxinhot.net\nxinxinhotel.com\nxinxinjoy.com\nxinxinmed.com\nxinxjs.com\nxinxue-edu.com\nxinxuejy.com\nxinxunwang.com\nxinxyun.com\nxinya.me\nxinyali.net\nxinyan-gx.com\nxinyan.com\nxinyanggaopin.com\nxinyanglao.com\nxinyanwuliu.com\nxinyao168.com\nxinyaoapp.com\nxinyaoshi.com\nxinyapharm.com\nxinyayk.com\nxinyegang.com\nxinyetongcard.com\nxinyi-tech.com\nxinyi.com\nxinyidc.com\nxinyiglass.com\nxinyihl.com\nxinyinghc.com\nxinyingpower.com\nxinyingtec.com\nxinyingyang.com\nxinyisemi.com\nxinyishiji.com\nxinyitt.com\nxinyo100.com\nxinyong.net\nxinyongbuy.com\nxinyongsoon.com\nxinyou.com\nxinyoudui.com\nxinyour.com\nxinyu-tam.com\nxinyu19.com\nxinyuanclub.com\nxinyuanf.com\nxinyuanfin.com\nxinyuanshiye.net\nxinyubt.com\nxinyuchen.com\nxinyueclub.com\nxinyuefei.com\nxinyuehealth.com\nxinyuejiaxiao.net\nxinyueseo.com\nxinyuevod.com\nxinyuhole.com\nxinyuhongyuan.com\nxinyuncs.com\nxinyunfuwu.com\nxinyunit.com\nxinyurc.com\nxinyustone.com\nxinyutengyuan.com\nxinzegongshui.com\nxinzengwj.net\nxinzheng.cc\nxinzhi.com\nxinzhi.space\nxinzhibang168.com\nxinzhibid.com\nxinzhichuangzhi.com\nxinzhiguanwangyun.com\nxinzhongqi.net\nxinzhou.org\nxinzlkj.com\nxinzuojia.com\nxinzushenghuo.com\nxiolift.com\nxiongan1dt.org\nxionganxinxi.com\nxiongbagk.com\nxiongchuan.com\nxiongdong.com\nxiongf.com\nxiongfengcl.com\nxiongfenggroup.com\nxiongge.club\nxiongmaitech.com\nxiongmao555.com\nxiongmao789.com\nxiongmaoboshi.com\nxiongmaodangao.com\nxiongmaojinku.com\nxiongmaosaohao.com\nxionguamaqui.com\nxiongyin.com\nxiongying.com\nxiongyudl.com\nxiowo.net\nxioxix.com\nxipu.com\nxipunet.com\nxipushuju.net\nxiqb.com\nxiqianyangyi.com\nxiqiaoshantour.com\nxiqifun.com\nxiqinrc.com\nxiqkj.com\nxiqu.me\nxiqu001.com\nxiquebo.com\nxiqueer.com\nxiquepark.net\nxiqueqingjian.com\nxiqurongmei.com\nxiquwenhua.net\nxirang.com\nxiri-vacuum.com\nxironiot.net\nxisaiwang.com\nxise3.com\nxishalz.com\nxishanju-hn.com\nxishanju.com\nxishanxuexiao.com\nxishaoye.com\nxishiwang.com\nxishixiuhair.com\nxishpj.com\nxishu365.com\nxishuai.com\nxishuai.net\nxishuizk.com\nxishunj.com\nxisofttec.com\nxitang.love\nxitanhotel.com\nxitaoinfo.com\nxite-group.com\nxitek.com\nxitek.net\nxitengbingxue.com\nxitie.com\nxitieba.com\nxitieba.net\nxitinet.com\nxitmi.com\nxitong-tech.com\nxitong114.com\nxitong5.com\nxitong8.com\nxitong86.com\nxitongcity.com\nxitongdaquan.net\nxitonggho.com\nxitonghe.com\nxitongku.com\nxitongle.com\nxitongpe.com\nxitongqingli.com\nxitongtiandi.net\nxitongtiankong.com\nxitongtu.net\nxitongwanjia.com\nxitongxz.net\nxitongzhijia.com\nxitongzhijia.net\nxitongzijia.net\nxitongzongcai.com\nxitu.com\nxitu.io\nxituan.com\nxiu.com\nxiu8.com\nxiuai.com\nxiubiaoshi.com\nxiubiaozu.com\nxiucai.com\nxiudodo.com\nxiudtech.com\nxiufa.com\nxiufaxing.com\nxiugei.com\nxiugu.com\nxiuhandingzhi.com\nxiuhangzhe.com\nxiuhe128.com\nxiuimg.com\nxiujiadian.com\nxiujixia.com\nxiujue.cc\nxiulian.com\nxiuluowang.com\nxiuluren.com\nxiulv.com\nxiumb.com\nxiumb12.com\nxiumi.us\nxiumius.com\nxiumucn.com\nxiuna.com\nxiuno.com\nxiuqicloud.com\nxiuren.com\nxiushao.com\nxiusheji.com\nxiushuang.com\nxiushui.net\nxiusifudianji.com\nxiustatic.com\nxiutanqi.com\nxiutuan.com\nxiutv.com\nxiuxiandou.com\nxiuxianshipin.com\nxiuxiu.com\nxiuxiuda.com\nxiuxiustatic.com\nxiuxmanhua.com\nxiuzhan365.com\nxiuzhanwang.com\nxiuzhiwu.com\nxivcdn.com\nxiwan.vip\nxiwang.com\nxiwangame.com\nxiwangchina.com\nxiwangd.com\nxiwanglife.com\nxiwangxiaoyuan.com\nxiwantrip.com\nxiweigas.com\nxiwenquan.com\nxiwicloud.com\nxiwnn.com\nxiwuji.com\nxiwuy.com\nxixhx.com\nxixiangongjiao.com\nxixianwatergroup.com\nxixiaoyou.com\nxixiarc.com\nxixibobo.com\nxixidoudizhu.com\nxixig8.com\nxixih.cc\nxixih.net\nxixik.com\nxixik.net\nxixinews.com\nxixinghanghr.com\nxixiqipai.com\nxixisys.com\nxixiwg.com\nxiyacs.com\nxiyangan.com\nxiyashiji.com\nxiyec-tencentclb.cloud\nxiyec-tencentclb.com\nxiyec-tencentclb.net\nxiyec-tencentclb.work\nxiyi-jt.com\nxiyijiang.com\nxiyijm.com\nxiyin.life\nxiyiqq.com\nxiyogo.com\nxiyongpark.com\nxiyoo.com\nxiyou-g.com\nxiyoucdn.com\nxiyouchat.com\nxiyouence.com\nxiyouji.com\nxiyouji.work\nxiyoulinux.com\nxiyoupark.com\nxiyouquan.com\nxiyousdk.com\nxiyouwebgame.com\nxiyouxi.com\nxiyuanshuke.com\nxiyucosmetics.com\nxiyuege.com\nxiyuegr.com\nxiyufine.com\nxiyun.net\nxizanggames.com\nxizangguolv.net\nxizangmaoniunai.com\nxizangqinglv.com\nxizangzl.com\nxizexiao.com\nxizhai2021.com\nxizhang.com\nxizhengtouzi.com\nxizhi.com\nxizi.com\nxizice.com\nxiziiparking.com\nxiziquan.com\nxiziwang.net\nxj-biotech.com\nxj-etyy.com\nxj-tianye.com\nxj-zp.com\nxj120.com\nxj123.info\nxj169.com\nxj5152.com\nxj5u.com\nxj71.com\nxj917.com\nxj96596.com\nxjabc.net\nxjauto.net\nxjbank.com\nxjbaoyouge.com\nxjbdf.net\nxjbhc.net\nxjbuluo.com\nxjc18.com\nxjcc.net\nxjcmtj.com\nxjcysky.com\nxjcysw.com\nxjd2020.com\nxjdaily.com\nxjdkctz.com\nxjdpx.com\nxjdsb.com\nxjdwfc.com\nxjdzhyq.com\nxjedu.org\nxjent.com\nxjesps.com\nxjf.pub\nxjfam.com\nxjfdcw.com\nxjfilm.net\nxjfk.com\nxjflcp.com\nxjfm.com\nxjfzb.com\nxjgameapi.com\nxjgameinfo.com\nxjgc.com\nxjggjy.com\nxjgj.com\nxjgqt.org\nxjgsdm.com\nxjgt.com\nxjguanghui.com\nxjguowang.org\nxjgwy.org\nxjgxjt.com\nxjh.com\nxjh.me\nxjhgame.net\nxjhjrq.com\nxjhr.com\nxjhsxt.com\nxjhtrq.com\nxjhuan.fun\nxjhx120.com\nxjhyktsp.com\nxjhzn.com\nxjietiao.com\nxjishu.com\nxjisme.com\nxjiyou.com\nxjjhjt.com\nxjjnjp.org\nxjjqd154.com\nxjjsws.com\nxjjt.com\nxjks.net\nxjlxw.com\nxjlytz.com\nxjlz365.com\nxjmachine.com\nxjmg.com\nxjmty.com\nxjnnet.net\nxjnzm.com\nxjoycity.com\nxjpdf.com\nxjphsd.com\nxjpnmt.com\nxjqixing.com\nxjqysw.com\nxjr2018.com\nxjrb.com\nxjrb.net\nxjrc365.com\nxjrmyy.com\nxjshanhao.com\nxjsic.com\nxjsmwl.com\nxjsy56.com\nxjtcm.com\nxjtjjt.com\nxjtour.com\nxjtrcw.com\nxjtrry.com\nxjtsnews.com\nxjtssw.com\nxjtucompressor.com\nxjtudlc.com\nxju88.com\nxjwell.com\nxjwljb.com\nxjwyglw.com\nxjx11221ts.com\nxjxa.com\nxjxbmy.com\nxjxbx.com\nxjxdf.com\nxjxf.com\nxjxhdn.com\nxjxtrq.com\nxjy020.com\nxjygaofu.com\nxjyrcw.com\nxjysk.com\nxjytjt.com\nxjz.com\nxjzclyqc.com\nxjzcsq.com\nxjzdjx.com\nxjzhsh.com\nxjzlyy.com\nxjzp.net\nxk57.com\nxk857.com\nxk89.com\nxk9l.com\nxkaxka.com\nxkbbtang.com\nxkbjm.com\nxkcd.in\nxkcun.com\nxkdywl.com\nxkeirofiowef.com\nxker.com\nxkfyzmob.com\nxkgiwdey.com\nxkhouse.com\nxkitd.com\nxkjian.com\nxkjt.com\nxkjt.net\nxkjxcon.com\nxknow.net\nxkonglong.com\nxkpx.com\nxksafe.com\nxksast.com\nxktech.com\nxktsz.com\nxkunyi.com\nxkw.com\nxkwe.com\nxkxs.org\nxkxsc.com\nxkyl.vip\nxkyn.com\nxkyn.net\nxkyy.com\nxkzzz.com\nxl-ai.com\nxl-edu.net\nxl-ele.com\nxl-soft.com\nxl-vip.com\nxl18z.com\nxl2824.com\nxl5bb.com\nxl5dd.com\nxl5du.com\nxl5dw.com\nxl699.com\nxlaidudu.info\nxlaidudu.net\nxlaomi.net\nxlbsoft.com\nxlcai.com\nxlcgjg.com\nxlcidc.com\nxlcjzx.com\nxlctyd.com\nxlczg.com\nxldlive.com\nxldz.com\nxlewen5.com\nxlfred.com\nxlgao.com\nxlgjg.net\nxlgogo.com\nxlgtx.com\nxlgxapp.com\nxlhb.com\nxlhbgroup.com\nxlhfmj.xin\nxlhhy.com\nxlhk.net\nxlhs.com\nxlhyc.com\nxlibai.com\nxlinclass.com\nxlisp.net\nxljly.com\nxljnjy.com\nxljsci.com\nxlkdyf.com\nxlkorganic.com\nxlkshop.com\nxlkty.com\nxllyk.com\nxlm258.com\nxlmarathon.com\nxlmr.com\nxlmz.net\nxlndt.com\nxlobo.com\nxlongm.com\nxloveyoux.com\nxlpai.com\nxlpan.com\nxlpp.net\nxlqeai.com\nxlqzh.com\nxlread.com\nxlreads.com\nxlsdn.com\nxlsemi.com\nxlshou.com\nxlsxmj.com\nxltll.com\nxltnjslfd.com\nxlvshi.com\nxlwl95.com\nxlxkgjt.com\nxlxqsgf.com\nxlxslny.com\nxlyap.com\nxlyfhw.com\nxlykzz.com\nxlyouxi.com\nxlyouxi.net\nxlysauc.com\nxlysauc.net\nxlysoft.net\nxlyx3.com\nxlyxo.com\nxlyxp.com\nxlzfpt.com\nxlzhao.com\nxlzyd.com\nxlzys.com\nxlzyyw.com\nxm-ad.com\nxm-ais.net\nxm-chuang.com\nxm-gzf.com\nxm-olympic-museum.org\nxm002.com\nxm200.com\nxm51.com\nxm5156.com\nxm680.com\nxm6wpp.com\nxm9.co\nxm909.com\nxm9m.com\nxmac.app\nxmafkj.com\nxmaibu.com\nxmalaya.com\nxmamiga.com\nxmanblog.net\nxmantou.com\nxmasg.com\nxmayitxt.com\nxmbankonline.com\nxmbhw.com\nxmbie.com\nxmbike.com\nxmbus.com\nxmccb.com\nxmcdn.com\nxmchong.com\nxmcimg.com\nxmcord.com\nxmcp.ltd\nxmcwh.com\nxmcx.net\nxmcy.com\nxmdh.com\nxmeasygo.com\nxmecard.com\nxmerak.com\nxmeye.net\nxmf.com\nxmfc.com\nxmferry.com\nxmfev.com\nxmfish.com\nxmfls.net\nxmfunny.com\nxmgd.com\nxmgltwzhs.com\nxmgod.site\nxmgps.com\nxmgsd.com\nxmgslx.com\nxmguoyi.com\nxmgwbn.com\nxmhaicangmarathon.com\nxmheigu.com\nxmheitu.com\nxmhitek.com\nxmhlcs.org\nxmhljx.net\nxmhouse.com\nxmht.com\nxmhx.com\nxmigc.com\nxmindchina.net\nxminfoport.com\nxming.ai\nxminnov.com\nxminzu.com\nxmisp.com\nxmitic.com\nxmj1688.com\nxmjchyxh.com\nxmjgjy.com\nxmjiaruan.com\nxmjim.com\nxmjj3d.com\nxmjled.com\nxmjsci.com\nxmjslh.com\nxmjyw.com\nxmjzykj.com\nxmkanshu.com\nxml-journal.net\nxmldz4.com\nxmlhifi.com\nxmlulub.com\nxmlvbarcode.com\nxmmade.com\nxmmama.com\nxmmeiyou.com\nxmmnrj.com\nxmmtu.com\nxmmuye.com\nxmnjdwx.com\nxmnovel.com\nxmocloud01.com\nxmonecode.com\nxmos.tv\nxmov.ai\nxmpaoyou.com\nxmparking.net\nxmpbjl.com\nxmpcba.com\nxmqianzun.com\nxmqxy.com\nxmr-zh.com\nxmrb.com\nxmrbi.com\nxmrdtx.com\nxmruanci.com\nxmruiyou.com\nxmseaview.com\nxmseeyouyima.com\nxmsgame.com\nxmshqh.com\nxmsixian.com\nxmsiyb.com\nxmsj.org\nxmsme.com\nxmsmjk.com\nxmsoft.com\nxmsouhu.com\nxmsoushu.com\nxmspace.net\nxmssie.com\nxmsssyy.com\nxmsumi.com\nxmsuperlite.com\nxmswim.com\nxmtbang.com\nxmtyy.net\nxmuli.tech\nxmvod.org\nxmwan.com\nxmwes.com\nxmwsrc.com\nxmx023.com\nxmxc.com\nxmxdev.com\nxmxfxh.com\nxmxgame.com\nxmxmc.com\nxmxsapp.com\nxmxwl.net\nxmxwz.com\nxmyeditor.com\nxmylhy.com\nxmyouma.com\nxmyzm.com\nxmzangao.com\nxmzdls.com\nxmzgxcl.com\nxmzhdz.com\nxmzhkt.com\nxmzibi.com\nxmzjjl.com\nxmzjtjckmy.com\nxmzmmr.com\nxmzmy.com\nxmzs.org\nxmzsyg.site\nxmzwdgm.com\nxmzyark.com\nxmzzy.net\nxn--0lqwsu2w.com\nxn--1bs9ye16ez8b.com\nxn--1ctq05bvu1a.com\nxn--1d3a16a.com\nxn--1lqq7i4w0acli.com\nxn--1qqw23a\nxn--2cyr99a.com\nxn--2quu5hi8e69p.com\nxn--2vra6db.com\nxn--2vxsp6vi4j.com\nxn--3bs35yfl6bn8a.ink\nxn--3bs70igqdr64f.com\nxn--3bs781ecijtrt.com\nxn--3bsp13hurlcwb.com\nxn--3bst00m\nxn--3bsx54la62v.com\nxn--3bsz0pskmp89skv3a0zd724b1py.net\nxn--3ds443g\nxn--48s50dpwnbh95ah07i.com\nxn--4gq0d69oba129b9wd94ey8bs83ji3c3q7hoka.org\nxn--4gq1d760bszbgdv5p12rhq5bx2yc.net\nxn--4lwr21d.com\nxn--4qwqc04pn0lg9h.com\nxn--4xup5j.com\nxn--54q23ckxiyx0e.com\nxn--54q249denfzw9a.net\nxn--54q40czz0g7xp.com\nxn--55qw42g\nxn--55qw7biqf7g3d004h8yuw1ctrt04sep1cjfb.com\nxn--55qx2ag79c1iq.com\nxn--55qx5d\nxn--55qzsxj5y4ozkz93dswptmau4jc88dg75ctid8raf29c.com\nxn--5brz4b846h.com\nxn--5kv317c.com\nxn--5kv91jiz2b.com\nxn--5tzm5g\nxn--6fr61zj8c92fg34d.com\nxn--6frz82g\nxn--6kr66fp2ep1ac5edz2hy7s2wq.com\nxn--6krw3qs7jl59b.com\nxn--6oq83hzb922dnorwsomx9dzkb.com\nxn--6qq986b3xl\nxn--6qqp94buie2ss.com\nxn--6rtq6phwfhva.com\nxn--6xv710dola.net\nxn--730-l44eu9iitvv9h.com\nxn--7mqy6dj0brts55e.com\nxn--7qvz7xssa.com\nxn--88-9s0f59z.com\nxn--8lqrjra071bi0qgga421cs99a4qeqwm.com\nxn--8ou124e6ek.net\nxn--8owq8u.com\nxn--8stx8olrwkucjq3b.com\nxn--8y0a063a\nxn--91-y60d638c.xyz\nxn--9et52u\nxn--9kr72kqwe.com\nxn--9krv3x413bbyb.com\nxn--9myo55bi8l.com\nxn--9pr56vfna007k.com\nxn--9pry86bq5ex68c.org\nxn--b0t462i.com\nxn--b0tn0sxy3ayhj.com\nxn--b0tp7p3met2a.com\nxn--b0tp7p3met2a.net\nxn--b8qi619ujyk.com\nxn--btvs3aw8fhtbms310k.com\nxn--btvu9x9qgt8c.com\nxn--bxyy83e.net\nxn--cesw6hd3s99f.com\nxn--cesx3oukw29l.com\nxn--chq7lp8e46htw3g.com\nxn--chq84itwgrb674blm6f.com\nxn--chq978ctsf6v6c.com\nxn--cjztj18l.com\nxn--cpqr0dg9g4t0fodaq5c.com\nxn--cssw8z54rj2ds2q.com\nxn--czr694b\nxn--czr93rxry.com\nxn--czrs0t\nxn--czru2d\nxn--czru2dx3eszw3lat53b.com\nxn--dev407h.com\nxn--djr48g6sik7q.com\nxn--djr58xb1mzxk3mtrhfc8g.com\nxn--dkr447bejn.com\nxn--dkr447bejn.net\nxn--dll-8n0e103bz5hg93c.site\nxn--dlq10g6xfkw4a201b.com\nxn--dlqu6kw2e2n3aolseyrfhn.com\nxn--dlqw10borzgxh.com\nxn--dtq23gl66e.com\nxn--eh1a34ykpl.com\nxn--fcs316auqlyoe.com\nxn--fhq79jyym9nh74hfm8a.com\nxn--fiq03fftg7m2c.com\nxn--fiq06jqoz14s.com\nxn--fiq228c5hs\nxn--fiq446amrnx0i.com\nxn--fiq4mgq69drxaiym2g5wnynb77huij0bchq7vj5ay61o3cwdq2ah92mlg9c.com\nxn--fiq60luzcp97a7oxivr99k.org\nxn--fiq64b\nxn--fiq6q20pz51d.com\nxn--fiq73f39fwr0b4wk.net\nxn--fiq7v55hnsepqz.net\nxn--fiqr9gg1vdha.com\nxn--fiqrtn9duw9e.cc\nxn--fiqs8s\nxn--fiqs8sr9ge7eb4b28vo92a.com\nxn--fiqu59c0hf2sy.net\nxn--fiqv94di0c54ipe.net\nxn--fiqw8jl3h7xc25m753d.link\nxn--fiqx7ci2whnj.com\nxn--fiqz9s\nxn--fjq5py34j65v.com\nxn--fjq720a\nxn--g2xx48c\nxn--glr604k.com\nxn--gmq238c5fy.com\nxn--gmqr9gdtrhuf56g.com\nxn--h0tn34c.cc\nxn--husx9zj2eepau0se83d.com\nxn--hutn94av9amzg.net\nxn--hxt814e\nxn--i6q33br88fkud.com\nxn--igry70bi8kqt9a.org\nxn--igt225itqf.com\nxn--imr513n\nxn--io0a7i\nxn--it-if7c19g5s4bps5c.com\nxn--jh1a128b.com\nxn--jor0b302fdhgwnccw8g.com\nxn--jpr47zq87axwjc0d.com\nxn--jxuv1s.net\nxn--kivq8be3whsi.com\nxn--kput3i\nxn--l9qya49g86gm9ghpbzy1dwl0fppo.com\nxn--lt0at3k.com\nxn--mct72chgrm.net\nxn--mes380bwhsoec.com\nxn--mmz.cc\nxn--mnqs00c24c2pw0ii.com\nxn--mts196b.net\nxn--n5q75cia631gba51vx4ag2a008o08l1t0adzay2skp4b.com\nxn--n6qy1xeobw60f.net\nxn--ncym25ahib.net\nxn--nmqp78hmufjwu.com\nxn--ntso8dsz1borbzvfm5h.com\nxn--ntsp37j.net\nxn--nyqx2gbsm8u0b.com\nxn--nyqy26a\nxn--ohqn1dw64cf45c8l9a1ba.com\nxn--omrvgz6er31au6f.com\nxn--oorz70c56jtwb49x.net\nxn--otu796d\nxn--p5t28ylet56a.com\nxn--pss89e6xl72g.com\nxn--ptua509t.com\nxn--q20av2y36ac54a.com\nxn--qruq25bjsj.net\nxn--qzwx3ij21azka.com\nxn--r8s65df7admf92a.com\nxn--rhq112dhez17bejdyhl55dypc.com\nxn--rhqr3ykwbm05aegjqxb.com\nxn--rhqt5j7qj6mj.com\nxn--rhqv96g\nxn--rht439a44bdyk.com\nxn--riqi041otpd.com\nxn--ror-j59d107t.net\nxn--rpv331d.com\nxn--rss237b.com\nxn--rss404ac6aj60e.net\nxn--rsss0ke5ghnj.com\nxn--ruqs20ac8b5z7av8ir2u.net\nxn--ruqz9zcojm5sf19a.com\nxn--s4t325g.com\nxn--ses554g\nxn--sgt856gbjl.cc\nxn--siq0gv77a3c.com\nxn--sosw2ge0bs10aoq0a.com\nxn--sss604efuw.com\nxn--swts8irvtrtr.com\nxn--tesiro-n17nh93r.net\nxn--tfr181fg2az43a.com\nxn--tkr55q2oa097dyxe209c.com\nxn--tlq092au7hsi3a.com\nxn--tlqz3aj77agil76ww4ni2k.com\nxn--tqq89g2tjj5x8xs.com\nxn--unup4y\nxn--vcso1ukuz.net\nxn--vcsu51b3zccpm.com\nxn--vcsu9p66gy1l9vpnnbk52f.com\nxn--vhq3m33sbqhpsmtnuxfq.com\nxn--vhq3mr8b802a.net\nxn--vhq4ut2dsxd5xqnicjxxo55a756aovhik0aunm.com\nxn--vhq72yfwbt0elp2cpkhtld55g73l1o6a.com\nxn--vhqqbz2p62hm92e04p.com\nxn--vhqr42drhf5k7b.com\nxn--vhqu1kbz3bnbi.com\nxn--vhquv\nxn--viq463a.com\nxn--vq3a5gj6c9i.com\nxn--vuq861b\nxn--w9q313dfn4a.com\nxn--w9q675dm1p7em.net\nxn--w9qr0k.com\nxn--w9qy23cc6adz7d.net\nxn--wbsz85a2a.com\nxn--wxtr44c.live\nxn--xcry9n251cvcar5xj6r.com\nxn--xhq521b\nxn--xhq60k09cr85at2f494d.com\nxn--xhq60kzbz07dem6azlu.com\nxn--xhq8sm16c5ls.com\nxn--xhqq4f5vc69qlmk6mva633mwoeiuad9562e.com\nxn--xhqs8jmxkive1yest6g.com\nxn--xhqs8jp0kpz2d.net\nxn--xhqx10kr8o.com\nxn--xkr190gv5p.com\nxn--xkr26fp82clgt.com\nxn--xkr999cp4fv97a.com\nxn--xkrs9ba41r.com\nxn--y6q834d2k3al4h.com\nxn--y8jhmm6gn.moe\nxn--ygtp21bwyedsq.com\nxn--yhqq38bmov17mqxi.com\nxn--ykr169cm1pskt.com\nxn--z4q559dueav8q.com\nxn--z63a11k.com\nxn--zfr164b\nxn-ck.com\nxn0.cc\nxn121.com\nxna8.com\nxnara.org\nxnb.me\nxncjdx.com\nxndm.tech\nxndqfw.com\nxndxfz.com\nxndyyljt.com\nxnfyy.com\nxngjbus.com\nxnh123.com\nxnh98d9c32om.com\nxnhdgame.com\nxninja.org\nxnjcw.com\nxnjdcbs.com\nxnjxnz.com\nxnnpc.com\nxnongren.com\nxnparking.com\nxnpfs.com\nxnpic.com\nxns315.com\nxnsbdzb.com\nxnsdermyy.com\nxnsntr.com\nxnssy.com\nxnszlszgs.com\nxntg.com\nxntt.com\nxntv.tv\nxnw.com\nxnw19.vip\nxnwan.com\nxnwatch.com\nxnwbw.com\nxnwmw.com\nxnxy120.com\nxny365.com\nxnyauto.com\nxnye.net\nxnytjt.com\nxnzjxx.com\nxnzn.net\nxnzxyy.com\nxnzyyy.com\nxo58tjrol4.work\nxoao.com\nxoliao.com\nxooooa.com\nxopenbeta.com\nxorlink.com\nxorpay.com\nxoso13.com\nxoso57.com\nxoso64.com\nxoso94.com\nxoso96.com\nxoss.co\nxoudou.com\nxox717.com\nxox848.com\nxoxv.net\nxoxxoo.com\nxoyo.com\nxoyobox.com\nxoyocdn.com\nxoyq.net\nxp3366.com\nxp535.com\nxp6000.com\nxp61.com\nxp666.com\nxp811.com\nxp9365.com\nxp94.com\nxpaper.com\nxpaper.net\nxpccdn.com\nxpcdz.com\nxpcha.com\nxpchina.net\nxpdf.net\nxpeae.com\nxpeng.link\nxpf.cc\nxpgod.com\nxpgps.cc\nxphcn.com\nxpj0066.com\nxpj8857.com\nxpjis.com\nxpkjpk.com\nxpkongqipao.com\nxplaymobile.com\nxppjzs.com\nxpsheying.com\nxpsup.com\nxpsy.net\nxptt.com\nxpu93.com\nxpw888.com\nxpwin7.com\nxpykjsws.com\nxpyouxi.com\nxpyx.net\nxpzsgc.com\nxq0356.com\nxq0757.com\nxq2024.com\nxq5.com\nxq668.com\nxqb24.com\nxqbase.com\nxqblog.com\nxqbssj.com\nxqce.com\nxqckg.com\nxqdgroup.com\nxqdjkwz.com\nxqebp.org\nxqfunds.com\nxqgmx.com\nxqhuyu.com\nxqhzw.org\nxqipu.com\nxqishuta.com\nxqiushu.com\nxqjmzc.com\nxqjs.net\nxqllaser.com\nxqltzp.com\nxqmdc.com\nxqmice.com\nxqnmz.com\nxqpharma.com\nxqppt.com\nxqsbw.com\nxqshe.com\nxqship.com\nxqu5.com\nxqyake.com\nxqyk024.com\nxqymuy.com\nxqypay.com\nxr100.net\nxrain.net\nxray.cool\nxrbulk.com\nxrcch.com\nxrccp.com\nxrdyl.com\nxrdzidonghua.com\nxredu.com\nxrender.com\nxresgrbw.com\nxrhhg.com\nxrichengapp.com\nxrjjk.com\nxrkapp.com\nxrkcdn.com\nxrkmonitor.com\nxrlmold.com\nxrpyq.com\nxrqh.com\nxrso.com\nxrunda.com\nxrvm.com\nxrwf66.com\nxrxr.xyz\nxrxx365.com\nxrzdsp.com\nxrzhg.com\nxrzww.com\nxs-ir.com\nxs-servers.com\nxs058.com\nxs3cnc.com\nxs52.com\nxs63.info\nxs7.cc\nxs7.com\nxs7.la\nxs920.com\nxs9999.com\nxsa239.com\nxsappxz.com\nxsb120.com\nxsbja.com\nxsbus.com\nxscbs.com\nxschu.com\nxschuban.com\nxscp03150xq.com\nxscxzcz.com\nxsdma.com\nxsdmr.com\nxsdnjl.com\nxsdoudou.com\nxsdwk.com\nxsee.cc\nxsesc.com\nxsfaya.com\nxsfc.com\nxsgame.net\nxsgame99.com\nxsgongju.com\nxsgtvacct.com\nxshellcn.com\nxshengyan.com\nxshenshu.com\nxshhotels.com\nxshkvip.com\nxshmzz.com\nxshntc.com\nxshouyou.com\nxshr.com\nxshrcw.com\nxshts.com\nxshuai.com\nxshubao.org\nxshuma.com\nxshuoba.com\nxshuoshuo.com\nxsignal-ft.com\nxsina.net\nxsinger.me\nxsj21.com\nxsjedu.org\nxsjgzbdf.com\nxsjit.com\nxsjk.net\nxsjny.com\nxsjom.com\nxsjplm.com\nxsjrc.com\nxsjs-cifs.com\nxsjtxt.com\nxsjwyx.com\nxsjxyedu.com\nxsjzsy.com\nxskb.org\nxskhome.com\nxskjw.com\nxslb.me\nxslb.net\nxslmed.net\nxsm818.com\nxsmaofa.com\nxsmart.com\nxsmart.link\nxsmoe.com\nxsn168.com\nxsnow.net\nxsnsyh.com\nxsool.com\nxsp0311.com\nxsphs.com\nxspinfo.com\nxspio.com\nxsqzyyy.com\nxsrm.com\nxsrtvu.com\nxss.tv\nxssc8888.com\nxssdcdn.com\nxsser.date\nxsshuku.com\nxsskc.com\nxsslyjt.com\nxssz.net\nxsteach.com\nxsti.net\nxstnet.com\nxstqj.com\nxsttop.com\nxstv.net\nxstx.info\nxstzgs.com\nxsui.com\nxsuweb.com\nxswang.com\nxswdcasting.com\nxsxgjsw.com\nxsxlt.com\nxsxzls.com\nxsy-edu.com\nxsy.science\nxsycps.com\nxsyeli.com\nxsyk021.com\nxsyq.cc\nxsyx.xyz\nxsyxsc.com\nxsyydtfy.com\nxsyzdl.com\nxszhuan.com\nxszrcw.com\nxszsw.com\nxszww2.com\nxszww8.net\nxt-gas.com\nxt-kp.com\nxt-luyou.com\nxt-rent.com\nxt-shipping.com\nxt12333.com\nxt3yy.com\nxt700.com\nxt7p.com\nxtadmins.com\nxtaike.com\nxtal.cc\nxtao.me\nxtbank.com\nxtc-edu.com\nxtcaq.com\nxtcfjt.com\nxtcrm.com\nxtdj.cc\nxtedu.com\nxtep.com\nxthinking.net\nxthtc.com\nxthyjt.com\nxtiai.com\nxtianlang.com\nxtibet.com\nxtingcloud.com\nxtion.net\nxtjc.com\nxtjcxh.org\nxtjky.com\nxtjlyy.com\nxtjob.net\nxtjsxy.net\nxtjtjs.com\nxtlexueu.com\nxtlog.com\nxtmit.com\nxtmtrj.com\nxtomp.com\nxtong-solar.com\nxtongs.com\nxtoobmo.xyz\nxtransfer.com\nxtrapowercn.com\nxtrc.net\nxtrunc.com\nxtsfuke.com\nxttaff.com\nxttblog.com\nxttz.com\nxtu2.com\nxtuan.com\nxtuos.com\nxtutoring.com\nxtw-system.com\nxtwzyx.com\nxtx6.com\nxtxbemp.xyz\nxtxcm.com\nxtxh.net\nxtxnxk.sbs\nxtylxx.com\nxtyyw.com\nxtzdc.com\nxtzhiliji.com\nxtzjup.com\nxtzpw.com\nxtzy.com\nxu1s.com\nxu42x.net\nxu8.fun\nxu97.vip\nxuan5.com\nxuanba.com\nxuancaizi.com\nxuanceo.com\nxuancheng.org\nxuanchuanyi.com\nxuandan.com\nxuandecarpet.com\nxuanfengge.com\nxuanhaikuwan.com\nxuanhao.com\nxuanhk.com\nxuanhuange.com\nxuanhuange.net\nxuanjigame.com\nxuanjingcn.com\nxuanjutong.com\nxuanke.com\nxuankuge.com\nxuanliw.com\nxuanma.com\nxuannaer.com\nxuanqii.com\nxuanquge.com\nxuanqun.com\nxuanruanjian.com\nxuanshi.link\nxuanshitou.com\nxuanshu.com\nxuanshu.org\nxuansiwei.com\nxuantaikeji.com\nxuanteng.org\nxuanwifi.com\nxuanwonainiu.com\nxuanwu88.com\nxuanwumobile.com\nxuanwww.com\nxuanxiaodi.com\nxuanxiaozhuanjia.com\nxuanxuan.com\nxuanxuangame.com\nxuanxue.com\nxuanxuewang.com\nxuanyang888.com\nxuanyge.info\nxuanyouwang.com\nxuanyuan.cloud\nxuanyuan.run\nxuanyuancode.com\nxuanyuanhuangdi.org\nxuanyuans.com\nxuanyuanzjy.com\nxuanyusong.com\nxuanyutech.com\nxuanzhi.com\nxuanzhuanmumatuwen.com\nxuavieres.com\nxubei.com\nxuchencq.com\nxuchuang.com\nxucongbaobao.com\nxudan123.com\nxudankeji.com\nxudong8.com\nxudongfood.com\nxudoodoo.com\nxue.net\nxue114.com\nxue126.com\nxue138.com\nxue163.net\nxue51.com\nxue63.com\nxue8nav.com\nxue99.com\nxueanquan.com\nxueba100.com\nxuebaclass.com\nxuebaike.net\nxuebangsoft.com\nxuebapan.com\nxuebawang.net\nxuecaijie.com\nxuecan.net\nxueche.com\nxueche.net\nxuechebu.com\nxuechela.com\nxuechu123.com\nxuecoo.com\nxueda.com\nxuedao.com\nxuedapei.com\nxuedi.com\nxuedingmiao.com\nxuedong97.com\nxuedou.com\nxueepay.com\nxueersi.com\nxueersibook.com\nxueerxing.com\nxueeu.com\nxuefa.com\nxuefeiji.org\nxuefenxi.com\nxuefo.com\nxuefo.net\nxuefoxue.com\nxuegaogame.com\nxuegaogg.com\nxuegeshui.com\nxuegongkong.com\nxuegui.net\nxueguoedu.net\nxuehai.net\nxuehaiwu.com\nxuehuacdn.com\nxuehui.com\nxuehuile.com\nxuehuiwang.com\nxueid.com\nxueit.com\nxuejia123.com\nxuejian.site\nxuejiaoso.com\nxuejiqiao.com\nxuekanba.com\nxuekao.com\nxuekao123.com\nxuekeedu.com\nxuekewang.com\nxuekuaiji.com\nxuekubao.com\nxuekuibang.shop\nxuelangapp.com\nxuele.net\nxueleku.com\nxuelema.com\nxueleyun.com\nxueli9.com\nxueliedu.com\nxuemh.com\nxueming.li\nxuenarui.com\nxuenb.com\nxuepaijie.com\nxuepaipai.com\nxuepingx.com\nxuepojie.com\nxueqian.com\nxueqinji.com\nxueqiu.com\nxueqiu360.com\nxuerong.com\nxuesai.net\nxuesax.com\nxuesexs.com\nxueshanlinghu.com\nxuesheng.com\nxueshiyun.com\nxueshu.com\nxueshu5.com\nxueshuda.com\nxueshujia.com\nxueshut.com\nxueshuwenhai.com\nxuesidaojiajiao.com\nxuesongshuwood.com\nxuesw.com\nxuetangonline.com\nxuetangx.com\nxuetengedu.com\nxuetianli.com\nxuetimes.com\nxueto.com\nxuetongw.com\nxuetu.net\nxueui.com\nxuewangshang.com\nxuewangzhan.com\nxuewangzhan.net\nxuewei360.com\nxueweigui.com\nxueweijiema.com\nxuewennet.com\nxuewenya.com\nxuexb.com\nxuexi.la\nxuexi199.com\nxuexi365.com\nxuexi365.net\nxuexi612.com\nxuexi613.com\nxuexi616.com\nxuexi637.com\nxuexi665.com\nxuexi682.com\nxuexi683.com\nxuexi684.com\nxuexi707.com\nxuexi719.com\nxuexi721.com\nxuexi725.com\nxuexi727.com\nxuexi733.com\nxuexi734.com\nxuexi782.com\nxuexi784.com\nxuexi786.com\nxuexi806.com\nxuexi807.com\nxuexi823.com\nxuexi824.com\nxuexi825.com\nxuexi826.com\nxuexi827.com\nxuexi828.com\nxuexi829.com\nxuexi848.com\nxuexi851.com\nxuexi859.com\nxuexi860.com\nxuexi861.com\nxuexi863.com\nxuexi864.com\nxuexiaodaquan.com\nxuexiaozhaopin.com\nxuexibao.com\nxuexicha.com\nxuexicn.com\nxuexigang.com\nxuexili.com\nxuexin365.com\nxuexinjiaoshi.com\nxuexito.com\nxuexitong.com\nxuexiuwang.com\nxuexiwa.com\nxuexizhiwang.com\nxuexizoo.com\nxuexun.com\nxueyanshe.com\nxueyiyun.com\nxueyou.org\nxueyuhuangjinyan.com\nxuezeshi.com\nxuezhangbb.com\nxuezhangya.com\nxuezhao.space\nxuezhishi88.com\nxuezhiyou.com\nxuezhouyi.com\nxuezizhai.com\nxufa315.com\nxugaoyang.com\nxugt.com\nxuguang.net\nxuguangwangluo.com\nxuhaijun.pw\nxuhe56.com\nxuheen.com\nxuhenghandicraft.com\nxuhongjx.com\nxuhuihs.com\nxujc.com\nxuji.co\nxujianhua.com\nxujiepack.com\nxujingkj.com\nxujinhuancaishui.com\nxujun.org\nxuka.com\nxukou.net\nxulaoshi68.com\nxuld.net\nxulihang.me\nxuliutian.com\nxulizui6.com\nxumenger.com\nxumengwang.com\nxumingxiang.com\nxumucloud.com\nxumurc.com\nxumuren.com\nxumuzx.com\nxun-gou.com\nxun321.com\nxunbang.com\nxunbao178.com\nxunbaozhifu.com\nxunbf.com\nxunbin.com\nxunbo.net\nxunchabing.com\nxunchanggroup.com\nxundasemi.com\nxundayun.com\nxundekai.com\nxundiesoft.com\nxundns.com\nxundns.net\nxundupdf.com\nxunerjie.com\nxunfan.net\nxunfang.com\nxunfeia.com\nxunfeib.com\nxunfeivr.com\nxunfeiwl.com\nxunfeixxj.com\nxungejiang.com\nxungou.com\nxungou5.com\nxunguagua.com\nxunguanggame.com\nxunhuai.com\nxunhuanshuibeng.com\nxunhupay.com\nxunhuweb.com\nxunicard.com\nxunihao.net\nxuniquan.com\nxunjiecad.com\nxunjiefanyi.com\nxunjiepdf.com\nxunjieshipin.com\nxunjietupian.com\nxunjk.com\nxunkids.com\nxunlanchina.com\nxunlei.com\nxunlei.net\nxunleioa.com\nxunlew.com\nxunliandata.com\nxunlianip.com\nxunlong.net\nxunlong.tv\nxunlongsoft.com\nxunlu-led.com\nxunlugame.com\nxunmai888.com\nxunmall.net\nxunmei.net\nxunmeinet.com\nxunmengtu.com\nxunpaibao.com\nxunqinji.net\nxunrenzhaoren.com\nxunruicms.com\nxunruns.com\nxunsearch.com\nxunshi.cc\nxunsho.com\nxunshou.com\nxunsl.com\nxunsn.com\nxunsns.com\nxunta.mobi\nxuntongwuxian.com\nxuntou.com\nxuntou.mobi\nxuntuoguan.com\nxunurl.com\nxunvision.com\nxunw.shop\nxunwan.com\nxunwangba.com\nxunwei.tm\nxunweihc.com\nxunxi.com\nxunxiang.site\nxunxu.com\nxunyangzaixian.com\nxunye1975.com\nxunyou.com\nxunyou.mobi\nxunyouyw.com\nxunyuan1314.com\nxunyun.com\nxunzai.com\nxunzhuang.net\nxuooo.com\nxupai.com\nxupea.com\nxupernode.com\nxupertves.com\nxuprinter.com\nxupu.name\nxupu120.com\nxupupifu.com\nxuqijt.com\nxuqyfw.com\nxuruowei.com\nxushenghb.com\nxushunda.com\nxusplastic.com\nxussb.com\nxusss.com\nxuvol.com\nxuweidj.com\nxuwenliang.com\nxuxian.com\nxuxian.me\nxuxiang.com\nxuxueli.com\nxuxusheng.com\nxuyalipin.com\nxuyangny.com\nxuyanmaoyi.com\nxuyechem.com\nxuyi.net\nxuyongrongmei.com\nxuyu56.com\nxuyueswkj.com\nxuyunjt.com\nxuzai.com\nxuzhi.net\nxuzhoufabu.com\nxuzhoujob.com\nxuzhouma.com\nxuzhoumuseum.com\nxuzhounano.com\nxuzhousports.com\nxuzhouwater.com\nxuzpazms.com\nxv5.com\nxvacuum.com\nxvcdmo.com\nxvhttu3c9.com\nxvista.com\nxvjhzuc.com\nxvnez.org\nxvuikerk.com\nxvwprdk.com\nxw-chip.com\nxw-planning.com\nxw-scm.com\nxw1806.com\nxw360.com\nxw365.com\nxw501.com\nxwabx.com\nxwadv.com\nxwamp.com\nxwan.com\nxwb8.com\nxwbank.com\nxwcbgg.com\nxwcx6.com\nxwcx666.com\nxwcxgroup.com\nxwdsp.com\nxweb.vip\nxwei.tv\nxwfintech.com\nxwfls.com\nxwfruits.com\nxwg.cc\nxwgl.cc\nxwhb.com\nxwhodesign.com\nxwhosp.org\nxwinvip.com\nxwjqr.com\nxwjr.com\nxwjy.org\nxwkjcms.com\nxwlcdfactory.com\nxwlxw.com\nxwmyw.com\nxwog.com\nxwood.net\nxwpbj.com\nxwpx.com\nxwscg.com\nxwshensuofeng.com\nxwtcmh.com\nxwtele.com\nxwuad.com\nxwuorvhz.com\nxwx.mobi\nxwxguan.com\nxwxwh.com\nxwy-powder.com\nxwylhh.com\nxwyun.net\nxwzc.net\nxwzxldfx.com\nxx-industrial.com\nxx-motor.com\nxx-sapce.com\nxx007.com\nxx186.com\nxx4a.com\nxx5515.com\nxx7z.co\nxx8g.com\nxxahsk.com\nxxaks01080sspao.xyz\nxxaks01081sspao.xyz\nxxart.net\nxxbiquge.com\nxxbmm.com\nxxbt.com\nxxcang.com\nxxccx.com\nxxcig.com\nxxcipharm.com\nxxcmw.com\nxxdao.com\nxxeden.com\nxxedu123.com\nxxfbiaa.xyz\nxxfqc.com\nxxgd888.com\nxxghh.biz\nxxgzz.com\nxxhd-tech.com\nxxhnanke.com\nxxhrd.com\nxxinficity.com\nxxingclub.com\nxxir.com\nxxjdns.com\nxxjqgs.com\nxxjrjxc.com\nxxjzg.com\nxxka.com\nxxkapp.com\nxxkucun.com\nxxkxjx.net\nxxkxw.net\nxxlcn.com\nxxlifexx.com\nxxliudsp.com\nxxlsmqzs.com\nxxlwin.com\nxxmac.com\nxxmyf.com\nxxnet.vip\nxxnets.net\nxxnmjx.com\nxxoojoke.com\nxxorg.com\nxxparking.com\nxxpay.vip\nxxpie.com\nxxpkg.com\nxxptcs.com\nxxpysc.com\nxxqb5200.net\nxxqipai.com\nxxqun.com\nxxrjm.com\nxxrmyy.net\nxxrsm.com\nxxrxfilter.com\nxxs8.com\nxxsb.com\nxxsfjx.com\nxxshell.com\nxxshu.com\nxxspd.com\nxxsrmyy.com\nxxsy.com\nxxsy.net\nxxsypro.com\nxxszxw.net\nxxtaotao.com\nxxtiao.com\nxxtjdz.com\nxxtlw.com\nxxtmail.com\nxxw001.com\nxxwmy.com\nxxwolo.com\nxxwxf.com\nxxx1577.com\nxxxbiquge.com\nxxxcsf.com\nxxxedu.net\nxxxfeng.com\nxxxhhh.com\nxxxmeng.com\nxxxx68xxxx.com\nxxxx88xxxx.com\nxxxx92xxxx.com\nxxxx96xxxx.com\nxxxxxx6.com\nxxxzzlm.org\nxxycw.com\nxxyeyan.com\nxxyfgy.com\nxxyhzd.com\nxxykgl.com\nxxymdy.com\nxxymw.com\nxxyo.com\nxxys2023.com\nxxyw.com\nxxyx.ltd\nxxyy.co\nxxyzh.net\nxxzfgjj.com\nxxzhushou.com\nxxzmz.com\nxxzrs.xyz\nxxzsgame.com\nxy-365.com\nxy-asia.com\nxy-ddh.com\nxy-dgyx.com\nxy-display.com\nxy-invite.com\nxy-mp.com\nxy-technology.com\nxy.com\nxy007.net\nxy120.net\nxy1212.com\nxy1758.com\nxy178.com\nxy3000.com\nxy36z.com\nxy3yy.com\nxy58.net\nxy599.com\nxy980.net\nxyb2b.com\nxybch123.com\nxybhdy.com\nxybj365.com\nxybsyw.com\nxybtv.com\nxybygc.com\nxybygw.com\nxycad.com\nxycaogen.com\nxycareer.com\nxycclass.com\nxycdn.com\nxycdn.net\nxycgd.com\nxychyy.com\nxycloud.com\nxyclouds.com\nxycms.com\nxycsq.com\nxyctgroup.com\nxycwei.com\nxycyky.com\nxyda.cc\nxydcname.com\nxydcname.net\nxydhl.com\nxydpay.com\nxydxcloud.com\nxydyfy.com\nxydz08.com\nxyebbs.com\nxyeidc.com\nxyeyy.com\nxyf6.com\nxyfc.com\nxyfcw.com\nxyffsb.com\nxyffvip.com\nxyfinechem.com\nxyfish.com\nxyfsy.com\nxyg100.com\nxygdcm.com\nxygmed.com\nxygre.com\nxygsjt.com\nxygt666.com\nxygtea.com\nxygulou.com\nxygwh.cc\nxyh2021.com\nxyhc.com\nxyhis.com\nxyhjd168.com\nxyhlcd.com\nxyhospital.com\nxyhqsh.com\nxyhtml5.com\nxyhygs.com\nxyict.com\nxyimg.net\nxyj.link\nxyj321.com\nxyj618.com\nxyjbglass.com\nxyjj99.com\nxyjs999.com\nxyjtzz.com\nxyjuyuan.com\nxyjy.net\nxyjyjt.com\nxyjyy.net\nxykgjt.net\nxykmovie.com\nxyktjt.com\nxyl2002.com\nxylh888.com\nxylhwdu.com\nxylink.com\nxylive.tv\nxylll.com\nxylmf.com\nxymfqb.com\nxymj.xyz\nxymlcs.com\nxynbnb.com\nxynetweb.com\nxyngas.com\nxyniubi.com\nxynsh.com\nxyookj.com\nxyous.com\nxypifu.com\nxyppzx.com\nxypse.com\nxyqb.com\nxyqczy.com\nxyqmall.com\nxyqxr.com\nxyqy88.com\nxyrbszb.com\nxyre.com\nxyriaf.work\nxyrsks.com\nxyrtv.com\nxysb.com\nxysdyrmyygw.com\nxyshoppingbag.com\nxyshu8.com\nxyshuk.com\nxysjg.com\nxysmart.com\nxysstgs.com\nxystatic.com\nxystoy.com\nxyswychgs.com\nxysy.com\nxysyzx.com\nxyszxyy.com\nxyt-tech.com\nxytcw.vip\nxytfy.com\nxytiyu.com\nxytjcpj.com\nxytsoft.com\nxytsw.com\nxytzg.com\nxytzjt.com\nxyuncloud.com\nxyunjiasu.com\nxyunqi.com\nxyusk.com\nxyvcard.com\nxyvcpe.com\nxyvend.com\nxyvending.com\nxyw-wifi.com\nxyw.com\nxywclass.com\nxywlhlh.com\nxywm.com\nxywy.com\nxywyfw.com\nxywzs.com\nxyx234.com\nxyx3d.com\nxyxcables.com\nxyxdie.com\nxyxrmt.com\nxyxsc.com\nxyxsns.com\nxyxsw.ltd\nxyxww.com\nxyxy.net\nxyxy01.com\nxyxyzz.com\nxyxza.com\nxyy001.com\nxyyao.com\nxyyb.net\nxyybs.com\nxyydnode.com\nxyyh.xyz\nxyyksy.com\nxyykt.org\nxyyl.com\nxyyuan.fun\nxyyuedu.com\nxyyx82.com\nxyyy999.com\nxyyzi.com\nxyz-jm.com\nxyz1412.net\nxyzcdn.net\nxyzcn.com\nxyzdict.com\nxyzdns.xyz\nxyzele.com\nxyzfm.link\nxyzfm.space\nxyzggg.com\nxyzimo.com\nxyzkj.xyz\nxyzmdzs.com\nxyzmovie.net\nxyzop.com\nxyzs.com\nxyzshouji.com\nxyzspeaker.com\nxyzsq.com\nxyzttt.xyz\nxyzvo.com\nxyzywl.com\nxz-juming.com\nxz-soft.com\nxz.com\nxz325.com\nxz3733.com\nxz3z.com\nxz6.com\nxz6699.com\nxz66gxnnjyl.com\nxz6y.com\nxz7.com\nxz7899.com\nxz8.com\nxzairport.com\nxzaz.com\nxzb360.com\nxzbaorun.com\nxzbco.com\nxzbhfk.com\nxzbu.com\nxzbzq.com\nxzcblog.com\nxzcbxg.com\nxzccjt.com\nxzcdc.com\nxzcet.com\nxzcjyjt.com\nxzcoder.com\nxzcr.com\nxzcykg.com\nxzdabyw.xyz\nxzdag.com\nxzdfcd.com\nxzdfyy.com\nxzdtjt.com\nxzep.net\nxzepa.com\nxzfenghe.com\nxzfesco.com\nxzfhhz.com\nxzfile.com\nxzfwzl.com\nxzgdsf.com\nxzggjyzpw.com\nxzgj.com\nxzgjj.com\nxzgqm.com\nxzgtjt.com\nxzgxwq.com\nxzhh966888.com\nxzhhbfesco.com\nxzhichang.com\nxzhizao.com\nxzhlz.com\nxzhome.com\nxzhpck.com\nxzhyjsjt.com\nxzhzkd.com\nxzis.org\nxzjhgt.com\nxzjiufa.com\nxzjsxy.com\nxzjtkg.com\nxzjy.net\nxzkd.com\nxzking.com\nxzkssb.com\nxzksyy.com\nxzkwjtzyy.com\nxzkx.com\nxzldbl.com\nxzlgjt.com\nxzlogo.com\nxzlres.com\nxzlsqy.com\nxzltrq.com\nxzltzc.com\nxzlzf.com\nxzm56.com\nxzmai.com\nxznqcc.com\nxznqnews.com\nxzoo.org\nxzpf110.com\nxzpm.com\nxzpoll.com\nxzport.com\nxzpxrc.com\nxzqh.org\nxzqixing.com\nxzqrmyy.com\nxzqxj.com\nxzrbw.com\nxzrcfc.com\nxzrcyy.com\nxzrdwq.com\nxzriit.com\nxzsckj.com\nxzsdszx.com\nxzsdyyy.com\nxzsec.com\nxzsis.com\nxzskfyy.com\nxzsmartmetro.com\nxzsmlq.com\nxzsnw.com\nxzstatic.com\nxzsthj.com\nxzsw.net\nxzswjt.com\nxzszb.net\nxzszjt.com\nxztcm.com\nxztdesign.com\nxztsjf.com\nxztzb.com\nxzuan.com\nxzvfd.xyz\nxzw.com\nxzw.pw\nxzwanda.com\nxzwhg.com\nxzwhlyjt.com\nxzwy.com\nxzwyxh.com\nxzx.com\nxzxjkyy.com\nxzxkjd.com\nxzxw.com\nxzxx.com\nxzxxlcp.com\nxzyhealth.com\nxzyituo.com\nxzyjl.com\nxzynyy.com\nxzzh.com\nxzzhbsq.com\nxzzhongye.com\nxzzhtc.com\nxzzlyy.com\nxzzp.net\nxzztly.com\nxzzulin.com\ny-feng.com\ny-i-y.com\ny-lotus.com\ny-os.net\ny.to\ny007.com\ny1995.com\ny1v.com\ny2002.com\ny2531.com\ny3pm.com\ny5000.com\ny55l6.com\ny56.com\ny5663.com\ny5api.com\ny5coin.com\ny5kfpt.com\ny5news.com\ny5store.com\ny617.com\ny67.net\ny77.cc\ny78r.com\ny80s.com\ny8cyx6fvyxk3hs.com\ny8l.com\ny92ft2vz.com\nya-bo888.com\nya-marathon.com\nya17.com\nya19si8.lol\nya247.com\nyab44.com\nyabais.com\nyabaite.com\nyabandpay.com\nyabang-qhpharm.com\nyabet03.com\nyabet08.com\nyabet888.com\nyabet99.com\nyabo.com\nyabo00.com\nyabo0000.com\nyabo016.com\nyabo023.com\nyabo063.com\nyabo072.com\nyabo077.com\nyabo083.com\nyabo085.com\nyabo098.com\nyabo159.com\nyabo170.com\nyabo189.com\nyabo199.com\nyabo2025.com\nyabo552.com\nyabo593.com\nyabo602.com\nyabo64.com\nyabo6600.com\nyabo691.com\nyabo70.com\nyabo75.com\nyabo7755.com\nyabolive.com\nyaboo-cn.com\nyaboshi0777.com\nyabyy.com\nyac8.com\nyace17.com\nyachtsinchina.com\nyacol.com\nyacou.net\nyacto-tech.com\nyadancoffee.org\nyadao8.com\nyadashi.com\nyadatong.net\nyadilite.com\nyadingtour.com\nyadongjf.com\nyadran.com\nyadugroup.com\nyadunyun.com\nyaduo.com\nyaeherhealth.com\nyaersen.com\nyaexun.com\nyaeyy.com\nyafangyiyuan.com\nyafco.com\nyafdev.com\nyafeilinux.com\nyafshb.com\nyago-mall.com\nyahacode.com\nyahaha.net\nyahaizi.com\nyahanmr.com\nyahboom.com\nyahong-mold.com\nyahoo001.com\nyahuayunshu.com\nyahuhost.com\nyahui.cc\nyahui.hk\nyahuishou.com\nyahunet.com\nyahxxcl.com\nyaimg.com\nyaitest.com\nyaiyuan.com\nyajxc.com\nyake123.com\nyake5.com\nyakgamer.com\nyakjhfh.com\nyakool.com\nyakup.info\nyalayi.com\nyalayi.net\nyalewoo.com\nyalianedu.com\nyaliaojie.com\nyalikongzhi.com\nyaling8.com\nyalishiyanji.com\nyalj.net\nyalongbay.net\nyalqq8976.com\nyamaijia.net\nyameisj.com\nyamibo.com\nyamoke.com\nyan-grh.com\nyan-jian.com\nyan678.com\nyanagou.net\nyananpharm.com\nyanbaike.com\nyanbaohui.com\nyanbaolong.com\nyanbeige.com\nyanbinghu.com\nyanbm.com\nyanbmn.com\nyanboyuan.com\nyance.wiki\nyanchebang.com\nyancheng-culture.com\nyanchengdj.com\nyanchengjtgz.com\nyanchengzx.com\nyanchupiao.com\nyanchupiaojia.com\nyanchupiaowu.com\nyandaco.com\nyandianying.com\nyanding.com\nyandui.com\nyanduyiyuan.com\nyanedu.com\nyanfabu.com\nyanfen.online\nyanfeng.com\nyanfengauto.com\nyanfukun.com\nyang99.fun\nyangbentong.com\nyangbinlvshi.com\nyangchanji.com\nyangchenghudzx.com\nyangchenglianhe.com\nyangcheyongche.com\nyangchunjian.com\nyangcong.com\nyangcong345.com\nyangcongchufang.com\nyangdongjia.com\nyangfannie.com\nyanggang-group.com\nyanggeng.com\nyanggu.tv\nyangguangxinye.com\nyangguanjun.com\nyangguiweihuo.com\nyanghd.com\nyanghong.art\nyanghuaxing.com\nyangji.com\nyangjibao.com\nyangjie.li\nyangjigroup.com\nyangjinyou.com\nyangjisen.com\nyangk6668.com\nyangkeduo.com\nyangki.net\nyangkun.net\nyanglaocn.com\nyanglaofuwu365.com\nyanglaotiandi.com\nyanglee.com\nyangli.com\nyangliping.com\nyangliq.com\nyanglong.pro\nyangluojob.com\nyangmao.info\nyangmi.net\nyangmingauction.com\nyangner.com\nyangnongchem.com\nyangoo-global.com\nyangpanzg.com\nyangqi.show\nyangqianguan.com\nyangqimanhua.com\nyangqq.com\nyangqu.com\nyangsam.com\nyangsan.work\nyangsensheng.com\nyangshengliang.com\nyangshengtang123.com\nyangshengtv.com\nyangshijz.com\nyangshuolvyou.com\nyangsihan.com\nyangstandards.com\nyangtai.com\nyangtaiapp.com\nyangtao.site\nyangtaolujiu.com\nyangtengfei.com\nyangtianb.com\nyangtong.com\nyangtse-automobile.com\nyangtse.com\nyangwajia.com\nyangwang.pw\nyangwangauto.com\nyangwc.com\nyangwenlong.org\nyangwenqing.com\nyangxiang.com\nyangxiangdb.com\nyangxingzhen.com\nyangxinren.com\nyangyangad.com\nyangyangla.com\nyangyanxing.com\nyangyi.vip\nyangyi02.com\nyangyi08.com\nyangyi09.com\nyangyi13.com\nyangyi19.com\nyangyingming.com\nyangyivacuum.com\nyangyongquan.com\nyangyq.net\nyangzhe1991.org\nyangzhengfang.com\nyangzhi777.com\nyangzhihb.com\nyangzhiriji.com\nyangzhix.com\nyangzhongchao.com\nyangzhoutuozhan.com\nyangzhouyiyuan.com\nyangzhu360.com\nyangziclean.com\nyangzijiang.com\nyangziwater.com\nyangzw.vip\nyanhaijing.com\nyanhuamedia.net\nyanhuoidc.com\nyaniu.net\nyanjiao.com\nyanjiaoapp.com\nyanjiaoweixin.com\nyanjinews.com\nyanjingge.com\nyanjiubaogao.com\nyanjiuchubanshe.com\nyanjiusuo.cc\nyanjob.com\nyanjun7858.com\nyanjunbo.com\nyankay.com\nyanke360.com\nyankon.com\nyankong.com\nyanliang.com\nyanliaofang.work\nyanlong.shop\nyanmaiyingyu.com\nyannv.com\nyanoda.com\nyanpengjk.com\nyanpk.com\nyanqiao.com\nyanqingshan.com\nyanqueai.com\nyanrongyun.com\nyanshanmuyuan.com\nyanshanpump.com\nyanshaoutlets.com\nyanshihua.com\nyanshimei.com\nyanshishuo.com\nyanshuoshi.com\nyansx.com\nyanta.cc\nyantai-chuanpiao.com\nyantaibank.net\nyantaihr.com\nyantaijintai.com\nyantailuoshuan.com\nyantaiport.com\nyantaitech.com\nyantan.cc\nyantangmilk.com\nyantao.wiki\nyantaparking.com\nyantaqu.com\nyantian-port.com\nyantu360.net\nyantubao.com\nyantubbs.com\nyantuchina.com\nyantudq.com\nyanue.net\nyanweihappybirthday.com\nyanwugroup.com\nyanxian.org\nyanxianggroup.com\nyanxintong.com\nyanxishe.com\nyanxiu.com\nyanxizhu.com\nyanxurui.cc\nyanyapeng.com\nyanyib2b.com\nyanyidakaoyan.com\nyanyijingling.com\nyanyin.tech\nyanyiquan.com\nyanyiwu.com\nyanyizc.com\nyanyue.net\nyanyunmail.com\nyanzhaorc.com\nyanzhaowang.com\nyanzhihuisc.com\nyanzhiwu.com\nyanzhoulugang.com\nyao.com\nyao123.com\nyao51.com\nyaobo.net\nyaocai.com\nyaocaicang.com\nyaocaizhongzi.com\nyaocdn.com\nyaochengwang.com\nyaochentech.com\nyaochixie.com\nyaochufa.com\nyaocsoft.com\nyaodou.net\nyaodu365.com\nyaoex.com\nyaofangwang.com\nyaofangwang.net\nyaofei365.com\nyaoge123.com\nyaoguo.com\nyaohaixiao.com\nyaohuaglass.net\nyaohuascape.com\nyaohuiji.com\nyaohuo.me\nyaohuo168.com\nyaoji.center\nyaojibuyu.com\nyaojidsfee.com\nyaojiedianzi.com\nyaojigames.com\nyaojiuqq.com\nyaokaihui.com\nyaokantv.com\nyaokeke.com\nyaoky.com\nyaolaifen.com\nyaolan.com\nyaolandairy.com\nyaoliangmi.com\nyaoliwang.com\nyaolue.com\nyaolutong.com\nyaoluu.com\nyaomai666.com\nyaomaiche.com\nyaoman.net\nyaomv.com\nyaonano.com\nyaooxx.space\nyaopaiming.com\nyaopharma.com\nyaopinlenglian.com\nyaopinnet.com\nyaoq.net\nyaoqing.com\nyaoqun.net\nyaosai.com\nyaoshagroup.com\nyaoshanly.com\nyaoshimiaolianhua.com\nyaotia.com\nyaotiannano.com\nyaotongjn.com\nyaotou.com\nyaoudq.com\nyaoujc.com\nyaowan.com\nyaoxiaoyi.com\nyaoxuebang.com\nyaoxun.net\nyaoyaola.net\nyaoyedan.net\nyaoying.vip\nyaoyl.com\nyaoyouke.com\nyaozh.com\nyaozhigong.com\nyaozhizhu.com\nyaozs.com\nyaozui.com\nyapingkeji.com\nyapingtech.com\nyapp.com\nyaqilian.com\nyaqjyj.com\nyaristyle.com\nyarncm.com\nyarward.com\nyasee-zs.com\nyashili.com\nyashowmarket.com\nyasishuo.com\nyasiyasi.com\nyasking.org\nyasn.com\nyasudachem.com\nyasuotu.com\nyasyy.com\nyatai.com\nyataidianli.com\nyataifr.com\nyataiinsur.com\nyatailx.com\nyataimall.com\nyataioa.com\nyataohome.com\nyatebizhi.com\nyaterv.com\nyatiku.com\nyatiwang.com\nyato-sh.com\nyatsenglobal.com\nyatsoft.com\nyatv.tv\nyatyjx.com\nyaucn.com\nyauuy.com\nyawancaiwu.com\nyawbbs.com\nyawei.cc\nyaweijituan.com\nyawen8.com\nyawy.cc\nyaxi.net\nyaxiaodong.com\nyaxige.com\nyaxin888.com\nyaxinde.com\nyaxinghbkj.com\nyaxuntuhang.com\nyaya.love\nyayaad.com\nyayagushi.com\nyayawan.com\nyayeschool.com\nyayihouse.com\nyayiskq.com\nyayitianyun.com\nyayiyun.net\nyayjrj.com\nyayouapp.com\nyaypool.com\nyayu.net\nyayunjiqi.com\nyazhihg.com\nyazhijian.com\nyazhougoufang.com\nyazuo.com\nyazx.net\nyb-able.com\nyb1518.com\nyb1867.com\nyb3.cc\nyb983.com\nyb999.com\nyba120.com\nybaby.com\nybanj.com\nybaobx.com\nybaomall.com\nybbwy.com\nybbxkj.com\nybc1024.com\nybc35.com\nybccb.com\nybccode.com\nybcheck.com\nybchen.work\nybcjmarathon.com\nybcnjg.com\nybcxjd.com\nybcxz.com\nybdbz.com\nybdlogistic.com\nybe.net\nybfljs.com\nybgkz.com\nybgz.com\nybhdmob.com\nybi.net\nybirds.com\nybj.com\nybjjsgc.com\nybjsk.com\nybk001.com\nybk168.com\nybk6.com\nyblc.com\nyblcs.com\nyblry.com\nybm100.com\nybmedicine.com\nybmilkgoat.com\nybqysw.com\nybrc128.com\nybren.com\nybs120.com\nybscjp.com\nybscpqtlxx.com\nybsftd.com\nybsjyyn.com\nybstjs.com\nybstwl.com\nybsyyh.com\nybt168.com\nybtianshantu.com\nybtvyun.com\nybty.com\nybvip.com\nybvips.com\nybvv.com\nybw315.com\nybword.com\nybxww.com\nyby1953.com\nybyiot.com\nybynet.com\nybypark.com\nybzhao.com\nybznzz.com\nybzzgh.org\nyc-exp.com\nyc-gc.com\nyc-petronas.com\nyc-yinhe.com\nyc-zj.com\nyc0917.com\nyc123.com\nyc123.net\nyc12313.com\nyc222.com\nyc2e.com\nyc360.org\nyc370.com\nyc8.com\nyc9y.com\nycait.com\nycamlyy.com\nycandyz.com\nycangels.com\nycaqr.com\nycb.com\nycbiz.net\nycbright.com\nycbroker.com\nycbus.com\nycbus.net\nycc.ink\nyccdl.net\nyccdn.com\nyccn.cc\nycdext.net\nycdfby.com\nycdfwater.com\nycdongxu.com\nycdrh.com\nycdryy.com\nycduile.com\nycdz.shop\nycdzcc.com\nyceshop.com\nycfang.net\nycfanglei.com\nycfbapp.com\nycfggc.com\nycfog.com\nycfybj.com\nycfybjy.com\nycgame.com\nycgj.cc\nycgjxx.com\nycgslb.com\nycgwl.com\nycgzgame.com\nychanfang.com\nychap.com\nychcqmu.com\nychdzxsh.com\nychr.com\nychromedgeie.com\nychszh.com\nychxie.com\nychxiex.com\nycig.com\nycigilink.com\nyciou.com\nycis-bj.com\nycis-cq.com\nycis-schools.com\nycis-sh.com\nyciyun.com\nycjhjsbyy.com\nycjingweiranqi.com\nycjintou.com\nycjinze.com\nycjklrq.com\nycjljt.com\nycjob.com\nycjsxy.com\nycjt2007.com\nycjyjt.com\nycjzzsw.com\nyckceo.com\nyckceo.vip\nyckjzsq.com\nyckkdd.com\nycku.com\nycleaning.com\nyclh6.com\nycloud.online\nycloudlb.com\nycloudvip.com\nyclyq.com\nycmae.com\nycmlaw.com\nycmm.com\nycnaxin.com\nycnevpds.com\nycny.com\nycoa0898.com\nycool.com\nycpack.net\nycpai.com\nycpec.com\nycphkj.com\nycpinke.com\nycpsy.com\nycqin.com\nycqq.com\nycrcrs.com\nycrcw.net\nycrh.com\nycrkb.com\nycrusher.com\nycrx360.com\nycrysw.com\nycs120.com\nycscszh.com\nycsd.work\nycsdryy.com\nycsdyyy.com\nycshengquan.com\nycsjtjt.com\nycsound.com\nycsrc.com\nycsthqrmyy.com\nycsystem.com\nycsyy.com\nyct-tec.com\nyctdyy.com\nyctxrj.com\nycty.org\nyculblog.com\nycur.net\nycwalker.com\nycwb.com\nycwljt.com\nycxba.com\nycxdryy.com\nycxicmall.com\nycxiezhu.com\nycxinxi.com\nycxjtd.com\nycxm.com\nycxskw.com\nycxy.com\nycxzlsyxgs.com\nycyaw.com\nycyck.com\nycycut.com\nycyhzx.com\nycyjkj.com\nycym.com\nycypin.com\nycyunyuk.com\nycyz.com\nycyzwb.net\nyczbw.com\nyczfwy.com\nyczihua.com\nyczjkfyy.com\nyczk.org\nyczpw.com\nyczxyy.com\nyczy5.com\nyd-data.com\nyd-jxt.com\nyd-power.com\nyd-tec.com\nyd126.com\nyd166.com\nydadmob.com\nydalison.com\nydamc.com\nydayc.com\nydbimg.com\nydbmed.com\nydbox.com\nydc360.com\nydcb.com\nydce.com\nydcloud.cc\nyddsha2.com\nyddtiyu.com\nyddxkj.com\nydfeathers.com\nydfgq.com\nydgj2727.com\nydguolan.com\nydh.fun\nydhex.com\nydhexpress.com\nydhjj.com\nydhl.cc\nydhlaz11151.com\nydhn.com\nydht.com\nydhyfs.com\nydihi.com\nydimmi.com\nydjdcjc.com\nydjt1166.com\nydjt2288.com\nydjwy.net\nydjy.net\nydkj2019.com\nydl-sh.com\nydl.com\nydlcdn.com\nydlut.com\nydmel.com\nydmeng.com\nydmob.com\nydn5.com\nydnewmedia.com\nydniu.com\nydouu.com\nydr.me\nydsaso.com\nydscan.net\nydsjjs.com\nydsjpt.com\nydsrmyy.com\nydstatic.com\nydsyyy.com\nydt-express.com\nydt.link\nydtad.com\nydtbl.com\nydtnotary.com\nydtqd.com\nyduav.com\nydwatch.com\nydwgame.net\nydx2.com\nydxphb.com\nydxrf.com\nydxxt.com\nydyb.com\nydycdn.com\nydyeducation.com\nydyj.net\nydylcn.com\nydyljk.com\nydylmtytv.com\nydyspc.com\nydywh.shop\nydyy120.com\nydzxyjhyy.com\nydzz.com\nye1992.com\nye3.com\nye40.com\nyead.net\nyeah.net\nyeahka.com\nyeahnic.net\nyeahteen.com\nyeahworld.com\nyeai.com\nyealink.com\nyealinkvc.com\nyeaosound.com\nyeapcloud.net\nyearlygreen.com\nyearnfar.com\nyeastar.com\nyeasturias.com\nyebaike.com\nyebangyu.org\nyebaojiasu.com\nyebinnet.com\nyeboyzq.com\nyebrewing.com\nyecao.net\nyecaoyun.com\nyecdn.com\nyechangktv.com\nyechengmuye.com\nyedanguan365.com\nyedapi.com\nyedarc.com\nyedejia.com\nyedingding.com\nyedone.com\nyeduxiaoshuo.com\nyee5.com\nyee800.com\nyeeanbao.com\nyeeaoo.com\nyeeauto.com\nyeecai.com\nyeecin.com\nyeecloud.com\nyeedian365.com\nyeefeitrip.com\nyeefire.com\nyeefung.com\nyeefx.net\nyeekang.com\nyeekit.com\nyeelight.com\nyeelink.net\nyeelogo.com\nyeemei.com\nyeemen.com\nyeemiao.com\nyeemiao.net\nyeepay.com\nyeepaycdn.com\nyeepbank.com\nyeepiao.com\nyeesha.com\nyeetan.com\nyeeuu.com\nyeewo.net\nyeeyan.com\nyeeyan.org\nyeezon.com\nyefengs.com\nyegame.com\nyegaochemical.com\nyegenyou.com\nyegoo.com\nyegrand.com\nyegu168.com\nyeguohd.com\nyehoochina.com\nyehuisteel.com\nyeidc.com\nyeitu.com\nyejiangye.com\nyejibang.com\nyejienet.com\nyejuu.com\nyekyc.com\nyelanxiaoyu.com\nyelinmall.com\nyelishi.net\nyelixiali.com\nyellowjm.com\nyellowriver.org\nyelook.com\nyelot.com\nyemacaijing.com\nyemadai.com\nyemajun.com\nyemancomic.com\nyemaosheji.com\nyemaosoft.com\nyemayun.com\nyemeihuoguo.com\nyemeisy.com\nyemengstar.com\nyemet.com\nyemhj.com\nyenlex.com\nyentechnology.com\nyeolar.com\nyeoner.com\nyepaisz.com\nyephy.com\nyeql3hzbd.com\nyeren86.com\nyergoo.com\nyes-chinese.com\nyes-lcd.com\nyes115.com\nyes58.net\nyes88.com\nyesacc.com\nyesapi.net\nyesbt.cc\nyesbx.com\nyeschool.net\nyescontrols.com\nyesdotnet.com\nyesense.com\nyeshen.com\nyeshengarts.com\nyeshine.net\nyeshitv.com\nyeshj.com\nyeshu.cloud\nyeshu.com\nyesidos.com\nyesilicon.com\nyeskn.com\nyesky.com\nyeslicake.com\nyesmyimg.com\nyesmywine.com\nyesonfashion.com\nyesou.com\nyesoulchina.com\nyespearl.com\nyespik.com\nyespmp.com\nyestar.com\nyestar1992.com\nyestarcorp.com\nyestargz.com\nyestarm.com\nyestarvip.com\nyestehotel.com\nyeston.net\nyestone.com\nyesudoo.com\nyesungroup.com\nyesuse.net\nyeswan.com\nyeswood.com\nyesxun.com\nyetaidrink.com\nyetianlian.cc\nyetianlian.info\nyetianzi.com\nyettos.com\nyetu.net\nyewanba.com\nyewen.us\nyewuyuan.com\nyexinggroup.com\nyeyday.com\nyeyezhenxuan.com\nyeyimg.com\nyeyingkf.com\nyeyo.cc\nyeyou.com\nyeyoucdn.com\nyeyoujia.com\nyeyousg.com\nyeyulingfeng.com\nyeyun.com\nyezaifei.com\nyezhuwq.com\nyezhuwuyou.com\nyezi66.xyz\nyeziapp.com\nyezipi.net\nyeziting.com\nyezixigame.com\nyezixueyuan.com\nyezizhu.com\nyezizx.com\nyf-ec.com\nyf-zs.com\nyf0008168.com\nyf520.com\nyf77.com\nyfanad.com\nyfanads.com\nyfano.com\nyfanqie.com\nyfbudong.com\nyfbzb.com\nyfcache.com\nyfcalc.com\nyfcdn.net\nyfchuhai.com\nyfcity.net\nyfcloud.com\nyfd.xyz\nyfdc.net\nyfds168.com\nyfdts.net\nyfdurl.com\nyfdurl0.com\nyfdurl1.com\nyfdurl10.com\nyfdurl11.com\nyfdurl12.com\nyfdurl13.com\nyfdurl14.com\nyfdurl15.com\nyfdurl16.com\nyfdurl17.com\nyfdurl18.com\nyfdurl19.com\nyfdurl2.com\nyfdurl20.com\nyfdurl3.com\nyfdurl4.com\nyfdurl5.com\nyfdurl6.com\nyfdurl7.com\nyfdurl8.com\nyfdurl9.com\nyfdxs.com\nyfdyf.com\nyfemj.com\nyffood.com\nyffy120.com\nyffzkl.com\nyfgg.com\nyfgj68.com\nyfhex.com\nyfhhf.com\nyfhl.net\nyfhospital.com\nyfhxtech.com\nyfinds.com\nyfiot.com\nyfisher.com\nyfjiakao.com\nyfjnjc.com\nyfklxz.com\nyflcloud.online\nyfldocker.com\nyfm99.com\nyfmac.com\nyfmhgf.com\nyfmhw.com\nyfp2p.net\nyfpayment.com\nyfsafety.com\nyfsail.net\nyfscdn.com\nyfscdn.net\nyfservice.com\nyfsteel.com\nyfswjt.com\nyfswny.com\nyftxt.com\nyfty88.com\nyfvb.com\nyfway.com\nyfwnm.com\nyfworld.com\nyfwpt.vip\nyfwqlij.xyz\nyfycrc.com\nyfycyboil.com\nyfygxyy.com\nyfyky.com\nyfysjt.com\nyg-pump.com\nyg-st.com\nyg1997.com\nyg84.com\nyg8898.com\nygbid.com\nygbx.com\nygc711iq.com\nygcgfw.com\nygcloud.com\nygcooler.com\nygct.com\nygdatabase.com\nygdl.com\nygdy8.net\nyge.me\nygeer.com\nygei.com\nyget.me\nygfengshui.com\nygfmlt.com\nyggk.net\nyghsh.com\nygibao.com\nyginsight.com\nygjctech.com\nygjj.com\nygjoy.com\nygmsy.com\nygread.com\nygrtt.com\nygsdmedia.com\nygsf.com\nygsm.com\nygsoft.com\nygtape.com\nygtcpa.com\nygtf.net\nygtiyu.com\nygtl.com\nygtq.net\nygvyp.com\nygwenxue.com\nygwh.cc\nygwood.com\nygx8888.com\nygxy.com\nygym.org\nygzt.net\nyh-group.com\nyh0.com\nyh2000.com\nyh31.com\nyh596.com\nyh598.com\nyh914.com\nyh99.cc\nyh999999.com\nyhaabva.com\nyhachina.com\nyhadmob.com\nyham.net\nyhc-card.com\nyhcangchu.com\nyhchj.com\nyhchn.com\nyhcjcw.com\nyhcko.com\nyhcmovie.com\nyhcplatform.com\nyhcqw.com\nyhd.com\nyhdd365.shop\nyhdfa.com\nyhdi.net\nyhdlcs.com\nyhdm5.com\nyhdns.net\nyhedu.com\nyhees.com\nyhgdiopn.vip\nyhgfb-cn-static.com\nyhggroup.com\nyhgmjf.com\nyhgzjt.com\nyhhh8888.com\nyhhjcc.com\nyhhotel.com\nyhidc.com\nyhindustrial.com\nyhj9.com\nyhjbox.com\nyhjcollege.com\nyhjj.com\nyhjktgfd.cc\nyhjx2018.com\nyhkaq.com\nyhkbchao.com\nyhkingdee.com\nyhkz.com\nyhlbx.com\nyhly.shop\nyhm11.com\nyhmob.com\nyhmsfc.com\nyhmyi.com\nyhpackaging.net\nyhppk.com\nyhqapp.com\nyhqdashi.com\nyhqh.net\nyhqrmyy.com\nyhquan365.com\nyhqurl.com\nyhrcb.com\nyhrjk.com\nyhrongde.com\nyhrsks.com\nyhs518.com\nyhsc.com\nyhshapp.com\nyhsms.com\nyhsp.net\nyhsport.com\nyhstjt.com\nyhtclb.com\nyhthing.com\nyhtools.cc\nyhtuchuang.com\nyhtx.tv\nyhtzx.net\nyhurl.com\nyhwch.com\nyhwins.com\nyhwjlp.plus\nyhwomen.com\nyhx3318.com\nyhxincai.com\nyhxmset.com\nyhxs3344.net\nyhxuexiao.com\nyhydl.com\nyhyhwy.com\nyhylc71.com\nyhyyjk.com\nyhz18.com\nyhz2000.com\nyhz365.com\nyhz66.com\nyhzky.net\nyhzky1.net\nyhzm.cc\nyhzm.com\nyhzrt.com\nyhzuche.com\nyi-fengshui.com\nyi-hall.com\nyi-i.com\nyi-jy.com\nyi-oa.com\nyi-programmer.com\nyi-sky.com\nyi-you.org\nyi-zhifu.com\nyi-zhou.com\nyi020.com\nyi0600.com\nyi114.com\nyi2.net\nyi6.com\nyi7.com\nyi958.com\nyiai.me\nyiaini.com\nyiandrive.com\nyianjiulao.com\nyiapp.com\nyibaijin.com\nyibaixun.com\nyiban.io\nyiban1314.com\nyibaogao.com\nyibaojiankang.com\nyibaotech.com\nyibei.com\nyibeiic.com\nyibeiwangluo.com\nyibenmanhua.com\nyibentushu.com\nyibiao-sh.com\nyibite.com\nyiboard.com\nyiboliu.com\nyiboow.com\nyiboshi.com\nyibotec.com\nyiboyangguang.com\nyicai.com\nyicaiai.com\nyicaiexpo.com\nyicaiglobal.com\nyicaihua.com\nyicaiykt.com\nyicamp.com\nyicang.com\nyicanggongyi.com\nyicbo.com\nyice11.com\nyicha-yc.com\nyichadan.com\nyichafen.com\nyichangly.com\nyichangmarathon.com\nyiche.com\nyichemall.com\nyichengfood.net\nyichengji.com\nyichengnews.com\nyichengwangluo.net\nyicheshi.com\nyichezhi.com\nyichi.tech\nyichip.com\nyichuan.net\nyichuntv.com\nyichuyifan.com\nyickd.com\nyiclear.com\nyicloud.org\nyicode.tech\nyicoe.com\nyicongfound.org\nyiconmed.com\nyicuba.com\nyicungn.com\nyicx.com\nyida6666.com\nyidaba.com\nyidachem.com\nyidachina.com\nyidadrillcollar.com\nyidagas.com\nyidahospital.com\nyidai.com\nyidaidai.com\nyidaointernational.com\nyidaomall.com\nyidaomobi.com\nyidaplay.com\nyidaweb.com\nyide.com\nyideamobile.com\nyidejia.com\nyidengxuetang.com\nyidian-inc.com\nyidian360.com\nyidian51.com\nyidiancangwei.com\nyidianchina.com\nyidianda.com\nyidianedu.com\nyidianfenqi.com\nyidianhulian.com\nyidianliangdiansandiansidianwudianliudianqidianbadianjiudianshi.com\nyidianling.com\nyidianliulan.com\nyidianmail.com\nyidiansz.com\nyidianting.xin\nyidianyuan-wawa.com\nyidianzixun.com\nyiding-gr.com\nyidingbao.shop\nyidingding3.com\nyidmall.com\nyidns.net\nyidong-food.com\nyidonghua.com\nyidongtimes.com\nyidontek.com\nyidop.com\nyidoutang.com\nyidouzhaofang.com\nyidu-marathon.com\nyidu.cc\nyidubbs.com\nyiduchuan.com\nyidui.me\nyiduir.com\nyidulive.com\nyidumen.com\nyidun.com\nyiduoli.com\nyiduoxinya.com\nyiduqiang.com\nyiduwater.com\nyiec.com\nyiernews.com\nyiexi.com\nyifajingren.com\nyifake.com\nyifan211.com\nyifancdn.com\nyifancn.com\nyifanggl.com\nyifanghy.com\nyifanmedia.net\nyifanshangplus.com\nyifanyy.com\nyifatong.com\nyifei.com\nyifei.space\nyifeigufen.com\nyifeimeiye.com\nyifeishu.com\nyifeng-filter.com\nyifeng-mover.com\nyifeng.com\nyifenghudong.com\nyifengke.com\nyifengliangyou.com\nyifengx.com\nyifengxin.org\nyifont.com\nyifu.net\nyifubao.com\nyifucj.com\nyifum.com\nyifum.hk\nyifum.net\nyifutu.com\nyigao.com\nyigaosu.com\nyige.org\nyigeban.com\nyigecun.com\nyigerlife.com\nyigomob.com\nyigongdcs.com\nyigonghl.com\nyigood.net\nyigoonet.com\nyigouu.com\nyiguanba.com\nyiguanghuagong.com\nyiguo.com\nyiguoimg.com\nyihafo.com\nyihaikerry.net\nyihaiquanyi.com\nyihaishijia.com\nyihang.info\nyihao.com\nyihao01.com\nyihaocar.com\nyihaodian.com\nyihaodianimg.com\nyihaoduozhongduan.com\nyihaojiaju.com\nyihaomen.com\nyihaoranjd.com\nyihaoyunche.com\nyihchina.com\nyiheda.com\nyihedoors.com\nyihegroup.com\nyihekf.com\nyihengyt.com\nyiherubber.com\nyihexingyao.com\nyihong001.com\nyihong1718.com\nyihtc.com\nyihu.com\nyihu365.com\nyihuacomputer.com\nyihuajiaoyu.com\nyihuan.org\nyihuanjt.com\nyihubaijia.com\nyihubaiying.com\nyihubg.com\nyihuichuang.com\nyihuikeji.vip\nyihuimg.com\nyihuiyun.net\nyihun.com\nyihuohao.com\nyiibai.com\nyiichina.com\nyiigle.com\nyiihuu.com\nyiii.net\nyiimoo.com\nyiinet.net\nyiiwo.com\nyijia-ai.com\nyijia.com\nyijia.ink\nyijia5.com\nyijiakao.com\nyijian-app.com\nyijian119.com\nyijiande.com\nyijiangbao.com\nyijianjiexi.com\nyijianlogo.com\nyijianqutu.com\nyijianzj.com\nyijiaqin.com\nyijiaren3413.com\nyijiawang.com\nyijiebuyi.com\nyijiedai.com\nyijifen.com\nyijimaoyi.com\nyijinghong.com\nyijingji.com\nyijingxiehui.net\nyijintong.net\nyijirecovery.com\nyijiupi.com\nyijiuplus.com\nyijueculture.com\nyijuedesign.com\nyijueweb.com\nyijun77.com\nyikag.com\nyikai.com\nyikaiye.com\nyikaiye.net\nyikang.work\nyikang1977.com\nyikangdongf.com\nyikanxs.com\nyikaoapp.com\nyikaochacha.com\nyikaow.com\nyikebus.com\nyikedou.com\nyikeou.com\nyiketalks.com\nyiketianqi.com\nyikeweiqi.com\nyikexue.com\nyikezhengxing.com\nyikouhy.com\nyikuaide.com\nyikuaiqu.com\nyikuaixiu.com\nyikuns.com\nyikuyi.com\nyilandezhong.com\nyilantop.com\nyilanvaas.com\nyile8.com\nyilewan.com\nyileweb.com\nyileyiqi.com\nyileyoo.com\nyileyunssp.com\nyili.com\nyilianapp.com\nyilianmeiti.com\nyilianyixue.com\nyiliaosheji.com\nyilibabyclub.com\nyilicar.com\nyilihuo.com\nyiliit.com\nyilijet.com\nyilikim.com\nyilingarden.com\nyilingshop.com\nyilingsj.com\nyilinweb.com\nyiliqqstar.com\nyilishiji.com\nyiliwater.com\nyiliysr.com\nyillionbank.com\nyilong.com\nyilongnews.com\nyilongweiguo.com\nyilu365.com\nyilufawh.com\nyilule.com\nyiluzouhao.com\nyilvcheng.com\nyima.world\nyima88.com\nyimaitongdao.com\nyimakk.com\nyimao.net\nyimaoip.com\nyimapay.com\nyimashijie.com\nyimeichu.com\nyimeihui360.com\nyimeima.com\nyimeiya.com\nyimenapp.com\nyimenapp.net\nyimeng.com\nyimenonline.com\nyimenseo.net\nyimenssl.com\nyimian.xyz\nyimianmian.com\nyimiaotui.com\nyimiaoxia.com\nyimidida.com\nyimifund.com\nyimihaodi.com\nyimin.biz\nyimin168.com\nyimingcul.com\nyimingkeji.net\nyimingroup.com\nyimingzhi.net\nyimininfo.com\nyiminjiayuan.com\nyiminw.com\nyiminyy.com\nyimisoft.com\nyimitongxue.com\nyimiyisu.com\nyimuapp.com\nyimudoor.com\nyimutian.com\nyimuymc.com\nyinbaitu.com\nyinban.com\nyinbangbroker.com\nyinbian.cc\nyinbin.ink\nyincat.com\nyinchar.com\nyinchenglawyer.com\nyinchengli.com\nyinchengpai.com\nyinchuanwater.com\nyinchuanzxd.com\nyindon.com\nyindu.com\nyinduchina.com\nyindudigital.com\nyindui.net\nyindunjituan.com\nyinduzx.com\nyineitong.com\nyinengjituan.net\nyinengkt.com\nyinengwl.com\nyinerda.com\nyinfeiy.com\nyinfenggr.com\nying-sw.com\nying-ting.com\nyingbei365.com\nyingbio.com\nyingbozhu.org\nyingcai.cc\nyingcaicheng.com\nyingcankeji.com\nyingchao-wikipedia.com\nyingchaozhibo.com\nyingcheng.net\nyingchengnet.com\nyingchuang.com\nyingchulawyer.com\nyingci86.com\nyingdao.com\nyingde.com\nyingdev.com\nyinge.cc\nyinge.tech\nyingeye.com\nyingfangkeji.com\nyingfeiyun.com\nyingfeng.me\nyinggou.com\nyingguangroup.com\nyingguantx.com\nyinghai.work\nyinghaicar.com\nyinghanhuyi.com\nyinghecloud.com\nyingheedu.com\nyingheying.com\nyinghezhong.com\nyinghuaonline.com\nyinghuasuan.com\nyinghuiiot.com\nyinghuo.art\nyinghuochong.com\nyinghuochong.fun\nyinghuochongjz.com\nyinghuodd.com\nyingjia360.com\nyingjianzhijia.com\nyingjiesheng.com\nyingjiesheng.net\nyingjiesheng.org\nyingjimall.com\nyingjinhk.com\nyingke010.com\nyingkefuli.com\nyingkelawyer.com\nyingkounews.com\nyingle.com\nyingleku.com\nyinglib.com\nyingligroup.com\nyinglisolar.com\nyingliugroup.com\nyinglunka.com\nyingmei.me\nyingmi.com\nyingming.net\nyingnor.com\nyingpaigame.com\nyingpaikeji.com\nyingpengbz.com\nyingpost.com\nyingriliuti.com\nyingrongit.com\nyingshe.com\nyingsheng.com\nyingshi-ai.com\nyingshiyou.com\nyingso.fun\nyingsoft.com\nyingsoo.com\nyingsun.net\nyingsx.com\nyingt.asia\nyingt.fun\nyingtai.com\nyingtaigroup.com\nyingtaorelian.com\nyingtaosiyue.com\nyingtaoyun.com\nyingteach.com\nyingtexin.net\nyingtianit.com\nyingtianlight.com\nyingtianwang.com\nyingtongshe.com\nyinguobing.com\nyingworks.com\nyingwuyuzd.cc\nyingxi.tv\nyingxiahome.com\nyingxiaofangan.com\nyingxiaoli.com\nyingxichina.com\nyingxiong.com\nyingxiongji.com\nyingxun56.com\nyingyang630.com\nyingyankantu.com\nyingyecraft.com\nyingyijin.com\nyingyinclub.com\nyingyinglicai.com\nyingyonghao8.com\nyingyonghui.com\nyingyongmiao.com\nyingyongshichang.com\nyingyongso.com\nyingyu.com\nyingyuchat.com\nyingyudengji.com\nyingyuehe.com\nyingyushijie.com\nyingyuxiaoshuo.com\nyingzaocms.com\nyingzhongshare.com\nyingzi01.com\nyingzi02.com\nyingzicms.com\nyingzt.com\nyinhai.com\nyinhang123.net\nyinhangchaxun.com\nyinhanghanghao.com\nyinhangkadata.com\nyinhangkahao.com\nyinhangzhaopin.com\nyinhe.com\nyinhe.net\nyinhecn.com\nyinheyuedu.com\nyinhu.com\nyinhuadm.one\nyinhuafu.com\nyinhuatangyiyao.com\nyinhuchem.com\nyinhulaser.com\nyini.org\nyini8.com\nyinisun.com\nyinjia.com\nyinjiabio.com\nyinjispace.com\nyinka.co\nyinkunwi.work\nyinlimedia.com\nyinlingshuyuan.com\nyinlvaa.com\nyinmakeji.com\nyinmaojx.com\nyinmishu.com\nyinning.vip\nyinongtao.com\nyinpiao.com\nyinqiao.com\nyinqiaogroup.com\nyinrcw.com\nyinsafe.com\nyinsfinance.com\nyinsha.com\nyinshenxia.com\nyinshua.cc\nyinshuahangyewang.mobi\nyinshuiyu.com\nyinsuwl.com\nyintai.com\nyintechi.com\nyintime.com\nyinuo1000.com\nyinuobeidiao.com\nyinuochina.com\nyinuoedu.net\nyinuotech.com\nyinvmh.com\nyinxiang.com\nyinxiangart.com\nyinxianggame.com\nyinxiangmall.com\nyinxiangqingyang.com\nyinxiangwuye.com\nyinxiao.com\nyinxiaobao.net\nyinxinbh.com\nyinxinchina.com\nyinxing.com\nyinxunbiao.com\nyinyangresin.com\nyinyangshi.com\nyinyao168.com\nyinyouapp.com\nyinyue7.com\nyinyuegf.com\nyinyueke.net\nyinyuemeitu.com\nyinyuetai.com\nyinyueyouxi.com\nyinyuezhizuoren.com\nyinzhaowang.com\nyinzhijie.com\nyinzhupharma.com\nyinziyan.com\nyinzuo100.com\nyioho.com\nyioulai.com\nyiovo.com\nyipai360.com\nyipaiming.com\nyipaogan.com\nyiparts.com\nyipemail.com\nyipeng888.com\nyipiaoyun.com\nyipigu.com\nyipihuo.com\nyipinbowu.com\nyipingmed.com\nyipingmi.vip\nyipingsj.com\nyipinhr.com\nyipinpai.com\nyipinsmart.com\nyipintemian.com\nyipinyiwu.com\nyipsink.com\nyipujiance.com\nyipuping.com\nyiputouzi.com\nyipuwuyou.com\nyiq.com\nyiqi.com\nyiqi35.com\nyiqi4.com\nyiqianbao.com\nyiqianbao.net\nyiqianlian.com\nyiqiao88.com\nyiqiaochina.com\nyiqibazi.com\nyiqibing.com\nyiqibuduoduo.com\nyiqicai.com\nyiqicesuan.com\nyiqichuangxiang.com\nyiqicms.com\nyiqifa.com\nyiqifa.org\nyiqifei.com\nyiqifengtian.com\nyiqig.com\nyiqihi.com\nyiqihuihui.com\nyiqijian.com\nyiqijixiang.com\nyiqikan8.com\nyiqike.com\nyiqiming88.com\nyiqimob.com\nyiqingyuan.com\nyiqinzi.com\nyiqioffice.com\nyiqipaipingtai.com\nyiqishai.com\nyiqishanyuan.com\nyiqiso.com\nyiqistore.com\nyiqitp.com\nyiqituodan.com\nyiqiuu.com\nyiqiwang.net\nyiqiwin.com\nyiqixiaofei.com\nyiqixie.com\nyiqixiegushi.com\nyiqiyoo.com\nyiqiyou.com\nyiquan-keji.com\nyiquhai.com\nyiqujing.com\nyiquxapp.com\nyirankejiao.com\nyiranmeifushi.com\nyiren001.com\nyirendai.com\nyirentong.com\nyirenwuye.com\nyirenzhushou.com\nyirenzuji.com\nyirgalab.com\nyirlir.com\nyirong.com\nyiruan.la\nyiruantong.com\nyiruide.com\nyiruikecorp.com\nyiruituo.com\nyirujs.com\nyiruniot.com\nyiruwijojn1.com\nyiryi.com\nyisa.com\nyisanban.com\nyisanwu.com\nyisbei.com\nyisell.com\nyishalai.com\nyishan168.com\nyishang.cc\nyishangwang.com\nyishangye.com\nyishengfanyi.com\nyishengjiaoyu.com\nyishidian.com\nyishihui.com\nyishihui.net\nyishion.com\nyishion.net\nyishiongd.com\nyishixue.com\nyishouapp.com\nyishs.com\nyishu168.com\nyishujia.net\nyishujie.com\nyishuliuxue.com\nyishun.fun\nyishutang.com\nyishuzhifa.com\nyishuzi.com\nyishuzi.org\nyishuziti.com\nyisier.com\nyisimeimaoyi.xyz\nyiso.fun\nyisocms.com\nyisou.com\nyisouti.com\nyisouyifa.com\nyissimg.com\nyisu.com\nyisuan.net\nyisuddoscdn.com\nyisuoyi.com\nyit.com\nyitai17.com\nyitaifang.com\nyitaigroup.com\nyitaihdbf.com\nyitanyun.com\nyitao.com\nyitaopu.com\nyitb.com\nyitcollege.com\nyitechnology.com\nyiteholdings.com\nyitel.com\nyitelish.com\nyitesoft.com\nyitiangroup.com\nyitianshidai.com\nyitianxinda.com\nyitiaoyule.com\nyiticm.com\nyitijizhi.com\nyitisports.com\nyitoa.com\nyitong-group.com\nyitongguan.com\nyitongmedia.com\nyitongsolar.com\nyitonyiqi.com\nyitoto.cc\nyitsoftware.com\nyitutech.com\nyituyu.com\nyiubd.com\nyiupin.com\nyiuxiu.com\nyivian.com\nyivicar.com\nyivizd.com\nyiwaiart.com\nyiwan.com\nyiwangdujin.com\nyiwanggo.net\nyiwangtui.com\nyiwanlian.net\nyiwanzhushou.com\nyiwealth.com\nyiweb.com\nyiweiads.com\nyiweishi.com\nyiwenyida.com\nyiwenyizhi.com\nyiwise.com\nyiwk.com\nyiworld.com\nyiwu56.com\nyiwubuy.com\nyiwufair.com\nyiwugo.com\nyiwugou.com\nyiwuguan.com\nyiwuku.com\nyiwulianhe.com\nyiwumls.com\nyiwupay.com\nyiwutalk.com\nyiwuzhaopin.com\nyiwuzhongxiyi.com\nyiwz.net\nyixao.com\nyixao.net\nyixc.com\nyixi.tv\nyixia.com\nyixiaai.com\nyixiaai.online\nyixianfabu.com\nyixiangzuji.com\nyixiansheng.com\nyixiaobang.net\nyixiaoyuan.com\nyixiaozu.com\nyixiatong.com\nyixiekeji.com\nyixin-valve.com\nyixin.com\nyixin.im\nyixin5.com\nyixincao.com\nyixincapital.com\nyixinfinance.com\nyixinfund.com\nyixingart.com\nyixingauto.com\nyixingguanchang.com\nyixinli.xin\nyixintui.com\nyixinu.com\nyixiu.cloud\nyixiubx.com\nyixiuxueyuan.com\nyixuan.net\nyixue.com\nyixue68.com\nyixue99.com\nyixuegr.com\nyixueks.com\nyixuelunwen.com\nyixuexianzhi.com\nyixuezp.com\nyixui.com\nyixun.com\nyixunjidian.com\nyixunwu.com\nyiya520.com\nyiyacht.com\nyiyaha.com\nyiyanche.com\nyiyang168.com\nyiyang668.com\nyiyangadx.com\nyiyangidc.com\nyiyangzhuangyuan.com\nyiyao.tv\nyiyaodxt.com\nyiyaohang.com\nyiyaojd.com\nyiyaojie.com\nyiyaoqianyan.com\nyiyayans.com\nyiye-a.com\nyiye-h.com\nyiye-v.com\nyiye.ai\nyiyebang.com\nyiyedu.com\nyiyefei.com\nyiyesheng.net\nyiyiarts.net\nyiyifoods.com\nyiyimh.com\nyiyisoft.com\nyiyitech.com\nyiyitesco.com\nyiyiu.com\nyiyiwawa.com\nyiyongcad.com\nyiyouliao.com\nyiyouliuxue.com\nyiyouqi.com\nyiyoushu.net\nyiyu.com\nyiyuan.com\nyiyuanjichang.com\nyiyuanluye.com\nyiyuanqiang.net\nyiyuansoft.com\nyiyuanyi.org\nyiyuanzhaopin.com\nyiyukj.com\nyiyum.com\nyiyun518.com\nyiyupack.com\nyiyusemi.com\nyiz.vip\nyizanmeiye.com\nyizenb.com\nyizeseafood.com\nyizhanapp.com\nyizhang8.com\nyizhanhulian.com\nyizhanzx.com\nyizhaopin.com\nyizhedian.com\nyizhengwx.com\nyizhibi.com\nyizhibo.com\nyizhidayu.com\nyizhifubj.com\nyizhijia.com\nyizhikan.com\nyizhiknow.com\nyizhiqc.com\nyizhiqingxie.com\nyizhitou.com\nyizhiwechat.com\nyizhiweixin.com\nyizhiws.com\nyizhixiaogame.com\nyizhoucb.com\nyizhu-tech.com\nyizhuan5.com\nyizimg.com\nyizlife.com\nyizu.org\nyizu.tv\nyizumi-group.com\nyizumi.com\nyizuxing.com\nyj-fun.com\nyj-zn.com\nyj.com\nyj.ink\nyj028.com\nyj36.com\nyj518.com\nyjai.art\nyjbys.com\nyjbzr.com\nyjcard.com\nyjcf360.com\nyjcp.com\nyjctrip.com\nyjdatasos.com\nyjdzm.com\nyjfs8.com\nyjfy.com\nyjgf.com\nyjgxcx.com\nyjhbqx.com\nyjhnt888.com\nyjhospital.com\nyjhyjl.com\nyjhzb.com\nyjihua.com\nyjijy.com\nyjiyun.com\nyjjsjt.com\nyjk.com\nyjk.im\nyjkxw.org\nyjldp.com\nyjlhq.com\nyjlin4.com\nyjlink.cc\nyjliquan.com\nyjllq.com\nyjmc.org\nyjmuseum.com\nyjopen.com\nyjpal.com\nyjpd.work\nyjpoo.com\nyjq.cc\nyjqegc.com\nyjr123.com\nyjrc.com\nyjrc.net\nyjrcyw.com\nyjro.com\nyjs-cdn.com\nyjs-cdn1.com\nyjs-cdn10.com\nyjs-cdn2.com\nyjs-cdn3.com\nyjs-cdn4.com\nyjs-cdn5.com\nyjs-cdn6.com\nyjs-cdn7.com\nyjs-cdn8.com\nyjs-cdn9.com\nyjscloud.com\nyjsershi.com\nyjsmodel.com\nyjsry.com\nyjssishisi.com\nyjsswjt.com\nyjswsht.xyz\nyjtiyu.com\nyjtvw.com\nyjtw.com\nyjwlnet.com\nyjwlo.com\nyjwmidc.com\nyjwujian.com\nyjxbgjj.com\nyjxfz.com\nyjxlawyer.com\nyjxsoft.com\nyjydl.com\nyjygjjt.com\nyjygx.com\nyjyxiyan.com\nyjyz.com\nyjz9.com\nyjzcalzcxm.com\nyjzf.com\nyk-bio.com\nyk-fm.com\nyk0579.com\nyk56.com\nykai.com\nykccn.com\nykccn.net\nykcer.com\nykclass.com\nykcuqlt.com\nykdgd.com\nykdmsy.com\nykedu.net\nykelai.com\nykfc.net\nykhongye.com\nykimg.com\nykinvestment.com\nykjljdcss.com\nykjtb.com\nykkpict.com\nykkpict.vip\nykmanhua.com\nykneng.com\nykplg.com\nykptg.com\nykq.ink\nykqj.com\nykqnl.com\nykqx.com\nykrc.net\nykrcx.com\nyksdks.com\nyksign.com\nyksjjt.com\nyksuit.com\nykt.io\nyktchina.com\nyktworld.com\nyktz.net\nykuee.link\nykw18.com\nykwater.com\nykwin.com\nykxwcm.com\nykyao.com\nykyi.net\nykzls.com\nykzq.com\nykzr.com\nykzyyy.com\nyl-csj.com\nyl-fc.com\nyl-scm.com\nyl.ag\nyl.vip\nyl0008168.com\nyl01.com\nyl1001.com\nyl1988.com\nyladm.com\nylallinone.com\nylbeef.com\nylbloc.com\nylbycw.com\nylcapsule.com\nylchbyfz.com\nylcm.net\nylcncmy.com\nylcxsb.net\nyldaye.com\nyldayu.com\nyldigitallife.com\nyldmall.com\nyldndl.com\nyldrs.com\nylduyi.com\nyldy.net\nyldzhb.com\nylfd.net\nylfx.com\nylgaoshan.com\nylgjsty.com\nylgnyy.com\nylgs96332.com\nylgxgs.com\nylhags.com\nylhakc.com\nylhdgg.com\nylhdsl.com\nylhfjq.com\nylhh.net\nylhhny.com\nylhmgz.com\nylhongjin.com\nylhr.net\nylhrjxfw.com\nylhsrsrc.com\nylibi.com\nylijh.com\nylike.com\nylike.net\nylitc.net\nyliyun.com\nylizu.com\nyljcjt.com\nyljdjx.com\nyljr.com\nylkaite.com\nylkbf.com\nylkjgame.com\nylklyl.com\nyllhzb.com\nyllm666.xyz\nyllt.icu\nylmaterial.com\nylmf.cc\nylmf123.com\nylmf888.com\nylmfeng.com\nylmfwin100.com\nylmm.com\nylnetworks.com\nyloo.org\nylprinter.com\nylq.com\nylqk88.com\nylqyyr.com\nylr114.com\nylrb.com\nylrj.com\nylrq.org\nylscgl.com\nylscw.net\nylsdeyy.com\nylsdyyy.com\nylsfqyy.com\nylsmtnozzle.com\nylssgg.com\nylssofa.com\nylsssgg.com\nylstatic.com\nylstcgz.com\nylstudy.com\nylsw.net\nylt2008.com\nyltapi.com\nyltender.com\nyltexgroup.com\nyltlgjzx.com\nyltpcb.com\nylturl.com\nyltvb.com\nyltxxx.com\nylun8.com\nylunion.com\nyluu.com\nylwdec.com\nylwl.cc\nylwltv.com\nylwpark.com\nylws.net\nylwyw.com\nylxdtww.com\nylxgf.com\nylxhmy.com\nylxw.net\nylxweb.com\nylxyct.com\nylxyyy.com\nylxyzs.com\nylxzgz.com\nylyk.com\nylyun.com\nylyz.com\nylzbsj.com\nylzbtech.com\nylzhaopin.com\nylzhsk.com\nylzknk.com\nylzmjd.com\nylzms.com\nylzpay.com\nylzsy.com\nylztwy.com\nylzuche.com\nylzxmryy.com\nylzyhb.com\nylzyjx.com\nylzz5557.com\nylzz5999.com\nylzz666.com\nylzz6777.com\nylzz877.com\nym-trans.com\nym.link\nym.run\nym.today\nym01.tech\nym23.com\nym3222333.com\nymacg.com\nymadly.com\nymailcampaign.com\nymanz.com\nymapp.com\nymark.cc\nymars.com\nymatou.com\nymawv.la\nymbaidu.com\nymbank.com\nymcart.com\nymcart.net\nymcsepu.com\nymdoctor.com\nymechina.com\nymexf.com\nymfund.com\nymg.cc\nymgk.com\nymgkimg.com\nymhfp.com\nymhudong.com\nymhui.com\nymhuwai.com\nymhzpx.com\nymiot.net\nymisc.com\nymj9.com\nymjkj.com\nymjx8.com\nymkuzhan.com\nymlfxp.com\nymlinks.com\nymlt.net\nymlt.vip\nymm56.com\nymmfa.com\nymmobi.com\nymnsdk.com\nympc88.com\nympcb.com\nymrcw.vip\nyms.cool\nymsoft.team\nymsss.com\nymsteam.com\nymt.com\nymt123.com\nymt360.com\nymtc.com\nymtie.com\nymtmt.com\nymtnet.com\nymuuy.com\nymvkt.com\nymwcds.org\nymwl.net\nymxinke.com\nymxinxi.com\nymxlass.com\nymyun.com\nymyxsw.com\nymzer.com\nymzsl.com\nymzxconf.com\nymzy.games\nyn-tcm-hospital.com\nyn-tobacco.com\nyn2007.com\nyn58.com\nynaec.com\nynairport.com\nynb2dca.com\nynbit.com\nynbojie.com\nynbzxh.com\nync365.com\nyncost.com\nyncun.net\nyncunguan.com\nyncyc1990.com\nyndaily.com\nyndcc.com\nyndkt.com\nyndzdj.com\nyneg-ev.com\nyneit.com\nynet.com\nynfabu.com\nynfmly.com\nynfww.com\nynfwyy.com\nynfxw.com\nyngas.net\nyngp.com\nyngsxy.net\nyngw518.com\nynhkfyy.com\nynhl.net\nynho.com\nynhotel.net\nynhouse.com\nynhr.com\nynhthbkj.com\nynhuasong.com\nynhzm.com\nyni84.com\nynian.com\nynjgy.com\nynjiaoyu.net\nynjkeji.com\nynjkjy.com\nynjlgroup.com\nynjtt.com\nynjttzjt.com\nynjtys.com\nynkcfc.com\nynkgyy.com\nynkm88.com\nynkmit.com\nynlygf.com\nynmbwl.com\nynmcyl.com\nynmec.com\nynmlgsgs.com\nynmzly.com\nynnits.com\nynpco.com\nynpta.com\nynpti.com\nynpublish.com\nynqjnews.net\nynqrmyy.com\nynradio.com\nynrainbow.com\nynrc.net\nynrcc.com\nynrd.com\nynscgg.com\nynsdfz.net\nynsfhq.com\nynshangji.com\nynshhyy.com\nynshijian.com\nynsjg.com\nynsjzyxh.com\nynsmyy.com\nynsnjt.com\nynsnw.com\nynsrx.com\nynsst.com\nynstl.com\nynsydwzp.com\nynsyhkgs.com\nynsyy.com\nynszfw.com\nynszk.com\nynszlyy.com\nyntz.cc\nyntz.net\nynurl.com\nynw360.com\nynwater.com\nynwin.com\nynwww.cc\nynxdfpr.com\nynxingexinxi.com\nynxinhua.com\nynxiu.com\nynxr.com\nynxrmyy.com\nynxxb.com\nynxxwfw.com\nynxzy.com\nynyc.com\nynyes.com\nynylhy.com\nynyp.com\nynytkc.com\nynyysc.com\nynzaojia.com\nynzbxh.com\nynzcwl.com\nynzg.org\nynzp.com\nynzqyc.com\nynzrf.com\nynzs.com\nynztrq.com\nynztzh.com\nynztzxw.com\nynzy-tobacco.com\nynzzwl.com\nyo4399.com\nyoagoa.com\nyobo.ink\nyobo360.com\nyobochina.com\nyocajr.com\nyocdev.com\nyocofs.com\nyocopi.com\nyocvn.com\nyocyxc.com\nyodak.net\nyodao.com\nyodao.info\nyodao.net\nyodao.org\nyodiya.com\nyodo1.com\nyodo1api.com\nyodou.com\nyoduzw.com\nyoe365.com\nyofc.com\nyofcjs.com\nyofijoy.com\nyofish.com\nyofogo.com\nyofond.com\nyofond.net\nyofus.com\nyoga-8.com\nyogeev.com\nyoghourt.space\nyogiyogacenter.com\nyogoip.com\nyogorobot.com\nyoher.com\nyohipay.com\nyoho.org\nyohobuy.com\nyohui.com\nyohuu.com\nyojcool.com\nyojochina.com\nyoju360.com\nyoju360.net\nyoka.com\nyokacdn.com\nyokagames.com\nyokaimg.com\nyokaverse.com\nyokechina.com\nyokemart.com\nyokmob.com\nyokong.com\nyokotop.com\nyolanda.hk\nyolcool.com\nyolewa.com\nyolexi.com\nyolinkmob.com\nyolipai.net\nyoloho.com\nyoloogames.com\nyolyon.com\nyomhy.com\nyomiko.cloud\nyomiko.club\nyomiko.fun\nyomiko.tech\nyomob.com\nyomocode.com\nyomuzu.com\nyonderep.com\nyondocredit.com\nyoneihan.com\nyonex-china.com\nyong-gang.com\nyong-ming.com\nyong9ai.com\nyonganyiyuan.com\nyongaomy.com\nyongchaohuagong.com\nyongche.com\nyongche.org\nyongchengren.com\nyongdachina.com\nyongdaoyun.com\nyongdasteel.com\nyongdugroup.com\nyonggu.com\nyonghe2008.com\nyongheng.online\nyongheyl.com\nyonghongtech.com\nyonghuivip.com\nyonghungs.store\nyongjiang.com\nyongjiezb.com\nyongjindl.com\nyongjukeji.com\nyongjx.com\nyongkang56.com\nyongkao.com\nyonglibao.com\nyonglibelt.com\nyonglin.com\nyonglinyy.com\nyonglvtong.com\nyongmei0537.com\nyongnangroup.com\nyongootech.com\nyongpingziyuan.com\nyongqianbao.com\nyongqischool.net\nyongridt.com\nyongsheng-sl.com\nyongshenggroup.com\nyongshenghn.com\nyongshengjituan.com\nyongshikj.com\nyongsy.com\nyongtaitech.com\nyongtaiyun.com\nyongtu.net\nyongwangcpa.com\nyongweigroup.com\nyongxiandata.com\nyongxiang.work\nyongxiangwz.com\nyongxinby.com\nyongxinfushi.com\nyongxinhuangjin.com\nyongxinshuo.com\nyongxintex.com\nyongxinxuexiao.com\nyongxiuren.com\nyongyi-valve.com\nyongyoujia.com\nyongyu.xyz\nyongyuenj.com\nyongzhegroup.com\nyongzhentang.com\nyongzhoubus.com\nyonho.com\nyonjan.com\nyonkersz.com\nyonlive.com\nyonthin.com\nyonyou.com\nyonyouaud.com\nyonyoubao.com\nyonyouccs.com\nyonyoucloud.com\nyonyoufintech.com\nyonyougov.com\nyonyougx.com\nyonyouny.com\nyonyouoa.com\nyonyouup.com\nyoo-club.com\nyoo616.com\nyoo66.com\nyooc.me\nyoodb.com\nyooek.com\nyoofh.com\nyoogene.com\nyoohe.net\nyoohouse.com\nyoojia.com\nyoojing.com\nyooknet.com\nyooli.com\nyooojie.monster\nyoooooooooo.com\nyoopu.me\nyooquma.com\nyooxlife.com\nyooxun.com\nyooyo.com\nyoozai.com\nyoozhe.com\nyoozhibo.cc\nyoozhibo.net\nyoozoo.com\nyopoint.cc\nyopoint.com\nyoptech.com\nyopu.co\nyopwork.com\nyopye.com\nyoqoo.com\nyoqu.net\nyorentown.com\nyork-tech.com\nyork33.com\nyorlaw.com\nyorui.net\nyoseleather.com\nyostar.net\nyostatic.com\nyotopic.com\nyou-mi.net\nyou03.com\nyou1ke.com\nyou200.com\nyouacc.com\nyouandme123.com\nyouba.com\nyouba123.com\nyouban.com\nyoubangkeyi.com\nyoubangyun.com\nyoubbs.org\nyoubeichefu.com\nyoubian.com\nyoubibi.com\nyoubike.me\nyoubikecn.com\nyoubohe.com\nyouboy.com\nyouboy.net\nyouboyy.com\nyoucaihua.net\nyoucaiyun.com\nyoucaizhushou.com\nyoucareyk.com\nyoucash.com\nyoucha.net\nyouche.com\nyouchedi.com\nyouchejiuxing.com\nyouchent.com\nyoucheyihou.com\nyouchuhuodong.com\nyoucloud.com\nyouda8.com\nyoudajx.com\nyoudao.com\nyoudaocaifu.com\nyoudaochem.com\nyoudas.com\nyoudashidai.com\nyoudawangluo.com\nyoude.com\nyoudemai.com\nyoudiancms.com\nyoudianyisi.com\nyoudianzhishi.com\nyoudingsuit.com\nyoudingte.com\nyoudong.com\nyoudou.mobi\nyoudubook.com\nyouduzw.com\nyoudwh.com\nyouease.net\nyouedata.com\nyouez.com\nyoufabiao.com\nyoufan.pub\nyoufanerbuy.com\nyoufang123.com\nyoufangou.com\nyoufangzx.com\nyoufanx.com\nyoufen666.com\nyoufengbio.com\nyoufubao.vip\nyoufujc.com\nyoufunlab.com\nyoufutongxinag.org\nyoufuyoucai.com\nyougababy.com\nyouganghangmoguan.com\nyougaoji.com\nyougaoyx.com\nyougenet.com\nyouginorg.com\nyougou.com\nyougu.tv\nyougumuye.com\nyouguo.com\nyouguoquan.com\nyouguu.com\nyouhaodongxi.com\nyouhaosoft.com\nyouhaosuda.com\nyouhaoxinxi.com\nyouhro.com\nyouhu.net\nyouhua.com\nyouhua.pw\nyouhuaaa.com\nyouhuafuzhi.com\nyouhuas.com\nyouhuashu.com\nyouhugmedia.com\nyouhuiduo.net\nyouhuiguan.com\nyouhundao.com\nyouhuohao.com\nyouhutong.com\nyouideal.net\nyouimg1.tripcdn.com\nyouinsh.com\nyouj.com\nyoujiajk.com\nyoujiands.net\nyoujiangdati.com\nyoujiangzhijia.com\nyoujiao.com\nyoujiao365.net\nyoujiao5.com\nyoujiaxiao.com\nyoujimilk.com\nyoujindi.com\nyoujingnetwork.com\nyoujiuhealth.com\nyoujoy.tv\nyouju360.com\nyouke.co\nyouke.com\nyouked.com\nyoukeda.com\nyoukego.com\nyoukexueyuan.com\nyoukia.com\nyoukia.net\nyouking.com\nyoukongkan.com\nyoukongwan.com\nyouku-dns.com\nyouku.com\nyoukua.net\nyoukuaiyun.com\nyoukud.com\nyoukupic.com\nyoulai.tech\nyoulanw.com\nyoule55.com\nyoulechuhai.com\nyoulecn.com\nyouleliwu.com\nyoulesp.com\nyouletd.com\nyouleyou.com\nyoulian.fun\nyoulianfuwu.com\nyouliangda.com\nyoulianghz.com\nyouliao.com\nyouliao.love\nyouliaobaike.com\nyouliaoyi.com\nyoulingtong.com\nyoulinyouke.com\nyoulionbattery.com\nyoulishipin.com\nyouloft.com\nyoulong123.com\nyoulongciqing.com\nyoulu.com\nyoulu.net\nyoulu6.com\nyoulupei.com\nyouluwx.com\nyouma.cc\nyoumai.com\nyoumanvideo.com\nyoume.im\nyoumeisiji.com\nyoumeng020.com\nyoumengcms.com\nyoumengmob.com\nyoumenr.com\nyoumew.com\nyoumi.net\nyoumiad.com\nyoumian99.com\nyoumiaoyigou.com\nyoumideer.com\nyoumindao.com\nyoumobi.com\nyouneedcrydear.com\nyouneng.com\nyounet.com\nyoung40.com\nyoungem.com\nyoungerfeel.com\nyounggas.com\nyoungjoygame.com\nyoungle.site\nyoungle.tech\nyoungor.com\nyoungsunpack.com\nyouni.im\nyounuokeji.cloud\nyouo.net\nyouol.com\nyouonbike.com\nyoupengcx.com\nyoupengw.com\nyoupin898.com\nyoupingame.com\nyoupinhaoche.com\nyoupinimg.com\nyoupinppt.com\nyoupinsanyue.com\nyoupintechs.com\nyoupinx.com\nyouplus.cc\nyoupont.net\nyoupuchina.com\nyoupumao.com\nyoupumao.xyz\nyouqiantu.com\nyouqichuyun.com\nyouqiong.net\nyouqiwu.com\nyouqizhan.com\nyouqo.com\nyouqu.in\nyouqudao.com\nyouquhui.com\nyour-man.com\nyour360loans.com\nyour724sports.com\nyourbin.com\nyourcee.com\nyourchinagent.com\nyourcollect.net\nyourdream.cc\nyouren5.com\nyourjia.com\nyourongsj.com\nyourtion.com\nyourtravelyourchoice.com\nyouruitech.com\nyouscm.com\nyouseen.com\nyousengshe.com\nyousenjiaoyu.com\nyouser.cc\nyoushang.com\nyoushaohua.com\nyousheng.shop\nyoushenggz.com\nyoushenhudong.com\nyousheyoujia.com\nyoushibeike.com\nyoushifu.com\nyoushihui.cc\nyoushikoudai.com\nyoushixiu.com\nyoushop01.com\nyoushop02.com\nyoushop03.com\nyoushop04.com\nyoushop10.com\nyoushu.cc\nyoushuge.com\nyoushujian.com\nyousi.com\nyoustong.com\nyoutaidoors.com\nyoutaidu.com\nyoutao55.com\nyoutaojd.com\nyouthi.com\nyoutiandi.com\nyoutianli.com\nyoutianmetal.com\nyoutianz.com\nyoutibao.com\nyouto.club\nyoutoart.com\nyoutochat.com\nyoutoupiao.com\nyoutrans.net\nyoutu.com\nyoutube-dubbing.com\nyoutuzi.com\nyoutx.com\nyouuav.com\nyouuvs.com\nyouwanplay.com\nyouwawa.com\nyouwei-china.com\nyouwei.com\nyouweigroup.com\nyouweihui.com\nyouwo.com\nyouwoxing.net\nyouwu.today\nyouwusc.com\nyouxedu.com\nyouxi.com\nyouxi01.com\nyouxi377.com\nyouxi527.com\nyouxi528.com\nyouxi567.com\nyouxi8282.com\nyouxia.com\nyouxiacg.com\nyouxiagushi.com\nyouxiaju.com\nyouxiake.com\nyouxiake.net\nyouxiamotors.com\nyouxiangclub.com\nyouxiangyx.com\nyouxiaoad.com\nyouxiaoge.com\nyouxiaohou.com\nyouxiaxiazai.com\nyouxibao.com\nyouxibaoku.com\nyouxibd.com\nyouxica.com\nyouxicdn.com\nyouxichaguan.com\nyouxicheng.net\nyouxicitang.com\nyouxicool.net\nyouxidaxue.com\nyouxidr.com\nyouxidun.com\nyouxiduo.com\nyouxifan.com\nyouxigongchang.com\nyouxigt.com\nyouxigu.com\nyouxiguancha.com\nyouxigui.com\nyouxih.com\nyouxihezi.net\nyouxihun.com\nyouxiivf.com\nyouxila.com\nyouximt.com\nyouxin.com\nyouxingapp.com\nyouxiniao.com\nyouxinpai.com\nyouxinshi.com\nyouxinsign.com\nyouxipai.com\nyouxiping.com\nyouxiputao.com\nyouxiqiang.com\nyouxiqun.com\nyouxishuo.com\nyouxitexiao.com\nyouxituoluo.com\nyouxiuhui.com\nyouxiwangguo.com\nyouxiwugui.com\nyouxixf.com\nyouxixinzhi.com\nyouxixj.com\nyouxizhan.com\nyouxuan.com\nyouxuanan.com\nyouxuancdn.com\nyouxuandns.com\nyouxuangu.com\nyouxueke.com\nyouxuetong.com\nyouyacao.com\nyouyacheye.com\nyouyan.xyz\nyouyannet.com\nyouyantech.com\nyouyeetoo.com\nyouyegame.com\nyouyi-game.com\nyouyi800.com\nyouyicun.net\nyouyierp.com\nyouyigame.com\nyouyiguke.com\nyouyihuibk.com\nyouyijifen.com\nyouyijiu.com\nyouyiqi.com\nyouyiqiaogou.com\nyouyitape.com\nyouyitian.net\nyouyitms.com\nyouyiweizhan.com\nyouyiwms.com\nyouyix.com\nyouyixue.com\nyouyizhidao.com\nyouyo88.com\nyouyogame.com\nyouyong360.com\nyouyou.com\nyouyou001.com\nyouyou234.com\nyouyoufood.com\nyouyouwin.com\nyouyuan.com\nyouyudf.com\nyouyuegame.com\nyouyuela.com\nyouyuit.net\nyouyur.com\nyouyuwenhuay.com\nyouyuwo.com\nyouyy.com\nyouzack.com\nyouzan.com\nyouzanyun.com\nyouzhai.com\nyouzhan.org\nyouzhanjia.com\nyouzhao.com\nyouzhenhua.com\nyouzhi.net\nyouzhi99.com\nyouzhicai.com\nyouzhicn.com\nyouzhiwk.com\nyouzhixueyuan.com\nyouzhiying.com\nyouzhiyouxing.com\nyouzhou-knife.com\nyouzhu.com\nyouzhuan.com\nyouzi02.com\nyouzibuy.com\nyouzijie.com\nyouzijimu.com\nyouziku.com\nyouzikuaibao.com\nyouzipay.com\nyouzu.com\nyouzuanmy.vip\nyovisun.com\nyovocloud.com\nyovole.com\nyovyuan.com\nyowooa.com\nyoxiha.com\nyoximi.com\nyoxmail.com\nyoxuba.com\nyoxyok.com\nyoya.com\nyoybuy.com\nyoyi.tv\nyoyiapp.com\nyoyiit.com\nyoyile.com\nyoyo007.com\nyoyo1900.com\nyoyo2008.com\nyoyoask.com\nyoyoer.com\nyoyojacky.com\nyoyojie.com\nyoyokko.com\nyoyoogo.com\nyoyosc.com\nyoyotown.com\nyoyou.com\nyoytang.com\nyoyucn.com\nyoyv.com\nyozodcs.com\nyozodoc.com\nyozodocs.com\nyozooffice.com\nyozosoft.com\nyozsc.com\nyozyn.com\nyp001.com\nyp007.net\nypank.com\nypattern.com\nypblkm.com\nypc-fc.com\nypfph.com\nypgyyq.com\nyph-shop.com\nyphbuy.com\nyphuifu.com\nypiao.com\nypicw.com\nypjiameng.com\nypjsgl.com\nypkc.com\nypkegroup.com\nypky.net\nyplady.com\nyplog.net\nyplogistics.com\nyplsw.com\nypmail.work\nyppp.net\nypppt.com\nyprh.com\nypshengxian.com\nypshop.net\nypstech.com\nypwater.com\nypxiixs.xyz\nypyyjt.com\nypzdw.com\nypzhushou.com\nyq-zc.com\nyq2404.com\nyqacg.com\nyqb.at\nyqb.com\nyqb920.com\nyqbank.com\nyqbdt.com\nyqbimg.com\nyqbimg.net\nyqchjd.com\nyqcn.com\nyqcsbqxj.com\nyqdtv.com\nyqelect.com\nyqfcw.net\nyqfml.com\nyqfoodec.com\nyqfxw.net\nyqh.com\nyqh1969.com\nyqh5.com\nyqhlm.com\nyqjtgs.com\nyqk889.com\nyqk8ku.com\nyqkddm.com\nyqkk.link\nyqlzq.com\nyqmb001.com\nyqmengyou.com\nyqmh.com\nyqmls.com\nyqms.net\nyqmsn.com\nyqn.com\nyqphh.com\nyqrc.com\nyqrcw.com\nyqrtv.com\nyqsbz.com\nyqslmall.com\nyqsn.com\nyqtg.cc\nyqtkgzbk.com\nyqtsgg.com\nyqw188.com\nyqwfpy.com\nyqwxw.cc\nyqwyx.xyz\nyqxiuyoung.com\nyqxs.cc\nyqxsg.cc\nyqxsge.cc\nyqxxjy.com\nyqy021.com\nyqybzhan.com\nyqyu.com\nyqzww.cc\nyqzww.la\nyqzww.net\nyqzwww.com\nyqzxx.net\nyr-info.com\nyr17.net\nyr3.com\nyra2.com\nyracc.com\nyrapp.net\nyrcbank.com\nyrdart.com\nyretc.com\nyrglass.com\nyrgx168.com\nyrhct.com\nyrmpay.com\nyrobot.com\nyrom.net\nyrtgame.com\nyrtyyds.com\nyruan.com\nyrucd.com\nyrw.cc\nyrw.com\nyrwy.com\nyrxitong.com\nyrxsw.com\nyryz.com\nyrz.name\nyrzjw.com\nys-fj.com\nys-oss.xin\nys.cc\nys001.com\nys0431.net\nys121.com\nys133.com\nys137.com\nys168.com\nys1898.com\nys2345.com\nys4fun.com\nys630.com\nys7.com\nys720.com\nys8.com\nys991.com\nysaedesign.com\nysali.com\nysbopet.com\nysbz168.com\nyscase.com\nysch.cc\nysclass.net\nyscq.com\nyscro.com\nysczw.com\nysdq8.com\nysdwe.asia\nysedu.com\nysej.com\nysemi.com\nysepan.com\nysepay.com\nysext.com\nysfog.com\nysgang.com\nysgfood.com\nysghh.com\nysgtg.com\nysgushi.com\nyshp.net\nyshshuimitao.com\nyshsports.com\nyshw1.com\nyshzjt.com\nysicing.net\nysidcz.com\nysiis.com\nysirv.com\nysjcyxgs.com\nysjdaijia.com\nysjf.com\nysjianzhan.com\nysjkbk.com\nysjwj.com\nyskcsj.com\nyskjz.com\nyskjzj.com\nyskxjy.com\nyslcw.com\nyslpaint.com\nyslqo.com\nyslw.com\nyslyhr.com\nyslzc.com\nysmeet.com\nysmiji.com\nysmine.com\nysmir.net\nysn.cc\nysnews.net\nysod.com\nysok.net\nysol.com\nysosuo.com\nysplay.com\nysrencai.com\nysrh.com\nysrzdb.com\nysslc.com\nyssp88.com\nyssql.com\nyssrmyy.com\nysstech.com\nysszzs.com\nyst100.net\nystan.com\nystb.com\nystbds.com\nysten.com\nystencdn.com\nysts.cc\nystsx.com\nystzzy.com\nysug.com\nysupan.com\nysw1950.com\nysw68.com\nyswebportal.cc\nyswh.com\nyswlgame.com\nyswswkj.com\nyswu.net\nyswyyds.com\nysx8.vip\nysx9999.com\nysxapp.com\nysxs8.com\nysxswz.com\nysxts.com\nysxyhtz.com\nysxzls.com\nysys.com\nysyycv.com\nyszpwatch.com\nyszx99.com\nyszxx.net\nyszyun.com\nyt-ma.com\nyt-taili.com\nyt-xinpeng.com\nyt0.cc\nyt1998.com\nyt2.net\nyt69.com\nyt698.com\nytaotao.net\nytaxx.com\nytbainakeji.com\nytbbs.com\nytbfilm.com\nytbt.cc\nytcables.com\nytcbh.com\nytccr.com\nytchangyang.com\nytcj.com\nytcnc.net\nytcutv.com\nytdaily.com\nytdcloud.com\nyte1.com\nytecn.com\nytedi.com\nytelc.com\nyteng.net\nytesting.com\nytf8888.com\nytfcjy.com\nytg666.com\nytgas.com\nytghnb.com\nytgos.com\nythairui.com\nytholidayplaza.com\nythospital.com\nythouse.com\nythzg.com\nytjcpj.com\nytjiage.com\nytjlc.net\nytjob.com\nytjpkj.com\nytjqjt.com\nytjunyue.com\nytkiewvf.cc\nytkj2010.com\nytlh120.com\nytlvbao.com\nytmachinery.net\nytmc.press\nytmedia.tv\nytmgz.com\nytmingju.com\nytnetgame.com\nytnstone.com\nyto-jsd.com\nyto-lgs.com\nyto-lgs.net\nyto.vip\nyto.xin\nyto56test.com\nytocargo.com\nytoexpress.com\nytoglobal.com\nytogroup.com\nytoholding.com\nytokj.com\nytokj.net\nytoluohan.com\nytoluohan.net\nytoluohan.xin\nytop8.com\nytphq.com\nytport.com\nytpowder.com\nytpp.com\nytpu.com\nytqh-electric.com\nytrain.com\nytrcw.com\nytrdc.com\nytrlzyw.com\nytrmtzx.com\nyts88.com\nytsanchuan.com\nytsense.com\nytsfc.com\nytshipin.com\nytsyy.com\nytszg.com\nyttxcs.com\nytud.net\nytuqy.com\nytusmart.com\nytwater.com\nytxedu.com\nytxinhai.com\nytxinyan.com\nytxsc.com\nytxww.com\nytyaoye.com\nytyhdyy.com\nytyz.net\nytyz.org\nytzhihui.com\nytzq.com\nytzww.com\nyu-electronics.net\nyu163.com\nyu4l.com\nyu72.com\nyu7l.com\nyuaigongwu.com\nyuaiweiwu.com\nyuan2808.com\nyuan7i.com\nyuanabsorber.com\nyuanbaobaoxian.com\nyuanbaokc.com\nyuanbaotaoche.com\nyuanbei.biz\nyuanben.io\nyuanbin.me\nyuancangipr.com\nyuancdn.com\nyuancefund.com\nyuanchang888.com\nyuanchengroup.com\nyuanchengxiezuo.com\nyuanchuangyinyue.com\nyuancoder.com\nyuanda-fm.com\nyuandacn.com\nyuandaocn.com\nyuandi.com\nyuandian.club\nyuandiancredit.com\nyuandongsl.com\nyuanf56.com\nyuanfen.icu\nyuanfeng021.com\nyuanfeng1.com\nyuanfudao.biz\nyuanfudao.com\nyuanfudao.ws\nyuanfudaoschool.com\nyuanfusc.com\nyuangongbao.com\nyuanhaitaiji.com\nyuanhangqiche.com\nyuanhangzyt.com\nyuanhechem.com\nyuanhengyi.com\nyuanheyaoye.com\nyuanhua.com\nyuanhuixinhai.com\nyuanjingang.com\nyuanjingss.com\nyuanjisong.com\nyuanjoy.com\nyuanlai.com\nyuanlei.net\nyuanley.com\nyuanlian365.com\nyuanlin.com\nyuanlin365.com\nyuanlin8.com\nyuanlvkeji.com\nyuanma.net\nyuanmadian.com\nyuanmait.com\nyuanmajiaoyiw.com\nyuanmatao.com\nyuanmengyouxuan.com\nyuano.cc\nyuanpanguoji.com\nyuanqiao.net\nyuanqiao.pw\nyuanqilt.com\nyuanqingsh.com\nyuanqisenlin.com\nyuanrenbang.com\nyuanrengu.com\nyuanrenxue.com\nyuansfer.com\nyuanshen.com\nyuanshi-sec.com\nyuanshichang.com\nyuanshuflow.com\nyuansikeji2021.com\nyuansoti.com\nyuansouti.biz\nyuansouti.com\nyuant.net\nyuantaobgjj.com\nyuanteng.net\nyuantest.com\nyuantiku.biz\nyuantiku.com\nyuantongyizhan.com\nyuantoushuo.com\nyuantu.info\nyuantuedu.com\nyuantujun.com\nyuantutech.com\nyuanu.com\nyuanvip.shop\nyuanweish.com\nyuanwind.com\nyuanwsk.com\nyuanxianmedia.com\nyuanxinbaoxian.com\nyuanxinjituan.com\nyuanyaedu.com\nyuanyangbj.com\nyuanyangcoffee.com\nyuanyangmed.com\nyuanyeer.com\nyuanyoumao.com\nyuanyoutao.com\nyuanyubusiness.com\nyuanzhanapp.com\nyuanzhexi.com\nyuanzhi.com\nyuanzhihao.life\nyuanzhiyijiantong.com\nyuanzidai.com\nyuanzige.com\nyuanzipower.com\nyuanziyan.com\nyuanzun.fun\nyuaoq.com\nyuapt.com\nyubaike.com\nyubangweb.com\nyuboinfo.com\nyuboqj.com\nyucekj.com\nyucezhijia.com\nyuchai.com\nyuchaicd.com\nyuchaidiesel.com\nyuchainev.com\nyuchainz.com\nyuchaipg.com\nyuchaizm.com\nyuchenpharm.com\nyuchenw.com\nyuchofoodmachine.com\nyuchuan.org\nyuchuantech.com\nyuci998.com\nyucoolgame.com\nyucui.org\nyucunkeji.com\nyudamedical.com\nyudeglobal.com\nyudiangame.vip\nyudiaomingjia.com\nyudiu.com\nyudoauto.com\nyudouyudou.com\nyuduxx.com\nyue-grh.com\nyue-tao.com\nyue365.com\nyue7.com\nyuebai.tv\nyueban.com\nyueban.net\nyuebao.ltd\nyuebei.vip\nyuebeist.com\nyuebie.com\nyueblx.com\nyuebooemt.com\nyuecdn.net\nyuecheng.com\nyuecong.club\nyueda.com\nyuedainvest.com\nyuedaoec.com\nyuedarzzl.com\nyuedatc.com\nyuedianedu.com\nyuedisk.com\nyuedsk.com\nyuedu.pro\nyuedu88.com\nyuedufang.com\nyueduji.com\nyuedujiayuan.com\nyuedunovel.com\nyueduwen.com\nyueduwu.com\nyueduwuxianpic.com\nyueduyun.com\nyuegongyutu.com\nyuegowu.com\nyuegui.shop\nyueguisuchong.com\nyuehaifeed.com\nyuehaowy.com\nyueimg.com\nyueji.com\nyuejiewangluo.com\nyuejikeng.com\nyuejob.com\nyuejuanbao.com\nyuejuwang.com\nyueka.com\nyuekenet.com\nyuekesoft.com\nyuekesoft.net\nyuekeyun.com\nyuelanxinghe.com\nyueliangshi.com\nyuelongchina.com\nyuelongdzc168.com\nyueloo.com\nyuelu.net\nyuelun.com\nyuelvxing.com\nyuemagroup.com\nyueme.tv\nyuemei.com\nyuemicn.com\nyueniuzq.com\nyuenongren.com\nyuenshui.com\nyuenwooping-truelegend.com\nyuenyled.com\nyuepaijia.com\nyueqi.com\nyueqiji.com\nyueqikan.com\nyueqingchayuan.com\nyueqiweixiu.com\nyueqiyou.com\nyueque.com\nyuequtech.com\nyuer.com\nyuerbao.com\nyueren123.com\nyuerenjt.com\nyueru.com\nyuerugou.com\nyuesekaer.com\nyueserve.com\nyueseyuewei.com\nyueshenggame.com\nyueshifengyin.net\nyueshitv.com\nyuesuoping.com\nyuetengiot.com\nyueting.net\nyuetingapp.com\nyuetj.com\nyuetu.tech\nyuetuvip.com\nyuetuvip.net\nyuewanggd.com\nyuewei007.com\nyueweimusic.com\nyuewen.com\nyuexiamen.com\nyuexiangpin.com\nyuexiangspace.com\nyuexindianqi.com\nyuexing.com\nyuexingchem.com\nyuexinship.com\nyuexirc.com\nyuexiren.com\nyuexiu-finance.com\nyuexiu.com\nyuexiudevelopment.com\nyuexiufoods.com\nyuexiuleasing.com\nyuexiuproperty.com\nyuexunedu.com\nyuexw.com\nyueya.net\nyueyaa.com\nyueyan365.com\nyueyangshop.com\nyueyangyy.com\nyueyat.net\nyueye7.com\nyueyear.com\nyueyouxs.com\nyueyq.com\nyueyu114.com\nyueyuanzhiye.com\nyueyues.com\nyueyueworld.com\nyueyueyd.com\nyueyuez.com\nyueyundns.com\nyueyuzhushou.com\nyuezeyi.com\nyuezhicn.com\nyuezhiding.com\nyuezhinan.com\nyufanlogistics.com\nyufanwei.com\nyufeng05.com\nyufenggroup.com\nyufenjiameng.com\nyuflc.com\nyufuid.com\nyufuid.net\nyugasun.com\nyugenmed.com\nyugew.com\nyuglf.com\nyugongw.com\nyugudz.com\nyuguimedia.com\nyuguo.com\nyuguowang.net\nyugusoft.com\nyuguz.com\nyuhaids.com\nyuhaiyiya.com\nyuhaochemical.com\nyuhaotime.com\nyuhaozhixing.com\nyuheii.com\nyuhein.com\nyuhengcheng.com\nyuhocare.com\nyuhongchem.com\nyuhongpharm.com\nyuhou.com\nyuhougame.com\nyuhsoft.com\nyuhuagu.com\nyuhuaholding.com\nyuhuanghuagong.com\nyuhucoldchain.com\nyuhuijob.com\nyuhx.com\nyui06111shga.com\nyui06130shga.com\nyui06131shga.com\nyui06161shga.com\nyui06171shga.com\nyujia.com\nyujiahui.com\nyujianai520.com\nyujianpay.com\nyujianxiaomian.com\nyujiawuliu.com\nyujiefs.com\nyujifruit.com\nyujingkj.com\nyujiu.vip\nyujpa.com\nyujunjie.com\nyujunren.com\nyukaidi.com\nyukaiprecision.com\nyukeinfo.com\nyukeweb.com\nyukexinchem.com\nyukicat.net\nyukicomic.com\nyukiovo.com\nyukuai.com\nyukxw.com\nyulangair.com\nyule114.com\nyule263.com\nyuledaily.com\nyulefm.com\nyulehezi.com\nyuleie.com\nyulejiaodian.com\nyulekan.com\nyulekoudai.com\nyuleqiu.com\nyulhe.com\nyuli.be\nyuliancn.com\nyuliang-sh.com\nyulicdn.com\nyulinapp.com\nyulincard.com\nyulindxgjj.com\nyulinedu.net\nyulingtianxia.com\nyulinhuaran.com\nyulinjue.com\nyulinqj.com\nyulins.com\nyulinshidefu.com\nyulinyw.com\nyuliqx.com\nyulong.com\nyulongdt.com\nyulongjun.com\nyulongpc.com\nyulongsteelpipe.com\nyulongtour.com\nyulongwanski.com\nyuloo.com\nyulore.com\nyulorepages.com\nyulu1.com\nyulu99.com\nyuluju.com\nyuluyao.com\nyulv.net\nyumao.com\nyumaochuhai.com\nyumaoclub.com\nyumaoshu.com\nyumchina.com\nyumi.cc\nyumi.com\nyumimobi.com\nyumingguwen.com\nyumingyouhui.com\nyummy.tech\nyumstone.com\nyun-ac.com\nyun-dns.com\nyun-gu.com\nyun-idc.com\nyun-img.com\nyun-jinrong.com\nyun-jintong.com\nyun-kai.com\nyun-live.com\nyun-qu.com\nyun-wp.com\nyun123.com\nyun5.vip\nyun61.com\nyun88.com\nyunadmins.com\nyunalias.com\nyunannet.com\nyunaq.com\nyunarm.com\nyunassess.com\nyunaw.com\nyunba.io\nyunban.com\nyunbaofei.com\nyunbaolai.com\nyunbaoming.com\nyunbei.com\nyunbiao.tv\nyunbiaowulian.com\nyunbiaozhun.com\nyunbiji.com\nyunbisai.com\nyunbohealth.com\nyunbook.vip\nyunbu.me\nyunbugame.com\nyunbuzhan.com\nyuncai5.com\nyuncaioo.com\nyuncdn.bid\nyuncdn123.com\nyuncdn263.com\nyuncdndun.com\nyunce.work\nyuncechina.com\nyunceng.com\nyunchelogistics.com\nyuncheng.com\nyunchexing.com\nyunchip.com\nyunchonglife.com\nyunchongmob.com\nyunchou.com\nyunchuan.info\nyuncii.com\nyuncitys.com\nyuncloudauth.com\nyuncname.com\nyuncode.net\nyuncuntu.com\nyund.tech\nyunda56.com\nyundaex.com\nyundagongyi.com\nyundagroup.com\nyundalog.com\nyundaltl.com\nyundangan.com\nyundangnet.com\nyundaomen.com\nyundasys.com\nyunde.net\nyundianjia.com\nyundianseo.com\nyundiantech.com\nyundingdun.com\nyundongfang.com\nyundonghao.com\nyundongit.com\nyundousoft.com\nyundui.cc\nyunduimedia.com\nyundun.com\nyundun.shop\nyunduncdn.com\nyunduncdns.com\nyunduncname.com\nyundunddos.com\nyundundns.com\nyunduns.com\nyundunwaf.com\nyundunwaf1.com\nyundunwaf2.com\nyundunwaf3.com\nyundunwaf4.com\nyundunwaf5.com\nyunduocrm.com\nyunduoke.net\nyunduoketang.com\nyunduolp.com\nyundzh.com\nyuneach.com\nyunerba.com\nyunews.net\nyunexam.com\nyunexpress.com\nyunfabiao.com\nyunface.com\nyunfalv.com\nyunfan.com\nyunfan0739.com\nyunfancdn.com\nyunfangtan.com\nyunfanka.com\nyunfanyouxi.com\nyunfei89.com\nyunfeihudong.com\nyunfeitech.com\nyunfeiyang.com\nyunfengdie.com\nyunfutang8.com\nyunfutech.com\nyunfuwuqiba.com\nyungangbj.com\nyungao-ssp.com\nyungao.mobi\nyungbang.com\nyungengxin.com\nyungongchang.com\nyungotec.com\nyungou618.com\nyungouos.com\nyungousj.net\nyungpu.com\nyungu.org\nyunguajibao.com\nyungujia.com\nyunhaicangshu.com\nyunhaike.com\nyunhaiqiao.com\nyunhaisteel.com\nyunhaoka.com\nyunhaoren.com\nyunhe518.net\nyunhedata.com\nyunhehudong.com\nyunheit.com\nyunhesanwan.com\nyunhetong.com\nyunhou.com\nyunhuangroup.com\nyunhuaq.com\nyunhuasheji.com\nyunhuashu.com\nyunhuijing.com\nyunhulu.org\nyunhuotong.net\nyunifang.com\nyunify.com\nyunio.com\nyunip.com\nyunipo.com\nyunji.work\nyunji.xin\nyunjian.com\nyunjian.net\nyunjiasu-cdn.net\nyunjiasu.cc\nyunjiasu.com\nyunjiasu360.com\nyunjiazheng.com\nyunjichaobiao.com\nyunjie.art\nyunjiemi.net\nyunjifarm.com\nyunjiglobal.com\nyunjing720.com\nyunjingdian.net\nyunjinggo.com\nyunjinginc.com\nyunjitele.com\nyunjiweidian.com\nyunjix.com\nyunjuwuliu.com\nyunkaiguan.com\nyunkangdoctor.com\nyunkanghealth.com\nyunkanpan.com\nyunkawulian.com\nyunkd.com\nyunke.com\nyunkejituan.com\nyunken.com\nyunketop.com\nyunkezan.com\nyunkuaimai.com\nyunkushop.com\nyunlaiwu.com\nyunlangtuanjian.com\nyunlie.net\nyunlietou.com\nyunliketech.com\nyunlinghang.com\nyunlitz.com\nyunliunet.com\nyunlsp.com\nyunlucn.cc\nyunma99.com\nyunmai.com\nyunmayi.com\nyunmc.vip\nyunmd.net\nyunmeipai.com\nyunmell.com\nyunmengdata.com\nyunmianqian.com\nyunmoseo.com\nyunmoxing.com\nyunn-tech.com\nyunna.me\nyunnan.vip\nyunnancoffee.org\nyunnandns.com\nyunnanjun.com\nyunnanlong.com\nyunnanuu.com\nyunnao.com\nyunneidongli.com\nyunos-inc.com\nyunos-tv.com\nyunos.com\nyunpan.com\nyunpansou.cc\nyunpanx.com\nyunparking.cloud\nyunpay.cc\nyunpei.com\nyunpian.com\nyunpiao.net\nyunqi.org\nyunqi2050.com\nyunqi6.com\nyunqiba.com\nyunqifly.com\nyunqiju.com\nyunqikecrm.com\nyunqingugm.com\nyunqishi.net\nyunqishi8.com\nyunqishuju.com\nyunqiyqh.com\nyunque360.com\nyunquna.com\nyunrang.fun\nyunrenshi.net\nyunrg.com\nyunrongu.com\nyunruicloud.com\nyunruikj.com\nyunruizz.com\nyunsd.net\nyunser.com\nyunshan.net\nyunshangdian.com\nyunshangguangdong.com\nyunshanghangzhou.com\nyunshangkj.com\nyunshangnc.com\nyunshangshou.com\nyunshangsuzhou.com\nyunshangxuzhou.com\nyunshangzhejiang.com\nyunshanit.com\nyunshanmedical.com\nyunshanmeicai.com\nyunsheng.com\nyunsheng999.com\nyunshibuluo.com\nyunshicloud.com\nyunshiketang.xyz\nyunshipei.com\nyunshow.com\nyunshunxx.com\nyunshuren.com\nyunshuwh.com\nyunsiya.com\nyunsom.com\nyunsong.com\nyunsou168.com\nyunssl.com\nyunsuan.org\nyunsuanzi.com\nyunsuo.com\nyuntaigo.com\nyuntask.com\nyuntemai.com\nyunteng-group.com\nyuntiancloud.com\nyuntianti.com\nyuntianxia.com\nyuntingbo.com\nyuntingiot.com\nyuntisoft.com\nyuntongauto.com\nyuntongbu.com\nyuntongcloud.com\nyuntongshuke.com\nyuntongxun.com\nyuntongzy.com\nyuntop.com\nyuntsg.com\nyuntu.io\nyuntue.com\nyuntuiweishang.com\nyuntuoguan.cc\nyuntus.com\nyuntus.net\nyuntust.com\nyuntuys.com\nyuntyfilter.com\nyunupay.com\nyunverify.com\nyunvm.com\nyunwei8.com\nyunweibang.com\nyunweipai.com\nyunweiwl.com\nyunwenkeji.com\nyunwenxue.com\nyunwins.com\nyunwuxian.net\nyunxi.cc\nyunxi.net\nyunxi.tv\nyunxi10.com\nyunxiacn.com\nyunxianchang.com\nyunxiao.com\nyunxin123.com\nyunxin163.com\nyunxinapi.com\nyunxindai.com\nyunxindns.com\nyunxinfa.com\nyunxinfw.com\nyunxing123.com\nyunxingslb.com\nyunxinhi.com\nyunxinhy.com\nyunxinrtc.com\nyunxinshi.com\nyunxinsvr.com\nyunxinvcloud.com\nyunxinvideo.com\nyunxiren.com\nyunxish.com\nyunxiu.com\nyunxs.com\nyunxuetang.com\nyunxunmedia.com\nyunxya.com\nyunyangwang.com\nyunyazu.com\nyunyi-china.com\nyunyi-dd.com\nyunyibiji.com\nyunyichong.com\nyunyihudong.com\nyunyin.org\nyunying001.com\nyunyingbiotech.com\nyunyingdashu.com\nyunyingketang.com\nyunyingmiao.com\nyunyingpai.com\nyunyingxbs.com\nyunyingxuetang.com\nyunyis.com\nyunyiyuan.com\nyunyize.com\nyunyoufeitian.com\nyunyouni.com\nyunyousj.com\nyunysr.com\nyunyu123.com\nyunyuba.com\nyunyueqiji.com\nyunyunvip.com\nyunyuwuyou.com\nyunzazhi.com\nyunzehj.com\nyunzhan365.com\nyunzhangfang.com\nyunzhanggui.net\nyunzhanghu.com\nyunzhanxinxi.com\nyunzhanyou.com\nyunzhifankeji.net\nyunzhijia.com\nyunzhirencai.com\nyunzhisec.com\nyunzhitai.com\nyunzhixiyou.com\nyunzhizao.net\nyunzhonghe.com\nyunzhu100.com\nyunzhuan.com\nyunzhuangbei.com\nyunzhuxue.com\nyunzitraining.com\nyunzmall.com\nyunzongnet.com\nyunzuji.vip\nyunzujia.com\nyunzuowen.com\nyunzuoye.net\nyunzz.net\nyuoucn.com\nyupao.com\nyupaowang.com\nyupeiholdings.com\nyupinny.com\nyupoo.com\nyupu.com\nyuqianshu.com\nyuqiao.com\nyuqiaolong.com\nyuqinpin.com\nyuquanhosp.com\nyuque.com\nyur09130og.com\nyur09140og.com\nyuren.org\nyuriimg.com\nyurongoptical.com\nyurun.com\nyusa.me\nyusainorthwest.com\nyusanmao12345.store\nyushanfang.com\nyushangmao.com\nyushengny.com\nyushengtang.com\nyushexuetang.com\nyushics.com\nyushin88.com\nyushiyan.net\nyushiyuan.com\nyushu5.com\nyushunews.com\nyusi.com\nyusi.tv\nyusi123.com\nyusii.com\nyusii.net\nyusinvestment.com\nyusiyy.com\nyusmnfgh.vip\nyusongec.com\nyusuan.com\nyusunjewelry.com\nyusuusnw.com\nyusxz.com\nyutai365.com\nyutainews.com\nyutaoyouxi.com\nyuteng.site\nyutennet.com\nyutian.cc\nyutianedu.com\nyutonad.com\nyutong.com\nyutongplay.vip\nyutongzyc.com\nyuttz.com\nyutuwo.com\nyuucn.com\nyuudnn.com\nyuwan-game.com\nyuwang.com\nyuwangcn.com\nyuwanjianshe.com\nyuwanyouxi.com\nyuweikuijianzhan.com\nyuweitek.com\nyuweiyanwo.com\nyuwell.com\nyuwellgroup.com\nyuwen.net\nyuwen123.com\nyuwen360.com\nyuwenchaoshi.com\nyuwenmi.com\nyuwennews.com\nyuwenxiandaihua.com\nyux.team\nyuxianall.com\nyuxiangwang0525.com\nyuxianxing.com\nyuxiaogroup.com\nyuxiaor.com\nyuxiaotuo.com\nyuxicorrosion.com\nyuxinews.com\nyuxinoulogistics.com\nyuxipark.com\nyuxitech.com\nyuyangtec.com\nyuyejt.com\nyuyicai.com\nyuyin.tv\nyuyinct.com\nyuyinfanyi.com\nyuyingufen.com\nyuyoung32.com\nyuyouyouxi.com\nyuyu.com\nyuyue111.com\nyuyue27.com\nyuyuecoat.com\nyuyueshop.com\nyuyuetec.com\nyuyuetui.com\nyuyueweb.com\nyuyuezhiyangji.com\nyuyunkj.com\nyuyuntang.com\nyuyuntech.com\nyuzeli.com\nyuzeli.net\nyuzhengzixun.net\nyuzhenhai.com\nyuzhicaiexpo.com\nyuzhiguo.com\nyuzhike.com\nyuzhong.biz\nyuzhong.net\nyuzhongxxw.com\nyuzhoua.com\nyuzhouwan.com\nyuzhouyiyuan.com\nyuzhua.com\nyuzhuan.com\nyuzhulin.com\nyuzhuw.com\nyuzijiaoyu.com\nyuzmshanghai.org\nyuzone.net\nyuzua.com\nyuzundaojia.com\nyvkkqfy7m.shop\nyvrdream.com\nyvv.in\nyvzfgigpiwmofux.com\nyw11.com\nyw160.com\nyw2005.com\nywart.com\nywbank.com\nywcbs.com\nywclxp.com\nywdier.com\nywditan315.com\nywei.org\nyweisugar.com\nywfby.com\nywgc.net\nywgd.com\nywhack.com\nywhqs.com\nywies-bj.com\nywies-gz.com\nywies-sh.com\nywies-shpd.com\nywindex.com\nywinf.com\nywint.net\nywit.xyz\nywjinfabag.com\nywkefu.com\nywky.org\nywlandport.com\nywnds.com\nywnz.com\nywopt.com\nywork.me\nywpark.net\nywshouyou.com\nywshouyou.net\nywsoftware.com\nywstsb.com\nywt.com\nywtd.xyz\nywtds.com\nywurl.com\nywwl.com\nywwpay.com\nywxue.com\nywxww.net\nywyanxing.com\nywyishi.com\nywziwei.com\nywzt.org\nywzz.com\nyx-g.com\nyx-s.com\nyx-s.net\nyx0599.com\nyx090.com\nyx12345.com\nyx1312.com\nyx192.com\nyx231.com\nyx643.com\nyx7088.com\nyx74.com\nyx7507.com\nyx93.com\nyx988.com\nyx99.com\nyxacc6.com\nyxad.com\nyxaz.com\nyxbabe.com\nyxbao.com\nyxbhhbkj.com\nyxbk.com\nyxbox91.com\nyxbrand.com\nyxc.hk\nyxcal.com\nyxcax.com\nyxcc.net\nyxcity.com\nyxcxfw.com\nyxdaily.com\nyxdd.com\nyxdh.com\nyxdimg.com\nyxdinghuo.com\nyxdmgame.com\nyxdou.com\nyxdown.com\nyxdr.com\nyxduo.com\nyxdwj.com\nyxecg.com\nyxeht.com\nyxen.net\nyxflzs.com\nyxfshop.com\nyxfw.com\nyxfwai.com\nyxgames.fun\nyxgcx.com\nyxgczx.com\nyxgf.net\nyxgfcj.com\nyxgxbike.com\nyxgxw.com\nyxgxz.com\nyxgzs.com\nyxhao.com\nyxhapi.com\nyxhenan.com\nyxhhdl.com\nyxhhr.com\nyxhi.com\nyxhimg.com\nyxhjgs.com\nyxholding.com\nyxhqj.com\nyxhy.asia\nyxhyu.com\nyxi.cc\nyxiangzu.com\nyxiannetgz.com\nyxianypin.com\nyxid.net\nyxielts.com\nyxilogistics.com\nyximgs.com\nyxin18.com\nyxinbao.com\nyxintent.com\nyxit.net\nyxixy.com\nyxjia.com\nyxjjdby.com\nyxjkhb.com\nyxjob.net\nyxjs.org\nyxjsjg.com\nyxjuren.com\nyxjyy.net\nyxk120.com\nyxkfw.com\nyxkjlcd.com\nyxkxyghx.org\nyxlaba.com\nyxlady.com\nyxlady.net\nyxle.net\nyxlele.com\nyxlink.com\nyxlmdl.net\nyxlqge.com\nyxlsj.com\nyxm.com\nyxmarketing01.com\nyxmcu.com\nyxmspx.com\nyxmxc.com\nyxn.fun\nyxnu.net\nyxnxz.com\nyxool.com\nyxopt.com\nyxou.com\nyxph.com\nyxpk.net\nyxpms.com\nyxptfs.com\nyxqiche.com\nyxrb.net\nyxrcw.com\nyxrj.com\nyxsc33.com\nyxsea.com\nyxsj.net\nyxsos.com\nyxss.com\nyxssp.com\nyxsxhj.com\nyxt-tattoo.com\nyxt.com\nyxtidc.com\nyxtk.xyz\nyxttzb.com\nyxtvg.com\nyxuankeji.com\nyxun.net\nyxwg21lyyn.com\nyxwh5.com\nyxwic.com\nyxwsgame.com\nyxx-china.com\nyxxgame.com\nyxxurl.com\nyxxzbox.com\nyxybb.com\nyxydns.com\nyxylbz.com\nyxyy33.com\nyxyzjx.com\nyxz.me\nyxzd.info\nyxzggame.com\nyxzhi.com\nyxzoo.com\nyxzp.net\nyxzq.com\nyxzu.com\nyxzxgy.com\nyxzzd.com\nyy.com\nyy11.com\nyy138.com\nyy1986.com\nyy2169.com\nyy2hd.com\nyy365.com\nyy4080.com\nyy502.com\nyy520.com\nyy591.com\nyy845.com\nyy960.com\nyyarea.com\nyyblly.com\nyybnet.net\nyybox.cc\nyycec.com\nyyclouds.com\nyyclub.org\nyyclub.work\nyycoin.com\nyycqc.com\nyycqfw.com\nyyctrade.com\nyyczxt.com\nyydbzz.com\nyydcs.com\nyyddss.vip\nyydl-china.com\nyyds.co\nyyds.pink\nyyds.space\nyydsmh.com\nyydsok.com\nyydszp.com\nyydy.com\nyydzh.com\nyyearth.com\nyyej.com\nyyestar.com\nyyfax.com\nyyfdcw.com\nyyfqm.com\nyyfunning.com\nyyg.com\nyyg120.com\nyyg7.com\nyygamedev.com\nyyge.com\nyygold.com\nyygongzi.com\nyygrammar.com\nyyh78.com\nyyha168.com\nyyhao.com\nyyhh.com\nyyhn365.com\nyyhybz.com\nyyi100.com\nyyijt.com\nyyixx.com\nyyizu.com\nyyjingyan.com\nyyjxkj.com\nyyjzt.com\nyyk100.com\nyykj.site\nyykj2003.com\nyykj8775.com\nyykpx.com\nyylending.com\nyylivens.com\nyylm.org\nyylys.com\nyymedias.com\nyyming2.com\nyymoban.com\nyynetwk.com\nyynykj.com\nyyouren.com\nyyoz.com\nyypf-china.com\nyypjyds.com\nyypt.com\nyyq.com\nyyquan.vip\nyyqyweb.com\nyyqyyyy.com\nyyrc.com\nyyrec.com\nyyrenting.com\nyyrjd.net\nyyrtv.com\nyysf.cc\nyyshangfu.com\nyystatic.com\nyysweb.com\nyyszfsxx.com\nyyszq.com\nyytcdn.com\nyytek.com\nyytfood.com\nyytiflytek.com\nyytingli.com\nyyuap.com\nyyutfzv.com\nyywd.com\nyywlsj.com\nyywords.com\nyyws.net\nyywsb.com\nyywsbjb.com\nyywszzs.com\nyywt.online\nyywx888.com\nyywz123.com\nyywzw.com\nyyx.com\nyyxfilm.com\nyyxfplayer.com\nyyxmgl.com\nyyxsen.com\nyyxtao.com\nyyxx100.com\nyyxxgame.com\nyyxxgameyw.com\nyyxyjt.com\nyyy1389.com\nyyyeee.com\nyyyisp.com\nyyylll.com\nyyymvp.com\nyyyncp.com\nyyyqkq.com\nyyyqm.com\nyyyxbl.com\nyyyy.games\nyyyyy.run\nyyz100.com\nyyzb-live.com\nyyzdjd.com\nyyzdm.com\nyyzf.com\nyyzf.vip\nyyzls.com\nyyzqta.com\nyyzqtb.com\nyyzsoft.com\nyyzw.com\nyyzx.org\nyyzxcj.com\nyyzy-play.vip\nyyzyytj.com\nyyzzqk.com\nyyzzsem.com\nyz-iot.com\nyz-kjjt.com\nyz-li.com\nyz-machinery.com\nyz-proton.com\nyz-show.com\nyz-xd.com\nyz0752.com\nyz168.cc\nyz2pp.com\nyz2y.com\nyz360.cc\nyz3c.com\nyz3l.com\nyz4l.com\nyzajz.com\nyzbank.com\nyzbhn.work\nyzbo.tv\nyzbpro.com\nyzbqzx.net\nyzbsytl.com\nyzceg.com\nyzckjt.com\nyzcn.net\nyzcnet.com\nyzcrown.net\nyzcsoft.com\nyzcxx.com\nyzcyj.net\nyzcyjy.com\nyzcyts.com\nyzdfyy.com\nyzdhxx.com\nyzdir.net\nyzdjkcy.com\nyzdn.net\nyzdryer.com\nyzdx99.com\nyzdxnews.com\nyzdyhwh.com\nyzeco.com\nyzej.com\nyzemd.com\nyzfang.com\nyzfbgjj.com\nyzfc8.com\nyzfcdn.com\nyzfchat.com\nyzfdc.net\nyzfjy.com\nyzfrkf.com\nyzftpx.com\nyzfybj.com\nyzgcsj.com\nyzgcyy.com\nyzggdj.com\nyzgjgs.com\nyzgnet.com\nyzgttm.com\nyzgzx.com\nyzh.li\nyzhbw.net\nyzhcloud.com\nyzhdyy.com\nyzhejin.com\nyzhi.cc\nyzhifupay.com\nyzhmyy.com\nyzhotels.com\nyzhp.com\nyzhqyy.com\nyzhrhl.com\nyzhsk.com\nyzhuali.com\nyzhx.net\nyzhyai.com\nyzie.net\nyziin.com\nyzimgs.com\nyzinter.com\nyzitc.com\nyzj.cc\nyzja.com\nyzjb.com\nyzjdgs88.com\nyzjiaozhai.com\nyzjj120.com\nyzjjw.net\nyzjob.net\nyzjship.com\nyzjsxy.com\nyzjtcyjt.com\nyzjtech.com\nyzjyfz.com\nyzkdfcw.com\nyzkhfw.com\nyzkimage.com\nyzkjpcb.com\nyzkos.com\nyzlngi.com\nyzlxjt.com\nyzlyxx.com\nyzmary.com\nyzmat.com\nyzmcms.com\nyzmcxx.com\nyzmg.com\nyzmgf.com\nyzmiao03.com\nyzmls.com\nyzmoney.com\nyznano.com\nyzncms.com\nyznn.com\nyzntv.com\nyzops.net\nyzpanstar.com\nyzpetfood.com\nyzpfbyy.com\nyzport.com\nyzqcw.com\nyzqgamefun.com\nyzqx.com\nyzqzf.com\nyzra900.com\nyzrayy.com\nyzrb.com\nyzrc.net\nyzren.com\nyzrenai.com\nyzrom.com\nyzrshop.com\nyzrsks.com\nyzrss.com\nyzrzgroup.com\nyzs.com\nyzs.io\nyzsbh.com\nyzsbhjt.com\nyzsfuer.com\nyzshkjxx.com\nyzshyzz.com\nyzsljz.com\nyzsrmyy.org\nyzsszw888.com\nyzstudio.net\nyzsz.net\nyzsz3.icu\nyzszsxh.com\nyzszyy.com\nyzt-tools.com\nyzt888.com\nyztcdn.com\nyztchg.com\nyztjb.net\nyztzairport.net\nyzw.cc\nyzwb.com\nyzwb.net\nyzweekly.com\nyzx0771.com\nyzxcfdj.com\nyzxdyrmyy.com\nyzxw.com\nyzxxfzy.com\nyzy-gx.com\nyzygo.com\nyzyhyy.com\nyzyjhg.com\nyzyouth.com\nyzywhw.com\nyzyxart.com\nyzyxgame.com\nyzyz.org\nyzzcyy.com\nyzzd.com\nyzzp.com\nyzzpw.com\nyzzs.cc\nyzzsoft.com\nyzzxjyjt.com\nyzzxxz.com\nyzzy20-play.com\nyzzy29-play.com\nyzzy31-play.com\nyzzyimages.com\nz-bank.com\nz-henergy.com\nz-inn.com\nz-tek.com\nz.ai\nz.wiki\nz0.cc\nz01.com\nz0ukun.com\nz120.com\nz12345.com\nz17.link\nz1987.com\nz1cdn.com\nz211.vip\nz28j.com\nz2chain.com\nz2ehospital.com\nz2imc.com\nz2sci.com\nz2u.tv\nz316.com\nz318.com\nz3quant.com\nz4bgpo.com\nz574.com\nz5encrypt.com\nz5w.net\nz5z4.com\nz668.net\nz6e.com\nz701.com\nz729.com\nz7xz.com\nz888.net\nz8q.cc\nz99.biz\nz9cdn.com\nza-cosmetics.com\nza-doctor.com\nzabxib.com\nzac1993.com\nzachina.org\nzack.asia\nzacveh.com\nzadervice.com\nzaduonews.com\nzaecu.com\nzaeke.com\nzaepi.com\nzafinsvc.com\nzafk120.com\nzahtb.com\nzahui.fan\nzahuishi.com\nzahuod.com\nzahuoji.com\nzai-art.com\nzai-xian.com\nzaibaoan.com\nzaidu.org\nzaiduu.com\nzaiemei.com\nzaifan.com\nzaigl.com\nzaiguahao.com\nzaih.com\nzaihuangshi.com\nzaijia.com\nzaijiawan.com\nzailaboratory.com\nzailingtech.com\nzailouxia.com\nzaimanhua.com\nzaiminglvsuo.com\nzainanjing365.com\nzaitong.net\nzaiwai.com\nzaiweiwx.com\nzaiwenai.com\nzaixian100f.com\nzaixianfanyi.com\nzaixiangzx.com\nzaixianjisuan.com\nzaixiankaoshi.com\nzaixianps.cc\nzaixianvip.net\nzaixs.com\nzaiyulin.com\nzaiyunli.com\nzajiebao.com\nzajilu.com\nzajourney.com\nzakc.group\nzaker.com\nzaku.fun\nzakww.com\nzalandode.com\nzallcn.com\nzallgo.com\nzallimg.com\nzalljinfu.com\nzallsoon.com\nzallxk.com\nzamcs.com\nzampda.net\nzampdmp.com\nzampdsp.com\nzamplink.net\nzamplus.com\nzan-live.com\nzanao.com\nzanba.com\nzanbai.com\nzancar.com\nzangao.com\nzangaopet.com\nzangdiyg.com\nzangenggroup.com\nzangft.com\nzanggekuangye.com\nzanghaihuatxt.com\nzanglikun.com\nzangto.com\nzangtui.com\nzangx.com\nzangyitang123.com\nzangyitong.com\nzanig.com\nzanih.com\nzankee1955.com\nzanlaa.com\nzanmeizhibo.com\nzanpic.com\nzanpu.com\nzantainet.com\nzanyiba.com\nzaobang.com\nzaoche168.com\nzaodao.net\nzaodian.com\nzaodin.com\nzaodula.com\nzaofabiao.com\nzaofacai.com\nzaogai.com\nzaojiadoc.com\nzaojiance.com\nzaojiance.net\nzaojiao.com\nzaojiaxueshe.com\nzaojiu.com\nzaojuge.com\nzaojuzi.com\nzaojv.com\nzaoowoo.com\nzaoqiangzhiheng.com\nzaowandushu.com\nzaowuyun.com\nzaoyang.org\nzaozuo.com\nzapak.com\nzapyamobile.com\nzaqizaba.xyz\nzarcw.com\nzarsion.com\nzastatic.com\nzasv.com\nzasv.net\nzasysz.com\nzat.cc\nzatan.com\nzatanb1.com\nzatest.com\nzaticdn.com\nzattc.com\nzauoehg.com\nzawomkv.com\nzaxdcredit.com\nzaxline.com\nzaxzn.com\nzaysz.com\nzazhipu.com\nzazsz.com\nzb-kc.com\nzb1.org\nzb18.net\nzb8.com\nzb800.com\nzb99.net\nzbao.com\nzbao56.com\nzbbar.net\nzbbm.net\nzbbus.com\nzbbx.org\nzbc.pub\nzbc.wiki\nzbca.com\nzbcars.com\nzbchem.com\nzbcyrq.com\nzbczce.com\nzbdedu.com\nzbdzy.com\nzbfilm.com\nzbgala.com\nzbgarden.cc\nzbgedu.com\nzbgl.net\nzbgscm.com\nzbhbkj.com\nzbhot.com\nzbhouse.com\nzbhuafx.com\nzbii.com\nzbinfo.net\nzbintel.com\nzbird.com\nzbisq.com\nzbitcloud.com\nzbiwl.com\nzbj.com\nzbj66.com\nzbjdev.com\nzbjdr.com\nzbjiangsu.com\nzbjimg.com\nzbjsaas.com\nzbjwork.com\nzbjzgroup.com\nzbkb.com\nzblcyy.com\nzblhh.com\nzblhrl.com\nzbling.com\nzbljw.com\nzblogcn.com\nzblzm.xyz\nzbmag.com\nzbmbj.com\nzbmeishu.com\nzbnews.net\nzbo0n.com\nzbom.com\nzbopr.net\nzboqc.com\nzbpengxuan.com\nzbqlm.com\nzbqtwbzr.com\nzbra-inc.com\nzbrhsc.com\nzbrty.com\nzbrushcn.com\nzbsfdy.com\nzbsjzy.com\nzbsonline.com\nzbstatic1.com\nzbstatic5.com\nzbsyzx.com\nzbszkj.com\nzbt-china.com\nzbt.com\nzbt.net\nzbt100.com\nzbtaizhan.com\nzbtbjt.com\nzbtianao.com\nzbudbq.sbs\nzbusa.com\nzbw315.com\nzbwbbs.com\nzbwdj.com\nzbwg.cc\nzbwmy.com\nzbwpay.com\nzbxcck.com\nzbxinmeiti.com\nzbxjgs.com\nzbxsoft.com\nzbxyh.com\nzbxyly.com\nzbyads.com\nzbycg.com\nzbycorp.com\nzbyinghe.com\nzbylc.com\nzbytb.com\nzbyz.net\nzbz.com\nzbzb.org\nzbzdm.com\nzbzw.com\nzbzw.la\nzc-gs100.com\nzc-ha.com\nzc-it.com\nzc0317.com\nzc173.com\nzc532.com\nzc61.com\nzc6sigma.com\nzcaijing.com\nzcand.com\nzcbearing.com\nzcbgy.net\nzcbm580.com\nzcccc.com\nzccninfo.com\nzccrzx.com\nzcdiesel.com\nzcdlkeji.com\nzcdog.com\nzcdz1688.com\nzcedi.com\nzcedustudy.com\nzcfc.com\nzcfeed.com\nzcfirst.com\nzcfuhua.com\nzcfun.com\nzcfy.cc\nzcgg.net\nzcgou.com\nzcgsfy.com\nzcgsh.com\nzchat.tech\nzchb-water.net\nzchmbx.com\nzchmh.com\nzchospital.com\nzchrgroup.com\nzcict.com\nzcimg.com\nzcinfo.net\nzcitidc.net\nzciv.com\nzcjbgame.com\nzcjce.com\nzcjhsdk.com\nzcjxedu.com\nzcjxzl.com\nzckb001.com\nzckdwx.com\nzckp.com\nzclkj.com\nzclock.xyz\nzcloud.world\nzclqzls.com\nzcmlc.com\nzcmol.com\nzcmpark.com\nzcnest.com\nzcoa365.com\nzcobrand.com\nzcodesign.com\nzcofuture.com\nzcom.com\nzcomc.com\nzcoming.com\nzcooler.com\nzcosz.com\nzcowh.com\nzcpc.net\nzcpd.cc\nzcpm.net\nzcpzj.com\nzcqh.com\nzcqss.com\nzcqtz.com\nzcrcw.com\nzcrczp.com\nzcread.com\nzcry007.com\nzcs.cc\nzcsbbs.com\nzcscz.com\nzcset.com\nzcsweb.com\nzcszcm.com\nzctec.cc\nzctl.net\nzctpt.com\nzctt.com\nzctx.com\nzctzgr.com\nzcwin.com\nzcwlsc.com\nzcwxjx.com\nzcwz.com\nzcxcl.com\nzcxd9.com\nzcxn.com\nzcxsl.com\nzcycdn.com\nzczbzx.com\nzczj.com\nzczy100.com\nzczy56.com\nzczyofficial.com\nzd-auto.com\nzd-brake.com\nzd-dl.com\nzd-hs.com\nzd-pm.com\nzd-power.com\nzd.biz\nzd.hk\nzd200572.com\nzd315.net\nzdanfu.com\nzdao.com\nzdaoxb.com\nzdaye.com\nzdbfjj.com\nzdbiogene.com\nzdbnm.com\nzdcgc.com\nzdcj.net\nzdcjw18.com\nzdcs666.com\nzdctid.com\nzddhr.com\nzddhub.com\nzddjq.com\nzddr.com\nzddream.com\nzdepay.com\nzdeqs.com\nzdevo.com\nzdfans.com\nzdfdc.com\nzdfei.com\nzdfx.net\nzdgkyy.com\nzdgxchina.com\nzdgzc.com\nzdh0.com\nzdh10230lo.com\nzdh11040lo.com\nzdh168.com\nzdhaitao.com\nzdhaitao.net\nzdhuoyunbao.com\nzdhyibiao.com\nzdiao.com\nzdic.net\nzdjt.com\nzdkfq.com\nzdkqyy.com\nzdlink.com\nzdlpk.net\nzdm.net\nzdmimg.com\nzdmq.com\nzdmq88.com\nzdmr.net\nzdnph.com\nzdnscloud.biz\nzdnscloud.com\nzdnscloud.info\nzdnscloud.net\nzdomo.com\nzdong.net\nzdpower.com\nzdrcw.com\nzdsdp.com\nzdsee.com\nzdsfy.net\nzdsju.com\nzdslb.com\nzdsr.net\nzdtent.com\nzdvalves.com\nzdvc.net\nzdwafis.com\nzdwallcovering.com\nzdwang.com\nzdwfy.com\nzdwmq.com\nzdworks.com\nzdwx.com\nzdwx.net\nzdwx.vip\nzdxlz.com\nzdyfy.com\nzdz.la\nzdzdm.com\nzdzwtesting.com\nzdzxtech.com\nze-assemble.com\nze-clock.com\nze-grow.com\nze-introduce.com\nze-invite.com\nze-mp.com\nze-wx.com\nze5.com\nzeaho.com\nzealer.com\nzeali.net\nzealquest.com\nzealsafe.net\nzebangedu.com\nzebracdn.com\nzebraenglish.biz\nzebraenglish.com\nzebred.com\nzecsma.com\nzeda1.com\nzedyer.com\nzeedao.com\nzeehoev.com\nzeekrlife.com\nzeekrline.com\nzeelis.com\nzeesin.com\nzeeteq.com\nzeetzj.com\nzeewain.com\nzegarkirepliki.pl\nzegnau.shop\nzego.im\nzeguoren.com\nzeheng.com\nzeidei.com\nzeiet.com\nzeisis.com\nzeisp.com\nzejiexinxi.com\nzeju.com\nzejunpharma.com\nzeku.com\nzekv.com\nzeldacn.com\nzelinai.com\nzemc.vip\nzemismart.com\nzen-est.com\nzencheer.com\nzengdefei.com\nzengenti.com\nzengjunpeng.com\nzengjunyin.com\nzenglong3d.com\nzengrong.net\nzengslb.com\nzengyongfu.com\nzengyt.com\nzengzeng.net\nzenha.net\nzenhotspring.com\nzenith-group.net\nzenithfashion.asia\nzenithmining.com\nzenithspace.net\nzenixauto.com\nzenkungforging.com\nzenlesszonezero.com\nzenmen.com\nzenner-metering.com\nzeno-tech.com\nzenoven.com\nzenshine-pharma.com\nzentao.net\nzentaopm.com\nzepcc.com\nzepdi.com\nzeperd.com\nzepp.com\nzeq366.net\nzero2me.com\nzerobreeze.com\nzerocollege.com\nzerogfans.com\nzeroling.com\nzerongjituan.com\nzerontruck.com\nzeroonead.com\nzeropartner.com\nzerotogether.net\nzerseager.com\nzeruns.com\nzerustech.com\nzesee.com\nzeshengproject.com\nzeshengshun.online\nzeshengtecphar.com\nzesidasi.com\nzesmob.com\nzeststore.com\nzetacn.com\nzetaijituan.com\nzetast.com\nzetbig.com\nzetcloud.com\nzettlernb.com\nzetyun.com\nzeusai.xin\nzeuux.com\nzeuux.org\nzexiaoqiao.com\nzeyouquan.com\nzeyu99.com\nzeyuan.shop\nzeyuan123.com\nzezhengcnc.com\nzezhenwangluo.com\nzezhuanggd.com\nzf313.com\nzf360.net\nzf3d.com\nzfancy.net\nzfb369.com\nzfboke.com\nzfbzhsq.com\nzfcm.net\nzfdliot.com\nzfdmkj.com\nzfemc.com\nzfengit.com\nzffan.com\nzfgy88.com\nzfhz.org\nzfile.vip\nzfj1441.com\nzfkg.com\nzfkjgw.com\nzfl9.com\nzfnet.net\nzfowed.com\nzfrontier.com\nzfrykj.com\nzfsc.com\nzfservicescn.com\nzfsf.com\nzfsjy.com\nzfsjzx.com\nzfsoft.com\nzft.com\nzftime.com\nzfty.work\nzfvnet.com\nzfw.net\nzfwlxt.com\nzfwx.com\nzfxz.com\nzfyypt.com\nzg-gaoling.com\nzg-gyt.com\nzg-import.com\nzg-imsoft.com\nzg-seastar.com\nzg114jy.com\nzg114w.com\nzg114zs.com\nzg118.com\nzg163.net\nzg3721.com\nzg388.com\nzg58.com\nzgaode.com\nzgaxr.com\nzgazxxw.com\nzgbaili.cc\nzgbenrun.com\nzgbfw.com\nzgbghdw.com\nzgbk.com\nzgblh.com\nzgbmcl.com\nzgbnt.com\nzgboke.com\nzgbszf.com\nzgby114.com\nzgbywl.com\nzgc-bigdata.org\nzgc261.com\nzgcbank.com\nzgcbb.com\nzgccity.com\nzgcdiy.com\nzgcgjn.com\nzgchawang.com\nzgchawenhua.com\nzgchospital.com\nzgchrx.com\nzgcicc.com\nzgcindex.org\nzgcjm.org\nzgcjpx.com\nzgclease.com\nzgclzzc.com\nzgcmc.com\nzgcmlm.com\nzgcsa.org\nzgcswhcbw.com\nzgcszkw.com\nzgcups.com\nzgcwpark.com\nzgcxbs.com\nzgcznet.com\nzgczrj.com\nzgddek.com\nzgddmx.com\nzgdjw.com\nzgdlfzw.com\nzgdlzb.org\nzgdmly.com\nzgdnjj.com\nzgdqcy.com\nzgdqjy.com\nzgdsw.com\nzgdwzp.com\nzgdxhbkf.com\nzgdych.com\nzgdydyxh.com\nzgdygf.com\nzgdztk.com\nzgeyanwo.com\nzgfllt.com\nzgfp.com\nzgfwgj.com\nzgfxnews.com\nzgfzh.com\nzgfznews.com\nzgfznj.com\nzgg.com\nzggas.com\nzggbdsw.net\nzggbhb.com\nzggcks.com\nzggd.city\nzgggws.com\nzgggz.com\nzggjgy.com\nzggjsmc.com\nzggldgj.com\nzgglkx.com\nzgglyun.com\nzggqzp.com\nzggroups.com\nzggtxhw.com\nzggua.com\nzggwy.com\nzggwy.org\nzggxgp.com\nzggxhj.com\nzggxlbc.com\nzggxsmlt.com\nzggye.com\nzggysyw.com\nzggzgg.com\nzggzzk.com\nzgh.com\nzghaojiaoyu.com\nzghaopingche.com\nzghbxh.org\nzghctc.com\nzghdch.com\nzghde.com\nzghhzx.net\nzghlzs.com\nzghongbiao.com\nzghongqi.com\nzghotnews.com\nzghtcd.com\nzghtedu.com\nzghtqk.com\nzghy.com\nzghzp.com\nzghzsk.com\nzgjcks.com\nzgjct.com\nzgjgw.com\nzgjhjy.com\nzgjianfang.com\nzgjiaoyan.com\nzgjiayang.com\nzgjiemeng.com\nzgjinglong.com\nzgjjzyjy.org\nzgjl123.com\nzgjm.net\nzgjm.org\nzgjmorg.com\nzgjrcw.com\nzgjrjw.com\nzgjrw.com\nzgjscopper.com\nzgjsdsj.com\nzgjsks.com\nzgjsqw.com\nzgjsyw.com\nzgjt518.com\nzgjtb.com\nzgjxcad.com\nzgjxjjw.com\nzgjymg.com\nzgjzy.org\nzgkao.com\nzgkashi.com\nzgkawah.com\nzgkfzz.com\nzgkjb.com\nzgkjcx.com\nzgkjw.org\nzgkjxww.com\nzgkjzx.com\nzgkqth.com\nzgkqw.com\nzgkyb.com\nzglb.org\nzglcn.net\nzglcxyxzz.com\nzglibrary.com\nzglipin.com\nzgljl2012.com\nzglushang.com\nzglutongjituan.com\nzglwb.com\nzglww.net\nzglxw.com\nzglyfair.com\nzglyrc.com\nzglyz.com\nzgmba.com\nzgmcxw.com\nzgmdbw.com\nzgmh.net\nzgmicro.com\nzgmsbw.com\nzgmsbweb.com\nzgmscmpm.com\nzgmxjjgs.com\nzgmxl.com\nzgmzgsx.com\nzgmzyyzz.com\nzgnfys.com\nzgng.com\nzgnhzx.com\nzgnnwdkj.com\nzgnt.cc\nzgnt.net\nzgnwp.com\nzgny.com\nzgnyw.net\nzgoa.net\nzgong.com\nzgoog.com\nzgpingshu.com\nzgpj.net\nzgps168.com\nzgpts.com\nzgpy168.com\nzgqbyp.com\nzgqcdt.com\nzgqczj.com\nzgqdrc.com\nzgqkgw.com\nzgqkk.com\nzgqw.com\nzgqywhcbw.com\nzgqyzxw.com\nzgqzjt.com\nzgqzswdx.com\nzgrcjlxh.com\nzgrcjyw.com\nzgrd.org\nzgrdnews.com\nzgruisai.com\nzgrzbj.com\nzgsclp.com\nzgsd.net\nzgsepri.com\nzgserver.com\nzgshenglu.com\nzgshgs.com\nzgshige.com\nzgshige.net\nzgshjj.com\nzgshoes.com\nzgshq.com\nzgshuhuaxh.com\nzgshxd.com\nzgshxfw.com\nzgshyshyxh.com\nzgsj.com\nzgsjcn.com\nzgsjshy.com\nzgslb.net\nzgslylw.com\nzgsmile.com\nzgsmmhw.com\nzgsmsy.net\nzgsnzj.com\nzgsof.com\nzgspws.com\nzgsssss.com\nzgsta.com\nzgstly.net\nzgswcn.com\nzgswzys.com\nzgsxzs.com\nzgsyb.com\nzgsydw.com\nzgsynews.com\nzgsyqx.com\nzgsyz.com\nzgszglfh.com\nzgszjs.com\nzgtaining.com\nzgtcc.com\nzgtcyswh.com\nzgtghccl.com\nzgtianlong.com\nzgtianqi.com\nzgtjqxh.com\nzgtnzx.com\nzgtop10.com\nzgtuku.com\nzgty188.com\nzgtygg.com\nzgtywdysxh.com\nzgtzc.com\nzgtzhb.com\nzgui.com\nzguonew.com\nzgvmxma.com\nzgw.com\nzgweimeng.com\nzgwhfe.com\nzgwlwx.com\nzgwstxc.com\nzgwt.co\nzgwypl.com\nzgxcc.com\nzgxcfx.com\nzgxcw.com\nzgxetnw.com\nzgxhm.com\nzgxk.org\nzgxledu.com\nzgxmlsp.com\nzgxnnews.com\nzgxnyhyxh.com\nzgxnyxh.com\nzgxqwqh.com\nzgxrjy.com\nzgxsczdldak.com\nzgxue.com\nzgxytc.com\nzgxyzx.net\nzgxzcj.com\nzgxzhjx.com\nzgybsfxh.com\nzgycgc.com\nzgyeda.com\nzgyey.com\nzgyhbc.com\nzgyhys.org\nzgyjlf.com\nzgylbx.com\nzgylj.com\nzgyouth.cc\nzgys.net\nzgyssyxh.com\nzgysw.cc\nzgytc.com\nzgyxjt.com\nzgyxzs.com\nzgyygl.com\nzgyyjgw.com\nzgyykx.com\nzgyythy.com\nzgyyzn2004.com\nzgyzyq.com\nzgzb.com\nzgzca.com\nzgzcw.com\nzgzcwy.com\nzgzhmz.com\nzgzjjcy.com\nzgzjzzs.com\nzgznh.com\nzgznjt.com\nzgzpsjz.com\nzgzsa.com\nzgzsrc.com\nzgzszy.com\nzgzy.net\nzgzypyw.com\nzgzyxxzs.com\nzgzzs.com\nzgzzxx.com\nzh-an-pg-gaming.com\nzh-ansheng.com\nzh-brimed.com\nzh-chem.com\nzh-cjh.com\nzh-douqiutiyu.com\nzh-gs.com\nzh-hbs.com\nzh-heshi.com\nzh-hks-slotsimulator.com\nzh-hr.com\nzh-hz.com\nzh-itone.com\nzh-jieli.com\nzh-jinhang.com\nzh-languan.com\nzh-le-slotsimulator.com\nzh-longshi.com\nzh-piao.com\nzh10.com\nzh189.com\nzh818.com\nzh996.com\nzha.co\nzhads.com\nzhaeec.com\nzhai14.com\nzhaiba.com\nzhaibao.vip\nzhaibian.com\nzhaidou.com\nzhaihai.com\nzhaijihui.com\nzhaijis.com\nzhaikexueyuan.com\nzhainanba.net\nzhainanfulishe.com\nzhainanhuayuan.com\nzhaipan.vip\nzhairport.com\nzhaitushe.com\nzhaiwuu.com\nzhaixiaoniu.com\nzhaixue.cc\nzhale.me\nzhan.com\nzhanbanji.com\nzhanbuba.com\nzhanchenyouqi.com\nzhanchily.com\nzhandaren.com\nzhandian88.com\nzhandodo.com\nzhang-chu.com\nzhang365.com\nzhangbj.com\nzhangbo.org\nzhangchangfa.com\nzhangchi.art\nzhangdongxuan.com\nzhangdu.com\nzhangdu5.net\nzhangdu520.com\nzhange8.com\nzhangfeibiao.com\nzhangfensir.com\nzhangferry.com\nzhangfupeng.com\nzhanggaoyuan.com\nzhangge.net\nzhanghaodaren.com\nzhanghonghong.com\nzhanghongliang.com\nzhanghuang.com\nzhangjet.com\nzhangjiee.com\nzhangjinyue.com\nzhangjunbk.com\nzhangkai.red\nzhangkc.com\nzhangketong.com\nzhangkongapp.com\nzhangkoubei.net\nzhangku.com\nzhangle.com\nzhangleglobal.com\nzhanglinfeng09.com\nzhangliziyun.com\nzhangluya.com\nzhangmen.com\nzhangmen.org\nzhangmenkid.com\nzhangnan.xyz\nzhangnq.com\nzhangqi.ltd\nzhangqiaokeyan.com\nzhangqiongjie.com\nzhangqiu.cc\nzhangqiubus.com\nzhangrc.site\nzhangread.com\nzhangrunnan.com\nzhangsenhao.com\nzhangshangtong.com\nzhangshengcw.com\nzhangshengrong.com\nzhangshi.org\nzhangshuchang.com\nzhangsifan.com\nzhangtaiwuye.com\nzhangtu.com\nzhangu365.com\nzhangwan.net\nzhangwei.li\nzhangwenli.com\nzhangwojumian.com\nzhangxin.ltd\nzhangxinhulian.com\nzhangxinkeji.com\nzhangxinmj.com\nzhangxinxu.com\nzhangxiu.com\nzhangyi123.com\nzhangyoubao.com\nzhangyoushijie.com\nzhangyu.com\nzhangyu39.com\nzhangyuanqiang.com\nzhangyue.com\nzhangyue.net\nzhangyue01.com\nzhangyue02.com\nzhangyue03.com\nzhangyuecdn.com\nzhangyupeng.com\nzhangzepower.com\nzhangzhao.me\nzhangzhengfan.com\nzhangzhongpei.com\nzhangzhongyun.com\nzhangzhuo.ltd\nzhangzidao.com\nzhangzifan.com\nzhangziran.com\nzhanh.com\nzhanhi.com\nzhanhome.com\nzhanhuidaili.com\nzhanhuiniu.com\nzhanhuiquan.com\nzhanhuo.com\nzhanid.com\nzhanjiangletian.com\nzhankoo.com\nzhankuaqq.com\nzhanlingol.com\nzhanmang.com\nzhanq.net\nzhanqi.net\nzhanqi.tv\nzhanqitv.com\nzhanqu.tv\nzhanruizb.com\nzhanshaoyi.com\nzhanshi888.com\nzhanshifood.com\nzhanshiren.com\nzhansu.com\nzhantai.com\nzhantuo.com\nzhanuan.com\nzhanxingfang.com\nzhanyouyun.com\nzhanyugroup.com\nzhanzhanbao.com\nzhanzhang.net\nzhanzhangb.com\nzhanzhangs.com\nzhao-meng.com\nzhao123.org\nzhaoba.net\nzhaobeijing.com\nzhaobenshan.tv\nzhaobiaoziyuan.com\nzhaobide.com\nzhaobuxiu.com\nzhaocaimall.com\nzhaocaiyan.com\nzhaochanpin.com\nzhaochao.xyz\nzhaochongwu.com\nzhaoda.net\nzhaodanji.com\nzhaodaojia.com\nzhaodedao.xyz\nzhaodigroup.com\nzhaodll.com\nzhaodns999.com\nzhaofangbang.net\nzhaofenxiang.com\nzhaogang.com\nzhaogangimg.com\nzhaogui.com\nzhaohaowang.com\nzhaohe.net\nzhaoheng-cpm.com\nzhaoiphone.com\nzhaojiafang.com\nzhaojiao.net\nzhaojiaoan.com\nzhaojiaxiao.com\nzhaojs.com\nzhaojunhg.com\nzhaoka.com\nzhaokaifeng.com\nzhaokao.net\nzhaokaocn.com\nzhaokeli.com\nzhaoketang.com\nzhaokuaizhao.com\nzhaolaobanla.com\nzhaoliangji.com\nzhaoliming.net\nzhaomengtu.com\nzhaoming.biz\nzhaomishijie.com\nzhaomu.com\nzhaomuqingyun.com\nzhaomxd.com\nzhaoniupai.com\nzhaoonline.com\nzhaopianzhibo.com\nzhaopin.com\nzhaopin400.com\nzhaopin668.com\nzhaopinbao.me\nzhaopingou.com\nzhaopinrugao.com\nzhaopintangyin.com\nzhaoplc.com\nzhaoqianwang.com\nzhaoqiufa.com\nzhaoqt.net\nzhaoquanwang.vip\nzhaoren.net\nzhaorunsen.com\nzhaosf.co\nzhaosha.com\nzhaoshang.net\nzhaoshang100.com\nzhaoshang800.com\nzhaoshangbang.com\nzhaoshangbao.com\nzhaoshangdai.com\nzhaoshayou.com\nzhaosheng.com\nzhaosheng365.com\nzhaoshixi.com\nzhaoshizhou.xyz\nzhaosifang.com\nzhaosuliao.com\nzhaosw.com\nzhaosy.com\nzhaota8.com\nzhaotaicaiyin.com\nzhaotu.com\nzhaouc.com\nzhaouc.net\nzhaowenyu.com\nzhaowofanyi.com\nzhaoxi.org\nzhaoxiangliao.com\nzhaoxiangyd.com\nzhaoxiaoshuo.com\nzhaoxin.com\nzhaoxingfang.com\nzhaoxitech.com\nzhaoxuncaijing.com\nzhaoyanblog.com\nzhaoyangmao.com\nzhaoyangsem.com\nzhaoyangxueyuan.com\nzhaoyaojd.com\nzhaoyasai.com\nzhaoybbk.com\nzhaoyingtian.com\nzhaoyinqian.com\nzhaoyl.com\nzhaoyo.com\nzhaoyuan365.com\nzhaoyun.com\nzhaozhanxu.com\nzhaozhishi.com\nzhaozhonggong.com\nzhaozongjie.com\nzharev.com\nzhatoufa.com\nzhatuyunshu.com\nzhayanwang.com\nzhb1.com\nzhbit.com\nzhblawyer.com\nzhboyang.com\nzhbus.org\nzhbx.net\nzhby-point.com\nzhcic.com\nzhcidian.com\nzhckw.com\nzhcnews.com\nzhcommerce.com\nzhcomputing.com\nzhcsgc.com\nzhctv.com\nzhcw.com\nzhcyanshi.com\nzhdfg.com\nzhdgps.com\nzhdhq.com\nzhdhqc.com\nzhdhqcz.com\nzhdhqzy.com\nzhdmwhg.com\nzhdsbang.com\nzhe.com\nzhe800.com\nzhe900.com\nzhebei.com\nzhebeipharm.com\nzhebumai.com\nzhechem.com\nzhedabingchong.com\nzhedu.net\nzhefengle.com\nzhefuhua.com\nzhegu8.xyz\nzheiyu.com\nzhejiangcheng.com\nzhejiangcircuit.com\nzhejiangfa.com\nzhejiangfc1998.com\nzhejianghanpu.com\nzhejianglab.com\nzhejianglab.org\nzhejiangliming.com\nzhejianglong.com\nzhejiangmuseum.com\nzhejiangqinghe.com\nzhejiangseed.com\nzhejiangzhuohang.com\nzhejing.tech\nzhekoulieshou.com\nzhekouniu.net\nzhekouo.com\nzhelaoda.com\nzheli.com\nzhelibao.com\nzhelin.me\nzhelixin.com\nzheliyin.com\nzhemu.xyz\nzhen-ao.com\nzhen.com\nzhenai.com\nzhenaihn.com\nzhenandl.com\nzhenaoyaoye.com\nzhenbanggd.com\nzhenbi.com\nzhenbizi.com\nzhenchu.cc\nzhending-chicken.com\nzhendong365.com\nzhendonggames.com\nzhene.net\nzhenfacloud.com\nzhenfangyuan.com\nzhenfund.com\nzhengbang.com\nzhengben56group.com\nzhengbiaoke.com\nzhengcaimall.com\nzhengcaishangcheng.com\nzhengchang.com\nzhengdaijingji.com\nzhengdaojiapei.com\nzhengdaotang.com\nzhengdapeanut.com\nzhengdichaiqian.com\nzhengdong.cc\nzhengdongzulin.com\nzhengerpin.com\nzhengfalaw.com\nzhengfayunpt.com\nzhengfengnet.com\nzhenggang.org\nzhenggui.com\nzhengguzhishen.com\nzhenghai-ht.com\nzhenghangplc.com\nzhenghangyq.net\nzhenghe.biz\nzhenghewuye.com\nzhenghong888.com\nzhenghuiyaoye.com\nzhengjia.com\nzhengjianzhao.com\nzhengjie.com\nzhengjifb.com\nzhengjimt.com\nzhengkaji.com\nzhenglonggroup.com\nzhengmeng.net\nzhengmin.com\nzhengpengbo.com\nzhengpic.com\nzhengpinle.com\nzhengqi100.com\nzhengqingsong.com\nzhengquan.org\nzhengqun123.com\nzhengruioi.com\nzhengtaidianlan.com\nzhengte.net\nzhengtongcloud.com\nzhengtoon.com\nzhenguanyu.biz\nzhenguanyu.com\nzhenguo.com\nzhengw-tech.com\nzhengwei007.com\nzhengwutong.com\nzhengxiaoling.com\nzhengxinbao.com\nzhengxing021.com\nzhengxingzhijia.com\nzhengxinonly.com\nzhengyaing.win\nzhengyang-tek.com\nzhengyaokeji.net\nzhengyee.com\nzhengyexing.com\nzhengyounet.com\nzhengyouyoule.com\nzhengyuanfu.com\nzhengyutuliao.com\nzhengzai.tv\nzhengzhaopai.com\nzhengzhenxx.com\nzhengzhou42195.com\nzhengzhoubus.com\nzhengzhoutools.com\nzhengzhoutx.com\nzhengzhouyunmei.com\nzhengzihui.com\nzhenhaofu.com\nzhenhaotao.com\nzhenhaotv.com\nzhenheli.com\nzhenhonggroup.com\nzhenhospital.com\nzhenhuadj.com\nzhenhuan888.com\nzhenimg.com\nzhenjiatong.com\nzhenjingtv.com\nzhenkongbang.com\nzhenlongvip.com\nzhenmeidai.com\nzhenmeifoods.com\nzhenmeigroup.com\nzhenpin.com\nzhenren.com\nzhenrongbao.com\nzhenruhotels.com\nzhenrun.press\nzhensheng.com\nzhenshi.com\nzhenshigroup.com\nzhenshua.com\nzhenshungroup.com\nzhensiyu.com\nzhenstyle.com\nzhensuo.tv\nzhentaigroup.com\nzhentan.la\nzhentoo.com\nzhenweiexpo.com\nzhenwu.com\nzhenxiad.com\nzhenxiliangshi.com\nzhenxin2014.com\nzhenxinet.com\nzhenxinfu.com\nzhenxingkuangchanpin.com\nzhenxipin.net\nzhenyangshoes.com\nzhenye.com\nzhenyouliao.com\nzhenyoumei.com\nzhenyuansoft.com\nzhenyunpan.com\nzhenzhuchanfu.com\nzheshenet.com\nzhetao.com\nzhetian.org\nzhetouniu.com\nzheurl.com\nzhewanji.net\nzhexi.tech\nzhexingzx.com\nzhexinit.com\nzhexinsteel.net\nzheye.com\nzheyibu.com\nzheyinleasing.com\nzheyouxinxi.com\nzheyuntech.com\nzhezheai.com\nzhezhekan.com\nzhezhewhkj.com\nzhezhi.tech\nzhfc.com\nzhfivehospital.com\nzhfund.com\nzhfwq.com\nzhfyhb.com\nzhgc.com\nzhgfanyi.com\nzhgjx.com\nzhgl.com\nzhglory.com\nzhgn.com\nzhgnj.com\nzhgreens.com\nzhguoguo.com\nzhgxjs.com\nzhhainiao.com\nzhhaitai.com\nzhheo.com\nzhhfedu.com\nzhhfjt.com\nzhhlaw.com\nzhhlogistics.com\nzhhrm.com\nzhhs-china.com\nzhhuahui.com\nzhhuashengjt.com\nzhhuihua.com\nzhhy-oa.com\nzhi-ming.com\nzhi-niao.com\nzhi.hu\nzhi10.com\nzhi3.net\nzhiaimusic.com\nzhiangit.com\nzhiangroup.com\nzhiannet.com\nzhiantec.com\nzhibaimeixue.com\nzhibiao168.com\nzhibiaow.com\nzhibitouzi.com\nzhibo.tv\nzhibo8.cc\nzhibo8.com\nzhiboba.com\nzhiboohui.com\nzhiboqiao.com\nzhiboyun.net\nzhibs.net\nzhibugongzuo.com\nzhicaiwang.com\nzhicall.com\nzhichanli.com\nzhichaoxt.com\nzhicheng-champion.com\nzhicheng.net\nzhichepai.com\nzhichepin.com\nzhichi.com\nzhichidata.com\nzhichikeji.com\nzhichiwangluo.com\nzhichiweiye.com\nzhicms.cc\nzhicyun.com\nzhidao91.com\nzhidaochuanxin.com\nzhidaoplan.com\nzhidejian.com\nzhidemai.com\nzhidesoft.com\nzhidi66.com\nzhidianfan.com\nzhidianlife.com\nzhidieyun.com\nzhidiy.com\nzhidtech.com\nzhiduopc.com\nzhidx.com\nzhienkeji.com\nzhiexa.com\nzhifa.cc\nzhifa315.com\nzhifang.com\nzhifayangfa.com\nzhifayiyuan.com\nzhifeishengwu.com\nzhifengtang.com\nzhifou123.com\nzhifoukeji.com\nzhiftype.com\nzhifufu.com\nzhifujie.com\nzhifuquanzi.com\nzhifure.com\nzhifux.com\nzhifuzi.com\nzhigaometal.com\nzhige.net\nzhigongfu.com\nzhigou.com\nzhigou888.com\nzhigouyp.com\nzhiguagua.com\nzhiguang.me\nzhigudata.com\nzhiguf.com\nzhiguoguo.com\nzhihai.fun\nzhihang100.com\nzhihe.link\nzhihe.mobi\nzhihei.com\nzhiheiot.com\nzhihejia.com\nzhihejiaoyu.com\nzhihemobi.com\nzhihengwangchen.com\nzhihepartners.com\nzhihevip.com\nzhihjf.com\nzhihu.com\nzhihu.dev\nzhihua-tech.com\nzhihuangjin.com\nzhihudsp.com\nzhihuichuangyanshi.com\nzhihuiep.com\nzhihuifangdong.net\nzhihuihongze.com\nzhihuihuiwu.com\nzhihuihutong.com\nzhihuiji.com\nzhihuijingyingba.com\nzhihuikangyang.com\nzhihuimami.com\nzhihuinanzhan.com\nzhihuishan.com\nzhihuishitang.net\nzhihuishu.com\nzhihuiwater.com\nzhihuixiadan.com\nzhihuixl.com\nzhihuixuexipt.com\nzhihuiya.com\nzhihuiyunbo.com\nzhihuizeyuan.com\nzhihuizhangyu.com\nzhihuizp.com\nzhihuoseo.com\nzhihur.com\nzhiji.com\nzhijia.com\nzhijian114.com\nzhijianbao.com\nzhijianchuhai.com\nzhijianfengyi.com\nzhijiangames.com\nzhijiannuoche.com\nzhijiaow.com\nzhijiaow.net\nzhijiapro.com\nzhijiashe.com\nzhijidoc.com\nzhijie-edu.com\nzhijieguo.com\nzhijieketang.com\nzhijin.com\nzhijinwang.com\nzhijizhibi.com\nzhikaiis.com\nzhikao100.com\nzhikao365.net\nzhikaocn.com\nzhikaojy.com\nzhikaowangxiao.net\nzhiketong.com\nzhiketong.net\nzhikexun.com\nzhikongyangpin.com\nzhikuai.com\nzhikubao.net\nzhil.cloud\nzhilandaren.com\nzhilehuo.com\nzhileiqiye.com\nzhilepin.com\nzhilian-nb.com\nzhilian.com\nzhilian.host\nzhilianghui.com\nzhiliangren.com\nzhilianiot.com\nzhiliaobiaoxun.com\nzhiliaocaibao.com\nzhiliaoke.com\nzhilidata.com\nzhilingshidai.com\nzhilingshop.com\nzhilitraffic.com\nzhilongtech.com\nzhiluo.net\nzhima1688.com\nzhimacangku.com\nzhimaixiaodian.com\nzhimantian.com\nzhimap.com\nzhimapay.net\nzhimaquan.net\nzhimaruanjian.com\nzhimatech.com\nzhimawenda.com\nzhimaxkf.com\nzhimei.com\nzhimeibot.com\nzhimeijiankang.com\nzhimengad.com\nzhimengdaren.com\nzhimg.com\nzhimi.com\nzhiminglawyer.com\nzhimodesign.com\nzhimoe.com\nzhineikaixin.com\nzhinengdayi.com\nzhinengjianzhan.com\nzhinengxia.com\nzhinengxiehui.com\nzhinengyujia.com\nzhinet.com\nzhinianboke.com\nzhiniceshi.com\nzhinikefu.com\nzhiniu8.com\nzhinuoshuzi.com\nzhinvnetwork.com\nzhipan.net\nzhipeix.com\nzhiper.com\nzhipianbang.com\nzhipianbang.vip\nzhipin.com\nzhipingke.com\nzhipucn.com\nzhipuzi.com\nzhiqi.info\nzhiqiang.org\nzhiqiapp.com\nzhiqicms.com\nzhiqihuo.com\nzhiqihuo.org\nzhiqijichu.com\nzhiquanxia.com\nzhiquapp.com\nzhiquhuyu.work\nzhiquyuan.com\nzhiqwl.com\nzhiren.com\nzhiren.ren\nzhiribao.com\nzhiru.com\nzhirui-inv.com\nzhirui.net\nzhiruiinvest.com\nzhisanzhao.com\nzhishanfu.com\nzhishangnet.com\nzhishangsoft.com\nzhisheji.com\nzhisheng.com\nzhishengbang.com\nzhishengtec.com\nzhishengxinchuang-food.com\nzhishi.com\nzhishi.tech\nzhishifenzi.com\nzhishisoft.com\nzhishiwu.com\nzhishutang.com\nzhishuyun.com\nzhisiyun.com\nzhisuoyi.net\nzhitaiparking.com\nzhitangvalve.com\nzhitaosoft.com\nzhitingtech.com\nzhito.com\nzhitongcaijing.com\nzhitongpm.com\nzhitouxing.com\nzhituad.com\nzhitui.com\nzhitusoft.com\nzhituwujie.com\nzhituzhilian.com\nzhivisaworld.com\nzhiweidata.com\nzhiweihome.com\nzhiweisoft.com\nzhiwenw.com\nzhiwgx.com\nzhiwo.com\nzhiwo.work\nzhiwu.com\nzhiwushuo.com\nzhiwutiyu.com\nzhiwutong.com\nzhixi.com\nzhixiaochengxu.com\nzhixiaohuoke.com\nzhixiaosj.com\nzhixiaowang.com\nzhixin-semi.com\nzhixingapp.com\nzhixingit.com\nzhixingjj88.com\nzhixingyunke.com\nzhixiu.net\nzhixuan.com\nzhixue.com\nzhixue.org\nzhixuedoc.com\nzhixueyun.com\nzhixunfang.com\nzhixunkeji.xyz\nzhiyakeji.com\nzhiyanxuan.com\nzhiyazz.com\nzhiye.com\nzhiyeapp.com\nzhiyeguihua.com\nzhiyequan.com\nzhiyexueyuan.com\nzhiyi.com\nzhiyicx.com\nzhiyinghui.com\nzhiyingos.com\nzhiyingyang.com\nzhiyinhao.com\nzhiyinlou.com\nzhiyinmanhuawang.com\nzhiyinmedia.com\nzhiyoo.com\nzhiyoubao.com\nzhiyousx.com\nzhiys.com\nzhiyu-china.com\nzhiyuan-robot.com\nzhiyuanbang.com\nzhiyuanshijie.com\nzhiyuanxinglvye.com\nzhiyuanyun.com\nzhiyuanzhongyi.com\nzhiyuapp.com\nzhiyueit.com\nzhiyun-cn.com\nzhiyun-tech.com\nzhiyunwang.net\nzhiyutianqi.com\nzhiyuyg.com\nzhizaoyun.com\nzhizeu.com\nzhizhan360.com\nzhizhen.com\nzhizhi88.com\nzhizhibaike.com\nzhizhihu.com\nzhizhizhi.com\nzhizhizhi.net\nzhizhonghl.com\nzhizhoukeji.com\nzhizhoumi.com\nzhizhu35.net\nzhizhucms.com\nzhizhuip.com\nzhizhuma.com\nzhizhuwu.com\nzhizhuyule.com\nzhizhuyx.com\nzhizihuan.com\nzhizihuan.net\nzhiziyun.com\nzhizugz.com\nzhizunbo.com\nzhizundun.com\nzhizunnews.com\nzhizuobiao.com\nzhizuobiaojiaoyu.com\nzhizuoh5.com\nzhizuotu.com\nzhj9.com\nzhjd.org\nzhjdkz.com\nzhjgkg.com\nzhjgkgjt.com\nzhjgongjiao.com\nzhjiameng.com\nzhjianet.com\nzhjingsai.com\nzhjj.org\nzhjncb.com\nzhjtaq.com\nzhjtong.com\nzhjuche.com\nzhjxwh.com\nzhjypco.com\nzhjzg.com\nzhjzgroup.com\nzhk.me\nzhka.com\nzhks.org\nzhku.com\nzhl.com\nzhld.com\nzhlhh.com\nzhliaoshe.com\nzhliqi.com\nzhljq.com\nzhlm.com\nzhlqjt.com\nzhltech.net\nzhltraffic.com\nzhlyen.com\nzhlzw.com\nzhmag.com\nzhmedcenter.com\nzhmeiwen.com\nzhmf.com\nzhmodaoli.com\nzhmold.com\nzhmu.com\nzhmxchina.com\nzhmzqi.com\nzhnbj.com\nzhnc-kaiyunapp.com\nzhnfad.com\nzhnsyh.com\nzhong-yao.net\nzhong.com\nzhong100.com\nzhongan.com\nzhongan.io\nzhongancloud.com\nzhonganfengshang.com\nzhonganguobao.com\nzhonganib.com\nzhonganinfo.com\nzhongankang.com\nzhonganweishi.com\nzhongbao360.com\nzhongbaounion.com\nzhongbeiyouhao.com\nzhongbenkeji.com\nzhongbenwangluo.com\nzhongbingtongxin.com\nzhongbowenwu.com\nzhongboxinwen.com\nzhongcai.com\nzhongcaistream.com\nzhongcaisuo.com\nzhongcetech.com\nzhongche.com\nzhongchebaolian.com\nzhongchewuliu.com\nzhongchouke.com\nzhongchouyan.com\nzhongchuang365.com\nzhongchuangwenhua.com\nzhongda021.com\nzhongdajc.com\nzhongdakang.com\nzhongdazm.com\nzhongdegroup.com\nzhongdemetal.com\nzhongdeng.com\nzhongdengwang.com\nzhongdeschool.com\nzhongdexc.com\nzhongdi168.com\nzhongerp.com\nzhongfeiqiao.com\nzhongfu.net\nzhongfuwatch.com\nzhonggenggroup.com\nzhonggu56.com\nzhongguang.com\nzhongguanpetro.com\nzhongguinong.com\nzhongguobaiyin.com\nzhongguobingxue.com\nzhongguociwang.com\nzhongguoditu.com\nzhongguofeng.com\nzhongguogouliang.com\nzhongguoguwan.com\nzhongguohao123.com\nzhongguohuo.com\nzhongguopeixun.net\nzhongguose.com\nzhongguosou.com\nzhongguoss.com\nzhongguowangshi.com\nzhongguoym.com\nzhonggushipping.com\nzhonghaitech.com\nzhonghaojituan.com\nzhonghe58.com\nzhonghegame.com\nzhonghengxingufen.com\nzhonghengyiyao.com\nzhonghhd.com\nzhonghongwang.com\nzhonghuacar.com\nzhonghuacpa.com\nzhonghuadiancang.com\nzhonghuaent.com\nzhonghuamba.com\nzhonghuameiwang.com\nzhonghuanjianbj.com\nzhonghuanus.com\nzhonghuaqiming.com\nzhonghuasuan.com\nzhonghuaying.com\nzhonghuilv.com\nzhonghuitj.com\nzhonghuvalve.com\nzhongji.cc\nzhongjian.run\nzhongjiangapp.com\nzhongjianyiliao.com\nzhongjiaochuxing.com\nzhongjijidian.com\nzhongjincc.com\nzhongjintongsheng.com\nzhongjiujiu.com\nzhongjiunanshuo.com\nzhongjixinyuan.com\nzhongjukiln.com\nzhongjunstone.com\nzhongkaiedu.com\nzhongkao.com\nzhongkaohelp.com\nzhongkaowu.com\nzhongkecn.com\nzhongkeguan.com\nzhongkekc.com\nzhongkerd.com\nzhongkezhihang.com\nzhongkongbancn.com\nzhongkongdaikuan.com\nzhongleny.com\nzhongli.com\nzhonglian.com\nzhonglianbiao.com\nzhonglianguanwei.com\nzhongliangxny.com\nzhonglianhuashu.com\nzhonglianhuaxin.com\nzhonglianyx.com\nzhongliusp.com\nzhongliuyiyuan.com\nzhonglue-consulting.com\nzhonglun.com\nzhonglunnet.com\nzhongluyuntong.com\nzhongmaohr.com\nzhongmei.com\nzhongmeigk.com\nzhongmeigk.hk\nzhongmian.com\nzhongminenergy.com\nzhongmingjiaoyu.net\nzhongnakeji.com\nzhongnengrecycling.com\nzhongnice.com\nzhongnongjimu.com\nzhongp.com\nzhongpaiwang.com\nzhongpenggufen.com\nzhongping.com\nzhongpingcapital.com\nzhongpujiancai.com\nzhongqijiye.com\nzhongqijt.com\nzhongqingshao.com\nzhongqixin360.com\nzhongran.org\nzhongrenbang.cc\nzhongruihuacheng.com\nzhongruitech.com\nzhongruiyaoye.com\nzhongsenmenye.com\nzhongshan-hotel.com\nzhongshanchengtai.com\nzhongshang114.com\nzhongshanpark.com\nzhongshantoukong.com\nzhongshanweixin.com\nzhongshanzhekai.com\nzhongshengdai.com\nzhongshenglong.xyz\nzhongshi-chem.com\nzhongshiqixie.com\nzhongshucan.com\nzhongshungroup.com\nzhongshuopg.com\nzhongso.com\nzhongsou.com\nzhongsou.net\nzhongtaihangzhou.com\nzhongtaitrust.com\nzhongtefamen.com\nzhongtiancloud.com\nzhongtieyintong.com\nzhongtong.com\nzhongtongshe.com\nzhongtou.co\nzhongtuirong.com\nzhongtuobang.com\nzhongtusy.com\nzhongwang.com\nzhongwangsc.com\nzhongwei-info.com\nzhongweicable.com\nzhongweihotels.com\nzhongweiteamtop.com\nzhongwen.wiki\nzhongwenhexinqikan.com\nzhongwogroup.com\nzhongwucan.com\nzhongwulian.com\nzhongxiang.com\nzhongxiangdichan.net\nzhongxiangwang.co\nzhongxiaole.net\nzhongxiaoyl.com\nzhongxingglove.com\nzhongxinjzzs.com\nzhongxinkeji.vip\nzhongxinlm.com\nzhongxinwei.net\nzhongxinzhongxue.com\nzhongxisunve.com\nzhongxues.com\nzhongxuewuyou.net\nzhongxuewy.net\nzhongxunrunda.com\nzhongxuntv.com\nzhongxuyiyuan.com\nzhongyagroup.com\nzhongyangkeji.com\nzhongyangweixiu.com\nzhongyao365.com\nzhongyapeicui.com\nzhongyasmart.com\nzhongyejy.com\nzhongyf.com\nzhongyi6.com\nzhongyi9999.com\nzhongyibaodian.com\nzhongyiinc.com\nzhongyiiot.com\nzhongyiju360.com\nzhongyingdp.com\nzhongyingtougu.com\nzhongyingyiyao.com\nzhongyinlawyer.com\nzhongyishangwu.com\nzhongyisousuo.com\nzhongyiyisheng.com\nzhongyoo.com\nzhongyouai.com\nzhongyouex.com\nzhongyougc.com\nzhongyoumedia.com\nzhongyu.com\nzhongyu87.xyz\nzhongyuan-sports.com\nzhongyuanauto.com\nzhongyue001.com\nzhongyuefuwu.com\nzhongyulian.com\nzhongyunjt.net\nzhongyunjy.com\nzhongyunqianbao.com\nzhongyuyx.com\nzhongzaisheng.net\nzhongzeny.com\nzhongzetherapeutics.com\nzhongzhaizs.com\nzhongzhao.com\nzhongzhen56.com\nzhongzhenjiaoyu.com\nzhongzhensen.com\nzhongzhi-faqian.com\nzhongzhide.com\nzhongzhifaqian.com\nzhongzhiiov.com\nzhongzhilin.com\nzhongzhixin.com\nzhongzhixitong.com\nzhongzhongkeji.com\nzhongzhoulianhe.com\nzhongzhouwater.com\nzhongzhuang.com\nzhongzilu.com\nzhonshian.com\nzhou.icu\nzhouao.com\nzhoubaitong.net\nzhoubianyou.com\nzhouchun.net\nzhoudaosh.com\nzhoufengsd.com\nzhougong.com\nzhouhaismart.com\nzhouhing.com\nzhouhoulin.com\nzhoujiahong.com\nzhoujianhui.com\nzhoujifood.com\nzhoujunji.com\nzhoukaiwen.com\nzhoulaoshi.club\nzhoulingjie.com\nzhoupu123.com\nzhoupudata.com\nzhouql.vip\nzhouweitong.site\nzhouxianghb.com\nzhouxiaoben.info\nzhouxingchi.info\nzhouxuanyu.com\nzhouyi.biz\nzhouyi.cc\nzhouyi114.com\nzhouyiapi.com\nzhouyiy.com\nzhouyou360.com\nzhouyouji.world\nzhouzhuang.net\nzhoz.com\nzhpca.com\nzhpecc.com\nzhpharm-sh.com\nzhqgtjxh.com\nzhqyue.com\nzhrct.com\nzhrczp.com\nzhrtc.com\nzhsapphire.com\nzhsc.net\nzhsecurity.net\nzhsho.com\nzhshw.com\nzhsrcw.com\nzhsumarc.com\nzhsunway.com\nzhsw.org\nzhswfw.com\nzhszcz.com\nzht-cn.com\nzhtdtech.com\nzhtelecom.com\nzhtfw.net\nzhtgroup.com\nzhthg.com\nzhtlq.com\nzhtmid.com\nzhty.net\nzhtyljt.com\nzhu.today\nzhuainiu.com\nzhuajiyou.com\nzhualeyixia.com\nzhuancorp.com\nzhuanfa.net\nzhuanfou.com\nzhuang520.com\nzhuangbutong.com\nzhuanghebm.com\nzhuangji.net\nzhuangjiba.com\nzhuangjinshanhe.com\nzhuangjizhuli.net\nzhuangkou.com\nzhuangku.com\nzhuangpeitu.com\nzhuangshengsheng.com\nzhuangshijituansheji.com\nzhuangxiang.cc\nzhuangxiaomi.com\nzhuangxiu.com\nzhuangxiu567.com\nzhuangxiubao.com\nzhuangyanyanglao.com\nzhuangyuantao.com\nzhuangzhuang.net\nzhuanhuamao.com\nzhuanhuanqi.com\nzhuanhuanqi.net\nzhuaniao.com\nzhuaninc.com\nzhuankeapp.com\nzhuankezu.com\nzhuanlichaxun.net\nzhuanliqiao.com\nzhuanmenmian.com\nzhuanpinyin.com\nzhuanqianba.net\nzhuanspirit.com\nzhuanstatic.com\nzhuanwaifu.com\nzhuanyejun.com\nzhuanyepeixun.com\nzhuanyes.com\nzhuanyewanjia.com\nzhuanyezhidao.com\nzhuanyizhuanw.com\nzhuanyun.cc\nzhuanyun123.com\nzhuanzfx.com\nzhuanzhi.net\nzhuanzhuan.com\nzhuatang.com\nzhuaxia.com\nzhuayao.net\nzhuayou.com\nzhuayoukong.com\nzhuayuya.com\nzhuazi.com\nzhubai.love\nzhubai.pub\nzhubaijia.com\nzhubajie.com\nzhubajie.la\nzhubangbang.com\nzhubao.com\nzhubao668.com\nzhubaowo.com\nzhubian.com\nzhubiaoju.com\nzhubo123.com\nzhuboqiang.com\nzhuceshenzhengongsi.com\nzhuceyou.com\nzhuchao.cc\nzhucheng.com\nzhuchengdc.com\nzhuchuang.club\nzhudai.com\nzhudianquan.com\nzhufaner.com\nzhufangdianping.com\nzhufengpeixun.com\nzhuge.com\nzhuge888.com\nzhugeapi.com\nzhugeapi.net\nzhugeculture.com\nzhugefang.com\nzhugeio.com\nzhugejianzhi.com\nzhugexuetang.com\nzhuhai-holitel.com\nzhuhaidutyfree.com\nzhuhaigh.com\nzhuhaihuwai.com\nzhuhaily.com\nzhuhaimarathon.com\nzhuhd.win\nzhuhua.com\nzhuhuotech.com\nzhuige.com\nzhuigong.com\nzhuiguang.com\nzhuiguangzhe.com\nzhuihuodong.com\nzhuimabk.com\nzhuimeng8.com\nzhuimengzhu.com\nzhuinianqing.com\nzhuinw.com\nzhuiqu.com\nzhuishu.la\nzhuishukan.com\nzhuishushenqi.com\nzhuishuwang.com\nzhuishuyun.com\nzhuitiankeji.com\nzhuiwan.org\nzhuiyi.ai\nzhuiyi123.com\nzhuiyigemeng.fun\nzhuji.com\nzhuji.net\nzhuji5.com\nzhuji66.com\nzhujia100.com\nzhujia360.com\nzhujiajiao.com\nzhujianapp.com\nzhujiangbeer.com\nzhujiangfuji.com\nzhujiangrc.com\nzhujiangroad.com\nzhujianptcn.com\nzhujib.com\nzhujibaike.com\nzhujibank.com\nzhujicankao.com\nzhujiceping.com\nzhujipindao.com\nzhujipower.com\nzhujirc.com\nzhujisou.com\nzhujitao.com\nzhujiw.com\nzhujiwanjia.com\nzhujiwiki.com\nzhujiwu.com\nzhujizixun.com\nzhukai.com\nzhukang.tech\nzhukao666.com\nzhuke.com\nzhul.in\nzhulang.com\nzhulang.net\nzhulanli.com\nzhulemei.com\nzhuli999.com\nzhulianwines.com\nzhulincat.com\nzhulinedu.com\nzhulinweiye.com\nzhulixiaolie.com\nzhulogic.com\nzhulong.com\nzhulong360.com\nzhulongjiang.com\nzhulouren.com\nzhulu86.com\nzhulubox.com\nzhulusoft.com\nzhuluyy.com\nzhumanggroup.com\nzhumanggroup.net\nzhumaweb.com\nzhumengwl.com\nzhumingepc.com\nzhumiquan.com\nzhumotech.com\nzhumu.me\nzhumulive.com\nzhuna.net\nzhunaerminsu.com\nzhunbai.com\nzhunc.vip\nzhundao.net\nzhundaoyun.com\nzhuneicdn.com\nzhuneijs.com\nzhuniangjia.com\nzhuniu.com\nzhunnai.com\nzhunshitianqi.com\nzhunter.com\nzhuntui.com\nzhunzha.com\nzhuo.com\nzhuo.re\nzhuobao.com\nzhuobufan.com\nzhuodai.net\nzhuofan.net\nzhuofansoft.com\nzhuoguang.net\nzhuohaomao.com\nzhuohuamg.com\nzhuohuan-ep.com\nzhuojuead.com\nzhuokai1.com\nzhuolaoshi.com\nzhuolaoshi.net\nzhuoligk.com\nzhuomaiyun.com\nzhuomiles.com\nzhuomogroup.com\nzhuoquapp.com\nzhuoqun.info\nzhuoqun.xyz\nzhuoqundianli.com\nzhuoshigroup.com\nzhuoshixiong.com\nzhuotianchike.com\nzhuotingwl.com\nzhuoxun68.com\nzhuoyachina.com\nzhuoyi.com\nzhuoyigame.com\nzhuoyigame.site\nzhuoyitm.site\nzhuoyixuan.com\nzhuoykeji.com\nzhuoyou.com\nzhuoyoutech.com\nzhuoyue78.com\nzhuoyuechenxing.com\nzhuoyuegame.com\nzhuoyuegame.net\nzhuoyuesuoxue.com\nzhuoyuezhongxue.com\nzhuozhan.com\nzhuozhengsoft.com\nzhuozhoufangchan.com\nzhuozhourencai.com\nzhuozhuogame.com\nzhupinhr.com\nzhuqinit.com\nzhuqiy.com\nzhuqiyang.com\nzhuqu.com\nzhuque.me\nzhushan.cc\nzhushandata.com\nzhushiyao.com\nzhushou001.com\nzhust.com\nzhutao.com\nzhutaostudio.com\nzhutihome.net\nzhutile.com\nzhutiwo.com\nzhutix.com\nzhutix.net\nzhutix.vip\nzhutou.com\nzhutxia.com\nzhuwang.cc\nzhuwang360.com\nzhuwona.com\nzhux2.com\nzhuxian.com\nzhuxianfei.com\nzhuxiaobang.com\nzhuxuezi.com\nzhuye.kim\nzhuye.xyz\nzhuye123.com\nzhuyili.org\nzhuyitai.com\nzhuyst.cc\nzhuzao.com\nzhuzaobang.com\nzhuzaocloud.com\nzhuzhai.com\nzhuzher.com\nzhuzhichao.com\nzhuzhou.com\nzhuzhoubus.com\nzhuzhoumarathon.com\nzhuzhouwang.com\nzhuzhutown.com\nzhuzi.me\nzhuzihaoke.com\nzhuziplay.com\nzhw2101024.com\nzhwangart.com\nzhwdw.com\nzhwenxue.com\nzhwiki.net\nzhwjw.net\nzhwkg.com\nzhwxwz.com\nzhwyy.com\nzhx-mall.com\nzhx2008.com\nzhxbjsjt.com\nzhxcn.com\nzhxdfpr.com\nzhxg.com\nzhxgimg.com\nzhxhs.net\nzhxht.com\nzhxinuser.com\nzhxnyw.com\nzhxqpt.com\nzhxszq.com\nzhxwq.com\nzhxww.net\nzhxwzx.com\nzhxy1z.com\nzhyccw.com\nzhycn.com\nzhyczx.com\nzhyd.me\nzhyfkj.com\nzhyg.org\nzhyi828.com\nzhyingxiao.com\nzhylwx.vip\nzhylyy.com\nzhyouliang.com\nzhyourun.com\nzhysdxl.com\nzhyymall.com\nzhyyz.com\nzhz.com\nzhzdtz.com\nzhzf-group.com\nzhzf360.net\nzhzh.xyz\nzhzpjt.com\nzhzxin.com\nzhzyw.com\nzhzzx.com\nzi-maoqu.com\nzi0.cc\nzi15.com\nzi5.cc\nzi6.cc\nzianwu.com\nzibaomuye.com\nzibasset.com\nzibll.com\nziboborui.com\nziboga.com\nzibogongli.com\nzibojinling.com\nzibomama.com\nzibomarathon.com\nzibowater.com\nzibozhongxue.com\nzibsc.com\nzichanjie.com\nzichen.zone\nzichenit.com\nzicini.com\nzicp.fun\nzicp.vip\nzidan.chat\nzidanduanxin.com\nzidanduanxin.net\nzidg.com\nzidian8.com\nzidiankeji.com\nzidianqu.com\nzidianwang.com\nzidoo.tv\nzidootv.com\nzifandiaosu.com\nzifumao.com\nzigaokj.com\nzige365.com\nzigeer.com\nzigonggroup.com\nziguhonglan.com\nzihai0351.com\nzihai0535.com\nzihai24.com\nzihaixiaochengxu.com\nzihexin.com\nzihexin.net\nzihu.com\nzihua.li\nzihua01.com\nzihuazhijia.com\nziir-robot.com\nziisp.com\nziji.work\nzijiang.com\nzijiangqy.com\nzijiantty.com\nzijieapi.com\nzijieapi.net\nzijiecdn.com\nzijiecdn.net\nzijieimg.com\nzijieimg.net\nzijiejiaodian.com\nzijietiaodong.com\nzijieurl.com\nzijieurl.net\nzijiewap.com\nzijiewap.net\nzijinfx.com\nzijinji.com\nzijinshan.net\nzijintiyu.com\nzijizhang.com\nzikao-zikao.com\nzikao.gd\nzikao211.com\nzikao365.com\nzikao5.com\nzikaobm.com\nzikaocqi.com\nzikaogd.com\nzikaoj.com\nzikaoshu.net\nzikaoshu.vip\nzikaosw.com\nzikeys.com\nzikoo-int.com\nzikoo.com\nzikui-design.com\nzilang.net\nzilhua.com\nzilian5.com\nziliao8.cc\nziliao8.com\nziliaoge.com\nziliref.com\nzilongame.com\nzilongshanren.com\nzilrms.com\nziluolanh.com\nzimilan.com\nzimlev.com\nzimoapps.com\nzimudashi.com\nzimufy.com\nzimuism.com\nzimujiang.com\nzimuzu.com\nzindall.com\nzine.la\nzinffer.com\nzing-api.com\nzingfront.com\nzingke.com\nzinglix.xyz\nzingsemi.com\nziniao.com\nziniusoft.com\nzinsight-tech.com\nzintow.com\nzinyon.com\nzionpharma.com\nziooc.com\nzip118.com\nzipadc.com\nzipjpg.com\nziqingi.com\nziquyun.com\nzircite.com\nziroom.com\nziroomapartment.com\nziroomstay.com\nziruxing.com\nzisea.com\nzisen.com\nzisha.com\nzishapot.com\nzishu.life\nzishuo.com\nzishuovideo.com\nzisuo.com\nzitbbs.com\nzitengyu.com\nzitern.com\nziti163.com\nziti3.com\nziti6.com\nziti88.com\nziti9.com\nzitichina.com\nziticq.com\nzitidi.com\nzitiewang.com\nzitiguanjia.com\nzitijia.com\nzitixiazai.org\nzitiziyuan.com\nzitongit.com\nzituo.net\nziubao.com\nzivers.com\nzivoo.com\nziwanyouxi.com\nziweicn.com\nziweifu.com\nziweihuan.com\nziwoyou.net\nziwufang.com\nziwuyunjiao.com\nzixia.com\nzixiaomao.com\nzixigua.com\nzixijiaoshi.com\nzixingxinwen.com\nzixueguoxue.com\nzixuejie.com\nzixueren.com\nzixuewang.cc\nzixunauto.com\nzixunhk.com\nzixunkankan.xyz\nzixuntop.com\nziy.cc\nziya1337.com\nziyainfo.com\nziyan666.com\nziyanfoods.com\nziyanmm.com\nziyaokj.com\nziye66.com\nziye8.com\nziyexing.com\nziyi-health.com\nziyimall.com\nziying.site\nziyou.com\nziyou.studio\nziyoufa.com\nziyouma.net\nziyouwu.com\nziyouxing.net\nziyouziti.com\nziyrta.com\nziyuan.tv\nziyuan605.com\nziyuandai.com\nziyuangou.com\nziyuanku.com\nziyuanlm.com\nziyuanm.com\nziyuanniao.com\nziyuanshare.cc\nziyuantun.com\nziyuantx.com\nziyuanxiyanly.com\nziyuanyuan.com\nziyuen.com\nziyun.com\nziyunshanju.com\nzizailvyou.com\nzizcy.com\nzizdog.com\nzizhengfang.com\nzizhigx.com\nzizhijie.com\nzizhuauto.com\nzizhuhui.com\nzizhupark.com\nzizhuyuangongyuan.com\nzizhuyunxuan.com\nzizi2000.com\nzizige.com\nzizizaizai.com\nzizizizizi.com\nzizyw.com\nzizzs.com\nzj-art.com\nzj-ccmi.com\nzj-echo.com\nzj-equation.com\nzj-fhzx.com\nzj-gold.com\nzj-guojun.com\nzj-hc168.com\nzj-huawei.com\nzj-huishi.com\nzj-idc.com\nzj-innolight.com\nzj-jc.com\nzj-jinchen.com\nzj-jingyang.com\nzj-lenor.com\nzj-nongdu.com\nzj-nuolong.com\nzj-shibo.com\nzj-syfj.com\nzj-tattoo.com\nzj-tiansong.com\nzj-tuna.com\nzj-tunnel.com\nzj-yinlong.com\nzj-zhongshe.com\nzj-zhx.com\nzj-zxjx.com\nzj-zyhb.com\nzj.com\nzj01.com\nzj1058.com\nzj123.com\nzj186.com\nzj1991.com\nzj1996.com\nzj2460.com\nzj2car.com\nzj31.net\nzj315.org\nzj32.com\nzj339.com\nzj9.co\nzj9.com\nzj96596.com\nzjabank.com\nzjabhw.com\nzjabjc.com\nzjadgroup.com\nzjaf.net\nzjafl.com\nzjags.com\nzjaijiagroup.com\nzjaikang.com\nzjairports.com\nzjalky.com\nzjalufoil.com\nzjamo.com\nzjamp.com\nzjanchor.com\nzjanyy.com\nzjaqxy.com\nzjart.com\nzjasem.com\nzjautoparts.com\nzjaxyx.com\nzjaxzl.com\nzjbadminton.com\nzjbanger.com\nzjbar.com\nzjbdc.com\nzjbdfood.com\nzjbdt.com\nzjbeacon.com\nzjbelong.com\nzjbhi.com\nzjbicycle.com\nzjbinya.com\nzjblab.com\nzjblast.com\nzjbolunfilter.com\nzjbxcn.com\nzjbyte.com\nzjbyte.net\nzjca.org\nzjcaoban.com\nzjcarnet.com\nzjcb.com\nzjcbank.com\nzjcbcm.com\nzjcbjy.com\nzjcbl.com\nzjcdn.com\nzjceia.com\nzjcgmetal.com\nzjchanghua.com\nzjchina.org\nzjchuanning.com\nzjchuguo.com\nzjchunhui.com\nzjcio.org\nzjcjjt.com\nzjckw.org\nzjcloud.com\nzjcnbank.com\nzjcnyb.com\nzjcqk.com\nzjcrcgas.com\nzjcrjzj.com\nzjcshjt.com\nzjct56.com\nzjctm.net\nzjcuhb.com\nzjcxbank.com\nzjcyts.com\nzjcyxh.com\nzjcyyy.com\nzjda.com\nzjdadeyy.com\nzjdashi.com\nzjdata.net\nzjdeju.com\nzjdeluo.com\nzjdetong.com\nzjdfc.com\nzjdg.com\nzjdhky.com\nzjdianying.com\nzjdjc.com\nzjdjqc.com\nzjdjxh.com\nzjdkjs.com\nzjdl.com\nzjdlgroup.com\nzjdljc.com\nzjdljt.com\nzjdmxc.com\nzjdnajy.com\nzjdpco.com\nzjdsgroup.com\nzjdsz.com\nzjdtkg.com\nzjdxghy.com\nzjdxjs.com\nzjdybank.com\nzjdydlc.com\nzjdyjob.com\nzjdzqt.com\nzje.com\nzjeagles.com\nzjeav.com\nzjeclean.com\nzjecredit.org\nzjedps.com\nzjedu.com\nzjedu.org\nzjej.com\nzjemec.com\nzjeq.com\nzjerg.com\nzjetc.net\nzjevt.com\nzjfangchan.com\nzjfcdn.com\nzjfdc.net\nzjfengli.com\nzjfish.org\nzjfj.net\nzjfm.com\nzjfszhsw.com\nzjft.com\nzjftu.org\nzjfujiu.com\nzjfurnace.com\nzjg-edu.com\nzjg-jcu.com\nzjg.me\nzjgas.com\nzjgckg.com\nzjgcreative.com\nzjgengu.com\nzjgeyi.com\nzjgf88.com\nzjgfjt.com\nzjgfls.com\nzjgj.com\nzjgjj.com\nzjgkg.com\nzjgmwl.com\nzjgqt.org\nzjgrc.com\nzjgroupedu.com\nzjgrrb.com\nzjgsgroup.com\nzjgslb.com\nzjgt.com\nzjguji.com\nzjgwqxh.com\nzjgwsc.com\nzjgwy.org\nzjgwyw.org\nzjgycjj.com\nzjgyjt.com\nzjgzcpa.com\nzjgzks.com\nzjgzp.com\nzjgztz.com\nzjgzzc.com\nzjh1893.xyz\nzjha.org\nzjhac.com\nzjhaitian.com\nzjhangmo.com\nzjhangyin.com\nzjharbor.com\nzjhbdlkj.com\nzjhby.com\nzjhcbank.com\nzjhcly.com\nzjhd.com\nzjhdchem.com\nzjheacc.com\nzjheadway.com\nzjhejiang.com\nzjheliang.com\nzjhengshun.com\nzjhengyida.com\nzjhf.org\nzjhfxcl.com\nzjhi.net\nzjhkele.com\nzjhlcnc.com\nzjhlgroup.com\nzjhlyyjt.com\nzjhnlianzhong.com\nzjhnrb.com\nzjhospital.net\nzjhpyy.com\nzjhrnet.com\nzjhsfs.com\nzjhslyw.com\nzjhtcm.com\nzjhualing.com\nzjhuazhe.com\nzjhuba.com\nzjhui.net\nzjhwgroup.com\nzjhx520.com\nzjhxgf.com\nzjhxw.com\nzjhyrcb.com\nzjhzgy.com\nzjhzjt.com\nzjhzjtjt.com\nzjhzkq.com\nzjhzxc.com\nzji.net\nzjian.net\nzjibao.com\nzjiec.com\nzjiecode.com\nzjiekai.com\nzjiii.org\nzjiis.com\nzjim.org\nzjimc.com\nzjipc.com\nzjitc.net\nzjivy.com\nzjj-holiday.com\nzjjaxx.com\nzjjcbdt.com\nzjjd.org\nzjjedu.com\nzjjfl.com\nzjjfpharm.com\nzjjgy.com\nzjjgylydjc.com\nzjjgzdh.com\nzjjh.com\nzjjianhong.com\nzjjiaoke.com\nzjjinuo.com\nzjjinzi.com\nzjjizhi.com\nzjjjtec.com\nzjjky.com\nzjjlvyou8264.com\nzjjm.net\nzjjmtl.com\nzjjn.com\nzjjnzyjx.com\nzjjr.com\nzjjrh.com\nzjjrtv.com\nzjjs.net\nzjjsbank.com\nzjjsit.com\nzjjsjt.com\nzjjstzhb.com\nzjjsw.com\nzjjta.com\nzjjtgc.com\nzjjttaa.com\nzjjtwxpgs.com\nzjjubao.com\nzjjudong.com\nzjjxjt.com\nzjjxsoft.com\nzjjy.com\nzjjy.net\nzjjytyt.com\nzjjyxx.net\nzjjyzx.com\nzjjzxgj.com\nzjjzyxh.com\nzjkangzh.com\nzjkbfjd.com\nzjkccb.com\nzjkdl.com\nzjkdqz.com\nzjke.com\nzjkelan.com\nzjkeling.com\nzjkfcapital.com\nzjkgdcs.com\nzjkgjj.com\nzjkim.com\nzjkings.com\nzjkjob.com\nzjklfj.com\nzjkmtgc.com\nzjknews.com\nzjknsn.com\nzjkpet.com\nzjks.com\nzjks.net\nzjkszg.com\nzjkwhjj.com\nzjkyjs.com\nzjlande.com\nzjlca.com\nzjlcwg.com\nzjldrcb.com\nzjledfbd.com\nzjlepu.com\nzjlfdq.com\nzjlianchi.com\nzjlianhua.com\nzjlindu.com\nzjlljt.com\nzjlottery.com\nzjlsbz.com\nzjlsedu.org\nzjlvjie.com\nzjlxjs.com\nzjlxtx.com\nzjlzgg.com\nzjma.org\nzjmaerfj.com\nzjmaiou.com\nzjmana.com\nzjmax.com\nzjmc.tv\nzjmct.com\nzjmetal.com\nzjmi-mall.com\nzjmi.com\nzjmichem.com\nzjmif.com\nzjmileasing.com\nzjminb.com\nzjminghong.com\nzjmingzhen.com\nzjmingzhuang.com\nzjminong.com\nzjmj.org\nzjmjtec.com\nzjmkzx.com\nzjmobile.com\nzjmrhpt.com\nzjmrmf.com\nzjmsbt.com\nzjmtw.com\nzjmuex.com\nzjmycn.com\nzjnad.com\nzjnature.com\nzjnav.cc\nzjnav.com\nzjndjs.com\nzjnengyuan.com\nzjnews.com\nzjnrcb.com\nzjnrg.com\nzjnthkg.com\nzjnzi.com\nzjolcdn.com\nzjoldns.com\nzjorient.com\nzjoubbs.com\nzjpark.com\nzjpcedu.com\nzjpci.com\nzjpec.com\nzjphrcb.com\nzjpia.net\nzjpjmy.com\nzjplan.com\nzjpmw.com\nzjpoetry.com\nzjpost.com\nzjpse.com\nzjptcc.com\nzjpubservice.com\nzjqichuang.com\nzjqinghu.com\nzjqingshan.com\nzjqinzijianding.com\nzjqjs.com\nzjqsysj.com\nzjqzsy.com\nzjradiology.org\nzjrc.com\nzjrc.net\nzjrcu.com\nzjrdl.com\nzjrh.net\nzjriji.com\nzjrob.com\nzjrongli.com\nzjrq.com\nzjrqchina.com\nzjrtv.vip\nzjrunqiang.com\nzjrxz.com\nzjsairport.com\nzjsaisi.com\nzjsaisiet.com\nzjsalt.com\nzjsanji.com\nzjsanma.com\nzjsaz.com\nzjsbigdata.com\nzjscdb.com\nzjsck.com\nzjscs.com\nzjsdbjt.com\nzjseaport.com\nzjsee.org\nzjsftc.com\nzjsgjs.com\nzjshangfeng.com\nzjshcl.com\nzjshibao.com\nzjshijian.com\nzjshining.com\nzjshipyard.com\nzjshjkj.com\nzjshuangtu.com\nzjshuhao.com\nzjshuo.com\nzjshwl.com\nzjsight.com\nzjsjcjt.com\nzjsjjjt.com\nzjsjky.com\nzjsjty.com\nzjsjtz.com\nzjskgr.com\nzjskjt.com\nzjslep.com\nzjslzh.com\nzjsms.com\nzjspas.com\nzjssjt.com\nzjsszsjy.com\nzjsta.org\nzjstar-electric.com\nzjstm.org\nzjstv.com\nzjsuntex.com\nzjsw.org\nzjswxpx.com\nzjsxkj.com\nzjsxlt.com\nzjsxrz.com\nzjsxss.com\nzjsyyhyxh.com\nzjszbank.com\nzjszjz.com\nzjszrc.com\nzjszsyy.com\nzjszyyxh.com\nzjszzs.com\nzjt2017.com\nzjtaa.net\nzjtbe.com\nzjtcc.com\nzjtcjt.com\nzjtcn.com\nzjtcpm.com\nzjtdw.com\nzjtdyl.com\nzjtea.com\nzjteam.com\nzjtggroup.com\nzjtic.com\nzjtjw.com\nzjtkdz.com\nzjtlcb.com\nzjtmb.com\nzjtmkg.com\nzjtntd.com\nzjtobacco.com\nzjtongde.com\nzjtp.com\nzjtree.com\nzjts.com\nzjtxedu.org\nzjtyphoon.com\nzjtzcx.com\nzjtzedu.com\nzjtzwater.com\nzju88.org\nzjubh.com\nzjuers.com\nzjugis.com\nzjuiwz.com\nzjujournals.com\nzjukf.com\nzjun.info\nzjuqsc.com\nzjut.cc\nzjvending.com\nzjwandi.com\nzjwanma.com\nzjwater.com\nzjwater.org\nzjwc168.com\nzjwcjm.com\nzjwcqp.com\nzjwebapp.com\nzjwentou.com\nzjwfgroup.com\nzjwhhly.com\nzjwhyis.com\nzjwiki.com\nzjwit.net\nzjwjrc.com\nzjwk.com\nzjwmw.com\nzjwqw.com\nzjws.net\nzjwsbidding.com\nzjwttools.com\nzjwu.net\nzjwxbank.com\nzjwzba.com\nzjwzbearing.com\nzjxc.com\nzjxcsw.com\nzjxf119.com\nzjxhbj.com\nzjxhedu.com\nzjxhgd.com\nzjxhxny.com\nzjxindongyang.com\nzjxindu.com\nzjxinghe.com\nzjxinyun.com\nzjxjrc.com\nzjxlmb.com\nzjxltz.com\nzjxlyp.com\nzjxnd.com\nzjxpp.com\nzjxqyy.com\nzjxs.work\nzjxsbank.com\nzjxssj.com\nzjxtxs.com\nzjxwjs.com\nzjxwkg.com\nzjxwtoy.com\nzjxxkx.com\nzjxxt.com\nzjxymy.com\nzjxzgrd.com\nzjyanxing.com\nzjyari.com\nzjycpx.com\nzjyfyxzz.com\nzjyhjsjt.com\nzjyhqy.com\nzjyingcai.com\nzjyinzuo.com\nzjyiot.com\nzjyiyuan.com\nzjykrc.com\nzjylbx.com\nzjylgroup.com\nzjyonder.com\nzjyoutian.com\nzjyq.cc\nzjysgroup.com\nzjytxl.com\nzjyxzzs.com\nzjyyc.com\nzjyygy.com\nzjyzpcxx.com\nzjza.com\nzjzajsjt.com\nzjzcec.com\nzjzcen.com\nzjzcj.com\nzjzfj.com\nzjzfjs.com\nzjzg.com\nzjzhd.com\nzjzhengding.com\nzjzhengxingyiyuan.com\nzjzhengyao.com\nzjzhenyou.com\nzjzhitan.com\nzjzhongcheng.com\nzjzhonglan.com\nzjzhongtian.com\nzjzj.net\nzjzj.org\nzjzjjx.com\nzjzoneng.com\nzjzramc.com\nzjzrzyjy.com\nzjzs.net\nzjzsa.com\nzjzsco.com\nzjzsxb.com\nzjzwlab.com\nzjzy.com\nzjzybiotech.com\nzjzydns.com\nzjzygroup.com\nzjzyxs.com\nzk0771.com\nzk100.com\nzk2013.com\nzk5u.com\nzk678.com\nzk71.com\nzk789.net\nzkailun.com\nzkauto.com\nzkb77.com\nzkbhj.com\nzkbs.net\nzkck.com\nzkcmg.com\nzkcrm.com\nzkcserv.com\nzkcx.com\nzkdt.net\nzke999.com\nzkecopro.com\nzkedrive.com\nzkgenergy.com\nzkh.com\nzkh360.com\nzkhb.group\nzkhcsoft.com\nzkhcsy.com\nzkhgchip.com\nzkhj618.com\nzkicme.com\nzking.com\nzkjan.com\nzkjds.com\nzkkailiaoji.com\nzkkjpa.com\nzkl2333.com\nzkmeiling.com\nzkmob.net\nzknmattress.com\nzkoffcn.com\nzkpeace.com\nzkpk.org\nzkrdlab.com\nzkreen.com\nzkroom.com\nzkrsks.com\nzksbxhyxh.com\nzkscgj.com\nzksglaser.com\nzkshare.com\nzksn.com\nzksoftwaresz.com\nzksps.com\nzksyzy.com\nzktecn.com\nzkteco.com\nzkteco.xin\nzktecoiot.com\nzktecosj.com\nzktest.com\nzktimecube.com\nzktools.net\nzktw.com\nzku.net\nzkunet.com\nzkungfu.com\nzkuyun.com\nzkw2009.com\nzkwtech.com\nzkxblog.com\nzkxww.com\nzkyai.com\nzkydib.com\nzkyl.vip\nzkyouxi.com\nzkyxc.com\nzkyxls.com\nzkzbkj.com\nzkzj.org\nzkzls.com\nzkzn666.com\nzkzs.net\nzl-steelpipe.com\nzl1006.com\nzl56.com\nzl99.org\nzlbaba.com\nzlbagx.com\nzlbkj.com\nzlca.org\nzlcool.com\nzldatas.com\nzldq.org\nzle.com\nzlf.co\nzlfc.mobi\nzlfedu.com\nzlfind.com\nzlfshop.com\nzlfzyj.com\nzlg.com\nzlgcgl.com\nzlghr.com\nzlglpt.com\nzlgmcu.com\nzlgpy.com\nzlgsj.com\nzlh-zh.com\nzlhome.com\nzlhospital.com\nzlhui.com\nzlibs.com\nzlingad.com\nzlink-e.com\nzlinkurl.com\nzlitoa.cc\nzlitoa.com\nzljskb.com\nzljweb.com\nzljx.net\nzlkb.net\nzlketang.com\nzlkj20.com\nzlm4.com\nzlmlt.com\nzlnewlife.com\nzlongad.com\nzlongame.com\nzlook.com\nzlprc.com\nzlpumps.com\nzlqb.net\nzlqbk.com\nzlqh.com\nzlqiao.com\nzlqx.com\nzlr6.com\nzls365.com\nzlscn.net\nzlsin.com\nzlsoft.com\nzlsqlt.com\nzlsss.com\nzlsyun.com\nzlt365.com\nzltianhen.com\nzlttxl.com\nzluren.com\nzlview.com\nzlvod.com\nzlwh2026.com\nzlwl.vip\nzlwlhse.com\nzlx.com\nzlxiang.com\nzly169.com\nzlygjzx.com\nzlygu.com\nzlysgl.com\nzlzlzsl.com\nzlzscq.com\nzlzt.com\nzm-assemble.com\nzm-clock.com\nzm-ep.com\nzm-grow.com\nzm-introduce.com\nzm-invite.com\nzm-mp.com\nzm-wx.com\nzm0772.com\nzm1717.com\nzm30.com\nzmapp.com\nzmaxfilm.com\nzmaxhotels.cc\nzmbesta.com\nzmbg.com\nzmbga.com\nzmc-china.com\nzmcchina.com\nzmccx.com\nzmclearing.com\nzmd5.com\nzmdfcw.com\nzmdfdc.com\nzmdsbus.com\nzmdsjob.com\nzmdwater.com\nzmdyzkgjt.com\nzmdz.com\nzmeetb.com\nzmeng.cc\nzmeng123.com\nzmengzhu.com\nzmgov.com\nzmgrcw.com\nzmhttp.com\nzmifi.com\nzmingcx.com\nzmirrordemo.com\nzmis.me\nzmister.com\nzmjiudian.com\nzmjm.com\nzmkma.com\nzmkmex.com\nzmlearn.com\nzmmek.com\nzmmio.com\nzmndjm.com\nzmnedu.com\nzmnh.com\nzmnjtwx.com\nzmnoa.com\nzmnrz.com\nzmnxbc.com\nzmobuy.com\nzmpal.com\nzmqdez.ru\nzmqh.com\nzmqmt.com\nzmren.com\nzmrenwu.com\nzmshz.com\nzmsq.com\nzmssh.com\nzmtpc.com\nzmtquan.com\nzmubf.com\nzmufivehospital.com\nzmumu.com\nzmweb.net\nzmwo.com\nzmwxxcx.com\nzmxitang.com\nzmye5vly.com\nzmyui.com\nzmyyc.com\nzmzb.com\nzmzjt.com\nzmzx.cc\nzn99.com\nznba.net\nznbo.com\nznc365.com\nzncar.com\nzncmjt.com\nznczz.com\nzndata.com\nzndlkj.com\nzndls.com\nzndns.com\nznds.com\nznds.net\nzndsbbs.com\nzndsrom.com\nzndstec.com\nznelc.com\nznfit.com\nzngm.com\nzngue.com\nzngxjt.com\nznhhmedical.com\nznhospital.com\nznhr.com\nznhwhw.com\nznjchina.com\nznjj.tv\nznjs.com\nznjsjt.com\nznjtgf.com\nznjttz.com\nznlc2015.com\nznlcn.org\nznlerp.com\nznlh.com\nznmq.com\nznnu.com\nznonline.net\nznp9.com\nznpin.com\nznpla.space\nznrfwy.com\nznrom.com\nznrsc.com\nznshuke.com\nznshuru.com\nznsjw.com\nznsmart.com\nznstartups.com\nzntb.net\nzntcexpo.com\nzntschool.com\nzntvrom.com\nzntx.cc\nznum.com\nznwb.com\nznxdxs.com\nznxhd.com\nznxk.net\nznyp.com\nznypjy.com\nznzcompass.com\nznzcompass.net\nznzmo.com\nznzncn.com\nznznet.net\nznztool.com\nznztv.com\nznzyf.com\nzo-station.com\nzoassetmanagement.com\nzobmxcfw.com\nzocai.com\nzocolor.com\nzocoxx.com\nzodgame.me\nzoe360.com\nzoebon.com\nzoeeasy.com\nzoeess.com\nzoform.com\nzofund.com\nzoharforce.com\nzohead.com\nzohi.tv\nzoioo.com\nzoje.com\nzojirushi-china.com\nzokmetal.com\nzokogo.com\nzol-img.com\nzol.com\nzollty.com\nzoloz.net\nzoly.tech\nzomanbio.com\nzombiescat.com\nzomiu.com\nzomsky.com\nzon100.com\nzonafs.com\nzonboapp.com\nzonci.com\nzone-king.com\nzone.id\nzone139.com\nzoneben.com\nzoneidc.com\nzoneker.com\nzonelo.tech\nzonen-tech.com\nzoneray56.com\nzoneve.com\nzoneyung.com\nzonezu.com\nzongcaidetishenqianqi.net\nzongdegongju.com\nzonghangsl.com\nzonghe.com\nzonghe888.com\nzongheng.com\nzongheng001.com\nzonghengke.com\nzonghengxiaoshuo.com\nzonglai.com\nzonglikeji.com\nzongming.net\nzongmutech.com\nzongs365.com\nzongshengjituan.com\nzongtiku.com\nzongxiankj.com\nzongyiconverge.com\nzongyifile.com\nzongyigame.com\nzongyimobile.com\nzongyionline.com\nzongyiphone.com\nzongyixun.com\nzonhen.com\nzonsengroup.com\nzonsenmotor.com\nzonst.com\nzontes.com\nzoocer.com\nzoocoffee.com\nzooelab.com\nzoofon.com\nzookingsoft.com\nzookparts.com\nzoolnasm.com\nzoom3g.com\nzoomerstudio.com\nzoomeye.org\nzoomfr.com\nzoomla.net\nzoomlion.com\nzoomwo.com\nzoopda.com\nzoosnet.net\nzoossoft.com\nzoossoft.net\nzooszyservice.com\nzoot.plus\nzootope.ink\nzooyoo.cc\nzoqlan.com\nzoranchem.com\nzoroli.com\nzorrospray.com\nzorun.com\nzoscape.com\nzotiser.com\nzotrppzv.com\nzotrus.com\nzotye.com\nzou.la\nzouaw.com\nzoubiao.com\nzoucheng.cc\nzoucz.com\nzoues.com\nzouhong365.com\nzouht.com\nzouin.net\nzoujiang.com\nzoukankan.com\nzoular.com\nzoutu.com\nzouzhi.world\nzouzhiqiang.com\nzovps.com\nzowoyoo.com\nzoxun.com\nzoyoo.net\nzoyse.com\nzoyst.com\nzoyuecs.com\nzozen.com\nzp.cc\nzp.do\nzp005.com\nzp0716.com\nzp0737.com\nzp114.net\nzp365.com\nzp515.com\nzpan.space\nzparking-tech.com\nzpascal.net\nzpb365.com\nzpbtnpl.com\nzpc-cn.com\nzpcdi.com\nzpchaji.com\nzpcmshopping.com\nzpedu.com\nzpedu.org\nzpfdc.com\nzpgd.net\nzphit.com\nzphlkj.com\nzphospital.com\nzpjkcy.com\nzplay.com\nzplayworld.com\nzpm.so\nzpmc.com\nzpmg.com\nzpparts.com\nzpstar.com\nzpt966033.com\nzptq.com\nzpug.net\nzpwcb.com\nzpwz.net\nzpxrmyy.com\nzq12369.com\nzq235.com\nzq6.com\nzq84.com\nzqagr.com\nzqaqxh.com\nzqase.com\nzqbykj.com\nzqcaf.com\nzqcloud.com\nzqcloudgame.com\nzqcyzg.com\nzqd086.com\nzqdns37.vip\nzqedu.net\nzqfdc.net\nzqgame.com\nzqgjz1312.com\nzqgreen.com\nzqhthr.com\nzqhuahui.com\nzqhuwkc.com\nzqic.net\nzqids.com\nzqin758.xyz\nzqjcedu.com\nzqjiese.com\nzqjinneng.com\nzqlian.com\nzqlx.com\nzqnf.com\nzqpj.com\nzqread.com\nzqsign.com\nzqsjf.com\nzqsos.com\nzqsx.net\nzqtbg.com\nzqtbu.com\nzqtong.com\nzquan.cc\nzquan.org\nzqvip8.cc\nzqwfe.work\nzqwh.com\nzqwxzf.com\nzqxsc.com\nzqy.com\nzqygame.com\nzqyxf.com\nzqz510.com\nzqzd.com\nzqzyxx.com\nzr-fanuc.com\nzr66.com\nzrahh.com\nzran88.com\nzrblog.com\nzrblog.net\nzrbn.ltd\nzrbx.com\nzrcaifu.com\nzrcbank.com\nzrfan.com\nzrfe.com\nzrfilm.com\nzrhsh.com\nzring.com\nzritc.com\nzrj96.com\nzrkjy.com\nzrlyyy.com\nzrmm.com\nzrmxswrl.com\nzrpta.com\nzrtechnology.com\nzrtg-group.com\nzrtg.com\nzrthink.com\nzrtjt.com\nzrway.com\nzrwjk.com\nzrxdsj.com\nzry97.com\nzrzhpt.com\nzs-ah.com\nzs-e.com\nzs-frd.com\nzs-hospital.com\nzs-jlc.com\nzs-lzlj.com\nzs-nj.com\nzs-rh.com\nzs-united.com\nzs6y.com\nzs8q.com\nzs9.com\nzs91.com\nzsaber.com\nzsacg.com\nzsaeroengine.com\nzsafedns.net\nzsaipay.com\nzsamc.com\nzsanxing.com\nzsaxi.com\nzsb2c.com\nzsbeike.com\nzsboai.com\nzsbqgz.com\nzsbsoft.com\nzsbus.wiki\nzsbyw.com\nzsc-group.com\nzscbd.com\nzscch.com\nzsceta.com\nzschem.com\nzscjjt.com\nzscollege.com\nzsctgroup.com\nzscz0768.com\nzsd.name\nzsdianlan.com\nzsdlw.com\nzsdown.com\nzsedu.net\nzsemall.com\nzsemi.com\nzsengine.com\nzseoo.com\nzsex.ltd\nzsezt.com\nzsfund.com\nzsfzjs.com\nzsg6.com\nzsgai.com\nzsgcgj.com\nzsgd.com\nzsgjs.com\nzsglrj.com\nzsgoodlighting.com\nzsgsly.com\nzsgzc.com\nzsh.com\nzsh8.com\nzshandsome.com\nzshc12306.com\nzshcx.com\nzshgsoft.com\nzshhjt.com\nzshield.net\nzshl.com\nzshnb.com\nzshpldbz.com\nzshsoft.com\nzshszy.com\nzshtys888.com\nzshuoshao.store\nzshuoshao.tech\nzshypr.com\nzsia.org\nzsihuo.com\nzsimc.com\nzsincer.com\nzsite.com\nzsj18.com\nzsjdxh.org\nzsjhsjy.com\nzsjhx.com\nzsjjob.com\nzsjuchuang.com\nzsjxwj.com\nzsjz.com\nzskoubei.com\nzsksdw.com\nzsksw.net\nzslady.com\nzslefx.art\nzslhs.com\nzslin.com\nzslp021.com\nzsmama.com\nzsmeishiling.com\nzsmls.com\nzsmw.net\nzsmyy.com\nzsmz.com\nzspharm.com\nzsppsj.com\nzsquant.com\nzsqx.com\nzsr.cc\nzsscw.net\nzssjzyxh.com\nzssl.net\nzssmk.net\nzssph.com\nzssubeihospital.com\nzsswjt.com\nzssxyy.com\nzsszsh.com\nzsszyy.com\nzstack.io\nzstack.org\nzstatic.net\nzstaticcdn.com\nzsthk.com\nzstime.com\nzstled.com\nzsuan.com\nzsucai.com\nzsufivehos.com\nzsvsz.com\nzswater.com\nzswcn.com\nzswebao.shop\nzswj.com\nzswmailbox.com\nzswtjt.com\nzsxfsy.com\nzsxgzn.com\nzsxinsha.com\nzsxq.com\nzsxq100.com\nzsxsoft.com\nzsyanxuan.com\nzsyknk.com\nzsynjt.com\nzsysgz.com\nzsythink.net\nzsytit.com\nzsyyart.com\nzszk.net\nzszq.com\nzszxsz.com\nzszyss.com\nzt-express.com\nzt-g.com\nzt-info.com\nzt-job.com\nzt-motor.com\nzt0729.xyz\nzt1356.com\nzt1388.com\nzt17.com\nzt1f.com\nzt24j.com\nztautoparts.com\nztbeijixing.com\nztbest.com\nztcadx.com\nztcdata.com\nztcexam.com\nztch.ltd\nztcia.com\nztcjjt.com\nztcnwy.com\nztcpa.com\nztdgroup.com\nztdli.com\nztdsp.com\nzte.net\nztedevice.com\nztedevices.com\nztedu.com\nztedu8.com\nztehotel.com\nztehotel.net\nztemall.com\nztemap.com\nztems.com\nztestin.com\nztfans.com\nztfsec.com\nztfssc.com\nztgame.com\nztgcglzx.com\nztgy.org\nzthrv.com\nzthsqx.com\nzthx.com\nzthx2004.com\nztinfoga.com\nztjczx.com\nztjhuyu.com\nztjinchi.com\nztjoin.com\nztjttz.com\nztjy61.com\nztjystore.com\nztjzgf.net\nztjzht.com\nztkm.com\nztkosen.com\nztky.com\nztkycn.com\nztlycm.com\nztmao.com\nztmvip.com\nztn.com\nztnews.net\nztno.com\nztnwork.com\nztny188.com\nzto.com\nzto.net\nzto56.com\nztoapp.com\nztoglobal.com\nztogroup.com\nztomember.com\nztoyh.com\nztqft.com\nztqqt.com\nztrczp.com\nztrhmall.com\nztrong.com\nztsafe.com\nztshjcb.com\nztsiot.com\nztskc.com\nztt.cc\nzttx-exp.com\nzttx.com\nztupic.com\nztups.com\nztvcar.com\nztweld.com\nztwlbeijing.com\nztwlgyl.com\nztwzcg.com\nztwzsc.com\nztxinli.com\nztxxr.com\nztxyg.com\nztxygj.com\nztxywy.net\nztxz.cc\nztxzsjt.com\nztyang.com\nztytech.com\nztyyw.com\nztzcnc.com\nztzhbw.com\nztzhgw.com\nztzhsq.com\nztzjt.com\nztzqzg.com\nztzsnn.com\nztzupu.com\nztzy.com\nztzzls.com\nzu.biz\nzu1tai.com\nzu3.com\nzuadr.com\nzuan-cheng.com\nzuan88.com\nzuanke8.com\nzuanqianyi.com\nzuanshi.com\nzuanshitoupiao.com\nzubei.co\nzuber.im\nzubunet.com\nzucaijia.com\nzucangbao.com\nzuchang1688.com\nzuche.com\nzuche900.com\nzuchecdn.com\nzuchuan.cc\nzuciz.com\nzucp.net\nzudequ.com\nzudong.com\nzuduijun.com\nzueiai.net\nzuezu.com\nzufang.com\nzufangzi.com\nzugame.com\nzugeliang01.com\nzugeqifu.com\nzuhao.space\nzuhaoapp.com\nzuhaofa.com\nzuhaohao.com\nzuhaowan.com\nzuhaowan.net\nzuhedaikuan.com\nzuhuaizhijia.com\nzuhuanhao.com\nzui.com\nzui5.com\nzui88.com\nzuiaixs.net\nzuiben.com\nzuibook.com\nzuiceshi.net\nzuicool.com\nzuidaima.com\nzuidijia.com\nzuidongxi.com\nzuifengyun.com\nzuifuli.com\nzuigx.com\nzuihaodaxue.com\nzuihuimai.com\nzuihuixue.com\nzuijh.net\nzuijiao.net\nzuik.ren\nzuiku.com\nzuikzy.com\nzuimeia.com\nzuimeiqidai.com\nzuimeitianqi.com\nzuiqiangyingyu.net\nzuiqingfeng.com\nzuishidai.com\nzuitang.com\nzuitu.com\nzuiwan.net\nzuixiaoyao.com\nzuixu.com\nzuiyanke.com\nzuiyou.com\nzuiyouxi.com\nzuizhifu.com\nzuji360.com\nzujiant.com\nzujuan.com\nzujuanku.com\nzujuanyi.com\nzuk.com\nzuka666.com\nzukang88.com\nzuke.com\nzuker.im\nzulijian.com\nzulin.com\nzulinbao.com\nzulinks.com\nzulllv.com\nzulong.com\nzulongacmall.com\nzulongtea.com\nzumbacn.com\nzumulv.com\nzun.com\nzun.gd\nzun9.com\nzunnou.com\nzunsf.com\nzunsou.com\nzunxiang17.com\nzunxun.com\nzunxun.net\nzunyibus.com\nzunyihospital.com\nzuo11.com\nzuo3.com\nzuoanedu.com\nzuoanfloor.com\nzuobaike.net\nzuobiao.press\nzuobin.net\nzuocaibusiness.com\nzuocaicn.com\nzuocheng.net\nzuodanye.com\nzuodao.com\nzuodashi.com\nzuodia.com\nzuofawang.com\nzuogj.com\nzuoh5.com\nzuohaotu.com\nzuohome.com\nzuohuodong.com\nzuoji-scm.com\nzuojiachubanshe.com\nzuojiang.com\nzuojiawang.com\nzuojing.com\nzuojj.com\nzuoli.com\nzuolin.com\nzuoqu.com\nzuoqudashi.net\nzuosa.com\nzuoshangbao.com\nzuoshouyisheng.com\nzuoshujiang.com\nzuotishi.com\nzuoweibc.com\nzuowen.com\nzuowen.net\nzuowen8.com\nzuowenjing.com\nzuowenjun.com\nzuowenku.net\nzuowenren.com\nzuowenwang.net\nzuowenzhitiao.com\nzuoyebang.cc\nzuoyebang.com\nzuoyebao.com\nzuoyebao.net\nzuoyehezi.com\nzuoyesou.com\nzuoyou-sofa.com\nzuozu.net\nzuozuowang.net\nzupig.com\nzupuk.com\nzupulu.com\nzuqiuba.com\nzuqiuba.net\nzuqiuju.com\nzusan.com\nzushouji.com\nzushoushou.com\nzuszw.com\nzutingwan.com\nzuulee.com\nzuwuzhuyi.com\nzuxiaoqi.com\nzuxiaoyi.com\nzuyaxi.com\nzuyizhan.com\nzuyouzu.com\nzuysfr.com\nzuyunfei.com\nzuyushop.com\nzuzheyong.com\nzuzhirenshi.com\nzuzitech.com\nzuzuche.com\nzuzuqueen.com\nzviewcloud.com\nzving.com\nzvstapp.com\nzvsts.com\nzvv.me\nzw-tencentclb.cloud\nzw-tencentclb.com\nzw-tencentclb.net\nzw-tencentclb.work\nzw110.com\nzw3dp.com\nzw69.com\nzw885.com\nzwads.com\nzwayoptik.com\nzwaztizp.com\nzwbdata.com\nzwcad.com\nzwcctv.com\nzwcnw.com\nzwcsm.com\nzwcuo.com\nzwda.com\nzwdn.com\nzwdns.com\nzwds.cc\nzwdsty.com\nzwduxs.com\nzwechat.com\nzwefu.com\nzwelec.com\nzwfw.com\nzwgeek.com\nzwgfood.com\nzwggb.com\nzwgjpx.com\nzwgt.net\nzwgx.com\nzwhuilian.com\nzwhz.com\nzwie2003.com\nzwjczx.com\nzwjhl.com\nzwjiaoyu.com\nzwjk.com\nzwjkey.com\nzwjl.net\nzwk999.com\nzwkf.net\nzwlhome.com\nzwoasi.com\nzwoptical.com\nzwoptics.com\nzwslshy.com\nzwsmds.com\nzwtianshangm.com\nzwtkl8.com\nzwtxipr.com\nzwuoo.com\nzwwank.com\nzwwdm.com\nzwwlgzs.com\nzwwltkl.com\nzwwx.com\nzwxww.net\nzwxx2022.com\nzwying.com\nzwyll.com\nzwyq110.com\nzwzdiy.cc\nzwzrent.com\nzwzsh.net\nzwzyzx.com\nzx-tour.com\nzx-xcx.com\nzx0093.com\nzx017.com\nzx017.net\nzx0818.com\nzx100.com\nzx10000.com\nzx110.org\nzx1234.com\nzx16f.com\nzx181.com\nzx18x.com\nzx350zx.com\nzx42195.com\nzx7b.com\nzx8.com\nzx98.com\nzx990.com\nzxb12315.com\nzxblinux.com\nzxbook.net\nzxbzr.com\nzxchemgroup.com\nzxcmk.com\nzxcoder.com\nzxczw.com\nzxd.com\nzxd666.com\nzxdkj.com\nzxdu.net\nzxdyw.com\nzxerp.com\nzxfsv.online\nzxfw888.com\nzxfwgj.com\nzxgcloud.com\nzxgj56.com\nzxgongshui.com\nzxgroup.com\nzxgstock.com\nzxgzs.com\nzxgzw.com\nzxhgroup.com\nzxhmjj.com\nzxhnzq.com\nzxhong.com\nzxhospital.com\nzxhsd.com\nzxhuman.com\nzxhwzm.com\nzxiaosi.com\nzxiaoxiang.com\nzxicrm.com\nzxinc.org\nzxingyun.com\nzxinzxw.com\nzxip.com\nzxiti02.com\nzxiu.com\nzxiw.com\nzxiyun.com\nzxja.com\nzxjkj.com\nzxjsq.net\nzxjy.net\nzxk120.com\nzxknow.com\nzxkq022.com\nzxky007.com\nzxl.com\nzxlib.com\nzxliu.com\nzxlo.com\nzxls.com\nzxmall.com\nzxmn2018.com\nzxmoto.com\nzxmseed.com\nzxneweye.com\nzxnic.net\nzxnrh.com\nzxoid.com\nzxopen.com\nzxpcloud.com\nzxpec.com\nzxpmq.com\nzxqfjt.com\nzxqg.com\nzxrcfw.com\nzxrtb.com\nzxsauto.com\nzxsctf.com\nzxshe.com\nzxsmd.com\nzxsou.com\nzxstyl.com\nzxswjx.com\nzxsx.org\nzxsxs.com\nzxsygs.com\nzxt2007.com\nzxtang.com\nzxtnetwork.com\nzxttax.com\nzxtw168.com\nzxw1.com\nzxw51.com\nzxwcbj.com\nzxwindow.com\nzxwyouxi.com\nzxx.world\nzxxk.com\nzxxmr.com\nzxxww.com\nzxxwypsj.com\nzxxxkj.com\nzxxyedu.com\nzxydss.com\nzxyee.com\nzxz.ee\nzxzhengxin.com\nzxzhijia.com\nzxzls.com\nzxzmail.com\nzxzt123.com\nzxzx8.com\nzxzyl.com\nzxzyy.com\nzy-cam.com\nzy-geo.com\nzy-textiles.com\nzy.com\nzy100.com\nzy120.com\nzy169.net\nzy223.com\nzy234.com\nzy728.com\nzy91.com\nzy99.net\nzyactech.com\nzyalc.com\nzyan.cc\nzyan456.com\nzyanzn.com\nzyark.com\nzyautoe.com\nzybang.com\nzybaoan.com\nzybest.com\nzybtp.com\nzybuluo.com\nzybwhsb.com\nzybwj.cc\nzybz518.com\nzyc123.com\nzyccst.com\nzycits.com\nzycitscn.com\nzycjcrz.org\nzycmmt.com\nzyctd.com\nzycultura.com\nzyczg.com\nzydanxia.com\nzydlks.com\nzydsy.com\nzydtrip.net\nzydza.com\nzydzkjcloud.com\nzye.cc\nzyea.com\nzyecp.com\nzyedu.org\nzyfb.com\nzyfbjzsc.com\nzyfchina.com\nzyfj.com\nzyfsz.net\nzygames.com\nzygj.net\nzygjtzjt.com\nzygs.com\nzygx8.com\nzygxxs.com\nzygxy.online\nzyh365.com\nzyhao.com\nzyhbjt.com\nzyhbxs.com\nzyhh.cc\nzyhobby.com\nzyholding.com\nzyhot.com\nzyict.net\nzyiis.net\nzying.net\nzyip.com\nzyiwater.com\nzyixi.xyz\nzyixinx.com\nzyjhzyy.com\nzyjiajiao.com\nzyjjt.com\nzyjkwh.com\nzyjoygame.com\nzyjtgas.com\nzyjthb.com\nzyjymall.com\nzyjyxx.com\nzyjyyun.com\nzyka.cc\nzykj0668.com\nzykjct.com\nzykjgame.com\nzykjnet.com\nzykpic.com\nzyks-lv.com\nzykths.com\nzyku.net\nzyl.me\nzylianto.com\nzylseo.com\nzymc1.com\nzymkcdn.com\nzymkshop.com\nzymreal.com\nzyms8.me\nzyoffice.com\nzyoo.net\nzyoogame.com\nzyops.com\nzyou100.com\nzyouexpress.com\nzyoulun.com\nzyoung.me\nzypharm.com\nzyplayer.com\nzyq.today\nzyq366.com\nzyqcs.com\nzyqjg.com\nzyqjs.com\nzyqxt.com\nzyqzyyy.com\nzyrack-china.com\nzyrb.com\nzyrc168.com\nzyrj.org\nzyrm.com\nzyrykbiandao.com\nzys6d.com\nzysd.work\nzyskys.com\nzysljhslt.com\nzysou.com\nzystarlink.com\nzyswsb.com\nzysxqgs.com\nzysyjqrmyy.com\nzyszyx.com\nzyt8.com\nzytang.net\nzytm913.com\nzyucan.com\nzyue.com\nzyun.vip\nzyvqb.com\nzywjw.com\nzywsw.com\nzywtc.com\nzywvvd.com\nzywxgames.com\nzywxpress.com\nzyxhmm.com\nzyxintuo.com\nzyxmmovie.com\nzyxr.com\nzyxxlyg.com\nzyxyfy.com\nzyxzyyy.com\nzyydb.com\nzyydjk.net\nzyyfy.com\nzyyimin.com\nzyykj168.com\nzyylee.com\nzyz119.com\nzyzhan.com\nzyzl120.com\nzyzw.com\nzz-hh.com\nzz-invest.com\nzz.ci\nzz123456789.xyz\nzz2024.com\nzz2z.com\nzz314.com\nzz34.com\nzz597.com\nzz618.com\nzz6789.com\nzz8j.com\nzz91.com\nzz96269.com\nzz9ivb.com\nzzad.com\nzzairport.com\nzzay.net\nzzbaike.com\nzzbbs.com\nzzbd.org\nzzboiler.com\nzzboyou.com\nzzbs.org\nzzbtool.com\nzzbtv.com\nzzc9.com\nzzccom.com\nzzccp.com\nzzcdnx.com\nzzcjby.com\nzzcjxy.com\nzzcm1.com\nzzcm2.com\nzzcm5.com\nzzcmjn.com\nzzcomm.com\nzzcrcgas.com\nzzd.pub\nzzdengji.com\nzzdh.net\nzzdjw.com\nzzdkdz.com\nzzdl.com\nzzdnews.com\nzzdsj.com\nzzdtec.com\nzzect.com\nzzepa.org\nzzfcw.com\nzzfeilu.com\nzzfh.com\nzzfly.net\nzzfreshair.com\nzzfriend.com\nzzfxfz.com\nzzgcjyzx.com\nzzgdapp.com\nzzgeli.net\nzzgjj.com\nzzgkyy.com\nzzgtjtgs.com\nzzguest.com\nzzguifan.com\nzzhaofang.com\nzzhaoz.com\nzzhbgs.com\nzzhfkm.com\nzzhszj.com\nzzhuanruan.com\nzzhybz.com\nzzicpa.com\nzzidc.com\nzzjdgcxx.com\nzzjianyun.com\nzzjidi.com\nzzjldsx.com\nzzjob88.com\nzzjsled.com\nzzjunzhi.com\nzzjxbg.com\nzzjyi.com\nzzk001.com\nzzkcjq.com\nzzkehui.com\nzzkjgy.com\nzzkk.cc\nzzksjx.com\nzzlcjj.xyz\nzzlgxy.net\nzzliot.com\nzzlirui.com\nzzllq.com\nzzlongyou.com\nzzlt.net\nzzltsw.com\nzzluohang.com\nzzlvjuren.com\nzzlvwang.com\nzzmama.net\nzzmetro.com\nzzmingtai.com\nzzmlb.com\nzzms.com\nzzmxbc.com\nzzmy.net\nzzmyt.com\nzznah001.com\nzznst.com\nzznyy.com\nzzprotect.com\nzzptech.com\nzzpzh.com\nzzqckj.com\nzzqfte.com\nzzqiyou.com\nzzqklm.com\nzzqqhb.com\nzzqrr.com\nzzqss.com\nzzquan9.com\nzzqudu.com\nzzqxs.com\nzzqz2024.com\nzzqzz.com\nzzrc.net\nzzrcw.net\nzzrmyy.com\nzzrseng.com\nzzs5.com\nzzs5.info\nzzsdyrmyy.com\nzzsey.com\nzzsf.com\nzzsggzy.com\nzzsgjj.com\nzzshe.com\nzzsi.com\nzzsiji.com\nzzsin.com\nzzsjzyxh.com\nzzslyy.com\nzzsmt.com\nzzsnewell.com\nzzspider.com\nzzsspnode.com\nzzssptop.com\nzzsteel.com\nzzstep.com\nzzszbsw.com\nzzszxyy.com\nzzt9.com\nzztaoning.com\nzzteacher.com\nzztender.com\nzztfly.com\nzzthjixie.com\nzztline.com\nzztlj.com\nzztuku.com\nzztv.tv\nzztvzd.com\nzztxkj.com\nzztyscl.com\nzzun777.com\nzzusah.com\nzzw-hb.com\nzzwah.com\nzzwanshou.com\nzzwenxue.com\nzzwgd.com\nzzwl.info\nzzwljc.com\nzzwonder.com\nzzwqqx.com\nzzwro.com\nzzwtjx.com\nzzwwiidd.com\nzzwzj.com\nzzxbn.com\nzzxca.com\nzzxcy.com\nzzxdc.com\nzzxfjxzz.com\nzzxhns.com\nzzxic.com\nzzxmys.com\nzzxw.net\nzzxworld.com\nzzxx.org\nzzxy.net\nzzy2001.com\nzzyauto.com\nzzycpa.com\nzzyecc.com\nzzyedu.org\nzzyfjc.com\nzzygxh.com\nzzyiquan.com\nzzyjs.com\nzzykcd.com\nzzyuam.com\nzzyugang.com\nzzyxxw.com\nzzyyds.com\nzzyyrl.com\nzzz4.com\nzzzdc.com\nzzzdm.com\nzzzfgjj.com\nzzzglby.com\nzzzhtc.com\nzzzj.com\nzzzla.com\nzzzlsh.com\nzzznkq.com\nzzzppp.com\nzzzqqp.com\nzzzsxx.com\nzzzxwh.net\nzzzyb.com\nzzzymjg.com\nzzzyy.com\nzzzyyy.com\nzzzzaaaa.com\nzzzzzz.me\n265.com\n2mdn-cn.net\n2mdn.net\na1.mzstatic.com\na2.mzstatic.com\na3.mzstatic.com\na4.mzstatic.com\na5.mzstatic.com\nactivate.activation-v2.kaspersky.com\nactivation-v2.geo.kaspersky.com\nactivation-v2.kaspersky.com\nadcdownload.apple.com\nadcdownload.apple.com.akadns.net\nadmob-cn.com\nadservice.google.com\nafcs.dell.com\nai.zhaomi.cn\nalibaba.cdn.steampipe.steamcontent.com\namp-api-edge-lb-cn.itunes-apple.com.akadns.net\namp-api-edge-lb.itunes-apple.com.akadns.net\namp-api-edge.apps.apple.com\namp-api-edge.music.apple.com\namp-api-search-edge.apps.apple.com\namp-api-updates.apps.apple.com\namp-api.apps.apple.com\namp-api.media.apple.com\namp-api.music.apple.com\naod-ssl.itunes.apple.com\naod.itunes.apple.com\napi-edge.apps.apple.com\napp-analytics-services.com\napp-measurement-cn.com\napp-measurement.com\napp-site-association.cdn-apple.com\nappldnld.apple.com\nappldnld.g.aaplimg.com\nappleid.cdn-apple.com\napps.mzstatic.com\napps5.oingo.com\napptrailers.itunes.apple.com\nauth.music.apple.com\navail.googleflights.net\nb.c2r.ts.cdn.office.net\nbag-cdn.itunes-apple.com.akadns.net\nbag.itunes.apple.com\nbeacons.gcp.gvt2.com\nbeacons.gvt2.com\nbeacons2.gvt2.com\nbeacons3.gvt2.com\nbg.v4.a.dl.ws.microsoft.com\nbg4.v4.a.dl.ws.microsoft.com\nbj1.api.bing.com\nbookkeeper.itunes.apple.com\nbuild.microsoft.com\nc.admob.com\nc.android.clients.google.com\nc.pki.goog\ncache-management-prod.google.com\ncache.pack.google.com\ncdn-cn.apple-mapkit.com\ncdn-cn1.apple-mapkit.com\ncdn-cn2.apple-mapkit.com\ncdn-cn3.apple-mapkit.com\ncdn-cn4.apple-mapkit.com\ncdn.ampproject.org\ncdn.apple-mapkit.com\ncdn.globalsigncdn.com.cdn.cloudflare.net\ncdn.marketplaceimages.windowsphone.com\ncdn1.apple-mapkit.com\ncdn2.apple-mapkit.com\ncdn3.apple-mapkit.com\ncdn4.apple-mapkit.com\ncds-cdn.v.aaplimg.com\ncds.apple.com\ncds.apple.com.akadns.net\ncdsassets.apple.com\ncerts-lb.apple.com.akadns.net\ncerts.apple.com\ncheckin.gstatic.com\ncl1-cdn.origin-apple.com.akadns.net\ncl1.apple.com\ncl2-cdn.origin-apple.com.akadns.net\ncl2-cn.apple.com\ncl2.apple.com\ncl3-cdn.origin-apple.com.akadns.net\ncl3.apple.com\ncl4-cdn.origin-apple.com.akadns.net\ncl4-cn.apple.com\ncl4.apple.com\ncl5-cdn.origin-apple.com.akadns.net\ncl5.apple.com\nclickserve.cc-dt.com\nclickserve.dartsearch.net\nclickserver.googleads.com\nclient-api.itunes.apple.com\nclientflow.apple.com\nclientflow.apple.com.akadns.net\nclientperipherals.dell.com\nclientservices.googleapis.com\ncma.itunes.apple.com\ncn-smp-paymentservices.apple.com\ncn.download.nvidia.com\ncn.widevine.com\ncn.windowssearch.com\ncnappinstall.googleadapis.com\ncommunities.apple.com\nconfiguration.apple.com\nconfiguration.apple.com.akadns.net\nconnectivitycheck.gstatic.com\ncontent.googleadapis.com\ncrashlyticsreports-pa.googleapis.com\ncrl-lb.apple.com.akadns.net\ncrl.apple.com\ncrl.globalsign.net\ncrl.kaspersky.com\ncrl.pki.goog\ncrls.pki.goog\ncsi.gstatic.com\ncstat.apple.com\ncstat.cdn-apple.com\nctdsb.clouddiffuse.xyz\nctldl.windowsupdate.com\ncueme-api.quark.cn\ncustomization-cdn.dell.com\ndartsearch-cn.net\ndc1-cert.ksn.kaspersky-labs.com\ndc1-file.ksn.kaspersky-labs.com\ndc1-pp.ksn.kaspersky-labs.com\ndc1-st.ksn.kaspersky-labs.com\ndc1.ksn.kaspersky-labs.com\ndd-cdn.origin-apple.com.akadns.net\ndds.dell.com\ndejavu.apple.com\ndevblogs.microsoft.com\ndeveloper.microsoft.com\ndevimages-cdn.apple.com\ndevstreaming-cdn.apple.com\ndg-meta.video.google.com\ndiscussionschinese.apple.com\ndl.dell.com\ndl.google.com\ndl.l.google.com\ndnl-00.geo.kaspersky.com\ndnl-01.geo.kaspersky.com\ndnl-02.geo.kaspersky.com\ndnl-03.geo.kaspersky.com\ndnl-04.geo.kaspersky.com\ndnl-05.geo.kaspersky.com\ndnl-06.geo.kaspersky.com\ndnl-07.geo.kaspersky.com\ndnl-08.geo.kaspersky.com\ndnl-09.geo.kaspersky.com\ndnl-10.geo.kaspersky.com\ndnl-11.geo.kaspersky.com\ndnl-12.geo.kaspersky.com\ndnl-13.geo.kaspersky.com\ndnl-14.geo.kaspersky.com\ndnl-15.geo.kaspersky.com\ndnl-16.geo.kaspersky.com\ndnl-17.geo.kaspersky.com\ndnl-18.geo.kaspersky.com\ndnl-19.geo.kaspersky.com\ndocs.microsoft.com\ndoubleclick-cn.net\ndoubleclick.net\ndownload.developer.apple.com\ndownload.microsoft.com\ndownload.mlcc.google.com\ndownload.qatp1.net\ndownload.tensorflow.google.com\ndownload.visualstudio.microsoft.com\ndownloaddispatch.itunes.apple.com\nea2cn-dev-outlet.dell.com\nea2cn-prod-outlet.dell.com\nea2cn-staging-outlet.dell.com\nedge.geo.kaspersky.com\nemmapplecodevice.googleapis.com\nemoi-cncdn.bing.com\nexperiments.apple.com\nf.c2r.ts.cdn.office.net\nfcs.dell.com\nfides-pol.apple.com\nfirebase-settings.crashlytics.com\nfontfiles.googleapis.com\nfonts.googleapis.com\nfonts.gstatic.com\nfs.microsoft.com\nfta.dell.com\nftaapj.dell.com\nftaemea.dell.com\nftasitapj.dell.com\ng0.gstatic.com\ng1.gstatic.com\ng2.gstatic.com\ng3.gstatic.com\ngbxgateway-dev.dell.com\ngbxgateway.dell.com\ngeetest.datasink.sensorsdata.cn\ngo.corp.google.com\ngog-cdn-fastly.gog.com\ngog-cdn.akamaized.net\ngog.qtlglb.com\ngogalaxy.gog-statics.com\ngonglchuangl.net\ngongyichuangyi.net\ngoogle-analytics-cn.com\ngoogle-analytics.com\ngoogleadservices-cn.com\ngoogleadservices.com\ngoogleanalytics.com\ngoogleapis-cn.com\ngoogleapps-cn.com\ngoogleflights-cn.net\ngoogleoptimize-cn.com\ngoogleoptimize.com\ngooglesyndication-cn.com\ngooglesyndication.com\ngoogletagmanager-cn.com\ngoogletagmanager.com\ngoogletagservices-cn.com\ngoogletagservices.com\ngoogletraveladservices-cn.com\ngoogletraveladservices.com\ngooglevads-cn.com\ngs-loc-cn.apple.com\ngs-loc.apple.com\ngsp10-ssl-cn.ls.apple.com\ngsp12-cn.ls.apple.com\ngsp13-cn.ls.apple.com\ngsp4-cn.ls.apple.com\ngsp4-cn.ls.apple.com.edgekey.net.globalredir.akadns.net\ngsp5-cn.ls.apple.com\ngsp85-cn-ssl.ls.apple.com\ngspe11-2-cn-ssl.ls.apple.com\ngspe12-cn-ssl.ls.apple.com\ngspe19-2-cn-ssl.ls-apple.com.akadns.net\ngspe19-2-cn-ssl.ls.apple.com\ngspe19-cn-ssl.ls.apple.com\ngspe19-cn.ls-apple.com.akadns.net\ngspe19-cn.ls.apple.com\ngspe21-ssl.ls.apple.com\ngspe35-ssl.ls.apple.com\ngspe79-cn-ssl.ls.apple.com\ngspe85-cn-ssl.ls.apple.com\ngstatic-cn.com\ngstaticadssl.l.google.com\ngtm.oasisfeng.com\nguzzoni-apple-com.v.aaplimg.com\nguzzoni.apple.com\nguzzoni.smoot.apple.com\nhellofontpreview.oss-cn-beijing.aliyuncs.com\nhellowebfonts.oss-cn-beijing.aliyuncs.com\nhospital.pku.edu.cn\ni.dell.com\ni.pki.goog\nicloud-cdn.icloud.com.akadns.net\nicloud.cdn-apple.com\nimages-cn-8.ssl-images-amazon.com\nimages-cn.ssl-images-amazon.com\nimages.apple.com.edgekey.net.globalredir.akadns.net\nimasdk.googleapis.com\ninappcheck-cn.itunes-apple.com.akadns.net\ninappcheck-lb.itunes-apple.com.akadns.net\ninappcheck.itunes.apple.com\ninit-kt.apple.com\ninit-p01md-lb.push-apple.com.akadns.net\ninit-p01md.apple.com\ninit-p01st-lb.push-apple.com.akadns.net\ninit-p01st.push.apple.com\ninit-s01st-lb.push-apple.com.akadns.net\ninit-s01st.push.apple.com\ninit.ess.apple.com\ninit.gc-lb.apple.com.akadns.net\ninit.gc.apple.com\ninit.itunes.apple.com\niosapps.itunes.apple.com\niosapps.itunes.g.aaplimg.com\nipcdn.apple.com\niphone-ld.apple.com\niphone-ld.origin-apple.com.akadns.net\nis-ssl.mzstatic.com-cn-lb.itunes-apple.com.akadns.net\nis1-ssl.mzstatic.com\nis1.mzstatic.com\nis2-ssl.mzstatic.com\nis2.mzstatic.com\nis3-ssl.mzstatic.com\nis3.mzstatic.com\nis4-ssl.mzstatic.com\nis4.mzstatic.com\nis5-ssl.mzstatic.com\nis5.mzstatic.com\nitunes-apple.com.akadns.net\nitunes.apple.com\nitunesconnect.apple.com\nizattime.qcomgeo2.com\njs-cdn.music.apple.com\nkm.support.apple.com\nksn-cinfo-geo.kaspersky-labs.com\nksn-cinfo.geoksn.kaspersky.com\nksn-crypto-info-geo.kaspersky-labs.com\nksn-crypto-kas-geo.kaspersky-labs.com\nksn-crypto-tcert-geo.kaspersky-labs.com\nksn-crypto-url-geo.kaspersky-labs.com\nksn-crypto-verdict-geo.kaspersky-labs.com\nksn-crypto-wifiplus-geo.kaspersky-labs.com\nksn-crypto-wifiplus.geoksn.kaspersky.com\nksn-dc1-cert.geoksn.kaspersky.com\nksn-dc1-file.geoksn.kaspersky.com\nksn-dc1.geoksn.kaspersky.com\nksn-file-geo.kaspersky-labs.com\nksn-file.geoksn.kaspersky.com\nksn-info-geo.kaspersky-labs.com\nksn-info.geoksn.kaspersky.com\nksn-kas.geoksn.kaspersky.com\nksn-mdr.geoksn.kaspersky.com\nksn-tcert-geo.kaspersky-labs.com\nksn-tcert.geoksn.kaspersky.com\nksn-url-geo.kaspersky-labs.com\nksn-url.geoksn.kaspersky.com\nksn-verdict-geo.kaspersky-labs.com\nksn-verdict.geoksn.kaspersky.com\nl2-uberproxy.corp.google.com\nlearn.microsoft.com\nlogger-dev.corp.google.com\nlogger.corp.google.com\nlogin.corp.google.com\nlv.queniujq.cn\nmaps.apple.com\nmdr.ksn.kaspersky-labs.com\nmenu-static.gog-statics.com\nmesu-cdn.apple.com.akadns.net\nmesu-china.apple.com.akadns.net\nmesu.apple.com\nmisc-assets.itunes.apple.com\nml.cdn-apple.com\nmonitoring.qpdp1.net\nmoocs.unipus.cn\nmusic.apple.com\nmusicstatus.music.apple.com\nmvod.itunes.apple.com\nmyapp.itunes.apple.com\nmyvs.download.prss.microsoft.com\nnexus.dell.com\nnp-edge.itunes.apple.com\nntp.aliyun.com\nntp.tencent.com\nntp1.aliyun.com\nntp1.tencent.com\nntp2.aliyun.com\nntp2.tencent.com\nntp3.aliyun.com\nntp3.tencent.com\nntp4.aliyun.com\nntp4.tencent.com\nntp5.aliyun.com\nntp5.tencent.com\nntp6.aliyun.com\nntp7.aliyun.com\no.pki.goog\nocsp-lb.apple.com.akadns.net\nocsp.apple.com\nocsp.pki.goog\nocsp2-lb.apple.com.akadns.net\nocsp2.apple.com\noemsoc.download.prss.microsoft.com\nofficecdn.microsoft.com\nopencourse.pku.edu.cn\noscdn.apple.com\noscdn.origin-apple.com.akadns.net\nosxapps.itunes.apple.com\nosxapps.itunes.g.aaplimg.com\np.cdn.persaas.dell.com\np00.upd.kaspersky.com\np01.upd.kaspersky.com\np02.upd.kaspersky.com\np03.upd.kaspersky.com\np04.upd.kaspersky.com\np05.upd.kaspersky.com\np06.upd.kaspersky.com\np07.upd.kaspersky.com\np08.upd.kaspersky.com\np09.upd.kaspersky.com\np1-juejin.byteimg.com\np10.upd.kaspersky.com\np11.upd.kaspersky.com\np12.upd.kaspersky.com\np13.upd.kaspersky.com\np14.upd.kaspersky.com\np15.upd.kaspersky.com\np16.upd.kaspersky.com\np17.upd.kaspersky.com\np18.upd.kaspersky.com\np19.upd.kaspersky.com\np2-juejin.byteimg.com\np3-juejin.byteimg.com\np3-novel.byteimg.com\np4-juejin.byteimg.com\np5-juejin.byteimg.com\np6-juejin.byteimg.com\np6-novel.byteimg.com\np7-juejin.byteimg.com\np8-juejin.byteimg.com\np9-juejin.byteimg.com\npagead-googlehosted.l.google.com\npancake.apple.com\npancake.cdn-apple.com.akadns.net\npba0.apple.com\npd-nk.itunes.apple.com\npd.itunes.apple.com\nperformanceparameters.googleapis.com\npki-goog.l.google.com\nplay.itunes.apple.com\nplay.music.apple.com\nprobe.siri.apple.com\nprod-controlbe.floonet.goog\nprod-databe.floonet.goog\nprod-support.apple-support.akadns.net\nprod.databe.floonet.goog\nproductcard.gog-statics.com\nproxyconfig.corp.google.com\npublicassets.cdn-apple.com\nqagpublic.qatp1.net\nqgadmin.qcpp1.net\nqiao-cn.com\nqpx.googleflights.net\nqualysapi.qatp1.net\nqualysguard.qpdp1.net\nr.cert.corp.google.com\nrapture-prod.corp.google.com\nrecaptcha-cn.net\nrecaptcha.net\nredirector.bdn.dev\nredirector.c.chat.google.com\nredirector.c.mail.google.com\nredirector.c.pack.google.com\nredirector.c.play.google.com\nredirector.c.youtubeeducation.com\nredirector.gcpcdn.gvt1.com\nredirector.gvt1.com\nredirector.offline-maps.gvt1.com\nredirector.snap.gvt1.com\nredirector.xn--ngstr-lra8j.com\nrefresh-bkg.activation-v2.kaspersky.com\nres-1.cdn.office.net\nres.cdn.office.net\nreserve-prime.apple.com\ns.mzstatic.com\ns00.upd.kaspersky.com\ns01.upd.kaspersky.com\ns02.upd.kaspersky.com\ns03.upd.kaspersky.com\ns04.upd.kaspersky.com\ns05.upd.kaspersky.com\ns06.upd.kaspersky.com\ns07.upd.kaspersky.com\ns08.upd.kaspersky.com\ns09.upd.kaspersky.com\ns1.mzstatic.com\ns10.upd.kaspersky.com\ns11.upd.kaspersky.com\ns12.upd.kaspersky.com\ns13.upd.kaspersky.com\ns14.upd.kaspersky.com\ns15.upd.kaspersky.com\ns16.upd.kaspersky.com\ns17.upd.kaspersky.com\ns18.upd.kaspersky.com\ns19.upd.kaspersky.com\ns2.mzstatic.com\ns3.mzstatic.com\ns4.mzstatic.com\ns5.mzstatic.com\nsafebrowsing-cache.google.com\nsafebrowsing.googleapis.com\nscanservice1.qcpp1.net\nscene7-cdn.dell.com\nsdx.microsoft.com\nse-edge.itunes.apple.com\nse2.itunes.apple.com\nsearch.itunes.apple.com\nseed-sequoia.siri.apple.com\nseed-swallow.siri.apple.com\nseed.siri.apple.com\nsequoia.apple.com\nservice.urchin.com\nsf-api-token-service.itunes.apple.com\nsh-pod2-smp-device.apple.com\nshazam-insights.cdn-apple.com\nshell.cdn.office.net\nsi.cdn.dell.com\nsm.dell.com\nsmp-device-content.apple.com\nsnp.cdn.dell.com\nsnpi.dell.com\nsoftware.download.prss.microsoft.com\nsp.itunes.apple.com\nspeedysub.music.apple.com\nss.bjmu.edu.cn\nssl-google-analytics.l.google.com\nssl.gstatic.com\nsslredirect.corp.google.com\nstaging-controlbe.floonet.goog\nstaging-databe.floonet.goog\nstaging.databe.floonet.goog\nstatic-login.gog-statics.com\nstatic.gc.apple.com\nstatics.teams.cdn.office.net\nstocks-sparkline-lb.apple.com.akadns.net\nstocks-sparkline.apple.com\nstore.apple.com\nstore.apple.com.edgekey.net\nstore.apple.com.edgekey.net.globalredir.akadns.net\nstore.storeimages.apple.com.akadns.net\nstore.storeimages.cdn-apple.com\nstoreedgefd.dsx.mp.microsoft.com\nstreaming-uberproxy-rotation.corp.google.com\nstreaming-uberproxy.corp.google.com\nstreamingaudio.itunes.apple.com\nstudy.163.com\nsu.itunes.apple.com\nsup-ssh-relay.corp.google.com\nsup-ssh-relay2.corp.google.com\nsup.corp.google.com\nsup.l.google.com\nsupport-china.apple-support.akadns.net\nsupport.apple.com\nsupportassist.dell.com\nsurface.downloads.prss.microsoft.com\nswallow-apple-com.v.aaplimg.com\nswallow.apple.com\nswcatalog-cdn.apple.com.akadns.net\nswcatalog.apple.com\nswcdn.apple.com\nswcdn.g.aaplimg.com\nswdist.apple.com\nswdist.apple.com.akadns.net\nswscan-cdn.apple.com.akadns.net\nswscan.apple.com\nsylvan.apple.com\nsync.itunes.apple.com\ntac.googleapis.com\ntesla-cdn.thron.cn\ntest.gbugs-qa.chromium.org\ntf-feedback.itunes.apple.com\ntime.amazonaws.cn\ntime.izatcloud.net\ntime.xtracloud.net\ntj-pod1-smp-device.apple.com\ntools.google.com\ntools.l.google.com\ntp.louisvuitton.com\nuberproxy-debug4.corp.google.com\nuberproxy.corp.google.com\nuberproxy6.corp.google.com\nupdate.crashlytics.com\nupdate.googleapis.com\nupdates-http.cdn-apple.com\nupdates-http.cdn-apple.com.akadns.net\nupdates.cdn-apple.com\nuplaypc-s-ubisoft.cdn.ubi.com\nupp.itunes.apple.com\nvalid.apple.com\nvalid.origin-apple.com.akadns.net\nvscode.download.prss.microsoft.com\nvz.download.prss.microsoft.com\nwear.googleapis.com\nweather-data.apple.com\nweather-data.apple.com.akadns.net\nweather-map.apple.com\nweather-map2.apple.com\nweatherkit.apple.com\nwscont1.apps.microsoft.com\nwscont2.apps.microsoft.com\nwww-csb.dell.com\nwww-google-analytics.l.google.com\nwww-googletagmanager.l.google.com\nwww.amd.com\nwww.apple.com\nwww.apple.com.edgekey.net.globalredir.akadns.net\nwww.dell.com\nwww.destinationurl.com\nwww.entrust.cn\nwww.gstatic.com\nwww.microsoft.com\nwww.pxcc.com\nwww.recaptcha.net\nwww.support.apple.com\nwww4-static.gog-statics.com\nxn--flw351e.com\nxp.apple.com\nxtratime.qcomgeo2.com\nxz.pphimalayanrt.com\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/resources/china_list.ver",
    "content": "202604232238\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/resources/gfw_list.txt",
    "content": "000webhost.com\n0rz.tw\n1-apple.com.tw\n1000giri.net\n10beasts.net\n10musume.com\n12bet.com\n12vpn.com\n12vpn.net\n1337x.to\n141jj.com\n1688.com.au\n173ng.com\n18board.com\n18comic.org\n1984bbs.com\n1991way.com\n1e100.net\n1lib.sk\n1point3acres.com\n1pondo.tv\n2008xianzhang.info\n2021hkcharter.com\n2047.name\n2047.one\n2049bbs.xyz\n233abc.com\n24hrs.ca\n32red.com\n36rain.com\n404museum.com\n466453.com\n4bluestones.biz\n4everproxy.com\n4rbtv.com\n4shared.com\n4sqi.net\n500px.com\n500px.org\n51.ca\n51jav.org\n51luoben.com\n5278.cc\n611study.com\n611study.icu\n63i.com\n666pool.cn\n69shuba.cx\n6do.news\n6do.world\n6park.com\n6parkbbs.com\n6parker.com\n6parknews.com\n7capture.com\n8-d.com\n85cc.us\n881903.com\n89-64.org\n8964museum.com\n8z1.net\n91dasai.com\n91porn.com\n91porny.com\n91vps.club\n991.com\n996.icu\n99btgc01.com\n99cn.info\n9bis.com\n9bis.net\n9cache.com\n9gag.com\n9news.com.au\na-normal-day.com\na248.e.akamai.net\naamacau.com\naave.com\nabc.net.au\nabc.xyz\nabebooks.co.uk\nabebooks.com\nabematv.akamaized.net\naboluowang.com\nabout.gitlab.com\nabout.me\nabplive.com\nacast.com\naccountkit.com\nacevpn.com\nacg.rip\nacg18.me\nacgbox.org\nacgkj.com\nacgnx.se\nactivpn.com\naculo.us\nadcex.com\naddictedtocoffee.de\naddons.mozilla.org\naddyoutube.com\nadguard-vpn.com\nadmin.recaptcha.net\nadmob.com\nadpl.org.hk\nads-twitter.com\nadsense.com\nadult-sex-games.com\nadult.friendfinder.com\nadvanscene.com\nadvertfan.com\nadvertisercommunity.com\naei.org\naenhancers.com\naex.com\naf.mil\nafantibbs.com\nafr.com\nafreecatv.com\nagnesb.fr\nagoogleaday.com\nagro.hk\nai.dev\nai.studio\naiosearch.com\naiph.net\nairconsole.com\nairitilibrary.com\nairvpn.org\nait.org.tw\naiweiweiblog.com\nakademiye.org\nakamai.tvb.com\nakamaihd.net\nakiba-online.com\nakiba-web.com\nakile.io\nakinator.com\nakow.org\nalabout.com\nalanhou.com\nalasbarricadas.org\nalforattv.net\nalive.bar\naljazeera.com\naljazeera.net\nalkasir.com\nall4mom.org\nallcoin.com\nallconnected.co\nalldrawnsex.com\nallfinegirls.com\nallinfa.com\nallmovie.com\nalternate-tools.com\naltrec.com\nalwaysdata.com\nalwaysdata.net\nalwaysvpn.com\nam730.com.hk\namazon.co.jp\namazonvideo.com\nameblo.jp\namericangreencard.com\namericorps.gov\namiblockedornot.com\namitabhafoundation.us\namnesty.org\namnesty.org.hk\namnestyusa.org\nampproject.org\namuletmc.com\nanchor.fm\nanchorfree.com\nancsconf.org\nandfaraway.net\nandroid-x86.org\nandroid.com\nandroidapksfree.com\nandroidify.com\nandroidtv.com\nandygod.com\nangela-merkel.de\nangola.org\nangularjs.org\naniscartujo.com\nannas-archive.gd\nannas-archive.gl\nannas-archive.pk\nanobii.com\nanonfiles.com\nanonymouse.org\nanthonycalzadilla.com\nanthropic.com\nantiwave.net\nantpool.com\nanuneko.com\nanysex.com\nao3.org\naobo.com.au\naofriend.com\naomedia.org\naomiwang.com\naoxvpn.com\napartmentratings.com\napartments.com\napat1989.org\napi-secure.recaptcha.net\napi-verify.recaptcha.net\napi.ai\napi.palworldgame.com\napi.pureapk.com\napi.recaptcha.net\napi.steampowered.com\napiary.io\napigee.com\napk.support\napkcombo.com\napkmirror.com\napkmonk.com\napkplz.com\napkpure.com\napkpure.net\napp.box.com\napp.cloudcone.com\napp.element.io\napp.smartmailcloud.com\nappadvice.com\nappbrain.com\nappledaily.com\nappledaily.com.tw\napps.evozi.com\nappshopper.com\nappsocks.net\nappspot.com\nappsto.re\naptoide.com\narchive-it.org\narchive.fo\narchive.is\narchive.li\narchive.md\narchive.org\narchive.ph\narchive.today\narchive.vn\narchiveofourown.com\narchiveofourown.org\narchives.gov\narctosia.com\nareca-backup.org\narena.ai\narena.taipei\narethusa.su\narlingtoncemetery.mil\narte.tv\nartstation.com\narvanstorage.ir\narweave.org\nasacp.org\nasiaharvest.org\nasianage.com\nasianews.it\nasianfanfics.com\nasiansexdiary.com\nasiaone.com\nasiasociety.org\nask.com\naskstudent.com\naskynz.net\naspi.org.au\naspistrategist.org.au\nassembla.com\nassets.bwbx.io\nassets.nxtrace.org\nassimp.org\nastrill.com\natc.org.au\natchinese.com\nathenaeizou.com\natlanta168.com\natnext.com\nauctions.yahoo.co.jp\naudacy.com\nauntology.fandom.com\nautodraw.com\nav.movie\nav01.tv\navaaz.org\navdb.in\navdb.tv\navg.com\navgle.com\navidemux.org\navistaz.to\navmo.pw\navmoo.pw\navoision.com\naxios.com\naxureformac.com\nazirevpn.com\nazurewebsites.net\nb-ok.cc\nb.hatena.ne.jp\nbabylonbee.com\nbackchina.com\nbackend-v2.crixet.com\nbad.news\nbadiucao.com\nbahamut.com.tw\nbaidu.jp\nbaijie.org\nbailandaily.com\nbaixing.me\nbaizhi.org\nbanana-vpn.com\nband.us\nbandcamp.com\nbandwagonhost.com\nbangchen.net\nbangdream.space\nbangkokpost.com\nbangumi.moe\nbangyoulater.com\nbankmobilevibe.com\nbannedbook.org\nbanorte.com\nbaramangaonline.com\nbarnabu.co.uk\nbartender.dowjones.com\nbarton.de\nbastillepost.com\nbayvoice.net\nbb-chat.tv\nbbc.co.uk\nbbc.com\nbbc.pdn.tritondigital.com\nbbcchinese.com\nbbchat.tv\nbbci.co.uk\nbbs.cantonese.asia\nbbs.hanminzu.org\nbbs.junglobal.net\nbbs.mikocon.com\nbbs.mychat.to\nbbs.naixi.net\nbbs.nyinfor.com\nbcex.ca\nbearteach.com\nbebo.com\nbeeg.com\nbeepool.com\nbeepool.org\nbeevpn.com\nbehance.net\nbeijing1989.com\nbeijing2022.art\nbeijingspring.com\nbell.wiki\nbellingcat.com\nberlinerbericht.de\nberlintwitterwall.com\nbestvpn.com\nbestvpnanalysis.com\nbestvpnforchina.net\nbestvpnserver.com\nbestvpnservice.com\nbestvpnusa.com\nbet365.com\nbetaclouds.net\nbettergpt.chat\nbetterhash.net\nbetternet.co\nbettervpn.com\nbettween.com\nbetvictor.com\nbfnn.org\nbfsh.hk\nbgme.me\nbgvpn.com\nbiblesforamerica.org\nbibox.com\nbiedian.me\nbig.one\nbigjapanesesex.com\nbignews.org\nbigone.com\nbild.de\nbiliworld.com\nbinance.com\nbinance.org\nbinancezh.cc\nbird.so\nbit-z.com\nbit.do\nbit.ly\nbitbaby.com\nbitbay.net\nbitchute.com\nbitcointalk.org\nbitcoinworld.com\nbitfinex.com\nbitget.com\nbithumb.com\nbitmex.com\nbitshare.com\nbitterwinter.org\nbittorrent.com\nbitvise.com\nbitz.ai\nbjzc.org\nbl-doujinsouko.com\nblacked.com\nblackmagicdesign.com\nblackvpn.com\nblinkx.com\nblip.tv\nblockcast.it\nblockcn.com\nblockedbyhk.com\nblockless.com\nblocktempo.com\nblog.cryptographyengineering.com\nblog.de\nblog.excite.co.jp\nblog.expofutures.com\nblog.fizzik.com\nblog.fuckgfw233.org\nblog.jackjia.com\nblog.jp\nblog.martinoei.com\nblog.pathtosharepoint.com\nblog.pentalogic.net\nblog.ranxiang.com\nblog.reimu.net\nblog.soylent.com\nblog.tiney.com\nblogblog.com\nblogcatalog.com\nblogcity.me\nblogger.com\nblogjav.net\nbloglines.com\nbloglovin.com\nblogspot.ae\nblogspot.al\nblogspot.am\nblogspot.ba\nblogspot.be\nblogspot.bg\nblogspot.ca\nblogspot.cat\nblogspot.ch\nblogspot.cl\nblogspot.co.uk\nblogspot.com\nblogspot.com.ar\nblogspot.com.au\nblogspot.com.br\nblogspot.com.by\nblogspot.com.co\nblogspot.com.cy\nblogspot.com.ee\nblogspot.com.eg\nblogspot.com.es\nblogspot.com.mt\nblogspot.com.ng\nblogspot.com.tr\nblogspot.com.uy\nblogspot.cz\nblogspot.de\nblogspot.dk\nblogspot.fi\nblogspot.fr\nblogspot.gr\nblogspot.hk\nblogspot.hr\nblogspot.hu\nblogspot.ie\nblogspot.in\nblogspot.is\nblogspot.it\nblogspot.jp\nblogspot.kr\nblogspot.li\nblogspot.lt\nblogspot.lu\nblogspot.md\nblogspot.mk\nblogspot.mx\nblogspot.my\nblogspot.nl\nblogspot.no\nblogspot.pe\nblogspot.pt\nblogspot.qa\nblogspot.ro\nblogspot.ru\nblogspot.se\nblogspot.sg\nblogspot.si\nblogspot.sk\nblogspot.sn\nblogspot.tw\nblogspot.ug\nblogtd.org\nbloodshed.net\nbloomberg.cn\nbloomberg.com\nbloomberg.de\nbloombergview.com\nbloomfortune.com\nblubrry.com\nbmdru.com\nbnbstatic.com\nbnext.com.tw\nbnn.co\nbnrmetal.com\nboardreader.com\nbod.asia\nbolehvpn.net\nboobstagram.com\nbook.com.tw\nbookdepository.com\nbooks.com.tw\nbooktopia.com.au\nbookwalker.com.tw\nbootstrapcdn.com\nborgenmagazine.com\nbotanwang.com\nbowenpress.com\nboxpn.com\nboxun.com\nboxun.tv\nboysmaster.com\nbr.st\nbraumeister.org\nbrave.com\nbravotube.net\nbrazzers.com\nbreached.to\nbreak.com\nbreakgfw.com\nbreakingtweets.com\nbreakwall.net\nbrill.com\nbrizzly.com\nbroadpressinc.com\nbrookings.edu\nbrutaltgp.com\nbsky.app\nbsky.network\nbsky.social\nbt4g.org\nbt4gprx.com\nbt95.com\nbtbit.net\nbtbtt.co\nbtbtt.me\nbtc.com\nbtc98.com\nbtcbank.bank\nbtctrade.im\nbtdig.com\nbtguard.com\nbtku.me\nbtku.org\nbudaedu.org\nbuffered.com\nbullguard.com\nbullog.org\nbullogger.com\nbumingbai.net\nbunbunhk.com\nbusayari.com\nbusiness-humanrights.org\nbusiness.page\nbusinessinsider.com\nbusinesstoday.com.tw\nbusu.org\nbuzzorange.com\nbuzzsprout.com\nbvpn.com\nbwgyhw.com\nbwh1.net\nbx.in.th\nbybit.com\nbynet.co.il\nbypasscensorship.org\nbyrut.org\nc-est-simple.com\nc-span.org\nc-spanvideo.org\nc.mi.com\nc2cx.com\nc3pool.com\ncableav.tv\ncablegatesearch.net\ncachefly.com\ncachefly.net\ncacnw.com\ncactusvpn.com\ncalebelston.com\ncalendarz.com\ncamfrog.com\ncampaign-archive.com\ncampaignforuyghurs.org\ncams.com\ncanva.com\ncanyu.org\ncaobian.info\ncaochangqing.com\ncaoporn.us\ncap.org.hk\ncarfax.com\ncari.com.my\ncaribbeancom.com\ncarousell.com.hk\ncarrd.co\ncartoonmovement.com\ncasatibet.org.mx\ncasino.williamhill.com\ncasinobellini.com\ncastbox.fm\ncatbox.moe\ncatch22.net\ncatchgod.com\ncatholic.org.hk\ncatholic.org.tw\ncato.org\ncattt.com\ncaus.com\ncbc.ca\ncbs.ntu.edu.tw\ncccat.cc\ncccat.co\nccfd.org.tw\ncchere.com\ncchostvps.xyz\ncclife.org\ncclifefl.org\nccthere.com\nccthere.net\ncdbook.org\ncdef.org\ncdig.info\ncdjp.org\ncdn-images.mailchimp.com\ncdn-telegram.org\ncdn.arstechnica.net\ncdn.jwplayer.com\ncdn.printfriendly.com\ncdn.seatguru.com\ncdn.softlayer.net\ncdn.statically.io\ncdninstagram.com\ncdp1998.org\ncdp2006.org\ncdpeu.org\ncdpuk.co.uk\ncdpweb.org\ncdpwu.org\ncdw.com\ncecc.gov\ncellulo.info\ncenews.eu\ncentauro.com.br\ncenterforhumanreprod.com\ncentralnation.com\ncenturys.net\ncertificate-transparency.org\ncertificate.revocationcheck.com\ncfr.org\ncgdepot.org\nchange.org\nchangp.com\nchannelnewsasia.com\nchanworld.org\nchaoex.com\nchaos.social\ncharacter.ai\nchat.com\nchat.lmsys.org\nchatgpt.com\nchatpdf.com\nchaturbate.com\ncheckgfw.com\nchengmingmag.com\nchenguangcheng.com\nchenpokong.com\nchenpokongvip.com\nchenshan20042005.wordpress.com\ncherrysave.com\nchhongbi.org\nchina-mmm.net\nchina-review.com.ua\nchina-week.com\nchina.ucanews.com\nchina101.com\nchina18.org\nchina21.com\nchina21.org\nchina5000.us\nchinaaffairs.org\nchinaaid.net\nchinaaid.org\nchinaaid.us\nchinachange.org\nchinachannel.hk\nchinademocrats.org\nchinadialogue.net\nchinadigitaltimes.net\nchinaelections.org\nchinafile.com\nchinafreepress.org\nchinagfw.org\nchinahorizon.org\nchinamule.com\nchinanewscenter.com\nchinapress.com.my\nchinasocialdemocraticparty.com\nchinasoul.org\nchinatopsex.com\nchinauncensored.tv\nchinaview.wordpress.com\nchinaworker.info\nchinese-memorial.org\nchinese.engadget.com\nchinesedailynews.com\nchinesedemocracy.com\nchinesegay.org\nchinesen.de\nchinesenews.net.au\nchineseradioseattle.com\nchineseupress.com\nchingcheong.com\nchinman.net\nchobit.cc\nchrdnet.com\nchristianfreedom.org\nchristianstudy.com\nchristiantimes.org.hk\nchrlawyers.hk\nchrome.com\nchromecast.com\nchromeexperiments.com\nchromestatus.com\nci-en.jp\ncia.gov\ncici.com\nciciai.com\ncirosantilli.com\ncitizencn.com\ncitizenlab.ca\ncitizenlab.org\ncity365.ca\ncitypopulation.de\ncivicparty.hk\ncivilhrfront.org\ncivilmedia.tw\ncivitai.com\ncixiaoya.club\nck101.com\nclassicalguitarblog.net\nclaude.ai\nclaude.com\ncldr.unicode.org\nclearsurance.com\nclementine-player.org\nclinica-tibet.ru\nclipconverter.cc\ncloud.dify.ai\ncloud.mail.ru\ncloudflare-dns.com\ncloudflare-ipfs.com\ncloudflarestatus.com\ncloudfunctions.net\nclub1069.com\nclubhouseapi.com\nclyp.it\ncmcn.org\ncmegroup.com\ncmi.org.tw\ncms.gov\ncmule.com\ncmx.im\ncn-proxy.com\ncn.fmnnow.com\ncn.sandscotaicentral.com\ncn.shafaqna.com\ncn.theaustralian.com.au\ncn.uptodown.com\ncna.com.tw\ncnbbnews.wordpress.com\ncnbeta.com.tw\ncnd.org\ncnnews.chosun.com\ncnpolitics.org\nco.ng.mil\ncoat.co.jp\ncobinhood.com\ncochina.org\ncodeshare.io\ncodeskulptor.org\ncofacts.tw\ncoffeemanga.to\ncoinbase.com\ncoinbene.com\ncoinex.com\ncoingecko.com\ncoingi.com\ncoinmarketcap.com\ncoinrail.co.kr\ncointiger.com\ncointobe.com\ncoinut.com\ncolacloud.net\ncollateralmurder.com\ncollateralmurder.org\ncomefromchina.com\ncomments.app\ncommentshk.com\ncommunistcrimes.org\ncommunitychoicecu.com\ncomparitech.com\ncompileheart.com\nconnect.facebook.net\nconoha.jp\ncontests.twilio.com\ncool18.com\ncoolaler.com\ncoolder.com\ncoolloud.org.tw\ncoolstuffinc.com\ncopilot.microsoft.com\ncos-moe.com\ncosplayjav.pl\ncostco.com\ncotweet.com\ncounter.social\ncoursehero.com\ncovenantswatch.org.tw\ncoze.com\ncpj.org\ncpu-monkey.com\ncq99.us\ncrackle.com\ncrashlytics.com\ncrazypool.org\ncrazyshit.com\ncrbug.com\ncrchina.org\ncreaders.net\ncreativelab5.com\ncristyli.com\ncrocotube.com\ncrossfire.co.kr\ncrossvpn.net\ncrosswall.org\ncroxyproxy.com\ncrrev.com\ncrucial.com\ncrunchyroll.com\ncruxpool.com\ncsdparty.com\ncsis.org\ncsmonitor.com\ncss.pixnet.in\ncsuchen.de\ncsw.org.uk\nct.org.tw\nctinets.com\nctinews.com\nctitv.com.tw\nctowc.org\ncts.com.tw\nctwant.com\ncuiweiping.net\nculture.tw\ncumlouder.com\ncurvefish.com\ncusp.hk\ncutout.pro\ncutscenes.net\ncw.com.tw\ncyberghostvpn.com\ncynscribe.com\nd-fukyu.com\nd.cash\nd100.net\nd2bay.com\nd2pass.com\ndabr.co.uk\ndabr.me\ndabr.mobi\ndadazim.com\ndaidostup.ru\ndailymail.co.uk\ndailymotion.com\ndailysabah.com\ndailyview.tw\ndajiyuan.de\ndalailama.mn\ndalailama.ru\ndalailamacenter.org\ndalailamaworld.com\ndalianmeng.org\ndaliulian.org\ndanbooru.donmai.us\ndanke4china.net\ndarmau.co\ndarpa.mil\ndarrenliuwei.com\ndashlane.com\ndata-vocabulary.org\ndaum.net\ndavid-kilgour.com\ndawangidc.com\ndaxa.cn\ndazn.com\ndb.tt\ndbgjd.com\ndcard.tw\ndcs-spotify.megaphone.fm\nddc.com.tw\nddex.io\ndeadhouse.org\ndeadline.com\ndebug.com\ndeck.ly\ndeck.new\ndecodet.co\ndeepai.org\ndeepmind.com\ndeezer.com\ndeja.com\ndelcamp.net\ndemo.unlock-music.dev\ndemosisto.hk\ndepositphotos.com\ndesc.se\ndesipro.de\ndessci.com\ndeutsche-welle.de\ndevelopers.box.net\ndeviantart.com\ndeviantart.net\ndevio.us\ndevpn.com\ndevv.ai\ndiaoyuislands.org\ndigiland.tw\ndigisfera.com\ndiigo.com\ndirectcreative.com\ndiscoins.com\ndisconnect.me\ndiscord.com\ndiscord.gg\ndiscordapp.com\ndiscordapp.net\ndiscuss.com.hk\ndish.com\ndisk.yandex.com\ndisk.yandex.ru\ndisneyplus.com\ndisp.cc\ndisqus.com\ndit-inc.us\ndiyin.org\ndizhuzhishang.com\ndl-laby.jp\ndl.box.net\ndlive.tv\ndlsite.com\ndlyoutube.com\ndm530.net\ndma.mil\ndmc.nico\ndmcdn.net\ndmhy.org\ndmm.co.jp\ndns.cloudflare.com\ndns.sb\ndns2go.com\ndnscrypt.org\ndnssec.net\ndnvod.tv\ndoc.new\ndocker.com\ndocker.io\ndockerstatus.com\ndocs.new\ndocumentingreality.com\ndoh.sb\ndolc.de\ndolf.org.hk\ndongtaiwang.com\ndongtaiwang.net\ndoom9.org\ndoosho.com\ndoourbest.org\ndot.sb\ndotplane.com\ndotsub.com\ndotvpn.com\ndoub.io\ndoubibackup.com\ndoubiyunbackup.com\ndoublethinklab.org\ndouchi.space\ndougscripts.com\ndoujincafe.com\ndownload.dappcdn.com\ndpool.top\ndpp.org.tw\ndpr.info\ndragonex.io\ndragonsprings.org\ndrgan.net\ndropbooks.tv\ndropbox.com\ndropboxapi.com\ndropboxusercontent.com\ndscn.info\ndstk.dk\ndtiblog.com\ndtic.mil\ndubox.com\nduck.com\nduckduckgo.com\nduckmylife.com\nduga.jp\nduihua.org\nduihuahrjournal.org\nduplicati.com\nduyaoss.com\ndvdpac.com\ndvorak.org\ndw-world.com\ndw-world.de\ndw.com\ndw.de\ndweb.link\ndwnews.com\ndwnews.net\ndynawebinc.com\ndynu.com\ndynupdate.no-ip.com\ndysfz.cc\ne-classical.com.tw\ne-gold.com\ne-hentai.org\ne-hentaidb.com\ne-zone.com.hk\ne123.hk\ne621.net\nearlytibet.com\nearthvpn.com\neastasiaforum.org\neastturkistangovernmentinexile.us\nebook.hyread.com.tw\nebtcbank.com\necfa.org.tw\necimg.tw\neconomist.com\nedgecastcdn.net\nedubridge.com\nedx-cdn.org\neesti.ee\neevpn.com\nefksoft.com\nefukt.com\neic-av.com\neireinikotaerukai.com\neksisozluk.com\nelconfidencial.com\nelgoog.im\nelpais.com\nemule-ed2k.com\nemulefans.com\nen.favotter.net\nencrypt.me\nencyclopedia.com\nenewstree.com\nenglishfromengland.co.uk\nentermap.com\nepochhk.com\nepochtimes-bg.com\nepochtimes-romania.com\nepochtimes.co.il\nepochtimes.co.kr\nepochtimes.com\nepochtimes.com.tw\nepochtimes.de\nepochtimes.fr\nepochtimes.it\nepochtimes.jp\nepochtimes.ru\nepochtimes.se\nepochtimestr.com\nepochweek.com\nepochweekly.com\neporner.com\nerights.net\neriversoft.com\nernestmandel.org\nerodaizensyu.com\nerodoujinlog.com\nerodoujinworld.com\neromanga-kingdom.com\neromangadouzin.com\neromon.net\nesg.t91y.com\neslite.com\nesurance.com\netherdelta.com\nethermine.org\netherscan.com\netherscan.io\netizer.org\netokki.com\netools.ncol.com\netsy.com\neurekavpt.com\neuronews.com\nevchk.wikia.com\neveripedia.org\nevschool.net\nexchristian.hk\nexhentai.org\nexmo.com\nexmormon.org\nexpatshield.com\nexpecthim.com\nexpekt.com\nexploader.net\nexpressvpn.com\nexrates.me\nextmatrix.com\neyevio.jp\neyny.com\nf-droid.org\nf2pool.com\nf8.com\nfacebook.com\nfacebook.de\nfacebook.design\nfacebook.hu\nfacebook.in\nfacebook.nl\nfacebook.se\nfacebookmail.com\nfacebookquotes4u.com\nfaceless.me\nfacesofnyfw.com\nfacesoftibetanselfimmolators.info\nfactchecklab.org\nfactpedia.org\nfaith100.org\nfaiththedog.info\nfakku.net\nfallenark.com\nfalsefire.com\nfalunasia.info\nfalunau.org\nfalundafa-florida.org\nfalundafa-nc.org\nfalundafa-pa.net\nfalundafaindia.org\nfalunhr.org\nfamunion.com\nfanbox.cc\nfangeqiang.com\nfanglizhi.info\nfangong.org\nfanhaolou.com\nfanqiang.network\nfanqiangdang.com\nfanqianghou.com\nfanqiangzhe.com\nfanswong.com\nfantv.hk\nfast.com\nfast.wistia.com\nfastestvpn.com\nfastpic.ru\nfastssh.com\nfaststone.org\nfatbtc.com\nfavstar.fm\nfaz.net\nfb.com\nfb.me\nfb.watch\nfbaddins.com\nfbcdn.net\nfbsbx.com\nfbworkmail.com\nfc2cn.com\nfeedburner.com\nfeeder.co\nfeedly.com\nfeeds.fileforum.com\nfeedx.net\nfeelssh.com\nfeitianacademy.org\nfeixiaohao.com\nfeministteacher.com\nfengzhenghu.com\nfengzhenghu.net\nff.im\nfhreports.net\nfiddle.jshell.net\nfigprayer.com\nfileflyer.com\nfiles.oaiusercontent.com\nfilesor.com\nfinancetwitter.com\nfinancialexpress.com\nfinchvpn.com\nfindyoutube.com\nfindyoutube.net\nfirearmsworld.net\nfirebaseio.com\nfireofliberty.info\nfireofliberty.org\nfiretweet.io\nfirstpost.com\nfirstrade.com\nfish.audio\nflecheinthepeche.fr\nfleursdeslettres.com\nflexclip.com\nflexpool.io\nflgjustice.org\nflickr.com\nflipboard.com\nflipkart.com\nflitto.com\nflog.tw\nflowgpt.com\nflowhongkong.net\nflypool.org\nflyvpn.com\nflyzy2005.com\nfnac.be\nfnac.com\nfnc.ebc.net.tw\nfochk.org\nfocustaiwan.tw\nfofg.org\nfooooo.com\nforbes.com\nforefront.ai\nforeignaffairs.com\nforeignpolicy.com\nform.new\nforms.new\nforum.cyberctm.com\nfountmedia.io\nfourthinternational.org\nfoxgay.com\nfoxsub.com\nfpmt.org\nfpmtmexico.org\nfqrouter.com\nfrank2019.me\nfranklc.com\nfreakshare.com\nfree-ss.site\nfree.bg\nfree.com.tw\nfreebeacon.com\nfreebrowser.org\nfreechinaweibo.com\nfreedom.gov\nfreedomhouse.org\nfreedominfonetweb.wordpress.com\nfreedomsherald.org\nfreegao.com\nfreegpt.es\nfreegpt.tech\nfreehongkong.org\nfreekazakhs.org\nfreelotto.com\nfreenetproject.org\nfreeoz.org\nfreess.org\nfreessh.us\nfreeterabox.com\nfreetibet.org\nfreetibetanheroes.org\nfreetls.fastly.net\nfreetribe.me\nfreevpn.me\nfreewallpaper4.me\nfreewechat.com\nfreeweibo.com\nfreezhihu.org\nfriendfeed.com\nfriends-of-tibet.org\nfriendsoftibet.org\nfril.jp\nfring.com\nfringenetwork.com\nfrommel.net\nfrontlinedefenders.org\nfrootvpn.com\nfroth.zone\nfscked.org\nft.com\nftchinese.com\nftv.com.tw\nftvnews.com.tw\nftx.com\nfuchsia.dev\nfuckccp.com\nfuckccp.xyz\nfulione.com\nfullerconsideration.com\nfullservicegame.com\nfunkyimg.com\nfurbo.org\nfurinkan.com\nfurrybar.com\nfuturemessage.org\nfw.cm\nfxcm-chinese.com\nfxnetworks.com\ng-area.org\ng-queen.com\ng.co\ng0v.social\ng6hentai.com\ngab.com\ngabocorp.com\ngagaoolala.com\ngalenwu.com\ngame735.com\ngamer.com.tw\ngamez.com.tw\nganjing.com\nganjingworld.com\ngaoming.net\ngaopi.net\ngartlive.com\ngarudalinux.org\ngate.io\ngatecoin.com\ngather.com\ngaymap.cc\ngaywatch.com\ngazotube.com\ngcc.org.hk\ngclubs.com\ngcmasia.com\ngcpnews.com\ngcr.io\ngdaily.org\ngeek-art.net\ngekikame.com\ngelbooru.com\ngenerated.photos\ngenius.com\ngeph.io\nget.app\nget.dev\nget.how\nget.page\ngetastrill.com\ngetcloak.com\ngetfoxyproxy.org\ngetgom.com\ngeti2p.net\ngetlantern.org\ngetmalus.com\ngetmdl.io\ngetoutline.org\ngetsession.org\ngetsync.com\ngettr.com\ngettyimages.ae\ngettyimages.ca\ngettyimages.de\ngettyimages.hk\ngettyimages.in\ngettyimages.it\ngettyimages.us\ngetuploader.com\ngfsale.com\ngfw.press\ngfw.report\ngfwatch.org\ngfwbao.com\nggpht.com\nggssl.com\nghidra-sre.org\nghostpath.com\nghut.org\ngiantessnight.com\ngiga-web.jp\ngirlbanker.com\ngit.io\ngitbook.io\ngithub.blog\ngithub.com\ngithub.io\ngithubassets.com\ngithubcopilot.com\ngithubusercontent.com\ngitlab.net\ngizlen.net\ngjczz.com\nglarity.app\nglass8.eu\nglobal.bing.com\nglobal.ssl.fastly.net\nglobaljihad.net\nglobalrescue.net\nglobalvoices.org\nglobalvoicesonline.org\nglobalvpn.net\nglorystar.me\nglype.com\ngmail.com\ngmgard.com\ngmgn.ai\ngmodules.com\ngmp4.com\ngnci.org.hk\ngnews.org\ngo-to-zlibrary.se\ngo141.com\ngo5.dev\ngoagent.biz\ngodaddy.com\ngodfootsteps.org\ngodoc.org\ngofundme.com\ngohappy.com.tw\ngojet.krtco.com.tw\ngolang.org\ngoldbetsports.com\ngolden-ages.org\ngoldeneyevault.com\ngoldenfrog.com\ngoldwave.com\ngongm.in\ngoo.gl\ngoo.ne.jp\ngooday.xyz\ngoodhope.school\ngoodnewsnetwork.org\ngoodreaders.com\ngoodreads.com\ngoofind.com\ngoogle.ac\ngoogle.ad\ngoogle.ae\ngoogle.af\ngoogle.ai\ngoogle.al\ngoogle.am\ngoogle.as\ngoogle.at\ngoogle.az\ngoogle.ba\ngoogle.be\ngoogle.bf\ngoogle.bg\ngoogle.bi\ngoogle.bj\ngoogle.bs\ngoogle.bt\ngoogle.by\ngoogle.ca\ngoogle.cat\ngoogle.cd\ngoogle.cf\ngoogle.cg\ngoogle.ch\ngoogle.ci\ngoogle.cl\ngoogle.cm\ngoogle.cn\ngoogle.co.ao\ngoogle.co.bw\ngoogle.co.ck\ngoogle.co.cr\ngoogle.co.id\ngoogle.co.il\ngoogle.co.in\ngoogle.co.jp\ngoogle.co.ke\ngoogle.co.kr\ngoogle.co.ls\ngoogle.co.ma\ngoogle.co.mz\ngoogle.co.nz\ngoogle.co.th\ngoogle.co.tz\ngoogle.co.ug\ngoogle.co.uk\ngoogle.co.uz\ngoogle.co.ve\ngoogle.co.vi\ngoogle.co.za\ngoogle.co.zm\ngoogle.co.zw\ngoogle.com\ngoogle.com.af\ngoogle.com.ag\ngoogle.com.ai\ngoogle.com.ar\ngoogle.com.au\ngoogle.com.bd\ngoogle.com.bh\ngoogle.com.bn\ngoogle.com.bo\ngoogle.com.br\ngoogle.com.bz\ngoogle.com.co\ngoogle.com.cu\ngoogle.com.cy\ngoogle.com.do\ngoogle.com.ec\ngoogle.com.eg\ngoogle.com.et\ngoogle.com.fj\ngoogle.com.gh\ngoogle.com.gi\ngoogle.com.gt\ngoogle.com.hk\ngoogle.com.jm\ngoogle.com.kh\ngoogle.com.kw\ngoogle.com.lb\ngoogle.com.ly\ngoogle.com.mm\ngoogle.com.mt\ngoogle.com.mx\ngoogle.com.my\ngoogle.com.na\ngoogle.com.nf\ngoogle.com.ng\ngoogle.com.ni\ngoogle.com.np\ngoogle.com.om\ngoogle.com.pa\ngoogle.com.pe\ngoogle.com.pg\ngoogle.com.ph\ngoogle.com.pk\ngoogle.com.pr\ngoogle.com.py\ngoogle.com.qa\ngoogle.com.sa\ngoogle.com.sb\ngoogle.com.sg\ngoogle.com.sl\ngoogle.com.sv\ngoogle.com.tj\ngoogle.com.tr\ngoogle.com.tw\ngoogle.com.ua\ngoogle.com.uy\ngoogle.com.vc\ngoogle.com.vn\ngoogle.cv\ngoogle.cz\ngoogle.de\ngoogle.dev\ngoogle.dj\ngoogle.dk\ngoogle.dm\ngoogle.dz\ngoogle.ee\ngoogle.es\ngoogle.eu\ngoogle.fi\ngoogle.fm\ngoogle.fr\ngoogle.ga\ngoogle.ge\ngoogle.gg\ngoogle.gl\ngoogle.gm\ngoogle.gp\ngoogle.gr\ngoogle.gy\ngoogle.hk\ngoogle.hn\ngoogle.hr\ngoogle.ht\ngoogle.hu\ngoogle.ie\ngoogle.im\ngoogle.iq\ngoogle.is\ngoogle.it\ngoogle.it.ao\ngoogle.je\ngoogle.jo\ngoogle.kg\ngoogle.ki\ngoogle.kz\ngoogle.la\ngoogle.li\ngoogle.lk\ngoogle.lt\ngoogle.lu\ngoogle.lv\ngoogle.md\ngoogle.me\ngoogle.mg\ngoogle.mk\ngoogle.ml\ngoogle.mn\ngoogle.ms\ngoogle.mu\ngoogle.mv\ngoogle.mw\ngoogle.mx\ngoogle.ne\ngoogle.nl\ngoogle.no\ngoogle.nr\ngoogle.nu\ngoogle.org\ngoogle.pl\ngoogle.pn\ngoogle.ps\ngoogle.pt\ngoogle.ro\ngoogle.rs\ngoogle.ru\ngoogle.rw\ngoogle.sc\ngoogle.se\ngoogle.sh\ngoogle.si\ngoogle.sk\ngoogle.sm\ngoogle.sn\ngoogle.so\ngoogle.sr\ngoogle.st\ngoogle.td\ngoogle.tg\ngoogle.tk\ngoogle.tl\ngoogle.tm\ngoogle.tn\ngoogle.to\ngoogle.tt\ngoogle.us\ngoogle.vg\ngoogle.vn\ngoogle.vu\ngoogle.ws\ngoogleapis.com\ngoogleapps.com\ngooglearth.com\ngoogleartproject.com\ngoogleblog.com\ngooglebot.com\ngooglechinawebmaster.com\ngooglecode.com\ngooglecommerce.com\ngoogledomains.com\ngoogledrive.com\ngoogleearth.com\ngooglefiber.net\ngooglegroups.com\ngooglehosted.com\ngoogleideas.com\ngoogleinsidesearch.com\ngooglemail.com\ngooglemashups.com\ngooglepagecreator.com\ngoogleplay.com\ngoogleplus.com\ngooglescholar.com\ngooglesource.com\ngoogleusercontent.com\ngooglevideo.com\ngoogleweblight.com\ngooglezip.net\ngopetition.com\ngoreforum.com\ngoregrish.com\ngospelherald.com\ngotdns.ch\ngotquestions.org\ngotrusted.com\ngotw.ca\ngov.ir\ngov.taipei\ngov.tw\ngrammaly.com\ngraph.org\ngraphis.ne.jp\ngraphql.org\ngravatar.com\ngreasyfork.org\ngreatfire.org\ngreatfire.us7.list-manage.com\ngreatfirevpn.com\ngreatfirewallofchina.org\ngreenpeace.org\ngreenvpn.net\ngrindr.com\ngrok.com\ngrokipedia.com\nground.news\ngsearch.media\ngsp.target.com\ngstatic.com\ngtricks.com\ngtv.org\ngtv1.org\ngu-chu-sum.org\nguaguass.com\nguishan.org\ngumroad.com\ngunsamerica.com\ngutteruncensored.com\ngvlib.com\ngvm.com.tw\ngvt1.com\ngvt3.com\ngwins.org\ngwtproject.org\ngzone-anime.info\nh-china.org\nh-moe.com\nhackmd.io\nhackthatphone.net\nhaijiao.com\nhaiwaikan.com\nhakkatv.org.tw\nhalktv.com.tr\nhanime.tv\nhanime1.me\nhardsextube.com\nhautelook.com\nhautelookcdn.com\nhbg.com\nhbo.com\nhbomax.com\nhdtvb.net\nhdzog.com\nheartyit.com\nhec.su\nhecaitou.net\nhechaji.com\nheeact.edu.tw\nhegre-art.com\nhelixstudios.net\nhelloandroid.com\nhelloqueer.com\nhelp.byspotify.com\nhelpeachpeople.com\nhelpster.de\nhembed.com\nheqinglian.net\nheritage.org\nherokuapp.com\nherominers.com\nhexieshe.com\nhexieshe.xyz\nhexxeh.net\nheyuedi.com\nhicairo.com\nhiccears.com\nhidden-advent.org\nhide.me\nhideipvpn.com\nhideman.net\nhidemy.name\nhidemyass.com\nhidemycomp.com\nhighrockmedia.com\nhiitch.com\nhikinggfw.org\nhimalayan-foundation.org\nhimemix.com\nhindustantimes.com\nhinet.net\nhitbtc.com\nhitomi.la\nhiveon.net\nhk-pub.com\nhk.gradconnection.com\nhk.jiepang.com\nhk01.com\nhka8964.wordpress.com\nhkanews.wordpress.com\nhkbookcity.com\nhkchronicles.com\nhkcnews.com\nhkcoc.com\nhkcoc.weather.com.hk\nhkdc.us\nhket.com\nhkfaa.com\nhkgalden.com\nhkgolden.com\nhkgpao.com\nhklts.org.hk\nhkmap.live\nhkopentv.com\nhkpeanut.com\nhkreporter.com\nhmoegirl.com\nhmvdigital.ca\nhmvdigital.com\nhnjhj.com\nhojemacau.com.mo\nhola.com\nhola.org\nhole.thu.monster\nholyspiritspeaks.org\nhome.saxo\nhomedepot.com\nhomeservershow.com\nhongkong.fandom.com\nhongkongfp.com\nhongzhi.li\nhonven.xyz\nhootsuite.com\nhoover.org\nhoovers.com\nhornytrip.com\nhorrorporn.com\nhostloc.com\nhotair.com\nhotcoin.com\nhotspotshield.com\nhottg.com\nhotvpn.com\nhowtoforge.com\nhoxx.com\nhoy.tv\nhpjav.com\nhqcdp.org\nhqjapanesesex.com\nhqsbnet.wordpress.com\nhqsbonline.wordpress.com\nhrichina.org\nhrntt.org\nhrw.org\nhsex.men\nhsjp.net\nhsselite.com\nhst.net.tw\nht.ly\nhtkou.net\nhtl.li\nhtml5rocks.com\nhtx.com\nhuaglad.com\nhuanghuagang.org\nhuaren.us\nhuashangnews.com\nhuayuworld.org\nhudatoriq.web.id\nhudson.org\nhuffingtonpost.com\nhuffpost.com\nhuggingface.co\nhugoroy.eu\nhuhaitai.com\nhuhamhire.com\nhuhangfei.com\nhulu.com\nhuluim.com\nhumanparty.me\nhumanrightspressawards.org\nhung-ya.com\nhuobi.co\nhuobi.com\nhuobi.li\nhuobi.me\nhuobi.pro\nhuobi.sc\nhuobipool.com\nhuobipro.com\nhuping.net\nhustlercash.com\nhutianyi.net\nhwayue.org.tw\nhxwk.org\nhybrid-analysis.com\nhyperbeam.com\nhyperrate.com\nhypothes.is\ni-scmp.com\ni.111666.best\ni.lithium.com\ni2p2.de\ni818hk.com\niam.soy\niask.ca\niavian.net\nibvpn.com\nicedrive.net\nicij.org\nicl-fi.org\nicoco.com\niconpaper.org\nicu-project.org\nid.heroku.com\nidcflare.com\nidenti.ca\nidiomconnection.com\nidope.se\nifan.cz.cc\nifcss.org\nifreechina.wordpress.com\nifreewares.com\nift.tt\nigcd.net\nigfw.net\nigoogle.com\nigvita.com\niicns.com\niipdigital.usembassy.gov\nilbe.com\nilhamtohtiinstitute.org\nillawarramercury.com.au\nillusionfactory.com\nilove80.be\nilovelongtoes.com\nim88.tw\nimagefap.com\nimageflea.com\nimageglass.org\nimages-gaytube.com\nimages.prismic.io\nimageshack.us\nimagevenue.com\nimagezilla.net\nimago-images.com\nimb.org\nimg.dlsite.jp\nimg.ly\nimg.picgo.net\nimgasd.com\nimgchili.net\nimgur.com\nimkev.com\nimlive.co\nimprod.works\nincloak.com\nincredibox.fr\nindependent.co.uk\nindia.com\nindiablooms.com\nindianarrative.com\nindiandefensenews.in\nindiatoday.in\nindiemerch.com\ninews-api.tvb.com\ninfo-graf.fr\ninfura.io\ninherit.live\ninitiativesforchina.org\ninkbunny.net\ninkui.com\ninmediahk.net\ninoreader.com\ninote.tw\ninsecam.org\ninside.com.tw\ninsidevoa.com\ninstagram.com\ninstitut-tibetain.org\ninteractivebrokers.com\ninternet.org\ninternetfreedom.org\ninternetpopculture.com\ninterseclab.org\ninthenameofconfuciusmovie.com\ninvestigating.wordpress.com\ninvesting.com\ninvidio.us\ninxian.com\nipdefenseforum.com\nipfire.org\nipfs.4everland.io\nipfs.io\niphone4hongkong.com\niphonetaiwan.org\niphonix.fr\nipicture.ru\nipify.org\nipjetable.net\niportal.me\nippotv.com\nipredator.se\niptvbin.com\nipvanish.com\nirangov.ir\nirna.ir\nironpython.net\nironsocket.com\nisaacmao.com\nisc.sans.edu\nisgreat.org\nishr.ch\nislam.org.hk\nislamhouse.com\nismaelan.com\nismprofessional.net\nisrabox.com\nissues.chromium.org\nissuu.com\nisupportuyghurs.org\nitaliatibet.org\nitasoftware.com\nitch.io\nitemfix.com\nitiger.com\nitshidden.com\nitweet.net\niuhrdf.org\nivacy.com\nivonblog.com\nivpn.net\niwara.tv\nixquick.com\niyouport.com\niyouport.org\nj.mp\njable.tv\njamestown.org\njamyangnorbu.com\njan.ai\njapan-whores.com\njapanhdv.com\njapantimes.co.jp\njav321.com\njavakiba.org\njavbus.com\njavdb.com\njavfinder.ai\njavfor.me\njavhub.net\njavhuge.com\njavlibrary.com\njavmobile.net\njavseen.com\njcpenney.com\njex.com\njgoodies.com\njhelab.org\njiangweiping.com\njiaoyou8.com\njifangge.com\njihadology.net\njiji.com\njims.net\njingpin.org\njinrizhiyi.news\njintian.net\njinx.com\njitouch.com\njkb.cc\njma.go.jp\njmsc.hku.hk\njmscult.com\njoachims.org\njobnewera.wordpress.com\njoinclubhouse.com\njoinmastodon.org\njornaldacidadeonline.com.br\njournalofdemocracy.org\njpl.nasa.gov\njsdelivr.net\njtvnw.net\njukujo-club.com\njuliepost.com\njuliereyc.com\njunauza.com\njuoaa.com\njusthost.ru\njustmysocks.net\njustmysocks1.net\njustmysockscn.com\njuziyue.com\nka-wai.com\nkadokawa.co.jp\nkagyu.org.za\nkagyuoffice.org\nkagyuoffice.org.tw\nkakao.com\nkanald.com.tr\nkannewyork.com\nkanshifang.com\nkantie.org\nkaotic.com\nkarayou.com\nkawaiikawaii.jp\nkawase.com\nkb.monitorware.com\nkebrum.com\nkendatire.com\nkenengba.com\nkepard.com\nkex.com\nkeycdn.com\nkhatrimaza.org\nkichiku-doujinko.com\nkik.com\nkillwall.com\nkindle4rss.com\nkindleren.com\nkingdomsalvation.org\nkingkong.com.tw\nkingstone.com.tw\nkinmen.org.tw\nkinmen.travel\nkinokuniya.com\nkiwi.kz\nkk-whys.co.jp\nkkbox.com\nkknews.cc\nknowyourmeme.com\nkobo.com\nkobobooks.com\nkompozer.net\nkonachan.com\nkoolsolutions.com\nkoornk.com\nkoranmandarin.com\nkpkuang.org\nkqes.net\nkraken.com\nkspcoin.com\nktzhk.com\nkuaichedao.co\nkucoin.com\nkukuku.uk\nkurtmunger.com\nkwcg.ca\nkwongwah.com.my\nkxsw.life\nkzaobao.com\nkzeng.info\nlab.skk.moe\nlabiennale.org\nlagranepoca.com\nlala.im\nlama.com.tw\nlamayeshe.com\nlamnia.co.uk\nlandofhope.tv\nlantern.io\nlaogai.org\nlaogairesearch.org\nlaqingdan.net\nlarsgeorge.com\nlastcombat.com\nlastfm.es\nlausan.hk\nlbank.info\nldplayer.net\nldplayer.tw\nle-vpn.com\nleafyvpn.net\nlecloud.net\nledger.com\nleft21.hk\nlegra.ph\nleisurepro.com\nlematin.ch\nlenwhite.com\nlesoir.be\nletscorp.net\nlexica.art\nlhakar.org\nli.taipei\nliangyou.net\nliangzhichuanmei.com\nliaowangxizang.net\nliberal.org.hk\nlibertysculpturepark.com\nlibertytimes.com.tw\nlibrary-access.sk\nlibrary.usc.cuhk.edu.hk\nlibredd.it\nlifemiles.com\nlighten.org.tw\nlighti.me\nlightnovel.cn\nlightyearvpn.com\nlih.kg\nlihkg.com\nlike.com\nlilaoshibushinilaoshi.com\nline-apps.com\nline-scdn.net\nline.me\nline.naver.jp\nlinear-abematv.akamaized.net\nlingualeo.com\nlingvodics.com\nlink-o-rama.com\nlinkedin.com\nlinktr.ee\nlinux.do\nlinux.org.hk\nliquiditytp.com\nliquidvpn.com\nlistennotes.com\nlistentoyoutube.com\nlitenews.hk\nliuxiaobo.net\nliuxiaotong.com\nlivecoin.net\nliveleak.com\nlivemint.com\nlivestream.com\nlivevideo.com\nlivingstream.com\nlmarena.ai\nlocalbitcoins.com\nlocaldomain.ws\nlockestek.com\nlogin.target.com\nlogos.com.hk\nlongtermly.net\nlongtoes.com\nlookpic.com\nlooktoronto.com\nlovart.ai\nlovetvshow.com\nlpsg.com\nlrfz.com\nlrip.org\nlsd.org.hk\nlsm.org\nlsmchinese.org\nlsmkorean.org\nlt.sntp.uk\nltn.com.tw\nluckydesigner.space\nluckymobile.ca\nludepress.com\nlupm.org\nlushstories.com\nlvhai.org\nlvv2.com\nlyfhk.net\nlzjscript.com\nlzmtnews.org\nm.hkgalden.com\nm.me\nm.moegirl.org\nmacgamestore.com\nmad-ar.ch\nmadewithcode.com\nmadonna-av.com\nmadou.club\nmadrau.com\nmadthumbs.com\nmahjongsoul.com\nmain-ecnpaper-economist.content.pugpig.com\nmaiplus.com\nmakemymood.com\nmandiant.com\nmangabz.com\nmangafox.com\nmangafox.me\nmangmang.run\nmanta.com\nmanus.im\nmanyvoices.news\nmarc.info\nmartau.com\nmartsangkagyuofficial.org\nmarxist.net\nmarxists.org\nmash.to\nmastodon.cloud\nmastodon.host\nmastodon.online\nmastodon.social\nmastodon.xyz\nmatainja.com\nmaterial.io\nmatome-plus.com\nmatome-plus.net\nmatrix.org\nmatters.news\nmatters.town\nmatthewdgreen.wordpress.com\nmattwilcox.net\nmaven.neoforged.net\nmcadforums.com\nmcaf.ee\nmcusercontent.com\nmd-t.org\nme.me\nme.ns.ci\nmeansys.com\nmedia.nu.nl\nmediachinese.com\nmediafreakcity.com\nmediawiki.org\nmedium.com\nmeee.com.tw\nmega.co.nz\nmega.io\nmega.nz\nmegalodon.jp\nmegaproxy.com\nmegurineluka.com\nmeizhong.blog\nmeizhong.report\nmemehk.com\nmemes.tw\nmercari.com\nmercari.jp\nmercatox.com\nmercdn.net\nmercyprophet.org\nmergersandinquisitions.com\nmeridian-trust.org\nmeripet.com\nmerit-times.com.tw\nmessenger.com\nmeta.com\nmetafilter.com\nmetamask.io\nmetart.com\nmetarthunter.com\nmeteorshowersonline.com\nmetro.taipei\nmetrolife.ca\nmetroradio.com.hk\nmewe.com\nmfxmedia.com\nmgoon.com\nmgstage.com\nmh4u.org\nmicrovpn.com\nmihua.org\nmij.rip\nmikanani.me\nmike.cz.cc\nmikesoltys.com\nmindrolling.org\nmingdemedia.org\nminghui-school.org\nminghui.or.kr\nminghui.org\nminghuiyw.wordpress.com\nmingjinglishi.com\nmingjingnews.com\nmingjingtimes.com\nmingpao.com\nmingpaocanada.com\nmingpaomonthly.com\nmingpaonews.com\nmingpaony.com\nmingpaosf.com\nmingshengbao.com\nminhhue.net\nminingpoolhub.com\nministrybooks.org\nminzhuzhongguo.org\nmiraheze.org\nmiroguide.com\nmirror.xyz\nmirrorbooks.com\nmirrormedia.mg\nmissav.com\nmissav.ws\nmistral.ai\nmitbbs.com\nmiuipolska.pl\nmixero.com\nmixi.jp\nmixx.com\nmizzmona.com\nmji.rip\nmjj.rip\nmjlsh.usc.cuhk.edu.hk\nmlc.ai\nmlzs.work\nmmaaxx.com\nmo.nightlife141.com\nmobatek.net\nmobile01.com\nmobileways.de\nmoby.to\nmod.io\nmodernchinastudies.org\nmoeerolibrary.com\nmoeshare.cc\nmog.com\nmohu.club\nmohu.rocks\nmojim.com\nmomoshop.com.tw\nmondex.org\nmoney-link.com.tw\nmoneydj.com\nmonica.im\nmonitorchina.org\nmonocloud.me\nmonster.com\nmoodyz.com\nmoon.fm\nmoonbbs.com\nmoonbingo.com\nmoptt.tw\nmoresci.sale\nmorningsun.org\nmos.ru\nmosavi.io\nmotherless.com\nmovements.org\nmoviefap.com\nmpettis.com\nmpfinance.com\nmpinews.com\nmrtweet.com\nmsa-it.org\nmsha.gov\nmstdn.social\nmswe1.org\nmthruf.com\nmubi.com\nmullvad.net\nmultiply.com\nmusixmatch.com\nmuzi.com\nmuzi.net\nmuzu.tv\nmvg.jp\nmy-private-network.co.uk\nmy.pcloud.com\nmyaudiocast.com\nmybet.com\nmychinanews.com\nmycnnews.com\nmyeclipseide.com\nmyiphide.com\nmyjs.tw\nmykomica.org\nmymoe.moe\nmyparagliding.com\nmypikpak.com\nmypopescu.com\nmyspacecdn.com\nmytvsuper.com\nmywife.cc\nnaacoalition.org\nnaitik.net\nnakedsecurity.sophos.com\nnakido.com\nnalandabodhi.org\nnalandawest.org\nnamu.wiki\nnanopool.org\nnanyang.com\nnanyangpost.com\nnat.moe\nnational-lottery.co.uk\nnationalawakening.org\nnationalinterest.org\nnationalreview.com\nnationwide.com\nnaughtyamerica.com\nnaver.com\nnavyfamily.navy.mil\nnavyreserve.navy.mil\nnbcnews.com\nnbtvpn.com\nnbyy.tv\nnchrd.org\nncn.org\nndi.org\nnekoslovakia.net\nneo-miracle.com\nneowin.net\nnephobox.com\nnetalert.me\nnetflav.com\nnetflix.com\nnetflix.net\nnetlify.app\nnetme.cc\nnetsarang.com\nnewcenturymc.com\nnewchen.com\nnewhighlandvision.com\nnewindianexpress.com\nnewmitbbs.com\nnews.ebc.net.tw\nnews.mt.co.kr\nnews.seehua.com\nnews.tvbs.com.tw\nnews.ycombinator.com\nnews1.kr\nnews18.com\nnewsancai.com\nnewsblur.com\nnewsmax.com\nnewstamago.com\nnewstapa.org\nnewstatesman.com\nnewsweek.com\nnewtalk.tw\nnewthuhole.com\nnewyorker.com\nnexon.com\nnextdigital.com.hk\nnexton-net.jp\nnexttv.com.tw\nnf.id.au\nnflxext.com\nnflximg.com\nnflximg.net\nnflxso.net\nnflxvideo.net\nnftstorage.link\nnga.mil\nnhentai.net\nnic.cz.cc\nnic.gov\nnicovideo.jp\nnightswatch.top\nnikke-en.com\nnikke-jp.com\nnikke-kr.com\nnikke.hotcool.tw\nnikkei.com\nninjaproxy.ninja\nnirsoft.net\nnitter.cc\nnitter.net\nniu.moe\nniusnews.com\nnjactb.org\nnlfreevpn.com\nnmsl.website\nnnews.eu\nnobel.se\nnodeseek.com\nnokogiri.org\nnokola.com\nnordstrom.com\nnordstromimage.com\nnordstromrack.com\nnordvpn.com\nnos.nl\nnotepad-plus-plus.org\nnottinghampost.com\nnow.com\nnownews.com\nnoxinfluencer.com\nnpa.go.jp\nnpnt.me\nnpsboost.com\nnradio.me\nnrk.no\nntd.tv\nntdtv.com\nntdtv.com.tw\nntdtv.cz\nnuexpo.com\nnurgo-software.com\nnusatrip.com\nnutaku.net\nnutsvpn.work\nnuuvem.com\nnvdst.com\nnvtongzhisheng.org\nnyaa.eu\nnyaa.si\nnybooks.com\nnypost.com\nnyt.com\nnytcn.me\nnytco.com\nnyti.ms\nnytimes.com\nnytimes.map.fastly.net\nnytimg.com\nnytstyle.com\no3o.ca\noanda.com\noann.com\nobyte.org\noctober-review.org\noctocaptcha.com\noculus.com\noculuscdn.com\nodysee.com\noex.com\nofficeoftibet.com\nofile.org\nogaoga.org\nogate.org\nohmyrss.com\nok.ru\nokayfreedom.com\nokcoin.com\nokex.com\nokk.tw\noklink.com\nokpool.me\nokx.com\nold.honeynet.org\nolehdtv.com\nolelive.com\nolevod.com\nolumpo.com\nomct.org\nomni7.jp\nomnitalk.com\nomnitalk.org\nomny.fm\non.cc\non2.com\nonapp.com\none.one.one.one\nonedrive.com\nonedrive.live.com\nonejav.com\nonevps.com\nonion.city\nonion.ly\nonline.recoveryversion.org\nonlineyoutube.com\nonlygayvideo.com\nonlytweets.com\nonthehunt.com\nontrac.com\noojj.de\nooni.io\nooni.org\nopen.firstory.me\nopenai.com\nopenart.ai\nopencritic.com\nopendemocracy.net\nopenid.net\nopenleaks.org\nopensea.io\nopenstreetmap.org\nopentech.fund\nopenvpn.net\nopenvpn.org\nopenwebster.com\nopus-gaming.com\nordns.he.net\noricon.co.jp\norient-doll.com\norientaldaily.com.my\norn.jp\nosfoora.com\nosmand.net\notcbtc.com\notto.de\nourdearamy.com\noursteps.com.au\nourtv.hk\novercast.fm\noverdaily.org\noverplay.net\noversea.istarshine.com\novpn.com\now.ly\nowl.li\nowltail.com\noxfordscholarship.com\nozvoice.org\npachosting.com\npacom.mil\npacopacomama.com\npage.link\npages.dev\npaimon.moe\npancakeswap.finance\npandafan.pub\npandapow.co\npandavpn-jp.com\npandavpnpro.com\npandora.com\npanoramio.com\npao-pao.net\nparkansky.com\nparler.com\nparse.com\nparsevideo.com\npartnerstack.xyz\npassion.com\npaste.ee\npastie.org\npatreon.com\npatreonusercontent.com\npawoo.net\npaxful.com\npayments-jp.amazon.com\npbs.org\npbworks.com\npbxes.com\npbxes.org\npcgamestorrents.com\npcij.org\npct.org.tw\npdproxy.com\npds.nasa.gov\npdst.fm\npeace.ca\npeing.net\npekingduck.org\npemulihan.or.id\npen.io\npendrivelinux.com\npentoy.hk\npeoplenews.tw\npeopo.org\nperfect-privacy.com\nperiscope.tv\nperplexity.ai\npewresearch.org\nphayul.com\nphmsociety.org\nphncdn.com\nphosphation13.rssing.com\nphotodharma.net\nphotofocus.com\nphotonmedia.net\npiaotia.com\npicacomic.com\npicacomiccn.com\npicasaweb.com\npicsart.com\npicturedip.com\npicuki.com\npigav.com\npimg.tw\npin-cong.com\npin6.com\npincong.rocks\nping.fm\npinimg.com\npinoy-n.com\npinterest.at\npinterest.ca\npinterest.cl\npinterest.co.uk\npinterest.com\npinterest.com.au\npinterest.com.mx\npinterest.de\npinterest.es\npinterest.fr\npinterest.ie\npinterest.it\npinterest.jp\npinterest.nz\npinterest.ph\npinterest.pt\npinterest.se\npixeldrain.com\npixelqi.com\npixiv.net\npixiv.org\npixivsketch.net\npixnet.net\npki.goog\npkqjiasu.com\npkuanvil.com\nplacemix.com\nplay-asia.com\nplayboy.com\nplayboyplus.com\nplayer.fm\nplayno1.com\nplaypcesor.com\nplexvpn.pro\nplurk.com\nplus.codes\npmatehunter.com\npo2b.com\npodbean.com\npodcast.co\npodictionary.com\npodwise.ai\npoe.com\npoints-media.com\npokerstars.com\npokerstars.net\npoliticalchina.org\npoloniex.com\npolymarket.com\npolymer-project.org\npolymerhk.com\npoolbinance.com\npoolin.com\npopai.pro\npopvote.hk\npopxi.click\npopyard.org\npornhd.com\npornhub.com\npornhubdeutsch.net\npornmate.com\npornrapidshare.com\npornsharing.com\npornstarbyface.com\npornstarclub.com\nporntvblog.com\nposkotanews.com\npost76.com\npost852.com\nposts.careerengine.us\npotato.im\npotatso.com\npotvpn.com\npourquoi.tw\npower.com\npowerapple.com\npowercx.com\nppy.sh\nprayforchina.net\nprcleader.org\npremproxy.com\npresentation.new\npresentationzen.com\npresident.ir\npresidentlee.tw\nprestige-av.com\nprimevideo.com\nprism-break.org\npritunl.com\nprivacybox.de\nprivacyguides.org\nprivate.com\nprivateinternetaccess.com\nprivatepaste.com\nprivatetunnel.com\nprivatevpn.com\nprivoxy.org\nprocopytips.com\nproject-syndicate.org\nprompthero.com\nprosiben.de\nproton.me\nprotonvpn.com\nprovpnaccounts.com\nproxfree.com\nproxomitron.info\nproxpn.com\nproxynetwork.org.uk\nproxz.com\nproyectoclubes.com\npscp.tv\npshvpn.com\npsiphon.ca\npsiphon3.com\npstatic.net\npt.im\nptt.cc\npttgame.com\nptwxz.com\npubu.com.tw\npuffinbrowser.com\npullfolio.co\npure18.com\npureconcepts.net\npuredns.org\npureinsight.org\npurepdf.com\npurevpn.com\npurpose.nike.com\npursuestar.com\nputty.org\npximg.net\npython.com.tw\nqbittorrent.org\nqgirl.com.tw\nqi-gong.me\nqianbai.tw\nqiandao.today\nqianglie.com\nqiangwaikan.com\nqiangyou.org\nqianmo.tw\nqiwen.lu\nqmp4.com\nqoos.com\nqq.co.za\nqstatus.com\nqtrac.eu\nquestvisual.com\nquitccp.org\nquiz.directory\nquora.com\nquoracdn.net\nquran.com\nqz.com\nr-pool.net\nr0.ru\nr10s.jp\nr18.com\nradiko.jp\nradio-canada.ca\nradio-en-ligne.fr\nradio.co\nradio.garden\nradioaustralia.net.au\nradiohilight.net\nradiojar.com\nradioline.co\nradiovaticana.org\nradiovncr.com\nradmin-vpn.com\nrael.org\nraggedbanner.com\nraidcall.com.tw\nraindrop.io\nraizoji.or.jp\nrakuten.co.jp\nramcity.com.au\nrapidmoviez.com\nrapidvpn.com\nrarbgprx.org\nrateyourmusic.com\nrationalwiki.org\nraw.githack.com\nrawgit.com\nrawgithub.com\nrawstory.com\nrcam.target.com\nrcinet.ca\nrd.com\nreabble.com\nread01.com\nreadingtimes.com.tw\nreadmoo.com\nreadydown.com\nrealcourage.org\nrealitykings.com\nreason.com\nrecordedfuture.com\nrecoveryversion.com.tw\nred-lang.org\nredbubble.com\nredchinacn.net\nredd.it\nreddit.com\nreddithelp.com\nredditlist.com\nredditmedia.com\nredditspace.com\nredditstatic.com\nredhotlabs.com\nreferer.us\nreflectivecode.com\nrelay.firefox.com\nreligionnews.com\nrenminbao.com\nrentry.co\nrenyurenquan.org\nresilio.com\nresistchina.org\nretweetrank.com\nreuters.com\nreutersmedia.net\nrfa.org\nrferl.org\nrfi.fr\nrfi.my\nriku.me\nriseup.net\nritter.vg\nrixcloud.com\nrixcloud.us\nrlwlw.com\nrmbl.ws\nroblox.com\nrobustnessiskey.com\nrocket-inc.net\nrocket.chat\nrocksdb.org\nrojo.com\nrolfoundation.org\nrolia.net\nrolsociety.org\nronjoneswriter.com\nrou.video\nrsdlmonitor.com\nrsf-chinese.org\nrsf.org\nrsshub.app\nrssmeme.com\nrtalabel.org\nrthk.hk\nrthk.org.hk\nrti.org.tw\nrti.tw\nrtm.tnt-ea.com\nrule34.xxx\nrule34video.com\nrumble.com\nrustdesk.com\nrusvpn.com\nruten.com.tw\nrutracker.net\nrutracker.org\nrxhj.net\ns-cute.com\ns.yimg.com\ns3-ap-northeast-1.amazonaws.com\nsacks.com\nsacom.hk\nsadistic-v.com\nsadpanda.us\nsafechat.com\nsafeguarddefenders.com\nsafervpn.com\nsagernet.org\nsaintyculture.com\nsakuralive.com\nsalvation.org.hk\nsankakucomplex.com\nsankei.com\nsanmin.com.tw\nsavethedate.foo\nsavethesounds.info\nsavetibet.de\nsavetibet.org\nsavetibetstore.org\nsaveuighur.org\nsbme.me\nsbti.unun.dev\nscache.vzw.com\nscache1.vzw.com\nscache2.vzw.com\nschema.org\nscmp.com\nscramble.io\nscratch.mit.edu\nscribd.com\nscriptspot.com\nsearch.aol.com\nsearch.com\nsearch.xxx\nsearch.yahoo.co.jp\nsearx.me\nseattlefdc.com\nsecretchina.com\nsecretgarden.no\nsecretsline.biz\nsecure.hustler.com\nsecure.logmein.com\nsecure.shadowsocks.nu\nsecureservercdn.net\nsecuretunnel.com\nsecurityinabox.org\nsecuritykiss.com\nseed4.me\nseevpn.com\nseezone.net\nsehuatang.net\nsehuatang.org\nsensortower.com\nsesawe.net\nsethwklein.net\nsetn.com\nsevenload.com\nsex.com\nsex3.com\nsex8.cc\nsexinsex.net\nsf.net\nsfshibao.com\nsftuk.org\nshadeyouvpn.com\nshadowsocks.be\nshadowsocks.com.hk\nshadowsocks.org\nshahit.biz\nshare-videos.se\nshare.america.gov\nsharecool.org\nshattered.io\nsheet.new\nsheets.new\nshellfire.de\nshenyunperformingarts.org\nshenyunshop.com\nshenzhoufilm.com\nshenzhouzhengdao.org\nshiksha.com\nshitjournal.org\nshixiao.org\nshizhao.org\nshodanhq.com\nshooshtime.com\nshopee.tw\nshopping.yahoo.co.jp\nshowwe.tw\nshutterstock.com\nshwchurch.org\nshwchurch3.com\nsidelinesnews.com\nsignal.org\nsilvergatebank.com\nsimbolostwitter.com\nsimianx.ai\nsimplecd.me\nsimplecd.org\nsimpleswap.io\nsimplex.chat\nsina.com.hk\nsingaporepools.com.sg\nsinglelogin.se\nsingtao.com\nsingtaousa.com\nsinoants.com\nsinoca.com\nsinocast.com\nsinoinsider.com\nsipml5.org\nsis001.com\nsite.new\nsitekreator.com\nsitemaps.org\nsites.new\nsix-degrees.io\nsketchappsources.com\nskimtube.com\nskybet.com\nskyvegas.com\nskyxvpn.com\nslacker.com\nslashine.onl\nsleazyfork.org\nslheng.com\nslickvpn.com\nslides.com\nslides.new\nslideshare.net\nslutmoonbeam.com\nsm-miracle.com\nsmartdnsproxy.com\nsmh.com.au\nsmn.news\nsnapseed.com\nsndcdn.com\nsobees.com\nsoc.mil\nsocial.datalabour.com\nsocial.edu.ci\nsocialblade.com\nsocks-proxy.net\nsockslist.net\nsocrec.org\nsoftether-download.com\nsoftether.org\nsoftfamous.com\nsoftwarebychuck.com\nsoftwaredownload.gitbooks.io\nsogclub.com\nsogrady.me\nsoh.tw\nsohcradio.com\nsohfrance.org\nsolana.com\nsolarsystem.nasa.gov\nsolscan.io\nsolv.finance\nsomee.com\nsongjianjun.com\nsora.com\nsorting-algorithms.com\nsos.org\nsosad.fun\nsosreader.com\nsoubory.com\nsoulcaliburhentai.net\nsoundcloud.com\nsoundofhope.org\nsoundon.fm\nsoup.io\nsouth-plus.net\nsouth-plus.org\nsouthmongolia.org\nsouthnews.com.tw\nsouthpark.cc.com\nsowers.org.hk\nspaces.hightail.com\nspacex.com\nspankbang.com\nsparkpool.com\nspatial.io\nspb.com\nspeakerdeck.com\nspeedcat.me\nspeedify.com\nspencertipping.com\nspendee.com\nspicevpn.com\nspideroak.com\nspiderpool.com\nsports.williamhill.com\nspotflux.com\nspotify.com\nspreadsheet.new\nspreadshirt.es\nspreaker.com\nspring4u.info\nspringboardplatform.com\nspringwood.me\nsproutcore.com\nsquirrelvpn.com\nss-link.com\nss7.vzw.com\nssglobal.co\nssl.webpack.de\nsspanel.net\nssr.tools\nssrshare.com\nssrshare.us\nssrtool.com\nsstm.moe\nsstmlt.moe\nsstmlt.net\nstandard.co.uk\nstandupfortibet.org\nstandwithhk.org\nstarp2p.com\nstartpage.com\nstartuplivingchina.com\nstatic-economist.com\nstatic.pocketcasts.com\nstatic.shemalez.com\nstaticflickr.com\nstboy.net\nstc.com.sa\nsteamcommunity.com\nsteamladder.com\nsteamstatic.com\nsteel-storm.com\nsteemit.com\nsteganos.com\nstephaniered.com\nsthoo.com\nstitcher.com\nstoptibetcrisis.net\nstorage.yandex.net\nstoragenewsletter.com\nstore.steampowered.com\nstorj.io\nstorm.mg\nstorry.tv\nstoweboyd.com\nstraitstimes.com\nstraplessdildo.com\nstreamable.com\nstreamate.com\nstreamingthe.net\nstrongvpn.com\nstudentsforafreetibet.org\nstumbleupon.com\nsubhd.tv\nsubstack.com\nsuche.gmx.net\nsugarsync.com\nsugumiru18.com\nsuissl.com\nsujiatun.wordpress.com\nsumrando.com\nsundayguardianlive.com\nsunmedia.ca\nsuno.ai\nsuno.com\nsunporno.com\nsupchina.com\nsuperpages.com\nsupervpn.net\nsuperzooi.com\nsuprememastertv.com\nsurfeasy.com\nsurfeasy.com.au\nsurfshark.com\nsurrenderat20.net\nswagbucks.com\nswapspace.co\nswissinfo.ch\nswissvpn.net\nswitch1.jp\nswitchvpn.net\nsydney.bing.com\nsydneytoday.com\nsylfoundation.org\nsynapse.org\nsyncback.com\nsynergyse.com\nsyosetu.com\nt-g.com\nt.co\nt.me\nt66y.com\ntaa-usa.org\ntaaze.tw\ntaedp.org.tw\ntagwalk.com\ntails.net\ntaipeisociety.org\ntaipeitimes.com\ntaisounds.com\ntaiwanhot.net\ntaiwanjustice.net\ntaiwanncf.org.tw\ntaiwannews.com.tw\ntaiwantt.org.tw\ntalkatone.com\ntalkboxapp.com\ntalkcc.com\ntalkonly.net\ntanc.org\ntanks.gg\ntaoism.net\ntap.io\ntapanwap.com\ntapatalk.com\ntaptap.io\ntardigrade.io\ntarr.uspto.gov\ntaup.net\ntaweet.com\ntbcollege.org\ntbsec.org\ntbsn.org\ntbssqh.org\nteachparentstech.org\ntechnews.tw\ntechviz.net\nteck.in\nteco-hk.org\nteco-mo.org\nteddysun.com\ntehrantimes.com\ntelega.one\ntelegra.ph\ntelegram.dog\ntelegram.me\ntelegram.org\ntelegram.space\ntelegramdownload.com\ntelesco.pe\ntellapart.com\ntemu.com\ntenor.com\ntensorflow.org\ntenzinpalmo.com\nterabox.com\nterobox.com\ntew.org\ntextnow.com\ntextnow.me\ntfc-taiwan.org.tw\ntfhub.dev\ntfiflve.com\ntg-me.com\ntg.dev\ntheatlantic.com\ntheatrum-belli.com\nthebcomplex.com\ntheblaze.com\nthebobs.com\nthebodyshop-usa.com\nthecenter.mit.edu\nthechasernews.co.uk\nthechinacollection.org\ntheconversation.com\nthedalailamamovie.com\nthediplomat.com\nthedw.us\ntheepochtimes.com\nthefacebook.com\nthegay.com\nthegioitinhoc.vn\ntheguardian.com\nthehansindia.com\nthehindu.com\nthehun.net\ntheinitium.com\nthenewslens.com\nthepiratebay.org\ntheporndude.com\ntheportalwiki.com\ntheprint.in\nthesaturdaypaper.com.au\nthestandnews.com\nthetatoken.org\nthetibetpost.com\nthetvdb.com\nthewgo.org\nthewirechina.com\ntheync.com\nthinkchina.sg\nthinkgeek.com\nthinkingtaiwan.com\nthinkwithgoogle.com\nthirdmill.org\nthisav.com\nthomasbernhard.org\nthreadreaderapp.com\nthreads.com\nthreads.net\nthroughnightsfire.com\nthuhole.com\nthywords.com\ntiananmenduizhi.com\ntiananmenuniv.com\ntiananmenuniv.net\ntiandixing.org\ntianti.io\ntiantibooks.org\ntibet-envoy.eu\ntibet-initiative.de\ntibet.com\ntibet.net\ntibet.nu\ntibet.org\ntibet.org.tw\ntibet.to\ntibet3rdpole.org\ntibetaction.net\ntibetanbuddhistinstitute.org\ntibetancommunity.org\ntibetancommunityuk.net\ntibetanentrepreneurs.org\ntibetanhealth.org\ntibetanliberation.org\ntibetansports.org\ntibetanwomen.org\ntibetanyouthcongress.org\ntibetcorps.org\ntibetexpress.net\ntibetfocus.com\ntibetfund.org\ntibetgermany.de\ntibethouse.jp\ntibethouse.org\ntibethouse.us\ntibetmuseum.org\ntibetnetwork.org\ntibetoffice.ch\ntibetoffice.com.au\ntibetoffice.org\ntibetonline.com\ntibetonline.tv\ntibetoralhistory.org\ntibetpolicy.eu\ntibetrelieffund.co.uk\ntibetsociety.com\ntibetsun.com\ntibetsupportgroup.org\ntibetswiss.ch\ntibettelegraph.com\ntibettimes.net\ntibettruth.com\ntibetwrites.org\ntigervpn.com\ntiktok.com\ntiktokcdn-eu.com\ntiktokcdn-us.com\ntiktokcdn.com\ntiktokv.com\ntiktokv.us\ntiltbrush.com\ntimdir.com\ntime.com\ntimesnownews.com\ntimesofindia.indiatimes.com\ntimtales.com\ntinc-vpn.org\ntineye.com\ntingtalk.me\ntiny.cc\ntinychat.com\ntinypaste.com\ntinyurl.com\ntipas.net\ntkcs-collins.com\ntl.gd\ntma.co.jp\ntmagazine.com\ntmi.me\ntmpp.org\ntn1.shemalez.com\ntn2.shemalez.com\ntn3.shemalez.com\ntnaflix.com\ntnp.org\nto-porno.com\ntogetter.com\ntoken.im\ntokenlon.im\ntokyo-porn-tube.com\ntokyocn.com\ntomp3.cc\ntop.tv\ntop10vpn.com\ntopbtc.com\ntoppornsites.com\ntopsy.com\ntoptip.ca\ntoptoon.net\ntor.eff.org\ntorguard.net\ntorlock.com\ntorproject.org\ntorrentgalaxy.to\ntorrentkitty.tv\ntorrentprivacy.com\ntorrentproject.se\ntorrenty.org\ntortoisesvn.net\ntorvpn.com\ntosh.comedycentral.com\ntotalvpn.com\ntou.tv\ntpi.org.tw\ntracfone.com\ntradingview.com\ntranslate.goog\ntransparency.org\ntreemall.com.tw\ntrendsmap.com\ntronscan.org\ntrouw.nl\ntrt.net.tr\ntruebuddha-md.org\ntrustwallet.com\ntruthsocial.com\ntryheart.jp\ntsdr.uspto.gov\ntt1069.com\ntttan.com\nttv.com.tw\nttvnw.net\ntube8.com\ntube911.com\ntubeislam.com\ntubepornclassic.com\ntubewolf.com\ntuidang.org\ntukaani.org\ntumblr.com\ntumutanzi.com\ntumview.com\ntunein.com\ntunein.streamguys1.com\ntunnelbear.com\ntunnelblick.net\ntunnelr.com\ntunsafe.com\nturbobit.net\nturbohide.com\nturkistantimes.com\nturntable.fm\ntushycash.com\ntuvpn.com\ntuzaijidi.com\ntv.com\ntv.jtbc.joins.com\ntvbanywhere.com\ntvboxnow.com\ntvunetworks.com\ntw-blog.com\ntw.jiepang.com\ntw01.org\ntwapperkeeper.com\ntwaud.io\ntwblogger.com\ntweepguide.com\ntweepml.org\ntweetbackup.com\ntweetboard.com\ntweetcs.com\ntweetdeck.com\ntweetedtimes.com\ntweetphoto.com\ntweetree.com\ntweettunnel.com\ntweetwally.com\ntweez.net\ntwelve.today\ntwerkingbutt.com\ntwftp.org\ntwgov.tw\ntwgreatdaily.com\ntwibble.de\ntwibs.com\ntwicountry.org\ntwiends.com\ntwifan.com\ntwiffo.com\ntwiggit.org\ntwimg.com\ntwimg.edgesuite.net\ntwip.me\ntwipple.jp\ntwishort.com\ntwister.net.co\ntwitch.tv\ntwitchcdn.net\ntwitiq.com\ntwitlonger.com\ntwitoaster.com\ntwitonmsn.com\ntwitpic.com\ntwitstat.com\ntwitter.com\ntwitter.jp\ntwitter4j.org\ntwittercounter.com\ntwittergadget.com\ntwitterkr.com\ntwittermail.com\ntwitterrific.com\ntwittertim.es\ntwitturk.com\ntwitturly.com\ntwkan.com\ntwreporter.org\ntwt.tl\ntwtkr.com\ntwttr.com\ntx.me\ntycool.com\ntypepad.com\ntypeset.io\ntypora.io\nu15.info\nu9un.com\nua5v.com\nub0.cc\nubddns.org\nuberproxy.net\nuc-japan.org\nuchicago.edu\nudn.com\nudn.com.tw\nudomain.hk\nuforadio.com.tw\nuhdwallpapers.org\nuhrp.org\nuighur.nl\nuku.im\nulop.net\nultrasurf.us\nultravpn.com\nultravpn.fr\nunblock-us.com\nunblock.cn.com\nunblockdmm.com\nunblocksit.es\nuncyclopedia.hk\nuncyclopedia.tw\nunderwoodammo.com\nunholyknight.com\nunirule.cloud\nuniswap.org\nunknownspace.org\nunmineable.com\nunseen.is\nunstable.icu\nunwire.hk\nuocn.org\nup.audio\nupbit.com\nupdates.tdesktop.com\nupghsbc.com\nupmedia.mg\nupornia.com\nuproxy.org\nuptodown.com\nuraban.me\nurbandictionary.com\nurbansurvival.com\nurchin.com\nurlborg.com\nurlparser.com\nusacn.com\nusaip.eu\nuscardforum.com\nuscg.mil\nuscnpm.org\nuse.typekit.net\nusercontent.goog\nusfk.mil\nusma.edu\nusno.navy.mil\nustibetcommittee.org\nustream.tv\nutopianpal.com\nuujiasu.com\nuukanshu.com\nuupool.cn\nuvwxyz.xyz\nuwants.com\nuyghur-j.org\nuyghuraa.org\nuyghuramerican.org\nuyghurbiz.org\nuyghurcongress.org\nuyghurpen.org\nuyghurstudies.org\nuyghurtribunal.com\nuygur.fc2web.com\nuymaarip.com\nv2.help\nv2.hysteria.network\nv2ex.com\nv2fly.org\nv2ray.com\nv2raycn.com\nvaleursactuelles.com\nvansky.com\nvaticannews.va\nvatn.org\nvcf-online.org\nvcfbuilder.org\nvegas.williamhill.com\nvegasred.com\nvenetianmacao.com\nventureswell.com\nvercel.app\nvern.cc\nverybs.com\nvevo.com\nvewas.net\nviber.com\nvictimsofcommunism.org\nvid.me\nvidble.com\nvideo.aol.com\nvideobam.com\nvideomega.tv\nvideopress.com\nvilanet.me\nvilavpn.com\nvimeo.com\nvimeocdn.com\nvimperator.org\nvincnd.com\nvine.co\nvinniev.com\nvip-enterprise.com\nvirtualrealporn.com\nviu.com\nviu.tv\nvivaldi.com\nvivthomas.com\nvjav.com\nvllcs.org\nvmixcore.com\nvmpsoft.com\nvnet.link\nvoacambodia.com\nvoacantonese.com\nvoachinese.com\nvoachineseblog.com\nvoaindonesia.com\nvoanews.com\nvoatibetan.com\nvoatibetanenglish.com\nvocaroo.com\nvocus.cc\nvod-abematv.akamaized.net\nvod.wwe.com\nvoicettank.org\nvot.org\nvovo2000.com\nvoxer.com\nvpl.bibliocommons.com\nvpn.ac\nvpn.cmu.edu\nvpn.net\nvpn.sv.cmu.edu\nvpn4all.com\nvpnaccount.org\nvpnaccounts.com\nvpncoupons.com\nvpncup.com\nvpndada.com\nvpnforgame.net\nvpngate.jp\nvpngate.net\nvpnhub.com\nvpninja.net\nvpnjack.com\nvpnmaster.com\nvpnmentor.com\nvpnpick.com\nvpnpop.com\nvpnpronet.com\nvpnproxymaster.com\nvpnreactor.com\nvpnreviewz.com\nvpnsecure.me\nvpnshazam.com\nvpnshieldapp.com\nvpntunnel.com\nvpnuk.info\nvpnunlimitedapp.com\nvpnvip.com\nvporn.com\nvpsxb.net\nvrchat.com\nvrporn.com\nvrsmash.com\nvtunnel.com\nvultryhw.com\nw-pool.com\nw3s.link\nwaffle1999.com\nwainao.me\nwalletconnect.com\nwalletconnect.org\nwallmama.com\nwallpapercasa.com\nwallsttv.com\nwallzhihu.com\nwaltermartin.com\nwaltermartin.org\nwanderinghorse.net\nwangafu.net\nwangjinbo.org\nwango.org\nwant-daily.com\nwanz-factory.com\nwarroom.org\nwaselpro.com\nwashingtonpost.com\nwatchinese.com\nwatchmygf.net\nwatchout.tw\nwattpad.com\nwav.tv\nwaveprotocol.org\nwaybig.com\nwaymo.com\nwd.bible\nwealth.com.tw\nwearn.com\nweb.dev\nweb2project.net\nwebmproject.org\nwebpkgcache.com\nwebrtc.org\nwebsdr.org\nwebsite.new\nwebwarper.net\nwechatlawsuit.com\nweebly.com\nwefightcensorship.org\nwego.here.com\nweights.com\nweijingsheng.org\nweiming.info\nweisuo.ws\nwelt.de\nwemigrate.org\nwengewang.org\nwenxuecity.com\nwenyunchao.com\nwenzhao.ca\nwestca.com\nwesternwolves.com\nwestpoint.edu\nwezone.net\nwforum.com\nwhatblocked.com\nwhatbrowser.org\nwhats.new\nwhatsapp.com\nwhatsapp.net\nwhatsonweibo.com\nwheelockslatin.com\nwhereiswerner.com\nwheretowatch.com\nwhispersystems.org\nwhoer.net\nwhyx.org\nwidevine.com\nwiki.gamerp.jp\nwiki.jqueryui.com\nwiki.metacubex.one\nwiki.oauth.net\nwiki.phonegap.com\nwikibooks.org\nwikidata.org\nwikileaks.ch\nwikileaks.com\nwikileaks.de\nwikileaks.eu\nwikileaks.lu\nwikileaks.org\nwikileaks.pl\nwikiless.funami.tech\nwikimapia.org\nwikimedia.org\nwikinews.org\nwikipedia.com\nwikipedia.org\nwikis.tw\nwikisource.org\nwikiunblocked.org\nwikiversity.org\nwikivoyage.org\nwikiwand.com\nwiktionary.org\nwillw.net\nwilsoncenter.org\nwindscribe.com\nwingamestore.com\nwingy.site\nwionews.com\nwire.com\nwiredbytes.com\nwiredpen.com\nwireguard.com\nwisevid.com\nwispbyte.com\nwithgoogle.com\nwithyoutube.com\nwitopia.net\nwizcrafts.net\nwjbk.org\nwmflabs.org\nwmfusercontent.org\nwn.com\nwnacg.com\nwnacg.org\nwo.tc\nwo3ttt.wordpress.com\nwoeser.com\nwokar.org\nwolfax.com\nwombo.ai\nwoolyss.com\nwoopie.jp\nwoopie.tv\nwordpress.com\nwork2icu.org\nworkatruna.com\nworkerempowerment.org\nworkers.dev\nworldvpn.net\nwowgirls.com\nwowhead.com\nwowporn.com\nwoyaolian.org\nwp.com\nwpoforum.com\nwritesonic.com\nwsj.com\nwsj.net\nwufafangwen.com\nwufi.org.tw\nwujieliulan.com\nwunderground.com\nwuw.red\nwwitv.com\nwww.ajsands.com\nwww.antd.org\nwww.aolnews.com\nwww.bing.com\nwww.clashverge.dev\nwww.cmoinc.org\nwww.dmm.com\nwww.eastturkistan.net\nwww.gmiddle.com\nwww.gmiddle.net\nwww.hoyolab.com\nwww.hustlercash.com\nwww.idlcoyote.com\nwww.kindleren.com\nwww.lorenzetti.com.br\nwww.m-sport.co.uk\nwww.monlamit.org\nwww.moztw.org\nwww.msn.com\nwww.oxid.it\nwww.powerpointninja.com\nwww.s4miniarchive.com\nwww.shadowsocks.com\nwww.skype.com\nwww.tablesgenerator.com\nwww.taiwanonline.cc\nwww.wan-press.org\nwww.websnapr.com\nwww.xicons.org\nwww.zensur.freerk.com\nwxw.cat\nwxw.moe\nx-art.com\nx-berry.com\nx-wall.org\nx.ai\nx.co\nx.com\nx.company\nx3guide.com\nxbabe.com\nxbookcn.com\nxbtce.com\nxcafe.in\nxcancel.com\nxcity.jp\nxdaforums.com\nxerotica.com\nxfinity.com\nxfxssr.me\nxgmyd.com\nxhamster.com\nxianjian.tw\nxiaohexie.com\nxiaolan.me\nxiaoma.org\nxiaomi.eu\nxiaxiaoqiang.net\nxijie.wordpress.com\nxing.com\nxinjiangpolicefiles.org\nxinmiao.com.hk\nxjtravelguide.com\nxm.com\nxml-training-guide.com\nxn--11xs86f.icu\nxn--1jqvh729avzfcy2d8ummib.com\nxn--4gq171p.com\nxn--9iqy04a7fi01l.com\nxn--9pr62r24a.com\nxn--czq75pvv1aj5c.org\nxn--i2ru8q2qg.com\nxn--kcrv3utim32hx9f6qe.com\nxn--ngstr-lra8j.com\nxn--noss43i.com\nxn--oiq.cc\nxn--p8j9a0d9c9a.xn--q9jyb4c\nxn--u2u927b.com\nxnpool.com\nxnxx.com\nxpud.org\nxsden.info\nxskywalker.com\nxt.com\nxt.pub\nxtube.com\nxuchao.net\nxuchao.org\nxuehua.us\nxvbelink.com\nxvideos-cdn.com\nxvideos.com\nxvideos.es\nxvinlink.com\nxxx.com\nxxx.xxx\nxxxx.com.au\nxxxymovies.com\ny2mate.com\nyadi.sk\nyahoo.com\nyahoo.com.hk\nyahoo.com.tw\nyakbutterblues.com\nyam.com\nyam.org.tw\nyande.re\nyangzhi.org\nyasni.co.uk\nyasukuni.or.jp\nyeahteentube.com\nyecl.net\nyeelou.com\nyeeyi.com\nyegle.net\nyes-news.com\nyes123.com.tw\nyesasia.com\nyesasia.com.hk\nyespornplease.com\nyeyeclub.com\nyfsp.tv\nyhcw.net\nyibaochina.com\nyidio.com\nyigeni.com\nyipub.com\nyizhihongxing.com\nyobit.net\nyobt.tv\nyogichen.org\nyou-get.org\nyou.com\nyoujizz.com\nyoumaker.com\nyoumind.com\nyoupai.org\nyouporn.com\nyouporngay.com\nyourepeat.com\nyourlisten.com\nyourlust.com\nyousendit.com\nyoutu.be\nyoutube-nocookie.com\nyoutube.com\nyoutubeeducation.com\nyoutubegaming.com\nyoutubekids.com\nyouversion.com\nyouwin.com\nyouxu.info\nyt.be\nytimg.com\nytn.co.kr\nyulghun.com\nyunchao.net\nyunomi.tokyo\nyvesgeleyn.com\nyyii.org\nyyjlymb.xyz\nyysub.net\nyzzk.com\nz-lib.fm\nz-lib.fo\nz-lib.gd\nz-lib.gl\nz-lib.io\nz-lib.org\nz-library.ec\nz-library.sk\nzalmos.com\nzamimg.com\nzaochenbao.com\nzattoo.com\nzb.com\nzdnet.com.tw\nzello.com\nzenmate.com\nzenmate.com.ru\nzerohedge.com\nzeronet.io\nzh-hans.cfsh99.com\nzh.ecdm.wikia.com\nzh.pokerstrategy.com\nzh.wikiquote.org\nzhangtianliang.com\nzhanlve.org\nzhao.1984.city\nzhengjian.org\nzhengwunet.org\nzhenxiang.biz\nzhizhu.top\nzhongguo.ca\nzhongguotese.net\nzhongzidi.com\nzhuatieba.com\nzhuichaguoji.org\nzi.media\nzillionk.com\nzim.vn\nzinio.com\nzmedia.com.tw\nzmw.cn\nzodgame.xyz\nzonaeuropa.com\nzonghexinwen.com\nzoogvpn.com\nzoominfo.com\nzooqle.com\nzootool.com\nzophar.net\nzorrovpn.com\nzozotown.com\nzpn.im\nzspeeder.me\nzuo.la\nzuobiao.me\nzuola.com\nzvereff.com\nzynamics.com\nzyxel.com\nzzcloud.me\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/resources/gfw_list.ver",
    "content": "202604232238\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/scripts/clean_log.sh",
    "content": "#!/bin/sh\n# SPDX-License-Identifier: GPL-2.0-only\n#\n# Copyright (C) 2022-2023 ImmortalWrt.org\n\nNAME=\"homeproxy\"\n\nlog_max_size=\"50\" #KB\nmain_log_file=\"/var/run/$NAME/$NAME.log\"\nsingc_log_file=\"/var/run/$NAME/sing-box-c.log\"\nsings_log_file=\"/var/run/$NAME/sing-box-s.log\"\n\nwhile true; do\n\tsleep 180\n\tfor i in \"$main_log_file\" \"$singc_log_file\" \"$sings_log_file\"; do\n\t\t[ -s \"$i\" ] || continue\n\t\t[ \"$(( $(ls -l \"$i\" | awk -F ' ' '{print $5}') / 1024 >= log_max_size))\" -eq \"0\" ] || echo \"\" > \"$i\"\n\tdone\ndone\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/scripts/firewall_post.ut",
    "content": "#!/usr/bin/utpl -S\n\n{%-\nimport { readfile } from 'fs';\nimport { cursor } from 'uci';\nimport { isEmpty } from '/etc/homeproxy/scripts/homeproxy.uc';\n\nconst fw4 = require('fw4');\n\nfunction array_to_nftarr(array) {\n\tif (type(array) !== 'array')\n\t\treturn null;\n\n\treturn `{ ${join(', ', uniq(array))} }`;\n}\n\nfunction resolve_ipv6(str) {\n\tif (isEmpty(str))\n\t\treturn null;\n\n\tlet ipv6 = fw4.parse_subnet(str)?.[0];\n\tif (!ipv6 || ipv6.family !== 6)\n\t\treturn null;\n\n\tif (ipv6.bits > -1)\n\t\treturn `${ipv6.addr}/${ipv6.bits}`;\n\telse\n\t\treturn `& ${ipv6.mask} == ${ipv6.addr}`;\n}\n\nfunction resolve_mark(str) {\n\tif (isEmpty(str))\n\t\treturn null;\n\n\tlet mark = fw4.parse_mark(str);\n\tif (isEmpty(mark))\n\t\treturn null;\n\n\tif (mark.mask === 0xffffffff)\n\t\treturn fw4.hex(mark.mark);\n\telse if (mark.mark === 0)\n\t\treturn `mark and ${fw4.hex(~mark.mask & 0xffffffff)}`;\n\telse if (mark.mark === mark.mask)\n\t\treturn `mark or ${fw4.hex(mark.mark)}`;\n\telse if (mark.mask === 0)\n\t\treturn `mark xor ${fw4.hex(mark.mark)}`;\n\telse\n\t\treturn `mark and ${fw4.hex(~mark.mask & 0xffffffff)} xor ${fw4.hex(mark.mark)}`;\n}\n\n/* Misc config */\nconst resources_dir = '/etc/homeproxy/resources';\n\n/* UCI config start */\nconst cfgname = 'homeproxy';\nconst uci = cursor();\nuci.load(cfgname);\n\nconst routing_mode = uci.get(cfgname, 'config', 'routing_mode') || 'bypass_mainland_china';\nlet outbound_node, outbound_udp_node, china_dns_server, bypass_cn_traffic;\n\nif (routing_mode !== 'custom') {\n\toutbound_node = uci.get(cfgname, 'config', 'main_node') || 'nil';\n\toutbound_udp_node = uci.get(cfgname, 'config', 'main_udp_node') || 'nil';\n\tchina_dns_server = uci.get(cfgname, 'config', 'china_dns_server');\n} else {\n\toutbound_node = uci.get(cfgname, 'routing', 'default_outbound') || 'nil';\n\tbypass_cn_traffic = uci.get(cfgname, 'routing', 'bypass_cn_traffic') || '0';\n}\n\nlet routing_port = uci.get(cfgname, 'config', 'routing_port');\nif (routing_port === 'common')\n\trouting_port = uci.get(cfgname, 'infra', 'common_port') || '22,53,80,143,443,465,587,853,873,993,995,8080,8443,9418';\n\nconst proxy_mode = uci.get(cfgname, 'config', 'proxy_mode') || 'redirect_tproxy',\n      ipv6_support = uci.get(cfgname, 'config', 'ipv6_support') || '0';\n\nlet self_mark, redirect_port,\n    tproxy_port, tproxy_mark,\n    tun_name, tun_mark;\n\nif (match(proxy_mode, /redirect/)) {\n\tself_mark = uci.get(cfgname, 'infra', 'self_mark') || '100';\n\tredirect_port = uci.get(cfgname, 'infra', 'redirect_port') || '5331';\n}\nif (match(proxy_mode, /tproxy/))\n\tif (outbound_udp_node !== 'nil' || routing_mode === 'custom') {\n\t\ttproxy_port = uci.get(cfgname, 'infra', 'tproxy_port') || '5332';\n\t\ttproxy_mark = resolve_mark(uci.get(cfgname, 'infra', 'tproxy_mark') || '101');\n\t}\nif (match(proxy_mode, /tun/)) {\n\ttun_name = uci.get(cfgname, 'infra', 'tun_name') || 'singtun0';\n\ttun_mark = resolve_mark(uci.get(cfgname, 'infra', 'tun_mark') || '102');\n}\n\nconst control_options = [\n\t\"listen_interfaces\", \"lan_proxy_mode\",\n\t\"lan_direct_mac_addrs\", \"lan_direct_ipv4_ips\", \"lan_direct_ipv6_ips\",\n\t\"lan_proxy_mac_addrs\", \"lan_proxy_ipv4_ips\", \"lan_proxy_ipv6_ips\",\n\t\"lan_gaming_mode_mac_addrs\", \"lan_gaming_mode_ipv4_ips\", \"lan_gaming_mode_ipv6_ips\",\n\t\"lan_global_proxy_mac_addrs\", \"lan_global_proxy_ipv4_ips\", \"lan_global_proxy_ipv6_ips\",\n\t\"wan_proxy_ipv4_ips\", \"wan_proxy_ipv6_ips\",\n\t\"wan_direct_ipv4_ips\", \"wan_direct_ipv6_ips\"\n];\nconst control_info = {};\n\nfor (let i in control_options)\n\tcontrol_info[i] = uci.get(cfgname, 'control', i);\n\nconst dns_redirect = uci.get(cfgname, 'infra', 'dns_redirect') || '1';\nconst dns_hijacked = uci.get('dhcp', '@dnsmasq[0]', 'dns_redirect') || '0',\n      dns_port = uci.get('dhcp', '@dnsmasq[0]', 'port') || '53';\n/* UCI config end */\n-%}\n\n{# Reserved addresses -#}\nset homeproxy_local_addr_v4 {\n\ttype ipv4_addr\n\tflags interval\n\tauto-merge\n\telements = {\n\t\t0.0.0.0/8,\n\t\t10.0.0.0/8,\n\t\t100.64.0.0/10,\n\t\t127.0.0.0/8,\n\t\t169.254.0.0/16,\n\t\t172.16.0.0/12,\n\t\t192.0.0.0/24,\n\t\t192.0.2.0/24,\n\t\t192.31.196.0/24,\n\t\t192.52.193.0/24,\n\t\t192.88.99.0/24,\n\t\t192.168.0.0/16,\n\t\t192.175.48.0/24,\n\t\t198.18.0.0/15,\n\t\t198.51.100.0/24,\n\t\t203.0.113.0/24,\n\t\t224.0.0.0/4,\n\t\t240.0.0.0/4\n\t}\n}\n{% if (ipv6_support === '1'): %}\nset homeproxy_local_addr_v6 {\n\ttype ipv6_addr\n\tflags interval\n\tauto-merge\n\telements = {\n\t\t::/128,\n\t\t::1/128,\n\t\t::ffff:0:0/96,\n\t\t100::/64,\n\t\t64:ff9b::/96,\n\t\t2001::/32,\n\t\t2001:10::/28,\n\t\t2001:20::/28,\n\t\t2001:db8::/28,\n\t\t2002::/16,\n\t\tfc00::/7,\n\t\tfe80::/10,\n\t\tff00::/8\n\t}\n}\n{% endif %}\n\n{% if (routing_mode === 'gfwlist'): %}\nset homeproxy_gfw_list_v4 {\n\ttype ipv4_addr\n\tflags interval\n\tauto-merge\n}\n{% if (ipv6_support === '1'): %}\nset homeproxy_gfw_list_v6 {\n\ttype ipv6_addr\n\tflags interval\n\tauto-merge\n}\n{% endif /* ipv6_support */ %}\n{% elif (match(routing_mode, /mainland_china/) || bypass_cn_traffic === '1'): %}\nset homeproxy_mainland_addr_v4 {\n\ttype ipv4_addr\n\tflags interval\n\tauto-merge\n\telements = {\n\t\t{% for (let cnip4 in split(trim(readfile(resources_dir + '/china_ip4.txt')), /[\\r\\n]/)): %}\n\t\t{{ cnip4 }},\n\t\t{% endfor %}\n\t}\n}\n{% if ((ipv6_support === '1') || china_dns_server): %}\nset homeproxy_mainland_addr_v6 {\n\ttype ipv6_addr\n\tflags interval\n\tauto-merge\n\telements = {\n\t\t{% for (let cnip6 in split(trim(readfile(resources_dir + '/china_ip6.txt')), /[\\r\\n]/)): %}\n\t\t{{ cnip6 }},\n\t\t{% endfor %}\n\t}\n}\n{% endif /* ipv6_support */ %}\n{% endif /* routing_mode */ %}\n\n{# WAN ACL addresses #}\nset homeproxy_wan_proxy_addr_v4 {\n\ttype ipv4_addr\n\tflags interval\n\tauto-merge\n{% if (control_info.wan_proxy_ipv4_ips): %}\n\telements = { {{ join(', ', control_info.wan_proxy_ipv4_ips) }} }\n{% endif %}\n}\n\n{% if (ipv6_support === '1'): %}\nset homeproxy_wan_proxy_addr_v6 {\n\ttype ipv6_addr\n\tflags interval\n\tauto-merge\n{% if (control_info.wan_proxy_ipv6_ips): %}\n\telements = { {{ join(', ', control_info.wan_proxy_ipv6_ips) }} }\n{% endif /* wan_proxy_ipv6_ips*/ %}\n}\n{% endif /* ipv6_support */ %}\n\nset homeproxy_wan_direct_addr_v4 {\n\ttype ipv4_addr\n\tflags interval\n\tauto-merge\n{% if (control_info.wan_direct_ipv4_ips): %}\n\telements = { {{ join(', ', control_info.wan_direct_ipv4_ips) }} }\n{% endif %}\n}\n\n{% if (ipv6_support === '1'): %}\nset homeproxy_wan_direct_addr_v6 {\n\ttype ipv6_addr\n\tflags interval\n\tauto-merge\n{% if (control_info.wan_direct_ipv6_ips): %}\n\telements = { {{ join(', ', control_info.wan_direct_ipv6_ips) }} }\n{% endif /* wan_direct_ipv6_ips */ %}\n}\n{% endif /* ipv6_support */ %}\n\n{% if (routing_port): %}\nset homeproxy_routing_port {\n\ttype inet_service\n\tflags interval\n\tauto-merge\n\telements = { {{ join(', ', split(routing_port, ',')) }} }\n}\n{% endif %}\n\n{# DNS hijack & TCP redirect #}\nchain dstnat {\n{% if ((dns_redirect === '1') && (dns_hijacked !== '1')): %}\n\t{% if (control_info.listen_interfaces): %}\n\tmeta iifname {{ array_to_nftarr(control_info.listen_interfaces) }}\n\t{%- endif /* listen_interfaces */ %}\n\tmeta nfproto { ipv4, ipv6 } udp dport 53 counter redirect to :{{ dns_port }} comment \"!{{ cfgname }}: DNS hijack\"\n{% endif /* dns_hijacked */ %}\n{% if (match(proxy_mode, /redirect/)): %}\n\tmeta nfproto { {{ (ipv6_support === '1') ? 'ipv4, ipv6' : 'ipv4' }} } meta l4proto tcp jump homeproxy_redirect_lanac\n{% endif /* proxy_mode */ %}\n}\n\n{# TCP redirect #}\n{% if (match(proxy_mode, /redirect/)): %}\nchain homeproxy_redirect_proxy {\n\tmeta l4proto tcp counter redirect to :{{ redirect_port }}\n}\n\nchain homeproxy_redirect_proxy_port {\n\t{% if (routing_port): %}\n\ttcp dport != @homeproxy_routing_port counter return\n\t{% endif %}\n\tgoto homeproxy_redirect_proxy\n}\n\nchain homeproxy_redirect_lanac {\n\t{% if (control_info.listen_interfaces): %}\n\tmeta iifname != {{ array_to_nftarr(control_info.listen_interfaces) }} counter return\n\t{% endif %}\n\tmeta mark {{ self_mark }} counter return\n\n\t{% if (control_info.lan_proxy_mode === 'listed_only'): %}\n\t{% if (!isEmpty(control_info.lan_proxy_ipv4_ips)): %}\n\tip saddr {{ array_to_nftarr(control_info.lan_proxy_ipv4_ips) }} counter goto homeproxy_redirect\n\t{% endif /* lan_proxy_ipv4_ips */ %}\n\t{% for (let ipv6 in control_info.lan_proxy_ipv6_ips): %}\n\tip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_redirect\n\t{% endfor /* lan_proxy_ipv6_ips */ %}\n\t{% if (!isEmpty(control_info.lan_proxy_mac_addrs)): %}\n\tether saddr {{ array_to_nftarr(control_info.lan_proxy_mac_addrs) }} counter goto homeproxy_redirect\n\t{% endif /* lan_proxy_mac_addrs */ %}\n\t{% elif (control_info.lan_proxy_mode === 'except_listed'): %}\n\t{% if (!isEmpty(control_info.lan_direct_ipv4_ips)): %}\n\tip saddr {{ array_to_nftarr(control_info.lan_direct_ipv4_ips) }} counter return\n\t{% endif /* lan_direct_ipv4_ips */ %}\n\t{% for (let ipv6 in control_info.lan_direct_ipv6_ips): %}\n\tip6 saddr {{ resolve_ipv6(ipv6) }} counter return\n\t{% endfor /* lan_direct_ipv6_ips */ %}\n\t{% if (!isEmpty(control_info.lan_direct_mac_addrs)): %}\n\tether saddr {{ array_to_nftarr(control_info.lan_direct_mac_addrs) }} counter return\n\t{% endif /* lan_direct_mac_addrs */ %}\n\t{% endif /* lan_proxy_mode */ %}\n\n\t{% if (control_info.lan_proxy_mode !== 'listed_only'): %}\n\tcounter goto homeproxy_redirect\n\t{% endif %}\n}\n\nchain homeproxy_redirect {\n\tmeta mark {{ self_mark }} counter return\n\n\tip daddr @homeproxy_wan_proxy_addr_v4 counter goto homeproxy_redirect_proxy_port\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr @homeproxy_wan_proxy_addr_v6 counter goto homeproxy_redirect_proxy_port\n\t{% endif %}\n\n\tip daddr @homeproxy_local_addr_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr @homeproxy_local_addr_v6 counter return\n\t{% endif %}\n\n\t{% if (routing_mode !== 'custom'): %}\n\t{% if (!isEmpty(control_info.lan_global_proxy_ipv4_ips)): %}\n\tip saddr {{ array_to_nftarr(control_info.lan_global_proxy_ipv4_ips) }} counter goto homeproxy_redirect_proxy_port\n\t{% endif /* lan_global_proxy_ipv4_ips */ %}\n\t{% for (let ipv6 in control_info.lan_global_proxy_ipv6_ips): %}\n\tip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_redirect_proxy_port\n\t{% endfor /* lan_global_proxy_ipv6_ips */ %}\n\t{% if (!isEmpty(control_info.lan_global_proxy_mac_addrs)): %}\n\tether saddr {{ array_to_nftarr(control_info.lan_global_proxy_mac_addrs) }} counter goto homeproxy_redirect_proxy_port\n\t{% endif /* lan_global_proxy_mac_addrs */ %}\n\t{% endif /* routing_mode */ %}\n\n\tip daddr @homeproxy_wan_direct_addr_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr @homeproxy_wan_direct_addr_v6 counter return\n\t{% endif /* ipv6_support */ %}\n\n\t{% if (routing_mode === 'gfwlist'): %}\n\tip daddr != @homeproxy_gfw_list_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr != @homeproxy_gfw_list_v6 counter return\n\t{% endif /* ipv6_support */ %}\n\t{% elif (routing_mode === 'bypass_mainland_china' || bypass_cn_traffic === '1'): %}\n\tip daddr @homeproxy_mainland_addr_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr @homeproxy_mainland_addr_v6 counter return\n\t{% endif /* ipv6_support */ %}\n\t{% elif (routing_mode === 'proxy_mainland_china'): %}\n\tip daddr != @homeproxy_mainland_addr_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr != @homeproxy_mainland_addr_v6 counter return\n\t{% endif /* ipv6_support */ %}\n\t{% endif /* routing_mode */ %}\n\n\t{% if (!isEmpty(control_info.lan_gaming_mode_ipv4_ips)): %}\n\tip saddr {{ array_to_nftarr(control_info.lan_gaming_mode_ipv4_ips) }} counter goto homeproxy_redirect_proxy\n\t{% endif /* lan_gaming_mode_ipv4_ips */ %}\n\t{% for (let ipv6 in control_info.lan_gaming_mode_ipv6_ips): %}\n\tip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_redirect_proxy\n\t{% endfor /* lan_gaming_mode_ipv6_ips */ %}\n\t{% if (!isEmpty(control_info.lan_gaming_mode_mac_addrs)): %}\n\tether saddr {{ array_to_nftarr(control_info.lan_gaming_mode_mac_addrs) }} counter goto homeproxy_redirect_proxy\n\t{% endif /* lan_gaming_mode_mac_addrs */ %}\n\n\tcounter goto homeproxy_redirect_proxy_port\n}\n\nchain homeproxy_output_redir {\n\ttype nat hook output priority filter -105; policy accept\n\tmeta nfproto { {{ (ipv6_support === '1') ? 'ipv4, ipv6' : 'ipv4' }} } meta l4proto tcp jump homeproxy_redirect\n}\n{% endif %}\n\n{# UDP tproxy #}\n{% if (match(proxy_mode, /tproxy/) && (outbound_udp_node !== 'nil' || routing_mode === 'custom')): %}\nchain homeproxy_mangle_tproxy {\n\tmeta l4proto udp meta mark set {{ tproxy_mark }} tproxy ip to 127.0.0.1:{{ tproxy_port }} counter accept\n\t{% if (ipv6_support === '1'): %}\n\tmeta l4proto udp meta mark set {{ tproxy_mark }} tproxy ip6 to [::1]:{{ tproxy_port }} counter accept\n\t{% endif %}\n}\n\nchain homeproxy_mangle_tproxy_port {\n\t{% if (routing_port): %}\n\tudp dport != @homeproxy_routing_port counter return\n\t{% endif %}\n\tgoto homeproxy_mangle_tproxy\n}\n\nchain homeproxy_mangle_mark {\n\t{% if (routing_port): %}\n\tudp dport != @homeproxy_routing_port counter return\n\t{% endif %}\n\tmeta l4proto udp meta mark set {{ tproxy_mark }} counter accept\n}\n\nchain homeproxy_mangle_lanac {\n\t{% if (control_info.listen_interfaces): %}\n\tmeta iifname != {{ array_to_nftarr(uniq([...control_info.listen_interfaces, ...['lo']])) }} counter return\n\t{% endif %}\n\tmeta iifname != lo udp dport 53 counter return\n\tmeta mark {{ self_mark }} counter return\n\n\t{% if (control_info.lan_proxy_mode === 'listed_only'): %}\n\t{% if (!isEmpty(control_info.lan_proxy_ipv4_ips)): %}\n\tip saddr {{ array_to_nftarr(control_info.lan_proxy_ipv4_ips) }} counter goto homeproxy_mangle_prerouting\n\t{% endif /* lan_proxy_ipv4_ips */ %}\n\t{% for (let ipv6 in control_info.lan_proxy_ipv6_ips): %}\n\tip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_mangle_prerouting\n\t{% endfor /* lan_proxy_ipv6_ips */ %}\n\t{% if (!isEmpty(control_info.lan_proxy_mac_addrs)): %}\n\tether saddr {{ array_to_nftarr(control_info.lan_proxy_mac_addrs) }} counter goto homeproxy_mangle_prerouting\n\t{% endif /* lan_proxy_mac_addrs */ %}\n\t{% elif (control_info.lan_proxy_mode === 'except_listed'): %}\n\t{% if (!isEmpty(control_info.lan_direct_ipv4_ips)): %}\n\tip saddr {{ array_to_nftarr(control_info.lan_direct_ipv4_ips) }} counter return\n\t{% endif /* lan_direct_ipv4_ips */ %}\n\t{% for (let ipv6 in control_info.lan_direct_ipv6_ips): %}\n\tip6 saddr {{ resolve_ipv6(ipv6) }} counter return\n\t{% endfor /* lan_direct_ipv6_ips */ %}\n\t{% if (!isEmpty(control_info.lan_direct_mac_addrs)): %}\n\tether saddr {{ array_to_nftarr(control_info.lan_direct_mac_addrs) }} counter return\n\t{% endif /* lan_direct_mac_addrs */ %}\n\t{% endif /* lan_proxy_mode */ %}\n\n\t{% if (control_info.lan_proxy_mode !== 'listed_only'): %}\n\tcounter goto homeproxy_mangle_prerouting\n\t{% endif %}\n}\n\nchain homeproxy_mangle_prerouting {\n\tip daddr @homeproxy_wan_proxy_addr_v4 counter goto homeproxy_mangle_tproxy_port\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr @homeproxy_wan_proxy_addr_v6 counter goto homeproxy_mangle_tproxy_port\n\t{% endif %}\n\n\tip daddr @homeproxy_local_addr_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr @homeproxy_local_addr_v6 counter return\n\t{% endif %}\n\n\t{% if (routing_mode !== 'custom'): %}\n\t{% if (!isEmpty(control_info.lan_global_proxy_ipv4_ips)): %}\n\tip saddr {{ array_to_nftarr(control_info.lan_global_proxy_ipv4_ips) }} counter goto homeproxy_mangle_tproxy_port\n\t{% endif /* lan_global_proxy_ipv4_ips */ %}\n\t{% for (let ipv6 in control_info.lan_global_proxy_ipv6_ips): %}\n\tip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_mangle_tproxy_port\n\t{% endfor /* lan_global_proxy_ipv6_ips */ %}\n\t{% if (!isEmpty(control_info.lan_global_proxy_mac_addrs)): %}\n\tether saddr {{ array_to_nftarr(control_info.lan_global_proxy_mac_addrs) }} counter goto homeproxy_mangle_tproxy_port\n\t{% endif /* lan_global_proxy_mac_addrs */ %}\n\t{% endif /* routing_mode */ %}\n\n\tip daddr @homeproxy_wan_direct_addr_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr @homeproxy_wan_direct_addr_v6 counter return\n\t{% endif /* ipv6_support */ %}\n\n\t{% if (routing_mode === 'gfwlist'): %}\n\tip daddr != @homeproxy_gfw_list_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr != @homeproxy_gfw_list_v6 counter return\n\t{% endif /* ipv6_support */ %}\n\tudp dport { 80, 443 } counter reject comment \"!{{ cfgname }}: Fuck you QUIC\"\n\t{% elif (routing_mode === 'bypass_mainland_china' || bypass_cn_traffic === '1'): %}\n\tip daddr @homeproxy_mainland_addr_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr @homeproxy_mainland_addr_v6 counter return\n\t{% endif /* ipv6_support */ %}\n\t{% if (routing_mode !== 'custom'): %}\n\tudp dport { 80, 443 } counter reject comment \"!{{ cfgname }}: Fuck you QUIC\"\n\t{% endif /* routing_mode */ %}\n\t{% elif (routing_mode === 'proxy_mainland_china'): %}\n\tip daddr != @homeproxy_mainland_addr_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr != @homeproxy_mainland_addr_v6 counter return\n\t{% endif /* ipv6_support */ %}\n\t{% endif /* routing_mode */ %}\n\n\t{% if (!isEmpty(control_info.lan_gaming_mode_ipv4_ips)): %}\n\tip saddr {{ array_to_nftarr(control_info.lan_gaming_mode_ipv4_ips) }} counter goto homeproxy_mangle_tproxy\n\t{% endif /* lan_gaming_mode_ipv4_ips */ %}\n\t{% for (let ipv6 in control_info.lan_gaming_mode_ipv6_ips): %}\n\tip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_mangle_tproxy\n\t{% endfor /* lan_gaming_mode_ipv6_ips */ %}\n\t{% if (!isEmpty(control_info.lan_gaming_mode_mac_addrs)): %}\n\tether saddr {{ array_to_nftarr(control_info.lan_gaming_mode_mac_addrs) }} counter goto homeproxy_mangle_tproxy\n\t{% endif /* lan_gaming_mode_mac_addrs */ %}\n\n\tcounter goto homeproxy_mangle_tproxy_port\n}\n\nchain homeproxy_mangle_output {\n\tmeta mark {{ self_mark }} counter return\n\n\tip daddr @homeproxy_wan_proxy_addr_v4 counter goto homeproxy_mangle_mark\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr @homeproxy_wan_proxy_addr_v6 counter goto homeproxy_mangle_mark\n\t{% endif %}\n\n\tip daddr @homeproxy_local_addr_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr @homeproxy_local_addr_v6 counter return\n\t{% endif %}\n\n\tip daddr @homeproxy_wan_direct_addr_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr @homeproxy_wan_direct_addr_v6 counter return\n\t{% endif /* ipv6_support */ %}\n\n\t{% if (routing_mode === 'gfwlist'): %}\n\tip daddr != @homeproxy_gfw_list_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr != @homeproxy_gfw_list_v6 counter return\n\t{% endif /* ipv6_support */ %}\n\t{% elif (routing_mode === 'bypass_mainland_china' || bypass_cn_traffic === '1'): %}\n\tip daddr @homeproxy_mainland_addr_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr @homeproxy_mainland_addr_v6 counter return\n\t{% endif /* ipv6_support */ %}\n\t{% elif (routing_mode === 'proxy_mainland_china'): %}\n\tip daddr != @homeproxy_mainland_addr_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr != @homeproxy_mainland_addr_v6 counter return\n\t{% endif /* ipv6_support */ %}\n\t{% endif /* routing_mode */ %}\n\n\tcounter goto homeproxy_mangle_mark\n}\n\nchain mangle_prerouting {\n\tmeta nfproto { {{ (ipv6_support === '1') ? 'ipv4, ipv6' : 'ipv4' }} } meta l4proto udp jump homeproxy_mangle_lanac\n}\n\nchain mangle_output {\n\tmeta nfproto { {{ (ipv6_support === '1') ? 'ipv4, ipv6' : 'ipv4' }} } meta l4proto udp jump homeproxy_mangle_output\n}\n{% endif %}\n\n{# TUN #}\n{% if (match(proxy_mode, /tun/)): %}\nchain homeproxy_mangle_lanac {\n\tiifname {{ tun_name }} counter return\n\tudp dport 53 counter return\n\n\t{% if (control_info.listen_interfaces): %}\n\tmeta iifname != {{ array_to_nftarr(control_info.listen_interfaces) }} counter return\n\t{% endif %}\n\n\t{% if (control_info.lan_proxy_mode === 'listed_only'): %}\n\t{% if (!isEmpty(control_info.lan_proxy_ipv4_ips)): %}\n\tip saddr {{ array_to_nftarr(control_info.lan_proxy_ipv4_ips) }} counter goto homeproxy_mangle_tun\n\t{% endif /* lan_proxy_ipv4_ips */ %}\n\t{% for (let ipv6 in control_info.lan_proxy_ipv6_ips): %}\n\tip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_mangle_tun\n\t{% endfor /* lan_proxy_ipv6_ips */ %}\n\t{% if (!isEmpty(control_info.lan_proxy_mac_addrs)): %}\n\tether saddr {{ array_to_nftarr(control_info.lan_proxy_mac_addrs) }} counter goto homeproxy_mangle_tun\n\t{% endif /* lan_proxy_mac_addrs */ %}\n\t{% elif (control_info.lan_proxy_mode === 'except_listed'): %}\n\t{% if (!isEmpty(control_info.lan_direct_ipv4_ips)): %}\n\tip saddr {{ array_to_nftarr(control_info.lan_direct_ipv4_ips) }} counter return\n\t{% endif /* lan_direct_ipv4_ips */ %}\n\t{% for (let ipv6 in control_info.lan_direct_ipv6_ips): %}\n\tip6 saddr {{ resolve_ipv6(ipv6) }} counter return\n\t{% endfor /* lan_direct_ipv6_ips */ %}\n\t{% if (!isEmpty(control_info.lan_direct_mac_addrs)): %}\n\tether saddr {{ array_to_nftarr(control_info.lan_direct_mac_addrs) }} counter return\n\t{% endif /* lan_direct_mac_addrs */ %}\n\t{% endif /* lan_proxy_mode */ %}\n\n\t{% if (control_info.lan_proxy_mode !== 'listed_only'): %}\n\tcounter goto homeproxy_mangle_tun\n\t{% endif %}\n}\n\nchain homeproxy_mangle_tun_mark {\n\t{% if (routing_port): %}\n\t{% if (proxy_mode === 'tun'): %}\n\ttcp dport != @homeproxy_routing_port counter return\n\t{% endif /* proxy_mode */ %}\n\tudp dport != @homeproxy_routing_port counter return\n\t{% endif /* routing_port */ %}\n\n\tcounter meta mark set {{ tun_mark }}\n}\n\nchain homeproxy_mangle_tun {\n\tiifname {{ tun_name }} counter return\n\n\tip daddr @homeproxy_wan_proxy_addr_v4 counter goto homeproxy_mangle_tun_mark\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr @homeproxy_wan_proxy_addr_v6 counter goto homeproxy_mangle_tun_mark\n\t{% endif %}\n\n\tip daddr @homeproxy_local_addr_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr @homeproxy_local_addr_v6 counter return\n\t{% endif %}\n\n\t{% if (routing_mode !== 'custom'): %}\n\t{% if (!isEmpty(control_info.lan_global_proxy_ipv4_ips)): %}\n\tip saddr {{ array_to_nftarr(control_info.lan_global_proxy_ipv4_ips) }} counter goto homeproxy_mangle_tun_mark\n\t{% endif /* lan_global_proxy_ipv4_ips */ %}\n\t{% for (let ipv6 in control_info.lan_global_proxy_ipv6_ips): %}\n\tip6 saddr {{ resolve_ipv6(ipv6) }} counter goto homeproxy_mangle_tun_mark\n\t{% endfor /* lan_global_proxy_ipv6_ips */ %}\n\t{% if (!isEmpty(control_info.lan_global_proxy_mac_addrs)): %}\n\tether saddr {{ array_to_nftarr(control_info.lan_global_proxy_mac_addrs) }} counter goto homeproxy_mangle_tun_mark\n\t{% endif /* lan_global_proxy_mac_addrs */ %}\n\t{% endif /* routing_mode */ %}\n\n\t{% if (control_info.wan_direct_ipv4_ips): %}\n\tip daddr {{ array_to_nftarr(control_info.wan_direct_ipv4_ips) }} counter return\n\t{% endif /* wan_direct_ipv4_ips */ %}\n\t{% if (control_info.wan_direct_ipv6_ips): %}\n\tip6 daddr {{ array_to_nftarr(control_info.wan_direct_ipv6_ips) }} counter return\n\t{% endif /* wan_direct_ipv6_ips */ %}\n\n\t{% if (routing_mode === 'gfwlist'): %}\n\tip daddr != @homeproxy_gfw_list_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr != @homeproxy_gfw_list_v6 counter return\n\t{% endif /* ipv6_support */ %}\n\tudp dport { 80, 443 } counter reject comment \"!{{ cfgname }}: Fuck you QUIC\"\n\t{% elif (routing_mode === 'bypass_mainland_china' || bypass_cn_traffic === '1'): %}\n\tip daddr @homeproxy_mainland_addr_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr @homeproxy_mainland_addr_v6 counter return\n\t{% endif /* ipv6_support */ %}\n\t{% if (routing_mode !== 'custom'): %}\n\tudp dport { 80, 443 } counter reject comment \"!{{ cfgname }}: Fuck you QUIC\"\n\t{% endif /* routing_mode */ %}\n\t{% elif (routing_mode === 'proxy_mainland_china'): %}\n\tip daddr != @homeproxy_mainland_addr_v4 counter return\n\t{% if (ipv6_support === '1'): %}\n\tip6 daddr != @homeproxy_mainland_addr_v6 counter return\n\t{% endif /* ipv6_support */ %}\n\t{% endif /* routing_mode */ %}\n\n\t{% if (!isEmpty(control_info.lan_gaming_mode_ipv4_ips)): %}\n\tip saddr {{ array_to_nftarr(control_info.lan_gaming_mode_ipv4_ips) }} counter meta mark set {{ tun_mark }}\n\t{% endif /* lan_gaming_mode_ipv4_ips */ %}\n\t{% for (let ipv6 in control_info.lan_gaming_mode_ipv6_ips): %}\n\tip6 saddr {{ resolve_ipv6(ipv6) }} counter meta mark set {{ tun_mark }}\n\t{% endfor /* lan_gaming_mode_ipv6_ips */ %}\n\t{% if (!isEmpty(control_info.lan_gaming_mode_mac_addrs)): %}\n\tether saddr {{ array_to_nftarr(control_info.lan_gaming_mode_mac_addrs) }} counter meta mark set {{ tun_mark }}\n\t{% endif /* lan_gaming_mode_mac_addrs */ %}\n\n\tcounter goto homeproxy_mangle_tun_mark\n}\n\nchain mangle_prerouting {\n\tmeta nfproto { {{ (ipv6_support === '1') ? 'ipv4, ipv6' : 'ipv4' }} } meta l4proto { {{ (proxy_mode === 'tun') ? 'tcp, udp' : 'udp' }} } jump homeproxy_mangle_lanac\n}\n\nchain mangle_output {\n\tmeta nfproto { {{ (ipv6_support === '1') ? 'ipv4, ipv6' : 'ipv4' }} } meta l4proto { {{ (proxy_mode === 'tun') ? 'tcp, udp' : 'udp' }} } jump homeproxy_mangle_tun\n}\n{% endif %}\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/scripts/firewall_pre.uc",
    "content": "#!/usr/bin/ucode\n\n'use strict';\n\nimport { writefile } from 'fs';\nimport { cursor } from 'uci';\nimport { isEmpty, RUN_DIR } from 'homeproxy';\n\nconst cfgname = 'homeproxy';\nconst uci = cursor();\nuci.load(cfgname);\n\nconst routing_mode = uci.get(cfgname, 'config', 'routing_mode') || 'bypass_mainland_china',\n      proxy_mode = uci.get(cfgname, 'config', 'proxy_mode') || 'redirect_tproxy';\n\nlet outbound_node, tun_name;\nif (match(proxy_mode, /tun/)) {\n\tif (routing_mode === 'custom')\n\t\toutbound_node = uci.get(cfgname, 'routing', 'default_outbound') || 'nil';\n\telse\n\t\toutbound_node = uci.get(cfgname, 'config', 'main_node') || 'nil';\n\n\tif (outbound_node !== 'nil')\n\t\ttun_name = uci.get(cfgname, 'infra', 'tun_name') || 'singtun0';\n}\n\nconst server_enabled = uci.get(cfgname, 'server', 'enabled');\n\nlet forward = [],\n    input = [];\n\nif (tun_name) {\n\tpush(forward, `oifname ${tun_name} counter accept comment \"!${cfgname}: accept tun forward\"`);\n\tpush(input ,`iifname ${tun_name} counter accept comment \"!${cfgname}: accept tun input\"`);\n}\n\nif (server_enabled === '1') {\n\tuci.foreach(cfgname, 'server', (s) => {\n\t\tif (s.enabled !== '1' || s.firewall !== '1')\n\t\t\treturn;\n\n\t\tlet proto = s.network || '{ tcp, udp }';\n\t\tpush(input, `meta l4proto ${proto} th dport ${s.port} counter accept comment \"!${cfgname}: accept server ${s['.name']}\"`);\n\t});\n}\n\nif (!isEmpty(forward))\n\twritefile(RUN_DIR + '/fw4_forward.nft', join('\\n', forward) + '\\n');\n\nif (!isEmpty(input))\n\twritefile(RUN_DIR + '/fw4_input.nft', join('\\n', input) + '\\n');\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/scripts/generate_client.uc",
    "content": "#!/usr/bin/ucode\n/*\n * SPDX-License-Identifier: GPL-2.0-only\n *\n * Copyright (C) 2023-2025 ImmortalWrt.org\n */\n\n'use strict';\n\nimport { readfile, writefile } from 'fs';\nimport { isnan } from 'math';\nimport { connect } from 'ubus';\nimport { cursor } from 'uci';\n\nimport {\n\tisEmpty, parseURL, strToBool, strToInt, strToTime,\n\tremoveBlankAttrs, validation, HP_DIR, RUN_DIR\n} from 'homeproxy';\n\nconst ubus = connect();\n\n/* const features = ubus.call('luci.homeproxy', 'singbox_get_features') || {}; */\n\n/* UCI config start */\nconst uci = cursor();\n\nconst uciconfig = 'homeproxy';\nuci.load(uciconfig);\n\nconst uciinfra = 'infra',\n      ucimain = 'config',\n      ucicontrol = 'control';\n\nconst ucidnssetting = 'dns',\n      ucidnsserver = 'dns_server',\n      ucidnsrule = 'dns_rule';\n\nconst uciroutingsetting = 'routing',\n      uciroutingnode = 'routing_node',\n      uciroutingrule = 'routing_rule';\n\nconst ucinode = 'node';\nconst uciruleset = 'ruleset';\n\nconst routing_mode = uci.get(uciconfig, ucimain, 'routing_mode') || 'bypass_mainland_china';\n\nlet wan_dns = ubus.call('network.interface', 'status', {'interface': 'wan'})?.['dns-server']?.[0];\nif (!wan_dns)\n\twan_dns = (routing_mode in ['proxy_mainland_china', 'global']) ? '8.8.8.8' : '223.5.5.5';\n\nconst dns_port = uci.get(uciconfig, uciinfra, 'dns_port') || '5333';\n\nconst ntp_server = uci.get(uciconfig, uciinfra, 'ntp_server') || 'time.apple.com';\n\nconst ipv6_support = uci.get(uciconfig, ucimain, 'ipv6_support') || '0';\n\nlet main_node, main_udp_node, dedicated_udp_node, default_outbound, default_outbound_dns,\n    domain_strategy, sniff_override, dns_server, china_dns_server, dns_default_strategy,\n    dns_default_server, dns_disable_cache, dns_disable_cache_expire, dns_independent_cache,\n    dns_client_subnet, cache_file_store_rdrc, cache_file_rdrc_timeout, direct_domain_list,\n    proxy_domain_list;\n\nif (routing_mode !== 'custom') {\n\tmain_node = uci.get(uciconfig, ucimain, 'main_node') || 'nil';\n\tmain_udp_node = uci.get(uciconfig, ucimain, 'main_udp_node') || 'nil';\n\tdedicated_udp_node = !isEmpty(main_udp_node) && !(main_udp_node in ['same', main_node]);\n\n\tdns_server = uci.get(uciconfig, ucimain, 'dns_server');\n\tif (isEmpty(dns_server) || dns_server === 'wan')\n\t\tdns_server = wan_dns;\n\n\tif (routing_mode === 'bypass_mainland_china') {\n\t\tchina_dns_server = uci.get(uciconfig, ucimain, 'china_dns_server');\n\t\tif (isEmpty(china_dns_server) || type(china_dns_server) !== 'string' || china_dns_server === 'wan')\n\t\t\tchina_dns_server = wan_dns;\n\t}\n\tdns_default_strategy = (ipv6_support !== '1') ? 'ipv4_only' : null;\n\n\tdirect_domain_list = trim(readfile(HP_DIR + '/resources/direct_list.txt'));\n\tif (direct_domain_list)\n\t\tdirect_domain_list = split(direct_domain_list, /[\\r\\n]/);\n\n\tproxy_domain_list = trim(readfile(HP_DIR + '/resources/proxy_list.txt'));\n\tif (proxy_domain_list)\n\t\tproxy_domain_list = split(proxy_domain_list, /[\\r\\n]/);\n\n\tsniff_override = uci.get(uciconfig, uciinfra, 'sniff_override') || '1';\n} else {\n\t/* DNS settings */\n\tdns_default_strategy = uci.get(uciconfig, ucidnssetting, 'default_strategy');\n\tdns_default_server = uci.get(uciconfig, ucidnssetting, 'default_server');\n\tdns_disable_cache = uci.get(uciconfig, ucidnssetting, 'disable_cache');\n\tdns_disable_cache_expire = uci.get(uciconfig, ucidnssetting, 'disable_cache_expire');\n\tdns_independent_cache = uci.get(uciconfig, ucidnssetting, 'independent_cache');\n\tdns_client_subnet = uci.get(uciconfig, ucidnssetting, 'client_subnet');\n\tcache_file_store_rdrc = uci.get(uciconfig, ucidnssetting, 'cache_file_store_rdrc'),\n\tcache_file_rdrc_timeout = uci.get(uciconfig, ucidnssetting, 'cache_file_rdrc_timeout');\n\n\t/* Routing settings */\n\tdefault_outbound = uci.get(uciconfig, uciroutingsetting, 'default_outbound') || 'nil';\n\tdefault_outbound_dns = uci.get(uciconfig, uciroutingsetting, 'default_outbound_dns') || 'default-dns';\n\tdomain_strategy = uci.get(uciconfig, uciroutingsetting, 'domain_strategy');\n\tsniff_override = uci.get(uciconfig, uciroutingsetting, 'sniff_override');\n}\n\nconst proxy_mode = uci.get(uciconfig, ucimain, 'proxy_mode') || 'redirect_tproxy',\n      default_interface = uci.get(uciconfig, ucicontrol, 'bind_interface');\n\nconst mixed_port = uci.get(uciconfig, uciinfra, 'mixed_port') || '5330';\n\nlet self_mark, redirect_port, tproxy_port, tun_name,\n    tun_addr4, tun_addr6, tun_mtu, tcpip_stack,\n    endpoint_independent_nat, udp_timeout;\n\nif (routing_mode === 'custom')\n\tudp_timeout = uci.get(uciconfig, uciroutingsetting, 'udp_timeout');\nelse\n\tudp_timeout = uci.get(uciconfig, 'infra', 'udp_timeout');\n\nif (match(proxy_mode, /redirect/)) {\n\tself_mark = uci.get(uciconfig, 'infra', 'self_mark') || '100';\n\tredirect_port = uci.get(uciconfig, 'infra', 'redirect_port') || '5331';\n}\nif (match(proxy_mode), /tproxy/)\n\tif (main_udp_node !== 'nil' || routing_mode === 'custom')\n\t\ttproxy_port = uci.get(uciconfig, 'infra', 'tproxy_port') || '5332';\nif (match(proxy_mode), /tun/) {\n\ttun_name = uci.get(uciconfig, uciinfra, 'tun_name') || 'singtun0';\n\ttun_addr4 = uci.get(uciconfig, uciinfra, 'tun_addr4') || '172.19.0.1/30';\n\ttun_addr6 = uci.get(uciconfig, uciinfra, 'tun_addr6') || 'fdfe:dcba:9876::1/126';\n\ttun_mtu = uci.get(uciconfig, uciinfra, 'tun_mtu') || '9000';\n\ttcpip_stack = 'system';\n\tif (routing_mode === 'custom') {\n\t\ttcpip_stack = uci.get(uciconfig, uciroutingsetting, 'tcpip_stack') || 'system';\n\t\tendpoint_independent_nat = uci.get(uciconfig, uciroutingsetting, 'endpoint_independent_nat');\n\t}\n}\n\nconst log_level = uci.get(uciconfig, ucimain, 'log_level') || 'warn';\n/* UCI config end */\n\n/* Config helper start */\nfunction parse_port(strport) {\n\tif (type(strport) !== 'array' || isEmpty(strport))\n\t\treturn null;\n\n\tlet ports = [];\n\tfor (let i in strport)\n\t\tpush(ports, int(i));\n\n\treturn ports;\n\n}\n\nfunction parse_dnsserver(server_addr, default_protocol) {\n\tif (isEmpty(server_addr))\n\t\treturn null;\n\n\tif (!match(server_addr, /:\\/\\//))\n\t\tserver_addr = (default_protocol || 'udp') + '://' + (validation('ip6addr', server_addr) ? `[${server_addr}]` : server_addr);\n\tserver_addr = parseURL(server_addr);\n\n\treturn {\n\t\ttype: server_addr.protocol,\n\t\tserver: server_addr.hostname,\n\t\tserver_port: strToInt(server_addr.port),\n\t\tpath: (server_addr.pathname !== '/') ? server_addr.pathname : null,\n\t}\n}\n\nfunction parse_dnsquery(strquery) {\n\tif (type(strquery) !== 'array' || isEmpty(strquery))\n\t\treturn null;\n\n\tlet querys = [];\n\tfor (let i in strquery)\n\t\tisnan(int(i)) ? push(querys, i) : push(querys, int(i));\n\n\treturn querys;\n\n}\n\nfunction generate_endpoint(node) {\n\tif (type(node) !== 'object' || isEmpty(node))\n\t\treturn null;\n\n\tconst endpoint = {\n\t\ttype: node.type,\n\t\ttag: 'cfg-' + node['.name'] + '-out',\n\t\taddress: node.wireguard_local_address,\n\t\tmtu: strToInt(node.wireguard_mtu),\n\t\tprivate_key: node.wireguard_private_key,\n\t\tpeers: (node.type === 'wireguard') ? [\n\t\t\t{\n\t\t\t\taddress: node.address,\n\t\t\t\tport: strToInt(node.port),\n\t\t\t\tallowed_ips: [\n\t\t\t\t\t'0.0.0.0/0',\n\t\t\t\t\t'::/0'\n\t\t\t\t],\n\t\t\t\tpersistent_keepalive_interval: strToInt(node.wireguard_persistent_keepalive_interval),\n\t\t\t\tpublic_key: node.wireguard_peer_public_key,\n\t\t\t\tpre_shared_key: node.wireguard_pre_shared_key,\n\t\t\t\treserved: parse_port(node.wireguard_reserved),\n\t\t\t}\n\t\t] : null,\n\t\tsystem: (node.type === 'wireguard') ? false : null,\n\t\ttcp_fast_open: strToBool(node.tcp_fast_open),\n\t\ttcp_multi_path: strToBool(node.tcp_multi_path),\n\t\tudp_fragment: strToBool(node.udp_fragment)\n\t};\n\n\treturn endpoint;\n}\n\nfunction generate_outbound(node) {\n\tif (type(node) !== 'object' || isEmpty(node))\n\t\treturn null;\n\n\tconst outbound = {\n\t\ttype: node.type,\n\t\ttag: 'cfg-' + node['.name'] + '-out',\n\t\trouting_mark: strToInt(self_mark),\n\n\t\tserver: node.address,\n\t\tserver_port: strToInt(node.port),\n\t\t/* Hysteria(2) */\n\t\tserver_ports: node.hysteria_hopping_port,\n\n\t\tusername: (node.type !== 'ssh') ? node.username : null,\n\t\tuser: (node.type === 'ssh') ? node.username : null,\n\t\tpassword: node.password,\n\n\t\t/* Direct */\n\t\toverride_address: node.override_address,\n\t\toverride_port: strToInt(node.override_port),\n\t\tproxy_protocol: strToInt(node.proxy_protocol),\n\t\t/* AnyTLS */\n\t\tidle_session_check_interval: strToTime(node.anytls_idle_session_check_interval),\n\t\tidle_session_timeout: strToTime(node.anytls_idle_session_timeout),\n\t\tmin_idle_session: strToInt(node.anytls_min_idle_session),\n\t\t/* Hysteria (2) */\n\t\thop_interval: strToTime(node.hysteria_hop_interval),\n\t\tup_mbps: strToInt(node.hysteria_up_mbps),\n\t\tdown_mbps: strToInt(node.hysteria_down_mbps),\n\t\tobfs: node.hysteria_obfs_type ? {\n\t\t\ttype: node.hysteria_obfs_type,\n\t\t\tpassword: node.hysteria_obfs_password\n\t\t} : node.hysteria_obfs_password,\n\t\tauth: (node.hysteria_auth_type === 'base64') ? node.hysteria_auth_payload : null,\n\t\tauth_str: (node.hysteria_auth_type === 'string') ? node.hysteria_auth_payload : null,\n\t\trecv_window_conn: strToInt(node.hysteria_recv_window_conn),\n\t\trecv_window: strToInt(node.hysteria_revc_window),\n\t\tdisable_mtu_discovery: strToBool(node.hysteria_disable_mtu_discovery),\n\t\t/* Shadowsocks */\n\t\tmethod: node.shadowsocks_encrypt_method,\n\t\tplugin: node.shadowsocks_plugin,\n\t\tplugin_opts: node.shadowsocks_plugin_opts,\n\t\t/* ShadowTLS / Socks */\n\t\tversion: (node.type === 'shadowtls') ? strToInt(node.shadowtls_version) : ((node.type === 'socks') ? node.socks_version : null),\n\t\t/* SSH */\n\t\tclient_version: node.ssh_client_version,\n\t\thost_key: node.ssh_host_key,\n\t\thost_key_algorithms: node.ssh_host_key_algo,\n\t\tprivate_key: node.ssh_priv_key,\n\t\tprivate_key_passphrase: node.ssh_priv_key_pp,\n\t\t/* Tuic */\n\t\tuuid: node.uuid,\n\t\tcongestion_control: node.tuic_congestion_control,\n\t\tudp_relay_mode: node.tuic_udp_relay_mode,\n\t\tudp_over_stream: strToBool(node.tuic_udp_over_stream),\n\t\tzero_rtt_handshake: strToBool(node.tuic_enable_zero_rtt),\n\t\theartbeat: strToTime(node.tuic_heartbeat),\n\t\t/* VLESS / VMess */\n\t\tflow: node.vless_flow,\n\t\talter_id: strToInt(node.vmess_alterid),\n\t\tsecurity: node.vmess_encrypt,\n\t\tglobal_padding: strToBool(node.vmess_global_padding),\n\t\tauthenticated_length: strToBool(node.vmess_authenticated_length),\n\t\tpacket_encoding: node.packet_encoding,\n\n\t\tmultiplex: (node.multiplex === '1') ? {\n\t\t\tenabled: true,\n\t\t\tprotocol: node.multiplex_protocol,\n\t\t\tmax_connections: strToInt(node.multiplex_max_connections),\n\t\t\tmin_streams: strToInt(node.multiplex_min_streams),\n\t\t\tmax_streams: strToInt(node.multiplex_max_streams),\n\t\t\tpadding: strToBool(node.multiplex_padding),\n\t\t\tbrutal: (node.multiplex_brutal === '1') ? {\n\t\t\t\tenabled: true,\n\t\t\t\tup_mbps: strToInt(node.multiplex_brutal_up),\n\t\t\t\tdown_mbps: strToInt(node.multiplex_brutal_down)\n\t\t\t} : null\n\t\t} : null,\n\t\ttls: (node.tls === '1') ? {\n\t\t\tenabled: true,\n\t\t\tserver_name: node.tls_sni,\n\t\t\tinsecure: strToBool(node.tls_insecure),\n\t\t\talpn: node.tls_alpn,\n\t\t\tmin_version: node.tls_min_version,\n\t\t\tmax_version: node.tls_max_version,\n\t\t\tcipher_suites: node.tls_cipher_suites,\n\t\t\tcertificate_path: node.tls_cert_path,\n\t\t\tech: (node.tls_ech === '1') ? {\n\t\t\t\tenabled: true,\n\t\t\t\tconfig: node.tls_ech_config,\n\t\t\t\tconfig_path: node.tls_ech_config_path\n\t\t\t} : null,\n\t\t\tutls: !isEmpty(node.tls_utls) ? {\n\t\t\t\tenabled: true,\n\t\t\t\tfingerprint: node.tls_utls\n\t\t\t} : null,\n\t\t\treality: (node.tls_reality === '1') ? {\n\t\t\t\tenabled: true,\n\t\t\t\tpublic_key: node.tls_reality_public_key,\n\t\t\t\tshort_id: node.tls_reality_short_id\n\t\t\t} : null\n\t\t} : null,\n\t\ttransport: !isEmpty(node.transport) ? {\n\t\t\ttype: node.transport,\n\t\t\thost: node.http_host || node.httpupgrade_host,\n\t\t\tpath: node.http_path || node.ws_path,\n\t\t\theaders: node.ws_host ? {\n\t\t\t\tHost: node.ws_host\n\t\t\t} : null,\n\t\t\tmethod: node.http_method,\n\t\t\tmax_early_data: strToInt(node.websocket_early_data),\n\t\t\tearly_data_header_name: node.websocket_early_data_header,\n\t\t\tservice_name: node.grpc_servicename,\n\t\t\tidle_timeout: (node.http_idle_timeout),\n\t\t\tping_timeout: (node.http_ping_timeout),\n\t\t\tpermit_without_stream: strToBool(node.grpc_permit_without_stream)\n\t\t} : null,\n\t\tudp_over_tcp: (node.udp_over_tcp === '1') ? {\n\t\t\tenabled: true,\n\t\t\tversion: strToInt(node.udp_over_tcp_version)\n\t\t} : null,\n\t\ttcp_fast_open: strToBool(node.tcp_fast_open),\n\t\ttcp_multi_path: strToBool(node.tcp_multi_path),\n\t\tudp_fragment: strToBool(node.udp_fragment)\n\t};\n\n\treturn outbound;\n}\n\nfunction get_outbound(cfg) {\n\tif (isEmpty(cfg))\n\t\treturn null;\n\n\tif (type(cfg) === 'array') {\n\t\tif ('any-out' in cfg)\n\t\t\treturn 'any';\n\n\t\tlet outbounds = [];\n\t\tfor (let i in cfg)\n\t\t\tpush(outbounds, get_outbound(i));\n\t\treturn outbounds;\n\t} else {\n\t\tswitch (cfg) {\n\t\tcase 'block-out':\n\t\tcase 'direct-out':\n\t\t\treturn cfg;\n\t\tdefault:\n\t\t\tconst node = uci.get(uciconfig, cfg, 'node');\n\t\t\tif (isEmpty(node))\n\t\t\t\tdie(sprintf(\"%s's node is missing, please check your configuration.\", cfg));\n\t\t\telse if (node === 'urltest')\n\t\t\t\treturn 'cfg-' + cfg + '-out';\n\t\t\telse\n\t\t\t\treturn 'cfg-' + node + '-out';\n\t\t}\n\t}\n}\n\nfunction get_resolver(cfg) {\n\tif (isEmpty(cfg))\n\t\treturn null;\n\n\tswitch (cfg) {\n\tcase 'default-dns':\n\tcase 'system-dns':\n\t\treturn cfg;\n\tdefault:\n\t\treturn 'cfg-' + cfg + '-dns';\n\t}\n}\n\nfunction get_ruleset(cfg) {\n\tif (isEmpty(cfg))\n\t\treturn null;\n\n\tlet rules = [];\n\tfor (let i in cfg)\n\t\tpush(rules, isEmpty(i) ? null : 'cfg-' + i + '-rule');\n\treturn rules;\n}\n/* Config helper end */\n\nconst config = {};\n\n/* Log */\nconfig.log = {\n\tdisabled: false,\n\tlevel: log_level,\n\toutput: RUN_DIR + '/sing-box-c.log',\n\ttimestamp: true\n};\n\n/* NTP */\nif (!isEmpty(ntp_server))\n\tconfig.ntp = {\n\t\tenabled: true,\n\t\tserver: ntp_server,\n\t\tdetour: 'direct-out',\n\t\tdomain_resolver: 'default-dns',\n\t};\n\n/* DNS start */\n/* Default settings */\nconfig.dns = {\n\tservers: [\n\t\t{\n\t\t\ttag: 'default-dns',\n\t\t\ttype: 'udp',\n\t\t\tserver: wan_dns,\n\t\t\tdetour: self_mark ? 'direct-out' : null\n\t\t},\n\t\t{\n\t\t\ttag: 'system-dns',\n\t\t\ttype: 'local',\n\t\t\tdetour: self_mark ? 'direct-out' : null\n\t\t}\n\t],\n\trules: [],\n\tstrategy: dns_default_strategy,\n\tdisable_cache: strToBool(dns_disable_cache),\n\tdisable_expire: strToBool(dns_disable_cache_expire),\n\tindependent_cache: strToBool(dns_independent_cache),\n\tclient_subnet: dns_client_subnet\n};\n\nif (!isEmpty(main_node)) {\n\t/* Main DNS */\n\tpush(config.dns.servers, {\n\t\ttag: 'main-dns',\n\t\tdomain_resolver: {\n\t\t\tserver: 'default-dns',\n\t\t\tstrategy: (ipv6_support !== '1') ? 'ipv4_only' : null\n\t\t},\n\t\tdetour: 'main-out',\n\t\t...parse_dnsserver(dns_server, 'tcp')\n\t});\n\tconfig.dns.final = 'main-dns';\n\n\tif (length(direct_domain_list))\n\t\tpush(config.dns.rules, {\n\t\t\trule_set: 'direct-domain',\n\t\t\taction: 'route',\n\t\t\tserver: (routing_mode === 'bypass_mainland_china') ? 'china-dns' : 'default-dns'\n\t\t});\n\n\t/* Filter out SVCB/HTTPS queries for \"exquisite\" Apple devices */\n\tif (routing_mode === 'gfwlist' || length(proxy_domain_list))\n\t\tpush(config.dns.rules, {\n\t\t\trule_set: (routing_mode !== 'gfwlist') ? 'proxy-domain' : null,\n\t\t\tquery_type: [64, 65],\n\t\t\taction: 'reject'\n\t\t});\n\n\tif (routing_mode === 'bypass_mainland_china') {\n\t\tpush(config.dns.servers, {\n\t\t\ttag: 'china-dns',\n\t\t\tdomain_resolver: {\n\t\t\t\tserver: 'default-dns',\n\t\t\t\tstrategy: 'prefer_ipv6'\n\t\t\t},\n\t\t\tdetour: self_mark ? 'direct-out' : null,\n\t\t\t...parse_dnsserver(china_dns_server)\n\t\t});\n\n\t\tif (length(proxy_domain_list))\n\t\t\tpush(config.dns.rules, {\n\t\t\t\trule_set: 'proxy-domain',\n\t\t\t\taction: 'route',\n\t\t\t\tserver: 'main-dns'\n\t\t\t});\n\n\t\tpush(config.dns.rules, {\n\t\t\trule_set: 'geosite-cn',\n\t\t\taction: 'route',\n\t\t\tserver: 'china-dns',\n\t\t\tstrategy: 'prefer_ipv6'\n\t\t});\n\t\tpush(config.dns.rules, {\n\t\t\ttype: 'logical',\n\t\t\tmode: 'and',\n\t\t\trules: [\n\t\t\t\t{\n\t\t\t\t\trule_set: 'geosite-noncn',\n\t\t\t\t\tinvert: true\n\t\t\t\t},\n\t\t\t\t{\n\t\t\t\t\trule_set: 'geoip-cn'\n\t\t\t\t}\n\t\t\t],\n\t\t\taction: 'route',\n\t\t\tserver: 'china-dns',\n\t\t\tstrategy: 'prefer_ipv6'\n\t\t});\n\t}\n} else if (!isEmpty(default_outbound)) {\n\t/* DNS servers */\n\tuci.foreach(uciconfig, ucidnsserver, (cfg) => {\n\t\tif (cfg.enabled !== '1')\n\t\t\treturn;\n\n\t\tlet outbound = get_outbound(cfg.outbound);\n\t\tif (outbound === 'direct-out' && isEmpty(self_mark))\n\t\t\toutbound = null;\n\n\t\tpush(config.dns.servers, {\n\t\t\ttag: 'cfg-' + cfg['.name'] + '-dns',\n\t\t\ttype: cfg.type,\n\t\t\tserver: cfg.server,\n\t\t\tserver_port: strToInt(cfg.server_port),\n\t\t\tpath: cfg.path,\n\t\t\theaders: cfg.headers,\n\t\t\ttls: cfg.tls_sni ? {\n\t\t\t\tenabled: true,\n\t\t\t\tserver_name: cfg.tls_sni\n\t\t\t} : null,\n\t\t\tdomain_resolver: (cfg.address_resolver || cfg.address_strategy) ? {\n\t\t\t\tserver: get_resolver(cfg.address_resolver || dns_default_server),\n\t\t\t\tstrategy: cfg.address_strategy\n\t\t\t} : null,\n\t\t\tdetour: outbound\n\t\t});\n\t});\n\n\t/* DNS rules */\n\tuci.foreach(uciconfig, ucidnsrule, (cfg) => {\n\t\tif (cfg.enabled !== '1')\n\t\t\treturn;\n\n\t\tpush(config.dns.rules, {\n\t\t\tip_version: strToInt(cfg.ip_version),\n\t\t\tquery_type: parse_dnsquery(cfg.query_type),\n\t\t\tnetwork: cfg.network,\n\t\t\tprotocol: cfg.protocol,\n\t\t\tdomain: cfg.domain,\n\t\t\tdomain_suffix: cfg.domain_suffix,\n\t\t\tdomain_keyword: cfg.domain_keyword,\n\t\t\tdomain_regex: cfg.domain_regex,\n\t\t\tport: parse_port(cfg.port),\n\t\t\tport_range: cfg.port_range,\n\t\t\tsource_ip_cidr: cfg.source_ip_cidr,\n\t\t\tsource_ip_is_private: strToBool(cfg.source_ip_is_private),\n\t\t\tip_cidr: cfg.ip_cidr,\n\t\t\tip_is_private: strToBool(cfg.ip_is_private),\n\t\t\tsource_port: parse_port(cfg.source_port),\n\t\t\tsource_port_range: cfg.source_port_range,\n\t\t\tprocess_name: cfg.process_name,\n\t\t\tprocess_path: cfg.process_path,\n\t\t\tprocess_path_regex: cfg.process_path_regex,\n\t\t\tuser: cfg.user,\n\t\t\trule_set: get_ruleset(cfg.rule_set),\n\t\t\trule_set_ip_cidr_match_source: strToBool(cfg.rule_set_ip_cidr_match_source),\n\t\t\tinvert: strToBool(cfg.invert),\n\t\t\toutbound: get_outbound(cfg.outbound),\n\t\t\taction: cfg.action,\n\t\t\tserver: get_resolver(cfg.server),\n\t\t\tstrategy: cfg.domain_strategy,\n\t\t\tdisable_cache: strToBool(cfg.dns_disable_cache),\n\t\t\trewrite_ttl: strToInt(cfg.rewrite_ttl),\n\t\t\tclient_subnet: cfg.client_subnet,\n\t\t\tmethod: cfg.reject_method,\n\t\t\tno_drop: strToBool(cfg.reject_no_drop),\n\t\t\trcode: cfg.predefined_rcode,\n\t\t\tanswer: cfg.predefined_answer,\n\t\t\tns: cfg.predefined_ns,\n\t\t\textra: cfg.predefined_extra\n\t\t});\n\t});\n\n\tif (isEmpty(config.dns.rules))\n\t\tconfig.dns.rules = null;\n\n\tconfig.dns.final = get_resolver(dns_default_server);\n}\n/* DNS end */\n\n/* Inbound start */\nconfig.inbounds = [];\n\npush(config.inbounds, {\n\ttype: 'direct',\n\ttag: 'dns-in',\n\tlisten: '::',\n\tlisten_port: int(dns_port)\n});\n\npush(config.inbounds, {\n\ttype: 'mixed',\n\ttag: 'mixed-in',\n\tlisten: '::',\n\tlisten_port: int(mixed_port),\n\tudp_timeout: strToTime(udp_timeout),\n\tsniff: true,\n\tsniff_override_destination: strToBool(sniff_override),\n\tset_system_proxy: false\n});\n\nif (match(proxy_mode, /redirect/))\n\tpush(config.inbounds, {\n\t\ttype: 'redirect',\n\t\ttag: 'redirect-in',\n\n\t\tlisten: '::',\n\t\tlisten_port: int(redirect_port),\n\t\tsniff: true,\n\t\tsniff_override_destination: strToBool(sniff_override)\n\t});\nif (match(proxy_mode, /tproxy/))\n\tpush(config.inbounds, {\n\t\ttype: 'tproxy',\n\t\ttag: 'tproxy-in',\n\n\t\tlisten: '::',\n\t\tlisten_port: int(tproxy_port),\n\t\tnetwork: 'udp',\n\t\tudp_timeout: strToTime(udp_timeout),\n\t\tsniff: true,\n\t\tsniff_override_destination: strToBool(sniff_override)\n\t});\nif (match(proxy_mode, /tun/))\n\tpush(config.inbounds, {\n\t\ttype: 'tun',\n\t\ttag: 'tun-in',\n\n\t\tinterface_name: tun_name,\n\t\taddress: (ipv6_support === '1') ? [tun_addr4, tun_addr6] : [tun_addr4],\n\t\tmtu: strToInt(tun_mtu),\n\t\tauto_route: false,\n\t\tendpoint_independent_nat: strToBool(endpoint_independent_nat),\n\t\tudp_timeout: strToTime(udp_timeout),\n\t\tstack: tcpip_stack,\n\t\tsniff: true,\n\t\tsniff_override_destination: strToBool(sniff_override)\n\t});\n/* Inbound end */\n\n/* Outbound start */\nconfig.endpoints = [];\n\n/* Default outbounds */\nconfig.outbounds = [\n\t{\n\t\ttype: 'direct',\n\t\ttag: 'direct-out',\n\t\trouting_mark: strToInt(self_mark)\n\t},\n\t{\n\t\ttype: 'block',\n\t\ttag: 'block-out'\n\t}\n];\n\n/* Main outbounds */\nif (!isEmpty(main_node)) {\n\tlet urltest_nodes = [];\n\n\tif (main_node === 'urltest') {\n\t\tconst main_urltest_nodes = uci.get(uciconfig, ucimain, 'main_urltest_nodes') || [];\n\t\tconst main_urltest_interval = uci.get(uciconfig, ucimain, 'main_urltest_interval');\n\t\tconst main_urltest_tolerance = uci.get(uciconfig, ucimain, 'main_urltest_tolerance');\n\n\t\tpush(config.outbounds, {\n\t\t\ttype: 'urltest',\n\t\t\ttag: 'main-out',\n\t\t\toutbounds: map(main_urltest_nodes, (k) => `cfg-${k}-out`),\n\t\t\tinterval: strToTime(main_urltest_interval),\n\t\t\ttolerance: strToInt(main_urltest_tolerance),\n\t\t\tidle_timeout: (strToInt(main_urltest_interval) > 1800) ? `${main_urltest_interval * 2}s` : null,\n\t\t});\n\t\turltest_nodes = main_urltest_nodes;\n\t} else {\n\t\tconst main_node_cfg = uci.get_all(uciconfig, main_node) || {};\n\t\tif (main_node_cfg.type === 'wireguard') {\n\t\t\tpush(config.endpoints, generate_endpoint(main_node_cfg));\n\t\t\tconfig.endpoints[length(config.endpoints)-1].tag = 'main-out';\n\t\t} else {\n\t\t\tpush(config.outbounds, generate_outbound(main_node_cfg));\n\t\t\tconfig.outbounds[length(config.outbounds)-1].tag = 'main-out';\n\t\t}\n\t}\n\n\tif (main_udp_node === 'urltest') {\n\t\tconst main_udp_urltest_nodes = uci.get(uciconfig, ucimain, 'main_udp_urltest_nodes') || [];\n\t\tconst main_udp_urltest_interval = uci.get(uciconfig, ucimain, 'main_udp_urltest_interval');\n\t\tconst main_udp_urltest_tolerance = uci.get(uciconfig, ucimain, 'main_udp_urltest_tolerance');\n\n\t\tpush(config.outbounds, {\n\t\t\ttype: 'urltest',\n\t\t\ttag: 'main-udp-out',\n\t\t\toutbounds: map(main_udp_urltest_nodes, (k) => `cfg-${k}-out`),\n\t\t\tinterval: strToTime(main_udp_urltest_interval),\n\t\t\ttolerance: strToInt(main_udp_urltest_tolerance),\n\t\t\tidle_timeout: (strToInt(main_udp_urltest_interval) > 1800) ? `${main_udp_urltest_interval * 2}s` : null,\n\t\t});\n\t\turltest_nodes = [...urltest_nodes, ...filter(main_udp_urltest_nodes, (l) => !~index(urltest_nodes, l))];\n\t} else if (dedicated_udp_node) {\n\t\tconst main_udp_node_cfg = uci.get_all(uciconfig, main_udp_node) || {};\n\t\tif (main_udp_node_cfg.type === 'wireguard') {\n\t\t\tpush(config.endpoints, generate_endpoint(main_udp_node_cfg));\n\t\t\tconfig.endpoints[length(config.endpoints)-1].tag = 'main-udp-out';\n\t\t} else {\n\t\t\tpush(config.outbounds, generate_outbound(main_udp_node_cfg));\n\t\t\tconfig.outbounds[length(config.outbounds)-1].tag = 'main-udp-out';\n\t\t}\n\t}\n\n\tfor (let i in urltest_nodes) {\n\t\tconst urltest_node = uci.get_all(uciconfig, i) || {};\n\t\tif (urltest_node.type === 'wireguard') {\n\t\t\tpush(config.endpoints, generate_endpoint(urltest_node));\n\t\t\tconfig.endpoints[length(config.endpoints)-1].tag = 'cfg-' + i + '-out';\n\t\t} else {\n\t\t\tpush(config.outbounds, generate_outbound(urltest_node));\n\t\t\tconfig.outbounds[length(config.outbounds)-1].tag = 'cfg-' + i + '-out';\n\t\t}\n\t}\n} else if (!isEmpty(default_outbound)) {\n\tlet urltest_nodes = [],\n\t    routing_nodes = [];\n\n\tuci.foreach(uciconfig, uciroutingnode, (cfg) => {\n\t\tif (cfg.enabled !== '1')\n\t\t\treturn;\n\n\t\tif (cfg.node === 'urltest') {\n\t\t\tpush(config.outbounds, {\n\t\t\t\ttype: 'urltest',\n\t\t\t\ttag: 'cfg-' + cfg['.name'] + '-out',\n\t\t\t\toutbounds: map(cfg.urltest_nodes, (k) => `cfg-${k}-out`),\n\t\t\t\turl: cfg.urltest_url,\n\t\t\t\tinterval: strToTime(cfg.urltest_interval),\n\t\t\t\ttolerance: strToInt(cfg.urltest_tolerance),\n\t\t\t\tidle_timeout: strToTime(cfg.urltest_idle_timeout),\n\t\t\t\tinterrupt_exist_connections: strToBool(cfg.urltest_interrupt_exist_connections)\n\t\t\t});\n\t\t\turltest_nodes = [...urltest_nodes, ...filter(cfg.urltest_nodes, (l) => !~index(urltest_nodes, l))];\n\t\t} else {\n\t\t\tconst outbound = uci.get_all(uciconfig, cfg.node) || {};\n\t\t\tif (outbound.type === 'wireguard') {\n\t\t\t\tpush(config.endpoints, generate_endpoint(outbound));\n\t\t\t\tconfig.endpoints[length(config.endpoints)-1].bind_interface = cfg.bind_interface;\n\t\t\t\tconfig.endpoints[length(config.endpoints)-1].detour = get_outbound(cfg.outbound);\n\t\t\t\tif (cfg.domain_resolver)\n\t\t\t\t\tconfig.endpoints[length(config.endpoints)-1].domain_resolver = {\n\t\t\t\t\t\tserver: get_resolver(cfg.domain_resolver),\n\t\t\t\t\t\tstrategy: cfg.domain_strategy\n\t\t\t\t\t};\n\t\t\t} else {\n\t\t\t\tpush(config.outbounds, generate_outbound(outbound));\n\t\t\t\tconfig.outbounds[length(config.outbounds)-1].bind_interface = cfg.bind_interface;\n\t\t\t\tconfig.outbounds[length(config.outbounds)-1].detour = get_outbound(cfg.outbound);\n\t\t\t\tif (cfg.domain_resolver)\n\t\t\t\t\tconfig.outbounds[length(config.outbounds)-1].domain_resolver = {\n\t\t\t\t\t\tserver: get_resolver(cfg.domain_resolver),\n\t\t\t\t\t\tstrategy: cfg.domain_strategy\n\t\t\t\t\t};\n\t\t\t}\n\t\t\tpush(routing_nodes, cfg.node);\n\t\t}\n\t});\n\n\tfor (let i in filter(urltest_nodes, (l) => !~index(routing_nodes, l))) {\n\t\tconst urltest_node = uci.get_all(uciconfig, i) || {};\n\t\tif (urltest_node.type === 'wireguard')\n\t\t\tpush(config.endpoints, generate_endpoint(urltest_node));\n\t\telse\n\t\t\tpush(config.outbounds, generate_outbound(urltest_node));\n\t}\n}\n\nif (isEmpty(config.endpoints))\n\tconfig.endpoints = null;\n/* Outbound end */\n\n/* Routing rules start */\n/* Default settings */\nconfig.route = {\n\trules: [\n\t\t{\n\t\t\tinbound: 'dns-in',\n\t\t\taction: 'hijack-dns'\n\t\t}\n\t\t/*\n\t\t * leave for sing-box 1.13.0\n\t\t * {\n\t\t * \taction: 'sniff'\n\t\t * }\n\t\t */\n\t],\n\trule_set: [],\n\tauto_detect_interface: isEmpty(default_interface) ? true : null,\n\tdefault_interface: default_interface\n};\n\n/* Routing rules */\nif (!isEmpty(main_node)) {\n\t/* Avoid DNS loop */\n\tconfig.route.default_domain_resolver = {\n\t\taction: 'route',\n\t\tserver: (routing_mode === 'bypass_mainland_china') ? 'china-dns' : 'default-dns',\n\t\tstrategy: (ipv6_support !== '1') ? 'prefer_ipv4' : null\n\t};\n\n\t/* Direct list */\n\tif (length(direct_domain_list))\n\t\tpush(config.route.rules, {\n\t\t\trule_set: 'direct-domain',\n\t\t\taction: 'route',\n\t\t\toutbound: 'direct-out'\n\t\t});\n\n\t/* Main UDP out */\n\tif (dedicated_udp_node)\n\t\tpush(config.route.rules, {\n\t\t\tnetwork: 'udp',\n\t\t\taction: 'route',\n\t\t\toutbound: 'main-udp-out'\n\t\t});\n\n\tconfig.route.final = 'main-out';\n\n\t/* Rule set */\n\t/* Direct list */\n\tif (length(direct_domain_list))\n\t\tpush(config.route.rule_set, {\n\t\t\ttype: 'inline',\n\t\t\ttag: 'direct-domain',\n\t\t\trules: [\n\t\t\t\t{\n\t\t\t\t\tdomain_keyword: direct_domain_list,\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\n\t/* Proxy list */\n\tif (length(proxy_domain_list))\n\t\tpush(config.route.rule_set, {\n\t\t\ttype: 'inline',\n\t\t\ttag: 'proxy-domain',\n\t\t\trules: [\n\t\t\t\t{\n\t\t\t\t\tdomain_keyword: proxy_domain_list,\n\t\t\t\t}\n\t\t\t]\n\t\t});\n\n\tif (routing_mode === 'bypass_mainland_china') {\n\t\tpush(config.route.rule_set, {\n\t\t\ttype: 'remote',\n\t\t\ttag: 'geoip-cn',\n\t\t\tformat: 'binary',\n\t\t\turl: 'https://fastly.jsdelivr.net/gh/1715173329/IPCIDR-CHINA@rule-set/cn.srs',\n\t\t\tdownload_detour: 'main-out'\n\t\t});\n\t\tpush(config.route.rule_set, {\n\t\t\ttype: 'remote',\n\t\t\ttag: 'geosite-cn',\n\t\t\tformat: 'binary',\n\t\t\turl: 'https://fastly.jsdelivr.net/gh/1715173329/sing-geosite@rule-set-unstable/geosite-geolocation-cn.srs',\n\t\t\tdownload_detour: 'main-out'\n\t\t});\n\t\tpush(config.route.rule_set, {\n\t\t\ttype: 'remote',\n\t\t\ttag: 'geosite-noncn',\n\t\t\tformat: 'binary',\n\t\t\turl: 'https://fastly.jsdelivr.net/gh/1715173329/sing-geosite@rule-set-unstable/geosite-geolocation-!cn.srs',\n\t\t\tdownload_detour: 'main-out'\n\t\t});\n\t}\n\n\tif (isEmpty(config.route.rule_set))\n\t\tconfig.route.rule_set = null;\n} else if (!isEmpty(default_outbound)) {\n\tconfig.route.default_domain_resolver = {\n\t\taction: 'resolve',\n\t\tserver: get_resolver(default_outbound_dns)\n\t};\n\n\tif (domain_strategy)\n\t\tpush(config.route.rules, {\n\t\t\taction: 'resolve',\n\t\t\tstrategy: domain_strategy\n\t\t});\n\n\tuci.foreach(uciconfig, uciroutingrule, (cfg) => {\n\t\tif (cfg.enabled !== '1')\n\t\t\treturn null;\n\n\t\tpush(config.route.rules, {\n\t\t\tip_version: strToInt(cfg.ip_version),\n\t\t\tprotocol: cfg.protocol,\n\t\t\tnetwork: cfg.network,\n\t\t\tdomain: cfg.domain,\n\t\t\tdomain_suffix: cfg.domain_suffix,\n\t\t\tdomain_keyword: cfg.domain_keyword,\n\t\t\tdomain_regex: cfg.domain_regex,\n\t\t\tsource_ip_cidr: cfg.source_ip_cidr,\n\t\t\tsource_ip_is_private: strToBool(cfg.source_ip_is_private),\n\t\t\tip_cidr: cfg.ip_cidr,\n\t\t\tip_is_private: strToBool(cfg.ip_is_private),\n\t\t\tsource_port: parse_port(cfg.source_port),\n\t\t\tsource_port_range: cfg.source_port_range,\n\t\t\tport: parse_port(cfg.port),\n\t\t\tport_range: cfg.port_range,\n\t\t\tprocess_name: cfg.process_name,\n\t\t\tprocess_path: cfg.process_path,\n\t\t\tprocess_path_regex: cfg.process_path_regex,\n\t\t\tuser: cfg.user,\n\t\t\trule_set: get_ruleset(cfg.rule_set),\n\t\t\trule_set_ip_cidr_match_source: strToBool(cfg.rule_set_ip_cidr_match_source),\n\t\t\trule_set_ip_cidr_accept_empty: strToBool(cfg.rule_set_ip_cidr_accept_empty),\n\t\t\tinvert: strToBool(cfg.invert),\n\t\t\taction: cfg.action,\n\t\t\toutbound: get_outbound(cfg.outbound),\n\t\t\toverride_address: cfg.override_address,\n\t\t\toverride_port: strToInt(cfg.override_port),\n\t\t\tudp_disable_domain_unmapping: strToBool(cfg.udp_disable_domain_unmapping),\n\t\t\tudp_connect: strToBool(cfg.udp_connect),\n\t\t\tudp_timeout: strToTime(cfg.udp_timeout),\n\t\t\ttls_fragment: strToBool(cfg.tls_fragment),\n\t\t\ttls_fragment_fallback_delay: strToTime(cfg.tls_fragment_fallback_delay),\n\t\t\ttls_record_fragment: strToBool(cfg.tls_record_fragment)\n\t\t});\n\t});\n\n\tconfig.route.final = get_outbound(default_outbound);\n\n\t/* Rule set */\n\tuci.foreach(uciconfig, uciruleset, (cfg) => {\n\t\tif (cfg.enabled !== '1')\n\t\t\treturn null;\n\n\t\tpush(config.route.rule_set, {\n\t\t\ttype: cfg.type,\n\t\t\ttag: 'cfg-' + cfg['.name'] + '-rule',\n\t\t\tformat: cfg.format,\n\t\t\tpath: cfg.path,\n\t\t\turl: cfg.url,\n\t\t\tdownload_detour: get_outbound(cfg.outbound),\n\t\t\tupdate_interval: cfg.update_interval\n\t\t});\n\t});\n}\n/* Routing rules end */\n\n/* Experimental start */\nif (routing_mode in ['bypass_mainland_china', 'custom']) {\n\tconfig.experimental = {\n\t\tcache_file: {\n\t\t\tenabled: true,\n\t\t\tpath: RUN_DIR + '/cache.db',\n\t\t\tstore_rdrc: strToBool(cache_file_store_rdrc),\n\t\t\trdrc_timeout: strToTime(cache_file_rdrc_timeout),\n\t\t}\n\t};\n}\n/* Experimental end */\n\nsystem('mkdir -p ' + RUN_DIR);\nwritefile(RUN_DIR + '/sing-box-c.json', sprintf('%.J\\n', removeBlankAttrs(config)));\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/scripts/generate_server.uc",
    "content": "#!/usr/bin/ucode\n/*\n * SPDX-License-Identifier: GPL-2.0-only\n *\n * Copyright (C) 2023 ImmortalWrt.org\n */\n\n'use strict';\n\nimport { writefile } from 'fs';\nimport { cursor } from 'uci';\n\nimport {\n\tisEmpty, strToBool, strToInt, strToTime,\n\tremoveBlankAttrs, HP_DIR, RUN_DIR\n} from 'homeproxy';\n\n/* UCI config start */\nconst uci = cursor();\n\nconst uciconfig = 'homeproxy';\nuci.load(uciconfig);\n\nconst uciserver = 'server';\n\nconst log_level = uci.get(uciconfig, uciserver, 'log_level') || 'warn';\n/* UCI config end */\n\nconst config = {};\n\n/* Log */\nconfig.log = {\n\tdisabled: false,\n\tlevel: log_level,\n\toutput: RUN_DIR + '/sing-box-s.log',\n\ttimestamp: true\n};\n\nconfig.inbounds = [];\n\nuci.foreach(uciconfig, uciserver, (cfg) => {\n\tif (cfg.enabled !== '1')\n\t\treturn;\n\n\tpush(config.inbounds, {\n\t\ttype: cfg.type,\n\t\ttag: 'cfg-' + cfg['.name'] + '-in',\n\n\t\tlisten: cfg.address || '::',\n\t\tlisten_port: strToInt(cfg.port),\n\t\tbind_interface: cfg.bind_interface,\n\t\treuse_addr: strToBool(cfg.reuse_addr),\n\t\ttcp_fast_open: strToBool(cfg.tcp_fast_open),\n\t\ttcp_multi_path: strToBool(cfg.tcp_multi_path),\n\t\tudp_fragment: strToBool(cfg.udp_fragment),\n\t\tudp_timeout: strToTime(cfg.udp_timeout),\n\t\tnetwork: cfg.network,\n\n\t\t/* AnyTLS */\n\t\tpadding_scheme: cfg.anytls_padding_scheme,\n\n\t\t/* Hysteria */\n\t\tup_mbps: strToInt(cfg.hysteria_up_mbps),\n\t\tdown_mbps: strToInt(cfg.hysteria_down_mbps),\n\t\tobfs: cfg.hysteria_obfs_type ? {\n\t\t\ttype: cfg.hysteria_obfs_type,\n\t\t\tpassword: cfg.hysteria_obfs_password\n\t\t} : cfg.hysteria_obfs_password,\n\t\trecv_window_conn: strToInt(cfg.hysteria_recv_window_conn),\n\t\trecv_window_client: strToInt(cfg.hysteria_revc_window_client),\n\t\tmax_conn_client: strToInt(cfg.hysteria_max_conn_client),\n\t\tdisable_mtu_discovery: strToBool(cfg.hysteria_disable_mtu_discovery),\n\t\tignore_client_bandwidth: strToBool(cfg.hysteria_ignore_client_bandwidth),\n\t\tmasquerade: cfg.hysteria_masquerade,\n\n\t\t/* Shadowsocks */\n\t\tmethod: (cfg.type === 'shadowsocks') ? cfg.shadowsocks_encrypt_method : null,\n\t\tpassword: (cfg.type in ['shadowsocks', 'shadowtls']) ? cfg.password : null,\n\n\t\t/* Tuic */\n\t\tcongestion_control: cfg.tuic_congestion_control,\n\t\tauth_timeout: strToTime(cfg.tuic_auth_timeout),\n\t\tzero_rtt_handshake: strToBool(cfg.tuic_enable_zero_rtt),\n\t\theartbeat: strToTime(cfg.tuic_heartbeat),\n\n\t\t/* AnyTLS / HTTP / Hysteria (2) / Mixed / Socks / Trojan / Tuic / VLESS / VMess */\n\t\tusers: (cfg.type !== 'shadowsocks') ? [\n\t\t\t{\n\t\t\t\tname: !(cfg.type in ['http', 'mixed', 'naive', 'socks']) ? 'cfg-' + cfg['.name'] + '-server' : null,\n\t\t\t\tusername: cfg.username,\n\t\t\t\tpassword: cfg.password,\n\n\t\t\t\t/* Hysteria */\n\t\t\t\tauth: (cfg.hysteria_auth_type === 'base64') ? cfg.hysteria_auth_payload : null,\n\t\t\t\tauth_str: (cfg.hysteria_auth_type === 'string') ? cfg.hysteria_auth_payload : null,\n\n\t\t\t\t/* Tuic */\n\t\t\t\tuuid: cfg.uuid,\n\n\t\t\t\t/* VLESS / VMess */\n\t\t\t\tflow: cfg.vless_flow,\n\t\t\t\talterId: strToInt(cfg.vmess_alterid)\n\t\t\t}\n\t\t] : null,\n\n\t\tmultiplex: (cfg.multiplex === '1') ? {\n\t\t\tenabled: true,\n\t\t\tpadding: strToBool(cfg.multiplex_padding),\n\t\t\tbrutal: (cfg.multiplex_brutal === '1') ? {\n\t\t\t\tenabled: true,\n\t\t\t\tup_mbps: strToInt(cfg.multiplex_brutal_up),\n\t\t\t\tdown_mbps: strToInt(cfg.multiplex_brutal_down)\n\t\t\t} : null\n\t\t} : null,\n\n\t\ttls: (cfg.tls === '1') ? {\n\t\t\tenabled: true,\n\t\t\tserver_name: cfg.tls_sni,\n\t\t\talpn: cfg.tls_alpn,\n\t\t\tmin_version: cfg.tls_min_version,\n\t\t\tmax_version: cfg.tls_max_version,\n\t\t\tcipher_suites: cfg.tls_cipher_suites,\n\t\t\tcertificate_path: cfg.tls_cert_path,\n\t\t\tkey_path: cfg.tls_key_path,\n\t\t\tacme: (cfg.tls_acme === '1') ? {\n\t\t\t\tdomain: cfg.tls_acme_domain,\n\t\t\t\tdata_directory: HP_DIR + '/certs',\n\t\t\t\tdefault_server_name: cfg.tls_acme_dsn,\n\t\t\t\temail: cfg.tls_acme_email,\n\t\t\t\tprovider: cfg.tls_acme_provider,\n\t\t\t\tdisable_http_challenge: strToBool(cfg.tls_acme_dhc),\n\t\t\t\tdisable_tls_alpn_challenge: (cfg.tls_acme_dtac),\n\t\t\t\talternative_http_port: strToInt(cfg.tls_acme_ahp),\n\t\t\t\talternative_tls_port: strToInt(cfg.tls_acme_atp),\n\t\t\t\texternal_account: (cfg.tls_acme_external_account === '1') ? {\n\t\t\t\t\tkey_id: cfg.tls_acme_ea_keyid,\n\t\t\t\t\tmac_key: cfg.tls_acme_ea_mackey\n\t\t\t\t} : null,\n\t\t\t\tdns01_challenge: (cfg.tls_dns01_challenge === '1') ? {\n\t\t\t\t\tprovider: cfg.tls_dns01_provider,\n\t\t\t\t\taccess_key_id: cfg.tls_dns01_ali_akid,\n\t\t\t\t\taccess_key_secret: cfg.tls_dns01_ali_aksec,\n\t\t\t\t\tregion_id: cfg.tls_dns01_ali_rid,\n\t\t\t\t\tapi_token: cfg.tls_dns01_cf_api_token\n\t\t\t\t} : null\n\t\t\t} : null,\n\t\t\tech: (cfg.tls_ech_key) ? {\n\t\t\t\tenabled: true,\n\t\t\t\tkey: split(cfg.tls_ech_key, '\\n'),\n\t\t\t\t// config: split(cfg.tls_ech_config, '\\n')\n\t\t\t} : null,\n\t\t\treality: (cfg.tls_reality === '1') ? {\n\t\t\t\tenabled: true,\n\t\t\t\tprivate_key: cfg.tls_reality_private_key,\n\t\t\t\tshort_id: cfg.tls_reality_short_id,\n\t\t\t\tmax_time_difference: strToTime(cfg.tls_reality_max_time_difference),\n\t\t\t\thandshake: {\n\t\t\t\t\tserver: cfg.tls_reality_server_addr,\n\t\t\t\t\tserver_port: strToInt(cfg.tls_reality_server_port)\n\t\t\t\t\t}\n\t\t\t} : null\n\t\t} : null,\n\n\t\ttransport: !isEmpty(cfg.transport) ? {\n\t\t\ttype: cfg.transport,\n\t\t\thost: cfg.http_host || cfg.httpupgrade_host,\n\t\t\tpath: cfg.http_path || cfg.ws_path,\n\t\t\theaders: cfg.ws_host ? {\n\t\t\t\tHost: cfg.ws_host\n\t\t\t} : null,\n\t\t\tmethod: cfg.http_method,\n\t\t\tmax_early_data: strToInt(cfg.websocket_early_data),\n\t\t\tearly_data_header_name: cfg.websocket_early_data_header,\n\t\t\tservice_name: cfg.grpc_servicename,\n\t\t\tidle_timeout: strToTime(cfg.http_idle_timeout),\n\t\t\tping_timeout: strToTime(cfg.http_ping_timeout)\n\t\t} : null\n\t});\n});\n\nif (length(config.inbounds) === 0)\n\texit(1);\n\nsystem('mkdir -p ' + RUN_DIR);\nwritefile(RUN_DIR + '/sing-box-s.json', sprintf('%.J\\n', removeBlankAttrs(config)));\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/scripts/homeproxy.uc",
    "content": "/*\n * SPDX-License-Identifier: GPL-2.0-only\n *\n * Copyright (C) 2023 ImmortalWrt.org\n */\n\nimport { mkstemp } from 'fs';\nimport { urldecode_params } from 'luci.http';\n\n/* Global variables start */\nexport const HP_DIR = '/etc/homeproxy';\nexport const RUN_DIR = '/var/run/homeproxy';\n/* Global variables end */\n\n/* Utilities start */\n/* Kanged from luci-app-commands */\nexport function shellQuote(s) {\n\treturn `'${replace(s, \"'\", \"'\\\\''\")}'`;\n};\n\nexport function isBinary(str) {\n\tfor (let off = 0, byte = ord(str); off < length(str); byte = ord(str, ++off))\n\t\tif (byte <= 8 || (byte >= 14 && byte <= 31))\n\t\t\treturn true;\n\n\treturn false;\n};\n\nexport function executeCommand(...args) {\n\tlet outfd = mkstemp();\n\tlet errfd = mkstemp();\n\n\tconst exitcode = system(`${join(' ', args)} >&${outfd.fileno()} 2>&${errfd.fileno()}`);\n\n\toutfd.seek(0);\n\terrfd.seek(0);\n\n\tconst stdout = outfd.read(1024 * 512) ?? '';\n\tconst stderr = errfd.read(1024 * 512) ?? '';\n\n\toutfd.close();\n\terrfd.close();\n\n\tconst binary = isBinary(stdout);\n\n\treturn {\n\t\tcommand: join(' ', args),\n\t\tstdout: binary ? null : stdout,\n\t\tstderr,\n\t\texitcode,\n\t\tbinary\n\t};\n};\n\nexport function getTime(epoch) {\n\tconst local_time = localtime(epoch);\n\treturn replace(replace(sprintf(\n\t\t'%d-%2d-%2d@%2d:%2d:%2d',\n\t\tlocal_time.year,\n\t\tlocal_time.mon,\n\t\tlocal_time.mday,\n\t\tlocal_time.hour,\n\t\tlocal_time.min,\n\t\tlocal_time.sec\n\t), ' ', '0'), '@', ' ');\n\n};\n\nexport function wGET(url, ua) {\n\tif (!url || type(url) !== 'string')\n\t\treturn null;\n\n\tif (!ua)\n\t\tua = 'Wget/1.21 (HomeProxy, like v2rayN)';\n\n\tconst output = executeCommand(`/usr/bin/wget -qO- --user-agent ${shellQuote(ua)} --timeout=10 ${shellQuote(url)}`) || {};\n\treturn trim(output.stdout);\n};\n/* Utilities end */\n\n/* String helper start */\nexport function isEmpty(res) {\n\treturn !res || res === 'nil' || (type(res) in ['array', 'object'] && length(res) === 0);\n};\n\nexport function strToBool(str) {\n\treturn (str === '1') || null;\n};\n\nexport function strToInt(str) {\n\treturn !isEmpty(str) ? (int(str) || null) : null;\n};\n\nexport function strToTime(str) {\n\treturn !isEmpty(str) ? (str + 's') : null;\n};\n\nexport function removeBlankAttrs(res) {\n\tlet content;\n\n\tif (type(res) === 'object') {\n\t\tcontent = {};\n\t\tmap(keys(res), (k) => {\n\t\t\tif (type(res[k]) in ['array', 'object'])\n\t\t\t\tcontent[k] = removeBlankAttrs(res[k]);\n\t\t\telse if (res[k] !== null && res[k] !== '')\n\t\t\t\tcontent[k] = res[k];\n\t\t});\n\t} else if (type(res) === 'array') {\n\t\tcontent = [];\n\t\tmap(res, (k, i) => {\n\t\t\tif (type(k) in ['array', 'object'])\n\t\t\t\tpush(content, removeBlankAttrs(k));\n\t\t\telse if (k !== null && k !== '')\n\t\t\t\tpush(content, k);\n\t\t});\n\t} else\n\t\treturn res;\n\n\treturn content;\n};\n\nexport function validateHostname(hostname) {\n\treturn (match(hostname, /^[a-zA-Z0-9_]+$/) != null ||\n\t\t(match(hostname, /^[a-zA-Z0-9_][a-zA-Z0-9_%-.]*[a-zA-Z0-9]$/) &&\n\t\t\tmatch(hostname, /[^0-9.]/)));\n};\n\nexport function validation(datatype, data) {\n\tif (!datatype || !data)\n\t\treturn null;\n\n\tconst ret = system(`/sbin/validate_data ${shellQuote(datatype)} ${shellQuote(data)} 2>/dev/null`);\n\treturn (ret === 0);\n};\n/* String helper end */\n\n/* String parser start */\nexport function decodeBase64Str(str) {\n\tif (isEmpty(str))\n\t\treturn null;\n\n\tstr = trim(str);\n\tstr = replace(str, '_', '/');\n\tstr = replace(str, '-', '+');\n\n\tconst padding = length(str) % 4;\n\tif (padding)\n\t\tstr = str + substr('====', padding);\n\n\treturn b64dec(str);\n};\n\nexport function parseURL(url) {\n\tif (type(url) !== 'string')\n\t\treturn null;\n\n\tconst services = {\n\t\thttp: '80',\n\t\thttps: '443'\n\t};\n\n\tconst objurl = {};\n\n\tobjurl.href = url;\n\n\turl = replace(url, /#(.+)$/, (_, val) => {\n\t\tobjurl.hash = val;\n\t\treturn '';\n\t});\n\n\turl = replace(url, /^(\\w[A-Za-z0-9\\+\\-\\.]+):/, (_, val) => {\n\t\tobjurl.protocol = val;\n\t\treturn '';\n\t});\n\n\turl = replace(url, /\\?(.+)/, (_, val) => {\n\t\tobjurl.search = val;\n\t\tobjurl.searchParams = urldecode_params(val);\n\t\treturn '';\n\t});\n\n\turl = replace(url, /^\\/\\/([^\\/]+)/, (_, val) => {\n\t\tval = replace(val, /^([^@]+)@/, (_, val) => {\n\t\t\tobjurl.userinfo = val;\n\t\t\treturn '';\n\t\t});\n\n\t\tval = replace(val, /:(\\d+)$/, (_, val) => {\n\t\t\tobjurl.port = val;\n\t\t\treturn '';\n\t\t});\n\n\t\tif (validation('ip4addr', val) ||\n\t\t    validation('ip6addr', replace(val, /\\[|\\]/g, '')) ||\n\t\t    validation('hostname', val))\n\t\t\tobjurl.hostname = val;\n\n\t\treturn '';\n\t});\n\n\tobjurl.pathname = url || '/';\n\n\tif (!objurl.protocol || !objurl.hostname)\n\t\treturn null;\n\n\tif (objurl.userinfo) {\n\t\tobjurl.userinfo = replace(objurl.userinfo, /:(.+)$/, (_, val) => {\n\t\t\tobjurl.password = val;\n\t\t\treturn '';\n\t\t});\n\n\t\tif (match(objurl.userinfo, /^[A-Za-z0-9\\+\\-\\_\\.]+$/)) {\n\t\t\tobjurl.username = objurl.userinfo;\n\t\t\tdelete objurl.userinfo;\n\t\t} else {\n\t\t\tdelete objurl.userinfo;\n\t\t\tdelete objurl.password;\n\t\t}\n\t};\n\n\tif (!objurl.port)\n\t\tobjurl.port = services[objurl.protocol];\n\n\tobjurl.host = objurl.hostname + (objurl.port ? `:${objurl.port}` : '');\n\tobjurl.origin = `${objurl.protocol}://${objurl.host}`;\n\n\treturn objurl;\n};\n/* String parser end */\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/scripts/migrate_config.uc",
    "content": "#!/usr/bin/ucode\n/*\n * SPDX-License-Identifier: GPL-2.0-only\n *\n * Copyright (C) 2025 ImmortalWrt.org\n */\n\n'use strict';\n\nimport { cursor } from 'uci';\nimport { isEmpty, parseURL } from 'homeproxy';\n\nconst uci = cursor();\n\nconst uciconfig = 'homeproxy';\nuci.load(uciconfig);\n\nconst uciinfra = 'infra',\n      ucimigration = 'migration',\n      ucimain = 'config',\n      ucinode = 'node',\n      ucidns = 'dns',\n      ucidnsserver = 'dns_server',\n      ucidnsrule = 'dns_rule',\n      ucirouting = 'routing',\n      uciroutingnode = 'routing_node',\n      uciroutingrule = 'routing_rule',\n      uciserver = 'server';\n\n/* chinadns-ng has been removed */\nif (uci.get(uciconfig, uciinfra, 'china_dns_port'))\n\tuci.delete(uciconfig, uciinfra, 'china_dns_port');\n\n/* chinadns server now only accepts single server */\nconst china_dns_server = uci.get(uciconfig, ucimain, 'china_dns_server');\nif (type(china_dns_server) === 'array') {\n\tuci.set(uciconfig, ucimain, 'china_dns_server', china_dns_server[0]);\n} else {\n\tif (china_dns_server === 'wan_114')\n\t\tuci.set(uciconfig, ucimain, 'china_dns_server', '114.114.114.114');\n\telse if (match(china_dns_server, /,/))\n\t\tuci.set(uciconfig, ucimain, 'china_dns_server', split(china_dns_server, ',')[0]);\n}\n\n/* github_token option has been moved to config section */\nconst github_token = uci.get(uciconfig, uciinfra, 'github_token');\nif (github_token) {\n\tuci.set(uciconfig, ucimain, 'github_token', github_token);\n\tuci.delete(uciconfig, uciinfra, 'github_token')\n}\n\n/* ntp_server was introduced */\nif (!uci.get(uciconfig, uciinfra, 'ntp_server'))\n\tuci.set(uciconfig, uciinfra, 'ntp_server', 'nil');\n\n/* tun_gso was deprecated in sb 1.11 */\nif (!isEmpty(uci.get(uciconfig, uciinfra, 'tun_gso')))\n\tuci.delete(uciconfig, uciinfra, 'tun_gso');\n\n/* create migration section */\nif (!uci.get(uciconfig, ucimigration))\n\tuci.set(uciconfig, ucimigration, uciconfig);\n\n/* delete old crontab command */\nconst migration_crontab = uci.get(uciconfig, ucimigration, 'crontab');\nif (!migration_crontab) {\n\tsystem('sed -i \"/update_crond.sh/d\" \"/etc/crontabs/root\" 2>\"/dev/null\"');\n\tuci.set(uciconfig, ucimigration, 'crontab', '1');\n}\n\n/* log_level was introduced */\nif (isEmpty(uci.get(uciconfig, ucimain, 'log_level')))\n\tuci.set(uciconfig, ucimain, 'log_level', 'warn');\n\nif (isEmpty(uci.get(uciconfig, uciserver, 'log_level')))\n\tuci.set(uciconfig, uciserver, 'log_level', 'warn');\n\n/* empty value defaults to all ports now */\nif (uci.get(uciconfig, ucimain, 'routing_port') === 'all')\n\tuci.delete(uciconfig, ucimain, 'routing_port');\n\n/* experimental section was removed */\nif (uci.get(uciconfig, 'experimental'))\n\tuci.delete(uciconfig, 'experimental');\n\n/* block-dns was removed from built-in dns servers */\nconst default_dns_server = uci.get(uciconfig, ucidns, 'default_server');\nif (default_dns_server === 'block-dns') {\n\t/* append a rule at last to block all DNS queries */\n\tuci.set(uciconfig, '_migration_dns_final_block', ucidnsrule);\n\tuci.set(uciconfig, '_migration_dns_final_block', 'label', 'migration_final_block_dns');\n\tuci.set(uciconfig, '_migration_dns_final_block', 'enabled', '1');\n\tuci.set(uciconfig, '_migration_dns_final_block', 'mode', 'default');\n\tuci.set(uciconfig, '_migration_dns_final_block', 'action', 'reject');\n\tuci.set(uciconfig, ucidns, 'default_server', 'default-dns');\n}\n\nconst dns_server_migration = {};\n/* DNS servers options */\nuci.foreach(uciconfig, ucidnsserver, (cfg) => {\n\t/* legacy format was deprecated in sb 1.12 */\n\tif (cfg.address) {\n\t\tconst addr = parseURL((!match(cfg.address, /:\\/\\//) ? 'udp://' : '') + (validation('ip6addr', cfg.address) ? `[${cfg.address}]` : cfg.address));\n\t\t/* RCode was moved into DNS rules */\n\t\tif (addr.protocol === 'rcode') {\n\t\t\tdns_server_migration[cfg['.name']] = { action: 'predefined' };\n\t\t\tswitch (addr.hostname) {\n\t\t\tcase 'success':\n\t\t\t\tdns_server_migration[cfg['.name']].rcode = 'NOERROR';\n\t\t\t\tbreak;\n\t\t\tcase 'format_error':\n\t\t\t\tdns_server_migration[cfg['.name']].rcode = 'FORMERR';\n\t\t\t\tbreak;\n\t\t\tcase 'server_failure':\n\t\t\t\tdns_server_migration[cfg['.name']].rcode = 'SERVFAIL';\n\t\t\t\tbreak;\n\t\t\tcase 'name_error':\n\t\t\t\tdns_server_migration[cfg['.name']].rcode = 'NXDOMAIN';\n\t\t\t\tbreak;\n\t\t\tcase 'not_implemented':\n\t\t\t\tdns_server_migration[cfg['.name']].rcode = 'NOTIMP';\n\t\t\t\tbreak;\n\t\t\tcase 'refused':\n\t\t\tdefault:\n\t\t\t\tdns_server_migration[cfg['.name']].rcode = 'REFUSED';\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tuci.delete(uciconfig, cfg['.name']);\n\t\t\treturn;\n\t\t}\n\t\tuci.set(uciconfig, cfg['.name'], 'type', addr.protocol);\n\t\tuci.set(uciconfig, cfg['.name'], 'server', addr.hostname);\n\t\tuci.set(uciconfig, cfg['.name'], 'server_port', addr.port);\n\t\tuci.set(uciconfig, cfg['.name'], 'path', (addr.pathname !== '/') ? addr.pathname : null);\n\t\tuci.delete(uciconfig, cfg['.name'], 'address');\n\t}\n\n\tif (cfg.strategy) {\n\t\tif (cfg['.name'] === default_dns_server)\n\t\t\tuci.set(uciconfig, ucidns, 'default_strategy', cfg.strategy);\n\t\tdns_server_migration[cfg['.name']] = { strategy: cfg.strategy };\n\t\tuci.delete(uciconfig, cfg['.name'], 'strategy');\n\t}\n\n\tif (cfg.client_subnet) {\n\t\tif (cfg['.name'] === default_dns_server)\n\t\t\tuci.set(uciconfig, ucidns, 'client_subnet', cfg.client_subnet);\n\n\t\tif (isEmpty(dns_server_migration[cfg['.name']]))\n\t\t\tdns_server_migration[cfg['.name']] = {};\n\t\tdns_server_migration[cfg['.name']].client_subnet = cfg.client_subnet;\n\t\tuci.delete(uciconfig, cfg['.name'], 'client_subnet');\n\t}\n});\n\n/* DNS rules options */\nuci.foreach(uciconfig, ucidnsrule, (cfg) => {\n\t/* outbound was removed in sb 1.12 */\n\tif (cfg.outbound) {\n\t\tuci.delete(uciconfig, cfg['.name']);\n\t\tif (!cfg.enabled)\n\t\t\treturn;\n\n\t\tmap(cfg.outbound, (outbound) => {\n\t\t\tswitch (outbound) {\n\t\t\tcase 'direct-out':\n\t\t\tcase 'block-out':\n\t\t\t\tbreak;\n\t\t\tcase 'any-out':\n\t\t\t\tuci.set(uciconfig, ucirouting, 'default_outbound_dns', cfg.server);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tuci.set(uciconfig, cfg.outbound, 'domain_resolver', cfg.server);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t});\n\n\t\treturn;\n\t}\n\n\t/* rule_set_ipcidr_match_source was renamed in sb 1.10 */\n\tif (cfg.rule_set_ipcidr_match_source === '1')\n\t\tuci.rename(uciconfig, cfg['.name'], 'rule_set_ipcidr_match_source', 'rule_set_ip_cidr_match_source');\n\n\t/* block-dns was moved into action in sb 1.11 */\n\tif (cfg.server === 'block-dns') {\n\t\tuci.set(uciconfig, cfg['.name'], 'action', 'reject');\n\t\tuci.delete(uciconfig, cfg['.name'], 'server');\n\t} else if (!cfg.action) {\n\t\t/* add missing 'action' field */\n\t\tuci.set(uciconfig, cfg['.name'], 'action', 'route');\n\t}\n\n\t/* strategy and client_subnet were moved into dns rules */\n\tif (dns_server_migration[cfg.server]) {\n\t\tif (dns_server_migration[cfg.server].strategy)\n\t\t\tuci.set(uciconfig, cfg['.name'], 'strategy', dns_server_migration[cfg.server].strategy);\n\n\t\tif (dns_server_migration[cfg.server].client_subnet)\n\t\t\tuci.set(uciconfig, cfg['.name'], 'client_subnet', dns_server_migration[cfg.server].client_subnet);\n\n\t\tif (dns_server_migration[cfg.server].rcode) {\n\t\t\tuci.set(uciconfig, cfg['.name'], 'action', 'predefined');\n\t\t\tuci.set(uciconfig, cfg['.name'], 'rcode', dns_server_migration[cfg.server].rcode);\n\t\t\tuci.delete(uciconfig, cfg['.name'], 'server');\n\t\t}\n\t}\n});\n\n/* nodes options */\nuci.foreach(uciconfig, ucinode, (cfg) => {\n\t/* tls_ech_tls_disable_drs is useless and deprecated in sb 1.12 */\n\tif (!isEmpty(cfg.tls_ech_tls_disable_drs))\n\t\tuci.delete(uciconfig, cfg['.name'], 'tls_ech_tls_disable_drs');\n\n\t/* tls_ech_enable_pqss is useless and deprecated in sb 1.12 */\n\tif (!isEmpty(cfg.tls_ech_enable_pqss))\n\t\tuci.delete(uciconfig, cfg['.name'], 'tls_ech_enable_pqss');\n\n\t/* wireguard_gso was deprecated in sb 1.11 */\n\tif (!isEmpty(cfg.wireguard_gso))\n\t\tuci.delete(uciconfig, cfg['.name'], 'wireguard_gso');\n});\n\n/* routing rules options */\nuci.foreach(uciconfig, uciroutingrule, (cfg) => {\n\t/* rule_set_ipcidr_match_source was renamed in sb 1.10 */\n\tif (cfg.rule_set_ipcidr_match_source === '1')\n\t\tuci.rename(uciconfig, cfg['.name'], 'rule_set_ipcidr_match_source', 'rule_set_ip_cidr_match_source');\n\n\t/* block-out was moved into action in sb 1.11 */\n\tif (cfg.outbound === 'block-out') {\n\t\tuci.set(uciconfig, cfg['.name'], 'action', 'reject');\n\t\tuci.delete(uciconfig, cfg['.name'], 'outbound');\n\t} else if (!cfg.action) {\n\t\t/* add missing 'action' field */\n\t\tuci.set(uciconfig, cfg['.name'], 'action', 'route');\n\t}\n});\n\n/* server options */\n/* auto_firewall was moved into server options */\nconst auto_firewall = uci.get(uciconfig, uciserver, 'auto_firewall');\nif (!isEmpty(auto_firewall))\n\tuci.delete(uciconfig, uciserver, 'auto_firewall');\n\nuci.foreach(uciconfig, uciserver, (cfg) => {\n\t/* auto_firewall was moved into server options */\n\tif (auto_firewall === '1')\n\t\tuci.set(uciconfig, cfg['.name'], 'firewall' , '1');\n\n\t/* sniff_override was deprecated in sb 1.11 */\n\tif (!isEmpty(cfg.sniff_override))\n\t\tuci.delete(uciconfig, cfg['.name'], 'sniff_override');\n\n\t/* domain_strategy is now pointless without sniff override */\n\tif (!isEmpty(cfg.domain_strategy))\n\t\tuci.delete(uciconfig, cfg['.name'], 'domain_strategy');\n});\n\nif (!isEmpty(uci.changes(uciconfig)))\n\tuci.commit(uciconfig);\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/scripts/update_crond.sh",
    "content": "#!/bin/sh\n# SPDX-License-Identifier: GPL-2.0-only\n#\n# Copyright (C) 2023 ImmortalWrt.org\n\nSCRIPTS_DIR=\"/etc/homeproxy/scripts\"\n\nfor i in \"china_ip4\" \"china_ip6\" \"gfw_list\" \"china_list\"; do\n\t\"$SCRIPTS_DIR\"/update_resources.sh \"$i\"\ndone\n\n\"$SCRIPTS_DIR\"/update_subscriptions.uc\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/scripts/update_resources.sh",
    "content": "#!/bin/sh\n# SPDX-License-Identifier: GPL-2.0-only\n#\n# Copyright (C) 2022-2025 ImmortalWrt.org\n\nNAME=\"homeproxy\"\n\nRESOURCES_DIR=\"/etc/$NAME/resources\"\nmkdir -p \"$RESOURCES_DIR\"\n\nRUN_DIR=\"/var/run/$NAME\"\nLOG_PATH=\"$RUN_DIR/$NAME.log\"\nmkdir -p \"$RUN_DIR\"\n\nlog() {\n\techo -e \"$(date \"+%Y-%m-%d %H:%M:%S\") $*\" >> \"$LOG_PATH\"\n}\n\nto_upper() {\n\techo -e \"$1\" | tr \"[a-z]\" \"[A-Z]\"\n}\n\ncheck_list_update() {\n\tlocal listtype=\"$1\"\n\tlocal listrepo=\"$2\"\n\tlocal listref=\"$3\"\n\tlocal listname=\"$4\"\n\tlocal lock=\"$RUN_DIR/update_resources-$listtype.lock\"\n\tlocal github_token=\"$(uci -q get homeproxy.config.github_token)\"\n\tlocal wget=\"wget --timeout=10 -q\"\n\n\texec 200>\"$lock\"\n\tif ! flock -n 200 &> \"/dev/null\"; then\n\t\tlog \"[$(to_upper \"$listtype\")] A task is already running.\"\n\t\treturn 2\n\tfi\n\n\t[ -z \"$github_token\" ] || github_token=\"--header=Authorization: Bearer $github_token\"\n\tlocal list_info=\"$($wget \"${github_token:--q}\" -O- \"https://api.github.com/repos/$listrepo/commits?sha=$listref&path=$listname&per_page=1\")\"\n\tlocal list_sha=\"$(echo -e \"$list_info\" | jsonfilter -qe \"@[0].sha\")\"\n\tlocal list_ver=\"$(echo -e \"$list_info\" | jsonfilter -qe \"@[0].commit.message\" | grep -Eo \"[0-9-]+\" | tr -d '-')\"\n\tif [ -z \"$list_sha\" ] || [ -z \"$list_ver\" ]; then\n\t\tlog \"[$(to_upper \"$listtype\")] Failed to get the latest version, please retry later.\"\n\t\treturn 1\n\tfi\n\n\tlocal local_list_ver=\"$(cat \"$RESOURCES_DIR/$listtype.ver\" 2>\"/dev/null\" || echo \"NOT FOUND\")\"\n\tif [ \"$local_list_ver\" = \"$list_ver\" ]; then\n\t\tlog \"[$(to_upper \"$listtype\")] Current version: $list_ver.\"\n\t\tlog \"[$(to_upper \"$listtype\")] You're already at the latest version.\"\n\t\treturn 3\n\telse\n\t\tlog \"[$(to_upper \"$listtype\")] Local version: $local_list_ver, latest version: $list_ver.\"\n\tfi\n\n\tif ! $wget \"https://fastly.jsdelivr.net/gh/$listrepo@$list_sha/$listname\" -O \"$RUN_DIR/$listname\" || [ ! -s \"$RUN_DIR/$listname\" ]; then\n\t\trm -f \"$RUN_DIR/$listname\"\n\t\tlog \"[$(to_upper \"$listtype\")] Update failed.\"\n\t\treturn 1\n\tfi\n\n\tmv -f \"$RUN_DIR/$listname\" \"$RESOURCES_DIR/$listtype.${listname##*.}\"\n\techo -e \"$list_ver\" > \"$RESOURCES_DIR/$listtype.ver\"\n\tlog \"[$(to_upper \"$listtype\")] Successfully updated.\"\n\n\treturn 0\n}\n\ncase \"$1\" in\n\"china_ip4\")\n\tcheck_list_update \"$1\" \"1715173329/IPCIDR-CHINA\" \"master\" \"ipv4.txt\"\n\t;;\n\"china_ip6\")\n\tcheck_list_update \"$1\" \"1715173329/IPCIDR-CHINA\" \"master\" \"ipv6.txt\"\n\t;;\n\"gfw_list\")\n\tcheck_list_update \"$1\" \"Loyalsoldier/v2ray-rules-dat\" \"release\" \"gfw.txt\"\n\t;;\n\"china_list\")\n\tcheck_list_update \"$1\" \"Loyalsoldier/v2ray-rules-dat\" \"release\" \"direct-list.txt\" && \\\n\t\tsed -i -e \"s/full://g\" -e \"/:/d\" \"$RESOURCES_DIR/china_list.txt\"\n\t;;\n*)\n\techo -e \"Usage: $0 <china_ip4 / china_ip6 / gfw_list / china_list>\"\n\texit 1\n\t;;\nesac\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/homeproxy/scripts/update_subscriptions.uc",
    "content": "#!/usr/bin/ucode\n/*\n * SPDX-License-Identifier: GPL-2.0-only\n *\n * Copyright (C) 2023 ImmortalWrt.org\n */\n\n'use strict';\n\nimport { md5 } from 'digest';\nimport { open } from 'fs';\nimport { connect } from 'ubus';\nimport { cursor } from 'uci';\n\nimport { urldecode, urlencode } from 'luci.http';\nimport { init_action } from 'luci.sys';\n\nimport {\n\twGET, decodeBase64Str, getTime, isEmpty, parseURL,\n\tvalidation, HP_DIR, RUN_DIR\n} from 'homeproxy';\n\n/* UCI config start */\nconst uci = cursor();\n\nconst uciconfig = 'homeproxy';\nuci.load(uciconfig);\n\nconst ucimain = 'config',\n      ucinode = 'node',\n      ucisubscription = 'subscription';\n\nconst allow_insecure = uci.get(uciconfig, ucisubscription, 'allow_insecure') || '0',\n      filter_mode = uci.get(uciconfig, ucisubscription, 'filter_nodes') || 'disabled',\n      filter_keywords = uci.get(uciconfig, ucisubscription, 'filter_keywords') || [],\n      packet_encoding = uci.get(uciconfig, ucisubscription, 'packet_encoding') || 'xudp',\n      subscription_urls = uci.get(uciconfig, ucisubscription, 'subscription_url') || [],\n      user_agent = uci.get(uciconfig, ucisubscription, 'user_agent'),\n      via_proxy = uci.get(uciconfig, ucisubscription, 'update_via_proxy') || '0';\n\nconst routing_mode = uci.get(uciconfig, ucimain, 'routing_mode') || 'bypass_mainalnd_china';\nlet main_node, main_udp_node;\nif (routing_mode !== 'custom') {\n\tmain_node = uci.get(uciconfig, ucimain, 'main_node') || 'nil';\n\tmain_udp_node = uci.get(uciconfig, ucimain, 'main_udp_node') || 'nil';\n}\n/* UCI config end */\n\n/* String helper start */\nfunction filter_check(name) {\n\tif (isEmpty(name) || filter_mode === 'disabled' || isEmpty(filter_keywords))\n\t\treturn false;\n\n\tlet ret = false;\n\tfor (let i in filter_keywords) {\n\t\tconst patten = regexp(i);\n\t\tif (match(name, patten))\n\t\t\tret = true;\n\t}\n\tif (filter_mode === 'whitelist')\n\t\tret = !ret;\n\n\treturn ret;\n}\n/* String helper end */\n\n/* Common var start */\nconst node_cache = {},\n      node_result = [];\n\nconst ubus = connect();\nconst sing_features = ubus.call('luci.homeproxy', 'singbox_get_features', {}) || {};\n/* Common var end */\n\n/* Log */\nsystem(`mkdir -p ${RUN_DIR}`);\nfunction log(...args) {\n\tconst logfile = open(`${RUN_DIR}/homeproxy.log`, 'a');\n\tlogfile.write(`${getTime()} [SUBSCRIBE] ${join(' ', args)}\\n`);\n\tlogfile.close();\n}\n\nfunction parse_uri(uri) {\n\tlet config, url, params;\n\n\tif (type(uri) === 'object') {\n\t\tif (uri.nodetype === 'sip008') {\n\t\t\t/* https://shadowsocks.org/guide/sip008.html */\n\t\t\tconfig = {\n\t\t\t\tlabel: uri.remarks,\n\t\t\t\ttype: 'shadowsocks',\n\t\t\t\taddress: uri.server,\n\t\t\t\tport: uri.server_port,\n\t\t\t\tshadowsocks_encrypt_method: uri.method,\n\t\t\t\tpassword: uri.password,\n\t\t\t\tshadowsocks_plugin: uri.plugin,\n\t\t\t\tshadowsocks_plugin_opts: uri.plugin_opts\n\t\t\t};\n\t\t}\n\t} else if (type(uri) === 'string') {\n\t\turi = split(trim(uri), '://');\n\n\t\tswitch (uri[0]) {\n\t\tcase 'anytls':\n\t\t\t/* https://github.com/anytls/anytls-go/blob/v0.0.8/docs/uri_scheme.md */\n\t\t\turl = parseURL('http://' + uri[1]) || {};\n\t\t\tparams = url.searchParams || {};\n\n\t\t\tconfig = {\n\t\t\t\tlabel: url.hash ? urldecode(url.hash) : null,\n\t\t\t\ttype: 'anytls',\n\t\t\t\taddress: url.hostname,\n\t\t\t\tport: url.port,\n\t\t\t\tpassword: urldecode(url.username),\n\t\t\t\ttls: '1',\n\t\t\t\ttls_sni: params.sni,\n\t\t\t\ttls_insecure: (params.insecure === '1') ? '1' : '0'\n\t\t\t};\n\n\t\t\tbreak;\n\t\tcase 'http':\n\t\tcase 'https':\n\t\t\turl = parseURL('http://' + uri[1]) || {};\n\n\t\t\tconfig = {\n\t\t\t\tlabel: url.hash ? urldecode(url.hash) : null,\n\t\t\t\ttype: 'http',\n\t\t\t\taddress: url.hostname,\n\t\t\t\tport: url.port,\n\t\t\t\tusername: url.username ? urldecode(url.username) : null,\n\t\t\t\tpassword: url.password ? urldecode(url.password) : null,\n\t\t\t\ttls: (uri[0] === 'https') ? '1' : '0'\n\t\t\t};\n\n\t\t\tbreak;\n\t\tcase 'hysteria':\n\t\t\t/* https://github.com/HyNetwork/hysteria/wiki/URI-Scheme */\n\t\t\turl = parseURL('http://' + uri[1]) || {};\n\t\t\tparams = url.searchParams || {};\n\n\t\t\tif (!sing_features.with_quic || (params.protocol && params.protocol !== 'udp')) {\n\t\t\t\tlog(sprintf('Skipping unsupported %s node: %s.', uri[0], urldecode(url.hash) || url.hostname));\n\t\t\t\tif (!sing_features.with_quic)\n\t\t\t\t\tlog(sprintf('Please rebuild sing-box with %s support!', 'QUIC'));\n\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconfig = {\n\t\t\t\tlabel: url.hash ? urldecode(url.hash) : null,\n\t\t\t\ttype: 'hysteria',\n\t\t\t\taddress: url.hostname,\n\t\t\t\tport: url.port,\n\t\t\t\thysteria_protocol: params.protocol || 'udp',\n\t\t\t\thysteria_auth_type: params.auth ? 'string' : null,\n\t\t\t\thysteria_auth_payload: params.auth,\n\t\t\t\thysteria_obfs_password: params.obfsParam,\n\t\t\t\thysteria_down_mbps: params.downmbps,\n\t\t\t\thysteria_up_mbps: params.upmbps,\n\t\t\t\ttls: '1',\n\t\t\t\ttls_insecure: (params.insecure in ['true', '1']) ? '1' : '0',\n\t\t\t\ttls_sni: params.peer,\n\t\t\t\ttls_alpn: params.alpn\n\t\t\t};\n\n\t\t\tbreak;\n\t\tcase 'hysteria2':\n\t\tcase 'hy2':\n\t\t\t/* https://v2.hysteria.network/docs/developers/URI-Scheme/ */\n\t\t\turl = parseURL('http://' + uri[1]) || {};\n\t\t\tparams = url.searchParams || {};\n\n\t\t\tif (!sing_features.with_quic) {\n\t\t\t\tlog(sprintf('Skipping unsupported %s node: %s.', uri[0], urldecode(url.hash) || url.hostname));\n\t\t\t\tlog(sprintf('Please rebuild sing-box with %s support!', 'QUIC'));\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconfig = {\n\t\t\t\tlabel: url.hash ? urldecode(url.hash) : null,\n\t\t\t\ttype: 'hysteria2',\n\t\t\t\taddress: url.hostname,\n\t\t\t\tport: url.port,\n\t\t\t\tpassword: url.username ? (\n\t\t\t\t\turldecode(url.username + (url.password ? (':' + url.password) : ''))\n\t\t\t\t) : null,\n\t\t\t\thysteria_obfs_type: params.obfs,\n\t\t\t\thysteria_obfs_password: params['obfs-password'],\n\t\t\t\ttls: '1',\n\t\t\t\ttls_insecure: (params.insecure === '1') ? '1' : '0',\n\t\t\t\ttls_sni: params.sni\n\t\t\t};\n\n\t\t\tbreak;\n\t\tcase 'socks':\n\t\tcase 'socks4':\n\t\tcase 'socks4a':\n\t\tcase 'socsk5':\n\t\tcase 'socks5h':\n\t\t\turl = parseURL('http://' + uri[1]) || {};\n\n\t\t\tconfig = {\n\t\t\t\tlabel: url.hash ? urldecode(url.hash) : null,\n\t\t\t\ttype: 'socks',\n\t\t\t\taddress: url.hostname,\n\t\t\t\tport: url.port,\n\t\t\t\tusername: url.username ? urldecode(url.username) : null,\n\t\t\t\tpassword: url.password ? urldecode(url.password) : null,\n\t\t\t\tsocks_version: (match(uri[0], /4/)) ? '4' : '5'\n\t\t\t};\n\n\t\t\tbreak;\n\t\tcase 'ss':\n\t\t\t/* \"Lovely\" Shadowrocket format */\n\t\t\tconst ss_suri = split(uri[1], '#');\n\t\t\tlet ss_slabel = '';\n\t\t\tif (length(ss_suri) <= 2) {\n\t\t\t\tif (length(ss_suri) === 2)\n\t\t\t\t\tss_slabel = '#' + urlencode(ss_suri[1]);\n\t\t\t\tif (decodeBase64Str(ss_suri[0]))\n\t\t\t\t\turi[1] = decodeBase64Str(ss_suri[0]) + ss_slabel;\n\t\t\t}\n\n\t\t\t/* Legacy format is not supported, it should be never appeared in modern subscriptions */\n\t\t\t/* https://github.com/shadowsocks/shadowsocks-org/commit/78ca46cd6859a4e9475953ed34a2d301454f579e */\n\n\t\t\t/* SIP002 format https://shadowsocks.org/guide/sip002.html */\n\t\t\turl = parseURL('http://' + uri[1]) || {};\n\n\t\t\tlet ss_userinfo = {};\n\t\t\tif (url.username && url.password)\n\t\t\t\t/* User info encoded with URIComponent */\n\t\t\t\tss_userinfo = [url.username, urldecode(url.password)];\n\t\t\telse if (url.username)\n\t\t\t\t/* User info encoded with base64 */\n\t\t\t\tss_userinfo = split(decodeBase64Str(urldecode(url.username)), ':', 2);\n\n\t\t\tlet ss_plugin, ss_plugin_opts;\n\t\t\tif (url.search && url.searchParams.plugin) {\n\t\t\t\tconst ss_plugin_info = split(url.searchParams.plugin, ';', 2);\n\t\t\t\tss_plugin = ss_plugin_info[0];\n\t\t\t\tif (ss_plugin === 'simple-obfs')\n\t\t\t\t\t/* Fix non-standard plugin name */\n\t\t\t\t\tss_plugin = 'obfs-local';\n\t\t\t\tss_plugin_opts = ss_plugin_info[1];\n\t\t\t}\n\n\t\t\tconfig = {\n\t\t\t\tlabel: url.hash ? urldecode(url.hash) : null,\n\t\t\t\ttype: 'shadowsocks',\n\t\t\t\taddress: url.hostname,\n\t\t\t\tport: url.port,\n\t\t\t\tshadowsocks_encrypt_method: ss_userinfo[0],\n\t\t\t\tpassword: ss_userinfo[1],\n\t\t\t\tshadowsocks_plugin: ss_plugin,\n\t\t\t\tshadowsocks_plugin_opts: ss_plugin_opts\n\t\t\t};\n\n\t\t\tbreak;\n\t\tcase 'trojan':\n\t\t\t/* https://p4gefau1t.github.io/trojan-go/developer/url/ */\n\t\t\turl = parseURL('http://' + uri[1]) || {};\n\t\t\tparams = url.searchParams || {};\n\n\t\t\tconfig = {\n\t\t\t\tlabel: url.hash ? urldecode(url.hash) : null,\n\t\t\t\ttype: 'trojan',\n\t\t\t\taddress: url.hostname,\n\t\t\t\tport: url.port,\n\t\t\t\tpassword: urldecode(url.username),\n\t\t\t\ttransport: (params.type !== 'tcp') ? params.type : null,\n\t\t\t\ttls: '1',\n\t\t\t\ttls_sni: params.sni\n\t\t\t};\n\t\t\tswitch(params.type) {\n\t\t\tcase 'grpc':\n\t\t\t\tconfig.grpc_servicename = params.serviceName;\n\t\t\t\tbreak;\n\t\t\tcase 'ws':\n\t\t\t\tconfig.ws_host = params.host ? urldecode(params.host) : null;\n\t\t\t\tconfig.ws_path = params.path ? urldecode(params.path) : null;\n\t\t\t\tif (config.ws_path && match(config.ws_path, /\\?ed=/)) {\n\t\t\t\t\tconfig.websocket_early_data_header = 'Sec-WebSocket-Protocol';\n\t\t\t\t\tconfig.websocket_early_data = split(config.ws_path, '?ed=')[1];\n\t\t\t\t\tconfig.ws_path = split(config.ws_path, '?ed=')[0];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'tuic':\n\t\t\t/* https://github.com/daeuniverse/dae/discussions/182 */\n\t\t\turl = parseURL('http://' + uri[1]) || {};\n\t\t\tparams = url.searchParams || {};\n\n\t\t\tif (!sing_features.with_quic) {\n\t\t\t\tlog(sprintf('Skipping unsupported %s node: %s.', uri[0], urldecode(url.hash) || url.hostname));\n\t\t\t\tlog(sprintf('Please rebuild sing-box with %s support!', 'QUIC'));\n\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconfig = {\n\t\t\t\tlabel: url.hash ? urldecode(url.hash) : null,\n\t\t\t\ttype: 'tuic',\n\t\t\t\taddress: url.hostname,\n\t\t\t\tport: url.port,\n\t\t\t\tuuid: url.username,\n\t\t\t\tpassword: url.password ? urldecode(url.password) : null,\n\t\t\t\ttuic_congestion_control: params.congestion_control,\n\t\t\t\ttuic_udp_relay_mode: params.udp_relay_mode,\n\t\t\t\ttls: '1',\n\t\t\t\ttls_sni: params.sni,\n\t\t\t\ttls_alpn: params.alpn ? split(urldecode(params.alpn), ',') : null,\n\t\t\t};\n\n\t\t\tbreak;\n\t\tcase 'vless':\n\t\t\t/* https://github.com/XTLS/Xray-core/discussions/716 */\n\t\t\turl = parseURL('http://' + uri[1]) || {};\n\t\t\tparams = url.searchParams || {};\n\n\t\t\t/* Unsupported protocol */\n\t\t\tif (params.type === 'kcp') {\n\t\t\t\tlog(sprintf('Skipping sunsupported %s node: %s.', uri[0], urldecode(url.hash) || url.hostname));\n\t\t\t\treturn null;\n\t\t\t} else if (params.type === 'quic' && ((params.quicSecurity && params.quicSecurity !== 'none') || !sing_features.with_quic)) {\n\t\t\t\tlog(sprintf('Skipping sunsupported %s node: %s.', uri[0], urldecode(url.hash) || url.hostname));\n\t\t\t\tif (!sing_features.with_quic)\n\t\t\t\t\tlog(sprintf('Please rebuild sing-box with %s support!', 'QUIC'));\n\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tconfig = {\n\t\t\t\tlabel: url.hash ? urldecode(url.hash) : null,\n\t\t\t\ttype: 'vless',\n\t\t\t\taddress: url.hostname,\n\t\t\t\tport: url.port,\n\t\t\t\tuuid: url.username,\n\t\t\t\ttransport: (params.type !== 'tcp') ? params.type : null,\n\t\t\t\ttls: (params.security in ['tls', 'xtls', 'reality']) ? '1' : '0',\n\t\t\t\ttls_sni: params.sni,\n\t\t\t\ttls_alpn: params.alpn ? split(urldecode(params.alpn), ',') : null,\n\t\t\t\ttls_reality: (params.security === 'reality') ? '1' : '0',\n\t\t\t\ttls_reality_public_key: params.pbk ? urldecode(params.pbk) : null,\n\t\t\t\ttls_reality_short_id: params.sid,\n\t\t\t\ttls_utls: sing_features.with_utls ? params.fp : null,\n\t\t\t\tvless_flow: (params.security in ['tls', 'reality']) ? params.flow : null\n\t\t\t};\n\t\t\tswitch(params.type) {\n\t\t\tcase 'grpc':\n\t\t\t\tconfig.grpc_servicename = params.serviceName;\n\t\t\t\tbreak;\n\t\t\tcase 'http':\n\t\t\tcase 'tcp':\n\t\t\t\tif (params.type === 'http' || params.headerType === 'http') {\n\t\t\t\t\tconfig.http_host = params.host ? split(urldecode(params.host), ',') : null;\n\t\t\t\t\tconfig.http_path = params.path ? urldecode(params.path) : null;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'httpupgrade':\n\t\t\t\tconfig.httpupgrade_host = params.host ? urldecode(params.host) : null;\n\t\t\t\tconfig.http_path = params.path ? urldecode(params.path) : null;\n\t\t\t\tbreak;\n\t\t\tcase 'ws':\n\t\t\t\tconfig.ws_host = params.host ? urldecode(params.host) : null;\n\t\t\t\tconfig.ws_path = params.path ? urldecode(params.path) : null;\n\t\t\t\tif (config.ws_path && match(config.ws_path, /\\?ed=/)) {\n\t\t\t\t\tconfig.websocket_early_data_header = 'Sec-WebSocket-Protocol';\n\t\t\t\t\tconfig.websocket_early_data = split(config.ws_path, '?ed=')[1];\n\t\t\t\t\tconfig.ws_path = split(config.ws_path, '?ed=')[0];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbreak;\n\t\tcase 'vmess':\n\t\t\t/* \"Lovely\" shadowrocket format */\n\t\t\tif (match(uri, /&/)) {\n\t\t\t\tlog(sprintf('Skipping unsupported %s format.', uri[0]));\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\t/* https://github.com/2dust/v2rayN/wiki/Description-of-VMess-share-link */\n\t\t\ttry {\n\t\t\t\turi = json(decodeBase64Str(uri[1])) || {};\n\t\t\t} catch(e) {\n\t\t\t\tlog(sprintf('Skipping unsupported %s format.', uri[0]));\n\t\t\t\treturn null;\n\t\t\t}\n\n\t\t\tif (uri.v != '2') {\n\t\t\t\tlog(sprintf('Skipping unsupported %s format.', uri[0]));\n\t\t\t\treturn null;\n\t\t\t/* Unsupported protocol */\n\t\t\t} else if (uri.net === 'kcp') {\n\t\t\t\tlog(sprintf('Skipping unsupported %s node: %s.', uri[0], uri.ps || uri.add));\n\t\t\t\treturn null;\n\t\t\t} else if (uri.net === 'quic' && ((uri.type && uri.type !== 'none') || uri.path || !sing_features.with_quic)) {\n\t\t\t\tlog(sprintf('Skipping unsupported %s node: %s.', uri[0], uri.ps || uri.add));\n\t\t\t\tif (!sing_features.with_quic)\n\t\t\t\t\tlog(sprintf('Please rebuild sing-box with %s support!', 'QUIC'));\n\n\t\t\t\treturn null;\n\t\t\t}\n\t\t\t/*\n\t\t\t * https://www.v2fly.org/config/protocols/vmess.html#vmess-md5-%E8%AE%A4%E8%AF%81%E4%BF%A1%E6%81%AF-%E6%B7%98%E6%B1%B0%E6%9C%BA%E5%88%B6\n\t\t\t * else if (uri.aid && int(uri.aid) !== 0) {\n\t\t\t * \tlog(sprintf('Skipping unsupported %s node: %s.', uri[0], uri.ps || uri.add));\n\t\t\t * \treturn null;\n\t\t\t * }\n\t\t\t */\n\n\t\t\tconfig = {\n\t\t\t\tlabel: uri.ps ? urldecode(uri.ps) : null,\n\t\t\t\ttype: 'vmess',\n\t\t\t\taddress: uri.add,\n\t\t\t\tport: uri.port,\n\t\t\t\tuuid: uri.id,\n\t\t\t\tvmess_alterid: uri.aid,\n\t\t\t\tvmess_encrypt: uri.scy || 'auto',\n\t\t\t\tvmess_global_padding: '1',\n\t\t\t\ttransport: (uri.net !== 'tcp') ? uri.net : null,\n\t\t\t\ttls: (uri.tls === 'tls') ? '1' : '0',\n\t\t\t\ttls_sni: uri.sni || uri.host,\n\t\t\t\ttls_alpn: uri.alpn ? split(uri.alpn, ',') : null,\n\t\t\t\ttls_utls: sing_features.with_utls ? uri.fp : null\n\t\t\t};\n\t\t\tswitch (uri.net) {\n\t\t\tcase 'grpc':\n\t\t\t\tconfig.grpc_servicename = uri.path;\n\t\t\t\tbreak;\n\t\t\tcase 'h2':\n\t\t\tcase 'tcp':\n\t\t\t\tif (uri.net === 'h2' || uri.type === 'http') {\n\t\t\t\t\tconfig.transport = 'http';\n\t\t\t\t\tconfig.http_host = uri.host ? split(uri.host, ',') : null;\n\t\t\t\t\tconfig.http_path = uri.path;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase 'httpupgrade':\n\t\t\t\tconfig.httpupgrade_host = uri.host;\n\t\t\t\tconfig.http_path = uri.path;\n\t\t\t\tbreak;\n\t\t\tcase 'ws':\n\t\t\t\tconfig.ws_host = uri.host;\n\t\t\t\tconfig.ws_path = uri.path;\n\t\t\t\tif (config.ws_path && match(config.ws_path, /\\?ed=/)) {\n\t\t\t\t\tconfig.websocket_early_data_header = 'Sec-WebSocket-Protocol';\n\t\t\t\t\tconfig.websocket_early_data = split(config.ws_path, '?ed=')[1];\n\t\t\t\t\tconfig.ws_path = split(config.ws_path, '?ed=')[0];\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (!isEmpty(config)) {\n\t\tif (config.address)\n\t\t\tconfig.address = replace(config.address, /\\[|\\]/g, '');\n\n\t\tif (!validation('host', config.address) || !validation('port', config.port)) {\n\t\t\tlog(sprintf('Skipping invalid %s node: %s.', config.type, config.label || 'NULL'));\n\t\t\treturn null;\n\t\t} else if (!config.label)\n\t\t\tconfig.label = (validation('ip6addr', config.address) ?\n\t\t\t\t`[${config.address}]` : config.address) + ':' + config.port;\n\t}\n\n\treturn config;\n}\n\nfunction main() {\n\tif (via_proxy !== '1') {\n\t\tlog('Stopping service...');\n\t\tinit_action('homeproxy', 'stop');\n\t}\n\n\tfor (let url in subscription_urls) {\n\t\turl = replace(url, /#.*$/, '');\n\t\tconst groupHash = md5(url);\n\t\tnode_cache[groupHash] = {};\n\n\t\tconst res = wGET(url, user_agent);\n\t\tif (isEmpty(res)) {\n\t\t\tlog(sprintf('Failed to fetch resources from %s.', url));\n\t\t\tcontinue;\n\t\t}\n\n\t\tlet nodes;\n\t\ttry {\n\t\t\tnodes = json(res).servers || json(res);\n\n\t\t\t/* Shadowsocks SIP008 format */\n\t\t\tif (nodes[0].server && nodes[0].method)\n\t\t\t\tmap(nodes, (_, i) => nodes[i].nodetype = 'sip008');\n\t\t} catch(e) {\n\t\t\tnodes = decodeBase64Str(res);\n\t\t\tnodes = nodes ? split(trim(replace(nodes, / /g, '_')), '\\n') : [];\n\t\t}\n\n\t\tlet count = 0;\n\t\tfor (let node in nodes) {\n\t\t\tlet config;\n\t\t\tif (!isEmpty(node))\n\t\t\t\tconfig = parse_uri(node);\n\t\t\tif (isEmpty(config))\n\t\t\t\tcontinue;\n\n\t\t\tconst label = config.label;\n\t\t\tconfig.label = null;\n\t\t\tconst confHash = md5(sprintf('%J', config)),\n\t\t\t      nameHash = md5(label);\n\t\t\tconfig.label = label;\n\n\t\t\tif (filter_check(config.label))\n\t\t\t\tlog(sprintf('Skipping blacklist node: %s.', config.label));\n\t\t\telse if (node_cache[groupHash][confHash] || node_cache[groupHash][nameHash])\n\t\t\t\tlog(sprintf('Skipping duplicate node: %s.', config.label));\n\t\t\telse {\n\t\t\t\tif (config.tls === '1' && allow_insecure === '1')\n\t\t\t\t\tconfig.tls_insecure = '1';\n\t\t\t\tif (config.type in ['vless', 'vmess'])\n\t\t\t\t\tconfig.packet_encoding = packet_encoding;\n\n\t\t\t\tconfig.grouphash = groupHash;\n\t\t\t\tpush(node_result, []);\n\t\t\t\tpush(node_result[length(node_result)-1], config);\n\t\t\t\tnode_cache[groupHash][confHash] = config;\n\t\t\t\tnode_cache[groupHash][nameHash] = config;\n\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\n\t\tif (count == 0)\n\t\t\tlog(sprintf('No valid node found in %s.', url));\n\t\telse\n\t\t\tlog(sprintf('Successfully fetched %s nodes of total %s from %s.', count, length(nodes), url));\n\t}\n\n\tif (isEmpty(node_result)) {\n\t\tlog('Failed to update subscriptions: no valid node found.');\n\n\t\tif (via_proxy !== '1') {\n\t\t\tlog('Starting service...');\n\t\t\tinit_action('homeproxy', 'start');\n\t\t}\n\n\t\treturn false;\n\t}\n\n\tlet added = 0, removed = 0;\n\tuci.foreach(uciconfig, ucinode, (cfg) => {\n\t\t/* Nodes created by the user */\n\t\tif (!cfg.grouphash)\n\t\t\treturn null;\n\n\t\t/* Empty object - failed to fetch nodes */\n\t\tif (length(node_cache[cfg.grouphash]) === 0)\n\t\t\treturn null;\n\n\t\tif (!node_cache[cfg.grouphash] || !node_cache[cfg.grouphash][cfg['.name']]) {\n\t\t\tuci.delete(uciconfig, cfg['.name']);\n\t\t\tremoved++;\n\n\t\t\tlog(sprintf('Removing node: %s.', cfg.label || cfg['name']));\n\t\t} else {\n\t\t\tmap(keys(cfg), (v) => {\n\t\t\t\tif (v in node_cache[cfg.grouphash][cfg['.name']])\n\t\t\t\t\tuci.set(uciconfig, cfg['.name'], v, node_cache[cfg.grouphash][cfg['.name']][v]);\n\t\t\t\telse\n\t\t\t\t\tuci.delete(uciconfig, cfg['.name'], v);\n\t\t\t});\n\t\t\tnode_cache[cfg.grouphash][cfg['.name']].isExisting = true;\n\t\t}\n\t});\n\tfor (let nodes in node_result)\n\t\tmap(nodes, (node) => {\n\t\t\tif (node.isExisting)\n\t\t\t\treturn null;\n\n\t\t\tconst nameHash = md5(node.label);\n\t\t\tuci.set(uciconfig, nameHash, 'node');\n\t\t\tmap(keys(node), (v) => uci.set(uciconfig, nameHash, v, node[v]));\n\n\t\t\tadded++;\n\t\t\tlog(sprintf('Adding node: %s.', node.label));\n\t\t});\n\tuci.commit(uciconfig);\n\n\tlet need_restart = (via_proxy !== '1');\n\tif (!isEmpty(main_node)) {\n\t\tconst first_server = uci.get_first(uciconfig, ucinode);\n\t\tif (first_server) {\n\t\t\tlet main_urltest_nodes;\n\t\t\tif (main_node === 'urltest') {\n\t\t\t\tmain_urltest_nodes = filter(uci.get(uciconfig, ucimain, 'main_urltest_nodes'), (v) => {\n\t\t\t\t\tif (!uci.get(uciconfig, v)) {\n\t\t\t\t\t\tlog(sprintf('Node %s is gone, removing from urltest list.', v));\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\treturn true;\n\t\t\t\t});\n\t\t\t}\n\n\t\t\tif ((main_node === 'urltest') ? !length(main_urltest_nodes) : !uci.get(uciconfig, main_node)) {\n\t\t\t\tuci.set(uciconfig, ucimain, 'main_node', first_server);\n\t\t\t\tuci.commit(uciconfig);\n\t\t\t\tneed_restart = true;\n\n\t\t\t\tlog('Main node is gone, switching to the first node.');\n\t\t\t}\n\n\t\t\tif (!isEmpty(main_udp_node) && main_udp_node !== 'same') {\n\t\t\t\tlet main_udp_urltest_nodes;\n\t\t\t\tif (main_udp_node === 'urltest') {\n\t\t\t\t\tmain_udp_urltest_nodes = filter(uci.get(uciconfig, ucimain, 'main_udp_urltest_nodes'), (v) => {\n\t\t\t\t\t\tif (!uci.get(uciconfig, v)) {\n\t\t\t\t\t\t\tlog(sprintf('Node %s is gone, removing from urltest list.', v));\n\t\t\t\t\t\t\treturn false;\n\t\t\t\t\t\t}\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif ((main_udp_node === 'urltest') ? !length(main_udp_urltest_nodes) : !uci.get(uciconfig, main_udp_node)) {\n\t\t\t\t\tuci.set(uciconfig, ucimain, 'main_udp_node', first_server);\n\t\t\t\t\tuci.commit(uciconfig);\n\t\t\t\t\tneed_restart = true;\n\n\t\t\t\t\tlog('Main UDP node is gone, switching to the first node.');\n\t\t\t\t}\n\t\t\t}\n\t\t} else {\n\t\t\tuci.set(uciconfig, ucimain, 'main_node', 'nil');\n\t\t\tuci.set(uciconfig, ucimain, 'main_udp_node', 'nil');\n\t\t\tuci.commit(uciconfig);\n\t\t\tneed_restart = true;\n\n\t\t\tlog('No available node, disable tproxy.');\n\t\t}\n\t}\n\n\tif (need_restart) {\n\t\tlog('Restarting service...');\n\t\tinit_action('homeproxy', 'stop');\n\t\tinit_action('homeproxy', 'start');\n\t}\n\n\tlog(sprintf('%s nodes added, %s removed.', added, removed));\n\tlog('Successfully updated subscriptions.');\n}\n\nif (!isEmpty(subscription_urls))\n\ttry {\n\t\tcall(main);\n\t} catch(e) {\n\t\tlog('[FATAL ERROR] An error occurred during updating subscriptions:');\n\t\tlog(sprintf('%s: %s', e.type, e.message));\n\t\tlog(e.stacktrace[0].context);\n\n\t\tlog('Restarting service...');\n\t\tinit_action('homeproxy', 'stop');\n\t\tinit_action('homeproxy', 'start');\n\t}\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/init.d/homeproxy",
    "content": "#!/bin/sh /etc/rc.common\n# SPDX-License-Identifier: GPL-2.0-only\n#\n# Copyright (C) 2022-2023 ImmortalWrt.org\n\nUSE_PROCD=1\n\nSTART=99\nSTOP=10\n\nCONF=\"homeproxy\"\nPROG=\"/usr/bin/sing-box\"\n\nHP_DIR=\"/etc/homeproxy\"\nRUN_DIR=\"/var/run/homeproxy\"\nLOG_PATH=\"$RUN_DIR/homeproxy.log\"\n\n# we don't know which is the default server, just take the first one\nDNSMASQ_UCI_CONFIG=\"$(uci -q show \"dhcp.@dnsmasq[0]\" | awk 'NR==1 {split($0, conf, /[.=]/); print conf[2]}')\"\nif [ -f \"/tmp/etc/dnsmasq.conf.$DNSMASQ_UCI_CONFIG\" ]; then\n\tDNSMASQ_DIR=\"$(awk -F '=' '/^conf-dir=/ {print $2}' \"/tmp/etc/dnsmasq.conf.$DNSMASQ_UCI_CONFIG\")/dnsmasq-homeproxy.d\"\nelse\n\tDNSMASQ_DIR=\"/tmp/dnsmasq.d/dnsmasq-homeproxy.d\"\nfi\n\nlog() {\n\techo -e \"$(date \"+%Y-%m-%d %H:%M:%S\") [DAEMON] $*\" >> \"$LOG_PATH\"\n}\n\nstart_service() {\n\tconfig_load \"$CONF\"\n\n\tlocal routing_mode proxy_mode\n\tconfig_get routing_mode \"config\" \"routing_mode\" \"bypass_mainland_china\"\n\tconfig_get proxy_mode \"config\" \"proxy_mode\" \"redirect_tproxy\"\n\n\tlocal outbound_node\n\tif [ \"$routing_mode\" != \"custom\" ]; then\n\t\tconfig_get outbound_node \"config\" \"main_node\" \"nil\"\n\telse\n\t\tconfig_get outbound_node \"routing\" \"default_outbound\" \"nil\"\n\tfi\n\n\tlocal server_enabled\n\tconfig_get_bool server_enabled \"server\" \"enabled\" \"0\"\n\n\tif [ \"$outbound_node\" = \"nil\" ] && [ \"$server_enabled\" = \"0\" ]; then\n\t\treturn 1\n\tfi\n\n\tmkdir -p \"$RUN_DIR\"\n\n\tif [ \"$outbound_node\" != \"nil\" ]; then\n\t\t# Generate/Validate client config\n\t\tucode -S \"$HP_DIR/scripts/generate_client.uc\" 2>>\"$LOG_PATH\"\n\n\t\tif [ ! -e \"$RUN_DIR/sing-box-c.json\" ]; then\n\t\t\tlog \"Error: failed to generate client configuration.\"\n\t\t\treturn 1\n\t\telif ! \"$PROG\" check --config \"$RUN_DIR/sing-box-c.json\" 2>>\"$LOG_PATH\"; then\n\t\t\tlog \"Error: wrong client configuration detected.\"\n\t\t\treturn 1\n\t\tfi\n\n\t\t# Auto update\n\t\tlocal auto_update auto_update_time\n\t\tconfig_get_bool auto_update \"subscription\" \"auto_update\" \"0\"\n\t\tif [ \"$auto_update\" = \"1\" ]; then\n\t\t\tconfig_get auto_update_time \"subscription\" \"auto_update_time\" \"2\"\n\t\t\tsed -i \"/#${CONF}_autosetup/d\" \"/etc/crontabs/root\" 2>\"/dev/null\"\n\t\t\techo -e \"0 $auto_update_time * * * $HP_DIR/scripts/update_crond.sh #${CONF}_autosetup\" >> \"/etc/crontabs/root\"\n\t\t\t/etc/init.d/cron restart\n\t\tfi\n\n\t\t# DNSMasq rules\n\t\tlocal ipv6_support dns_port\n\t\tconfig_get_bool ipv6_support \"config\" \"ipv6_support\" \"0\"\n\t\tconfig_get dns_port \"infra\" \"dns_port\" \"5333\"\n\t\tmkdir -p \"$DNSMASQ_DIR\"\n\t\techo -e \"conf-dir=$DNSMASQ_DIR\" > \"$DNSMASQ_DIR/../dnsmasq-homeproxy.conf\"\n\t\tcase \"$routing_mode\" in\n\t\t\"bypass_mainland_china\"|\"custom\"|\"global\")\n\t\t\tcat <<-EOF >> \"$DNSMASQ_DIR/redirect-dns.conf\"\n\t\t\t\tno-poll\n\t\t\t\tno-resolv\n\t\t\t\tserver=127.0.0.1#$dns_port\n\t\t\tEOF\n\t\t\t;;\n\t\t\"gfwlist\")\n\t\t\tlocal gfw_nftset_v6\n\t\t\t[ \"$ipv6_support\" -eq \"0\" ] || gfw_nftset_v6=\",6#inet#fw4#homeproxy_gfw_list_v6\"\n\t\t\tsed -r -e \"s/(.*)/server=\\/\\1\\/127.0.0.1#$dns_port\\nnftset=\\/\\1\\\\/4#inet#fw4#homeproxy_gfw_list_v4$gfw_nftset_v6/g\" \\\n\t\t\t\t\"$HP_DIR/resources/gfw_list.txt\" > \"$DNSMASQ_DIR/gfw_list.conf\"\n\t\t\t;;\n\t\t\"proxy_mainland_china\")\n\t\t\tsed -r -e \"s/(.*)/server=\\/\\1\\/127.0.0.1#$dns_port/g\" \\\n\t\t\t\t\"$HP_DIR/resources/china_list.txt\" > \"$DNSMASQ_DIR/china_list.conf\"\n\t\t\t;;\n\t\tesac\n\n\t\tif [ \"$routing_mode\" != \"custom\" ] && [ -s \"$HP_DIR/resources/proxy_list.txt\" ]; then\n\t\t\tlocal wan_nftset_v6\n\t\t\t[ \"$ipv6_support\" -eq \"0\" ] || wan_nftset_v6=\",6#inet#fw4#homeproxy_wan_proxy_addr_v6\"\n\t\t\tsed -r -e '/^\\s*$/d' -e \"s/(.*)/server=\\/\\1\\/127.0.0.1#$dns_port\\nnftset=\\/\\1\\\\/4#inet#fw4#homeproxy_wan_proxy_addr_v4$wan_nftset_v6/g\" \\\n\t\t\t\t\"$HP_DIR/resources/proxy_list.txt\" > \"$DNSMASQ_DIR/proxy_list.conf\"\n\t\tfi\n\t\t/etc/init.d/dnsmasq restart >\"/dev/null\" 2>&1\n\n\t\t# Setup routing table\n\t\tlocal table_mark\n\t\tconfig_get table_mark \"infra\" \"table_mark\" \"100\"\n\t\tcase \"$proxy_mode\" in\n\t\t\"redirect_tproxy\")\n\t\t\tlocal outbound_udp_node\n\t\t\tconfig_get outbound_udp_node \"config\" \"main_udp_node\" \"nil\"\n\t\t\tif [ \"$outbound_udp_node\" != \"nil\" ] || [ \"$routing_mode\" = \"custom\" ]; then\n\t\t\t\tlocal tproxy_mark\n\t\t\t\tconfig_get tproxy_mark \"infra\" \"tproxy_mark\" \"101\"\n\n\t\t\t\tip rule add fwmark \"$tproxy_mark\" table \"$table_mark\"\n\t\t\t\tip route add local 0.0.0.0/0 dev lo table \"$table_mark\"\n\n\t\t\t\tif [ \"$ipv6_support\" -eq \"1\" ]; then\n\t\t\t\t\tip -6 rule add fwmark \"$tproxy_mark\" table \"$table_mark\"\n\t\t\t\t\tip -6 route add local ::/0 dev lo table \"$table_mark\"\n\t\t\t\tfi\n\t\t\tfi\n\t\t\t;;\n\t\t\"redirect_tun\"|\"tun\")\n\t\t\tlocal tun_name tun_mark\n\t\t\tconfig_get tun_name \"infra\" \"tun_name\" \"singtun0\"\n\t\t\tconfig_get tun_mark \"infra\" \"tun_mark\" \"102\"\n\n\t\t\tip tuntap add mode tun user root name \"$tun_name\"\n\t\t\tsleep 1s\n\t\t\tip link set \"$tun_name\" up\n\n\t\t\tip route replace default dev \"$tun_name\" table \"$table_mark\"\n\t\t\tip rule add fwmark \"$tun_mark\" lookup \"$table_mark\"\n\n\t\t\tip -6 route replace default dev \"$tun_name\" table \"$table_mark\"\n\t\t\tip -6 rule add fwmark \"$tun_mark\" lookup \"$table_mark\"\n\t\t\t;;\n\t\tesac\n\n\t\t# sing-box (client)\n\t\tprocd_open_instance \"sing-box-c\"\n\n\t\tprocd_set_param command \"$PROG\"\n\t\tprocd_append_param command run --config \"$RUN_DIR/sing-box-c.json\"\n\n\t\t# QUIC-GO GSO is broken on kernel 6.6 currently\n\t\tuname -r | grep -Eq \"^6\\.6\" && procd_set_param env \"QUIC_GO_DISABLE_GSO\"=\"true\"\n\n\t\tif [ -x \"/sbin/ujail\" ] && [ \"$routing_mode\" != \"custom\" ] && ! grep -Eq '\"type\": \"(wireguard|tun)\"' \"$RUN_DIR/sing-box-c.json\"; then\n\t\t\tprocd_add_jail \"sing-box-c\" log procfs\n\t\t\tprocd_add_jail_mount \"$RUN_DIR/sing-box-c.json\"\n\t\t\tprocd_add_jail_mount_rw \"$RUN_DIR/sing-box-c.log\"\n\t\t\t[ \"$routing_mode\" != \"bypass_mainland_china\" ] || procd_add_jail_mount_rw \"$RUN_DIR/cache.db\"\n\t\t\tprocd_add_jail_mount \"$HP_DIR/certs/\"\n\t\t\tprocd_add_jail_mount \"/etc/ssl/\"\n\t\t\tprocd_add_jail_mount \"/etc/localtime\"\n\t\t\tprocd_add_jail_mount \"/etc/TZ\"\n\t\t\tprocd_set_param capabilities \"/etc/capabilities/homeproxy.json\"\n\t\t\tprocd_set_param no_new_privs 1\n\t\t\tprocd_set_param user sing-box\n\t\t\tprocd_set_param group sing-box\n\t\tfi\n\n\t\tprocd_set_param limits core=\"unlimited\"\n\t\tprocd_set_param limits nofile=\"1000000 1000000\"\n\t\tprocd_set_param stderr 1\n\t\tprocd_set_param respawn\n\n\t\tprocd_close_instance\n\tfi\n\n\tif [ \"$server_enabled\" = \"1\" ]; then\n\t\t# Generate/Validate server config\n\t\tucode -S \"$HP_DIR/scripts/generate_server.uc\" 2>>\"$LOG_PATH\"\n\n\t\tif [ ! -e \"$RUN_DIR/sing-box-s.json\" ]; then\n\t\t\tlog \"Error: failed to generate server configuration.\"\n\t\t\treturn 1\n\t\telif ! \"$PROG\" check --config \"$RUN_DIR/sing-box-s.json\" 2>>\"$LOG_PATH\"; then\n\t\t\tlog \"Error: wrong server configuration detected.\"\n\t\t\treturn 1\n\t\tfi\n\n\t\t# sing-box (server)\n\t\tprocd_open_instance \"sing-box-s\"\n\n\t\tprocd_set_param command \"$PROG\"\n\t\tprocd_append_param command run --config \"$RUN_DIR/sing-box-s.json\"\n\n\t\t# QUIC-GO GSO is broken on kernel 6.6 currently\n\t\tuname -r | grep -Eq \"^6\\.6\" && procd_set_param env \"QUIC_GO_DISABLE_GSO\"=\"true\"\n\n\t\tif [ -x \"/sbin/ujail\" ]; then\n\t\t\tprocd_add_jail \"sing-box-s\" log procfs\n\t\t\tprocd_add_jail_mount \"$RUN_DIR/sing-box-s.json\"\n\t\t\tprocd_add_jail_mount_rw \"$RUN_DIR/sing-box-s.log\"\n\t\t\tprocd_add_jail_mount_rw \"$HP_DIR/certs/\"\n\t\t\tprocd_add_jail_mount \"/etc/acme/\"\n\t\t\tprocd_add_jail_mount \"/etc/ssl/\"\n\t\t\tprocd_add_jail_mount \"/etc/localtime\"\n\t\t\tprocd_add_jail_mount \"/etc/TZ\"\n\t\t\tprocd_set_param capabilities \"/etc/capabilities/homeproxy.json\"\n\t\t\tprocd_set_param no_new_privs 1\n\t\t\tprocd_set_param user sing-box\n\t\t\tprocd_set_param group sing-box\n\t\tfi\n\n\t\tprocd_set_param limits core=\"unlimited\"\n\t\tprocd_set_param limits nofile=\"1000000 1000000\"\n\t\tprocd_set_param stderr 1\n\t\tprocd_set_param respawn\n\n\t\tprocd_close_instance\n\tfi\n\n\t# log-cleaner\n\tprocd_open_instance \"log-cleaner\"\n\tprocd_set_param command \"$HP_DIR/scripts/clean_log.sh\"\n\tprocd_set_param respawn\n\tprocd_close_instance\n\n\tcase \"$routing_mode\" in\n\t\"bypass_mainland_china\")\n\t\t# Prepare cache db\n\t\t[ -e \"$RUN_DIR/cache.db\" ] || touch \"$RUN_DIR/cache.db\"\n\t\t;;\n\t\"custom\")\n\t\t# Prepare ruleset directory\n\t\t[ -d \"$HP_DIR/ruleset\" ] || mkdir -p \"$HP_DIR/ruleset\"\n\t\t;;\n\tesac\n\n\t[ \"$outbound_node\" = \"nil\" ] || echo > \"$RUN_DIR/sing-box-c.log\"\n\tif [ \"$server_enabled\" = \"1\" ]; then\n\t\techo > \"$RUN_DIR/sing-box-s.log\"\n\t\tmkdir -p \"$HP_DIR/certs\"\n\tfi\n\n\t# Update permissions for ujail\n\tchown -R sing-box:sing-box \"$RUN_DIR\"\n\n\t# Setup firewall\n\tucode \"$HP_DIR/scripts/firewall_pre.uc\"\n\t[ \"$outbound_node\" = \"nil\" ] || utpl -S \"$HP_DIR/scripts/firewall_post.ut\" > \"$RUN_DIR/fw4_post.nft\"\n\tfw4 reload >\"/dev/null\" 2>&1\n\n\tlog \"sing-box $(sing-box version -n) started.\"\n}\n\nstop_service() {\n\tsed -i \"/#${CONF}_autosetup/d\" \"/etc/crontabs/root\" 2>\"/dev/null\"\n\t/etc/init.d/cron restart >\"/dev/null\" 2>&1\n\n\t# Setup firewall\n\t# Load config\n\tconfig_load \"$CONF\"\n\tlocal table_mark tproxy_mark tun_mark tun_name\n\tconfig_get table_mark \"infra\" \"table_mark\" \"100\"\n\tconfig_get tproxy_mark \"infra\" \"tproxy_mark\" \"101\"\n\tconfig_get tun_mark \"infra\" \"tun_mark\" \"102\"\n\tconfig_get tun_name \"infra\" \"tun_name\" \"singtun0\"\n\n\t# Tproxy\n\tip rule del fwmark \"$tproxy_mark\" table \"$table_mark\" 2>\"/dev/null\"\n\tip route del local 0.0.0.0/0 dev lo table \"$table_mark\" 2>\"/dev/null\"\n\tip -6 rule del fwmark \"$tproxy_mark\" table \"$table_mark\" 2>\"/dev/null\"\n\tip -6 route del local ::/0 dev lo table \"$table_mark\" 2>\"/dev/null\"\n\n\t# TUN\n\tip route del default dev \"$tun_name\" table \"$table_mark\" 2>\"/dev/null\"\n\tip rule del fwmark \"$tun_mark\" table \"$table_mark\" 2>\"/dev/null\"\n\n\tip -6 route del default dev \"$tun_name\" table \"$table_mark\" 2>\"/dev/null\"\n\tip -6 rule del fwmark \"$tun_mark\" table \"$table_mark\" 2>\"/dev/null\"\n\n\t# Nftables rules\n\tfor i in \"homeproxy_dstnat_redir\" \"homeproxy_output_redir\" \\\n\t\t \"homeproxy_redirect\" \"homeproxy_redirect_proxy\" \\\n\t\t \"homeproxy_redirect_proxy_port\" \"homeproxy_redirect_lanac\" \\\n\t\t \"homeproxy_mangle_prerouting\" \"homeproxy_mangle_output\" \\\n\t\t \"homeproxy_mangle_tproxy\" \"homeproxy_mangle_tproxy_port\" \\\n\t\t \"homeproxy_mangle_tproxy_lanac\" \"homeproxy_mangle_mark\" \\\n\t\t \"homeproxy_mangle_tun\" \"homeproxy_mangle_tun_mark\"; do\n\t\tnft flush chain inet fw4 \"$i\"\n\t\tnft delete chain inet fw4 \"$i\"\n\tdone 2>\"/dev/null\"\n\tfor i in \"homeproxy_local_addr_v4\" \"homeproxy_local_addr_v6\" \\\n\t\t \"homeproxy_gfw_list_v4\" \"homeproxy_gfw_list_v6\" \\\n\t\t \"homeproxy_mainland_addr_v4\" \"homeproxy_mainland_addr_v6\" \\\n\t\t \"homeproxy_wan_proxy_addr_v4\" \"homeproxy_wan_proxy_addr_v6\" \\\n\t\t \"homeproxy_wan_direct_addr_v4\" \"homeproxy_wan_direct_addr_v6\" \\\n\t\t \"homeproxy_routing_port\"; do\n\t\tnft flush set inet fw4 \"$i\"\n\t\tnft delete set inet fw4 \"$i\"\n\tdone 2>\"/dev/null\"\n\techo 2>\"/dev/null\" > \"$RUN_DIR/fw4_forward.nft\"\n\techo 2>\"/dev/null\" > \"$RUN_DIR/fw4_input.nft\"\n\techo 2>\"/dev/null\" > \"$RUN_DIR/fw4_post.nft\"\n\tfw4 reload >\"/dev/null\" 2>&1\n\n\t# Remove DNS hijack\n\trm -rf \"$DNSMASQ_DIR/../dnsmasq-homeproxy.conf\" \"$DNSMASQ_DIR\"\n\t/etc/init.d/dnsmasq restart >\"/dev/null\" 2>&1\n\n\trm -f \"$RUN_DIR/sing-box-c.json\" \"$RUN_DIR/sing-box-c.log\" \\\n\t\t\"$RUN_DIR/sing-box-s.json\" \"$RUN_DIR/sing-box-s.log\"\n\n\tlog \"Service stopped.\"\n}\n\nservice_stopped() {\n\t# Load config\n\tconfig_load \"$CONF\"\n\tlocal tun_name\n\tconfig_get tun_name \"infra\" \"tun_name\" \"singtun0\"\n\n\t# TUN\n\tip link set \"$tun_name\" down 2>\"/dev/null\"\n\tip tuntap del mode tun name \"$tun_name\" 2>\"/dev/null\"\n}\n\nreload_service() {\n\tlog \"Reloading service...\"\n\n\tstop\n\tstart\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"$CONF\"\n\tprocd_add_interface_trigger \"interface.*.up\" wan /etc/init.d/$CONF reload\n}\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/uci-defaults/luci-homeproxy",
    "content": "#!/bin/sh\n\n[ -f \"/www/luci-static/resources/icons/loading.gif\" ] && \\\n\tsed -i \"s,/loading.svg,/loading.gif,g\" \"/www/luci-static/resources/view/homeproxy/status.js\"\n\nuci -q batch <<-EOF >\"/dev/null\"\n\tdelete firewall.homeproxy_pre\n\n\tdelete firewall.homeproxy_forward\n\tset firewall.homeproxy_forward=include\n\tset firewall.homeproxy_forward.type=nftables\n\tset firewall.homeproxy_forward.path=\"/var/run/homeproxy/fw4_forward.nft\"\n\tset firewall.homeproxy_forward.position=\"chain-pre\"\n\tset firewall.homeproxy_forward.chain=\"forward\"\n\n\tdelete firewall.homeproxy_input\n\tset firewall.homeproxy_input=include\n\tset firewall.homeproxy_input.type=nftables\n\tset firewall.homeproxy_input.path=\"/var/run/homeproxy/fw4_input.nft\"\n\tset firewall.homeproxy_input.position=\"chain-pre\"\n\tset firewall.homeproxy_input.chain=\"input\"\n\n\tdelete firewall.homeproxy_post\n\tset firewall.homeproxy_post=include\n\tset firewall.homeproxy_post.type=nftables\n\tset firewall.homeproxy_post.path=\"/var/run/homeproxy/fw4_post.nft\"\n\tset firewall.homeproxy_post.position=\"table-post\"\n\tcommit firewall\nEOF\n\nexit 0\n"
  },
  {
    "path": "luci-app-homeproxy/root/etc/uci-defaults/luci-homeproxy-migration",
    "content": "#!/bin/sh\n\nucode \"/etc/homeproxy/scripts/migrate_config.uc\"\n\nexit 0\n"
  },
  {
    "path": "luci-app-homeproxy/root/usr/share/luci/menu.d/luci-app-homeproxy.json",
    "content": "{\n\t\"admin/services/homeproxy\": {\n\t\t\"title\": \"HomeProxy\",\n\t\t\"order\": 10,\n\t\t\"action\": {\n\t\t\t\"type\": \"firstchild\"\n\t\t},\n\t\t\"depends\": {\n\t\t\t\"acl\": [ \"luci-app-homeproxy\" ],\n\t\t\t\"uci\": { \"homeproxy\": true }\n\t\t}\n\t},\n\t\"admin/services/homeproxy/client\": {\n\t\t\"title\": \"Client Settings\",\n\t\t\"order\": 10,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"homeproxy/client\"\n\t\t}\n\t},\n\t\"admin/services/homeproxy/node\": {\n\t\t\"title\": \"Node Settings\",\n\t\t\"order\": 15,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"homeproxy/node\"\n\t\t}\n\t},\n\t\"admin/services/homeproxy/server\": {\n\t\t\"title\": \"Server Settings\",\n\t\t\"order\": 20,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"homeproxy/server\"\n\t\t}\n\t},\n\t\"admin/services/homeproxy/status\": {\n\t\t\"title\": \"Service Status\",\n\t\t\"order\": 30,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"homeproxy/status\"\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-homeproxy/root/usr/share/rpcd/acl.d/luci-app-homeproxy.json",
    "content": "{\n\t\"luci-app-homeproxy\": {\n\t\t\"description\": \"Grant access to homeproxy configuration\",\n\t\t\"read\": {\n\t\t\t\"file\": {\n\t\t\t\t\"/etc/homeproxy/scripts/update_subscriptions.uc\": [ \"exec\" ],\n\t\t\t\t\"/var/run/homeproxy/homeproxy.log\": [ \"read\" ],\n\t\t\t\t\"/var/run/homeproxy/sing-box-c.log\": [ \"read\" ],\n\t\t\t\t\"/var/run/homeproxy/sing-box-s.log\": [ \"read\" ]\n\t\t\t},\n\t\t\t\"ubus\": {\n\t\t\t\t\"service\": [ \"list\" ],\n\t\t\t\t\"luci.homeproxy\": [ \"*\" ]\n\t\t\t},\n\t\t\t\"uci\": [ \"homeproxy\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"file\": {\n\t\t\t\t\"/tmp/homeproxy_certificate.tmp\": [ \"write\" ]\n\t\t\t},\n\t\t\t\"uci\": [ \"homeproxy\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-homeproxy/root/usr/share/rpcd/ucode/luci.homeproxy",
    "content": "#!/usr/bin/ucode\n/*\n * SPDX-License-Identifier: GPL-2.0-only\n *\n * Copyright (C) 2023-2024 ImmortalWrt.org\n */\n\n'use strict';\n\nimport { access, error, lstat, popen, readfile, writefile } from 'fs';\n\n/* Kanged from ucode/luci */\nfunction shellquote(s) {\n\treturn `'${replace(s, \"'\", \"'\\\\''\")}'`;\n}\n\nfunction hasKernelModule(kmod) {\n\treturn (system(sprintf('[ -e \"/lib/modules/$(uname -r)\"/%s ]', shellquote(kmod))) === 0);\n}\n\nconst HP_DIR = '/etc/homeproxy';\nconst RUN_DIR = '/var/run/homeproxy';\n\nconst methods = {\n\tacllist_read: {\n\t\targs: { type: 'type' },\n\t\tcall: function(req) {\n\t\t\tif (index(['direct_list', 'proxy_list'], req.args?.type) === -1)\n\t\t\t\treturn { content: null, error: 'illegal type' };\n\n\t\t\tconst filecontent = readfile(`${HP_DIR}/resources/${req.args?.type}.txt`);\n\t\t\treturn { content: filecontent };\n\t\t}\n\t},\n\tacllist_write: {\n\t\targs: { type: 'type', content: 'content' },\n\t\tcall: function(req) {\n\t\t\tif (index(['direct_list', 'proxy_list'], req.args?.type) === -1)\n\t\t\t\treturn { result: false, error: 'illegal type' };\n\n\t\t\tconst file = `${HP_DIR}/resources/${req.args?.type}.txt`;\n\t\t\tlet content = req.args?.content;\n\n\t\t\t/* Sanitize content */\n\t\t\tif (content) {\n\t\t\t\tcontent = trim(content);\n\t\t\t\tcontent = replace(content, /\\r\\n?/g, '\\n');\n\t\t\t\tif (!match(content, /\\n$/))\n\t\t\t\t\tcontent += '\\n';\n\t\t\t}\n\n\t\t\tsystem(`mkdir -p ${HP_DIR}/resources`);\n\t\t\twritefile(file, content);\n\n\t\t\treturn { result: true };\n\t\t}\n\t},\n\n\tcertificate_write: {\n\t\targs: { filename: 'filename' },\n\t\tcall: function(req) {\n\t\t\tconst writeCertificate = (filename, priv) => {\n\t\t\t\tconst tmpcert = '/tmp/homeproxy_certificate.tmp';\n\t\t\t\tconst filestat = lstat(tmpcert);\n\n\t\t\t\tif (!filestat || filestat.type !== 'file' || filestat.size <= 0) {\n\t\t\t\t\tsystem(`rm -f ${tmpcert}`);\n\t\t\t\t\treturn { result: false, error: 'empty certificate file' };\n\t\t\t\t}\n\n\t\t\t\tlet filecontent = readfile(tmpcert);\n\t\t\t\tif (is_binary(filecontent)) {\n\t\t\t\t\tsystem(`rm -f ${tmpcert}`);\n\t\t\t\t\treturn { result: false, error: 'illegal file type: binary' };\n\t\t\t\t}\n\n\t\t\t\t/* Kanged from luci-proto-openconnect */\n\t\t\t\tconst beg = priv ? /^-----BEGIN (RSA|EC) PRIVATE KEY-----$/ : /^-----BEGIN CERTIFICATE-----$/,\n\t\t\t\t      end = priv ? /^-----END (RSA|EC) PRIVATE KEY-----$/ : /^-----END CERTIFICATE-----$/,\n\t\t\t\t      lines = split(trim(filecontent), /[\\r\\n]/);\n\t\t\t\tlet start = false, i;\n\n\t\t\t\tfor (i = 0; i < length(lines); i++) {\n\t\t\t\t\tif (match(lines[i], beg))\n\t\t\t\t\t\tstart = true;\n\t\t\t\t\telse if (start && !b64dec(lines[i]) && length(lines[i]) !== 64)\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif (!start || i < length(lines) - 1 || !match(lines[i], end)) {\n\t\t\t\t\tsystem(`rm -f ${tmpcert}`);\n\t\t\t\t\treturn { result: false, error: 'this does not look like a correct PEM file' };\n\t\t\t\t}\n\n\t\t\t\t/* Sanitize certificate */\n\t\t\t\tfilecontent = trim(filecontent);\n\t\t\t\tfilecontent = replace(filecontent, /\\r\\n?/g, '\\n');\n\t\t\t\tif (!match(filecontent, /\\n$/))\n\t\t\t\t\tfilecontent += '\\n';\n\n\t\t\t\tsystem(`mkdir -p ${HP_DIR}/certs`);\n\t\t\t\twritefile(`${HP_DIR}/certs/${filename}.pem`, filecontent);\n\t\t\t\tsystem(`rm -f ${tmpcert}`);\n\n\t\t\t\treturn { result: true };\n\t\t\t};\n\n\t\t\tconst filename = req.args?.filename;\n\t\t\tswitch (filename) {\n\t\t\tcase 'client_ca':\n\t\t\tcase 'server_publickey':\n\t\t\t\treturn writeCertificate(filename, false);\n\t\t\t\tbreak;\n\t\t\tcase 'server_privatekey':\n\t\t\t\treturn writeCertificate(filename, true);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn { result: false, error: 'illegal cerificate filename' };\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t},\n\n\tconnection_check: {\n\t\targs: { site: 'site' },\n\t\tcall: function(req) {\n\t\t\tlet url;\n\t\t\tswitch(req.args?.site) {\n\t\t\tcase 'baidu':\n\t\t\t\turl = 'https://www.baidu.com';\n\t\t\t\tbreak;\n\t\t\tcase 'google':\n\t\t\t\turl = 'https://www.google.com';\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\treturn { result: false, error: 'illegal site' };\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\treturn { result: (system(`/usr/bin/wget --spider -qT3 ${url} 2>\"/dev/null\"`, 3100) === 0) };\n\t\t}\n\t},\n\n\tlog_clean: {\n\t\targs: { type: 'type' },\n\t\tcall: function(req) {\n\t\t\tif (!(req.args?.type in ['homeproxy', 'sing-box-c', 'sing-box-s']))\n\t\t\t\treturn { result: false, error: 'illegal type' };\n\n\t\t\tconst filestat = lstat(`${RUN_DIR}/${req.args?.type}.log`);\n\t\t\tif (filestat)\n\t\t\t\twritefile(`${RUN_DIR}/${req.args?.type}.log`, '');\n\t\t\treturn { result: true };\n\t\t}\n\t},\n\n\tsingbox_generator: {\n\t\targs: { type: 'type', params: 'params' },\n\t\tcall: function(req) {\n\t\t\tif (!(req.args?.type in ['ech-keypair', 'uuid', 'reality-keypair', 'vapid-keypair', 'wg-keypair']))\n\t\t\t\treturn { result: false, error: 'illegal type' };\n\n\t\t\tconst type = req.args?.type;\n\t\t\tlet result = {};\n\n\t\t\tconst fd = popen('/usr/bin/sing-box generate ' + type + ` ${req.args?.params || ''}`);\n\t\t\tif (fd) {\n\t\t\t\tlet ech_cfg_set = false;\n\t\t\t\tlet ech_key_set = false;\n\n\t\t\t\tfor (let line = fd.read('line'); length(line); line = fd.read('line')) {\n\t\t\t\t\tif (type === 'uuid')\n\t\t\t\t\t\tresult.uuid = trim(line);\n\t\t\t\t\telse if (type in ['reality-keypair', 'vapid-keypair', 'wg-keypair']) {\n\t\t\t\t\t\tlet priv = match(trim(line), /PrivateKey: (.*)/);\n\t\t\t\t\t\tif (priv)\n\t\t\t\t\t\t\tresult.private_key = priv[1];\n\t\t\t\t\t\tlet pub = match(trim(line), /PublicKey: (.*)/);\n\t\t\t\t\t\tif (pub)\n\t\t\t\t\t\t\tresult.public_key = pub[1];\n\t\t\t\t\t} else if (type in ['ech-keypair']) {\n\t\t\t\t\t\tif (trim(line) === '-----BEGIN ECH CONFIGS-----')\n\t\t\t\t\t\t\tech_cfg_set = true;\n\t\t\t\t\t\telse if (trim(line) === '-----BEGIN ECH KEYS-----')\n\t\t\t\t\t\t\tech_key_set = true;\n\n\t\t\t\t\t\tif (ech_cfg_set)\n\t\t\t\t\t\t\tresult.ech_cfg = result.ech_cfg ? result.ech_cfg + '\\n' + trim(line) : trim(line) ;\n\t\t\t\t\t\tif (ech_key_set)\n\t\t\t\t\t\t\tresult.ech_key = result.ech_key ? result.ech_key + '\\n' + trim(line) : trim(line) ;\n\n\t\t\t\t\t\tif (trim(line) === '-----END ECH CONFIGS-----')\n\t\t\t\t\t\t\tech_cfg_set = false;\n\t\t\t\t\t\telse if (trim(line) === '-----END ECH KEYS-----')\n\t\t\t\t\t\t\tech_key_set = false;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tfd.close();\n\t\t\t}\n\n\t\t\treturn { result };\n\t\t}\n\t},\n\n\tsingbox_get_features: {\n\t\tcall: function() {\n\t\t\tlet features = {};\n\n\t\t\tconst fd = popen('/usr/bin/sing-box version');\n\t\t\tif (fd) {\n\t\t\t\tfor (let line = fd.read('line'); length(line); line = fd.read('line')) {\n\t\t\t\t\tif (match(trim(line), /^sing-box version (.*)/))\n\t\t\t\t\t\tfeatures.version = match(trim(line), /^sing-box version (.*)/)[1];\n\n\t\t\t\t\tlet tags = match(trim(line), /^Tags: (.*)/);\n\t\t\t\t\tif (tags)\n\t\t\t\t\t\tfor (let i in split(tags[1], ','))\n\t\t\t\t\t\t\tfeatures[i] = true;\n\t\t\t\t}\n\n\t\t\t\tfd.close();\n\t\t\t}\n\n\t\t\tfeatures.hp_has_ip_full = access('/usr/libexec/ip-full');\n\t\t\tfeatures.hp_has_tcp_brutal = hasKernelModule('brutal.ko');\n\t\t\tfeatures.hp_has_tproxy = hasKernelModule('nft_tproxy.ko') || access('/etc/modules.d/nft-tproxy');\n\t\t\tfeatures.hp_has_tun = hasKernelModule('tun.ko') || access('/etc/modules.d/30-tun');\n\n\t\t\treturn features;\n\t\t}\n\t},\n\n\tresources_get_version: {\n\t\targs: { type: 'type' },\n\t\tcall: function(req) {\n\t\t\tconst version = trim(readfile(`${HP_DIR}/resources/${req.args?.type}.ver`));\n\t\t\treturn { version: version, error: error() };\n\t\t}\n\t},\n\tresources_update: {\n\t\targs: { type: 'type' },\n\t\tcall: function(req) {\n\t\t\tif (req.args?.type) {\n\t\t\t\tconst type = shellquote(req.args?.type);\n\t\t\t\tconst exit_code = system(`${HP_DIR}/scripts/update_resources.sh ${type}`);\n\t\t\t\treturn { status: exit_code };\n\t\t\t} else\n\t\t\t\treturn { status: 255, error: 'illegal type' };\n\t\t}\n\t}\n};\n\nreturn { 'luci.homeproxy': methods };\n"
  },
  {
    "path": "luci-app-ikoolproxy/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-ikoolproxy\nPKG_VERSION:=3.8.5\nPKG_RELEASE:=20250314\n\nPKG_MAINTAINER:=panda-mute <wxuzju@gmail.com>\n\nLUCI_TITLE:=LuCI support for koolproxy\nLUCI_PKGARCH:=all\nLUCI_DEPENDS:=+koolproxy +openssl-util +ipset +dnsmasq-full +@BUSYBOX_CONFIG_DIFF +iptables-mod-nat-extra +wget\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/koolproxy\n/usr/share/koolproxy/data/rules/\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-ikoolproxy/change.log",
    "content": "## 更新：2024年6月10日：\n1、修复openssl3.0无法下载证书问题，感谢[Black-Steel](https://github.com/Black-Steel)\n2、修复init.d目录下的脚本有stop实现，但是没定义停止编号。会导致一些异常。感谢[lnc1995](https://github.com/lnc1995)\n\n## 更新：2024年1月24日：\n1、支持5.10以及以上内核。但是因为openssl升级可能会导致证书无法下载。目前lean的openssl可以回退到老的版本即可。\n\n## 更新：2022年10月11日：\n1、感谢群里Mr Conter（@biliconter）提供修复证书过期的二进制文件。\n\n## 更新：2022年3月24日：\n1、删除以前所有commits。升级到了最新的comiits：其中重要的几次如下\n\n## 更新：2022年2月12日：\n   删除不必要的rmempty：luci-app-ikoolproxy: drop rmempty\n 感谢 [Beginner-Go](https://github.com/Beginner-Go) \n \n## 更新：2022年1月3日：\n 感谢 [Beginner-Go](https://github.com/Beginner-Go)  升级koolproxy: x86_64 bin update to 3.8.6\n   \n## 更新：2021年3月23日：\n感谢 [maple's sky](https://github.com/maplesky) 大佬提供技术支持，修复状态栏不动态问题。\n\n## 更新：2021年3月4日：\n感谢 [xiaoqi2020](https://github.com/xiaoqi2020) 提供，选择规则托管国内。\n\n## 更新：2021年2月26日（元宵）：\n原来的码云以及coding规则已经无法获取（被封）了。现在托管在github上。\n"
  },
  {
    "path": "luci-app-ikoolproxy/development.doc",
    "content": "koolproxy插件/固件开发文档1.3\n更新日期：2017年7月7日（koolproxy 3.6.1）\n\n================================================================================================\n声明：\nKoolProxy 是一个免费软件，著作权归属 KoolProxy.com，用户可以非商业性地复制和使用 KoolProxy，但禁止将 KoolProxy 用于商业用途。\nKoolProxy 可以对 https 网络数据进行识别代理，使用 https 功能的用户需要自己提供相关证书，本程序提供的证书生成脚本仅供用户参考，证书的保密工作由用户自行负责。\n使用本软件的风险由用户自行承担，在适用法律允许的最大范围内，对因使用本产品所产生的损害及风险，包括但不限于直接或间接的个人损害、商业赢利的丧失、贸易中断、商业信息的丢失或任何其它经济损失，KoolProxy.com 不承担任何责任。\n\n================================================================================================\nKoolProxy By Xiaobao & Crwnet v3.6.1\n\nUSAGE:\n  koolproxy [options] [arguments...]\n\nOPTIONS:\n  -p value        listen port, default value is 3000\n  -l value        log level (0:DEBUG, 1:INFO, 2:AD, 3:WARNING, 4:ERROR), default value is ERROR\n  -c value        thread count, default value is the number of cpus\n  -b value        data path, default value is './data'\n  -d              run as daemon mode\n  -v              show version\n  -h              show help\n\nADVANCED:\n  --cert          generate ssl cert\n  --ipv6          enable ipv6, works for ipv6 nat mode\n  --video | -e    video mode, load video rules only\n  --mark          mark mode, set the socket mark(src ip) when connect to remote host. requires the CAP_NET_ADMIN capability\n  --ttl value     ttl mode, set the socket ttl when connect to remote host. default value is 0 (disable)\n  \n================================================================================================\n交流地址：\n1 QQ群1： 595300867\n2 QQ群2： 203726739\n3 TG群： https://t.me/joinchat/AAAAAD-tO7GPvfOU131_vg\n4 更新日志：http://koolshare.cn/thread-64086-1-1.html\n\n================================================================================================\n#koolproxy部署文件目录参考1（使用openssl生成证书）\n.\n├── data\n│   ├── gen_ca.sh\t\t\t\t#证书生成脚本\n│   ├── koolproxy_ipset.conf\t\t#ipset名单\n│   ├── openssl.cnf\t\t\t\t#证书生成所用配置文件\n│   ├── rules\t\t\t\t\t#规则存放文件夹\n│   │   ├── kp.dat\t\t\t\t#视频规则\n│   │   ├── koolproxy.txt\t\t#静态规则\n│   │   ├── daily.txt\t\t\t#每日规则\n│   │   └── user.txt\t\t\t#自定义规则\n│   └── version\t\t\t\t\t#插件版本号(merlin)\n└── koolproxy\t\t\t\t\t#koolproxy二进制(为了保证二进制顺利更新，请保证目录可写)\n\n1 证书生成使用命令 sh gen_ca.sh，该脚本会调用系统内的openssl来生成证书，运行成功后会自动创建data/private data/cert目录\n  私钥和公钥会分别存在data/private data/cert目录下，使用http://110.110.110.110会下载路由器内的证书\n  \n------------------------------------------------------------------------------------------------\n#koolproxy部署文件目录参考2（使用koolproxy生成证书）\n.\n└── koolproxy\t\t\t\t\t#koolproxy二进制(为了保证二进制顺利更新，请保证目录可写)\n1 因为规则文件会由koolproxy自动下载,下载后会自动创建data/rules目录\n2 使用koolproxy --cert命令可以生成证书，运行成功后会自动创建data/private data/cert目录\n  私钥和公钥会分别存在data/private data/cert目录下，使用http://110.110.110.110会下载路由器内的证书\n  因为mbedtls性能原因，在非软路由机器上用koolproxy --cert生成证书需要时间较长，请耐心等待\n\n================================================================================================\n说明：\n1 koolproxy启动会自动检测规则更新，如果没有./data/rules文件夹，会自己创建并下载规则到此处\n2 koolproxy启动后会检测二进制文件更新，如果有更新，会替换./koolproxy，并且由父进程重启koolproxy，以后每20分钟检测一次更新\n3 现在不支持规则订阅了，只能识别kp.dat, koolproxy.txt, user.txt,daily.txt，需要自定义规则的可以修改user.txt\n\n# 二进制下载固定地址\nhttps://koolproxy.com/downloads/i386\nhttps://koolproxy.com/downloads/x86_64\nhttps://koolproxy.com/downloads/arm\nhttps://koolproxy.com/downloads/mips\nhttps://koolproxy.com/downloads/mipsel\n\n# 规则下载固定地址\nhttps://kprule.com/koolproxy.txt\nhttps://kprule.com/daily.txt\nhttps://kprule.com/kp.dat\nhttps://kprule.com/user.txt\n\n# 规则下载对应的CDN地址\nhttps://kprules.b0.upaiyun.com/koolproxy.txt\nhttps://kprules.b0.upaiyun.com/daily.txt\nhttps://kprules.b0.upaiyun.com/kp.dat\nhttps://kprules.b0.upaiyun.com/user.txt\n\n# 二进制文件和规则 github备份地址：\n二进制：https://github.com/koolproxy/koolproxy-bin (已作废)\n规则：https://github.com/koolproxy/koolproxy_rules (已作废)\n\n\n1 建议从上面的链接获取最新的二进制和基本的规则文件，然后按照上面的目录结构来部署\n2 如果不需要https过滤，只需要一个koolproxy程序就足够了，data文件夹和rules文件夹都会自己创建。 \n3 koolproxy.txt内有视频规则、静态规则、每日规则的更新日期，可以用于提取并显示到界面\n\n================================================================================================\nkoolproxy运行：\n\n1 在koolproxy主程序目录运行，例如merlin固件下运行：cd /koolshare/koolproxy && koolproxy -d\n2 不在koolproxy主程序目录运行（例如将koolproxy放在环境变量中），例如merlin固件下运行：koolproxy -b /koolshare/koolproxy -d -b为data路径\n  其它运行方式可能会造成koolproxy识别不到data目录而无法加载规则\n  koolproxy运行后默认会使用端口3000作为透明代理端口，需要利用iptables将数据导到端口3000才能发挥作用。\n  \n视频模式：\n1 使用命令koolproxy -e 即可开启\n2 开启后只会加载视频规则kp.dat和user.txt\n\n调试模式：\n1 使用命令koolproxy -l0 即可开启，l后面的数字代表不同的日志详细程度\n2 需要检查规则命中行数可以需要使用-l2\n\nttl功能：\n1 使用命令koolproxy --ttl 160 即可开启ttl功能，后面的数值代表ttl大小\n2 ttl功能开启后，koolproxy会对经过它的所有数据ttl进行调整，可以利用iptables的match ttl功能数据进行匹配\n\nmark功能：\n1 使用命令koolproxy --mark 即可开启mark功能\n2 mark功能开启后，koolproxy会对经过它的所有数据打上标记，mark值等于该数据的源ip转换为十六进制的值\n3 例如局域网内192.168.1.100的数据，将会被打上0xc0a80164的mark（192 = c0, 168 = a8, 1 = 01, 100 = 64 ）\n4 开发者可以用此功和SS配合，达到既科学上网，又能过滤这些科学上网的流量，还不影响科学上网访问控制的功能\n5 ip转换为mark值参考命令：echo 192.168.1.100 | awk -F \".\" '{printf (\"0x%02x\", $1)} {printf (\"%02x\", $2)} {printf (\"%02x\", $3)} {printf (\"%02x\\n\", $4)}'\n\n================================================================================================\nss + kp过滤方案（2017年7月7日）：\n\n方案1（优先SS，其次KP，不推荐）：\n1 在NAT PREROUTING链内，SS在前，KP在后，流量将先走SS，经过SS分流后，国外流量走ss-redir，实现翻墙；\n2 而剩下国内流量在PREROUTING链内继续往下匹配到koolrpxy规则，流量最终走koolproxy，实现过滤。\n  结果：koolproxy只能过滤国内流量（SS剩下的）。\n\n方案2（优先KP，其次SS，不推荐）;\n1 在NAT PREROUTING链内，KP在前，SS在后，流量将先走KP，实现过滤；\n2 为了SS能拿到KP过滤后的数据，使用match ttl匹配，在OUTPUT链内将流量全部给SS，实现翻墙；\n  结果：因为在OUTPUT链内没有源ip信息，流量给SS后无法匹配到源ip，因此SS失去了acl（访问控制）功能。\n\n方案3 (优先kp，其次SS，推荐)；\n  为便于理解，以下iptables配置只展示流量经过顺序，不是iptables的创建顺序，PREROUTING内规则的创建实际上应该在最后\n0 koolproxy默认开启ttl和mark功能 KoolProxy --ttl 160 --mark -d（固件不支持ttl的仅开启mark也行: KoolProxy --mark -d）\n1 在NAT PREROUTING链内，KP在前，SS在后，KP开启--mark，流量将先走KP（80,443），实现过滤，过滤后每个主机会被打上不同的mark；\n  #KP在前，所有tcp流量全部交给KOOLPROXY链\n  -A PREROUTING -p tcp -j KOOLPROXY\n  #SS在后，在kp开启的时候，只能拿到非80,443的流量，在kp关闭后，可以拿到所有端口的流量\n  -A PREROUTING -p tcp -j SHADOWSOCKS\n  \n2 例如局域网内192.168.1.100主机的数据经过kp过滤后，将会被打上0xc0a80164的mark（192 = c0, 168 = a8, 1 = 01, 100 = 64 ）；\n  #创建KOOLPROXY链，用于白名单和访问控制\n  -N KOOLPROXY\n  #创建KOOLPROXY_HTTP链，用于过滤http流量\n  -N KOOLPROXY_HTTP\n  #创建KOOLPROXY_HTTPS链，用于过滤https流量\n  -N KOOLPROXY_HTTPS\n  #局域网和保留地址不走kp\n  -A KOOLPROXY -m set --match-set white_kp_list dst -j RETURN\n  #主机192.168.1.100需要https过滤\n  -A KOOLPROXY -s 192.168.1.100/32 -p tcp -g KOOLPROXY_HTTPS\n  #其它主机过滤http流量\n  -A KOOLPROXY -p tcp -j KOOLPROXY_HTTP\n  \n3 为了SS能拿到数据，在NAT OUTPUT链中，使用match ttl匹配，在OUTPUT链内将流量全部给SHADOWSOCKS_EXT链；\n  #创建SHADOWSOCKS_EXT链，用于开启kp情况下ss的访问控制实现\n  -N SHADOWSOCKS_EXT\n  #使用ttl匹配将KP过滤后的数据转到SHADOWSOCKS_EXT链（如果固件不支持ttl匹配，使用下面的命令）\n  -A OUTPUT -p tcp -m ttl --ttl-eq 160 -j SHADOWSOCKS_EXT\n  #如果固件不支持ttl match，可以用mark匹配ip地址的前三位（用0xffffff00作为掩码的形式），来将KP过滤后的数据转到SHADOWSOCKS_EXT链\n  # echo 192.168.1 | awk -F \".\" '{printf (\"0x%02x\", $1)} {printf (\"%02x\", $2)} {printf (\"%02x\", $3)} {printf (\"00/0xffffff00\\n\")}' = 0xc0a80100/0xffffff00\n  -A OUTPUT -p tcp -m mark --mark 0xc0a80100/0xffffff00 -j SHADOWSOCKS_EXT\n  \n4 如果开启了acl，比如需要192.168.1.75不走SS（全端口），192.168.1.246走gfwlist模式（80,443端口），192.168.1.214走大陆白名单模式（22,80,443端口），剩余主机全部走大陆白名单模式（全端口）：\n  #主机192.168.1.75（0xc0a8014b），流量经过KP过滤后并打上mark后，通过OUTPUT链进入SHADOWSOCKS_EXT链，而未能翻墙（RETURN）\n  -A SHADOWSOCKS_EXT -p tcp -m mark --mark 0xc0a8014b -j RETURN\t\t\n  #主机192.168.1.246（0xc0a801f6），流量经过KP过滤后并打上mark后，通过OUTPUT链进入SHADOWSOCKS_EXT链，在此流量被导向了SHADOWSOCKS_GFW链，实现gfwlist模式翻墙（80,443端口）\t\t\t\t\t\t\t\n  -A SHADOWSOCKS_EXT -p tcp -m multiport --dports 80,443 -m mark --mark 0xc0a801f6 -g SHADOWSOCKS_GFW\n  #主机192.168.1.214（0xc0a801f6），流量经过KP过滤后并打上mark后，通过OUTPUT链进入SHADOWSOCKS_EXT链，在此流量被导向了SHADOWSOCKS_CHN链，实现大陆白名单模式翻墙（22,80,443端口）\n  -A SHADOWSOCKS_EXT -p tcp -m multiport --dports 22,,80,443 -m mark --mark 0xc0a801d6 -g SHADOWSOCKS_CHN\n  #剩余的主机，流量经过KP过滤后并打上mark后，通过OUTPUT链进入SHADOWSOCKS_EXT链，在此流量被导向了SHADOWSOCKS_CHN链，实现大陆白名单模式翻墙（全端口）\n  -A SHADOWSOCKS_EXT -p tcp -j SHADOWSOCKS_CHN\n  \n情形：\n1 当SS开启，kp未开启：所有流量走ss PREROUTING过，经过分流后，国内的流量在经过OUTPUT的时候，因为KP没开，数据不会匹配到ttl值（或者没匹配到mark值），所以不会过滤广告，翻墙正常\n2 当KP开启，SS未开启，所有流量走kp PREROUTING过，广告过滤正常\n3 当SS开启，翻墙和acl工作正常的时候，开启KP：KP在PREROUTING内插入到SS前面，会先得到流量，广告过滤正常\n4 当KP开启，过滤广告正常的时候，开启SS：SS从原来的从PREROUTING拿流量变成从OUTPUT内拿流量，翻墙和acl会同样正常\n5 当KP和SS都开启，此时关闭SS，kp过滤广告正常\n6 当KP和SS都开启，此时关闭KP，ss翻墙和acl正常\n\n总结：\n使用 ttl + mark （或者纯mark）的方式，可以实现原先很难实现的过滤经过SS流量的广告\n主要的改动在于给SS预置好OUTPUT和SHADOWSOCKS_EXT规则链，当kp启用时，它们就会工作，kp关闭时，不会影响正常数据\n次要的改动就是给koolproxy默认开启ttl + mark（或者纯mark）功能\n================================================================================================\n"
  },
  {
    "path": "luci-app-ikoolproxy/koolproxy/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=koolproxy\nPKG_VERSION:=3.8.5\nPKG_RELEASE:=$(AUTORELEASE)\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/koolproxy\n  SECTION:=multimedia\n  CATEGORY:=Multimedia\n  DEPENDS:=@(aarch64||arm||i386||mips||mipsel||x86_64)\n  TITLE:=koolproxy bin is from koolshare\n  URL:=https://github.com/houzi-/CDN\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/koolproxy/install\n\t$(INSTALL_DIR) $(1)/usr/share/koolproxy\n\nifeq ($(ARCH),aarch64)\n\t$(INSTALL_BIN) ./files/aarch64 $(1)/usr/share/koolproxy/koolproxy\n\nelse ifeq ($(ARCH),arm)\n\t$(INSTALL_BIN) ./files/arm $(1)/usr/share/koolproxy/koolproxy\n\nelse ifeq ($(ARCH),i386)\n\t$(INSTALL_BIN) ./files/i386 $(1)/usr/share/koolproxy/koolproxy\n\nelse ifeq ($(ARCH),mips)\n\t$(INSTALL_BIN) ./files/mips $(1)/usr/share/koolproxy/koolproxy\n\nelse ifeq ($(ARCH),mipsel)\n\t$(INSTALL_BIN) ./files/mipsel $(1)/usr/share/koolproxy/koolproxy\n\nelse ifeq ($(ARCH),x86_64)\n\t$(INSTALL_BIN) ./files/x86_64 $(1)/usr/share/koolproxy/koolproxy\nendif\nendef\n\n$(eval $(call BuildPackage,koolproxy))\n"
  },
  {
    "path": "luci-app-ikoolproxy/luasrc/controller/koolproxy.lua",
    "content": "module(\"luci.controller.koolproxy\",package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/koolproxy\") then\n\t\treturn\n\tend\n\n\tentry({\"admin\", \"services\", \"koolproxy\"}, alias(\"admin\", \"services\", \"koolproxy\", \"basic\"), _(\"iKoolProxy 滤广告\"), 1).dependent = true\n\tentry({\"admin\", \"services\", \"koolproxy\", \"basic\"}, cbi(\"koolproxy/basic\"), _(\"基本设置\"), 1).leaf = true\n\tentry({\"admin\", \"services\", \"koolproxy\", \"control\"}, cbi(\"koolproxy/control\"), _(\"访问控制\"), 2).leaf = true\n\tentry({\"admin\", \"services\", \"koolproxy\", \"add_rule\"}, cbi(\"koolproxy/add_rule\"), _(\"规则订阅\"), 3).leaf = true\n\tentry({\"admin\", \"services\", \"koolproxy\", \"cert\"}, cbi(\"koolproxy/cert\"), _(\"证书管理\"), 4).leaf = true\n\tentry({\"admin\", \"services\", \"koolproxy\", \"white_list\"}, cbi(\"koolproxy/white_list\"), _(\"网站白名单设置\"), 5).leaf = true\n\tentry({\"admin\", \"services\", \"koolproxy\", \"black_list\"}, cbi(\"koolproxy/black_list\"), _(\"网站黑名单设置\"), 6).leaf = true\n\tentry({\"admin\", \"services\", \"koolproxy\", \"ip_white_list\"}, cbi(\"koolproxy/ip_white_list\"), _(\"IP白名单设置\"), 7).leaf = true\n\tentry({\"admin\", \"services\", \"koolproxy\", \"ip_black_list\"}, cbi(\"koolproxy/ip_black_list\"), _(\"IP黑名单设置\"), 8).leaf = true\n\tentry({\"admin\", \"services\", \"koolproxy\", \"custom_rule\"}, cbi(\"koolproxy/custom_rule\"), _(\"自定义规则\"), 9).leaf = true\n\tentry({\"admin\", \"services\", \"koolproxy\", \"update_log\"}, cbi(\"koolproxy/update_log\"), _(\"更新日志\"), 10).leaf = true\n\tentry({\"admin\", \"services\", \"koolproxy\", \"tips\"}, cbi(\"koolproxy/tips\"), _(\"帮助支持\"), 11).leaf = true\n\tentry({\"admin\", \"services\", \"koolproxy\", \"rss_rule\"}, cbi(\"koolproxy/rss_rule\"), nil).leaf = true\n\tentry({\"admin\", \"services\", \"koolproxy\", \"status\"}, call(\"act_status\")).leaf = true\nend\n\nfunction act_status()\n\tlocal e = {}\n\te.running = luci.sys.call(\"pidof koolproxy >/dev/null\") == 0\n\te.bin_version = luci.sys.exec(\"/usr/share/koolproxy/koolproxy -v\")\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n"
  },
  {
    "path": "luci-app-ikoolproxy/luasrc/model/cbi/koolproxy/add_rule.lua",
    "content": "o = Map(\"koolproxy\")\n\nt = o:section(TypedSection,\"rss_rule\", translate(\"iKoolProxy 规则订阅\"))\nt.description = translate(\"请确保订阅规则的兼容性\")\nt.anonymous = true\nt.addremove = true\nt.sortable = true\nt.template = \"cbi/tblsection\"\nt.extedit = luci.dispatcher.build_url(\"admin/services/koolproxy/rss_rule/%s\")\n\nt.create = function(...)\n\tlocal sid = TypedSection.create(...)\n\tif sid then\n\t\tluci.http.redirect(t.extedit % sid)\n\t\treturn\n\tend\nend\n\ne = t:option(Flag, \"load\", translate(\"启用\"))\ne.default = 0\n\ne = t:option(DummyValue, \"name\", translate(\"规则名称\"))\nfunction e.cfgvalue(...)\n\treturn Value.cfgvalue(...) or translate(\"None\")\nend\n\ne = t:option(DummyValue,\"url\", translate(\"规则地址\"))\nfunction e.cfgvalue(...)\n\treturn Value.cfgvalue(...) or translate(\"None\")\nend\n\ne = t:option(DummyValue, \"time\", translate(\"更新时间\"))\n\nreturn o\n"
  },
  {
    "path": "luci-app-ikoolproxy/luasrc/model/cbi/koolproxy/basic.lua",
    "content": "\nlocal o,t,e\nlocal a = luci.sys.exec(\"head -3 /usr/share/koolproxy/data/rules/koolproxy.txt | grep rules | awk -F' ' '{print $3,$4}'\")\nlocal b = luci.sys.exec(\"head -4 /usr/share/koolproxy/data/rules/koolproxy.txt | grep video | awk -F' ' '{print $3,$4}'\")\nlocal c = luci.sys.exec(\"head -3 /usr/share/koolproxy/data/rules/daily.txt | grep rules | awk -F' ' '{print $3,$4}'\")\nlocal s = luci.sys.exec(\"grep -v !x /usr/share/koolproxy/data/rules/adg.txt | wc -l\")\nlocal m = luci.sys.exec(\"grep -v !x /usr/share/koolproxy/data/rules/adgk.txt | wc -l\")\nlocal u = luci.sys.exec(\"grep -v !x /usr/share/koolproxy/data/rules/steven.txt | wc -l\")\nlocal p = luci.sys.exec(\"grep -v !x /usr/share/koolproxy/data/rules/yhosts.txt | wc -l\")\nlocal h = luci.sys.exec(\"grep -v '^!' /usr/share/koolproxy/data/rules/user.txt | wc -l\")\nlocal l = luci.sys.exec(\"grep -v !x /usr/share/koolproxy/data/rules/koolproxy.txt | wc -l\")\nlocal q = luci.sys.exec(\"grep -v !x /usr/share/koolproxy/data/rules/daily.txt | wc -l\")\nlocal f = luci.sys.exec(\"grep -v !x /usr/share/koolproxy/data/rules/antiad.txt | wc -l\")\nlocal i = luci.sys.exec(\"cat /usr/share/koolproxy/dnsmasq.adblock | wc -l\")\n\no = Map(\"koolproxy\")\no.title = translate(\"iKoolProxy滤广告\")\no.description = translate(\"iKoolProxy是基于KoolProxyR重新整理的能识别adblock规则的免费开源软件,追求体验更快、更清洁的网络，屏蔽烦人的广告！\")\n\no:section(SimpleSection).template = \"koolproxy/koolproxy_status\"\n\nt = o:section(TypedSection, \"global\")\nt.anonymous = true\n\ne = t:option(Flag, \"enabled\", translate(\"启用\"))\ne.default = 0\n\ne = t:option(Value, \"startup_delay\", translate(\"启动延迟\"))\ne:value(0, translate(\"不启用\"))\nfor _, v in ipairs({5, 10, 15, 25, 40, 60}) do\n\te:value(v, translate(\"%u 秒\") %{v})\nend\ne.datatype = \"uinteger\"\ne.default = 0\n\ne = t:option(ListValue, \"koolproxy_mode\", translate(\"过滤模式\"))\ne:value(1, translate(\"全局模式\"))\ne:value(2, translate(\"IPSET模式\"))\ne:value(3, translate(\"视频模式\"))\ne.default = 1\n\ne = t:option(MultiValue, \"koolproxy_rules\", translate(\"内置规则\"))\ne:value(\"koolproxy.txt\", translate(\"静态规则\"))\ne:value(\"daily.txt\", translate(\"每日规则\"))\ne:value(\"kp.dat\", translate(\"视频规则\"))\ne:value(\"user.txt\", translate(\"自定义规则\"))\ne.optional = false\n\ne = t:option(MultiValue, \"thirdparty_rules\", translate(\"第三方规则\"))\ne:value(\"adg.txt\", translate(\"AdGuard规则\"))\ne:value(\"steven.txt\", translate(\"Steven规则\"))\ne:value(\"yhosts.txt\", translate(\"Yhosts规则\"))\ne:value(\"antiad.txt\", translate(\"AntiAD规则\"))\ne:value(\"adgk.txt\", translate(\"Banben规则\"))\ne.optional = false\n\ne = t:option(ListValue, \"koolproxy_port\", translate(\"端口控制\"))\ne:value(0, translate(\"关闭\"))\ne:value(1, translate(\"开启\"))\ne.default = 0\n\n--e = t:option(ListValue, \"koolproxy_ipv6\", translate(\"IPv6支持\"))\n--e:value(0, translate(\"关闭\"))\n--e:value(1, translate(\"开启\"))\n--e.default = 0\n\ne = t:option(Value, \"koolproxy_bp_port\", translate(\"例外端口\"))\ne.description = translate(\"单端口:80&nbsp;&nbsp;多端口:80,443\")\ne:depends(\"koolproxy_port\", \"1\")\n\ne = t:option(Flag, \"koolproxy_host\", translate(\"开启Adblock Plus Hosts\"))\ne:depends(\"koolproxy_mode\",\"2\")\ne.default = 0\n\ne = t:option(ListValue, \"koolproxy_acl_default\", translate(\"默认访问控制\"))\ne.description = translate(\"访问控制设置中其他主机的默认规则\")\ne:value(0, translate(\"不过滤\"))\ne:value(1, translate(\"过滤HTTP协议\"))\ne:value(2, translate(\"过滤HTTP(S)协议\"))\ne:value(3, translate(\"过滤全端口\"))\ne.default = 1\n\ne = t:option(ListValue, \"time_update\", translate(\"定时更新\"))\ne.description = translate(\"定时更新规则\")\nfor t = 0,23 do\n\te:value(t,translate(\"每天\"..t..\"点\"))\nend\ne:value(nil, translate(\"关闭\"))\ne.default = nil\n\ne = t:option(Button, \"restart\", translate(\"规则状态\"))\ne.inputtitle = translate(\"更新规则\")\ne.inputstyle = \"reload\"\ne.write = function()\n\tluci.sys.call(\"/usr/share/koolproxy/kpupdate 2>&1 >/dev/null\")\n\tluci.http.redirect(luci.dispatcher.build_url(\"admin\",\"services\",\"koolproxy\"))\nend\ne.description = translate(string.format(\"<font color=\\\"red\\\"><strong>更新订阅规则与Adblock Plus Hosts</strong></font><br /><font color=\\\"green\\\">AdGuard规则: %s条<br />Steven规则: %s条<br />Yhosts规则: %s条<br />AntiAD规则: %s条<br />Banben规则: %s条<br />静态规则: %s条<br />视频规则: %s<br />每日规则: %s条<br />自定义规则: %s条<br />Host: %s条</font><br />\", s, u, p, f, m, l, b, q, h, i))\n\nreturn o\n"
  },
  {
    "path": "luci-app-ikoolproxy/luasrc/model/cbi/koolproxy/black_list.lua",
    "content": "o = Map(\"koolproxy\")\n\nt = o:section(TypedSection, \"global\")\nt.anonymous = true\n\ne = t:option(TextValue, \"adblock_domain\")\ne.description = translate(\"加入的网址将走广告过滤端口。只针对黑名单模式。只能输入WEB地址，如：google.com，每个地址一行。\")\ne.rows = 28\ne.wrap = \"off\"\n\nlocal fs = require \"nixio.fs\"\nlocal i = \"/etc/adblocklist/adblock\"\n\nfunction e.cfgvalue()\n\treturn fs.readfile(i) or \"\"\nend\n\nfunction e.write(self, section, value)\n\tif value then\n\t\tvalue = value:gsub(\"\\r\\n\", \"\\n\")\n\telse\n\t\tvalue = \"\"\n\tend\n\tfs.writefile(\"/tmp/adblock\", value)\n\tif (luci.sys.call(\"cmp -s /tmp/adblock /etc/adblocklist/adblock\") == 1) then\n\t\tfs.writefile(i, value)\n\tend\n\tfs.remove(\"/tmp/adblock\")\nend\n\nreturn o\n"
  },
  {
    "path": "luci-app-ikoolproxy/luasrc/model/cbi/koolproxy/cert.lua",
    "content": "o = Map(\"koolproxy\")\n\nt = o:section(TypedSection, \"global\",translate(\"证书恢复\"))\nt.description = translate(\"上传恢复已备份的证书，文件名必须为koolproxyCA.tar.gz\")\nt.anonymous = true\n\ne = t:option(DummyValue, \"c1status\")\ne = t:option(FileUpload, \"\")\ne.template = \"koolproxy/caupload\"\ne = t:option(DummyValue,\"\",nil)\ne.template = \"koolproxy/cadvalue\"\n\nif nixio.fs.access(\"/usr/share/koolproxy/data/certs/ca.crt\") then\n\nt = o:section(TypedSection, \"global\",translate(\"证书备份\"))\nt.description = translate(\"下载备份的证书\")\nt.anonymous = true\n\ne = t:option(DummyValue,\"c2status\")\ne = t:option(Button,\"certificate\")\ne.inputtitle = translate(\"下载证书备份\")\ne.inputstyle = \"reload\"\ne.write = function()\n\t\tluci.sys.call(\"/usr/share/koolproxy/camanagement backup 2>&1 >/dev/null\")\n\t\tDownload()\n\t\tluci.http.redirect(luci.dispatcher.build_url(\"admin\",\"services\",\"koolproxy\"))\n\tend\nend\n\nfunction Download()\n\tlocal t,e\n\tt = nixio.open(\"/tmp/upload/koolproxyca.tar.gz\",\"r\")\n\tluci.http.header('Content-Disposition', 'attachment; filename=\"koolproxyCA.tar.gz\"')\n\tluci.http.prepare_content(\"application/octet-stream\")\n\twhile true do\n\t\te = t:read(nixio.const.buffersize)\n\t\tif (not e) or (#e==0) then\n\t\t\tbreak\n\t\telse\n\t\t\tluci.http.write(e)\n\t\tend\n\tend\n\tt:close()\n\tluci.http.close()\nend\n\nlocal t,e\nt = \"/tmp/upload/\"\nnixio.fs.mkdir(t)\nluci.http.setfilehandler(\nfunction(o,a,i)\n\tif not e then\n\t\tif not o then return end\n\t\te = nixio.open(t..o.file,\"w\")\n\t\tif not e then\n\t\t\treturn\n\t\tend\n\tend\n\tif a and e then\n\t\te:write(a)\n\tend\n\tif i and e then\n\t\te:close()\n\t\te = nil\n\t\tluci.sys.call(\"/usr/share/koolproxy/camanagement restore 2>&1 >/dev/null\")\n\tend\nend\n)\n\nreturn o\n"
  },
  {
    "path": "luci-app-ikoolproxy/luasrc/model/cbi/koolproxy/control.lua",
    "content": "o = Map(\"koolproxy\")\n\nt = o:section(TypedSection, \"acl_rule\", translate(\"iKoolProxy 访问控制\"))\nt.anonymous = true\n\nt.description = translate(\"访问控制列表是用于指定特殊IP过滤模式的工具，如为已安装证书的客户端开启https广告过滤等，MAC或者IP必须填写其中一项。\")\nt.template = \"cbi/tblsection\"\nt.sortable = true\nt.addremove = true\n\ne = t:option(Value, \"remarks\", translate(\"客户端备注\"))\ne.width = \"30%\"\n\ne = t:option(Value, \"ipaddr\", translate(\"内部 IP 地址\"))\ne.width = \"20%\"\ne.datatype = \"ip4addr\"\nluci.ip.neighbors({family = 4}, function(neighbor)\n\tif neighbor.reachable then\n\t\te:value(neighbor.dest:string(), \"%s (%s)\" %{neighbor.dest:string(), neighbor.mac})\n\tend\nend)\n\ne = t:option(Value,\"mac\",translate(\"MAC 地址\"))\ne.width = \"20%\"\ne.datatype = \"macaddr\"\nluci.ip.neighbors({family = 4}, function(neighbor)\n\tif neighbor.reachable then\n\t\te:value(neighbor.mac, \"%s (%s)\" %{neighbor.mac, neighbor.dest:string()})\n\tend\nend)\n\ne = t:option(ListValue, \"proxy_mode\", translate(\"访问控制\"))\ne.width = \"20%\"\ne:value(0,translate(\"不过滤\"))\ne:value(1,translate(\"过滤HTTP协议\"))\ne:value(2,translate(\"过滤HTTP(S)协议\"))\ne:value(3,translate(\"过滤全端口\"))\ne.default = 1\n\nreturn o\n"
  },
  {
    "path": "luci-app-ikoolproxy/luasrc/model/cbi/koolproxy/custom_rule.lua",
    "content": "o = Map(\"koolproxy\")\n\nt = o:section(TypedSection, \"global\")\nt.anonymous = true\n\ne = t:option(TextValue, \"user_rule\")\ne.description = translate(\"输入你的自定义规则，每条规则一行。\")\ne.rows = 28\ne.wrap = \"off\"\n\nlocal fs = require \"nixio.fs\"\nlocal i = \"/usr/share/koolproxy/data/user.txt\"\n\nfunction e.cfgvalue()\n\treturn fs.readfile(i) or \"\"\nend\n\nfunction e.write(self, section, value)\n\tif value then\n\t\tvalue = value:gsub(\"\\r\\n\", \"\\n\")\n\telse\n\t\tvalue = \"\"\n\tend\n\tfs.writefile(\"/tmp/user.txt\", value)\n\tif (luci.sys.call(\"cmp -s /tmp/user.txt /usr/share/koolproxy/data/user.txt\") == 1) then\n\t\tfs.writefile(i, value)\n\tend\n\tfs.remove(\"/tmp/user.txt\")\nend\n\nreturn o\n"
  },
  {
    "path": "luci-app-ikoolproxy/luasrc/model/cbi/koolproxy/ip_black_list.lua",
    "content": "o = Map(\"koolproxy\")\n\nt = o:section(TypedSection, \"global\")\nt.anonymous = true\n\ne = t:option(TextValue, \"adblock_ip\")\ne.description = translate(\"这些已经加入的ip地址不会使用过滤器.请输入ip地址或ip地址段，每行只能输入一个ip地址。例如，112.123.134.145 / 24或112.123.134.145。\")\ne.rows = 28\ne.wrap = \"off\"\n\nlocal fs = require \"nixio.fs\"\nlocal i = \"/etc/adblocklist/adblockip\"\n\nfunction e.cfgvalue()\n\treturn fs.readfile(i) or \"\"\nend\n\nfunction e.write(self, section, value)\n\tif value then\n\t\tvalue = value:gsub(\"\\r\\n\", \"\\n\")\n\telse\n\t\tvalue = \"\"\n\tend\n\tfs.writefile(\"/tmp/adblockip\", value)\n\tif (luci.sys.call(\"cmp -s /tmp/adblockip /etc/adblocklist/adblockip\") == 1) then\n\t\tfs.writefile(i, value)\n\tend\n\tfs.remove(\"/tmp/adblockip\")\nend\n\nreturn o\n"
  },
  {
    "path": "luci-app-ikoolproxy/luasrc/model/cbi/koolproxy/ip_white_list.lua",
    "content": "o = Map(\"koolproxy\")\n\nt = o:section(TypedSection, \"global\")\nt.anonymous = true\n\ne = t:option(TextValue, \"adbypass_ip\")\ne.description = translate(\"这些已加入的ip地址将使用代理，但只有GFW型号。请输入ip地址或ip地址段，每行只能输入一个ip地址。例如，112.123.134.145 / 24或112.123.134.145。\")\ne.rows = 28\ne.wrap = \"off\"\n\nlocal fs = require \"nixio.fs\"\nlocal i = \"/etc/adblocklist/adbypassip\"\n\nfunction e.cfgvalue()\n\treturn fs.readfile(i) or \"\"\nend\n\nfunction e.write(self, section, value)\n\tif value then\n\t\tvalue = value:gsub(\"\\r\\n\", \"\\n\")\n\telse\n\t\tvalue = \"\"\n\tend\n\tfs.writefile(\"/tmp/adbypassip\", value)\n\tif (luci.sys.call(\"cmp -s /tmp/adbypassip /etc/adblocklist/adbypassip\") == 1) then\n\t\tfs.writefile(i, value)\n\tend\n\tfs.remove(\"/tmp/adbypassip\")\nend\n\nreturn o\n"
  },
  {
    "path": "luci-app-ikoolproxy/luasrc/model/cbi/koolproxy/rss_rule.lua",
    "content": "local m, s, o\nlocal koolproxy = \"koolproxy\"\nlocal sid = arg[1]\n\nm = Map(koolproxy)\nm.title = translate(\"iKoolProxy滤广告 - 编辑规则\")\nm.redirect = luci.dispatcher.build_url(\"admin/services/koolproxy\")\n\nif not arg[1] or m.uci:get(koolproxy, sid) ~= \"rss_rule\" then\n\tluci.http.redirect(m.redirect)\n\treturn\nend\n\n-- [[ Edit Rule ]]--\ns = m:section(NamedSection, sid, \"rss_rule\")\ns.anonymous = true\ns.addremove = true\n\no = s:option(Flag, \"load\", translate(\"启用\"))\no.default = 0\n\no = s:option(Value, \"name\", translate(\"规则描述\"))\n\no = s:option(Value, \"url\", translate(\"规则地址\"))\no.placeholder=\"[https|http|ftp]://[Hostname]/[File]\"\nfunction o.validate(self, value)\n\tif not value then\n\t\treturn nil\n\telse\n\t\treturn value\n\tend\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-ikoolproxy/luasrc/model/cbi/koolproxy/tips.lua",
    "content": "o = Map(\"koolproxy\")\n\nt = o:section(TypedSection, \"usetips\")\nt.title = translate(\"iKoolProxy 帮助支持\")\nt.anonymous = true\nt:append(Template(\"koolproxy/tips\"))\n\nreturn o\n"
  },
  {
    "path": "luci-app-ikoolproxy/luasrc/model/cbi/koolproxy/update_log.lua",
    "content": "o = Map(\"koolproxy\")\n\nt = o:section(TypedSection, \"global\")\nt.anonymous = true\n\nlocal fs = require \"nixio.fs\"\nlocal i = \"/var/log/koolproxy.log\"\n\ne = t:option(TextValue, \"kpupdate_log\")\ne.description = translate(\"查看最近的更新日志\")\ne.rows = 28\ne.wrap = \"off\"\n\nfunction e.cfgvalue()\n\treturn fs.readfile(i) or \"\"\nend\n\nfunction e.write(self, section, value)\nend\n\nreturn o\n"
  },
  {
    "path": "luci-app-ikoolproxy/luasrc/model/cbi/koolproxy/white_list.lua",
    "content": "o = Map(\"koolproxy\")\n\nt = o:section(TypedSection, \"global\")\nt.anonymous = true\n\ne = t:option(TextValue, \"adbypass_domain\")\ne.description = translate(\"这些已经加入的网站将不会使用过滤器。请输入网站的域名，每行只能输入一个网站域名。例如google.com。\")\ne.rows = 28\ne.wrap = \"off\"\n\nlocal fs = require \"nixio.fs\"\nlocal i = \"/etc/adblocklist/adbypass\"\n\nfunction e.cfgvalue()\n\treturn fs.readfile(i) or \"\"\nend\n\nfunction e.write(self, section, value)\n\tif value then\n\t\tvalue = value:gsub(\"\\r\\n\", \"\\n\")\n\telse\n\t\tvalue = \"\"\n\tend\n\tfs.writefile(\"/tmp/adbypass\", value)\n\tif (luci.sys.call(\"cmp -s /tmp/adbypass /etc/adblocklist/adbypass\") == 1) then\n\t\tfs.writefile(i, value)\n\tend\n\tfs.remove(\"/tmp/adbypass\")\nend\n\nreturn o\n"
  },
  {
    "path": "luci-app-ikoolproxy/luasrc/view/koolproxy/cadvalue.htm",
    "content": "<%+cbi/valueheader%>\n<span style=\"color: green\">\n<%\n\tlocal val = self:cfgvalue(section) or self.default or \"\"\n\twrite(pcdata(val))\n%>\n</span>\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-ikoolproxy/luasrc/view/koolproxy/caupload.htm",
    "content": "<%+cbi/valueheader%>\n    <label class=\"cbi-value\" style=\"display:inline-block; width: 400px\" for=\"ulfile\"></label><br />\n\t<input class=\"cbi-input-file\" style=\"width: 400px\" type=\"file\" id=\"ulfile\" name=\"ulfile\" />\n\t<input type=\"submit\" class=\"cbi-button cbi-input-apply\" name=\"upload\" value=\"<%:上传恢复证书%>\" />\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-ikoolproxy/luasrc/view/koolproxy/koolproxy_status.htm",
    "content": "<script type=\"text/javascript\">//<![CDATA[\nXHR.poll(3, '<%=url([[admin]], [[services]], [[koolproxy]], [[status]])%>', null,\n\tfunction(x, data) {\n\t\tvar tb = document.getElementById('koolproxy_status');\n\t\tif (data && tb) {\n\t\t\tif (data.running) {\n\t\t\t\ttb.innerHTML = '<em><b style=color:green><%:iKoolProxy 滤广告%>' + data.bin_version + '<%:运行中%></b></em>';\n\t\t\t} else {\n\t\t\t\ttb.innerHTML = '<em><b style=color:red><%:iKoolProxy 滤广告%>' + data.bin_version + '<%:未运行%></b></em>';\n\t\t\t}\n\t\t}\n\t}\n);\n//]]>\n</script>\n<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>\n<fieldset class=\"cbi-section\">\n\t<p id=\"koolproxy_status\">\n\t\t<em><%:收集数据...%></em>\n\t</p>\n</fieldset>\n"
  },
  {
    "path": "luci-app-ikoolproxy/luasrc/view/koolproxy/tips.htm",
    "content": "</style>\n            <div class=\"cbi-value\">\n\t\t\t<label class=\"cbi-value-title\">iKoolProxy的使用Tips：</label>\n\t\t<div class=\"cbi-value-field\">\n\t\t<br />\n\t\t1、 一般配置：过滤模式（全局模式）+ 默认访问控制（过滤http协议）达到一般的过滤效果。\n\t\t<br />\n\t\t2、 最佳配置：在1的基础上，再在 访问控制 + 增加需要过滤的客户端 + 过滤HTTP(S)协议 + 对应客服端安装证书。\n\t\t<br />\n\t\t3、 使用步骤：A、更新规则，B、恢复证书，C、设置要过滤的https客户端ip，D、清除浏览器或APP数据或断网重连。\n        \t<br />\n\t\t4、 Adblock Plus的Host列表 + KoolProxy黑名单模式运行更流畅上网体验。\n\t\t<br />\n\t\t5、 过滤HTTPS广告需要为相应客户端安装证书，在“访问控制”里添加客户端ip或者mac地址，并选择用<u><font color='#FF0000'>过滤HTTP(S)协议</font></u>！\n\t\t<br />                    \n\t\t6、 在路由器下的设备，在浏览器中输入<u><font color='#FF0000'>110.110.110.110</font></u>来下载证书，导入证书目录请选择“受信任的根证书颁发机构”。\n\t\t<br />\n        \t7、 安装完证书后，请在客户端机器上<u><font color='#FF0000'>清除浏览器的缓存、视频APP的全部数据、断开网络重新联网</font></u>。如果访问网页弹出不安全提示，请检查证书是否安装正确。\n        \t<br />\n\t\t8、 如果想在多台路由器上使用一个证书，请先备份证书，然后再在另一个路由器上恢复证书即可。\n        \t<br />\n\t\t</div>\n\t\n\t   <div class=\"cbi-value\">\n\t\t\t<label class=\"cbi-value-title\">Shaoxia的KoolProxyR详细使用说明</label>\n\t\t\t<div class=\"cbi-value-field\">\n\t\t\t\t<input type=\"button\" class=\"cbi-button cbi-input-reload\" value=\"点击前往\" onclick=\"javascript:window.open('https://shaoxia.xyz/post/koolproxyr%E6%8C%87%E5%8D%97/','target');\" />\n\t\t\t</div>\n\t\t</div>\t                        \t\n\t</fieldset>\n</fieldset>\n"
  },
  {
    "path": "luci-app-ikoolproxy/root/etc/adblocklist/adblock",
    "content": ""
  },
  {
    "path": "luci-app-ikoolproxy/root/etc/adblocklist/adblockip",
    "content": ""
  },
  {
    "path": "luci-app-ikoolproxy/root/etc/adblocklist/adbypass",
    "content": ""
  },
  {
    "path": "luci-app-ikoolproxy/root/etc/adblocklist/adbypassip",
    "content": ""
  },
  {
    "path": "luci-app-ikoolproxy/root/etc/config/koolproxy",
    "content": "config global\n\toption enabled '0'\n\toption koolproxy_port '0'\n\toption startup_delay '0'\n\toption koolproxy_acl_default '1'\n\toption koolproxy_mode '1'\n\toption koolproxy_host '1'\n\toption koolproxy_rules 'koolproxy.txt daily.txt kp.dat'\n\toption koolproxy_ipv6 '0'\n\toption time_update 'nil'\n\t\nconfig acl_rule\n\toption proxy_mode '2'\n\toption remarks '选要滤https的客户端'\n\toption ipaddr '192.168.8.168'\n\t\nconfig usetips\n\toption load '0'\n\toption name '1'\n\toption url '1'\n"
  },
  {
    "path": "luci-app-ikoolproxy/root/etc/init.d/koolproxy",
    "content": "#!/bin/sh /etc/rc.common\n#\n# Copyright (C) 2015 OpenWrt-dist\n# Copyright (C) 2016 fw867 <ffkykzs@gmail.com>\n#\n# This is free software, licensed under the GNU General Public License v3.\n# See /LICENSE for more information.\n#\n\nSTART=99\nSTOP=99\nUSE_PROCD=1\n\nCONFIG=koolproxy\nKP_DIR=/usr/share/koolproxy\nTMP_DIR=/tmp\n\nalias echo_date='echo $(date +%Y年%m月%d日\\ %X):'\n\nconfig_n_get() {\n\tlocal ret=$(uci get $CONFIG.$1.$2 2>/dev/null)\n\techo ${ret:=$3}\n}\n\nconfig_t_get() {\n\tlocal index=0\n\t[ -n \"$4\" ] && index=$4\n\tlocal ret=$(uci get $CONFIG.@$1[$index].$2 2>/dev/null)\n\techo ${ret:=$3}\n}\n\nadd_ipset_conf() {\n\tif [ -s /etc/adblocklist/adbypass ]; then\n\t\techo_date 添加白名单软连接...\n\t\tcat /etc/adblocklist/adbypass | sed \"s/,/\\n/g\" | sed \"s/^/ipset=&\\/./g\" | sed \"s/$/\\/white_kp_list/g\"  >> /tmp/adbypass.conf\n\t\trm -rf /tmp/dnsmasq.d/adbypass.conf\n\t\tln -sf /tmp/adbypass.conf /tmp/dnsmasq.d/adbypass.conf\n\n\t\tdnsmasq_restart=1\n\tfi\n\n\tif [ \"$koolproxy_mode\" == \"2\" ]; then\n\t\tif [ \"$koolproxy_host\" == \"1\" ];then\n\t\t\techo_date 添加Adblock Plus Host软连接...\n\t\t\tln -sf $KP_DIR/dnsmasq.adblock /tmp/dnsmasq.d/dnsmasq.adblock\n\t\tfi\n\n\t\techo_date 添加黑名单软连接...\n\t\trm -rf /tmp/dnsmasq.d/koolproxy_ipset.conf\n\t\tln -sf $KP_DIR/koolproxy_ipset.conf /tmp/dnsmasq.d/koolproxy_ipset.conf\n\n\t\techo_date 添加自定义黑名单软连接...\n\t\tif [ -s /etc/adblocklist/adblock ]; then\n\t\t\tcat /etc/adblocklist/adblock | sed \"s/,/\\n/g\" | sed \"s/^/ipset=&\\/./g\" | sed \"s/$/\\/black_koolproxy/g\"  >> /tmp/adblock.conf\n\t\t\trm -rf /tmp/dnsmasq.d/adblock.conf\n\t\t\tln -sf /tmp/adblock.conf /tmp/dnsmasq.d/adblock.conf\n\t\tfi\n\n\t\tdnsmasq_restart=1\n\tfi\n}\n\nremove_ipset_conf() {\n\tif [ -L \"/tmp/dnsmasq.d/adbypass.conf\" ]; then\n\t\techo_date 移除白名单软连接...\n\t\trm -rf /tmp/adbypass.conf\n\t\trm -rf /tmp/dnsmasq.d/adbypass.conf\n\t\tdnsmasq_restart=1\n\tfi\n\n\tif [ -L \"/tmp/dnsmasq.d/koolproxy_ipset.conf\" ]; then\n\t\techo_date 移除黑名单软连接...\n\t\trm -rf /tmp/dnsmasq.d/koolproxy_ipset.conf\n\t\tdnsmasq_restart=1\n\tfi\n\n\tif [ -L \"/tmp/dnsmasq.d/adblock.conf\" ]; then\n\t\techo_date 移除自定义黑名单软连接...\n\t\trm -rf /tmp/dnsmasq.d/adblock.conf\n\t\trm -rf /tmp/adblock.conf\n\t\tdnsmasq_restart=1\n\tfi\n\n\tif [ -L \"/tmp/dnsmasq.d/dnsmasq.adblock\" ]; then\n\t\techo_date 移除Adblock Plus Host软连接...\n\t\trm -rf /tmp/dnsmasq.d/dnsmasq.adblock\n\t\tdnsmasq_restart=1\n\tfi\n}\n\n\nrestart_dnsmasq() {\n\tif [ \"$dnsmasq_restart\" == \"1\" ]; then\n\t\techo_date 重启dnsmasq进程...\n\t\t/etc/init.d/dnsmasq restart > /dev/null 2>&1\n\tfi\n}\n\ncreat_ipset() {\n\techo_date 创建ipset名单\n\t# Load ipset netfilter kernel modules and kernel modules\n\tipset -! create white_kp_list nethash\n\tipset -! create black_koolproxy iphash\n\tcat $KP_DIR/data/rules/yhosts.txt $KP_DIR/data/rules/adg.txt $KP_DIR/data/rules/steven.txt $KP_DIR/data/rules/antiad.txt $KP_DIR/data/rules/koolproxy.txt $KP_DIR/data/rules/adgk.txt $KP_DIR/data/rules/daily.txt $KP_DIR/data/rules/user.txt | grep -Eo \"(.\\w+\\:[1-9][0-9]{1,4})/\" | grep -Eo \"([0-9]{1,5})\" | sort -un | sed -e '$a\\80' -e '$a\\443' | sed -e \"s/^/-A kp_full_port &/g\" -e \"1 i\\-N kp_full_port bitmap:port range 0-65535 \" | ipset -R -!\n}\n\nadd_white_black_ip() {\n\techo_date 添加ipset名单\n\tip_lan=\"0.0.0.0/8 10.0.0.0/8 100.64.0.0/10 127.0.0.0/8 169.254.0.0/16 172.16.0.0/12 192.0.0.0/24 192.0.2.0/24 192.31.196.0/24 192.52.193.0/24 192.88.99.0/24 192.168.0.0/16 192.175.48.0/24 198.18.0.0/15 198.51.100.0/24 203.0.113.0/24 224.0.0.0/4 240.0.0.0/4 255.255.255.255\"\n\tfor ip in $ip_lan\n\tdo\n\t\tipset -A white_kp_list $ip >/dev/null 2>&1\n\n\tdone\n\tsed -e \"s/^/add white_kp_list &/g\" /etc/adblocklist/adbypassip | awk '{print $0} END{print \"COMMIT\"}' | ipset -R 2>/dev/null\n\tipset -A black_koolproxy 110.110.110.110 >/dev/null 2>&1\n\tsed -e \"s/^/add black_koolproxy &/g\" /etc/adblocklist/adblockip | awk '{print $0} END{print \"COMMIT\"}' | ipset -R 2>/dev/null\n}\n\nload_config() {\n\tENABLED=$(config_t_get global enabled 0)\n\t[ $ENABLED -ne 1 ] && return 0\n\tkoolproxy_mode=$(config_t_get global koolproxy_mode 1)\n\tkoolproxy_host=$(config_t_get global koolproxy_host 0)\n\tkoolproxy_acl_default=$(config_t_get global koolproxy_acl_default 1)\n\tkoolproxy_port=$(config_t_get global koolproxy_port 0)\n\tkoolproxy_bp_port=$(config_t_get global koolproxy_bp_port)\n\tkoolproxy_ipv6=$(config_t_get global koolproxy_ipv6 0)\n\tconfig_load $CONFIG\n\treturn 1\n}\n\n__load_lan_acl() {\n\tlocal mac\n\tlocal ipaddr\n\tlocal proxy_mode\n\tconfig_get mac $1 mac\n\tconfig_get ipaddr $1 ipaddr\n\tconfig_get proxy_mode $1 proxy_mode\n\t[ -n \"$ipaddr\" ] && [ -z \"$mac\" ] && echo_date 加载ACL规则：【$ipaddr】模式为：$(get_mode_name $proxy_mode)\n\t[ -z \"$ipaddr\" ] && [ -n \"$mac\" ] && echo_date 加载ACL规则：【$mac】模式为：$(get_mode_name $proxy_mode)\n\t[ -n \"$ipaddr\" ] && [ -n \"$mac\" ] && echo_date 加载ACL规则：【$ipaddr】【$mac】模式为：$(get_mode_name $proxy_mode)\n\t#echo iptables -t nat -A KOOLPROXY $(factor $ipaddr \"-s\") $(factor $mac \"-m mac --mac-source\") -p tcp $(get_jump_mode $proxy_mode) $(get_action_chain $proxy_mode)\n\tiptables -t nat -A KOOLPROXY $(factor $ipaddr \"-s\") $(factor $mac \"-m mac --mac-source\") -p tcp $(get_jump_mode $proxy_mode) $(get_action_chain $proxy_mode)\n\n\tacl_nu=`expr $acl_nu + 1`\n}\n\nlan_acess_control() {\n\tacl_nu=0\n\t[ -z \"$koolproxy_acl_default\" ] && koolproxy_acl_default=1\n\tconfig_foreach __load_lan_acl acl_rule\n\tif [ $acl_nu -ne 0 ]; then\n\t\techo_date 加载ACL规则：其余主机模式为：$(get_mode_name $koolproxy_acl_default)\n\telse\n\t\techo_date 加载ACL规则：所有模式为：$(get_mode_name $koolproxy_acl_default)\n\tfi\n}\n\n__load_exrule() {\n\tlocal file\n\tlocal exrule\n\tlocal enable\n\tconfig_get file $1 file\n\tconfig_get exrule $1 url\n\tconfig_get enable $1 load\n\tif [ -n \"$exrule\" ]; then\n\t\tif [ $enable -ne 1 ]; then\n\t\t\t[ -n \"$file\" ] && [ -f $KP_DIR/data/rules/$file ] && rm -f $KP_DIR/data/rules/$file\n\t\t\tuci set koolproxy.$1.time=\"\"\n\t\t\tuci commit koolproxy\n\t\t\treturn\n\t\tfi\n\n\t\tif [ -z \"$file\" ]; then\n\t\t\tfile=$(echo $exrule |awk -F \"/\" '{print $NF}')\n\t\t\tuci set koolproxy.$1.file=\"$file\"\n\t\t\tuci commit koolproxy\n\t\tfi\n\n\t\tif [ ! -f $KP_DIR/data/rules/$file ]; then\n\t\t\twget $exrule -q -O $TMP_DIR/$file\n\t\t\tif [ \"$?\" == \"0\" ]; then\n\t\t\t\tuci set koolproxy.$1.time=\"`date +%Y-%m-%d\" \"%H:%M`\"\n\t\t\t\tuci commit koolproxy\n\t\t\t\tmv $TMP_DIR/$file $KP_DIR/data/rules/$file\n\t\t\telse\n\t\t\t\techo \"koolproxy download rule $file failed!\"\n\t\t\t\t[ -f $TMP_DIR/$file ] && rm -f $TMP_DIR/$file\n\t\t\tfi\n\t\tfi\n\t\tcat $KP_DIR/data/rules/$file >>$KP_DIR/data/rules/user.txt\n\tfi\n}\n\nload_user_rules() {\n\tcp $KP_DIR/data/user.txt $KP_DIR/data/rules/user.txt\n\tconfig_foreach __load_exrule rss_rule\n}\n\nload_rules() {\n\tsed -i '1,9s/1/0/g' $KP_DIR/data/source.list\n\tlocal rulelist=\"$(uci -q get koolproxy.@global[0].koolproxy_rules)\"\n\tfor rule in $rulelist\n\tdo\n\t\tcase \"$rule\" in\n\t\t\tkoolproxy.txt)\n\t\t\t\tsed -i '1s/0/1/g' $KP_DIR/data/source.list\n\t\t\t;;\n\t\t\tdaily.txt)\n\t\t\t\tsed -i '2s/0/1/g' $KP_DIR/data/source.list\n\t\t\t;;\n\t\t\tkp.dat)\n\t\t\t\tsed -i '3s/0/1/g' $KP_DIR/data/source.list\n\t\t\t;;\n\t\t\tuser.txt)\n\t\t\t\tsed -i '4s/0/1/g' $KP_DIR/data/source.list\n\t\t\t;;\n\t\tesac\n\tdone\n\n\tlocal rulelist=\"$(uci -q get koolproxy.@global[0].thirdparty_rules)\"\n\tfor rule in $rulelist\n\tdo\n\t\tcase \"$rule\" in\n                        yhosts.txt)\n\t\t\t\tsed -i '5s/0/1/g' $KP_DIR/data/source.list\n\t\t\t;;\n\t\t\tadg.txt)\n\t\t\t\tsed -i '6s/0/1/g' $KP_DIR/data/source.list\n\t\t\t;;\n\t\t\tsteven.txt)\n\t\t\t\tsed -i '7s/0/1/g' $KP_DIR/data/source.list\n\t\t\t;;\n\t\t\tantiad.txt)\n\t\t\t\tsed -i '8s/0/1/g' $KP_DIR/data/source.list\n\t\t\t;;\n\t\t        adgk.txt)\n\t\t\t\tsed -i '9s/0/1/g' $KP_DIR/data/source.list\n\t\t\t;;\n\t\tesac\n\tdone\n}\n\nget_mode_name() {\n\tcase \"$1\" in\n\t\t0)\n\t\t\techo \"不过滤\"\n\t\t;;\n\t\t1)\n\t\t\techo \"过滤HTTP协议\"\n\t\t;;\n\t\t2)\n\t\t\techo \"过滤HTTP(S)协议\"\n\t\t;;\n\t\t3)\n\t\t\techo \"过滤全端口\"\n\t\t;;\n\tesac\n}\n\nget_jump_mode() {\n\tcase \"$1\" in\n\t\t0)\n\t\t\techo \"-j\"\n\t\t;;\n\t\t*)\n\t\t\techo \"-g\"\n\t\t;;\n\tesac\n}\n\nget_action_chain() {\n\tcase \"$1\" in\n\t\t0)\n\t\t\techo \"RETURN\"\n\t\t;;\n\t\t1)\n\t\t\techo \"KP_HTTP\"\n\t\t;;\n\t\t2)\n\t\t\techo \"KP_HTTPS\"\n\t\t;;\n\t\t3)\n\t\t\techo \"KP_ALL_PORT\"\n\t\t;;\n\tesac\n}\n\nfactor() {\n\tif [ -z \"$1\" ] || [ -z \"$2\" ]; then\n\t\techo \"\"\n\telse\n\t\techo \"$2 $1\"\n\tfi\n}\n\nload_nat() {\n\techo_date 加载nat规则！\n\t#----------------------BASIC RULES---------------------\n\techo_date 写入iptables规则到nat表中...\n\t# 创建KOOLPROXY nat rule\n\tiptables -t nat -N KOOLPROXY\n\t# 局域网地址不走KP\n\tiptables -t nat -A KOOLPROXY -m set --match-set white_kp_list dst -j RETURN\n\t# 生成对应CHAIN\n\tiptables -t nat -N KP_HTTP\n\tiptables -t nat -A KP_HTTP -p tcp -m multiport --dport 80 -j REDIRECT --to-ports 3000\n\tiptables -t nat -N KP_HTTPS\n\tiptables -t nat -A KP_HTTPS -p tcp -m multiport --dport 80,443 -j REDIRECT --to-ports 3000\n\tiptables -t nat -N KP_ALL_PORT\n\t#iptables -t nat -A KP_ALL_PORT -p tcp -j REDIRECT --to-ports 3000\n\t# 端口控制\n\tif [ \"$koolproxy_port\" == \"1\" ]; then\n\t\techo_date 开启端口控制：【$koolproxy_bp_port】\n\t\tif [ -n \"$koolproxy_bp_port\" ]; then\n\t\t\tiptables -t nat -A KP_ALL_PORT -p tcp -m multiport ! --dport $koolproxy_bp_port -m set --match-set kp_full_port dst -j REDIRECT --to-ports 3000\n\t\telse\n\t\t\tiptables -t nat -A KP_ALL_PORT -p tcp -m set --match-set kp_full_port dst -j REDIRECT --to-ports 3000\n\t\tfi\n\telse\n\t\tiptables -t nat -A KP_ALL_PORT -p tcp -m set --match-set kp_full_port dst -j REDIRECT --to-ports 3000\n\tfi\n\t[ \"$koolproxy_ipv6\" == \"1\" ] && ip6tables -t nat -I PREROUTING -p tcp -j REDIRECT --to-ports 3000\n\t# 局域网控制\n\tlan_acess_control\n\t# 剩余流量转发到缺省规则定义的链中\n\tiptables -t nat -A KOOLPROXY -p tcp -j $(get_action_chain $koolproxy_acl_default)\n\t# 重定所有流量到 KOOLPROXY\n\t# 全局模式和视频模式\n\t[ \"$koolproxy_mode\" == \"1\" ] || [ \"$koolproxy_mode\" == \"3\" ] && iptables -t nat -I PREROUTING 1 -p tcp -j KOOLPROXY\n\t# ipset 黑名单模式\n\t[ \"$koolproxy_mode\" == \"2\" ] && iptables -t nat -I PREROUTING 1 -p tcp -m set --match-set black_koolproxy dst -j KOOLPROXY\n}\n\nadd_cru() {\n\ttime=$(config_t_get global time_update)\n\twirtecron=$(cat /etc/crontabs/root | grep \"00 $time * * *\" | grep kpupdate)\n\tif [ -z \"$wirtecron\" ];then\n\t\tsed -i '/kpupdate/d' /etc/crontabs/root >/dev/null 2>&1\n\t\techo \"0 $time * * * /usr/share/koolproxy/kpupdate\" >> /etc/crontabs/root \n\tfi\n}\n\ndel_cru() {\n\tsed -i '/kpupdate/d' /etc/crontabs/root >/dev/null 2>&1\n}\n\ndetect_cert(){\n\tif [ ! -f $KP_DIR/data/private/ca.key.pem -o ! -f $KP_DIR/data/cert/ca.crt ]; then\n\t\techo_date 开始生成koolproxy证书，用于https过滤！\n\t\tcd $KP_DIR/data && sh gen_ca.sh\n\tfi\n}\n\nflush_nat() {\n\techo_date 移除nat规则...\n\tcd $TMP_DIR\n\tiptables -t nat -S | grep -E \"KOOLPROXY|KP_HTTP|KP_HTTPS|KP_ALL_PORT\" | sed 's/-A/iptables -t nat -D/g'|sed 1,4d > clean.sh && chmod 777 clean.sh && ./clean.sh\n\t[ -f $TMP_DIR/clean.sh ] && rm -f $TMP_DIR/clean.sh\n\tiptables -t nat -X KOOLPROXY > /dev/null 2>&1\n\tiptables -t nat -X KP_HTTP > /dev/null 2>&1\n\tiptables -t nat -X KP_HTTPS > /dev/null 2>&1\n\tiptables -t nat -X KP_ALL_PORT > /dev/null 2>&1\n\tipset -F black_koolproxy > /dev/null 2>&1 && ipset -X black_koolproxy > /dev/null 2>&1\n\tipset -F white_kp_list > /dev/null 2>&1 && ipset -X white_kp_list > /dev/null 2>&1\n\tip6tables -t nat -D PREROUTING -p tcp -j REDIRECT --to-ports 3000 > /dev/null 2>&1\n}\n\nexport_ipt_rules() {\n\tFWI=$(uci get firewall.koolproxy.path 2>/dev/null)\n\t[ -n \"$FWI\" ] || return 0\n\tcat <<-CAT >>$FWI\n\tiptables-save -c | grep -v -E \"KOOLPROXY|KP\" | iptables-restore -c\n\tiptables-restore -n <<-EOF\n\t$(iptables-save | grep -E \"KOOLPROXY|KP|^\\*|^COMMIT\" |\\\n\t\tsed -e \"s/^-A \\(PREROUTING\\)/-I \\1 1/\")\n\tEOF\n\tCAT\n\treturn $?\n}\n\nflush_ipt_rules() {\n\tFWI=$(uci get firewall.koolproxy.path 2>/dev/null)\n\t[ -n \"$FWI\" ] && echo '# firewall include file' >$FWI\n\treturn 0\n}\n\npre_start() {\n\tload_config\n\t[ $? -ne 1 ] && return 0\n\tiptables -t nat -C PREROUTING -p tcp -j KOOLPROXY 2>/dev/null && [ $? -eq 0 ] && return 0;\n\tdetect_cert\n\tload_rules\n\tload_user_rules\n\tadd_ipset_conf && restart_dnsmasq\n\tcreat_ipset\n\tadd_white_black_ip\n\tload_nat\n\tflush_ipt_rules && export_ipt_rules\n\tadd_cru\n\t[ \"$koolproxy_mode\" == \"1\" ] && echo_date 选择【全局过滤模式】\n\t[ \"$koolproxy_mode\" == \"2\" ] && echo_date 选择【IPSET过滤模式】\n\tif [ \"$koolproxy_mode\" == \"3\" ]; then\n\t\techo_date 选择【视频过滤模式】\n\t\tsed -i '1s/1/0/g;2s/1/0/g' $KP_DIR/data/source.list\n\tfi\n\treturn 1\n}\n\npost_stop() {\n\tload_config\n\t[ $? -ne 1 ] && NO_RESTART_DNSMASQ=false\n\tif [ $NO_RESTART_DNSMASQ ]; then\n\t\tremove_ipset_conf\n\telse\n\t\tremove_ipset_conf && restart_dnsmasq\n\tfi\n\tflush_ipt_rules\n\tflush_nat\n\tdel_cru\n\treturn 0\n}\n\nstart_service() {\n\techo_date ================== koolproxy启用 ================\n\tpre_start\n\t[ $? -ne 1 ] && return 0\n\n\tprocd_open_instance\n\tprocd_set_param command /usr/share/koolproxy/koolproxy\n\tprocd_append_param command --mark\n\tprocd_append_param command --ttl 160\n\n\tprocd_set_param respawn\n\n\tprocd_set_param file /etc/adblocklist/adblock\n\tprocd_set_param file /etc/adblocklist/adblockip\n\tprocd_set_param file /usr/share/koolproxy/data/user.txt\n\tprocd_set_param stdout 1\n\tprocd_set_param stderr 1\n\tprocd_close_instance\n\n\tlogger \"koolproxy has started.\"\n\techo_date =================================================\n}\n\nstop_service() {\n\techo_date ====================== 关闭 =====================\n\tpost_stop\n\tlogger \"koolproxy has stopped.\"\n\techo_date =================================================\n}\n\nreload_service() {\n\tlogger \"koolproxy reload service.\"\n\tNO_RESTART_DNSMASQ=true\n\tstop\n\tstart\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"koolproxy\"\n}\n\nrestart() {\n\tlogger \"koolproxy restart service.\"\n\tNO_RESTART_DNSMASQ=true\n\tstop\n\tstart\n}\n\nboot() {\n\tlocal delay=$(config_t_get global startup_delay 0)\n\t(sleep $delay && start >/dev/null 2>&1) &\n\treturn 0\n}\n"
  },
  {
    "path": "luci-app-ikoolproxy/root/etc/uci-defaults/luci-koolproxy",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\t[ -e \"/etc/config/ucitrack\" ] && {\n\tdelete ucitrack.@koolproxy[-1]\n\tadd ucitrack koolproxy\n\tset ucitrack.@koolproxy[-1].init=koolproxy\n\tcommit ucitrack\n\t}\n\tdelete firewall.koolproxy\n\tset firewall.koolproxy=include\n\tset firewall.koolproxy.type=script\n\tset firewall.koolproxy.path=/var/etc/koolproxy.include\n\tset firewall.koolproxy.reload=1\n\tcommit firewall\nEOF\n\nrm -f /tmp/luci-indexcache\nexit 0\n"
  },
  {
    "path": "luci-app-ikoolproxy/root/lib/upgrade/keep.d/koolproxy",
    "content": "/usr/share/koolproxy/data/certs/ca.crt\n/usr/share/koolproxy/data/private/base.key.pem\n/usr/share/koolproxy/data/private/ca.key.pem\n"
  },
  {
    "path": "luci-app-ikoolproxy/root/usr/sbin/adblockplus",
    "content": "#!/bin/sh\necho \"$(date \"+%F %T\"): 正在下载adblockplus规则...\"\nwget-ssl --quiet --no-check-certificate https://easylist-downloads.adblockplus.org/easylistchina+easylist.txt -O /tmp/adlist.txt\nif [ \"$?\" == \"0\" ]; then\n\tgrep ^\\|\\|[^\\*]*\\^$ /tmp/adlist.txt | sed -e 's:||:address\\=\\/:' -e 's:\\^:/0\\.0\\.0\\.0:' > /tmp/dnsmasq.adblock\n\trm -f /tmp/adlist.txt\n\tdiff /tmp/dnsmasq.adblock /usr/share/koolproxy/dnsmasq.adblock >/dev/null\n\t[ $? = 0 ] && echo \"$(date \"+%F %T\"): adblockplus本地规则和服务器规则相同，无需更新!\" && rm -f /tmp/dnsmasq.adblock && return 1\n\techo \"$(date \"+%F %T\"): 检测到adblockplus规则有更新，开始转换规则！\"\n\tsed -i '/youku/d' /tmp/dnsmasq.adblock >/dev/null 2>&1\n\tsed -i '/[1-9]\\{1,3\\}\\.[1-9]\\{1,3\\}\\.[1-9]\\{1,3\\}\\.[1-9]\\{1,3\\}/d' /tmp/dnsmasq.adblock >/dev/null 2>&1\n\tmv /tmp/dnsmasq.adblock /usr/share/koolproxy/dnsmasq.adblock\n\techo \"$(date \"+%F %T\"): adblockplus规则转换完成，应用新规则。\"\n\techo \"\"\n\techo \"$(date \"+%F %T\"): 重启dnsmasq进程\"\n\t/etc/init.d/dnsmasq restart > /dev/null 2>&1\n\n\treturn 0\nelse\n\techo \"$(date \"+%F %T\"): 获取在线版本时出现错误! \"\n\t[ -f /tmp/adlist.txt ] && rm -f /tmp/adlist.txt\n\treturn 1\nfi\n"
  },
  {
    "path": "luci-app-ikoolproxy/root/usr/share/koolproxy/adblock.conf",
    "content": ""
  },
  {
    "path": "luci-app-ikoolproxy/root/usr/share/koolproxy/camanagement",
    "content": "#!/bin/sh\nkpfolder=\"/usr/share/koolproxy/data\"\nkplogfile=\"/var/log/koolproxy.log\"\nreadyfolder=\"/tmp/upload/koolproxy\"\n\nbackup() {\n\tif [ ! -f $kpfolder/private/ca.key.pem ]; then\n\t\techo \"未找到ca.key.pem，请先运行Koolproxy一次！\" > $kplogfile\n\t\texit 1\n\tfi\n\tif [ ! -f $kpfolder/private/base.key.pem ]; then\n\t\techo \"未找到base.key.pem，请先运行Koolproxy一次！\" > $kplogfile\n\t\texit 1\n\tfi\n\tif [ ! -f $kpfolder/certs/ca.crt ]; then\n\t\techo \"未找到ca.crt，请先运行Koolproxy一次！\" > $kplogfile\n\t\texit 1\n\tfi\n\n\tmkdir -p /tmp/upload\n\tcd $kpfolder\n\ttar czf /tmp/upload/koolproxyca.tar.gz private/ca.key.pem private/base.key.pem certs/ca.crt \n\t[ -f /tmp/upload/koolproxyca.tar.gz ] && echo \"证书备份已成功生成。\" > $kplogfile \n}\n\nrestore() {\n\tif [ ! -f /tmp/upload/koolproxyCA.tar.gz ]; then\n\t\techo \"未找到备份文件，文件名必须为koolproxyCA.tar.gz或已损坏，请检查备份文件！\" >> $kplogfile\n\telse\n\t\tmkdir -p $readyfolder\n\t\tcd $readyfolder\n\t\ttar xzf /tmp/upload/koolproxyCA.tar.gz\n\tfi\n\tif [ ! -f $readyfolder/private/ca.key.pem ]; then\n\t\techo \"未找到ca.key.pem,备份文件不正确或已损坏，请检查备份文件！\" > $kplogfile\n\t\texit 1\n\tfi\n\tif [ ! -f $readyfolder/private/base.key.pem ]; then\n\t\techo \"未找到base.key.pem，备份文件不正确或已损坏，请检查备份文件！\" > $kplogfile\n\t\texit 1\n\tfi\n\tif [ ! -f $readyfolder/certs/ca.crt ]; then\n\t\techo \"未找到ca.crt，备份文件不正确或已损坏，请检查备份文件！\" > $kplogfile\n\t\texit 1\n\tfi\n\n\tmv -f $readyfolder/private/ca.key.pem $kpfolder/private/ca.key.pem\n\tmv -f $readyfolder/private/base.key.pem $kpfolder/private/base.key.pem\n\tmv -f $readyfolder/certs/ca.crt $kpfolder/certs/ca.crt\n\trm -rf $readyfolder\n\trm -f /tmp/upload/koolproxyCA.tar.gz\n\techo \"证书成功还原，重启Koolproxy。\" > $kplogfile \n\t/etc/init.d/koolproxy restart\n}\n\ncase \"$*\" in\n\t\"backup\")\n\t\tbackup\n\t\t;;\n\t\"restore\")\n\t\trestore\n\t\t;;\n\t\"help\")\n\t\techo \"use backup or restore\"\n\t\t;;\nesac\n"
  },
  {
    "path": "luci-app-ikoolproxy/root/usr/share/koolproxy/data/gen_ca.sh",
    "content": "#!/bin/sh\nalias echo_date='echo $(date +%Y年%m月%d日\\ %X):'\n\nif [ ! -f openssl.cnf ]; then\n\techo_date \"Cannot found openssl.cnf\"\n\texit 1\nfi\nif [ -f /usr/share/koolproxy/data/private/ca.key.pem ]; then\n\techo_date \"已经有证书了！\"\nelse\n\techo_date \"生成证书中...\"\n\n\t#step 1, root ca\n\tmkdir -p certs private\n\trm -f serial private/ca.key.pem\n\tchmod 700 private\n\techo 1000 > serial\n\topenssl genrsa -traditional -aes256 -passout pass:koolshare -out private/ca.key.pem 2048\n\tchmod 400 private/ca.key.pem\n\topenssl req -config openssl.cnf -passin pass:koolshare \\\n\t\t-subj \"/C=CN/ST=Beijing/L=KP/O=KoolProxy inc/CN=koolproxy.com\" \\\n\t\t-key private/ca.key.pem \\\n\t\t-new -x509 -days 7300 -sha256 -extensions v3_ca \\\n\t\t-out certs/ca.crt\n\n\t#step 2, domain rsa key\n\topenssl genrsa -traditional -aes256 -passout pass:koolshare -out private/base.key.pem 2048\n\techo_date \"证书生成完毕...\"\nfi\n"
  },
  {
    "path": "luci-app-ikoolproxy/root/usr/share/koolproxy/data/openssl.cnf",
    "content": "# OpenSSL root CA configuration file.\n# Copy to `/root/ca/openssl.cnf`.\n\n[ ca ]\n# `man ca`\ndefault_ca = CA_default\n\n[ CA_default ]\n# Directory and file locations.\ndir               = ./ca\ncerts             = $dir/certs\ncrl_dir           = $dir/crl\nnew_certs_dir     = $dir/newcerts\ndatabase          = $dir/index.txt\nserial            = $dir/serial\nRANDFILE          = $dir/private/.rand\n\n# The root key and root certificate.\nprivate_key       = $dir/private/ca.key.pem\ncertificate       = $dir/certs/ca.cert.pem\n\n# For certificate revocation lists.\ncrlnumber         = $dir/crlnumber\ncrl               = $dir/crl/ca.crl.pem\ncrl_extensions    = crl_ext\ndefault_crl_days  = 30\n\n# SHA-1 is deprecated, so use SHA-2 instead.\ndefault_md        = sha256\n\nname_opt          = ca_default\ncert_opt          = ca_default\ndefault_days      = 375\npreserve          = no\npolicy            = policy_strict\n\n[ policy_strict ]\n# The root CA should only sign intermediate certificates that match.\n# See the POLICY FORMAT section of `man ca`.\ncountryName             = match\nstateOrProvinceName     = match\norganizationName        = match\norganizationalUnitName  = optional\ncommonName              = supplied\nemailAddress            = optional\n\n[ policy_loose ]\n# Allow the intermediate CA to sign a more diverse range of certificates.\n# See the POLICY FORMAT section of the `ca` man page.\ncountryName             = optional\nstateOrProvinceName     = optional\nlocalityName            = optional\norganizationName        = optional\norganizationalUnitName  = optional\ncommonName              = supplied\nemailAddress            = optional\n\n[ req ]\n# Options for the `req` tool (`man req`).\ndefault_bits        = 2048\ndistinguished_name  = req_distinguished_name\nstring_mask         = utf8only\n\n# SHA-1 is deprecated, so use SHA-2 instead.\ndefault_md          = sha256\n\n# Extension to add when the -x509 option is used.\nx509_extensions     = v3_ca\n\n[ req_distinguished_name ]\n# See <https://en.wikipedia.org/wiki/Certificate_signing_request>.\ncountryName                     = Country Name (2 letter code)\nstateOrProvinceName             = State or Province Name\nlocalityName                    = Locality Name\n0.organizationName              = Organization Name\norganizationalUnitName          = Organizational Unit Name\ncommonName                      = Common Name\nemailAddress                    = Email Address\n\n# Optionally, specify some defaults.\ncountryName_default             = GB\nstateOrProvinceName_default     = England\nlocalityName_default            =\n0.organizationName_default      = Alice Ltd\norganizationalUnitName_default  =\nemailAddress_default            =\n\n[ v3_ca ]\n# Extensions for a typical CA (`man x509v3_config`).\nsubjectKeyIdentifier = hash\nauthorityKeyIdentifier = keyid:always,issuer\nbasicConstraints = critical, CA:true\nkeyUsage = critical, digitalSignature, cRLSign, keyCertSign\n\n[ v3_intermediate_ca ]\n# Extensions for a typical intermediate CA (`man x509v3_config`).\nsubjectKeyIdentifier = hash\nauthorityKeyIdentifier = keyid:always,issuer\nbasicConstraints = critical, CA:true, pathlen:0\nkeyUsage = critical, digitalSignature, cRLSign, keyCertSign\n\n[ usr_cert ]\n# Extensions for client certificates (`man x509v3_config`).\nbasicConstraints = CA:FALSE\nnsCertType = client, email\nnsComment = \"OpenSSL Generated Client Certificate\"\nsubjectKeyIdentifier = hash\nauthorityKeyIdentifier = keyid,issuer\nkeyUsage = critical, nonRepudiation, digitalSignature, keyEncipherment\nextendedKeyUsage = clientAuth, emailProtection\n\n[ server_cert ]\n# Extensions for server certificates (`man x509v3_config`).\nbasicConstraints = CA:FALSE\nnsCertType = server\nnsComment = \"OpenSSL Generated Server Certificate\"\nsubjectKeyIdentifier = hash\nauthorityKeyIdentifier = keyid,issuer:always\nkeyUsage = critical, digitalSignature, keyEncipherment\nextendedKeyUsage = serverAuth\n\n[ crl_ext ]\n# Extension for CRLs (`man x509v3_config`).\nauthorityKeyIdentifier=keyid:always\n\n[ ocsp ]\n# Extension for OCSP signing certificates (`man ocsp`).\nbasicConstraints = CA:FALSE\nsubjectKeyIdentifier = hash\nauthorityKeyIdentifier = keyid,issuer\nkeyUsage = critical, digitalSignature\nextendedKeyUsage = critical, OCSPSigning\n"
  },
  {
    "path": "luci-app-ikoolproxy/root/usr/share/koolproxy/data/rules/user.txt",
    "content": "!  ******************************* KoolProxyR 自定义过滤语法简表 *******************************\n!  ------------------------ 规则基于adblock规则，并进行了语法部分的扩展 ------------------------\n!  ABP规则请参考https://adblockplus.org/zh_CN/filters，下面为大致摘要\n!  \"!\" 为行注释符，注释行以该符号起始作为一行注释语义，用于规则描述\n!  \"@@\" 为白名单符，白名单具有最高优先级，放行过滤的网站，例如:@@||taobao.com\n!  \"@@@@\" 超级白名单，比白名单符拥有更高的优先级，主要用于放行https网站，例如:@@@@||https://taobao.com\n!  ------------------------------------------------------------------------------------------\n!  \"*\" 为字符通配符，能够匹配0长度或任意长度的字符串，该通配符不能与正则语法混用。\n!  \"^\" 为分隔符，可以是除了字母、数字或者 _ - . % 之外的任何字符。\n!  \"~\" 为排除标识符，通配符能过滤大多数广告，但同时存在误杀, 可以通过排除标识符修正误杀链接。\n!  注：通配符仅在 url 规则中支持，html 规则中不支持\n!  ------------------------------------------------------------------------------------------\n!  \"|\" 为管线符号，来表示地址的最前端或最末端\n!  \"||\" 为子域通配符，方便匹配主域名下的所有子域\n!  用法及例子如下：(以下等号表示等价于)\n!  ||xx.com/ad          =  http://xx.com/ad* || http://*.xx.com/ad*\n!  ||http://xx.com/ad   =  http://xx.com/ad* || http://*.xx.com/ad*\n!  ||https://xx.com/ad  =  https://xx.com/ad* || https://*.xx.com/ad*\n!  |xx.com/ad           =  http://xx.com/ad*\n!  |http://xx.com/ad    =  http://xx.com/ad*\n!  |https://xx.com/ad   =  https://xx.com/ad*\n!  ad                   =  http://*ad*\n!  http://ad            =  http://*ad*\n!  https://ad           =  不支持，需要指定域名，如下例\n!  https://xx.com/ad    =  |https://xx.com/ad  =  https://xx.com/ad*\n!  [同时可以表示两个以及两个以上的域名]如下例子\n!  https://xx.ad.com 和 https://xxx.xx.ad.com  =  ||https://ad.com (注意! 由于https的原因使用要非常谨慎,不可以大范围使用)\n!  ------------------------------------------------------------------------------------------\n!  兼容adblock规则的html规则语法，例如：\n!  fulldls.com,torrentzap.com##.tp_reccomend_banner\n!  但是推荐写成以下标准写法：\n!  ||fulldls.com##.tp_reccomend_banner\n!  ||torrentzap.com##.tp_reccomend_banner\n!  如果一个网站html规则有多条，可以合并为这样：\n!  ||torrentzap.com##.tp_reccomend_banner,.ad_top,[class=\"ad_right\"]......\n!  ------------------------------------------------------------------------------------------\n!  文本替换语法：$s@匹配内容@替换内容@\n!  非标准端口过滤语法：||abc.com:8081/ad.html或者|http://adb.com:8081/\n!  文本替换例子：|http://cdn.pcbeta.js.inimc.com/data/cache/common.js?$s@old@new@\n!  重定向语法：$r@匹配内容@替换内容@\n!  重定向例子：|http://koolshare.cn$r@http://koolshare.cn/*@http://www.qq.com@\n!  注：文本替换语法及重定向语法中的匹配内容不仅支持通配符功能，而且额外支持以下功能\n!  支持通配符 * 和 ? 表示单个字符\n!  支持全正则匹配，/正则内容/ 表示应用正则匹配\n!  正则替换：替换内容支持 $1 $2 这样的符号\n!  普通替换：替换内容支持 * 这样的符号，表示把命中的内容复制到替换的内容。（类似 $1 $2，但是 * 号会自动计算数字）\n!  ------------------------------------------------------------------------------------------\n!  未来将逐步添加相关语法，兼容adblock puls的更多语法，敬请期待。\n!  ******************************************************************************************\n"
  },
  {
    "path": "luci-app-ikoolproxy/root/usr/share/koolproxy/data/source.list",
    "content": "1|koolproxy.txt||静态规则\n1|daily.txt||每日规则\n1|kp.dat||视频规则\n1|user.txt||自定义规则\n1|yhosts.txt||Yhosts规则\n1|adg.txt||AdGuard规则\n1|steven.txt||Steven规则\n1|antiad.txt||AntiAD规则\n1|adgk.txt||坂本规则\n"
  },
  {
    "path": "luci-app-ikoolproxy/root/usr/share/koolproxy/data/user.txt",
    "content": "!  ******************************* KoolProxy 自定义过滤语法简表 *******************************\n!  ------------------------ 规则基于adblock规则，并进行了语法部分的扩展 ------------------------\n!  ABP规则请参考https://adblockplus.org/zh_CN/filters，下面为大致摘要\n!  \"!\" 为行注释符，注释行以该符号起始作为一行注释语义，用于规则描述\n!  \"@@\" 为白名单符，白名单具有最高优先级，放行过滤的网站，例如:@@||taobao.com\n!  \"@@@@\" 超级白名单，比白名单符拥有更高的优先级，主要用于放行https网站，例如:@@@@||https://taobao.com\n!  ------------------------------------------------------------------------------------------\n!  \"*\" 为字符通配符，能够匹配0长度或任意长度的字符串，该通配符不能与正则语法混用。\n!  \"^\" 为分隔符，可以是除了字母、数字或者 _ - . % 之外的任何字符。\n!  \"~\" 为排除标识符，通配符能过滤大多数广告，但同时存在误杀, 可以通过排除标识符修正误杀链接。\n!  注：通配符仅在 url 规则中支持，html 规则中不支持\n!  ------------------------------------------------------------------------------------------\n!  \"|\" 为管线符号，来表示地址的最前端或最末端\n!  \"||\" 为子域通配符，方便匹配主域名下的所有子域\n!  用法及例子如下：(以下等号表示等价于)\n!  ||xx.com/ad          =  http://xx.com/ad* || http://*.xx.com/ad*\n!  ||http://xx.com/ad   =  http://xx.com/ad* || http://*.xx.com/ad*\n!  ||https://xx.com/ad  =  https://xx.com/ad* || https://*.xx.com/ad*\n!  |xx.com/ad           =  http://xx.com/ad*\n!  |http://xx.com/ad    =  http://xx.com/ad*\n!  |https://xx.com/ad   =  https://xx.com/ad*\n!  ad                   =  http://*ad*\n!  http://ad            =  http://*ad*\n!  https://ad           =  不支持，需要指定域名，如下例\n!  https://xx.com/ad    =  |https://xx.com/ad  =  https://xx.com/ad*\n!  [同时可以表示两个以及两个以上的域名]如下例子\n!  https://xx.ad.com 和 https://xxx.xx.ad.com  =  ||https://ad.com (注意! 由于https的原因使用要非常谨慎,不可以大范围使用)\n!  ------------------------------------------------------------------------------------------\n!  兼容adblock规则的html规则语法，例如：\n!  fulldls.com,torrentzap.com##.tp_reccomend_banner\n!  但是推荐写成以下标准写法：\n!  ||fulldls.com##.tp_reccomend_banner\n!  ||torrentzap.com##.tp_reccomend_banner\n!  如果一个网站html规则有多条，可以合并为这样：\n!  ||torrentzap.com##.tp_reccomend_banner,.ad_top,[class=\"ad_right\"]......\n!  ------------------------------------------------------------------------------------------\n!  文本替换语法：$s@匹配内容@替换内容@\n!  非标准端口过滤语法：||abc.com:8081/ad.html或者|http://adb.com:8081/\n!  文本替换例子：|http://cdn.pcbeta.js.inimc.com/data/cache/common.js?$s@old@new@\n!  重定向语法：$r@匹配内容@替换内容@\n!  重定向例子：|http://koolshare.cn$r@http://koolshare.cn/*@http://www.qq.com@\n!  注：文本替换语法及重定向语法中的匹配内容不仅支持通配符功能，而且额外支持以下功能\n!  支持通配符 * 和 ? 表示单个字符\n!  支持全正则匹配，/正则内容/ 表示应用正则匹配\n!  正则替换：替换内容支持 $1 $2 这样的符号\n!  普通替换：替换内容支持 * 这样的符号，表示把命中的内容复制到替换的内容。（类似 $1 $2，但是 * 号会自动计算数字）\n!  ------------------------------------------------------------------------------------------\n!  未来将逐步添加相关语法，兼容adblock puls的更多语法，敬请期待。\n!  ******************************************************************************************\n"
  },
  {
    "path": "luci-app-ikoolproxy/root/usr/share/koolproxy/dnsmasq.adblock",
    "content": ""
  },
  {
    "path": "luci-app-ikoolproxy/root/usr/share/koolproxy/koolproxy_ipset.conf",
    "content": ""
  },
  {
    "path": "luci-app-ikoolproxy/root/usr/share/koolproxy/kpupdate",
    "content": "#!/bin/sh\n# set -x\n\n. /lib/functions.sh\n\nCONFIG=koolproxy\nKP_DIR=/usr/share/koolproxy\nTMP_DIR=/tmp/koolproxy\nLOGFILE=\"/var/log/koolproxy.log\"\n\nconfig_t_get() {\n\tlocal index=0\n\t[ -n \"$4\" ] && index=$4\n\tlocal ret=$(uci get $CONFIG.@$1[$index].$2 2>/dev/null)\n\techo ${ret:=$3}\n}\n\nlimit_log() {\n\tlocal log=$1\n\t[ ! -f \"$log\" ] && return\n\tlocal sc=100\n\t[ -n \"$2\" ] && sc=$2\n\tlocal count=$(grep -c \"\" $log)\n\tif [ $count -gt $sc ];then\n\t\tlet count=count-$sc\n\t\tsed -i \"1,$count d\" $log\n\tfi\n}\n\ninit_env() {\n\trm -rf \"$TMP_DIR\"\n\tmkdir -p \"$TMP_DIR\"\n}\n\nrestart_koolproxy() {\n\t/etc/init.d/koolproxy restart\n}\n\n__compare_file() {\n\tlocal descript=$1\n\tlocal localPath=$2\n\tlocal remoteUrl=$3\n\n\techo $(date \"+%F %T\"): ------------------- $descript更新 ------------------- >>$LOGFILE\n\tlocal filename=`basename $localPath`\n\tlocal remotePath=\"$TMP_DIR/$filename\"\n\twget \"$remoteUrl\" -q -O \"$remotePath\"\n\tif [ \"$?\" == \"0\" ]; then\n\t\tif [ -f \"$localPath\" ]; then\n\t\t\tlocalMD5=`md5sum \"$localPath\" | awk '{print $1}'`\n\t\t\tlocalNum=`cat \"$localPath\" | grep -v '^!' | wc -l`\n\t\telse\n\t\t\tlocalMD5=\"文件不存在\"\n\t\t\tlocalNum=\"0\"\n\t\tfi\n\t\tremoteMD5=`md5sum \"$remotePath\" | awk '{print $1}'`\n\t\tremoteNum=`cat \"$remotePath\" | grep -v '^!' | wc -l`\n\n\t\techo $(date \"+%F %T\"): 本地版本MD5：$localMD5 >>$LOGFILE\n\t\techo $(date \"+%F %T\"): 本地版本条数：$localNum >>$LOGFILE\n\t\techo >>$LOGFILE\n\t\techo $(date \"+%F %T\"): 在线版本MD5：$remoteMD5 >>$LOGFILE\n\t\techo $(date \"+%F %T\"): 在线版本条数：$remoteNum >>$LOGFILE\n\t\techo >>$LOGFILE\n\n\t\tif [ \"$localMD5\" != \"$remoteMD5\" ];then\n\t\t\techo $(date \"+%F %T\"): 检测到更新，开始更新规则！ >>$LOGFILE\n\t\t\tmv -f \"$remotePath\" \"$localPath\"\n\t\t\techo $(date \"+%F %T\"): 更新成功！ >>$LOGFILE\n\t\t\techo >>$LOGFILE\n\t\t\treturn 0\n\t\tfi\n\telse\n\t\techo \"$(date \"+%F %T\"): 获取在线版本时出现错误! \" >>$LOGFILE\n\t\techo >>$LOGFILE\n\tfi\n\treturn 1\n}\n\n__update_rule() {\n\tlocal name\n\tlocal file\n\tlocal exrule\n\tlocal enable\n\tconfig_get name $1 name\n\tconfig_get file $1 file\n\tconfig_get exrule $1 url\n\tconfig_get enable $1 load\n\tif [ -n \"$file\" ] && [ -n \"$exrule\" ]; then\n\t\tif [ $enable -ne 1 ]; then\n\t\t\treturn\n\t\tfi\n\t\t__compare_file \"$name\" \"$KP_DIR/data/rules/$file\" \"$exrule\"\n\t\tif [ \"$?\" == \"0\" ]; then\n\t\t\tuci set koolproxy.$1.time=\"`date +%Y-%m-%d\" \"%H:%M`\"\n\t\t\tuci commit koolproxy\n\t\t\tRESTART_KOOLPROXY=true\n\t\tfi\n\t\tcat $KP_DIR/data/rules/$file >>$KP_DIR/data/rules/user.txt\n\t\techo >>$LOGFILE\n\tfi\n}\n\nupdate_rss_rules() {\n\tcp $KP_DIR/data/user.txt $KP_DIR/data/rules/user.txt\n\tconfig_load $CONFIG\n\tconfig_foreach __update_rule rss_rule\n}\n\n\n\t\nupdate_rules() {\n\techo $(date \"+%F %T\"): ------------------- 内置规则更新 ------------------- >>$LOGFILE\n\twget 'https://cdn.jsdelivr.net/gh/ilxp/koolproxy@main/rules/kp.dat' -q -O $KP_DIR/data/rules/kp.dat\n\twget 'https://cdn.jsdelivr.net/gh/ilxp/koolproxy@main/rules/daily.txt' -q -O $KP_DIR/data/rules/daily.txt\n\twget 'https://cdn.jsdelivr.net/gh/ilxp/koolproxy@main/rules/koolproxy.txt' -q -O $KP_DIR/data/rules/koolproxy.txt\n\twget 'https://cdn.jsdelivr.net/gh/ilxp/koolproxy@main/rules/yhosts.txt' -q -O $KP_DIR/data/rules/yhosts.txt\n\twget 'https://cdn.jsdelivr.net/gh/ilxp/koolproxy@main/rules/steven.txt' -q -O $KP_DIR/data/rules/steven.txt\n\twget 'https://cdn.jsdelivr.net/gh/ilxp/koolproxy@main/rules/adg.txt' -q -O $KP_DIR/data/rules/adg.txt\n\twget 'https://cdn.jsdelivr.net/gh/ilxp/koolproxy@main/rules/antiad.txt' -q -O $KP_DIR/data/rules/antiad.txt\n\twget 'https://cdn.jsdelivr.net/gh/ilxp/koolproxy@main/rules/adgk.txt' -q -O $KP_DIR/data/rules/adgk.txt\n\twget 'https://cdn.jsdelivr.net/gh/ilxp/koolproxy@main/rules/koolproxy_ipset.conf' -q -O $KP_DIR/koolproxy_ipset.conf\n\twget 'https://cdn.jsdelivr.net/gh/ilxp/koolproxy@main/rules/dnsmasq.adblock' -q -O $KP_DIR/dnsmasq.adblock\n\tadg_rules_local=`cat /usr/share/koolproxy/data/rules/adg.txt  | sed -n '4p'|awk '{print $4}'`\n\tsteven_rules_local=`cat /usr/share/koolproxy/data/rules/steven.txt  | sed -n '2p'|awk '{print $3,$4,$5,$6}'`\n\tyhosts_rules_local=`cat /usr/share/koolproxy/data/rules/yhosts.txt  | sed -n '1p' | cut -d \":\" -f2`\n\tantiad_rules_local=`cat /usr/share/koolproxy/data/rules/antiad.txt  | sed -n '2p' | cut -d \"=\" -f2`\n\tkoolproxy_rules_local=`cat /usr/share/koolproxy/data/rules/koolproxy.txt  | sed -n '3p'|awk '{print $3,$4}'`\n\tadgk_rules_local=`cat /usr/share/koolproxy/data/rules/adgk.txt  | sed -n '2p'|awk '{print $3}'`\n\techo $(date \"+%F %T\"): -------------------AdGuard规则 Version $adg_rules_local >>$LOGFILE\n\techo $(date \"+%F %T\"): -------------------Steven规则 Version $steven_rules_local >>$LOGFILE\n\techo $(date \"+%F %T\"): -------------------Yhosts规则 Version $yhosts_rules_local >>$LOGFILE\n\techo $(date \"+%F %T\"): -------------------AntiAD规则 Version $antiad_rules_local >>$LOGFILE\n\techo $(date \"+%F %T\"): -------------------坂本规则   Version $adgk_rules_local >>$LOGFILE\n\techo $(date \"+%F %T\"): -------------------静态规则   Version $koolproxy_rules_local >>$LOGFILE\n\techo $(date \"+%F %T\"): ------------------- 内置规则更新成功！ ------------------- >>$LOGFILE\n\tRESTART_KOOLPROXY=true\n\n}\n\nupdate_adb_host() {\n\t/usr/sbin/adblockplus >>$LOGFILE 2>&1 &\n\tif [ \"$?\" == \"0\" ]; then\n\t\tRESTART_DNSMASQ=true\n\tfi\n}\n\n# main process\ninit_env\nlimit_log $LOGFILE\n\n# update rules\nupdate_rules\n\n# update user rules\nupdate_rss_rules\n\nkoolproxy_mode=$(config_t_get global koolproxy_mode 1)\nkoolproxy_host=$(config_t_get global koolproxy_host 0)\n\n# update ADB Plus Host\nif [ \"$koolproxy_mode\" == \"2\" ] && [ \"$koolproxy_host\" == \"1\" ];then\n\tupdate_adb_host\nfi\n\nif [ $RESTART_KOOLPROXY ]; then\n\trestart_koolproxy\n\techo $(date \"+%F %T\"): 重启koolproxy进程 >>$LOGFILE\nfi\n\ninit_env\n"
  },
  {
    "path": "luci-app-ikoolproxy/root/usr/share/rpcd/acl.d/luci-app-ikoolproxy.json",
    "content": "{\n\t\"luci-app-ikoolproxy\": {\n\t\t\"description\": \"Grant UCI access for luci-app-ikoolproxy\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"koolproxy\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"koolproxy\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-ikoolproxy/root/usr/share/ucitrack/luci-app-ikoolproxy.json",
    "content": "{\n\t\"config\": \"koolproxy\",\n\t\"init\": \"koolproxy\"\n}\n"
  },
  {
    "path": "luci-app-iperf3-server/Makefile",
    "content": "# Copyright (C) 2020-2026 Hyy2001X <https://github.com/Hyy2001X>\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-iperf3-server\nPKG_VERSION:=3.0.0\nPKG_RELEASE:=3\n\nPKG_LICENSE:=GPL-3.0-or-later\n\nLUCI_TITLE:=LuCI support for iPerf3 Server\nLUCI_DESCRIPTION:=Configure and manage multiple iperf3 server instances with LuCI status/actions.\nLUCI_DEPENDS:=+iperf3\n\nLUCI_PKGARCH:=all\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-iperf3-server/luasrc/controller/iperf3-server.lua",
    "content": "module(\"luci.controller.iperf3-server\", package.seeall)\n\nfunction index()\n\tlocal fs = require \"nixio.fs\"\n\n\tif not fs.access(\"/etc/config/iperf3-server\") then\n\t\treturn\n\tend\n\n\tlocal page\n\n\tpage = entry({\"admin\", \"services\", \"iperf3-server\"}, cbi(\"iperf3-server\"), _(\"iPerf3 Server\"), 99)\n\tpage.acl_depends = { \"luci-app-iperf3-server\" }\n\n\tpage = entry({\"admin\", \"services\", \"iperf3-server\", \"status\"},  call(\"act_status\"))\n\tpage.leaf = true\n\tpage.acl_depends = { \"luci-app-iperf3-server\" }\n\n\tpage = entry({\"admin\", \"services\", \"iperf3-server\", \"start\"},   call(\"act_start\"))\n\tpage.leaf = true\n\tpage.acl_depends = { \"luci-app-iperf3-server\" }\n\n\tpage = entry({\"admin\", \"services\", \"iperf3-server\", \"stop\"},    call(\"act_stop\"))\n\tpage.leaf = true\n\tpage.acl_depends = { \"luci-app-iperf3-server\" }\n\n\tpage = entry({\"admin\", \"services\", \"iperf3-server\", \"restart\"}, call(\"act_restart\"))\n\tpage.leaf = true\n\tpage.acl_depends = { \"luci-app-iperf3-server\" }\nend\n\n\nlocal function json_ok(extra)\n\tlocal e = extra or {}\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n\nfunction act_status()\n\tlocal uci = require(\"luci.model.uci\").cursor()\n\tlocal sys = require(\"luci.sys\")\n\n\tlocal result = {\n\t\trunning = false,     -- 是否任意一个 server 正常运行\n\t\tservers = {}         -- 每个端口的详细状态\n\t}\n\n\t-- 解析 /proc/net/tcp & /proc/net/tcp6，判断端口是否 LISTEN\n\tlocal function is_listening_in_proc(path, port)\n\t\tlocal f = io.open(path, \"r\")\n\t\tif not f then return false end\n\n\t\tlocal hex = string.format(\"%04X\", port) -- 端口 16 进制，大写，固定 4 位\n\t\t-- /proc/net/tcp 列格式: sl local_address rem_address st ...\n\t\t-- local_address: AAAAAAAA:PPPP\n\t\t-- st = 0A 表示 LISTEN\n\t\tfor line in f:lines() do\n\t\t\t-- 跳过表头\n\t\t\tif not line:match(\"^%s*sl%s+\") then\n\t\t\t\tlocal st = line:match(\"^%s*%d+:%s+%x+:\" .. hex .. \"%s+%x+:%x+%s+(%x+)\")\n\t\t\t\tif st == \"0A\" then\n\t\t\t\t\tf:close()\n\t\t\t\t\treturn true\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tf:close()\n\t\treturn false\n\tend\n\n\tlocal function is_listening(port)\n\t\t-- IPv4 LISTEN\n\t\tif is_listening_in_proc(\"/proc/net/tcp\", port) then\n\t\t\treturn true\n\t\tend\n\t\t-- IPv6 LISTEN（有的系统会只在 tcp6 里出现）\n\t\tif is_listening_in_proc(\"/proc/net/tcp6\", port) then\n\t\t\treturn true\n\t\tend\n\t\treturn false\n\tend\n\n\t-- 用 ps 判断：是否存在 iperf3 server / delay 阶段 sleep+iperf3\n\tlocal ps = sys.exec(\"ps w 2>/dev/null\") or \"\"\n\n\tlocal function has_iperf3_server_proc(port)\n\t\tlocal p = tostring(port)\n\n\t\tfor line in ps:gmatch(\"[^\\r\\n]+\") do\n\t\t\t-- 只要这行同时包含：\n\t\t\t-- 1) iperf3\n\t\t\t-- 2) -s（server）\n\t\t\t-- 3) -p 端口（支持 \"-p 5201\" 或 \"-p5201\"）\n\t\t\tif line:find(\"iperf3\", 1, true) then\n\t\t\t\tlocal hasS = line:match(\"%-s\") ~= nil\n\t\t\t\tlocal hasP = (line:match(\"%-p%s*\" .. p .. \"%f[^%d]\") ~= nil) or (line:match(\"%-p\" .. p .. \"%f[^%d]\") ~= nil)\n\t\t\t\tif hasS and hasP then\n\t\t\t\t\treturn true\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\treturn false\n\tend\n\n\n\tlocal function has_delay_pending_proc(port)\n\t\tlocal p = tostring(port)\n\t\tfor line in ps:gmatch(\"[^\\r\\n]+\") do\n\t\t\t-- 匹配 sh -c \"sleep N; exec iperf3 -s -p <port> ...\"\n\t\t\tif (line:find(\"/bin/sh\", 1, true) or line:find(\"sh -c\", 1, true))\n\t\t\t\tand line:find(\"sleep\", 1, true)\n\t\t\t\tand line:find(\"iperf3\", 1, true)\n\t\t\t\tand (line:match(\"%-p%s*\" .. p .. \"%f[^%d]\") or line:match(\"%-p\" .. p .. \"%f[^%d]\"))\n\t\t\tthen\n\t\t\t\treturn true\n\t\t\tend\n\t\tend\n\t\treturn false\n\tend\n\n\n\tuci:foreach(\"iperf3-server\", \"servers\", function(s)\n\t\tlocal port = tonumber(s.port)\n\t\tlocal enabled = (s.enable_server == \"1\")\n\n\t\tif not port then\n\t\t\treturn\n\t\tend\n\n\t\tlocal listen = is_listening(port)\n\t\tlocal iperf3_proc = has_iperf3_server_proc(port)\n\t\tlocal delay_pending = has_delay_pending_proc(port)\n\n\t\tlocal state, detail\n\t\tif not enabled then\n\t\t\tstate = \"disabled\"\n\t\t\tdetail = \"detail_disabled\"\n\t\telse\n\t\t\tif delay_pending and not listen then\n\t\t\t\tstate = \"delay\"\n\t\t\t\tdetail = \"detail_delay\"\n\t\t\telseif listen and iperf3_proc then\n\t\t\t\tstate = \"running\"\n\t\t\t\tdetail = \"detail_running\"\n\t\t\t\tresult.running = true\n\t\t\telseif listen and not iperf3_proc then\n\t\t\t\tstate = \"conflict\"\n\t\t\t\tdetail = \"detail_conflict\"\n\t\t\telse\n\t\t\t\tstate = \"stopped\"\n\t\t\t\tdetail = \"detail_stopped\"\n\t\t\tend\n\t\tend\n\n\t\tresult.servers[#result.servers + 1] = {\n\t\t\tport = port,\n\t\t\tenable = enabled,\n\t\t\tlisten = listen,\n\t\t\tstate = state,\n\t\t\tdetail = detail\n\t\t}\n\tend)\n\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(result)\nend\n\n\n\nfunction act_start()\n\tlocal rc = luci.sys.call(\"/etc/init.d/iperf3-server start >/dev/null 2>&1\")\n\tjson_ok({ ok = (rc == 0) })\nend\n\nfunction act_stop()\n\tlocal rc = luci.sys.call(\"/etc/init.d/iperf3-server stop >/dev/null 2>&1\")\n\tjson_ok({ ok = (rc == 0) })\nend\n\nfunction act_restart()\n\tlocal rc = luci.sys.call(\"/etc/init.d/iperf3-server restart >/dev/null 2>&1\")\n\tjson_ok({ ok = (rc == 0) })\nend\n"
  },
  {
    "path": "luci-app-iperf3-server/luasrc/model/cbi/iperf3-server.lua",
    "content": "m = Map(\"iperf3-server\",\n\ttranslate(\"iPerf3 Server\"),\n\ttranslate(\"iPerf3 - The ultimate speed test tool for TCP, UDP and SCTP\")\n)\n\nm:section(SimpleSection).template = \"iperf3-server/iperf3-server_status\"\n\n-- 主配置段\nlocal g = m:section(TypedSection, \"iperf3-server\", \"\")\ng.addremove = false\ng.anonymous  = true\n\nlocal main_enable = g:option(Flag, \"main_enable\",\n\ttranslate(\"Enable\"),\n\ttranslate(\"Enable iPerf3 Servers\")\n)\nmain_enable.default = \"0\"\nmain_enable.rmempty = false\n\n-- servers 表格\nlocal s = m:section(TypedSection, \"servers\",\n\ttranslate(\"Server Settings\"),\n\ttranslate(\"Set up Multi-iPerf3 Servers\")\n)\ns.anonymous = true\ns.addremove = true\ns.template  = \"cbi/tblsection\"\n\nlocal enable_server = s:option(Flag, \"enable_server\", translate(\"Enable\"))\nenable_server.default = \"1\"\nenable_server.rmempty = false\n\nlocal port = s:option(Value, \"port\", translate(\"Port\"))\nport.datatype = \"port\"\nport.default  = \"5201\"\nport.rmempty  = true   -- 关键：允许新增行先空着，避免“点添加无反应”\n\nfunction port.validate(self, value, section)\n\t-- 新增行刚创建时可能是空值：先放行，让它能显示出来\n\tif value == nil or value == \"\" then\n\t\treturn value\n\tend\n\n\tlocal v = tonumber(value)\n\tif not v or v < 1 or v > 65535 then\n\t\treturn nil, translate(\"Invalid port.\")\n\tend\n\n\t-- 端口去重：仅在有值时检查\n\tlocal dup = false\n\tm.uci:foreach(\"iperf3-server\", \"servers\", function(s2)\n\t\tif s2[\".name\"] ~= section and s2.port and tonumber(s2.port) == v then\n\t\t\tdup = true\n\t\tend\n\tend)\n\n\tif dup then\n\t\treturn nil, translate(\"Port must be unique.\")\n\tend\n\n\treturn tostring(v)\nend\n\nlocal delay = s:option(Value, \"delay\", translate(\"Start delay (Seconds)\"))\ndelay.default  = \"0\"\ndelay.datatype = \"uinteger\"\ndelay.rmempty  = true  -- 同理：新增行先允许空\n\nfunction delay.validate(self, value, section)\n\tif value == nil or value == \"\" then\n\t\treturn value\n\tend\n\tlocal v = tonumber(value)\n\tif v == nil or v < 0 or v > 3600 then\n\t\treturn nil, translate(\"Delay must be between 0 and 3600 seconds.\")\n\tend\n\treturn tostring(v)\nend\n\nlocal extra_options = s:option(Value, \"extra_options\", translate(\"Extra Options\"))\nextra_options.rmempty  = true\nextra_options.password = false\n\nfunction extra_options.validate(self, value, section)\n\tif not value or value == \"\" then\n\t\treturn value\n\tend\n\t-- 简单拦截 shell 元字符（安全兜底）\n\tif value:match(\"[;&|`$()<>\\\"']\") then\n\t\treturn nil, translate(\"Invalid characters in Extra Options.\")\n\tend\n\treturn value\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-iperf3-server/luasrc/view/iperf3-server/iperf3-server_status.htm",
    "content": "<fieldset class=\"cbi-section\">\n\t<legend><%:Status%></legend>\n\n\t<div style=\"display:flex; gap:8px; align-items:center; flex-wrap:wrap;\">\n\t\t<div id=\"iperf3_status\">-</div>\n\n\t\t<button class=\"btn cbi-button cbi-button-apply\" id=\"btn_start\" type=\"button\"><%:Start%></button>\n\t\t<button class=\"btn cbi-button cbi-button-reset\" id=\"btn_stop\" type=\"button\"><%:Stop%></button>\n\t\t<button class=\"btn cbi-button cbi-button-action\" id=\"btn_restart\" type=\"button\"><%:Restart%></button>\n\n\t\t<span id=\"iperf3_busy\" style=\"display:none; color:#999;\">...</span>\n\t</div>\n\n\t<div id=\"iperf3_list\" style=\"margin-top:8px;\"></div>\n</fieldset>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n(function () {\n\tvar token = '<%=token%>';\n\n\tfunction esc(s) {\n\t\tif (s === null || s === undefined) return '';\n\t\treturn String(s).replace(/[&<>\"']/g, function (c) {\n\t\t\treturn ({'&':'&amp;','<':'&lt;','>':'&gt;','\"':'&quot;',\"'\":'&#39;'}[c]);\n\t\t});\n\t}\n\n\tfunction setBusy(b) {\n\t\tdocument.getElementById('iperf3_busy').style.display = b ? '' : 'none';\n\t\tdocument.getElementById('btn_start').disabled = b;\n\t\tdocument.getElementById('btn_stop').disabled = b;\n\t\tdocument.getElementById('btn_restart').disabled = b;\n\t}\n\n\tfunction badge(text, color) {\n\t\treturn '<span style=\"color:' + color + '\">' + text + '</span>';\n\t}\n\n\tfunction stateBadge(it) {\n\t\t// 新字段优先：it.state；旧字段兼容：it.running\n\t\tvar st = it.state;\n\n\t\tif (!st) {\n\t\t\tif (it.enable === false || it.enable === \"0\") st = \"disabled\";\n\t\t\telse st = it.running ? \"running\" : \"stopped\";\n\t\t}\n\n\t\tif (st === \"running\")   return badge('<%:Running%>', 'green');\n\t\tif (st === \"delay\")     return badge('<%:Delay%>', '#d67f00');\n\t\tif (st === \"conflict\")  return badge('<%:Conflict%>', 'red');\n\t\tif (st === \"disabled\")  return badge('<%:Disabled%>', '#999');\n\t\treturn badge('<%:Stopped%>', '#999');\n\t}\n\n\tfunction overallBadge(data) {\n\t\t// controller 返回 data.running=true 表示至少一个 running\n\t\t// 如果没有 running，但存在 delay/conflict，也给更准确的总体状态\n\t\tif (data && data.running) {\n\t\t\treturn badge('<%:Running%>', 'green');\n\t\t}\n\n\t\tvar hasDelay = false, hasConflict = false;\n\t\tif (data && data.servers && data.servers.length) {\n\t\t\tfor (var i = 0; i < data.servers.length; i++) {\n\t\t\t\tvar st = data.servers[i].state;\n\t\t\t\tif (st === \"delay\") hasDelay = true;\n\t\t\t\telse if (st === \"conflict\") hasConflict = true;\n\t\t\t}\n\t\t}\n\n\t\tif (hasConflict) return badge('<%:Conflict%>', 'red');\n\t\tif (hasDelay)    return badge('<%:Delay%>', '#d67f00');\n\t\treturn badge('<%:Not running%>', 'red');\n\t}\n\n\tfunction translateDetail(detail) {\n\t\t// detail 来自 controller 的英文字符串，这里做映射为可翻译字符串\n\t\t// 未命中映射时，直接原样显示\n\t\tvar map = {\n\t\t\t\"disabled in config\": \"<%:disabled in config%>\",\n\t\t\t\"delay pending (sleep)\": \"<%:delay pending (sleep)%>\",\n\t\t\t\"listening and iperf3 process found\": \"<%:listening and iperf3 process found%>\",\n\t\t\t\"port is listening but not iperf3 (occupied)\": \"<%:port is listening but not iperf3 (occupied)%>\",\n\t\t\t\"not listening\": \"<%:not listening%>\"\n\t\t};\n\t\treturn map[detail] || detail || \"\";\n\t}\n\n\tfunction renderStatus(data) {\n\t\tvar s = document.getElementById('iperf3_status');\n\t\ts.innerHTML = overallBadge(data);\n\n\t\tvar list = document.getElementById('iperf3_list');\n\t\tvar html = '';\n\n\t\tif (data && data.servers && data.servers.length) {\n\t\t\thtml += '<ul>';\n\n\t\t\tfor (var i = 0; i < data.servers.length; i++) {\n\t\t\t\tvar it = data.servers[i];\n\n\t\t\t\tvar port = esc(it.port);\n\t\t\t\tvar en = (it.enable !== false) && (it.enable !== \"0\");\n\n\t\t\t\t// 旧字段 pid 兼容\n\t\t\t\tvar pidInfo = '';\n\t\t\t\tif (it.pid) {\n\t\t\t\t\tpidInfo = ' <span style=\"color:#999\"><%:PID%> ' + esc(it.pid) + '</span>';\n\t\t\t\t}\n\n\t\t\t\t// 监听信息（新字段 listen）\n\t\t\t\tvar listenInfo = '';\n\t\t\t\tif (typeof it.listen === \"boolean\") {\n\t\t\t\t\tlistenInfo = it.listen\n\t\t\t\t\t\t? ' <span style=\"color:#999\">[<%:LISTEN%>]</span>'\n\t\t\t\t\t\t: ' <span style=\"color:#999\">[<%:NO LISTEN%>]</span>';\n\t\t\t\t}\n\n\t\t\t\t// detail（来自 controller）\n\t\t\t\tvar dt = translateDetail(it.detail);\n\t\t\t\tvar detail = dt ? (' <span style=\"color:#999\">(' + esc(dt) + ')</span>') : '';\n\n\t\t\t\thtml += '<li>'\n\t\t\t\t\t+ '<%:Port%> ' + port + ' : '\n\t\t\t\t\t+ stateBadge(it)\n\t\t\t\t\t+ pidInfo\n\t\t\t\t\t+ listenInfo\n\t\t\t\t\t+ detail\n\t\t\t\t\t+ (en ? '' : ' <span style=\"color:#999\">(<%:disabled%>)</span>')\n\t\t\t\t\t+ '</li>';\n\t\t\t}\n\n\t\t\thtml += '</ul>';\n\n\t\t\t// 状态说明（简短）\n\t\t\thtml += '<div style=\"margin-top:6px; color:#999;\">'\n\t\t\t\t+ '<span><%:Delay%></span>: <%:starting after configured delay%> &nbsp; '\n\t\t\t\t+ '<span><%:Conflict%></span>: <%:port is occupied%>'\n\t\t\t\t+ '</div>';\n\t\t}\n\n\t\tlist.innerHTML = html;\n\t}\n\n\tfunction refresh() {\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin/services/iperf3-server/status\")%>', null,\n\t\t\tfunction (x, data) { renderStatus(data || {}); }\n\t\t);\n\t}\n\n\tfunction doAction(url, confirmText) {\n\t\tif (confirmText && !window.confirm(confirmText)) return;\n\n\t\tsetBusy(true);\n\t\tXHR.post(url, { token: token }, function (x, data) {\n\t\t\tsetBusy(false);\n\t\t\trefresh();\n\t\t});\n\t}\n\n\tdocument.getElementById('btn_start').addEventListener('click', function () {\n\t\tdoAction('<%=luci.dispatcher.build_url(\"admin/services/iperf3-server/start\")%>', '<%:Start iPerf3 servers?%>');\n\t});\n\tdocument.getElementById('btn_stop').addEventListener('click', function () {\n\t\tdoAction('<%=luci.dispatcher.build_url(\"admin/services/iperf3-server/stop\")%>', '<%:Stop iPerf3 servers?%>');\n\t});\n\tdocument.getElementById('btn_restart').addEventListener('click', function () {\n\t\tdoAction('<%=luci.dispatcher.build_url(\"admin/services/iperf3-server/restart\")%>', '<%:Restart iPerf3 servers?%>');\n\t});\n\n\t// 轮询刷新\n\tXHR.poll(2, '<%=luci.dispatcher.build_url(\"admin/services/iperf3-server/status\")%>', null,\n\t\tfunction (x, data) { renderStatus(data || {}); }\n\t);\n\n\t// 首次刷新\n\trefresh();\n})();\n//]]>\n</script>\n"
  },
  {
    "path": "luci-app-iperf3-server/po/zh_Hans/iperf3-server.po",
    "content": "#\n# App / Menu\n#\nmsgid \"iPerf3 Server\"\nmsgstr \"iPerf3 服务器\"\n\nmsgid \"iPerf3 - The ultimate speed test tool for TCP, UDP and SCTP\"\nmsgstr \"iPerf3 是一款集 TCP、UDP 和 SCTP 于一身的终极速度测试工具\"\n\n#\n# CBI (model)\n#\nmsgid \"Enable\"\nmsgstr \"启用\"\n\nmsgid \"Enable iPerf3 Servers\"\nmsgstr \"启用 iPerf3 服务器\"\n\nmsgid \"Server Settings\"\nmsgstr \"服务端设置\"\n\nmsgid \"Set up Multi-iPerf3 Servers\"\nmsgstr \"设置多个 iPerf3 服务端\"\n\nmsgid \"Port\"\nmsgstr \"端口\"\n\nmsgid \"Start delay (Seconds)\"\nmsgstr \"启动延迟（秒）\"\n\nmsgid \"Extra Options\"\nmsgstr \"额外参数\"\n\nmsgid \"Invalid port.\"\nmsgstr \"端口无效。\"\n\nmsgid \"Port must be unique.\"\nmsgstr \"端口必须唯一，不能重复。\"\n\nmsgid \"Delay must be between 0 and 3600 seconds.\"\nmsgstr \"启动延迟必须在 0 到 3600 秒之间。\"\n\nmsgid \"Invalid characters in Extra Options.\"\nmsgstr \"额外参数包含非法字符。\"\n\n#\n# Status page (.htm)\n#\nmsgid \"Status\"\nmsgstr \"状态\"\n\nmsgid \"Running\"\nmsgstr \"运行中\"\n\nmsgid \"Not running\"\nmsgstr \"未运行\"\n\nmsgid \"Stopped\"\nmsgstr \"已停止\"\n\nmsgid \"Start\"\nmsgstr \"启动\"\n\nmsgid \"Stop\"\nmsgstr \"停止\"\n\nmsgid \"Restart\"\nmsgstr \"重启\"\n\nmsgid \"Delay\"\nmsgstr \"延迟中\"\n\nmsgid \"Conflict\"\nmsgstr \"端口冲突\"\n\nmsgid \"Disabled\"\nmsgstr \"已禁用\"\n\nmsgid \"disabled\"\nmsgstr \"已禁用\"\n\nmsgid \"PID\"\nmsgstr \"进程号\"\n\nmsgid \"LISTEN\"\nmsgstr \"监听中\"\n\nmsgid \"NO LISTEN\"\nmsgstr \"未监听\"\n\nmsgid \"starting after configured delay\"\nmsgstr \"将在设定的延迟时间后启动\"\n\nmsgid \"port is occupied\"\nmsgstr \"端口已被其他服务占用\"\n\nmsgid \"Start iPerf3 servers?\"\nmsgstr \"确认启动 iPerf3 服务？\"\n\nmsgid \"Stop iPerf3 servers?\"\nmsgstr \"确认停止 iPerf3 服务？\"\n\nmsgid \"Restart iPerf3 servers?\"\nmsgstr \"确认重启 iPerf3 服务？\"\n\n#\n# Controller detail keys (act_status -> detail)\n# 你现在返回的是 detail_* key，前端应做 key->文本映射或直接 <%:detail_xxx%>\n#\nmsgid \"detail_disabled\"\nmsgstr \"已在配置中禁用\"\n\nmsgid \"detail_delay\"\nmsgstr \"延迟启动中\"\n\nmsgid \"detail_running\"\nmsgstr \"正在监听，且 iPerf3 进程已启动\"\n\nmsgid \"detail_conflict\"\nmsgstr \"端口正在监听，但不是 iPerf3（被占用）\"\n\nmsgid \"detail_stopped\"\nmsgstr \"未监听端口\"\n"
  },
  {
    "path": "luci-app-iperf3-server/root/etc/config/iperf3-server",
    "content": "\nconfig iperf3-server 'main'\n\toption main_enable '0'\n"
  },
  {
    "path": "luci-app-iperf3-server/root/etc/init.d/iperf3-server",
    "content": "#!/bin/sh /etc/rc.common\n# iPerf3 Server init (OpenWrt 23.05) - procd multi-instance (UCI-only fetch)\n# UCI: /etc/config/iperf3-server\n#\n# config iperf3-server\n#   option main_enable '1'\n#\n# config servers\n#   option enable_server '1'\n#   option port '5201'\n#   option delay '0'\n#   option extra_options ''\n\nUSE_PROCD=1\nSTART=99\n\nPROG=\"/usr/bin/iperf3\"\nCONFIG=\"iperf3-server\"\nLOGGER=\"logger -t iPerf3-Server\"\n\n# 与 CBI 的 extra_options 校验保持一致：拦截明显 shell 元字符\nis_safe_extra_opts() {\n\t[ -z \"$1\" ] && return 0\n\tcase \"$1\" in\n\t\t*\";\"*|*\"&\"*|*\"|\"*|*\"\\`\"*|*\"\\$\"*|*\"<\"*|*\">\"*|*\"\\\"\"*|*\"'\"* )\n\t\t\treturn 1\n\t\t;;\n\tesac\n\treturn 0\n}\n\n# 停止某端口：既杀 iperf3 server，也杀 delay 阶段的 sh/sleep\nkill_by_port() {\n\tlocal port=\"$1\"\n\tlocal pids\n\n\t# 1) 已经起来的 iperf3 server\n\tpids=\"$(ps w | grep '[i]perf3' | grep ' -s' | grep \" -p $port\" | awk '{print $1}')\"\n\t[ -n \"$pids\" ] && kill $pids 2>/dev/null\n\n\t# 2) delay 阶段：/bin/sh -c \"sleep N; exec iperf3 -s -p PORT ...\"\n\tpids=\"$(ps w | grep '[s]leep' | grep '[i]perf3' | grep \" -p $port\" | awk '{print $1}')\"\n\t[ -n \"$pids\" ] && kill $pids 2>/dev/null\n\n\tsleep 1\n\n\t# hard kill 兜底\n\tpids=\"$(ps w | grep '[i]perf3' | grep ' -s' | grep \" -p $port\" | awk '{print $1}')\"\n\t[ -n \"$pids\" ] && kill -9 $pids 2>/dev/null\n\n\tpids=\"$(ps w | grep '[s]leep' | grep '[i]perf3' | grep \" -p $port\" | awk '{print $1}')\"\n\t[ -n \"$pids\" ] && kill -9 $pids 2>/dev/null\n}\n\n# 获取 servers 索引列表（0 1 2 ...）\nget_server_indexes() {\n\t# 从 uci show 里提取 @servers[NUM]\n\tuci -q show \"$CONFIG\" 2>/dev/null \\\n\t\t| sed -n \"s/^$CONFIG\\.@servers\\[\\([0-9]\\+\\)\\]=servers$/\\1/p\"\n}\n\nstart_one_idx() {\n\tlocal idx=\"$1\"\n\n\tlocal enable_server port delay extra_options\n\tenable_server=\"$(uci -q get $CONFIG.@servers[$idx].enable_server)\"\n\tport=\"$(uci -q get $CONFIG.@servers[$idx].port)\"\n\tdelay=\"$(uci -q get $CONFIG.@servers[$idx].delay)\"\n\textra_options=\"$(uci -q get $CONFIG.@servers[$idx].extra_options)\"\n\n\t# 默认值\n\t[ -n \"$enable_server\" ] || enable_server=\"1\"\n\t[ -n \"$port\" ] || port=\"5201\"\n\t[ -n \"$delay\" ] || delay=\"0\"\n\n\t[ \"$enable_server\" = \"1\" ] || return 0\n\n\t# 端口合法性兜底\n\tcase \"$port\" in\n\t\t*[!0-9]*|'') $LOGGER \"Skip invalid port in @servers[$idx]\"; return 0 ;;\n\tesac\n\t[ \"$port\" -ge 1 ] 2>/dev/null && [ \"$port\" -le 65535 ] 2>/dev/null || {\n\t\t$LOGGER \"Skip invalid port [$port] in @servers[$idx]\"\n\t\treturn 0\n\t}\n\n\t# delay 合法性兜底\n\tcase \"$delay\" in\n\t\t*[!0-9]*|'') delay=0 ;;\n\tesac\n\n\t# extra_options 安全兜底\n\tif [ -n \"$extra_options\" ] && ! is_safe_extra_opts \"$extra_options\"; then\n\t\t$LOGGER \"Rejected unsafe extra_options on port [$port] (@servers[$idx])\"\n\t\textra_options=\"\"\n\tfi\n\n\t$LOGGER \"Starting @servers[$idx] port=[$port] delay=[$delay] ...\"\n\n\t# procd 实例名按端口\n\tprocd_open_instance \"iperf3_${port}\"\n\n\t# 不用 -D；delay 用 sh -c 不阻塞\n\tif [ \"$delay\" -gt 0 ] 2>/dev/null; then\n\t\tif [ -n \"$extra_options\" ]; then\n\t\t\tprocd_set_param command /bin/sh -c \"sleep $delay; exec $PROG -s -p $port $extra_options\"\n\t\telse\n\t\t\tprocd_set_param command /bin/sh -c \"sleep $delay; exec $PROG -s -p $port\"\n\t\tfi\n\telse\n\t\tif [ -n \"$extra_options\" ]; then\n\t\t\tprocd_set_param command \"$PROG\" -s -p \"$port\" $extra_options\n\t\telse\n\t\t\tprocd_set_param command \"$PROG\" -s -p \"$port\"\n\t\tfi\n\tfi\n\n\tprocd_set_param respawn 3600 5 5\n\tprocd_set_param stdout 1\n\tprocd_set_param stderr 1\n\tprocd_close_instance\n}\n\nstart_service() {\n\t[ -x \"$PROG\" ] || { $LOGGER \"iperf3 not found: $PROG\"; return 1; }\n\n\t# 主开关：直接用 uci 读取匿名段\n\tlocal main_enable\n\tmain_enable=\"$(uci -q get $CONFIG.@iperf3-server[0].main_enable)\"\n\t[ -n \"$main_enable\" ] || main_enable=\"0\"\n\n\t[ \"$main_enable\" = \"1\" ] || {\n\t\t$LOGGER \"iPerf3 Server is disabled ...\"\n\t\treturn 0\n\t}\n\n\t# 遍历 servers 索引\n\tlocal idx\n\tfor idx in $(get_server_indexes); do\n\t\tstart_one_idx \"$idx\"\n\tdone\n\n\treturn 0\n}\n\nstop_one_idx() {\n\tlocal idx=\"$1\"\n\tlocal enable_server port\n\n\tenable_server=\"$(uci -q get $CONFIG.@servers[$idx].enable_server)\"\n\t[ -n \"$enable_server\" ] || enable_server=\"1\"\n\t[ \"$enable_server\" = \"1\" ] || return 0\n\n\tport=\"$(uci -q get $CONFIG.@servers[$idx].port)\"\n\t[ -n \"$port\" ] || port=\"5201\"\n\n\tcase \"$port\" in\n\t\t*[!0-9]*|'') return 0 ;;\n\tesac\n\n\tkill_by_port \"$port\"\n}\n\nstop_service() {\n\t$LOGGER \"Stopping iPerf3 Server ...\"\n\n\t# 按 servers 列表逐个端口清理（不误杀其它 iperf3）\n\tlocal idx\n\tfor idx in $(get_server_indexes); do\n\t\tstop_one_idx \"$idx\"\n\tdone\n\n\treturn 0\n}\n\nreload_service() {\n\t# /etc/init.d/iperf3-server reload\n\tstop\n\tstart\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"$CONFIG\"\n}\n"
  },
  {
    "path": "luci-app-iperf3-server/root/etc/uci-defaults/iperf3-server",
    "content": "#!/bin/sh\n\n# 已存在就不重复写\nif uci -q show ucitrack | grep -q \"=iperf3-server\"; then\n\texit 0\nfi\n\nuci -q batch <<'EOF' >/dev/null\n\tadd ucitrack iperf3-server\n\tset ucitrack.@iperf3-server[-1].init='iperf3-server'\n\tcommit ucitrack\nEOF\n\nexit 0\n"
  },
  {
    "path": "luci-app-iperf3-server/root/usr/share/rpcd/acl.d/luci-app-iperf3-server.json",
    "content": "{\n  \"luci-app-iperf3-server\": {\n    \"description\": \"Grant access to LuCI app iPerf3 Server\",\n    \"read\": {\n      \"uci\": [ \"iperf3-server\" ]\n    },\n    \"write\": {\n      \"uci\": [ \"iperf3-server\" ],\n      \"file\": {\n        \"/etc/init.d/iperf3-server\": [ \"exec\" ]\n      }\n    }\n  }\n}\n"
  },
  {
    "path": "luci-app-istoreenhance/Makefile",
    "content": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for KSpeeder\nLUCI_DEPENDS:=+istoreenhance\nLUCI_PKGARCH:=all\nPKG_VERSION:=0.6.6-r1\n# PKG_RELEASE MUST be empty for luci.mk\nPKG_RELEASE:=\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n\n"
  },
  {
    "path": "luci-app-istoreenhance/luasrc/controller/istoreenhance.lua",
    "content": "module(\"luci.controller.istoreenhance\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/istoreenhance\") then\n\t\treturn\n\tend\n\n\tentry({\"admin\", \"services\", \"istoreenhance\"}, cbi(\"istoreenhance\"), _(\"KSpeeder\"), 20).dependent = true\n\n\tentry({\"admin\", \"services\", \"istoreenhance_status\"}, call(\"istoreenhance_status\"))\nend\n\nfunction istoreenhance_status()\n\tlocal sys  = require \"luci.sys\"\n\tlocal uci  = require \"luci.model.uci\".cursor()\n\tlocal port = tonumber(uci:get_first(\"istoreenhance\", \"istoreenhance\", \"adminport\"))\n\n\tlocal status = {\n\t\trunning = (sys.call(\"pidof iStoreEnhance >/dev/null\") == 0),\n\t\tport = (port or 5003)\n\t}\n\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(status)\nend\n\n"
  },
  {
    "path": "luci-app-istoreenhance/luasrc/model/cbi/istoreenhance.lua",
    "content": "local m, s\n\nlocal istoreenhance_model = require \"luci.model.istoreenhance\"\n\nm = Map(\"istoreenhance\", translate(\"KSpeeder\"), translate(\"KSpeeder is a tool to fix network issues for iStore.\"))\n\nm:section(SimpleSection).template  = \"istoreenhance_status\"\n\ns=m:section(TypedSection, \"istoreenhance\", translate(\"Global settings\"))\ns.addremove=false\ns.anonymous=true\n\ns:option(Flag, \"enabled\", translate(\"Enable\")).rmempty=false\n\ns:option(Value, \"adminport\", translate(\"Admin Port\")).rmempty=false\n\ns:option(Value, \"port\", translate(\"Port\")).rmempty=false\n\no = s:option(Value, \"cache\", translate(\"Cache Path\")..\"<b>*</b>\")\no.rmempty = false\no.datatype = \"string\"\n\nlocal blocks = istoreenhance_model.blocks()\nlocal home = istoreenhance_model.home()\n\nlocal paths, default_path = istoreenhance_model.find_paths(blocks, home, \"Configs\")\nfor _, val in pairs(paths) do\n  o:value(val, val)\nend\no.default = default_path\n\nreturn m\n\n\n"
  },
  {
    "path": "luci-app-istoreenhance/luasrc/model/istoreenhance.lua",
    "content": "local util  = require \"luci.util\"\nlocal jsonc = require \"luci.jsonc\"\n\nlocal istoreenhance = {}\n\nistoreenhance.blocks = function()\n  local f = io.popen(\"lsblk -s -f -b -o NAME,FSSIZE,MOUNTPOINT --json\", \"r\")\n  local vals = {}\n  if f then\n    local ret = f:read(\"*all\")\n    f:close()\n    local obj = jsonc.parse(ret)\n    for _, val in pairs(obj[\"blockdevices\"]) do\n      local fsize = val[\"fssize\"]\n      if fsize ~= nil and string.len(fsize) > 10 and val[\"mountpoint\"] then\n        -- fsize > 1G\n        vals[#vals+1] = val[\"mountpoint\"]\n      end\n    end\n  end\n  return vals\nend\n\nistoreenhance.home = function()\n  local uci = require \"luci.model.uci\".cursor()\n  local home_dirs = {}\n  home_dirs[\"main_dir\"] = uci:get_first(\"quickstart\", \"main\", \"main_dir\", \"/root\")\n  home_dirs[\"Configs\"] = uci:get_first(\"quickstart\", \"main\", \"conf_dir\", home_dirs[\"main_dir\"]..\"/Configs\")\n  home_dirs[\"Public\"] = uci:get_first(\"quickstart\", \"main\", \"pub_dir\", home_dirs[\"main_dir\"]..\"/Public\")\n  home_dirs[\"Downloads\"] = uci:get_first(\"quickstart\", \"main\", \"dl_dir\", home_dirs[\"Public\"]..\"/Downloads\")\n  home_dirs[\"Caches\"] = uci:get_first(\"quickstart\", \"main\", \"tmp_dir\", home_dirs[\"main_dir\"]..\"/Caches\")\n  return home_dirs\nend\n\nistoreenhance.find_paths = function(blocks, home_dirs, path_name)\n  local default_path = ''\n  local configs = {}\n\n  default_path = home_dirs[path_name] .. \"/iStoreEnhance\"\n  if #blocks == 0 then\n    table.insert(configs, default_path)\n  else\n    for _, val in pairs(blocks) do \n      table.insert(configs, val .. \"/\" .. path_name .. \"/iStoreEnhance\")\n    end\n    local without_conf_dir = \"/root/\" .. path_name .. \"/iStoreEnhance\"\n    if default_path == without_conf_dir then\n      default_path = configs[1]\n    end\n  end\n\n  return configs, default_path\nend\n\nreturn istoreenhance\n"
  },
  {
    "path": "luci-app-istoreenhance/luasrc/view/istoreenhance_status.htm",
    "content": "<script type=\"text/javascript\">//<![CDATA[\n\tXHR.poll(5, '<%=url(\"admin/services/istoreenhance_status\")%>', null,\n\t\tfunction(x, st)\n\t\t{\n\t\t\tvar tb = document.getElementById('istoreenhance_status');\n\t\t\tif (st && tb)\n\t\t\t{\n\t\t\t\tif (st.running)\n\t\t\t\t{\n\t\t\t\t\ttb.innerHTML = '<br/><em style=\\\"color:green\\\"><%:The KSpeeder service is running.%></em>'\n\t\t\t\t\t\t+ \"<br/><br/><input class=\\\"btn cbi-button cbi-button-apply\\\" type=\\\"button\\\" value=\\\" <%:Click to open KSpeeder%> \\\" onclick=\\\"window.open('http://\" + window.location.hostname + \":\" + st.port + \"/')\\\"/>\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttb.innerHTML = '<br/><em style=\\\"color:red\\\"><%:The KSpeeder service is not running.%></em>';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t);\n//]]></script>\n\n<fieldset class=\"cbi-section\">\n\t<legend><%:KSpeeder Status%></legend>\n\t<p id=\"istoreenhance_status\">\n\t\t<em><%:Collecting data...%></em>\n\t</p>\n</fieldset>\n"
  },
  {
    "path": "luci-app-istoreenhance/po/zh_Hans/istoreenhance.po",
    "content": "msgid \"KSpeeder\nmsgstr \"KSpeeder\"\n\nmsgid \"Running state\"\nmsgstr \"运行状态\"\n\nmsgid \"KSpeeder is a tool to fix network issues for iStore.\"\nmsgstr \"KSpeeder插件可以有效的解决一些网络问题，让 iStore 更好用。当然不安装也不会影响 iStore 基本功能。\"\n\nmsgid \"Port\"\nmsgstr \"端口\"\n\nmsgid \"Admin Port\"\nmsgstr \"管理端口\"\n\nmsgid \"The KSpeeder service is running.\"\nmsgstr \"服务已启动\"\n\nmsgid \"The KSpeeder service is not running.\"\nmsgstr \"服务未启动\"\n\nmsgid \"KSpeeder Status\"\nmsgstr \"服务状态\"\n\nmsgid \"Collecting data...\"\nmsgstr \"收集数据...\"\n\n"
  },
  {
    "path": "luci-app-istoreenhance/root/etc/uci-defaults/50_luci-istoreenhance",
    "content": "#!/bin/sh\n\nrm -f /tmp/luci-indexcache /tmp/luci-indexcache.*\nexit 0\n"
  },
  {
    "path": "luci-app-istorex/Makefile",
    "content": "#\n# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=IstoreX\nPKG_VERSION:=0.6.6\nLUCI_DEPENDS:=+luci-app-quickstart +luci-app-store +luci-lib-taskd\nLUCI_EXTRA_DEPENDS:=luci-lib-taskd (>=1.0.15)\nLUCI_MINIFY_CSS:=0\nLUCI_MINIFY_JS:=0\n\ndefine Package/luci-app-istorex/conffiles\n/etc/config/istorex\n/www/luci-static/istorex/image/bg.gif\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.167c223d.js",
    "content": "import{d as y,i as p,r as x,o as t,c as n,a as s,b as C,l as a,H as B,_ as D,p as $,q as I,u as S,F as _,E as k,m as v,e as h}from\"./index.js?v=5b4be379\";const b=e=>($(\"data-v-f0f8da84\"),e=e(),I(),e),F={class:\"disk-item\"},E={class:\"disk-item_contanier\"},z={class:\"disk-item_icon\"},N={class:\"disk-item_name\"},w=b(()=>s(\"div\",{class:\"auto\"},null,-1)),O={class:\"disk-item_used\"},V={key:0,class:\"disk-item_info\"},j={class:\"label-msg.warning\"},q={key:1,class:\"disk-item_info\"},M=b(()=>s(\"div\",{class:\"auto\"},null,-1)),A=y({__name:\"item\",props:{disk:{type:Object,required:!0}},setup(e){const l=e;p(()=>{var o;return((o=l.disk.childrens)==null?void 0:o.length)||0}),p(()=>{var u,c;let o=0;return(c=(u=l.disk)==null?void 0:u.childrens)==null||c.forEach(i=>{if(!i.mountPoint){const r=Number(i.sizeInt),g=(1<<30)*2;r>g&&o++}}),o});const d=()=>{B.OpenDisk({disk:l.disk})};return(o,u)=>{const c=x(\"icon-disk\");return t(),n(\"div\",F,[s(\"div\",E,[s(\"div\",z,[C(c)]),s(\"div\",N,[s(\"span\",null,a(e.disk.name)+\" \\u3010\"+a(e.disk.size)+\"\\u3011\"+a(e.disk.venderModel),1)]),w,s(\"div\",O,[s(\"span\",null,a(e.disk.used)+\" / \"+a(e.disk.total),1)])]),e.disk.errorInfo?(t(),n(\"div\",V,[s(\"span\",j,a(e.disk.errorInfo),1)])):(t(),n(\"div\",q,[s(\"span\",null,a(e.disk.path),1),M,s(\"a\",{onClick:u[0]||(u[0]=i=>d())},\" \\u67E5\\u770B \")]))])}}});var m=D(A,[[\"__scopeId\",\"data-v-f0f8da84\"]]);const f=e=>($(\"data-v-bf0d8af0\"),e=e(),I(),e),H={key:0,class:\"ul-container\"},L=f(()=>s(\"div\",{class:\"ul-container_title\"},[s(\"span\",null,\"\\u7CFB\\u7EDF\\u78C1\\u76D8\")],-1)),P={class:\"ul-container_body\"},G={key:1,class:\"ul-container\"},J=f(()=>s(\"div\",{class:\"ul-container_title\"},[s(\"span\",null,\"\\u5DF2\\u6302\\u8F7D\\u78C1\\u76D8\")],-1)),K={class:\"ul-container_body\"},Q={key:2,class:\"ul-container\"},R=f(()=>s(\"div\",{class:\"ul-container_title\"},[s(\"span\",null,\"\\u672A\\u8BC6\\u522B\\u78C1\\u76D8\")],-1)),T={class:\"ul-container_body\"},U={key:3,class:\"ul-container\"},W=f(()=>s(\"div\",{class:\"ul-container_title\"},[s(\"span\",null,\"raid\")],-1)),X={class:\"ul-container_body\"},Y=y({__name:\"index\",setup(e){const l=S(),d=p(()=>l.disk),o=p(()=>l.raid.disks);return(u,c)=>(t(),n(\"main\",null,[d.value.rootDisks.length>0?(t(),n(\"ul\",H,[L,s(\"div\",P,[(t(!0),n(_,null,k(d.value.rootDisks,(i,r)=>(t(),h(m,{disk:i},null,8,[\"disk\"]))),256))])])):v(\"\",!0),d.value.mountedDisks.length>0?(t(),n(\"ul\",G,[J,s(\"div\",K,[(t(!0),n(_,null,k(d.value.mountedDisks,(i,r)=>(t(),h(m,{disk:i},null,8,[\"disk\"]))),256))])])):v(\"\",!0),d.value.errorDisks.length>0?(t(),n(\"ul\",Q,[R,s(\"div\",T,[(t(!0),n(_,null,k(d.value.errorDisks,(i,r)=>(t(),h(m,{disk:i},null,8,[\"disk\"]))),256))])])):v(\"\",!0),o.value.length>0?(t(),n(\"ul\",U,[W,s(\"div\",X,[(t(!0),n(_,null,k(o.value,(i,r)=>(t(),h(m,{disk:i},null,8,[\"disk\"]))),256))])])):v(\"\",!0)]))}});var ss=D(Y,[[\"__scopeId\",\"data-v-bf0d8af0\"]]);export{ss as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.18e0c91d.js",
    "content": "import{d as u,r as e,o as r,e as s,w as i,b as c,P as t}from\"./index.js?v=5b4be379\";const _=u({__name:\"index\",setup(l){const a=[{name:\"disk\",title:\"\\u6211\\u7684\\u78C1\\u76D8\",path:\"/router/disk\"},{name:\"disk-raid\",title:\"\\u78C1\\u76D8\\u9635\\u5217\",fn:()=>{t({full:!0,title:\"\\u78C1\\u76D8\\u9635\\u5217\",src:\"/cgi-bin/luci/admin/nas/raid\"})}},{name:\"disk-smart\",title:\"S.M.A.R.T\",fn:()=>{t({full:!0,title:\"S.M.A.R.T\",src:\"/cgi-bin/luci/admin/nas/smart\"})}}];return(m,d)=>{const n=e(\"router-loading\"),o=e(\"layout-page\");return r(),s(o,{menus:a},{default:i(()=>[c(n)]),_:1})}}});export{_ as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.211ffb47.js",
    "content": "import{_ as o,r as n,o as r,c as t,b as a}from\"./index.js?v=5b4be379\";const c={},s={id:\"page\",class:\"page-container\"};function _(d,i){const e=n(\"router-loading\");return r(),t(\"div\",s,[a(e)])}var p=o(c,[[\"render\",_]]);export{p as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.2147605f.js",
    "content": "var C=(r,h,d)=>new Promise((k,c)=>{var F=l=>{try{E(d.next(l))}catch(v){c(v)}},t=l=>{try{E(d.throw(l))}catch(v){c(v)}},E=l=>l.done?k(l.value):Promise.resolve(l.value).then(F,t);E((d=d.apply(r,h)).next())});import{_ as S,d as w,s as m,j as I,v as N,o,c as n,F as _,a as s,x,D as g,E as y,m as D,l as p,B as T,p as G,q as U,C as A,T as B}from\"./index.js?v=5b4be379\";const i=r=>(G(\"data-v-6bbc1a4d\"),r=r(),U(),r),V=[\"onSubmit\"],M=i(()=>s(\"p\",null,\"\\u4E00\\u4E2A\\u7B80\\u6613\\u6C99\\u7BB1\\uFF0C\\u65B9\\u4FBF\\u7528\\u6765\\u5B9E\\u9A8C\\u7CFB\\u7EDF\\u914D\\u7F6E\\u548C\\u7A0B\\u5E8F\\uFF0C\\u65B9\\u4FBF\\u5F00\\u53D1\\u672A\\u5B8C\\u6210\\u7684\\u8F6F\\u4EF6\\uFF0C\\u4F46\\u4E0D\\u4FDD\\u62A4Docker\\u548C\\u786C\\u76D8\\u7684\\u6570\\u636E\",-1)),q={key:0,class:\"label-msg warning\"},z=i(()=>s(\"div\",{class:\"label-value\"},null,-1)),L=i(()=>s(\"div\",{class:\"label-name\"},[s(\"span\",null,\"\\u72B6\\u6001\")],-1)),P={class:\"label-value\"},$=[\"value\"],j=i(()=>s(\"option\",{disabled:\"\",selected:\"true\"},\"\\u83B7\\u53D6\\u4E2D...\",-1)),O=i(()=>s(\"option\",{disabled:\"\",value:\"stopped\"},\"\\u672A\\u5F00\\u542F\",-1)),W=i(()=>s(\"option\",{disabled:\"\",value:\"running\"},\"\\u5F00\\u542F\\u4E2D\",-1)),H=[j,O,W],J={key:0,class:\"label-btns\"},K=i(()=>s(\"div\",{class:\"label-name\"},[s(\"span\",null,\"\\u76EE\\u6807\\u78C1\\u76D8\\uFF08\\u5EFA\\u8BAE\\u9009\\u62E9U\\u76D8\\u6216\\u8005\\u79FB\\u52A8\\u786C\\u76D8\\uFF0C\\u65B9\\u4FBF\\u88C5\\u5378\\uFF09\")],-1)),Q={class:\"label-value\"},R=i(()=>s(\"option\",{value:\"\"},\"\\u8BF7\\u9009\\u62E9\\u76EE\\u6807\\u78C1\\u76D8\",-1)),X=[\"value\"],Y=i(()=>s(\"div\",{class:\"label-name\"},[s(\"span\",null,\"\\u76EE\\u6807\\u5206\\u533A\\uFF08\\u5206\\u533A\\u5927\\u5C0F\\u987B\\u5927\\u4E8E8G\\uFF0C\\u5C06\\u6B64\\u5206\\u533A\\u4F5C\\u4E3A\\u5916\\u90E8 overlay \\u4F7F\\u7528\\uFF09\")],-1)),Z={class:\"label-value\"},uu=i(()=>s(\"option\",{selected:\"true\",value:\"\"},\"\\u8BF7\\u9009\\u62E9\\u76EE\\u6807\\u5206\\u533A\",-1)),su=[\"value\",\"disabled\"],tu={key:1,class:\"label-btns\"},eu=[\"disabled\"],au={key:2,class:\"label-msg warning\"},ou=w({__name:\"index\",setup(r){return C(this,null,function*(){let h,d;const k=m(!1),c=m(\"\"),F=m(0),t=I({status:\"stopped\",diskpath:\"\",partition:\"\",sandboxDisks:{disks:[]}}),E=()=>C(this,null,function*(){const b=yield Promise.all([A.Nas.SandboxDisks.GET(),A.Nas.GetSandbox.GET()]);try{const u=b[0];if(u!=null&&u.data){const{result:e,error:a}=u.data;e&&(t.sandboxDisks.disks=e.disks||[]),a&&(c.value=a)}}catch(u){c.value=u,F.value=3}try{const u=b[1];if(u!=null&&u.data){const{result:e}=u.data;e&&(t.status=e.status)}}catch(u){console.log(u)}});[h,d]=N(()=>E()),yield h,d();const l=()=>{t.partition=\"\"},v=()=>C(this,null,function*(){if(confirm(\"\\u6B64\\u64CD\\u4F5C\\u4F1A\\u5C06\\u4F1A\\u5220\\u9664\\u8BE5\\u5206\\u533A\\u5168\\u90E8\\u6570\\u636E,\\u662F\\u5426\\u7EE7\\u7EED?\")){const b=B.Loading(\"\\u914D\\u7F6E\\u4E2D...\");try{const u=yield A.Nas.Sandbox.POST({path:t.partition});if(u!=null&&u.data){const{result:e,error:a,success:f}=u.data;a&&B.Warning(a),(u.data.success||0)==0&&B.Success(\"\\u914D\\u7F6E\\u6210\\u529F\")}}catch(u){B.Error(`${u}`)}b.Close()}});return(b,u)=>(o(),n(\"form\",{class:\"form-container\",onSubmit:T(v,[\"prevent\"])},[M,t.sandboxDisks.disks.length==0?(o(),n(\"div\",q,\" \\u68C0\\u6D4B\\u4E0D\\u5230\\u6302\\u8F7D\\u7684\\u78C1\\u76D8\\u4FE1\\u606F\\uFF0C\\u8BF7\\u5148\\u63D2\\u4E0A\\u78C1\\u76D8\\uFF0C\\u5EFA\\u8BAE\\u4F7F\\u7528U\\u76D8\\u6216\\u8005\\u79FB\\u52A8\\u786C\\u76D8\\uFF0C\\u65B9\\u4FBF\\u88C5\\u5378 \")):(o(),n(_,{key:1},[z,L,s(\"div\",P,[s(\"select\",{value:t.status,disabled:\"\"},H,8,$)]),F.value==0?(o(),n(\"div\",J,[s(\"button\",{class:\"sumbit\",type:\"button\",onClick:u[0]||(u[0]=e=>F.value=1)},\"\\u914D\\u7F6E\")])):F.value==1?(o(),n(_,{key:1},[K,s(\"div\",Q,[x(s(\"select\",{\"onUpdate:modelValue\":u[1]||(u[1]=e=>t.diskpath=e),onChange:l},[R,(o(!0),n(_,null,y(t.sandboxDisks.disks,(e,a)=>(o(),n(\"option\",{value:e.path,key:a},p(e.venderModel)+\"\\uFF08\"+p(e.size)+\"\\uFF09 \",9,X))),128))],544),[[g,t.diskpath]])]),t.diskpath?(o(),n(_,{key:0},[Y,(o(!0),n(_,null,y(t.sandboxDisks.disks,e=>(o(),n(\"div\",Z,[e.path==t.diskpath?x((o(),n(\"select\",{key:0,\"onUpdate:modelValue\":u[2]||(u[2]=a=>t.partition=a)},[uu,(o(!0),n(_,null,y(e.childrens,(a,f)=>(o(),n(\"option\",{value:a.path,key:f,disabled:a.sizeInt<8192e6},p(a.name)+\"\\uFF08\"+p(a.filesystem||\"\\u672A\\u683C\\u5F0F\\u5316\")+\"\\uFF09\"+p(a.total),9,su))),128))],512)),[[g,t.partition]]):D(\"\",!0)]))),256))],64)):D(\"\",!0),t.diskpath&&t.partition?(o(),n(\"div\",tu,[s(\"button\",{class:\"sumbit\",disabled:k.value},\"\\u4FDD\\u5B58\",8,eu)])):D(\"\",!0)],64)):D(\"\",!0)],64)),c.value?(o(),n(\"div\",au,p(c.value),1)):D(\"\",!0)],40,V))})}});var lu=S(ou,[[\"__scopeId\",\"data-v-6bbc1a4d\"]]);export{lu as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.25dae49f.js",
    "content": "var f=Object.defineProperty;var F=Object.getOwnPropertySymbols;var h=Object.prototype.hasOwnProperty,A=Object.prototype.propertyIsEnumerable;var v=(s,t,u)=>t in s?f(s,t,{enumerable:!0,configurable:!0,writable:!0,value:u}):s[t]=u,b=(s,t)=>{for(var u in t||(t={}))h.call(t,u)&&v(s,u,t[u]);if(F)for(var u of F(t))A.call(t,u)&&v(s,u,t[u]);return s};var E=(s,t,u)=>new Promise((r,d)=>{var c=n=>{try{a(u.next(n))}catch(o){d(o)}},l=n=>{try{a(u.throw(n))}catch(o){d(o)}},a=n=>n.done?r(n.value):Promise.resolve(n.value).then(c,l);a((u=u.apply(s,t)).next())});import{d as y,s as m,j as x,o as D,c as _,a as e,x as i,A as p,y as B,z as C,l as V,m as g,B as I,G as w,T as S,C as k}from\"./index.js?v=5b4be379\";const M=[\"onSubmit\"],N=w('<div class=\"label-info\"> \\u65C1\\u8DEF\\u7531\\u6A21\\u5F0F\\uFF0C\\u4E5F\\u53EB\\u5355\\u81C2\\u8DEF\\u7531\\u6A21\\u5F0F\\u3002\\u60A8\\u53EF\\u4EE5\\u7528\\u4E0A\\u4E00\\u7EA7\\u8DEF\\u7531\\u62E8\\u53F7\\uFF0C\\u7136\\u540E\\u7531\\u8BE5\\u8BBE\\u5907\\u6765\\u5B9E\\u73B0\\u4E00\\u4E9B\\u9AD8\\u7EA7\\u529F\\u80FD\\u3002 </div><div class=\"label-name\"><span>LAN \\u63A5\\u53E3\\u914D\\u7F6E\\u65B9\\u5F0F</span></div><div class=\"label-value\"><select disabled><option> \\u65C1\\u8DEF\\u7531\\u6A21\\u5F0F\\u4EC5\\u652F\\u6301\\u9759\\u6001IP\\u5730\\u5740 </option></select></div><div class=\"label-name\"><span>IP \\u5730\\u5740\\uFF08\\u8BF7\\u548C\\u4E0A\\u4E00\\u6B65\\u8BB0\\u5F55\\u7684\\u4E3B\\u8DEF\\u7531\\u5730\\u5740\\u5728\\u540C\\u4E00\\u7F51\\u6BB5\\uFF09</span></div>',4),P={class:\"label-value\"},U=e(\"div\",{class:\"label-name\"},[e(\"span\",null,\"\\u5B50\\u7F51\\u63A9\\u7801\")],-1),q={class:\"label-value\"},L=e(\"div\",{class:\"label-name\"},[e(\"span\",null,\"\\u7F51\\u5173\\u5730\\u5740\")],-1),T={class:\"label-value\"},G=e(\"div\",{class:\"label-name\"},[e(\"span\",null,\"DNS\\u670D\\u52A1\\u5668\")],-1),H={class:\"label-value\"},R=e(\"div\",{class:\"label-name\"},[e(\"span\",null,\"\\u662F\\u5426\\u63D0\\u4F9B DHCP\\uFF08\\u5982\\u679C\\u662F\\u63D0\\u4F9B DHCP\\uFF0C\\u5219\\u9700\\u8981\\u5173\\u95ED\\u4E3B\\u8DEF\\u7531 DHCP\\uFF09\")],-1),j={class:\"label-value\"},z={class:\"label-flex\"},O={class:\"label-btns\"},J=[\"disabled\"],K={key:0,class:\"label-msg\"},X=y({__name:\"index\",setup(s){const t=m(\"\"),u=x({subnetMask:\"255.255.255.0\",staticDnsIp:\"223.5.5.5\",staticLanIp:\"\",gateway:\"\",enableDhcp:!0}),r=m(!1),d=()=>E(this,null,function*(){const c=b({},u),l=S.Loading(\"\\u914D\\u7F6E\\u4E2D...\");try{const a=yield k.Guide.GatewayRouter.POST(c);if(a!=null&&a.data){const{success:n,error:o}=a==null?void 0:a.data;o&&(t.value=o),(n==null||n==0)&&(t.value=\"\\u914D\\u7F6E\\u6210\\u529F\")}}catch(a){t.value=a}l.Close()});return(c,l)=>(D(),_(\"form\",{class:\"form-container\",onSubmit:I(d,[\"prevent\"])},[N,e(\"div\",P,[i(e(\"input\",{type:\"text\",placeholder:\"ip\\u5730\\u5740\",\"onUpdate:modelValue\":l[0]||(l[0]=a=>u.staticLanIp=a),required:\"\"},null,512),[[p,u.staticLanIp,void 0,{trim:!0}]])]),U,e(\"div\",q,[i(e(\"input\",{type:\"text\",placeholder:\"\\u5B50\\u7F51\\u63A9\\u7801\\u5730\\u5740\",\"onUpdate:modelValue\":l[1]||(l[1]=a=>u.subnetMask=a),required:\"\"},null,512),[[p,u.subnetMask,void 0,{trim:!0}]])]),L,e(\"div\",T,[i(e(\"input\",{type:\"text\",placeholder:\"\\u7F51\\u5173\\u5730\\u5740\",\"onUpdate:modelValue\":l[2]||(l[2]=a=>u.gateway=a),required:\"\"},null,512),[[p,u.gateway,void 0,{trim:!0}]])]),G,e(\"div\",H,[i(e(\"input\",{type:\"text\",placeholder:\"dns\\u670D\\u52A1\\u5668\\u5730\\u5740\",\"onUpdate:modelValue\":l[3]||(l[3]=a=>u.staticDnsIp=a),required:\"\"},null,512),[[p,u.staticDnsIp,void 0,{trim:!0}]])]),R,e(\"div\",j,[e(\"div\",z,[e(\"label\",null,[i(e(\"input\",{type:\"radio\",value:!1,\"onUpdate:modelValue\":l[4]||(l[4]=a=>u.enableDhcp=a)},null,512),[[B,u.enableDhcp]]),C(\"\\u5173\\u95ED\")]),e(\"label\",null,[i(e(\"input\",{type:\"radio\",value:!0,\"onUpdate:modelValue\":l[5]||(l[5]=a=>u.enableDhcp=a)},null,512),[[B,u.enableDhcp]]),C(\"\\u542F\\u7528\")])])]),e(\"div\",O,[e(\"button\",{class:\"sumbit\",disabled:r.value},\"\\u4FDD\\u5B58\",8,J)]),t.value?(D(),_(\"div\",K,[e(\"span\",null,V(t.value),1)])):g(\"\",!0)],40,M))}});export{X as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.403244cc.js",
    "content": "var c=(p,t,a)=>new Promise((n,o)=>{var r=e=>{try{s(a.next(e))}catch(_){o(_)}},d=e=>{try{s(a.throw(e))}catch(_){o(_)}},s=e=>e.done?n(e.value):Promise.resolve(e.value).then(r,d);s((a=a.apply(p,t)).next())});import{_ as i,d as u,I as l,o as x,c as g,b as m,J as v}from\"./index.js?v=5b4be379\";const f={id:\"page\",class:\"page-top-container\"},b=u({__name:\"index\",setup(p){const t=l();return(()=>c(this,null,function*(){yield t.getApp()}))(),(n,o)=>(x(),g(\"div\",f,[m(v)]))}});var h=i(b,[[\"__scopeId\",\"data-v-701aba0b\"]]);export{h as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.41b74402.js",
    "content": "import{_ as o,r,o as t,e as n,w as s,S as a,b as c}from\"./index.js?v=5b4be379\";const _={};function u(f,i){const e=r(\"router-view\");return t(),n(a,null,{default:s(()=>[c(e)]),_:1})}var p=o(_,[[\"render\",u]]);export{p as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.42bb6629.js",
    "content": "import{_ as r}from\"./index.js?v=5b4be379\";const e={};function n(_,c){return null}var a=r(e,[[\"render\",n]]);export{a as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.4d4bc89c.js",
    "content": "var _=(p,d,a)=>new Promise((c,n)=>{var o=s=>{try{i(a.next(s))}catch(e){n(e)}},f=s=>{try{i(a.throw(s))}catch(e){n(e)}},i=s=>s.done?c(s.value):Promise.resolve(s.value).then(o,f);i((a=a.apply(p,d)).next())});import{d as g,s as b,j as E,v as w,o as S,c as m,a as r,F as x,E as F,l as h,m as L,B,x as D,y as G,z as T,C as y,T as v}from\"./index.js?v=5b4be379\";const C=[\"onSubmit\"],k=r(\"div\",{class:\"label-name\"},[r(\"span\",null,\"\\u9009\\u62E9\\u8F6F\\u4EF6\\u6E90 \")],-1),I={class:\"label-value\"},V={class:\"label-flex\"},N=[\"value\"],M={class:\"label-btns\"},j=[\"disabled\"],q={key:0,class:\"label-msg\"},O=g({__name:\"index\",setup(p){return _(this,null,function*(){let d,a;const c=b(!1),n=b(\"\"),o=E({softsourceListIfo:[],softSource:{},currSoftSource:{}}),f=()=>_(this,null,function*(){var s,e,u;try{const t=yield y.Guide.SoftSourceList.GET();if((s=t==null?void 0:t.data)!=null&&s.result){const l=(e=t==null?void 0:t.data)==null?void 0:e.result;o.softsourceListIfo=l.softSourceList||[]}}catch(t){console.log(t)}try{const t=yield y.Guide.GetSoftSource.GET();if((u=t==null?void 0:t.data)!=null&&u.result){const l=t.data.result;o.softSource=l.softSource,o.currSoftSource=l.softSource}}catch(t){console.log(t)}});[d,a]=w(()=>f()),yield d,a();const i=()=>_(this,null,function*(){const s=v.Loading(\"\\u6B63\\u5728\\u5207\\u6362\\u4E2D...\");c.value=!0;try{const e=yield y.Guide.SoftSource.POST({softSourceIdentity:o.softSource.identity});if(e!=null&&e.data){const{result:u,error:t,success:l}=e.data;t&&v.Warning(t),(e.data.success||0)==0&&(v.Success(\"\\u5207\\u6362\\u6210\\u529F\"),yield f())}}catch(e){v.Error(`${e}`)}finally{c.value=!1,s.Close()}});return(s,e)=>(S(),m(\"form\",{class:\"form-container\",onSubmit:B(i,[\"prevent\"])},[k,r(\"div\",I,[(S(!0),m(x,null,F(o.softsourceListIfo,u=>(S(),m(\"label\",V,[D(r(\"input\",{type:\"radio\",value:u.identity,\"onUpdate:modelValue\":e[0]||(e[0]=t=>o.softSource.identity=t)},null,8,N),[[G,o.softSource.identity,void 0,{trim:!0}]]),T(\" \"+h(u.name),1)]))),256))]),r(\"div\",M,[r(\"button\",{class:\"sumbit\",disabled:c.value},\"\\u4FDD\\u5B58\",8,j)]),n.value?(S(),m(\"div\",q,[r(\"span\",null,h(n.value),1)])):L(\"\",!0)],40,C))})}});export{O as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.4f4af73e.js",
    "content": "var r=(c,m,i)=>new Promise((w,t)=>{var n=l=>{try{o(i.next(l))}catch(v){t(v)}},s=l=>{try{o(i.throw(l))}catch(v){t(v)}},o=l=>l.done?w(l.value):Promise.resolve(l.value).then(n,s);o((i=i.apply(c,m)).next())});import{_ as V,d as T,u as I,s as f,j as A,v as M,o as E,c as b,a as u,x as _,y as h,z as D,A as k,m as y,l as U,B as q,p as G,q as N,C as B,T as x}from\"./index.js?v=5b4be379\";const p=c=>(G(\"data-v-c5783954\"),c=c(),N(),c),L=[\"onSubmit\"],O=p(()=>u(\"p\",null,[D(\" \\u6B22\\u8FCE\\u4F7F\\u7528\\u5FEB\\u901F\\u7F51\\u7EDC\\u914D\\u7F6E\\u5411\\u5BFC\\uFF0C\\u8BF7\\u9009\\u62E9\\u4E00\\u79CD\\u8FDE\\u63A5\\u65B9\\u5F0F\\u4EE5\\u5F00\\u59CB\\u8054\\u7F51\\uFF0C\\u6216\\u4F7F\\u7528\\u5DE6\\u4FA7\\u83DC\\u5355\\u8FDB\\u884C\\u8054\\u7F51\\u914D\\u7F6E \"),u(\"br\"),D(\" \\u6CA1\\u627E\\u5230\\u60F3\\u8981\\u7684\\u914D\\u7F6E\\uFF1F\\u8BF7\\u4F7F\\u7528 \"),u(\"a\",{href:\"/cgi-bin/luci/admin/network/network\",target:\"_blank\"},\"\\u9AD8\\u7EA7\\u6A21\\u5F0F\")],-1)),j=p(()=>u(\"div\",{class:\"label-name\"},[u(\"span\",null,\"\\u8054\\u7F51\\u65B9\\u5F0F\")],-1)),z={class:\"label-value\"},R={class:\"label-flex\"},H={style:{display:\"none\"}},J={key:0,class:\"ul-container\"},K=p(()=>u(\"div\",{class:\"ul-container_title\"},[u(\"span\",null,\"\\u62E8\\u53F7\\u8054\\u7F51\\u914D\\u7F6E\")],-1)),Q=p(()=>u(\"div\",{class:\"label-value\"},null,-1)),W=p(()=>u(\"div\",{class:\"label-name\"},[u(\"span\",null,\"\\u8D26\\u53F7\")],-1)),X={class:\"label-value\"},Y=p(()=>u(\"div\",{class:\"label-name\"},[u(\"span\",null,\"\\u5BC6\\u7801\")],-1)),Z={class:\"label-value\"},$={key:1,class:\"label-btns\"},uu=[\"disabled\"],eu={key:2,class:\"label-msg\"},au=T({__name:\"index\",setup(c){return r(this,null,function*(){let m,i;const w=I(),t=f(\"\"),n=f(!1),s=f(\"\"),o=A({account:\"\",password:\"\"}),l=A({wanProto:\"dhcp\",dnsProto:\"auto\",staticIp:\"\",subnetMask:\"\",manualDnsIp:[],gateway:\"\"}),v=()=>r(this,null,function*(){n.value=!0;try{const d=yield B.Guide.Pppoe.GET(),{result:e}=d.data;e&&(o.account=e.account||\"\",o.password=e.password||\"\")}catch(d){s.value=d}t.value=yield w.getAsyncNetworkProto,n.value=!1});[m,i]=M(()=>v()),yield m,i();const P=()=>r(this,null,function*(){switch(t.value){case\"pppoe\":yield S();break;case\"dhcp\":yield g();break;default:s.value=\"\\u627E\\u4E0D\\u5230\\u4F60\\u8981\\u7684\\u914D\\u7F6E\";break}}),S=()=>r(this,null,function*(){if(o.account==\"\"){s.value=\"\\u8D26\\u53F7\\u4E0D\\u80FD\\u4E3A\\u7A7A\";return}if(o.password==\"\"){s.value=\"\\u5BC6\\u7801\\u4E0D\\u80FD\\u4E3A\\u7A7A\";return}n.value=!0;const d=x.Loading(\"\\u4FDD\\u5B58\\u4E2D...\");try{const e=yield B.Guide.Pppoe.POST({account:o.account,password:o.password});if(e.data){const{error:a,success:F}=e.data;a&&(s.value=a),(F==null||F==0)&&(s.value=\"\\u914D\\u7F6E\\u5B8C\\u6210\")}}catch(e){s.value=e}finally{}n.value=!1,d.Close()}),g=()=>r(this,null,function*(){const d={wanProto:l.wanProto,dnsProto:l.dnsProto};n.value=!0;const e=x.Loading(\"\\u4FDD\\u5B58\\u4E2D...\");try{const a=yield B.Guide.ClientModel.POST(d);if(a!=null&&a.data){const{success:F,error:C}=a==null?void 0:a.data;C&&(s.value=C),(F==null||F==0)&&(s.value=\"\\u914D\\u7F6E\\u5B8C\\u6210\")}}catch(a){s.value=a}n.value=!1,e.Close()});return(d,e)=>(E(),b(\"form\",{class:\"form-container\",onSubmit:q(P,[\"prevent\"])},[O,j,u(\"div\",z,[u(\"div\",R,[u(\"label\",null,[_(u(\"input\",{type:\"radio\",value:\"pppoe\",\"onUpdate:modelValue\":e[0]||(e[0]=a=>t.value=a)},null,512),[[h,t.value]]),D(\"\\u8D26\\u53F7\\u5BC6\\u7801\")]),u(\"label\",null,[_(u(\"input\",{type:\"radio\",value:\"dhcp\",\"onUpdate:modelValue\":e[1]||(e[1]=a=>t.value=a)},null,512),[[h,t.value]]),D(\"\\u81EA\\u52A8\\u8054\\u7F51\")]),u(\"label\",H,[_(u(\"input\",{type:\"radio\",value:\"static\",hidden:\"true\",\"onUpdate:modelValue\":e[2]||(e[2]=a=>t.value=a)},null,512),[[h,t.value]]),D(\"\\u7F51\\u5173\\u8054\\u7F51\")])])]),t.value==\"pppoe\"?(E(),b(\"ul\",J,[K,Q,W,u(\"div\",X,[_(u(\"input\",{type:\"text\",placeholder:\"\\u5BBD\\u5E26\\u8D26\\u53F7\",\"onUpdate:modelValue\":e[3]||(e[3]=a=>o.account=a),required:\"\"},null,512),[[k,o.account,void 0,{trim:!0}]])]),Y,u(\"div\",Z,[_(u(\"input\",{type:\"password\",placeholder:\"\\u5BBD\\u5E26\\u5BC6\\u7801\",\"onUpdate:modelValue\":e[4]||(e[4]=a=>o.password=a),required:\"\"},null,512),[[k,o.password,void 0,{trim:!0}]])])])):y(\"\",!0),t.value==\"pppoe\"||t.value==\"dhcp\"?(E(),b(\"div\",$,[u(\"button\",{class:\"sumbit\",disabled:n.value},\"\\u4FDD\\u5B58\",8,uu)])):y(\"\",!0),s.value?(E(),b(\"div\",eu,[u(\"span\",null,U(s.value),1)])):y(\"\",!0)],40,L))})}});var ou=V(au,[[\"__scopeId\",\"data-v-c5783954\"]]);export{ou as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.5e41a3f0.js",
    "content": "import{_ as r}from\"./index.js?v=5b4be379\";const e={};function n(_,c){return null}var a=r(e,[[\"render\",n]]);export{a as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.6d3585bb.js",
    "content": "var M=typeof globalThis!=\"undefined\"?globalThis:typeof window!=\"undefined\"?window:typeof global!=\"undefined\"?global:typeof self!=\"undefined\"?self:{},k={exports:{}};(function(c){(function(p){const a=\"(0?\\\\d+|0x[a-f0-9]+)\",u={fourOctet:new RegExp(`^${a}\\\\.${a}\\\\.${a}\\\\.${a}$`,\"i\"),threeOctet:new RegExp(`^${a}\\\\.${a}\\\\.${a}$`,\"i\"),twoOctet:new RegExp(`^${a}\\\\.${a}$`,\"i\"),longValue:new RegExp(`^${a}$`,\"i\")},l=new RegExp(\"^0[0-7]+$\",\"i\"),d=new RegExp(\"^0x[a-f0-9]+$\",\"i\"),w=\"%[0-9a-z]{1,}\",P=\"(?:[0-9a-f]+::?)+\",v={zoneIndex:new RegExp(w,\"i\"),native:new RegExp(`^(::)?(${P})?([0-9a-f]+)?(::)?(${w})?$`,\"i\"),deprecatedTransitional:new RegExp(`^(?:::)(${a}\\\\.${a}\\\\.${a}\\\\.${a}(${w})?)$`,\"i\"),transitional:new RegExp(`^((?:${P})|(?:::)(?:${P})?)${a}\\\\.${a}\\\\.${a}\\\\.${a}(${w})?$`,\"i\")};function y(t,e){if(t.indexOf(\"::\")!==t.lastIndexOf(\"::\"))return null;let n=0,r=-1,i=(t.match(v.zoneIndex)||[])[0],o,f;for(i&&(i=i.substring(1),t=t.replace(/%.+$/,\"\"));(r=t.indexOf(\":\",r+1))>=0;)n++;if(t.substr(0,2)===\"::\"&&n--,t.substr(-2,2)===\"::\"&&n--,n>e)return null;for(f=e-n,o=\":\";f--;)o+=\"0:\";return t=t.replace(\"::\",o),t[0]===\":\"&&(t=t.slice(1)),t[t.length-1]===\":\"&&(t=t.slice(0,-1)),e=function(){const $=t.split(\":\"),b=[];for(let g=0;g<$.length;g++)b.push(parseInt($[g],16));return b}(),{parts:e,zoneId:i}}function m(t,e,n,r){if(t.length!==e.length)throw new Error(\"ipaddr: cannot match CIDR for objects with different lengths\");let i=0,o;for(;r>0;){if(o=n-r,o<0&&(o=0),t[i]>>o!==e[i]>>o)return!1;r-=n,i+=1}return!0}function I(t){if(d.test(t))return parseInt(t,16);if(t[0]===\"0\"&&!isNaN(parseInt(t[1],10))){if(l.test(t))return parseInt(t,8);throw new Error(`ipaddr: cannot parse ${t} as octal`)}return parseInt(t,10)}function E(t,e){for(;t.length<e;)t=`0${t}`;return t}const s={};s.IPv4=function(){function t(e){if(e.length!==4)throw new Error(\"ipaddr: ipv4 octet count should be 4\");let n,r;for(n=0;n<e.length;n++)if(r=e[n],!(0<=r&&r<=255))throw new Error(\"ipaddr: ipv4 octet should fit in 8 bits\");this.octets=e}return t.prototype.SpecialRanges={unspecified:[[new t([0,0,0,0]),8]],broadcast:[[new t([255,255,255,255]),32]],multicast:[[new t([224,0,0,0]),4]],linkLocal:[[new t([169,254,0,0]),16]],loopback:[[new t([127,0,0,0]),8]],carrierGradeNat:[[new t([100,64,0,0]),10]],private:[[new t([10,0,0,0]),8],[new t([172,16,0,0]),12],[new t([192,168,0,0]),16]],reserved:[[new t([192,0,0,0]),24],[new t([192,0,2,0]),24],[new t([192,88,99,0]),24],[new t([198,18,0,0]),15],[new t([198,51,100,0]),24],[new t([203,0,113,0]),24],[new t([240,0,0,0]),4]]},t.prototype.kind=function(){return\"ipv4\"},t.prototype.match=function(e,n){let r;if(n===void 0&&(r=e,e=r[0],n=r[1]),e.kind()!==\"ipv4\")throw new Error(\"ipaddr: cannot match ipv4 address with non-ipv4 one\");return m(this.octets,e.octets,8,n)},t.prototype.prefixLengthFromSubnetMask=function(){let e=0,n=!1;const r={0:8,128:7,192:6,224:5,240:4,248:3,252:2,254:1,255:0};let i,o,f;for(i=3;i>=0;i-=1)if(o=this.octets[i],o in r){if(f=r[o],n&&f!==0)return null;f!==8&&(n=!0),e+=f}else return null;return 32-e},t.prototype.range=function(){return s.subnetMatch(this,this.SpecialRanges)},t.prototype.toByteArray=function(){return this.octets.slice(0)},t.prototype.toIPv4MappedAddress=function(){return s.IPv6.parse(`::ffff:${this.toString()}`)},t.prototype.toNormalizedString=function(){return this.toString()},t.prototype.toString=function(){return this.octets.join(\".\")},t}(),s.IPv4.broadcastAddressFromCIDR=function(t){try{const e=this.parseCIDR(t),n=e[0].toByteArray(),r=this.subnetMaskFromPrefixLength(e[1]).toByteArray(),i=[];let o=0;for(;o<4;)i.push(parseInt(n[o],10)|parseInt(r[o],10)^255),o++;return new this(i)}catch(e){throw new Error(\"ipaddr: the address does not have IPv4 CIDR format\")}},s.IPv4.isIPv4=function(t){return this.parser(t)!==null},s.IPv4.isValid=function(t){try{return new this(this.parser(t)),!0}catch(e){return!1}},s.IPv4.isValidFourPartDecimal=function(t){return!!(s.IPv4.isValid(t)&&t.match(/^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){3}$/))},s.IPv4.networkAddressFromCIDR=function(t){let e,n,r,i,o;try{for(e=this.parseCIDR(t),r=e[0].toByteArray(),o=this.subnetMaskFromPrefixLength(e[1]).toByteArray(),i=[],n=0;n<4;)i.push(parseInt(r[n],10)&parseInt(o[n],10)),n++;return new this(i)}catch(f){throw new Error(\"ipaddr: the address does not have IPv4 CIDR format\")}},s.IPv4.parse=function(t){const e=this.parser(t);if(e===null)throw new Error(\"ipaddr: string is not formatted like an IPv4 Address\");return new this(e)},s.IPv4.parseCIDR=function(t){let e;if(e=t.match(/^(.+)\\/(\\d+)$/)){const n=parseInt(e[2]);if(n>=0&&n<=32){const r=[this.parse(e[1]),n];return Object.defineProperty(r,\"toString\",{value:function(){return this.join(\"/\")}}),r}}throw new Error(\"ipaddr: string is not formatted like an IPv4 CIDR range\")},s.IPv4.parser=function(t){let e,n,r;if(e=t.match(u.fourOctet))return function(){const i=e.slice(1,6),o=[];for(let f=0;f<i.length;f++)n=i[f],o.push(I(n));return o}();if(e=t.match(u.longValue)){if(r=I(e[1]),r>4294967295||r<0)throw new Error(\"ipaddr: address outside defined range\");return function(){const i=[];let o;for(o=0;o<=24;o+=8)i.push(r>>o&255);return i}().reverse()}else return(e=t.match(u.twoOctet))?function(){const i=e.slice(1,4),o=[];if(r=I(i[1]),r>16777215||r<0)throw new Error(\"ipaddr: address outside defined range\");return o.push(I(i[0])),o.push(r>>16&255),o.push(r>>8&255),o.push(r&255),o}():(e=t.match(u.threeOctet))?function(){const i=e.slice(1,5),o=[];if(r=I(i[2]),r>65535||r<0)throw new Error(\"ipaddr: address outside defined range\");return o.push(I(i[0])),o.push(I(i[1])),o.push(r>>8&255),o.push(r&255),o}():null},s.IPv4.subnetMaskFromPrefixLength=function(t){if(t=parseInt(t),t<0||t>32)throw new Error(\"ipaddr: invalid IPv4 prefix length\");const e=[0,0,0,0];let n=0;const r=Math.floor(t/8);for(;n<r;)e[n]=255,n++;return r<4&&(e[r]=Math.pow(2,t%8)-1<<8-t%8),new this(e)},s.IPv6=function(){function t(e,n){let r,i;if(e.length===16)for(this.parts=[],r=0;r<=14;r+=2)this.parts.push(e[r]<<8|e[r+1]);else if(e.length===8)this.parts=e;else throw new Error(\"ipaddr: ipv6 part count should be 8 or 16\");for(r=0;r<this.parts.length;r++)if(i=this.parts[r],!(0<=i&&i<=65535))throw new Error(\"ipaddr: ipv6 part should fit in 16 bits\");n&&(this.zoneId=n)}return t.prototype.SpecialRanges={unspecified:[new t([0,0,0,0,0,0,0,0]),128],linkLocal:[new t([65152,0,0,0,0,0,0,0]),10],multicast:[new t([65280,0,0,0,0,0,0,0]),8],loopback:[new t([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new t([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new t([0,0,0,0,0,65535,0,0]),96],rfc6145:[new t([0,0,0,0,65535,0,0,0]),96],rfc6052:[new t([100,65435,0,0,0,0,0,0]),96],\"6to4\":[new t([8194,0,0,0,0,0,0,0]),16],teredo:[new t([8193,0,0,0,0,0,0,0]),32],reserved:[[new t([8193,3512,0,0,0,0,0,0]),32]],benchmarking:[new t([8193,2,0,0,0,0,0,0]),48],amt:[new t([8193,3,0,0,0,0,0,0]),32],as112v6:[new t([8193,4,274,0,0,0,0,0]),48],deprecated:[new t([8193,16,0,0,0,0,0,0]),28],orchid2:[new t([8193,32,0,0,0,0,0,0]),28]},t.prototype.isIPv4MappedAddress=function(){return this.range()===\"ipv4Mapped\"},t.prototype.kind=function(){return\"ipv6\"},t.prototype.match=function(e,n){let r;if(n===void 0&&(r=e,e=r[0],n=r[1]),e.kind()!==\"ipv6\")throw new Error(\"ipaddr: cannot match ipv6 address with non-ipv6 one\");return m(this.parts,e.parts,16,n)},t.prototype.prefixLengthFromSubnetMask=function(){let e=0,n=!1;const r={0:16,32768:15,49152:14,57344:13,61440:12,63488:11,64512:10,65024:9,65280:8,65408:7,65472:6,65504:5,65520:4,65528:3,65532:2,65534:1,65535:0};let i,o;for(let f=7;f>=0;f-=1)if(i=this.parts[f],i in r){if(o=r[i],n&&o!==0)return null;o!==16&&(n=!0),e+=o}else return null;return 128-e},t.prototype.range=function(){return s.subnetMatch(this,this.SpecialRanges)},t.prototype.toByteArray=function(){let e;const n=[],r=this.parts;for(let i=0;i<r.length;i++)e=r[i],n.push(e>>8),n.push(e&255);return n},t.prototype.toFixedLengthString=function(){const e=function(){const r=[];for(let i=0;i<this.parts.length;i++)r.push(E(this.parts[i].toString(16),4));return r}.call(this).join(\":\");let n=\"\";return this.zoneId&&(n=`%${this.zoneId}`),e+n},t.prototype.toIPv4Address=function(){if(!this.isIPv4MappedAddress())throw new Error(\"ipaddr: trying to convert a generic ipv6 address to ipv4\");const e=this.parts.slice(-2),n=e[0],r=e[1];return new s.IPv4([n>>8,n&255,r>>8,r&255])},t.prototype.toNormalizedString=function(){const e=function(){const r=[];for(let i=0;i<this.parts.length;i++)r.push(this.parts[i].toString(16));return r}.call(this).join(\":\");let n=\"\";return this.zoneId&&(n=`%${this.zoneId}`),e+n},t.prototype.toRFC5952String=function(){const e=/((^|:)(0(:|$)){2,})/g,n=this.toNormalizedString();let r=0,i=-1,o;for(;o=e.exec(n);)o[0].length>i&&(r=o.index,i=o[0].length);return i<0?n:`${n.substring(0,r)}::${n.substring(r+i)}`},t.prototype.toString=function(){return this.toRFC5952String()},t}(),s.IPv6.broadcastAddressFromCIDR=function(t){try{const e=this.parseCIDR(t),n=e[0].toByteArray(),r=this.subnetMaskFromPrefixLength(e[1]).toByteArray(),i=[];let o=0;for(;o<16;)i.push(parseInt(n[o],10)|parseInt(r[o],10)^255),o++;return new this(i)}catch(e){throw new Error(`ipaddr: the address does not have IPv6 CIDR format (${e})`)}},s.IPv6.isIPv6=function(t){return this.parser(t)!==null},s.IPv6.isValid=function(t){if(typeof t==\"string\"&&t.indexOf(\":\")===-1)return!1;try{const e=this.parser(t);return new this(e.parts,e.zoneId),!0}catch(e){return!1}},s.IPv6.networkAddressFromCIDR=function(t){let e,n,r,i,o;try{for(e=this.parseCIDR(t),r=e[0].toByteArray(),o=this.subnetMaskFromPrefixLength(e[1]).toByteArray(),i=[],n=0;n<16;)i.push(parseInt(r[n],10)&parseInt(o[n],10)),n++;return new this(i)}catch(f){throw new Error(`ipaddr: the address does not have IPv6 CIDR format (${f})`)}},s.IPv6.parse=function(t){const e=this.parser(t);if(e.parts===null)throw new Error(\"ipaddr: string is not formatted like an IPv6 Address\");return new this(e.parts,e.zoneId)},s.IPv6.parseCIDR=function(t){let e,n,r;if((n=t.match(/^(.+)\\/(\\d+)$/))&&(e=parseInt(n[2]),e>=0&&e<=128))return r=[this.parse(n[1]),e],Object.defineProperty(r,\"toString\",{value:function(){return this.join(\"/\")}}),r;throw new Error(\"ipaddr: string is not formatted like an IPv6 CIDR range\")},s.IPv6.parser=function(t){let e,n,r,i,o,f;if(r=t.match(v.deprecatedTransitional))return this.parser(`::ffff:${r[1]}`);if(v.native.test(t))return y(t,8);if((r=t.match(v.transitional))&&(f=r[6]||\"\",e=y(r[1].slice(0,-1)+f,6),e.parts)){for(o=[parseInt(r[2]),parseInt(r[3]),parseInt(r[4]),parseInt(r[5])],n=0;n<o.length;n++)if(i=o[n],!(0<=i&&i<=255))return null;return e.parts.push(o[0]<<8|o[1]),e.parts.push(o[2]<<8|o[3]),{parts:e.parts,zoneId:e.zoneId}}return null},s.IPv6.subnetMaskFromPrefixLength=function(t){if(t=parseInt(t),t<0||t>128)throw new Error(\"ipaddr: invalid IPv6 prefix length\");const e=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];let n=0;const r=Math.floor(t/8);for(;n<r;)e[n]=255,n++;return r<16&&(e[r]=Math.pow(2,t%8)-1<<8-t%8),new this(e)},s.fromByteArray=function(t){const e=t.length;if(e===4)return new s.IPv4(t);if(e===16)return new s.IPv6(t);throw new Error(\"ipaddr: the binary input is neither an IPv6 nor IPv4 address\")},s.isValid=function(t){return s.IPv6.isValid(t)||s.IPv4.isValid(t)},s.parse=function(t){if(s.IPv6.isValid(t))return s.IPv6.parse(t);if(s.IPv4.isValid(t))return s.IPv4.parse(t);throw new Error(\"ipaddr: the address has neither IPv6 nor IPv4 format\")},s.parseCIDR=function(t){try{return s.IPv6.parseCIDR(t)}catch(e){try{return s.IPv4.parseCIDR(t)}catch(n){throw new Error(\"ipaddr: the address has neither IPv6 nor IPv4 CIDR format\")}}},s.process=function(t){const e=this.parse(t);return e.kind()===\"ipv6\"&&e.isIPv4MappedAddress()?e.toIPv4Address():e},s.subnetMatch=function(t,e,n){let r,i,o,f;n==null&&(n=\"unicast\");for(i in e)if(Object.prototype.hasOwnProperty.call(e,i)){for(o=e[i],o[0]&&!(o[0]instanceof Array)&&(o=[o]),r=0;r<o.length;r++)if(f=o[r],t.kind()===f[0].kind()&&t.match.apply(t,f))return i}return n},c.exports?c.exports=s:p.ipaddr=s})(M)})(k);var x=k.exports;const C=c=>x.isValid(c),h=c=>{const p=x.IPv4.parse(c).toByteArray();return p[0]<<24|p[1]<<16|p[2]<<8|p[3]},R=c=>x.fromByteArray([c>>24&255,c>>16&255,c>>8&255,c&255]).toString(),A=c=>{if(!x.IPv4.isIPv4(c))return!1;let p=0,a=h(c);for(let u=31;u>=0&&(a&1<<u)!=0;u--)p=p+(1<<u);return(~p&a)==0},S=(c,p,a,u)=>{let l=h(c)&h(p),d=h(a),w=h(u),v=~h(p);return d<w&&d>l+1&&w<l+v},O=(c,p)=>{let a=h(p),u=h(c)&a,l=~a,d;return l>=105?(d=u|l-5,u=u|100):l>=3?(d=u|l-1,u=u|2):(u=u|1,d=u),[R(u),R(d)]};var z={isValidMask:A,isValidIP:C,isValidMaskRange:S,calcMaskRange:O};export{M as c,z as i};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.6f7d3090.js",
    "content": "var g=Object.defineProperty;var y=Object.getOwnPropertySymbols;var w=Object.prototype.hasOwnProperty,A=Object.prototype.propertyIsEnumerable;var C=(o,u,s)=>u in o?g(o,u,{enumerable:!0,configurable:!0,writable:!0,value:s}):o[u]=s,k=(o,u)=>{for(var s in u||(u={}))w.call(u,s)&&C(o,s,u[s]);if(y)for(var s of y(u))A.call(u,s)&&C(o,s,u[s]);return o};var b=(o,u,s)=>new Promise((i,t)=>{var p=d=>{try{c(s.next(d))}catch(l){t(l)}},m=d=>{try{c(s.throw(d))}catch(l){t(l)}},c=d=>d.done?i(d.value):Promise.resolve(d.value).then(p,m);c((s=s.apply(o,u)).next())});import{d as T,s as E,j as U,v as q,o as _,c as f,a as e,x as r,A as D,F as V,y as P,z as x,m as B,l as G,B as H,C as M,T as F}from\"./index.js?v=5b4be379\";import{i as v}from\"./chunk.6d3585bb.js\";const L=[\"onSubmit\"],N=e(\"div\",{class:\"label-name\"},[e(\"span\",null,\"\\u5185\\u7F51\\u5730\\u5740\")],-1),R={class:\"label-value\"},j=e(\"div\",{class:\"label-name\"},[e(\"span\",null,\"\\u5B50\\u7F51\\u63A9\\u7801\")],-1),z={class:\"label-value\"},O=e(\"div\",{class:\"label-name\"},[e(\"span\",null,\"DHCP\\u670D\\u52A1\")],-1),$={class:\"label-value\"},J={class:\"label-flex\"},K=e(\"div\",{class:\"label-name\"},[e(\"span\",null,\"IP\\u6C60\\u8D77\\u59CB\\u5730\\u5740\")],-1),Q={class:\"label-value\"},W=e(\"div\",{class:\"label-name\"},[e(\"span\",null,\"IP\\u6C60\\u7ED3\\u675F\\u5730\\u5740\")],-1),X={class:\"label-value\"},Y={class:\"label-btns\"},Z=[\"disabled\"],ee={key:2,class:\"label-msg\"},ue=T({__name:\"index\",setup(o){return b(this,null,function*(){let u,s;const i=E(\"\"),t=U({lanIp:\"\",netMask:\"255.255.255.0\",enableDhcp:!1,dhcpStart:\"\",dhcpEnd:\"\"}),p=E(!1),m=E(!1),c=()=>b(this,null,function*(){p.value=!0;const l=yield M.Guide.GetLan.GET();if(l.data){const{result:a}=l.data;a&&(t.lanIp=a.lanIp,t.netMask=a.netMask,m.value=a.enableDhcp||!1,t.dhcpStart=a.dhcpStart,t.dhcpEnd=a.dhcpEnd,a.lanIp,location.hostname)}p.value=!1});[u,s]=q(()=>c()),yield u,s();const d=()=>b(this,null,function*(){const l=k({},t);if(!v.isValidIP(l.lanIp)){F.Error(\"IPv4\\u5730\\u5740\\u683C\\u5F0F\\u9519\\u8BEF\");return}if(!v.isValidMask(l.netMask)){F.Error(\"IPv4\\u5B50\\u7F51\\u63A9\\u7801\\u683C\\u5F0F\\u9519\\u8BEF\");return}if(l.enableDhcp&&!v.isValidIP(l.dhcpStart)||!v.isValidIP(l.dhcpEnd)||!v.isValidMaskRange(l.lanIp,l.netMask,l.dhcpStart,l.dhcpEnd)){F.Error(\"DHCP\\u7684IP\\u6C60\\u683C\\u5F0F\\u9519\\u8BEF\\u6216\\u8D85\\u51FA\\u5B50\\u7F51\\u8303\\u56F4\");return}const a=F.Loading(\"\\u6B63\\u5728\\u914D\\u7F6E,\\u8BF7\\u7A0D\\u7B49\\u2026\");let n=!1;try{const h=yield M.Guide.LanIp.POST(l);if(h.data){const{result:ae,success:S,error:I}=h.data;if(I){i.value=I;return}(S||0)==0&&(n=!0)}}catch(h){i.value=h}finally{a.Close()}n&&(i.value=`\\u66F4\\u65B0\\u6210\\u529F,\\u8BF7\\u8FDB\\u5165 ${l.lanIp} \\u8DEF\\u7531\\u5668\\u5730\\u5740`)});return(l,a)=>(_(),f(\"form\",{class:\"form-container\",onSubmit:H(d,[\"prevent\"])},[N,e(\"div\",R,[r(e(\"input\",{type:\"text\",placeholder:\"192.168.100.1\",\"onUpdate:modelValue\":a[0]||(a[0]=n=>t.lanIp=n),required:\"\"},null,512),[[D,t.lanIp,void 0,{trim:!0}]])]),j,e(\"div\",z,[r(e(\"input\",{type:\"text\",placeholder:\"255.255.255.0\",\"onUpdate:modelValue\":a[1]||(a[1]=n=>t.netMask=n),required:\"\"},null,512),[[D,t.netMask,void 0,{trim:!0}]])]),m.value?(_(),f(V,{key:0},[O,e(\"div\",$,[e(\"div\",J,[e(\"label\",null,[r(e(\"input\",{type:\"radio\",value:!1,\"onUpdate:modelValue\":a[2]||(a[2]=n=>t.enableDhcp=n)},null,512),[[P,t.enableDhcp]]),x(\"\\u4FDD\\u6301DHCP\")]),e(\"label\",null,[r(e(\"input\",{type:\"radio\",value:!0,\"onUpdate:modelValue\":a[3]||(a[3]=n=>t.enableDhcp=n)},null,512),[[P,t.enableDhcp]]),x(\"\\u4FEE\\u6539DHCP\")])])])],64)):B(\"\",!0),t.enableDhcp?(_(),f(V,{key:1},[K,e(\"div\",Q,[r(e(\"input\",{type:\"text\",placeholder:\"192.168.100.100\",\"onUpdate:modelValue\":a[4]||(a[4]=n=>t.dhcpStart=n),required:\"\"},null,512),[[D,t.dhcpStart,void 0,{trim:!0}]])]),W,e(\"div\",X,[r(e(\"input\",{type:\"text\",placeholder:\"192.168.100.100\",\"onUpdate:modelValue\":a[5]||(a[5]=n=>t.dhcpEnd=n),required:\"\"},null,512),[[D,t.dhcpEnd,void 0,{trim:!0}]])])],64)):B(\"\",!0),e(\"div\",Y,[e(\"button\",{class:\"sumbit\",disabled:p.value},\"\\u4FDD\\u5B58\",8,Z)]),i.value?(_(),f(\"div\",ee,[e(\"span\",null,G(i.value),1)])):B(\"\",!0)],40,L))})}});export{ue as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.7deee291.js",
    "content": "var f=(n,u,c)=>new Promise((l,o)=>{var d=s=>{try{p(c.next(s))}catch(e){o(e)}},F=s=>{try{p(c.throw(s))}catch(e){o(e)}},p=s=>s.done?l(s.value):Promise.resolve(s.value).then(d,F);p((c=c.apply(n,u)).next())});import{d as $,M as b,s as M,r as N,o as h,c as y,a as t,b as S,_ as A,T as v,C as z,p as g,q as x,l as O,g as q,n as G,j as H,v as W,x as C,A as T,z as U,D as V,e as E,w as L,N as R,S as j}from\"./index.js?v=5b4be379\";const P=n=>(g(\"data-v-7b2637d8\"),n=n(),x(),n),J=P(()=>t(\"div\",{class:\"f\"},[t(\"div\",{class:\"titleMain\"},\"\\u4E92\\u8054\\u7F51\"),t(\"div\",{class:\"titleSub\"},\"\\u8054\\u673A\\u7C7B\\u578B\")],-1)),K={class:\"r\"},Q=P(()=>t(\"div\",{class:\"title\"},\" \\u8BF7\\u5728\\u4EE5\\u4E0B\\u9009\\u9879\\u4E2D\\u9009\\u62E9\\u7F51\\u7EDC\\u8FDE\\u63A5\\u7C7B\\u578B\\u3002\\u82E5\\u60A8\\u4E0D\\u77E5\\u9053\\u7F51\\u7EDC\\u8FDE\\u63A5\\u7C7B\\u578B\\uFF0C\\u8BF7\\u54A8\\u8BE2\\u60A8\\u7684\\u7F51\\u7EDC\\u670D\\u52A1\\u4F9B\\u5E94\\u5546\\uFF08ISP\\uFF09\\u3002 \",-1)),X={class:\"selector-container\"},Y=P(()=>t(\"div\",{class:\"select-bar\"},\" \\u81EA\\u52A8\\u8054\\u7F51\\uFF08\\u52A8\\u6001IP\\uFF09 \",-1)),Z={class:\"narrow-container\"},tt=P(()=>t(\"div\",{class:\"select-bar\"},\" \\u62E8\\u53F7\\u8054\\u7F51\\uFF08PPPoE\\uFF09 \",-1)),et={class:\"narrow-container\"},st={class:\"btns\"},at=$({__name:\"router\",props:{setup:{type:String,required:!0}},emits:[\"update:setup\"],setup(n,{emit:u}){const c=b(),l=()=>{u(\"update:setup\",\"wizard\")},o=()=>{u(\"update:setup\",\"router-pppoe\")},d=M(!1),F=()=>f(this,null,function*(){const s={wanProto:\"dhcp\",dnsProto:\"auto\"};d.value=!0;const e=v.Loading(\"\\u4FDD\\u5B58\\u4E2D...\");try{const a=yield z.Guide.ClientModel.POST(s);if(a!=null&&a.data){const{success:_,error:D}=a==null?void 0:a.data;if(D)throw D;(_==null||_==0)&&(yield p())}}catch(a){v.Error(`${a}`)}finally{d.value=!1,e.Close()}}),p=()=>f(this,null,function*(){const s=v.Loading(\"\\u914D\\u7F6E\\u4E2D...\");try{const e=yield z.Istorex.Updata.POST({model:\"router\"});if(e.data){const{success:a,error:_}=e.data;if(_)throw _;a===0&&c.push({path:\"/router\"})}}catch(e){v.Error(`${e}`)}finally{s.Close()}});return(s,e)=>{const a=N(\"icon-right\");return h(),y(\"form\",null,[J,t(\"div\",K,[Q,t(\"div\",X,[t(\"div\",{class:\"selector-container_item\",onClick:e[0]||(e[0]=_=>F())},[Y,t(\"div\",Z,[S(a)])]),t(\"div\",{class:\"selector-container_item\",onClick:e[1]||(e[1]=_=>o())},[tt,t(\"div\",et,[S(a)])])]),t(\"div\",st,[t(\"button\",{class:\"back\",type:\"button\",onClick:e[2]||(e[2]=_=>l())},\"\\u4E0A\\u4E00\\u6B65\"),t(\"button\",{class:\"next\",type:\"button\",onClick:e[3]||(e[3]=_=>p())},\" \\u4E0D\\u914D\\u7F6E\\uFF0C\\u8FDB\\u5165\\u4E3B\\u754C\\u9762 \")])])])}}});var ot=A(at,[[\"__scopeId\",\"data-v-7b2637d8\"]]);const ut={},nt={class:\"main\"};function lt(n,u){return h(),y(\"div\",nt)}var it=A(ut,[[\"render\",lt]]);const r=n=>(g(\"data-v-041c9ebc\"),n=n(),x(),n),dt={id:\"wizard\"},rt={class:\"wizard_title\"},ct={class:\"wizard_body\"},pt={class:\"wizard-item_icon\"},_t={t:\"1654871923674\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"1414\",width:\"128\",height:\"128\",style:{padding:\"5px\"}},ht=r(()=>t(\"path\",{d:\"M247.466667 76.8h25.6l51.2 307.2h-25.6L247.466667 76.8zM762.453333 76.8h25.6L742.4 385.706667h-25.6L762.453333 76.8z\",fill:\"#96CAFF\",\"p-id\":\"1415\"},null,-1)),vt=r(()=>t(\"path\",{d:\"M275.2 409.6H324.266667L256.938667 51.2H230.4zM230.4 25.6h26.538667a25.6 25.6 0 0 1 25.173333 20.906667l67.242667 358.4A25.6 25.6 0 0 1 324.266667 435.2h-49.066667a25.6 25.6 0 0 1-25.6-22.442667L204.8 54.357333A25.6 25.6 0 0 1 227.242667 25.6zM785.066667 51.2l-44.885334 358.4H691.2l67.242667-358.4z m0-25.6h-26.624a25.6 25.6 0 0 0-25.173334 20.906667l-67.157333 358.4A25.6 25.6 0 0 0 691.2 435.2h48.981333a25.6 25.6 0 0 0 25.6-22.442667l44.885334-358.4A25.6 25.6 0 0 0 788.138667 25.6z\",fill:\"#175AA7\",\"p-id\":\"1416\"},null,-1)),ft=r(()=>t(\"path\",{d:\"M59.733333 665.6h930.133334a8.533333 8.533333 0 0 1 8.533333 8.533333v162.133334a8.533333 8.533333 0 0 1-8.533333 8.533333H59.733333a8.533333 8.533333 0 0 1-8.533333-8.533333V674.133333a8.533333 8.533333 0 0 1 8.533333-8.533333z\",fill:\"#96CAFF\",\"p-id\":\"1417\"},null,-1)),Ft=r(()=>t(\"path\",{d:\"M460.8 768h25.6v-25.6h-25.6z m-25.6-51.2h76.8v76.8h-76.8zM716.8 768h25.6v-25.6h-25.6z m-25.6-51.2h76.8v76.8h-76.8zM588.8 768h25.6v-25.6h-25.6z m-25.6-51.2h76.8v76.8h-76.8zM844.8 768h25.6v-25.6h-25.6z m-25.6-51.2h76.8v76.8h-76.8z\",fill:\"#175AA7\",\"p-id\":\"1418\"},null,-1)),mt=r(()=>t(\"path\",{d:\"M153.6 844.8h68.693333l-25.6 76.8H179.2l-25.6-76.8z\",fill:\"#96CAFF\",\"p-id\":\"1419\"},null,-1)),wt=r(()=>t(\"path\",{d:\"M203.434667 844.8h8.533333l12.629333 17.493333-2.730666 8.106667h-26.965334z m-74.069334 0h-8.533333l-12.629333 17.493333 2.730666 8.106667h26.965334z m17.066667 51.2h39.936l8.533333-25.6h-57.002666zM102.4 844.8h128l-25.6 76.8h-76.8z\",fill:\"#175AA7\",\"p-id\":\"1420\"},null,-1)),zt=r(()=>t(\"path\",{d:\"M844.8 844.8h68.693333l-25.6 76.8H870.4l-25.6-76.8z\",fill:\"#96CAFF\",\"p-id\":\"1421\"},null,-1)),Dt=r(()=>t(\"path\",{d:\"M913.066667 870.4l2.730666-8.106667-12.629333-17.493333h-8.533333l-8.533334 25.6z m-92.501334-25.6h-8.533333l-12.629333 17.493333 2.730666 8.106667h26.965334z m17.066667 51.2h39.936l8.533333-25.6h-57.002666zM793.6 844.8h128l-25.6 76.8h-76.8zM204.8 768h25.6v25.6h-25.6zM281.6 768h25.6v25.6h-25.6zM128 768h25.6v25.6h-25.6zM358.4 768h25.6v25.6h-25.6zM204.8 716.8h25.6v25.6h-25.6zM281.6 716.8h25.6v25.6h-25.6zM128 716.8h25.6v25.6h-25.6zM358.4 716.8h25.6v25.6h-25.6z\",fill:\"#175AA7\",\"p-id\":\"1422\"},null,-1)),yt=r(()=>t(\"path\",{d:\"M69.12 640l176.128-249.941333A76.8 76.8 0 0 1 307.2 358.4h441.6A76.8 76.8 0 0 1 810.666667 390.058667L986.026667 640\",fill:\"#B3D9FF\",\"p-id\":\"1423\"},null,-1)),Et=r(()=>t(\"path\",{d:\"M742.4 358.4l187.050667 256.597333h57.941333L805.290667 358.4H742.4z\",fill:\"#96CAFF\",\"p-id\":\"1424\"},null,-1)),At=r(()=>t(\"path\",{d:\"M51.2 640a25.6 25.6 0 0 0-25.6 25.6v153.6a25.6 25.6 0 0 0 25.6 25.6h921.6a25.6 25.6 0 0 0 25.6-25.6V665.6a25.6 25.6 0 0 0-25.6-25.6z m0-25.6h921.6a51.2 51.2 0 0 1 51.2 51.2v153.6a51.2 51.2 0 0 1-51.2 51.2H51.2a51.2 51.2 0 0 1-51.2-51.2V665.6a51.2 51.2 0 0 1 51.2-51.2z\",fill:\"#175AA7\",\"p-id\":\"1425\"},null,-1)),$t=r(()=>t(\"path\",{d:\"M167.936 451.84L186.197333 426.666667l15.786667-21.674667A51.2 51.2 0 0 1 243.370667 384h536.149333a51.2 51.2 0 0 1 41.386667 21.077333L985.429333 640h31.232L841.642667 390.058667A76.8 76.8 0 0 0 779.52 358.4H243.370667a76.8 76.8 0 0 0-62.122667 31.658667l-34.133333 47.104L5.12 640h31.232z\",fill:\"#175AA7\",\"p-id\":\"1426\"},null,-1)),bt=[ht,vt,ft,Ft,mt,wt,zt,Dt,yt,Et,At,$t],Mt=r(()=>t(\"div\",{class:\"wizard-item_name\"},\" \\u8DEF\\u7531\\u6A21\\u5F0F \",-1)),Bt=r(()=>t(\"div\",{class:\"wizard-item_icon\"},[t(\"svg\",{t:\"1658387243046\",class:\"icon\",viewBox:\"0 0 1137 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"40015\",width:\"128\",height:\"128\"},[t(\"path\",{d:\"M0.967111 0.967111h1135.445333V244.622222H0.967111z\",fill:\"#5B8FD9\",\"p-id\":\"40016\"}),t(\"path\",{d:\"M606.037333 122.766222a47.160889 47.160889 0 1 0 94.264889 0 47.160889 47.160889 0 0 0-94.264889 0z\",fill:\"#FE6D68\",\"p-id\":\"40017\"}),t(\"path\",{d:\"M771.015111 122.766222a47.160889 47.160889 0 1 0 94.321778 0 47.160889 47.160889 0 0 0-94.321778 0z\",fill:\"#F9D65D\",\"p-id\":\"40018\"}),t(\"path\",{d:\"M932.124444 122.766222a47.160889 47.160889 0 1 0 94.264889 0 47.160889 47.160889 0 0 0-94.264889 0z\",fill:\"#68D279\",\"p-id\":\"40019\"}),t(\"path\",{d:\"M0.967111 370.289778h1135.445333v243.598222H0.967111z\",fill:\"#5B8FD9\",\"p-id\":\"40020\"}),t(\"path\",{d:\"M606.037333 488.106667a47.160889 47.160889 0 1 0 94.264889 0 47.160889 47.160889 0 0 0-94.264889 0z\",fill:\"#FE6D68\",\"p-id\":\"40021\"}),t(\"path\",{d:\"M771.015111 488.106667a47.160889 47.160889 0 1 0 94.321778 0 47.160889 47.160889 0 0 0-94.321778 0z\",fill:\"#F9D65D\",\"p-id\":\"40022\"}),t(\"path\",{d:\"M932.124444 488.106667a47.160889 47.160889 0 1 0 94.264889 0 47.160889 47.160889 0 0 0-94.264889 0z\",fill:\"#68D279\",\"p-id\":\"40023\"}),t(\"path\",{d:\"M0.967111 735.687111h1135.445333v243.541333H0.967111z\",fill:\"#5B8FD9\",\"p-id\":\"40024\"}),t(\"path\",{d:\"M606.037333 857.486222a47.160889 47.160889 0 1 0 94.264889 0 47.160889 47.160889 0 0 0-94.264889 0z\",fill:\"#FE6D68\",\"p-id\":\"40025\"}),t(\"path\",{d:\"M771.015111 857.486222a47.160889 47.160889 0 1 0 94.321778 0 47.160889 47.160889 0 0 0-94.321778 0z\",fill:\"#F9D65D\",\"p-id\":\"40026\"}),t(\"path\",{d:\"M932.124444 857.486222a47.160889 47.160889 0 1 0 94.264889 0 47.160889 47.160889 0 0 0-94.264889 0z\",fill:\"#68D279\",\"p-id\":\"40027\"})])],-1)),Ct=r(()=>t(\"div\",{class:\"wizard-item_name\"},\" NAS\\u6A21\\u5F0F \",-1)),gt=[Bt,Ct],xt=$({__name:\"wizard\",props:{setup:{type:String,required:!0}},emits:[\"update:setup\"],setup(n,{emit:u}){const c=M(!1),l=b(),o=()=>f(this,null,function*(){c.value||(yield F(\"router\"))}),d=()=>f(this,null,function*(){c.value||(yield F(\"next-nas\"))}),F=p=>f(this,null,function*(){c.value=!0;try{const s=yield z.Istorex.Updata.POST({model:p});if(s.data){const{success:e,error:a}=s.data;if(a)throw a;e===0&&l.push({path:`/${p}`})}}catch(s){v.Error(`${s}`)}finally{c.value=!1}});return(p,s)=>(h(),y(\"div\",dt,[t(\"h1\",rt,O(q(G).HostName)+\" \\u5411\\u5BFC\\u6A21\\u5F0F\",1),t(\"div\",ct,[t(\"div\",{class:\"wizard-item\",onClick:s[0]||(s[0]=e=>o())},[t(\"div\",pt,[(h(),y(\"svg\",_t,bt))]),Mt]),t(\"div\",{class:\"wizard-item\",onClick:s[1]||(s[1]=e=>d())},gt)])]))}});var Pt=A(xt,[[\"__scopeId\",\"data-v-041c9ebc\"]]);const k=n=>(g(\"data-v-72afa128\"),n=n(),x(),n),St=k(()=>t(\"div\",{class:\"title\"},[t(\"span\",null,\"PPPoE \\u4E0A\\u7F51\"),U(\" \\u8F93\\u5165\\u7528\\u6237\\u8D26\\u53F7\\u548C\\u5BC6\\u7801 \")],-1)),kt={class:\"form-item\"},It=k(()=>t(\"span\",{class:\"name\"},\" \\u7528\\u6237\\u540D \",-1)),Tt={class:\"form-item\"},Vt=k(()=>t(\"span\",{class:\"name\"},\"\\u5BC6\\u7801\",-1)),Lt={class:\"btns\"},Ht=[\"disabled\"],Ut=[\"disabled\"],Nt=$({__name:\"router-pppoe\",props:{setup:{type:String,required:!0}},emits:[\"update:setup\"],setup(c,l){return f(this,arguments,function*(n,{emit:u}){let o,d;const F=b(),p=()=>{u(\"update:setup\",\"router\")},s=H({account:\"\",password:\"\"}),e=M(!1),a=()=>f(this,null,function*(){e.value=!0;try{const m=yield z.Guide.Pppoe.GET(),{result:i}=m.data;i&&(s.account=i.account||\"\",s.password=i.password||\"\")}catch(m){}finally{}e.value=!1});[o,d]=W(()=>a()),yield o,d();const _=()=>f(this,null,function*(){if(s.account==\"\"){v.Warning(\"\\u8D26\\u53F7\\u4E0D\\u80FD\\u4E3A\\u7A7A\");return}if(s.password==\"\"){v.Warning(\"\\u5BC6\\u7801\\u4E0D\\u80FD\\u4E3A\\u7A7A\");return}e.value=!0;const m=v.Loading(\"\\u4FDD\\u5B58\\u4E2D...\");try{const i=yield z.Guide.Pppoe.POST({account:s.account,password:s.password});if(i.data){const{error:w,success:I}=i.data;if(w)throw w;(I==null||I==0)&&(yield D())}}catch(i){v.Error(`${i}`)}finally{e.value=!1,m.Close()}}),D=()=>f(this,null,function*(){e.value=!0;try{const m=yield z.Istorex.Updata.POST({model:\"router\"});if(m.data){const{success:i,error:w}=m.data;if(w)throw w;i===0&&F.push({path:\"/router\"})}}catch(m){v.Error(`${m}`)}finally{e.value=!1}});return(m,i)=>(h(),y(\"form\",null,[St,t(\"div\",kt,[It,t(\"label\",null,[C(t(\"input\",{type:\"text\",placeholder:\"\\u8BF7\\u8F93\\u5165\\u8D26\\u53F7\",\"onUpdate:modelValue\":i[0]||(i[0]=w=>s.account=w)},null,512),[[T,s.account,void 0,{trim:!0}]])])]),t(\"div\",Tt,[Vt,t(\"label\",null,[C(t(\"input\",{type:\"password\",placeholder:\"\\u8BF7\\u8F93\\u5165\\u5BC6\\u7801\",\"onUpdate:modelValue\":i[1]||(i[1]=w=>s.password=w)},null,512),[[T,s.password,void 0,{trim:!0}]])])]),t(\"div\",Lt,[t(\"button\",{class:\"back\",type:\"button\",disabled:e.value,onClick:i[2]||(i[2]=w=>p())},\"\\u4E0A\\u4E00\\u6B65\",8,Ht),t(\"button\",{class:\"next\",type:\"button\",disabled:e.value,onClick:_},\"\\u4FDD\\u5B58\\u5E94\\u7528\",8,Ut)])]))})}});var Ot=A(Nt,[[\"__scopeId\",\"data-v-72afa128\"]]);const B=n=>(g(\"data-v-56e86acc\"),n=n(),x(),n),qt=B(()=>t(\"div\",{class:\"title\"},[t(\"span\",null,\"DHCP\\u914D\\u7F6E\"),U(\" \\u81EA\\u52A8\\u8054\\u7F51 \")],-1)),Gt={class:\"form-item\"},Wt=B(()=>t(\"span\",{class:\"name\"},\" IP\\u5730\\u5740 \",-1)),Rt=B(()=>t(\"option\",{value:\"dhcp\"},\"\\u81EA\\u52A8\\u83B7\\u53D6\",-1)),jt=[Rt],Jt={class:\"form-item\"},Kt=B(()=>t(\"span\",{class:\"name\"},\" DNS \",-1)),Qt=B(()=>t(\"option\",{value:\"auto\"},\"\\u81EA\\u52A8\\u83B7\\u53D6\",-1)),Xt=[Qt],Yt={class:\"btns\"},Zt=[\"disabled\"],t6=[\"disabled\"],e6=$({__name:\"router-dhcp\",props:{setup:{type:String,required:!0}},emits:[\"update:setup\"],setup(n,{emit:u}){const c=b(),l=()=>{u(\"update:setup\",\"router\")},o=M(!1),d=H({wanProto:\"dhcp\",dnsProto:\"auto\"}),F=()=>f(this,null,function*(){const s={wanProto:d.wanProto,dnsProto:d.dnsProto};o.value=!0;const e=v.Loading(\"\\u4FDD\\u5B58\\u4E2D...\");try{const a=yield z.Guide.ClientModel.POST(s);if(a!=null&&a.data){const{success:_,error:D}=a==null?void 0:a.data;if(D)throw D;(_==null||_==0)&&(yield p())}}catch(a){v.Error(`${a}`)}finally{o.value=!1,e.Close()}}),p=()=>f(this,null,function*(){o.value=!0;try{const s=yield z.Istorex.Updata.POST({model:\"router\"});if(s.data){const{success:e,error:a}=s.data;if(a)throw a;e===0&&c.push({path:\"/router\"})}}catch(s){v.Error(`${s}`)}finally{o.value=!1}});return(s,e)=>(h(),y(\"form\",null,[qt,t(\"div\",Gt,[Wt,t(\"label\",null,[C(t(\"select\",{\"onUpdate:modelValue\":e[0]||(e[0]=a=>d.wanProto=a),disabled:\"\"},jt,512),[[V,d.wanProto]])])]),t(\"div\",Jt,[Kt,t(\"label\",null,[C(t(\"select\",{\"onUpdate:modelValue\":e[1]||(e[1]=a=>d.dnsProto=a),disabled:\"\"},Xt,512),[[V,d.dnsProto]])])]),t(\"div\",Yt,[t(\"button\",{class:\"back\",type:\"button\",disabled:o.value,onClick:e[2]||(e[2]=a=>l())},\"\\u4E0A\\u4E00\\u6B65\",8,Zt),t(\"button\",{class:\"next\",type:\"button\",disabled:o.value,onClick:F},\"\\u4FDD\\u5B58\\u5E94\\u7528\",8,t6)])]))}});var s6=A(e6,[[\"__scopeId\",\"data-v-56e86acc\"]]);const a6={id:\"main\"},o6=$({__name:\"index\",setup(n){b();const u=M(\"wizard\");return(c,l)=>(h(),y(\"div\",a6,[(h(),E(j,null,{default:L(()=>[S(R,{name:\"slide-top\"},{default:L(()=>[u.value==\"nas\"?(h(),E(it,{key:0,setup:u.value,\"onUpdate:setup\":l[0]||(l[0]=o=>u.value=o)},null,8,[\"setup\"])):u.value==\"router\"?(h(),E(ot,{key:1,setup:u.value,\"onUpdate:setup\":l[1]||(l[1]=o=>u.value=o)},null,8,[\"setup\"])):u.value==\"router-pppoe\"?(h(),E(Ot,{key:2,setup:u.value,\"onUpdate:setup\":l[2]||(l[2]=o=>u.value=o)},null,8,[\"setup\"])):u.value==\"router-dhcp\"?(h(),E(s6,{key:3,setup:u.value,\"onUpdate:setup\":l[3]||(l[3]=o=>u.value=o)},null,8,[\"setup\"])):(h(),E(Pt,{key:4,setup:u.value,\"onUpdate:setup\":l[4]||(l[4]=o=>u.value=o)},null,8,[\"setup\"]))]),_:1})]),_:1}))]))}});var l6=A(o6,[[\"__scopeId\",\"data-v-06e7b595\"]]);export{l6 as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.83d679c2.js",
    "content": "import{d as a,r as e,o as u,e as r,w as p,b as s}from\"./index.js?v=5b4be379\";const _=a({__name:\"index\",setup(c){const t=[{name:\"index\",title:\"\\u7F51\\u7EDC\\u914D\\u7F6E\",path:\"/router/network\"},{name:\"pppoe\",title:\"\\u62E8\\u53F7\\u8FDE\\u63A5\",path:\"/router/network/pppoe\"},{name:\"dhcp\",title:\"DHCP\\u8FDE\\u63A5\",path:\"/router/network/dhcp\"},{name:\"gateway\",title:\"\\u65C1\\u8DEF\\u7531\\u8FDE\\u63A5\",path:\"/router/network/gateway\"},{name:\"intranet\",title:\"\\u5185\\u7F51\\u914D\\u7F6E\",path:\"/router/network/intranet\"},{name:\"dns\",title:\"DNS\\u914D\\u7F6E\",path:\"/router/network/dns\"}];return(i,l)=>{const o=e(\"router-loading\"),n=e(\"layout-page\");return u(),r(n,{menus:t},{default:p(()=>[s(o)]),_:1})}}});export{_ as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.8bf617a1.js",
    "content": "var d=(_,i,l)=>new Promise((t,e)=>{var n=o=>{try{c(l.next(o))}catch(u){e(u)}},p=o=>{try{c(l.throw(o))}catch(u){e(u)}},c=o=>o.done?t(o.value):Promise.resolve(o.value).then(n,p);c((l=l.apply(_,i)).next())});import{d as E,s as v,j as h,v as F,o as D,c as f,a,x as b,A as B,l as y,m as A,B as C,C as w,T as x}from\"./index.js?v=5b4be379\";const g=[\"onSubmit\"],S=a(\"div\",{class:\"label-info\"},\" \\u8BF7\\u786E\\u4FDD\\u60A8\\u5DF2\\u5C06\\u8DEF\\u7531 WAN \\u53E3\\u8FDE\\u63A5\\u5230\\u5149\\u732B \",-1),T=a(\"div\",{class:\"label-name\"},[a(\"span\",null,\"\\u8D26\\u53F7\")],-1),V={class:\"label-value\"},k=a(\"div\",{class:\"label-name\"},[a(\"span\",null,\"\\u5BC6\\u7801\")],-1),q={class:\"label-value\"},G={class:\"label-btns\"},N=[\"disabled\"],P={key:0,class:\"label-msg\"},j=E({__name:\"index\",setup(_){return d(this,null,function*(){let i,l;const t=v(\"\"),e=h({account:\"\",password:\"\"}),n=v(!1),p=v(!1),c=()=>d(this,null,function*(){n.value=!0;try{const u=yield w.Guide.Pppoe.GET(),{result:s}=u.data;s&&(e.account=s.account||\"\",e.password=s.password||\"\")}catch(u){t.value=u}finally{}n.value=!1,p.value=!0});[i,l]=F(()=>c()),yield i,l();const o=()=>d(this,null,function*(){if(e.account==\"\"){t.value=\"\\u8D26\\u53F7\\u4E0D\\u80FD\\u4E3A\\u7A7A\";return}if(e.password==\"\"){t.value=\"\\u5BC6\\u7801\\u4E0D\\u80FD\\u4E3A\\u7A7A\";return}n.value=!0;const u=x.Loading(\"\\u4FDD\\u5B58\\u4E2D...\");try{const s=yield w.Guide.Pppoe.POST({account:e.account,password:e.password});if(s.data){const{error:r,success:m}=s.data;r&&(t.value=r),(m==null||m==0)&&(t.value=\"\\u914D\\u7F6E\\u5B8C\\u6210\")}}catch(s){t.value=s}finally{}n.value=!1,u.Close()});return(u,s)=>(D(),f(\"form\",{class:\"form-container\",onSubmit:C(o,[\"prevent\"])},[S,T,a(\"div\",V,[b(a(\"input\",{type:\"text\",placeholder:\"\\u5BBD\\u5E26\\u8D26\\u53F7\",\"onUpdate:modelValue\":s[0]||(s[0]=r=>e.account=r),required:\"\"},null,512),[[B,e.account,void 0,{trim:!0}]])]),k,a(\"div\",q,[b(a(\"input\",{type:\"password\",placeholder:\"\\u5BBD\\u5E26\\u5BC6\\u7801\",\"onUpdate:modelValue\":s[1]||(s[1]=r=>e.password=r),required:\"\"},null,512),[[B,e.password,void 0,{trim:!0}]])]),a(\"div\",G,[a(\"button\",{class:\"sumbit\",disabled:n.value},\"\\u4FDD\\u5B58\",8,N)]),t.value?(D(),f(\"div\",P,[a(\"span\",null,y(t.value),1)])):A(\"\",!0)],40,g))})}});export{j as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.8f1ff823.js",
    "content": "var A=(w,h,c)=>new Promise((l,t)=>{var F=i=>{try{d(c.next(i))}catch(D){t(D)}},o=i=>{try{d(c.throw(i))}catch(D){t(D)}},d=i=>i.done?l(i.value):Promise.resolve(i.value).then(F,o);d((c=c.apply(w,h)).next())});import{d as N,s as M,j as f,v as x,o as m,c as v,a,x as r,D as S,F as b,A as _,m as I,E as V,l as U,B as T,C as P,T as q}from\"./index.js?v=5b4be379\";const G=[\"onSubmit\"],L=a(\"div\",{class:\"label-info\"},\" \\u8BF7\\u786E\\u4FDD\\u60A8\\u5DF2\\u5C06\\u8DEF\\u7531 WAN \\u53E3\\u8FDE\\u63A5\\u5230\\u4E0A\\u7EA7\\u8DEF\\u7531\\u5C40\\u57DF\\u7F51\\uFF08 LAN \\uFF09\\u63A5\\u53E3 \",-1),W=a(\"div\",{class:\"label-name\"},[a(\"span\",null,\"WAN \\u63A5\\u53E3\\u914D\\u7F6E\\u65B9\\u5F0F\")],-1),H={class:\"label-value\"},j=a(\"option\",{value:\"dhcp\"},\"\\u81EA\\u52A8\\u83B7\\u53D6 IP \\u5730\\u5740\\uFF08DHCP\\uFF09\",-1),O=a(\"option\",{value:\"static\"},\"\\u9759\\u6001 IP \\u5730\\u5740\",-1),z=[j,O],J=a(\"div\",{class:\"label-name\"},[a(\"span\",null,\"IP\\u5730\\u5740\")],-1),K={class:\"label-value\"},Q=a(\"div\",{class:\"label-name\"},[a(\"span\",null,\"\\u5B50\\u7F51\\u63A9\\u7801\")],-1),R={class:\"label-value\"},X=a(\"div\",{class:\"label-name\"},[a(\"span\",null,\"\\u7F51\\u5173\\u5730\\u5740\")],-1),Y={class:\"label-value\"},Z=a(\"div\",{class:\"label-name\"},[a(\"span\",null,\"DNS \\u914D\\u7F6E\\u65B9\\u5F0F\")],-1),$={class:\"label-value\"},tt=a(\"option\",{value:\"auto\"},\"\\u81EA\\u52A8\\u83B7\\u53D6\\uFF08DHCP\\uFF09\",-1),at=a(\"option\",{value:\"manual\"},\"\\u624B\\u52A8\\u914D\\u7F6E\",-1),st=[tt,at],et=a(\"div\",{class:\"label-name\"},[a(\"span\",null,\"DNS\\u670D\\u52A1\\u5668\")],-1),ut={class:\"label-value\"},nt=[\"onUpdate:modelValue\"],lt=a(\"div\",{class:\"label-name\"},[a(\"span\",null,\"DNS\\u670D\\u52A1\\u5668\")],-1),ot={class:\"label-value\"},dt=a(\"div\",{class:\"label-name\"},\" \\u5907\\u7528DNS\\u670D\\u52A1\\u5668 \",-1),it={class:\"label-value\"},rt={class:\"label-btns\"},ct=[\"disabled\"],pt={key:2,class:\"label-msg\"},_t=N({__name:\"index\",setup(w){return A(this,null,function*(){let h,c;const l=M(\"\"),t=f({wanProto:\"dhcp\",dnsProto:\"auto\",staticIp:\"\",subnetMask:\"\",manualDnsIp:[],gateway:\"\"}),F=f({staticIP:\"\"}),o=f({dnsAddr1:\"\",dnsAddr2:\"\"}),d=M(!1),i=()=>A(this,null,function*(){d.value=!0;try{const u=yield Promise.all([P.Guide.ClientModel.GET(),P.Network.Status.GET()]);if(u[0]){const e=u[0],{result:s,error:n}=e.data;if(s){const{wanProto:p,dnsProto:y,staticIp:k,subnetMask:E,gateway:g,manualDnsIp:B}=s;p&&(t.wanProto=p),y&&(t.dnsProto=y),k&&(t.staticIp=k),E&&(t.subnetMask=E),g&&(t.gateway=g),B&&(t.manualDnsIp=B||[])}n&&(l.value=n)}if(u[1]){const e=u[1],{result:s,error:n}=e.data;s&&s.ipv4addr&&(F.staticIP=s.ipv4addr),n&&(l.value=n)}}catch(u){l.value=u}d.value=!1});[h,c]=x(()=>i()),yield h,c();const D=u=>{u.target.value==\"static\"&&((t.staticIp==null||t.staticIp==\"\")&&(t.staticIp=F.staticIP),(t.subnetMask==null||t.subnetMask==\"\")&&(t.subnetMask=\"255.255.255.0\"))},C=()=>A(this,null,function*(){const u={};switch(t.wanProto){case\"dhcp\":break;case\"static\":u.staticIp=t.staticIp,u.subnetMask=t.subnetMask,u.gateway=t.gateway;break}switch(t.dnsProto){case\"auto\":break;case\"manual\":u.manualDnsIp=[],t.manualDnsIp!=null&&t.manualDnsIp.length>0?u.manualDnsIp=t.manualDnsIp:(u.manualDnsIp.push(o.dnsAddr1),o.dnsAddr2&&u.manualDnsIp.push(o.dnsAddr2));break}u.dnsProto=t.dnsProto,u.wanProto=t.wanProto,d.value=!0;const e=q.Loading(\"\\u4FDD\\u5B58\\u4E2D...\");try{const s=yield P.Guide.ClientModel.POST(u);if(s!=null&&s.data){const{success:n,error:p}=s==null?void 0:s.data;p&&(l.value=p),(n==null||n==0)&&(l.value=\"\\u914D\\u7F6E\\u5B8C\\u6210\")}}catch(s){l.value=s}d.value=!1,e.Close()});return(u,e)=>(m(),v(\"form\",{class:\"form-container\",onSubmit:T(C,[\"prevent\"])},[L,W,a(\"div\",H,[r(a(\"select\",{\"onUpdate:modelValue\":e[0]||(e[0]=s=>t.wanProto=s),onInput:D},z,544),[[S,t.wanProto]])]),t.wanProto==\"static\"?(m(),v(b,{key:0},[J,a(\"div\",K,[r(a(\"input\",{type:\"text\",placeholder:\"ip\\u5730\\u5740\",\"onUpdate:modelValue\":e[1]||(e[1]=s=>t.staticIp=s),required:\"\"},null,512),[[_,t.staticIp,void 0,{trim:!0}]])]),Q,a(\"div\",R,[r(a(\"input\",{type:\"text\",placeholder:\"\\u5B50\\u7F51\\u63A9\\u7801\\u5730\\u5740\",\"onUpdate:modelValue\":e[2]||(e[2]=s=>t.subnetMask=s),required:\"\"},null,512),[[_,t.subnetMask,void 0,{trim:!0}]])]),X,a(\"div\",Y,[r(a(\"input\",{type:\"text\",placeholder:\"\\u7F51\\u5173\\u5730\\u5740\",\"onUpdate:modelValue\":e[3]||(e[3]=s=>t.gateway=s),required:\"\"},null,512),[[_,t.gateway,void 0,{trim:!0}]])])],64)):I(\"\",!0),Z,a(\"div\",$,[r(a(\"select\",{\"onUpdate:modelValue\":e[4]||(e[4]=s=>t.dnsProto=s)},st,512),[[S,t.dnsProto]])]),t.dnsProto==\"manual\"?(m(),v(b,{key:1},[t.manualDnsIp!=null&&t.manualDnsIp.length>0?(m(!0),v(b,{key:0},V(t.manualDnsIp,(s,n)=>(m(),v(b,null,[et,a(\"div\",ut,[r(a(\"input\",{type:\"text\",placeholder:\"DNS\\u670D\\u52A1\\u5668\\u5730\\u5740\",\"onUpdate:modelValue\":p=>t.manualDnsIp[n]=p},null,8,nt),[[_,t.manualDnsIp[n],void 0,{trim:!0}]])])],64))),256)):(m(),v(b,{key:1},[lt,a(\"div\",ot,[r(a(\"input\",{type:\"text\",placeholder:\"\\u4E3BDNS\\u670D\\u52A1\\u5668\\u5730\\u5740\",\"onUpdate:modelValue\":e[5]||(e[5]=s=>o.dnsAddr1=s),required:\"\"},null,512),[[_,o.dnsAddr1,void 0,{trim:!0}]])]),dt,a(\"div\",it,[r(a(\"input\",{type:\"text\",placeholder:\"\\u5907\\u7528DNS\\u670D\\u52A1\\u5668\\u5730\\u5740\",\"onUpdate:modelValue\":e[6]||(e[6]=s=>o.dnsAddr2=s)},null,512),[[_,o.dnsAddr2,void 0,{trim:!0}]])])],64))],64)):I(\"\",!0),a(\"div\",rt,[a(\"button\",{class:\"sumbit\",disabled:d.value},\"\\u4FDD\\u5B58\",8,ct)]),l.value?(m(),v(\"div\",pt,[a(\"span\",null,U(l.value),1)])):I(\"\",!0)],40,G))})}});export{_t as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.a1bcc52b.js",
    "content": "var b=(i,u,t)=>new Promise((s,_)=>{var h=n=>{try{o(t.next(n))}catch(l){_(l)}},p=n=>{try{o(t.throw(n))}catch(l){_(l)}},o=n=>n.done?s(n.value):Promise.resolve(n.value).then(h,p);o((t=t.apply(i,u)).next())});import{d as F,I as Y,i as x,s as $,r as m,o as a,e as k,w as r,b as c,c as d,E as O,F as A,_ as y,O as X,C as M,T as G,Q as J,a as e,l as C,p as I,q as z,R as H,U,V as K,W as e1,g as L,j as q,m as E,H as t1,u as D,X as s1,k as n1,h as N,N as R,Y as a1,z as o1,n as i1,Z as l1,$ as T}from\"./index.js?v=5b4be379\";import{F as c1,a as u1,G as j}from\"./chunk.ffd7724b.js\";const Q=i=>(I(\"data-v-37664f80\"),i=i(),z(),i),d1=Q(()=>e(\"div\",{class:\"app-content\"},[e(\"div\",{class:\"app-icon\",style:{background:\"none\",padding:\"0\"}},[e(\"svg\",{class:\"icon\",viewBox:\"0 0 520 520\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},[e(\"title\",null,\"\\u5E94\\u7528\\u5546\\u5E97\"),e(\"g\",{id:\"\\u5E94\\u7528\\u5546\\u5E97\",stroke:\"none\",\"stroke-width\":\"1\",fill:\"none\",\"fill-rule\":\"evenodd\"},[e(\"path\",{d:\"M100.645161,0 L419.354839,0 C474.939626,0 520,45.0603736 520,100.645161 L520,419.354839 C520,474.939626 474.939626,520 419.354839,520 L100.645161,520 C45.0603736,520 0,474.939626 0,419.354839 L0,100.645161 C0,45.0603736 45.0603736,0 100.645161,0 Z\",id:\"Rectangle\",fill:\"#FFFFFF\"}),e(\"g\",{id:\"Group-4\",transform:\"translate(100.000000, 110.000000)\"},[e(\"path\",{d:\"M283.9875,300 L37.0125,300 C31.6725001,300 27,295.333333 27,290 L27,70 C27,64.6666668 31.6725001,60 37.0125,60 L283.9875,60 C289.3275,60 294,64.6666668 294,70 L294,290 C294,295.333333 289.995,300 283.9875,300 Z\",id:\"Path\",fill:\"#F4F4F4\",\"fill-rule\":\"nonzero\"}),e(\"path\",{d:\"M283.9875,300 L37.0125,300 C31.6725001,300 27,298.852778 27,297.541667 L27,243.458333 C27,242.147222 31.6725001,241 37.0125,241 L283.9875,241 C289.3275,241 294,242.147222 294,243.458333 L294,297.541667 C294,298.852778 289.995,300 283.9875,300 Z\",id:\"Path\",fill:\"#CACACA\",\"fill-rule\":\"nonzero\"}),e(\"g\",{id:\"Group\"},[e(\"g\",{id:\"Group-3\"},[e(\"path\",{d:\"M95,0 L80,135 C80,157.09139 62.09139,175 40,175 C17.90861,175 0,157.09139 0,135 L34,0 L95,0 Z\",id:\"Path\",fill:\"#C0FFEA\"}),e(\"path\",{d:\"M160,0 L160,135 C160,157.09139 142.09139,175 120,175 C97.90861,175 80,157.09139 80,135 C80,131.957009 80.3397951,128.993381 80.9835121,126.14499 L95,0 L160,0 Z\",id:\"Path\",fill:\"#01DE96\"}),e(\"path\",{d:\"M160,0 L227,0 L239.258077,127.292436 C239.744914,129.78649 240,132.363456 240,135 C240,157.09139 222.09139,175 200,175 C177.90861,175 160,157.09139 160,135 L160,135 L160,0 Z\",id:\"Combined-Shape\",fill:\"#C0FFEA\"}),e(\"path\",{d:\"M227,0 L288,0 L320,135 C320,157.09139 302.09139,175 280,175 C258.129524,175 240.35859,157.447771 240.005359,135.661473 L240,135 L227,0 Z\",id:\"Path\",fill:\"#01DE96\"})]),e(\"g\",{id:\"Group-2\",transform:\"translate(0.000000, 135.000000)\"},[e(\"path\",{d:\"M80,0 C80,22.09139 62.09139,40 40,40 C17.90861,40 0,22.09139 0,0 L80,0 Z\",id:\"Path\",fill:\"#B3F1DD\"}),e(\"path\",{d:\"M160,0 C160,22.09139 142.09139,40 120,40 C97.90861,40 80,22.09139 80,0 L160,0 Z\",id:\"Path\",fill:\"#02C485\"}),e(\"path\",{d:\"M240,0 C240,22.09139 222.09139,40 200,40 C178.129524,40 160.35859,22.4477713 160.005359,0.66147314 L160,0 L240,0 Z\",id:\"Path\",fill:\"#B3F1DD\"}),e(\"path\",{d:\"M320,0 C320,22.09139 302.09139,40 280,40 C258.129524,40 240.35859,22.4477713 240.005359,0.66147314 L240,0 L320,0 Z\",id:\"Path\",fill:\"#02C485\"})])])])])])]),e(\"div\",{class:\"app-name\"},\" \\u5E94\\u7528\\u5546\\u5E97 \")],-1)),_1=Q(()=>e(\"div\",{class:\"app-content\"},[e(\"div\",{class:\"app-icon\",style:{background:\"none\",padding:\"0\"}},[e(\"svg\",{t:\"1667208366992\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2669\",width:\"128\",height:\"128\"},[e(\"path\",{d:\"M0 0m0 0l1024 0q0 0 0 0l0 1024q0 0 0 0l-1024 0q0 0 0 0l0-1024q0 0 0 0Z\",fill:\"#E8EFF8\",\"p-id\":\"2670\"}),e(\"path\",{d:\"M141.637818 405.643636A23.272727 23.272727 0 0 0 160.814545 442.181818h350.487273a23.272727 23.272727 0 0 0 18.455273-37.469091L364.683636 190.161455a46.545455 46.545455 0 0 0-75.170909 1.88509l-147.874909 213.620364z\",fill:\"#69CB91\",\"p-id\":\"2671\"}),e(\"path\",{d:\"M337.454545 884.363636a174.545455 174.545455 0 1 0 0-349.090909 174.545455 174.545455 0 0 0 0 349.090909z\",fill:\"#247ADE\",\"p-id\":\"2672\"}),e(\"path\",{d:\"M907.636364 186.181818a23.272727 23.272727 0 0 0-23.272728-23.272727h-209.454545a23.272727 23.272727 0 0 0-23.272727 23.272727v674.909091a23.272727 23.272727 0 0 0 23.272727 23.272727h209.454545a23.272727 23.272727 0 0 0 23.272728-23.272727V186.181818z\",fill:\"#A0BFF7\",\"p-id\":\"2673\"})])]),e(\"div\",{class:\"app-name\"},\" NAS\\u5957\\u4EF6 \")],-1)),r1=[\"onClick\"],p1={class:\"app-icon\"},v1=[\"src\"],h1={class:\"app-name\"},m1={class:\"app-footer\"},g1=[\"onClick\"],f1=[\"onClick\"],C1={class:\"app-content\"},$1={class:\"app-icon\"},w1=[\"src\"],F1={class:\"app-name\"},k1=F({__name:\"index\",setup(i){const u=Y(),t=x(()=>u.localApps.filter(n=>n.name!=\"istorex\")),s=$(!1);(()=>b(this,null,function*(){yield u.getApp(),setTimeout(()=>{p()},2e3)}))();const h=()=>{X.Open()},p=()=>b(this,null,function*(){try{if((yield M.Quickstart.Guide.GlobalFolders.GET()).status!==200)return}catch(n){console.log(n);return}s.value=!0;try{const n=yield M.Storage.Get.POST({key:\"nas_guide_init\"});if(n.data){const{success:l,error:g,result:v}=n.data;if(v&&v.key==\"nas_guide_init\")return}}catch(n){return}o()}),o=()=>{if(!s.value){G.Warning(\"\\u8BF7\\u5148\\u66F4\\u65B0\\u7CFB\\u7EDF\\u5230\\u6700\\u65B0\\u7248\\u672C\");return}J.OpenGuideWindow()};return(n,l)=>{const g=m(\"nas-section-title\"),v=m(\"nas-section-item\"),w=m(\"nas-section-container\"),P=m(\"nas-section\");return a(),k(P,null,{default:r(()=>[c(g,{title:\"Apps\"}),c(w,{class:\"section-app-container\"},{default:r(()=>[c(v,{onClick:l[0]||(l[0]=f=>h())},{default:r(()=>[d1]),_:1}),c(v,{onClick:l[1]||(l[1]=f=>o())},{default:r(()=>[_1]),_:1}),(a(!0),d(A,null,O(t.value,f=>(a(),d(A,null,[f.isWebUrl()?(a(),k(v,{key:0,class:\"app-item\",name:f.name,title:f.title},{default:r(()=>[e(\"div\",{class:\"app-content\",onClick:Z=>f.openWebUrl()},[e(\"div\",p1,[e(\"img\",{alt:\"\\u56FE\\u6807\\u51FA\\u8D70\\u5566~\",src:f.getIcon()},null,8,v1)]),e(\"div\",h1,C(f.title),1)],8,r1),e(\"div\",m1,[e(\"button\",{class:\"open\",onClick:Z=>f.openWebUrl()},\" \\u6253\\u5F00 \",8,g1),e(\"button\",{class:\"setting\",onClick:Z=>f.openApp()},\" \\u914D\\u7F6E \",8,f1)])]),_:2},1032,[\"name\",\"title\"])):(a(),k(v,{key:1,onClick:Z=>f.openApp(),name:f.name,title:f.title},{default:r(()=>[e(\"div\",C1,[e(\"div\",$1,[e(\"img\",{alt:\"\\u56FE\\u6807\\u51FA\\u8D70\\u5566~\",src:f.getIcon()},null,8,w1)]),e(\"div\",F1,C(f.title),1)])]),_:2},1032,[\"onClick\",\"name\",\"title\"]))],64))),256))]),_:1})]),_:1})}}});var y1=y(k1,[[\"__scopeId\",\"data-v-37664f80\"]]);const E1=i=>(I(\"data-v-c01a3f98\"),i=i(),z(),i),L1={class:\"tabls\"},x1=E1(()=>e(\"section\",{class:\"tab-content\"},[e(\"div\",{class:\"label-value\"},[e(\"div\",{class:\"label-name\"},[e(\"span\",null,\"\\u6302\\u8F7D\\u70B9\")]),e(\"div\",{class:\"label-value\"},[e(\"input\",{type:\"text\"})])])],-1)),B1=F({__name:\"index\",props:{disk:{type:Object,required:!0},close:Function},setup(i){const u=i,t=()=>{o.value&&location.reload(),u.close&&u.close()},s=$(\"main\"),_=$(!1),h=$(u.disk),p=$(null),o=$(!1);H(\"disk\",h),H(\"updateDisk\",l=>{h.value=l,o.value=!0}),H(\"disabled\",_),H(\"onMount\",l=>{p.value=l,s.value=\"mount\"});const n=l=>{l==\"mount\"&&(p.value=null),s.value=l};return(l,g)=>(a(),k(K,{onHandleClose:t,title:\"\\u5171\\u4EAB\\u8BBE\\u7F6E\",width:\"420px\"},{default:r(()=>[e(\"ul\",L1,[e(\"button\",{class:U({on:s.value==\"main\"}),onClick:g[0]||(g[0]=v=>n(\"main\"))},\"Samba\",2),e(\"button\",{class:U({on:s.value==\"partition\"}),onClick:g[1]||(g[1]=v=>n(\"partition\"))},\"WebDav\",2)]),x1]),_:1}))}});var b1=y(B1,[[\"__scopeId\",\"data-v-c01a3f98\"]]);class A1 extends e1{Open(){this.openWindow(b1)}}const D1=new A1;const B=i=>(I(\"data-v-2815b650\"),i=i(),z(),i),S1=B(()=>e(\"div\",{class:\"tool-content\"},[e(\"div\",{class:\"f\"},[e(\"div\",{class:\"title\"},\" \\u6587\\u4EF6\\u7BA1\\u7406 \"),e(\"div\",{class:\"desc\"},\" \\u5728\\u7EBF\\u7BA1\\u7406\\u6587\\u4EF6 \"),e(\"div\",{class:\"btns\"},[e(\"a\",{href:\"/cgi-bin/luci/admin/services/linkease/file\",target:\"_blank\",class:\"open\",rel:\"noopener noreferrer\"},\" \\u6253\\u5F00 \")])]),e(\"div\",{class:\"r\"},[e(\"svg\",{class:\"icon\",viewBox:\"0 0 520 520\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},[e(\"title\",null,\"\\u6587\\u4EF6\\u7BA1\\u7406\"),e(\"g\",{id:\"\\u6587\\u4EF6\\u7BA1\\u7406\",stroke:\"none\",\"stroke-width\":\"1\",fill:\"none\",\"fill-rule\":\"evenodd\"},[e(\"path\",{d:\"M100.645161,0 L419.354839,0 C474.939626,0 520,45.0603736 520,100.645161 L520,419.354839 C520,474.939626 474.939626,520 419.354839,520 L100.645161,520 C45.0603736,520 0,474.939626 0,419.354839 L0,100.645161 C0,45.0603736 45.0603736,0 100.645161,0 Z\",id:\"Rectangle\",fill:\"#FFFFFF\"}),e(\"g\",{id:\"Group-5\",transform:\"translate(91.000000, 125.000000)\"},[e(\"path\",{d:\"M17.9469027,198 L320.053097,198 L320.004939,41.9999992 C319.997272,33.165374 312.834627,26.0049401 304,26 L168.501475,26 L168.501475,26 L151.360646,5.6827235 C148.32056,2.07926566 143.845981,1.98155802e-14 139.131426,0 L34,0 C25.1651196,0.00429126987 18.0023698,7.16512047 17.9957093,15.9999994 L17.9469027,198 L17.9469027,198 Z\",id:\"Path-2\",fill:\"#FFB02C\",transform:\"translate(169.000000, 99.000000) scale(-1, 1) translate(-169.000000, -99.000000) \"}),e(\"path\",{d:\"M297.245454,178.4361 L67.8061501,197.326892 C63.4027721,197.689443 59.5392238,194.413704 59.1766735,190.010326 C59.1711924,189.943756 59.1665453,189.87712 59.1627333,189.810433 L51.4420645,54.7472375 C51.1956458,50.4364574 54.4144797,46.7079405 58.7150678,46.322598 L288.43249,25.7393906 C292.833138,25.3450825 296.720218,28.5928625 297.114526,32.9935104 C297.122855,33.0864604 297.129556,33.1795491 297.134627,33.2727336 L304.577178,170.028344 C304.812572,174.353677 301.562579,178.080651 297.245454,178.4361 Z\",id:\"Path\",fill:\"#E8E8E8\",\"fill-rule\":\"nonzero\"}),e(\"path\",{d:\"M289.245454,185.4361 L59.8061501,204.326892 C55.4027721,204.689443 51.5392238,201.413704 51.1766735,197.010326 C51.1711924,196.943756 51.1665453,196.87712 51.1627333,196.810433 L43.4420645,61.7472375 C43.1956458,57.4364574 46.4144797,53.7079405 50.7150678,53.322598 L280.43249,32.7393906 C284.833138,32.3450825 288.720218,35.5928625 289.114526,39.9935104 C289.122855,40.0864604 289.129556,40.1795491 289.134627,40.2727336 L296.577178,177.028344 C296.812572,181.353677 293.562579,185.080651 289.245454,185.4361 Z\",id:\"Path\",fill:\"#F3F3F3\",\"fill-rule\":\"nonzero\"}),e(\"path\",{d:\"M280.245454,191.4361 L50.8061501,210.326892 C46.4027721,210.689443 42.5392238,207.413704 42.1766735,203.010326 C42.1711924,202.943756 42.1665453,202.87712 42.1627333,202.810433 L34.4420645,67.7472375 C34.1956458,63.4364574 37.4144797,59.7079405 41.7150678,59.322598 L271.43249,38.7393906 C275.833138,38.3450825 279.720218,41.5928625 280.114526,45.9935104 C280.122855,46.0864604 280.129556,46.1795491 280.134627,46.2727336 L287.577178,183.028344 C287.812572,187.353677 284.562579,191.080651 280.245454,191.4361 Z\",id:\"Path\",fill:\"#FAFAFA\",\"fill-rule\":\"nonzero\"}),e(\"path\",{d:\"M272.050402,211.155772 L44.7097773,224.528092 C40.2991228,224.787529 36.5132653,221.422303 36.2538278,217.011649 C36.2531111,216.999464 36.2524223,216.987279 36.2517614,216.975091 L28.4285714,72.713026 C28.1911376,68.3346726 31.5223826,64.5810839 35.8979358,64.2966766 L263.165019,49.5245057 C267.573993,49.2379261 271.380491,52.5797871 271.667071,56.9887612 C271.66893,57.0173626 271.670635,57.0459738 271.672187,57.0745935 L279.568919,202.73651 C279.807318,207.133987 276.446738,210.897177 272.050402,211.155772 Z\",id:\"Path\",fill:\"#FFFFFF\",\"fill-rule\":\"nonzero\"}),e(\"path\",{d:\"M32.5622397,270 L305.635714,270 C313.829424,270 320.698984,263.809932 321.54932,255.660465 L336.157264,115.660465 C337.074313,106.871623 330.692964,99.0034433 321.904122,98.086394 C321.352506,98.0288369 320.798269,98 320.243658,98 L168.501475,98 L168.501475,98 L151.360646,77.6827235 C148.32056,74.0792657 143.845981,72 139.131426,72 L17.5158465,72 C8.67929053,72 1.51584653,79.163444 1.51584653,88 C1.51584653,88.4821829 1.53764343,88.9641194 1.5811705,89.4443337 L16.6275636,255.444334 C17.374725,263.687425 24.2853564,270 32.5622397,270 Z\",id:\"Path-2\",fill:\"#FFCA28\"})])])])])],-1)),M1={class:\"tool-content\"},I1=B(()=>e(\"div\",{class:\"f\"},[e(\"div\",{class:\"title\"},\" \\u7F51\\u7EDC\\u5171\\u4EAB \"),e(\"div\",{class:\"desc\"},\" \\u7F51\\u7EDC\\u5171\\u4EAB\\u6587\\u4EF6 \")],-1)),z1={class:\"content\"},V1=B(()=>e(\"div\",null,null,-1)),P1=B(()=>e(\"span\",null,\"\\u5171\\u4EAB\\u6587\\u4EF6\",-1)),H1=[V1,P1],O1=B(()=>e(\"div\",null,null,-1)),Z1=B(()=>e(\"span\",null,\"\\u5171\\u4EAB\\u7528\\u6237\",-1)),G1=[O1,Z1],U1=B(()=>e(\"div\",null,null,-1)),N1=B(()=>e(\"span\",null,\"\\u5171\\u4EAB\\u8BBE\\u7F6E\",-1)),T1=[U1,N1],j1=F({__name:\"index\",setup(i){return(u,t)=>{const s=m(\"nas-section-item\"),_=m(\"nas-section-container\"),h=m(\"nas-section\");return a(),k(h,null,{default:r(()=>[c(_,{class:\"section-setting-container\"},{default:r(()=>[c(s,null,{default:r(()=>[S1]),_:1}),c(s,null,{default:r(()=>[e(\"div\",M1,[I1,e(\"div\",z1,[e(\"div\",{onClick:t[0]||(t[0]=p=>L(c1).Open())},H1),e(\"div\",{onClick:t[1]||(t[1]=p=>L(u1).Open())},G1),e(\"div\",{onClick:t[2]||(t[2]=p=>L(D1).Open())},T1)])])]),_:1})]),_:1})]),_:1})}}});var W1=y(j1,[[\"__scopeId\",\"data-v-2815b650\"]]);const q1={class:\"disk-content\"},R1={class:\"name\"},Q1={class:\"info\"},Y1={class:\"icon\"},X1={class:\"card\"},J1={key:0,class:\"status main\"},K1={key:0},e2={key:1},t2={key:2},s2={key:3},n2=[\"value\"],a2=F({__name:\"disk\",props:{type:{type:String},disk:{type:Object,required:!0}},setup(i){const u=i,t=q(u.disk),s=x(()=>t.errorInfo?\"error\":t.childrens==null||t.childrens.length==0||t.childrens.length==1&&t.childrens[0].filesystem==\"No FileSystem\"?\"load\":t.childrens.filter(h=>h.mountPoint).length==0?\"unmounted\":\"success\"),_=()=>{u.type!=\"raid\"&&t1.OpenDisk({disk:u.disk})};return(h,p)=>{const o=m(\"icon-disk\"),n=m(\"nas-section-item\");return a(),k(n,{onClick:p[0]||(p[0]=l=>_())},{default:r(()=>[e(\"div\",q1,[e(\"div\",R1,C(i.type==\"raid\"?\"raid: \":\"\")+\" \"+C(t.name),1),e(\"div\",Q1,[e(\"div\",Y1,[c(o)]),e(\"div\",X1,[t.isSystemRoot?(a(),d(\"div\",J1,\" \\u7CFB\\u7EDF \")):E(\"\",!0),e(\"div\",{class:U([\"status\",s.value])},[s.value==\"error\"?(a(),d(\"span\",K1,\"\\u9519\\u8BEF\")):s.value==\"success\"?(a(),d(\"span\",e2,\"\\u6B63\\u5E38\")):s.value==\"load\"?(a(),d(\"span\",t2,\"\\u672A\\u683C\\u5F0F\\u5316\")):s.value==\"unmounted\"?(a(),d(\"span\",s2,\"\\u672A\\u6302\\u8F7D\")):E(\"\",!0)],2),e(\"li\",null,\"Used: \"+C(t.used),1),e(\"li\",null,\"Total: \"+C(t.size||t.total),1)])]),e(\"progress\",{value:t.usage||0,max:\"100\"},null,8,n2)])]),_:1})}}});var W=y(a2,[[\"__scopeId\",\"data-v-1880f8c7\"]]);const o2=F({__name:\"index\",setup(i){const u=D(),t=x(()=>u.disk),s=x(()=>u.raid.disks);return(_,h)=>{const p=m(\"nas-section-title\"),o=m(\"nas-section-container\"),n=m(\"nas-section\");return a(),k(n,null,{default:r(()=>[c(p,{title:\"Storage\"}),c(o,{class:\"section-disk-container\"},{default:r(()=>[(a(!0),d(A,null,O(t.value.disks,l=>(a(),k(W,{disk:l},null,8,[\"disk\"]))),256)),(a(!0),d(A,null,O(s.value,l=>(a(),k(W,{disk:l,type:\"raid\"},null,8,[\"disk\"]))),256))]),_:1})]),_:1})}}});var i2=y(o2,[[\"__scopeId\",\"data-v-32ba2e94\"]]);const l2={class:\"widget-content\"},c2=F({__name:\"cpu\",setup(i){const u=D(),t=q({cpuusage:0,temperature:0,menavailablePercentage:0,menusage:0}),s=$(null),_=$(null),h=()=>{u.getSystemData().then(n=>{t.cpuusage=n.cpu.usage,t.temperature=n.cpu.temperature,t.menavailablePercentage=n.memery.availablePercentage||100,t.menusage=100-t.menavailablePercentage,o.cpu&&o.cpu.setValue(t.cpuusage),o.men&&o.men.setValue(t.menusage)})};h();const p=setInterval(()=>{h()},5e3),o={cpu:null,men:null};return s1(()=>{s.value&&_.value&&(o.cpu=j({el:s.value,value:t.cpuusage,name:\"CPU\"}),o.men=j({el:_.value,value:t.menusage,name:\"RAM\"}))}),n1(()=>{clearInterval(p)}),(n,l)=>{const g=m(\"nas-section-item\"),v=m(\"nas-section-container\"),w=m(\"nas-section\");return a(),k(w,null,{default:r(()=>[c(v,null,{default:r(()=>[c(g,null,{default:r(()=>[e(\"div\",l2,[e(\"div\",{class:\"gauge\",ref_key:\"cpu\",ref:s},null,512),e(\"div\",{class:\"gauge\",ref_key:\"men\",ref:_},null,512)])]),_:1})]),_:1})]),_:1})}}});var u2=y(c2,[[\"__scopeId\",\"data-v-eb492a5a\"]]);const S=i=>(I(\"data-v-5efc00dc\"),i=i(),z(),i),d2=S(()=>e(\"div\",{class:\"widget-title\"},[e(\"span\",null,\"\\u7CFB\\u7EDF\\u4FE1\\u606F\")],-1)),_2={class:\"widget-item\"},r2=S(()=>e(\"div\",{class:\"widget-item_title\"},[e(\"span\",null,\"\\u8054\\u7F51\\u72B6\\u6001:\")],-1)),p2={class:\"widget-item_value\"},v2={key:0},h2={key:1},m2={key:2},g2={key:4},f2={class:\"widget-item\"},C2=S(()=>e(\"div\",{class:\"widget-item_title\"},[e(\"span\",null,\"\\u8FDE\\u63A5\\u65B9\\u5F0F:\")],-1)),$2={class:\"widget-item_value\"},w2={class:\"widget-item\"},F2=S(()=>e(\"div\",{class:\"widget-item_title\"},[e(\"span\",null,\"\\u5728\\u7EBF\\u8BBE\\u5907:\")],-1)),k2={class:\"widget-item_value\"},y2={class:\"widget-item\"},E2=S(()=>e(\"div\",{class:\"widget-item_title\"},[e(\"span\",null,\"IPv4\\u5730\\u5740:\")],-1)),L2={class:\"widget-item_value\"},x2={key:0,class:\"widget-item\"},B2=S(()=>e(\"div\",{class:\"widget-item_title\"},[e(\"span\",null,\"IPv6\\u5730\\u5740:\")],-1)),b2={class:\"widget-item_value\"},A2={class:\"widget-item\"},D2=S(()=>e(\"div\",{class:\"widget-item_title\"},[e(\"span\",null,\"DNS:\")],-1)),S2={class:\"widget-item_value\"},M2=F({__name:\"info\",setup(i){const u=D(),t=x(()=>u.network),s=x(()=>u.device),_=o=>{switch(o){case\"pppoe\":return\"\\u62E8\\u53F7\\u4E0A\\u7F51\";case\"static\":return\"\\u9759\\u6001\\u7F51\\u7EDC\";case\"dhcp\":return\"DHCP\"}},h=o=>{switch(o){case\"manual\":return\"\\u624B\\u52A8\\u914D\\u7F6E\";case\"auto\":return\"\\u81EA\\u52A8\\u83B7\\u53D6\";default:return\"\"}},p=o=>o.toUpperCase();return(o,n)=>{const l=m(\"nas-section-item\"),g=m(\"nas-section-container\"),v=m(\"nas-section\");return a(),k(v,null,{default:r(()=>[c(g,null,{default:r(()=>[c(l,{class:\"widget-main\"},{default:r(()=>{var w;return[d2,e(\"div\",_2,[r2,e(\"div\",p2,[t.value.networkInfo==\"netSuccess\"?(a(),d(\"span\",v2,\" \\u5DF2\\u8054\\u7F51 \")):t.value.networkInfo==\"dnsFailed\"?(a(),d(\"span\",h2,\" DNS\\u9519\\u8BEF \")):t.value.networkInfo==\"softSourceFailed\"?(a(),d(\"span\",m2,\" \\u8F6F\\u4EF6\\u6E90\\u89E3\\u6790\\u9519\\u8BEF \")):(a(),d(\"span\",g2,\" \\u68C0\\u6D4B\\u4E2D \"))])]),e(\"div\",f2,[C2,e(\"div\",$2,C(p(t.value.defaultInterface||\"\")),1)]),e(\"div\",w2,[F2,e(\"div\",k2,C(s.value.devices.length),1)]),e(\"div\",y2,[E2,e(\"div\",L2,C(t.value.ipv4addr)+\"\\uFF08\"+C(_(t.value.proto||\"\"))+\"\\uFF09 \",1)]),t.value.ipv6addr?(a(),d(\"div\",x2,[B2,e(\"div\",b2,C(t.value.ipv6addr),1)])):E(\"\",!0),e(\"div\",A2,[D2,e(\"div\",S2,[e(\"p\",null,C(h(t.value.dnsProto)),1),e(\"p\",null,C((w=t.value.dnsList)==null?void 0:w.join(\", \")),1)])])]}),_:1})]),_:1})]),_:1})}}});var I2=y(M2,[[\"__scopeId\",\"data-v-5efc00dc\"]]);const z2={class:\"widget-content\"},V2={class:\"time\"},P2={class:\"date\"},H2=F({__name:\"time\",setup(i){const u=N.formatDateYMD,t=N.formatDateHMS,s=D(),_=x(()=>s.localtime);return(h,p)=>{const o=m(\"nas-section-item\"),n=m(\"nas-section-container\"),l=m(\"nas-section\");return a(),k(l,null,{default:r(()=>[c(n,null,{default:r(()=>[c(o,null,{default:r(()=>[e(\"div\",z2,[e(\"div\",V2,C(L(t)(L(_))),1),e(\"div\",P2,C(L(u)(L(_))),1)])]),_:1})]),_:1})]),_:1})}}});var O2=y(H2,[[\"__scopeId\",\"data-v-ce99f322\"]]);const Z2=F({__name:\"index\",setup(i){return(u,t)=>(a(),d(A,null,[c(O2),c(I2),c(u2)],64))}});const V=i=>(I(\"data-v-642968c3\"),i=i(),z(),i),G2={class:\"dropdown-item\"},U2=V(()=>e(\"svg\",{t:\"1668756315301\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"31499\",width:\"128\",height:\"128\"},[e(\"path\",{d:\"M966.79936 655.37024a270.7968 270.7968 0 0 0-143.02208-40.96c-143.02208 0-257.4336 102.4-257.4336 230.4a208.4352 208.4352 0 0 0 45.7728 128H57.21088c-34.33472 0-57.21088-20.48-57.21088-51.2v-870.4c0-30.72 22.87616-51.2 57.21088-51.2h858.112c34.32448 0 57.20064 20.48 57.20064 51.2v604.16h-5.71392z m-200.22272-399.36a25.76384 25.76384 0 1 0 0-51.2H194.5088a25.76384 25.76384 0 1 0 0 51.2h572.07808z m0 256a25.76384 25.76384 0 1 0 0-51.2H194.5088a25.76384 25.76384 0 1 0 0 51.2h572.07808z m-577.792 204.8a25.76384 25.76384 0 0 0 0 51.2h303.2064a25.76384 25.76384 0 0 0 0-51.2z m0 0\",fill:\"#2E2A2A\",\"p-id\":\"31500\"}),e(\"path\",{d:\"M852.38784 819.2v-76.8a28.78464 28.78464 0 0 0-57.21088 0v102.4c0 5.12 5.72416 15.36 5.72416 20.48s11.43808 5.12 22.87616 5.12H938.1888a25.76384 25.76384 0 1 0 0-51.2h-85.80096z m-28.61056 204.8c-108.68736 0-200.22272-81.92-200.22272-179.2S715.08992 665.6 823.77728 665.6 1024 747.52 1024 844.8 932.48512 1024 823.77728 1024z m0 0\",fill:\"#2E2A2A\",\"p-id\":\"31501\"})],-1)),N2={key:0},T2={key:0,class:\"dropdown-container\"},j2={class:\"title\"},W2=V(()=>e(\"span\",null,\"\\u5B89\\u88C5\\u4EFB\\u52A1\",-1)),q2=V(()=>e(\"div\",{class:\"auto\"},null,-1)),R2={class:\"dropdown-container_menus\"},Q2={class:\"dropdown-menu_item\"},Y2=V(()=>e(\"div\",{class:\"auto\"},null,-1)),X2={class:\"status\"},J2={key:0},K2={key:1},e0={class:\"btn\"},t0=V(()=>e(\"span\",null,\" \\u5B89\\u88C5\\u4E2D \",-1)),s0=F({__name:\"task\",setup(i){const u=v=>h.value.indexOf(v)!=-1,t=v=>p.value.indexOf(v)!=-1,s=$(!1),_=$([]),h=$([]),p=$([]),o=()=>b(this,null,function*(){try{const v=yield M.Quickstart.SetupResult.GET();if(v.data){const{result:w,error:P}=v.data;v.data.success==0&&w&&(_.value=w.packages||[],h.value=w.success||[],p.value=w.failed||[])}}catch(v){console.log(v)}});let n=!1;setTimeout(()=>b(this,null,function*(){yield o(),localStorage.getItem(\"nas_guide_init\")&&(n=!0,s.value=!0)}),1e3);const l=()=>{s.value=!s.value,n&&localStorage.removeItem(\"nas_guide_init\")},g=()=>{a1.autoSetup.Open()};return(v,w)=>{const P=m(\"icon-loading\");return a(),d(\"div\",G2,[e(\"button\",{onClick:w[0]||(w[0]=f=>s.value=!s.value)},[U2,_.value.length>0?(a(),d(\"em\",N2)):E(\"\",!0)]),s.value?(a(),d(\"div\",{key:0,class:\"dropdown-bg\",onClick:l})):E(\"\",!0),c(R,{name:\"fade\"},{default:r(()=>[s.value?(a(),d(\"div\",T2,[e(\"h2\",j2,[W2,e(\"span\",null,\"(\"+C(h.value.length+p.value.length+\"/\"+_.value.length)+\")\",1),q2,e(\"a\",{onClick:g},\"\\u67E5\\u770B\\u65E5\\u5FD7\")]),e(\"div\",R2,[(a(!0),d(A,null,O(_.value,f=>(a(),d(\"div\",Q2,[e(\"span\",null,C(f),1),Y2,e(\"div\",X2,[u(f)?(a(),d(\"span\",J2,\" \\u6210\\u529F \")):t(f)?(a(),d(\"span\",K2,\" \\u5931\\u8D25 \")):(a(),d(A,{key:2},[e(\"div\",e0,[c(P)]),t0],64))])]))),256))])])):E(\"\",!0)]),_:1})])}}});var n0=y(s0,[[\"__scopeId\",\"data-v-642968c3\"]]);const a0={class:\"dropdown-item\"},o0=e(\"svg\",{t:\"1663656201767\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"1863\",width:\"128\",height:\"128\"},[e(\"path\",{d:\"M25.6 54.84032v152.79104h967.68V54.84032H25.6z m0 534.76864h967.68V436.81792H25.6v152.79104z m0 381.98272h967.68v-152.79104H25.6v152.79104z\",\"p-id\":\"1864\"})],-1),i0={key:0},l0={key:0,class:\"dropdown-container\"},c0=e(\"h2\",{class:\"title\"},\" \\u7CFB\\u7EDF\\u8BBE\\u7F6E \",-1),u0={class:\"dropdown-menu_item\"},d0=e(\"div\",{class:\"icons\"},[e(\"svg\",{t:\"1663663794595\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"19033\",width:\"128\",height:\"128\"},[e(\"path\",{d:\"M885.376 848H512v-74.624h373.376V250.624H512V176h373.376A74.88 74.88 0 0 1 960 250.688v522.688c0 41.088-33.536 74.624-74.624 74.624zM512 736h336V586.688l-224-112L512 530.688V736z m0 112H325.312v-74.624H512v74.624zM325.312 176H512v74.624H325.312V176zM512 530.688V736H325.312V561.792l74.688 24.896L512 530.688z m-186.688-56V325.376c41.152-0.064 74.688 33.536 74.688 74.624s-33.536 74.688-74.688 74.688z m0 373.312H138.688A74.88 74.88 0 0 1 64 773.376V250.624A74.88 74.88 0 0 1 138.688 176h186.624v74.624H138.688v522.752h186.624v74.624z m0-522.624c-41.088 0-74.624 33.472-74.624 74.624a74.88 74.88 0 0 0 74.624 74.688V325.376z m0 236.416L288 549.376l-112 37.312V736h149.312V561.792z\",\"p-id\":\"19034\"})])],-1),_0=e(\"span\",null,\"\\u58C1\\u7EB8\",-1),r0=e(\"div\",{class:\"auto\"},null,-1),p0={class:\"upload\",title:\"\\u4E0A\\u4F20\\u80CC\\u666F\"},v0=e(\"span\",null,\"\\u4E0A\\u4F20\",-1),h0=e(\"div\",{class:\"icons\"},[e(\"svg\",{t:\"1663666048430\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"1979\",width:\"128\",height:\"128\"},[e(\"path\",{d:\"M816.47182493 165.18652616c-45.03283702 5.80844472-91.61106134 5.60212947-139.89197922-1.26634882-48.55758565-6.90879227-98.65581637-20.5761858-150.4053594-41.66144114L512.02569025 116.4921875l-14.23100531 5.76654948c-51.72187603 21.08525534-101.79164949 34.75264886-150.37690215 41.66144114-48.22558465 6.86847828-94.85598046 7.07479277-139.89039874 1.26634881L159.65672594 159.01999391l0.63396504 55.68692219c2.58723985 236.52258702 39.47418405 393.75769043 98.82181686 499.07250806 62.3190467 110.60391658 147.37703179 163.61822717 243.19660678 189.35703593l9.71815688 2.6156971 9.68811914-2.6156971c95.79507051-25.73880876 180.87756008-78.75311934 243.17289253-189.35703593 59.40138634-105.26027387 96.28753954-262.54913003 98.84869362-499.07250806l0.60550779-55.68692219L816.47182493 165.18652616zM536.52502695 716.42199725c0 14.01125204-10.98371543 25.35226399-24.52542245 25.35226399-13.54486954 0-24.49933671-11.34180218-24.49933672-25.35226399l0-410.61466986c0-14.02548105 10.95446718-25.366493 24.49933671-25.36649299 13.54170702 0 24.52542246 11.34101194 24.52542245 25.366493L536.52502695 716.42199725z\",\"p-id\":\"1980\"})])],-1),m0=e(\"span\",null,\" \\u5411\\u5BFC\\u6A21\\u5F0F \",-1),g0=e(\"div\",{class:\"auto\"},null,-1),f0={class:\"btn\"},C0={target:\"_blank\",href:\"/cgi-bin/luci/admin/quickstart/\",class:\"dropdown-menu_item\"},$0=e(\"div\",{class:\"icons\"},[e(\"svg\",{t:\"1663665818574\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"1800\",width:\"128\",height:\"128\"},[e(\"path\",{d:\"M900.48223089 607.65333044C901.65599673 614.64488767 901.40082993 623.01434302 899.56363186 632.86376636 897.87953241 642.71318476 894.97063672 652.76674038 890.88797519 662.87132559 886.80531367 673.02694531 881.90612131 682.16190192 876.13936032 690.27619046 870.37260346 698.44151353 863.89137986 704.20827039 857.00188672 707.67853421 850.01032949 711.19982761 843.93737131 712.93495745 838.68094394 712.93495745 833.47555027 712.93495745 827.7087934 711.81222613 821.3296347 709.46469858 815.56287701 707.7295646 808.26511929 706.14753335 799.58946179 704.66757031 790.81174103 703.23863767 782.03402026 702.98347085 773.00113186 703.8000058 764.01927798 704.66757031 755.03741998 706.55580288 746.10660061 709.41366406 737.17577712 712.27152524 729.36768909 717.27278579 723.09059861 724.21331345 709.15851373 738.70675738 700.94216111 755.24153579 698.64566311 773.81764539 696.34916596 792.39375581 698.95186032 810.05126636 706.50478567 826.89224197 712.27154666 838.52782886 711.4039772 850.06134671 703.90209048 861.69692947 700.43182749 866.34095913 694.8181684 871.13808246 687.36731207 876.03727893 679.81438672 880.98750581 671.49596506 885.47843274 662.56514157 889.56109426 653.6343222 893.6437558 644.1421347 896.8078183 634.24168179 899.15534585 624.39225845 901.40081345 615.7166059 902.57457517 608.11264685 902.57457517 602.90725318 902.57457517 598.05909534 900.53324399 593.36403611 896.50161697 588.77104095 892.41895544 585.60697846 888.03009671 583.76978039 883.43710156L582.90221506 883.43710156C576.52305554 865.42236011 565.65296991 849.95927851 550.29195652 836.89476309 534.93094394 823.83024768 517.12033478 817.29799038 496.75806164 817.29799038 477.05922073 817.29799038 459.19757788 823.83024768 443.27519882 836.89476309 427.30178689 849.95927851 416.12550159 865.16719331 409.74634289 882.56953706 406.83744721 889.56109426 402.49961968 894.61338853 396.68182666 897.82848142 390.96610102 900.99254392 384.58694314 902.57457517 377.5953851 902.57457517 369.48109573 902.57457517 360.3461416 901.14564663 350.19052106 898.18571643 340.03490134 895.27682073 329.87928162 891.65345913 319.72366189 887.31563081 309.56804135 882.97780164 300.43308722 877.87447699 292.31879786 872.05668149 284.20450848 866.28992461 278.13154947 860.47213324 274.04888794 854.70537225 271.13999224 850.62271072 269.55796099 845.82558245 269.25176132 840.36502692 268.94556164 834.85343274 271.13999224 827.14740879 275.78401944 817.29799038 282.16317732 803.92727366 284.61277472 788.71935886 283.18384289 771.57218274 281.75491189 754.47603949 274.35508843 738.65572698 260.98437253 724.16227893 252.87008316 715.43558774 243.02066229 709.82192947 231.43611157 707.21923511 219.80052634 704.5655021 208.82837414 703.59587268 198.36655475 704.15723669 186.16960385 704.71860483 173.71748697 707.06613238 160.95917041 711.14879392 152.84488104 713.44529108 144.73059167 712.83289337 136.56526944 709.36262954 130.18611157 707.06613238 124.26625198 701.70764011 118.70362659 693.33818476 113.19203323 684.91769489 108.29284006 675.57861011 103.90397885 665.47401996 99.56615134 655.31840024 96.24898941 644.9076137 93.90145938 634.13959629 91.60496222 623.42260842 90.99256287 614.59385728 92.16632788 607.60229592 93.90145938 594.84398184 99.66821789 586.72969331 109.56867163 583.25942947 126.97101538 576.26787226 142.58719477 564.83642261 156.51927634 548.86300739 170.45135791 532.88959629 177.39188226 515.07898711 177.39188226 495.32911252 177.39188226 475.06890594 170.45135791 457.36036252 156.51927634 442.25451594 142.58719477 427.14866934 126.91998252 416.17651715 109.56867163 409.18495911 104.46534534 407.55189499 100.12751782 403.3671669 96.65725564 396.68180936 93.18699346 389.99645098 91.40082911 383.15799402 91.40082911 376.26850254 91.40082911 368.71557965 92.57459412 360.29509061 94.87109128 351.00703623 97.16758762 341.71898184 100.22958438 332.73712714 104.00604541 324.01043842 107.78250726 315.33478339 112.17136846 307.37359345 117.07056164 300.07583654 122.02078852 292.88014539 127.37928162 287.47062024 133.14604095 284.00035723 137.79006814 281.09146154 142.33202878 279.96872939 146.66985629 280.53009589 151.00768381 281.09146154 155.80481042 282.26522656 161.01020411 284.00035723 178.41254786 290.99191528 196.52935669 293.13531219 215.41166595 290.53261536 234.24294071 287.92991934 250.93081854 279.66252972 265.42426661 265.78148184 272.36479095 258.78992462 277.41708356 250.21633533 280.63217974 240.11174848 283.79624225 229.90509588 285.88860629 219.90257559 286.70513794 210.05315473 287.62373697 200.20373468 287.62373697 191.22187998 286.70513794 183.10759061 285.88860629 174.94226837 285.12310669 169.17550903 284.56174103 165.70524686 283.38797601 162.23498468 282.36731042 158.15232315 281.49974509 153.50829597 280.63217974 148.86426877 281.09147885 144.78160723 282.77557666 141.31134588 286.24583884 133.19705652 292.47189728 126.10343191 301.50478567 120.03047373 310.48664038 113.95751472 320.18296099 108.85418841 330.64478039 104.77152688 341.1065998 100.73989904 351.26222034 97.72893598 361.11164038 95.63657193 370.96106042 93.59524158 378.82018381 92.57457599 384.58694314 92.57457599 392.08883316 92.57457599 398.05972479 95.02417341 402.44858599 99.97440027 406.78641351 104.92462714 409.79737659 110.02795344 411.53250727 115.23334629 417.91166596 130.90055936 428.37348535 144.62850781 442.86693259 156.5702919 457.36038064 168.46104312 474.50755759 174.43193475 494.20639849 174.43193475 514.51764041 174.43193475 532.48134817 168.76724279 548.14856208 157.43785724 563.81577185 146.10847251 574.83896021 131.7681247 581.2181156 114.36578095 583.51461277 109.72175376 587.1890097 104.92462714 592.08820122 100.02543313 596.98739771 95.07520627 602.03968866 92.62560969 607.34715054 92.62560969 615.41040539 92.62560969 624.29019436 93.74834183 633.88444595 96.09587186 643.47870249 98.39236902 652.91985547 101.60746438 662.10584577 105.69012591 671.49596506 109.72175376 680.06955353 114.97818029 687.82661118 121.35733816 695.68573374 127.73649686 701.86076013 134.67702039 706.55581936 142.22994409 709.46471506 146.87397129 710.33228039 151.92626472 709.15851373 157.43785724 707.98475201 162.94945059 706.86201657 166.87901187 705.68825486 169.17550903 698.13532949 186.01648711 695.83883152 203.67399686 698.69669763 222.25010562 701.60559332 240.77518152 710.07711277 257.05479312 723.90712942 270.9868747 737.83920935 284.91895627 754.98639041 292.57394653 775.24659534 294.05391123 795.55783478 295.48284222 814.44014157 292.16568029 831.84248532 284.05139093 836.43548047 281.14249524 842.10017324 279.96872939 848.78553327 280.58112876 855.47088999 281.19352811 861.03351373 283.79622412 865.72857791 288.38921844 874.40423047 296.50350781 882.05921991 308.85355813 888.74457993 325.38833654 895.42993664 341.92311414 899.92086277 358.61099279 902.21736074 375.4009372 903.39112659 385.25035724 901.80909534 392.95638037 897.52230151 398.46797373 893.13343866 403.92853338 888.64251172 407.60292786 883.94745249 409.33805936 865.9837406 415.71721722 850.67376172 426.89350254 837.91544763 442.81588159 825.15712942 458.73826064 818.77796991 476.90610401 818.77796991 497.16630976 818.77796991 516.91618518 824.13646548 534.16542621 834.8024147 548.96507559 845.57043708 563.71369046 859.60458521 574.32861011 876.95589526 580.70776467 881.03855679 583.00426267 884.50881567 585.35179434 887.41771548 587.64829233 893.79687087 592.85368518 898.18573374 599.53904107 900.48223089 607.65333044L900.48223089 607.65333044 900.48223089 607.65333044ZM495.94152917 685.93836212C522.01952712 685.93836212 546.71962942 680.98813608 569.83769964 671.13871274 593.05783478 661.28929434 613.21597561 647.66341079 630.36315256 630.26106704 647.51032949 612.8076896 660.98311032 592.70058245 670.83253284 569.78664866 680.68195123 546.87271072 685.58114771 522.32571116 685.58114771 496.29874524 685.58114771 470.16971277 680.68195123 445.67374524 670.83253284 422.81084101 660.98311032 399.89690472 647.51032949 379.84083127 630.36315256 362.74468719 613.21597561 345.64854312 593.10886929 332.12472778 569.83769964 322.27530774 546.71962942 312.42588687 521.96849673 307.47566001 495.94152917 307.47566001 469.86353039 307.47566001 445.31652917 312.42588687 422.40259289 322.27530774 399.53968948 332.12472778 379.48361603 345.64854312 362.43850564 362.74468719 345.34236157 379.84083127 331.81854541 399.89690472 321.96912537 422.81084101 312.11970532 445.67374524 307.16947845 470.22074563 307.16947845 496.29874524 307.16947845 522.37674568 312.11970532 546.87271072 321.96912537 569.78664866 331.81854541 592.64955288 345.34236157 612.8076896 362.43850564 630.26106704 379.53464972 647.66341079 399.59072317 661.23825983 422.45362659 671.13871274 445.36756287 680.98813608 469.86353039 685.93836212 495.94152917 685.93836212L495.94152917 685.93836212 495.94152917 685.93836212Z\",\"p-id\":\"1801\"})])],-1),w0=e(\"span\",null,\" \\u9AD8\\u7EA7\\u914D\\u7F6E \",-1),F0=e(\"div\",{class:\"auto\"},null,-1),k0={class:\"btn\"},y0={target:\"_blank\",href:\"/cgi-bin/luci/admin/system/ota\",class:\"dropdown-menu_item\"},E0=e(\"div\",{class:\"icons\"},[e(\"svg\",{t:\"1663663860869\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"1740\",width:\"128\",height:\"128\"},[e(\"path\",{d:\"M231.27989011 542.51027439C211.04473401 415.97053009 280.55494614 288.10044748 404.67907455 239.7181185c91.98593976-35.86663916 191.16621194-18.71226809 261.39410679 32.5232872l-59.7602277 96.79966617 267.99328894-1.03276318L778.52183591 90.125l-49.06500266 79.45274542c-103.46886557-67.00707449-244.51980715-88.92265842-368.03127997-40.76788814C190.30194858 195.5193558 91.80435007 368.04331772 111.25180539 542.51027439L231.27989011 542.51027439z\",\"p-id\":\"1741\"}),e(\"path\",{d:\"M792.71795273 473.24512467c20.21765158 126.53974429-49.25755151 254.42733225-173.38167993 302.79215588-84.61656134 32.97840298-177.86282217 20.55023657-249.56109146-23.91109305 13.65347928-22.16064716 54.00126068-87.50479751 54.00126067-87.50479751L135.58300519 647.71208133l121.95357577 286.16291867 51.13052902-82.79609738c103.45136106 67.00707449 230.37620306 84.03891476 353.88767588 35.88414367 171.08859567-66.72700305 269.62120322-239.23346045 250.17374789-413.6829126L792.71795273 473.2801337z\",\"p-id\":\"1742\"})])],-1),L0={key:0},x0=e(\"div\",{class:\"auto\"},null,-1),B0={class:\"btn\"},b0={href:\"/cgi-bin/luci/admin/logout\",class:\"dropdown-menu_item\"},A0=e(\"div\",{class:\"icons\"},[e(\"svg\",{t:\"1663664454777\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"1770\",width:\"128\",height:\"128\"},[e(\"path\",{d:\"M713.78169987 245.58612675c-3.34486519 0.15820313-4.20368182 0.11300245-7.50334556 0.58761107a57.69892296 57.69892296 0 0 0-41.72041273 28.47655477 56.20729383 56.20729383 0 0 0-4.97209635 42.98603697c2.05663985 7.11913831 5.55970816 13.80886868 10.23799936 19.59458098 2.10184131 2.5764499 2.71205269 3.11886105 5.03989813 5.49190716l2.80245403 2.48604856c12.43024201 10.3284007 23.91126526 21.62862127 34.2170664 34.03626216a252.98932537 252.98932537 0 0 1 51.80020821 103.8942231 252.67291912 252.67291912 0 0 1-29.2449693 186.49882996 255.56577528 255.56577528 0 0 1-48.74914893 58.85154628 259.90505988 259.90505988 0 0 1-62.15121003 41.22320226 259.49825151 259.49825151 0 0 1-78.01671856 22.69084171 264.13134203 264.13134203 0 0 1-92.54880184-4.63309053 259.79205743 259.79205743 0 0 1-88.25471793-38.60155091 258.25522762 258.25522762 0 0 1-71.68859588-74.19724478 250.59367816 250.59367816 0 0 1-36.61271207-98.7187214 252.06270696 252.06270696 0 0 1 81.99439625-224.17376402c3.54826899-3.09625995 7.11913831-6.10211855 10.62220661-9.19837927 2.32784543-2.37304611 2.93805682-2.89285615 5.01729779-5.46930682a55.77788589 55.77788589 0 0 0-3.81947457-74.4232489 58.24133411 58.24133411 0 0 0-72.32140836-8.11355774c-4.70089153 3.0058586-8.85937268 6.73493106-13.01785306 10.37360216a367.41535298 367.41535298 0 0 0-76.34428597 92.1419935 363.12126904 363.12126904 0 0 0-23.95646671 316.58696308 366.55653557 366.55653557 0 0 0 58.87414585 98.92212598 371.91283994 371.91283994 0 0 0 199.01947486 123.89561168 381.49542647 381.49542647 0 0 0 146.65425515 6.4411259c45.17827961-6.82533317 88.97793253-21.92242642 128.59650322-44.36466363a374.26328571 374.26328571 0 0 0 97.95030691-80.02815852 365.58471726 365.58471726 0 0 0 56.38809728-87.53150408 365.44911447 365.44911447 0 0 0 29.80998078-198.45446336c-5.24330192-40.00277871-17.24413599-79.10154009-35.39228929-115.26224391a367.64135711 367.64135711 0 0 0-85.65566768-110.96815996c-2.96065793-2.5764499-5.98911687-5.13030024-8.9949747-7.66154946-2.59905024-2.03403952-3.2092624-2.62165134-6.03431754-4.40708563a58.53513926 58.53513926 0 0 0-17.15373388-7.29994176 70.92018059 70.92018059 0 0 0-11.11941633-1.62723192c-1.265625 0-2.48604855 0-3.75167355-0.04520068m-144.32640974 322.96028721c0 14.98409157-6.05691787 29.35797175-16.81472728 39.95757803a57.85712608 57.85712608 0 0 1-40.56778942 16.54352172 57.78932508 57.78932508 0 0 1-40.56778943-16.54352172 56.09429214 56.09429214 0 0 1-16.81472806-39.95757802V172.99351358c0-15.0066919 6.05691787-29.35797175 16.81472806-39.98017838A57.76672474 57.76672474 0 0 1 512.07277344 116.49241384c15.21009648 0 29.80998001 5.94391543 40.56778942 16.52092136 10.75780941 10.62220662 16.81472729 24.97348646 16.81472728 40.00277871v395.53030006z\",fill:\"#000000\",\"p-id\":\"1771\"})])],-1),D0=e(\"span\",null,\"\\u6CE8\\u9500\",-1),S0=e(\"div\",{class:\"auto\"},null,-1),M0={class:\"btn\"},I0=F({__name:\"setting\",setup(i){const u=D(),t=$(!1),s=$(!1);(()=>b(this,null,function*(){try{const o=yield M.System.CheckUpdate.GET(),{result:n}=o.data;n&&(s.value=n.needUpdate)}catch(o){console.log(o)}}))();const h=o=>{if(o&&(o==null?void 0:o.target)){const l=o.target.files;if(l){const g=l[0];p(g)}}},p=o=>{const n=new FormData;n.append(\"file\",o),M.Upload.BG.POST(n).then(l=>{if(l.data.result){const g=l.data.result;if(g!=null&&g.filename!=\"\"){G.Success(\"\\u4E0A\\u4F20\\u6210\\u529F,\\u8BF7\\u5237\\u65B0\\u7F13\\u5B58\\u67E5\\u770B\"),u.incr();return}G.Warning(\"\\u4E0A\\u4F20\\u5931\\u8D25\")}})};return(o,n)=>{const l=m(\"icon-right\"),g=m(\"router-link\");return a(),d(\"div\",a0,[e(\"button\",{onClick:n[0]||(n[0]=v=>t.value=!t.value)},[o0,s.value?(a(),d(\"em\",i0)):E(\"\",!0)]),t.value?(a(),d(\"div\",{key:0,class:\"dropdown-bg\",onClick:n[1]||(n[1]=v=>t.value=!t.value)})):E(\"\",!0),c(R,{name:\"fade\"},{default:r(()=>[t.value?(a(),d(\"div\",l0,[c0,e(\"div\",u0,[d0,_0,r0,e(\"label\",p0,[e(\"input\",{type:\"file\",accept:\"image/jpeg, image/jpg, image/png, image/gif\",hidden:\"\",onChange:h},null,32),v0])]),c(g,{to:\"/wizard\",class:\"dropdown-menu_item\"},{default:r(()=>[h0,m0,g0,e(\"div\",f0,[c(l)])]),_:1}),e(\"a\",C0,[$0,w0,F0,e(\"div\",k0,[c(l)])]),e(\"a\",y0,[E0,e(\"span\",null,[o1(\" \\u66F4\\u65B0 \"),s.value?(a(),d(\"em\",L0)):E(\"\",!0)]),x0,e(\"div\",B0,[c(l)])]),e(\"a\",b0,[A0,D0,S0,e(\"div\",M0,[c(l)])])])):E(\"\",!0)]),_:1})])}}});const z0={class:\"f\"},V0={class:\"hostname\"},P0={class:\"r\"},H0=F({__name:\"index\",setup(i){D(),$(!1);const u=$(!1);return(()=>b(this,null,function*(){try{const s=yield M.System.CheckUpdate.GET(),{result:_}=s.data;_&&(u.value=_.needUpdate)}catch(s){console.log(s)}}))(),(s,_)=>(a(),d(\"header\",null,[e(\"div\",z0,[e(\"div\",V0,C(L(i1).HostName),1)]),e(\"div\",P0,[c(n0),c(I0)])]))}});var O0=y(H0,[[\"__scopeId\",\"data-v-6eeee710\"]]);const Z0={},G0={class:\"main-container\"};function U0(i,u){return a(),d(\"div\",G0,[l1(i.$slots,\"default\")])}var N0=y(Z0,[[\"render\",U0]]);const T0={id:\"page\"},j0={class:\"body\"},W0={class:\"f\"},q0={class:\"r\"},R0=F({__name:\"index\",setup(i){const u=D(),t=x(()=>({\"background-image\":`url(/luci-static/istorex/image/bg.gif?t=${u.keys})`})),s=$(0),_=x(()=>({transform:`translateX(${s.value*-100}%)`}));return(h,p)=>(a(),d(\"div\",T0,[e(\"div\",{class:\"bg\",style:T(t.value)},null,4),c(O0),(a(),d(\"div\",{id:\"main\",key:L(u).reloadCount,style:T(_.value),ref:\"el\"},[c(N0,null,{default:r(()=>[e(\"div\",j0,[e(\"div\",W0,[c(Z2)]),e(\"div\",q0,[c(i2),c(W1),c(y1)])])]),_:1})],4))]))}});var J0=y(R0,[[\"__scopeId\",\"data-v-763fd268\"]]);export{J0 as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.b7ccb4ed.js",
    "content": "var p=(o,u,s)=>new Promise((h,c)=>{var f=r=>{try{t(s.next(r))}catch(l){c(l)}},x=r=>{try{t(s.throw(r))}catch(l){c(l)}},t=r=>r.done?h(r.value):Promise.resolve(r.value).then(f,x);t((s=s.apply(o,u)).next())});import{_ as v,d as w,j as B,v as m,k as g,o as a,c as i,a as e,F as k,E as y,z as _,l as n,p as A,q as C,C as M}from\"./index.js?v=5b4be379\";const d=o=>(A(\"data-v-16a9b49b\"),o=o(),C(),o),D={class:\"page-table\"},F=d(()=>e(\"colgroup\",null,[e(\"col\"),e(\"col\"),e(\"col\"),e(\"col\"),e(\"col\"),e(\"col\")],-1)),E=d(()=>e(\"thead\",null,[e(\"tr\",null,[e(\"th\",null,\" \\u72B6\\u6001 \"),e(\"th\",null,\" \\u63A5\\u53E3 \"),e(\"th\",null,\" \\u7C7B\\u578B \"),e(\"th\",null,\" mac \"),e(\"th\",null,\" \\u63A5\\u6536 \"),e(\"th\",null,\" \\u53D1\\u9001 \")])],-1)),b={class:\"flex-icon\"},z=d(()=>e(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\",\"xmlns:v\":\"https://vecta.io/nano\",width:\"48\",height:\"38\",viewBox:\"0 0 12.7 10.05\"},[e(\"defs\",null,[e(\"filter\",{id:\"A\",\"color-interpolation-filters\":\"sRGB\"},[e(\"feColorMatrix\",{result:\"A\",values:\"2 -0.5 -0.5 0 0 -0.5 2 -0.5 0 0 -0.5 -0.5 2 0 0 0 0 0 1 0 \"}),e(\"feColorMatrix\",{values:\"0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0\"}),e(\"feColorMatrix\",{in:\"A\",values:\"2 -0.5 -0.5 0 0 -0.5 2 -0.5 0 0 -0.5 -0.5 2 0 0 0 0 0 1 0 \"})]),e(\"path\",{id:\"B\",d:\"M80.56 75.75h3.91v22.79h-3.91z\"})]),e(\"g\",{transform:\"translate(0 -286.95)\"},[e(\"rect\",{x:\".21\",y:\"287.25\",width:\"12.33\",height:\"9.5\",ry:\".57\",fill:\"#e6e6e6\",stroke:\"#e6e6e6\",\"stroke-linejoin\":\"round\",\"stroke-width\":\".37\",\"paint-order\":\"normal\"}),e(\"path\",{transform:\"matrix(.105 0 0 .0989 -6.0834 280.6)\",d:\"M73.96 75.66h89.41c2.31 0 4.17 1.86 4.17 4.17v52.65h-21.74v9.41h-8.69v12.59h-36.87v-12.59h-8.69v-9.41H69.79V79.83c0-2.31 1.86-4.17 4.17-4.17z\",fill:\"#999\",filter:\"url(#A)\",stroke:\"#999\",\"stroke-width\":\"2.5\"}),e(\"g\",{transform:\"matrix(.1048 0 0 .1048 -6.0999 280.7)\",fill:\"#fff\",filter:\"url(#A)\",stroke:\"#fff\"},[e(\"use\",{\"xlink:href\":\"#B\"}),e(\"use\",{\"xlink:href\":\"#B\",x:\"73.04\"}),e(\"use\",{\"xlink:href\":\"#B\",x:\"52.17\"}),e(\"use\",{\"xlink:href\":\"#B\",x:\"41.74\"}),e(\"use\",{\"xlink:href\":\"#B\",x:\"31.3\"}),e(\"use\",{\"xlink:href\":\"#B\",x:\"20.87\"}),e(\"use\",{\"xlink:href\":\"#B\",x:\"10.43\"}),e(\"use\",{\"xlink:href\":\"#B\",x:\"62.61\"})]),e(\"rect\",{x:\"1.24\",y:\"294.55\",width:\"1.6\",height:\"1.38\",ry:\".11\",fill:\"#ccc\",stroke:\"#ccc\",\"stroke-width\":\".22\",\"paint-order\":\"normal\"})])],-1)),N=d(()=>e(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\",width:\"48\",height:\"38\",viewBox:\"0 0 12.7 10.05\",\"xmlns:v\":\"https://vecta.io/nano\"},[e(\"defs\",null,[e(\"filter\",{id:\"A\",\"color-interpolation-filters\":\"sRGB\"},[e(\"feColorMatrix\",{result:\"A\",values:\"2 -0.5 -0.5 0 0 -0.5 2 -0.5 0 0 -0.5 -0.5 2 0 0 0 0 0 1 0 \"}),e(\"feColorMatrix\",{values:\"0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0\"}),e(\"feColorMatrix\",{in:\"A\",values:\"2 -0.5 -0.5 0 0 -0.5 2 -0.5 0 0 -0.5 -0.5 2 0 0 0 0 0 1 0 \"})]),e(\"path\",{id:\"B\",d:\"M80.56 75.75h3.91v22.79h-3.91z\"})]),e(\"g\",{transform:\"translate(-.03 -287.07)\"},[e(\"rect\",{x:\".24\",y:\"287.36\",width:\"12.33\",height:\"9.5\",ry:\".57\",fill:\"#e6e6e6\",stroke:\"#e6e6e6\",\"stroke-linejoin\":\"round\",\"stroke-width\":\".37\",\"paint-order\":\"normal\"}),e(\"path\",{transform:\"matrix(.105 0 0 .0989 -6.0532 280.72)\",d:\"M73.96 75.66h89.41c2.31 0 4.17 1.86 4.17 4.17v52.65h-21.74v9.41h-8.69v12.59h-36.87v-12.59h-8.69v-9.41H69.79V79.83c0-2.31 1.86-4.17 4.17-4.17z\",fill:\"#4d4d4d\",filter:\"url(#A)\",stroke:\"#4d4d4d\",\"stroke-width\":\"2.5\"}),e(\"g\",{transform:\"matrix(.1048 0 0 .1048 -6.0697 280.81)\",fill:\"#fff\",filter:\"url(#A)\",stroke:\"#fff\"},[e(\"use\",{\"xlink:href\":\"#B\"}),e(\"use\",{\"xlink:href\":\"#B\",x:\"73.04\"}),e(\"use\",{\"xlink:href\":\"#B\",x:\"52.17\"}),e(\"use\",{\"xlink:href\":\"#B\",x:\"41.74\"}),e(\"use\",{\"xlink:href\":\"#B\",x:\"31.3\"}),e(\"use\",{\"xlink:href\":\"#B\",x:\"20.87\"}),e(\"use\",{\"xlink:href\":\"#B\",x:\"10.43\"}),e(\"use\",{\"xlink:href\":\"#B\",x:\"62.61\"})]),e(\"rect\",{x:\"1.27\",y:\"294.67\",width:\"1.6\",height:\"1.38\",ry:\".11\",fill:\"#55d400\",stroke:\"#55d400\",\"stroke-width\":\".22\",\"paint-order\":\"normal\"})])],-1)),S=w({__name:\"index\",setup(o){return p(this,null,function*(){let u,s;const h=B({ports:[]}),c=t=>{switch(t){case\"full\":return\"\\u5168\\u53CC\\u5DE5\";case\"half\":return\"\\u534A\\u53CC\\u5DE5\"}};let f=!1;const x=()=>p(this,null,function*(){try{const t=yield M.Network.PortList.GET();if(t!=null&&t.data){const{result:r}=t==null?void 0:t.data;r&&(h.ports=r.ports||[])}}catch(t){console.log(t)}setTimeout(()=>{f||x()},1e4)});return[u,s]=m(()=>x()),yield u,s(),g(()=>{f=!0}),(t,r)=>(a(),i(\"table\",D,[F,E,e(\"tbody\",null,[(a(!0),i(k,null,y(h.ports,l=>(a(),i(\"tr\",null,[e(\"th\",b,[l.linkState==\"DOWN\"?(a(),i(k,{key:0},[z,_(\"\\u672A\\u8FDE\\u63A5 \")],64)):(a(),i(k,{key:1},[N,_(\" \\u5DF2\\u8FDE\\u63A5 \")],64))]),e(\"th\",null,n(l.name)+\"\\uFF08\"+n(l.interfaceNames.join(\",\").toLocaleUpperCase())+\"\\uFF09 \",1),e(\"th\",null,n(c(l.duplex)),1),e(\"th\",null,n(l.macAddress||\"--\"),1),e(\"th\",null,n(l.rx_packets||\"--\"),1),e(\"th\",null,n(l.tx_packets||\"--\"),1)]))),256))])]))})}});var L=v(S,[[\"__scopeId\",\"data-v-16a9b49b\"]]);export{L as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.d9ea7f57.js",
    "content": "import{_ as u,d as l,u as p,r as t,o as e,c as i,a as m,b as o,w as a,e as s,f as v,S as f,t as x,g as y}from\"./index.js?v=5b4be379\";const h={class:\"body\"},k=l({__name:\"index\",setup(C){const n=p();return(w,B)=>{const _=t(\"layout-header\"),r=t(\"router-view\");return e(),i(\"div\",{id:\"main\",key:y(n).reloadCount},[m(\"div\",h,[o(_),o(r,null,{default:a(({Component:c,route:d})=>[(e(),s(f,null,{default:a(()=>[(e(),s(v(c),{key:d.path}))]),_:2},1024))]),_:1}),o(x)])])}}});var S=u(k,[[\"__scopeId\",\"data-v-5f4eb506\"]]);export{S as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.de33ea3e.js",
    "content": "import{_ as k,d as C,h,u as I,i as l,j as S,k as P,o,c,a as t,l as e,g as r,m as y,n as w,p as A,q as b}from\"./index.js?v=5b4be379\";const s=u=>(A(\"data-v-a9949144\"),u=u(),b(),u),N={id:\"page\",class:\"page-container\"},U={class:\"text-container\"},V={class:\"text-container_item\"},j=s(()=>t(\"div\",{class:\"text-container_item_title\"},[t(\"span\",null,\"\\u8054\\u7F51\\u72B6\\u6001:\")],-1)),H={class:\"text-container_item_value\"},q={key:0},L={key:1},$={key:2},z={key:4},G={class:\"text-container_item\"},J=s(()=>t(\"div\",{class:\"text-container_item_title\"},[t(\"span\",null,\"\\u8FDE\\u63A5\\u65B9\\u5F0F:\")],-1)),K={class:\"text-container_item_value\"},M={class:\"text-container_item\"},O=s(()=>t(\"div\",{class:\"text-container_item_title\"},[t(\"span\",null,\"\\u5728\\u7EBF\\u8BBE\\u5907:\")],-1)),Q={class:\"text-container_item_value\"},R={class:\"text-container_item\"},T=s(()=>t(\"div\",{class:\"text-container_item_title\"},[t(\"span\",null,\"IPv4\\u5730\\u5740:\")],-1)),W={class:\"text-container_item_value\"},X={key:0,class:\"text-container_item\"},Y=s(()=>t(\"div\",{class:\"text-container_item_title\"},[t(\"span\",null,\"IPv6\\u5730\\u5740:\")],-1)),Z={class:\"text-container_item_value\"},tt={class:\"text-container_item\"},et=s(()=>t(\"div\",{class:\"text-container_item_title\"},[t(\"span\",null,\"DNS:\")],-1)),st={class:\"text-container_item_value\"},nt={class:\"text-container\"},at={class:\"text-container_item\"},it=s(()=>t(\"div\",{class:\"text-container_item_title\"},[t(\"span\",null,\"\\u7CFB\\u7EDF\\u540D\\u79F0:\")],-1)),ot={class:\"text-container_item_value\"},ct={class:\"text-container_item\"},_t=s(()=>t(\"div\",{class:\"text-container_item_title\"},[t(\"span\",null,\"\\u56FA\\u4EF6\\u7248\\u672C:\")],-1)),ut={class:\"text-container_item_value\"},lt={class:\"text-container_item\"},rt=s(()=>t(\"div\",{class:\"text-container_item_title\"},[t(\"span\",null,\"\\u5185\\u6838\\u7248\\u672C:\")],-1)),dt={class:\"text-container_item_value\"},vt={class:\"text-container_item\"},pt=s(()=>t(\"div\",{class:\"text-container_item_title\"},[t(\"span\",null,\"\\u5DF2\\u542F\\u52A8:\")],-1)),mt={class:\"text-container_item_value\"},ht={class:\"text-container_item\"},xt=s(()=>t(\"div\",{class:\"text-container_item_title\"},[t(\"span\",null,\"\\u7CFB\\u7EDF\\u65F6\\u95F4:\")],-1)),Ft={class:\"text-container_item_value\"},gt={class:\"text-container\"},Et={class:\"text-container_item\"},Bt={class:\"text-container_item_title\"},Dt={class:\"text-container_item_value\"},ft={class:\"progress-container\"},kt={class:\"text-container_item\"},Ct=s(()=>t(\"div\",{class:\"text-container_item_title\"},[t(\"span\",null,\"CPU:\")],-1)),It={class:\"text-container_item_value\"},St={class:\"progress-container\"},Pt=[\"value\"],yt={class:\"text-container_item\"},wt=s(()=>t(\"div\",{class:\"text-container_item_title\"},[t(\"span\",null,\"\\u5185\\u5B58:\")],-1)),At={class:\"text-container_item_value\"},bt={class:\"progress-container\"},Nt=[\"value\"],Ut=C({__name:\"index\",setup(u){const x=h.stampForm,F=h.stampForm,_=I(),n=l(()=>_.network),g=l(()=>_.device),i=S({cpuusage:0,temperature:0,menavailablePercentage:0,menusage:0}),d=l(()=>_.version),v=l(()=>_.time),E=a=>{switch(a){case\"pppoe\":return\"\\u62E8\\u53F7\\u4E0A\\u7F51\";case\"static\":return\"\\u9759\\u6001\\u7F51\\u7EDC\";case\"dhcp\":return\"DHCP\"}},B=a=>{switch(a){case\"manual\":return\"\\u624B\\u52A8\\u914D\\u7F6E\";case\"auto\":return\"\\u81EA\\u52A8\\u83B7\\u53D6\";default:return\"\"}},D=a=>a.toUpperCase(),p=()=>{_.getSystemData().then(a=>{i.cpuusage=a.cpu.usage,i.temperature=a.cpu.temperature,i.menavailablePercentage=a.memery.availablePercentage||100,i.menusage=100-i.menavailablePercentage})};p();const f=setInterval(()=>{p()},5e3);return P(()=>{clearInterval(f)}),(a,Vt)=>{var m;return o(),c(\"div\",N,[t(\"div\",U,[t(\"div\",V,[j,t(\"div\",H,[n.value.networkInfo==\"netSuccess\"?(o(),c(\"span\",q,\" \\u5DF2\\u8054\\u7F51 (\"+e(r(x)(n.value.uptimeStamp))+\") \",1)):n.value.networkInfo==\"dnsFailed\"?(o(),c(\"span\",L,\" DNS\\u9519\\u8BEF \")):n.value.networkInfo==\"softSourceFailed\"?(o(),c(\"span\",$,\" \\u8F6F\\u4EF6\\u6E90\\u89E3\\u6790\\u9519\\u8BEF \")):(o(),c(\"span\",z,\" \\u68C0\\u6D4B\\u4E2D \"))])]),t(\"div\",G,[J,t(\"div\",K,e(D(n.value.defaultInterface||\"\")),1)]),t(\"div\",M,[O,t(\"div\",Q,e(g.value.devices.length),1)]),t(\"div\",R,[T,t(\"div\",W,e(n.value.ipv4addr)+\"\\uFF08\"+e(E(n.value.proto||\"\"))+\"\\uFF09 \",1)]),n.value.ipv6addr?(o(),c(\"div\",X,[Y,t(\"div\",Z,e(n.value.ipv6addr),1)])):y(\"\",!0),t(\"div\",tt,[et,t(\"div\",st,[t(\"p\",null,e(B(n.value.dnsProto)),1),t(\"p\",null,e((m=n.value.dnsList)==null?void 0:m.join(\", \")),1)])])]),t(\"div\",nt,[t(\"div\",at,[it,t(\"div\",ot,[t(\"span\",null,e(r(w).HostName),1)])]),t(\"div\",ct,[_t,t(\"div\",ut,[t(\"span\",null,e(d.value.firmwareVersion),1)])]),t(\"div\",lt,[rt,t(\"div\",dt,[t(\"span\",null,e(d.value.kernelVersion),1)])]),t(\"div\",vt,[pt,t(\"div\",mt,[t(\"span\",null,e(r(F)(v.value.uptime)),1)])]),t(\"div\",ht,[xt,t(\"div\",Ft,[t(\"span\",null,e(v.value.localtime),1)])])]),t(\"div\",gt,[t(\"div\",Et,[t(\"div\",Bt,[t(\"span\",null,e(a.$t(\"\\u6E29\\u5EA6\"))+\":\",1)]),t(\"div\",Dt,[t(\"div\",ft,[t(\"span\",null,e(i.temperature||\"--\")+\"\\u2103\",1)])])]),t(\"div\",kt,[Ct,t(\"div\",It,[t(\"div\",St,[t(\"progress\",{value:i.cpuusage||0,max:\"100\"},null,8,Pt),t(\"span\",null,e(i.cpuusage)+\"%\",1)])])]),t(\"div\",yt,[wt,t(\"div\",At,[t(\"div\",bt,[t(\"progress\",{value:i.menusage||0,max:\"100\"},null,8,Nt),t(\"span\",null,e(i.menusage)+\"% \",1)])])])])])}}});var Ht=k(Ut,[[\"__scopeId\",\"data-v-a9949144\"]]);export{Ht as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.ead1f974.js",
    "content": "import{d as a,r as e,o as u,e as r,w as s,b as p}from\"./index.js?v=5b4be379\";const m=a({__name:\"index\",setup(i){const t=[{name:\"setting-index\",title:\"\\u529F\\u80FD\\u4FE1\\u606F\",path:\"/router/setting\"},{name:\"opkg\",title:\"\\u8F6F\\u4EF6\\u6E90\\u914D\\u7F6E\",path:\"/router/setting/opkg\"},{name:\"opkg\",title:\"\\u5411\\u5BFC\\u6A21\\u5F0F\",path:\"/wizard\"}];return(_,c)=>{const o=e(\"router-loading\"),n=e(\"layout-page\");return u(),r(n,{menus:t},{default:s(()=>[p(o)]),_:1})}}});export{m as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.f2b02e0d.js",
    "content": "import{d as c,u,i as r,s as d,o as l,c as e,a as t,F as _,E as i,l as s}from\"./index.js?v=5b4be379\";const h={class:\"ul-container\"},p={class:\"ul-container_body\"},m={class:\"page-table\"},v=t(\"colgroup\",null,[t(\"col\"),t(\"col\"),t(\"col\"),t(\"col\")],-1),f=t(\"thead\",null,[t(\"tr\",null,[t(\"th\",null,\"Mac\"),t(\"th\",null,\"IPv4\"),t(\"th\",null,\"IPv6\"),t(\"th\")])],-1),b=t(\"th\",null,null,-1),g=t(\"th\",null,null,-1),E=c({__name:\"index\",setup(x){const o=u(),a=r(()=>o.device.devices);return d(),(y,B)=>(l(),e(\"main\",null,[t(\"ul\",h,[t(\"div\",p,[t(\"table\",m,[v,f,t(\"tbody\",null,[(l(!0),e(_,null,i(a.value,n=>(l(),e(\"tr\",null,[t(\"th\",null,s(n.mac),1),t(\"th\",null,s(n.ipv4addr),1),b,g]))),256))])])])])]))}});export{E as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.fb51d2b2.js",
    "content": "var m=(v,c,d)=>new Promise((l,e)=>{var u=o=>{try{r(d.next(o))}catch(a){e(a)}},i=o=>{try{r(d.throw(o))}catch(a){e(a)}},r=o=>o.done?l(o.value):Promise.resolve(o.value).then(u,i);r((d=d.apply(v,c)).next())});import{d as S,s as h,j as F,v as N,o as p,c as D,a as n,x as _,D as P,F as B,A as I,m as g,l as x,B as k,C as y,T as w}from\"./index.js?v=5b4be379\";const C=[\"onSubmit\"],E=n(\"div\",{class:\"label-name\"},[n(\"span\",null,\"DNS\\u9009\\u9879\")],-1),A={class:\"label-value\"},T=n(\"option\",{value:\"auto\"},\"\\u4F7F\\u7528\\u8FD0\\u8425\\u5546\\u63D0\\u4F9B\\u7684DNS\",-1),V=n(\"option\",{value:\"manual\"},\"\\u81EA\\u5B9A\\u4E49DNS\",-1),G=[T,V],M=n(\"div\",{class:\"label-name\"},[n(\"span\",null,\"DNS\\u670D\\u52A1\\u5668\\u5730\\u5740\")],-1),U={class:\"label-value\"},q=n(\"div\",{class:\"label-name\"},\" \\u5907\\u7528DNS\\u670D\\u52A1\\u5668\\u5730\\u5740 \",-1),j={class:\"label-value\"},L={class:\"label-btns\"},O=[\"disabled\"],z={key:1,class:\"label-msg\"},K=S({__name:\"index\",setup(v){return m(this,null,function*(){let c,d;const l=h(\"\"),e=F({interfaceName:\"\",dnsProto:\"auto\",manualDnsIp:[]}),u=F({dns1:\"\",dns2:\"\"}),i=h(!1),r=()=>m(this,null,function*(){i.value=!0;try{const a=yield y.Guide.DnsConfig.GET();if(a!=null&&a.data){const{result:t}=a.data;if(t){e.dnsProto=t.dnsProto,e.manualDnsIp=t.manualDnsIp||[];for(let s=0;s<e.manualDnsIp.length;s++){s==0?u.dns1=e.manualDnsIp[s]:s==1&&(u.dns2=e.manualDnsIp[s]);break}}}}catch(a){l.value=a}i.value=!1});[c,d]=N(()=>r()),yield c,d();const o=()=>m(this,null,function*(){let a={};switch(e.dnsProto){case\"auto\":break;case\"manual\":a.manualDnsIp=[],e.manualDnsIp!=null&&e.manualDnsIp.length>0?a.manualDnsIp=e.manualDnsIp:(a.manualDnsIp.push(u.dns1),u.dns2&&a.manualDnsIp.push(u.dns2));break}a.dnsProto=e.dnsProto,a.interfaceName=e.interfaceName;const t=w.Loading(\"\\u914D\\u7F6E\\u4E2D...\");try{const s=yield y.Guide.DnsConfig.POST(a);if(s!=null&&s.data){const{success:f,error:b}=s==null?void 0:s.data;b&&(l.value=b),(f==null||f==0)&&(l.value=\"\\u914D\\u7F6E\\u6210\\u529F\")}}catch(s){l.value=s}t.Close()});return(a,t)=>(p(),D(\"form\",{class:\"form-container\",onSubmit:k(o,[\"prevent\"])},[E,n(\"div\",A,[_(n(\"select\",{\"onUpdate:modelValue\":t[0]||(t[0]=s=>e.dnsProto=s)},G,512),[[P,e.dnsProto]])]),e.dnsProto==\"manual\"?(p(),D(B,{key:0},[M,n(\"div\",U,[_(n(\"input\",{type:\"text\",placeholder:\"\\u8BF7\\u8F93\\u5165 dns \\u5730\\u5740\",\"onUpdate:modelValue\":t[1]||(t[1]=s=>u.dns1=s),required:\"\"},null,512),[[I,u.dns1,void 0,{trim:!0}]])]),q,n(\"div\",j,[_(n(\"input\",{type:\"text\",placeholder:\"\\u8BF7\\u8F93\\u5165\\u5907\\u7528 dns \\u5730\\u5740\",\"onUpdate:modelValue\":t[2]||(t[2]=s=>u.dns2=s)},null,512),[[I,u.dns2,void 0,{trim:!0}]])])],64)):g(\"\",!0),n(\"div\",L,[n(\"button\",{class:\"sumbit\",disabled:i.value},\"\\u4FDD\\u5B58\",8,O)]),l.value?(p(),D(\"div\",z,[n(\"span\",null,x(l.value),1)])):g(\"\",!0)],40,C))})}});export{K as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.fdf02bc2.js",
    "content": "var qe=Object.defineProperty,Ue=Object.defineProperties;var He=Object.getOwnPropertyDescriptors;var he=Object.getOwnPropertySymbols;var Re=Object.prototype.hasOwnProperty,We=Object.prototype.propertyIsEnumerable;var Fe=(e,u,n)=>u in e?qe(e,u,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[u]=n,vt=(e,u)=>{for(var n in u||(u={}))Re.call(u,n)&&Fe(e,n,u[n]);if(he)for(var n of he(u))We.call(u,n)&&Fe(e,n,u[n]);return e},ht=(e,u)=>Ue(e,He(u));var T=(e,u,n)=>new Promise((a,d)=>{var F=s=>{try{r(n.next(s))}catch(i){d(i)}},p=s=>{try{r(n.throw(s))}catch(i){d(i)}},r=s=>s.done?a(s.value):Promise.resolve(s.value).then(F,p);r((n=n.apply(e,u)).next())});import{d as V,M as Ge,s as C,r as jt,o,c,a as t,x as L,a0 as ke,F as N,E as K,g as R,m as $,b as x,w as M,l as m,N as Lt,_ as S,C as P,T as A,Y as Ze,p as q,q as U,a4 as ct,$ as tt,Z as bt,X as et,a5 as Bt,e as z,i as W,a2 as Be,A as Y,B as lt,a6 as st,a7 as je,D as Et,z as Z,G as Xt,Q as we,j as mt,h as Nt,U as Qt,u as Ae,P as at,a8 as xe,a9 as Xe,aa as me,I as Qe,O as Ye,ab as Ke,ac as Je,y as it,ad as tu,V as Se,W as eu,k as uu}from\"./index.js?v=5b4be379\";import{c as nu,i as Ft}from\"./chunk.6d3585bb.js\";import{u as su,i as ou,b as au,c as iu,d as lu,e as cu,f as du,g as ru,G as Ht,F as _u,a as pu}from\"./chunk.ffd7724b.js\";var vu=\"/luci-static/istorex/logo.png?v=d233e332\",hu=\"/luci-static/istorex/task.svg?v=f6a42032\",Fu=\"/luci-static/istorex/safari.svg?v=1bf8526f\",mu=\"/luci-static/istorex/setup.svg?v=69c7a200\",fu=\"/luci-static/istorex/logout.svg?v=e9e539f8\",Eu=\"/luci-static/istorex/icon_language_auto.png?v=45447541\",Cu=\"/luci-static/istorex/icon_language_cantonese.png?v=77010a8d\",gu=\"/luci-static/istorex/icon_language_cn.png?v=9b80c184\",$u=\"/luci-static/istorex/icon_language_en.png?v=ea39cc2b\",Zt={exports:{}};(function(e,u){(function(n,a){var d={};n.PubSub?(d=n.PubSub,console.warn(\"PubSub already loaded, using existing version\")):(n.PubSub=d,a(d)),e!==void 0&&e.exports&&(u=e.exports=d),u.PubSub=d,e.exports=u=d})(typeof window==\"object\"&&window||nu,function(n){var a={},d=-1,F=\"*\";function p(l){var E;for(E in l)if(Object.prototype.hasOwnProperty.call(l,E))return!0;return!1}function r(l){return function(){throw l}}function s(l,E,h){try{l(E,h)}catch(k){setTimeout(r(k),0)}}function i(l,E,h){l(E,h)}function _(l,E,h,k){var w=a[E],y=k?i:s,g;if(!!Object.prototype.hasOwnProperty.call(a,E))for(g in w)Object.prototype.hasOwnProperty.call(w,g)&&y(w[g],l,h)}function f(l,E,h){return function(){var w=String(l),y=w.lastIndexOf(\".\");for(_(l,l,E,h);y!==-1;)w=w.substr(0,y),y=w.lastIndexOf(\".\"),_(l,w,E,h);_(l,F,E,h)}}function b(l){var E=String(l),h=Boolean(Object.prototype.hasOwnProperty.call(a,E)&&p(a[E]));return h}function D(l){for(var E=String(l),h=b(E)||b(F),k=E.lastIndexOf(\".\");!h&&k!==-1;)E=E.substr(0,k),k=E.lastIndexOf(\".\"),h=b(E);return h}function v(l,E,h,k){l=typeof l==\"symbol\"?l.toString():l;var w=f(l,E,k),y=D(l);return y?(h===!0?w():setTimeout(w,0),!0):!1}n.publish=function(l,E){return v(l,E,!1,n.immediateExceptions)},n.publishSync=function(l,E){return v(l,E,!0,n.immediateExceptions)},n.subscribe=function(l,E){if(typeof E!=\"function\")return!1;l=typeof l==\"symbol\"?l.toString():l,Object.prototype.hasOwnProperty.call(a,l)||(a[l]={});var h=\"uid_\"+String(++d);return a[l][h]=E,h},n.subscribeAll=function(l){return n.subscribe(F,l)},n.subscribeOnce=function(l,E){var h=n.subscribe(l,function(){n.unsubscribe(h),E.apply(this,arguments)});return n},n.clearAllSubscriptions=function(){a={}},n.clearSubscriptions=function(E){var h;for(h in a)Object.prototype.hasOwnProperty.call(a,h)&&h.indexOf(E)===0&&delete a[h]},n.countSubscriptions=function(E){var h,k,w=0;for(h in a)if(Object.prototype.hasOwnProperty.call(a,h)&&h.indexOf(E)===0){for(k in a[h])w++;break}return w},n.getSubscriptions=function(E){var h,k=[];for(h in a)Object.prototype.hasOwnProperty.call(a,h)&&h.indexOf(E)===0&&k.push(h);return k},n.unsubscribe=function(l){var E=function(I){var O;for(O in a)if(Object.prototype.hasOwnProperty.call(a,O)&&O.indexOf(I)===0)return!0;return!1},h=typeof l==\"string\"&&(Object.prototype.hasOwnProperty.call(a,l)||E(l)),k=!h&&typeof l==\"string\",w=typeof l==\"function\",y=!1,g,B,H;if(h){n.clearSubscriptions(l);return}for(g in a)if(Object.prototype.hasOwnProperty.call(a,g)){if(B=a[g],k&&B[l]){delete B[l],y=l;break}if(w)for(H in B)Object.prototype.hasOwnProperty.call(B,H)&&B[H]===l&&(delete B[H],y=!0)}return y}})})(Zt,Zt.exports);var Ie=Zt.exports;const Ct=e=>(q(\"data-v-019a9ac0\"),e=e(),U(),e),bu={class:\"header\"},yu=Ct(()=>t(\"img\",{src:vu,alt:\"logo\"},null,-1)),Du={class:\"menu\"},ku={class:\"language\"},Bu={class:\"actions\"},wu=[\"onClick\"],Au=[\"src\"],xu=[\"src\"],Su=[\"src\"],Iu=[\"src\"],Pu={class:\"task\"},Vu={key:0,class:\"dropdown-container\"},Mu={class:\"title\"},Tu=Ct(()=>t(\"span\",null,\"\\u5B89\\u88C5\\u4EFB\\u52A1\",-1)),Lu=Ct(()=>t(\"div\",{class:\"auto\"},null,-1)),zu={class:\"dropdown-container_menus\"},Ou={class:\"dropdown-menu_item\"},Nu=Ct(()=>t(\"div\",{class:\"auto\"},null,-1)),qu={class:\"status\"},Uu={key:0},Hu={key:1},Ru={class:\"btn\"},Wu=Ct(()=>t(\"span\",null,\" \\u5B89\\u88C5\\u4E2D \",-1)),Gu={class:\"wizard\"},Zu={key:0,class:\"dropdown-container\",style:{width:\"140px\"}},ju=Ct(()=>t(\"h2\",{class:\"title\"},\"\\u5207\\u6362\\u5411\\u5BFC\\u6A21\\u5F0F\",-1)),Xu=Ct(()=>t(\"a\",{href:\"/cgi-bin/luci/admin/quickstart/\"},[t(\"img\",{width:\"28\",height:\"28\",title:\"\\u5207\\u6362\\u81F3\\u666E\\u901A\\u7248\\u672C\",src:mu,alt:\"setup\"})],-1)),Qu=Ct(()=>t(\"a\",{href:\"/cgi-bin/luci/admin/logout\"},[t(\"img\",{width:\"28\",height:\"28\",title:\"\\u6CE8\\u9500\",src:fu,alt:\"logout\"})],-1)),Yu=V({__name:\"index\",setup(e){const u=Ge(),n=C(!1),a=C(localStorage.getItem(\"i18n\")),d=()=>{n.value=!n.value},F=g=>b.value.indexOf(g)!=-1,p=g=>D.value.indexOf(g)!=-1,r=g=>{let B=\"\";g===0&&(B=\"auto\"),g===1&&(B=\"zh-CN\"),g===2&&(B=\"zh-TW\"),g===3&&(B=\"en\"),a.value=B,localStorage.setItem(\"i18n\",B),B===\"auto\"?ct.global.locale=navigator.language:ct.global.locale=B,Ie.publish(\"changeLocale\",B)},s=C(!1),i=C(!1),_=C(!1),f=C([]),b=C([]),D=C([]),v=()=>T(this,null,function*(){try{const g=yield P.Quickstart.SetupResult.GET();if(g.data){const{result:B,error:H}=g.data;g.data.success==0&&B&&(f.value=B.packages||[],b.value=B.success||[],D.value=B.failed||[])}}catch(g){console.log(g)}});let l=!1;setTimeout(()=>T(this,null,function*(){yield v(),localStorage.getItem(\"nas_guide_init\")&&(l=!0,s.value=!0)}),1e3);const E=()=>T(this,null,function*(){_.value||(yield k(\"router\"))}),h=()=>T(this,null,function*(){_.value||(yield k(\"next-nas\"))}),k=g=>T(this,null,function*(){_.value=!0;try{const B=yield P.Istorex.Updata.POST({model:g});if(A.Success(\"\\u64CD\\u4F5C\\u6210\\u529F\"),B.data){const{success:H,error:I}=B.data;if(I)throw I;H===0&&u.push({path:`/${g}`})}}catch(B){A.Error(`${B}`)}finally{_.value=!1}}),w=()=>{s.value=!1,l&&localStorage.removeItem(\"nas_guide_init\")},y=()=>{Ze.autoSetup.Open()};return(g,B)=>{const H=jt(\"icon-loading\");return o(),c(\"div\",bu,[yu,t(\"div\",Du,[t(\"span\",ku,[L(t(\"div\",Bu,[t(\"div\",{class:\"menu_background\",onClick:d}),t(\"ul\",null,[(o(),c(N,null,K([\"Auto\",\"\\u7B80\\u4F53\\u4E2D\\u6587\",\"\\u7E41\\u4F53\\u4E2D\\u6587\",\"\\u82F1\\u6587\"],(I,O)=>t(\"li\",{onClick:nt=>r(O)},m(I),9,wu)),64))])],512),[[ke,n.value]]),a.value===\"auto\"?(o(),c(\"img\",{key:0,width:\"28\",height:\"28\",src:R(Eu),onClick:d},null,8,Au)):$(\"\",!0),a.value===\"zh-CN\"?(o(),c(\"img\",{key:1,width:\"28\",height:\"28\",src:R(gu),onClick:d},null,8,xu)):$(\"\",!0),a.value===\"zh-TW\"?(o(),c(\"img\",{key:2,width:\"28\",height:\"28\",src:R(Cu),onClick:d},null,8,Su)):$(\"\",!0),a.value===\"en\"?(o(),c(\"img\",{key:3,width:\"28\",height:\"28\",src:R($u),onClick:d},null,8,Iu)):$(\"\",!0)]),t(\"div\",Pu,[t(\"img\",{onClick:B[0]||(B[0]=I=>s.value=!s.value),width:\"28\",height:\"28\",title:\"\\u5B89\\u88C5\\u4EFB\\u52A1\\u8FDB\\u5EA6\",src:hu,alt:\"logo\"}),s.value?(o(),c(\"div\",{key:0,class:\"dropdown-bg\",onClick:w})):$(\"\",!0),x(Lt,null,{default:M(()=>[s.value?(o(),c(\"div\",Vu,[t(\"h2\",Mu,[Tu,t(\"span\",null,\"(\"+m(b.value.length+D.value.length+\"/\"+f.value.length)+\")\",1),Lu,t(\"a\",{onClick:y},\"\\u67E5\\u770B\\u65E5\\u5FD7\")]),t(\"div\",zu,[(o(!0),c(N,null,K(f.value,I=>(o(),c(\"div\",Ou,[t(\"span\",null,m(I),1),Nu,t(\"div\",qu,[F(I)?(o(),c(\"span\",Uu,\" \\u6210\\u529F \")):p(I)?(o(),c(\"span\",Hu,\" \\u5931\\u8D25 \")):(o(),c(N,{key:2},[t(\"div\",Ru,[x(H)]),Wu],64))])]))),256))])])):$(\"\",!0)]),_:1})]),t(\"div\",Gu,[t(\"img\",{onClick:B[1]||(B[1]=I=>i.value=!i.value),width:\"28\",height:\"28\",title:\"\\u5411\\u5BFC\\u6A21\\u5F0F\",src:Fu,alt:\"safari\"}),i.value?(o(),c(\"div\",{key:0,class:\"dropdown-bg\",onClick:B[2]||(B[2]=I=>i.value=!1)})):$(\"\",!0),x(Lt,{name:\"fade\"},{default:M(()=>[i.value?(o(),c(\"div\",Zu,[ju,t(\"div\",{class:\"dropdown-menu_item\",style:{\"margin-bottom\":\"8px\"},onClick:E},\" \\u8DEF\\u7531\\u6A21\\u5F0F \"),t(\"div\",{class:\"dropdown-menu_item\",onClick:h},\"NAS\\u6A21\\u5F0F\")])):$(\"\",!0)]),_:1})]),Xu,Qu])])}}});var Ku=S(Yu,[[\"__scopeId\",\"data-v-019a9ac0\"]]);const Ju={},tn={class:\"SearchBar\"},en=[\"placeholder\"];function un(e,u){return o(),c(\"div\",tn,[t(\"input\",{placeholder:e.$t(\"\\u5E94\\u7528\\u641C\\u7D22\")},null,8,en)])}var nn=S(Ju,[[\"render\",un],[\"__scopeId\",\"data-v-a531abbc\"]]);const sn={class:\"widget\"},on={key:0,class:\"title\"},an=V({__name:\"index\",props:{title:{},height:{},maxHeight:{},contentStyle:{}},setup(e){const u=e;return(n,a)=>(o(),c(\"div\",sn,[t(\"div\",{style:tt(`height: ${u.height};max-height:${u.maxHeight}`)},[u.title?(o(),c(\"span\",on,m(u.title),1)):$(\"\",!0),t(\"div\",{style:tt(u.contentStyle)},[bt(n.$slots,\"default\",{},void 0,!0)],4)],4)]))}});var ft=S(an,[[\"__scopeId\",\"data-v-261e10c6\"]]);const ln={},cn={t:\"1640746738262\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"1216\",width:\"128\",height:\"128\"},dn=t(\"path\",{d:\"M511.232 438.8352L112.9984 40.6016A51.2 51.2 0 0 0 40.6016 112.9984L438.784 511.232 40.6016 909.4656a51.2 51.2 0 1 0 72.3968 72.448l398.2336-398.2848 398.2336 398.2848a51.2 51.2 0 1 0 72.448-72.448l-398.2848-398.2336 398.2848-398.2336A51.2 51.2 0 0 0 909.4656 40.6016L511.232 438.784z\",\"p-id\":\"1217\"},null,-1),rn=[dn];function _n(e,u){return o(),c(\"svg\",cn,rn)}var pn=S(ln,[[\"render\",_n]]);const vn=e=>(q(\"data-v-664f08dd\"),e=e(),U(),e),hn={id:\"actioner\"},Fn={key:0,class:\"action-container\"},mn={class:\"action-container_header\"},fn=vn(()=>t(\"div\",null,null,-1)),En={class:\"title\"},Cn={class:\"action-container_body\"},gn=V({__name:\"index\",props:{Close:{type:Function},type:{type:Number},title:String},setup(e){const u=e,n=C(!1);et(()=>{n.value=!0,document.body.setAttribute(\"lock-scroll\",\"true\")}),Bt(()=>{document.body.removeAttribute(\"lock-scroll\")});const a=()=>{u.Close&&(n.value=!1,setTimeout(()=>{u.Close&&u.Close()},300))};return(d,F)=>(o(),c(\"div\",hn,[t(\"div\",{class:\"bg\",onClick:a}),e.type!=null?bt(d.$slots,\"default\",{key:0},void 0,!0):(o(),c(N,{key:1},[n.value?(o(),c(\"div\",Fn,[t(\"div\",mn,[fn,t(\"div\",En,m(e.title),1),t(\"button\",{class:\"close\",title:\"\\u5173\\u95ED\",onClick:a},[x(pn)])]),t(\"div\",Cn,[bt(d.$slots,\"default\",{},void 0,!0)])])):$(\"\",!0)],64))]))}});var $n=S(gn,[[\"__scopeId\",\"data-v-664f08dd\"]]);const ot=V({__name:\"modal\",props:{Close:{type:Function},type:{type:Number},title:String},setup(e){return(u,n)=>(o(),z($n,{Close:e.Close,type:e.type,title:e.title},{default:M(()=>[bt(u.$slots,\"default\")]),_:3},8,[\"Close\",\"type\",\"title\"]))}}),bn={},yn={t:\"1649907260906\",viewBox:\"-8 248 1042 530\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2793\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},Dn=t(\"path\",{d:\"M764.904497 251.418146 259.086289 251.418146c-143.076626 0-259.065314 115.989711-259.065314 259.065314 0 143.077649 115.988688 259.063267 259.065314 259.063267l505.818207 0c143.074579 0 259.063267-115.985618 259.063267-259.063267C1023.967764 367.407857 907.980099 251.418146 764.904497 251.418146zM764.904497 747.164974c-130.507356 0-236.682537-106.175181-236.682537-236.682537S634.397141 273.798876 764.904497 273.798876s236.683561 106.176205 236.683561 236.683561S895.411853 747.164974 764.904497 747.164974z\",\"p-id\":\"2794\",fill:\"#52C41A\"},null,-1),kn=[Dn];function Bn(e,u){return o(),c(\"svg\",yn,kn)}var wn=S(bn,[[\"render\",Bn]]);const An={},xn={t:\"1649907515643\",viewBox:\"-8 248 1042 530\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2971\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},Sn=t(\"path\",{d:\"M764.867148 249.793136 259.0735 249.793136c-143.070486 0-259.052011 115.984594-259.052011 259.052011 0 143.07151 115.982548 259.050987 259.052011 259.050987l505.793648 0c143.067416 0 259.050987-115.979478 259.050987-259.050987C1023.917112 365.778754 907.933541 249.793136 764.867148 249.793136zM259.0735 745.516428c-130.501216 0-236.671281-106.172111-236.671281-236.671281 0-130.501216 106.170065-236.671281 236.671281-236.671281S495.744781 378.344954 495.744781 508.84617C495.744781 639.34534 389.574716 745.516428 259.0735 745.516428z\",\"p-id\":\"2972\",fill:\"#999\"},null,-1),In=[Sn];function Pn(e,u){return o(),c(\"svg\",xn,In)}var Vn=S(An,[[\"render\",Pn]]);const Mn={class:\"checkbox_switch_on\"},Tn={class:\"checkbox_switch_off\"},Ln=V({__name:\"index\",props:{modelValue:{type:Boolean,required:!0},height:{type:String,default:\"100%\"}},emits:[\"update:modelValue\"],setup(e,{emit:u}){const n=e,a=W({get:()=>n.modelValue.valueOf(),set:d=>u(\"update:modelValue\",d)});return(d,F)=>(o(),c(\"label\",{class:\"checkbox_switch\",style:tt({height:e.height})},[L(t(\"input\",{type:\"checkbox\",\"onUpdate:modelValue\":F[0]||(F[0]=p=>a.value=p)},null,512),[[Be,a.value]]),t(\"span\",Mn,[x(wn)]),t(\"span\",Tn,[x(Vn)]),bt(d.$slots,\"default\",{},void 0,!0)],4))}});var zn=S(Ln,[[\"__scopeId\",\"data-v-1b6cddbc\"]]);const J=e=>(q(\"data-v-76799e09\"),e=e(),U(),e),On=[\"onSubmit\"],Nn=J(()=>t(\"div\",{class:\"actioner-dns_header\"},[t(\"span\",null,\"\\u5185\\u7F51\\u914D\\u7F6E\")],-1)),qn={class:\"actioner-dns_body\"},Un={class:\"label-item\"},Hn=J(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"IPv4\\u5730\\u5740\")],-1)),Rn={class:\"label-item_value\"},Wn={class:\"label-item\"},Gn=J(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"IPv4\\u5B50\\u7F51\\u63A9\\u7801\")],-1)),Zn={class:\"label-item_value\"},jn={key:0,class:\"chose_dhcp\"},Xn={key:0,class:\"dhcp_info\"},Qn={key:1,class:\"dhcp_info\"},Yn={class:\"label-item\"},Kn=J(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"IP\\u6C60\\u8D77\\u59CB\\u5730\\u5740\")],-1)),Jn={class:\"label-item_value\"},ts={class:\"label-item\"},es=J(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"IP\\u6C60\\u7ED3\\u675F\\u5730\\u5740\")],-1)),us={class:\"label-item_value\"},ns={class:\"actioner-dns_footer\"},ss=[\"disabled\"],os={key:1,class:\"actioner-dns\"},as=J(()=>t(\"div\",{class:\"actioner-dns_header\"},[t(\"span\",null,\"\\u66F4\\u6362\\u914D\\u7F6E\")],-1)),is={class:\"actioner-dns_body\"},ls={key:0,class:\"setting_status\"},cs=J(()=>t(\"div\",{class:\"success_icon\"},[t(\"svg\",{t:\"1642063181211\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"5062\",width:\"128\",height:\"128\"},[t(\"path\",{d:\"M512 85.333333c235.648 0 426.666667 191.018667 426.666667 426.666667s-191.018667 426.666667-426.666667 426.666667S85.333333 747.648 85.333333 512 276.352 85.333333 512 85.333333z m-74.965333 550.4L346.453333 545.152a42.666667 42.666667 0 1 0-60.330666 60.330667l120.704 120.704a42.666667 42.666667 0 0 0 60.330666 0l301.653334-301.696a42.666667 42.666667 0 1 0-60.288-60.330667l-271.530667 271.488z\",fill:\"#52C41A\",\"p-id\":\"5063\"})])],-1)),ds=J(()=>t(\"div\",{class:\"config-message\"},\"\\u914D\\u7F6E\\u6210\\u529F\",-1)),rs=[\"href\"],_s={key:1,class:\"setting_status\"},ps=J(()=>t(\"div\",{class:\"success_icon\"},[t(\"svg\",{t:\"1642063200324\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"5898\",width:\"128\",height:\"128\"},[t(\"path\",{d:\"M549.044706 512l166.189176-166.249412a26.383059 26.383059 0 0 0 0-36.98447 26.383059 26.383059 0 0 0-37.044706 0L512 475.015529l-166.249412-166.249411a26.383059 26.383059 0 0 0-36.98447 0 26.383059 26.383059 0 0 0 0 37.044706L475.015529 512l-166.249411 166.249412a26.383059 26.383059 0 0 0 0 36.98447 26.383059 26.383059 0 0 0 37.044706 0L512 548.984471l166.249412 166.249411a26.383059 26.383059 0 0 0 36.98447 0 26.383059 26.383059 0 0 0 0-37.044706L548.984471 512zM512 1024a512 512 0 1 1 0-1024 512 512 0 0 1 0 1024z\",fill:\"#E84335\",\"p-id\":\"5899\"})])],-1)),vs=J(()=>t(\"div\",{class:\"config-message\"},\"\\u914D\\u7F6E\\u5931\\u8D25\",-1)),hs=J(()=>t(\"p\",null,\"\\u8BF7\\u5C1D\\u8BD5\\u91CD\\u65B0\\u914D\\u7F6E\",-1)),Fs={key:2,class:\"setting_status\"},ms=J(()=>t(\"div\",{class:\"success_icon\"},[t(\"svg\",{width:\"128px\",height:\"128px\",viewBox:\"0 0 128 128\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},[t(\"g\",{id:\"icon_yellow\",stroke:\"none\",\"stroke-width\":\"1\",fill:\"none\",\"fill-rule\":\"evenodd\"},[t(\"g\",{id:\"Icon/Warning\"},[t(\"rect\",{id:\"\\u77E9\\u5F62\",fill:\"#000000\",\"fill-rule\":\"nonzero\",opacity:\"0\",x:\"0\",y:\"0\",width:\"128\",height:\"128\"}),t(\"path\",{d:\"M64,8 C33.075,8 8,33.075 8,64 C8,94.925 33.075,120 64,120 C94.925,120 120,94.925 120,64 C120,33.075 94.925,8 64,8 Z M60,37 C60,36.45 60.45,36 61,36 L67,36 C67.55,36 68,36.45 68,37 L68,71 C68,71.55 67.55,72 67,72 L61,72 C60.45,72 60,71.55 60,71 L60,37 Z M64,92 C60.6875,92 58,89.3125 58,86 C58,82.6875 60.6875,80 64,80 C67.3125,80 70,82.6875 70,86 C70,89.3125 67.3125,92 64,92 Z\",id:\"\\u5F62\\u72B6\",fill:\"#FAAD14\"})])])])],-1)),fs=J(()=>t(\"div\",{class:\"config-message\"},\"\\u914D\\u7F6E\\u8D85\\u65F6\",-1)),Es=J(()=>t(\"p\",null,\" \\u8DEF\\u7531\\u5668 IP \\u53EF\\u80FD\\u5DF2\\u7ECF\\u4FEE\\u6539\\u6210\\u529F\\u3002\\u82E5\\u5237\\u65B0\\u9875\\u9762\\u5931\\u8D25\\uFF0C\\u8BF7\\u91CD\\u65B0\\u8FDE\\u63A5\\u8DEF\\u7531\\u5668\\uFF0C\\u5426\\u5219\\u8BF7\\u5C1D\\u8BD5\\u91CD\\u65B0\\u914D\\u7F6E\\u3002 \",-1)),Cs=V({__name:\"index\",props:{Close:{type:Function,required:!0}},setup(e){const u=e,n=C(0),a=C({lanIp:\"\",netMask:\"255.255.255.0\",enableDhcp:!1,dhcpStart:\"\",dhcpEnd:\"\"});C(\"\");const d=C(!1);C(!0),C(!1);const F=C(\"\"),p=C(2),r=C(!1),s=C(\"timeout\");let i=!0;(()=>{P.Guide.GetLan.GET().then(l=>{l.data.result&&(r.value=l.data.result.enableDhcp||!1,l.data.result.enableDhcp=!1,a.value=l.data.result,l.data.result.lanIp!==location.hostname&&(i=!1))})})();const f=()=>{const l=a.value;if(!Ft.isValidIPv4(l.lanIp)){A.Warning(\"IPv4\\u5730\\u5740\\u683C\\u5F0F\\u9519\\u8BEF\");return}if(!Ft.isValidMask(l.netMask)){A.Warning(\"IPv4\\u5B50\\u7F51\\u63A9\\u7801\\u683C\\u5F0F\\u9519\\u8BEF\");return}const E=Ft.calcMaskRange(l.lanIp,l.netMask);l.dhcpStart=E[0],l.dhcpEnd=E[1],a.value=l},b=()=>{const l=a.value;if(!Ft.isValidIPv4(l.lanIp)){A.Warning(\"IPv4\\u5730\\u5740\\u683C\\u5F0F\\u9519\\u8BEF\");return}if(!Ft.isValidMask(l.netMask)){A.Warning(\"IPv4\\u5B50\\u7F51\\u63A9\\u7801\\u683C\\u5F0F\\u9519\\u8BEF\");return}if(l.enableDhcp&&!(Ft.isValidIPv4(l.dhcpStart)&&Ft.isValidIPv4(l.dhcpEnd)&&Ft.isValidMaskRange(l.lanIp,l.netMask,l.dhcpStart,l.dhcpEnd))){A.Warning(\"DHCP\\u7684IP\\u6C60\\u683C\\u5F0F\\u9519\\u8BEF\\u6216\\u8D85\\u51FA\\u5B50\\u7F51\\u8303\\u56F4\");return}const E=A.Loading(\"\\u6B63\\u5728\\u914D\\u7F6E\\u2026\\u8BF7\\u7A0D\\u7B49\",30);let h=0;const k=y=>{s.value=y,n.value=1,h=1,E.Close()},w=()=>{const y=new Date().getTime()+3e4,g=i?location.protocol+\"//\"+l.lanIp+(location.port?\":\"+location.port:\"\"):location.origin,B=g+\"/luci-static/resources/icons/loading.gif\",H=()=>{h==0&&(new Date().getTime()>y?k(\"timeout\"):window.setTimeout(O,2e3))},I=()=>{h==0&&(F.value=g+location.pathname,k(\"success\"),window.setTimeout(()=>{p.value=1},1e3),window.setTimeout(()=>{location.href=F.value},2e3))},O=()=>{if(h!=0)return;console.log(\"check online \",B);const nt=new Image;nt.onload=I,nt.onerror=H,nt.src=B};window.setTimeout(O,5e3)};P.Guide.LanIp.POST(l).then(y=>{var g;if(y!=null&&y.data){if((y.data.success||0)==0)return;if((g=y.data)!=null&&g.error)throw y.data.error}throw\"\\u672A\\u77E5\\u9519\\u8BEF\"}).catch(y=>{h==0&&(k(\"fail\"),A.Error(y))}),w(),window.setTimeout(()=>{h==0&&k(\"timeout\")},3e4)},D=l=>{l.preventDefault(),u.Close&&u.Close()},v=l=>{location.reload()};return(l,E)=>(o(),z(ot,{Close:e.Close,type:1},{default:M(()=>[n.value==0?(o(),c(\"form\",{key:0,class:\"actioner-dns\",onSubmit:lt(b,[\"prevent\"])},[Nn,t(\"div\",qn,[t(\"div\",Un,[Hn,t(\"div\",Rn,[L(t(\"input\",{type:\"text\",placeholder:\"192.168.100.1\",required:\"\",\"onUpdate:modelValue\":E[0]||(E[0]=h=>a.value.lanIp=h),onChange:f},null,544),[[Y,a.value.lanIp,void 0,{trim:!0}]])])]),t(\"div\",Wn,[Gn,t(\"div\",Zn,[L(t(\"input\",{type:\"text\",placeholder:\"255.255.255.0\",required:\"\",\"onUpdate:modelValue\":E[1]||(E[1]=h=>a.value.netMask=h),onChange:f},null,544),[[Y,a.value.netMask,void 0,{trim:!0}]])])]),r.value?(o(),c(\"div\",jn,[x(zn,{modelValue:a.value.enableDhcp,\"onUpdate:modelValue\":E[2]||(E[2]=h=>a.value.enableDhcp=h)},{default:M(()=>[a.value.enableDhcp?(o(),c(\"span\",Xn,\"\\u4FEE\\u6539DHCP\\u670D\\u52A1\")):(o(),c(\"span\",Qn,\"\\u4FDD\\u6301DHCP\\u670D\\u52A1\\u8BBE\\u7F6E\"))]),_:1},8,[\"modelValue\"])])):$(\"\",!0),a.value.enableDhcp?(o(),c(N,{key:1},[t(\"div\",Yn,[Kn,t(\"div\",Jn,[L(t(\"input\",{type:\"text\",placeholder:\"192.168.100.100\",required:\"\",\"onUpdate:modelValue\":E[3]||(E[3]=h=>a.value.dhcpStart=h)},null,512),[[Y,a.value.dhcpStart,void 0,{trim:!0}]])])]),t(\"div\",ts,[es,t(\"div\",us,[L(t(\"input\",{type:\"text\",placeholder:\"192.168.100.100\",required:\"\",\"onUpdate:modelValue\":E[4]||(E[4]=h=>a.value.dhcpEnd=h)},null,512),[[Y,a.value.dhcpEnd,void 0,{trim:!0}]])])])],64)):$(\"\",!0)]),t(\"div\",ns,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",disabled:d.value},\" \\u786E\\u8BA4 \",8,ss),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:D},\" \\u53D6\\u6D88 \")])],40,On)):n.value==1?(o(),c(\"div\",os,[as,t(\"div\",is,[s.value==\"success\"?(o(),c(\"div\",ls,[cs,ds,t(\"a\",{href:F.value,class:\"NewAdress\"},m(p.value)+\"s\\u540E \\u8DF3\\u8F6C\\u65B0\\u5730\\u5740\",9,rs)])):s.value==\"fail\"?(o(),c(\"div\",_s,[ps,vs,hs,t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",onClick:v},\" \\u6211\\u77E5\\u9053\\u4E86 \")])):s.value==\"timeout\"?(o(),c(\"div\",Fs,[ms,fs,Es,t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",onClick:v},\" \\u5237\\u65B0\\u9875\\u9762 \")])):$(\"\",!0)])])):$(\"\",!0)]),_:1},8,[\"Close\"]))}});var gs=S(Cs,[[\"__scopeId\",\"data-v-76799e09\"]]);const fe=()=>{const e=document.createElement(\"div\");document.body.appendChild(e);const u=st(gs,{Close:()=>{n()}});u.mount(e);const n=()=>{u.unmount(),e.remove()};return{Close:n}};const yt=e=>(q(\"data-v-95c09170\"),e=e(),U(),e),$s=[\"onSubmit\"],bs=yt(()=>t(\"div\",{class:\"actioner-dns_header\"},[t(\"span\",null,\"DNS\\u914D\\u7F6E\")],-1)),ys={class:\"actioner-dns_body\"},Ds={class:\"label-item\"},ks=yt(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"DNS\\u9009\\u9879\")],-1)),Bs={class:\"label-item_value\"},ws=[\"disabled\"],As=yt(()=>t(\"option\",{value:\"manual\"},\"\\u81EA\\u5B9A\\u4E49DNS\",-1)),xs={class:\"label-item\"},Ss=yt(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"DNS\\u670D\\u52A1\\u5668\\u5730\\u5740\")],-1)),Is={class:\"label-item_value\"},Ps=[\"onUpdate:modelValue\"],Vs=yt(()=>t(\"div\",{class:\"label-item_key\"},\"\\u5907\\u7528DNS\\u670D\\u52A1\\u5668\\u5730\\u5740\",-1)),Ms={class:\"label-item_value\"},Ts=[\"onUpdate:modelValue\"],Ls={key:1,class:\"label-message\"},zs={class:\"actioner-dns_footer\"},Os=[\"disabled\"],Ns={key:1,class:\"actioner-dns\"},qs=yt(()=>t(\"div\",{class:\"actioner-dns_header\"},[t(\"span\",null,\"DNS\\u914D\\u7F6E\")],-1)),Us=yt(()=>t(\"div\",{class:\"actioner-dns_body\"},[t(\"div\",{class:\"config-message\"},\"DNS\\u914D\\u7F6E\\u5DF2\\u4FDD\\u5B58\")],-1)),Hs=V({__name:\"index\",props:{Close:{type:Function,required:!0}},setup(e){const u=e,n=C(0),a=je(),d=a.status,F=W(()=>a.status.proto!=\"static\"),p=()=>{let D=d.dnsList||[];for(D=D.filter(v=>v);D.length<2;)D.push(\"\");return D},r=C({interfaceName:d.defaultInterface||\"\",dnsProto:d.dnsProto||\"manual\",manualDnsIp:p()}),s=C(\"\"),i=C(!1),_=()=>T(this,null,function*(){s.value=\"\";let D={};switch(r.value.dnsProto){case\"auto\":break;case\"manual\":if(D.manualDnsIp=[],!r.value.manualDnsIp[0]){A.Error(\"\\u81F3\\u5C11\\u9700\\u8981\\u586B\\u5199\\u4E00\\u4E2ADNS\");return}D.manualDnsIp=r.value.manualDnsIp.filter(l=>l);break}D.dnsProto=r.value.dnsProto,D.interfaceName=r.value.interfaceName;const v=A.Loading(\"\\u914D\\u7F6E\\u4E2D...\");try{const l=yield P.Guide.DnsConfig.POST(D);if(l!=null&&l.data){const{success:E,error:h}=l==null?void 0:l.data;h&&(s.value=h),(E==null||E==0)&&(A.Success(\"\\u914D\\u7F6E\\u6210\\u529F\"),n.value=1)}}catch(l){s.value=l}v.Close()}),f=D=>{D.preventDefault(),u.Close&&u.Close()},b=D=>{location.reload()};return(D,v)=>(o(),z(ot,{Close:e.Close,type:1},{default:M(()=>[n.value==0?(o(),c(\"form\",{key:0,class:\"actioner-dns\",onSubmit:lt(_,[\"prevent\"])},[bs,t(\"div\",ys,[t(\"div\",Ds,[ks,t(\"div\",Bs,[L(t(\"select\",{\"onUpdate:modelValue\":v[0]||(v[0]=l=>r.value.dnsProto=l)},[t(\"option\",{value:\"auto\",disabled:!F.value},\" \\u81EA\\u52A8\\u83B7\\u53D6DNS \",8,ws),As],512),[[Et,r.value.dnsProto]])])]),r.value.dnsProto==\"manual\"?(o(!0),c(N,{key:0},K(r.value.manualDnsIp,(l,E)=>(o(),c(\"div\",xs,[E==0?(o(),c(N,{key:0},[Ss,t(\"div\",Is,[L(t(\"input\",{type:\"text\",placeholder:\"\\u8BF7\\u8F93\\u5165DNS\\u5730\\u5740\",required:\"\",\"onUpdate:modelValue\":h=>r.value.manualDnsIp[E]=h},null,8,Ps),[[Y,r.value.manualDnsIp[E],void 0,{trim:!0}]])])],64)):(o(),c(N,{key:1},[Vs,t(\"div\",Ms,[L(t(\"input\",{type:\"text\",placeholder:\"\\u5907\\u7528DNS\\u5730\\u5740\",\"onUpdate:modelValue\":h=>r.value.manualDnsIp[E]=h},null,8,Ts),[[Y,r.value.manualDnsIp[E],void 0,{trim:!0}]])])],64))]))),256)):$(\"\",!0),s.value?(o(),c(\"div\",Ls,m(s.value),1)):$(\"\",!0)]),t(\"div\",zs,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",disabled:i.value},\" \\u786E\\u8BA4 \",8,Os),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:f},\" \\u53D6\\u6D88 \")])],40,$s)):n.value==1?(o(),c(\"div\",Ns,[qs,Us,t(\"div\",{class:\"actioner-dns_footer\"},[t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:b},\" \\u5B8C\\u6210 \")])])):$(\"\",!0)]),_:1},8,[\"Close\"]))}});var Rs=S(Hs,[[\"__scopeId\",\"data-v-95c09170\"]]);const Ee=()=>{const e=document.createElement(\"div\");document.body.appendChild(e);const u=st(Rs,{Close:()=>{n()}});u.mount(e);const n=()=>{u.unmount(),e.remove()};return{Close:n}},Ws={},Gs={width:\"14px\",height:\"14px\",viewBox:\"0 0 14 14\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},Zs=t(\"g\",{id:\"icon_alert\",stroke:\"none\",\"stroke-width\":\"1\",fill:\"none\",\"fill-rule\":\"evenodd\"},[t(\"g\",{id:\"Icon/Warning\"},[t(\"rect\",{id:\"\\u77E9\\u5F62\",fill:\"#000000\",\"fill-rule\":\"nonzero\",opacity:\"0\",x:\"0\",y:\"0\",width:\"14\",height:\"14\"}),t(\"path\",{d:\"M7,0.875 C3.61757813,0.875 0.875,3.61757813 0.875,7 C0.875,10.3824219 3.61757813,13.125 7,13.125 C10.3824219,13.125 13.125,10.3824219 13.125,7 C13.125,3.61757813 10.3824219,0.875 7,0.875 Z M6.5625,4.046875 C6.5625,3.98671875 6.61171875,3.9375 6.671875,3.9375 L7.328125,3.9375 C7.38828125,3.9375 7.4375,3.98671875 7.4375,4.046875 L7.4375,7.765625 C7.4375,7.82578125 7.38828125,7.875 7.328125,7.875 L6.671875,7.875 C6.61171875,7.875 6.5625,7.82578125 6.5625,7.765625 L6.5625,4.046875 Z M7,10.0625 C6.63769531,10.0625 6.34375,9.76855469 6.34375,9.40625 C6.34375,9.04394531 6.63769531,8.75 7,8.75 C7.36230469,8.75 7.65625,9.04394531 7.65625,9.40625 C7.65625,9.76855469 7.36230469,10.0625 7,10.0625 Z\",id:\"\\u5F62\\u72B6\",fill:\"#FAAD14\"})])],-1),js=[Zs];function Xs(e,u){return o(),c(\"svg\",Gs,js)}var dt=S(Ws,[[\"render\",Xs]]);const ut=e=>(q(\"data-v-5141058a\"),e=e(),U(),e),Qs={key:0,class:\"actioner-dns\"},Ys=ut(()=>t(\"div\",{class:\"actioner-dns_header\"},[t(\"span\",null,\"\\u6C99\\u7BB1\\u6A21\\u5F0F\\u914D\\u7F6E\\u5411\\u5BFC\")],-1)),Ks={class:\"actioner-dns_body\"},Js=ut(()=>t(\"p\",{class:\"sandbox_info\"},\" \\u4E00\\u4E2A\\u7B80\\u6613\\u6C99\\u7BB1\\uFF0C\\u65B9\\u4FBF\\u7528\\u6765\\u5B9E\\u9A8C\\u7CFB\\u7EDF\\u914D\\u7F6E\\u548C\\u7A0B\\u5E8F\\uFF0C\\u65B9\\u4FBF\\u5F00\\u53D1\\u672A\\u5B8C\\u6210\\u7684\\u8F6F\\u4EF6\\uFF0C\\u4F46\\u4E0D\\u4FDD\\u62A4Docker\\u548C\\u786C\\u76D8\\u7684\\u6570\\u636E \",-1)),to={key:0,class:\"disk_loading_icon\"},eo=ut(()=>t(\"span\",{class:\"disk_loading_info\"},\"\\u6B63\\u5728\\u52A0\\u8F7D\\u4E2D...\",-1)),uo={key:1,class:\"disk_tips\"},no=ut(()=>t(\"span\",null,\"\\u68C0\\u6D4B\\u4E0D\\u5230\\u6302\\u8F7D\\u7684\\u78C1\\u76D8\\u4FE1\\u606F\\uFF0C\\u8BF7\\u5148\\u63D2\\u4E0A\\u78C1\\u76D8\\uFF0C\\u5EFA\\u8BAE\\u4F7F\\u7528U\\u76D8\\u6216\\u8005\\u79FB\\u52A8\\u786C\\u76D8\\uFF0C\\u65B9\\u4FBF\\u88C5\\u5378\",-1)),so={class:\"label-item\"},oo=ut(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"\\u76EE\\u6807\\u78C1\\u76D8\\uFF08\\u5EFA\\u8BAE\\u9009\\u62E9U\\u76D8\\u6216\\u8005\\u79FB\\u52A8\\u786C\\u76D8\\uFF0C\\u65B9\\u4FBF\\u88C5\\u5378\\uFF09\")],-1)),ao={class:\"label-item_value\"},io=ut(()=>t(\"option\",{value:\"\"},\"\\u8BF7\\u9009\\u62E9\\u76EE\\u6807\\u78C1\\u76D8\",-1)),lo=[\"value\"],co={class:\"label-item\"},ro=ut(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"\\u76EE\\u6807\\u5206\\u533A\\uFF08\\u5206\\u533A\\u5927\\u5C0F\\u987B\\u5927\\u4E8E2G\\uFF0C\\u5C06\\u6B64\\u5206\\u533A\\u4F5C\\u4E3A\\u5916\\u90E8 overlay \\u4F7F\\u7528\\uFF09\")],-1)),_o={class:\"label-item_value\"},po=ut(()=>t(\"option\",{selected:\"true\",value:\"\"},\"\\u8BF7\\u9009\\u62E9\\u76EE\\u6807\\u5206\\u533A\",-1)),vo=[\"value\",\"disabled\"],ho={class:\"sandbox_tips\"},Fo=ut(()=>t(\"span\",null,\"\\u6B64\\u64CD\\u4F5C\\u4F1A\\u5C06\\u4F1A\\u5220\\u9664\\u8BE5\\u5206\\u533A\\u5168\\u90E8\\u6570\\u636E\",-1)),mo={class:\"sandbox_info timeout\"},fo=ut(()=>t(\"p\",{class:\"sandbox_roboot_tips\"},[Z(\" \\u7B49\\u5F85\\u8BBE\\u5907\\u91CD\\u542F\\uFF0C\\u91CD\\u542F\\u5B8C\\u6210\\u540E\"),t(\"span\",{class:\"sandbox_roboot_refresh\"},\"\\u8BF7\\u5237\\u65B0\\u754C\\u9762\")],-1)),Eo={key:0,class:\"actioner-dns_footer\"},Co=[\"disabled\"],go={key:1,class:\"actioner-tips\"},$o=ut(()=>t(\"div\",{class:\"actioner-tips_header\"},[t(\"span\",null,\"\\u6E29\\u99A8\\u63D0\\u793A\")],-1)),bo=ut(()=>t(\"div\",{class:\"actioner-tips_body\"},[t(\"p\",{class:\"sandbox_info\"},\" \\u6B64\\u64CD\\u4F5C\\u4F1A\\u5C06\\u4F1A\\u5220\\u9664\\u8BE5\\u5206\\u533A\\u5168\\u90E8\\u6570\\u636E\\uFF0C\\u5E76\\u683C\\u5F0F\\u5316\\u6210EXT4\\uFF0C\\u968F\\u540E\\u81EA\\u52A8\\u91CD\\u542F\\u8FDB\\u5165\\u6C99\\u7BB1\\u6A21\\u5F0F\\uFF0C\\u662F\\u5426\\u7EE7\\u7EED\\uFF1F \")],-1)),yo={key:2,class:\"actioner-tips\"},Do=ut(()=>t(\"div\",{class:\"actioner-tips_header\"},[t(\"span\",null,\"\\u9519\\u8BEF\")],-1)),ko={class:\"actioner-tips_body\"},Bo={class:\"sandbox_info\"},wo=V({__name:\"index\",props:{Close:{type:Function,required:!0}},setup(e){const u=e,n=C(0);C(\"disk\");const a=C(\"\"),d=C(3),F=C(\"\"),p=C([]),r=C(\"\"),s=C(null);(()=>{P.Nas.SandboxDisks.GET().then(h=>{var k;if(h!=null&&h.data&&(k=h.data)!=null&&k.result){s.value=h.data.result;return}throw\"\\u52A0\\u8F7D\\u78C1\\u76D8\\u4FE1\\u606F\\u5931\\u8D25\"}).catch(h=>{a.value=h,n.value=3})})();const _=()=>request.System.Reboot.POST({name:F.value,path:r.value}).then(h=>{var k;if(!(h!=null&&h.data&&(((k=h==null?void 0:h.data)==null?void 0:k.success)||0)==0))throw\"\\u672A\\u77E5\\u9519\\u8BEF\"}),f=h=>{var k,w;r.value=\"\",p.value=F.value&&((w=(k=s.value)==null?void 0:k.disks.find(y=>y.path==F.value))==null?void 0:w.childrens)||[]},b=()=>{d.value>0&&(d.value-=1,window.setTimeout(b,1e3))},D=h=>{h.preventDefault(),u.Close&&u.Close()},v=()=>{new Promise((h,k)=>{const w=\"/luci-static/resources/icons/loading.gif\",y=()=>{window.setTimeout(g,2e3)},g=()=>{const B=new Image;B.onload=h,B.onerror=y,B.src=w};window.setTimeout(g,1e4)}).then(()=>{window.setTimeout(()=>{location.reload()},2e3)})},l=h=>{const k=A.Loading(\"\\u914D\\u7F6E\\u6C99\\u7BB1\\u91CD\\u542F\\u4E2D...\");request.Nas.Sandbox.POST({path:r.value}).then(w=>{var y;if(w!=null&&w.data){if((w.data.success||0)==0)return n.value=2,window.setTimeout(b,1e3),_();if((y=w.data)!=null&&y.error)throw w.data.error}throw\"\\u672A\\u77E5\\u9519\\u8BEF\"}).then(v).catch(w=>A.Warning(w)).finally(()=>k.Close())},E=()=>{n.value=0};return(h,k)=>{const w=jt(\"icon-loading\");return o(),z(ot,{Close:e.Close,type:1},{default:M(()=>[n.value==0||n.value==2?(o(),c(\"div\",Qs,[Ys,t(\"div\",Ks,[Js,n.value==0?(o(),c(N,{key:0},[s.value?$(\"\",!0):(o(),c(\"div\",to,[x(w,{size:38,color:\"currentColor\"}),eo])),s.value&&s.value.disks.length==0?(o(),c(\"div\",uo,[x(dt),no])):$(\"\",!0),s.value&&s.value.disks.length>0?(o(),c(N,{key:2},[t(\"div\",so,[oo,t(\"div\",ao,[L(t(\"select\",{name:\"\",id:\"\",onChange:f,\"onUpdate:modelValue\":k[0]||(k[0]=y=>F.value=y)},[io,(o(!0),c(N,null,K(s.value.disks,(y,g)=>(o(),c(\"option\",{value:y.path,key:g},m(y.venderModel)+\"\\uFF08\"+m(y.size)+\"\\uFF09 \",9,lo))),128))],544),[[Et,F.value]])])]),t(\"div\",co,[ro,t(\"div\",_o,[L(t(\"select\",{name:\"\",id:\"\",\"onUpdate:modelValue\":k[1]||(k[1]=y=>r.value=y)},[po,(o(!0),c(N,null,K(p.value,(y,g)=>(o(),c(\"option\",{value:y.path,key:g,disabled:y.sizeInt<(1<<30)*1||y.isSystemRoot},m(y.name)+\"\\uFF08\"+m(y.filesystem||\"\\u672A\\u683C\\u5F0F\\u5316\")+\"\\uFF09\"+m(y.total),9,vo))),128))],512),[[Et,r.value]])])]),t(\"div\",ho,[x(dt),Fo])],64)):$(\"\",!0)],64)):$(\"\",!0),n.value==2?(o(),c(N,{key:1},[t(\"p\",mo,[Z(\" \\u5373\\u5C06\\u91CD\\u542F\\u8BBE\\u5907 \"),t(\"span\",null,\"\\uFF08\"+m(d.value)+\"s\\uFF09\",1)]),fo],64)):$(\"\",!0)]),n.value==0?(o(),c(\"div\",Eo,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",disabled:!r.value,onClick:k[2]||(k[2]=y=>n.value=1)},\" \\u5F00\\u542F\\u6C99\\u7BB1 \",8,Co),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:D},\" \\u53D6\\u6D88 \")])):$(\"\",!0)])):$(\"\",!0),n.value==1?(o(),c(\"div\",go,[$o,bo,t(\"div\",{class:\"actioner-tips_footer\"},[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",onClick:l},\" \\u7EE7\\u7EED \"),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:E},\" \\u53D6\\u6D88 \")])])):$(\"\",!0),n.value==3?(o(),c(\"div\",yo,[Do,t(\"div\",ko,[t(\"p\",Bo,m(a.value),1)]),t(\"div\",{class:\"actioner-tips_footer\"},[t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:E},\" \\u53D6\\u6D88 \")])])):$(\"\",!0)]),_:1},8,[\"Close\"])}}});var Ao=S(wo,[[\"__scopeId\",\"data-v-5141058a\"]]);const xo=()=>{const e=document.createElement(\"div\");document.body.appendChild(e);const u=st(Ao,{Close:()=>{n()}});u.mount(e);const n=()=>{u.unmount(),e.remove()};return{Close:n}},So={},Io={width:\"82px\",height:\"82px\",viewBox:\"0 0 82 82\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},Po=Xt('<title>icon_finished</title><g id=\"icon_finished\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"><g id=\"circle\" transform=\"translate(2.000000, 2.000000)\"><circle id=\"Oval\" stroke=\"#553AFE\" stroke-width=\"4\" cx=\"39\" cy=\"39\" r=\"39\"></circle><circle id=\"Oval\" fill=\"#553AFE\" cx=\"39.028463\" cy=\"39.028463\" r=\"35.028463\"></circle><path d=\"M41.0148619,52.8014169 C39.924327,53.7754409 39.8138203,55.4674462 40.7680384,56.5806164 C41.7222564,57.6937867 43.3798562,57.8065871 44.4703911,56.8325631 L54.9654709,47.4587599 C56.1301083,46.4185505 56.1643255,44.5807064 55.0392485,43.4960788 L31.4253189,20.7311283 C30.3718273,19.7155123 28.7112257,19.7639428 27.7162614,20.8393009 C26.7212971,21.914659 26.7687429,23.6097284 27.8222345,24.6253444 L49.3379698,45.3675358 L41.0148619,52.8014169 Z\" id=\"Shape\" fill=\"#FFFFFF\" fill-rule=\"nonzero\" transform=\"translate(41.430740, 38.747628) rotate(-270.000000) translate(-41.430740, -38.747628) \"></path></g></g>',2),Vo=[Po];function Mo(e,u){return o(),c(\"svg\",Io,Vo)}var Yt=S(So,[[\"render\",Mo]]);const wt=e=>(q(\"data-v-5cf1870c\"),e=e(),U(),e),To=[\"onSubmit\"],Lo=wt(()=>t(\"div\",{class:\"actioner-dns_header\"},[t(\"span\",null,\"\\u8F6F\\u4EF6\\u6E90\\u914D\\u7F6E\")],-1)),zo={class:\"actioner-dns_body\"},Oo={class:\"label-item\"},No=wt(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"\\u5F53\\u524D\\u8F6F\\u4EF6\\u6E90\")],-1)),qo={class:\"label-item_value\"},Uo={class:\"item_info\"},Ho={class:\"label-item\"},Ro=wt(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"\\u5207\\u6362\\u8F6F\\u4EF6\\u6E90\")],-1)),Wo={class:\"label-item_value\"},Go=wt(()=>t(\"option\",{selected:\"true\",value:\"\"},\"\\u8BF7\\u9009\\u62E9\\u8F6F\\u4EF6\\u6E90\",-1)),Zo=[\"value\"],jo={class:\"actioner-dns_footer\"},Xo=[\"disabled\"],Qo={key:1,class:\"actioner-dns\"},Yo=wt(()=>t(\"div\",{class:\"actioner-dns_header\"},[t(\"span\",{class:\"softsource_tit\"},\"\\u8F6F\\u4EF6\\u6E90\\u914D\\u7F6E\")],-1)),Ko={class:\"actioner-dns_body\"},Jo={class:\"finished\"},ta=wt(()=>t(\"p\",{class:\"successed\"},\"\\u914D\\u7F6E\\u6210\\u529F\\uFF01\",-1)),ea=V({__name:\"index\",props:{Close:{type:Function,required:!0}},setup(e){const u=e,n=C(0),a=C(\"\"),d=C(),F=C();(()=>{P.Guide.SoftSourceList.GET().then(_=>{var f,b;if((f=_==null?void 0:_.data)!=null&&f.result){const D=(b=_==null?void 0:_.data)==null?void 0:b.result;F.value=D}}).then(()=>P.Guide.GetSoftSource.GET()).then(_=>{var f,b;if((f=_==null?void 0:_.data)!=null&&f.result){const D=_.data.result;d.value=D.softSource,(b=F.value)!=null&&b.softSourceList.find(v=>v.identity==D.softSource.identity)&&(a.value=D.softSource.identity)}})})();const r=_=>{_.preventDefault(),u.Close&&u.Close()},s=_=>{const f=A.Loading(\"\\u6B63\\u5728\\u5207\\u6362\\u4E2D...\");request.Guide.SoftSource.POST({softSourceIdentity:a.value}).then(b=>{if(b!=null&&b.data){if((b.data.success||0)==0){n.value=1;return}else if(b.data.error)throw b.data.error}throw\"\\u672A\\u77E5\\u9519\\u8BEF\"}).catch(b=>{A.Error(b)}).finally(()=>f.Close())},i=_=>{_.preventDefault(),location.reload()};return(_,f)=>(o(),z(ot,{Close:e.Close,type:1},{default:M(()=>{var b,D;return[n.value==0?(o(),c(\"form\",{key:0,class:\"actioner-dns\",onSubmit:lt(s,[\"prevent\"])},[Lo,t(\"div\",zo,[t(\"div\",Oo,[No,t(\"div\",qo,[t(\"p\",Uo,m((b=d.value)==null?void 0:b.name),1)])]),t(\"div\",Ho,[Ro,t(\"div\",Wo,[L(t(\"select\",{name:\"\",id:\"\",\"onUpdate:modelValue\":f[0]||(f[0]=v=>a.value=v)},[Go,(o(!0),c(N,null,K((D=F.value)==null?void 0:D.softSourceList,(v,l)=>(o(),c(\"option\",{value:v.identity,key:l},m(v.name),9,Zo))),128))],512),[[Et,a.value,void 0,{trim:!0}]])])])]),t(\"div\",jo,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",disabled:a.value==\"\"},\" \\u786E\\u8BA4 \",8,Xo),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:r},\" \\u53D6\\u6D88 \")])],40,To)):$(\"\",!0),n.value==1?(o(),c(\"form\",Qo,[Yo,t(\"div\",Ko,[t(\"div\",Jo,[x(Yt)]),ta,t(\"div\",{class:\"btns\"},[t(\"button\",{class:\"cbi-button cbi-button-apply softsource_successed\",onClick:i},\" \\u786E\\u5B9A \")])])])):$(\"\",!0)]}),_:1},8,[\"Close\"]))}});var ua=S(ea,[[\"__scopeId\",\"data-v-5cf1870c\"]]);const Ce=()=>{const e=document.createElement(\"div\");document.body.appendChild(e);const u=st(ua,{Close:()=>{n()}});u.mount(e);const n=()=>{u.unmount(),e.remove()};return{Close:n}};const na={class:\"utilities\"},sa=V({__name:\"index\",setup(e){const u=C(!1),n=C(),a=()=>{window.location.href=\"/cgi-bin/luci/admin/system/ota\"},d=()=>{n.value.status==\"unsupport\"&&alert(\"\\u8BE5\\u56FA\\u4EF6\\u4E0D\\u652F\\u6301\\u6C99\\u7BB1\\u6A21\\u5F0F\"),n.value.status==\"stopped\"&&xo()},F=()=>T(this,null,function*(){try{if((yield P.Quickstart.Guide.GlobalFolders.GET()).status!==200)return}catch(i){console.log(i);return}u.value=!0;try{const i=yield P.Storage.Get.POST({key:\"nas_guide_init\"});if(i.data){const{success:_,error:f,result:b}=i.data;if(b&&b.key==\"nas_guide_init\")return}}catch(i){return}p()}),p=()=>{if(!u.value){A.Warning(\"\\u8BF7\\u5148\\u66F4\\u65B0\\u7CFB\\u7EDF\\u5230\\u6700\\u65B0\\u7248\\u672C\");return}we.OpenGuideWindow()},r=()=>{var i,_,f,b;window.open(`${(_=(i=window.quickstart_configs)==null?void 0:i.ttyd)!=null&&_.ssl?\"https\":\"http\"}://${window.location.hostname}:${((b=(f=window.quickstart_configs)==null?void 0:f.ttyd)==null?void 0:b.port)||7681}/`,\"_blank\")};return(()=>{P.Nas.GetSandbox.GET().then(i=>{var _;console.log(\"getSandBox\",i),(_=i==null?void 0:i.data)!=null&&_.result&&(n.value=i.data.result)}).catch(i=>A.Warning(i))})(),F(),(i,_)=>(o(),z(ft,{title:i.$t(\"\\u5E38\\u7528\\u5DE5\\u5177\")},{default:M(()=>{var f;return[t(\"div\",na,[t(\"div\",{onClick:r},[t(\"span\",null,\"\\u300B\"+m(i.$t(\"\\u7EC8\\u7AEF\")),1)]),t(\"div\",{onClick:a},[t(\"span\",null,m(i.$t(\"\\u56FA\\u4EF6\\u66F4\\u65B0\")),1)]),t(\"div\",{onClick:_[0]||(_[0]=(...b)=>R(fe)&&R(fe)(...b))},[t(\"span\",null,m(i.$t(\"\\u5185\\u7F51\\u914D\\u7F6E\")),1)]),t(\"div\",{onClick:_[1]||(_[1]=(...b)=>R(Ee)&&R(Ee)(...b))},[t(\"span\",null,m(i.$t(\"DNS\\u914D\\u7F6E\")),1)]),t(\"div\",{onClick:_[2]||(_[2]=(...b)=>R(Ce)&&R(Ce)(...b))},[t(\"span\",null,m(i.$t(\"\\u8F6F\\u4EF6\\u6E90\\u914D\\u7F6E\")),1)]),t(\"div\",{onClick:d},[t(\"span\",null,m(((f=n.value)==null?void 0:f.status)==\"running\"?i.$t(\"\\u6C99\\u7BB1\\u5DF2\\u5F00\\u542F\"):i.$t(\"\\u5F00\\u542F\\u6C99\\u7BB1\")),1)])])]}),_:1},8,[\"title\"]))}});var oa=S(sa,[[\"__scopeId\",\"data-v-47b0529a\"]]),aa=\"/luci-static/istorex/network.svg?v=3025665f\",ia=\"/luci-static/istorex/device.svg?v=9068551e\";const la={},ca={xmlns:\"http://www.w3.org/2000/svg\",width:\"24\",height:\"24\",viewBox:\"0 0 24 24\",fill:\"none\"},da=t(\"path\",{\"fill-rule\":\"evenodd\",\"clip-rule\":\"evenodd\",d:\"M3.375 12C3.375 12.4973 3.57254 12.9742 3.92417 13.3258C4.27581 13.6775 4.75272 13.875 5.25 13.875C5.74728 13.875 6.22419 13.6775 6.57583 13.3258C6.92746 12.9742 7.125 12.4973 7.125 12C7.125 11.5027 6.92746 11.0258 6.57583 10.6742C6.22419 10.3225 5.74728 10.125 5.25 10.125C4.75272 10.125 4.27581 10.3225 3.92417 10.6742C3.57254 11.0258 3.375 11.5027 3.375 12ZM10.125 12C10.125 12.4973 10.3225 12.9742 10.6742 13.3258C11.0258 13.6775 11.5027 13.875 12 13.875C12.4973 13.875 12.9742 13.6775 13.3258 13.3258C13.6775 12.9742 13.875 12.4973 13.875 12C13.875 11.5027 13.6775 11.0258 13.3258 10.6742C12.9742 10.3225 12.4973 10.125 12 10.125C11.5027 10.125 11.0258 10.3225 10.6742 10.6742C10.3225 11.0258 10.125 11.5027 10.125 12ZM17.4242 13.3258C17.0725 12.9742 16.875 12.4973 16.875 12C16.875 11.5027 17.0725 11.0258 17.4242 10.6742C17.7758 10.3225 18.2527 10.125 18.75 10.125C19.2473 10.125 19.7242 10.3225 20.0758 10.6742C20.4275 11.0258 20.625 11.5027 20.625 12C20.625 12.4973 20.4275 12.9742 20.0758 13.3258C19.7242 13.6775 19.2473 13.875 18.75 13.875C18.2527 13.875 17.7758 13.6775 17.4242 13.3258Z\",fill:\"black\",\"fill-opacity\":\"0.8\"},null,-1),ra=[da];function _a(e,u){return o(),c(\"svg\",ca,ra)}var pa=S(la,[[\"render\",_a]]);const va=e=>(q(\"data-v-21e54302\"),e=e(),U(),e),ha={key:0,class:\"title\"},Fa=[\"href\"],ma=va(()=>t(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",width:\"14\",height:\"14\",viewBox:\"0 0 14 14\",fill:\"none\"},[t(\"path\",{d:\"M7 14C3.1338 14 0 10.8662 0 7C0 3.1338 3.1338 0 7 0C10.8662 0 14 3.1338 14 7C14 10.8662 10.8662 14 7 14ZM7 10.9375C7.25944 10.9375 7.46988 10.8535 7.63175 10.6859C7.79362 10.5179 7.875 10.3101 7.875 10.0625C7.875 9.81487 7.79407 9.61099 7.63175 9.45131C7.46987 9.29119 7.25944 9.20368 7 9.1875C6.65962 9.20369 6.4085 9.3555 6.24663 9.64292C6.08475 9.93081 6.08475 10.2182 6.24663 10.5061C6.4085 10.7936 6.65962 10.9375 7 10.9375ZM7.67025 8.07931C7.67025 8.02901 7.65275 7.88463 7.65493 7.90519C7.637 7.72319 7.66107 7.56131 7.76081 7.40513C7.83344 7.29094 7.94588 7.18375 8.11388 7.08444C9.10175 6.50081 9.46312 5.85068 9.44256 5.17431C9.41195 4.16106 8.66556 3.16663 7.04682 3.15218C5.69361 3.1395 4.80418 3.79312 4.59376 5.02031C4.56892 5.18979 4.61132 5.36226 4.71192 5.50089C4.81251 5.63952 4.96332 5.73333 5.13214 5.76229C5.30096 5.79124 5.47441 5.75305 5.61545 5.65586C5.75649 5.55867 5.85394 5.41019 5.88699 5.24212C5.98282 4.6865 6.29388 4.4577 7.03456 4.46425C7.84699 4.47169 8.11956 4.83481 8.13094 5.21325C8.13376 5.27833 8.11633 5.34268 8.08106 5.39744C7.9905 5.56018 7.79405 5.7492 7.44669 5.95438C7.10324 6.15694 6.83899 6.40894 6.6535 6.70032C6.36518 7.15313 6.3022 7.60113 6.35119 8.05656C6.35862 8.12525 6.35776 8.1165 6.35776 8.07932C6.35734 8.16577 6.374 8.25145 6.4068 8.33143C6.43959 8.41142 6.48786 8.48414 6.54884 8.54542C6.60982 8.60669 6.6823 8.65532 6.76213 8.68849C6.84196 8.72167 6.92756 8.73875 7.014 8.73875C7.10045 8.73875 7.18605 8.72167 7.26587 8.68849C7.3457 8.65532 7.41819 8.60669 7.47917 8.54542C7.54015 8.48414 7.58842 8.41142 7.62121 8.33143C7.654 8.25145 7.67067 8.16575 7.67025 8.07931Z\",fill:\"#E1B8B2\"})],-1)),fa=[ma],Ea={class:\"toolbar\"},Ca={key:1,class:\"more-icon\"},ga={class:\"actions\"},$a=[\"onClick\"],ba=V({__name:\"index\",props:{span:{},height:{},title:{},padding:{},helpLink:{},moreActions:{},action:{}},setup(e){const u=e,n=C(!1),a=()=>{n.value=!n.value},d=mt({width:`calc(${u.span*100/24}% - 10px)`,height:u.height+\"px\"});return(F,p)=>{var r,s,i;return o(),c(\"div\",{class:\"card\",style:tt(d)},[t(\"div\",null,[u.title?(o(),c(\"div\",ha,[t(\"span\",null,m(u.title),1),u.helpLink?(o(),c(\"a\",{key:0,href:u.helpLink,target:\"_blank\"},fa,8,Fa)):$(\"\",!0),t(\"div\",Ea,[u.action&&u.action.show!==!1?(o(),c(\"div\",{key:0,class:\"action\",onClick:p[0]||(p[0]=(..._)=>{var f,b;return((f=u.action)==null?void 0:f.onClick)&&((b=u.action)==null?void 0:b.onClick(..._))})},m((r=u.action)==null?void 0:r.text),1)):$(\"\",!0),(i=(s=u.moreActions)==null?void 0:s.filter(({show:_})=>_!==!1))!=null&&i.length?(o(),c(\"span\",Ca,[x(pa,{onClick:a})])):$(\"\",!0),L(t(\"div\",ga,[t(\"div\",{class:\"menu_background\",onClick:a}),t(\"ul\",null,[(o(!0),c(N,null,K(u.moreActions,_=>(o(),c(\"li\",{onClick:_.onClick},m(_.text),9,$a))),256))])],512),[[ke,n.value]])])])):$(\"\",!0),t(\"div\",{class:\"card-body\",style:tt(`padding:${u.padding}`)},[bt(F.$slots,\"default\",{},void 0,!0)],4)])],4)}}});var j=S(ba,[[\"__scopeId\",\"data-v-21e54302\"]]);const ya={class:\"flow\"},Da={class:\"flow-data\"},ka={key:0},Ba={key:1},wa=V({__name:\"flow-chart\",setup(e){su([ou,au,iu,lu,cu,du]);const u=C(),n=D=>{var l;const v=(l=u.value)==null?void 0:l[D];return!v||v.startTime==0?\"\":s(v.startTime*1e3)+\"-\"+s(v.endTime*1e3)},a=W(()=>{var v;let D=[];return(v=u.value)==null||v.forEach(l=>{D.push({value:l.uploadSpeed})}),D}),d=W(()=>{var v;let D=[];return(v=u.value)==null||v.forEach(l=>{D.push({value:l.downloadSpeed})}),D}),F=W(()=>{var v;let D=\"\";if(u.value){let l=((v=u.value)==null?void 0:v.length)||0;if(l>0){let E=u.value[l-1];D=i(E.uploadSpeed)+\"/s\"}}return D}),p=W(()=>{var v;let D=\"\";if(u.value){let l=((v=u.value)==null?void 0:v.length)||0;if(l>0){let E=u.value[l-1];D=i(E.downloadSpeed)+\"/s\"}}return D});W(()=>{var v;let D=[];return(v=u.value)==null||v.forEach(l=>{D.push({value:l.downloadSpeed+l.uploadSpeed})}),D});const r=()=>T(this,null,function*(){var D;try{const v=yield P.Network.Statistics.GET();if(v.data&&(D=v.data.result)!=null&&D.items){const l=v.data.result.slots||10;if(v.data.result.items.length<l){let E=v.data.result.items;for(;E.length<l;)E=[{downloadSpeed:0,endTime:0,startTime:0,uploadSpeed:0}].concat(E);u.value=E}else v.data.result.items.length>l?u.value=v.data.result.items.slice(l-v.data.result.items.length):u.value=v.data.result.items}}catch(v){console.log(v)}}),s=Nt.dateForm,i=Nt.byteToSize,_=C();let f=null;const b=D=>(f=ru(D,\"dark\"),f.setOption({animation:!1,backgroundColor:\"transparent\",color:[\"transparent\",\"transparent\"],tooltip:{trigger:\"axis\",formatter:v=>{if(Array.isArray(v)){let l=\"\";v.length>0&&(l=n(v[0].axisValue));for(let E=0;E<v.length;E++)l=`${l}<br>${v[E].seriesName}: ${i(v[E].value)}/s`;return l.toString()}else{const l=v;return`${n(l.axisValue)}<br>${l.seriesName}: ${i(l.value)}/s`}}},xAxis:{type:\"category\",boundaryGap:!1,splitLine:{lineStyle:{color:[\"#999\"]},show:!1},name:\"\",show:!1,nameGap:0,nameTextStyle:{height:0,lineHeight:0,padding:0}},yAxis:{type:\"value\",name:\"\",minInterval:1e4,interval:1e3,axisLabel:{formatter:function(v,l){return`${i(v)}/s`},color:\"#fff\",show:!1},nameTextStyle:{color:\"#fff\"},splitLine:{lineStyle:{color:[\"#999\"]},show:!1}},series:[{name:\"\\u4E0B\\u8F7D\",data:d.value,type:\"line\",smooth:!0,areaStyle:{color:{type:\"linear\",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:\"rgba(32, 199, 247, 1)\"},{offset:1,color:\"rgba(32, 199, 247, 0.1)\"}],global:!1}}},{name:\"\\u4E0A\\u4F20\",data:a.value,type:\"line\",smooth:!0,areaStyle:{color:{type:\"linear\",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:\"rgba(85, 58, 254, 1)\"},{offset:1,color:\"rgba(85, 58, 254, 0.1)\"}],global:!1}}}],grid:{left:\"0%\",right:\"0%\",bottom:\"0%\",top:\"0w\",containLabel:!0}}),f);return et(()=>{setTimeout(()=>T(this,null,function*(){if(_.value){yield r();const D=b(_.value),v=_.value;D.resize({width:v.clientWidth,height:v.clientHeight}),window.addEventListener(\"resize\",()=>{D.resize({width:v.clientWidth,height:v.clientHeight})});const l=()=>T(this,null,function*(){f!=null&&(yield r(),f!=null&&(D.setOption({series:[{name:\"\\u4E0B\\u8F7D\",data:d.value,type:\"line\",areaStyle:{},smooth:!0},{name:\"\\u4E0A\\u4F20\",data:a.value,type:\"line\",areaStyle:{},smooth:!0}]}),setTimeout(l,5e3)))});setTimeout(l,5e3)}}),900)}),Bt(()=>{f!=null&&(f.dispose(),f=null)}),(D,v)=>(o(),c(\"div\",ya,[t(\"div\",{ref_key:\"el\",ref:_,class:\"echart\"},null,512),t(\"div\",Da,[F.value?(o(),c(\"span\",ka,m(D.$t(\"\\u4E0A\\u4F20\"))+\": \"+m(F.value),1)):$(\"\",!0),p.value?(o(),c(\"span\",Ba,m(D.$t(\"\\u4E0B\\u8F7D\"))+\": \"+m(p.value),1)):$(\"\",!0)])]))}});var Aa=S(wa,[[\"__scopeId\",\"data-v-475e377c\"]]);const Pe=e=>(q(\"data-v-39628bee\"),e=e(),U(),e),xa={class:\"width-45 responsive\"},Sa={class:\"width-55 responsive\"},Ia={class:\"network\"},Pa=Pe(()=>t(\"img\",{src:aa,alt:\"network\"},null,-1)),Va={class:\"device\"},Ma=Pe(()=>t(\"img\",{src:ia,alt:\"device\"},null,-1)),Ta={class:\"ip-dns\"},La={class:\"title\"},za={class:\"ip\"},Oa={class:\"title\"},Na={class:\"dns\"},qa=V({__name:\"index\",setup(e){const u=Nt.stampForm,n=s=>{switch(s){case\"pppoe\":return ct.global.t(\"\\u62E8\\u53F7\\u4E0A\\u7F51\");case\"static\":return ct.global.t(\"\\u9759\\u6001\\u7F51\\u7EDC\");case\"dhcp\":return\"DHCP\"}return s&&s.toUpperCase()},a=s=>{switch(s){case\"manual\":return ct.global.t(\"\\u624B\\u52A8\\u914D\\u7F6E\");case\"auto\":return ct.global.t(\"\\u81EA\\u52A8\\u83B7\\u53D6\");default:return\"\"}},d=mt({ipv4addr:\"\",ipv6addr:\"\",internetConnected:!1,proto:\"\",dnsProto:\"\",dnsList:[],uptimeStamp:0}),F=C({devices:[]}),p=()=>T(this,null,function*(){P.Network.Status.GET().then(s=>{if(s!=null&&s.data){const{result:i}=s==null?void 0:s.data;i&&(d.ipv4addr=i.ipv4addr,d.proto=i.proto,d.dnsProto=i.dnsProto,d.ipv6addr=i.ipv6addr,d.dnsList=i.dnsList,d.uptimeStamp=i.uptimeStamp,window.setInterval(()=>{d.uptimeStamp&&(d.uptimeStamp=d.uptimeStamp+1)},1e3))}})}),r=()=>T(this,null,function*(){P.Network.Device.List.GET().then(s=>{if(s!=null&&s.data){const{result:i}=s==null?void 0:s.data;F.value={devices:(i==null?void 0:i.devices)||[]}}})});return p(),r(),(s,i)=>(o(),z(ft,null,{default:M(()=>[t(\"div\",xa,[x(j,{title:s.$t(\"\\u6D41\\u91CF\\u7EDF\\u8BA1\"),span:24,padding:\"0 8px\"},{default:M(()=>[x(Aa)]),_:1},8,[\"title\"])]),t(\"div\",Sa,[x(j,{span:12},{default:M(()=>[t(\"div\",Ia,[Pa,t(\"div\",null,[t(\"span\",null,m(s.$t(\"\\u5DF2\\u8FDE\\u63A5\\u4E92\\u8054\\u7F51\")),1),t(\"span\",null,m(R(u)(d.uptimeStamp)),1)])])]),_:1}),x(j,{span:12},{default:M(()=>{var _;return[t(\"div\",Va,[Ma,t(\"div\",null,[t(\"span\",null,m(s.$t(\"\\u5DF2\\u8FDE\\u63A5\\u8BBE\\u5907\")),1),t(\"span\",null,m(`${(_=F.value.devices)==null?void 0:_.length}${s.$t(\"\\u53F0\")}`),1)])])]}),_:1}),x(j,{span:24},{default:M(()=>[t(\"div\",Ta,[t(\"span\",La,m(s.$t(\"IP\\u5730\\u5740\")),1),t(\"div\",za,[t(\"span\",null,m(`IPv4\\uFF1A${d.ipv4addr}\\uFF08${n(d.proto||\"\")}\\uFF09`),1),t(\"span\",null,m(`IPv6\\uFF1A${d.ipv6addr||\"-\"}`),1)]),t(\"span\",Oa,m(`DNS\\uFF08${a(d.dnsProto||\"\")}\\uFF09`),1),t(\"div\",Na,[(o(!0),c(N,null,K(d.dnsList,_=>(o(),c(\"span\",null,m(_),1))),256))])])]),_:1})])]),_:1}))}});var Ua=S(qa,[[\"__scopeId\",\"data-v-39628bee\"]]),Ha=\"/luci-static/istorex/open.svg?v=84274947\",Ra=\"/luci-static/istorex/info.svg?v=7035c5f2\";const gt=e=>(q(\"data-v-bd2acf72\"),e=e(),U(),e),Wa=[\"onSubmit\"],Ga=gt(()=>t(\"div\",{class:\"action-header\"},[t(\"div\",{class:\"action-header_title\"},\"\\u786C\\u76D8\\u914D\\u7F6E\")],-1)),Za={class:\"action-body\"},ja={class:\"disk-info\"},Xa=gt(()=>t(\"div\",{class:\"disk-info_icon\"},[t(\"svg\",{t:\"1642589762094\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"11301\",width:\"128\",height:\"128\"},[t(\"path\",{d:\"M899.892468 123.889088c0-44.342099-36.286708-80.620486-80.624646-80.620486H204.728017C160.385918 43.268602 124.107532 79.546988 124.107532 123.889088v802.847056c0 44.342099 36.278386 80.620486 80.620485 80.620486h614.539805c44.337938 0 80.624646-36.278386 80.624646-80.620486V123.889088z\",fill:\"#D0D0DB\",\"p-id\":\"11302\"}),t(\"path\",{d:\"M169.8768 977.7772V174.930143c0-44.342099 36.278386-80.620486 80.620486-80.620485h614.539804c9.936092 0 19.426974 1.905666 28.239639 5.23434-11.525534-30.507298-40.996782-52.389169-75.398629-52.389169H203.342457c-44.342099 0-80.620486 36.278386-80.620486 80.620486v802.851217c0 34.410168 21.881871 63.873094 52.385008 75.381985A79.730065 79.730065 0 0 1 169.8768 977.7772z\",fill:\"#FFFFFF\",\"p-id\":\"11303\"}),t(\"path\",{d:\"M820.657543 40.497481H206.117739c-44.342099 0-80.620486 36.278386-80.620486 80.620485v802.847057c0 44.342099 36.278386 80.620486 80.620486 80.620486h614.539804c44.337938 0 80.624646-36.278386 80.624647-80.620486V121.117966c0-44.342099-36.286708-80.620486-80.624647-80.620485z m19.60173 828.785749c0 40.846992-33.43237 74.279362-74.287684 74.279361H199.780776c-40.855313 0-74.279362-33.424048-74.279362-74.279361V129.593603c0-40.855313 33.424048-74.279362 74.279362-74.279362h566.203296c40.842831 0 74.283522 33.424048 74.283522 74.279362l-0.008321 739.689627z\",fill:\"#6E6E96\",\"p-id\":\"11304\"}),t(\"path\",{d:\"M815.106979 1024H200.567175C146.933914 1024 103.303319 980.369405 103.303319 926.736144V123.889088C103.303319 70.255827 146.933914 26.625232 200.567175 26.625232h614.539804c53.633261 0 97.268017 43.630595 97.268017 97.263856v802.847056c0 53.633261-43.634756 97.263856-97.268017 97.263856zM200.567175 59.911972C165.287391 59.911972 136.590059 88.609303 136.590059 123.889088v802.847056c0 35.279784 28.697331 63.977115 63.977116 63.977115h614.539804c35.279784 0 63.981276-28.697331 63.981276-63.977115V123.889088c0-35.279784-28.701492-63.977115-63.981276-63.977116H200.567175z\",fill:\"#6E6E96\",\"p-id\":\"11305\"}),t(\"path\",{d:\"M301.946104 941.515457h429.985632v65.841173H301.946104z\",fill:\"#8A8AA1\",\"p-id\":\"11306\"}),t(\"path\",{d:\"M731.931736 1024H301.946104a16.64337 16.64337 0 0 1-16.64337-16.64337V941.515457a16.64337 16.64337 0 0 1 16.64337-16.64337h429.985632a16.64337 16.64337 0 0 1 16.64337 16.64337v65.841173a16.64337 16.64337 0 0 1-16.64337 16.64337z m-413.342262-33.286741h396.698892v-32.554432H318.589474v32.554432z\",fill:\"#6E6E96\",\"p-id\":\"11307\"}),t(\"path\",{d:\"M337.230049 960.318304h20.804213v47.038326h-20.804213zM386.565159 960.318304h20.804213v47.038326h-20.804213zM435.891948 960.318304h20.804213v47.038326h-20.804213zM485.231219 960.318304h20.804213v47.038326h-20.804213zM534.558008 960.318304h20.804213v47.038326h-20.804213zM583.897279 960.318304h20.804213v47.038326h-20.804213zM633.224068 960.318304h20.804213v47.038326h-20.804213zM682.563339 960.318304h20.804213v47.038326h-20.804213z\",fill:\"#FFE599\",\"p-id\":\"11308\"}),t(\"path\",{d:\"M219.153659 140.794591m-26.874883 0a26.874882 26.874882 0 1 0 53.749765 0 26.874882 26.874882 0 1 0-53.749765 0Z\",fill:\"#ADADD1\",\"p-id\":\"11309\"}),t(\"path\",{d:\"M219.153659 184.312843c-23.995579 0-43.518252-19.522673-43.518253-43.518252s19.522673-43.518252 43.518253-43.518253 43.518252 19.522673 43.518252 43.518253-19.522673 43.518252-43.518252 43.518252z m0-53.749764c-5.642103 0-10.231512 4.589409-10.231512 10.231512s4.589409 10.231512 10.231512 10.231512 10.231512-4.589409 10.231511-10.231512-4.589409-10.231512-10.231511-10.231512z\",fill:\"#6E6E96\",\"p-id\":\"11310\"}),t(\"path\",{d:\"M801.28466 140.794591m-26.870721 0a26.870721 26.870721 0 1 0 53.741442 0 26.870721 26.870721 0 1 0-53.741442 0Z\",fill:\"#ADADD1\",\"p-id\":\"11311\"}),t(\"path\",{d:\"M801.28466 184.308683c-23.995579 0-43.514092-19.518512-43.514091-43.514092s19.518512-43.514092 43.514091-43.514092 43.514092 19.518512 43.514092 43.514092-19.518512 43.514092-43.514092 43.514092z m0-53.741443c-5.637942 0-10.227351 4.589409-10.227351 10.227351s4.589409 10.227351 10.227351 10.227351 10.227351-4.589409 10.227351-10.227351-4.589409-10.227351-10.227351-10.227351z\",fill:\"#6E6E96\",\"p-id\":\"11312\"}),t(\"path\",{d:\"M801.280499 905.23291m-26.870721 0a26.870721 26.870721 0 1 0 53.741443 0 26.870721 26.870721 0 1 0-53.741443 0Z\",fill:\"#ADADD1\",\"p-id\":\"11313\"}),t(\"path\",{d:\"M801.280499 948.747001c-23.995579 0-43.514092-19.518512-43.514091-43.514091s19.518512-43.514092 43.514091-43.514092 43.514092 19.518512 43.514092 43.514092-19.518512 43.514092-43.514092 43.514091z m0-53.741442c-5.637942 0-10.227351 4.589409-10.227351 10.227351s4.589409 10.227351 10.227351 10.227351 10.227351-4.589409 10.227351-10.227351-4.589409-10.227351-10.227351-10.227351z\",fill:\"#6E6E96\",\"p-id\":\"11314\"}),t(\"path\",{d:\"M219.153659 905.23291m-26.870722 0a26.870721 26.870721 0 1 0 53.741443 0 26.870721 26.870721 0 1 0-53.741443 0Z\",fill:\"#ADADD1\",\"p-id\":\"11315\"}),t(\"path\",{d:\"M219.153659 948.747001c-23.995579 0-43.514092-19.518512-43.514092-43.514091s19.518512-43.514092 43.514092-43.514092 43.514092 19.518512 43.514091 43.514092-19.522673 43.514092-43.514091 43.514091z m0-53.741442c-5.637942 0-10.227351 4.589409-10.227351 10.227351s4.589409 10.227351 10.227351 10.227351 10.227351-4.589409 10.227351-10.227351-4.589409-10.227351-10.227351-10.227351z\",fill:\"#6E6E96\",\"p-id\":\"11316\"}),t(\"path\",{d:\"M520.972857 777.43263c-142.542145 0-258.508988-115.971004-258.508988-258.52147a16.64337 16.64337 0 0 1 33.28674 0c0 124.19699 101.033579 225.23473 225.222248 225.23473s225.222248-101.03774 225.222248-225.23473c0-124.188668-101.033579-225.218087-225.222248-225.218087a16.64337 16.64337 0 0 1 0-33.286741c142.542145 0 258.508988 115.966843 258.508988 258.504828 0 142.550466-115.966843 258.521471-258.508988 258.52147z\",fill:\"#6E6E96\",\"p-id\":\"11317\"}),t(\"path\",{d:\"M520.968696 518.919481m-83.312551 0a83.312551 83.312551 0 1 0 166.625102 0 83.312551 83.312551 0 1 0-166.625102 0Z\",fill:\"#A9A9BA\",\"p-id\":\"11318\"}),t(\"path\",{d:\"M520.968696 618.875402c-55.114521 0-99.955921-44.83724-99.955921-99.95176 0-55.118682 44.8414-99.955921 99.955921-99.955921s99.95176 44.8414 99.95176 99.955921c0 55.11036-44.83724 99.95176-99.95176 99.95176z m0-166.625101c-36.761044 0-66.669181 29.908136-66.66918 66.66918s29.908136 66.66502 66.66918 66.66502 66.66502-29.908136 66.66502-66.66502c0-36.761044-29.903976-66.669181-66.66502-66.66918z\",fill:\"#6E6E96\",\"p-id\":\"11319\"}),t(\"path\",{d:\"M301.946104 941.515457h429.985632v36.977408H301.946104z\",fill:\"#6E6E96\",\"p-id\":\"11320\"})])],-1)),Qa={key:0,class:\"disk-info_mount-name\"},Ya={key:1,class:\"disk-info_mount-name\"},Ka={key:0,class:\"label-item\"},Ja=gt(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"\\u76EE\\u6807\\u5206\\u533A\")],-1)),ti={class:\"label-item_path\"},ei={class:\"label-item\"},ui=gt(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"\\u683C\\u5F0F\\u5316\\u9009\\u9879\")],-1)),ni={class:\"label-item_value\"},si=[\"disabled\"],oi={key:0,value:\"\"},ai=gt(()=>t(\"option\",{value:\"format\"},\"\\u683C\\u5F0F\\u5316\",-1)),ii={key:1,value:\"default\"},li={class:\"label-item_value\"},ci={key:0,class:\"msg\"},di={key:1,class:\"msg\"},ri={class:\"action-footer\"},_i=gt(()=>t(\"div\",{class:\"auto\"},null,-1)),pi=[\"disabled\"],vi=[\"disabled\"],hi={key:1,class:\"action result\"},Fi={class:\"action-body\"},mi=gt(()=>t(\"div\",{class:\"action-body_icon\"},[t(\"svg\",{t:\"1642063181211\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"5062\",width:\"128\",height:\"128\",\"data-v-cda444e0\":\"\"},[t(\"path\",{d:\"M512 85.333333c235.648 0 426.666667 191.018667 426.666667 426.666667s-191.018667 426.666667-426.666667 426.666667S85.333333 747.648 85.333333 512 276.352 85.333333 512 85.333333z m-74.965333 550.4L346.453333 545.152a42.666667 42.666667 0 1 0-60.330666 60.330667l120.704 120.704a42.666667 42.666667 0 0 0 60.330666 0l301.653334-301.696a42.666667 42.666667 0 1 0-60.288-60.330667l-271.530667 271.488z\",fill:\"#52C41A\",\"p-id\":\"5063\",\"data-v-cda444e0\":\"\"})])],-1)),fi=gt(()=>t(\"div\",{class:\"action-body_msg\"},\"\\u683C\\u5F0F\\u5316\\u6210\\u529F\",-1)),Ei={key:0,class:\"action-body_info\"},Ci={key:1,class:\"action-body_info\"},gi={class:\"btns\"},$i=V({__name:\"index\",props:{action:String,disk:{type:Object,required:!0},mount:{type:Object},Close:{type:Function},Cancel:{type:Function},Next:{type:Function}},setup(e){const u=e,n=()=>{u.Close&&u.Close()},a=h=>{h.preventDefault(),u.Cancel&&u.Cancel(),n()},d=h=>{u.Next&&u.Next(h),n()},F=C(!1),p=C(0),r=h=>{p.value=h},s=C(u.action==\"nas\"?\"\":\"format\"),i=C(),_=C(),f=()=>{switch(s.value){case\"format\":D();return;case\"default\":b();return;default:A.Warning(\"\\u8BF7\\u9009\\u62E9\\u9009\\u7EBF\");return}},b=()=>{let h=\"\";const k=u.mount;if(k!=null&&k.mountPoint!=null&&(h=k.mountPoint),h!=\"\"){d(h);return}A.Warning(\"\\u65E0\\u6CD5\\u8BC6\\u522B\\u8DEF\\u5F84\")},D=()=>{const h=u.disk,k=u.mount;if(k){const w=k.mountPoint||k.path;if(!confirm(`\\u8B66\\u544A\\uFF1A\\u683C\\u5F0F\\u5316\\u4F1A\\u6E05\\u7A7A ${w} \\u5206\\u533A\\u6570\\u636E\\uFF0C\\u8BF7\\u4F60\\u8C28\\u614E\\u64CD\\u4F5C`)||!confirm(`\\u662F\\u5426\\u786E\\u5B9A\\u683C\\u5F0F\\u5316 ${w}?`))return;l(k);return}if(h){if(!confirm(`\\u8B66\\u544A\\uFF1A\\u8BE5\\u64CD\\u4F5C\\u5C06\\u521D\\u59CB\\u5316 ${h.venderModel} \\u786C\\u76D8\\u5E76\\u521B\\u5EFA\\u5206\\u533A\\uFF0C\\u8BF7\\u4F60\\u8C28\\u614E\\u64CD\\u4F5C`)||!confirm(\"\\u662F\\u5426\\u786E\\u5B9A\\u521D\\u59CB\\u5316?\"))return;v(h);return}A.Warning(\"\\u65E0\\u6CD5\\u8BC6\\u522B\\u6570\\u636E\")},v=h=>T(this,null,function*(){if(h.name==null||h.path==\"\"){A.Warning(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u8BBE\\u5907\\u540D\\u79F0\");return}if(h.path==null||h.path==\"\"){A.Warning(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u8BBE\\u5907\\u8DEF\\u5F84\");return}F.value=!0;const k=A.Loading(\"\\u521D\\u59CB\\u5316\\u4E2D...\");try{const w=yield P.Nas.Disk.Init.POST({name:h.name,path:h.path});if(w!=null&&w.data){const{result:y,error:g}=w==null?void 0:w.data;g&&A.Warning(g),y&&(y.errorInfo?A.Warning(y.errorInfo):(A.Success(\"\\u521D\\u59CB\\u5316\\u6210\\u529F\"),y.childrens&&y.childrens.length>0&&(_.value=y.childrens[0]),i.value=y,r(1)))}}catch(w){A.Error(w)}k.Close(),F.value=!1}),l=h=>T(this,null,function*(){if(h.path==null||h.path==\"\"){A.Warning(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u5206\\u533A\\u8DEF\\u5F84\");return}F.value=!0;const k=A.Loading(\"\\u683C\\u5F0F\\u5316\\u4E2D...\");try{const w=yield P.Nas.Disk.Partition.Format.POST({path:h.path,uuid:h.uuid,mountPoint:h.mountPoint});if(w!=null&&w.data){const{result:y,error:g}=w==null?void 0:w.data;g&&A.Warning(g),y&&(A.Success(\"\\u683C\\u5F0F\\u5316\\u6210\\u529F\"),_.value=y,r(1))}}catch(w){A.Error(w)}k.Close(),F.value=!1}),E=()=>{if(_.value&&_.value.mountPoint){d(_.value.mountPoint);return}A.Warning(\"\\u8BFB\\u53D6\\u7ED3\\u679C\\u5931\\u8D25\")};return(h,k)=>(o(),z(ot,{type:1},{default:M(()=>[x(Lt,{name:\"rotate\",mode:\"out-in\"},{default:M(()=>{var w;return[p.value==0?(o(),c(\"form\",{key:0,class:\"action format\",onSubmit:lt(f,[\"prevent\"])},[Ga,t(\"div\",Za,[t(\"div\",ja,[Xa,e.mount?(o(),c(\"div\",Qa,[t(\"span\",null,\"\\u3010\"+m(e.mount.total)+\"\\u3011\",1),t(\"span\",null,m(e.mount.mountPoint||e.mount.path),1)])):e.disk?(o(),c(\"div\",Ya,[t(\"span\",null,\"\\u3010\"+m(e.disk.size)+\"\\u3011\",1),t(\"span\",null,m(e.disk.venderModel),1)])):$(\"\",!0)]),e.mount?(o(),c(\"div\",Ka,[Ja,t(\"div\",ti,m(e.mount.mountPoint||e.mount.path)+\"\\uFF08\"+m(e.mount.total)+\"\\uFF09 \",1)])):$(\"\",!0),t(\"div\",ei,[ui,t(\"div\",ni,[L(t(\"select\",{\"onUpdate:modelValue\":k[0]||(k[0]=y=>s.value=y),required:\"\",disabled:e.action==\"disk\"},[e.mount!=null?(o(),c(\"option\",oi,\"\\u8BF7\\u9009\\u62E9\\u9009\\u9879\")):$(\"\",!0),ai,e.mount!=null?(o(),c(\"option\",ii,\" \\u4E0D\\u683C\\u5F0F\\u5316,\\u4F7F\\u7528\\u539F\\u6587\\u4EF6\\u7CFB\\u7EDF \")):$(\"\",!0)],8,si),[[Et,s.value]])]),t(\"div\",li,[s.value==\"format\"?(o(),c(\"p\",ci,\" \\u683C\\u5F0F\\u5316\\u4E3AEXT4\\u6587\\u4EF6\\u7CFB\\u7EDF\\uFF0C\\u4F20\\u8F93\\u901F\\u5EA6\\u66F4\\u5FEB \")):s.value==\"default\"?(o(),c(\"p\",di)):$(\"\",!0)])])]),t(\"div\",ri,[_i,t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:a,type:\"button\",disabled:F.value},\" \\u8FD4\\u56DE \",8,pi),t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",disabled:F.value},\" \\u4E0B\\u4E00\\u6B65 \",8,vi)])],40,Wa)):p.value==1?(o(),c(\"div\",hi,[t(\"div\",Fi,[mi,fi,i.value?(o(),c(\"div\",Ei,[Z(\" \\u5DF2\\u7ECF\\u6210\\u529F\\u683C\\u5F0F\\u5316\\u78C1\\u76D8 \"+m(i.value.venderModel)+\" \\u5E76\\u6302\\u8F7D\\u5230 \",1),t(\"a\",null,m((w=_.value)==null?void 0:w.mountPoint),1)])):$(\"\",!0),_.value?(o(),c(\"div\",Ci,[Z(\" \\u5DF2\\u7ECF\\u6210\\u529F\\u521D\\u59CB\\u5316\\u5206\\u533A \"),t(\"a\",null,m(_.value.mountPoint),1)])):$(\"\",!0),t(\"div\",gi,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",type:\"button\",onClick:E},m(e.action==\"nas\"?\"\\u4E0B\\u4E00\\u6B65\":\"\\u5B8C\\u6210\"),1)])])])):$(\"\",!0)]}),_:1})]),_:1}))}});var bi=S($i,[[\"__scopeId\",\"data-v-bd2acf72\"]]),Ve=e=>{const u=document.createElement(\"div\");document.body.appendChild(u);const n=st(bi,ht(vt({},e),{Close:()=>{a()}}));n.mount(u);const a=()=>{n.unmount(),u.remove()};return{Close:a}};const Dt=e=>(q(\"data-v-3a7479d2\"),e=e(),U(),e),yi=[\"onSubmit\"],Di=Dt(()=>t(\"div\",{class:\"action-header\"},[t(\"div\",{class:\"action-header_title\"})],-1)),ki={class:\"action-body\"},Bi={class:\"disk-info\"},wi=Dt(()=>t(\"div\",{class:\"disk-info_icon\"},[t(\"svg\",{t:\"1642589762094\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"11301\",width:\"128\",height:\"128\"},[t(\"path\",{d:\"M899.892468 123.889088c0-44.342099-36.286708-80.620486-80.624646-80.620486H204.728017C160.385918 43.268602 124.107532 79.546988 124.107532 123.889088v802.847056c0 44.342099 36.278386 80.620486 80.620485 80.620486h614.539805c44.337938 0 80.624646-36.278386 80.624646-80.620486V123.889088z\",fill:\"#D0D0DB\",\"p-id\":\"11302\"}),t(\"path\",{d:\"M169.8768 977.7772V174.930143c0-44.342099 36.278386-80.620486 80.620486-80.620485h614.539804c9.936092 0 19.426974 1.905666 28.239639 5.23434-11.525534-30.507298-40.996782-52.389169-75.398629-52.389169H203.342457c-44.342099 0-80.620486 36.278386-80.620486 80.620486v802.851217c0 34.410168 21.881871 63.873094 52.385008 75.381985A79.730065 79.730065 0 0 1 169.8768 977.7772z\",fill:\"#FFFFFF\",\"p-id\":\"11303\"}),t(\"path\",{d:\"M820.657543 40.497481H206.117739c-44.342099 0-80.620486 36.278386-80.620486 80.620485v802.847057c0 44.342099 36.278386 80.620486 80.620486 80.620486h614.539804c44.337938 0 80.624646-36.278386 80.624647-80.620486V121.117966c0-44.342099-36.286708-80.620486-80.624647-80.620485z m19.60173 828.785749c0 40.846992-33.43237 74.279362-74.287684 74.279361H199.780776c-40.855313 0-74.279362-33.424048-74.279362-74.279361V129.593603c0-40.855313 33.424048-74.279362 74.279362-74.279362h566.203296c40.842831 0 74.283522 33.424048 74.283522 74.279362l-0.008321 739.689627z\",fill:\"#6E6E96\",\"p-id\":\"11304\"}),t(\"path\",{d:\"M815.106979 1024H200.567175C146.933914 1024 103.303319 980.369405 103.303319 926.736144V123.889088C103.303319 70.255827 146.933914 26.625232 200.567175 26.625232h614.539804c53.633261 0 97.268017 43.630595 97.268017 97.263856v802.847056c0 53.633261-43.634756 97.263856-97.268017 97.263856zM200.567175 59.911972C165.287391 59.911972 136.590059 88.609303 136.590059 123.889088v802.847056c0 35.279784 28.697331 63.977115 63.977116 63.977115h614.539804c35.279784 0 63.981276-28.697331 63.981276-63.977115V123.889088c0-35.279784-28.701492-63.977115-63.981276-63.977116H200.567175z\",fill:\"#6E6E96\",\"p-id\":\"11305\"}),t(\"path\",{d:\"M301.946104 941.515457h429.985632v65.841173H301.946104z\",fill:\"#8A8AA1\",\"p-id\":\"11306\"}),t(\"path\",{d:\"M731.931736 1024H301.946104a16.64337 16.64337 0 0 1-16.64337-16.64337V941.515457a16.64337 16.64337 0 0 1 16.64337-16.64337h429.985632a16.64337 16.64337 0 0 1 16.64337 16.64337v65.841173a16.64337 16.64337 0 0 1-16.64337 16.64337z m-413.342262-33.286741h396.698892v-32.554432H318.589474v32.554432z\",fill:\"#6E6E96\",\"p-id\":\"11307\"}),t(\"path\",{d:\"M337.230049 960.318304h20.804213v47.038326h-20.804213zM386.565159 960.318304h20.804213v47.038326h-20.804213zM435.891948 960.318304h20.804213v47.038326h-20.804213zM485.231219 960.318304h20.804213v47.038326h-20.804213zM534.558008 960.318304h20.804213v47.038326h-20.804213zM583.897279 960.318304h20.804213v47.038326h-20.804213zM633.224068 960.318304h20.804213v47.038326h-20.804213zM682.563339 960.318304h20.804213v47.038326h-20.804213z\",fill:\"#FFE599\",\"p-id\":\"11308\"}),t(\"path\",{d:\"M219.153659 140.794591m-26.874883 0a26.874882 26.874882 0 1 0 53.749765 0 26.874882 26.874882 0 1 0-53.749765 0Z\",fill:\"#ADADD1\",\"p-id\":\"11309\"}),t(\"path\",{d:\"M219.153659 184.312843c-23.995579 0-43.518252-19.522673-43.518253-43.518252s19.522673-43.518252 43.518253-43.518253 43.518252 19.522673 43.518252 43.518253-19.522673 43.518252-43.518252 43.518252z m0-53.749764c-5.642103 0-10.231512 4.589409-10.231512 10.231512s4.589409 10.231512 10.231512 10.231512 10.231512-4.589409 10.231511-10.231512-4.589409-10.231512-10.231511-10.231512z\",fill:\"#6E6E96\",\"p-id\":\"11310\"}),t(\"path\",{d:\"M801.28466 140.794591m-26.870721 0a26.870721 26.870721 0 1 0 53.741442 0 26.870721 26.870721 0 1 0-53.741442 0Z\",fill:\"#ADADD1\",\"p-id\":\"11311\"}),t(\"path\",{d:\"M801.28466 184.308683c-23.995579 0-43.514092-19.518512-43.514091-43.514092s19.518512-43.514092 43.514091-43.514092 43.514092 19.518512 43.514092 43.514092-19.518512 43.514092-43.514092 43.514092z m0-53.741443c-5.637942 0-10.227351 4.589409-10.227351 10.227351s4.589409 10.227351 10.227351 10.227351 10.227351-4.589409 10.227351-10.227351-4.589409-10.227351-10.227351-10.227351z\",fill:\"#6E6E96\",\"p-id\":\"11312\"}),t(\"path\",{d:\"M801.280499 905.23291m-26.870721 0a26.870721 26.870721 0 1 0 53.741443 0 26.870721 26.870721 0 1 0-53.741443 0Z\",fill:\"#ADADD1\",\"p-id\":\"11313\"}),t(\"path\",{d:\"M801.280499 948.747001c-23.995579 0-43.514092-19.518512-43.514091-43.514091s19.518512-43.514092 43.514091-43.514092 43.514092 19.518512 43.514092 43.514092-19.518512 43.514092-43.514092 43.514091z m0-53.741442c-5.637942 0-10.227351 4.589409-10.227351 10.227351s4.589409 10.227351 10.227351 10.227351 10.227351-4.589409 10.227351-10.227351-4.589409-10.227351-10.227351-10.227351z\",fill:\"#6E6E96\",\"p-id\":\"11314\"}),t(\"path\",{d:\"M219.153659 905.23291m-26.870722 0a26.870721 26.870721 0 1 0 53.741443 0 26.870721 26.870721 0 1 0-53.741443 0Z\",fill:\"#ADADD1\",\"p-id\":\"11315\"}),t(\"path\",{d:\"M219.153659 948.747001c-23.995579 0-43.514092-19.518512-43.514092-43.514091s19.518512-43.514092 43.514092-43.514092 43.514092 19.518512 43.514091 43.514092-19.522673 43.514092-43.514091 43.514091z m0-53.741442c-5.637942 0-10.227351 4.589409-10.227351 10.227351s4.589409 10.227351 10.227351 10.227351 10.227351-4.589409 10.227351-10.227351-4.589409-10.227351-10.227351-10.227351z\",fill:\"#6E6E96\",\"p-id\":\"11316\"}),t(\"path\",{d:\"M520.972857 777.43263c-142.542145 0-258.508988-115.971004-258.508988-258.52147a16.64337 16.64337 0 0 1 33.28674 0c0 124.19699 101.033579 225.23473 225.222248 225.23473s225.222248-101.03774 225.222248-225.23473c0-124.188668-101.033579-225.218087-225.222248-225.218087a16.64337 16.64337 0 0 1 0-33.286741c142.542145 0 258.508988 115.966843 258.508988 258.504828 0 142.550466-115.966843 258.521471-258.508988 258.52147z\",fill:\"#6E6E96\",\"p-id\":\"11317\"}),t(\"path\",{d:\"M520.968696 518.919481m-83.312551 0a83.312551 83.312551 0 1 0 166.625102 0 83.312551 83.312551 0 1 0-166.625102 0Z\",fill:\"#A9A9BA\",\"p-id\":\"11318\"}),t(\"path\",{d:\"M520.968696 618.875402c-55.114521 0-99.955921-44.83724-99.955921-99.95176 0-55.118682 44.8414-99.955921 99.955921-99.955921s99.95176 44.8414 99.95176 99.955921c0 55.11036-44.83724 99.95176-99.95176 99.95176z m0-166.625101c-36.761044 0-66.669181 29.908136-66.66918 66.66918s29.908136 66.66502 66.66918 66.66502 66.66502-29.908136 66.66502-66.66502c0-36.761044-29.903976-66.669181-66.66502-66.66918z\",fill:\"#6E6E96\",\"p-id\":\"11319\"}),t(\"path\",{d:\"M301.946104 941.515457h429.985632v36.977408H301.946104z\",fill:\"#6E6E96\",\"p-id\":\"11320\"})])],-1)),Ai={key:0,class:\"disk-info_mount-name\"},xi={key:1,class:\"disk-info_mount-name\"},Si={key:0,class:\"label-item\"},Ii=Dt(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"\\u76EE\\u6807\\u5206\\u533A\")],-1)),Pi={class:\"label-item_path\"},Vi={class:\"label-item\"},Mi=Dt(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"\\u6302\\u8F7D\\u70B9\")],-1)),Ti={class:\"label-item_value\"},Li={class:\"action-footer\"},zi=Dt(()=>t(\"div\",{class:\"auto\"},null,-1)),Oi=[\"disabled\"],Ni=[\"disabled\"],qi={key:1,class:\"action result\"},Ui={class:\"action-body\"},Hi=Dt(()=>t(\"div\",{class:\"action-body_icon\"},[t(\"svg\",{t:\"1642063181211\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"5062\",width:\"128\",height:\"128\",\"data-v-cda444e0\":\"\"},[t(\"path\",{d:\"M512 85.333333c235.648 0 426.666667 191.018667 426.666667 426.666667s-191.018667 426.666667-426.666667 426.666667S85.333333 747.648 85.333333 512 276.352 85.333333 512 85.333333z m-74.965333 550.4L346.453333 545.152a42.666667 42.666667 0 1 0-60.330666 60.330667l120.704 120.704a42.666667 42.666667 0 0 0 60.330666 0l301.653334-301.696a42.666667 42.666667 0 1 0-60.288-60.330667l-271.530667 271.488z\",fill:\"#52C41A\",\"p-id\":\"5063\",\"data-v-cda444e0\":\"\"})])],-1)),Ri=Dt(()=>t(\"div\",{class:\"action-body_msg\"},\"\\u6302\\u8F7D\\u6210\\u529F\",-1)),Wi={key:0,class:\"action-body_info\"},Gi={class:\"btns\"},Zi=V({__name:\"index\",props:{action:String,disk:{type:Object,required:!0},mount:{type:Object},Close:{type:Function},Cancel:{type:Function},Next:{type:Function}},setup(e){var D;const u=e,n=()=>{u.Close&&u.Close()},a=v=>{v.preventDefault(),u.Cancel&&u.Cancel(),n()},d=v=>{u.Next&&u.Next(v),n()},F=C(!1),p=C(0),r=C(\"/mnt/data_\"+((D=u==null?void 0:u.mount)==null?void 0:D.name)),s=v=>{p.value=v};C(u.mount?\"\":\"format\"),C();const i=C(),_=()=>T(this,null,function*(){const v=u.mount;if(v==null){A.Warning(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u5206\\u533A\");return}if(v.path==null||v.path==\"\"){A.Warning(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u5206\\u533A\\u8DEF\\u5F84\");return}if(v.uuid==null||v.uuid==\"\"){A.Warning(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u5206\\u533AID\");return}F.value=!0;const l=A.Loading(\"\\u6302\\u8F7D\\u4E2D...\");try{const E=yield P.Nas.Disk.Partition.Mount.POST({path:v.path,uuid:v.uuid,mountPoint:r.value});if(E!=null&&E.data){const{result:h,error:k}=E==null?void 0:E.data;k&&A.Warning(k),h&&(A.Success(\"\\u6302\\u8F7D\\u6210\\u529F\"),i.value=h,s(1))}}catch(E){A.Error(E)}l.Close(),F.value=!1}),f=()=>{if(i.value&&i.value.mountPoint){d(i.value.mountPoint);return}A.Warning(\"\\u8BFB\\u53D6\\u7ED3\\u679C\\u5931\\u8D25\")},b=()=>{};return(v,l)=>(o(),z(ot,{type:1},{default:M(()=>[x(Lt,{name:\"rotate\",mode:\"out-in\"},{default:M(()=>{var E,h;return[p.value==0?(o(),c(\"form\",{key:0,class:\"action format\",onSubmit:lt(b,[\"prevent\"])},[Di,t(\"div\",ki,[t(\"div\",Bi,[wi,e.mount?(o(),c(\"div\",Ai,[t(\"span\",null,\"\\u3010\"+m(e.mount.total)+\"\\u3011\",1),t(\"span\",null,m(e.mount.mountPoint),1)])):e.disk?(o(),c(\"div\",xi,[t(\"span\",null,\"\\u3010\"+m(e.disk.size)+\"\\u3011\",1),t(\"span\",null,m(e.disk.venderModel),1)])):$(\"\",!0)]),e.mount?(o(),c(\"div\",Si,[Ii,t(\"div\",Pi,m(e.mount.path)+\"\\uFF08\"+m(e.mount.total)+\"\\uFF0C\"+m((h=(E=e.mount)==null?void 0:E.filesystem)==null?void 0:h.toUpperCase())+\"\\uFF09 \",1)])):$(\"\",!0),t(\"div\",Vi,[Mi,t(\"div\",Ti,[L(t(\"input\",{type:\"text\",\"onUpdate:modelValue\":l[0]||(l[0]=k=>r.value=k)},null,512),[[Y,r.value,void 0,{trim:!0}]])])])]),t(\"div\",Li,[zi,t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",disabled:F.value,onClick:_},\" \\u786E\\u5B9A \",8,Oi),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:a,type:\"button\",disabled:F.value},\" \\u8FD4\\u56DE \",8,Ni)])],40,yi)):p.value==1?(o(),c(\"div\",qi,[t(\"div\",Ui,[Hi,Ri,i.value?(o(),c(\"div\",Wi,[Z(\" \\u5DF2\\u6210\\u529F\\u5C06\\u5206\\u533A \"+m(i.value.path)+\" \\u6302\\u8F7D\\u5230 \",1),t(\"a\",null,m(i.value.mountPoint),1)])):$(\"\",!0),t(\"div\",Gi,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",type:\"button\",onClick:f},m(e.action==\"nas\"?\"\\u5B8C\\u6210\":\"\\u4E0B\\u4E00\\u6B65\"),1)])])])):$(\"\",!0)]}),_:1})]),_:1}))}});var ji=S(Zi,[[\"__scopeId\",\"data-v-3a7479d2\"]]),Me=e=>{const u=document.createElement(\"div\");document.body.appendChild(u);const n=st(ji,ht(vt({},e),{Close:()=>{a()}}));n.mount(u);const a=()=>{n.unmount(),u.remove()};return{Close:a}};const Xi={class:\"progress\"},Qi=V({__name:\"index\",props:{value:{type:Number,required:!0},text:{type:String}},setup(e){const u=e,n=W(()=>u.value>=80?\"#e45e5e\":u.value>=70?\"#ff9800\":u.value>=60?\"#297ff3\":u.value>0?\"#53c31b\":\"\");return(a,d)=>(o(),c(\"div\",Xi,[t(\"div\",{class:Qt([\"progress-value\",`${e.value>50}`]),style:tt({width:`${e.value}%`,backgroundColor:n.value})},[t(\"span\",null,m(e.text),1)],6),bt(a.$slots,\"default\",{},void 0,!0)]))}});var Yi=S(Qi,[[\"__scopeId\",\"data-v-733828e1\"]]);const Te=e=>(q(\"data-v-4b3c5909\"),e=e(),U(),e),Ki={class:\"disk-content\"},Ji={class:\"disk-item\"},tl={class:\"disk-item_name\"},el={key:0},ul={key:1},nl={key:2},sl={class:\"disk_value\"},ol={key:0,class:\"disk-item_value\"},al={class:\"value-data\"},il={key:1,class:\"disk-item_value\"},ll={key:0,class:\"disk-item\"},cl={class:\"disk-item_name\"},dl=[\"href\"],rl={class:\"disk_status\"},_l={class:\"disk_status_item\"},pl={key:0,class:\"tooltip-trigger disk_tip\"},vl=Te(()=>t(\"div\",{class:\"tooltip-text tooltip-top\"},[t(\"div\",{class:\"disk_dir_tip\"},\" \\u5F53\\u524D\\u78C1\\u76D8\\u4E3A\\u53EA\\u8BFB\\u72B6\\u6001\\uFF0C\\u53EF\\u80FD\\u5BFC\\u81F4\\u65E0\\u6CD5\\u5199\\u5165\\u6570\\u636E \")],-1)),hl={class:\"disk_status_item\"},Fl={key:0,class:\"tooltip-trigger disk_tip\"},ml=Te(()=>t(\"div\",{class:\"tooltip-text tooltip-top\"},[t(\"span\",{class:\"disk_dir_tip\"},\"\\u5F53\\u524D\\u78C1\\u76D8\\u786C\\u76D8\\u683C\\u5F0F\\u4E3ANTFS\\uFF0C\\u53EF\\u80FD\\u5BFC\\u81F4\\u786C\\u76D8\\u51FA\\u73B0\\u517C\\u5BB9\\u6027\\u95EE\\u9898\\uFF0C\\u5EFA\\u8BAE\\u683C\\u5F0F\\u5316\\u6210EXT4\\u6587\\u4EF6\\u7CFB\\u7EDF\")],-1)),fl=V({__name:\"item\",props:{part:{type:Object,required:!0},disk:{type:Object,required:!0}},setup(e){const u=e,n=W(()=>u.part.filesystem==\"No FileSystem\"),a=W(()=>n.value||!u.part.isSystemRoot&&u.part.mountPoint&&(u.part.isReadOnly||u.part.filesystem==\"ntfs\")),d=function(){Ve({action:\"disk\",disk:u.disk,mount:u.part,Cancel:()=>{},Next:i=>{location.reload()}})},F=()=>{Me({action:\"nas\",disk:u.disk,mount:u.part,Cancel:()=>{},Next:()=>{location.reload()}})},p=()=>T(this,null,function*(){const i=A.Loading(\"\\u5904\\u7406\\u4E2D...\");try{const _=yield P.Nas.Disk.InitRest.POST({name:u.disk.name,path:u.disk.path});if(_!=null&&_.data){const{result:f,error:b}=_==null?void 0:_.data;b&&A.Warning(b),f&&(A.Success(\"\\u6302\\u8F7D\\u6210\\u529F\"),location.reload())}}catch(_){A.Error(_)}i.Close()}),r=W(()=>u.part.filesystem==\"Free Space\"),s=W(()=>{const i=u.part.mountPoint?u.part.mountPoint:\"\";return i.indexOf(\"/mnt/\")==0?\"/cgi-bin/luci/admin/services/linkease/file/?path=/\"+i.substring(5):\"/cgi-bin/luci/admin/services/linkease/file/?path=/root\"+i});return(i,_)=>{var b;const f=jt(\"progress-item\");return o(),c(\"div\",Ki,[t(\"li\",Ji,[t(\"div\",tl,[r.value?(o(),c(\"span\",el,\"\\u672A\\u5206\\u533A\")):(o(),c(\"span\",ul,m(e.part.name)+m(e.part.mountPoint?\"\":n.value?\"\\uFF08\\u672A\\u683C\\u5F0F\\u5316\\uFF09\":\"\\uFF08\\u672A\\u6302\\u8F7D\\uFF09\"),1)),e.part.isSystemRoot?(o(),c(\"span\",nl,\"\\uFF08\\u7CFB\\u7EDF\\u5206\\u533A\\uFF09\")):$(\"\",!0)]),t(\"div\",sl,[e.part.mountPoint||r.value?(o(),c(\"div\",ol,[t(\"div\",al,[x(f,{value:r.value||!e.part.usage?0:e.part.usage,text:r.value?\"\\u672A\\u5206\\u533A\\uFF08\"+e.part.total+\"\\uFF09\":e.part.used+\"/\"+e.part.total,style:{backgroundColor:\"#767676\"}},null,8,[\"value\",\"text\"])])])):n.value?$(\"\",!0):(o(),c(\"div\",il,[t(\"div\",{class:\"value-data buttondiv\",onClick:F},\"\\u624B\\u52A8\\u6302\\u8F7D\")])),r.value?(o(),c(\"button\",{key:2,class:\"cbi-button cbi-button-apply\",onClick:p},\" \\u5206\\u533A\\u5E76\\u683C\\u5F0F\\u5316 \")):a.value?(o(),c(\"button\",{key:3,class:\"cbi-button cbi-button-apply\",onClick:d},\" \\u683C\\u5F0F\\u5316\\u5206\\u533A \")):$(\"\",!0)])]),e.part.mountPoint?(o(),c(\"li\",ll,[t(\"span\",cl,[t(\"a\",{href:s.value,target:\"_blank\"},m(e.part.mountPoint),9,dl)]),t(\"div\",rl,[t(\"div\",_l,[t(\"div\",null,\"\\u78C1\\u76D8\\u8BFB\\u5199\\u72B6\\u6001\\uFF1A\"+m(e.part.isReadOnly?\"\\u53EA\\u8BFB\":\"\\u8BFB\\u5199\"),1),!e.part.isSystemRoot&&e.part.isReadOnly?(o(),c(\"div\",pl,[x(dt),vl])):$(\"\",!0)]),t(\"div\",hl,[t(\"div\",null,\"\\u78C1\\u76D8\\u683C\\u5F0F\\uFF1A\"+m((b=e.part.filesystem)==null?void 0:b.toUpperCase()),1),e.part.filesystem==\"ntfs\"?(o(),c(\"div\",Fl,[x(dt),ml])):$(\"\",!0)])])])):$(\"\",!0)])}}});var El=S(fl,[[\"__scopeId\",\"data-v-4b3c5909\"]]);const Le=e=>(q(\"data-v-5f29973e\"),e=e(),U(),e),Cl={key:0,class:\"action\"},gl={class:\"title\"},$l=Le(()=>t(\"div\",{class:\"app-container_info\"},[t(\"span\",null,\"\\u5206\\u533A / \\u6302\\u8F7D\\u70B9\"),t(\"span\",null,\"\\u5BB9\\u91CF\")],-1)),bl={class:\"app-container_body\"},yl=Le(()=>t(\"div\",{class:\"auto\"},null,-1)),Dl=V({__name:\"index\",props:{disk:{type:Object,required:!0},Close:{type:Function},Cancel:{type:Function},Next:{type:Function}},setup(e){const u=e,n=C(0),a=()=>{u.Close&&u.Close()},d=F=>{F.preventDefault(),u.Cancel&&u.Cancel(),a()};return(F,p)=>(o(),z(ot,{Close:e.Close,type:1},{default:M(()=>[x(Lt,{name:\"rotate\",mode:\"out-in\"},{default:M(()=>[n.value==0?(o(),c(\"div\",Cl,[t(\"h2\",gl,\" \\u5206\\u533A\\u4FE1\\u606F - \"+m((e.disk.name||\"?\")+(e.disk.isSystemRoot?\"\\uFF08\\u7CFB\\u7EDF\\u76D8\\uFF09\":\"\")),1),t(\"ul\",null,[t(\"li\",null,[$l,t(\"div\",bl,[(o(!0),c(N,null,K(e.disk.childrens,(r,s)=>(o(),z(El,{key:s,part:r,disk:e.disk},null,8,[\"part\",\"disk\"]))),128))])])]),t(\"div\",{class:\"action-footer\"},[yl,t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:d,type:\"button\"},\" \\u8FD4\\u56DE \")])])):$(\"\",!0)]),_:1})]),_:1},8,[\"Close\"]))}});var kl=S(Dl,[[\"__scopeId\",\"data-v-5f29973e\"]]),Bl=e=>{const u=document.createElement(\"div\");document.body.appendChild(u);const n=st(kl,ht(vt({},e),{Close:()=>{a()}}));n.component(\"progress-item\",Yi),n.mount(u);const a=()=>{n.unmount(),u.remove()};return{Close:a}},wl=\"/luci-static/istorex/warning.svg?v=69d55c8f\";const qt=e=>(q(\"data-v-e039a994\"),e=e(),U(),e),Al={class:\"disk\"},xl={key:0,class:\"title\"},Sl={class:\"not-progress\"},Il={key:0},Pl={class:\"progress\"},Vl={class:\"button\"},Ml=[\"src\"],Tl=qt(()=>t(\"span\",null,\"S.M.A.R.T\\u5F02\\u5E38\",-1)),Ll={key:1},zl={class:\"progress\"},Ol={class:\"button\"},Nl={key:0,class:\"tooltip-trigger\"},ql={class:\"disk_tip\"},Ul=qt(()=>t(\"div\",null,[t(\"div\",{class:\"tooltip-text tooltip-top\"},[t(\"span\",{class:\"disk_dir_tip\"},\"\\u60A8\\u7684\\u7CFB\\u7EDF\\u7A7A\\u95F4\\u5DF2\\u4E0D\\u8DB3\\uFF0C\\u68C0\\u6D4B\\u5230\\u60A8\\u7684Docker\\u6839\\u76EE\\u5F55\\u4F4D\\u4E8E\\u7CFB\\u7EDF\\u6839\\u76EE\\u5F55\\u4E0A\\uFF0C\\u53EF\\u80FD\\u4F1A\\u5F71\\u54CD\\u7CFB\\u7EDF\\u7684\\u6B63\\u5E38\\u8FD0\\u884C\\uFF0C\\u5EFA\\u8BAE\\u4F7F\\u7528Docker\\u8FC1\\u79FB\\u5411\\u5BFC\\u5C06Docker\\u6839\\u76EE\\u5F55\\u8FC1\\u79FB\\u5230\\u5916\\u7F6E\\u786C\\u76D8\\u4E0A\\u3002\")])],-1)),Hl={key:1,class:\"tooltip-trigger\"},Rl={class:\"disk_tip\"},Wl=qt(()=>t(\"div\",null,[t(\"div\",{class:\"tooltip-text tooltip-top\"},[t(\"span\",{class:\"disk_dir_tip\"},\"\\u5206\\u533A\\u5B58\\u5728\\u5F02\\u5E38\\uFF0C\\u70B9\\u51FB\\u5206\\u533A\\u5217\\u8868\\u67E5\\u770B\\u9519\\u8BEF\")])],-1)),Gl={key:2,class:\"tooltip-trigger\"},Zl={class:\"disk_tip\"},jl=qt(()=>t(\"div\",null,[t(\"div\",{class:\"tooltip-text tooltip-top\"},[t(\"span\",{class:\"disk_dir_tip\"},\"\\u60A8\\u7684\\u7CFB\\u7EDF\\u7A7A\\u95F4\\u5DF2\\u4E0D\\u8DB3\\uFF0C\\u70B9\\u51FB\\u5206\\u533A\\u5217\\u8868\\u67E5\\u770B\\u9519\\u8BEF\")])],-1)),Xl=[\"onClick\"],Ql=[\"onClick\"],Yl={class:\"progress\"},Kl={class:\"button\"},Jl=[\"onClick\"],t1={key:0},e1={class:\"progress\"},u1={class:\"button\"},n1=[\"onClick\"],s1={key:1},o1={class:\"progress\"},a1={class:\"button\"},i1=[\"onClick\"],l1=V({__name:\"disk\",props:{title:String,type:String,smartWarning:Boolean},setup(e){const u=e,n=Ae(),a=W(()=>{var f,b,D,v;if(u.type===\"systemRoot\")return((b=(f=n==null?void 0:n.disk)==null?void 0:f.disks)==null?void 0:b.filter(l=>l.isSystemRoot))||[];if(u.type===\"notSystemRoot\")return[...(D=n==null?void 0:n.disk)==null?void 0:D.disks].filter(l=>!l.isSystemRoot)||[];if(u.type===\"raid\")return[...(v=n==null?void 0:n.raid)==null?void 0:v.disks]}),d=f=>f.usage>80?\"linear-gradient(91deg, #e7ab67 0.27%, #fa5b29 99.46%)\":\"linear-gradient(91deg, #4BCAE7 0.27%, #8ADE86 99.46%)\",F=()=>{at({title:\"S.M.A.R.T.\",src:\"/cgi-bin/luci/admin/nas/smart\"})},p=f=>{Ve({action:\"disk\",disk:f,Cancel:()=>{},Next:()=>{location.reload()}})},r=f=>{Bl({action:\"disk\",disk:f,Cancel:()=>{},Next:()=>{location.reload()}})},s=f=>{const b=f.childrens||[];Me({action:\"nas\",disk:f,mount:b[0],Cancel:()=>{},Next:()=>{location.reload()}})},i=f=>f.errorInfo?\"error\":f.childrens==null||f.childrens.length==0||f.childrens.length==1&&f.childrens[0].filesystem==\"No FileSystem\"?\"load\":f.childrens.filter(b=>b.mountPoint).length===0?\"unmounted\":\"success\",_=f=>{let b=f.name;return f.size&&(b+=`\\u3010${f.size}\\u3011`),f.venderModel&&(b+=`(${f.venderModel})`),b};return(f,b)=>{var D;return o(),c(\"div\",Al,[(D=a.value)!=null&&D.length?(o(),c(\"span\",xl,m(u.title),1)):$(\"\",!0),(o(!0),c(N,null,K(a.value,(v,l)=>{var E,h,k,w,y;return o(),c(\"div\",{class:\"item\",key:l},[i(v)===\"error\"?(o(),c(N,{key:0},[t(\"span\",null,m(_(v)),1),t(\"div\",Sl,[t(\"span\",null,m(v.errorInfo),1)])],64)):i(v)==\"success\"?(o(),c(N,{key:1},[t(\"span\",null,m(_(v)),1),v.smartWarning&&e.smartWarning?(o(),c(\"div\",Il,[t(\"div\",Pl,[t(\"div\",{style:tt({background:d(v),width:`${v.usage||0}%`})},null,4),t(\"span\",null,m(`${v.used}/${v.total}`),1)]),t(\"div\",Vl,[t(\"span\",{class:\"btn\",onClick:b[0]||(b[0]=g=>F())},[t(\"img\",{src:R(wl)},null,8,Ml),Tl])])])):(o(),c(\"div\",Ll,[t(\"div\",zl,[t(\"div\",{style:tt({background:d(v),width:`${v.usage||0}%`})},null,4),t(\"span\",null,m(`${v.used}/${v.total}`),1)]),t(\"div\",Ol,[v.isDockerRoot&&v.isSystemRoot&&v.usage&&v.usage>=90?(o(),c(\"span\",Nl,[t(\"span\",ql,[x(dt)]),Ul])):$(\"\",!0),!v.isSystemRoot&&(((E=v.childrens)==null?void 0:E.filter(g=>g.isReadOnly||g.filesystem==\"ntfs\").length)||0)>0?(o(),c(\"span\",Hl,[t(\"span\",Rl,[x(dt)]),Wl])):$(\"\",!0),(h=v.childrens)!=null&&h.filter(g=>g.isSystemRoot&&g.usage&&g.usage>80).length?(o(),c(\"span\",Gl,[t(\"span\",Zl,[x(dt)]),jl])):$(\"\",!0),!v.isSystemRoot&&(((k=v.childrens)==null?void 0:k.filter(g=>g.isReadOnly||g.filesystem==\"ntfs\").length)||0)>0?(o(),c(\"img\",{key:3,src:Ha,onClick:g=>p(v),alt:\"\"},null,8,Xl)):$(\"\",!0),t(\"img\",{onClick:g=>r(v),src:Ra,alt:\"\"},null,8,Ql)])]))],64)):i(v)===\"load\"?(o(),c(N,{key:2},[t(\"span\",null,m(_(v)),1),t(\"div\",Yl,[t(\"div\",{style:tt({width:`${v.usage||0}%`})},null,4),t(\"span\",null,m(`${v.used}/${v.total}`),1)]),t(\"div\",Kl,[t(\"span\",{class:\"btn\",onClick:g=>p(v)},\"\\u683C\\u5F0F\\u5316\\u5E76\\u6302\\u8F7D\",8,Jl)])],64)):i(v)===\"unmounted\"?(o(),c(N,{key:3},[t(\"span\",null,m(_(v)),1),((w=v.childrens)==null?void 0:w.length)==1?(o(),c(\"div\",t1,[t(\"div\",e1,[t(\"div\",{style:tt({background:d(v),width:`${v.usage||0}%`})},null,4),t(\"span\",null,m(`${v.used}/${v.total}`),1)]),t(\"div\",u1,[t(\"span\",{class:\"btn\",onClick:g=>s(v)},\"\\u624B\\u52A8\\u6302\\u8F7D\",8,n1)])])):$(\"\",!0),(((y=v.childrens)==null?void 0:y.length)||0)>1?(o(),c(\"div\",s1,[t(\"div\",o1,[t(\"div\",{style:tt({background:d(v),width:`${v.usage||0}%`})},null,4),t(\"span\",null,m(`${v.used}/${v.total}`),1)]),t(\"div\",a1,[t(\"span\",{class:\"btn\",onClick:g=>r(v)},\"\\u624B\\u52A8\\u6302\\u8F7D\",8,i1)])])):$(\"\",!0)],64)):$(\"\",!0)])}),128))])}}});var Rt=S(l1,[[\"__scopeId\",\"data-v-e039a994\"]]),ge=\"/luci-static/istorex/right.svg?v=173d63f8\";const c1=Xt('<div class=\"app-container_status-label_iconer\" data-v-580b5628><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"36\" height=\"28\" viewBox=\"0 0 36 28\" fill=\"none\" data-v-580b5628><rect width=\"36\" height=\"28\" rx=\"2\" fill=\"#E6E6E6\" data-v-580b5628></rect><rect x=\"3\" y=\"19\" width=\"6\" height=\"6\" fill=\"#CCCCCC\" data-v-580b5628></rect><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M5 3C3.89543 3 3 3.89543 3 5V17H11V21H14V25H22V21H25V17H33V5C33 3.89543 32.1046 3 31 3H5ZM5.5 5H6.5V13H5.5V5ZM8.5 5H9.5V13H8.5V5ZM12.5 5H11.5V13H12.5V5ZM14.5 5H15.5V13H14.5V5ZM18.5 5H17.5V13H18.5V5ZM20.5 5H21.5V13H20.5V5ZM24.5 5H23.5V13H24.5V5ZM26.5 5H27.5V13H26.5V5ZM30.5 5H29.5V13H30.5V5Z\" fill=\"#999999\" data-v-580b5628></path></svg></div>',1),d1={class:\"app-container_status-label_text\"},r1={class:\"text_status\"},_1={class:\"text_info\"},p1=Xt('<div class=\"app-container_status-label_iconer\" data-v-580b5628><svg xmlns=\"http://www.w3.org/2000/svg\" width=\"36\" height=\"28\" viewBox=\"0 0 36 28\" fill=\"none\" data-v-580b5628><rect width=\"36\" height=\"28\" rx=\"2\" fill=\"#E6E6E6\" data-v-580b5628></rect><rect x=\"3\" y=\"19\" width=\"6\" height=\"6\" fill=\"#8ECF57\" data-v-580b5628></rect><path fill-rule=\"evenodd\" clip-rule=\"evenodd\" d=\"M5 3C3.89543 3 3 3.89543 3 5V17H11V21H14V25H22V21H25V17H33V5C33 3.89543 32.1046 3 31 3H5ZM5.5 5H6.5V13H5.5V5ZM8.5 5H9.5V13H8.5V5ZM12.5 5H11.5V13H12.5V5ZM14.5 5H15.5V13H14.5V5ZM18.5 5H17.5V13H18.5V5ZM20.5 5H21.5V13H20.5V5ZM24.5 5H23.5V13H24.5V5ZM26.5 5H27.5V13H26.5V5ZM30.5 5H29.5V13H30.5V5Z\" fill=\"#4D4D4D\" data-v-580b5628></path></svg></div>',1),v1={class:\"app-container_status-label_text\"},h1={class:\"text_info\"},F1=V({__name:\"item\",props:{item:{type:Object,required:!0},transform:{type:Number,default:0}},setup(e){const u=e,n=xe(),a=C(null),d=p=>{const r=p.target,{left:s,top:i}=r.getBoundingClientRect();n.portitemStyle.show=!0,n.portitemStyle.left=s,n.portitemStyle.top=i,n.portitemStyle.portitem=u.item},F=p=>{n.portitemStyle.show=!1};return(p,r)=>(o(),c(\"div\",{class:\"app-container_status-label_bg\",style:tt(`transform: translateX(${e.transform}px);`),ref_key:\"el\",ref:a,onMouseenter:d,onMouseleave:F},[e.item.linkState==\"DOWN\"?(o(),c(N,{key:0},[c1,t(\"div\",d1,[t(\"div\",r1,m(p.$t(\"\\u5DF2\\u65AD\\u5F00\")),1),t(\"div\",_1,m(e.item.name)+\" \"+m(e.item.interfaceNames?`(${e.item.interfaceNames.join(\",\").toLocaleUpperCase()})`:\"\"),1)])],64)):(o(),c(N,{key:1},[p1,t(\"div\",v1,[t(\"div\",null,m(e.item.linkSpeed),1),t(\"div\",h1,m(e.item.name)+\" \"+m(e.item.interfaceNames?`(${e.item.interfaceNames.join(\",\").toLocaleUpperCase()})`:\"\"),1)])],64))],36))}});var m1=S(F1,[[\"__scopeId\",\"data-v-580b5628\"]]);const f1=V({__name:\"index\",props:{portList:{type:Array,required:!0}},setup(e){const u=C(),n=C(0),a=C(0),d=C(0),F=C(!1),p=()=>{if(d.value>=0){d.value=0;return}d.value+=100},r=()=>{if(d.value<=0-n.value+a.value){d.value=0-n.value+a.value;return}d.value-=100};return et(()=>{Xe(()=>{u.value&&(n.value=u.value.scrollWidth,a.value=u.value.clientWidth,F.value=n.value>a.value)})}),(s,i)=>(o(),c(\"div\",{class:\"app-interfaces\",ref_key:\"el\",ref:u},[F.value?(o(),c(N,{key:0},[t(\"img\",{src:ge,class:\"btn-f\",alt:\"\",onClick:p}),t(\"img\",{src:ge,class:\"btn-r\",alt:\"\",onClick:r})],64)):$(\"\",!0),(o(!0),c(N,null,K(e.portList,(_,f)=>(o(),z(m1,{item:_,transform:d.value},null,8,[\"item\",\"transform\"]))),256))],512))}});var E1=S(f1,[[\"__scopeId\",\"data-v-92f8fb6c\"]]);const C1={class:\"status-card\"},g1=V({__name:\"interfacer-status\",setup(e){const u=mt({portList:[],load:!1});return(()=>{P.Network.PortList.GET().then(a=>{if(a!=null&&a.data){const{result:d}=a==null?void 0:a.data;d&&(u.portList=d.ports||[])}}).finally(()=>{u.load=!0})})(),(a,d)=>(o(),c(\"div\",C1,[u.load?(o(),z(E1,{key:0,portList:u.portList},null,8,[\"portList\"])):$(\"\",!0)]))}});var $1=S(g1,[[\"__scopeId\",\"data-v-2244abae\"]]);const rt={installApp:(e,u)=>new Promise((n,a)=>{let d=0;P.App.Install.POST({name:e}).then(()=>{const F=setTimeout(()=>{d==0&&(d=1,n(!1))},(u||60)*1e3),p=()=>{d==0&&P.App.Check.POST({name:e}).then(r=>{if(d==0&&r!=null&&r.data){const{result:s}=r.data;if((s==null?void 0:s.status)==\"installed\"){clearTimeout(F),d=1,n(!0);return}}}).catch(r=>{}).finally(()=>{d==0&&setTimeout(p,3e3)})};setTimeout(p,3e3)}).catch(F=>{d==0&&(d=1,a(\"\\u5B89\\u88C5\\u5931\\u8D25\\uFF0C\"+F))})}),checkAndInstallApp:(e,u,n)=>T(void 0,null,function*(){let a=A.Loading(\"\\u68C0\\u67E5\\u4E2D...\");try{const d=yield P.App.Check.POST({name:e});if(a.Close(),d!=null&&d.data){const{result:F,error:p}=d.data;if(p)A.Warning(p);else if(F){if(F.status==\"installed\")return!0;if(confirm(`\\u68C0\\u6D4B\\u5230\\u4F60\\u5C1A\\u672A\\u5B89\\u88C5 ${u} \\u63D2\\u4EF6,\\u662F\\u5426\\u5B89\\u88C5\\uFF1F`)){a=A.Loading(\"\\u6B63\\u5728\\u5B89\\u88C5\\u4E2D...\");const r=yield rt.installApp(n||e);if(a.Close(),r)return!0;A.Error(\"\\u5B89\\u88C5\\u5931\\u8D25\\u6216\\u8D85\\u65F6\\uFF0C\\u8BF7\\u68C0\\u67E5\\u8F6F\\u4EF6\\u6E90\\u6216\\u7A0D\\u5019\\u91CD\\u8BD5\")}}else A.Warning(\"\\u68C0\\u67E5\\u63D2\\u4EF6\\u72B6\\u6001\\u5931\\u8D25\")}return!1}catch(d){return a.Close(),A.Warning(d),!1}}),installAndGo:(e,u,n,a)=>T(void 0,null,function*(){(yield rt.checkAndInstallApp(e,u,a))&&(location.href=n)})};const b1={class:\"width-50 responsive\"},y1={class:\"chart\"},D1={class:\"info\"},k1={class:\"width-50 responsive\"},B1=V({__name:\"index\",setup(e){const u=Nt.stampForm,n=mt({cpuUsage:0,cpuTemperature:0,memAvailablePercentage:0,uptime:0,localtime:\"\"}),a=mt({firmwareVersion:\"\",kernelVersion:\"\",model:\"\"});mt({root:[],loaded:[]});const d={interfaceconfig:[{text:\"\\u7F51\\u53E3\\u914D\\u7F6E\",onClick:()=>{at({title:\"\\u7F51\\u53E3\\u914D\\u7F6E\",src:\"/cgi-bin/luci/admin/quickstart/interfaceconfig\"})}}],system:[{text:\"\\u7CFB\\u7EDF\\u76D1\\u63A7\",onClick:()=>{rt.installAndGo(\"app-meta-netdata\",\"NetData\",\"/cgi-bin/luci/admin/status/netdata\")}},{text:\"\\u5907\\u4EFD\\u5347\\u7EA7\",onClick:()=>{at({title:\"\\u5907\\u4EFD\\u5347\\u7EA7\",src:\"/cgi-bin/luci/admin/system/flash\"})}},{text:\"\\u63D2\\u4EF6\\u5907\\u4EFD\",onClick:()=>{at({title:\"\\u63D2\\u4EF6\\u5907\\u4EFD\",src:\"/cgi-bin/luci/admin/store/pages/maintance\"})}}],disk:[{text:\"RAID\\u7BA1\\u7406\",onClick:()=>{at({title:\"RAID\\u7BA1\\u7406\",src:\"/cgi-bin/luci/admin/nas/raid\"})}},{text:\"S.M.A.R.T.\",onClick:()=>{at({title:\"S.M.A.R.T.\",src:\"/cgi-bin/luci/admin/nas/smart\"})}},{text:\"\\u78C1\\u76D8\\u7BA1\\u7406\",onClick:()=>{at({title:\"\\u78C1\\u76D8\\u7BA1\\u7406\",src:\"/cgi-bin/luci/admin/system/diskman\"})}},{text:\"\\u6302\\u8F7D\\u70B9\",onClick:()=>{at({title:\"\\u6302\\u8F7D\\u70B9\",src:\"/cgi-bin/luci/admin/system/mounts\"})}}]},F=()=>T(this,null,function*(){var b,D,v,l,E;const f=yield P.System.Status.GET();console.log(\"getSystemStatus\",f.data.result),f.data.result&&(n.uptime=(b=f.data.result)==null?void 0:b.uptime,n.localtime=(D=f.data.result)==null?void 0:D.localtime,n.cpuUsage=((v=f.data.result)==null?void 0:v.cpuUsage)||0,n.memAvailablePercentage=100-((l=f.data.result)==null?void 0:l.memAvailablePercentage)||0,n.cpuTemperature=(E=f.data.result)==null?void 0:E.cpuTemperature,_.cpu&&_.cpu.setValue(n.cpuUsage),_.men&&_.men.setValue(n.memAvailablePercentage),_.temperature&&_.temperature.setValue(n.cpuTemperature),window.setInterval(()=>{n.uptime&&(n.uptime=n.uptime+1),n.localtime&&(n.localtime=String(me(me(n.localtime).unix()*1e3+1e3).format(\"YYYY-MM-DD HH:mm:ss\")))},1e3))}),p=()=>T(this,null,function*(){var b,D,v;const f=yield P.System.Version.GET();console.log(\"getSystemVersion\",f),f.data.result&&(a.firmwareVersion=(b=f.data.result)==null?void 0:b.firmwareVersion,a.kernelVersion=(D=f.data.result)==null?void 0:D.kernelVersion,a.model=(v=f.data.result)==null?void 0:v.model)});Ae();const r=C(null),s=C(null),i=C(null),_={cpu:null,men:null,temperature:null};return et(()=>{r.value&&s.value&&i.value&&(_.cpu=Ht({el:r.value,value:n.cpuUsage,name:ct.global.t(\"CPU\\u4F7F\\u7528\\u7387\"),labelColor:\"rgba(0, 0, 0, 0.80)\",numberColor:\"#32CFA4\",labelFontSize:10,numberFontSize:14,radius:\"100%\",progressBackgroundColor:\"rgba(0, 0, 0, 0.04)\",progressColor:{type:\"linear\",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:\"#8ADE86\"},{offset:1,color:\"#4BCAE7\"}],global:!1}}),_.men=Ht({el:s.value,value:n.memAvailablePercentage,name:ct.global.t(\"\\u5185\\u5B58\\u4F7F\\u7528\\u7387\"),labelColor:\"rgba(0, 0, 0, 0.80)\",numberColor:\"#F66631\",labelFontSize:10,numberFontSize:14,radius:\"100%\",progressBackgroundColor:\"rgba(0, 0, 0, 0.04)\",progressColor:{type:\"linear\",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:\"#E5B56E\"},{offset:1,color:\"#FD4812E5\"}],global:!1}}),_.temperature=Ht({el:i.value,value:n.cpuTemperature,name:ct.global.t(\"CPU\\u6E29\\u5EA6\"),labelColor:\"rgba(0, 0, 0, 0.80)\",numberColor:\"#32CFA4\",labelFontSize:10,numberFontSize:14,radius:\"100%\",progressBackgroundColor:\"rgba(0, 0, 0, 0.04)\",unit:\"\\xB0C\",progressColor:{type:\"linear\",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:\"#8ADE86\"},{offset:1,color:\"#4BCAE7\"}],global:!1}}))}),F(),p(),(f,b)=>(o(),z(ft,null,{default:M(()=>[t(\"div\",b1,[x(j,{title:f.$t(\"\\u7F51\\u7EDC\\u63A5\\u53E3\\u72B6\\u6001\"),span:24,\"more-actions\":d.interfaceconfig,padding:\"0 10px 8px 10px\"},{default:M(()=>[x($1)]),_:1},8,[\"title\",\"more-actions\"]),x(j,{title:f.$t(\"\\u7CFB\\u7EDF\\u4FE1\\u606F\"),padding:\"0 10px 8px 10px\",span:24,\"more-actions\":d.system},{default:M(()=>[t(\"div\",y1,[t(\"div\",{class:\"gauge\",ref_key:\"temperature\",ref:i},null,512),t(\"div\",{class:\"gauge\",ref_key:\"cpu\",ref:r},null,512),t(\"div\",{class:\"gauge\",ref_key:\"men\",ref:s},null,512)]),t(\"div\",D1,[t(\"div\",null,[t(\"span\",null,m(f.$t(\"\\u8BBE\\u5907\\u578B\\u53F7\"))+\"\\uFF1A\",1),t(\"span\",null,m(a.model),1)]),t(\"div\",null,[t(\"span\",null,m(f.$t(\"\\u56FA\\u4EF6\\u7248\\u672C\"))+\"\\uFF1A\",1),t(\"span\",null,m(a.firmwareVersion),1)]),t(\"div\",null,[t(\"span\",null,m(f.$t(\"\\u5185\\u6838\\u7248\\u672C\"))+\"\\uFF1A\",1),t(\"span\",null,m(a.kernelVersion),1)]),t(\"div\",null,[t(\"span\",null,m(f.$t(\"\\u5DF2\\u542F\\u52A8\"))+\"\\uFF1A\",1),t(\"span\",null,m(R(u)(n.uptime)),1)]),t(\"div\",null,[t(\"span\",null,m(f.$t(\"\\u7CFB\\u7EDF\\u65F6\\u95F4\"))+\"\\uFF1A\",1),t(\"span\",null,m(n.localtime),1)])])]),_:1},8,[\"title\",\"more-actions\"])]),t(\"div\",k1,[x(j,{title:f.$t(\"\\u78C1\\u76D8\\u4FE1\\u606F\"),padding:\"0 10px 8px 10px\",helpLink:\"https://www.linkease.com/rd/8myYAEVA/\",span:24,\"more-actions\":d.disk},{default:M(()=>[x(Rt,{title:f.$t(\"\\u7CFB\\u7EDF\\u6839\\u76EE\\u5F55\"),type:\"systemRoot\"},null,8,[\"title\"]),x(Rt,{title:f.$t(\"\\u5DF2\\u6302\\u8F7D\\u78C1\\u76D8\"),smartWarning:!0,type:\"notSystemRoot\"},null,8,[\"title\"]),x(Rt,{title:f.$t(\"RAID\\u8BBE\\u5907\"),type:\"raid\"},null,8,[\"title\"])]),_:1},8,[\"title\",\"more-actions\"])])]),_:1}))}});var w1=S(B1,[[\"__scopeId\",\"data-v-3f470552\"]]),A1=\"/luci-static/istorex/setting.svg?v=9ffe8a9b\";const x1={class:\"app\"},S1={class:\"setting\"},I1=[\"src\"],P1=[\"src\"],V1=V({__name:\"app\",props:{title:{},title_en:{},name:{},isWebUrl:{type:Function},openApp:{type:Function},openWebUrl:{type:Function}},setup(e){const u=e,n=C(localStorage.getItem(\"i18n\")),a=d=>P.ApiStore.getStoreAppIcon(`/static-icon/openwrt-app-meta/app-meta-${d}/logo.png`);return et(()=>{Ie.subscribe(\"changeLocale\",(d,F)=>{F===\"auto\"?n.value=navigator.language:n.value=F})}),(d,F)=>(o(),c(\"div\",x1,[u.isWebUrl()?(o(),c(\"div\",{key:0,onClick:F[1]||(F[1]=p=>u.openWebUrl())},[t(\"span\",S1,[t(\"img\",{src:A1,alt:\"\",onClick:F[0]||(F[0]=p=>{p.stopPropagation(),u.openApp()})})]),t(\"div\",null,[t(\"img\",{class:\"app-icon\",src:a(u.name),alt:\"\\u56FE\\u6807\\u51FA\\u8D70\\u5566\"},null,8,I1),t(\"span\",null,m(n.value===\"en\"&&u.title_en||u.title),1)])])):(o(),c(\"div\",{key:1,onClick:F[2]||(F[2]=p=>u.openApp())},[t(\"div\",null,[t(\"img\",{class:\"app-icon\",src:a(u.name),alt:\"\\u56FE\\u6807\\u51FA\\u8D70\\u5566\"},null,8,P1),t(\"span\",null,m(n.value===\"en\"&&u.title_en||u.title),1)])]))]))}});var M1=S(V1,[[\"__scopeId\",\"data-v-61b6e601\"]]);const T1=e=>(q(\"data-v-283b2956\"),e=e(),U(),e),L1={class:\"app-store\"},z1=T1(()=>t(\"span\",null,\"APP Store\",-1)),O1=V({__name:\"index\",setup(e){const u=Qe(),n=W(()=>u.localApps.filter(d=>d.name!=\"istorex\"));return(()=>T(this,null,function*(){yield u.getApp()}))(),(d,F)=>(o(),z(ft,{title:d.$t(\"\\u5E94\\u7528\\u4E2D\\u5FC3\")},{default:M(()=>[t(\"div\",L1,[t(\"div\",{class:\"store\",onClick:F[0]||(F[0]=p=>R(Ye).Open())},[t(\"div\",null,[t(\"div\",null,[t(\"span\",null,m(d.$t(\"\\u5E94\\u7528\\u5546\\u5E97\")),1),z1])])]),(o(!0),c(N,null,K(n.value,p=>(o(),z(M1,Ke(Je(p)),null,16))),256))])]),_:1},8,[\"title\"]))}});var N1=S(O1,[[\"__scopeId\",\"data-v-283b2956\"]]),q1=\"/luci-static/istorex/copy.png?v=7ec874a7\";const _t=e=>(q(\"data-v-43beecef\"),e=e(),U(),e),U1={class:\"actioner-container\"},H1=_t(()=>t(\"div\",{class:\"actioner-container_header\"},[t(\"span\",null,\"\\u57DF\\u540D\\u914D\\u7F6E\\u5411\\u5BFC\")],-1)),R1={class:\"actioner-container_body\"},W1={class:\"label-item\"},G1=_t(()=>t(\"span\",null,\"DDNSTO\",-1)),Z1=_t(()=>t(\"p\",{class:\"label_info\"},\"DDNSTO \\u662F\\u4E00\\u4E2A\\u4E0D\\u9700\\u8981\\u516C\\u7F51IP\\u4E5F\\u53EF\\u4EE5\\u5728\\u5916\\u7F51\\u8BBF\\u95EE\\u7684\\u7A7F\\u900F\\u57DF\\u540D\\u670D\\u52A1\\uFF0C\\u4E00\\u4E2A\\u6D4F\\u89C8\\u5668\\u641E\\u5B9A\\u5185\\u7F51\\u7A7F\\u900F\\uFF0C\\u8FDC\\u7A0B\\u8BBF\\u95EEOpenwrt\\u3001\\u8FDC\\u7A0B\\u7EC8\\u7AEF\\u3001\\u8FDC\\u7A0B\\u684C\\u9762...\",-1)),j1={class:\"label-item\"},X1=_t(()=>t(\"span\",null,\"\\u963F\\u91CC\\u4E91\",-1)),Q1=_t(()=>t(\"p\",{class:\"label_info\"},\" \\u4E3A\\u62E5\\u6709\\u52A8\\u6001IP\\u7684\\u4E3B\\u673A\\u914D\\u7F6E\\u4E00\\u4E2A\\u56FA\\u5B9A\\u7684\\u53EF\\u8BBF\\u95EE\\u57DF\\u540D \",-1)),Y1={class:\"label-item\"},K1=_t(()=>t(\"span\",null,\"Dnspod\",-1)),J1=_t(()=>t(\"p\",{class:\"label_info\"},\" \\u4E3A\\u62E5\\u6709\\u52A8\\u6001IP\\u7684\\u4E3B\\u673A\\u914D\\u7F6E\\u4E00\\u4E2A\\u56FA\\u5B9A\\u7684\\u53EF\\u8BBF\\u95EE\\u57DF\\u540D \",-1)),tc={class:\"label-item\"},ec=_t(()=>t(\"span\",null,\"\\u82B1\\u751F\\u58F3\",-1)),uc=_t(()=>t(\"p\",{class:\"label_info\"},\" \\u4E3A\\u62E5\\u6709\\u52A8\\u6001IP\\u7684\\u4E3B\\u673A\\u914D\\u7F6E\\u4E00\\u4E2A\\u56FA\\u5B9A\\u7684\\u53EF\\u8BBF\\u95EE\\u57DF\\u540D \",-1)),nc=V({__name:\"setup-index\",props:{onSetup:{type:Function,required:!0},active:{type:String,default:\"ddnsto\"}},emits:[\"update:active\"],setup(e,{emit:u}){const n=e,a=()=>{n.onSetup()},d=C(n.active),F=()=>{switch(u(\"update:active\",d.value),d.value){case\"ddnsto\":n.onSetup(\"ddnsto\");break;case\"ali\":n.onSetup(\"ddns-ali\");break;case\"dnspod\":n.onSetup(\"ddns-dnspod\");break;case\"oray\":n.onSetup(\"ddns-oray\");break}};return(p,r)=>(o(),c(\"div\",U1,[H1,t(\"div\",R1,[t(\"div\",W1,[t(\"label\",null,[L(t(\"input\",{type:\"radio\",\"onUpdate:modelValue\":r[0]||(r[0]=s=>d.value=s),value:\"ddnsto\"},null,512),[[it,d.value]]),G1]),Z1]),t(\"div\",j1,[t(\"label\",null,[L(t(\"input\",{type:\"radio\",\"onUpdate:modelValue\":r[1]||(r[1]=s=>d.value=s),value:\"ali\"},null,512),[[it,d.value]]),X1]),Q1]),t(\"div\",Y1,[t(\"label\",null,[L(t(\"input\",{type:\"radio\",\"onUpdate:modelValue\":r[2]||(r[2]=s=>d.value=s),value:\"dnspod\"},null,512),[[it,d.value]]),K1]),J1]),t(\"div\",tc,[t(\"label\",null,[L(t(\"input\",{type:\"radio\",\"onUpdate:modelValue\":r[3]||(r[3]=s=>d.value=s),value:\"oray\"},null,512),[[it,d.value]]),ec]),uc])]),t(\"div\",{class:\"actioner-container_footer\"},[t(\"div\",{class:\"close\",onClick:a},\"\\u53D6\\u6D88\"),t(\"div\",{class:\"next\",onClick:F},\"\\u4E0B\\u4E00\\u6B65\")])]))}});var sc=S(nc,[[\"__scopeId\",\"data-v-43beecef\"]]);const zt=e=>(q(\"data-v-43dd65a2\"),e=e(),U(),e),oc={class:\"actioner-container\"},ac={class:\"actioner-container_body\"},ic=zt(()=>t(\"svg\",{t:\"1642063181211\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"5062\",width:\"128\",height:\"128\",\"data-v-cda444e0\":\"\"},[t(\"path\",{d:\"M512 85.333333c235.648 0 426.666667 191.018667 426.666667 426.666667s-191.018667 426.666667-426.666667 426.666667S85.333333 747.648 85.333333 512 276.352 85.333333 512 85.333333z m-74.965333 550.4L346.453333 545.152a42.666667 42.666667 0 1 0-60.330666 60.330667l120.704 120.704a42.666667 42.666667 0 0 0 60.330666 0l301.653334-301.696a42.666667 42.666667 0 1 0-60.288-60.330667l-271.530667 271.488z\",fill:\"#52C41A\",\"p-id\":\"5063\",\"data-v-cda444e0\":\"\"})],-1)),lc=zt(()=>t(\"div\",{class:\"body-title\"},\"\\u6DFB\\u52A0\\u6210\\u529F\",-1)),cc=zt(()=>t(\"p\",{class:\"body-tips\"},\"\\u8BF7\\u7A0D\\u7B491\\u5206\\u949F\\u751F\\u6548\\u540E\\u518D\\u4F7F\\u7528\\u3002\",-1)),dc={class:\"body-info\"},rc=zt(()=>t(\"span\",null,\"\\u8BBF\\u95EE\\u5730\\u5740\\uFF1A\",-1)),_c=[\"href\"],pc=zt(()=>t(\"div\",null,[t(\"span\",null,\"\\u53EF\\u524D\\u5F80\"),t(\"a\",{href:\"/cgi-bin/luci/admin/services/ddns\",target:\"_blank\"},\"\\u670D\\u52A1-\\u52A8\\u6001DNS\"),t(\"span\",null,\"\\u67E5\\u770B\\u66F4\\u591A\\u8BE6\\u60C5\")],-1)),vc=V({__name:\"setup-ddns-success\",props:{target:{type:String,required:!0},onSetup:{type:Function,required:!0}},setup(e){const u=()=>{location.reload()};return(n,a)=>(o(),c(\"div\",oc,[t(\"div\",ac,[ic,lc,cc,t(\"div\",dc,[rc,t(\"a\",{href:e.target,target:\"_blank\",rel:\"noopener noreferrer\"},m(e.target),9,_c)]),pc]),t(\"div\",{class:\"actioner-container_footer\"},[t(\"div\",{class:\"close\",onClick:u},\"\\u5173\\u95ED\")])]))}});var hc=S(vc,[[\"__scopeId\",\"data-v-43dd65a2\"]]);const ze=e=>(q(\"data-v-7790f1da\"),e=e(),U(),e),Fc={class:\"actioner-container\"},mc=ze(()=>t(\"div\",{class:\"actioner-container_header\"},[t(\"span\",null,\"\\u57DF\\u540D\\u914D\\u7F6E\\u5411\\u5BFC\")],-1)),fc=ze(()=>t(\"div\",{class:\"actioner-container_body ddnsto-login\"},[t(\"iframe\",{src:\"https://www.kooldns.cn/bind/#/auth?send=1&source=openwrt&callback=*\"})],-1)),Ec=V({__name:\"setup-ddnsto-login\",props:{onSetup:{type:Function,required:!0},onDdnstoConfig:{type:Function,required:!0}},setup(e){const u=e,n=()=>{u.onSetup()},a=d=>{if(d.data.auth==\"ddnsto\"){const F=d.data.sign,p=d.data.token;F&&p&&(removeEventListener(\"message\",a),u.onDdnstoConfig(F,p),u.onSetup(\"ddnsto-run\"))}};return et(()=>{window.addEventListener(\"message\",a)}),Bt(()=>{removeEventListener(\"message\",a)}),(d,F)=>(o(),c(\"div\",Fc,[mc,fc,t(\"div\",{class:\"actioner-container_footer\"},[t(\"div\",{class:\"close\",onClick:n},\"\\u53D6\\u6D88\")])]))}});var Cc=S(Ec,[[\"__scopeId\",\"data-v-7790f1da\"]]);const gc=e=>(q(\"data-v-5baf4b05\"),e=e(),U(),e),$c={class:\"actioner-container\"},bc=gc(()=>t(\"div\",{class:\"actioner-container_header\"},[t(\"span\",null,\"\\u57DF\\u540D\\u914D\\u7F6E\\u5411\\u5BFC\")],-1)),yc={class:\"actioner-container_body ddnsto-bind\"},Dc=[\"src\"],kc=V({__name:\"setup-ddnsto-bind\",props:{onSetup:{type:Function,required:!0},config:{type:Object,required:!0},domain:{type:String,required:!0}},emits:[\"update:domain\"],setup(e,{emit:u}){const n=e,a=W(()=>{const{domain:p,token:r,sign:s,routerId:i,netaddr:_}=n.config,f=encodeURIComponent(p),b=encodeURIComponent(_);return`https://www.kooldns.cn/bind/#/domain?domain=${f}&sign=${s}&token=${r}&routerId=${i}&netaddr=${b}`}),d=p=>{if(p.data){const{auth:r,url:s}=p.data;r===\"ddnsto\"&&s&&F(s)}},F=p=>T(this,null,function*(){var r;try{const s=yield P.Guide.DdnstoAddress.POST({address:p});s!=null&&s.data&&(((r=s==null?void 0:s.data)==null?void 0:r.success)||0)==0&&(u(\"update:domain\",p),n.onSetup(\"ddnsto-save\"))}catch(s){}});return et(()=>{window.addEventListener(\"message\",d)}),Bt(()=>{removeEventListener(\"message\",d)}),(p,r)=>(o(),c(\"div\",$c,[bc,t(\"div\",yc,[t(\"iframe\",{src:a.value},null,8,Dc)])]))}});var Bc=S(kc,[[\"__scopeId\",\"data-v-5baf4b05\"]]);const Ot=e=>(q(\"data-v-02a6c9d8\"),e=e(),U(),e),wc={class:\"actioner-container\"},Ac={class:\"actioner-container_body\"},xc=Ot(()=>t(\"svg\",{t:\"1642063181211\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"5062\",width:\"128\",height:\"128\",\"data-v-cda444e0\":\"\"},[t(\"path\",{d:\"M512 85.333333c235.648 0 426.666667 191.018667 426.666667 426.666667s-191.018667 426.666667-426.666667 426.666667S85.333333 747.648 85.333333 512 276.352 85.333333 512 85.333333z m-74.965333 550.4L346.453333 545.152a42.666667 42.666667 0 1 0-60.330666 60.330667l120.704 120.704a42.666667 42.666667 0 0 0 60.330666 0l301.653334-301.696a42.666667 42.666667 0 1 0-60.288-60.330667l-271.530667 271.488z\",fill:\"#52C41A\",\"p-id\":\"5063\",\"data-v-cda444e0\":\"\"})],-1)),Sc=Ot(()=>t(\"div\",{class:\"body-title\"},\"\\u6DFB\\u52A0\\u6210\\u529F\",-1)),Ic=Ot(()=>t(\"p\",{class:\"body-tips\"},\"\\u8BF7\\u7A0D\\u7B491\\u5206\\u949F\\u751F\\u6548\\u540E\\u518D\\u4F7F\\u7528\\u3002\",-1)),Pc={class:\"body-info\"},Vc=Ot(()=>t(\"span\",null,\"\\u8BBF\\u95EE\\u5730\\u5740\\uFF1A\",-1)),Mc=[\"href\"],Tc=Ot(()=>t(\"div\",null,[t(\"span\",null,\"\\u53EF\\u524D\\u5F80\"),t(\"a\",{href:\"https://www.ddnsto.com/app/#/devices\",target:\"_blank\"},\"DDNSTO\\u63A7\\u5236\\u53F0\"),t(\"span\",null,\"\\u67E5\\u770B\\u66F4\\u591A\\u8BE6\\u60C5\")],-1)),Lc=V({__name:\"setup-ddnsto-save\",props:{onSetup:{type:Function,required:!0},target:{type:String,required:!0}},setup(e){const u=()=>{location.reload()};return(n,a)=>(o(),c(\"div\",wc,[t(\"div\",Ac,[xc,Sc,Ic,t(\"div\",Pc,[Vc,t(\"a\",{href:e.target,target:\"_blank\",rel:\"noopener noreferrer\"},m(e.target),9,Mc)]),Tc]),t(\"div\",{class:\"actioner-container_footer\"},[t(\"div\",{class:\"close\",onClick:u},\"\\u5173\\u95ED\")])]))}});var zc=S(Lc,[[\"__scopeId\",\"data-v-02a6c9d8\"]]);const Oc=e=>(q(\"data-v-4f87c1d1\"),e=e(),U(),e),Nc={class:\"actioner-container\"},qc=Oc(()=>t(\"div\",{class:\"actioner-container_header\"},[t(\"span\",null,\"\\u57DF\\u540D\\u914D\\u7F6E\\u5411\\u5BFC\")],-1)),Uc={class:\"actioner-container_body\"},Hc={class:\"actioner-container_footer\"},Rc=V({__name:\"setup-ddnsto-install\",props:{onSetup:{type:Function,required:!0}},setup(e){const u=e,n=()=>{u.onSetup()},a=()=>T(this,null,function*(){if(p.value)return;p.value=!0;const s=A.Loading(\"\\u5B89\\u88C5\\u4E2D...\");try{if(yield rt.installApp(\"app-meta-ddnsto\",30)){u.onSetup(\"ddnsto-login\");return}else d.value=\"\\u5B89\\u88C5\\u5931\\u8D25\"}catch(i){d.value=i}finally{s.Close()}p.value=!1}),d=C(\"\\u6B63\\u5728\\u68C0\\u6D4B\\u4E2D...\"),F=C(!1),p=C(!1);return(()=>T(this,null,function*(){try{const s=yield P.App.Check.POST({name:\"ddnsto\"});if(s!=null&&s.data){const{result:i,error:_}=s.data;if(_){d.value=_;return}if(i){if(i.status==\"installed\"){u.onSetup(\"ddnsto-login\");return}i.status==\"uninstalled\"&&(d.value=\"\\u9700\\u8981\\u5B89\\u88C5DDNSTO\\u63D2\\u4EF6\\uFF0C\\u70B9\\u51FB\\u201C\\u786E\\u5B9A\\u201D\\u5F00\\u59CB\\u5B89\\u88C5\")}}}catch(s){d.value=s}F.value=!0}))(),(s,i)=>(o(),c(\"div\",Nc,[qc,t(\"div\",Uc,[t(\"span\",null,m(d.value),1)]),t(\"div\",Hc,[F.value?(o(),c(N,{key:0},[t(\"div\",{class:\"close\",onClick:n},\"\\u53D6\\u6D88\"),t(\"div\",{class:\"next\",onClick:a},\"\\u786E\\u5B9A\")],64)):$(\"\",!0)])]))}});var Wc=S(Rc,[[\"__scopeId\",\"data-v-4f87c1d1\"]]);const Gc=e=>(q(\"data-v-06c9d91d\"),e=e(),U(),e),Zc={class:\"actioner-container\"},jc=Gc(()=>t(\"div\",{class:\"actioner-container_header\"},[t(\"span\",null,\"\\u57DF\\u540D\\u914D\\u7F6E\\u5411\\u5BFC\")],-1)),Xc={class:\"actioner-container_body\"},Qc=V({__name:\"setup-ddnsto-run\",props:{onSetup:{type:Function,required:!0},token:{type:String,required:!0},onDdnstoLocalConfig:{type:Function,required:!0}},setup(e){const u=e,n=C(\"\\u6B63\\u5728\\u68C0\\u6D4B\\u63D2\\u4EF6\\u662F\\u5426\\u5DF2\\u542F\\u52A8...\");(s=>T(this,null,function*(){var i;try{const _=yield P.Guide.Ddnsto.POST({token:u.token});_!=null&&_.data&&(_.data.error&&(n.value=_.data.error),(((i=_==null?void 0:_.data)==null?void 0:i.success)||0)==0&&F())}catch(_){n.value=_}}))(u.token);const d=C(),F=()=>{const s=()=>T(this,null,function*(){if((yield p())===!0){r();return}d.value=window.setTimeout(s,2e3)});s()},p=()=>T(this,null,function*(){try{const s=yield P.App.Check.POST({name:\"ddnsto\",checkRunning:!0});if(s!=null&&s.data){s.data.error&&(n.value=s.data.error);const i=s.data.result;if((i==null?void 0:i.status)==\"running\")return!0}}catch(s){n.value=s}return!1});Bt(()=>{d.value&&clearInterval(d.value)});const r=()=>T(this,null,function*(){var s;try{const i=yield P.Guide.DdntoConfig.GET();if(i!=null&&i.data&&(i.data.error&&(n.value=i.data.error),(((s=i==null?void 0:i.data)==null?void 0:s.success)||0)==0&&i.data.result)){const _=i.data.result;u.onDdnstoLocalConfig(_.netAddr,_.deviceId),u.onSetup(\"ddnsto-bind\")}}catch(i){n.value=i}});return(s,i)=>(o(),c(\"div\",Zc,[jc,t(\"div\",Xc,m(n.value),1)]))}});var Yc=S(Qc,[[\"__scopeId\",\"data-v-06c9d91d\"]]);const Kc={class:\"action-main\"},Jc=V({__name:\"index\",props:{Close:{type:Function,required:!0},url:{type:String,required:!0}},setup(e){const u=e,n=C(\"ddnsto-install\"),a=s=>{s!=null?n.value=s:d()},d=()=>{u.Close&&u.Close()},F=mt({sign:\"\",token:\"\",domain:u.url,netaddr:\"\",routerId:\"\"}),p=(s,i)=>{F.sign=s,F.token=i},r=(s,i)=>{F.netaddr=s,F.routerId=i};return(s,i)=>(o(),z(ot,{type:1},{default:M(()=>[t(\"div\",Kc,[n.value==\"ddnsto-install\"?(o(),z(Wc,{key:0,onSetup:a})):n.value==\"ddnsto-login\"?(o(),z(Cc,{key:1,onSetup:a,onDdnstoConfig:p})):n.value==\"ddnsto-run\"?(o(),z(Yc,{key:2,onSetup:a,token:F.token,onDdnstoLocalConfig:r},null,8,[\"token\"])):n.value==\"ddnsto-bind\"?(o(),z(Bc,{key:3,onSetup:a,config:{token:F.token,sign:F.sign,domain:F.domain,netaddr:F.netaddr,routerId:F.routerId},domain:F.domain,\"onUpdate:domain\":i[0]||(i[0]=_=>F.domain=_)},null,8,[\"config\",\"domain\"])):n.value==\"ddnsto-save\"?(o(),z(zc,{key:4,onSetup:a,target:F.domain},null,8,[\"target\"])):$(\"\",!0)])]),_:1}))}});var td=S(Jc,[[\"__scopeId\",\"data-v-2b767e18\"]]);const ed=e=>{const u=document.createElement(\"div\");document.body.appendChild(u);const n=st(td,ht(vt({},e),{Close:()=>{a()}}));n.mount(u);const a=()=>{n.unmount(),u.remove()};return{Close:a}};const ud={class:\"action\"},nd={class:\"action-header\"},sd=[\"innerHTML\"],od={class:\"action-footer\"},ad=V({__name:\"index\",props:{Close:Function,next:{type:Function},clear:{type:Function},continuer:{type:Function},nextTitle:{type:String,default:\"\\u786E\\u5B9A\"},clearTitle:{type:String,default:\"\\u8FD4\\u56DE\"},continuerTitle:{type:String,default:\"\\u7EE7\\u7EED\\u4FDD\\u5B58\"},title:{type:String,default:\"\\u63D0\\u793A\"},content:{type:String}},setup(e){const u=e,n=()=>{u.next&&u.next(),u.Close&&u.Close()},a=()=>{u.clear&&u.clear(),u.Close&&u.Close()},d=()=>{u.continuer&&u.continuer(),u.Close&&u.Close()};return(F,p)=>(o(),z(ot,{Close:e.Close,type:1},{default:M(()=>[t(\"div\",ud,[t(\"div\",nd,m(e.title),1),t(\"div\",{class:\"action-body\",innerHTML:e.content},null,8,sd),t(\"div\",od,[e.clear?(o(),c(\"div\",{key:0,class:\"clear\",onClick:a},m(e.clearTitle),1)):$(\"\",!0),t(\"div\",{class:\"next\",onClick:n},m(e.nextTitle),1),e.continuer?(o(),c(\"div\",{key:1,class:\"next\",onClick:d},m(e.continuerTitle),1)):$(\"\",!0)])])]),_:1},8,[\"Close\"]))}});var id=S(ad,[[\"__scopeId\",\"data-v-4283f74c\"]]);const $e=e=>{const u=document.createElement(\"div\");document.body.appendChild(u);const n=st(id,ht(vt({},e),{Close:()=>{a()}}));n.mount(u);const a=()=>{n.unmount(),u.remove()};return{Close:a}};const X=e=>(q(\"data-v-b1e12544\"),e=e(),U(),e),ld={class:\"actioner-container\"},cd=[\"onSubmit\"],dd=X(()=>t(\"div\",{class:\"actioner-container_header\"},[t(\"span\",null,\"\\u57DF\\u540D\\u914D\\u7F6E\\u5411\\u5BFC\")],-1)),rd={key:0,class:\"title_info\"},_d=X(()=>t(\"p\",null,\"\\u963F\\u91CC\\u4E91\",-1)),pd=X(()=>t(\"span\",null,\" \\u4E3A\\u62E5\\u6709\\u52A8\\u6001IP\\u7684\\u4E3B\\u673A\\u914D\\u7F6E\\u4E00\\u4E2A\\u56FA\\u5B9A\\u7684\\u53EF\\u8BBF\\u95EE\\u57DF\\u540D \",-1)),vd=X(()=>t(\"a\",{href:\"https://doc.linkease.com/zh/guide/istoreos/basic/domain.html#%E9%98%BF%E9%87%8C%E4%BA%91\",target:\"_blank\"},\"\\u67E5\\u770B\\u6559\\u7A0B>>\",-1)),hd=[_d,pd,vd],Fd={key:1,class:\"title_info\"},md=X(()=>t(\"p\",null,\"dnspod\",-1)),fd=X(()=>t(\"span\",null,\" \\u4E3A\\u62E5\\u6709\\u52A8\\u6001IP\\u7684\\u4E3B\\u673A\\u914D\\u7F6E\\u4E00\\u4E2A\\u56FA\\u5B9A\\u7684\\u53EF\\u8BBF\\u95EE\\u57DF\\u540D \",-1)),Ed=X(()=>t(\"a\",{href:\"https://doc.linkease.com/zh/guide/istoreos/basic/domain.html#dnspod\",target:\"_blank\"},\"\\u67E5\\u770B\\u6559\\u7A0B>>\",-1)),Cd=[md,fd,Ed],gd={key:2,class:\"title_info\"},$d=X(()=>t(\"p\",null,\"\\u82B1\\u751F\\u58F3\",-1)),bd=X(()=>t(\"span\",null,\" \\u4E3A\\u62E5\\u6709\\u52A8\\u6001IP\\u7684\\u4E3B\\u673A\\u914D\\u7F6E\\u4E00\\u4E2A\\u56FA\\u5B9A\\u7684\\u53EF\\u8BBF\\u95EE\\u57DF\\u540D \",-1)),yd=X(()=>t(\"a\",{href:\"https://doc.linkease.com/zh/guide/istoreos/basic/domain.html#%E8%8A%B1%E7%94%9F%E5%A3%B3\",target:\"_blank\"},\"\\u67E5\\u770B\\u6559\\u7A0B>>\",-1)),Dd=[$d,bd,yd],kd={class:\"label-item\"},Bd=X(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"IP\\u5730\\u5740\\u7248\\u672C\\uFF1A\")],-1)),wd={class:\"label-item_value\"},Ad=X(()=>t(\"option\",{value:\"ipv4\"},\"IPv4\\u5730\\u5740\",-1)),xd=X(()=>t(\"option\",{value:\"ipv6\"},\"IPv6\\u5730\\u5740\",-1)),Sd=[Ad,xd],Id=X(()=>t(\"div\",{class:\"label_tips\"},[t(\"svg\",{width:\"14px\",height:\"14px\",viewBox:\"0 0 14 14\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},[t(\"g\",{id:\"icon_alert\",stroke:\"none\",\"stroke-width\":\"1\",fill:\"none\",\"fill-rule\":\"evenodd\"},[t(\"g\",{id:\"Icon/Warning\"},[t(\"rect\",{id:\"\\u77E9\\u5F62\",fill:\"#000000\",\"fill-rule\":\"nonzero\",opacity:\"0\",x:\"0\",y:\"0\",width:\"14\",height:\"14\"}),t(\"path\",{d:\"M7,0.875 C3.61757813,0.875 0.875,3.61757813 0.875,7 C0.875,10.3824219 3.61757813,13.125 7,13.125 C10.3824219,13.125 13.125,10.3824219 13.125,7 C13.125,3.61757813 10.3824219,0.875 7,0.875 Z M6.5625,4.046875 C6.5625,3.98671875 6.61171875,3.9375 6.671875,3.9375 L7.328125,3.9375 C7.38828125,3.9375 7.4375,3.98671875 7.4375,4.046875 L7.4375,7.765625 C7.4375,7.82578125 7.38828125,7.875 7.328125,7.875 L6.671875,7.875 C6.61171875,7.875 6.5625,7.82578125 6.5625,7.765625 L6.5625,4.046875 Z M7,10.0625 C6.63769531,10.0625 6.34375,9.76855469 6.34375,9.40625 C6.34375,9.04394531 6.63769531,8.75 7,8.75 C7.36230469,8.75 7.65625,9.04394531 7.65625,9.40625 C7.65625,9.76855469 7.36230469,10.0625 7,10.0625 Z\",id:\"\\u5F62\\u72B6\",fill:\"#FAAD14\"})])])]),t(\"span\",{class:\"info\"},\"\\u8BBE\\u5B9A\\u54EA\\u4E00\\u4E2A IP \\u5730\\u5740\\uFF08IPv4 \\u6216 IPv6\\uFF09\\u4F1A\\u88AB\\u53D1\\u9001\\u7ED9 DDNS \\u63D0\\u4F9B\\u5546\")],-1)),Pd={class:\"label-item\"},Vd=X(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"\\u57DF\\u540D\\uFF1A\")],-1)),Md={class:\"label-item_value\"},Td={class:\"label-item\"},Ld=X(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"\\u7528\\u6237\\u540D\\uFF1A\")],-1)),zd={class:\"label-item_value\"},Od={class:\"label-item\"},Nd=X(()=>t(\"div\",{class:\"label-item_key\"},[t(\"span\",null,\"\\u5BC6\\u7801\\uFF1A\")],-1)),qd={class:\"label-item_value\"},Ud={class:\"actioner-container_footer\"},Hd=[\"disabled\"],Rd=V({__name:\"setup-ddns\",props:{name:{type:String,default:\"ali\"},onSetup:{type:Function,required:!0},target:{type:String,required:!0}},emits:[\"update:target\"],setup(e,{emit:u}){const n=e,a=C(\"ipv4\"),d=C(n.name),F=C(\"\"),p=C(\"\"),r=C(\"\"),s=C(!1),i=()=>{n.onSetup(\"index\")},_=()=>{s.value=!0;const v=A.Loading(\"\\u68C0\\u6D4B\\u4E2D...\");P.Network.CheckPublickNet.POST({ipVersion:a.value}).then(l=>{var E,h;if(l!=null&&l.data){if((E=l==null?void 0:l.data)!=null&&E.error){A.Warning(l==null?void 0:l.data.error);return}if((((h=l==null?void 0:l.data)==null?void 0:h.success)||0)==0){const k=l.data.result;k&&k.address?D():f();return}}throw\"\\u672A\\u77E5\\u9519\\u8BEF\"}).catch(l=>{A.Error(l)}).finally(()=>{v.Close(),s.value=!1})},f=()=>{$e({title:\"\\u6E29\\u99A8\\u63D0\\u793A\",nextTitle:\"\\u4F7F\\u7528DDNSTO\",continuerTitle:\"\\u7EE7\\u7EED\\u4FDD\\u5B58\",content:\"\\u68C0\\u6D4B\\u5230\\u60A8\\u7684wan\\u53E3\\u6CA1\\u6709\\u516C\\u7F51IP\\u6216\\u8005IPv6\\u5730\\u5740\\uFF0C\\u53EF\\u4EE5\\u4F7F\\u7528DDNSTO\\u914D\\u7F6E\\u8FDC\\u7A0B\\u57DF\\u540D\\u8BBF\\u95EE\",next(){b()},continuer(){D()},clear(){}})},b=()=>{n.onSetup(\"ddnsto\")},D=()=>{s.value=!0;const v=A.Loading(\"\\u914D\\u7F6E\\u4E2D...\");P.Guide.PostDdns.POST({ipVersion:a.value,serviceName:d.value,domain:F.value,userName:p.value,password:r.value}).then(l=>{if(l!=null&&l.data){const{error:E,scope:h,success:k}=l.data;if(E==\"-100\"&&h==\"guide.ddns\"){$e({title:\"\\u6E29\\u99A8\\u63D0\\u793A\",content:\"\\u68C0\\u6D4B\\u5230\\u4F60\\u6709\\u672A\\u4FDD\\u5B58\\u7684\\u914D\\u7F6E\\uFF0C\\u53EF\\u524D\\u5F80\\u9875\\u9762\\u53F3\\u4E0A\\u89D2\\u70B9\\u51FB\\u67E5\\u770B\\uFF0C\\u4FDD\\u5B58\\u5E76\\u5E94\\u7528\\u6216\\u8005\\u6062\\u590D\\u914D\\u7F6E\\u540E\\u7EE7\\u7EED\",next(){}});return}if(E){A.Warning(E);return}if((k||0)==0){u(\"update:target\",F.value),n.onSetup(\"ddns-success\");return}}throw\"\\u672A\\u77E5\\u9519\\u8BEF\"}).catch(l=>{A.Error(l)}).finally(()=>{v.Close(),s.value=!1})};return(v,l)=>(o(),c(\"div\",ld,[t(\"form\",{class:\"actioner-dns\",onSubmit:lt(_,[\"prevent\"])},[dd,t(\"div\",{class:Qt([\"actioner-container_body\",e.name])},[e.name==\"ali\"?(o(),c(\"div\",rd,hd)):e.name==\"dnspod\"?(o(),c(\"div\",Fd,Cd)):e.name==\"oray\"?(o(),c(\"div\",gd,Dd)):$(\"\",!0),t(\"div\",kd,[Bd,t(\"div\",wd,[L(t(\"select\",{name:\"\",id:\"\",\"onUpdate:modelValue\":l[0]||(l[0]=E=>a.value=E)},Sd,512),[[Et,a.value]])]),Id]),t(\"div\",Pd,[Vd,t(\"div\",Md,[L(t(\"input\",{type:\"text\",placeholder:\"myhost.example.com\",\"onUpdate:modelValue\":l[1]||(l[1]=E=>F.value=E),required:\"\"},null,512),[[Y,F.value,void 0,{trim:!0}]])])]),t(\"div\",Td,[Ld,t(\"div\",zd,[L(t(\"input\",{type:\"text\",\"onUpdate:modelValue\":l[2]||(l[2]=E=>p.value=E),placeholder:\"\\u8BF7\\u8F93\\u5165\\u7528\\u6237\\u540D\",required:\"\"},null,512),[[Y,p.value,void 0,{trim:!0}]])])]),t(\"div\",Od,[Nd,t(\"div\",qd,[L(t(\"input\",{type:\"password\",\"onUpdate:modelValue\":l[3]||(l[3]=E=>r.value=E),placeholder:\"\\u8BF7\\u8F93\\u5165\\u5BC6\\u7801\",required:\"\"},null,512),[[Y,r.value,void 0,{trim:!0}]])])])],2),t(\"div\",Ud,[t(\"div\",{class:\"close\",onClick:i,type:\"button\"},\"\\u8FD4\\u56DE\"),t(\"button\",{class:\"next save\",type:\"submit\",disabled:s.value},\" \\u4FDD\\u5B58 \",8,Hd)])],40,cd)]))}});var Wt=S(Rd,[[\"__scopeId\",\"data-v-b1e12544\"]]);const Wd={class:\"action-main\"},Gd=V({__name:\"index\",props:{Close:{type:Function,required:!0},url:{type:String,required:!0}},setup(e){const u=e,n=C(\"\"),a=C(\"index\"),d=s=>{if(s!=null){if(s==\"ddnsto\"){F();return}a.value=s}else p()},F=()=>{p(),ed({url:u.url})},p=()=>{u.Close&&u.Close()},r=C(\"ddnsto\");return(s,i)=>(o(),z(ot,{Close:e.Close,type:1},{default:M(()=>[t(\"div\",Wd,[a.value==\"index\"?(o(),z(sc,{key:0,onSetup:d,active:r.value,\"onUpdate:active\":i[0]||(i[0]=_=>r.value=_)},null,8,[\"active\"])):a.value==\"ddns-ali\"?(o(),z(Wt,{key:1,onSetup:d,target:n.value,\"onUpdate:target\":i[1]||(i[1]=_=>n.value=_),name:\"ali\"},null,8,[\"target\"])):a.value==\"ddns-dnspod\"?(o(),z(Wt,{key:2,onSetup:d,target:n.value,\"onUpdate:target\":i[2]||(i[2]=_=>n.value=_),name:\"dnspod\"},null,8,[\"target\"])):a.value==\"ddns-oray\"?(o(),z(Wt,{key:3,onSetup:d,target:n.value,\"onUpdate:target\":i[3]||(i[3]=_=>n.value=_),name:\"oray\"},null,8,[\"target\"])):a.value==\"ddns-success\"?(o(),z(hc,{key:4,onSetup:d,target:n.value},null,8,[\"target\"])):$(\"\",!0)])]),_:1},8,[\"Close\"]))}});var Zd=S(Gd,[[\"__scopeId\",\"data-v-5d97cabd\"]]);const Gt=e=>{const u=document.createElement(\"div\");document.body.appendChild(u);const n=st(Zd,ht(vt({},e),{Close:()=>{a()}}));n.mount(u);const a=()=>{n.unmount(),u.remove()};return{Close:a}};var jd=function(){var e=document.getSelection();if(!e.rangeCount)return function(){};for(var u=document.activeElement,n=[],a=0;a<e.rangeCount;a++)n.push(e.getRangeAt(a));switch(u.tagName.toUpperCase()){case\"INPUT\":case\"TEXTAREA\":u.blur();break;default:u=null;break}return e.removeAllRanges(),function(){e.type===\"Caret\"&&e.removeAllRanges(),e.rangeCount||n.forEach(function(d){e.addRange(d)}),u&&u.focus()}},Xd=jd,be={\"text/plain\":\"Text\",\"text/html\":\"Url\",default:\"Text\"},Qd=\"Copy to clipboard: #{key}, Enter\";function Yd(e){var u=(/mac os x/i.test(navigator.userAgent)?\"\\u2318\":\"Ctrl\")+\"+C\";return e.replace(/#{\\s*key\\s*}/g,u)}function Kd(e,u){var n,a,d,F,p,r,s=!1;u||(u={}),n=u.debug||!1;try{d=Xd(),F=document.createRange(),p=document.getSelection(),r=document.createElement(\"span\"),r.textContent=e,r.ariaHidden=\"true\",r.style.all=\"unset\",r.style.position=\"fixed\",r.style.top=0,r.style.clip=\"rect(0, 0, 0, 0)\",r.style.whiteSpace=\"pre\",r.style.webkitUserSelect=\"text\",r.style.MozUserSelect=\"text\",r.style.msUserSelect=\"text\",r.style.userSelect=\"text\",r.addEventListener(\"copy\",function(_){if(_.stopPropagation(),u.format)if(_.preventDefault(),typeof _.clipboardData==\"undefined\"){n&&console.warn(\"unable to use e.clipboardData\"),n&&console.warn(\"trying IE specific stuff\"),window.clipboardData.clearData();var f=be[u.format]||be.default;window.clipboardData.setData(f,e)}else _.clipboardData.clearData(),_.clipboardData.setData(u.format,e);u.onCopy&&(_.preventDefault(),u.onCopy(_.clipboardData))}),document.body.appendChild(r),F.selectNodeContents(r),p.addRange(F);var i=document.execCommand(\"copy\");if(!i)throw new Error(\"copy command was unsuccessful\");s=!0}catch(_){n&&console.error(\"unable to copy using execCommand: \",_),n&&console.warn(\"trying IE specific stuff\");try{window.clipboardData.setData(u.format||\"text\",e),u.onCopy&&u.onCopy(window.clipboardData),s=!0}catch(f){n&&console.error(\"unable to copy using clipboardData: \",f),n&&console.error(\"falling back to prompt\"),a=Yd(\"message\"in u?u.message:Qd),window.prompt(a,e)}}finally{p&&(typeof p.removeRange==\"function\"?p.removeRange(F):p.removeAllRanges()),r&&document.body.removeChild(r),d()}return s}var Jd=Kd;const Kt=e=>(q(\"data-v-2f910f70\"),e=e(),U(),e),tr={class:\"button\",style:{\"margin-bottom\":\"8px\"}},er={href:\"https://www.kooldns.cn/app/#/devices\",target:\"_blank\"},ur={class:\"row\"},nr={class:\"text\"},sr=Kt(()=>t(\"span\",null,\"DDNSTO\\uFF1A\",-1)),or={key:0},ar=[\"href\",\"title\"],ir={key:0,class:\"row\"},lr={class:\"text\"},cr=Kt(()=>t(\"span\",null,\"muddns_ipv4\\uFF1A\",-1)),dr={key:0,class:\"configure\"},rr=[\"href\"],_r={key:0,class:\"button\"},pr={key:1,class:\"row\"},vr={class:\"text\"},hr=Kt(()=>t(\"span\",null,\"muddns_ipv6\\uFF1A\",-1)),Fr={key:0,class:\"configure\"},mr=[\"href\"],fr={key:0,class:\"button\"},Er=V({__name:\"ddns\",setup(e){const u=C({});let n=!1,a;const d=s=>{Jd(s),A.Message(\"\\u590D\\u5236\\u6210\\u529F\")};et(()=>{n=!0,a=window.setTimeout(r,1100)}),Bt(()=>{a!==void 0&&window.clearTimeout(a),n=!1});const F=W(()=>{const s=u.value.ipv4Domain;return!s||s==\"Stopped\"||s==\"Disabled\"?s:`http://${s}`}),p=W(()=>{const s=u.value.ipv6Domain;return!s||s==\"Stopped\"||s==\"Disabled\"?s:`http://${s}`}),r=function(){!n||P.Guide.Ddns.GET().then(s=>{var i;s!=null&&s.data&&(((i=s==null?void 0:s.data)==null?void 0:i.success)||0)==0&&s.data.result&&(u.value=s.data.result)}).then(()=>{})};return(s,i)=>(o(),z(j,{title:s.$t(\"\\u8FDC\\u7A0B\\u57DF\\u540D\"),padding:\"0 10px 8px 10px\",helpLink:\"https://www.linkease.com/rd/3yFiX5-X/\",span:24,action:{text:s.$t(\"\\u5FEB\\u901F\\u914D\\u7F6E\"),onClick:()=>{R(Gt)({url:u.value.ddnstoDomain})}}},{default:M(()=>{var _,f,b,D,v;return[t(\"div\",tr,[t(\"a\",er,m(s.$t(\"\\u524D\\u5F80\\u63A7\\u5236\\u53F0\")),1)]),t(\"div\",ur,[t(\"div\",nr,[sr,(_=u.value)!=null&&_.ddnstoDomain?(o(),c(\"span\",or,[t(\"a\",{class:\"configure\",href:(f=u.value)==null?void 0:f.ddnstoDomain,target:\"_blank\",rel:\"noopener noreferrer\",title:(b=u.value)==null?void 0:b.ddnstoDomain},m((D=u.value)==null?void 0:D.ddnstoDomain),9,ar),t(\"img\",{src:q1,onClick:i[0]||(i[0]=l=>{var E;return d((E=u.value)==null?void 0:E.ddnstoDomain)})})])):(o(),c(\"span\",{key:1,onClick:i[1]||(i[1]=l=>R(Gt)({url:u.value.ddnstoDomain})),style:{color:\"#06f\",cursor:\"pointer\"},class:\"configure\"},m(s.$t(\"\\u7ACB\\u5373\\u914D\\u7F6E\\uFF0C\\u83B7\\u5F97\\u514D\\u8D39\\u5916\\u7F51\\u57DF\\u540D\")),1))]),(v=u.value)!=null&&v.ddnstoDomain?(o(),c(\"span\",{key:0,onClick:i[2]||(i[2]=l=>R(Gt)({url:u.value.ddnstoDomain})),style:{color:\"#06f\",cursor:\"pointer\",\"font-size\":\"12px\"}},\"\\u8BBF\\u95EE\\u5931\\u8D25\\uFF1F\\u91CD\\u65B0\\u914D\\u7F6E\")):$(\"\",!0)]),F.value?(o(),c(\"div\",ir,[t(\"div\",lr,[cr,F.value===\"Stopped\"||F.value===\"Disabled\"?(o(),c(\"span\",dr,m(F.value),1)):(o(),c(\"a\",{key:1,target:\"_blank\",rel:\"noopener noreferrer\",href:F.value,class:\"configure\"},m(F.value),9,rr))]),F.value?(o(),c(\"div\",_r,[t(\"span\",{onClick:i[3]||(i[3]=l=>R(at)({title:\"muddns_ipv4\",src:\"/cgi-bin/luci/admin/services/ddns\"}))},m(s.$t(\"\\u7F16\\u8F91\")),1)])):$(\"\",!0)])):$(\"\",!0),p.value?(o(),c(\"div\",pr,[t(\"div\",vr,[hr,p.value===\"Stopped\"||p.value===\"Disabled\"?(o(),c(\"span\",Fr,m(p.value),1)):(o(),c(\"a\",{key:1,target:\"_blank\",rel:\"noopener noreferrer\",href:p.value,class:\"configure\"},m(p.value),9,mr))]),p.value?(o(),c(\"div\",fr,[t(\"span\",{onClick:i[4]||(i[4]=l=>R(at)({title:\"muddns_ipv4\",src:\"/cgi-bin/luci/admin/services/ddns\"}))},m(s.$t(\"\\u7F16\\u8F91\")),1)])):$(\"\",!0)])):$(\"\",!0)]}),_:1},8,[\"title\",\"action\"]))}});var Cr=S(Er,[[\"__scopeId\",\"data-v-2f910f70\"]]);const gr={},$r={width:\"128px\",height:\"128px\",viewBox:\"0 0 128 128\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},br=t(\"g\",{id:\"icon_yellow\",stroke:\"none\",\"stroke-width\":\"1\",fill:\"none\",\"fill-rule\":\"evenodd\"},[t(\"g\",{id:\"Icon/Warning\"},[t(\"rect\",{id:\"\\u77E9\\u5F62\",fill:\"#000000\",\"fill-rule\":\"nonzero\",opacity:\"0\",x:\"0\",y:\"0\",width:\"128\",height:\"128\"}),t(\"path\",{d:\"M64,8 C33.075,8 8,33.075 8,64 C8,94.925 33.075,120 64,120 C94.925,120 120,94.925 120,64 C120,33.075 94.925,8 64,8 Z M60,37 C60,36.45 60.45,36 61,36 L67,36 C67.55,36 68,36.45 68,37 L68,71 C68,71.55 67.55,72 67,72 L61,72 C60.45,72 60,71.55 60,71 L60,37 Z M64,92 C60.6875,92 58,89.3125 58,86 C58,82.6875 60.6875,80 64,80 C67.3125,80 70,82.6875 70,86 C70,89.3125 67.3125,92 64,92 Z\",id:\"\\u5F62\\u72B6\",fill:\"#FAAD14\"})])],-1),yr=[br];function Dr(e,u){return o(),c(\"svg\",$r,yr)}var kr=S(gr,[[\"render\",Dr]]);const Q=e=>(q(\"data-v-097a32fc\"),e=e(),U(),e),Br={key:0,class:\"action\"},wr=Q(()=>t(\"h2\",{class:\"title\"},\"Docker\\u8FC1\\u79FB\\u5411\\u5BFC\",-1)),Ar=Q(()=>t(\"p\",{class:\"desc\"},\" \\u5F53\\u7CFB\\u7EDF\\u6839\\u76EE\\u5F55\\u7A7A\\u95F4\\u4E0D\\u8DB3\\u65F6\\uFF0C\\u53EF\\u5C06docker\\u6839\\u76EE\\u5F55\\u8FC1\\u79FB\\u5230\\u5916\\u7F6E\\u786C\\u76D8\\uFF0C\\u4EE5\\u4FDD\\u8BC1\\u7CFB\\u7EDF\\u7684\\u6B63\\u5E38\\u8FD0\\u884C: \",-1)),xr={key:1,class:\"action\"},Sr=Q(()=>t(\"h2\",{class:\"title\"},\"Docker\\u8FC1\\u79FB\\u5411\\u5BFC\",-1)),Ir=Q(()=>t(\"p\",{class:\"desc\"},\" \\u5F53\\u7CFB\\u7EDF\\u6839\\u76EE\\u5F55\\u7A7A\\u95F4\\u4E0D\\u8DB3\\u65F6\\uFF0C\\u53EF\\u5C06docker\\u6839\\u76EE\\u5F55\\u8FC1\\u79FB\\u5230\\u5916\\u7F6E\\u786C\\u76D8\\uFF0C\\u4EE5\\u4FDD\\u8BC1\\u7CFB\\u7EDF\\u7684\\u6B63\\u5E38\\u8FD0\\u884C: \",-1)),Pr={class:\"roots\"},Vr=Q(()=>t(\"span\",{class:\"roots_tit\"},\"Docker\\u6839\\u76EE\\u5F55\\uFF1A\",-1)),Mr={class:\"root\"},Tr={class:\"move\"},Lr=Q(()=>t(\"span\",{class:\"roots_tit\"},\"\\u8FC1\\u79FB\\u5230\\uFF1A\",-1)),zr={key:0},Or=[\"onSubmit\"],Nr={class:\"select-editable\"},qr=Q(()=>t(\"option\",{selected:\"\",value:null},\"\\u8BF7\\u9009\\u62E9\\u8FC1\\u79FB\\u5730\\u5740\",-1)),Ur=[\"value\"],Hr=Q(()=>t(\"option\",{value:\"useInput\"},\"- -\\u81EA\\u5B9A\\u4E49- -\",-1)),Rr={key:1,class:\"tips\"},Wr={class:\"tips_content\"},Gr=Q(()=>t(\"span\",{class:\"tip\"},\"\\u68C0\\u6D4B\\u5230\\u60A8\\u8FD8\\u6CA1\\u6709\\u6302\\u8F7D\\u5916\\u7F6E\\u786C\\u76D8\\u6216\\u5206\\u533A\\u5C0F\\u4E8E8GB\\uFF0C\\u9700\\u8981\\u60A8\\u63A5\\u4E0A\\u786C\\u76D8\\u5E76\\u683C\\u5F0F\\u5316\\u6216\\u624B\\u52A8\\u6302\\u8F7D\\u786C\\u76D8\\u540E\\uFF0C\\u518D\\u6267\\u884CDocker\\u8FC1\\u79FB\\u5411\\u5BFC\\uFF0C\\u5C06Docker\\u8FC1\\u79FB\\u5230\\u76EE\\u6807\\u786C\\u76D8\\u3002\",-1)),Zr={key:0,class:\"btns\"},jr={key:1,class:\"btns\"},Xr={key:2,class:\"action docker_success\"},Qr=Q(()=>t(\"h2\",{class:\"title\"},\"Docker\\u8FC1\\u79FB\\u5411\\u5BFC\",-1)),Yr={class:\"finished\"},Kr=Q(()=>t(\"p\",{class:\"successed\"},\"\\u8FC1\\u79FB\\u6210\\u529F\\uFF01\",-1)),Jr={key:3,class:\"action docker_download\"},t5=Q(()=>t(\"h2\",{class:\"title\"},\"Docker\\u8FC1\\u79FB\\u5411\\u5BFC\",-1)),e5={class:\"finished\"},u5=Q(()=>t(\"p\",{class:\"successed\"},\"\\u8BE5\\u76EE\\u6807\\u8DEF\\u5F84\\u4E0D\\u4E3A\\u7A7A\",-1)),n5={class:\"docker_moves\"},s5={class:\"moves change\"},o5=Q(()=>t(\"label\",{for:\"move\"},\"\\u66F4\\u6362\\u76EE\\u5F55\\uFF08\\u4E0D\\u8986\\u76D6\\u76EE\\u6807\\u8DEF\\u5F84\\uFF0C\\u4EC5\\u5C06docker\\u76EE\\u5F55\\u4FEE\\u6539\\u4E3A\\u76EE\\u6807\\u8DEF\\u5F84\\uFF09\",-1)),a5={class:\"moves\"},i5=Q(()=>t(\"label\",{for:\"cover\"},\"\\u8986\\u76D6\\u8FC1\\u79FB\\uFF08\\u8986\\u76D6\\u76EE\\u6807\\u8DEF\\u5F84\\uFF0C\\u7EE7\\u7EED\\u8FC1\\u79FB\\u4F1A\\u6E05\\u7A7A\\u8BE5\\u76EE\\u6807\\u8DEF\\u5F84\\u4E0B\\u7684\\u6587\\u4EF6\\uFF09\",-1)),l5={class:\"btns\"},c5=V({__name:\"index\",props:{rootPath:{type:String,required:!0},Close:Function},setup(e){const u=e,n=C(),a=C(),d=C(0),F=C(\"null\"),p=C(\"\"),r=C(),s=C(!1),i=C(\"\");(()=>{P.Nas.Disk.Status.GET().then(h=>{h!=null&&h.data.result&&(r.value=h==null?void 0:h.data.result)}),P.Guide.DockerStatus.GET().then(h=>{var k;if((k=h==null?void 0:h.data)!=null&&k.result){const w=h.data.result;n.value=w}}),P.Guide.DockerPartitionList.GET().then(h=>{var k;if((k=h==null?void 0:h.data)!=null&&k.result){const w=h.data.result;a.value=w}})})();const f=h=>{let k=F.value;if(k==\"useInput\"&&(k=p.value),k==null||k==\"null\"||k==\"\")return;const w=A.Loading(\"\\u6B63\\u5728\\u8FC1\\u79FB\\u4E2D...\");P.Guide.DockerTransfer.POST({path:k,force:h,overwriteDir:!!i.value}).then(y=>{var g;if(y!=null&&y.data){if((y.data.success||0)==0){if((g=y.data.result)!=null&&g.emptyPathWarning){s.value=!0,d.value=2;return}d.value=1;return}else if(y.data.error)throw y.data.error}throw\"\\u672A\\u77E5\\u9519\\u8BEF\"}).catch(y=>{A.Error(y)}).finally(()=>w.Close())},b=()=>{s.value=!1,f(!1)},D=h=>{h.preventDefault(),u.Close&&u.Close()},v=h=>{h.preventDefault(),location.reload()},l=h=>{h.preventDefault(),d.value=0},E=h=>{h.preventDefault(),f(!0)};return(h,k)=>(o(),z(ot,{Close:e.Close,type:1},{default:M(()=>{var w,y,g,B,H,I;return[d.value==-1?(o(),c(\"div\",Br,[wr,Ar,t(\"div\",{class:\"btns\"},[t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",type:\"button\",onClick:D},\" \\u53D6\\u6D88 \")])])):d.value==0?(o(),c(\"div\",xr,[Sr,Ir,t(\"div\",Pr,[Vr,t(\"span\",Mr,m((w=n.value)==null?void 0:w.path),1)]),t(\"div\",Tr,[Lr,(g=(y=a.value)==null?void 0:y.partitionList)!=null&&g.length?(o(),c(\"div\",zr,[t(\"form\",{onSubmit:lt(b,[\"prevent\"])},[t(\"label\",null,[t(\"div\",Nr,[L(t(\"select\",{\"onUpdate:modelValue\":k[0]||(k[0]=O=>F.value=O)},[qr,(o(!0),c(N,null,K((B=a.value)==null?void 0:B.partitionList,(O,nt)=>(o(),c(\"option\",{value:O,key:nt},m(O),9,Ur))),128)),Hr],512),[[Et,F.value,void 0,{trim:!0}]]),F.value==\"useInput\"?L((o(),c(\"input\",{key:0,type:\"text\",\"onUpdate:modelValue\":k[1]||(k[1]=O=>p.value=O),required:\"\",placeholder:\"\\u8BF7\\u8F93\\u5165\\u8FC1\\u79FB\\u5730\\u5740\"},null,512)),[[Y,p.value,void 0,{trim:!0}]]):$(\"\",!0)])])],40,Or)])):a.value?(o(),c(\"div\",Rr,[t(\"div\",Wr,[x(dt),Gr])])):$(\"\",!0)]),(I=(H=a.value)==null?void 0:H.partitionList)!=null&&I.length?(o(),c(\"div\",Zr,[t(\"button\",{class:\"cbi-button cbi-button-apply\",onClick:b},\" \\u786E\\u5B9A \"),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",type:\"button\",onClick:D},\" \\u53D6\\u6D88 \")])):(o(),c(\"div\",jr,[t(\"button\",{class:\"cbi-button cbi-button-apply\",onClick:D},\" \\u786E\\u5B9A \")]))])):d.value==1?(o(),c(\"div\",Xr,[Qr,t(\"div\",Yr,[x(Yt)]),Kr,t(\"div\",{class:\"btns\"},[t(\"button\",{class:\"cbi-button cbi-button-apply\",onClick:v},\" \\u786E\\u5B9A \")])])):d.value==2?(o(),c(\"div\",Jr,[t5,t(\"div\",e5,[x(kr)]),u5,t(\"div\",n5,[t(\"div\",s5,[L(t(\"input\",{type:\"radio\",id:\"move\",name:\"moves\",\"onUpdate:modelValue\":k[2]||(k[2]=O=>i.value=O),value:\"\"},null,512),[[it,i.value]]),o5]),t(\"div\",a5,[L(t(\"input\",{type:\"radio\",id:\"cover\",name:\"moves\",\"onUpdate:modelValue\":k[3]||(k[3]=O=>i.value=O),value:\"true\"},null,512),[[it,i.value]]),i5])]),t(\"div\",l5,[s.value?(o(),c(\"button\",{key:0,class:\"cbi-button cbi-button-apply\",onClick:E},\" \\u786E\\u5B9A \")):$(\"\",!0),t(\"button\",{class:\"cbi-button cbi-button-apply\",onClick:l},\" \\u8FD4\\u56DE \"),s.value?$(\"\",!0):(o(),c(\"button\",{key:1,class:\"cbi-button cbi-button-remove app-btn app-back\",type:\"button\",onClick:v},\" \\u53D6\\u6D88 \"))])])):$(\"\",!0)]}),_:1},8,[\"Close\"]))}});var d5=S(c5,[[\"__scopeId\",\"data-v-097a32fc\"]]);const ye=()=>{const e=document.createElement(\"div\");document.body.appendChild(e);const u=st(d5,{Close:()=>{n()}});u.mount(e);const n=()=>{u.unmount(),e.remove()};return{Close:n}};const r5=e=>(q(\"data-v-750b6b3e\"),e=e(),U(),e),_5={class:\"button\"},p5={class:\"row\"},v5={class:\"text\"},h5={key:0,class:\"docker-item-value\"},F5={class:\"configure\"},m5={key:1,class:\"docker-item-value\"},f5={class:\"input-switch\"},E5=[\"value\",\"disabled\"],C5=r5(()=>t(\"em\",null,null,-1)),g5=[C5],$5={key:0,class:\"row\"},b5={class:\"text\"},y5={style:{width:\"100%\"}},D5={class:\"configure\"},k5={key:0},B5={class:\"tooltip-trigger\"},w5={class:\"docker_tip\"},A5={class:\"tooltip-text tooltip-top\"},x5={class:\"docker_dir_tip\"},S5=V({__name:\"docker\",setup(e){const u=C(!1),n=C(),a=mt({enable:!1,disabled:!1}),d=()=>T(this,null,function*(){const s=A.Loading(a.enable?\"Docker\\u5F00\\u542F\\u4E2D...\":\"Docker\\u5173\\u95ED\\u4E2D...\");a.disabled=!0;try{const i=yield P.Guide.DockerSwitch.POST({enable:a.enable});if(i!=null&&i.data){const{success:_,error:f}=i.data;if(f)throw a.enable=!a.enable,f;(_||0)==0&&r()}}catch(i){A.Warning(`${i}`)}finally{a.disabled=!1}s.Close()}),F=()=>{window.open(\"/cgi-bin/luci/admin/docker/overview\",\"_blank\")},p=()=>{ye()},r=()=>{P.Guide.DockerStatus.GET().then(s=>{var i;if((i=s==null?void 0:s.data)!=null&&i.result){const _=s.data.result;n.value=_,_.status===\"running\"&&(a.enable=!0)}}).finally(()=>{u.value=!0})};return setTimeout(r,1100),(s,i)=>{var _;return o(),z(j,{title:\"Docker\",padding:\"0 10px 8px 10px\",helpLink:\"https://www.linkease.com/rd/2Q28MDtf/\",moreActions:[{show:((_=n.value)==null?void 0:_.status)===\"running\",text:\"\\u67E5\\u770BDocker\\u4FE1\\u606F\",onClick:p}],span:24},{default:M(()=>{var f,b,D,v;return[t(\"div\",_5,[t(\"span\",{onClick:i[0]||(i[0]=l=>R(ye)({setup:0}))},m(s.$t(\"\\u8FC1\\u79FB\\u5411\\u5BFC\")),1),t(\"span\",{onClick:F},m(s.$t(\"\\u9AD8\\u7EA7\\u914D\\u7F6E\")),1)]),t(\"div\",p5,[t(\"div\",v5,[t(\"span\",null,m(s.$t(\"\\u5F53\\u524D\\u72B6\\u6001\")),1)]),(f=n.value)!=null&&f.status?(o(),c(N,{key:0},[((b=n.value)==null?void 0:b.status)===\"not installed\"?(o(),c(\"div\",h5,[t(\"span\",F5,m(s.$t(\"\\u672A\\u5B89\\u88C5\")),1)])):(o(),c(\"div\",m5,[t(\"label\",f5,[L(t(\"input\",{type:\"checkbox\",hidden:\"\",value:!a.enable,\"onUpdate:modelValue\":i[1]||(i[1]=l=>a.enable=l),disabled:a.disabled,onChange:d},null,40,E5),[[Be,a.enable]]),t(\"span\",{class:Qt(a.enable?\"enable\":\"close\")},g5,2)])]))],64)):$(\"\",!0)]),a.enable?(o(),c(\"div\",$5,[t(\"div\",b5,[t(\"span\",null,\"Docker \"+m(s.$t(\"\\u6839\\u76EE\\u5F55\"))+\"\\uFF1A\",1),t(\"div\",y5,[t(\"span\",D5,m((D=n.value)==null?void 0:D.path),1),(v=n.value)!=null&&v.errorInfo?(o(),c(\"span\",k5,[t(\"span\",B5,[t(\"span\",w5,[x(dt)]),t(\"div\",null,[t(\"div\",A5,[t(\"span\",x5,m(n.value.errorInfo),1)])])])])):$(\"\",!0)])])])):$(\"\",!0)]}),_:1},8,[\"moreActions\"])}}});var I5=S(S5,[[\"__scopeId\",\"data-v-750b6b3e\"]]);const P5=e=>(q(\"data-v-68b4579e\"),e=e(),U(),e),V5={class:\"select-editable\"},M5=[\"value\"],T5=P5(()=>t(\"option\",{value:\"useInput\"},\"- -\\u81EA\\u5B9A\\u4E49- -\",-1)),L5=[\"placeholder\"],z5=V({__name:\"index\",props:{modelValue:{type:String,required:!0},title:{type:String,default:\"\"},options:{type:Array,default:[]}},emits:[\"update:modelValue\"],setup(e,{emit:u}){const n=e,a=C(\"\"),d=C(\"\"),F=W({get:()=>n.modelValue.valueOf(),set:i=>u(\"update:modelValue\",i)}),p=i=>{if(i===a.value||a.value===\"useInput\"&&i===d.value){F.value=n.options[0].key;return}i===\"\"||n.options.some(_=>_.key===i)?a.value=i:(d.value=i,a.value=\"useInput\")};tu(()=>n.modelValue,i=>{p(i)}),et(()=>{const i=F.value;p(i)});const r=i=>{a.value===\"useInput\"?F.value=d.value:F.value=a.value},s=i=>{F.value=d.value};return(i,_)=>(o(),c(\"label\",null,[t(\"div\",V5,[L(t(\"select\",{\"onUpdate:modelValue\":_[0]||(_[0]=f=>a.value=f),autocomplete:\"off\",onChange:r},[(o(!0),c(N,null,K(e.options,(f,b)=>(o(),c(\"option\",{value:f.key,key:b},m(f.value||f.key),9,M5))),128)),T5],544),[[Et,a.value,void 0,{trim:!0}]]),a.value==\"useInput\"?L((o(),c(\"input\",{key:0,type:\"text\",\"onUpdate:modelValue\":_[1]||(_[1]=f=>d.value=f),required:\"\",placeholder:\"\\u8BF7\\u8F93\\u5165\"+e.title,onChange:s},null,40,L5)),[[Y,d.value,void 0,{trim:!0}]]):$(\"\",!0)])]))}});var kt=S(z5,[[\"__scopeId\",\"data-v-68b4579e\"]]);const O5={},N5={width:\"14px\",height:\"14px\",viewBox:\"0 0 14 14\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},q5=t(\"path\",{d:\"M7,0.875 C3.61757813,0.875 0.875,3.61757813 0.875,7 C0.875,10.3824219 3.61757813,13.125 7,13.125 C10.3824219,13.125 13.125,10.3824219 13.125,7 C13.125,3.61757813 10.3824219,0.875 7,0.875 Z M6.5625,4.046875 C6.5625,3.98671875 6.61171875,3.9375 6.671875,3.9375 L7.328125,3.9375 C7.38828125,3.9375 7.4375,3.98671875 7.4375,4.046875 L7.4375,7.765625 C7.4375,7.82578125 7.38828125,7.875 7.328125,7.875 L6.671875,7.875 C6.61171875,7.875 6.5625,7.82578125 6.5625,7.765625 L6.5625,4.046875 Z M7,10.0625 C6.63769531,10.0625 6.34375,9.76855469 6.34375,9.40625 C6.34375,9.04394531 6.63769531,8.75 7,8.75 C7.36230469,8.75 7.65625,9.04394531 7.65625,9.40625 C7.65625,9.76855469 7.36230469,10.0625 7,10.0625 Z\",id:\"\\u5F62\\u72B6\",\"fill-opacity\":\"0.65\"},null,-1),U5=[q5];function H5(e,u){return o(),c(\"svg\",N5,U5)}var $t=S(O5,[[\"render\",H5]]);const G=e=>(q(\"data-v-f4c41bf2\"),e=e(),U(),e),R5={key:0,class:\"action\"},W5=G(()=>t(\"h2\",{class:\"title\"},\"\\u4E0B\\u8F7D\\u670D\\u52A1\\u914D\\u7F6E\\u5411\\u5BFC\",-1)),G5={class:\"load_service input_row\"},Z5=G(()=>t(\"div\",{class:\"left\"},[t(\"span\",null,\"\\u4E0B\\u8F7D\\u670D\\u52A1\\uFF1A\")],-1)),j5={class:\"radios\"},X5=G(()=>t(\"label\",{for:\"Aria2\"},\"Aria2\",-1)),Q5={class:\"radios\"},Y5=G(()=>t(\"label\",{for:\"qB\"},\"qBittorrent\",-1)),K5={class:\"radios\"},J5=G(()=>t(\"label\",{for:\"Tr\"},\"Transmission\",-1)),t6=[\"onSubmit\"],e6={class:\"input_row\"},u6={class:\"left\"},n6={class:\"tooltip-trigger\"},s6=G(()=>t(\"div\",null,[t(\"div\",{class:\"tooltip-text tooltip-top\"},[t(\"span\",{class:\"dowload_dir_tip\"},\"\\u7528\\u4E8E\\u653E\\u7F6E\\u914D\\u7F6E\\u6587\\u4EF6\\u7684\\u76EE\\u5F55\\u3002\\u4F8B\\u5982\\uFF1A/mnt/sda1/Configs/aria2\\uFF1B\\u8BF7\\u52FF\\u4F7F\\u7528 /tmp \\u6216 /var \\uFF0C\\u4EE5\\u514D\\u91CD\\u542F\\u4EE5\\u540E\\u4EFB\\u52A1\\u4E22\\u5931\")])],-1)),o6=G(()=>t(\"span\",null,\"\\u914D\\u7F6E\\u76EE\\u5F55\\uFF1A\",-1)),a6={class:\"myinput_wrap\"},i6={class:\"input_row\"},l6={class:\"left\"},c6={class:\"tooltip-trigger\"},d6=G(()=>t(\"div\",null,[t(\"div\",{class:\"tooltip-text tooltip-top\"},[t(\"span\",{class:\"dowload_dir_tip\"},\"\\u7528\\u4E8E\\u653E\\u7F6E\\u4E0B\\u8F7D\\u6587\\u4EF6\\u7684\\u76EE\\u5F55\\u3002\\u4F8B\\u5982\\uFF1A/mnt/sda1/download\")])],-1)),r6=G(()=>t(\"span\",null,\"\\u4E0B\\u8F7D\\u76EE\\u5F55\\uFF1A\",-1)),_6={class:\"myinput_wrap\"},p6={class:\"input_row\"},v6={class:\"left\"},h6={class:\"tooltip-trigger\"},F6=G(()=>t(\"div\",null,[t(\"div\",{class:\"tooltip-text tooltip-bottom\"},[t(\"span\",{class:\"dowload_rpc_tip\"},\"\\u7528\\u4E8E\\u8FDC\\u7A0B\\u8BBF\\u95EE\\u7684\\u4EE4\\u724C\\u3002\")])],-1)),m6=G(()=>t(\"span\",null,\"RPC \\u4EE4\\u724C\\uFF1A\",-1)),f6={class:\"input_row\"},E6=G(()=>t(\"div\",{class:\"\"},[t(\"span\",null,\"\\u9644\\u52A0\\u7684 BT Tracker\\uFF1A\")],-1)),C6={class:\"radios\"},g6=G(()=>t(\"label\",{for:\"default\"},\"\\u9ED8\\u8BA4\",-1)),$6={class:\"radios\"},b6=G(()=>t(\"label\",{for:\"add\"},\"\\u81EA\\u5DF1\\u6DFB\\u52A0\",-1)),y6={class:\"input_row\"},D6=G(()=>t(\"div\",{class:\"left\"},null,-1)),k6={class:\"myinput_wrap Tracker_input\"},B6=[\"onSubmit\"],w6={class:\"input_row\"},A6={class:\"left\"},x6={class:\"tooltip-trigger\"},S6=G(()=>t(\"div\",null,[t(\"div\",{class:\"tooltip-text tooltip-top\"},[t(\"span\",{class:\"dowload_dir_tip\"},\"\\u7528\\u4E8E\\u653E\\u7F6E\\u914D\\u7F6E\\u6587\\u4EF6\\u7684\\u76EE\\u5F55\\u3002\\u4F8B\\u5982\\uFF1A/mnt/sda1/Configs/qb\\uFF1B\\u8BF7\\u52FF\\u4F7F\\u7528 /tmp \\u6216 /var \\uFF0C\\u4EE5\\u514D\\u91CD\\u542F\\u4EE5\\u540E\\u4EFB\\u52A1\\u4E22\\u5931\")])],-1)),I6=G(()=>t(\"span\",null,\"\\u914D\\u7F6E\\u76EE\\u5F55\\uFF1A\",-1)),P6={class:\"myinput_wrap\"},V6={class:\"input_row\"},M6={class:\"left\"},T6={class:\"tooltip-trigger\"},L6=G(()=>t(\"div\",null,[t(\"div\",{class:\"tooltip-text tooltip-top\"},[t(\"span\",{class:\"dowload_dir_tip\"},\"\\u7528\\u4E8E\\u653E\\u7F6E\\u4E0B\\u8F7D\\u6587\\u4EF6\\u7684\\u76EE\\u5F55\\u3002\\u4F8B\\u5982\\uFF1A/mnt/sda1/download\")])],-1)),z6=G(()=>t(\"span\",null,\"\\u4E0B\\u8F7D\\u76EE\\u5F55\\uFF1A\",-1)),O6={class:\"myinput_wrap\"},N6=[\"onSubmit\"],q6={class:\"input_row\"},U6={class:\"left\"},H6={class:\"tooltip-trigger\"},R6=G(()=>t(\"div\",null,[t(\"div\",{class:\"tooltip-text tooltip-top\"},[t(\"span\",{class:\"dowload_dir_tip\"},\"\\u7528\\u4E8E\\u653E\\u7F6E\\u914D\\u7F6E\\u6587\\u4EF6\\u7684\\u76EE\\u5F55\\u3002\\u4F8B\\u5982\\uFF1A/mnt/sda1/Configs/tr\\uFF1B\\u8BF7\\u52FF\\u4F7F\\u7528 /tmp \\u6216 /var \\uFF0C\\u4EE5\\u514D\\u91CD\\u542F\\u4EE5\\u540E\\u4EFB\\u52A1\\u4E22\\u5931\")])],-1)),W6=G(()=>t(\"span\",null,\"\\u914D\\u7F6E\\u76EE\\u5F55\\uFF1A\",-1)),G6={class:\"myinput_wrap\"},Z6={class:\"input_row\"},j6={class:\"left\"},X6={class:\"tooltip-trigger\"},Q6=G(()=>t(\"div\",null,[t(\"div\",{class:\"tooltip-text tooltip-top\"},[t(\"span\",{class:\"dowload_dir_tip\"},\"\\u7528\\u4E8E\\u653E\\u7F6E\\u4E0B\\u8F7D\\u6587\\u4EF6\\u7684\\u76EE\\u5F55\\u3002\\u4F8B\\u5982\\uFF1A/mnt/sda1/download\")])],-1)),Y6=G(()=>t(\"span\",null,\"\\u4E0B\\u8F7D\\u76EE\\u5F55\\uFF1A\",-1)),K6={class:\"myinput_wrap\"},J6={class:\"btns\"},t0={key:1,class:\"action\"},e0={class:\"title\"},u0={class:\"finished\"},n0=G(()=>t(\"p\",{class:\"successed\"},\"\\u914D\\u7F6E\\u6210\\u529F\\uFF01\",-1)),s0=V({__name:\"index\",props:{services:{type:Object,required:!0},partitionList:{type:Array,required:!0},defaultTab:{type:String,required:!1},Close:Function},setup(e){const u=e,n=C(\"\"),a=C(\"\"),d=C(\"\"),F=C(\"\"),p=C(\"default\"),r=C(\"Aria2\"),s=C(\"\"),i=C(\"\"),_=C(\"\"),f=C(\"\"),b=C([]),D=C([]),v=C(0);et(()=>{var I,O,nt,xt,St,It,Pt,Vt,Mt,Tt;switch(u.defaultTab){case\"aria2\":r.value=\"Aria2\";break;case\"qbittorrent\":r.value=\"qBittorrent\";break;case\"transmission\":r.value=\"Transmission\";break}b.value=u.partitionList.map(pt=>({key:pt})),D.value=u.partitionList.filter(pt=>pt.startsWith(\"/mnt/\")).map(pt=>pt.replace(/(\\/mnt\\/[^/]+).*/,\"$1\")),d.value=((I=u.services.aria2)==null?void 0:I.configPath)||\"\";const y=((O=u.services.aria2)==null?void 0:O.downloadPath)||((nt=u.services.qbittorrent)==null?void 0:nt.downloadPath)||((xt=u.services.transmission)==null?void 0:xt.downloadPath);y&&(F.value=y);const g=(St=u.services.aria2)==null?void 0:St.rpcToken;g&&(n.value=g),s.value=((It=u.services.qbittorrent)==null?void 0:It.configPath)||\"\";const B=((Pt=u.services.qbittorrent)==null?void 0:Pt.downloadPath)||y||((Vt=u.services.transmission)==null?void 0:Vt.downloadPath);B&&(i.value=B),_.value=((Mt=u.services.transmission)==null?void 0:Mt.configPath)||\"\";const H=((Tt=u.services.transmission)==null?void 0:Tt.downloadPath)||y||B;H&&(f.value=H)});const l=()=>{let y=d.value,g=F.value;y==null||y==\"\"||g==null||g==\"\"||T(this,null,function*(){if(yield rt.checkAndInstallApp(\"app-meta-aria2\",\"Aria2\")){const H=A.Loading(\"\\u914D\\u7F6E\\u4E2D...\");P.Guide.Aria2Init.POST({configPath:y,downloadPath:g,rpcToken:n.value,btTracker:p.value==\"add\"?a.value:\"\"}).then(I=>{var O;if(I!=null&&I.data){if((I.data.success||0)==0){v.value=1;return}else if((O=I.data)!=null&&O.error)throw I.data.error}throw\"\\u672A\\u77E5\\u9519\\u8BEF\"}).catch(I=>A.Error(I)).finally(()=>H.Close())}})},E=()=>{let y=s.value,g=i.value;y==null||y==\"\"||g==null||g==\"\"||T(this,null,function*(){if(yield rt.checkAndInstallApp(\"app-meta-qbittorrent\",\"qBittorrent\")){const H=A.Loading(\"\\u914D\\u7F6E\\u4E2D...\");P.Guide.qbitorrentInit.POST({configPath:y,downloadPath:g}).then(I=>{var O;if(I!=null&&I.data){if((I.data.success||0)==0){v.value=1;return}else if((O=I.data)!=null&&O.error)throw I.data.error}throw\"\\u672A\\u77E5\\u9519\\u8BEF\"}).catch(I=>A.Error(I)).finally(()=>H.Close())}})},h=()=>{let y=_.value,g=f.value;y==null||y==\"\"||g==null||g==\"\"||T(this,null,function*(){if(yield rt.checkAndInstallApp(\"app-meta-transmission\",\"Transmission\")){const H=A.Loading(\"\\u914D\\u7F6E\\u4E2D...\");P.Guide.transmissionInit.POST({configPath:y,downloadPath:g}).then(I=>{var O;if(I!=null&&I.data){if((I.data.success||0)==0){v.value=1;return}else if((O=I.data)!=null&&O.error)throw I.data.error}throw\"\\u672A\\u77E5\\u9519\\u8BEF\"}).catch(I=>A.Error(I)).finally(()=>H.Close())}})},k=y=>{y.preventDefault(),u.Close&&u.Close()},w=y=>{y.preventDefault(),location.reload()};return(y,g)=>(o(),z(ot,{Close:e.Close,type:1},{default:M(()=>[v.value==0?(o(),c(\"div\",R5,[W5,t(\"ul\",null,[t(\"li\",null,[t(\"div\",G5,[Z5,t(\"div\",j5,[L(t(\"input\",{type:\"radio\",value:\"Aria2\",\"onUpdate:modelValue\":g[0]||(g[0]=B=>r.value=B),name:\"download\",id:\"Aria2\"},null,512),[[it,r.value]]),X5]),t(\"div\",Q5,[L(t(\"input\",{type:\"radio\",value:\"qBittorrent\",\"onUpdate:modelValue\":g[1]||(g[1]=B=>r.value=B),name:\"download\",id:\"qB\"},null,512),[[it,r.value]]),Y5]),t(\"div\",K5,[L(t(\"input\",{type:\"radio\",value:\"Transmission\",\"onUpdate:modelValue\":g[2]||(g[2]=B=>r.value=B),name:\"download\",id:\"Tr\"},null,512),[[it,r.value]]),J5])])])]),r.value==\"Aria2\"?(o(),c(\"form\",{key:0,onSubmit:lt(l,[\"prevent\"])},[t(\"ul\",null,[t(\"li\",null,[t(\"div\",e6,[t(\"div\",u6,[t(\"span\",n6,[x($t),s6]),o6]),t(\"div\",a6,[x(kt,{modelValue:d.value,\"onUpdate:modelValue\":g[3]||(g[3]=B=>d.value=B),modelModifiers:{trim:!0},title:\"\\u914D\\u7F6E\\u76EE\\u5F55\",options:D.value.concat(\"/root\").map(B=>({key:B+\"/Configs/aria2\"}))},null,8,[\"modelValue\",\"options\"])])])]),t(\"li\",null,[t(\"div\",i6,[t(\"div\",l6,[t(\"span\",c6,[x($t),d6]),r6]),t(\"div\",_6,[x(kt,{modelValue:F.value,\"onUpdate:modelValue\":g[4]||(g[4]=B=>F.value=B),modelModifiers:{trim:!0},title:\"\\u4E0B\\u8F7D\\u76EE\\u5F55\",options:b.value},null,8,[\"modelValue\",\"options\"])])])]),t(\"li\",null,[t(\"div\",p6,[t(\"div\",v6,[t(\"span\",h6,[x($t),F6]),m6]),L(t(\"input\",{type:\"text\",class:\"RPC_input\",placeholder:\"\\u8BF7\\u8F93\\u5165RPC\\u4EE4\\u724C\",\"onUpdate:modelValue\":g[5]||(g[5]=B=>n.value=B)},null,512),[[Y,n.value,void 0,{trim:!0}]])])]),t(\"li\",null,[t(\"div\",f6,[E6,t(\"div\",C6,[L(t(\"input\",{type:\"radio\",value:\"default\",name:\"BT\",id:\"default\",\"onUpdate:modelValue\":g[6]||(g[6]=B=>p.value=B)},null,512),[[it,p.value]]),g6]),t(\"div\",$6,[L(t(\"input\",{type:\"radio\",value:\"add\",name:\"BT\",id:\"add\",\"onUpdate:modelValue\":g[7]||(g[7]=B=>p.value=B)},null,512),[[it,p.value]]),b6])])]),t(\"li\",null,[t(\"div\",y6,[D6,t(\"div\",k6,[p.value==\"add\"?L((o(),c(\"textarea\",{key:0,\"onUpdate:modelValue\":g[8]||(g[8]=B=>a.value=B),rows:\"4\",placeholder:\"\\u8BF7\\u8F93\\u5165BT Tracker\\u670D\\u52A1\\u5668\\u5730\\u5740\\uFF0C\\u591A\\u4E2A\\u5730\\u5740\\u4F7F\\u7528\\u6362\\u884C\\u6216\\u8005\\u82F1\\u6587\\u9017\\u53F7\\u5206\\u9694\"},null,512)),[[Y,a.value,void 0,{trim:!0}]]):$(\"\",!0)])])])])],40,t6)):$(\"\",!0),r.value==\"qBittorrent\"?(o(),c(\"form\",{key:1,onSubmit:lt(E,[\"prevent\"])},[t(\"ul\",null,[t(\"li\",null,[t(\"div\",w6,[t(\"div\",A6,[t(\"span\",x6,[x($t),S6]),I6]),t(\"div\",P6,[x(kt,{modelValue:s.value,\"onUpdate:modelValue\":g[9]||(g[9]=B=>s.value=B),modelModifiers:{trim:!0},title:\"\\u914D\\u7F6E\\u76EE\\u5F55\",options:D.value.concat(\"/root\").map(B=>({key:B+\"/Configs/qb\"}))},null,8,[\"modelValue\",\"options\"])])])]),t(\"li\",null,[t(\"div\",V6,[t(\"div\",M6,[t(\"span\",T6,[x($t),L6]),z6]),t(\"div\",O6,[x(kt,{modelValue:i.value,\"onUpdate:modelValue\":g[10]||(g[10]=B=>i.value=B),modelModifiers:{trim:!0},title:\"\\u4E0B\\u8F7D\\u76EE\\u5F55\",options:b.value},null,8,[\"modelValue\",\"options\"])])])])])],40,B6)):$(\"\",!0),r.value==\"Transmission\"?(o(),c(\"form\",{key:2,onSubmit:lt(h,[\"prevent\"])},[t(\"ul\",null,[t(\"li\",null,[t(\"div\",q6,[t(\"div\",U6,[t(\"span\",H6,[x($t),R6]),W6]),t(\"div\",G6,[x(kt,{modelValue:_.value,\"onUpdate:modelValue\":g[11]||(g[11]=B=>_.value=B),modelModifiers:{trim:!0},title:\"\\u914D\\u7F6E\\u76EE\\u5F55\",options:D.value.concat(\"/root\").map(B=>({key:B+\"/Configs/transmission\"}))},null,8,[\"modelValue\",\"options\"])])])]),t(\"li\",null,[t(\"div\",Z6,[t(\"div\",j6,[t(\"span\",X6,[x($t),Q6]),Y6]),t(\"div\",K6,[x(kt,{modelValue:f.value,\"onUpdate:modelValue\":g[12]||(g[12]=B=>f.value=B),modelModifiers:{trim:!0},title:\"\\u4E0B\\u8F7D\\u76EE\\u5F55\",options:b.value},null,8,[\"modelValue\",\"options\"])])])])])],40,N6)):$(\"\",!0),t(\"div\",J6,[r.value==\"Aria2\"?(o(),c(\"button\",{key:0,class:\"cbi-button cbi-button-apply\",onClick:l},\" \\u542F\\u7528 \")):$(\"\",!0),r.value==\"qBittorrent\"?(o(),c(\"button\",{key:1,class:\"cbi-button cbi-button-apply\",onClick:E},\" \\u542F\\u7528 \")):$(\"\",!0),r.value==\"Transmission\"?(o(),c(\"button\",{key:2,class:\"cbi-button cbi-button-apply\",onClick:h},\" \\u542F\\u7528 \")):$(\"\",!0),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:k},\" \\u53D6\\u6D88 \")])])):v.value==1?(o(),c(\"div\",t0,[t(\"h2\",e0,m(r.value)+\"\\u4E0B\\u8F7D\\u670D\\u52A1\\u914D\\u7F6E\\u5411\\u5BFC\",1),t(\"div\",u0,[x(Yt)]),n0,t(\"div\",{class:\"btns\"},[t(\"button\",{class:\"cbi-button cbi-button-apply\",onClick:w},\" \\u786E\\u5B9A \")])])):$(\"\",!0)]),_:1},8,[\"Close\"]))}});var o0=S(s0,[[\"__scopeId\",\"data-v-f4c41bf2\"]]);const a0=e=>{const u=document.createElement(\"div\");document.body.appendChild(u);const n=st(o0,ht(vt({},e),{Close:()=>{a()}}));n.mount(u);const a=()=>{n.unmount(),u.remove()};return{Close:a}};const Ut=e=>(q(\"data-v-63fbd04d\"),e=e(),U(),e),i0={class:\"service-item\"},l0={class:\"name\"},c0=Ut(()=>t(\"span\",null,\"Aria2\",-1)),d0={class:\"button\"},r0={class:\"info\"},_0=[\"href\"],p0=[\"href\"],v0=Ut(()=>t(\"span\",null,[Z(\"\\u4F7F\\u7528\"),t(\"a\",{href:\"https://doc.linkease.com/zh/guide/linkease_app/tutorial.html#%E8%BF%9C%E7%A8%8B%E4%B8%8B%E8%BD%BD\",target:\"_blank\"},\"\\u6613\\u6709\\u4E91APP\"),Z(\"\\uFF0C\\u968F\\u65F6\\u968F\\u5730\\u8FDC\\u7A0B\\u4E0B\\u8F7D\")],-1)),h0={key:0},F0=[\"href\"],m0={class:\"service-item\"},f0={class:\"name\"},E0=Ut(()=>t(\"span\",null,\"qBittorrent\",-1)),C0={key:0,class:\"button\"},g0={class:\"info\"},$0=[\"href\"],b0=[\"href\"],y0={class:\"service-item\"},D0={class:\"name\"},k0=Ut(()=>t(\"span\",null,\"Transmission\",-1)),B0={key:0,class:\"button\"},w0={class:\"info\"},A0=[\"href\"],x0=V({__name:\"download\",setup(e){const u=C(),n=C(\"aria2\"),a=C(window.location),d=()=>{P.Guide.DownloadPartition.List.GET().then(s=>{var _,f;let i=[];(f=(_=s==null?void 0:s.data)==null?void 0:_.result)!=null&&f.partitionList&&(i=s.data.result.partitionList),a0({services:u.value,partitionList:i,defaultTab:n.value})})},F=()=>{P.Guide.DownloadService.Status.GET().then(s=>{var i;if((i=s==null?void 0:s.data)!=null&&i.result){const _=s.data.result;u.value=_}})},p=W(()=>{var s,i,_;if(u){let f=(s=u==null?void 0:u.aria2)==null?void 0:s.rpcToken;f&&(f=encodeURIComponent(btoa(f)));const b=encodeURIComponent(window.location.hostname);return`${window.location.origin}${(i=u==null?void 0:u.aria2)==null?void 0:i.webPath}/#!/settings/rpc/set/http/${b}/${(_=u==null?void 0:u.aria2)==null?void 0:_.rpcPort}/jsonrpc/${f}`}}),r=(s,i,_)=>T(this,null,function*(){window.open(_,\"_blank\")});return setTimeout(F,800),(s,i)=>(o(),z(j,{title:s.$t(\"\\u4E0B\\u8F7D\\u670D\\u52A1\"),padding:\"0 10px 8px 10px\",helpLink:\"https://www.linkease.com/rd/2Q28MDtf/\",span:24,action:{text:s.$t(\"\\u5FEB\\u901F\\u914D\\u7F6E\"),onClick:d}},{default:M(()=>{var _,f,b,D,v,l,E,h,k,w,y,g,B,H,I,O,nt,xt,St,It,Pt,Vt,Mt,Tt,pt,Jt,te,ee,ue,ne,se,oe,ae,ie,le,ce,de,re,_e,pe;return[t(\"div\",i0,[t(\"div\",l0,[t(\"span\",null,[c0,t(\"span\",null,m(s.$t(\"\\u6682\\u65E0\\u4E0B\\u8F7D\")),1)]),t(\"div\",d0,[t(\"span\",{onClick:i[0]||(i[0]=ve=>r(\"app-meta-aria2\",\"Aria2\",\"/cgi-bin/luci/admin/services/aria2\"))},m(s.$t(\"\\u9AD8\\u7EA7\\u914D\\u7F6E\")),1)])]),t(\"div\",r0,[t(\"span\",null,m(s.$t(\"\\u5F53\\u524D\\u72B6\\u6001\"))+\"\\uFF1A\"+m(`${((f=(_=u.value)==null?void 0:_.aria2)==null?void 0:f.status)===\"running\"?s.$t(\"\\u5DF2\\u542F\\u52A8\"):s.$t(\"\\u672A\\u542F\\u52A8\")}`),1),((D=(b=u.value)==null?void 0:b.aria2)==null?void 0:D.status)==\"running\"?(o(),c(N,{key:0},[t(\"span\",null,[Z(m(s.$t(\"\\u4E0B\\u8F7D\\u76EE\\u5F55\"))+\"\\uFF1A \",1),t(\"a\",{target:\"_blank\",href:\"/cgi-bin/luci/admin/services/linkease/file/?path=/root\"+((l=(v=u.value)==null?void 0:v.aria2)==null?void 0:l.downloadPath)},m((h=(E=u.value)==null?void 0:E.aria2)==null?void 0:h.downloadPath),9,_0)]),t(\"span\",null,[Z(m(s.$t(\"\\u7F51\\u7EDC\\u5730\\u5740\"))+\"\\uFF1A \",1),t(\"a\",{href:`http://${a.value.hostname}${(w=(k=u.value)==null?void 0:k.aria2)==null?void 0:w.webPath}`,target:\"_blank\",rel:\"noopener noreferrer\"},m(`http://${a.value.hostname}${(g=(y=u.value)==null?void 0:y.aria2)==null?void 0:g.webPath}`),9,p0)])],64)):$(\"\",!0),t(\"div\",null,[v0,((H=(B=u.value)==null?void 0:B.aria2)==null?void 0:H.status)===\"running\"?(o(),c(\"span\",h0,[Z(m(s.$t(\"\\u8BA4\\u8BC1\\u5931\\u8D25\"))+\"\\uFF1F \",1),t(\"a\",{href:p.value,target:\"_blank\",rel:\"noopener noreferrer\"},\" \\u70B9\\u6B64\\u81EA\\u52A8\\u586B\\u5145\\u5BC6\\u94A5 \",8,F0)])):$(\"\",!0)])])]),t(\"div\",m0,[t(\"div\",f0,[t(\"span\",null,[E0,t(\"span\",null,m(s.$t(\"\\u6682\\u65E0\\u4E0B\\u8F7D\")),1)]),((O=(I=u.value)==null?void 0:I.qbittorrent)==null?void 0:O.status)===\"running\"?(o(),c(\"div\",C0,[t(\"span\",{onClick:i[1]||(i[1]=ve=>r(\"app-meta-qbittorrent\",\"qBittorrent\",\"/cgi-bin/luci/admin/nas/qBittorrent\"))},m(s.$t(\"\\u9AD8\\u7EA7\\u914D\\u7F6E\")),1)])):$(\"\",!0)]),t(\"div\",g0,[t(\"span\",null,m(`${s.$t(\"\\u5F53\\u524D\\u72B6\\u6001\")}\\uFF1A${((xt=(nt=u.value)==null?void 0:nt.qbittorrent)==null?void 0:xt.status)===\"running\"?s.$t(\"\\u5DF2\\u542F\\u52A8\"):s.$t(\"\\u672A\\u542F\\u52A8\")}`),1),((It=(St=u.value)==null?void 0:St.qbittorrent)==null?void 0:It.status)==\"running\"?(o(),c(N,{key:0},[t(\"span\",null,[Z(m(s.$t(\"\\u4E0B\\u8F7D\\u76EE\\u5F55\"))+\"\\uFF1A \",1),t(\"a\",{target:\"_blank\",href:\"/cgi-bin/luci/admin/services/linkease/file/?path=/root\"+((Vt=(Pt=u.value)==null?void 0:Pt.qbittorrent)==null?void 0:Vt.downloadPath)},m((Tt=(Mt=u.value)==null?void 0:Mt.qbittorrent)==null?void 0:Tt.downloadPath),9,$0)]),t(\"span\",null,[Z(m(s.$t(\"\\u7F51\\u7EDC\\u5730\\u5740\"))+\"\\uFF1A \",1),t(\"a\",{href:`http://${a.value.hostname}${(Jt=(pt=u.value)==null?void 0:pt.qbittorrent)==null?void 0:Jt.webPath}`,target:\"_blank\",rel:\"noopener noreferrer\"},m(`http://${a.value.hostname}${(ee=(te=u.value)==null?void 0:te.qbittorrent)==null?void 0:ee.webPath}`),9,b0)])],64)):$(\"\",!0)])]),t(\"div\",y0,[t(\"div\",D0,[t(\"span\",null,[k0,t(\"span\",null,m(s.$t(\"\\u6682\\u65E0\\u4E0B\\u8F7D\")),1)]),((ne=(ue=u.value)==null?void 0:ue.transmission)==null?void 0:ne.status)===\"running\"?(o(),c(\"div\",B0,[t(\"span\",{onClick:i[2]||(i[2]=ve=>r(\"app-meta-transmission\",\"Transmission\",\"/cgi-bin/luci/admin/services/transmission\"))},m(s.$t(\"\\u9AD8\\u7EA7\\u914D\\u7F6E\")),1)])):$(\"\",!0)]),t(\"div\",w0,[t(\"span\",null,m(`${s.$t(\"\\u5F53\\u524D\\u72B6\\u6001\")}\\uFF1A${((oe=(se=u.value)==null?void 0:se.transmission)==null?void 0:oe.status)===\"running\"?s.$t(\"\\u5DF2\\u542F\\u52A8\"):s.$t(\"\\u672A\\u542F\\u52A8\")}`),1),((ie=(ae=u.value)==null?void 0:ae.transmission)==null?void 0:ie.status)==\"running\"?(o(),c(N,{key:0},[t(\"span\",null,m(s.$t(\"\\u4E0B\\u8F7D\\u76EE\\u5F55\"))+\"\\uFF1A \"+m(\"/cgi-bin/luci/admin/services/linkease/file/?path=/root\"+((ce=(le=u.value)==null?void 0:le.transmission)==null?void 0:ce.downloadPath)),1),t(\"span\",null,[Z(m(s.$t(\"\\u7F51\\u7EDC\\u5730\\u5740\"))+\"\\uFF1Ahttp \",1),t(\"a\",{href:`http://${a.value.hostname}${(re=(de=u.value)==null?void 0:de.transmission)==null?void 0:re.webPath}`,target:\"_blank\",rel:\"noopener noreferrer\"},m(`http://${a.value.hostname}${(pe=(_e=u.value)==null?void 0:_e.transmission)==null?void 0:pe.webPath}`),9,A0)])],64)):$(\"\",!0)])])]}),_:1},8,[\"title\",\"action\"]))}});var S0=S(x0,[[\"__scopeId\",\"data-v-63fbd04d\"]]);const I0=V({__name:\"index\",setup(e){return(u,n)=>(o(),z(ft,{title:u.$t(\"\\u670D\\u52A1\\u72B6\\u6001\"),contentStyle:\"flex-flow: column\"},{default:M(()=>[x(Cr),x(I5),x(S0)]),_:1},8,[\"title\"]))}});var P0=\"/luci-static/istorex/file.png?v=055a0ac9\",V0=\"/luci-static/istorex/user.png?v=fa675eea\",M0=\"/luci-static/istorex/setting.png?v=bf214b33\",T0=\"/luci-static/istorex/file-manage.png?v=3297497e\",L0=\"/luci-static/istorex/sync.png?v=8384453e\",z0=\"/luci-static/istorex/photo.png?v=3178eb60\",O0=\"/luci-static/istorex/network.png?v=3314b340\",N0=\"/luci-static/istorex/nas.png?v=902703f1\";const Oe=e=>(q(\"data-v-a711c820\"),e=e(),U(),e),q0={class:\"container\"},U0={key:0,class:\"desc\"},H0=Oe(()=>t(\"a\",{href:\"https://www.linkease.com/\",target:\"_blank\"},\"\\u6613\\u6709\\u4E91\\u2122 \\uFE0F\",-1)),R0={key:1,class:\"desc\"},W0=Oe(()=>t(\"span\",null,[Z(\" \\u76F8\\u518C\\u5907\\u4EFD\\u529F\\u80FD\\u7531 \"),t(\"a\",{href:\"https://www.linkease.com/\",target:\"_blank\"},\"\\u6613\\u6709\\u4E91\\u2122 \\uFE0F\"),Z(\" \\u63D0\\u4F9B \")],-1)),G0=[\"href\"],Z0=V({__name:\"install-photobackup\",setup(e){const u=C(\"\"),n=C(\"\"),a=()=>T(this,null,function*(){const p=A.Loading(\"\\u5B89\\u88C5\\u4E2D...\");try{if(yield rt.installApp(\"app-meta-ddnsto\",30)){n.value=\"installed\",A.Success(\"\\u5B89\\u88C5\\u6210\\u529F\"),F();return}else A.Success(\"\\u5B89\\u88C5\\u5931\\u8D25\")}finally{p.Close()}}),d=W(()=>`http://${location.hostname}:${u.value}`),F=()=>{P.Nas.Linkease.Enable.POST().then(p=>{var r,s;(r=p==null?void 0:p.data)!=null&&r.result&&(u.value=((s=p.data.result)==null?void 0:s.port)||\"\")})};return et(()=>T(this,null,function*(){const p=yield P.App.Check.POST({name:\"linkease\"});if(p!=null&&p.data){const{result:r,error:s}=p.data;r!=null&&r.status&&(n.value=r==null?void 0:r.status,r.status===\"installed\"&&F())}})),(p,r)=>(o(),z(Se,{title:\"\\u63D0\\u793A\",width:\"572px\"},{default:M(()=>[t(\"div\",q0,[n.value===\"uninstalled\"?(o(),c(\"p\",U0,[Z(\" \\u76F8\\u518C\\u5907\\u4EFD\\u529F\\u80FD\\u7531 \"),H0,Z(\" \\u63D0\\u4F9B\\uFF0C\\u53EF\\u4EE5\\u5C06\\u624B\\u673A\\u76F8\\u518C\\u5907\\u4EFD\\u81F3\\u672C\\u8BBE\\u5907\\u4F7F\\u7528\\u524D\\u9700\\u8981\\u5B89\\u88C5\\u6613\\u6709\\u4E91 \")])):$(\"\",!0),n.value===\"installed\"?(o(),c(\"p\",R0,[W0,t(\"span\",null,\"\\u8BBF\\u95EE\\u94FE\\u63A5\\uFF1A\"+m(d.value),1)])):$(\"\",!0),n.value===\"uninstalled\"?(o(),c(\"button\",{key:2,class:\"btn\",onClick:a},\" \\u7ACB\\u5373\\u5B89\\u88C5 \")):$(\"\",!0),n.value===\"installed\"?(o(),c(\"a\",{key:3,class:\"btn\",target:\"_blank\",href:d.value},\"\\u7ACB\\u5373\\u8BBF\\u95EE\",8,G0)):$(\"\",!0)])]),_:1}))}});var j0=S(Z0,[[\"__scopeId\",\"data-v-a711c820\"]]);const Ne=e=>(q(\"data-v-7c1d7115\"),e=e(),U(),e),X0={class:\"container\"},Q0={key:0,class:\"desc\"},Y0=Ne(()=>t(\"a\",{href:\"https://www.linkease.com/\",target:\"_blank\"},\"\\u6613\\u6709\\u4E91\\u2122 \\uFE0F\",-1)),K0={key:1,class:\"desc\"},J0=Ne(()=>t(\"span\",null,[Z(\" \\u6587\\u4EF6\\u540C\\u6B65\\u529F\\u80FD\\u7531 \"),t(\"a\",{href:\"https://www.linkease.com/\",target:\"_blank\"},\"\\u6613\\u6709\\u4E91\\u2122 \\uFE0F\"),Z(\" \\u63D0\\u4F9B \")],-1)),t2=[\"href\"],e2=V({__name:\"file-sync\",setup(e){const u=C(\"\"),n=C(\"\"),a=()=>T(this,null,function*(){const p=A.Loading(\"\\u5B89\\u88C5\\u4E2D...\");try{if(yield rt.installApp(\"app-meta-ddnsto\",30)){n.value=\"installed\",A.Success(\"\\u5B89\\u88C5\\u6210\\u529F\"),F();return}else A.Success(\"\\u5B89\\u88C5\\u5931\\u8D25\")}finally{p.Close()}}),d=W(()=>`http://${location.hostname}:${u.value}`),F=()=>{P.Nas.Linkease.Enable.POST().then(p=>{var r,s;(r=p==null?void 0:p.data)!=null&&r.result&&(u.value=((s=p.data.result)==null?void 0:s.port)||\"\")})};return et(()=>T(this,null,function*(){const p=yield P.App.Check.POST({name:\"linkease\"});if(p!=null&&p.data){const{result:r,error:s}=p.data;r!=null&&r.status&&(n.value=r==null?void 0:r.status,r.status===\"installed\"&&F())}})),(p,r)=>(o(),z(Se,{title:\"\\u63D0\\u793A\",width:\"572px\"},{default:M(()=>[t(\"div\",X0,[n.value===\"uninstalled\"?(o(),c(\"p\",Q0,[Z(\" \\u6587\\u4EF6\\u540C\\u6B65\\u529F\\u80FD\\u7531 \"),Y0,Z(\" \\u63D0\\u4F9B\\uFF0C\\u53EF\\u4EE5\\u540C\\u65F6\\u76F8\\u4E92\\u5907\\u4EFD\\u591A\\u53F0\\u8BBE\\u5907\\u6587\\u4EF6\\u4F7F\\u7528\\u524D\\u9700\\u8981\\u5B89\\u88C5\\u6613\\u6709\\u4E91 \")])):$(\"\",!0),n.value===\"installed\"?(o(),c(\"p\",K0,[J0,t(\"span\",null,\"\\u8BBF\\u95EE\\u94FE\\u63A5\\uFF1A\"+m(d.value),1)])):$(\"\",!0),n.value===\"uninstalled\"?(o(),c(\"button\",{key:2,class:\"btn\",onClick:a},\" \\u7ACB\\u5373\\u5B89\\u88C5 \")):$(\"\",!0),n.value===\"installed\"?(o(),c(\"a\",{key:3,class:\"btn\",target:\"_blank\",href:d.value},\"\\u7ACB\\u5373\\u8BBF\\u95EE\",8,t2)):$(\"\",!0)])]),_:1}))}});var u2=S(e2,[[\"__scopeId\",\"data-v-7c1d7115\"]]);class n2 extends eu{Open(u){u===\"sync\"&&this.openWindow(u2),u===\"backup\"&&this.openWindow(j0)}}const De=new n2;const At=e=>(q(\"data-v-719851d0\"),e=e(),U(),e),s2={class:\"width-60 responsive\"},o2={class:\"card-content\"},a2=At(()=>t(\"div\",null,[t(\"img\",{src:P0,alt:\"\\u5171\\u4EAB\\u6587\\u4EF6\"})],-1)),i2=At(()=>t(\"div\",null,[t(\"img\",{src:V0,alt:\"\\u5171\\u4EAB\\u7528\\u6237\"})],-1)),l2={class:\"card-content\"},c2=At(()=>t(\"div\",null,[t(\"img\",{src:M0,alt:\"\\u5171\\u4EAB\\u8BBE\\u7F6E\"})],-1)),d2={class:\"card-content\"},r2=At(()=>t(\"div\",null,[t(\"img\",{src:T0,alt:\"\\u6587\\u4EF6\\u7BA1\\u7406\"})],-1)),_2=At(()=>t(\"div\",null,[t(\"img\",{src:L0,alt:\"\\u6587\\u4EF6\\u540C\\u6B65\"})],-1)),p2=At(()=>t(\"div\",null,[t(\"img\",{src:z0,alt:\"\\u76F8\\u518C\\u5907\\u4EFD\"})],-1)),v2={class:\"width-40 responsive\"},h2={class:\"card-content\"},F2=[\"alt\"],m2={class:\"card-content\"},f2=[\"alt\"],E2=V({__name:\"index\",setup(e){const u=()=>{we.OpenGuideWindow()},n=C(window.innerWidth<668),a=()=>{window.open(\"/cgi-bin/luci/admin/services/linkease/file\",\"_blank\")},d=()=>{n.value=window.innerWidth<668};et(()=>{window.addEventListener(\"resize\",d)}),uu(()=>{window.removeEventListener(\"resize\",d)});const F=()=>{A.Message(\"\\u6682\\u672A\\u5F00\\u653E\")};return(p,r)=>(o(),c(\"div\",null,[t(\"div\",s2,[x(ft,{title:p.$t(\"\\u5171\\u4EAB\\u529F\\u80FD\"),height:\"140px\"},{default:M(()=>[x(j,{span:8,onClick:r[0]||(r[0]=s=>R(_u).Open())},{default:M(()=>[t(\"div\",o2,[a2,t(\"span\",null,m(p.$t(\"\\u5171\\u4EAB\\u6587\\u4EF6\")),1)])]),_:1}),x(j,{span:8},{default:M(()=>[t(\"div\",{class:\"card-content\",onClick:r[1]||(r[1]=s=>R(pu).Open())},[i2,t(\"span\",null,m(p.$t(\"\\u5171\\u4EAB\\u7528\\u6237\")),1)])]),_:1}),x(j,{span:8,onClick:r[2]||(r[2]=s=>F())},{default:M(()=>[t(\"div\",l2,[c2,t(\"span\",null,m(p.$t(\"\\u5171\\u4EAB\\u8BBE\\u7F6E\")),1)])]),_:1})]),_:1},8,[\"title\"]),x(ft,{title:p.$t(\"\\u5176\\u4ED6\\u529F\\u80FD\"),height:\"140px\"},{default:M(()=>[x(j,{span:8,onClick:a},{default:M(()=>[t(\"div\",d2,[r2,t(\"span\",null,m(p.$t(\"\\u6587\\u4EF6\\u7BA1\\u7406\")),1)])]),_:1}),x(j,{span:8},{default:M(()=>[t(\"div\",{class:\"card-content\",onClick:r[3]||(r[3]=s=>R(De).Open(\"sync\"))},[_2,t(\"span\",null,m(p.$t(\"\\u6587\\u4EF6\\u540C\\u6B65\")),1)])]),_:1}),x(j,{span:8},{default:M(()=>[t(\"div\",{class:\"card-content\",onClick:r[4]||(r[4]=s=>R(De).Open(\"backup\"))},[p2,t(\"span\",null,m(p.$t(\"\\u76F8\\u518C\\u5907\\u4EFD\")),1)])]),_:1})]),_:1},8,[\"title\"])]),t(\"div\",v2,[x(ft,{height:n.value?\"\":\"288px\",title:p.$t(\"\\u5411\\u5BFC\\u529F\\u80FD\")},{default:M(()=>[x(j,{span:12,onClick:r[5]||(r[5]=s=>R(at)({title:p.$t(\"\\u7F51\\u7EDC\\u5411\\u5BFC\"),src:\"/cgi-bin/luci/admin/quickstart/network\"}))},{default:M(()=>[t(\"div\",h2,[t(\"div\",null,[t(\"img\",{src:O0,alt:p.$t(\"\\u7F51\\u7EDC\\u5411\\u5BFC\")},null,8,F2)]),t(\"span\",null,m(p.$t(\"\\u7F51\\u7EDC\\u5411\\u5BFC\")),1)])]),_:1}),x(j,{span:12,onClick:r[6]||(r[6]=s=>u())},{default:M(()=>[t(\"div\",m2,[t(\"div\",null,[t(\"img\",{src:N0,alt:p.$t(\"NAS\\u5411\\u5BFC\")},null,8,f2)]),t(\"span\",null,m(p.$t(\"NAS\\u5411\\u5BFC\")),1)])]),_:1})]),_:1},8,[\"height\",\"title\"])])]))}});var C2=S(E2,[[\"__scopeId\",\"data-v-719851d0\"]]);const g2=V({__name:\"index\",setup(e){const u=xe(),n=W(()=>u.portitemStyle.portitem),a=W(()=>u.portitemStyle.show),d=W(()=>({bottom:`calc(100% - ${u.portitemStyle.top}px)`,left:`${u.portitemStyle.left}px`})),F=s=>{switch(s){case\"full\":return\"\\u5168\\u53CC\\u5DE5\";case\"half\":return\"\\u534A\\u53CC\\u5DE5\"}},p=s=>{u.portitemStyle.show=!0},r=s=>{u.portitemStyle.show=!1};return(s,i)=>a.value?(o(),c(\"div\",{key:0,class:\"disk-item-tooltip\",style:tt(d.value),onMouseenter:p,onMouseleave:r},[t(\"div\",null,m(F(n.value.duplex)),1),t(\"div\",null,\"\\u540D\\u79F0\\uFF1A\"+m(n.value.name||\"--\"),1),t(\"div\",null,\"MAC\\uFF1A\"+m(n.value.macAddress||\"--\"),1),t(\"div\",null,\"\\u63A5\\u6536\\uFF1A\"+m(n.value.rx_packets||\"--\"),1),t(\"div\",null,\"\\u53D1\\u9001\\uFF1A\"+m(n.value.tx_packets||\"--\"),1)],36)):$(\"\",!0)}});var $2=S(g2,[[\"__scopeId\",\"data-v-4955cc3f\"]]);const b2={class:\"next-main\",style:{}},y2={class:\"content\"},D2=V({__name:\"index\",setup(e){return(u,n)=>(o(),c(\"div\",b2,[x(Ku),t(\"div\",y2,[t(\"div\",null,[x(nn),x(oa),x(Ua),x(w1)]),t(\"div\",null,[x(C2),x(N1),x(I0)])]),x($2)]))}});var x2=S(D2,[[\"__scopeId\",\"data-v-cbe9b60a\"]]);export{x2 as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.ff94f9f2.js",
    "content": "var m=(_,v,l)=>new Promise((n,r)=>{var F=i=>{try{c(l.next(i))}catch(u){r(u)}},h=i=>{try{c(l.throw(i))}catch(u){r(u)}},c=i=>i.done?n(i.value):Promise.resolve(i.value).then(F,h);c((l=l.apply(_,v)).next())});import{_ as g,d as y,j as k,v as E,i as x,o,c as a,a as e,l as d,F as A,K as S,L as B,p as b,q as N,C as w}from\"./index.js?v=5b4be379\";const D=_=>(b(\"data-v-613b66e3\"),_=_(),N(),_),$={id:\"page\",class:\"page-container\"},I=D(()=>e(\"div\",{class:\"notice_info\"},[e(\"li\",null,\" \\u52A8\\u6001 DNS \\uFF08DDNS\\uFF09\\u8BA9\\u60A8\\u5373\\u4F7F\\u5728\\u6CA1\\u6709\\u9759\\u6001 IP \\u5730\\u5740\\u7684\\u60C5\\u51B5\\u4E0B\\uFF0C\\u4ECD\\u53EF\\u5C06\\u670D\\u52A1\\u5668\\u8FDE\\u540C\\u7ED1\\u5B9A\\u7684\\u57DF\\u540D\\u6620\\u5C04\\u81F3\\u516C\\u7F51\\u4E0A\\u3002 \"),e(\"li\",null,\" \\u5982\\u679C\\u60A8\\u6CA1\\u6709\\u516C\\u7F51 IP \\u8BF7\\u4F7F\\u7528 DDNSTO \\uFF0C\\u521D\\u6B21\\u4F7F\\u7528 DDNSTO \\u9700\\u8981\\u521D\\u59CB\\u5316\\u914D\\u7F6E \")],-1)),P={class:\"text-container\"},T={class:\"text-container_item\"},O=D(()=>e(\"div\",{class:\"text-container_item_title\"},[e(\"span\",null,\"DDNSTO\\uFF1A\")],-1)),q={class:\"text-container_item_flex\"},G={class:\"text-container_item_block\"},j=[\"href\"],K={key:0,class:\"domain\"},L={key:1,class:\"domain\"},V={class:\"text-container_item\"},z=D(()=>e(\"div\",{class:\"text-container_item_title\"},[e(\"span\",null,\"myddns_ipv4\\uFF1A\")],-1)),H={class:\"text-container_item_flex\"},J={class:\"text-container_item_block\"},M=[\"href\"],Q={key:1,class:\"domain\"},R={class:\"text-container_item\"},U=D(()=>e(\"div\",{class:\"text-container_item_title\"},[e(\"span\",null,\"myddns_ipv6\\uFF1A\")],-1)),W={class:\"text-container_item_flex\"},X={class:\"text-container_item_block\"},Y=[\"href\"],Z={key:1,class:\"domain\"},tt=y({__name:\"index\",setup(_){return m(this,null,function*(){let v,l;k({ipv4:\"\",ipv6:\"\"});const n=k({ddnstoDomain:\"\",ipv4Domain:\"\",ipv6Domain:\"\"}),r=k({install:!0,error:null}),F=()=>m(this,null,function*(){yield Promise.all([h()])}),h=()=>m(this,null,function*(){try{const t=yield w.Guide.Ddns.GET(),{result:s,error:p}=t.data;if(p)throw p;s&&(n.ddnstoDomain=s.ddnstoDomain,n.ipv4Domain=s.ipv4Domain,n.ipv6Domain=s.ipv6Domain)}catch(t){console.log(t)}});[v,l]=E(()=>F()),yield v,l();const c=x(()=>n.ddnstoDomain),i=x(()=>{const t=n.ipv4Domain;return t!=null&&t!=\"\"&&t!=\"Stopped\"?{url:`http://${t}`,title:t,ok:!0}:{url:`http://${t}`,title:\"\\u672A\\u914D\\u7F6E\",ok:!1}}),u=x(()=>{const t=n.ipv6Domain;return t!=null&&t!=\"\"&&t!=\"Stopped\"?{url:`http://${t}`,title:t,ok:!0}:{url:`http://${t}`,title:\"\\u672A\\u914D\\u7F6E\",ok:!1}}),C=()=>{S({domain:c.value,callback:t=>{}})},f=t=>{B({setup:t,callback:s=>{switch(t){case\"ipv4\":n.ipv4Domain=s.domain;break;case\"ipv6\":n.ipv6Domain=s.domain;break}}})};return(t,s)=>(o(),a(\"div\",$,[I,e(\"div\",P,[e(\"div\",T,[O,e(\"div\",q,[e(\"div\",G,[r.install?(o(),a(\"a\",{key:0,href:c.value,target:\"_blank\",class:\"domain\"},d(c.value),9,j)):(o(),a(A,{key:1},[r.error?(o(),a(\"a\",K,d(r.error),1)):(o(),a(\"a\",L,\"\\u672A\\u5B89\\u88C5\"))],64)),e(\"a\",{class:\"setting\",onClick:s[0]||(s[0]=p=>C())},\"\\u5FEB\\u901F\\u914D\\u7F6E\")])])]),e(\"div\",V,[z,e(\"div\",H,[e(\"div\",J,[i.value.ok?(o(),a(\"a\",{key:0,href:i.value.url,target:\"_blank\",class:\"domain\"},d(i.value.title),9,M)):(o(),a(\"a\",Q,d(i.value.title),1)),e(\"a\",{class:\"setting\",onClick:s[1]||(s[1]=p=>f(\"ipv4\"))},\"\\u5FEB\\u901F\\u914D\\u7F6E\")])])]),e(\"div\",R,[U,e(\"div\",W,[e(\"div\",X,[u.value.ok?(o(),a(\"a\",{key:0,href:u.value.url,target:\"_blank\",class:\"domain\"},d(u.value.title),9,Y)):(o(),a(\"a\",Z,d(u.value.title),1)),e(\"a\",{class:\"setting\",onClick:s[2]||(s[2]=p=>f(\"ipv6\"))},\"\\u5FEB\\u901F\\u914D\\u7F6E\")])])])])]))})}});var it=g(tt,[[\"__scopeId\",\"data-v-613b66e3\"]]);export{it as default};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/chunk.ffd7724b.js",
    "content": "var JL=Object.defineProperty,QL=Object.defineProperties;var jL=Object.getOwnPropertyDescriptors;var Am=Object.getOwnPropertySymbols;var tI=Object.prototype.hasOwnProperty,eI=Object.prototype.propertyIsEnumerable;var Dm=(r,e,t)=>e in r?JL(r,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):r[e]=t,Mm=(r,e)=>{for(var t in e||(e={}))tI.call(e,t)&&Dm(r,t,e[t]);if(Am)for(var t of Am(e))eI.call(e,t)&&Dm(r,t,e[t]);return r},Lm=(r,e)=>QL(r,jL(e));var ra=(r,e,t)=>new Promise((a,n)=>{var i=l=>{try{s(t.next(l))}catch(u){n(u)}},o=l=>{try{s(t.throw(l))}catch(u){n(u)}},s=l=>l.done?a(l.value):Promise.resolve(l.value).then(i,o);s((t=t.apply(r,e)).next())});import{d as fn,r as rI,o as _t,c as It,E as pa,F as lr,a as N,g as df,l as Xt,$ as wd,e as zr,m as Ee,_ as hn,p as Si,q as xi,x as Uu,a0 as aI,a1 as nI,j as Gs,s as Ob,w as hg,V as vg,T as ar,C as Fr,W as cg,A as iI,a2 as Im,z as bd,a3 as Cd}from\"./index.js?v=5b4be379\";var oI=\"/luci-static/istorex/disk.png?v=14325490\",sI=\"/luci-static/istorex/partition.png?v=d1e1a8fb\",lI=\"/luci-static/istorex/folder.png?v=38e4700a\";const Bb=r=>(Si(\"data-v-8009221e\"),r=r(),xi(),r),uI=[\"onClick\"],fI={key:0,width:\"16\",height:\"16\",viewBox:\"0 0 16 16\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},hI=Bb(()=>N(\"path\",{d:\"M14.4 4.80005L8.00002 11.2L1.60002 4.80005\",stroke:\"black\",\"stroke-opacity\":\"0.83\",\"stroke-width\":\"2\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1)),vI=[hI],cI={key:1,width:\"10\",height:\"16\",viewBox:\"0 0 10 16\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},dI=Bb(()=>N(\"path\",{d:\"M1.80005 1.59998L8.20005 7.99998L1.80005 14.4\",stroke:\"black\",\"stroke-opacity\":\"0.83\",\"stroke-width\":\"2\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1)),pI=[dI],gI=[\"src\"],yI={key:1,class:\"empty\"},mI=fn({__name:\"folder-tree\",props:{currPath:{type:Object,required:!0},folders:{type:Array,required:!0},onDisk:{type:Function,required:!0},context:{type:Object,required:!0}},setup(r){const e=r,t=(a,n)=>{a.folder&&(a.folder.openChildren=!a.folder.openChildren),e.onDisk(a,n)};return(a,n)=>{const i=rI(\"folder-tree\",!0);return r.folders.length?(_t(!0),It(lr,{key:0},pa(r.folders,(o,s)=>(_t(),It(\"div\",{key:s,class:\"folder-body\"},[N(\"div\",{class:\"content\",onClick:l=>t({disk:r.context.disk,mount:r.context.mount,folder:o},\"folder\"),style:wd(o.rootPath&&r.currPath.join().includes(o.rootPath)?\"background-color:#ecf5ff;\":\"\")},[o.openChildren?(_t(),It(\"svg\",fI,vI)):(_t(),It(\"svg\",cI,pI)),N(\"img\",{src:df(lI)},null,8,gI),N(\"span\",null,Xt(o.name),1)],12,uI),o.openChildren?(_t(),It(lr,{key:0},[o.childrens?(_t(),zr(i,{key:0,currPath:r.currPath,\"on-disk\":r.onDisk,folders:o.childrens,context:{disk:r.context.disk,mount:r.context.mount}},null,8,[\"currPath\",\"on-disk\",\"folders\",\"context\"])):Ee(\"\",!0)],64)):Ee(\"\",!0)]))),128)):(_t(),It(\"div\",yI,\"\\u7A7A\\u76EE\\u5F55\"))}}});var _I=hn(mI,[[\"__scopeId\",\"data-v-8009221e\"]]);const yl=r=>(Si(\"data-v-2ec06138\"),r=r(),xi(),r),SI={class:\"disk-item\"},xI={key:0,width:\"16\",height:\"16\",viewBox:\"0 0 16 16\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},wI=yl(()=>N(\"path\",{d:\"M14.4 4.80005L8.00002 11.2L1.60002 4.80005\",stroke:\"black\",\"stroke-opacity\":\"0.83\",\"stroke-width\":\"2\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1)),bI=[wI],CI={key:1,width:\"10\",height:\"16\",viewBox:\"0 0 10 16\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},TI=yl(()=>N(\"path\",{d:\"M1.80005 1.59998L8.20005 7.99998L1.80005 14.4\",stroke:\"black\",\"stroke-opacity\":\"0.83\",\"stroke-width\":\"2\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1)),AI=[TI],DI={class:\"disk-item_icon\"},MI=[\"src\"],LI={class:\"disk-item_f\"},II={class:\"disk-item_venderModel\"},PI={class:\"disk-item_used\"},RI={key:0,class:\"tag\",style:{color:\"#3a9a50\",background:\"rgba(97, 216, 4, 0.2)\"}},EI=yl(()=>N(\"div\",{class:\"auto\"},null,-1)),kI={class:\"disk-item-r\"},OI={class:\"disk-children\"},BI=[\"onClick\"],NI={key:0,width:\"16\",height:\"16\",viewBox:\"0 0 16 16\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},VI=yl(()=>N(\"path\",{d:\"M14.4 4.80005L8.00002 11.2L1.60002 4.80005\",stroke:\"black\",\"stroke-opacity\":\"0.83\",\"stroke-width\":\"2\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1)),zI=[VI],FI={key:1,width:\"10\",height:\"16\",viewBox:\"0 0 10 16\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},GI=yl(()=>N(\"path\",{d:\"M1.80005 1.59998L8.20005 7.99998L1.80005 14.4\",stroke:\"black\",\"stroke-opacity\":\"0.83\",\"stroke-width\":\"2\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1)),HI=[GI],WI={class:\"disk-item_icon\"},$I=[\"src\"],UI={class:\"disk-children-item_f\"},YI=[\"onClick\"],ZI=fn({__name:\"disk-item\",props:{currPath:{type:Object,required:!0},disk:{type:Object,required:!0},onRefresh:{type:Function,required:!0},onDisk:{type:Function,required:!0}},setup(r){const e=r,t=(i,o)=>{o===\"disk\"&&i.disk&&(i.disk.openChildren=!i.disk.openChildren),o===\"mount\"&&i.mount&&(i.mount.openChildren=!i.mount.openChildren),e.onDisk({disk:i.disk,mount:i.mount,folder:null},o)},a=i=>{nI({step:\"format\",data:{path:i.path},callback:()=>{e.onRefresh()}})},n=()=>{};return(i,o)=>(_t(),It(\"ul\",SI,[N(\"li\",{class:\"disk-info\",onClick:o[0]||(o[0]=s=>t({disk:r.disk,mount:null},\"disk\")),style:wd(r.disk.path&&r.currPath.includes(r.disk.path)?\"background-color:#ecf5ff;\":\"\")},[r.disk.openChildren?(_t(),It(\"svg\",xI,bI)):(_t(),It(\"svg\",CI,AI)),N(\"div\",DI,[N(\"img\",{src:df(oI)},null,8,MI)]),N(\"div\",LI,[N(\"div\",null,[N(\"div\",II,Xt(r.disk.venderModel),1),N(\"div\",PI,Xt(r.disk.used)+\"/\"+Xt(r.disk.size),1)]),r.disk.isSystemRoot?(_t(),It(\"span\",RI,\"Root\\u76D8\")):Ee(\"\",!0)]),EI,N(\"div\",kI,Xt(r.disk.path),1)],4),Uu(N(\"div\",OI,[(_t(!0),It(lr,null,pa(r.disk.childrens,s=>(_t(),It(\"div\",null,[N(\"li\",{class:\"disk-children-item\",onClick:l=>t({disk:r.disk,mount:s},\"mount\"),style:wd(s.mountPoint&&r.currPath.includes(s.mountPoint)?\"background-color:#ecf5ff;\":\"\")},[s.openChildren?(_t(),It(\"svg\",NI,zI)):(_t(),It(\"svg\",FI,HI)),N(\"div\",WI,[N(\"img\",{src:df(sI)},null,8,$I)]),N(\"div\",UI,[N(\"div\",null,[N(\"span\",null,Xt(s.name)+\"\\u3010\"+Xt(s.filesystem)+\"\\u3011\"+Xt(s.mountPoint),1),N(\"div\",null,Xt(r.disk.used)+\"/\"+Xt(r.disk.size),1)]),s.filesystem!==\"No FileSystem\"&&!s.mountPoint?(_t(),It(\"span\",{key:0,onClick:n,class:\"tag\",style:{color:\"#4b6fed\",background:\"#e3eaff\"}},\" \\u9700\\u8981\\u6302\\u8F7D \")):Ee(\"\",!0),s.filesystem===\"No FileSystem\"&&!s.mountPoint?(_t(),It(\"span\",{key:1,onClick:()=>a(s),class:\"tag\",style:{color:\"#df493f\",background:\"#ffe3e2\"}},\" \\u9700\\u8981\\u683C\\u5F0F\\u5316 \",8,YI)):Ee(\"\",!0)])],12,BI),s.openChildren?(_t(),zr(_I,{key:0,currPath:r.currPath,context:{disk:r.disk,mount:s},folders:s.childrens?s.childrens:[],\"on-disk\":r.onDisk},null,8,[\"currPath\",\"context\",\"folders\",\"on-disk\"])):Ee(\"\",!0)]))),256))],512),[[aI,r.disk.openChildren]])]))}});var Pm=hn(ZI,[[\"__scopeId\",\"data-v-2ec06138\"]]);const XI={class:\"content\"},qI={class:\"header\"},KI={class:\"disk-list\"},JI=fn({__name:\"index\",props:{close:Function,onOk:Function},setup(r){const e=r,t=()=>{e.close&&e.close()},a=()=>{e.onOk&&e.onOk(o.value),e.close&&e.close()},n=Gs({disks:[],raids:[]}),i=Gs([]),o=Ob(\"\"),s=(u,f)=>ra(this,null,function*(){var c,d,p,g,y,m,_,S,w,x,b,C,T;const h={path:\"\",order:\"date\",orderBy:\"asc\",filter:\"dir\"};console.log(\"locationType\",f),f===\"mount\"&&((c=u.mount)==null?void 0:c.mountPoint)&&(h.path=\"/local/root\"+((d=u.mount)==null?void 0:d.mountPoint),o.value=(p=u.mount)==null?void 0:p.mountPoint,i[2]=\"\"),f===\"folder\"&&((g=u.folder)==null?void 0:g.rootPath)&&(h.path=\"/local\"+u.folder.rootPath,o.value=u.folder.rootPath),(y=u.disk)!=null&&y.path&&(i[0]=(m=u.disk)==null?void 0:m.path),(_=u.mount)!=null&&_.mountPoint&&(i[1]=(S=u.mount)==null?void 0:S.mountPoint),(w=u.folder)!=null&&w.rootPath&&(i[2]=(x=u.folder)==null?void 0:x.rootPath);const v=yield Fr.Linkease.File.List.POST(h);(b=v.data.result)!=null&&b.entries&&(f===\"mount\"&&u.mount&&(u.mount.childrens=(C=v.data.result)==null?void 0:C.entries),f===\"folder\"&&u.folder&&(u.folder.childrens=(T=v.data.result)==null?void 0:T.entries))}),l=()=>ra(this,null,function*(){const u=ar.Loading(\"\\u52A0\\u8F7D\\u4E2D...\"),f=yield Promise.all([Fr.Nas.Disk.Status.GET(),Fr.Raid.List.GET()]);u.Close();try{if(f[0]){const h=f[0];h!=null&&h.data.result&&(n.disks=(h==null?void 0:h.data.result.disks)||[])}if(f[1]){const h=f[1];h.data.result&&(n.raids=h.data.result.disks||[])}}catch(h){ar.Warning(h)}});return l(),(u,f)=>(_t(),zr(vg,{onHandleClose:t,title:\"\\u9009\\u62E9\\u4F4D\\u7F6E\",width:\"572px\"},{default:hg(()=>[N(\"div\",XI,[N(\"div\",qI,[N(\"div\",null,[N(\"span\",null,Xt(`\\u76EE\\u7684\\u5730\\uFF1A${o.value?o.value:\"\\u8BF7\\u9009\\u62E9\"}`),1)]),N(\"div\",{onClick:l},\"\\u5237\\u65B0\\u76EE\\u5F55\")]),N(\"div\",KI,[(_t(!0),It(lr,null,pa(n.disks,h=>(_t(),zr(Pm,{currPath:i,disk:h,onDisk:s,onRefresh:l},null,8,[\"currPath\",\"disk\"]))),256)),(_t(!0),It(lr,null,pa(n.raids,h=>(_t(),zr(Pm,{currPath:i,disk:h,onDisk:s,onRefresh:l},null,8,[\"currPath\",\"disk\"]))),256))])]),N(\"div\",{class:\"dialog-footer\"},[N(\"div\",null,[N(\"button\",{onClick:t},\"\\u53D6\\u6D88\"),N(\"button\",{onClick:a},\"\\u786E\\u5B9A\")])])]),_:1}))}});var QI=hn(JI,[[\"__scopeId\",\"data-v-0763aef7\"]]);class jI extends cg{Open(e){this.openWindow(QI,e)}}const tP=new jI;const dg=r=>(Si(\"data-v-e79621ae\"),r=r(),xi(),r),eP={class:\"content\"},rP={class:\"form-container1\"},aP=dg(()=>N(\"div\",{class:\"label-name\"},[N(\"span\",null,\"\\u9009\\u62E9\\u4F4D\\u7F6E\")],-1)),nP={class:\"label-value\"},iP=[\"value\"],oP=dg(()=>N(\"div\",{class:\"label-name\"},[N(\"span\",null,\"\\u5171\\u4EAB\\u540D\\u79F0 \")],-1)),sP={class:\"label-value\"},lP=dg(()=>N(\"div\",{class:\"label-name\"},[N(\"span\",null,\"\\u5171\\u4EAB\\u65B9\\u5F0F\")],-1)),uP={class:\"label-value\"},fP={class:\"label-flex\"},hP={class:\"label-radio\"},vP={class:\"label-radio\"},cP={class:\"dialog-footer\"},dP=fn({__name:\"main-form\",props:{context:{type:Object,required:!0}},emits:[\"onNext\"],setup(r,{emit:e}){const t=r;console.log(\"form\",t.context);const a=()=>{if(!t.context.path)return ar.Message(\"\\u8BF7\\u9009\\u62E9\\u4F4D\\u7F6E\");if(!t.context.name)return ar.Message(\"\\u8BF7\\u8F93\\u5165\\u5171\\u4EAB\\u540D\\u79F0\");if(!t.context.samba&&!t.context.webdav)return ar.Message(\"\\u8BF7\\u9009\\u62E9\\u5171\\u4EAB\\u65B9\\u5F0F\");e(\"onNext\")};return(n,i)=>(_t(),It(\"div\",eP,[N(\"form\",rP,[N(\"div\",null,[aP,N(\"div\",nP,[N(\"input\",{value:t.context.path,type:\"text\"},null,8,iP),N(\"span\",{class:\"button\",onClick:i[0]||(i[0]=o=>n.$emit(\"openDisk\",!0))},\"\\u6D4F\\u89C8\")])]),N(\"div\",null,[oP,N(\"div\",sP,[Uu(N(\"input\",{\"onUpdate:modelValue\":i[1]||(i[1]=o=>t.context.name=o),type:\"text\"},null,512),[[iI,t.context.name,void 0,{trim:!0}]])])]),N(\"div\",null,[lP,N(\"div\",uP,[N(\"div\",fP,[N(\"label\",hP,[Uu(N(\"input\",{type:\"checkbox\",\"onUpdate:modelValue\":i[2]||(i[2]=o=>t.context.samba=o)},null,512),[[Im,t.context.samba]]),bd(\"Samba \")]),N(\"label\",vP,[Uu(N(\"input\",{type:\"checkbox\",\"onUpdate:modelValue\":i[3]||(i[3]=o=>t.context.webdav=o)},null,512),[[Im,t.context.webdav]]),bd(\"WebDav \")])])])])]),N(\"div\",cP,[N(\"div\",null,[N(\"button\",{onClick:i[4]||(i[4]=o=>n.$emit(\"onCancel\",!1))},\"\\u53D6\\u6D88\"),N(\"button\",{onClick:a},\"\\u4E0B\\u4E00\\u6B65\")])])]))}});var pP=hn(dP,[[\"__scopeId\",\"data-v-e79621ae\"]]);const ml=r=>(Si(\"data-v-6363551b\"),r=r(),xi(),r),gP=ml(()=>N(\"span\",{class:\"title\"},\"\\u786E\\u8BA4\\u4FE1\\u606F\",-1)),yP={class:\"detail\"},mP=ml(()=>N(\"span\",null,\"\\u5171\\u4EAB\\u540D\\u79F0:\",-1)),_P=ml(()=>N(\"span\",null,\"\\u5171\\u4EAB\\u4F4D\\u7F6E:\",-1)),SP=ml(()=>N(\"span\",null,\"\\u5171\\u4EAB\\u65B9\\u5F0F:\",-1)),xP=ml(()=>N(\"span\",null,\"\\u5171\\u4EAB\\u7528\\u6237:\",-1)),wP={class:\"dialog-footer\"},bP=fn({__name:\"form-confirm\",props:{context:{type:Object,required:!0},mode:{type:String,required:!0}},setup(r){const e=r;return(t,a)=>(_t(),It(lr,null,[N(\"div\",null,[N(\"div\",null,[gP,N(\"div\",yP,[N(\"div\",null,[mP,N(\"span\",null,Xt(r.context.name),1)]),N(\"div\",null,[_P,N(\"span\",null,Xt(r.context.path),1)]),N(\"div\",null,[SP,N(\"span\",null,Xt(`${r.context.samba?\"Samba\":\"\"} ${r.context.webdav?\"WebDav\":\"\"}`),1)]),N(\"div\",null,[xP,(_t(!0),It(lr,null,pa(r.context.users,(n,i)=>(_t(),It(\"span\",{key:i},Xt(`${n.userName}(${n.ro?\"\\u53EA\\u8BFB\":\"\\u8BFB\\u5199\"})${r.context.users.length-1===i?\"\":\"\\u3001\"}`),1))),128))])])])]),N(\"div\",wP,[N(\"div\",null,[N(\"button\",{onClick:a[0]||(a[0]=n=>t.$emit(\"onCancel\"))},\"\\u4E0A\\u4E00\\u6B65\"),N(\"button\",{onClick:a[1]||(a[1]=n=>t.$emit(\"onOk\"))},Xt(e.mode===\"edit\"?\"\\u7F16\\u8F91\":\"\\u521B\\u5EFA\"),1)])])],64))}});var CP=hn(bP,[[\"__scopeId\",\"data-v-6363551b\"]]);const TP=r=>(Si(\"data-v-26847234\"),r=r(),xi(),r),AP={class:\"ul-container\"},DP={class:\"ul-container_body\"},MP={class:\"page-table\"},LP=TP(()=>N(\"thead\",null,[N(\"tr\",null,[N(\"th\",null,\"\\u7528\\u6237\"),N(\"th\",null,\"\\u8BFB\\u5199\"),N(\"th\",null,\"\\u53EA\\u8BFB\"),N(\"th\",null,\"\\u65E0\\u6743\\u9650\")])],-1)),IP=[\"checked\",\"onChange\"],PP=[\"checked\",\"onChange\"],RP=[\"checked\",\"onChange\"],EP={class:\"dialog-footer\"},kP=fn({__name:\"user-table\",props:{context:{type:Object,required:!0}},setup(r){const e=r,t=Gs({users:e.context.users}),a=()=>ra(this,null,function*(){try{const o=yield Fr.Share.User.GET();if(o!=null&&o.data){const{result:s}=o.data;s&&(t.users=s.users.map(l=>Lm(Mm({},l),{ro:!1,rw:!0})))}}catch(o){console.log(o)}}),n=(o,s)=>{s?s===\"ro\"?(o.ro=!0,o.rw=!1):(o.ro=!1,o.rw=!0):(o.rw=!1,o.ro=!1)};e.context.users.length||a();function i(){Cd({callback:o=>{t.users=[...t.users,o]}})}return(o,s)=>(_t(),It(lr,null,[N(\"button\",{class:\"add-user\",onClick:i},\"\\u65B0\\u589E\"),N(\"ul\",AP,[N(\"div\",DP,[N(\"table\",MP,[LP,N(\"tbody\",null,[(_t(!0),It(lr,null,pa(t.users,l=>(_t(),It(\"tr\",null,[N(\"th\",null,Xt(l.userName),1),N(\"th\",null,[N(\"input\",{type:\"radio\",checked:l.rw,onChange:u=>n(l,\"rw\")},null,40,IP)]),N(\"th\",null,[N(\"input\",{type:\"radio\",checked:l.ro,onChange:u=>n(l,\"ro\")},null,40,PP)]),N(\"th\",null,[N(\"input\",{type:\"radio\",checked:!l.ro&&!l.rw,onChange:u=>n(l)},null,40,RP)])]))),256))])])])]),N(\"div\",EP,[N(\"div\",null,[N(\"button\",{onClick:s[0]||(s[0]=l=>o.$emit(\"onCancel\",!1))},\"\\u4E0A\\u4E00\\u6B65\"),N(\"button\",{onClick:s[1]||(s[1]=l=>o.$emit(\"onOk\",t.users))},\"\\u4E0B\\u4E00\\u6B65\")])])],64))}});var OP=hn(kP,[[\"__scopeId\",\"data-v-26847234\"]]);const hh=r=>(Si(\"data-v-9c961df4\"),r=r(),xi(),r),BP={key:0},NP={key:0,class:\"no-data\"},VP=hh(()=>N(\"span\",null,\"\\u6682\\u65F6\\u8FD8\\u6CA1\\u6709\\u4EFB\\u4F55\\u5171\\u4EAB\\u6587\\u4EF6\",-1)),zP={key:1,class:\"list\"},FP=hh(()=>N(\"div\",{class:\"img\"},[N(\"svg\",{width:\"71\",height:\"63\",viewBox:\"0 0 71 63\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},[N(\"rect\",{width:\"71\",height:\"63\",fill:\"url(#pattern0)\"}),N(\"defs\",null,[N(\"pattern\",{id:\"pattern0\",patternContentUnits:\"objectBoundingBox\",width:\"1\",height:\"1\"},[N(\"use\",{\"xlink:href\":\"#image0_57_1478\",transform:\"matrix(0.00892857 0 0 0.0100624 0 -0.00311791)\"})]),N(\"image\",{id:\"image0_57_1478\",width:\"112\",height:\"100\",\"xlink:href\":\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHAAAABkCAYAAABep7TGAAAMP2lDQ1BJQ0MgUHJvZmlsZQAASImVVwdYU8kWnltSIbQAAlJCb4JIDSAlhBZAehFshCRAKDEGgogdXVRw7WIBG7oqotgBsSN2FsXeF0RUlHWxYEPlTQrouq98b75v7vz3nzP/OXPuzL13AFA/xRWLc1ANAHJF+ZLYkADG2OQUBukZIAMToAJwgHF5eWJWdHQEgGWw/Xt5fwsgsva6g0zrn/3/tWjyBXk8AJBoiNP4ebxciA8BgFfyxJJ8AIgy3nxqvliGYQXaEhggxAtlOEOBK2U4TYH3yW3iY9kQNwNAVuVyJRkAqF2FPKOAlwE11HohdhLxhSIA1BkQ++bmTuZDnAqxDbQRQyzTZ6b9oJPxN820IU0uN2MIK+YiL+RAYZ44hzvt/0zH/y65OdJBH1awqmZKQmNlc4Z5u5M9OVyGVSHuEaVFRkGsBfFHIV9uDzFKzZSGJijsUUNeHhvmDOhC7MTnBoZDbAhxsCgnMkLJp6ULgzkQwxWCFgrzOfEQ60G8UJAXFKe02SyZHKv0hdalS9gsJX+BK5H7lfl6JM1OYCn132QKOEp9TK0oMz4JYirEFgXCxEiI1SB2zMuOC1fajC7KZEcO2kiksbL4LSCOFYhCAhT6WEG6JDhWaV+amzc4X2xzppATqcQH8jPjQxX5wZp5XHn8cC7YVYGIlTCoI8gbGzE4F74gMEgxd+y5QJQQp9T5KM4PiFWMxaninGilPW4myAmR8WYQu+YVxCnH4on5cEEq9PF0cX50vCJOvCiLGxatiAdfBiIAGwQCBpDCmgYmgywgbO2p74F3ip5gwAUSkAEEwEHJDI5IkveI4DUOFIE/IRKAvKFxAfJeASiA/NchVnF1AOny3gL5iGzwFOJcEA5y4L1UPko05C0RPIGM8B/eubDyYLw5sMr6/z0/yH5nWJCJUDLSQY8M9UFLYhAxkBhKDCba4ga4L+6NR8CrP6zOOBP3HJzHd3vCU0Ib4THhJqGdcHeSsFjyU5RjQDvUD1bmIu3HXOBWUNMND8B9oDpUxnVxA+CAu0I/LNwPenaDLFsZtywrjJ+0/zaDH56G0o7iREEpwyj+FJufR6rZqbkNqchy/WN+FLGmDeWbPdTzs3/2D9nnwzb8Z0tsIXYQO4+dxi5ix7B6wMBOYg1YC3ZchodW1xP56hr0FiuPJxvqCP/hb/DJyjKZ51Tj1O30RdGXLyiUvaMBe7J4mkSYkZnPYMEvgoDBEfEcRzCcnZxdAJB9XxSvr7cx8u8GotvynZv3BwA+JwcGBo5+58JOArDfA27/I985Gyb8dKgAcOEITyopUHC47EKAbwl1uNP0gTEwBzZwPs7AHXgDfxAEwkAUiAfJYCKMPhOucwmYCmaAuaAElIFlYDVYDzaBrWAn2AMOgHpwDJwG58BlcBXcBPfh6ukCL0EveA/6EQQhITSEjugjJoglYo84I0zEFwlCIpBYJBlJRTIQESJFZiDzkDJkBbIe2YJUI/uRI8hp5CLShtxFOpBu5A3yGcVQVVQbNUKt0JEoE2Wh4Wg8OgHNQKegReh8dAm6Fq1Cd6N16Gn0MnoTbUdfon0YwFQwXcwUc8CYGBuLwlKwdEyCzcJKsXKsCqvFGuFzvo61Yz3YJ5yI03EG7gBXcCiegPPwKfgsfDG+Ht+J1+HN+HW8A+/FvxFoBEOCPcGLwCGMJWQQphJKCOWE7YTDhLNwL3UR3hOJRF2iNdED7sVkYhZxOnExcQNxL/EUsY3YSewjkUj6JHuSDymKxCXlk0pI60i7SSdJ10hdpI9kFbIJ2ZkcTE4hi8jF5HLyLvIJ8jXyM3I/RYNiSfGiRFH4lGmUpZRtlEbKFUoXpZ+qSbWm+lDjqVnUudS11FrqWeoD6lsVFRUzFU+VGBWhyhyVtSr7VC6odKh8UtVStVNlq45XlaouUd2hekr1rupbGo1mRfOnpdDyaUto1bQztEe0j2p0NUc1jhpfbbZahVqd2jW1V+oUdUt1lvpE9SL1cvWD6lfUezQoGlYabA2uxiyNCo0jGrc1+jTpmqM0ozRzNRdr7tK8qPlci6RlpRWkxdear7VV64xWJx2jm9PZdB59Hn0b/Sy9S5uoba3N0c7SLtPeo92q3aujpeOqk6hTqFOhc1ynXRfTtdLl6OboLtU9oHtL9/Mwo2GsYYJhi4bVDrs27IPecD1/PYFeqd5evZt6n/UZ+kH62frL9ev1HxrgBnYGMQZTDTYanDXoGa493Hs4b3jp8APD7xmihnaGsYbTDbcathj2GRkbhRiJjdYZnTHqMdY19jfOMl5lfMK424Ru4msiNFllctLkBUOHwWLkMNYymhm9poamoaZS0y2mrab9ZtZmCWbFZnvNHppTzZnm6earzJvMey1MLMZYzLCosbhnSbFkWmZarrE8b/nBytoqyWqBVb3Vc2s9a451kXWN9QMbmo2fzRSbKpsbtkRbpm227Qbbq3aonZtdpl2F3RV71N7dXmi/wb5tBGGE5wjRiKoRtx1UHVgOBQ41Dh2Ouo4RjsWO9Y6vRlqMTBm5fOT5kd+c3JxynLY53R+lNSpsVPGoxlFvnO2cec4VzjdcaC7BLrNdGlxeu9q7Clw3ut5xo7uNcVvg1uT21d3DXeJe697tYeGR6lHpcZupzYxmLmZe8CR4BnjO9jzm+cnL3Svf64DXX94O3tneu7yfj7YeLRi9bXSnj5kP12eLT7svwzfVd7Nvu5+pH9evyu+xv7k/33+7/zOWLSuLtZv1KsApQBJwOOAD24s9k30qEAsMCSwNbA3SCkoIWh/0KNgsOCO4Jrg3xC1kesipUEJoeOjy0NscIw6PU83pDfMImxnWHK4aHhe+PvxxhF2EJKJxDDombMzKMQ8iLSNFkfVRIIoTtTLqYbR19JToozHEmOiYipinsaNiZ8Sej6PHTYrbFfc+PiB+afz9BJsEaUJTonri+MTqxA9JgUkrktrHjhw7c+zlZINkYXJDCiklMWV7St+4oHGrx3WNdxtfMv7WBOsJhRMuTjSYmDPx+CT1SdxJB1MJqUmpu1K/cKO4Vdy+NE5aZVovj81bw3vJ9+ev4ncLfAQrBM/SfdJXpD/P8MlYmdGd6ZdZntkjZAvXC19nhWZtyvqQHZW9I3sgJylnby45NzX3iEhLlC1qnmw8uXBym9heXCJun+I1ZfWUXkm4ZHsekjchryFfG/7It0htpL9IOwp8CyoKPk5NnHqwULNQVNgyzW7aomnPioKLfpuOT+dNb5phOmPujI6ZrJlbZiGz0mY1zTafPX9215yQOTvnUudmz/292Kl4RfG7eUnzGucbzZ8zv/OXkF9qStRKJCW3F3gv2LQQXyhc2LrIZdG6Rd9K+aWXypzKysu+LOYtvvTrqF/X/jqwJH1J61L3pRuXEZeJlt1a7rd85wrNFUUrOleOWVm3irGqdNW71ZNWXyx3Ld+0hrpGuqZ9bcTahnUW65at+7I+c/3NioCKvZWGlYsqP2zgb7i20X9j7SajTWWbPm8Wbr6zJWRLXZVVVflW4taCrU+3JW47/xvzt+rtBtvLtn/dIdrRvjN2Z3O1R3X1LsNdS2vQGmlN9+7xu6/uCdzTUOtQu2Wv7t6yfWCfdN+L/an7bx0IP9B0kHmw9pDlocrD9MOldUjdtLre+sz69obkhrYjYUeaGr0bDx91PLrjmOmxiuM6x5eeoJ6Yf2LgZNHJvlPiUz2nM053Nk1qun9m7JkbzTHNrWfDz144F3zuzHnW+ZMXfC4cu+h18cgl5qX6y+6X61rcWg7/7vb74Vb31rorHlcarnpebWwb3Xbimt+109cDr5+7wblx+WbkzbZbCbfu3B5/u/0O/87zuzl3X98ruNd/f84DwoPShxoPyx8ZPqr6w/aPve3u7cc7AjtaHsc9vt/J63z5JO/Jl675T2lPy5+ZPKt+7vz8WHdw99UX4150vRS/7O8p+VPzz8pXNq8O/eX/V0vv2N6u15LXA28Wv9V/u+Od67umvui+R+9z3/d/KP2o/3HnJ+an85+TPj/rn/qF9GXtV9uvjd/Cvz0YyB0YEHMlXPmvAAYrmp4OwJsdANCSAaDD8xl1nOL8Jy+I4swqR+A/YcUZUV7cAaiF/+8xPfDv5jYA+7bB4xfUVx8PQDQNgHhPgLq4DNXBs5r8XCkrRHgO2Bz5NS03Dfybojhz/hD3zy2QqbqCn9t/Ae5cfEE5Hk+sAAAAbGVYSWZNTQAqAAAACAAEARoABQAAAAEAAAA+ARsABQAAAAEAAABGASgAAwAAAAEAAgAAh2kABAAAAAEAAABOAAAAAAAAAJAAAAABAAAAkAAAAAEAAqACAAQAAAABAAAAcKADAAQAAAABAAAAZAAAAAAhyIn1AAAACXBIWXMAABYlAAAWJQFJUiTwAAADjUlEQVR4Ae2czWoTURTHz51JQmxJrSDFnYgi+ARufQafwGfwZQR34kZB8AncCS50I7gptVZE/OgiVPuVzMcd762Q6MKY0PxPcm7+A4G0Mznnf3+/nExmkXFN2ISbWQKZ2eQMfkaAAo2/ESiQAo0TMB6fE0iBxgkYj88JpEDjBIzH5wRSoHECxuNzAinQOAHj8TmBFGicgPH4nEAKNE7AeHxOoHGBLWR+f/JVys/Ppfz+Upr6FNlqVDvrbErn6l1pbd0R1+6N/p/qE+gEVv1XqvKiJF8cyHD3sVT91yL1MFVvo3VBBTblodrkjVYUnjS+lGLvqdSHO/GvP3cl9xwqcJG0/GBfik/PJL6JUt6SFRilVf23Un57ET5KB8k6TFpgtFbsPZHq53Y4OVZJSkxeYOMLKXYeih/uB4HpnQ+TFxjHrj75IoPtB+KPPgaHdfxXMhv0OnCZKNUH7+T4zX1xzk2I9fc+52Z9f/9+fda7Jp3r9yTfuDWh13x2zZpwPl0XWCX+kuDfDx/2jR8+nDdne5Th+FKqH+9l+OGRyipXTqAKVfHiT+M5F79RIJ4xtAMFQvHii1MgnjG0AwVC8eKLYy8jzr6yZ//56o5f5EI6TLxcmV8iqEDX6kje25S8uyYy8zXV/BapXampCvF1rtIWKjDrrK2cvGjNtdph3RsqArHnwDh1KzR5Y2MunDZ0JhArcLwiPgMRoEAQWK2yFKhFGtSHAkFgtcpSoBZpUB8KBIHVKkuBWqRBfSgQBFarLAVqkQb1oUAQWK2yFKhFGtSHAkFgtcpSoBZpUB8KBIHVKkuBWqRBfSgQBFarLAVqkQb1oUAQWK2yFKhFGtSHAkFgtcpSoBZpUB8KBIHVKkuBWqRBfSgQBFarLAVqkQb1oUAQWK2yFKhFGtSHAkFgtcpSoBZpUB8KBIHVKkuBWqRBfSgQBFarLAVqkQb1oUAQWK2yYIHxJ/g6PzXWAjZdn3DTO9eZ7tBzHgUVmHW3xHWvhIirJdG11iVbv3FONdO9HHqXCnfhpuSXa2mOd8N9OovpEqVwVPuS5Bdvq6zEhVsvpncbWxV0y9EE+hG6HEtMOwUFGvdLgRRonIDx+JxACjROwHh8TiAFGidgPD4nkAKNEzAenxNIgcYJGI/PCaRA4wSMx+cEUqBxAsbjcwIp0DgB4/E5gRRonIDx+JxACjROwHh8TiAFGidgPD4n0LjAX3BSxpPyLY/MAAAAAElFTkSuQmCC\"})])])],-1)),GP={class:\"name\"},HP={class:\"action\"},WP=[\"onClick\"],$P=hh(()=>N(\"svg\",{width:\"34\",height:\"34\",viewBox:\"0 0 34 34\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},[N(\"path\",{d:\"M18.9763 4.54325C19.1776 4.35138 19.4462 4.24614 19.7243 4.25011C20.0025 4.25408 20.2679 4.36696 20.4637 4.5645L26.2544 10.4051C26.3566 10.5081 26.4367 10.6309 26.4897 10.7661C26.5426 10.9012 26.5673 11.0458 26.5622 11.1908C26.5571 11.3359 26.5224 11.4783 26.4601 11.6095C26.3979 11.7406 26.3094 11.8575 26.2002 11.9531L12.2474 24.174C12.048 24.349 11.7902 24.443 11.5249 24.4375L6.35269 24.327C6.07478 24.3212 5.81023 24.2066 5.61577 24.008C5.42131 23.8094 5.31244 23.5425 5.3125 23.2645V18.0115C5.31247 17.8677 5.34165 17.7253 5.39827 17.5931C5.45489 17.4609 5.53776 17.3415 5.64187 17.2423L18.9763 4.54325ZM20.3862 21.6261L28.3496 21.7812C28.4892 21.784 28.6268 21.8141 28.7547 21.8701C28.8825 21.926 28.9981 22.0065 29.0949 22.1071C29.1916 22.2077 29.2676 22.3263 29.3185 22.4563C29.3693 22.5862 29.3941 22.7249 29.3914 22.8645C29.3887 23.004 29.3585 23.1416 29.3026 23.2695C29.2467 23.3974 29.1661 23.513 29.0656 23.6097C28.965 23.7064 28.8463 23.7824 28.7164 23.8333C28.5864 23.8842 28.4477 23.909 28.3082 23.9062L20.3448 23.7511C20.2052 23.7483 20.0676 23.7181 19.9398 23.6621C19.8119 23.6061 19.6964 23.5255 19.5997 23.4249C19.503 23.3243 19.4271 23.2056 19.3762 23.0756C19.3254 22.9456 19.3007 22.8069 19.3035 22.6674C19.3063 22.5278 19.3365 22.3902 19.3925 22.2624C19.4485 22.1346 19.5291 22.019 19.6297 21.9223C19.7304 21.8256 19.8491 21.7497 19.979 21.6989C20.109 21.6481 20.2477 21.6233 20.3872 21.6261H20.3862ZM19.6881 6.8L7.4375 18.4662V22.2243L11.1562 22.304L23.9498 11.0989L19.6881 6.8ZM28.2976 26.9386C28.5794 26.9365 28.8504 27.0464 29.0512 27.2442C29.2519 27.442 29.3659 27.7114 29.368 27.9932C29.3701 28.275 29.2602 28.546 29.0625 28.7468C28.8647 28.9475 28.5953 29.0615 28.3135 29.0636L7.446 29.2188C7.16421 29.2209 6.89312 29.1109 6.69237 28.9132C6.49161 28.7154 6.37764 28.446 6.37553 28.1642C6.37342 27.8824 6.48333 27.6113 6.6811 27.4106C6.87886 27.2098 7.14827 27.0959 7.43006 27.0938L28.2976 26.9386Z\",fill:\"black\",\"fill-opacity\":\"0.8\"})],-1)),UP=[$P],YP=[\"onClick\"],ZP=hh(()=>N(\"svg\",{width:\"34\",height:\"34\",viewBox:\"0 0 34 34\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},[N(\"path\",{d:\"M12.7331 30.5258C11.8785 30.5264 11.0527 30.2169 10.4091 29.6546C9.76556 29.0923 9.34796 28.3155 9.2339 27.4686L6.27084 10.719C6.24075 10.5628 6.24576 10.4019 6.28552 10.248C6.32529 10.094 6.3988 9.95078 6.50075 9.82873C6.60269 9.70667 6.7305 9.60882 6.87493 9.54227C7.01936 9.47571 7.17679 9.44212 7.3358 9.44392H26.9326C27.0917 9.44369 27.2489 9.47864 27.3929 9.54627C27.5369 9.61391 27.6642 9.71254 27.7657 9.83513C27.8688 9.9554 27.9437 10.0971 27.9851 10.25C28.0264 10.4029 28.0331 10.5631 28.0048 10.719L25.1069 27.512C24.9898 28.3532 24.5727 29.1237 23.9323 29.6815C23.2919 30.2394 22.4715 30.5469 21.6222 30.5476L12.7331 30.5258ZM8.63259 11.6101L11.3783 27.1208C11.4153 27.4559 11.5734 27.766 11.8229 27.9927C12.0723 28.2195 12.396 28.3474 12.7331 28.3524H21.5788C21.9155 28.3488 22.2391 28.2212 22.4877 27.994C22.7363 27.7668 22.8924 27.4559 22.9263 27.1208L25.672 11.5956L8.63259 11.6101Z\",fill:\"black\",\"fill-opacity\":\"0.8\"}),N(\"path\",{d:\"M14.1239 26.2153C13.8356 26.2153 13.5592 26.1008 13.3554 25.897C13.1517 25.6932 13.0372 25.4168 13.0372 25.1286C13.0372 24.8404 13.1517 24.564 13.3554 24.3602C13.5592 24.1564 13.8356 24.0419 14.1239 24.0419H19.9196C20.2078 24.0419 20.4842 24.1564 20.688 24.3602C20.8918 24.564 21.0063 24.8404 21.0063 25.1286C21.0063 25.4168 20.8918 25.6932 20.688 25.897C20.4842 26.1008 20.2078 26.2153 19.9196 26.2153H14.1239ZM6.70535 8.12542C6.41714 8.12542 6.14073 8.01093 5.93694 7.80714C5.73314 7.60334 5.61865 7.32694 5.61865 7.03873C5.61865 6.75052 5.73314 6.47411 5.93694 6.27032C6.14073 6.06652 6.41714 5.95203 6.70535 5.95203H27.2656C27.5538 5.95203 27.8303 6.06652 28.034 6.27032C28.2378 6.47411 28.3523 6.75052 28.3523 7.03873C28.3523 7.32694 28.2378 7.60334 28.034 7.80714C27.8303 8.01093 27.5538 8.12542 27.2656 8.12542H6.6981H6.70535ZM15.7539 5.64776C15.4657 5.64776 15.1893 5.53327 14.9855 5.32947C14.7817 5.12568 14.6672 4.84927 14.6672 4.56106C14.6672 4.27285 14.7817 3.99645 14.9855 3.79265C15.1893 3.58886 15.4657 3.47437 15.7539 3.47437H17.652C17.9402 3.47437 18.2166 3.58886 18.4204 3.79265C18.6242 3.99645 18.7387 4.27285 18.7387 4.56106C18.7387 4.84927 18.6242 5.12568 18.4204 5.32947C18.2166 5.53327 17.9402 5.64776 17.652 5.64776H15.7539Z\",fill:\"black\",\"fill-opacity\":\"0.8\"})],-1)),XP=[ZP],qP=fn({__name:\"index\",props:{close:Function},setup(r){const e=r,t=Ob(!1),n=Gs({title:\"\\u5171\\u4EAB\\u6587\\u4EF6\",services:[],step:0,mode:\"edit\",users:[],shareServiceCreateRequestParams:{name:\"\",path:\"\",webdav:!1,samba:!0,users:[]}}),i=()=>{e.close&&e.close()},o=()=>{n.step=1,n.mode=\"create\"},s=g=>ra(this,null,function*(){confirm(\"\\u786E\\u5B9A\\u5220\\u9664\\uFF1F\")&&(yield Fr.Share.Service.DELETE(g)).data.success===0&&d()}),l=()=>{tP.Open({onOk:g=>{console.log(\"arr1111\",g);const y=g.split(\"/\");n.shareServiceCreateRequestParams.path=g,console.log(\"arr\",y),n.shareServiceCreateRequestParams.name=y[y.length-1]}})},u=()=>{n.step=2,n.title=\"\\u786E\\u8BA4\\u7528\\u6237\\u6743\\u9650\"},f=g=>{if(n.shareServiceCreateRequestParams.users=g,n.shareServiceCreateRequestParams.users.length===0)return ar.Message(\"\\u8BF7\\u9009\\u62E9\\u5171\\u4EAB\\u7528\\u6237\");n.step=3,n.title=void 0},h=()=>ra(this,null,function*(){var m,_;const g=ar.Loading(\"\\u4FDD\\u5B58\\u4E2D...\");n.users.forEach(S=>{(S.ro||S.rw)&&n.shareServiceCreateRequestParams.users.push(S)});let y;n.mode===\"create\"?y=yield Fr.Share.Service.ADD(n.shareServiceCreateRequestParams):y=yield Fr.Share.Service.UPDATE(n.shareServiceCreateRequestParams),y.data.success===0?(g.Close(),ar.Message(\"\\u4FDD\\u5B58\\u6210\\u529F\"),c()):((m=y.data)!=null&&m.error&&ar.Message((_=y.data)==null?void 0:_.error),g.Close())}),v=()=>{n.step=n.step-1,n.title=\"\\u5171\\u4EAB\\u6587\\u4EF6\",n.step===0&&c()},c=()=>{n.step=0,n.title=\"\\u5171\\u4EAB\\u6587\\u4EF6\",n.shareServiceCreateRequestParams.path=\"\",n.shareServiceCreateRequestParams.name=\"\",n.shareServiceCreateRequestParams.samba=!1,n.shareServiceCreateRequestParams.webdav=!1,n.shareServiceCreateRequestParams.users=[],d()},d=()=>ra(this,null,function*(){try{t.value=!0;const g=ar.Loading(\"\\u52A0\\u8F7D\\u4E2D...\"),y=yield Fr.Share.Service.GET();if(y!=null&&y.data){const{result:m,error:_}=y.data;if(_)throw _;m&&(n.services=m.services)}g.Close(),t.value=!1}catch(g){console.log(g)}}),p=g=>{n.step=1,n.mode=\"edit\",console.log(\"serviceservice\",g),n.shareServiceCreateRequestParams.name=g.name,n.shareServiceCreateRequestParams.path=g.path,n.shareServiceCreateRequestParams.samba=g.samba,n.shareServiceCreateRequestParams.webdav=g.webdav,n.shareServiceCreateRequestParams.users=g.users};return d(),(g,y)=>(_t(),zr(vg,{onHandleClose:i,title:n.title,width:\"572px\"},{default:hg(()=>[n.step===0?(_t(),It(\"div\",BP,[n.services.length===0&&t.value===!1?(_t(),It(\"div\",NP,[N(\"div\",null,[VP,N(\"div\",{class:\"btns\"},[N(\"span\",{onClick:o},\"\\u7ACB\\u5373\\u6DFB\\u52A0\")])])])):Ee(\"\",!0),n.services.length!==0?(_t(),It(\"div\",zP,[N(\"button\",{onClick:o},\"\\u65B0\\u589E\"),(_t(!0),It(lr,null,pa(n.services,(m,_)=>(_t(),It(\"div\",{key:_},[N(\"div\",null,[FP,N(\"div\",GP,[N(\"span\",null,Xt(m.name),1),N(\"span\",null,Xt(m.path),1),N(\"div\",null,[N(\"span\",null,\"\\u5171\\u4EAB\\u65B9\\u5F0F: \"+Xt(`${m.samba?\"Samba\":\"\"} ${m.webdav?\"WebDav\":\"\"}`),1),N(\"span\",null,[bd(\"\\u5171\\u4EAB\\u7528\\u6237:\"),(_t(!0),It(lr,null,pa(m.users.filter(S=>S.ro||S.rw),(S,w)=>(_t(),It(\"span\",{key:w},Xt(`${S.userName}(${S.ro?\"\\u53EA\\u8BFB\":\"\\u8BFB\\u5199\"}) `),1))),128))])])]),N(\"div\",HP,[N(\"span\",{onClick:S=>p(m)},UP,8,WP),N(\"span\",{onClick:S=>s({name:m.name})},XP,8,YP)])])]))),128))])):Ee(\"\",!0)])):Ee(\"\",!0),n.step===1?(_t(),zr(pP,{key:1,onOnNext:u,onOnCancel:v,onOpenDisk:l,context:n.shareServiceCreateRequestParams},null,8,[\"context\"])):Ee(\"\",!0),n.step===2?(_t(),zr(OP,{key:2,context:n.shareServiceCreateRequestParams,onOnCancel:v,onOnOk:f},null,8,[\"context\"])):Ee(\"\",!0),n.step===3?(_t(),zr(CP,{key:3,mode:n.mode,context:n.shareServiceCreateRequestParams,onOnCancel:v,onOnOk:h},null,8,[\"mode\",\"context\"])):Ee(\"\",!0)]),_:1},8,[\"title\"]))}});var KP=hn(qP,[[\"__scopeId\",\"data-v-9c961df4\"]]);class JP extends cg{Open(){this.openWindow(KP)}}const PK=new JP;const _l=r=>(Si(\"data-v-4a2e9fae\"),r=r(),xi(),r),QP={key:0,class:\"no-data\"},jP=_l(()=>N(\"span\",null,\"\\u6682\\u65F6\\u8FD8\\u6CA1\\u6709\\u4EFB\\u4F55\\u5171\\u4EAB\\u7528\\u6237\",-1)),tR={class:\"btns\"},eR={key:1,class:\"list\"},rR={class:\"page-table\"},aR=_l(()=>N(\"thead\",null,[N(\"tr\",null,[N(\"th\",null,\"\\u59D3\\u540D\"),N(\"th\",null,\"\\u5BC6\\u7801\"),N(\"th\",null,\"\\u64CD\\u4F5C\")])],-1)),nR=_l(()=>N(\"th\",null,\"******\",-1)),iR={class:\"action\"},oR=[\"onClick\"],sR=[\"onClick\"],lR=_l(()=>N(\"svg\",{width:\"34\",height:\"34\",viewBox:\"0 0 34 34\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},[N(\"path\",{d:\"M18.9763 4.54325C19.1776 4.35138 19.4462 4.24614 19.7243 4.25011C20.0025 4.25408 20.2679 4.36696 20.4637 4.5645L26.2544 10.4051C26.3566 10.5081 26.4367 10.6309 26.4897 10.7661C26.5426 10.9012 26.5673 11.0458 26.5622 11.1908C26.5571 11.3359 26.5224 11.4783 26.4601 11.6095C26.3979 11.7406 26.3094 11.8575 26.2002 11.9531L12.2474 24.174C12.048 24.349 11.7902 24.443 11.5249 24.4375L6.35269 24.327C6.07478 24.3212 5.81023 24.2066 5.61577 24.008C5.42131 23.8094 5.31244 23.5425 5.3125 23.2645V18.0115C5.31247 17.8677 5.34165 17.7253 5.39827 17.5931C5.45489 17.4609 5.53776 17.3415 5.64187 17.2423L18.9763 4.54325ZM20.3862 21.6261L28.3496 21.7812C28.4892 21.784 28.6268 21.8141 28.7547 21.8701C28.8825 21.926 28.9981 22.0065 29.0949 22.1071C29.1916 22.2077 29.2676 22.3263 29.3185 22.4563C29.3693 22.5862 29.3941 22.7249 29.3914 22.8645C29.3887 23.004 29.3585 23.1416 29.3026 23.2695C29.2467 23.3974 29.1661 23.513 29.0656 23.6097C28.965 23.7064 28.8463 23.7824 28.7164 23.8333C28.5864 23.8842 28.4477 23.909 28.3082 23.9062L20.3448 23.7511C20.2052 23.7483 20.0676 23.7181 19.9398 23.6621C19.8119 23.6061 19.6964 23.5255 19.5997 23.4249C19.503 23.3243 19.4271 23.2056 19.3762 23.0756C19.3254 22.9456 19.3007 22.8069 19.3035 22.6674C19.3063 22.5278 19.3365 22.3902 19.3925 22.2624C19.4485 22.1346 19.5291 22.019 19.6297 21.9223C19.7304 21.8256 19.8491 21.7497 19.979 21.6989C20.109 21.6481 20.2477 21.6233 20.3872 21.6261H20.3862ZM19.6881 6.8L7.4375 18.4662V22.2243L11.1562 22.304L23.9498 11.0989L19.6881 6.8ZM28.2976 26.9386C28.5794 26.9365 28.8504 27.0464 29.0512 27.2442C29.2519 27.442 29.3659 27.7114 29.368 27.9932C29.3701 28.275 29.2602 28.546 29.0625 28.7468C28.8647 28.9475 28.5953 29.0615 28.3135 29.0636L7.446 29.2188C7.16421 29.2209 6.89312 29.1109 6.69237 28.9132C6.49161 28.7154 6.37764 28.446 6.37553 28.1642C6.37342 27.8824 6.48333 27.6113 6.6811 27.4106C6.87886 27.2098 7.14827 27.0959 7.43006 27.0938L28.2976 26.9386Z\",fill:\"black\",\"fill-opacity\":\"0.8\"})],-1)),uR=[lR],fR=[\"onClick\"],hR=_l(()=>N(\"svg\",{width:\"34\",height:\"34\",viewBox:\"0 0 34 34\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},[N(\"path\",{d:\"M12.7331 30.5258C11.8785 30.5264 11.0527 30.2169 10.4091 29.6546C9.76556 29.0923 9.34796 28.3155 9.2339 27.4686L6.27084 10.719C6.24075 10.5628 6.24576 10.4019 6.28552 10.248C6.32529 10.094 6.3988 9.95078 6.50075 9.82873C6.60269 9.70667 6.7305 9.60882 6.87493 9.54227C7.01936 9.47571 7.17679 9.44212 7.3358 9.44392H26.9326C27.0917 9.44369 27.2489 9.47864 27.3929 9.54627C27.5369 9.61391 27.6642 9.71254 27.7657 9.83513C27.8688 9.9554 27.9437 10.0971 27.9851 10.25C28.0264 10.4029 28.0331 10.5631 28.0048 10.719L25.1069 27.512C24.9898 28.3532 24.5727 29.1237 23.9323 29.6815C23.2919 30.2394 22.4715 30.5469 21.6222 30.5476L12.7331 30.5258ZM8.63259 11.6101L11.3783 27.1208C11.4153 27.4559 11.5734 27.766 11.8229 27.9927C12.0723 28.2195 12.396 28.3474 12.7331 28.3524H21.5788C21.9155 28.3488 22.2391 28.2212 22.4877 27.994C22.7363 27.7668 22.8924 27.4559 22.9263 27.1208L25.672 11.5956L8.63259 11.6101Z\",fill:\"black\",\"fill-opacity\":\"0.8\"}),N(\"path\",{d:\"M14.1239 26.2153C13.8356 26.2153 13.5592 26.1008 13.3554 25.897C13.1517 25.6932 13.0372 25.4168 13.0372 25.1286C13.0372 24.8404 13.1517 24.564 13.3554 24.3602C13.5592 24.1564 13.8356 24.0419 14.1239 24.0419H19.9196C20.2078 24.0419 20.4842 24.1564 20.688 24.3602C20.8918 24.564 21.0063 24.8404 21.0063 25.1286C21.0063 25.4168 20.8918 25.6932 20.688 25.897C20.4842 26.1008 20.2078 26.2153 19.9196 26.2153H14.1239ZM6.70535 8.12542C6.41714 8.12542 6.14073 8.01093 5.93694 7.80714C5.73314 7.60334 5.61865 7.32694 5.61865 7.03873C5.61865 6.75052 5.73314 6.47411 5.93694 6.27032C6.14073 6.06652 6.41714 5.95203 6.70535 5.95203H27.2656C27.5538 5.95203 27.8303 6.06652 28.034 6.27032C28.2378 6.47411 28.3523 6.75052 28.3523 7.03873C28.3523 7.32694 28.2378 7.60334 28.034 7.80714C27.8303 8.01093 27.5538 8.12542 27.2656 8.12542H6.6981H6.70535ZM15.7539 5.64776C15.4657 5.64776 15.1893 5.53327 14.9855 5.32947C14.7817 5.12568 14.6672 4.84927 14.6672 4.56106C14.6672 4.27285 14.7817 3.99645 14.9855 3.79265C15.1893 3.58886 15.4657 3.47437 15.7539 3.47437H17.652C17.9402 3.47437 18.2166 3.58886 18.4204 3.79265C18.6242 3.99645 18.7387 4.27285 18.7387 4.56106C18.7387 4.84927 18.6242 5.12568 18.4204 5.32947C18.2166 5.53327 17.9402 5.64776 17.652 5.64776H15.7539Z\",fill:\"black\",\"fill-opacity\":\"0.8\"})],-1)),vR=[hR],cR=fn({__name:\"index\",props:{close:Function},setup(r){const e=r,t=Gs({loading:!1,users:[]}),a=()=>{e.close&&e.close()};function n(l=!0){Cd({callback:()=>{i()}})}const i=()=>ra(this,null,function*(){t.loading=!0;const l=ar.Loading(\"\\u52A0\\u8F7D\\u4E2D...\");try{const u=yield Fr.Share.User.GET();if(u!=null&&u.data){const{result:f}=u.data;f&&(t.users=f.users)}}catch(u){console.log(u)}t.loading=!1,l.Close()}),o=l=>{console.log(\"editUser\",l),Cd({user:l,callback:()=>{i()}})},s=l=>ra(this,null,function*(){confirm(\"\\u786E\\u5B9A\\u5220\\u9664\\uFF1F\")&&(yield Fr.Share.User.DELETE(l)).data.success===0&&i()});return i(),(l,u)=>(_t(),zr(vg,{onHandleClose:a,title:\"\\u5171\\u4EAB\\u7528\\u6237\",width:\"612px\"},{default:hg(()=>[t.loading===!1&&t.users.length===0?(_t(),It(\"div\",QP,[N(\"div\",null,[jP,N(\"div\",tR,[N(\"span\",{onClick:u[0]||(u[0]=()=>n())},\"\\u7ACB\\u5373\\u6DFB\\u52A0\")])])])):Ee(\"\",!0),t.loading===!1&&t.users.length!==0?(_t(),It(\"div\",eR,[N(\"button\",{onClick:u[1]||(u[1]=()=>n())},\"\\u65B0\\u589E\"),N(\"table\",rR,[aR,N(\"tbody\",null,[(_t(!0),It(lr,null,pa(t.users,f=>(_t(),It(\"tr\",null,[N(\"th\",null,Xt(f.userName),1),nR,N(\"th\",iR,[N(\"span\",{onClick:h=>df(ar).Message(f.password)},\"\\u67E5\\u770B\\u5BC6\\u7801\",8,oR),N(\"span\",{onClick:h=>o(f)},uR,8,sR),N(\"span\",{onClick:h=>s(f)},vR,8,fR)])]))),256))])])])):Ee(\"\",!0)]),_:1}))}});var dR=hn(cR,[[\"__scopeId\",\"data-v-4a2e9fae\"]]);class pR extends cg{Open(){this.openWindow(dR)}}const RK=new pR;/*! *****************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */var Td=function(r,e){return Td=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(t,a){t.__proto__=a}||function(t,a){for(var n in a)Object.prototype.hasOwnProperty.call(a,n)&&(t[n]=a[n])},Td(r,e)};function k(r,e){if(typeof e!=\"function\"&&e!==null)throw new TypeError(\"Class extends value \"+String(e)+\" is not a constructor or null\");Td(r,e);function t(){this.constructor=r}r.prototype=e===null?Object.create(e):(t.prototype=e.prototype,new t)}var gR=function(){function r(){this.firefox=!1,this.ie=!1,this.edge=!1,this.newEdge=!1,this.weChat=!1}return r}(),yR=function(){function r(){this.browser=new gR,this.node=!1,this.wxa=!1,this.worker=!1,this.svgSupported=!1,this.touchEventsSupported=!1,this.pointerEventsSupported=!1,this.domSupported=!1,this.transformSupported=!1,this.transform3dSupported=!1,this.hasGlobalWindow=typeof window!=\"undefined\"}return r}(),Vn=new yR;typeof wx==\"object\"&&typeof wx.getSystemInfoSync==\"function\"?(Vn.wxa=!0,Vn.touchEventsSupported=!0):typeof document==\"undefined\"&&typeof self!=\"undefined\"?Vn.worker=!0:typeof navigator==\"undefined\"?(Vn.node=!0,Vn.svgSupported=!0):mR(navigator.userAgent,Vn);function mR(r,e){var t=e.browser,a=r.match(/Firefox\\/([\\d.]+)/),n=r.match(/MSIE\\s([\\d.]+)/)||r.match(/Trident\\/.+?rv:(([\\d.]+))/),i=r.match(/Edge?\\/([\\d.]+)/),o=/micromessenger/i.test(r);a&&(t.firefox=!0,t.version=a[1]),n&&(t.ie=!0,t.version=n[1]),i&&(t.edge=!0,t.version=i[1],t.newEdge=+i[1].split(\".\")[0]>18),o&&(t.weChat=!0),e.svgSupported=typeof SVGRect!=\"undefined\",e.touchEventsSupported=\"ontouchstart\"in window&&!t.ie&&!t.edge,e.pointerEventsSupported=\"onpointerdown\"in window&&(t.edge||t.ie&&+t.version>=11),e.domSupported=typeof document!=\"undefined\";var s=document.documentElement.style;e.transform3dSupported=(t.ie&&\"transition\"in s||t.edge||\"WebKitCSSMatrix\"in window&&\"m11\"in new WebKitCSSMatrix||\"MozPerspective\"in s)&&!(\"OTransition\"in s),e.transformSupported=e.transform3dSupported||t.ie&&+t.version>=9}var At=Vn,pg=12,Nb=\"sans-serif\",tn=pg+\"px \"+Nb,_R=20,SR=100,xR=\"007LLmW'55;N0500LLLLLLLLLL00NNNLzWW\\\\\\\\WQb\\\\0FWLg\\\\bWb\\\\WQ\\\\WrWWQ000CL5LLFLL0LL**F*gLLLL5F0LF\\\\FFF5.5N\";function wR(r){var e={};if(typeof JSON==\"undefined\")return e;for(var t=0;t<r.length;t++){var a=String.fromCharCode(t+32),n=(r.charCodeAt(t)-_R)/SR;e[a]=n}return e}var bR=wR(xR),ga={createCanvas:function(){return typeof document!=\"undefined\"&&document.createElement(\"canvas\")},measureText:function(){var r,e;return function(t,a){if(!r){var n=ga.createCanvas();r=n&&n.getContext(\"2d\")}if(r)return e!==a&&(e=r.font=a||tn),r.measureText(t);t=t||\"\",a=a||tn;var i=/(\\d+)px/.exec(a),o=i&&+i[1]||pg,s=0;if(a.indexOf(\"mono\")>=0)s=o*t.length;else for(var l=0;l<t.length;l++){var u=bR[t[l]];s+=u==null?o:u*o}return{width:s}}}(),loadImage:function(r,e,t){var a=new Image;return a.onload=e,a.onerror=t,a.src=r,a}},Vb=Zr([\"Function\",\"RegExp\",\"Date\",\"Error\",\"CanvasGradient\",\"CanvasPattern\",\"Image\",\"Canvas\"],function(r,e){return r[\"[object \"+e+\"]\"]=!0,r},{}),zb=Zr([\"Int8\",\"Uint8\",\"Uint8Clamped\",\"Int16\",\"Uint16\",\"Int32\",\"Uint32\",\"Float32\",\"Float64\"],function(r,e){return r[\"[object \"+e+\"Array]\"]=!0,r},{}),xo=Object.prototype.toString,vh=Array.prototype,CR=vh.forEach,TR=vh.filter,gg=vh.slice,AR=vh.map,Rm=function(){}.constructor,Hl=Rm?Rm.prototype:null,yg=\"__proto__\",DR=2311;function Fb(){return DR++}function mg(){for(var r=[],e=0;e<arguments.length;e++)r[e]=arguments[e];typeof console!=\"undefined\"&&console.error.apply(console,r)}function at(r){if(r==null||typeof r!=\"object\")return r;var e=r,t=xo.call(r);if(t===\"[object Array]\"){if(!Ts(r)){e=[];for(var a=0,n=r.length;a<n;a++)e[a]=at(r[a])}}else if(zb[t]){if(!Ts(r)){var i=r.constructor;if(i.from)e=i.from(r);else{e=new i(r.length);for(var a=0,n=r.length;a<n;a++)e[a]=r[a]}}}else if(!Vb[t]&&!Ts(r)&&!Hs(r)){e={};for(var o in r)r.hasOwnProperty(o)&&o!==yg&&(e[o]=at(r[o]))}return e}function ht(r,e,t){if(!et(e)||!et(r))return t?at(e):r;for(var a in e)if(e.hasOwnProperty(a)&&a!==yg){var n=r[a],i=e[a];et(i)&&et(n)&&!F(i)&&!F(n)&&!Hs(i)&&!Hs(n)&&!Em(i)&&!Em(n)&&!Ts(i)&&!Ts(n)?ht(n,i,t):(t||!(a in r))&&(r[a]=at(e[a]))}return r}function _g(r,e){for(var t=r[0],a=1,n=r.length;a<n;a++)t=ht(t,r[a],e);return t}function V(r,e){if(Object.assign)Object.assign(r,e);else for(var t in e)e.hasOwnProperty(t)&&t!==yg&&(r[t]=e[t]);return r}function tt(r,e,t){for(var a=St(e),n=0;n<a.length;n++){var i=a[n];(t?e[i]!=null:r[i]==null)&&(r[i]=e[i])}return r}ga.createCanvas;function dt(r,e){if(r){if(r.indexOf)return r.indexOf(e);for(var t=0,a=r.length;t<a;t++)if(r[t]===e)return t}return-1}function MR(r,e){var t=r.prototype;function a(){}a.prototype=e.prototype,r.prototype=new a;for(var n in t)t.hasOwnProperty(n)&&(r.prototype[n]=t[n]);r.prototype.constructor=r,r.superClass=e}function te(r,e,t){if(r=\"prototype\"in r?r.prototype:r,e=\"prototype\"in e?e.prototype:e,Object.getOwnPropertyNames)for(var a=Object.getOwnPropertyNames(e),n=0;n<a.length;n++){var i=a[n];i!==\"constructor\"&&(t?e[i]!=null:r[i]==null)&&(r[i]=e[i])}else tt(r,e,t)}function Se(r){return!r||typeof r==\"string\"?!1:typeof r.length==\"number\"}function A(r,e,t){if(!!(r&&e))if(r.forEach&&r.forEach===CR)r.forEach(e,t);else if(r.length===+r.length)for(var a=0,n=r.length;a<n;a++)e.call(t,r[a],a,r);else for(var i in r)r.hasOwnProperty(i)&&e.call(t,r[i],i,r)}function G(r,e,t){if(!r)return[];if(!e)return Sg(r);if(r.map&&r.map===AR)return r.map(e,t);for(var a=[],n=0,i=r.length;n<i;n++)a.push(e.call(t,r[n],n,r));return a}function Zr(r,e,t,a){if(!!(r&&e)){for(var n=0,i=r.length;n<i;n++)t=e.call(a,t,r[n],n,r);return t}}function Et(r,e,t){if(!r)return[];if(!e)return Sg(r);if(r.filter&&r.filter===TR)return r.filter(e,t);for(var a=[],n=0,i=r.length;n<i;n++)e.call(t,r[n],n,r)&&a.push(r[n]);return a}function LR(r,e,t){if(!!(r&&e)){for(var a=0,n=r.length;a<n;a++)if(e.call(t,r[a],a,r))return r[a]}}function St(r){if(!r)return[];if(Object.keys)return Object.keys(r);var e=[];for(var t in r)r.hasOwnProperty(t)&&e.push(t);return e}function IR(r,e){for(var t=[],a=2;a<arguments.length;a++)t[a-2]=arguments[a];return function(){return r.apply(e,t.concat(gg.call(arguments)))}}var Y=Hl&&J(Hl.bind)?Hl.call.bind(Hl.bind):IR;function ot(r){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[t];return function(){return r.apply(this,e.concat(gg.call(arguments)))}}function F(r){return Array.isArray?Array.isArray(r):xo.call(r)===\"[object Array]\"}function J(r){return typeof r==\"function\"}function U(r){return typeof r==\"string\"}function Ad(r){return xo.call(r)===\"[object String]\"}function Mt(r){return typeof r==\"number\"}function et(r){var e=typeof r;return e===\"function\"||!!r&&e===\"object\"}function Em(r){return!!Vb[xo.call(r)]}function Ue(r){return!!zb[xo.call(r)]}function Hs(r){return typeof r==\"object\"&&typeof r.nodeType==\"number\"&&typeof r.ownerDocument==\"object\"}function ch(r){return r.colorStops!=null}function PR(r){return r.image!=null}function RR(r){return xo.call(r)===\"[object RegExp]\"}function Ws(r){return r!==r}function le(){for(var r=[],e=0;e<arguments.length;e++)r[e]=arguments[e];for(var t=0,a=r.length;t<a;t++)if(r[t]!=null)return r[t]}function ft(r,e){return r!=null?r:e}function Ur(r,e,t){return r!=null?r:e!=null?e:t}function Sg(r){for(var e=[],t=1;t<arguments.length;t++)e[t-1]=arguments[t];return gg.apply(r,e)}function xg(r){if(typeof r==\"number\")return[r,r,r,r];var e=r.length;return e===2?[r[0],r[1],r[0],r[1]]:e===3?[r[0],r[1],r[2],r[1]]:r}function Me(r,e){if(!r)throw new Error(e)}function Sr(r){return r==null?null:typeof r.trim==\"function\"?r.trim():r.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\"\")}var Gb=\"__ec_primitive__\";function pf(r){r[Gb]=!0}function Ts(r){return r[Gb]}var ER=function(){function r(){this.data={}}return r.prototype.delete=function(e){var t=this.has(e);return t&&delete this.data[e],t},r.prototype.has=function(e){return this.data.hasOwnProperty(e)},r.prototype.get=function(e){return this.data[e]},r.prototype.set=function(e,t){return this.data[e]=t,this},r.prototype.keys=function(){return St(this.data)},r.prototype.forEach=function(e){var t=this.data;for(var a in t)t.hasOwnProperty(a)&&e(t[a],a)},r}(),Hb=typeof Map==\"function\";function kR(){return Hb?new Map:new ER}var OR=function(){function r(e){var t=F(e);this.data=kR();var a=this;e instanceof r?e.each(n):e&&A(e,n);function n(i,o){t?a.set(i,o):a.set(o,i)}}return r.prototype.hasKey=function(e){return this.data.has(e)},r.prototype.get=function(e){return this.data.get(e)},r.prototype.set=function(e,t){return this.data.set(e,t),t},r.prototype.each=function(e,t){this.data.forEach(function(a,n){e.call(t,a,n)})},r.prototype.keys=function(){var e=this.data.keys();return Hb?Array.from(e):e},r.prototype.removeKey=function(e){this.data.delete(e)},r}();function q(r){return new OR(r)}function gf(r,e){for(var t=new r.constructor(r.length+e.length),a=0;a<r.length;a++)t[a]=r[a];for(var n=r.length,a=0;a<e.length;a++)t[a+n]=e[a];return t}function dh(r,e){var t;if(Object.create)t=Object.create(r);else{var a=function(){};a.prototype=r,t=new a}return e&&V(t,e),t}function Wb(r){var e=r.style;e.webkitUserSelect=\"none\",e.userSelect=\"none\",e.webkitTapHighlightColor=\"rgba(0,0,0,0)\",e[\"-webkit-touch-callout\"]=\"none\"}function Z(r,e){return r.hasOwnProperty(e)}function Kt(){}var Yu=180/Math.PI;function wi(r,e){return r==null&&(r=0),e==null&&(e=0),[r,e]}function Ce(r,e){return r[0]=e[0],r[1]=e[1],r}function fa(r){return[r[0],r[1]]}function BR(r,e,t){return r[0]=e,r[1]=t,r}function km(r,e,t){return r[0]=e[0]+t[0],r[1]=e[1]+t[1],r}function Dd(r,e,t,a){return r[0]=e[0]+t[0]*a,r[1]=e[1]+t[1]*a,r}function qn(r,e,t){return r[0]=e[0]-t[0],r[1]=e[1]-t[1],r}function Md(r){return Math.sqrt(NR(r))}function NR(r){return r[0]*r[0]+r[1]*r[1]}function Zu(r,e,t){return r[0]=e[0]*t,r[1]=e[1]*t,r}function wo(r,e){var t=Md(e);return t===0?(r[0]=0,r[1]=0):(r[0]=e[0]/t,r[1]=e[1]/t),r}function Ld(r,e){return Math.sqrt((r[0]-e[0])*(r[0]-e[0])+(r[1]-e[1])*(r[1]-e[1]))}var Ga=Ld;function VR(r,e){return(r[0]-e[0])*(r[0]-e[0])+(r[1]-e[1])*(r[1]-e[1])}var ai=VR;function Xu(r,e,t,a){return r[0]=e[0]+a*(t[0]-e[0]),r[1]=e[1]+a*(t[1]-e[1]),r}function he(r,e,t){var a=e[0],n=e[1];return r[0]=t[0]*a+t[2]*n+t[4],r[1]=t[1]*a+t[3]*n+t[5],r}function Ha(r,e,t){return r[0]=Math.min(e[0],t[0]),r[1]=Math.min(e[1],t[1]),r}function Wa(r,e,t){return r[0]=Math.max(e[0],t[0]),r[1]=Math.max(e[1],t[1]),r}var Ii=function(){function r(e,t){this.target=e,this.topTarget=t&&t.topTarget}return r}(),zR=function(){function r(e){this.handler=e,e.on(\"mousedown\",this._dragStart,this),e.on(\"mousemove\",this._drag,this),e.on(\"mouseup\",this._dragEnd,this)}return r.prototype._dragStart=function(e){for(var t=e.target;t&&!t.draggable;)t=t.parent||t.__hostTarget;t&&(this._draggingTarget=t,t.dragging=!0,this._x=e.offsetX,this._y=e.offsetY,this.handler.dispatchToElement(new Ii(t,e),\"dragstart\",e.event))},r.prototype._drag=function(e){var t=this._draggingTarget;if(t){var a=e.offsetX,n=e.offsetY,i=a-this._x,o=n-this._y;this._x=a,this._y=n,t.drift(i,o,e),this.handler.dispatchToElement(new Ii(t,e),\"drag\",e.event);var s=this.handler.findHover(a,n,t).target,l=this._dropTarget;this._dropTarget=s,t!==s&&(l&&s!==l&&this.handler.dispatchToElement(new Ii(l,e),\"dragleave\",e.event),s&&s!==l&&this.handler.dispatchToElement(new Ii(s,e),\"dragenter\",e.event))}},r.prototype._dragEnd=function(e){var t=this._draggingTarget;t&&(t.dragging=!1),this.handler.dispatchToElement(new Ii(t,e),\"dragend\",e.event),this._dropTarget&&this.handler.dispatchToElement(new Ii(this._dropTarget,e),\"drop\",e.event),this._draggingTarget=null,this._dropTarget=null},r}(),FR=zR,GR=function(){function r(e){e&&(this._$eventProcessor=e)}return r.prototype.on=function(e,t,a,n){this._$handlers||(this._$handlers={});var i=this._$handlers;if(typeof t==\"function\"&&(n=a,a=t,t=null),!a||!e)return this;var o=this._$eventProcessor;t!=null&&o&&o.normalizeQuery&&(t=o.normalizeQuery(t)),i[e]||(i[e]=[]);for(var s=0;s<i[e].length;s++)if(i[e][s].h===a)return this;var l={h:a,query:t,ctx:n||this,callAtLast:a.zrEventfulCallAtLast},u=i[e].length-1,f=i[e][u];return f&&f.callAtLast?i[e].splice(u,0,l):i[e].push(l),this},r.prototype.isSilent=function(e){var t=this._$handlers;return!t||!t[e]||!t[e].length},r.prototype.off=function(e,t){var a=this._$handlers;if(!a)return this;if(!e)return this._$handlers={},this;if(t){if(a[e]){for(var n=[],i=0,o=a[e].length;i<o;i++)a[e][i].h!==t&&n.push(a[e][i]);a[e]=n}a[e]&&a[e].length===0&&delete a[e]}else delete a[e];return this},r.prototype.trigger=function(e){for(var t=[],a=1;a<arguments.length;a++)t[a-1]=arguments[a];if(!this._$handlers)return this;var n=this._$handlers[e],i=this._$eventProcessor;if(n)for(var o=t.length,s=n.length,l=0;l<s;l++){var u=n[l];if(!(i&&i.filter&&u.query!=null&&!i.filter(e,u.query)))switch(o){case 0:u.h.call(u.ctx);break;case 1:u.h.call(u.ctx,t[0]);break;case 2:u.h.call(u.ctx,t[0],t[1]);break;default:u.h.apply(u.ctx,t);break}}return i&&i.afterTrigger&&i.afterTrigger(e),this},r.prototype.triggerWithContext=function(e){for(var t=[],a=1;a<arguments.length;a++)t[a-1]=arguments[a];if(!this._$handlers)return this;var n=this._$handlers[e],i=this._$eventProcessor;if(n)for(var o=t.length,s=t[o-1],l=n.length,u=0;u<l;u++){var f=n[u];if(!(i&&i.filter&&f.query!=null&&!i.filter(e,f.query)))switch(o){case 0:f.h.call(s);break;case 1:f.h.call(s,t[0]);break;case 2:f.h.call(s,t[0],t[1]);break;default:f.h.apply(s,t.slice(1,o-1));break}}return i&&i.afterTrigger&&i.afterTrigger(e),this},r}(),hr=GR,HR=Math.log(2);function Id(r,e,t,a,n,i){var o=a+\"-\"+n,s=r.length;if(i.hasOwnProperty(o))return i[o];if(e===1){var l=Math.round(Math.log((1<<s)-1&~n)/HR);return r[t][l]}for(var u=a|1<<t,f=t+1;a&1<<f;)f++;for(var h=0,v=0,c=0;v<s;v++){var d=1<<v;d&n||(h+=(c%2?-1:1)*r[t][v]*Id(r,e-1,f,u,n|d,i),c++)}return i[o]=h,h}function Om(r,e){var t=[[r[0],r[1],1,0,0,0,-e[0]*r[0],-e[0]*r[1]],[0,0,0,r[0],r[1],1,-e[1]*r[0],-e[1]*r[1]],[r[2],r[3],1,0,0,0,-e[2]*r[2],-e[2]*r[3]],[0,0,0,r[2],r[3],1,-e[3]*r[2],-e[3]*r[3]],[r[4],r[5],1,0,0,0,-e[4]*r[4],-e[4]*r[5]],[0,0,0,r[4],r[5],1,-e[5]*r[4],-e[5]*r[5]],[r[6],r[7],1,0,0,0,-e[6]*r[6],-e[6]*r[7]],[0,0,0,r[6],r[7],1,-e[7]*r[6],-e[7]*r[7]]],a={},n=Id(t,8,0,0,0,a);if(n!==0){for(var i=[],o=0;o<8;o++)for(var s=0;s<8;s++)i[s]==null&&(i[s]=0),i[s]+=((o+s)%2?-1:1)*Id(t,7,o===0?1:0,1<<o,1<<s,a)/n*e[o];return function(l,u,f){var h=u*i[6]+f*i[7]+1;l[0]=(u*i[0]+f*i[1]+i[2])/h,l[1]=(u*i[3]+f*i[4]+i[5])/h}}}var Bm=\"___zrEVENTSAVED\",jh=[];function WR(r,e,t,a,n){return Pd(jh,e,a,n,!0)&&Pd(r,t,jh[0],jh[1])}function Pd(r,e,t,a,n){if(e.getBoundingClientRect&&At.domSupported&&!$b(e)){var i=e[Bm]||(e[Bm]={}),o=$R(e,i),s=UR(o,i,n);if(s)return s(r,t,a),!0}return!1}function $R(r,e){var t=e.markers;if(t)return t;t=e.markers=[];for(var a=[\"left\",\"right\"],n=[\"top\",\"bottom\"],i=0;i<4;i++){var o=document.createElement(\"div\"),s=o.style,l=i%2,u=(i>>1)%2;s.cssText=[\"position: absolute\",\"visibility: hidden\",\"padding: 0\",\"margin: 0\",\"border-width: 0\",\"user-select: none\",\"width:0\",\"height:0\",a[l]+\":0\",n[u]+\":0\",a[1-l]+\":auto\",n[1-u]+\":auto\",\"\"].join(\"!important;\"),r.appendChild(o),t.push(o)}return t}function UR(r,e,t){for(var a=t?\"invTrans\":\"trans\",n=e[a],i=e.srcCoords,o=[],s=[],l=!0,u=0;u<4;u++){var f=r[u].getBoundingClientRect(),h=2*u,v=f.left,c=f.top;o.push(v,c),l=l&&i&&v===i[h]&&c===i[h+1],s.push(r[u].offsetLeft,r[u].offsetTop)}return l&&n?n:(e.srcCoords=o,e[a]=t?Om(s,o):Om(o,s))}function $b(r){return r.nodeName.toUpperCase()===\"CANVAS\"}var YR=/([&<>\"'])/g,ZR={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"};function ke(r){return r==null?\"\":(r+\"\").replace(YR,function(e,t){return ZR[t]})}var XR=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,tv=[],qR=At.browser.firefox&&+At.browser.version.split(\".\")[0]<39;function Rd(r,e,t,a){return t=t||{},a?Nm(r,e,t):qR&&e.layerX!=null&&e.layerX!==e.offsetX?(t.zrX=e.layerX,t.zrY=e.layerY):e.offsetX!=null?(t.zrX=e.offsetX,t.zrY=e.offsetY):Nm(r,e,t),t}function Nm(r,e,t){if(At.domSupported&&r.getBoundingClientRect){var a=e.clientX,n=e.clientY;if($b(r)){var i=r.getBoundingClientRect();t.zrX=a-i.left,t.zrY=n-i.top;return}else if(Pd(tv,r,a,n)){t.zrX=tv[0],t.zrY=tv[1];return}}t.zrX=t.zrY=0}function wg(r){return r||window.event}function Je(r,e,t){if(e=wg(e),e.zrX!=null)return e;var a=e.type,n=a&&a.indexOf(\"touch\")>=0;if(n){var o=a!==\"touchend\"?e.targetTouches[0]:e.changedTouches[0];o&&Rd(r,o,e,t)}else{Rd(r,e,e,t);var i=KR(e);e.zrDelta=i?i/120:-(e.detail||0)/3}var s=e.button;return e.which==null&&s!==void 0&&XR.test(e.type)&&(e.which=s&1?1:s&2?3:s&4?2:0),e}function KR(r){var e=r.wheelDelta;if(e)return e;var t=r.deltaX,a=r.deltaY;if(t==null||a==null)return e;var n=Math.abs(a!==0?a:t),i=a>0?-1:a<0?1:t>0?-1:1;return 3*n*i}function Ed(r,e,t,a){r.addEventListener(e,t,a)}function JR(r,e,t,a){r.removeEventListener(e,t,a)}var ya=function(r){r.preventDefault(),r.stopPropagation(),r.cancelBubble=!0};function Vm(r){return r.which===2||r.which===3}var QR=function(){function r(){this._track=[]}return r.prototype.recognize=function(e,t,a){return this._doTrack(e,t,a),this._recognize(e)},r.prototype.clear=function(){return this._track.length=0,this},r.prototype._doTrack=function(e,t,a){var n=e.touches;if(!!n){for(var i={points:[],touches:[],target:t,event:e},o=0,s=n.length;o<s;o++){var l=n[o],u=Rd(a,l,{});i.points.push([u.zrX,u.zrY]),i.touches.push(l)}this._track.push(i)}},r.prototype._recognize=function(e){for(var t in ev)if(ev.hasOwnProperty(t)){var a=ev[t](this._track,e);if(a)return a}},r}();function zm(r){var e=r[1][0]-r[0][0],t=r[1][1]-r[0][1];return Math.sqrt(e*e+t*t)}function jR(r){return[(r[0][0]+r[1][0])/2,(r[0][1]+r[1][1])/2]}var ev={pinch:function(r,e){var t=r.length;if(!!t){var a=(r[t-1]||{}).points,n=(r[t-2]||{}).points||a;if(n&&n.length>1&&a&&a.length>1){var i=zm(a)/zm(n);!isFinite(i)&&(i=1),e.pinchScale=i;var o=jR(a);return e.pinchX=o[0],e.pinchY=o[1],{type:\"pinch\",target:r[0].target,event:e}}}}};function ur(){return[1,0,0,1,0,0]}function ph(r){return r[0]=1,r[1]=0,r[2]=0,r[3]=1,r[4]=0,r[5]=0,r}function bg(r,e){return r[0]=e[0],r[1]=e[1],r[2]=e[2],r[3]=e[3],r[4]=e[4],r[5]=e[5],r}function ha(r,e,t){var a=e[0]*t[0]+e[2]*t[1],n=e[1]*t[0]+e[3]*t[1],i=e[0]*t[2]+e[2]*t[3],o=e[1]*t[2]+e[3]*t[3],s=e[0]*t[4]+e[2]*t[5]+e[4],l=e[1]*t[4]+e[3]*t[5]+e[5];return r[0]=a,r[1]=n,r[2]=i,r[3]=o,r[4]=s,r[5]=l,r}function Xr(r,e,t){return r[0]=e[0],r[1]=e[1],r[2]=e[2],r[3]=e[3],r[4]=e[4]+t[0],r[5]=e[5]+t[1],r}function bi(r,e,t){var a=e[0],n=e[2],i=e[4],o=e[1],s=e[3],l=e[5],u=Math.sin(t),f=Math.cos(t);return r[0]=a*f+o*u,r[1]=-a*u+o*f,r[2]=n*f+s*u,r[3]=-n*u+f*s,r[4]=f*i+u*l,r[5]=f*l-u*i,r}function Cg(r,e,t){var a=t[0],n=t[1];return r[0]=e[0]*a,r[1]=e[1]*n,r[2]=e[2]*a,r[3]=e[3]*n,r[4]=e[4]*a,r[5]=e[5]*n,r}function bo(r,e){var t=e[0],a=e[2],n=e[4],i=e[1],o=e[3],s=e[5],l=t*o-i*a;return l?(l=1/l,r[0]=o*l,r[1]=-i*l,r[2]=-a*l,r[3]=t*l,r[4]=(a*s-o*n)*l,r[5]=(i*n-t*s)*l,r):null}function tE(r){var e=ur();return bg(e,r),e}var eE=function(){function r(e,t){this.x=e||0,this.y=t||0}return r.prototype.copy=function(e){return this.x=e.x,this.y=e.y,this},r.prototype.clone=function(){return new r(this.x,this.y)},r.prototype.set=function(e,t){return this.x=e,this.y=t,this},r.prototype.equal=function(e){return e.x===this.x&&e.y===this.y},r.prototype.add=function(e){return this.x+=e.x,this.y+=e.y,this},r.prototype.scale=function(e){this.x*=e,this.y*=e},r.prototype.scaleAndAdd=function(e,t){this.x+=e.x*t,this.y+=e.y*t},r.prototype.sub=function(e){return this.x-=e.x,this.y-=e.y,this},r.prototype.dot=function(e){return this.x*e.x+this.y*e.y},r.prototype.len=function(){return Math.sqrt(this.x*this.x+this.y*this.y)},r.prototype.lenSquare=function(){return this.x*this.x+this.y*this.y},r.prototype.normalize=function(){var e=this.len();return this.x/=e,this.y/=e,this},r.prototype.distance=function(e){var t=this.x-e.x,a=this.y-e.y;return Math.sqrt(t*t+a*a)},r.prototype.distanceSquare=function(e){var t=this.x-e.x,a=this.y-e.y;return t*t+a*a},r.prototype.negate=function(){return this.x=-this.x,this.y=-this.y,this},r.prototype.transform=function(e){if(!!e){var t=this.x,a=this.y;return this.x=e[0]*t+e[2]*a+e[4],this.y=e[1]*t+e[3]*a+e[5],this}},r.prototype.toArray=function(e){return e[0]=this.x,e[1]=this.y,e},r.prototype.fromArray=function(e){this.x=e[0],this.y=e[1]},r.set=function(e,t,a){e.x=t,e.y=a},r.copy=function(e,t){e.x=t.x,e.y=t.y},r.len=function(e){return Math.sqrt(e.x*e.x+e.y*e.y)},r.lenSquare=function(e){return e.x*e.x+e.y*e.y},r.dot=function(e,t){return e.x*t.x+e.y*t.y},r.add=function(e,t,a){e.x=t.x+a.x,e.y=t.y+a.y},r.sub=function(e,t,a){e.x=t.x-a.x,e.y=t.y-a.y},r.scale=function(e,t,a){e.x=t.x*a,e.y=t.y*a},r.scaleAndAdd=function(e,t,a,n){e.x=t.x+a.x*n,e.y=t.y+a.y*n},r.lerp=function(e,t,a,n){var i=1-n;e.x=i*t.x+n*a.x,e.y=i*t.y+n*a.y},r}(),ut=eE,Wl=Math.min,$l=Math.max,dn=new ut,pn=new ut,gn=new ut,yn=new ut,Vo=new ut,zo=new ut,rE=function(){function r(e,t,a,n){a<0&&(e=e+a,a=-a),n<0&&(t=t+n,n=-n),this.x=e,this.y=t,this.width=a,this.height=n}return r.prototype.union=function(e){var t=Wl(e.x,this.x),a=Wl(e.y,this.y);isFinite(this.x)&&isFinite(this.width)?this.width=$l(e.x+e.width,this.x+this.width)-t:this.width=e.width,isFinite(this.y)&&isFinite(this.height)?this.height=$l(e.y+e.height,this.y+this.height)-a:this.height=e.height,this.x=t,this.y=a},r.prototype.applyTransform=function(e){r.applyTransform(this,this,e)},r.prototype.calculateTransform=function(e){var t=this,a=e.width/t.width,n=e.height/t.height,i=ur();return Xr(i,i,[-t.x,-t.y]),Cg(i,i,[a,n]),Xr(i,i,[e.x,e.y]),i},r.prototype.intersect=function(e,t){if(!e)return!1;e instanceof r||(e=r.create(e));var a=this,n=a.x,i=a.x+a.width,o=a.y,s=a.y+a.height,l=e.x,u=e.x+e.width,f=e.y,h=e.y+e.height,v=!(i<l||u<n||s<f||h<o);if(t){var c=1/0,d=0,p=Math.abs(i-l),g=Math.abs(u-n),y=Math.abs(s-f),m=Math.abs(h-o),_=Math.min(p,g),S=Math.min(y,m);i<l||u<n?_>d&&(d=_,p<g?ut.set(zo,-p,0):ut.set(zo,g,0)):_<c&&(c=_,p<g?ut.set(Vo,p,0):ut.set(Vo,-g,0)),s<f||h<o?S>d&&(d=S,y<m?ut.set(zo,0,-y):ut.set(zo,0,m)):_<c&&(c=_,y<m?ut.set(Vo,0,y):ut.set(Vo,0,-m))}return t&&ut.copy(t,v?Vo:zo),v},r.prototype.contain=function(e,t){var a=this;return e>=a.x&&e<=a.x+a.width&&t>=a.y&&t<=a.y+a.height},r.prototype.clone=function(){return new r(this.x,this.y,this.width,this.height)},r.prototype.copy=function(e){r.copy(this,e)},r.prototype.plain=function(){return{x:this.x,y:this.y,width:this.width,height:this.height}},r.prototype.isFinite=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)},r.prototype.isZero=function(){return this.width===0||this.height===0},r.create=function(e){return new r(e.x,e.y,e.width,e.height)},r.copy=function(e,t){e.x=t.x,e.y=t.y,e.width=t.width,e.height=t.height},r.applyTransform=function(e,t,a){if(!a){e!==t&&r.copy(e,t);return}if(a[1]<1e-5&&a[1]>-1e-5&&a[2]<1e-5&&a[2]>-1e-5){var n=a[0],i=a[3],o=a[4],s=a[5];e.x=t.x*n+o,e.y=t.y*i+s,e.width=t.width*n,e.height=t.height*i,e.width<0&&(e.x+=e.width,e.width=-e.width),e.height<0&&(e.y+=e.height,e.height=-e.height);return}dn.x=gn.x=t.x,dn.y=yn.y=t.y,pn.x=yn.x=t.x+t.width,pn.y=gn.y=t.y+t.height,dn.transform(a),yn.transform(a),pn.transform(a),gn.transform(a),e.x=Wl(dn.x,pn.x,gn.x,yn.x),e.y=Wl(dn.y,pn.y,gn.y,yn.y);var l=$l(dn.x,pn.x,gn.x,yn.x),u=$l(dn.y,pn.y,gn.y,yn.y);e.width=l-e.x,e.height=u-e.y},r}(),vt=rE,Ub=\"silent\";function aE(r,e,t){return{type:r,event:t,target:e.target,topTarget:e.topTarget,cancelBubble:!1,offsetX:t.zrX,offsetY:t.zrY,gestureEvent:t.gestureEvent,pinchX:t.pinchX,pinchY:t.pinchY,pinchScale:t.pinchScale,wheelDelta:t.zrDelta,zrByTouch:t.zrByTouch,which:t.which,stop:nE}}function nE(){ya(this.event)}var iE=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.handler=null,t}return e.prototype.dispose=function(){},e.prototype.setCursor=function(){},e}(hr),Fo=function(){function r(e,t){this.x=e,this.y=t}return r}(),oE=[\"click\",\"dblclick\",\"mousewheel\",\"mouseout\",\"mouseup\",\"mousedown\",\"mousemove\",\"contextmenu\"],rv=new vt(0,0,0,0),Yb=function(r){k(e,r);function e(t,a,n,i,o){var s=r.call(this)||this;return s._hovered=new Fo(0,0),s.storage=t,s.painter=a,s.painterRoot=i,s._pointerSize=o,n=n||new iE,s.proxy=null,s.setHandlerProxy(n),s._draggingMgr=new FR(s),s}return e.prototype.setHandlerProxy=function(t){this.proxy&&this.proxy.dispose(),t&&(A(oE,function(a){t.on&&t.on(a,this[a],this)},this),t.handler=this),this.proxy=t},e.prototype.mousemove=function(t){var a=t.zrX,n=t.zrY,i=Zb(this,a,n),o=this._hovered,s=o.target;s&&!s.__zr&&(o=this.findHover(o.x,o.y),s=o.target);var l=this._hovered=i?new Fo(a,n):this.findHover(a,n),u=l.target,f=this.proxy;f.setCursor&&f.setCursor(u?u.cursor:\"default\"),s&&u!==s&&this.dispatchToElement(o,\"mouseout\",t),this.dispatchToElement(l,\"mousemove\",t),u&&u!==s&&this.dispatchToElement(l,\"mouseover\",t)},e.prototype.mouseout=function(t){var a=t.zrEventControl;a!==\"only_globalout\"&&this.dispatchToElement(this._hovered,\"mouseout\",t),a!==\"no_globalout\"&&this.trigger(\"globalout\",{type:\"globalout\",event:t})},e.prototype.resize=function(){this._hovered=new Fo(0,0)},e.prototype.dispatch=function(t,a){var n=this[t];n&&n.call(this,a)},e.prototype.dispose=function(){this.proxy.dispose(),this.storage=null,this.proxy=null,this.painter=null},e.prototype.setCursorStyle=function(t){var a=this.proxy;a.setCursor&&a.setCursor(t)},e.prototype.dispatchToElement=function(t,a,n){t=t||{};var i=t.target;if(!(i&&i.silent)){for(var o=\"on\"+a,s=aE(a,t,n);i&&(i[o]&&(s.cancelBubble=!!i[o].call(i,s)),i.trigger(a,s),i=i.__hostTarget?i.__hostTarget:i.parent,!s.cancelBubble););s.cancelBubble||(this.trigger(a,s),this.painter&&this.painter.eachOtherLayer&&this.painter.eachOtherLayer(function(l){typeof l[o]==\"function\"&&l[o].call(l,s),l.trigger&&l.trigger(a,s)}))}},e.prototype.findHover=function(t,a,n){var i=this.storage.getDisplayList(),o=new Fo(t,a);if(Fm(i,o,t,a,n),this._pointerSize&&!o.target){for(var s=[],l=this._pointerSize,u=l/2,f=new vt(t-u,a-u,l,l),h=i.length-1;h>=0;h--){var v=i[h];v!==n&&!v.ignore&&!v.ignoreCoarsePointer&&(!v.parent||!v.parent.ignoreCoarsePointer)&&(rv.copy(v.getBoundingRect()),v.transform&&rv.applyTransform(v.transform),rv.intersect(f)&&s.push(v))}if(s.length)for(var c=4,d=Math.PI/12,p=Math.PI*2,g=0;g<u;g+=c)for(var y=0;y<p;y+=d){var m=t+g*Math.cos(y),_=a+g*Math.sin(y);if(Fm(s,o,m,_,n),o.target)return o}}return o},e.prototype.processGesture=function(t,a){this._gestureMgr||(this._gestureMgr=new QR);var n=this._gestureMgr;a===\"start\"&&n.clear();var i=n.recognize(t,this.findHover(t.zrX,t.zrY,null).target,this.proxy.dom);if(a===\"end\"&&n.clear(),i){var o=i.type;t.gestureEvent=o;var s=new Fo;s.target=i.target,this.dispatchToElement(s,o,i.event)}},e}(hr);A([\"click\",\"mousedown\",\"mouseup\",\"mousewheel\",\"dblclick\",\"contextmenu\"],function(r){Yb.prototype[r]=function(e){var t=e.zrX,a=e.zrY,n=Zb(this,t,a),i,o;if((r!==\"mouseup\"||!n)&&(i=this.findHover(t,a),o=i.target),r===\"mousedown\")this._downEl=o,this._downPoint=[e.zrX,e.zrY],this._upEl=o;else if(r===\"mouseup\")this._upEl=o;else if(r===\"click\"){if(this._downEl!==this._upEl||!this._downPoint||Ga(this._downPoint,[e.zrX,e.zrY])>4)return;this._downPoint=null}this.dispatchToElement(i,r,e)}});function sE(r,e,t){if(r[r.rectHover?\"rectContain\":\"contain\"](e,t)){for(var a=r,n=void 0,i=!1;a;){if(a.ignoreClip&&(i=!0),!i){var o=a.getClipPath();if(o&&!o.contain(e,t))return!1;a.silent&&(n=!0)}var s=a.__hostTarget;a=s||a.parent}return n?Ub:!0}return!1}function Fm(r,e,t,a,n){for(var i=r.length-1;i>=0;i--){var o=r[i],s=void 0;if(o!==n&&!o.ignore&&(s=sE(o,t,a))&&(!e.topTarget&&(e.topTarget=o),s!==Ub)){e.target=o;break}}}function Zb(r,e,t){var a=r.painter;return e<0||e>a.getWidth()||t<0||t>a.getHeight()}var lE=Yb,Xb=32,Go=7;function uE(r){for(var e=0;r>=Xb;)e|=r&1,r>>=1;return r+e}function Gm(r,e,t,a){var n=e+1;if(n===t)return 1;if(a(r[n++],r[e])<0){for(;n<t&&a(r[n],r[n-1])<0;)n++;fE(r,e,n)}else for(;n<t&&a(r[n],r[n-1])>=0;)n++;return n-e}function fE(r,e,t){for(t--;e<t;){var a=r[e];r[e++]=r[t],r[t--]=a}}function Hm(r,e,t,a,n){for(a===e&&a++;a<t;a++){for(var i=r[a],o=e,s=a,l;o<s;)l=o+s>>>1,n(i,r[l])<0?s=l:o=l+1;var u=a-o;switch(u){case 3:r[o+3]=r[o+2];case 2:r[o+2]=r[o+1];case 1:r[o+1]=r[o];break;default:for(;u>0;)r[o+u]=r[o+u-1],u--}r[o]=i}}function av(r,e,t,a,n,i){var o=0,s=0,l=1;if(i(r,e[t+n])>0){for(s=a-n;l<s&&i(r,e[t+n+l])>0;)o=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),o+=n,l+=n}else{for(s=n+1;l<s&&i(r,e[t+n-l])<=0;)o=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var u=o;o=n-l,l=n-u}for(o++;o<l;){var f=o+(l-o>>>1);i(r,e[t+f])>0?o=f+1:l=f}return l}function nv(r,e,t,a,n,i){var o=0,s=0,l=1;if(i(r,e[t+n])<0){for(s=n+1;l<s&&i(r,e[t+n-l])<0;)o=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var u=o;o=n-l,l=n-u}else{for(s=a-n;l<s&&i(r,e[t+n+l])>=0;)o=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),o+=n,l+=n}for(o++;o<l;){var f=o+(l-o>>>1);i(r,e[t+f])<0?l=f:o=f+1}return l}function hE(r,e){var t=Go,a,n,i=0;r.length;var o=[];a=[],n=[];function s(c,d){a[i]=c,n[i]=d,i+=1}function l(){for(;i>1;){var c=i-2;if(c>=1&&n[c-1]<=n[c]+n[c+1]||c>=2&&n[c-2]<=n[c]+n[c-1])n[c-1]<n[c+1]&&c--;else if(n[c]>n[c+1])break;f(c)}}function u(){for(;i>1;){var c=i-2;c>0&&n[c-1]<n[c+1]&&c--,f(c)}}function f(c){var d=a[c],p=n[c],g=a[c+1],y=n[c+1];n[c]=p+y,c===i-3&&(a[c+1]=a[c+2],n[c+1]=n[c+2]),i--;var m=nv(r[g],r,d,p,0,e);d+=m,p-=m,p!==0&&(y=av(r[d+p-1],r,g,y,y-1,e),y!==0&&(p<=y?h(d,p,g,y):v(d,p,g,y)))}function h(c,d,p,g){var y=0;for(y=0;y<d;y++)o[y]=r[c+y];var m=0,_=p,S=c;if(r[S++]=r[_++],--g===0){for(y=0;y<d;y++)r[S+y]=o[m+y];return}if(d===1){for(y=0;y<g;y++)r[S+y]=r[_+y];r[S+g]=o[m];return}for(var w=t,x,b,C;;){x=0,b=0,C=!1;do if(e(r[_],o[m])<0){if(r[S++]=r[_++],b++,x=0,--g===0){C=!0;break}}else if(r[S++]=o[m++],x++,b=0,--d===1){C=!0;break}while((x|b)<w);if(C)break;do{if(x=nv(r[_],o,m,d,0,e),x!==0){for(y=0;y<x;y++)r[S+y]=o[m+y];if(S+=x,m+=x,d-=x,d<=1){C=!0;break}}if(r[S++]=r[_++],--g===0){C=!0;break}if(b=av(o[m],r,_,g,0,e),b!==0){for(y=0;y<b;y++)r[S+y]=r[_+y];if(S+=b,_+=b,g-=b,g===0){C=!0;break}}if(r[S++]=o[m++],--d===1){C=!0;break}w--}while(x>=Go||b>=Go);if(C)break;w<0&&(w=0),w+=2}if(t=w,t<1&&(t=1),d===1){for(y=0;y<g;y++)r[S+y]=r[_+y];r[S+g]=o[m]}else{if(d===0)throw new Error;for(y=0;y<d;y++)r[S+y]=o[m+y]}}function v(c,d,p,g){var y=0;for(y=0;y<g;y++)o[y]=r[p+y];var m=c+d-1,_=g-1,S=p+g-1,w=0,x=0;if(r[S--]=r[m--],--d===0){for(w=S-(g-1),y=0;y<g;y++)r[w+y]=o[y];return}if(g===1){for(S-=d,m-=d,x=S+1,w=m+1,y=d-1;y>=0;y--)r[x+y]=r[w+y];r[S]=o[_];return}for(var b=t;;){var C=0,T=0,D=!1;do if(e(o[_],r[m])<0){if(r[S--]=r[m--],C++,T=0,--d===0){D=!0;break}}else if(r[S--]=o[_--],T++,C=0,--g===1){D=!0;break}while((C|T)<b);if(D)break;do{if(C=d-nv(o[_],r,c,d,d-1,e),C!==0){for(S-=C,m-=C,d-=C,x=S+1,w=m+1,y=C-1;y>=0;y--)r[x+y]=r[w+y];if(d===0){D=!0;break}}if(r[S--]=o[_--],--g===1){D=!0;break}if(T=g-av(r[m],o,0,g,g-1,e),T!==0){for(S-=T,_-=T,g-=T,x=S+1,w=_+1,y=0;y<T;y++)r[x+y]=o[w+y];if(g<=1){D=!0;break}}if(r[S--]=r[m--],--d===0){D=!0;break}b--}while(C>=Go||T>=Go);if(D)break;b<0&&(b=0),b+=2}if(t=b,t<1&&(t=1),g===1){for(S-=d,m-=d,x=S+1,w=m+1,y=d-1;y>=0;y--)r[x+y]=r[w+y];r[S]=o[_]}else{if(g===0)throw new Error;for(w=S-(g-1),y=0;y<g;y++)r[w+y]=o[y]}}return{mergeRuns:l,forceMergeRuns:u,pushRun:s}}function qu(r,e,t,a){t||(t=0),a||(a=r.length);var n=a-t;if(!(n<2)){var i=0;if(n<Xb){i=Gm(r,t,a,e),Hm(r,t,a,t+i,e);return}var o=hE(r,e),s=uE(n);do{if(i=Gm(r,t,a,e),i<s){var l=n;l>s&&(l=s),Hm(r,t,t+l,t+i,e),i=l}o.pushRun(t,i),o.mergeRuns(),n-=i,t+=i}while(n!==0);o.forceMergeRuns()}}var He=1,cs=2,Ji=4,Wm=!1;function iv(){Wm||(Wm=!0,console.warn(\"z / z2 / zlevel of displayable is invalid, which may cause unexpected errors\"))}function $m(r,e){return r.zlevel===e.zlevel?r.z===e.z?r.z2-e.z2:r.z-e.z:r.zlevel-e.zlevel}var vE=function(){function r(){this._roots=[],this._displayList=[],this._displayListLen=0,this.displayableSortFunc=$m}return r.prototype.traverse=function(e,t){for(var a=0;a<this._roots.length;a++)this._roots[a].traverse(e,t)},r.prototype.getDisplayList=function(e,t){t=t||!1;var a=this._displayList;return(e||!a.length)&&this.updateDisplayList(t),a},r.prototype.updateDisplayList=function(e){this._displayListLen=0;for(var t=this._roots,a=this._displayList,n=0,i=t.length;n<i;n++)this._updateAndAddDisplayable(t[n],null,e);a.length=this._displayListLen,qu(a,$m)},r.prototype._updateAndAddDisplayable=function(e,t,a){if(!(e.ignore&&!a)){e.beforeUpdate(),e.update(),e.afterUpdate();var n=e.getClipPath();if(e.ignoreClip)t=null;else if(n){t?t=t.slice():t=[];for(var i=n,o=e;i;)i.parent=o,i.updateTransform(),t.push(i),o=i,i=i.getClipPath()}if(e.childrenRef){for(var s=e.childrenRef(),l=0;l<s.length;l++){var u=s[l];e.__dirty&&(u.__dirty|=He),this._updateAndAddDisplayable(u,t,a)}e.__dirty=0}else{var f=e;t&&t.length?f.__clipPaths=t:f.__clipPaths&&f.__clipPaths.length>0&&(f.__clipPaths=[]),isNaN(f.z)&&(iv(),f.z=0),isNaN(f.z2)&&(iv(),f.z2=0),isNaN(f.zlevel)&&(iv(),f.zlevel=0),this._displayList[this._displayListLen++]=f}var h=e.getDecalElement&&e.getDecalElement();h&&this._updateAndAddDisplayable(h,t,a);var v=e.getTextGuideLine();v&&this._updateAndAddDisplayable(v,t,a);var c=e.getTextContent();c&&this._updateAndAddDisplayable(c,t,a)}},r.prototype.addRoot=function(e){e.__zr&&e.__zr.storage===this||this._roots.push(e)},r.prototype.delRoot=function(e){if(e instanceof Array){for(var t=0,a=e.length;t<a;t++)this.delRoot(e[t]);return}var n=dt(this._roots,e);n>=0&&this._roots.splice(n,1)},r.prototype.delAllRoots=function(){this._roots=[],this._displayList=[],this._displayListLen=0},r.prototype.getRoots=function(){return this._roots},r.prototype.dispose=function(){this._displayList=null,this._roots=null},r}(),cE=vE,qb;qb=At.hasGlobalWindow&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(r){return setTimeout(r,16)};var kd=qb,Ku={linear:function(r){return r},quadraticIn:function(r){return r*r},quadraticOut:function(r){return r*(2-r)},quadraticInOut:function(r){return(r*=2)<1?.5*r*r:-.5*(--r*(r-2)-1)},cubicIn:function(r){return r*r*r},cubicOut:function(r){return--r*r*r+1},cubicInOut:function(r){return(r*=2)<1?.5*r*r*r:.5*((r-=2)*r*r+2)},quarticIn:function(r){return r*r*r*r},quarticOut:function(r){return 1- --r*r*r*r},quarticInOut:function(r){return(r*=2)<1?.5*r*r*r*r:-.5*((r-=2)*r*r*r-2)},quinticIn:function(r){return r*r*r*r*r},quinticOut:function(r){return--r*r*r*r*r+1},quinticInOut:function(r){return(r*=2)<1?.5*r*r*r*r*r:.5*((r-=2)*r*r*r*r+2)},sinusoidalIn:function(r){return 1-Math.cos(r*Math.PI/2)},sinusoidalOut:function(r){return Math.sin(r*Math.PI/2)},sinusoidalInOut:function(r){return .5*(1-Math.cos(Math.PI*r))},exponentialIn:function(r){return r===0?0:Math.pow(1024,r-1)},exponentialOut:function(r){return r===1?1:1-Math.pow(2,-10*r)},exponentialInOut:function(r){return r===0?0:r===1?1:(r*=2)<1?.5*Math.pow(1024,r-1):.5*(-Math.pow(2,-10*(r-1))+2)},circularIn:function(r){return 1-Math.sqrt(1-r*r)},circularOut:function(r){return Math.sqrt(1- --r*r)},circularInOut:function(r){return(r*=2)<1?-.5*(Math.sqrt(1-r*r)-1):.5*(Math.sqrt(1-(r-=2)*r)+1)},elasticIn:function(r){var e,t=.1,a=.4;return r===0?0:r===1?1:(!t||t<1?(t=1,e=a/4):e=a*Math.asin(1/t)/(2*Math.PI),-(t*Math.pow(2,10*(r-=1))*Math.sin((r-e)*(2*Math.PI)/a)))},elasticOut:function(r){var e,t=.1,a=.4;return r===0?0:r===1?1:(!t||t<1?(t=1,e=a/4):e=a*Math.asin(1/t)/(2*Math.PI),t*Math.pow(2,-10*r)*Math.sin((r-e)*(2*Math.PI)/a)+1)},elasticInOut:function(r){var e,t=.1,a=.4;return r===0?0:r===1?1:(!t||t<1?(t=1,e=a/4):e=a*Math.asin(1/t)/(2*Math.PI),(r*=2)<1?-.5*(t*Math.pow(2,10*(r-=1))*Math.sin((r-e)*(2*Math.PI)/a)):t*Math.pow(2,-10*(r-=1))*Math.sin((r-e)*(2*Math.PI)/a)*.5+1)},backIn:function(r){var e=1.70158;return r*r*((e+1)*r-e)},backOut:function(r){var e=1.70158;return--r*r*((e+1)*r+e)+1},backInOut:function(r){var e=2.5949095;return(r*=2)<1?.5*(r*r*((e+1)*r-e)):.5*((r-=2)*r*((e+1)*r+e)+2)},bounceIn:function(r){return 1-Ku.bounceOut(1-r)},bounceOut:function(r){return r<1/2.75?7.5625*r*r:r<2/2.75?7.5625*(r-=1.5/2.75)*r+.75:r<2.5/2.75?7.5625*(r-=2.25/2.75)*r+.9375:7.5625*(r-=2.625/2.75)*r+.984375},bounceInOut:function(r){return r<.5?Ku.bounceIn(r*2)*.5:Ku.bounceOut(r*2-1)*.5+.5}},Kb=Ku,Ul=Math.pow,Ka=Math.sqrt,yf=1e-8,Jb=1e-4,Um=Ka(3),Yl=1/3,Nr=wi(),er=wi(),oo=wi();function $a(r){return r>-yf&&r<yf}function Qb(r){return r>yf||r<-yf}function ae(r,e,t,a,n){var i=1-n;return i*i*(i*r+3*n*e)+n*n*(n*a+3*i*t)}function Ym(r,e,t,a,n){var i=1-n;return 3*(((e-r)*i+2*(t-e)*n)*i+(a-t)*n*n)}function mf(r,e,t,a,n,i){var o=a+3*(e-t)-r,s=3*(t-e*2+r),l=3*(e-r),u=r-n,f=s*s-3*o*l,h=s*l-9*o*u,v=l*l-3*s*u,c=0;if($a(f)&&$a(h))if($a(s))i[0]=0;else{var d=-l/s;d>=0&&d<=1&&(i[c++]=d)}else{var p=h*h-4*f*v;if($a(p)){var g=h/f,d=-s/o+g,y=-g/2;d>=0&&d<=1&&(i[c++]=d),y>=0&&y<=1&&(i[c++]=y)}else if(p>0){var m=Ka(p),_=f*s+1.5*o*(-h+m),S=f*s+1.5*o*(-h-m);_<0?_=-Ul(-_,Yl):_=Ul(_,Yl),S<0?S=-Ul(-S,Yl):S=Ul(S,Yl);var d=(-s-(_+S))/(3*o);d>=0&&d<=1&&(i[c++]=d)}else{var w=(2*f*s-3*o*h)/(2*Ka(f*f*f)),x=Math.acos(w)/3,b=Ka(f),C=Math.cos(x),d=(-s-2*b*C)/(3*o),y=(-s+b*(C+Um*Math.sin(x)))/(3*o),T=(-s+b*(C-Um*Math.sin(x)))/(3*o);d>=0&&d<=1&&(i[c++]=d),y>=0&&y<=1&&(i[c++]=y),T>=0&&T<=1&&(i[c++]=T)}}return c}function jb(r,e,t,a,n){var i=6*t-12*e+6*r,o=9*e+3*a-3*r-9*t,s=3*e-3*r,l=0;if($a(o)){if(Qb(i)){var u=-s/i;u>=0&&u<=1&&(n[l++]=u)}}else{var f=i*i-4*o*s;if($a(f))n[0]=-i/(2*o);else if(f>0){var h=Ka(f),u=(-i+h)/(2*o),v=(-i-h)/(2*o);u>=0&&u<=1&&(n[l++]=u),v>=0&&v<=1&&(n[l++]=v)}}return l}function en(r,e,t,a,n,i){var o=(e-r)*n+r,s=(t-e)*n+e,l=(a-t)*n+t,u=(s-o)*n+o,f=(l-s)*n+s,h=(f-u)*n+u;i[0]=r,i[1]=o,i[2]=u,i[3]=h,i[4]=h,i[5]=f,i[6]=l,i[7]=a}function t2(r,e,t,a,n,i,o,s,l,u,f){var h,v=.005,c=1/0,d,p,g,y;Nr[0]=l,Nr[1]=u;for(var m=0;m<1;m+=.05)er[0]=ae(r,t,n,o,m),er[1]=ae(e,a,i,s,m),g=ai(Nr,er),g<c&&(h=m,c=g);c=1/0;for(var _=0;_<32&&!(v<Jb);_++)d=h-v,p=h+v,er[0]=ae(r,t,n,o,d),er[1]=ae(e,a,i,s,d),g=ai(er,Nr),d>=0&&g<c?(h=d,c=g):(oo[0]=ae(r,t,n,o,p),oo[1]=ae(e,a,i,s,p),y=ai(oo,Nr),p<=1&&y<c?(h=p,c=y):v*=.5);return f&&(f[0]=ae(r,t,n,o,h),f[1]=ae(e,a,i,s,h)),Ka(c)}function dE(r,e,t,a,n,i,o,s,l){for(var u=r,f=e,h=0,v=1/l,c=1;c<=l;c++){var d=c*v,p=ae(r,t,n,o,d),g=ae(e,a,i,s,d),y=p-u,m=g-f;h+=Math.sqrt(y*y+m*m),u=p,f=g}return h}function se(r,e,t,a){var n=1-a;return n*(n*r+2*a*e)+a*a*t}function Od(r,e,t,a){return 2*((1-a)*(e-r)+a*(t-e))}function pE(r,e,t,a,n){var i=r-2*e+t,o=2*(e-r),s=r-a,l=0;if($a(i)){if(Qb(o)){var u=-s/o;u>=0&&u<=1&&(n[l++]=u)}}else{var f=o*o-4*i*s;if($a(f)){var u=-o/(2*i);u>=0&&u<=1&&(n[l++]=u)}else if(f>0){var h=Ka(f),u=(-o+h)/(2*i),v=(-o-h)/(2*i);u>=0&&u<=1&&(n[l++]=u),v>=0&&v<=1&&(n[l++]=v)}}return l}function e2(r,e,t){var a=r+t-2*e;return a===0?.5:(r-e)/a}function $s(r,e,t,a,n){var i=(e-r)*a+r,o=(t-e)*a+e,s=(o-i)*a+i;n[0]=r,n[1]=i,n[2]=s,n[3]=s,n[4]=o,n[5]=t}function r2(r,e,t,a,n,i,o,s,l){var u,f=.005,h=1/0;Nr[0]=o,Nr[1]=s;for(var v=0;v<1;v+=.05){er[0]=se(r,t,n,v),er[1]=se(e,a,i,v);var c=ai(Nr,er);c<h&&(u=v,h=c)}h=1/0;for(var d=0;d<32&&!(f<Jb);d++){var p=u-f,g=u+f;er[0]=se(r,t,n,p),er[1]=se(e,a,i,p);var c=ai(er,Nr);if(p>=0&&c<h)u=p,h=c;else{oo[0]=se(r,t,n,g),oo[1]=se(e,a,i,g);var y=ai(oo,Nr);g<=1&&y<h?(u=g,h=y):f*=.5}}return l&&(l[0]=se(r,t,n,u),l[1]=se(e,a,i,u)),Ka(h)}function gE(r,e,t,a,n,i,o){for(var s=r,l=e,u=0,f=1/o,h=1;h<=o;h++){var v=h*f,c=se(r,t,n,v),d=se(e,a,i,v),p=c-s,g=d-l;u+=Math.sqrt(p*p+g*g),s=c,l=d}return u}var yE=/cubic-bezier\\(([0-9,\\.e ]+)\\)/;function Tg(r){var e=r&&yE.exec(r);if(e){var t=e[1].split(\",\"),a=+Sr(t[0]),n=+Sr(t[1]),i=+Sr(t[2]),o=+Sr(t[3]);if(isNaN(a+n+i+o))return;var s=[];return function(l){return l<=0?0:l>=1?1:mf(0,a,i,1,l,s)&&ae(0,n,o,1,s[0])}}}var mE=function(){function r(e){this._inited=!1,this._startTime=0,this._pausedTime=0,this._paused=!1,this._life=e.life||1e3,this._delay=e.delay||0,this.loop=e.loop||!1,this.onframe=e.onframe||Kt,this.ondestroy=e.ondestroy||Kt,this.onrestart=e.onrestart||Kt,e.easing&&this.setEasing(e.easing)}return r.prototype.step=function(e,t){if(this._inited||(this._startTime=e+this._delay,this._inited=!0),this._paused){this._pausedTime+=t;return}var a=this._life,n=e-this._startTime-this._pausedTime,i=n/a;i<0&&(i=0),i=Math.min(i,1);var o=this.easingFunc,s=o?o(i):i;if(this.onframe(s),i===1)if(this.loop){var l=n%a;this._startTime=e-l,this._pausedTime=0,this.onrestart()}else return!0;return!1},r.prototype.pause=function(){this._paused=!0},r.prototype.resume=function(){this._paused=!1},r.prototype.setEasing=function(e){this.easing=e,this.easingFunc=J(e)?e:Kb[e]||Tg(e)},r}(),_E=mE,a2=function(){function r(e){this.value=e}return r}(),SE=function(){function r(){this._len=0}return r.prototype.insert=function(e){var t=new a2(e);return this.insertEntry(t),t},r.prototype.insertEntry=function(e){this.head?(this.tail.next=e,e.prev=this.tail,e.next=null,this.tail=e):this.head=this.tail=e,this._len++},r.prototype.remove=function(e){var t=e.prev,a=e.next;t?t.next=a:this.head=a,a?a.prev=t:this.tail=t,e.next=e.prev=null,this._len--},r.prototype.len=function(){return this._len},r.prototype.clear=function(){this.head=this.tail=null,this._len=0},r}(),xE=function(){function r(e){this._list=new SE,this._maxSize=10,this._map={},this._maxSize=e}return r.prototype.put=function(e,t){var a=this._list,n=this._map,i=null;if(n[e]==null){var o=a.len(),s=this._lastRemovedEntry;if(o>=this._maxSize&&o>0){var l=a.head;a.remove(l),delete n[l.key],i=l.value,this._lastRemovedEntry=l}s?s.value=t:s=new a2(t),s.key=e,a.insertEntry(s),n[e]=s}return i},r.prototype.get=function(e){var t=this._map[e],a=this._list;if(t!=null)return t!==a.tail&&(a.remove(t),a.insertEntry(t)),t.value},r.prototype.clear=function(){this._list.clear(),this._map={}},r.prototype.len=function(){return this._list.len()},r}(),Sl=xE,Zm={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};function br(r){return r=Math.round(r),r<0?0:r>255?255:r}function wE(r){return r=Math.round(r),r<0?0:r>360?360:r}function Us(r){return r<0?0:r>1?1:r}function ov(r){var e=r;return e.length&&e.charAt(e.length-1)===\"%\"?br(parseFloat(e)/100*255):br(parseInt(e,10))}function ni(r){var e=r;return e.length&&e.charAt(e.length-1)===\"%\"?Us(parseFloat(e)/100):Us(parseFloat(e))}function sv(r,e,t){return t<0?t+=1:t>1&&(t-=1),t*6<1?r+(e-r)*t*6:t*2<1?e:t*3<2?r+(e-r)*(2/3-t)*6:r}function Ua(r,e,t){return r+(e-r)*t}function Ke(r,e,t,a,n){return r[0]=e,r[1]=t,r[2]=a,r[3]=n,r}function Bd(r,e){return r[0]=e[0],r[1]=e[1],r[2]=e[2],r[3]=e[3],r}var n2=new Sl(20),Zl=null;function Pi(r,e){Zl&&Bd(Zl,e),Zl=n2.put(r,Zl||e.slice())}function We(r,e){if(!!r){e=e||[];var t=n2.get(r);if(t)return Bd(e,t);r=r+\"\";var a=r.replace(/ /g,\"\").toLowerCase();if(a in Zm)return Bd(e,Zm[a]),Pi(r,e),e;var n=a.length;if(a.charAt(0)===\"#\"){if(n===4||n===5){var i=parseInt(a.slice(1,4),16);if(!(i>=0&&i<=4095)){Ke(e,0,0,0,1);return}return Ke(e,(i&3840)>>4|(i&3840)>>8,i&240|(i&240)>>4,i&15|(i&15)<<4,n===5?parseInt(a.slice(4),16)/15:1),Pi(r,e),e}else if(n===7||n===9){var i=parseInt(a.slice(1,7),16);if(!(i>=0&&i<=16777215)){Ke(e,0,0,0,1);return}return Ke(e,(i&16711680)>>16,(i&65280)>>8,i&255,n===9?parseInt(a.slice(7),16)/255:1),Pi(r,e),e}return}var o=a.indexOf(\"(\"),s=a.indexOf(\")\");if(o!==-1&&s+1===n){var l=a.substr(0,o),u=a.substr(o+1,s-(o+1)).split(\",\"),f=1;switch(l){case\"rgba\":if(u.length!==4)return u.length===3?Ke(e,+u[0],+u[1],+u[2],1):Ke(e,0,0,0,1);f=ni(u.pop());case\"rgb\":if(u.length>=3)return Ke(e,ov(u[0]),ov(u[1]),ov(u[2]),u.length===3?f:ni(u[3])),Pi(r,e),e;Ke(e,0,0,0,1);return;case\"hsla\":if(u.length!==4){Ke(e,0,0,0,1);return}return u[3]=ni(u[3]),Nd(u,e),Pi(r,e),e;case\"hsl\":if(u.length!==3){Ke(e,0,0,0,1);return}return Nd(u,e),Pi(r,e),e;default:return}}Ke(e,0,0,0,1)}}function Nd(r,e){var t=(parseFloat(r[0])%360+360)%360/360,a=ni(r[1]),n=ni(r[2]),i=n<=.5?n*(a+1):n+a-n*a,o=n*2-i;return e=e||[],Ke(e,br(sv(o,i,t+1/3)*255),br(sv(o,i,t)*255),br(sv(o,i,t-1/3)*255),1),r.length===4&&(e[3]=r[3]),e}function bE(r){if(!!r){var e=r[0]/255,t=r[1]/255,a=r[2]/255,n=Math.min(e,t,a),i=Math.max(e,t,a),o=i-n,s=(i+n)/2,l,u;if(o===0)l=0,u=0;else{s<.5?u=o/(i+n):u=o/(2-i-n);var f=((i-e)/6+o/2)/o,h=((i-t)/6+o/2)/o,v=((i-a)/6+o/2)/o;e===i?l=v-h:t===i?l=1/3+f-v:a===i&&(l=2/3+h-f),l<0&&(l+=1),l>1&&(l-=1)}var c=[l*360,u,s];return r[3]!=null&&c.push(r[3]),c}}function Vd(r,e){var t=We(r);if(t){for(var a=0;a<3;a++)e<0?t[a]=t[a]*(1-e)|0:t[a]=(255-t[a])*e+t[a]|0,t[a]>255?t[a]=255:t[a]<0&&(t[a]=0);return va(t,t.length===4?\"rgba\":\"rgb\")}}function lv(r,e,t){if(!(!(e&&e.length)||!(r>=0&&r<=1))){t=t||[];var a=r*(e.length-1),n=Math.floor(a),i=Math.ceil(a),o=e[n],s=e[i],l=a-n;return t[0]=br(Ua(o[0],s[0],l)),t[1]=br(Ua(o[1],s[1],l)),t[2]=br(Ua(o[2],s[2],l)),t[3]=Us(Ua(o[3],s[3],l)),t}}function CE(r,e,t){if(!(!(e&&e.length)||!(r>=0&&r<=1))){var a=r*(e.length-1),n=Math.floor(a),i=Math.ceil(a),o=We(e[n]),s=We(e[i]),l=a-n,u=va([br(Ua(o[0],s[0],l)),br(Ua(o[1],s[1],l)),br(Ua(o[2],s[2],l)),Us(Ua(o[3],s[3],l))],\"rgba\");return t?{color:u,leftIndex:n,rightIndex:i,value:a}:u}}function As(r,e,t,a){var n=We(r);if(r)return n=bE(n),e!=null&&(n[0]=wE(e)),t!=null&&(n[1]=ni(t)),a!=null&&(n[2]=ni(a)),va(Nd(n),\"rgba\")}function _f(r,e){var t=We(r);if(t&&e!=null)return t[3]=Us(e),va(t,\"rgba\")}function va(r,e){if(!(!r||!r.length)){var t=r[0]+\",\"+r[1]+\",\"+r[2];return(e===\"rgba\"||e===\"hsva\"||e===\"hsla\")&&(t+=\",\"+r[3]),e+\"(\"+t+\")\"}}function Sf(r,e){var t=We(r);return t?(.299*t[0]+.587*t[1]+.114*t[2])*t[3]/255+(1-t[3])*e:0}var xf=Math.round;function Ys(r){var e;if(!r||r===\"transparent\")r=\"none\";else if(typeof r==\"string\"&&r.indexOf(\"rgba\")>-1){var t=We(r);t&&(r=\"rgb(\"+t[0]+\",\"+t[1]+\",\"+t[2]+\")\",e=t[3])}return{color:r,opacity:e==null?1:e}}var Xm=1e-4;function Ya(r){return r<Xm&&r>-Xm}function Xl(r){return xf(r*1e3)/1e3}function zd(r){return xf(r*1e4)/1e4}function TE(r){return\"matrix(\"+Xl(r[0])+\",\"+Xl(r[1])+\",\"+Xl(r[2])+\",\"+Xl(r[3])+\",\"+zd(r[4])+\",\"+zd(r[5])+\")\"}var AE={left:\"start\",right:\"end\",center:\"middle\",middle:\"middle\"};function DE(r,e,t){return t===\"top\"?r+=e/2:t===\"bottom\"&&(r-=e/2),r}function ME(r){return r&&(r.shadowBlur||r.shadowOffsetX||r.shadowOffsetY)}function LE(r){var e=r.style,t=r.getGlobalScale();return[e.shadowColor,(e.shadowBlur||0).toFixed(2),(e.shadowOffsetX||0).toFixed(2),(e.shadowOffsetY||0).toFixed(2),t[0],t[1]].join(\",\")}function i2(r){return r&&!!r.image}function IE(r){return r&&!!r.svgElement}function Ag(r){return i2(r)||IE(r)}function o2(r){return r.type===\"linear\"}function s2(r){return r.type===\"radial\"}function l2(r){return r&&(r.type===\"linear\"||r.type===\"radial\")}function gh(r){return\"url(#\"+r+\")\"}function u2(r){var e=r.getGlobalScale(),t=Math.max(e[0],e[1]);return Math.max(Math.ceil(Math.log(t)/Math.log(10)),1)}function f2(r){var e=r.x||0,t=r.y||0,a=(r.rotation||0)*Yu,n=ft(r.scaleX,1),i=ft(r.scaleY,1),o=r.skewX||0,s=r.skewY||0,l=[];return(e||t)&&l.push(\"translate(\"+e+\"px,\"+t+\"px)\"),a&&l.push(\"rotate(\"+a+\")\"),(n!==1||i!==1)&&l.push(\"scale(\"+n+\",\"+i+\")\"),(o||s)&&l.push(\"skew(\"+xf(o*Yu)+\"deg, \"+xf(s*Yu)+\"deg)\"),l.join(\" \")}var PE=function(){return At.hasGlobalWindow&&J(window.btoa)?function(r){return window.btoa(unescape(encodeURIComponent(r)))}:typeof Buffer!=\"undefined\"?function(r){return Buffer.from(r).toString(\"base64\")}:function(r){return null}}(),Fd=Array.prototype.slice;function oa(r,e,t){return(e-r)*t+r}function uv(r,e,t,a){for(var n=e.length,i=0;i<n;i++)r[i]=oa(e[i],t[i],a);return r}function RE(r,e,t,a){for(var n=e.length,i=n&&e[0].length,o=0;o<n;o++){r[o]||(r[o]=[]);for(var s=0;s<i;s++)r[o][s]=oa(e[o][s],t[o][s],a)}return r}function ql(r,e,t,a){for(var n=e.length,i=0;i<n;i++)r[i]=e[i]+t[i]*a;return r}function qm(r,e,t,a){for(var n=e.length,i=n&&e[0].length,o=0;o<n;o++){r[o]||(r[o]=[]);for(var s=0;s<i;s++)r[o][s]=e[o][s]+t[o][s]*a}return r}function EE(r,e){for(var t=r.length,a=e.length,n=t>a?e:r,i=Math.min(t,a),o=n[i-1]||{color:[0,0,0,0],offset:0},s=i;s<Math.max(t,a);s++)n.push({offset:o.offset,color:o.color.slice()})}function kE(r,e,t){var a=r,n=e;if(!(!a.push||!n.push)){var i=a.length,o=n.length;if(i!==o){var s=i>o;if(s)a.length=o;else for(var l=i;l<o;l++)a.push(t===1?n[l]:Fd.call(n[l]))}for(var u=a[0]&&a[0].length,l=0;l<a.length;l++)if(t===1)isNaN(a[l])&&(a[l]=n[l]);else for(var f=0;f<u;f++)isNaN(a[l][f])&&(a[l][f]=n[l][f])}}function Ds(r){if(Se(r)){var e=r.length;if(Se(r[0])){for(var t=[],a=0;a<e;a++)t.push(Fd.call(r[a]));return t}return Fd.call(r)}return r}function Ju(r){return r[0]=Math.floor(r[0])||0,r[1]=Math.floor(r[1])||0,r[2]=Math.floor(r[2])||0,r[3]=r[3]==null?1:r[3],\"rgba(\"+r.join(\",\")+\")\"}function OE(r){return Se(r&&r[0])?2:1}var Kl=0,Qu=1,h2=2,ds=3,Gd=4,Hd=5,Km=6;function Jm(r){return r===Gd||r===Hd}function Jl(r){return r===Qu||r===h2}var Ho=[0,0,0,0],BE=function(){function r(e){this.keyframes=[],this.discrete=!1,this._invalid=!1,this._needsSort=!1,this._lastFr=0,this._lastFrP=0,this.propName=e}return r.prototype.isFinished=function(){return this._finished},r.prototype.setFinished=function(){this._finished=!0,this._additiveTrack&&this._additiveTrack.setFinished()},r.prototype.needsAnimate=function(){return this.keyframes.length>=1},r.prototype.getAdditiveTrack=function(){return this._additiveTrack},r.prototype.addKeyframe=function(e,t,a){this._needsSort=!0;var n=this.keyframes,i=n.length,o=!1,s=Km,l=t;if(Se(t)){var u=OE(t);s=u,(u===1&&!Mt(t[0])||u===2&&!Mt(t[0][0]))&&(o=!0)}else if(Mt(t)&&!Ws(t))s=Kl;else if(U(t))if(!isNaN(+t))s=Kl;else{var f=We(t);f&&(l=f,s=ds)}else if(ch(t)){var h=V({},l);h.colorStops=G(t.colorStops,function(c){return{offset:c.offset,color:We(c.color)}}),o2(t)?s=Gd:s2(t)&&(s=Hd),l=h}i===0?this.valType=s:(s!==this.valType||s===Km)&&(o=!0),this.discrete=this.discrete||o;var v={time:e,value:l,rawValue:t,percent:0};return a&&(v.easing=a,v.easingFunc=J(a)?a:Kb[a]||Tg(a)),n.push(v),v},r.prototype.prepare=function(e,t){var a=this.keyframes;this._needsSort&&a.sort(function(p,g){return p.time-g.time});for(var n=this.valType,i=a.length,o=a[i-1],s=this.discrete,l=Jl(n),u=Jm(n),f=0;f<i;f++){var h=a[f],v=h.value,c=o.value;h.percent=h.time/e,s||(l&&f!==i-1?kE(v,c,n):u&&EE(v.colorStops,c.colorStops))}if(!s&&n!==Hd&&t&&this.needsAnimate()&&t.needsAnimate()&&n===t.valType&&!t._finished){this._additiveTrack=t;for(var d=a[0].value,f=0;f<i;f++)n===Kl?a[f].additiveValue=a[f].value-d:n===ds?a[f].additiveValue=ql([],a[f].value,d,-1):Jl(n)&&(a[f].additiveValue=n===Qu?ql([],a[f].value,d,-1):qm([],a[f].value,d,-1))}},r.prototype.step=function(e,t){if(!this._finished){this._additiveTrack&&this._additiveTrack._finished&&(this._additiveTrack=null);var a=this._additiveTrack!=null,n=a?\"additiveValue\":\"value\",i=this.valType,o=this.keyframes,s=o.length,l=this.propName,u=i===ds,f,h=this._lastFr,v=Math.min,c,d;if(s===1)c=d=o[0];else{if(t<0)f=0;else if(t<this._lastFrP){var p=v(h+1,s-1);for(f=p;f>=0&&!(o[f].percent<=t);f--);f=v(f,s-2)}else{for(f=h;f<s&&!(o[f].percent>t);f++);f=v(f-1,s-2)}d=o[f+1],c=o[f]}if(!!(c&&d)){this._lastFr=f,this._lastFrP=t;var g=d.percent-c.percent,y=g===0?1:v((t-c.percent)/g,1);d.easingFunc&&(y=d.easingFunc(y));var m=a?this._additiveValue:u?Ho:e[l];if((Jl(i)||u)&&!m&&(m=this._additiveValue=[]),this.discrete)e[l]=y<1?c.rawValue:d.rawValue;else if(Jl(i))i===Qu?uv(m,c[n],d[n],y):RE(m,c[n],d[n],y);else if(Jm(i)){var _=c[n],S=d[n],w=i===Gd;e[l]={type:w?\"linear\":\"radial\",x:oa(_.x,S.x,y),y:oa(_.y,S.y,y),colorStops:G(_.colorStops,function(b,C){var T=S.colorStops[C];return{offset:oa(b.offset,T.offset,y),color:Ju(uv([],b.color,T.color,y))}}),global:S.global},w?(e[l].x2=oa(_.x2,S.x2,y),e[l].y2=oa(_.y2,S.y2,y)):e[l].r=oa(_.r,S.r,y)}else if(u)uv(m,c[n],d[n],y),a||(e[l]=Ju(m));else{var x=oa(c[n],d[n],y);a?this._additiveValue=x:e[l]=x}a&&this._addToTarget(e)}}},r.prototype._addToTarget=function(e){var t=this.valType,a=this.propName,n=this._additiveValue;t===Kl?e[a]=e[a]+n:t===ds?(We(e[a],Ho),ql(Ho,Ho,n,1),e[a]=Ju(Ho)):t===Qu?ql(e[a],e[a],n,1):t===h2&&qm(e[a],e[a],n,1)},r}(),Dg=function(){function r(e,t,a,n){if(this._tracks={},this._trackKeys=[],this._maxTime=0,this._started=0,this._clip=null,this._target=e,this._loop=t,t&&n){mg(\"Can' use additive animation on looped animation.\");return}this._additiveAnimators=n,this._allowDiscrete=a}return r.prototype.getMaxTime=function(){return this._maxTime},r.prototype.getDelay=function(){return this._delay},r.prototype.getLoop=function(){return this._loop},r.prototype.getTarget=function(){return this._target},r.prototype.changeTarget=function(e){this._target=e},r.prototype.when=function(e,t,a){return this.whenWithKeys(e,t,St(t),a)},r.prototype.whenWithKeys=function(e,t,a,n){for(var i=this._tracks,o=0;o<a.length;o++){var s=a[o],l=i[s];if(!l){l=i[s]=new BE(s);var u=void 0,f=this._getAdditiveTrack(s);if(f){var h=f.keyframes,v=h[h.length-1];u=v&&v.value,f.valType===ds&&u&&(u=Ju(u))}else u=this._target[s];if(u==null)continue;e>0&&l.addKeyframe(0,Ds(u),n),this._trackKeys.push(s)}l.addKeyframe(e,Ds(t[s]),n)}return this._maxTime=Math.max(this._maxTime,e),this},r.prototype.pause=function(){this._clip.pause(),this._paused=!0},r.prototype.resume=function(){this._clip.resume(),this._paused=!1},r.prototype.isPaused=function(){return!!this._paused},r.prototype.duration=function(e){return this._maxTime=e,this._force=!0,this},r.prototype._doneCallback=function(){this._setTracksFinished(),this._clip=null;var e=this._doneCbs;if(e)for(var t=e.length,a=0;a<t;a++)e[a].call(this)},r.prototype._abortedCallback=function(){this._setTracksFinished();var e=this.animation,t=this._abortedCbs;if(e&&e.removeClip(this._clip),this._clip=null,t)for(var a=0;a<t.length;a++)t[a].call(this)},r.prototype._setTracksFinished=function(){for(var e=this._tracks,t=this._trackKeys,a=0;a<t.length;a++)e[t[a]].setFinished()},r.prototype._getAdditiveTrack=function(e){var t,a=this._additiveAnimators;if(a)for(var n=0;n<a.length;n++){var i=a[n].getTrack(e);i&&(t=i)}return t},r.prototype.start=function(e){if(!(this._started>0)){this._started=1;for(var t=this,a=[],n=this._maxTime||0,i=0;i<this._trackKeys.length;i++){var o=this._trackKeys[i],s=this._tracks[o],l=this._getAdditiveTrack(o),u=s.keyframes,f=u.length;if(s.prepare(n,l),s.needsAnimate())if(!this._allowDiscrete&&s.discrete){var h=u[f-1];h&&(t._target[s.propName]=h.rawValue),s.setFinished()}else a.push(s)}if(a.length||this._force){var v=new _E({life:n,loop:this._loop,delay:this._delay||0,onframe:function(c){t._started=2;var d=t._additiveAnimators;if(d){for(var p=!1,g=0;g<d.length;g++)if(d[g]._clip){p=!0;break}p||(t._additiveAnimators=null)}for(var g=0;g<a.length;g++)a[g].step(t._target,c);var y=t._onframeCbs;if(y)for(var g=0;g<y.length;g++)y[g](t._target,c)},ondestroy:function(){t._doneCallback()}});this._clip=v,this.animation&&this.animation.addClip(v),e&&v.setEasing(e)}else this._doneCallback();return this}},r.prototype.stop=function(e){if(!!this._clip){var t=this._clip;e&&t.onframe(1),this._abortedCallback()}},r.prototype.delay=function(e){return this._delay=e,this},r.prototype.during=function(e){return e&&(this._onframeCbs||(this._onframeCbs=[]),this._onframeCbs.push(e)),this},r.prototype.done=function(e){return e&&(this._doneCbs||(this._doneCbs=[]),this._doneCbs.push(e)),this},r.prototype.aborted=function(e){return e&&(this._abortedCbs||(this._abortedCbs=[]),this._abortedCbs.push(e)),this},r.prototype.getClip=function(){return this._clip},r.prototype.getTrack=function(e){return this._tracks[e]},r.prototype.getTracks=function(){var e=this;return G(this._trackKeys,function(t){return e._tracks[t]})},r.prototype.stopTracks=function(e,t){if(!e.length||!this._clip)return!0;for(var a=this._tracks,n=this._trackKeys,i=0;i<e.length;i++){var o=a[e[i]];o&&!o.isFinished()&&(t?o.step(this._target,1):this._started===1&&o.step(this._target,0),o.setFinished())}for(var s=!0,i=0;i<n.length;i++)if(!a[n[i]].isFinished()){s=!1;break}return s&&this._abortedCallback(),s},r.prototype.saveTo=function(e,t,a){if(!!e){t=t||this._trackKeys;for(var n=0;n<t.length;n++){var i=t[n],o=this._tracks[i];if(!(!o||o.isFinished())){var s=o.keyframes,l=s[a?0:s.length-1];l&&(e[i]=Ds(l.rawValue))}}}},r.prototype.__changeFinalValue=function(e,t){t=t||St(e);for(var a=0;a<t.length;a++){var n=t[a],i=this._tracks[n];if(!!i){var o=i.keyframes;if(o.length>1){var s=o.pop();i.addKeyframe(s.time,e[n]),i.prepare(this._maxTime,i.getAdditiveTrack())}}}},r}();function ro(){return new Date().getTime()}var NE=function(r){k(e,r);function e(t){var a=r.call(this)||this;return a._running=!1,a._time=0,a._pausedTime=0,a._pauseStart=0,a._paused=!1,t=t||{},a.stage=t.stage||{},a}return e.prototype.addClip=function(t){t.animation&&this.removeClip(t),this._head?(this._tail.next=t,t.prev=this._tail,t.next=null,this._tail=t):this._head=this._tail=t,t.animation=this},e.prototype.addAnimator=function(t){t.animation=this;var a=t.getClip();a&&this.addClip(a)},e.prototype.removeClip=function(t){if(!!t.animation){var a=t.prev,n=t.next;a?a.next=n:this._head=n,n?n.prev=a:this._tail=a,t.next=t.prev=t.animation=null}},e.prototype.removeAnimator=function(t){var a=t.getClip();a&&this.removeClip(a),t.animation=null},e.prototype.update=function(t){for(var a=ro()-this._pausedTime,n=a-this._time,i=this._head;i;){var o=i.next,s=i.step(a,n);s&&(i.ondestroy(),this.removeClip(i)),i=o}this._time=a,t||(this.trigger(\"frame\",n),this.stage.update&&this.stage.update())},e.prototype._startLoop=function(){var t=this;this._running=!0;function a(){t._running&&(kd(a),!t._paused&&t.update())}kd(a)},e.prototype.start=function(){this._running||(this._time=ro(),this._pausedTime=0,this._startLoop())},e.prototype.stop=function(){this._running=!1},e.prototype.pause=function(){this._paused||(this._pauseStart=ro(),this._paused=!0)},e.prototype.resume=function(){this._paused&&(this._pausedTime+=ro()-this._pauseStart,this._paused=!1)},e.prototype.clear=function(){for(var t=this._head;t;){var a=t.next;t.prev=t.next=t.animation=null,t=a}this._head=this._tail=null},e.prototype.isFinished=function(){return this._head==null},e.prototype.animate=function(t,a){a=a||{},this.start();var n=new Dg(t,a.loop);return this.addAnimator(n),n},e}(hr),VE=NE,zE=300,fv=At.domSupported,hv=function(){var r=[\"click\",\"dblclick\",\"mousewheel\",\"wheel\",\"mouseout\",\"mouseup\",\"mousedown\",\"mousemove\",\"contextmenu\"],e=[\"touchstart\",\"touchend\",\"touchmove\"],t={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},a=G(r,function(n){var i=n.replace(\"mouse\",\"pointer\");return t.hasOwnProperty(i)?i:n});return{mouse:r,touch:e,pointer:a}}(),Qm={mouse:[\"mousemove\",\"mouseup\"],pointer:[\"pointermove\",\"pointerup\"]},jm=!1;function Wd(r){var e=r.pointerType;return e===\"pen\"||e===\"touch\"}function FE(r){r.touching=!0,r.touchTimer!=null&&(clearTimeout(r.touchTimer),r.touchTimer=null),r.touchTimer=setTimeout(function(){r.touching=!1,r.touchTimer=null},700)}function vv(r){r&&(r.zrByTouch=!0)}function GE(r,e){return Je(r.dom,new HE(r,e),!0)}function v2(r,e){for(var t=e,a=!1;t&&t.nodeType!==9&&!(a=t.domBelongToZr||t!==e&&t===r.painterRoot);)t=t.parentNode;return a}var HE=function(){function r(e,t){this.stopPropagation=Kt,this.stopImmediatePropagation=Kt,this.preventDefault=Kt,this.type=t.type,this.target=this.currentTarget=e.dom,this.pointerType=t.pointerType,this.clientX=t.clientX,this.clientY=t.clientY}return r}(),yr={mousedown:function(r){r=Je(this.dom,r),this.__mayPointerCapture=[r.zrX,r.zrY],this.trigger(\"mousedown\",r)},mousemove:function(r){r=Je(this.dom,r);var e=this.__mayPointerCapture;e&&(r.zrX!==e[0]||r.zrY!==e[1])&&this.__togglePointerCapture(!0),this.trigger(\"mousemove\",r)},mouseup:function(r){r=Je(this.dom,r),this.__togglePointerCapture(!1),this.trigger(\"mouseup\",r)},mouseout:function(r){r=Je(this.dom,r);var e=r.toElement||r.relatedTarget;v2(this,e)||(this.__pointerCapturing&&(r.zrEventControl=\"no_globalout\"),this.trigger(\"mouseout\",r))},wheel:function(r){jm=!0,r=Je(this.dom,r),this.trigger(\"mousewheel\",r)},mousewheel:function(r){jm||(r=Je(this.dom,r),this.trigger(\"mousewheel\",r))},touchstart:function(r){r=Je(this.dom,r),vv(r),this.__lastTouchMoment=new Date,this.handler.processGesture(r,\"start\"),yr.mousemove.call(this,r),yr.mousedown.call(this,r)},touchmove:function(r){r=Je(this.dom,r),vv(r),this.handler.processGesture(r,\"change\"),yr.mousemove.call(this,r)},touchend:function(r){r=Je(this.dom,r),vv(r),this.handler.processGesture(r,\"end\"),yr.mouseup.call(this,r),+new Date-+this.__lastTouchMoment<zE&&yr.click.call(this,r)},pointerdown:function(r){yr.mousedown.call(this,r)},pointermove:function(r){Wd(r)||yr.mousemove.call(this,r)},pointerup:function(r){yr.mouseup.call(this,r)},pointerout:function(r){Wd(r)||yr.mouseout.call(this,r)}};A([\"click\",\"dblclick\",\"contextmenu\"],function(r){yr[r]=function(e){e=Je(this.dom,e),this.trigger(r,e)}});var $d={pointermove:function(r){Wd(r)||$d.mousemove.call(this,r)},pointerup:function(r){$d.mouseup.call(this,r)},mousemove:function(r){this.trigger(\"mousemove\",r)},mouseup:function(r){var e=this.__pointerCapturing;this.__togglePointerCapture(!1),this.trigger(\"mouseup\",r),e&&(r.zrEventControl=\"only_globalout\",this.trigger(\"mouseout\",r))}};function WE(r,e){var t=e.domHandlers;At.pointerEventsSupported?A(hv.pointer,function(a){ju(e,a,function(n){t[a].call(r,n)})}):(At.touchEventsSupported&&A(hv.touch,function(a){ju(e,a,function(n){t[a].call(r,n),FE(e)})}),A(hv.mouse,function(a){ju(e,a,function(n){n=wg(n),e.touching||t[a].call(r,n)})}))}function $E(r,e){At.pointerEventsSupported?A(Qm.pointer,t):At.touchEventsSupported||A(Qm.mouse,t);function t(a){function n(i){i=wg(i),v2(r,i.target)||(i=GE(r,i),e.domHandlers[a].call(r,i))}ju(e,a,n,{capture:!0})}}function ju(r,e,t,a){r.mounted[e]=t,r.listenerOpts[e]=a,Ed(r.domTarget,e,t,a)}function cv(r){var e=r.mounted;for(var t in e)e.hasOwnProperty(t)&&JR(r.domTarget,t,e[t],r.listenerOpts[t]);r.mounted={}}var t0=function(){function r(e,t){this.mounted={},this.listenerOpts={},this.touching=!1,this.domTarget=e,this.domHandlers=t}return r}(),UE=function(r){k(e,r);function e(t,a){var n=r.call(this)||this;return n.__pointerCapturing=!1,n.dom=t,n.painterRoot=a,n._localHandlerScope=new t0(t,yr),fv&&(n._globalHandlerScope=new t0(document,$d)),WE(n,n._localHandlerScope),n}return e.prototype.dispose=function(){cv(this._localHandlerScope),fv&&cv(this._globalHandlerScope)},e.prototype.setCursor=function(t){this.dom.style&&(this.dom.style.cursor=t||\"default\")},e.prototype.__togglePointerCapture=function(t){if(this.__mayPointerCapture=null,fv&&+this.__pointerCapturing^+t){this.__pointerCapturing=t;var a=this._globalHandlerScope;t?$E(this,a):cv(a)}},e}(hr),YE=UE,c2=1;At.hasGlobalWindow&&(c2=Math.max(window.devicePixelRatio||window.screen&&window.screen.deviceXDPI/window.screen.logicalXDPI||1,1));var wf=c2,Ud=.4,Yd=\"#333\",Zd=\"#ccc\",ZE=\"#eee\",e0=ph,r0=5e-5;function mn(r){return r>r0||r<-r0}var _n=[],Ri=[],dv=ur(),pv=Math.abs,XE=function(){function r(){}return r.prototype.getLocalTransform=function(e){return r.getLocalTransform(this,e)},r.prototype.setPosition=function(e){this.x=e[0],this.y=e[1]},r.prototype.setScale=function(e){this.scaleX=e[0],this.scaleY=e[1]},r.prototype.setSkew=function(e){this.skewX=e[0],this.skewY=e[1]},r.prototype.setOrigin=function(e){this.originX=e[0],this.originY=e[1]},r.prototype.needLocalTransform=function(){return mn(this.rotation)||mn(this.x)||mn(this.y)||mn(this.scaleX-1)||mn(this.scaleY-1)||mn(this.skewX)||mn(this.skewY)},r.prototype.updateTransform=function(){var e=this.parent&&this.parent.transform,t=this.needLocalTransform(),a=this.transform;if(!(t||e)){a&&(e0(a),this.invTransform=null);return}a=a||ur(),t?this.getLocalTransform(a):e0(a),e&&(t?ha(a,e,a):bg(a,e)),this.transform=a,this._resolveGlobalScaleRatio(a)},r.prototype._resolveGlobalScaleRatio=function(e){var t=this.globalScaleRatio;if(t!=null&&t!==1){this.getGlobalScale(_n);var a=_n[0]<0?-1:1,n=_n[1]<0?-1:1,i=((_n[0]-a)*t+a)/_n[0]||0,o=((_n[1]-n)*t+n)/_n[1]||0;e[0]*=i,e[1]*=i,e[2]*=o,e[3]*=o}this.invTransform=this.invTransform||ur(),bo(this.invTransform,e)},r.prototype.getComputedTransform=function(){for(var e=this,t=[];e;)t.push(e),e=e.parent;for(;e=t.pop();)e.updateTransform();return this.transform},r.prototype.setLocalTransform=function(e){if(!!e){var t=e[0]*e[0]+e[1]*e[1],a=e[2]*e[2]+e[3]*e[3],n=Math.atan2(e[1],e[0]),i=Math.PI/2+n-Math.atan2(e[3],e[2]);a=Math.sqrt(a)*Math.cos(i),t=Math.sqrt(t),this.skewX=i,this.skewY=0,this.rotation=-n,this.x=+e[4],this.y=+e[5],this.scaleX=t,this.scaleY=a,this.originX=0,this.originY=0}},r.prototype.decomposeTransform=function(){if(!!this.transform){var e=this.parent,t=this.transform;e&&e.transform&&(ha(Ri,e.invTransform,t),t=Ri);var a=this.originX,n=this.originY;(a||n)&&(dv[4]=a,dv[5]=n,ha(Ri,t,dv),Ri[4]-=a,Ri[5]-=n,t=Ri),this.setLocalTransform(t)}},r.prototype.getGlobalScale=function(e){var t=this.transform;return e=e||[],t?(e[0]=Math.sqrt(t[0]*t[0]+t[1]*t[1]),e[1]=Math.sqrt(t[2]*t[2]+t[3]*t[3]),t[0]<0&&(e[0]=-e[0]),t[3]<0&&(e[1]=-e[1]),e):(e[0]=1,e[1]=1,e)},r.prototype.transformCoordToLocal=function(e,t){var a=[e,t],n=this.invTransform;return n&&he(a,a,n),a},r.prototype.transformCoordToGlobal=function(e,t){var a=[e,t],n=this.transform;return n&&he(a,a,n),a},r.prototype.getLineScale=function(){var e=this.transform;return e&&pv(e[0]-1)>1e-10&&pv(e[3]-1)>1e-10?Math.sqrt(pv(e[0]*e[3]-e[2]*e[1])):1},r.prototype.copyTransform=function(e){d2(this,e)},r.getLocalTransform=function(e,t){t=t||[];var a=e.originX||0,n=e.originY||0,i=e.scaleX,o=e.scaleY,s=e.anchorX,l=e.anchorY,u=e.rotation||0,f=e.x,h=e.y,v=e.skewX?Math.tan(e.skewX):0,c=e.skewY?Math.tan(-e.skewY):0;if(a||n||s||l){var d=a+s,p=n+l;t[4]=-d*i-v*p*o,t[5]=-p*o-c*d*i}else t[4]=t[5]=0;return t[0]=i,t[3]=o,t[1]=c*i,t[2]=v*o,u&&bi(t,t,u),t[4]+=a+f,t[5]+=n+h,t},r.initDefaultProps=function(){var e=r.prototype;e.scaleX=e.scaleY=e.globalScaleRatio=1,e.x=e.y=e.originX=e.originY=e.skewX=e.skewY=e.rotation=e.anchorX=e.anchorY=0}(),r}(),qr=[\"x\",\"y\",\"originX\",\"originY\",\"anchorX\",\"anchorY\",\"rotation\",\"scaleX\",\"scaleY\",\"skewX\",\"skewY\"];function d2(r,e){for(var t=0;t<qr.length;t++){var a=qr[t];r[a]=e[a]}}var la=XE,a0={};function $e(r,e){e=e||tn;var t=a0[e];t||(t=a0[e]=new Sl(500));var a=t.get(r);return a==null&&(a=ga.measureText(r,e).width,t.put(r,a)),a}function n0(r,e,t,a){var n=$e(r,e),i=yh(e),o=ps(0,n,t),s=Qi(0,i,a),l=new vt(o,s,n,i);return l}function xl(r,e,t,a){var n=((r||\"\")+\"\").split(`\n`),i=n.length;if(i===1)return n0(n[0],e,t,a);for(var o=new vt(0,0,0,0),s=0;s<n.length;s++){var l=n0(n[s],e,t,a);s===0?o.copy(l):o.union(l)}return o}function ps(r,e,t){return t===\"right\"?r-=e:t===\"center\"&&(r-=e/2),r}function Qi(r,e,t){return t===\"middle\"?r-=e/2:t===\"bottom\"&&(r-=e),r}function yh(r){return $e(\"\\u56FD\",r)}function Tr(r,e){return typeof r==\"string\"?r.lastIndexOf(\"%\")>=0?parseFloat(r)/100*e:parseFloat(r):r}function bf(r,e,t){var a=e.position||\"inside\",n=e.distance!=null?e.distance:5,i=t.height,o=t.width,s=i/2,l=t.x,u=t.y,f=\"left\",h=\"top\";if(a instanceof Array)l+=Tr(a[0],t.width),u+=Tr(a[1],t.height),f=null,h=null;else switch(a){case\"left\":l-=n,u+=s,f=\"right\",h=\"middle\";break;case\"right\":l+=n+o,u+=s,h=\"middle\";break;case\"top\":l+=o/2,u-=n,f=\"center\",h=\"bottom\";break;case\"bottom\":l+=o/2,u+=i+n,f=\"center\";break;case\"inside\":l+=o/2,u+=s,f=\"center\",h=\"middle\";break;case\"insideLeft\":l+=n,u+=s,h=\"middle\";break;case\"insideRight\":l+=o-n,u+=s,f=\"right\",h=\"middle\";break;case\"insideTop\":l+=o/2,u+=n,f=\"center\";break;case\"insideBottom\":l+=o/2,u+=i-n,f=\"center\",h=\"bottom\";break;case\"insideTopLeft\":l+=n,u+=n;break;case\"insideTopRight\":l+=o-n,u+=n,f=\"right\";break;case\"insideBottomLeft\":l+=n,u+=i-n,h=\"bottom\";break;case\"insideBottomRight\":l+=o-n,u+=i-n,f=\"right\",h=\"bottom\";break}return r=r||{},r.x=l,r.y=u,r.align=f,r.verticalAlign=h,r}var gv=\"__zr_normal__\",yv=qr.concat([\"ignore\"]),qE=Zr(qr,function(r,e){return r[e]=!0,r},{ignore:!1}),Ei={},KE=new vt(0,0,0,0),Mg=function(){function r(e){this.id=Fb(),this.animators=[],this.currentStates=[],this.states={},this._init(e)}return r.prototype._init=function(e){this.attr(e)},r.prototype.drift=function(e,t,a){switch(this.draggable){case\"horizontal\":t=0;break;case\"vertical\":e=0;break}var n=this.transform;n||(n=this.transform=[1,0,0,1,0,0]),n[4]+=e,n[5]+=t,this.decomposeTransform(),this.markRedraw()},r.prototype.beforeUpdate=function(){},r.prototype.afterUpdate=function(){},r.prototype.update=function(){this.updateTransform(),this.__dirty&&this.updateInnerText()},r.prototype.updateInnerText=function(e){var t=this._textContent;if(t&&(!t.ignore||e)){this.textConfig||(this.textConfig={});var a=this.textConfig,n=a.local,i=t.innerTransformable,o=void 0,s=void 0,l=!1;i.parent=n?this:null;var u=!1;if(i.copyTransform(t),a.position!=null){var f=KE;a.layoutRect?f.copy(a.layoutRect):f.copy(this.getBoundingRect()),n||f.applyTransform(this.transform),this.calculateTextPosition?this.calculateTextPosition(Ei,a,f):bf(Ei,a,f),i.x=Ei.x,i.y=Ei.y,o=Ei.align,s=Ei.verticalAlign;var h=a.origin;if(h&&a.rotation!=null){var v=void 0,c=void 0;h===\"center\"?(v=f.width*.5,c=f.height*.5):(v=Tr(h[0],f.width),c=Tr(h[1],f.height)),u=!0,i.originX=-i.x+v+(n?0:f.x),i.originY=-i.y+c+(n?0:f.y)}}a.rotation!=null&&(i.rotation=a.rotation);var d=a.offset;d&&(i.x+=d[0],i.y+=d[1],u||(i.originX=-d[0],i.originY=-d[1]));var p=a.inside==null?typeof a.position==\"string\"&&a.position.indexOf(\"inside\")>=0:a.inside,g=this._innerTextDefaultStyle||(this._innerTextDefaultStyle={}),y=void 0,m=void 0,_=void 0;p&&this.canBeInsideText()?(y=a.insideFill,m=a.insideStroke,(y==null||y===\"auto\")&&(y=this.getInsideTextFill()),(m==null||m===\"auto\")&&(m=this.getInsideTextStroke(y),_=!0)):(y=a.outsideFill,m=a.outsideStroke,(y==null||y===\"auto\")&&(y=this.getOutsideFill()),(m==null||m===\"auto\")&&(m=this.getOutsideStroke(y),_=!0)),y=y||\"#000\",(y!==g.fill||m!==g.stroke||_!==g.autoStroke||o!==g.align||s!==g.verticalAlign)&&(l=!0,g.fill=y,g.stroke=m,g.autoStroke=_,g.align=o,g.verticalAlign=s,t.setDefaultTextStyle(g)),t.__dirty|=He,l&&t.dirtyStyle(!0)}},r.prototype.canBeInsideText=function(){return!0},r.prototype.getInsideTextFill=function(){return\"#fff\"},r.prototype.getInsideTextStroke=function(e){return\"#000\"},r.prototype.getOutsideFill=function(){return this.__zr&&this.__zr.isDarkMode()?Zd:Yd},r.prototype.getOutsideStroke=function(e){var t=this.__zr&&this.__zr.getBackgroundColor(),a=typeof t==\"string\"&&We(t);a||(a=[255,255,255,1]);for(var n=a[3],i=this.__zr.isDarkMode(),o=0;o<3;o++)a[o]=a[o]*n+(i?0:255)*(1-n);return a[3]=1,va(a,\"rgba\")},r.prototype.traverse=function(e,t){},r.prototype.attrKV=function(e,t){e===\"textConfig\"?this.setTextConfig(t):e===\"textContent\"?this.setTextContent(t):e===\"clipPath\"?this.setClipPath(t):e===\"extra\"?(this.extra=this.extra||{},V(this.extra,t)):this[e]=t},r.prototype.hide=function(){this.ignore=!0,this.markRedraw()},r.prototype.show=function(){this.ignore=!1,this.markRedraw()},r.prototype.attr=function(e,t){if(typeof e==\"string\")this.attrKV(e,t);else if(et(e))for(var a=e,n=St(a),i=0;i<n.length;i++){var o=n[i];this.attrKV(o,e[o])}return this.markRedraw(),this},r.prototype.saveCurrentToNormalState=function(e){this._innerSaveToNormal(e);for(var t=this._normalState,a=0;a<this.animators.length;a++){var n=this.animators[a],i=n.__fromStateTransition;if(!(n.getLoop()||i&&i!==gv)){var o=n.targetName,s=o?t[o]:t;n.saveTo(s)}}},r.prototype._innerSaveToNormal=function(e){var t=this._normalState;t||(t=this._normalState={}),e.textConfig&&!t.textConfig&&(t.textConfig=this.textConfig),this._savePrimaryToNormal(e,t,yv)},r.prototype._savePrimaryToNormal=function(e,t,a){for(var n=0;n<a.length;n++){var i=a[n];e[i]!=null&&!(i in t)&&(t[i]=this[i])}},r.prototype.hasState=function(){return this.currentStates.length>0},r.prototype.getState=function(e){return this.states[e]},r.prototype.ensureState=function(e){var t=this.states;return t[e]||(t[e]={}),t[e]},r.prototype.clearStates=function(e){this.useState(gv,!1,e)},r.prototype.useState=function(e,t,a,n){var i=e===gv,o=this.hasState();if(!(!o&&i)){var s=this.currentStates,l=this.stateTransition;if(!(dt(s,e)>=0&&(t||s.length===1))){var u;if(this.stateProxy&&!i&&(u=this.stateProxy(e)),u||(u=this.states&&this.states[e]),!u&&!i){mg(\"State \"+e+\" not exists.\");return}i||this.saveCurrentToNormalState(u);var f=!!(u&&u.hoverLayer||n);f&&this._toggleHoverLayerFlag(!0),this._applyStateObj(e,u,this._normalState,t,!a&&!this.__inHover&&l&&l.duration>0,l);var h=this._textContent,v=this._textGuide;return h&&h.useState(e,t,a,f),v&&v.useState(e,t,a,f),i?(this.currentStates=[],this._normalState={}):t?this.currentStates.push(e):this.currentStates=[e],this._updateAnimationTargets(),this.markRedraw(),!f&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=~He),u}}},r.prototype.useStates=function(e,t,a){if(!e.length)this.clearStates();else{var n=[],i=this.currentStates,o=e.length,s=o===i.length;if(s){for(var l=0;l<o;l++)if(e[l]!==i[l]){s=!1;break}}if(s)return;for(var l=0;l<o;l++){var u=e[l],f=void 0;this.stateProxy&&(f=this.stateProxy(u,e)),f||(f=this.states[u]),f&&n.push(f)}var h=n[o-1],v=!!(h&&h.hoverLayer||a);v&&this._toggleHoverLayerFlag(!0);var c=this._mergeStates(n),d=this.stateTransition;this.saveCurrentToNormalState(c),this._applyStateObj(e.join(\",\"),c,this._normalState,!1,!t&&!this.__inHover&&d&&d.duration>0,d);var p=this._textContent,g=this._textGuide;p&&p.useStates(e,t,v),g&&g.useStates(e,t,v),this._updateAnimationTargets(),this.currentStates=e.slice(),this.markRedraw(),!v&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=~He)}},r.prototype._updateAnimationTargets=function(){for(var e=0;e<this.animators.length;e++){var t=this.animators[e];t.targetName&&t.changeTarget(this[t.targetName])}},r.prototype.removeState=function(e){var t=dt(this.currentStates,e);if(t>=0){var a=this.currentStates.slice();a.splice(t,1),this.useStates(a)}},r.prototype.replaceState=function(e,t,a){var n=this.currentStates.slice(),i=dt(n,e),o=dt(n,t)>=0;i>=0?o?n.splice(i,1):n[i]=t:a&&!o&&n.push(t),this.useStates(n)},r.prototype.toggleState=function(e,t){t?this.useState(e,!0):this.removeState(e)},r.prototype._mergeStates=function(e){for(var t={},a,n=0;n<e.length;n++){var i=e[n];V(t,i),i.textConfig&&(a=a||{},V(a,i.textConfig))}return a&&(t.textConfig=a),t},r.prototype._applyStateObj=function(e,t,a,n,i,o){var s=!(t&&n);t&&t.textConfig?(this.textConfig=V({},n?this.textConfig:a.textConfig),V(this.textConfig,t.textConfig)):s&&a.textConfig&&(this.textConfig=a.textConfig);for(var l={},u=!1,f=0;f<yv.length;f++){var h=yv[f],v=i&&qE[h];t&&t[h]!=null?v?(u=!0,l[h]=t[h]):this[h]=t[h]:s&&a[h]!=null&&(v?(u=!0,l[h]=a[h]):this[h]=a[h])}if(!i)for(var f=0;f<this.animators.length;f++){var c=this.animators[f],d=c.targetName;c.getLoop()||c.__changeFinalValue(d?(t||a)[d]:t||a)}u&&this._transitionState(e,l,o)},r.prototype._attachComponent=function(e){if(!(e.__zr&&!e.__hostTarget)&&e!==this){var t=this.__zr;t&&e.addSelfToZr(t),e.__zr=t,e.__hostTarget=this}},r.prototype._detachComponent=function(e){e.__zr&&e.removeSelfFromZr(e.__zr),e.__zr=null,e.__hostTarget=null},r.prototype.getClipPath=function(){return this._clipPath},r.prototype.setClipPath=function(e){this._clipPath&&this._clipPath!==e&&this.removeClipPath(),this._attachComponent(e),this._clipPath=e,this.markRedraw()},r.prototype.removeClipPath=function(){var e=this._clipPath;e&&(this._detachComponent(e),this._clipPath=null,this.markRedraw())},r.prototype.getTextContent=function(){return this._textContent},r.prototype.setTextContent=function(e){var t=this._textContent;t!==e&&(t&&t!==e&&this.removeTextContent(),e.innerTransformable=new la,this._attachComponent(e),this._textContent=e,this.markRedraw())},r.prototype.setTextConfig=function(e){this.textConfig||(this.textConfig={}),V(this.textConfig,e),this.markRedraw()},r.prototype.removeTextConfig=function(){this.textConfig=null,this.markRedraw()},r.prototype.removeTextContent=function(){var e=this._textContent;e&&(e.innerTransformable=null,this._detachComponent(e),this._textContent=null,this._innerTextDefaultStyle=null,this.markRedraw())},r.prototype.getTextGuideLine=function(){return this._textGuide},r.prototype.setTextGuideLine=function(e){this._textGuide&&this._textGuide!==e&&this.removeTextGuideLine(),this._attachComponent(e),this._textGuide=e,this.markRedraw()},r.prototype.removeTextGuideLine=function(){var e=this._textGuide;e&&(this._detachComponent(e),this._textGuide=null,this.markRedraw())},r.prototype.markRedraw=function(){this.__dirty|=He;var e=this.__zr;e&&(this.__inHover?e.refreshHover():e.refresh()),this.__hostTarget&&this.__hostTarget.markRedraw()},r.prototype.dirty=function(){this.markRedraw()},r.prototype._toggleHoverLayerFlag=function(e){this.__inHover=e;var t=this._textContent,a=this._textGuide;t&&(t.__inHover=e),a&&(a.__inHover=e)},r.prototype.addSelfToZr=function(e){if(this.__zr!==e){this.__zr=e;var t=this.animators;if(t)for(var a=0;a<t.length;a++)e.animation.addAnimator(t[a]);this._clipPath&&this._clipPath.addSelfToZr(e),this._textContent&&this._textContent.addSelfToZr(e),this._textGuide&&this._textGuide.addSelfToZr(e)}},r.prototype.removeSelfFromZr=function(e){if(!!this.__zr){this.__zr=null;var t=this.animators;if(t)for(var a=0;a<t.length;a++)e.animation.removeAnimator(t[a]);this._clipPath&&this._clipPath.removeSelfFromZr(e),this._textContent&&this._textContent.removeSelfFromZr(e),this._textGuide&&this._textGuide.removeSelfFromZr(e)}},r.prototype.animate=function(e,t,a){var n=e?this[e]:this,i=new Dg(n,t,a);return e&&(i.targetName=e),this.addAnimator(i,e),i},r.prototype.addAnimator=function(e,t){var a=this.__zr,n=this;e.during(function(){n.updateDuringAnimation(t)}).done(function(){var i=n.animators,o=dt(i,e);o>=0&&i.splice(o,1)}),this.animators.push(e),a&&a.animation.addAnimator(e),a&&a.wakeUp()},r.prototype.updateDuringAnimation=function(e){this.markRedraw()},r.prototype.stopAnimation=function(e,t){for(var a=this.animators,n=a.length,i=[],o=0;o<n;o++){var s=a[o];!e||e===s.scope?s.stop(t):i.push(s)}return this.animators=i,this},r.prototype.animateTo=function(e,t,a){mv(this,e,t,a)},r.prototype.animateFrom=function(e,t,a){mv(this,e,t,a,!0)},r.prototype._transitionState=function(e,t,a,n){for(var i=mv(this,t,a,n),o=0;o<i.length;o++)i[o].__fromStateTransition=e},r.prototype.getBoundingRect=function(){return null},r.prototype.getPaintRect=function(){return null},r.initDefaultProps=function(){var e=r.prototype;e.type=\"element\",e.name=\"\",e.ignore=e.silent=e.isGroup=e.draggable=e.dragging=e.ignoreClip=e.__inHover=!1,e.__dirty=He;function t(a,n,i,o){Object.defineProperty(e,a,{get:function(){if(!this[n]){var l=this[n]=[];s(this,l)}return this[n]},set:function(l){this[i]=l[0],this[o]=l[1],this[n]=l,s(this,l)}});function s(l,u){Object.defineProperty(u,0,{get:function(){return l[i]},set:function(f){l[i]=f}}),Object.defineProperty(u,1,{get:function(){return l[o]},set:function(f){l[o]=f}})}}Object.defineProperty&&(t(\"position\",\"_legacyPos\",\"x\",\"y\"),t(\"scale\",\"_legacyScale\",\"scaleX\",\"scaleY\"),t(\"origin\",\"_legacyOrigin\",\"originX\",\"originY\"))}(),r}();te(Mg,hr);te(Mg,la);function mv(r,e,t,a,n){t=t||{};var i=[];p2(r,\"\",r,e,t,a,i,n);var o=i.length,s=!1,l=t.done,u=t.aborted,f=function(){s=!0,o--,o<=0&&(s?l&&l():u&&u())},h=function(){o--,o<=0&&(s?l&&l():u&&u())};o||l&&l(),i.length>0&&t.during&&i[0].during(function(d,p){t.during(p)});for(var v=0;v<i.length;v++){var c=i[v];f&&c.done(f),h&&c.aborted(h),t.force&&c.duration(t.duration),c.start(t.easing)}return i}function _v(r,e,t){for(var a=0;a<t;a++)r[a]=e[a]}function JE(r){return Se(r[0])}function QE(r,e,t){if(Se(e[t]))if(Se(r[t])||(r[t]=[]),Ue(e[t])){var a=e[t].length;r[t].length!==a&&(r[t]=new e[t].constructor(a),_v(r[t],e[t],a))}else{var n=e[t],i=r[t],o=n.length;if(JE(n))for(var s=n[0].length,l=0;l<o;l++)i[l]?_v(i[l],n[l],s):i[l]=Array.prototype.slice.call(n[l]);else _v(i,n,o);i.length=n.length}else r[t]=e[t]}function jE(r,e){return r===e||Se(r)&&Se(e)&&tk(r,e)}function tk(r,e){var t=r.length;if(t!==e.length)return!1;for(var a=0;a<t;a++)if(r[a]!==e[a])return!1;return!0}function p2(r,e,t,a,n,i,o,s){for(var l=St(a),u=n.duration,f=n.delay,h=n.additive,v=n.setToFinal,c=!et(i),d=r.animators,p=[],g=0;g<l.length;g++){var y=l[g],m=a[y];if(m!=null&&t[y]!=null&&(c||i[y]))if(et(m)&&!Se(m)&&!ch(m)){if(e){s||(t[y]=m,r.updateDuringAnimation(e));continue}p2(r,y,t[y],m,n,i&&i[y],o,s)}else p.push(y);else s||(t[y]=m,r.updateDuringAnimation(e),p.push(y))}var _=p.length;if(!h&&_)for(var S=0;S<d.length;S++){var w=d[S];if(w.targetName===e){var x=w.stopTracks(p);if(x){var b=dt(d,w);d.splice(b,1)}}}if(n.force||(p=Et(p,function(M){return!jE(a[M],t[M])}),_=p.length),_>0||n.force&&!o.length){var C=void 0,T=void 0,D=void 0;if(s){T={},v&&(C={});for(var S=0;S<_;S++){var y=p[S];T[y]=t[y],v?C[y]=a[y]:t[y]=a[y]}}else if(v){D={};for(var S=0;S<_;S++){var y=p[S];D[y]=Ds(t[y]),QE(t,a,y)}}var w=new Dg(t,!1,!1,h?Et(d,function(L){return L.targetName===e}):null);w.targetName=e,n.scope&&(w.scope=n.scope),v&&C&&w.whenWithKeys(0,C,p),D&&w.whenWithKeys(0,D,p),w.whenWithKeys(u==null?500:u,s?T:a,p).delay(f||0),r.addAnimator(w,e),o.push(w)}}var g2=Mg,y2=function(r){k(e,r);function e(t){var a=r.call(this)||this;return a.isGroup=!0,a._children=[],a.attr(t),a}return e.prototype.childrenRef=function(){return this._children},e.prototype.children=function(){return this._children.slice()},e.prototype.childAt=function(t){return this._children[t]},e.prototype.childOfName=function(t){for(var a=this._children,n=0;n<a.length;n++)if(a[n].name===t)return a[n]},e.prototype.childCount=function(){return this._children.length},e.prototype.add=function(t){return t&&t!==this&&t.parent!==this&&(this._children.push(t),this._doAdd(t)),this},e.prototype.addBefore=function(t,a){if(t&&t!==this&&t.parent!==this&&a&&a.parent===this){var n=this._children,i=n.indexOf(a);i>=0&&(n.splice(i,0,t),this._doAdd(t))}return this},e.prototype.replace=function(t,a){var n=dt(this._children,t);return n>=0&&this.replaceAt(a,n),this},e.prototype.replaceAt=function(t,a){var n=this._children,i=n[a];if(t&&t!==this&&t.parent!==this&&t!==i){n[a]=t,i.parent=null;var o=this.__zr;o&&i.removeSelfFromZr(o),this._doAdd(t)}return this},e.prototype._doAdd=function(t){t.parent&&t.parent.remove(t),t.parent=this;var a=this.__zr;a&&a!==t.__zr&&t.addSelfToZr(a),a&&a.refresh()},e.prototype.remove=function(t){var a=this.__zr,n=this._children,i=dt(n,t);return i<0?this:(n.splice(i,1),t.parent=null,a&&t.removeSelfFromZr(a),a&&a.refresh(),this)},e.prototype.removeAll=function(){for(var t=this._children,a=this.__zr,n=0;n<t.length;n++){var i=t[n];a&&i.removeSelfFromZr(a),i.parent=null}return t.length=0,this},e.prototype.eachChild=function(t,a){for(var n=this._children,i=0;i<n.length;i++){var o=n[i];t.call(a,o,i)}return this},e.prototype.traverse=function(t,a){for(var n=0;n<this._children.length;n++){var i=this._children[n],o=t.call(a,i);i.isGroup&&!o&&i.traverse(t,a)}return this},e.prototype.addSelfToZr=function(t){r.prototype.addSelfToZr.call(this,t);for(var a=0;a<this._children.length;a++){var n=this._children[a];n.addSelfToZr(t)}},e.prototype.removeSelfFromZr=function(t){r.prototype.removeSelfFromZr.call(this,t);for(var a=0;a<this._children.length;a++){var n=this._children[a];n.removeSelfFromZr(t)}},e.prototype.getBoundingRect=function(t){for(var a=new vt(0,0,0,0),n=t||this._children,i=[],o=null,s=0;s<n.length;s++){var l=n[s];if(!(l.ignore||l.invisible)){var u=l.getBoundingRect(),f=l.getLocalTransform(i);f?(vt.applyTransform(a,u,f),o=o||a.clone(),o.union(a)):(o=o||u.clone(),o.union(u))}}return o||a},e}(g2);y2.prototype.type=\"group\";var nt=y2;/*!\n* ZRender, a high performance 2d drawing library.\n*\n* Copyright (c) 2013, Baidu Inc.\n* All rights reserved.\n*\n* LICENSE\n* https://github.com/ecomfe/zrender/blob/master/LICENSE.txt\n*/var tf={},m2={};function ek(r){delete m2[r]}function rk(r){if(!r)return!1;if(typeof r==\"string\")return Sf(r,1)<Ud;if(r.colorStops){for(var e=r.colorStops,t=0,a=e.length,n=0;n<a;n++)t+=Sf(e[n].color,1);return t/=a,t<Ud}return!1}var ak=function(){function r(e,t,a){var n=this;this._sleepAfterStill=10,this._stillFrameAccum=0,this._needsRefresh=!0,this._needsRefreshHover=!0,this._darkMode=!1,a=a||{},this.dom=t,this.id=e;var i=new cE,o=a.renderer||\"canvas\";tf[o]||(o=St(tf)[0]),a.useDirtyRect=a.useDirtyRect==null?!1:a.useDirtyRect;var s=new tf[o](t,i,a,e),l=a.ssr||s.ssrOnly;this.storage=i,this.painter=s;var u=!At.node&&!At.worker&&!l?new YE(s.getViewportRoot(),s.root):null,f=a.useCoarsePointer,h=f==null||f===\"auto\"?At.touchEventsSupported:!!f,v=44,c;h&&(c=ft(a.pointerSize,v)),this.handler=new lE(i,s,u,s.root,c),this.animation=new VE({stage:{update:l?null:function(){return n._flush(!0)}}}),l||this.animation.start()}return r.prototype.add=function(e){!e||(this.storage.addRoot(e),e.addSelfToZr(this),this.refresh())},r.prototype.remove=function(e){!e||(this.storage.delRoot(e),e.removeSelfFromZr(this),this.refresh())},r.prototype.configLayer=function(e,t){this.painter.configLayer&&this.painter.configLayer(e,t),this.refresh()},r.prototype.setBackgroundColor=function(e){this.painter.setBackgroundColor&&this.painter.setBackgroundColor(e),this.refresh(),this._backgroundColor=e,this._darkMode=rk(e)},r.prototype.getBackgroundColor=function(){return this._backgroundColor},r.prototype.setDarkMode=function(e){this._darkMode=e},r.prototype.isDarkMode=function(){return this._darkMode},r.prototype.refreshImmediately=function(e){e||this.animation.update(!0),this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},r.prototype.refresh=function(){this._needsRefresh=!0,this.animation.start()},r.prototype.flush=function(){this._flush(!1)},r.prototype._flush=function(e){var t,a=ro();this._needsRefresh&&(t=!0,this.refreshImmediately(e)),this._needsRefreshHover&&(t=!0,this.refreshHoverImmediately());var n=ro();t?(this._stillFrameAccum=0,this.trigger(\"rendered\",{elapsedTime:n-a})):this._sleepAfterStill>0&&(this._stillFrameAccum++,this._stillFrameAccum>this._sleepAfterStill&&this.animation.stop())},r.prototype.setSleepAfterStill=function(e){this._sleepAfterStill=e},r.prototype.wakeUp=function(){this.animation.start(),this._stillFrameAccum=0},r.prototype.refreshHover=function(){this._needsRefreshHover=!0},r.prototype.refreshHoverImmediately=function(){this._needsRefreshHover=!1,this.painter.refreshHover&&this.painter.getType()===\"canvas\"&&this.painter.refreshHover()},r.prototype.resize=function(e){e=e||{},this.painter.resize(e.width,e.height),this.handler.resize()},r.prototype.clearAnimation=function(){this.animation.clear()},r.prototype.getWidth=function(){return this.painter.getWidth()},r.prototype.getHeight=function(){return this.painter.getHeight()},r.prototype.setCursorStyle=function(e){this.handler.setCursorStyle(e)},r.prototype.findHover=function(e,t){return this.handler.findHover(e,t)},r.prototype.on=function(e,t,a){return this.handler.on(e,t,a),this},r.prototype.off=function(e,t){this.handler.off(e,t)},r.prototype.trigger=function(e,t){this.handler.trigger(e,t)},r.prototype.clear=function(){for(var e=this.storage.getRoots(),t=0;t<e.length;t++)e[t]instanceof nt&&e[t].removeSelfFromZr(this);this.storage.delAllRoots(),this.painter.clear()},r.prototype.dispose=function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,ek(this.id)},r}();function i0(r,e){var t=new ak(Fb(),r,e);return m2[t.id]=t,t}function nk(r,e){tf[r]=e}var o0=1e-4,_2=20;function ik(r){return r.replace(/^\\s+|\\s+$/g,\"\")}function Rt(r,e,t,a){var n=e[0],i=e[1],o=t[0],s=t[1],l=i-n,u=s-o;if(l===0)return u===0?o:(o+s)/2;if(a)if(l>0){if(r<=n)return o;if(r>=i)return s}else{if(r>=n)return o;if(r<=i)return s}else{if(r===n)return o;if(r===i)return s}return(r-n)/l*u+o}function W(r,e){switch(r){case\"center\":case\"middle\":r=\"50%\";break;case\"left\":case\"top\":r=\"0%\";break;case\"right\":case\"bottom\":r=\"100%\";break}return U(r)?ik(r).match(/%$/)?parseFloat(r)/100*e:parseFloat(r):r==null?NaN:+r}function Zt(r,e,t){return e==null&&(e=10),e=Math.min(Math.max(0,e),_2),r=(+r).toFixed(e),t?r:+r}function or(r){return r.sort(function(e,t){return e-t}),r}function Gr(r){if(r=+r,isNaN(r))return 0;if(r>1e-14){for(var e=1,t=0;t<15;t++,e*=10)if(Math.round(r*e)/e===r)return t}return ok(r)}function ok(r){var e=r.toString().toLowerCase(),t=e.indexOf(\"e\"),a=t>0?+e.slice(t+1):0,n=t>0?t:e.length,i=e.indexOf(\".\"),o=i<0?0:n-1-i;return Math.max(0,o-a)}function S2(r,e){var t=Math.log,a=Math.LN10,n=Math.floor(t(r[1]-r[0])/a),i=Math.round(t(Math.abs(e[1]-e[0]))/a),o=Math.min(Math.max(-n+i,0),20);return isFinite(o)?o:20}function sk(r,e){var t=Zr(r,function(c,d){return c+(isNaN(d)?0:d)},0);if(t===0)return[];for(var a=Math.pow(10,e),n=G(r,function(c){return(isNaN(c)?0:c)/t*a*100}),i=a*100,o=G(n,function(c){return Math.floor(c)}),s=Zr(o,function(c,d){return c+d},0),l=G(n,function(c,d){return c-o[d]});s<i;){for(var u=Number.NEGATIVE_INFINITY,f=null,h=0,v=l.length;h<v;++h)l[h]>u&&(u=l[h],f=h);++o[f],l[f]=0,++s}return G(o,function(c){return c/a})}function lk(r,e){var t=Math.max(Gr(r),Gr(e)),a=r+e;return t>_2?a:Zt(a,t)}var s0=9007199254740991;function x2(r){var e=Math.PI*2;return(r%e+e)%e}function Cf(r){return r>-o0&&r<o0}var uk=/^(?:(\\d{4})(?:[-\\/](\\d{1,2})(?:[-\\/](\\d{1,2})(?:[T ](\\d{1,2})(?::(\\d{1,2})(?::(\\d{1,2})(?:[.,](\\d+))?)?)?(Z|[\\+\\-]\\d\\d:?\\d\\d)?)?)?)?)?$/;function Kr(r){if(r instanceof Date)return r;if(U(r)){var e=uk.exec(r);if(!e)return new Date(NaN);if(e[8]){var t=+e[4]||0;return e[8].toUpperCase()!==\"Z\"&&(t-=+e[8].slice(0,3)),new Date(Date.UTC(+e[1],+(e[2]||1)-1,+e[3]||1,t,+(e[5]||0),+e[6]||0,e[7]?+e[7].substring(0,3):0))}else return new Date(+e[1],+(e[2]||1)-1,+e[3]||1,+e[4]||0,+(e[5]||0),+e[6]||0,e[7]?+e[7].substring(0,3):0)}else if(r==null)return new Date(NaN);return new Date(Math.round(r))}function fk(r){return Math.pow(10,Lg(r))}function Lg(r){if(r===0)return 0;var e=Math.floor(Math.log(r)/Math.LN10);return r/Math.pow(10,e)>=10&&e++,e}function w2(r,e){var t=Lg(r),a=Math.pow(10,t),n=r/a,i;return e?n<1.5?i=1:n<2.5?i=2:n<4?i=3:n<7?i=5:i=10:n<1?i=1:n<2?i=2:n<3?i=3:n<5?i=5:i=10,r=i*a,t>=-20?+r.toFixed(t<0?-t:0):r}function Sv(r,e){var t=(r.length-1)*e+1,a=Math.floor(t),n=+r[a-1],i=t-a;return i?n+i*(r[a]-n):n}function l0(r){r.sort(function(l,u){return s(l,u,0)?-1:1});for(var e=-1/0,t=1,a=0;a<r.length;){for(var n=r[a].interval,i=r[a].close,o=0;o<2;o++)n[o]<=e&&(n[o]=e,i[o]=o?1:1-t),e=n[o],t=i[o];n[0]===n[1]&&i[0]*i[1]!==1?r.splice(a,1):a++}return r;function s(l,u,f){return l.interval[f]<u.interval[f]||l.interval[f]===u.interval[f]&&(l.close[f]-u.close[f]===(f?-1:1)||!f&&s(l,u,1))}}function ma(r){var e=parseFloat(r);return e==r&&(e!==0||!U(r)||r.indexOf(\"x\")<=0)?e:NaN}function b2(r){return!isNaN(ma(r))}function C2(){return Math.round(Math.random()*9)}function T2(r,e){return e===0?r:T2(e,r%e)}function u0(r,e){return r==null?e:e==null?r:r*e/T2(r,e)}function Pt(r){throw new Error(r)}function f0(r,e,t){return(e-r)*t+r}var A2=\"series\\0\",D2=\"\\0_ec_\\0\";function kt(r){return r instanceof Array?r:r==null?[]:[r]}function ci(r,e,t){if(r){r[e]=r[e]||{},r.emphasis=r.emphasis||{},r.emphasis[e]=r.emphasis[e]||{};for(var a=0,n=t.length;a<n;a++){var i=t[a];!r.emphasis[e].hasOwnProperty(i)&&r[e].hasOwnProperty(i)&&(r.emphasis[e][i]=r[e][i])}}}var h0=[\"fontStyle\",\"fontWeight\",\"fontSize\",\"fontFamily\",\"rich\",\"tag\",\"color\",\"textBorderColor\",\"textBorderWidth\",\"width\",\"height\",\"lineHeight\",\"align\",\"verticalAlign\",\"baseline\",\"shadowColor\",\"shadowBlur\",\"shadowOffsetX\",\"shadowOffsetY\",\"textShadowColor\",\"textShadowBlur\",\"textShadowOffsetX\",\"textShadowOffsetY\",\"backgroundColor\",\"borderColor\",\"borderWidth\",\"borderRadius\",\"padding\"];function Co(r){return et(r)&&!F(r)&&!(r instanceof Date)?r.value:r}function hk(r){return et(r)&&!(r instanceof Array)}function M2(r,e,t){var a=t===\"normalMerge\",n=t===\"replaceMerge\",i=t===\"replaceAll\";r=r||[],e=(e||[]).slice();var o=q();A(e,function(l,u){if(!et(l)){e[u]=null;return}});var s=vk(r,o,t);return(a||n)&&ck(s,r,o,e),a&&dk(s,e),a||n?pk(s,e,n):i&&gk(s,e),yk(s),s}function vk(r,e,t){var a=[];if(t===\"replaceAll\")return a;for(var n=0;n<r.length;n++){var i=r[n];i&&i.id!=null&&e.set(i.id,n),a.push({existing:t===\"replaceMerge\"||Zs(i)?null:i,newOption:null,keyInfo:null,brandNew:null})}return a}function ck(r,e,t,a){A(a,function(n,i){if(!(!n||n.id==null)){var o=Ms(n.id),s=t.get(o);if(s!=null){var l=r[s];Me(!l.newOption,'Duplicated option on id \"'+o+'\".'),l.newOption=n,l.existing=e[s],a[i]=null}}})}function dk(r,e){A(e,function(t,a){if(!(!t||t.name==null))for(var n=0;n<r.length;n++){var i=r[n].existing;if(!r[n].newOption&&i&&(i.id==null||t.id==null)&&!Zs(t)&&!Zs(i)&&L2(\"name\",i,t)){r[n].newOption=t,e[a]=null;return}}})}function pk(r,e,t){A(e,function(a){if(!!a){for(var n,i=0;(n=r[i])&&(n.newOption||Zs(n.existing)||n.existing&&a.id!=null&&!L2(\"id\",a,n.existing));)i++;n?(n.newOption=a,n.brandNew=t):r.push({newOption:a,brandNew:t,existing:null,keyInfo:null}),i++}})}function gk(r,e){A(e,function(t){r.push({newOption:t,brandNew:!0,existing:null,keyInfo:null})})}function yk(r){var e=q();A(r,function(t){var a=t.existing;a&&e.set(a.id,t)}),A(r,function(t){var a=t.newOption;Me(!a||a.id==null||!e.get(a.id)||e.get(a.id)===t,\"id duplicates: \"+(a&&a.id)),a&&a.id!=null&&e.set(a.id,t),!t.keyInfo&&(t.keyInfo={})}),A(r,function(t,a){var n=t.existing,i=t.newOption,o=t.keyInfo;if(!!et(i)){if(o.name=i.name!=null?Ms(i.name):n?n.name:A2+a,n)o.id=Ms(n.id);else if(i.id!=null)o.id=Ms(i.id);else{var s=0;do o.id=\"\\0\"+o.name+\"\\0\"+s++;while(e.get(o.id))}e.set(o.id,t)}})}function L2(r,e,t){var a=ee(e[r],null),n=ee(t[r],null);return a!=null&&n!=null&&a===n}function Ms(r){return ee(r,\"\")}function ee(r,e){return r==null?e:U(r)?r:Mt(r)||Ad(r)?r+\"\":e}function Ig(r){var e=r.name;return!!(e&&e.indexOf(A2))}function Zs(r){return r&&r.id!=null&&Ms(r.id).indexOf(D2)===0}function mk(r){return D2+r}function _k(r,e,t){A(r,function(a){var n=a.newOption;et(n)&&(a.keyInfo.mainType=e,a.keyInfo.subType=Sk(e,n,a.existing,t))})}function Sk(r,e,t,a){var n=e.type?e.type:t?t.subType:a.determineSubType(r,e);return n}function xk(r,e){var t={},a={};return n(r||[],t),n(e||[],a,t),[i(t),i(a)];function n(o,s,l){for(var u=0,f=o.length;u<f;u++){var h=ee(o[u].seriesId,null);if(h==null)return;for(var v=kt(o[u].dataIndex),c=l&&l[h],d=0,p=v.length;d<p;d++){var g=v[d];c&&c[g]?c[g]=null:(s[h]||(s[h]={}))[g]=1}}}function i(o,s){var l=[];for(var u in o)if(o.hasOwnProperty(u)&&o[u]!=null)if(s)l.push(+u);else{var f=i(o[u],!0);f.length&&l.push({seriesId:u,dataIndex:f})}return l}}function di(r,e){if(e.dataIndexInside!=null)return e.dataIndexInside;if(e.dataIndex!=null)return F(e.dataIndex)?G(e.dataIndex,function(t){return r.indexOfRawIndex(t)}):r.indexOfRawIndex(e.dataIndex);if(e.name!=null)return F(e.name)?G(e.name,function(t){return r.indexOfName(t)}):r.indexOfName(e.name)}function Ct(){var r=\"__ec_inner_\"+wk++;return function(e){return e[r]||(e[r]={})}}var wk=C2();function Ls(r,e,t){var a=Pg(e,t),n=a.mainTypeSpecified,i=a.queryOptionMap,o=a.others,s=o,l=t?t.defaultMainType:null;return!n&&l&&i.set(l,{}),i.each(function(u,f){var h=wl(r,f,u,{useDefault:l===f,enableAll:t&&t.enableAll!=null?t.enableAll:!0,enableNone:t&&t.enableNone!=null?t.enableNone:!0});s[f+\"Models\"]=h.models,s[f+\"Model\"]=h.models[0]}),s}function Pg(r,e){var t;if(U(r)){var a={};a[r+\"Index\"]=0,t=a}else t=r;var n=q(),i={},o=!1;return A(t,function(s,l){if(l===\"dataIndex\"||l===\"dataIndexInside\"){i[l]=s;return}var u=l.match(/^(\\w+)(Index|Id|Name)$/)||[],f=u[1],h=(u[2]||\"\").toLowerCase();if(!(!f||!h||e&&e.includeMainTypes&&dt(e.includeMainTypes,f)<0)){o=o||!!f;var v=n.get(f)||n.set(f,{});v[h]=s}}),{mainTypeSpecified:o,queryOptionMap:n,others:i}}var Qt={useDefault:!0,enableAll:!1,enableNone:!1},bk={useDefault:!1,enableAll:!0,enableNone:!0};function wl(r,e,t,a){a=a||Qt;var n=t.index,i=t.id,o=t.name,s={models:null,specified:n!=null||i!=null||o!=null};if(!s.specified){var l=void 0;return s.models=a.useDefault&&(l=r.getComponent(e))?[l]:[],s}return n===\"none\"||n===!1?(Me(a.enableNone,'`\"none\"` or `false` is not a valid value on index option.'),s.models=[],s):(n===\"all\"&&(Me(a.enableAll,'`\"all\"` is not a valid value on index option.'),n=i=o=null),s.models=r.queryComponents({mainType:e,index:n,id:i,name:o}),s)}function I2(r,e,t){r.setAttribute?r.setAttribute(e,t):r[e]=t}function Ck(r,e){return r.getAttribute?r.getAttribute(e):r[e]}function Tk(r){return r===\"auto\"?At.domSupported?\"html\":\"richText\":r||\"html\"}function Xd(r,e){var t=q(),a=[];return A(r,function(n){var i=e(n);(t.get(i)||(a.push(i),t.set(i,[]))).push(n)}),{keys:a,buckets:t}}function P2(r,e,t,a,n){var i=e==null||e===\"auto\";if(a==null)return a;if(Mt(a)){var o=f0(t||0,a,n);return Zt(o,i?Math.max(Gr(t||0),Gr(a)):e)}else{if(U(a))return n<1?t:a;for(var s=[],l=t,u=a,f=Math.max(l?l.length:0,u.length),h=0;h<f;++h){var v=r.getDimensionInfo(h);if(v&&v.type===\"ordinal\")s[h]=(n<1&&l?l:u)[h];else{var c=l&&l[h]?l[h]:0,d=u[h],o=f0(c,d,n);s[h]=Zt(o,i?Math.max(Gr(c),Gr(d)):e)}}return s}}var Ak=\".\",Sn=\"___EC__COMPONENT__CONTAINER___\",R2=\"___EC__EXTENDED_CLASS___\";function Hr(r){var e={main:\"\",sub:\"\"};if(r){var t=r.split(Ak);e.main=t[0]||\"\",e.sub=t[1]||\"\"}return e}function Dk(r){Me(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(r),'componentType \"'+r+'\" illegal')}function Mk(r){return!!(r&&r[R2])}function Rg(r,e){r.$constructor=r,r.extend=function(t){var a=this,n;return Lk(a)?n=function(i){k(o,i);function o(){return i.apply(this,arguments)||this}return o}(a):(n=function(){(t.$constructor||a).apply(this,arguments)},MR(n,this)),V(n.prototype,t),n[R2]=!0,n.extend=this.extend,n.superCall=Rk,n.superApply=Ek,n.superClass=a,n}}function Lk(r){return J(r)&&/^class\\s/.test(Function.prototype.toString.call(r))}function E2(r,e){r.extend=e.extend}var Ik=Math.round(Math.random()*10);function Pk(r){var e=[\"__\\0is_clz\",Ik++].join(\"_\");r.prototype[e]=!0,r.isInstance=function(t){return!!(t&&t[e])}}function Rk(r,e){for(var t=[],a=2;a<arguments.length;a++)t[a-2]=arguments[a];return this.superClass.prototype[e].apply(r,t)}function Ek(r,e,t){return this.superClass.prototype[e].apply(r,t)}function mh(r){var e={};r.registerClass=function(a){var n=a.type||a.prototype.type;if(n){Dk(n),a.prototype.type=n;var i=Hr(n);if(!i.sub)e[i.main]=a;else if(i.sub!==Sn){var o=t(i);o[i.sub]=a}}return a},r.getClass=function(a,n,i){var o=e[a];if(o&&o[Sn]&&(o=n?o[n]:null),i&&!o)throw new Error(n?\"Component \"+a+\".\"+(n||\"\")+\" is used but not imported.\":a+\".type should be specified.\");return o},r.getClassesByMainType=function(a){var n=Hr(a),i=[],o=e[n.main];return o&&o[Sn]?A(o,function(s,l){l!==Sn&&i.push(s)}):i.push(o),i},r.hasClass=function(a){var n=Hr(a);return!!e[n.main]},r.getAllClassMainTypes=function(){var a=[];return A(e,function(n,i){a.push(i)}),a},r.hasSubTypes=function(a){var n=Hr(a),i=e[n.main];return i&&i[Sn]};function t(a){var n=e[a.main];return(!n||!n[Sn])&&(n=e[a.main]={},n[Sn]=!0),n}}function pi(r,e){for(var t=0;t<r.length;t++)r[t][1]||(r[t][1]=r[t][0]);return e=e||!1,function(a,n,i){for(var o={},s=0;s<r.length;s++){var l=r[s][1];if(!(n&&dt(n,l)>=0||i&&dt(i,l)<0)){var u=a.getShallow(l,e);u!=null&&(o[r[s][0]]=u)}}return o}}var kk=[[\"fill\",\"color\"],[\"shadowBlur\"],[\"shadowOffsetX\"],[\"shadowOffsetY\"],[\"opacity\"],[\"shadowColor\"]],Ok=pi(kk),Bk=function(){function r(){}return r.prototype.getAreaStyle=function(e,t){return Ok(this,e,t)},r}(),qd=new Sl(50);function Nk(r){if(typeof r==\"string\"){var e=qd.get(r);return e&&e.image}else return r}function Eg(r,e,t,a,n){if(r)if(typeof r==\"string\"){if(e&&e.__zrImageSrc===r||!t)return e;var i=qd.get(r),o={hostEl:t,cb:a,cbPayload:n};return i?(e=i.image,!_h(e)&&i.pending.push(o)):(e=ga.loadImage(r,v0,v0),e.__zrImageSrc=r,qd.put(r,e.__cachedImgObj={image:e,pending:[o]})),e}else return r;else return e}function v0(){var r=this.__cachedImgObj;this.onload=this.onerror=this.__cachedImgObj=null;for(var e=0;e<r.pending.length;e++){var t=r.pending[e],a=t.cb;a&&a(this,t.cbPayload),t.hostEl.dirty()}r.pending.length=0}function _h(r){return r&&r.width&&r.height}var xv=/\\{([a-zA-Z0-9_]+)\\|([^}]*)\\}/g;function Vk(r,e,t,a,n){if(!e)return\"\";var i=(r+\"\").split(`\n`);n=k2(e,t,a,n);for(var o=0,s=i.length;o<s;o++)i[o]=O2(i[o],n);return i.join(`\n`)}function k2(r,e,t,a){a=a||{};var n=V({},a);n.font=e,t=ft(t,\"...\"),n.maxIterations=ft(a.maxIterations,2);var i=n.minChar=ft(a.minChar,0);n.cnCharWidth=$e(\"\\u56FD\",e);var o=n.ascCharWidth=$e(\"a\",e);n.placeholder=ft(a.placeholder,\"\");for(var s=r=Math.max(0,r-1),l=0;l<i&&s>=o;l++)s-=o;var u=$e(t,e);return u>s&&(t=\"\",u=0),s=r-u,n.ellipsis=t,n.ellipsisWidth=u,n.contentWidth=s,n.containerWidth=r,n}function O2(r,e){var t=e.containerWidth,a=e.font,n=e.contentWidth;if(!t)return\"\";var i=$e(r,a);if(i<=t)return r;for(var o=0;;o++){if(i<=n||o>=e.maxIterations){r+=e.ellipsis;break}var s=o===0?zk(r,n,e.ascCharWidth,e.cnCharWidth):i>0?Math.floor(r.length*n/i):0;r=r.substr(0,s),i=$e(r,a)}return r===\"\"&&(r=e.placeholder),r}function zk(r,e,t,a){for(var n=0,i=0,o=r.length;i<o&&n<e;i++){var s=r.charCodeAt(i);n+=0<=s&&s<=127?t:a}return i}function Fk(r,e){r!=null&&(r+=\"\");var t=e.overflow,a=e.padding,n=e.font,i=t===\"truncate\",o=yh(n),s=ft(e.lineHeight,o),l=!!e.backgroundColor,u=e.lineOverflow===\"truncate\",f=e.width,h;f!=null&&(t===\"break\"||t===\"breakAll\")?h=r?B2(r,e.font,f,t===\"breakAll\",0).lines:[]:h=r?r.split(`\n`):[];var v=h.length*s,c=ft(e.height,v);if(v>c&&u){var d=Math.floor(c/s);h=h.slice(0,d)}if(r&&i&&f!=null)for(var p=k2(f,n,e.ellipsis,{minChar:e.truncateMinChar,placeholder:e.placeholder}),g=0;g<h.length;g++)h[g]=O2(h[g],p);for(var y=c,m=0,g=0;g<h.length;g++)m=Math.max($e(h[g],n),m);f==null&&(f=m);var _=m;return a&&(y+=a[0]+a[2],_+=a[1]+a[3],f+=a[1]+a[3]),l&&(_=f),{lines:h,height:c,outerWidth:_,outerHeight:y,lineHeight:s,calculatedLineHeight:o,contentWidth:m,contentHeight:v,width:f}}var Gk=function(){function r(){}return r}(),c0=function(){function r(e){this.tokens=[],e&&(this.tokens=e)}return r}(),Hk=function(){function r(){this.width=0,this.height=0,this.contentWidth=0,this.contentHeight=0,this.outerWidth=0,this.outerHeight=0,this.lines=[]}return r}();function Wk(r,e){var t=new Hk;if(r!=null&&(r+=\"\"),!r)return t;for(var a=e.width,n=e.height,i=e.overflow,o=(i===\"break\"||i===\"breakAll\")&&a!=null?{width:a,accumWidth:0,breakAll:i===\"breakAll\"}:null,s=xv.lastIndex=0,l;(l=xv.exec(r))!=null;){var u=l.index;u>s&&wv(t,r.substring(s,u),e,o),wv(t,l[2],e,o,l[1]),s=xv.lastIndex}s<r.length&&wv(t,r.substring(s,r.length),e,o);var f=[],h=0,v=0,c=e.padding,d=i===\"truncate\",p=e.lineOverflow===\"truncate\";function g(O,z,H){O.width=z,O.lineHeight=H,h+=H,v=Math.max(v,z)}t:for(var y=0;y<t.lines.length;y++){for(var m=t.lines[y],_=0,S=0,w=0;w<m.tokens.length;w++){var x=m.tokens[w],b=x.styleName&&e.rich[x.styleName]||{},C=x.textPadding=b.padding,T=C?C[1]+C[3]:0,D=x.font=b.font||e.font;x.contentHeight=yh(D);var M=ft(b.height,x.contentHeight);if(x.innerHeight=M,C&&(M+=C[0]+C[2]),x.height=M,x.lineHeight=Ur(b.lineHeight,e.lineHeight,M),x.align=b&&b.align||e.align,x.verticalAlign=b&&b.verticalAlign||\"middle\",p&&n!=null&&h+x.lineHeight>n){w>0?(m.tokens=m.tokens.slice(0,w),g(m,S,_),t.lines=t.lines.slice(0,y+1)):t.lines=t.lines.slice(0,y);break t}var L=b.width,I=L==null||L===\"auto\";if(typeof L==\"string\"&&L.charAt(L.length-1)===\"%\")x.percentWidth=L,f.push(x),x.contentWidth=$e(x.text,D);else{if(I){var P=b.backgroundColor,R=P&&P.image;R&&(R=Nk(R),_h(R)&&(x.width=Math.max(x.width,R.width*M/R.height)))}var E=d&&a!=null?a-S:null;E!=null&&E<x.width?!I||E<T?(x.text=\"\",x.width=x.contentWidth=0):(x.text=Vk(x.text,E-T,D,e.ellipsis,{minChar:e.truncateMinChar}),x.width=x.contentWidth=$e(x.text,D)):x.contentWidth=$e(x.text,D)}x.width+=T,S+=x.width,b&&(_=Math.max(_,x.lineHeight))}g(m,S,_)}t.outerWidth=t.width=ft(a,v),t.outerHeight=t.height=ft(n,h),t.contentHeight=h,t.contentWidth=v,c&&(t.outerWidth+=c[1]+c[3],t.outerHeight+=c[0]+c[2]);for(var y=0;y<f.length;y++){var x=f[y],B=x.percentWidth;x.width=parseInt(B,10)/100*t.width}return t}function wv(r,e,t,a,n){var i=e===\"\",o=n&&t.rich[n]||{},s=r.lines,l=o.font||t.font,u=!1,f,h;if(a){var v=o.padding,c=v?v[1]+v[3]:0;if(o.width!=null&&o.width!==\"auto\"){var d=Tr(o.width,a.width)+c;s.length>0&&d+a.accumWidth>a.width&&(f=e.split(`\n`),u=!0),a.accumWidth=d}else{var p=B2(e,l,a.width,a.breakAll,a.accumWidth);a.accumWidth=p.accumWidth+c,h=p.linesWidths,f=p.lines}}else f=e.split(`\n`);for(var g=0;g<f.length;g++){var y=f[g],m=new Gk;if(m.styleName=n,m.text=y,m.isLineHolder=!y&&!i,typeof o.width==\"number\"?m.width=o.width:m.width=h?h[g]:$e(y,l),!g&&!u){var _=(s[s.length-1]||(s[0]=new c0)).tokens,S=_.length;S===1&&_[0].isLineHolder?_[0]=m:(y||!S||i)&&_.push(m)}else s.push(new c0([m]))}}function $k(r){var e=r.charCodeAt(0);return e>=32&&e<=591||e>=880&&e<=4351||e>=4608&&e<=5119||e>=7680&&e<=8303}var Uk=Zr(\",&?/;] \".split(\"\"),function(r,e){return r[e]=!0,r},{});function Yk(r){return $k(r)?!!Uk[r]:!0}function B2(r,e,t,a,n){for(var i=[],o=[],s=\"\",l=\"\",u=0,f=0,h=0;h<r.length;h++){var v=r.charAt(h);if(v===`\n`){l&&(s+=l,f+=u),i.push(s),o.push(f),s=\"\",l=\"\",u=0,f=0;continue}var c=$e(v,e),d=a?!1:!Yk(v);if(i.length?f+c>t:n+f+c>t){f?(s||l)&&(d?(s||(s=l,l=\"\",u=0,f=u),i.push(s),o.push(f-u),l+=v,u+=c,s=\"\",f=u):(l&&(s+=l,l=\"\",u=0),i.push(s),o.push(f),s=v,f=c)):d?(i.push(l),o.push(u),l=v,u=c):(i.push(v),o.push(c));continue}f+=c,d?(l+=v,u+=c):(l&&(s+=l,l=\"\",u=0),s+=v)}return!i.length&&!s&&(s=r,l=\"\",u=0),l&&(s+=l),s&&(i.push(s),o.push(f)),i.length===1&&(f+=n),{accumWidth:f,lines:i,linesWidths:o}}var Kd=\"__zr_style_\"+Math.round(Math.random()*10),ii={shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,shadowColor:\"#000\",opacity:1,blend:\"source-over\"},Sh={style:{shadowBlur:!0,shadowOffsetX:!0,shadowOffsetY:!0,shadowColor:!0,opacity:!0}};ii[Kd]=!0;var d0=[\"z\",\"z2\",\"invisible\"],Zk=[\"invisible\"],Xk=function(r){k(e,r);function e(t){return r.call(this,t)||this}return e.prototype._init=function(t){for(var a=St(t),n=0;n<a.length;n++){var i=a[n];i===\"style\"?this.useStyle(t[i]):r.prototype.attrKV.call(this,i,t[i])}this.style||this.useStyle({})},e.prototype.beforeBrush=function(){},e.prototype.afterBrush=function(){},e.prototype.innerBeforeBrush=function(){},e.prototype.innerAfterBrush=function(){},e.prototype.shouldBePainted=function(t,a,n,i){var o=this.transform;if(this.ignore||this.invisible||this.style.opacity===0||this.culling&&qk(this,t,a)||o&&!o[0]&&!o[3])return!1;if(n&&this.__clipPaths){for(var s=0;s<this.__clipPaths.length;++s)if(this.__clipPaths[s].isZeroArea())return!1}if(i&&this.parent)for(var l=this.parent;l;){if(l.ignore)return!1;l=l.parent}return!0},e.prototype.contain=function(t,a){return this.rectContain(t,a)},e.prototype.traverse=function(t,a){t.call(a,this)},e.prototype.rectContain=function(t,a){var n=this.transformCoordToLocal(t,a),i=this.getBoundingRect();return i.contain(n[0],n[1])},e.prototype.getPaintRect=function(){var t=this._paintRect;if(!this._paintRect||this.__dirty){var a=this.transform,n=this.getBoundingRect(),i=this.style,o=i.shadowBlur||0,s=i.shadowOffsetX||0,l=i.shadowOffsetY||0;t=this._paintRect||(this._paintRect=new vt(0,0,0,0)),a?vt.applyTransform(t,n,a):t.copy(n),(o||s||l)&&(t.width+=o*2+Math.abs(s),t.height+=o*2+Math.abs(l),t.x=Math.min(t.x,t.x+s-o),t.y=Math.min(t.y,t.y+l-o));var u=this.dirtyRectTolerance;t.isZero()||(t.x=Math.floor(t.x-u),t.y=Math.floor(t.y-u),t.width=Math.ceil(t.width+1+u*2),t.height=Math.ceil(t.height+1+u*2))}return t},e.prototype.setPrevPaintRect=function(t){t?(this._prevPaintRect=this._prevPaintRect||new vt(0,0,0,0),this._prevPaintRect.copy(t)):this._prevPaintRect=null},e.prototype.getPrevPaintRect=function(){return this._prevPaintRect},e.prototype.animateStyle=function(t){return this.animate(\"style\",t)},e.prototype.updateDuringAnimation=function(t){t===\"style\"?this.dirtyStyle():this.markRedraw()},e.prototype.attrKV=function(t,a){t!==\"style\"?r.prototype.attrKV.call(this,t,a):this.style?this.setStyle(a):this.useStyle(a)},e.prototype.setStyle=function(t,a){return typeof t==\"string\"?this.style[t]=a:V(this.style,t),this.dirtyStyle(),this},e.prototype.dirtyStyle=function(t){t||this.markRedraw(),this.__dirty|=cs,this._rect&&(this._rect=null)},e.prototype.dirty=function(){this.dirtyStyle()},e.prototype.styleChanged=function(){return!!(this.__dirty&cs)},e.prototype.styleUpdated=function(){this.__dirty&=~cs},e.prototype.createStyle=function(t){return dh(ii,t)},e.prototype.useStyle=function(t){t[Kd]||(t=this.createStyle(t)),this.__inHover?this.__hoverStyle=t:this.style=t,this.dirtyStyle()},e.prototype.isStyleObject=function(t){return t[Kd]},e.prototype._innerSaveToNormal=function(t){r.prototype._innerSaveToNormal.call(this,t);var a=this._normalState;t.style&&!a.style&&(a.style=this._mergeStyle(this.createStyle(),this.style)),this._savePrimaryToNormal(t,a,d0)},e.prototype._applyStateObj=function(t,a,n,i,o,s){r.prototype._applyStateObj.call(this,t,a,n,i,o,s);var l=!(a&&i),u;if(a&&a.style?o?i?u=a.style:(u=this._mergeStyle(this.createStyle(),n.style),this._mergeStyle(u,a.style)):(u=this._mergeStyle(this.createStyle(),i?this.style:n.style),this._mergeStyle(u,a.style)):l&&(u=n.style),u)if(o){var f=this.style;if(this.style=this.createStyle(l?{}:f),l)for(var h=St(f),v=0;v<h.length;v++){var c=h[v];c in u&&(u[c]=u[c],this.style[c]=f[c])}for(var d=St(u),v=0;v<d.length;v++){var c=d[v];this.style[c]=this.style[c]}this._transitionState(t,{style:u},s,this.getAnimationStyleProps())}else this.useStyle(u);for(var p=this.__inHover?Zk:d0,v=0;v<p.length;v++){var c=p[v];a&&a[c]!=null?this[c]=a[c]:l&&n[c]!=null&&(this[c]=n[c])}},e.prototype._mergeStates=function(t){for(var a=r.prototype._mergeStates.call(this,t),n,i=0;i<t.length;i++){var o=t[i];o.style&&(n=n||{},this._mergeStyle(n,o.style))}return n&&(a.style=n),a},e.prototype._mergeStyle=function(t,a){return V(t,a),t},e.prototype.getAnimationStyleProps=function(){return Sh},e.initDefaultProps=function(){var t=e.prototype;t.type=\"displayable\",t.invisible=!1,t.z=0,t.z2=0,t.zlevel=0,t.culling=!1,t.cursor=\"pointer\",t.rectHover=!1,t.incremental=!1,t._rect=null,t.dirtyRectTolerance=0,t.__dirty=He|cs}(),e}(g2),bv=new vt(0,0,0,0),Cv=new vt(0,0,0,0);function qk(r,e,t){return bv.copy(r.getBoundingRect()),r.transform&&bv.applyTransform(r.transform),Cv.width=e,Cv.height=t,!bv.intersect(Cv)}var fr=Xk,Oe=Math.min,Be=Math.max,Tv=Math.sin,Av=Math.cos,xn=Math.PI*2,Ql=wi(),jl=wi(),tu=wi();function xh(r,e,t){if(r.length!==0){for(var a=r[0],n=a[0],i=a[0],o=a[1],s=a[1],l=1;l<r.length;l++)a=r[l],n=Oe(n,a[0]),i=Be(i,a[0]),o=Oe(o,a[1]),s=Be(s,a[1]);e[0]=n,e[1]=o,t[0]=i,t[1]=s}}function p0(r,e,t,a,n,i){n[0]=Oe(r,t),n[1]=Oe(e,a),i[0]=Be(r,t),i[1]=Be(e,a)}var g0=[],y0=[];function Kk(r,e,t,a,n,i,o,s,l,u){var f=jb,h=ae,v=f(r,t,n,o,g0);l[0]=1/0,l[1]=1/0,u[0]=-1/0,u[1]=-1/0;for(var c=0;c<v;c++){var d=h(r,t,n,o,g0[c]);l[0]=Oe(d,l[0]),u[0]=Be(d,u[0])}v=f(e,a,i,s,y0);for(var c=0;c<v;c++){var p=h(e,a,i,s,y0[c]);l[1]=Oe(p,l[1]),u[1]=Be(p,u[1])}l[0]=Oe(r,l[0]),u[0]=Be(r,u[0]),l[0]=Oe(o,l[0]),u[0]=Be(o,u[0]),l[1]=Oe(e,l[1]),u[1]=Be(e,u[1]),l[1]=Oe(s,l[1]),u[1]=Be(s,u[1])}function Jk(r,e,t,a,n,i,o,s){var l=e2,u=se,f=Be(Oe(l(r,t,n),1),0),h=Be(Oe(l(e,a,i),1),0),v=u(r,t,n,f),c=u(e,a,i,h);o[0]=Oe(r,n,v),o[1]=Oe(e,i,c),s[0]=Be(r,n,v),s[1]=Be(e,i,c)}function Qk(r,e,t,a,n,i,o,s,l){var u=Ha,f=Wa,h=Math.abs(n-i);if(h%xn<1e-4&&h>1e-4){s[0]=r-t,s[1]=e-a,l[0]=r+t,l[1]=e+a;return}if(Ql[0]=Av(n)*t+r,Ql[1]=Tv(n)*a+e,jl[0]=Av(i)*t+r,jl[1]=Tv(i)*a+e,u(s,Ql,jl),f(l,Ql,jl),n=n%xn,n<0&&(n=n+xn),i=i%xn,i<0&&(i=i+xn),n>i&&!o?i+=xn:n<i&&o&&(n+=xn),o){var v=i;i=n,n=v}for(var c=0;c<i;c+=Math.PI/2)c>n&&(tu[0]=Av(c)*t+r,tu[1]=Tv(c)*a+e,u(s,tu,s),f(l,tu,l))}var Ot={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},wn=[],bn=[],Lr=[],Ma=[],Ir=[],Pr=[],Dv=Math.min,Mv=Math.max,Cn=Math.cos,Tn=Math.sin,aa=Math.abs,Jd=Math.PI,Na=Jd*2,Lv=typeof Float32Array!=\"undefined\",Wo=[];function Iv(r){var e=Math.round(r/Jd*1e8)/1e8;return e%2*Jd}function N2(r,e){var t=Iv(r[0]);t<0&&(t+=Na);var a=t-r[0],n=r[1];n+=a,!e&&n-t>=Na?n=t+Na:e&&t-n>=Na?n=t-Na:!e&&t>n?n=t+(Na-Iv(t-n)):e&&t<n&&(n=t-(Na-Iv(n-t))),r[0]=t,r[1]=n}var Jr=function(){function r(e){this.dpr=1,this._xi=0,this._yi=0,this._x0=0,this._y0=0,this._len=0,e&&(this._saveData=!1),this._saveData&&(this.data=[])}return r.prototype.increaseVersion=function(){this._version++},r.prototype.getVersion=function(){return this._version},r.prototype.setScale=function(e,t,a){a=a||0,a>0&&(this._ux=aa(a/wf/e)||0,this._uy=aa(a/wf/t)||0)},r.prototype.setDPR=function(e){this.dpr=e},r.prototype.setContext=function(e){this._ctx=e},r.prototype.getContext=function(){return this._ctx},r.prototype.beginPath=function(){return this._ctx&&this._ctx.beginPath(),this.reset(),this},r.prototype.reset=function(){this._saveData&&(this._len=0),this._pathSegLen&&(this._pathSegLen=null,this._pathLen=0),this._version++},r.prototype.moveTo=function(e,t){return this._drawPendingPt(),this.addData(Ot.M,e,t),this._ctx&&this._ctx.moveTo(e,t),this._x0=e,this._y0=t,this._xi=e,this._yi=t,this},r.prototype.lineTo=function(e,t){var a=aa(e-this._xi),n=aa(t-this._yi),i=a>this._ux||n>this._uy;if(this.addData(Ot.L,e,t),this._ctx&&i&&this._ctx.lineTo(e,t),i)this._xi=e,this._yi=t,this._pendingPtDist=0;else{var o=a*a+n*n;o>this._pendingPtDist&&(this._pendingPtX=e,this._pendingPtY=t,this._pendingPtDist=o)}return this},r.prototype.bezierCurveTo=function(e,t,a,n,i,o){return this._drawPendingPt(),this.addData(Ot.C,e,t,a,n,i,o),this._ctx&&this._ctx.bezierCurveTo(e,t,a,n,i,o),this._xi=i,this._yi=o,this},r.prototype.quadraticCurveTo=function(e,t,a,n){return this._drawPendingPt(),this.addData(Ot.Q,e,t,a,n),this._ctx&&this._ctx.quadraticCurveTo(e,t,a,n),this._xi=a,this._yi=n,this},r.prototype.arc=function(e,t,a,n,i,o){this._drawPendingPt(),Wo[0]=n,Wo[1]=i,N2(Wo,o),n=Wo[0],i=Wo[1];var s=i-n;return this.addData(Ot.A,e,t,a,a,n,s,0,o?0:1),this._ctx&&this._ctx.arc(e,t,a,n,i,o),this._xi=Cn(i)*a+e,this._yi=Tn(i)*a+t,this},r.prototype.arcTo=function(e,t,a,n,i){return this._drawPendingPt(),this._ctx&&this._ctx.arcTo(e,t,a,n,i),this},r.prototype.rect=function(e,t,a,n){return this._drawPendingPt(),this._ctx&&this._ctx.rect(e,t,a,n),this.addData(Ot.R,e,t,a,n),this},r.prototype.closePath=function(){this._drawPendingPt(),this.addData(Ot.Z);var e=this._ctx,t=this._x0,a=this._y0;return e&&e.closePath(),this._xi=t,this._yi=a,this},r.prototype.fill=function(e){e&&e.fill(),this.toStatic()},r.prototype.stroke=function(e){e&&e.stroke(),this.toStatic()},r.prototype.len=function(){return this._len},r.prototype.setData=function(e){var t=e.length;!(this.data&&this.data.length===t)&&Lv&&(this.data=new Float32Array(t));for(var a=0;a<t;a++)this.data[a]=e[a];this._len=t},r.prototype.appendPath=function(e){e instanceof Array||(e=[e]);for(var t=e.length,a=0,n=this._len,i=0;i<t;i++)a+=e[i].len();Lv&&this.data instanceof Float32Array&&(this.data=new Float32Array(n+a));for(var i=0;i<t;i++)for(var o=e[i].data,s=0;s<o.length;s++)this.data[n++]=o[s];this._len=n},r.prototype.addData=function(e,t,a,n,i,o,s,l,u){if(!!this._saveData){var f=this.data;this._len+arguments.length>f.length&&(this._expandData(),f=this.data);for(var h=0;h<arguments.length;h++)f[this._len++]=arguments[h]}},r.prototype._drawPendingPt=function(){this._pendingPtDist>0&&(this._ctx&&this._ctx.lineTo(this._pendingPtX,this._pendingPtY),this._pendingPtDist=0)},r.prototype._expandData=function(){if(!(this.data instanceof Array)){for(var e=[],t=0;t<this._len;t++)e[t]=this.data[t];this.data=e}},r.prototype.toStatic=function(){if(!!this._saveData){this._drawPendingPt();var e=this.data;e instanceof Array&&(e.length=this._len,Lv&&this._len>11&&(this.data=new Float32Array(e)))}},r.prototype.getBoundingRect=function(){Lr[0]=Lr[1]=Ir[0]=Ir[1]=Number.MAX_VALUE,Ma[0]=Ma[1]=Pr[0]=Pr[1]=-Number.MAX_VALUE;var e=this.data,t=0,a=0,n=0,i=0,o;for(o=0;o<this._len;){var s=e[o++],l=o===1;switch(l&&(t=e[o],a=e[o+1],n=t,i=a),s){case Ot.M:t=n=e[o++],a=i=e[o++],Ir[0]=n,Ir[1]=i,Pr[0]=n,Pr[1]=i;break;case Ot.L:p0(t,a,e[o],e[o+1],Ir,Pr),t=e[o++],a=e[o++];break;case Ot.C:Kk(t,a,e[o++],e[o++],e[o++],e[o++],e[o],e[o+1],Ir,Pr),t=e[o++],a=e[o++];break;case Ot.Q:Jk(t,a,e[o++],e[o++],e[o],e[o+1],Ir,Pr),t=e[o++],a=e[o++];break;case Ot.A:var u=e[o++],f=e[o++],h=e[o++],v=e[o++],c=e[o++],d=e[o++]+c;o+=1;var p=!e[o++];l&&(n=Cn(c)*h+u,i=Tn(c)*v+f),Qk(u,f,h,v,c,d,p,Ir,Pr),t=Cn(d)*h+u,a=Tn(d)*v+f;break;case Ot.R:n=t=e[o++],i=a=e[o++];var g=e[o++],y=e[o++];p0(n,i,n+g,i+y,Ir,Pr);break;case Ot.Z:t=n,a=i;break}Ha(Lr,Lr,Ir),Wa(Ma,Ma,Pr)}return o===0&&(Lr[0]=Lr[1]=Ma[0]=Ma[1]=0),new vt(Lr[0],Lr[1],Ma[0]-Lr[0],Ma[1]-Lr[1])},r.prototype._calculateLength=function(){var e=this.data,t=this._len,a=this._ux,n=this._uy,i=0,o=0,s=0,l=0;this._pathSegLen||(this._pathSegLen=[]);for(var u=this._pathSegLen,f=0,h=0,v=0;v<t;){var c=e[v++],d=v===1;d&&(i=e[v],o=e[v+1],s=i,l=o);var p=-1;switch(c){case Ot.M:i=s=e[v++],o=l=e[v++];break;case Ot.L:{var g=e[v++],y=e[v++],m=g-i,_=y-o;(aa(m)>a||aa(_)>n||v===t-1)&&(p=Math.sqrt(m*m+_*_),i=g,o=y);break}case Ot.C:{var S=e[v++],w=e[v++],g=e[v++],y=e[v++],x=e[v++],b=e[v++];p=dE(i,o,S,w,g,y,x,b,10),i=x,o=b;break}case Ot.Q:{var S=e[v++],w=e[v++],g=e[v++],y=e[v++];p=gE(i,o,S,w,g,y,10),i=g,o=y;break}case Ot.A:var C=e[v++],T=e[v++],D=e[v++],M=e[v++],L=e[v++],I=e[v++],P=I+L;v+=1,e[v++],d&&(s=Cn(L)*D+C,l=Tn(L)*M+T),p=Mv(D,M)*Dv(Na,Math.abs(I)),i=Cn(P)*D+C,o=Tn(P)*M+T;break;case Ot.R:{s=i=e[v++],l=o=e[v++];var R=e[v++],E=e[v++];p=R*2+E*2;break}case Ot.Z:{var m=s-i,_=l-o;p=Math.sqrt(m*m+_*_),i=s,o=l;break}}p>=0&&(u[h++]=p,f+=p)}return this._pathLen=f,f},r.prototype.rebuildPath=function(e,t){var a=this.data,n=this._ux,i=this._uy,o=this._len,s,l,u,f,h,v,c=t<1,d,p,g=0,y=0,m,_=0,S,w;if(c&&(this._pathSegLen||this._calculateLength(),d=this._pathSegLen,p=this._pathLen,m=t*p,!m))return;t:for(var x=0;x<o;){var b=a[x++],C=x===1;switch(C&&(u=a[x],f=a[x+1],s=u,l=f),b!==Ot.L&&_>0&&(e.lineTo(S,w),_=0),b){case Ot.M:s=u=a[x++],l=f=a[x++],e.moveTo(u,f);break;case Ot.L:{h=a[x++],v=a[x++];var T=aa(h-u),D=aa(v-f);if(T>n||D>i){if(c){var M=d[y++];if(g+M>m){var L=(m-g)/M;e.lineTo(u*(1-L)+h*L,f*(1-L)+v*L);break t}g+=M}e.lineTo(h,v),u=h,f=v,_=0}else{var I=T*T+D*D;I>_&&(S=h,w=v,_=I)}break}case Ot.C:{var P=a[x++],R=a[x++],E=a[x++],B=a[x++],O=a[x++],z=a[x++];if(c){var M=d[y++];if(g+M>m){var L=(m-g)/M;en(u,P,E,O,L,wn),en(f,R,B,z,L,bn),e.bezierCurveTo(wn[1],bn[1],wn[2],bn[2],wn[3],bn[3]);break t}g+=M}e.bezierCurveTo(P,R,E,B,O,z),u=O,f=z;break}case Ot.Q:{var P=a[x++],R=a[x++],E=a[x++],B=a[x++];if(c){var M=d[y++];if(g+M>m){var L=(m-g)/M;$s(u,P,E,L,wn),$s(f,R,B,L,bn),e.quadraticCurveTo(wn[1],bn[1],wn[2],bn[2]);break t}g+=M}e.quadraticCurveTo(P,R,E,B),u=E,f=B;break}case Ot.A:var H=a[x++],$=a[x++],X=a[x++],Q=a[x++],j=a[x++],pt=a[x++],xt=a[x++],gt=!a[x++],rt=X>Q?X:Q,yt=aa(X-Q)>.001,st=j+pt,K=!1;if(c){var M=d[y++];g+M>m&&(st=j+pt*(m-g)/M,K=!0),g+=M}if(yt&&e.ellipse?e.ellipse(H,$,X,Q,xt,j,st,gt):e.arc(H,$,rt,j,st,gt),K)break t;C&&(s=Cn(j)*X+H,l=Tn(j)*Q+$),u=Cn(st)*X+H,f=Tn(st)*Q+$;break;case Ot.R:s=u=a[x],l=f=a[x+1],h=a[x++],v=a[x++];var lt=a[x++],Gt=a[x++];if(c){var M=d[y++];if(g+M>m){var wt=m-g;e.moveTo(h,v),e.lineTo(h+Dv(wt,lt),v),wt-=lt,wt>0&&e.lineTo(h+lt,v+Dv(wt,Gt)),wt-=Gt,wt>0&&e.lineTo(h+Mv(lt-wt,0),v+Gt),wt-=lt,wt>0&&e.lineTo(h,v+Mv(Gt-wt,0));break t}g+=M}e.rect(h,v,lt,Gt);break;case Ot.Z:if(c){var M=d[y++];if(g+M>m){var L=(m-g)/M;e.lineTo(u*(1-L)+s*L,f*(1-L)+l*L);break t}g+=M}e.closePath(),u=s,f=l}}},r.prototype.clone=function(){var e=new r,t=this.data;return e.data=t.slice?t.slice():Array.prototype.slice.call(t),e._len=this._len,e},r.CMD=Ot,r.initDefaultProps=function(){var e=r.prototype;e._saveData=!0,e._ux=0,e._uy=0,e._pendingPtDist=0,e._version=0}(),r}();function za(r,e,t,a,n,i,o){if(n===0)return!1;var s=n,l=0,u=r;if(o>e+s&&o>a+s||o<e-s&&o<a-s||i>r+s&&i>t+s||i<r-s&&i<t-s)return!1;if(r!==t)l=(e-a)/(r-t),u=(r*a-t*e)/(r-t);else return Math.abs(i-r)<=s/2;var f=l*i-o+u,h=f*f/(l*l+1);return h<=s/2*s/2}function jk(r,e,t,a,n,i,o,s,l,u,f){if(l===0)return!1;var h=l;if(f>e+h&&f>a+h&&f>i+h&&f>s+h||f<e-h&&f<a-h&&f<i-h&&f<s-h||u>r+h&&u>t+h&&u>n+h&&u>o+h||u<r-h&&u<t-h&&u<n-h&&u<o-h)return!1;var v=t2(r,e,t,a,n,i,o,s,u,f,null);return v<=h/2}function V2(r,e,t,a,n,i,o,s,l){if(o===0)return!1;var u=o;if(l>e+u&&l>a+u&&l>i+u||l<e-u&&l<a-u&&l<i-u||s>r+u&&s>t+u&&s>n+u||s<r-u&&s<t-u&&s<n-u)return!1;var f=r2(r,e,t,a,n,i,s,l,null);return f<=u/2}var m0=Math.PI*2;function xr(r){return r%=m0,r<0&&(r+=m0),r}var $o=Math.PI*2;function t5(r,e,t,a,n,i,o,s,l){if(o===0)return!1;var u=o;s-=r,l-=e;var f=Math.sqrt(s*s+l*l);if(f-u>t||f+u<t)return!1;if(Math.abs(a-n)%$o<1e-4)return!0;if(i){var h=a;a=xr(n),n=xr(h)}else a=xr(a),n=xr(n);a>n&&(n+=$o);var v=Math.atan2(l,s);return v<0&&(v+=$o),v>=a&&v<=n||v+$o>=a&&v+$o<=n}function sa(r,e,t,a,n,i){if(i>e&&i>a||i<e&&i<a||a===e)return 0;var o=(i-e)/(a-e),s=a<e?1:-1;(o===1||o===0)&&(s=a<e?.5:-.5);var l=o*(t-r)+r;return l===n?1/0:l>n?s:0}var La=Jr.CMD,An=Math.PI*2,e5=1e-4;function r5(r,e){return Math.abs(r-e)<e5}var Te=[-1,-1,-1],je=[-1,-1];function a5(){var r=je[0];je[0]=je[1],je[1]=r}function n5(r,e,t,a,n,i,o,s,l,u){if(u>e&&u>a&&u>i&&u>s||u<e&&u<a&&u<i&&u<s)return 0;var f=mf(e,a,i,s,u,Te);if(f===0)return 0;for(var h=0,v=-1,c=void 0,d=void 0,p=0;p<f;p++){var g=Te[p],y=g===0||g===1?.5:1,m=ae(r,t,n,o,g);m<l||(v<0&&(v=jb(e,a,i,s,je),je[1]<je[0]&&v>1&&a5(),c=ae(e,a,i,s,je[0]),v>1&&(d=ae(e,a,i,s,je[1]))),v===2?g<je[0]?h+=c<e?y:-y:g<je[1]?h+=d<c?y:-y:h+=s<d?y:-y:g<je[0]?h+=c<e?y:-y:h+=s<c?y:-y)}return h}function i5(r,e,t,a,n,i,o,s){if(s>e&&s>a&&s>i||s<e&&s<a&&s<i)return 0;var l=pE(e,a,i,s,Te);if(l===0)return 0;var u=e2(e,a,i);if(u>=0&&u<=1){for(var f=0,h=se(e,a,i,u),v=0;v<l;v++){var c=Te[v]===0||Te[v]===1?.5:1,d=se(r,t,n,Te[v]);d<o||(Te[v]<u?f+=h<e?c:-c:f+=i<h?c:-c)}return f}else{var c=Te[0]===0||Te[0]===1?.5:1,d=se(r,t,n,Te[0]);return d<o?0:i<e?c:-c}}function o5(r,e,t,a,n,i,o,s){if(s-=e,s>t||s<-t)return 0;var l=Math.sqrt(t*t-s*s);Te[0]=-l,Te[1]=l;var u=Math.abs(a-n);if(u<1e-4)return 0;if(u>=An-1e-4){a=0,n=An;var f=i?1:-1;return o>=Te[0]+r&&o<=Te[1]+r?f:0}if(a>n){var h=a;a=n,n=h}a<0&&(a+=An,n+=An);for(var v=0,c=0;c<2;c++){var d=Te[c];if(d+r>o){var p=Math.atan2(s,d),f=i?1:-1;p<0&&(p=An+p),(p>=a&&p<=n||p+An>=a&&p+An<=n)&&(p>Math.PI/2&&p<Math.PI*1.5&&(f=-f),v+=f)}}return v}function z2(r,e,t,a,n){for(var i=r.data,o=r.len(),s=0,l=0,u=0,f=0,h=0,v,c,d=0;d<o;){var p=i[d++],g=d===1;switch(p===La.M&&d>1&&(t||(s+=sa(l,u,f,h,a,n))),g&&(l=i[d],u=i[d+1],f=l,h=u),p){case La.M:f=i[d++],h=i[d++],l=f,u=h;break;case La.L:if(t){if(za(l,u,i[d],i[d+1],e,a,n))return!0}else s+=sa(l,u,i[d],i[d+1],a,n)||0;l=i[d++],u=i[d++];break;case La.C:if(t){if(jk(l,u,i[d++],i[d++],i[d++],i[d++],i[d],i[d+1],e,a,n))return!0}else s+=n5(l,u,i[d++],i[d++],i[d++],i[d++],i[d],i[d+1],a,n)||0;l=i[d++],u=i[d++];break;case La.Q:if(t){if(V2(l,u,i[d++],i[d++],i[d],i[d+1],e,a,n))return!0}else s+=i5(l,u,i[d++],i[d++],i[d],i[d+1],a,n)||0;l=i[d++],u=i[d++];break;case La.A:var y=i[d++],m=i[d++],_=i[d++],S=i[d++],w=i[d++],x=i[d++];d+=1;var b=!!(1-i[d++]);v=Math.cos(w)*_+y,c=Math.sin(w)*S+m,g?(f=v,h=c):s+=sa(l,u,v,c,a,n);var C=(a-y)*S/_+y;if(t){if(t5(y,m,S,w,w+x,b,e,C,n))return!0}else s+=o5(y,m,S,w,w+x,b,C,n);l=Math.cos(w+x)*_+y,u=Math.sin(w+x)*S+m;break;case La.R:f=l=i[d++],h=u=i[d++];var T=i[d++],D=i[d++];if(v=f+T,c=h+D,t){if(za(f,h,v,h,e,a,n)||za(v,h,v,c,e,a,n)||za(v,c,f,c,e,a,n)||za(f,c,f,h,e,a,n))return!0}else s+=sa(v,h,v,c,a,n),s+=sa(f,c,f,h,a,n);break;case La.Z:if(t){if(za(l,u,f,h,e,a,n))return!0}else s+=sa(l,u,f,h,a,n);l=f,u=h;break}}return!t&&!r5(u,h)&&(s+=sa(l,u,f,h,a,n)||0),s!==0}function s5(r,e,t){return z2(r,0,!1,e,t)}function l5(r,e,t,a){return z2(r,e,!0,t,a)}var Tf=tt({fill:\"#000\",stroke:null,strokePercent:1,fillOpacity:1,strokeOpacity:1,lineDashOffset:0,lineWidth:1,lineCap:\"butt\",miterLimit:10,strokeNoScale:!1,strokeFirst:!1},ii),u5={style:tt({fill:!0,stroke:!0,strokePercent:!0,fillOpacity:!0,strokeOpacity:!0,lineDashOffset:!0,lineWidth:!0,miterLimit:!0},Sh.style)},Pv=qr.concat([\"invisible\",\"culling\",\"z\",\"z2\",\"zlevel\",\"parent\"]),f5=function(r){k(e,r);function e(t){return r.call(this,t)||this}return e.prototype.update=function(){var t=this;r.prototype.update.call(this);var a=this.style;if(a.decal){var n=this._decalEl=this._decalEl||new e;n.buildPath===e.prototype.buildPath&&(n.buildPath=function(l){t.buildPath(l,t.shape)}),n.silent=!0;var i=n.style;for(var o in a)i[o]!==a[o]&&(i[o]=a[o]);i.fill=a.fill?a.decal:null,i.decal=null,i.shadowColor=null,a.strokeFirst&&(i.stroke=null);for(var s=0;s<Pv.length;++s)n[Pv[s]]=this[Pv[s]];n.__dirty|=He}else this._decalEl&&(this._decalEl=null)},e.prototype.getDecalElement=function(){return this._decalEl},e.prototype._init=function(t){var a=St(t);this.shape=this.getDefaultShape();var n=this.getDefaultStyle();n&&this.useStyle(n);for(var i=0;i<a.length;i++){var o=a[i],s=t[o];o===\"style\"?this.style?V(this.style,s):this.useStyle(s):o===\"shape\"?V(this.shape,s):r.prototype.attrKV.call(this,o,s)}this.style||this.useStyle({})},e.prototype.getDefaultStyle=function(){return null},e.prototype.getDefaultShape=function(){return{}},e.prototype.canBeInsideText=function(){return this.hasFill()},e.prototype.getInsideTextFill=function(){var t=this.style.fill;if(t!==\"none\"){if(U(t)){var a=Sf(t,0);return a>.5?Yd:a>.2?ZE:Zd}else if(t)return Zd}return Yd},e.prototype.getInsideTextStroke=function(t){var a=this.style.fill;if(U(a)){var n=this.__zr,i=!!(n&&n.isDarkMode()),o=Sf(t,0)<Ud;if(i===o)return a}},e.prototype.buildPath=function(t,a,n){},e.prototype.pathUpdated=function(){this.__dirty&=~Ji},e.prototype.getUpdatedPathProxy=function(t){return!this.path&&this.createPathProxy(),this.path.beginPath(),this.buildPath(this.path,this.shape,t),this.path},e.prototype.createPathProxy=function(){this.path=new Jr(!1)},e.prototype.hasStroke=function(){var t=this.style,a=t.stroke;return!(a==null||a===\"none\"||!(t.lineWidth>0))},e.prototype.hasFill=function(){var t=this.style,a=t.fill;return a!=null&&a!==\"none\"},e.prototype.getBoundingRect=function(){var t=this._rect,a=this.style,n=!t;if(n){var i=!1;this.path||(i=!0,this.createPathProxy());var o=this.path;(i||this.__dirty&Ji)&&(o.beginPath(),this.buildPath(o,this.shape,!1),this.pathUpdated()),t=o.getBoundingRect()}if(this._rect=t,this.hasStroke()&&this.path&&this.path.len()>0){var s=this._rectStroke||(this._rectStroke=t.clone());if(this.__dirty||n){s.copy(t);var l=a.strokeNoScale?this.getLineScale():1,u=a.lineWidth;if(!this.hasFill()){var f=this.strokeContainThreshold;u=Math.max(u,f==null?4:f)}l>1e-10&&(s.width+=u/l,s.height+=u/l,s.x-=u/l/2,s.y-=u/l/2)}return s}return t},e.prototype.contain=function(t,a){var n=this.transformCoordToLocal(t,a),i=this.getBoundingRect(),o=this.style;if(t=n[0],a=n[1],i.contain(t,a)){var s=this.path;if(this.hasStroke()){var l=o.lineWidth,u=o.strokeNoScale?this.getLineScale():1;if(u>1e-10&&(this.hasFill()||(l=Math.max(l,this.strokeContainThreshold)),l5(s,l/u,t,a)))return!0}if(this.hasFill())return s5(s,t,a)}return!1},e.prototype.dirtyShape=function(){this.__dirty|=Ji,this._rect&&(this._rect=null),this._decalEl&&this._decalEl.dirtyShape(),this.markRedraw()},e.prototype.dirty=function(){this.dirtyStyle(),this.dirtyShape()},e.prototype.animateShape=function(t){return this.animate(\"shape\",t)},e.prototype.updateDuringAnimation=function(t){t===\"style\"?this.dirtyStyle():t===\"shape\"?this.dirtyShape():this.markRedraw()},e.prototype.attrKV=function(t,a){t===\"shape\"?this.setShape(a):r.prototype.attrKV.call(this,t,a)},e.prototype.setShape=function(t,a){var n=this.shape;return n||(n=this.shape={}),typeof t==\"string\"?n[t]=a:V(n,t),this.dirtyShape(),this},e.prototype.shapeChanged=function(){return!!(this.__dirty&Ji)},e.prototype.createStyle=function(t){return dh(Tf,t)},e.prototype._innerSaveToNormal=function(t){r.prototype._innerSaveToNormal.call(this,t);var a=this._normalState;t.shape&&!a.shape&&(a.shape=V({},this.shape))},e.prototype._applyStateObj=function(t,a,n,i,o,s){r.prototype._applyStateObj.call(this,t,a,n,i,o,s);var l=!(a&&i),u;if(a&&a.shape?o?i?u=a.shape:(u=V({},n.shape),V(u,a.shape)):(u=V({},i?this.shape:n.shape),V(u,a.shape)):l&&(u=n.shape),u)if(o){this.shape=V({},this.shape);for(var f={},h=St(u),v=0;v<h.length;v++){var c=h[v];typeof u[c]==\"object\"?this.shape[c]=u[c]:f[c]=u[c]}this._transitionState(t,{shape:f},s)}else this.shape=u,this.dirtyShape()},e.prototype._mergeStates=function(t){for(var a=r.prototype._mergeStates.call(this,t),n,i=0;i<t.length;i++){var o=t[i];o.shape&&(n=n||{},this._mergeStyle(n,o.shape))}return n&&(a.shape=n),a},e.prototype.getAnimationStyleProps=function(){return u5},e.prototype.isZeroArea=function(){return!1},e.extend=function(t){var a=function(i){k(o,i);function o(s){var l=i.call(this,s)||this;return t.init&&t.init.call(l,s),l}return o.prototype.getDefaultStyle=function(){return at(t.style)},o.prototype.getDefaultShape=function(){return at(t.shape)},o}(e);for(var n in t)typeof t[n]==\"function\"&&(a.prototype[n]=t[n]);return a},e.initDefaultProps=function(){var t=e.prototype;t.type=\"path\",t.strokeContainThreshold=5,t.segmentIgnoreThreshold=0,t.subPixelOptimize=!1,t.autoBatch=!1,t.__dirty=He|cs|Ji}(),e}(fr),mt=f5,h5=tt({strokeFirst:!0,font:tn,x:0,y:0,textAlign:\"left\",textBaseline:\"top\",miterLimit:2},Tf),F2=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.hasStroke=function(){var t=this.style,a=t.stroke;return a!=null&&a!==\"none\"&&t.lineWidth>0},e.prototype.hasFill=function(){var t=this.style,a=t.fill;return a!=null&&a!==\"none\"},e.prototype.createStyle=function(t){return dh(h5,t)},e.prototype.setBoundingRect=function(t){this._rect=t},e.prototype.getBoundingRect=function(){var t=this.style;if(!this._rect){var a=t.text;a!=null?a+=\"\":a=\"\";var n=xl(a,t.font,t.textAlign,t.textBaseline);if(n.x+=t.x||0,n.y+=t.y||0,this.hasStroke()){var i=t.lineWidth;n.x-=i/2,n.y-=i/2,n.width+=i,n.height+=i}this._rect=n}return this._rect},e.initDefaultProps=function(){var t=e.prototype;t.dirtyRectTolerance=10}(),e}(fr);F2.prototype.type=\"tspan\";var Xs=F2,v5=tt({x:0,y:0},ii),c5={style:tt({x:!0,y:!0,width:!0,height:!0,sx:!0,sy:!0,sWidth:!0,sHeight:!0},Sh.style)};function d5(r){return!!(r&&typeof r!=\"string\"&&r.width&&r.height)}var G2=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.createStyle=function(t){return dh(v5,t)},e.prototype._getSize=function(t){var a=this.style,n=a[t];if(n!=null)return n;var i=d5(a.image)?a.image:this.__image;if(!i)return 0;var o=t===\"width\"?\"height\":\"width\",s=a[o];return s==null?i[t]:i[t]/i[o]*s},e.prototype.getWidth=function(){return this._getSize(\"width\")},e.prototype.getHeight=function(){return this._getSize(\"height\")},e.prototype.getAnimationStyleProps=function(){return c5},e.prototype.getBoundingRect=function(){var t=this.style;return this._rect||(this._rect=new vt(t.x||0,t.y||0,this.getWidth(),this.getHeight())),this._rect},e}(fr);G2.prototype.type=\"image\";var pe=G2;function p5(r,e){var t=e.x,a=e.y,n=e.width,i=e.height,o=e.r,s,l,u,f;n<0&&(t=t+n,n=-n),i<0&&(a=a+i,i=-i),typeof o==\"number\"?s=l=u=f=o:o instanceof Array?o.length===1?s=l=u=f=o[0]:o.length===2?(s=u=o[0],l=f=o[1]):o.length===3?(s=o[0],l=f=o[1],u=o[2]):(s=o[0],l=o[1],u=o[2],f=o[3]):s=l=u=f=0;var h;s+l>n&&(h=s+l,s*=n/h,l*=n/h),u+f>n&&(h=u+f,u*=n/h,f*=n/h),l+u>i&&(h=l+u,l*=i/h,u*=i/h),s+f>i&&(h=s+f,s*=i/h,f*=i/h),r.moveTo(t+s,a),r.lineTo(t+n-l,a),l!==0&&r.arc(t+n-l,a+l,l,-Math.PI/2,0),r.lineTo(t+n,a+i-u),u!==0&&r.arc(t+n-u,a+i-u,u,0,Math.PI/2),r.lineTo(t+f,a+i),f!==0&&r.arc(t+f,a+i-f,f,Math.PI/2,Math.PI),r.lineTo(t,a+s),s!==0&&r.arc(t+s,a+s,s,Math.PI,Math.PI*1.5)}var ao=Math.round;function H2(r,e,t){if(!!e){var a=e.x1,n=e.x2,i=e.y1,o=e.y2;r.x1=a,r.x2=n,r.y1=i,r.y2=o;var s=t&&t.lineWidth;return s&&(ao(a*2)===ao(n*2)&&(r.x1=r.x2=Kn(a,s,!0)),ao(i*2)===ao(o*2)&&(r.y1=r.y2=Kn(i,s,!0))),r}}function W2(r,e,t){if(!!e){var a=e.x,n=e.y,i=e.width,o=e.height;r.x=a,r.y=n,r.width=i,r.height=o;var s=t&&t.lineWidth;return s&&(r.x=Kn(a,s,!0),r.y=Kn(n,s,!0),r.width=Math.max(Kn(a+i,s,!1)-r.x,i===0?0:1),r.height=Math.max(Kn(n+o,s,!1)-r.y,o===0?0:1)),r}}function Kn(r,e,t){if(!e)return r;var a=ao(r*2);return(a+ao(e))%2===0?a/2:(a+(t?1:-1))/2}var g5=function(){function r(){this.x=0,this.y=0,this.width=0,this.height=0}return r}(),y5={},$2=function(r){k(e,r);function e(t){return r.call(this,t)||this}return e.prototype.getDefaultShape=function(){return new g5},e.prototype.buildPath=function(t,a){var n,i,o,s;if(this.subPixelOptimize){var l=W2(y5,a,this.style);n=l.x,i=l.y,o=l.width,s=l.height,l.r=a.r,a=l}else n=a.x,i=a.y,o=a.width,s=a.height;a.r?p5(t,a):t.rect(n,i,o,s)},e.prototype.isZeroArea=function(){return!this.shape.width||!this.shape.height},e}(mt);$2.prototype.type=\"rect\";var bt=$2,_0={fill:\"#000\"},S0=2,m5={style:tt({fill:!0,stroke:!0,fillOpacity:!0,strokeOpacity:!0,lineWidth:!0,fontSize:!0,lineHeight:!0,width:!0,height:!0,textShadowColor:!0,textShadowBlur:!0,textShadowOffsetX:!0,textShadowOffsetY:!0,backgroundColor:!0,padding:!0,borderColor:!0,borderWidth:!0,borderRadius:!0},Sh.style)},U2=function(r){k(e,r);function e(t){var a=r.call(this)||this;return a.type=\"text\",a._children=[],a._defaultStyle=_0,a.attr(t),a}return e.prototype.childrenRef=function(){return this._children},e.prototype.update=function(){r.prototype.update.call(this),this.styleChanged()&&this._updateSubTexts();for(var t=0;t<this._children.length;t++){var a=this._children[t];a.zlevel=this.zlevel,a.z=this.z,a.z2=this.z2,a.culling=this.culling,a.cursor=this.cursor,a.invisible=this.invisible}},e.prototype.updateTransform=function(){var t=this.innerTransformable;t?(t.updateTransform(),t.transform&&(this.transform=t.transform)):r.prototype.updateTransform.call(this)},e.prototype.getLocalTransform=function(t){var a=this.innerTransformable;return a?a.getLocalTransform(t):r.prototype.getLocalTransform.call(this,t)},e.prototype.getComputedTransform=function(){return this.__hostTarget&&(this.__hostTarget.getComputedTransform(),this.__hostTarget.updateInnerText(!0)),r.prototype.getComputedTransform.call(this)},e.prototype._updateSubTexts=function(){this._childCursor=0,x5(this.style),this.style.rich?this._updateRichTexts():this._updatePlainTexts(),this._children.length=this._childCursor,this.styleUpdated()},e.prototype.addSelfToZr=function(t){r.prototype.addSelfToZr.call(this,t);for(var a=0;a<this._children.length;a++)this._children[a].__zr=t},e.prototype.removeSelfFromZr=function(t){r.prototype.removeSelfFromZr.call(this,t);for(var a=0;a<this._children.length;a++)this._children[a].__zr=null},e.prototype.getBoundingRect=function(){if(this.styleChanged()&&this._updateSubTexts(),!this._rect){for(var t=new vt(0,0,0,0),a=this._children,n=[],i=null,o=0;o<a.length;o++){var s=a[o],l=s.getBoundingRect(),u=s.getLocalTransform(n);u?(t.copy(l),t.applyTransform(u),i=i||t.clone(),i.union(t)):(i=i||l.clone(),i.union(l))}this._rect=i||t}return this._rect},e.prototype.setDefaultTextStyle=function(t){this._defaultStyle=t||_0},e.prototype.setTextContent=function(t){},e.prototype._mergeStyle=function(t,a){if(!a)return t;var n=a.rich,i=t.rich||n&&{};return V(t,a),n&&i?(this._mergeRich(i,n),t.rich=i):i&&(t.rich=i),t},e.prototype._mergeRich=function(t,a){for(var n=St(a),i=0;i<n.length;i++){var o=n[i];t[o]=t[o]||{},V(t[o],a[o])}},e.prototype.getAnimationStyleProps=function(){return m5},e.prototype._getOrCreateChild=function(t){var a=this._children[this._childCursor];return(!a||!(a instanceof t))&&(a=new t),this._children[this._childCursor++]=a,a.__zr=this.__zr,a.parent=this,a},e.prototype._updatePlainTexts=function(){var t=this.style,a=t.font||tn,n=t.padding,i=D0(t),o=Fk(i,t),s=Rv(t),l=!!t.backgroundColor,u=o.outerHeight,f=o.outerWidth,h=o.contentWidth,v=o.lines,c=o.lineHeight,d=this._defaultStyle,p=t.x||0,g=t.y||0,y=t.align||d.align||\"left\",m=t.verticalAlign||d.verticalAlign||\"top\",_=p,S=Qi(g,o.contentHeight,m);if(s||n){var w=ps(p,f,y),x=Qi(g,u,m);s&&this._renderBackground(t,t,w,x,f,u)}S+=c/2,n&&(_=A0(p,y,n),m===\"top\"?S+=n[0]:m===\"bottom\"&&(S-=n[2]));for(var b=0,C=!1,T=T0(\"fill\"in t?t.fill:(C=!0,d.fill)),D=C0(\"stroke\"in t?t.stroke:!l&&(!d.autoStroke||C)?(b=S0,d.stroke):null),M=t.textShadowBlur>0,L=t.width!=null&&(t.overflow===\"truncate\"||t.overflow===\"break\"||t.overflow===\"breakAll\"),I=o.calculatedLineHeight,P=0;P<v.length;P++){var R=this._getOrCreateChild(Xs),E=R.createStyle();R.useStyle(E),E.text=v[P],E.x=_,E.y=S,y&&(E.textAlign=y),E.textBaseline=\"middle\",E.opacity=t.opacity,E.strokeFirst=!0,M&&(E.shadowBlur=t.textShadowBlur||0,E.shadowColor=t.textShadowColor||\"transparent\",E.shadowOffsetX=t.textShadowOffsetX||0,E.shadowOffsetY=t.textShadowOffsetY||0),E.stroke=D,E.fill=T,D&&(E.lineWidth=t.lineWidth||b,E.lineDash=t.lineDash,E.lineDashOffset=t.lineDashOffset||0),E.font=a,w0(E,t),S+=c,L&&R.setBoundingRect(new vt(ps(E.x,t.width,E.textAlign),Qi(E.y,I,E.textBaseline),h,I))}},e.prototype._updateRichTexts=function(){var t=this.style,a=D0(t),n=Wk(a,t),i=n.width,o=n.outerWidth,s=n.outerHeight,l=t.padding,u=t.x||0,f=t.y||0,h=this._defaultStyle,v=t.align||h.align,c=t.verticalAlign||h.verticalAlign,d=ps(u,o,v),p=Qi(f,s,c),g=d,y=p;l&&(g+=l[3],y+=l[0]);var m=g+i;Rv(t)&&this._renderBackground(t,t,d,p,o,s);for(var _=!!t.backgroundColor,S=0;S<n.lines.length;S++){for(var w=n.lines[S],x=w.tokens,b=x.length,C=w.lineHeight,T=w.width,D=0,M=g,L=m,I=b-1,P=void 0;D<b&&(P=x[D],!P.align||P.align===\"left\");)this._placeToken(P,t,C,y,M,\"left\",_),T-=P.width,M+=P.width,D++;for(;I>=0&&(P=x[I],P.align===\"right\");)this._placeToken(P,t,C,y,L,\"right\",_),T-=P.width,L-=P.width,I--;for(M+=(i-(M-g)-(m-L)-T)/2;D<=I;)P=x[D],this._placeToken(P,t,C,y,M+P.width/2,\"center\",_),M+=P.width,D++;y+=C}},e.prototype._placeToken=function(t,a,n,i,o,s,l){var u=a.rich[t.styleName]||{};u.text=t.text;var f=t.verticalAlign,h=i+n/2;f===\"top\"?h=i+t.height/2:f===\"bottom\"&&(h=i+n-t.height/2);var v=!t.isLineHolder&&Rv(u);v&&this._renderBackground(u,a,s===\"right\"?o-t.width:s===\"center\"?o-t.width/2:o,h-t.height/2,t.width,t.height);var c=!!u.backgroundColor,d=t.textPadding;d&&(o=A0(o,s,d),h-=t.height/2-d[0]-t.innerHeight/2);var p=this._getOrCreateChild(Xs),g=p.createStyle();p.useStyle(g);var y=this._defaultStyle,m=!1,_=0,S=T0(\"fill\"in u?u.fill:\"fill\"in a?a.fill:(m=!0,y.fill)),w=C0(\"stroke\"in u?u.stroke:\"stroke\"in a?a.stroke:!c&&!l&&(!y.autoStroke||m)?(_=S0,y.stroke):null),x=u.textShadowBlur>0||a.textShadowBlur>0;g.text=t.text,g.x=o,g.y=h,x&&(g.shadowBlur=u.textShadowBlur||a.textShadowBlur||0,g.shadowColor=u.textShadowColor||a.textShadowColor||\"transparent\",g.shadowOffsetX=u.textShadowOffsetX||a.textShadowOffsetX||0,g.shadowOffsetY=u.textShadowOffsetY||a.textShadowOffsetY||0),g.textAlign=s,g.textBaseline=\"middle\",g.font=t.font||tn,g.opacity=Ur(u.opacity,a.opacity,1),w0(g,u),w&&(g.lineWidth=Ur(u.lineWidth,a.lineWidth,_),g.lineDash=ft(u.lineDash,a.lineDash),g.lineDashOffset=a.lineDashOffset||0,g.stroke=w),S&&(g.fill=S);var b=t.contentWidth,C=t.contentHeight;p.setBoundingRect(new vt(ps(g.x,b,g.textAlign),Qi(g.y,C,g.textBaseline),b,C))},e.prototype._renderBackground=function(t,a,n,i,o,s){var l=t.backgroundColor,u=t.borderWidth,f=t.borderColor,h=l&&l.image,v=l&&!h,c=t.borderRadius,d=this,p,g;if(v||t.lineHeight||u&&f){p=this._getOrCreateChild(bt),p.useStyle(p.createStyle()),p.style.fill=null;var y=p.shape;y.x=n,y.y=i,y.width=o,y.height=s,y.r=c,p.dirtyShape()}if(v){var m=p.style;m.fill=l||null,m.fillOpacity=ft(t.fillOpacity,1)}else if(h){g=this._getOrCreateChild(pe),g.onload=function(){d.dirtyStyle()};var _=g.style;_.image=l.image,_.x=n,_.y=i,_.width=o,_.height=s}if(u&&f){var m=p.style;m.lineWidth=u,m.stroke=f,m.strokeOpacity=ft(t.strokeOpacity,1),m.lineDash=t.borderDash,m.lineDashOffset=t.borderDashOffset||0,p.strokeContainThreshold=0,p.hasFill()&&p.hasStroke()&&(m.strokeFirst=!0,m.lineWidth*=2)}var S=(p||g).style;S.shadowBlur=t.shadowBlur||0,S.shadowColor=t.shadowColor||\"transparent\",S.shadowOffsetX=t.shadowOffsetX||0,S.shadowOffsetY=t.shadowOffsetY||0,S.opacity=Ur(t.opacity,a.opacity,1)},e.makeFont=function(t){var a=\"\";return Z2(t)&&(a=[t.fontStyle,t.fontWeight,Y2(t.fontSize),t.fontFamily||\"sans-serif\"].join(\" \")),a&&Sr(a)||t.textFont||t.font},e}(fr),_5={left:!0,right:1,center:1},S5={top:1,bottom:1,middle:1},x0=[\"fontStyle\",\"fontWeight\",\"fontSize\",\"fontFamily\"];function Y2(r){return typeof r==\"string\"&&(r.indexOf(\"px\")!==-1||r.indexOf(\"rem\")!==-1||r.indexOf(\"em\")!==-1)?r:isNaN(+r)?pg+\"px\":r+\"px\"}function w0(r,e){for(var t=0;t<x0.length;t++){var a=x0[t],n=e[a];n!=null&&(r[a]=n)}}function Z2(r){return r.fontSize!=null||r.fontFamily||r.fontWeight}function x5(r){return b0(r),A(r.rich,b0),r}function b0(r){if(r){r.font=U2.makeFont(r);var e=r.align;e===\"middle\"&&(e=\"center\"),r.align=e==null||_5[e]?e:\"left\";var t=r.verticalAlign;t===\"center\"&&(t=\"middle\"),r.verticalAlign=t==null||S5[t]?t:\"top\";var a=r.padding;a&&(r.padding=xg(r.padding))}}function C0(r,e){return r==null||e<=0||r===\"transparent\"||r===\"none\"?null:r.image||r.colorStops?\"#000\":r}function T0(r){return r==null||r===\"none\"?null:r.image||r.colorStops?\"#000\":r}function A0(r,e,t){return e===\"right\"?r-t[1]:e===\"center\"?r+t[3]/2-t[1]/2:r+t[3]}function D0(r){var e=r.text;return e!=null&&(e+=\"\"),e}function Rv(r){return!!(r.backgroundColor||r.lineHeight||r.borderWidth&&r.borderColor)}var Dt=U2,it=Ct(),Qd=function(r,e,t,a){if(a){var n=it(a);n.dataIndex=t,n.dataType=e,n.seriesIndex=r,a.type===\"group\"&&a.traverse(function(i){var o=it(i);o.seriesIndex=r,o.dataIndex=t,o.dataType=e})}},M0=1,L0={},X2=Ct(),kg=Ct(),Og=0,bl=1,wh=2,Le=[\"emphasis\",\"blur\",\"select\"],qs=[\"normal\",\"emphasis\",\"blur\",\"select\"],To=10,w5=9,oi=\"highlight\",ef=\"downplay\",Is=\"select\",rf=\"unselect\",Ps=\"toggleSelect\";function ki(r){return r!=null&&r!==\"none\"}var I0=new Sl(100);function P0(r){if(U(r)){var e=I0.get(r);return e||(e=Vd(r,-.1),I0.put(r,e)),e}else if(ch(r)){var t=V({},r);return t.colorStops=G(r.colorStops,function(a){return{offset:a.offset,color:Vd(a.color,-.1)}}),t}return r}function bh(r,e,t){r.onHoverStateChange&&(r.hoverState||0)!==t&&r.onHoverStateChange(e),r.hoverState=t}function q2(r){bh(r,\"emphasis\",wh)}function K2(r){r.hoverState===wh&&bh(r,\"normal\",Og)}function Bg(r){bh(r,\"blur\",bl)}function J2(r){r.hoverState===bl&&bh(r,\"normal\",Og)}function b5(r){r.selected=!0}function C5(r){r.selected=!1}function R0(r,e,t){e(r,t)}function Ca(r,e,t){R0(r,e,t),r.isGroup&&r.traverse(function(a){R0(a,e,t)})}function Af(r,e){switch(e){case\"emphasis\":r.hoverState=wh;break;case\"normal\":r.hoverState=Og;break;case\"blur\":r.hoverState=bl;break;case\"select\":r.selected=!0}}function T5(r,e,t,a){for(var n=r.style,i={},o=0;o<e.length;o++){var s=e[o],l=n[s];i[s]=l==null?a&&a[s]:l}for(var o=0;o<r.animators.length;o++){var u=r.animators[o];u.__fromStateTransition&&u.__fromStateTransition.indexOf(t)<0&&u.targetName===\"style\"&&u.saveTo(i,e)}return i}function A5(r,e,t,a){var n=t&&dt(t,\"select\")>=0,i=!1;if(r instanceof mt){var o=X2(r),s=n&&o.selectFill||o.normalFill,l=n&&o.selectStroke||o.normalStroke;if(ki(s)||ki(l)){a=a||{};var u=a.style||{};u.fill===\"inherit\"?(i=!0,a=V({},a),u=V({},u),u.fill=s):!ki(u.fill)&&ki(s)?(i=!0,a=V({},a),u=V({},u),u.fill=P0(s)):!ki(u.stroke)&&ki(l)&&(i||(a=V({},a),u=V({},u)),u.stroke=P0(l)),a.style=u}}if(a&&a.z2==null){i||(a=V({},a));var f=r.z2EmphasisLift;a.z2=r.z2+(f!=null?f:To)}return a}function D5(r,e,t){if(t&&t.z2==null){t=V({},t);var a=r.z2SelectLift;t.z2=r.z2+(a!=null?a:w5)}return t}function M5(r,e,t){var a=dt(r.currentStates,e)>=0,n=r.style.opacity,i=a?null:T5(r,[\"opacity\"],e,{opacity:1});t=t||{};var o=t.style||{};return o.opacity==null&&(t=V({},t),o=V({opacity:a?n:i.opacity*.1},o),t.style=o),t}function Ev(r,e){var t=this.states[r];if(this.style){if(r===\"emphasis\")return A5(this,r,e,t);if(r===\"blur\")return M5(this,r,t);if(r===\"select\")return D5(this,r,t)}return t}function gi(r){r.stateProxy=Ev;var e=r.getTextContent(),t=r.getTextGuideLine();e&&(e.stateProxy=Ev),t&&(t.stateProxy=Ev)}function E0(r,e){!eC(r,e)&&!r.__highByOuter&&Ca(r,q2)}function k0(r,e){!eC(r,e)&&!r.__highByOuter&&Ca(r,K2)}function _a(r,e){r.__highByOuter|=1<<(e||0),Ca(r,q2)}function Sa(r,e){!(r.__highByOuter&=~(1<<(e||0)))&&Ca(r,K2)}function Q2(r){Ca(r,Bg)}function Ng(r){Ca(r,J2)}function j2(r){Ca(r,b5)}function tC(r){Ca(r,C5)}function eC(r,e){return r.__highDownSilentOnTouch&&e.zrByTouch}function rC(r){var e=r.getModel(),t=[],a=[];e.eachComponent(function(n,i){var o=kg(i),s=n===\"series\",l=s?r.getViewOfSeriesModel(i):r.getViewOfComponentModel(i);!s&&a.push(l),o.isBlured&&(l.group.traverse(function(u){J2(u)}),s&&t.push(i)),o.isBlured=!1}),A(a,function(n){n&&n.toggleBlurSeries&&n.toggleBlurSeries(t,!1,e)})}function jd(r,e,t,a){var n=a.getModel();t=t||\"coordinateSystem\";function i(u,f){for(var h=0;h<f.length;h++){var v=u.getItemGraphicEl(f[h]);v&&Ng(v)}}if(r!=null&&!(!e||e===\"none\")){var o=n.getSeriesByIndex(r),s=o.coordinateSystem;s&&s.master&&(s=s.master);var l=[];n.eachSeries(function(u){var f=o===u,h=u.coordinateSystem;h&&h.master&&(h=h.master);var v=h&&s?h===s:f;if(!(t===\"series\"&&!f||t===\"coordinateSystem\"&&!v||e===\"series\"&&f)){var c=a.getViewOfSeriesModel(u);if(c.group.traverse(function(g){g.__highByOuter&&f&&e===\"self\"||Bg(g)}),Se(e))i(u.getData(),e);else if(et(e))for(var d=St(e),p=0;p<d.length;p++)i(u.getData(d[p]),e[d[p]]);l.push(u),kg(u).isBlured=!0}}),n.eachComponent(function(u,f){if(u!==\"series\"){var h=a.getViewOfComponentModel(f);h&&h.toggleBlurSeries&&h.toggleBlurSeries(l,!0,n)}})}}function tp(r,e,t){if(!(r==null||e==null)){var a=t.getModel().getComponent(r,e);if(!!a){kg(a).isBlured=!0;var n=t.getViewOfComponentModel(a);!n||!n.focusBlurEnabled||n.group.traverse(function(i){Bg(i)})}}}function L5(r,e,t){var a=r.seriesIndex,n=r.getData(e.dataType);if(!!n){var i=di(n,e);i=(F(i)?i[0]:i)||0;var o=n.getItemGraphicEl(i);if(!o)for(var s=n.count(),l=0;!o&&l<s;)o=n.getItemGraphicEl(l++);if(o){var u=it(o);jd(a,u.focus,u.blurScope,t)}else{var f=r.get([\"emphasis\",\"focus\"]),h=r.get([\"emphasis\",\"blurScope\"]);f!=null&&jd(a,f,h,t)}}}function Vg(r,e,t,a){var n={focusSelf:!1,dispatchers:null};if(r==null||r===\"series\"||e==null||t==null)return n;var i=a.getModel().getComponent(r,e);if(!i)return n;var o=a.getViewOfComponentModel(i);if(!o||!o.findHighDownDispatchers)return n;for(var s=o.findHighDownDispatchers(t),l,u=0;u<s.length;u++)if(it(s[u]).focus===\"self\"){l=!0;break}return{focusSelf:l,dispatchers:s}}function I5(r,e,t){var a=it(r),n=Vg(a.componentMainType,a.componentIndex,a.componentHighDownName,t),i=n.dispatchers,o=n.focusSelf;i?(o&&tp(a.componentMainType,a.componentIndex,t),A(i,function(s){return E0(s,e)})):(jd(a.seriesIndex,a.focus,a.blurScope,t),a.focus===\"self\"&&tp(a.componentMainType,a.componentIndex,t),E0(r,e))}function P5(r,e,t){rC(t);var a=it(r),n=Vg(a.componentMainType,a.componentIndex,a.componentHighDownName,t).dispatchers;n?A(n,function(i){return k0(i,e)}):k0(r,e)}function R5(r,e,t){if(!!rp(e)){var a=e.dataType,n=r.getData(a),i=di(n,e);F(i)||(i=[i]),r[e.type===Ps?\"toggleSelect\":e.type===Is?\"select\":\"unselect\"](i,a)}}function O0(r){var e=r.getAllData();A(e,function(t){var a=t.data,n=t.type;a.eachItemGraphicEl(function(i,o){r.isSelected(o,n)?j2(i):tC(i)})})}function E5(r){var e=[];return r.eachSeries(function(t){var a=t.getAllData();A(a,function(n){n.data;var i=n.type,o=t.getSelectedDataIndices();if(o.length>0){var s={dataIndex:o,seriesIndex:t.seriesIndex};i!=null&&(s.dataType=i),e.push(s)}})}),e}function si(r,e,t){Jn(r,!0),Ca(r,gi),ep(r,e,t)}function k5(r){Jn(r,!1)}function $t(r,e,t,a){a?k5(r):si(r,e,t)}function ep(r,e,t){var a=it(r);e!=null?(a.focus=e,a.blurScope=t):a.focus&&(a.focus=null)}var B0=[\"emphasis\",\"blur\",\"select\"],O5={itemStyle:\"getItemStyle\",lineStyle:\"getLineStyle\",areaStyle:\"getAreaStyle\"};function ce(r,e,t,a){t=t||\"itemStyle\";for(var n=0;n<B0.length;n++){var i=B0[n],o=e.getModel([i,t]),s=r.ensureState(i);s.style=a?a(o):o[O5[t]]()}}function Jn(r,e){var t=e===!1,a=r;r.highDownSilentOnTouch&&(a.__highDownSilentOnTouch=r.highDownSilentOnTouch),(!t||a.__highDownDispatcher)&&(a.__highByOuter=a.__highByOuter||0,a.__highDownDispatcher=!t)}function Ks(r){return!!(r&&r.__highDownDispatcher)}function B5(r,e,t){var a=it(r);a.componentMainType=e.mainType,a.componentIndex=e.componentIndex,a.componentHighDownName=t}function N5(r){var e=L0[r];return e==null&&M0<=32&&(e=L0[r]=M0++),e}function rp(r){var e=r.type;return e===Is||e===rf||e===Ps}function N0(r){var e=r.type;return e===oi||e===ef}function V5(r){var e=X2(r);e.normalFill=r.style.fill,e.normalStroke=r.style.stroke;var t=r.states.select||{};e.selectFill=t.style&&t.style.fill||null,e.selectStroke=t.style&&t.style.stroke||null}var Oi=Jr.CMD,z5=[[],[],[]],V0=Math.sqrt,F5=Math.atan2;function aC(r,e){if(!!e){var t=r.data,a=r.len(),n,i,o,s,l,u,f=Oi.M,h=Oi.C,v=Oi.L,c=Oi.R,d=Oi.A,p=Oi.Q;for(o=0,s=0;o<a;){switch(n=t[o++],s=o,i=0,n){case f:i=1;break;case v:i=1;break;case h:i=3;break;case p:i=2;break;case d:var g=e[4],y=e[5],m=V0(e[0]*e[0]+e[1]*e[1]),_=V0(e[2]*e[2]+e[3]*e[3]),S=F5(-e[1]/_,e[0]/m);t[o]*=m,t[o++]+=g,t[o]*=_,t[o++]+=y,t[o++]*=m,t[o++]*=_,t[o++]+=S,t[o++]+=S,o+=2,s=o;break;case c:u[0]=t[o++],u[1]=t[o++],he(u,u,e),t[s++]=u[0],t[s++]=u[1],u[0]+=t[o++],u[1]+=t[o++],he(u,u,e),t[s++]=u[0],t[s++]=u[1]}for(l=0;l<i;l++){var w=z5[l];w[0]=t[o++],w[1]=t[o++],he(w,w,e),t[s++]=w[0],t[s++]=w[1]}}r.increaseVersion()}}var kv=Math.sqrt,eu=Math.sin,ru=Math.cos,Uo=Math.PI;function z0(r){return Math.sqrt(r[0]*r[0]+r[1]*r[1])}function ap(r,e){return(r[0]*e[0]+r[1]*e[1])/(z0(r)*z0(e))}function F0(r,e){return(r[0]*e[1]<r[1]*e[0]?-1:1)*Math.acos(ap(r,e))}function G0(r,e,t,a,n,i,o,s,l,u,f){var h=l*(Uo/180),v=ru(h)*(r-t)/2+eu(h)*(e-a)/2,c=-1*eu(h)*(r-t)/2+ru(h)*(e-a)/2,d=v*v/(o*o)+c*c/(s*s);d>1&&(o*=kv(d),s*=kv(d));var p=(n===i?-1:1)*kv((o*o*(s*s)-o*o*(c*c)-s*s*(v*v))/(o*o*(c*c)+s*s*(v*v)))||0,g=p*o*c/s,y=p*-s*v/o,m=(r+t)/2+ru(h)*g-eu(h)*y,_=(e+a)/2+eu(h)*g+ru(h)*y,S=F0([1,0],[(v-g)/o,(c-y)/s]),w=[(v-g)/o,(c-y)/s],x=[(-1*v-g)/o,(-1*c-y)/s],b=F0(w,x);if(ap(w,x)<=-1&&(b=Uo),ap(w,x)>=1&&(b=0),b<0){var C=Math.round(b/Uo*1e6)/1e6;b=Uo*2+C%2*Uo}f.addData(u,m,_,o,s,S,b,h,i)}var G5=/([mlvhzcqtsa])([^mlvhzcqtsa]*)/ig,H5=/-?([0-9]*\\.)?[0-9]+([eE]-?[0-9]+)?/g;function W5(r){var e=new Jr;if(!r)return e;var t=0,a=0,n=t,i=a,o,s=Jr.CMD,l=r.match(G5);if(!l)return e;for(var u=0;u<l.length;u++){for(var f=l[u],h=f.charAt(0),v=void 0,c=f.match(H5)||[],d=c.length,p=0;p<d;p++)c[p]=parseFloat(c[p]);for(var g=0;g<d;){var y=void 0,m=void 0,_=void 0,S=void 0,w=void 0,x=void 0,b=void 0,C=t,T=a,D=void 0,M=void 0;switch(h){case\"l\":t+=c[g++],a+=c[g++],v=s.L,e.addData(v,t,a);break;case\"L\":t=c[g++],a=c[g++],v=s.L,e.addData(v,t,a);break;case\"m\":t+=c[g++],a+=c[g++],v=s.M,e.addData(v,t,a),n=t,i=a,h=\"l\";break;case\"M\":t=c[g++],a=c[g++],v=s.M,e.addData(v,t,a),n=t,i=a,h=\"L\";break;case\"h\":t+=c[g++],v=s.L,e.addData(v,t,a);break;case\"H\":t=c[g++],v=s.L,e.addData(v,t,a);break;case\"v\":a+=c[g++],v=s.L,e.addData(v,t,a);break;case\"V\":a=c[g++],v=s.L,e.addData(v,t,a);break;case\"C\":v=s.C,e.addData(v,c[g++],c[g++],c[g++],c[g++],c[g++],c[g++]),t=c[g-2],a=c[g-1];break;case\"c\":v=s.C,e.addData(v,c[g++]+t,c[g++]+a,c[g++]+t,c[g++]+a,c[g++]+t,c[g++]+a),t+=c[g-2],a+=c[g-1];break;case\"S\":y=t,m=a,D=e.len(),M=e.data,o===s.C&&(y+=t-M[D-4],m+=a-M[D-3]),v=s.C,C=c[g++],T=c[g++],t=c[g++],a=c[g++],e.addData(v,y,m,C,T,t,a);break;case\"s\":y=t,m=a,D=e.len(),M=e.data,o===s.C&&(y+=t-M[D-4],m+=a-M[D-3]),v=s.C,C=t+c[g++],T=a+c[g++],t+=c[g++],a+=c[g++],e.addData(v,y,m,C,T,t,a);break;case\"Q\":C=c[g++],T=c[g++],t=c[g++],a=c[g++],v=s.Q,e.addData(v,C,T,t,a);break;case\"q\":C=c[g++]+t,T=c[g++]+a,t+=c[g++],a+=c[g++],v=s.Q,e.addData(v,C,T,t,a);break;case\"T\":y=t,m=a,D=e.len(),M=e.data,o===s.Q&&(y+=t-M[D-4],m+=a-M[D-3]),t=c[g++],a=c[g++],v=s.Q,e.addData(v,y,m,t,a);break;case\"t\":y=t,m=a,D=e.len(),M=e.data,o===s.Q&&(y+=t-M[D-4],m+=a-M[D-3]),t+=c[g++],a+=c[g++],v=s.Q,e.addData(v,y,m,t,a);break;case\"A\":_=c[g++],S=c[g++],w=c[g++],x=c[g++],b=c[g++],C=t,T=a,t=c[g++],a=c[g++],v=s.A,G0(C,T,t,a,x,b,_,S,w,v,e);break;case\"a\":_=c[g++],S=c[g++],w=c[g++],x=c[g++],b=c[g++],C=t,T=a,t+=c[g++],a+=c[g++],v=s.A,G0(C,T,t,a,x,b,_,S,w,v,e);break}}(h===\"z\"||h===\"Z\")&&(v=s.Z,e.addData(v),t=n,a=i),o=v}return e.toStatic(),e}var nC=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.applyTransform=function(t){},e}(mt);function iC(r){return r.setData!=null}function oC(r,e){var t=W5(r),a=V({},e);return a.buildPath=function(n){if(iC(n)){n.setData(t.data);var i=n.getContext();i&&n.rebuildPath(i,1)}else{var i=n;t.rebuildPath(i,1)}},a.applyTransform=function(n){aC(t,n),this.dirtyShape()},a}function sC(r,e){return new nC(oC(r,e))}function $5(r,e){var t=oC(r,e),a=function(n){k(i,n);function i(o){var s=n.call(this,o)||this;return s.applyTransform=t.applyTransform,s.buildPath=t.buildPath,s}return i}(nC);return a}function U5(r,e){for(var t=[],a=r.length,n=0;n<a;n++){var i=r[n];t.push(i.getUpdatedPathProxy(!0))}var o=new mt(e);return o.createPathProxy(),o.buildPath=function(s){if(iC(s)){s.appendPath(t);var l=s.getContext();l&&s.rebuildPath(l,1)}},o}function zg(r,e){e=e||{};var t=new mt;return r.shape&&t.setShape(r.shape),t.setStyle(r.style),e.bakeTransform?aC(t.path,r.getComputedTransform()):e.toLocal?t.setLocalTransform(r.getComputedTransform()):t.copyTransform(r),t.buildPath=r.buildPath,t.applyTransform=t.applyTransform,t.z=r.z,t.z2=r.z2,t.zlevel=r.zlevel,t}var Y5=function(){function r(){this.cx=0,this.cy=0,this.r=0}return r}(),lC=function(r){k(e,r);function e(t){return r.call(this,t)||this}return e.prototype.getDefaultShape=function(){return new Y5},e.prototype.buildPath=function(t,a){t.moveTo(a.cx+a.r,a.cy),t.arc(a.cx,a.cy,a.r,0,Math.PI*2)},e}(mt);lC.prototype.type=\"circle\";var Qr=lC,Z5=function(){function r(){this.cx=0,this.cy=0,this.rx=0,this.ry=0}return r}(),uC=function(r){k(e,r);function e(t){return r.call(this,t)||this}return e.prototype.getDefaultShape=function(){return new Z5},e.prototype.buildPath=function(t,a){var n=.5522848,i=a.cx,o=a.cy,s=a.rx,l=a.ry,u=s*n,f=l*n;t.moveTo(i-s,o),t.bezierCurveTo(i-s,o-f,i-u,o-l,i,o-l),t.bezierCurveTo(i+u,o-l,i+s,o-f,i+s,o),t.bezierCurveTo(i+s,o+f,i+u,o+l,i,o+l),t.bezierCurveTo(i-u,o+l,i-s,o+f,i-s,o),t.closePath()},e}(mt);uC.prototype.type=\"ellipse\";var Fg=uC,fC=Math.PI,Ov=fC*2,Dn=Math.sin,Bi=Math.cos,X5=Math.acos,ye=Math.atan2,H0=Math.abs,Rs=Math.sqrt,gs=Math.max,Rr=Math.min,gr=1e-4;function q5(r,e,t,a,n,i,o,s){var l=t-r,u=a-e,f=o-n,h=s-i,v=h*l-f*u;if(!(v*v<gr))return v=(f*(e-i)-h*(r-n))/v,[r+v*l,e+v*u]}function au(r,e,t,a,n,i,o){var s=r-t,l=e-a,u=(o?i:-i)/Rs(s*s+l*l),f=u*l,h=-u*s,v=r+f,c=e+h,d=t+f,p=a+h,g=(v+d)/2,y=(c+p)/2,m=d-v,_=p-c,S=m*m+_*_,w=n-i,x=v*p-d*c,b=(_<0?-1:1)*Rs(gs(0,w*w*S-x*x)),C=(x*_-m*b)/S,T=(-x*m-_*b)/S,D=(x*_+m*b)/S,M=(-x*m+_*b)/S,L=C-g,I=T-y,P=D-g,R=M-y;return L*L+I*I>P*P+R*R&&(C=D,T=M),{cx:C,cy:T,x0:-f,y0:-h,x1:C*(n/w-1),y1:T*(n/w-1)}}function K5(r){var e;if(F(r)){var t=r.length;if(!t)return r;t===1?e=[r[0],r[0],0,0]:t===2?e=[r[0],r[0],r[1],r[1]]:t===3?e=r.concat(r[2]):e=r}else e=[r,r,r,r];return e}function J5(r,e){var t,a=gs(e.r,0),n=gs(e.r0||0,0),i=a>0,o=n>0;if(!(!i&&!o)){if(i||(a=n,n=0),n>a){var s=a;a=n,n=s}var l=e.startAngle,u=e.endAngle;if(!(isNaN(l)||isNaN(u))){var f=e.cx,h=e.cy,v=!!e.clockwise,c=H0(u-l),d=c>Ov&&c%Ov;if(d>gr&&(c=d),!(a>gr))r.moveTo(f,h);else if(c>Ov-gr)r.moveTo(f+a*Bi(l),h+a*Dn(l)),r.arc(f,h,a,l,u,!v),n>gr&&(r.moveTo(f+n*Bi(u),h+n*Dn(u)),r.arc(f,h,n,u,l,v));else{var p=void 0,g=void 0,y=void 0,m=void 0,_=void 0,S=void 0,w=void 0,x=void 0,b=void 0,C=void 0,T=void 0,D=void 0,M=void 0,L=void 0,I=void 0,P=void 0,R=a*Bi(l),E=a*Dn(l),B=n*Bi(u),O=n*Dn(u),z=c>gr;if(z){var H=e.cornerRadius;H&&(t=K5(H),p=t[0],g=t[1],y=t[2],m=t[3]);var $=H0(a-n)/2;if(_=Rr($,y),S=Rr($,m),w=Rr($,p),x=Rr($,g),T=b=gs(_,S),D=C=gs(w,x),(b>gr||C>gr)&&(M=a*Bi(u),L=a*Dn(u),I=n*Bi(l),P=n*Dn(l),c<fC)){var X=q5(R,E,I,P,M,L,B,O);if(X){var Q=R-X[0],j=E-X[1],pt=M-X[0],xt=L-X[1],gt=1/Dn(X5((Q*pt+j*xt)/(Rs(Q*Q+j*j)*Rs(pt*pt+xt*xt)))/2),rt=Rs(X[0]*X[0]+X[1]*X[1]);T=Rr(b,(a-rt)/(gt+1)),D=Rr(C,(n-rt)/(gt-1))}}}if(!z)r.moveTo(f+R,h+E);else if(T>gr){var yt=Rr(y,T),st=Rr(m,T),K=au(I,P,R,E,a,yt,v),lt=au(M,L,B,O,a,st,v);r.moveTo(f+K.cx+K.x0,h+K.cy+K.y0),T<b&&yt===st?r.arc(f+K.cx,h+K.cy,T,ye(K.y0,K.x0),ye(lt.y0,lt.x0),!v):(yt>0&&r.arc(f+K.cx,h+K.cy,yt,ye(K.y0,K.x0),ye(K.y1,K.x1),!v),r.arc(f,h,a,ye(K.cy+K.y1,K.cx+K.x1),ye(lt.cy+lt.y1,lt.cx+lt.x1),!v),st>0&&r.arc(f+lt.cx,h+lt.cy,st,ye(lt.y1,lt.x1),ye(lt.y0,lt.x0),!v))}else r.moveTo(f+R,h+E),r.arc(f,h,a,l,u,!v);if(!(n>gr)||!z)r.lineTo(f+B,h+O);else if(D>gr){var yt=Rr(p,D),st=Rr(g,D),K=au(B,O,M,L,n,-st,v),lt=au(R,E,I,P,n,-yt,v);r.lineTo(f+K.cx+K.x0,h+K.cy+K.y0),D<C&&yt===st?r.arc(f+K.cx,h+K.cy,D,ye(K.y0,K.x0),ye(lt.y0,lt.x0),!v):(st>0&&r.arc(f+K.cx,h+K.cy,st,ye(K.y0,K.x0),ye(K.y1,K.x1),!v),r.arc(f,h,n,ye(K.cy+K.y1,K.cx+K.x1),ye(lt.cy+lt.y1,lt.cx+lt.x1),v),yt>0&&r.arc(f+lt.cx,h+lt.cy,yt,ye(lt.y1,lt.x1),ye(lt.y0,lt.x0),!v))}else r.lineTo(f+B,h+O),r.arc(f,h,n,u,l,v)}r.closePath()}}}var Q5=function(){function r(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=Math.PI*2,this.clockwise=!0,this.cornerRadius=0}return r}(),hC=function(r){k(e,r);function e(t){return r.call(this,t)||this}return e.prototype.getDefaultShape=function(){return new Q5},e.prototype.buildPath=function(t,a){J5(t,a)},e.prototype.isZeroArea=function(){return this.shape.startAngle===this.shape.endAngle||this.shape.r===this.shape.r0},e}(mt);hC.prototype.type=\"sector\";var Ve=hC,j5=function(){function r(){this.cx=0,this.cy=0,this.r=0,this.r0=0}return r}(),vC=function(r){k(e,r);function e(t){return r.call(this,t)||this}return e.prototype.getDefaultShape=function(){return new j5},e.prototype.buildPath=function(t,a){var n=a.cx,i=a.cy,o=Math.PI*2;t.moveTo(n+a.r,i),t.arc(n,i,a.r,0,o,!1),t.moveTo(n+a.r0,i),t.arc(n,i,a.r0,0,o,!0)},e}(mt);vC.prototype.type=\"ring\";var Ch=vC;function t3(r,e,t,a){var n=[],i=[],o=[],s=[],l,u,f,h;if(a){f=[1/0,1/0],h=[-1/0,-1/0];for(var v=0,c=r.length;v<c;v++)Ha(f,f,r[v]),Wa(h,h,r[v]);Ha(f,f,a[0]),Wa(h,h,a[1])}for(var v=0,c=r.length;v<c;v++){var d=r[v];if(t)l=r[v?v-1:c-1],u=r[(v+1)%c];else if(v===0||v===c-1){n.push(fa(r[v]));continue}else l=r[v-1],u=r[v+1];qn(i,u,l),Zu(i,i,e);var p=Ld(d,l),g=Ld(d,u),y=p+g;y!==0&&(p/=y,g/=y),Zu(o,i,-p),Zu(s,i,g);var m=km([],d,o),_=km([],d,s);a&&(Wa(m,m,f),Ha(m,m,h),Wa(_,_,f),Ha(_,_,h)),n.push(m),n.push(_)}return t&&n.push(n.shift()),n}function cC(r,e,t){var a=e.smooth,n=e.points;if(n&&n.length>=2){if(a){var i=t3(n,a,t,e.smoothConstraint);r.moveTo(n[0][0],n[0][1]);for(var o=n.length,s=0;s<(t?o:o-1);s++){var l=i[s*2],u=i[s*2+1],f=n[(s+1)%o];r.bezierCurveTo(l[0],l[1],u[0],u[1],f[0],f[1])}}else{r.moveTo(n[0][0],n[0][1]);for(var s=1,h=n.length;s<h;s++)r.lineTo(n[s][0],n[s][1])}t&&r.closePath()}}var e3=function(){function r(){this.points=null,this.smooth=0,this.smoothConstraint=null}return r}(),dC=function(r){k(e,r);function e(t){return r.call(this,t)||this}return e.prototype.getDefaultShape=function(){return new e3},e.prototype.buildPath=function(t,a){cC(t,a,!0)},e}(mt);dC.prototype.type=\"polygon\";var ze=dC,r3=function(){function r(){this.points=null,this.percent=1,this.smooth=0,this.smoothConstraint=null}return r}(),pC=function(r){k(e,r);function e(t){return r.call(this,t)||this}return e.prototype.getDefaultStyle=function(){return{stroke:\"#000\",fill:null}},e.prototype.getDefaultShape=function(){return new r3},e.prototype.buildPath=function(t,a){cC(t,a,!1)},e}(mt);pC.prototype.type=\"polyline\";var Fe=pC,a3={},n3=function(){function r(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.percent=1}return r}(),gC=function(r){k(e,r);function e(t){return r.call(this,t)||this}return e.prototype.getDefaultStyle=function(){return{stroke:\"#000\",fill:null}},e.prototype.getDefaultShape=function(){return new n3},e.prototype.buildPath=function(t,a){var n,i,o,s;if(this.subPixelOptimize){var l=H2(a3,a,this.style);n=l.x1,i=l.y1,o=l.x2,s=l.y2}else n=a.x1,i=a.y1,o=a.x2,s=a.y2;var u=a.percent;u!==0&&(t.moveTo(n,i),u<1&&(o=n*(1-u)+o*u,s=i*(1-u)+s*u),t.lineTo(o,s))},e.prototype.pointAt=function(t){var a=this.shape;return[a.x1*(1-t)+a.x2*t,a.y1*(1-t)+a.y2*t]},e}(mt);gC.prototype.type=\"line\";var ue=gC,Pe=[],i3=function(){function r(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.cpx1=0,this.cpy1=0,this.percent=1}return r}();function W0(r,e,t){var a=r.cpx2,n=r.cpy2;return a!=null||n!=null?[(t?Ym:ae)(r.x1,r.cpx1,r.cpx2,r.x2,e),(t?Ym:ae)(r.y1,r.cpy1,r.cpy2,r.y2,e)]:[(t?Od:se)(r.x1,r.cpx1,r.x2,e),(t?Od:se)(r.y1,r.cpy1,r.y2,e)]}var yC=function(r){k(e,r);function e(t){return r.call(this,t)||this}return e.prototype.getDefaultStyle=function(){return{stroke:\"#000\",fill:null}},e.prototype.getDefaultShape=function(){return new i3},e.prototype.buildPath=function(t,a){var n=a.x1,i=a.y1,o=a.x2,s=a.y2,l=a.cpx1,u=a.cpy1,f=a.cpx2,h=a.cpy2,v=a.percent;v!==0&&(t.moveTo(n,i),f==null||h==null?(v<1&&($s(n,l,o,v,Pe),l=Pe[1],o=Pe[2],$s(i,u,s,v,Pe),u=Pe[1],s=Pe[2]),t.quadraticCurveTo(l,u,o,s)):(v<1&&(en(n,l,f,o,v,Pe),l=Pe[1],f=Pe[2],o=Pe[3],en(i,u,h,s,v,Pe),u=Pe[1],h=Pe[2],s=Pe[3]),t.bezierCurveTo(l,u,f,h,o,s)))},e.prototype.pointAt=function(t){return W0(this.shape,t,!1)},e.prototype.tangentAt=function(t){var a=W0(this.shape,t,!0);return wo(a,a)},e}(mt);yC.prototype.type=\"bezier-curve\";var Th=yC,o3=function(){function r(){this.cx=0,this.cy=0,this.r=0,this.startAngle=0,this.endAngle=Math.PI*2,this.clockwise=!0}return r}(),mC=function(r){k(e,r);function e(t){return r.call(this,t)||this}return e.prototype.getDefaultStyle=function(){return{stroke:\"#000\",fill:null}},e.prototype.getDefaultShape=function(){return new o3},e.prototype.buildPath=function(t,a){var n=a.cx,i=a.cy,o=Math.max(a.r,0),s=a.startAngle,l=a.endAngle,u=a.clockwise,f=Math.cos(s),h=Math.sin(s);t.moveTo(f*o+n,h*o+i),t.arc(n,i,o,s,l,!u)},e}(mt);mC.prototype.type=\"arc\";var Gg=mC,s3=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=\"compound\",t}return e.prototype._updatePathDirty=function(){for(var t=this.shape.paths,a=this.shapeChanged(),n=0;n<t.length;n++)a=a||t[n].shapeChanged();a&&this.dirtyShape()},e.prototype.beforeBrush=function(){this._updatePathDirty();for(var t=this.shape.paths||[],a=this.getGlobalScale(),n=0;n<t.length;n++)t[n].path||t[n].createPathProxy(),t[n].path.setScale(a[0],a[1],t[n].segmentIgnoreThreshold)},e.prototype.buildPath=function(t,a){for(var n=a.paths||[],i=0;i<n.length;i++)n[i].buildPath(t,n[i].shape,!0)},e.prototype.afterBrush=function(){for(var t=this.shape.paths||[],a=0;a<t.length;a++)t[a].pathUpdated()},e.prototype.getBoundingRect=function(){return this._updatePathDirty.call(this),mt.prototype.getBoundingRect.call(this)},e}(mt),Hg=s3,l3=function(){function r(e){this.colorStops=e||[]}return r.prototype.addColorStop=function(e,t){this.colorStops.push({offset:e,color:t})},r}(),_C=l3,u3=function(r){k(e,r);function e(t,a,n,i,o,s){var l=r.call(this,o)||this;return l.x=t==null?0:t,l.y=a==null?0:a,l.x2=n==null?1:n,l.y2=i==null?0:i,l.type=\"linear\",l.global=s||!1,l}return e}(_C),Cl=u3,f3=function(r){k(e,r);function e(t,a,n,i,o){var s=r.call(this,i)||this;return s.x=t==null?.5:t,s.y=a==null?.5:a,s.r=n==null?.5:n,s.type=\"radial\",s.global=o||!1,s}return e}(_C),SC=f3,Mn=[0,0],Ln=[0,0],nu=new ut,iu=new ut,h3=function(){function r(e,t){this._corners=[],this._axes=[],this._origin=[0,0];for(var a=0;a<4;a++)this._corners[a]=new ut;for(var a=0;a<2;a++)this._axes[a]=new ut;e&&this.fromBoundingRect(e,t)}return r.prototype.fromBoundingRect=function(e,t){var a=this._corners,n=this._axes,i=e.x,o=e.y,s=i+e.width,l=o+e.height;if(a[0].set(i,o),a[1].set(s,o),a[2].set(s,l),a[3].set(i,l),t)for(var u=0;u<4;u++)a[u].transform(t);ut.sub(n[0],a[1],a[0]),ut.sub(n[1],a[3],a[0]),n[0].normalize(),n[1].normalize();for(var u=0;u<2;u++)this._origin[u]=n[u].dot(a[0])},r.prototype.intersect=function(e,t){var a=!0,n=!t;return nu.set(1/0,1/0),iu.set(0,0),!this._intersectCheckOneSide(this,e,nu,iu,n,1)&&(a=!1,n)||!this._intersectCheckOneSide(e,this,nu,iu,n,-1)&&(a=!1,n)||n||ut.copy(t,a?nu:iu),a},r.prototype._intersectCheckOneSide=function(e,t,a,n,i,o){for(var s=!0,l=0;l<2;l++){var u=this._axes[l];if(this._getProjMinMaxOnAxis(l,e._corners,Mn),this._getProjMinMaxOnAxis(l,t._corners,Ln),Mn[1]<Ln[0]||Mn[0]>Ln[1]){if(s=!1,i)return s;var f=Math.abs(Ln[0]-Mn[1]),h=Math.abs(Mn[0]-Ln[1]);Math.min(f,h)>n.len()&&(f<h?ut.scale(n,u,-f*o):ut.scale(n,u,h*o))}else if(a){var f=Math.abs(Ln[0]-Mn[1]),h=Math.abs(Mn[0]-Ln[1]);Math.min(f,h)<a.len()&&(f<h?ut.scale(a,u,f*o):ut.scale(a,u,-h*o))}}return s},r.prototype._getProjMinMaxOnAxis=function(e,t,a){for(var n=this._axes[e],i=this._origin,o=t[0].dot(n)+i[e],s=o,l=o,u=1;u<t.length;u++){var f=t[u].dot(n)+i[e];s=Math.min(f,s),l=Math.max(f,l)}a[0]=s,a[1]=l},r}(),Df=h3,v3=[],c3=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.notClear=!0,t.incremental=!0,t._displayables=[],t._temporaryDisplayables=[],t._cursor=0,t}return e.prototype.traverse=function(t,a){t.call(a,this)},e.prototype.useStyle=function(){this.style={}},e.prototype.getCursor=function(){return this._cursor},e.prototype.innerAfterBrush=function(){this._cursor=this._displayables.length},e.prototype.clearDisplaybles=function(){this._displayables=[],this._temporaryDisplayables=[],this._cursor=0,this.markRedraw(),this.notClear=!1},e.prototype.clearTemporalDisplayables=function(){this._temporaryDisplayables=[]},e.prototype.addDisplayable=function(t,a){a?this._temporaryDisplayables.push(t):this._displayables.push(t),this.markRedraw()},e.prototype.addDisplayables=function(t,a){a=a||!1;for(var n=0;n<t.length;n++)this.addDisplayable(t[n],a)},e.prototype.getDisplayables=function(){return this._displayables},e.prototype.getTemporalDisplayables=function(){return this._temporaryDisplayables},e.prototype.eachPendingDisplayable=function(t){for(var a=this._cursor;a<this._displayables.length;a++)t&&t(this._displayables[a]);for(var a=0;a<this._temporaryDisplayables.length;a++)t&&t(this._temporaryDisplayables[a])},e.prototype.update=function(){this.updateTransform();for(var t=this._cursor;t<this._displayables.length;t++){var a=this._displayables[t];a.parent=this,a.update(),a.parent=null}for(var t=0;t<this._temporaryDisplayables.length;t++){var a=this._temporaryDisplayables[t];a.parent=this,a.update(),a.parent=null}},e.prototype.getBoundingRect=function(){if(!this._rect){for(var t=new vt(1/0,1/0,-1/0,-1/0),a=0;a<this._displayables.length;a++){var n=this._displayables[a],i=n.getBoundingRect().clone();n.needLocalTransform()&&i.applyTransform(n.getLocalTransform(v3)),t.union(i)}this._rect=t}return this._rect},e.prototype.contain=function(t,a){var n=this.transformCoordToLocal(t,a),i=this.getBoundingRect();if(i.contain(n[0],n[1]))for(var o=0;o<this._displayables.length;o++){var s=this._displayables[o];if(s.contain(t,a))return!0}return!1},e}(fr),d3=c3,xC=Ct();function Ao(r,e,t,a,n){var i;if(e&&e.ecModel){var o=e.ecModel.getUpdatePayload();i=o&&o.animation}var s=e&&e.isAnimationEnabled(),l=r===\"update\";if(s){var u=void 0,f=void 0,h=void 0;a?(u=ft(a.duration,200),f=ft(a.easing,\"cubicOut\"),h=0):(u=e.getShallow(l?\"animationDurationUpdate\":\"animationDuration\"),f=e.getShallow(l?\"animationEasingUpdate\":\"animationEasing\"),h=e.getShallow(l?\"animationDelayUpdate\":\"animationDelay\")),i&&(i.duration!=null&&(u=i.duration),i.easing!=null&&(f=i.easing),i.delay!=null&&(h=i.delay)),J(h)&&(h=h(t,n)),J(u)&&(u=u(t));var v={duration:u||0,delay:h,easing:f};return v}else return null}function Wg(r,e,t,a,n,i,o){var s=!1,l;J(n)?(o=i,i=n,n=null):et(n)&&(i=n.cb,o=n.during,s=n.isFrom,l=n.removeOpt,n=n.dataIndex);var u=r===\"leave\";u||e.stopAnimation(\"leave\");var f=Ao(r,a,n,u?l||{}:null,a&&a.getAnimationDelayParams?a.getAnimationDelayParams(e,n):null);if(f&&f.duration>0){var h=f.duration,v=f.delay,c=f.easing,d={duration:h,delay:v||0,easing:c,done:i,force:!!i||!!o,setToFinal:!u,scope:r,during:o};s?e.animateFrom(t,d):e.animateTo(t,d)}else e.stopAnimation(),!s&&e.attr(t),o&&o(1),i&&i()}function Lt(r,e,t,a,n,i){Wg(\"update\",r,e,t,a,n,i)}function Ft(r,e,t,a,n,i){Wg(\"enter\",r,e,t,a,n,i)}function so(r){if(!r.__zr)return!0;for(var e=0;e<r.animators.length;e++){var t=r.animators[e];if(t.scope===\"leave\")return!0}return!1}function rn(r,e,t,a,n,i){so(r)||Wg(\"leave\",r,e,t,a,n,i)}function $0(r,e,t,a){r.removeTextContent(),r.removeTextGuideLine(),rn(r,{style:{opacity:0}},e,t,a)}function Js(r,e,t){function a(){r.parent&&r.parent.remove(r)}r.isGroup?r.traverse(function(n){n.isGroup||$0(n,e,t,a)}):$0(r,e,t,a)}function Ar(r){xC(r).oldStyle=r.style}function p3(r){return xC(r).oldStyle}var Mf=Math.max,Lf=Math.min,np={};function g3(r){return mt.extend(r)}var y3=$5;function m3(r,e){return y3(r,e)}function Dr(r,e){np[r]=e}function $g(r){if(np.hasOwnProperty(r))return np[r]}function Ah(r,e,t,a){var n=sC(r,e);return t&&(a===\"center\"&&(t=bC(t,n.getBoundingRect())),CC(n,t)),n}function wC(r,e,t){var a=new pe({style:{image:r,x:e.x,y:e.y,width:e.width,height:e.height},onload:function(n){if(t===\"center\"){var i={width:n.width,height:n.height};a.setStyle(bC(e,i))}}});return a}function bC(r,e){var t=e.width/e.height,a=r.height*t,n;a<=r.width?n=r.height:(a=r.width,n=a/t);var i=r.x+r.width/2,o=r.y+r.height/2;return{x:i-a/2,y:o-n/2,width:a,height:n}}var nr=U5;function CC(r,e){if(!!r.applyTransform){var t=r.getBoundingRect(),a=t.calculateTransform(e);r.applyTransform(a)}}function ho(r,e){return H2(r,r,{lineWidth:e}),r}function _3(r){return W2(r.shape,r.shape,r.style),r}var af=Kn;function li(r,e){for(var t=ph([]);r&&r!==e;)ha(t,r.getLocalTransform(),t),r=r.parent;return t}function Cr(r,e,t){return e&&!Se(e)&&(e=la.getLocalTransform(e)),t&&(e=bo([],e)),he([],r,e)}function Dh(r,e,t){var a=e[4]===0||e[5]===0||e[0]===0?1:Math.abs(2*e[4]/e[0]),n=e[4]===0||e[5]===0||e[2]===0?1:Math.abs(2*e[4]/e[2]),i=[r===\"left\"?-a:r===\"right\"?a:0,r===\"top\"?-n:r===\"bottom\"?n:0];return i=Cr(i,e,t),Math.abs(i[0])>Math.abs(i[1])?i[0]>0?\"right\":\"left\":i[1]>0?\"bottom\":\"top\"}function U0(r){return!r.isGroup}function S3(r){return r.shape!=null}function Tl(r,e,t){if(!r||!e)return;function a(o){var s={};return o.traverse(function(l){U0(l)&&l.anid&&(s[l.anid]=l)}),s}function n(o){var s={x:o.x,y:o.y,rotation:o.rotation};return S3(o)&&(s.shape=V({},o.shape)),s}var i=a(r);e.traverse(function(o){if(U0(o)&&o.anid){var s=i[o.anid];if(s){var l=n(o);o.attr(n(s)),Lt(o,l,t,it(o).dataIndex)}}})}function TC(r,e){return G(r,function(t){var a=t[0];a=Mf(a,e.x),a=Lf(a,e.x+e.width);var n=t[1];return n=Mf(n,e.y),n=Lf(n,e.y+e.height),[a,n]})}function x3(r,e){var t=Mf(r.x,e.x),a=Lf(r.x+r.width,e.x+e.width),n=Mf(r.y,e.y),i=Lf(r.y+r.height,e.y+e.height);if(a>=t&&i>=n)return{x:t,y:n,width:a-t,height:i-n}}function Al(r,e,t){var a=V({rectHover:!0},e),n=a.style={strokeNoScale:!0};if(t=t||{x:-1,y:-1,width:2,height:2},r)return r.indexOf(\"image://\")===0?(n.image=r.slice(8),tt(n,t),new pe(a)):Ah(r.replace(\"path://\",\"\"),a,t,\"center\")}function ys(r,e,t,a,n){for(var i=0,o=n[n.length-1];i<n.length;i++){var s=n[i];if(AC(r,e,t,a,s[0],s[1],o[0],o[1]))return!0;o=s}}function AC(r,e,t,a,n,i,o,s){var l=t-r,u=a-e,f=o-n,h=s-i,v=Bv(f,h,l,u);if(w3(v))return!1;var c=r-n,d=e-i,p=Bv(c,d,l,u)/v;if(p<0||p>1)return!1;var g=Bv(c,d,f,h)/v;return!(g<0||g>1)}function Bv(r,e,t,a){return r*a-t*e}function w3(r){return r<=1e-6&&r>=-1e-6}function Do(r){var e=r.itemTooltipOption,t=r.componentModel,a=r.itemName,n=U(e)?{formatter:e}:e,i=t.mainType,o=t.componentIndex,s={componentType:i,name:a,$vars:[\"name\"]};s[i+\"Index\"]=o;var l=r.formatterParamsExtra;l&&A(St(l),function(f){Z(s,f)||(s[f]=l[f],s.$vars.push(f))});var u=it(r.el);u.componentMainType=i,u.componentIndex=o,u.tooltipConfig={name:a,option:tt({content:a,formatterParams:s},n)}}function Y0(r,e){var t;r.isGroup&&(t=e(r)),t||r.traverse(e)}function vn(r,e){if(r)if(F(r))for(var t=0;t<r.length;t++)Y0(r[t],e);else Y0(r,e)}Dr(\"circle\",Qr);Dr(\"ellipse\",Fg);Dr(\"sector\",Ve);Dr(\"ring\",Ch);Dr(\"polygon\",ze);Dr(\"polyline\",Fe);Dr(\"rect\",bt);Dr(\"line\",ue);Dr(\"bezierCurve\",Th);Dr(\"arc\",Gg);var Dl=Object.freeze(Object.defineProperty({__proto__:null,updateProps:Lt,initProps:Ft,removeElement:rn,removeElementWithFadeOut:Js,isElementRemoved:so,extendShape:g3,extendPath:m3,registerShape:Dr,getShapeClass:$g,makePath:Ah,makeImage:wC,mergePath:nr,resizePath:CC,subPixelOptimizeLine:ho,subPixelOptimizeRect:_3,subPixelOptimize:af,getTransform:li,applyTransform:Cr,transformDirection:Dh,groupTransition:Tl,clipPointsByRect:TC,clipRectByRect:x3,createIcon:Al,linePolygonIntersect:ys,lineLineIntersect:AC,setTooltipConfig:Do,traverseElements:vn,Group:nt,Image:pe,Text:Dt,Circle:Qr,Ellipse:Fg,Sector:Ve,Ring:Ch,Polygon:ze,Polyline:Fe,Rect:bt,Line:ue,BezierCurve:Th,Arc:Gg,IncrementalDisplayable:d3,CompoundPath:Hg,LinearGradient:Cl,RadialGradient:SC,BoundingRect:vt,OrientedBoundingRect:Df,Point:ut,Path:mt},Symbol.toStringTag,{value:\"Module\"})),Mh={};function DC(r,e){for(var t=0;t<Le.length;t++){var a=Le[t],n=e[a],i=r.ensureState(a);i.style=i.style||{},i.style.text=n}var o=r.currentStates.slice();r.clearStates(!0),r.setStyle({text:e.normal}),r.useStates(o,!0)}function ip(r,e,t){var a=r.labelFetcher,n=r.labelDataIndex,i=r.labelDimIndex,o=e.normal,s;a&&(s=a.getFormattedLabel(n,\"normal\",null,i,o&&o.get(\"formatter\"),t!=null?{interpolatedValue:t}:null)),s==null&&(s=J(r.defaultText)?r.defaultText(n,r,t):r.defaultText);for(var l={normal:s},u=0;u<Le.length;u++){var f=Le[u],h=e[f];l[f]=ft(a?a.getFormattedLabel(n,f,null,i,h&&h.get(\"formatter\")):null,s)}return l}function de(r,e,t,a){t=t||Mh;for(var n=r instanceof Dt,i=!1,o=0;o<qs.length;o++){var s=e[qs[o]];if(s&&s.getShallow(\"show\")){i=!0;break}}var l=n?r:r.getTextContent();if(i){n||(l||(l=new Dt,r.setTextContent(l)),r.stateProxy&&(l.stateProxy=r.stateProxy));var u=ip(t,e),f=e.normal,h=!!f.getShallow(\"show\"),v=Nt(f,a&&a.normal,t,!1,!n);v.text=u.normal,n||r.setTextConfig(If(f,t,!1));for(var o=0;o<Le.length;o++){var c=Le[o],s=e[c];if(s){var d=l.ensureState(c),p=!!ft(s.getShallow(\"show\"),h);if(p!==h&&(d.ignore=!p),d.style=Nt(s,a&&a[c],t,!0,!n),d.style.text=u[c],!n){var g=r.ensureState(c);g.textConfig=If(s,t,!0)}}}l.silent=!!f.getShallow(\"silent\"),l.style.x!=null&&(v.x=l.style.x),l.style.y!=null&&(v.y=l.style.y),l.ignore=!h,l.useStyle(v),l.dirty(),t.enableTextSetter&&(Mo(l).setLabelText=function(y){var m=ip(t,e,y);DC(l,m)})}else l&&(l.ignore=!0);r.dirty()}function ie(r,e){e=e||\"label\";for(var t={normal:r.getModel(e)},a=0;a<Le.length;a++){var n=Le[a];t[n]=r.getModel([n,e])}return t}function Nt(r,e,t,a,n){var i={};return b3(i,r,t,a,n),e&&V(i,e),i}function If(r,e,t){e=e||{};var a={},n,i=r.getShallow(\"rotate\"),o=ft(r.getShallow(\"distance\"),t?null:5),s=r.getShallow(\"offset\");return n=r.getShallow(\"position\")||(t?null:\"inside\"),n===\"outside\"&&(n=e.defaultOutsidePosition||\"top\"),n!=null&&(a.position=n),s!=null&&(a.offset=s),i!=null&&(i*=Math.PI/180,a.rotation=i),o!=null&&(a.distance=o),a.outsideFill=r.get(\"color\")===\"inherit\"?e.inheritColor||null:\"auto\",a}function b3(r,e,t,a,n){t=t||Mh;var i=e.ecModel,o=i&&i.option.textStyle,s=C3(e),l;if(s){l={};for(var u in s)if(s.hasOwnProperty(u)){var f=e.getModel([\"rich\",u]);K0(l[u]={},f,o,t,a,n,!1,!0)}}l&&(r.rich=l);var h=e.get(\"overflow\");h&&(r.overflow=h);var v=e.get(\"minMargin\");v!=null&&(r.margin=v),K0(r,e,o,t,a,n,!0,!1)}function C3(r){for(var e;r&&r!==r.ecModel;){var t=(r.option||Mh).rich;if(t){e=e||{};for(var a=St(t),n=0;n<a.length;n++){var i=a[n];e[i]=1}}r=r.parentModel}return e}var Z0=[\"fontStyle\",\"fontWeight\",\"fontSize\",\"fontFamily\",\"textShadowColor\",\"textShadowBlur\",\"textShadowOffsetX\",\"textShadowOffsetY\"],X0=[\"align\",\"lineHeight\",\"width\",\"height\",\"tag\",\"verticalAlign\",\"ellipsis\"],q0=[\"padding\",\"borderWidth\",\"borderRadius\",\"borderDashOffset\",\"backgroundColor\",\"borderColor\",\"shadowColor\",\"shadowBlur\",\"shadowOffsetX\",\"shadowOffsetY\"];function K0(r,e,t,a,n,i,o,s){t=!n&&t||Mh;var l=a&&a.inheritColor,u=e.getShallow(\"color\"),f=e.getShallow(\"textBorderColor\"),h=ft(e.getShallow(\"opacity\"),t.opacity);(u===\"inherit\"||u===\"auto\")&&(l?u=l:u=null),(f===\"inherit\"||f===\"auto\")&&(l?f=l:f=null),i||(u=u||t.color,f=f||t.textBorderColor),u!=null&&(r.fill=u),f!=null&&(r.stroke=f);var v=ft(e.getShallow(\"textBorderWidth\"),t.textBorderWidth);v!=null&&(r.lineWidth=v);var c=ft(e.getShallow(\"textBorderType\"),t.textBorderType);c!=null&&(r.lineDash=c);var d=ft(e.getShallow(\"textBorderDashOffset\"),t.textBorderDashOffset);d!=null&&(r.lineDashOffset=d),!n&&h==null&&!s&&(h=a&&a.defaultOpacity),h!=null&&(r.opacity=h),!n&&!i&&r.fill==null&&a.inheritColor&&(r.fill=a.inheritColor);for(var p=0;p<Z0.length;p++){var g=Z0[p],y=ft(e.getShallow(g),t[g]);y!=null&&(r[g]=y)}for(var p=0;p<X0.length;p++){var g=X0[p],y=e.getShallow(g);y!=null&&(r[g]=y)}if(r.verticalAlign==null){var m=e.getShallow(\"baseline\");m!=null&&(r.verticalAlign=m)}if(!o||!a.disableBox){for(var p=0;p<q0.length;p++){var g=q0[p],y=e.getShallow(g);y!=null&&(r[g]=y)}var _=e.getShallow(\"borderType\");_!=null&&(r.borderDash=_),(r.backgroundColor===\"auto\"||r.backgroundColor===\"inherit\")&&l&&(r.backgroundColor=l),(r.borderColor===\"auto\"||r.borderColor===\"inherit\")&&l&&(r.borderColor=l)}}function MC(r,e){var t=e&&e.getModel(\"textStyle\");return Sr([r.fontStyle||t&&t.getShallow(\"fontStyle\")||\"\",r.fontWeight||t&&t.getShallow(\"fontWeight\")||\"\",(r.fontSize||t&&t.getShallow(\"fontSize\")||12)+\"px\",r.fontFamily||t&&t.getShallow(\"fontFamily\")||\"sans-serif\"].join(\" \"))}var Mo=Ct();function LC(r,e,t,a){if(!!r){var n=Mo(r);n.prevValue=n.value,n.value=t;var i=e.normal;n.valueAnimation=i.get(\"valueAnimation\"),n.valueAnimation&&(n.precision=i.get(\"precision\"),n.defaultInterpolatedText=a,n.statesModels=e)}}function IC(r,e,t,a,n){var i=Mo(r);if(!i.valueAnimation||i.prevValue===i.value)return;var o=i.defaultInterpolatedText,s=ft(i.interpolatedValue,i.prevValue),l=i.value;function u(f){var h=P2(t,i.precision,s,l,f);i.interpolatedValue=f===1?null:h;var v=ip({labelDataIndex:e,labelFetcher:n,defaultText:o?o(h):h+\"\"},i.statesModels,h);DC(r,v)}r.percent=0,(i.prevValue==null?Ft:Lt)(r,{percent:1},a,e,null,u)}var T3=[\"textStyle\",\"color\"],Nv=[\"fontStyle\",\"fontWeight\",\"fontSize\",\"fontFamily\",\"padding\",\"lineHeight\",\"rich\",\"width\",\"height\",\"overflow\"],Vv=new Dt,A3=function(){function r(){}return r.prototype.getTextColor=function(e){var t=this.ecModel;return this.getShallow(\"color\")||(!e&&t?t.get(T3):null)},r.prototype.getFont=function(){return MC({fontStyle:this.getShallow(\"fontStyle\"),fontWeight:this.getShallow(\"fontWeight\"),fontSize:this.getShallow(\"fontSize\"),fontFamily:this.getShallow(\"fontFamily\")},this.ecModel)},r.prototype.getTextRect=function(e){for(var t={text:e,verticalAlign:this.getShallow(\"verticalAlign\")||this.getShallow(\"baseline\")},a=0;a<Nv.length;a++)t[Nv[a]]=this.getShallow(Nv[a]);return Vv.useStyle(t),Vv.update(),Vv.getBoundingRect()},r}(),D3=A3,PC=[[\"lineWidth\",\"width\"],[\"stroke\",\"color\"],[\"opacity\"],[\"shadowBlur\"],[\"shadowOffsetX\"],[\"shadowOffsetY\"],[\"shadowColor\"],[\"lineDash\",\"type\"],[\"lineDashOffset\",\"dashOffset\"],[\"lineCap\",\"cap\"],[\"lineJoin\",\"join\"],[\"miterLimit\"]],M3=pi(PC),L3=function(){function r(){}return r.prototype.getLineStyle=function(e){return M3(this,e)},r}(),RC=[[\"fill\",\"color\"],[\"stroke\",\"borderColor\"],[\"lineWidth\",\"borderWidth\"],[\"opacity\"],[\"shadowBlur\"],[\"shadowOffsetX\"],[\"shadowOffsetY\"],[\"shadowColor\"],[\"lineDash\",\"borderType\"],[\"lineDashOffset\",\"borderDashOffset\"],[\"lineCap\",\"borderCap\"],[\"lineJoin\",\"borderJoin\"],[\"miterLimit\",\"borderMiterLimit\"]],I3=pi(RC),P3=function(){function r(){}return r.prototype.getItemStyle=function(e,t){return I3(this,e,t)},r}(),Ci=function(){function r(e,t,a){this.parentModel=t,this.ecModel=a,this.option=e}return r.prototype.init=function(e,t,a){},r.prototype.mergeOption=function(e,t){ht(this.option,e,!0)},r.prototype.get=function(e,t){return e==null?this.option:this._doGet(this.parsePath(e),!t&&this.parentModel)},r.prototype.getShallow=function(e,t){var a=this.option,n=a==null?a:a[e];if(n==null&&!t){var i=this.parentModel;i&&(n=i.getShallow(e))}return n},r.prototype.getModel=function(e,t){var a=e!=null,n=a?this.parsePath(e):null,i=a?this._doGet(n):this.option;return t=t||this.parentModel&&this.parentModel.getModel(this.resolveParentPath(n)),new r(i,t,this.ecModel)},r.prototype.isEmpty=function(){return this.option==null},r.prototype.restoreData=function(){},r.prototype.clone=function(){var e=this.constructor;return new e(at(this.option))},r.prototype.parsePath=function(e){return typeof e==\"string\"?e.split(\".\"):e},r.prototype.resolveParentPath=function(e){return e},r.prototype.isAnimationEnabled=function(){if(!At.node&&this.option){if(this.option.animation!=null)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}},r.prototype._doGet=function(e,t){var a=this.option;if(!e)return a;for(var n=0;n<e.length&&!(!!e[n]&&(a=a&&typeof a==\"object\"?a[e[n]]:null,a==null));n++);return a==null&&t&&(a=t._doGet(this.resolveParentPath(e),t.parentModel)),a},r}();Rg(Ci);Pk(Ci);te(Ci,L3);te(Ci,P3);te(Ci,Bk);te(Ci,D3);var Vt=Ci,R3=Math.round(Math.random()*10);function Lo(r){return[r||\"\",R3++].join(\"_\")}function E3(r){var e={};r.registerSubTypeDefaulter=function(t,a){var n=Hr(t);e[n.main]=a},r.determineSubType=function(t,a){var n=a.type;if(!n){var i=Hr(t).main;r.hasSubTypes(t)&&e[i]&&(n=e[i](a))}return n}}function k3(r,e){r.topologicalTravel=function(i,o,s,l){if(!i.length)return;var u=t(o),f=u.graph,h=u.noEntryList,v={};for(A(i,function(m){v[m]=!0});h.length;){var c=h.pop(),d=f[c],p=!!v[c];p&&(s.call(l,c,d.originalDeps.slice()),delete v[c]),A(d.successor,p?y:g)}A(v,function(){var m=\"\";throw new Error(m)});function g(m){f[m].entryCount--,f[m].entryCount===0&&h.push(m)}function y(m){v[m]=!0,g(m)}};function t(i){var o={},s=[];return A(i,function(l){var u=a(o,l),f=u.originalDeps=e(l),h=n(f,i);u.entryCount=h.length,u.entryCount===0&&s.push(l),A(h,function(v){dt(u.predecessor,v)<0&&u.predecessor.push(v);var c=a(o,v);dt(c.successor,v)<0&&c.successor.push(l)})}),{graph:o,noEntryList:s}}function a(i,o){return i[o]||(i[o]={predecessor:[],successor:[]}),i[o]}function n(i,o){var s=[];return A(i,function(l){dt(o,l)>=0&&s.push(l)}),s}}function cn(r,e){return ht(ht({},r,!0),e,!0)}var O3={time:{month:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],monthAbbr:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],dayOfWeek:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],dayOfWeekAbbr:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"]},legend:{selector:{all:\"All\",inverse:\"Inv\"}},toolbox:{brush:{title:{rect:\"Box Select\",polygon:\"Lasso Select\",lineX:\"Horizontally Select\",lineY:\"Vertically Select\",keep:\"Keep Selections\",clear:\"Clear Selections\"}},dataView:{title:\"Data View\",lang:[\"Data View\",\"Close\",\"Refresh\"]},dataZoom:{title:{zoom:\"Zoom\",back:\"Zoom Reset\"}},magicType:{title:{line:\"Switch to Line Chart\",bar:\"Switch to Bar Chart\",stack:\"Stack\",tiled:\"Tile\"}},restore:{title:\"Restore\"},saveAsImage:{title:\"Save as Image\",lang:[\"Right Click to Save Image\"]}},series:{typeNames:{pie:\"Pie chart\",bar:\"Bar chart\",line:\"Line chart\",scatter:\"Scatter plot\",effectScatter:\"Ripple scatter plot\",radar:\"Radar chart\",tree:\"Tree\",treemap:\"Treemap\",boxplot:\"Boxplot\",candlestick:\"Candlestick\",k:\"K line chart\",heatmap:\"Heat map\",map:\"Map\",parallel:\"Parallel coordinate map\",lines:\"Line graph\",graph:\"Relationship graph\",sankey:\"Sankey diagram\",funnel:\"Funnel chart\",gauge:\"Gauge\",pictorialBar:\"Pictorial bar\",themeRiver:\"Theme River Map\",sunburst:\"Sunburst\"}},aria:{general:{withTitle:'This is a chart about \"{title}\"',withoutTitle:\"This is a chart\"},series:{single:{prefix:\"\",withName:\" with type {seriesType} named {seriesName}.\",withoutName:\" with type {seriesType}.\"},multiple:{prefix:\". It consists of {seriesCount} series count.\",withName:\" The {seriesId} series is a {seriesType} representing {seriesName}.\",withoutName:\" The {seriesId} series is a {seriesType}.\",separator:{middle:\"\",end:\"\"}}},data:{allData:\"The data is as follows: \",partialData:\"The first {displayCnt} items are: \",withName:\"the data for {name} is {value}\",withoutName:\"{value}\",separator:{middle:\", \",end:\". \"}}}},B3={time:{month:[\"\\u4E00\\u6708\",\"\\u4E8C\\u6708\",\"\\u4E09\\u6708\",\"\\u56DB\\u6708\",\"\\u4E94\\u6708\",\"\\u516D\\u6708\",\"\\u4E03\\u6708\",\"\\u516B\\u6708\",\"\\u4E5D\\u6708\",\"\\u5341\\u6708\",\"\\u5341\\u4E00\\u6708\",\"\\u5341\\u4E8C\\u6708\"],monthAbbr:[\"1\\u6708\",\"2\\u6708\",\"3\\u6708\",\"4\\u6708\",\"5\\u6708\",\"6\\u6708\",\"7\\u6708\",\"8\\u6708\",\"9\\u6708\",\"10\\u6708\",\"11\\u6708\",\"12\\u6708\"],dayOfWeek:[\"\\u661F\\u671F\\u65E5\",\"\\u661F\\u671F\\u4E00\",\"\\u661F\\u671F\\u4E8C\",\"\\u661F\\u671F\\u4E09\",\"\\u661F\\u671F\\u56DB\",\"\\u661F\\u671F\\u4E94\",\"\\u661F\\u671F\\u516D\"],dayOfWeekAbbr:[\"\\u65E5\",\"\\u4E00\",\"\\u4E8C\",\"\\u4E09\",\"\\u56DB\",\"\\u4E94\",\"\\u516D\"]},legend:{selector:{all:\"\\u5168\\u9009\",inverse:\"\\u53CD\\u9009\"}},toolbox:{brush:{title:{rect:\"\\u77E9\\u5F62\\u9009\\u62E9\",polygon:\"\\u5708\\u9009\",lineX:\"\\u6A2A\\u5411\\u9009\\u62E9\",lineY:\"\\u7EB5\\u5411\\u9009\\u62E9\",keep:\"\\u4FDD\\u6301\\u9009\\u62E9\",clear:\"\\u6E05\\u9664\\u9009\\u62E9\"}},dataView:{title:\"\\u6570\\u636E\\u89C6\\u56FE\",lang:[\"\\u6570\\u636E\\u89C6\\u56FE\",\"\\u5173\\u95ED\",\"\\u5237\\u65B0\"]},dataZoom:{title:{zoom:\"\\u533A\\u57DF\\u7F29\\u653E\",back:\"\\u533A\\u57DF\\u7F29\\u653E\\u8FD8\\u539F\"}},magicType:{title:{line:\"\\u5207\\u6362\\u4E3A\\u6298\\u7EBF\\u56FE\",bar:\"\\u5207\\u6362\\u4E3A\\u67F1\\u72B6\\u56FE\",stack:\"\\u5207\\u6362\\u4E3A\\u5806\\u53E0\",tiled:\"\\u5207\\u6362\\u4E3A\\u5E73\\u94FA\"}},restore:{title:\"\\u8FD8\\u539F\"},saveAsImage:{title:\"\\u4FDD\\u5B58\\u4E3A\\u56FE\\u7247\",lang:[\"\\u53F3\\u952E\\u53E6\\u5B58\\u4E3A\\u56FE\\u7247\"]}},series:{typeNames:{pie:\"\\u997C\\u56FE\",bar:\"\\u67F1\\u72B6\\u56FE\",line:\"\\u6298\\u7EBF\\u56FE\",scatter:\"\\u6563\\u70B9\\u56FE\",effectScatter:\"\\u6D9F\\u6F2A\\u6563\\u70B9\\u56FE\",radar:\"\\u96F7\\u8FBE\\u56FE\",tree:\"\\u6811\\u56FE\",treemap:\"\\u77E9\\u5F62\\u6811\\u56FE\",boxplot:\"\\u7BB1\\u578B\\u56FE\",candlestick:\"K\\u7EBF\\u56FE\",k:\"K\\u7EBF\\u56FE\",heatmap:\"\\u70ED\\u529B\\u56FE\",map:\"\\u5730\\u56FE\",parallel:\"\\u5E73\\u884C\\u5750\\u6807\\u56FE\",lines:\"\\u7EBF\\u56FE\",graph:\"\\u5173\\u7CFB\\u56FE\",sankey:\"\\u6851\\u57FA\\u56FE\",funnel:\"\\u6F0F\\u6597\\u56FE\",gauge:\"\\u4EEA\\u8868\\u76D8\\u56FE\",pictorialBar:\"\\u8C61\\u5F62\\u67F1\\u56FE\",themeRiver:\"\\u4E3B\\u9898\\u6CB3\\u6D41\\u56FE\",sunburst:\"\\u65ED\\u65E5\\u56FE\"}},aria:{general:{withTitle:\"\\u8FD9\\u662F\\u4E00\\u4E2A\\u5173\\u4E8E\\u201C{title}\\u201D\\u7684\\u56FE\\u8868\\u3002\",withoutTitle:\"\\u8FD9\\u662F\\u4E00\\u4E2A\\u56FE\\u8868\\uFF0C\"},series:{single:{prefix:\"\",withName:\"\\u56FE\\u8868\\u7C7B\\u578B\\u662F{seriesType}\\uFF0C\\u8868\\u793A{seriesName}\\u3002\",withoutName:\"\\u56FE\\u8868\\u7C7B\\u578B\\u662F{seriesType}\\u3002\"},multiple:{prefix:\"\\u5B83\\u7531{seriesCount}\\u4E2A\\u56FE\\u8868\\u7CFB\\u5217\\u7EC4\\u6210\\u3002\",withName:\"\\u7B2C{seriesId}\\u4E2A\\u7CFB\\u5217\\u662F\\u4E00\\u4E2A\\u8868\\u793A{seriesName}\\u7684{seriesType}\\uFF0C\",withoutName:\"\\u7B2C{seriesId}\\u4E2A\\u7CFB\\u5217\\u662F\\u4E00\\u4E2A{seriesType}\\uFF0C\",separator:{middle:\"\\uFF1B\",end:\"\\u3002\"}}},data:{allData:\"\\u5176\\u6570\\u636E\\u662F\\u2014\\u2014\",partialData:\"\\u5176\\u4E2D\\uFF0C\\u524D{displayCnt}\\u9879\\u662F\\u2014\\u2014\",withName:\"{name}\\u7684\\u6570\\u636E\\u662F{value}\",withoutName:\"{value}\",separator:{middle:\"\\uFF0C\",end:\"\"}}}},Pf=\"ZH\",Ug=\"EN\",Qs=Ug,nf={},Yg={},EC=At.domSupported?function(){var r=(document.documentElement.lang||navigator.language||navigator.browserLanguage).toUpperCase();return r.indexOf(Pf)>-1?Pf:Qs}():Qs;function kC(r,e){r=r.toUpperCase(),Yg[r]=new Vt(e),nf[r]=e}function N3(r){if(U(r)){var e=nf[r.toUpperCase()]||{};return r===Pf||r===Ug?at(e):ht(at(e),at(nf[Qs]),!1)}else return ht(at(r),at(nf[Qs]),!1)}function op(r){return Yg[r]}function V3(){return Yg[Qs]}kC(Ug,O3);kC(Pf,B3);var Zg=1e3,Xg=Zg*60,Es=Xg*60,ir=Es*24,J0=ir*365,ms={year:\"{yyyy}\",month:\"{MMM}\",day:\"{d}\",hour:\"{HH}:{mm}\",minute:\"{HH}:{mm}\",second:\"{HH}:{mm}:{ss}\",millisecond:\"{HH}:{mm}:{ss} {SSS}\",none:\"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}\"},ou=\"{yyyy}-{MM}-{dd}\",Q0={year:\"{yyyy}\",month:\"{yyyy}-{MM}\",day:ou,hour:ou+\" \"+ms.hour,minute:ou+\" \"+ms.minute,second:ou+\" \"+ms.second,millisecond:ms.none},zv=[\"year\",\"month\",\"day\",\"hour\",\"minute\",\"second\",\"millisecond\"],OC=[\"year\",\"half-year\",\"quarter\",\"month\",\"week\",\"half-week\",\"day\",\"half-day\",\"quarter-day\",\"hour\",\"minute\",\"second\",\"millisecond\"];function Ia(r,e){return r+=\"\",\"0000\".substr(0,e-r.length)+r}function lo(r){switch(r){case\"half-year\":case\"quarter\":return\"month\";case\"week\":case\"half-week\":return\"day\";case\"half-day\":case\"quarter-day\":return\"hour\";default:return r}}function z3(r){return r===lo(r)}function F3(r){switch(r){case\"year\":case\"month\":return\"day\";case\"millisecond\":return\"millisecond\";default:return\"second\"}}function Lh(r,e,t,a){var n=Kr(r),i=n[qg(t)](),o=n[uo(t)]()+1,s=Math.floor((o-1)/3)+1,l=n[Ih(t)](),u=n[\"get\"+(t?\"UTC\":\"\")+\"Day\"](),f=n[js(t)](),h=(f-1)%12+1,v=n[Ph(t)](),c=n[Rh(t)](),d=n[Eh(t)](),p=a instanceof Vt?a:op(a||EC)||V3(),g=p.getModel(\"time\"),y=g.get(\"month\"),m=g.get(\"monthAbbr\"),_=g.get(\"dayOfWeek\"),S=g.get(\"dayOfWeekAbbr\");return(e||\"\").replace(/{yyyy}/g,i+\"\").replace(/{yy}/g,Ia(i%100+\"\",2)).replace(/{Q}/g,s+\"\").replace(/{MMMM}/g,y[o-1]).replace(/{MMM}/g,m[o-1]).replace(/{MM}/g,Ia(o,2)).replace(/{M}/g,o+\"\").replace(/{dd}/g,Ia(l,2)).replace(/{d}/g,l+\"\").replace(/{eeee}/g,_[u]).replace(/{ee}/g,S[u]).replace(/{e}/g,u+\"\").replace(/{HH}/g,Ia(f,2)).replace(/{H}/g,f+\"\").replace(/{hh}/g,Ia(h+\"\",2)).replace(/{h}/g,h+\"\").replace(/{mm}/g,Ia(v,2)).replace(/{m}/g,v+\"\").replace(/{ss}/g,Ia(c,2)).replace(/{s}/g,c+\"\").replace(/{SSS}/g,Ia(d,3)).replace(/{S}/g,d+\"\")}function G3(r,e,t,a,n){var i=null;if(U(t))i=t;else if(J(t))i=t(r.value,e,{level:r.level});else{var o=V({},ms);if(r.level>0)for(var s=0;s<zv.length;++s)o[zv[s]]=\"{primary|\"+o[zv[s]]+\"}\";var l=t?t.inherit===!1?t:tt(t,o):o,u=BC(r.value,n);if(l[u])i=l[u];else if(l.inherit){for(var f=OC.indexOf(u),s=f-1;s>=0;--s)if(l[u]){i=l[u];break}i=i||o.none}if(F(i)){var h=r.level==null?0:r.level>=0?r.level:i.length+r.level;h=Math.min(h,i.length-1),i=i[h]}}return Lh(new Date(r.value),i,n,a)}function BC(r,e){var t=Kr(r),a=t[uo(e)]()+1,n=t[Ih(e)](),i=t[js(e)](),o=t[Ph(e)](),s=t[Rh(e)](),l=t[Eh(e)](),u=l===0,f=u&&s===0,h=f&&o===0,v=h&&i===0,c=v&&n===1,d=c&&a===1;return d?\"year\":c?\"month\":v?\"day\":h?\"hour\":f?\"minute\":u?\"second\":\"millisecond\"}function j0(r,e,t){var a=Mt(r)?Kr(r):r;switch(e=e||BC(r,t),e){case\"year\":return a[qg(t)]();case\"half-year\":return a[uo(t)]()>=6?1:0;case\"quarter\":return Math.floor((a[uo(t)]()+1)/4);case\"month\":return a[uo(t)]();case\"day\":return a[Ih(t)]();case\"half-day\":return a[js(t)]()/24;case\"hour\":return a[js(t)]();case\"minute\":return a[Ph(t)]();case\"second\":return a[Rh(t)]();case\"millisecond\":return a[Eh(t)]()}}function qg(r){return r?\"getUTCFullYear\":\"getFullYear\"}function uo(r){return r?\"getUTCMonth\":\"getMonth\"}function Ih(r){return r?\"getUTCDate\":\"getDate\"}function js(r){return r?\"getUTCHours\":\"getHours\"}function Ph(r){return r?\"getUTCMinutes\":\"getMinutes\"}function Rh(r){return r?\"getUTCSeconds\":\"getSeconds\"}function Eh(r){return r?\"getUTCMilliseconds\":\"getMilliseconds\"}function H3(r){return r?\"setUTCFullYear\":\"setFullYear\"}function NC(r){return r?\"setUTCMonth\":\"setMonth\"}function VC(r){return r?\"setUTCDate\":\"setDate\"}function zC(r){return r?\"setUTCHours\":\"setHours\"}function FC(r){return r?\"setUTCMinutes\":\"setMinutes\"}function GC(r){return r?\"setUTCSeconds\":\"setSeconds\"}function HC(r){return r?\"setUTCMilliseconds\":\"setMilliseconds\"}function WC(r){if(!b2(r))return U(r)?r:\"-\";var e=(r+\"\").split(\".\");return e[0].replace(/(\\d{1,3})(?=(?:\\d{3})+(?!\\d))/g,\"$1,\")+(e.length>1?\".\"+e[1]:\"\")}function $C(r,e){return r=(r||\"\").toLowerCase().replace(/-(.)/g,function(t,a){return a.toUpperCase()}),e&&r&&(r=r.charAt(0).toUpperCase()+r.slice(1)),r}var Io=xg;function sp(r,e,t){var a=\"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}\";function n(f){return f&&Sr(f)?f:\"-\"}function i(f){return!!(f!=null&&!isNaN(f)&&isFinite(f))}var o=e===\"time\",s=r instanceof Date;if(o||s){var l=o?Kr(r):r;if(isNaN(+l)){if(s)return\"-\"}else return Lh(l,a,t)}if(e===\"ordinal\")return Ad(r)?n(r):Mt(r)&&i(r)?r+\"\":\"-\";var u=ma(r);return i(u)?WC(u):Ad(r)?n(r):typeof r==\"boolean\"?r+\"\":\"-\"}var t1=[\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\"],Fv=function(r,e){return\"{\"+r+(e==null?\"\":e)+\"}\"};function UC(r,e,t){F(e)||(e=[e]);var a=e.length;if(!a)return\"\";for(var n=e[0].$vars||[],i=0;i<n.length;i++){var o=t1[i];r=r.replace(Fv(o),Fv(o,0))}for(var s=0;s<a;s++)for(var l=0;l<n.length;l++){var u=e[s][n[l]];r=r.replace(Fv(t1[l],s),t?ke(u):u)}return r}function W3(r,e,t){return A(e,function(a,n){r=r.replace(\"{\"+n+\"}\",t?ke(a):a)}),r}function $3(r,e){var t=U(r)?{color:r,extraCssText:e}:r||{},a=t.color,n=t.type;e=t.extraCssText;var i=t.renderMode||\"html\";if(!a)return\"\";if(i===\"html\")return n===\"subItem\"?'<span style=\"display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;border-radius:4px;width:4px;height:4px;background-color:'+ke(a)+\";\"+(e||\"\")+'\"></span>':'<span style=\"display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:'+ke(a)+\";\"+(e||\"\")+'\"></span>';var o=t.markerId||\"markerX\";return{renderMode:i,content:\"{\"+o+\"|}  \",style:n===\"subItem\"?{width:4,height:4,borderRadius:2,backgroundColor:a}:{width:10,height:10,borderRadius:5,backgroundColor:a}}}function yi(r,e){return e=e||\"transparent\",U(r)?r:et(r)&&r.colorStops&&(r.colorStops[0]||{}).color||e}function Rf(r,e){if(e===\"_blank\"||e===\"blank\"){var t=window.open();t.opener=null,t.location.href=r}else window.open(r,e)}var of=A,YC=[\"left\",\"right\",\"top\",\"bottom\",\"width\",\"height\"],Qn=[[\"width\",\"left\",\"right\"],[\"height\",\"top\",\"bottom\"]];function Kg(r,e,t,a,n){var i=0,o=0;a==null&&(a=1/0),n==null&&(n=1/0);var s=0;e.eachChild(function(l,u){var f=l.getBoundingRect(),h=e.childAt(u+1),v=h&&h.getBoundingRect(),c,d;if(r===\"horizontal\"){var p=f.width+(v?-v.x+f.x:0);c=i+p,c>a||l.newline?(i=0,c=p,o+=s+t,s=f.height):s=Math.max(s,f.height)}else{var g=f.height+(v?-v.y+f.y:0);d=o+g,d>n||l.newline?(i+=s+t,o=0,d=g,s=f.width):s=Math.max(s,f.width)}l.newline||(l.x=i,l.y=o,l.markRedraw(),r===\"horizontal\"?i=c+t:o=d+t)})}var ui=Kg;ot(Kg,\"vertical\");ot(Kg,\"horizontal\");function U3(r,e,t){var a=e.width,n=e.height,i=W(r.left,a),o=W(r.top,n),s=W(r.right,a),l=W(r.bottom,n);return(isNaN(i)||isNaN(parseFloat(r.left)))&&(i=0),(isNaN(s)||isNaN(parseFloat(r.right)))&&(s=a),(isNaN(o)||isNaN(parseFloat(r.top)))&&(o=0),(isNaN(l)||isNaN(parseFloat(r.bottom)))&&(l=n),t=Io(t||0),{width:Math.max(s-i-t[1]-t[3],0),height:Math.max(l-o-t[0]-t[2],0)}}function re(r,e,t){t=Io(t||0);var a=e.width,n=e.height,i=W(r.left,a),o=W(r.top,n),s=W(r.right,a),l=W(r.bottom,n),u=W(r.width,a),f=W(r.height,n),h=t[2]+t[0],v=t[1]+t[3],c=r.aspect;switch(isNaN(u)&&(u=a-s-v-i),isNaN(f)&&(f=n-l-h-o),c!=null&&(isNaN(u)&&isNaN(f)&&(c>a/n?u=a*.8:f=n*.8),isNaN(u)&&(u=c*f),isNaN(f)&&(f=u/c)),isNaN(i)&&(i=a-s-u-v),isNaN(o)&&(o=n-l-f-h),r.left||r.right){case\"center\":i=a/2-u/2-t[3];break;case\"right\":i=a-u-v;break}switch(r.top||r.bottom){case\"middle\":case\"center\":o=n/2-f/2-t[0];break;case\"bottom\":o=n-f-h;break}i=i||0,o=o||0,isNaN(u)&&(u=a-v-i-(s||0)),isNaN(f)&&(f=n-h-o-(l||0));var d=new vt(i+t[3],o+t[0],u,f);return d.margin=t,d}function kh(r,e,t,a,n,i){var o=!n||!n.hv||n.hv[0],s=!n||!n.hv||n.hv[1],l=n&&n.boundingMode||\"all\";if(i=i||r,i.x=r.x,i.y=r.y,!o&&!s)return!1;var u;if(l===\"raw\")u=r.type===\"group\"?new vt(0,0,+e.width||0,+e.height||0):r.getBoundingRect();else if(u=r.getBoundingRect(),r.needLocalTransform()){var f=r.getLocalTransform();u=u.clone(),u.applyTransform(f)}var h=re(tt({width:u.width,height:u.height},e),t,a),v=o?h.x-u.x:0,c=s?h.y-u.y:0;return l===\"raw\"?(i.x=v,i.y=c):(i.x+=v,i.y+=c),i===r&&r.markRedraw(),!0}function Y3(r,e){return r[Qn[e][0]]!=null||r[Qn[e][1]]!=null&&r[Qn[e][2]]!=null}function tl(r){var e=r.layoutMode||r.constructor.layoutMode;return et(e)?e:e?{type:e}:null}function an(r,e,t){var a=t&&t.ignoreSize;!F(a)&&(a=[a,a]);var n=o(Qn[0],0),i=o(Qn[1],1);u(Qn[0],r,n),u(Qn[1],r,i);function o(f,h){var v={},c=0,d={},p=0,g=2;if(of(f,function(_){d[_]=r[_]}),of(f,function(_){s(e,_)&&(v[_]=d[_]=e[_]),l(v,_)&&c++,l(d,_)&&p++}),a[h])return l(e,f[1])?d[f[2]]=null:l(e,f[2])&&(d[f[1]]=null),d;if(p===g||!c)return d;if(c>=g)return v;for(var y=0;y<f.length;y++){var m=f[y];if(!s(v,m)&&s(r,m)){v[m]=r[m];break}}return v}function s(f,h){return f.hasOwnProperty(h)}function l(f,h){return f[h]!=null&&f[h]!==\"auto\"}function u(f,h,v){of(f,function(c){h[c]=v[c]})}}function Po(r){return ZC({},r)}function ZC(r,e){return e&&r&&of(YC,function(t){e.hasOwnProperty(t)&&(r[t]=e[t])}),r}var Z3=Ct(),Ro=function(r){k(e,r);function e(t,a,n){var i=r.call(this,t,a,n)||this;return i.uid=Lo(\"ec_cpt_model\"),i}return e.prototype.init=function(t,a,n){this.mergeDefaultAndTheme(t,n)},e.prototype.mergeDefaultAndTheme=function(t,a){var n=tl(this),i=n?Po(t):{},o=a.getTheme();ht(t,o.get(this.mainType)),ht(t,this.getDefaultOption()),n&&an(t,i,n)},e.prototype.mergeOption=function(t,a){ht(this.option,t,!0);var n=tl(this);n&&an(this.option,t,n)},e.prototype.optionUpdated=function(t,a){},e.prototype.getDefaultOption=function(){var t=this.constructor;if(!Mk(t))return t.defaultOption;var a=Z3(this);if(!a.defaultOption){for(var n=[],i=t;i;){var o=i.prototype.defaultOption;o&&n.push(o),i=i.superClass}for(var s={},l=n.length-1;l>=0;l--)s=ht(s,n[l],!0);a.defaultOption=s}return a.defaultOption},e.prototype.getReferringComponents=function(t,a){var n=t+\"Index\",i=t+\"Id\";return wl(this.ecModel,t,{index:this.get(n,!0),id:this.get(i,!0)},a)},e.prototype.getBoxLayoutParams=function(){var t=this;return{left:t.get(\"left\"),top:t.get(\"top\"),right:t.get(\"right\"),bottom:t.get(\"bottom\"),width:t.get(\"width\"),height:t.get(\"height\")}},e.prototype.getZLevelKey=function(){return\"\"},e.prototype.setZLevel=function(t){this.option.zlevel=t},e.protoInitialize=function(){var t=e.prototype;t.type=\"component\",t.id=\"\",t.name=\"\",t.mainType=\"\",t.subType=\"\",t.componentIndex=0}(),e}(Vt);E2(Ro,Vt);mh(Ro);E3(Ro);k3(Ro,X3);function X3(r){var e=[];return A(Ro.getClassesByMainType(r),function(t){e=e.concat(t.dependencies||t.prototype.dependencies||[])}),e=G(e,function(t){return Hr(t).main}),r!==\"dataset\"&&dt(e,\"dataset\")<=0&&e.unshift(\"dataset\"),e}var Tt=Ro,XC=\"\";typeof navigator!=\"undefined\"&&(XC=navigator.platform||\"\");var Ni=\"rgba(0, 0, 0, 0.2)\",q3={darkMode:\"auto\",colorBy:\"series\",color:[\"#5470c6\",\"#91cc75\",\"#fac858\",\"#ee6666\",\"#73c0de\",\"#3ba272\",\"#fc8452\",\"#9a60b4\",\"#ea7ccc\"],gradientColor:[\"#f6efa6\",\"#d88273\",\"#bf444c\"],aria:{decal:{decals:[{color:Ni,dashArrayX:[1,0],dashArrayY:[2,5],symbolSize:1,rotation:Math.PI/6},{color:Ni,symbol:\"circle\",dashArrayX:[[8,8],[0,8,8,0]],dashArrayY:[6,0],symbolSize:.8},{color:Ni,dashArrayX:[1,0],dashArrayY:[4,3],rotation:-Math.PI/4},{color:Ni,dashArrayX:[[6,6],[0,6,6,0]],dashArrayY:[6,0]},{color:Ni,dashArrayX:[[1,0],[1,6]],dashArrayY:[1,0,6,0],rotation:Math.PI/4},{color:Ni,symbol:\"triangle\",dashArrayX:[[9,9],[0,9,9,0]],dashArrayY:[7,2],symbolSize:.75}]}},textStyle:{fontFamily:XC.match(/^Win/)?\"Microsoft YaHei\":\"sans-serif\",fontSize:12,fontStyle:\"normal\",fontWeight:\"normal\"},blendMode:null,stateAnimation:{duration:300,easing:\"cubicOut\"},animation:\"auto\",animationDuration:1e3,animationDurationUpdate:500,animationEasing:\"cubicInOut\",animationEasingUpdate:\"cubicInOut\",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},qC=q([\"tooltip\",\"label\",\"itemName\",\"itemId\",\"itemGroupId\",\"seriesName\"]),vr=\"original\",xe=\"arrayRows\",cr=\"objectRows\",jr=\"keyedColumns\",Ja=\"typedArray\",KC=\"unknown\",Yr=\"column\",Eo=\"row\",fe={Must:1,Might:2,Not:3},JC=Ct();function K3(r){JC(r).datasetMap=q()}function QC(r,e,t){var a={},n=Qg(e);if(!n||!r)return a;var i=[],o=[],s=e.ecModel,l=JC(s).datasetMap,u=n.uid+\"_\"+t.seriesLayoutBy,f,h;r=r.slice(),A(r,function(p,g){var y=et(p)?p:r[g]={name:p};y.type===\"ordinal\"&&f==null&&(f=g,h=d(y)),a[y.name]=[]});var v=l.get(u)||l.set(u,{categoryWayDim:h,valueWayDim:0});A(r,function(p,g){var y=p.name,m=d(p);if(f==null){var _=v.valueWayDim;c(a[y],_,m),c(o,_,m),v.valueWayDim+=m}else if(f===g)c(a[y],0,m),c(i,0,m);else{var _=v.categoryWayDim;c(a[y],_,m),c(o,_,m),v.categoryWayDim+=m}});function c(p,g,y){for(var m=0;m<y;m++)p.push(g+m)}function d(p){var g=p.dimsDef;return g?g.length:1}return i.length&&(a.itemName=i),o.length&&(a.seriesName=o),a}function Jg(r,e,t){var a={},n=Qg(r);if(!n)return a;var i=e.sourceFormat,o=e.dimensionsDefine,s;(i===cr||i===jr)&&A(o,function(f,h){(et(f)?f.name:f)===\"name\"&&(s=h)});var l=function(){for(var f={},h={},v=[],c=0,d=Math.min(5,t);c<d;c++){var p=tT(e.data,i,e.seriesLayoutBy,o,e.startIndex,c);v.push(p);var g=p===fe.Not;if(g&&f.v==null&&c!==s&&(f.v=c),(f.n==null||f.n===f.v||!g&&v[f.n]===fe.Not)&&(f.n=c),y(f)&&v[f.n]!==fe.Not)return f;g||(p===fe.Might&&h.v==null&&c!==s&&(h.v=c),(h.n==null||h.n===h.v)&&(h.n=c))}function y(m){return m.v!=null&&m.n!=null}return y(f)?f:y(h)?h:null}();if(l){a.value=[l.v];var u=s!=null?s:l.n;a.itemName=[u],a.seriesName=[u]}return a}function Qg(r){var e=r.get(\"data\",!0);if(!e)return wl(r.ecModel,\"dataset\",{index:r.get(\"datasetIndex\",!0),id:r.get(\"datasetId\",!0)},Qt).models[0]}function J3(r){return!r.get(\"transform\",!0)&&!r.get(\"fromTransformResult\",!0)?[]:wl(r.ecModel,\"dataset\",{index:r.get(\"fromDatasetIndex\",!0),id:r.get(\"fromDatasetId\",!0)},Qt).models}function jC(r,e){return tT(r.data,r.sourceFormat,r.seriesLayoutBy,r.dimensionsDefine,r.startIndex,e)}function tT(r,e,t,a,n,i){var o,s=5;if(Ue(r))return fe.Not;var l,u;if(a){var f=a[i];et(f)?(l=f.name,u=f.type):U(f)&&(l=f)}if(u!=null)return u===\"ordinal\"?fe.Must:fe.Not;if(e===xe){var h=r;if(t===Eo){for(var v=h[i],c=0;c<(v||[]).length&&c<s;c++)if((o=S(v[n+c]))!=null)return o}else for(var c=0;c<h.length&&c<s;c++){var d=h[n+c];if(d&&(o=S(d[i]))!=null)return o}}else if(e===cr){var p=r;if(!l)return fe.Not;for(var c=0;c<p.length&&c<s;c++){var g=p[c];if(g&&(o=S(g[l]))!=null)return o}}else if(e===jr){var y=r;if(!l)return fe.Not;var v=y[l];if(!v||Ue(v))return fe.Not;for(var c=0;c<v.length&&c<s;c++)if((o=S(v[c]))!=null)return o}else if(e===vr)for(var m=r,c=0;c<m.length&&c<s;c++){var g=m[c],_=Co(g);if(!F(_))return fe.Not;if((o=S(_[i]))!=null)return o}function S(w){var x=U(w);if(w!=null&&isFinite(w)&&w!==\"\")return x?fe.Might:fe.Not;if(x&&w!==\"-\")return fe.Must}return fe.Not}var lp=q();function Q3(r,e){Me(lp.get(r)==null&&e),lp.set(r,e)}function j3(r,e,t){var a=lp.get(e);if(!a)return t;var n=a(r);return n?t.concat(n):t}var e1=Ct(),tO=Ct(),jg=function(){function r(){}return r.prototype.getColorFromPalette=function(e,t,a){var n=kt(this.get(\"color\",!0)),i=this.get(\"colorLayer\",!0);return eT(this,e1,n,i,e,t,a)},r.prototype.clearColorPalette=function(){rO(this,e1)},r}();function up(r,e,t,a){var n=kt(r.get([\"aria\",\"decal\",\"decals\"]));return eT(r,tO,n,null,e,t,a)}function eO(r,e){for(var t=r.length,a=0;a<t;a++)if(r[a].length>e)return r[a];return r[t-1]}function eT(r,e,t,a,n,i,o){i=i||r;var s=e(i),l=s.paletteIdx||0,u=s.paletteNameMap=s.paletteNameMap||{};if(u.hasOwnProperty(n))return u[n];var f=o==null||!a?t:eO(a,o);if(f=f||t,!(!f||!f.length)){var h=f[l];return n&&(u[n]=h),s.paletteIdx=(l+1)%f.length,h}}function rO(r,e){e(r).paletteIdx=0,e(r).paletteNameMap={}}var su,Yo,r1,a1=\"\\0_ec_inner\",aO=1,rT=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.init=function(t,a,n,i,o,s){i=i||{},this.option=null,this._theme=new Vt(i),this._locale=new Vt(o),this._optionManager=s},e.prototype.setOption=function(t,a,n){var i=o1(a);this._optionManager.setOption(t,n,i),this._resetOption(null,i)},e.prototype.resetOption=function(t,a){return this._resetOption(t,o1(a))},e.prototype._resetOption=function(t,a){var n=!1,i=this._optionManager;if(!t||t===\"recreate\"){var o=i.mountOption(t===\"recreate\");!this.option||t===\"recreate\"?r1(this,o):(this.restoreData(),this._mergeOption(o,a)),n=!0}if((t===\"timeline\"||t===\"media\")&&this.restoreData(),!t||t===\"recreate\"||t===\"timeline\"){var s=i.getTimelineOption(this);s&&(n=!0,this._mergeOption(s,a))}if(!t||t===\"recreate\"||t===\"media\"){var l=i.getMediaOption(this);l.length&&A(l,function(u){n=!0,this._mergeOption(u,a)},this)}return n},e.prototype.mergeOption=function(t){this._mergeOption(t,null)},e.prototype._mergeOption=function(t,a){var n=this.option,i=this._componentsMap,o=this._componentsCount,s=[],l=q(),u=a&&a.replaceMergeMainTypeMap;K3(this),A(t,function(h,v){h!=null&&(Tt.hasClass(v)?v&&(s.push(v),l.set(v,!0)):n[v]=n[v]==null?at(h):ht(n[v],h,!0))}),u&&u.each(function(h,v){Tt.hasClass(v)&&!l.get(v)&&(s.push(v),l.set(v,!0))}),Tt.topologicalTravel(s,Tt.getAllClassMainTypes(),f,this);function f(h){var v=j3(this,h,kt(t[h])),c=i.get(h),d=c?u&&u.get(h)?\"replaceMerge\":\"normalMerge\":\"replaceAll\",p=M2(c,v,d);_k(p,h,Tt),n[h]=null,i.set(h,null),o.set(h,0);var g=[],y=[],m=0,_;A(p,function(S,w){var x=S.existing,b=S.newOption;if(!b)x&&(x.mergeOption({},this),x.optionUpdated({},!1));else{var C=h===\"series\",T=Tt.getClass(h,S.keyInfo.subType,!C);if(!T)return;if(h===\"tooltip\"){if(_)return;_=!0}if(x&&x.constructor===T)x.name=S.keyInfo.name,x.mergeOption(b,this),x.optionUpdated(b,!1);else{var D=V({componentIndex:w},S.keyInfo);x=new T(b,this,this,D),V(x,D),S.brandNew&&(x.__requireNewView=!0),x.init(b,this,this),x.optionUpdated(null,!0)}}x?(g.push(x.option),y.push(x),m++):(g.push(void 0),y.push(void 0))},this),n[h]=g,i.set(h,y),o.set(h,m),h===\"series\"&&su(this)}this._seriesIndices||su(this)},e.prototype.getOption=function(){var t=at(this.option);return A(t,function(a,n){if(Tt.hasClass(n)){for(var i=kt(a),o=i.length,s=!1,l=o-1;l>=0;l--)i[l]&&!Zs(i[l])?s=!0:(i[l]=null,!s&&o--);i.length=o,t[n]=i}}),delete t[a1],t},e.prototype.getTheme=function(){return this._theme},e.prototype.getLocaleModel=function(){return this._locale},e.prototype.setUpdatePayload=function(t){this._payload=t},e.prototype.getUpdatePayload=function(){return this._payload},e.prototype.getComponent=function(t,a){var n=this._componentsMap.get(t);if(n){var i=n[a||0];if(i)return i;if(a==null){for(var o=0;o<n.length;o++)if(n[o])return n[o]}}},e.prototype.queryComponents=function(t){var a=t.mainType;if(!a)return[];var n=t.index,i=t.id,o=t.name,s=this._componentsMap.get(a);if(!s||!s.length)return[];var l;return n!=null?(l=[],A(kt(n),function(u){s[u]&&l.push(s[u])})):i!=null?l=n1(\"id\",i,s):o!=null?l=n1(\"name\",o,s):l=Et(s,function(u){return!!u}),i1(l,t)},e.prototype.findComponents=function(t){var a=t.query,n=t.mainType,i=s(a),o=i?this.queryComponents(i):Et(this._componentsMap.get(n),function(u){return!!u});return l(i1(o,t));function s(u){var f=n+\"Index\",h=n+\"Id\",v=n+\"Name\";return u&&(u[f]!=null||u[h]!=null||u[v]!=null)?{mainType:n,index:u[f],id:u[h],name:u[v]}:null}function l(u){return t.filter?Et(u,t.filter):u}},e.prototype.eachComponent=function(t,a,n){var i=this._componentsMap;if(J(t)){var o=a,s=t;i.each(function(h,v){for(var c=0;h&&c<h.length;c++){var d=h[c];d&&s.call(o,v,d,d.componentIndex)}})}else for(var l=U(t)?i.get(t):et(t)?this.findComponents(t):null,u=0;l&&u<l.length;u++){var f=l[u];f&&a.call(n,f,f.componentIndex)}},e.prototype.getSeriesByName=function(t){var a=ee(t,null);return Et(this._componentsMap.get(\"series\"),function(n){return!!n&&a!=null&&n.name===a})},e.prototype.getSeriesByIndex=function(t){return this._componentsMap.get(\"series\")[t]},e.prototype.getSeriesByType=function(t){return Et(this._componentsMap.get(\"series\"),function(a){return!!a&&a.subType===t})},e.prototype.getSeries=function(){return Et(this._componentsMap.get(\"series\"),function(t){return!!t})},e.prototype.getSeriesCount=function(){return this._componentsCount.get(\"series\")},e.prototype.eachSeries=function(t,a){Yo(this),A(this._seriesIndices,function(n){var i=this._componentsMap.get(\"series\")[n];t.call(a,i,n)},this)},e.prototype.eachRawSeries=function(t,a){A(this._componentsMap.get(\"series\"),function(n){n&&t.call(a,n,n.componentIndex)})},e.prototype.eachSeriesByType=function(t,a,n){Yo(this),A(this._seriesIndices,function(i){var o=this._componentsMap.get(\"series\")[i];o.subType===t&&a.call(n,o,i)},this)},e.prototype.eachRawSeriesByType=function(t,a,n){return A(this.getSeriesByType(t),a,n)},e.prototype.isSeriesFiltered=function(t){return Yo(this),this._seriesIndicesMap.get(t.componentIndex)==null},e.prototype.getCurrentSeriesIndices=function(){return(this._seriesIndices||[]).slice()},e.prototype.filterSeries=function(t,a){Yo(this);var n=[];A(this._seriesIndices,function(i){var o=this._componentsMap.get(\"series\")[i];t.call(a,o,i)&&n.push(i)},this),this._seriesIndices=n,this._seriesIndicesMap=q(n)},e.prototype.restoreData=function(t){su(this);var a=this._componentsMap,n=[];a.each(function(i,o){Tt.hasClass(o)&&n.push(o)}),Tt.topologicalTravel(n,Tt.getAllClassMainTypes(),function(i){A(a.get(i),function(o){o&&(i!==\"series\"||!nO(o,t))&&o.restoreData()})})},e.internalField=function(){su=function(t){var a=t._seriesIndices=[];A(t._componentsMap.get(\"series\"),function(n){n&&a.push(n.componentIndex)}),t._seriesIndicesMap=q(a)},Yo=function(t){},r1=function(t,a){t.option={},t.option[a1]=aO,t._componentsMap=q({series:[]}),t._componentsCount=q();var n=a.aria;et(n)&&n.enabled==null&&(n.enabled=!0),iO(a,t._theme.option),ht(a,q3,!1),t._mergeOption(a,null)}}(),e}(Vt);function nO(r,e){if(e){var t=e.seriesIndex,a=e.seriesId,n=e.seriesName;return t!=null&&r.componentIndex!==t||a!=null&&r.id!==a||n!=null&&r.name!==n}}function iO(r,e){var t=r.color&&!r.colorLayer;A(e,function(a,n){n===\"colorLayer\"&&t||Tt.hasClass(n)||(typeof a==\"object\"?r[n]=r[n]?ht(r[n],a,!1):at(a):r[n]==null&&(r[n]=a))})}function n1(r,e,t){if(F(e)){var a=q();return A(e,function(i){if(i!=null){var o=ee(i,null);o!=null&&a.set(i,!0)}}),Et(t,function(i){return i&&a.get(i[r])})}else{var n=ee(e,null);return Et(t,function(i){return i&&n!=null&&i[r]===n})}}function i1(r,e){return e.hasOwnProperty(\"subType\")?Et(r,function(t){return t&&t.subType===e.subType}):r}function o1(r){var e=q();return r&&A(kt(r.replaceMerge),function(t){e.set(t,!0)}),{replaceMergeMainTypeMap:e}}te(rT,jg);var aT=rT,oO=[\"getDom\",\"getZr\",\"getWidth\",\"getHeight\",\"getDevicePixelRatio\",\"dispatchAction\",\"isSSR\",\"isDisposed\",\"on\",\"off\",\"getDataURL\",\"getConnectedDataURL\",\"getOption\",\"getId\",\"updateLabelLayout\"],sO=function(){function r(e){A(oO,function(t){this[t]=Y(e[t],e)},this)}return r}(),nT=sO,Gv={},lO=function(){function r(){this._coordinateSystems=[]}return r.prototype.create=function(e,t){var a=[];A(Gv,function(n,i){var o=n.create(e,t);a=a.concat(o||[])}),this._coordinateSystems=a},r.prototype.update=function(e,t){A(this._coordinateSystems,function(a){a.update&&a.update(e,t)})},r.prototype.getCoordinateSystems=function(){return this._coordinateSystems.slice()},r.register=function(e,t){Gv[e]=t},r.get=function(e){return Gv[e]},r}(),Ml=lO,uO=/^(min|max)?(.+)$/,fO=function(){function r(e){this._timelineOptions=[],this._mediaList=[],this._currentMediaIndices=[],this._api=e}return r.prototype.setOption=function(e,t,a){e&&(A(kt(e.series),function(o){o&&o.data&&Ue(o.data)&&pf(o.data)}),A(kt(e.dataset),function(o){o&&o.source&&Ue(o.source)&&pf(o.source)})),e=at(e);var n=this._optionBackup,i=hO(e,t,!n);this._newBaseOption=i.baseOption,n?(i.timelineOptions.length&&(n.timelineOptions=i.timelineOptions),i.mediaList.length&&(n.mediaList=i.mediaList),i.mediaDefault&&(n.mediaDefault=i.mediaDefault)):this._optionBackup=i},r.prototype.mountOption=function(e){var t=this._optionBackup;return this._timelineOptions=t.timelineOptions,this._mediaList=t.mediaList,this._mediaDefault=t.mediaDefault,this._currentMediaIndices=[],at(e?t.baseOption:this._newBaseOption)},r.prototype.getTimelineOption=function(e){var t,a=this._timelineOptions;if(a.length){var n=e.getComponent(\"timeline\");n&&(t=at(a[n.getCurrentIndex()]))}return t},r.prototype.getMediaOption=function(e){var t=this._api.getWidth(),a=this._api.getHeight(),n=this._mediaList,i=this._mediaDefault,o=[],s=[];if(!n.length&&!i)return s;for(var l=0,u=n.length;l<u;l++)vO(n[l].query,t,a)&&o.push(l);return!o.length&&i&&(o=[-1]),o.length&&!dO(o,this._currentMediaIndices)&&(s=G(o,function(f){return at(f===-1?i.option:n[f].option)})),this._currentMediaIndices=o,s},r}();function hO(r,e,t){var a=[],n,i,o=r.baseOption,s=r.timeline,l=r.options,u=r.media,f=!!r.media,h=!!(l||s||o&&o.timeline);o?(i=o,i.timeline||(i.timeline=s)):((h||f)&&(r.options=r.media=null),i=r),f&&F(u)&&A(u,function(c){c&&c.option&&(c.query?a.push(c):n||(n=c))}),v(i),A(l,function(c){return v(c)}),A(a,function(c){return v(c.option)});function v(c){A(e,function(d){d(c,t)})}return{baseOption:i,timelineOptions:l||[],mediaDefault:n,mediaList:a}}function vO(r,e,t){var a={width:e,height:t,aspectratio:e/t},n=!0;return A(r,function(i,o){var s=o.match(uO);if(!(!s||!s[1]||!s[2])){var l=s[1],u=s[2].toLowerCase();cO(a[u],i,l)||(n=!1)}}),n}function cO(r,e,t){return t===\"min\"?r>=e:t===\"max\"?r<=e:r===e}function dO(r,e){return r.join(\",\")===e.join(\",\")}var pO=fO,dr=A,el=et,s1=[\"areaStyle\",\"lineStyle\",\"nodeStyle\",\"linkStyle\",\"chordStyle\",\"label\",\"labelLine\"];function Hv(r){var e=r&&r.itemStyle;if(!!e)for(var t=0,a=s1.length;t<a;t++){var n=s1[t],i=e.normal,o=e.emphasis;i&&i[n]&&(r[n]=r[n]||{},r[n].normal?ht(r[n].normal,i[n]):r[n].normal=i[n],i[n]=null),o&&o[n]&&(r[n]=r[n]||{},r[n].emphasis?ht(r[n].emphasis,o[n]):r[n].emphasis=o[n],o[n]=null)}}function _e(r,e,t){if(r&&r[e]&&(r[e].normal||r[e].emphasis)){var a=r[e].normal,n=r[e].emphasis;a&&(t?(r[e].normal=r[e].emphasis=null,tt(r[e],a)):r[e]=a),n&&(r.emphasis=r.emphasis||{},r.emphasis[e]=n,n.focus&&(r.emphasis.focus=n.focus),n.blurScope&&(r.emphasis.blurScope=n.blurScope))}}function _s(r){_e(r,\"itemStyle\"),_e(r,\"lineStyle\"),_e(r,\"areaStyle\"),_e(r,\"label\"),_e(r,\"labelLine\"),_e(r,\"upperLabel\"),_e(r,\"edgeLabel\")}function Jt(r,e){var t=el(r)&&r[e],a=el(t)&&t.textStyle;if(a)for(var n=0,i=h0.length;n<i;n++){var o=h0[n];a.hasOwnProperty(o)&&(t[o]=a[o])}}function Qe(r){r&&(_s(r),Jt(r,\"label\"),r.emphasis&&Jt(r.emphasis,\"label\"))}function gO(r){if(!!el(r)){Hv(r),_s(r),Jt(r,\"label\"),Jt(r,\"upperLabel\"),Jt(r,\"edgeLabel\"),r.emphasis&&(Jt(r.emphasis,\"label\"),Jt(r.emphasis,\"upperLabel\"),Jt(r.emphasis,\"edgeLabel\"));var e=r.markPoint;e&&(Hv(e),Qe(e));var t=r.markLine;t&&(Hv(t),Qe(t));var a=r.markArea;a&&Qe(a);var n=r.data;if(r.type===\"graph\"){n=n||r.nodes;var i=r.links||r.edges;if(i&&!Ue(i))for(var o=0;o<i.length;o++)Qe(i[o]);A(r.categories,function(u){_s(u)})}if(n&&!Ue(n))for(var o=0;o<n.length;o++)Qe(n[o]);if(e=r.markPoint,e&&e.data)for(var s=e.data,o=0;o<s.length;o++)Qe(s[o]);if(t=r.markLine,t&&t.data)for(var l=t.data,o=0;o<l.length;o++)F(l[o])?(Qe(l[o][0]),Qe(l[o][1])):Qe(l[o]);r.type===\"gauge\"?(Jt(r,\"axisLabel\"),Jt(r,\"title\"),Jt(r,\"detail\")):r.type===\"treemap\"?(_e(r.breadcrumb,\"itemStyle\"),A(r.levels,function(u){_s(u)})):r.type===\"tree\"&&_s(r.leaves)}}function na(r){return F(r)?r:r?[r]:[]}function l1(r){return(F(r)?r[0]:r)||{}}function yO(r,e){dr(na(r.series),function(a){el(a)&&gO(a)});var t=[\"xAxis\",\"yAxis\",\"radiusAxis\",\"angleAxis\",\"singleAxis\",\"parallelAxis\",\"radar\"];e&&t.push(\"valueAxis\",\"categoryAxis\",\"logAxis\",\"timeAxis\"),dr(t,function(a){dr(na(r[a]),function(n){n&&(Jt(n,\"axisLabel\"),Jt(n.axisPointer,\"label\"))})}),dr(na(r.parallel),function(a){var n=a&&a.parallelAxisDefault;Jt(n,\"axisLabel\"),Jt(n&&n.axisPointer,\"label\")}),dr(na(r.calendar),function(a){_e(a,\"itemStyle\"),Jt(a,\"dayLabel\"),Jt(a,\"monthLabel\"),Jt(a,\"yearLabel\")}),dr(na(r.radar),function(a){Jt(a,\"name\"),a.name&&a.axisName==null&&(a.axisName=a.name,delete a.name),a.nameGap!=null&&a.axisNameGap==null&&(a.axisNameGap=a.nameGap,delete a.nameGap)}),dr(na(r.geo),function(a){el(a)&&(Qe(a),dr(na(a.regions),function(n){Qe(n)}))}),dr(na(r.timeline),function(a){Qe(a),_e(a,\"label\"),_e(a,\"itemStyle\"),_e(a,\"controlStyle\",!0);var n=a.data;F(n)&&A(n,function(i){et(i)&&(_e(i,\"label\"),_e(i,\"itemStyle\"))})}),dr(na(r.toolbox),function(a){_e(a,\"iconStyle\"),dr(a.feature,function(n){_e(n,\"iconStyle\")})}),Jt(l1(r.axisPointer),\"label\"),Jt(l1(r.tooltip).axisPointer,\"label\")}function mO(r,e){for(var t=e.split(\",\"),a=r,n=0;n<t.length&&(a=a&&a[t[n]],a!=null);n++);return a}function _O(r,e,t,a){for(var n=e.split(\",\"),i=r,o,s=0;s<n.length-1;s++)o=n[s],i[o]==null&&(i[o]={}),i=i[o];(a||i[n[s]]==null)&&(i[n[s]]=t)}function u1(r){r&&A(SO,function(e){e[0]in r&&!(e[1]in r)&&(r[e[1]]=r[e[0]])})}var SO=[[\"x\",\"left\"],[\"y\",\"top\"],[\"x2\",\"right\"],[\"y2\",\"bottom\"]],xO=[\"grid\",\"geo\",\"parallel\",\"legend\",\"toolbox\",\"title\",\"visualMap\",\"dataZoom\",\"timeline\"],Wv=[[\"borderRadius\",\"barBorderRadius\"],[\"borderColor\",\"barBorderColor\"],[\"borderWidth\",\"barBorderWidth\"]];function Zo(r){var e=r&&r.itemStyle;if(e)for(var t=0;t<Wv.length;t++){var a=Wv[t][1],n=Wv[t][0];e[a]!=null&&(e[n]=e[a])}}function f1(r){!r||r.alignTo===\"edge\"&&r.margin!=null&&r.edgeDistance==null&&(r.edgeDistance=r.margin)}function h1(r){!r||r.downplay&&!r.blur&&(r.blur=r.downplay)}function wO(r){!r||r.focusNodeAdjacency!=null&&(r.emphasis=r.emphasis||{},r.emphasis.focus==null&&(r.emphasis.focus=\"adjacency\"))}function iT(r,e){if(r)for(var t=0;t<r.length;t++)e(r[t]),r[t]&&iT(r[t].children,e)}function oT(r,e){yO(r,e),r.series=kt(r.series),A(r.series,function(t){if(!!et(t)){var a=t.type;if(a===\"line\")t.clipOverflow!=null&&(t.clip=t.clipOverflow);else if(a===\"pie\"||a===\"gauge\"){t.clockWise!=null&&(t.clockwise=t.clockWise),f1(t.label);var n=t.data;if(n&&!Ue(n))for(var i=0;i<n.length;i++)f1(n[i]);t.hoverOffset!=null&&(t.emphasis=t.emphasis||{},(t.emphasis.scaleSize=null)&&(t.emphasis.scaleSize=t.hoverOffset))}else if(a===\"gauge\"){var o=mO(t,\"pointer.color\");o!=null&&_O(t,\"itemStyle.color\",o)}else if(a===\"bar\"){Zo(t),Zo(t.backgroundStyle),Zo(t.emphasis);var n=t.data;if(n&&!Ue(n))for(var i=0;i<n.length;i++)typeof n[i]==\"object\"&&(Zo(n[i]),Zo(n[i]&&n[i].emphasis))}else if(a===\"sunburst\"){var s=t.highlightPolicy;s&&(t.emphasis=t.emphasis||{},t.emphasis.focus||(t.emphasis.focus=s)),h1(t),iT(t.data,h1)}else a===\"graph\"||a===\"sankey\"?wO(t):a===\"map\"&&(t.mapType&&!t.map&&(t.map=t.mapType),t.mapLocation&&tt(t,t.mapLocation));t.hoverAnimation!=null&&(t.emphasis=t.emphasis||{},t.emphasis&&t.emphasis.scale==null&&(t.emphasis.scale=t.hoverAnimation)),u1(t)}}),r.dataRange&&(r.visualMap=r.dataRange),A(xO,function(t){var a=r[t];a&&(F(a)||(a=[a]),A(a,function(n){u1(n)}))})}function bO(r){var e=q();r.eachSeries(function(t){var a=t.get(\"stack\");if(a){var n=e.get(a)||e.set(a,[]),i=t.getData(),o={stackResultDimension:i.getCalculationInfo(\"stackResultDimension\"),stackedOverDimension:i.getCalculationInfo(\"stackedOverDimension\"),stackedDimension:i.getCalculationInfo(\"stackedDimension\"),stackedByDimension:i.getCalculationInfo(\"stackedByDimension\"),isStackedByIndex:i.getCalculationInfo(\"isStackedByIndex\"),data:i,seriesModel:t};if(!o.stackedDimension||!(o.isStackedByIndex||o.stackedByDimension))return;n.length&&i.setCalculationInfo(\"stackedOnSeries\",n[n.length-1].seriesModel),n.push(o)}}),e.each(CO)}function CO(r){A(r,function(e,t){var a=[],n=[NaN,NaN],i=[e.stackResultDimension,e.stackedOverDimension],o=e.data,s=e.isStackedByIndex,l=e.seriesModel.get(\"stackStrategy\")||\"samesign\";o.modify(i,function(u,f,h){var v=o.get(e.stackedDimension,h);if(isNaN(v))return n;var c,d;s?d=o.getRawIndex(h):c=o.get(e.stackedByDimension,h);for(var p=NaN,g=t-1;g>=0;g--){var y=r[g];if(s||(d=y.data.rawIndexOf(y.stackedByDimension,c)),d>=0){var m=y.data.getByRawIndex(y.stackResultDimension,d);if(l===\"all\"||l===\"positive\"&&m>0||l===\"negative\"&&m<0||l===\"samesign\"&&v>=0&&m>0||l===\"samesign\"&&v<=0&&m<0){v=lk(v,m),p=m;break}}}return a[0]=v,a[1]=p,a})})}var Oh=function(){function r(e){this.data=e.data||(e.sourceFormat===jr?{}:[]),this.sourceFormat=e.sourceFormat||KC,this.seriesLayoutBy=e.seriesLayoutBy||Yr,this.startIndex=e.startIndex||0,this.dimensionsDetectedCount=e.dimensionsDetectedCount,this.metaRawOption=e.metaRawOption;var t=this.dimensionsDefine=e.dimensionsDefine;if(t)for(var a=0;a<t.length;a++){var n=t[a];n.type==null&&jC(this,a)===fe.Must&&(n.type=\"ordinal\")}}return r}();function ty(r){return r instanceof Oh}function fp(r,e,t){t=t||sT(r);var a=e.seriesLayoutBy,n=AO(r,t,a,e.sourceHeader,e.dimensions),i=new Oh({data:r,sourceFormat:t,seriesLayoutBy:a,dimensionsDefine:n.dimensionsDefine,startIndex:n.startIndex,dimensionsDetectedCount:n.dimensionsDetectedCount,metaRawOption:at(e)});return i}function ey(r){return new Oh({data:r,sourceFormat:Ue(r)?Ja:vr})}function TO(r){return new Oh({data:r.data,sourceFormat:r.sourceFormat,seriesLayoutBy:r.seriesLayoutBy,dimensionsDefine:at(r.dimensionsDefine),startIndex:r.startIndex,dimensionsDetectedCount:r.dimensionsDetectedCount})}function sT(r){var e=KC;if(Ue(r))e=Ja;else if(F(r)){r.length===0&&(e=xe);for(var t=0,a=r.length;t<a;t++){var n=r[t];if(n!=null){if(F(n)){e=xe;break}else if(et(n)){e=cr;break}}}}else if(et(r)){for(var i in r)if(Z(r,i)&&Se(r[i])){e=jr;break}}return e}function AO(r,e,t,a,n){var i,o;if(!r)return{dimensionsDefine:v1(n),startIndex:o,dimensionsDetectedCount:i};if(e===xe){var s=r;a===\"auto\"||a==null?c1(function(u){u!=null&&u!==\"-\"&&(U(u)?o==null&&(o=1):o=0)},t,s,10):o=Mt(a)?a:a?1:0,!n&&o===1&&(n=[],c1(function(u,f){n[f]=u!=null?u+\"\":\"\"},t,s,1/0)),i=n?n.length:t===Eo?s.length:s[0]?s[0].length:null}else if(e===cr)n||(n=DO(r));else if(e===jr)n||(n=[],A(r,function(u,f){n.push(f)}));else if(e===vr){var l=Co(r[0]);i=F(l)&&l.length||1}return{startIndex:o,dimensionsDefine:v1(n),dimensionsDetectedCount:i}}function DO(r){for(var e=0,t;e<r.length&&!(t=r[e++]););if(t)return St(t)}function v1(r){if(!!r){var e=q();return G(r,function(t,a){t=et(t)?t:{name:t};var n={name:t.name,displayName:t.displayName,type:t.type};if(n.name==null)return n;n.name+=\"\",n.displayName==null&&(n.displayName=n.name);var i=e.get(n.name);return i?n.name+=\"-\"+i.count++:e.set(n.name,{count:1}),n})}}function c1(r,e,t,a){if(e===Eo)for(var n=0;n<t.length&&n<a;n++)r(t[n]?t[n][0]:null,n);else for(var i=t[0]||[],n=0;n<i.length&&n<a;n++)r(i[n],n)}function lT(r){var e=r.sourceFormat;return e===cr||e===jr}var In,Pn,Rn,d1,p1,uT=function(){function r(e,t){var a=ty(e)?e:ey(e);this._source=a;var n=this._data=a.data;a.sourceFormat===Ja&&(this._offset=0,this._dimSize=t,this._data=n),p1(this,n,a)}return r.prototype.getSource=function(){return this._source},r.prototype.count=function(){return 0},r.prototype.getItem=function(e,t){},r.prototype.appendData=function(e){},r.prototype.clean=function(){},r.protoInitialize=function(){var e=r.prototype;e.pure=!1,e.persistent=!0}(),r.internalField=function(){var e;p1=function(o,s,l){var u=l.sourceFormat,f=l.seriesLayoutBy,h=l.startIndex,v=l.dimensionsDefine,c=d1[ry(u,f)];if(V(o,c),u===Ja)o.getItem=t,o.count=n,o.fillStorage=a;else{var d=fT(u,f);o.getItem=Y(d,null,s,h,v);var p=hT(u,f);o.count=Y(p,null,s,h,v)}};var t=function(o,s){o=o-this._offset,s=s||[];for(var l=this._data,u=this._dimSize,f=u*o,h=0;h<u;h++)s[h]=l[f+h];return s},a=function(o,s,l,u){for(var f=this._data,h=this._dimSize,v=0;v<h;v++){for(var c=u[v],d=c[0]==null?1/0:c[0],p=c[1]==null?-1/0:c[1],g=s-o,y=l[v],m=0;m<g;m++){var _=f[m*h+v];y[o+m]=_,_<d&&(d=_),_>p&&(p=_)}c[0]=d,c[1]=p}},n=function(){return this._data?this._data.length/this._dimSize:0};d1=(e={},e[xe+\"_\"+Yr]={pure:!0,appendData:i},e[xe+\"_\"+Eo]={pure:!0,appendData:function(){throw new Error('Do not support appendData when set seriesLayoutBy: \"row\".')}},e[cr]={pure:!0,appendData:i},e[jr]={pure:!0,appendData:function(o){var s=this._data;A(o,function(l,u){for(var f=s[u]||(s[u]=[]),h=0;h<(l||[]).length;h++)f.push(l[h])})}},e[vr]={appendData:i},e[Ja]={persistent:!1,pure:!0,appendData:function(o){this._data=o},clean:function(){this._offset+=this.count(),this._data=null}},e);function i(o){for(var s=0;s<o.length;s++)this._data.push(o[s])}}(),r}(),g1=function(r,e,t,a){return r[a]},MO=(In={},In[xe+\"_\"+Yr]=function(r,e,t,a){return r[a+e]},In[xe+\"_\"+Eo]=function(r,e,t,a,n){a+=e;for(var i=n||[],o=r,s=0;s<o.length;s++){var l=o[s];i[s]=l?l[a]:null}return i},In[cr]=g1,In[jr]=function(r,e,t,a,n){for(var i=n||[],o=0;o<t.length;o++){var s=t[o].name,l=r[s];i[o]=l?l[a]:null}return i},In[vr]=g1,In);function fT(r,e){var t=MO[ry(r,e)];return t}var y1=function(r,e,t){return r.length},LO=(Pn={},Pn[xe+\"_\"+Yr]=function(r,e,t){return Math.max(0,r.length-e)},Pn[xe+\"_\"+Eo]=function(r,e,t){var a=r[0];return a?Math.max(0,a.length-e):0},Pn[cr]=y1,Pn[jr]=function(r,e,t){var a=t[0].name,n=r[a];return n?n.length:0},Pn[vr]=y1,Pn);function hT(r,e){var t=LO[ry(r,e)];return t}var $v=function(r,e,t){return r[e]},IO=(Rn={},Rn[xe]=$v,Rn[cr]=function(r,e,t){return r[t]},Rn[jr]=$v,Rn[vr]=function(r,e,t){var a=Co(r);return a instanceof Array?a[e]:a},Rn[Ja]=$v,Rn);function vT(r){var e=IO[r];return e}function ry(r,e){return r===xe?r+\"_\"+e:r}function vo(r,e,t){if(!!r){var a=r.getRawDataItem(e);if(a!=null){var n=r.getStore(),i=n.getSource().sourceFormat;if(t!=null){var o=r.getDimensionIndex(t),s=n.getDimensionProperty(o);return vT(i)(a,o,s)}else{var l=a;return i===vr&&(l=Co(a)),l}}}}var PO=/\\{@(.+?)\\}/g,ay=function(){function r(){}return r.prototype.getDataParams=function(e,t){var a=this.getData(t),n=this.getRawValue(e,t),i=a.getRawIndex(e),o=a.getName(e),s=a.getRawDataItem(e),l=a.getItemVisual(e,\"style\"),u=l&&l[a.getItemVisual(e,\"drawType\")||\"fill\"],f=l&&l.stroke,h=this.mainType,v=h===\"series\",c=a.userOutput&&a.userOutput.get();return{componentType:h,componentSubType:this.subType,componentIndex:this.componentIndex,seriesType:v?this.subType:null,seriesIndex:this.seriesIndex,seriesId:v?this.id:null,seriesName:v?this.name:null,name:o,dataIndex:i,data:s,dataType:t,value:n,color:u,borderColor:f,dimensionNames:c?c.fullDimensions:null,encode:c?c.encode:null,$vars:[\"seriesName\",\"name\",\"value\"]}},r.prototype.getFormattedLabel=function(e,t,a,n,i,o){t=t||\"normal\";var s=this.getData(a),l=this.getDataParams(e,a);if(o&&(l.value=o.interpolatedValue),n!=null&&F(l.value)&&(l.value=l.value[n]),!i){var u=s.getItemModel(e);i=u.get(t===\"normal\"?[\"label\",\"formatter\"]:[t,\"label\",\"formatter\"])}if(J(i))return l.status=t,l.dimensionIndex=n,i(l);if(U(i)){var f=UC(i,l);return f.replace(PO,function(h,v){var c=v.length,d=v;d.charAt(0)===\"[\"&&d.charAt(c-1)===\"]\"&&(d=+d.slice(1,c-1));var p=vo(s,e,d);if(o&&F(o.interpolatedValue)){var g=s.getDimensionIndex(d);g>=0&&(p=o.interpolatedValue[g])}return p!=null?p+\"\":\"\"})}},r.prototype.getRawValue=function(e,t){return vo(this.getData(t),e)},r.prototype.formatTooltip=function(e,t,a){},r}();function m1(r){var e,t;return et(r)?r.type&&(t=r):e=r,{text:e,frag:t}}function ks(r){return new RO(r)}var RO=function(){function r(e){e=e||{},this._reset=e.reset,this._plan=e.plan,this._count=e.count,this._onDirty=e.onDirty,this._dirty=!0}return r.prototype.perform=function(e){var t=this._upstream,a=e&&e.skip;if(this._dirty&&t){var n=this.context;n.data=n.outputData=t.context.outputData}this.__pipeline&&(this.__pipeline.currentTask=this);var i;this._plan&&!a&&(i=this._plan(this.context));var o=f(this._modBy),s=this._modDataCount||0,l=f(e&&e.modBy),u=e&&e.modDataCount||0;(o!==l||s!==u)&&(i=\"reset\");function f(m){return!(m>=1)&&(m=1),m}var h;(this._dirty||i===\"reset\")&&(this._dirty=!1,h=this._doReset(a)),this._modBy=l,this._modDataCount=u;var v=e&&e.step;if(t?this._dueEnd=t._outputDueEnd:this._dueEnd=this._count?this._count(this.context):1/0,this._progress){var c=this._dueIndex,d=Math.min(v!=null?this._dueIndex+v:1/0,this._dueEnd);if(!a&&(h||c<d)){var p=this._progress;if(F(p))for(var g=0;g<p.length;g++)this._doProgress(p[g],c,d,l,u);else this._doProgress(p,c,d,l,u)}this._dueIndex=d;var y=this._settedOutputEnd!=null?this._settedOutputEnd:d;this._outputDueEnd=y}else this._dueIndex=this._outputDueEnd=this._settedOutputEnd!=null?this._settedOutputEnd:this._dueEnd;return this.unfinished()},r.prototype.dirty=function(){this._dirty=!0,this._onDirty&&this._onDirty(this.context)},r.prototype._doProgress=function(e,t,a,n,i){_1.reset(t,a,n,i),this._callingProgress=e,this._callingProgress({start:t,end:a,count:a-t,next:_1.next},this.context)},r.prototype._doReset=function(e){this._dueIndex=this._outputDueEnd=this._dueEnd=0,this._settedOutputEnd=null;var t,a;!e&&this._reset&&(t=this._reset(this.context),t&&t.progress&&(a=t.forceFirstProgress,t=t.progress),F(t)&&!t.length&&(t=null)),this._progress=t,this._modBy=this._modDataCount=null;var n=this._downstream;return n&&n.dirty(),a},r.prototype.unfinished=function(){return this._progress&&this._dueIndex<this._dueEnd},r.prototype.pipe=function(e){(this._downstream!==e||this._dirty)&&(this._downstream=e,e._upstream=this,e.dirty())},r.prototype.dispose=function(){this._disposed||(this._upstream&&(this._upstream._downstream=null),this._downstream&&(this._downstream._upstream=null),this._dirty=!1,this._disposed=!0)},r.prototype.getUpstream=function(){return this._upstream},r.prototype.getDownstream=function(){return this._downstream},r.prototype.setOutputEnd=function(e){this._outputDueEnd=this._settedOutputEnd=e},r}(),_1=function(){var r,e,t,a,n,i={reset:function(l,u,f,h){e=l,r=u,t=f,a=h,n=Math.ceil(a/t),i.next=t>1&&a>0?s:o}};return i;function o(){return e<r?e++:null}function s(){var l=e%n*t+Math.ceil(e/n),u=e>=r?null:l<a?l:e;return e++,u}}();function Qa(r,e){var t=e&&e.type;return t===\"ordinal\"?r:(t===\"time\"&&!Mt(r)&&r!=null&&r!==\"-\"&&(r=+Kr(r)),r==null||r===\"\"?NaN:+r)}var EO=q({number:function(r){return parseFloat(r)},time:function(r){return+Kr(r)},trim:function(r){return U(r)?Sr(r):r}});function cT(r){return EO.get(r)}var dT={lt:function(r,e){return r<e},lte:function(r,e){return r<=e},gt:function(r,e){return r>e},gte:function(r,e){return r>=e}},kO=function(){function r(e,t){if(!Mt(t)){var a=\"\";Pt(a)}this._opFn=dT[e],this._rvalFloat=ma(t)}return r.prototype.evaluate=function(e){return Mt(e)?this._opFn(e,this._rvalFloat):this._opFn(ma(e),this._rvalFloat)},r}(),pT=function(){function r(e,t){var a=e===\"desc\";this._resultLT=a?1:-1,t==null&&(t=a?\"min\":\"max\"),this._incomparable=t===\"min\"?-1/0:1/0}return r.prototype.evaluate=function(e,t){var a=Mt(e)?e:ma(e),n=Mt(t)?t:ma(t),i=isNaN(a),o=isNaN(n);if(i&&(a=this._incomparable),o&&(n=this._incomparable),i&&o){var s=U(e),l=U(t);s&&(a=l?e:0),l&&(n=s?t:0)}return a<n?this._resultLT:a>n?-this._resultLT:0},r}(),OO=function(){function r(e,t){this._rval=t,this._isEQ=e,this._rvalTypeof=typeof t,this._rvalFloat=ma(t)}return r.prototype.evaluate=function(e){var t=e===this._rval;if(!t){var a=typeof e;a!==this._rvalTypeof&&(a===\"number\"||this._rvalTypeof===\"number\")&&(t=ma(e)===this._rvalFloat)}return this._isEQ?t:!t},r}();function BO(r,e){return r===\"eq\"||r===\"ne\"?new OO(r===\"eq\",e):Z(dT,r)?new kO(r,e):null}var NO=function(){function r(){}return r.prototype.getRawData=function(){throw new Error(\"not supported\")},r.prototype.getRawDataItem=function(e){throw new Error(\"not supported\")},r.prototype.cloneRawData=function(){},r.prototype.getDimensionInfo=function(e){},r.prototype.cloneAllDimensionInfo=function(){},r.prototype.count=function(){},r.prototype.retrieveValue=function(e,t){},r.prototype.retrieveValueFromItem=function(e,t){},r.prototype.convertValue=function(e,t){return Qa(e,t)},r}();function VO(r,e){var t=new NO,a=r.data,n=t.sourceFormat=r.sourceFormat,i=r.startIndex,o=\"\";r.seriesLayoutBy!==Yr&&Pt(o);var s=[],l={},u=r.dimensionsDefine;if(u)A(u,function(p,g){var y=p.name,m={index:g,name:y,displayName:p.displayName};if(s.push(m),y!=null){var _=\"\";Z(l,y)&&Pt(_),l[y]=m}});else for(var f=0;f<r.dimensionsDetectedCount;f++)s.push({index:f});var h=fT(n,Yr);e.__isBuiltIn&&(t.getRawDataItem=function(p){return h(a,i,s,p)},t.getRawData=Y(zO,null,r)),t.cloneRawData=Y(FO,null,r);var v=hT(n,Yr);t.count=Y(v,null,a,i,s);var c=vT(n);t.retrieveValue=function(p,g){var y=h(a,i,s,p);return d(y,g)};var d=t.retrieveValueFromItem=function(p,g){if(p!=null){var y=s[g];if(y)return c(p,g,y.name)}};return t.getDimensionInfo=Y(GO,null,s,l),t.cloneAllDimensionInfo=Y(HO,null,s),t}function zO(r){var e=r.sourceFormat;if(!ny(e)){var t=\"\";Pt(t)}return r.data}function FO(r){var e=r.sourceFormat,t=r.data;if(!ny(e)){var a=\"\";Pt(a)}if(e===xe){for(var n=[],i=0,o=t.length;i<o;i++)n.push(t[i].slice());return n}else if(e===cr){for(var n=[],i=0,o=t.length;i<o;i++)n.push(V({},t[i]));return n}}function GO(r,e,t){if(t!=null){if(Mt(t)||!isNaN(t)&&!Z(e,t))return r[t];if(Z(e,t))return e[t]}}function HO(r){return at(r)}var gT=q();function WO(r){r=at(r);var e=r.type,t=\"\";e||Pt(t);var a=e.split(\":\");a.length!==2&&Pt(t);var n=!1;a[0]===\"echarts\"&&(e=a[1],n=!0),r.__isBuiltIn=n,gT.set(e,r)}function $O(r,e,t){var a=kt(r),n=a.length,i=\"\";n||Pt(i);for(var o=0,s=n;o<s;o++){var l=a[o];e=UO(l,e),o!==s-1&&(e.length=Math.max(e.length,1))}return e}function UO(r,e,t,a){var n=\"\";e.length||Pt(n),et(r)||Pt(n);var i=r.type,o=gT.get(i);o||Pt(n);var s=G(e,function(u){return VO(u,o)}),l=kt(o.transform({upstream:s[0],upstreamList:s,config:at(r.config)}));return G(l,function(u,f){var h=\"\";et(u)||Pt(h),u.data||Pt(h);var v=sT(u.data);ny(v)||Pt(h);var c,d=e[0];if(d&&f===0&&!u.dimensions){var p=d.startIndex;p&&(u.data=d.data.slice(0,p).concat(u.data)),c={seriesLayoutBy:Yr,sourceHeader:p,dimensions:d.metaRawOption.dimensions}}else c={seriesLayoutBy:Yr,sourceHeader:0,dimensions:u.dimensions};return fp(u.data,c,null)})}function ny(r){return r===xe||r===cr}var Bh=\"undefined\",YO=typeof Uint32Array===Bh?Array:Uint32Array,ZO=typeof Uint16Array===Bh?Array:Uint16Array,yT=typeof Int32Array===Bh?Array:Int32Array,S1=typeof Float64Array===Bh?Array:Float64Array,mT={float:S1,int:yT,ordinal:Array,number:Array,time:S1},Uv;function Xo(r){return r>65535?YO:ZO}function Vi(){return[1/0,-1/0]}function XO(r){var e=r.constructor;return e===Array?r.slice():new e(r)}function x1(r,e,t,a,n){var i=mT[t||\"float\"];if(n){var o=r[e],s=o&&o.length;if(s!==a){for(var l=new i(a),u=0;u<s;u++)l[u]=o[u];r[e]=l}}else r[e]=new i(a)}var hp=function(){function r(){this._chunks=[],this._rawExtent=[],this._extent=[],this._count=0,this._rawCount=0,this._calcDimNameToIdx=q()}return r.prototype.initData=function(e,t,a){this._provider=e,this._chunks=[],this._indices=null,this.getRawIndex=this._getRawIdxIdentity;var n=e.getSource(),i=this.defaultDimValueGetter=Uv[n.sourceFormat];this._dimValueGetter=a||i,this._rawExtent=[],lT(n),this._dimensions=G(t,function(o){return{type:o.type,property:o.property}}),this._initDataFromProvider(0,e.count())},r.prototype.getProvider=function(){return this._provider},r.prototype.getSource=function(){return this._provider.getSource()},r.prototype.ensureCalculationDimension=function(e,t){var a=this._calcDimNameToIdx,n=this._dimensions,i=a.get(e);if(i!=null){if(n[i].type===t)return i}else i=n.length;return n[i]={type:t},a.set(e,i),this._chunks[i]=new mT[t||\"float\"](this._rawCount),this._rawExtent[i]=Vi(),i},r.prototype.collectOrdinalMeta=function(e,t){var a=this._chunks[e],n=this._dimensions[e],i=this._rawExtent,o=n.ordinalOffset||0,s=a.length;o===0&&(i[e]=Vi());for(var l=i[e],u=o;u<s;u++){var f=a[u]=t.parseAndCollect(a[u]);isNaN(f)||(l[0]=Math.min(f,l[0]),l[1]=Math.max(f,l[1]))}n.ordinalMeta=t,n.ordinalOffset=s,n.type=\"ordinal\"},r.prototype.getOrdinalMeta=function(e){var t=this._dimensions[e],a=t.ordinalMeta;return a},r.prototype.getDimensionProperty=function(e){var t=this._dimensions[e];return t&&t.property},r.prototype.appendData=function(e){var t=this._provider,a=this.count();t.appendData(e);var n=t.count();return t.persistent||(n+=a),a<n&&this._initDataFromProvider(a,n,!0),[a,n]},r.prototype.appendValues=function(e,t){for(var a=this._chunks,n=this._dimensions,i=n.length,o=this._rawExtent,s=this.count(),l=s+Math.max(e.length,t||0),u=0;u<i;u++){var f=n[u];x1(a,u,f.type,l,!0)}for(var h=[],v=s;v<l;v++)for(var c=v-s,d=0;d<i;d++){var f=n[d],p=Uv.arrayRows.call(this,e[c]||h,f.property,c,d);a[d][v]=p;var g=o[d];p<g[0]&&(g[0]=p),p>g[1]&&(g[1]=p)}return this._rawCount=this._count=l,{start:s,end:l}},r.prototype._initDataFromProvider=function(e,t,a){for(var n=this._provider,i=this._chunks,o=this._dimensions,s=o.length,l=this._rawExtent,u=G(o,function(m){return m.property}),f=0;f<s;f++){var h=o[f];l[f]||(l[f]=Vi()),x1(i,f,h.type,t,a)}if(n.fillStorage)n.fillStorage(e,t,i,l);else for(var v=[],c=e;c<t;c++){v=n.getItem(c,v);for(var d=0;d<s;d++){var p=i[d],g=this._dimValueGetter(v,u[d],c,d);p[c]=g;var y=l[d];g<y[0]&&(y[0]=g),g>y[1]&&(y[1]=g)}}!n.persistent&&n.clean&&n.clean(),this._rawCount=this._count=t,this._extent=[]},r.prototype.count=function(){return this._count},r.prototype.get=function(e,t){if(!(t>=0&&t<this._count))return NaN;var a=this._chunks[e];return a?a[this.getRawIndex(t)]:NaN},r.prototype.getValues=function(e,t){var a=[],n=[];if(t==null){t=e,e=[];for(var i=0;i<this._dimensions.length;i++)n.push(i)}else n=e;for(var i=0,o=n.length;i<o;i++)a.push(this.get(n[i],t));return a},r.prototype.getByRawIndex=function(e,t){if(!(t>=0&&t<this._rawCount))return NaN;var a=this._chunks[e];return a?a[t]:NaN},r.prototype.getSum=function(e){var t=this._chunks[e],a=0;if(t)for(var n=0,i=this.count();n<i;n++){var o=this.get(e,n);isNaN(o)||(a+=o)}return a},r.prototype.getMedian=function(e){var t=[];this.each([e],function(i){isNaN(i)||t.push(i)});var a=t.sort(function(i,o){return i-o}),n=this.count();return n===0?0:n%2===1?a[(n-1)/2]:(a[n/2]+a[n/2-1])/2},r.prototype.indexOfRawIndex=function(e){if(e>=this._rawCount||e<0)return-1;if(!this._indices)return e;var t=this._indices,a=t[e];if(a!=null&&a<this._count&&a===e)return e;for(var n=0,i=this._count-1;n<=i;){var o=(n+i)/2|0;if(t[o]<e)n=o+1;else if(t[o]>e)i=o-1;else return o}return-1},r.prototype.indicesOfNearest=function(e,t,a){var n=this._chunks,i=n[e],o=[];if(!i)return o;a==null&&(a=1/0);for(var s=1/0,l=-1,u=0,f=0,h=this.count();f<h;f++){var v=this.getRawIndex(f),c=t-i[v],d=Math.abs(c);d<=a&&((d<s||d===s&&c>=0&&l<0)&&(s=d,l=c,u=0),c===l&&(o[u++]=f))}return o.length=u,o},r.prototype.getIndices=function(){var e,t=this._indices;if(t){var a=t.constructor,n=this._count;if(a===Array){e=new a(n);for(var i=0;i<n;i++)e[i]=t[i]}else e=new a(t.buffer,0,n)}else{var a=Xo(this._rawCount);e=new a(this.count());for(var i=0;i<e.length;i++)e[i]=i}return e},r.prototype.filter=function(e,t){if(!this._count)return this;for(var a=this.clone(),n=a.count(),i=Xo(a._rawCount),o=new i(n),s=[],l=e.length,u=0,f=e[0],h=a._chunks,v=0;v<n;v++){var c=void 0,d=a.getRawIndex(v);if(l===0)c=t(v);else if(l===1){var p=h[f][d];c=t(p,v)}else{for(var g=0;g<l;g++)s[g]=h[e[g]][d];s[g]=v,c=t.apply(null,s)}c&&(o[u++]=d)}return u<n&&(a._indices=o),a._count=u,a._extent=[],a._updateGetRawIdx(),a},r.prototype.selectRange=function(e){var t=this.clone(),a=t._count;if(!a)return this;var n=St(e),i=n.length;if(!i)return this;var o=t.count(),s=Xo(t._rawCount),l=new s(o),u=0,f=n[0],h=e[f][0],v=e[f][1],c=t._chunks,d=!1;if(!t._indices){var p=0;if(i===1){for(var g=c[n[0]],y=0;y<a;y++){var m=g[y];(m>=h&&m<=v||isNaN(m))&&(l[u++]=p),p++}d=!0}else if(i===2){for(var g=c[n[0]],_=c[n[1]],S=e[n[1]][0],w=e[n[1]][1],y=0;y<a;y++){var m=g[y],x=_[y];(m>=h&&m<=v||isNaN(m))&&(x>=S&&x<=w||isNaN(x))&&(l[u++]=p),p++}d=!0}}if(!d)if(i===1)for(var y=0;y<o;y++){var b=t.getRawIndex(y),m=c[n[0]][b];(m>=h&&m<=v||isNaN(m))&&(l[u++]=b)}else for(var y=0;y<o;y++){for(var C=!0,b=t.getRawIndex(y),T=0;T<i;T++){var D=n[T],m=c[D][b];(m<e[D][0]||m>e[D][1])&&(C=!1)}C&&(l[u++]=t.getRawIndex(y))}return u<o&&(t._indices=l),t._count=u,t._extent=[],t._updateGetRawIdx(),t},r.prototype.map=function(e,t){var a=this.clone(e);return this._updateDims(a,e,t),a},r.prototype.modify=function(e,t){this._updateDims(this,e,t)},r.prototype._updateDims=function(e,t,a){for(var n=e._chunks,i=[],o=t.length,s=e.count(),l=[],u=e._rawExtent,f=0;f<t.length;f++)u[t[f]]=Vi();for(var h=0;h<s;h++){for(var v=e.getRawIndex(h),c=0;c<o;c++)l[c]=n[t[c]][v];l[o]=h;var d=a&&a.apply(null,l);if(d!=null){typeof d!=\"object\"&&(i[0]=d,d=i);for(var f=0;f<d.length;f++){var p=t[f],g=d[f],y=u[p],m=n[p];m&&(m[v]=g),g<y[0]&&(y[0]=g),g>y[1]&&(y[1]=g)}}}},r.prototype.lttbDownSample=function(e,t){var a=this.clone([e],!0),n=a._chunks,i=n[e],o=this.count(),s=0,l=Math.floor(1/t),u=this.getRawIndex(0),f,h,v,c=new(Xo(this._rawCount))(Math.min((Math.ceil(o/l)+2)*2,o));c[s++]=u;for(var d=1;d<o-1;d+=l){for(var p=Math.min(d+l,o-1),g=Math.min(d+l*2,o),y=(g+p)/2,m=0,_=p;_<g;_++){var S=this.getRawIndex(_),w=i[S];isNaN(w)||(m+=w)}m/=g-p;var x=d,b=Math.min(d+l,o),C=d-1,T=i[u];f=-1,v=x;for(var D=-1,M=0,_=x;_<b;_++){var S=this.getRawIndex(_),w=i[S];if(isNaN(w)){M++,D<0&&(D=S);continue}h=Math.abs((C-y)*(w-T)-(C-_)*(m-T)),h>f&&(f=h,v=S)}M>0&&M<b-x&&(c[s++]=Math.min(D,v),v=Math.max(D,v)),c[s++]=v,u=v}return c[s++]=this.getRawIndex(o-1),a._count=s,a._indices=c,a.getRawIndex=this._getRawIdx,a},r.prototype.downSample=function(e,t,a,n){for(var i=this.clone([e],!0),o=i._chunks,s=[],l=Math.floor(1/t),u=o[e],f=this.count(),h=i._rawExtent[e]=Vi(),v=new(Xo(this._rawCount))(Math.ceil(f/l)),c=0,d=0;d<f;d+=l){l>f-d&&(l=f-d,s.length=l);for(var p=0;p<l;p++){var g=this.getRawIndex(d+p);s[p]=u[g]}var y=a(s),m=this.getRawIndex(Math.min(d+n(s,y)||0,f-1));u[m]=y,y<h[0]&&(h[0]=y),y>h[1]&&(h[1]=y),v[c++]=m}return i._count=c,i._indices=v,i._updateGetRawIdx(),i},r.prototype.each=function(e,t){if(!!this._count)for(var a=e.length,n=this._chunks,i=0,o=this.count();i<o;i++){var s=this.getRawIndex(i);switch(a){case 0:t(i);break;case 1:t(n[e[0]][s],i);break;case 2:t(n[e[0]][s],n[e[1]][s],i);break;default:for(var l=0,u=[];l<a;l++)u[l]=n[e[l]][s];u[l]=i,t.apply(null,u)}}},r.prototype.getDataExtent=function(e){var t=this._chunks[e],a=Vi();if(!t)return a;var n=this.count(),i=!this._indices,o;if(i)return this._rawExtent[e].slice();if(o=this._extent[e],o)return o.slice();o=a;for(var s=o[0],l=o[1],u=0;u<n;u++){var f=this.getRawIndex(u),h=t[f];h<s&&(s=h),h>l&&(l=h)}return o=[s,l],this._extent[e]=o,o},r.prototype.getRawDataItem=function(e){var t=this.getRawIndex(e);if(this._provider.persistent)return this._provider.getItem(t);for(var a=[],n=this._chunks,i=0;i<n.length;i++)a.push(n[i][t]);return a},r.prototype.clone=function(e,t){var a=new r,n=this._chunks,i=e&&Zr(e,function(s,l){return s[l]=!0,s},{});if(i)for(var o=0;o<n.length;o++)a._chunks[o]=i[o]?XO(n[o]):n[o];else a._chunks=n;return this._copyCommonProps(a),t||(a._indices=this._cloneIndices()),a._updateGetRawIdx(),a},r.prototype._copyCommonProps=function(e){e._count=this._count,e._rawCount=this._rawCount,e._provider=this._provider,e._dimensions=this._dimensions,e._extent=at(this._extent),e._rawExtent=at(this._rawExtent)},r.prototype._cloneIndices=function(){if(this._indices){var e=this._indices.constructor,t=void 0;if(e===Array){var a=this._indices.length;t=new e(a);for(var n=0;n<a;n++)t[n]=this._indices[n]}else t=new e(this._indices);return t}return null},r.prototype._getRawIdxIdentity=function(e){return e},r.prototype._getRawIdx=function(e){return e<this._count&&e>=0?this._indices[e]:-1},r.prototype._updateGetRawIdx=function(){this.getRawIndex=this._indices?this._getRawIdx:this._getRawIdxIdentity},r.internalField=function(){function e(t,a,n,i){return Qa(t[i],this._dimensions[i])}Uv={arrayRows:e,objectRows:function(t,a,n,i){return Qa(t[a],this._dimensions[i])},keyedColumns:e,original:function(t,a,n,i){var o=t&&(t.value==null?t:t.value);return Qa(o instanceof Array?o[i]:o,this._dimensions[i])},typedArray:function(t,a,n,i){return t[i]}}}(),r}(),_T=function(){function r(e){this._sourceList=[],this._storeList=[],this._upstreamSignList=[],this._versionSignBase=0,this._dirty=!0,this._sourceHost=e}return r.prototype.dirty=function(){this._setLocalSource([],[]),this._storeList=[],this._dirty=!0},r.prototype._setLocalSource=function(e,t){this._sourceList=e,this._upstreamSignList=t,this._versionSignBase++,this._versionSignBase>9e10&&(this._versionSignBase=0)},r.prototype._getVersionSign=function(){return this._sourceHost.uid+\"_\"+this._versionSignBase},r.prototype.prepareSource=function(){this._isDirty()&&(this._createSource(),this._dirty=!1)},r.prototype._createSource=function(){this._setLocalSource([],[]);var e=this._sourceHost,t=this._getUpstreamSourceManagers(),a=!!t.length,n,i;if(lu(e)){var o=e,s=void 0,l=void 0,u=void 0;if(a){var f=t[0];f.prepareSource(),u=f.getSource(),s=u.data,l=u.sourceFormat,i=[f._getVersionSign()]}else s=o.get(\"data\",!0),l=Ue(s)?Ja:vr,i=[];var h=this._getSourceMetaRawOption()||{},v=u&&u.metaRawOption||{},c=ft(h.seriesLayoutBy,v.seriesLayoutBy)||null,d=ft(h.sourceHeader,v.sourceHeader),p=ft(h.dimensions,v.dimensions),g=c!==v.seriesLayoutBy||!!d!=!!v.sourceHeader||p;n=g?[fp(s,{seriesLayoutBy:c,sourceHeader:d,dimensions:p},l)]:[]}else{var y=e;if(a){var m=this._applyTransform(t);n=m.sourceList,i=m.upstreamSignList}else{var _=y.get(\"source\",!0);n=[fp(_,this._getSourceMetaRawOption(),null)],i=[]}}this._setLocalSource(n,i)},r.prototype._applyTransform=function(e){var t=this._sourceHost,a=t.get(\"transform\",!0),n=t.get(\"fromTransformResult\",!0);if(n!=null){var i=\"\";e.length!==1&&b1(i)}var o,s=[],l=[];return A(e,function(u){u.prepareSource();var f=u.getSource(n||0),h=\"\";n!=null&&!f&&b1(h),s.push(f),l.push(u._getVersionSign())}),a?o=$O(a,s,{datasetIndex:t.componentIndex}):n!=null&&(o=[TO(s[0])]),{sourceList:o,upstreamSignList:l}},r.prototype._isDirty=function(){if(this._dirty)return!0;for(var e=this._getUpstreamSourceManagers(),t=0;t<e.length;t++){var a=e[t];if(a._isDirty()||this._upstreamSignList[t]!==a._getVersionSign())return!0}},r.prototype.getSource=function(e){e=e||0;var t=this._sourceList[e];if(!t){var a=this._getUpstreamSourceManagers();return a[0]&&a[0].getSource(e)}return t},r.prototype.getSharedDataStore=function(e){var t=e.makeStoreSchema();return this._innerGetDataStore(t.dimensions,e.source,t.hash)},r.prototype._innerGetDataStore=function(e,t,a){var n=0,i=this._storeList,o=i[n];o||(o=i[n]={});var s=o[a];if(!s){var l=this._getUpstreamSourceManagers()[0];lu(this._sourceHost)&&l?s=l._innerGetDataStore(e,t,a):(s=new hp,s.initData(new uT(t,e.length),e)),o[a]=s}return s},r.prototype._getUpstreamSourceManagers=function(){var e=this._sourceHost;if(lu(e)){var t=Qg(e);return t?[t.getSourceManager()]:[]}else return G(J3(e),function(a){return a.getSourceManager()})},r.prototype._getSourceMetaRawOption=function(){var e=this._sourceHost,t,a,n;if(lu(e))t=e.get(\"seriesLayoutBy\",!0),a=e.get(\"sourceHeader\",!0),n=e.get(\"dimensions\",!0);else if(!this._getUpstreamSourceManagers().length){var i=e;t=i.get(\"seriesLayoutBy\",!0),a=i.get(\"sourceHeader\",!0),n=i.get(\"dimensions\",!0)}return{seriesLayoutBy:t,sourceHeader:a,dimensions:n}},r}();function w1(r){var e=r.option.transform;e&&pf(r.option.transform)}function lu(r){return r.mainType===\"series\"}function b1(r){throw new Error(r)}var ST=\"line-height:1\";function xT(r,e){var t=r.color||\"#6e7079\",a=r.fontSize||12,n=r.fontWeight||\"400\",i=r.color||\"#464646\",o=r.fontSize||14,s=r.fontWeight||\"900\";return e===\"html\"?{nameStyle:\"font-size:\"+ke(a+\"\")+\"px;color:\"+ke(t)+\";font-weight:\"+ke(n+\"\"),valueStyle:\"font-size:\"+ke(o+\"\")+\"px;color:\"+ke(i)+\";font-weight:\"+ke(s+\"\")}:{nameStyle:{fontSize:a,fill:t,fontWeight:n},valueStyle:{fontSize:o,fill:i,fontWeight:s}}}var qO=[0,10,20,30],KO=[\"\",`\n`,`\n\n`,`\n\n\n`];function oe(r,e){return e.type=r,e}function vp(r){return r.type===\"section\"}function wT(r){return vp(r)?JO:QO}function bT(r){if(vp(r)){var e=0,t=r.blocks.length,a=t>1||t>0&&!r.noHeader;return A(r.blocks,function(n){var i=bT(n);i>=e&&(e=i+ +(a&&(!i||vp(n)&&!n.noHeader)))}),e}return 0}function JO(r,e,t,a){var n=e.noHeader,i=jO(bT(e)),o=[],s=e.blocks||[];Me(!s||F(s)),s=s||[];var l=r.orderMode;if(e.sortBlocks&&l){s=s.slice();var u={valueAsc:\"asc\",valueDesc:\"desc\"};if(Z(u,l)){var f=new pT(u[l],null);s.sort(function(d,p){return f.evaluate(d.sortParam,p.sortParam)})}else l===\"seriesDesc\"&&s.reverse()}A(s,function(d,p){var g=e.valueFormatter,y=wT(d)(g?V(V({},r),{valueFormatter:g}):r,d,p>0?i.html:0,a);y!=null&&o.push(y)});var h=r.renderMode===\"richText\"?o.join(i.richText):cp(o.join(\"\"),n?t:i.html);if(n)return h;var v=sp(e.header,\"ordinal\",r.useUTC),c=xT(a,r.renderMode).nameStyle;return r.renderMode===\"richText\"?CT(r,v,c)+i.richText+h:cp('<div style=\"'+c+\";\"+ST+';\">'+ke(v)+\"</div>\"+h,t)}function QO(r,e,t,a){var n=r.renderMode,i=e.noName,o=e.noValue,s=!e.markerType,l=e.name,u=r.useUTC,f=e.valueFormatter||r.valueFormatter||function(S){return S=F(S)?S:[S],G(S,function(w,x){return sp(w,F(c)?c[x]:c,u)})};if(!(i&&o)){var h=s?\"\":r.markupStyleCreator.makeTooltipMarker(e.markerType,e.markerColor||\"#333\",n),v=i?\"\":sp(l,\"ordinal\",u),c=e.valueType,d=o?[]:f(e.value),p=!s||!i,g=!s&&i,y=xT(a,n),m=y.nameStyle,_=y.valueStyle;return n===\"richText\"?(s?\"\":h)+(i?\"\":CT(r,v,m))+(o?\"\":r4(r,d,p,g,_)):cp((s?\"\":h)+(i?\"\":t4(v,!s,m))+(o?\"\":e4(d,p,g,_)),t)}}function C1(r,e,t,a,n,i){if(!!r){var o=wT(r),s={useUTC:n,renderMode:t,orderMode:a,markupStyleCreator:e,valueFormatter:r.valueFormatter};return o(s,r,0,i)}}function jO(r){return{html:qO[r],richText:KO[r]}}function cp(r,e){var t='<div style=\"clear:both\"></div>',a=\"margin: \"+e+\"px 0 0\";return'<div style=\"'+a+\";\"+ST+';\">'+r+t+\"</div>\"}function t4(r,e,t){var a=e?\"margin-left:2px\":\"\";return'<span style=\"'+t+\";\"+a+'\">'+ke(r)+\"</span>\"}function e4(r,e,t,a){var n=t?\"10px\":\"20px\",i=e?\"float:right;margin-left:\"+n:\"\";return r=F(r)?r:[r],'<span style=\"'+i+\";\"+a+'\">'+G(r,function(o){return ke(o)}).join(\"&nbsp;&nbsp;\")+\"</span>\"}function CT(r,e,t){return r.markupStyleCreator.wrapRichTextStyle(e,t)}function r4(r,e,t,a,n){var i=[n],o=a?10:20;return t&&i.push({padding:[0,0,0,o],align:\"right\"}),r.markupStyleCreator.wrapRichTextStyle(F(e)?e.join(\"  \"):e,i)}function TT(r,e){var t=r.getData().getItemVisual(e,\"style\"),a=t[r.visualDrawType];return yi(a)}function AT(r,e){var t=r.get(\"padding\");return t!=null?t:e===\"richText\"?[8,10]:10}var Yv=function(){function r(){this.richTextStyles={},this._nextStyleNameId=C2()}return r.prototype._generateStyleName=function(){return\"__EC_aUTo_\"+this._nextStyleNameId++},r.prototype.makeTooltipMarker=function(e,t,a){var n=a===\"richText\"?this._generateStyleName():null,i=$3({color:t,type:e,renderMode:a,markerId:n});return U(i)?i:(this.richTextStyles[n]=i.style,i.content)},r.prototype.wrapRichTextStyle=function(e,t){var a={};F(t)?A(t,function(i){return V(a,i)}):V(a,t);var n=this._generateStyleName();return this.richTextStyles[n]=a,\"{\"+n+\"|\"+e+\"}\"},r}();function DT(r){var e=r.series,t=r.dataIndex,a=r.multipleSeries,n=e.getData(),i=n.mapDimensionsAll(\"defaultedTooltip\"),o=i.length,s=e.getRawValue(t),l=F(s),u=TT(e,t),f,h,v,c;if(o>1||l&&!o){var d=a4(s,e,t,i,u);f=d.inlineValues,h=d.inlineValueTypes,v=d.blocks,c=d.inlineValues[0]}else if(o){var p=n.getDimensionInfo(i[0]);c=f=vo(n,t,i[0]),h=p.type}else c=f=l?s[0]:s;var g=Ig(e),y=g&&e.name||\"\",m=n.getName(t),_=a?y:m;return oe(\"section\",{header:y,noHeader:a||!g,sortParam:c,blocks:[oe(\"nameValue\",{markerType:\"item\",markerColor:u,name:_,noName:!Sr(_),value:f,valueType:h})].concat(v||[])})}function a4(r,e,t,a,n){var i=e.getData(),o=Zr(r,function(h,v,c){var d=i.getDimensionInfo(c);return h=h||d&&d.tooltip!==!1&&d.displayName!=null},!1),s=[],l=[],u=[];a.length?A(a,function(h){f(vo(i,t,h),h)}):A(r,f);function f(h,v){var c=i.getDimensionInfo(v);!c||c.otherDims.tooltip===!1||(o?u.push(oe(\"nameValue\",{markerType:\"subItem\",markerColor:n,name:c.displayName,value:h,valueType:c.type})):(s.push(h),l.push(c.type)))}return{inlineValues:s,inlineValueTypes:l,blocks:u}}var Pa=Ct();function uu(r,e){return r.getName(e)||r.getId(e)}var sf=\"__universalTransitionEnabled\",Nh=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t._selectedDataIndicesMap={},t}return e.prototype.init=function(t,a,n){this.seriesIndex=this.componentIndex,this.dataTask=ks({count:i4,reset:o4}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(t,n);var i=Pa(this).sourceManager=new _T(this);i.prepareSource();var o=this.getInitialData(t,n);A1(o,this),this.dataTask.context.data=o,Pa(this).dataBeforeProcessed=o,T1(this),this._initSelectedMapFromData(o)},e.prototype.mergeDefaultAndTheme=function(t,a){var n=tl(this),i=n?Po(t):{},o=this.subType;Tt.hasClass(o)&&(o+=\"Series\"),ht(t,a.getTheme().get(this.subType)),ht(t,this.getDefaultOption()),ci(t,\"label\",[\"show\"]),this.fillDataTextStyle(t.data),n&&an(t,i,n)},e.prototype.mergeOption=function(t,a){t=ht(this.option,t,!0),this.fillDataTextStyle(t.data);var n=tl(this);n&&an(this.option,t,n);var i=Pa(this).sourceManager;i.dirty(),i.prepareSource();var o=this.getInitialData(t,a);A1(o,this),this.dataTask.dirty(),this.dataTask.context.data=o,Pa(this).dataBeforeProcessed=o,T1(this),this._initSelectedMapFromData(o)},e.prototype.fillDataTextStyle=function(t){if(t&&!Ue(t))for(var a=[\"show\"],n=0;n<t.length;n++)t[n]&&t[n].label&&ci(t[n],\"label\",a)},e.prototype.getInitialData=function(t,a){},e.prototype.appendData=function(t){var a=this.getRawData();a.appendData(t.data)},e.prototype.getData=function(t){var a=dp(this);if(a){var n=a.context.data;return t==null?n:n.getLinkedData(t)}else return Pa(this).data},e.prototype.getAllData=function(){var t=this.getData();return t&&t.getLinkedDataAll?t.getLinkedDataAll():[{data:t}]},e.prototype.setData=function(t){var a=dp(this);if(a){var n=a.context;n.outputData=t,a!==this.dataTask&&(n.data=t)}Pa(this).data=t},e.prototype.getEncode=function(){var t=this.get(\"encode\",!0);if(t)return q(t)},e.prototype.getSourceManager=function(){return Pa(this).sourceManager},e.prototype.getSource=function(){return this.getSourceManager().getSource()},e.prototype.getRawData=function(){return Pa(this).dataBeforeProcessed},e.prototype.getColorBy=function(){var t=this.get(\"colorBy\");return t||\"series\"},e.prototype.isColorBySeries=function(){return this.getColorBy()===\"series\"},e.prototype.getBaseAxis=function(){var t=this.coordinateSystem;return t&&t.getBaseAxis&&t.getBaseAxis()},e.prototype.formatTooltip=function(t,a,n){return DT({series:this,dataIndex:t,multipleSeries:a})},e.prototype.isAnimationEnabled=function(){var t=this.ecModel;if(At.node&&!(t&&t.ssr))return!1;var a=this.getShallow(\"animation\");return a&&this.getData().count()>this.getShallow(\"animationThreshold\")&&(a=!1),!!a},e.prototype.restoreData=function(){this.dataTask.dirty()},e.prototype.getColorFromPalette=function(t,a,n){var i=this.ecModel,o=jg.prototype.getColorFromPalette.call(this,t,a,n);return o||(o=i.getColorFromPalette(t,a,n)),o},e.prototype.coordDimToDataDim=function(t){return this.getRawData().mapDimensionsAll(t)},e.prototype.getProgressive=function(){return this.get(\"progressive\")},e.prototype.getProgressiveThreshold=function(){return this.get(\"progressiveThreshold\")},e.prototype.select=function(t,a){this._innerSelect(this.getData(a),t)},e.prototype.unselect=function(t,a){var n=this.option.selectedMap;if(!!n){var i=this.option.selectedMode,o=this.getData(a);if(i===\"series\"||n===\"all\"){this.option.selectedMap={},this._selectedDataIndicesMap={};return}for(var s=0;s<t.length;s++){var l=t[s],u=uu(o,l);n[u]=!1,this._selectedDataIndicesMap[u]=-1}}},e.prototype.toggleSelect=function(t,a){for(var n=[],i=0;i<t.length;i++)n[0]=t[i],this.isSelected(t[i],a)?this.unselect(n,a):this.select(n,a)},e.prototype.getSelectedDataIndices=function(){if(this.option.selectedMap===\"all\")return[].slice.call(this.getData().getIndices());for(var t=this._selectedDataIndicesMap,a=St(t),n=[],i=0;i<a.length;i++){var o=t[a[i]];o>=0&&n.push(o)}return n},e.prototype.isSelected=function(t,a){var n=this.option.selectedMap;if(!n)return!1;var i=this.getData(a);return(n===\"all\"||n[uu(i,t)])&&!i.getItemModel(t).get([\"select\",\"disabled\"])},e.prototype.isUniversalTransitionEnabled=function(){if(this[sf])return!0;var t=this.option.universalTransition;return t?t===!0?!0:t&&t.enabled:!1},e.prototype._innerSelect=function(t,a){var n,i,o=this.option,s=o.selectedMode,l=a.length;if(!(!s||!l)){if(s===\"series\")o.selectedMap=\"all\";else if(s===\"multiple\"){et(o.selectedMap)||(o.selectedMap={});for(var u=o.selectedMap,f=0;f<l;f++){var h=a[f],v=uu(t,h);u[v]=!0,this._selectedDataIndicesMap[v]=t.getRawIndex(h)}}else if(s===\"single\"||s===!0){var c=a[l-1],v=uu(t,c);o.selectedMap=(n={},n[v]=!0,n),this._selectedDataIndicesMap=(i={},i[v]=t.getRawIndex(c),i)}}},e.prototype._initSelectedMapFromData=function(t){if(!this.option.selectedMap){var a=[];t.hasItemOption&&t.each(function(n){var i=t.getRawDataItem(n);i&&i.selected&&a.push(n)}),a.length>0&&this._innerSelect(t,a)}},e.registerClass=function(t){return Tt.registerClass(t)},e.protoInitialize=function(){var t=e.prototype;t.type=\"series.__base__\",t.seriesIndex=0,t.ignoreStyleOnData=!1,t.hasSymbolVisual=!1,t.defaultSymbol=\"circle\",t.visualStyleAccessPath=\"itemStyle\",t.visualDrawType=\"fill\"}(),e}(Tt);te(Nh,ay);te(Nh,jg);E2(Nh,Tt);function T1(r){var e=r.name;Ig(r)||(r.name=n4(r)||e)}function n4(r){var e=r.getRawData(),t=e.mapDimensionsAll(\"seriesName\"),a=[];return A(t,function(n){var i=e.getDimensionInfo(n);i.displayName&&a.push(i.displayName)}),a.join(\" \")}function i4(r){return r.model.getRawData().count()}function o4(r){var e=r.model;return e.setData(e.getRawData().cloneShallow()),s4}function s4(r,e){e.outputData&&r.end>e.outputData.count()&&e.model.getRawData().cloneShallow(e.outputData)}function A1(r,e){A(gf(r.CHANGABLE_METHODS,r.DOWNSAMPLE_METHODS),function(t){r.wrapMethod(t,ot(l4,e))})}function l4(r,e){var t=dp(r);return t&&t.setOutputEnd((e||this).count()),e}function dp(r){var e=(r.ecModel||{}).scheduler,t=e&&e.getPipeline(r.uid);if(t){var a=t.currentTask;if(a){var n=a.agentStubMap;n&&(a=n.get(r.uid))}return a}}var Ht=Nh,iy=function(){function r(){this.group=new nt,this.uid=Lo(\"viewComponent\")}return r.prototype.init=function(e,t){},r.prototype.render=function(e,t,a,n){},r.prototype.dispose=function(e,t){},r.prototype.updateView=function(e,t,a,n){},r.prototype.updateLayout=function(e,t,a,n){},r.prototype.updateVisual=function(e,t,a,n){},r.prototype.toggleBlurSeries=function(e,t,a){},r.prototype.eachRendered=function(e){var t=this.group;t&&t.traverse(e)},r}();Rg(iy);mh(iy);var Ut=iy;function ko(){var r=Ct();return function(e){var t=r(e),a=e.pipelineContext,n=!!t.large,i=!!t.progressiveRender,o=t.large=!!(a&&a.large),s=t.progressiveRender=!!(a&&a.progressiveRender);return(n!==o||i!==s)&&\"reset\"}}var MT=Ct(),u4=ko(),oy=function(){function r(){this.group=new nt,this.uid=Lo(\"viewChart\"),this.renderTask=ks({plan:f4,reset:h4}),this.renderTask.context={view:this}}return r.prototype.init=function(e,t){},r.prototype.render=function(e,t,a,n){},r.prototype.highlight=function(e,t,a,n){var i=e.getData(n&&n.dataType);!i||M1(i,n,\"emphasis\")},r.prototype.downplay=function(e,t,a,n){var i=e.getData(n&&n.dataType);!i||M1(i,n,\"normal\")},r.prototype.remove=function(e,t){this.group.removeAll()},r.prototype.dispose=function(e,t){},r.prototype.updateView=function(e,t,a,n){this.render(e,t,a,n)},r.prototype.updateLayout=function(e,t,a,n){this.render(e,t,a,n)},r.prototype.updateVisual=function(e,t,a,n){this.render(e,t,a,n)},r.prototype.eachRendered=function(e){vn(this.group,e)},r.markUpdateMethod=function(e,t){MT(e).updateMethod=t},r.protoInitialize=function(){var e=r.prototype;e.type=\"chart\"}(),r}();function D1(r,e,t){r&&Ks(r)&&(e===\"emphasis\"?_a:Sa)(r,t)}function M1(r,e,t){var a=di(r,e),n=e&&e.highlightKey!=null?N5(e.highlightKey):null;a!=null?A(kt(a),function(i){D1(r.getItemGraphicEl(i),t,n)}):r.eachItemGraphicEl(function(i){D1(i,t,n)})}Rg(oy);mh(oy);function f4(r){return u4(r.model)}function h4(r){var e=r.model,t=r.ecModel,a=r.api,n=r.payload,i=e.pipelineContext.progressiveRender,o=r.view,s=n&&MT(n).updateMethod,l=i?\"incrementalPrepareRender\":s&&o[s]?s:\"render\";return l!==\"render\"&&o[l](e,t,a,n),v4[l]}var v4={incrementalPrepareRender:{progress:function(r,e){e.view.incrementalRender(r,e.model,e.ecModel,e.api,e.payload)}},render:{forceFirstProgress:!0,progress:function(r,e){e.view.render(e.model,e.ecModel,e.api,e.payload)}}},zt=oy,Ef=\"\\0__throttleOriginMethod\",L1=\"\\0__throttleRate\",I1=\"\\0__throttleType\";function sy(r,e,t){var a,n=0,i=0,o=null,s,l,u,f;e=e||0;function h(){i=new Date().getTime(),o=null,r.apply(l,u||[])}var v=function(){for(var c=[],d=0;d<arguments.length;d++)c[d]=arguments[d];a=new Date().getTime(),l=this,u=c;var p=f||e,g=f||t;f=null,s=a-(g?n:i)-p,clearTimeout(o),g?o=setTimeout(h,p):s>=0?h():o=setTimeout(h,-s),n=a};return v.clear=function(){o&&(clearTimeout(o),o=null)},v.debounceNextCall=function(c){f=c},v}function Oo(r,e,t,a){var n=r[e];if(!!n){var i=n[Ef]||n,o=n[I1],s=n[L1];if(s!==t||o!==a){if(t==null||!a)return r[e]=i;n=r[e]=sy(i,t,a===\"debounce\"),n[Ef]=i,n[I1]=a,n[L1]=t}return n}}function rl(r,e){var t=r[e];t&&t[Ef]&&(t.clear&&t.clear(),r[e]=t[Ef])}var P1=Ct(),R1={itemStyle:pi(RC,!0),lineStyle:pi(PC,!0)},c4={lineStyle:\"stroke\",itemStyle:\"fill\"};function LT(r,e){var t=r.visualStyleMapper||R1[e];return t||(console.warn(\"Unknown style type '\"+e+\"'.\"),R1.itemStyle)}function IT(r,e){var t=r.visualDrawType||c4[e];return t||(console.warn(\"Unknown style type '\"+e+\"'.\"),\"fill\")}var d4={createOnAllSeries:!0,performRawSeries:!0,reset:function(r,e){var t=r.getData(),a=r.visualStyleAccessPath||\"itemStyle\",n=r.getModel(a),i=LT(r,a),o=i(n),s=n.getShallow(\"decal\");s&&(t.setVisual(\"decal\",s),s.dirty=!0);var l=IT(r,a),u=o[l],f=J(u)?u:null,h=o.fill===\"auto\"||o.stroke===\"auto\";if(!o[l]||f||h){var v=r.getColorFromPalette(r.name,null,e.getSeriesCount());o[l]||(o[l]=v,t.setVisual(\"colorFromPalette\",!0)),o.fill=o.fill===\"auto\"||J(o.fill)?v:o.fill,o.stroke=o.stroke===\"auto\"||J(o.stroke)?v:o.stroke}if(t.setVisual(\"style\",o),t.setVisual(\"drawType\",l),!e.isSeriesFiltered(r)&&f)return t.setVisual(\"colorFromPalette\",!1),{dataEach:function(c,d){var p=r.getDataParams(d),g=V({},o);g[l]=f(p),c.setItemVisual(d,\"style\",g)}}}},qo=new Vt,p4={createOnAllSeries:!0,performRawSeries:!0,reset:function(r,e){if(!(r.ignoreStyleOnData||e.isSeriesFiltered(r))){var t=r.getData(),a=r.visualStyleAccessPath||\"itemStyle\",n=LT(r,a),i=t.getVisual(\"drawType\");return{dataEach:t.hasItemOption?function(o,s){var l=o.getRawDataItem(s);if(l&&l[a]){qo.option=l[a];var u=n(qo),f=o.ensureUniqueItemVisual(s,\"style\");V(f,u),qo.option.decal&&(o.setItemVisual(s,\"decal\",qo.option.decal),qo.option.decal.dirty=!0),i in u&&o.setItemVisual(s,\"colorFromPalette\",!1)}}:null}}}},g4={performRawSeries:!0,overallReset:function(r){var e=q();r.eachSeries(function(t){var a=t.getColorBy();if(!t.isColorBySeries()){var n=t.type+\"-\"+a,i=e.get(n);i||(i={},e.set(n,i)),P1(t).scope=i}}),r.eachSeries(function(t){if(!(t.isColorBySeries()||r.isSeriesFiltered(t))){var a=t.getRawData(),n={},i=t.getData(),o=P1(t).scope,s=t.visualStyleAccessPath||\"itemStyle\",l=IT(t,s);i.each(function(u){var f=i.getRawIndex(u);n[f]=u}),a.each(function(u){var f=n[u],h=i.getItemVisual(f,\"colorFromPalette\");if(h){var v=i.ensureUniqueItemVisual(f,\"style\"),c=a.getName(u)||u+\"\",d=a.count();v[l]=t.getColorFromPalette(c,o,d)}})}})}},fu=Math.PI;function y4(r,e){e=e||{},tt(e,{text:\"loading\",textColor:\"#000\",fontSize:12,fontWeight:\"normal\",fontStyle:\"normal\",fontFamily:\"sans-serif\",maskColor:\"rgba(255, 255, 255, 0.8)\",showSpinner:!0,color:\"#5470c6\",spinnerRadius:10,lineWidth:5,zlevel:0});var t=new nt,a=new bt({style:{fill:e.maskColor},zlevel:e.zlevel,z:1e4});t.add(a);var n=new Dt({style:{text:e.text,fill:e.textColor,fontSize:e.fontSize,fontWeight:e.fontWeight,fontStyle:e.fontStyle,fontFamily:e.fontFamily},zlevel:e.zlevel,z:10001}),i=new bt({style:{fill:\"none\"},textContent:n,textConfig:{position:\"right\",distance:10},zlevel:e.zlevel,z:10001});t.add(i);var o;return e.showSpinner&&(o=new Gg({shape:{startAngle:-fu/2,endAngle:-fu/2+.1,r:e.spinnerRadius},style:{stroke:e.color,lineCap:\"round\",lineWidth:e.lineWidth},zlevel:e.zlevel,z:10001}),o.animateShape(!0).when(1e3,{endAngle:fu*3/2}).start(\"circularInOut\"),o.animateShape(!0).when(1e3,{startAngle:fu*3/2}).delay(300).start(\"circularInOut\"),t.add(o)),t.resize=function(){var s=n.getBoundingRect().width,l=e.showSpinner?e.spinnerRadius:0,u=(r.getWidth()-l*2-(e.showSpinner&&s?10:0)-s)/2-(e.showSpinner&&s?0:5+s/2)+(e.showSpinner?0:s/2)+(s?0:l),f=r.getHeight()/2;e.showSpinner&&o.setShape({cx:u,cy:f}),i.setShape({x:u-l,y:f-l,width:l*2,height:l*2}),a.setShape({x:0,y:0,width:r.getWidth(),height:r.getHeight()})},t.resize(),t}var m4=function(){function r(e,t,a,n){this._stageTaskMap=q(),this.ecInstance=e,this.api=t,a=this._dataProcessorHandlers=a.slice(),n=this._visualHandlers=n.slice(),this._allHandlers=a.concat(n)}return r.prototype.restoreData=function(e,t){e.restoreData(t),this._stageTaskMap.each(function(a){var n=a.overallTask;n&&n.dirty()})},r.prototype.getPerformArgs=function(e,t){if(!!e.__pipeline){var a=this._pipelineMap.get(e.__pipeline.id),n=a.context,i=!t&&a.progressiveEnabled&&(!n||n.progressiveRender)&&e.__idxInPipeline>a.blockIndex,o=i?a.step:null,s=n&&n.modDataCount,l=s!=null?Math.ceil(s/o):null;return{step:o,modBy:l,modDataCount:s}}},r.prototype.getPipeline=function(e){return this._pipelineMap.get(e)},r.prototype.updateStreamModes=function(e,t){var a=this._pipelineMap.get(e.uid),n=e.getData(),i=n.count(),o=a.progressiveEnabled&&t.incrementalPrepareRender&&i>=a.threshold,s=e.get(\"large\")&&i>=e.get(\"largeThreshold\"),l=e.get(\"progressiveChunkMode\")===\"mod\"?i:null;e.pipelineContext=a.context={progressiveRender:o,modDataCount:l,large:s}},r.prototype.restorePipelines=function(e){var t=this,a=t._pipelineMap=q();e.eachSeries(function(n){var i=n.getProgressive(),o=n.uid;a.set(o,{id:o,head:null,tail:null,threshold:n.getProgressiveThreshold(),progressiveEnabled:i&&!(n.preventIncremental&&n.preventIncremental()),blockIndex:-1,step:Math.round(i||700),count:0}),t._pipe(n,n.dataTask)})},r.prototype.prepareStageTasks=function(){var e=this._stageTaskMap,t=this.api.getModel(),a=this.api;A(this._allHandlers,function(n){var i=e.get(n.uid)||e.set(n.uid,{}),o=\"\";Me(!(n.reset&&n.overallReset),o),n.reset&&this._createSeriesStageTask(n,i,t,a),n.overallReset&&this._createOverallStageTask(n,i,t,a)},this)},r.prototype.prepareView=function(e,t,a,n){var i=e.renderTask,o=i.context;o.model=t,o.ecModel=a,o.api=n,i.__block=!e.incrementalPrepareRender,this._pipe(t,i)},r.prototype.performDataProcessorTasks=function(e,t){this._performStageTasks(this._dataProcessorHandlers,e,t,{block:!0})},r.prototype.performVisualTasks=function(e,t,a){this._performStageTasks(this._visualHandlers,e,t,a)},r.prototype._performStageTasks=function(e,t,a,n){n=n||{};var i=!1,o=this;A(e,function(l,u){if(!(n.visualType&&n.visualType!==l.visualType)){var f=o._stageTaskMap.get(l.uid),h=f.seriesTaskMap,v=f.overallTask;if(v){var c,d=v.agentStubMap;d.each(function(g){s(n,g)&&(g.dirty(),c=!0)}),c&&v.dirty(),o.updatePayload(v,a);var p=o.getPerformArgs(v,n.block);d.each(function(g){g.perform(p)}),v.perform(p)&&(i=!0)}else h&&h.each(function(g,y){s(n,g)&&g.dirty();var m=o.getPerformArgs(g,n.block);m.skip=!l.performRawSeries&&t.isSeriesFiltered(g.context.model),o.updatePayload(g,a),g.perform(m)&&(i=!0)})}});function s(l,u){return l.setDirty&&(!l.dirtyMap||l.dirtyMap.get(u.__pipeline.id))}this.unfinished=i||this.unfinished},r.prototype.performSeriesTasks=function(e){var t;e.eachSeries(function(a){t=a.dataTask.perform()||t}),this.unfinished=t||this.unfinished},r.prototype.plan=function(){this._pipelineMap.each(function(e){var t=e.tail;do{if(t.__block){e.blockIndex=t.__idxInPipeline;break}t=t.getUpstream()}while(t)})},r.prototype.updatePayload=function(e,t){t!==\"remain\"&&(e.context.payload=t)},r.prototype._createSeriesStageTask=function(e,t,a,n){var i=this,o=t.seriesTaskMap,s=t.seriesTaskMap=q(),l=e.seriesType,u=e.getTargetSeries;e.createOnAllSeries?a.eachRawSeries(f):l?a.eachRawSeriesByType(l,f):u&&u(a,n).each(f);function f(h){var v=h.uid,c=s.set(v,o&&o.get(v)||ks({plan:b4,reset:C4,count:A4}));c.context={model:h,ecModel:a,api:n,useClearVisual:e.isVisual&&!e.isLayout,plan:e.plan,reset:e.reset,scheduler:i},i._pipe(h,c)}},r.prototype._createOverallStageTask=function(e,t,a,n){var i=this,o=t.overallTask=t.overallTask||ks({reset:_4});o.context={ecModel:a,api:n,overallReset:e.overallReset,scheduler:i};var s=o.agentStubMap,l=o.agentStubMap=q(),u=e.seriesType,f=e.getTargetSeries,h=!0,v=!1,c=\"\";Me(!e.createOnAllSeries,c),u?a.eachRawSeriesByType(u,d):f?f(a,n).each(d):(h=!1,A(a.getSeries(),d));function d(p){var g=p.uid,y=l.set(g,s&&s.get(g)||(v=!0,ks({reset:S4,onDirty:w4})));y.context={model:p,overallProgress:h},y.agent=o,y.__block=h,i._pipe(p,y)}v&&o.dirty()},r.prototype._pipe=function(e,t){var a=e.uid,n=this._pipelineMap.get(a);!n.head&&(n.head=t),n.tail&&n.tail.pipe(t),n.tail=t,t.__idxInPipeline=n.count++,t.__pipeline=n},r.wrapStageHandler=function(e,t){return J(e)&&(e={overallReset:e,seriesType:D4(e)}),e.uid=Lo(\"stageHandler\"),t&&(e.visualType=t),e},r}();function _4(r){r.overallReset(r.ecModel,r.api,r.payload)}function S4(r){return r.overallProgress&&x4}function x4(){this.agent.dirty(),this.getDownstream().dirty()}function w4(){this.agent&&this.agent.dirty()}function b4(r){return r.plan?r.plan(r.model,r.ecModel,r.api,r.payload):null}function C4(r){r.useClearVisual&&r.data.clearAllVisual();var e=r.resetDefines=kt(r.reset(r.model,r.ecModel,r.api,r.payload));return e.length>1?G(e,function(t,a){return PT(a)}):T4}var T4=PT(0);function PT(r){return function(e,t){var a=t.data,n=t.resetDefines[r];if(n&&n.dataEach)for(var i=e.start;i<e.end;i++)n.dataEach(a,i);else n&&n.progress&&n.progress(e,a)}}function A4(r){return r.data.count()}function D4(r){kf=null;try{r(al,RT)}catch(e){}return kf}var al={},RT={},kf;ET(al,aT);ET(RT,nT);al.eachSeriesByType=al.eachRawSeriesByType=function(r){kf=r};al.eachComponent=function(r){r.mainType===\"series\"&&r.subType&&(kf=r.subType)};function ET(r,e){for(var t in e.prototype)r[t]=Kt}var kT=m4,E1=[\"#37A2DA\",\"#32C5E9\",\"#67E0E3\",\"#9FE6B8\",\"#FFDB5C\",\"#ff9f7f\",\"#fb7293\",\"#E062AE\",\"#E690D1\",\"#e7bcf3\",\"#9d96f5\",\"#8378EA\",\"#96BFFF\"],M4={color:E1,colorLayer:[[\"#37A2DA\",\"#ffd85c\",\"#fd7b5f\"],[\"#37A2DA\",\"#67E0E3\",\"#FFDB5C\",\"#ff9f7f\",\"#E062AE\",\"#9d96f5\"],[\"#37A2DA\",\"#32C5E9\",\"#9FE6B8\",\"#FFDB5C\",\"#ff9f7f\",\"#fb7293\",\"#e7bcf3\",\"#8378EA\",\"#96BFFF\"],E1]},be=\"#B9B8CE\",k1=\"#100C2A\",hu=function(){return{axisLine:{lineStyle:{color:be}},splitLine:{lineStyle:{color:\"#484753\"}},splitArea:{areaStyle:{color:[\"rgba(255,255,255,0.02)\",\"rgba(255,255,255,0.05)\"]}},minorSplitLine:{lineStyle:{color:\"#20203B\"}}}},O1=[\"#4992ff\",\"#7cffb2\",\"#fddd60\",\"#ff6e76\",\"#58d9f9\",\"#05c091\",\"#ff8a45\",\"#8d48e3\",\"#dd79ff\"],OT={darkMode:!0,color:O1,backgroundColor:k1,axisPointer:{lineStyle:{color:\"#817f91\"},crossStyle:{color:\"#817f91\"},label:{color:\"#fff\"}},legend:{textStyle:{color:be}},textStyle:{color:be},title:{textStyle:{color:\"#EEF1FA\"},subtextStyle:{color:\"#B9B8CE\"}},toolbox:{iconStyle:{borderColor:be}},dataZoom:{borderColor:\"#71708A\",textStyle:{color:be},brushStyle:{color:\"rgba(135,163,206,0.3)\"},handleStyle:{color:\"#353450\",borderColor:\"#C5CBE3\"},moveHandleStyle:{color:\"#B0B6C3\",opacity:.3},fillerColor:\"rgba(135,163,206,0.2)\",emphasis:{handleStyle:{borderColor:\"#91B7F2\",color:\"#4D587D\"},moveHandleStyle:{color:\"#636D9A\",opacity:.7}},dataBackground:{lineStyle:{color:\"#71708A\",width:1},areaStyle:{color:\"#71708A\"}},selectedDataBackground:{lineStyle:{color:\"#87A3CE\"},areaStyle:{color:\"#87A3CE\"}}},visualMap:{textStyle:{color:be}},timeline:{lineStyle:{color:be},label:{color:be},controlStyle:{color:be,borderColor:be}},calendar:{itemStyle:{color:k1},dayLabel:{color:be},monthLabel:{color:be},yearLabel:{color:be}},timeAxis:hu(),logAxis:hu(),valueAxis:hu(),categoryAxis:hu(),line:{symbol:\"circle\"},graph:{color:O1},gauge:{title:{color:be},axisLine:{lineStyle:{color:[[1,\"rgba(207,212,219,0.2)\"]]}},axisLabel:{color:be},detail:{color:\"#EEF1FA\"}},candlestick:{itemStyle:{color:\"#f64e56\",color0:\"#54ea92\",borderColor:\"#f64e56\",borderColor0:\"#54ea92\"}}};OT.categoryAxis.splitLine.show=!1;var L4=OT,I4=function(){function r(){}return r.prototype.normalizeQuery=function(e){var t={},a={},n={};if(U(e)){var i=Hr(e);t.mainType=i.main||null,t.subType=i.sub||null}else{var o=[\"Index\",\"Name\",\"Id\"],s={name:1,dataIndex:1,dataType:1};A(e,function(l,u){for(var f=!1,h=0;h<o.length;h++){var v=o[h],c=u.lastIndexOf(v);if(c>0&&c===u.length-v.length){var d=u.slice(0,c);d!==\"data\"&&(t.mainType=d,t[v.toLowerCase()]=l,f=!0)}}s.hasOwnProperty(u)&&(a[u]=l,f=!0),f||(n[u]=l)})}return{cptQuery:t,dataQuery:a,otherQuery:n}},r.prototype.filter=function(e,t){var a=this.eventInfo;if(!a)return!0;var n=a.targetEl,i=a.packedEvent,o=a.model,s=a.view;if(!o||!s)return!0;var l=t.cptQuery,u=t.dataQuery;return f(l,o,\"mainType\")&&f(l,o,\"subType\")&&f(l,o,\"index\",\"componentIndex\")&&f(l,o,\"name\")&&f(l,o,\"id\")&&f(u,i,\"name\")&&f(u,i,\"dataIndex\")&&f(u,i,\"dataType\")&&(!s.filterForExposedEvent||s.filterForExposedEvent(e,t.otherQuery,n,i));function f(h,v,c,d){return h[c]==null||v[d||c]===h[c]}},r.prototype.afterTrigger=function(){this.eventInfo=null},r}(),pp=[\"symbol\",\"symbolSize\",\"symbolRotate\",\"symbolOffset\"],B1=pp.concat([\"symbolKeepAspect\"]),P4={createOnAllSeries:!0,performRawSeries:!0,reset:function(r,e){var t=r.getData();if(r.legendIcon&&t.setVisual(\"legendIcon\",r.legendIcon),!r.hasSymbolVisual)return;for(var a={},n={},i=!1,o=0;o<pp.length;o++){var s=pp[o],l=r.get(s);J(l)?(i=!0,n[s]=l):a[s]=l}if(a.symbol=a.symbol||r.defaultSymbol,t.setVisual(V({legendIcon:r.legendIcon||a.symbol,symbolKeepAspect:r.get(\"symbolKeepAspect\")},a)),e.isSeriesFiltered(r))return;var u=St(n);function f(h,v){for(var c=r.getRawValue(v),d=r.getDataParams(v),p=0;p<u.length;p++){var g=u[p];h.setItemVisual(v,g,n[g](c,d))}}return{dataEach:i?f:null}}},R4={createOnAllSeries:!0,performRawSeries:!0,reset:function(r,e){if(!r.hasSymbolVisual||e.isSeriesFiltered(r))return;var t=r.getData();function a(n,i){for(var o=n.getItemModel(i),s=0;s<B1.length;s++){var l=B1[s],u=o.getShallow(l,!0);u!=null&&n.setItemVisual(i,l,u)}}return{dataEach:t.hasItemOption?a:null}}};function ly(r,e,t){switch(t){case\"color\":var a=r.getItemVisual(e,\"style\");return a[r.getVisual(\"drawType\")];case\"opacity\":return r.getItemVisual(e,\"style\").opacity;case\"symbol\":case\"symbolSize\":case\"liftZ\":return r.getItemVisual(e,t)}}function Ll(r,e){switch(e){case\"color\":var t=r.getVisual(\"style\");return t[r.getVisual(\"drawType\")];case\"opacity\":return r.getVisual(\"style\").opacity;case\"symbol\":case\"symbolSize\":case\"liftZ\":return r.getVisual(e)}}function BT(r,e,t,a){switch(t){case\"color\":var n=r.ensureUniqueItemVisual(e,\"style\");n[r.getVisual(\"drawType\")]=a,r.setItemVisual(e,\"colorFromPalette\",!1);break;case\"opacity\":r.ensureUniqueItemVisual(e,\"style\").opacity=a;break;case\"symbol\":case\"symbolSize\":case\"liftZ\":r.setItemVisual(e,t,a);break}}function NT(r,e){function t(a,n){var i=[];return a.eachComponent({mainType:\"series\",subType:r,query:n},function(o){i.push(o.seriesIndex)}),i}A([[r+\"ToggleSelect\",\"toggleSelect\"],[r+\"Select\",\"select\"],[r+\"UnSelect\",\"unselect\"]],function(a){e(a[0],function(n,i,o){n=V({},n),o.dispatchAction(V(n,{type:a[1],seriesIndex:t(i,n)}))})})}function zi(r,e,t,a,n){var i=r+e;t.isSilent(i)||a.eachComponent({mainType:\"series\",subType:\"pie\"},function(o){for(var s=o.seriesIndex,l=o.option.selectedMap,u=n.selected,f=0;f<u.length;f++)if(u[f].seriesIndex===s){var h=o.getData(),v=di(h,n.fromActionPayload);t.trigger(i,{type:i,seriesId:o.id,name:F(v)?h.getName(v[0]):h.getName(v),selected:U(l)?l:V({},l)})}})}function E4(r,e,t){r.on(\"selectchanged\",function(a){var n=t.getModel();a.isFromClick?(zi(\"map\",\"selectchanged\",e,n,a),zi(\"pie\",\"selectchanged\",e,n,a)):a.fromAction===\"select\"?(zi(\"map\",\"selected\",e,n,a),zi(\"pie\",\"selected\",e,n,a)):a.fromAction===\"unselect\"&&(zi(\"map\",\"unselected\",e,n,a),zi(\"pie\",\"unselected\",e,n,a))})}function jn(r,e,t){for(var a;r&&!(e(r)&&(a=r,t));)r=r.__hostTarget||r.parent;return a}var k4=Math.round(Math.random()*9),O4=typeof Object.defineProperty==\"function\",B4=function(){function r(){this._id=\"__ec_inner_\"+k4++}return r.prototype.get=function(e){return this._guard(e)[this._id]},r.prototype.set=function(e,t){var a=this._guard(e);return O4?Object.defineProperty(a,this._id,{value:t,enumerable:!1,configurable:!0}):a[this._id]=t,this},r.prototype.delete=function(e){return this.has(e)?(delete this._guard(e)[this._id],!0):!1},r.prototype.has=function(e){return!!this._guard(e)[this._id]},r.prototype._guard=function(e){if(e!==Object(e))throw TypeError(\"Value of WeakMap is not a non-null object.\");return e},r}(),N4=B4,V4=mt.extend({type:\"triangle\",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(r,e){var t=e.cx,a=e.cy,n=e.width/2,i=e.height/2;r.moveTo(t,a-i),r.lineTo(t+n,a+i),r.lineTo(t-n,a+i),r.closePath()}}),z4=mt.extend({type:\"diamond\",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(r,e){var t=e.cx,a=e.cy,n=e.width/2,i=e.height/2;r.moveTo(t,a-i),r.lineTo(t+n,a),r.lineTo(t,a+i),r.lineTo(t-n,a),r.closePath()}}),F4=mt.extend({type:\"pin\",shape:{x:0,y:0,width:0,height:0},buildPath:function(r,e){var t=e.x,a=e.y,n=e.width/5*3,i=Math.max(n,e.height),o=n/2,s=o*o/(i-o),l=a-i+o+s,u=Math.asin(s/o),f=Math.cos(u)*o,h=Math.sin(u),v=Math.cos(u),c=o*.6,d=o*.7;r.moveTo(t-f,l+s),r.arc(t,l,o,Math.PI-u,Math.PI*2+u),r.bezierCurveTo(t+f-h*c,l+s+v*c,t,a-d,t,a),r.bezierCurveTo(t,a-d,t-f+h*c,l+s+v*c,t-f,l+s),r.closePath()}}),G4=mt.extend({type:\"arrow\",shape:{x:0,y:0,width:0,height:0},buildPath:function(r,e){var t=e.height,a=e.width,n=e.x,i=e.y,o=a/3*2;r.moveTo(n,i),r.lineTo(n+o,i+t),r.lineTo(n,i+t/4*3),r.lineTo(n-o,i+t),r.lineTo(n,i),r.closePath()}}),H4={line:ue,rect:bt,roundRect:bt,square:bt,circle:Qr,diamond:z4,pin:F4,arrow:G4,triangle:V4},W4={line:function(r,e,t,a,n){n.x1=r,n.y1=e+a/2,n.x2=r+t,n.y2=e+a/2},rect:function(r,e,t,a,n){n.x=r,n.y=e,n.width=t,n.height=a},roundRect:function(r,e,t,a,n){n.x=r,n.y=e,n.width=t,n.height=a,n.r=Math.min(t,a)/4},square:function(r,e,t,a,n){var i=Math.min(t,a);n.x=r,n.y=e,n.width=i,n.height=i},circle:function(r,e,t,a,n){n.cx=r+t/2,n.cy=e+a/2,n.r=Math.min(t,a)/2},diamond:function(r,e,t,a,n){n.cx=r+t/2,n.cy=e+a/2,n.width=t,n.height=a},pin:function(r,e,t,a,n){n.x=r+t/2,n.y=e+a/2,n.width=t,n.height=a},arrow:function(r,e,t,a,n){n.x=r+t/2,n.y=e+a/2,n.width=t,n.height=a},triangle:function(r,e,t,a,n){n.cx=r+t/2,n.cy=e+a/2,n.width=t,n.height=a}},Of={};A(H4,function(r,e){Of[e]=new r});var $4=mt.extend({type:\"symbol\",shape:{symbolType:\"\",x:0,y:0,width:0,height:0},calculateTextPosition:function(r,e,t){var a=bf(r,e,t),n=this.shape;return n&&n.symbolType===\"pin\"&&e.position===\"inside\"&&(a.y=t.y+t.height*.4),a},buildPath:function(r,e,t){var a=e.symbolType;if(a!==\"none\"){var n=Of[a];n||(a=\"rect\",n=Of[a]),W4[a](e.x,e.y,e.width,e.height,n.shape),n.buildPath(r,n.shape,t)}}});function U4(r,e){if(this.type!==\"image\"){var t=this.style;this.__isEmptyBrush?(t.stroke=r,t.fill=e||\"#fff\",t.lineWidth=2):this.shape.symbolType===\"line\"?t.stroke=r:t.fill=r,this.markRedraw()}}function jt(r,e,t,a,n,i,o){var s=r.indexOf(\"empty\")===0;s&&(r=r.substr(5,1).toLowerCase()+r.substr(6));var l;return r.indexOf(\"image://\")===0?l=wC(r.slice(8),new vt(e,t,a,n),o?\"center\":\"cover\"):r.indexOf(\"path://\")===0?l=Ah(r.slice(7),{},new vt(e,t,a,n),o?\"center\":\"cover\"):l=new $4({shape:{symbolType:r,x:e,y:t,width:a,height:n}}),l.__isEmptyBrush=s,l.setColor=U4,i&&l.setColor(i),l}function Bo(r){return F(r)||(r=[+r,+r]),[r[0]||0,r[1]||0]}function Ti(r,e){if(r!=null)return F(r)||(r=[r,r]),[W(r[0],e[0])||0,W(ft(r[1],r[0]),e[1])||0]}function ti(r){return isFinite(r)}function Y4(r,e,t){var a=e.x==null?0:e.x,n=e.x2==null?1:e.x2,i=e.y==null?0:e.y,o=e.y2==null?0:e.y2;e.global||(a=a*t.width+t.x,n=n*t.width+t.x,i=i*t.height+t.y,o=o*t.height+t.y),a=ti(a)?a:0,n=ti(n)?n:1,i=ti(i)?i:0,o=ti(o)?o:0;var s=r.createLinearGradient(a,i,n,o);return s}function Z4(r,e,t){var a=t.width,n=t.height,i=Math.min(a,n),o=e.x==null?.5:e.x,s=e.y==null?.5:e.y,l=e.r==null?.5:e.r;e.global||(o=o*a+t.x,s=s*n+t.y,l=l*i),o=ti(o)?o:.5,s=ti(s)?s:.5,l=l>=0&&ti(l)?l:.5;var u=r.createRadialGradient(o,s,0,o,s,l);return u}function gp(r,e,t){for(var a=e.type===\"radial\"?Z4(r,e,t):Y4(r,e,t),n=e.colorStops,i=0;i<n.length;i++)a.addColorStop(n[i].offset,n[i].color);return a}function X4(r,e){if(r===e||!r&&!e)return!1;if(!r||!e||r.length!==e.length)return!0;for(var t=0;t<r.length;t++)if(r[t]!==e[t])return!0;return!1}function vu(r){return parseInt(r,10)}function no(r,e,t){var a=[\"width\",\"height\"][e],n=[\"clientWidth\",\"clientHeight\"][e],i=[\"paddingLeft\",\"paddingTop\"][e],o=[\"paddingRight\",\"paddingBottom\"][e];if(t[a]!=null&&t[a]!==\"auto\")return parseFloat(t[a]);var s=document.defaultView.getComputedStyle(r);return(r[n]||vu(s[a])||vu(r.style[a]))-(vu(s[i])||0)-(vu(s[o])||0)|0}function q4(r,e){return!r||r===\"solid\"||!(e>0)?null:r===\"dashed\"?[4*e,2*e]:r===\"dotted\"?[e]:Mt(r)?[r]:F(r)?r:null}function uy(r){var e=r.style,t=e.lineDash&&e.lineWidth>0&&q4(e.lineDash,e.lineWidth),a=e.lineDashOffset;if(t){var n=e.strokeNoScale&&r.getLineScale?r.getLineScale():1;n&&n!==1&&(t=G(t,function(i){return i/n}),a/=n)}return[t,a]}var K4=new Jr(!0);function Bf(r){var e=r.stroke;return!(e==null||e===\"none\"||!(r.lineWidth>0))}function N1(r){return typeof r==\"string\"&&r!==\"none\"}function Nf(r){var e=r.fill;return e!=null&&e!==\"none\"}function V1(r,e){if(e.fillOpacity!=null&&e.fillOpacity!==1){var t=r.globalAlpha;r.globalAlpha=e.fillOpacity*e.opacity,r.fill(),r.globalAlpha=t}else r.fill()}function z1(r,e){if(e.strokeOpacity!=null&&e.strokeOpacity!==1){var t=r.globalAlpha;r.globalAlpha=e.strokeOpacity*e.opacity,r.stroke(),r.globalAlpha=t}else r.stroke()}function yp(r,e,t){var a=Eg(e.image,e.__image,t);if(_h(a)){var n=r.createPattern(a,e.repeat||\"repeat\");if(typeof DOMMatrix==\"function\"&&n&&n.setTransform){var i=new DOMMatrix;i.translateSelf(e.x||0,e.y||0),i.rotateSelf(0,0,(e.rotation||0)*Yu),i.scaleSelf(e.scaleX||1,e.scaleY||1),n.setTransform(i)}return n}}function J4(r,e,t,a){var n,i=Bf(t),o=Nf(t),s=t.strokePercent,l=s<1,u=!e.path;(!e.silent||l)&&u&&e.createPathProxy();var f=e.path||K4,h=e.__dirty;if(!a){var v=t.fill,c=t.stroke,d=o&&!!v.colorStops,p=i&&!!c.colorStops,g=o&&!!v.image,y=i&&!!c.image,m=void 0,_=void 0,S=void 0,w=void 0,x=void 0;(d||p)&&(x=e.getBoundingRect()),d&&(m=h?gp(r,v,x):e.__canvasFillGradient,e.__canvasFillGradient=m),p&&(_=h?gp(r,c,x):e.__canvasStrokeGradient,e.__canvasStrokeGradient=_),g&&(S=h||!e.__canvasFillPattern?yp(r,v,e):e.__canvasFillPattern,e.__canvasFillPattern=S),y&&(w=h||!e.__canvasStrokePattern?yp(r,c,e):e.__canvasStrokePattern,e.__canvasStrokePattern=S),d?r.fillStyle=m:g&&(S?r.fillStyle=S:o=!1),p?r.strokeStyle=_:y&&(w?r.strokeStyle=w:i=!1)}var b=e.getGlobalScale();f.setScale(b[0],b[1],e.segmentIgnoreThreshold);var C,T;r.setLineDash&&t.lineDash&&(n=uy(e),C=n[0],T=n[1]);var D=!0;(u||h&Ji)&&(f.setDPR(r.dpr),l?f.setContext(null):(f.setContext(r),D=!1),f.reset(),e.buildPath(f,e.shape,a),f.toStatic(),e.pathUpdated()),D&&f.rebuildPath(r,l?s:1),C&&(r.setLineDash(C),r.lineDashOffset=T),a||(t.strokeFirst?(i&&z1(r,t),o&&V1(r,t)):(o&&V1(r,t),i&&z1(r,t))),C&&r.setLineDash([])}function Q4(r,e,t){var a=e.__image=Eg(t.image,e.__image,e,e.onload);if(!(!a||!_h(a))){var n=t.x||0,i=t.y||0,o=e.getWidth(),s=e.getHeight(),l=a.width/a.height;if(o==null&&s!=null?o=s*l:s==null&&o!=null?s=o/l:o==null&&s==null&&(o=a.width,s=a.height),t.sWidth&&t.sHeight){var u=t.sx||0,f=t.sy||0;r.drawImage(a,u,f,t.sWidth,t.sHeight,n,i,o,s)}else if(t.sx&&t.sy){var u=t.sx,f=t.sy,h=o-u,v=s-f;r.drawImage(a,u,f,h,v,n,i,o,s)}else r.drawImage(a,n,i,o,s)}}function j4(r,e,t){var a,n=t.text;if(n!=null&&(n+=\"\"),n){r.font=t.font||tn,r.textAlign=t.textAlign,r.textBaseline=t.textBaseline;var i=void 0,o=void 0;r.setLineDash&&t.lineDash&&(a=uy(e),i=a[0],o=a[1]),i&&(r.setLineDash(i),r.lineDashOffset=o),t.strokeFirst?(Bf(t)&&r.strokeText(n,t.x,t.y),Nf(t)&&r.fillText(n,t.x,t.y)):(Nf(t)&&r.fillText(n,t.x,t.y),Bf(t)&&r.strokeText(n,t.x,t.y)),i&&r.setLineDash([])}}var F1=[\"shadowBlur\",\"shadowOffsetX\",\"shadowOffsetY\"],G1=[[\"lineCap\",\"butt\"],[\"lineJoin\",\"miter\"],[\"miterLimit\",10]];function VT(r,e,t,a,n){var i=!1;if(!a&&(t=t||{},e===t))return!1;if(a||e.opacity!==t.opacity){Ne(r,n),i=!0;var o=Math.max(Math.min(e.opacity,1),0);r.globalAlpha=isNaN(o)?ii.opacity:o}(a||e.blend!==t.blend)&&(i||(Ne(r,n),i=!0),r.globalCompositeOperation=e.blend||ii.blend);for(var s=0;s<F1.length;s++){var l=F1[s];(a||e[l]!==t[l])&&(i||(Ne(r,n),i=!0),r[l]=r.dpr*(e[l]||0))}return(a||e.shadowColor!==t.shadowColor)&&(i||(Ne(r,n),i=!0),r.shadowColor=e.shadowColor||ii.shadowColor),i}function H1(r,e,t,a,n){var i=nl(e,n.inHover),o=a?null:t&&nl(t,n.inHover)||{};if(i===o)return!1;var s=VT(r,i,o,a,n);if((a||i.fill!==o.fill)&&(s||(Ne(r,n),s=!0),N1(i.fill)&&(r.fillStyle=i.fill)),(a||i.stroke!==o.stroke)&&(s||(Ne(r,n),s=!0),N1(i.stroke)&&(r.strokeStyle=i.stroke)),(a||i.opacity!==o.opacity)&&(s||(Ne(r,n),s=!0),r.globalAlpha=i.opacity==null?1:i.opacity),e.hasStroke()){var l=i.lineWidth,u=l/(i.strokeNoScale&&e.getLineScale?e.getLineScale():1);r.lineWidth!==u&&(s||(Ne(r,n),s=!0),r.lineWidth=u)}for(var f=0;f<G1.length;f++){var h=G1[f],v=h[0];(a||i[v]!==o[v])&&(s||(Ne(r,n),s=!0),r[v]=i[v]||h[1])}return s}function tB(r,e,t,a,n){return VT(r,nl(e,n.inHover),t&&nl(t,n.inHover),a,n)}function zT(r,e){var t=e.transform,a=r.dpr||1;t?r.setTransform(a*t[0],a*t[1],a*t[2],a*t[3],a*t[4],a*t[5]):r.setTransform(a,0,0,a,0,0)}function eB(r,e,t){for(var a=!1,n=0;n<r.length;n++){var i=r[n];a=a||i.isZeroArea(),zT(e,i),e.beginPath(),i.buildPath(e,i.shape),e.clip()}t.allClipped=a}function rB(r,e){return r&&e?r[0]!==e[0]||r[1]!==e[1]||r[2]!==e[2]||r[3]!==e[3]||r[4]!==e[4]||r[5]!==e[5]:!(!r&&!e)}var W1=1,$1=2,U1=3,Y1=4;function aB(r){var e=Nf(r),t=Bf(r);return!(r.lineDash||!(+e^+t)||e&&typeof r.fill!=\"string\"||t&&typeof r.stroke!=\"string\"||r.strokePercent<1||r.strokeOpacity<1||r.fillOpacity<1)}function Ne(r,e){e.batchFill&&r.fill(),e.batchStroke&&r.stroke(),e.batchFill=\"\",e.batchStroke=\"\"}function nl(r,e){return e&&r.__hoverStyle||r.style}function FT(r,e){ei(r,e,{inHover:!1,viewWidth:0,viewHeight:0},!0)}function ei(r,e,t,a){var n=e.transform;if(!e.shouldBePainted(t.viewWidth,t.viewHeight,!1,!1)){e.__dirty&=~He,e.__isRendered=!1;return}var i=e.__clipPaths,o=t.prevElClipPaths,s=!1,l=!1;if((!o||X4(i,o))&&(o&&o.length&&(Ne(r,t),r.restore(),l=s=!0,t.prevElClipPaths=null,t.allClipped=!1,t.prevEl=null),i&&i.length&&(Ne(r,t),r.save(),eB(i,r,t),s=!0),t.prevElClipPaths=i),t.allClipped){e.__isRendered=!1;return}e.beforeBrush&&e.beforeBrush(),e.innerBeforeBrush();var u=t.prevEl;u||(l=s=!0);var f=e instanceof mt&&e.autoBatch&&aB(e.style);s||rB(n,u.transform)?(Ne(r,t),zT(r,e)):f||Ne(r,t);var h=nl(e,t.inHover);e instanceof mt?(t.lastDrawType!==W1&&(l=!0,t.lastDrawType=W1),H1(r,e,u,l,t),(!f||!t.batchFill&&!t.batchStroke)&&r.beginPath(),J4(r,e,h,f),f&&(t.batchFill=h.fill||\"\",t.batchStroke=h.stroke||\"\")):e instanceof Xs?(t.lastDrawType!==U1&&(l=!0,t.lastDrawType=U1),H1(r,e,u,l,t),j4(r,e,h)):e instanceof pe?(t.lastDrawType!==$1&&(l=!0,t.lastDrawType=$1),tB(r,e,u,l,t),Q4(r,e,h)):e.getTemporalDisplayables&&(t.lastDrawType!==Y1&&(l=!0,t.lastDrawType=Y1),nB(r,e,t)),f&&a&&Ne(r,t),e.innerAfterBrush(),e.afterBrush&&e.afterBrush(),t.prevEl=e,e.__dirty=0,e.__isRendered=!0}function nB(r,e,t){var a=e.getDisplayables(),n=e.getTemporalDisplayables();r.save();var i={prevElClipPaths:null,prevEl:null,allClipped:!1,viewWidth:t.viewWidth,viewHeight:t.viewHeight,inHover:t.inHover},o,s;for(o=e.getCursor(),s=a.length;o<s;o++){var l=a[o];l.beforeBrush&&l.beforeBrush(),l.innerBeforeBrush(),ei(r,l,i,o===s-1),l.innerAfterBrush(),l.afterBrush&&l.afterBrush(),i.prevEl=l}for(var u=0,f=n.length;u<f;u++){var l=n[u];l.beforeBrush&&l.beforeBrush(),l.innerBeforeBrush(),ei(r,l,i,u===f-1),l.innerAfterBrush(),l.afterBrush&&l.afterBrush(),i.prevEl=l}e.clearTemporalDisplayables(),e.notClear=!0,r.restore()}var Zv=new N4,Z1=new Sl(100),X1=[\"symbol\",\"symbolSize\",\"symbolKeepAspect\",\"color\",\"backgroundColor\",\"dashArrayX\",\"dashArrayY\",\"maxTileWidth\",\"maxTileHeight\"];function co(r,e){if(r===\"none\")return null;var t=e.getDevicePixelRatio(),a=e.getZr(),n=a.painter.type===\"svg\";r.dirty&&Zv.delete(r);var i=Zv.get(r);if(i)return i;var o=tt(r,{symbol:\"rect\",symbolSize:1,symbolKeepAspect:!0,color:\"rgba(0, 0, 0, 0.2)\",backgroundColor:null,dashArrayX:5,dashArrayY:5,rotation:0,maxTileWidth:512,maxTileHeight:512});o.backgroundColor===\"none\"&&(o.backgroundColor=null);var s={repeat:\"repeat\"};return l(s),s.rotation=o.rotation,s.scaleX=s.scaleY=n?1:1/t,Zv.set(r,s),r.dirty=!1,s;function l(u){for(var f=[t],h=!0,v=0;v<X1.length;++v){var c=o[X1[v]];if(c!=null&&!F(c)&&!U(c)&&!Mt(c)&&typeof c!=\"boolean\"){h=!1;break}f.push(c)}var d;if(h){d=f.join(\",\")+(n?\"-svg\":\"\");var p=Z1.get(d);p&&(n?u.svgElement=p:u.image=p)}var g=HT(o.dashArrayX),y=iB(o.dashArrayY),m=GT(o.symbol),_=oB(g),S=WT(y),w=!n&&ga.createCanvas(),x=n&&{tag:\"g\",attrs:{},key:\"dcl\",children:[]},b=T(),C;w&&(w.width=b.width*t,w.height=b.height*t,C=w.getContext(\"2d\")),D(),h&&Z1.put(d,w||x),u.image=w,u.svgElement=x,u.svgWidth=b.width,u.svgHeight=b.height;function T(){for(var M=1,L=0,I=_.length;L<I;++L)M=u0(M,_[L]);for(var P=1,L=0,I=m.length;L<I;++L)P=u0(P,m[L].length);M*=P;var R=S*_.length*m.length;return{width:Math.max(1,Math.min(M,o.maxTileWidth)),height:Math.max(1,Math.min(R,o.maxTileHeight))}}function D(){C&&(C.clearRect(0,0,w.width,w.height),o.backgroundColor&&(C.fillStyle=o.backgroundColor,C.fillRect(0,0,w.width,w.height)));for(var M=0,L=0;L<y.length;++L)M+=y[L];if(M<=0)return;for(var I=-S,P=0,R=0,E=0;I<b.height;){if(P%2===0){for(var B=R/2%m.length,O=0,z=0,H=0;O<b.width*2;){for(var $=0,L=0;L<g[E].length;++L)$+=g[E][L];if($<=0)break;if(z%2===0){var X=(1-o.symbolSize)*.5,Q=O+g[E][z]*X,j=I+y[P]*X,pt=g[E][z]*o.symbolSize,xt=y[P]*o.symbolSize,gt=H/2%m[B].length;rt(Q,j,pt,xt,m[B][gt])}O+=g[E][z],++H,++z,z===g[E].length&&(z=0)}++E,E===g.length&&(E=0)}I+=y[P],++R,++P,P===y.length&&(P=0)}function rt(yt,st,K,lt,Gt){var wt=n?1:t,Yt=jt(Gt,yt*wt,st*wt,K*wt,lt*wt,o.color,o.symbolKeepAspect);if(n){var Wt=a.painter.renderOneToVNode(Yt);Wt&&x.children.push(Wt)}else FT(C,Yt)}}}}function GT(r){if(!r||r.length===0)return[[\"rect\"]];if(U(r))return[[r]];for(var e=!0,t=0;t<r.length;++t)if(!U(r[t])){e=!1;break}if(e)return GT([r]);for(var a=[],t=0;t<r.length;++t)U(r[t])?a.push([r[t]]):a.push(r[t]);return a}function HT(r){if(!r||r.length===0)return[[0,0]];if(Mt(r)){var e=Math.ceil(r);return[[e,e]]}for(var t=!0,a=0;a<r.length;++a)if(!Mt(r[a])){t=!1;break}if(t)return HT([r]);for(var n=[],a=0;a<r.length;++a)if(Mt(r[a])){var e=Math.ceil(r[a]);n.push([e,e])}else{var e=G(r[a],function(s){return Math.ceil(s)});e.length%2===1?n.push(e.concat(e)):n.push(e)}return n}function iB(r){if(!r||typeof r==\"object\"&&r.length===0)return[0,0];if(Mt(r)){var e=Math.ceil(r);return[e,e]}var t=G(r,function(a){return Math.ceil(a)});return r.length%2?t.concat(t):t}function oB(r){return G(r,function(e){return WT(e)})}function WT(r){for(var e=0,t=0;t<r.length;++t)e+=r[t];return r.length%2===1?e*2:e}function sB(r,e){r.eachRawSeries(function(t){if(!r.isSeriesFiltered(t)){var a=t.getData();a.hasItemVisual()&&a.each(function(o){var s=a.getItemVisual(o,\"decal\");if(s){var l=a.ensureUniqueItemVisual(o,\"style\");l.decal=co(s,e)}});var n=a.getVisual(\"decal\");if(n){var i=a.getVisual(\"style\");i.decal=co(n,e)}}})}var lB=new hr,mr=lB,$T={};function uB(r,e){$T[r]=e}function fB(r){return $T[r]}var hB=1,vB=800,cB=900,dB=1e3,pB=2e3,gB=5e3,UT=1e3,yB=1100,fy=2e3,YT=3e3,mB=4e3,Vh=4500,_B=4600,SB=5e3,xB=6e3,ZT=7e3,wB={PROCESSOR:{FILTER:dB,SERIES_FILTER:vB,STATISTIC:gB},VISUAL:{LAYOUT:UT,PROGRESSIVE_LAYOUT:yB,GLOBAL:fy,CHART:YT,POST_CHART_LAYOUT:_B,COMPONENT:mB,BRUSH:SB,CHART_ITEM:Vh,ARIA:xB,DECAL:ZT}},me=\"__flagInMainProcess\",Re=\"__pendingUpdate\",Xv=\"__needsUpdateStatus\",q1=/^[a-zA-Z0-9_]+$/,qv=\"__connectUpdateStatus\",K1=0,bB=1,CB=2;function XT(r){return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];if(this.isDisposed()){this.id;return}return KT(this,r,e)}}function qT(r){return function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];return KT(this,r,e)}}function KT(r,e,t){return t[0]=t[0]&&t[0].toLowerCase(),hr.prototype[e].apply(r,t)}var JT=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(hr),QT=JT.prototype;QT.on=qT(\"on\");QT.off=qT(\"off\");var Fi,Kv,cu,Ra,Jv,Qv,jv,Ko,Jo,J1,Q1,tc,j1,du,t_,jT,Ye,e_,tA=function(r){k(e,r);function e(t,a,n){var i=r.call(this,new I4)||this;i._chartsViews=[],i._chartsMap={},i._componentsViews=[],i._componentsMap={},i._pendingActions=[],n=n||{},U(a)&&(a=eA[a]),i._dom=t;var o=\"canvas\",s=\"auto\",l=!1,u=i._zr=i0(t,{renderer:n.renderer||o,devicePixelRatio:n.devicePixelRatio,width:n.width,height:n.height,ssr:n.ssr,useDirtyRect:ft(n.useDirtyRect,l),useCoarsePointer:ft(n.useCoarsePointer,s),pointerSize:n.pointerSize});i._ssr=n.ssr,i._throttledZrFlush=sy(Y(u.flush,u),17),a=at(a),a&&oT(a,!0),i._theme=a,i._locale=N3(n.locale||EC),i._coordSysMgr=new Ml;var f=i._api=t_(i);function h(v,c){return v.__prio-c.__prio}return qu(zf,h),qu(mp,h),i._scheduler=new kT(i,f,mp,zf),i._messageCenter=new JT,i._initEvents(),i.resize=Y(i.resize,i),u.animation.on(\"frame\",i._onframe,i),J1(u,i),Q1(u,i),pf(i),i}return e.prototype._onframe=function(){if(!this._disposed){e_(this);var t=this._scheduler;if(this[Re]){var a=this[Re].silent;this[me]=!0;try{Fi(this),Ra.update.call(this,null,this[Re].updateParams)}catch(l){throw this[me]=!1,this[Re]=null,l}this._zr.flush(),this[me]=!1,this[Re]=null,Ko.call(this,a),Jo.call(this,a)}else if(t.unfinished){var n=hB,i=this._model,o=this._api;t.unfinished=!1;do{var s=+new Date;t.performSeriesTasks(i),t.performDataProcessorTasks(i),Qv(this,i),t.performVisualTasks(i),du(this,this._model,o,\"remain\",{}),n-=+new Date-s}while(n>0&&t.unfinished);t.unfinished||this._zr.flush()}}},e.prototype.getDom=function(){return this._dom},e.prototype.getId=function(){return this.id},e.prototype.getZr=function(){return this._zr},e.prototype.isSSR=function(){return this._ssr},e.prototype.setOption=function(t,a,n){if(!this[me]){if(this._disposed){this.id;return}var i,o,s;if(et(a)&&(n=a.lazyUpdate,i=a.silent,o=a.replaceMerge,s=a.transition,a=a.notMerge),this[me]=!0,!this._model||a){var l=new pO(this._api),u=this._theme,f=this._model=new aT;f.scheduler=this._scheduler,f.ssr=this._ssr,f.init(null,null,null,u,this._locale,l)}this._model.setOption(t,{replaceMerge:o},_p);var h={seriesTransition:s,optionChanged:!0};if(n)this[Re]={silent:i,updateParams:h},this[me]=!1,this.getZr().wakeUp();else{try{Fi(this),Ra.update.call(this,null,h)}catch(v){throw this[Re]=null,this[me]=!1,v}this._ssr||this._zr.flush(),this[Re]=null,this[me]=!1,Ko.call(this,i),Jo.call(this,i)}}},e.prototype.setTheme=function(){},e.prototype.getModel=function(){return this._model},e.prototype.getOption=function(){return this._model&&this._model.getOption()},e.prototype.getWidth=function(){return this._zr.getWidth()},e.prototype.getHeight=function(){return this._zr.getHeight()},e.prototype.getDevicePixelRatio=function(){return this._zr.painter.dpr||At.hasGlobalWindow&&window.devicePixelRatio||1},e.prototype.getRenderedCanvas=function(t){return this.renderToCanvas(t)},e.prototype.renderToCanvas=function(t){t=t||{};var a=this._zr.painter;return a.getRenderedCanvas({backgroundColor:t.backgroundColor||this._model.get(\"backgroundColor\"),pixelRatio:t.pixelRatio||this.getDevicePixelRatio()})},e.prototype.renderToSVGString=function(t){t=t||{};var a=this._zr.painter;return a.renderToString({useViewBox:t.useViewBox})},e.prototype.getSvgDataURL=function(){if(!!At.svgSupported){var t=this._zr,a=t.storage.getDisplayList();return A(a,function(n){n.stopAnimation(null,!0)}),t.painter.toDataURL()}},e.prototype.getDataURL=function(t){if(this._disposed){this.id;return}t=t||{};var a=t.excludeComponents,n=this._model,i=[],o=this;A(a,function(l){n.eachComponent({mainType:l},function(u){var f=o._componentsMap[u.__viewId];f.group.ignore||(i.push(f),f.group.ignore=!0)})});var s=this._zr.painter.getType()===\"svg\"?this.getSvgDataURL():this.renderToCanvas(t).toDataURL(\"image/\"+(t&&t.type||\"png\"));return A(i,function(l){l.group.ignore=!1}),s},e.prototype.getConnectedDataURL=function(t){if(this._disposed){this.id;return}var a=t.type===\"svg\",n=this.group,i=Math.min,o=Math.max,s=1/0;if(r_[n]){var l=s,u=s,f=-s,h=-s,v=[],c=t&&t.pixelRatio||this.getDevicePixelRatio();A(Bs,function(_,S){if(_.group===n){var w=a?_.getZr().painter.getSvgDom().innerHTML:_.renderToCanvas(at(t)),x=_.getDom().getBoundingClientRect();l=i(x.left,l),u=i(x.top,u),f=o(x.right,f),h=o(x.bottom,h),v.push({dom:w,left:x.left,top:x.top})}}),l*=c,u*=c,f*=c,h*=c;var d=f-l,p=h-u,g=ga.createCanvas(),y=i0(g,{renderer:a?\"svg\":\"canvas\"});if(y.resize({width:d,height:p}),a){var m=\"\";return A(v,function(_){var S=_.left-l,w=_.top-u;m+='<g transform=\"translate('+S+\",\"+w+')\">'+_.dom+\"</g>\"}),y.painter.getSvgRoot().innerHTML=m,t.connectedBackgroundColor&&y.painter.setBackgroundColor(t.connectedBackgroundColor),y.refreshImmediately(),y.painter.toDataURL()}else return t.connectedBackgroundColor&&y.add(new bt({shape:{x:0,y:0,width:d,height:p},style:{fill:t.connectedBackgroundColor}})),A(v,function(_){var S=new pe({style:{x:_.left*c-l,y:_.top*c-u,image:_.dom}});y.add(S)}),y.refreshImmediately(),g.toDataURL(\"image/\"+(t&&t.type||\"png\"))}else return this.getDataURL(t)},e.prototype.convertToPixel=function(t,a){return Jv(this,\"convertToPixel\",t,a)},e.prototype.convertFromPixel=function(t,a){return Jv(this,\"convertFromPixel\",t,a)},e.prototype.containPixel=function(t,a){if(this._disposed){this.id;return}var n=this._model,i,o=Ls(n,t);return A(o,function(s,l){l.indexOf(\"Models\")>=0&&A(s,function(u){var f=u.coordinateSystem;if(f&&f.containPoint)i=i||!!f.containPoint(a);else if(l===\"seriesModels\"){var h=this._chartsMap[u.__viewId];h&&h.containPoint&&(i=i||h.containPoint(a,u))}},this)},this),!!i},e.prototype.getVisual=function(t,a){var n=this._model,i=Ls(n,t,{defaultMainType:\"series\"}),o=i.seriesModel,s=o.getData(),l=i.hasOwnProperty(\"dataIndexInside\")?i.dataIndexInside:i.hasOwnProperty(\"dataIndex\")?s.indexOfRawIndex(i.dataIndex):null;return l!=null?ly(s,l,a):Ll(s,a)},e.prototype.getViewOfComponentModel=function(t){return this._componentsMap[t.__viewId]},e.prototype.getViewOfSeriesModel=function(t){return this._chartsMap[t.__viewId]},e.prototype._initEvents=function(){var t=this;A(TB,function(a){var n=function(i){var o=t.getModel(),s=i.target,l,u=a===\"globalout\";if(u?l={}:s&&jn(s,function(d){var p=it(d);if(p&&p.dataIndex!=null){var g=p.dataModel||o.getSeriesByIndex(p.seriesIndex);return l=g&&g.getDataParams(p.dataIndex,p.dataType,s)||{},!0}else if(p.eventData)return l=V({},p.eventData),!0},!0),l){var f=l.componentType,h=l.componentIndex;(f===\"markLine\"||f===\"markPoint\"||f===\"markArea\")&&(f=\"series\",h=l.seriesIndex);var v=f&&h!=null&&o.getComponent(f,h),c=v&&t[v.mainType===\"series\"?\"_chartsMap\":\"_componentsMap\"][v.__viewId];l.event=i,l.type=a,t._$eventProcessor.eventInfo={targetEl:s,packedEvent:l,model:v,view:c},t.trigger(a,l)}};n.zrEventfulCallAtLast=!0,t._zr.on(a,n,t)}),A(Os,function(a,n){t._messageCenter.on(n,function(i){this.trigger(n,i)},t)}),A([\"selectchanged\"],function(a){t._messageCenter.on(a,function(n){this.trigger(a,n)},t)}),E4(this._messageCenter,this,this._api)},e.prototype.isDisposed=function(){return this._disposed},e.prototype.clear=function(){if(this._disposed){this.id;return}this.setOption({series:[]},!0)},e.prototype.dispose=function(){if(this._disposed){this.id;return}this._disposed=!0;var t=this.getDom();t&&I2(this.getDom(),vy,\"\");var a=this,n=a._api,i=a._model;A(a._componentsViews,function(o){o.dispose(i,n)}),A(a._chartsViews,function(o){o.dispose(i,n)}),a._zr.dispose(),a._dom=a._model=a._chartsMap=a._componentsMap=a._chartsViews=a._componentsViews=a._scheduler=a._api=a._zr=a._throttledZrFlush=a._theme=a._coordSysMgr=a._messageCenter=null,delete Bs[a.id]},e.prototype.resize=function(t){if(!this[me]){if(this._disposed){this.id;return}this._zr.resize(t);var a=this._model;if(this._loadingFX&&this._loadingFX.resize(),!!a){var n=a.resetOption(\"media\"),i=t&&t.silent;this[Re]&&(i==null&&(i=this[Re].silent),n=!0,this[Re]=null),this[me]=!0;try{n&&Fi(this),Ra.update.call(this,{type:\"resize\",animation:V({duration:0},t&&t.animation)})}catch(o){throw this[me]=!1,o}this[me]=!1,Ko.call(this,i),Jo.call(this,i)}}},e.prototype.showLoading=function(t,a){if(this._disposed){this.id;return}if(et(t)&&(a=t,t=\"\"),t=t||\"default\",this.hideLoading(),!!Sp[t]){var n=Sp[t](this._api,a),i=this._zr;this._loadingFX=n,i.add(n)}},e.prototype.hideLoading=function(){if(this._disposed){this.id;return}this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null},e.prototype.makeActionFromEvent=function(t){var a=V({},t);return a.type=Os[t.type],a},e.prototype.dispatchAction=function(t,a){if(this._disposed){this.id;return}if(et(a)||(a={silent:!!a}),!!Vf[t.type]&&!!this._model){if(this[me]){this._pendingActions.push(t);return}var n=a.silent;jv.call(this,t,n);var i=a.flush;i?this._zr.flush():i!==!1&&At.browser.weChat&&this._throttledZrFlush(),Ko.call(this,n),Jo.call(this,n)}},e.prototype.updateLabelLayout=function(){mr.trigger(\"series:layoutlabels\",this._model,this._api,{updatedSeries:[]})},e.prototype.appendData=function(t){if(this._disposed){this.id;return}var a=t.seriesIndex,n=this.getModel(),i=n.getSeriesByIndex(a);i.appendData(t),this._scheduler.unfinished=!0,this.getZr().wakeUp()},e.internalField=function(){Fi=function(h){var v=h._scheduler;v.restorePipelines(h._model),v.prepareStageTasks(),Kv(h,!0),Kv(h,!1),v.plan()},Kv=function(h,v){for(var c=h._model,d=h._scheduler,p=v?h._componentsViews:h._chartsViews,g=v?h._componentsMap:h._chartsMap,y=h._zr,m=h._api,_=0;_<p.length;_++)p[_].__alive=!1;v?c.eachComponent(function(x,b){x!==\"series\"&&S(b)}):c.eachSeries(S);function S(x){var b=x.__requireNewView;x.__requireNewView=!1;var C=\"_ec_\"+x.id+\"_\"+x.type,T=!b&&g[C];if(!T){var D=Hr(x.type),M=v?Ut.getClass(D.main,D.sub):zt.getClass(D.sub);T=new M,T.init(c,m),g[C]=T,p.push(T),y.add(T.group)}x.__viewId=T.__id=C,T.__alive=!0,T.__model=x,T.group.__ecComponentInfo={mainType:x.mainType,index:x.componentIndex},!v&&d.prepareView(T,x,c,m)}for(var _=0;_<p.length;){var w=p[_];w.__alive?_++:(!v&&w.renderTask.dispose(),y.remove(w.group),w.dispose(c,m),p.splice(_,1),g[w.__id]===w&&delete g[w.__id],w.__id=w.group.__ecComponentInfo=null)}},cu=function(h,v,c,d,p){var g=h._model;if(g.setUpdatePayload(c),!d){A([].concat(h._componentsViews).concat(h._chartsViews),w);return}var y={};y[d+\"Id\"]=c[d+\"Id\"],y[d+\"Index\"]=c[d+\"Index\"],y[d+\"Name\"]=c[d+\"Name\"];var m={mainType:d,query:y};p&&(m.subType=p);var _=c.excludeSeriesId,S;_!=null&&(S=q(),A(kt(_),function(x){var b=ee(x,null);b!=null&&S.set(b,!0)})),g&&g.eachComponent(m,function(x){var b=S&&S.get(x.id)!=null;if(!b)if(N0(c))if(x instanceof Ht)c.type===oi&&!c.notBlur&&!x.get([\"emphasis\",\"disabled\"])&&L5(x,c,h._api);else{var C=Vg(x.mainType,x.componentIndex,c.name,h._api),T=C.focusSelf,D=C.dispatchers;c.type===oi&&T&&!c.notBlur&&tp(x.mainType,x.componentIndex,h._api),D&&A(D,function(M){c.type===oi?_a(M):Sa(M)})}else rp(c)&&x instanceof Ht&&(R5(x,c,h._api),O0(x),Ye(h))},h),g&&g.eachComponent(m,function(x){var b=S&&S.get(x.id)!=null;b||w(h[d===\"series\"?\"_chartsMap\":\"_componentsMap\"][x.__viewId])},h);function w(x){x&&x.__alive&&x[v]&&x[v](x.__model,g,h._api,c)}},Ra={prepareAndUpdate:function(h){Fi(this),Ra.update.call(this,h,{optionChanged:h.newOption!=null})},update:function(h,v){var c=this._model,d=this._api,p=this._zr,g=this._coordSysMgr,y=this._scheduler;if(!!c){c.setUpdatePayload(h),y.restoreData(c,h),y.performSeriesTasks(c),g.create(c,d),y.performDataProcessorTasks(c,h),Qv(this,c),g.update(c,d),t(c),y.performVisualTasks(c,h),tc(this,c,d,h,v);var m=c.get(\"backgroundColor\")||\"transparent\",_=c.get(\"darkMode\");p.setBackgroundColor(m),_!=null&&_!==\"auto\"&&p.setDarkMode(_),mr.trigger(\"afterupdate\",c,d)}},updateTransform:function(h){var v=this,c=this._model,d=this._api;if(!!c){c.setUpdatePayload(h);var p=[];c.eachComponent(function(y,m){if(y!==\"series\"){var _=v.getViewOfComponentModel(m);if(_&&_.__alive)if(_.updateTransform){var S=_.updateTransform(m,c,d,h);S&&S.update&&p.push(_)}else p.push(_)}});var g=q();c.eachSeries(function(y){var m=v._chartsMap[y.__viewId];if(m.updateTransform){var _=m.updateTransform(y,c,d,h);_&&_.update&&g.set(y.uid,1)}else g.set(y.uid,1)}),t(c),this._scheduler.performVisualTasks(c,h,{setDirty:!0,dirtyMap:g}),du(this,c,d,h,{},g),mr.trigger(\"afterupdate\",c,d)}},updateView:function(h){var v=this._model;!v||(v.setUpdatePayload(h),zt.markUpdateMethod(h,\"updateView\"),t(v),this._scheduler.performVisualTasks(v,h,{setDirty:!0}),tc(this,v,this._api,h,{}),mr.trigger(\"afterupdate\",v,this._api))},updateVisual:function(h){var v=this,c=this._model;!c||(c.setUpdatePayload(h),c.eachSeries(function(d){d.getData().clearAllVisual()}),zt.markUpdateMethod(h,\"updateVisual\"),t(c),this._scheduler.performVisualTasks(c,h,{visualType:\"visual\",setDirty:!0}),c.eachComponent(function(d,p){if(d!==\"series\"){var g=v.getViewOfComponentModel(p);g&&g.__alive&&g.updateVisual(p,c,v._api,h)}}),c.eachSeries(function(d){var p=v._chartsMap[d.__viewId];p.updateVisual(d,c,v._api,h)}),mr.trigger(\"afterupdate\",c,this._api))},updateLayout:function(h){Ra.update.call(this,h)}},Jv=function(h,v,c,d){if(h._disposed){h.id;return}for(var p=h._model,g=h._coordSysMgr.getCoordinateSystems(),y,m=Ls(p,c),_=0;_<g.length;_++){var S=g[_];if(S[v]&&(y=S[v](p,m,d))!=null)return y}},Qv=function(h,v){var c=h._chartsMap,d=h._scheduler;v.eachSeries(function(p){d.updateStreamModes(p,c[p.__viewId])})},jv=function(h,v){var c=this,d=this.getModel(),p=h.type,g=h.escapeConnect,y=Vf[p],m=y.actionInfo,_=(m.update||\"update\").split(\":\"),S=_.pop(),w=_[0]!=null&&Hr(_[0]);this[me]=!0;var x=[h],b=!1;h.batch&&(b=!0,x=G(h.batch,function(P){return P=tt(V({},P),h),P.batch=null,P}));var C=[],T,D=rp(h),M=N0(h);if(M&&rC(this._api),A(x,function(P){if(T=y.action(P,c._model,c._api),T=T||V({},P),T.type=m.event||T.type,C.push(T),M){var R=Pg(h),E=R.queryOptionMap,B=R.mainTypeSpecified,O=B?E.keys()[0]:\"series\";cu(c,S,P,O),Ye(c)}else D?(cu(c,S,P,\"series\"),Ye(c)):w&&cu(c,S,P,w.main,w.sub)}),S!==\"none\"&&!M&&!D&&!w)try{this[Re]?(Fi(this),Ra.update.call(this,h),this[Re]=null):Ra[S].call(this,h)}catch(P){throw this[me]=!1,P}if(b?T={type:m.event||p,escapeConnect:g,batch:C}:T=C[0],this[me]=!1,!v){var L=this._messageCenter;if(L.trigger(T.type,T),D){var I={type:\"selectchanged\",escapeConnect:g,selected:E5(d),isFromClick:h.isFromClick||!1,fromAction:h.type,fromActionPayload:h};L.trigger(I.type,I)}}},Ko=function(h){for(var v=this._pendingActions;v.length;){var c=v.shift();jv.call(this,c,h)}},Jo=function(h){!h&&this.trigger(\"updated\")},J1=function(h,v){h.on(\"rendered\",function(c){v.trigger(\"rendered\",c),h.animation.isFinished()&&!v[Re]&&!v._scheduler.unfinished&&!v._pendingActions.length&&v.trigger(\"finished\")})},Q1=function(h,v){h.on(\"mouseover\",function(c){var d=c.target,p=jn(d,Ks);p&&(I5(p,c,v._api),Ye(v))}).on(\"mouseout\",function(c){var d=c.target,p=jn(d,Ks);p&&(P5(p,c,v._api),Ye(v))}).on(\"click\",function(c){var d=c.target,p=jn(d,function(m){return it(m).dataIndex!=null},!0);if(p){var g=p.selected?\"unselect\":\"select\",y=it(p);v._api.dispatchAction({type:g,dataType:y.dataType,dataIndexInside:y.dataIndex,seriesIndex:y.seriesIndex,isFromClick:!0})}})};function t(h){h.clearColorPalette(),h.eachSeries(function(v){v.clearColorPalette()})}function a(h){var v=[],c=[],d=!1;if(h.eachComponent(function(m,_){var S=_.get(\"zlevel\")||0,w=_.get(\"z\")||0,x=_.getZLevelKey();d=d||!!x,(m===\"series\"?c:v).push({zlevel:S,z:w,idx:_.componentIndex,type:m,key:x})}),d){var p=v.concat(c),g,y;qu(p,function(m,_){return m.zlevel===_.zlevel?m.z-_.z:m.zlevel-_.zlevel}),A(p,function(m){var _=h.getComponent(m.type,m.idx),S=m.zlevel,w=m.key;g!=null&&(S=Math.max(g,S)),w?(S===g&&w!==y&&S++,y=w):y&&(S===g&&S++,y=\"\"),g=S,_.setZLevel(S)})}}tc=function(h,v,c,d,p){a(v),j1(h,v,c,d,p),A(h._chartsViews,function(g){g.__alive=!1}),du(h,v,c,d,p),A(h._chartsViews,function(g){g.__alive||g.remove(v,c)})},j1=function(h,v,c,d,p,g){A(g||h._componentsViews,function(y){var m=y.__model;u(m,y),y.render(m,v,c,d),s(m,y),f(m,y)})},du=function(h,v,c,d,p,g){var y=h._scheduler;p=V(p||{},{updatedSeries:v.getSeries()}),mr.trigger(\"series:beforeupdate\",v,c,p);var m=!1;v.eachSeries(function(_){var S=h._chartsMap[_.__viewId];S.__alive=!0;var w=S.renderTask;y.updatePayload(w,d),u(_,S),g&&g.get(_.uid)&&w.dirty(),w.perform(y.getPerformArgs(w))&&(m=!0),S.group.silent=!!_.get(\"silent\"),o(_,S),O0(_)}),y.unfinished=m||y.unfinished,mr.trigger(\"series:layoutlabels\",v,c,p),mr.trigger(\"series:transition\",v,c,p),v.eachSeries(function(_){var S=h._chartsMap[_.__viewId];s(_,S),f(_,S)}),i(h,v),mr.trigger(\"series:afterupdate\",v,c,p)},Ye=function(h){h[Xv]=!0,h.getZr().wakeUp()},e_=function(h){!h[Xv]||(h.getZr().storage.traverse(function(v){so(v)||n(v)}),h[Xv]=!1)};function n(h){for(var v=[],c=h.currentStates,d=0;d<c.length;d++){var p=c[d];p===\"emphasis\"||p===\"blur\"||p===\"select\"||v.push(p)}h.selected&&h.states.select&&v.push(\"select\"),h.hoverState===wh&&h.states.emphasis?v.push(\"emphasis\"):h.hoverState===bl&&h.states.blur&&v.push(\"blur\"),h.useStates(v)}function i(h,v){var c=h._zr,d=c.storage,p=0;d.traverse(function(g){g.isGroup||p++}),p>v.get(\"hoverLayerThreshold\")&&!At.node&&!At.worker&&v.eachSeries(function(g){if(!g.preventUsingHoverLayer){var y=h._chartsMap[g.__viewId];y.__alive&&y.eachRendered(function(m){m.states.emphasis&&(m.states.emphasis.hoverLayer=!0)})}})}function o(h,v){var c=h.get(\"blendMode\")||null;v.eachRendered(function(d){d.isGroup||(d.style.blend=c)})}function s(h,v){if(!h.preventAutoZ){var c=h.get(\"z\")||0,d=h.get(\"zlevel\")||0;v.eachRendered(function(p){return l(p,c,d,-1/0),!0})}}function l(h,v,c,d){var p=h.getTextContent(),g=h.getTextGuideLine(),y=h.isGroup;if(y)for(var m=h.childrenRef(),_=0;_<m.length;_++)d=Math.max(l(m[_],v,c,d),d);else h.z=v,h.zlevel=c,d=Math.max(h.z2,d);if(p&&(p.z=v,p.zlevel=c,isFinite(d)&&(p.z2=d+2)),g){var S=h.textGuideLineConfig;g.z=v,g.zlevel=c,isFinite(d)&&(g.z2=d+(S&&S.showAbove?1:-1))}return d}function u(h,v){v.eachRendered(function(c){if(!so(c)){var d=c.getTextContent(),p=c.getTextGuideLine();c.stateTransition&&(c.stateTransition=null),d&&d.stateTransition&&(d.stateTransition=null),p&&p.stateTransition&&(p.stateTransition=null),c.hasState()?(c.prevStates=c.currentStates,c.clearStates()):c.prevStates&&(c.prevStates=null)}})}function f(h,v){var c=h.getModel(\"stateAnimation\"),d=h.isAnimationEnabled(),p=c.get(\"duration\"),g=p>0?{duration:p,delay:c.get(\"delay\"),easing:c.get(\"easing\")}:null;v.eachRendered(function(y){if(y.states&&y.states.emphasis){if(so(y))return;if(y instanceof mt&&V5(y),y.__dirty){var m=y.prevStates;m&&y.useStates(m)}if(d){y.stateTransition=g;var _=y.getTextContent(),S=y.getTextGuideLine();_&&(_.stateTransition=g),S&&(S.stateTransition=g)}y.__dirty&&n(y)}})}t_=function(h){return new(function(v){k(c,v);function c(){return v!==null&&v.apply(this,arguments)||this}return c.prototype.getCoordinateSystems=function(){return h._coordSysMgr.getCoordinateSystems()},c.prototype.getComponentByElement=function(d){for(;d;){var p=d.__ecComponentInfo;if(p!=null)return h._model.getComponent(p.mainType,p.index);d=d.parent}},c.prototype.enterEmphasis=function(d,p){_a(d,p),Ye(h)},c.prototype.leaveEmphasis=function(d,p){Sa(d,p),Ye(h)},c.prototype.enterBlur=function(d){Q2(d),Ye(h)},c.prototype.leaveBlur=function(d){Ng(d),Ye(h)},c.prototype.enterSelect=function(d){j2(d),Ye(h)},c.prototype.leaveSelect=function(d){tC(d),Ye(h)},c.prototype.getModel=function(){return h.getModel()},c.prototype.getViewOfComponentModel=function(d){return h.getViewOfComponentModel(d)},c.prototype.getViewOfSeriesModel=function(d){return h.getViewOfSeriesModel(d)},c}(nT))(h)},jT=function(h){function v(c,d){for(var p=0;p<c.length;p++){var g=c[p];g[qv]=d}}A(Os,function(c,d){h._messageCenter.on(d,function(p){if(r_[h.group]&&h[qv]!==K1){if(p&&p.escapeConnect)return;var g=h.makeActionFromEvent(p),y=[];A(Bs,function(m){m!==h&&m.group===h.group&&y.push(m)}),v(y,K1),A(y,function(m){m[qv]!==bB&&m.dispatchAction(g)}),v(y,CB)}})})}}(),e}(hr),hy=tA.prototype;hy.on=XT(\"on\");hy.off=XT(\"off\");hy.one=function(r,e,t){var a=this;function n(){for(var i=[],o=0;o<arguments.length;o++)i[o]=arguments[o];e&&e.apply&&e.apply(this,i),a.off(r,n)}this.on.call(this,r,n,t)};var TB=[\"click\",\"dblclick\",\"mouseover\",\"mouseout\",\"mousemove\",\"mousedown\",\"mouseup\",\"globalout\",\"contextmenu\"];var Vf={},Os={},mp=[],_p=[],zf=[],eA={},Sp={},Bs={},r_={},AB=+new Date-0,vy=\"_echarts_instance_\";function DB(r,e,t){var a=!(t&&t.ssr);if(a){var n=MB(r);if(n)return n}var i=new tA(r,e,t);return i.id=\"ec_\"+AB++,Bs[i.id]=i,a&&I2(r,vy,i.id),jT(i),mr.trigger(\"afterinit\",i),i}function MB(r){return Bs[Ck(r,vy)]}function rA(r,e){eA[r]=e}function aA(r){dt(_p,r)<0&&_p.push(r)}function nA(r,e){dy(mp,r,e,pB)}function LB(r){cy(\"afterinit\",r)}function IB(r){cy(\"afterupdate\",r)}function cy(r,e){mr.on(r,e)}function ta(r,e,t){J(e)&&(t=e,e=\"\");var a=et(r)?r.type:[r,r={event:e}][0];r.event=(r.event||a).toLowerCase(),e=r.event,!Os[e]&&(Me(q1.test(a)&&q1.test(e)),Vf[a]||(Vf[a]={action:t,actionInfo:r}),Os[e]=a)}function PB(r,e){Ml.register(r,e)}function RB(r,e){dy(zf,r,e,UT,\"layout\")}function Ai(r,e){dy(zf,r,e,YT,\"visual\")}var a_=[];function dy(r,e,t,a,n){if((J(e)||et(e))&&(t=e,e=a),!(dt(a_,t)>=0)){a_.push(t);var i=kT.wrapStageHandler(t,n);i.__prio=e,i.__raw=t,r.push(i)}}function iA(r,e){Sp[r]=e}function EB(r,e,t){var a=fB(\"registerMap\");a&&a(r,e,t)}var kB=WO;Ai(fy,d4);Ai(Vh,p4);Ai(Vh,g4);Ai(fy,P4);Ai(Vh,R4);Ai(ZT,sB);aA(oT);nA(cB,bO);iA(\"default\",y4);ta({type:oi,event:oi,update:oi},Kt);ta({type:ef,event:ef,update:ef},Kt);ta({type:Is,event:Is,update:Is},Kt);ta({type:rf,event:rf,update:rf},Kt);ta({type:Ps,event:Ps,update:Ps},Kt);rA(\"light\",M4);rA(\"dark\",L4);function Qo(r){return r==null?0:r.length||1}function n_(r){return r}var OB=function(){function r(e,t,a,n,i,o){this._old=e,this._new=t,this._oldKeyGetter=a||n_,this._newKeyGetter=n||n_,this.context=i,this._diffModeMultiple=o===\"multiple\"}return r.prototype.add=function(e){return this._add=e,this},r.prototype.update=function(e){return this._update=e,this},r.prototype.updateManyToOne=function(e){return this._updateManyToOne=e,this},r.prototype.updateOneToMany=function(e){return this._updateOneToMany=e,this},r.prototype.updateManyToMany=function(e){return this._updateManyToMany=e,this},r.prototype.remove=function(e){return this._remove=e,this},r.prototype.execute=function(){this[this._diffModeMultiple?\"_executeMultiple\":\"_executeOneToOne\"]()},r.prototype._executeOneToOne=function(){var e=this._old,t=this._new,a={},n=new Array(e.length),i=new Array(t.length);this._initIndexMap(e,null,n,\"_oldKeyGetter\"),this._initIndexMap(t,a,i,\"_newKeyGetter\");for(var o=0;o<e.length;o++){var s=n[o],l=a[s],u=Qo(l);if(u>1){var f=l.shift();l.length===1&&(a[s]=l[0]),this._update&&this._update(f,o)}else u===1?(a[s]=null,this._update&&this._update(l,o)):this._remove&&this._remove(o)}this._performRestAdd(i,a)},r.prototype._executeMultiple=function(){var e=this._old,t=this._new,a={},n={},i=[],o=[];this._initIndexMap(e,a,i,\"_oldKeyGetter\"),this._initIndexMap(t,n,o,\"_newKeyGetter\");for(var s=0;s<i.length;s++){var l=i[s],u=a[l],f=n[l],h=Qo(u),v=Qo(f);if(h>1&&v===1)this._updateManyToOne&&this._updateManyToOne(f,u),n[l]=null;else if(h===1&&v>1)this._updateOneToMany&&this._updateOneToMany(f,u),n[l]=null;else if(h===1&&v===1)this._update&&this._update(f,u),n[l]=null;else if(h>1&&v>1)this._updateManyToMany&&this._updateManyToMany(f,u),n[l]=null;else if(h>1)for(var c=0;c<h;c++)this._remove&&this._remove(u[c]);else this._remove&&this._remove(u)}this._performRestAdd(o,n)},r.prototype._performRestAdd=function(e,t){for(var a=0;a<e.length;a++){var n=e[a],i=t[n],o=Qo(i);if(o>1)for(var s=0;s<o;s++)this._add&&this._add(i[s]);else o===1&&this._add&&this._add(i);t[n]=null}},r.prototype._initIndexMap=function(e,t,a,n){for(var i=this._diffModeMultiple,o=0;o<e.length;o++){var s=\"_ec_\"+this[n](e[o],o);if(i||(a[o]=s),!!t){var l=t[s],u=Qo(l);u===0?(t[s]=o,i&&a.push(s)):u===1?t[s]=[l,o]:l.push(o)}}},r}(),xa=OB,BB=function(){function r(e,t){this._encode=e,this._schema=t}return r.prototype.get=function(){return{fullDimensions:this._getFullDimensionNames(),encode:this._encode}},r.prototype._getFullDimensionNames=function(){return this._cachedDimNames||(this._cachedDimNames=this._schema?this._schema.makeOutputDimensionNames():[]),this._cachedDimNames},r}();function NB(r,e){var t={},a=t.encode={},n=q(),i=[],o=[],s={};A(r.dimensions,function(v){var c=r.getDimensionInfo(v),d=c.coordDim;if(d){var p=c.coordDimIndex;ec(a,d)[p]=v,c.isExtraCoord||(n.set(d,1),VB(c.type)&&(i[0]=v),ec(s,d)[p]=r.getDimensionIndex(c.name)),c.defaultTooltip&&o.push(v)}qC.each(function(g,y){var m=ec(a,y),_=c.otherDims[y];_!=null&&_!==!1&&(m[_]=c.name)})});var l=[],u={};n.each(function(v,c){var d=a[c];u[c]=d[0],l=l.concat(d)}),t.dataDimsOnCoord=l,t.dataDimIndicesOnCoord=G(l,function(v){return r.getDimensionInfo(v).storeDimIndex}),t.encodeFirstDimNotExtra=u;var f=a.label;f&&f.length&&(i=f.slice());var h=a.tooltip;return h&&h.length?o=h.slice():o.length||(o=i.slice()),a.defaultedLabel=i,a.defaultedTooltip=o,t.userOutput=new BB(s,e),t}function ec(r,e){return r.hasOwnProperty(e)||(r[e]=[]),r[e]}function Ff(r){return r===\"category\"?\"ordinal\":r===\"time\"?\"time\":\"float\"}function VB(r){return!(r===\"ordinal\"||r===\"time\")}var zB=function(){function r(e){this.otherDims={},e!=null&&V(this,e)}return r}(),lf=zB,FB=Ct(),GB={float:\"f\",int:\"i\",ordinal:\"o\",number:\"n\",time:\"t\"},oA=function(){function r(e){this.dimensions=e.dimensions,this._dimOmitted=e.dimensionOmitted,this.source=e.source,this._fullDimCount=e.fullDimensionCount,this._updateDimOmitted(e.dimensionOmitted)}return r.prototype.isDimensionOmitted=function(){return this._dimOmitted},r.prototype._updateDimOmitted=function(e){this._dimOmitted=e,e&&(this._dimNameMap||(this._dimNameMap=uA(this.source)))},r.prototype.getSourceDimensionIndex=function(e){return ft(this._dimNameMap.get(e),-1)},r.prototype.getSourceDimension=function(e){var t=this.source.dimensionsDefine;if(t)return t[e]},r.prototype.makeStoreSchema=function(){for(var e=this._fullDimCount,t=lT(this.source),a=!fA(e),n=\"\",i=[],o=0,s=0;o<e;o++){var l=void 0,u=void 0,f=void 0,h=this.dimensions[s];if(h&&h.storeDimIndex===o)l=t?h.name:null,u=h.type,f=h.ordinalMeta,s++;else{var v=this.getSourceDimension(o);v&&(l=t?v.name:null,u=v.type)}i.push({property:l,type:u,ordinalMeta:f}),t&&l!=null&&(!h||!h.isCalculationCoord)&&(n+=a?l.replace(/\\`/g,\"`1\").replace(/\\$/g,\"`2\"):l),n+=\"$\",n+=GB[u]||\"f\",f&&(n+=f.uid),n+=\"$\"}var c=this.source,d=[c.seriesLayoutBy,c.startIndex,n].join(\"$$\");return{dimensions:i,hash:d}},r.prototype.makeOutputDimensionNames=function(){for(var e=[],t=0,a=0;t<this._fullDimCount;t++){var n=void 0,i=this.dimensions[a];if(i&&i.storeDimIndex===t)i.isCalculationCoord||(n=i.name),a++;else{var o=this.getSourceDimension(t);o&&(n=o.name)}e.push(n)}return e},r.prototype.appendCalculationDimension=function(e){this.dimensions.push(e),e.isCalculationCoord=!0,this._fullDimCount++,this._updateDimOmitted(!0)},r}();function sA(r){return r instanceof oA}function lA(r){for(var e=q(),t=0;t<(r||[]).length;t++){var a=r[t],n=et(a)?a.name:a;n!=null&&e.get(n)==null&&e.set(n,t)}return e}function uA(r){var e=FB(r);return e.dimNameMap||(e.dimNameMap=lA(r.dimensionsDefine))}function fA(r){return r>30}var jo=et,Ea=G,HB=typeof Int32Array==\"undefined\"?Array:Int32Array,WB=\"e\\0\\0\",i_=-1,$B=[\"hasItemOption\",\"_nameList\",\"_idList\",\"_invertedIndicesMap\",\"_dimSummary\",\"userOutput\",\"_rawData\",\"_dimValueGetter\",\"_nameDimIdx\",\"_idDimIdx\",\"_nameRepeatCount\"],UB=[\"_approximateExtent\"],o_,pu,ts,es,rc,gu,ac,YB=function(){function r(e,t){this.type=\"list\",this._dimOmitted=!1,this._nameList=[],this._idList=[],this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._approximateExtent={},this._calculationInfo={},this.hasItemOption=!1,this.TRANSFERABLE_METHODS=[\"cloneShallow\",\"downSample\",\"lttbDownSample\",\"map\"],this.CHANGABLE_METHODS=[\"filterSelf\",\"selectRange\"],this.DOWNSAMPLE_METHODS=[\"downSample\",\"lttbDownSample\"];var a,n=!1;sA(e)?(a=e.dimensions,this._dimOmitted=e.isDimensionOmitted(),this._schema=e):(n=!0,a=e),a=a||[\"x\",\"y\"];for(var i={},o=[],s={},l=!1,u={},f=0;f<a.length;f++){var h=a[f],v=U(h)?new lf({name:h}):h instanceof lf?h:new lf(h),c=v.name;v.type=v.type||\"float\",v.coordDim||(v.coordDim=c,v.coordDimIndex=0);var d=v.otherDims=v.otherDims||{};o.push(c),i[c]=v,u[c]!=null&&(l=!0),v.createInvertedIndices&&(s[c]=[]),d.itemName===0&&(this._nameDimIdx=f),d.itemId===0&&(this._idDimIdx=f),n&&(v.storeDimIndex=f)}if(this.dimensions=o,this._dimInfos=i,this._initGetDimensionInfo(l),this.hostModel=t,this._invertedIndicesMap=s,this._dimOmitted){var p=this._dimIdxToName=q();A(o,function(g){p.set(i[g].storeDimIndex,g)})}}return r.prototype.getDimension=function(e){var t=this._recognizeDimIndex(e);if(t==null)return e;if(t=e,!this._dimOmitted)return this.dimensions[t];var a=this._dimIdxToName.get(t);if(a!=null)return a;var n=this._schema.getSourceDimension(t);if(n)return n.name},r.prototype.getDimensionIndex=function(e){var t=this._recognizeDimIndex(e);if(t!=null)return t;if(e==null)return-1;var a=this._getDimInfo(e);return a?a.storeDimIndex:this._dimOmitted?this._schema.getSourceDimensionIndex(e):-1},r.prototype._recognizeDimIndex=function(e){if(Mt(e)||e!=null&&!isNaN(e)&&!this._getDimInfo(e)&&(!this._dimOmitted||this._schema.getSourceDimensionIndex(e)<0))return+e},r.prototype._getStoreDimIndex=function(e){var t=this.getDimensionIndex(e);return t},r.prototype.getDimensionInfo=function(e){return this._getDimInfo(this.getDimension(e))},r.prototype._initGetDimensionInfo=function(e){var t=this._dimInfos;this._getDimInfo=e?function(a){return t.hasOwnProperty(a)?t[a]:void 0}:function(a){return t[a]}},r.prototype.getDimensionsOnCoord=function(){return this._dimSummary.dataDimsOnCoord.slice()},r.prototype.mapDimension=function(e,t){var a=this._dimSummary;if(t==null)return a.encodeFirstDimNotExtra[e];var n=a.encode[e];return n?n[t]:null},r.prototype.mapDimensionsAll=function(e){var t=this._dimSummary,a=t.encode[e];return(a||[]).slice()},r.prototype.getStore=function(){return this._store},r.prototype.initData=function(e,t,a){var n=this,i;if(e instanceof hp&&(i=e),!i){var o=this.dimensions,s=ty(e)||Se(e)?new uT(e,o.length):e;i=new hp;var l=Ea(o,function(u){return{type:n._dimInfos[u].type,property:u}});i.initData(s,l,a)}this._store=i,this._nameList=(t||[]).slice(),this._idList=[],this._nameRepeatCount={},this._doInit(0,i.count()),this._dimSummary=NB(this,this._schema),this.userOutput=this._dimSummary.userOutput},r.prototype.appendData=function(e){var t=this._store.appendData(e);this._doInit(t[0],t[1])},r.prototype.appendValues=function(e,t){var a=this._store.appendValues(e,t.length),n=a.start,i=a.end,o=this._shouldMakeIdFromName();if(this._updateOrdinalMeta(),t)for(var s=n;s<i;s++){var l=s-n;this._nameList[s]=t[l],o&&ac(this,s)}},r.prototype._updateOrdinalMeta=function(){for(var e=this._store,t=this.dimensions,a=0;a<t.length;a++){var n=this._dimInfos[t[a]];n.ordinalMeta&&e.collectOrdinalMeta(n.storeDimIndex,n.ordinalMeta)}},r.prototype._shouldMakeIdFromName=function(){var e=this._store.getProvider();return this._idDimIdx==null&&e.getSource().sourceFormat!==Ja&&!e.fillStorage},r.prototype._doInit=function(e,t){if(!(e>=t)){var a=this._store,n=a.getProvider();this._updateOrdinalMeta();var i=this._nameList,o=this._idList,s=n.getSource().sourceFormat,l=s===vr;if(l&&!n.pure)for(var u=[],f=e;f<t;f++){var h=n.getItem(f,u);if(!this.hasItemOption&&hk(h)&&(this.hasItemOption=!0),h){var v=h.name;i[f]==null&&v!=null&&(i[f]=ee(v,null));var c=h.id;o[f]==null&&c!=null&&(o[f]=ee(c,null))}}if(this._shouldMakeIdFromName())for(var f=e;f<t;f++)ac(this,f);o_(this)}},r.prototype.getApproximateExtent=function(e){return this._approximateExtent[e]||this._store.getDataExtent(this._getStoreDimIndex(e))},r.prototype.setApproximateExtent=function(e,t){t=this.getDimension(t),this._approximateExtent[t]=e.slice()},r.prototype.getCalculationInfo=function(e){return this._calculationInfo[e]},r.prototype.setCalculationInfo=function(e,t){jo(e)?V(this._calculationInfo,e):this._calculationInfo[e]=t},r.prototype.getName=function(e){var t=this.getRawIndex(e),a=this._nameList[t];return a==null&&this._nameDimIdx!=null&&(a=ts(this,this._nameDimIdx,t)),a==null&&(a=\"\"),a},r.prototype._getCategory=function(e,t){var a=this._store.get(e,t),n=this._store.getOrdinalMeta(e);return n?n.categories[a]:a},r.prototype.getId=function(e){return pu(this,this.getRawIndex(e))},r.prototype.count=function(){return this._store.count()},r.prototype.get=function(e,t){var a=this._store,n=this._dimInfos[e];if(n)return a.get(n.storeDimIndex,t)},r.prototype.getByRawIndex=function(e,t){var a=this._store,n=this._dimInfos[e];if(n)return a.getByRawIndex(n.storeDimIndex,t)},r.prototype.getIndices=function(){return this._store.getIndices()},r.prototype.getDataExtent=function(e){return this._store.getDataExtent(this._getStoreDimIndex(e))},r.prototype.getSum=function(e){return this._store.getSum(this._getStoreDimIndex(e))},r.prototype.getMedian=function(e){return this._store.getMedian(this._getStoreDimIndex(e))},r.prototype.getValues=function(e,t){var a=this,n=this._store;return F(e)?n.getValues(Ea(e,function(i){return a._getStoreDimIndex(i)}),t):n.getValues(e)},r.prototype.hasValue=function(e){for(var t=this._dimSummary.dataDimIndicesOnCoord,a=0,n=t.length;a<n;a++)if(isNaN(this._store.get(t[a],e)))return!1;return!0},r.prototype.indexOfName=function(e){for(var t=0,a=this._store.count();t<a;t++)if(this.getName(t)===e)return t;return-1},r.prototype.getRawIndex=function(e){return this._store.getRawIndex(e)},r.prototype.indexOfRawIndex=function(e){return this._store.indexOfRawIndex(e)},r.prototype.rawIndexOf=function(e,t){var a=e&&this._invertedIndicesMap[e],n=a[t];return n==null||isNaN(n)?i_:n},r.prototype.indicesOfNearest=function(e,t,a){return this._store.indicesOfNearest(this._getStoreDimIndex(e),t,a)},r.prototype.each=function(e,t,a){J(e)&&(a=t,t=e,e=[]);var n=a||this,i=Ea(es(e),this._getStoreDimIndex,this);this._store.each(i,n?Y(t,n):t)},r.prototype.filterSelf=function(e,t,a){J(e)&&(a=t,t=e,e=[]);var n=a||this,i=Ea(es(e),this._getStoreDimIndex,this);return this._store=this._store.filter(i,n?Y(t,n):t),this},r.prototype.selectRange=function(e){var t=this,a={},n=St(e);return A(n,function(i){var o=t._getStoreDimIndex(i);a[o]=e[i]}),this._store=this._store.selectRange(a),this},r.prototype.mapArray=function(e,t,a){J(e)&&(a=t,t=e,e=[]),a=a||this;var n=[];return this.each(e,function(){n.push(t&&t.apply(this,arguments))},a),n},r.prototype.map=function(e,t,a,n){var i=a||n||this,o=Ea(es(e),this._getStoreDimIndex,this),s=gu(this);return s._store=this._store.map(o,i?Y(t,i):t),s},r.prototype.modify=function(e,t,a,n){var i=a||n||this,o=Ea(es(e),this._getStoreDimIndex,this);this._store.modify(o,i?Y(t,i):t)},r.prototype.downSample=function(e,t,a,n){var i=gu(this);return i._store=this._store.downSample(this._getStoreDimIndex(e),t,a,n),i},r.prototype.lttbDownSample=function(e,t){var a=gu(this);return a._store=this._store.lttbDownSample(this._getStoreDimIndex(e),t),a},r.prototype.getRawDataItem=function(e){return this._store.getRawDataItem(e)},r.prototype.getItemModel=function(e){var t=this.hostModel,a=this.getRawDataItem(e);return new Vt(a,t,t&&t.ecModel)},r.prototype.diff=function(e){var t=this;return new xa(e?e.getStore().getIndices():[],this.getStore().getIndices(),function(a){return pu(e,a)},function(a){return pu(t,a)})},r.prototype.getVisual=function(e){var t=this._visual;return t&&t[e]},r.prototype.setVisual=function(e,t){this._visual=this._visual||{},jo(e)?V(this._visual,e):this._visual[e]=t},r.prototype.getItemVisual=function(e,t){var a=this._itemVisuals[e],n=a&&a[t];return n==null?this.getVisual(t):n},r.prototype.hasItemVisual=function(){return this._itemVisuals.length>0},r.prototype.ensureUniqueItemVisual=function(e,t){var a=this._itemVisuals,n=a[e];n||(n=a[e]={});var i=n[t];return i==null&&(i=this.getVisual(t),F(i)?i=i.slice():jo(i)&&(i=V({},i)),n[t]=i),i},r.prototype.setItemVisual=function(e,t,a){var n=this._itemVisuals[e]||{};this._itemVisuals[e]=n,jo(t)?V(n,t):n[t]=a},r.prototype.clearAllVisual=function(){this._visual={},this._itemVisuals=[]},r.prototype.setLayout=function(e,t){jo(e)?V(this._layout,e):this._layout[e]=t},r.prototype.getLayout=function(e){return this._layout[e]},r.prototype.getItemLayout=function(e){return this._itemLayouts[e]},r.prototype.setItemLayout=function(e,t,a){this._itemLayouts[e]=a?V(this._itemLayouts[e]||{},t):t},r.prototype.clearItemLayouts=function(){this._itemLayouts.length=0},r.prototype.setItemGraphicEl=function(e,t){var a=this.hostModel&&this.hostModel.seriesIndex;Qd(a,this.dataType,e,t),this._graphicEls[e]=t},r.prototype.getItemGraphicEl=function(e){return this._graphicEls[e]},r.prototype.eachItemGraphicEl=function(e,t){A(this._graphicEls,function(a,n){a&&e&&e.call(t,a,n)})},r.prototype.cloneShallow=function(e){return e||(e=new r(this._schema?this._schema:Ea(this.dimensions,this._getDimInfo,this),this.hostModel)),rc(e,this),e._store=this._store,e},r.prototype.wrapMethod=function(e,t){var a=this[e];!J(a)||(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(e),this[e]=function(){var n=a.apply(this,arguments);return t.apply(this,[n].concat(Sg(arguments)))})},r.internalField=function(){o_=function(e){var t=e._invertedIndicesMap;A(t,function(a,n){var i=e._dimInfos[n],o=i.ordinalMeta,s=e._store;if(o){a=t[n]=new HB(o.categories.length);for(var l=0;l<a.length;l++)a[l]=i_;for(var l=0;l<s.count();l++)a[s.get(i.storeDimIndex,l)]=l}})},ts=function(e,t,a){return ee(e._getCategory(t,a),null)},pu=function(e,t){var a=e._idList[t];return a==null&&e._idDimIdx!=null&&(a=ts(e,e._idDimIdx,t)),a==null&&(a=WB+t),a},es=function(e){return F(e)||(e=e!=null?[e]:[]),e},gu=function(e){var t=new r(e._schema?e._schema:Ea(e.dimensions,e._getDimInfo,e),e.hostModel);return rc(t,e),t},rc=function(e,t){A($B.concat(t.__wrappedMethods||[]),function(a){t.hasOwnProperty(a)&&(e[a]=t[a])}),e.__wrappedMethods=t.__wrappedMethods,A(UB,function(a){e[a]=at(t[a])}),e._calculationInfo=V({},t._calculationInfo)},ac=function(e,t){var a=e._nameList,n=e._idList,i=e._nameDimIdx,o=e._idDimIdx,s=a[t],l=n[t];if(s==null&&i!=null&&(a[t]=s=ts(e,i,t)),l==null&&o!=null&&(n[t]=l=ts(e,o,t)),l==null&&s!=null){var u=e._nameRepeatCount,f=u[s]=(u[s]||0)+1;l=s,f>1&&(l+=\"__ec__\"+f),n[t]=l}}}(),r}(),De=YB;function Il(r,e){ty(r)||(r=ey(r)),e=e||{};var t=e.coordDimensions||[],a=e.dimensionsDefine||r.dimensionsDefine||[],n=q(),i=[],o=XB(r,t,a,e.dimensionsCount),s=e.canOmitUnusedDimensions&&fA(o),l=a===r.dimensionsDefine,u=l?uA(r):lA(a),f=e.encodeDefine;!f&&e.encodeDefaulter&&(f=e.encodeDefaulter(r,o));for(var h=q(f),v=new yT(o),c=0;c<v.length;c++)v[c]=-1;function d(T){var D=v[T];if(D<0){var M=a[T],L=et(M)?M:{name:M},I=new lf,P=L.name;P!=null&&u.get(P)!=null&&(I.name=I.displayName=P),L.type!=null&&(I.type=L.type),L.displayName!=null&&(I.displayName=L.displayName);var R=i.length;return v[T]=R,I.storeDimIndex=T,i.push(I),I}return i[D]}if(!s)for(var c=0;c<o;c++)d(c);h.each(function(T,D){var M=kt(T).slice();if(M.length===1&&!U(M[0])&&M[0]<0){h.set(D,!1);return}var L=h.set(D,[]);A(M,function(I,P){var R=U(I)?u.get(I):I;R!=null&&R<o&&(L[P]=R,g(d(R),D,P))})});var p=0;A(t,function(T){var D,M,L,I;if(U(T))D=T,I={};else{I=T,D=I.name;var P=I.ordinalMeta;I.ordinalMeta=null,I=V({},I),I.ordinalMeta=P,M=I.dimsDef,L=I.otherDims,I.name=I.coordDim=I.coordDimIndex=I.dimsDef=I.otherDims=null}var R=h.get(D);if(R!==!1){if(R=kt(R),!R.length)for(var E=0;E<(M&&M.length||1);E++){for(;p<o&&d(p).coordDim!=null;)p++;p<o&&R.push(p++)}A(R,function(B,O){var z=d(B);if(l&&I.type!=null&&(z.type=I.type),g(tt(z,I),D,O),z.name==null&&M){var H=M[O];!et(H)&&(H={name:H}),z.name=z.displayName=H.name,z.defaultTooltip=H.defaultTooltip}L&&tt(z.otherDims,L)})}});function g(T,D,M){qC.get(D)!=null?T.otherDims[D]=M:(T.coordDim=D,T.coordDimIndex=M,n.set(D,!0))}var y=e.generateCoord,m=e.generateCoordCount,_=m!=null;m=y?m||1:0;var S=y||\"value\";function w(T){T.name==null&&(T.name=T.coordDim)}if(s)A(i,function(T){w(T)}),i.sort(function(T,D){return T.storeDimIndex-D.storeDimIndex});else for(var x=0;x<o;x++){var b=d(x),C=b.coordDim;C==null&&(b.coordDim=qB(S,n,_),b.coordDimIndex=0,(!y||m<=0)&&(b.isExtraCoord=!0),m--),w(b),b.type==null&&(jC(r,x)===fe.Must||b.isExtraCoord&&(b.otherDims.itemName!=null||b.otherDims.seriesName!=null))&&(b.type=\"ordinal\")}return ZB(i),new oA({source:r,dimensions:i,fullDimensionCount:o,dimensionOmitted:s})}function ZB(r){for(var e=q(),t=0;t<r.length;t++){var a=r[t],n=a.name,i=e.get(n)||0;i>0&&(a.name=n+(i-1)),i++,e.set(n,i)}}function XB(r,e,t,a){var n=Math.max(r.dimensionsDetectedCount||1,e.length,t.length,a||0);return A(e,function(i){var o;et(i)&&(o=i.dimsDef)&&(n=Math.max(n,o.length))}),n}function qB(r,e,t){if(t||e.hasKey(r)){for(var a=0;e.hasKey(r+a);)a++;r+=a}return e.set(r,!0),r}var KB=function(){function r(e){this.coordSysDims=[],this.axisMap=q(),this.categoryAxisMap=q(),this.coordSysName=e}return r}();function JB(r){var e=r.get(\"coordinateSystem\"),t=new KB(e),a=QB[e];if(a)return a(r,t,t.axisMap,t.categoryAxisMap),t}var QB={cartesian2d:function(r,e,t,a){var n=r.getReferringComponents(\"xAxis\",Qt).models[0],i=r.getReferringComponents(\"yAxis\",Qt).models[0];e.coordSysDims=[\"x\",\"y\"],t.set(\"x\",n),t.set(\"y\",i),Gi(n)&&(a.set(\"x\",n),e.firstCategoryDimIndex=0),Gi(i)&&(a.set(\"y\",i),e.firstCategoryDimIndex==null&&(e.firstCategoryDimIndex=1))},singleAxis:function(r,e,t,a){var n=r.getReferringComponents(\"singleAxis\",Qt).models[0];e.coordSysDims=[\"single\"],t.set(\"single\",n),Gi(n)&&(a.set(\"single\",n),e.firstCategoryDimIndex=0)},polar:function(r,e,t,a){var n=r.getReferringComponents(\"polar\",Qt).models[0],i=n.findAxisModel(\"radiusAxis\"),o=n.findAxisModel(\"angleAxis\");e.coordSysDims=[\"radius\",\"angle\"],t.set(\"radius\",i),t.set(\"angle\",o),Gi(i)&&(a.set(\"radius\",i),e.firstCategoryDimIndex=0),Gi(o)&&(a.set(\"angle\",o),e.firstCategoryDimIndex==null&&(e.firstCategoryDimIndex=1))},geo:function(r,e,t,a){e.coordSysDims=[\"lng\",\"lat\"]},parallel:function(r,e,t,a){var n=r.ecModel,i=n.getComponent(\"parallel\",r.get(\"parallelIndex\")),o=e.coordSysDims=i.dimensions.slice();A(i.parallelAxisIndex,function(s,l){var u=n.getComponent(\"parallelAxis\",s),f=o[l];t.set(f,u),Gi(u)&&(a.set(f,u),e.firstCategoryDimIndex==null&&(e.firstCategoryDimIndex=l))})}};function Gi(r){return r.get(\"type\")===\"category\"}function jB(r,e,t){t=t||{};var a=t.byIndex,n=t.stackedCoordDimension,i,o,s;tN(e)?i=e:(o=e.schema,i=o.dimensions,s=e.store);var l=!!(r&&r.get(\"stack\")),u,f,h,v;if(A(i,function(m,_){U(m)&&(i[_]=m={name:m}),l&&!m.isExtraCoord&&(!a&&!u&&m.ordinalMeta&&(u=m),!f&&m.type!==\"ordinal\"&&m.type!==\"time\"&&(!n||n===m.coordDim)&&(f=m))}),f&&!a&&!u&&(a=!0),f){h=\"__\\0ecstackresult_\"+r.id,v=\"__\\0ecstackedover_\"+r.id,u&&(u.createInvertedIndices=!0);var c=f.coordDim,d=f.type,p=0;A(i,function(m){m.coordDim===c&&p++});var g={name:h,coordDim:c,coordDimIndex:p,type:d,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length},y={name:v,coordDim:v,coordDimIndex:p+1,type:d,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:i.length+1};o?(s&&(g.storeDimIndex=s.ensureCalculationDimension(v,d),y.storeDimIndex=s.ensureCalculationDimension(h,d)),o.appendCalculationDimension(g),o.appendCalculationDimension(y)):(i.push(g),i.push(y))}return{stackedDimension:f&&f.name,stackedByDimension:u&&u.name,isStackedByIndex:a,stackedOverDimension:v,stackResultDimension:h}}function tN(r){return!sA(r.schema)}function nn(r,e){return!!e&&e===r.getCalculationInfo(\"stackedDimension\")}function hA(r,e){return nn(r,e)?r.getCalculationInfo(\"stackResultDimension\"):e}function eN(r,e){var t=r.get(\"coordinateSystem\"),a=Ml.get(t),n;return e&&e.coordSysDims&&(n=G(e.coordSysDims,function(i){var o={name:i},s=e.axisMap.get(i);if(s){var l=s.get(\"type\");o.type=Ff(l)}return o})),n||(n=a&&(a.getDimensionsInfo?a.getDimensionsInfo():a.dimensions.slice())||[\"x\",\"y\"]),n}function rN(r,e,t){var a,n;return t&&A(r,function(i,o){var s=i.coordDim,l=t.categoryAxisMap.get(s);l&&(a==null&&(a=o),i.ordinalMeta=l.getOrdinalMeta(),e&&(i.createInvertedIndices=!0)),i.otherDims.itemName!=null&&(n=!0)}),!n&&a!=null&&(r[a].otherDims.itemName=0),a}function Ta(r,e,t){t=t||{};var a=e.getSourceManager(),n,i=!1;r?(i=!0,n=ey(r)):(n=a.getSource(),i=n.sourceFormat===vr);var o=JB(e),s=eN(e,o),l=t.useEncodeDefaulter,u=J(l)?l:l?ot(QC,s,e):null,f={coordDimensions:s,generateCoord:t.generateCoord,encodeDefine:e.getEncode(),encodeDefaulter:u,canOmitUnusedDimensions:!i},h=Il(n,f),v=rN(h.dimensions,t.createInvertedIndices,o),c=i?null:a.getSharedDataStore(h),d=jB(e,{schema:h,store:c}),p=new De(h,e);p.setCalculationInfo(d);var g=v!=null&&aN(n)?function(y,m,_,S){return S===v?_:this.defaultDimValueGetter(y,m,_,S)}:null;return p.hasItemOption=!1,p.initData(i?n:c,null,g),p}function aN(r){if(r.sourceFormat===vr){var e=nN(r.data||[]);return!F(Co(e))}}function nN(r){for(var e=0;e<r.length&&r[e]==null;)e++;return r[e]}var vA=function(){function r(e){this._setting=e||{},this._extent=[1/0,-1/0]}return r.prototype.getSetting=function(e){return this._setting[e]},r.prototype.unionExtent=function(e){var t=this._extent;e[0]<t[0]&&(t[0]=e[0]),e[1]>t[1]&&(t[1]=e[1])},r.prototype.unionExtentFromData=function(e,t){this.unionExtent(e.getApproximateExtent(t))},r.prototype.getExtent=function(){return this._extent.slice()},r.prototype.setExtent=function(e,t){var a=this._extent;isNaN(e)||(a[0]=e),isNaN(t)||(a[1]=t)},r.prototype.isInExtentRange=function(e){return this._extent[0]<=e&&this._extent[1]>=e},r.prototype.isBlank=function(){return this._isBlank},r.prototype.setBlank=function(e){this._isBlank=e},r}();mh(vA);var Aa=vA,iN=0,oN=function(){function r(e){this.categories=e.categories||[],this._needCollect=e.needCollect,this._deduplication=e.deduplication,this.uid=++iN}return r.createByAxisModel=function(e){var t=e.option,a=t.data,n=a&&G(a,sN);return new r({categories:n,needCollect:!n,deduplication:t.dedplication!==!1})},r.prototype.getOrdinal=function(e){return this._getOrCreateMap().get(e)},r.prototype.parseAndCollect=function(e){var t,a=this._needCollect;if(!U(e)&&!a)return e;if(a&&!this._deduplication)return t=this.categories.length,this.categories[t]=e,t;var n=this._getOrCreateMap();return t=n.get(e),t==null&&(a?(t=this.categories.length,this.categories[t]=e,n.set(e,t)):t=NaN),t},r.prototype._getOrCreateMap=function(){return this._map||(this._map=q(this.categories))},r}();function sN(r){return et(r)&&r.value!=null?r.value:r+\"\"}var xp=oN;function wp(r){return r.type===\"interval\"||r.type===\"log\"}function lN(r,e,t,a){var n={},i=r[1]-r[0],o=n.interval=w2(i/e,!0);t!=null&&o<t&&(o=n.interval=t),a!=null&&o>a&&(o=n.interval=a);var s=n.intervalPrecision=cA(o),l=n.niceTickExtent=[Zt(Math.ceil(r[0]/o)*o,s),Zt(Math.floor(r[1]/o)*o,s)];return uN(l,r),n}function nc(r){var e=Math.pow(10,Lg(r)),t=r/e;return t?t===2?t=3:t===3?t=5:t*=2:t=1,Zt(t*e)}function cA(r){return Gr(r)+2}function s_(r,e,t){r[e]=Math.max(Math.min(r[e],t[1]),t[0])}function uN(r,e){!isFinite(r[0])&&(r[0]=e[0]),!isFinite(r[1])&&(r[1]=e[1]),s_(r,0,e),s_(r,1,e),r[0]>r[1]&&(r[0]=r[1])}function zh(r,e){return r>=e[0]&&r<=e[1]}function Fh(r,e){return e[1]===e[0]?.5:(r-e[0])/(e[1]-e[0])}function Gh(r,e){return r*(e[1]-e[0])+e[0]}var dA=function(r){k(e,r);function e(t){var a=r.call(this,t)||this;a.type=\"ordinal\";var n=a.getSetting(\"ordinalMeta\");return n||(n=new xp({})),F(n)&&(n=new xp({categories:G(n,function(i){return et(i)?i.value:i})})),a._ordinalMeta=n,a._extent=a.getSetting(\"extent\")||[0,n.categories.length-1],a}return e.prototype.parse=function(t){return t==null?NaN:U(t)?this._ordinalMeta.getOrdinal(t):Math.round(t)},e.prototype.contain=function(t){return t=this.parse(t),zh(t,this._extent)&&this._ordinalMeta.categories[t]!=null},e.prototype.normalize=function(t){return t=this._getTickNumber(this.parse(t)),Fh(t,this._extent)},e.prototype.scale=function(t){return t=Math.round(Gh(t,this._extent)),this.getRawOrdinalNumber(t)},e.prototype.getTicks=function(){for(var t=[],a=this._extent,n=a[0];n<=a[1];)t.push({value:n}),n++;return t},e.prototype.getMinorTicks=function(t){},e.prototype.setSortInfo=function(t){if(t==null){this._ordinalNumbersByTick=this._ticksByOrdinalNumber=null;return}for(var a=t.ordinalNumbers,n=this._ordinalNumbersByTick=[],i=this._ticksByOrdinalNumber=[],o=0,s=this._ordinalMeta.categories.length,l=Math.min(s,a.length);o<l;++o){var u=a[o];n[o]=u,i[u]=o}for(var f=0;o<s;++o){for(;i[f]!=null;)f++;n.push(f),i[f]=o}},e.prototype._getTickNumber=function(t){var a=this._ticksByOrdinalNumber;return a&&t>=0&&t<a.length?a[t]:t},e.prototype.getRawOrdinalNumber=function(t){var a=this._ordinalNumbersByTick;return a&&t>=0&&t<a.length?a[t]:t},e.prototype.getLabel=function(t){if(!this.isBlank()){var a=this.getRawOrdinalNumber(t.value),n=this._ordinalMeta.categories[a];return n==null?\"\":n+\"\"}},e.prototype.count=function(){return this._extent[1]-this._extent[0]+1},e.prototype.unionExtentFromData=function(t,a){this.unionExtent(t.getApproximateExtent(a))},e.prototype.isInExtentRange=function(t){return t=this._getTickNumber(t),this._extent[0]<=t&&this._extent[1]>=t},e.prototype.getOrdinalMeta=function(){return this._ordinalMeta},e.prototype.calcNiceTicks=function(){},e.prototype.calcNiceExtent=function(){},e.type=\"ordinal\",e}(Aa);Aa.registerClass(dA);var py=dA,En=Zt,pA=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=\"interval\",t._interval=0,t._intervalPrecision=2,t}return e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return zh(t,this._extent)},e.prototype.normalize=function(t){return Fh(t,this._extent)},e.prototype.scale=function(t){return Gh(t,this._extent)},e.prototype.setExtent=function(t,a){var n=this._extent;isNaN(t)||(n[0]=parseFloat(t)),isNaN(a)||(n[1]=parseFloat(a))},e.prototype.unionExtent=function(t){var a=this._extent;t[0]<a[0]&&(a[0]=t[0]),t[1]>a[1]&&(a[1]=t[1]),this.setExtent(a[0],a[1])},e.prototype.getInterval=function(){return this._interval},e.prototype.setInterval=function(t){this._interval=t,this._niceExtent=this._extent.slice(),this._intervalPrecision=cA(t)},e.prototype.getTicks=function(t){var a=this._interval,n=this._extent,i=this._niceExtent,o=this._intervalPrecision,s=[];if(!a)return s;var l=1e4;n[0]<i[0]&&(t?s.push({value:En(i[0]-a,o)}):s.push({value:n[0]}));for(var u=i[0];u<=i[1]&&(s.push({value:u}),u=En(u+a,o),u!==s[s.length-1].value);)if(s.length>l)return[];var f=s.length?s[s.length-1].value:i[1];return n[1]>f&&(t?s.push({value:En(f+a,o)}):s.push({value:n[1]})),s},e.prototype.getMinorTicks=function(t){for(var a=this.getTicks(!0),n=[],i=this.getExtent(),o=1;o<a.length;o++){for(var s=a[o],l=a[o-1],u=0,f=[],h=s.value-l.value,v=h/t;u<t-1;){var c=En(l.value+(u+1)*v);c>i[0]&&c<i[1]&&f.push(c),u++}n.push(f)}return n},e.prototype.getLabel=function(t,a){if(t==null)return\"\";var n=a&&a.precision;n==null?n=Gr(t.value)||0:n===\"auto\"&&(n=this._intervalPrecision);var i=En(t.value,n,!0);return WC(i)},e.prototype.calcNiceTicks=function(t,a,n){t=t||5;var i=this._extent,o=i[1]-i[0];if(!!isFinite(o)){o<0&&(o=-o,i.reverse());var s=lN(i,t,a,n);this._intervalPrecision=s.intervalPrecision,this._interval=s.interval,this._niceExtent=s.niceTickExtent}},e.prototype.calcNiceExtent=function(t){var a=this._extent;if(a[0]===a[1])if(a[0]!==0){var n=Math.abs(a[0]);t.fixMax||(a[1]+=n/2),a[0]-=n/2}else a[1]=1;var i=a[1]-a[0];isFinite(i)||(a[0]=0,a[1]=1),this.calcNiceTicks(t.splitNumber,t.minInterval,t.maxInterval);var o=this._interval;t.fixMin||(a[0]=En(Math.floor(a[0]/o)*o)),t.fixMax||(a[1]=En(Math.ceil(a[1]/o)*o))},e.prototype.setNiceExtent=function(t,a){this._niceExtent=[t,a]},e.type=\"interval\",e}(Aa);Aa.registerClass(pA);var on=pA,gA=typeof Float32Array!=\"undefined\",fN=gA?Float32Array:Array;function Wr(r){return F(r)?gA?new Float32Array(r):r:new fN(r)}var bp=\"__ec_stack_\";function gy(r){return r.get(\"stack\")||bp+r.seriesIndex}function yy(r){return r.dim+r.index}function hN(r){var e=[],t=r.axis,a=\"axis0\";if(t.type===\"category\"){for(var n=t.getBandWidth(),i=0;i<r.count;i++)e.push(tt({bandWidth:n,axisKey:a,stackId:bp+i},r));for(var o=_A(e),s=[],i=0;i<r.count;i++){var l=o[a][bp+i];l.offsetCenter=l.offset+l.width/2,s.push(l)}return s}}function yA(r,e){var t=[];return e.eachSeriesByType(r,function(a){wA(a)&&t.push(a)}),t}function vN(r){var e={};A(r,function(l){var u=l.coordinateSystem,f=u.getBaseAxis();if(!(f.type!==\"time\"&&f.type!==\"value\"))for(var h=l.getData(),v=f.dim+\"_\"+f.index,c=h.getDimensionIndex(h.mapDimension(f.dim)),d=h.getStore(),p=0,g=d.count();p<g;++p){var y=d.get(c,p);e[v]?e[v].push(y):e[v]=[y]}});var t={};for(var a in e)if(e.hasOwnProperty(a)){var n=e[a];if(n){n.sort(function(l,u){return l-u});for(var i=null,o=1;o<n.length;++o){var s=n[o]-n[o-1];s>0&&(i=i===null?s:Math.min(i,s))}t[a]=i}}return t}function mA(r){var e=vN(r),t=[];return A(r,function(a){var n=a.coordinateSystem,i=n.getBaseAxis(),o=i.getExtent(),s;if(i.type===\"category\")s=i.getBandWidth();else if(i.type===\"value\"||i.type===\"time\"){var l=i.dim+\"_\"+i.index,u=e[l],f=Math.abs(o[1]-o[0]),h=i.scale.getExtent(),v=Math.abs(h[1]-h[0]);s=u?f/v*u:f}else{var c=a.getData();s=Math.abs(o[1]-o[0])/c.count()}var d=W(a.get(\"barWidth\"),s),p=W(a.get(\"barMaxWidth\"),s),g=W(a.get(\"barMinWidth\")||(bA(a)?.5:1),s),y=a.get(\"barGap\"),m=a.get(\"barCategoryGap\");t.push({bandWidth:s,barWidth:d,barMaxWidth:p,barMinWidth:g,barGap:y,barCategoryGap:m,axisKey:yy(i),stackId:gy(a)})}),_A(t)}function _A(r){var e={};A(r,function(a,n){var i=a.axisKey,o=a.bandWidth,s=e[i]||{bandWidth:o,remainedWidth:o,autoWidthCount:0,categoryGap:null,gap:\"20%\",stacks:{}},l=s.stacks;e[i]=s;var u=a.stackId;l[u]||s.autoWidthCount++,l[u]=l[u]||{width:0,maxWidth:0};var f=a.barWidth;f&&!l[u].width&&(l[u].width=f,f=Math.min(s.remainedWidth,f),s.remainedWidth-=f);var h=a.barMaxWidth;h&&(l[u].maxWidth=h);var v=a.barMinWidth;v&&(l[u].minWidth=v);var c=a.barGap;c!=null&&(s.gap=c);var d=a.barCategoryGap;d!=null&&(s.categoryGap=d)});var t={};return A(e,function(a,n){t[n]={};var i=a.stacks,o=a.bandWidth,s=a.categoryGap;if(s==null){var l=St(i).length;s=Math.max(35-l*4,15)+\"%\"}var u=W(s,o),f=W(a.gap,1),h=a.remainedWidth,v=a.autoWidthCount,c=(h-u)/(v+(v-1)*f);c=Math.max(c,0),A(i,function(y){var m=y.maxWidth,_=y.minWidth;if(y.width){var S=y.width;m&&(S=Math.min(S,m)),_&&(S=Math.max(S,_)),y.width=S,h-=S+f*S,v--}else{var S=c;m&&m<S&&(S=Math.min(m,h)),_&&_>S&&(S=_),S!==c&&(y.width=S,h-=S+f*S,v--)}}),c=(h-u)/(v+(v-1)*f),c=Math.max(c,0);var d=0,p;A(i,function(y,m){y.width||(y.width=c),p=y,d+=y.width*(1+f)}),p&&(d-=p.width*f);var g=-d/2;A(i,function(y,m){t[n][m]=t[n][m]||{bandWidth:o,offset:g,width:y.width},g+=y.width*(1+f)})}),t}function cN(r,e,t){if(r&&e){var a=r[yy(e)];return a!=null&&t!=null?a[gy(t)]:a}}function SA(r,e){var t=yA(r,e),a=mA(t);A(t,function(n){var i=n.getData(),o=n.coordinateSystem,s=o.getBaseAxis(),l=gy(n),u=a[yy(s)][l],f=u.offset,h=u.width;i.setLayout({bandWidth:u.bandWidth,offset:f,size:h})})}function xA(r){return{seriesType:r,plan:ko(),reset:function(e){if(!!wA(e)){var t=e.getData(),a=e.coordinateSystem,n=a.getBaseAxis(),i=a.getOtherAxis(n),o=t.getDimensionIndex(t.mapDimension(i.dim)),s=t.getDimensionIndex(t.mapDimension(n.dim)),l=e.get(\"showBackground\",!0),u=t.mapDimension(i.dim),f=t.getCalculationInfo(\"stackResultDimension\"),h=nn(t,u)&&!!t.getCalculationInfo(\"stackedOnSeries\"),v=i.isHorizontal(),c=dN(n,i),d=bA(e),p=e.get(\"barMinHeight\")||0,g=f&&t.getDimensionIndex(f),y=t.getLayout(\"size\"),m=t.getLayout(\"offset\");return{progress:function(_,S){for(var w=_.count,x=d&&Wr(w*3),b=d&&l&&Wr(w*3),C=d&&Wr(w),T=a.master.getRect(),D=v?T.width:T.height,M,L=S.getStore(),I=0;(M=_.next())!=null;){var P=L.get(h?g:o,M),R=L.get(s,M),E=c,B=void 0;h&&(B=+P-L.get(o,M));var O=void 0,z=void 0,H=void 0,$=void 0;if(v){var X=a.dataToPoint([P,R]);if(h){var Q=a.dataToPoint([B,R]);E=Q[0]}O=E,z=X[1]+m,H=X[0]-E,$=y,Math.abs(H)<p&&(H=(H<0?-1:1)*p)}else{var X=a.dataToPoint([R,P]);if(h){var Q=a.dataToPoint([R,B]);E=Q[1]}O=X[0]+m,z=E,H=y,$=X[1]-E,Math.abs($)<p&&($=($<=0?-1:1)*p)}d?(x[I]=O,x[I+1]=z,x[I+2]=v?H:$,b&&(b[I]=v?T.x:O,b[I+1]=v?z:T.y,b[I+2]=D),C[M]=M):S.setItemLayout(M,{x:O,y:z,width:H,height:$}),I+=3}d&&S.setLayout({largePoints:x,largeDataIndices:C,largeBackgroundPoints:b,valueAxisHorizontal:v})}}}}}}function wA(r){return r.coordinateSystem&&r.coordinateSystem.type===\"cartesian2d\"}function bA(r){return r.pipelineContext&&r.pipelineContext.large}function dN(r,e){return e.toGlobalCoord(e.dataToCoord(e.type===\"log\"?1:0))}var pN=function(r,e,t,a){for(;t<a;){var n=t+a>>>1;r[n][1]<e?t=n+1:a=n}return t},CA=function(r){k(e,r);function e(t){var a=r.call(this,t)||this;return a.type=\"time\",a}return e.prototype.getLabel=function(t){var a=this.getSetting(\"useUTC\");return Lh(t.value,Q0[F3(lo(this._minLevelUnit))]||Q0.second,a,this.getSetting(\"locale\"))},e.prototype.getFormattedLabel=function(t,a,n){var i=this.getSetting(\"useUTC\"),o=this.getSetting(\"locale\");return G3(t,a,n,o,i)},e.prototype.getTicks=function(){var t=this._interval,a=this._extent,n=[];if(!t)return n;n.push({value:a[0],level:0});var i=this.getSetting(\"useUTC\"),o=wN(this._minLevelUnit,this._approxInterval,i,a);return n=n.concat(o),n.push({value:a[1],level:0}),n},e.prototype.calcNiceExtent=function(t){var a=this._extent;if(a[0]===a[1]&&(a[0]-=ir,a[1]+=ir),a[1]===-1/0&&a[0]===1/0){var n=new Date;a[1]=+new Date(n.getFullYear(),n.getMonth(),n.getDate()),a[0]=a[1]-ir}this.calcNiceTicks(t.splitNumber,t.minInterval,t.maxInterval)},e.prototype.calcNiceTicks=function(t,a,n){t=t||10;var i=this._extent,o=i[1]-i[0];this._approxInterval=o/t,a!=null&&this._approxInterval<a&&(this._approxInterval=a),n!=null&&this._approxInterval>n&&(this._approxInterval=n);var s=yu.length,l=Math.min(pN(yu,this._approxInterval,0,s),s-1);this._interval=yu[l][1],this._minLevelUnit=yu[Math.max(l-1,0)][0]},e.prototype.parse=function(t){return Mt(t)?t:+Kr(t)},e.prototype.contain=function(t){return zh(this.parse(t),this._extent)},e.prototype.normalize=function(t){return Fh(this.parse(t),this._extent)},e.prototype.scale=function(t){return Gh(t,this._extent)},e.type=\"time\",e}(on),yu=[[\"second\",Zg],[\"minute\",Xg],[\"hour\",Es],[\"quarter-day\",Es*6],[\"half-day\",Es*12],[\"day\",ir*1.2],[\"half-week\",ir*3.5],[\"week\",ir*7],[\"month\",ir*31],[\"quarter\",ir*95],[\"half-year\",J0/2],[\"year\",J0]];function gN(r,e,t,a){var n=Kr(e),i=Kr(t),o=function(d){return j0(n,d,a)===j0(i,d,a)},s=function(){return o(\"year\")},l=function(){return s()&&o(\"month\")},u=function(){return l()&&o(\"day\")},f=function(){return u()&&o(\"hour\")},h=function(){return f()&&o(\"minute\")},v=function(){return h()&&o(\"second\")},c=function(){return v()&&o(\"millisecond\")};switch(r){case\"year\":return s();case\"month\":return l();case\"day\":return u();case\"hour\":return f();case\"minute\":return h();case\"second\":return v();case\"millisecond\":return c()}}function yN(r,e){return r/=ir,r>16?16:r>7.5?7:r>3.5?4:r>1.5?2:1}function mN(r){var e=30*ir;return r/=e,r>6?6:r>3?3:r>2?2:1}function _N(r){return r/=Es,r>12?12:r>6?6:r>3.5?4:r>2?2:1}function l_(r,e){return r/=e?Xg:Zg,r>30?30:r>20?20:r>15?15:r>10?10:r>5?5:r>2?2:1}function SN(r){return w2(r,!0)}function xN(r,e,t){var a=new Date(r);switch(lo(e)){case\"year\":case\"month\":a[NC(t)](0);case\"day\":a[VC(t)](1);case\"hour\":a[zC(t)](0);case\"minute\":a[FC(t)](0);case\"second\":a[GC(t)](0),a[HC(t)](0)}return a.getTime()}function wN(r,e,t,a){var n=1e4,i=OC,o=0;function s(D,M,L,I,P,R,E){for(var B=new Date(M),O=M,z=B[I]();O<L&&O<=a[1];)E.push({value:O}),z+=D,B[P](z),O=B.getTime();E.push({value:O,notAdd:!0})}function l(D,M,L){var I=[],P=!M.length;if(!gN(lo(D),a[0],a[1],t)){P&&(M=[{value:xN(new Date(a[0]),D,t)},{value:a[1]}]);for(var R=0;R<M.length-1;R++){var E=M[R].value,B=M[R+1].value;if(E!==B){var O=void 0,z=void 0,H=void 0,$=!1;switch(D){case\"year\":O=Math.max(1,Math.round(e/ir/365)),z=qg(t),H=H3(t);break;case\"half-year\":case\"quarter\":case\"month\":O=mN(e),z=uo(t),H=NC(t);break;case\"week\":case\"half-week\":case\"day\":O=yN(e),z=Ih(t),H=VC(t),$=!0;break;case\"half-day\":case\"quarter-day\":case\"hour\":O=_N(e),z=js(t),H=zC(t);break;case\"minute\":O=l_(e,!0),z=Ph(t),H=FC(t);break;case\"second\":O=l_(e,!1),z=Rh(t),H=GC(t);break;case\"millisecond\":O=SN(e),z=Eh(t),H=HC(t);break}s(O,E,B,z,H,$,I),D===\"year\"&&L.length>1&&R===0&&L.unshift({value:L[0].value-O})}}for(var R=0;R<I.length;R++)L.push(I[R]);return I}}for(var u=[],f=[],h=0,v=0,c=0;c<i.length&&o++<n;++c){var d=lo(i[c]);if(!!z3(i[c])){l(i[c],u[u.length-1]||[],f);var p=i[c+1]?lo(i[c+1]):null;if(d!==p){if(f.length){v=h,f.sort(function(D,M){return D.value-M.value});for(var g=[],y=0;y<f.length;++y){var m=f[y].value;(y===0||f[y-1].value!==m)&&(g.push(f[y]),m>=a[0]&&m<=a[1]&&h++)}var _=(a[1]-a[0])/e;if(h>_*1.5&&v>_/1.5||(u.push(g),h>_||r===i[c]))break}f=[]}}}for(var S=Et(G(u,function(D){return Et(D,function(M){return M.value>=a[0]&&M.value<=a[1]&&!M.notAdd})}),function(D){return D.length>0}),w=[],x=S.length-1,c=0;c<S.length;++c)for(var b=S[c],C=0;C<b.length;++C)w.push({value:b[C].value,level:x-c});w.sort(function(D,M){return D.value-M.value});for(var T=[],c=0;c<w.length;++c)(c===0||w[c].value!==w[c-1].value)&&T.push(w[c]);return T}Aa.registerClass(CA);var TA=CA,u_=Aa.prototype,Ns=on.prototype,bN=Zt,CN=Math.floor,TN=Math.ceil,mu=Math.pow,pr=Math.log,my=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=\"log\",t.base=10,t._originalScale=new on,t._interval=0,t}return e.prototype.getTicks=function(t){var a=this._originalScale,n=this._extent,i=a.getExtent(),o=Ns.getTicks.call(this,t);return G(o,function(s){var l=s.value,u=Zt(mu(this.base,l));return u=l===n[0]&&this._fixMin?_u(u,i[0]):u,u=l===n[1]&&this._fixMax?_u(u,i[1]):u,{value:u}},this)},e.prototype.setExtent=function(t,a){var n=pr(this.base);t=pr(Math.max(0,t))/n,a=pr(Math.max(0,a))/n,Ns.setExtent.call(this,t,a)},e.prototype.getExtent=function(){var t=this.base,a=u_.getExtent.call(this);a[0]=mu(t,a[0]),a[1]=mu(t,a[1]);var n=this._originalScale,i=n.getExtent();return this._fixMin&&(a[0]=_u(a[0],i[0])),this._fixMax&&(a[1]=_u(a[1],i[1])),a},e.prototype.unionExtent=function(t){this._originalScale.unionExtent(t);var a=this.base;t[0]=pr(t[0])/pr(a),t[1]=pr(t[1])/pr(a),u_.unionExtent.call(this,t)},e.prototype.unionExtentFromData=function(t,a){this.unionExtent(t.getApproximateExtent(a))},e.prototype.calcNiceTicks=function(t){t=t||10;var a=this._extent,n=a[1]-a[0];if(!(n===1/0||n<=0)){var i=fk(n),o=t/n*i;for(o<=.5&&(i*=10);!isNaN(i)&&Math.abs(i)<1&&Math.abs(i)>0;)i*=10;var s=[Zt(TN(a[0]/i)*i),Zt(CN(a[1]/i)*i)];this._interval=i,this._niceExtent=s}},e.prototype.calcNiceExtent=function(t){Ns.calcNiceExtent.call(this,t),this._fixMin=t.fixMin,this._fixMax=t.fixMax},e.prototype.parse=function(t){return t},e.prototype.contain=function(t){return t=pr(t)/pr(this.base),zh(t,this._extent)},e.prototype.normalize=function(t){return t=pr(t)/pr(this.base),Fh(t,this._extent)},e.prototype.scale=function(t){return t=Gh(t,this._extent),mu(this.base,t)},e.type=\"log\",e}(Aa),AA=my.prototype;AA.getMinorTicks=Ns.getMinorTicks;AA.getLabel=Ns.getLabel;function _u(r,e){return bN(r,Gr(e))}Aa.registerClass(my);var AN=my,DN=function(){function r(e,t,a){this._prepareParams(e,t,a)}return r.prototype._prepareParams=function(e,t,a){a[1]<a[0]&&(a=[NaN,NaN]),this._dataMin=a[0],this._dataMax=a[1];var n=this._isOrdinal=e.type===\"ordinal\";this._needCrossZero=e.type===\"interval\"&&t.getNeedCrossZero&&t.getNeedCrossZero();var i=this._modelMinRaw=t.get(\"min\",!0);J(i)?this._modelMinNum=Su(e,i({min:a[0],max:a[1]})):i!==\"dataMin\"&&(this._modelMinNum=Su(e,i));var o=this._modelMaxRaw=t.get(\"max\",!0);if(J(o)?this._modelMaxNum=Su(e,o({min:a[0],max:a[1]})):o!==\"dataMax\"&&(this._modelMaxNum=Su(e,o)),n)this._axisDataLen=t.getCategories().length;else{var s=t.get(\"boundaryGap\"),l=F(s)?s:[s||0,s||0];typeof l[0]==\"boolean\"||typeof l[1]==\"boolean\"?this._boundaryGapInner=[0,0]:this._boundaryGapInner=[Tr(l[0],1),Tr(l[1],1)]}},r.prototype.calculate=function(){var e=this._isOrdinal,t=this._dataMin,a=this._dataMax,n=this._axisDataLen,i=this._boundaryGapInner,o=e?null:a-t||Math.abs(t),s=this._modelMinRaw===\"dataMin\"?t:this._modelMinNum,l=this._modelMaxRaw===\"dataMax\"?a:this._modelMaxNum,u=s!=null,f=l!=null;s==null&&(s=e?n?0:NaN:t-i[0]*o),l==null&&(l=e?n?n-1:NaN:a+i[1]*o),(s==null||!isFinite(s))&&(s=NaN),(l==null||!isFinite(l))&&(l=NaN);var h=Ws(s)||Ws(l)||e&&!n;this._needCrossZero&&(s>0&&l>0&&!u&&(s=0),s<0&&l<0&&!f&&(l=0));var v=this._determinedMin,c=this._determinedMax;return v!=null&&(s=v,u=!0),c!=null&&(l=c,f=!0),{min:s,max:l,minFixed:u,maxFixed:f,isBlank:h}},r.prototype.modifyDataMinMax=function(e,t){this[LN[e]]=t},r.prototype.setDeterminedMinMax=function(e,t){var a=MN[e];this[a]=t},r.prototype.freeze=function(){this.frozen=!0},r}(),MN={min:\"_determinedMin\",max:\"_determinedMax\"},LN={min:\"_dataMin\",max:\"_dataMax\"};function DA(r,e,t){var a=r.rawExtentInfo;return a||(a=new DN(r,e,t),r.rawExtentInfo=a,a)}function Su(r,e){return e==null?null:Ws(e)?NaN:r.parse(e)}function MA(r,e){var t=r.type,a=DA(r,e,r.getExtent()).calculate();r.setBlank(a.isBlank);var n=a.min,i=a.max,o=e.ecModel;if(o&&t===\"time\"){var s=yA(\"bar\",o),l=!1;if(A(s,function(h){l=l||h.getBaseAxis()===e.axis}),l){var u=mA(s),f=IN(n,i,e,u);n=f.min,i=f.max}}return{extent:[n,i],fixMin:a.minFixed,fixMax:a.maxFixed}}function IN(r,e,t,a){var n=t.axis.getExtent(),i=n[1]-n[0],o=cN(a,t.axis);if(o===void 0)return{min:r,max:e};var s=1/0;A(o,function(c){s=Math.min(c.offset,s)});var l=-1/0;A(o,function(c){l=Math.max(c.offset+c.width,l)}),s=Math.abs(s),l=Math.abs(l);var u=s+l,f=e-r,h=1-(s+l)/i,v=f/h-f;return e+=v*(l/u),r-=v*(s/u),{min:r,max:e}}function po(r,e){var t=e,a=MA(r,t),n=a.extent,i=t.get(\"splitNumber\");r instanceof AN&&(r.base=t.get(\"logBase\"));var o=r.type,s=t.get(\"interval\"),l=o===\"interval\"||o===\"time\";r.setExtent(n[0],n[1]),r.calcNiceExtent({splitNumber:i,fixMin:a.fixMin,fixMax:a.fixMax,minInterval:l?t.get(\"minInterval\"):null,maxInterval:l?t.get(\"maxInterval\"):null}),s!=null&&r.setInterval&&r.setInterval(s)}function Hh(r,e){if(e=e||r.get(\"type\"),e)switch(e){case\"category\":return new py({ordinalMeta:r.getOrdinalMeta?r.getOrdinalMeta():r.getCategories(),extent:[1/0,-1/0]});case\"time\":return new TA({locale:r.ecModel.getLocaleModel(),useUTC:r.ecModel.get(\"useUTC\")});default:return new(Aa.getClass(e)||on)}}function PN(r){var e=r.scale.getExtent(),t=e[0],a=e[1];return!(t>0&&a>0||t<0&&a<0)}function Pl(r){var e=r.getLabelModel().get(\"formatter\"),t=r.type===\"category\"?r.scale.getExtent()[0]:null;return r.scale.type===\"time\"?function(a){return function(n,i){return r.scale.getFormattedLabel(n,i,a)}}(e):U(e)?function(a){return function(n){var i=r.scale.getLabel(n),o=a.replace(\"{value}\",i!=null?i:\"\");return o}}(e):J(e)?function(a){return function(n,i){return t!=null&&(i=n.value-t),a(_y(r,n),i,n.level!=null?{level:n.level}:null)}}(e):function(a){return r.scale.getLabel(a)}}function _y(r,e){return r.type===\"category\"?r.scale.getLabel(e):e.value}function RN(r){var e=r.model,t=r.scale;if(!(!e.get([\"axisLabel\",\"show\"])||t.isBlank())){var a,n,i=t.getExtent();t instanceof py?n=t.count():(a=t.getTicks(),n=a.length);var o=r.getLabelModel(),s=Pl(r),l,u=1;n>40&&(u=Math.ceil(n/40));for(var f=0;f<n;f+=u){var h=a?a[f]:{value:i[0]+f},v=s(h,f),c=o.getTextRect(v),d=EN(c,o.get(\"rotate\")||0);l?l.union(d):l=d}return l}}function EN(r,e){var t=e*Math.PI/180,a=r.width,n=r.height,i=a*Math.abs(Math.cos(t))+Math.abs(n*Math.sin(t)),o=a*Math.abs(Math.sin(t))+Math.abs(n*Math.cos(t)),s=new vt(r.x,r.y,i,o);return s}function Sy(r){var e=r.get(\"interval\");return e==null?\"auto\":e}function LA(r){return r.type===\"category\"&&Sy(r.getLabelModel())===0}function Gf(r,e){var t={};return A(r.mapDimensionsAll(e),function(a){t[hA(r,a)]=!0}),St(t)}function kN(r,e,t){e&&A(Gf(e,t),function(a){var n=e.getApproximateExtent(a);n[0]<r[0]&&(r[0]=n[0]),n[1]>r[1]&&(r[1]=n[1])})}var Rl=function(){function r(){}return r.prototype.getNeedCrossZero=function(){var e=this.option;return!e.scale},r.prototype.getCoordSysModel=function(){},r}(),f_=[],ON={registerPreprocessor:aA,registerProcessor:nA,registerPostInit:LB,registerPostUpdate:IB,registerUpdateLifecycle:cy,registerAction:ta,registerCoordinateSystem:PB,registerLayout:RB,registerVisual:Ai,registerTransform:kB,registerLoading:iA,registerMap:EB,registerImpl:uB,PRIORITY:wB,ComponentModel:Tt,ComponentView:Ut,SeriesModel:Ht,ChartView:zt,registerComponentModel:function(r){Tt.registerClass(r)},registerComponentView:function(r){Ut.registerClass(r)},registerSeriesModel:function(r){Ht.registerClass(r)},registerChartView:function(r){zt.registerClass(r)},registerSubTypeDefaulter:function(r,e){Tt.registerSubTypeDefaulter(r,e)},registerPainter:function(r,e){nk(r,e)}};function ct(r){if(F(r)){A(r,function(e){ct(e)});return}dt(f_,r)>=0||(f_.push(r),J(r)&&(r={install:r}),r.install(ON))}var BN=1e-8;function h_(r,e){return Math.abs(r-e)<BN}function Un(r,e,t){var a=0,n=r[0];if(!n)return!1;for(var i=1;i<r.length;i++){var o=r[i];a+=sa(n[0],n[1],o[0],o[1],e,t),n=o}var s=r[0];return(!h_(n[0],s[0])||!h_(n[1],s[1]))&&(a+=sa(n[0],n[1],s[0],s[1],e,t)),a!==0}var NN=[];function ic(r,e){for(var t=0;t<r.length;t++)he(r[t],r[t],e)}function v_(r,e,t,a){for(var n=0;n<r.length;n++){var i=r[n];a&&(i=a.project(i)),i&&isFinite(i[0])&&isFinite(i[1])&&(Ha(e,e,i),Wa(t,t,i))}}function VN(r){for(var e=0,t=0,a=0,n=r.length,i=r[n-1][0],o=r[n-1][1],s=0;s<n;s++){var l=r[s][0],u=r[s][1],f=i*u-l*o;e+=f,t+=(i+l)*f,a+=(o+u)*f,i=l,o=u}return e?[t/e/3,a/e/3,e]:[r[0][0]||0,r[0][1]||0]}var IA=function(){function r(e){this.name=e}return r.prototype.setCenter=function(e){this._center=e},r.prototype.getCenter=function(){var e=this._center;return e||(e=this._center=this.calcCenter()),e},r}(),c_=function(){function r(e,t){this.type=\"polygon\",this.exterior=e,this.interiors=t}return r}(),d_=function(){function r(e){this.type=\"linestring\",this.points=e}return r}(),PA=function(r){k(e,r);function e(t,a,n){var i=r.call(this,t)||this;return i.type=\"geoJSON\",i.geometries=a,i._center=n&&[n[0],n[1]],i}return e.prototype.calcCenter=function(){for(var t=this.geometries,a,n=0,i=0;i<t.length;i++){var o=t[i],s=o.exterior,l=s&&s.length;l>n&&(a=o,n=l)}if(a)return VN(a.exterior);var u=this.getBoundingRect();return[u.x+u.width/2,u.y+u.height/2]},e.prototype.getBoundingRect=function(t){var a=this._rect;if(a&&!t)return a;var n=[1/0,1/0],i=[-1/0,-1/0],o=this.geometries;return A(o,function(s){s.type===\"polygon\"?v_(s.exterior,n,i,t):A(s.points,function(l){v_(l,n,i,t)})}),isFinite(n[0])&&isFinite(n[1])&&isFinite(i[0])&&isFinite(i[1])||(n[0]=n[1]=i[0]=i[1]=0),a=new vt(n[0],n[1],i[0]-n[0],i[1]-n[1]),t||(this._rect=a),a},e.prototype.contain=function(t){var a=this.getBoundingRect(),n=this.geometries;if(!a.contain(t[0],t[1]))return!1;t:for(var i=0,o=n.length;i<o;i++){var s=n[i];if(s.type===\"polygon\"){var l=s.exterior,u=s.interiors;if(Un(l,t[0],t[1])){for(var f=0;f<(u?u.length:0);f++)if(Un(u[f],t[0],t[1]))continue t;return!0}}}return!1},e.prototype.transformTo=function(t,a,n,i){var o=this.getBoundingRect(),s=o.width/o.height;n?i||(i=n/s):n=s*i;for(var l=new vt(t,a,n,i),u=o.calculateTransform(l),f=this.geometries,h=0;h<f.length;h++){var v=f[h];v.type===\"polygon\"?(ic(v.exterior,u),A(v.interiors,function(c){ic(c,u)})):A(v.points,function(c){ic(c,u)})}o=this._rect,o.copy(l),this._center=[o.x+o.width/2,o.y+o.height/2]},e.prototype.cloneShallow=function(t){t==null&&(t=this.name);var a=new e(t,this.geometries,this._center);return a._rect=this._rect,a.transformTo=null,a},e}(IA),zN=function(r){k(e,r);function e(t,a){var n=r.call(this,t)||this;return n.type=\"geoSVG\",n._elOnlyForCalculate=a,n}return e.prototype.calcCenter=function(){for(var t=this._elOnlyForCalculate,a=t.getBoundingRect(),n=[a.x+a.width/2,a.y+a.height/2],i=ph(NN),o=t;o&&!o.isGeoSVGGraphicRoot;)ha(i,o.getLocalTransform(),i),o=o.parent;return bo(i,i),he(n,n,i),n},e}(IA);function FN(r){if(!r.UTF8Encoding)return r;var e=r,t=e.UTF8Scale;t==null&&(t=1024);var a=e.features;return A(a,function(n){var i=n.geometry,o=i.encodeOffsets,s=i.coordinates;if(!!o)switch(i.type){case\"LineString\":i.coordinates=RA(s,o,t);break;case\"Polygon\":oc(s,o,t);break;case\"MultiLineString\":oc(s,o,t);break;case\"MultiPolygon\":A(s,function(l,u){return oc(l,o[u],t)})}}),e.UTF8Encoding=!1,e}function oc(r,e,t){for(var a=0;a<r.length;a++)r[a]=RA(r[a],e[a],t)}function RA(r,e,t){for(var a=[],n=e[0],i=e[1],o=0;o<r.length;o+=2){var s=r.charCodeAt(o)-64,l=r.charCodeAt(o+1)-64;s=s>>1^-(s&1),l=l>>1^-(l&1),s+=n,l+=i,n=s,i=l,a.push([s/t,l/t])}return a}function GN(r,e){return r=FN(r),G(Et(r.features,function(t){return t.geometry&&t.properties&&t.geometry.coordinates.length>0}),function(t){var a=t.properties,n=t.geometry,i=[];switch(n.type){case\"Polygon\":var o=n.coordinates;i.push(new c_(o[0],o.slice(1)));break;case\"MultiPolygon\":A(n.coordinates,function(l){l[0]&&i.push(new c_(l[0],l.slice(1)))});break;case\"LineString\":i.push(new d_([n.coordinates]));break;case\"MultiLineString\":i.push(new d_(n.coordinates))}var s=new PA(a[e||\"name\"],i,a.cp);return s.properties=a,s})}var il=Ct();function HN(r){return r.type===\"category\"?$N(r):YN(r)}function WN(r,e){return r.type===\"category\"?UN(r,e):{ticks:G(r.scale.getTicks(),function(t){return t.value})}}function $N(r){var e=r.getLabelModel(),t=EA(r,e);return!e.get(\"show\")||r.scale.isBlank()?{labels:[],labelCategoryInterval:t.labelCategoryInterval}:t}function EA(r,e){var t=kA(r,\"labels\"),a=Sy(e),n=OA(t,a);if(n)return n;var i,o;return J(a)?i=VA(r,a):(o=a===\"auto\"?ZN(r):a,i=NA(r,o)),BA(t,a,{labels:i,labelCategoryInterval:o})}function UN(r,e){var t=kA(r,\"ticks\"),a=Sy(e),n=OA(t,a);if(n)return n;var i,o;if((!e.get(\"show\")||r.scale.isBlank())&&(i=[]),J(a))i=VA(r,a,!0);else if(a===\"auto\"){var s=EA(r,r.getLabelModel());o=s.labelCategoryInterval,i=G(s.labels,function(l){return l.tickValue})}else o=a,i=NA(r,o,!0);return BA(t,a,{ticks:i,tickCategoryInterval:o})}function YN(r){var e=r.scale.getTicks(),t=Pl(r);return{labels:G(e,function(a,n){return{level:a.level,formattedLabel:t(a,n),rawLabel:r.scale.getLabel(a),tickValue:a.value}})}}function kA(r,e){return il(r)[e]||(il(r)[e]=[])}function OA(r,e){for(var t=0;t<r.length;t++)if(r[t].key===e)return r[t].value}function BA(r,e,t){return r.push({key:e,value:t}),t}function ZN(r){var e=il(r).autoInterval;return e!=null?e:il(r).autoInterval=r.calculateCategoryInterval()}function XN(r){var e=qN(r),t=Pl(r),a=(e.axisRotate-e.labelRotate)/180*Math.PI,n=r.scale,i=n.getExtent(),o=n.count();if(i[1]-i[0]<1)return 0;var s=1;o>40&&(s=Math.max(1,Math.floor(o/40)));for(var l=i[0],u=r.dataToCoord(l+1)-r.dataToCoord(l),f=Math.abs(u*Math.cos(a)),h=Math.abs(u*Math.sin(a)),v=0,c=0;l<=i[1];l+=s){var d=0,p=0,g=xl(t({value:l}),e.font,\"center\",\"top\");d=g.width*1.3,p=g.height*1.3,v=Math.max(v,d,7),c=Math.max(c,p,7)}var y=v/f,m=c/h;isNaN(y)&&(y=1/0),isNaN(m)&&(m=1/0);var _=Math.max(0,Math.floor(Math.min(y,m))),S=il(r.model),w=r.getExtent(),x=S.lastAutoInterval,b=S.lastTickCount;return x!=null&&b!=null&&Math.abs(x-_)<=1&&Math.abs(b-o)<=1&&x>_&&S.axisExtent0===w[0]&&S.axisExtent1===w[1]?_=x:(S.lastTickCount=o,S.lastAutoInterval=_,S.axisExtent0=w[0],S.axisExtent1=w[1]),_}function qN(r){var e=r.getLabelModel();return{axisRotate:r.getRotate?r.getRotate():r.isHorizontal&&!r.isHorizontal()?90:0,labelRotate:e.get(\"rotate\")||0,font:e.getFont()}}function NA(r,e,t){var a=Pl(r),n=r.scale,i=n.getExtent(),o=r.getLabelModel(),s=[],l=Math.max((e||0)+1,1),u=i[0],f=n.count();u!==0&&l>1&&f/l>2&&(u=Math.round(Math.ceil(u/l)*l));var h=LA(r),v=o.get(\"showMinLabel\")||h,c=o.get(\"showMaxLabel\")||h;v&&u!==i[0]&&p(i[0]);for(var d=u;d<=i[1];d+=l)p(d);c&&d-l!==i[1]&&p(i[1]);function p(g){var y={value:g};s.push(t?g:{formattedLabel:a(y),rawLabel:n.getLabel(y),tickValue:g})}return s}function VA(r,e,t){var a=r.scale,n=Pl(r),i=[];return A(a.getTicks(),function(o){var s=a.getLabel(o),l=o.value;e(o.value,s)&&i.push(t?l:{formattedLabel:n(o),rawLabel:s,tickValue:l})}),i}var p_=[0,1],KN=function(){function r(e,t,a){this.onBand=!1,this.inverse=!1,this.dim=e,this.scale=t,this._extent=a||[0,0]}return r.prototype.contain=function(e){var t=this._extent,a=Math.min(t[0],t[1]),n=Math.max(t[0],t[1]);return e>=a&&e<=n},r.prototype.containData=function(e){return this.scale.contain(e)},r.prototype.getExtent=function(){return this._extent.slice()},r.prototype.getPixelPrecision=function(e){return S2(e||this.scale.getExtent(),this._extent)},r.prototype.setExtent=function(e,t){var a=this._extent;a[0]=e,a[1]=t},r.prototype.dataToCoord=function(e,t){var a=this._extent,n=this.scale;return e=n.normalize(e),this.onBand&&n.type===\"ordinal\"&&(a=a.slice(),g_(a,n.count())),Rt(e,p_,a,t)},r.prototype.coordToData=function(e,t){var a=this._extent,n=this.scale;this.onBand&&n.type===\"ordinal\"&&(a=a.slice(),g_(a,n.count()));var i=Rt(e,a,p_,t);return this.scale.scale(i)},r.prototype.pointToData=function(e,t){},r.prototype.getTicksCoords=function(e){e=e||{};var t=e.tickModel||this.getTickModel(),a=WN(this,t),n=a.ticks,i=G(n,function(s){return{coord:this.dataToCoord(this.scale.type===\"ordinal\"?this.scale.getRawOrdinalNumber(s):s),tickValue:s}},this),o=t.get(\"alignWithLabel\");return JN(this,i,o,e.clamp),i},r.prototype.getMinorTicksCoords=function(){if(this.scale.type===\"ordinal\")return[];var e=this.model.getModel(\"minorTick\"),t=e.get(\"splitNumber\");t>0&&t<100||(t=5);var a=this.scale.getMinorTicks(t),n=G(a,function(i){return G(i,function(o){return{coord:this.dataToCoord(o),tickValue:o}},this)},this);return n},r.prototype.getViewLabels=function(){return HN(this).labels},r.prototype.getLabelModel=function(){return this.model.getModel(\"axisLabel\")},r.prototype.getTickModel=function(){return this.model.getModel(\"axisTick\")},r.prototype.getBandWidth=function(){var e=this._extent,t=this.scale.getExtent(),a=t[1]-t[0]+(this.onBand?1:0);a===0&&(a=1);var n=Math.abs(e[1]-e[0]);return Math.abs(n)/a},r.prototype.calculateCategoryInterval=function(){return XN(this)},r}();function g_(r,e){var t=r[1]-r[0],a=e,n=t/a/2;r[0]+=n,r[1]-=n}function JN(r,e,t,a){var n=e.length;if(!r.onBand||t||!n)return;var i=r.getExtent(),o,s;if(n===1)e[0].coord=i[0],o=e[1]={coord:i[1]};else{var l=e[n-1].tickValue-e[0].tickValue,u=(e[n-1].coord-e[0].coord)/l;A(e,function(c){c.coord-=u/2});var f=r.scale.getExtent();s=1+f[1]-e[n-1].tickValue,o={coord:e[n-1].coord+u*s},e.push(o)}var h=i[0]>i[1];v(e[0].coord,i[0])&&(a?e[0].coord=i[0]:e.shift()),a&&v(i[0],e[0].coord)&&e.unshift({coord:i[0]}),v(i[1],o.coord)&&(a?o.coord=i[1]:e.pop()),a&&v(o.coord,i[1])&&e.push({coord:i[1]});function v(c,d){return c=Zt(c),d=Zt(d),h?c>d:c<d}}var Mr=KN,rs=Math.PI*2,kn=Jr.CMD,QN=[\"top\",\"right\",\"bottom\",\"left\"];function jN(r,e,t,a,n){var i=t.width,o=t.height;switch(r){case\"top\":a.set(t.x+i/2,t.y-e),n.set(0,-1);break;case\"bottom\":a.set(t.x+i/2,t.y+o+e),n.set(0,1);break;case\"left\":a.set(t.x-e,t.y+o/2),n.set(-1,0);break;case\"right\":a.set(t.x+i+e,t.y+o/2),n.set(1,0);break}}function t6(r,e,t,a,n,i,o,s,l){o-=r,s-=e;var u=Math.sqrt(o*o+s*s);o/=u,s/=u;var f=o*t+r,h=s*t+e;if(Math.abs(a-n)%rs<1e-4)return l[0]=f,l[1]=h,u-t;if(i){var v=a;a=xr(n),n=xr(v)}else a=xr(a),n=xr(n);a>n&&(n+=rs);var c=Math.atan2(s,o);if(c<0&&(c+=rs),c>=a&&c<=n||c+rs>=a&&c+rs<=n)return l[0]=f,l[1]=h,u-t;var d=t*Math.cos(a)+r,p=t*Math.sin(a)+e,g=t*Math.cos(n)+r,y=t*Math.sin(n)+e,m=(d-o)*(d-o)+(p-s)*(p-s),_=(g-o)*(g-o)+(y-s)*(y-s);return m<_?(l[0]=d,l[1]=p,Math.sqrt(m)):(l[0]=g,l[1]=y,Math.sqrt(_))}function Hf(r,e,t,a,n,i,o,s){var l=n-r,u=i-e,f=t-r,h=a-e,v=Math.sqrt(f*f+h*h);f/=v,h/=v;var c=l*f+u*h,d=c/v;s&&(d=Math.min(Math.max(d,0),1)),d*=v;var p=o[0]=r+d*f,g=o[1]=e+d*h;return Math.sqrt((p-n)*(p-n)+(g-i)*(g-i))}function zA(r,e,t,a,n,i,o){t<0&&(r=r+t,t=-t),a<0&&(e=e+a,a=-a);var s=r+t,l=e+a,u=o[0]=Math.min(Math.max(n,r),s),f=o[1]=Math.min(Math.max(i,e),l);return Math.sqrt((u-n)*(u-n)+(f-i)*(f-i))}var _r=[];function e6(r,e,t){var a=zA(e.x,e.y,e.width,e.height,r.x,r.y,_r);return t.set(_r[0],_r[1]),a}function r6(r,e,t){for(var a=0,n=0,i=0,o=0,s,l,u=1/0,f=e.data,h=r.x,v=r.y,c=0;c<f.length;){var d=f[c++];c===1&&(a=f[c],n=f[c+1],i=a,o=n);var p=u;switch(d){case kn.M:i=f[c++],o=f[c++],a=i,n=o;break;case kn.L:p=Hf(a,n,f[c],f[c+1],h,v,_r,!0),a=f[c++],n=f[c++];break;case kn.C:p=t2(a,n,f[c++],f[c++],f[c++],f[c++],f[c],f[c+1],h,v,_r),a=f[c++],n=f[c++];break;case kn.Q:p=r2(a,n,f[c++],f[c++],f[c],f[c+1],h,v,_r),a=f[c++],n=f[c++];break;case kn.A:var g=f[c++],y=f[c++],m=f[c++],_=f[c++],S=f[c++],w=f[c++];c+=1;var x=!!(1-f[c++]);s=Math.cos(S)*m+g,l=Math.sin(S)*_+y,c<=1&&(i=s,o=l);var b=(h-g)*_/m+g;p=t6(g,y,_,S,S+w,x,b,v,_r),a=Math.cos(S+w)*m+g,n=Math.sin(S+w)*_+y;break;case kn.R:i=a=f[c++],o=n=f[c++];var C=f[c++],T=f[c++];p=zA(i,o,C,T,h,v,_r);break;case kn.Z:p=Hf(a,n,i,o,h,v,_r,!0),a=i,n=o;break}p<u&&(u=p,t.set(_r[0],_r[1]))}return u}var wr=new ut,Bt=new ut,qt=new ut,$r=new ut,Vr=new ut;function y_(r,e){if(!!r){var t=r.getTextGuideLine(),a=r.getTextContent();if(!!(a&&t)){var n=r.textGuideLineConfig||{},i=[[0,0],[0,0],[0,0]],o=n.candidates||QN,s=a.getBoundingRect().clone();s.applyTransform(a.getComputedTransform());var l=1/0,u=n.anchor,f=r.getComputedTransform(),h=f&&bo([],f),v=e.get(\"length2\")||0;u&&qt.copy(u);for(var c=0;c<o.length;c++){var d=o[c];jN(d,0,s,wr,$r),ut.scaleAndAdd(Bt,wr,$r,v),Bt.transform(h);var p=r.getBoundingRect(),g=u?u.distance(Bt):r instanceof mt?r6(Bt,r.path,qt):e6(Bt,p,qt);g<l&&(l=g,Bt.transform(f),qt.transform(f),qt.toArray(i[0]),Bt.toArray(i[1]),wr.toArray(i[2]))}FA(i,e.get(\"minTurnAngle\")),t.setShape({points:i})}}}var Wf=[],Ae=new ut;function FA(r,e){if(e<=180&&e>0){e=e/180*Math.PI,wr.fromArray(r[0]),Bt.fromArray(r[1]),qt.fromArray(r[2]),ut.sub($r,wr,Bt),ut.sub(Vr,qt,Bt);var t=$r.len(),a=Vr.len();if(!(t<.001||a<.001)){$r.scale(1/t),Vr.scale(1/a);var n=$r.dot(Vr),i=Math.cos(e);if(i<n){var o=Hf(Bt.x,Bt.y,qt.x,qt.y,wr.x,wr.y,Wf,!1);Ae.fromArray(Wf),Ae.scaleAndAdd(Vr,o/Math.tan(Math.PI-e));var s=qt.x!==Bt.x?(Ae.x-Bt.x)/(qt.x-Bt.x):(Ae.y-Bt.y)/(qt.y-Bt.y);if(isNaN(s))return;s<0?ut.copy(Ae,Bt):s>1&&ut.copy(Ae,qt),Ae.toArray(r[1])}}}}function a6(r,e,t){if(t<=180&&t>0){t=t/180*Math.PI,wr.fromArray(r[0]),Bt.fromArray(r[1]),qt.fromArray(r[2]),ut.sub($r,Bt,wr),ut.sub(Vr,qt,Bt);var a=$r.len(),n=Vr.len();if(!(a<.001||n<.001)){$r.scale(1/a),Vr.scale(1/n);var i=$r.dot(e),o=Math.cos(t);if(i<o){var s=Hf(Bt.x,Bt.y,qt.x,qt.y,wr.x,wr.y,Wf,!1);Ae.fromArray(Wf);var l=Math.PI/2,u=Math.acos(Vr.dot(e)),f=l+u-t;if(f>=l)ut.copy(Ae,qt);else{Ae.scaleAndAdd(Vr,s/Math.tan(Math.PI/2-f));var h=qt.x!==Bt.x?(Ae.x-Bt.x)/(qt.x-Bt.x):(Ae.y-Bt.y)/(qt.y-Bt.y);if(isNaN(h))return;h<0?ut.copy(Ae,Bt):h>1&&ut.copy(Ae,qt)}Ae.toArray(r[1])}}}}function m_(r,e,t,a){var n=t===\"normal\",i=n?r:r.ensureState(t);i.ignore=e;var o=a.get(\"smooth\");o&&o===!0&&(o=.3),i.shape=i.shape||{},o>0&&(i.shape.smooth=o);var s=a.getModel(\"lineStyle\").getLineStyle();n?r.useStyle(s):i.style=s}function n6(r,e){var t=e.smooth,a=e.points;if(!!a)if(r.moveTo(a[0][0],a[0][1]),t>0&&a.length>=3){var n=Ga(a[0],a[1]),i=Ga(a[1],a[2]);if(!n||!i){r.lineTo(a[1][0],a[1][1]),r.lineTo(a[2][0],a[2][1]);return}var o=Math.min(n,i)*t,s=Xu([],a[1],a[0],o/n),l=Xu([],a[1],a[2],o/i),u=Xu([],s,l,.5);r.bezierCurveTo(s[0],s[1],s[0],s[1],u[0],u[1]),r.bezierCurveTo(l[0],l[1],l[0],l[1],a[2][0],a[2][1])}else for(var f=1;f<a.length;f++)r.lineTo(a[f][0],a[f][1])}function xy(r,e,t){var a=r.getTextGuideLine(),n=r.getTextContent();if(!n){a&&r.removeTextGuideLine();return}for(var i=e.normal,o=i.get(\"show\"),s=n.ignore,l=0;l<qs.length;l++){var u=qs[l],f=e[u],h=u===\"normal\";if(f){var v=f.get(\"show\"),c=h?s:ft(n.states[u]&&n.states[u].ignore,s);if(c||!ft(v,o)){var d=h?a:a&&a.states[u];d&&(d.ignore=!0);continue}a||(a=new Fe,r.setTextGuideLine(a),!h&&(s||!o)&&m_(a,!0,\"normal\",e.normal),r.stateProxy&&(a.stateProxy=r.stateProxy)),m_(a,!1,u,f)}}if(a){tt(a.style,t),a.style.fill=null;var p=i.get(\"showAbove\"),g=r.textGuideLineConfig=r.textGuideLineConfig||{};g.showAbove=p||!1,a.buildPath=n6}}function wy(r,e){e=e||\"labelLine\";for(var t={normal:r.getModel(e)},a=0;a<Le.length;a++){var n=Le[a];t[n]=r.getModel([n,e])}return t}function GA(r){for(var e=[],t=0;t<r.length;t++){var a=r[t];if(!a.defaultAttr.ignore){var n=a.label,i=n.getComputedTransform(),o=n.getBoundingRect(),s=!i||i[1]<1e-5&&i[2]<1e-5,l=n.style.margin||0,u=o.clone();u.applyTransform(i),u.x-=l/2,u.y-=l/2,u.width+=l,u.height+=l;var f=s?new Df(o,i):null;e.push({label:n,labelLine:a.labelLine,rect:u,localRect:o,obb:f,priority:a.priority,defaultAttr:a.defaultAttr,layoutOption:a.computedLayoutOption,axisAligned:s,transform:i})}}return e}function HA(r,e,t,a,n,i){var o=r.length;if(o<2)return;r.sort(function(C,T){return C.rect[e]-T.rect[e]});for(var s=0,l,u=!1,f=0,h=0;h<o;h++){var v=r[h],c=v.rect;l=c[e]-s,l<0&&(c[e]-=l,v.label[e]-=l,u=!0);var d=Math.max(-l,0);f+=d,s=c[e]+c[t]}f>0&&i&&w(-f/o,0,o);var p=r[0],g=r[o-1],y,m;_(),y<0&&x(-y,.8),m<0&&x(m,.8),_(),S(y,m,1),S(m,y,-1),_(),y<0&&b(-y),m<0&&b(m);function _(){y=p.rect[e]-a,m=n-g.rect[e]-g.rect[t]}function S(C,T,D){if(C<0){var M=Math.min(T,-C);if(M>0){w(M*D,0,o);var L=M+C;L<0&&x(-L*D,1)}else x(-C*D,1)}}function w(C,T,D){C!==0&&(u=!0);for(var M=T;M<D;M++){var L=r[M],I=L.rect;I[e]+=C,L.label[e]+=C}}function x(C,T){for(var D=[],M=0,L=1;L<o;L++){var I=r[L-1].rect,P=Math.max(r[L].rect[e]-I[e]-I[t],0);D.push(P),M+=P}if(!!M){var R=Math.min(Math.abs(C)/M,T);if(C>0)for(var L=0;L<o-1;L++){var E=D[L]*R;w(E,0,L+1)}else for(var L=o-1;L>0;L--){var E=D[L-1]*R;w(-E,L,o)}}}function b(C){var T=C<0?-1:1;C=Math.abs(C);for(var D=Math.ceil(C/(o-1)),M=0;M<o-1;M++)if(T>0?w(D,0,M+1):w(-D,o-M-1,o),C-=D,C<=0)return}return u}function i6(r,e,t,a){return HA(r,\"x\",\"width\",e,t,a)}function WA(r,e,t,a){return HA(r,\"y\",\"height\",e,t,a)}function $A(r){var e=[];r.sort(function(p,g){return g.priority-p.priority});var t=new vt(0,0,0,0);function a(p){if(!p.ignore){var g=p.ensureState(\"emphasis\");g.ignore==null&&(g.ignore=!1)}p.ignore=!0}for(var n=0;n<r.length;n++){var i=r[n],o=i.axisAligned,s=i.localRect,l=i.transform,u=i.label,f=i.labelLine;t.copy(i.rect),t.width-=.1,t.height-=.1,t.x+=.05,t.y+=.05;for(var h=i.obb,v=!1,c=0;c<e.length;c++){var d=e[c];if(!!t.intersect(d.rect)){if(o&&d.axisAligned){v=!0;break}if(d.obb||(d.obb=new Df(d.localRect,d.transform)),h||(h=new Df(s,l)),h.intersect(d.obb)){v=!0;break}}}v?(a(u),f&&a(f)):(u.attr(\"ignore\",i.defaultAttr.ignore),f&&f.attr(\"ignore\",i.defaultAttr.labelGuideIgnore),e.push(i))}}function o6(r){if(r){for(var e=[],t=0;t<r.length;t++)e.push(r[t].slice());return e}}function s6(r,e){var t=r.label,a=e&&e.getTextGuideLine();return{dataIndex:r.dataIndex,dataType:r.dataType,seriesIndex:r.seriesModel.seriesIndex,text:r.label.style.text,rect:r.hostRect,labelRect:r.rect,align:t.style.align,verticalAlign:t.style.verticalAlign,labelLinePoints:o6(a&&a.shape.points)}}var __=[\"align\",\"verticalAlign\",\"width\",\"height\",\"fontSize\"],we=new la,sc=Ct(),l6=Ct();function xu(r,e,t){for(var a=0;a<t.length;a++){var n=t[a];e[n]!=null&&(r[n]=e[n])}}var wu=[\"x\",\"y\",\"rotation\"],u6=function(){function r(){this._labelList=[],this._chartViewList=[]}return r.prototype.clearLabels=function(){this._labelList=[],this._chartViewList=[]},r.prototype._addLabel=function(e,t,a,n,i){var o=n.style,s=n.__hostTarget,l=s.textConfig||{},u=n.getComputedTransform(),f=n.getBoundingRect().plain();vt.applyTransform(f,f,u),u?we.setLocalTransform(u):(we.x=we.y=we.rotation=we.originX=we.originY=0,we.scaleX=we.scaleY=1),we.rotation=xr(we.rotation);var h=n.__hostTarget,v;if(h){v=h.getBoundingRect().plain();var c=h.getComputedTransform();vt.applyTransform(v,v,c)}var d=v&&h.getTextGuideLine();this._labelList.push({label:n,labelLine:d,seriesModel:a,dataIndex:e,dataType:t,layoutOption:i,computedLayoutOption:null,rect:f,hostRect:v,priority:v?v.width*v.height:0,defaultAttr:{ignore:n.ignore,labelGuideIgnore:d&&d.ignore,x:we.x,y:we.y,scaleX:we.scaleX,scaleY:we.scaleY,rotation:we.rotation,style:{x:o.x,y:o.y,align:o.align,verticalAlign:o.verticalAlign,width:o.width,height:o.height,fontSize:o.fontSize},cursor:n.cursor,attachedPos:l.position,attachedRot:l.rotation}})},r.prototype.addLabelsOfSeries=function(e){var t=this;this._chartViewList.push(e);var a=e.__model,n=a.get(\"labelLayout\");!(J(n)||St(n).length)||e.group.traverse(function(i){if(i.ignore)return!0;var o=i.getTextContent(),s=it(i);o&&!o.disableLabelLayout&&t._addLabel(s.dataIndex,s.dataType,a,o,n)})},r.prototype.updateLayoutConfig=function(e){var t=e.getWidth(),a=e.getHeight();function n(_,S){return function(){y_(_,S)}}for(var i=0;i<this._labelList.length;i++){var o=this._labelList[i],s=o.label,l=s.__hostTarget,u=o.defaultAttr,f=void 0;J(o.layoutOption)?f=o.layoutOption(s6(o,l)):f=o.layoutOption,f=f||{},o.computedLayoutOption=f;var h=Math.PI/180;l&&l.setTextConfig({local:!1,position:f.x!=null||f.y!=null?null:u.attachedPos,rotation:f.rotate!=null?f.rotate*h:u.attachedRot,offset:[f.dx||0,f.dy||0]});var v=!1;if(f.x!=null?(s.x=W(f.x,t),s.setStyle(\"x\",0),v=!0):(s.x=u.x,s.setStyle(\"x\",u.style.x)),f.y!=null?(s.y=W(f.y,a),s.setStyle(\"y\",0),v=!0):(s.y=u.y,s.setStyle(\"y\",u.style.y)),f.labelLinePoints){var c=l.getTextGuideLine();c&&(c.setShape({points:f.labelLinePoints}),v=!1)}var d=sc(s);d.needsUpdateLabelLine=v,s.rotation=f.rotate!=null?f.rotate*h:u.rotation,s.scaleX=u.scaleX,s.scaleY=u.scaleY;for(var p=0;p<__.length;p++){var g=__[p];s.setStyle(g,f[g]!=null?f[g]:u.style[g])}if(f.draggable){if(s.draggable=!0,s.cursor=\"move\",l){var y=o.seriesModel;if(o.dataIndex!=null){var m=o.seriesModel.getData(o.dataType);y=m.getItemModel(o.dataIndex)}s.on(\"drag\",n(l,y.getModel(\"labelLine\")))}}else s.off(\"drag\"),s.cursor=u.cursor}},r.prototype.layout=function(e){var t=e.getWidth(),a=e.getHeight(),n=GA(this._labelList),i=Et(n,function(l){return l.layoutOption.moveOverlap===\"shiftX\"}),o=Et(n,function(l){return l.layoutOption.moveOverlap===\"shiftY\"});i6(i,0,t),WA(o,0,a);var s=Et(n,function(l){return l.layoutOption.hideOverlap});$A(s)},r.prototype.processLabelsOverall=function(){var e=this;A(this._chartViewList,function(t){var a=t.__model,n=t.ignoreLabelLineUpdate,i=a.isAnimationEnabled();t.group.traverse(function(o){if(o.ignore&&!o.forceLabelAnimation)return!0;var s=!n,l=o.getTextContent();!s&&l&&(s=sc(l).needsUpdateLabelLine),s&&e._updateLabelLine(o,a),i&&e._animateLabels(o,a)})})},r.prototype._updateLabelLine=function(e,t){var a=e.getTextContent(),n=it(e),i=n.dataIndex;if(a&&i!=null){var o=t.getData(n.dataType),s=o.getItemModel(i),l={},u=o.getItemVisual(i,\"style\");if(u){var f=o.getVisual(\"drawType\");l.stroke=u[f]}var h=s.getModel(\"labelLine\");xy(e,wy(s),l),y_(e,h)}},r.prototype._animateLabels=function(e,t){var a=e.getTextContent(),n=e.getTextGuideLine();if(a&&(e.forceLabelAnimation||!a.ignore&&!a.invisible&&!e.disableLabelAnimation&&!so(e))){var i=sc(a),o=i.oldLayout,s=it(e),l=s.dataIndex,u={x:a.x,y:a.y,rotation:a.rotation},f=t.getData(s.dataType);if(o){a.attr(o);var v=e.prevStates;v&&(dt(v,\"select\")>=0&&a.attr(i.oldLayoutSelect),dt(v,\"emphasis\")>=0&&a.attr(i.oldLayoutEmphasis)),Lt(a,u,t,l)}else if(a.attr(u),!Mo(a).valueAnimation){var h=ft(a.style.opacity,1);a.style.opacity=0,Ft(a,{style:{opacity:h}},t,l)}if(i.oldLayout=u,a.states.select){var c=i.oldLayoutSelect={};xu(c,u,wu),xu(c,a.states.select,wu)}if(a.states.emphasis){var d=i.oldLayoutEmphasis={};xu(d,u,wu),xu(d,a.states.emphasis,wu)}IC(a,l,f,t,t)}if(n&&!n.ignore&&!n.invisible){var i=l6(n),o=i.oldLayout,p={points:n.shape.points};o?(n.attr({shape:o}),Lt(n,{shape:p},t)):(n.setShape(p),n.style.strokePercent=0,Ft(n,{style:{strokePercent:1}},t)),i.oldLayout=p}},r}(),f6=u6,lc=Ct();function h6(r){r.registerUpdateLifecycle(\"series:beforeupdate\",function(e,t,a){var n=lc(t).labelManager;n||(n=lc(t).labelManager=new f6),n.clearLabels()}),r.registerUpdateLifecycle(\"series:layoutlabels\",function(e,t,a){var n=lc(t).labelManager;a.updatedSeries.forEach(function(i){n.addLabelsOfSeries(t.getViewOfSeriesModel(i))}),n.updateLayoutConfig(t),n.layout(t),n.processLabelsOverall()})}var v6=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.hasSymbolVisual=!0,t}return e.prototype.getInitialData=function(t){return Ta(null,this,{useEncodeDefaulter:!0})},e.prototype.getLegendIcon=function(t){var a=new nt,n=jt(\"line\",0,t.itemHeight/2,t.itemWidth,0,t.lineStyle.stroke,!1);a.add(n),n.setStyle(t.lineStyle);var i=this.getData().getVisual(\"symbol\"),o=this.getData().getVisual(\"symbolRotate\"),s=i===\"none\"?\"circle\":i,l=t.itemHeight*.8,u=jt(s,(t.itemWidth-l)/2,(t.itemHeight-l)/2,l,l,t.itemStyle.fill);a.add(u),u.setStyle(t.itemStyle);var f=t.iconRotate===\"inherit\"?o:t.iconRotate||0;return u.rotation=f*Math.PI/180,u.setOrigin([t.itemWidth/2,t.itemHeight/2]),s.indexOf(\"empty\")>-1&&(u.style.stroke=u.style.fill,u.style.fill=\"#fff\",u.style.lineWidth=2),a},e.type=\"series.line\",e.dependencies=[\"grid\",\"polar\"],e.defaultOption={z:3,coordinateSystem:\"cartesian2d\",legendHoverLink:!0,clip:!0,label:{position:\"top\"},endLabel:{show:!1,valueAnimation:!0,distance:8},lineStyle:{width:2,type:\"solid\"},emphasis:{scale:!0},step:!1,smooth:!1,smoothMonotone:null,symbol:\"emptyCircle\",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:\"auto\",connectNulls:!1,sampling:\"none\",animationEasing:\"linear\",progressive:0,hoverLayerThreshold:1/0,universalTransition:{divideShape:\"clone\"},triggerLineEvent:!1},e}(Ht),c6=v6;function go(r,e){var t=r.mapDimensionsAll(\"defaultedLabel\"),a=t.length;if(a===1){var n=vo(r,e,t[0]);return n!=null?n+\"\":null}else if(a){for(var i=[],o=0;o<t.length;o++)i.push(vo(r,e,t[o]));return i.join(\" \")}}function UA(r,e){var t=r.mapDimensionsAll(\"defaultedLabel\");if(!F(e))return e+\"\";for(var a=[],n=0;n<t.length;n++){var i=r.getDimensionIndex(t[n]);i>=0&&a.push(e[i])}return a.join(\" \")}var d6=function(r){k(e,r);function e(t,a,n,i){var o=r.call(this)||this;return o.updateData(t,a,n,i),o}return e.prototype._createSymbol=function(t,a,n,i,o){this.removeAll();var s=jt(t,-1,-1,2,2,null,o);s.attr({z2:100,culling:!0,scaleX:i[0]/2,scaleY:i[1]/2}),s.drift=p6,this._symbolType=t,this.add(s)},e.prototype.stopSymbolAnimation=function(t){this.childAt(0).stopAnimation(null,t)},e.prototype.getSymbolType=function(){return this._symbolType},e.prototype.getSymbolPath=function(){return this.childAt(0)},e.prototype.highlight=function(){_a(this.childAt(0))},e.prototype.downplay=function(){Sa(this.childAt(0))},e.prototype.setZ=function(t,a){var n=this.childAt(0);n.zlevel=t,n.z=a},e.prototype.setDraggable=function(t,a){var n=this.childAt(0);n.draggable=t,n.cursor=!a&&t?\"move\":n.cursor},e.prototype.updateData=function(t,a,n,i){this.silent=!1;var o=t.getItemVisual(a,\"symbol\")||\"circle\",s=t.hostModel,l=e.getSymbolSize(t,a),u=o!==this._symbolType,f=i&&i.disableAnimation;if(u){var h=t.getItemVisual(a,\"symbolKeepAspect\");this._createSymbol(o,t,a,l,h)}else{var v=this.childAt(0);v.silent=!1;var c={scaleX:l[0]/2,scaleY:l[1]/2};f?v.attr(c):Lt(v,c,s,a),Ar(v)}if(this._updateCommon(t,a,l,n,i),u){var v=this.childAt(0);if(!f){var c={scaleX:this._sizeX,scaleY:this._sizeY,style:{opacity:v.style.opacity}};v.scaleX=v.scaleY=0,v.style.opacity=0,Ft(v,c,s,a)}}f&&this.childAt(0).stopAnimation(\"leave\")},e.prototype._updateCommon=function(t,a,n,i,o){var s=this.childAt(0),l=t.hostModel,u,f,h,v,c,d,p,g,y;if(i&&(u=i.emphasisItemStyle,f=i.blurItemStyle,h=i.selectItemStyle,v=i.focus,c=i.blurScope,p=i.labelStatesModels,g=i.hoverScale,y=i.cursorStyle,d=i.emphasisDisabled),!i||t.hasItemOption){var m=i&&i.itemModel?i.itemModel:t.getItemModel(a),_=m.getModel(\"emphasis\");u=_.getModel(\"itemStyle\").getItemStyle(),h=m.getModel([\"select\",\"itemStyle\"]).getItemStyle(),f=m.getModel([\"blur\",\"itemStyle\"]).getItemStyle(),v=_.get(\"focus\"),c=_.get(\"blurScope\"),d=_.get(\"disabled\"),p=ie(m),g=_.getShallow(\"scale\"),y=m.getShallow(\"cursor\")}var S=t.getItemVisual(a,\"symbolRotate\");s.attr(\"rotation\",(S||0)*Math.PI/180||0);var w=Ti(t.getItemVisual(a,\"symbolOffset\"),n);w&&(s.x=w[0],s.y=w[1]),y&&s.attr(\"cursor\",y);var x=t.getItemVisual(a,\"style\"),b=x.fill;if(s instanceof pe){var C=s.style;s.useStyle(V({image:C.image,x:C.x,y:C.y,width:C.width,height:C.height},x))}else s.__isEmptyBrush?s.useStyle(V({},x)):s.useStyle(x),s.style.decal=null,s.setColor(b,o&&o.symbolInnerColor),s.style.strokeNoScale=!0;var T=t.getItemVisual(a,\"liftZ\"),D=this._z2;T!=null?D==null&&(this._z2=s.z2,s.z2+=T):D!=null&&(s.z2=D,this._z2=null);var M=o&&o.useNameLabel;de(s,p,{labelFetcher:l,labelDataIndex:a,defaultText:L,inheritColor:b,defaultOpacity:x.opacity});function L(R){return M?t.getName(R):go(t,R)}this._sizeX=n[0]/2,this._sizeY=n[1]/2;var I=s.ensureState(\"emphasis\");I.style=u,s.ensureState(\"select\").style=h,s.ensureState(\"blur\").style=f;var P=g==null||g===!0?Math.max(1.1,3/this._sizeY):isFinite(g)&&g>0?+g:1;I.scaleX=this._sizeX*P,I.scaleY=this._sizeY*P,this.setSymbolScale(1),$t(this,v,c,d)},e.prototype.setSymbolScale=function(t){this.scaleX=this.scaleY=t},e.prototype.fadeOut=function(t,a,n){var i=this.childAt(0),o=it(this).dataIndex,s=n&&n.animation;if(this.silent=i.silent=!0,n&&n.fadeLabel){var l=i.getTextContent();l&&rn(l,{style:{opacity:0}},a,{dataIndex:o,removeOpt:s,cb:function(){i.removeTextContent()}})}else i.removeTextContent();rn(i,{style:{opacity:0},scaleX:0,scaleY:0},a,{dataIndex:o,cb:t,removeOpt:s})},e.getSymbolSize=function(t,a){return Bo(t.getItemVisual(a,\"symbolSize\"))},e}(nt);function p6(r,e){this.parent.drift(r,e)}var El=d6;function uc(r,e,t,a){return e&&!isNaN(e[0])&&!isNaN(e[1])&&!(a.isIgnore&&a.isIgnore(t))&&!(a.clipShape&&!a.clipShape.contain(e[0],e[1]))&&r.getItemVisual(t,\"symbol\")!==\"none\"}function S_(r){return r!=null&&!et(r)&&(r={isIgnore:r}),r||{}}function x_(r){var e=r.hostModel,t=e.getModel(\"emphasis\");return{emphasisItemStyle:t.getModel(\"itemStyle\").getItemStyle(),blurItemStyle:e.getModel([\"blur\",\"itemStyle\"]).getItemStyle(),selectItemStyle:e.getModel([\"select\",\"itemStyle\"]).getItemStyle(),focus:t.get(\"focus\"),blurScope:t.get(\"blurScope\"),emphasisDisabled:t.get(\"disabled\"),hoverScale:t.get(\"scale\"),labelStatesModels:ie(e),cursorStyle:e.get(\"cursor\")}}var g6=function(){function r(e){this.group=new nt,this._SymbolCtor=e||El}return r.prototype.updateData=function(e,t){this._progressiveEls=null,t=S_(t);var a=this.group,n=e.hostModel,i=this._data,o=this._SymbolCtor,s=t.disableAnimation,l=x_(e),u={disableAnimation:s},f=t.getSymbolPoint||function(h){return e.getItemLayout(h)};i||a.removeAll(),e.diff(i).add(function(h){var v=f(h);if(uc(e,v,h,t)){var c=new o(e,h,l,u);c.setPosition(v),e.setItemGraphicEl(h,c),a.add(c)}}).update(function(h,v){var c=i.getItemGraphicEl(v),d=f(h);if(!uc(e,d,h,t)){a.remove(c);return}var p=e.getItemVisual(h,\"symbol\")||\"circle\",g=c&&c.getSymbolType&&c.getSymbolType();if(!c||g&&g!==p)a.remove(c),c=new o(e,h,l,u),c.setPosition(d);else{c.updateData(e,h,l,u);var y={x:d[0],y:d[1]};s?c.attr(y):Lt(c,y,n)}a.add(c),e.setItemGraphicEl(h,c)}).remove(function(h){var v=i.getItemGraphicEl(h);v&&v.fadeOut(function(){a.remove(v)},n)}).execute(),this._getSymbolPoint=f,this._data=e},r.prototype.updateLayout=function(){var e=this,t=this._data;t&&t.eachItemGraphicEl(function(a,n){var i=e._getSymbolPoint(n);a.setPosition(i),a.markRedraw()})},r.prototype.incrementalPrepareUpdate=function(e){this._seriesScope=x_(e),this._data=null,this.group.removeAll()},r.prototype.incrementalUpdate=function(e,t,a){this._progressiveEls=[],a=S_(a);function n(l){l.isGroup||(l.incremental=!0,l.ensureState(\"emphasis\").hoverLayer=!0)}for(var i=e.start;i<e.end;i++){var o=t.getItemLayout(i);if(uc(t,o,i,a)){var s=new this._SymbolCtor(t,i,this._seriesScope);s.traverse(n),s.setPosition(o),this.group.add(s),t.setItemGraphicEl(i,s),this._progressiveEls.push(s)}}},r.prototype.eachRendered=function(e){vn(this._progressiveEls||this.group,e)},r.prototype.remove=function(e){var t=this.group,a=this._data;a&&e?a.eachItemGraphicEl(function(n){n.fadeOut(function(){t.remove(n)},a.hostModel)}):t.removeAll()},r}(),kl=g6;function YA(r,e,t){var a=r.getBaseAxis(),n=r.getOtherAxis(a),i=y6(n,t),o=a.dim,s=n.dim,l=e.mapDimension(s),u=e.mapDimension(o),f=s===\"x\"||s===\"radius\"?1:0,h=G(r.dimensions,function(d){return e.mapDimension(d)}),v=!1,c=e.getCalculationInfo(\"stackResultDimension\");return nn(e,h[0])&&(v=!0,h[0]=c),nn(e,h[1])&&(v=!0,h[1]=c),{dataDimsForPoint:h,valueStart:i,valueAxisDim:s,baseAxisDim:o,stacked:!!v,valueDim:l,baseDim:u,baseDataOffset:f,stackedOverDimension:e.getCalculationInfo(\"stackedOverDimension\")}}function y6(r,e){var t=0,a=r.scale.getExtent();return e===\"start\"?t=a[0]:e===\"end\"?t=a[1]:Mt(e)&&!isNaN(e)?t=e:a[0]>0?t=a[0]:a[1]<0&&(t=a[1]),t}function ZA(r,e,t,a){var n=NaN;r.stacked&&(n=t.get(t.getCalculationInfo(\"stackedOverDimension\"),a)),isNaN(n)&&(n=r.valueStart);var i=r.baseDataOffset,o=[];return o[i]=t.get(r.baseDim,a),o[1-i]=n,e.dataToPoint(o)}function m6(r,e){var t=[];return e.diff(r).add(function(a){t.push({cmd:\"+\",idx:a})}).update(function(a,n){t.push({cmd:\"=\",idx:n,idx1:a})}).remove(function(a){t.push({cmd:\"-\",idx:a})}).execute(),t}function _6(r,e,t,a,n,i,o,s){for(var l=m6(r,e),u=[],f=[],h=[],v=[],c=[],d=[],p=[],g=YA(n,e,o),y=r.getLayout(\"points\")||[],m=e.getLayout(\"points\")||[],_=0;_<l.length;_++){var S=l[_],w=!0,x=void 0,b=void 0;switch(S.cmd){case\"=\":x=S.idx*2,b=S.idx1*2;var C=y[x],T=y[x+1],D=m[b],M=m[b+1];(isNaN(C)||isNaN(T))&&(C=D,T=M),u.push(C,T),f.push(D,M),h.push(t[x],t[x+1]),v.push(a[b],a[b+1]),p.push(e.getRawIndex(S.idx1));break;case\"+\":var L=S.idx,I=g.dataDimsForPoint,P=n.dataToPoint([e.get(I[0],L),e.get(I[1],L)]);b=L*2,u.push(P[0],P[1]),f.push(m[b],m[b+1]);var R=ZA(g,n,e,L);h.push(R[0],R[1]),v.push(a[b],a[b+1]),p.push(e.getRawIndex(L));break;case\"-\":w=!1}w&&(c.push(S),d.push(d.length))}d.sort(function(pt,xt){return p[pt]-p[xt]});for(var E=u.length,B=Wr(E),O=Wr(E),z=Wr(E),H=Wr(E),$=[],_=0;_<d.length;_++){var X=d[_],Q=_*2,j=X*2;B[Q]=u[j],B[Q+1]=u[j+1],O[Q]=f[j],O[Q+1]=f[j+1],z[Q]=h[j],z[Q+1]=h[j+1],H[Q]=v[j],H[Q+1]=v[j+1],$[_]=c[X]}return{current:B,next:O,stackedOnCurrent:z,stackedOnNext:H,status:$}}var ka=Math.min,Oa=Math.max;function fi(r,e){return isNaN(r)||isNaN(e)}function Cp(r,e,t,a,n,i,o,s,l){for(var u,f,h,v,c,d,p=t,g=0;g<a;g++){var y=e[p*2],m=e[p*2+1];if(p>=n||p<0)break;if(fi(y,m)){if(l){p+=i;continue}break}if(p===t)r[i>0?\"moveTo\":\"lineTo\"](y,m),h=y,v=m;else{var _=y-u,S=m-f;if(_*_+S*S<.5){p+=i;continue}if(o>0){for(var w=p+i,x=e[w*2],b=e[w*2+1];x===y&&b===m&&g<a;)g++,w+=i,p+=i,x=e[w*2],b=e[w*2+1],y=e[p*2],m=e[p*2+1],_=y-u,S=m-f;var C=g+1;if(l)for(;fi(x,b)&&C<a;)C++,w+=i,x=e[w*2],b=e[w*2+1];var T=.5,D=0,M=0,L=void 0,I=void 0;if(C>=a||fi(x,b))c=y,d=m;else{D=x-u,M=b-f;var P=y-u,R=x-y,E=m-f,B=b-m,O=void 0,z=void 0;if(s===\"x\"){O=Math.abs(P),z=Math.abs(R);var H=D>0?1:-1;c=y-H*O*o,d=m,L=y+H*z*o,I=m}else if(s===\"y\"){O=Math.abs(E),z=Math.abs(B);var $=M>0?1:-1;c=y,d=m-$*O*o,L=y,I=m+$*z*o}else O=Math.sqrt(P*P+E*E),z=Math.sqrt(R*R+B*B),T=z/(z+O),c=y-D*o*(1-T),d=m-M*o*(1-T),L=y+D*o*T,I=m+M*o*T,L=ka(L,Oa(x,y)),I=ka(I,Oa(b,m)),L=Oa(L,ka(x,y)),I=Oa(I,ka(b,m)),D=L-y,M=I-m,c=y-D*O/z,d=m-M*O/z,c=ka(c,Oa(u,y)),d=ka(d,Oa(f,m)),c=Oa(c,ka(u,y)),d=Oa(d,ka(f,m)),D=y-c,M=m-d,L=y+D*z/O,I=m+M*z/O}r.bezierCurveTo(h,v,c,d,y,m),h=L,v=I}else r.lineTo(y,m)}u=y,f=m,p+=i}return g}var XA=function(){function r(){this.smooth=0,this.smoothConstraint=!0}return r}(),S6=function(r){k(e,r);function e(t){var a=r.call(this,t)||this;return a.type=\"ec-polyline\",a}return e.prototype.getDefaultStyle=function(){return{stroke:\"#000\",fill:null}},e.prototype.getDefaultShape=function(){return new XA},e.prototype.buildPath=function(t,a){var n=a.points,i=0,o=n.length/2;if(a.connectNulls){for(;o>0&&fi(n[o*2-2],n[o*2-1]);o--);for(;i<o&&fi(n[i*2],n[i*2+1]);i++);}for(;i<o;)i+=Cp(t,n,i,o,o,1,a.smooth,a.smoothMonotone,a.connectNulls)+1},e.prototype.getPointOn=function(t,a){this.path||(this.createPathProxy(),this.buildPath(this.path,this.shape));for(var n=this.path,i=n.data,o=Jr.CMD,s,l,u=a===\"x\",f=[],h=0;h<i.length;){var v=i[h++],c=void 0,d=void 0,p=void 0,g=void 0,y=void 0,m=void 0,_=void 0;switch(v){case o.M:s=i[h++],l=i[h++];break;case o.L:if(c=i[h++],d=i[h++],_=u?(t-s)/(c-s):(t-l)/(d-l),_<=1&&_>=0){var S=u?(d-l)*_+l:(c-s)*_+s;return u?[t,S]:[S,t]}s=c,l=d;break;case o.C:c=i[h++],d=i[h++],p=i[h++],g=i[h++],y=i[h++],m=i[h++];var w=u?mf(s,c,p,y,t,f):mf(l,d,g,m,t,f);if(w>0)for(var x=0;x<w;x++){var b=f[x];if(b<=1&&b>=0){var S=u?ae(l,d,g,m,b):ae(s,c,p,y,b);return u?[t,S]:[S,t]}}s=y,l=m;break}}},e}(mt),x6=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e}(XA),qA=function(r){k(e,r);function e(t){var a=r.call(this,t)||this;return a.type=\"ec-polygon\",a}return e.prototype.getDefaultShape=function(){return new x6},e.prototype.buildPath=function(t,a){var n=a.points,i=a.stackedOnPoints,o=0,s=n.length/2,l=a.smoothMonotone;if(a.connectNulls){for(;s>0&&fi(n[s*2-2],n[s*2-1]);s--);for(;o<s&&fi(n[o*2],n[o*2+1]);o++);}for(;o<s;){var u=Cp(t,n,o,s,s,1,a.smooth,l,a.connectNulls);Cp(t,i,o+u-1,u,s,-1,a.stackedOnSmooth,l,a.connectNulls),o+=u+1,t.closePath()}},e}(mt);function KA(r,e,t,a,n){var i=r.getArea(),o=i.x,s=i.y,l=i.width,u=i.height,f=t.get([\"lineStyle\",\"width\"])||2;o-=f/2,s-=f/2,l+=f,u+=f,o=Math.floor(o),l=Math.round(l);var h=new bt({shape:{x:o,y:s,width:l,height:u}});if(e){var v=r.getBaseAxis(),c=v.isHorizontal(),d=v.inverse;c?(d&&(h.shape.x+=l),h.shape.width=0):(d||(h.shape.y+=u),h.shape.height=0);var p=J(n)?function(g){n(g,h)}:null;Ft(h,{shape:{width:l,height:u,x:o,y:s}},t,null,a,p)}return h}function JA(r,e,t){var a=r.getArea(),n=Zt(a.r0,1),i=Zt(a.r,1),o=new Ve({shape:{cx:Zt(r.cx,1),cy:Zt(r.cy,1),r0:n,r:i,startAngle:a.startAngle,endAngle:a.endAngle,clockwise:a.clockwise}});if(e){var s=r.getBaseAxis().dim===\"angle\";s?o.shape.endAngle=a.startAngle:o.shape.r=n,Ft(o,{shape:{endAngle:a.endAngle,r:i}},t)}return o}function Wh(r,e,t,a,n){if(r){if(r.type===\"polar\")return JA(r,e,t);if(r.type===\"cartesian2d\")return KA(r,e,t,a,n)}else return null;return null}function Di(r,e){return r.type===e}function w_(r,e){if(r.length===e.length){for(var t=0;t<r.length;t++)if(r[t]!==e[t])return;return!0}}function b_(r){for(var e=1/0,t=1/0,a=-1/0,n=-1/0,i=0;i<r.length;){var o=r[i++],s=r[i++];isNaN(o)||(e=Math.min(o,e),a=Math.max(o,a)),isNaN(s)||(t=Math.min(s,t),n=Math.max(s,n))}return[[e,t],[a,n]]}function C_(r,e){var t=b_(r),a=t[0],n=t[1],i=b_(e),o=i[0],s=i[1];return Math.max(Math.abs(a[0]-o[0]),Math.abs(a[1]-o[1]),Math.abs(n[0]-s[0]),Math.abs(n[1]-s[1]))}function T_(r){return Mt(r)?r:r?.5:0}function w6(r,e,t){if(!t.valueDim)return[];for(var a=e.count(),n=Wr(a*2),i=0;i<a;i++){var o=ZA(t,r,e,i);n[i*2]=o[0],n[i*2+1]=o[1]}return n}function Ba(r,e,t,a){var n=e.getBaseAxis(),i=n.dim===\"x\"||n.dim===\"radius\"?0:1,o=[],s=0,l=[],u=[],f=[],h=[];if(a){for(s=0;s<r.length;s+=2)!isNaN(r[s])&&!isNaN(r[s+1])&&h.push(r[s],r[s+1]);r=h}for(s=0;s<r.length-2;s+=2)switch(f[0]=r[s+2],f[1]=r[s+3],u[0]=r[s],u[1]=r[s+1],o.push(u[0],u[1]),t){case\"end\":l[i]=f[i],l[1-i]=u[1-i],o.push(l[0],l[1]);break;case\"middle\":var v=(u[i]+f[i])/2,c=[];l[i]=c[i]=v,l[1-i]=u[1-i],c[1-i]=f[1-i],o.push(l[0],l[1]),o.push(c[0],c[1]);break;default:l[i]=u[i],l[1-i]=f[1-i],o.push(l[0],l[1])}return o.push(r[s++],r[s++]),o}function b6(r,e){var t=[],a=r.length,n,i;function o(f,h,v){var c=f.coord,d=(v-c)/(h.coord-c),p=CE(d,[f.color,h.color]);return{coord:v,color:p}}for(var s=0;s<a;s++){var l=r[s],u=l.coord;if(u<0)n=l;else if(u>e){i?t.push(o(i,l,e)):n&&t.push(o(n,l,0),o(n,l,e));break}else n&&(t.push(o(n,l,0)),n=null),t.push(l),i=l}return t}function C6(r,e,t){var a=r.getVisual(\"visualMeta\");if(!(!a||!a.length||!r.count())&&e.type===\"cartesian2d\"){for(var n,i,o=a.length-1;o>=0;o--){var s=r.getDimensionInfo(a[o].dimension);if(n=s&&s.coordDim,n===\"x\"||n===\"y\"){i=a[o];break}}if(!!i){var l=e.getAxis(n),u=G(i.stops,function(_){return{coord:l.toGlobalCoord(l.dataToCoord(_.value)),color:_.color}}),f=u.length,h=i.outerColors.slice();f&&u[0].coord>u[f-1].coord&&(u.reverse(),h.reverse());var v=b6(u,n===\"x\"?t.getWidth():t.getHeight()),c=v.length;if(!c&&f)return u[0].coord<0?h[1]?h[1]:u[f-1].color:h[0]?h[0]:u[0].color;var d=10,p=v[0].coord-d,g=v[c-1].coord+d,y=g-p;if(y<.001)return\"transparent\";A(v,function(_){_.offset=(_.coord-p)/y}),v.push({offset:c?v[c-1].offset:.5,color:h[1]||\"transparent\"}),v.unshift({offset:c?v[0].offset:.5,color:h[0]||\"transparent\"});var m=new Cl(0,0,0,0,v,!0);return m[n]=p,m[n+\"2\"]=g,m}}}function T6(r,e,t){var a=r.get(\"showAllSymbol\"),n=a===\"auto\";if(!(a&&!n)){var i=t.getAxesByScale(\"ordinal\")[0];if(!!i&&!(n&&A6(i,e))){var o=e.mapDimension(i.dim),s={};return A(i.getViewLabels(),function(l){var u=i.scale.getRawOrdinalNumber(l.tickValue);s[u]=1}),function(l){return!s.hasOwnProperty(e.get(o,l))}}}}function A6(r,e){var t=r.getExtent(),a=Math.abs(t[1]-t[0])/r.scale.count();isNaN(a)&&(a=0);for(var n=e.count(),i=Math.max(1,Math.round(n/5)),o=0;o<n;o+=i)if(El.getSymbolSize(e,o)[r.isHorizontal()?1:0]*1.5>a)return!1;return!0}function D6(r,e){return isNaN(r)||isNaN(e)}function M6(r){for(var e=r.length/2;e>0&&D6(r[e*2-2],r[e*2-1]);e--);return e-1}function A_(r,e){return[r[e*2],r[e*2+1]]}function L6(r,e,t){for(var a=r.length/2,n=t===\"x\"?0:1,i,o,s=0,l=-1,u=0;u<a;u++)if(o=r[u*2+n],!(isNaN(o)||isNaN(r[u*2+1-n]))){if(u===0){i=o;continue}if(i<=e&&o>=e||i>=e&&o<=e){l=u;break}s=u,i=o}return{range:[s,l],t:(e-i)/(o-i)}}function QA(r){if(r.get([\"endLabel\",\"show\"]))return!0;for(var e=0;e<Le.length;e++)if(r.get([Le[e],\"endLabel\",\"show\"]))return!0;return!1}function fc(r,e,t,a){if(Di(e,\"cartesian2d\")){var n=a.getModel(\"endLabel\"),i=n.get(\"valueAnimation\"),o=a.getData(),s={lastFrameIndex:0},l=QA(a)?function(c,d){r._endLabelOnDuring(c,d,o,s,i,n,e)}:null,u=e.getBaseAxis().isHorizontal(),f=KA(e,t,a,function(){var c=r._endLabel;c&&t&&s.originalX!=null&&c.attr({x:s.originalX,y:s.originalY})},l);if(!a.get(\"clip\",!0)){var h=f.shape,v=Math.max(h.width,h.height);u?(h.y-=v,h.height+=v*2):(h.x-=v,h.width+=v*2)}return l&&l(1,f),f}else return JA(e,t,a)}function I6(r,e){var t=e.getBaseAxis(),a=t.isHorizontal(),n=t.inverse,i=a?n?\"right\":\"left\":\"center\",o=a?\"middle\":n?\"top\":\"bottom\";return{normal:{align:r.get(\"align\")||i,verticalAlign:r.get(\"verticalAlign\")||o}}}var P6=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.init=function(){var t=new nt,a=new kl;this.group.add(a.group),this._symbolDraw=a,this._lineGroup=t},e.prototype.render=function(t,a,n){var i=this,o=t.coordinateSystem,s=this.group,l=t.getData(),u=t.getModel(\"lineStyle\"),f=t.getModel(\"areaStyle\"),h=l.getLayout(\"points\")||[],v=o.type===\"polar\",c=this._coordSys,d=this._symbolDraw,p=this._polyline,g=this._polygon,y=this._lineGroup,m=!a.ssr&&t.isAnimationEnabled(),_=!f.isEmpty(),S=f.get(\"origin\"),w=YA(o,l,S),x=_&&w6(o,l,w),b=t.get(\"showSymbol\"),C=t.get(\"connectNulls\"),T=b&&!v&&T6(t,l,o),D=this._data;D&&D.eachItemGraphicEl(function(xt,gt){xt.__temp&&(s.remove(xt),D.setItemGraphicEl(gt,null))}),b||d.remove(),s.add(y);var M=v?!1:t.get(\"step\"),L;o&&o.getArea&&t.get(\"clip\",!0)&&(L=o.getArea(),L.width!=null?(L.x-=.1,L.y-=.1,L.width+=.2,L.height+=.2):L.r0&&(L.r0-=.5,L.r+=.5)),this._clipShapeForSymbol=L;var I=C6(l,o,n)||l.getVisual(\"style\")[l.getVisual(\"drawType\")];if(!(p&&c.type===o.type&&M===this._step))b&&d.updateData(l,{isIgnore:T,clipShape:L,disableAnimation:!0,getSymbolPoint:function(xt){return[h[xt*2],h[xt*2+1]]}}),m&&this._initSymbolLabelAnimation(l,o,L),M&&(h=Ba(h,o,M,C),x&&(x=Ba(x,o,M,C))),p=this._newPolyline(h),_?g=this._newPolygon(h,x):g&&(y.remove(g),g=this._polygon=null),v||this._initOrUpdateEndLabel(t,o,yi(I)),y.setClipPath(fc(this,o,!0,t));else{_&&!g?g=this._newPolygon(h,x):g&&!_&&(y.remove(g),g=this._polygon=null),v||this._initOrUpdateEndLabel(t,o,yi(I));var P=y.getClipPath();if(P){var R=fc(this,o,!1,t);Ft(P,{shape:R.shape},t)}else y.setClipPath(fc(this,o,!0,t));b&&d.updateData(l,{isIgnore:T,clipShape:L,disableAnimation:!0,getSymbolPoint:function(xt){return[h[xt*2],h[xt*2+1]]}}),(!w_(this._stackedOnPoints,x)||!w_(this._points,h))&&(m?this._doUpdateAnimation(l,x,o,n,M,S,C):(M&&(h=Ba(h,o,M,C),x&&(x=Ba(x,o,M,C))),p.setShape({points:h}),g&&g.setShape({points:h,stackedOnPoints:x})))}var E=t.getModel(\"emphasis\"),B=E.get(\"focus\"),O=E.get(\"blurScope\"),z=E.get(\"disabled\");if(p.useStyle(tt(u.getLineStyle(),{fill:\"none\",stroke:I,lineJoin:\"bevel\"})),ce(p,t,\"lineStyle\"),p.style.lineWidth>0&&t.get([\"emphasis\",\"lineStyle\",\"width\"])===\"bolder\"){var H=p.getState(\"emphasis\").style;H.lineWidth=+p.style.lineWidth+1}it(p).seriesIndex=t.seriesIndex,$t(p,B,O,z);var $=T_(t.get(\"smooth\")),X=t.get(\"smoothMonotone\");if(p.setShape({smooth:$,smoothMonotone:X,connectNulls:C}),g){var Q=l.getCalculationInfo(\"stackedOnSeries\"),j=0;g.useStyle(tt(f.getAreaStyle(),{fill:I,opacity:.7,lineJoin:\"bevel\",decal:l.getVisual(\"style\").decal})),Q&&(j=T_(Q.get(\"smooth\"))),g.setShape({smooth:$,stackedOnSmooth:j,smoothMonotone:X,connectNulls:C}),ce(g,t,\"areaStyle\"),it(g).seriesIndex=t.seriesIndex,$t(g,B,O,z)}var pt=function(xt){i._changePolyState(xt)};l.eachItemGraphicEl(function(xt){xt&&(xt.onHoverStateChange=pt)}),this._polyline.onHoverStateChange=pt,this._data=l,this._coordSys=o,this._stackedOnPoints=x,this._points=h,this._step=M,this._valueOrigin=S,t.get(\"triggerLineEvent\")&&(this.packEventData(t,p),g&&this.packEventData(t,g))},e.prototype.packEventData=function(t,a){it(a).eventData={componentType:\"series\",componentSubType:\"line\",componentIndex:t.componentIndex,seriesIndex:t.seriesIndex,seriesName:t.name,seriesType:\"line\"}},e.prototype.highlight=function(t,a,n,i){var o=t.getData(),s=di(o,i);if(this._changePolyState(\"emphasis\"),!(s instanceof Array)&&s!=null&&s>=0){var l=o.getLayout(\"points\"),u=o.getItemGraphicEl(s);if(!u){var f=l[s*2],h=l[s*2+1];if(isNaN(f)||isNaN(h)||this._clipShapeForSymbol&&!this._clipShapeForSymbol.contain(f,h))return;var v=t.get(\"zlevel\")||0,c=t.get(\"z\")||0;u=new El(o,s),u.x=f,u.y=h,u.setZ(v,c);var d=u.getSymbolPath().getTextContent();d&&(d.zlevel=v,d.z=c,d.z2=this._polyline.z2+1),u.__temp=!0,o.setItemGraphicEl(s,u),u.stopSymbolAnimation(!0),this.group.add(u)}u.highlight()}else zt.prototype.highlight.call(this,t,a,n,i)},e.prototype.downplay=function(t,a,n,i){var o=t.getData(),s=di(o,i);if(this._changePolyState(\"normal\"),s!=null&&s>=0){var l=o.getItemGraphicEl(s);l&&(l.__temp?(o.setItemGraphicEl(s,null),this.group.remove(l)):l.downplay())}else zt.prototype.downplay.call(this,t,a,n,i)},e.prototype._changePolyState=function(t){var a=this._polygon;Af(this._polyline,t),a&&Af(a,t)},e.prototype._newPolyline=function(t){var a=this._polyline;return a&&this._lineGroup.remove(a),a=new S6({shape:{points:t},segmentIgnoreThreshold:2,z2:10}),this._lineGroup.add(a),this._polyline=a,a},e.prototype._newPolygon=function(t,a){var n=this._polygon;return n&&this._lineGroup.remove(n),n=new qA({shape:{points:t,stackedOnPoints:a},segmentIgnoreThreshold:2}),this._lineGroup.add(n),this._polygon=n,n},e.prototype._initSymbolLabelAnimation=function(t,a,n){var i,o,s=a.getBaseAxis(),l=s.inverse;a.type===\"cartesian2d\"?(i=s.isHorizontal(),o=!1):a.type===\"polar\"&&(i=s.dim===\"angle\",o=!0);var u=t.hostModel,f=u.get(\"animationDuration\");J(f)&&(f=f(null));var h=u.get(\"animationDelay\")||0,v=J(h)?h(null):h;t.eachItemGraphicEl(function(c,d){var p=c;if(p){var g=[c.x,c.y],y=void 0,m=void 0,_=void 0;if(n)if(o){var S=n,w=a.pointToCoord(g);i?(y=S.startAngle,m=S.endAngle,_=-w[1]/180*Math.PI):(y=S.r0,m=S.r,_=w[0])}else{var x=n;i?(y=x.x,m=x.x+x.width,_=c.x):(y=x.y+x.height,m=x.y,_=c.y)}var b=m===y?0:(_-y)/(m-y);l&&(b=1-b);var C=J(h)?h(d):f*b+v,T=p.getSymbolPath(),D=T.getTextContent();p.attr({scaleX:0,scaleY:0}),p.animateTo({scaleX:1,scaleY:1},{duration:200,setToFinal:!0,delay:C}),D&&D.animateFrom({style:{opacity:0}},{duration:300,delay:C}),T.disableLabelAnimation=!0}})},e.prototype._initOrUpdateEndLabel=function(t,a,n){var i=t.getModel(\"endLabel\");if(QA(t)){var o=t.getData(),s=this._polyline,l=o.getLayout(\"points\");if(!l){s.removeTextContent(),this._endLabel=null;return}var u=this._endLabel;u||(u=this._endLabel=new Dt({z2:200}),u.ignoreClip=!0,s.setTextContent(this._endLabel),s.disableLabelAnimation=!0);var f=M6(l);f>=0&&(de(s,ie(t,\"endLabel\"),{inheritColor:n,labelFetcher:t,labelDataIndex:f,defaultText:function(h,v,c){return c!=null?UA(o,c):go(o,h)},enableTextSetter:!0},I6(i,a)),s.textConfig.position=null)}else this._endLabel&&(this._polyline.removeTextContent(),this._endLabel=null)},e.prototype._endLabelOnDuring=function(t,a,n,i,o,s,l){var u=this._endLabel,f=this._polyline;if(u){t<1&&i.originalX==null&&(i.originalX=u.x,i.originalY=u.y);var h=n.getLayout(\"points\"),v=n.hostModel,c=v.get(\"connectNulls\"),d=s.get(\"precision\"),p=s.get(\"distance\")||0,g=l.getBaseAxis(),y=g.isHorizontal(),m=g.inverse,_=a.shape,S=m?y?_.x:_.y+_.height:y?_.x+_.width:_.y,w=(y?p:0)*(m?-1:1),x=(y?0:-p)*(m?-1:1),b=y?\"x\":\"y\",C=L6(h,S,b),T=C.range,D=T[1]-T[0],M=void 0;if(D>=1){if(D>1&&!c){var L=A_(h,T[0]);u.attr({x:L[0]+w,y:L[1]+x}),o&&(M=v.getRawValue(T[0]))}else{var L=f.getPointOn(S,b);L&&u.attr({x:L[0]+w,y:L[1]+x});var I=v.getRawValue(T[0]),P=v.getRawValue(T[1]);o&&(M=P2(n,d,I,P,C.t))}i.lastFrameIndex=T[0]}else{var R=t===1||i.lastFrameIndex>0?T[0]:0,L=A_(h,R);o&&(M=v.getRawValue(R)),u.attr({x:L[0]+w,y:L[1]+x})}if(o){var E=Mo(u);typeof E.setLabelText==\"function\"&&E.setLabelText(M)}}},e.prototype._doUpdateAnimation=function(t,a,n,i,o,s,l){var u=this._polyline,f=this._polygon,h=t.hostModel,v=_6(this._data,t,this._stackedOnPoints,a,this._coordSys,n,this._valueOrigin),c=v.current,d=v.stackedOnCurrent,p=v.next,g=v.stackedOnNext;if(o&&(c=Ba(v.current,n,o,l),d=Ba(v.stackedOnCurrent,n,o,l),p=Ba(v.next,n,o,l),g=Ba(v.stackedOnNext,n,o,l)),C_(c,p)>3e3||f&&C_(d,g)>3e3){u.stopAnimation(),u.setShape({points:p}),f&&(f.stopAnimation(),f.setShape({points:p,stackedOnPoints:g}));return}u.shape.__points=v.current,u.shape.points=c;var y={shape:{points:p}};v.current!==c&&(y.shape.__points=v.next),u.stopAnimation(),Lt(u,y,h),f&&(f.setShape({points:c,stackedOnPoints:d}),f.stopAnimation(),Lt(f,{shape:{stackedOnPoints:g}},h),u.shape.points!==f.shape.points&&(f.shape.points=u.shape.points));for(var m=[],_=v.status,S=0;S<_.length;S++){var w=_[S].cmd;if(w===\"=\"){var x=t.getItemGraphicEl(_[S].idx1);x&&m.push({el:x,ptIdx:S})}}u.animators&&u.animators.length&&u.animators[0].during(function(){f&&f.dirtyShape();for(var b=u.shape.__points,C=0;C<m.length;C++){var T=m[C].el,D=m[C].ptIdx*2;T.x=b[D],T.y=b[D+1],T.markRedraw()}})},e.prototype.remove=function(t){var a=this.group,n=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),n&&n.eachItemGraphicEl(function(i,o){i.__temp&&(a.remove(i),n.setItemGraphicEl(o,null))}),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._endLabel=this._data=null},e.type=\"line\",e}(zt),R6=P6;function Ol(r,e){return{seriesType:r,plan:ko(),reset:function(t){var a=t.getData(),n=t.coordinateSystem,i=t.pipelineContext,o=e||i.large;if(!!n){var s=G(n.dimensions,function(c){return a.mapDimension(c)}).slice(0,2),l=s.length,u=a.getCalculationInfo(\"stackResultDimension\");nn(a,s[0])&&(s[0]=u),nn(a,s[1])&&(s[1]=u);var f=a.getStore(),h=a.getDimensionIndex(s[0]),v=a.getDimensionIndex(s[1]);return l&&{progress:function(c,d){for(var p=c.end-c.start,g=o&&Wr(p*l),y=[],m=[],_=c.start,S=0;_<c.end;_++){var w=void 0;if(l===1){var x=f.get(h,_);w=n.dataToPoint(x,null,m)}else y[0]=f.get(h,_),y[1]=f.get(v,_),w=n.dataToPoint(y,null,m);o?(g[S++]=w[0],g[S++]=w[1]):d.setItemLayout(_,w.slice())}o&&d.setLayout(\"points\",g)}}}}}}var E6={average:function(r){for(var e=0,t=0,a=0;a<r.length;a++)isNaN(r[a])||(e+=r[a],t++);return t===0?NaN:e/t},sum:function(r){for(var e=0,t=0;t<r.length;t++)e+=r[t]||0;return e},max:function(r){for(var e=-1/0,t=0;t<r.length;t++)r[t]>e&&(e=r[t]);return isFinite(e)?e:NaN},min:function(r){for(var e=1/0,t=0;t<r.length;t++)r[t]<e&&(e=r[t]);return isFinite(e)?e:NaN},nearest:function(r){return r[0]}},k6=function(r){return Math.round(r.length/2)};function jA(r){return{seriesType:r,reset:function(e,t,a){var n=e.getData(),i=e.get(\"sampling\"),o=e.coordinateSystem,s=n.count();if(s>10&&o.type===\"cartesian2d\"&&i){var l=o.getBaseAxis(),u=o.getOtherAxis(l),f=l.getExtent(),h=a.getDevicePixelRatio(),v=Math.abs(f[1]-f[0])*(h||1),c=Math.round(s/v);if(isFinite(c)&&c>1){i===\"lttb\"&&e.setData(n.lttbDownSample(n.mapDimension(u.dim),1/c));var d=void 0;U(i)?d=E6[i]:J(i)&&(d=i),d&&e.setData(n.downSample(n.mapDimension(u.dim),1/c,d,k6))}}}}}function tD(r){r.registerChartView(R6),r.registerSeriesModel(c6),r.registerLayout(Ol(\"line\",!0)),r.registerVisual({seriesType:\"line\",reset:function(e){var t=e.getData(),a=e.getModel(\"lineStyle\").getLineStyle();a&&!a.stroke&&(a.stroke=t.getVisual(\"style\").fill),t.setVisual(\"legendLineStyle\",a)}}),r.registerProcessor(r.PRIORITY.PROCESSOR.STATISTIC,jA(\"line\"))}var eD=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.getInitialData=function(t,a){return Ta(null,this,{useEncodeDefaulter:!0})},e.prototype.getMarkerPosition=function(t,a,n){var i=this.coordinateSystem;if(i&&i.clampData){var o=i.clampData(t),s=i.dataToPoint(o);if(n)A(i.getAxes(),function(v,c){if(v.type===\"category\"&&a!=null){var d=v.getTicksCoords(),p=o[c],g=a[c]===\"x1\"||a[c]===\"y1\";if(g&&(p+=1),d.length<2)return;if(d.length===2){s[c]=v.toGlobalCoord(v.getExtent()[g?1:0]);return}for(var y=void 0,m=void 0,_=1,S=0;S<d.length;S++){var w=d[S].coord,x=S===d.length-1?d[S-1].tickValue+_:d[S].tickValue;if(x===p){m=w;break}else if(x<p)y=w;else if(y!=null&&x>p){m=(w+y)/2;break}S===1&&(_=x-d[0].tickValue)}m==null&&(y?y&&(m=d[d.length-1].coord):m=d[0].coord),s[c]=v.toGlobalCoord(m)}});else{var l=this.getData(),u=l.getLayout(\"offset\"),f=l.getLayout(\"size\"),h=i.getBaseAxis().isHorizontal()?0:1;s[h]+=u+f/2}return s}return[NaN,NaN]},e.type=\"series.__base_bar__\",e.defaultOption={z:2,coordinateSystem:\"cartesian2d\",legendHoverLink:!0,barMinHeight:0,barMinAngle:0,large:!1,largeThreshold:400,progressive:3e3,progressiveChunkMode:\"mod\"},e}(Ht);Ht.registerClass(eD);var $f=eD,O6=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.getInitialData=function(){return Ta(null,this,{useEncodeDefaulter:!0,createInvertedIndices:!!this.get(\"realtimeSort\",!0)||null})},e.prototype.getProgressive=function(){return this.get(\"large\")?this.get(\"progressive\"):!1},e.prototype.getProgressiveThreshold=function(){var t=this.get(\"progressiveThreshold\"),a=this.get(\"largeThreshold\");return a>t&&(t=a),t},e.prototype.brushSelector=function(t,a,n){return n.rect(a.getItemLayout(t))},e.type=\"series.bar\",e.dependencies=[\"grid\",\"polar\"],e.defaultOption=cn($f.defaultOption,{clip:!0,roundCap:!1,showBackground:!1,backgroundStyle:{color:\"rgba(180, 180, 180, 0.2)\",borderColor:null,borderWidth:0,borderType:\"solid\",borderRadius:0,shadowBlur:0,shadowColor:null,shadowOffsetX:0,shadowOffsetY:0,opacity:1},select:{itemStyle:{borderColor:\"#212121\"}},realtimeSort:!1}),e}($f),B6=O6,N6=function(){function r(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=Math.PI*2,this.clockwise=!0}return r}(),V6=function(r){k(e,r);function e(t){var a=r.call(this,t)||this;return a.type=\"sausage\",a}return e.prototype.getDefaultShape=function(){return new N6},e.prototype.buildPath=function(t,a){var n=a.cx,i=a.cy,o=Math.max(a.r0||0,0),s=Math.max(a.r,0),l=(s-o)*.5,u=o+l,f=a.startAngle,h=a.endAngle,v=a.clockwise,c=Math.PI*2,d=v?h-f<c:f-h<c;d||(f=h-(v?c:-c));var p=Math.cos(f),g=Math.sin(f),y=Math.cos(h),m=Math.sin(h);d?(t.moveTo(p*o+n,g*o+i),t.arc(p*u+n,g*u+i,l,-Math.PI+f,f,!v)):t.moveTo(p*s+n,g*s+i),t.arc(n,i,s,f,h,!v),t.arc(y*u+n,m*u+i,l,h-Math.PI*2,h-Math.PI,!v),o!==0&&t.arc(n,i,o,h,f,v)},e}(mt),Uf=V6;function z6(r,e){e=e||{};var t=e.isRoundCap;return function(a,n,i){var o=n.position;if(!o||o instanceof Array)return bf(a,n,i);var s=r(o),l=n.distance!=null?n.distance:5,u=this.shape,f=u.cx,h=u.cy,v=u.r,c=u.r0,d=(v+c)/2,p=u.startAngle,g=u.endAngle,y=(p+g)/2,m=t?Math.abs(v-c)/2:0,_=Math.cos,S=Math.sin,w=f+v*_(p),x=h+v*S(p),b=\"left\",C=\"top\";switch(s){case\"startArc\":w=f+(c-l)*_(y),x=h+(c-l)*S(y),b=\"center\",C=\"top\";break;case\"insideStartArc\":w=f+(c+l)*_(y),x=h+(c+l)*S(y),b=\"center\",C=\"bottom\";break;case\"startAngle\":w=f+d*_(p)+bu(p,l+m,!1),x=h+d*S(p)+Cu(p,l+m,!1),b=\"right\",C=\"middle\";break;case\"insideStartAngle\":w=f+d*_(p)+bu(p,-l+m,!1),x=h+d*S(p)+Cu(p,-l+m,!1),b=\"left\",C=\"middle\";break;case\"middle\":w=f+d*_(y),x=h+d*S(y),b=\"center\",C=\"middle\";break;case\"endArc\":w=f+(v+l)*_(y),x=h+(v+l)*S(y),b=\"center\",C=\"bottom\";break;case\"insideEndArc\":w=f+(v-l)*_(y),x=h+(v-l)*S(y),b=\"center\",C=\"top\";break;case\"endAngle\":w=f+d*_(g)+bu(g,l+m,!0),x=h+d*S(g)+Cu(g,l+m,!0),b=\"left\",C=\"middle\";break;case\"insideEndAngle\":w=f+d*_(g)+bu(g,-l+m,!0),x=h+d*S(g)+Cu(g,-l+m,!0),b=\"right\",C=\"middle\";break;default:return bf(a,n,i)}return a=a||{},a.x=w,a.y=x,a.align=b,a.verticalAlign=C,a}}function F6(r,e,t,a){if(Mt(a)){r.setTextConfig({rotation:a});return}else if(F(e)){r.setTextConfig({rotation:0});return}var n=r.shape,i=n.clockwise?n.startAngle:n.endAngle,o=n.clockwise?n.endAngle:n.startAngle,s=(i+o)/2,l,u=t(e);switch(u){case\"startArc\":case\"insideStartArc\":case\"middle\":case\"insideEndArc\":case\"endArc\":l=s;break;case\"startAngle\":case\"insideStartAngle\":l=i;break;case\"endAngle\":case\"insideEndAngle\":l=o;break;default:r.setTextConfig({rotation:0});return}var f=Math.PI*1.5-l;u===\"middle\"&&f>Math.PI/2&&f<Math.PI*1.5&&(f-=Math.PI),r.setTextConfig({rotation:f})}function bu(r,e,t){return e*Math.sin(r)*(t?-1:1)}function Cu(r,e,t){return e*Math.cos(r)*(t?1:-1)}function ri(r,e,t){var a=r.get(\"borderRadius\");if(a==null)return t?{cornerRadius:0}:null;F(a)||(a=[a,a,a,a]);var n=Math.abs(e.r||0-e.r0||0);return{cornerRadius:G(a,function(i){return Tr(i,n)})}}var hc=Math.max,vc=Math.min;function G6(r,e){var t=r.getArea&&r.getArea();if(Di(r,\"cartesian2d\")){var a=r.getBaseAxis();if(a.type!==\"category\"||!a.onBand){var n=e.getLayout(\"bandWidth\");a.isHorizontal()?(t.x-=n,t.width+=n*2):(t.y-=n,t.height+=n*2)}}return t}var H6=function(r){k(e,r);function e(){var t=r.call(this)||this;return t.type=e.type,t._isFirstFrame=!0,t}return e.prototype.render=function(t,a,n,i){this._model=t,this._removeOnRenderedListener(n),this._updateDrawMode(t);var o=t.get(\"coordinateSystem\");(o===\"cartesian2d\"||o===\"polar\")&&(this._progressiveEls=null,this._isLargeDraw?this._renderLarge(t,a,n):this._renderNormal(t,a,n,i))},e.prototype.incrementalPrepareRender=function(t){this._clear(),this._updateDrawMode(t),this._updateLargeClip(t)},e.prototype.incrementalRender=function(t,a){this._progressiveEls=[],this._incrementalRenderLarge(t,a)},e.prototype.eachRendered=function(t){vn(this._progressiveEls||this.group,t)},e.prototype._updateDrawMode=function(t){var a=t.pipelineContext.large;(this._isLargeDraw==null||a!==this._isLargeDraw)&&(this._isLargeDraw=a,this._clear())},e.prototype._renderNormal=function(t,a,n,i){var o=this.group,s=t.getData(),l=this._data,u=t.coordinateSystem,f=u.getBaseAxis(),h;u.type===\"cartesian2d\"?h=f.isHorizontal():u.type===\"polar\"&&(h=f.dim===\"angle\");var v=t.isAnimationEnabled()?t:null,c=W6(t,u);c&&this._enableRealtimeSort(c,s,n);var d=t.get(\"clip\",!0)||c,p=G6(u,s);o.removeClipPath();var g=t.get(\"roundCap\",!0),y=t.get(\"showBackground\",!0),m=t.getModel(\"backgroundStyle\"),_=m.get(\"borderRadius\")||0,S=[],w=this._backgroundEls,x=i&&i.isInitSort,b=i&&i.type===\"changeAxisOrder\";function C(M){var L=Tu[u.type](s,M),I=K6(u,h,L);return I.useStyle(m.getItemStyle()),u.type===\"cartesian2d\"?I.setShape(\"r\",_):I.setShape(\"cornerRadius\",_),S[M]=I,I}s.diff(l).add(function(M){var L=s.getItemModel(M),I=Tu[u.type](s,M,L);if(y&&C(M),!(!s.hasValue(M)||!P_[u.type](I))){var P=!1;d&&(P=D_[u.type](p,I));var R=M_[u.type](t,s,M,I,h,v,f.model,!1,g);c&&(R.forceLabelAnimation=!0),R_(R,s,M,L,I,t,h,u.type===\"polar\"),x?R.attr({shape:I}):c?L_(c,v,R,I,M,h,!1,!1):Ft(R,{shape:I},t,M),s.setItemGraphicEl(M,R),o.add(R),R.ignore=P}}).update(function(M,L){var I=s.getItemModel(M),P=Tu[u.type](s,M,I);if(y){var R=void 0;w.length===0?R=C(L):(R=w[L],R.useStyle(m.getItemStyle()),u.type===\"cartesian2d\"?R.setShape(\"r\",_):R.setShape(\"cornerRadius\",_),S[M]=R);var E=Tu[u.type](s,M),B=aD(h,E,u);Lt(R,{shape:B},v,M)}var O=l.getItemGraphicEl(L);if(!s.hasValue(M)||!P_[u.type](P)){o.remove(O);return}var z=!1;if(d&&(z=D_[u.type](p,P),z&&o.remove(O)),O?Ar(O):O=M_[u.type](t,s,M,P,h,v,f.model,!!O,g),c&&(O.forceLabelAnimation=!0),b){var H=O.getTextContent();if(H){var $=Mo(H);$.prevValue!=null&&($.prevValue=$.value)}}else R_(O,s,M,I,P,t,h,u.type===\"polar\");x?O.attr({shape:P}):c?L_(c,v,O,P,M,h,!0,b):Lt(O,{shape:P},t,M,null),s.setItemGraphicEl(M,O),O.ignore=z,o.add(O)}).remove(function(M){var L=l.getItemGraphicEl(M);L&&Js(L,t,M)}).execute();var T=this._backgroundGroup||(this._backgroundGroup=new nt);T.removeAll();for(var D=0;D<S.length;++D)T.add(S[D]);o.add(T),this._backgroundEls=S,this._data=s},e.prototype._renderLarge=function(t,a,n){this._clear(),k_(t,this.group),this._updateLargeClip(t)},e.prototype._incrementalRenderLarge=function(t,a){this._removeBackground(),k_(a,this.group,this._progressiveEls,!0)},e.prototype._updateLargeClip=function(t){var a=t.get(\"clip\",!0)&&Wh(t.coordinateSystem,!1,t),n=this.group;a?n.setClipPath(a):n.removeClipPath()},e.prototype._enableRealtimeSort=function(t,a,n){var i=this;if(!!a.count()){var o=t.baseAxis;if(this._isFirstFrame)this._dispatchInitSort(a,t,n),this._isFirstFrame=!1;else{var s=function(l){var u=a.getItemGraphicEl(l),f=u&&u.shape;return f&&Math.abs(o.isHorizontal()?f.height:f.width)||0};this._onRendered=function(){i._updateSortWithinSameData(a,s,o,n)},n.getZr().on(\"rendered\",this._onRendered)}}},e.prototype._dataSort=function(t,a,n){var i=[];return t.each(t.mapDimension(a.dim),function(o,s){var l=n(s);l=l==null?NaN:l,i.push({dataIndex:s,mappedValue:l,ordinalNumber:o})}),i.sort(function(o,s){return s.mappedValue-o.mappedValue}),{ordinalNumbers:G(i,function(o){return o.ordinalNumber})}},e.prototype._isOrderChangedWithinSameData=function(t,a,n){for(var i=n.scale,o=t.mapDimension(n.dim),s=Number.MAX_VALUE,l=0,u=i.getOrdinalMeta().categories.length;l<u;++l){var f=t.rawIndexOf(o,i.getRawOrdinalNumber(l)),h=f<0?Number.MIN_VALUE:a(t.indexOfRawIndex(f));if(h>s)return!0;s=h}return!1},e.prototype._isOrderDifferentInView=function(t,a){for(var n=a.scale,i=n.getExtent(),o=Math.max(0,i[0]),s=Math.min(i[1],n.getOrdinalMeta().categories.length-1);o<=s;++o)if(t.ordinalNumbers[o]!==n.getRawOrdinalNumber(o))return!0},e.prototype._updateSortWithinSameData=function(t,a,n,i){if(!!this._isOrderChangedWithinSameData(t,a,n)){var o=this._dataSort(t,n,a);this._isOrderDifferentInView(o,n)&&(this._removeOnRenderedListener(i),i.dispatchAction({type:\"changeAxisOrder\",componentType:n.dim+\"Axis\",axisId:n.index,sortInfo:o}))}},e.prototype._dispatchInitSort=function(t,a,n){var i=a.baseAxis,o=this._dataSort(t,i,function(s){return t.get(t.mapDimension(a.otherAxis.dim),s)});n.dispatchAction({type:\"changeAxisOrder\",componentType:i.dim+\"Axis\",isInitSort:!0,axisId:i.index,sortInfo:o})},e.prototype.remove=function(t,a){this._clear(this._model),this._removeOnRenderedListener(a)},e.prototype.dispose=function(t,a){this._removeOnRenderedListener(a)},e.prototype._removeOnRenderedListener=function(t){this._onRendered&&(t.getZr().off(\"rendered\",this._onRendered),this._onRendered=null)},e.prototype._clear=function(t){var a=this.group,n=this._data;t&&t.isAnimationEnabled()&&n&&!this._isLargeDraw?(this._removeBackground(),this._backgroundEls=[],n.eachItemGraphicEl(function(i){Js(i,t,it(i).dataIndex)})):a.removeAll(),this._data=null,this._isFirstFrame=!0},e.prototype._removeBackground=function(){this.group.remove(this._backgroundGroup),this._backgroundGroup=null},e.type=\"bar\",e}(zt),D_={cartesian2d:function(r,e){var t=e.width<0?-1:1,a=e.height<0?-1:1;t<0&&(e.x+=e.width,e.width=-e.width),a<0&&(e.y+=e.height,e.height=-e.height);var n=r.x+r.width,i=r.y+r.height,o=hc(e.x,r.x),s=vc(e.x+e.width,n),l=hc(e.y,r.y),u=vc(e.y+e.height,i),f=s<o,h=u<l;return e.x=f&&o>n?s:o,e.y=h&&l>i?u:l,e.width=f?0:s-o,e.height=h?0:u-l,t<0&&(e.x+=e.width,e.width=-e.width),a<0&&(e.y+=e.height,e.height=-e.height),f||h},polar:function(r,e){var t=e.r0<=e.r?1:-1;if(t<0){var a=e.r;e.r=e.r0,e.r0=a}var n=vc(e.r,r.r),i=hc(e.r0,r.r0);e.r=n,e.r0=i;var o=n-i<0;if(t<0){var a=e.r;e.r=e.r0,e.r0=a}return o}},M_={cartesian2d:function(r,e,t,a,n,i,o,s,l){var u=new bt({shape:V({},a),z2:1});if(u.__dataIndex=t,u.name=\"item\",i){var f=u.shape,h=n?\"height\":\"width\";f[h]=0}return u},polar:function(r,e,t,a,n,i,o,s,l){var u=!n&&l?Uf:Ve,f=new u({shape:a,z2:1});f.name=\"item\";var h=rD(n);if(f.calculateTextPosition=z6(h,{isRoundCap:u===Uf}),i){var v=f.shape,c=n?\"r\":\"endAngle\",d={};v[c]=n?a.r0:a.startAngle,d[c]=a[c],(s?Lt:Ft)(f,{shape:d},i)}return f}};function W6(r,e){var t=r.get(\"realtimeSort\",!0),a=e.getBaseAxis();if(t&&a.type===\"category\"&&e.type===\"cartesian2d\")return{baseAxis:a,otherAxis:e.getOtherAxis(a)}}function L_(r,e,t,a,n,i,o,s){var l,u;i?(u={x:a.x,width:a.width},l={y:a.y,height:a.height}):(u={y:a.y,height:a.height},l={x:a.x,width:a.width}),s||(o?Lt:Ft)(t,{shape:l},e,n,null);var f=e?r.baseAxis.model:null;(o?Lt:Ft)(t,{shape:u},f,n)}function I_(r,e){for(var t=0;t<e.length;t++)if(!isFinite(r[e[t]]))return!0;return!1}var $6=[\"x\",\"y\",\"width\",\"height\"],U6=[\"cx\",\"cy\",\"r\",\"startAngle\",\"endAngle\"],P_={cartesian2d:function(r){return!I_(r,$6)},polar:function(r){return!I_(r,U6)}},Tu={cartesian2d:function(r,e,t){var a=r.getItemLayout(e),n=t?Z6(t,a):0,i=a.width>0?1:-1,o=a.height>0?1:-1;return{x:a.x+i*n/2,y:a.y+o*n/2,width:a.width-i*n,height:a.height-o*n}},polar:function(r,e,t){var a=r.getItemLayout(e);return{cx:a.cx,cy:a.cy,r0:a.r0,r:a.r,startAngle:a.startAngle,endAngle:a.endAngle,clockwise:a.clockwise}}};function Y6(r){return r.startAngle!=null&&r.endAngle!=null&&r.startAngle===r.endAngle}function rD(r){return function(e){var t=e?\"Arc\":\"Angle\";return function(a){switch(a){case\"start\":case\"insideStart\":case\"end\":case\"insideEnd\":return a+t;default:return a}}}(r)}function R_(r,e,t,a,n,i,o,s){var l=e.getItemVisual(t,\"style\");if(s){if(!i.get(\"roundCap\")){var f=r.shape,h=ri(a.getModel(\"itemStyle\"),f,!0);V(f,h),r.setShape(f)}}else{var u=a.get([\"itemStyle\",\"borderRadius\"])||0;r.setShape(\"r\",u)}r.useStyle(l);var v=a.getShallow(\"cursor\");v&&r.attr(\"cursor\",v);var c=s?o?n.r>=n.r0?\"endArc\":\"startArc\":n.endAngle>=n.startAngle?\"endAngle\":\"startAngle\":o?n.height>=0?\"bottom\":\"top\":n.width>=0?\"right\":\"left\",d=ie(a);de(r,d,{labelFetcher:i,labelDataIndex:t,defaultText:go(i.getData(),t),inheritColor:l.fill,defaultOpacity:l.opacity,defaultOutsidePosition:c});var p=r.getTextContent();if(s&&p){var g=a.get([\"label\",\"position\"]);r.textConfig.inside=g===\"middle\"?!0:null,F6(r,g===\"outside\"?c:g,rD(o),a.get([\"label\",\"rotate\"]))}LC(p,d,i.getRawValue(t),function(m){return UA(e,m)});var y=a.getModel([\"emphasis\"]);$t(r,y.get(\"focus\"),y.get(\"blurScope\"),y.get(\"disabled\")),ce(r,a),Y6(n)&&(r.style.fill=\"none\",r.style.stroke=\"none\",A(r.states,function(m){m.style&&(m.style.fill=m.style.stroke=\"none\")}))}function Z6(r,e){var t=r.get([\"itemStyle\",\"borderColor\"]);if(!t||t===\"none\")return 0;var a=r.get([\"itemStyle\",\"borderWidth\"])||0,n=isNaN(e.width)?Number.MAX_VALUE:Math.abs(e.width),i=isNaN(e.height)?Number.MAX_VALUE:Math.abs(e.height);return Math.min(a,n,i)}var X6=function(){function r(){}return r}(),E_=function(r){k(e,r);function e(t){var a=r.call(this,t)||this;return a.type=\"largeBar\",a}return e.prototype.getDefaultShape=function(){return new X6},e.prototype.buildPath=function(t,a){for(var n=a.points,i=this.baseDimIdx,o=1-this.baseDimIdx,s=[],l=[],u=this.barWidth,f=0;f<n.length;f+=3)l[i]=u,l[o]=n[f+2],s[i]=n[f+i],s[o]=n[f+o],t.rect(s[0],s[1],l[0],l[1])},e}(mt);function k_(r,e,t,a){var n=r.getData(),i=n.getLayout(\"valueAxisHorizontal\")?1:0,o=n.getLayout(\"largeDataIndices\"),s=n.getLayout(\"size\"),l=r.getModel(\"backgroundStyle\"),u=n.getLayout(\"largeBackgroundPoints\");if(u){var f=new E_({shape:{points:u},incremental:!!a,silent:!0,z2:0});f.baseDimIdx=i,f.largeDataIndices=o,f.barWidth=s,f.useStyle(l.getItemStyle()),e.add(f),t&&t.push(f)}var h=new E_({shape:{points:n.getLayout(\"largePoints\")},incremental:!!a,ignoreCoarsePointer:!0,z2:1});h.baseDimIdx=i,h.largeDataIndices=o,h.barWidth=s,e.add(h),h.useStyle(n.getVisual(\"style\")),it(h).seriesIndex=r.seriesIndex,r.get(\"silent\")||(h.on(\"mousedown\",O_),h.on(\"mousemove\",O_)),t&&t.push(h)}var O_=sy(function(r){var e=this,t=q6(e,r.offsetX,r.offsetY);it(e).dataIndex=t>=0?t:null},30,!1);function q6(r,e,t){for(var a=r.baseDimIdx,n=1-a,i=r.shape.points,o=r.largeDataIndices,s=[],l=[],u=r.barWidth,f=0,h=i.length/3;f<h;f++){var v=f*3;if(l[a]=u,l[n]=i[v+2],s[a]=i[v+a],s[n]=i[v+n],l[n]<0&&(s[n]+=l[n],l[n]=-l[n]),e>=s[0]&&e<=s[0]+l[0]&&t>=s[1]&&t<=s[1]+l[1])return o[f]}return-1}function aD(r,e,t){if(Di(t,\"cartesian2d\")){var a=e,n=t.getArea();return{x:r?a.x:n.x,y:r?n.y:a.y,width:r?a.width:n.width,height:r?n.height:a.height}}else{var n=t.getArea(),i=e;return{cx:n.cx,cy:n.cy,r0:r?n.r0:i.r0,r:r?n.r:i.r,startAngle:r?i.startAngle:0,endAngle:r?i.endAngle:Math.PI*2}}}function K6(r,e,t){var a=r.type===\"polar\"?Ve:bt;return new a({shape:aD(e,t,r),silent:!0,z2:0})}var J6=H6;function Q6(r){r.registerChartView(J6),r.registerSeriesModel(B6),r.registerLayout(r.PRIORITY.VISUAL.LAYOUT,ot(SA,\"bar\")),r.registerLayout(r.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT,xA(\"bar\")),r.registerProcessor(r.PRIORITY.PROCESSOR.STATISTIC,jA(\"bar\")),r.registerAction({type:\"changeAxisOrder\",event:\"changeAxisOrder\",update:\"update\"},function(e,t){var a=e.componentType||\"series\";t.eachComponent({mainType:a,query:e},function(n){e.sortInfo&&n.axis.setCategorySortInfo(e.sortInfo)})})}var Au=Math.PI*2,B_=Math.PI/180;function nD(r,e){return re(r.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function iD(r,e){var t=nD(r,e),a=r.get(\"center\"),n=r.get(\"radius\");F(n)||(n=[0,n]);var i=W(t.width,e.getWidth()),o=W(t.height,e.getHeight()),s=Math.min(i,o),l=W(n[0],s/2),u=W(n[1],s/2),f,h,v=r.coordinateSystem;if(v){var c=v.dataToPoint(a);f=c[0]||0,h=c[1]||0}else F(a)||(a=[a,a]),f=W(a[0],i)+t.x,h=W(a[1],o)+t.y;return{cx:f,cy:h,r0:l,r:u}}function j6(r,e,t){e.eachSeriesByType(r,function(a){var n=a.getData(),i=n.mapDimension(\"value\"),o=nD(a,t),s=iD(a,t),l=s.cx,u=s.cy,f=s.r,h=s.r0,v=-a.get(\"startAngle\")*B_,c=a.get(\"minAngle\")*B_,d=0;n.each(i,function(D){!isNaN(D)&&d++});var p=n.getSum(i),g=Math.PI/(p||d)*2,y=a.get(\"clockwise\"),m=a.get(\"roseType\"),_=a.get(\"stillShowZeroSum\"),S=n.getDataExtent(i);S[0]=0;var w=Au,x=0,b=v,C=y?1:-1;if(n.setLayout({viewRect:o,r:f}),n.each(i,function(D,M){var L;if(isNaN(D)){n.setItemLayout(M,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:y,cx:l,cy:u,r0:h,r:m?NaN:f});return}m!==\"area\"?L=p===0&&_?g:D*g:L=Au/d,L<c?(L=c,w-=c):x+=D;var I=b+C*L;n.setItemLayout(M,{angle:L,startAngle:b,endAngle:I,clockwise:y,cx:l,cy:u,r0:h,r:m?Rt(D,S,[h,f]):f}),b=I}),w<Au&&d)if(w<=.001){var T=Au/d;n.each(i,function(D,M){if(!isNaN(D)){var L=n.getItemLayout(M);L.angle=T,L.startAngle=v+C*M*T,L.endAngle=v+C*(M+1)*T}})}else g=w/x,b=v,n.each(i,function(D,M){if(!isNaN(D)){var L=n.getItemLayout(M),I=L.angle===c?c:D*g;L.startAngle=b,L.endAngle=b+C*I,b+=C*I}})})}function Bl(r){return{seriesType:r,reset:function(e,t){var a=t.findComponents({mainType:\"legend\"});if(!(!a||!a.length)){var n=e.getData();n.filterSelf(function(i){for(var o=n.getName(i),s=0;s<a.length;s++)if(!a[s].isSelected(o))return!1;return!0})}}}}var tV=Math.PI/180;function N_(r,e,t,a,n,i,o,s,l,u){if(r.length<2)return;function f(p){for(var g=p.rB,y=g*g,m=0;m<p.list.length;m++){var _=p.list[m],S=Math.abs(_.label.y-t),w=a+_.len,x=w*w,b=Math.sqrt((1-Math.abs(S*S/y))*x),C=e+(b+_.len2)*n,T=C-_.label.x,D=_.targetTextWidth-T*n;oD(_,D,!0),_.label.x=C}}function h(p){for(var g={list:[],maxY:0},y={list:[],maxY:0},m=0;m<p.length;m++)if(p[m].labelAlignTo===\"none\"){var _=p[m],S=_.label.y>t?y:g,w=Math.abs(_.label.y-t);if(w>=S.maxY){var x=_.label.x-e-_.len2*n,b=a+_.len,C=Math.abs(x)<b?Math.sqrt(w*w/(1-x*x/b/b)):b;S.rB=C,S.maxY=w}S.list.push(_)}f(g),f(y)}for(var v=r.length,c=0;c<v;c++)if(r[c].position===\"outer\"&&r[c].labelAlignTo===\"labelLine\"){var d=r[c].label.x-u;r[c].linePoints[1][0]+=d,r[c].label.x=u}WA(r,l,l+o)&&h(r)}function eV(r,e,t,a,n,i,o,s){for(var l=[],u=[],f=Number.MAX_VALUE,h=-Number.MAX_VALUE,v=0;v<r.length;v++){var c=r[v].label;cc(r[v])||(c.x<e?(f=Math.min(f,c.x),l.push(r[v])):(h=Math.max(h,c.x),u.push(r[v])))}for(var v=0;v<r.length;v++){var d=r[v];if(!cc(d)&&d.linePoints){if(d.labelStyleWidth!=null)continue;var c=d.label,p=d.linePoints,g=void 0;d.labelAlignTo===\"edge\"?c.x<e?g=p[2][0]-d.labelDistance-o-d.edgeDistance:g=o+n-d.edgeDistance-p[2][0]-d.labelDistance:d.labelAlignTo===\"labelLine\"?c.x<e?g=f-o-d.bleedMargin:g=o+n-h-d.bleedMargin:c.x<e?g=c.x-o-d.bleedMargin:g=o+n-c.x-d.bleedMargin,d.targetTextWidth=g,oD(d,g)}}N_(u,e,t,a,1,n,i,o,s,h),N_(l,e,t,a,-1,n,i,o,s,f);for(var v=0;v<r.length;v++){var d=r[v];if(!cc(d)&&d.linePoints){var c=d.label,p=d.linePoints,y=d.labelAlignTo===\"edge\",m=c.style.padding,_=m?m[1]+m[3]:0,S=c.style.backgroundColor?0:_,w=d.rect.width+S,x=p[1][0]-p[2][0];y?c.x<e?p[2][0]=o+d.edgeDistance+w+d.labelDistance:p[2][0]=o+n-d.edgeDistance-w-d.labelDistance:(c.x<e?p[2][0]=c.x+d.labelDistance:p[2][0]=c.x-d.labelDistance,p[1][0]=p[2][0]+x),p[1][1]=p[2][1]=c.y}}}function oD(r,e,t){if(t===void 0&&(t=!1),r.labelStyleWidth==null){var a=r.label,n=a.style,i=r.rect,o=n.backgroundColor,s=n.padding,l=s?s[1]+s[3]:0,u=n.overflow,f=i.width+(o?0:l);if(e<f||t){var h=i.height;if(u&&u.match(\"break\")){a.setStyle(\"backgroundColor\",null),a.setStyle(\"width\",e-l);var v=a.getBoundingRect();a.setStyle(\"width\",Math.ceil(v.width)),a.setStyle(\"backgroundColor\",o)}else{var c=e-l,d=e<f?c:t?c>r.unconstrainedWidth?null:c:null;a.setStyle(\"width\",d)}var p=a.getBoundingRect();i.width=p.width;var g=(a.style.margin||0)+2.1;i.height=p.height+g,i.y-=(i.height-h)/2}}}function cc(r){return r.position===\"center\"}function rV(r){var e=r.getData(),t=[],a,n,i=!1,o=(r.get(\"minShowLabelAngle\")||0)*tV,s=e.getLayout(\"viewRect\"),l=e.getLayout(\"r\"),u=s.width,f=s.x,h=s.y,v=s.height;function c(x){x.ignore=!0}function d(x){if(!x.ignore)return!0;for(var b in x.states)if(x.states[b].ignore===!1)return!0;return!1}e.each(function(x){var b=e.getItemGraphicEl(x),C=b.shape,T=b.getTextContent(),D=b.getTextGuideLine(),M=e.getItemModel(x),L=M.getModel(\"label\"),I=L.get(\"position\")||M.get([\"emphasis\",\"label\",\"position\"]),P=L.get(\"distanceToLabelLine\"),R=L.get(\"alignTo\"),E=W(L.get(\"edgeDistance\"),u),B=L.get(\"bleedMargin\"),O=M.getModel(\"labelLine\"),z=O.get(\"length\");z=W(z,u);var H=O.get(\"length2\");if(H=W(H,u),Math.abs(C.endAngle-C.startAngle)<o){A(T.states,c),T.ignore=!0,D&&(A(D.states,c),D.ignore=!0);return}if(!!d(T)){var $=(C.startAngle+C.endAngle)/2,X=Math.cos($),Q=Math.sin($),j,pt,xt,gt;a=C.cx,n=C.cy;var rt=I===\"inside\"||I===\"inner\";if(I===\"center\")j=C.cx,pt=C.cy,gt=\"center\";else{var yt=(rt?(C.r+C.r0)/2*X:C.r*X)+a,st=(rt?(C.r+C.r0)/2*Q:C.r*Q)+n;if(j=yt+X*3,pt=st+Q*3,!rt){var K=yt+X*(z+l-C.r),lt=st+Q*(z+l-C.r),Gt=K+(X<0?-1:1)*H,wt=lt;R===\"edge\"?j=X<0?f+E:f+u-E:j=Gt+(X<0?-P:P),pt=wt,xt=[[yt,st],[K,lt],[Gt,wt]]}gt=rt?\"center\":R===\"edge\"?X>0?\"right\":\"left\":X>0?\"left\":\"right\"}var Yt=Math.PI,Wt=0,ge=L.get(\"rotate\");if(Mt(ge))Wt=ge*(Yt/180);else if(I===\"center\")Wt=0;else if(ge===\"radial\"||ge===!0){var ea=X<0?-$+Yt:-$;Wt=ea}else if(ge===\"tangential\"&&I!==\"outside\"&&I!==\"outer\"){var Ie=Math.atan2(X,Q);Ie<0&&(Ie=Yt*2+Ie);var Gl=Q>0;Gl&&(Ie=Yt+Ie),Wt=Ie-Yt}if(i=!!Wt,T.x=j,T.y=pt,T.rotation=Wt,T.setStyle({verticalAlign:\"middle\"}),rt){T.setStyle({align:gt});var Qh=T.states.select;Qh&&(Qh.x+=T.x,Qh.y+=T.y)}else{var Da=T.getBoundingRect().clone();Da.applyTransform(T.getComputedTransform());var Tm=(T.style.margin||0)+2.1;Da.y-=Tm/2,Da.height+=Tm,t.push({label:T,labelLine:D,position:I,len:z,len2:H,minTurnAngle:O.get(\"minTurnAngle\"),maxSurfaceAngle:O.get(\"maxSurfaceAngle\"),surfaceNormal:new ut(X,Q),linePoints:xt,textAlign:gt,labelDistance:P,labelAlignTo:R,edgeDistance:E,bleedMargin:B,rect:Da,unconstrainedWidth:Da.width,labelStyleWidth:T.style.width})}b.setTextConfig({inside:rt})}}),!i&&r.get(\"avoidLabelOverlap\")&&eV(t,a,n,l,u,v,f,h);for(var p=0;p<t.length;p++){var g=t[p],y=g.label,m=g.labelLine,_=isNaN(y.x)||isNaN(y.y);if(y){y.setStyle({align:g.textAlign}),_&&(A(y.states,c),y.ignore=!0);var S=y.states.select;S&&(S.x+=y.x,S.y+=y.y)}if(m){var w=g.linePoints;_||!w?(A(m.states,c),m.ignore=!0):(FA(w,g.minTurnAngle),a6(w,g.surfaceNormal,g.maxSurfaceAngle),m.setShape({points:w}),y.__hostTarget.textGuideLineConfig={anchor:new ut(w[0][0],w[0][1])})}}}var aV=function(r){k(e,r);function e(t,a,n){var i=r.call(this)||this;i.z2=2;var o=new Dt;return i.setTextContent(o),i.updateData(t,a,n,!0),i}return e.prototype.updateData=function(t,a,n,i){var o=this,s=t.hostModel,l=t.getItemModel(a),u=l.getModel(\"emphasis\"),f=t.getItemLayout(a),h=V(ri(l.getModel(\"itemStyle\"),f,!0),f);if(isNaN(h.startAngle)){o.setShape(h);return}if(i){o.setShape(h);var v=s.getShallow(\"animationType\");s.ecModel.ssr?(Ft(o,{scaleX:0,scaleY:0},s,{dataIndex:a,isFrom:!0}),o.originX=h.cx,o.originY=h.cy):v===\"scale\"?(o.shape.r=f.r0,Ft(o,{shape:{r:f.r}},s,a)):n!=null?(o.setShape({startAngle:n,endAngle:n}),Ft(o,{shape:{startAngle:f.startAngle,endAngle:f.endAngle}},s,a)):(o.shape.endAngle=f.startAngle,Lt(o,{shape:{endAngle:f.endAngle}},s,a))}else Ar(o),Lt(o,{shape:h},s,a);o.useStyle(t.getItemVisual(a,\"style\")),ce(o,l);var c=(f.startAngle+f.endAngle)/2,d=s.get(\"selectedOffset\"),p=Math.cos(c)*d,g=Math.sin(c)*d,y=l.getShallow(\"cursor\");y&&o.attr(\"cursor\",y),this._updateLabel(s,t,a),o.ensureState(\"emphasis\").shape=V({r:f.r+(u.get(\"scale\")&&u.get(\"scaleSize\")||0)},ri(u.getModel(\"itemStyle\"),f)),V(o.ensureState(\"select\"),{x:p,y:g,shape:ri(l.getModel([\"select\",\"itemStyle\"]),f)}),V(o.ensureState(\"blur\"),{shape:ri(l.getModel([\"blur\",\"itemStyle\"]),f)});var m=o.getTextGuideLine(),_=o.getTextContent();m&&V(m.ensureState(\"select\"),{x:p,y:g}),V(_.ensureState(\"select\"),{x:p,y:g}),$t(this,u.get(\"focus\"),u.get(\"blurScope\"),u.get(\"disabled\"))},e.prototype._updateLabel=function(t,a,n){var i=this,o=a.getItemModel(n),s=o.getModel(\"labelLine\"),l=a.getItemVisual(n,\"style\"),u=l&&l.fill,f=l&&l.opacity;de(i,ie(o),{labelFetcher:a.hostModel,labelDataIndex:n,inheritColor:u,defaultOpacity:f,defaultText:t.getFormattedLabel(n,\"normal\")||a.getName(n)});var h=i.getTextContent();i.setTextConfig({position:null,rotation:null}),h.attr({z2:10});var v=t.get([\"label\",\"position\"]);if(v!==\"outside\"&&v!==\"outer\")i.removeTextGuideLine();else{var c=this.getTextGuideLine();c||(c=new Fe,this.setTextGuideLine(c)),xy(this,wy(o),{stroke:u,opacity:Ur(s.get([\"lineStyle\",\"opacity\"]),f,1)})}},e}(Ve),nV=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.ignoreLabelLineUpdate=!0,t}return e.prototype.render=function(t,a,n,i){var o=t.getData(),s=this._data,l=this.group,u;if(!s&&o.count()>0){for(var f=o.getItemLayout(0),h=1;isNaN(f&&f.startAngle)&&h<o.count();++h)f=o.getItemLayout(h);f&&(u=f.startAngle)}if(this._emptyCircleSector&&l.remove(this._emptyCircleSector),o.count()===0&&t.get(\"showEmptyCircle\")){var v=new Ve({shape:iD(t,n)});v.useStyle(t.getModel(\"emptyCircleStyle\").getItemStyle()),this._emptyCircleSector=v,l.add(v)}o.diff(s).add(function(c){var d=new aV(o,c,u);o.setItemGraphicEl(c,d),l.add(d)}).update(function(c,d){var p=s.getItemGraphicEl(d);p.updateData(o,c,u),p.off(\"click\"),l.add(p),o.setItemGraphicEl(c,p)}).remove(function(c){var d=s.getItemGraphicEl(c);Js(d,t,c)}).execute(),rV(t),t.get(\"animationTypeUpdate\")!==\"expansion\"&&(this._data=o)},e.prototype.dispose=function(){},e.prototype.containPoint=function(t,a){var n=a.getData(),i=n.getItemLayout(0);if(i){var o=t[0]-i.cx,s=t[1]-i.cy,l=Math.sqrt(o*o+s*s);return l<=i.r&&l>=i.r0}},e.type=\"pie\",e}(zt),iV=nV;function No(r,e,t){e=F(e)&&{coordDimensions:e}||V({encodeDefine:r.getEncode()},e);var a=r.getSource(),n=Il(a,e).dimensions,i=new De(n,r);return i.initData(a,t),i}var oV=function(){function r(e,t){this._getDataWithEncodedVisual=e,this._getRawData=t}return r.prototype.getAllNames=function(){var e=this._getRawData();return e.mapArray(e.getName)},r.prototype.containName=function(e){var t=this._getRawData();return t.indexOfName(e)>=0},r.prototype.indexOfName=function(e){var t=this._getDataWithEncodedVisual();return t.indexOfName(e)},r.prototype.getItemVisual=function(e,t){var a=this._getDataWithEncodedVisual();return a.getItemVisual(e,t)},r}(),Nl=oV,sV=Ct(),lV=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.init=function(t){r.prototype.init.apply(this,arguments),this.legendVisualProvider=new Nl(Y(this.getData,this),Y(this.getRawData,this)),this._defaultLabelLine(t)},e.prototype.mergeOption=function(){r.prototype.mergeOption.apply(this,arguments)},e.prototype.getInitialData=function(){return No(this,{coordDimensions:[\"value\"],encodeDefaulter:ot(Jg,this)})},e.prototype.getDataParams=function(t){var a=this.getData(),n=sV(a),i=n.seats;if(!i){var o=[];a.each(a.mapDimension(\"value\"),function(l){o.push(l)}),i=n.seats=sk(o,a.hostModel.get(\"percentPrecision\"))}var s=r.prototype.getDataParams.call(this,t);return s.percent=i[t]||0,s.$vars.push(\"percent\"),s},e.prototype._defaultLabelLine=function(t){ci(t,\"labelLine\",[\"show\"]);var a=t.labelLine,n=t.emphasis.labelLine;a.show=a.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},e.type=\"series.pie\",e.defaultOption={z:2,legendHoverLink:!0,colorBy:\"data\",center:[\"50%\",\"50%\"],radius:[0,\"75%\"],clockwise:!0,startAngle:90,minAngle:0,minShowLabelAngle:0,selectedOffset:10,percentPrecision:2,stillShowZeroSum:!0,left:0,top:0,right:0,bottom:0,width:null,height:null,label:{rotate:0,show:!0,overflow:\"truncate\",position:\"outer\",alignTo:\"none\",edgeDistance:\"25%\",bleedMargin:10,distanceToLabelLine:5},labelLine:{show:!0,length:15,length2:15,smooth:!1,minTurnAngle:90,maxSurfaceAngle:90,lineStyle:{width:1,type:\"solid\"}},itemStyle:{borderWidth:1,borderJoin:\"round\"},showEmptyCircle:!0,emptyCircleStyle:{color:\"lightgray\",opacity:1},labelLayout:{hideOverlap:!0},emphasis:{scale:!0,scaleSize:5},avoidLabelOverlap:!0,animationType:\"expansion\",animationDuration:1e3,animationTypeUpdate:\"transition\",animationEasingUpdate:\"cubicInOut\",animationDurationUpdate:500,animationEasing:\"cubicInOut\"},e}(Ht),uV=lV;function fV(r){return{seriesType:r,reset:function(e,t){var a=e.getData();a.filterSelf(function(n){var i=a.mapDimension(\"value\"),o=a.get(i,n);return!(Mt(o)&&!isNaN(o)&&o<0)})}}}function hV(r){r.registerChartView(iV),r.registerSeriesModel(uV),NT(\"pie\",r.registerAction),r.registerLayout(ot(j6,\"pie\")),r.registerProcessor(Bl(\"pie\")),r.registerProcessor(fV(\"pie\"))}var vV=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.hasSymbolVisual=!0,t}return e.prototype.getInitialData=function(t,a){return Ta(null,this,{useEncodeDefaulter:!0})},e.prototype.getProgressive=function(){var t=this.option.progressive;return t==null?this.option.large?5e3:this.get(\"progressive\"):t},e.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return t==null?this.option.large?1e4:this.get(\"progressiveThreshold\"):t},e.prototype.brushSelector=function(t,a,n){return n.point(a.getItemLayout(t))},e.prototype.getZLevelKey=function(){return this.getData().count()>this.getProgressiveThreshold()?this.id:\"\"},e.type=\"series.scatter\",e.dependencies=[\"grid\",\"polar\",\"geo\",\"singleAxis\",\"calendar\"],e.defaultOption={coordinateSystem:\"cartesian2d\",z:2,legendHoverLink:!0,symbolSize:10,large:!1,largeThreshold:2e3,itemStyle:{opacity:.8},emphasis:{scale:!0},clip:!0,select:{itemStyle:{borderColor:\"#212121\"}},universalTransition:{divideShape:\"clone\"}},e}(Ht),cV=vV,sD=4,dV=function(){function r(){}return r}(),pV=function(r){k(e,r);function e(t){var a=r.call(this,t)||this;return a._off=0,a.hoverDataIdx=-1,a}return e.prototype.getDefaultShape=function(){return new dV},e.prototype.reset=function(){this.notClear=!1,this._off=0},e.prototype.buildPath=function(t,a){var n=a.points,i=a.size,o=this.symbolProxy,s=o.shape,l=t.getContext?t.getContext():t,u=l&&i[0]<sD,f=this.softClipShape,h;if(u){this._ctx=l;return}for(this._ctx=null,h=this._off;h<n.length;){var v=n[h++],c=n[h++];isNaN(v)||isNaN(c)||f&&!f.contain(v,c)||(s.x=v-i[0]/2,s.y=c-i[1]/2,s.width=i[0],s.height=i[1],o.buildPath(t,s,!0))}this.incremental&&(this._off=h,this.notClear=!0)},e.prototype.afterBrush=function(){var t=this.shape,a=t.points,n=t.size,i=this._ctx,o=this.softClipShape,s;if(!!i){for(s=this._off;s<a.length;){var l=a[s++],u=a[s++];isNaN(l)||isNaN(u)||o&&!o.contain(l,u)||i.fillRect(l-n[0]/2,u-n[1]/2,n[0],n[1])}this.incremental&&(this._off=s,this.notClear=!0)}},e.prototype.findDataIndex=function(t,a){for(var n=this.shape,i=n.points,o=n.size,s=Math.max(o[0],4),l=Math.max(o[1],4),u=i.length/2-1;u>=0;u--){var f=u*2,h=i[f]-s/2,v=i[f+1]-l/2;if(t>=h&&a>=v&&t<=h+s&&a<=v+l)return u}return-1},e.prototype.contain=function(t,a){var n=this.transformCoordToLocal(t,a),i=this.getBoundingRect();if(t=n[0],a=n[1],i.contain(t,a)){var o=this.hoverDataIdx=this.findDataIndex(t,a);return o>=0}return this.hoverDataIdx=-1,!1},e.prototype.getBoundingRect=function(){var t=this._rect;if(!t){for(var a=this.shape,n=a.points,i=a.size,o=i[0],s=i[1],l=1/0,u=1/0,f=-1/0,h=-1/0,v=0;v<n.length;){var c=n[v++],d=n[v++];l=Math.min(c,l),f=Math.max(c,f),u=Math.min(d,u),h=Math.max(d,h)}t=this._rect=new vt(l-o/2,u-s/2,f-l+o,h-u+s)}return t},e}(mt),gV=function(){function r(){this.group=new nt}return r.prototype.updateData=function(e,t){this._clear();var a=this._create();a.setShape({points:e.getLayout(\"points\")}),this._setCommon(a,e,t)},r.prototype.updateLayout=function(e){var t=e.getLayout(\"points\");this.group.eachChild(function(a){if(a.startIndex!=null){var n=(a.endIndex-a.startIndex)*2,i=a.startIndex*4*2;t=new Float32Array(t.buffer,i,n)}a.setShape(\"points\",t),a.reset()})},r.prototype.incrementalPrepareUpdate=function(e){this._clear()},r.prototype.incrementalUpdate=function(e,t,a){var n=this._newAdded[0],i=t.getLayout(\"points\"),o=n&&n.shape.points;if(o&&o.length<2e4){var s=o.length,l=new Float32Array(s+i.length);l.set(o),l.set(i,s),n.endIndex=e.end,n.setShape({points:l})}else{this._newAdded=[];var u=this._create();u.startIndex=e.start,u.endIndex=e.end,u.incremental=!0,u.setShape({points:i}),this._setCommon(u,t,a)}},r.prototype.eachRendered=function(e){this._newAdded[0]&&e(this._newAdded[0])},r.prototype._create=function(){var e=new pV({cursor:\"default\"});return e.ignoreCoarsePointer=!0,this.group.add(e),this._newAdded.push(e),e},r.prototype._setCommon=function(e,t,a){var n=t.hostModel;a=a||{};var i=t.getVisual(\"symbolSize\");e.setShape(\"size\",i instanceof Array?i:[i,i]),e.softClipShape=a.clipShape||null,e.symbolProxy=jt(t.getVisual(\"symbol\"),0,0,0,0),e.setColor=e.symbolProxy.setColor;var o=e.shape.size[0]<sD;e.useStyle(n.getModel(\"itemStyle\").getItemStyle(o?[\"color\",\"shadowBlur\",\"shadowColor\"]:[\"color\"]));var s=t.getVisual(\"style\"),l=s&&s.fill;l&&e.setColor(l);var u=it(e);u.seriesIndex=n.seriesIndex,e.on(\"mousemove\",function(f){u.dataIndex=null;var h=e.hoverDataIdx;h>=0&&(u.dataIndex=h+(e.startIndex||0))})},r.prototype.remove=function(){this._clear()},r.prototype._clear=function(){this._newAdded=[],this.group.removeAll()},r}(),yV=gV,mV=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n){var i=t.getData(),o=this._updateSymbolDraw(i,t);o.updateData(i,{clipShape:this._getClipShape(t)}),this._finished=!0},e.prototype.incrementalPrepareRender=function(t,a,n){var i=t.getData(),o=this._updateSymbolDraw(i,t);o.incrementalPrepareUpdate(i),this._finished=!1},e.prototype.incrementalRender=function(t,a,n){this._symbolDraw.incrementalUpdate(t,a.getData(),{clipShape:this._getClipShape(a)}),this._finished=t.end===a.getData().count()},e.prototype.updateTransform=function(t,a,n){var i=t.getData();if(this.group.dirty(),!this._finished||i.count()>1e4)return{update:!0};var o=Ol(\"\").reset(t,a,n);o.progress&&o.progress({start:0,end:i.count(),count:i.count()},i),this._symbolDraw.updateLayout(i)},e.prototype.eachRendered=function(t){this._symbolDraw&&this._symbolDraw.eachRendered(t)},e.prototype._getClipShape=function(t){var a=t.coordinateSystem,n=a&&a.getArea&&a.getArea();return t.get(\"clip\",!0)?n:null},e.prototype._updateSymbolDraw=function(t,a){var n=this._symbolDraw,i=a.pipelineContext,o=i.large;return(!n||o!==this._isLargeDraw)&&(n&&n.remove(),n=this._symbolDraw=o?new yV:new kl,this._isLargeDraw=o,this.group.removeAll()),this.group.add(n.group),n},e.prototype.remove=function(t,a){this._symbolDraw&&this._symbolDraw.remove(!0),this._symbolDraw=null},e.prototype.dispose=function(){},e.type=\"scatter\",e}(zt),_V=mV,SV=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.type=\"grid\",e.dependencies=[\"xAxis\",\"yAxis\"],e.layoutMode=\"box\",e.defaultOption={show:!1,z:0,left:\"10%\",top:60,right:\"10%\",bottom:70,containLabel:!1,backgroundColor:\"rgba(0,0,0,0)\",borderWidth:1,borderColor:\"#ccc\"},e}(Tt),xV=SV,Tp=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.getCoordSysModel=function(){return this.getReferringComponents(\"grid\",Qt).models[0]},e.type=\"cartesian2dAxis\",e}(Tt);te(Tp,Rl);var lD={show:!0,z:0,inverse:!1,name:\"\",nameLocation:\"end\",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:\"...\",placeholder:\".\"},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:\"#6E7079\",width:1,type:\"solid\"},symbol:[\"none\",\"none\"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:[\"#E0E6F1\"],width:1,type:\"solid\"}},splitArea:{show:!1,areaStyle:{color:[\"rgba(250,250,250,0.2)\",\"rgba(210,219,238,0.2)\"]}}},wV=ht({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:\"auto\"},axisLabel:{interval:\"auto\"}},lD),by=ht({boundaryGap:[0,0],axisLine:{show:\"auto\"},axisTick:{show:\"auto\"},splitNumber:5,minorTick:{show:!1,splitNumber:5,length:3,lineStyle:{}},minorSplitLine:{show:!1,lineStyle:{color:\"#F4F7FD\",width:1}}},lD),bV=ht({splitNumber:6,axisLabel:{showMinLabel:!1,showMaxLabel:!1,rich:{primary:{fontWeight:\"bold\"}}},splitLine:{show:!1}},by),CV=tt({logBase:10},by),uD={category:wV,value:by,time:bV,log:CV},TV={value:1,category:1,time:1,log:1};function yo(r,e,t,a){A(TV,function(n,i){var o=ht(ht({},uD[i],!0),a,!0),s=function(l){k(u,l);function u(){var f=l!==null&&l.apply(this,arguments)||this;return f.type=e+\"Axis.\"+i,f}return u.prototype.mergeDefaultAndTheme=function(f,h){var v=tl(this),c=v?Po(f):{},d=h.getTheme();ht(f,d.get(i+\"Axis\")),ht(f,this.getDefaultOption()),f.type=V_(f),v&&an(f,c,v)},u.prototype.optionUpdated=function(){var f=this.option;f.type===\"category\"&&(this.__ordinalMeta=xp.createByAxisModel(this))},u.prototype.getCategories=function(f){var h=this.option;if(h.type===\"category\")return f?h.data:this.__ordinalMeta.categories},u.prototype.getOrdinalMeta=function(){return this.__ordinalMeta},u.type=e+\"Axis.\"+i,u.defaultOption=o,u}(t);r.registerComponentModel(s)}),r.registerSubTypeDefaulter(e+\"Axis\",V_)}function V_(r){return r.type||(r.data?\"category\":\"value\")}var AV=function(){function r(e){this.type=\"cartesian\",this._dimList=[],this._axes={},this.name=e||\"\"}return r.prototype.getAxis=function(e){return this._axes[e]},r.prototype.getAxes=function(){return G(this._dimList,function(e){return this._axes[e]},this)},r.prototype.getAxesByScale=function(e){return e=e.toLowerCase(),Et(this.getAxes(),function(t){return t.scale.type===e})},r.prototype.addAxis=function(e){var t=e.dim;this._axes[t]=e,this._dimList.push(t)},r}(),DV=AV,Ap=[\"x\",\"y\"];function z_(r){return r.type===\"interval\"||r.type===\"time\"}var MV=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=\"cartesian2d\",t.dimensions=Ap,t}return e.prototype.calcAffineTransform=function(){this._transform=this._invTransform=null;var t=this.getAxis(\"x\").scale,a=this.getAxis(\"y\").scale;if(!(!z_(t)||!z_(a))){var n=t.getExtent(),i=a.getExtent(),o=this.dataToPoint([n[0],i[0]]),s=this.dataToPoint([n[1],i[1]]),l=n[1]-n[0],u=i[1]-i[0];if(!(!l||!u)){var f=(s[0]-o[0])/l,h=(s[1]-o[1])/u,v=o[0]-n[0]*f,c=o[1]-i[0]*h,d=this._transform=[f,0,0,h,v,c];this._invTransform=bo([],d)}}},e.prototype.getBaseAxis=function(){return this.getAxesByScale(\"ordinal\")[0]||this.getAxesByScale(\"time\")[0]||this.getAxis(\"x\")},e.prototype.containPoint=function(t){var a=this.getAxis(\"x\"),n=this.getAxis(\"y\");return a.contain(a.toLocalCoord(t[0]))&&n.contain(n.toLocalCoord(t[1]))},e.prototype.containData=function(t){return this.getAxis(\"x\").containData(t[0])&&this.getAxis(\"y\").containData(t[1])},e.prototype.containZone=function(t,a){var n=this.dataToPoint(t),i=this.dataToPoint(a),o=this.getArea(),s=new vt(n[0],n[1],i[0]-n[0],i[1]-n[1]);return o.intersect(s)},e.prototype.dataToPoint=function(t,a,n){n=n||[];var i=t[0],o=t[1];if(this._transform&&i!=null&&isFinite(i)&&o!=null&&isFinite(o))return he(n,t,this._transform);var s=this.getAxis(\"x\"),l=this.getAxis(\"y\");return n[0]=s.toGlobalCoord(s.dataToCoord(i,a)),n[1]=l.toGlobalCoord(l.dataToCoord(o,a)),n},e.prototype.clampData=function(t,a){var n=this.getAxis(\"x\").scale,i=this.getAxis(\"y\").scale,o=n.getExtent(),s=i.getExtent(),l=n.parse(t[0]),u=i.parse(t[1]);return a=a||[],a[0]=Math.min(Math.max(Math.min(o[0],o[1]),l),Math.max(o[0],o[1])),a[1]=Math.min(Math.max(Math.min(s[0],s[1]),u),Math.max(s[0],s[1])),a},e.prototype.pointToData=function(t,a){var n=[];if(this._invTransform)return he(n,t,this._invTransform);var i=this.getAxis(\"x\"),o=this.getAxis(\"y\");return n[0]=i.coordToData(i.toLocalCoord(t[0]),a),n[1]=o.coordToData(o.toLocalCoord(t[1]),a),n},e.prototype.getOtherAxis=function(t){return this.getAxis(t.dim===\"x\"?\"y\":\"x\")},e.prototype.getArea=function(){var t=this.getAxis(\"x\").getGlobalExtent(),a=this.getAxis(\"y\").getGlobalExtent(),n=Math.min(t[0],t[1]),i=Math.min(a[0],a[1]),o=Math.max(t[0],t[1])-n,s=Math.max(a[0],a[1])-i;return new vt(n,i,o,s)},e}(DV),LV=function(r){k(e,r);function e(t,a,n,i,o){var s=r.call(this,t,a,n)||this;return s.index=0,s.type=i||\"value\",s.position=o||\"bottom\",s}return e.prototype.isHorizontal=function(){var t=this.position;return t===\"top\"||t===\"bottom\"},e.prototype.getGlobalExtent=function(t){var a=this.getExtent();return a[0]=this.toGlobalCoord(a[0]),a[1]=this.toGlobalCoord(a[1]),t&&a[0]>a[1]&&a.reverse(),a},e.prototype.pointToData=function(t,a){return this.coordToData(this.toLocalCoord(t[this.dim===\"x\"?0:1]),a)},e.prototype.setCategorySortInfo=function(t){if(this.type!==\"category\")return!1;this.model.option.categorySortInfo=t,this.scale.setSortInfo(t)},e}(Mr),IV=LV;function Dp(r,e,t){t=t||{};var a=r.coordinateSystem,n=e.axis,i={},o=n.getAxesOnZeroOf()[0],s=n.position,l=o?\"onZero\":s,u=n.dim,f=a.getRect(),h=[f.x,f.x+f.width,f.y,f.y+f.height],v={left:0,right:1,top:0,bottom:1,onZero:2},c=e.get(\"offset\")||0,d=u===\"x\"?[h[2]-c,h[3]+c]:[h[0]-c,h[1]+c];if(o){var p=o.toGlobalCoord(o.dataToCoord(0));d[v.onZero]=Math.max(Math.min(p,d[1]),d[0])}i.position=[u===\"y\"?d[v[l]]:h[0],u===\"x\"?d[v[l]]:h[3]],i.rotation=Math.PI/2*(u===\"x\"?0:1);var g={top:-1,bottom:1,left:-1,right:1};i.labelDirection=i.tickDirection=i.nameDirection=g[s],i.labelOffset=o?d[v[s]]-d[v.onZero]:0,e.get([\"axisTick\",\"inside\"])&&(i.tickDirection=-i.tickDirection),le(t.labelInside,e.get([\"axisLabel\",\"inside\"]))&&(i.labelDirection=-i.labelDirection);var y=e.get([\"axisLabel\",\"rotate\"]);return i.labelRotate=l===\"top\"?-y:y,i.z2=1,i}function F_(r){return r.get(\"coordinateSystem\")===\"cartesian2d\"}function G_(r){var e={xAxisModel:null,yAxisModel:null};return A(e,function(t,a){var n=a.replace(/Model$/,\"\"),i=r.getReferringComponents(n,Qt).models[0];e[a]=i}),e}var dc=Math.log;function fD(r,e,t){var a=on.prototype,n=a.getTicks.call(t),i=a.getTicks.call(t,!0),o=n.length-1,s=a.getInterval.call(t),l=MA(r,e),u=l.extent,f=l.fixMin,h=l.fixMax;if(r.type===\"log\"){var v=dc(r.base);u=[dc(u[0])/v,dc(u[1])/v]}r.setExtent(u[0],u[1]),r.calcNiceExtent({splitNumber:o,fixMin:f,fixMax:h});var c=a.getExtent.call(r);f&&(u[0]=c[0]),h&&(u[1]=c[1]);var d=a.getInterval.call(r),p=u[0],g=u[1];if(f&&h)d=(g-p)/o;else if(f)for(g=u[0]+d*o;g<u[1]&&isFinite(g)&&isFinite(u[1]);)d=nc(d),g=u[0]+d*o;else if(h)for(p=u[1]-d*o;p>u[0]&&isFinite(p)&&isFinite(u[0]);)d=nc(d),p=u[1]-d*o;else{var y=r.getTicks().length-1;y>o&&(d=nc(d));var m=d*o;g=Math.ceil(u[1]/d)*d,p=Zt(g-m),p<0&&u[0]>=0?(p=0,g=Zt(m)):g>0&&u[1]<=0&&(g=0,p=-Zt(m))}var _=(n[0].value-i[0].value)/s,S=(n[o].value-i[o].value)/s;a.setExtent.call(r,p+d*_,g+d*S),a.setInterval.call(r,d),(_||S)&&a.setNiceExtent.call(r,p+d,g-d)}var PV=function(){function r(e,t,a){this.type=\"grid\",this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this.axisPointerEnabled=!0,this.dimensions=Ap,this._initCartesian(e,t,a),this.model=e}return r.prototype.getRect=function(){return this._rect},r.prototype.update=function(e,t){var a=this._axesMap;this._updateScale(e,this.model);function n(o){var s,l=St(o),u=l.length;if(!!u){for(var f=[],h=u-1;h>=0;h--){var v=+l[h],c=o[v],d=c.model,p=c.scale;wp(p)&&d.get(\"alignTicks\")&&d.get(\"interval\")==null?f.push(c):(po(p,d),wp(p)&&(s=c))}f.length&&(s||(s=f.pop(),po(s.scale,s.model)),A(f,function(g){fD(g.scale,g.model,s.scale)}))}}n(a.x),n(a.y);var i={};A(a.x,function(o){H_(a,\"y\",o,i)}),A(a.y,function(o){H_(a,\"x\",o,i)}),this.resize(this.model,t)},r.prototype.resize=function(e,t,a){var n=e.getBoxLayoutParams(),i=!a&&e.get(\"containLabel\"),o=re(n,{width:t.getWidth(),height:t.getHeight()});this._rect=o;var s=this._axesList;l(),i&&(A(s,function(u){if(!u.model.get([\"axisLabel\",\"inside\"])){var f=RN(u);if(f){var h=u.isHorizontal()?\"height\":\"width\",v=u.model.get([\"axisLabel\",\"margin\"]);o[h]-=f[h]+v,u.position===\"top\"?o.y+=f.height+v:u.position===\"left\"&&(o.x+=f.width+v)}}}),l()),A(this._coordsList,function(u){u.calcAffineTransform()});function l(){A(s,function(u){var f=u.isHorizontal(),h=f?[0,o.width]:[0,o.height],v=u.inverse?1:0;u.setExtent(h[v],h[1-v]),RV(u,f?o.x:o.y)})}},r.prototype.getAxis=function(e,t){var a=this._axesMap[e];if(a!=null)return a[t||0]},r.prototype.getAxes=function(){return this._axesList.slice()},r.prototype.getCartesian=function(e,t){if(e!=null&&t!=null){var a=\"x\"+e+\"y\"+t;return this._coordsMap[a]}et(e)&&(t=e.yAxisIndex,e=e.xAxisIndex);for(var n=0,i=this._coordsList;n<i.length;n++)if(i[n].getAxis(\"x\").index===e||i[n].getAxis(\"y\").index===t)return i[n]},r.prototype.getCartesians=function(){return this._coordsList.slice()},r.prototype.convertToPixel=function(e,t,a){var n=this._findConvertTarget(t);return n.cartesian?n.cartesian.dataToPoint(a):n.axis?n.axis.toGlobalCoord(n.axis.dataToCoord(a)):null},r.prototype.convertFromPixel=function(e,t,a){var n=this._findConvertTarget(t);return n.cartesian?n.cartesian.pointToData(a):n.axis?n.axis.coordToData(n.axis.toLocalCoord(a)):null},r.prototype._findConvertTarget=function(e){var t=e.seriesModel,a=e.xAxisModel||t&&t.getReferringComponents(\"xAxis\",Qt).models[0],n=e.yAxisModel||t&&t.getReferringComponents(\"yAxis\",Qt).models[0],i=e.gridModel,o=this._coordsList,s,l;if(t)s=t.coordinateSystem,dt(o,s)<0&&(s=null);else if(a&&n)s=this.getCartesian(a.componentIndex,n.componentIndex);else if(a)l=this.getAxis(\"x\",a.componentIndex);else if(n)l=this.getAxis(\"y\",n.componentIndex);else if(i){var u=i.coordinateSystem;u===this&&(s=this._coordsList[0])}return{cartesian:s,axis:l}},r.prototype.containPoint=function(e){var t=this._coordsList[0];if(t)return t.containPoint(e)},r.prototype._initCartesian=function(e,t,a){var n=this,i=this,o={left:!1,right:!1,top:!1,bottom:!1},s={x:{},y:{}},l={x:0,y:0};if(t.eachComponent(\"xAxis\",u(\"x\"),this),t.eachComponent(\"yAxis\",u(\"y\"),this),!l.x||!l.y){this._axesMap={},this._axesList=[];return}this._axesMap=s,A(s.x,function(f,h){A(s.y,function(v,c){var d=\"x\"+h+\"y\"+c,p=new MV(d);p.master=n,p.model=e,n._coordsMap[d]=p,n._coordsList.push(p),p.addAxis(f),p.addAxis(v)})});function u(f){return function(h,v){if(!!pc(h,e)){var c=h.get(\"position\");f===\"x\"?c!==\"top\"&&c!==\"bottom\"&&(c=o.bottom?\"top\":\"bottom\"):c!==\"left\"&&c!==\"right\"&&(c=o.left?\"right\":\"left\"),o[c]=!0;var d=new IV(f,Hh(h),[0,0],h.get(\"type\"),c),p=d.type===\"category\";d.onBand=p&&h.get(\"boundaryGap\"),d.inverse=h.get(\"inverse\"),h.axis=d,d.model=h,d.grid=i,d.index=v,i._axesList.push(d),s[f][v]=d,l[f]++}}}},r.prototype._updateScale=function(e,t){A(this._axesList,function(n){if(n.scale.setExtent(1/0,-1/0),n.type===\"category\"){var i=n.model.get(\"categorySortInfo\");n.scale.setSortInfo(i)}}),e.eachSeries(function(n){if(F_(n)){var i=G_(n),o=i.xAxisModel,s=i.yAxisModel;if(!pc(o,t)||!pc(s,t))return;var l=this.getCartesian(o.componentIndex,s.componentIndex),u=n.getData(),f=l.getAxis(\"x\"),h=l.getAxis(\"y\");a(u,f),a(u,h)}},this);function a(n,i){A(Gf(n,i.dim),function(o){i.scale.unionExtentFromData(n,o)})}},r.prototype.getTooltipAxes=function(e){var t=[],a=[];return A(this.getCartesians(),function(n){var i=e!=null&&e!==\"auto\"?n.getAxis(e):n.getBaseAxis(),o=n.getOtherAxis(i);dt(t,i)<0&&t.push(i),dt(a,o)<0&&a.push(o)}),{baseAxes:t,otherAxes:a}},r.create=function(e,t){var a=[];return e.eachComponent(\"grid\",function(n,i){var o=new r(n,e,t);o.name=\"grid_\"+i,o.resize(n,t,!0),n.coordinateSystem=o,a.push(o)}),e.eachSeries(function(n){if(!!F_(n)){var i=G_(n),o=i.xAxisModel,s=i.yAxisModel,l=o.getCoordSysModel(),u=l.coordinateSystem;n.coordinateSystem=u.getCartesian(o.componentIndex,s.componentIndex)}}),a},r.dimensions=Ap,r}();function pc(r,e){return r.getCoordSysModel()===e}function H_(r,e,t,a){t.getAxesOnZeroOf=function(){return i?[i]:[]};var n=r[e],i,o=t.model,s=o.get([\"axisLine\",\"onZero\"]),l=o.get([\"axisLine\",\"onZeroAxisIndex\"]);if(!s)return;if(l!=null)W_(n[l])&&(i=n[l]);else for(var u in n)if(n.hasOwnProperty(u)&&W_(n[u])&&!a[f(n[u])]){i=n[u];break}i&&(a[f(i)]=!0);function f(h){return h.dim+\"_\"+h.index}}function W_(r){return r&&r.type!==\"category\"&&r.type!==\"time\"&&PN(r)}function RV(r,e){var t=r.getExtent(),a=t[0]+t[1];r.toGlobalCoord=r.dim===\"x\"?function(n){return n+e}:function(n){return a-n+e},r.toLocalCoord=r.dim===\"x\"?function(n){return n-e}:function(n){return a-n+e}}var EV=PV,Za=Math.PI,hi=function(){function r(e,t){this.group=new nt,this.opt=t,this.axisModel=e,tt(t,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0,handleAutoShown:function(){return!0}});var a=new nt({x:t.position[0],y:t.position[1],rotation:t.rotation});a.updateTransform(),this._transformGroup=a}return r.prototype.hasBuilder=function(e){return!!$_[e]},r.prototype.add=function(e){$_[e](this.opt,this.axisModel,this.group,this._transformGroup)},r.prototype.getGroup=function(){return this.group},r.innerTextLayout=function(e,t,a){var n=x2(t-e),i,o;return Cf(n)?(o=a>0?\"top\":\"bottom\",i=\"center\"):Cf(n-Za)?(o=a>0?\"bottom\":\"top\",i=\"center\"):(o=\"middle\",n>0&&n<Za?i=a>0?\"right\":\"left\":i=a>0?\"left\":\"right\"),{rotation:n,textAlign:i,textVerticalAlign:o}},r.makeAxisEventDataBase=function(e){var t={componentType:e.mainType,componentIndex:e.componentIndex};return t[e.mainType+\"Index\"]=e.componentIndex,t},r.isLabelSilent=function(e){var t=e.get(\"tooltip\");return e.get(\"silent\")||!(e.get(\"triggerEvent\")||t&&t.show)},r}(),$_={axisLine:function(r,e,t,a){var n=e.get([\"axisLine\",\"show\"]);if(n===\"auto\"&&r.handleAutoShown&&(n=r.handleAutoShown(\"axisLine\")),!!n){var i=e.axis.getExtent(),o=a.transform,s=[i[0],0],l=[i[1],0],u=s[0]>l[0];o&&(he(s,s,o),he(l,l,o));var f=V({lineCap:\"round\"},e.getModel([\"axisLine\",\"lineStyle\"]).getLineStyle()),h=new ue({shape:{x1:s[0],y1:s[1],x2:l[0],y2:l[1]},style:f,strokeContainThreshold:r.strokeContainThreshold||5,silent:!0,z2:1});ho(h.shape,h.style.lineWidth),h.anid=\"line\",t.add(h);var v=e.get([\"axisLine\",\"symbol\"]);if(v!=null){var c=e.get([\"axisLine\",\"symbolSize\"]);U(v)&&(v=[v,v]),(U(c)||Mt(c))&&(c=[c,c]);var d=Ti(e.get([\"axisLine\",\"symbolOffset\"])||0,c),p=c[0],g=c[1];A([{rotate:r.rotation+Math.PI/2,offset:d[0],r:0},{rotate:r.rotation-Math.PI/2,offset:d[1],r:Math.sqrt((s[0]-l[0])*(s[0]-l[0])+(s[1]-l[1])*(s[1]-l[1]))}],function(y,m){if(v[m]!==\"none\"&&v[m]!=null){var _=jt(v[m],-p/2,-g/2,p,g,f.stroke,!0),S=y.r+y.offset,w=u?l:s;_.attr({rotation:y.rotate,x:w[0]+S*Math.cos(r.rotation),y:w[1]-S*Math.sin(r.rotation),silent:!0,z2:11}),t.add(_)}})}}},axisTickLabel:function(r,e,t,a){var n=BV(t,a,e,r),i=VV(t,a,e,r);if(OV(e,i,n),NV(t,a,e,r.tickDirection),e.get([\"axisLabel\",\"hideOverlap\"])){var o=GA(G(i,function(s){return{label:s,priority:s.z2,defaultAttr:{ignore:s.ignore}}}));$A(o)}},axisName:function(r,e,t,a){var n=le(r.axisName,e.get(\"name\"));if(!!n){var i=e.get(\"nameLocation\"),o=r.nameDirection,s=e.getModel(\"nameTextStyle\"),l=e.get(\"nameGap\")||0,u=e.axis.getExtent(),f=u[0]>u[1]?-1:1,h=[i===\"start\"?u[0]-f*l:i===\"end\"?u[1]+f*l:(u[0]+u[1])/2,Y_(i)?r.labelOffset+o*l:0],v,c=e.get(\"nameRotate\");c!=null&&(c=c*Za/180);var d;Y_(i)?v=hi.innerTextLayout(r.rotation,c!=null?c:r.rotation,o):(v=kV(r.rotation,i,c||0,u),d=r.axisNameAvailableWidth,d!=null&&(d=Math.abs(d/Math.sin(v.rotation)),!isFinite(d)&&(d=null)));var p=s.getFont(),g=e.get(\"nameTruncate\",!0)||{},y=g.ellipsis,m=le(r.nameTruncateMaxWidth,g.maxWidth,d),_=new Dt({x:h[0],y:h[1],rotation:v.rotation,silent:hi.isLabelSilent(e),style:Nt(s,{text:n,font:p,overflow:\"truncate\",width:m,ellipsis:y,fill:s.getTextColor()||e.get([\"axisLine\",\"lineStyle\",\"color\"]),align:s.get(\"align\")||v.textAlign,verticalAlign:s.get(\"verticalAlign\")||v.textVerticalAlign}),z2:1});if(Do({el:_,componentModel:e,itemName:n}),_.__fullText=n,_.anid=\"name\",e.get(\"triggerEvent\")){var S=hi.makeAxisEventDataBase(e);S.targetType=\"axisName\",S.name=n,it(_).eventData=S}a.add(_),_.updateTransform(),t.add(_),_.decomposeTransform()}}};function kV(r,e,t,a){var n=x2(t-r),i,o,s=a[0]>a[1],l=e===\"start\"&&!s||e!==\"start\"&&s;return Cf(n-Za/2)?(o=l?\"bottom\":\"top\",i=\"center\"):Cf(n-Za*1.5)?(o=l?\"top\":\"bottom\",i=\"center\"):(o=\"middle\",n<Za*1.5&&n>Za/2?i=l?\"left\":\"right\":i=l?\"right\":\"left\"),{rotation:n,textAlign:i,textVerticalAlign:o}}function OV(r,e,t){if(!LA(r.axis)){var a=r.get([\"axisLabel\",\"showMinLabel\"]),n=r.get([\"axisLabel\",\"showMaxLabel\"]);e=e||[],t=t||[];var i=e[0],o=e[1],s=e[e.length-1],l=e[e.length-2],u=t[0],f=t[1],h=t[t.length-1],v=t[t.length-2];a===!1?(Ze(i),Ze(u)):U_(i,o)&&(a?(Ze(o),Ze(f)):(Ze(i),Ze(u))),n===!1?(Ze(s),Ze(h)):U_(l,s)&&(n?(Ze(l),Ze(v)):(Ze(s),Ze(h)))}}function Ze(r){r&&(r.ignore=!0)}function U_(r,e){var t=r&&r.getBoundingRect().clone(),a=e&&e.getBoundingRect().clone();if(!(!t||!a)){var n=ph([]);return bi(n,n,-r.rotation),t.applyTransform(ha([],n,r.getLocalTransform())),a.applyTransform(ha([],n,e.getLocalTransform())),t.intersect(a)}}function Y_(r){return r===\"middle\"||r===\"center\"}function hD(r,e,t,a,n){for(var i=[],o=[],s=[],l=0;l<r.length;l++){var u=r[l].coord;o[0]=u,o[1]=0,s[0]=u,s[1]=t,e&&(he(o,o,e),he(s,s,e));var f=new ue({shape:{x1:o[0],y1:o[1],x2:s[0],y2:s[1]},style:a,z2:2,autoBatch:!0,silent:!0});ho(f.shape,f.style.lineWidth),f.anid=n+\"_\"+r[l].tickValue,i.push(f)}return i}function BV(r,e,t,a){var n=t.axis,i=t.getModel(\"axisTick\"),o=i.get(\"show\");if(o===\"auto\"&&a.handleAutoShown&&(o=a.handleAutoShown(\"axisTick\")),!(!o||n.scale.isBlank())){for(var s=i.getModel(\"lineStyle\"),l=a.tickDirection*i.get(\"length\"),u=n.getTicksCoords(),f=hD(u,e.transform,l,tt(s.getLineStyle(),{stroke:t.get([\"axisLine\",\"lineStyle\",\"color\"])}),\"ticks\"),h=0;h<f.length;h++)r.add(f[h]);return f}}function NV(r,e,t,a){var n=t.axis,i=t.getModel(\"minorTick\");if(!(!i.get(\"show\")||n.scale.isBlank())){var o=n.getMinorTicksCoords();if(!!o.length)for(var s=i.getModel(\"lineStyle\"),l=a*i.get(\"length\"),u=tt(s.getLineStyle(),tt(t.getModel(\"axisTick\").getLineStyle(),{stroke:t.get([\"axisLine\",\"lineStyle\",\"color\"])})),f=0;f<o.length;f++)for(var h=hD(o[f],e.transform,l,u,\"minorticks_\"+f),v=0;v<h.length;v++)r.add(h[v])}}function VV(r,e,t,a){var n=t.axis,i=le(a.axisLabelShow,t.get([\"axisLabel\",\"show\"]));if(!(!i||n.scale.isBlank())){var o=t.getModel(\"axisLabel\"),s=o.get(\"margin\"),l=n.getViewLabels(),u=(le(a.labelRotate,o.get(\"rotate\"))||0)*Za/180,f=hi.innerTextLayout(a.rotation,u,a.labelDirection),h=t.getCategories&&t.getCategories(!0),v=[],c=hi.isLabelSilent(t),d=t.get(\"triggerEvent\");return A(l,function(p,g){var y=n.scale.type===\"ordinal\"?n.scale.getRawOrdinalNumber(p.tickValue):p.tickValue,m=p.formattedLabel,_=p.rawLabel,S=o;if(h&&h[y]){var w=h[y];et(w)&&w.textStyle&&(S=new Vt(w.textStyle,o,t.ecModel))}var x=S.getTextColor()||t.get([\"axisLine\",\"lineStyle\",\"color\"]),b=n.dataToCoord(y),C=new Dt({x:b,y:a.labelOffset+a.labelDirection*s,rotation:f.rotation,silent:c,z2:10+(p.level||0),style:Nt(S,{text:m,align:S.getShallow(\"align\",!0)||f.textAlign,verticalAlign:S.getShallow(\"verticalAlign\",!0)||S.getShallow(\"baseline\",!0)||f.textVerticalAlign,fill:J(x)?x(n.type===\"category\"?_:n.type===\"value\"?y+\"\":y,g):x})});if(C.anid=\"label_\"+y,d){var T=hi.makeAxisEventDataBase(t);T.targetType=\"axisLabel\",T.value=_,T.tickIndex=g,n.type===\"category\"&&(T.dataIndex=y),it(C).eventData=T}e.add(C),C.updateTransform(),v.push(C),r.add(C),C.decomposeTransform()}),v}}var wa=hi;function zV(r,e){var t={axesInfo:{},seriesInvolved:!1,coordSysAxesInfo:{},coordSysMap:{}};return FV(t,r,e),t.seriesInvolved&&HV(t,r),t}function FV(r,e,t){var a=e.getComponent(\"tooltip\"),n=e.getComponent(\"axisPointer\"),i=n.get(\"link\",!0)||[],o=[];A(t.getCoordinateSystems(),function(s){if(!s.axisPointerEnabled)return;var l=ol(s.model),u=r.coordSysAxesInfo[l]={};r.coordSysMap[l]=s;var f=s.model,h=f.getModel(\"tooltip\",a);if(A(s.getAxes(),ot(p,!1,null)),s.getTooltipAxes&&a&&h.get(\"show\")){var v=h.get(\"trigger\")===\"axis\",c=h.get([\"axisPointer\",\"type\"])===\"cross\",d=s.getTooltipAxes(h.get([\"axisPointer\",\"axis\"]));(v||c)&&A(d.baseAxes,ot(p,c?\"cross\":!0,v)),c&&A(d.otherAxes,ot(p,\"cross\",!1))}function p(g,y,m){var _=m.model.getModel(\"axisPointer\",n),S=_.get(\"show\");if(!(!S||S===\"auto\"&&!g&&!Mp(_))){y==null&&(y=_.get(\"triggerTooltip\")),_=g?GV(m,h,n,e,g,y):_;var w=_.get(\"snap\"),x=_.get(\"triggerEmphasis\"),b=ol(m.model),C=y||w||m.type===\"category\",T=r.axesInfo[b]={key:b,axis:m,coordSys:s,axisPointerModel:_,triggerTooltip:y,triggerEmphasis:x,involveSeries:C,snap:w,useHandle:Mp(_),seriesModels:[],linkGroup:null};u[b]=T,r.seriesInvolved=r.seriesInvolved||C;var D=WV(i,m);if(D!=null){var M=o[D]||(o[D]={axesInfo:{}});M.axesInfo[b]=T,M.mapper=i[D].mapper,T.linkGroup=M}}}})}function GV(r,e,t,a,n,i){var o=e.getModel(\"axisPointer\"),s=[\"type\",\"snap\",\"lineStyle\",\"shadowStyle\",\"label\",\"animation\",\"animationDurationUpdate\",\"animationEasingUpdate\",\"z\"],l={};A(s,function(v){l[v]=at(o.get(v))}),l.snap=r.type!==\"category\"&&!!i,o.get(\"type\")===\"cross\"&&(l.type=\"line\");var u=l.label||(l.label={});if(u.show==null&&(u.show=!1),n===\"cross\"){var f=o.get([\"label\",\"show\"]);if(u.show=f!=null?f:!0,!i){var h=l.lineStyle=o.get(\"crossStyle\");h&&tt(u,h.textStyle)}}return r.model.getModel(\"axisPointer\",new Vt(l,t,a))}function HV(r,e){e.eachSeries(function(t){var a=t.coordinateSystem,n=t.get([\"tooltip\",\"trigger\"],!0),i=t.get([\"tooltip\",\"show\"],!0);!a||n===\"none\"||n===!1||n===\"item\"||i===!1||t.get([\"axisPointer\",\"show\"],!0)===!1||A(r.coordSysAxesInfo[ol(a.model)],function(o){var s=o.axis;a.getAxis(s.dim)===s&&(o.seriesModels.push(t),o.seriesDataCount==null&&(o.seriesDataCount=0),o.seriesDataCount+=t.getData().count())})})}function WV(r,e){for(var t=e.model,a=e.dim,n=0;n<r.length;n++){var i=r[n]||{};if(gc(i[a+\"AxisId\"],t.id)||gc(i[a+\"AxisIndex\"],t.componentIndex)||gc(i[a+\"AxisName\"],t.name))return n}}function gc(r,e){return r===\"all\"||F(r)&&dt(r,e)>=0||r===e}function $V(r){var e=Cy(r);if(!!e){var t=e.axisPointerModel,a=e.axis.scale,n=t.option,i=t.get(\"status\"),o=t.get(\"value\");o!=null&&(o=a.parse(o));var s=Mp(t);i==null&&(n.status=s?\"show\":\"hide\");var l=a.getExtent().slice();l[0]>l[1]&&l.reverse(),(o==null||o>l[1])&&(o=l[1]),o<l[0]&&(o=l[0]),n.value=o,s&&(n.status=e.axis.scale.isBlank()?\"hide\":\"show\")}}function Cy(r){var e=(r.ecModel.getComponent(\"axisPointer\")||{}).coordSysAxesInfo;return e&&e.axesInfo[ol(r)]}function UV(r){var e=Cy(r);return e&&e.axisPointerModel}function Mp(r){return!!r.get([\"handle\",\"show\"])}function ol(r){return r.type+\"||\"+r.id}var Z_={},YV=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n,i){this.axisPointerClass&&$V(t),r.prototype.render.apply(this,arguments),this._doUpdateAxisPointerClass(t,n,!0)},e.prototype.updateAxisPointer=function(t,a,n,i){this._doUpdateAxisPointerClass(t,n,!1)},e.prototype.remove=function(t,a){var n=this._axisPointer;n&&n.remove(a)},e.prototype.dispose=function(t,a){this._disposeAxisPointer(a),r.prototype.dispose.apply(this,arguments)},e.prototype._doUpdateAxisPointerClass=function(t,a,n){var i=e.getAxisPointerClass(this.axisPointerClass);if(!!i){var o=UV(t);o?(this._axisPointer||(this._axisPointer=new i)).render(t,o,a,n):this._disposeAxisPointer(a)}},e.prototype._disposeAxisPointer=function(t){this._axisPointer&&this._axisPointer.dispose(t),this._axisPointer=null},e.registerAxisPointerClass=function(t,a){Z_[t]=a},e.getAxisPointerClass=function(t){return t&&Z_[t]},e.type=\"axis\",e}(Ut),Mi=YV,Lp=Ct();function vD(r,e,t,a){var n=t.axis;if(!n.scale.isBlank()){var i=t.getModel(\"splitArea\"),o=i.getModel(\"areaStyle\"),s=o.get(\"color\"),l=a.coordinateSystem.getRect(),u=n.getTicksCoords({tickModel:i,clamp:!0});if(!!u.length){var f=s.length,h=Lp(r).splitAreaColors,v=q(),c=0;if(h)for(var d=0;d<u.length;d++){var p=h.get(u[d].tickValue);if(p!=null){c=(p+(f-1)*d)%f;break}}var g=n.toGlobalCoord(u[0].coord),y=o.getAreaStyle();s=F(s)?s:[s];for(var d=1;d<u.length;d++){var m=n.toGlobalCoord(u[d].coord),_=void 0,S=void 0,w=void 0,x=void 0;n.isHorizontal()?(_=g,S=l.y,w=m-_,x=l.height,g=_+w):(_=l.x,S=g,w=l.width,x=m-S,g=S+x);var b=u[d-1].tickValue;b!=null&&v.set(b,c),e.add(new bt({anid:b!=null?\"area_\"+b:null,shape:{x:_,y:S,width:w,height:x},style:tt({fill:s[c]},y),autoBatch:!0,silent:!0})),c=(c+1)%f}Lp(r).splitAreaColors=v}}}function cD(r){Lp(r).splitAreaColors=null}var ZV=[\"axisLine\",\"axisTickLabel\",\"axisName\"],XV=[\"splitArea\",\"splitLine\",\"minorSplitLine\"],dD=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.axisPointerClass=\"CartesianAxisPointer\",t}return e.prototype.render=function(t,a,n,i){this.group.removeAll();var o=this._axisGroup;if(this._axisGroup=new nt,this.group.add(this._axisGroup),!!t.get(\"show\")){var s=t.getCoordSysModel(),l=Dp(s,t),u=new wa(t,V({handleAutoShown:function(h){for(var v=s.coordinateSystem.getCartesians(),c=0;c<v.length;c++)if(wp(v[c].getOtherAxis(t.axis).scale))return!0;return!1}},l));A(ZV,u.add,u),this._axisGroup.add(u.getGroup()),A(XV,function(h){t.get([h,\"show\"])&&qV[h](this,this._axisGroup,t,s)},this);var f=i&&i.type===\"changeAxisOrder\"&&i.isInitSort;f||Tl(o,this._axisGroup,t),r.prototype.render.call(this,t,a,n,i)}},e.prototype.remove=function(){cD(this)},e.type=\"cartesianAxis\",e}(Mi),qV={splitLine:function(r,e,t,a){var n=t.axis;if(!n.scale.isBlank()){var i=t.getModel(\"splitLine\"),o=i.getModel(\"lineStyle\"),s=o.get(\"color\");s=F(s)?s:[s];for(var l=a.coordinateSystem.getRect(),u=n.isHorizontal(),f=0,h=n.getTicksCoords({tickModel:i}),v=[],c=[],d=o.getLineStyle(),p=0;p<h.length;p++){var g=n.toGlobalCoord(h[p].coord);u?(v[0]=g,v[1]=l.y,c[0]=g,c[1]=l.y+l.height):(v[0]=l.x,v[1]=g,c[0]=l.x+l.width,c[1]=g);var y=f++%s.length,m=h[p].tickValue,_=new ue({anid:m!=null?\"line_\"+h[p].tickValue:null,autoBatch:!0,shape:{x1:v[0],y1:v[1],x2:c[0],y2:c[1]},style:tt({stroke:s[y]},d),silent:!0});ho(_.shape,d.lineWidth),e.add(_)}}},minorSplitLine:function(r,e,t,a){var n=t.axis,i=t.getModel(\"minorSplitLine\"),o=i.getModel(\"lineStyle\"),s=a.coordinateSystem.getRect(),l=n.isHorizontal(),u=n.getMinorTicksCoords();if(!!u.length)for(var f=[],h=[],v=o.getLineStyle(),c=0;c<u.length;c++)for(var d=0;d<u[c].length;d++){var p=n.toGlobalCoord(u[c][d].coord);l?(f[0]=p,f[1]=s.y,h[0]=p,h[1]=s.y+s.height):(f[0]=s.x,f[1]=p,h[0]=s.x+s.width,h[1]=p);var g=new ue({anid:\"minor_line_\"+u[c][d].tickValue,autoBatch:!0,shape:{x1:f[0],y1:f[1],x2:h[0],y2:h[1]},style:v,silent:!0});ho(g.shape,v.lineWidth),e.add(g)}},splitArea:function(r,e,t,a){vD(r,e,t,a)}},pD=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.type=\"xAxis\",e}(dD),KV=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=pD.type,t}return e.type=\"yAxis\",e}(dD),JV=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=\"grid\",t}return e.prototype.render=function(t,a){this.group.removeAll(),t.get(\"show\")&&this.group.add(new bt({shape:t.coordinateSystem.getRect(),style:tt({fill:t.get(\"backgroundColor\")},t.getItemStyle()),silent:!0,z2:-1}))},e.type=\"grid\",e}(Ut),X_={offset:0};function gD(r){r.registerComponentView(JV),r.registerComponentModel(xV),r.registerCoordinateSystem(\"cartesian2d\",EV),yo(r,\"x\",Tp,X_),yo(r,\"y\",Tp,X_),r.registerComponentView(pD),r.registerComponentView(KV),r.registerPreprocessor(function(e){e.xAxis&&e.yAxis&&!e.grid&&(e.grid={})})}function QV(r){ct(gD),r.registerSeriesModel(cV),r.registerChartView(_V),r.registerLayout(Ol(\"scatter\"))}function jV(r){r.eachSeriesByType(\"radar\",function(e){var t=e.getData(),a=[],n=e.coordinateSystem;if(!!n){var i=n.getIndicatorAxes();A(i,function(o,s){t.each(t.mapDimension(i[s].dim),function(l,u){a[u]=a[u]||[];var f=n.dataToPoint(l,s);a[u][s]=q_(f)?f:K_(n)})}),t.each(function(o){var s=LR(a[o],function(l){return q_(l)})||K_(n);a[o].push(s.slice()),t.setItemLayout(o,a[o])})}})}function q_(r){return!isNaN(r[0])&&!isNaN(r[1])}function K_(r){return[r.cx,r.cy]}function tz(r){var e=r.polar;if(e){F(e)||(e=[e]);var t=[];A(e,function(a,n){a.indicator?(a.type&&!a.shape&&(a.shape=a.type),r.radar=r.radar||[],F(r.radar)||(r.radar=[r.radar]),r.radar.push(a)):t.push(a)}),r.polar=t}A(r.series,function(a){a&&a.type===\"radar\"&&a.polarIndex&&(a.radarIndex=a.polarIndex)})}var ez=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n){var i=t.coordinateSystem,o=this.group,s=t.getData(),l=this._data;function u(v,c){var d=v.getItemVisual(c,\"symbol\")||\"circle\";if(d!==\"none\"){var p=Bo(v.getItemVisual(c,\"symbolSize\")),g=jt(d,-1,-1,2,2),y=v.getItemVisual(c,\"symbolRotate\")||0;return g.attr({style:{strokeNoScale:!0},z2:100,scaleX:p[0]/2,scaleY:p[1]/2,rotation:y*Math.PI/180||0}),g}}function f(v,c,d,p,g,y){d.removeAll();for(var m=0;m<c.length-1;m++){var _=u(p,g);_&&(_.__dimIdx=m,v[m]?(_.setPosition(v[m]),Dl[y?\"initProps\":\"updateProps\"](_,{x:c[m][0],y:c[m][1]},t,g)):_.setPosition(c[m]),d.add(_))}}function h(v){return G(v,function(c){return[i.cx,i.cy]})}s.diff(l).add(function(v){var c=s.getItemLayout(v);if(!!c){var d=new ze,p=new Fe,g={shape:{points:c}};d.shape.points=h(c),p.shape.points=h(c),Ft(d,g,t,v),Ft(p,g,t,v);var y=new nt,m=new nt;y.add(p),y.add(d),y.add(m),f(p.shape.points,c,m,s,v,!0),s.setItemGraphicEl(v,y)}}).update(function(v,c){var d=l.getItemGraphicEl(c),p=d.childAt(0),g=d.childAt(1),y=d.childAt(2),m={shape:{points:s.getItemLayout(v)}};!m.shape.points||(f(p.shape.points,m.shape.points,y,s,v,!1),Ar(g),Ar(p),Lt(p,m,t),Lt(g,m,t),s.setItemGraphicEl(v,d))}).remove(function(v){o.remove(l.getItemGraphicEl(v))}).execute(),s.eachItemGraphicEl(function(v,c){var d=s.getItemModel(c),p=v.childAt(0),g=v.childAt(1),y=v.childAt(2),m=s.getItemVisual(c,\"style\"),_=m.fill;o.add(v),p.useStyle(tt(d.getModel(\"lineStyle\").getLineStyle(),{fill:\"none\",stroke:_})),ce(p,d,\"lineStyle\"),ce(g,d,\"areaStyle\");var S=d.getModel(\"areaStyle\"),w=S.isEmpty()&&S.parentModel.isEmpty();g.ignore=w,A([\"emphasis\",\"select\",\"blur\"],function(C){var T=d.getModel([C,\"areaStyle\"]),D=T.isEmpty()&&T.parentModel.isEmpty();g.ensureState(C).ignore=D&&w}),g.useStyle(tt(S.getAreaStyle(),{fill:_,opacity:.7,decal:m.decal}));var x=d.getModel(\"emphasis\"),b=x.getModel(\"itemStyle\").getItemStyle();y.eachChild(function(C){if(C instanceof pe){var T=C.style;C.useStyle(V({image:T.image,x:T.x,y:T.y,width:T.width,height:T.height},m))}else C.useStyle(m),C.setColor(_),C.style.strokeNoScale=!0;var D=C.ensureState(\"emphasis\");D.style=at(b);var M=s.getStore().get(s.getDimensionIndex(C.__dimIdx),c);(M==null||isNaN(M))&&(M=\"\"),de(C,ie(d),{labelFetcher:s.hostModel,labelDataIndex:c,labelDimIndex:C.__dimIdx,defaultText:M,inheritColor:_,defaultOpacity:m.opacity})}),$t(v,x.get(\"focus\"),x.get(\"blurScope\"),x.get(\"disabled\"))}),this._data=s},e.prototype.remove=function(){this.group.removeAll(),this._data=null},e.type=\"radar\",e}(zt),rz=ez,az=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.hasSymbolVisual=!0,t}return e.prototype.init=function(t){r.prototype.init.apply(this,arguments),this.legendVisualProvider=new Nl(Y(this.getData,this),Y(this.getRawData,this))},e.prototype.getInitialData=function(t,a){return No(this,{generateCoord:\"indicator_\",generateCoordCount:1/0})},e.prototype.formatTooltip=function(t,a,n){var i=this.getData(),o=this.coordinateSystem,s=o.getIndicatorAxes(),l=this.getData().getName(t),u=l===\"\"?this.name:l,f=TT(this,t);return oe(\"section\",{header:u,sortBlocks:!0,blocks:G(s,function(h){var v=i.get(i.mapDimension(h.dim),t);return oe(\"nameValue\",{markerType:\"subItem\",markerColor:f,name:h.name,value:v,sortParam:v})})})},e.prototype.getTooltipPosition=function(t){if(t!=null){for(var a=this.getData(),n=this.coordinateSystem,i=a.getValues(G(n.dimensions,function(u){return a.mapDimension(u)}),t),o=0,s=i.length;o<s;o++)if(!isNaN(i[o])){var l=n.getIndicatorAxes();return n.coordToPoint(l[o].dataToCoord(i[o]),o)}}},e.type=\"series.radar\",e.dependencies=[\"radar\"],e.defaultOption={z:2,colorBy:\"data\",coordinateSystem:\"radar\",legendHoverLink:!0,radarIndex:0,lineStyle:{width:2,type:\"solid\",join:\"round\"},label:{position:\"top\"},symbolSize:8},e}(Ht),nz=az,as=uD.value;function Du(r,e){return tt({show:e},r)}var iz=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.optionUpdated=function(){var t=this.get(\"boundaryGap\"),a=this.get(\"splitNumber\"),n=this.get(\"scale\"),i=this.get(\"axisLine\"),o=this.get(\"axisTick\"),s=this.get(\"axisLabel\"),l=this.get(\"axisName\"),u=this.get([\"axisName\",\"show\"]),f=this.get([\"axisName\",\"formatter\"]),h=this.get(\"axisNameGap\"),v=this.get(\"triggerEvent\"),c=G(this.get(\"indicator\")||[],function(d){d.max!=null&&d.max>0&&!d.min?d.min=0:d.min!=null&&d.min<0&&!d.max&&(d.max=0);var p=l;d.color!=null&&(p=tt({color:d.color},l));var g=ht(at(d),{boundaryGap:t,splitNumber:a,scale:n,axisLine:i,axisTick:o,axisLabel:s,name:d.text,showName:u,nameLocation:\"end\",nameGap:h,nameTextStyle:p,triggerEvent:v},!1);if(U(f)){var y=g.name;g.name=f.replace(\"{value}\",y!=null?y:\"\")}else J(f)&&(g.name=f(g.name,g));var m=new Vt(g,null,this.ecModel);return te(m,Rl.prototype),m.mainType=\"radar\",m.componentIndex=this.componentIndex,m},this);this._indicatorModels=c},e.prototype.getIndicatorModels=function(){return this._indicatorModels},e.type=\"radar\",e.defaultOption={z:0,center:[\"50%\",\"50%\"],radius:\"75%\",startAngle:90,axisName:{show:!0},boundaryGap:[0,0],splitNumber:5,axisNameGap:15,scale:!1,shape:\"polygon\",axisLine:ht({lineStyle:{color:\"#bbb\"}},as.axisLine),axisLabel:Du(as.axisLabel,!1),axisTick:Du(as.axisTick,!1),splitLine:Du(as.splitLine,!0),splitArea:Du(as.splitArea,!0),indicator:[]},e}(Tt),oz=iz,sz=[\"axisLine\",\"axisTickLabel\",\"axisName\"],lz=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n){var i=this.group;i.removeAll(),this._buildAxes(t),this._buildSplitLineAndArea(t)},e.prototype._buildAxes=function(t){var a=t.coordinateSystem,n=a.getIndicatorAxes(),i=G(n,function(o){var s=o.model.get(\"showName\")?o.name:\"\",l=new wa(o.model,{axisName:s,position:[a.cx,a.cy],rotation:o.angle,labelDirection:-1,tickDirection:-1,nameDirection:1});return l});A(i,function(o){A(sz,o.add,o),this.group.add(o.getGroup())},this)},e.prototype._buildSplitLineAndArea=function(t){var a=t.coordinateSystem,n=a.getIndicatorAxes();if(!n.length)return;var i=t.get(\"shape\"),o=t.getModel(\"splitLine\"),s=t.getModel(\"splitArea\"),l=o.getModel(\"lineStyle\"),u=s.getModel(\"areaStyle\"),f=o.get(\"show\"),h=s.get(\"show\"),v=l.get(\"color\"),c=u.get(\"color\"),d=F(v)?v:[v],p=F(c)?c:[c],g=[],y=[];function m(R,E,B){var O=B%E.length;return R[O]=R[O]||[],O}if(i===\"circle\")for(var _=n[0].getTicksCoords(),S=a.cx,w=a.cy,x=0;x<_.length;x++){if(f){var b=m(g,d,x);g[b].push(new Qr({shape:{cx:S,cy:w,r:_[x].coord}}))}if(h&&x<_.length-1){var b=m(y,p,x);y[b].push(new Ch({shape:{cx:S,cy:w,r0:_[x].coord,r:_[x+1].coord}}))}}else for(var C,T=G(n,function(R,E){var B=R.getTicksCoords();return C=C==null?B.length-1:Math.min(B.length-1,C),G(B,function(O){return a.coordToPoint(O.coord,E)})}),D=[],x=0;x<=C;x++){for(var M=[],L=0;L<n.length;L++)M.push(T[L][x]);if(M[0]&&M.push(M[0].slice()),f){var b=m(g,d,x);g[b].push(new Fe({shape:{points:M}}))}if(h&&D){var b=m(y,p,x-1);y[b].push(new ze({shape:{points:M.concat(D)}}))}D=M.slice().reverse()}var I=l.getLineStyle(),P=u.getAreaStyle();A(y,function(R,E){this.group.add(nr(R,{style:tt({stroke:\"none\",fill:p[E%p.length]},P),silent:!0}))},this),A(g,function(R,E){this.group.add(nr(R,{style:tt({fill:\"none\",stroke:d[E%d.length]},I),silent:!0}))},this)},e.type=\"radar\",e}(Ut),uz=lz,fz=function(r){k(e,r);function e(t,a,n){var i=r.call(this,t,a,n)||this;return i.type=\"value\",i.angle=0,i.name=\"\",i}return e}(Mr),hz=fz,vz=function(){function r(e,t,a){this.dimensions=[],this._model=e,this._indicatorAxes=G(e.getIndicatorModels(),function(n,i){var o=\"indicator_\"+i,s=new hz(o,new on);return s.name=n.get(\"name\"),s.model=n,n.axis=s,this.dimensions.push(o),s},this),this.resize(e,a)}return r.prototype.getIndicatorAxes=function(){return this._indicatorAxes},r.prototype.dataToPoint=function(e,t){var a=this._indicatorAxes[t];return this.coordToPoint(a.dataToCoord(e),t)},r.prototype.coordToPoint=function(e,t){var a=this._indicatorAxes[t],n=a.angle,i=this.cx+e*Math.cos(n),o=this.cy-e*Math.sin(n);return[i,o]},r.prototype.pointToData=function(e){var t=e[0]-this.cx,a=e[1]-this.cy,n=Math.sqrt(t*t+a*a);t/=n,a/=n;for(var i=Math.atan2(-a,t),o=1/0,s,l=-1,u=0;u<this._indicatorAxes.length;u++){var f=this._indicatorAxes[u],h=Math.abs(i-f.angle);h<o&&(s=f,l=u,o=h)}return[l,+(s&&s.coordToData(n))]},r.prototype.resize=function(e,t){var a=e.get(\"center\"),n=t.getWidth(),i=t.getHeight(),o=Math.min(n,i)/2;this.cx=W(a[0],n),this.cy=W(a[1],i),this.startAngle=e.get(\"startAngle\")*Math.PI/180;var s=e.get(\"radius\");(U(s)||Mt(s))&&(s=[0,s]),this.r0=W(s[0],o),this.r=W(s[1],o),A(this._indicatorAxes,function(l,u){l.setExtent(this.r0,this.r);var f=this.startAngle+u*Math.PI*2/this._indicatorAxes.length;f=Math.atan2(Math.sin(f),Math.cos(f)),l.angle=f},this)},r.prototype.update=function(e,t){var a=this._indicatorAxes,n=this._model;A(a,function(s){s.scale.setExtent(1/0,-1/0)}),e.eachSeriesByType(\"radar\",function(s,l){if(!(s.get(\"coordinateSystem\")!==\"radar\"||e.getComponent(\"radar\",s.get(\"radarIndex\"))!==n)){var u=s.getData();A(a,function(f){f.scale.unionExtentFromData(u,u.mapDimension(f.dim))})}},this);var i=n.get(\"splitNumber\"),o=new on;o.setExtent(0,i),o.setInterval(1),A(a,function(s,l){fD(s.scale,s.model,o)})},r.prototype.convertToPixel=function(e,t,a){return console.warn(\"Not implemented.\"),null},r.prototype.convertFromPixel=function(e,t,a){return console.warn(\"Not implemented.\"),null},r.prototype.containPoint=function(e){return console.warn(\"Not implemented.\"),!1},r.create=function(e,t){var a=[];return e.eachComponent(\"radar\",function(n){var i=new r(n,e,t);a.push(i),n.coordinateSystem=i}),e.eachSeriesByType(\"radar\",function(n){n.get(\"coordinateSystem\")===\"radar\"&&(n.coordinateSystem=a[n.get(\"radarIndex\")||0])}),a},r.dimensions=[],r}(),cz=vz;function dz(r){r.registerCoordinateSystem(\"radar\",cz),r.registerComponentModel(oz),r.registerComponentView(uz),r.registerVisual({seriesType:\"radar\",reset:function(e){var t=e.getData();t.each(function(a){t.setItemVisual(a,\"legendIcon\",\"roundRect\")}),t.setVisual(\"legendIcon\",\"roundRect\")}})}function pz(r){ct(dz),r.registerChartView(rz),r.registerSeriesModel(nz),r.registerLayout(jV),r.registerProcessor(Bl(\"radar\")),r.registerPreprocessor(tz)}var J_=\"\\0_ec_interaction_mutex\";function gz(r,e,t){var a=Ty(r);a[e]=t}function yz(r,e,t){var a=Ty(r),n=a[e];n===t&&(a[e]=null)}function Q_(r,e){return!!Ty(r)[e]}function Ty(r){return r[J_]||(r[J_]={})}ta({type:\"takeGlobalCursor\",event:\"globalCursorTaken\",update:\"update\"},Kt);var mz=function(r){k(e,r);function e(t){var a=r.call(this)||this;a._zr=t;var n=Y(a._mousedownHandler,a),i=Y(a._mousemoveHandler,a),o=Y(a._mouseupHandler,a),s=Y(a._mousewheelHandler,a),l=Y(a._pinchHandler,a);return a.enable=function(u,f){this.disable(),this._opt=tt(at(f)||{},{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),u==null&&(u=!0),(u===!0||u===\"move\"||u===\"pan\")&&(t.on(\"mousedown\",n),t.on(\"mousemove\",i),t.on(\"mouseup\",o)),(u===!0||u===\"scale\"||u===\"zoom\")&&(t.on(\"mousewheel\",s),t.on(\"pinch\",l))},a.disable=function(){t.off(\"mousedown\",n),t.off(\"mousemove\",i),t.off(\"mouseup\",o),t.off(\"mousewheel\",s),t.off(\"pinch\",l)},a}return e.prototype.isDragging=function(){return this._dragging},e.prototype.isPinching=function(){return this._pinching},e.prototype.setPointerChecker=function(t){this.pointerChecker=t},e.prototype.dispose=function(){this.disable()},e.prototype._mousedownHandler=function(t){if(!Vm(t)){for(var a=t.target;a;){if(a.draggable)return;a=a.__hostTarget||a.parent}var n=t.offsetX,i=t.offsetY;this.pointerChecker&&this.pointerChecker(t,n,i)&&(this._x=n,this._y=i,this._dragging=!0)}},e.prototype._mousemoveHandler=function(t){if(!(!this._dragging||!uf(\"moveOnMouseMove\",t,this._opt)||t.gestureEvent===\"pinch\"||Q_(this._zr,\"globalPan\"))){var a=t.offsetX,n=t.offsetY,i=this._x,o=this._y,s=a-i,l=n-o;this._x=a,this._y=n,this._opt.preventDefaultMouseMove&&ya(t.event),yD(this,\"pan\",\"moveOnMouseMove\",t,{dx:s,dy:l,oldX:i,oldY:o,newX:a,newY:n,isAvailableBehavior:null})}},e.prototype._mouseupHandler=function(t){Vm(t)||(this._dragging=!1)},e.prototype._mousewheelHandler=function(t){var a=uf(\"zoomOnMouseWheel\",t,this._opt),n=uf(\"moveOnMouseWheel\",t,this._opt),i=t.wheelDelta,o=Math.abs(i),s=t.offsetX,l=t.offsetY;if(!(i===0||!a&&!n)){if(a){var u=o>3?1.4:o>1?1.2:1.1,f=i>0?u:1/u;yc(this,\"zoom\",\"zoomOnMouseWheel\",t,{scale:f,originX:s,originY:l,isAvailableBehavior:null})}if(n){var h=Math.abs(i),v=(i>0?1:-1)*(h>3?.4:h>1?.15:.05);yc(this,\"scrollMove\",\"moveOnMouseWheel\",t,{scrollDelta:v,originX:s,originY:l,isAvailableBehavior:null})}}},e.prototype._pinchHandler=function(t){if(!Q_(this._zr,\"globalPan\")){var a=t.pinchScale>1?1.1:1/1.1;yc(this,\"zoom\",null,t,{scale:a,originX:t.pinchX,originY:t.pinchY,isAvailableBehavior:null})}},e}(hr);function yc(r,e,t,a,n){r.pointerChecker&&r.pointerChecker(a,n.originX,n.originY)&&(ya(a.event),yD(r,e,t,a,n))}function yD(r,e,t,a,n){n.isAvailableBehavior=Y(uf,null,t,a),r.trigger(e,n)}function uf(r,e,t){var a=t[r];return!r||a&&(!U(a)||e.event[a+\"Key\"])}var Vl=mz;function Ay(r,e,t){var a=r.target;a.x+=e,a.y+=t,a.dirty()}function Dy(r,e,t,a){var n=r.target,i=r.zoomLimit,o=r.zoom=r.zoom||1;if(o*=e,i){var s=i.min||0,l=i.max||1/0;o=Math.max(Math.min(l,o),s)}var u=o/r.zoom;r.zoom=o,n.x-=(t-n.x)*(u-1),n.y-=(a-n.y)*(u-1),n.scaleX*=u,n.scaleY*=u,n.dirty()}var _z={axisPointer:1,tooltip:1,brush:1};function $h(r,e,t){var a=e.getComponentByElement(r.topTarget),n=a&&a.coordinateSystem;return a&&a!==t&&!_z.hasOwnProperty(a.mainType)&&n&&n.model!==t}function mD(r){if(U(r)){var e=new DOMParser;r=e.parseFromString(r,\"text/xml\")}var t=r;for(t.nodeType===9&&(t=t.firstChild);t.nodeName.toLowerCase()!==\"svg\"||t.nodeType!==1;)t=t.nextSibling;return t}var mc,Yf={fill:\"fill\",stroke:\"stroke\",\"stroke-width\":\"lineWidth\",opacity:\"opacity\",\"fill-opacity\":\"fillOpacity\",\"stroke-opacity\":\"strokeOpacity\",\"stroke-dasharray\":\"lineDash\",\"stroke-dashoffset\":\"lineDashOffset\",\"stroke-linecap\":\"lineCap\",\"stroke-linejoin\":\"lineJoin\",\"stroke-miterlimit\":\"miterLimit\",\"font-family\":\"fontFamily\",\"font-size\":\"fontSize\",\"font-style\":\"fontStyle\",\"font-weight\":\"fontWeight\",\"text-anchor\":\"textAlign\",visibility:\"visibility\",display:\"display\"},j_=St(Yf),Zf={\"alignment-baseline\":\"textBaseline\",\"stop-color\":\"stopColor\"},tS=St(Zf),Sz=function(){function r(){this._defs={},this._root=null}return r.prototype.parse=function(e,t){t=t||{};var a=mD(e);this._defsUsePending=[];var n=new nt;this._root=n;var i=[],o=a.getAttribute(\"viewBox\")||\"\",s=parseFloat(a.getAttribute(\"width\")||t.width),l=parseFloat(a.getAttribute(\"height\")||t.height);isNaN(s)&&(s=null),isNaN(l)&&(l=null),Ge(a,n,null,!0,!1);for(var u=a.firstChild;u;)this._parseNode(u,n,i,null,!1,!1),u=u.nextSibling;bz(this._defs,this._defsUsePending),this._defsUsePending=[];var f,h;if(o){var v=Uh(o);v.length>=4&&(f={x:parseFloat(v[0]||0),y:parseFloat(v[1]||0),width:parseFloat(v[2]),height:parseFloat(v[3])})}if(f&&s!=null&&l!=null&&(h=SD(f,{x:0,y:0,width:s,height:l}),!t.ignoreViewBox)){var c=n;n=new nt,n.add(c),c.scaleX=c.scaleY=h.scale,c.x=h.x,c.y=h.y}return!t.ignoreRootClip&&s!=null&&l!=null&&n.setClipPath(new bt({shape:{x:0,y:0,width:s,height:l}})),{root:n,width:s,height:l,viewBoxRect:f,viewBoxTransform:h,named:i}},r.prototype._parseNode=function(e,t,a,n,i,o){var s=e.nodeName.toLowerCase(),l,u=n;if(s===\"defs\"&&(i=!0),s===\"text\"&&(o=!0),s===\"defs\"||s===\"switch\")l=t;else{if(!i){var f=mc[s];if(f&&Z(mc,s)){l=f.call(this,e,t);var h=e.getAttribute(\"name\");if(h){var v={name:h,namedFrom:null,svgNodeTagLower:s,el:l};a.push(v),s===\"g\"&&(u=v)}else n&&a.push({name:n.name,namedFrom:n,svgNodeTagLower:s,el:l});t.add(l)}}var c=eS[s];if(c&&Z(eS,s)){var d=c.call(this,e),p=e.getAttribute(\"id\");p&&(this._defs[p]=d)}}if(l&&l.isGroup)for(var g=e.firstChild;g;)g.nodeType===1?this._parseNode(g,l,a,u,i,o):g.nodeType===3&&o&&this._parseText(g,l),g=g.nextSibling},r.prototype._parseText=function(e,t){var a=new Xs({style:{text:e.textContent},silent:!0,x:this._textX||0,y:this._textY||0});Xe(t,a),Ge(e,a,this._defsUsePending,!1,!1),xz(a,t);var n=a.style,i=n.fontSize;i&&i<9&&(n.fontSize=9,a.scaleX*=i/9,a.scaleY*=i/9);var o=(n.fontSize||n.fontFamily)&&[n.fontStyle,n.fontWeight,(n.fontSize||12)+\"px\",n.fontFamily||\"sans-serif\"].join(\" \");n.font=o;var s=a.getBoundingRect();return this._textX+=s.width,t.add(a),a},r.internalField=function(){mc={g:function(e,t){var a=new nt;return Xe(t,a),Ge(e,a,this._defsUsePending,!1,!1),a},rect:function(e,t){var a=new bt;return Xe(t,a),Ge(e,a,this._defsUsePending,!1,!1),a.setShape({x:parseFloat(e.getAttribute(\"x\")||\"0\"),y:parseFloat(e.getAttribute(\"y\")||\"0\"),width:parseFloat(e.getAttribute(\"width\")||\"0\"),height:parseFloat(e.getAttribute(\"height\")||\"0\")}),a.silent=!0,a},circle:function(e,t){var a=new Qr;return Xe(t,a),Ge(e,a,this._defsUsePending,!1,!1),a.setShape({cx:parseFloat(e.getAttribute(\"cx\")||\"0\"),cy:parseFloat(e.getAttribute(\"cy\")||\"0\"),r:parseFloat(e.getAttribute(\"r\")||\"0\")}),a.silent=!0,a},line:function(e,t){var a=new ue;return Xe(t,a),Ge(e,a,this._defsUsePending,!1,!1),a.setShape({x1:parseFloat(e.getAttribute(\"x1\")||\"0\"),y1:parseFloat(e.getAttribute(\"y1\")||\"0\"),x2:parseFloat(e.getAttribute(\"x2\")||\"0\"),y2:parseFloat(e.getAttribute(\"y2\")||\"0\")}),a.silent=!0,a},ellipse:function(e,t){var a=new Fg;return Xe(t,a),Ge(e,a,this._defsUsePending,!1,!1),a.setShape({cx:parseFloat(e.getAttribute(\"cx\")||\"0\"),cy:parseFloat(e.getAttribute(\"cy\")||\"0\"),rx:parseFloat(e.getAttribute(\"rx\")||\"0\"),ry:parseFloat(e.getAttribute(\"ry\")||\"0\")}),a.silent=!0,a},polygon:function(e,t){var a=e.getAttribute(\"points\"),n;a&&(n=nS(a));var i=new ze({shape:{points:n||[]},silent:!0});return Xe(t,i),Ge(e,i,this._defsUsePending,!1,!1),i},polyline:function(e,t){var a=e.getAttribute(\"points\"),n;a&&(n=nS(a));var i=new Fe({shape:{points:n||[]},silent:!0});return Xe(t,i),Ge(e,i,this._defsUsePending,!1,!1),i},image:function(e,t){var a=new pe;return Xe(t,a),Ge(e,a,this._defsUsePending,!1,!1),a.setStyle({image:e.getAttribute(\"xlink:href\")||e.getAttribute(\"href\"),x:+e.getAttribute(\"x\"),y:+e.getAttribute(\"y\"),width:+e.getAttribute(\"width\"),height:+e.getAttribute(\"height\")}),a.silent=!0,a},text:function(e,t){var a=e.getAttribute(\"x\")||\"0\",n=e.getAttribute(\"y\")||\"0\",i=e.getAttribute(\"dx\")||\"0\",o=e.getAttribute(\"dy\")||\"0\";this._textX=parseFloat(a)+parseFloat(i),this._textY=parseFloat(n)+parseFloat(o);var s=new nt;return Xe(t,s),Ge(e,s,this._defsUsePending,!1,!0),s},tspan:function(e,t){var a=e.getAttribute(\"x\"),n=e.getAttribute(\"y\");a!=null&&(this._textX=parseFloat(a)),n!=null&&(this._textY=parseFloat(n));var i=e.getAttribute(\"dx\")||\"0\",o=e.getAttribute(\"dy\")||\"0\",s=new nt;return Xe(t,s),Ge(e,s,this._defsUsePending,!1,!0),this._textX+=parseFloat(i),this._textY+=parseFloat(o),s},path:function(e,t){var a=e.getAttribute(\"d\")||\"\",n=sC(a);return Xe(t,n),Ge(e,n,this._defsUsePending,!1,!1),n.silent=!0,n}}}(),r}(),eS={lineargradient:function(r){var e=parseInt(r.getAttribute(\"x1\")||\"0\",10),t=parseInt(r.getAttribute(\"y1\")||\"0\",10),a=parseInt(r.getAttribute(\"x2\")||\"10\",10),n=parseInt(r.getAttribute(\"y2\")||\"0\",10),i=new Cl(e,t,a,n);return rS(r,i),aS(r,i),i},radialgradient:function(r){var e=parseInt(r.getAttribute(\"cx\")||\"0\",10),t=parseInt(r.getAttribute(\"cy\")||\"0\",10),a=parseInt(r.getAttribute(\"r\")||\"0\",10),n=new SC(e,t,a);return rS(r,n),aS(r,n),n}};function rS(r,e){var t=r.getAttribute(\"gradientUnits\");t===\"userSpaceOnUse\"&&(e.global=!0)}function aS(r,e){for(var t=r.firstChild;t;){if(t.nodeType===1&&t.nodeName.toLocaleLowerCase()===\"stop\"){var a=t.getAttribute(\"offset\"),n=void 0;a&&a.indexOf(\"%\")>0?n=parseInt(a,10)/100:a?n=parseFloat(a):n=0;var i={};_D(t,i,i);var o=i.stopColor||t.getAttribute(\"stop-color\")||\"#000000\";e.colorStops.push({offset:n,color:o})}t=t.nextSibling}}function Xe(r,e){r&&r.__inheritedStyle&&(e.__inheritedStyle||(e.__inheritedStyle={}),tt(e.__inheritedStyle,r.__inheritedStyle))}function nS(r){for(var e=Uh(r),t=[],a=0;a<e.length;a+=2){var n=parseFloat(e[a]),i=parseFloat(e[a+1]);t.push([n,i])}return t}function Ge(r,e,t,a,n){var i=e,o=i.__inheritedStyle=i.__inheritedStyle||{},s={};r.nodeType===1&&(Az(r,e),_D(r,o,s),a||Dz(r,o,s)),i.style=i.style||{},o.fill!=null&&(i.style.fill=iS(i,\"fill\",o.fill,t)),o.stroke!=null&&(i.style.stroke=iS(i,\"stroke\",o.stroke,t)),A([\"lineWidth\",\"opacity\",\"fillOpacity\",\"strokeOpacity\",\"miterLimit\",\"fontSize\"],function(l){o[l]!=null&&(i.style[l]=parseFloat(o[l]))}),A([\"lineDashOffset\",\"lineCap\",\"lineJoin\",\"fontWeight\",\"fontFamily\",\"fontStyle\",\"textAlign\"],function(l){o[l]!=null&&(i.style[l]=o[l])}),n&&(i.__selfStyle=s),o.lineDash&&(i.style.lineDash=G(Uh(o.lineDash),function(l){return parseFloat(l)})),(o.visibility===\"hidden\"||o.visibility===\"collapse\")&&(i.invisible=!0),o.display===\"none\"&&(i.ignore=!0)}function xz(r,e){var t=e.__selfStyle;if(t){var a=t.textBaseline,n=a;!a||a===\"auto\"||a===\"baseline\"?n=\"alphabetic\":a===\"before-edge\"||a===\"text-before-edge\"?n=\"top\":a===\"after-edge\"||a===\"text-after-edge\"?n=\"bottom\":(a===\"central\"||a===\"mathematical\")&&(n=\"middle\"),r.style.textBaseline=n}var i=e.__inheritedStyle;if(i){var o=i.textAlign,s=o;o&&(o===\"middle\"&&(s=\"center\"),r.style.textAlign=s)}}var wz=/^url\\(\\s*#(.*?)\\)/;function iS(r,e,t,a){var n=t&&t.match(wz);if(n){var i=Sr(n[1]);a.push([r,e,i]);return}return t===\"none\"&&(t=null),t}function bz(r,e){for(var t=0;t<e.length;t++){var a=e[t];a[0].style[a[1]]=r[a[2]]}}var Cz=/-?([0-9]*\\.)?[0-9]+([eE]-?[0-9]+)?/g;function Uh(r){return r.match(Cz)||[]}var Tz=/(translate|scale|rotate|skewX|skewY|matrix)\\(([\\-\\s0-9\\.eE,]*)\\)/g,_c=Math.PI/180;function Az(r,e){var t=r.getAttribute(\"transform\");if(t){t=t.replace(/,/g,\" \");var a=[],n=null;t.replace(Tz,function(h,v,c){return a.push(v,c),\"\"});for(var i=a.length-1;i>0;i-=2){var o=a[i],s=a[i-1],l=Uh(o);switch(n=n||ur(),s){case\"translate\":Xr(n,n,[parseFloat(l[0]),parseFloat(l[1]||\"0\")]);break;case\"scale\":Cg(n,n,[parseFloat(l[0]),parseFloat(l[1]||l[0])]);break;case\"rotate\":bi(n,n,-parseFloat(l[0])*_c);break;case\"skewX\":var u=Math.tan(parseFloat(l[0])*_c);ha(n,[1,0,u,1,0,0],n);break;case\"skewY\":var f=Math.tan(parseFloat(l[0])*_c);ha(n,[1,f,0,1,0,0],n);break;case\"matrix\":n[0]=parseFloat(l[0]),n[1]=parseFloat(l[1]),n[2]=parseFloat(l[2]),n[3]=parseFloat(l[3]),n[4]=parseFloat(l[4]),n[5]=parseFloat(l[5]);break}}e.setLocalTransform(n)}}var oS=/([^\\s:;]+)\\s*:\\s*([^:;]+)/g;function _D(r,e,t){var a=r.getAttribute(\"style\");if(!!a){oS.lastIndex=0;for(var n;(n=oS.exec(a))!=null;){var i=n[1],o=Z(Yf,i)?Yf[i]:null;o&&(e[o]=n[2]);var s=Z(Zf,i)?Zf[i]:null;s&&(t[s]=n[2])}}}function Dz(r,e,t){for(var a=0;a<j_.length;a++){var n=j_[a],i=r.getAttribute(n);i!=null&&(e[Yf[n]]=i)}for(var a=0;a<tS.length;a++){var n=tS[a],i=r.getAttribute(n);i!=null&&(t[Zf[n]]=i)}}function SD(r,e){var t=e.width/r.width,a=e.height/r.height,n=Math.min(t,a);return{scale:n,x:-(r.x+r.width/2)*n+(e.x+e.width/2),y:-(r.y+r.height/2)*n+(e.y+e.height/2)}}function Mz(r,e){var t=new Sz;return t.parse(r,e)}var Lz=q([\"rect\",\"circle\",\"line\",\"ellipse\",\"polygon\",\"polyline\",\"path\",\"text\",\"tspan\",\"g\"]),Iz=function(){function r(e,t){this.type=\"geoSVG\",this._usedGraphicMap=q(),this._freedGraphics=[],this._mapName=e,this._parsedXML=mD(t)}return r.prototype.load=function(){var e=this._firstGraphic;if(!e){e=this._firstGraphic=this._buildGraphic(this._parsedXML),this._freedGraphics.push(e),this._boundingRect=this._firstGraphic.boundingRect.clone();var t=Rz(e.named),a=t.regions,n=t.regionsMap;this._regions=a,this._regionsMap=n}return{boundingRect:this._boundingRect,regions:this._regions,regionsMap:this._regionsMap}},r.prototype._buildGraphic=function(e){var t,a;try{t=e&&Mz(e,{ignoreViewBox:!0,ignoreRootClip:!0})||{},a=t.root,Me(a!=null)}catch(g){throw new Error(`Invalid svg format\n`+g.message)}var n=new nt;n.add(a),n.isGeoSVGGraphicRoot=!0;var i=t.width,o=t.height,s=t.viewBoxRect,l=this._boundingRect;if(!l){var u=void 0,f=void 0,h=void 0,v=void 0;if(i!=null?(u=0,h=i):s&&(u=s.x,h=s.width),o!=null?(f=0,v=o):s&&(f=s.y,v=s.height),u==null||f==null){var c=a.getBoundingRect();u==null&&(u=c.x,h=c.width),f==null&&(f=c.y,v=c.height)}l=this._boundingRect=new vt(u,f,h,v)}if(s){var d=SD(s,l);a.scaleX=a.scaleY=d.scale,a.x=d.x,a.y=d.y}n.setClipPath(new bt({shape:l.plain()}));var p=[];return A(t.named,function(g){Lz.get(g.svgNodeTagLower)!=null&&(p.push(g),Pz(g.el))}),{root:n,boundingRect:l,named:p}},r.prototype.useGraphic=function(e){var t=this._usedGraphicMap,a=t.get(e);return a||(a=this._freedGraphics.pop()||this._buildGraphic(this._parsedXML),t.set(e,a),a)},r.prototype.freeGraphic=function(e){var t=this._usedGraphicMap,a=t.get(e);a&&(t.removeKey(e),this._freedGraphics.push(a))},r}();function Pz(r){r.silent=!1,r.isGroup&&r.traverse(function(e){e.silent=!1})}function Rz(r){var e=[],t=q();return A(r,function(a){if(a.namedFrom==null){var n=new zN(a.name,a.el);e.push(n),t.set(a.name,n)}}),{regions:e,regionsMap:t}}var Ip=[126,25],sS=\"\\u5357\\u6D77\\u8BF8\\u5C9B\",zn=[[[0,3.5],[7,11.2],[15,11.9],[30,7],[42,.7],[52,.7],[56,7.7],[59,.7],[64,.7],[64,0],[5,0],[0,3.5]],[[13,16.1],[19,14.7],[16,21.7],[11,23.1],[13,16.1]],[[12,32.2],[14,38.5],[15,38.5],[13,32.2],[12,32.2]],[[16,47.6],[12,53.2],[13,53.2],[18,47.6],[16,47.6]],[[6,64.4],[8,70],[9,70],[8,64.4],[6,64.4]],[[23,82.6],[29,79.8],[30,79.8],[25,82.6],[23,82.6]],[[37,70.7],[43,62.3],[44,62.3],[39,70.7],[37,70.7]],[[48,51.1],[51,45.5],[53,45.5],[50,51.1],[48,51.1]],[[51,35],[51,28.7],[53,28.7],[53,35],[51,35]],[[52,22.4],[55,17.5],[56,17.5],[53,22.4],[52,22.4]],[[58,12.6],[62,7],[63,7],[60,12.6],[58,12.6]],[[0,3.5],[0,93.1],[64,93.1],[64,0],[63,0],[63,92.4],[1,92.4],[1,3.5],[0,3.5]]];for(var On=0;On<zn.length;On++)for(var Hi=0;Hi<zn[On].length;Hi++)zn[On][Hi][0]/=10.5,zn[On][Hi][1]/=-10.5/.75,zn[On][Hi][0]+=Ip[0],zn[On][Hi][1]+=Ip[1];function Ez(r,e){if(r===\"china\"){for(var t=0;t<e.length;t++)if(e[t].name===sS)return;e.push(new PA(sS,G(zn,function(a){return{type:\"polygon\",exterior:a}}),Ip))}}var kz={\\u5357\\u6D77\\u8BF8\\u5C9B:[32,80],\\u5E7F\\u4E1C:[0,-10],\\u9999\\u6E2F:[10,5],\\u6FB3\\u95E8:[-10,10],\\u5929\\u6D25:[5,5]};function Oz(r,e){if(r===\"china\"){var t=kz[e.name];if(t){var a=e.getCenter();a[0]+=t[0]/10.5,a[1]+=-t[1]/(10.5/.75),e.setCenter(a)}}}var Bz=[[[123.45165252685547,25.73527164402261],[123.49731445312499,25.73527164402261],[123.49731445312499,25.750734064600884],[123.45165252685547,25.750734064600884],[123.45165252685547,25.73527164402261]]];function Nz(r,e){r===\"china\"&&e.name===\"\\u53F0\\u6E7E\"&&e.geometries.push({type:\"polygon\",exterior:Bz[0]})}var Vz=\"name\",zz=function(){function r(e,t,a){this.type=\"geoJSON\",this._parsedMap=q(),this._mapName=e,this._specialAreas=a,this._geoJSON=Gz(t)}return r.prototype.load=function(e,t){t=t||Vz;var a=this._parsedMap.get(t);if(!a){var n=this._parseToRegions(t);a=this._parsedMap.set(t,{regions:n,boundingRect:Fz(n)})}var i=q(),o=[];return A(a.regions,function(s){var l=s.name;e&&Z(e,l)&&(s=s.cloneShallow(l=e[l])),o.push(s),i.set(l,s)}),{regions:o,boundingRect:a.boundingRect||new vt(0,0,0,0),regionsMap:i}},r.prototype._parseToRegions=function(e){var t=this._mapName,a=this._geoJSON,n;try{n=a?GN(a,e):[]}catch(i){throw new Error(`Invalid geoJson format\n`+i.message)}return Ez(t,n),A(n,function(i){var o=i.name;Oz(t,i),Nz(t,i);var s=this._specialAreas&&this._specialAreas[o];s&&i.transformTo(s.left,s.top,s.width,s.height)},this),n},r.prototype.getMapForUser=function(){return{geoJson:this._geoJSON,geoJSON:this._geoJSON,specialAreas:this._specialAreas}},r}();function Fz(r){for(var e,t=0;t<r.length;t++){var a=r[t].getBoundingRect();e=e||a.clone(),e.union(a)}return e}function Gz(r){return U(r)?typeof JSON!=\"undefined\"&&JSON.parse?JSON.parse(r):new Function(\"return (\"+r+\");\")():r}var ns=q(),ba={registerMap:function(r,e,t){if(e.svg){var a=new Iz(r,e.svg);ns.set(r,a)}else{var n=e.geoJson||e.geoJSON;n&&!e.features?t=e.specialAreas:n=e;var a=new zz(r,n,t);ns.set(r,a)}},getGeoResource:function(r){return ns.get(r)},getMapForUser:function(r){var e=ns.get(r);return e&&e.type===\"geoJSON\"&&e.getMapForUser()},load:function(r,e,t){var a=ns.get(r);if(!!a)return a.load(e,t)}},My=[\"rect\",\"circle\",\"line\",\"ellipse\",\"polygon\",\"polyline\",\"path\"],Hz=q(My),Wz=q(My.concat([\"g\"])),$z=q(My.concat([\"g\"])),xD=Ct();function Mu(r){var e=r.getItemStyle(),t=r.get(\"areaColor\");return t!=null&&(e.fill=t),e}function lS(r){var e=r.style;e&&(e.stroke=e.stroke||e.fill,e.fill=null)}var Uz=function(){function r(e){var t=new nt;this.uid=Lo(\"ec_map_draw\"),this._controller=new Vl(e.getZr()),this._controllerHost={target:t},this.group=t,t.add(this._regionsGroup=new nt),t.add(this._svgGroup=new nt)}return r.prototype.draw=function(e,t,a,n,i){var o=e.mainType===\"geo\",s=e.getData&&e.getData();o&&t.eachComponent({mainType:\"series\",subType:\"map\"},function(y){!s&&y.getHostGeoModel()===e&&(s=y.getData())});var l=e.coordinateSystem,u=this._regionsGroup,f=this.group,h=l.getTransformInfo(),v=h.raw,c=h.roam,d=!u.childAt(0)||i;d?(f.x=c.x,f.y=c.y,f.scaleX=c.scaleX,f.scaleY=c.scaleY,f.dirty()):Lt(f,c,e);var p=s&&s.getVisual(\"visualMeta\")&&s.getVisual(\"visualMeta\").length>0,g={api:a,geo:l,mapOrGeoModel:e,data:s,isVisualEncodedByVisualMap:p,isGeo:o,transformInfoRaw:v};l.resourceType===\"geoJSON\"?this._buildGeoJSON(g):l.resourceType===\"geoSVG\"&&this._buildSVG(g),this._updateController(e,t,a),this._updateMapSelectHandler(e,u,a,n)},r.prototype._buildGeoJSON=function(e){var t=this._regionsGroupByName=q(),a=q(),n=this._regionsGroup,i=e.transformInfoRaw,o=e.mapOrGeoModel,s=e.data,l=e.geo.projection,u=l&&l.stream;function f(c,d){return d&&(c=d(c)),c&&[c[0]*i.scaleX+i.x,c[1]*i.scaleY+i.y]}function h(c){for(var d=[],p=!u&&l&&l.project,g=0;g<c.length;++g){var y=f(c[g],p);y&&d.push(y)}return d}function v(c){return{shape:{points:h(c)}}}n.removeAll(),A(e.geo.regions,function(c){var d=c.name,p=t.get(d),g=a.get(d)||{},y=g.dataIdx,m=g.regionModel;p||(p=t.set(d,new nt),n.add(p),y=s?s.indexOfName(d):null,m=e.isGeo?o.getRegionModel(d):s?s.getItemModel(y):null,a.set(d,{dataIdx:y,regionModel:m}));var _=[],S=[];A(c.geometries,function(b){if(b.type===\"polygon\"){var C=[b.exterior].concat(b.interiors||[]);u&&(C=dS(C,u)),A(C,function(D){_.push(new ze(v(D)))})}else{var T=b.points;u&&(T=dS(T,u,!0)),A(T,function(D){S.push(new Fe(v(D)))})}});var w=f(c.getCenter(),l&&l.project);function x(b,C){if(!!b.length){var T=new Hg({culling:!0,segmentIgnoreThreshold:1,shape:{paths:b}});p.add(T),uS(e,T,y,m),fS(e,T,d,m,o,y,w),C&&(lS(T),A(T.states,lS))}}x(_),x(S,!0)}),t.each(function(c,d){var p=a.get(d),g=p.dataIdx,y=p.regionModel;hS(e,c,d,y,o,g),vS(e,c,d,y,o),cS(e,c,d,y,o)},this)},r.prototype._buildSVG=function(e){var t=e.geo.map,a=e.transformInfoRaw;this._svgGroup.x=a.x,this._svgGroup.y=a.y,this._svgGroup.scaleX=a.scaleX,this._svgGroup.scaleY=a.scaleY,this._svgResourceChanged(t)&&(this._freeSVG(),this._useSVG(t));var n=this._svgDispatcherMap=q(),i=!1;A(this._svgGraphicRecord.named,function(o){var s=o.name,l=e.mapOrGeoModel,u=e.data,f=o.svgNodeTagLower,h=o.el,v=u?u.indexOfName(s):null,c=l.getRegionModel(s);if(Hz.get(f)!=null&&h instanceof fr&&uS(e,h,v,c),h instanceof fr&&(h.culling=!0),h.z2EmphasisLift=0,!o.namedFrom&&($z.get(f)!=null&&fS(e,h,s,c,l,v,null),hS(e,h,s,c,l,v),vS(e,h,s,c,l),Wz.get(f)!=null)){var d=cS(e,h,s,c,l);d===\"self\"&&(i=!0);var p=n.get(s)||n.set(s,[]);p.push(h)}},this),this._enableBlurEntireSVG(i,e)},r.prototype._enableBlurEntireSVG=function(e,t){if(e&&t.isGeo){var a=t.mapOrGeoModel.getModel([\"blur\",\"itemStyle\"]).getItemStyle(),n=a.opacity;this._svgGraphicRecord.root.traverse(function(i){if(!i.isGroup){gi(i);var o=i.ensureState(\"blur\").style||{};o.opacity==null&&n!=null&&(o.opacity=n),i.ensureState(\"emphasis\")}})}},r.prototype.remove=function(){this._regionsGroup.removeAll(),this._regionsGroupByName=null,this._svgGroup.removeAll(),this._freeSVG(),this._controller.dispose(),this._controllerHost=null},r.prototype.findHighDownDispatchers=function(e,t){if(e==null)return[];var a=t.coordinateSystem;if(a.resourceType===\"geoJSON\"){var n=this._regionsGroupByName;if(n){var i=n.get(e);return i?[i]:[]}}else if(a.resourceType===\"geoSVG\")return this._svgDispatcherMap&&this._svgDispatcherMap.get(e)||[]},r.prototype._svgResourceChanged=function(e){return this._svgMapName!==e},r.prototype._useSVG=function(e){var t=ba.getGeoResource(e);if(t&&t.type===\"geoSVG\"){var a=t.useGraphic(this.uid);this._svgGroup.add(a.root),this._svgGraphicRecord=a,this._svgMapName=e}},r.prototype._freeSVG=function(){var e=this._svgMapName;if(e!=null){var t=ba.getGeoResource(e);t&&t.type===\"geoSVG\"&&t.freeGraphic(this.uid),this._svgGraphicRecord=null,this._svgDispatcherMap=null,this._svgGroup.removeAll(),this._svgMapName=null}},r.prototype._updateController=function(e,t,a){var n=e.coordinateSystem,i=this._controller,o=this._controllerHost;o.zoomLimit=e.get(\"scaleLimit\"),o.zoom=n.getZoom(),i.enable(e.get(\"roam\")||!1);var s=e.mainType;function l(){var u={type:\"geoRoam\",componentType:s};return u[s+\"Id\"]=e.id,u}i.off(\"pan\").on(\"pan\",function(u){this._mouseDownFlag=!1,Ay(o,u.dx,u.dy),a.dispatchAction(V(l(),{dx:u.dx,dy:u.dy,animation:{duration:0}}))},this),i.off(\"zoom\").on(\"zoom\",function(u){this._mouseDownFlag=!1,Dy(o,u.scale,u.originX,u.originY),a.dispatchAction(V(l(),{zoom:u.scale,originX:u.originX,originY:u.originY,animation:{duration:0}}))},this),i.setPointerChecker(function(u,f,h){return n.containPoint([f,h])&&!$h(u,a,e)})},r.prototype.resetForLabelLayout=function(){this.group.traverse(function(e){var t=e.getTextContent();t&&(t.ignore=xD(t).ignore)})},r.prototype._updateMapSelectHandler=function(e,t,a,n){var i=this;t.off(\"mousedown\"),t.off(\"click\"),e.get(\"selectedMode\")&&(t.on(\"mousedown\",function(){i._mouseDownFlag=!0}),t.on(\"click\",function(o){!i._mouseDownFlag||(i._mouseDownFlag=!1)}))},r}();function uS(r,e,t,a){var n=a.getModel(\"itemStyle\"),i=a.getModel([\"emphasis\",\"itemStyle\"]),o=a.getModel([\"blur\",\"itemStyle\"]),s=a.getModel([\"select\",\"itemStyle\"]),l=Mu(n),u=Mu(i),f=Mu(s),h=Mu(o),v=r.data;if(v){var c=v.getItemVisual(t,\"style\"),d=v.getItemVisual(t,\"decal\");r.isVisualEncodedByVisualMap&&c.fill&&(l.fill=c.fill),d&&(l.decal=co(d,r.api))}e.setStyle(l),e.style.strokeNoScale=!0,e.ensureState(\"emphasis\").style=u,e.ensureState(\"select\").style=f,e.ensureState(\"blur\").style=h,gi(e)}function fS(r,e,t,a,n,i,o){var s=r.data,l=r.isGeo,u=s&&isNaN(s.get(s.mapDimension(\"value\"),i)),f=s&&s.getItemLayout(i);if(l||u||f&&f.showLabel){var h=l?t:i,v=void 0;(!s||i>=0)&&(v=n);var c=o?{normal:{align:\"center\",verticalAlign:\"middle\"}}:null;de(e,ie(a),{labelFetcher:v,labelDataIndex:h,defaultText:t},c);var d=e.getTextContent();if(d&&(xD(d).ignore=d.ignore,e.textConfig&&o)){var p=e.getBoundingRect().clone();e.textConfig.layoutRect=p,e.textConfig.position=[(o[0]-p.x)/p.width*100+\"%\",(o[1]-p.y)/p.height*100+\"%\"]}e.disableLabelAnimation=!0}else e.removeTextContent(),e.removeTextConfig(),e.disableLabelAnimation=null}function hS(r,e,t,a,n,i){r.data?r.data.setItemGraphicEl(i,e):it(e).eventData={componentType:\"geo\",componentIndex:n.componentIndex,geoIndex:n.componentIndex,name:t,region:a&&a.option||{}}}function vS(r,e,t,a,n){r.data||Do({el:e,componentModel:n,itemName:t,itemTooltipOption:a.get(\"tooltip\")})}function cS(r,e,t,a,n){e.highDownSilentOnTouch=!!n.get(\"selectedMode\");var i=a.getModel(\"emphasis\"),o=i.get(\"focus\");return $t(e,o,i.get(\"blurScope\"),i.get(\"disabled\")),r.isGeo&&B5(e,n,t),o}function dS(r,e,t){var a=[],n;function i(){n=[]}function o(){n.length&&(a.push(n),n=[])}var s=e({polygonStart:i,polygonEnd:o,lineStart:i,lineEnd:o,point:function(l,u){isFinite(l)&&isFinite(u)&&n.push([l,u])},sphere:function(){}});return!t&&s.polygonStart(),A(r,function(l){s.lineStart();for(var u=0;u<l.length;u++)s.point(l[u][0],l[u][1]);s.lineEnd()}),!t&&s.polygonEnd(),a}var wD=Uz,Yz=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n,i){if(!(i&&i.type===\"mapToggleSelect\"&&i.from===this.uid)){var o=this.group;if(o.removeAll(),!t.getHostGeoModel()){if(this._mapDraw&&i&&i.type===\"geoRoam\"&&this._mapDraw.resetForLabelLayout(),i&&i.type===\"geoRoam\"&&i.componentType===\"series\"&&i.seriesId===t.id){var s=this._mapDraw;s&&o.add(s.group)}else if(t.needsDrawMap){var s=this._mapDraw||new wD(n);o.add(s.group),s.draw(t,a,n,this,i),this._mapDraw=s}else this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null;t.get(\"showLegendSymbol\")&&a.getComponent(\"legend\")&&this._renderSymbols(t,a,n)}}},e.prototype.remove=function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null,this.group.removeAll()},e.prototype.dispose=function(){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null},e.prototype._renderSymbols=function(t,a,n){var i=t.originalData,o=this.group;i.each(i.mapDimension(\"value\"),function(s,l){if(!isNaN(s)){var u=i.getItemLayout(l);if(!(!u||!u.point)){var f=u.point,h=u.offset,v=new Qr({style:{fill:t.getData().getVisual(\"style\").fill},shape:{cx:f[0]+h*9,cy:f[1],r:3},silent:!0,z2:8+(h?0:To+1)});if(!h){var c=t.mainSeries.getData(),d=i.getName(l),p=c.indexOfName(d),g=i.getItemModel(l),y=g.getModel(\"label\"),m=c.getItemGraphicEl(p);de(v,ie(g),{labelFetcher:{getFormattedLabel:function(_,S){return t.getFormattedLabel(p,S)}},defaultText:d}),v.disableLabelAnimation=!0,y.get(\"position\")||v.setTextConfig({position:\"bottom\"}),m.onHoverStateChange=function(_){Af(v,_)}}o.add(v)}}})},e.type=\"map\",e}(zt),Zz=Yz,Xz=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.needsDrawMap=!1,t.seriesGroup=[],t.getTooltipPosition=function(a){if(a!=null){var n=this.getData().getName(a),i=this.coordinateSystem,o=i.getRegion(n);return o&&i.dataToPoint(o.getCenter())}},t}return e.prototype.getInitialData=function(t){for(var a=No(this,{coordDimensions:[\"value\"],encodeDefaulter:ot(Jg,this)}),n=q(),i=[],o=0,s=a.count();o<s;o++){var l=a.getName(o);n.set(l,!0)}var u=ba.load(this.getMapType(),this.option.nameMap,this.option.nameProperty);return A(u.regions,function(f){var h=f.name;n.get(h)||i.push(h)}),a.appendValues([],i),a},e.prototype.getHostGeoModel=function(){var t=this.option.geoIndex;return t!=null?this.ecModel.getComponent(\"geo\",t):null},e.prototype.getMapType=function(){return(this.getHostGeoModel()||this).option.map},e.prototype.getRawValue=function(t){var a=this.getData();return a.get(a.mapDimension(\"value\"),t)},e.prototype.getRegionModel=function(t){var a=this.getData();return a.getItemModel(a.indexOfName(t))},e.prototype.formatTooltip=function(t,a,n){for(var i=this.getData(),o=this.getRawValue(t),s=i.getName(t),l=this.seriesGroup,u=[],f=0;f<l.length;f++){var h=l[f].originalData.indexOfName(s),v=i.mapDimension(\"value\");isNaN(l[f].originalData.get(v,h))||u.push(l[f].name)}return oe(\"section\",{header:u.join(\", \"),noHeader:!u.length,blocks:[oe(\"nameValue\",{name:s,value:o})]})},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.getLegendIcon=function(t){var a=t.icon||\"roundRect\",n=jt(a,0,0,t.itemWidth,t.itemHeight,t.itemStyle.fill);return n.setStyle(t.itemStyle),n.style.stroke=\"none\",a.indexOf(\"empty\")>-1&&(n.style.stroke=n.style.fill,n.style.fill=\"#fff\",n.style.lineWidth=2),n},e.type=\"series.map\",e.dependencies=[\"geo\"],e.layoutMode=\"box\",e.defaultOption={z:2,coordinateSystem:\"geo\",map:\"\",left:\"center\",top:\"center\",aspectScale:null,showLegendSymbol:!0,boundingCoords:null,center:null,zoom:1,scaleLimit:null,selectedMode:!0,label:{show:!1,color:\"#000\"},itemStyle:{borderWidth:.5,borderColor:\"#444\",areaColor:\"#eee\"},emphasis:{label:{show:!0,color:\"rgb(100,0,0)\"},itemStyle:{areaColor:\"rgba(255,215,0,0.8)\"}},select:{label:{show:!0,color:\"rgb(100,0,0)\"},itemStyle:{color:\"rgba(255,215,0,0.8)\"}},nameProperty:\"name\"},e}(Ht),qz=Xz;function Kz(r,e){var t={};return A(r,function(a){a.each(a.mapDimension(\"value\"),function(n,i){var o=\"ec-\"+a.getName(i);t[o]=t[o]||[],isNaN(n)||t[o].push(n)})}),r[0].map(r[0].mapDimension(\"value\"),function(a,n){for(var i=\"ec-\"+r[0].getName(n),o=0,s=1/0,l=-1/0,u=t[i].length,f=0;f<u;f++)s=Math.min(s,t[i][f]),l=Math.max(l,t[i][f]),o+=t[i][f];var h;return e===\"min\"?h=s:e===\"max\"?h=l:e===\"average\"?h=o/u:h=o,u===0?NaN:h})}function Jz(r){var e={};r.eachSeriesByType(\"map\",function(t){var a=t.getHostGeoModel(),n=a?\"o\"+a.id:\"i\"+t.getMapType();(e[n]=e[n]||[]).push(t)}),A(e,function(t,a){for(var n=Kz(G(t,function(o){return o.getData()}),t[0].get(\"mapValueCalculation\")),i=0;i<t.length;i++)t[i].originalData=t[i].getData();for(var i=0;i<t.length;i++)t[i].seriesGroup=t,t[i].needsDrawMap=i===0&&!t[i].getHostGeoModel(),t[i].setData(n.cloneShallow()),t[i].mainSeries=t[0]})}function Qz(r){var e={};r.eachSeriesByType(\"map\",function(t){var a=t.getMapType();if(!(t.getHostGeoModel()||e[a])){var n={};A(t.seriesGroup,function(o){var s=o.coordinateSystem,l=o.originalData;o.get(\"showLegendSymbol\")&&r.getComponent(\"legend\")&&l.each(l.mapDimension(\"value\"),function(u,f){var h=l.getName(f),v=s.getRegion(h);if(!(!v||isNaN(u))){var c=n[h]||0,d=s.dataToPoint(v.getCenter());n[h]=c+1,l.setItemLayout(f,{point:d,offset:c})}})});var i=t.getData();i.each(function(o){var s=i.getName(o),l=i.getItemLayout(o)||{};l.showLabel=!n[s],i.setItemLayout(o,l)}),e[a]=!0}})}var pS=he,jz=function(r){k(e,r);function e(t){var a=r.call(this)||this;return a.type=\"view\",a.dimensions=[\"x\",\"y\"],a._roamTransformable=new la,a._rawTransformable=new la,a.name=t,a}return e.prototype.setBoundingRect=function(t,a,n,i){return this._rect=new vt(t,a,n,i),this._rect},e.prototype.getBoundingRect=function(){return this._rect},e.prototype.setViewRect=function(t,a,n,i){this._transformTo(t,a,n,i),this._viewRect=new vt(t,a,n,i)},e.prototype._transformTo=function(t,a,n,i){var o=this.getBoundingRect(),s=this._rawTransformable;s.transform=o.calculateTransform(new vt(t,a,n,i));var l=s.parent;s.parent=null,s.decomposeTransform(),s.parent=l,this._updateTransform()},e.prototype.setCenter=function(t,a){!t||(this._center=[W(t[0],a.getWidth()),W(t[1],a.getHeight())],this._updateCenterAndZoom())},e.prototype.setZoom=function(t){t=t||1;var a=this.zoomLimit;a&&(a.max!=null&&(t=Math.min(a.max,t)),a.min!=null&&(t=Math.max(a.min,t))),this._zoom=t,this._updateCenterAndZoom()},e.prototype.getDefaultCenter=function(){var t=this.getBoundingRect(),a=t.x+t.width/2,n=t.y+t.height/2;return[a,n]},e.prototype.getCenter=function(){return this._center||this.getDefaultCenter()},e.prototype.getZoom=function(){return this._zoom||1},e.prototype.getRoamTransform=function(){return this._roamTransformable.getLocalTransform()},e.prototype._updateCenterAndZoom=function(){var t=this._rawTransformable.getLocalTransform(),a=this._roamTransformable,n=this.getDefaultCenter(),i=this.getCenter(),o=this.getZoom();i=he([],i,t),n=he([],n,t),a.originX=i[0],a.originY=i[1],a.x=n[0]-i[0],a.y=n[1]-i[1],a.scaleX=a.scaleY=o,this._updateTransform()},e.prototype._updateTransform=function(){var t=this._roamTransformable,a=this._rawTransformable;a.parent=t,t.updateTransform(),a.updateTransform(),bg(this.transform||(this.transform=[]),a.transform||ur()),this._rawTransform=a.getLocalTransform(),this.invTransform=this.invTransform||[],bo(this.invTransform,this.transform),this.decomposeTransform()},e.prototype.getTransformInfo=function(){var t=this._rawTransformable,a=this._roamTransformable,n=new la;return n.transform=a.transform,n.decomposeTransform(),{roam:{x:n.x,y:n.y,scaleX:n.scaleX,scaleY:n.scaleY},raw:{x:t.x,y:t.y,scaleX:t.scaleX,scaleY:t.scaleY}}},e.prototype.getViewRect=function(){return this._viewRect},e.prototype.getViewRectAfterRoam=function(){var t=this.getBoundingRect().clone();return t.applyTransform(this.transform),t},e.prototype.dataToPoint=function(t,a,n){var i=a?this._rawTransform:this.transform;return n=n||[],i?pS(n,t,i):Ce(n,t)},e.prototype.pointToData=function(t){var a=this.invTransform;return a?pS([],t,a):[t[0],t[1]]},e.prototype.convertToPixel=function(t,a,n){var i=gS(a);return i===this?i.dataToPoint(n):null},e.prototype.convertFromPixel=function(t,a,n){var i=gS(a);return i===this?i.pointToData(n):null},e.prototype.containPoint=function(t){return this.getViewRectAfterRoam().contain(t[0],t[1])},e.dimensions=[\"x\",\"y\"],e}(la);function gS(r){var e=r.seriesModel;return e?e.coordinateSystem:null}var zl=jz,t7={geoJSON:{aspectScale:.75,invertLongitute:!0},geoSVG:{aspectScale:1,invertLongitute:!1}},bD=[\"lng\",\"lat\"],CD=function(r){k(e,r);function e(t,a,n){var i=r.call(this,t)||this;i.dimensions=bD,i.type=\"geo\",i._nameCoordMap=q(),i.map=a;var o=n.projection,s=ba.load(a,n.nameMap,n.nameProperty),l=ba.getGeoResource(a);i.resourceType=l?l.type:null;var u=i.regions=s.regions,f=t7[l.type];i._regionsMap=s.regionsMap,i.regions=s.regions,i.projection=o;var h;if(o)for(var v=0;v<u.length;v++){var c=u[v].getBoundingRect(o);h=h||c.clone(),h.union(c)}else h=s.boundingRect;return i.setBoundingRect(h.x,h.y,h.width,h.height),i.aspectScale=o?1:ft(n.aspectScale,f.aspectScale),i._invertLongitute=o?!1:f.invertLongitute,i}return e.prototype._transformTo=function(t,a,n,i){var o=this.getBoundingRect(),s=this._invertLongitute;o=o.clone(),s&&(o.y=-o.y-o.height);var l=this._rawTransformable;l.transform=o.calculateTransform(new vt(t,a,n,i));var u=l.parent;l.parent=null,l.decomposeTransform(),l.parent=u,s&&(l.scaleY=-l.scaleY),this._updateTransform()},e.prototype.getRegion=function(t){return this._regionsMap.get(t)},e.prototype.getRegionByCoord=function(t){for(var a=this.regions,n=0;n<a.length;n++){var i=a[n];if(i.type===\"geoJSON\"&&i.contain(t))return a[n]}},e.prototype.addGeoCoord=function(t,a){this._nameCoordMap.set(t,a)},e.prototype.getGeoCoord=function(t){var a=this._regionsMap.get(t);return this._nameCoordMap.get(t)||a&&a.getCenter()},e.prototype.dataToPoint=function(t,a,n){if(U(t)&&(t=this.getGeoCoord(t)),t){var i=this.projection;return i&&(t=i.project(t)),t&&this.projectedToPoint(t,a,n)}},e.prototype.pointToData=function(t){var a=this.projection;return a&&(t=a.unproject(t)),t&&this.pointToProjected(t)},e.prototype.pointToProjected=function(t){return r.prototype.pointToData.call(this,t)},e.prototype.projectedToPoint=function(t,a,n){return r.prototype.dataToPoint.call(this,t,a,n)},e.prototype.convertToPixel=function(t,a,n){var i=yS(a);return i===this?i.dataToPoint(n):null},e.prototype.convertFromPixel=function(t,a,n){var i=yS(a);return i===this?i.pointToData(n):null},e}(zl);te(CD,zl);function yS(r){var e=r.geoModel,t=r.seriesModel;return e?e.coordinateSystem:t?t.coordinateSystem||(t.getReferringComponents(\"geo\",Qt).models[0]||{}).coordinateSystem:null}var mS=CD;function _S(r,e){var t=r.get(\"boundingCoords\");if(t!=null){var a=t[0],n=t[1];if(isFinite(a[0])&&isFinite(a[1])&&isFinite(n[0])&&isFinite(n[1])){var i=this.projection;if(i){var o=a[0],s=a[1],l=n[0],u=n[1];a=[1/0,1/0],n=[-1/0,-1/0];var f=function(x,b,C,T){for(var D=C-x,M=T-b,L=0;L<=100;L++){var I=L/100,P=i.project([x+D*I,b+M*I]);Ha(a,a,P),Wa(n,n,P)}};f(o,s,l,s),f(l,s,l,u),f(l,u,o,u),f(o,u,l,s)}this.setBoundingRect(a[0],a[1],n[0]-a[0],n[1]-a[1])}}var h=this.getBoundingRect(),v=r.get(\"layoutCenter\"),c=r.get(\"layoutSize\"),d=e.getWidth(),p=e.getHeight(),g=h.width/h.height*this.aspectScale,y=!1,m,_;v&&c&&(m=[W(v[0],d),W(v[1],p)],_=W(c,Math.min(d,p)),!isNaN(m[0])&&!isNaN(m[1])&&!isNaN(_)&&(y=!0));var S;if(y)S={},g>1?(S.width=_,S.height=_/g):(S.height=_,S.width=_*g),S.y=m[1]-S.height/2,S.x=m[0]-S.width/2;else{var w=r.getBoxLayoutParams();w.aspect=g,S=re(w,{width:d,height:p})}this.setViewRect(S.x,S.y,S.width,S.height),this.setCenter(r.get(\"center\"),e),this.setZoom(r.get(\"zoom\"))}function e7(r,e){A(e.get(\"geoCoord\"),function(t,a){r.addGeoCoord(a,t)})}var r7=function(){function r(){this.dimensions=bD}return r.prototype.create=function(e,t){var a=[];function n(o){return{nameProperty:o.get(\"nameProperty\"),aspectScale:o.get(\"aspectScale\"),projection:o.get(\"projection\")}}e.eachComponent(\"geo\",function(o,s){var l=o.get(\"map\"),u=new mS(l+s,l,V({nameMap:o.get(\"nameMap\")},n(o)));u.zoomLimit=o.get(\"scaleLimit\"),a.push(u),o.coordinateSystem=u,u.model=o,u.resize=_S,u.resize(o,t)}),e.eachSeries(function(o){var s=o.get(\"coordinateSystem\");if(s===\"geo\"){var l=o.get(\"geoIndex\")||0;o.coordinateSystem=a[l]}});var i={};return e.eachSeriesByType(\"map\",function(o){if(!o.getHostGeoModel()){var s=o.getMapType();i[s]=i[s]||[],i[s].push(o)}}),A(i,function(o,s){var l=G(o,function(f){return f.get(\"nameMap\")}),u=new mS(s,s,V({nameMap:_g(l)},n(o[0])));u.zoomLimit=le.apply(null,G(o,function(f){return f.get(\"scaleLimit\")})),a.push(u),u.resize=_S,u.resize(o[0],t),A(o,function(f){f.coordinateSystem=u,e7(u,f)})}),a},r.prototype.getFilledRegions=function(e,t,a,n){for(var i=(e||[]).slice(),o=q(),s=0;s<i.length;s++)o.set(i[s].name,i[s]);var l=ba.load(t,a,n);return A(l.regions,function(u){var f=u.name;!o.get(f)&&i.push({name:f})}),i},r}(),a7=new r7,TD=a7,n7=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.init=function(t,a,n){var i=ba.getGeoResource(t.map);if(i&&i.type===\"geoJSON\"){var o=t.itemStyle=t.itemStyle||{};\"color\"in o||(o.color=\"#eee\")}this.mergeDefaultAndTheme(t,n),ci(t,\"label\",[\"show\"])},e.prototype.optionUpdated=function(){var t=this,a=this.option;a.regions=TD.getFilledRegions(a.regions,a.map,a.nameMap,a.nameProperty);var n={};this._optionModelMap=Zr(a.regions||[],function(i,o){var s=o.name;return s&&(i.set(s,new Vt(o,t,t.ecModel)),o.selected&&(n[s]=!0)),i},q()),a.selectedMap||(a.selectedMap=n)},e.prototype.getRegionModel=function(t){return this._optionModelMap.get(t)||new Vt(null,this,this.ecModel)},e.prototype.getFormattedLabel=function(t,a){var n=this.getRegionModel(t),i=a===\"normal\"?n.get([\"label\",\"formatter\"]):n.get([\"emphasis\",\"label\",\"formatter\"]),o={name:t};if(J(i))return o.status=a,i(o);if(U(i))return i.replace(\"{a}\",t!=null?t:\"\")},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.select=function(t){var a=this.option,n=a.selectedMode;if(!!n){n!==\"multiple\"&&(a.selectedMap=null);var i=a.selectedMap||(a.selectedMap={});i[t]=!0}},e.prototype.unSelect=function(t){var a=this.option.selectedMap;a&&(a[t]=!1)},e.prototype.toggleSelected=function(t){this[this.isSelected(t)?\"unSelect\":\"select\"](t)},e.prototype.isSelected=function(t){var a=this.option.selectedMap;return!!(a&&a[t])},e.type=\"geo\",e.layoutMode=\"box\",e.defaultOption={z:0,show:!0,left:\"center\",top:\"center\",aspectScale:null,silent:!1,map:\"\",boundingCoords:null,center:null,zoom:1,scaleLimit:null,label:{show:!1,color:\"#000\"},itemStyle:{borderWidth:.5,borderColor:\"#444\"},emphasis:{label:{show:!0,color:\"rgb(100,0,0)\"},itemStyle:{color:\"rgba(255,215,0,0.8)\"}},select:{label:{show:!0,color:\"rgb(100,0,0)\"},itemStyle:{color:\"rgba(255,215,0,0.8)\"}},regions:[]},e}(Tt),i7=n7;function SS(r,e){return r.pointToProjected?r.pointToProjected(e):r.pointToData(e)}function Ly(r,e,t,a){var n=r.getZoom(),i=r.getCenter(),o=e.zoom,s=r.projectedToPoint?r.projectedToPoint(i):r.dataToPoint(i);if(e.dx!=null&&e.dy!=null&&(s[0]-=e.dx,s[1]-=e.dy,r.setCenter(SS(r,s),a)),o!=null){if(t){var l=t.min||0,u=t.max||1/0;o=Math.max(Math.min(n*o,u),l)/n}r.scaleX*=o,r.scaleY*=o;var f=(e.originX-r.x)*(o-1),h=(e.originY-r.y)*(o-1);r.x-=f,r.y-=h,r.updateTransform(),r.setCenter(SS(r,s),a),r.setZoom(o*n)}return{center:r.getCenter(),zoom:r.getZoom()}}var o7=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.focusBlurEnabled=!0,t}return e.prototype.init=function(t,a){this._api=a},e.prototype.render=function(t,a,n,i){if(this._model=t,!t.get(\"show\")){this._mapDraw&&this._mapDraw.remove(),this._mapDraw=null;return}this._mapDraw||(this._mapDraw=new wD(n));var o=this._mapDraw;o.draw(t,a,n,this,i),o.group.on(\"click\",this._handleRegionClick,this),o.group.silent=t.get(\"silent\"),this.group.add(o.group),this.updateSelectStatus(t,a,n)},e.prototype._handleRegionClick=function(t){var a;jn(t.target,function(n){return(a=it(n).eventData)!=null},!0),a&&this._api.dispatchAction({type:\"geoToggleSelect\",geoId:this._model.id,name:a.name})},e.prototype.updateSelectStatus=function(t,a,n){var i=this;this._mapDraw.group.traverse(function(o){var s=it(o).eventData;if(s)return i._model.isSelected(s.name)?n.enterSelect(o):n.leaveSelect(o),!0})},e.prototype.findHighDownDispatchers=function(t){return this._mapDraw&&this._mapDraw.findHighDownDispatchers(t,this._model)},e.prototype.dispose=function(){this._mapDraw&&this._mapDraw.remove()},e.type=\"geo\",e}(Ut),s7=o7;function l7(r,e,t){ba.registerMap(r,e,t)}function AD(r){r.registerCoordinateSystem(\"geo\",TD),r.registerComponentModel(i7),r.registerComponentView(s7),r.registerImpl(\"registerMap\",l7),r.registerImpl(\"getMap\",function(t){return ba.getMapForUser(t)});function e(t,a){a.update=\"geo:updateSelectStatus\",r.registerAction(a,function(n,i){var o={},s=[];return i.eachComponent({mainType:\"geo\",query:n},function(l){l[t](n.name);var u=l.coordinateSystem;A(u.regions,function(h){o[h.name]=l.isSelected(h.name)||!1});var f=[];A(o,function(h,v){o[v]&&f.push(v)}),s.push({geoIndex:l.componentIndex,name:f})}),{selected:o,allSelected:s,name:n.name}})}e(\"toggleSelected\",{type:\"geoToggleSelect\",event:\"geoselectchanged\"}),e(\"select\",{type:\"geoSelect\",event:\"geoselected\"}),e(\"unSelect\",{type:\"geoUnSelect\",event:\"geounselected\"}),r.registerAction({type:\"geoRoam\",event:\"geoRoam\",update:\"updateTransform\"},function(t,a,n){var i=t.componentType||\"series\";a.eachComponent({mainType:i,query:t},function(o){var s=o.coordinateSystem;if(s.type===\"geo\"){var l=Ly(s,t,o.get(\"scaleLimit\"),n);o.setCenter&&o.setCenter(l.center),o.setZoom&&o.setZoom(l.zoom),i===\"series\"&&A(o.seriesGroup,function(u){u.setCenter(l.center),u.setZoom(l.zoom)})}})})}function u7(r){ct(AD),r.registerChartView(Zz),r.registerSeriesModel(qz),r.registerLayout(Qz),r.registerProcessor(r.PRIORITY.PROCESSOR.STATISTIC,Jz),NT(\"map\",r.registerAction)}function f7(r){var e=r;e.hierNode={defaultAncestor:null,ancestor:e,prelim:0,modifier:0,change:0,shift:0,i:0,thread:null};for(var t=[e],a,n;a=t.pop();)if(n=a.children,a.isExpand&&n.length)for(var i=n.length,o=i-1;o>=0;o--){var s=n[o];s.hierNode={defaultAncestor:null,ancestor:s,prelim:0,modifier:0,change:0,shift:0,i:o,thread:null},t.push(s)}}function h7(r,e){var t=r.isExpand?r.children:[],a=r.parentNode.children,n=r.hierNode.i?a[r.hierNode.i-1]:null;if(t.length){d7(r);var i=(t[0].hierNode.prelim+t[t.length-1].hierNode.prelim)/2;n?(r.hierNode.prelim=n.hierNode.prelim+e(r,n),r.hierNode.modifier=r.hierNode.prelim-i):r.hierNode.prelim=i}else n&&(r.hierNode.prelim=n.hierNode.prelim+e(r,n));r.parentNode.hierNode.defaultAncestor=p7(r,n,r.parentNode.hierNode.defaultAncestor||a[0],e)}function v7(r){var e=r.hierNode.prelim+r.parentNode.hierNode.modifier;r.setLayout({x:e},!0),r.hierNode.modifier+=r.parentNode.hierNode.modifier}function xS(r){return arguments.length?r:m7}function Ss(r,e){return r-=Math.PI/2,{x:e*Math.cos(r),y:e*Math.sin(r)}}function c7(r,e){return re(r.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function d7(r){for(var e=r.children,t=e.length,a=0,n=0;--t>=0;){var i=e[t];i.hierNode.prelim+=a,i.hierNode.modifier+=a,n+=i.hierNode.change,a+=i.hierNode.shift+n}}function p7(r,e,t,a){if(e){for(var n=r,i=r,o=i.parentNode.children[0],s=e,l=n.hierNode.modifier,u=i.hierNode.modifier,f=o.hierNode.modifier,h=s.hierNode.modifier;s=Sc(s),i=xc(i),s&&i;){n=Sc(n),o=xc(o),n.hierNode.ancestor=r;var v=s.hierNode.prelim+h-i.hierNode.prelim-u+a(s,i);v>0&&(y7(g7(s,r,t),r,v),u+=v,l+=v),h+=s.hierNode.modifier,u+=i.hierNode.modifier,l+=n.hierNode.modifier,f+=o.hierNode.modifier}s&&!Sc(n)&&(n.hierNode.thread=s,n.hierNode.modifier+=h-l),i&&!xc(o)&&(o.hierNode.thread=i,o.hierNode.modifier+=u-f,t=r)}return t}function Sc(r){var e=r.children;return e.length&&r.isExpand?e[e.length-1]:r.hierNode.thread}function xc(r){var e=r.children;return e.length&&r.isExpand?e[0]:r.hierNode.thread}function g7(r,e,t){return r.hierNode.ancestor.parentNode===e.parentNode?r.hierNode.ancestor:t}function y7(r,e,t){var a=t/(e.hierNode.i-r.hierNode.i);e.hierNode.change-=a,e.hierNode.shift+=t,e.hierNode.modifier+=t,e.hierNode.prelim+=t,r.hierNode.change+=a}function m7(r,e){return r.parentNode===e.parentNode?1:2}var _7=function(){function r(){this.parentPoint=[],this.childPoints=[]}return r}(),S7=function(r){k(e,r);function e(t){return r.call(this,t)||this}return e.prototype.getDefaultStyle=function(){return{stroke:\"#000\",fill:null}},e.prototype.getDefaultShape=function(){return new _7},e.prototype.buildPath=function(t,a){var n=a.childPoints,i=n.length,o=a.parentPoint,s=n[0],l=n[i-1];if(i===1){t.moveTo(o[0],o[1]),t.lineTo(s[0],s[1]);return}var u=a.orient,f=u===\"TB\"||u===\"BT\"?0:1,h=1-f,v=W(a.forkPosition,1),c=[];c[f]=o[f],c[h]=o[h]+(l[h]-o[h])*v,t.moveTo(o[0],o[1]),t.lineTo(c[0],c[1]),t.moveTo(s[0],s[1]),c[f]=s[f],t.lineTo(c[0],c[1]),c[f]=l[f],t.lineTo(c[0],c[1]),t.lineTo(l[0],l[1]);for(var d=1;d<i-1;d++){var p=n[d];t.moveTo(p[0],p[1]),c[f]=p[f],t.lineTo(c[0],c[1])}},e}(mt),x7=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t._mainGroup=new nt,t}return e.prototype.init=function(t,a){this._controller=new Vl(a.getZr()),this._controllerHost={target:this.group},this.group.add(this._mainGroup)},e.prototype.render=function(t,a,n){var i=t.getData(),o=t.layoutInfo,s=this._mainGroup,l=t.get(\"layout\");l===\"radial\"?(s.x=o.x+o.width/2,s.y=o.y+o.height/2):(s.x=o.x,s.y=o.y),this._updateViewCoordSys(t,n),this._updateController(t,a,n);var u=this._data;i.diff(u).add(function(f){wS(i,f)&&bS(i,f,null,s,t)}).update(function(f,h){var v=u.getItemGraphicEl(h);if(!wS(i,f)){v&&TS(u,h,v,s,t);return}bS(i,f,v,s,t)}).remove(function(f){var h=u.getItemGraphicEl(f);h&&TS(u,f,h,s,t)}).execute(),this._nodeScaleRatio=t.get(\"nodeScaleRatio\"),this._updateNodeAndLinkScale(t),t.get(\"expandAndCollapse\")===!0&&i.eachItemGraphicEl(function(f,h){f.off(\"click\").on(\"click\",function(){n.dispatchAction({type:\"treeExpandAndCollapse\",seriesId:t.id,dataIndex:h})})}),this._data=i},e.prototype._updateViewCoordSys=function(t,a){var n=t.getData(),i=[];n.each(function(h){var v=n.getItemLayout(h);v&&!isNaN(v.x)&&!isNaN(v.y)&&i.push([+v.x,+v.y])});var o=[],s=[];xh(i,o,s);var l=this._min,u=this._max;s[0]-o[0]===0&&(o[0]=l?l[0]:o[0]-1,s[0]=u?u[0]:s[0]+1),s[1]-o[1]===0&&(o[1]=l?l[1]:o[1]-1,s[1]=u?u[1]:s[1]+1);var f=t.coordinateSystem=new zl;f.zoomLimit=t.get(\"scaleLimit\"),f.setBoundingRect(o[0],o[1],s[0]-o[0],s[1]-o[1]),f.setCenter(t.get(\"center\"),a),f.setZoom(t.get(\"zoom\")),this.group.attr({x:f.x,y:f.y,scaleX:f.scaleX,scaleY:f.scaleY}),this._min=o,this._max=s},e.prototype._updateController=function(t,a,n){var i=this,o=this._controller,s=this._controllerHost,l=this.group;o.setPointerChecker(function(u,f,h){var v=l.getBoundingRect();return v.applyTransform(l.transform),v.contain(f,h)&&!$h(u,n,t)}),o.enable(t.get(\"roam\")),s.zoomLimit=t.get(\"scaleLimit\"),s.zoom=t.coordinateSystem.getZoom(),o.off(\"pan\").off(\"zoom\").on(\"pan\",function(u){Ay(s,u.dx,u.dy),n.dispatchAction({seriesId:t.id,type:\"treeRoam\",dx:u.dx,dy:u.dy})}).on(\"zoom\",function(u){Dy(s,u.scale,u.originX,u.originY),n.dispatchAction({seriesId:t.id,type:\"treeRoam\",zoom:u.scale,originX:u.originX,originY:u.originY}),i._updateNodeAndLinkScale(t),n.updateLabelLayout()})},e.prototype._updateNodeAndLinkScale=function(t){var a=t.getData(),n=this._getNodeGlobalScale(t);a.eachItemGraphicEl(function(i,o){i.setSymbolScale(n)})},e.prototype._getNodeGlobalScale=function(t){var a=t.coordinateSystem;if(a.type!==\"view\")return 1;var n=this._nodeScaleRatio,i=a.scaleX||1,o=a.getZoom(),s=(o-1)*n+1;return s/i},e.prototype.dispose=function(){this._controller&&this._controller.dispose(),this._controllerHost=null},e.prototype.remove=function(){this._mainGroup.removeAll(),this._data=null},e.type=\"tree\",e}(zt);function wS(r,e){var t=r.getItemLayout(e);return t&&!isNaN(t.x)&&!isNaN(t.y)}function bS(r,e,t,a,n){var i=!t,o=r.tree.getNodeByDataIndex(e),s=o.getModel(),l=o.getVisual(\"style\").fill,u=o.isExpand===!1&&o.children.length!==0?l:\"#fff\",f=r.tree.root,h=o.parentNode===f?o:o.parentNode||o,v=r.getItemGraphicEl(h.dataIndex),c=h.getLayout(),d=v?{x:v.__oldX,y:v.__oldY,rawX:v.__radialOldRawX,rawY:v.__radialOldRawY}:c,p=o.getLayout();i?(t=new El(r,e,null,{symbolInnerColor:u,useNameLabel:!0}),t.x=d.x,t.y=d.y):t.updateData(r,e,null,{symbolInnerColor:u,useNameLabel:!0}),t.__radialOldRawX=t.__radialRawX,t.__radialOldRawY=t.__radialRawY,t.__radialRawX=p.rawX,t.__radialRawY=p.rawY,a.add(t),r.setItemGraphicEl(e,t),t.__oldX=t.x,t.__oldY=t.y,Lt(t,{x:p.x,y:p.y},n);var g=t.getSymbolPath();if(n.get(\"layout\")===\"radial\"){var y=f.children[0],m=y.getLayout(),_=y.children.length,S=void 0,w=void 0;if(p.x===m.x&&o.isExpand===!0&&y.children.length){var x={x:(y.children[0].getLayout().x+y.children[_-1].getLayout().x)/2,y:(y.children[0].getLayout().y+y.children[_-1].getLayout().y)/2};S=Math.atan2(x.y-m.y,x.x-m.x),S<0&&(S=Math.PI*2+S),w=x.x<m.x,w&&(S=S-Math.PI)}else S=Math.atan2(p.y-m.y,p.x-m.x),S<0&&(S=Math.PI*2+S),o.children.length===0||o.children.length!==0&&o.isExpand===!1?(w=p.x<m.x,w&&(S=S-Math.PI)):(w=p.x>m.x,w||(S=S-Math.PI));var b=w?\"left\":\"right\",C=s.getModel(\"label\"),T=C.get(\"rotate\"),D=T*(Math.PI/180),M=g.getTextContent();M&&(g.setTextConfig({position:C.get(\"position\")||b,rotation:T==null?-S:D,origin:\"center\"}),M.setStyle(\"verticalAlign\",\"middle\"))}var L=s.get([\"emphasis\",\"focus\"]),I=L===\"relative\"?gf(o.getAncestorsIndices(),o.getDescendantIndices()):L===\"ancestor\"?o.getAncestorsIndices():L===\"descendant\"?o.getDescendantIndices():null;I&&(it(t).focus=I),w7(n,o,f,t,d,c,p,a),t.__edge&&(t.onHoverStateChange=function(P){if(P!==\"blur\"){var R=o.parentNode&&r.getItemGraphicEl(o.parentNode.dataIndex);R&&R.hoverState===bl||Af(t.__edge,P)}})}function w7(r,e,t,a,n,i,o,s){var l=e.getModel(),u=r.get(\"edgeShape\"),f=r.get(\"layout\"),h=r.getOrient(),v=r.get([\"lineStyle\",\"curveness\"]),c=r.get(\"edgeForkPosition\"),d=l.getModel(\"lineStyle\").getLineStyle(),p=a.__edge;if(u===\"curve\")e.parentNode&&e.parentNode!==t&&(p||(p=a.__edge=new Th({shape:Pp(f,h,v,n,n)})),Lt(p,{shape:Pp(f,h,v,i,o)},r));else if(u===\"polyline\"&&f===\"orthogonal\"&&e!==t&&e.children&&e.children.length!==0&&e.isExpand===!0){for(var g=e.children,y=[],m=0;m<g.length;m++){var _=g[m].getLayout();y.push([_.x,_.y])}p||(p=a.__edge=new S7({shape:{parentPoint:[o.x,o.y],childPoints:[[o.x,o.y]],orient:h,forkPosition:c}})),Lt(p,{shape:{parentPoint:[o.x,o.y],childPoints:y}},r)}p&&!(u===\"polyline\"&&!e.isExpand)&&(p.useStyle(tt({strokeNoScale:!0,fill:null},d)),ce(p,l,\"lineStyle\"),gi(p),s.add(p))}function CS(r,e,t,a,n){var i=e.tree.root,o=DD(i,r),s=o.source,l=o.sourceLayout,u=e.getItemGraphicEl(r.dataIndex);if(!!u){var f=e.getItemGraphicEl(s.dataIndex),h=f.__edge,v=u.__edge||(s.isExpand===!1||s.children.length===1?h:void 0),c=a.get(\"edgeShape\"),d=a.get(\"layout\"),p=a.get(\"orient\"),g=a.get([\"lineStyle\",\"curveness\"]);v&&(c===\"curve\"?rn(v,{shape:Pp(d,p,g,l,l),style:{opacity:0}},a,{cb:function(){t.remove(v)},removeOpt:n}):c===\"polyline\"&&a.get(\"layout\")===\"orthogonal\"&&rn(v,{shape:{parentPoint:[l.x,l.y],childPoints:[[l.x,l.y]]},style:{opacity:0}},a,{cb:function(){t.remove(v)},removeOpt:n}))}}function DD(r,e){for(var t=e.parentNode===r?e:e.parentNode||e,a;a=t.getLayout(),a==null;)t=t.parentNode===r?t:t.parentNode||t;return{source:t,sourceLayout:a}}function TS(r,e,t,a,n){var i=r.tree.getNodeByDataIndex(e),o=r.tree.root,s=DD(o,i).sourceLayout,l={duration:n.get(\"animationDurationUpdate\"),easing:n.get(\"animationEasingUpdate\")};rn(t,{x:s.x+1,y:s.y+1},n,{cb:function(){a.remove(t),r.setItemGraphicEl(e,null)},removeOpt:l}),t.fadeOut(null,r.hostModel,{fadeLabel:!0,animation:l}),i.children.forEach(function(u){CS(u,r,a,n,l)}),CS(i,r,a,n,l)}function Pp(r,e,t,a,n){var i,o,s,l,u,f,h,v;if(r===\"radial\"){u=a.rawX,h=a.rawY,f=n.rawX,v=n.rawY;var c=Ss(u,h),d=Ss(u,h+(v-h)*t),p=Ss(f,v+(h-v)*t),g=Ss(f,v);return{x1:c.x||0,y1:c.y||0,x2:g.x||0,y2:g.y||0,cpx1:d.x||0,cpy1:d.y||0,cpx2:p.x||0,cpy2:p.y||0}}else u=a.x,h=a.y,f=n.x,v=n.y,(e===\"LR\"||e===\"RL\")&&(i=u+(f-u)*t,o=h,s=f+(u-f)*t,l=v),(e===\"TB\"||e===\"BT\")&&(i=u,o=h+(v-h)*t,s=f,l=v+(h-v)*t);return{x1:u,y1:h,x2:f,y2:v,cpx1:i,cpy1:o,cpx2:s,cpy2:l}}var b7=x7,sr=Ct();function MD(r){var e=r.mainData,t=r.datas;t||(t={main:e},r.datasAttr={main:\"data\"}),r.datas=r.mainData=null,LD(e,t,r),A(t,function(a){A(e.TRANSFERABLE_METHODS,function(n){a.wrapMethod(n,ot(C7,r))})}),e.wrapMethod(\"cloneShallow\",ot(A7,r)),A(e.CHANGABLE_METHODS,function(a){e.wrapMethod(a,ot(T7,r))}),Me(t[e.dataType]===e)}function C7(r,e){if(L7(this)){var t=V({},sr(this).datas);t[this.dataType]=e,LD(e,t,r)}else Iy(e,this.dataType,sr(this).mainData,r);return e}function T7(r,e){return r.struct&&r.struct.update(),e}function A7(r,e){return A(sr(e).datas,function(t,a){t!==e&&Iy(t.cloneShallow(),a,e,r)}),e}function D7(r){var e=sr(this).mainData;return r==null||e==null?e:sr(e).datas[r]}function M7(){var r=sr(this).mainData;return r==null?[{data:r}]:G(St(sr(r).datas),function(e){return{type:e,data:sr(r).datas[e]}})}function L7(r){return sr(r).mainData===r}function LD(r,e,t){sr(r).datas={},A(e,function(a,n){Iy(a,n,r,t)})}function Iy(r,e,t,a){sr(t).datas[e]=r,sr(r).mainData=t,r.dataType=e,a.struct&&(r[a.structAttr]=a.struct,a.struct[a.datasAttr[e]]=r),r.getLinkedData=D7,r.getLinkedDataAll=M7}var I7=function(){function r(e,t){this.depth=0,this.height=0,this.dataIndex=-1,this.children=[],this.viewChildren=[],this.isExpand=!1,this.name=e||\"\",this.hostTree=t}return r.prototype.isRemoved=function(){return this.dataIndex<0},r.prototype.eachNode=function(e,t,a){J(e)&&(a=t,t=e,e=null),e=e||{},U(e)&&(e={order:e});var n=e.order||\"preorder\",i=this[e.attr||\"children\"],o;n===\"preorder\"&&(o=t.call(a,this));for(var s=0;!o&&s<i.length;s++)i[s].eachNode(e,t,a);n===\"postorder\"&&t.call(a,this)},r.prototype.updateDepthAndHeight=function(e){var t=0;this.depth=e;for(var a=0;a<this.children.length;a++){var n=this.children[a];n.updateDepthAndHeight(e+1),n.height>t&&(t=n.height)}this.height=t+1},r.prototype.getNodeById=function(e){if(this.getId()===e)return this;for(var t=0,a=this.children,n=a.length;t<n;t++){var i=a[t].getNodeById(e);if(i)return i}},r.prototype.contains=function(e){if(e===this)return!0;for(var t=0,a=this.children,n=a.length;t<n;t++){var i=a[t].contains(e);if(i)return i}},r.prototype.getAncestors=function(e){for(var t=[],a=e?this:this.parentNode;a;)t.push(a),a=a.parentNode;return t.reverse(),t},r.prototype.getAncestorsIndices=function(){for(var e=[],t=this;t;)e.push(t.dataIndex),t=t.parentNode;return e.reverse(),e},r.prototype.getDescendantIndices=function(){var e=[];return this.eachNode(function(t){e.push(t.dataIndex)}),e},r.prototype.getValue=function(e){var t=this.hostTree.data;return t.getStore().get(t.getDimensionIndex(e||\"value\"),this.dataIndex)},r.prototype.setLayout=function(e,t){this.dataIndex>=0&&this.hostTree.data.setItemLayout(this.dataIndex,e,t)},r.prototype.getLayout=function(){return this.hostTree.data.getItemLayout(this.dataIndex)},r.prototype.getModel=function(e){if(!(this.dataIndex<0)){var t=this.hostTree,a=t.data.getItemModel(this.dataIndex);return a.getModel(e)}},r.prototype.getLevelModel=function(){return(this.hostTree.levelModels||[])[this.depth]},r.prototype.setVisual=function(e,t){this.dataIndex>=0&&this.hostTree.data.setItemVisual(this.dataIndex,e,t)},r.prototype.getVisual=function(e){return this.hostTree.data.getItemVisual(this.dataIndex,e)},r.prototype.getRawIndex=function(){return this.hostTree.data.getRawIndex(this.dataIndex)},r.prototype.getId=function(){return this.hostTree.data.getId(this.dataIndex)},r.prototype.getChildIndex=function(){if(this.parentNode){for(var e=this.parentNode.children,t=0;t<e.length;++t)if(e[t]===this)return t;return-1}return-1},r.prototype.isAncestorOf=function(e){for(var t=e.parentNode;t;){if(t===this)return!0;t=t.parentNode}return!1},r.prototype.isDescendantOf=function(e){return e!==this&&e.isAncestorOf(this)},r}(),P7=function(){function r(e){this.type=\"tree\",this._nodes=[],this.hostModel=e}return r.prototype.eachNode=function(e,t,a){this.root.eachNode(e,t,a)},r.prototype.getNodeByDataIndex=function(e){var t=this.data.getRawIndex(e);return this._nodes[t]},r.prototype.getNodeById=function(e){return this.root.getNodeById(e)},r.prototype.update=function(){for(var e=this.data,t=this._nodes,a=0,n=t.length;a<n;a++)t[a].dataIndex=-1;for(var a=0,n=e.count();a<n;a++)t[e.getRawIndex(a)].dataIndex=a},r.prototype.clearLayouts=function(){this.data.clearItemLayouts()},r.createTree=function(e,t,a){var n=new r(t),i=[],o=1;s(e);function s(f,h){var v=f.value;o=Math.max(o,F(v)?v.length:1),i.push(f);var c=new I7(ee(f.name,\"\"),n);h?R7(c,h):n.root=c,n._nodes.push(c);var d=f.children;if(d)for(var p=0;p<d.length;p++)s(d[p],c)}n.root.updateDepthAndHeight(0);var l=Il(i,{coordDimensions:[\"value\"],dimensionsCount:o}).dimensions,u=new De(l,t);return u.initData(i),a&&a(u),MD({mainData:u,struct:n,structAttr:\"tree\"}),n.update(),n},r}();function R7(r,e){var t=e.children;r.parentNode!==e&&(t.push(r),r.parentNode=e)}var Py=P7;function sl(r,e,t){if(r&&dt(e,r.type)>=0){var a=t.getData().tree.root,n=r.targetNode;if(U(n)&&(n=a.getNodeById(n)),n&&a.contains(n))return{node:n};var i=r.targetNodeId;if(i!=null&&(n=a.getNodeById(i)))return{node:n}}}function ID(r){for(var e=[];r;)r=r.parentNode,r&&e.push(r);return e.reverse()}function Ry(r,e){var t=ID(r);return dt(t,e)>=0}function Yh(r,e){for(var t=[];r;){var a=r.dataIndex;t.push({name:r.name,dataIndex:a,value:e.getRawValue(a)}),r=r.parentNode}return t.reverse(),t}var E7=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.hasSymbolVisual=!0,t.ignoreStyleOnData=!0,t}return e.prototype.getInitialData=function(t){var a={name:t.name,children:t.data},n=t.leaves||{},i=new Vt(n,this,this.ecModel),o=Py.createTree(a,this,s);function s(h){h.wrapMethod(\"getItemModel\",function(v,c){var d=o.getNodeByDataIndex(c);return d&&d.children.length&&d.isExpand||(v.parentModel=i),v})}var l=0;o.eachNode(\"preorder\",function(h){h.depth>l&&(l=h.depth)});var u=t.expandAndCollapse,f=u&&t.initialTreeDepth>=0?t.initialTreeDepth:l;return o.root.eachNode(\"preorder\",function(h){var v=h.hostTree.data.getRawDataItem(h.dataIndex);h.isExpand=v&&v.collapsed!=null?!v.collapsed:h.depth<=f}),o.data},e.prototype.getOrient=function(){var t=this.get(\"orient\");return t===\"horizontal\"?t=\"LR\":t===\"vertical\"&&(t=\"TB\"),t},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.formatTooltip=function(t,a,n){for(var i=this.getData().tree,o=i.root.children[0],s=i.getNodeByDataIndex(t),l=s.getValue(),u=s.name;s&&s!==o;)u=s.parentNode.name+\".\"+u,s=s.parentNode;return oe(\"nameValue\",{name:u,value:l,noValue:isNaN(l)||l==null})},e.prototype.getDataParams=function(t){var a=r.prototype.getDataParams.apply(this,arguments),n=this.getData().tree.getNodeByDataIndex(t);return a.treeAncestors=Yh(n,this),a.collapsed=!n.isExpand,a},e.type=\"series.tree\",e.layoutMode=\"box\",e.defaultOption={z:2,coordinateSystem:\"view\",left:\"12%\",top:\"12%\",right:\"12%\",bottom:\"12%\",layout:\"orthogonal\",edgeShape:\"curve\",edgeForkPosition:\"50%\",roam:!1,nodeScaleRatio:.4,center:null,zoom:1,orient:\"LR\",symbol:\"emptyCircle\",symbolSize:7,expandAndCollapse:!0,initialTreeDepth:2,lineStyle:{color:\"#ccc\",width:1.5,curveness:.5},itemStyle:{color:\"lightsteelblue\",borderWidth:1.5},label:{show:!0},animationEasing:\"linear\",animationDuration:700,animationDurationUpdate:500},e}(Ht),k7=E7;function O7(r,e,t){for(var a=[r],n=[],i;i=a.pop();)if(n.push(i),i.isExpand){var o=i.children;if(o.length)for(var s=0;s<o.length;s++)a.push(o[s])}for(;i=n.pop();)e(i,t)}function is(r,e){for(var t=[r],a;a=t.pop();)if(e(a),a.isExpand){var n=a.children;if(n.length)for(var i=n.length-1;i>=0;i--)t.push(n[i])}}function B7(r,e){r.eachSeriesByType(\"tree\",function(t){N7(t,e)})}function N7(r,e){var t=c7(r,e);r.layoutInfo=t;var a=r.get(\"layout\"),n=0,i=0,o=null;a===\"radial\"?(n=2*Math.PI,i=Math.min(t.height,t.width)/2,o=xS(function(_,S){return(_.parentNode===S.parentNode?1:2)/_.depth})):(n=t.width,i=t.height,o=xS());var s=r.getData().tree.root,l=s.children[0];if(l){f7(s),O7(l,h7,o),s.hierNode.modifier=-l.hierNode.prelim,is(l,v7);var u=l,f=l,h=l;is(l,function(_){var S=_.getLayout().x;S<u.getLayout().x&&(u=_),S>f.getLayout().x&&(f=_),_.depth>h.depth&&(h=_)});var v=u===f?1:o(u,f)/2,c=v-u.getLayout().x,d=0,p=0,g=0,y=0;if(a===\"radial\")d=n/(f.getLayout().x+v+c),p=i/(h.depth-1||1),is(l,function(_){g=(_.getLayout().x+c)*d,y=(_.depth-1)*p;var S=Ss(g,y);_.setLayout({x:S.x,y:S.y,rawX:g,rawY:y},!0)});else{var m=r.getOrient();m===\"RL\"||m===\"LR\"?(p=i/(f.getLayout().x+v+c),d=n/(h.depth-1||1),is(l,function(_){y=(_.getLayout().x+c)*p,g=m===\"LR\"?(_.depth-1)*d:n-(_.depth-1)*d,_.setLayout({x:g,y},!0)})):(m===\"TB\"||m===\"BT\")&&(d=n/(f.getLayout().x+v+c),p=i/(h.depth-1||1),is(l,function(_){g=(_.getLayout().x+c)*d,y=m===\"TB\"?(_.depth-1)*p:i-(_.depth-1)*p,_.setLayout({x:g,y},!0)}))}}}function V7(r){r.eachSeriesByType(\"tree\",function(e){var t=e.getData(),a=t.tree;a.eachNode(function(n){var i=n.getModel(),o=i.getModel(\"itemStyle\").getItemStyle(),s=t.ensureUniqueItemVisual(n.dataIndex,\"style\");V(s,o)})})}function z7(r){r.registerAction({type:\"treeExpandAndCollapse\",event:\"treeExpandAndCollapse\",update:\"update\"},function(e,t){t.eachComponent({mainType:\"series\",subType:\"tree\",query:e},function(a){var n=e.dataIndex,i=a.getData().tree,o=i.getNodeByDataIndex(n);o.isExpand=!o.isExpand})}),r.registerAction({type:\"treeRoam\",event:\"treeRoam\",update:\"none\"},function(e,t,a){t.eachComponent({mainType:\"series\",subType:\"tree\",query:e},function(n){var i=n.coordinateSystem,o=Ly(i,e,void 0,a);n.setCenter&&n.setCenter(o.center),n.setZoom&&n.setZoom(o.zoom)})})}function F7(r){r.registerChartView(b7),r.registerSeriesModel(k7),r.registerLayout(B7),r.registerVisual(V7),z7(r)}var AS=[\"treemapZoomToNode\",\"treemapRender\",\"treemapMove\"];function G7(r){for(var e=0;e<AS.length;e++)r.registerAction({type:AS[e],update:\"updateView\"},Kt);r.registerAction({type:\"treemapRootToNode\",update:\"updateView\"},function(t,a){a.eachComponent({mainType:\"series\",subType:\"treemap\",query:t},n);function n(i,o){var s=[\"treemapZoomToNode\",\"treemapRootToNode\"],l=sl(t,s,i);if(l){var u=i.getViewRoot();u&&(t.direction=Ry(u,l.node)?\"rollUp\":\"drillDown\"),i.resetViewRoot(l.node)}}})}function PD(r){var e=r.getData(),t=e.tree,a={};t.eachNode(function(n){for(var i=n;i&&i.depth>1;)i=i.parentNode;var o=up(r.ecModel,i.name||i.dataIndex+\"\",a);n.setVisual(\"decal\",o)})}var H7=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.preventUsingHoverLayer=!0,t}return e.prototype.getInitialData=function(t,a){var n={name:t.name,children:t.data};RD(n);var i=t.levels||[],o=this.designatedVisualItemStyle={},s=new Vt({itemStyle:o},this,a);i=t.levels=W7(i,a);var l=G(i||[],function(h){return new Vt(h,s,a)},this),u=Py.createTree(n,this,f);function f(h){h.wrapMethod(\"getItemModel\",function(v,c){var d=u.getNodeByDataIndex(c),p=d?l[d.depth]:null;return v.parentModel=p||s,v})}return u.data},e.prototype.optionUpdated=function(){this.resetViewRoot()},e.prototype.formatTooltip=function(t,a,n){var i=this.getData(),o=this.getRawValue(t),s=i.getName(t);return oe(\"nameValue\",{name:s,value:o})},e.prototype.getDataParams=function(t){var a=r.prototype.getDataParams.apply(this,arguments),n=this.getData().tree.getNodeByDataIndex(t);return a.treeAncestors=Yh(n,this),a.treePathInfo=a.treeAncestors,a},e.prototype.setLayoutInfo=function(t){this.layoutInfo=this.layoutInfo||{},V(this.layoutInfo,t)},e.prototype.mapIdToIndex=function(t){var a=this._idIndexMap;a||(a=this._idIndexMap=q(),this._idIndexMapCount=0);var n=a.get(t);return n==null&&a.set(t,n=this._idIndexMapCount++),n},e.prototype.getViewRoot=function(){return this._viewRoot},e.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var a=this.getRawData().tree.root;(!t||t!==a&&!a.contains(t))&&(this._viewRoot=a)},e.prototype.enableAriaDecal=function(){PD(this)},e.type=\"series.treemap\",e.layoutMode=\"box\",e.defaultOption={progressive:0,left:\"center\",top:\"middle\",width:\"80%\",height:\"80%\",sort:!0,clipWindow:\"origin\",squareRatio:.5*(1+Math.sqrt(5)),leafDepth:null,drillDownIcon:\"\\u25B6\",zoomToNodeRatio:.32*.32,roam:!0,nodeClick:\"zoomToNode\",animation:!0,animationDurationUpdate:900,animationEasing:\"quinticInOut\",breadcrumb:{show:!0,height:22,left:\"center\",top:\"bottom\",emptyItemWidth:25,itemStyle:{color:\"rgba(0,0,0,0.7)\",textStyle:{color:\"#fff\"}},emphasis:{itemStyle:{color:\"rgba(0,0,0,0.9)\"}}},label:{show:!0,distance:0,padding:5,position:\"inside\",color:\"#fff\",overflow:\"truncate\"},upperLabel:{show:!1,position:[0,\"50%\"],height:20,overflow:\"truncate\",verticalAlign:\"middle\"},itemStyle:{color:null,colorAlpha:null,colorSaturation:null,borderWidth:0,gapWidth:0,borderColor:\"#fff\",borderColorSaturation:null},emphasis:{upperLabel:{show:!0,position:[0,\"50%\"],overflow:\"truncate\",verticalAlign:\"middle\"}},visualDimension:0,visualMin:null,visualMax:null,color:[],colorAlpha:null,colorSaturation:null,colorMappingBy:\"index\",visibleMin:10,childrenVisibleMin:null,levels:[]},e}(Ht);function RD(r){var e=0;A(r.children,function(a){RD(a);var n=a.value;F(n)&&(n=n[0]),e+=n});var t=r.value;F(t)&&(t=t[0]),(t==null||isNaN(t))&&(t=e),t<0&&(t=0),F(r.value)?r.value[0]=t:r.value=t}function W7(r,e){var t=kt(e.get(\"color\")),a=kt(e.get([\"aria\",\"decal\",\"decals\"]));if(!!t){r=r||[];var n,i;A(r,function(s){var l=new Vt(s),u=l.get(\"color\"),f=l.get(\"decal\");(l.get([\"itemStyle\",\"color\"])||u&&u!==\"none\")&&(n=!0),(l.get([\"itemStyle\",\"decal\"])||f&&f!==\"none\")&&(i=!0)});var o=r[0]||(r[0]={});return n||(o.color=t.slice()),!i&&a&&(o.decal=a.slice()),r}}var $7=H7,U7=8,DS=8,wc=5,Y7=function(){function r(e){this.group=new nt,e.add(this.group)}return r.prototype.render=function(e,t,a,n){var i=e.getModel(\"breadcrumb\"),o=this.group;if(o.removeAll(),!(!i.get(\"show\")||!a)){var s=i.getModel(\"itemStyle\"),l=i.getModel(\"emphasis\"),u=s.getModel(\"textStyle\"),f=l.getModel([\"itemStyle\",\"textStyle\"]),h={pos:{left:i.get(\"left\"),right:i.get(\"right\"),top:i.get(\"top\"),bottom:i.get(\"bottom\")},box:{width:t.getWidth(),height:t.getHeight()},emptyItemWidth:i.get(\"emptyItemWidth\"),totalWidth:0,renderList:[]};this._prepare(a,h,u),this._renderContent(e,h,s,l,u,f,n),kh(o,h.pos,h.box)}},r.prototype._prepare=function(e,t,a){for(var n=e;n;n=n.parentNode){var i=ee(n.getModel().get(\"name\"),\"\"),o=a.getTextRect(i),s=Math.max(o.width+U7*2,t.emptyItemWidth);t.totalWidth+=s+DS,t.renderList.push({node:n,text:i,width:s})}},r.prototype._renderContent=function(e,t,a,n,i,o,s){for(var l=0,u=t.emptyItemWidth,f=e.get([\"breadcrumb\",\"height\"]),h=U3(t.pos,t.box),v=t.totalWidth,c=t.renderList,d=n.getModel(\"itemStyle\").getItemStyle(),p=c.length-1;p>=0;p--){var g=c[p],y=g.node,m=g.width,_=g.text;v>h.width&&(v-=m-u,m=u,_=null);var S=new ze({shape:{points:Z7(l,0,m,f,p===c.length-1,p===0)},style:tt(a.getItemStyle(),{lineJoin:\"bevel\"}),textContent:new Dt({style:Nt(i,{text:_})}),textConfig:{position:\"inside\"},z2:To*1e4,onclick:ot(s,y)});S.disableLabelAnimation=!0,S.getTextContent().ensureState(\"emphasis\").style=Nt(o,{text:_}),S.ensureState(\"emphasis\").style=d,$t(S,n.get(\"focus\"),n.get(\"blurScope\"),n.get(\"disabled\")),this.group.add(S),X7(S,e,y),l+=m+DS}},r.prototype.remove=function(){this.group.removeAll()},r}();function Z7(r,e,t,a,n,i){var o=[[n?r:r-wc,e],[r+t,e],[r+t,e+a],[n?r:r-wc,e+a]];return!i&&o.splice(2,0,[r+t+wc,e+a/2]),!n&&o.push([r,e+a/2]),o}function X7(r,e,t){it(r).eventData={componentType:\"series\",componentSubType:\"treemap\",componentIndex:e.componentIndex,seriesIndex:e.seriesIndex,seriesName:e.name,seriesType:\"treemap\",selfType:\"breadcrumb\",nodeData:{dataIndex:t&&t.dataIndex,name:t&&t.name},treePathInfo:t&&Yh(t,e)}}var q7=Y7,K7=function(){function r(){this._storage=[],this._elExistsMap={}}return r.prototype.add=function(e,t,a,n,i){return this._elExistsMap[e.id]?!1:(this._elExistsMap[e.id]=!0,this._storage.push({el:e,target:t,duration:a,delay:n,easing:i}),!0)},r.prototype.finished=function(e){return this._finishedCallback=e,this},r.prototype.start=function(){for(var e=this,t=this._storage.length,a=function(){t--,t<=0&&(e._storage.length=0,e._elExistsMap={},e._finishedCallback&&e._finishedCallback())},n=0,i=this._storage.length;n<i;n++){var o=this._storage[n];o.el.animateTo(o.target,{duration:o.duration,delay:o.delay,easing:o.easing,setToFinal:!0,done:a,aborted:a})}return this},r}();function J7(){return new K7}var Rp=nt,MS=bt,LS=3,IS=\"label\",PS=\"upperLabel\",Q7=To*10,j7=To*2,t8=To*3,Fn=pi([[\"fill\",\"color\"],[\"stroke\",\"strokeColor\"],[\"lineWidth\",\"strokeWidth\"],[\"shadowBlur\"],[\"shadowOffsetX\"],[\"shadowOffsetY\"],[\"shadowColor\"]]),RS=function(r){var e=Fn(r);return e.stroke=e.fill=e.lineWidth=null,e},Xf=Ct(),e8=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t._state=\"ready\",t._storage=os(),t}return e.prototype.render=function(t,a,n,i){var o=a.findComponents({mainType:\"series\",subType:\"treemap\",query:i});if(!(dt(o,t)<0)){this.seriesModel=t,this.api=n,this.ecModel=a;var s=[\"treemapZoomToNode\",\"treemapRootToNode\"],l=sl(i,s,t),u=i&&i.type,f=t.layoutInfo,h=!this._oldTree,v=this._storage,c=u===\"treemapRootToNode\"&&l&&v?{rootNodeGroup:v.nodeGroup[l.node.getRawIndex()],direction:i.direction}:null,d=this._giveContainerGroup(f),p=t.get(\"animation\"),g=this._doRender(d,t,c);p&&!h&&(!u||u===\"treemapZoomToNode\"||u===\"treemapRootToNode\")?this._doAnimation(d,g,t,c):g.renderFinally(),this._resetController(n),this._renderBreadcrumb(t,n,l)}},e.prototype._giveContainerGroup=function(t){var a=this._containerGroup;return a||(a=this._containerGroup=new Rp,this._initEvents(a),this.group.add(a)),a.x=t.x,a.y=t.y,a},e.prototype._doRender=function(t,a,n){var i=a.getData().tree,o=this._oldTree,s=os(),l=os(),u=this._storage,f=[];function h(g,y,m,_){return r8(a,l,u,n,s,f,g,y,m,_)}c(i.root?[i.root]:[],o&&o.root?[o.root]:[],t,i===o||!o,0);var v=d(u);return this._oldTree=i,this._storage=l,{lastsForAnimation:s,willDeleteEls:v,renderFinally:p};function c(g,y,m,_,S){_?(y=g,A(g,function(b,C){!b.isRemoved()&&x(C,C)})):new xa(y,g,w,w).add(x).update(x).remove(ot(x,null)).execute();function w(b){return b.getId()}function x(b,C){var T=b!=null?g[b]:null,D=C!=null?y[C]:null,M=h(T,D,m,S);M&&c(T&&T.viewChildren||[],D&&D.viewChildren||[],M,_,S+1)}}function d(g){var y=os();return g&&A(g,function(m,_){var S=y[_];A(m,function(w){w&&(S.push(w),Xf(w).willDelete=!0)})}),y}function p(){A(v,function(g){A(g,function(y){y.parent&&y.parent.remove(y)})}),A(f,function(g){g.invisible=!0,g.dirty()})}},e.prototype._doAnimation=function(t,a,n,i){var o=n.get(\"animationDurationUpdate\"),s=n.get(\"animationEasing\"),l=(J(o)?0:o)||0,u=(J(s)?null:s)||\"cubicOut\",f=J7();A(a.willDeleteEls,function(h,v){A(h,function(c,d){if(!c.invisible){var p=c.parent,g,y=Xf(p);if(i&&i.direction===\"drillDown\")g=p===i.rootNodeGroup?{shape:{x:0,y:0,width:y.nodeWidth,height:y.nodeHeight},style:{opacity:0}}:{style:{opacity:0}};else{var m=0,_=0;y.willDelete||(m=y.nodeWidth/2,_=y.nodeHeight/2),g=v===\"nodeGroup\"?{x:m,y:_,style:{opacity:0}}:{shape:{x:m,y:_,width:0,height:0},style:{opacity:0}}}g&&f.add(c,g,l,0,u)}})}),A(this._storage,function(h,v){A(h,function(c,d){var p=a.lastsForAnimation[v][d],g={};!p||(c instanceof nt?p.oldX!=null&&(g.x=c.x,g.y=c.y,c.x=p.oldX,c.y=p.oldY):(p.oldShape&&(g.shape=V({},c.shape),c.setShape(p.oldShape)),p.fadein?(c.setStyle(\"opacity\",0),g.style={opacity:1}):c.style.opacity!==1&&(g.style={opacity:1})),f.add(c,g,l,0,u))})},this),this._state=\"animating\",f.finished(Y(function(){this._state=\"ready\",a.renderFinally()},this)).start()},e.prototype._resetController=function(t){var a=this._controller;a||(a=this._controller=new Vl(t.getZr()),a.enable(this.seriesModel.get(\"roam\")),a.on(\"pan\",Y(this._onPan,this)),a.on(\"zoom\",Y(this._onZoom,this)));var n=new vt(0,0,t.getWidth(),t.getHeight());a.setPointerChecker(function(i,o,s){return n.contain(o,s)})},e.prototype._clearController=function(){var t=this._controller;t&&(t.dispose(),t=null)},e.prototype._onPan=function(t){if(this._state!==\"animating\"&&(Math.abs(t.dx)>LS||Math.abs(t.dy)>LS)){var a=this.seriesModel.getData().tree.root;if(!a)return;var n=a.getLayout();if(!n)return;this.api.dispatchAction({type:\"treemapMove\",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:n.x+t.dx,y:n.y+t.dy,width:n.width,height:n.height}})}},e.prototype._onZoom=function(t){var a=t.originX,n=t.originY;if(this._state!==\"animating\"){var i=this.seriesModel.getData().tree.root;if(!i)return;var o=i.getLayout();if(!o)return;var s=new vt(o.x,o.y,o.width,o.height),l=this.seriesModel.layoutInfo;a-=l.x,n-=l.y;var u=ur();Xr(u,u,[-a,-n]),Cg(u,u,[t.scale,t.scale]),Xr(u,u,[a,n]),s.applyTransform(u),this.api.dispatchAction({type:\"treemapRender\",from:this.uid,seriesId:this.seriesModel.id,rootRect:{x:s.x,y:s.y,width:s.width,height:s.height}})}},e.prototype._initEvents=function(t){var a=this;t.on(\"click\",function(n){if(a._state===\"ready\"){var i=a.seriesModel.get(\"nodeClick\",!0);if(!!i){var o=a.findTarget(n.offsetX,n.offsetY);if(!!o){var s=o.node;if(s.getLayout().isLeafRoot)a._rootToNode(o);else if(i===\"zoomToNode\")a._zoomToNode(o);else if(i===\"link\"){var l=s.hostTree.data.getItemModel(s.dataIndex),u=l.get(\"link\",!0),f=l.get(\"target\",!0)||\"blank\";u&&Rf(u,f)}}}}},this)},e.prototype._renderBreadcrumb=function(t,a,n){var i=this;n||(n=t.get(\"leafDepth\",!0)!=null?{node:t.getViewRoot()}:this.findTarget(a.getWidth()/2,a.getHeight()/2),n||(n={node:t.getData().tree.root})),(this._breadcrumb||(this._breadcrumb=new q7(this.group))).render(t,a,n.node,function(o){i._state!==\"animating\"&&(Ry(t.getViewRoot(),o)?i._rootToNode({node:o}):i._zoomToNode({node:o}))})},e.prototype.remove=function(){this._clearController(),this._containerGroup&&this._containerGroup.removeAll(),this._storage=os(),this._state=\"ready\",this._breadcrumb&&this._breadcrumb.remove()},e.prototype.dispose=function(){this._clearController()},e.prototype._zoomToNode=function(t){this.api.dispatchAction({type:\"treemapZoomToNode\",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},e.prototype._rootToNode=function(t){this.api.dispatchAction({type:\"treemapRootToNode\",from:this.uid,seriesId:this.seriesModel.id,targetNode:t.node})},e.prototype.findTarget=function(t,a){var n,i=this.seriesModel.getViewRoot();return i.eachNode({attr:\"viewChildren\",order:\"preorder\"},function(o){var s=this._storage.background[o.getRawIndex()];if(s){var l=s.transformCoordToLocal(t,a),u=s.shape;if(u.x<=l[0]&&l[0]<=u.x+u.width&&u.y<=l[1]&&l[1]<=u.y+u.height)n={node:o,offsetX:l[0],offsetY:l[1]};else return!1}},this),n},e.type=\"treemap\",e}(zt);function os(){return{nodeGroup:[],background:[],content:[]}}function r8(r,e,t,a,n,i,o,s,l,u){if(!o)return;var f=o.getLayout(),h=r.getData(),v=o.getModel();if(h.setItemGraphicEl(o.dataIndex,null),!f||!f.isInView)return;var c=f.width,d=f.height,p=f.borderWidth,g=f.invisible,y=o.getRawIndex(),m=s&&s.getRawIndex(),_=o.viewChildren,S=f.upperHeight,w=_&&_.length,x=v.getModel(\"itemStyle\"),b=v.getModel([\"emphasis\",\"itemStyle\"]),C=v.getModel([\"blur\",\"itemStyle\"]),T=v.getModel([\"select\",\"itemStyle\"]),D=x.get(\"borderRadius\")||0,M=j(\"nodeGroup\",Rp);if(!M)return;if(l.add(M),M.x=f.x||0,M.y=f.y||0,M.markRedraw(),Xf(M).nodeWidth=c,Xf(M).nodeHeight=d,f.isAboveViewRoot)return M;var L=j(\"background\",MS,u,j7);L&&z(M,L,w&&f.upperLabelHeight);var I=v.getModel(\"emphasis\"),P=I.get(\"focus\"),R=I.get(\"blurScope\"),E=I.get(\"disabled\"),B=P===\"ancestor\"?o.getAncestorsIndices():P===\"descendant\"?o.getDescendantIndices():P;if(w)Ks(M)&&Jn(M,!1),L&&(Jn(L,!E),h.setItemGraphicEl(o.dataIndex,L),ep(L,B,R));else{var O=j(\"content\",MS,u,t8);O&&H(M,O),L.disableMorphing=!0,L&&Ks(L)&&Jn(L,!1),Jn(M,!E),h.setItemGraphicEl(o.dataIndex,M),ep(M,B,R)}return M;function z(gt,rt,yt){var st=it(rt);if(st.dataIndex=o.dataIndex,st.seriesIndex=r.seriesIndex,rt.setShape({x:0,y:0,width:c,height:d,r:D}),g)$(rt);else{rt.invisible=!1;var K=o.getVisual(\"style\"),lt=K.stroke,Gt=RS(x);Gt.fill=lt;var wt=Fn(b);wt.fill=b.get(\"borderColor\");var Yt=Fn(C);Yt.fill=C.get(\"borderColor\");var Wt=Fn(T);if(Wt.fill=T.get(\"borderColor\"),yt){var ge=c-2*p;X(rt,lt,K.opacity,{x:p,y:0,width:ge,height:S})}else rt.removeTextContent();rt.setStyle(Gt),rt.ensureState(\"emphasis\").style=wt,rt.ensureState(\"blur\").style=Yt,rt.ensureState(\"select\").style=Wt,gi(rt)}gt.add(rt)}function H(gt,rt){var yt=it(rt);yt.dataIndex=o.dataIndex,yt.seriesIndex=r.seriesIndex;var st=Math.max(c-2*p,0),K=Math.max(d-2*p,0);if(rt.culling=!0,rt.setShape({x:p,y:p,width:st,height:K,r:D}),g)$(rt);else{rt.invisible=!1;var lt=o.getVisual(\"style\"),Gt=lt.fill,wt=RS(x);wt.fill=Gt,wt.decal=lt.decal;var Yt=Fn(b),Wt=Fn(C),ge=Fn(T);X(rt,Gt,lt.opacity,null),rt.setStyle(wt),rt.ensureState(\"emphasis\").style=Yt,rt.ensureState(\"blur\").style=Wt,rt.ensureState(\"select\").style=ge,gi(rt)}gt.add(rt)}function $(gt){!gt.invisible&&i.push(gt)}function X(gt,rt,yt,st){var K=v.getModel(st?PS:IS),lt=ee(v.get(\"name\"),null),Gt=K.getShallow(\"show\");de(gt,ie(v,st?PS:IS),{defaultText:Gt?lt:null,inheritColor:rt,defaultOpacity:yt,labelFetcher:r,labelDataIndex:o.dataIndex});var wt=gt.getTextContent();if(!!wt){var Yt=wt.style,Wt=xg(Yt.padding||0);st&&(gt.setTextConfig({layoutRect:st}),wt.disableLabelLayout=!0),wt.beforeUpdate=function(){var ea=Math.max((st?st.width:gt.shape.width)-Wt[1]-Wt[3],0),Ie=Math.max((st?st.height:gt.shape.height)-Wt[0]-Wt[2],0);(Yt.width!==ea||Yt.height!==Ie)&&wt.setStyle({width:ea,height:Ie})},Yt.truncateMinChar=2,Yt.lineOverflow=\"truncate\",Q(Yt,st,f);var ge=wt.getState(\"emphasis\");Q(ge?ge.style:null,st,f)}}function Q(gt,rt,yt){var st=gt?gt.text:null;if(!rt&&yt.isLeafRoot&&st!=null){var K=r.get(\"drillDownIcon\",!0);gt.text=K?K+\" \"+st:st}}function j(gt,rt,yt,st){var K=m!=null&&t[gt][m],lt=n[gt];return K?(t[gt][m]=null,pt(lt,K)):g||(K=new rt,K instanceof fr&&(K.z2=a8(yt,st)),xt(lt,K)),e[gt][y]=K}function pt(gt,rt){var yt=gt[y]={};rt instanceof Rp?(yt.oldX=rt.x,yt.oldY=rt.y):yt.oldShape=V({},rt.shape)}function xt(gt,rt){var yt=gt[y]={},st=o.parentNode,K=rt instanceof nt;if(st&&(!a||a.direction===\"drillDown\")){var lt=0,Gt=0,wt=n.background[st.getRawIndex()];!a&&wt&&wt.oldShape&&(lt=wt.oldShape.width,Gt=wt.oldShape.height),K?(yt.oldX=0,yt.oldY=Gt):yt.oldShape={x:lt,y:Gt,width:0,height:0}}yt.fadein=!K}}function a8(r,e){return r*Q7+e}var n8=e8,ll=A,i8=et,qf=-1,Ey=function(){function r(e){var t=e.mappingMethod,a=e.type,n=this.option=at(e);this.type=a,this.mappingMethod=t,this._normalizeData=l8[t];var i=r.visualHandlers[a];this.applyVisual=i.applyVisual,this.getColorMapper=i.getColorMapper,this._normalizedToVisual=i._normalizedToVisual[t],t===\"piecewise\"?(bc(n),o8(n)):t===\"category\"?n.categories?s8(n):bc(n,!0):(Me(t!==\"linear\"||n.dataExtent),bc(n))}return r.prototype.mapValueToVisual=function(e){var t=this._normalizeData(e);return this._normalizedToVisual(t,e)},r.prototype.getNormalizer=function(){return Y(this._normalizeData,this)},r.listVisualTypes=function(){return St(r.visualHandlers)},r.isValidType=function(e){return r.visualHandlers.hasOwnProperty(e)},r.eachVisual=function(e,t,a){et(e)?A(e,t,a):t.call(a,e)},r.mapVisual=function(e,t,a){var n,i=F(e)?[]:et(e)?{}:(n=!0,null);return r.eachVisual(e,function(o,s){var l=t.call(a,o,s);n?i=l:i[s]=l}),i},r.retrieveVisuals=function(e){var t={},a;return e&&ll(r.visualHandlers,function(n,i){e.hasOwnProperty(i)&&(t[i]=e[i],a=!0)}),a?t:null},r.prepareVisualTypes=function(e){if(F(e))e=e.slice();else if(i8(e)){var t=[];ll(e,function(a,n){t.push(n)}),e=t}else return[];return e.sort(function(a,n){return n===\"color\"&&a!==\"color\"&&a.indexOf(\"color\")===0?1:-1}),e},r.dependsOn=function(e,t){return t===\"color\"?!!(e&&e.indexOf(t)===0):e===t},r.findPieceIndex=function(e,t,a){for(var n,i=1/0,o=0,s=t.length;o<s;o++){var l=t[o].value;if(l!=null){if(l===e||U(l)&&l===e+\"\")return o;a&&v(l,o)}}for(var o=0,s=t.length;o<s;o++){var u=t[o],f=u.interval,h=u.close;if(f){if(f[0]===-1/0){if(Iu(h[1],e,f[1]))return o}else if(f[1]===1/0){if(Iu(h[0],f[0],e))return o}else if(Iu(h[0],f[0],e)&&Iu(h[1],e,f[1]))return o;a&&v(f[0],o),a&&v(f[1],o)}}if(a)return e===1/0?t.length-1:e===-1/0?0:n;function v(c,d){var p=Math.abs(c-e);p<i&&(i=p,n=d)}},r.visualHandlers={color:{applyVisual:ss(\"color\"),getColorMapper:function(){var e=this.option;return Y(e.mappingMethod===\"category\"?function(t,a){return!a&&(t=this._normalizeData(t)),xs.call(this,t)}:function(t,a,n){var i=!!n;return!a&&(t=this._normalizeData(t)),n=lv(t,e.parsedVisual,n),i?n:va(n,\"rgba\")},this)},_normalizedToVisual:{linear:function(e){return va(lv(e,this.option.parsedVisual),\"rgba\")},category:xs,piecewise:function(e,t){var a=kp.call(this,t);return a==null&&(a=va(lv(e,this.option.parsedVisual),\"rgba\")),a},fixed:Gn}},colorHue:Lu(function(e,t){return As(e,t)}),colorSaturation:Lu(function(e,t){return As(e,null,t)}),colorLightness:Lu(function(e,t){return As(e,null,null,t)}),colorAlpha:Lu(function(e,t){return _f(e,t)}),decal:{applyVisual:ss(\"decal\"),_normalizedToVisual:{linear:null,category:xs,piecewise:null,fixed:null}},opacity:{applyVisual:ss(\"opacity\"),_normalizedToVisual:Ep([0,1])},liftZ:{applyVisual:ss(\"liftZ\"),_normalizedToVisual:{linear:Gn,category:Gn,piecewise:Gn,fixed:Gn}},symbol:{applyVisual:function(e,t,a){var n=this.mapValueToVisual(e);a(\"symbol\",n)},_normalizedToVisual:{linear:ES,category:xs,piecewise:function(e,t){var a=kp.call(this,t);return a==null&&(a=ES.call(this,e)),a},fixed:Gn}},symbolSize:{applyVisual:ss(\"symbolSize\"),_normalizedToVisual:Ep([0,1])}},r}();function o8(r){var e=r.pieceList;r.hasSpecialVisual=!1,A(e,function(t,a){t.originIndex=a,t.visual!=null&&(r.hasSpecialVisual=!0)})}function s8(r){var e=r.categories,t=r.categoryMap={},a=r.visual;if(ll(e,function(o,s){t[o]=s}),!F(a)){var n=[];et(a)?ll(a,function(o,s){var l=t[s];n[l!=null?l:qf]=o}):n[qf]=a,a=ED(r,n)}for(var i=e.length-1;i>=0;i--)a[i]==null&&(delete t[e[i]],e.pop())}function bc(r,e){var t=r.visual,a=[];et(t)?ll(t,function(i){a.push(i)}):t!=null&&a.push(t);var n={color:1,symbol:1};!e&&a.length===1&&!n.hasOwnProperty(r.type)&&(a[1]=a[0]),ED(r,a)}function Lu(r){return{applyVisual:function(e,t,a){var n=this.mapValueToVisual(e);a(\"color\",r(t(\"color\"),n))},_normalizedToVisual:Ep([0,1])}}function ES(r){var e=this.option.visual;return e[Math.round(Rt(r,[0,1],[0,e.length-1],!0))]||{}}function ss(r){return function(e,t,a){a(r,this.mapValueToVisual(e))}}function xs(r){var e=this.option.visual;return e[this.option.loop&&r!==qf?r%e.length:r]}function Gn(){return this.option.visual[0]}function Ep(r){return{linear:function(e){return Rt(e,r,this.option.visual,!0)},category:xs,piecewise:function(e,t){var a=kp.call(this,t);return a==null&&(a=Rt(e,r,this.option.visual,!0)),a},fixed:Gn}}function kp(r){var e=this.option,t=e.pieceList;if(e.hasSpecialVisual){var a=Ey.findPieceIndex(r,t),n=t[a];if(n&&n.visual)return n.visual[this.type]}}function ED(r,e){return r.visual=e,r.type===\"color\"&&(r.parsedVisual=G(e,function(t){var a=We(t);return a||[0,0,0,1]})),e}var l8={linear:function(r){return Rt(r,this.option.dataExtent,[0,1],!0)},piecewise:function(r){var e=this.option.pieceList,t=Ey.findPieceIndex(r,e,!0);if(t!=null)return Rt(t,[0,e.length-1],[0,1],!0)},category:function(r){var e=this.option.categories?this.option.categoryMap[r]:r;return e==null?qf:e},fixed:Kt};function Iu(r,e,t){return r?e<=t:e<t}var ve=Ey,u8=\"itemStyle\",kD=Ct(),f8={seriesType:\"treemap\",reset:function(r){var e=r.getData().tree,t=e.root;t.isRemoved()||OD(t,{},r.getViewRoot().getAncestors(),r)}};function OD(r,e,t,a){var n=r.getModel(),i=r.getLayout(),o=r.hostTree.data;if(!(!i||i.invisible||!i.isInView)){var s=n.getModel(u8),l=h8(s,e,a),u=o.ensureUniqueItemVisual(r.dataIndex,\"style\"),f=s.get(\"borderColor\"),h=s.get(\"borderColorSaturation\"),v;h!=null&&(v=kS(l),f=v8(h,v)),u.stroke=f;var c=r.viewChildren;if(!c||!c.length)v=kS(l),u.fill=v;else{var d=c8(r,n,i,s,l,c);A(c,function(p,g){if(p.depth>=t.length||p===t[p.depth]){var y=d8(n,l,p,g,d,a);OD(p,y,t,a)}})}}}function h8(r,e,t){var a=V({},e),n=t.designatedVisualItemStyle;return A([\"color\",\"colorAlpha\",\"colorSaturation\"],function(i){n[i]=e[i];var o=r.get(i);n[i]=null,o!=null&&(a[i]=o)}),a}function kS(r){var e=Cc(r,\"color\");if(e){var t=Cc(r,\"colorAlpha\"),a=Cc(r,\"colorSaturation\");return a&&(e=As(e,null,null,a)),t&&(e=_f(e,t)),e}}function v8(r,e){return e!=null?As(e,null,null,r):null}function Cc(r,e){var t=r[e];if(t!=null&&t!==\"none\")return t}function c8(r,e,t,a,n,i){if(!(!i||!i.length)){var o=Tc(e,\"color\")||n.color!=null&&n.color!==\"none\"&&(Tc(e,\"colorAlpha\")||Tc(e,\"colorSaturation\"));if(!!o){var s=e.get(\"visualMin\"),l=e.get(\"visualMax\"),u=t.dataExtent.slice();s!=null&&s<u[0]&&(u[0]=s),l!=null&&l>u[1]&&(u[1]=l);var f=e.get(\"colorMappingBy\"),h={type:o.name,dataExtent:u,visual:o.range};h.type===\"color\"&&(f===\"index\"||f===\"id\")?(h.mappingMethod=\"category\",h.loop=!0):h.mappingMethod=\"linear\";var v=new ve(h);return kD(v).drColorMappingBy=f,v}}}function Tc(r,e){var t=r.get(e);return F(t)&&t.length?{name:e,range:t}:null}function d8(r,e,t,a,n,i){var o=V({},e);if(n){var s=n.type,l=s===\"color\"&&kD(n).drColorMappingBy,u=l===\"index\"?a:l===\"id\"?i.mapIdToIndex(t.getId()):t.getValue(r.get(\"visualDimension\"));o[s]=n.mapValueToVisual(u)}return o}var ul=Math.max,Kf=Math.min,OS=le,ky=A,BD=[\"itemStyle\",\"borderWidth\"],p8=[\"itemStyle\",\"gapWidth\"],g8=[\"upperLabel\",\"show\"],y8=[\"upperLabel\",\"height\"],m8={seriesType:\"treemap\",reset:function(r,e,t,a){var n=t.getWidth(),i=t.getHeight(),o=r.option,s=re(r.getBoxLayoutParams(),{width:t.getWidth(),height:t.getHeight()}),l=o.size||[],u=W(OS(s.width,l[0]),n),f=W(OS(s.height,l[1]),i),h=a&&a.type,v=[\"treemapZoomToNode\",\"treemapRootToNode\"],c=sl(a,v,r),d=h===\"treemapRender\"||h===\"treemapMove\"?a.rootRect:null,p=r.getViewRoot(),g=ID(p);if(h!==\"treemapMove\"){var y=h===\"treemapZoomToNode\"?C8(r,c,p,u,f):d?[d.width,d.height]:[u,f],m=o.sort;m&&m!==\"asc\"&&m!==\"desc\"&&(m=\"desc\");var _={squareRatio:o.squareRatio,sort:m,leafDepth:o.leafDepth};p.hostTree.clearLayouts();var S={x:0,y:0,width:y[0],height:y[1],area:y[0]*y[1]};p.setLayout(S),ND(p,_,!1,0),S=p.getLayout(),ky(g,function(x,b){var C=(g[b+1]||p).getValue();x.setLayout(V({dataExtent:[C,C],borderWidth:0,upperHeight:0},S))})}var w=r.getData().tree.root;w.setLayout(T8(s,d,c),!0),r.setLayoutInfo(s),VD(w,new vt(-s.x,-s.y,n,i),g,p,0)}};function ND(r,e,t,a){var n,i;if(!r.isRemoved()){var o=r.getLayout();n=o.width,i=o.height;var s=r.getModel(),l=s.get(BD),u=s.get(p8)/2,f=zD(s),h=Math.max(l,f),v=l-u,c=h-u;r.setLayout({borderWidth:l,upperHeight:h,upperLabelHeight:f},!0),n=ul(n-2*v,0),i=ul(i-v-c,0);var d=n*i,p=_8(r,s,d,e,t,a);if(!!p.length){var g={x:v,y:c,width:n,height:i},y=Kf(n,i),m=1/0,_=[];_.area=0;for(var S=0,w=p.length;S<w;){var x=p[S];_.push(x),_.area+=x.getLayout().area;var b=b8(_,y,e.squareRatio);b<=m?(S++,m=b):(_.area-=_.pop().getLayout().area,BS(_,y,g,u,!1),y=Kf(g.width,g.height),_.length=_.area=0,m=1/0)}if(_.length&&BS(_,y,g,u,!0),!t){var C=s.get(\"childrenVisibleMin\");C!=null&&d<C&&(t=!0)}for(var S=0,w=p.length;S<w;S++)ND(p[S],e,t,a+1)}}}function _8(r,e,t,a,n,i){var o=r.children||[],s=a.sort;s!==\"asc\"&&s!==\"desc\"&&(s=null);var l=a.leafDepth!=null&&a.leafDepth<=i;if(n&&!l)return r.viewChildren=[];o=Et(o,function(c){return!c.isRemoved()}),x8(o,s);var u=w8(e,o,s);if(u.sum===0)return r.viewChildren=[];if(u.sum=S8(e,t,u.sum,s,o),u.sum===0)return r.viewChildren=[];for(var f=0,h=o.length;f<h;f++){var v=o[f].getValue()/u.sum*t;o[f].setLayout({area:v})}return l&&(o.length&&r.setLayout({isLeafRoot:!0},!0),o.length=0),r.viewChildren=o,r.setLayout({dataExtent:u.dataExtent},!0),o}function S8(r,e,t,a,n){if(!a)return t;for(var i=r.get(\"visibleMin\"),o=n.length,s=o,l=o-1;l>=0;l--){var u=n[a===\"asc\"?o-l-1:l].getValue();u/t*e<i&&(s=l,t-=u)}return a===\"asc\"?n.splice(0,o-s):n.splice(s,o-s),t}function x8(r,e){return e&&r.sort(function(t,a){var n=e===\"asc\"?t.getValue()-a.getValue():a.getValue()-t.getValue();return n===0?e===\"asc\"?t.dataIndex-a.dataIndex:a.dataIndex-t.dataIndex:n}),r}function w8(r,e,t){for(var a=0,n=0,i=e.length;n<i;n++)a+=e[n].getValue();var o=r.get(\"visualDimension\"),s;return!e||!e.length?s=[NaN,NaN]:o===\"value\"&&t?(s=[e[e.length-1].getValue(),e[0].getValue()],t===\"asc\"&&s.reverse()):(s=[1/0,-1/0],ky(e,function(l){var u=l.getValue(o);u<s[0]&&(s[0]=u),u>s[1]&&(s[1]=u)})),{sum:a,dataExtent:s}}function b8(r,e,t){for(var a=0,n=1/0,i=0,o=void 0,s=r.length;i<s;i++)o=r[i].getLayout().area,o&&(o<n&&(n=o),o>a&&(a=o));var l=r.area*r.area,u=e*e*t;return l?ul(u*a/l,l/(u*n)):1/0}function BS(r,e,t,a,n){var i=e===t.width?0:1,o=1-i,s=[\"x\",\"y\"],l=[\"width\",\"height\"],u=t[s[i]],f=e?r.area/e:0;(n||f>t[l[o]])&&(f=t[l[o]]);for(var h=0,v=r.length;h<v;h++){var c=r[h],d={},p=f?c.getLayout().area/f:0,g=d[l[o]]=ul(f-2*a,0),y=t[s[i]]+t[l[i]]-u,m=h===v-1||y<p?y:p,_=d[l[i]]=ul(m-2*a,0);d[s[o]]=t[s[o]]+Kf(a,g/2),d[s[i]]=u+Kf(a,_/2),u+=m,c.setLayout(d,!0)}t[s[o]]+=f,t[l[o]]-=f}function C8(r,e,t,a,n){var i=(e||{}).node,o=[a,n];if(!i||i===t)return o;for(var s,l=a*n,u=l*r.option.zoomToNodeRatio;s=i.parentNode;){for(var f=0,h=s.children,v=0,c=h.length;v<c;v++)f+=h[v].getValue();var d=i.getValue();if(d===0)return o;u*=f/d;var p=s.getModel(),g=p.get(BD),y=Math.max(g,zD(p));u+=4*g*g+(3*g+y)*Math.pow(u,.5),u>s0&&(u=s0),i=s}u<l&&(u=l);var m=Math.pow(u/l,.5);return[a*m,n*m]}function T8(r,e,t){if(e)return{x:e.x,y:e.y};var a={x:0,y:0};if(!t)return a;var n=t.node,i=n.getLayout();if(!i)return a;for(var o=[i.width/2,i.height/2],s=n;s;){var l=s.getLayout();o[0]+=l.x,o[1]+=l.y,s=s.parentNode}return{x:r.width/2-o[0],y:r.height/2-o[1]}}function VD(r,e,t,a,n){var i=r.getLayout(),o=t[n],s=o&&o===r;if(!(o&&!s||n===t.length&&r!==a)){r.setLayout({isInView:!0,invisible:!s&&!e.intersect(i),isAboveViewRoot:s},!0);var l=new vt(e.x-i.x,e.y-i.y,e.width,e.height);ky(r.viewChildren||[],function(u){VD(u,l,t,a,n+1)})}}function zD(r){return r.get(g8)?r.get(y8):0}function A8(r){r.registerSeriesModel($7),r.registerChartView(n8),r.registerVisual(f8),r.registerLayout(m8),G7(r)}function D8(r){var e=r.findComponents({mainType:\"legend\"});!e||!e.length||r.eachSeriesByType(\"graph\",function(t){var a=t.getCategoriesData(),n=t.getGraph(),i=n.data,o=a.mapArray(a.getName);i.filterSelf(function(s){var l=i.getItemModel(s),u=l.getShallow(\"category\");if(u!=null){Mt(u)&&(u=o[u]);for(var f=0;f<e.length;f++)if(!e[f].isSelected(u))return!1}return!0})})}function M8(r){var e={};r.eachSeriesByType(\"graph\",function(t){var a=t.getCategoriesData(),n=t.getData(),i={};a.each(function(o){var s=a.getName(o);i[\"ec-\"+s]=o;var l=a.getItemModel(o),u=l.getModel(\"itemStyle\").getItemStyle();u.fill||(u.fill=t.getColorFromPalette(s,e)),a.setItemVisual(o,\"style\",u);for(var f=[\"symbol\",\"symbolSize\",\"symbolKeepAspect\"],h=0;h<f.length;h++){var v=l.getShallow(f[h],!0);v!=null&&a.setItemVisual(o,f[h],v)}}),a.count()&&n.each(function(o){var s=n.getItemModel(o),l=s.getShallow(\"category\");if(l!=null){U(l)&&(l=i[\"ec-\"+l]);var u=a.getItemVisual(l,\"style\"),f=n.ensureUniqueItemVisual(o,\"style\");V(f,u);for(var h=[\"symbol\",\"symbolSize\",\"symbolKeepAspect\"],v=0;v<h.length;v++)n.setItemVisual(o,h[v],a.getItemVisual(l,h[v]))}})})}function Pu(r){return r instanceof Array||(r=[r,r]),r}function L8(r){r.eachSeriesByType(\"graph\",function(e){var t=e.getGraph(),a=e.getEdgeData(),n=Pu(e.get(\"edgeSymbol\")),i=Pu(e.get(\"edgeSymbolSize\"));a.setVisual(\"fromSymbol\",n&&n[0]),a.setVisual(\"toSymbol\",n&&n[1]),a.setVisual(\"fromSymbolSize\",i&&i[0]),a.setVisual(\"toSymbolSize\",i&&i[1]),a.setVisual(\"style\",e.getModel(\"lineStyle\").getLineStyle()),a.each(function(o){var s=a.getItemModel(o),l=t.getEdgeByIndex(o),u=Pu(s.getShallow(\"symbol\",!0)),f=Pu(s.getShallow(\"symbolSize\",!0)),h=s.getModel(\"lineStyle\").getLineStyle(),v=a.ensureUniqueItemVisual(o,\"style\");switch(V(v,h),v.stroke){case\"source\":{var c=l.node1.getVisual(\"style\");v.stroke=c&&c.fill;break}case\"target\":{var c=l.node2.getVisual(\"style\");v.stroke=c&&c.fill;break}}u[0]&&l.setVisual(\"fromSymbol\",u[0]),u[1]&&l.setVisual(\"toSymbol\",u[1]),f[0]&&l.setVisual(\"fromSymbolSize\",f[0]),f[1]&&l.setVisual(\"toSymbolSize\",f[1])})})}var Op=\"-->\",Zh=function(r){return r.get(\"autoCurveness\")||null},FD=function(r,e){var t=Zh(r),a=20,n=[];if(Mt(t))a=t;else if(F(t)){r.__curvenessList=t;return}e>a&&(a=e);var i=a%2?a+2:a+3;n=[];for(var o=0;o<i;o++)n.push((o%2?o+1:o)/10*(o%2?-1:1));r.__curvenessList=n},fl=function(r,e,t){var a=[r.id,r.dataIndex].join(\".\"),n=[e.id,e.dataIndex].join(\".\");return[t.uid,a,n].join(Op)},GD=function(r){var e=r.split(Op);return[e[0],e[2],e[1]].join(Op)},I8=function(r,e){var t=fl(r.node1,r.node2,e);return e.__edgeMap[t]},P8=function(r,e){var t=Bp(fl(r.node1,r.node2,e),e),a=Bp(fl(r.node2,r.node1,e),e);return t+a},Bp=function(r,e){var t=e.__edgeMap;return t[r]?t[r].length:0};function R8(r){!Zh(r)||(r.__curvenessList=[],r.__edgeMap={},FD(r))}function E8(r,e,t,a){if(!!Zh(t)){var n=fl(r,e,t),i=t.__edgeMap,o=i[GD(n)];i[n]&&!o?i[n].isForward=!0:o&&i[n]&&(o.isForward=!0,i[n].isForward=!1),i[n]=i[n]||[],i[n].push(a)}}function Oy(r,e,t,a){var n=Zh(e),i=F(n);if(!n)return null;var o=I8(r,e);if(!o)return null;for(var s=-1,l=0;l<o.length;l++)if(o[l]===t){s=l;break}var u=P8(r,e);FD(e,u),r.lineStyle=r.lineStyle||{};var f=fl(r.node1,r.node2,e),h=e.__curvenessList,v=i||u%2?0:1;if(o.isForward)return h[v+s];var c=GD(f),d=Bp(c,e),p=h[s+d+v];return a?i?n&&n[0]===0?(d+v)%2?p:-p:((d%2?0:1)+v)%2?p:-p:(d+v)%2?p:-p:h[s+d+v]}function HD(r){var e=r.coordinateSystem;if(!(e&&e.type!==\"view\")){var t=r.getGraph();t.eachNode(function(a){var n=a.getModel();a.setLayout([+n.get(\"x\"),+n.get(\"y\")])}),By(t,r)}}function By(r,e){r.eachEdge(function(t,a){var n=Ur(t.getModel().get([\"lineStyle\",\"curveness\"]),-Oy(t,e,a,!0),0),i=fa(t.node1.getLayout()),o=fa(t.node2.getLayout()),s=[i,o];+n&&s.push([(i[0]+o[0])/2-(i[1]-o[1])*n,(i[1]+o[1])/2-(o[0]-i[0])*n]),t.setLayout(s)})}function k8(r,e){r.eachSeriesByType(\"graph\",function(t){var a=t.get(\"layout\"),n=t.coordinateSystem;if(n&&n.type!==\"view\"){var i=t.getData(),o=[];A(n.dimensions,function(v){o=o.concat(i.mapDimensionsAll(v))});for(var s=0;s<i.count();s++){for(var l=[],u=!1,f=0;f<o.length;f++){var h=i.get(o[f],s);isNaN(h)||(u=!0),l.push(h)}u?i.setItemLayout(s,n.dataToPoint(l)):i.setItemLayout(s,[NaN,NaN])}By(i.graph,t)}else(!a||a===\"none\")&&HD(t)})}function ws(r){var e=r.coordinateSystem;if(e.type!==\"view\")return 1;var t=r.option.nodeScaleRatio,a=e.scaleX,n=e.getZoom(),i=(n-1)*t+1;return i/a}function bs(r){var e=r.getVisual(\"symbolSize\");return e instanceof Array&&(e=(e[0]+e[1])/2),+e}var NS=Math.PI,Ac=[];function Ny(r,e,t,a){var n=r.coordinateSystem;if(!(n&&n.type!==\"view\")){var i=n.getBoundingRect(),o=r.getData(),s=o.graph,l=i.width/2+i.x,u=i.height/2+i.y,f=Math.min(i.width,i.height)/2,h=o.count();if(o.setLayout({cx:l,cy:u}),!!h){if(t){var v=n.pointToData(a),c=v[0],d=v[1],p=[c-l,d-u];wo(p,p),Zu(p,p,f),t.setLayout([l+p[0],u+p[1]],!0);var g=r.get([\"circular\",\"rotateLabel\"]);WD(t,g,l,u)}O8[e](r,s,o,f,l,u,h),s.eachEdge(function(y,m){var _=Ur(y.getModel().get([\"lineStyle\",\"curveness\"]),Oy(y,r,m),0),S=fa(y.node1.getLayout()),w=fa(y.node2.getLayout()),x,b=(S[0]+w[0])/2,C=(S[1]+w[1])/2;+_&&(_*=3,x=[l*_+b*(1-_),u*_+C*(1-_)]),y.setLayout([S,w,x])})}}}var O8={value:function(r,e,t,a,n,i,o){var s=0,l=t.getSum(\"value\"),u=Math.PI*2/(l||o);e.eachNode(function(f){var h=f.getValue(\"value\"),v=u*(l?h:1)/2;s+=v,f.setLayout([a*Math.cos(s)+n,a*Math.sin(s)+i]),s+=v})},symbolSize:function(r,e,t,a,n,i,o){var s=0;Ac.length=o;var l=ws(r);e.eachNode(function(h){var v=bs(h);isNaN(v)&&(v=2),v<0&&(v=0),v*=l;var c=Math.asin(v/2/a);isNaN(c)&&(c=NS/2),Ac[h.dataIndex]=c,s+=c*2});var u=(2*NS-s)/o/2,f=0;e.eachNode(function(h){var v=u+Ac[h.dataIndex];f+=v,(!h.getLayout()||!h.getLayout().fixed)&&h.setLayout([a*Math.cos(f)+n,a*Math.sin(f)+i]),f+=v})}};function WD(r,e,t,a){var n=r.getGraphicEl();if(!!n){var i=r.getModel(),o=i.get([\"label\",\"rotate\"])||0,s=n.getSymbolPath();if(e){var l=r.getLayout(),u=Math.atan2(l[1]-a,l[0]-t);u<0&&(u=Math.PI*2+u);var f=l[0]<t;f&&(u=u-Math.PI);var h=f?\"left\":\"right\";s.setTextConfig({rotation:-u,position:h,origin:\"center\"});var v=s.ensureState(\"emphasis\");V(v.textConfig||(v.textConfig={}),{position:h})}else s.setTextConfig({rotation:o*=Math.PI/180})}}function B8(r){r.eachSeriesByType(\"graph\",function(e){e.get(\"layout\")===\"circular\"&&Ny(e,\"symbolSize\")})}var Wi=Dd;function N8(r,e,t){for(var a=r,n=e,i=t.rect,o=i.width,s=i.height,l=[i.x+o/2,i.y+s/2],u=t.gravity==null?.1:t.gravity,f=0;f<a.length;f++){var h=a[f];h.p||(h.p=wi(o*(Math.random()-.5)+l[0],s*(Math.random()-.5)+l[1])),h.pp=fa(h.p),h.edges=null}var v=t.friction==null?.6:t.friction,c=v,d,p;return{warmUp:function(){c=v*.8},setFixed:function(g){a[g].fixed=!0},setUnfixed:function(g){a[g].fixed=!1},beforeStep:function(g){d=g},afterStep:function(g){p=g},step:function(g){d&&d(a,n);for(var y=[],m=a.length,_=0;_<n.length;_++){var S=n[_];if(!S.ignoreForceLayout){var w=S.n1,x=S.n2;qn(y,x.p,w.p);var b=Md(y)-S.d,C=x.w/(w.w+x.w);isNaN(C)&&(C=0),wo(y,y),!w.fixed&&Wi(w.p,w.p,y,C*b*c),!x.fixed&&Wi(x.p,x.p,y,-(1-C)*b*c)}}for(var _=0;_<m;_++){var T=a[_];T.fixed||(qn(y,l,T.p),Wi(T.p,T.p,y,u*c))}for(var _=0;_<m;_++)for(var w=a[_],D=_+1;D<m;D++){var x=a[D];qn(y,x.p,w.p);var b=Md(y);b===0&&(BR(y,Math.random()-.5,Math.random()-.5),b=1);var M=(w.rep+x.rep)/b/b;!w.fixed&&Wi(w.pp,w.pp,y,M),!x.fixed&&Wi(x.pp,x.pp,y,-M)}for(var L=[],_=0;_<m;_++){var T=a[_];T.fixed||(qn(L,T.p,T.pp),Wi(T.p,T.p,L,c),Ce(T.pp,T.p))}c=c*.992;var I=c<.01;p&&p(a,n,I),g&&g(I)}}}function V8(r){r.eachSeriesByType(\"graph\",function(e){var t=e.coordinateSystem;if(!(t&&t.type!==\"view\"))if(e.get(\"layout\")===\"force\"){var a=e.preservedPoints||{},n=e.getGraph(),i=n.data,o=n.edgeData,s=e.getModel(\"force\"),l=s.get(\"initLayout\");e.preservedPoints?i.each(function(_){var S=i.getId(_);i.setItemLayout(_,a[S]||[NaN,NaN])}):!l||l===\"none\"?HD(e):l===\"circular\"&&Ny(e,\"value\");var u=i.getDataExtent(\"value\"),f=o.getDataExtent(\"value\"),h=s.get(\"repulsion\"),v=s.get(\"edgeLength\"),c=F(h)?h:[h,h],d=F(v)?v:[v,v];d=[d[1],d[0]];var p=i.mapArray(\"value\",function(_,S){var w=i.getItemLayout(S),x=Rt(_,u,c);return isNaN(x)&&(x=(c[0]+c[1])/2),{w:x,rep:x,fixed:i.getItemModel(S).get(\"fixed\"),p:!w||isNaN(w[0])||isNaN(w[1])?null:w}}),g=o.mapArray(\"value\",function(_,S){var w=n.getEdgeByIndex(S),x=Rt(_,f,d);isNaN(x)&&(x=(d[0]+d[1])/2);var b=w.getModel(),C=Ur(w.getModel().get([\"lineStyle\",\"curveness\"]),-Oy(w,e,S,!0),0);return{n1:p[w.node1.dataIndex],n2:p[w.node2.dataIndex],d:x,curveness:C,ignoreForceLayout:b.get(\"ignoreForceLayout\")}}),y=t.getBoundingRect(),m=N8(p,g,{rect:y,gravity:s.get(\"gravity\"),friction:s.get(\"friction\")});m.beforeStep(function(_,S){for(var w=0,x=_.length;w<x;w++)_[w].fixed&&Ce(_[w].p,n.getNodeByIndex(w).getLayout())}),m.afterStep(function(_,S,w){for(var x=0,b=_.length;x<b;x++)_[x].fixed||n.getNodeByIndex(x).setLayout(_[x].p),a[i.getId(x)]=_[x].p;for(var x=0,b=S.length;x<b;x++){var C=S[x],T=n.getEdgeByIndex(x),D=C.n1.p,M=C.n2.p,L=T.getLayout();L=L?L.slice():[],L[0]=L[0]||[],L[1]=L[1]||[],Ce(L[0],D),Ce(L[1],M),+C.curveness&&(L[2]=[(D[0]+M[0])/2-(D[1]-M[1])*C.curveness,(D[1]+M[1])/2-(M[0]-D[0])*C.curveness]),T.setLayout(L)}}),e.forceLayout=m,e.preservedPoints=a,m.step()}else e.forceLayout=null})}function z8(r,e,t){var a=V(r.getBoxLayoutParams(),{aspect:t});return re(a,{width:e.getWidth(),height:e.getHeight()})}function F8(r,e){var t=[];return r.eachSeriesByType(\"graph\",function(a){var n=a.get(\"coordinateSystem\");if(!n||n===\"view\"){var i=a.getData(),o=i.mapArray(function(g){var y=i.getItemModel(g);return[+y.get(\"x\"),+y.get(\"y\")]}),s=[],l=[];xh(o,s,l),l[0]-s[0]===0&&(l[0]+=1,s[0]-=1),l[1]-s[1]===0&&(l[1]+=1,s[1]-=1);var u=(l[0]-s[0])/(l[1]-s[1]),f=z8(a,e,u);isNaN(u)&&(s=[f.x,f.y],l=[f.x+f.width,f.y+f.height]);var h=l[0]-s[0],v=l[1]-s[1],c=f.width,d=f.height,p=a.coordinateSystem=new zl;p.zoomLimit=a.get(\"scaleLimit\"),p.setBoundingRect(s[0],s[1],h,v),p.setViewRect(f.x,f.y,c,d),p.setCenter(a.get(\"center\"),e),p.setZoom(a.get(\"zoom\")),t.push(p)}}),t}var VS=ue.prototype,Dc=Th.prototype,$D=function(){function r(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.percent=1}return r}();(function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e})($D);function Mc(r){return isNaN(+r.cpx1)||isNaN(+r.cpy1)}var G8=function(r){k(e,r);function e(t){var a=r.call(this,t)||this;return a.type=\"ec-line\",a}return e.prototype.getDefaultStyle=function(){return{stroke:\"#000\",fill:null}},e.prototype.getDefaultShape=function(){return new $D},e.prototype.buildPath=function(t,a){Mc(a)?VS.buildPath.call(this,t,a):Dc.buildPath.call(this,t,a)},e.prototype.pointAt=function(t){return Mc(this.shape)?VS.pointAt.call(this,t):Dc.pointAt.call(this,t)},e.prototype.tangentAt=function(t){var a=this.shape,n=Mc(a)?[a.x2-a.x1,a.y2-a.y1]:Dc.tangentAt.call(this,t);return wo(n,n)},e}(mt),H8=G8,Lc=[\"fromSymbol\",\"toSymbol\"];function zS(r){return\"_\"+r+\"Type\"}function FS(r,e,t){var a=e.getItemVisual(t,r);if(!a||a===\"none\")return a;var n=e.getItemVisual(t,r+\"Size\"),i=e.getItemVisual(t,r+\"Rotate\"),o=e.getItemVisual(t,r+\"Offset\"),s=e.getItemVisual(t,r+\"KeepAspect\"),l=Bo(n),u=Ti(o||0,l);return a+l+u+(i||\"\")+(s||\"\")}function GS(r,e,t){var a=e.getItemVisual(t,r);if(!(!a||a===\"none\")){var n=e.getItemVisual(t,r+\"Size\"),i=e.getItemVisual(t,r+\"Rotate\"),o=e.getItemVisual(t,r+\"Offset\"),s=e.getItemVisual(t,r+\"KeepAspect\"),l=Bo(n),u=Ti(o||0,l),f=jt(a,-l[0]/2+u[0],-l[1]/2+u[1],l[0],l[1],null,s);return f.__specifiedRotation=i==null||isNaN(i)?void 0:+i*Math.PI/180||0,f.name=r,f}}function W8(r){var e=new H8({name:\"line\",subPixelOptimize:!0});return Np(e.shape,r),e}function Np(r,e){r.x1=e[0][0],r.y1=e[0][1],r.x2=e[1][0],r.y2=e[1][1],r.percent=1;var t=e[2];t?(r.cpx1=t[0],r.cpy1=t[1]):(r.cpx1=NaN,r.cpy1=NaN)}var $8=function(r){k(e,r);function e(t,a,n){var i=r.call(this)||this;return i._createLine(t,a,n),i}return e.prototype._createLine=function(t,a,n){var i=t.hostModel,o=t.getItemLayout(a),s=W8(o);s.shape.percent=0,Ft(s,{shape:{percent:1}},i,a),this.add(s),A(Lc,function(l){var u=GS(l,t,a);this.add(u),this[zS(l)]=FS(l,t,a)},this),this._updateCommonStl(t,a,n)},e.prototype.updateData=function(t,a,n){var i=t.hostModel,o=this.childOfName(\"line\"),s=t.getItemLayout(a),l={shape:{}};Np(l.shape,s),Lt(o,l,i,a),A(Lc,function(u){var f=FS(u,t,a),h=zS(u);if(this[h]!==f){this.remove(this.childOfName(u));var v=GS(u,t,a);this.add(v)}this[h]=f},this),this._updateCommonStl(t,a,n)},e.prototype.getLinePath=function(){return this.childAt(0)},e.prototype._updateCommonStl=function(t,a,n){var i=t.hostModel,o=this.childOfName(\"line\"),s=n&&n.emphasisLineStyle,l=n&&n.blurLineStyle,u=n&&n.selectLineStyle,f=n&&n.labelStatesModels,h=n&&n.emphasisDisabled,v=n&&n.focus,c=n&&n.blurScope;if(!n||t.hasItemOption){var d=t.getItemModel(a),p=d.getModel(\"emphasis\");s=p.getModel(\"lineStyle\").getLineStyle(),l=d.getModel([\"blur\",\"lineStyle\"]).getLineStyle(),u=d.getModel([\"select\",\"lineStyle\"]).getLineStyle(),h=p.get(\"disabled\"),v=p.get(\"focus\"),c=p.get(\"blurScope\"),f=ie(d)}var g=t.getItemVisual(a,\"style\"),y=g.stroke;o.useStyle(g),o.style.fill=null,o.style.strokeNoScale=!0,o.ensureState(\"emphasis\").style=s,o.ensureState(\"blur\").style=l,o.ensureState(\"select\").style=u,A(Lc,function(x){var b=this.childOfName(x);if(b){b.setColor(y),b.style.opacity=g.opacity;for(var C=0;C<Le.length;C++){var T=Le[C],D=o.getState(T);if(D){var M=D.style||{},L=b.ensureState(T),I=L.style||(L.style={});M.stroke!=null&&(I[b.__isEmptyBrush?\"stroke\":\"fill\"]=M.stroke),M.opacity!=null&&(I.opacity=M.opacity)}}b.markRedraw()}},this);var m=i.getRawValue(a);de(this,f,{labelDataIndex:a,labelFetcher:{getFormattedLabel:function(x,b){return i.getFormattedLabel(x,b,t.dataType)}},inheritColor:y||\"#000\",defaultOpacity:g.opacity,defaultText:(m==null?t.getName(a):isFinite(m)?Zt(m):m)+\"\"});var _=this.getTextContent();if(_){var S=f.normal;_.__align=_.style.align,_.__verticalAlign=_.style.verticalAlign,_.__position=S.get(\"position\")||\"middle\";var w=S.get(\"distance\");F(w)||(w=[w,w]),_.__labelDistance=w}this.setTextConfig({position:null,local:!0,inside:!1}),$t(this,v,c,h)},e.prototype.highlight=function(){_a(this)},e.prototype.downplay=function(){Sa(this)},e.prototype.updateLayout=function(t,a){this.setLinePoints(t.getItemLayout(a))},e.prototype.setLinePoints=function(t){var a=this.childOfName(\"line\");Np(a.shape,t),a.dirty()},e.prototype.beforeUpdate=function(){var t=this,a=t.childOfName(\"fromSymbol\"),n=t.childOfName(\"toSymbol\"),i=t.getTextContent();if(!a&&!n&&(!i||i.ignore))return;for(var o=1,s=this.parent;s;)s.scaleX&&(o/=s.scaleX),s=s.parent;var l=t.childOfName(\"line\");if(!this.__dirty&&!l.__dirty)return;var u=l.shape.percent,f=l.pointAt(0),h=l.pointAt(u),v=qn([],h,f);wo(v,v);function c(D,M){var L=D.__specifiedRotation;if(L==null){var I=l.tangentAt(M);D.attr(\"rotation\",(M===1?-1:1)*Math.PI/2-Math.atan2(I[1],I[0]))}else D.attr(\"rotation\",L)}if(a&&(a.setPosition(f),c(a,0),a.scaleX=a.scaleY=o*u,a.markRedraw()),n&&(n.setPosition(h),c(n,1),n.scaleX=n.scaleY=o*u,n.markRedraw()),i&&!i.ignore){i.x=i.y=0,i.originX=i.originY=0;var d=void 0,p=void 0,g=i.__labelDistance,y=g[0]*o,m=g[1]*o,_=u/2,S=l.tangentAt(_),w=[S[1],-S[0]],x=l.pointAt(_);w[1]>0&&(w[0]=-w[0],w[1]=-w[1]);var b=S[0]<0?-1:1;if(i.__position!==\"start\"&&i.__position!==\"end\"){var C=-Math.atan2(S[1],S[0]);h[0]<f[0]&&(C=Math.PI+C),i.rotation=C}var T=void 0;switch(i.__position){case\"insideStartTop\":case\"insideMiddleTop\":case\"insideEndTop\":case\"middle\":T=-m,p=\"bottom\";break;case\"insideStartBottom\":case\"insideMiddleBottom\":case\"insideEndBottom\":T=m,p=\"top\";break;default:T=0,p=\"middle\"}switch(i.__position){case\"end\":i.x=v[0]*y+h[0],i.y=v[1]*m+h[1],d=v[0]>.8?\"left\":v[0]<-.8?\"right\":\"center\",p=v[1]>.8?\"top\":v[1]<-.8?\"bottom\":\"middle\";break;case\"start\":i.x=-v[0]*y+f[0],i.y=-v[1]*m+f[1],d=v[0]>.8?\"right\":v[0]<-.8?\"left\":\"center\",p=v[1]>.8?\"bottom\":v[1]<-.8?\"top\":\"middle\";break;case\"insideStartTop\":case\"insideStart\":case\"insideStartBottom\":i.x=y*b+f[0],i.y=f[1]+T,d=S[0]<0?\"right\":\"left\",i.originX=-y*b,i.originY=-T;break;case\"insideMiddleTop\":case\"insideMiddle\":case\"insideMiddleBottom\":case\"middle\":i.x=x[0],i.y=x[1]+T,d=\"center\",i.originY=-T;break;case\"insideEndTop\":case\"insideEnd\":case\"insideEndBottom\":i.x=-y*b+h[0],i.y=h[1]+T,d=S[0]>=0?\"right\":\"left\",i.originX=y*b,i.originY=-T;break}i.scaleX=i.scaleY=o,i.setStyle({verticalAlign:i.__verticalAlign||p,align:i.__align||d})}},e}(nt),Vy=$8,U8=function(){function r(e){this.group=new nt,this._LineCtor=e||Vy}return r.prototype.updateData=function(e){var t=this;this._progressiveEls=null;var a=this,n=a.group,i=a._lineData;a._lineData=e,i||n.removeAll();var o=HS(e);e.diff(i).add(function(s){t._doAdd(e,s,o)}).update(function(s,l){t._doUpdate(i,e,l,s,o)}).remove(function(s){n.remove(i.getItemGraphicEl(s))}).execute()},r.prototype.updateLayout=function(){var e=this._lineData;!e||e.eachItemGraphicEl(function(t,a){t.updateLayout(e,a)},this)},r.prototype.incrementalPrepareUpdate=function(e){this._seriesScope=HS(e),this._lineData=null,this.group.removeAll()},r.prototype.incrementalUpdate=function(e,t){this._progressiveEls=[];function a(s){!s.isGroup&&!Y8(s)&&(s.incremental=!0,s.ensureState(\"emphasis\").hoverLayer=!0)}for(var n=e.start;n<e.end;n++){var i=t.getItemLayout(n);if(Ic(i)){var o=new this._LineCtor(t,n,this._seriesScope);o.traverse(a),this.group.add(o),t.setItemGraphicEl(n,o),this._progressiveEls.push(o)}}},r.prototype.remove=function(){this.group.removeAll()},r.prototype.eachRendered=function(e){vn(this._progressiveEls||this.group,e)},r.prototype._doAdd=function(e,t,a){var n=e.getItemLayout(t);if(!!Ic(n)){var i=new this._LineCtor(e,t,a);e.setItemGraphicEl(t,i),this.group.add(i)}},r.prototype._doUpdate=function(e,t,a,n,i){var o=e.getItemGraphicEl(a);if(!Ic(t.getItemLayout(n))){this.group.remove(o);return}o?o.updateData(t,n,i):o=new this._LineCtor(t,n,i),t.setItemGraphicEl(n,o),this.group.add(o)},r}();function Y8(r){return r.animators&&r.animators.length>0}function HS(r){var e=r.hostModel,t=e.getModel(\"emphasis\");return{lineStyle:e.getModel(\"lineStyle\").getLineStyle(),emphasisLineStyle:t.getModel([\"lineStyle\"]).getLineStyle(),blurLineStyle:e.getModel([\"blur\",\"lineStyle\"]).getLineStyle(),selectLineStyle:e.getModel([\"select\",\"lineStyle\"]).getLineStyle(),emphasisDisabled:t.get(\"disabled\"),blurScope:t.get(\"blurScope\"),focus:t.get(\"focus\"),labelStatesModels:ie(e)}}function WS(r){return isNaN(r[0])||isNaN(r[1])}function Ic(r){return r&&!WS(r[0])&&!WS(r[1])}var zy=U8,Pc=[],Rc=[],Ec=[],$i=se,kc=ai,$S=Math.abs;function US(r,e,t){for(var a=r[0],n=r[1],i=r[2],o=1/0,s,l=t*t,u=.1,f=.1;f<=.9;f+=.1){Pc[0]=$i(a[0],n[0],i[0],f),Pc[1]=$i(a[1],n[1],i[1],f);var h=$S(kc(Pc,e)-l);h<o&&(o=h,s=f)}for(var v=0;v<32;v++){var c=s+u;Rc[0]=$i(a[0],n[0],i[0],s),Rc[1]=$i(a[1],n[1],i[1],s),Ec[0]=$i(a[0],n[0],i[0],c),Ec[1]=$i(a[1],n[1],i[1],c);var h=kc(Rc,e)-l;if($S(h)<.01)break;var d=kc(Ec,e)-l;u/=2,h<0?d>=0?s=s+u:s=s-u:d>=0?s=s-u:s=s+u}return s}function Oc(r,e){var t=[],a=$s,n=[[],[],[]],i=[[],[]],o=[];e/=2,r.eachEdge(function(s,l){var u=s.getLayout(),f=s.getVisual(\"fromSymbol\"),h=s.getVisual(\"toSymbol\");u.__original||(u.__original=[fa(u[0]),fa(u[1])],u[2]&&u.__original.push(fa(u[2])));var v=u.__original;if(u[2]!=null){if(Ce(n[0],v[0]),Ce(n[1],v[2]),Ce(n[2],v[1]),f&&f!==\"none\"){var c=bs(s.node1),d=US(n,v[0],c*e);a(n[0][0],n[1][0],n[2][0],d,t),n[0][0]=t[3],n[1][0]=t[4],a(n[0][1],n[1][1],n[2][1],d,t),n[0][1]=t[3],n[1][1]=t[4]}if(h&&h!==\"none\"){var c=bs(s.node2),d=US(n,v[1],c*e);a(n[0][0],n[1][0],n[2][0],d,t),n[1][0]=t[1],n[2][0]=t[2],a(n[0][1],n[1][1],n[2][1],d,t),n[1][1]=t[1],n[2][1]=t[2]}Ce(u[0],n[0]),Ce(u[1],n[2]),Ce(u[2],n[1])}else{if(Ce(i[0],v[0]),Ce(i[1],v[1]),qn(o,i[1],i[0]),wo(o,o),f&&f!==\"none\"){var c=bs(s.node1);Dd(i[0],i[0],o,c*e)}if(h&&h!==\"none\"){var c=bs(s.node2);Dd(i[1],i[1],o,-c*e)}Ce(u[0],i[0]),Ce(u[1],i[1])}})}function YS(r){return r.type===\"view\"}var Z8=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.init=function(t,a){var n=new kl,i=new zy,o=this.group;this._controller=new Vl(a.getZr()),this._controllerHost={target:o},o.add(n.group),o.add(i.group),this._symbolDraw=n,this._lineDraw=i,this._firstRender=!0},e.prototype.render=function(t,a,n){var i=this,o=t.coordinateSystem;this._model=t;var s=this._symbolDraw,l=this._lineDraw,u=this.group;if(YS(o)){var f={x:o.x,y:o.y,scaleX:o.scaleX,scaleY:o.scaleY};this._firstRender?u.attr(f):Lt(u,f,t)}Oc(t.getGraph(),ws(t));var h=t.getData();s.updateData(h);var v=t.getEdgeData();l.updateData(v),this._updateNodeAndLinkScale(),this._updateController(t,a,n),clearTimeout(this._layoutTimeout);var c=t.forceLayout,d=t.get([\"force\",\"layoutAnimation\"]);c&&this._startForceLayoutIteration(c,d);var p=t.get(\"layout\");h.graph.eachNode(function(_){var S=_.dataIndex,w=_.getGraphicEl(),x=_.getModel();if(!!w){w.off(\"drag\").off(\"dragend\");var b=x.get(\"draggable\");b&&w.on(\"drag\",function(T){switch(p){case\"force\":c.warmUp(),!i._layouting&&i._startForceLayoutIteration(c,d),c.setFixed(S),h.setItemLayout(S,[w.x,w.y]);break;case\"circular\":h.setItemLayout(S,[w.x,w.y]),_.setLayout({fixed:!0},!0),Ny(t,\"symbolSize\",_,[T.offsetX,T.offsetY]),i.updateLayout(t);break;case\"none\":default:h.setItemLayout(S,[w.x,w.y]),By(t.getGraph(),t),i.updateLayout(t);break}}).on(\"dragend\",function(){c&&c.setUnfixed(S)}),w.setDraggable(b,!!x.get(\"cursor\"));var C=x.get([\"emphasis\",\"focus\"]);C===\"adjacency\"&&(it(w).focus=_.getAdjacentDataIndices())}}),h.graph.eachEdge(function(_){var S=_.getGraphicEl(),w=_.getModel().get([\"emphasis\",\"focus\"]);!S||w===\"adjacency\"&&(it(S).focus={edge:[_.dataIndex],node:[_.node1.dataIndex,_.node2.dataIndex]})});var g=t.get(\"layout\")===\"circular\"&&t.get([\"circular\",\"rotateLabel\"]),y=h.getLayout(\"cx\"),m=h.getLayout(\"cy\");h.graph.eachNode(function(_){WD(_,g,y,m)}),this._firstRender=!1},e.prototype.dispose=function(){this._controller&&this._controller.dispose(),this._controllerHost=null},e.prototype._startForceLayoutIteration=function(t,a){var n=this;(function i(){t.step(function(o){n.updateLayout(n._model),(n._layouting=!o)&&(a?n._layoutTimeout=setTimeout(i,16):i())})})()},e.prototype._updateController=function(t,a,n){var i=this,o=this._controller,s=this._controllerHost,l=this.group;if(o.setPointerChecker(function(u,f,h){var v=l.getBoundingRect();return v.applyTransform(l.transform),v.contain(f,h)&&!$h(u,n,t)}),!YS(t.coordinateSystem)){o.disable();return}o.enable(t.get(\"roam\")),s.zoomLimit=t.get(\"scaleLimit\"),s.zoom=t.coordinateSystem.getZoom(),o.off(\"pan\").off(\"zoom\").on(\"pan\",function(u){Ay(s,u.dx,u.dy),n.dispatchAction({seriesId:t.id,type:\"graphRoam\",dx:u.dx,dy:u.dy})}).on(\"zoom\",function(u){Dy(s,u.scale,u.originX,u.originY),n.dispatchAction({seriesId:t.id,type:\"graphRoam\",zoom:u.scale,originX:u.originX,originY:u.originY}),i._updateNodeAndLinkScale(),Oc(t.getGraph(),ws(t)),i._lineDraw.updateLayout(),n.updateLabelLayout()})},e.prototype._updateNodeAndLinkScale=function(){var t=this._model,a=t.getData(),n=ws(t);a.eachItemGraphicEl(function(i,o){i&&i.setSymbolScale(n)})},e.prototype.updateLayout=function(t){Oc(t.getGraph(),ws(t)),this._symbolDraw.updateLayout(),this._lineDraw.updateLayout()},e.prototype.remove=function(t,a){this._symbolDraw&&this._symbolDraw.remove(),this._lineDraw&&this._lineDraw.remove()},e.type=\"graph\",e}(zt),X8=Z8;function Ui(r){return\"_EC_\"+r}var q8=function(){function r(e){this.type=\"graph\",this.nodes=[],this.edges=[],this._nodesMap={},this._edgesMap={},this._directed=e||!1}return r.prototype.isDirected=function(){return this._directed},r.prototype.addNode=function(e,t){e=e==null?\"\"+t:\"\"+e;var a=this._nodesMap;if(!a[Ui(e)]){var n=new Hn(e,t);return n.hostGraph=this,this.nodes.push(n),a[Ui(e)]=n,n}},r.prototype.getNodeByIndex=function(e){var t=this.data.getRawIndex(e);return this.nodes[t]},r.prototype.getNodeById=function(e){return this._nodesMap[Ui(e)]},r.prototype.addEdge=function(e,t,a){var n=this._nodesMap,i=this._edgesMap;if(Mt(e)&&(e=this.nodes[e]),Mt(t)&&(t=this.nodes[t]),e instanceof Hn||(e=n[Ui(e)]),t instanceof Hn||(t=n[Ui(t)]),!(!e||!t)){var o=e.id+\"-\"+t.id,s=new UD(e,t,a);return s.hostGraph=this,this._directed&&(e.outEdges.push(s),t.inEdges.push(s)),e.edges.push(s),e!==t&&t.edges.push(s),this.edges.push(s),i[o]=s,s}},r.prototype.getEdgeByIndex=function(e){var t=this.edgeData.getRawIndex(e);return this.edges[t]},r.prototype.getEdge=function(e,t){e instanceof Hn&&(e=e.id),t instanceof Hn&&(t=t.id);var a=this._edgesMap;return this._directed?a[e+\"-\"+t]:a[e+\"-\"+t]||a[t+\"-\"+e]},r.prototype.eachNode=function(e,t){for(var a=this.nodes,n=a.length,i=0;i<n;i++)a[i].dataIndex>=0&&e.call(t,a[i],i)},r.prototype.eachEdge=function(e,t){for(var a=this.edges,n=a.length,i=0;i<n;i++)a[i].dataIndex>=0&&a[i].node1.dataIndex>=0&&a[i].node2.dataIndex>=0&&e.call(t,a[i],i)},r.prototype.breadthFirstTraverse=function(e,t,a,n){if(t instanceof Hn||(t=this._nodesMap[Ui(t)]),!!t){for(var i=a===\"out\"?\"outEdges\":a===\"in\"?\"inEdges\":\"edges\",o=0;o<this.nodes.length;o++)this.nodes[o].__visited=!1;if(!e.call(n,t,null))for(var s=[t];s.length;)for(var l=s.shift(),u=l[i],o=0;o<u.length;o++){var f=u[o],h=f.node1===l?f.node2:f.node1;if(!h.__visited){if(e.call(n,h,l))return;s.push(h),h.__visited=!0}}}},r.prototype.update=function(){for(var e=this.data,t=this.edgeData,a=this.nodes,n=this.edges,i=0,o=a.length;i<o;i++)a[i].dataIndex=-1;for(var i=0,o=e.count();i<o;i++)a[e.getRawIndex(i)].dataIndex=i;t.filterSelf(function(s){var l=n[t.getRawIndex(s)];return l.node1.dataIndex>=0&&l.node2.dataIndex>=0});for(var i=0,o=n.length;i<o;i++)n[i].dataIndex=-1;for(var i=0,o=t.count();i<o;i++)n[t.getRawIndex(i)].dataIndex=i},r.prototype.clone=function(){for(var e=new r(this._directed),t=this.nodes,a=this.edges,n=0;n<t.length;n++)e.addNode(t[n].id,t[n].dataIndex);for(var n=0;n<a.length;n++){var i=a[n];e.addEdge(i.node1.id,i.node2.id,i.dataIndex)}return e},r}(),Hn=function(){function r(e,t){this.inEdges=[],this.outEdges=[],this.edges=[],this.dataIndex=-1,this.id=e==null?\"\":e,this.dataIndex=t==null?-1:t}return r.prototype.degree=function(){return this.edges.length},r.prototype.inDegree=function(){return this.inEdges.length},r.prototype.outDegree=function(){return this.outEdges.length},r.prototype.getModel=function(e){if(!(this.dataIndex<0)){var t=this.hostGraph,a=t.data.getItemModel(this.dataIndex);return a.getModel(e)}},r.prototype.getAdjacentDataIndices=function(){for(var e={edge:[],node:[]},t=0;t<this.edges.length;t++){var a=this.edges[t];a.dataIndex<0||(e.edge.push(a.dataIndex),e.node.push(a.node1.dataIndex,a.node2.dataIndex))}return e},r.prototype.getTrajectoryDataIndices=function(){for(var e=q(),t=q(),a=0;a<this.edges.length;a++){var n=this.edges[a];if(!(n.dataIndex<0)){e.set(n.dataIndex,!0);for(var i=[n.node1],o=[n.node2],s=0;s<i.length;){var l=i[s];s++,t.set(l.dataIndex,!0);for(var u=0;u<l.inEdges.length;u++)e.set(l.inEdges[u].dataIndex,!0),i.push(l.inEdges[u].node1)}for(s=0;s<o.length;){var f=o[s];s++,t.set(f.dataIndex,!0);for(var u=0;u<f.outEdges.length;u++)e.set(f.outEdges[u].dataIndex,!0),o.push(f.outEdges[u].node2)}}}return{edge:e.keys(),node:t.keys()}},r}(),UD=function(){function r(e,t,a){this.dataIndex=-1,this.node1=e,this.node2=t,this.dataIndex=a==null?-1:a}return r.prototype.getModel=function(e){if(!(this.dataIndex<0)){var t=this.hostGraph,a=t.edgeData.getItemModel(this.dataIndex);return a.getModel(e)}},r.prototype.getAdjacentDataIndices=function(){return{edge:[this.dataIndex],node:[this.node1.dataIndex,this.node2.dataIndex]}},r.prototype.getTrajectoryDataIndices=function(){var e=q(),t=q();e.set(this.dataIndex,!0);for(var a=[this.node1],n=[this.node2],i=0;i<a.length;){var o=a[i];i++,t.set(o.dataIndex,!0);for(var s=0;s<o.inEdges.length;s++)e.set(o.inEdges[s].dataIndex,!0),a.push(o.inEdges[s].node1)}for(i=0;i<n.length;){var l=n[i];i++,t.set(l.dataIndex,!0);for(var s=0;s<l.outEdges.length;s++)e.set(l.outEdges[s].dataIndex,!0),n.push(l.outEdges[s].node2)}return{edge:e.keys(),node:t.keys()}},r}();function YD(r,e){return{getValue:function(t){var a=this[r][e];return a.getStore().get(a.getDimensionIndex(t||\"value\"),this.dataIndex)},setVisual:function(t,a){this.dataIndex>=0&&this[r][e].setItemVisual(this.dataIndex,t,a)},getVisual:function(t){return this[r][e].getItemVisual(this.dataIndex,t)},setLayout:function(t,a){this.dataIndex>=0&&this[r][e].setItemLayout(this.dataIndex,t,a)},getLayout:function(){return this[r][e].getItemLayout(this.dataIndex)},getGraphicEl:function(){return this[r][e].getItemGraphicEl(this.dataIndex)},getRawIndex:function(){return this[r][e].getRawIndex(this.dataIndex)}}}te(Hn,YD(\"hostGraph\",\"data\"));te(UD,YD(\"hostGraph\",\"edgeData\"));var K8=q8;function ZD(r,e,t,a,n){for(var i=new K8(a),o=0;o<r.length;o++)i.addNode(le(r[o].id,r[o].name,o),o);for(var s=[],l=[],u=0,o=0;o<e.length;o++){var f=e[o],h=f.source,v=f.target;i.addEdge(h,v,u)&&(l.push(f),s.push(le(ee(f.id,null),h+\" > \"+v)),u++)}var c=t.get(\"coordinateSystem\"),d;if(c===\"cartesian2d\"||c===\"polar\")d=Ta(r,t);else{var p=Ml.get(c),g=p?p.dimensions||[]:[];dt(g,\"value\")<0&&g.concat([\"value\"]);var y=Il(r,{coordDimensions:g,encodeDefine:t.getEncode()}).dimensions;d=new De(y,t),d.initData(r)}var m=new De([\"value\"],t);return m.initData(l,s),n&&n(d,m),MD({mainData:d,struct:i,structAttr:\"graph\",datas:{node:d,edge:m},datasAttr:{node:\"data\",edge:\"edgeData\"}}),i.update(),i}var J8=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.hasSymbolVisual=!0,t}return e.prototype.init=function(t){r.prototype.init.apply(this,arguments);var a=this;function n(){return a._categoriesData}this.legendVisualProvider=new Nl(n,n),this.fillDataTextStyle(t.edges||t.links),this._updateCategoriesData()},e.prototype.mergeOption=function(t){r.prototype.mergeOption.apply(this,arguments),this.fillDataTextStyle(t.edges||t.links),this._updateCategoriesData()},e.prototype.mergeDefaultAndTheme=function(t){r.prototype.mergeDefaultAndTheme.apply(this,arguments),ci(t,\"edgeLabel\",[\"show\"])},e.prototype.getInitialData=function(t,a){var n=t.edges||t.links||[],i=t.data||t.nodes||[],o=this;if(i&&n){R8(this);var s=ZD(i,n,this,!0,l);return A(s.edges,function(u){E8(u.node1,u.node2,this,u.dataIndex)},this),s.data}function l(u,f){u.wrapMethod(\"getItemModel\",function(d){var p=o._categoriesModels,g=d.getShallow(\"category\"),y=p[g];return y&&(y.parentModel=d.parentModel,d.parentModel=y),d});var h=Vt.prototype.getModel;function v(d,p){var g=h.call(this,d,p);return g.resolveParentPath=c,g}f.wrapMethod(\"getItemModel\",function(d){return d.resolveParentPath=c,d.getModel=v,d});function c(d){if(d&&(d[0]===\"label\"||d[1]===\"label\")){var p=d.slice();return d[0]===\"label\"?p[0]=\"edgeLabel\":d[1]===\"label\"&&(p[1]=\"edgeLabel\"),p}return d}}},e.prototype.getGraph=function(){return this.getData().graph},e.prototype.getEdgeData=function(){return this.getGraph().edgeData},e.prototype.getCategoriesData=function(){return this._categoriesData},e.prototype.formatTooltip=function(t,a,n){if(n===\"edge\"){var i=this.getData(),o=this.getDataParams(t,n),s=i.graph.getEdgeByIndex(t),l=i.getName(s.node1.dataIndex),u=i.getName(s.node2.dataIndex),f=[];return l!=null&&f.push(l),u!=null&&f.push(u),oe(\"nameValue\",{name:f.join(\" > \"),value:o.value,noValue:o.value==null})}var h=DT({series:this,dataIndex:t,multipleSeries:a});return h},e.prototype._updateCategoriesData=function(){var t=G(this.option.categories||[],function(n){return n.value!=null?n:V({value:0},n)}),a=new De([\"value\"],this);a.initData(t),this._categoriesData=a,this._categoriesModels=a.mapArray(function(n){return a.getItemModel(n)})},e.prototype.setZoom=function(t){this.option.zoom=t},e.prototype.setCenter=function(t){this.option.center=t},e.prototype.isAnimationEnabled=function(){return r.prototype.isAnimationEnabled.call(this)&&!(this.get(\"layout\")===\"force\"&&this.get([\"force\",\"layoutAnimation\"]))},e.type=\"series.graph\",e.dependencies=[\"grid\",\"polar\",\"geo\",\"singleAxis\",\"calendar\"],e.defaultOption={z:2,coordinateSystem:\"view\",legendHoverLink:!0,layout:null,circular:{rotateLabel:!1},force:{initLayout:null,repulsion:[0,50],gravity:.1,friction:.6,edgeLength:30,layoutAnimation:!0},left:\"center\",top:\"center\",symbol:\"circle\",symbolSize:10,edgeSymbol:[\"none\",\"none\"],edgeSymbolSize:10,edgeLabel:{position:\"middle\",distance:5},draggable:!1,roam:!1,center:null,zoom:1,nodeScaleRatio:.6,label:{show:!1,formatter:\"{b}\"},itemStyle:{},lineStyle:{color:\"#aaa\",width:1,opacity:.5},emphasis:{scale:!0,label:{show:!0}},select:{itemStyle:{borderColor:\"#212121\"}}},e}(Ht),Q8=J8,j8={type:\"graphRoam\",event:\"graphRoam\",update:\"none\"};function tF(r){r.registerChartView(X8),r.registerSeriesModel(Q8),r.registerProcessor(D8),r.registerVisual(M8),r.registerVisual(L8),r.registerLayout(k8),r.registerLayout(r.PRIORITY.VISUAL.POST_CHART_LAYOUT,B8),r.registerLayout(V8),r.registerCoordinateSystem(\"graphView\",{dimensions:zl.dimensions,create:F8}),r.registerAction({type:\"focusNodeAdjacency\",event:\"focusNodeAdjacency\",update:\"series:focusNodeAdjacency\"},Kt),r.registerAction({type:\"unfocusNodeAdjacency\",event:\"unfocusNodeAdjacency\",update:\"series:unfocusNodeAdjacency\"},Kt),r.registerAction(j8,function(e,t,a){t.eachComponent({mainType:\"series\",query:e},function(n){var i=n.coordinateSystem,o=Ly(i,e,void 0,a);n.setCenter&&n.setCenter(o.center),n.setZoom&&n.setZoom(o.zoom)})})}var eF=function(){function r(){this.angle=0,this.width=10,this.r=10,this.x=0,this.y=0}return r}(),rF=function(r){k(e,r);function e(t){var a=r.call(this,t)||this;return a.type=\"pointer\",a}return e.prototype.getDefaultShape=function(){return new eF},e.prototype.buildPath=function(t,a){var n=Math.cos,i=Math.sin,o=a.r,s=a.width,l=a.angle,u=a.x-n(l)*s*(s>=o/3?1:2),f=a.y-i(l)*s*(s>=o/3?1:2);l=a.angle-Math.PI/2,t.moveTo(u,f),t.lineTo(a.x+n(l)*s,a.y+i(l)*s),t.lineTo(a.x+n(a.angle)*o,a.y+i(a.angle)*o),t.lineTo(a.x-n(l)*s,a.y-i(l)*s),t.lineTo(u,f)},e}(mt),aF=rF;function nF(r,e){var t=r.get(\"center\"),a=e.getWidth(),n=e.getHeight(),i=Math.min(a,n),o=W(t[0],e.getWidth()),s=W(t[1],e.getHeight()),l=W(r.get(\"radius\"),i/2);return{cx:o,cy:s,r:l}}function Ru(r,e){var t=r==null?\"\":r+\"\";return e&&(U(e)?t=e.replace(\"{value}\",t):J(e)&&(t=e(r))),t}var iF=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n){this.group.removeAll();var i=t.get([\"axisLine\",\"lineStyle\",\"color\"]),o=nF(t,n);this._renderMain(t,a,n,i,o),this._data=t.getData()},e.prototype.dispose=function(){},e.prototype._renderMain=function(t,a,n,i,o){var s=this.group,l=t.get(\"clockwise\"),u=-t.get(\"startAngle\")/180*Math.PI,f=-t.get(\"endAngle\")/180*Math.PI,h=t.getModel(\"axisLine\"),v=h.get(\"roundCap\"),c=v?Uf:Ve,d=h.get(\"show\"),p=h.getModel(\"lineStyle\"),g=p.get(\"width\"),y=[u,f];N2(y,!l),u=y[0],f=y[1];for(var m=f-u,_=u,S=[],w=0;d&&w<i.length;w++){var x=Math.min(Math.max(i[w][0],0),1);f=u+m*x;var b=new c({shape:{startAngle:_,endAngle:f,cx:o.cx,cy:o.cy,clockwise:l,r0:o.r-g,r:o.r},silent:!0});b.setStyle({fill:i[w][1]}),b.setStyle(p.getLineStyle([\"color\",\"width\"])),S.push(b),_=f}S.reverse(),A(S,function(T){return s.add(T)});var C=function(T){if(T<=0)return i[0][1];var D;for(D=0;D<i.length;D++)if(i[D][0]>=T&&(D===0?0:i[D-1][0])<T)return i[D][1];return i[D-1][1]};this._renderTicks(t,a,n,C,o,u,f,l,g),this._renderTitleAndDetail(t,a,n,C,o),this._renderAnchor(t,o),this._renderPointer(t,a,n,C,o,u,f,l,g)},e.prototype._renderTicks=function(t,a,n,i,o,s,l,u,f){for(var h=this.group,v=o.cx,c=o.cy,d=o.r,p=+t.get(\"min\"),g=+t.get(\"max\"),y=t.getModel(\"splitLine\"),m=t.getModel(\"axisTick\"),_=t.getModel(\"axisLabel\"),S=t.get(\"splitNumber\"),w=m.get(\"splitNumber\"),x=W(y.get(\"length\"),d),b=W(m.get(\"length\"),d),C=s,T=(l-s)/S,D=T/w,M=y.getModel(\"lineStyle\").getLineStyle(),L=m.getModel(\"lineStyle\").getLineStyle(),I=y.get(\"distance\"),P,R,E=0;E<=S;E++){if(P=Math.cos(C),R=Math.sin(C),y.get(\"show\")){var B=I?I+f:f,O=new ue({shape:{x1:P*(d-B)+v,y1:R*(d-B)+c,x2:P*(d-x-B)+v,y2:R*(d-x-B)+c},style:M,silent:!0});M.stroke===\"auto\"&&O.setStyle({stroke:i(E/S)}),h.add(O)}if(_.get(\"show\")){var B=_.get(\"distance\")+I,z=Ru(Zt(E/S*(g-p)+p),_.get(\"formatter\")),H=i(E/S),$=P*(d-x-B)+v,X=R*(d-x-B)+c,Q=_.get(\"rotate\"),j=0;Q===\"radial\"?(j=-C+2*Math.PI,j>Math.PI/2&&(j+=Math.PI)):Q===\"tangential\"?j=-C-Math.PI/2:Mt(Q)&&(j=Q*Math.PI/180),j===0?h.add(new Dt({style:Nt(_,{text:z,x:$,y:X,verticalAlign:R<-.8?\"top\":R>.8?\"bottom\":\"middle\",align:P<-.4?\"left\":P>.4?\"right\":\"center\"},{inheritColor:H}),silent:!0})):h.add(new Dt({style:Nt(_,{text:z,x:$,y:X,verticalAlign:\"middle\",align:\"center\"},{inheritColor:H}),silent:!0,originX:$,originY:X,rotation:j}))}if(m.get(\"show\")&&E!==S){var B=m.get(\"distance\");B=B?B+f:f;for(var pt=0;pt<=w;pt++){P=Math.cos(C),R=Math.sin(C);var xt=new ue({shape:{x1:P*(d-B)+v,y1:R*(d-B)+c,x2:P*(d-b-B)+v,y2:R*(d-b-B)+c},silent:!0,style:L});L.stroke===\"auto\"&&xt.setStyle({stroke:i((E+pt/w)/S)}),h.add(xt),C+=D}C-=D}else C+=T}},e.prototype._renderPointer=function(t,a,n,i,o,s,l,u,f){var h=this.group,v=this._data,c=this._progressEls,d=[],p=t.get([\"pointer\",\"show\"]),g=t.getModel(\"progress\"),y=g.get(\"show\"),m=t.getData(),_=m.mapDimension(\"value\"),S=+t.get(\"min\"),w=+t.get(\"max\"),x=[S,w],b=[s,l];function C(D,M){var L=m.getItemModel(D),I=L.getModel(\"pointer\"),P=W(I.get(\"width\"),o.r),R=W(I.get(\"length\"),o.r),E=t.get([\"pointer\",\"icon\"]),B=I.get(\"offsetCenter\"),O=W(B[0],o.r),z=W(B[1],o.r),H=I.get(\"keepAspect\"),$;return E?$=jt(E,O-P/2,z-R,P,R,null,H):$=new aF({shape:{angle:-Math.PI/2,width:P,r:R,x:O,y:z}}),$.rotation=-(M+Math.PI/2),$.x=o.cx,$.y=o.cy,$}function T(D,M){var L=g.get(\"roundCap\"),I=L?Uf:Ve,P=g.get(\"overlap\"),R=P?g.get(\"width\"):f/m.count(),E=P?o.r-R:o.r-(D+1)*R,B=P?o.r:o.r-D*R,O=new I({shape:{startAngle:s,endAngle:M,cx:o.cx,cy:o.cy,clockwise:u,r0:E,r:B}});return P&&(O.z2=w-m.get(_,D)%w),O}(y||p)&&(m.diff(v).add(function(D){var M=m.get(_,D);if(p){var L=C(D,s);Ft(L,{rotation:-((isNaN(+M)?b[0]:Rt(M,x,b,!0))+Math.PI/2)},t),h.add(L),m.setItemGraphicEl(D,L)}if(y){var I=T(D,s),P=g.get(\"clip\");Ft(I,{shape:{endAngle:Rt(M,x,b,P)}},t),h.add(I),Qd(t.seriesIndex,m.dataType,D,I),d[D]=I}}).update(function(D,M){var L=m.get(_,D);if(p){var I=v.getItemGraphicEl(M),P=I?I.rotation:s,R=C(D,P);R.rotation=P,Lt(R,{rotation:-((isNaN(+L)?b[0]:Rt(L,x,b,!0))+Math.PI/2)},t),h.add(R),m.setItemGraphicEl(D,R)}if(y){var E=c[M],B=E?E.shape.endAngle:s,O=T(D,B),z=g.get(\"clip\");Lt(O,{shape:{endAngle:Rt(L,x,b,z)}},t),h.add(O),Qd(t.seriesIndex,m.dataType,D,O),d[D]=O}}).execute(),m.each(function(D){var M=m.getItemModel(D),L=M.getModel(\"emphasis\"),I=L.get(\"focus\"),P=L.get(\"blurScope\"),R=L.get(\"disabled\");if(p){var E=m.getItemGraphicEl(D),B=m.getItemVisual(D,\"style\"),O=B.fill;if(E instanceof pe){var z=E.style;E.useStyle(V({image:z.image,x:z.x,y:z.y,width:z.width,height:z.height},B))}else E.useStyle(B),E.type!==\"pointer\"&&E.setColor(O);E.setStyle(M.getModel([\"pointer\",\"itemStyle\"]).getItemStyle()),E.style.fill===\"auto\"&&E.setStyle(\"fill\",i(Rt(m.get(_,D),x,[0,1],!0))),E.z2EmphasisLift=0,ce(E,M),$t(E,I,P,R)}if(y){var H=d[D];H.useStyle(m.getItemVisual(D,\"style\")),H.setStyle(M.getModel([\"progress\",\"itemStyle\"]).getItemStyle()),H.z2EmphasisLift=0,ce(H,M),$t(H,I,P,R)}}),this._progressEls=d)},e.prototype._renderAnchor=function(t,a){var n=t.getModel(\"anchor\"),i=n.get(\"show\");if(i){var o=n.get(\"size\"),s=n.get(\"icon\"),l=n.get(\"offsetCenter\"),u=n.get(\"keepAspect\"),f=jt(s,a.cx-o/2+W(l[0],a.r),a.cy-o/2+W(l[1],a.r),o,o,null,u);f.z2=n.get(\"showAbove\")?1:0,f.setStyle(n.getModel(\"itemStyle\").getItemStyle()),this.group.add(f)}},e.prototype._renderTitleAndDetail=function(t,a,n,i,o){var s=this,l=t.getData(),u=l.mapDimension(\"value\"),f=+t.get(\"min\"),h=+t.get(\"max\"),v=new nt,c=[],d=[],p=t.isAnimationEnabled(),g=t.get([\"pointer\",\"showAbove\"]);l.diff(this._data).add(function(y){c[y]=new Dt({silent:!0}),d[y]=new Dt({silent:!0})}).update(function(y,m){c[y]=s._titleEls[m],d[y]=s._detailEls[m]}).execute(),l.each(function(y){var m=l.getItemModel(y),_=l.get(u,y),S=new nt,w=i(Rt(_,[f,h],[0,1],!0)),x=m.getModel(\"title\");if(x.get(\"show\")){var b=x.get(\"offsetCenter\"),C=o.cx+W(b[0],o.r),T=o.cy+W(b[1],o.r),D=c[y];D.attr({z2:g?0:2,style:Nt(x,{x:C,y:T,text:l.getName(y),align:\"center\",verticalAlign:\"middle\"},{inheritColor:w})}),S.add(D)}var M=m.getModel(\"detail\");if(M.get(\"show\")){var L=M.get(\"offsetCenter\"),I=o.cx+W(L[0],o.r),P=o.cy+W(L[1],o.r),R=W(M.get(\"width\"),o.r),E=W(M.get(\"height\"),o.r),B=t.get([\"progress\",\"show\"])?l.getItemVisual(y,\"style\").fill:w,D=d[y],O=M.get(\"formatter\");D.attr({z2:g?0:2,style:Nt(M,{x:I,y:P,text:Ru(_,O),width:isNaN(R)?null:R,height:isNaN(E)?null:E,align:\"center\",verticalAlign:\"middle\"},{inheritColor:B})}),LC(D,{normal:M},_,function(H){return Ru(H,O)}),p&&IC(D,y,l,t,{getFormattedLabel:function(H,$,X,Q,j,pt){return Ru(pt?pt.interpolatedValue:_,O)}}),S.add(D)}v.add(S)}),this.group.add(v),this._titleEls=c,this._detailEls=d},e.type=\"gauge\",e}(zt),oF=iF,sF=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.visualStyleAccessPath=\"itemStyle\",t}return e.prototype.getInitialData=function(t,a){return No(this,[\"value\"])},e.type=\"series.gauge\",e.defaultOption={z:2,colorBy:\"data\",center:[\"50%\",\"50%\"],legendHoverLink:!0,radius:\"75%\",startAngle:225,endAngle:-45,clockwise:!0,min:0,max:100,splitNumber:10,axisLine:{show:!0,roundCap:!1,lineStyle:{color:[[1,\"#E6EBF8\"]],width:10}},progress:{show:!1,overlap:!0,width:10,roundCap:!1,clip:!0},splitLine:{show:!0,length:10,distance:10,lineStyle:{color:\"#63677A\",width:3,type:\"solid\"}},axisTick:{show:!0,splitNumber:5,length:6,distance:10,lineStyle:{color:\"#63677A\",width:1,type:\"solid\"}},axisLabel:{show:!0,distance:15,color:\"#464646\",fontSize:12,rotate:0},pointer:{icon:null,offsetCenter:[0,0],show:!0,showAbove:!0,length:\"60%\",width:6,keepAspect:!1},anchor:{show:!1,showAbove:!1,size:6,icon:\"circle\",offsetCenter:[0,0],keepAspect:!1,itemStyle:{color:\"#fff\",borderWidth:0,borderColor:\"#5470c6\"}},title:{show:!0,offsetCenter:[0,\"20%\"],color:\"#464646\",fontSize:16,valueAnimation:!1},detail:{show:!0,backgroundColor:\"rgba(0,0,0,0)\",borderWidth:0,borderColor:\"#ccc\",width:100,height:null,padding:[5,10],offsetCenter:[0,\"40%\"],color:\"#464646\",fontSize:30,fontWeight:\"bold\",lineHeight:30,valueAnimation:!1}},e}(Ht),lF=sF;function XD(r){r.registerChartView(oF),r.registerSeriesModel(lF)}var uF=[\"itemStyle\",\"opacity\"],fF=function(r){k(e,r);function e(t,a){var n=r.call(this)||this,i=n,o=new Fe,s=new Dt;return i.setTextContent(s),n.setTextGuideLine(o),n.updateData(t,a,!0),n}return e.prototype.updateData=function(t,a,n){var i=this,o=t.hostModel,s=t.getItemModel(a),l=t.getItemLayout(a),u=s.getModel(\"emphasis\"),f=s.get(uF);f=f==null?1:f,n||Ar(i),i.useStyle(t.getItemVisual(a,\"style\")),i.style.lineJoin=\"round\",n?(i.setShape({points:l.points}),i.style.opacity=0,Ft(i,{style:{opacity:f}},o,a)):Lt(i,{style:{opacity:f},shape:{points:l.points}},o,a),ce(i,s),this._updateLabel(t,a),$t(this,u.get(\"focus\"),u.get(\"blurScope\"),u.get(\"disabled\"))},e.prototype._updateLabel=function(t,a){var n=this,i=this.getTextGuideLine(),o=n.getTextContent(),s=t.hostModel,l=t.getItemModel(a),u=t.getItemLayout(a),f=u.label,h=t.getItemVisual(a,\"style\"),v=h.fill;de(o,ie(l),{labelFetcher:t.hostModel,labelDataIndex:a,defaultOpacity:h.opacity,defaultText:t.getName(a)},{normal:{align:f.textAlign,verticalAlign:f.verticalAlign}}),n.setTextConfig({local:!0,inside:!!f.inside,insideStroke:v,outsideFill:v});var c=f.linePoints;i.setShape({points:c}),n.textGuideLineConfig={anchor:c?new ut(c[0][0],c[0][1]):null},Lt(o,{style:{x:f.x,y:f.y}},s,a),o.attr({rotation:f.rotation,originX:f.x,originY:f.y,z2:10}),xy(n,wy(l),{stroke:v})},e}(ze),hF=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.ignoreLabelLineUpdate=!0,t}return e.prototype.render=function(t,a,n){var i=t.getData(),o=this._data,s=this.group;i.diff(o).add(function(l){var u=new fF(i,l);i.setItemGraphicEl(l,u),s.add(u)}).update(function(l,u){var f=o.getItemGraphicEl(u);f.updateData(i,l),s.add(f),i.setItemGraphicEl(l,f)}).remove(function(l){var u=o.getItemGraphicEl(l);Js(u,t,l)}).execute(),this._data=i},e.prototype.remove=function(){this.group.removeAll(),this._data=null},e.prototype.dispose=function(){},e.type=\"funnel\",e}(zt),vF=hF,cF=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.init=function(t){r.prototype.init.apply(this,arguments),this.legendVisualProvider=new Nl(Y(this.getData,this),Y(this.getRawData,this)),this._defaultLabelLine(t)},e.prototype.getInitialData=function(t,a){return No(this,{coordDimensions:[\"value\"],encodeDefaulter:ot(Jg,this)})},e.prototype._defaultLabelLine=function(t){ci(t,\"labelLine\",[\"show\"]);var a=t.labelLine,n=t.emphasis.labelLine;a.show=a.show&&t.label.show,n.show=n.show&&t.emphasis.label.show},e.prototype.getDataParams=function(t){var a=this.getData(),n=r.prototype.getDataParams.call(this,t),i=a.mapDimension(\"value\"),o=a.getSum(i);return n.percent=o?+(a.get(i,t)/o*100).toFixed(2):0,n.$vars.push(\"percent\"),n},e.type=\"series.funnel\",e.defaultOption={z:2,legendHoverLink:!0,colorBy:\"data\",left:80,top:60,right:80,bottom:60,minSize:\"0%\",maxSize:\"100%\",sort:\"descending\",orient:\"vertical\",gap:0,funnelAlign:\"center\",label:{show:!0,position:\"outer\"},labelLine:{show:!0,length:20,lineStyle:{width:1}},itemStyle:{borderColor:\"#fff\",borderWidth:1},emphasis:{label:{show:!0}},select:{itemStyle:{borderColor:\"#212121\"}}},e}(Ht),dF=cF;function pF(r,e){return re(r.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function gF(r,e){for(var t=r.mapDimension(\"value\"),a=r.mapArray(t,function(l){return l}),n=[],i=e===\"ascending\",o=0,s=r.count();o<s;o++)n[o]=o;return J(e)?n.sort(e):e!==\"none\"&&n.sort(function(l,u){return i?a[l]-a[u]:a[u]-a[l]}),n}function yF(r){var e=r.hostModel,t=e.get(\"orient\");r.each(function(a){var n=r.getItemModel(a),i=n.getModel(\"label\"),o=i.get(\"position\"),s=n.getModel(\"labelLine\"),l=r.getItemLayout(a),u=l.points,f=o===\"inner\"||o===\"inside\"||o===\"center\"||o===\"insideLeft\"||o===\"insideRight\",h,v,c,d;if(f)o===\"insideLeft\"?(v=(u[0][0]+u[3][0])/2+5,c=(u[0][1]+u[3][1])/2,h=\"left\"):o===\"insideRight\"?(v=(u[1][0]+u[2][0])/2-5,c=(u[1][1]+u[2][1])/2,h=\"right\"):(v=(u[0][0]+u[1][0]+u[2][0]+u[3][0])/4,c=(u[0][1]+u[1][1]+u[2][1]+u[3][1])/4,h=\"center\"),d=[[v,c],[v,c]];else{var p=void 0,g=void 0,y=void 0,m=void 0,_=s.get(\"length\");o===\"left\"?(p=(u[3][0]+u[0][0])/2,g=(u[3][1]+u[0][1])/2,y=p-_,v=y-5,h=\"right\"):o===\"right\"?(p=(u[1][0]+u[2][0])/2,g=(u[1][1]+u[2][1])/2,y=p+_,v=y+5,h=\"left\"):o===\"top\"?(p=(u[3][0]+u[0][0])/2,g=(u[3][1]+u[0][1])/2,m=g-_,c=m-5,h=\"center\"):o===\"bottom\"?(p=(u[1][0]+u[2][0])/2,g=(u[1][1]+u[2][1])/2,m=g+_,c=m+5,h=\"center\"):o===\"rightTop\"?(p=t===\"horizontal\"?u[3][0]:u[1][0],g=t===\"horizontal\"?u[3][1]:u[1][1],t===\"horizontal\"?(m=g-_,c=m-5,h=\"center\"):(y=p+_,v=y+5,h=\"top\")):o===\"rightBottom\"?(p=u[2][0],g=u[2][1],t===\"horizontal\"?(m=g+_,c=m+5,h=\"center\"):(y=p+_,v=y+5,h=\"bottom\")):o===\"leftTop\"?(p=u[0][0],g=t===\"horizontal\"?u[0][1]:u[1][1],t===\"horizontal\"?(m=g-_,c=m-5,h=\"center\"):(y=p-_,v=y-5,h=\"right\")):o===\"leftBottom\"?(p=t===\"horizontal\"?u[1][0]:u[3][0],g=t===\"horizontal\"?u[1][1]:u[2][1],t===\"horizontal\"?(m=g+_,c=m+5,h=\"center\"):(y=p-_,v=y-5,h=\"right\")):(p=(u[1][0]+u[2][0])/2,g=(u[1][1]+u[2][1])/2,t===\"horizontal\"?(m=g+_,c=m+5,h=\"center\"):(y=p+_,v=y+5,h=\"left\")),t===\"horizontal\"?(y=p,v=y):(m=g,c=m),d=[[p,g],[y,m]]}l.label={linePoints:d,x:v,y:c,verticalAlign:\"middle\",textAlign:h,inside:f}})}function mF(r,e){r.eachSeriesByType(\"funnel\",function(t){var a=t.getData(),n=a.mapDimension(\"value\"),i=t.get(\"sort\"),o=pF(t,e),s=t.get(\"orient\"),l=o.width,u=o.height,f=gF(a,i),h=o.x,v=o.y,c=s===\"horizontal\"?[W(t.get(\"minSize\"),u),W(t.get(\"maxSize\"),u)]:[W(t.get(\"minSize\"),l),W(t.get(\"maxSize\"),l)],d=a.getDataExtent(n),p=t.get(\"min\"),g=t.get(\"max\");p==null&&(p=Math.min(d[0],0)),g==null&&(g=d[1]);var y=t.get(\"funnelAlign\"),m=t.get(\"gap\"),_=s===\"horizontal\"?l:u,S=(_-m*(a.count()-1))/a.count(),w=function(P,R){if(s===\"horizontal\"){var E=a.get(n,P)||0,B=Rt(E,[p,g],c,!0),O=void 0;switch(y){case\"top\":O=v;break;case\"center\":O=v+(u-B)/2;break;case\"bottom\":O=v+(u-B);break}return[[R,O],[R,O+B]]}var z=a.get(n,P)||0,H=Rt(z,[p,g],c,!0),$;switch(y){case\"left\":$=h;break;case\"center\":$=h+(l-H)/2;break;case\"right\":$=h+l-H;break}return[[$,R],[$+H,R]]};i===\"ascending\"&&(S=-S,m=-m,s===\"horizontal\"?h+=l:v+=u,f=f.reverse());for(var x=0;x<f.length;x++){var b=f[x],C=f[x+1],T=a.getItemModel(b);if(s===\"horizontal\"){var D=T.get([\"itemStyle\",\"width\"]);D==null?D=S:(D=W(D,l),i===\"ascending\"&&(D=-D));var M=w(b,h),L=w(C,h+D);h+=D+m,a.setItemLayout(b,{points:M.concat(L.slice().reverse())})}else{var I=T.get([\"itemStyle\",\"height\"]);I==null?I=S:(I=W(I,u),i===\"ascending\"&&(I=-I));var M=w(b,v),L=w(C,v+I);v+=I+m,a.setItemLayout(b,{points:M.concat(L.slice().reverse())})}}yF(a)})}function _F(r){r.registerChartView(vF),r.registerSeriesModel(dF),r.registerLayout(mF),r.registerProcessor(Bl(\"funnel\"))}var SF=.3,xF=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t._dataGroup=new nt,t._initialized=!1,t}return e.prototype.init=function(){this.group.add(this._dataGroup)},e.prototype.render=function(t,a,n,i){this._progressiveEls=null;var o=this._dataGroup,s=t.getData(),l=this._data,u=t.coordinateSystem,f=u.dimensions,h=XS(t);s.diff(l).add(v).update(c).remove(d).execute();function v(g){var y=ZS(s,o,g,f,u);Bc(y,s,g,h)}function c(g,y){var m=l.getItemGraphicEl(y),_=qD(s,g,f,u);s.setItemGraphicEl(g,m),Lt(m,{shape:{points:_}},t,g),Ar(m),Bc(m,s,g,h)}function d(g){var y=l.getItemGraphicEl(g);o.remove(y)}if(!this._initialized){this._initialized=!0;var p=wF(u,t,function(){setTimeout(function(){o.removeClipPath()})});o.setClipPath(p)}this._data=s},e.prototype.incrementalPrepareRender=function(t,a,n){this._initialized=!0,this._data=null,this._dataGroup.removeAll()},e.prototype.incrementalRender=function(t,a,n){for(var i=a.getData(),o=a.coordinateSystem,s=o.dimensions,l=XS(a),u=this._progressiveEls=[],f=t.start;f<t.end;f++){var h=ZS(i,this._dataGroup,f,s,o);h.incremental=!0,Bc(h,i,f,l),u.push(h)}},e.prototype.remove=function(){this._dataGroup&&this._dataGroup.removeAll(),this._data=null},e.type=\"parallel\",e}(zt);function wF(r,e,t){var a=r.model,n=r.getRect(),i=new bt({shape:{x:n.x,y:n.y,width:n.width,height:n.height}}),o=a.get(\"layout\")===\"horizontal\"?\"width\":\"height\";return i.setShape(o,0),Ft(i,{shape:{width:n.width,height:n.height}},e,t),i}function qD(r,e,t,a){for(var n=[],i=0;i<t.length;i++){var o=t[i],s=r.get(r.mapDimension(o),e);bF(s,a.getAxis(o).type)||n.push(a.dataToPoint(s,o))}return n}function ZS(r,e,t,a,n){var i=qD(r,t,a,n),o=new Fe({shape:{points:i},z2:10});return e.add(o),r.setItemGraphicEl(t,o),o}function XS(r){var e=r.get(\"smooth\",!0);return e===!0&&(e=SF),e=ma(e),Ws(e)&&(e=0),{smooth:e}}function Bc(r,e,t,a){r.useStyle(e.getItemVisual(t,\"style\")),r.style.fill=null,r.setShape(\"smooth\",a.smooth);var n=e.getItemModel(t),i=n.getModel(\"emphasis\");ce(r,n,\"lineStyle\"),$t(r,i.get(\"focus\"),i.get(\"blurScope\"),i.get(\"disabled\"))}function bF(r,e){return e===\"category\"?r==null:r==null||isNaN(r)}var CF=xF,TF=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.visualStyleAccessPath=\"lineStyle\",t.visualDrawType=\"stroke\",t}return e.prototype.getInitialData=function(t,a){return Ta(null,this,{useEncodeDefaulter:Y(AF,null,this)})},e.prototype.getRawIndicesByActiveState=function(t){var a=this.coordinateSystem,n=this.getData(),i=[];return a.eachActiveState(n,function(o,s){t===o&&i.push(n.getRawIndex(s))}),i},e.type=\"series.parallel\",e.dependencies=[\"parallel\"],e.defaultOption={z:2,coordinateSystem:\"parallel\",parallelIndex:0,label:{show:!1},inactiveOpacity:.05,activeOpacity:1,lineStyle:{width:1,opacity:.45,type:\"solid\"},emphasis:{label:{show:!1}},progressive:500,smooth:!1,animationEasing:\"linear\"},e}(Ht);function AF(r){var e=r.ecModel.getComponent(\"parallel\",r.get(\"parallelIndex\"));if(!!e){var t={};return A(e.dimensions,function(a){var n=DF(a);t[a]=n}),t}}function DF(r){return+r.replace(\"dim\",\"\")}var MF=TF,LF=[\"lineStyle\",\"opacity\"],IF={seriesType:\"parallel\",reset:function(r,e){var t=r.coordinateSystem,a={normal:r.get([\"lineStyle\",\"opacity\"]),active:r.get(\"activeOpacity\"),inactive:r.get(\"inactiveOpacity\")};return{progress:function(n,i){t.eachActiveState(i,function(o,s){var l=a[o];if(o===\"normal\"&&i.hasItemOption){var u=i.getItemModel(s).get(LF,!0);u!=null&&(l=u)}var f=i.ensureUniqueItemVisual(s,\"style\");f.opacity=l},n.start,n.end)}}}},PF=IF;function RF(r){EF(r),kF(r)}function EF(r){if(!r.parallel){var e=!1;A(r.series,function(t){t&&t.type===\"parallel\"&&(e=!0)}),e&&(r.parallel=[{}])}}function kF(r){var e=kt(r.parallelAxis);A(e,function(t){if(!!et(t)){var a=t.parallelIndex||0,n=kt(r.parallel)[a];n&&n.parallelAxisDefault&&ht(t,n.parallelAxisDefault,!1)}})}var OF=5,BF=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n){this._model=t,this._api=n,this._handlers||(this._handlers={},A(NF,function(i,o){n.getZr().on(o,this._handlers[o]=Y(i,this))},this)),Oo(this,\"_throttledDispatchExpand\",t.get(\"axisExpandRate\"),\"fixRate\")},e.prototype.dispose=function(t,a){rl(this,\"_throttledDispatchExpand\"),A(this._handlers,function(n,i){a.getZr().off(i,n)}),this._handlers=null},e.prototype._throttledDispatchExpand=function(t){this._dispatchExpand(t)},e.prototype._dispatchExpand=function(t){t&&this._api.dispatchAction(V({type:\"parallelAxisExpand\"},t))},e.type=\"parallel\",e}(Ut),NF={mousedown:function(r){Nc(this,\"click\")&&(this._mouseDownPoint=[r.offsetX,r.offsetY])},mouseup:function(r){var e=this._mouseDownPoint;if(Nc(this,\"click\")&&e){var t=[r.offsetX,r.offsetY],a=Math.pow(e[0]-t[0],2)+Math.pow(e[1]-t[1],2);if(a>OF)return;var n=this._model.coordinateSystem.getSlidedAxisExpandWindow([r.offsetX,r.offsetY]);n.behavior!==\"none\"&&this._dispatchExpand({axisExpandWindow:n.axisExpandWindow})}this._mouseDownPoint=null},mousemove:function(r){if(!(this._mouseDownPoint||!Nc(this,\"mousemove\"))){var e=this._model,t=e.coordinateSystem.getSlidedAxisExpandWindow([r.offsetX,r.offsetY]),a=t.behavior;a===\"jump\"&&this._throttledDispatchExpand.debounceNextCall(e.get(\"axisExpandDebounce\")),this._throttledDispatchExpand(a===\"none\"?null:{axisExpandWindow:t.axisExpandWindow,animation:a===\"jump\"?null:{duration:0}})}}};function Nc(r,e){var t=r._model;return t.get(\"axisExpandable\")&&t.get(\"axisExpandTriggerOn\")===e}var VF=BF,zF=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.init=function(){r.prototype.init.apply(this,arguments),this.mergeOption({})},e.prototype.mergeOption=function(t){var a=this.option;t&&ht(a,t,!0),this._initDimensions()},e.prototype.contains=function(t,a){var n=t.get(\"parallelIndex\");return n!=null&&a.getComponent(\"parallel\",n)===this},e.prototype.setAxisExpand=function(t){A([\"axisExpandable\",\"axisExpandCenter\",\"axisExpandCount\",\"axisExpandWidth\",\"axisExpandWindow\"],function(a){t.hasOwnProperty(a)&&(this.option[a]=t[a])},this)},e.prototype._initDimensions=function(){var t=this.dimensions=[],a=this.parallelAxisIndex=[],n=Et(this.ecModel.queryComponents({mainType:\"parallelAxis\"}),function(i){return(i.get(\"parallelIndex\")||0)===this.componentIndex},this);A(n,function(i){t.push(\"dim\"+i.get(\"dim\")),a.push(i.componentIndex)})},e.type=\"parallel\",e.dependencies=[\"parallelAxis\"],e.layoutMode=\"box\",e.defaultOption={z:0,left:80,top:60,right:80,bottom:60,layout:\"horizontal\",axisExpandable:!1,axisExpandCenter:null,axisExpandCount:0,axisExpandWidth:50,axisExpandRate:17,axisExpandDebounce:50,axisExpandSlideTriggerArea:[-.15,.05,.4],axisExpandTriggerOn:\"click\",parallelAxisDefault:null},e}(Tt),FF=zF,GF=function(r){k(e,r);function e(t,a,n,i,o){var s=r.call(this,t,a,n)||this;return s.type=i||\"value\",s.axisIndex=o,s}return e.prototype.isHorizontal=function(){return this.coordinateSystem.getModel().get(\"layout\")!==\"horizontal\"},e}(Mr),HF=GF;function Li(r,e,t,a,n,i){r=r||0;var o=t[1]-t[0];if(n!=null&&(n=Yi(n,[0,o])),i!=null&&(i=Math.max(i,n!=null?n:0)),a===\"all\"){var s=Math.abs(e[1]-e[0]);s=Yi(s,[0,o]),n=i=Yi(s,[n,i]),a=0}e[0]=Yi(e[0],t),e[1]=Yi(e[1],t);var l=Vc(e,a);e[a]+=r;var u=n||0,f=t.slice();l.sign<0?f[0]+=u:f[1]-=u,e[a]=Yi(e[a],f);var h;return h=Vc(e,a),n!=null&&(h.sign!==l.sign||h.span<n)&&(e[1-a]=e[a]+l.sign*n),h=Vc(e,a),i!=null&&h.span>i&&(e[1-a]=e[a]+h.sign*i),e}function Vc(r,e){var t=r[e]-r[1-e];return{span:Math.abs(t),sign:t>0?-1:t<0?1:e?-1:1}}function Yi(r,e){return Math.min(e[1]!=null?e[1]:1/0,Math.max(e[0]!=null?e[0]:-1/0,r))}var zc=A,KD=Math.min,JD=Math.max,qS=Math.floor,WF=Math.ceil,KS=Zt,$F=Math.PI,UF=function(){function r(e,t,a){this.type=\"parallel\",this._axesMap=q(),this._axesLayout={},this.dimensions=e.dimensions,this._model=e,this._init(e,t,a)}return r.prototype._init=function(e,t,a){var n=e.dimensions,i=e.parallelAxisIndex;zc(n,function(o,s){var l=i[s],u=t.getComponent(\"parallelAxis\",l),f=this._axesMap.set(o,new HF(o,Hh(u),[0,0],u.get(\"type\"),l)),h=f.type===\"category\";f.onBand=h&&u.get(\"boundaryGap\"),f.inverse=u.get(\"inverse\"),u.axis=f,f.model=u,f.coordinateSystem=u.coordinateSystem=this},this)},r.prototype.update=function(e,t){this._updateAxesFromSeries(this._model,e)},r.prototype.containPoint=function(e){var t=this._makeLayoutInfo(),a=t.axisBase,n=t.layoutBase,i=t.pixelDimIndex,o=e[1-i],s=e[i];return o>=a&&o<=a+t.axisLength&&s>=n&&s<=n+t.layoutLength},r.prototype.getModel=function(){return this._model},r.prototype._updateAxesFromSeries=function(e,t){t.eachSeries(function(a){if(!!e.contains(a,t)){var n=a.getData();zc(this.dimensions,function(i){var o=this._axesMap.get(i);o.scale.unionExtentFromData(n,n.mapDimension(i)),po(o.scale,o.model)},this)}},this)},r.prototype.resize=function(e,t){this._rect=re(e.getBoxLayoutParams(),{width:t.getWidth(),height:t.getHeight()}),this._layoutAxes()},r.prototype.getRect=function(){return this._rect},r.prototype._makeLayoutInfo=function(){var e=this._model,t=this._rect,a=[\"x\",\"y\"],n=[\"width\",\"height\"],i=e.get(\"layout\"),o=i===\"horizontal\"?0:1,s=t[n[o]],l=[0,s],u=this.dimensions.length,f=Eu(e.get(\"axisExpandWidth\"),l),h=Eu(e.get(\"axisExpandCount\")||0,[0,u]),v=e.get(\"axisExpandable\")&&u>3&&u>h&&h>1&&f>0&&s>0,c=e.get(\"axisExpandWindow\"),d;if(c)d=Eu(c[1]-c[0],l),c[1]=c[0]+d;else{d=Eu(f*(h-1),l);var p=e.get(\"axisExpandCenter\")||qS(u/2);c=[f*p-d/2],c[1]=c[0]+d}var g=(s-d)/(u-h);g<3&&(g=0);var y=[qS(KS(c[0]/f,1))+1,WF(KS(c[1]/f,1))-1],m=g/f*c[0];return{layout:i,pixelDimIndex:o,layoutBase:t[a[o]],layoutLength:s,axisBase:t[a[1-o]],axisLength:t[n[1-o]],axisExpandable:v,axisExpandWidth:f,axisCollapseWidth:g,axisExpandWindow:c,axisCount:u,winInnerIndices:y,axisExpandWindow0Pos:m}},r.prototype._layoutAxes=function(){var e=this._rect,t=this._axesMap,a=this.dimensions,n=this._makeLayoutInfo(),i=n.layout;t.each(function(o){var s=[0,n.axisLength],l=o.inverse?1:0;o.setExtent(s[l],s[1-l])}),zc(a,function(o,s){var l=(n.axisExpandable?ZF:YF)(s,n),u={horizontal:{x:l.position,y:n.axisLength},vertical:{x:0,y:l.position}},f={horizontal:$F/2,vertical:0},h=[u[i].x+e.x,u[i].y+e.y],v=f[i],c=ur();bi(c,c,v),Xr(c,c,h),this._axesLayout[o]={position:h,rotation:v,transform:c,axisNameAvailableWidth:l.axisNameAvailableWidth,axisLabelShow:l.axisLabelShow,nameTruncateMaxWidth:l.nameTruncateMaxWidth,tickDirection:1,labelDirection:1}},this)},r.prototype.getAxis=function(e){return this._axesMap.get(e)},r.prototype.dataToPoint=function(e,t){return this.axisCoordToPoint(this._axesMap.get(t).dataToCoord(e),t)},r.prototype.eachActiveState=function(e,t,a,n){a==null&&(a=0),n==null&&(n=e.count());var i=this._axesMap,o=this.dimensions,s=[],l=[];A(o,function(g){s.push(e.mapDimension(g)),l.push(i.get(g).model)});for(var u=this.hasAxisBrushed(),f=a;f<n;f++){var h=void 0;if(!u)h=\"normal\";else{h=\"active\";for(var v=e.getValues(s,f),c=0,d=o.length;c<d;c++){var p=l[c].getActiveState(v[c]);if(p===\"inactive\"){h=\"inactive\";break}}}t(h,f)}},r.prototype.hasAxisBrushed=function(){for(var e=this.dimensions,t=this._axesMap,a=!1,n=0,i=e.length;n<i;n++)t.get(e[n]).model.getActiveState()!==\"normal\"&&(a=!0);return a},r.prototype.axisCoordToPoint=function(e,t){var a=this._axesLayout[t];return Cr([e,0],a.transform)},r.prototype.getAxisLayout=function(e){return at(this._axesLayout[e])},r.prototype.getSlidedAxisExpandWindow=function(e){var t=this._makeLayoutInfo(),a=t.pixelDimIndex,n=t.axisExpandWindow.slice(),i=n[1]-n[0],o=[0,t.axisExpandWidth*(t.axisCount-1)];if(!this.containPoint(e))return{behavior:\"none\",axisExpandWindow:n};var s=e[a]-t.layoutBase-t.axisExpandWindow0Pos,l,u=\"slide\",f=t.axisCollapseWidth,h=this._model.get(\"axisExpandSlideTriggerArea\"),v=h[0]!=null;if(f)v&&f&&s<i*h[0]?(u=\"jump\",l=s-i*h[2]):v&&f&&s>i*(1-h[0])?(u=\"jump\",l=s-i*(1-h[2])):(l=s-i*h[1])>=0&&(l=s-i*(1-h[1]))<=0&&(l=0),l*=t.axisExpandWidth/f,l?Li(l,n,o,\"all\"):u=\"none\";else{var c=n[1]-n[0],d=o[1]*s/c;n=[JD(0,d-c/2)],n[1]=KD(o[1],n[0]+c),n[0]=n[1]-c}return{axisExpandWindow:n,behavior:u}},r}();function Eu(r,e){return KD(JD(r,e[0]),e[1])}function YF(r,e){var t=e.layoutLength/(e.axisCount-1);return{position:t*r,axisNameAvailableWidth:t,axisLabelShow:!0}}function ZF(r,e){var t=e.layoutLength,a=e.axisExpandWidth,n=e.axisCount,i=e.axisCollapseWidth,o=e.winInnerIndices,s,l=i,u=!1,f;return r<o[0]?(s=r*i,f=i):r<=o[1]?(s=e.axisExpandWindow0Pos+r*a-e.axisExpandWindow[0],l=a,u=!0):(s=t-(n-1-r)*i,f=i),{position:s,axisNameAvailableWidth:l,axisLabelShow:u,nameTruncateMaxWidth:f}}var XF=UF;function qF(r,e){var t=[];return r.eachComponent(\"parallel\",function(a,n){var i=new XF(a,r,e);i.name=\"parallel_\"+n,i.resize(a,e),a.coordinateSystem=i,i.model=a,t.push(i)}),r.eachSeries(function(a){if(a.get(\"coordinateSystem\")===\"parallel\"){var n=a.getReferringComponents(\"parallel\",Qt).models[0];a.coordinateSystem=n.coordinateSystem}}),t}var KF={create:qF},JF=KF,QD=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.activeIntervals=[],t}return e.prototype.getAreaSelectStyle=function(){return pi([[\"fill\",\"color\"],[\"lineWidth\",\"borderWidth\"],[\"stroke\",\"borderColor\"],[\"width\",\"width\"],[\"opacity\",\"opacity\"]])(this.getModel(\"areaSelectStyle\"))},e.prototype.setActiveIntervals=function(t){var a=this.activeIntervals=at(t);if(a)for(var n=a.length-1;n>=0;n--)or(a[n])},e.prototype.getActiveState=function(t){var a=this.activeIntervals;if(!a.length)return\"normal\";if(t==null||isNaN(+t))return\"inactive\";if(a.length===1){var n=a[0];if(n[0]<=t&&t<=n[1])return\"active\"}else for(var i=0,o=a.length;i<o;i++)if(a[i][0]<=t&&t<=a[i][1])return\"active\";return\"inactive\"},e}(Tt);te(QD,Rl);var JS=QD,mi=!0,hl=Math.min,mo=Math.max,QF=Math.pow,jF=1e4,t9=6,e9=6,QS=\"globalPan\",r9={w:[0,0],e:[0,1],n:[1,0],s:[1,1]},a9={w:\"ew\",e:\"ew\",n:\"ns\",s:\"ns\",ne:\"nesw\",sw:\"nesw\",nw:\"nwse\",se:\"nwse\"},jS={brushStyle:{lineWidth:2,stroke:\"rgba(210,219,238,0.3)\",fill:\"#D2DBEE\"},transformable:!0,brushMode:\"single\",removeOnClick:!1},n9=0,i9=function(r){k(e,r);function e(t){var a=r.call(this)||this;return a._track=[],a._covers=[],a._handlers={},a._zr=t,a.group=new nt,a._uid=\"brushController_\"+n9++,A(v9,function(n,i){this._handlers[i]=Y(n,this)},a),a}return e.prototype.enableBrush=function(t){return this._brushType&&this._doDisableBrush(),t.brushType&&this._doEnableBrush(t),this},e.prototype._doEnableBrush=function(t){var a=this._zr;this._enableGlobalPan||gz(a,QS,this._uid),A(this._handlers,function(n,i){a.on(i,n)}),this._brushType=t.brushType,this._brushOption=ht(at(jS),t,!0)},e.prototype._doDisableBrush=function(){var t=this._zr;yz(t,QS,this._uid),A(this._handlers,function(a,n){t.off(n,a)}),this._brushType=this._brushOption=null},e.prototype.setPanels=function(t){if(t&&t.length){var a=this._panels={};A(t,function(n){a[n.panelId]=at(n)})}else this._panels=null;return this},e.prototype.mount=function(t){t=t||{},this._enableGlobalPan=t.enableGlobalPan;var a=this.group;return this._zr.add(a),a.attr({x:t.x||0,y:t.y||0,rotation:t.rotation||0,scaleX:t.scaleX||1,scaleY:t.scaleY||1}),this._transform=a.getLocalTransform(),this},e.prototype.updateCovers=function(t){t=G(t,function(v){return ht(at(jS),v,!0)});var a=\"\\0-brush-index-\",n=this._covers,i=this._covers=[],o=this,s=this._creatingCover;return new xa(n,t,u,l).add(f).update(f).remove(h).execute(),this;function l(v,c){return(v.id!=null?v.id:a+c)+\"-\"+v.brushType}function u(v,c){return l(v.__brushOption,c)}function f(v,c){var d=t[v];if(c!=null&&n[c]===s)i[v]=n[c];else{var p=i[v]=c!=null?(n[c].__brushOption=d,n[c]):tM(o,jD(o,d));Fy(o,p)}}function h(v){n[v]!==s&&o.group.remove(n[v])}},e.prototype.unmount=function(){return this.enableBrush(!1),Vp(this),this._zr.remove(this.group),this},e.prototype.dispose=function(){this.unmount(),this.off()},e}(hr);function jD(r,e){var t=Xh[e.brushType].createCover(r,e);return t.__brushOption=e,rM(t,e),r.group.add(t),t}function tM(r,e){var t=Gy(e);return t.endCreating&&(t.endCreating(r,e),rM(e,e.__brushOption)),e}function eM(r,e){var t=e.__brushOption;Gy(e).updateCoverShape(r,e,t.range,t)}function rM(r,e){var t=e.z;t==null&&(t=jF),r.traverse(function(a){a.z=t,a.z2=t})}function Fy(r,e){Gy(e).updateCommon(r,e),eM(r,e)}function Gy(r){return Xh[r.__brushOption.brushType]}function Hy(r,e,t){var a=r._panels;if(!a)return mi;var n,i=r._transform;return A(a,function(o){o.isTargetByCursor(e,t,i)&&(n=o)}),n}function aM(r,e){var t=r._panels;if(!t)return mi;var a=e.__brushOption.panelId;return a!=null?t[a]:mi}function Vp(r){var e=r._covers,t=e.length;return A(e,function(a){r.group.remove(a)},r),e.length=0,!!t}function _i(r,e){var t=G(r._covers,function(a){var n=a.__brushOption,i=at(n.range);return{brushType:n.brushType,panelId:n.panelId,range:i}});r.trigger(\"brush\",{areas:t,isEnd:!!e.isEnd,removeOnClick:!!e.removeOnClick})}function o9(r){var e=r._track;if(!e.length)return!1;var t=e[e.length-1],a=e[0],n=t[0]-a[0],i=t[1]-a[1],o=QF(n*n+i*i,.5);return o>t9}function nM(r){var e=r.length-1;return e<0&&(e=0),[r[0],r[e]]}function iM(r,e,t,a){var n=new nt;return n.add(new bt({name:\"main\",style:Wy(t),silent:!0,draggable:!0,cursor:\"move\",drift:ot(tx,r,e,n,[\"n\",\"s\",\"w\",\"e\"]),ondragend:ot(_i,e,{isEnd:!0})})),A(a,function(i){n.add(new bt({name:i.join(\"\"),style:{opacity:0},draggable:!0,silent:!0,invisible:!0,drift:ot(tx,r,e,n,i),ondragend:ot(_i,e,{isEnd:!0})}))}),n}function oM(r,e,t,a){var n=a.brushStyle.lineWidth||0,i=mo(n,e9),o=t[0][0],s=t[1][0],l=o-n/2,u=s-n/2,f=t[0][1],h=t[1][1],v=f-i+n/2,c=h-i+n/2,d=f-o,p=h-s,g=d+n,y=p+n;ia(r,e,\"main\",o,s,d,p),a.transformable&&(ia(r,e,\"w\",l,u,i,y),ia(r,e,\"e\",v,u,i,y),ia(r,e,\"n\",l,u,g,i),ia(r,e,\"s\",l,c,g,i),ia(r,e,\"nw\",l,u,i,i),ia(r,e,\"ne\",v,u,i,i),ia(r,e,\"sw\",l,c,i,i),ia(r,e,\"se\",v,c,i,i))}function zp(r,e){var t=e.__brushOption,a=t.transformable,n=e.childAt(0);n.useStyle(Wy(t)),n.attr({silent:!a,cursor:a?\"move\":\"default\"}),A([[\"w\"],[\"e\"],[\"n\"],[\"s\"],[\"s\",\"e\"],[\"s\",\"w\"],[\"n\",\"e\"],[\"n\",\"w\"]],function(i){var o=e.childOfName(i.join(\"\")),s=i.length===1?Fp(r,i[0]):l9(r,i);o&&o.attr({silent:!a,invisible:!a,cursor:a?a9[s]+\"-resize\":null})})}function ia(r,e,t,a,n,i,o){var s=e.childOfName(t);s&&s.setShape(f9($y(r,e,[[a,n],[a+i,n+o]])))}function Wy(r){return tt({strokeNoScale:!0},r.brushStyle)}function sM(r,e,t,a){var n=[hl(r,t),hl(e,a)],i=[mo(r,t),mo(e,a)];return[[n[0],i[0]],[n[1],i[1]]]}function s9(r){return li(r.group)}function Fp(r,e){var t={w:\"left\",e:\"right\",n:\"top\",s:\"bottom\"},a={left:\"w\",right:\"e\",top:\"n\",bottom:\"s\"},n=Dh(t[e],s9(r));return a[n]}function l9(r,e){var t=[Fp(r,e[0]),Fp(r,e[1])];return(t[0]===\"e\"||t[0]===\"w\")&&t.reverse(),t.join(\"\")}function tx(r,e,t,a,n,i){var o=t.__brushOption,s=r.toRectRange(o.range),l=lM(e,n,i);A(a,function(u){var f=r9[u];s[f[0]][f[1]]+=l[f[0]]}),o.range=r.fromRectRange(sM(s[0][0],s[1][0],s[0][1],s[1][1])),Fy(e,t),_i(e,{isEnd:!1})}function u9(r,e,t,a){var n=e.__brushOption.range,i=lM(r,t,a);A(n,function(o){o[0]+=i[0],o[1]+=i[1]}),Fy(r,e),_i(r,{isEnd:!1})}function lM(r,e,t){var a=r.group,n=a.transformCoordToLocal(e,t),i=a.transformCoordToLocal(0,0);return[n[0]-i[0],n[1]-i[1]]}function $y(r,e,t){var a=aM(r,e);return a&&a!==mi?a.clipPath(t,r._transform):at(t)}function f9(r){var e=hl(r[0][0],r[1][0]),t=hl(r[0][1],r[1][1]),a=mo(r[0][0],r[1][0]),n=mo(r[0][1],r[1][1]);return{x:e,y:t,width:a-e,height:n-t}}function h9(r,e,t){if(!(!r._brushType||c9(r,e.offsetX,e.offsetY))){var a=r._zr,n=r._covers,i=Hy(r,e,t);if(!r._dragging)for(var o=0;o<n.length;o++){var s=n[o].__brushOption;if(i&&(i===mi||s.panelId===i.panelId)&&Xh[s.brushType].contain(n[o],t[0],t[1]))return}i&&a.setCursorStyle(\"crosshair\")}}function Gp(r){var e=r.event;e.preventDefault&&e.preventDefault()}function Hp(r,e,t){return r.childOfName(\"main\").contain(e,t)}function uM(r,e,t,a){var n=r._creatingCover,i=r._creatingPanel,o=r._brushOption,s;if(r._track.push(t.slice()),o9(r)||n){if(i&&!n){o.brushMode===\"single\"&&Vp(r);var l=at(o);l.brushType=ex(l.brushType,i),l.panelId=i===mi?null:i.panelId,n=r._creatingCover=jD(r,l),r._covers.push(n)}if(n){var u=Xh[ex(r._brushType,i)],f=n.__brushOption;f.range=u.getCreatingRange($y(r,n,r._track)),a&&(tM(r,n),u.updateCommon(r,n)),eM(r,n),s={isEnd:a}}}else a&&o.brushMode===\"single\"&&o.removeOnClick&&Hy(r,e,t)&&Vp(r)&&(s={isEnd:a,removeOnClick:!0});return s}function ex(r,e){return r===\"auto\"?e.defaultBrushType:r}var v9={mousedown:function(r){if(this._dragging)rx(this,r);else if(!r.target||!r.target.draggable){Gp(r);var e=this.group.transformCoordToLocal(r.offsetX,r.offsetY);this._creatingCover=null;var t=this._creatingPanel=Hy(this,r,e);t&&(this._dragging=!0,this._track=[e.slice()])}},mousemove:function(r){var e=r.offsetX,t=r.offsetY,a=this.group.transformCoordToLocal(e,t);if(h9(this,r,a),this._dragging){Gp(r);var n=uM(this,r,a,!1);n&&_i(this,n)}},mouseup:function(r){rx(this,r)}};function rx(r,e){if(r._dragging){Gp(e);var t=e.offsetX,a=e.offsetY,n=r.group.transformCoordToLocal(t,a),i=uM(r,e,n,!0);r._dragging=!1,r._track=[],r._creatingCover=null,i&&_i(r,i)}}function c9(r,e,t){var a=r._zr;return e<0||e>a.getWidth()||t<0||t>a.getHeight()}var Xh={lineX:ax(0),lineY:ax(1),rect:{createCover:function(r,e){function t(a){return a}return iM({toRectRange:t,fromRectRange:t},r,e,[[\"w\"],[\"e\"],[\"n\"],[\"s\"],[\"s\",\"e\"],[\"s\",\"w\"],[\"n\",\"e\"],[\"n\",\"w\"]])},getCreatingRange:function(r){var e=nM(r);return sM(e[1][0],e[1][1],e[0][0],e[0][1])},updateCoverShape:function(r,e,t,a){oM(r,e,t,a)},updateCommon:zp,contain:Hp},polygon:{createCover:function(r,e){var t=new nt;return t.add(new Fe({name:\"main\",style:Wy(e),silent:!0})),t},getCreatingRange:function(r){return r},endCreating:function(r,e){e.remove(e.childAt(0)),e.add(new ze({name:\"main\",draggable:!0,drift:ot(u9,r,e),ondragend:ot(_i,r,{isEnd:!0})}))},updateCoverShape:function(r,e,t,a){e.childAt(0).setShape({points:$y(r,e,t)})},updateCommon:zp,contain:Hp}};function ax(r){return{createCover:function(e,t){return iM({toRectRange:function(a){var n=[a,[0,100]];return r&&n.reverse(),n},fromRectRange:function(a){return a[r]}},e,t,[[[\"w\"],[\"e\"]],[[\"n\"],[\"s\"]]][r])},getCreatingRange:function(e){var t=nM(e),a=hl(t[0][r],t[1][r]),n=mo(t[0][r],t[1][r]);return[a,n]},updateCoverShape:function(e,t,a,n){var i,o=aM(e,t);if(o!==mi&&o.getLinearBrushOtherExtent)i=o.getLinearBrushOtherExtent(r);else{var s=e._zr;i=[0,[s.getWidth(),s.getHeight()][1-r]]}var l=[a,i];r&&l.reverse(),oM(e,t,l,n)},updateCommon:zp,contain:Hp}}var Uy=i9;function fM(r){return r=Yy(r),function(e){return TC(e,r)}}function hM(r,e){return r=Yy(r),function(t){var a=e!=null?e:t,n=a?r.width:r.height,i=a?r.x:r.y;return[i,i+(n||0)]}}function vM(r,e,t){var a=Yy(r);return function(n,i){return a.contain(i[0],i[1])&&!$h(n,e,t)}}function Yy(r){return vt.create(r)}var d9=[\"axisLine\",\"axisTickLabel\",\"axisName\"],p9=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.init=function(t,a){r.prototype.init.apply(this,arguments),(this._brushController=new Uy(a.getZr())).on(\"brush\",Y(this._onBrush,this))},e.prototype.render=function(t,a,n,i){if(!g9(t,a,i)){this.axisModel=t,this.api=n,this.group.removeAll();var o=this._axisGroup;if(this._axisGroup=new nt,this.group.add(this._axisGroup),!!t.get(\"show\")){var s=m9(t,a),l=s.coordinateSystem,u=t.getAreaSelectStyle(),f=u.width,h=t.axis.dim,v=l.getAxisLayout(h),c=V({strokeContainThreshold:f},v),d=new wa(t,c);A(d9,d.add,d),this._axisGroup.add(d.getGroup()),this._refreshBrushController(c,u,t,s,f,n),Tl(o,this._axisGroup,t)}}},e.prototype._refreshBrushController=function(t,a,n,i,o,s){var l=n.axis.getExtent(),u=l[1]-l[0],f=Math.min(30,Math.abs(u)*.1),h=vt.create({x:l[0],y:-o/2,width:u,height:o});h.x-=f,h.width+=2*f,this._brushController.mount({enableGlobalPan:!0,rotation:t.rotation,x:t.position[0],y:t.position[1]}).setPanels([{panelId:\"pl\",clipPath:fM(h),isTargetByCursor:vM(h,s,i),getLinearBrushOtherExtent:hM(h,0)}]).enableBrush({brushType:\"lineX\",brushStyle:a,removeOnClick:!0}).updateCovers(y9(n))},e.prototype._onBrush=function(t){var a=t.areas,n=this.axisModel,i=n.axis,o=G(a,function(s){return[i.coordToData(s.range[0],!0),i.coordToData(s.range[1],!0)]});(!n.option.realtime===t.isEnd||t.removeOnClick)&&this.api.dispatchAction({type:\"axisAreaSelect\",parallelAxisId:n.id,intervals:o})},e.prototype.dispose=function(){this._brushController.dispose()},e.type=\"parallelAxis\",e}(Ut);function g9(r,e,t){return t&&t.type===\"axisAreaSelect\"&&e.findComponents({mainType:\"parallelAxis\",query:t})[0]===r}function y9(r){var e=r.axis;return G(r.activeIntervals,function(t){return{brushType:\"lineX\",panelId:\"pl\",range:[e.dataToCoord(t[0],!0),e.dataToCoord(t[1],!0)]}})}function m9(r,e){return e.getComponent(\"parallel\",r.get(\"parallelIndex\"))}var _9=p9,S9={type:\"axisAreaSelect\",event:\"axisAreaSelected\"};function x9(r){r.registerAction(S9,function(e,t){t.eachComponent({mainType:\"parallelAxis\",query:e},function(a){a.axis.model.setActiveIntervals(e.intervals)})}),r.registerAction(\"parallelAxisExpand\",function(e,t){t.eachComponent({mainType:\"parallel\",query:e},function(a){a.setAxisExpand(e)})})}var w9={type:\"value\",areaSelectStyle:{width:20,borderWidth:1,borderColor:\"rgba(160,197,232)\",color:\"rgba(160,197,232)\",opacity:.3},realtime:!0,z:10};function cM(r){r.registerComponentView(VF),r.registerComponentModel(FF),r.registerCoordinateSystem(\"parallel\",JF),r.registerPreprocessor(RF),r.registerComponentModel(JS),r.registerComponentView(_9),yo(r,\"parallel\",JS,w9),x9(r)}function b9(r){ct(cM),r.registerChartView(CF),r.registerSeriesModel(MF),r.registerVisual(r.PRIORITY.VISUAL.BRUSH,PF)}var C9=function(){function r(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.cpx1=0,this.cpy1=0,this.cpx2=0,this.cpy2=0,this.extent=0}return r}(),T9=function(r){k(e,r);function e(t){return r.call(this,t)||this}return e.prototype.getDefaultShape=function(){return new C9},e.prototype.buildPath=function(t,a){var n=a.extent;t.moveTo(a.x1,a.y1),t.bezierCurveTo(a.cpx1,a.cpy1,a.cpx2,a.cpy2,a.x2,a.y2),a.orient===\"vertical\"?(t.lineTo(a.x2+n,a.y2),t.bezierCurveTo(a.cpx2+n,a.cpy2,a.cpx1+n,a.cpy1,a.x1+n,a.y1)):(t.lineTo(a.x2,a.y2+n),t.bezierCurveTo(a.cpx2,a.cpy2+n,a.cpx1,a.cpy1+n,a.x1,a.y1+n)),t.closePath()},e.prototype.highlight=function(){_a(this)},e.prototype.downplay=function(){Sa(this)},e}(mt),A9=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t._focusAdjacencyDisabled=!1,t}return e.prototype.render=function(t,a,n){var i=this,o=t.getGraph(),s=this.group,l=t.layoutInfo,u=l.width,f=l.height,h=t.getData(),v=t.getData(\"edge\"),c=t.get(\"orient\");this._model=t,s.removeAll(),s.x=l.x,s.y=l.y,o.eachEdge(function(d){var p=new T9,g=it(p);g.dataIndex=d.dataIndex,g.seriesIndex=t.seriesIndex,g.dataType=\"edge\";var y=d.getModel(),m=y.getModel(\"lineStyle\"),_=m.get(\"curveness\"),S=d.node1.getLayout(),w=d.node1.getModel(),x=w.get(\"localX\"),b=w.get(\"localY\"),C=d.node2.getLayout(),T=d.node2.getModel(),D=T.get(\"localX\"),M=T.get(\"localY\"),L=d.getLayout(),I,P,R,E,B,O,z,H;p.shape.extent=Math.max(1,L.dy),p.shape.orient=c,c===\"vertical\"?(I=(x!=null?x*u:S.x)+L.sy,P=(b!=null?b*f:S.y)+S.dy,R=(D!=null?D*u:C.x)+L.ty,E=M!=null?M*f:C.y,B=I,O=P*(1-_)+E*_,z=R,H=P*_+E*(1-_)):(I=(x!=null?x*u:S.x)+S.dx,P=(b!=null?b*f:S.y)+L.sy,R=D!=null?D*u:C.x,E=(M!=null?M*f:C.y)+L.ty,B=I*(1-_)+R*_,O=P,z=I*_+R*(1-_),H=E),p.setShape({x1:I,y1:P,x2:R,y2:E,cpx1:B,cpy1:O,cpx2:z,cpy2:H}),p.useStyle(m.getItemStyle()),nx(p.style,c,d);var $=\"\"+y.get(\"value\"),X=ie(y,\"edgeLabel\");de(p,X,{labelFetcher:{getFormattedLabel:function(pt,xt,gt,rt,yt,st){return t.getFormattedLabel(pt,xt,\"edge\",rt,Ur(yt,X.normal&&X.normal.get(\"formatter\"),$),st)}},labelDataIndex:d.dataIndex,defaultText:$}),p.setTextConfig({position:\"inside\"});var Q=y.getModel(\"emphasis\");ce(p,y,\"lineStyle\",function(pt){var xt=pt.getItemStyle();return nx(xt,c,d),xt}),s.add(p),v.setItemGraphicEl(d.dataIndex,p);var j=Q.get(\"focus\");$t(p,j===\"adjacency\"?d.getAdjacentDataIndices():j===\"trajectory\"?d.getTrajectoryDataIndices():j,Q.get(\"blurScope\"),Q.get(\"disabled\"))}),o.eachNode(function(d){var p=d.getLayout(),g=d.getModel(),y=g.get(\"localX\"),m=g.get(\"localY\"),_=g.getModel(\"emphasis\"),S=new bt({shape:{x:y!=null?y*u:p.x,y:m!=null?m*f:p.y,width:p.dx,height:p.dy},style:g.getModel(\"itemStyle\").getItemStyle(),z2:10});de(S,ie(g),{labelFetcher:{getFormattedLabel:function(x,b){return t.getFormattedLabel(x,b,\"node\")}},labelDataIndex:d.dataIndex,defaultText:d.id}),S.disableLabelAnimation=!0,S.setStyle(\"fill\",d.getVisual(\"color\")),S.setStyle(\"decal\",d.getVisual(\"style\").decal),ce(S,g),s.add(S),h.setItemGraphicEl(d.dataIndex,S),it(S).dataType=\"node\";var w=_.get(\"focus\");$t(S,w===\"adjacency\"?d.getAdjacentDataIndices():w===\"trajectory\"?d.getTrajectoryDataIndices():w,_.get(\"blurScope\"),_.get(\"disabled\"))}),h.eachItemGraphicEl(function(d,p){var g=h.getItemModel(p);g.get(\"draggable\")&&(d.drift=function(y,m){i._focusAdjacencyDisabled=!0,this.shape.x+=y,this.shape.y+=m,this.dirty(),n.dispatchAction({type:\"dragNode\",seriesId:t.id,dataIndex:h.getRawIndex(p),localX:this.shape.x/u,localY:this.shape.y/f})},d.ondragend=function(){i._focusAdjacencyDisabled=!1},d.draggable=!0,d.cursor=\"move\")}),!this._data&&t.isAnimationEnabled()&&s.setClipPath(D9(s.getBoundingRect(),t,function(){s.removeClipPath()})),this._data=t.getData()},e.prototype.dispose=function(){},e.type=\"sankey\",e}(zt);function nx(r,e,t){switch(r.fill){case\"source\":r.fill=t.node1.getVisual(\"color\"),r.decal=t.node1.getVisual(\"style\").decal;break;case\"target\":r.fill=t.node2.getVisual(\"color\"),r.decal=t.node2.getVisual(\"style\").decal;break;case\"gradient\":var a=t.node1.getVisual(\"color\"),n=t.node2.getVisual(\"color\");U(a)&&U(n)&&(r.fill=new Cl(0,0,+(e===\"horizontal\"),+(e===\"vertical\"),[{color:a,offset:0},{color:n,offset:1}]))}}function D9(r,e,t){var a=new bt({shape:{x:r.x-10,y:r.y-10,width:0,height:r.height+20}});return Ft(a,{shape:{width:r.width+20}},e,t),a}var M9=A9,L9=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.getInitialData=function(t,a){var n=t.edges||t.links,i=t.data||t.nodes,o=t.levels;this.levelModels=[];for(var s=this.levelModels,l=0;l<o.length;l++)o[l].depth!=null&&o[l].depth>=0&&(s[o[l].depth]=new Vt(o[l],this,a));if(i&&n){var u=ZD(i,n,this,!0,f);return u.data}function f(h,v){h.wrapMethod(\"getItemModel\",function(c,d){var p=c.parentModel,g=p.getData().getItemLayout(d);if(g){var y=g.depth,m=p.levelModels[y];m&&(c.parentModel=m)}return c}),v.wrapMethod(\"getItemModel\",function(c,d){var p=c.parentModel,g=p.getGraph().getEdgeByIndex(d),y=g.node1.getLayout();if(y){var m=y.depth,_=p.levelModels[m];_&&(c.parentModel=_)}return c})}},e.prototype.setNodePosition=function(t,a){var n=this.option.data||this.option.nodes,i=n[t];i.localX=a[0],i.localY=a[1]},e.prototype.getGraph=function(){return this.getData().graph},e.prototype.getEdgeData=function(){return this.getGraph().edgeData},e.prototype.formatTooltip=function(t,a,n){function i(c){return isNaN(c)||c==null}if(n===\"edge\"){var o=this.getDataParams(t,n),s=o.data,l=o.value,u=s.source+\" -- \"+s.target;return oe(\"nameValue\",{name:u,value:l,noValue:i(l)})}else{var f=this.getGraph().getNodeByIndex(t),h=f.getLayout().value,v=this.getDataParams(t,n).data.name;return oe(\"nameValue\",{name:v!=null?v+\"\":null,value:h,noValue:i(h)})}},e.prototype.optionUpdated=function(){},e.prototype.getDataParams=function(t,a){var n=r.prototype.getDataParams.call(this,t,a);if(n.value==null&&a===\"node\"){var i=this.getGraph().getNodeByIndex(t),o=i.getLayout().value;n.value=o}return n},e.type=\"series.sankey\",e.defaultOption={z:2,coordinateSystem:\"view\",left:\"5%\",top:\"5%\",right:\"20%\",bottom:\"5%\",orient:\"horizontal\",nodeWidth:20,nodeGap:8,draggable:!0,layoutIterations:32,label:{show:!0,position:\"right\",fontSize:12},edgeLabel:{show:!1,fontSize:12},levels:[],nodeAlign:\"justify\",lineStyle:{color:\"#314656\",opacity:.2,curveness:.5},emphasis:{label:{show:!0},lineStyle:{opacity:.5}},select:{itemStyle:{borderColor:\"#212121\"}},animationEasing:\"linear\",animationDuration:1e3},e}(Ht),I9=L9;function P9(r,e){r.eachSeriesByType(\"sankey\",function(t){var a=t.get(\"nodeWidth\"),n=t.get(\"nodeGap\"),i=R9(t,e);t.layoutInfo=i;var o=i.width,s=i.height,l=t.getGraph(),u=l.nodes,f=l.edges;k9(u);var h=Et(u,function(p){return p.getLayout().value===0}),v=h.length!==0?0:t.get(\"layoutIterations\"),c=t.get(\"orient\"),d=t.get(\"nodeAlign\");E9(u,f,a,n,o,s,v,c,d)})}function R9(r,e){return re(r.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()})}function E9(r,e,t,a,n,i,o,s,l){O9(r,e,t,n,i,s,l),z9(r,e,i,n,a,o,s),X9(r,s)}function k9(r){A(r,function(e){var t=ja(e.outEdges,Jf),a=ja(e.inEdges,Jf),n=e.getValue()||0,i=Math.max(t,a,n);e.setLayout({value:i},!0)})}function O9(r,e,t,a,n,i,o){for(var s=[],l=[],u=[],f=[],h=0,v=0;v<e.length;v++)s[v]=1;for(var v=0;v<r.length;v++)l[v]=r[v].inEdges.length,l[v]===0&&u.push(r[v]);for(var c=-1;u.length;){for(var d=0;d<u.length;d++){var p=u[d],g=p.hostGraph.data.getRawDataItem(p.dataIndex),y=g.depth!=null&&g.depth>=0;y&&g.depth>c&&(c=g.depth),p.setLayout({depth:y?g.depth:h},!0),i===\"vertical\"?p.setLayout({dy:t},!0):p.setLayout({dx:t},!0);for(var m=0;m<p.outEdges.length;m++){var _=p.outEdges[m],S=e.indexOf(_);s[S]=0;var w=_.node2,x=r.indexOf(w);--l[x]===0&&f.indexOf(w)<0&&f.push(w)}}++h,u=f,f=[]}for(var v=0;v<s.length;v++)if(s[v]===1)throw new Error(\"Sankey is a DAG, the original data has cycle!\");var b=c>h-1?c:h-1;o&&o!==\"left\"&&B9(r,o,i,b);var C=i===\"vertical\"?(n-t)/b:(a-t)/b;V9(r,C,i)}function dM(r){var e=r.hostGraph.data.getRawDataItem(r.dataIndex);return e.depth!=null&&e.depth>=0}function B9(r,e,t,a){if(e===\"right\"){for(var n=[],i=r,o=0;i.length;){for(var s=0;s<i.length;s++){var l=i[s];l.setLayout({skNodeHeight:o},!0);for(var u=0;u<l.inEdges.length;u++){var f=l.inEdges[u];n.indexOf(f.node1)<0&&n.push(f.node1)}}i=n,n=[],++o}A(r,function(h){dM(h)||h.setLayout({depth:Math.max(0,a-h.getLayout().skNodeHeight)},!0)})}else e===\"justify\"&&N9(r,a)}function N9(r,e){A(r,function(t){!dM(t)&&!t.outEdges.length&&t.setLayout({depth:e},!0)})}function V9(r,e,t){A(r,function(a){var n=a.getLayout().depth*e;t===\"vertical\"?a.setLayout({y:n},!0):a.setLayout({x:n},!0)})}function z9(r,e,t,a,n,i,o){var s=F9(r,o);G9(s,e,t,a,n,o),Fc(s,n,t,a,o);for(var l=1;i>0;i--)l*=.99,H9(s,l,o),Fc(s,n,t,a,o),Z9(s,l,o),Fc(s,n,t,a,o)}function F9(r,e){var t=[],a=e===\"vertical\"?\"y\":\"x\",n=Xd(r,function(i){return i.getLayout()[a]});return n.keys.sort(function(i,o){return i-o}),A(n.keys,function(i){t.push(n.buckets.get(i))}),t}function G9(r,e,t,a,n,i){var o=1/0;A(r,function(s){var l=s.length,u=0;A(s,function(h){u+=h.getLayout().value});var f=i===\"vertical\"?(a-(l-1)*n)/u:(t-(l-1)*n)/u;f<o&&(o=f)}),A(r,function(s){A(s,function(l,u){var f=l.getLayout().value*o;i===\"vertical\"?(l.setLayout({x:u},!0),l.setLayout({dx:f},!0)):(l.setLayout({y:u},!0),l.setLayout({dy:f},!0))})}),A(e,function(s){var l=+s.getValue()*o;s.setLayout({dy:l},!0)})}function Fc(r,e,t,a,n){var i=n===\"vertical\"?\"x\":\"y\";A(r,function(o){o.sort(function(p,g){return p.getLayout()[i]-g.getLayout()[i]});for(var s,l,u,f=0,h=o.length,v=n===\"vertical\"?\"dx\":\"dy\",c=0;c<h;c++)l=o[c],u=f-l.getLayout()[i],u>0&&(s=l.getLayout()[i]+u,n===\"vertical\"?l.setLayout({x:s},!0):l.setLayout({y:s},!0)),f=l.getLayout()[i]+l.getLayout()[v]+e;var d=n===\"vertical\"?a:t;if(u=f-e-d,u>0){s=l.getLayout()[i]-u,n===\"vertical\"?l.setLayout({x:s},!0):l.setLayout({y:s},!0),f=s;for(var c=h-2;c>=0;--c)l=o[c],u=l.getLayout()[i]+l.getLayout()[v]+e-f,u>0&&(s=l.getLayout()[i]-u,n===\"vertical\"?l.setLayout({x:s},!0):l.setLayout({y:s},!0)),f=l.getLayout()[i]}})}function H9(r,e,t){A(r.slice().reverse(),function(a){A(a,function(n){if(n.outEdges.length){var i=ja(n.outEdges,W9,t)/ja(n.outEdges,Jf);if(isNaN(i)){var o=n.outEdges.length;i=o?ja(n.outEdges,$9,t)/o:0}if(t===\"vertical\"){var s=n.getLayout().x+(i-sn(n,t))*e;n.setLayout({x:s},!0)}else{var l=n.getLayout().y+(i-sn(n,t))*e;n.setLayout({y:l},!0)}}})})}function W9(r,e){return sn(r.node2,e)*r.getValue()}function $9(r,e){return sn(r.node2,e)}function U9(r,e){return sn(r.node1,e)*r.getValue()}function Y9(r,e){return sn(r.node1,e)}function sn(r,e){return e===\"vertical\"?r.getLayout().x+r.getLayout().dx/2:r.getLayout().y+r.getLayout().dy/2}function Jf(r){return r.getValue()}function ja(r,e,t){for(var a=0,n=r.length,i=-1;++i<n;){var o=+e(r[i],t);isNaN(o)||(a+=o)}return a}function Z9(r,e,t){A(r,function(a){A(a,function(n){if(n.inEdges.length){var i=ja(n.inEdges,U9,t)/ja(n.inEdges,Jf);if(isNaN(i)){var o=n.inEdges.length;i=o?ja(n.inEdges,Y9,t)/o:0}if(t===\"vertical\"){var s=n.getLayout().x+(i-sn(n,t))*e;n.setLayout({x:s},!0)}else{var l=n.getLayout().y+(i-sn(n,t))*e;n.setLayout({y:l},!0)}}})})}function X9(r,e){var t=e===\"vertical\"?\"x\":\"y\";A(r,function(a){a.outEdges.sort(function(n,i){return n.node2.getLayout()[t]-i.node2.getLayout()[t]}),a.inEdges.sort(function(n,i){return n.node1.getLayout()[t]-i.node1.getLayout()[t]})}),A(r,function(a){var n=0,i=0;A(a.outEdges,function(o){o.setLayout({sy:n},!0),n+=o.getLayout().dy}),A(a.inEdges,function(o){o.setLayout({ty:i},!0),i+=o.getLayout().dy})})}function q9(r){r.eachSeriesByType(\"sankey\",function(e){var t=e.getGraph(),a=t.nodes,n=t.edges;if(a.length){var i=1/0,o=-1/0;A(a,function(s){var l=s.getLayout().value;l<i&&(i=l),l>o&&(o=l)}),A(a,function(s){var l=new ve({type:\"color\",mappingMethod:\"linear\",dataExtent:[i,o],visual:e.get(\"color\")}),u=l.mapValueToVisual(s.getLayout().value),f=s.getModel().get([\"itemStyle\",\"color\"]);f!=null?(s.setVisual(\"color\",f),s.setVisual(\"style\",{fill:f})):(s.setVisual(\"color\",u),s.setVisual(\"style\",{fill:u}))})}n.length&&A(n,function(s){var l=s.getModel().get(\"lineStyle\");s.setVisual(\"style\",l)})})}function K9(r){r.registerChartView(M9),r.registerSeriesModel(I9),r.registerLayout(P9),r.registerVisual(q9),r.registerAction({type:\"dragNode\",event:\"dragnode\",update:\"update\"},function(e,t){t.eachComponent({mainType:\"series\",subType:\"sankey\",query:e},function(a){a.setNodePosition(e.dataIndex,[e.localX,e.localY])})})}var pM=function(){function r(){}return r.prototype.getInitialData=function(e,t){var a,n=t.getComponent(\"xAxis\",this.get(\"xAxisIndex\")),i=t.getComponent(\"yAxis\",this.get(\"yAxisIndex\")),o=n.get(\"type\"),s=i.get(\"type\"),l;o===\"category\"?(e.layout=\"horizontal\",a=n.getOrdinalMeta(),l=!0):s===\"category\"?(e.layout=\"vertical\",a=i.getOrdinalMeta(),l=!0):e.layout=e.layout||\"horizontal\";var u=[\"x\",\"y\"],f=e.layout===\"horizontal\"?0:1,h=this._baseAxisDim=u[f],v=u[1-f],c=[n,i],d=c[f].get(\"type\"),p=c[1-f].get(\"type\"),g=e.data;if(g&&l){var y=[];A(g,function(S,w){var x;F(S)?(x=S.slice(),S.unshift(w)):F(S.value)?(x=V({},S),x.value=x.value.slice(),S.value.unshift(w)):x=S,y.push(x)}),e.data=y}var m=this.defaultValueDimensions,_=[{name:h,type:Ff(d),ordinalMeta:a,otherDims:{tooltip:!1,itemName:0},dimsDef:[\"base\"]},{name:v,type:Ff(p),dimsDef:m.slice()}];return No(this,{coordDimensions:_,dimensionsCount:m.length+1,encodeDefaulter:ot(QC,_,this)})},r.prototype.getBaseAxis=function(){var e=this._baseAxisDim;return this.ecModel.getComponent(e+\"Axis\",this.get(e+\"AxisIndex\")).axis},r}(),gM=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.defaultValueDimensions=[{name:\"min\",defaultTooltip:!0},{name:\"Q1\",defaultTooltip:!0},{name:\"median\",defaultTooltip:!0},{name:\"Q3\",defaultTooltip:!0},{name:\"max\",defaultTooltip:!0}],t.visualDrawType=\"stroke\",t}return e.type=\"series.boxplot\",e.dependencies=[\"xAxis\",\"yAxis\",\"grid\"],e.defaultOption={z:2,coordinateSystem:\"cartesian2d\",legendHoverLink:!0,layout:null,boxWidth:[7,50],itemStyle:{color:\"#fff\",borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2,shadowBlur:5,shadowOffsetX:1,shadowOffsetY:1,shadowColor:\"rgba(0,0,0,0.2)\"}},animationDuration:800},e}(Ht);te(gM,pM,!0);var J9=gM,Q9=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n){var i=t.getData(),o=this.group,s=this._data;this._data||o.removeAll();var l=t.get(\"layout\")===\"horizontal\"?1:0;i.diff(s).add(function(u){if(i.hasValue(u)){var f=i.getItemLayout(u),h=ix(f,i,u,l,!0);i.setItemGraphicEl(u,h),o.add(h)}}).update(function(u,f){var h=s.getItemGraphicEl(f);if(!i.hasValue(u)){o.remove(h);return}var v=i.getItemLayout(u);h?(Ar(h),yM(v,h,i,u)):h=ix(v,i,u,l),o.add(h),i.setItemGraphicEl(u,h)}).remove(function(u){var f=s.getItemGraphicEl(u);f&&o.remove(f)}).execute(),this._data=i},e.prototype.remove=function(t){var a=this.group,n=this._data;this._data=null,n&&n.eachItemGraphicEl(function(i){i&&a.remove(i)})},e.type=\"boxplot\",e}(zt),j9=function(){function r(){}return r}(),tG=function(r){k(e,r);function e(t){var a=r.call(this,t)||this;return a.type=\"boxplotBoxPath\",a}return e.prototype.getDefaultShape=function(){return new j9},e.prototype.buildPath=function(t,a){var n=a.points,i=0;for(t.moveTo(n[i][0],n[i][1]),i++;i<4;i++)t.lineTo(n[i][0],n[i][1]);for(t.closePath();i<n.length;i++)t.moveTo(n[i][0],n[i][1]),i++,t.lineTo(n[i][0],n[i][1])},e}(mt);function ix(r,e,t,a,n){var i=r.ends,o=new tG({shape:{points:n?eG(i,a,r):i}});return yM(r,o,e,t,n),o}function yM(r,e,t,a,n){var i=t.hostModel,o=Dl[n?\"initProps\":\"updateProps\"];o(e,{shape:{points:r.ends}},i,a),e.useStyle(t.getItemVisual(a,\"style\")),e.style.strokeNoScale=!0,e.z2=100;var s=t.getItemModel(a),l=s.getModel(\"emphasis\");ce(e,s),$t(e,l.get(\"focus\"),l.get(\"blurScope\"),l.get(\"disabled\"))}function eG(r,e,t){return G(r,function(a){return a=a.slice(),a[e]=t.initBaseline,a})}var rG=Q9,Vs=A;function aG(r){var e=nG(r);Vs(e,function(t){var a=t.seriesModels;!a.length||(iG(t),Vs(a,function(n,i){oG(n,t.boxOffsetList[i],t.boxWidthList[i])}))})}function nG(r){var e=[],t=[];return r.eachSeriesByType(\"boxplot\",function(a){var n=a.getBaseAxis(),i=dt(t,n);i<0&&(i=t.length,t[i]=n,e[i]={axis:n,seriesModels:[]}),e[i].seriesModels.push(a)}),e}function iG(r){var e=r.axis,t=r.seriesModels,a=t.length,n=r.boxWidthList=[],i=r.boxOffsetList=[],o=[],s;if(e.type===\"category\")s=e.getBandWidth();else{var l=0;Vs(t,function(d){l=Math.max(l,d.getData().count())});var u=e.getExtent();s=Math.abs(u[1]-u[0])/l}Vs(t,function(d){var p=d.get(\"boxWidth\");F(p)||(p=[p,p]),o.push([W(p[0],s)||0,W(p[1],s)||0])});var f=s*.8-2,h=f/a*.3,v=(f-h*(a-1))/a,c=v/2-f/2;Vs(t,function(d,p){i.push(c),c+=h+v,n.push(Math.min(Math.max(v,o[p][0]),o[p][1]))})}function oG(r,e,t){var a=r.coordinateSystem,n=r.getData(),i=t/2,o=r.get(\"layout\")===\"horizontal\"?0:1,s=1-o,l=[\"x\",\"y\"],u=n.mapDimension(l[o]),f=n.mapDimensionsAll(l[s]);if(u==null||f.length<5)return;for(var h=0;h<n.count();h++){var v=n.get(u,h),c=_(v,f[2],h),d=_(v,f[0],h),p=_(v,f[1],h),g=_(v,f[3],h),y=_(v,f[4],h),m=[];S(m,p,!1),S(m,g,!0),m.push(d,p,y,g),w(m,d),w(m,y),w(m,c),n.setItemLayout(h,{initBaseline:c[s],ends:m})}function _(x,b,C){var T=n.get(b,C),D=[];D[o]=x,D[s]=T;var M;return isNaN(x)||isNaN(T)?M=[NaN,NaN]:(M=a.dataToPoint(D),M[o]+=e),M}function S(x,b,C){var T=b.slice(),D=b.slice();T[o]+=i,D[o]-=i,C?x.push(T,D):x.push(D,T)}function w(x,b){var C=b.slice(),T=b.slice();C[o]-=i,T[o]+=i,x.push(C,T)}}function sG(r,e){e=e||{};for(var t=[],a=[],n=e.boundIQR,i=n===\"none\"||n===0,o=0;o<r.length;o++){var s=or(r[o].slice()),l=Sv(s,.25),u=Sv(s,.5),f=Sv(s,.75),h=s[0],v=s[s.length-1],c=(n==null?1.5:n)*(f-l),d=i?h:Math.max(h,l-c),p=i?v:Math.min(v,f+c),g=e.itemNameFormatter,y=J(g)?g({value:o}):U(g)?g.replace(\"{value}\",o+\"\"):o+\"\";t.push([y,d,l,u,f,p]);for(var m=0;m<s.length;m++){var _=s[m];if(_<d||_>p){var S=[y,_];a.push(S)}}}return{boxData:t,outliers:a}}var lG={type:\"echarts:boxplot\",transform:function(e){var t=e.upstream;if(t.sourceFormat!==xe){var a=\"\";Pt(a)}var n=sG(t.getRawData(),e.config);return[{dimensions:[\"ItemName\",\"Low\",\"Q1\",\"Q2\",\"Q3\",\"High\"],data:n.boxData},{data:n.outliers}]}};function uG(r){r.registerSeriesModel(J9),r.registerChartView(rG),r.registerLayout(aG),r.registerTransform(lG)}var fG=[\"color\",\"borderColor\"],hG=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n){this.group.removeClipPath(),this._progressiveEls=null,this._updateDrawMode(t),this._isLargeDraw?this._renderLarge(t):this._renderNormal(t)},e.prototype.incrementalPrepareRender=function(t,a,n){this._clear(),this._updateDrawMode(t)},e.prototype.incrementalRender=function(t,a,n,i){this._progressiveEls=[],this._isLargeDraw?this._incrementalRenderLarge(t,a):this._incrementalRenderNormal(t,a)},e.prototype.eachRendered=function(t){vn(this._progressiveEls||this.group,t)},e.prototype._updateDrawMode=function(t){var a=t.pipelineContext.large;(this._isLargeDraw==null||a!==this._isLargeDraw)&&(this._isLargeDraw=a,this._clear())},e.prototype._renderNormal=function(t){var a=t.getData(),n=this._data,i=this.group,o=a.getLayout(\"isSimpleBox\"),s=t.get(\"clip\",!0),l=t.coordinateSystem,u=l.getArea&&l.getArea();this._data||i.removeAll(),a.diff(n).add(function(f){if(a.hasValue(f)){var h=a.getItemLayout(f);if(s&&ox(u,h))return;var v=Gc(h,f,!0);Ft(v,{shape:{points:h.ends}},t,f),Hc(v,a,f,o),i.add(v),a.setItemGraphicEl(f,v)}}).update(function(f,h){var v=n.getItemGraphicEl(h);if(!a.hasValue(f)){i.remove(v);return}var c=a.getItemLayout(f);if(s&&ox(u,c)){i.remove(v);return}v?(Lt(v,{shape:{points:c.ends}},t,f),Ar(v)):v=Gc(c),Hc(v,a,f,o),i.add(v),a.setItemGraphicEl(f,v)}).remove(function(f){var h=n.getItemGraphicEl(f);h&&i.remove(h)}).execute(),this._data=a},e.prototype._renderLarge=function(t){this._clear(),sx(t,this.group);var a=t.get(\"clip\",!0)?Wh(t.coordinateSystem,!1,t):null;a?this.group.setClipPath(a):this.group.removeClipPath()},e.prototype._incrementalRenderNormal=function(t,a){for(var n=a.getData(),i=n.getLayout(\"isSimpleBox\"),o;(o=t.next())!=null;){var s=n.getItemLayout(o),l=Gc(s);Hc(l,n,o,i),l.incremental=!0,this.group.add(l),this._progressiveEls.push(l)}},e.prototype._incrementalRenderLarge=function(t,a){sx(a,this.group,this._progressiveEls,!0)},e.prototype.remove=function(t){this._clear()},e.prototype._clear=function(){this.group.removeAll(),this._data=null},e.type=\"candlestick\",e}(zt),vG=function(){function r(){}return r}(),cG=function(r){k(e,r);function e(t){var a=r.call(this,t)||this;return a.type=\"normalCandlestickBox\",a}return e.prototype.getDefaultShape=function(){return new vG},e.prototype.buildPath=function(t,a){var n=a.points;this.__simpleBox?(t.moveTo(n[4][0],n[4][1]),t.lineTo(n[6][0],n[6][1])):(t.moveTo(n[0][0],n[0][1]),t.lineTo(n[1][0],n[1][1]),t.lineTo(n[2][0],n[2][1]),t.lineTo(n[3][0],n[3][1]),t.closePath(),t.moveTo(n[4][0],n[4][1]),t.lineTo(n[5][0],n[5][1]),t.moveTo(n[6][0],n[6][1]),t.lineTo(n[7][0],n[7][1]))},e}(mt);function Gc(r,e,t){var a=r.ends;return new cG({shape:{points:t?dG(a,r):a},z2:100})}function ox(r,e){for(var t=!0,a=0;a<e.ends.length;a++)if(r.contain(e.ends[a][0],e.ends[a][1])){t=!1;break}return t}function Hc(r,e,t,a){var n=e.getItemModel(t);r.useStyle(e.getItemVisual(t,\"style\")),r.style.strokeNoScale=!0,r.__simpleBox=a,ce(r,n)}function dG(r,e){return G(r,function(t){return t=t.slice(),t[1]=e.initBaseline,t})}var pG=function(){function r(){}return r}(),Wc=function(r){k(e,r);function e(t){var a=r.call(this,t)||this;return a.type=\"largeCandlestickBox\",a}return e.prototype.getDefaultShape=function(){return new pG},e.prototype.buildPath=function(t,a){for(var n=a.points,i=0;i<n.length;)if(this.__sign===n[i++]){var o=n[i++];t.moveTo(o,n[i++]),t.lineTo(o,n[i++])}else i+=3},e}(mt);function sx(r,e,t,a){var n=r.getData(),i=n.getLayout(\"largePoints\"),o=new Wc({shape:{points:i},__sign:1,ignoreCoarsePointer:!0});e.add(o);var s=new Wc({shape:{points:i},__sign:-1,ignoreCoarsePointer:!0});e.add(s);var l=new Wc({shape:{points:i},__sign:0,ignoreCoarsePointer:!0});e.add(l),$c(1,o,r),$c(-1,s,r),$c(0,l,r),a&&(o.incremental=!0,s.incremental=!0),t&&t.push(o,s)}function $c(r,e,t,a){var n=t.get([\"itemStyle\",r>0?\"borderColor\":\"borderColor0\"])||t.get([\"itemStyle\",r>0?\"color\":\"color0\"]);r===0&&(n=t.get([\"itemStyle\",\"borderColorDoji\"]));var i=t.getModel(\"itemStyle\").getItemStyle(fG);e.useStyle(i),e.style.fill=null,e.style.stroke=n}var gG=hG,mM=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.defaultValueDimensions=[{name:\"open\",defaultTooltip:!0},{name:\"close\",defaultTooltip:!0},{name:\"lowest\",defaultTooltip:!0},{name:\"highest\",defaultTooltip:!0}],t}return e.prototype.getShadowDim=function(){return\"open\"},e.prototype.brushSelector=function(t,a,n){var i=a.getItemLayout(t);return i&&n.rect(i.brushRect)},e.type=\"series.candlestick\",e.dependencies=[\"xAxis\",\"yAxis\",\"grid\"],e.defaultOption={z:2,coordinateSystem:\"cartesian2d\",legendHoverLink:!0,layout:null,clip:!0,itemStyle:{color:\"#eb5454\",color0:\"#47b262\",borderColor:\"#eb5454\",borderColor0:\"#47b262\",borderColorDoji:null,borderWidth:1},emphasis:{scale:!0,itemStyle:{borderWidth:2}},barMaxWidth:null,barMinWidth:null,barWidth:null,large:!0,largeThreshold:600,progressive:3e3,progressiveThreshold:1e4,progressiveChunkMode:\"mod\",animationEasing:\"linear\",animationDuration:300},e}(Ht);te(mM,pM,!0);var yG=mM;function mG(r){!r||!F(r.series)||A(r.series,function(e){et(e)&&e.type===\"k\"&&(e.type=\"candlestick\")})}var _G=[\"itemStyle\",\"borderColor\"],SG=[\"itemStyle\",\"borderColor0\"],xG=[\"itemStyle\",\"borderColorDoji\"],wG=[\"itemStyle\",\"color\"],bG=[\"itemStyle\",\"color0\"],CG={seriesType:\"candlestick\",plan:ko(),performRawSeries:!0,reset:function(r,e){function t(i,o){return o.get(i>0?wG:bG)}function a(i,o){return o.get(i===0?xG:i>0?_G:SG)}if(!e.isSeriesFiltered(r)){var n=r.pipelineContext.large;return!n&&{progress:function(i,o){for(var s;(s=i.next())!=null;){var l=o.getItemModel(s),u=o.getItemLayout(s).sign,f=l.getItemStyle();f.fill=t(u,l),f.stroke=a(u,l)||f.fill;var h=o.ensureUniqueItemVisual(s,\"style\");V(h,f)}}}}}},TG=CG,AG={seriesType:\"candlestick\",plan:ko(),reset:function(r){var e=r.coordinateSystem,t=r.getData(),a=DG(r,t),n=0,i=1,o=[\"x\",\"y\"],s=t.getDimensionIndex(t.mapDimension(o[n])),l=G(t.mapDimensionsAll(o[i]),t.getDimensionIndex,t),u=l[0],f=l[1],h=l[2],v=l[3];if(t.setLayout({candleWidth:a,isSimpleBox:a<=1.3}),s<0||l.length<4)return;return{progress:r.pipelineContext.large?d:c};function c(p,g){for(var y,m=g.getStore();(y=p.next())!=null;){var _=m.get(s,y),S=m.get(u,y),w=m.get(f,y),x=m.get(h,y),b=m.get(v,y),C=Math.min(S,w),T=Math.max(S,w),D=B(C,_),M=B(T,_),L=B(x,_),I=B(b,_),P=[];O(P,M,0),O(P,D,1),P.push(H(I),H(M),H(L),H(D));var R=g.getItemModel(y),E=!!R.get([\"itemStyle\",\"borderColorDoji\"]);g.setItemLayout(y,{sign:lx(m,y,S,w,f,E),initBaseline:S>w?M[i]:D[i],ends:P,brushRect:z(x,b,_)})}function B($,X){var Q=[];return Q[n]=X,Q[i]=$,isNaN(X)||isNaN($)?[NaN,NaN]:e.dataToPoint(Q)}function O($,X,Q){var j=X.slice(),pt=X.slice();j[n]=af(j[n]+a/2,1,!1),pt[n]=af(pt[n]-a/2,1,!0),Q?$.push(j,pt):$.push(pt,j)}function z($,X,Q){var j=B($,Q),pt=B(X,Q);return j[n]-=a/2,pt[n]-=a/2,{x:j[0],y:j[1],width:a,height:pt[1]-j[1]}}function H($){return $[n]=af($[n],1),$}}function d(p,g){for(var y=Wr(p.count*4),m=0,_,S=[],w=[],x,b=g.getStore(),C=!!r.get([\"itemStyle\",\"borderColorDoji\"]);(x=p.next())!=null;){var T=b.get(s,x),D=b.get(u,x),M=b.get(f,x),L=b.get(h,x),I=b.get(v,x);if(isNaN(T)||isNaN(L)||isNaN(I)){y[m++]=NaN,m+=3;continue}y[m++]=lx(b,x,D,M,f,C),S[n]=T,S[i]=L,_=e.dataToPoint(S,null,w),y[m++]=_?_[0]:NaN,y[m++]=_?_[1]:NaN,S[i]=I,_=e.dataToPoint(S,null,w),y[m++]=_?_[1]:NaN}g.setLayout(\"largePoints\",y)}}};function lx(r,e,t,a,n,i){var o;return t>a?o=-1:t<a?o=1:o=i?0:e>0?r.get(n,e-1)<=a?1:-1:1,o}function DG(r,e){var t=r.getBaseAxis(),a,n=t.type===\"category\"?t.getBandWidth():(a=t.getExtent(),Math.abs(a[1]-a[0])/e.count()),i=W(ft(r.get(\"barMaxWidth\"),n),n),o=W(ft(r.get(\"barMinWidth\"),1),n),s=r.get(\"barWidth\");return s!=null?W(s,n):Math.max(Math.min(n/2,i),o)}var MG=AG;function LG(r){r.registerChartView(gG),r.registerSeriesModel(yG),r.registerPreprocessor(mG),r.registerVisual(TG),r.registerLayout(MG)}function ux(r,e){var t=e.rippleEffectColor||e.color;r.eachChild(function(a){a.attr({z:e.z,zlevel:e.zlevel,style:{stroke:e.brushType===\"stroke\"?t:null,fill:e.brushType===\"fill\"?t:null}})})}var IG=function(r){k(e,r);function e(t,a){var n=r.call(this)||this,i=new El(t,a),o=new nt;return n.add(i),n.add(o),n.updateData(t,a),n}return e.prototype.stopEffectAnimation=function(){this.childAt(1).removeAll()},e.prototype.startEffectAnimation=function(t){for(var a=t.symbolType,n=t.color,i=t.rippleNumber,o=this.childAt(1),s=0;s<i;s++){var l=jt(a,-1,-1,2,2,n);l.attr({style:{strokeNoScale:!0},z2:99,silent:!0,scaleX:.5,scaleY:.5});var u=-s/i*t.period+t.effectOffset;l.animate(\"\",!0).when(t.period,{scaleX:t.rippleScale/2,scaleY:t.rippleScale/2}).delay(u).start(),l.animateStyle(!0).when(t.period,{opacity:0}).delay(u).start(),o.add(l)}ux(o,t)},e.prototype.updateEffectAnimation=function(t){for(var a=this._effectCfg,n=this.childAt(1),i=[\"symbolType\",\"period\",\"rippleScale\",\"rippleNumber\"],o=0;o<i.length;o++){var s=i[o];if(a[s]!==t[s]){this.stopEffectAnimation(),this.startEffectAnimation(t);return}}ux(n,t)},e.prototype.highlight=function(){_a(this)},e.prototype.downplay=function(){Sa(this)},e.prototype.getSymbolType=function(){var t=this.childAt(0);return t&&t.getSymbolType()},e.prototype.updateData=function(t,a){var n=this,i=t.hostModel;this.childAt(0).updateData(t,a);var o=this.childAt(1),s=t.getItemModel(a),l=t.getItemVisual(a,\"symbol\"),u=Bo(t.getItemVisual(a,\"symbolSize\")),f=t.getItemVisual(a,\"style\"),h=f&&f.fill,v=s.getModel(\"emphasis\");o.setScale(u),o.traverse(function(g){g.setStyle(\"fill\",h)});var c=Ti(t.getItemVisual(a,\"symbolOffset\"),u);c&&(o.x=c[0],o.y=c[1]);var d=t.getItemVisual(a,\"symbolRotate\");o.rotation=(d||0)*Math.PI/180||0;var p={};p.showEffectOn=i.get(\"showEffectOn\"),p.rippleScale=s.get([\"rippleEffect\",\"scale\"]),p.brushType=s.get([\"rippleEffect\",\"brushType\"]),p.period=s.get([\"rippleEffect\",\"period\"])*1e3,p.effectOffset=a/t.count(),p.z=i.getShallow(\"z\")||0,p.zlevel=i.getShallow(\"zlevel\")||0,p.symbolType=l,p.color=h,p.rippleEffectColor=s.get([\"rippleEffect\",\"color\"]),p.rippleNumber=s.get([\"rippleEffect\",\"number\"]),p.showEffectOn===\"render\"?(this._effectCfg?this.updateEffectAnimation(p):this.startEffectAnimation(p),this._effectCfg=p):(this._effectCfg=null,this.stopEffectAnimation(),this.onHoverStateChange=function(g){g===\"emphasis\"?p.showEffectOn!==\"render\"&&n.startEffectAnimation(p):g===\"normal\"&&p.showEffectOn!==\"render\"&&n.stopEffectAnimation()}),this._effectCfg=p,$t(this,v.get(\"focus\"),v.get(\"blurScope\"),v.get(\"disabled\"))},e.prototype.fadeOut=function(t){t&&t()},e}(nt),PG=IG,RG=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.init=function(){this._symbolDraw=new kl(PG)},e.prototype.render=function(t,a,n){var i=t.getData(),o=this._symbolDraw;o.updateData(i,{clipShape:this._getClipShape(t)}),this.group.add(o.group)},e.prototype._getClipShape=function(t){var a=t.coordinateSystem,n=a&&a.getArea&&a.getArea();return t.get(\"clip\",!0)?n:null},e.prototype.updateTransform=function(t,a,n){var i=t.getData();this.group.dirty();var o=Ol(\"\").reset(t,a,n);o.progress&&o.progress({start:0,end:i.count(),count:i.count()},i),this._symbolDraw.updateLayout()},e.prototype._updateGroupTransform=function(t){var a=t.coordinateSystem;a&&a.getRoamTransform&&(this.group.transform=tE(a.getRoamTransform()),this.group.decomposeTransform())},e.prototype.remove=function(t,a){this._symbolDraw&&this._symbolDraw.remove(!0)},e.type=\"effectScatter\",e}(zt),EG=RG,kG=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.hasSymbolVisual=!0,t}return e.prototype.getInitialData=function(t,a){return Ta(null,this,{useEncodeDefaulter:!0})},e.prototype.brushSelector=function(t,a,n){return n.point(a.getItemLayout(t))},e.type=\"series.effectScatter\",e.dependencies=[\"grid\",\"polar\"],e.defaultOption={coordinateSystem:\"cartesian2d\",z:2,legendHoverLink:!0,effectType:\"ripple\",progressive:0,showEffectOn:\"render\",clip:!0,rippleEffect:{period:4,scale:2.5,brushType:\"fill\",number:3},universalTransition:{divideShape:\"clone\"},symbolSize:10},e}(Ht),OG=kG;function BG(r){r.registerChartView(EG),r.registerSeriesModel(OG),r.registerLayout(Ol(\"effectScatter\"))}var NG=function(r){k(e,r);function e(t,a,n){var i=r.call(this)||this;return i.add(i.createLine(t,a,n)),i._updateEffectSymbol(t,a),i}return e.prototype.createLine=function(t,a,n){return new Vy(t,a,n)},e.prototype._updateEffectSymbol=function(t,a){var n=t.getItemModel(a),i=n.getModel(\"effect\"),o=i.get(\"symbolSize\"),s=i.get(\"symbol\");F(o)||(o=[o,o]);var l=t.getItemVisual(a,\"style\"),u=i.get(\"color\")||l&&l.stroke,f=this.childAt(1);this._symbolType!==s&&(this.remove(f),f=jt(s,-.5,-.5,1,1,u),f.z2=100,f.culling=!0,this.add(f)),f&&(f.setStyle(\"shadowColor\",u),f.setStyle(i.getItemStyle([\"color\"])),f.scaleX=o[0],f.scaleY=o[1],f.setColor(u),this._symbolType=s,this._symbolScale=o,this._updateEffectAnimation(t,i,a))},e.prototype._updateEffectAnimation=function(t,a,n){var i=this.childAt(1);if(!!i){var o=t.getItemLayout(n),s=a.get(\"period\")*1e3,l=a.get(\"loop\"),u=a.get(\"roundTrip\"),f=a.get(\"constantSpeed\"),h=le(a.get(\"delay\"),function(c){return c/t.count()*s/3});if(i.ignore=!0,this._updateAnimationPoints(i,o),f>0&&(s=this._getLineLength(i)/f*1e3),s!==this._period||l!==this._loop||u!==this._roundTrip){i.stopAnimation();var v=void 0;J(h)?v=h(n):v=h,i.__t>0&&(v=-s*i.__t),this._animateSymbol(i,s,v,l,u)}this._period=s,this._loop=l,this._roundTrip=u}},e.prototype._animateSymbol=function(t,a,n,i,o){if(a>0){t.__t=0;var s=this,l=t.animate(\"\",i).when(o?a*2:a,{__t:o?2:1}).delay(n).during(function(){s._updateSymbolPosition(t)});i||l.done(function(){s.remove(t)}),l.start()}},e.prototype._getLineLength=function(t){return Ga(t.__p1,t.__cp1)+Ga(t.__cp1,t.__p2)},e.prototype._updateAnimationPoints=function(t,a){t.__p1=a[0],t.__p2=a[1],t.__cp1=a[2]||[(a[0][0]+a[1][0])/2,(a[0][1]+a[1][1])/2]},e.prototype.updateData=function(t,a,n){this.childAt(0).updateData(t,a,n),this._updateEffectSymbol(t,a)},e.prototype._updateSymbolPosition=function(t){var a=t.__p1,n=t.__p2,i=t.__cp1,o=t.__t<1?t.__t:2-t.__t,s=[t.x,t.y],l=s.slice(),u=se,f=Od;s[0]=u(a[0],i[0],n[0],o),s[1]=u(a[1],i[1],n[1],o);var h=t.__t<1?f(a[0],i[0],n[0],o):f(n[0],i[0],a[0],1-o),v=t.__t<1?f(a[1],i[1],n[1],o):f(n[1],i[1],a[1],1-o);t.rotation=-Math.atan2(v,h)-Math.PI/2,(this._symbolType===\"line\"||this._symbolType===\"rect\"||this._symbolType===\"roundRect\")&&(t.__lastT!==void 0&&t.__lastT<t.__t?(t.scaleY=Ga(l,s)*1.05,o===1&&(s[0]=l[0]+(s[0]-l[0])/2,s[1]=l[1]+(s[1]-l[1])/2)):t.__lastT===1?t.scaleY=2*Ga(a,s):t.scaleY=this._symbolScale[1]),t.__lastT=t.__t,t.ignore=!1,t.x=s[0],t.y=s[1]},e.prototype.updateLayout=function(t,a){this.childAt(0).updateLayout(t,a);var n=t.getItemModel(a).getModel(\"effect\");this._updateEffectAnimation(t,n,a)},e}(nt),_M=NG,VG=function(r){k(e,r);function e(t,a,n){var i=r.call(this)||this;return i._createPolyline(t,a,n),i}return e.prototype._createPolyline=function(t,a,n){var i=t.getItemLayout(a),o=new Fe({shape:{points:i}});this.add(o),this._updateCommonStl(t,a,n)},e.prototype.updateData=function(t,a,n){var i=t.hostModel,o=this.childAt(0),s={shape:{points:t.getItemLayout(a)}};Lt(o,s,i,a),this._updateCommonStl(t,a,n)},e.prototype._updateCommonStl=function(t,a,n){var i=this.childAt(0),o=t.getItemModel(a),s=n&&n.emphasisLineStyle,l=n&&n.focus,u=n&&n.blurScope,f=n&&n.emphasisDisabled;if(!n||t.hasItemOption){var h=o.getModel(\"emphasis\");s=h.getModel(\"lineStyle\").getLineStyle(),f=h.get(\"disabled\"),l=h.get(\"focus\"),u=h.get(\"blurScope\")}i.useStyle(t.getItemVisual(a,\"style\")),i.style.fill=null,i.style.strokeNoScale=!0;var v=i.ensureState(\"emphasis\");v.style=s,$t(this,l,u,f)},e.prototype.updateLayout=function(t,a){var n=this.childAt(0);n.setShape(\"points\",t.getItemLayout(a))},e}(nt),SM=VG,zG=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t._lastFrame=0,t._lastFramePercent=0,t}return e.prototype.createLine=function(t,a,n){return new SM(t,a,n)},e.prototype._updateAnimationPoints=function(t,a){this._points=a;for(var n=[0],i=0,o=1;o<a.length;o++){var s=a[o-1],l=a[o];i+=Ga(s,l),n.push(i)}if(i===0){this._length=0;return}for(var o=0;o<n.length;o++)n[o]/=i;this._offsets=n,this._length=i},e.prototype._getLineLength=function(){return this._length},e.prototype._updateSymbolPosition=function(t){var a=t.__t<1?t.__t:2-t.__t,n=this._points,i=this._offsets,o=n.length;if(!!i){var s=this._lastFrame,l;if(a<this._lastFramePercent){var u=Math.min(s+1,o-1);for(l=u;l>=0&&!(i[l]<=a);l--);l=Math.min(l,o-2)}else{for(l=s;l<o&&!(i[l]>a);l++);l=Math.min(l-1,o-2)}var f=(a-i[l])/(i[l+1]-i[l]),h=n[l],v=n[l+1];t.x=h[0]*(1-f)+f*v[0],t.y=h[1]*(1-f)+f*v[1];var c=t.__t<1?v[0]-h[0]:h[0]-v[0],d=t.__t<1?v[1]-h[1]:h[1]-v[1];t.rotation=-Math.atan2(d,c)-Math.PI/2,this._lastFrame=l,this._lastFramePercent=a,t.ignore=!1}},e}(_M),FG=zG,GG=function(){function r(){this.polyline=!1,this.curveness=0,this.segs=[]}return r}(),HG=function(r){k(e,r);function e(t){var a=r.call(this,t)||this;return a._off=0,a.hoverDataIdx=-1,a}return e.prototype.reset=function(){this.notClear=!1,this._off=0},e.prototype.getDefaultStyle=function(){return{stroke:\"#000\",fill:null}},e.prototype.getDefaultShape=function(){return new GG},e.prototype.buildPath=function(t,a){var n=a.segs,i=a.curveness,o;if(a.polyline)for(o=this._off;o<n.length;){var s=n[o++];if(s>0){t.moveTo(n[o++],n[o++]);for(var l=1;l<s;l++)t.lineTo(n[o++],n[o++])}}else for(o=this._off;o<n.length;){var u=n[o++],f=n[o++],h=n[o++],v=n[o++];if(t.moveTo(u,f),i>0){var c=(u+h)/2-(f-v)*i,d=(f+v)/2-(h-u)*i;t.quadraticCurveTo(c,d,h,v)}else t.lineTo(h,v)}this.incremental&&(this._off=o,this.notClear=!0)},e.prototype.findDataIndex=function(t,a){var n=this.shape,i=n.segs,o=n.curveness,s=this.style.lineWidth;if(n.polyline)for(var l=0,u=0;u<i.length;){var f=i[u++];if(f>0)for(var h=i[u++],v=i[u++],c=1;c<f;c++){var d=i[u++],p=i[u++];if(za(h,v,d,p,s,t,a))return l}l++}else for(var l=0,u=0;u<i.length;){var h=i[u++],v=i[u++],d=i[u++],p=i[u++];if(o>0){var g=(h+d)/2-(v-p)*o,y=(v+p)/2-(d-h)*o;if(V2(h,v,g,y,d,p,s,t,a))return l}else if(za(h,v,d,p,s,t,a))return l;l++}return-1},e.prototype.contain=function(t,a){var n=this.transformCoordToLocal(t,a),i=this.getBoundingRect();if(t=n[0],a=n[1],i.contain(t,a)){var o=this.hoverDataIdx=this.findDataIndex(t,a);return o>=0}return this.hoverDataIdx=-1,!1},e.prototype.getBoundingRect=function(){var t=this._rect;if(!t){for(var a=this.shape,n=a.segs,i=1/0,o=1/0,s=-1/0,l=-1/0,u=0;u<n.length;){var f=n[u++],h=n[u++];i=Math.min(f,i),s=Math.max(f,s),o=Math.min(h,o),l=Math.max(h,l)}t=this._rect=new vt(i,o,s,l)}return t},e}(mt),WG=function(){function r(){this.group=new nt}return r.prototype.updateData=function(e){this._clear();var t=this._create();t.setShape({segs:e.getLayout(\"linesPoints\")}),this._setCommon(t,e)},r.prototype.incrementalPrepareUpdate=function(e){this.group.removeAll(),this._clear()},r.prototype.incrementalUpdate=function(e,t){var a=this._newAdded[0],n=t.getLayout(\"linesPoints\"),i=a&&a.shape.segs;if(i&&i.length<2e4){var o=i.length,s=new Float32Array(o+n.length);s.set(i),s.set(n,o),a.setShape({segs:s})}else{this._newAdded=[];var l=this._create();l.incremental=!0,l.setShape({segs:n}),this._setCommon(l,t),l.__startIndex=e.start}},r.prototype.remove=function(){this._clear()},r.prototype.eachRendered=function(e){this._newAdded[0]&&e(this._newAdded[0])},r.prototype._create=function(){var e=new HG({cursor:\"default\",ignoreCoarsePointer:!0});return this._newAdded.push(e),this.group.add(e),e},r.prototype._setCommon=function(e,t,a){var n=t.hostModel;e.setShape({polyline:n.get(\"polyline\"),curveness:n.get([\"lineStyle\",\"curveness\"])}),e.useStyle(n.getModel(\"lineStyle\").getLineStyle()),e.style.strokeNoScale=!0;var i=t.getVisual(\"style\");i&&i.stroke&&e.setStyle(\"stroke\",i.stroke),e.setStyle(\"fill\",null);var o=it(e);o.seriesIndex=n.seriesIndex,e.on(\"mousemove\",function(s){o.dataIndex=null;var l=e.hoverDataIdx;l>0&&(o.dataIndex=l+e.__startIndex)})},r.prototype._clear=function(){this._newAdded=[],this.group.removeAll()},r}(),$G=WG,UG={seriesType:\"lines\",plan:ko(),reset:function(r){var e=r.coordinateSystem;if(!!e){var t=r.get(\"polyline\"),a=r.pipelineContext.large;return{progress:function(n,i){var o=[];if(a){var s=void 0,l=n.end-n.start;if(t){for(var u=0,f=n.start;f<n.end;f++)u+=r.getLineCoordsCount(f);s=new Float32Array(l+u*2)}else s=new Float32Array(l*4);for(var h=0,v=[],f=n.start;f<n.end;f++){var c=r.getLineCoords(f,o);t&&(s[h++]=c);for(var d=0;d<c;d++)v=e.dataToPoint(o[d],!1,v),s[h++]=v[0],s[h++]=v[1]}i.setLayout(\"linesPoints\",s)}else for(var f=n.start;f<n.end;f++){var p=i.getItemModel(f),c=r.getLineCoords(f,o),g=[];if(t)for(var y=0;y<c;y++)g.push(e.dataToPoint(o[y]));else{g[0]=e.dataToPoint(o[0]),g[1]=e.dataToPoint(o[1]);var m=p.get([\"lineStyle\",\"curveness\"]);+m&&(g[2]=[(g[0][0]+g[1][0])/2-(g[0][1]-g[1][1])*m,(g[0][1]+g[1][1])/2-(g[1][0]-g[0][0])*m])}i.setItemLayout(f,g)}}}}}},xM=UG,YG=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n){var i=t.getData(),o=this._updateLineDraw(i,t),s=t.get(\"zlevel\"),l=t.get([\"effect\",\"trailLength\"]),u=n.getZr(),f=u.painter.getType()===\"svg\";f||u.painter.getLayer(s).clear(!0),this._lastZlevel!=null&&!f&&u.configLayer(this._lastZlevel,{motionBlur:!1}),this._showEffect(t)&&l>0&&(f||u.configLayer(s,{motionBlur:!0,lastFrameAlpha:Math.max(Math.min(l/10+.9,1),0)})),o.updateData(i);var h=t.get(\"clip\",!0)&&Wh(t.coordinateSystem,!1,t);h?this.group.setClipPath(h):this.group.removeClipPath(),this._lastZlevel=s,this._finished=!0},e.prototype.incrementalPrepareRender=function(t,a,n){var i=t.getData(),o=this._updateLineDraw(i,t);o.incrementalPrepareUpdate(i),this._clearLayer(n),this._finished=!1},e.prototype.incrementalRender=function(t,a,n){this._lineDraw.incrementalUpdate(t,a.getData()),this._finished=t.end===a.getData().count()},e.prototype.eachRendered=function(t){this._lineDraw&&this._lineDraw.eachRendered(t)},e.prototype.updateTransform=function(t,a,n){var i=t.getData(),o=t.pipelineContext;if(!this._finished||o.large||o.progressiveRender)return{update:!0};var s=xM.reset(t,a,n);s.progress&&s.progress({start:0,end:i.count(),count:i.count()},i),this._lineDraw.updateLayout(),this._clearLayer(n)},e.prototype._updateLineDraw=function(t,a){var n=this._lineDraw,i=this._showEffect(a),o=!!a.get(\"polyline\"),s=a.pipelineContext,l=s.large;return(!n||i!==this._hasEffet||o!==this._isPolyline||l!==this._isLargeDraw)&&(n&&n.remove(),n=this._lineDraw=l?new $G:new zy(o?i?FG:SM:i?_M:Vy),this._hasEffet=i,this._isPolyline=o,this._isLargeDraw=l),this.group.add(n.group),n},e.prototype._showEffect=function(t){return!!t.get([\"effect\",\"show\"])},e.prototype._clearLayer=function(t){var a=t.getZr(),n=a.painter.getType()===\"svg\";!n&&this._lastZlevel!=null&&a.painter.getLayer(this._lastZlevel).clear(!0)},e.prototype.remove=function(t,a){this._lineDraw&&this._lineDraw.remove(),this._lineDraw=null,this._clearLayer(a)},e.prototype.dispose=function(t,a){this.remove(t,a)},e.type=\"lines\",e}(zt),ZG=YG,XG=typeof Uint32Array==\"undefined\"?Array:Uint32Array,qG=typeof Float64Array==\"undefined\"?Array:Float64Array;function fx(r){var e=r.data;e&&e[0]&&e[0][0]&&e[0][0].coord&&(r.data=G(e,function(t){var a=[t[0].coord,t[1].coord],n={coords:a};return t[0].name&&(n.fromName=t[0].name),t[1].name&&(n.toName=t[1].name),_g([n,t[0],t[1]])}))}var KG=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.visualStyleAccessPath=\"lineStyle\",t.visualDrawType=\"stroke\",t}return e.prototype.init=function(t){t.data=t.data||[],fx(t);var a=this._processFlatCoordsArray(t.data);this._flatCoords=a.flatCoords,this._flatCoordsOffset=a.flatCoordsOffset,a.flatCoords&&(t.data=new Float32Array(a.count)),r.prototype.init.apply(this,arguments)},e.prototype.mergeOption=function(t){if(fx(t),t.data){var a=this._processFlatCoordsArray(t.data);this._flatCoords=a.flatCoords,this._flatCoordsOffset=a.flatCoordsOffset,a.flatCoords&&(t.data=new Float32Array(a.count))}r.prototype.mergeOption.apply(this,arguments)},e.prototype.appendData=function(t){var a=this._processFlatCoordsArray(t.data);a.flatCoords&&(this._flatCoords?(this._flatCoords=gf(this._flatCoords,a.flatCoords),this._flatCoordsOffset=gf(this._flatCoordsOffset,a.flatCoordsOffset)):(this._flatCoords=a.flatCoords,this._flatCoordsOffset=a.flatCoordsOffset),t.data=new Float32Array(a.count)),this.getRawData().appendData(t.data)},e.prototype._getCoordsFromItemModel=function(t){var a=this.getData().getItemModel(t),n=a.option instanceof Array?a.option:a.getShallow(\"coords\");return n},e.prototype.getLineCoordsCount=function(t){return this._flatCoordsOffset?this._flatCoordsOffset[t*2+1]:this._getCoordsFromItemModel(t).length},e.prototype.getLineCoords=function(t,a){if(this._flatCoordsOffset){for(var n=this._flatCoordsOffset[t*2],i=this._flatCoordsOffset[t*2+1],o=0;o<i;o++)a[o]=a[o]||[],a[o][0]=this._flatCoords[n+o*2],a[o][1]=this._flatCoords[n+o*2+1];return i}else{for(var s=this._getCoordsFromItemModel(t),o=0;o<s.length;o++)a[o]=a[o]||[],a[o][0]=s[o][0],a[o][1]=s[o][1];return s.length}},e.prototype._processFlatCoordsArray=function(t){var a=0;if(this._flatCoords&&(a=this._flatCoords.length),Mt(t[0])){for(var n=t.length,i=new XG(n),o=new qG(n),s=0,l=0,u=0,f=0;f<n;){u++;var h=t[f++];i[l++]=s+a,i[l++]=h;for(var v=0;v<h;v++){var c=t[f++],d=t[f++];o[s++]=c,o[s++]=d}}return{flatCoordsOffset:new Uint32Array(i.buffer,0,l),flatCoords:o,count:u}}return{flatCoordsOffset:null,flatCoords:null,count:t.length}},e.prototype.getInitialData=function(t,a){var n=new De([\"value\"],this);return n.hasItemOption=!1,n.initData(t.data,[],function(i,o,s,l){if(i instanceof Array)return NaN;n.hasItemOption=!0;var u=i.value;if(u!=null)return u instanceof Array?u[l]:u}),n},e.prototype.formatTooltip=function(t,a,n){var i=this.getData(),o=i.getItemModel(t),s=o.get(\"name\");if(s)return s;var l=o.get(\"fromName\"),u=o.get(\"toName\"),f=[];return l!=null&&f.push(l),u!=null&&f.push(u),oe(\"nameValue\",{name:f.join(\" > \")})},e.prototype.preventIncremental=function(){return!!this.get([\"effect\",\"show\"])},e.prototype.getProgressive=function(){var t=this.option.progressive;return t==null?this.option.large?1e4:this.get(\"progressive\"):t},e.prototype.getProgressiveThreshold=function(){var t=this.option.progressiveThreshold;return t==null?this.option.large?2e4:this.get(\"progressiveThreshold\"):t},e.prototype.getZLevelKey=function(){var t=this.getModel(\"effect\"),a=t.get(\"trailLength\");return this.getData().count()>this.getProgressiveThreshold()?this.id:t.get(\"show\")&&a>0?a+\"\":\"\"},e.type=\"series.lines\",e.dependencies=[\"grid\",\"polar\",\"geo\",\"calendar\"],e.defaultOption={coordinateSystem:\"geo\",z:2,legendHoverLink:!0,xAxisIndex:0,yAxisIndex:0,symbol:[\"none\",\"none\"],symbolSize:[10,10],geoIndex:0,effect:{show:!1,period:4,constantSpeed:0,symbol:\"circle\",symbolSize:3,loop:!0,trailLength:.2},large:!1,largeThreshold:2e3,polyline:!1,clip:!0,label:{show:!1,position:\"end\"},lineStyle:{opacity:.5}},e}(Ht),JG=KG;function ku(r){return r instanceof Array||(r=[r,r]),r}var QG={seriesType:\"lines\",reset:function(r){var e=ku(r.get(\"symbol\")),t=ku(r.get(\"symbolSize\")),a=r.getData();a.setVisual(\"fromSymbol\",e&&e[0]),a.setVisual(\"toSymbol\",e&&e[1]),a.setVisual(\"fromSymbolSize\",t&&t[0]),a.setVisual(\"toSymbolSize\",t&&t[1]);function n(i,o){var s=i.getItemModel(o),l=ku(s.getShallow(\"symbol\",!0)),u=ku(s.getShallow(\"symbolSize\",!0));l[0]&&i.setItemVisual(o,\"fromSymbol\",l[0]),l[1]&&i.setItemVisual(o,\"toSymbol\",l[1]),u[0]&&i.setItemVisual(o,\"fromSymbolSize\",u[0]),u[1]&&i.setItemVisual(o,\"toSymbolSize\",u[1])}return{dataEach:a.hasItemOption?n:null}}},jG=QG;function tH(r){r.registerChartView(ZG),r.registerSeriesModel(JG),r.registerLayout(xM),r.registerVisual(jG)}var eH=256,rH=function(){function r(){this.blurSize=30,this.pointSize=20,this.maxOpacity=1,this.minOpacity=0,this._gradientPixels={inRange:null,outOfRange:null};var e=ga.createCanvas();this.canvas=e}return r.prototype.update=function(e,t,a,n,i,o){var s=this._getBrush(),l=this._getGradient(i,\"inRange\"),u=this._getGradient(i,\"outOfRange\"),f=this.pointSize+this.blurSize,h=this.canvas,v=h.getContext(\"2d\"),c=e.length;h.width=t,h.height=a;for(var d=0;d<c;++d){var p=e[d],g=p[0],y=p[1],m=p[2],_=n(m);v.globalAlpha=_,v.drawImage(s,g-f,y-f)}if(!h.width||!h.height)return h;for(var S=v.getImageData(0,0,h.width,h.height),w=S.data,x=0,b=w.length,C=this.minOpacity,T=this.maxOpacity,D=T-C;x<b;){var _=w[x+3]/256,M=Math.floor(_*(eH-1))*4;if(_>0){var L=o(_)?l:u;_>0&&(_=_*D+C),w[x++]=L[M],w[x++]=L[M+1],w[x++]=L[M+2],w[x++]=L[M+3]*_*256}else x+=4}return v.putImageData(S,0,0),h},r.prototype._getBrush=function(){var e=this._brushCanvas||(this._brushCanvas=ga.createCanvas()),t=this.pointSize+this.blurSize,a=t*2;e.width=a,e.height=a;var n=e.getContext(\"2d\");return n.clearRect(0,0,a,a),n.shadowOffsetX=a,n.shadowBlur=this.blurSize,n.shadowColor=\"#000\",n.beginPath(),n.arc(-t,t,this.pointSize,0,Math.PI*2,!0),n.closePath(),n.fill(),e},r.prototype._getGradient=function(e,t){for(var a=this._gradientPixels,n=a[t]||(a[t]=new Uint8ClampedArray(256*4)),i=[0,0,0,0],o=0,s=0;s<256;s++)e[t](s/255,!0,i),n[o++]=i[0],n[o++]=i[1],n[o++]=i[2],n[o++]=i[3];return n},r}(),aH=rH;function nH(r,e,t){var a=r[1]-r[0];e=G(e,function(o){return{interval:[(o.interval[0]-r[0])/a,(o.interval[1]-r[0])/a]}});var n=e.length,i=0;return function(o){var s;for(s=i;s<n;s++){var l=e[s].interval;if(l[0]<=o&&o<=l[1]){i=s;break}}if(s===n)for(s=i-1;s>=0;s--){var l=e[s].interval;if(l[0]<=o&&o<=l[1]){i=s;break}}return s>=0&&s<n&&t[s]}}function iH(r,e){var t=r[1]-r[0];return e=[(e[0]-r[0])/t,(e[1]-r[0])/t],function(a){return a>=e[0]&&a<=e[1]}}function hx(r){var e=r.dimensions;return e[0]===\"lng\"&&e[1]===\"lat\"}var oH=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n){var i;a.eachComponent(\"visualMap\",function(s){s.eachTargetSeries(function(l){l===t&&(i=s)})}),this._progressiveEls=null,this.group.removeAll();var o=t.coordinateSystem;o.type===\"cartesian2d\"||o.type===\"calendar\"?this._renderOnCartesianAndCalendar(t,n,0,t.getData().count()):hx(o)&&this._renderOnGeo(o,t,i,n)},e.prototype.incrementalPrepareRender=function(t,a,n){this.group.removeAll()},e.prototype.incrementalRender=function(t,a,n,i){var o=a.coordinateSystem;o&&(hx(o)?this.render(a,n,i):(this._progressiveEls=[],this._renderOnCartesianAndCalendar(a,i,t.start,t.end,!0)))},e.prototype.eachRendered=function(t){vn(this._progressiveEls||this.group,t)},e.prototype._renderOnCartesianAndCalendar=function(t,a,n,i,o){var s=t.coordinateSystem,l=Di(s,\"cartesian2d\"),u,f,h,v;if(l){var c=s.getAxis(\"x\"),d=s.getAxis(\"y\");u=c.getBandWidth()+.5,f=d.getBandWidth()+.5,h=c.scale.getExtent(),v=d.scale.getExtent()}for(var p=this.group,g=t.getData(),y=t.getModel([\"emphasis\",\"itemStyle\"]).getItemStyle(),m=t.getModel([\"blur\",\"itemStyle\"]).getItemStyle(),_=t.getModel([\"select\",\"itemStyle\"]).getItemStyle(),S=t.get([\"itemStyle\",\"borderRadius\"]),w=ie(t),x=t.getModel(\"emphasis\"),b=x.get(\"focus\"),C=x.get(\"blurScope\"),T=x.get(\"disabled\"),D=l?[g.mapDimension(\"x\"),g.mapDimension(\"y\"),g.mapDimension(\"value\")]:[g.mapDimension(\"time\"),g.mapDimension(\"value\")],M=n;M<i;M++){var L=void 0,I=g.getItemVisual(M,\"style\");if(l){var P=g.get(D[0],M),R=g.get(D[1],M);if(isNaN(g.get(D[2],M))||isNaN(P)||isNaN(R)||P<h[0]||P>h[1]||R<v[0]||R>v[1])continue;var E=s.dataToPoint([P,R]);L=new bt({shape:{x:E[0]-u/2,y:E[1]-f/2,width:u,height:f},style:I})}else{if(isNaN(g.get(D[1],M)))continue;L=new bt({z2:1,shape:s.dataToRect([g.get(D[0],M)]).contentShape,style:I})}if(g.hasItemOption){var B=g.getItemModel(M),O=B.getModel(\"emphasis\");y=O.getModel(\"itemStyle\").getItemStyle(),m=B.getModel([\"blur\",\"itemStyle\"]).getItemStyle(),_=B.getModel([\"select\",\"itemStyle\"]).getItemStyle(),S=B.get([\"itemStyle\",\"borderRadius\"]),b=O.get(\"focus\"),C=O.get(\"blurScope\"),T=O.get(\"disabled\"),w=ie(B)}L.shape.r=S;var z=t.getRawValue(M),H=\"-\";z&&z[2]!=null&&(H=z[2]+\"\"),de(L,w,{labelFetcher:t,labelDataIndex:M,defaultOpacity:I.opacity,defaultText:H}),L.ensureState(\"emphasis\").style=y,L.ensureState(\"blur\").style=m,L.ensureState(\"select\").style=_,$t(L,b,C,T),L.incremental=o,o&&(L.states.emphasis.hoverLayer=!0),p.add(L),g.setItemGraphicEl(M,L),this._progressiveEls&&this._progressiveEls.push(L)}},e.prototype._renderOnGeo=function(t,a,n,i){var o=n.targetVisuals.inRange,s=n.targetVisuals.outOfRange,l=a.getData(),u=this._hmLayer||this._hmLayer||new aH;u.blurSize=a.get(\"blurSize\"),u.pointSize=a.get(\"pointSize\"),u.minOpacity=a.get(\"minOpacity\"),u.maxOpacity=a.get(\"maxOpacity\");var f=t.getViewRect().clone(),h=t.getRoamTransform();f.applyTransform(h);var v=Math.max(f.x,0),c=Math.max(f.y,0),d=Math.min(f.width+f.x,i.getWidth()),p=Math.min(f.height+f.y,i.getHeight()),g=d-v,y=p-c,m=[l.mapDimension(\"lng\"),l.mapDimension(\"lat\"),l.mapDimension(\"value\")],_=l.mapArray(m,function(b,C,T){var D=t.dataToPoint([b,C]);return D[0]-=v,D[1]-=c,D.push(T),D}),S=n.getExtent(),w=n.type===\"visualMap.continuous\"?iH(S,n.option.range):nH(S,n.getPieceList(),n.option.selected);u.update(_,g,y,o.color.getNormalizer(),{inRange:o.color.getColorMapper(),outOfRange:s.color.getColorMapper()},w);var x=new pe({style:{width:g,height:y,x:v,y:c,image:u.canvas},silent:!0});this.group.add(x)},e.type=\"heatmap\",e}(zt),sH=oH,lH=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.getInitialData=function(t,a){return Ta(null,this,{generateCoord:\"value\"})},e.prototype.preventIncremental=function(){var t=Ml.get(this.get(\"coordinateSystem\"));if(t&&t.dimensions)return t.dimensions[0]===\"lng\"&&t.dimensions[1]===\"lat\"},e.type=\"series.heatmap\",e.dependencies=[\"grid\",\"geo\",\"calendar\"],e.defaultOption={coordinateSystem:\"cartesian2d\",z:2,geoIndex:0,blurSize:30,pointSize:20,maxOpacity:1,minOpacity:0,select:{itemStyle:{borderColor:\"#212121\"}}},e}(Ht),uH=lH;function fH(r){r.registerChartView(sH),r.registerSeriesModel(uH)}var hH=[\"itemStyle\",\"borderWidth\"],vx=[{xy:\"x\",wh:\"width\",index:0,posDesc:[\"left\",\"right\"]},{xy:\"y\",wh:\"height\",index:1,posDesc:[\"top\",\"bottom\"]}],Uc=new Qr,vH=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n){var i=this.group,o=t.getData(),s=this._data,l=t.coordinateSystem,u=l.getBaseAxis(),f=u.isHorizontal(),h=l.master.getRect(),v={ecSize:{width:n.getWidth(),height:n.getHeight()},seriesModel:t,coordSys:l,coordSysExtent:[[h.x,h.x+h.width],[h.y,h.y+h.height]],isHorizontal:f,valueDim:vx[+f],categoryDim:vx[1-+f]};return o.diff(s).add(function(c){if(!!o.hasValue(c)){var d=dx(o,c),p=cx(o,c,d,v),g=px(o,v,p);o.setItemGraphicEl(c,g),i.add(g),yx(g,v,p)}}).update(function(c,d){var p=s.getItemGraphicEl(d);if(!o.hasValue(c)){i.remove(p);return}var g=dx(o,c),y=cx(o,c,g,v),m=DM(o,y);p&&m!==p.__pictorialShapeStr&&(i.remove(p),o.setItemGraphicEl(c,null),p=null),p?_H(p,v,y):p=px(o,v,y,!0),o.setItemGraphicEl(c,p),p.__pictorialSymbolMeta=y,i.add(p),yx(p,v,y)}).remove(function(c){var d=s.getItemGraphicEl(c);d&&gx(s,c,d.__pictorialSymbolMeta.animationModel,d)}).execute(),this._data=o,this.group},e.prototype.remove=function(t,a){var n=this.group,i=this._data;t.get(\"animation\")?i&&i.eachItemGraphicEl(function(o){gx(i,it(o).dataIndex,t,o)}):n.removeAll()},e.type=\"pictorialBar\",e}(zt);function cx(r,e,t,a){var n=r.getItemLayout(e),i=t.get(\"symbolRepeat\"),o=t.get(\"symbolClip\"),s=t.get(\"symbolPosition\")||\"start\",l=t.get(\"symbolRotate\"),u=(l||0)*Math.PI/180||0,f=t.get(\"symbolPatternSize\")||2,h=t.isAnimationEnabled(),v={dataIndex:e,layout:n,itemModel:t,symbolType:r.getItemVisual(e,\"symbol\")||\"circle\",style:r.getItemVisual(e,\"style\"),symbolClip:o,symbolRepeat:i,symbolRepeatDirection:t.get(\"symbolRepeatDirection\"),symbolPatternSize:f,rotation:u,animationModel:h?t:null,hoverScale:h&&t.get([\"emphasis\",\"scale\"]),z2:t.getShallow(\"z\",!0)||0};cH(t,i,n,a,v),dH(r,e,n,i,o,v.boundingLength,v.pxSign,f,a,v),pH(t,v.symbolScale,u,a,v);var c=v.symbolSize,d=Ti(t.get(\"symbolOffset\"),c);return gH(t,c,n,i,o,d,s,v.valueLineWidth,v.boundingLength,v.repeatCutLength,a,v),v}function cH(r,e,t,a,n){var i=a.valueDim,o=r.get(\"symbolBoundingData\"),s=a.coordSys.getOtherAxis(a.coordSys.getBaseAxis()),l=s.toGlobalCoord(s.dataToCoord(0)),u=1-+(t[i.wh]<=0),f;if(F(o)){var h=[Yc(s,o[0])-l,Yc(s,o[1])-l];h[1]<h[0]&&h.reverse(),f=h[u]}else o!=null?f=Yc(s,o)-l:e?f=a.coordSysExtent[i.index][u]-l:f=t[i.wh];n.boundingLength=f,e&&(n.repeatCutLength=t[i.wh]),n.pxSign=f>0?1:-1}function Yc(r,e){return r.toGlobalCoord(r.dataToCoord(r.scale.parse(e)))}function dH(r,e,t,a,n,i,o,s,l,u){var f=l.valueDim,h=l.categoryDim,v=Math.abs(t[h.wh]),c=r.getItemVisual(e,\"symbolSize\"),d;F(c)?d=c.slice():c==null?d=[\"100%\",\"100%\"]:d=[c,c],d[h.index]=W(d[h.index],v),d[f.index]=W(d[f.index],a?v:Math.abs(i)),u.symbolSize=d;var p=u.symbolScale=[d[0]/s,d[1]/s];p[f.index]*=(l.isHorizontal?-1:1)*o}function pH(r,e,t,a,n){var i=r.get(hH)||0;i&&(Uc.attr({scaleX:e[0],scaleY:e[1],rotation:t}),Uc.updateTransform(),i/=Uc.getLineScale(),i*=e[a.valueDim.index]),n.valueLineWidth=i||0}function gH(r,e,t,a,n,i,o,s,l,u,f,h){var v=f.categoryDim,c=f.valueDim,d=h.pxSign,p=Math.max(e[c.index]+s,0),g=p;if(a){var y=Math.abs(l),m=le(r.get(\"symbolMargin\"),\"15%\")+\"\",_=!1;m.lastIndexOf(\"!\")===m.length-1&&(_=!0,m=m.slice(0,m.length-1));var S=W(m,e[c.index]),w=Math.max(p+S*2,0),x=_?0:S*2,b=b2(a),C=b?a:mx((y+x)/w),T=y-C*p;S=T/2/(_?C:Math.max(C-1,1)),w=p+S*2,x=_?0:S*2,!b&&a!==\"fixed\"&&(C=u?mx((Math.abs(u)+x)/w):0),g=C*w-x,h.repeatTimes=C,h.symbolMargin=S}var D=d*(g/2),M=h.pathPosition=[];M[v.index]=t[v.wh]/2,M[c.index]=o===\"start\"?D:o===\"end\"?l-D:l/2,i&&(M[0]+=i[0],M[1]+=i[1]);var L=h.bundlePosition=[];L[v.index]=t[v.xy],L[c.index]=t[c.xy];var I=h.barRectShape=V({},t);I[c.wh]=d*Math.max(Math.abs(t[c.wh]),Math.abs(M[c.index]+D)),I[v.wh]=t[v.wh];var P=h.clipShape={};P[v.xy]=-t[v.xy],P[v.wh]=f.ecSize[v.wh],P[c.xy]=0,P[c.wh]=t[c.wh]}function wM(r){var e=r.symbolPatternSize,t=jt(r.symbolType,-e/2,-e/2,e,e);return t.attr({culling:!0}),t.type!==\"image\"&&t.setStyle({strokeNoScale:!0}),t}function bM(r,e,t,a){var n=r.__pictorialBundle,i=t.symbolSize,o=t.valueLineWidth,s=t.pathPosition,l=e.valueDim,u=t.repeatTimes||0,f=0,h=i[e.valueDim.index]+o+t.symbolMargin*2;for(Zy(r,function(p){p.__pictorialAnimationIndex=f,p.__pictorialRepeatTimes=u,f<u?fo(p,null,d(f),t,a):fo(p,null,{scaleX:0,scaleY:0},t,a,function(){n.remove(p)}),f++});f<u;f++){var v=wM(t);v.__pictorialAnimationIndex=f,v.__pictorialRepeatTimes=u,n.add(v);var c=d(f);fo(v,{x:c.x,y:c.y,scaleX:0,scaleY:0},{scaleX:c.scaleX,scaleY:c.scaleY,rotation:c.rotation},t,a)}function d(p){var g=s.slice(),y=t.pxSign,m=p;return(t.symbolRepeatDirection===\"start\"?y>0:y<0)&&(m=u-1-p),g[l.index]=h*(m-u/2+.5)+s[l.index],{x:g[0],y:g[1],scaleX:t.symbolScale[0],scaleY:t.symbolScale[1],rotation:t.rotation}}}function CM(r,e,t,a){var n=r.__pictorialBundle,i=r.__pictorialMainPath;i?fo(i,null,{x:t.pathPosition[0],y:t.pathPosition[1],scaleX:t.symbolScale[0],scaleY:t.symbolScale[1],rotation:t.rotation},t,a):(i=r.__pictorialMainPath=wM(t),n.add(i),fo(i,{x:t.pathPosition[0],y:t.pathPosition[1],scaleX:0,scaleY:0,rotation:t.rotation},{scaleX:t.symbolScale[0],scaleY:t.symbolScale[1]},t,a))}function TM(r,e,t){var a=V({},e.barRectShape),n=r.__pictorialBarRect;n?fo(n,null,{shape:a},e,t):(n=r.__pictorialBarRect=new bt({z2:2,shape:a,silent:!0,style:{stroke:\"transparent\",fill:\"transparent\",lineWidth:0}}),n.disableMorphing=!0,r.add(n))}function AM(r,e,t,a){if(t.symbolClip){var n=r.__pictorialClipPath,i=V({},t.clipShape),o=e.valueDim,s=t.animationModel,l=t.dataIndex;if(n)Lt(n,{shape:i},s,l);else{i[o.wh]=0,n=new bt({shape:i}),r.__pictorialBundle.setClipPath(n),r.__pictorialClipPath=n;var u={};u[o.wh]=t.clipShape[o.wh],Dl[a?\"updateProps\":\"initProps\"](n,{shape:u},s,l)}}}function dx(r,e){var t=r.getItemModel(e);return t.getAnimationDelayParams=yH,t.isAnimationEnabled=mH,t}function yH(r){return{index:r.__pictorialAnimationIndex,count:r.__pictorialRepeatTimes}}function mH(){return this.parentModel.isAnimationEnabled()&&!!this.getShallow(\"animation\")}function px(r,e,t,a){var n=new nt,i=new nt;return n.add(i),n.__pictorialBundle=i,i.x=t.bundlePosition[0],i.y=t.bundlePosition[1],t.symbolRepeat?bM(n,e,t):CM(n,e,t),TM(n,t,a),AM(n,e,t,a),n.__pictorialShapeStr=DM(r,t),n.__pictorialSymbolMeta=t,n}function _H(r,e,t){var a=t.animationModel,n=t.dataIndex,i=r.__pictorialBundle;Lt(i,{x:t.bundlePosition[0],y:t.bundlePosition[1]},a,n),t.symbolRepeat?bM(r,e,t,!0):CM(r,e,t,!0),TM(r,t,!0),AM(r,e,t,!0)}function gx(r,e,t,a){var n=a.__pictorialBarRect;n&&n.removeTextContent();var i=[];Zy(a,function(o){i.push(o)}),a.__pictorialMainPath&&i.push(a.__pictorialMainPath),a.__pictorialClipPath&&(t=null),A(i,function(o){rn(o,{scaleX:0,scaleY:0},t,e,function(){a.parent&&a.parent.remove(a)})}),r.setItemGraphicEl(e,null)}function DM(r,e){return[r.getItemVisual(e.dataIndex,\"symbol\")||\"none\",!!e.symbolRepeat,!!e.symbolClip].join(\":\")}function Zy(r,e,t){A(r.__pictorialBundle.children(),function(a){a!==r.__pictorialBarRect&&e.call(t,a)})}function fo(r,e,t,a,n,i){e&&r.attr(e),a.symbolClip&&!n?t&&r.attr(t):t&&Dl[n?\"updateProps\":\"initProps\"](r,t,a.animationModel,a.dataIndex,i)}function yx(r,e,t){var a=t.dataIndex,n=t.itemModel,i=n.getModel(\"emphasis\"),o=i.getModel(\"itemStyle\").getItemStyle(),s=n.getModel([\"blur\",\"itemStyle\"]).getItemStyle(),l=n.getModel([\"select\",\"itemStyle\"]).getItemStyle(),u=n.getShallow(\"cursor\"),f=i.get(\"focus\"),h=i.get(\"blurScope\"),v=i.get(\"scale\");Zy(r,function(p){if(p instanceof pe){var g=p.style;p.useStyle(V({image:g.image,x:g.x,y:g.y,width:g.width,height:g.height},t.style))}else p.useStyle(t.style);var y=p.ensureState(\"emphasis\");y.style=o,v&&(y.scaleX=p.scaleX*1.1,y.scaleY=p.scaleY*1.1),p.ensureState(\"blur\").style=s,p.ensureState(\"select\").style=l,u&&(p.cursor=u),p.z2=t.z2});var c=e.valueDim.posDesc[+(t.boundingLength>0)],d=r.__pictorialBarRect;de(d,ie(n),{labelFetcher:e.seriesModel,labelDataIndex:a,defaultText:go(e.seriesModel.getData(),a),inheritColor:t.style.fill,defaultOpacity:t.style.opacity,defaultOutsidePosition:c}),$t(r,f,h,i.get(\"disabled\"))}function mx(r){var e=Math.round(r);return Math.abs(r-e)<1e-4?e:Math.ceil(r)}var SH=vH,xH=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.hasSymbolVisual=!0,t.defaultSymbol=\"roundRect\",t}return e.prototype.getInitialData=function(t){return t.stack=null,r.prototype.getInitialData.apply(this,arguments)},e.type=\"series.pictorialBar\",e.dependencies=[\"grid\"],e.defaultOption=cn($f.defaultOption,{symbol:\"circle\",symbolSize:null,symbolRotate:null,symbolPosition:null,symbolOffset:null,symbolMargin:null,symbolRepeat:!1,symbolRepeatDirection:\"end\",symbolClip:!1,symbolBoundingData:null,symbolPatternSize:400,barGap:\"-100%\",progressive:0,emphasis:{scale:!1},select:{itemStyle:{borderColor:\"#212121\"}}}),e}($f),wH=xH;function bH(r){r.registerChartView(SH),r.registerSeriesModel(wH),r.registerLayout(r.PRIORITY.VISUAL.LAYOUT,ot(SA,\"pictorialBar\")),r.registerLayout(r.PRIORITY.VISUAL.PROGRESSIVE_LAYOUT,xA(\"pictorialBar\"))}var CH=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t._layers=[],t}return e.prototype.render=function(t,a,n){var i=t.getData(),o=this,s=this.group,l=t.getLayerSeries(),u=i.getLayout(\"layoutInfo\"),f=u.rect,h=u.boundaryGap;s.x=0,s.y=f.y+h[0];function v(g){return g.name}var c=new xa(this._layersSeries||[],l,v,v),d=[];c.add(Y(p,this,\"add\")).update(Y(p,this,\"update\")).remove(Y(p,this,\"remove\")).execute();function p(g,y,m){var _=o._layers;if(g===\"remove\"){s.remove(_[y]);return}for(var S=[],w=[],x,b=l[y].indices,C=0;C<b.length;C++){var T=i.getItemLayout(b[C]),D=T.x,M=T.y0,L=T.y;S.push(D,M),w.push(D,M+L),x=i.getItemVisual(b[C],\"style\")}var I,P=i.getItemLayout(b[0]),R=t.getModel(\"label\"),E=R.get(\"margin\"),B=t.getModel(\"emphasis\");if(g===\"add\"){var O=d[y]=new nt;I=new qA({shape:{points:S,stackedOnPoints:w,smooth:.4,stackedOnSmooth:.4,smoothConstraint:!1},z2:0}),O.add(I),s.add(O),t.isAnimationEnabled()&&I.setClipPath(TH(I.getBoundingRect(),t,function(){I.removeClipPath()}))}else{var O=_[m];I=O.childAt(0),s.add(O),d[y]=O,Lt(I,{shape:{points:S,stackedOnPoints:w}},t),Ar(I)}de(I,ie(t),{labelDataIndex:b[C-1],defaultText:i.getName(b[C-1]),inheritColor:x.fill},{normal:{verticalAlign:\"middle\"}}),I.setTextConfig({position:null,local:!0});var z=I.getTextContent();z&&(z.x=P.x-E,z.y=P.y0+P.y/2),I.useStyle(x),i.setItemGraphicEl(y,I),ce(I,t),$t(I,B.get(\"focus\"),B.get(\"blurScope\"),B.get(\"disabled\"))}this._layersSeries=l,this._layers=d},e.type=\"themeRiver\",e}(zt);function TH(r,e,t){var a=new bt({shape:{x:r.x-10,y:r.y-10,width:0,height:r.height+20}});return Ft(a,{shape:{x:r.x-50,width:r.width+100,height:r.height+20}},e,t),a}var AH=CH,Zc=2,DH=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.init=function(t){r.prototype.init.apply(this,arguments),this.legendVisualProvider=new Nl(Y(this.getData,this),Y(this.getRawData,this))},e.prototype.fixData=function(t){var a=t.length,n={},i=Xd(t,function(v){return n.hasOwnProperty(v[0]+\"\")||(n[v[0]+\"\"]=-1),v[2]}),o=[];i.buckets.each(function(v,c){o.push({name:c,dataList:v})});for(var s=o.length,l=0;l<s;++l){for(var u=o[l].name,f=0;f<o[l].dataList.length;++f){var h=o[l].dataList[f][0]+\"\";n[h]=l}for(var h in n)n.hasOwnProperty(h)&&n[h]!==l&&(n[h]=l,t[a]=[h,0,u],a++)}return t},e.prototype.getInitialData=function(t,a){for(var n=this.getReferringComponents(\"singleAxis\",Qt).models[0],i=n.get(\"type\"),o=Et(t.data,function(d){return d[2]!==void 0}),s=this.fixData(o||[]),l=[],u=this.nameMap=q(),f=0,h=0;h<s.length;++h)l.push(s[h][Zc]),u.get(s[h][Zc])||(u.set(s[h][Zc],f),f++);var v=Il(s,{coordDimensions:[\"single\"],dimensionsDefine:[{name:\"time\",type:Ff(i)},{name:\"value\",type:\"float\"},{name:\"name\",type:\"ordinal\"}],encodeDefine:{single:0,value:1,itemName:2}}).dimensions,c=new De(v,this);return c.initData(s),c},e.prototype.getLayerSeries=function(){for(var t=this.getData(),a=t.count(),n=[],i=0;i<a;++i)n[i]=i;var o=t.mapDimension(\"single\"),s=Xd(n,function(u){return t.get(\"name\",u)}),l=[];return s.buckets.each(function(u,f){u.sort(function(h,v){return t.get(o,h)-t.get(o,v)}),l.push({name:f,indices:u})}),l},e.prototype.getAxisTooltipData=function(t,a,n){F(t)||(t=t?[t]:[]);for(var i=this.getData(),o=this.getLayerSeries(),s=[],l=o.length,u,f=0;f<l;++f){for(var h=Number.MAX_VALUE,v=-1,c=o[f].indices.length,d=0;d<c;++d){var p=i.get(t[0],o[f].indices[d]),g=Math.abs(p-a);g<=h&&(u=p,h=g,v=o[f].indices[d])}s.push(v)}return{dataIndices:s,nestestValue:u}},e.prototype.formatTooltip=function(t,a,n){var i=this.getData(),o=i.getName(t),s=i.get(i.mapDimension(\"value\"),t);return oe(\"nameValue\",{name:o,value:s})},e.type=\"series.themeRiver\",e.dependencies=[\"singleAxis\"],e.defaultOption={z:2,colorBy:\"data\",coordinateSystem:\"singleAxis\",boundaryGap:[\"10%\",\"10%\"],singleAxisIndex:0,animationEasing:\"linear\",label:{margin:4,show:!0,position:\"left\",fontSize:11},emphasis:{label:{show:!0}}},e}(Ht),MH=DH;function LH(r,e){r.eachSeriesByType(\"themeRiver\",function(t){var a=t.getData(),n=t.coordinateSystem,i={},o=n.getRect();i.rect=o;var s=t.get(\"boundaryGap\"),l=n.getAxis();if(i.boundaryGap=s,l.orient===\"horizontal\"){s[0]=W(s[0],o.height),s[1]=W(s[1],o.height);var u=o.height-s[0]-s[1];_x(a,t,u)}else{s[0]=W(s[0],o.width),s[1]=W(s[1],o.width);var f=o.width-s[0]-s[1];_x(a,t,f)}a.setLayout(\"layoutInfo\",i)})}function _x(r,e,t){if(!!r.count())for(var a=e.coordinateSystem,n=e.getLayerSeries(),i=r.mapDimension(\"single\"),o=r.mapDimension(\"value\"),s=G(n,function(g){return G(g.indices,function(y){var m=a.dataToPoint(r.get(i,y));return m[1]=r.get(o,y),m})}),l=IH(s),u=l.y0,f=t/l.max,h=n.length,v=n[0].indices.length,c,d=0;d<v;++d){c=u[d]*f,r.setItemLayout(n[0].indices[d],{layerIndex:0,x:s[0][d][0],y0:c,y:s[0][d][1]*f});for(var p=1;p<h;++p)c+=s[p-1][d][1]*f,r.setItemLayout(n[p].indices[d],{layerIndex:p,x:s[p][d][0],y0:c,y:s[p][d][1]*f})}}function IH(r){for(var e=r.length,t=r[0].length,a=[],n=[],i=0,o=0;o<t;++o){for(var s=0,l=0;l<e;++l)s+=r[l][o][1];s>i&&(i=s),a.push(s)}for(var u=0;u<t;++u)n[u]=(i-a[u])/2;i=0;for(var f=0;f<t;++f){var h=a[f]+n[f];h>i&&(i=h)}return{y0:n,max:i}}function PH(r){r.registerChartView(AH),r.registerSeriesModel(MH),r.registerLayout(LH),r.registerProcessor(Bl(\"themeRiver\"))}var RH=2,EH=4,kH=function(r){k(e,r);function e(t,a,n,i){var o=r.call(this)||this;o.z2=RH,o.textConfig={inside:!0},it(o).seriesIndex=a.seriesIndex;var s=new Dt({z2:EH,silent:t.getModel().get([\"label\",\"silent\"])});return o.setTextContent(s),o.updateData(!0,t,a,n,i),o}return e.prototype.updateData=function(t,a,n,i,o){this.node=a,a.piece=this,n=n||this._seriesModel,i=i||this._ecModel;var s=this;it(s).dataIndex=a.dataIndex;var l=a.getModel(),u=l.getModel(\"emphasis\"),f=a.getLayout(),h=V({},f);h.label=null;var v=a.getVisual(\"style\");v.lineJoin=\"bevel\";var c=a.getVisual(\"decal\");c&&(v.decal=co(c,o));var d=ri(l.getModel(\"itemStyle\"),h,!0);V(h,d),A(Le,function(m){var _=s.ensureState(m),S=l.getModel([m,\"itemStyle\"]);_.style=S.getItemStyle();var w=ri(S,h);w&&(_.shape=w)}),t?(s.setShape(h),s.shape.r=f.r0,Ft(s,{shape:{r:f.r}},n,a.dataIndex)):(Lt(s,{shape:h},n),Ar(s)),s.useStyle(v),this._updateLabel(n);var p=l.getShallow(\"cursor\");p&&s.attr(\"cursor\",p),this._seriesModel=n||this._seriesModel,this._ecModel=i||this._ecModel;var g=u.get(\"focus\"),y=g===\"ancestor\"?a.getAncestorsIndices():g===\"descendant\"?a.getDescendantIndices():g;$t(this,y,u.get(\"blurScope\"),u.get(\"disabled\"))},e.prototype._updateLabel=function(t){var a=this,n=this.node.getModel(),i=n.getModel(\"label\"),o=this.node.getLayout(),s=o.endAngle-o.startAngle,l=(o.startAngle+o.endAngle)/2,u=Math.cos(l),f=Math.sin(l),h=this,v=h.getTextContent(),c=this.node.dataIndex,d=i.get(\"minAngle\")/180*Math.PI,p=i.get(\"show\")&&!(d!=null&&Math.abs(s)<d);v.ignore=!p,A(qs,function(y){var m=y===\"normal\"?n.getModel(\"label\"):n.getModel([y,\"label\"]),_=y===\"normal\",S=_?v:v.ensureState(y),w=t.getFormattedLabel(c,y);_&&(w=w||a.node.name),S.style=Nt(m,{},null,y!==\"normal\",!0),w&&(S.style.text=w);var x=m.get(\"show\");x!=null&&!_&&(S.ignore=!x);var b=g(m,\"position\"),C=_?h:h.states[y],T=C.style.fill;C.textConfig={outsideFill:m.get(\"color\")===\"inherit\"?T:null,inside:b!==\"outside\"};var D,M=g(m,\"distance\")||0,L=g(m,\"align\");b===\"outside\"?(D=o.r+M,L=l>Math.PI/2?\"right\":\"left\"):!L||L===\"center\"?(s===2*Math.PI&&o.r0===0?D=0:D=(o.r+o.r0)/2,L=\"center\"):L===\"left\"?(D=o.r0+M,l>Math.PI/2&&(L=\"right\")):L===\"right\"&&(D=o.r-M,l>Math.PI/2&&(L=\"left\")),S.style.align=L,S.style.verticalAlign=g(m,\"verticalAlign\")||\"middle\",S.x=D*u+o.cx,S.y=D*f+o.cy;var I=g(m,\"rotate\"),P=0;I===\"radial\"?(P=xr(-l),P>Math.PI/2&&P<Math.PI*1.5&&(P+=Math.PI)):I===\"tangential\"?(P=Math.PI/2-l,P>Math.PI/2?P-=Math.PI:P<-Math.PI/2&&(P+=Math.PI)):Mt(I)&&(P=I*Math.PI/180),S.rotation=xr(P)});function g(y,m){var _=y.get(m);return _==null?i.get(m):_}v.dirtyStyle()},e}(Ve),Sx=kH,Wp=\"sunburstRootToNode\",xx=\"sunburstHighlight\",OH=\"sunburstUnhighlight\";function BH(r){r.registerAction({type:Wp,update:\"updateView\"},function(e,t){t.eachComponent({mainType:\"series\",subType:\"sunburst\",query:e},a);function a(n,i){var o=sl(e,[Wp],n);if(o){var s=n.getViewRoot();s&&(e.direction=Ry(s,o.node)?\"rollUp\":\"drillDown\"),n.resetViewRoot(o.node)}}}),r.registerAction({type:xx,update:\"none\"},function(e,t,a){e=V({},e),t.eachComponent({mainType:\"series\",subType:\"sunburst\",query:e},n);function n(i){var o=sl(e,[xx],i);o&&(e.dataIndex=o.node.dataIndex)}a.dispatchAction(V(e,{type:\"highlight\"}))}),r.registerAction({type:OH,update:\"updateView\"},function(e,t,a){e=V({},e),a.dispatchAction(V(e,{type:\"downplay\"}))})}var NH=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n,i){var o=this;this.seriesModel=t,this.api=n,this.ecModel=a;var s=t.getData(),l=s.tree.root,u=t.getViewRoot(),f=this.group,h=t.get(\"renderLabelForZeroData\"),v=[];u.eachNode(function(m){v.push(m)});var c=this._oldChildren||[];d(v,c),y(l,u),this._initEvents(),this._oldChildren=v;function d(m,_){if(m.length===0&&_.length===0)return;new xa(_,m,S,S).add(w).update(w).remove(ot(w,null)).execute();function S(x){return x.getId()}function w(x,b){var C=x==null?null:m[x],T=b==null?null:_[b];p(C,T)}}function p(m,_){if(!h&&m&&!m.getValue()&&(m=null),m!==l&&_!==l){if(_&&_.piece)m?(_.piece.updateData(!1,m,t,a,n),s.setItemGraphicEl(m.dataIndex,_.piece)):g(_);else if(m){var S=new Sx(m,t,a,n);f.add(S),s.setItemGraphicEl(m.dataIndex,S)}}}function g(m){!m||m.piece&&(f.remove(m.piece),m.piece=null)}function y(m,_){_.depth>0?(o.virtualPiece?o.virtualPiece.updateData(!1,m,t,a,n):(o.virtualPiece=new Sx(m,t,a,n),f.add(o.virtualPiece)),_.piece.off(\"click\"),o.virtualPiece.on(\"click\",function(S){o._rootToNode(_.parentNode)})):o.virtualPiece&&(f.remove(o.virtualPiece),o.virtualPiece=null)}},e.prototype._initEvents=function(){var t=this;this.group.off(\"click\"),this.group.on(\"click\",function(a){var n=!1,i=t.seriesModel.getViewRoot();i.eachNode(function(o){if(!n&&o.piece&&o.piece===a.target){var s=o.getModel().get(\"nodeClick\");if(s===\"rootToNode\")t._rootToNode(o);else if(s===\"link\"){var l=o.getModel(),u=l.get(\"link\");if(u){var f=l.get(\"target\",!0)||\"_blank\";Rf(u,f)}}n=!0}})})},e.prototype._rootToNode=function(t){t!==this.seriesModel.getViewRoot()&&this.api.dispatchAction({type:Wp,from:this.uid,seriesId:this.seriesModel.id,targetNode:t})},e.prototype.containPoint=function(t,a){var n=a.getData(),i=n.getItemLayout(0);if(i){var o=t[0]-i.cx,s=t[1]-i.cy,l=Math.sqrt(o*o+s*s);return l<=i.r&&l>=i.r0}},e.type=\"sunburst\",e}(zt),VH=NH,zH=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.ignoreStyleOnData=!0,t}return e.prototype.getInitialData=function(t,a){var n={name:t.name,children:t.data};MM(n);var i=this._levelModels=G(t.levels||[],function(l){return new Vt(l,this,a)},this),o=Py.createTree(n,this,s);function s(l){l.wrapMethod(\"getItemModel\",function(u,f){var h=o.getNodeByDataIndex(f),v=i[h.depth];return v&&(u.parentModel=v),u})}return o.data},e.prototype.optionUpdated=function(){this.resetViewRoot()},e.prototype.getDataParams=function(t){var a=r.prototype.getDataParams.apply(this,arguments),n=this.getData().tree.getNodeByDataIndex(t);return a.treePathInfo=Yh(n,this),a},e.prototype.getLevelModel=function(t){return this._levelModels&&this._levelModels[t.depth]},e.prototype.getViewRoot=function(){return this._viewRoot},e.prototype.resetViewRoot=function(t){t?this._viewRoot=t:t=this._viewRoot;var a=this.getRawData().tree.root;(!t||t!==a&&!a.contains(t))&&(this._viewRoot=a)},e.prototype.enableAriaDecal=function(){PD(this)},e.type=\"series.sunburst\",e.defaultOption={z:2,center:[\"50%\",\"50%\"],radius:[0,\"75%\"],clockwise:!0,startAngle:90,minAngle:0,stillShowZeroSum:!0,nodeClick:\"rootToNode\",renderLabelForZeroData:!1,label:{rotate:\"radial\",show:!0,opacity:1,align:\"center\",position:\"inside\",distance:5,silent:!0},itemStyle:{borderWidth:1,borderColor:\"white\",borderType:\"solid\",shadowBlur:0,shadowColor:\"rgba(0, 0, 0, 0.2)\",shadowOffsetX:0,shadowOffsetY:0,opacity:1},emphasis:{focus:\"descendant\"},blur:{itemStyle:{opacity:.2},label:{opacity:.1}},animationType:\"expansion\",animationDuration:1e3,animationDurationUpdate:500,data:[],sort:\"desc\"},e}(Ht);function MM(r){var e=0;A(r.children,function(a){MM(a);var n=a.value;F(n)&&(n=n[0]),e+=n});var t=r.value;F(t)&&(t=t[0]),(t==null||isNaN(t))&&(t=e),t<0&&(t=0),F(r.value)?r.value[0]=t:r.value=t}var FH=zH,bx=Math.PI/180;function GH(r,e,t){e.eachSeriesByType(r,function(a){var n=a.get(\"center\"),i=a.get(\"radius\");F(i)||(i=[0,i]),F(n)||(n=[n,n]);var o=t.getWidth(),s=t.getHeight(),l=Math.min(o,s),u=W(n[0],o),f=W(n[1],s),h=W(i[0],l/2),v=W(i[1],l/2),c=-a.get(\"startAngle\")*bx,d=a.get(\"minAngle\")*bx,p=a.getData().tree.root,g=a.getViewRoot(),y=g.depth,m=a.get(\"sort\");m!=null&&LM(g,m);var _=0;A(g.children,function(E){!isNaN(E.getValue())&&_++});var S=g.getValue(),w=Math.PI/(S||_)*2,x=g.depth>0,b=g.height-(x?-1:1),C=(v-h)/(b||1),T=a.get(\"clockwise\"),D=a.get(\"stillShowZeroSum\"),M=T?1:-1,L=function(E,B){if(!!E){var O=B;if(E!==p){var z=E.getValue(),H=S===0&&D?w:z*w;H<d&&(H=d),O=B+M*H;var $=E.depth-y-(x?-1:1),X=h+C*$,Q=h+C*($+1),j=a.getLevelModel(E);if(j){var pt=j.get(\"r0\",!0),xt=j.get(\"r\",!0),gt=j.get(\"radius\",!0);gt!=null&&(pt=gt[0],xt=gt[1]),pt!=null&&(X=W(pt,l/2)),xt!=null&&(Q=W(xt,l/2))}E.setLayout({angle:H,startAngle:B,endAngle:O,clockwise:T,cx:u,cy:f,r0:X,r:Q})}if(E.children&&E.children.length){var rt=0;A(E.children,function(yt){rt+=L(yt,B+rt)})}return O-B}};if(x){var I=h,P=h+C,R=Math.PI*2;p.setLayout({angle:R,startAngle:c,endAngle:c+R,clockwise:T,cx:u,cy:f,r0:I,r:P})}L(g,c)})}function LM(r,e){var t=r.children||[];r.children=HH(t,e),t.length&&A(r.children,function(a){LM(a,e)})}function HH(r,e){if(J(e)){var t=G(r,function(n,i){var o=n.getValue();return{params:{depth:n.depth,height:n.height,dataIndex:n.dataIndex,getValue:function(){return o}},index:i}});return t.sort(function(n,i){return e(n.params,i.params)}),G(t,function(n){return r[n.index]})}else{var a=e===\"asc\";return r.sort(function(n,i){var o=(n.getValue()-i.getValue())*(a?1:-1);return o===0?(n.dataIndex-i.dataIndex)*(a?-1:1):o})}}function WH(r){var e={};function t(a,n,i){for(var o=a;o&&o.depth>1;)o=o.parentNode;var s=n.getColorFromPalette(o.name||o.dataIndex+\"\",e);return a.depth>1&&U(s)&&(s=Vd(s,(a.depth-1)/(i-1)*.5)),s}r.eachSeriesByType(\"sunburst\",function(a){var n=a.getData(),i=n.tree;i.eachNode(function(o){var s=o.getModel(),l=s.getModel(\"itemStyle\").getItemStyle();l.fill||(l.fill=t(o,a,i.root.height));var u=n.ensureUniqueItemVisual(o.dataIndex,\"style\");V(u,l)})})}function $H(r){r.registerChartView(VH),r.registerSeriesModel(FH),r.registerLayout(ot(GH,\"sunburst\")),r.registerProcessor(ot(Bl,\"sunburst\")),r.registerVisual(WH),BH(r)}var Cx={color:\"fill\",borderColor:\"stroke\"},UH={symbol:1,symbolSize:1,symbolKeepAspect:1,legendIcon:1,visualMeta:1,liftZ:1,decal:1},ca=Ct(),YH=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.optionUpdated=function(){this.currentZLevel=this.get(\"zlevel\",!0),this.currentZ=this.get(\"z\",!0)},e.prototype.getInitialData=function(t,a){return Ta(null,this)},e.prototype.getDataParams=function(t,a,n){var i=r.prototype.getDataParams.call(this,t,a);return n&&(i.info=ca(n).info),i},e.type=\"series.custom\",e.dependencies=[\"grid\",\"polar\",\"geo\",\"singleAxis\",\"calendar\"],e.defaultOption={coordinateSystem:\"cartesian2d\",z:2,legendHoverLink:!0,clip:!1},e}(Ht),ZH=YH;function XH(r,e){return e=e||[0,0],G([\"x\",\"y\"],function(t,a){var n=this.getAxis(t),i=e[a],o=r[a]/2;return n.type===\"category\"?n.getBandWidth():Math.abs(n.dataToCoord(i-o)-n.dataToCoord(i+o))},this)}function qH(r){var e=r.master.getRect();return{coordSys:{type:\"cartesian2d\",x:e.x,y:e.y,width:e.width,height:e.height},api:{coord:function(t){return r.dataToPoint(t)},size:Y(XH,r)}}}function KH(r,e){return e=e||[0,0],G([0,1],function(t){var a=e[t],n=r[t]/2,i=[],o=[];return i[t]=a-n,o[t]=a+n,i[1-t]=o[1-t]=e[1-t],Math.abs(this.dataToPoint(i)[t]-this.dataToPoint(o)[t])},this)}function JH(r){var e=r.getBoundingRect();return{coordSys:{type:\"geo\",x:e.x,y:e.y,width:e.width,height:e.height,zoom:r.getZoom()},api:{coord:function(t){return r.dataToPoint(t)},size:Y(KH,r)}}}function QH(r,e){var t=this.getAxis(),a=e instanceof Array?e[0]:e,n=(r instanceof Array?r[0]:r)/2;return t.type===\"category\"?t.getBandWidth():Math.abs(t.dataToCoord(a-n)-t.dataToCoord(a+n))}function jH(r){var e=r.getRect();return{coordSys:{type:\"singleAxis\",x:e.x,y:e.y,width:e.width,height:e.height},api:{coord:function(t){return r.dataToPoint(t)},size:Y(QH,r)}}}function tW(r,e){return e=e||[0,0],G([\"Radius\",\"Angle\"],function(t,a){var n=\"get\"+t+\"Axis\",i=this[n](),o=e[a],s=r[a]/2,l=i.type===\"category\"?i.getBandWidth():Math.abs(i.dataToCoord(o-s)-i.dataToCoord(o+s));return t===\"Angle\"&&(l=l*Math.PI/180),l},this)}function eW(r){var e=r.getRadiusAxis(),t=r.getAngleAxis(),a=e.getExtent();return a[0]>a[1]&&a.reverse(),{coordSys:{type:\"polar\",cx:r.cx,cy:r.cy,r:a[1],r0:a[0]},api:{coord:function(n){var i=e.dataToRadius(n[0]),o=t.dataToAngle(n[1]),s=r.coordToPoint([i,o]);return s.push(i,o*Math.PI/180),s},size:Y(tW,r)}}}function rW(r){var e=r.getRect(),t=r.getRangeInfo();return{coordSys:{type:\"calendar\",x:e.x,y:e.y,width:e.width,height:e.height,cellWidth:r.getCellWidth(),cellHeight:r.getCellHeight(),rangeInfo:{start:t.start,end:t.end,weeks:t.weeks,dayCount:t.allDay}},api:{coord:function(a,n){return r.dataToPoint(a,n)}}}}function IM(r,e,t,a){return r&&(r.legacy||r.legacy!==!1&&!t&&!a&&e!==\"tspan\"&&(e===\"text\"||Z(r,\"text\")))}function PM(r,e,t){var a=r,n,i,o;if(e===\"text\")o=a;else{o={},Z(a,\"text\")&&(o.text=a.text),Z(a,\"rich\")&&(o.rich=a.rich),Z(a,\"textFill\")&&(o.fill=a.textFill),Z(a,\"textStroke\")&&(o.stroke=a.textStroke),Z(a,\"fontFamily\")&&(o.fontFamily=a.fontFamily),Z(a,\"fontSize\")&&(o.fontSize=a.fontSize),Z(a,\"fontStyle\")&&(o.fontStyle=a.fontStyle),Z(a,\"fontWeight\")&&(o.fontWeight=a.fontWeight),i={type:\"text\",style:o,silent:!0},n={};var s=Z(a,\"textPosition\");t?n.position=s?a.textPosition:\"inside\":s&&(n.position=a.textPosition),Z(a,\"textPosition\")&&(n.position=a.textPosition),Z(a,\"textOffset\")&&(n.offset=a.textOffset),Z(a,\"textRotation\")&&(n.rotation=a.textRotation),Z(a,\"textDistance\")&&(n.distance=a.textDistance)}return Tx(o,r),A(o.rich,function(l){Tx(l,l)}),{textConfig:n,textContent:i}}function Tx(r,e){!e||(e.font=e.textFont||e.font,Z(e,\"textStrokeWidth\")&&(r.lineWidth=e.textStrokeWidth),Z(e,\"textAlign\")&&(r.align=e.textAlign),Z(e,\"textVerticalAlign\")&&(r.verticalAlign=e.textVerticalAlign),Z(e,\"textLineHeight\")&&(r.lineHeight=e.textLineHeight),Z(e,\"textWidth\")&&(r.width=e.textWidth),Z(e,\"textHeight\")&&(r.height=e.textHeight),Z(e,\"textBackgroundColor\")&&(r.backgroundColor=e.textBackgroundColor),Z(e,\"textPadding\")&&(r.padding=e.textPadding),Z(e,\"textBorderColor\")&&(r.borderColor=e.textBorderColor),Z(e,\"textBorderWidth\")&&(r.borderWidth=e.textBorderWidth),Z(e,\"textBorderRadius\")&&(r.borderRadius=e.textBorderRadius),Z(e,\"textBoxShadowColor\")&&(r.shadowColor=e.textBoxShadowColor),Z(e,\"textBoxShadowBlur\")&&(r.shadowBlur=e.textBoxShadowBlur),Z(e,\"textBoxShadowOffsetX\")&&(r.shadowOffsetX=e.textBoxShadowOffsetX),Z(e,\"textBoxShadowOffsetY\")&&(r.shadowOffsetY=e.textBoxShadowOffsetY))}function Ax(r,e,t){var a=r;a.textPosition=a.textPosition||t.position||\"inside\",t.offset!=null&&(a.textOffset=t.offset),t.rotation!=null&&(a.textRotation=t.rotation),t.distance!=null&&(a.textDistance=t.distance);var n=a.textPosition.indexOf(\"inside\")>=0,i=r.fill||\"#000\";Dx(a,e);var o=a.textFill==null;return n?o&&(a.textFill=t.insideFill||\"#fff\",!a.textStroke&&t.insideStroke&&(a.textStroke=t.insideStroke),!a.textStroke&&(a.textStroke=i),a.textStrokeWidth==null&&(a.textStrokeWidth=2)):(o&&(a.textFill=r.fill||t.outsideFill||\"#000\"),!a.textStroke&&t.outsideStroke&&(a.textStroke=t.outsideStroke)),a.text=e.text,a.rich=e.rich,A(e.rich,function(s){Dx(s,s)}),a}function Dx(r,e){!e||(Z(e,\"fill\")&&(r.textFill=e.fill),Z(e,\"stroke\")&&(r.textStroke=e.fill),Z(e,\"lineWidth\")&&(r.textStrokeWidth=e.lineWidth),Z(e,\"font\")&&(r.font=e.font),Z(e,\"fontStyle\")&&(r.fontStyle=e.fontStyle),Z(e,\"fontWeight\")&&(r.fontWeight=e.fontWeight),Z(e,\"fontSize\")&&(r.fontSize=e.fontSize),Z(e,\"fontFamily\")&&(r.fontFamily=e.fontFamily),Z(e,\"align\")&&(r.textAlign=e.align),Z(e,\"verticalAlign\")&&(r.textVerticalAlign=e.verticalAlign),Z(e,\"lineHeight\")&&(r.textLineHeight=e.lineHeight),Z(e,\"width\")&&(r.textWidth=e.width),Z(e,\"height\")&&(r.textHeight=e.height),Z(e,\"backgroundColor\")&&(r.textBackgroundColor=e.backgroundColor),Z(e,\"padding\")&&(r.textPadding=e.padding),Z(e,\"borderColor\")&&(r.textBorderColor=e.borderColor),Z(e,\"borderWidth\")&&(r.textBorderWidth=e.borderWidth),Z(e,\"borderRadius\")&&(r.textBorderRadius=e.borderRadius),Z(e,\"shadowColor\")&&(r.textBoxShadowColor=e.shadowColor),Z(e,\"shadowBlur\")&&(r.textBoxShadowBlur=e.shadowBlur),Z(e,\"shadowOffsetX\")&&(r.textBoxShadowOffsetX=e.shadowOffsetX),Z(e,\"shadowOffsetY\")&&(r.textBoxShadowOffsetY=e.shadowOffsetY),Z(e,\"textShadowColor\")&&(r.textShadowColor=e.textShadowColor),Z(e,\"textShadowBlur\")&&(r.textShadowBlur=e.textShadowBlur),Z(e,\"textShadowOffsetX\")&&(r.textShadowOffsetX=e.textShadowOffsetX),Z(e,\"textShadowOffsetY\")&&(r.textShadowOffsetY=e.textShadowOffsetY))}var RM={position:[\"x\",\"y\"],scale:[\"scaleX\",\"scaleY\"],origin:[\"originX\",\"originY\"]},Mx=St(RM);Zr(qr,function(r,e){return r[e]=1,r},{});qr.join(\", \");var Qf=[\"\",\"style\",\"shape\",\"extra\"],_o=Ct();function Xy(r,e,t,a,n){var i=r+\"Animation\",o=Ao(r,a,n)||{},s=_o(e).userDuring;return o.duration>0&&(o.during=s?Y(sW,{el:e,userDuring:s}):null,o.setToFinal=!0,o.scope=r),V(o,t[i]),o}function ff(r,e,t,a){a=a||{};var n=a.dataIndex,i=a.isInit,o=a.clearStyle,s=t.isAnimationEnabled(),l=_o(r),u=e.style;l.userDuring=e.during;var f={},h={};if(uW(r,e,h),Ix(\"shape\",e,h),Ix(\"extra\",e,h),!i&&s&&(lW(r,e,f),Lx(\"shape\",r,e,f),Lx(\"extra\",r,e,f),fW(r,e,u,f)),h.style=u,aW(r,h,o),iW(r,e),s)if(i){var v={};A(Qf,function(d){var p=d?e[d]:e;p&&p.enterFrom&&(d&&(v[d]=v[d]||{}),V(d?v[d]:v,p.enterFrom))});var c=Xy(\"enter\",r,e,t,n);c.duration>0&&r.animateFrom(v,c)}else nW(r,e,n||0,t,f);EM(r,e),u?r.dirty():r.markRedraw()}function EM(r,e){for(var t=_o(r).leaveToProps,a=0;a<Qf.length;a++){var n=Qf[a],i=n?e[n]:e;i&&i.leaveTo&&(t||(t=_o(r).leaveToProps={}),n&&(t[n]=t[n]||{}),V(n?t[n]:t,i.leaveTo))}}function qh(r,e,t,a){if(r){var n=r.parent,i=_o(r).leaveToProps;if(i){var o=Xy(\"update\",r,e,t,0);o.done=function(){n.remove(r),a&&a()},r.animateTo(i,o)}else n.remove(r),a&&a()}}function vi(r){return r===\"all\"}function aW(r,e,t){var a=e.style;if(!r.isGroup&&a){if(t){r.useStyle({});for(var n=r.animators,i=0;i<n.length;i++){var o=n[i];o.targetName===\"style\"&&o.changeTarget(r.style)}}r.setStyle(a)}e&&(e.style=null,e&&r.attr(e),e.style=a)}function nW(r,e,t,a,n){if(n){var i=Xy(\"update\",r,e,a,t);i.duration>0&&r.animateFrom(n,i)}}function iW(r,e){Z(e,\"silent\")&&(r.silent=e.silent),Z(e,\"ignore\")&&(r.ignore=e.ignore),r instanceof fr&&Z(e,\"invisible\")&&(r.invisible=e.invisible),r instanceof mt&&Z(e,\"autoBatch\")&&(r.autoBatch=e.autoBatch)}var kr={},oW={setTransform:function(r,e){return kr.el[r]=e,this},getTransform:function(r){return kr.el[r]},setShape:function(r,e){var t=kr.el,a=t.shape||(t.shape={});return a[r]=e,t.dirtyShape&&t.dirtyShape(),this},getShape:function(r){var e=kr.el.shape;if(e)return e[r]},setStyle:function(r,e){var t=kr.el,a=t.style;return a&&(a[r]=e,t.dirtyStyle&&t.dirtyStyle()),this},getStyle:function(r){var e=kr.el.style;if(e)return e[r]},setExtra:function(r,e){var t=kr.el.extra||(kr.el.extra={});return t[r]=e,this},getExtra:function(r){var e=kr.el.extra;if(e)return e[r]}};function sW(){var r=this,e=r.el;if(!!e){var t=_o(e).userDuring,a=r.userDuring;if(t!==a){r.el=r.userDuring=null;return}kr.el=e,a(oW)}}function Lx(r,e,t,a){var n=t[r];if(!!n){var i=e[r],o;if(i){var s=t.transition,l=n.transition;if(l)if(!o&&(o=a[r]={}),vi(l))V(o,i);else for(var u=kt(l),f=0;f<u.length;f++){var h=u[f],v=i[h];o[h]=v}else if(vi(s)||dt(s,r)>=0){!o&&(o=a[r]={});for(var c=St(i),f=0;f<c.length;f++){var h=c[f],v=i[h];hW(n[h],v)&&(o[h]=v)}}}}}function Ix(r,e,t){var a=e[r];if(!!a)for(var n=t[r]={},i=St(a),o=0;o<i.length;o++){var s=i[o];n[s]=Ds(a[s])}}function lW(r,e,t){for(var a=e.transition,n=vi(a)?qr:kt(a||[]),i=0;i<n.length;i++){var o=n[i];if(!(o===\"style\"||o===\"shape\"||o===\"extra\")){var s=r[o];t[o]=s}}}function uW(r,e,t){for(var a=0;a<Mx.length;a++){var n=Mx[a],i=RM[n],o=e[n];o&&(t[i[0]]=o[0],t[i[1]]=o[1])}for(var a=0;a<qr.length;a++){var s=qr[a];e[s]!=null&&(t[s]=e[s])}}function fW(r,e,t,a){if(!!t){var n=r.style,i;if(n){var o=t.transition,s=e.transition;if(o&&!vi(o)){var l=kt(o);!i&&(i=a.style={});for(var u=0;u<l.length;u++){var f=l[u],h=n[f];i[f]=h}}else if(r.getAnimationStyleProps&&(vi(s)||vi(o)||dt(s,\"style\")>=0)){var v=r.getAnimationStyleProps(),c=v?v.style:null;if(c){!i&&(i=a.style={});for(var d=St(t),u=0;u<d.length;u++){var f=d[u];if(c[f]){var h=n[f];i[f]=h}}}}}}}function hW(r,e){return Se(r)?r!==e:r!=null&&isFinite(r)}var kM=Ct(),vW=[\"percent\",\"easing\",\"shape\",\"style\",\"extra\"];function OM(r){r.stopAnimation(\"keyframe\"),r.attr(kM(r))}function jf(r,e,t){if(!(!t.isAnimationEnabled()||!e)){if(F(e)){A(e,function(s){jf(r,s,t)});return}var a=e.keyframes,n=e.duration;if(t&&n==null){var i=Ao(\"enter\",t,0);n=i&&i.duration}if(!(!a||!n)){var o=kM(r);A(Qf,function(s){if(!(s&&!r[s])){var l;a.sort(function(u,f){return u.percent-f.percent}),A(a,function(u){var f=r.animators,h=s?u[s]:u;if(!!h){var v=St(h);if(s||(v=Et(v,function(p){return dt(vW,p)<0})),!!v.length){l||(l=r.animate(s,e.loop,!0),l.scope=\"keyframe\");for(var c=0;c<f.length;c++)f[c]!==l&&f[c].targetName===l.targetName&&f[c].stopTracks(v);s&&(o[s]=o[s]||{});var d=s?o[s]:o;A(v,function(p){d[p]=((s?r[s]:r)||{})[p]}),l.whenWithKeys(n*u.percent,h,v,u.easing)}}}),l&&l.delay(e.delay||0).duration(n).start(e.easing)}})}}}var da=\"emphasis\",Xa=\"normal\",qy=\"blur\",Ky=\"select\",ln=[Xa,da,qy,Ky],Xc={normal:[\"itemStyle\"],emphasis:[da,\"itemStyle\"],blur:[qy,\"itemStyle\"],select:[Ky,\"itemStyle\"]},qc={normal:[\"label\"],emphasis:[da,\"label\"],blur:[qy,\"label\"],select:[Ky,\"label\"]},cW=[\"x\",\"y\"],dW=\"e\\0\\0\",qe={normal:{},emphasis:{},blur:{},select:{}},pW={cartesian2d:qH,geo:JH,single:jH,polar:eW,calendar:rW};function $p(r){return r instanceof mt}function Up(r){return r instanceof fr}function gW(r,e){e.copyTransform(r),Up(e)&&Up(r)&&(e.setStyle(r.style),e.z=r.z,e.z2=r.z2,e.zlevel=r.zlevel,e.invisible=r.invisible,e.ignore=r.ignore,$p(e)&&$p(r)&&e.setShape(r.shape))}var yW=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n,i){this._progressiveEls=null;var o=this._data,s=t.getData(),l=this.group,u=Px(t,s,a,n);o||l.removeAll(),s.diff(o).add(function(h){Kc(n,null,h,u(h,i),t,l,s)}).remove(function(h){var v=o.getItemGraphicEl(h);v&&qh(v,ca(v).option,t)}).update(function(h,v){var c=o.getItemGraphicEl(v);Kc(n,c,h,u(h,i),t,l,s)}).execute();var f=t.get(\"clip\",!0)?Wh(t.coordinateSystem,!1,t):null;f?l.setClipPath(f):l.removeClipPath(),this._data=s},e.prototype.incrementalPrepareRender=function(t,a,n){this.group.removeAll(),this._data=null},e.prototype.incrementalRender=function(t,a,n,i,o){var s=a.getData(),l=Px(a,s,n,i),u=this._progressiveEls=[];function f(c){c.isGroup||(c.incremental=!0,c.ensureState(\"emphasis\").hoverLayer=!0)}for(var h=t.start;h<t.end;h++){var v=Kc(null,null,h,l(h,o),a,this.group,s);v&&(v.traverse(f),u.push(v))}},e.prototype.eachRendered=function(t){vn(this._progressiveEls||this.group,t)},e.prototype.filterForExposedEvent=function(t,a,n,i){var o=a.element;if(o==null||n.name===o)return!0;for(;(n=n.__hostTarget||n.parent)&&n!==this.group;)if(n.name===o)return!0;return!1},e.type=\"custom\",e}(zt),mW=yW;function Jy(r){var e=r.type,t;if(e===\"path\"){var a=r.shape,n=a.width!=null&&a.height!=null?{x:a.x||0,y:a.y||0,width:a.width,height:a.height}:null,i=VM(a);t=Ah(i,null,n,a.layout||\"center\"),ca(t).customPathData=i}else if(e===\"image\")t=new pe({}),ca(t).customImagePath=r.style.image;else if(e===\"text\")t=new Dt({});else if(e===\"group\")t=new nt;else{if(e===\"compoundPath\")throw new Error('\"compoundPath\" is not supported yet.');var o=$g(e);if(!o){var s=\"\";Pt(s)}t=new o}return ca(t).customGraphicType=e,t.name=r.name,t.z2EmphasisLift=1,t.z2SelectLift=1,t}function Qy(r,e,t,a,n,i,o){OM(e);var s=n&&n.normal.cfg;s&&e.setTextConfig(s),a&&a.transition==null&&(a.transition=cW);var l=a&&a.style;if(l){if(e.type===\"text\"){var u=l;Z(u,\"textFill\")&&(u.fill=u.textFill),Z(u,\"textStroke\")&&(u.stroke=u.textStroke)}var f=void 0,h=$p(e)?l.decal:null;r&&h&&(h.dirty=!0,f=co(h,r)),l.__decalPattern=f}if(Up(e)&&l){var f=l.__decalPattern;f&&(l.decal=f)}ff(e,a,i,{dataIndex:t,isInit:o,clearStyle:!0}),jf(e,a.keyframeAnimation,i)}function BM(r,e,t,a,n){var i=e.isGroup?null:e,o=n&&n[r].cfg;if(i){var s=i.ensureState(r);if(a===!1){var l=i.getState(r);l&&(l.style=null)}else s.style=a||null;o&&(s.textConfig=o),gi(i)}}function _W(r,e,t){if(!r.isGroup){var a=r,n=t.currentZ,i=t.currentZLevel;a.z=n,a.zlevel=i;var o=e.z2;o!=null&&(a.z2=o||0);for(var s=0;s<ln.length;s++)SW(a,e,ln[s])}}function SW(r,e,t){var a=t===Xa,n=a?e:th(e,t),i=n?n.z2:null,o;i!=null&&(o=a?r:r.ensureState(t),o.z2=i||0)}function Px(r,e,t,a){var n=r.get(\"renderItem\"),i=r.coordinateSystem,o={};i&&(o=i.prepareCustoms?i.prepareCustoms(i):pW[i.type](i));for(var s=tt({getWidth:a.getWidth,getHeight:a.getHeight,getZr:a.getZr,getDevicePixelRatio:a.getDevicePixelRatio,value:S,style:x,ordinalRawValue:w,styleEmphasis:b,visual:D,barLayout:M,currentSeriesIndices:L,font:I},o.api||{}),l={context:{},seriesId:r.id,seriesName:r.name,seriesIndex:r.seriesIndex,coordSys:o.coordSys,dataInsideLength:e.count(),encode:xW(r.getData())},u,f,h={},v={},c={},d={},p=0;p<ln.length;p++){var g=ln[p];c[g]=r.getModel(Xc[g]),d[g]=r.getModel(qc[g])}function y(P){return P===u?f||(f=e.getItemModel(P)):e.getItemModel(P)}function m(P,R){return e.hasItemOption?P===u?h[R]||(h[R]=y(P).getModel(Xc[R])):y(P).getModel(Xc[R]):c[R]}function _(P,R){return e.hasItemOption?P===u?v[R]||(v[R]=y(P).getModel(qc[R])):y(P).getModel(qc[R]):d[R]}return function(P,R){return u=P,f=null,h={},v={},n&&n(tt({dataIndexInside:P,dataIndex:e.getRawIndex(P),actionType:R?R.type:null},l),s)};function S(P,R){return R==null&&(R=u),e.getStore().get(e.getDimensionIndex(P||0),R)}function w(P,R){R==null&&(R=u),P=P||0;var E=e.getDimensionInfo(P);if(!E){var B=e.getDimensionIndex(P);return B>=0?e.getStore().get(B,R):void 0}var O=e.get(E.name,R),z=E&&E.ordinalMeta;return z?z.categories[O]:O}function x(P,R){R==null&&(R=u);var E=e.getItemVisual(R,\"style\"),B=E&&E.fill,O=E&&E.opacity,z=m(R,Xa).getItemStyle();B!=null&&(z.fill=B),O!=null&&(z.opacity=O);var H={inheritColor:U(B)?B:\"#000\"},$=_(R,Xa),X=Nt($,null,H,!1,!0);X.text=$.getShallow(\"show\")?ft(r.getFormattedLabel(R,Xa),go(e,R)):null;var Q=If($,H,!1);return T(P,z),z=Ax(z,X,Q),P&&C(z,P),z.legacy=!0,z}function b(P,R){R==null&&(R=u);var E=m(R,da).getItemStyle(),B=_(R,da),O=Nt(B,null,null,!0,!0);O.text=B.getShallow(\"show\")?Ur(r.getFormattedLabel(R,da),r.getFormattedLabel(R,Xa),go(e,R)):null;var z=If(B,null,!0);return T(P,E),E=Ax(E,O,z),P&&C(E,P),E.legacy=!0,E}function C(P,R){for(var E in R)Z(R,E)&&(P[E]=R[E])}function T(P,R){P&&(P.textFill&&(R.textFill=P.textFill),P.textPosition&&(R.textPosition=P.textPosition))}function D(P,R){if(R==null&&(R=u),Z(Cx,P)){var E=e.getItemVisual(R,\"style\");return E?E[Cx[P]]:null}if(Z(UH,P))return e.getItemVisual(R,P)}function M(P){if(i.type===\"cartesian2d\"){var R=i.getBaseAxis();return hN(tt({axis:R},P))}}function L(){return t.getCurrentSeriesIndices()}function I(P){return MC(P,t)}}function xW(r){var e={};return A(r.dimensions,function(t){var a=r.getDimensionInfo(t);if(!a.isExtraCoord){var n=a.coordDim,i=e[n]=e[n]||[];i[a.coordDimIndex]=r.getDimensionIndex(t)}}),e}function Kc(r,e,t,a,n,i,o){if(!a){i.remove(e);return}var s=jy(r,e,t,a,n,i);return s&&o.setItemGraphicEl(t,s),s&&$t(s,a.focus,a.blurScope,a.emphasisDisabled),s}function jy(r,e,t,a,n,i){var o=-1,s=e;e&&NM(e,a,n)&&(o=dt(i.childrenRef(),e),e=null);var l=!e,u=e;u?u.clearStates():(u=Jy(a),s&&gW(s,u)),a.morph===!1?u.disableMorphing=!0:u.disableMorphing&&(u.disableMorphing=!1),qe.normal.cfg=qe.normal.conOpt=qe.emphasis.cfg=qe.emphasis.conOpt=qe.blur.cfg=qe.blur.conOpt=qe.select.cfg=qe.select.conOpt=null,qe.isLegacy=!1,bW(u,t,a,n,l,qe),wW(u,t,a,n,l),Qy(r,u,t,a,qe,n,l),Z(a,\"info\")&&(ca(u).info=a.info);for(var f=0;f<ln.length;f++){var h=ln[f];if(h!==Xa){var v=th(a,h),c=tm(a,v,h);BM(h,u,v,c,qe)}}return _W(u,a,n),a.type===\"group\"&&CW(r,u,t,a,n),o>=0?i.replaceAt(u,o):i.add(u),u}function NM(r,e,t){var a=ca(r),n=e.type,i=e.shape,o=e.style;return t.isUniversalTransitionEnabled()||n!=null&&n!==a.customGraphicType||n===\"path\"&&MW(i)&&VM(i)!==a.customPathData||n===\"image\"&&Z(o,\"image\")&&o.image!==a.customImagePath}function wW(r,e,t,a,n){var i=t.clipPath;if(i===!1)r&&r.getClipPath()&&r.removeClipPath();else if(i){var o=r.getClipPath();o&&NM(o,i,a)&&(o=null),o||(o=Jy(i),r.setClipPath(o)),Qy(null,o,e,i,null,a,n)}}function bW(r,e,t,a,n,i){if(!r.isGroup){Rx(t,null,i),Rx(t,da,i);var o=i.normal.conOpt,s=i.emphasis.conOpt,l=i.blur.conOpt,u=i.select.conOpt;if(o!=null||s!=null||u!=null||l!=null){var f=r.getTextContent();if(o===!1)f&&r.removeTextContent();else{o=i.normal.conOpt=o||{type:\"text\"},f?f.clearStates():(f=Jy(o),r.setTextContent(f)),Qy(null,f,e,o,null,a,n);for(var h=o&&o.style,v=0;v<ln.length;v++){var c=ln[v];if(c!==Xa){var d=i[c].conOpt;BM(c,f,d,tm(o,d,c),null)}}h?f.dirty():f.markRedraw()}}}}function Rx(r,e,t){var a=e?th(r,e):r,n=e?tm(r,a,da):r.style,i=r.type,o=a?a.textConfig:null,s=r.textContent,l=s?e?th(s,e):s:null;if(n&&(t.isLegacy||IM(n,i,!!o,!!l))){t.isLegacy=!0;var u=PM(n,i,!e);!o&&u.textConfig&&(o=u.textConfig),!l&&u.textContent&&(l=u.textContent)}if(!e&&l){var f=l;!f.type&&(f.type=\"text\")}var h=e?t[e]:t.normal;h.cfg=o,h.conOpt=l}function th(r,e){return e?r?r[e]:null:r}function tm(r,e,t){var a=e&&e.style;return a==null&&t===da&&r&&(a=r.styleEmphasis),a}function CW(r,e,t,a,n){var i=a.children,o=i?i.length:0,s=a.$mergeChildren,l=s===\"byName\"||a.diffChildrenByName,u=s===!1;if(!(!o&&!l&&!u)){if(l){AW({api:r,oldChildren:e.children()||[],newChildren:i||[],dataIndex:t,seriesModel:n,group:e});return}u&&e.removeAll();for(var f=0;f<o;f++){var h=i[f],v=e.childAt(f);h?(h.ignore==null&&(h.ignore=!1),jy(r,v,t,h,n,e)):v.ignore=!0}for(var c=e.childCount()-1;c>=f;c--){var d=e.childAt(c);TW(e,d,n)}}}function TW(r,e,t){e&&qh(e,ca(r).option,t)}function AW(r){new xa(r.oldChildren,r.newChildren,Ex,Ex,r).add(kx).update(kx).remove(DW).execute()}function Ex(r,e){var t=r&&r.name;return t!=null?t:dW+e}function kx(r,e){var t=this.context,a=r!=null?t.newChildren[r]:null,n=e!=null?t.oldChildren[e]:null;jy(t.api,n,t.dataIndex,a,t.seriesModel,t.group)}function DW(r){var e=this.context,t=e.oldChildren[r];t&&qh(t,ca(t).option,e.seriesModel)}function VM(r){return r&&(r.pathData||r.d)}function MW(r){return r&&(Z(r,\"pathData\")||Z(r,\"d\"))}function LW(r){r.registerChartView(mW),r.registerSeriesModel(ZH)}var Jc=Math.sin,Qc=Math.cos,zM=Math.PI,Bn=Math.PI*2,IW=180/zM,PW=function(){function r(){}return r.prototype.reset=function(e){this._start=!0,this._d=[],this._str=\"\",this._p=Math.pow(10,e||4)},r.prototype.moveTo=function(e,t){this._add(\"M\",e,t)},r.prototype.lineTo=function(e,t){this._add(\"L\",e,t)},r.prototype.bezierCurveTo=function(e,t,a,n,i,o){this._add(\"C\",e,t,a,n,i,o)},r.prototype.quadraticCurveTo=function(e,t,a,n){this._add(\"Q\",e,t,a,n)},r.prototype.arc=function(e,t,a,n,i,o){this.ellipse(e,t,a,a,0,n,i,o)},r.prototype.ellipse=function(e,t,a,n,i,o,s,l){var u=s-o,f=!l,h=Math.abs(u),v=Ya(h-Bn)||(f?u>=Bn:-u>=Bn),c=u>0?u%Bn:u%Bn+Bn,d=!1;v?d=!0:Ya(h)?d=!1:d=c>=zM==!!f;var p=e+a*Qc(o),g=t+n*Jc(o);this._start&&this._add(\"M\",p,g);var y=Math.round(i*IW);if(v){var m=1/this._p,_=(f?1:-1)*(Bn-m);this._add(\"A\",a,n,y,1,+f,e+a*Qc(o+_),t+n*Jc(o+_)),m>.01&&this._add(\"A\",a,n,y,0,+f,p,g)}else{var S=e+a*Qc(s),w=t+n*Jc(s);this._add(\"A\",a,n,y,+d,+f,S,w)}},r.prototype.rect=function(e,t,a,n){this._add(\"M\",e,t),this._add(\"l\",a,0),this._add(\"l\",0,n),this._add(\"l\",-a,0),this._add(\"Z\")},r.prototype.closePath=function(){this._d.length>0&&this._add(\"Z\")},r.prototype._add=function(e,t,a,n,i,o,s,l,u){for(var f=[],h=this._p,v=1;v<arguments.length;v++){var c=arguments[v];if(isNaN(c)){this._invalid=!0;return}f.push(Math.round(c*h)/h)}this._d.push(e+f.join(\" \")),this._start=e===\"Z\"},r.prototype.generateStr=function(){this._str=this._invalid?\"\":this._d.join(\"\"),this._d=[]},r.prototype.getStr=function(){return this._str},r}(),FM=PW,zs=\"none\",RW=Math.round;function EW(r){var e=r.fill;return e!=null&&e!==zs}function kW(r){var e=r.stroke;return e!=null&&e!==zs}var Yp=[\"lineCap\",\"miterLimit\",\"lineJoin\"],OW=G(Yp,function(r){return\"stroke-\"+r.toLowerCase()});function BW(r,e,t,a){var n=e.opacity==null?1:e.opacity;if(t instanceof pe){r(\"opacity\",n);return}if(EW(e)){var i=Ys(e.fill);r(\"fill\",i.color);var o=e.fillOpacity!=null?e.fillOpacity*i.opacity*n:i.opacity*n;(a||o<1)&&r(\"fill-opacity\",o)}else r(\"fill\",zs);if(kW(e)){var s=Ys(e.stroke);r(\"stroke\",s.color);var l=e.strokeNoScale?t.getLineScale():1,u=l?(e.lineWidth||0)/l:0,f=e.strokeOpacity!=null?e.strokeOpacity*s.opacity*n:s.opacity*n,h=e.strokeFirst;if((a||u!==1)&&r(\"stroke-width\",u),(a||h)&&r(\"paint-order\",h?\"stroke\":\"fill\"),(a||f<1)&&r(\"stroke-opacity\",f),e.lineDash){var v=uy(t),c=v[0],d=v[1];c&&(d=RW(d||0),r(\"stroke-dasharray\",c.join(\",\")),(d||a)&&r(\"stroke-dashoffset\",d))}else a&&r(\"stroke-dasharray\",zs);for(var p=0;p<Yp.length;p++){var g=Yp[p];if(a||e[g]!==Tf[g]){var y=e[g]||Tf[g];y&&r(OW[p],y)}}}else a&&r(\"stroke\",zs)}var GM=\"http://www.w3.org/2000/svg\",HM=\"http://www.w3.org/1999/xlink\",NW=\"http://www.w3.org/2000/xmlns/\",VW=\"http://www.w3.org/XML/1998/namespace\";function WM(r){return document.createElementNS(GM,r)}function ne(r,e,t,a,n){return{tag:r,attrs:t||{},children:a,text:n,key:e}}function zW(r,e){var t=[];if(e)for(var a in e){var n=e[a],i=a;n!==!1&&(n!==!0&&n!=null&&(i+='=\"'+n+'\"'),t.push(i))}return\"<\"+r+\" \"+t.join(\" \")+\">\"}function FW(r){return\"</\"+r+\">\"}function em(r,e){e=e||{};var t=e.newline?`\n`:\"\";function a(n){var i=n.children,o=n.tag,s=n.attrs,l=n.text;return zW(o,s)+(o!==\"style\"?ke(l):l||\"\")+(i?\"\"+t+G(i,function(u){return a(u)}).join(t)+t:\"\")+FW(o)}return a(r)}function GW(r,e,t){t=t||{};var a=t.newline?`\n`:\"\",n=\" {\"+a,i=a+\"}\",o=G(St(r),function(l){return l+n+G(St(r[l]),function(u){return u+\":\"+r[l][u]+\";\"}).join(a)+i}).join(a),s=G(St(e),function(l){return\"@keyframes \"+l+n+G(St(e[l]),function(u){return u+n+G(St(e[l][u]),function(f){var h=e[l][u][f];return f===\"d\"&&(h='path(\"'+h+'\")'),f+\":\"+h+\";\"}).join(a)+i}).join(a)+i}).join(a);return!o&&!s?\"\":[\"<![CDATA[\",o,s,\"]]>\"].join(a)}function Zp(r){return{zrId:r,shadowCache:{},patternCache:{},gradientCache:{},clipPathCache:{},defs:{},cssNodes:{},cssAnims:{},cssClassIdx:0,cssAnimIdx:0,shadowIdx:0,gradientIdx:0,patternIdx:0,clipPathIdx:0}}function Ox(r,e,t,a){return ne(\"svg\",\"root\",{width:r,height:e,xmlns:GM,\"xmlns:xlink\":HM,version:\"1.1\",baseProfile:\"full\",viewBox:a?\"0 0 \"+r+\" \"+e:!1},t)}var Bx={cubicIn:\"0.32,0,0.67,0\",cubicOut:\"0.33,1,0.68,1\",cubicInOut:\"0.65,0,0.35,1\",quadraticIn:\"0.11,0,0.5,0\",quadraticOut:\"0.5,1,0.89,1\",quadraticInOut:\"0.45,0,0.55,1\",quarticIn:\"0.5,0,0.75,0\",quarticOut:\"0.25,1,0.5,1\",quarticInOut:\"0.76,0,0.24,1\",quinticIn:\"0.64,0,0.78,0\",quinticOut:\"0.22,1,0.36,1\",quinticInOut:\"0.83,0,0.17,1\",sinusoidalIn:\"0.12,0,0.39,0\",sinusoidalOut:\"0.61,1,0.88,1\",sinusoidalInOut:\"0.37,0,0.63,1\",exponentialIn:\"0.7,0,0.84,0\",exponentialOut:\"0.16,1,0.3,1\",exponentialInOut:\"0.87,0,0.13,1\",circularIn:\"0.55,0,1,0.45\",circularOut:\"0,0.55,0.45,1\",circularInOut:\"0.85,0,0.15,1\"},Wn=\"transform-origin\";function HW(r,e,t){var a=V({},r.shape);V(a,e),r.buildPath(t,a);var n=new FM;return n.reset(u2(r)),t.rebuildPath(n,1),n.generateStr(),n.getStr()}function WW(r,e){var t=e.originX,a=e.originY;(t||a)&&(r[Wn]=t+\"px \"+a+\"px\")}var $W={fill:\"fill\",opacity:\"opacity\",lineWidth:\"stroke-width\",lineDashOffset:\"stroke-dashoffset\"};function $M(r,e){var t=e.zrId+\"-ani-\"+e.cssAnimIdx++;return e.cssAnims[t]=r,t}function UW(r,e,t){var a=r.shape.paths,n={},i,o;if(A(a,function(l){var u=Zp(t.zrId);u.animation=!0,Kh(l,{},u,!0);var f=u.cssAnims,h=u.cssNodes,v=St(f),c=v.length;if(!!c){o=v[c-1];var d=f[o];for(var p in d){var g=d[p];n[p]=n[p]||{d:\"\"},n[p].d+=g.d||\"\"}for(var y in h){var m=h[y].animation;m.indexOf(o)>=0&&(i=m)}}}),!!i){e.d=!1;var s=$M(n,t);return i.replace(o,s)}}function Nx(r){return U(r)?Bx[r]?\"cubic-bezier(\"+Bx[r]+\")\":Tg(r)?r:\"\":\"\"}function Kh(r,e,t,a){var n=r.animators,i=n.length,o=[];if(r instanceof Hg){var s=UW(r,e,t);if(s)o.push(s);else if(!i)return}else if(!i)return;for(var l={},u=0;u<i;u++){var f=n[u],h=[f.getMaxTime()/1e3+\"s\"],v=Nx(f.getClip().easing),c=f.getDelay();v?h.push(v):h.push(\"linear\"),c&&h.push(c/1e3+\"s\"),f.getLoop()&&h.push(\"infinite\");var d=h.join(\" \");l[d]=l[d]||[d,[]],l[d][1].push(f)}function p(m){var _=m[1],S=_.length,w={},x={},b={},C=\"animation-timing-function\";function T(rt,yt,st){for(var K=rt.getTracks(),lt=rt.getMaxTime(),Gt=0;Gt<K.length;Gt++){var wt=K[Gt];if(wt.needsAnimate()){var Yt=wt.keyframes,Wt=wt.propName;if(st&&(Wt=st(Wt)),Wt)for(var ge=0;ge<Yt.length;ge++){var ea=Yt[ge],Ie=Math.round(ea.time/lt*100)+\"%\",Gl=Nx(ea.easing),Da=ea.rawValue;(U(Da)||Mt(Da))&&(yt[Ie]=yt[Ie]||{},yt[Ie][Wt]=ea.rawValue,Gl&&(yt[Ie][C]=Gl))}}}}for(var D=0;D<S;D++){var M=_[D],L=M.targetName;L?L===\"shape\"&&T(M,x):!a&&T(M,w)}for(var I in w){var P={};d2(P,r),V(P,w[I]);var R=f2(P),E=w[I][C];b[I]=R?{transform:R}:{},WW(b[I],P),E&&(b[I][C]=E)}var B,O=!0;for(var I in x){b[I]=b[I]||{};var z=!B,E=x[I][C];z&&(B=new Jr);var H=B.len();B.reset(),b[I].d=HW(r,x[I],B);var $=B.len();if(!z&&H!==$){O=!1;break}E&&(b[I][C]=E)}if(!O)for(var I in b)delete b[I].d;if(!a)for(var D=0;D<S;D++){var M=_[D],L=M.targetName;L===\"style\"&&T(M,b,function(K){return $W[K]})}for(var X=St(b),Q=!0,j,D=1;D<X.length;D++){var pt=X[D-1],xt=X[D];if(b[pt][Wn]!==b[xt][Wn]){Q=!1;break}j=b[pt][Wn]}if(Q&&j){for(var I in b)b[I][Wn]&&delete b[I][Wn];e[Wn]=j}if(Et(X,function(rt){return St(b[rt]).length>0}).length){var gt=$M(b,t);return gt+\" \"+m[0]+\" both\"}}for(var g in l){var s=p(l[g]);s&&o.push(s)}if(o.length){var y=t.zrId+\"-cls-\"+t.cssClassIdx++;t.cssNodes[\".\"+y]={animation:o.join(\",\")},e.class=y}}var vl=Math.round;function UM(r){return r&&U(r.src)}function YM(r){return r&&J(r.toDataURL)}function rm(r,e,t,a){BW(function(n,i){var o=n===\"fill\"||n===\"stroke\";o&&l2(i)?XM(e,r,n,a):o&&Ag(i)?qM(t,r,n,a):r[n]=i},e,t,!1),QW(t,r,a)}function Vx(r){return Ya(r[0]-1)&&Ya(r[1])&&Ya(r[2])&&Ya(r[3]-1)}function YW(r){return Ya(r[4])&&Ya(r[5])}function am(r,e,t){if(e&&!(YW(e)&&Vx(e))){var a=t?10:1e4;r.transform=Vx(e)?\"translate(\"+vl(e[4]*a)/a+\" \"+vl(e[5]*a)/a+\")\":TE(e)}}function zx(r,e,t){for(var a=r.points,n=[],i=0;i<a.length;i++)n.push(vl(a[i][0]*t)/t),n.push(vl(a[i][1]*t)/t);e.points=n.join(\" \")}function Fx(r){return!r.smooth}function ZW(r){var e=G(r,function(t){return typeof t==\"string\"?[t,t]:t});return function(t,a,n){for(var i=0;i<e.length;i++){var o=e[i],s=t[o[0]];s!=null&&(a[o[1]]=vl(s*n)/n)}}}var XW={circle:[ZW([\"cx\",\"cy\",\"r\"])],polyline:[zx,Fx],polygon:[zx,Fx]};function qW(r){for(var e=r.animators,t=0;t<e.length;t++)if(e[t].targetName===\"shape\")return!0;return!1}function ZM(r,e){var t=r.style,a=r.shape,n=XW[r.type],i={},o=e.animation,s=\"path\",l=r.style.strokePercent,u=e.compress&&u2(r)||4;if(n&&!e.willUpdate&&!(n[1]&&!n[1](a))&&!(o&&qW(r))&&!(l<1)){s=r.type;var f=Math.pow(10,u);n[0](a,i,f)}else{var h=!r.path||r.shapeChanged();r.path||r.createPathProxy();var v=r.path;h&&(v.beginPath(),r.buildPath(v,r.shape),r.pathUpdated());var c=v.getVersion(),d=r,p=d.__svgPathBuilder;(d.__svgPathVersion!==c||!p||l!==d.__svgPathStrokePercent)&&(p||(p=d.__svgPathBuilder=new FM),p.reset(u),v.rebuildPath(p,l),p.generateStr(),d.__svgPathVersion=c,d.__svgPathStrokePercent=l),i.d=p.getStr()}return am(i,r.transform),rm(i,t,r,e),e.animation&&Kh(r,i,e),ne(s,r.id+\"\",i)}function KW(r,e){var t=r.style,a=t.image;if(a&&!U(a)&&(UM(a)?a=a.src:YM(a)&&(a=a.toDataURL())),!!a){var n=t.x||0,i=t.y||0,o=t.width,s=t.height,l={href:a,width:o,height:s};return n&&(l.x=n),i&&(l.y=i),am(l,r.transform),rm(l,t,r,e),e.animation&&Kh(r,l,e),ne(\"image\",r.id+\"\",l)}}function JW(r,e){var t=r.style,a=t.text;if(a!=null&&(a+=\"\"),!(!a||isNaN(t.x)||isNaN(t.y))){var n=t.font||tn,i=t.x||0,o=DE(t.y||0,yh(n),t.textBaseline),s=AE[t.textAlign]||t.textAlign,l={\"dominant-baseline\":\"central\",\"text-anchor\":s};if(Z2(t)){var u=\"\",f=t.fontStyle,h=Y2(t.fontSize);if(!parseFloat(h))return;var v=t.fontFamily||Nb,c=t.fontWeight;u+=\"font-size:\"+h+\";font-family:\"+v+\";\",f&&f!==\"normal\"&&(u+=\"font-style:\"+f+\";\"),c&&c!==\"normal\"&&(u+=\"font-weight:\"+c+\";\"),l.style=u}else l.style=\"font: \"+n;return a.match(/\\s/)&&(l[\"xml:space\"]=\"preserve\"),i&&(l.x=i),o&&(l.y=o),am(l,r.transform),rm(l,t,r,e),e.animation&&Kh(r,l,e),ne(\"text\",r.id+\"\",l,void 0,a)}}function Gx(r,e){if(r instanceof mt)return ZM(r,e);if(r instanceof pe)return KW(r,e);if(r instanceof Xs)return JW(r,e)}function QW(r,e,t){var a=r.style;if(ME(a)){var n=LE(r),i=t.shadowCache,o=i[n];if(!o){var s=r.getGlobalScale(),l=s[0],u=s[1];if(!l||!u)return;var f=a.shadowOffsetX||0,h=a.shadowOffsetY||0,v=a.shadowBlur,c=Ys(a.shadowColor),d=c.opacity,p=c.color,g=v/2/l,y=v/2/u,m=g+\" \"+y;o=t.zrId+\"-s\"+t.shadowIdx++,t.defs[o]=ne(\"filter\",o,{id:o,x:\"-100%\",y:\"-100%\",width:\"300%\",height:\"300%\"},[ne(\"feDropShadow\",\"\",{dx:f/l,dy:h/u,stdDeviation:m,\"flood-color\":p,\"flood-opacity\":d})]),i[n]=o}e.filter=gh(o)}}function XM(r,e,t,a){var n=r[t],i,o={gradientUnits:n.global?\"userSpaceOnUse\":\"objectBoundingBox\"};if(o2(n))i=\"linearGradient\",o.x1=n.x,o.y1=n.y,o.x2=n.x2,o.y2=n.y2;else if(s2(n))i=\"radialGradient\",o.cx=ft(n.x,.5),o.cy=ft(n.y,.5),o.r=ft(n.r,.5);else return;for(var s=n.colorStops,l=[],u=0,f=s.length;u<f;++u){var h=zd(s[u].offset)*100+\"%\",v=s[u].color,c=Ys(v),d=c.color,p=c.opacity,g={offset:h};g[\"stop-color\"]=d,p<1&&(g[\"stop-opacity\"]=p),l.push(ne(\"stop\",u+\"\",g))}var y=ne(i,\"\",o,l),m=em(y),_=a.gradientCache,S=_[m];S||(S=a.zrId+\"-g\"+a.gradientIdx++,_[m]=S,o.id=S,a.defs[S]=ne(i,S,o,l)),e[t]=gh(S)}function qM(r,e,t,a){var n=r.style[t],i=r.getBoundingRect(),o={},s=n.repeat,l=s===\"no-repeat\",u=s===\"repeat-x\",f=s===\"repeat-y\",h;if(i2(n)){var v=n.imageWidth,c=n.imageHeight,d=void 0,p=n.image;if(U(p)?d=p:UM(p)?d=p.src:YM(p)&&(d=p.toDataURL()),typeof Image==\"undefined\"){var g=\"Image width/height must been given explictly in svg-ssr renderer.\";Me(v,g),Me(c,g)}else if(v==null||c==null){var y=function(D,M){if(D){var L=D.elm,I=v||M.width,P=c||M.height;D.tag===\"pattern\"&&(u?(P=1,I/=i.width):f&&(I=1,P/=i.height)),D.attrs.width=I,D.attrs.height=P,L&&(L.setAttribute(\"width\",I),L.setAttribute(\"height\",P))}},m=Eg(d,null,r,function(D){l||y(x,D),y(h,D)});m&&m.width&&m.height&&(v=v||m.width,c=c||m.height)}h=ne(\"image\",\"img\",{href:d,width:v,height:c}),o.width=v,o.height=c}else n.svgElement&&(h=at(n.svgElement),o.width=n.svgWidth,o.height=n.svgHeight);if(!!h){var _,S;l?_=S=1:u?(S=1,_=o.width/i.width):f?(_=1,S=o.height/i.height):o.patternUnits=\"userSpaceOnUse\",_!=null&&!isNaN(_)&&(o.width=_),S!=null&&!isNaN(S)&&(o.height=S);var w=f2(n);w&&(o.patternTransform=w);var x=ne(\"pattern\",\"\",o,[h]),b=em(x),C=a.patternCache,T=C[b];T||(T=a.zrId+\"-p\"+a.patternIdx++,C[b]=T,o.id=T,x=a.defs[T]=ne(\"pattern\",T,o,[h])),e[t]=gh(T)}}function jW(r,e,t){var a=t.clipPathCache,n=t.defs,i=a[r.id];if(!i){i=t.zrId+\"-c\"+t.clipPathIdx++;var o={id:i};a[r.id]=i,n[i]=ne(\"clipPath\",i,o,[ZM(r,t)])}e[\"clip-path\"]=gh(i)}function Hx(r){return document.createTextNode(r)}function Yn(r,e,t){r.insertBefore(e,t)}function Wx(r,e){r.removeChild(e)}function $x(r,e){r.appendChild(e)}function KM(r){return r.parentNode}function JM(r){return r.nextSibling}function jc(r,e){r.textContent=e}var Ux=58,t$=120,e$=ne(\"\",\"\");function Xp(r){return r===void 0}function Br(r){return r!==void 0}function r$(r,e,t){for(var a={},n=e;n<=t;++n){var i=r[n].key;i!==void 0&&(a[i]=n)}return a}function Cs(r,e){var t=r.key===e.key,a=r.tag===e.tag;return a&&t}function cl(r){var e,t=r.children,a=r.tag;if(Br(a)){var n=r.elm=WM(a);if(nm(e$,r),F(t))for(e=0;e<t.length;++e){var i=t[e];i!=null&&$x(n,cl(i))}else Br(r.text)&&!et(r.text)&&$x(n,Hx(r.text))}else r.elm=Hx(r.text);return r.elm}function QM(r,e,t,a,n){for(;a<=n;++a){var i=t[a];i!=null&&Yn(r,cl(i),e)}}function eh(r,e,t,a){for(;t<=a;++t){var n=e[t];if(n!=null)if(Br(n.tag)){var i=KM(n.elm);Wx(i,n.elm)}else Wx(r,n.elm)}}function nm(r,e){var t,a=e.elm,n=r&&r.attrs||{},i=e.attrs||{};if(n!==i){for(t in i){var o=i[t],s=n[t];s!==o&&(o===!0?a.setAttribute(t,\"\"):o===!1?a.removeAttribute(t):t.charCodeAt(0)!==t$?a.setAttribute(t,o):t===\"xmlns:xlink\"||t===\"xmlns\"?a.setAttributeNS(NW,t,o):t.charCodeAt(3)===Ux?a.setAttributeNS(VW,t,o):t.charCodeAt(5)===Ux?a.setAttributeNS(HM,t,o):a.setAttribute(t,o))}for(t in n)t in i||a.removeAttribute(t)}}function a$(r,e,t){for(var a=0,n=0,i=e.length-1,o=e[0],s=e[i],l=t.length-1,u=t[0],f=t[l],h,v,c,d;a<=i&&n<=l;)o==null?o=e[++a]:s==null?s=e[--i]:u==null?u=t[++n]:f==null?f=t[--l]:Cs(o,u)?(ji(o,u),o=e[++a],u=t[++n]):Cs(s,f)?(ji(s,f),s=e[--i],f=t[--l]):Cs(o,f)?(ji(o,f),Yn(r,o.elm,JM(s.elm)),o=e[++a],f=t[--l]):Cs(s,u)?(ji(s,u),Yn(r,s.elm,o.elm),s=e[--i],u=t[++n]):(Xp(h)&&(h=r$(e,a,i)),v=h[u.key],Xp(v)?Yn(r,cl(u),o.elm):(c=e[v],c.tag!==u.tag?Yn(r,cl(u),o.elm):(ji(c,u),e[v]=void 0,Yn(r,c.elm,o.elm))),u=t[++n]);(a<=i||n<=l)&&(a>i?(d=t[l+1]==null?null:t[l+1].elm,QM(r,d,t,n,l)):eh(r,e,a,i))}function ji(r,e){var t=e.elm=r.elm,a=r.children,n=e.children;r!==e&&(nm(r,e),Xp(e.text)?Br(a)&&Br(n)?a!==n&&a$(t,a,n):Br(n)?(Br(r.text)&&jc(t,\"\"),QM(t,null,n,0,n.length-1)):Br(a)?eh(t,a,0,a.length-1):Br(r.text)&&jc(t,\"\"):r.text!==e.text&&(Br(a)&&eh(t,a,0,a.length-1),jc(t,e.text)))}function n$(r,e){if(Cs(r,e))ji(r,e);else{var t=r.elm,a=KM(t);cl(e),a!==null&&(Yn(a,e.elm,JM(t)),eh(a,[r],0,0))}return e}var i$=0,o$=function(){function r(e,t,a){if(this.type=\"svg\",this.refreshHover=Yx(),this.configLayer=Yx(),this.storage=t,this._opts=a=V({},a),this.root=e,this._id=\"zr\"+i$++,this._oldVNode=Ox(a.width,a.height),e&&!a.ssr){var n=this._viewport=document.createElement(\"div\");n.style.cssText=\"position:relative;overflow:hidden\";var i=this._svgDom=this._oldVNode.elm=WM(\"svg\");nm(null,this._oldVNode),n.appendChild(i),e.appendChild(n)}this.resize(a.width,a.height)}return r.prototype.getType=function(){return this.type},r.prototype.getViewportRoot=function(){return this._viewport},r.prototype.getViewportRootOffset=function(){var e=this.getViewportRoot();if(e)return{offsetLeft:e.offsetLeft||0,offsetTop:e.offsetTop||0}},r.prototype.getSvgDom=function(){return this._svgDom},r.prototype.refresh=function(){if(this.root){var e=this.renderToVNode({willUpdate:!0});e.attrs.style=\"position:absolute;left:0;top:0;user-select:none\",n$(this._oldVNode,e),this._oldVNode=e}},r.prototype.renderOneToVNode=function(e){return Gx(e,Zp(this._id))},r.prototype.renderToVNode=function(e){e=e||{};var t=this.storage.getDisplayList(!0),a=this._width,n=this._height,i=Zp(this._id);i.animation=e.animation,i.willUpdate=e.willUpdate,i.compress=e.compress;var o=[],s=this._bgVNode=s$(a,n,this._backgroundColor,i);s&&o.push(s);var l=e.compress?null:this._mainVNode=ne(\"g\",\"main\",{},[]);this._paintList(t,i,l?l.children:o),l&&o.push(l);var u=G(St(i.defs),function(v){return i.defs[v]});if(u.length&&o.push(ne(\"defs\",\"defs\",{},u)),e.animation){var f=GW(i.cssNodes,i.cssAnims,{newline:!0});if(f){var h=ne(\"style\",\"stl\",{},[],f);o.push(h)}}return Ox(a,n,o,e.useViewBox)},r.prototype.renderToString=function(e){return e=e||{},em(this.renderToVNode({animation:ft(e.cssAnimation,!0),willUpdate:!1,compress:!0,useViewBox:ft(e.useViewBox,!0)}),{newline:!0})},r.prototype.setBackgroundColor=function(e){this._backgroundColor=e},r.prototype.getSvgRoot=function(){return this._mainVNode&&this._mainVNode.elm},r.prototype._paintList=function(e,t,a){for(var n=e.length,i=[],o=0,s,l,u=0,f=0;f<n;f++){var h=e[f];if(!h.invisible){var v=h.__clipPaths,c=v&&v.length||0,d=l&&l.length||0,p=void 0;for(p=Math.max(c-1,d-1);p>=0&&!(v&&l&&v[p]===l[p]);p--);for(var g=d-1;g>p;g--)o--,s=i[o-1];for(var y=p+1;y<c;y++){var m={};jW(v[y],m,t);var _=ne(\"g\",\"clip-g-\"+u++,m,[]);(s?s.children:a).push(_),i[o++]=_,s=_}l=v;var S=Gx(h,t);S&&(s?s.children:a).push(S)}}},r.prototype.resize=function(e,t){var a=this._opts,n=this.root,i=this._viewport;if(e!=null&&(a.width=e),t!=null&&(a.height=t),n&&i&&(i.style.display=\"none\",e=no(n,0,a),t=no(n,1,a),i.style.display=\"\"),this._width!==e||this._height!==t){if(this._width=e,this._height=t,i){var o=i.style;o.width=e+\"px\",o.height=t+\"px\"}if(Ag(this._backgroundColor))this.refresh();else{var s=this._svgDom;s&&(s.setAttribute(\"width\",e),s.setAttribute(\"height\",t));var l=this._bgVNode&&this._bgVNode.elm;l&&(l.setAttribute(\"width\",e),l.setAttribute(\"height\",t))}}},r.prototype.getWidth=function(){return this._width},r.prototype.getHeight=function(){return this._height},r.prototype.dispose=function(){this.root&&(this.root.innerHTML=\"\"),this._svgDom=this._viewport=this.storage=this._oldVNode=this._bgVNode=this._mainVNode=null},r.prototype.clear=function(){this._svgDom&&(this._svgDom.innerHTML=null),this._oldVNode=null},r.prototype.toDataURL=function(e){var t=this.renderToString(),a=\"data:image/svg+xml;\";return e?(t=PE(t),t&&a+\"base64,\"+t):a+\"charset=UTF-8,\"+encodeURIComponent(t)},r}();function Yx(r){return function(){}}function s$(r,e,t,a){var n;if(t&&t!==\"none\")if(n=ne(\"rect\",\"bg\",{width:r,height:e,x:\"0\",y:\"0\",id:\"0\"}),l2(t))XM({fill:t},n.attrs,\"fill\",a);else if(Ag(t))qM({style:{fill:t},dirty:Kt,getBoundingRect:function(){return{width:r,height:e}}},n.attrs,\"fill\",a);else{var i=Ys(t),o=i.color,s=i.opacity;n.attrs.fill=o,s<1&&(n.attrs[\"fill-opacity\"]=s)}return n}var l$=o$;function u$(r){r.registerPainter(\"svg\",l$)}function Zx(r,e,t){var a=ga.createCanvas(),n=e.getWidth(),i=e.getHeight(),o=a.style;return o&&(o.position=\"absolute\",o.left=\"0\",o.top=\"0\",o.width=n+\"px\",o.height=i+\"px\",a.setAttribute(\"data-zr-dom-id\",r)),a.width=n*t,a.height=i*t,a}var f$=function(r){k(e,r);function e(t,a,n){var i=r.call(this)||this;i.motionBlur=!1,i.lastFrameAlpha=.7,i.dpr=1,i.virtual=!1,i.config={},i.incremental=!1,i.zlevel=0,i.maxRepaintRectCount=5,i.__dirty=!0,i.__firstTimePaint=!0,i.__used=!1,i.__drawIndex=0,i.__startIndex=0,i.__endIndex=0,i.__prevStartIndex=null,i.__prevEndIndex=null;var o;n=n||wf,typeof t==\"string\"?o=Zx(t,a,n):et(t)&&(o=t,t=o.id),i.id=t,i.dom=o;var s=o.style;return s&&(Wb(o),o.onselectstart=function(){return!1},s.padding=\"0\",s.margin=\"0\",s.borderWidth=\"0\"),i.painter=a,i.dpr=n,i}return e.prototype.getElementCount=function(){return this.__endIndex-this.__startIndex},e.prototype.afterBrush=function(){this.__prevStartIndex=this.__startIndex,this.__prevEndIndex=this.__endIndex},e.prototype.initContext=function(){this.ctx=this.dom.getContext(\"2d\"),this.ctx.dpr=this.dpr},e.prototype.setUnpainted=function(){this.__firstTimePaint=!0},e.prototype.createBackBuffer=function(){var t=this.dpr;this.domBack=Zx(\"back-\"+this.id,this.painter,t),this.ctxBack=this.domBack.getContext(\"2d\"),t!==1&&this.ctxBack.scale(t,t)},e.prototype.createRepaintRects=function(t,a,n,i){if(this.__firstTimePaint)return this.__firstTimePaint=!1,null;var o=[],s=this.maxRepaintRectCount,l=!1,u=new vt(0,0,0,0);function f(m){if(!(!m.isFinite()||m.isZero()))if(o.length===0){var _=new vt(0,0,0,0);_.copy(m),o.push(_)}else{for(var S=!1,w=1/0,x=0,b=0;b<o.length;++b){var C=o[b];if(C.intersect(m)){var T=new vt(0,0,0,0);T.copy(C),T.union(m),o[b]=T,S=!0;break}else if(l){u.copy(m),u.union(C);var D=m.width*m.height,M=C.width*C.height,L=u.width*u.height,I=L-D-M;I<w&&(w=I,x=b)}}if(l&&(o[x].union(m),S=!0),!S){var _=new vt(0,0,0,0);_.copy(m),o.push(_)}l||(l=o.length>=s)}}for(var h=this.__startIndex;h<this.__endIndex;++h){var v=t[h];if(v){var c=v.shouldBePainted(n,i,!0,!0),d=v.__isRendered&&(v.__dirty&He||!c)?v.getPrevPaintRect():null;d&&f(d);var p=c&&(v.__dirty&He||!v.__isRendered)?v.getPaintRect():null;p&&f(p)}}for(var h=this.__prevStartIndex;h<this.__prevEndIndex;++h){var v=a[h],c=v.shouldBePainted(n,i,!0,!0);if(v&&(!c||!v.__zr)&&v.__isRendered){var d=v.getPrevPaintRect();d&&f(d)}}var g;do{g=!1;for(var h=0;h<o.length;){if(o[h].isZero()){o.splice(h,1);continue}for(var y=h+1;y<o.length;)o[h].intersect(o[y])?(g=!0,o[h].union(o[y]),o.splice(y,1)):y++;h++}}while(g);return this._paintRects=o,o},e.prototype.debugGetPaintRects=function(){return(this._paintRects||[]).slice()},e.prototype.resize=function(t,a){var n=this.dpr,i=this.dom,o=i.style,s=this.domBack;o&&(o.width=t+\"px\",o.height=a+\"px\"),i.width=t*n,i.height=a*n,s&&(s.width=t*n,s.height=a*n,n!==1&&this.ctxBack.scale(n,n))},e.prototype.clear=function(t,a,n){var i=this.dom,o=this.ctx,s=i.width,l=i.height;a=a||this.clearColor;var u=this.motionBlur&&!t,f=this.lastFrameAlpha,h=this.dpr,v=this;u&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation=\"copy\",this.ctxBack.drawImage(i,0,0,s/h,l/h));var c=this.domBack;function d(p,g,y,m){if(o.clearRect(p,g,y,m),a&&a!==\"transparent\"){var _=void 0;if(ch(a)){var S=a.global||a.__width===y&&a.__height===m;_=S&&a.__canvasGradient||gp(o,a,{x:0,y:0,width:y,height:m}),a.__canvasGradient=_,a.__width=y,a.__height=m}else PR(a)&&(a.scaleX=a.scaleX||h,a.scaleY=a.scaleY||h,_=yp(o,a,{dirty:function(){v.setUnpainted(),v.__painter.refresh()}}));o.save(),o.fillStyle=_||a,o.fillRect(p,g,y,m),o.restore()}u&&(o.save(),o.globalAlpha=f,o.drawImage(c,p,g,y,m),o.restore())}!n||u?d(0,0,s,l):n.length&&A(n,function(p){d(p.x*h,p.y*h,p.width*h,p.height*h)})},e}(hr),td=f$,Xx=1e5,Nn=314159,Ou=.01,h$=.001;function v$(r){return r?r.__builtin__?!0:!(typeof r.resize!=\"function\"||typeof r.refresh!=\"function\"):!1}function c$(r,e){var t=document.createElement(\"div\");return t.style.cssText=[\"position:relative\",\"width:\"+r+\"px\",\"height:\"+e+\"px\",\"padding:0\",\"margin:0\",\"border-width:0\"].join(\";\")+\";\",t}var d$=function(){function r(e,t,a,n){this.type=\"canvas\",this._zlevelList=[],this._prevDisplayList=[],this._layers={},this._layerConfig={},this._needsManuallyCompositing=!1,this.type=\"canvas\";var i=!e.nodeName||e.nodeName.toUpperCase()===\"CANVAS\";this._opts=a=V({},a||{}),this.dpr=a.devicePixelRatio||wf,this._singleCanvas=i,this.root=e;var o=e.style;o&&(Wb(e),e.innerHTML=\"\"),this.storage=t;var s=this._zlevelList;this._prevDisplayList=[];var l=this._layers;if(i){var f=e,h=f.width,v=f.height;a.width!=null&&(h=a.width),a.height!=null&&(v=a.height),this.dpr=a.devicePixelRatio||1,f.width=h*this.dpr,f.height=v*this.dpr,this._width=h,this._height=v;var c=new td(f,this,this.dpr);c.__builtin__=!0,c.initContext(),l[Nn]=c,c.zlevel=Nn,s.push(Nn),this._domRoot=e}else{this._width=no(e,0,a),this._height=no(e,1,a);var u=this._domRoot=c$(this._width,this._height);e.appendChild(u)}}return r.prototype.getType=function(){return\"canvas\"},r.prototype.isSingleCanvas=function(){return this._singleCanvas},r.prototype.getViewportRoot=function(){return this._domRoot},r.prototype.getViewportRootOffset=function(){var e=this.getViewportRoot();if(e)return{offsetLeft:e.offsetLeft||0,offsetTop:e.offsetTop||0}},r.prototype.refresh=function(e){var t=this.storage.getDisplayList(!0),a=this._prevDisplayList,n=this._zlevelList;this._redrawId=Math.random(),this._paintList(t,a,e,this._redrawId);for(var i=0;i<n.length;i++){var o=n[i],s=this._layers[o];if(!s.__builtin__&&s.refresh){var l=i===0?this._backgroundColor:null;s.refresh(l)}}return this._opts.useDirtyRect&&(this._prevDisplayList=t.slice()),this},r.prototype.refreshHover=function(){this._paintHoverList(this.storage.getDisplayList(!1))},r.prototype._paintHoverList=function(e){var t=e.length,a=this._hoverlayer;if(a&&a.clear(),!!t){for(var n={inHover:!0,viewWidth:this._width,viewHeight:this._height},i,o=0;o<t;o++){var s=e[o];s.__inHover&&(a||(a=this._hoverlayer=this.getLayer(Xx)),i||(i=a.ctx,i.save()),ei(i,s,n,o===t-1))}i&&i.restore()}},r.prototype.getHoverLayer=function(){return this.getLayer(Xx)},r.prototype.paintOne=function(e,t){FT(e,t)},r.prototype._paintList=function(e,t,a,n){if(this._redrawId===n){a=a||!1,this._updateLayerStatus(e);var i=this._doPaintList(e,t,a),o=i.finished,s=i.needsRefreshHover;if(this._needsManuallyCompositing&&this._compositeManually(),s&&this._paintHoverList(e),o)this.eachLayer(function(u){u.afterBrush&&u.afterBrush()});else{var l=this;kd(function(){l._paintList(e,t,a,n)})}}},r.prototype._compositeManually=function(){var e=this.getLayer(Nn).ctx,t=this._domRoot.width,a=this._domRoot.height;e.clearRect(0,0,t,a),this.eachBuiltinLayer(function(n){n.virtual&&e.drawImage(n.dom,0,0,t,a)})},r.prototype._doPaintList=function(e,t,a){for(var n=this,i=[],o=this._opts.useDirtyRect,s=0;s<this._zlevelList.length;s++){var l=this._zlevelList[s],u=this._layers[l];u.__builtin__&&u!==this._hoverlayer&&(u.__dirty||a)&&i.push(u)}for(var f=!0,h=!1,v=function(p){var g=i[p],y=g.ctx,m=o&&g.createRepaintRects(e,t,c._width,c._height),_=a?g.__startIndex:g.__drawIndex,S=!a&&g.incremental&&Date.now,w=S&&Date.now(),x=g.zlevel===c._zlevelList[0]?c._backgroundColor:null;if(g.__startIndex===g.__endIndex)g.clear(!1,x,m);else if(_===g.__startIndex){var b=e[_];(!b.incremental||!b.notClear||a)&&g.clear(!1,x,m)}_===-1&&(console.error(\"For some unknown reason. drawIndex is -1\"),_=g.__startIndex);var C,T=function(I){var P={inHover:!1,allClipped:!1,prevEl:null,viewWidth:n._width,viewHeight:n._height};for(C=_;C<g.__endIndex;C++){var R=e[C];if(R.__inHover&&(h=!0),n._doPaintEl(R,g,o,I,P,C===g.__endIndex-1),S){var E=Date.now()-w;if(E>15)break}}P.prevElClipPaths&&y.restore()};if(m)if(m.length===0)C=g.__endIndex;else for(var D=c.dpr,M=0;M<m.length;++M){var L=m[M];y.save(),y.beginPath(),y.rect(L.x*D,L.y*D,L.width*D,L.height*D),y.clip(),T(L),y.restore()}else y.save(),T(),y.restore();g.__drawIndex=C,g.__drawIndex<g.__endIndex&&(f=!1)},c=this,d=0;d<i.length;d++)v(d);return At.wxa&&A(this._layers,function(p){p&&p.ctx&&p.ctx.draw&&p.ctx.draw()}),{finished:f,needsRefreshHover:h}},r.prototype._doPaintEl=function(e,t,a,n,i,o){var s=t.ctx;if(a){var l=e.getPaintRect();(!n||l&&l.intersect(n))&&(ei(s,e,i,o),e.setPrevPaintRect(l))}else ei(s,e,i,o)},r.prototype.getLayer=function(e,t){this._singleCanvas&&!this._needsManuallyCompositing&&(e=Nn);var a=this._layers[e];return a||(a=new td(\"zr_\"+e,this,this.dpr),a.zlevel=e,a.__builtin__=!0,this._layerConfig[e]?ht(a,this._layerConfig[e],!0):this._layerConfig[e-Ou]&&ht(a,this._layerConfig[e-Ou],!0),t&&(a.virtual=t),this.insertLayer(e,a),a.initContext()),a},r.prototype.insertLayer=function(e,t){var a=this._layers,n=this._zlevelList,i=n.length,o=this._domRoot,s=null,l=-1;if(!a[e]&&!!v$(t)){if(i>0&&e>n[0]){for(l=0;l<i-1&&!(n[l]<e&&n[l+1]>e);l++);s=a[n[l]]}if(n.splice(l+1,0,e),a[e]=t,!t.virtual)if(s){var u=s.dom;u.nextSibling?o.insertBefore(t.dom,u.nextSibling):o.appendChild(t.dom)}else o.firstChild?o.insertBefore(t.dom,o.firstChild):o.appendChild(t.dom);t.__painter=this}},r.prototype.eachLayer=function(e,t){for(var a=this._zlevelList,n=0;n<a.length;n++){var i=a[n];e.call(t,this._layers[i],i)}},r.prototype.eachBuiltinLayer=function(e,t){for(var a=this._zlevelList,n=0;n<a.length;n++){var i=a[n],o=this._layers[i];o.__builtin__&&e.call(t,o,i)}},r.prototype.eachOtherLayer=function(e,t){for(var a=this._zlevelList,n=0;n<a.length;n++){var i=a[n],o=this._layers[i];o.__builtin__||e.call(t,o,i)}},r.prototype.getLayers=function(){return this._layers},r.prototype._updateLayerStatus=function(e){this.eachBuiltinLayer(function(h,v){h.__dirty=h.__used=!1});function t(h){i&&(i.__endIndex!==h&&(i.__dirty=!0),i.__endIndex=h)}if(this._singleCanvas)for(var a=1;a<e.length;a++){var n=e[a];if(n.zlevel!==e[a-1].zlevel||n.incremental){this._needsManuallyCompositing=!0;break}}var i=null,o=0,s,l;for(l=0;l<e.length;l++){var n=e[l],u=n.zlevel,f=void 0;s!==u&&(s=u,o=0),n.incremental?(f=this.getLayer(u+h$,this._needsManuallyCompositing),f.incremental=!0,o=1):f=this.getLayer(u+(o>0?Ou:0),this._needsManuallyCompositing),f.__builtin__||mg(\"ZLevel \"+u+\" has been used by unkown layer \"+f.id),f!==i&&(f.__used=!0,f.__startIndex!==l&&(f.__dirty=!0),f.__startIndex=l,f.incremental?f.__drawIndex=-1:f.__drawIndex=l,t(l),i=f),n.__dirty&He&&!n.__inHover&&(f.__dirty=!0,f.incremental&&f.__drawIndex<0&&(f.__drawIndex=l))}t(l),this.eachBuiltinLayer(function(h,v){!h.__used&&h.getElementCount()>0&&(h.__dirty=!0,h.__startIndex=h.__endIndex=h.__drawIndex=0),h.__dirty&&h.__drawIndex<0&&(h.__drawIndex=h.__startIndex)})},r.prototype.clear=function(){return this.eachBuiltinLayer(this._clearLayer),this},r.prototype._clearLayer=function(e){e.clear()},r.prototype.setBackgroundColor=function(e){this._backgroundColor=e,A(this._layers,function(t){t.setUnpainted()})},r.prototype.configLayer=function(e,t){if(t){var a=this._layerConfig;a[e]?ht(a[e],t,!0):a[e]=t;for(var n=0;n<this._zlevelList.length;n++){var i=this._zlevelList[n];if(i===e||i===e+Ou){var o=this._layers[i];ht(o,a[e],!0)}}}},r.prototype.delLayer=function(e){var t=this._layers,a=this._zlevelList,n=t[e];!n||(n.dom.parentNode.removeChild(n.dom),delete t[e],a.splice(dt(a,e),1))},r.prototype.resize=function(e,t){if(this._domRoot.style){var a=this._domRoot;a.style.display=\"none\";var n=this._opts,i=this.root;if(e!=null&&(n.width=e),t!=null&&(n.height=t),e=no(i,0,n),t=no(i,1,n),a.style.display=\"\",this._width!==e||t!==this._height){a.style.width=e+\"px\",a.style.height=t+\"px\";for(var o in this._layers)this._layers.hasOwnProperty(o)&&this._layers[o].resize(e,t);this.refresh(!0)}this._width=e,this._height=t}else{if(e==null||t==null)return;this._width=e,this._height=t,this.getLayer(Nn).resize(e,t)}return this},r.prototype.clearLayer=function(e){var t=this._layers[e];t&&t.clear()},r.prototype.dispose=function(){this.root.innerHTML=\"\",this.root=this.storage=this._domRoot=this._layers=null},r.prototype.getRenderedCanvas=function(e){if(e=e||{},this._singleCanvas&&!this._compositeManually)return this._layers[Nn].dom;var t=new td(\"image\",this,e.pixelRatio||this.dpr);t.initContext(),t.clear(!1,e.backgroundColor||this._backgroundColor);var a=t.ctx;if(e.pixelRatio<=this.dpr){this.refresh();var n=t.dom.width,i=t.dom.height;this.eachLayer(function(h){h.__builtin__?a.drawImage(h.dom,0,0,n,i):h.renderToCanvas&&(a.save(),h.renderToCanvas(a),a.restore())})}else for(var o={inHover:!1,viewWidth:this._width,viewHeight:this._height},s=this.storage.getDisplayList(!0),l=0,u=s.length;l<u;l++){var f=s[l];ei(a,f,o,l===u-1)}return t.dom},r.prototype.getWidth=function(){return this._width},r.prototype.getHeight=function(){return this._height},r}(),p$=d$;function im(r){r.registerPainter(\"canvas\",p$)}ct([XD,im]);var Zn=Ct(),qx=at,ed=Y,g$=function(){function r(){this._dragging=!1,this.animationThreshold=15}return r.prototype.render=function(e,t,a,n){var i=t.get(\"value\"),o=t.get(\"status\");if(this._axisModel=e,this._axisPointerModel=t,this._api=a,!(!n&&this._lastValue===i&&this._lastStatus===o)){this._lastValue=i,this._lastStatus=o;var s=this._group,l=this._handle;if(!o||o===\"hide\"){s&&s.hide(),l&&l.hide();return}s&&s.show(),l&&l.show();var u={};this.makeElOption(u,i,e,t,a);var f=u.graphicKey;f!==this._lastGraphicKey&&this.clear(a),this._lastGraphicKey=f;var h=this._moveAnimation=this.determineAnimation(e,t);if(!s)s=this._group=new nt,this.createPointerEl(s,u,e,t),this.createLabelEl(s,u,e,t),a.getZr().add(s);else{var v=ot(Kx,t,h);this.updatePointerEl(s,u,v),this.updateLabelEl(s,u,v,t)}Qx(s,t,!0),this._renderHandle(i)}},r.prototype.remove=function(e){this.clear(e)},r.prototype.dispose=function(e){this.clear(e)},r.prototype.determineAnimation=function(e,t){var a=t.get(\"animation\"),n=e.axis,i=n.type===\"category\",o=t.get(\"snap\");if(!o&&!i)return!1;if(a===\"auto\"||a==null){var s=this.animationThreshold;if(i&&n.getBandWidth()>s)return!0;if(o){var l=Cy(e).seriesDataCount,u=n.getExtent();return Math.abs(u[0]-u[1])/l>s}return!1}return a===!0},r.prototype.makeElOption=function(e,t,a,n,i){},r.prototype.createPointerEl=function(e,t,a,n){var i=t.pointer;if(i){var o=Zn(e).pointerEl=new Dl[i.type](qx(t.pointer));e.add(o)}},r.prototype.createLabelEl=function(e,t,a,n){if(t.label){var i=Zn(e).labelEl=new Dt(qx(t.label));e.add(i),Jx(i,n)}},r.prototype.updatePointerEl=function(e,t,a){var n=Zn(e).pointerEl;n&&t.pointer&&(n.setStyle(t.pointer.style),a(n,{shape:t.pointer.shape}))},r.prototype.updateLabelEl=function(e,t,a,n){var i=Zn(e).labelEl;i&&(i.setStyle(t.label.style),a(i,{x:t.label.x,y:t.label.y}),Jx(i,n))},r.prototype._renderHandle=function(e){if(!(this._dragging||!this.updateHandleTransform)){var t=this._axisPointerModel,a=this._api.getZr(),n=this._handle,i=t.getModel(\"handle\"),o=t.get(\"status\");if(!i.get(\"show\")||!o||o===\"hide\"){n&&a.remove(n),this._handle=null;return}var s;this._handle||(s=!0,n=this._handle=Al(i.get(\"icon\"),{cursor:\"move\",draggable:!0,onmousemove:function(u){ya(u.event)},onmousedown:ed(this._onHandleDragMove,this,0,0),drift:ed(this._onHandleDragMove,this),ondragend:ed(this._onHandleDragEnd,this)}),a.add(n)),Qx(n,t,!1),n.setStyle(i.getItemStyle(null,[\"color\",\"borderColor\",\"borderWidth\",\"opacity\",\"shadowColor\",\"shadowBlur\",\"shadowOffsetX\",\"shadowOffsetY\"]));var l=i.get(\"size\");F(l)||(l=[l,l]),n.scaleX=l[0]/2,n.scaleY=l[1]/2,Oo(this,\"_doDispatchAxisPointer\",i.get(\"throttle\")||0,\"fixRate\"),this._moveHandleToValue(e,s)}},r.prototype._moveHandleToValue=function(e,t){Kx(this._axisPointerModel,!t&&this._moveAnimation,this._handle,rd(this.getHandleTransform(e,this._axisModel,this._axisPointerModel)))},r.prototype._onHandleDragMove=function(e,t){var a=this._handle;if(!!a){this._dragging=!0;var n=this.updateHandleTransform(rd(a),[e,t],this._axisModel,this._axisPointerModel);this._payloadInfo=n,a.stopAnimation(),a.attr(rd(n)),Zn(a).lastProp=null,this._doDispatchAxisPointer()}},r.prototype._doDispatchAxisPointer=function(){var e=this._handle;if(!!e){var t=this._payloadInfo,a=this._axisModel;this._api.dispatchAction({type:\"updateAxisPointer\",x:t.cursorPoint[0],y:t.cursorPoint[1],tooltipOption:t.tooltipOption,axesInfo:[{axisDim:a.axis.dim,axisIndex:a.componentIndex}]})}},r.prototype._onHandleDragEnd=function(){this._dragging=!1;var e=this._handle;if(!!e){var t=this._axisPointerModel.get(\"value\");this._moveHandleToValue(t),this._api.dispatchAction({type:\"hideTip\"})}},r.prototype.clear=function(e){this._lastValue=null,this._lastStatus=null;var t=e.getZr(),a=this._group,n=this._handle;t&&a&&(this._lastGraphicKey=null,a&&t.remove(a),n&&t.remove(n),this._group=null,this._handle=null,this._payloadInfo=null),rl(this,\"_doDispatchAxisPointer\")},r.prototype.doClear=function(){},r.prototype.buildLabel=function(e,t,a){return a=a||0,{x:e[a],y:e[1-a],width:t[a],height:t[1-a]}},r}();function Kx(r,e,t,a){jM(Zn(t).lastProp,a)||(Zn(t).lastProp=a,e?Lt(t,a,r):(t.stopAnimation(),t.attr(a)))}function jM(r,e){if(et(r)&&et(e)){var t=!0;return A(e,function(a,n){t=t&&jM(r[n],a)}),!!t}else return r===e}function Jx(r,e){r[e.get([\"label\",\"show\"])?\"show\":\"hide\"]()}function rd(r){return{x:r.x||0,y:r.y||0,rotation:r.rotation||0}}function Qx(r,e,t){var a=e.get(\"z\"),n=e.get(\"zlevel\");r&&r.traverse(function(i){i.type!==\"group\"&&(a!=null&&(i.z=a),n!=null&&(i.zlevel=n),i.silent=t)})}var om=g$;function sm(r){var e=r.get(\"type\"),t=r.getModel(e+\"Style\"),a;return e===\"line\"?(a=t.getLineStyle(),a.fill=null):e===\"shadow\"&&(a=t.getAreaStyle(),a.stroke=null),a}function tL(r,e,t,a,n){var i=t.get(\"value\"),o=eL(i,e.axis,e.ecModel,t.get(\"seriesDataIndices\"),{precision:t.get([\"label\",\"precision\"]),formatter:t.get([\"label\",\"formatter\"])}),s=t.getModel(\"label\"),l=Io(s.get(\"padding\")||0),u=s.getFont(),f=xl(o,u),h=n.position,v=f.width+l[1]+l[3],c=f.height+l[0]+l[2],d=n.align;d===\"right\"&&(h[0]-=v),d===\"center\"&&(h[0]-=v/2);var p=n.verticalAlign;p===\"bottom\"&&(h[1]-=c),p===\"middle\"&&(h[1]-=c/2),y$(h,v,c,a);var g=s.get(\"backgroundColor\");(!g||g===\"auto\")&&(g=e.get([\"axisLine\",\"lineStyle\",\"color\"])),r.label={x:h[0],y:h[1],style:Nt(s,{text:o,font:u,fill:s.getTextColor(),padding:l,backgroundColor:g}),z2:10}}function y$(r,e,t,a){var n=a.getWidth(),i=a.getHeight();r[0]=Math.min(r[0]+e,n)-e,r[1]=Math.min(r[1]+t,i)-t,r[0]=Math.max(r[0],0),r[1]=Math.max(r[1],0)}function eL(r,e,t,a,n){r=e.scale.parse(r);var i=e.scale.getLabel({value:r},{precision:n.precision}),o=n.formatter;if(o){var s={value:_y(e,{value:r}),axisDimension:e.dim,axisIndex:e.index,seriesData:[]};A(a,function(l){var u=t.getSeriesByIndex(l.seriesIndex),f=l.dataIndexInside,h=u&&u.getDataParams(f);h&&s.seriesData.push(h)}),U(o)?i=o.replace(\"{value}\",i):J(o)&&(i=o(s))}return i}function lm(r,e,t){var a=ur();return bi(a,a,t.rotation),Xr(a,a,t.position),Cr([r.dataToCoord(e),(t.labelOffset||0)+(t.labelDirection||1)*(t.labelMargin||0)],a)}function rL(r,e,t,a,n,i){var o=wa.innerTextLayout(t.rotation,0,t.labelDirection);t.labelMargin=n.get([\"label\",\"margin\"]),tL(e,a,n,i,{position:lm(a.axis,r,t),align:o.textAlign,verticalAlign:o.textVerticalAlign})}function um(r,e,t){return t=t||0,{x1:r[t],y1:r[1-t],x2:e[t],y2:e[1-t]}}function aL(r,e,t){return t=t||0,{x:r[t],y:r[1-t],width:e[t],height:e[1-t]}}function jx(r,e,t,a,n,i){return{cx:r,cy:e,r0:t,r:a,startAngle:n,endAngle:i,clockwise:!0}}var m$=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.makeElOption=function(t,a,n,i,o){var s=n.axis,l=s.grid,u=i.get(\"type\"),f=tw(l,s).getOtherAxis(s).getGlobalExtent(),h=s.toGlobalCoord(s.dataToCoord(a,!0));if(u&&u!==\"none\"){var v=sm(i),c=_$[u](s,h,f);c.style=v,t.graphicKey=c.type,t.pointer=c}var d=Dp(l.model,n);rL(a,t,d,n,i,o)},e.prototype.getHandleTransform=function(t,a,n){var i=Dp(a.axis.grid.model,a,{labelInside:!1});i.labelMargin=n.get([\"handle\",\"margin\"]);var o=lm(a.axis,t,i);return{x:o[0],y:o[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},e.prototype.updateHandleTransform=function(t,a,n,i){var o=n.axis,s=o.grid,l=o.getGlobalExtent(!0),u=tw(s,o).getOtherAxis(o).getGlobalExtent(),f=o.dim===\"x\"?0:1,h=[t.x,t.y];h[f]+=a[f],h[f]=Math.min(l[1],h[f]),h[f]=Math.max(l[0],h[f]);var v=(u[1]+u[0])/2,c=[v,v];c[f]=h[f];var d=[{verticalAlign:\"middle\"},{align:\"center\"}];return{x:h[0],y:h[1],rotation:t.rotation,cursorPoint:c,tooltipOption:d[f]}},e}(om);function tw(r,e){var t={};return t[e.dim+\"AxisIndex\"]=e.index,r.getCartesian(t)}var _$={line:function(r,e,t){var a=um([e,t[0]],[e,t[1]],ew(r));return{type:\"Line\",subPixelOptimize:!0,shape:a}},shadow:function(r,e,t){var a=Math.max(1,r.getBandWidth()),n=t[1]-t[0];return{type:\"Rect\",shape:aL([e-a/2,t[0]],[a,n],ew(r))}}};function ew(r){return r.dim===\"x\"?0:1}var S$=m$,x$=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.type=\"axisPointer\",e.defaultOption={show:\"auto\",z:50,type:\"line\",snap:!1,triggerTooltip:!0,triggerEmphasis:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:\"#B9BEC9\",width:1,type:\"dashed\"},shadowStyle:{color:\"rgba(210,219,238,0.2)\"},label:{show:!0,formatter:null,precision:\"auto\",margin:3,color:\"#fff\",padding:[5,7,5,7],backgroundColor:\"auto\",borderColor:null,borderWidth:0,borderRadius:3},handle:{show:!1,icon:\"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z\",size:45,margin:50,color:\"#333\",shadowBlur:3,shadowColor:\"#aaa\",shadowOffsetX:0,shadowOffsetY:2,throttle:40}},e}(Tt),w$=x$,ua=Ct(),b$=A;function nL(r,e,t){if(!At.node){var a=e.getZr();ua(a).records||(ua(a).records={}),C$(a,e);var n=ua(a).records[r]||(ua(a).records[r]={});n.handler=t}}function C$(r,e){if(ua(r).initialized)return;ua(r).initialized=!0,t(\"click\",ot(rw,\"click\")),t(\"mousemove\",ot(rw,\"mousemove\")),t(\"globalout\",A$);function t(a,n){r.on(a,function(i){var o=D$(e);b$(ua(r).records,function(s){s&&n(s,i,o.dispatchAction)}),T$(o.pendings,e)})}}function T$(r,e){var t=r.showTip.length,a=r.hideTip.length,n;t?n=r.showTip[t-1]:a&&(n=r.hideTip[a-1]),n&&(n.dispatchAction=null,e.dispatchAction(n))}function A$(r,e,t){r.handler(\"leave\",null,t)}function rw(r,e,t,a){e.handler(r,t,a)}function D$(r){var e={showTip:[],hideTip:[]},t=function(a){var n=e[a.type];n?n.push(a):(a.dispatchAction=t,r.dispatchAction(a))};return{dispatchAction:t,pendings:e}}function qp(r,e){if(!At.node){var t=e.getZr(),a=(ua(t).records||{})[r];a&&(ua(t).records[r]=null)}}var M$=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n){var i=a.getComponent(\"tooltip\"),o=t.get(\"triggerOn\")||i&&i.get(\"triggerOn\")||\"mousemove|click\";nL(\"axisPointer\",n,function(s,l,u){o!==\"none\"&&(s===\"leave\"||o.indexOf(s)>=0)&&u({type:\"updateAxisPointer\",currTrigger:s,x:l&&l.offsetX,y:l&&l.offsetY})})},e.prototype.remove=function(t,a){qp(\"axisPointer\",a)},e.prototype.dispose=function(t,a){qp(\"axisPointer\",a)},e.type=\"axisPointer\",e}(Ut),L$=M$;function iL(r,e){var t=[],a=r.seriesIndex,n;if(a==null||!(n=e.getSeriesByIndex(a)))return{point:[]};var i=n.getData(),o=di(i,r);if(o==null||o<0||F(o))return{point:[]};var s=i.getItemGraphicEl(o),l=n.coordinateSystem;if(n.getTooltipPosition)t=n.getTooltipPosition(o)||[];else if(l&&l.dataToPoint)if(r.isStacked){var u=l.getBaseAxis(),f=l.getOtherAxis(u),h=f.dim,v=u.dim,c=h===\"x\"||h===\"radius\"?1:0,d=i.mapDimension(v),p=[];p[c]=i.get(d,o),p[1-c]=i.get(i.getCalculationInfo(\"stackResultDimension\"),o),t=l.dataToPoint(p)||[]}else t=l.dataToPoint(i.getValues(G(l.dimensions,function(y){return i.mapDimension(y)}),o))||[];else if(s){var g=s.getBoundingRect().clone();g.applyTransform(s.transform),t=[g.x+g.width/2,g.y+g.height/2]}return{point:t,el:s}}var aw=Ct();function I$(r,e,t){var a=r.currTrigger,n=[r.x,r.y],i=r,o=r.dispatchAction||Y(t.dispatchAction,t),s=e.getComponent(\"axisPointer\").coordSysAxesInfo;if(!!s){hf(n)&&(n=iL({seriesIndex:i.seriesIndex,dataIndex:i.dataIndex},e).point);var l=hf(n),u=i.axesInfo,f=s.axesInfo,h=a===\"leave\"||hf(n),v={},c={},d={list:[],map:{}},p={showPointer:ot(R$,c),showTooltip:ot(E$,d)};A(s.coordSysMap,function(y,m){var _=l||y.containPoint(n);A(s.coordSysAxesInfo[m],function(S,w){var x=S.axis,b=N$(u,S);if(!h&&_&&(!u||b)){var C=b&&b.value;C==null&&!l&&(C=x.pointToData(n)),C!=null&&nw(S,C,p,!1,v)}})});var g={};return A(f,function(y,m){var _=y.linkGroup;_&&!c[m]&&A(_.axesInfo,function(S,w){var x=c[w];if(S!==y&&x){var b=x.value;_.mapper&&(b=y.axis.scale.parse(_.mapper(b,iw(S),iw(y)))),g[y.key]=b}})}),A(g,function(y,m){nw(f[m],y,p,!0,v)}),k$(c,f,v),O$(d,n,r,o),B$(f,o,t),v}}function nw(r,e,t,a,n){var i=r.axis;if(!(i.scale.isBlank()||!i.containData(e))){if(!r.involveSeries){t.showPointer(r,e);return}var o=P$(e,r),s=o.payloadBatch,l=o.snapToValue;s[0]&&n.seriesIndex==null&&V(n,s[0]),!a&&r.snap&&i.containData(l)&&l!=null&&(e=l),t.showPointer(r,e,s),t.showTooltip(r,o,l)}}function P$(r,e){var t=e.axis,a=t.dim,n=r,i=[],o=Number.MAX_VALUE,s=-1;return A(e.seriesModels,function(l,u){var f=l.getData().mapDimensionsAll(a),h,v;if(l.getAxisTooltipData){var c=l.getAxisTooltipData(f,r,t);v=c.dataIndices,h=c.nestestValue}else{if(v=l.getData().indicesOfNearest(f[0],r,t.type===\"category\"?.5:null),!v.length)return;h=l.getData().get(f[0],v[0])}if(!(h==null||!isFinite(h))){var d=r-h,p=Math.abs(d);p<=o&&((p<o||d>=0&&s<0)&&(o=p,s=d,n=h,i.length=0),A(v,function(g){i.push({seriesIndex:l.seriesIndex,dataIndexInside:g,dataIndex:l.getData().getRawIndex(g)})}))}}),{payloadBatch:i,snapToValue:n}}function R$(r,e,t,a){r[e.key]={value:t,payloadBatch:a}}function E$(r,e,t,a){var n=t.payloadBatch,i=e.axis,o=i.model,s=e.axisPointerModel;if(!(!e.triggerTooltip||!n.length)){var l=e.coordSys.model,u=ol(l),f=r.map[u];f||(f=r.map[u]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},r.list.push(f)),f.dataByAxis.push({axisDim:i.dim,axisIndex:o.componentIndex,axisType:o.type,axisId:o.id,value:a,valueLabelOpt:{precision:s.get([\"label\",\"precision\"]),formatter:s.get([\"label\",\"formatter\"])},seriesDataIndices:n.slice()})}}function k$(r,e,t){var a=t.axesInfo=[];A(e,function(n,i){var o=n.axisPointerModel.option,s=r[i];s?(!n.useHandle&&(o.status=\"show\"),o.value=s.value,o.seriesDataIndices=(s.payloadBatch||[]).slice()):!n.useHandle&&(o.status=\"hide\"),o.status===\"show\"&&a.push({axisDim:n.axis.dim,axisIndex:n.axis.model.componentIndex,value:o.value})})}function O$(r,e,t,a){if(hf(e)||!r.list.length){a({type:\"hideTip\"});return}var n=((r.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};a({type:\"showTip\",escapeConnect:!0,x:e[0],y:e[1],tooltipOption:t.tooltipOption,position:t.position,dataIndexInside:n.dataIndexInside,dataIndex:n.dataIndex,seriesIndex:n.seriesIndex,dataByCoordSys:r.list})}function B$(r,e,t){var a=t.getZr(),n=\"axisPointerLastHighlights\",i=aw(a)[n]||{},o=aw(a)[n]={};A(r,function(u,f){var h=u.axisPointerModel.option;h.status===\"show\"&&u.triggerEmphasis&&A(h.seriesDataIndices,function(v){var c=v.seriesIndex+\" | \"+v.dataIndex;o[c]=v})});var s=[],l=[];A(i,function(u,f){!o[f]&&l.push(u)}),A(o,function(u,f){!i[f]&&s.push(u)}),l.length&&t.dispatchAction({type:\"downplay\",escapeConnect:!0,notBlur:!0,batch:l}),s.length&&t.dispatchAction({type:\"highlight\",escapeConnect:!0,notBlur:!0,batch:s})}function N$(r,e){for(var t=0;t<(r||[]).length;t++){var a=r[t];if(e.axis.dim===a.axisDim&&e.axis.model.componentIndex===a.axisIndex)return a}}function iw(r){var e=r.axis.model,t={},a=t.axisDim=r.axis.dim;return t.axisIndex=t[a+\"AxisIndex\"]=e.componentIndex,t.axisName=t[a+\"AxisName\"]=e.name,t.axisId=t[a+\"AxisId\"]=e.id,t}function hf(r){return!r||r[0]==null||isNaN(r[0])||r[1]==null||isNaN(r[1])}function Fl(r){Mi.registerAxisPointerClass(\"CartesianAxisPointer\",S$),r.registerComponentModel(w$),r.registerComponentView(L$),r.registerPreprocessor(function(e){if(e){(!e.axisPointer||e.axisPointer.length===0)&&(e.axisPointer={});var t=e.axisPointer.link;t&&!F(t)&&(e.axisPointer.link=[t])}}),r.registerProcessor(r.PRIORITY.PROCESSOR.STATISTIC,function(e,t){e.getComponent(\"axisPointer\").coordSysAxesInfo=zV(e,t)}),r.registerAction({type:\"updateAxisPointer\",event:\"updateAxisPointer\",update:\":updateAxisPointer\"},I$)}function oL(r){ct(gD),ct(Fl)}var V$=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.makeElOption=function(t,a,n,i,o){var s=n.axis;s.dim===\"angle\"&&(this.animationThreshold=Math.PI/18);var l=s.polar,u=l.getOtherAxis(s),f=u.getExtent(),h=s.dataToCoord(a),v=i.get(\"type\");if(v&&v!==\"none\"){var c=sm(i),d=F$[v](s,l,h,f);d.style=c,t.graphicKey=d.type,t.pointer=d}var p=i.get([\"label\",\"margin\"]),g=z$(a,n,i,l,p);tL(t,n,i,o,g)},e}(om);function z$(r,e,t,a,n){var i=e.axis,o=i.dataToCoord(r),s=a.getAngleAxis().getExtent()[0];s=s/180*Math.PI;var l=a.getRadiusAxis().getExtent(),u,f,h;if(i.dim===\"radius\"){var v=ur();bi(v,v,s),Xr(v,v,[a.cx,a.cy]),u=Cr([o,-n],v);var c=e.getModel(\"axisLabel\").get(\"rotate\")||0,d=wa.innerTextLayout(s,c*Math.PI/180,-1);f=d.textAlign,h=d.textVerticalAlign}else{var p=l[1];u=a.coordToPoint([p+n,o]);var g=a.cx,y=a.cy;f=Math.abs(u[0]-g)/p<.3?\"center\":u[0]>g?\"left\":\"right\",h=Math.abs(u[1]-y)/p<.3?\"middle\":u[1]>y?\"top\":\"bottom\"}return{position:u,align:f,verticalAlign:h}}var F$={line:function(r,e,t,a){return r.dim===\"angle\"?{type:\"Line\",shape:um(e.coordToPoint([a[0],t]),e.coordToPoint([a[1],t]))}:{type:\"Circle\",shape:{cx:e.cx,cy:e.cy,r:t}}},shadow:function(r,e,t,a){var n=Math.max(1,r.getBandWidth()),i=Math.PI/180;return r.dim===\"angle\"?{type:\"Sector\",shape:jx(e.cx,e.cy,a[0],a[1],(-t-n/2)*i,(-t+n/2)*i)}:{type:\"Sector\",shape:jx(e.cx,e.cy,t-n/2,t+n/2,0,Math.PI*2)}}},G$=V$,H$=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.findAxisModel=function(t){var a,n=this.ecModel;return n.eachComponent(t,function(i){i.getCoordSysModel()===this&&(a=i)},this),a},e.type=\"polar\",e.dependencies=[\"radiusAxis\",\"angleAxis\"],e.defaultOption={z:0,center:[\"50%\",\"50%\"],radius:\"80%\"},e}(Tt),W$=H$,fm=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.getCoordSysModel=function(){return this.getReferringComponents(\"polar\",Qt).models[0]},e.type=\"polarAxis\",e}(Tt);te(fm,Rl);var $$=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.type=\"angleAxis\",e}(fm),U$=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.type=\"radiusAxis\",e}(fm),hm=function(r){k(e,r);function e(t,a){return r.call(this,\"radius\",t,a)||this}return e.prototype.pointToData=function(t,a){return this.polar.pointToData(t,a)[this.dim===\"radius\"?0:1]},e}(Mr);hm.prototype.dataToRadius=Mr.prototype.dataToCoord;hm.prototype.radiusToData=Mr.prototype.coordToData;var Y$=hm,Z$=Ct(),vm=function(r){k(e,r);function e(t,a){return r.call(this,\"angle\",t,a||[0,360])||this}return e.prototype.pointToData=function(t,a){return this.polar.pointToData(t,a)[this.dim===\"radius\"?0:1]},e.prototype.calculateCategoryInterval=function(){var t=this,a=t.getLabelModel(),n=t.scale,i=n.getExtent(),o=n.count();if(i[1]-i[0]<1)return 0;var s=i[0],l=t.dataToCoord(s+1)-t.dataToCoord(s),u=Math.abs(l),f=xl(s==null?\"\":s+\"\",a.getFont(),\"center\",\"top\"),h=Math.max(f.height,7),v=h/u;isNaN(v)&&(v=1/0);var c=Math.max(0,Math.floor(v)),d=Z$(t.model),p=d.lastAutoInterval,g=d.lastTickCount;return p!=null&&g!=null&&Math.abs(p-c)<=1&&Math.abs(g-o)<=1&&p>c?c=p:(d.lastTickCount=o,d.lastAutoInterval=c),c},e}(Mr);vm.prototype.dataToAngle=Mr.prototype.dataToCoord;vm.prototype.angleToData=Mr.prototype.coordToData;var X$=vm,sL=[\"radius\",\"angle\"],q$=function(){function r(e){this.dimensions=sL,this.type=\"polar\",this.cx=0,this.cy=0,this._radiusAxis=new Y$,this._angleAxis=new X$,this.axisPointerEnabled=!0,this.name=e||\"\",this._radiusAxis.polar=this._angleAxis.polar=this}return r.prototype.containPoint=function(e){var t=this.pointToCoord(e);return this._radiusAxis.contain(t[0])&&this._angleAxis.contain(t[1])},r.prototype.containData=function(e){return this._radiusAxis.containData(e[0])&&this._angleAxis.containData(e[1])},r.prototype.getAxis=function(e){var t=\"_\"+e+\"Axis\";return this[t]},r.prototype.getAxes=function(){return[this._radiusAxis,this._angleAxis]},r.prototype.getAxesByScale=function(e){var t=[],a=this._angleAxis,n=this._radiusAxis;return a.scale.type===e&&t.push(a),n.scale.type===e&&t.push(n),t},r.prototype.getAngleAxis=function(){return this._angleAxis},r.prototype.getRadiusAxis=function(){return this._radiusAxis},r.prototype.getOtherAxis=function(e){var t=this._angleAxis;return e===t?this._radiusAxis:t},r.prototype.getBaseAxis=function(){return this.getAxesByScale(\"ordinal\")[0]||this.getAxesByScale(\"time\")[0]||this.getAngleAxis()},r.prototype.getTooltipAxes=function(e){var t=e!=null&&e!==\"auto\"?this.getAxis(e):this.getBaseAxis();return{baseAxes:[t],otherAxes:[this.getOtherAxis(t)]}},r.prototype.dataToPoint=function(e,t){return this.coordToPoint([this._radiusAxis.dataToRadius(e[0],t),this._angleAxis.dataToAngle(e[1],t)])},r.prototype.pointToData=function(e,t){var a=this.pointToCoord(e);return[this._radiusAxis.radiusToData(a[0],t),this._angleAxis.angleToData(a[1],t)]},r.prototype.pointToCoord=function(e){var t=e[0]-this.cx,a=e[1]-this.cy,n=this.getAngleAxis(),i=n.getExtent(),o=Math.min(i[0],i[1]),s=Math.max(i[0],i[1]);n.inverse?o=s-360:s=o+360;var l=Math.sqrt(t*t+a*a);t/=l,a/=l;for(var u=Math.atan2(-a,t)/Math.PI*180,f=u<o?1:-1;u<o||u>s;)u+=f*360;return[l,u]},r.prototype.coordToPoint=function(e){var t=e[0],a=e[1]/180*Math.PI,n=Math.cos(a)*t+this.cx,i=-Math.sin(a)*t+this.cy;return[n,i]},r.prototype.getArea=function(){var e=this.getAngleAxis(),t=this.getRadiusAxis(),a=t.getExtent().slice();a[0]>a[1]&&a.reverse();var n=e.getExtent(),i=Math.PI/180;return{cx:this.cx,cy:this.cy,r0:a[0],r:a[1],startAngle:-n[0]*i,endAngle:-n[1]*i,clockwise:e.inverse,contain:function(o,s){var l=o-this.cx,u=s-this.cy,f=l*l+u*u-1e-4,h=this.r,v=this.r0;return f<=h*h&&f>=v*v}}},r.prototype.convertToPixel=function(e,t,a){var n=ow(t);return n===this?this.dataToPoint(a):null},r.prototype.convertFromPixel=function(e,t,a){var n=ow(t);return n===this?this.pointToData(a):null},r}();function ow(r){var e=r.seriesModel,t=r.polarModel;return t&&t.coordinateSystem||e&&e.coordinateSystem}var K$=q$;function J$(r,e,t){var a=e.get(\"center\"),n=t.getWidth(),i=t.getHeight();r.cx=W(a[0],n),r.cy=W(a[1],i);var o=r.getRadiusAxis(),s=Math.min(n,i)/2,l=e.get(\"radius\");l==null?l=[0,\"100%\"]:F(l)||(l=[0,l]);var u=[W(l[0],s),W(l[1],s)];o.inverse?o.setExtent(u[1],u[0]):o.setExtent(u[0],u[1])}function Q$(r,e){var t=this,a=t.getAngleAxis(),n=t.getRadiusAxis();if(a.scale.setExtent(1/0,-1/0),n.scale.setExtent(1/0,-1/0),r.eachSeries(function(s){if(s.coordinateSystem===t){var l=s.getData();A(Gf(l,\"radius\"),function(u){n.scale.unionExtentFromData(l,u)}),A(Gf(l,\"angle\"),function(u){a.scale.unionExtentFromData(l,u)})}}),po(a.scale,a.model),po(n.scale,n.model),a.type===\"category\"&&!a.onBand){var i=a.getExtent(),o=360/a.scale.count();a.inverse?i[1]+=o:i[1]-=o,a.setExtent(i[0],i[1])}}function j$(r){return r.mainType===\"angleAxis\"}function sw(r,e){if(r.type=e.get(\"type\"),r.scale=Hh(e),r.onBand=e.get(\"boundaryGap\")&&r.type===\"category\",r.inverse=e.get(\"inverse\"),j$(e)){r.inverse=r.inverse!==e.get(\"clockwise\");var t=e.get(\"startAngle\");r.setExtent(t,t+(r.inverse?-360:360))}e.axis=r,r.model=e}var tU={dimensions:sL,create:function(r,e){var t=[];return r.eachComponent(\"polar\",function(a,n){var i=new K$(n+\"\");i.update=Q$;var o=i.getRadiusAxis(),s=i.getAngleAxis(),l=a.findAxisModel(\"radiusAxis\"),u=a.findAxisModel(\"angleAxis\");sw(o,l),sw(s,u),J$(i,a,e),t.push(i),a.coordinateSystem=i,i.model=a}),r.eachSeries(function(a){if(a.get(\"coordinateSystem\")===\"polar\"){var n=a.getReferringComponents(\"polar\",Qt).models[0];a.coordinateSystem=n.coordinateSystem}}),t}},eU=tU,rU=[\"axisLine\",\"axisLabel\",\"axisTick\",\"minorTick\",\"splitLine\",\"minorSplitLine\",\"splitArea\"];function Bu(r,e,t){e[1]>e[0]&&(e=e.slice().reverse());var a=r.coordToPoint([e[0],t]),n=r.coordToPoint([e[1],t]);return{x1:a[0],y1:a[1],x2:n[0],y2:n[1]}}function Nu(r){var e=r.getRadiusAxis();return e.inverse?0:1}function lw(r){var e=r[0],t=r[r.length-1];e&&t&&Math.abs(Math.abs(e.coord-t.coord)-360)<1e-4&&r.pop()}var aU=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.axisPointerClass=\"PolarAxisPointer\",t}return e.prototype.render=function(t,a){if(this.group.removeAll(),!!t.get(\"show\")){var n=t.axis,i=n.polar,o=i.getRadiusAxis().getExtent(),s=n.getTicksCoords(),l=n.getMinorTicksCoords(),u=G(n.getViewLabels(),function(f){f=at(f);var h=n.scale,v=h.type===\"ordinal\"?h.getRawOrdinalNumber(f.tickValue):f.tickValue;return f.coord=n.dataToCoord(v),f});lw(u),lw(s),A(rU,function(f){t.get([f,\"show\"])&&(!n.scale.isBlank()||f===\"axisLine\")&&nU[f](this.group,t,i,s,l,o,u)},this)}},e.type=\"angleAxis\",e}(Mi),nU={axisLine:function(r,e,t,a,n,i){var o=e.getModel([\"axisLine\",\"lineStyle\"]),s=Nu(t),l=s?0:1,u;i[l]===0?u=new Qr({shape:{cx:t.cx,cy:t.cy,r:i[s]},style:o.getLineStyle(),z2:1,silent:!0}):u=new Ch({shape:{cx:t.cx,cy:t.cy,r:i[s],r0:i[l]},style:o.getLineStyle(),z2:1,silent:!0}),u.style.fill=null,r.add(u)},axisTick:function(r,e,t,a,n,i){var o=e.getModel(\"axisTick\"),s=(o.get(\"inside\")?-1:1)*o.get(\"length\"),l=i[Nu(t)],u=G(a,function(f){return new ue({shape:Bu(t,[l,l+s],f.coord)})});r.add(nr(u,{style:tt(o.getModel(\"lineStyle\").getLineStyle(),{stroke:e.get([\"axisLine\",\"lineStyle\",\"color\"])})}))},minorTick:function(r,e,t,a,n,i){if(!!n.length){for(var o=e.getModel(\"axisTick\"),s=e.getModel(\"minorTick\"),l=(o.get(\"inside\")?-1:1)*s.get(\"length\"),u=i[Nu(t)],f=[],h=0;h<n.length;h++)for(var v=0;v<n[h].length;v++)f.push(new ue({shape:Bu(t,[u,u+l],n[h][v].coord)}));r.add(nr(f,{style:tt(s.getModel(\"lineStyle\").getLineStyle(),tt(o.getLineStyle(),{stroke:e.get([\"axisLine\",\"lineStyle\",\"color\"])}))}))}},axisLabel:function(r,e,t,a,n,i,o){var s=e.getCategories(!0),l=e.getModel(\"axisLabel\"),u=l.get(\"margin\"),f=e.get(\"triggerEvent\");A(o,function(h,v){var c=l,d=h.tickValue,p=i[Nu(t)],g=t.coordToPoint([p+u,h.coord]),y=t.cx,m=t.cy,_=Math.abs(g[0]-y)/p<.3?\"center\":g[0]>y?\"left\":\"right\",S=Math.abs(g[1]-m)/p<.3?\"middle\":g[1]>m?\"top\":\"bottom\";if(s&&s[d]){var w=s[d];et(w)&&w.textStyle&&(c=new Vt(w.textStyle,l,l.ecModel))}var x=new Dt({silent:wa.isLabelSilent(e),style:Nt(c,{x:g[0],y:g[1],fill:c.getTextColor()||e.get([\"axisLine\",\"lineStyle\",\"color\"]),text:h.formattedLabel,align:_,verticalAlign:S})});if(r.add(x),f){var b=wa.makeAxisEventDataBase(e);b.targetType=\"axisLabel\",b.value=h.rawLabel,it(x).eventData=b}},this)},splitLine:function(r,e,t,a,n,i){var o=e.getModel(\"splitLine\"),s=o.getModel(\"lineStyle\"),l=s.get(\"color\"),u=0;l=l instanceof Array?l:[l];for(var f=[],h=0;h<a.length;h++){var v=u++%l.length;f[v]=f[v]||[],f[v].push(new ue({shape:Bu(t,i,a[h].coord)}))}for(var h=0;h<f.length;h++)r.add(nr(f[h],{style:tt({stroke:l[h%l.length]},s.getLineStyle()),silent:!0,z:e.get(\"z\")}))},minorSplitLine:function(r,e,t,a,n,i){if(!!n.length){for(var o=e.getModel(\"minorSplitLine\"),s=o.getModel(\"lineStyle\"),l=[],u=0;u<n.length;u++)for(var f=0;f<n[u].length;f++)l.push(new ue({shape:Bu(t,i,n[u][f].coord)}));r.add(nr(l,{style:s.getLineStyle(),silent:!0,z:e.get(\"z\")}))}},splitArea:function(r,e,t,a,n,i){if(!!a.length){var o=e.getModel(\"splitArea\"),s=o.getModel(\"areaStyle\"),l=s.get(\"color\"),u=0;l=l instanceof Array?l:[l];for(var f=[],h=Math.PI/180,v=-a[0].coord*h,c=Math.min(i[0],i[1]),d=Math.max(i[0],i[1]),p=e.get(\"clockwise\"),g=1,y=a.length;g<=y;g++){var m=g===y?a[0].coord:a[g].coord,_=u++%l.length;f[_]=f[_]||[],f[_].push(new Ve({shape:{cx:t.cx,cy:t.cy,r0:c,r:d,startAngle:v,endAngle:-m*h,clockwise:p},silent:!0})),v=-m*h}for(var g=0;g<f.length;g++)r.add(nr(f[g],{style:tt({fill:l[g%l.length]},s.getAreaStyle()),silent:!0}))}}},iU=aU,oU=[\"axisLine\",\"axisTickLabel\",\"axisName\"],sU=[\"splitLine\",\"splitArea\",\"minorSplitLine\"],lU=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.axisPointerClass=\"PolarAxisPointer\",t}return e.prototype.render=function(t,a){if(this.group.removeAll(),!!t.get(\"show\")){var n=this._axisGroup,i=this._axisGroup=new nt;this.group.add(i);var o=t.axis,s=o.polar,l=s.getAngleAxis(),u=o.getTicksCoords(),f=o.getMinorTicksCoords(),h=l.getExtent()[0],v=o.getExtent(),c=fU(s,t,h),d=new wa(t,c);A(oU,d.add,d),i.add(d.getGroup()),Tl(n,i,t),A(sU,function(p){t.get([p,\"show\"])&&!o.scale.isBlank()&&uU[p](this.group,t,s,h,v,u,f)},this)}},e.type=\"radiusAxis\",e}(Mi),uU={splitLine:function(r,e,t,a,n,i){var o=e.getModel(\"splitLine\"),s=o.getModel(\"lineStyle\"),l=s.get(\"color\"),u=0;l=l instanceof Array?l:[l];for(var f=[],h=0;h<i.length;h++){var v=u++%l.length;f[v]=f[v]||[],f[v].push(new Qr({shape:{cx:t.cx,cy:t.cy,r:Math.max(i[h].coord,0)}}))}for(var h=0;h<f.length;h++)r.add(nr(f[h],{style:tt({stroke:l[h%l.length],fill:null},s.getLineStyle()),silent:!0}))},minorSplitLine:function(r,e,t,a,n,i,o){if(!!o.length){for(var s=e.getModel(\"minorSplitLine\"),l=s.getModel(\"lineStyle\"),u=[],f=0;f<o.length;f++)for(var h=0;h<o[f].length;h++)u.push(new Qr({shape:{cx:t.cx,cy:t.cy,r:o[f][h].coord}}));r.add(nr(u,{style:tt({fill:null},l.getLineStyle()),silent:!0}))}},splitArea:function(r,e,t,a,n,i){if(!!i.length){var o=e.getModel(\"splitArea\"),s=o.getModel(\"areaStyle\"),l=s.get(\"color\"),u=0;l=l instanceof Array?l:[l];for(var f=[],h=i[0].coord,v=1;v<i.length;v++){var c=u++%l.length;f[c]=f[c]||[],f[c].push(new Ve({shape:{cx:t.cx,cy:t.cy,r0:h,r:i[v].coord,startAngle:0,endAngle:Math.PI*2},silent:!0})),h=i[v].coord}for(var v=0;v<f.length;v++)r.add(nr(f[v],{style:tt({fill:l[v%l.length]},s.getAreaStyle()),silent:!0}))}}};function fU(r,e,t){return{position:[r.cx,r.cy],rotation:t/180*Math.PI,labelDirection:-1,tickDirection:-1,nameDirection:1,labelRotate:e.getModel(\"axisLabel\").get(\"rotate\"),z2:1}}var hU=lU;function lL(r){return r.get(\"stack\")||\"__ec_stack_\"+r.seriesIndex}function uL(r,e){return e.dim+r.model.componentIndex}function vU(r,e,t){var a={},n=cU(Et(e.getSeriesByType(r),function(i){return!e.isSeriesFiltered(i)&&i.coordinateSystem&&i.coordinateSystem.type===\"polar\"}));e.eachSeriesByType(r,function(i){if(i.coordinateSystem.type===\"polar\"){var o=i.getData(),s=i.coordinateSystem,l=s.getBaseAxis(),u=uL(s,l),f=lL(i),h=n[u][f],v=h.offset,c=h.width,d=s.getOtherAxis(l),p=i.coordinateSystem.cx,g=i.coordinateSystem.cy,y=i.get(\"barMinHeight\")||0,m=i.get(\"barMinAngle\")||0;a[f]=a[f]||[];for(var _=o.mapDimension(d.dim),S=o.mapDimension(l.dim),w=nn(o,_),x=l.dim!==\"radius\"||!i.get(\"roundCap\",!0),b=d.dataToCoord(0),C=0,T=o.count();C<T;C++){var D=o.get(_,C),M=o.get(S,C),L=D>=0?\"p\":\"n\",I=b;w&&(a[f][M]||(a[f][M]={p:b,n:b}),I=a[f][M][L]);var P=void 0,R=void 0,E=void 0,B=void 0;if(d.dim===\"radius\"){var O=d.dataToCoord(D)-b,z=l.dataToCoord(M);Math.abs(O)<y&&(O=(O<0?-1:1)*y),P=I,R=I+O,E=z-v,B=E-c,w&&(a[f][M][L]=R)}else{var H=d.dataToCoord(D,x)-b,$=l.dataToCoord(M);Math.abs(H)<m&&(H=(H<0?-1:1)*m),P=$+v,R=P+c,E=I,B=I+H,w&&(a[f][M][L]=B)}o.setItemLayout(C,{cx:p,cy:g,r0:P,r:R,startAngle:-E*Math.PI/180,endAngle:-B*Math.PI/180,clockwise:E>=B})}}})}function cU(r){var e={};A(r,function(a,n){var i=a.getData(),o=a.coordinateSystem,s=o.getBaseAxis(),l=uL(o,s),u=s.getExtent(),f=s.type===\"category\"?s.getBandWidth():Math.abs(u[1]-u[0])/i.count(),h=e[l]||{bandWidth:f,remainedWidth:f,autoWidthCount:0,categoryGap:\"20%\",gap:\"30%\",stacks:{}},v=h.stacks;e[l]=h;var c=lL(a);v[c]||h.autoWidthCount++,v[c]=v[c]||{width:0,maxWidth:0};var d=W(a.get(\"barWidth\"),f),p=W(a.get(\"barMaxWidth\"),f),g=a.get(\"barGap\"),y=a.get(\"barCategoryGap\");d&&!v[c].width&&(d=Math.min(h.remainedWidth,d),v[c].width=d,h.remainedWidth-=d),p&&(v[c].maxWidth=p),g!=null&&(h.gap=g),y!=null&&(h.categoryGap=y)});var t={};return A(e,function(a,n){t[n]={};var i=a.stacks,o=a.bandWidth,s=W(a.categoryGap,o),l=W(a.gap,1),u=a.remainedWidth,f=a.autoWidthCount,h=(u-s)/(f+(f-1)*l);h=Math.max(h,0),A(i,function(p,g){var y=p.maxWidth;y&&y<h&&(y=Math.min(y,u),p.width&&(y=Math.min(y,p.width)),u-=y,p.width=y,f--)}),h=(u-s)/(f+(f-1)*l),h=Math.max(h,0);var v=0,c;A(i,function(p,g){p.width||(p.width=h),c=p,v+=p.width*(1+l)}),c&&(v-=c.width*l);var d=-v/2;A(i,function(p,g){t[n][g]=t[n][g]||{offset:d,width:p.width},d+=p.width*(1+l)})}),t}var dU={startAngle:90,clockwise:!0,splitNumber:12,axisLabel:{rotate:0}},pU={splitNumber:5},gU=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.type=\"polar\",e}(Ut);function yU(r){ct(Fl),Mi.registerAxisPointerClass(\"PolarAxisPointer\",G$),r.registerCoordinateSystem(\"polar\",eU),r.registerComponentModel(W$),r.registerComponentView(gU),yo(r,\"angle\",$$,dU),yo(r,\"radius\",U$,pU),r.registerComponentView(iU),r.registerComponentView(hU),r.registerLayout(ot(vU,\"bar\"))}function Kp(r,e){e=e||{};var t=r.coordinateSystem,a=r.axis,n={},i=a.position,o=a.orient,s=t.getRect(),l=[s.x,s.x+s.width,s.y,s.y+s.height],u={horizontal:{top:l[2],bottom:l[3]},vertical:{left:l[0],right:l[1]}};n.position=[o===\"vertical\"?u.vertical[i]:l[0],o===\"horizontal\"?u.horizontal[i]:l[3]];var f={horizontal:0,vertical:1};n.rotation=Math.PI/2*f[o];var h={top:-1,bottom:1,right:1,left:-1};n.labelDirection=n.tickDirection=n.nameDirection=h[i],r.get([\"axisTick\",\"inside\"])&&(n.tickDirection=-n.tickDirection),le(e.labelInside,r.get([\"axisLabel\",\"inside\"]))&&(n.labelDirection=-n.labelDirection);var v=e.rotate;return v==null&&(v=r.get([\"axisLabel\",\"rotate\"])),n.labelRotation=i===\"top\"?-v:v,n.z2=1,n}var mU=[\"axisLine\",\"axisTickLabel\",\"axisName\"],_U=[\"splitArea\",\"splitLine\"],SU=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.axisPointerClass=\"SingleAxisPointer\",t}return e.prototype.render=function(t,a,n,i){var o=this.group;o.removeAll();var s=this._axisGroup;this._axisGroup=new nt;var l=Kp(t),u=new wa(t,l);A(mU,u.add,u),o.add(this._axisGroup),o.add(u.getGroup()),A(_U,function(f){t.get([f,\"show\"])&&xU[f](this,this.group,this._axisGroup,t)},this),Tl(s,this._axisGroup,t),r.prototype.render.call(this,t,a,n,i)},e.prototype.remove=function(){cD(this)},e.type=\"singleAxis\",e}(Mi),xU={splitLine:function(r,e,t,a){var n=a.axis;if(!n.scale.isBlank()){var i=a.getModel(\"splitLine\"),o=i.getModel(\"lineStyle\"),s=o.get(\"color\");s=s instanceof Array?s:[s];for(var l=o.get(\"width\"),u=a.coordinateSystem.getRect(),f=n.isHorizontal(),h=[],v=0,c=n.getTicksCoords({tickModel:i}),d=[],p=[],g=0;g<c.length;++g){var y=n.toGlobalCoord(c[g].coord);f?(d[0]=y,d[1]=u.y,p[0]=y,p[1]=u.y+u.height):(d[0]=u.x,d[1]=y,p[0]=u.x+u.width,p[1]=y);var m=new ue({shape:{x1:d[0],y1:d[1],x2:p[0],y2:p[1]},silent:!0});ho(m.shape,l);var _=v++%s.length;h[_]=h[_]||[],h[_].push(m)}for(var S=o.getLineStyle([\"color\"]),g=0;g<h.length;++g)e.add(nr(h[g],{style:tt({stroke:s[g%s.length]},S),silent:!0}))}},splitArea:function(r,e,t,a){vD(r,t,a,a)}},wU=SU,fL=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.getCoordSysModel=function(){return this},e.type=\"singleAxis\",e.layoutMode=\"box\",e.defaultOption={left:\"5%\",top:\"5%\",right:\"5%\",bottom:\"5%\",type:\"value\",position:\"bottom\",orient:\"horizontal\",axisLine:{show:!0,lineStyle:{width:1,type:\"solid\"}},tooltip:{show:!0},axisTick:{show:!0,length:6,lineStyle:{width:1}},axisLabel:{show:!0,interval:\"auto\"},splitLine:{show:!0,lineStyle:{type:\"dashed\",opacity:.2}}},e}(Tt);te(fL,Rl.prototype);var ad=fL,bU=function(r){k(e,r);function e(t,a,n,i,o){var s=r.call(this,t,a,n)||this;return s.type=i||\"value\",s.position=o||\"bottom\",s}return e.prototype.isHorizontal=function(){var t=this.position;return t===\"top\"||t===\"bottom\"},e.prototype.pointToData=function(t,a){return this.coordinateSystem.pointToData(t)[0]},e}(Mr),CU=bU,hL=[\"single\"],TU=function(){function r(e,t,a){this.type=\"single\",this.dimension=\"single\",this.dimensions=hL,this.axisPointerEnabled=!0,this.model=e,this._init(e,t,a)}return r.prototype._init=function(e,t,a){var n=this.dimension,i=new CU(n,Hh(e),[0,0],e.get(\"type\"),e.get(\"position\")),o=i.type===\"category\";i.onBand=o&&e.get(\"boundaryGap\"),i.inverse=e.get(\"inverse\"),i.orient=e.get(\"orient\"),e.axis=i,i.model=e,i.coordinateSystem=this,this._axis=i},r.prototype.update=function(e,t){e.eachSeries(function(a){if(a.coordinateSystem===this){var n=a.getData();A(n.mapDimensionsAll(this.dimension),function(i){this._axis.scale.unionExtentFromData(n,i)},this),po(this._axis.scale,this._axis.model)}},this)},r.prototype.resize=function(e,t){this._rect=re({left:e.get(\"left\"),top:e.get(\"top\"),right:e.get(\"right\"),bottom:e.get(\"bottom\"),width:e.get(\"width\"),height:e.get(\"height\")},{width:t.getWidth(),height:t.getHeight()}),this._adjustAxis()},r.prototype.getRect=function(){return this._rect},r.prototype._adjustAxis=function(){var e=this._rect,t=this._axis,a=t.isHorizontal(),n=a?[0,e.width]:[0,e.height],i=t.inverse?1:0;t.setExtent(n[i],n[1-i]),this._updateAxisTransform(t,a?e.x:e.y)},r.prototype._updateAxisTransform=function(e,t){var a=e.getExtent(),n=a[0]+a[1],i=e.isHorizontal();e.toGlobalCoord=i?function(o){return o+t}:function(o){return n-o+t},e.toLocalCoord=i?function(o){return o-t}:function(o){return n-o+t}},r.prototype.getAxis=function(){return this._axis},r.prototype.getBaseAxis=function(){return this._axis},r.prototype.getAxes=function(){return[this._axis]},r.prototype.getTooltipAxes=function(){return{baseAxes:[this.getAxis()],otherAxes:[]}},r.prototype.containPoint=function(e){var t=this.getRect(),a=this.getAxis(),n=a.orient;return n===\"horizontal\"?a.contain(a.toLocalCoord(e[0]))&&e[1]>=t.y&&e[1]<=t.y+t.height:a.contain(a.toLocalCoord(e[1]))&&e[0]>=t.y&&e[0]<=t.y+t.height},r.prototype.pointToData=function(e){var t=this.getAxis();return[t.coordToData(t.toLocalCoord(e[t.orient===\"horizontal\"?0:1]))]},r.prototype.dataToPoint=function(e){var t=this.getAxis(),a=this.getRect(),n=[],i=t.orient===\"horizontal\"?0:1;return e instanceof Array&&(e=e[0]),n[i]=t.toGlobalCoord(t.dataToCoord(+e)),n[1-i]=i===0?a.y+a.height/2:a.x+a.width/2,n},r.prototype.convertToPixel=function(e,t,a){var n=uw(t);return n===this?this.dataToPoint(a):null},r.prototype.convertFromPixel=function(e,t,a){var n=uw(t);return n===this?this.pointToData(a):null},r}();function uw(r){var e=r.seriesModel,t=r.singleAxisModel;return t&&t.coordinateSystem||e&&e.coordinateSystem}function AU(r,e){var t=[];return r.eachComponent(\"singleAxis\",function(a,n){var i=new TU(a,r,e);i.name=\"single_\"+n,i.resize(a,e),a.coordinateSystem=i,t.push(i)}),r.eachSeries(function(a){if(a.get(\"coordinateSystem\")===\"singleAxis\"){var n=a.getReferringComponents(\"singleAxis\",Qt).models[0];a.coordinateSystem=n&&n.coordinateSystem}}),t}var DU={create:AU,dimensions:hL},MU=DU,fw=[\"x\",\"y\"],LU=[\"width\",\"height\"],IU=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.makeElOption=function(t,a,n,i,o){var s=n.axis,l=s.coordinateSystem,u=nd(l,1-rh(s)),f=l.dataToPoint(a)[0],h=i.get(\"type\");if(h&&h!==\"none\"){var v=sm(i),c=PU[h](s,f,u);c.style=v,t.graphicKey=c.type,t.pointer=c}var d=Kp(n);rL(a,t,d,n,i,o)},e.prototype.getHandleTransform=function(t,a,n){var i=Kp(a,{labelInside:!1});i.labelMargin=n.get([\"handle\",\"margin\"]);var o=lm(a.axis,t,i);return{x:o[0],y:o[1],rotation:i.rotation+(i.labelDirection<0?Math.PI:0)}},e.prototype.updateHandleTransform=function(t,a,n,i){var o=n.axis,s=o.coordinateSystem,l=rh(o),u=nd(s,l),f=[t.x,t.y];f[l]+=a[l],f[l]=Math.min(u[1],f[l]),f[l]=Math.max(u[0],f[l]);var h=nd(s,1-l),v=(h[1]+h[0])/2,c=[v,v];return c[l]=f[l],{x:f[0],y:f[1],rotation:t.rotation,cursorPoint:c,tooltipOption:{verticalAlign:\"middle\"}}},e}(om),PU={line:function(r,e,t){var a=um([e,t[0]],[e,t[1]],rh(r));return{type:\"Line\",subPixelOptimize:!0,shape:a}},shadow:function(r,e,t){var a=r.getBandWidth(),n=t[1]-t[0];return{type:\"Rect\",shape:aL([e-a/2,t[0]],[a,n],rh(r))}}};function rh(r){return r.isHorizontal()?0:1}function nd(r,e){var t=r.getRect();return[t[fw[e]],t[fw[e]]+t[LU[e]]]}var RU=IU,EU=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.type=\"single\",e}(Ut);function kU(r){ct(Fl),Mi.registerAxisPointerClass(\"SingleAxisPointer\",RU),r.registerComponentView(EU),r.registerComponentView(wU),r.registerComponentModel(ad),yo(r,\"single\",ad,ad.defaultOption),r.registerCoordinateSystem(\"single\",MU)}var OU=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.init=function(t,a,n){var i=Po(t);r.prototype.init.apply(this,arguments),hw(t,i)},e.prototype.mergeOption=function(t){r.prototype.mergeOption.apply(this,arguments),hw(this.option,t)},e.prototype.getCellSize=function(){return this.option.cellSize},e.type=\"calendar\",e.defaultOption={z:2,left:80,top:60,cellSize:20,orient:\"horizontal\",splitLine:{show:!0,lineStyle:{color:\"#000\",width:1,type:\"solid\"}},itemStyle:{color:\"#fff\",borderWidth:1,borderColor:\"#ccc\"},dayLabel:{show:!0,firstDay:0,position:\"start\",margin:\"50%\",color:\"#000\"},monthLabel:{show:!0,position:\"start\",margin:5,align:\"center\",formatter:null,color:\"#000\"},yearLabel:{show:!0,position:null,margin:30,formatter:null,color:\"#ccc\",fontFamily:\"sans-serif\",fontWeight:\"bolder\",fontSize:20}},e}(Tt);function hw(r,e){var t=r.cellSize,a;F(t)?a=t:a=r.cellSize=[t,t],a.length===1&&(a[1]=a[0]);var n=G([0,1],function(i){return Y3(e,i)&&(a[i]=\"auto\"),a[i]!=null&&a[i]!==\"auto\"});an(r,e,{type:\"box\",ignoreSize:n})}var BU=OU,NU=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n){var i=this.group;i.removeAll();var o=t.coordinateSystem,s=o.getRangeInfo(),l=o.getOrient(),u=a.getLocaleModel();this._renderDayRect(t,s,i),this._renderLines(t,s,l,i),this._renderYearText(t,s,l,i),this._renderMonthText(t,u,l,i),this._renderWeekText(t,u,s,l,i)},e.prototype._renderDayRect=function(t,a,n){for(var i=t.coordinateSystem,o=t.getModel(\"itemStyle\").getItemStyle(),s=i.getCellWidth(),l=i.getCellHeight(),u=a.start.time;u<=a.end.time;u=i.getNextNDay(u,1).time){var f=i.dataToRect([u],!1).tl,h=new bt({shape:{x:f[0],y:f[1],width:s,height:l},cursor:\"default\",style:o});n.add(h)}},e.prototype._renderLines=function(t,a,n,i){var o=this,s=t.coordinateSystem,l=t.getModel([\"splitLine\",\"lineStyle\"]).getLineStyle(),u=t.get([\"splitLine\",\"show\"]),f=l.lineWidth;this._tlpoints=[],this._blpoints=[],this._firstDayOfMonth=[],this._firstDayPoints=[];for(var h=a.start,v=0;h.time<=a.end.time;v++){d(h.formatedDate),v===0&&(h=s.getDateInfo(a.start.y+\"-\"+a.start.m));var c=h.date;c.setMonth(c.getMonth()+1),h=s.getDateInfo(c)}d(s.getNextNDay(a.end.time,1).formatedDate);function d(p){o._firstDayOfMonth.push(s.getDateInfo(p)),o._firstDayPoints.push(s.dataToRect([p],!1).tl);var g=o._getLinePointsOfOneWeek(t,p,n);o._tlpoints.push(g[0]),o._blpoints.push(g[g.length-1]),u&&o._drawSplitline(g,l,i)}u&&this._drawSplitline(o._getEdgesPoints(o._tlpoints,f,n),l,i),u&&this._drawSplitline(o._getEdgesPoints(o._blpoints,f,n),l,i)},e.prototype._getEdgesPoints=function(t,a,n){var i=[t[0].slice(),t[t.length-1].slice()],o=n===\"horizontal\"?0:1;return i[0][o]=i[0][o]-a/2,i[1][o]=i[1][o]+a/2,i},e.prototype._drawSplitline=function(t,a,n){var i=new Fe({z2:20,shape:{points:t},style:a});n.add(i)},e.prototype._getLinePointsOfOneWeek=function(t,a,n){for(var i=t.coordinateSystem,o=i.getDateInfo(a),s=[],l=0;l<7;l++){var u=i.getNextNDay(o.time,l),f=i.dataToRect([u.time],!1);s[2*u.day]=f.tl,s[2*u.day+1]=f[n===\"horizontal\"?\"bl\":\"tr\"]}return s},e.prototype._formatterLabel=function(t,a){return U(t)&&t?W3(t,a):J(t)?t(a):a.nameMap},e.prototype._yearTextPositionControl=function(t,a,n,i,o){var s=a[0],l=a[1],u=[\"center\",\"bottom\"];i===\"bottom\"?(l+=o,u=[\"center\",\"top\"]):i===\"left\"?s-=o:i===\"right\"?(s+=o,u=[\"center\",\"top\"]):l-=o;var f=0;return(i===\"left\"||i===\"right\")&&(f=Math.PI/2),{rotation:f,x:s,y:l,style:{align:u[0],verticalAlign:u[1]}}},e.prototype._renderYearText=function(t,a,n,i){var o=t.getModel(\"yearLabel\");if(!!o.get(\"show\")){var s=o.get(\"margin\"),l=o.get(\"position\");l||(l=n!==\"horizontal\"?\"top\":\"left\");var u=[this._tlpoints[this._tlpoints.length-1],this._blpoints[0]],f=(u[0][0]+u[1][0])/2,h=(u[0][1]+u[1][1])/2,v=n===\"horizontal\"?0:1,c={top:[f,u[v][1]],bottom:[f,u[1-v][1]],left:[u[1-v][0],h],right:[u[v][0],h]},d=a.start.y;+a.end.y>+a.start.y&&(d=d+\"-\"+a.end.y);var p=o.get(\"formatter\"),g={start:a.start.y,end:a.end.y,nameMap:d},y=this._formatterLabel(p,g),m=new Dt({z2:30,style:Nt(o,{text:y})});m.attr(this._yearTextPositionControl(m,c[l],n,l,s)),i.add(m)}},e.prototype._monthTextPositionControl=function(t,a,n,i,o){var s=\"left\",l=\"top\",u=t[0],f=t[1];return n===\"horizontal\"?(f=f+o,a&&(s=\"center\"),i===\"start\"&&(l=\"bottom\")):(u=u+o,a&&(l=\"middle\"),i===\"start\"&&(s=\"right\")),{x:u,y:f,align:s,verticalAlign:l}},e.prototype._renderMonthText=function(t,a,n,i){var o=t.getModel(\"monthLabel\");if(!!o.get(\"show\")){var s=o.get(\"nameMap\"),l=o.get(\"margin\"),u=o.get(\"position\"),f=o.get(\"align\"),h=[this._tlpoints,this._blpoints];(!s||U(s))&&(s&&(a=op(s)||a),s=a.get([\"time\",\"monthAbbr\"])||[]);var v=u===\"start\"?0:1,c=n===\"horizontal\"?0:1;l=u===\"start\"?-l:l;for(var d=f===\"center\",p=0;p<h[v].length-1;p++){var g=h[v][p].slice(),y=this._firstDayOfMonth[p];if(d){var m=this._firstDayPoints[p];g[c]=(m[c]+h[0][p+1][c])/2}var _=o.get(\"formatter\"),S=s[+y.m-1],w={yyyy:y.y,yy:(y.y+\"\").slice(2),MM:y.m,M:+y.m,nameMap:S},x=this._formatterLabel(_,w),b=new Dt({z2:30,style:V(Nt(o,{text:x}),this._monthTextPositionControl(g,d,n,u,l))});i.add(b)}}},e.prototype._weekTextPositionControl=function(t,a,n,i,o){var s=\"center\",l=\"middle\",u=t[0],f=t[1],h=n===\"start\";return a===\"horizontal\"?(u=u+i+(h?1:-1)*o[0]/2,s=h?\"right\":\"left\"):(f=f+i+(h?1:-1)*o[1]/2,l=h?\"bottom\":\"top\"),{x:u,y:f,align:s,verticalAlign:l}},e.prototype._renderWeekText=function(t,a,n,i,o){var s=t.getModel(\"dayLabel\");if(!!s.get(\"show\")){var l=t.coordinateSystem,u=s.get(\"position\"),f=s.get(\"nameMap\"),h=s.get(\"margin\"),v=l.getFirstDayOfWeek();if(!f||U(f)){f&&(a=op(f)||a);var c=a.get([\"time\",\"dayOfWeekShort\"]);f=c||G(a.get([\"time\",\"dayOfWeekAbbr\"]),function(w){return w[0]})}var d=l.getNextNDay(n.end.time,7-n.lweek).time,p=[l.getCellWidth(),l.getCellHeight()];h=W(h,Math.min(p[1],p[0])),u===\"start\"&&(d=l.getNextNDay(n.start.time,-(7+n.fweek)).time,h=-h);for(var g=0;g<7;g++){var y=l.getNextNDay(d,g),m=l.dataToRect([y.time],!1).center,_=g;_=Math.abs((g+v)%7);var S=new Dt({z2:30,style:V(Nt(s,{text:f[_]}),this._weekTextPositionControl(m,i,u,h,p))});o.add(S)}}},e.type=\"calendar\",e}(Ut),VU=NU,id=864e5,zU=function(){function r(e,t,a){this.type=\"calendar\",this.dimensions=r.dimensions,this.getDimensionsInfo=r.getDimensionsInfo,this._model=e}return r.getDimensionsInfo=function(){return[{name:\"time\",type:\"time\"},\"value\"]},r.prototype.getRangeInfo=function(){return this._rangeInfo},r.prototype.getModel=function(){return this._model},r.prototype.getRect=function(){return this._rect},r.prototype.getCellWidth=function(){return this._sw},r.prototype.getCellHeight=function(){return this._sh},r.prototype.getOrient=function(){return this._orient},r.prototype.getFirstDayOfWeek=function(){return this._firstDayOfWeek},r.prototype.getDateInfo=function(e){e=Kr(e);var t=e.getFullYear(),a=e.getMonth()+1,n=a<10?\"0\"+a:\"\"+a,i=e.getDate(),o=i<10?\"0\"+i:\"\"+i,s=e.getDay();return s=Math.abs((s+7-this.getFirstDayOfWeek())%7),{y:t+\"\",m:n,d:o,day:s,time:e.getTime(),formatedDate:t+\"-\"+n+\"-\"+o,date:e}},r.prototype.getNextNDay=function(e,t){return t=t||0,t===0?this.getDateInfo(e):(e=new Date(this.getDateInfo(e).time),e.setDate(e.getDate()+t),this.getDateInfo(e))},r.prototype.update=function(e,t){this._firstDayOfWeek=+this._model.getModel(\"dayLabel\").get(\"firstDay\"),this._orient=this._model.get(\"orient\"),this._lineWidth=this._model.getModel(\"itemStyle\").getItemStyle().lineWidth||0,this._rangeInfo=this._getRangeInfo(this._initRangeOption());var a=this._rangeInfo.weeks||1,n=[\"width\",\"height\"],i=this._model.getCellSize().slice(),o=this._model.getBoxLayoutParams(),s=this._orient===\"horizontal\"?[a,7]:[7,a];A([0,1],function(h){f(i,h)&&(o[n[h]]=i[h]*s[h])});var l={width:t.getWidth(),height:t.getHeight()},u=this._rect=re(o,l);A([0,1],function(h){f(i,h)||(i[h]=u[n[h]]/s[h])});function f(h,v){return h[v]!=null&&h[v]!==\"auto\"}this._sw=i[0],this._sh=i[1]},r.prototype.dataToPoint=function(e,t){F(e)&&(e=e[0]),t==null&&(t=!0);var a=this.getDateInfo(e),n=this._rangeInfo,i=a.formatedDate;if(t&&!(a.time>=n.start.time&&a.time<n.end.time+id))return[NaN,NaN];var o=a.day,s=this._getRangeInfo([n.start.time,i]).nthWeek;return this._orient===\"vertical\"?[this._rect.x+o*this._sw+this._sw/2,this._rect.y+s*this._sh+this._sh/2]:[this._rect.x+s*this._sw+this._sw/2,this._rect.y+o*this._sh+this._sh/2]},r.prototype.pointToData=function(e){var t=this.pointToDate(e);return t&&t.time},r.prototype.dataToRect=function(e,t){var a=this.dataToPoint(e,t);return{contentShape:{x:a[0]-(this._sw-this._lineWidth)/2,y:a[1]-(this._sh-this._lineWidth)/2,width:this._sw-this._lineWidth,height:this._sh-this._lineWidth},center:a,tl:[a[0]-this._sw/2,a[1]-this._sh/2],tr:[a[0]+this._sw/2,a[1]-this._sh/2],br:[a[0]+this._sw/2,a[1]+this._sh/2],bl:[a[0]-this._sw/2,a[1]+this._sh/2]}},r.prototype.pointToDate=function(e){var t=Math.floor((e[0]-this._rect.x)/this._sw)+1,a=Math.floor((e[1]-this._rect.y)/this._sh)+1,n=this._rangeInfo.range;return this._orient===\"vertical\"?this._getDateByWeeksAndDay(a,t-1,n):this._getDateByWeeksAndDay(t,a-1,n)},r.prototype.convertToPixel=function(e,t,a){var n=vw(t);return n===this?n.dataToPoint(a):null},r.prototype.convertFromPixel=function(e,t,a){var n=vw(t);return n===this?n.pointToData(a):null},r.prototype.containPoint=function(e){return console.warn(\"Not implemented.\"),!1},r.prototype._initRangeOption=function(){var e=this._model.get(\"range\"),t;if(F(e)&&e.length===1&&(e=e[0]),F(e))t=e;else{var a=e.toString();if(/^\\d{4}$/.test(a)&&(t=[a+\"-01-01\",a+\"-12-31\"]),/^\\d{4}[\\/|-]\\d{1,2}$/.test(a)){var n=this.getDateInfo(a),i=n.date;i.setMonth(i.getMonth()+1);var o=this.getNextNDay(i,-1);t=[n.formatedDate,o.formatedDate]}/^\\d{4}[\\/|-]\\d{1,2}[\\/|-]\\d{1,2}$/.test(a)&&(t=[a,a])}if(!t)return e;var s=this._getRangeInfo(t);return s.start.time>s.end.time&&t.reverse(),t},r.prototype._getRangeInfo=function(e){var t=[this.getDateInfo(e[0]),this.getDateInfo(e[1])],a;t[0].time>t[1].time&&(a=!0,t.reverse());var n=Math.floor(t[1].time/id)-Math.floor(t[0].time/id)+1,i=new Date(t[0].time),o=i.getDate(),s=t[1].date.getDate();i.setDate(o+n-1);var l=i.getDate();if(l!==s)for(var u=i.getTime()-t[1].time>0?1:-1;(l=i.getDate())!==s&&(i.getTime()-t[1].time)*u>0;)n-=u,i.setDate(l-u);var f=Math.floor((n+t[0].day+6)/7),h=a?-f+1:f-1;return a&&t.reverse(),{range:[t[0].formatedDate,t[1].formatedDate],start:t[0],end:t[1],allDay:n,weeks:f,nthWeek:h,fweek:t[0].day,lweek:t[1].day}},r.prototype._getDateByWeeksAndDay=function(e,t,a){var n=this._getRangeInfo(a);if(e>n.weeks||e===0&&t<n.fweek||e===n.weeks&&t>n.lweek)return null;var i=(e-1)*7-n.fweek+t,o=new Date(n.start.time);return o.setDate(+n.start.d+i),this.getDateInfo(o)},r.create=function(e,t){var a=[];return e.eachComponent(\"calendar\",function(n){var i=new r(n);a.push(i),n.coordinateSystem=i}),e.eachSeries(function(n){n.get(\"coordinateSystem\")===\"calendar\"&&(n.coordinateSystem=a[n.get(\"calendarIndex\")||0])}),a},r.dimensions=[\"time\",\"value\"],r}();function vw(r){var e=r.calendarModel,t=r.seriesModel,a=e?e.coordinateSystem:t?t.coordinateSystem:null;return a}var FU=zU;function GU(r){r.registerComponentModel(BU),r.registerComponentView(VU),r.registerCoordinateSystem(\"calendar\",FU)}function HU(r,e){var t=r.existing;if(e.id=r.keyInfo.id,!e.type&&t&&(e.type=t.type),e.parentId==null){var a=e.parentOption;a?e.parentId=a.id:t&&(e.parentId=t.parentId)}e.parentOption=null}function cw(r,e){var t;return A(e,function(a){r[a]!=null&&r[a]!==\"auto\"&&(t=!0)}),t}function WU(r,e,t){var a=V({},t),n=r[e],i=t.$action||\"merge\";i===\"merge\"?n?(ht(n,a,!0),an(n,a,{ignoreSize:!0}),ZC(t,n),Vu(t,n),Vu(t,n,\"shape\"),Vu(t,n,\"style\"),Vu(t,n,\"extra\"),t.clipPath=n.clipPath):r[e]=a:i===\"replace\"?r[e]=a:i===\"remove\"&&n&&(r[e]=null)}var vL=[\"transition\",\"enterFrom\",\"leaveTo\"],$U=vL.concat([\"enterAnimation\",\"updateAnimation\",\"leaveAnimation\"]);function Vu(r,e,t){if(t&&(!r[t]&&e[t]&&(r[t]={}),r=r[t],e=e[t]),!(!r||!e))for(var a=t?vL:$U,n=0;n<a.length;n++){var i=a[n];r[i]==null&&e[i]!=null&&(r[i]=e[i])}}function UU(r,e){if(!!r&&(r.hv=e.hv=[cw(e,[\"left\",\"right\"]),cw(e,[\"top\",\"bottom\"])],r.type===\"group\")){var t=r,a=e;t.width==null&&(t.width=a.width=0),t.height==null&&(t.height=a.height=0)}}var YU=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.preventAutoZ=!0,t}return e.prototype.mergeOption=function(t,a){var n=this.option.elements;this.option.elements=null,r.prototype.mergeOption.call(this,t,a),this.option.elements=n},e.prototype.optionUpdated=function(t,a){var n=this.option,i=(a?n:t).elements,o=n.elements=a?[]:n.elements,s=[];this._flatten(i,s,null);var l=M2(o,s,\"normalMerge\"),u=this._elOptionsToUpdate=[];A(l,function(f,h){var v=f.newOption;!v||(u.push(v),HU(f,v),WU(o,h,v),UU(o[h],v))},this),n.elements=Et(o,function(f){return f&&delete f.$action,f!=null})},e.prototype._flatten=function(t,a,n){A(t,function(i){if(!!i){n&&(i.parentOption=n),a.push(i);var o=i.children;o&&o.length&&this._flatten(o,a,i),delete i.children}},this)},e.prototype.useElOptionsToUpdate=function(){var t=this._elOptionsToUpdate;return this._elOptionsToUpdate=null,t},e.type=\"graphic\",e.defaultOption={elements:[]},e}(Tt),dw={path:null,compoundPath:null,group:nt,image:pe,text:Dt},tr=Ct(),ZU=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.init=function(){this._elMap=q()},e.prototype.render=function(t,a,n){t!==this._lastGraphicModel&&this._clear(),this._lastGraphicModel=t,this._updateElements(t),this._relocate(t,n)},e.prototype._updateElements=function(t){var a=t.useElOptionsToUpdate();if(!!a){var n=this._elMap,i=this.group,o=t.get(\"z\"),s=t.get(\"zlevel\");A(a,function(l){var u=ee(l.id,null),f=u!=null?n.get(u):null,h=ee(l.parentId,null),v=h!=null?n.get(h):i,c=l.type,d=l.style;c===\"text\"&&d&&l.hv&&l.hv[1]&&(d.textVerticalAlign=d.textBaseline=d.verticalAlign=d.align=null);var p=l.textContent,g=l.textConfig;if(d&&IM(d,c,!!g,!!p)){var y=PM(d,c,!0);!g&&y.textConfig&&(g=l.textConfig=y.textConfig),!p&&y.textContent&&(p=y.textContent)}var m=XU(l),_=l.$action||\"merge\",S=_===\"merge\",w=_===\"replace\";if(S){var x=!f,b=f;x?b=pw(u,v,l.type,n):(b&&(tr(b).isNew=!1),OM(b)),b&&(ff(b,m,t,{isInit:x}),gw(b,l,o,s))}else if(w){vf(f,l,n,t);var C=pw(u,v,l.type,n);C&&(ff(C,m,t,{isInit:!0}),gw(C,l,o,s))}else _===\"remove\"&&(EM(f,l),vf(f,l,n,t));var T=n.get(u);if(T&&p)if(S){var D=T.getTextContent();D?D.attr(p):T.setTextContent(new Dt(p))}else w&&T.setTextContent(new Dt(p));if(T){var M=l.clipPath;if(M){var L=M.type,I=void 0,x=!1;if(S){var P=T.getClipPath();x=!P||tr(P).type!==L,I=x?Jp(L):P}else w&&(x=!0,I=Jp(L));T.setClipPath(I),ff(I,M,t,{isInit:x}),jf(I,M.keyframeAnimation,t)}var R=tr(T);T.setTextConfig(g),R.option=l,qU(T,t,l),Do({el:T,componentModel:t,itemName:T.name,itemTooltipOption:l.tooltip}),jf(T,l.keyframeAnimation,t)}})}},e.prototype._relocate=function(t,a){for(var n=t.option.elements,i=this.group,o=this._elMap,s=a.getWidth(),l=a.getHeight(),u=[\"x\",\"y\"],f=0;f<n.length;f++){var h=n[f],v=ee(h.id,null),c=v!=null?o.get(v):null;if(!(!c||!c.isGroup)){var d=c.parent,p=d===i,g=tr(c),y=tr(d);g.width=W(g.option.width,p?s:y.width)||0,g.height=W(g.option.height,p?l:y.height)||0}}for(var f=n.length-1;f>=0;f--){var h=n[f],v=ee(h.id,null),c=v!=null?o.get(v):null;if(!!c){var d=c.parent,y=tr(d),m=d===i?{width:s,height:l}:{width:y.width,height:y.height},_={},S=kh(c,h,m,null,{hv:h.hv,boundingMode:h.bounding},_);if(!tr(c).isNew&&S){for(var w=h.transition,x={},b=0;b<u.length;b++){var C=u[b],T=_[C];w&&(vi(w)||dt(w,C)>=0)?x[C]=T:c[C]=T}Lt(c,x,t,0)}else c.attr(_)}}},e.prototype._clear=function(){var t=this,a=this._elMap;a.each(function(n){vf(n,tr(n).option,a,t._lastGraphicModel)}),this._elMap=q()},e.prototype.dispose=function(){this._clear()},e.type=\"graphic\",e}(Ut);function Jp(r){var e=Z(dw,r)?dw[r]:$g(r),t=new e({});return tr(t).type=r,t}function pw(r,e,t,a){var n=Jp(t);return e.add(n),a.set(r,n),tr(n).id=r,tr(n).isNew=!0,n}function vf(r,e,t,a){var n=r&&r.parent;n&&(r.type===\"group\"&&r.traverse(function(i){vf(i,e,t,a)}),qh(r,e,a),t.removeKey(tr(r).id))}function gw(r,e,t,a){r.isGroup||A([[\"cursor\",fr.prototype.cursor],[\"zlevel\",a||0],[\"z\",t||0],[\"z2\",0]],function(n){var i=n[0];Z(e,i)?r[i]=ft(e[i],n[1]):r[i]==null&&(r[i]=n[1])}),A(St(e),function(n){if(n.indexOf(\"on\")===0){var i=e[n];r[n]=J(i)?i:null}}),Z(e,\"draggable\")&&(r.draggable=e.draggable),e.name!=null&&(r.name=e.name),e.id!=null&&(r.id=e.id)}function XU(r){return r=V({},r),A([\"id\",\"parentId\",\"$action\",\"hv\",\"bounding\",\"textContent\",\"clipPath\"].concat(YC),function(e){delete r[e]}),r}function qU(r,e,t){var a=it(r).eventData;!r.silent&&!r.ignore&&!a&&(a=it(r).eventData={componentType:\"graphic\",componentIndex:e.componentIndex,name:r.name}),a&&(a.info=t.info)}function KU(r){r.registerComponentModel(YU),r.registerComponentView(ZU),r.registerPreprocessor(function(e){var t=e.graphic;F(t)?!t[0]||!t[0].elements?e.graphic=[{elements:t}]:e.graphic=[e.graphic[0]]:t&&!t.elements&&(e.graphic=[{elements:[t]}])})}var yw=[\"x\",\"y\",\"radius\",\"angle\",\"single\"],JU=[\"cartesian2d\",\"polar\",\"singleAxis\"];function QU(r){var e=r.get(\"coordinateSystem\");return dt(JU,e)>=0}function qa(r){return r+\"Axis\"}function jU(r,e){var t=q(),a=[],n=q();r.eachComponent({mainType:\"dataZoom\",query:e},function(f){n.get(f.uid)||s(f)});var i;do i=!1,r.eachComponent(\"dataZoom\",o);while(i);function o(f){!n.get(f.uid)&&l(f)&&(s(f),i=!0)}function s(f){n.set(f.uid,!0),a.push(f),u(f)}function l(f){var h=!1;return f.eachTargetAxis(function(v,c){var d=t.get(v);d&&d[c]&&(h=!0)}),h}function u(f){f.eachTargetAxis(function(h,v){(t.get(h)||t.set(h,[]))[v]=!0})}return a}function cL(r){var e=r.ecModel,t={infoList:[],infoMap:q()};return r.eachTargetAxis(function(a,n){var i=e.getComponent(qa(a),n);if(!!i){var o=i.getCoordSysModel();if(!!o){var s=o.uid,l=t.infoMap.get(s);l||(l={model:o,axisModels:[]},t.infoList.push(l),t.infoMap.set(s,l)),l.axisModels.push(i)}}}),t}var od=function(){function r(){this.indexList=[],this.indexMap=[]}return r.prototype.add=function(e){this.indexMap[e]||(this.indexList.push(e),this.indexMap[e]=!0)},r}(),tY=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t._autoThrottle=!0,t._noTarget=!0,t._rangePropMode=[\"percent\",\"percent\"],t}return e.prototype.init=function(t,a,n){var i=mw(t);this.settledOption=i,this.mergeDefaultAndTheme(t,n),this._doInit(i)},e.prototype.mergeOption=function(t){var a=mw(t);ht(this.option,t,!0),ht(this.settledOption,a,!0),this._doInit(a)},e.prototype._doInit=function(t){var a=this.option;this._setDefaultThrottle(t),this._updateRangeUse(t);var n=this.settledOption;A([[\"start\",\"startValue\"],[\"end\",\"endValue\"]],function(i,o){this._rangePropMode[o]===\"value\"&&(a[i[0]]=n[i[0]]=null)},this),this._resetTarget()},e.prototype._resetTarget=function(){var t=this.get(\"orient\",!0),a=this._targetAxisInfoMap=q(),n=this._fillSpecifiedTargetAxis(a);n?this._orient=t||this._makeAutoOrientByTargetAxis():(this._orient=t||\"horizontal\",this._fillAutoTargetAxisByOrient(a,this._orient)),this._noTarget=!0,a.each(function(i){i.indexList.length&&(this._noTarget=!1)},this)},e.prototype._fillSpecifiedTargetAxis=function(t){var a=!1;return A(yw,function(n){var i=this.getReferringComponents(qa(n),bk);if(!!i.specified){a=!0;var o=new od;A(i.models,function(s){o.add(s.componentIndex)}),t.set(n,o)}},this),a},e.prototype._fillAutoTargetAxisByOrient=function(t,a){var n=this.ecModel,i=!0;if(i){var o=a===\"vertical\"?\"y\":\"x\",s=n.findComponents({mainType:o+\"Axis\"});l(s,o)}if(i){var s=n.findComponents({mainType:\"singleAxis\",filter:function(f){return f.get(\"orient\",!0)===a}});l(s,\"single\")}function l(u,f){var h=u[0];if(!!h){var v=new od;if(v.add(h.componentIndex),t.set(f,v),i=!1,f===\"x\"||f===\"y\"){var c=h.getReferringComponents(\"grid\",Qt).models[0];c&&A(u,function(d){h.componentIndex!==d.componentIndex&&c===d.getReferringComponents(\"grid\",Qt).models[0]&&v.add(d.componentIndex)})}}}i&&A(yw,function(u){if(!!i){var f=n.findComponents({mainType:qa(u),filter:function(v){return v.get(\"type\",!0)===\"category\"}});if(f[0]){var h=new od;h.add(f[0].componentIndex),t.set(u,h),i=!1}}},this)},e.prototype._makeAutoOrientByTargetAxis=function(){var t;return this.eachTargetAxis(function(a){!t&&(t=a)},this),t===\"y\"?\"vertical\":\"horizontal\"},e.prototype._setDefaultThrottle=function(t){if(t.hasOwnProperty(\"throttle\")&&(this._autoThrottle=!1),this._autoThrottle){var a=this.ecModel.option;this.option.throttle=a.animation&&a.animationDurationUpdate>0?100:20}},e.prototype._updateRangeUse=function(t){var a=this._rangePropMode,n=this.get(\"rangeMode\");A([[\"start\",\"startValue\"],[\"end\",\"endValue\"]],function(i,o){var s=t[i[0]]!=null,l=t[i[1]]!=null;s&&!l?a[o]=\"percent\":!s&&l?a[o]=\"value\":n?a[o]=n[o]:s&&(a[o]=\"percent\")})},e.prototype.noTarget=function(){return this._noTarget},e.prototype.getFirstTargetAxisModel=function(){var t;return this.eachTargetAxis(function(a,n){t==null&&(t=this.ecModel.getComponent(qa(a),n))},this),t},e.prototype.eachTargetAxis=function(t,a){this._targetAxisInfoMap.each(function(n,i){A(n.indexList,function(o){t.call(a,i,o)})})},e.prototype.getAxisProxy=function(t,a){var n=this.getAxisModel(t,a);if(n)return n.__dzAxisProxy},e.prototype.getAxisModel=function(t,a){var n=this._targetAxisInfoMap.get(t);if(n&&n.indexMap[a])return this.ecModel.getComponent(qa(t),a)},e.prototype.setRawRange=function(t){var a=this.option,n=this.settledOption;A([[\"start\",\"startValue\"],[\"end\",\"endValue\"]],function(i){(t[i[0]]!=null||t[i[1]]!=null)&&(a[i[0]]=n[i[0]]=t[i[0]],a[i[1]]=n[i[1]]=t[i[1]])},this),this._updateRangeUse(t)},e.prototype.setCalculatedRange=function(t){var a=this.option;A([\"start\",\"startValue\",\"end\",\"endValue\"],function(n){a[n]=t[n]})},e.prototype.getPercentRange=function(){var t=this.findRepresentativeAxisProxy();if(t)return t.getDataPercentWindow()},e.prototype.getValueRange=function(t,a){if(t==null&&a==null){var n=this.findRepresentativeAxisProxy();if(n)return n.getDataValueWindow()}else return this.getAxisProxy(t,a).getDataValueWindow()},e.prototype.findRepresentativeAxisProxy=function(t){if(t)return t.__dzAxisProxy;for(var a,n=this._targetAxisInfoMap.keys(),i=0;i<n.length;i++)for(var o=n[i],s=this._targetAxisInfoMap.get(o),l=0;l<s.indexList.length;l++){var u=this.getAxisProxy(o,s.indexList[l]);if(u.hostedBy(this))return u;a||(a=u)}return a},e.prototype.getRangePropMode=function(){return this._rangePropMode.slice()},e.prototype.getOrient=function(){return this._orient},e.type=\"dataZoom\",e.dependencies=[\"xAxis\",\"yAxis\",\"radiusAxis\",\"angleAxis\",\"singleAxis\",\"series\",\"toolbox\"],e.defaultOption={z:4,filterMode:\"filter\",start:0,end:100},e}(Tt);function mw(r){var e={};return A([\"start\",\"end\",\"startValue\",\"endValue\",\"throttle\"],function(t){r.hasOwnProperty(t)&&(e[t]=r[t])}),e}var dl=tY,eY=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.type=\"dataZoom.select\",e}(dl),rY=eY,aY=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n,i){this.dataZoomModel=t,this.ecModel=a,this.api=n},e.type=\"dataZoom\",e}(Ut),cm=aY,nY=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.type=\"dataZoom.select\",e}(cm),iY=nY,to=A,_w=or,oY=function(){function r(e,t,a,n){this._dimName=e,this._axisIndex=t,this.ecModel=n,this._dataZoomModel=a}return r.prototype.hostedBy=function(e){return this._dataZoomModel===e},r.prototype.getDataValueWindow=function(){return this._valueWindow.slice()},r.prototype.getDataPercentWindow=function(){return this._percentWindow.slice()},r.prototype.getTargetSeriesModels=function(){var e=[];return this.ecModel.eachSeries(function(t){if(QU(t)){var a=qa(this._dimName),n=t.getReferringComponents(a,Qt).models[0];n&&this._axisIndex===n.componentIndex&&e.push(t)}},this),e},r.prototype.getAxisModel=function(){return this.ecModel.getComponent(this._dimName+\"Axis\",this._axisIndex)},r.prototype.getMinMaxSpan=function(){return at(this._minMaxSpan)},r.prototype.calculateDataWindow=function(e){var t=this._dataExtent,a=this.getAxisModel(),n=a.axis.scale,i=this._dataZoomModel.getRangePropMode(),o=[0,100],s=[],l=[],u;to([\"start\",\"end\"],function(v,c){var d=e[v],p=e[v+\"Value\"];i[c]===\"percent\"?(d==null&&(d=o[c]),p=n.parse(Rt(d,o,t))):(u=!0,p=p==null?t[c]:n.parse(p),d=Rt(p,t,o)),l[c]=p==null||isNaN(p)?t[c]:p,s[c]=d==null||isNaN(d)?o[c]:d}),_w(l),_w(s);var f=this._minMaxSpan;u?h(l,s,t,o,!1):h(s,l,o,t,!0);function h(v,c,d,p,g){var y=g?\"Span\":\"ValueSpan\";Li(0,v,d,\"all\",f[\"min\"+y],f[\"max\"+y]);for(var m=0;m<2;m++)c[m]=Rt(v[m],d,p,!0),g&&(c[m]=n.parse(c[m]))}return{valueWindow:l,percentWindow:s}},r.prototype.reset=function(e){if(e===this._dataZoomModel){var t=this.getTargetSeriesModels();this._dataExtent=sY(this,this._dimName,t),this._updateMinMaxSpan();var a=this.calculateDataWindow(e.settledOption);this._valueWindow=a.valueWindow,this._percentWindow=a.percentWindow,this._setAxisModel()}},r.prototype.filterData=function(e,t){if(e!==this._dataZoomModel)return;var a=this._dimName,n=this.getTargetSeriesModels(),i=e.get(\"filterMode\"),o=this._valueWindow;if(i===\"none\")return;to(n,function(l){var u=l.getData(),f=u.mapDimensionsAll(a);if(!!f.length){if(i===\"weakFilter\"){var h=u.getStore(),v=G(f,function(c){return u.getDimensionIndex(c)},u);u.filterSelf(function(c){for(var d,p,g,y=0;y<f.length;y++){var m=h.get(v[y],c),_=!isNaN(m),S=m<o[0],w=m>o[1];if(_&&!S&&!w)return!0;_&&(g=!0),S&&(d=!0),w&&(p=!0)}return g&&d&&p})}else to(f,function(c){if(i===\"empty\")l.setData(u=u.map(c,function(p){return s(p)?p:NaN}));else{var d={};d[c]=o,u.selectRange(d)}});to(f,function(c){u.setApproximateExtent(o,c)})}});function s(l){return l>=o[0]&&l<=o[1]}},r.prototype._updateMinMaxSpan=function(){var e=this._minMaxSpan={},t=this._dataZoomModel,a=this._dataExtent;to([\"min\",\"max\"],function(n){var i=t.get(n+\"Span\"),o=t.get(n+\"ValueSpan\");o!=null&&(o=this.getAxisModel().axis.scale.parse(o)),o!=null?i=Rt(a[0]+o,a,[0,100],!0):i!=null&&(o=Rt(i,[0,100],a,!0)-a[0]),e[n+\"Span\"]=i,e[n+\"ValueSpan\"]=o},this)},r.prototype._setAxisModel=function(){var e=this.getAxisModel(),t=this._percentWindow,a=this._valueWindow;if(!!t){var n=S2(a,[0,500]);n=Math.min(n,20);var i=e.axis.scale.rawExtentInfo;t[0]!==0&&i.setDeterminedMinMax(\"min\",+a[0].toFixed(n)),t[1]!==100&&i.setDeterminedMinMax(\"max\",+a[1].toFixed(n)),i.freeze()}},r}();function sY(r,e,t){var a=[1/0,-1/0];to(t,function(o){kN(a,o.getData(),e)});var n=r.getAxisModel(),i=DA(n.axis.scale,n,a).calculate();return[i.min,i.max]}var lY=oY,uY={getTargetSeries:function(r){function e(n){r.eachComponent(\"dataZoom\",function(i){i.eachTargetAxis(function(o,s){var l=r.getComponent(qa(o),s);n(o,s,l,i)})})}e(function(n,i,o,s){o.__dzAxisProxy=null});var t=[];e(function(n,i,o,s){o.__dzAxisProxy||(o.__dzAxisProxy=new lY(n,i,s,r),t.push(o.__dzAxisProxy))});var a=q();return A(t,function(n){A(n.getTargetSeriesModels(),function(i){a.set(i.uid,i)})}),a},overallReset:function(r,e){r.eachComponent(\"dataZoom\",function(t){t.eachTargetAxis(function(a,n){t.getAxisProxy(a,n).reset(t)}),t.eachTargetAxis(function(a,n){t.getAxisProxy(a,n).filterData(t,e)})}),r.eachComponent(\"dataZoom\",function(t){var a=t.findRepresentativeAxisProxy();if(a){var n=a.getDataPercentWindow(),i=a.getDataValueWindow();t.setCalculatedRange({start:n[0],end:n[1],startValue:i[0],endValue:i[1]})}})}},fY=uY;function hY(r){r.registerAction(\"dataZoom\",function(e,t){var a=jU(t,e);A(a,function(n){n.setRawRange({start:e.start,end:e.end,startValue:e.startValue,endValue:e.endValue})})})}var Sw=!1;function dm(r){Sw||(Sw=!0,r.registerProcessor(r.PRIORITY.PROCESSOR.FILTER,fY),hY(r),r.registerSubTypeDefaulter(\"dataZoom\",function(){return\"slider\"}))}function vY(r){r.registerComponentModel(rY),r.registerComponentView(iY),dm(r)}var rr=function(){function r(){}return r}(),dL={};function eo(r,e){dL[r]=e}function pL(r){return dL[r]}var cY=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.optionUpdated=function(){r.prototype.optionUpdated.apply(this,arguments);var t=this.ecModel;A(this.option.feature,function(a,n){var i=pL(n);i&&(i.getDefaultOption&&(i.defaultOption=i.getDefaultOption(t)),ht(a,i.defaultOption))})},e.type=\"toolbox\",e.layoutMode={type:\"box\",ignoreSize:!0},e.defaultOption={show:!0,z:6,orient:\"horizontal\",left:\"right\",top:\"top\",backgroundColor:\"transparent\",borderColor:\"#ccc\",borderRadius:0,borderWidth:0,padding:5,itemSize:15,itemGap:8,showTitle:!0,iconStyle:{borderColor:\"#666\",color:\"none\"},emphasis:{iconStyle:{borderColor:\"#3E98C5\"}},tooltip:{show:!1,position:\"bottom\"}},e}(Tt),dY=cY;function pY(r,e,t){var a=e.getBoxLayoutParams(),n=e.get(\"padding\"),i={width:t.getWidth(),height:t.getHeight()},o=re(a,i,n);ui(e.get(\"orient\"),r,e.get(\"itemGap\"),o.width,o.height),kh(r,a,i,n)}function gL(r,e){var t=Io(e.get(\"padding\")),a=e.getItemStyle([\"color\",\"opacity\"]);return a.fill=e.get(\"backgroundColor\"),r=new bt({shape:{x:r.x-t[3],y:r.y-t[0],width:r.width+t[1]+t[3],height:r.height+t[0]+t[2],r:e.get(\"borderRadius\")},style:a,silent:!0,z2:-1}),r}var gY=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.render=function(t,a,n,i){var o=this.group;if(o.removeAll(),!t.get(\"show\"))return;var s=+t.get(\"itemSize\"),l=t.get(\"orient\")===\"vertical\",u=t.get(\"feature\")||{},f=this._features||(this._features={}),h=[];A(u,function(d,p){h.push(p)}),new xa(this._featureNames||[],h).add(v).update(v).remove(ot(v,null)).execute(),this._featureNames=h;function v(d,p){var g=h[d],y=h[p],m=u[g],_=new Vt(m,t,t.ecModel),S;if(i&&i.newTitle!=null&&i.featureName===g&&(m.title=i.newTitle),g&&!y){if(yY(g))S={onclick:_.option.onclick,featureName:g};else{var w=pL(g);if(!w)return;S=new w}f[g]=S}else if(S=f[y],!S)return;S.uid=Lo(\"toolbox-feature\"),S.model=_,S.ecModel=a,S.api=n;var x=S instanceof rr;if(!g&&y){x&&S.dispose&&S.dispose(a,n);return}if(!_.get(\"show\")||x&&S.unusable){x&&S.remove&&S.remove(a,n);return}c(_,S,g),_.setIconStatus=function(b,C){var T=this.option,D=this.iconPaths;T.iconStatus=T.iconStatus||{},T.iconStatus[b]=C,D[b]&&(C===\"emphasis\"?_a:Sa)(D[b])},S instanceof rr&&S.render&&S.render(_,a,n,i)}function c(d,p,g){var y=d.getModel(\"iconStyle\"),m=d.getModel([\"emphasis\",\"iconStyle\"]),_=p instanceof rr&&p.getIcons?p.getIcons():d.get(\"icon\"),S=d.get(\"title\")||{},w,x;U(_)?(w={},w[g]=_):w=_,U(S)?(x={},x[g]=S):x=S;var b=d.iconPaths={};A(w,function(C,T){var D=Al(C,{},{x:-s/2,y:-s/2,width:s,height:s});D.setStyle(y.getItemStyle());var M=D.ensureState(\"emphasis\");M.style=m.getItemStyle();var L=new Dt({style:{text:x[T],align:m.get(\"textAlign\"),borderRadius:m.get(\"textBorderRadius\"),padding:m.get(\"textPadding\"),fill:null},ignore:!0});D.setTextContent(L),Do({el:D,componentModel:t,itemName:T,formatterParamsExtra:{title:x[T]}}),D.__title=x[T],D.on(\"mouseover\",function(){var I=m.getItemStyle(),P=l?t.get(\"right\")==null&&t.get(\"left\")!==\"right\"?\"right\":\"left\":t.get(\"bottom\")==null&&t.get(\"top\")!==\"bottom\"?\"bottom\":\"top\";L.setStyle({fill:m.get(\"textFill\")||I.fill||I.stroke||\"#000\",backgroundColor:m.get(\"textBackgroundColor\")}),D.setTextConfig({position:m.get(\"textPosition\")||P}),L.ignore=!t.get(\"showTitle\"),n.enterEmphasis(this)}).on(\"mouseout\",function(){d.get([\"iconStatus\",T])!==\"emphasis\"&&n.leaveEmphasis(this),L.hide()}),(d.get([\"iconStatus\",T])===\"emphasis\"?_a:Sa)(D),o.add(D),D.on(\"click\",Y(p.onclick,p,a,n,T)),b[T]=D})}pY(o,t,n),o.add(gL(o.getBoundingRect(),t)),l||o.eachChild(function(d){var p=d.__title,g=d.ensureState(\"emphasis\"),y=g.textConfig||(g.textConfig={}),m=d.getTextContent(),_=m&&m.ensureState(\"emphasis\");if(_&&!J(_)&&p){var S=_.style||(_.style={}),w=xl(p,Dt.makeFont(S)),x=d.x+o.x,b=d.y+o.y+s,C=!1;b+w.height>n.getHeight()&&(y.position=\"top\",C=!0);var T=C?-5-w.height:s+10;x+w.width/2>n.getWidth()?(y.position=[\"100%\",T],S.align=\"right\"):x-w.width/2<0&&(y.position=[0,T],S.align=\"left\")}})},e.prototype.updateView=function(t,a,n,i){A(this._features,function(o){o instanceof rr&&o.updateView&&o.updateView(o.model,a,n,i)})},e.prototype.remove=function(t,a){A(this._features,function(n){n instanceof rr&&n.remove&&n.remove(t,a)}),this.group.removeAll()},e.prototype.dispose=function(t,a){A(this._features,function(n){n instanceof rr&&n.dispose&&n.dispose(t,a)})},e.type=\"toolbox\",e}(Ut);function yY(r){return r.indexOf(\"my\")===0}var mY=gY,_Y=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.onclick=function(t,a){var n=this.model,i=n.get(\"name\")||t.get(\"title.0.text\")||\"echarts\",o=a.getZr().painter.getType()===\"svg\",s=o?\"svg\":n.get(\"type\",!0)||\"png\",l=a.getConnectedDataURL({type:s,backgroundColor:n.get(\"backgroundColor\",!0)||t.get(\"backgroundColor\")||\"#fff\",connectedBackgroundColor:n.get(\"connectedBackgroundColor\"),excludeComponents:n.get(\"excludeComponents\"),pixelRatio:n.get(\"pixelRatio\")}),u=At.browser;if(J(MouseEvent)&&(u.newEdge||!u.ie&&!u.edge)){var f=document.createElement(\"a\");f.download=i+\".\"+s,f.target=\"_blank\",f.href=l;var h=new MouseEvent(\"click\",{view:document.defaultView,bubbles:!0,cancelable:!1});f.dispatchEvent(h)}else if(window.navigator.msSaveOrOpenBlob||o){var v=l.split(\",\"),c=v[0].indexOf(\"base64\")>-1,d=o?decodeURIComponent(v[1]):v[1];c&&(d=window.atob(d));var p=i+\".\"+s;if(window.navigator.msSaveOrOpenBlob){for(var g=d.length,y=new Uint8Array(g);g--;)y[g]=d.charCodeAt(g);var m=new Blob([y]);window.navigator.msSaveOrOpenBlob(m,p)}else{var _=document.createElement(\"iframe\");document.body.appendChild(_);var S=_.contentWindow,w=S.document;w.open(\"image/svg+xml\",\"replace\"),w.write(d),w.close(),S.focus(),w.execCommand(\"SaveAs\",!0,p),document.body.removeChild(_)}}else{var x=n.get(\"lang\"),b='<body style=\"margin:0;\"><img src=\"'+l+'\" style=\"max-width:100%;\" title=\"'+(x&&x[0]||\"\")+'\" /></body>',C=window.open();C.document.write(b),C.document.title=i}},e.getDefaultOption=function(t){var a={show:!0,icon:\"M4.7,22.9L29.3,45.5L54.7,23.4M4.6,43.6L4.6,58L53.8,58L53.8,43.6M29.2,45.1L29.2,0\",title:t.getLocaleModel().get([\"toolbox\",\"saveAsImage\",\"title\"]),type:\"png\",connectedBackgroundColor:\"#fff\",name:\"\",excludeComponents:[\"toolbox\"],lang:t.getLocaleModel().get([\"toolbox\",\"saveAsImage\",\"lang\"])};return a},e}(rr),SY=_Y,xw=\"__ec_magicType_stack__\",xY=[[\"line\",\"bar\"],[\"stack\"]],wY=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.getIcons=function(){var t=this.model,a=t.get(\"icon\"),n={};return A(t.get(\"type\"),function(i){a[i]&&(n[i]=a[i])}),n},e.getDefaultOption=function(t){var a={show:!0,type:[],icon:{line:\"M4.1,28.9h7.1l9.3-22l7.4,38l9.7-19.7l3,12.8h14.9M4.1,58h51.4\",bar:\"M6.7,22.9h10V48h-10V22.9zM24.9,13h10v35h-10V13zM43.2,2h10v46h-10V2zM3.1,58h53.7\",stack:\"M8.2,38.4l-8.4,4.1l30.6,15.3L60,42.5l-8.1-4.1l-21.5,11L8.2,38.4z M51.9,30l-8.1,4.2l-13.4,6.9l-13.9-6.9L8.2,30l-8.4,4.2l8.4,4.2l22.2,11l21.5-11l8.1-4.2L51.9,30z M51.9,21.7l-8.1,4.2L35.7,30l-5.3,2.8L24.9,30l-8.4-4.1l-8.3-4.2l-8.4,4.2L8.2,30l8.3,4.2l13.9,6.9l13.4-6.9l8.1-4.2l8.1-4.1L51.9,21.7zM30.4,2.2L-0.2,17.5l8.4,4.1l8.3,4.2l8.4,4.2l5.5,2.7l5.3-2.7l8.1-4.2l8.1-4.2l8.1-4.1L30.4,2.2z\"},title:t.getLocaleModel().get([\"toolbox\",\"magicType\",\"title\"]),option:{},seriesIndex:{}};return a},e.prototype.onclick=function(t,a,n){var i=this.model,o=i.get([\"seriesIndex\",n]);if(!!ww[n]){var s={series:[]},l=function(h){var v=h.subType,c=h.id,d=ww[n](v,c,h,i);d&&(tt(d,h.option),s.series.push(d));var p=h.coordinateSystem;if(p&&p.type===\"cartesian2d\"&&(n===\"line\"||n===\"bar\")){var g=p.getAxesByScale(\"ordinal\")[0];if(g){var y=g.dim,m=y+\"Axis\",_=h.getReferringComponents(m,Qt).models[0],S=_.componentIndex;s[m]=s[m]||[];for(var w=0;w<=S;w++)s[m][S]=s[m][S]||{};s[m][S].boundaryGap=n===\"bar\"}}};A(xY,function(h){dt(h,n)>=0&&A(h,function(v){i.setIconStatus(v,\"normal\")})}),i.setIconStatus(n,\"emphasis\"),t.eachComponent({mainType:\"series\",query:o==null?null:{seriesIndex:o}},l);var u,f=n;n===\"stack\"&&(u=ht({stack:i.option.title.tiled,tiled:i.option.title.stack},i.option.title),i.get([\"iconStatus\",n])!==\"emphasis\"&&(f=\"tiled\")),a.dispatchAction({type:\"changeMagicType\",currentType:f,newOption:s,newTitle:u,featureName:\"magicType\"})}},e}(rr),ww={line:function(r,e,t,a){if(r===\"bar\")return ht({id:e,type:\"line\",data:t.get(\"data\"),stack:t.get(\"stack\"),markPoint:t.get(\"markPoint\"),markLine:t.get(\"markLine\")},a.get([\"option\",\"line\"])||{},!0)},bar:function(r,e,t,a){if(r===\"line\")return ht({id:e,type:\"bar\",data:t.get(\"data\"),stack:t.get(\"stack\"),markPoint:t.get(\"markPoint\"),markLine:t.get(\"markLine\")},a.get([\"option\",\"bar\"])||{},!0)},stack:function(r,e,t,a){var n=t.get(\"stack\")===xw;if(r===\"line\"||r===\"bar\")return a.setIconStatus(\"stack\",n?\"normal\":\"emphasis\"),ht({id:e,stack:n?\"\":xw},a.get([\"option\",\"stack\"])||{},!0)}};ta({type:\"changeMagicType\",event:\"magicTypeChanged\",update:\"prepareAndUpdate\"},function(r,e){e.mergeOption(r.newOption)});var bY=wY,Jh=new Array(60).join(\"-\"),So=\"\t\";function CY(r){var e={},t=[],a=[];return r.eachRawSeries(function(n){var i=n.coordinateSystem;if(i&&(i.type===\"cartesian2d\"||i.type===\"polar\")){var o=i.getBaseAxis();if(o.type===\"category\"){var s=o.dim+\"_\"+o.index;e[s]||(e[s]={categoryAxis:o,valueAxis:i.getOtherAxis(o),series:[]},a.push({axisDim:o.dim,axisIndex:o.index})),e[s].series.push(n)}else t.push(n)}else t.push(n)}),{seriesGroupByCategoryAxis:e,other:t,meta:a}}function TY(r){var e=[];return A(r,function(t,a){var n=t.categoryAxis,i=t.valueAxis,o=i.dim,s=[\" \"].concat(G(t.series,function(c){return c.name})),l=[n.model.getCategories()];A(t.series,function(c){var d=c.getRawData();l.push(c.getRawData().mapArray(d.mapDimension(o),function(p){return p}))});for(var u=[s.join(So)],f=0;f<l[0].length;f++){for(var h=[],v=0;v<l.length;v++)h.push(l[v][f]);u.push(h.join(So))}e.push(u.join(`\n`))}),e.join(`\n\n`+Jh+`\n\n`)}function AY(r){return G(r,function(e){var t=e.getRawData(),a=[e.name],n=[];return t.each(t.dimensions,function(){for(var i=arguments.length,o=arguments[i-1],s=t.getName(o),l=0;l<i-1;l++)n[l]=arguments[l];a.push((s?s+So:\"\")+n.join(So))}),a.join(`\n`)}).join(`\n\n`+Jh+`\n\n`)}function DY(r){var e=CY(r);return{value:Et([TY(e.seriesGroupByCategoryAxis),AY(e.other)],function(t){return!!t.replace(/[\\n\\t\\s]/g,\"\")}).join(`\n\n`+Jh+`\n\n`),meta:e.meta}}function ah(r){return r.replace(/^\\s\\s*/,\"\").replace(/\\s\\s*$/,\"\")}function MY(r){var e=r.slice(0,r.indexOf(`\n`));if(e.indexOf(So)>=0)return!0}var Qp=new RegExp(\"[\"+So+\"]+\",\"g\");function LY(r){for(var e=r.split(/\\n+/g),t=ah(e.shift()).split(Qp),a=[],n=G(t,function(l){return{name:l,data:[]}}),i=0;i<e.length;i++){var o=ah(e[i]).split(Qp);a.push(o.shift());for(var s=0;s<o.length;s++)n[s]&&(n[s].data[i]=o[s])}return{series:n,categories:a}}function IY(r){for(var e=r.split(/\\n+/g),t=ah(e.shift()),a=[],n=0;n<e.length;n++){var i=ah(e[n]);if(!!i){var o=i.split(Qp),s=\"\",l=void 0,u=!1;isNaN(o[0])?(u=!0,s=o[0],o=o.slice(1),a[n]={name:s,value:[]},l=a[n].value):l=a[n]=[];for(var f=0;f<o.length;f++)l.push(+o[f]);l.length===1&&(u?a[n].value=l[0]:a[n]=l[0])}}return{name:t,data:a}}function PY(r,e){var t=r.split(new RegExp(`\n*`+Jh+`\n*`,\"g\")),a={series:[]};return A(t,function(n,i){if(MY(n)){var o=LY(n),s=e[i],l=s.axisDim+\"Axis\";s&&(a[l]=a[l]||[],a[l][s.axisIndex]={data:o.categories},a.series=a.series.concat(o.series))}else{var o=IY(n);a.series.push(o)}}),a}var RY=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.onclick=function(t,a){setTimeout(function(){a.dispatchAction({type:\"hideTip\"})});var n=a.getDom(),i=this.model;this._dom&&n.removeChild(this._dom);var o=document.createElement(\"div\");o.style.cssText=\"position:absolute;top:0;bottom:0;left:0;right:0;padding:5px\",o.style.backgroundColor=i.get(\"backgroundColor\")||\"#fff\";var s=document.createElement(\"h4\"),l=i.get(\"lang\")||[];s.innerHTML=l[0]||i.get(\"title\"),s.style.cssText=\"margin:10px 20px\",s.style.color=i.get(\"textColor\");var u=document.createElement(\"div\"),f=document.createElement(\"textarea\");u.style.cssText=\"overflow:auto\";var h=i.get(\"optionToContent\"),v=i.get(\"contentToOption\"),c=DY(t);if(J(h)){var d=h(a.getOption());U(d)?u.innerHTML=d:Hs(d)&&u.appendChild(d)}else{f.readOnly=i.get(\"readOnly\");var p=f.style;p.cssText=\"display:block;width:100%;height:100%;font-family:monospace;font-size:14px;line-height:1.6rem;resize:none;box-sizing:border-box;outline:none\",p.color=i.get(\"textColor\"),p.borderColor=i.get(\"textareaBorderColor\"),p.backgroundColor=i.get(\"textareaColor\"),f.value=c.value,u.appendChild(f)}var g=c.meta,y=document.createElement(\"div\");y.style.cssText=\"position:absolute;bottom:5px;left:0;right:0\";var m=\"float:right;margin-right:20px;border:none;cursor:pointer;padding:2px 5px;font-size:12px;border-radius:3px\",_=document.createElement(\"div\"),S=document.createElement(\"div\");m+=\";background-color:\"+i.get(\"buttonColor\"),m+=\";color:\"+i.get(\"buttonTextColor\");var w=this;function x(){n.removeChild(o),w._dom=null}Ed(_,\"click\",x),Ed(S,\"click\",function(){if(v==null&&h!=null||v!=null&&h==null){x();return}var b;try{J(v)?b=v(u,a.getOption()):b=PY(f.value,g)}catch(C){throw x(),new Error(\"Data view format error \"+C)}b&&a.dispatchAction({type:\"changeDataView\",newOption:b}),x()}),_.innerHTML=l[1],S.innerHTML=l[2],S.style.cssText=_.style.cssText=m,!i.get(\"readOnly\")&&y.appendChild(S),y.appendChild(_),o.appendChild(s),o.appendChild(u),o.appendChild(y),u.style.height=n.clientHeight-80+\"px\",n.appendChild(o),this._dom=o},e.prototype.remove=function(t,a){this._dom&&a.getDom().removeChild(this._dom)},e.prototype.dispose=function(t,a){this.remove(t,a)},e.getDefaultOption=function(t){var a={show:!0,readOnly:!1,optionToContent:null,contentToOption:null,icon:\"M17.5,17.3H33 M17.5,17.3H33 M45.4,29.5h-28 M11.5,2v56H51V14.8L38.4,2H11.5z M38.4,2.2v12.7H51 M45.4,41.7h-28\",title:t.getLocaleModel().get([\"toolbox\",\"dataView\",\"title\"]),lang:t.getLocaleModel().get([\"toolbox\",\"dataView\",\"lang\"]),backgroundColor:\"#fff\",textColor:\"#000\",textareaColor:\"#fff\",textareaBorderColor:\"#333\",buttonColor:\"#c23531\",buttonTextColor:\"#fff\"};return a},e}(rr);function EY(r,e){return G(r,function(t,a){var n=e&&e[a];if(et(n)&&!F(n)){var i=et(t)&&!F(t);i||(t={value:t});var o=n.name!=null&&t.name==null;return t=tt(t,n),o&&delete t.name,t}else return t})}ta({type:\"changeDataView\",event:\"dataViewChanged\",update:\"prepareAndUpdate\"},function(r,e){var t=[];A(r.newOption.series,function(a){var n=e.getSeriesByName(a.name)[0];if(!n)t.push(V({type:\"scatter\"},a));else{var i=n.get(\"data\");t.push({name:a.name,data:EY(a.data,i)})}}),e.mergeOption(tt({series:t},r.newOption))});var kY=RY,yL=A,mL=Ct();function OY(r,e){var t=pm(r);yL(e,function(a,n){for(var i=t.length-1;i>=0;i--){var o=t[i];if(o[n])break}if(i<0){var s=r.queryComponents({mainType:\"dataZoom\",subType:\"select\",id:n})[0];if(s){var l=s.getPercentRange();t[0][n]={dataZoomId:n,start:l[0],end:l[1]}}}}),t.push(e)}function BY(r){var e=pm(r),t=e[e.length-1];e.length>1&&e.pop();var a={};return yL(t,function(n,i){for(var o=e.length-1;o>=0;o--)if(n=e[o][i],n){a[i]=n;break}}),a}function NY(r){mL(r).snapshots=null}function VY(r){return pm(r).length}function pm(r){var e=mL(r);return e.snapshots||(e.snapshots=[{}]),e.snapshots}var zY=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.onclick=function(t,a){NY(t),a.dispatchAction({type:\"restore\",from:this.uid})},e.getDefaultOption=function(t){var a={show:!0,icon:\"M3.8,33.4 M47,18.9h9.8V8.7 M56.3,20.1 C52.1,9,40.5,0.6,26.8,2.1C12.6,3.7,1.6,16.2,2.1,30.6 M13,41.1H3.1v10.2 M3.7,39.9c4.2,11.1,15.8,19.5,29.5,18 c14.2-1.6,25.2-14.1,24.7-28.5\",title:t.getLocaleModel().get([\"toolbox\",\"restore\",\"title\"])};return a},e}(rr);ta({type:\"restore\",event:\"restore\",update:\"prepareAndUpdate\"},function(r,e){e.resetOption(\"recreate\")});var FY=zY,GY=[\"grid\",\"xAxis\",\"yAxis\",\"geo\",\"graph\",\"polar\",\"radiusAxis\",\"angleAxis\",\"bmap\"],HY=function(){function r(e,t,a){var n=this;this._targetInfoList=[];var i=bw(t,e);A(WY,function(o,s){(!a||!a.include||dt(a.include,s)>=0)&&o(i,n._targetInfoList)})}return r.prototype.setOutputRanges=function(e,t){return this.matchOutputRanges(e,t,function(a,n,i){if((a.coordRanges||(a.coordRanges=[])).push(n),!a.coordRange){a.coordRange=n;var o=sd[a.brushType](0,i,n);a.__rangeOffset={offset:Dw[a.brushType](o.values,a.range,[1,1]),xyMinMax:o.xyMinMax}}}),e},r.prototype.matchOutputRanges=function(e,t,a){A(e,function(n){var i=this.findTargetInfo(n,t);i&&i!==!0&&A(i.coordSyses,function(o){var s=sd[n.brushType](1,o,n.range,!0);a(n,s.values,o,t)})},this)},r.prototype.setInputRanges=function(e,t){A(e,function(a){var n=this.findTargetInfo(a,t);if(a.range=a.range||[],n&&n!==!0){a.panelId=n.panelId;var i=sd[a.brushType](0,n.coordSys,a.coordRange),o=a.__rangeOffset;a.range=o?Dw[a.brushType](i.values,o.offset,$Y(i.xyMinMax,o.xyMinMax)):i.values}},this)},r.prototype.makePanelOpts=function(e,t){return G(this._targetInfoList,function(a){var n=a.getPanelRect();return{panelId:a.panelId,defaultBrushType:t?t(a):null,clipPath:fM(n),isTargetByCursor:vM(n,e,a.coordSysModel),getLinearBrushOtherExtent:hM(n)}})},r.prototype.controlSeries=function(e,t,a){var n=this.findTargetInfo(e,a);return n===!0||n&&dt(n.coordSyses,t.coordinateSystem)>=0},r.prototype.findTargetInfo=function(e,t){for(var a=this._targetInfoList,n=bw(t,e),i=0;i<a.length;i++){var o=a[i],s=e.panelId;if(s){if(o.panelId===s)return o}else for(var l=0;l<Cw.length;l++)if(Cw[l](n,o))return o}return!0},r}();function jp(r){return r[0]>r[1]&&r.reverse(),r}function bw(r,e){return Ls(r,e,{includeMainTypes:GY})}var WY={grid:function(r,e){var t=r.xAxisModels,a=r.yAxisModels,n=r.gridModels,i=q(),o={},s={};!t&&!a&&!n||(A(t,function(l){var u=l.axis.grid.model;i.set(u.id,u),o[u.id]=!0}),A(a,function(l){var u=l.axis.grid.model;i.set(u.id,u),s[u.id]=!0}),A(n,function(l){i.set(l.id,l),o[l.id]=!0,s[l.id]=!0}),i.each(function(l){var u=l.coordinateSystem,f=[];A(u.getCartesians(),function(h,v){(dt(t,h.getAxis(\"x\").model)>=0||dt(a,h.getAxis(\"y\").model)>=0)&&f.push(h)}),e.push({panelId:\"grid--\"+l.id,gridModel:l,coordSysModel:l,coordSys:f[0],coordSyses:f,getPanelRect:Tw.grid,xAxisDeclared:o[l.id],yAxisDeclared:s[l.id]})}))},geo:function(r,e){A(r.geoModels,function(t){var a=t.coordinateSystem;e.push({panelId:\"geo--\"+t.id,geoModel:t,coordSysModel:t,coordSys:a,coordSyses:[a],getPanelRect:Tw.geo})})}},Cw=[function(r,e){var t=r.xAxisModel,a=r.yAxisModel,n=r.gridModel;return!n&&t&&(n=t.axis.grid.model),!n&&a&&(n=a.axis.grid.model),n&&n===e.gridModel},function(r,e){var t=r.geoModel;return t&&t===e.geoModel}],Tw={grid:function(){return this.coordSys.master.getRect().clone()},geo:function(){var r=this.coordSys,e=r.getBoundingRect().clone();return e.applyTransform(li(r)),e}},sd={lineX:ot(Aw,0),lineY:ot(Aw,1),rect:function(r,e,t,a){var n=r?e.pointToData([t[0][0],t[1][0]],a):e.dataToPoint([t[0][0],t[1][0]],a),i=r?e.pointToData([t[0][1],t[1][1]],a):e.dataToPoint([t[0][1],t[1][1]],a),o=[jp([n[0],i[0]]),jp([n[1],i[1]])];return{values:o,xyMinMax:o}},polygon:function(r,e,t,a){var n=[[1/0,-1/0],[1/0,-1/0]],i=G(t,function(o){var s=r?e.pointToData(o,a):e.dataToPoint(o,a);return n[0][0]=Math.min(n[0][0],s[0]),n[1][0]=Math.min(n[1][0],s[1]),n[0][1]=Math.max(n[0][1],s[0]),n[1][1]=Math.max(n[1][1],s[1]),s});return{values:i,xyMinMax:n}}};function Aw(r,e,t,a){var n=t.getAxis([\"x\",\"y\"][r]),i=jp(G([0,1],function(s){return e?n.coordToData(n.toLocalCoord(a[s]),!0):n.toGlobalCoord(n.dataToCoord(a[s]))})),o=[];return o[r]=i,o[1-r]=[NaN,NaN],{values:i,xyMinMax:o}}var Dw={lineX:ot(Mw,0),lineY:ot(Mw,1),rect:function(r,e,t){return[[r[0][0]-t[0]*e[0][0],r[0][1]-t[0]*e[0][1]],[r[1][0]-t[1]*e[1][0],r[1][1]-t[1]*e[1][1]]]},polygon:function(r,e,t){return G(r,function(a,n){return[a[0]-t[0]*e[n][0],a[1]-t[1]*e[n][1]]})}};function Mw(r,e,t,a){return[e[0]-a[r]*t[0],e[1]-a[r]*t[1]]}function $Y(r,e){var t=Lw(r),a=Lw(e),n=[t[0]/a[0],t[1]/a[1]];return isNaN(n[0])&&(n[0]=1),isNaN(n[1])&&(n[1]=1),n}function Lw(r){return r?[r[0][1]-r[0][0],r[1][1]-r[1][0]]:[NaN,NaN]}var gm=HY,tg=A,UY=mk(\"toolbox-dataZoom_\"),YY=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.render=function(t,a,n,i){this._brushController||(this._brushController=new Uy(n.getZr()),this._brushController.on(\"brush\",Y(this._onBrush,this)).mount()),qY(t,a,this,i,n),XY(t,a)},e.prototype.onclick=function(t,a,n){ZY[n].call(this)},e.prototype.remove=function(t,a){this._brushController&&this._brushController.unmount()},e.prototype.dispose=function(t,a){this._brushController&&this._brushController.dispose()},e.prototype._onBrush=function(t){var a=t.areas;if(!t.isEnd||!a.length)return;var n={},i=this.ecModel;this._brushController.updateCovers([]);var o=new gm(ym(this.model),i,{include:[\"grid\"]});o.matchOutputRanges(a,i,function(u,f,h){if(h.type===\"cartesian2d\"){var v=u.brushType;v===\"rect\"?(s(\"x\",h,f[0]),s(\"y\",h,f[1])):s({lineX:\"x\",lineY:\"y\"}[v],h,f)}}),OY(i,n),this._dispatchZoomAction(n);function s(u,f,h){var v=f.getAxis(u),c=v.model,d=l(u,c,i),p=d.findRepresentativeAxisProxy(c).getMinMaxSpan();(p.minValueSpan!=null||p.maxValueSpan!=null)&&(h=Li(0,h.slice(),v.scale.getExtent(),0,p.minValueSpan,p.maxValueSpan)),d&&(n[d.id]={dataZoomId:d.id,startValue:h[0],endValue:h[1]})}function l(u,f,h){var v;return h.eachComponent({mainType:\"dataZoom\",subType:\"select\"},function(c){var d=c.getAxisModel(u,f.componentIndex);d&&(v=c)}),v}},e.prototype._dispatchZoomAction=function(t){var a=[];tg(t,function(n,i){a.push(at(n))}),a.length&&this.api.dispatchAction({type:\"dataZoom\",from:this.uid,batch:a})},e.getDefaultOption=function(t){var a={show:!0,filterMode:\"filter\",icon:{zoom:\"M0,13.5h26.9 M13.5,26.9V0 M32.1,13.5H58V58H13.5 V32.1\",back:\"M22,1.4L9.9,13.5l12.3,12.3 M10.3,13.5H54.9v44.6 H10.3v-26\"},title:t.getLocaleModel().get([\"toolbox\",\"dataZoom\",\"title\"]),brushStyle:{borderWidth:0,color:\"rgba(210,219,238,0.2)\"}};return a},e}(rr),ZY={zoom:function(){var r=!this._isZoomActive;this.api.dispatchAction({type:\"takeGlobalCursor\",key:\"dataZoomSelect\",dataZoomSelectActive:r})},back:function(){this._dispatchZoomAction(BY(this.ecModel))}};function ym(r){var e={xAxisIndex:r.get(\"xAxisIndex\",!0),yAxisIndex:r.get(\"yAxisIndex\",!0),xAxisId:r.get(\"xAxisId\",!0),yAxisId:r.get(\"yAxisId\",!0)};return e.xAxisIndex==null&&e.xAxisId==null&&(e.xAxisIndex=\"all\"),e.yAxisIndex==null&&e.yAxisId==null&&(e.yAxisIndex=\"all\"),e}function XY(r,e){r.setIconStatus(\"back\",VY(e)>1?\"emphasis\":\"normal\")}function qY(r,e,t,a,n){var i=t._isZoomActive;a&&a.type===\"takeGlobalCursor\"&&(i=a.key===\"dataZoomSelect\"?a.dataZoomSelectActive:!1),t._isZoomActive=i,r.setIconStatus(\"zoom\",i?\"emphasis\":\"normal\");var o=new gm(ym(r),e,{include:[\"grid\"]}),s=o.makePanelOpts(n,function(l){return l.xAxisDeclared&&!l.yAxisDeclared?\"lineX\":!l.xAxisDeclared&&l.yAxisDeclared?\"lineY\":\"rect\"});t._brushController.setPanels(s).enableBrush(i&&s.length?{brushType:\"auto\",brushStyle:r.getModel(\"brushStyle\").getItemStyle()}:!1)}Q3(\"dataZoom\",function(r){var e=r.getComponent(\"toolbox\",0),t=[\"feature\",\"dataZoom\"];if(!e||e.get(t)==null)return;var a=e.getModel(t),n=[],i=ym(a),o=Ls(r,i);tg(o.xAxisModels,function(l){return s(l,\"xAxis\",\"xAxisIndex\")}),tg(o.yAxisModels,function(l){return s(l,\"yAxis\",\"yAxisIndex\")});function s(l,u,f){var h=l.componentIndex,v={type:\"select\",$fromToolbox:!0,filterMode:a.get(\"filterMode\",!0)||\"filter\",id:UY+u+h};v[f]=h,n.push(v)}return n});var KY=YY;function JY(r){r.registerComponentModel(dY),r.registerComponentView(mY),eo(\"saveAsImage\",SY),eo(\"magicType\",bY),eo(\"dataView\",kY),eo(\"dataZoom\",KY),eo(\"restore\",FY),ct(vY)}var QY=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.type=\"tooltip\",e.dependencies=[\"axisPointer\"],e.defaultOption={z:60,show:!0,showContent:!0,trigger:\"item\",triggerOn:\"mousemove|click\",alwaysShowContent:!1,displayMode:\"single\",renderMode:\"auto\",confine:null,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:\"#fff\",shadowBlur:10,shadowColor:\"rgba(0, 0, 0, .2)\",shadowOffsetX:1,shadowOffsetY:2,borderRadius:4,borderWidth:1,padding:null,extraCssText:\"\",axisPointer:{type:\"line\",axis:\"auto\",animation:\"auto\",animationDurationUpdate:200,animationEasingUpdate:\"exponentialOut\",crossStyle:{color:\"#999\",width:1,type:\"dashed\",textStyle:{}}},textStyle:{color:\"#666\",fontSize:14}},e}(Tt),jY=QY;function _L(r){var e=r.get(\"confine\");return e!=null?!!e:r.get(\"renderMode\")===\"richText\"}function SL(r){if(!!At.domSupported){for(var e=document.documentElement.style,t=0,a=r.length;t<a;t++)if(r[t]in e)return r[t]}}var xL=SL([\"transform\",\"webkitTransform\",\"OTransform\",\"MozTransform\",\"msTransform\"]),tZ=SL([\"webkitTransition\",\"transition\",\"OTransition\",\"MozTransition\",\"msTransition\"]);function wL(r,e){if(!r)return e;e=$C(e,!0);var t=r.indexOf(e);return r=t===-1?e:\"-\"+r.slice(0,t)+\"-\"+e,r.toLowerCase()}function eZ(r,e){var t=r.currentStyle||document.defaultView&&document.defaultView.getComputedStyle(r);return t?e?t[e]:t:null}var rZ=wL(tZ,\"transition\"),mm=wL(xL,\"transform\"),aZ=\"position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;\"+(At.transform3dSupported?\"will-change:transform;\":\"\");function nZ(r){return r=r===\"left\"?\"right\":r===\"right\"?\"left\":r===\"top\"?\"bottom\":\"top\",r}function iZ(r,e,t){if(!U(t)||t===\"inside\")return\"\";var a=r.get(\"backgroundColor\"),n=r.get(\"borderWidth\");e=yi(e);var i=nZ(t),o=Math.max(Math.round(n)*1.5,6),s=\"\",l=mm+\":\",u;dt([\"left\",\"right\"],i)>-1?(s+=\"top:50%\",l+=\"translateY(-50%) rotate(\"+(u=i===\"left\"?-225:-45)+\"deg)\"):(s+=\"left:50%\",l+=\"translateX(-50%) rotate(\"+(u=i===\"top\"?225:45)+\"deg)\");var f=u*Math.PI/180,h=o+n,v=h*Math.abs(Math.cos(f))+h*Math.abs(Math.sin(f)),c=Math.round(((v-Math.SQRT2*n)/2+Math.SQRT2*n-(v-h)/2)*100)/100;s+=\";\"+i+\":-\"+c+\"px\";var d=e+\" solid \"+n+\"px;\",p=[\"position:absolute;width:\"+o+\"px;height:\"+o+\"px;z-index:-1;\",s+\";\"+l+\";\",\"border-bottom:\"+d,\"border-right:\"+d,\"background-color:\"+a+\";\"];return'<div style=\"'+p.join(\"\")+'\"></div>'}function oZ(r,e){var t=\"cubic-bezier(0.23,1,0.32,1)\",a=\" \"+r/2+\"s \"+t,n=\"opacity\"+a+\",visibility\"+a;return e||(a=\" \"+r+\"s \"+t,n+=At.transformSupported?\",\"+mm+a:\",left\"+a+\",top\"+a),rZ+\":\"+n}function Iw(r,e,t){var a=r.toFixed(0)+\"px\",n=e.toFixed(0)+\"px\";if(!At.transformSupported)return t?\"top:\"+n+\";left:\"+a+\";\":[[\"top\",n],[\"left\",a]];var i=At.transform3dSupported,o=\"translate\"+(i?\"3d\":\"\")+\"(\"+a+\",\"+n+(i?\",0\":\"\")+\")\";return t?\"top:0;left:0;\"+mm+\":\"+o+\";\":[[\"top\",0],[\"left\",0],[xL,o]]}function sZ(r){var e=[],t=r.get(\"fontSize\"),a=r.getTextColor();a&&e.push(\"color:\"+a),e.push(\"font:\"+r.getFont()),t&&e.push(\"line-height:\"+Math.round(t*3/2)+\"px\");var n=r.get(\"textShadowColor\"),i=r.get(\"textShadowBlur\")||0,o=r.get(\"textShadowOffsetX\")||0,s=r.get(\"textShadowOffsetY\")||0;return n&&i&&e.push(\"text-shadow:\"+o+\"px \"+s+\"px \"+i+\"px \"+n),A([\"decoration\",\"align\"],function(l){var u=r.get(l);u&&e.push(\"text-\"+l+\":\"+u)}),e.join(\";\")}function lZ(r,e,t){var a=[],n=r.get(\"transitionDuration\"),i=r.get(\"backgroundColor\"),o=r.get(\"shadowBlur\"),s=r.get(\"shadowColor\"),l=r.get(\"shadowOffsetX\"),u=r.get(\"shadowOffsetY\"),f=r.getModel(\"textStyle\"),h=AT(r,\"html\"),v=l+\"px \"+u+\"px \"+o+\"px \"+s;return a.push(\"box-shadow:\"+v),e&&n&&a.push(oZ(n,t)),i&&a.push(\"background-color:\"+i),A([\"width\",\"color\",\"radius\"],function(c){var d=\"border-\"+c,p=$C(d),g=r.get(p);g!=null&&a.push(d+\":\"+g+(c===\"color\"?\"\":\"px\"))}),a.push(sZ(f)),h!=null&&a.push(\"padding:\"+Io(h).join(\"px \")+\"px\"),a.join(\";\")+\";\"}function Pw(r,e,t,a,n){var i=e&&e.painter;if(t){var o=i&&i.getViewportRoot();o&&WR(r,o,document.body,a,n)}else{r[0]=a,r[1]=n;var s=i&&i.getViewportRootOffset();s&&(r[0]+=s.offsetLeft,r[1]+=s.offsetTop)}r[2]=r[0]/e.getWidth(),r[3]=r[1]/e.getHeight()}var uZ=function(){function r(e,t,a){if(this._show=!1,this._styleCoord=[0,0,0,0],this._enterable=!0,this._alwaysShowContent=!1,this._firstShow=!0,this._longHide=!0,At.wxa)return null;var n=document.createElement(\"div\");n.domBelongToZr=!0,this.el=n;var i=this._zr=t.getZr(),o=this._appendToBody=a&&a.appendToBody;Pw(this._styleCoord,i,o,t.getWidth()/2,t.getHeight()/2),o?document.body.appendChild(n):e.appendChild(n),this._container=e;var s=this;n.onmouseenter=function(){s._enterable&&(clearTimeout(s._hideTimeout),s._show=!0),s._inContent=!0},n.onmousemove=function(l){if(l=l||window.event,!s._enterable){var u=i.handler,f=i.painter.getViewportRoot();Je(f,l,!0),u.dispatch(\"mousemove\",l)}},n.onmouseleave=function(){s._inContent=!1,s._enterable&&s._show&&s.hideLater(s._hideDelay)}}return r.prototype.update=function(e){var t=this._container,a=eZ(t,\"position\"),n=t.style;n.position!==\"absolute\"&&a!==\"absolute\"&&(n.position=\"relative\");var i=e.get(\"alwaysShowContent\");i&&this._moveIfResized(),this._alwaysShowContent=i,this.el.className=e.get(\"className\")||\"\"},r.prototype.show=function(e,t){clearTimeout(this._hideTimeout),clearTimeout(this._longHideTimeout);var a=this.el,n=a.style,i=this._styleCoord;a.innerHTML?n.cssText=aZ+lZ(e,!this._firstShow,this._longHide)+Iw(i[0],i[1],!0)+(\"border-color:\"+yi(t)+\";\")+(e.get(\"extraCssText\")||\"\")+(\";pointer-events:\"+(this._enterable?\"auto\":\"none\")):n.display=\"none\",this._show=!0,this._firstShow=!1,this._longHide=!1},r.prototype.setContent=function(e,t,a,n,i){var o=this.el;if(e==null){o.innerHTML=\"\";return}var s=\"\";if(U(i)&&a.get(\"trigger\")===\"item\"&&!_L(a)&&(s=iZ(a,n,i)),U(e))o.innerHTML=e+s;else if(e){o.innerHTML=\"\",F(e)||(e=[e]);for(var l=0;l<e.length;l++)Hs(e[l])&&e[l].parentNode!==o&&o.appendChild(e[l]);if(s&&o.childNodes.length){var u=document.createElement(\"div\");u.innerHTML=s,o.appendChild(u)}}},r.prototype.setEnterable=function(e){this._enterable=e},r.prototype.getSize=function(){var e=this.el;return[e.offsetWidth,e.offsetHeight]},r.prototype.moveTo=function(e,t){var a=this._styleCoord;if(Pw(a,this._zr,this._appendToBody,e,t),a[0]!=null&&a[1]!=null){var n=this.el.style,i=Iw(a[0],a[1]);A(i,function(o){n[o[0]]=o[1]})}},r.prototype._moveIfResized=function(){var e=this._styleCoord[2],t=this._styleCoord[3];this.moveTo(e*this._zr.getWidth(),t*this._zr.getHeight())},r.prototype.hide=function(){var e=this,t=this.el.style;t.visibility=\"hidden\",t.opacity=\"0\",At.transform3dSupported&&(t.willChange=\"\"),this._show=!1,this._longHideTimeout=setTimeout(function(){return e._longHide=!0},500)},r.prototype.hideLater=function(e){this._show&&!(this._inContent&&this._enterable)&&!this._alwaysShowContent&&(e?(this._hideDelay=e,this._show=!1,this._hideTimeout=setTimeout(Y(this.hide,this),e)):this.hide())},r.prototype.isShow=function(){return this._show},r.prototype.dispose=function(){this.el.parentNode.removeChild(this.el)},r}(),fZ=uZ,hZ=function(){function r(e){this._show=!1,this._styleCoord=[0,0,0,0],this._alwaysShowContent=!1,this._enterable=!0,this._zr=e.getZr(),Ew(this._styleCoord,this._zr,e.getWidth()/2,e.getHeight()/2)}return r.prototype.update=function(e){var t=e.get(\"alwaysShowContent\");t&&this._moveIfResized(),this._alwaysShowContent=t},r.prototype.show=function(){this._hideTimeout&&clearTimeout(this._hideTimeout),this.el.show(),this._show=!0},r.prototype.setContent=function(e,t,a,n,i){var o=this;et(e)&&Pt(\"\"),this.el&&this._zr.remove(this.el);var s=a.getModel(\"textStyle\");this.el=new Dt({style:{rich:t.richTextStyles,text:e,lineHeight:22,borderWidth:1,borderColor:n,textShadowColor:s.get(\"textShadowColor\"),fill:a.get([\"textStyle\",\"color\"]),padding:AT(a,\"richText\"),verticalAlign:\"top\",align:\"left\"},z:a.get(\"z\")}),A([\"backgroundColor\",\"borderRadius\",\"shadowColor\",\"shadowBlur\",\"shadowOffsetX\",\"shadowOffsetY\"],function(u){o.el.style[u]=a.get(u)}),A([\"textShadowBlur\",\"textShadowOffsetX\",\"textShadowOffsetY\"],function(u){o.el.style[u]=s.get(u)||0}),this._zr.add(this.el);var l=this;this.el.on(\"mouseover\",function(){l._enterable&&(clearTimeout(l._hideTimeout),l._show=!0),l._inContent=!0}),this.el.on(\"mouseout\",function(){l._enterable&&l._show&&l.hideLater(l._hideDelay),l._inContent=!1})},r.prototype.setEnterable=function(e){this._enterable=e},r.prototype.getSize=function(){var e=this.el,t=this.el.getBoundingRect(),a=Rw(e.style);return[t.width+a.left+a.right,t.height+a.top+a.bottom]},r.prototype.moveTo=function(e,t){var a=this.el;if(a){var n=this._styleCoord;Ew(n,this._zr,e,t),e=n[0],t=n[1];var i=a.style,o=Va(i.borderWidth||0),s=Rw(i);a.x=e+o+s.left,a.y=t+o+s.top,a.markRedraw()}},r.prototype._moveIfResized=function(){var e=this._styleCoord[2],t=this._styleCoord[3];this.moveTo(e*this._zr.getWidth(),t*this._zr.getHeight())},r.prototype.hide=function(){this.el&&this.el.hide(),this._show=!1},r.prototype.hideLater=function(e){this._show&&!(this._inContent&&this._enterable)&&!this._alwaysShowContent&&(e?(this._hideDelay=e,this._show=!1,this._hideTimeout=setTimeout(Y(this.hide,this),e)):this.hide())},r.prototype.isShow=function(){return this._show},r.prototype.dispose=function(){this._zr.remove(this.el)},r}();function Va(r){return Math.max(0,r)}function Rw(r){var e=Va(r.shadowBlur||0),t=Va(r.shadowOffsetX||0),a=Va(r.shadowOffsetY||0);return{left:Va(e-t),right:Va(e+t),top:Va(e-a),bottom:Va(e+a)}}function Ew(r,e,t,a){r[0]=t,r[1]=a,r[2]=r[0]/e.getWidth(),r[3]=r[1]/e.getHeight()}var vZ=hZ,cZ=new bt({shape:{x:-1,y:-1,width:2,height:2}}),dZ=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.init=function(t,a){if(!(At.node||!a.getDom())){var n=t.getComponent(\"tooltip\"),i=this._renderMode=Tk(n.get(\"renderMode\"));this._tooltipContent=i===\"richText\"?new vZ(a):new fZ(a.getDom(),a,{appendToBody:n.get(\"appendToBody\",!0)})}},e.prototype.render=function(t,a,n){if(!(At.node||!n.getDom())){this.group.removeAll(),this._tooltipModel=t,this._ecModel=a,this._api=n;var i=this._tooltipContent;i.update(t),i.setEnterable(t.get(\"enterable\")),this._initGlobalListener(),this._keepShow(),this._renderMode!==\"richText\"&&t.get(\"transitionDuration\")?Oo(this,\"_updatePosition\",50,\"fixRate\"):rl(this,\"_updatePosition\")}},e.prototype._initGlobalListener=function(){var t=this._tooltipModel,a=t.get(\"triggerOn\");nL(\"itemTooltip\",this._api,Y(function(n,i,o){a!==\"none\"&&(a.indexOf(n)>=0?this._tryShow(i,o):n===\"leave\"&&this._hide(o))},this))},e.prototype._keepShow=function(){var t=this._tooltipModel,a=this._ecModel,n=this._api,i=t.get(\"triggerOn\");if(this._lastX!=null&&this._lastY!=null&&i!==\"none\"&&i!==\"click\"){var o=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout(function(){!n.isDisposed()&&o.manuallyShowTip(t,a,n,{x:o._lastX,y:o._lastY,dataByCoordSys:o._lastDataByCoordSys})})}},e.prototype.manuallyShowTip=function(t,a,n,i){if(!(i.from===this.uid||At.node||!n.getDom())){var o=kw(i,n);this._ticket=\"\";var s=i.dataByCoordSys,l=mZ(i,a,n);if(l){var u=l.el.getBoundingRect().clone();u.applyTransform(l.el.transform),this._tryShow({offsetX:u.x+u.width/2,offsetY:u.y+u.height/2,target:l.el,position:i.position,positionDefault:\"bottom\"},o)}else if(i.tooltip&&i.x!=null&&i.y!=null){var f=cZ;f.x=i.x,f.y=i.y,f.update(),it(f).tooltipConfig={name:null,option:i.tooltip},this._tryShow({offsetX:i.x,offsetY:i.y,target:f},o)}else if(s)this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,dataByCoordSys:s,tooltipOption:i.tooltipOption},o);else if(i.seriesIndex!=null){if(this._manuallyAxisShowTip(t,a,n,i))return;var h=iL(i,a),v=h.point[0],c=h.point[1];v!=null&&c!=null&&this._tryShow({offsetX:v,offsetY:c,target:h.el,position:i.position,positionDefault:\"bottom\"},o)}else i.x!=null&&i.y!=null&&(n.dispatchAction({type:\"updateAxisPointer\",x:i.x,y:i.y}),this._tryShow({offsetX:i.x,offsetY:i.y,position:i.position,target:n.getZr().findHover(i.x,i.y).target},o))}},e.prototype.manuallyHideTip=function(t,a,n,i){var o=this._tooltipContent;this._tooltipModel&&o.hideLater(this._tooltipModel.get(\"hideDelay\")),this._lastX=this._lastY=this._lastDataByCoordSys=null,i.from!==this.uid&&this._hide(kw(i,n))},e.prototype._manuallyAxisShowTip=function(t,a,n,i){var o=i.seriesIndex,s=i.dataIndex,l=a.getComponent(\"axisPointer\").coordSysAxesInfo;if(!(o==null||s==null||l==null)){var u=a.getSeriesByIndex(o);if(!!u){var f=u.getData(),h=ls([f.getItemModel(s),u,(u.coordinateSystem||{}).model],this._tooltipModel);if(h.get(\"trigger\")===\"axis\")return n.dispatchAction({type:\"updateAxisPointer\",seriesIndex:o,dataIndex:s,position:i.position}),!0}}},e.prototype._tryShow=function(t,a){var n=t.target,i=this._tooltipModel;if(!!i){this._lastX=t.offsetX,this._lastY=t.offsetY;var o=t.dataByCoordSys;if(o&&o.length)this._showAxisTooltip(o,t);else if(n){this._lastDataByCoordSys=null;var s,l;jn(n,function(u){if(it(u).dataIndex!=null)return s=u,!0;if(it(u).tooltipConfig!=null)return l=u,!0},!0),s?this._showSeriesItemTooltip(t,s,a):l?this._showComponentItemTooltip(t,l,a):this._hide(a)}else this._lastDataByCoordSys=null,this._hide(a)}},e.prototype._showOrMove=function(t,a){var n=t.get(\"showDelay\");a=Y(a,this),clearTimeout(this._showTimout),n>0?this._showTimout=setTimeout(a,n):a()},e.prototype._showAxisTooltip=function(t,a){var n=this._ecModel,i=this._tooltipModel,o=[a.offsetX,a.offsetY],s=ls([a.tooltipOption],i),l=this._renderMode,u=[],f=oe(\"section\",{blocks:[],noHeader:!0}),h=[],v=new Yv;A(t,function(m){A(m.dataByAxis,function(_){var S=n.getComponent(_.axisDim+\"Axis\",_.axisIndex),w=_.value;if(!(!S||w==null)){var x=eL(w,S.axis,n,_.seriesDataIndices,_.valueLabelOpt),b=oe(\"section\",{header:x,noHeader:!Sr(x),sortBlocks:!0,blocks:[]});f.blocks.push(b),A(_.seriesDataIndices,function(C){var T=n.getSeriesByIndex(C.seriesIndex),D=C.dataIndexInside,M=T.getDataParams(D);if(!(M.dataIndex<0)){M.axisDim=_.axisDim,M.axisIndex=_.axisIndex,M.axisType=_.axisType,M.axisId=_.axisId,M.axisValue=_y(S.axis,{value:w}),M.axisValueLabel=x,M.marker=v.makeTooltipMarker(\"item\",yi(M.color),l);var L=m1(T.formatTooltip(D,!0,null)),I=L.frag;if(I){var P=ls([T],i).get(\"valueFormatter\");b.blocks.push(P?V({valueFormatter:P},I):I)}L.text&&h.push(L.text),u.push(M)}})}})}),f.blocks.reverse(),h.reverse();var c=a.position,d=s.get(\"order\"),p=C1(f,v,l,d,n.get(\"useUTC\"),s.get(\"textStyle\"));p&&h.unshift(p);var g=l===\"richText\"?`\n\n`:\"<br/>\",y=h.join(g);this._showOrMove(s,function(){this._updateContentNotChangedOnAxis(t,u)?this._updatePosition(s,c,o[0],o[1],this._tooltipContent,u):this._showTooltipContent(s,y,u,Math.random()+\"\",o[0],o[1],c,null,v)})},e.prototype._showSeriesItemTooltip=function(t,a,n){var i=this._ecModel,o=it(a),s=o.seriesIndex,l=i.getSeriesByIndex(s),u=o.dataModel||l,f=o.dataIndex,h=o.dataType,v=u.getData(h),c=this._renderMode,d=t.positionDefault,p=ls([v.getItemModel(f),u,l&&(l.coordinateSystem||{}).model],this._tooltipModel,d?{position:d}:null),g=p.get(\"trigger\");if(!(g!=null&&g!==\"item\")){var y=u.getDataParams(f,h),m=new Yv;y.marker=m.makeTooltipMarker(\"item\",yi(y.color),c);var _=m1(u.formatTooltip(f,!1,h)),S=p.get(\"order\"),w=p.get(\"valueFormatter\"),x=_.frag,b=x?C1(w?V({valueFormatter:w},x):x,m,c,S,i.get(\"useUTC\"),p.get(\"textStyle\")):_.text,C=\"item_\"+u.name+\"_\"+f;this._showOrMove(p,function(){this._showTooltipContent(p,b,y,C,t.offsetX,t.offsetY,t.position,t.target,m)}),n({type:\"showTip\",dataIndexInside:f,dataIndex:v.getRawIndex(f),seriesIndex:s,from:this.uid})}},e.prototype._showComponentItemTooltip=function(t,a,n){var i=it(a),o=i.tooltipConfig,s=o.option||{};if(U(s)){var l=s;s={content:l,formatter:l}}var u=[s],f=this._ecModel.getComponent(i.componentMainType,i.componentIndex);f&&u.push(f),u.push({formatter:s.content});var h=t.positionDefault,v=ls(u,this._tooltipModel,h?{position:h}:null),c=v.get(\"content\"),d=Math.random()+\"\",p=new Yv;this._showOrMove(v,function(){var g=at(v.get(\"formatterParams\")||{});this._showTooltipContent(v,c,g,d,t.offsetX,t.offsetY,t.position,a,p)}),n({type:\"showTip\",from:this.uid})},e.prototype._showTooltipContent=function(t,a,n,i,o,s,l,u,f){if(this._ticket=\"\",!(!t.get(\"showContent\")||!t.get(\"show\"))){var h=this._tooltipContent;h.setEnterable(t.get(\"enterable\"));var v=t.get(\"formatter\");l=l||t.get(\"position\");var c=a,d=this._getNearestPoint([o,s],n,t.get(\"trigger\"),t.get(\"borderColor\")),p=d.color;if(v)if(U(v)){var g=t.ecModel.get(\"useUTC\"),y=F(n)?n[0]:n,m=y&&y.axisType&&y.axisType.indexOf(\"time\")>=0;c=v,m&&(c=Lh(y.axisValue,c,g)),c=UC(c,n,!0)}else if(J(v)){var _=Y(function(S,w){S===this._ticket&&(h.setContent(w,f,t,p,l),this._updatePosition(t,l,o,s,h,n,u))},this);this._ticket=i,c=v(n,i,_)}else c=v;h.setContent(c,f,t,p,l),h.show(t,p),this._updatePosition(t,l,o,s,h,n,u)}},e.prototype._getNearestPoint=function(t,a,n,i){if(n===\"axis\"||F(a))return{color:i||(this._renderMode===\"html\"?\"#fff\":\"none\")};if(!F(a))return{color:i||a.color||a.borderColor}},e.prototype._updatePosition=function(t,a,n,i,o,s,l){var u=this._api.getWidth(),f=this._api.getHeight();a=a||t.get(\"position\");var h=o.getSize(),v=t.get(\"align\"),c=t.get(\"verticalAlign\"),d=l&&l.getBoundingRect().clone();if(l&&d.applyTransform(l.transform),J(a)&&(a=a([n,i],s,o.el,d,{viewSize:[u,f],contentSize:h.slice()})),F(a))n=W(a[0],u),i=W(a[1],f);else if(et(a)){var p=a;p.width=h[0],p.height=h[1];var g=re(p,{width:u,height:f});n=g.x,i=g.y,v=null,c=null}else if(U(a)&&l){var y=yZ(a,d,h,t.get(\"borderWidth\"));n=y[0],i=y[1]}else{var y=pZ(n,i,o,u,f,v?null:20,c?null:20);n=y[0],i=y[1]}if(v&&(n-=Ow(v)?h[0]/2:v===\"right\"?h[0]:0),c&&(i-=Ow(c)?h[1]/2:c===\"bottom\"?h[1]:0),_L(t)){var y=gZ(n,i,o,u,f);n=y[0],i=y[1]}o.moveTo(n,i)},e.prototype._updateContentNotChangedOnAxis=function(t,a){var n=this._lastDataByCoordSys,i=this._cbParamsList,o=!!n&&n.length===t.length;return o&&A(n,function(s,l){var u=s.dataByAxis||[],f=t[l]||{},h=f.dataByAxis||[];o=o&&u.length===h.length,o&&A(u,function(v,c){var d=h[c]||{},p=v.seriesDataIndices||[],g=d.seriesDataIndices||[];o=o&&v.value===d.value&&v.axisType===d.axisType&&v.axisId===d.axisId&&p.length===g.length,o&&A(p,function(y,m){var _=g[m];o=o&&y.seriesIndex===_.seriesIndex&&y.dataIndex===_.dataIndex}),i&&A(v.seriesDataIndices,function(y){var m=y.seriesIndex,_=a[m],S=i[m];_&&S&&S.data!==_.data&&(o=!1)})})}),this._lastDataByCoordSys=t,this._cbParamsList=a,!!o},e.prototype._hide=function(t){this._lastDataByCoordSys=null,t({type:\"hideTip\",from:this.uid})},e.prototype.dispose=function(t,a){At.node||!a.getDom()||(rl(this,\"_updatePosition\"),this._tooltipContent.dispose(),qp(\"itemTooltip\",a))},e.type=\"tooltip\",e}(Ut);function ls(r,e,t){var a=e.ecModel,n;t?(n=new Vt(t,a,a),n=new Vt(e.option,n,a)):n=e;for(var i=r.length-1;i>=0;i--){var o=r[i];o&&(o instanceof Vt&&(o=o.get(\"tooltip\",!0)),U(o)&&(o={formatter:o}),o&&(n=new Vt(o,n,a)))}return n}function kw(r,e){return r.dispatchAction||Y(e.dispatchAction,e)}function pZ(r,e,t,a,n,i,o){var s=t.getSize(),l=s[0],u=s[1];return i!=null&&(r+l+i+2>a?r-=l+i:r+=i),o!=null&&(e+u+o>n?e-=u+o:e+=o),[r,e]}function gZ(r,e,t,a,n){var i=t.getSize(),o=i[0],s=i[1];return r=Math.min(r+o,a)-o,e=Math.min(e+s,n)-s,r=Math.max(r,0),e=Math.max(e,0),[r,e]}function yZ(r,e,t,a){var n=t[0],i=t[1],o=Math.ceil(Math.SQRT2*a)+8,s=0,l=0,u=e.width,f=e.height;switch(r){case\"inside\":s=e.x+u/2-n/2,l=e.y+f/2-i/2;break;case\"top\":s=e.x+u/2-n/2,l=e.y-i-o;break;case\"bottom\":s=e.x+u/2-n/2,l=e.y+f+o;break;case\"left\":s=e.x-n-o,l=e.y+f/2-i/2;break;case\"right\":s=e.x+u+o,l=e.y+f/2-i/2}return[s,l]}function Ow(r){return r===\"center\"||r===\"middle\"}function mZ(r,e,t){var a=Pg(r).queryOptionMap,n=a.keys()[0];if(!(!n||n===\"series\")){var i=wl(e,n,a.get(n),{useDefault:!1,enableAll:!1,enableNone:!1}),o=i.models[0];if(!!o){var s=t.getViewOfComponentModel(o),l;if(s.group.traverse(function(u){var f=it(u).tooltipConfig;if(f&&f.name===r.name)return l=u,!0}),l)return{componentMainType:n,componentIndex:o.componentIndex,el:l}}}}var _Z=dZ;function bL(r){ct(Fl),r.registerComponentModel(jY),r.registerComponentView(_Z),r.registerAction({type:\"showTip\",event:\"showTip\",update:\"tooltip:manuallyShowTip\"},Kt),r.registerAction({type:\"hideTip\",event:\"hideTip\",update:\"tooltip:manuallyHideTip\"},Kt)}var SZ=[\"rect\",\"polygon\",\"keep\",\"clear\"];function xZ(r,e){var t=kt(r?r.brush:[]);if(!!t.length){var a=[];A(t,function(l){var u=l.hasOwnProperty(\"toolbox\")?l.toolbox:[];u instanceof Array&&(a=a.concat(u))});var n=r&&r.toolbox;F(n)&&(n=n[0]),n||(n={feature:{}},r.toolbox=[n]);var i=n.feature||(n.feature={}),o=i.brush||(i.brush={}),s=o.type||(o.type=[]);s.push.apply(s,a),wZ(s),e&&!s.length&&s.push.apply(s,SZ)}}function wZ(r){var e={};A(r,function(t){e[t]=1}),r.length=0,A(e,function(t,a){r.push(a)})}var Bw=A;function Nw(r){if(r){for(var e in r)if(r.hasOwnProperty(e))return!0}}function eg(r,e,t){var a={};return Bw(e,function(i){var o=a[i]=n();Bw(r[i],function(s,l){if(!!ve.isValidType(l)){var u={type:l,visual:s};t&&t(u,i),o[l]=new ve(u),l===\"opacity\"&&(u=at(u),u.type=\"colorAlpha\",o.__hidden.__alphaForOpacity=new ve(u))}})}),a;function n(){var i=function(){};i.prototype.__hidden=i.prototype;var o=new i;return o}}function CL(r,e,t){var a;A(t,function(n){e.hasOwnProperty(n)&&Nw(e[n])&&(a=!0)}),a&&A(t,function(n){e.hasOwnProperty(n)&&Nw(e[n])?r[n]=at(e[n]):delete r[n]})}function bZ(r,e,t,a,n,i){var o={};A(r,function(h){var v=ve.prepareVisualTypes(e[h]);o[h]=v});var s;function l(h){return ly(t,s,h)}function u(h,v){BT(t,s,h,v)}i==null?t.each(f):t.each([i],f);function f(h,v){s=i==null?h:v;var c=t.getRawDataItem(s);if(!(c&&c.visualMap===!1))for(var d=a.call(n,h),p=e[d],g=o[d],y=0,m=g.length;y<m;y++){var _=g[y];p[_]&&p[_].applyVisual(h,l,u)}}}function CZ(r,e,t,a){var n={};return A(r,function(i){var o=ve.prepareVisualTypes(e[i]);n[i]=o}),{progress:function(o,s){var l;a!=null&&(l=s.getDimensionIndex(a));function u(w){return ly(s,h,w)}function f(w,x){BT(s,h,w,x)}for(var h,v=s.getStore();(h=o.next())!=null;){var c=s.getRawDataItem(h);if(!(c&&c.visualMap===!1))for(var d=a!=null?v.get(l,h):h,p=t(d),g=e[p],y=n[p],m=0,_=y.length;m<_;m++){var S=y[m];g[S]&&g[S].applyVisual(d,u,f)}}}}}function TZ(r){var e=r.brushType,t={point:function(a){return Vw[e].point(a,t,r)},rect:function(a){return Vw[e].rect(a,t,r)}};return t}var Vw={lineX:zw(0),lineY:zw(1),rect:{point:function(r,e,t){return r&&t.boundingRect.contain(r[0],r[1])},rect:function(r,e,t){return r&&t.boundingRect.intersect(r)}},polygon:{point:function(r,e,t){return r&&t.boundingRect.contain(r[0],r[1])&&Un(t.range,r[0],r[1])},rect:function(r,e,t){var a=t.range;if(!r||a.length<=1)return!1;var n=r.x,i=r.y,o=r.width,s=r.height,l=a[0];if(Un(a,n,i)||Un(a,n+o,i)||Un(a,n,i+s)||Un(a,n+o,i+s)||vt.create(r).contain(l[0],l[1])||ys(n,i,n+o,i,a)||ys(n,i,n,i+s,a)||ys(n+o,i,n+o,i+s,a)||ys(n,i+s,n+o,i+s,a))return!0}}};function zw(r){var e=[\"x\",\"y\"],t=[\"width\",\"height\"];return{point:function(a,n,i){if(a){var o=i.range,s=a[r];return us(s,o)}},rect:function(a,n,i){if(a){var o=i.range,s=[a[e[r]],a[e[r]]+a[t[r]]];return s[1]<s[0]&&s.reverse(),us(s[0],o)||us(s[1],o)||us(o[0],s)||us(o[1],s)}}}}function us(r,e){return e[0]<=r&&r<=e[1]}var Fw=[\"inBrush\",\"outOfBrush\"],ld=\"__ecBrushSelect\",rg=\"__ecInBrushSelectEvent\";function TL(r){r.eachComponent({mainType:\"brush\"},function(e){var t=e.brushTargetManager=new gm(e.option,r);t.setInputRanges(e.areas,r)})}function AZ(r,e,t){var a=[],n,i;r.eachComponent({mainType:\"brush\"},function(o){t&&t.type===\"takeGlobalCursor\"&&o.setBrushOption(t.key===\"brush\"?t.brushOption:{brushType:!1})}),TL(r),r.eachComponent({mainType:\"brush\"},function(o,s){var l={brushId:o.id,brushIndex:s,brushName:o.name,areas:at(o.areas),selected:[]};a.push(l);var u=o.option,f=u.brushLink,h=[],v=[],c=[],d=!1;s||(n=u.throttleType,i=u.throttleDelay);var p=G(o.areas,function(w){var x=IZ[w.brushType],b=tt({boundingRect:x?x(w):void 0},w);return b.selectors=TZ(b),b}),g=eg(o.option,Fw,function(w){w.mappingMethod=\"fixed\"});F(f)&&A(f,function(w){h[w]=1});function y(w){return f===\"all\"||!!h[w]}function m(w){return!!w.length}r.eachSeries(function(w,x){var b=c[x]=[];w.subType===\"parallel\"?_(w,x):S(w,x,b)});function _(w,x){var b=w.coordinateSystem;d=d||b.hasAxisBrushed(),y(x)&&b.eachActiveState(w.getData(),function(C,T){C===\"active\"&&(v[T]=1)})}function S(w,x,b){if(!(!w.brushSelector||LZ(o,x))&&(A(p,function(T){o.brushTargetManager.controlSeries(T,w,r)&&b.push(T),d=d||m(b)}),y(x)&&m(b))){var C=w.getData();C.each(function(T){Gw(w,b,C,T)&&(v[T]=1)})}}r.eachSeries(function(w,x){var b={seriesId:w.id,seriesIndex:x,seriesName:w.name,dataIndex:[]};l.selected.push(b);var C=c[x],T=w.getData(),D=y(x)?function(M){return v[M]?(b.dataIndex.push(T.getRawIndex(M)),\"inBrush\"):\"outOfBrush\"}:function(M){return Gw(w,C,T,M)?(b.dataIndex.push(T.getRawIndex(M)),\"inBrush\"):\"outOfBrush\"};(y(x)?d:m(C))&&bZ(Fw,g,T,D)})}),DZ(e,n,i,a,t)}function DZ(r,e,t,a,n){if(!!n){var i=r.getZr();if(!i[rg]){i[ld]||(i[ld]=MZ);var o=Oo(i,ld,t,e);o(r,a)}}}function MZ(r,e){if(!r.isDisposed()){var t=r.getZr();t[rg]=!0,r.dispatchAction({type:\"brushSelect\",batch:e}),t[rg]=!1}}function Gw(r,e,t,a){for(var n=0,i=e.length;n<i;n++){var o=e[n];if(r.brushSelector(a,t,o.selectors,o))return!0}}function LZ(r,e){var t=r.option.seriesIndex;return t!=null&&t!==\"all\"&&(F(t)?dt(t,e)<0:e!==t)}var IZ={rect:function(r){return Hw(r.range)},polygon:function(r){for(var e,t=r.range,a=0,n=t.length;a<n;a++){e=e||[[1/0,-1/0],[1/0,-1/0]];var i=t[a];i[0]<e[0][0]&&(e[0][0]=i[0]),i[0]>e[0][1]&&(e[0][1]=i[0]),i[1]<e[1][0]&&(e[1][0]=i[1]),i[1]>e[1][1]&&(e[1][1]=i[1])}return e&&Hw(e)}};function Hw(r){return new vt(r[0][0],r[1][0],r[0][1]-r[0][0],r[1][1]-r[1][0])}var PZ=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.init=function(t,a){this.ecModel=t,this.api=a,this.model,(this._brushController=new Uy(a.getZr())).on(\"brush\",Y(this._onBrush,this)).mount()},e.prototype.render=function(t,a,n,i){this.model=t,this._updateController(t,a,n,i)},e.prototype.updateTransform=function(t,a,n,i){TL(a),this._updateController(t,a,n,i)},e.prototype.updateVisual=function(t,a,n,i){this.updateTransform(t,a,n,i)},e.prototype.updateView=function(t,a,n,i){this._updateController(t,a,n,i)},e.prototype._updateController=function(t,a,n,i){(!i||i.$from!==t.id)&&this._brushController.setPanels(t.brushTargetManager.makePanelOpts(n)).enableBrush(t.brushOption).updateCovers(t.areas.slice())},e.prototype.dispose=function(){this._brushController.dispose()},e.prototype._onBrush=function(t){var a=this.model.id,n=this.model.brushTargetManager.setOutputRanges(t.areas,this.ecModel);(!t.isEnd||t.removeOnClick)&&this.api.dispatchAction({type:\"brush\",brushId:a,areas:at(n),$from:a}),t.isEnd&&this.api.dispatchAction({type:\"brushEnd\",brushId:a,areas:at(n),$from:a})},e.type=\"brush\",e}(Ut),RZ=PZ,EZ=\"#ddd\",kZ=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.areas=[],t.brushOption={},t}return e.prototype.optionUpdated=function(t,a){var n=this.option;!a&&CL(n,t,[\"inBrush\",\"outOfBrush\"]);var i=n.inBrush=n.inBrush||{};n.outOfBrush=n.outOfBrush||{color:EZ},i.hasOwnProperty(\"liftZ\")||(i.liftZ=5)},e.prototype.setAreas=function(t){!t||(this.areas=G(t,function(a){return Ww(this.option,a)},this))},e.prototype.setBrushOption=function(t){this.brushOption=Ww(this.option,t),this.brushType=this.brushOption.brushType},e.type=\"brush\",e.dependencies=[\"geo\",\"grid\",\"xAxis\",\"yAxis\",\"parallel\",\"series\"],e.defaultOption={seriesIndex:\"all\",brushType:\"rect\",brushMode:\"single\",transformable:!0,brushStyle:{borderWidth:1,color:\"rgba(210,219,238,0.3)\",borderColor:\"#D2DBEE\"},throttleType:\"fixRate\",throttleDelay:0,removeOnClick:!0,z:1e4},e}(Tt);function Ww(r,e){return ht({brushType:r.brushType,brushMode:r.brushMode,transformable:r.transformable,brushStyle:new Vt(r.brushStyle).getItemStyle(),removeOnClick:r.removeOnClick,z:r.z},e,!0)}var OZ=kZ,BZ=[\"rect\",\"polygon\",\"lineX\",\"lineY\",\"keep\",\"clear\"],NZ=function(r){k(e,r);function e(){return r!==null&&r.apply(this,arguments)||this}return e.prototype.render=function(t,a,n){var i,o,s;a.eachComponent({mainType:\"brush\"},function(l){i=l.brushType,o=l.brushOption.brushMode||\"single\",s=s||!!l.areas.length}),this._brushType=i,this._brushMode=o,A(t.get(\"type\",!0),function(l){t.setIconStatus(l,(l===\"keep\"?o===\"multiple\":l===\"clear\"?s:l===i)?\"emphasis\":\"normal\")})},e.prototype.updateView=function(t,a,n){this.render(t,a,n)},e.prototype.getIcons=function(){var t=this.model,a=t.get(\"icon\",!0),n={};return A(t.get(\"type\",!0),function(i){a[i]&&(n[i]=a[i])}),n},e.prototype.onclick=function(t,a,n){var i=this._brushType,o=this._brushMode;n===\"clear\"?(a.dispatchAction({type:\"axisAreaSelect\",intervals:[]}),a.dispatchAction({type:\"brush\",command:\"clear\",areas:[]})):a.dispatchAction({type:\"takeGlobalCursor\",key:\"brush\",brushOption:{brushType:n===\"keep\"?i:i===n?!1:n,brushMode:n===\"keep\"?o===\"multiple\"?\"single\":\"multiple\":o}})},e.getDefaultOption=function(t){var a={show:!0,type:BZ.slice(),icon:{rect:\"M7.3,34.7 M0.4,10V-0.2h9.8 M89.6,10V-0.2h-9.8 M0.4,60v10.2h9.8 M89.6,60v10.2h-9.8 M12.3,22.4V10.5h13.1 M33.6,10.5h7.8 M49.1,10.5h7.8 M77.5,22.4V10.5h-13 M12.3,31.1v8.2 M77.7,31.1v8.2 M12.3,47.6v11.9h13.1 M33.6,59.5h7.6 M49.1,59.5 h7.7 M77.5,47.6v11.9h-13\",polygon:\"M55.2,34.9c1.7,0,3.1,1.4,3.1,3.1s-1.4,3.1-3.1,3.1 s-3.1-1.4-3.1-3.1S53.5,34.9,55.2,34.9z M50.4,51c1.7,0,3.1,1.4,3.1,3.1c0,1.7-1.4,3.1-3.1,3.1c-1.7,0-3.1-1.4-3.1-3.1 C47.3,52.4,48.7,51,50.4,51z M55.6,37.1l1.5-7.8 M60.1,13.5l1.6-8.7l-7.8,4 M59,19l-1,5.3 M24,16.1l6.4,4.9l6.4-3.3 M48.5,11.6 l-5.9,3.1 M19.1,12.8L9.7,5.1l1.1,7.7 M13.4,29.8l1,7.3l6.6,1.6 M11.6,18.4l1,6.1 M32.8,41.9 M26.6,40.4 M27.3,40.2l6.1,1.6 M49.9,52.1l-5.6-7.6l-4.9-1.2\",lineX:\"M15.2,30 M19.7,15.6V1.9H29 M34.8,1.9H40.4 M55.3,15.6V1.9H45.9 M19.7,44.4V58.1H29 M34.8,58.1H40.4 M55.3,44.4 V58.1H45.9 M12.5,20.3l-9.4,9.6l9.6,9.8 M3.1,29.9h16.5 M62.5,20.3l9.4,9.6L62.3,39.7 M71.9,29.9H55.4\",lineY:\"M38.8,7.7 M52.7,12h13.2v9 M65.9,26.6V32 M52.7,46.3h13.2v-9 M24.9,12H11.8v9 M11.8,26.6V32 M24.9,46.3H11.8v-9 M48.2,5.1l-9.3-9l-9.4,9.2 M38.9-3.9V12 M48.2,53.3l-9.3,9l-9.4-9.2 M38.9,62.3V46.4\",keep:\"M4,10.5V1h10.3 M20.7,1h6.1 M33,1h6.1 M55.4,10.5V1H45.2 M4,17.3v6.6 M55.6,17.3v6.6 M4,30.5V40h10.3 M20.7,40 h6.1 M33,40h6.1 M55.4,30.5V40H45.2 M21,18.9h62.9v48.6H21V18.9z\",clear:\"M22,14.7l30.9,31 M52.9,14.7L22,45.7 M4.7,16.8V4.2h13.1 M26,4.2h7.8 M41.6,4.2h7.8 M70.3,16.8V4.2H57.2 M4.7,25.9v8.6 M70.3,25.9v8.6 M4.7,43.2v12.6h13.1 M26,55.8h7.8 M41.6,55.8h7.8 M70.3,43.2v12.6H57.2\"},title:t.getLocaleModel().get([\"toolbox\",\"brush\",\"title\"])};return a},e}(rr),VZ=NZ;function zZ(r){r.registerComponentView(RZ),r.registerComponentModel(OZ),r.registerPreprocessor(xZ),r.registerVisual(r.PRIORITY.VISUAL.BRUSH,AZ),r.registerAction({type:\"brush\",event:\"brush\",update:\"updateVisual\"},function(e,t){t.eachComponent({mainType:\"brush\",query:e},function(a){a.setAreas(e.areas)})}),r.registerAction({type:\"brushSelect\",event:\"brushSelected\",update:\"none\"},Kt),r.registerAction({type:\"brushEnd\",event:\"brushEnd\",update:\"none\"},Kt),eo(\"brush\",VZ)}var FZ=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.layoutMode={type:\"box\",ignoreSize:!0},t}return e.type=\"title\",e.defaultOption={z:6,show:!0,text:\"\",target:\"blank\",subtext:\"\",subtarget:\"blank\",left:0,top:0,backgroundColor:\"rgba(0,0,0,0)\",borderColor:\"#ccc\",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:\"bold\",color:\"#464646\"},subtextStyle:{fontSize:12,color:\"#6E7079\"}},e}(Tt),GZ=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.render=function(t,a,n){if(this.group.removeAll(),!!t.get(\"show\")){var i=this.group,o=t.getModel(\"textStyle\"),s=t.getModel(\"subtextStyle\"),l=t.get(\"textAlign\"),u=ft(t.get(\"textBaseline\"),t.get(\"textVerticalAlign\")),f=new Dt({style:Nt(o,{text:t.get(\"text\"),fill:o.getTextColor()},{disableBox:!0}),z2:10}),h=f.getBoundingRect(),v=t.get(\"subtext\"),c=new Dt({style:Nt(s,{text:v,fill:s.getTextColor(),y:h.height+t.get(\"itemGap\"),verticalAlign:\"top\"},{disableBox:!0}),z2:10}),d=t.get(\"link\"),p=t.get(\"sublink\"),g=t.get(\"triggerEvent\",!0);f.silent=!d&&!g,c.silent=!p&&!g,d&&f.on(\"click\",function(){Rf(d,\"_\"+t.get(\"target\"))}),p&&c.on(\"click\",function(){Rf(p,\"_\"+t.get(\"subtarget\"))}),it(f).eventData=it(c).eventData=g?{componentType:\"title\",componentIndex:t.componentIndex}:null,i.add(f),v&&i.add(c);var y=i.getBoundingRect(),m=t.getBoxLayoutParams();m.width=y.width,m.height=y.height;var _=re(m,{width:n.getWidth(),height:n.getHeight()},t.get(\"padding\"));l||(l=t.get(\"left\")||t.get(\"right\"),l===\"middle\"&&(l=\"center\"),l===\"right\"?_.x+=_.width:l===\"center\"&&(_.x+=_.width/2)),u||(u=t.get(\"top\")||t.get(\"bottom\"),u===\"center\"&&(u=\"middle\"),u===\"bottom\"?_.y+=_.height:u===\"middle\"&&(_.y+=_.height/2),u=u||\"top\"),i.x=_.x,i.y=_.y,i.markRedraw();var S={align:l,verticalAlign:u};f.setStyle(S),c.setStyle(S),y=i.getBoundingRect();var w=_.margin,x=t.getItemStyle([\"color\",\"opacity\"]);x.fill=t.get(\"backgroundColor\");var b=new bt({shape:{x:y.x-w[3],y:y.y-w[0],width:y.width+w[1]+w[3],height:y.height+w[0]+w[2],r:t.get(\"borderRadius\")},style:x,subPixelOptimize:!0,silent:!0});i.add(b)}},e.type=\"title\",e}(Ut);function AL(r){r.registerComponentModel(FZ),r.registerComponentView(GZ)}var HZ=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.layoutMode=\"box\",t}return e.prototype.init=function(t,a,n){this.mergeDefaultAndTheme(t,n),this._initData()},e.prototype.mergeOption=function(t){r.prototype.mergeOption.apply(this,arguments),this._initData()},e.prototype.setCurrentIndex=function(t){t==null&&(t=this.option.currentIndex);var a=this._data.count();this.option.loop?t=(t%a+a)%a:(t>=a&&(t=a-1),t<0&&(t=0)),this.option.currentIndex=t},e.prototype.getCurrentIndex=function(){return this.option.currentIndex},e.prototype.isIndexMax=function(){return this.getCurrentIndex()>=this._data.count()-1},e.prototype.setPlayState=function(t){this.option.autoPlay=!!t},e.prototype.getPlayState=function(){return!!this.option.autoPlay},e.prototype._initData=function(){var t=this.option,a=t.data||[],n=t.axisType,i=this._names=[],o;n===\"category\"?(o=[],A(a,function(u,f){var h=ee(Co(u),\"\"),v;et(u)?(v=at(u),v.value=f):v=f,o.push(v),i.push(h)})):o=a;var s={category:\"ordinal\",time:\"time\",value:\"number\"}[n]||\"number\",l=this._data=new De([{name:\"value\",type:s}],this);l.initData(o,i)},e.prototype.getData=function(){return this._data},e.prototype.getCategories=function(){if(this.get(\"axisType\")===\"category\")return this._names.slice()},e.type=\"timeline\",e.defaultOption={z:4,show:!0,axisType:\"time\",realtime:!0,left:\"20%\",top:null,right:\"20%\",bottom:0,width:null,height:40,padding:5,controlPosition:\"left\",autoPlay:!1,rewind:!1,loop:!0,playInterval:2e3,currentIndex:0,itemStyle:{},label:{color:\"#000\"},data:[]},e}(Tt),$w=HZ,DL=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.type=\"timeline.slider\",e.defaultOption=cn($w.defaultOption,{backgroundColor:\"rgba(0,0,0,0)\",borderColor:\"#ccc\",borderWidth:0,orient:\"horizontal\",inverse:!1,tooltip:{trigger:\"item\"},symbol:\"circle\",symbolSize:12,lineStyle:{show:!0,width:2,color:\"#DAE1F5\"},label:{position:\"auto\",show:!0,interval:\"auto\",rotate:0,color:\"#A4B1D7\"},itemStyle:{color:\"#A4B1D7\",borderWidth:1},checkpointStyle:{symbol:\"circle\",symbolSize:15,color:\"#316bf3\",borderColor:\"#fff\",borderWidth:2,shadowBlur:2,shadowOffsetX:1,shadowOffsetY:1,shadowColor:\"rgba(0, 0, 0, 0.3)\",animation:!0,animationDuration:300,animationEasing:\"quinticInOut\"},controlStyle:{show:!0,showPlayBtn:!0,showPrevBtn:!0,showNextBtn:!0,itemSize:24,itemGap:12,position:\"left\",playIcon:\"path://M31.6,53C17.5,53,6,41.5,6,27.4S17.5,1.8,31.6,1.8C45.7,1.8,57.2,13.3,57.2,27.4S45.7,53,31.6,53z M31.6,3.3 C18.4,3.3,7.5,14.1,7.5,27.4c0,13.3,10.8,24.1,24.1,24.1C44.9,51.5,55.7,40.7,55.7,27.4C55.7,14.1,44.9,3.3,31.6,3.3z M24.9,21.3 c0-2.2,1.6-3.1,3.5-2l10.5,6.1c1.899,1.1,1.899,2.9,0,4l-10.5,6.1c-1.9,1.1-3.5,0.2-3.5-2V21.3z\",stopIcon:\"path://M30.9,53.2C16.8,53.2,5.3,41.7,5.3,27.6S16.8,2,30.9,2C45,2,56.4,13.5,56.4,27.6S45,53.2,30.9,53.2z M30.9,3.5C17.6,3.5,6.8,14.4,6.8,27.6c0,13.3,10.8,24.1,24.101,24.1C44.2,51.7,55,40.9,55,27.6C54.9,14.4,44.1,3.5,30.9,3.5z M36.9,35.8c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H36c0.5,0,0.9,0.4,0.9,1V35.8z M27.8,35.8 c0,0.601-0.4,1-0.9,1h-1.3c-0.5,0-0.9-0.399-0.9-1V19.5c0-0.6,0.4-1,0.9-1H27c0.5,0,0.9,0.4,0.9,1L27.8,35.8L27.8,35.8z\",nextIcon:\"M2,18.5A1.52,1.52,0,0,1,.92,18a1.49,1.49,0,0,1,0-2.12L7.81,9.36,1,3.11A1.5,1.5,0,1,1,3,.89l8,7.34a1.48,1.48,0,0,1,.49,1.09,1.51,1.51,0,0,1-.46,1.1L3,18.08A1.5,1.5,0,0,1,2,18.5Z\",prevIcon:\"M10,.5A1.52,1.52,0,0,1,11.08,1a1.49,1.49,0,0,1,0,2.12L4.19,9.64,11,15.89a1.5,1.5,0,1,1-2,2.22L1,10.77A1.48,1.48,0,0,1,.5,9.68,1.51,1.51,0,0,1,1,8.58L9,.92A1.5,1.5,0,0,1,10,.5Z\",prevBtnSize:18,nextBtnSize:18,color:\"#A4B1D7\",borderColor:\"#A4B1D7\",borderWidth:1},emphasis:{label:{show:!0,color:\"#6f778d\"},itemStyle:{color:\"#316BF3\"},controlStyle:{color:\"#316BF3\",borderColor:\"#316BF3\",borderWidth:2}},progress:{lineStyle:{color:\"#316BF3\"},itemStyle:{color:\"#316BF3\"},label:{color:\"#6f778d\"}},data:[]}),e}($w);te(DL,ay.prototype);var WZ=DL,$Z=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.type=\"timeline\",e}(Ut),UZ=$Z,YZ=function(r){k(e,r);function e(t,a,n,i){var o=r.call(this,t,a,n)||this;return o.type=i||\"value\",o}return e.prototype.getLabelModel=function(){return this.model.getModel(\"label\")},e.prototype.isHorizontal=function(){return this.model.get(\"orient\")===\"horizontal\"},e}(Mr),ZZ=YZ,ud=Math.PI,Uw=Ct(),XZ=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.init=function(t,a){this.api=a},e.prototype.render=function(t,a,n){if(this.model=t,this.api=n,this.ecModel=a,this.group.removeAll(),t.get(\"show\",!0)){var i=this._layout(t,n),o=this._createGroup(\"_mainGroup\"),s=this._createGroup(\"_labelGroup\"),l=this._axis=this._createAxis(i,t);t.formatTooltip=function(u){var f=l.scale.getLabel({value:u});return oe(\"nameValue\",{noName:!0,value:f})},A([\"AxisLine\",\"AxisTick\",\"Control\",\"CurrentPointer\"],function(u){this[\"_render\"+u](i,o,l,t)},this),this._renderAxisLabel(i,s,l,t),this._position(i,t)}this._doPlayStop(),this._updateTicksStatus()},e.prototype.remove=function(){this._clearTimer(),this.group.removeAll()},e.prototype.dispose=function(){this._clearTimer()},e.prototype._layout=function(t,a){var n=t.get([\"label\",\"position\"]),i=t.get(\"orient\"),o=KZ(t,a),s;n==null||n===\"auto\"?s=i===\"horizontal\"?o.y+o.height/2<a.getHeight()/2?\"-\":\"+\":o.x+o.width/2<a.getWidth()/2?\"+\":\"-\":U(n)?s={horizontal:{top:\"-\",bottom:\"+\"},vertical:{left:\"-\",right:\"+\"}}[i][n]:s=n;var l={horizontal:\"center\",vertical:s>=0||s===\"+\"?\"left\":\"right\"},u={horizontal:s>=0||s===\"+\"?\"top\":\"bottom\",vertical:\"middle\"},f={horizontal:0,vertical:ud/2},h=i===\"vertical\"?o.height:o.width,v=t.getModel(\"controlStyle\"),c=v.get(\"show\",!0),d=c?v.get(\"itemSize\"):0,p=c?v.get(\"itemGap\"):0,g=d+p,y=t.get([\"label\",\"rotate\"])||0;y=y*ud/180;var m,_,S,w=v.get(\"position\",!0),x=c&&v.get(\"showPlayBtn\",!0),b=c&&v.get(\"showPrevBtn\",!0),C=c&&v.get(\"showNextBtn\",!0),T=0,D=h;w===\"left\"||w===\"bottom\"?(x&&(m=[0,0],T+=g),b&&(_=[T,0],T+=g),C&&(S=[D-d,0],D-=g)):(x&&(m=[D-d,0],D-=g),b&&(_=[0,0],T+=g),C&&(S=[D-d,0],D-=g));var M=[T,D];return t.get(\"inverse\")&&M.reverse(),{viewRect:o,mainLength:h,orient:i,rotation:f[i],labelRotation:y,labelPosOpt:s,labelAlign:t.get([\"label\",\"align\"])||l[i],labelBaseline:t.get([\"label\",\"verticalAlign\"])||t.get([\"label\",\"baseline\"])||u[i],playPosition:m,prevBtnPosition:_,nextBtnPosition:S,axisExtent:M,controlSize:d,controlGap:p}},e.prototype._position=function(t,a){var n=this._mainGroup,i=this._labelGroup,o=t.viewRect;if(t.orient===\"vertical\"){var s=ur(),l=o.x,u=o.y+o.height;Xr(s,s,[-l,-u]),bi(s,s,-ud/2),Xr(s,s,[l,u]),o=o.clone(),o.applyTransform(s)}var f=m(o),h=m(n.getBoundingRect()),v=m(i.getBoundingRect()),c=[n.x,n.y],d=[i.x,i.y];d[0]=c[0]=f[0][0];var p=t.labelPosOpt;if(p==null||U(p)){var g=p===\"+\"?0:1;_(c,h,f,1,g),_(d,v,f,1,1-g)}else{var g=p>=0?0:1;_(c,h,f,1,g),d[1]=c[1]+p}n.setPosition(c),i.setPosition(d),n.rotation=i.rotation=t.rotation,y(n),y(i);function y(S){S.originX=f[0][0]-S.x,S.originY=f[1][0]-S.y}function m(S){return[[S.x,S.x+S.width],[S.y,S.y+S.height]]}function _(S,w,x,b,C){S[b]+=x[b][C]-w[b][C]}},e.prototype._createAxis=function(t,a){var n=a.getData(),i=a.get(\"axisType\"),o=qZ(a,i);o.getTicks=function(){return n.mapArray([\"value\"],function(u){return{value:u}})};var s=n.getDataExtent(\"value\");o.setExtent(s[0],s[1]),o.calcNiceTicks();var l=new ZZ(\"value\",o,t.axisExtent,i);return l.model=a,l},e.prototype._createGroup=function(t){var a=this[t]=new nt;return this.group.add(a),a},e.prototype._renderAxisLine=function(t,a,n,i){var o=n.getExtent();if(!!i.get([\"lineStyle\",\"show\"])){var s=new ue({shape:{x1:o[0],y1:0,x2:o[1],y2:0},style:V({lineCap:\"round\"},i.getModel(\"lineStyle\").getLineStyle()),silent:!0,z2:1});a.add(s);var l=this._progressLine=new ue({shape:{x1:o[0],x2:this._currentPointer?this._currentPointer.x:o[0],y1:0,y2:0},style:tt({lineCap:\"round\",lineWidth:s.style.lineWidth},i.getModel([\"progress\",\"lineStyle\"]).getLineStyle()),silent:!0,z2:1});a.add(l)}},e.prototype._renderAxisTick=function(t,a,n,i){var o=this,s=i.getData(),l=n.scale.getTicks();this._tickSymbols=[],A(l,function(u){var f=n.dataToCoord(u.value),h=s.getItemModel(u.value),v=h.getModel(\"itemStyle\"),c=h.getModel([\"emphasis\",\"itemStyle\"]),d=h.getModel([\"progress\",\"itemStyle\"]),p={x:f,y:0,onclick:Y(o._changeTimeline,o,u.value)},g=Yw(h,v,a,p);g.ensureState(\"emphasis\").style=c.getItemStyle(),g.ensureState(\"progress\").style=d.getItemStyle(),si(g);var y=it(g);h.get(\"tooltip\")?(y.dataIndex=u.value,y.dataModel=i):y.dataIndex=y.dataModel=null,o._tickSymbols.push(g)})},e.prototype._renderAxisLabel=function(t,a,n,i){var o=this,s=n.getLabelModel();if(!!s.get(\"show\")){var l=i.getData(),u=n.getViewLabels();this._tickLabels=[],A(u,function(f){var h=f.tickValue,v=l.getItemModel(h),c=v.getModel(\"label\"),d=v.getModel([\"emphasis\",\"label\"]),p=v.getModel([\"progress\",\"label\"]),g=n.dataToCoord(f.tickValue),y=new Dt({x:g,y:0,rotation:t.labelRotation-t.rotation,onclick:Y(o._changeTimeline,o,h),silent:!1,style:Nt(c,{text:f.formattedLabel,align:t.labelAlign,verticalAlign:t.labelBaseline})});y.ensureState(\"emphasis\").style=Nt(d),y.ensureState(\"progress\").style=Nt(p),a.add(y),si(y),Uw(y).dataIndex=h,o._tickLabels.push(y)})}},e.prototype._renderControl=function(t,a,n,i){var o=t.controlSize,s=t.rotation,l=i.getModel(\"controlStyle\").getItemStyle(),u=i.getModel([\"emphasis\",\"controlStyle\"]).getItemStyle(),f=i.getPlayState(),h=i.get(\"inverse\",!0);v(t.nextBtnPosition,\"next\",Y(this._changeTimeline,this,h?\"-\":\"+\")),v(t.prevBtnPosition,\"prev\",Y(this._changeTimeline,this,h?\"+\":\"-\")),v(t.playPosition,f?\"stop\":\"play\",Y(this._handlePlayClick,this,!f),!0);function v(c,d,p,g){if(!!c){var y=Tr(ft(i.get([\"controlStyle\",d+\"BtnSize\"]),o),o),m=[0,-y/2,y,y],_=JZ(i,d+\"Icon\",m,{x:c[0],y:c[1],originX:o/2,originY:0,rotation:g?-s:0,rectHover:!0,style:l,onclick:p});_.ensureState(\"emphasis\").style=u,a.add(_),si(_)}}},e.prototype._renderCurrentPointer=function(t,a,n,i){var o=i.getData(),s=i.getCurrentIndex(),l=o.getItemModel(s).getModel(\"checkpointStyle\"),u=this,f={onCreate:function(h){h.draggable=!0,h.drift=Y(u._handlePointerDrag,u),h.ondragend=Y(u._handlePointerDragend,u),Zw(h,u._progressLine,s,n,i,!0)},onUpdate:function(h){Zw(h,u._progressLine,s,n,i)}};this._currentPointer=Yw(l,l,this._mainGroup,{},this._currentPointer,f)},e.prototype._handlePlayClick=function(t){this._clearTimer(),this.api.dispatchAction({type:\"timelinePlayChange\",playState:t,from:this.uid})},e.prototype._handlePointerDrag=function(t,a,n){this._clearTimer(),this._pointerChangeTimeline([n.offsetX,n.offsetY])},e.prototype._handlePointerDragend=function(t){this._pointerChangeTimeline([t.offsetX,t.offsetY],!0)},e.prototype._pointerChangeTimeline=function(t,a){var n=this._toAxisCoord(t)[0],i=this._axis,o=or(i.getExtent().slice());n>o[1]&&(n=o[1]),n<o[0]&&(n=o[0]),this._currentPointer.x=n,this._currentPointer.markRedraw();var s=this._progressLine;s&&(s.shape.x2=n,s.dirty());var l=this._findNearestTick(n),u=this.model;(a||l!==u.getCurrentIndex()&&u.get(\"realtime\"))&&this._changeTimeline(l)},e.prototype._doPlayStop=function(){var t=this;this._clearTimer(),this.model.getPlayState()&&(this._timer=setTimeout(function(){var a=t.model;t._changeTimeline(a.getCurrentIndex()+(a.get(\"rewind\",!0)?-1:1))},this.model.get(\"playInterval\")))},e.prototype._toAxisCoord=function(t){var a=this._mainGroup.getLocalTransform();return Cr(t,a,!0)},e.prototype._findNearestTick=function(t){var a=this.model.getData(),n=1/0,i,o=this._axis;return a.each([\"value\"],function(s,l){var u=o.dataToCoord(s),f=Math.abs(u-t);f<n&&(n=f,i=l)}),i},e.prototype._clearTimer=function(){this._timer&&(clearTimeout(this._timer),this._timer=null)},e.prototype._changeTimeline=function(t){var a=this.model.getCurrentIndex();t===\"+\"?t=a+1:t===\"-\"&&(t=a-1),this.api.dispatchAction({type:\"timelineChange\",currentIndex:t,from:this.uid})},e.prototype._updateTicksStatus=function(){var t=this.model.getCurrentIndex(),a=this._tickSymbols,n=this._tickLabels;if(a)for(var i=0;i<a.length;i++)a&&a[i]&&a[i].toggleState(\"progress\",i<t);if(n)for(var i=0;i<n.length;i++)n&&n[i]&&n[i].toggleState(\"progress\",Uw(n[i]).dataIndex<=t)},e.type=\"timeline.slider\",e}(UZ);function qZ(r,e){if(e=e||r.get(\"type\"),e)switch(e){case\"category\":return new py({ordinalMeta:r.getCategories(),extent:[1/0,-1/0]});case\"time\":return new TA({locale:r.ecModel.getLocaleModel(),useUTC:r.ecModel.get(\"useUTC\")});default:return new on}}function KZ(r,e){return re(r.getBoxLayoutParams(),{width:e.getWidth(),height:e.getHeight()},r.get(\"padding\"))}function JZ(r,e,t,a){var n=a.style,i=Al(r.get([\"controlStyle\",e]),a||{},new vt(t[0],t[1],t[2],t[3]));return n&&i.setStyle(n),i}function Yw(r,e,t,a,n,i){var o=e.get(\"color\");if(n)n.setColor(o),t.add(n),i&&i.onUpdate(n);else{var s=r.get(\"symbol\");n=jt(s,-1,-1,2,2,o),n.setStyle(\"strokeNoScale\",!0),t.add(n),i&&i.onCreate(n)}var l=e.getItemStyle([\"color\"]);n.setStyle(l),a=ht({rectHover:!0,z2:100},a,!0);var u=Bo(r.get(\"symbolSize\"));a.scaleX=u[0]/2,a.scaleY=u[1]/2;var f=Ti(r.get(\"symbolOffset\"),u);f&&(a.x=(a.x||0)+f[0],a.y=(a.y||0)+f[1]);var h=r.get(\"symbolRotate\");return a.rotation=(h||0)*Math.PI/180||0,n.attr(a),n.updateTransform(),n}function Zw(r,e,t,a,n,i){if(!r.dragging){var o=n.getModel(\"checkpointStyle\"),s=a.dataToCoord(n.getData().get(\"value\",t));if(i||!o.get(\"animation\",!0))r.attr({x:s,y:0}),e&&e.attr({shape:{x2:s}});else{var l={duration:o.get(\"animationDuration\",!0),easing:o.get(\"animationEasing\",!0)};r.stopAnimation(null,!0),r.animateTo({x:s,y:0},l),e&&e.animateTo({shape:{x2:s}},l)}}}var QZ=XZ;function jZ(r){r.registerAction({type:\"timelineChange\",event:\"timelineChanged\",update:\"prepareAndUpdate\"},function(e,t,a){var n=t.getComponent(\"timeline\");return n&&e.currentIndex!=null&&(n.setCurrentIndex(e.currentIndex),!n.get(\"loop\",!0)&&n.isIndexMax()&&n.getPlayState()&&(n.setPlayState(!1),a.dispatchAction({type:\"timelinePlayChange\",playState:!1,from:e.from}))),t.resetOption(\"timeline\",{replaceMerge:n.get(\"replaceMerge\",!0)}),tt({currentIndex:n.option.currentIndex},e)}),r.registerAction({type:\"timelinePlayChange\",event:\"timelinePlayChanged\",update:\"update\"},function(e,t){var a=t.getComponent(\"timeline\");a&&e.playState!=null&&a.setPlayState(e.playState)})}function tX(r){var e=r&&r.timeline;F(e)||(e=e?[e]:[]),A(e,function(t){!t||eX(t)})}function eX(r){var e=r.type,t={number:\"value\",time:\"time\"};if(t[e]&&(r.axisType=t[e],delete r.type),Xw(r),Xn(r,\"controlPosition\")){var a=r.controlStyle||(r.controlStyle={});Xn(a,\"position\")||(a.position=r.controlPosition),a.position===\"none\"&&!Xn(a,\"show\")&&(a.show=!1,delete a.position),delete r.controlPosition}A(r.data||[],function(n){et(n)&&!F(n)&&(!Xn(n,\"value\")&&Xn(n,\"name\")&&(n.value=n.name),Xw(n))})}function Xw(r){var e=r.itemStyle||(r.itemStyle={}),t=e.emphasis||(e.emphasis={}),a=r.label||r.label||{},n=a.normal||(a.normal={}),i={normal:1,emphasis:1};A(a,function(o,s){!i[s]&&!Xn(n,s)&&(n[s]=o)}),t.label&&!Xn(a,\"emphasis\")&&(a.emphasis=t.label,delete t.label)}function Xn(r,e){return r.hasOwnProperty(e)}function rX(r){r.registerComponentModel(WZ),r.registerComponentView(QZ),r.registerSubTypeDefaulter(\"timeline\",function(){return\"slider\"}),jZ(r),r.registerPreprocessor(tX)}function _m(r,e){if(!r)return!1;for(var t=F(r)?r:[r],a=0;a<t.length;a++)if(t[a]&&t[a][e])return!0;return!1}function zu(r){ci(r,\"label\",[\"show\"])}var Fu=Ct(),ML=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.createdBySelf=!1,t}return e.prototype.init=function(t,a,n){this.mergeDefaultAndTheme(t,n),this._mergeOption(t,n,!1,!0)},e.prototype.isAnimationEnabled=function(){if(At.node)return!1;var t=this.__hostSeries;return this.getShallow(\"animation\")&&t&&t.isAnimationEnabled()},e.prototype.mergeOption=function(t,a){this._mergeOption(t,a,!1,!1)},e.prototype._mergeOption=function(t,a,n,i){var o=this.mainType;n||a.eachSeries(function(s){var l=s.get(this.mainType,!0),u=Fu(s)[o];if(!l||!l.data){Fu(s)[o]=null;return}u?u._mergeOption(l,a,!0):(i&&zu(l),A(l.data,function(f){f instanceof Array?(zu(f[0]),zu(f[1])):zu(f)}),u=this.createMarkerModelFromSeries(l,this,a),V(u,{mainType:this.mainType,seriesIndex:s.seriesIndex,name:s.name,createdBySelf:!0}),u.__hostSeries=s),Fu(s)[o]=u},this)},e.prototype.formatTooltip=function(t,a,n){var i=this.getData(),o=this.getRawValue(t),s=i.getName(t);return oe(\"section\",{header:this.name,blocks:[oe(\"nameValue\",{name:s,value:o,noName:!s,noValue:o==null})]})},e.prototype.getData=function(){return this._data},e.prototype.setData=function(t){this._data=t},e.getMarkerModelFromSeries=function(t,a){return Fu(t)[a]},e.type=\"marker\",e.dependencies=[\"series\",\"grid\",\"polar\",\"geo\"],e}(Tt);te(ML,ay.prototype);var un=ML,aX=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.createMarkerModelFromSeries=function(t,a,n){return new e(t,a,n)},e.type=\"markPoint\",e.defaultOption={z:5,symbol:\"pin\",symbolSize:50,tooltip:{trigger:\"item\"},label:{show:!0,position:\"inside\"},itemStyle:{borderWidth:2},emphasis:{label:{show:!0}}},e}(un),nX=aX;function ag(r){return!(isNaN(parseFloat(r.x))&&isNaN(parseFloat(r.y)))}function iX(r){return!isNaN(parseFloat(r.x))&&!isNaN(parseFloat(r.y))}function Gu(r,e,t,a,n,i){var o=[],s=nn(e,a),l=s?e.getCalculationInfo(\"stackResultDimension\"):a,u=Sm(e,l,r),f=e.indicesOfNearest(l,u)[0];o[n]=e.get(t,f),o[i]=e.get(l,f);var h=e.get(a,f),v=Gr(e.get(a,f));return v=Math.min(v,20),v>=0&&(o[i]=+o[i].toFixed(v)),[o,h]}var fd={min:ot(Gu,\"min\"),max:ot(Gu,\"max\"),average:ot(Gu,\"average\"),median:ot(Gu,\"median\")};function pl(r,e){if(!!e){var t=r.getData(),a=r.coordinateSystem,n=a&&a.dimensions;if(!iX(e)&&!F(e.coord)&&F(n)){var i=LL(e,t,a,r);if(e=at(e),e.type&&fd[e.type]&&i.baseAxis&&i.valueAxis){var o=dt(n,i.baseAxis.dim),s=dt(n,i.valueAxis.dim),l=fd[e.type](t,i.baseDataDim,i.valueDataDim,o,s);e.coord=l[0],e.value=l[1]}else e.coord=[e.xAxis!=null?e.xAxis:e.radiusAxis,e.yAxis!=null?e.yAxis:e.angleAxis]}if(e.coord==null||!F(n))e.coord=[];else for(var u=e.coord,f=0;f<2;f++)fd[u[f]]&&(u[f]=Sm(t,t.mapDimension(n[f]),u[f]));return e}}function LL(r,e,t,a){var n={};return r.valueIndex!=null||r.valueDim!=null?(n.valueDataDim=r.valueIndex!=null?e.getDimension(r.valueIndex):r.valueDim,n.valueAxis=t.getAxis(oX(a,n.valueDataDim)),n.baseAxis=t.getOtherAxis(n.valueAxis),n.baseDataDim=e.mapDimension(n.baseAxis.dim)):(n.baseAxis=a.getBaseAxis(),n.valueAxis=t.getOtherAxis(n.baseAxis),n.baseDataDim=e.mapDimension(n.baseAxis.dim),n.valueDataDim=e.mapDimension(n.valueAxis.dim)),n}function oX(r,e){var t=r.getData().getDimensionInfo(e);return t&&t.coordDim}function gl(r,e){return r&&r.containData&&e.coord&&!ag(e)?r.containData(e.coord):!0}function sX(r,e,t){return r&&r.containZone&&e.coord&&t.coord&&!ag(e)&&!ag(t)?r.containZone(e.coord,t.coord):!0}function IL(r,e){return r?function(t,a,n,i){var o=i<2?t.coord&&t.coord[i]:t.value;return Qa(o,e[i])}:function(t,a,n,i){return Qa(t.value,e[i])}}function Sm(r,e,t){if(t===\"average\"){var a=0,n=0;return r.each(e,function(i,o){isNaN(i)||(a+=i,n++)}),a/n}else return t===\"median\"?r.getMedian(e):r.getDataExtent(e)[t===\"max\"?1:0]}var hd=Ct(),lX=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.init=function(){this.markerGroupMap=q()},e.prototype.render=function(t,a,n){var i=this,o=this.markerGroupMap;o.each(function(s){hd(s).keep=!1}),a.eachSeries(function(s){var l=un.getMarkerModelFromSeries(s,i.type);l&&i.renderSeries(s,l,a,n)}),o.each(function(s){!hd(s).keep&&i.group.remove(s.group)})},e.prototype.markKeep=function(t){hd(t).keep=!0},e.prototype.toggleBlurSeries=function(t,a){var n=this;A(t,function(i){var o=un.getMarkerModelFromSeries(i,n.type);if(o){var s=o.getData();s.eachItemGraphicEl(function(l){l&&(a?Q2(l):Ng(l))})}})},e.type=\"marker\",e}(Ut),xm=lX;function qw(r,e,t){var a=e.coordinateSystem;r.each(function(n){var i=r.getItemModel(n),o,s=W(i.get(\"x\"),t.getWidth()),l=W(i.get(\"y\"),t.getHeight());if(!isNaN(s)&&!isNaN(l))o=[s,l];else if(e.getMarkerPosition)o=e.getMarkerPosition(r.getValues(r.dimensions,n));else if(a){var u=r.get(a.dimensions[0],n),f=r.get(a.dimensions[1],n);o=a.dataToPoint([u,f])}isNaN(s)||(o[0]=s),isNaN(l)||(o[1]=l),r.setItemLayout(n,o)})}var uX=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.updateTransform=function(t,a,n){a.eachSeries(function(i){var o=un.getMarkerModelFromSeries(i,\"markPoint\");o&&(qw(o.getData(),i,n),this.markerGroupMap.get(i.id).updateLayout())},this)},e.prototype.renderSeries=function(t,a,n,i){var o=t.coordinateSystem,s=t.id,l=t.getData(),u=this.markerGroupMap,f=u.get(s)||u.set(s,new kl),h=fX(o,t,a);a.setData(h),qw(a.getData(),t,i),h.each(function(v){var c=h.getItemModel(v),d=c.getShallow(\"symbol\"),p=c.getShallow(\"symbolSize\"),g=c.getShallow(\"symbolRotate\"),y=c.getShallow(\"symbolOffset\"),m=c.getShallow(\"symbolKeepAspect\");if(J(d)||J(p)||J(g)||J(y)){var _=a.getRawValue(v),S=a.getDataParams(v);J(d)&&(d=d(_,S)),J(p)&&(p=p(_,S)),J(g)&&(g=g(_,S)),J(y)&&(y=y(_,S))}var w=c.getModel(\"itemStyle\").getItemStyle(),x=Ll(l,\"color\");w.fill||(w.fill=x),h.setItemVisual(v,{symbol:d,symbolSize:p,symbolRotate:g,symbolOffset:y,symbolKeepAspect:m,style:w})}),f.updateData(h),this.group.add(f.group),h.eachItemGraphicEl(function(v){v.traverse(function(c){it(c).dataModel=a})}),this.markKeep(f),f.group.silent=a.get(\"silent\")||t.get(\"silent\")},e.type=\"markPoint\",e}(xm);function fX(r,e,t){var a;r?a=G(r&&r.dimensions,function(s){var l=e.getData().getDimensionInfo(e.getData().mapDimension(s))||{};return V(V({},l),{name:s,ordinalMeta:null})}):a=[{name:\"value\",type:\"float\"}];var n=new De(a,t),i=G(t.get(\"data\"),ot(pl,e));r&&(i=Et(i,ot(gl,r)));var o=IL(!!r,a);return n.initData(i,null,o),n}var hX=uX;function vX(r){r.registerComponentModel(nX),r.registerComponentView(hX),r.registerPreprocessor(function(e){_m(e.series,\"markPoint\")&&(e.markPoint=e.markPoint||{})})}var cX=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.createMarkerModelFromSeries=function(t,a,n){return new e(t,a,n)},e.type=\"markLine\",e.defaultOption={z:5,symbol:[\"circle\",\"arrow\"],symbolSize:[8,16],symbolOffset:0,precision:2,tooltip:{trigger:\"item\"},label:{show:!0,position:\"end\",distance:5},lineStyle:{type:\"dashed\"},emphasis:{label:{show:!0},lineStyle:{width:3}},animationEasing:\"linear\"},e}(un),dX=cX,Hu=Ct(),pX=function(r,e,t,a){var n=r.getData(),i;if(F(a))i=a;else{var o=a.type;if(o===\"min\"||o===\"max\"||o===\"average\"||o===\"median\"||a.xAxis!=null||a.yAxis!=null){var s=void 0,l=void 0;if(a.yAxis!=null||a.xAxis!=null)s=e.getAxis(a.yAxis!=null?\"y\":\"x\"),l=le(a.yAxis,a.xAxis);else{var u=LL(a,n,e,r);s=u.valueAxis;var f=hA(n,u.valueDataDim);l=Sm(n,f,o)}var h=s.dim===\"x\"?0:1,v=1-h,c=at(a),d={coord:[]};c.type=null,c.coord=[],c.coord[v]=-1/0,d.coord[v]=1/0;var p=t.get(\"precision\");p>=0&&Mt(l)&&(l=+l.toFixed(Math.min(p,20))),c.coord[h]=d.coord[h]=l,i=[c,d,{type:o,valueIndex:a.valueIndex,value:l}]}else i=[]}var g=[pl(r,i[0]),pl(r,i[1]),V({},i[2])];return g[2].type=g[2].type||null,ht(g[2],g[0]),ht(g[2],g[1]),g};function nh(r){return!isNaN(r)&&!isFinite(r)}function Kw(r,e,t,a){var n=1-r,i=a.dimensions[r];return nh(e[n])&&nh(t[n])&&e[r]===t[r]&&a.getAxis(i).containData(e[r])}function gX(r,e){if(r.type===\"cartesian2d\"){var t=e[0].coord,a=e[1].coord;if(t&&a&&(Kw(1,t,a,r)||Kw(0,t,a,r)))return!0}return gl(r,e[0])&&gl(r,e[1])}function vd(r,e,t,a,n){var i=a.coordinateSystem,o=r.getItemModel(e),s,l=W(o.get(\"x\"),n.getWidth()),u=W(o.get(\"y\"),n.getHeight());if(!isNaN(l)&&!isNaN(u))s=[l,u];else{if(a.getMarkerPosition)s=a.getMarkerPosition(r.getValues(r.dimensions,e));else{var f=i.dimensions,h=r.get(f[0],e),v=r.get(f[1],e);s=i.dataToPoint([h,v])}if(Di(i,\"cartesian2d\")){var c=i.getAxis(\"x\"),d=i.getAxis(\"y\"),f=i.dimensions;nh(r.get(f[0],e))?s[0]=c.toGlobalCoord(c.getExtent()[t?0:1]):nh(r.get(f[1],e))&&(s[1]=d.toGlobalCoord(d.getExtent()[t?0:1]))}isNaN(l)||(s[0]=l),isNaN(u)||(s[1]=u)}r.setItemLayout(e,s)}var yX=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.updateTransform=function(t,a,n){a.eachSeries(function(i){var o=un.getMarkerModelFromSeries(i,\"markLine\");if(o){var s=o.getData(),l=Hu(o).from,u=Hu(o).to;l.each(function(f){vd(l,f,!0,i,n),vd(u,f,!1,i,n)}),s.each(function(f){s.setItemLayout(f,[l.getItemLayout(f),u.getItemLayout(f)])}),this.markerGroupMap.get(i.id).updateLayout()}},this)},e.prototype.renderSeries=function(t,a,n,i){var o=t.coordinateSystem,s=t.id,l=t.getData(),u=this.markerGroupMap,f=u.get(s)||u.set(s,new zy);this.group.add(f.group);var h=mX(o,t,a),v=h.from,c=h.to,d=h.line;Hu(a).from=v,Hu(a).to=c,a.setData(d);var p=a.get(\"symbol\"),g=a.get(\"symbolSize\"),y=a.get(\"symbolRotate\"),m=a.get(\"symbolOffset\");F(p)||(p=[p,p]),F(g)||(g=[g,g]),F(y)||(y=[y,y]),F(m)||(m=[m,m]),h.from.each(function(S){_(v,S,!0),_(c,S,!1)}),d.each(function(S){var w=d.getItemModel(S).getModel(\"lineStyle\").getLineStyle();d.setItemLayout(S,[v.getItemLayout(S),c.getItemLayout(S)]),w.stroke==null&&(w.stroke=v.getItemVisual(S,\"style\").fill),d.setItemVisual(S,{fromSymbolKeepAspect:v.getItemVisual(S,\"symbolKeepAspect\"),fromSymbolOffset:v.getItemVisual(S,\"symbolOffset\"),fromSymbolRotate:v.getItemVisual(S,\"symbolRotate\"),fromSymbolSize:v.getItemVisual(S,\"symbolSize\"),fromSymbol:v.getItemVisual(S,\"symbol\"),toSymbolKeepAspect:c.getItemVisual(S,\"symbolKeepAspect\"),toSymbolOffset:c.getItemVisual(S,\"symbolOffset\"),toSymbolRotate:c.getItemVisual(S,\"symbolRotate\"),toSymbolSize:c.getItemVisual(S,\"symbolSize\"),toSymbol:c.getItemVisual(S,\"symbol\"),style:w})}),f.updateData(d),h.line.eachItemGraphicEl(function(S){it(S).dataModel=a,S.traverse(function(w){it(w).dataModel=a})});function _(S,w,x){var b=S.getItemModel(w);vd(S,w,x,t,i);var C=b.getModel(\"itemStyle\").getItemStyle();C.fill==null&&(C.fill=Ll(l,\"color\")),S.setItemVisual(w,{symbolKeepAspect:b.get(\"symbolKeepAspect\"),symbolOffset:ft(b.get(\"symbolOffset\",!0),m[x?0:1]),symbolRotate:ft(b.get(\"symbolRotate\",!0),y[x?0:1]),symbolSize:ft(b.get(\"symbolSize\"),g[x?0:1]),symbol:ft(b.get(\"symbol\",!0),p[x?0:1]),style:C})}this.markKeep(f),f.group.silent=a.get(\"silent\")||t.get(\"silent\")},e.type=\"markLine\",e}(xm);function mX(r,e,t){var a;r?a=G(r&&r.dimensions,function(u){var f=e.getData().getDimensionInfo(e.getData().mapDimension(u))||{};return V(V({},f),{name:u,ordinalMeta:null})}):a=[{name:\"value\",type:\"float\"}];var n=new De(a,t),i=new De(a,t),o=new De([],t),s=G(t.get(\"data\"),ot(pX,e,r,t));r&&(s=Et(s,ot(gX,r)));var l=IL(!!r,a);return n.initData(G(s,function(u){return u[0]}),null,l),i.initData(G(s,function(u){return u[1]}),null,l),o.initData(G(s,function(u){return u[2]})),o.hasItemOption=!0,{from:n,to:i,line:o}}var _X=yX;function SX(r){r.registerComponentModel(dX),r.registerComponentView(_X),r.registerPreprocessor(function(e){_m(e.series,\"markLine\")&&(e.markLine=e.markLine||{})})}var xX=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.createMarkerModelFromSeries=function(t,a,n){return new e(t,a,n)},e.type=\"markArea\",e.defaultOption={z:1,tooltip:{trigger:\"item\"},animation:!1,label:{show:!0,position:\"top\"},itemStyle:{borderWidth:0},emphasis:{label:{show:!0,position:\"top\"}}},e}(un),wX=xX,Wu=Ct(),bX=function(r,e,t,a){var n=a[0],i=a[1];if(!(!n||!i)){var o=pl(r,n),s=pl(r,i),l=o.coord,u=s.coord;l[0]=le(l[0],-1/0),l[1]=le(l[1],-1/0),u[0]=le(u[0],1/0),u[1]=le(u[1],1/0);var f=_g([{},o,s]);return f.coord=[o.coord,s.coord],f.x0=o.x,f.y0=o.y,f.x1=s.x,f.y1=s.y,f}};function ih(r){return!isNaN(r)&&!isFinite(r)}function Jw(r,e,t,a){var n=1-r;return ih(e[n])&&ih(t[n])}function CX(r,e){var t=e.coord[0],a=e.coord[1],n={coord:t,x:e.x0,y:e.y0},i={coord:a,x:e.x1,y:e.y1};return Di(r,\"cartesian2d\")?t&&a&&(Jw(1,t,a)||Jw(0,t,a))?!0:sX(r,n,i):gl(r,n)||gl(r,i)}function Qw(r,e,t,a,n){var i=a.coordinateSystem,o=r.getItemModel(e),s,l=W(o.get(t[0]),n.getWidth()),u=W(o.get(t[1]),n.getHeight());if(!isNaN(l)&&!isNaN(u))s=[l,u];else{if(a.getMarkerPosition){var f=r.getValues([\"x0\",\"y0\"],e),h=r.getValues([\"x1\",\"y1\"],e),v=i.clampData(f),c=i.clampData(h),d=[];t[0]===\"x0\"?d[0]=v[0]>c[0]?h[0]:f[0]:d[0]=v[0]>c[0]?f[0]:h[0],t[1]===\"y0\"?d[1]=v[1]>c[1]?h[1]:f[1]:d[1]=v[1]>c[1]?f[1]:h[1],s=a.getMarkerPosition(d,t,!0)}else{var p=r.get(t[0],e),g=r.get(t[1],e),y=[p,g];i.clampData&&i.clampData(y,y),s=i.dataToPoint(y,!0)}if(Di(i,\"cartesian2d\")){var m=i.getAxis(\"x\"),_=i.getAxis(\"y\"),p=r.get(t[0],e),g=r.get(t[1],e);ih(p)?s[0]=m.toGlobalCoord(m.getExtent()[t[0]===\"x0\"?0:1]):ih(g)&&(s[1]=_.toGlobalCoord(_.getExtent()[t[1]===\"y0\"?0:1]))}isNaN(l)||(s[0]=l),isNaN(u)||(s[1]=u)}return s}var jw=[[\"x0\",\"y0\"],[\"x1\",\"y0\"],[\"x1\",\"y1\"],[\"x0\",\"y1\"]],TX=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.updateTransform=function(t,a,n){a.eachSeries(function(i){var o=un.getMarkerModelFromSeries(i,\"markArea\");if(o){var s=o.getData();s.each(function(l){var u=G(jw,function(h){return Qw(s,l,h,i,n)});s.setItemLayout(l,u);var f=s.getItemGraphicEl(l);f.setShape(\"points\",u)})}},this)},e.prototype.renderSeries=function(t,a,n,i){var o=t.coordinateSystem,s=t.id,l=t.getData(),u=this.markerGroupMap,f=u.get(s)||u.set(s,{group:new nt});this.group.add(f.group),this.markKeep(f);var h=AX(o,t,a);a.setData(h),h.each(function(v){var c=G(jw,function(C){return Qw(h,v,C,t,i)}),d=o.getAxis(\"x\").scale,p=o.getAxis(\"y\").scale,g=d.getExtent(),y=p.getExtent(),m=[d.parse(h.get(\"x0\",v)),d.parse(h.get(\"x1\",v))],_=[p.parse(h.get(\"y0\",v)),p.parse(h.get(\"y1\",v))];or(m),or(_);var S=!(g[0]>m[1]||g[1]<m[0]||y[0]>_[1]||y[1]<_[0]),w=!S;h.setItemLayout(v,{points:c,allClipped:w});var x=h.getItemModel(v).getModel(\"itemStyle\").getItemStyle(),b=Ll(l,\"color\");x.fill||(x.fill=b,U(x.fill)&&(x.fill=_f(x.fill,.4))),x.stroke||(x.stroke=b),h.setItemVisual(v,\"style\",x)}),h.diff(Wu(f).data).add(function(v){var c=h.getItemLayout(v);if(!c.allClipped){var d=new ze({shape:{points:c.points}});h.setItemGraphicEl(v,d),f.group.add(d)}}).update(function(v,c){var d=Wu(f).data.getItemGraphicEl(c),p=h.getItemLayout(v);p.allClipped?d&&f.group.remove(d):(d?Lt(d,{shape:{points:p.points}},a,v):d=new ze({shape:{points:p.points}}),h.setItemGraphicEl(v,d),f.group.add(d))}).remove(function(v){var c=Wu(f).data.getItemGraphicEl(v);f.group.remove(c)}).execute(),h.eachItemGraphicEl(function(v,c){var d=h.getItemModel(c),p=h.getItemVisual(c,\"style\");v.useStyle(h.getItemVisual(c,\"style\")),de(v,ie(d),{labelFetcher:a,labelDataIndex:c,defaultText:h.getName(c)||\"\",inheritColor:U(p.fill)?_f(p.fill,1):\"#000\"}),ce(v,d),$t(v,null,null,d.get([\"emphasis\",\"disabled\"])),it(v).dataModel=a}),Wu(f).data=h,f.group.silent=a.get(\"silent\")||t.get(\"silent\")},e.type=\"markArea\",e}(xm);function AX(r,e,t){var a,n,i=[\"x0\",\"y0\",\"x1\",\"y1\"];if(r){var o=G(r&&r.dimensions,function(u){var f=e.getData(),h=f.getDimensionInfo(f.mapDimension(u))||{};return V(V({},h),{name:u,ordinalMeta:null})});n=G(i,function(u,f){return{name:u,type:o[f%2].type}}),a=new De(n,t)}else n=[{name:\"value\",type:\"float\"}],a=new De(n,t);var s=G(t.get(\"data\"),ot(bX,e,r,t));r&&(s=Et(s,ot(CX,r)));var l=r?function(u,f,h,v){var c=u.coord[Math.floor(v/2)][v%2];return Qa(c,n[v])}:function(u,f,h,v){return Qa(u.value,n[v])};return a.initData(s,null,l),a.hasItemOption=!0,a}var DX=TX;function MX(r){r.registerComponentModel(wX),r.registerComponentView(DX),r.registerPreprocessor(function(e){_m(e.series,\"markArea\")&&(e.markArea=e.markArea||{})})}var LX=function(r,e){if(e===\"all\")return{type:\"all\",title:r.getLocaleModel().get([\"legend\",\"selector\",\"all\"])};if(e===\"inverse\")return{type:\"inverse\",title:r.getLocaleModel().get([\"legend\",\"selector\",\"inverse\"])}},IX=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.layoutMode={type:\"box\",ignoreSize:!0},t}return e.prototype.init=function(t,a,n){this.mergeDefaultAndTheme(t,n),t.selected=t.selected||{},this._updateSelector(t)},e.prototype.mergeOption=function(t,a){r.prototype.mergeOption.call(this,t,a),this._updateSelector(t)},e.prototype._updateSelector=function(t){var a=t.selector,n=this.ecModel;a===!0&&(a=t.selector=[\"all\",\"inverse\"]),F(a)&&A(a,function(i,o){U(i)&&(i={type:i}),a[o]=ht(i,LX(n,i.type))})},e.prototype.optionUpdated=function(){this._updateData(this.ecModel);var t=this._data;if(t[0]&&this.get(\"selectedMode\")===\"single\"){for(var a=!1,n=0;n<t.length;n++){var i=t[n].get(\"name\");if(this.isSelected(i)){this.select(i),a=!0;break}}!a&&this.select(t[0].get(\"name\"))}},e.prototype._updateData=function(t){var a=[],n=[];t.eachRawSeries(function(l){var u=l.name;n.push(u);var f;if(l.legendVisualProvider){var h=l.legendVisualProvider,v=h.getAllNames();t.isSeriesFiltered(l)||(n=n.concat(v)),v.length?a=a.concat(v):f=!0}else f=!0;f&&Ig(l)&&a.push(l.name)}),this._availableNames=n;var i=this.get(\"data\")||a,o=q(),s=G(i,function(l){return(U(l)||Mt(l))&&(l={name:l}),o.get(l.name)?null:(o.set(l.name,!0),new Vt(l,this,this.ecModel))},this);this._data=Et(s,function(l){return!!l})},e.prototype.getData=function(){return this._data},e.prototype.select=function(t){var a=this.option.selected,n=this.get(\"selectedMode\");if(n===\"single\"){var i=this._data;A(i,function(o){a[o.get(\"name\")]=!1})}a[t]=!0},e.prototype.unSelect=function(t){this.get(\"selectedMode\")!==\"single\"&&(this.option.selected[t]=!1)},e.prototype.toggleSelected=function(t){var a=this.option.selected;a.hasOwnProperty(t)||(a[t]=!0),this[a[t]?\"unSelect\":\"select\"](t)},e.prototype.allSelect=function(){var t=this._data,a=this.option.selected;A(t,function(n){a[n.get(\"name\",!0)]=!0})},e.prototype.inverseSelect=function(){var t=this._data,a=this.option.selected;A(t,function(n){var i=n.get(\"name\",!0);a.hasOwnProperty(i)||(a[i]=!0),a[i]=!a[i]})},e.prototype.isSelected=function(t){var a=this.option.selected;return!(a.hasOwnProperty(t)&&!a[t])&&dt(this._availableNames,t)>=0},e.prototype.getOrient=function(){return this.get(\"orient\")===\"vertical\"?{index:1,name:\"vertical\"}:{index:0,name:\"horizontal\"}},e.type=\"legend.plain\",e.dependencies=[\"series\"],e.defaultOption={z:4,show:!0,orient:\"horizontal\",left:\"center\",top:0,align:\"auto\",backgroundColor:\"rgba(0,0,0,0)\",borderColor:\"#ccc\",borderRadius:0,borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,symbolRotate:\"inherit\",symbolKeepAspect:!0,inactiveColor:\"#ccc\",inactiveBorderColor:\"#ccc\",inactiveBorderWidth:\"auto\",itemStyle:{color:\"inherit\",opacity:\"inherit\",borderColor:\"inherit\",borderWidth:\"auto\",borderCap:\"inherit\",borderJoin:\"inherit\",borderDashOffset:\"inherit\",borderMiterLimit:\"inherit\"},lineStyle:{width:\"auto\",color:\"inherit\",inactiveColor:\"#ccc\",inactiveWidth:2,opacity:\"inherit\",type:\"inherit\",cap:\"inherit\",join:\"inherit\",dashOffset:\"inherit\",miterLimit:\"inherit\"},textStyle:{color:\"#333\"},selectedMode:!0,selector:!1,selectorLabel:{show:!0,borderRadius:10,padding:[3,5,3,5],fontSize:12,fontFamily:\"sans-serif\",color:\"#666\",borderWidth:1,borderColor:\"#666\"},emphasis:{selectorLabel:{show:!0,color:\"#eee\",backgroundColor:\"#666\"}},selectorPosition:\"auto\",selectorItemGap:7,selectorButtonGap:10,tooltip:{show:!1}},e}(Tt),ng=IX,Zi=ot,ig=A,$u=nt,PX=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.newlineDisabled=!1,t}return e.prototype.init=function(){this.group.add(this._contentGroup=new $u),this.group.add(this._selectorGroup=new $u),this._isFirstRender=!0},e.prototype.getContentGroup=function(){return this._contentGroup},e.prototype.getSelectorGroup=function(){return this._selectorGroup},e.prototype.render=function(t,a,n){var i=this._isFirstRender;if(this._isFirstRender=!1,this.resetInner(),!!t.get(\"show\",!0)){var o=t.get(\"align\"),s=t.get(\"orient\");(!o||o===\"auto\")&&(o=t.get(\"left\")===\"right\"&&s===\"vertical\"?\"right\":\"left\");var l=t.get(\"selector\",!0),u=t.get(\"selectorPosition\",!0);l&&(!u||u===\"auto\")&&(u=s===\"horizontal\"?\"end\":\"start\"),this.renderInner(o,t,a,n,l,s,u);var f=t.getBoxLayoutParams(),h={width:n.getWidth(),height:n.getHeight()},v=t.get(\"padding\"),c=re(f,h,v),d=this.layoutInner(t,o,c,i,l,u),p=re(tt({width:d.width,height:d.height},f),h,v);this.group.x=p.x-d.x,this.group.y=p.y-d.y,this.group.markRedraw(),this.group.add(this._backgroundEl=gL(d,t))}},e.prototype.resetInner=function(){this.getContentGroup().removeAll(),this._backgroundEl&&this.group.remove(this._backgroundEl),this.getSelectorGroup().removeAll()},e.prototype.renderInner=function(t,a,n,i,o,s,l){var u=this.getContentGroup(),f=q(),h=a.get(\"selectedMode\"),v=[];n.eachRawSeries(function(c){!c.get(\"legendHoverLink\")&&v.push(c.id)}),ig(a.getData(),function(c,d){var p=c.get(\"name\");if(!this.newlineDisabled&&(p===\"\"||p===`\n`)){var g=new $u;g.newline=!0,u.add(g);return}var y=n.getSeriesByName(p)[0];if(!f.get(p))if(y){var m=y.getData(),_=m.getVisual(\"legendLineStyle\")||{},S=m.getVisual(\"legendIcon\"),w=m.getVisual(\"style\"),x=this._createItem(y,p,d,c,a,t,_,w,S,h,i);x.on(\"click\",Zi(tb,p,null,i,v)).on(\"mouseover\",Zi(og,y.name,null,i,v)).on(\"mouseout\",Zi(sg,y.name,null,i,v)),f.set(p,!0)}else n.eachRawSeries(function(b){if(!f.get(p)&&b.legendVisualProvider){var C=b.legendVisualProvider;if(!C.containName(p))return;var T=C.indexOfName(p),D=C.getItemVisual(T,\"style\"),M=C.getItemVisual(T,\"legendIcon\"),L=We(D.fill);L&&L[3]===0&&(L[3]=.2,D=V(V({},D),{fill:va(L,\"rgba\")}));var I=this._createItem(b,p,d,c,a,t,{},D,M,h,i);I.on(\"click\",Zi(tb,null,p,i,v)).on(\"mouseover\",Zi(og,null,p,i,v)).on(\"mouseout\",Zi(sg,null,p,i,v)),f.set(p,!0)}},this)},this),o&&this._createSelector(o,a,i,s,l)},e.prototype._createSelector=function(t,a,n,i,o){var s=this.getSelectorGroup();ig(t,function(u){var f=u.type,h=new Dt({style:{x:0,y:0,align:\"center\",verticalAlign:\"middle\"},onclick:function(){n.dispatchAction({type:f===\"all\"?\"legendAllSelect\":\"legendInverseSelect\"})}});s.add(h);var v=a.getModel(\"selectorLabel\"),c=a.getModel([\"emphasis\",\"selectorLabel\"]);de(h,{normal:v,emphasis:c},{defaultText:u.title}),si(h)})},e.prototype._createItem=function(t,a,n,i,o,s,l,u,f,h,v){var c=t.visualDrawType,d=o.get(\"itemWidth\"),p=o.get(\"itemHeight\"),g=o.isSelected(a),y=i.get(\"symbolRotate\"),m=i.get(\"symbolKeepAspect\"),_=i.get(\"icon\");f=_||f||\"roundRect\";var S=RX(f,i,l,u,c,g,v),w=new $u,x=i.getModel(\"textStyle\");if(J(t.getLegendIcon)&&(!_||_===\"inherit\"))w.add(t.getLegendIcon({itemWidth:d,itemHeight:p,icon:f,iconRotate:y,itemStyle:S.itemStyle,lineStyle:S.lineStyle,symbolKeepAspect:m}));else{var b=_===\"inherit\"&&t.getData().getVisual(\"symbol\")?y===\"inherit\"?t.getData().getVisual(\"symbolRotate\"):y:0;w.add(EX({itemWidth:d,itemHeight:p,icon:f,iconRotate:b,itemStyle:S.itemStyle,lineStyle:S.lineStyle,symbolKeepAspect:m}))}var C=s===\"left\"?d+5:-5,T=s,D=o.get(\"formatter\"),M=a;U(D)&&D?M=D.replace(\"{name}\",a!=null?a:\"\"):J(D)&&(M=D(a));var L=g?x.getTextColor():i.get(\"inactiveColor\");w.add(new Dt({style:Nt(x,{text:M,x:C,y:p/2,fill:L,align:T,verticalAlign:\"middle\"},{inheritColor:L})}));var I=new bt({shape:w.getBoundingRect(),invisible:!0}),P=i.getModel(\"tooltip\");return P.get(\"show\")&&Do({el:I,componentModel:o,itemName:a,itemTooltipOption:P.option}),w.add(I),w.eachChild(function(R){R.silent=!0}),I.silent=!h,this.getContentGroup().add(w),si(w),w.__legendDataIndex=n,w},e.prototype.layoutInner=function(t,a,n,i,o,s){var l=this.getContentGroup(),u=this.getSelectorGroup();ui(t.get(\"orient\"),l,t.get(\"itemGap\"),n.width,n.height);var f=l.getBoundingRect(),h=[-f.x,-f.y];if(u.markRedraw(),l.markRedraw(),o){ui(\"horizontal\",u,t.get(\"selectorItemGap\",!0));var v=u.getBoundingRect(),c=[-v.x,-v.y],d=t.get(\"selectorButtonGap\",!0),p=t.getOrient().index,g=p===0?\"width\":\"height\",y=p===0?\"height\":\"width\",m=p===0?\"y\":\"x\";s===\"end\"?c[p]+=f[g]+d:h[p]+=v[g]+d,c[1-p]+=f[y]/2-v[y]/2,u.x=c[0],u.y=c[1],l.x=h[0],l.y=h[1];var _={x:0,y:0};return _[g]=f[g]+d+v[g],_[y]=Math.max(f[y],v[y]),_[m]=Math.min(0,v[m]+c[1-p]),_}else return l.x=h[0],l.y=h[1],this.group.getBoundingRect()},e.prototype.remove=function(){this.getContentGroup().removeAll(),this._isFirstRender=!0},e.type=\"legend.plain\",e}(Ut);function RX(r,e,t,a,n,i,o){function s(g,y){g.lineWidth===\"auto\"&&(g.lineWidth=y.lineWidth>0?2:0),ig(g,function(m,_){g[_]===\"inherit\"&&(g[_]=y[_])})}var l=e.getModel(\"itemStyle\"),u=l.getItemStyle(),f=r.lastIndexOf(\"empty\",0)===0?\"fill\":\"stroke\",h=l.getShallow(\"decal\");u.decal=!h||h===\"inherit\"?a.decal:co(h,o),u.fill===\"inherit\"&&(u.fill=a[n]),u.stroke===\"inherit\"&&(u.stroke=a[f]),u.opacity===\"inherit\"&&(u.opacity=(n===\"fill\"?a:t).opacity),s(u,a);var v=e.getModel(\"lineStyle\"),c=v.getLineStyle();if(s(c,t),u.fill===\"auto\"&&(u.fill=a.fill),u.stroke===\"auto\"&&(u.stroke=a.fill),c.stroke===\"auto\"&&(c.stroke=a.fill),!i){var d=e.get(\"inactiveBorderWidth\"),p=u[f];u.lineWidth=d===\"auto\"?a.lineWidth>0&&p?2:0:u.lineWidth,u.fill=e.get(\"inactiveColor\"),u.stroke=e.get(\"inactiveBorderColor\"),c.stroke=v.get(\"inactiveColor\"),c.lineWidth=v.get(\"inactiveWidth\")}return{itemStyle:u,lineStyle:c}}function EX(r){var e=r.icon||\"roundRect\",t=jt(e,0,0,r.itemWidth,r.itemHeight,r.itemStyle.fill,r.symbolKeepAspect);return t.setStyle(r.itemStyle),t.rotation=(r.iconRotate||0)*Math.PI/180,t.setOrigin([r.itemWidth/2,r.itemHeight/2]),e.indexOf(\"empty\")>-1&&(t.style.stroke=t.style.fill,t.style.fill=\"#fff\",t.style.lineWidth=2),t}function tb(r,e,t,a){sg(r,e,t,a),t.dispatchAction({type:\"legendToggleSelect\",name:r!=null?r:e}),og(r,e,t,a)}function PL(r){for(var e=r.getZr().storage.getDisplayList(),t,a=0,n=e.length;a<n&&!(t=e[a].states.emphasis);)a++;return t&&t.hoverLayer}function og(r,e,t,a){PL(t)||t.dispatchAction({type:\"highlight\",seriesName:r,name:e,excludeSeriesId:a})}function sg(r,e,t,a){PL(t)||t.dispatchAction({type:\"downplay\",seriesName:r,name:e,excludeSeriesId:a})}var RL=PX;function kX(r){var e=r.findComponents({mainType:\"legend\"});e&&e.length&&r.filterSeries(function(t){for(var a=0;a<e.length;a++)if(!e[a].isSelected(t.name))return!1;return!0})}function fs(r,e,t){var a={},n=r===\"toggleSelected\",i;return t.eachComponent(\"legend\",function(o){n&&i!=null?o[i?\"select\":\"unSelect\"](e.name):r===\"allSelect\"||r===\"inverseSelect\"?o[r]():(o[r](e.name),i=o.isSelected(e.name));var s=o.getData();A(s,function(l){var u=l.get(\"name\");if(!(u===`\n`||u===\"\")){var f=o.isSelected(u);a.hasOwnProperty(u)?a[u]=a[u]&&f:a[u]=f}})}),r===\"allSelect\"||r===\"inverseSelect\"?{selected:a}:{name:e.name,selected:a}}function OX(r){r.registerAction(\"legendToggleSelect\",\"legendselectchanged\",ot(fs,\"toggleSelected\")),r.registerAction(\"legendAllSelect\",\"legendselectall\",ot(fs,\"allSelect\")),r.registerAction(\"legendInverseSelect\",\"legendinverseselect\",ot(fs,\"inverseSelect\")),r.registerAction(\"legendSelect\",\"legendselected\",ot(fs,\"select\")),r.registerAction(\"legendUnSelect\",\"legendunselected\",ot(fs,\"unSelect\"))}function EL(r){r.registerComponentModel(ng),r.registerComponentView(RL),r.registerProcessor(r.PRIORITY.PROCESSOR.SERIES_FILTER,kX),r.registerSubTypeDefaulter(\"legend\",function(){return\"plain\"}),OX(r)}var BX=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.setScrollDataIndex=function(t){this.option.scrollDataIndex=t},e.prototype.init=function(t,a,n){var i=Po(t);r.prototype.init.call(this,t,a,n),eb(this,t,i)},e.prototype.mergeOption=function(t,a){r.prototype.mergeOption.call(this,t,a),eb(this,this.option,t)},e.type=\"legend.scroll\",e.defaultOption=cn(ng.defaultOption,{scrollDataIndex:0,pageButtonItemGap:5,pageButtonGap:null,pageButtonPosition:\"end\",pageFormatter:\"{current}/{total}\",pageIcons:{horizontal:[\"M0,0L12,-10L12,10z\",\"M0,0L-12,-10L-12,10z\"],vertical:[\"M0,0L20,0L10,-20z\",\"M0,0L20,0L10,20z\"]},pageIconColor:\"#2f4554\",pageIconInactiveColor:\"#aaa\",pageIconSize:15,pageTextStyle:{color:\"#333\"},animationDurationUpdate:800}),e}(ng);function eb(r,e,t){var a=r.getOrient(),n=[1,1];n[a.index]=0,an(e,t,{type:\"box\",ignoreSize:!!n})}var NX=BX,rb=nt,cd=[\"width\",\"height\"],dd=[\"x\",\"y\"],VX=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.newlineDisabled=!0,t._currentIndex=0,t}return e.prototype.init=function(){r.prototype.init.call(this),this.group.add(this._containerGroup=new rb),this._containerGroup.add(this.getContentGroup()),this.group.add(this._controllerGroup=new rb)},e.prototype.resetInner=function(){r.prototype.resetInner.call(this),this._controllerGroup.removeAll(),this._containerGroup.removeClipPath(),this._containerGroup.__rectSize=null},e.prototype.renderInner=function(t,a,n,i,o,s,l){var u=this;r.prototype.renderInner.call(this,t,a,n,i,o,s,l);var f=this._controllerGroup,h=a.get(\"pageIconSize\",!0),v=F(h)?h:[h,h];d(\"pagePrev\",0);var c=a.getModel(\"pageTextStyle\");f.add(new Dt({name:\"pageText\",style:{text:\"xx/xx\",fill:c.getTextColor(),font:c.getFont(),verticalAlign:\"middle\",align:\"center\"},silent:!0})),d(\"pageNext\",1);function d(p,g){var y=p+\"DataIndex\",m=Al(a.get(\"pageIcons\",!0)[a.getOrient().name][g],{onclick:Y(u._pageGo,u,y,a,i)},{x:-v[0]/2,y:-v[1]/2,width:v[0],height:v[1]});m.name=p,f.add(m)}},e.prototype.layoutInner=function(t,a,n,i,o,s){var l=this.getSelectorGroup(),u=t.getOrient().index,f=cd[u],h=dd[u],v=cd[1-u],c=dd[1-u];o&&ui(\"horizontal\",l,t.get(\"selectorItemGap\",!0));var d=t.get(\"selectorButtonGap\",!0),p=l.getBoundingRect(),g=[-p.x,-p.y],y=at(n);o&&(y[f]=n[f]-p[f]-d);var m=this._layoutContentAndController(t,i,y,u,f,v,c,h);if(o){if(s===\"end\")g[u]+=m[f]+d;else{var _=p[f]+d;g[u]-=_,m[h]-=_}m[f]+=p[f]+d,g[1-u]+=m[c]+m[v]/2-p[v]/2,m[v]=Math.max(m[v],p[v]),m[c]=Math.min(m[c],p[c]+g[1-u]),l.x=g[0],l.y=g[1],l.markRedraw()}return m},e.prototype._layoutContentAndController=function(t,a,n,i,o,s,l,u){var f=this.getContentGroup(),h=this._containerGroup,v=this._controllerGroup;ui(t.get(\"orient\"),f,t.get(\"itemGap\"),i?n.width:null,i?null:n.height),ui(\"horizontal\",v,t.get(\"pageButtonItemGap\",!0));var c=f.getBoundingRect(),d=v.getBoundingRect(),p=this._showController=c[o]>n[o],g=[-c.x,-c.y];a||(g[i]=f[u]);var y=[0,0],m=[-d.x,-d.y],_=ft(t.get(\"pageButtonGap\",!0),t.get(\"itemGap\",!0));if(p){var S=t.get(\"pageButtonPosition\",!0);S===\"end\"?m[i]+=n[o]-d[o]:y[i]+=d[o]+_}m[1-i]+=c[s]/2-d[s]/2,f.setPosition(g),h.setPosition(y),v.setPosition(m);var w={x:0,y:0};if(w[o]=p?n[o]:c[o],w[s]=Math.max(c[s],d[s]),w[l]=Math.min(0,d[l]+m[1-i]),h.__rectSize=n[o],p){var x={x:0,y:0};x[o]=Math.max(n[o]-d[o]-_,0),x[s]=w[s],h.setClipPath(new bt({shape:x})),h.__rectSize=x[o]}else v.eachChild(function(C){C.attr({invisible:!0,silent:!0})});var b=this._getPageInfo(t);return b.pageIndex!=null&&Lt(f,{x:b.contentPosition[0],y:b.contentPosition[1]},p?t:null),this._updatePageInfoView(t,b),w},e.prototype._pageGo=function(t,a,n){var i=this._getPageInfo(a)[t];i!=null&&n.dispatchAction({type:\"legendScroll\",scrollDataIndex:i,legendId:a.id})},e.prototype._updatePageInfoView=function(t,a){var n=this._controllerGroup;A([\"pagePrev\",\"pageNext\"],function(f){var h=f+\"DataIndex\",v=a[h]!=null,c=n.childOfName(f);c&&(c.setStyle(\"fill\",v?t.get(\"pageIconColor\",!0):t.get(\"pageIconInactiveColor\",!0)),c.cursor=v?\"pointer\":\"default\")});var i=n.childOfName(\"pageText\"),o=t.get(\"pageFormatter\"),s=a.pageIndex,l=s!=null?s+1:0,u=a.pageCount;i&&o&&i.setStyle(\"text\",U(o)?o.replace(\"{current}\",l==null?\"\":l+\"\").replace(\"{total}\",u==null?\"\":u+\"\"):o({current:l,total:u}))},e.prototype._getPageInfo=function(t){var a=t.get(\"scrollDataIndex\",!0),n=this.getContentGroup(),i=this._containerGroup.__rectSize,o=t.getOrient().index,s=cd[o],l=dd[o],u=this._findTargetItemIndex(a),f=n.children(),h=f[u],v=f.length,c=v?1:0,d={contentPosition:[n.x,n.y],pageCount:c,pageIndex:c-1,pagePrevDataIndex:null,pageNextDataIndex:null};if(!h)return d;var p=S(h);d.contentPosition[o]=-p.s;for(var g=u+1,y=p,m=p,_=null;g<=v;++g)_=S(f[g]),(!_&&m.e>y.s+i||_&&!w(_,y.s))&&(m.i>y.i?y=m:y=_,y&&(d.pageNextDataIndex==null&&(d.pageNextDataIndex=y.i),++d.pageCount)),m=_;for(var g=u-1,y=p,m=p,_=null;g>=-1;--g)_=S(f[g]),(!_||!w(m,_.s))&&y.i<m.i&&(m=y,d.pagePrevDataIndex==null&&(d.pagePrevDataIndex=y.i),++d.pageCount,++d.pageIndex),y=_;return d;function S(x){if(x){var b=x.getBoundingRect(),C=b[l]+x[l];return{s:C,e:C+b[s],i:x.__legendDataIndex}}}function w(x,b){return x.e>=b&&x.s<=b+i}},e.prototype._findTargetItemIndex=function(t){if(!this._showController)return 0;var a,n=this.getContentGroup(),i;return n.eachChild(function(o,s){var l=o.__legendDataIndex;i==null&&l!=null&&(i=s),l===t&&(a=s)}),a!=null?a:i},e.type=\"legend.scroll\",e}(RL),zX=VX;function FX(r){r.registerAction(\"legendScroll\",\"legendscroll\",function(e,t){var a=e.scrollDataIndex;a!=null&&t.eachComponent({mainType:\"legend\",subType:\"scroll\",query:e},function(n){n.setScrollDataIndex(a)})})}function GX(r){ct(EL),r.registerComponentModel(NX),r.registerComponentView(zX),FX(r)}function kL(r){ct(EL),ct(GX)}var HX=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.type=\"dataZoom.inside\",e.defaultOption=cn(dl.defaultOption,{disabled:!1,zoomLock:!1,zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!1,preventDefaultMouseMove:!0}),e}(dl),WX=HX,wm=Ct();function $X(r,e,t){wm(r).coordSysRecordMap.each(function(a){var n=a.dataZoomInfoMap.get(e.uid);n&&(n.getRange=t)})}function UX(r,e){for(var t=wm(r).coordSysRecordMap,a=t.keys(),n=0;n<a.length;n++){var i=a[n],o=t.get(i),s=o.dataZoomInfoMap;if(s){var l=e.uid,u=s.get(l);u&&(s.removeKey(l),s.keys().length||OL(t,o))}}}function OL(r,e){if(e){r.removeKey(e.model.uid);var t=e.controller;t&&t.dispose()}}function YX(r,e){var t={model:e,containsPoint:ot(XX,e),dispatchAction:ot(ZX,r),dataZoomInfoMap:null,controller:null},a=t.controller=new Vl(r.getZr());return A([\"pan\",\"zoom\",\"scrollMove\"],function(n){a.on(n,function(i){var o=[];t.dataZoomInfoMap.each(function(s){if(!!i.isAvailableBehavior(s.model.option)){var l=(s.getRange||{})[n],u=l&&l(s.dzReferCoordSysInfo,t.model.mainType,t.controller,i);!s.model.get(\"disabled\",!0)&&u&&o.push({dataZoomId:s.model.id,start:u[0],end:u[1]})}}),o.length&&t.dispatchAction(o)})}),t}function ZX(r,e){r.isDisposed()||r.dispatchAction({type:\"dataZoom\",animation:{easing:\"cubicOut\",duration:100},batch:e})}function XX(r,e,t,a){return r.coordinateSystem.containPoint([t,a])}function qX(r){var e,t=\"type_\",a={type_true:2,type_move:1,type_false:0,type_undefined:-1},n=!0;return r.each(function(i){var o=i.model,s=o.get(\"disabled\",!0)?!1:o.get(\"zoomLock\",!0)?\"move\":!0;a[t+s]>a[t+e]&&(e=s),n=n&&o.get(\"preventDefaultMouseMove\",!0)}),{controlType:e,opt:{zoomOnMouseWheel:!0,moveOnMouseMove:!0,moveOnMouseWheel:!0,preventDefaultMouseMove:!!n}}}function KX(r){r.registerProcessor(r.PRIORITY.PROCESSOR.FILTER,function(e,t){var a=wm(t),n=a.coordSysRecordMap||(a.coordSysRecordMap=q());n.each(function(i){i.dataZoomInfoMap=null}),e.eachComponent({mainType:\"dataZoom\",subType:\"inside\"},function(i){var o=cL(i);A(o.infoList,function(s){var l=s.model.uid,u=n.get(l)||n.set(l,YX(t,s.model)),f=u.dataZoomInfoMap||(u.dataZoomInfoMap=q());f.set(i.uid,{dzReferCoordSysInfo:s,model:i,getRange:null})})}),n.each(function(i){var o=i.controller,s,l=i.dataZoomInfoMap;if(l){var u=l.keys()[0];u!=null&&(s=l.get(u))}if(!s){OL(n,i);return}var f=qX(l);o.enable(f.controlType,f.opt),o.setPointerChecker(i.containsPoint),Oo(i,\"dispatchAction\",s.model.get(\"throttle\",!0),\"fixRate\")})})}var JX=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=\"dataZoom.inside\",t}return e.prototype.render=function(t,a,n){if(r.prototype.render.apply(this,arguments),t.noTarget()){this._clear();return}this.range=t.getPercentRange(),$X(n,t,{pan:Y(pd.pan,this),zoom:Y(pd.zoom,this),scrollMove:Y(pd.scrollMove,this)})},e.prototype.dispose=function(){this._clear(),r.prototype.dispose.apply(this,arguments)},e.prototype._clear=function(){UX(this.api,this.dataZoomModel),this.range=null},e.type=\"dataZoom.inside\",e}(cm),pd={zoom:function(r,e,t,a){var n=this.range,i=n.slice(),o=r.axisModels[0];if(!!o){var s=gd[e](null,[a.originX,a.originY],o,t,r),l=(s.signal>0?s.pixelStart+s.pixelLength-s.pixel:s.pixel-s.pixelStart)/s.pixelLength*(i[1]-i[0])+i[0],u=Math.max(1/a.scale,0);i[0]=(i[0]-l)*u+l,i[1]=(i[1]-l)*u+l;var f=this.dataZoomModel.findRepresentativeAxisProxy().getMinMaxSpan();if(Li(0,i,[0,100],0,f.minSpan,f.maxSpan),this.range=i,n[0]!==i[0]||n[1]!==i[1])return i}},pan:ab(function(r,e,t,a,n,i){var o=gd[a]([i.oldX,i.oldY],[i.newX,i.newY],e,n,t);return o.signal*(r[1]-r[0])*o.pixel/o.pixelLength}),scrollMove:ab(function(r,e,t,a,n,i){var o=gd[a]([0,0],[i.scrollDelta,i.scrollDelta],e,n,t);return o.signal*(r[1]-r[0])*i.scrollDelta})};function ab(r){return function(e,t,a,n){var i=this.range,o=i.slice(),s=e.axisModels[0];if(!!s){var l=r(o,s,e,t,a,n);if(Li(l,o,[0,100],\"all\"),this.range=o,i[0]!==o[0]||i[1]!==o[1])return o}}}var gd={grid:function(r,e,t,a,n){var i=t.axis,o={},s=n.model.coordinateSystem.getRect();return r=r||[0,0],i.dim===\"x\"?(o.pixel=e[0]-r[0],o.pixelLength=s.width,o.pixelStart=s.x,o.signal=i.inverse?1:-1):(o.pixel=e[1]-r[1],o.pixelLength=s.height,o.pixelStart=s.y,o.signal=i.inverse?-1:1),o},polar:function(r,e,t,a,n){var i=t.axis,o={},s=n.model.coordinateSystem,l=s.getRadiusAxis().getExtent(),u=s.getAngleAxis().getExtent();return r=r?s.pointToCoord(r):[0,0],e=s.pointToCoord(e),t.mainType===\"radiusAxis\"?(o.pixel=e[0]-r[0],o.pixelLength=l[1]-l[0],o.pixelStart=l[0],o.signal=i.inverse?1:-1):(o.pixel=e[1]-r[1],o.pixelLength=u[1]-u[0],o.pixelStart=u[0],o.signal=i.inverse?-1:1),o},singleAxis:function(r,e,t,a,n){var i=t.axis,o=n.model.coordinateSystem.getRect(),s={};return r=r||[0,0],i.orient===\"horizontal\"?(s.pixel=e[0]-r[0],s.pixelLength=o.width,s.pixelStart=o.x,s.signal=i.inverse?1:-1):(s.pixel=e[1]-r[1],s.pixelLength=o.height,s.pixelStart=o.y,s.signal=i.inverse?-1:1),s}},QX=JX;function BL(r){dm(r),r.registerComponentModel(WX),r.registerComponentView(QX),KX(r)}var jX=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.type=\"dataZoom.slider\",e.layoutMode=\"box\",e.defaultOption=cn(dl.defaultOption,{show:!0,right:\"ph\",top:\"ph\",width:\"ph\",height:\"ph\",left:null,bottom:null,borderColor:\"#d2dbee\",borderRadius:3,backgroundColor:\"rgba(47,69,84,0)\",dataBackground:{lineStyle:{color:\"#d2dbee\",width:.5},areaStyle:{color:\"#d2dbee\",opacity:.2}},selectedDataBackground:{lineStyle:{color:\"#8fb0f7\",width:.5},areaStyle:{color:\"#8fb0f7\",opacity:.2}},fillerColor:\"rgba(135,175,274,0.2)\",handleIcon:\"path://M-9.35,34.56V42m0-40V9.5m-2,0h4a2,2,0,0,1,2,2v21a2,2,0,0,1-2,2h-4a2,2,0,0,1-2-2v-21A2,2,0,0,1-11.35,9.5Z\",handleSize:\"100%\",handleStyle:{color:\"#fff\",borderColor:\"#ACB8D1\"},moveHandleSize:7,moveHandleIcon:\"path://M-320.9-50L-320.9-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-348-41-339-50-320.9-50z M-212.3-50L-212.3-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-239.4-41-230.4-50-212.3-50z M-103.7-50L-103.7-50c18.1,0,27.1,9,27.1,27.1V85.7c0,18.1-9,27.1-27.1,27.1l0,0c-18.1,0-27.1-9-27.1-27.1V-22.9C-130.9-41-121.8-50-103.7-50z\",moveHandleStyle:{color:\"#D2DBEE\",opacity:.7},showDetail:!0,showDataShadow:\"auto\",realtime:!0,zoomLock:!1,textStyle:{color:\"#6E7079\"},brushSelect:!0,brushStyle:{color:\"rgba(135,175,274,0.15)\"},emphasis:{handleStyle:{borderColor:\"#8FB0F7\"},moveHandleStyle:{color:\"#8FB0F7\"}}}),e}(dl),tq=jX,hs=bt,nb=7,eq=1,yd=30,rq=7,vs=\"horizontal\",ib=\"vertical\",aq=5,nq=[\"line\",\"bar\",\"candlestick\",\"scatter\"],iq={easing:\"cubicOut\",duration:100,delay:0},oq=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t._displayables={},t}return e.prototype.init=function(t,a){this.api=a,this._onBrush=Y(this._onBrush,this),this._onBrushEnd=Y(this._onBrushEnd,this)},e.prototype.render=function(t,a,n,i){if(r.prototype.render.apply(this,arguments),Oo(this,\"_dispatchZoomAction\",t.get(\"throttle\"),\"fixRate\"),this._orient=t.getOrient(),t.get(\"show\")===!1){this.group.removeAll();return}if(t.noTarget()){this._clear(),this.group.removeAll();return}(!i||i.type!==\"dataZoom\"||i.from!==this.uid)&&this._buildView(),this._updateView()},e.prototype.dispose=function(){this._clear(),r.prototype.dispose.apply(this,arguments)},e.prototype._clear=function(){rl(this,\"_dispatchZoomAction\");var t=this.api.getZr();t.off(\"mousemove\",this._onBrush),t.off(\"mouseup\",this._onBrushEnd)},e.prototype._buildView=function(){var t=this.group;t.removeAll(),this._brushing=!1,this._displayables.brushRect=null,this._resetLocation(),this._resetInterval();var a=this._displayables.sliderGroup=new nt;this._renderBackground(),this._renderHandle(),this._renderDataShadow(),t.add(a),this._positionGroup()},e.prototype._resetLocation=function(){var t=this.dataZoomModel,a=this.api,n=t.get(\"brushSelect\"),i=n?rq:0,o=this._findCoordRect(),s={width:a.getWidth(),height:a.getHeight()},l=this._orient===vs?{right:s.width-o.x-o.width,top:s.height-yd-nb-i,width:o.width,height:yd}:{right:nb,top:o.y,width:yd,height:o.height},u=Po(t.option);A([\"right\",\"top\",\"width\",\"height\"],function(h){u[h]===\"ph\"&&(u[h]=l[h])});var f=re(u,s);this._location={x:f.x,y:f.y},this._size=[f.width,f.height],this._orient===ib&&this._size.reverse()},e.prototype._positionGroup=function(){var t=this.group,a=this._location,n=this._orient,i=this.dataZoomModel.getFirstTargetAxisModel(),o=i&&i.get(\"inverse\"),s=this._displayables.sliderGroup,l=(this._dataShadowInfo||{}).otherAxisInverse;s.attr(n===vs&&!o?{scaleY:l?1:-1,scaleX:1}:n===vs&&o?{scaleY:l?1:-1,scaleX:-1}:n===ib&&!o?{scaleY:l?-1:1,scaleX:1,rotation:Math.PI/2}:{scaleY:l?-1:1,scaleX:-1,rotation:Math.PI/2});var u=t.getBoundingRect([s]);t.x=a.x-u.x,t.y=a.y-u.y,t.markRedraw()},e.prototype._getViewExtent=function(){return[0,this._size[0]]},e.prototype._renderBackground=function(){var t=this.dataZoomModel,a=this._size,n=this._displayables.sliderGroup,i=t.get(\"brushSelect\");n.add(new hs({silent:!0,shape:{x:0,y:0,width:a[0],height:a[1]},style:{fill:t.get(\"backgroundColor\")},z2:-40}));var o=new hs({shape:{x:0,y:0,width:a[0],height:a[1]},style:{fill:\"transparent\"},z2:0,onclick:Y(this._onClickPanel,this)}),s=this.api.getZr();i?(o.on(\"mousedown\",this._onBrushStart,this),o.cursor=\"crosshair\",s.on(\"mousemove\",this._onBrush),s.on(\"mouseup\",this._onBrushEnd)):(s.off(\"mousemove\",this._onBrush),s.off(\"mouseup\",this._onBrushEnd)),n.add(o)},e.prototype._renderDataShadow=function(){var t=this._dataShadowInfo=this._prepareDataShadowInfo();if(this._displayables.dataShadowSegs=[],!t)return;var a=this._size,n=this._shadowSize||[],i=t.series,o=i.getRawData(),s=i.getShadowDim&&i.getShadowDim(),l=s&&o.getDimensionInfo(s)?i.getShadowDim():t.otherDim;if(l==null)return;var u=this._shadowPolygonPts,f=this._shadowPolylinePts;if(o!==this._shadowData||l!==this._shadowDim||a[0]!==n[0]||a[1]!==n[1]){var h=o.getDataExtent(l),v=(h[1]-h[0])*.3;h=[h[0]-v,h[1]+v];var c=[0,a[1]],d=[0,a[0]],p=[[a[0],0],[0,0]],g=[],y=d[1]/(o.count()-1),m=0,_=Math.round(o.count()/a[0]),S;o.each([l],function(T,D){if(_>0&&D%_){m+=y;return}var M=T==null||isNaN(T)||T===\"\",L=M?0:Rt(T,h,c,!0);M&&!S&&D?(p.push([p[p.length-1][0],0]),g.push([g[g.length-1][0],0])):!M&&S&&(p.push([m,0]),g.push([m,0])),p.push([m,L]),g.push([m,L]),m+=y,S=M}),u=this._shadowPolygonPts=p,f=this._shadowPolylinePts=g}this._shadowData=o,this._shadowDim=l,this._shadowSize=[a[0],a[1]];var w=this.dataZoomModel;function x(T){var D=w.getModel(T?\"selectedDataBackground\":\"dataBackground\"),M=new nt,L=new ze({shape:{points:u},segmentIgnoreThreshold:1,style:D.getModel(\"areaStyle\").getAreaStyle(),silent:!0,z2:-20}),I=new Fe({shape:{points:f},segmentIgnoreThreshold:1,style:D.getModel(\"lineStyle\").getLineStyle(),silent:!0,z2:-19});return M.add(L),M.add(I),M}for(var b=0;b<3;b++){var C=x(b===1);this._displayables.sliderGroup.add(C),this._displayables.dataShadowSegs.push(C)}},e.prototype._prepareDataShadowInfo=function(){var t=this.dataZoomModel,a=t.get(\"showDataShadow\");if(a!==!1){var n,i=this.ecModel;return t.eachTargetAxis(function(o,s){var l=t.getAxisProxy(o,s).getTargetSeriesModels();A(l,function(u){if(!n&&!(a!==!0&&dt(nq,u.get(\"type\"))<0)){var f=i.getComponent(qa(o),s).axis,h=sq(o),v,c=u.coordinateSystem;h!=null&&c.getOtherAxis&&(v=c.getOtherAxis(f).inverse),h=u.getData().mapDimension(h),n={thisAxis:f,series:u,thisDim:o,otherDim:h,otherAxisInverse:v}}},this)},this),n}},e.prototype._renderHandle=function(){var t=this.group,a=this._displayables,n=a.handles=[null,null],i=a.handleLabels=[null,null],o=this._displayables.sliderGroup,s=this._size,l=this.dataZoomModel,u=this.api,f=l.get(\"borderRadius\")||0,h=l.get(\"brushSelect\"),v=a.filler=new hs({silent:h,style:{fill:l.get(\"fillerColor\")},textConfig:{position:\"inside\"}});o.add(v),o.add(new hs({silent:!0,subPixelOptimize:!0,shape:{x:0,y:0,width:s[0],height:s[1],r:f},style:{stroke:l.get(\"dataBackgroundColor\")||l.get(\"borderColor\"),lineWidth:eq,fill:\"rgba(0,0,0,0)\"}})),A([0,1],function(_){var S=l.get(\"handleIcon\");!Of[S]&&S.indexOf(\"path://\")<0&&S.indexOf(\"image://\")<0&&(S=\"path://\"+S);var w=jt(S,-1,0,2,2,null,!0);w.attr({cursor:ob(this._orient),draggable:!0,drift:Y(this._onDragMove,this,_),ondragend:Y(this._onDragEnd,this),onmouseover:Y(this._showDataInfo,this,!0),onmouseout:Y(this._showDataInfo,this,!1),z2:5});var x=w.getBoundingRect(),b=l.get(\"handleSize\");this._handleHeight=W(b,this._size[1]),this._handleWidth=x.width/x.height*this._handleHeight,w.setStyle(l.getModel(\"handleStyle\").getItemStyle()),w.style.strokeNoScale=!0,w.rectHover=!0,w.ensureState(\"emphasis\").style=l.getModel([\"emphasis\",\"handleStyle\"]).getItemStyle(),si(w);var C=l.get(\"handleColor\");C!=null&&(w.style.fill=C),o.add(n[_]=w);var T=l.getModel(\"textStyle\");t.add(i[_]=new Dt({silent:!0,invisible:!0,style:Nt(T,{x:0,y:0,text:\"\",verticalAlign:\"middle\",align:\"center\",fill:T.getTextColor(),font:T.getFont()}),z2:10}))},this);var c=v;if(h){var d=W(l.get(\"moveHandleSize\"),s[1]),p=a.moveHandle=new bt({style:l.getModel(\"moveHandleStyle\").getItemStyle(),silent:!0,shape:{r:[0,0,2,2],y:s[1]-.5,height:d}}),g=d*.8,y=a.moveHandleIcon=jt(l.get(\"moveHandleIcon\"),-g/2,-g/2,g,g,\"#fff\",!0);y.silent=!0,y.y=s[1]+d/2-.5,p.ensureState(\"emphasis\").style=l.getModel([\"emphasis\",\"moveHandleStyle\"]).getItemStyle();var m=Math.min(s[1]/2,Math.max(d,10));c=a.moveZone=new bt({invisible:!0,shape:{y:s[1]-m,height:d+m}}),c.on(\"mouseover\",function(){u.enterEmphasis(p)}).on(\"mouseout\",function(){u.leaveEmphasis(p)}),o.add(p),o.add(y),o.add(c)}c.attr({draggable:!0,cursor:ob(this._orient),drift:Y(this._onDragMove,this,\"all\"),ondragstart:Y(this._showDataInfo,this,!0),ondragend:Y(this._onDragEnd,this),onmouseover:Y(this._showDataInfo,this,!0),onmouseout:Y(this._showDataInfo,this,!1)})},e.prototype._resetInterval=function(){var t=this._range=this.dataZoomModel.getPercentRange(),a=this._getViewExtent();this._handleEnds=[Rt(t[0],[0,100],a,!0),Rt(t[1],[0,100],a,!0)]},e.prototype._updateInterval=function(t,a){var n=this.dataZoomModel,i=this._handleEnds,o=this._getViewExtent(),s=n.findRepresentativeAxisProxy().getMinMaxSpan(),l=[0,100];Li(a,i,o,n.get(\"zoomLock\")?\"all\":t,s.minSpan!=null?Rt(s.minSpan,l,o,!0):null,s.maxSpan!=null?Rt(s.maxSpan,l,o,!0):null);var u=this._range,f=this._range=or([Rt(i[0],o,l,!0),Rt(i[1],o,l,!0)]);return!u||u[0]!==f[0]||u[1]!==f[1]},e.prototype._updateView=function(t){var a=this._displayables,n=this._handleEnds,i=or(n.slice()),o=this._size;A([0,1],function(c){var d=a.handles[c],p=this._handleHeight;d.attr({scaleX:p/2,scaleY:p/2,x:n[c]+(c?-1:1),y:o[1]/2-p/2})},this),a.filler.setShape({x:i[0],y:0,width:i[1]-i[0],height:o[1]});var s={x:i[0],width:i[1]-i[0]};a.moveHandle&&(a.moveHandle.setShape(s),a.moveZone.setShape(s),a.moveZone.getBoundingRect(),a.moveHandleIcon&&a.moveHandleIcon.attr(\"x\",s.x+s.width/2));for(var l=a.dataShadowSegs,u=[0,i[0],i[1],o[0]],f=0;f<l.length;f++){var h=l[f],v=h.getClipPath();v||(v=new bt,h.setClipPath(v)),v.setShape({x:u[f],y:0,width:u[f+1]-u[f],height:o[1]})}this._updateDataInfo(t)},e.prototype._updateDataInfo=function(t){var a=this.dataZoomModel,n=this._displayables,i=n.handleLabels,o=this._orient,s=[\"\",\"\"];if(a.get(\"showDetail\")){var l=a.findRepresentativeAxisProxy();if(l){var u=l.getAxisModel().axis,f=this._range,h=t?l.calculateDataWindow({start:f[0],end:f[1]}).valueWindow:l.getDataValueWindow();s=[this._formatLabel(h[0],u),this._formatLabel(h[1],u)]}}var v=or(this._handleEnds.slice());c.call(this,0),c.call(this,1);function c(d){var p=li(n.handles[d].parent,this.group),g=Dh(d===0?\"right\":\"left\",p),y=this._handleWidth/2+aq,m=Cr([v[d]+(d===0?-y:y),this._size[1]/2],p);i[d].setStyle({x:m[0],y:m[1],verticalAlign:o===vs?\"middle\":g,align:o===vs?g:\"center\",text:s[d]})}},e.prototype._formatLabel=function(t,a){var n=this.dataZoomModel,i=n.get(\"labelFormatter\"),o=n.get(\"labelPrecision\");(o==null||o===\"auto\")&&(o=a.getPixelPrecision());var s=t==null||isNaN(t)?\"\":a.type===\"category\"||a.type===\"time\"?a.scale.getLabel({value:Math.round(t)}):t.toFixed(Math.min(o,20));return J(i)?i(t,s):U(i)?i.replace(\"{value}\",s):s},e.prototype._showDataInfo=function(t){t=this._dragging||t;var a=this._displayables,n=a.handleLabels;n[0].attr(\"invisible\",!t),n[1].attr(\"invisible\",!t),a.moveHandle&&this.api[t?\"enterEmphasis\":\"leaveEmphasis\"](a.moveHandle,1)},e.prototype._onDragMove=function(t,a,n,i){this._dragging=!0,ya(i.event);var o=this._displayables.sliderGroup.getLocalTransform(),s=Cr([a,n],o,!0),l=this._updateInterval(t,s[0]),u=this.dataZoomModel.get(\"realtime\");this._updateView(!u),l&&u&&this._dispatchZoomAction(!0)},e.prototype._onDragEnd=function(){this._dragging=!1,this._showDataInfo(!1);var t=this.dataZoomModel.get(\"realtime\");!t&&this._dispatchZoomAction(!1)},e.prototype._onClickPanel=function(t){var a=this._size,n=this._displayables.sliderGroup.transformCoordToLocal(t.offsetX,t.offsetY);if(!(n[0]<0||n[0]>a[0]||n[1]<0||n[1]>a[1])){var i=this._handleEnds,o=(i[0]+i[1])/2,s=this._updateInterval(\"all\",n[0]-o);this._updateView(),s&&this._dispatchZoomAction(!1)}},e.prototype._onBrushStart=function(t){var a=t.offsetX,n=t.offsetY;this._brushStart=new ut(a,n),this._brushing=!0,this._brushStartTime=+new Date},e.prototype._onBrushEnd=function(t){if(!!this._brushing){var a=this._displayables.brushRect;if(this._brushing=!1,!!a){a.attr(\"ignore\",!0);var n=a.shape,i=+new Date;if(!(i-this._brushStartTime<200&&Math.abs(n.width)<5)){var o=this._getViewExtent(),s=[0,100];this._range=or([Rt(n.x,o,s,!0),Rt(n.x+n.width,o,s,!0)]),this._handleEnds=[n.x,n.x+n.width],this._updateView(),this._dispatchZoomAction(!1)}}}},e.prototype._onBrush=function(t){this._brushing&&(ya(t.event),this._updateBrushRect(t.offsetX,t.offsetY))},e.prototype._updateBrushRect=function(t,a){var n=this._displayables,i=this.dataZoomModel,o=n.brushRect;o||(o=n.brushRect=new hs({silent:!0,style:i.getModel(\"brushStyle\").getItemStyle()}),n.sliderGroup.add(o)),o.attr(\"ignore\",!1);var s=this._brushStart,l=this._displayables.sliderGroup,u=l.transformCoordToLocal(t,a),f=l.transformCoordToLocal(s.x,s.y),h=this._size;u[0]=Math.max(Math.min(h[0],u[0]),0),o.setShape({x:f[0],y:0,width:u[0]-f[0],height:h[1]})},e.prototype._dispatchZoomAction=function(t){var a=this._range;this.api.dispatchAction({type:\"dataZoom\",from:this.uid,dataZoomId:this.dataZoomModel.id,animation:t?iq:null,start:a[0],end:a[1]})},e.prototype._findCoordRect=function(){var t,a=cL(this.dataZoomModel).infoList;if(!t&&a.length){var n=a[0].model.coordinateSystem;t=n.getRect&&n.getRect()}if(!t){var i=this.api.getWidth(),o=this.api.getHeight();t={x:i*.2,y:o*.2,width:i*.6,height:o*.6}}return t},e.type=\"dataZoom.slider\",e}(cm);function sq(r){var e={x:\"y\",y:\"x\",radius:\"angle\",angle:\"radius\"};return e[r]}function ob(r){return r===\"vertical\"?\"ns-resize\":\"ew-resize\"}var lq=oq;function NL(r){r.registerComponentModel(tq),r.registerComponentView(lq),dm(r)}function uq(r){ct(BL),ct(NL)}var fq={get:function(r,e,t){var a=at((hq[r]||{})[e]);return t&&F(a)?a[a.length-1]:a}},hq={color:{active:[\"#006edd\",\"#e0ffff\"],inactive:[\"rgba(0,0,0,0)\"]},colorHue:{active:[0,360],inactive:[0,0]},colorSaturation:{active:[.3,1],inactive:[0,0]},colorLightness:{active:[.9,.5],inactive:[0,0]},colorAlpha:{active:[.3,1],inactive:[0,0]},opacity:{active:[.3,1],inactive:[0,0]},symbol:{active:[\"circle\",\"roundRect\",\"diamond\"],inactive:[\"none\"]},symbolSize:{active:[10,50],inactive:[0,0]}},VL=fq,sb=ve.mapVisual,vq=ve.eachVisual,cq=F,lb=A,dq=or,pq=Rt,gq=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.stateList=[\"inRange\",\"outOfRange\"],t.replacableOptionKeys=[\"inRange\",\"outOfRange\",\"target\",\"controller\",\"color\"],t.layoutMode={type:\"box\",ignoreSize:!0},t.dataBound=[-1/0,1/0],t.targetVisuals={},t.controllerVisuals={},t}return e.prototype.init=function(t,a,n){this.mergeDefaultAndTheme(t,n)},e.prototype.optionUpdated=function(t,a){var n=this.option;!a&&CL(n,t,this.replacableOptionKeys),this.textStyleModel=this.getModel(\"textStyle\"),this.resetItemSize(),this.completeVisualOption()},e.prototype.resetVisual=function(t){var a=this.stateList;t=Y(t,this),this.controllerVisuals=eg(this.option.controller,a,t),this.targetVisuals=eg(this.option.target,a,t)},e.prototype.getItemSymbol=function(){return null},e.prototype.getTargetSeriesIndices=function(){var t=this.option.seriesIndex,a=[];return t==null||t===\"all\"?this.ecModel.eachSeries(function(n,i){a.push(i)}):a=kt(t),a},e.prototype.eachTargetSeries=function(t,a){A(this.getTargetSeriesIndices(),function(n){var i=this.ecModel.getSeriesByIndex(n);i&&t.call(a,i)},this)},e.prototype.isTargetSeries=function(t){var a=!1;return this.eachTargetSeries(function(n){n===t&&(a=!0)}),a},e.prototype.formatValueText=function(t,a,n){var i=this.option,o=i.precision,s=this.dataBound,l=i.formatter,u;n=n||[\"<\",\">\"],F(t)&&(t=t.slice(),u=!0);var f=a?t:u?[h(t[0]),h(t[1])]:h(t);if(U(l))return l.replace(\"{value}\",u?f[0]:f).replace(\"{value2}\",u?f[1]:f);if(J(l))return u?l(t[0],t[1]):l(t);if(u)return t[0]===s[0]?n[0]+\" \"+f[1]:t[1]===s[1]?n[1]+\" \"+f[0]:f[0]+\" - \"+f[1];return f;function h(v){return v===s[0]?\"min\":v===s[1]?\"max\":(+v).toFixed(Math.min(o,20))}},e.prototype.resetExtent=function(){var t=this.option,a=dq([t.min,t.max]);this._dataExtent=a},e.prototype.getDataDimensionIndex=function(t){var a=this.option.dimension;if(a!=null)return t.getDimensionIndex(a);for(var n=t.dimensions,i=n.length-1;i>=0;i--){var o=n[i],s=t.getDimensionInfo(o);if(!s.isCalculationCoord)return s.storeDimIndex}},e.prototype.getExtent=function(){return this._dataExtent.slice()},e.prototype.completeVisualOption=function(){var t=this.ecModel,a=this.option,n={inRange:a.inRange,outOfRange:a.outOfRange},i=a.target||(a.target={}),o=a.controller||(a.controller={});ht(i,n),ht(o,n);var s=this.isCategory();l.call(this,i),l.call(this,o),u.call(this,i,\"inRange\",\"outOfRange\"),f.call(this,o);function l(h){cq(a.color)&&!h.inRange&&(h.inRange={color:a.color.slice().reverse()}),h.inRange=h.inRange||{color:t.get(\"gradientColor\")}}function u(h,v,c){var d=h[v],p=h[c];d&&!p&&(p=h[c]={},lb(d,function(g,y){if(!!ve.isValidType(y)){var m=VL.get(y,\"inactive\",s);m!=null&&(p[y]=m,y===\"color\"&&!p.hasOwnProperty(\"opacity\")&&!p.hasOwnProperty(\"colorAlpha\")&&(p.opacity=[0,0]))}}))}function f(h){var v=(h.inRange||{}).symbol||(h.outOfRange||{}).symbol,c=(h.inRange||{}).symbolSize||(h.outOfRange||{}).symbolSize,d=this.get(\"inactiveColor\"),p=this.getItemSymbol(),g=p||\"roundRect\";lb(this.stateList,function(y){var m=this.itemSize,_=h[y];_||(_=h[y]={color:s?d:[d]}),_.symbol==null&&(_.symbol=v&&at(v)||(s?g:[g])),_.symbolSize==null&&(_.symbolSize=c&&at(c)||(s?m[0]:[m[0],m[0]])),_.symbol=sb(_.symbol,function(x){return x===\"none\"?g:x});var S=_.symbolSize;if(S!=null){var w=-1/0;vq(S,function(x){x>w&&(w=x)}),_.symbolSize=sb(S,function(x){return pq(x,[0,w],[0,m[0]],!0)})}},this)}},e.prototype.resetItemSize=function(){this.itemSize=[parseFloat(this.get(\"itemWidth\")),parseFloat(this.get(\"itemHeight\"))]},e.prototype.isCategory=function(){return!!this.option.categories},e.prototype.setSelected=function(t){},e.prototype.getSelected=function(){return null},e.prototype.getValueState=function(t){return null},e.prototype.getVisualMeta=function(t){return null},e.type=\"visualMap\",e.dependencies=[\"series\"],e.defaultOption={show:!0,z:4,seriesIndex:\"all\",min:0,max:200,left:0,right:null,top:null,bottom:0,itemWidth:null,itemHeight:null,inverse:!1,orient:\"vertical\",backgroundColor:\"rgba(0,0,0,0)\",borderColor:\"#ccc\",contentColor:\"#5793f3\",inactiveColor:\"#aaa\",borderWidth:0,padding:5,textGap:10,precision:0,textStyle:{color:\"#333\"}},e}(Tt),oh=gq,ub=[20,140],yq=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.optionUpdated=function(t,a){r.prototype.optionUpdated.apply(this,arguments),this.resetExtent(),this.resetVisual(function(n){n.mappingMethod=\"linear\",n.dataExtent=this.getExtent()}),this._resetRange()},e.prototype.resetItemSize=function(){r.prototype.resetItemSize.apply(this,arguments);var t=this.itemSize;(t[0]==null||isNaN(t[0]))&&(t[0]=ub[0]),(t[1]==null||isNaN(t[1]))&&(t[1]=ub[1])},e.prototype._resetRange=function(){var t=this.getExtent(),a=this.option.range;!a||a.auto?(t.auto=1,this.option.range=t):F(a)&&(a[0]>a[1]&&a.reverse(),a[0]=Math.max(a[0],t[0]),a[1]=Math.min(a[1],t[1]))},e.prototype.completeVisualOption=function(){r.prototype.completeVisualOption.apply(this,arguments),A(this.stateList,function(t){var a=this.option.controller[t].symbolSize;a&&a[0]!==a[1]&&(a[0]=a[1]/3)},this)},e.prototype.setSelected=function(t){this.option.range=t.slice(),this._resetRange()},e.prototype.getSelected=function(){var t=this.getExtent(),a=or((this.get(\"range\")||[]).slice());return a[0]>t[1]&&(a[0]=t[1]),a[1]>t[1]&&(a[1]=t[1]),a[0]<t[0]&&(a[0]=t[0]),a[1]<t[0]&&(a[1]=t[0]),a},e.prototype.getValueState=function(t){var a=this.option.range,n=this.getExtent();return(a[0]<=n[0]||a[0]<=t)&&(a[1]>=n[1]||t<=a[1])?\"inRange\":\"outOfRange\"},e.prototype.findTargetDataIndices=function(t){var a=[];return this.eachTargetSeries(function(n){var i=[],o=n.getData();o.each(this.getDataDimensionIndex(o),function(s,l){t[0]<=s&&s<=t[1]&&i.push(l)},this),a.push({seriesId:n.id,dataIndex:i})},this),a},e.prototype.getVisualMeta=function(t){var a=fb(this,\"outOfRange\",this.getExtent()),n=fb(this,\"inRange\",this.option.range.slice()),i=[];function o(c,d){i.push({value:c,color:t(c,d)})}for(var s=0,l=0,u=n.length,f=a.length;l<f&&(!n.length||a[l]<=n[0]);l++)a[l]<n[s]&&o(a[l],\"outOfRange\");for(var h=1;s<u;s++,h=0)h&&i.length&&o(n[s],\"outOfRange\"),o(n[s],\"inRange\");for(var h=1;l<f;l++)(!n.length||n[n.length-1]<a[l])&&(h&&(i.length&&o(i[i.length-1].value,\"outOfRange\"),h=0),o(a[l],\"outOfRange\"));var v=i.length;return{stops:i,outerColors:[v?i[0].color:\"transparent\",v?i[v-1].color:\"transparent\"]}},e.type=\"visualMap.continuous\",e.defaultOption=cn(oh.defaultOption,{align:\"auto\",calculable:!1,hoverLink:!0,realtime:!0,handleIcon:\"path://M-11.39,9.77h0a3.5,3.5,0,0,1-3.5,3.5h-22a3.5,3.5,0,0,1-3.5-3.5h0a3.5,3.5,0,0,1,3.5-3.5h22A3.5,3.5,0,0,1-11.39,9.77Z\",handleSize:\"120%\",handleStyle:{borderColor:\"#fff\",borderWidth:1},indicatorIcon:\"circle\",indicatorSize:\"50%\",indicatorStyle:{borderColor:\"#fff\",borderWidth:2,shadowBlur:2,shadowOffsetX:1,shadowOffsetY:1,shadowColor:\"rgba(0,0,0,0.2)\"}}),e}(oh);function fb(r,e,t){if(t[0]===t[1])return t.slice();for(var a=200,n=(t[1]-t[0])/a,i=t[0],o=[],s=0;s<=a&&i<t[1];s++)o.push(i),i+=n;return o.push(t[1]),o}var mq=yq,_q=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t.autoPositionValues={left:1,right:1,top:1,bottom:1},t}return e.prototype.init=function(t,a){this.ecModel=t,this.api=a},e.prototype.render=function(t,a,n,i){if(this.visualMapModel=t,t.get(\"show\")===!1){this.group.removeAll();return}this.doRender(t,a,n,i)},e.prototype.renderBackground=function(t){var a=this.visualMapModel,n=Io(a.get(\"padding\")||0),i=t.getBoundingRect();t.add(new bt({z2:-1,silent:!0,shape:{x:i.x-n[3],y:i.y-n[0],width:i.width+n[3]+n[1],height:i.height+n[0]+n[2]},style:{fill:a.get(\"backgroundColor\"),stroke:a.get(\"borderColor\"),lineWidth:a.get(\"borderWidth\")}}))},e.prototype.getControllerVisual=function(t,a,n){n=n||{};var i=n.forceState,o=this.visualMapModel,s={};if(a===\"color\"){var l=o.get(\"contentColor\");s.color=l}function u(c){return s[c]}function f(c,d){s[c]=d}var h=o.controllerVisuals[i||o.getValueState(t)],v=ve.prepareVisualTypes(h);return A(v,function(c){var d=h[c];n.convertOpacityToAlpha&&c===\"opacity\"&&(c=\"colorAlpha\",d=h.__alphaForOpacity),ve.dependsOn(c,a)&&d&&d.applyVisual(t,u,f)}),s[a]},e.prototype.positionGroup=function(t){var a=this.visualMapModel,n=this.api;kh(t,a.getBoxLayoutParams(),{width:n.getWidth(),height:n.getHeight()})},e.prototype.doRender=function(t,a,n,i){},e.type=\"visualMap\",e}(Ut),zL=_q,hb=[[\"left\",\"right\",\"width\"],[\"top\",\"bottom\",\"height\"]];function FL(r,e,t){var a=r.option,n=a.align;if(n!=null&&n!==\"auto\")return n;for(var i={width:e.getWidth(),height:e.getHeight()},o=a.orient===\"horizontal\"?1:0,s=hb[o],l=[0,null,10],u={},f=0;f<3;f++)u[hb[1-o][f]]=l[f],u[s[f]]=f===2?t[0]:a[s[f]];var h=[[\"x\",\"width\",3],[\"y\",\"height\",0]][o],v=re(u,i,a.padding);return s[(v.margin[h[2]]||0)+v[h[0]]+v[h[1]]*.5<i[h[1]]*.5?0:1]}function cf(r,e){return A(r||[],function(t){t.dataIndex!=null&&(t.dataIndexInside=t.dataIndex,t.dataIndex=null),t.highlightKey=\"visualMap\"+(e?e.componentIndex:\"\")}),r}var Or=Rt,Sq=A,vb=Math.min,md=Math.max,xq=12,wq=6,bq=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t._shapes={},t._dataInterval=[],t._handleEnds=[],t._hoverLinkDataIndices=[],t}return e.prototype.doRender=function(t,a,n,i){this._api=n,(!i||i.type!==\"selectDataRange\"||i.from!==this.uid)&&this._buildView()},e.prototype._buildView=function(){this.group.removeAll();var t=this.visualMapModel,a=this.group;this._orient=t.get(\"orient\"),this._useHandle=t.get(\"calculable\"),this._resetInterval(),this._renderBar(a);var n=t.get(\"text\");this._renderEndsText(a,n,0),this._renderEndsText(a,n,1),this._updateView(!0),this.renderBackground(a),this._updateView(),this._enableHoverLinkToSeries(),this._enableHoverLinkFromSeries(),this.positionGroup(a)},e.prototype._renderEndsText=function(t,a,n){if(!!a){var i=a[1-n];i=i!=null?i+\"\":\"\";var o=this.visualMapModel,s=o.get(\"textGap\"),l=o.itemSize,u=this._shapes.mainGroup,f=this._applyTransform([l[0]/2,n===0?-s:l[1]+s],u),h=this._applyTransform(n===0?\"bottom\":\"top\",u),v=this._orient,c=this.visualMapModel.textStyleModel;this.group.add(new Dt({style:Nt(c,{x:f[0],y:f[1],verticalAlign:v===\"horizontal\"?\"middle\":h,align:v===\"horizontal\"?h:\"center\",text:i})}))}},e.prototype._renderBar=function(t){var a=this.visualMapModel,n=this._shapes,i=a.itemSize,o=this._orient,s=this._useHandle,l=FL(a,this.api,i),u=n.mainGroup=this._createBarGroup(l),f=new nt;u.add(f),f.add(n.outOfRange=cb()),f.add(n.inRange=cb(null,s?pb(this._orient):null,Y(this._dragHandle,this,\"all\",!1),Y(this._dragHandle,this,\"all\",!0))),f.setClipPath(new bt({shape:{x:0,y:0,width:i[0],height:i[1],r:3}}));var h=a.textStyleModel.getTextRect(\"\\u56FD\"),v=md(h.width,h.height);s&&(n.handleThumbs=[],n.handleLabels=[],n.handleLabelPoints=[],this._createHandle(a,u,0,i,v,o),this._createHandle(a,u,1,i,v,o)),this._createIndicator(a,u,i,v,o),t.add(u)},e.prototype._createHandle=function(t,a,n,i,o,s){var l=Y(this._dragHandle,this,n,!1),u=Y(this._dragHandle,this,n,!0),f=Tr(t.get(\"handleSize\"),i[0]),h=jt(t.get(\"handleIcon\"),-f/2,-f/2,f,f,null,!0),v=pb(this._orient);h.attr({cursor:v,draggable:!0,drift:l,ondragend:u,onmousemove:function(y){ya(y.event)}}),h.x=i[0]/2,h.useStyle(t.getModel(\"handleStyle\").getItemStyle()),h.setStyle({strokeNoScale:!0,strokeFirst:!0}),h.style.lineWidth*=2,h.ensureState(\"emphasis\").style=t.getModel([\"emphasis\",\"handleStyle\"]).getItemStyle(),Jn(h,!0),a.add(h);var c=this.visualMapModel.textStyleModel,d=new Dt({cursor:v,draggable:!0,drift:l,onmousemove:function(y){ya(y.event)},ondragend:u,style:Nt(c,{x:0,y:0,text:\"\"})});d.ensureState(\"blur\").style={opacity:.1},d.stateTransition={duration:200},this.group.add(d);var p=[f,0],g=this._shapes;g.handleThumbs[n]=h,g.handleLabelPoints[n]=p,g.handleLabels[n]=d},e.prototype._createIndicator=function(t,a,n,i,o){var s=Tr(t.get(\"indicatorSize\"),n[0]),l=jt(t.get(\"indicatorIcon\"),-s/2,-s/2,s,s,null,!0);l.attr({cursor:\"move\",invisible:!0,silent:!0,x:n[0]/2});var u=t.getModel(\"indicatorStyle\").getItemStyle();if(l instanceof pe){var f=l.style;l.useStyle(V({image:f.image,x:f.x,y:f.y,width:f.width,height:f.height},u))}else l.useStyle(u);a.add(l);var h=this.visualMapModel.textStyleModel,v=new Dt({silent:!0,invisible:!0,style:Nt(h,{x:0,y:0,text:\"\"})});this.group.add(v);var c=[(o===\"horizontal\"?i/2:wq)+n[0]/2,0],d=this._shapes;d.indicator=l,d.indicatorLabel=v,d.indicatorLabelPoint=c,this._firstShowIndicator=!0},e.prototype._dragHandle=function(t,a,n,i){if(!!this._useHandle){if(this._dragging=!a,!a){var o=this._applyTransform([n,i],this._shapes.mainGroup,!0);this._updateInterval(t,o[1]),this._hideIndicator(),this._updateView()}a===!this.visualMapModel.get(\"realtime\")&&this.api.dispatchAction({type:\"selectDataRange\",from:this.uid,visualMapId:this.visualMapModel.id,selected:this._dataInterval.slice()}),a?!this._hovering&&this._clearHoverLinkToSeries():db(this.visualMapModel)&&this._doHoverLinkToSeries(this._handleEnds[t],!1)}},e.prototype._resetInterval=function(){var t=this.visualMapModel,a=this._dataInterval=t.getSelected(),n=t.getExtent(),i=[0,t.itemSize[1]];this._handleEnds=[Or(a[0],n,i,!0),Or(a[1],n,i,!0)]},e.prototype._updateInterval=function(t,a){a=a||0;var n=this.visualMapModel,i=this._handleEnds,o=[0,n.itemSize[1]];Li(a,i,o,t,0);var s=n.getExtent();this._dataInterval=[Or(i[0],o,s,!0),Or(i[1],o,s,!0)]},e.prototype._updateView=function(t){var a=this.visualMapModel,n=a.getExtent(),i=this._shapes,o=[0,a.itemSize[1]],s=t?o:this._handleEnds,l=this._createBarVisual(this._dataInterval,n,s,\"inRange\"),u=this._createBarVisual(n,n,o,\"outOfRange\");i.inRange.setStyle({fill:l.barColor}).setShape(\"points\",l.barPoints),i.outOfRange.setStyle({fill:u.barColor}).setShape(\"points\",u.barPoints),this._updateHandle(s,l)},e.prototype._createBarVisual=function(t,a,n,i){var o={forceState:i,convertOpacityToAlpha:!0},s=this._makeColorGradient(t,o),l=[this.getControllerVisual(t[0],\"symbolSize\",o),this.getControllerVisual(t[1],\"symbolSize\",o)],u=this._createBarPoints(n,l);return{barColor:new Cl(0,0,0,1,s),barPoints:u,handlesColor:[s[0].color,s[s.length-1].color]}},e.prototype._makeColorGradient=function(t,a){var n=100,i=[],o=(t[1]-t[0])/n;i.push({color:this.getControllerVisual(t[0],\"color\",a),offset:0});for(var s=1;s<n;s++){var l=t[0]+o*s;if(l>t[1])break;i.push({color:this.getControllerVisual(l,\"color\",a),offset:s/n})}return i.push({color:this.getControllerVisual(t[1],\"color\",a),offset:1}),i},e.prototype._createBarPoints=function(t,a){var n=this.visualMapModel.itemSize;return[[n[0]-a[0],t[0]],[n[0],t[0]],[n[0],t[1]],[n[0]-a[1],t[1]]]},e.prototype._createBarGroup=function(t){var a=this._orient,n=this.visualMapModel.get(\"inverse\");return new nt(a===\"horizontal\"&&!n?{scaleX:t===\"bottom\"?1:-1,rotation:Math.PI/2}:a===\"horizontal\"&&n?{scaleX:t===\"bottom\"?-1:1,rotation:-Math.PI/2}:a===\"vertical\"&&!n?{scaleX:t===\"left\"?1:-1,scaleY:-1}:{scaleX:t===\"left\"?1:-1})},e.prototype._updateHandle=function(t,a){if(!!this._useHandle){var n=this._shapes,i=this.visualMapModel,o=n.handleThumbs,s=n.handleLabels,l=i.itemSize,u=i.getExtent();Sq([0,1],function(f){var h=o[f];h.setStyle(\"fill\",a.handlesColor[f]),h.y=t[f];var v=Or(t[f],[0,l[1]],u,!0),c=this.getControllerVisual(v,\"symbolSize\");h.scaleX=h.scaleY=c/l[0],h.x=l[0]-c/2;var d=Cr(n.handleLabelPoints[f],li(h,this.group));s[f].setStyle({x:d[0],y:d[1],text:i.formatValueText(this._dataInterval[f]),verticalAlign:\"middle\",align:this._orient===\"vertical\"?this._applyTransform(\"left\",n.mainGroup):\"center\"})},this)}},e.prototype._showIndicator=function(t,a,n,i){var o=this.visualMapModel,s=o.getExtent(),l=o.itemSize,u=[0,l[1]],f=this._shapes,h=f.indicator;if(!!h){h.attr(\"invisible\",!1);var v={convertOpacityToAlpha:!0},c=this.getControllerVisual(t,\"color\",v),d=this.getControllerVisual(t,\"symbolSize\"),p=Or(t,s,u,!0),g=l[0]-d/2,y={x:h.x,y:h.y};h.y=p,h.x=g;var m=Cr(f.indicatorLabelPoint,li(h,this.group)),_=f.indicatorLabel;_.attr(\"invisible\",!1);var S=this._applyTransform(\"left\",f.mainGroup),w=this._orient,x=w===\"horizontal\";_.setStyle({text:(n||\"\")+o.formatValueText(a),verticalAlign:x?S:\"middle\",align:x?\"center\":S});var b={x:g,y:p,style:{fill:c}},C={style:{x:m[0],y:m[1]}};if(o.ecModel.isAnimationEnabled()&&!this._firstShowIndicator){var T={duration:100,easing:\"cubicInOut\",additive:!0};h.x=y.x,h.y=y.y,h.animateTo(b,T),_.animateTo(C,T)}else h.attr(b),_.attr(C);this._firstShowIndicator=!1;var D=this._shapes.handleLabels;if(D)for(var M=0;M<D.length;M++)this._api.enterBlur(D[M])}},e.prototype._enableHoverLinkToSeries=function(){var t=this;this._shapes.mainGroup.on(\"mousemove\",function(a){if(t._hovering=!0,!t._dragging){var n=t.visualMapModel.itemSize,i=t._applyTransform([a.offsetX,a.offsetY],t._shapes.mainGroup,!0,!0);i[1]=vb(md(0,i[1]),n[1]),t._doHoverLinkToSeries(i[1],0<=i[0]&&i[0]<=n[0])}}).on(\"mouseout\",function(){t._hovering=!1,!t._dragging&&t._clearHoverLinkToSeries()})},e.prototype._enableHoverLinkFromSeries=function(){var t=this.api.getZr();this.visualMapModel.option.hoverLink?(t.on(\"mouseover\",this._hoverLinkFromSeriesMouseOver,this),t.on(\"mouseout\",this._hideIndicator,this)):this._clearHoverLinkFromSeries()},e.prototype._doHoverLinkToSeries=function(t,a){var n=this.visualMapModel,i=n.itemSize;if(!!n.option.hoverLink){var o=[0,i[1]],s=n.getExtent();t=vb(md(o[0],t),o[1]);var l=Cq(n,s,o),u=[t-l,t+l],f=Or(t,o,s,!0),h=[Or(u[0],o,s,!0),Or(u[1],o,s,!0)];u[0]<o[0]&&(h[0]=-1/0),u[1]>o[1]&&(h[1]=1/0),a&&(h[0]===-1/0?this._showIndicator(f,h[1],\"< \",l):h[1]===1/0?this._showIndicator(f,h[0],\"> \",l):this._showIndicator(f,f,\"\\u2248 \",l));var v=this._hoverLinkDataIndices,c=[];(a||db(n))&&(c=this._hoverLinkDataIndices=n.findTargetDataIndices(h));var d=xk(v,c);this._dispatchHighDown(\"downplay\",cf(d[0],n)),this._dispatchHighDown(\"highlight\",cf(d[1],n))}},e.prototype._hoverLinkFromSeriesMouseOver=function(t){var a;if(jn(t.target,function(l){var u=it(l);if(u.dataIndex!=null)return a=u,!0},!0),!!a){var n=this.ecModel.getSeriesByIndex(a.seriesIndex),i=this.visualMapModel;if(!!i.isTargetSeries(n)){var o=n.getData(a.dataType),s=o.getStore().get(i.getDataDimensionIndex(o),a.dataIndex);isNaN(s)||this._showIndicator(s,s)}}},e.prototype._hideIndicator=function(){var t=this._shapes;t.indicator&&t.indicator.attr(\"invisible\",!0),t.indicatorLabel&&t.indicatorLabel.attr(\"invisible\",!0);var a=this._shapes.handleLabels;if(a)for(var n=0;n<a.length;n++)this._api.leaveBlur(a[n])},e.prototype._clearHoverLinkToSeries=function(){this._hideIndicator();var t=this._hoverLinkDataIndices;this._dispatchHighDown(\"downplay\",cf(t,this.visualMapModel)),t.length=0},e.prototype._clearHoverLinkFromSeries=function(){this._hideIndicator();var t=this.api.getZr();t.off(\"mouseover\",this._hoverLinkFromSeriesMouseOver),t.off(\"mouseout\",this._hideIndicator)},e.prototype._applyTransform=function(t,a,n,i){var o=li(a,i?null:this.group);return F(t)?Cr(t,o,n):Dh(t,o,n)},e.prototype._dispatchHighDown=function(t,a){a&&a.length&&this.api.dispatchAction({type:t,batch:a})},e.prototype.dispose=function(){this._clearHoverLinkFromSeries(),this._clearHoverLinkToSeries()},e.prototype.remove=function(){this._clearHoverLinkFromSeries(),this._clearHoverLinkToSeries()},e.type=\"visualMap.continuous\",e}(zL);function cb(r,e,t,a){return new ze({shape:{points:r},draggable:!!t,cursor:e,drift:t,onmousemove:function(n){ya(n.event)},ondragend:a})}function Cq(r,e,t){var a=xq/2,n=r.get(\"hoverLinkDataSize\");return n&&(a=Or(n,e,t,!0)/2),a}function db(r){var e=r.get(\"hoverLinkOnHandle\");return!!(e==null?r.get(\"realtime\"):e)}function pb(r){return r===\"vertical\"?\"ns-resize\":\"ew-resize\"}var Tq=bq,Aq={type:\"selectDataRange\",event:\"dataRangeSelected\",update:\"update\"},Dq=function(r,e){e.eachComponent({mainType:\"visualMap\",query:r},function(t){t.setSelected(r.selected)})},Mq=[{createOnAllSeries:!0,reset:function(r,e){var t=[];return e.eachComponent(\"visualMap\",function(a){var n=r.pipelineContext;!a.isTargetSeries(r)||n&&n.large||t.push(CZ(a.stateList,a.targetVisuals,Y(a.getValueState,a),a.getDataDimensionIndex(r.getData())))}),t}},{createOnAllSeries:!0,reset:function(r,e){var t=r.getData(),a=[];e.eachComponent(\"visualMap\",function(n){if(n.isTargetSeries(r)){var i=n.getVisualMeta(Y(Lq,null,r,n))||{stops:[],outerColors:[]},o=n.getDataDimensionIndex(t);o>=0&&(i.dimension=o,a.push(i))}}),r.getData().setVisual(\"visualMeta\",a)}}];function Lq(r,e,t,a){for(var n=e.targetVisuals[a],i=ve.prepareVisualTypes(n),o={color:Ll(r.getData(),\"color\")},s=0,l=i.length;s<l;s++){var u=i[s],f=n[u===\"opacity\"?\"__alphaForOpacity\":u];f&&f.applyVisual(t,h,v)}return o.color;function h(c){return o[c]}function v(c,d){o[c]=d}}var gb=A;function Iq(r){var e=r&&r.visualMap;F(e)||(e=e?[e]:[]),gb(e,function(t){if(!!t){Xi(t,\"splitList\")&&!Xi(t,\"pieces\")&&(t.pieces=t.splitList,delete t.splitList);var a=t.pieces;a&&F(a)&&gb(a,function(n){et(n)&&(Xi(n,\"start\")&&!Xi(n,\"min\")&&(n.min=n.start),Xi(n,\"end\")&&!Xi(n,\"max\")&&(n.max=n.end))})}})}function Xi(r,e){return r&&r.hasOwnProperty&&r.hasOwnProperty(e)}var yb=!1;function GL(r){yb||(yb=!0,r.registerSubTypeDefaulter(\"visualMap\",function(e){return!e.categories&&(!(e.pieces?e.pieces.length>0:e.splitNumber>0)||e.calculable)?\"continuous\":\"piecewise\"}),r.registerAction(Aq,Dq),A(Mq,function(e){r.registerVisual(r.PRIORITY.VISUAL.COMPONENT,e)}),r.registerPreprocessor(Iq))}function HL(r){r.registerComponentModel(mq),r.registerComponentView(Tq),GL(r)}var Pq=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t._pieceList=[],t}return e.prototype.optionUpdated=function(t,a){r.prototype.optionUpdated.apply(this,arguments),this.resetExtent();var n=this._mode=this._determineMode();this._pieceList=[],Rq[this._mode].call(this,this._pieceList),this._resetSelected(t,a);var i=this.option.categories;this.resetVisual(function(o,s){n===\"categories\"?(o.mappingMethod=\"category\",o.categories=at(i)):(o.dataExtent=this.getExtent(),o.mappingMethod=\"piecewise\",o.pieceList=G(this._pieceList,function(l){return l=at(l),s!==\"inRange\"&&(l.visual=null),l}))})},e.prototype.completeVisualOption=function(){var t=this.option,a={},n=ve.listVisualTypes(),i=this.isCategory();A(t.pieces,function(s){A(n,function(l){s.hasOwnProperty(l)&&(a[l]=1)})}),A(a,function(s,l){var u=!1;A(this.stateList,function(f){u=u||o(t,f,l)||o(t.target,f,l)},this),!u&&A(this.stateList,function(f){(t[f]||(t[f]={}))[l]=VL.get(l,f===\"inRange\"?\"active\":\"inactive\",i)})},this);function o(s,l,u){return s&&s[l]&&s[l].hasOwnProperty(u)}r.prototype.completeVisualOption.apply(this,arguments)},e.prototype._resetSelected=function(t,a){var n=this.option,i=this._pieceList,o=(a?n:t).selected||{};if(n.selected=o,A(i,function(l,u){var f=this.getSelectedMapKey(l);o.hasOwnProperty(f)||(o[f]=!0)},this),n.selectedMode===\"single\"){var s=!1;A(i,function(l,u){var f=this.getSelectedMapKey(l);o[f]&&(s?o[f]=!1:s=!0)},this)}},e.prototype.getItemSymbol=function(){return this.get(\"itemSymbol\")},e.prototype.getSelectedMapKey=function(t){return this._mode===\"categories\"?t.value+\"\":t.index+\"\"},e.prototype.getPieceList=function(){return this._pieceList},e.prototype._determineMode=function(){var t=this.option;return t.pieces&&t.pieces.length>0?\"pieces\":this.option.categories?\"categories\":\"splitNumber\"},e.prototype.setSelected=function(t){this.option.selected=at(t)},e.prototype.getValueState=function(t){var a=ve.findPieceIndex(t,this._pieceList);return a!=null&&this.option.selected[this.getSelectedMapKey(this._pieceList[a])]?\"inRange\":\"outOfRange\"},e.prototype.findTargetDataIndices=function(t){var a=[],n=this._pieceList;return this.eachTargetSeries(function(i){var o=[],s=i.getData();s.each(this.getDataDimensionIndex(s),function(l,u){var f=ve.findPieceIndex(l,n);f===t&&o.push(u)},this),a.push({seriesId:i.id,dataIndex:o})},this),a},e.prototype.getRepresentValue=function(t){var a;if(this.isCategory())a=t.value;else if(t.value!=null)a=t.value;else{var n=t.interval||[];a=n[0]===-1/0&&n[1]===1/0?0:(n[0]+n[1])/2}return a},e.prototype.getVisualMeta=function(t){if(this.isCategory())return;var a=[],n=[\"\",\"\"],i=this;function o(f,h){var v=i.getRepresentValue({interval:f});h||(h=i.getValueState(v));var c=t(v,h);f[0]===-1/0?n[0]=c:f[1]===1/0?n[1]=c:a.push({value:f[0],color:c},{value:f[1],color:c})}var s=this._pieceList.slice();if(!s.length)s.push({interval:[-1/0,1/0]});else{var l=s[0].interval[0];l!==-1/0&&s.unshift({interval:[-1/0,l]}),l=s[s.length-1].interval[1],l!==1/0&&s.push({interval:[l,1/0]})}var u=-1/0;return A(s,function(f){var h=f.interval;h&&(h[0]>u&&o([u,h[0]],\"outOfRange\"),o(h.slice()),u=h[1])},this),{stops:a,outerColors:n}},e.type=\"visualMap.piecewise\",e.defaultOption=cn(oh.defaultOption,{selected:null,minOpen:!1,maxOpen:!1,align:\"auto\",itemWidth:20,itemHeight:14,itemSymbol:\"roundRect\",pieces:null,categories:null,splitNumber:5,selectedMode:\"multiple\",itemGap:10,hoverLink:!0}),e}(oh),Rq={splitNumber:function(r){var e=this.option,t=Math.min(e.precision,20),a=this.getExtent(),n=e.splitNumber;n=Math.max(parseInt(n,10),1),e.splitNumber=n;for(var i=(a[1]-a[0])/n;+i.toFixed(t)!==i&&t<5;)t++;e.precision=t,i=+i.toFixed(t),e.minOpen&&r.push({interval:[-1/0,a[0]],close:[0,0]});for(var o=0,s=a[0];o<n;s+=i,o++){var l=o===n-1?a[1]:s+i;r.push({interval:[s,l],close:[1,1]})}e.maxOpen&&r.push({interval:[a[1],1/0],close:[0,0]}),l0(r),A(r,function(u,f){u.index=f,u.text=this.formatValueText(u.interval)},this)},categories:function(r){var e=this.option;A(e.categories,function(t){r.push({text:this.formatValueText(t,!0),value:t})},this),mb(e,r)},pieces:function(r){var e=this.option;A(e.pieces,function(t,a){et(t)||(t={value:t});var n={text:\"\",index:a};if(t.label!=null&&(n.text=t.label),t.hasOwnProperty(\"value\")){var i=n.value=t.value;n.interval=[i,i],n.close=[1,1]}else{for(var o=n.interval=[],s=n.close=[0,0],l=[1,0,1],u=[-1/0,1/0],f=[],h=0;h<2;h++){for(var v=[[\"gte\",\"gt\",\"min\"],[\"lte\",\"lt\",\"max\"]][h],c=0;c<3&&o[h]==null;c++)o[h]=t[v[c]],s[h]=l[c],f[h]=c===2;o[h]==null&&(o[h]=u[h])}f[0]&&o[1]===1/0&&(s[0]=0),f[1]&&o[0]===-1/0&&(s[1]=0),o[0]===o[1]&&s[0]&&s[1]&&(n.value=o[0])}n.visual=ve.retrieveVisuals(t),r.push(n)},this),mb(e,r),l0(r),A(r,function(t){var a=t.close,n=[[\"<\",\"\\u2264\"][a[1]],[\">\",\"\\u2265\"][a[0]]];t.text=t.text||this.formatValueText(t.value!=null?t.value:t.interval,!1,n)},this)}};function mb(r,e){var t=r.inverse;(r.orient===\"vertical\"?!t:t)&&e.reverse()}var Eq=Pq,kq=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=e.type,t}return e.prototype.doRender=function(){var t=this.group;t.removeAll();var a=this.visualMapModel,n=a.get(\"textGap\"),i=a.textStyleModel,o=i.getFont(),s=i.getTextColor(),l=this._getItemAlign(),u=a.itemSize,f=this._getViewData(),h=f.endsText,v=le(a.get(\"showLabel\",!0),!h);h&&this._renderEndsText(t,h[0],u,v,l),A(f.viewPieceList,function(c){var d=c.piece,p=new nt;p.onclick=Y(this._onItemClick,this,d),this._enableHoverLink(p,c.indexInModelPieceList);var g=a.getRepresentValue(d);if(this._createItemSymbol(p,g,[0,0,u[0],u[1]]),v){var y=this.visualMapModel.getValueState(g);p.add(new Dt({style:{x:l===\"right\"?-n:u[0]+n,y:u[1]/2,text:d.text,verticalAlign:\"middle\",align:l,font:o,fill:s,opacity:y===\"outOfRange\"?.5:1}}))}t.add(p)},this),h&&this._renderEndsText(t,h[1],u,v,l),ui(a.get(\"orient\"),t,a.get(\"itemGap\")),this.renderBackground(t),this.positionGroup(t)},e.prototype._enableHoverLink=function(t,a){var n=this;t.on(\"mouseover\",function(){return i(\"highlight\")}).on(\"mouseout\",function(){return i(\"downplay\")});var i=function(o){var s=n.visualMapModel;s.option.hoverLink&&n.api.dispatchAction({type:o,batch:cf(s.findTargetDataIndices(a),s)})}},e.prototype._getItemAlign=function(){var t=this.visualMapModel,a=t.option;if(a.orient===\"vertical\")return FL(t,this.api,t.itemSize);var n=a.align;return(!n||n===\"auto\")&&(n=\"left\"),n},e.prototype._renderEndsText=function(t,a,n,i,o){if(!!a){var s=new nt,l=this.visualMapModel.textStyleModel;s.add(new Dt({style:Nt(l,{x:i?o===\"right\"?n[0]:0:n[0]/2,y:n[1]/2,verticalAlign:\"middle\",align:i?o:\"center\",text:a})})),t.add(s)}},e.prototype._getViewData=function(){var t=this.visualMapModel,a=G(t.getPieceList(),function(s,l){return{piece:s,indexInModelPieceList:l}}),n=t.get(\"text\"),i=t.get(\"orient\"),o=t.get(\"inverse\");return(i===\"horizontal\"?o:!o)?a.reverse():n&&(n=n.slice().reverse()),{viewPieceList:a,endsText:n}},e.prototype._createItemSymbol=function(t,a,n){t.add(jt(this.getControllerVisual(a,\"symbol\"),n[0],n[1],n[2],n[3],this.getControllerVisual(a,\"color\")))},e.prototype._onItemClick=function(t){var a=this.visualMapModel,n=a.option,i=n.selectedMode;if(!!i){var o=at(n.selected),s=a.getSelectedMapKey(t);i===\"single\"||i===!0?(o[s]=!0,A(o,function(l,u){o[u]=u===s})):o[s]=!o[s],this.api.dispatchAction({type:\"selectDataRange\",from:this.uid,visualMapId:this.visualMapModel.id,selected:o})}},e.type=\"visualMap.piecewise\",e}(zL),Oq=kq;function WL(r){r.registerComponentModel(Eq),r.registerComponentView(Oq),GL(r)}function Bq(r){ct(HL),ct(WL)}var Nq={label:{enabled:!0},decal:{show:!1}},_b=Ct(),Vq={};function zq(r,e){var t=r.getModel(\"aria\");if(!t.get(\"enabled\"))return;var a=at(Nq);ht(a.label,r.getLocaleModel().get(\"aria\"),!1),ht(t.option,a,!1),n(),i();function n(){var u=t.getModel(\"decal\"),f=u.get(\"show\");if(f){var h=q();r.eachSeries(function(v){if(!v.isColorBySeries()){var c=h.get(v.type);c||(c={},h.set(v.type,c)),_b(v).scope=c}}),r.eachRawSeries(function(v){if(r.isSeriesFiltered(v))return;if(J(v.enableAriaDecal)){v.enableAriaDecal();return}var c=v.getData();if(v.isColorBySeries()){var m=up(v.ecModel,v.name,Vq,r.getSeriesCount()),_=c.getVisual(\"decal\");c.setVisual(\"decal\",S(_,m))}else{var d=v.getRawData(),p={},g=_b(v).scope;c.each(function(w){var x=c.getRawIndex(w);p[x]=w});var y=d.count();d.each(function(w){var x=p[w],b=d.getName(w)||w+\"\",C=up(v.ecModel,b,g,y),T=c.getItemVisual(x,\"decal\");c.setItemVisual(x,\"decal\",S(T,C))})}function S(w,x){var b=w?V(V({},x),w):x;return b.dirty=!0,b}})}}function i(){var u=r.getLocaleModel().get(\"aria\"),f=t.getModel(\"label\");if(f.option=tt(f.option,u),!!f.get(\"enabled\")){var h=e.getZr().dom;if(f.get(\"description\")){h.setAttribute(\"aria-label\",f.get(\"description\"));return}var v=r.getSeriesCount(),c=f.get([\"data\",\"maxCount\"])||10,d=f.get([\"series\",\"maxCount\"])||10,p=Math.min(v,d),g;if(!(v<1)){var y=s();if(y){var m=f.get([\"general\",\"withTitle\"]);g=o(m,{title:y})}else g=f.get([\"general\",\"withoutTitle\"]);var _=[],S=v>1?f.get([\"series\",\"multiple\",\"prefix\"]):f.get([\"series\",\"single\",\"prefix\"]);g+=o(S,{seriesCount:v}),r.eachSeries(function(C,T){if(T<p){var D=void 0,M=C.get(\"name\"),L=M?\"withName\":\"withoutName\";D=v>1?f.get([\"series\",\"multiple\",L]):f.get([\"series\",\"single\",L]),D=o(D,{seriesId:C.seriesIndex,seriesName:C.get(\"name\"),seriesType:l(C.subType)});var I=C.getData();if(I.count()>c){var P=f.get([\"data\",\"partialData\"]);D+=o(P,{displayCnt:c})}else D+=f.get([\"data\",\"allData\"]);for(var R=f.get([\"data\",\"separator\",\"middle\"]),E=f.get([\"data\",\"separator\",\"end\"]),B=[],O=0;O<I.count();O++)if(O<c){var z=I.getName(O),H=I.getValues(O),$=f.get([\"data\",z?\"withName\":\"withoutName\"]);B.push(o($,{name:z,value:H.join(R)}))}D+=B.join(R)+E,_.push(D)}});var w=f.getModel([\"series\",\"multiple\",\"separator\"]),x=w.get(\"middle\"),b=w.get(\"end\");g+=_.join(x)+b,h.setAttribute(\"aria-label\",g)}}}function o(u,f){if(!U(u))return u;var h=u;return A(f,function(v,c){h=h.replace(new RegExp(\"\\\\{\\\\s*\"+c+\"\\\\s*\\\\}\",\"g\"),v)}),h}function s(){var u=r.get(\"title\");return u&&u.length&&(u=u[0]),u&&u.text}function l(u){return r.getLocaleModel().get([\"series\",\"typeNames\"])[u]||\"\\u81EA\\u5B9A\\u4E49\\u56FE\"}}function Fq(r){if(!(!r||!r.aria)){var e=r.aria;e.show!=null&&(e.enabled=e.show),e.label=e.label||{},A([\"description\",\"general\",\"series\",\"data\"],function(t){e[t]!=null&&(e.label[t]=e[t])})}}function Gq(r){r.registerPreprocessor(Fq),r.registerVisual(r.PRIORITY.VISUAL.ARIA,zq)}var Sb={value:\"eq\",\"<\":\"lt\",\"<=\":\"lte\",\">\":\"gt\",\">=\":\"gte\",\"=\":\"eq\",\"!=\":\"ne\",\"<>\":\"ne\"},Hq=function(){function r(e){var t=this._condVal=U(e)?new RegExp(e):RR(e)?e:null;if(t==null){var a=\"\";Pt(a)}}return r.prototype.evaluate=function(e){var t=typeof e;return U(t)?this._condVal.test(e):Mt(t)?this._condVal.test(e+\"\"):!1},r}(),Wq=function(){function r(){}return r.prototype.evaluate=function(){return this.value},r}(),$q=function(){function r(){}return r.prototype.evaluate=function(){for(var e=this.children,t=0;t<e.length;t++)if(!e[t].evaluate())return!1;return!0},r}(),Uq=function(){function r(){}return r.prototype.evaluate=function(){for(var e=this.children,t=0;t<e.length;t++)if(e[t].evaluate())return!0;return!1},r}(),Yq=function(){function r(){}return r.prototype.evaluate=function(){return!this.child.evaluate()},r}(),Zq=function(){function r(){}return r.prototype.evaluate=function(){for(var e=!!this.valueParser,t=this.getValue,a=t(this.valueGetterParam),n=e?this.valueParser(a):null,i=0;i<this.subCondList.length;i++)if(!this.subCondList[i].evaluate(e?n:a))return!1;return!0},r}();function bm(r,e){if(r===!0||r===!1){var t=new Wq;return t.value=r,t}var a=\"\";return $L(r)||Pt(a),r.and?xb(\"and\",r,e):r.or?xb(\"or\",r,e):r.not?Xq(r,e):qq(r,e)}function xb(r,e,t){var a=e[r],n=\"\";F(a)||Pt(n),a.length||Pt(n);var i=r===\"and\"?new $q:new Uq;return i.children=G(a,function(o){return bm(o,t)}),i.children.length||Pt(n),i}function Xq(r,e){var t=r.not,a=\"\";$L(t)||Pt(a);var n=new Yq;return n.child=bm(t,e),n.child||Pt(a),n}function qq(r,e){for(var t=\"\",a=e.prepareGetValue(r),n=[],i=St(r),o=r.parser,s=o?cT(o):null,l=0;l<i.length;l++){var u=i[l];if(!(u===\"parser\"||e.valueGetterAttrMap.get(u))){var f=Z(Sb,u)?Sb[u]:u,h=r[u],v=s?s(h):h,c=BO(f,v)||f===\"reg\"&&new Hq(v);c||Pt(t),n.push(c)}}n.length||Pt(t);var d=new Zq;return d.valueGetterParam=a,d.valueParser=s,d.getValue=e.getValue,d.subCondList=n,d}function $L(r){return et(r)&&!Se(r)}var Kq=function(){function r(e,t){this._cond=bm(e,t)}return r.prototype.evaluate=function(){return this._cond.evaluate()},r}();function Jq(r,e){return new Kq(r,e)}var Qq={type:\"echarts:filter\",transform:function(r){for(var e=r.upstream,t,a=Jq(r.config,{valueGetterAttrMap:q({dimension:!0}),prepareGetValue:function(s){var l=\"\",u=s.dimension;Z(s,\"dimension\")||Pt(l);var f=e.getDimensionInfo(u);return f||Pt(l),{dimIdx:f.index}},getValue:function(s){return e.retrieveValueFromItem(t,s.dimIdx)}}),n=[],i=0,o=e.count();i<o;i++)t=e.getRawDataItem(i),a.evaluate()&&n.push(t);return{data:n}}},jq={type:\"echarts:sort\",transform:function(r){var e=r.upstream,t=r.config,a=\"\",n=kt(t);n.length||Pt(a);var i=[];A(n,function(f){var h=f.dimension,v=f.order,c=f.parser,d=f.incomparable;if(h==null&&Pt(a),v!==\"asc\"&&v!==\"desc\"&&Pt(a),d&&d!==\"min\"&&d!==\"max\"){var p=\"\";Pt(p)}if(v!==\"asc\"&&v!==\"desc\"){var g=\"\";Pt(g)}var y=e.getDimensionInfo(h);y||Pt(a);var m=c?cT(c):null;c&&!m&&Pt(a),i.push({dimIdx:y.index,parser:m,comparator:new pT(v,d)})});var o=e.sourceFormat;o!==xe&&o!==cr&&Pt(a);for(var s=[],l=0,u=e.count();l<u;l++)s.push(e.getRawDataItem(l));return s.sort(function(f,h){for(var v=0;v<i.length;v++){var c=i[v],d=e.retrieveValueFromItem(f,c.dimIdx),p=e.retrieveValueFromItem(h,c.dimIdx);c.parser&&(d=c.parser(d),p=c.parser(p));var g=c.comparator.evaluate(d,p);if(g!==0)return g}return 0}),{data:s}}};function tK(r){r.registerTransform(Qq),r.registerTransform(jq)}var eK=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=\"dataset\",t}return e.prototype.init=function(t,a,n){r.prototype.init.call(this,t,a,n),this._sourceManager=new _T(this),w1(this)},e.prototype.mergeOption=function(t,a){r.prototype.mergeOption.call(this,t,a),w1(this)},e.prototype.optionUpdated=function(){this._sourceManager.dirty()},e.prototype.getSourceManager=function(){return this._sourceManager},e.type=\"dataset\",e.defaultOption={seriesLayoutBy:Yr},e}(Tt),rK=function(r){k(e,r);function e(){var t=r!==null&&r.apply(this,arguments)||this;return t.type=\"dataset\",t}return e.type=\"dataset\",e}(Ut);function aK(r){r.registerComponentModel(eK),r.registerComponentView(rK)}var Er=Jr.CMD;function io(r,e){return Math.abs(r-e)<1e-5}function lg(r){var e=r.data,t=r.len(),a=[],n,i=0,o=0,s=0,l=0;function u(I,P){n&&n.length>2&&a.push(n),n=[I,P]}function f(I,P,R,E){io(I,R)&&io(P,E)||n.push(I,P,R,E,R,E)}function h(I,P,R,E,B,O){var z=Math.abs(P-I),H=Math.tan(z/4)*4/3,$=P<I?-1:1,X=Math.cos(I),Q=Math.sin(I),j=Math.cos(P),pt=Math.sin(P),xt=X*B+R,gt=Q*O+E,rt=j*B+R,yt=pt*O+E,st=B*H*$,K=O*H*$;n.push(xt-st*Q,gt+K*X,rt+st*pt,yt-K*j,rt,yt)}for(var v,c,d,p,g=0;g<t;){var y=e[g++],m=g===1;switch(m&&(i=e[g],o=e[g+1],s=i,l=o,(y===Er.L||y===Er.C||y===Er.Q)&&(n=[s,l])),y){case Er.M:i=s=e[g++],o=l=e[g++],u(s,l);break;case Er.L:v=e[g++],c=e[g++],f(i,o,v,c),i=v,o=c;break;case Er.C:n.push(e[g++],e[g++],e[g++],e[g++],i=e[g++],o=e[g++]);break;case Er.Q:v=e[g++],c=e[g++],d=e[g++],p=e[g++],n.push(i+2/3*(v-i),o+2/3*(c-o),d+2/3*(v-d),p+2/3*(c-p),d,p),i=d,o=p;break;case Er.A:var _=e[g++],S=e[g++],w=e[g++],x=e[g++],b=e[g++],C=e[g++]+b;g+=1;var T=!e[g++];v=Math.cos(b)*w+_,c=Math.sin(b)*x+S,m?(s=v,l=c,u(s,l)):f(i,o,v,c),i=Math.cos(C)*w+_,o=Math.sin(C)*x+S;for(var D=(T?-1:1)*Math.PI/2,M=b;T?M>C:M<C;M+=D){var L=T?Math.max(M+D,C):Math.min(M+D,C);h(M,L,_,S,w,x)}break;case Er.R:s=i=e[g++],l=o=e[g++],v=s+e[g++],c=l+e[g++],u(v,l),f(v,l,v,c),f(v,c,s,c),f(s,c,s,l),f(s,l,v,l);break;case Er.Z:n&&f(i,o,s,l),i=s,o=l;break}}return n&&n.length>2&&a.push(n),a}function ug(r,e,t,a,n,i,o,s,l,u){if(io(r,t)&&io(e,a)&&io(n,o)&&io(i,s)){l.push(o,s);return}var f=2/u,h=f*f,v=o-r,c=s-e,d=Math.sqrt(v*v+c*c);v/=d,c/=d;var p=t-r,g=a-e,y=n-o,m=i-s,_=p*p+g*g,S=y*y+m*m;if(_<h&&S<h){l.push(o,s);return}var w=v*p+c*g,x=-v*y-c*m,b=_-w*w,C=S-x*x;if(b<h&&w>=0&&C<h&&x>=0){l.push(o,s);return}var T=[],D=[];en(r,t,n,o,.5,T),en(e,a,i,s,.5,D),ug(T[0],D[0],T[1],D[1],T[2],D[2],T[3],D[3],l,u),ug(T[4],D[4],T[5],D[5],T[6],D[6],T[7],D[7],l,u)}function nK(r,e){var t=lg(r),a=[];e=e||1;for(var n=0;n<t.length;n++){var i=t[n],o=[],s=i[0],l=i[1];o.push(s,l);for(var u=2;u<i.length;){var f=i[u++],h=i[u++],v=i[u++],c=i[u++],d=i[u++],p=i[u++];ug(s,l,f,h,v,c,d,p,o,e),s=d,l=p}a.push(o)}return a}function UL(r,e,t){var a=r[e],n=r[1-e],i=Math.abs(a/n),o=Math.ceil(Math.sqrt(i*t)),s=Math.floor(t/o);s===0&&(s=1,o=t);for(var l=[],u=0;u<o;u++)l.push(s);var f=o*s,h=t-f;if(h>0)for(var u=0;u<h;u++)l[u%o]+=1;return l}function wb(r,e,t){for(var a=r.r0,n=r.r,i=r.startAngle,o=r.endAngle,s=Math.abs(o-i),l=s*n,u=n-a,f=l>Math.abs(u),h=UL([l,u],f?0:1,e),v=(f?s:u)/h.length,c=0;c<h.length;c++)for(var d=(f?u:s)/h[c],p=0;p<h[c];p++){var g={};f?(g.startAngle=i+v*c,g.endAngle=i+v*(c+1),g.r0=a+d*p,g.r=a+d*(p+1)):(g.startAngle=i+d*p,g.endAngle=i+d*(p+1),g.r0=a+v*c,g.r=a+v*(c+1)),g.clockwise=r.clockwise,g.cx=r.cx,g.cy=r.cy,t.push(g)}}function iK(r,e,t){for(var a=r.width,n=r.height,i=a>n,o=UL([a,n],i?0:1,e),s=i?\"width\":\"height\",l=i?\"height\":\"width\",u=i?\"x\":\"y\",f=i?\"y\":\"x\",h=r[s]/o.length,v=0;v<o.length;v++)for(var c=r[l]/o[v],d=0;d<o[v];d++){var p={};p[u]=v*h,p[f]=d*c,p[s]=h,p[l]=c,p.x+=r.x,p.y+=r.y,t.push(p)}}function bb(r,e,t,a){return r*a-t*e}function oK(r,e,t,a,n,i,o,s){var l=t-r,u=a-e,f=o-n,h=s-i,v=bb(f,h,l,u);if(Math.abs(v)<1e-6)return null;var c=r-n,d=e-i,p=bb(c,d,f,h)/v;return p<0||p>1?null:new ut(p*l+r,p*u+e)}function sK(r,e,t){var a=new ut;ut.sub(a,t,e),a.normalize();var n=new ut;ut.sub(n,r,e);var i=n.dot(a);return i}function qi(r,e){var t=r[r.length-1];t&&t[0]===e[0]&&t[1]===e[1]||r.push(e)}function lK(r,e,t){for(var a=r.length,n=[],i=0;i<a;i++){var o=r[i],s=r[(i+1)%a],l=oK(o[0],o[1],s[0],s[1],e.x,e.y,t.x,t.y);l&&n.push({projPt:sK(l,e,t),pt:l,idx:i})}if(n.length<2)return[{points:r},{points:r}];n.sort(function(g,y){return g.projPt-y.projPt});var u=n[0],f=n[n.length-1];if(f.idx<u.idx){var h=u;u=f,f=h}for(var v=[u.pt.x,u.pt.y],c=[f.pt.x,f.pt.y],d=[v],p=[c],i=u.idx+1;i<=f.idx;i++)qi(d,r[i].slice());qi(d,c),qi(d,v);for(var i=f.idx+1;i<=u.idx+a;i++)qi(p,r[i%a].slice());return qi(p,v),qi(p,c),[{points:d},{points:p}]}function Cb(r){var e=r.points,t=[],a=[];xh(e,t,a);var n=new vt(t[0],t[1],a[0]-t[0],a[1]-t[1]),i=n.width,o=n.height,s=n.x,l=n.y,u=new ut,f=new ut;return i>o?(u.x=f.x=s+i/2,u.y=l,f.y=l+o):(u.y=f.y=l+o/2,u.x=s,f.x=s+i),lK(e,u,f)}function sh(r,e,t,a){if(t===1)a.push(e);else{var n=Math.floor(t/2),i=r(e);sh(r,i[0],n,a),sh(r,i[1],t-n,a)}return a}function uK(r,e){for(var t=[],a=0;a<e;a++)t.push(zg(r));return t}function fK(r,e){e.setStyle(r.style),e.z=r.z,e.z2=r.z2,e.zlevel=r.zlevel}function hK(r){for(var e=[],t=0;t<r.length;)e.push([r[t++],r[t++]]);return e}function vK(r,e){var t=[],a=r.shape,n;switch(r.type){case\"rect\":iK(a,e,t),n=bt;break;case\"sector\":wb(a,e,t),n=Ve;break;case\"circle\":wb({r0:0,r:a.r,startAngle:0,endAngle:Math.PI*2,cx:a.cx,cy:a.cy},e,t),n=Ve;break;default:var i=r.getComputedTransform(),o=i?Math.sqrt(Math.max(i[0]*i[0]+i[1]*i[1],i[2]*i[2]+i[3]*i[3])):1,s=G(nK(r.getUpdatedPathProxy(),o),function(y){return hK(y)}),l=s.length;if(l===0)sh(Cb,{points:s[0]},e,t);else if(l===e)for(var u=0;u<l;u++)t.push({points:s[u]});else{var f=0,h=G(s,function(y){var m=[],_=[];xh(y,m,_);var S=(_[1]-m[1])*(_[0]-m[0]);return f+=S,{poly:y,area:S}});h.sort(function(y,m){return m.area-y.area});for(var v=e,u=0;u<l;u++){var c=h[u];if(v<=0)break;var d=u===l-1?v:Math.ceil(c.area/f*e);d<0||(sh(Cb,{points:c.poly},d,t),v-=d)}}n=ze;break}if(!n)return uK(r,e);for(var p=[],u=0;u<t.length;u++){var g=new n;g.setShape(t[u]),fK(r,g),p.push(g)}return p}function cK(r,e){var t=r.length,a=e.length;if(t===a)return[r,e];for(var n=[],i=[],o=t<a?r:e,s=Math.min(t,a),l=Math.abs(a-t)/6,u=(s-2)/6,f=Math.ceil(l/u)+1,h=[o[0],o[1]],v=l,c=2;c<s;){var d=o[c-2],p=o[c-1],g=o[c++],y=o[c++],m=o[c++],_=o[c++],S=o[c++],w=o[c++];if(v<=0){h.push(g,y,m,_,S,w);continue}for(var x=Math.min(v,f-1)+1,b=1;b<=x;b++){var C=b/x;en(d,g,m,S,C,n),en(p,y,_,w,C,i),d=n[3],p=i[3],h.push(n[1],i[1],n[2],i[2],d,p),g=n[5],y=i[5],m=n[6],_=i[6]}v-=x-1}return o===r?[h,e]:[r,h]}function Tb(r,e){for(var t=r.length,a=r[t-2],n=r[t-1],i=[],o=0;o<e.length;)i[o++]=a,i[o++]=n;return i}function dK(r,e){for(var t,a,n,i=[],o=[],s=0;s<Math.max(r.length,e.length);s++){var l=r[s],u=e[s],f=void 0,h=void 0;l?u?(t=cK(l,u),f=t[0],h=t[1],a=f,n=h):(h=Tb(n||l,l),f=l):(f=Tb(a||u,u),h=u),i.push(f),o.push(h)}return[i,o]}function Ab(r){for(var e=0,t=0,a=0,n=r.length,i=0,o=n-2;i<n;o=i,i+=2){var s=r[o],l=r[o+1],u=r[i],f=r[i+1],h=s*f-u*l;e+=h,t+=(s+u)*h,a+=(l+f)*h}return e===0?[r[0]||0,r[1]||0]:[t/e/3,a/e/3,e]}function pK(r,e,t,a){for(var n=(r.length-2)/6,i=1/0,o=0,s=r.length,l=s-2,u=0;u<n;u++){for(var f=u*6,h=0,v=0;v<s;v+=2){var c=v===0?f:(f+v-2)%l+2,d=r[c]-t[0],p=r[c+1]-t[1],g=e[v]-a[0],y=e[v+1]-a[1],m=g-d,_=y-p;h+=m*m+_*_}h<i&&(i=h,o=u)}return o}function gK(r){for(var e=[],t=r.length,a=0;a<t;a+=2)e[a]=r[t-a-2],e[a+1]=r[t-a-1];return e}function yK(r,e,t,a){for(var n=[],i,o=0;o<r.length;o++){var s=r[o],l=e[o],u=Ab(s),f=Ab(l);i==null&&(i=u[2]<0!=f[2]<0);var h=[],v=[],c=0,d=1/0,p=[],g=s.length;i&&(s=gK(s));for(var y=pK(s,l,u,f)*6,m=g-2,_=0;_<m;_+=2){var S=(y+_)%m+2;h[_+2]=s[S]-u[0],h[_+3]=s[S+1]-u[1]}if(h[0]=s[y]-u[0],h[1]=s[y+1]-u[1],t>0)for(var w=a/t,x=-a/2;x<=a/2;x+=w){for(var b=Math.sin(x),C=Math.cos(x),T=0,_=0;_<s.length;_+=2){var D=h[_],M=h[_+1],L=l[_]-f[0],I=l[_+1]-f[1],P=L*C-I*b,R=L*b+I*C;p[_]=P,p[_+1]=R;var E=P-D,B=R-M;T+=E*E+B*B}if(T<d){d=T,c=x;for(var O=0;O<p.length;O++)v[O]=p[O]}}else for(var z=0;z<g;z+=2)v[z]=l[z]-f[0],v[z+1]=l[z+1]-f[1];n.push({from:h,to:v,fromCp:u,toCp:f,rotation:-c})}return n}function lh(r){return r.__isCombineMorphing}var YL=\"__mOriginal_\";function uh(r,e,t){var a=YL+e,n=r[a]||r[e];r[a]||(r[a]=r[e]);var i=t.replace,o=t.after,s=t.before;r[e]=function(){var l=arguments,u;return s&&s.apply(this,l),i?u=i.apply(this,l):u=n.apply(this,l),o&&o.apply(this,l),u}}function Fs(r,e){var t=YL+e;r[t]&&(r[e]=r[t],r[t]=null)}function Db(r,e){for(var t=0;t<r.length;t++)for(var a=r[t],n=0;n<a.length;){var i=a[n],o=a[n+1];a[n++]=e[0]*i+e[2]*o+e[4],a[n++]=e[1]*i+e[3]*o+e[5]}}function ZL(r,e){var t=r.getUpdatedPathProxy(),a=e.getUpdatedPathProxy(),n=dK(lg(t),lg(a)),i=n[0],o=n[1],s=r.getComputedTransform(),l=e.getComputedTransform();function u(){this.transform=null}s&&Db(i,s),l&&Db(o,l),uh(e,\"updateTransform\",{replace:u}),e.transform=null;var f=yK(i,o,10,Math.PI),h=[];uh(e,\"buildPath\",{replace:function(v){for(var c=e.__morphT,d=1-c,p=[],g=0;g<f.length;g++){var y=f[g],m=y.from,_=y.to,S=y.rotation*c,w=y.fromCp,x=y.toCp,b=Math.sin(S),C=Math.cos(S);Xu(p,w,x,c);for(var T=0;T<m.length;T+=2){var D=m[T],M=m[T+1],L=_[T],I=_[T+1],P=D*d+L*c,R=M*d+I*c;h[T]=P*C-R*b+p[0],h[T+1]=P*b+R*C+p[1]}var E=h[0],B=h[1];v.moveTo(E,B);for(var T=2;T<m.length;){var L=h[T++],I=h[T++],O=h[T++],z=h[T++],H=h[T++],$=h[T++];E===L&&B===I&&O===H&&z===$?v.lineTo(H,$):v.bezierCurveTo(L,I,O,z,H,$),E=H,B=$}}}})}function Cm(r,e,t){if(!r||!e)return e;var a=t.done,n=t.during;ZL(r,e),e.__morphT=0;function i(){Fs(e,\"buildPath\"),Fs(e,\"updateTransform\"),e.__morphT=-1,e.createPathProxy(),e.dirtyShape()}return e.animateTo({__morphT:1},tt({during:function(o){e.dirtyShape(),n&&n(o)},done:function(){i(),a&&a()}},t)),e}function mK(r,e,t,a,n,i){var o=16;r=n===t?0:Math.round(32767*(r-t)/(n-t)),e=i===a?0:Math.round(32767*(e-a)/(i-a));for(var s=0,l,u=(1<<o)/2;u>0;u/=2){var f=0,h=0;(r&u)>0&&(f=1),(e&u)>0&&(h=1),s+=u*u*(3*f^h),h===0&&(f===1&&(r=u-1-r,e=u-1-e),l=r,r=e,e=l)}return s}function fh(r){var e=1/0,t=1/0,a=-1/0,n=-1/0,i=G(r,function(s){var l=s.getBoundingRect(),u=s.getComputedTransform(),f=l.x+l.width/2+(u?u[4]:0),h=l.y+l.height/2+(u?u[5]:0);return e=Math.min(f,e),t=Math.min(h,t),a=Math.max(f,a),n=Math.max(h,n),[f,h]}),o=G(i,function(s,l){return{cp:s,z:mK(s[0],s[1],e,t,a,n),path:r[l]}});return o.sort(function(s,l){return s.z-l.z}).map(function(s){return s.path})}function XL(r){return vK(r.path,r.count)}function fg(){return{fromIndividuals:[],toIndividuals:[],count:0}}function _K(r,e,t){var a=[];function n(w){for(var x=0;x<w.length;x++){var b=w[x];lh(b)?n(b.childrenRef()):b instanceof mt&&a.push(b)}}n(r);var i=a.length;if(!i)return fg();var o=t.dividePath||XL,s=o({path:e,count:i});if(s.length!==i)return console.error(\"Invalid morphing: unmatched splitted path\"),fg();a=fh(a),s=fh(s);for(var l=t.done,u=t.during,f=t.individualDelay,h=new la,v=0;v<i;v++){var c=a[v],d=s[v];d.parent=e,d.copyTransform(h),f||ZL(c,d)}e.__isCombineMorphing=!0,e.childrenRef=function(){return s};function p(w){for(var x=0;x<s.length;x++)s[x].addSelfToZr(w)}uh(e,\"addSelfToZr\",{after:function(w){p(w)}}),uh(e,\"removeSelfFromZr\",{after:function(w){for(var x=0;x<s.length;x++)s[x].removeSelfFromZr(w)}});function g(){e.__isCombineMorphing=!1,e.__morphT=-1,e.childrenRef=null,Fs(e,\"addSelfToZr\"),Fs(e,\"removeSelfFromZr\")}var y=s.length;if(f)for(var m=y,_=function(){m--,m===0&&(g(),l&&l())},v=0;v<y;v++){var S=f?tt({delay:(t.delay||0)+f(v,y,a[v],s[v]),done:_},t):t;Cm(a[v],s[v],S)}else e.__morphT=0,e.animateTo({__morphT:1},tt({during:function(w){for(var x=0;x<y;x++){var b=s[x];b.__morphT=e.__morphT,b.dirtyShape()}u&&u(w)},done:function(){g();for(var w=0;w<r.length;w++)Fs(r[w],\"updateTransform\");l&&l()}},t));return e.__zr&&p(e.__zr),{fromIndividuals:a,toIndividuals:s,count:y}}function SK(r,e,t){var a=e.length,n=[],i=t.dividePath||XL;function o(c){for(var d=0;d<c.length;d++){var p=c[d];lh(p)?o(p.childrenRef()):p instanceof mt&&n.push(p)}}if(lh(r)){o(r.childrenRef());var s=n.length;if(s<a)for(var l=0,u=s;u<a;u++)n.push(zg(n[l++%s]));n.length=a}else{n=i({path:r,count:a});for(var f=r.getComputedTransform(),u=0;u<n.length;u++)n[u].setLocalTransform(f);if(n.length!==a)return console.error(\"Invalid morphing: unmatched splitted path\"),fg()}n=fh(n),e=fh(e);for(var h=t.individualDelay,u=0;u<a;u++){var v=h?tt({delay:(t.delay||0)+h(u,a,n[u],e[u])},t):t;Cm(n[u],e[u],v)}return{fromIndividuals:n,toIndividuals:e,count:e.length}}function Mb(r){return F(r[0])}function Lb(r,e){for(var t=[],a=r.length,n=0;n<a;n++)t.push({one:r[n],many:[]});for(var n=0;n<e.length;n++){var i=e[n].length,o=void 0;for(o=0;o<i;o++)t[o%a].many.push(e[n][o])}for(var s=0,n=a-1;n>=0;n--)if(!t[n].many.length){var l=t[s].many;if(l.length<=1)if(s)s=0;else return t;var i=l.length,u=Math.ceil(i/2);t[n].many=l.slice(u,i),t[s].many=l.slice(0,u),s++}return t}var xK={clone:function(r){for(var e=[],t=1-Math.pow(1-r.path.style.opacity,1/r.count),a=0;a<r.count;a++){var n=zg(r.path);n.setStyle(\"opacity\",t),e.push(n)}return e},split:null};function _d(r,e,t,a,n,i){if(!r.length||!e.length)return;var o=Ao(\"update\",a,n);if(!(o&&o.duration>0))return;var s=a.getModel(\"universalTransition\").get(\"delay\"),l=Object.assign({setToFinal:!0},o),u,f;Mb(r)&&(u=r,f=e),Mb(e)&&(u=e,f=r);function h(y,m,_,S,w){var x=y.many,b=y.one;if(x.length===1&&!w){var C=m?x[0]:b,T=m?b:x[0];if(lh(C))h({many:[C],one:T},!0,_,S,!0);else{var D=s?tt({delay:s(_,S)},l):l;Cm(C,T,D),i(C,T,C,T,D)}}else for(var M=tt({dividePath:xK[t],individualDelay:s&&function(B,O,z,H){return s(B+_,S)}},l),L=m?_K(x,b,M):SK(b,x,M),I=L.fromIndividuals,P=L.toIndividuals,R=I.length,E=0;E<R;E++){var D=s?tt({delay:s(E,R)},l):l;i(I[E],P[E],m?x[E]:y.one,m?y.one:x[E],D)}}for(var v=u?u===r:r.length>e.length,c=u?Lb(f,u):Lb(v?e:r,[v?r:e]),d=0,p=0;p<c.length;p++)d+=c[p].many.length;for(var g=0,p=0;p<c.length;p++)h(c[p],v,g,d),g+=c[p].many.length}function $n(r){if(!r)return[];if(F(r)){for(var e=[],t=0;t<r.length;t++)e.push($n(r[t]));return e}var a=[];return r.traverse(function(n){n instanceof mt&&!n.disableMorphing&&!n.invisible&&!n.ignore&&a.push(n)}),a}var qL=1e4,wK=Ct();function bK(r){for(var e=r.dimensions,t=0;t<e.length;t++){var a=r.getDimensionInfo(e[t]);if(a&&a.otherDims.itemGroupId===0)return e[t]}}function Ib(r){var e=[];return A(r,function(t){var a=t.data;if(!(a.count()>qL))for(var n=a.getIndices(),i=bK(a),o=0;o<n.length;o++)e.push({dataGroupId:t.dataGroupId,data:a,dim:t.dim||i,divide:t.divide,dataIndex:o})}),e}function Sd(r,e,t){r.traverse(function(a){a instanceof mt&&Ft(a,{style:{opacity:0}},e,{dataIndex:t,isFrom:!0})})}function xd(r){if(r.parent){var e=r.getComputedTransform();r.setLocalTransform(e),r.parent.remove(r)}}function Ki(r){r.stopAnimation(),r.isGroup&&r.traverse(function(e){e.stopAnimation()})}function CK(r,e,t){var a=Ao(\"update\",t,e);a&&r.traverse(function(n){if(n instanceof fr){var i=p3(n);i&&n.animateFrom({style:i},a)}})}function TK(r,e){var t=r.length;if(t!==e.length)return!1;for(var a=0;a<t;a++){var n=r[a],i=e[a];if(n.data.getId(n.dataIndex)!==i.data.getId(i.dataIndex))return!1}return!0}function KL(r,e,t){var a=Ib(r),n=Ib(e);function i(y,m,_,S,w){(_||y)&&m.animateFrom({style:_&&_!==y?V(V({},_.style),y.style):y.style},w)}function o(y){for(var m=0;m<y.length;m++)if(y[m].dim)return y[m].dim}var s=o(a),l=o(n),u=!1;function f(y,m){return function(_){var S=_.data,w=_.dataIndex;if(m)return S.getId(w);var x=_.dataGroupId,b=y?s||l:l||s,C=b&&S.getDimensionInfo(b),T=C&&C.ordinalMeta;if(C){var D=S.get(C.name,w);return T&&T.categories[D]||D+\"\"}var M=S.getRawDataItem(w);return M&&M.groupId?M.groupId+\"\":x||S.getId(w)}}var h=TK(a,n),v={};if(!h)for(var c=0;c<n.length;c++){var d=n[c],p=d.data.getItemGraphicEl(d.dataIndex);p&&(v[p.id]=!0)}function g(y,m){var _=a[m],S=n[y],w=S.data.hostModel,x=_.data.getItemGraphicEl(_.dataIndex),b=S.data.getItemGraphicEl(S.dataIndex);if(x===b){b&&CK(b,S.dataIndex,w);return}x&&v[x.id]||b&&(Ki(b),x?(Ki(x),xd(x),u=!0,_d($n(x),$n(b),S.divide,w,y,i)):Sd(b,w,y))}new xa(a,n,f(!0,h),f(!1,h),null,\"multiple\").update(g).updateManyToOne(function(y,m){var _=n[y],S=_.data,w=S.hostModel,x=S.getItemGraphicEl(_.dataIndex),b=Et(G(m,function(C){return a[C].data.getItemGraphicEl(a[C].dataIndex)}),function(C){return C&&C!==x&&!v[C.id]});x&&(Ki(x),b.length?(A(b,function(C){Ki(C),xd(C)}),u=!0,_d($n(b),$n(x),_.divide,w,y,i)):Sd(x,w,_.dataIndex))}).updateOneToMany(function(y,m){var _=a[m],S=_.data.getItemGraphicEl(_.dataIndex);if(!(S&&v[S.id])){var w=Et(G(y,function(b){return n[b].data.getItemGraphicEl(n[b].dataIndex)}),function(b){return b&&b!==S}),x=n[y[0]].data.hostModel;w.length&&(A(w,function(b){return Ki(b)}),S?(Ki(S),xd(S),u=!0,_d($n(S),$n(w),_.divide,x,y[0],i)):A(w,function(b){return Sd(b,x,y[0])}))}}).updateManyToMany(function(y,m){new xa(m,y,function(_){return a[_].data.getId(a[_].dataIndex)},function(_){return n[_].data.getId(n[_].dataIndex)}).update(function(_,S){g(y[_],m[S])}).execute()}).execute(),u&&A(e,function(y){var m=y.data,_=m.hostModel,S=_&&t.getViewOfSeriesModel(_),w=Ao(\"update\",_,0);S&&_.isAnimationEnabled()&&w&&w.duration>0&&S.group.traverse(function(x){x instanceof mt&&!x.animators.length&&x.animateFrom({style:{opacity:0}},w)})})}function Pb(r){var e=r.getModel(\"universalTransition\").get(\"seriesKey\");return e||r.id}function Rb(r){return F(r)?r.sort().join(\",\"):r}function Fa(r){if(r.hostModel)return r.hostModel.getModel(\"universalTransition\").get(\"divideShape\")}function AK(r,e){var t=q(),a=q(),n=q();return A(r.oldSeries,function(i,o){var s=r.oldDataGroupIds[o],l=r.oldData[o],u=Pb(i),f=Rb(u);a.set(f,{dataGroupId:s,data:l}),F(u)&&A(u,function(h){n.set(h,{key:f,dataGroupId:s,data:l})})}),A(e.updatedSeries,function(i){if(i.isUniversalTransitionEnabled()&&i.isAnimationEnabled()){var o=i.get(\"dataGroupId\"),s=i.getData(),l=Pb(i),u=Rb(l),f=a.get(u);if(f)t.set(u,{oldSeries:[{dataGroupId:f.dataGroupId,divide:Fa(f.data),data:f.data}],newSeries:[{dataGroupId:o,divide:Fa(s),data:s}]});else if(F(l)){var h=[];A(l,function(d){var p=a.get(d);p.data&&h.push({dataGroupId:p.dataGroupId,divide:Fa(p.data),data:p.data})}),h.length&&t.set(u,{oldSeries:h,newSeries:[{dataGroupId:o,data:s,divide:Fa(s)}]})}else{var v=n.get(l);if(v){var c=t.get(v.key);c||(c={oldSeries:[{dataGroupId:v.dataGroupId,data:v.data,divide:Fa(v.data)}],newSeries:[]},t.set(v.key,c)),c.newSeries.push({dataGroupId:o,data:s,divide:Fa(s)})}}}}),t}function Eb(r,e){for(var t=0;t<r.length;t++){var a=e.seriesIndex!=null&&e.seriesIndex===r[t].seriesIndex||e.seriesId!=null&&e.seriesId===r[t].id;if(a)return t}}function DK(r,e,t,a){var n=[],i=[];A(kt(r.from),function(o){var s=Eb(e.oldSeries,o);s>=0&&n.push({dataGroupId:e.oldDataGroupIds[s],data:e.oldData[s],divide:Fa(e.oldData[s]),dim:o.dimension})}),A(kt(r.to),function(o){var s=Eb(t.updatedSeries,o);if(s>=0){var l=t.updatedSeries[s].getData();i.push({dataGroupId:e.oldDataGroupIds[s],data:l,divide:Fa(l),dim:o.dimension})}}),n.length>0&&i.length>0&&KL(n,i,a)}function MK(r){r.registerUpdateLifecycle(\"series:beforeupdate\",function(e,t,a){A(kt(a.seriesTransition),function(n){A(kt(n.to),function(i){for(var o=a.updatedSeries,s=0;s<o.length;s++)(i.seriesIndex!=null&&i.seriesIndex===o[s].seriesIndex||i.seriesId!=null&&i.seriesId===o[s].id)&&(o[s][sf]=!0)})})}),r.registerUpdateLifecycle(\"series:transition\",function(e,t,a){var n=wK(t);if(n.oldSeries&&a.updatedSeries&&a.optionChanged){var i=a.seriesTransition;if(i)A(kt(i),function(c){DK(c,n,a,t)});else{var o=AK(n,a);A(o.keys(),function(c){var d=o.get(c);KL(d.oldSeries,d.newSeries,t)})}A(a.updatedSeries,function(c){c[sf]&&(c[sf]=!1)})}for(var s=e.getSeries(),l=n.oldSeries=[],u=n.oldDataGroupIds=[],f=n.oldData=[],h=0;h<s.length;h++){var v=s[h].getData();v.count()<qL&&(l.push(s[h]),u.push(s[h].get(\"dataGroupId\")),f.push(v))}})}ct([im]);ct([u$]);ct([tD,Q6,hV,QV,pz,u7,F7,A8,tF,XD,_F,b9,K9,uG,LG,BG,tH,fH,bH,PH,$H,LW]);ct(oL);ct(yU);ct(AD);ct(kU);ct(cM);ct(GU);ct(KU);ct(JY);ct(bL);ct(Fl);ct(zZ);ct(AL);ct(rX);ct(vX);ct(SX);ct(MX);ct(kL);ct(uq);ct(BL);ct(NL);ct(Bq);ct(HL);ct(WL);ct(Gq);ct(tK);ct(aK);ct(MK);ct(h6);const kb=r=>r>=80?\"#e45e5e\":r>=70?\"#ff9800\":r>=60?\"#297ff3\":\"#53c31b\",EK=r=>{const e=DB(r.el,void 0,{renderer:\"svg\"}),t=r.unit||\"%\",a={color:[r.numberColor||\"#fff\"],series:[{radius:r.radius||\"70%\",type:\"gauge\",startAngle:90,endAngle:-270,pointer:{show:!1},progress:{show:!0,overlap:!1,roundCap:!0,clip:!1,itemStyle:{borderWidth:0,color:r.progressColor||kb(r.value)}},axisLine:{lineStyle:{width:10,color:[[0,r.progressBackgroundColor||\"#a89d9b\"],[1,r.progressBackgroundColor||\"#a89d9b\"]]}},splitLine:{show:!1,distance:0,length:10},axisTick:{show:!1},axisLabel:{show:!1,distance:50},data:[{value:r.value,name:r.name,title:{offsetCenter:[\"0%\",\"20%\"],color:r.labelColor||\"#fff\",fontSize:r.labelFontSize||12},detail:{valueAnimation:!0,offsetCenter:[\"0%\",\"-10%\"]}}],title:{fontSize:10},detail:{fontSize:r.numberFontSize||20,color:\"inherit\",borderWidth:0,formatter:o=>`${o}${t}`}}]};a&&e.setOption(a);const n=o=>{e.setOption({series:[{progress:{show:!0,overlap:!1,roundCap:!0,clip:!1,itemStyle:{borderWidth:0,color:r.progressColor||kb(o)}},data:[{value:o,name:r.name,title:{offsetCenter:[\"0%\",\"20%\"],color:r.labelColor||\"#fff\",fontSize:r.labelFontSize||12},detail:{valueAnimation:!0,offsetCenter:[\"0%\",\"-10%\"]}}],pointer:{show:!1}}],grid:{left:\"0\",right:\"0\",bottom:\"0%\",top:\"0%\",containLabel:!0}})},i=e.dispose;return{setValue:n,dispose:i}};ct([AL,oL,tD,im,bL,kL]);export{PK as F,EK as G,RK as a,oL as b,tD as c,im as d,bL as e,kL as f,DB as g,AL as i,ct as u};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/index.js",
    "content": "var F1=Object.defineProperty,D1=Object.defineProperties;var O1=Object.getOwnPropertyDescriptors;var Fl=Object.getOwnPropertySymbols;var P1=Object.prototype.hasOwnProperty,N1=Object.prototype.propertyIsEnumerable;var Dl=(e,t,n)=>t in e?F1(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,gt=(e,t)=>{for(var n in t||(t={}))P1.call(t,n)&&Dl(e,n,t[n]);if(Fl)for(var n of Fl(t))N1.call(t,n)&&Dl(e,n,t[n]);return e},fr=(e,t)=>D1(e,O1(t));var Ol=(e,t,n)=>{if(!t.has(e))throw TypeError(\"Cannot \"+n)};var po=(e,t,n)=>(Ol(e,t,\"read from private field\"),n?n.call(e):t.get(e)),Pl=(e,t,n)=>{if(t.has(e))throw TypeError(\"Cannot add the same private member more than once\");t instanceof WeakSet?t.add(e):t.set(e,n)},Nl=(e,t,n,s)=>(Ol(e,t,\"write to private field\"),s?s.call(e,n):t.set(e,n),n);var te=(e,t,n)=>new Promise((s,r)=>{var a=l=>{try{i(n.next(l))}catch(u){r(u)}},o=l=>{try{i(n.throw(l))}catch(u){r(u)}},i=l=>l.done?s(l.value):Promise.resolve(l.value).then(a,o);i((n=n.apply(e,t)).next())});const I1=function(){const t=document.createElement(\"link\").relList;if(t&&t.supports&&t.supports(\"modulepreload\"))return;for(const r of document.querySelectorAll('link[rel=\"modulepreload\"]'))s(r);new MutationObserver(r=>{for(const a of r)if(a.type===\"childList\")for(const o of a.addedNodes)o.tagName===\"LINK\"&&o.rel===\"modulepreload\"&&s(o)}).observe(document,{childList:!0,subtree:!0});function n(r){const a={};return r.integrity&&(a.integrity=r.integrity),r.referrerpolicy&&(a.referrerPolicy=r.referrerpolicy),r.crossorigin===\"use-credentials\"?a.credentials=\"include\":r.crossorigin===\"anonymous\"?a.credentials=\"omit\":a.credentials=\"same-origin\",a}function s(r){if(r.ep)return;r.ep=!0;const a=n(r);fetch(r.href,a)}};I1();function gi(e,t){const n=Object.create(null),s=e.split(\",\");for(let r=0;r<s.length;r++)n[s[r]]=!0;return t?r=>!!n[r.toLowerCase()]:r=>!!n[r]}const Ve={},Bs=[],rn=()=>{},A1=()=>!1,L1=/^on[^a-z]/,La=e=>L1.test(e),vi=e=>e.startsWith(\"onUpdate:\"),ot=Object.assign,yi=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},M1=Object.prototype.hasOwnProperty,Ne=(e,t)=>M1.call(e,t),ne=Array.isArray,Us=e=>zr(e)===\"[object Map]\",er=e=>zr(e)===\"[object Set]\",Il=e=>zr(e)===\"[object Date]\",ye=e=>typeof e==\"function\",et=e=>typeof e==\"string\",Ir=e=>typeof e==\"symbol\",Ye=e=>e!==null&&typeof e==\"object\",bi=e=>Ye(e)&&ye(e.then)&&ye(e.catch),Tc=Object.prototype.toString,zr=e=>Tc.call(e),x1=e=>zr(e).slice(8,-1),Fc=e=>zr(e)===\"[object Object]\",Ei=e=>et(e)&&e!==\"NaN\"&&e[0]!==\"-\"&&\"\"+parseInt(e,10)===e,ha=gi(\",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"),Ma=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},$1=/-(\\w)/g,gn=Ma(e=>e.replace($1,(t,n)=>n?n.toUpperCase():\"\")),R1=/\\B([A-Z])/g,tr=Ma(e=>e.replace(R1,\"-$1\").toLowerCase()),xa=Ma(e=>e.charAt(0).toUpperCase()+e.slice(1)),mo=Ma(e=>e?`on${xa(e)}`:\"\"),Ar=(e,t)=>!Object.is(e,t),_a=(e,t)=>{for(let n=0;n<e.length;n++)e[n](t)},ba=(e,t,n)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Ea=e=>{const t=parseFloat(e);return isNaN(t)?e:t},Dc=e=>{const t=et(e)?Number(e):NaN;return isNaN(t)?e:t};let Al;const Io=()=>Al||(Al=typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:typeof window!=\"undefined\"?window:typeof global!=\"undefined\"?global:{});function Ts(e){if(ne(e)){const t={};for(let n=0;n<e.length;n++){const s=e[n],r=et(s)?H1(s):Ts(s);if(r)for(const a in r)t[a]=r[a]}return t}else{if(et(e))return e;if(Ye(e))return e}}const B1=/;(?![^(]*\\))/g,U1=/:([^]+)/,Y1=/\\/\\*[^]*?\\*\\//g;function H1(e){const t={};return e.replace(Y1,\"\").split(B1).forEach(n=>{if(n){const s=n.split(U1);s.length>1&&(t[s[0].trim()]=s[1].trim())}}),t}function _t(e){let t=\"\";if(et(e))t=e;else if(ne(e))for(let n=0;n<e.length;n++){const s=_t(e[n]);s&&(t+=s+\" \")}else if(Ye(e))for(const n in e)e[n]&&(t+=n+\" \");return t.trim()}function Fw(e){if(!e)return null;let{class:t,style:n}=e;return t&&!et(t)&&(e.class=_t(t)),n&&(e.style=Ts(n)),e}const W1=\"itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly\",V1=gi(W1);function Oc(e){return!!e||e===\"\"}function j1(e,t){if(e.length!==t.length)return!1;let n=!0;for(let s=0;n&&s<e.length;s++)n=Cs(e[s],t[s]);return n}function Cs(e,t){if(e===t)return!0;let n=Il(e),s=Il(t);if(n||s)return n&&s?e.getTime()===t.getTime():!1;if(n=Ir(e),s=Ir(t),n||s)return e===t;if(n=ne(e),s=ne(t),n||s)return n&&s?j1(e,t):!1;if(n=Ye(e),s=Ye(t),n||s){if(!n||!s)return!1;const r=Object.keys(e).length,a=Object.keys(t).length;if(r!==a)return!1;for(const o in e){const i=e.hasOwnProperty(o),l=t.hasOwnProperty(o);if(i&&!l||!i&&l||!Cs(e[o],t[o]))return!1}}return String(e)===String(t)}function ki(e,t){return e.findIndex(n=>Cs(n,t))}const X=e=>et(e)?e:e==null?\"\":ne(e)||Ye(e)&&(e.toString===Tc||!ye(e.toString))?JSON.stringify(e,Pc,2):String(e),Pc=(e,t)=>t&&t.__v_isRef?Pc(e,t.value):Us(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[s,r])=>(n[`${s} =>`]=r,n),{})}:er(t)?{[`Set(${t.size})`]:[...t.values()]}:Ye(t)&&!ne(t)&&!Fc(t)?String(t):t;let Bt;class Nc{constructor(t=!1){this.detached=t,this._active=!0,this.effects=[],this.cleanups=[],this.parent=Bt,!t&&Bt&&(this.index=(Bt.scopes||(Bt.scopes=[])).push(this)-1)}get active(){return this._active}run(t){if(this._active){const n=Bt;try{return Bt=this,t()}finally{Bt=n}}}on(){Bt=this}off(){Bt=this.parent}stop(t){if(this._active){let n,s;for(n=0,s=this.effects.length;n<s;n++)this.effects[n].stop();for(n=0,s=this.cleanups.length;n<s;n++)this.cleanups[n]();if(this.scopes)for(n=0,s=this.scopes.length;n<s;n++)this.scopes[n].stop(!0);if(!this.detached&&this.parent&&!t){const r=this.parent.scopes.pop();r&&r!==this&&(this.parent.scopes[this.index]=r,r.index=this.index)}this.parent=void 0,this._active=!1}}}function wi(e){return new Nc(e)}function G1(e,t=Bt){t&&t.active&&t.effects.push(e)}function Ic(){return Bt}function z1(e){Bt&&Bt.cleanups.push(e)}const Si=e=>{const t=new Set(e);return t.w=0,t.n=0,t},Ac=e=>(e.w&ns)>0,Lc=e=>(e.n&ns)>0,K1=({deps:e})=>{if(e.length)for(let t=0;t<e.length;t++)e[t].w|=ns},q1=e=>{const{deps:t}=e;if(t.length){let n=0;for(let s=0;s<t.length;s++){const r=t[s];Ac(r)&&!Lc(r)?r.delete(e):t[n++]=r,r.w&=~ns,r.n&=~ns}t.length=n}},ka=new WeakMap;let br=0,ns=1;const Ao=30;let tn;const ws=Symbol(\"\"),Lo=Symbol(\"\");class Ci{constructor(t,n=null,s){this.fn=t,this.scheduler=n,this.active=!0,this.deps=[],this.parent=void 0,G1(this,s)}run(){if(!this.active)return this.fn();let t=tn,n=qn;for(;t;){if(t===this)return;t=t.parent}try{return this.parent=tn,tn=this,qn=!0,ns=1<<++br,br<=Ao?K1(this):Ll(this),this.fn()}finally{br<=Ao&&q1(this),ns=1<<--br,tn=this.parent,qn=n,this.parent=void 0,this.deferStop&&this.stop()}}stop(){tn===this?this.deferStop=!0:this.active&&(Ll(this),this.onStop&&this.onStop(),this.active=!1)}}function Ll(e){const{deps:t}=e;if(t.length){for(let n=0;n<t.length;n++)t[n].delete(e);t.length=0}}let qn=!0;const Mc=[];function nr(){Mc.push(qn),qn=!1}function sr(){const e=Mc.pop();qn=e===void 0?!0:e}function Mt(e,t,n){if(qn&&tn){let s=ka.get(e);s||ka.set(e,s=new Map);let r=s.get(n);r||s.set(n,r=Si()),xc(r)}}function xc(e,t){let n=!1;br<=Ao?Lc(e)||(e.n|=ns,n=!Ac(e)):n=!e.has(tn),n&&(e.add(tn),tn.deps.push(e))}function Nn(e,t,n,s,r,a){const o=ka.get(e);if(!o)return;let i=[];if(t===\"clear\")i=[...o.values()];else if(n===\"length\"&&ne(e)){const l=Number(s);o.forEach((u,c)=>{(c===\"length\"||c>=l)&&i.push(u)})}else switch(n!==void 0&&i.push(o.get(n)),t){case\"add\":ne(e)?Ei(n)&&i.push(o.get(\"length\")):(i.push(o.get(ws)),Us(e)&&i.push(o.get(Lo)));break;case\"delete\":ne(e)||(i.push(o.get(ws)),Us(e)&&i.push(o.get(Lo)));break;case\"set\":Us(e)&&i.push(o.get(ws));break}if(i.length===1)i[0]&&Mo(i[0]);else{const l=[];for(const u of i)u&&l.push(...u);Mo(Si(l))}}function Mo(e,t){const n=ne(e)?e:[...e];for(const s of n)s.computed&&Ml(s);for(const s of n)s.computed||Ml(s)}function Ml(e,t){(e!==tn||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}function J1(e,t){var n;return(n=ka.get(e))==null?void 0:n.get(t)}const X1=gi(\"__proto__,__v_isRef,__isVue\"),$c=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!==\"arguments\"&&e!==\"caller\").map(e=>Symbol[e]).filter(Ir)),Z1=Ti(),Q1=Ti(!1,!0),e0=Ti(!0),xl=t0();function t0(){const e={};return[\"includes\",\"indexOf\",\"lastIndexOf\"].forEach(t=>{e[t]=function(...n){const s=De(this);for(let a=0,o=this.length;a<o;a++)Mt(s,\"get\",a+\"\");const r=s[t](...n);return r===-1||r===!1?s[t](...n.map(De)):r}}),[\"push\",\"pop\",\"shift\",\"unshift\",\"splice\"].forEach(t=>{e[t]=function(...n){nr();const s=De(this)[t].apply(this,n);return sr(),s}}),e}function n0(e){const t=De(this);return Mt(t,\"has\",e),t.hasOwnProperty(e)}function Ti(e=!1,t=!1){return function(s,r,a){if(r===\"__v_isReactive\")return!e;if(r===\"__v_isReadonly\")return e;if(r===\"__v_isShallow\")return t;if(r===\"__v_raw\"&&a===(e?t?v0:Hc:t?Yc:Uc).get(s))return s;const o=ne(s);if(!e){if(o&&Ne(xl,r))return Reflect.get(xl,r,a);if(r===\"hasOwnProperty\")return n0}const i=Reflect.get(s,r,a);return(Ir(r)?$c.has(r):X1(r))||(e||Mt(s,\"get\",r),t)?i:je(i)?o&&Ei(r)?i:i.value:Ye(i)?e?Vc(i):wt(i):i}}const s0=Rc(),r0=Rc(!0);function Rc(e=!1){return function(n,s,r,a){let o=n[s];if(zs(o)&&je(o)&&!je(r))return!1;if(!e&&(!wa(r)&&!zs(r)&&(o=De(o),r=De(r)),!ne(n)&&je(o)&&!je(r)))return o.value=r,!0;const i=ne(n)&&Ei(s)?Number(s)<n.length:Ne(n,s),l=Reflect.set(n,s,r,a);return n===De(a)&&(i?Ar(r,o)&&Nn(n,\"set\",s,r):Nn(n,\"add\",s,r)),l}}function a0(e,t){const n=Ne(e,t);e[t];const s=Reflect.deleteProperty(e,t);return s&&n&&Nn(e,\"delete\",t,void 0),s}function o0(e,t){const n=Reflect.has(e,t);return(!Ir(t)||!$c.has(t))&&Mt(e,\"has\",t),n}function i0(e){return Mt(e,\"iterate\",ne(e)?\"length\":ws),Reflect.ownKeys(e)}const Bc={get:Z1,set:s0,deleteProperty:a0,has:o0,ownKeys:i0},l0={get:e0,set(e,t){return!0},deleteProperty(e,t){return!0}},u0=ot({},Bc,{get:Q1,set:r0}),Fi=e=>e,$a=e=>Reflect.getPrototypeOf(e);function na(e,t,n=!1,s=!1){e=e.__v_raw;const r=De(e),a=De(t);n||(t!==a&&Mt(r,\"get\",t),Mt(r,\"get\",a));const{has:o}=$a(r),i=s?Fi:n?Pi:Lr;if(o.call(r,t))return i(e.get(t));if(o.call(r,a))return i(e.get(a));e!==r&&e.get(t)}function sa(e,t=!1){const n=this.__v_raw,s=De(n),r=De(e);return t||(e!==r&&Mt(s,\"has\",e),Mt(s,\"has\",r)),e===r?n.has(e):n.has(e)||n.has(r)}function ra(e,t=!1){return e=e.__v_raw,!t&&Mt(De(e),\"iterate\",ws),Reflect.get(e,\"size\",e)}function $l(e){e=De(e);const t=De(this);return $a(t).has.call(t,e)||(t.add(e),Nn(t,\"add\",e,e)),this}function Rl(e,t){t=De(t);const n=De(this),{has:s,get:r}=$a(n);let a=s.call(n,e);a||(e=De(e),a=s.call(n,e));const o=r.call(n,e);return n.set(e,t),a?Ar(t,o)&&Nn(n,\"set\",e,t):Nn(n,\"add\",e,t),this}function Bl(e){const t=De(this),{has:n,get:s}=$a(t);let r=n.call(t,e);r||(e=De(e),r=n.call(t,e)),s&&s.call(t,e);const a=t.delete(e);return r&&Nn(t,\"delete\",e,void 0),a}function Ul(){const e=De(this),t=e.size!==0,n=e.clear();return t&&Nn(e,\"clear\",void 0,void 0),n}function aa(e,t){return function(s,r){const a=this,o=a.__v_raw,i=De(o),l=t?Fi:e?Pi:Lr;return!e&&Mt(i,\"iterate\",ws),o.forEach((u,c)=>s.call(r,l(u),l(c),a))}}function oa(e,t,n){return function(...s){const r=this.__v_raw,a=De(r),o=Us(a),i=e===\"entries\"||e===Symbol.iterator&&o,l=e===\"keys\"&&o,u=r[e](...s),c=n?Fi:t?Pi:Lr;return!t&&Mt(a,\"iterate\",l?Lo:ws),{next(){const{value:_,done:p}=u.next();return p?{value:_,done:p}:{value:i?[c(_[0]),c(_[1])]:c(_),done:p}},[Symbol.iterator](){return this}}}}function $n(e){return function(...t){return e===\"delete\"?!1:this}}function c0(){const e={get(a){return na(this,a)},get size(){return ra(this)},has:sa,add:$l,set:Rl,delete:Bl,clear:Ul,forEach:aa(!1,!1)},t={get(a){return na(this,a,!1,!0)},get size(){return ra(this)},has:sa,add:$l,set:Rl,delete:Bl,clear:Ul,forEach:aa(!1,!0)},n={get(a){return na(this,a,!0)},get size(){return ra(this,!0)},has(a){return sa.call(this,a,!0)},add:$n(\"add\"),set:$n(\"set\"),delete:$n(\"delete\"),clear:$n(\"clear\"),forEach:aa(!0,!1)},s={get(a){return na(this,a,!0,!0)},get size(){return ra(this,!0)},has(a){return sa.call(this,a,!0)},add:$n(\"add\"),set:$n(\"set\"),delete:$n(\"delete\"),clear:$n(\"clear\"),forEach:aa(!0,!0)};return[\"keys\",\"values\",\"entries\",Symbol.iterator].forEach(a=>{e[a]=oa(a,!1,!1),n[a]=oa(a,!0,!1),t[a]=oa(a,!1,!0),s[a]=oa(a,!0,!0)}),[e,n,t,s]}const[d0,f0,h0,_0]=c0();function Di(e,t){const n=t?e?_0:h0:e?f0:d0;return(s,r,a)=>r===\"__v_isReactive\"?!e:r===\"__v_isReadonly\"?e:r===\"__v_raw\"?s:Reflect.get(Ne(n,r)&&r in s?n:s,r,a)}const p0={get:Di(!1,!1)},m0={get:Di(!1,!0)},g0={get:Di(!0,!1)},Uc=new WeakMap,Yc=new WeakMap,Hc=new WeakMap,v0=new WeakMap;function y0(e){switch(e){case\"Object\":case\"Array\":return 1;case\"Map\":case\"Set\":case\"WeakMap\":case\"WeakSet\":return 2;default:return 0}}function b0(e){return e.__v_skip||!Object.isExtensible(e)?0:y0(x1(e))}function wt(e){return zs(e)?e:Oi(e,!1,Bc,p0,Uc)}function Wc(e){return Oi(e,!1,u0,m0,Yc)}function Vc(e){return Oi(e,!0,l0,g0,Hc)}function Oi(e,t,n,s,r){if(!Ye(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const a=r.get(e);if(a)return a;const o=b0(e);if(o===0)return e;const i=new Proxy(e,o===2?s:n);return r.set(e,i),i}function Jn(e){return zs(e)?Jn(e.__v_raw):!!(e&&e.__v_isReactive)}function zs(e){return!!(e&&e.__v_isReadonly)}function wa(e){return!!(e&&e.__v_isShallow)}function jc(e){return Jn(e)||zs(e)}function De(e){const t=e&&e.__v_raw;return t?De(t):e}function Ra(e){return ba(e,\"__v_skip\",!0),e}const Lr=e=>Ye(e)?wt(e):e,Pi=e=>Ye(e)?Vc(e):e;function Gc(e){qn&&tn&&(e=De(e),xc(e.dep||(e.dep=Si())))}function zc(e,t){e=De(e);const n=e.dep;n&&Mo(n)}function je(e){return!!(e&&e.__v_isRef===!0)}function le(e){return qc(e,!1)}function Kc(e){return qc(e,!0)}function qc(e,t){return je(e)?e:new E0(e,t)}class E0{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:De(t),this._value=n?t:Lr(t)}get value(){return Gc(this),this._value}set value(t){const n=this.__v_isShallow||wa(t)||zs(t);t=n?t:De(t),Ar(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Lr(t),zc(this))}}function J(e){return je(e)?e.value:e}const k0={get:(e,t,n)=>J(Reflect.get(e,t,n)),set:(e,t,n,s)=>{const r=e[t];return je(r)&&!je(n)?(r.value=n,!0):Reflect.set(e,t,n,s)}};function Jc(e){return Jn(e)?e:new Proxy(e,k0)}function w0(e){const t=ne(e)?new Array(e.length):{};for(const n in e)t[n]=C0(e,n);return t}class S0{constructor(t,n,s){this._object=t,this._key=n,this._defaultValue=s,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}get dep(){return J1(De(this._object),this._key)}}function C0(e,t,n){const s=e[t];return je(s)?s:new S0(e,t,n)}class T0{constructor(t,n,s,r){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this.__v_isReadonly=!1,this._dirty=!0,this.effect=new Ci(t,()=>{this._dirty||(this._dirty=!0,zc(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!r,this.__v_isReadonly=s}get value(){const t=De(this);return Gc(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function F0(e,t,n=!1){let s,r;const a=ye(e);return a?(s=e,r=rn):(s=e.get,r=e.set),new T0(s,r,a||!r,n)}function Xn(e,t,n,s){let r;try{r=s?e(...s):e()}catch(a){Kr(a,t,n)}return r}function qt(e,t,n,s){if(ye(e)){const a=Xn(e,t,n,s);return a&&bi(a)&&a.catch(o=>{Kr(o,t,n)}),a}const r=[];for(let a=0;a<e.length;a++)r.push(qt(e[a],t,n,s));return r}function Kr(e,t,n,s=!0){const r=t?t.vnode:null;if(t){let a=t.parent;const o=t.proxy,i=n;for(;a;){const u=a.ec;if(u){for(let c=0;c<u.length;c++)if(u[c](e,o,i)===!1)return}a=a.parent}const l=t.appContext.config.errorHandler;if(l){Xn(l,null,10,[e,o,i]);return}}D0(e,n,r,s)}function D0(e,t,n,s=!0){console.error(e)}let Mr=!1,xo=!1;const bt=[];let _n=0;const Ys=[];let Sn=null,vs=0;const Xc=Promise.resolve();let Ni=null;function Ii(e){const t=Ni||Xc;return e?t.then(this?e.bind(this):e):t}function O0(e){let t=_n+1,n=bt.length;for(;t<n;){const s=t+n>>>1;xr(bt[s])<e?t=s+1:n=s}return t}function Ai(e){(!bt.length||!bt.includes(e,Mr&&e.allowRecurse?_n+1:_n))&&(e.id==null?bt.push(e):bt.splice(O0(e.id),0,e),Zc())}function Zc(){!Mr&&!xo&&(xo=!0,Ni=Xc.then(td))}function P0(e){const t=bt.indexOf(e);t>_n&&bt.splice(t,1)}function Qc(e){ne(e)?Ys.push(...e):(!Sn||!Sn.includes(e,e.allowRecurse?vs+1:vs))&&Ys.push(e),Zc()}function Yl(e,t=Mr?_n+1:0){for(;t<bt.length;t++){const n=bt[t];n&&n.pre&&(bt.splice(t,1),t--,n())}}function ed(e){if(Ys.length){const t=[...new Set(Ys)];if(Ys.length=0,Sn){Sn.push(...t);return}for(Sn=t,Sn.sort((n,s)=>xr(n)-xr(s)),vs=0;vs<Sn.length;vs++)Sn[vs]();Sn=null,vs=0}}const xr=e=>e.id==null?1/0:e.id,N0=(e,t)=>{const n=xr(e)-xr(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function td(e){xo=!1,Mr=!0,bt.sort(N0);const t=rn;try{for(_n=0;_n<bt.length;_n++){const n=bt[_n];n&&n.active!==!1&&Xn(n,null,14)}}finally{_n=0,bt.length=0,ed(),Mr=!1,Ni=null,(bt.length||Ys.length)&&td()}}function I0(e,t,...n){if(e.isUnmounted)return;const s=e.vnode.props||Ve;let r=n;const a=t.startsWith(\"update:\"),o=a&&t.slice(7);if(o&&o in s){const c=`${o===\"modelValue\"?\"model\":o}Modifiers`,{number:_,trim:p}=s[c]||Ve;p&&(r=n.map(y=>et(y)?y.trim():y)),_&&(r=n.map(Ea))}let i,l=s[i=mo(t)]||s[i=mo(gn(t))];!l&&a&&(l=s[i=mo(tr(t))]),l&&qt(l,e,6,r);const u=s[i+\"Once\"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[i])return;e.emitted[i]=!0,qt(u,e,6,r)}}function nd(e,t,n=!1){const s=t.emitsCache,r=s.get(e);if(r!==void 0)return r;const a=e.emits;let o={},i=!1;if(!ye(e)){const l=u=>{const c=nd(u,t,!0);c&&(i=!0,ot(o,c))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!a&&!i?(Ye(e)&&s.set(e,null),null):(ne(a)?a.forEach(l=>o[l]=null):ot(o,a),Ye(e)&&s.set(e,o),o)}function Ba(e,t){return!e||!La(t)?!1:(t=t.slice(2).replace(/Once$/,\"\"),Ne(e,t[0].toLowerCase()+t.slice(1))||Ne(e,tr(t))||Ne(e,t))}let pt=null,Ua=null;function Sa(e){const t=pt;return pt=e,Ua=e&&e.type.__scopeId||null,t}function nt(e){Ua=e}function st(){Ua=null}function Ue(e,t=pt,n){if(!t||e._n)return e;const s=(...r)=>{s._d&&eu(-1);const a=Sa(t);let o;try{o=e(...r)}finally{Sa(a),s._d&&eu(1)}return o};return s._n=!0,s._c=!0,s._d=!0,s}function go(e){const{type:t,vnode:n,proxy:s,withProxy:r,props:a,propsOptions:[o],slots:i,attrs:l,emit:u,render:c,renderCache:_,data:p,setupState:y,ctx:E,inheritAttrs:k}=e;let S,m;const w=Sa(e);try{if(n.shapeFlag&4){const b=r||s;S=Qt(c.call(b,b,_,a,y,p,E)),m=l}else{const b=t;S=Qt(b.length>1?b(a,{attrs:l,slots:i,emit:u}):b(a,null)),m=t.props?l:L0(l)}}catch(b){Sr.length=0,Kr(b,e,1),S=Ie(Lt)}let P=S;if(m&&k!==!1){const b=Object.keys(m),{shapeFlag:D}=P;b.length&&D&7&&(o&&b.some(vi)&&(m=M0(m,o)),P=ss(P,m))}return n.dirs&&(P=ss(P),P.dirs=P.dirs?P.dirs.concat(n.dirs):n.dirs),n.transition&&(P.transition=n.transition),S=P,Sa(w),S}function A0(e){let t;for(let n=0;n<e.length;n++){const s=e[n];if(Br(s)){if(s.type!==Lt||s.children===\"v-if\"){if(t)return;t=s}}else return}return t}const L0=e=>{let t;for(const n in e)(n===\"class\"||n===\"style\"||La(n))&&((t||(t={}))[n]=e[n]);return t},M0=(e,t)=>{const n={};for(const s in e)(!vi(s)||!(s.slice(9)in t))&&(n[s]=e[s]);return n};function x0(e,t,n){const{props:s,children:r,component:a}=e,{props:o,children:i,patchFlag:l}=t,u=a.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return s?Hl(s,o,u):!!o;if(l&8){const c=t.dynamicProps;for(let _=0;_<c.length;_++){const p=c[_];if(o[p]!==s[p]&&!Ba(u,p))return!0}}}else return(r||i)&&(!i||!i.$stable)?!0:s===o?!1:s?o?Hl(s,o,u):!0:!!o;return!1}function Hl(e,t,n){const s=Object.keys(t);if(s.length!==Object.keys(e).length)return!0;for(let r=0;r<s.length;r++){const a=s[r];if(t[a]!==e[a]&&!Ba(n,a))return!0}return!1}function Li({vnode:e,parent:t},n){for(;t&&t.subTree===e;)(e=t.vnode).el=n,t=t.parent}const $0=e=>e.__isSuspense,R0={name:\"Suspense\",__isSuspense:!0,process(e,t,n,s,r,a,o,i,l,u){e==null?B0(t,n,s,r,a,o,i,l,u):U0(e,t,n,s,r,o,i,l,u)},hydrate:Y0,create:Mi,normalize:H0},sd=R0;function $r(e,t){const n=e.props&&e.props[t];ye(n)&&n()}function B0(e,t,n,s,r,a,o,i,l){const{p:u,o:{createElement:c}}=l,_=c(\"div\"),p=e.suspense=Mi(e,r,s,t,_,n,a,o,i,l);u(null,p.pendingBranch=e.ssContent,_,null,s,p,a,o),p.deps>0?($r(e,\"onPending\"),$r(e,\"onFallback\"),u(null,e.ssFallback,t,n,s,null,a,o),Hs(p,e.ssFallback)):p.resolve(!1,!0)}function U0(e,t,n,s,r,a,o,i,{p:l,um:u,o:{createElement:c}}){const _=t.suspense=e.suspense;_.vnode=t,t.el=e.el;const p=t.ssContent,y=t.ssFallback,{activeBranch:E,pendingBranch:k,isInFallback:S,isHydrating:m}=_;if(k)_.pendingBranch=p,pn(p,k)?(l(k,p,_.hiddenContainer,null,r,_,a,o,i),_.deps<=0?_.resolve():S&&(l(E,y,n,s,r,null,a,o,i),Hs(_,y))):(_.pendingId++,m?(_.isHydrating=!1,_.activeBranch=k):u(k,r,_),_.deps=0,_.effects.length=0,_.hiddenContainer=c(\"div\"),S?(l(null,p,_.hiddenContainer,null,r,_,a,o,i),_.deps<=0?_.resolve():(l(E,y,n,s,r,null,a,o,i),Hs(_,y))):E&&pn(p,E)?(l(E,p,n,s,r,_,a,o,i),_.resolve(!0)):(l(null,p,_.hiddenContainer,null,r,_,a,o,i),_.deps<=0&&_.resolve()));else if(E&&pn(p,E))l(E,p,n,s,r,_,a,o,i),Hs(_,p);else if($r(t,\"onPending\"),_.pendingBranch=p,_.pendingId++,l(null,p,_.hiddenContainer,null,r,_,a,o,i),_.deps<=0)_.resolve();else{const{timeout:w,pendingId:P}=_;w>0?setTimeout(()=>{_.pendingId===P&&_.fallback(y)},w):w===0&&_.fallback(y)}}function Mi(e,t,n,s,r,a,o,i,l,u,c=!1){const{p:_,m:p,um:y,n:E,o:{parentNode:k,remove:S}}=u;let m;const w=V0(e);w&&t!=null&&t.pendingBranch&&(m=t.pendingId,t.deps++);const P=e.props?Dc(e.props.timeout):void 0,b={vnode:e,parent:t,parentComponent:n,isSVG:o,container:s,hiddenContainer:r,anchor:a,deps:0,pendingId:0,timeout:typeof P==\"number\"?P:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:c,isUnmounted:!1,effects:[],resolve(D=!1,I=!1){const{vnode:V,activeBranch:M,pendingBranch:U,pendingId:ee,effects:_e,parentComponent:H,container:ie}=b;if(b.isHydrating)b.isHydrating=!1;else if(!D){const de=M&&U.transition&&U.transition.mode===\"out-in\";de&&(M.transition.afterLeave=()=>{ee===b.pendingId&&p(U,ie,we,0)});let{anchor:we}=b;M&&(we=E(M),y(M,H,b,!0)),de||p(U,ie,we,0)}Hs(b,U),b.pendingBranch=null,b.isInFallback=!1;let Me=b.parent,qe=!1;for(;Me;){if(Me.pendingBranch){Me.effects.push(..._e),qe=!0;break}Me=Me.parent}qe||Qc(_e),b.effects=[],w&&t&&t.pendingBranch&&m===t.pendingId&&(t.deps--,t.deps===0&&!I&&t.resolve()),$r(V,\"onResolve\")},fallback(D){if(!b.pendingBranch)return;const{vnode:I,activeBranch:V,parentComponent:M,container:U,isSVG:ee}=b;$r(I,\"onFallback\");const _e=E(V),H=()=>{!b.isInFallback||(_(null,D,U,_e,M,null,ee,i,l),Hs(b,D))},ie=D.transition&&D.transition.mode===\"out-in\";ie&&(V.transition.afterLeave=H),b.isInFallback=!0,y(V,M,null,!0),ie||H()},move(D,I,V){b.activeBranch&&p(b.activeBranch,D,I,V),b.container=D},next(){return b.activeBranch&&E(b.activeBranch)},registerDep(D,I){const V=!!b.pendingBranch;V&&b.deps++;const M=D.vnode.el;D.asyncDep.catch(U=>{Kr(U,D,0)}).then(U=>{if(D.isUnmounted||b.isUnmounted||b.pendingId!==D.suspenseId)return;D.asyncResolved=!0;const{vnode:ee}=D;Vo(D,U,!1),M&&(ee.el=M);const _e=!M&&D.subTree.el;I(D,ee,k(M||D.subTree.el),M?null:E(D.subTree),b,o,l),_e&&S(_e),Li(D,ee.el),V&&--b.deps===0&&b.resolve()})},unmount(D,I){b.isUnmounted=!0,b.activeBranch&&y(b.activeBranch,n,D,I),b.pendingBranch&&y(b.pendingBranch,n,D,I)}};return b}function Y0(e,t,n,s,r,a,o,i,l){const u=t.suspense=Mi(t,s,n,e.parentNode,document.createElement(\"div\"),null,r,a,o,i,!0),c=l(e,u.pendingBranch=t.ssContent,n,u,a,o);return u.deps===0&&u.resolve(!1,!0),c}function H0(e){const{shapeFlag:t,children:n}=e,s=t&32;e.ssContent=Wl(s?n.default:n),e.ssFallback=s?Wl(n.fallback):Ie(Lt)}function Wl(e){let t;if(ye(e)){const n=Ks&&e._c;n&&(e._d=!1,C()),e=e(),n&&(e._d=!0,t=Kt,wd())}return ne(e)&&(e=A0(e)),e=Qt(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function W0(e,t){t&&t.pendingBranch?ne(e)?t.effects.push(...e):t.effects.push(e):Qc(e)}function Hs(e,t){e.activeBranch=t;const{vnode:n,parentComponent:s}=e,r=n.el=t.el;s&&s.subTree===n&&(s.vnode.el=r,Li(s,r))}function V0(e){var t;return((t=e.props)==null?void 0:t.suspensible)!=null&&e.props.suspensible!==!1}const ia={};function Zn(e,t,n){return rd(e,t,n)}function rd(e,t,{immediate:n,deep:s,flush:r,onTrack:a,onTrigger:o}=Ve){var i;const l=Ic()===((i=lt)==null?void 0:i.scope)?lt:null;let u,c=!1,_=!1;if(je(e)?(u=()=>e.value,c=wa(e)):Jn(e)?(u=()=>e,s=!0):ne(e)?(_=!0,c=e.some(b=>Jn(b)||wa(b)),u=()=>e.map(b=>{if(je(b))return b.value;if(Jn(b))return bs(b);if(ye(b))return Xn(b,l,2)})):ye(e)?t?u=()=>Xn(e,l,2):u=()=>{if(!(l&&l.isUnmounted))return p&&p(),qt(e,l,3,[y])}:u=rn,t&&s){const b=u;u=()=>bs(b())}let p,y=b=>{p=w.onStop=()=>{Xn(b,l,4)}},E;if(Ur)if(y=rn,t?n&&qt(t,l,3,[u(),_?[]:void 0,y]):u(),r===\"sync\"){const b=x3();E=b.__watcherHandles||(b.__watcherHandles=[])}else return rn;let k=_?new Array(e.length).fill(ia):ia;const S=()=>{if(!!w.active)if(t){const b=w.run();(s||c||(_?b.some((D,I)=>Ar(D,k[I])):Ar(b,k)))&&(p&&p(),qt(t,l,3,[b,k===ia?void 0:_&&k[0]===ia?[]:k,y]),k=b)}else w.run()};S.allowRecurse=!!t;let m;r===\"sync\"?m=S:r===\"post\"?m=()=>Pt(S,l&&l.suspense):(S.pre=!0,l&&(S.id=l.uid),m=()=>Ai(S));const w=new Ci(u,m);t?n?S():k=w.run():r===\"post\"?Pt(w.run.bind(w),l&&l.suspense):w.run();const P=()=>{w.stop(),l&&l.scope&&yi(l.scope.effects,w)};return E&&E.push(P),P}function j0(e,t,n){const s=this.proxy,r=et(e)?e.includes(\".\")?ad(s,e):()=>s[e]:e.bind(s,s);let a;ye(t)?a=t:(a=t.handler,n=t);const o=lt;rs(this);const i=rd(r,a.bind(s),n);return o?rs(o):Qn(),i}function ad(e,t){const n=t.split(\".\");return()=>{let s=e;for(let r=0;r<n.length&&s;r++)s=s[n[r]];return s}}function bs(e,t){if(!Ye(e)||e.__v_skip||(t=t||new Set,t.has(e)))return e;if(t.add(e),je(e))bs(e.value,t);else if(ne(e))for(let n=0;n<e.length;n++)bs(e[n],t);else if(er(e)||Us(e))e.forEach(n=>{bs(n,t)});else if(Fc(e))for(const n in e)bs(e[n],t);return e}function Xe(e,t){const n=pt;if(n===null)return e;const s=Va(n)||n.proxy,r=e.dirs||(e.dirs=[]);for(let a=0;a<t.length;a++){let[o,i,l,u=Ve]=t[a];o&&(ye(o)&&(o={mounted:o,updated:o}),o.deep&&bs(i),r.push({dir:o,instance:s,value:i,oldValue:void 0,arg:l,modifiers:u}))}return e}function hs(e,t,n,s){const r=e.dirs,a=t&&t.dirs;for(let o=0;o<r.length;o++){const i=r[o];a&&(i.oldValue=a[o].value);let l=i.dir[s];l&&(nr(),qt(l,n,8,[e.el,i,e,t]),sr())}}function G0(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return is(()=>{e.isMounted=!0}),dd(()=>{e.isUnmounting=!0}),e}const Gt=[Function,Array],od={mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Gt,onEnter:Gt,onAfterEnter:Gt,onEnterCancelled:Gt,onBeforeLeave:Gt,onLeave:Gt,onAfterLeave:Gt,onLeaveCancelled:Gt,onBeforeAppear:Gt,onAppear:Gt,onAfterAppear:Gt,onAppearCancelled:Gt},z0={name:\"BaseTransition\",props:od,setup(e,{slots:t}){const n=Ht(),s=G0();let r;return()=>{const a=t.default&&ld(t.default(),!0);if(!a||!a.length)return;let o=a[0];if(a.length>1){for(const k of a)if(k.type!==Lt){o=k;break}}const i=De(e),{mode:l}=i;if(s.isLeaving)return vo(o);const u=Vl(o);if(!u)return vo(o);const c=$o(u,i,s,n);Ro(u,c);const _=n.subTree,p=_&&Vl(_);let y=!1;const{getTransitionKey:E}=u.type;if(E){const k=E();r===void 0?r=k:k!==r&&(r=k,y=!0)}if(p&&p.type!==Lt&&(!pn(u,p)||y)){const k=$o(p,i,s,n);if(Ro(p,k),l===\"out-in\")return s.isLeaving=!0,k.afterLeave=()=>{s.isLeaving=!1,n.update.active!==!1&&n.update()},vo(o);l===\"in-out\"&&u.type!==Lt&&(k.delayLeave=(S,m,w)=>{const P=id(s,p);P[String(p.key)]=p,S._leaveCb=()=>{m(),S._leaveCb=void 0,delete c.delayedLeave},c.delayedLeave=w})}return o}}},K0=z0;function id(e,t){const{leavingVNodes:n}=e;let s=n.get(t.type);return s||(s=Object.create(null),n.set(t.type,s)),s}function $o(e,t,n,s){const{appear:r,mode:a,persisted:o=!1,onBeforeEnter:i,onEnter:l,onAfterEnter:u,onEnterCancelled:c,onBeforeLeave:_,onLeave:p,onAfterLeave:y,onLeaveCancelled:E,onBeforeAppear:k,onAppear:S,onAfterAppear:m,onAppearCancelled:w}=t,P=String(e.key),b=id(n,e),D=(M,U)=>{M&&qt(M,s,9,U)},I=(M,U)=>{const ee=U[1];D(M,U),ne(M)?M.every(_e=>_e.length<=1)&&ee():M.length<=1&&ee()},V={mode:a,persisted:o,beforeEnter(M){let U=i;if(!n.isMounted)if(r)U=k||i;else return;M._leaveCb&&M._leaveCb(!0);const ee=b[P];ee&&pn(e,ee)&&ee.el._leaveCb&&ee.el._leaveCb(),D(U,[M])},enter(M){let U=l,ee=u,_e=c;if(!n.isMounted)if(r)U=S||l,ee=m||u,_e=w||c;else return;let H=!1;const ie=M._enterCb=Me=>{H||(H=!0,Me?D(_e,[M]):D(ee,[M]),V.delayedLeave&&V.delayedLeave(),M._enterCb=void 0)};U?I(U,[M,ie]):ie()},leave(M,U){const ee=String(e.key);if(M._enterCb&&M._enterCb(!0),n.isUnmounting)return U();D(_,[M]);let _e=!1;const H=M._leaveCb=ie=>{_e||(_e=!0,U(),ie?D(E,[M]):D(y,[M]),M._leaveCb=void 0,b[ee]===e&&delete b[ee])};b[ee]=e,p?I(p,[M,H]):H()},clone(M){return $o(M,t,n,s)}};return V}function vo(e){if(Ya(e))return e=ss(e),e.children=null,e}function Vl(e){return Ya(e)?e.children?e.children[0]:void 0:e}function Ro(e,t){e.shapeFlag&6&&e.component?Ro(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function ld(e,t=!1,n){let s=[],r=0;for(let a=0;a<e.length;a++){let o=e[a];const i=n==null?o.key:String(n)+String(o.key!=null?o.key:a);o.type===me?(o.patchFlag&128&&r++,s=s.concat(ld(o.children,t,i))):(t||o.type!==Lt)&&s.push(i!=null?ss(o,{key:i}):o)}if(r>1)for(let a=0;a<s.length;a++)s[a].patchFlag=-2;return s}function ue(e,t){return ye(e)?(()=>ot({name:e.name},t,{setup:e}))():e}const kr=e=>!!e.type.__asyncLoader,Ya=e=>e.type.__isKeepAlive;function q0(e,t){ud(e,\"a\",t)}function J0(e,t){ud(e,\"da\",t)}function ud(e,t,n=lt){const s=e.__wdc||(e.__wdc=()=>{let r=n;for(;r;){if(r.isDeactivated)return;r=r.parent}return e()});if(Ha(t,s,n),n){let r=n.parent;for(;r&&r.parent;)Ya(r.parent.vnode)&&X0(s,t,n,r),r=r.parent}}function X0(e,t,n,s){const r=Ha(t,e,s,!0);rr(()=>{yi(s[t],r)},n)}function Ha(e,t,n=lt,s=!1){if(n){const r=n[e]||(n[e]=[]),a=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;nr(),rs(n);const i=qt(t,n,e,o);return Qn(),sr(),i});return s?r.unshift(a):r.push(a),a}}const An=e=>(t,n=lt)=>(!Ur||e===\"sp\")&&Ha(e,(...s)=>t(...s),n),cd=An(\"bm\"),is=An(\"m\"),Z0=An(\"bu\"),Q0=An(\"u\"),dd=An(\"bum\"),rr=An(\"um\"),e3=An(\"sp\"),t3=An(\"rtg\"),n3=An(\"rtc\");function s3(e,t=lt){Ha(\"ec\",e,t)}const xi=\"components\";function ht(e,t){return hd(xi,e,!0,t)||e}const fd=Symbol.for(\"v-ndc\");function $i(e){return et(e)?hd(xi,e,!1)||e:e||fd}function hd(e,t,n=!0,s=!1){const r=pt||lt;if(r){const a=r.type;if(e===xi){const i=A3(a,!1);if(i&&(i===t||i===gn(t)||i===xa(gn(t))))return a}const o=jl(r[e]||a[e],t)||jl(r.appContext[e],t);return!o&&s?a:o}}function jl(e,t){return e&&(e[t]||e[gn(t)]||e[xa(gn(t))])}function ct(e,t,n,s){let r;const a=n&&n[s];if(ne(e)||et(e)){r=new Array(e.length);for(let o=0,i=e.length;o<i;o++)r[o]=t(e[o],o,void 0,a&&a[o])}else if(typeof e==\"number\"){r=new Array(e);for(let o=0;o<e;o++)r[o]=t(o+1,o,void 0,a&&a[o])}else if(Ye(e))if(e[Symbol.iterator])r=Array.from(e,(o,i)=>t(o,i,void 0,a&&a[i]));else{const o=Object.keys(e);r=new Array(o.length);for(let i=0,l=o.length;i<l;i++){const u=o[i];r[i]=t(e[u],u,i,a&&a[i])}}else r=[];return n&&(n[s]=r),r}function Yt(e,t,n={},s,r){if(pt.isCE||pt.parent&&kr(pt.parent)&&pt.parent.isCE)return t!==\"default\"&&(n.name=t),Ie(\"slot\",n,s&&s());let a=e[t];a&&a._c&&(a._d=!1),C();const o=a&&_d(a(n)),i=Fe(me,{key:n.key||o&&o.key||`_${t}`},o||(s?s():[]),o&&e._===1?64:-2);return!r&&i.scopeId&&(i.slotScopeIds=[i.scopeId+\"-s\"]),a&&a._c&&(a._d=!0),i}function _d(e){return e.some(t=>Br(t)?!(t.type===Lt||t.type===me&&!_d(t.children)):!0)?e:null}const Bo=e=>e?Td(e)?Va(e)||e.proxy:Bo(e.parent):null,wr=ot(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Bo(e.parent),$root:e=>Bo(e.root),$emit:e=>e.emit,$options:e=>Ri(e),$forceUpdate:e=>e.f||(e.f=()=>Ai(e.update)),$nextTick:e=>e.n||(e.n=Ii.bind(e.proxy)),$watch:e=>j0.bind(e)}),yo=(e,t)=>e!==Ve&&!e.__isScriptSetup&&Ne(e,t),r3={get({_:e},t){const{ctx:n,setupState:s,data:r,props:a,accessCache:o,type:i,appContext:l}=e;let u;if(t[0]!==\"$\"){const y=o[t];if(y!==void 0)switch(y){case 1:return s[t];case 2:return r[t];case 4:return n[t];case 3:return a[t]}else{if(yo(s,t))return o[t]=1,s[t];if(r!==Ve&&Ne(r,t))return o[t]=2,r[t];if((u=e.propsOptions[0])&&Ne(u,t))return o[t]=3,a[t];if(n!==Ve&&Ne(n,t))return o[t]=4,n[t];Uo&&(o[t]=0)}}const c=wr[t];let _,p;if(c)return t===\"$attrs\"&&Mt(e,\"get\",t),c(e);if((_=i.__cssModules)&&(_=_[t]))return _;if(n!==Ve&&Ne(n,t))return o[t]=4,n[t];if(p=l.config.globalProperties,Ne(p,t))return p[t]},set({_:e},t,n){const{data:s,setupState:r,ctx:a}=e;return yo(r,t)?(r[t]=n,!0):s!==Ve&&Ne(s,t)?(s[t]=n,!0):Ne(e.props,t)||t[0]===\"$\"&&t.slice(1)in e?!1:(a[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:s,appContext:r,propsOptions:a}},o){let i;return!!n[o]||e!==Ve&&Ne(e,o)||yo(t,o)||(i=a[0])&&Ne(i,o)||Ne(s,o)||Ne(wr,o)||Ne(r.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:Ne(n,\"value\")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};function Gl(e){return ne(e)?e.reduce((t,n)=>(t[n]=null,t),{}):e}function Dw(e){const t=Ht();let n=e();return Qn(),bi(n)&&(n=n.catch(s=>{throw rs(t),s})),[n,()=>rs(t)]}let Uo=!0;function a3(e){const t=Ri(e),n=e.proxy,s=e.ctx;Uo=!1,t.beforeCreate&&zl(t.beforeCreate,e,\"bc\");const{data:r,computed:a,methods:o,watch:i,provide:l,inject:u,created:c,beforeMount:_,mounted:p,beforeUpdate:y,updated:E,activated:k,deactivated:S,beforeDestroy:m,beforeUnmount:w,destroyed:P,unmounted:b,render:D,renderTracked:I,renderTriggered:V,errorCaptured:M,serverPrefetch:U,expose:ee,inheritAttrs:_e,components:H,directives:ie,filters:Me}=t;if(u&&o3(u,s,null),o)for(const we in o){const Ee=o[we];ye(Ee)&&(s[we]=Ee.bind(n))}if(r){const we=r.call(n,n);Ye(we)&&(e.data=wt(we))}if(Uo=!0,a)for(const we in a){const Ee=a[we],mt=ye(Ee)?Ee.bind(n,n):ye(Ee.get)?Ee.get.bind(n,n):rn,Dt=!ye(Ee)&&ye(Ee.set)?Ee.set.bind(n):rn,yt=be({get:mt,set:Dt});Object.defineProperty(s,we,{enumerable:!0,configurable:!0,get:()=>yt.value,set:rt=>yt.value=rt})}if(i)for(const we in i)pd(i[we],s,n,we);if(l){const we=ye(l)?l.call(n):l;Reflect.ownKeys(we).forEach(Ee=>{It(Ee,we[Ee])})}c&&zl(c,e,\"c\");function de(we,Ee){ne(Ee)?Ee.forEach(mt=>we(mt.bind(n))):Ee&&we(Ee.bind(n))}if(de(cd,_),de(is,p),de(Z0,y),de(Q0,E),de(q0,k),de(J0,S),de(s3,M),de(n3,I),de(t3,V),de(dd,w),de(rr,b),de(e3,U),ne(ee))if(ee.length){const we=e.exposed||(e.exposed={});ee.forEach(Ee=>{Object.defineProperty(we,Ee,{get:()=>n[Ee],set:mt=>n[Ee]=mt})})}else e.exposed||(e.exposed={});D&&e.render===rn&&(e.render=D),_e!=null&&(e.inheritAttrs=_e),H&&(e.components=H),ie&&(e.directives=ie)}function o3(e,t,n=rn){ne(e)&&(e=Yo(e));for(const s in e){const r=e[s];let a;Ye(r)?\"default\"in r?a=ve(r.from||s,r.default,!0):a=ve(r.from||s):a=ve(r),je(a)?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>a.value,set:o=>a.value=o}):t[s]=a}}function zl(e,t,n){qt(ne(e)?e.map(s=>s.bind(t.proxy)):e.bind(t.proxy),t,n)}function pd(e,t,n,s){const r=s.includes(\".\")?ad(n,s):()=>n[s];if(et(e)){const a=t[e];ye(a)&&Zn(r,a)}else if(ye(e))Zn(r,e.bind(n));else if(Ye(e))if(ne(e))e.forEach(a=>pd(a,t,n,s));else{const a=ye(e.handler)?e.handler.bind(n):t[e.handler];ye(a)&&Zn(r,a,e)}}function Ri(e){const t=e.type,{mixins:n,extends:s}=t,{mixins:r,optionsCache:a,config:{optionMergeStrategies:o}}=e.appContext,i=a.get(t);let l;return i?l=i:!r.length&&!n&&!s?l=t:(l={},r.length&&r.forEach(u=>Ca(l,u,o,!0)),Ca(l,t,o)),Ye(t)&&a.set(t,l),l}function Ca(e,t,n,s=!1){const{mixins:r,extends:a}=t;a&&Ca(e,a,n,!0),r&&r.forEach(o=>Ca(e,o,n,!0));for(const o in t)if(!(s&&o===\"expose\")){const i=i3[o]||n&&n[o];e[o]=i?i(e[o],t[o]):t[o]}return e}const i3={data:Kl,props:ql,emits:ql,methods:Er,computed:Er,beforeCreate:Tt,created:Tt,beforeMount:Tt,mounted:Tt,beforeUpdate:Tt,updated:Tt,beforeDestroy:Tt,beforeUnmount:Tt,destroyed:Tt,unmounted:Tt,activated:Tt,deactivated:Tt,errorCaptured:Tt,serverPrefetch:Tt,components:Er,directives:Er,watch:u3,provide:Kl,inject:l3};function Kl(e,t){return t?e?function(){return ot(ye(e)?e.call(this,this):e,ye(t)?t.call(this,this):t)}:t:e}function l3(e,t){return Er(Yo(e),Yo(t))}function Yo(e){if(ne(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function Tt(e,t){return e?[...new Set([].concat(e,t))]:t}function Er(e,t){return e?ot(Object.create(null),e,t):t}function ql(e,t){return e?ne(e)&&ne(t)?[...new Set([...e,...t])]:ot(Object.create(null),Gl(e),Gl(t!=null?t:{})):t}function u3(e,t){if(!e)return t;if(!t)return e;const n=ot(Object.create(null),e);for(const s in t)n[s]=Tt(e[s],t[s]);return n}function md(){return{app:null,config:{isNativeTag:A1,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let c3=0;function d3(e,t){return function(s,r=null){ye(s)||(s=ot({},s)),r!=null&&!Ye(r)&&(r=null);const a=md(),o=new Set;let i=!1;const l=a.app={_uid:c3++,_component:s,_props:r,_container:null,_context:a,_instance:null,version:$3,get config(){return a.config},set config(u){},use(u,...c){return o.has(u)||(u&&ye(u.install)?(o.add(u),u.install(l,...c)):ye(u)&&(o.add(u),u(l,...c))),l},mixin(u){return a.mixins.includes(u)||a.mixins.push(u),l},component(u,c){return c?(a.components[u]=c,l):a.components[u]},directive(u,c){return c?(a.directives[u]=c,l):a.directives[u]},mount(u,c,_){if(!i){const p=Ie(s,r);return p.appContext=a,c&&t?t(p,u):e(p,u,_),i=!0,l._container=u,u.__vue_app__=l,Va(p.component)||p.component.proxy}},unmount(){i&&(e(null,l._container),delete l._container.__vue_app__)},provide(u,c){return a.provides[u]=c,l},runWithContext(u){Rr=l;try{return u()}finally{Rr=null}}};return l}}let Rr=null;function It(e,t){if(lt){let n=lt.provides;const s=lt.parent&&lt.parent.provides;s===n&&(n=lt.provides=Object.create(s)),n[e]=t}}function ve(e,t,n=!1){const s=lt||pt;if(s||Rr){const r=s?s.parent==null?s.vnode.appContext&&s.vnode.appContext.provides:s.parent.provides:Rr._context.provides;if(r&&e in r)return r[e];if(arguments.length>1)return n&&ye(t)?t.call(s&&s.proxy):t}}function f3(){return!!(lt||pt||Rr)}function h3(e,t,n,s=!1){const r={},a={};ba(a,Wa,1),e.propsDefaults=Object.create(null),gd(e,t,r,a);for(const o in e.propsOptions[0])o in r||(r[o]=void 0);n?e.props=s?r:Wc(r):e.type.props?e.props=r:e.props=a,e.attrs=a}function _3(e,t,n,s){const{props:r,attrs:a,vnode:{patchFlag:o}}=e,i=De(r),[l]=e.propsOptions;let u=!1;if((s||o>0)&&!(o&16)){if(o&8){const c=e.vnode.dynamicProps;for(let _=0;_<c.length;_++){let p=c[_];if(Ba(e.emitsOptions,p))continue;const y=t[p];if(l)if(Ne(a,p))y!==a[p]&&(a[p]=y,u=!0);else{const E=gn(p);r[E]=Ho(l,i,E,y,e,!1)}else y!==a[p]&&(a[p]=y,u=!0)}}}else{gd(e,t,r,a)&&(u=!0);let c;for(const _ in i)(!t||!Ne(t,_)&&((c=tr(_))===_||!Ne(t,c)))&&(l?n&&(n[_]!==void 0||n[c]!==void 0)&&(r[_]=Ho(l,i,_,void 0,e,!0)):delete r[_]);if(a!==i)for(const _ in a)(!t||!Ne(t,_)&&!0)&&(delete a[_],u=!0)}u&&Nn(e,\"set\",\"$attrs\")}function gd(e,t,n,s){const[r,a]=e.propsOptions;let o=!1,i;if(t)for(let l in t){if(ha(l))continue;const u=t[l];let c;r&&Ne(r,c=gn(l))?!a||!a.includes(c)?n[c]=u:(i||(i={}))[c]=u:Ba(e.emitsOptions,l)||(!(l in s)||u!==s[l])&&(s[l]=u,o=!0)}if(a){const l=De(n),u=i||Ve;for(let c=0;c<a.length;c++){const _=a[c];n[_]=Ho(r,l,_,u[_],e,!Ne(u,_))}}return o}function Ho(e,t,n,s,r,a){const o=e[n];if(o!=null){const i=Ne(o,\"default\");if(i&&s===void 0){const l=o.default;if(o.type!==Function&&!o.skipFactory&&ye(l)){const{propsDefaults:u}=r;n in u?s=u[n]:(rs(r),s=u[n]=l.call(null,t),Qn())}else s=l}o[0]&&(a&&!i?s=!1:o[1]&&(s===\"\"||s===tr(n))&&(s=!0))}return s}function vd(e,t,n=!1){const s=t.propsCache,r=s.get(e);if(r)return r;const a=e.props,o={},i=[];let l=!1;if(!ye(e)){const c=_=>{l=!0;const[p,y]=vd(_,t,!0);ot(o,p),y&&i.push(...y)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!a&&!l)return Ye(e)&&s.set(e,Bs),Bs;if(ne(a))for(let c=0;c<a.length;c++){const _=gn(a[c]);Jl(_)&&(o[_]=Ve)}else if(a)for(const c in a){const _=gn(c);if(Jl(_)){const p=a[c],y=o[_]=ne(p)||ye(p)?{type:p}:ot({},p);if(y){const E=Ql(Boolean,y.type),k=Ql(String,y.type);y[0]=E>-1,y[1]=k<0||E<k,(E>-1||Ne(y,\"default\"))&&i.push(_)}}}const u=[o,i];return Ye(e)&&s.set(e,u),u}function Jl(e){return e[0]!==\"$\"}function Xl(e){const t=e&&e.toString().match(/^\\s*(function|class) (\\w+)/);return t?t[2]:e===null?\"null\":\"\"}function Zl(e,t){return Xl(e)===Xl(t)}function Ql(e,t){return ne(t)?t.findIndex(n=>Zl(n,e)):ye(t)&&Zl(t,e)?0:-1}const yd=e=>e[0]===\"_\"||e===\"$stable\",Bi=e=>ne(e)?e.map(Qt):[Qt(e)],p3=(e,t,n)=>{if(t._n)return t;const s=Ue((...r)=>Bi(t(...r)),n);return s._c=!1,s},bd=(e,t,n)=>{const s=e._ctx;for(const r in e){if(yd(r))continue;const a=e[r];if(ye(a))t[r]=p3(r,a,s);else if(a!=null){const o=Bi(a);t[r]=()=>o}}},Ed=(e,t)=>{const n=Bi(t);e.slots.default=()=>n},m3=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=De(t),ba(t,\"_\",n)):bd(t,e.slots={})}else e.slots={},t&&Ed(e,t);ba(e.slots,Wa,1)},g3=(e,t,n)=>{const{vnode:s,slots:r}=e;let a=!0,o=Ve;if(s.shapeFlag&32){const i=t._;i?n&&i===1?a=!1:(ot(r,t),!n&&i===1&&delete r._):(a=!t.$stable,bd(t,r)),o=t}else t&&(Ed(e,t),o={default:1});if(a)for(const i in r)!yd(i)&&!(i in o)&&delete r[i]};function Wo(e,t,n,s,r=!1){if(ne(e)){e.forEach((p,y)=>Wo(p,t&&(ne(t)?t[y]:t),n,s,r));return}if(kr(s)&&!r)return;const a=s.shapeFlag&4?Va(s.component)||s.component.proxy:s.el,o=r?null:a,{i,r:l}=e,u=t&&t.r,c=i.refs===Ve?i.refs={}:i.refs,_=i.setupState;if(u!=null&&u!==l&&(et(u)?(c[u]=null,Ne(_,u)&&(_[u]=null)):je(u)&&(u.value=null)),ye(l))Xn(l,i,12,[o,c]);else{const p=et(l),y=je(l);if(p||y){const E=()=>{if(e.f){const k=p?Ne(_,l)?_[l]:c[l]:l.value;r?ne(k)&&yi(k,a):ne(k)?k.includes(a)||k.push(a):p?(c[l]=[a],Ne(_,l)&&(_[l]=c[l])):(l.value=[a],e.k&&(c[e.k]=l.value))}else p?(c[l]=o,Ne(_,l)&&(_[l]=o)):y&&(l.value=o,e.k&&(c[e.k]=o))};o?(E.id=-1,Pt(E,n)):E()}}}const Pt=W0;function v3(e){return y3(e)}function y3(e,t){const n=Io();n.__VUE__=!0;const{insert:s,remove:r,patchProp:a,createElement:o,createText:i,createComment:l,setText:u,setElementText:c,parentNode:_,nextSibling:p,setScopeId:y=rn,insertStaticContent:E}=e,k=(v,f,h,g=null,T=null,O=null,x=!1,R=null,Y=!!f.dynamicChildren)=>{if(v===f)return;v&&!pn(v,f)&&(g=L(v),rt(v,T,O,!0),v=null),f.patchFlag===-2&&(Y=!1,f.dynamicChildren=null);const{type:$,ref:K,shapeFlag:F}=f;switch($){case qr:S(v,f,h,g);break;case Lt:m(v,f,h,g);break;case pa:v==null&&w(f,h,g,x);break;case me:H(v,f,h,g,T,O,x,R,Y);break;default:F&1?D(v,f,h,g,T,O,x,R,Y):F&6?ie(v,f,h,g,T,O,x,R,Y):(F&64||F&128)&&$.process(v,f,h,g,T,O,x,R,Y,W)}K!=null&&T&&Wo(K,v&&v.ref,O,f||v,!f)},S=(v,f,h,g)=>{if(v==null)s(f.el=i(f.children),h,g);else{const T=f.el=v.el;f.children!==v.children&&u(T,f.children)}},m=(v,f,h,g)=>{v==null?s(f.el=l(f.children||\"\"),h,g):f.el=v.el},w=(v,f,h,g)=>{[v.el,v.anchor]=E(v.children,f,h,g,v.el,v.anchor)},P=({el:v,anchor:f},h,g)=>{let T;for(;v&&v!==f;)T=p(v),s(v,h,g),v=T;s(f,h,g)},b=({el:v,anchor:f})=>{let h;for(;v&&v!==f;)h=p(v),r(v),v=h;r(f)},D=(v,f,h,g,T,O,x,R,Y)=>{x=x||f.type===\"svg\",v==null?I(f,h,g,T,O,x,R,Y):U(v,f,T,O,x,R,Y)},I=(v,f,h,g,T,O,x,R)=>{let Y,$;const{type:K,props:F,shapeFlag:A,transition:se,dirs:ae}=v;if(Y=v.el=o(v.type,O,F&&F.is,F),A&8?c(Y,v.children):A&16&&M(v.children,Y,null,g,T,O&&K!==\"foreignObject\",x,R),ae&&hs(v,null,g,\"created\"),V(Y,v,v.scopeId,x,g),F){for(const Pe in F)Pe!==\"value\"&&!ha(Pe)&&a(Y,Pe,null,F[Pe],O,v.children,g,T,Ze);\"value\"in F&&a(Y,\"value\",null,F.value),($=F.onVnodeBeforeMount)&&fn($,g,v)}ae&&hs(v,null,g,\"beforeMount\");const xe=(!T||T&&!T.pendingBranch)&&se&&!se.persisted;xe&&se.beforeEnter(Y),s(Y,f,h),(($=F&&F.onVnodeMounted)||xe||ae)&&Pt(()=>{$&&fn($,g,v),xe&&se.enter(Y),ae&&hs(v,null,g,\"mounted\")},T)},V=(v,f,h,g,T)=>{if(h&&y(v,h),g)for(let O=0;O<g.length;O++)y(v,g[O]);if(T){let O=T.subTree;if(f===O){const x=T.vnode;V(v,x,x.scopeId,x.slotScopeIds,T.parent)}}},M=(v,f,h,g,T,O,x,R,Y=0)=>{for(let $=Y;$<v.length;$++){const K=v[$]=R?Vn(v[$]):Qt(v[$]);k(null,K,f,h,g,T,O,x,R)}},U=(v,f,h,g,T,O,x)=>{const R=f.el=v.el;let{patchFlag:Y,dynamicChildren:$,dirs:K}=f;Y|=v.patchFlag&16;const F=v.props||Ve,A=f.props||Ve;let se;h&&_s(h,!1),(se=A.onVnodeBeforeUpdate)&&fn(se,h,f,v),K&&hs(f,v,h,\"beforeUpdate\"),h&&_s(h,!0);const ae=T&&f.type!==\"foreignObject\";if($?ee(v.dynamicChildren,$,R,h,g,ae,O):x||Ee(v,f,R,null,h,g,ae,O,!1),Y>0){if(Y&16)_e(R,f,F,A,h,g,T);else if(Y&2&&F.class!==A.class&&a(R,\"class\",null,A.class,T),Y&4&&a(R,\"style\",F.style,A.style,T),Y&8){const xe=f.dynamicProps;for(let Pe=0;Pe<xe.length;Pe++){const He=xe[Pe],$t=F[He],fs=A[He];(fs!==$t||He===\"value\")&&a(R,He,$t,fs,T,v.children,h,g,Ze)}}Y&1&&v.children!==f.children&&c(R,f.children)}else!x&&$==null&&_e(R,f,F,A,h,g,T);((se=A.onVnodeUpdated)||K)&&Pt(()=>{se&&fn(se,h,f,v),K&&hs(f,v,h,\"updated\")},g)},ee=(v,f,h,g,T,O,x)=>{for(let R=0;R<f.length;R++){const Y=v[R],$=f[R],K=Y.el&&(Y.type===me||!pn(Y,$)||Y.shapeFlag&70)?_(Y.el):h;k(Y,$,K,null,g,T,O,x,!0)}},_e=(v,f,h,g,T,O,x)=>{if(h!==g){if(h!==Ve)for(const R in h)!ha(R)&&!(R in g)&&a(v,R,h[R],null,x,f.children,T,O,Ze);for(const R in g){if(ha(R))continue;const Y=g[R],$=h[R];Y!==$&&R!==\"value\"&&a(v,R,$,Y,x,f.children,T,O,Ze)}\"value\"in g&&a(v,\"value\",h.value,g.value)}},H=(v,f,h,g,T,O,x,R,Y)=>{const $=f.el=v?v.el:i(\"\"),K=f.anchor=v?v.anchor:i(\"\");let{patchFlag:F,dynamicChildren:A,slotScopeIds:se}=f;se&&(R=R?R.concat(se):se),v==null?(s($,h,g),s(K,h,g),M(f.children,h,K,T,O,x,R,Y)):F>0&&F&64&&A&&v.dynamicChildren?(ee(v.dynamicChildren,A,h,T,O,x,R),(f.key!=null||T&&f===T.subTree)&&kd(v,f,!0)):Ee(v,f,h,K,T,O,x,R,Y)},ie=(v,f,h,g,T,O,x,R,Y)=>{f.slotScopeIds=R,v==null?f.shapeFlag&512?T.ctx.activate(f,h,g,x,Y):Me(f,h,g,T,O,x,Y):qe(v,f,Y)},Me=(v,f,h,g,T,O,x)=>{const R=v.component=D3(v,g,T);if(Ya(v)&&(R.ctx.renderer=W),O3(R),R.asyncDep){if(T&&T.registerDep(R,de),!v.el){const Y=R.subTree=Ie(Lt);m(null,Y,f,h)}return}de(R,v,f,h,T,O,x)},qe=(v,f,h)=>{const g=f.component=v.component;if(x0(v,f,h))if(g.asyncDep&&!g.asyncResolved){we(g,f,h);return}else g.next=f,P0(g.update),g.update();else f.el=v.el,g.vnode=f},de=(v,f,h,g,T,O,x)=>{const R=()=>{if(v.isMounted){let{next:K,bu:F,u:A,parent:se,vnode:ae}=v,xe=K,Pe;_s(v,!1),K?(K.el=ae.el,we(v,K,x)):K=ae,F&&_a(F),(Pe=K.props&&K.props.onVnodeBeforeUpdate)&&fn(Pe,se,K,ae),_s(v,!0);const He=go(v),$t=v.subTree;v.subTree=He,k($t,He,_($t.el),L($t),v,T,O),K.el=He.el,xe===null&&Li(v,He.el),A&&Pt(A,T),(Pe=K.props&&K.props.onVnodeUpdated)&&Pt(()=>fn(Pe,se,K,ae),T)}else{let K;const{el:F,props:A}=f,{bm:se,m:ae,parent:xe}=v,Pe=kr(f);if(_s(v,!1),se&&_a(se),!Pe&&(K=A&&A.onVnodeBeforeMount)&&fn(K,xe,f),_s(v,!0),F&&Se){const He=()=>{v.subTree=go(v),Se(F,v.subTree,v,T,null)};Pe?f.type.__asyncLoader().then(()=>!v.isUnmounted&&He()):He()}else{const He=v.subTree=go(v);k(null,He,h,g,v,T,O),f.el=He.el}if(ae&&Pt(ae,T),!Pe&&(K=A&&A.onVnodeMounted)){const He=f;Pt(()=>fn(K,xe,He),T)}(f.shapeFlag&256||xe&&kr(xe.vnode)&&xe.vnode.shapeFlag&256)&&v.a&&Pt(v.a,T),v.isMounted=!0,f=h=g=null}},Y=v.effect=new Ci(R,()=>Ai($),v.scope),$=v.update=()=>Y.run();$.id=v.uid,_s(v,!0),$()},we=(v,f,h)=>{f.component=v;const g=v.vnode.props;v.vnode=f,v.next=null,_3(v,f.props,g,h),g3(v,f.children,h),nr(),Yl(),sr()},Ee=(v,f,h,g,T,O,x,R,Y=!1)=>{const $=v&&v.children,K=v?v.shapeFlag:0,F=f.children,{patchFlag:A,shapeFlag:se}=f;if(A>0){if(A&128){Dt($,F,h,g,T,O,x,R,Y);return}else if(A&256){mt($,F,h,g,T,O,x,R,Y);return}}se&8?(K&16&&Ze($,T,O),F!==$&&c(h,F)):K&16?se&16?Dt($,F,h,g,T,O,x,R,Y):Ze($,T,O,!0):(K&8&&c(h,\"\"),se&16&&M(F,h,g,T,O,x,R,Y))},mt=(v,f,h,g,T,O,x,R,Y)=>{v=v||Bs,f=f||Bs;const $=v.length,K=f.length,F=Math.min($,K);let A;for(A=0;A<F;A++){const se=f[A]=Y?Vn(f[A]):Qt(f[A]);k(v[A],se,h,null,T,O,x,R,Y)}$>K?Ze(v,T,O,!0,!1,F):M(f,h,g,T,O,x,R,Y,F)},Dt=(v,f,h,g,T,O,x,R,Y)=>{let $=0;const K=f.length;let F=v.length-1,A=K-1;for(;$<=F&&$<=A;){const se=v[$],ae=f[$]=Y?Vn(f[$]):Qt(f[$]);if(pn(se,ae))k(se,ae,h,null,T,O,x,R,Y);else break;$++}for(;$<=F&&$<=A;){const se=v[F],ae=f[A]=Y?Vn(f[A]):Qt(f[A]);if(pn(se,ae))k(se,ae,h,null,T,O,x,R,Y);else break;F--,A--}if($>F){if($<=A){const se=A+1,ae=se<K?f[se].el:g;for(;$<=A;)k(null,f[$]=Y?Vn(f[$]):Qt(f[$]),h,ae,T,O,x,R,Y),$++}}else if($>A)for(;$<=F;)rt(v[$],T,O,!0),$++;else{const se=$,ae=$,xe=new Map;for($=ae;$<=A;$++){const Rt=f[$]=Y?Vn(f[$]):Qt(f[$]);Rt.key!=null&&xe.set(Rt.key,$)}let Pe,He=0;const $t=A-ae+1;let fs=!1,Sl=0;const dr=new Array($t);for($=0;$<$t;$++)dr[$]=0;for($=se;$<=F;$++){const Rt=v[$];if(He>=$t){rt(Rt,T,O,!0);continue}let dn;if(Rt.key!=null)dn=xe.get(Rt.key);else for(Pe=ae;Pe<=A;Pe++)if(dr[Pe-ae]===0&&pn(Rt,f[Pe])){dn=Pe;break}dn===void 0?rt(Rt,T,O,!0):(dr[dn-ae]=$+1,dn>=Sl?Sl=dn:fs=!0,k(Rt,f[dn],h,null,T,O,x,R,Y),He++)}const Cl=fs?b3(dr):Bs;for(Pe=Cl.length-1,$=$t-1;$>=0;$--){const Rt=ae+$,dn=f[Rt],Tl=Rt+1<K?f[Rt+1].el:g;dr[$]===0?k(null,dn,h,Tl,T,O,x,R,Y):fs&&(Pe<0||$!==Cl[Pe]?yt(dn,h,Tl,2):Pe--)}}},yt=(v,f,h,g,T=null)=>{const{el:O,type:x,transition:R,children:Y,shapeFlag:$}=v;if($&6){yt(v.component.subTree,f,h,g);return}if($&128){v.suspense.move(f,h,g);return}if($&64){x.move(v,f,h,W);return}if(x===me){s(O,f,h);for(let F=0;F<Y.length;F++)yt(Y[F],f,h,g);s(v.anchor,f,h);return}if(x===pa){P(v,f,h);return}if(g!==2&&$&1&&R)if(g===0)R.beforeEnter(O),s(O,f,h),Pt(()=>R.enter(O),T);else{const{leave:F,delayLeave:A,afterLeave:se}=R,ae=()=>s(O,f,h),xe=()=>{F(O,()=>{ae(),se&&se()})};A?A(O,ae,xe):xe()}else s(O,f,h)},rt=(v,f,h,g=!1,T=!1)=>{const{type:O,props:x,ref:R,children:Y,dynamicChildren:$,shapeFlag:K,patchFlag:F,dirs:A}=v;if(R!=null&&Wo(R,null,h,v,!0),K&256){f.ctx.deactivate(v);return}const se=K&1&&A,ae=!kr(v);let xe;if(ae&&(xe=x&&x.onVnodeBeforeUnmount)&&fn(xe,f,v),K&6)cn(v.component,h,g);else{if(K&128){v.suspense.unmount(h,g);return}se&&hs(v,null,f,\"beforeUnmount\"),K&64?v.type.remove(v,f,h,T,W,g):$&&(O!==me||F>0&&F&64)?Ze($,f,h,!1,!0):(O===me&&F&384||!T&&K&16)&&Ze(Y,f,h),g&&Vt(v)}(ae&&(xe=x&&x.onVnodeUnmounted)||se)&&Pt(()=>{xe&&fn(xe,f,v),se&&hs(v,null,f,\"unmounted\")},h)},Vt=v=>{const{type:f,el:h,anchor:g,transition:T}=v;if(f===me){jt(h,g);return}if(f===pa){b(v);return}const O=()=>{r(h),T&&!T.persisted&&T.afterLeave&&T.afterLeave()};if(v.shapeFlag&1&&T&&!T.persisted){const{leave:x,delayLeave:R}=T,Y=()=>x(h,O);R?R(v.el,O,Y):Y()}else O()},jt=(v,f)=>{let h;for(;v!==f;)h=p(v),r(v),v=h;r(f)},cn=(v,f,h)=>{const{bum:g,scope:T,update:O,subTree:x,um:R}=v;g&&_a(g),T.stop(),O&&(O.active=!1,rt(x,v,f,h)),R&&Pt(R,f),Pt(()=>{v.isUnmounted=!0},f),f&&f.pendingBranch&&!f.isUnmounted&&v.asyncDep&&!v.asyncResolved&&v.suspenseId===f.pendingId&&(f.deps--,f.deps===0&&f.resolve())},Ze=(v,f,h,g=!1,T=!1,O=0)=>{for(let x=O;x<v.length;x++)rt(v[x],f,h,g,T)},L=v=>v.shapeFlag&6?L(v.component.subTree):v.shapeFlag&128?v.suspense.next():p(v.anchor||v.el),z=(v,f,h)=>{v==null?f._vnode&&rt(f._vnode,null,null,!0):k(f._vnode||null,v,f,null,null,null,h),Yl(),ed(),f._vnode=v},W={p:k,um:rt,m:yt,r:Vt,mt:Me,mc:M,pc:Ee,pbc:ee,n:L,o:e};let Q,Se;return t&&([Q,Se]=t(W)),{render:z,hydrate:Q,createApp:d3(z,Q)}}function _s({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function kd(e,t,n=!1){const s=e.children,r=t.children;if(ne(s)&&ne(r))for(let a=0;a<s.length;a++){const o=s[a];let i=r[a];i.shapeFlag&1&&!i.dynamicChildren&&((i.patchFlag<=0||i.patchFlag===32)&&(i=r[a]=Vn(r[a]),i.el=o.el),n||kd(o,i)),i.type===qr&&(i.el=o.el)}}function b3(e){const t=e.slice(),n=[0];let s,r,a,o,i;const l=e.length;for(s=0;s<l;s++){const u=e[s];if(u!==0){if(r=n[n.length-1],e[r]<u){t[s]=r,n.push(s);continue}for(a=0,o=n.length-1;a<o;)i=a+o>>1,e[n[i]]<u?a=i+1:o=i;u<e[n[a]]&&(a>0&&(t[s]=n[a-1]),n[a]=s)}}for(a=n.length,o=n[a-1];a-- >0;)n[a]=o,o=t[o];return n}const E3=e=>e.__isTeleport,me=Symbol.for(\"v-fgt\"),qr=Symbol.for(\"v-txt\"),Lt=Symbol.for(\"v-cmt\"),pa=Symbol.for(\"v-stc\"),Sr=[];let Kt=null;function C(e=!1){Sr.push(Kt=e?null:[])}function wd(){Sr.pop(),Kt=Sr[Sr.length-1]||null}let Ks=1;function eu(e){Ks+=e}function Sd(e){return e.dynamicChildren=Ks>0?Kt||Bs:null,wd(),Ks>0&&Kt&&Kt.push(e),e}function N(e,t,n,s,r,a){return Sd(d(e,t,n,s,r,a,!0))}function Fe(e,t,n,s,r){return Sd(Ie(e,t,n,s,r,!0))}function Br(e){return e?e.__v_isVNode===!0:!1}function pn(e,t){return e.type===t.type&&e.key===t.key}const Wa=\"__vInternal\",Cd=({key:e})=>e!=null?e:null,ma=({ref:e,ref_key:t,ref_for:n})=>(typeof e==\"number\"&&(e=\"\"+e),e!=null?et(e)||je(e)||ye(e)?{i:pt,r:e,k:t,f:!!n}:e:null);function d(e,t=null,n=null,s=0,r=null,a=e===me?0:1,o=!1,i=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Cd(t),ref:t&&ma(t),scopeId:Ua,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:a,patchFlag:s,dynamicProps:r,dynamicChildren:null,appContext:null,ctx:pt};return i?(Ui(l,n),a&128&&e.normalize(l)):n&&(l.shapeFlag|=et(n)?8:16),Ks>0&&!o&&Kt&&(l.patchFlag>0||a&6)&&l.patchFlag!==32&&Kt.push(l),l}const Ie=k3;function k3(e,t=null,n=null,s=0,r=null,a=!1){if((!e||e===fd)&&(e=Lt),Br(e)){const i=ss(e,t,!0);return n&&Ui(i,n),Ks>0&&!a&&Kt&&(i.shapeFlag&6?Kt[Kt.indexOf(e)]=i:Kt.push(i)),i.patchFlag|=-2,i}if(L3(e)&&(e=e.__vccOpts),t){t=w3(t);let{class:i,style:l}=t;i&&!et(i)&&(t.class=_t(i)),Ye(l)&&(jc(l)&&!ne(l)&&(l=ot({},l)),t.style=Ts(l))}const o=et(e)?1:$0(e)?128:E3(e)?64:Ye(e)?4:ye(e)?2:0;return d(e,t,n,s,r,o,a,!0)}function w3(e){return e?jc(e)||Wa in e?ot({},e):e:null}function ss(e,t,n=!1){const{props:s,ref:r,patchFlag:a,children:o}=e,i=t?C3(s||{},t):s;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:i,key:i&&Cd(i),ref:t&&t.ref?n&&r?ne(r)?r.concat(ma(t)):[r,ma(t)]:ma(t):r,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==me?a===-1?16:a|16:a,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&ss(e.ssContent),ssFallback:e.ssFallback&&ss(e.ssFallback),el:e.el,anchor:e.anchor,ctx:e.ctx,ce:e.ce}}function Et(e=\" \",t=0){return Ie(qr,null,e,t)}function S3(e,t){const n=Ie(pa,null,e);return n.staticCount=t,n}function pe(e=\"\",t=!1){return t?(C(),Fe(Lt,null,e)):Ie(Lt,null,e)}function Qt(e){return e==null||typeof e==\"boolean\"?Ie(Lt):ne(e)?Ie(me,null,e.slice()):typeof e==\"object\"?Vn(e):Ie(qr,null,String(e))}function Vn(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:ss(e)}function Ui(e,t){let n=0;const{shapeFlag:s}=e;if(t==null)t=null;else if(ne(t))n=16;else if(typeof t==\"object\")if(s&65){const r=t.default;r&&(r._c&&(r._d=!1),Ui(e,r()),r._c&&(r._d=!0));return}else{n=32;const r=t._;!r&&!(Wa in t)?t._ctx=pt:r===3&&pt&&(pt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else ye(t)?(t={default:t,_ctx:pt},n=32):(t=String(t),s&64?(n=16,t=[Et(t)]):n=8);e.children=t,e.shapeFlag|=n}function C3(...e){const t={};for(let n=0;n<e.length;n++){const s=e[n];for(const r in s)if(r===\"class\")t.class!==s.class&&(t.class=_t([t.class,s.class]));else if(r===\"style\")t.style=Ts([t.style,s.style]);else if(La(r)){const a=t[r],o=s[r];o&&a!==o&&!(ne(a)&&a.includes(o))&&(t[r]=a?[].concat(a,o):o)}else r!==\"\"&&(t[r]=s[r])}return t}function fn(e,t,n,s=null){qt(e,t,7,[n,s])}const T3=md();let F3=0;function D3(e,t,n){const s=e.type,r=(t?t.appContext:e.appContext)||T3,a={uid:F3++,vnode:e,type:s,parent:t,appContext:r,root:null,next:null,subTree:null,effect:null,update:null,scope:new Nc(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(r.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:vd(s,r),emitsOptions:nd(s,r),emit:null,emitted:null,propsDefaults:Ve,inheritAttrs:s.inheritAttrs,ctx:Ve,data:Ve,props:Ve,attrs:Ve,slots:Ve,refs:Ve,setupState:Ve,setupContext:null,attrsProxy:null,slotsProxy:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return a.ctx={_:a},a.root=t?t.root:a,a.emit=I0.bind(null,a),e.ce&&e.ce(a),a}let lt=null;const Ht=()=>lt||pt;let Yi,Os,tu=\"__VUE_INSTANCE_SETTERS__\";(Os=Io()[tu])||(Os=Io()[tu]=[]),Os.push(e=>lt=e),Yi=e=>{Os.length>1?Os.forEach(t=>t(e)):Os[0](e)};const rs=e=>{Yi(e),e.scope.on()},Qn=()=>{lt&&lt.scope.off(),Yi(null)};function Td(e){return e.vnode.shapeFlag&4}let Ur=!1;function O3(e,t=!1){Ur=t;const{props:n,children:s}=e.vnode,r=Td(e);h3(e,n,r,t),m3(e,s);const a=r?P3(e,t):void 0;return Ur=!1,a}function P3(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=Ra(new Proxy(e.ctx,r3));const{setup:s}=n;if(s){const r=e.setupContext=s.length>1?I3(e):null;rs(e),nr();const a=Xn(s,e,0,[e.props,r]);if(sr(),Qn(),bi(a)){if(a.then(Qn,Qn),t)return a.then(o=>{Vo(e,o,t)}).catch(o=>{Kr(o,e,0)});e.asyncDep=a}else Vo(e,a,t)}else Fd(e,t)}function Vo(e,t,n){ye(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Ye(t)&&(e.setupState=Jc(t)),Fd(e,n)}let nu;function Fd(e,t,n){const s=e.type;if(!e.render){if(!t&&nu&&!s.render){const r=s.template||Ri(e).template;if(r){const{isCustomElement:a,compilerOptions:o}=e.appContext.config,{delimiters:i,compilerOptions:l}=s,u=ot(ot({isCustomElement:a,delimiters:i},o),l);s.render=nu(r,u)}}e.render=s.render||rn}rs(e),nr(),a3(e),sr(),Qn()}function N3(e){return e.attrsProxy||(e.attrsProxy=new Proxy(e.attrs,{get(t,n){return Mt(e,\"get\",\"$attrs\"),t[n]}}))}function I3(e){const t=n=>{e.exposed=n||{}};return{get attrs(){return N3(e)},slots:e.slots,emit:e.emit,expose:t}}function Va(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Jc(Ra(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in wr)return wr[n](e)},has(t,n){return n in t||n in wr}}))}function A3(e,t=!0){return ye(e)?e.displayName||e.name:e.name||t&&e.__name}function L3(e){return ye(e)&&\"__vccOpts\"in e}const be=(e,t)=>F0(e,t,Ur);function Jr(e,t,n){const s=arguments.length;return s===2?Ye(t)&&!ne(t)?Br(t)?Ie(e,null,[t]):Ie(e,t):Ie(e,null,t):(s>3?n=Array.prototype.slice.call(arguments,2):s===3&&Br(n)&&(n=[n]),Ie(e,t,n))}const M3=Symbol.for(\"v-scx\"),x3=()=>ve(M3),$3=\"3.3.4\",R3=\"http://www.w3.org/2000/svg\",ys=typeof document!=\"undefined\"?document:null,su=ys&&ys.createElement(\"template\"),B3={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,s)=>{const r=t?ys.createElementNS(R3,e):ys.createElement(e,n?{is:n}:void 0);return e===\"select\"&&s&&s.multiple!=null&&r.setAttribute(\"multiple\",s.multiple),r},createText:e=>ys.createTextNode(e),createComment:e=>ys.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>ys.querySelector(e),setScopeId(e,t){e.setAttribute(t,\"\")},insertStaticContent(e,t,n,s,r,a){const o=n?n.previousSibling:t.lastChild;if(r&&(r===a||r.nextSibling))for(;t.insertBefore(r.cloneNode(!0),n),!(r===a||!(r=r.nextSibling)););else{su.innerHTML=s?`<svg>${e}</svg>`:e;const i=su.content;if(s){const l=i.firstChild;for(;l.firstChild;)i.appendChild(l.firstChild);i.removeChild(l)}t.insertBefore(i,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function U3(e,t,n){const s=e._vtc;s&&(t=(t?[t,...s]:[...s]).join(\" \")),t==null?e.removeAttribute(\"class\"):n?e.setAttribute(\"class\",t):e.className=t}function Y3(e,t,n){const s=e.style,r=et(n);if(n&&!r){if(t&&!et(t))for(const a in t)n[a]==null&&jo(s,a,\"\");for(const a in n)jo(s,a,n[a])}else{const a=s.display;r?t!==n&&(s.cssText=n):t&&e.removeAttribute(\"style\"),\"_vod\"in e&&(s.display=a)}}const ru=/\\s*!important$/;function jo(e,t,n){if(ne(n))n.forEach(s=>jo(e,t,s));else if(n==null&&(n=\"\"),t.startsWith(\"--\"))e.setProperty(t,n);else{const s=H3(e,t);ru.test(n)?e.setProperty(tr(s),n.replace(ru,\"\"),\"important\"):e[s]=n}}const au=[\"Webkit\",\"Moz\",\"ms\"],bo={};function H3(e,t){const n=bo[t];if(n)return n;let s=gn(t);if(s!==\"filter\"&&s in e)return bo[t]=s;s=xa(s);for(let r=0;r<au.length;r++){const a=au[r]+s;if(a in e)return bo[t]=a}return t}const ou=\"http://www.w3.org/1999/xlink\";function W3(e,t,n,s,r){if(s&&t.startsWith(\"xlink:\"))n==null?e.removeAttributeNS(ou,t.slice(6,t.length)):e.setAttributeNS(ou,t,n);else{const a=V1(t);n==null||a&&!Oc(n)?e.removeAttribute(t):e.setAttribute(t,a?\"\":n)}}function V3(e,t,n,s,r,a,o){if(t===\"innerHTML\"||t===\"textContent\"){s&&o(s,r,a),e[t]=n==null?\"\":n;return}const i=e.tagName;if(t===\"value\"&&i!==\"PROGRESS\"&&!i.includes(\"-\")){e._value=n;const u=i===\"OPTION\"?e.getAttribute(\"value\"):e.value,c=n==null?\"\":n;u!==c&&(e.value=c),n==null&&e.removeAttribute(t);return}let l=!1;if(n===\"\"||n==null){const u=typeof e[t];u===\"boolean\"?n=Oc(n):n==null&&u===\"string\"?(n=\"\",l=!0):u===\"number\"&&(n=0,l=!0)}try{e[t]=n}catch(u){}l&&e.removeAttribute(t)}function Tn(e,t,n,s){e.addEventListener(t,n,s)}function j3(e,t,n,s){e.removeEventListener(t,n,s)}function G3(e,t,n,s,r=null){const a=e._vei||(e._vei={}),o=a[t];if(s&&o)o.value=s;else{const[i,l]=z3(t);if(s){const u=a[t]=J3(s,r);Tn(e,i,u,l)}else o&&(j3(e,i,o,l),a[t]=void 0)}}const iu=/(?:Once|Passive|Capture)$/;function z3(e){let t;if(iu.test(e)){t={};let s;for(;s=e.match(iu);)e=e.slice(0,e.length-s[0].length),t[s[0].toLowerCase()]=!0}return[e[2]===\":\"?e.slice(3):tr(e.slice(2)),t]}let Eo=0;const K3=Promise.resolve(),q3=()=>Eo||(K3.then(()=>Eo=0),Eo=Date.now());function J3(e,t){const n=s=>{if(!s._vts)s._vts=Date.now();else if(s._vts<=n.attached)return;qt(X3(s,n.value),t,5,[s])};return n.value=e,n.attached=q3(),n}function X3(e,t){if(ne(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(s=>r=>!r._stopped&&s&&s(r))}else return t}const lu=/^on[a-z]/,Z3=(e,t,n,s,r=!1,a,o,i,l)=>{t===\"class\"?U3(e,s,r):t===\"style\"?Y3(e,n,s):La(t)?vi(t)||G3(e,t,n,s,o):(t[0]===\".\"?(t=t.slice(1),!0):t[0]===\"^\"?(t=t.slice(1),!1):Q3(e,t,s,r))?V3(e,t,s,a,o,i,l):(t===\"true-value\"?e._trueValue=s:t===\"false-value\"&&(e._falseValue=s),W3(e,t,s,r))};function Q3(e,t,n,s){return s?!!(t===\"innerHTML\"||t===\"textContent\"||t in e&&lu.test(t)&&ye(n)):t===\"spellcheck\"||t===\"draggable\"||t===\"translate\"||t===\"form\"||t===\"list\"&&e.tagName===\"INPUT\"||t===\"type\"&&e.tagName===\"TEXTAREA\"||lu.test(t)&&et(n)?!1:t in e}const Rn=\"transition\",hr=\"animation\",ja=(e,{slots:t})=>Jr(K0,e2(e),t);ja.displayName=\"Transition\";const Dd={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};ja.props=ot({},od,Dd);const ps=(e,t=[])=>{ne(e)?e.forEach(n=>n(...t)):e&&e(...t)},uu=e=>e?ne(e)?e.some(t=>t.length>1):e.length>1:!1;function e2(e){const t={};for(const H in e)H in Dd||(t[H]=e[H]);if(e.css===!1)return t;const{name:n=\"v\",type:s,duration:r,enterFromClass:a=`${n}-enter-from`,enterActiveClass:o=`${n}-enter-active`,enterToClass:i=`${n}-enter-to`,appearFromClass:l=a,appearActiveClass:u=o,appearToClass:c=i,leaveFromClass:_=`${n}-leave-from`,leaveActiveClass:p=`${n}-leave-active`,leaveToClass:y=`${n}-leave-to`}=e,E=t2(r),k=E&&E[0],S=E&&E[1],{onBeforeEnter:m,onEnter:w,onEnterCancelled:P,onLeave:b,onLeaveCancelled:D,onBeforeAppear:I=m,onAppear:V=w,onAppearCancelled:M=P}=t,U=(H,ie,Me)=>{ms(H,ie?c:i),ms(H,ie?u:o),Me&&Me()},ee=(H,ie)=>{H._isLeaving=!1,ms(H,_),ms(H,y),ms(H,p),ie&&ie()},_e=H=>(ie,Me)=>{const qe=H?V:w,de=()=>U(ie,H,Me);ps(qe,[ie,de]),cu(()=>{ms(ie,H?l:a),Bn(ie,H?c:i),uu(qe)||du(ie,s,k,de)})};return ot(t,{onBeforeEnter(H){ps(m,[H]),Bn(H,a),Bn(H,o)},onBeforeAppear(H){ps(I,[H]),Bn(H,l),Bn(H,u)},onEnter:_e(!1),onAppear:_e(!0),onLeave(H,ie){H._isLeaving=!0;const Me=()=>ee(H,ie);Bn(H,_),r2(),Bn(H,p),cu(()=>{!H._isLeaving||(ms(H,_),Bn(H,y),uu(b)||du(H,s,S,Me))}),ps(b,[H,Me])},onEnterCancelled(H){U(H,!1),ps(P,[H])},onAppearCancelled(H){U(H,!0),ps(M,[H])},onLeaveCancelled(H){ee(H),ps(D,[H])}})}function t2(e){if(e==null)return null;if(Ye(e))return[ko(e.enter),ko(e.leave)];{const t=ko(e);return[t,t]}}function ko(e){return Dc(e)}function Bn(e,t){t.split(/\\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function ms(e,t){t.split(/\\s+/).forEach(s=>s&&e.classList.remove(s));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function cu(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let n2=0;function du(e,t,n,s){const r=e._endId=++n2,a=()=>{r===e._endId&&s()};if(n)return setTimeout(a,n);const{type:o,timeout:i,propCount:l}=s2(e,t);if(!o)return s();const u=o+\"end\";let c=0;const _=()=>{e.removeEventListener(u,p),a()},p=y=>{y.target===e&&++c>=l&&_()};setTimeout(()=>{c<l&&_()},i+1),e.addEventListener(u,p)}function s2(e,t){const n=window.getComputedStyle(e),s=E=>(n[E]||\"\").split(\", \"),r=s(`${Rn}Delay`),a=s(`${Rn}Duration`),o=fu(r,a),i=s(`${hr}Delay`),l=s(`${hr}Duration`),u=fu(i,l);let c=null,_=0,p=0;t===Rn?o>0&&(c=Rn,_=o,p=a.length):t===hr?u>0&&(c=hr,_=u,p=l.length):(_=Math.max(o,u),c=_>0?o>u?Rn:hr:null,p=c?c===Rn?a.length:l.length:0);const y=c===Rn&&/\\b(transform|all)(,|$)/.test(s(`${Rn}Property`).toString());return{type:c,timeout:_,propCount:p,hasTransform:y}}function fu(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,s)=>hu(n)+hu(e[s])))}function hu(e){return Number(e.slice(0,-1).replace(\",\",\".\"))*1e3}function r2(){return document.body.offsetHeight}const as=e=>{const t=e.props[\"onUpdate:modelValue\"]||!1;return ne(t)?n=>_a(t,n):t};function a2(e){e.target.composing=!0}function _u(e){const t=e.target;t.composing&&(t.composing=!1,t.dispatchEvent(new Event(\"input\")))}const nn={created(e,{modifiers:{lazy:t,trim:n,number:s}},r){e._assign=as(r);const a=s||r.props&&r.props.type===\"number\";Tn(e,t?\"change\":\"input\",o=>{if(o.target.composing)return;let i=e.value;n&&(i=i.trim()),a&&(i=Ea(i)),e._assign(i)}),n&&Tn(e,\"change\",()=>{e.value=e.value.trim()}),t||(Tn(e,\"compositionstart\",a2),Tn(e,\"compositionend\",_u),Tn(e,\"change\",_u))},mounted(e,{value:t}){e.value=t==null?\"\":t},beforeUpdate(e,{value:t,modifiers:{lazy:n,trim:s,number:r}},a){if(e._assign=as(a),e.composing||document.activeElement===e&&e.type!==\"range\"&&(n||s&&e.value.trim()===t||(r||e.type===\"number\")&&Ea(e.value)===t))return;const o=t==null?\"\":t;e.value!==o&&(e.value=o)}},Hi={deep:!0,created(e,t,n){e._assign=as(n),Tn(e,\"change\",()=>{const s=e._modelValue,r=qs(e),a=e.checked,o=e._assign;if(ne(s)){const i=ki(s,r),l=i!==-1;if(a&&!l)o(s.concat(r));else if(!a&&l){const u=[...s];u.splice(i,1),o(u)}}else if(er(s)){const i=new Set(s);a?i.add(r):i.delete(r),o(i)}else o(Pd(e,a))})},mounted:pu,beforeUpdate(e,t,n){e._assign=as(n),pu(e,t,n)}};function pu(e,{value:t,oldValue:n},s){e._modelValue=t,ne(t)?e.checked=ki(t,s.props.value)>-1:er(t)?e.checked=t.has(s.props.value):t!==n&&(e.checked=Cs(t,Pd(e,!0)))}const es={created(e,{value:t},n){e.checked=Cs(t,n.props.value),e._assign=as(n),Tn(e,\"change\",()=>{e._assign(qs(e))})},beforeUpdate(e,{value:t,oldValue:n},s){e._assign=as(s),t!==n&&(e.checked=Cs(t,s.props.value))}},Od={deep:!0,created(e,{value:t,modifiers:{number:n}},s){const r=er(t);Tn(e,\"change\",()=>{const a=Array.prototype.filter.call(e.options,o=>o.selected).map(o=>n?Ea(qs(o)):qs(o));e._assign(e.multiple?r?new Set(a):a:a[0])}),e._assign=as(s)},mounted(e,{value:t}){mu(e,t)},beforeUpdate(e,t,n){e._assign=as(n)},updated(e,{value:t}){mu(e,t)}};function mu(e,t){const n=e.multiple;if(!(n&&!ne(t)&&!er(t))){for(let s=0,r=e.options.length;s<r;s++){const a=e.options[s],o=qs(a);if(n)ne(t)?a.selected=ki(t,o)>-1:a.selected=t.has(o);else if(Cs(qs(a),t)){e.selectedIndex!==s&&(e.selectedIndex=s);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function qs(e){return\"_value\"in e?e._value:e.value}function Pd(e,t){const n=t?\"_trueValue\":\"_falseValue\";return n in e?e[n]:t}const o2=[\"ctrl\",\"shift\",\"alt\",\"meta\"],i2={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>\"button\"in e&&e.button!==0,middle:e=>\"button\"in e&&e.button!==1,right:e=>\"button\"in e&&e.button!==2,exact:(e,t)=>o2.some(n=>e[`${n}Key`]&&!t.includes(n))},ls=(e,t)=>(n,...s)=>{for(let r=0;r<t.length;r++){const a=i2[t[r]];if(a&&a(n,t))return}return e(n,...s)},Ow={beforeMount(e,{value:t},{transition:n}){e._vod=e.style.display===\"none\"?\"\":e.style.display,n&&t?n.beforeEnter(e):_r(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:s}){!t!=!n&&(s?t?(s.beforeEnter(e),_r(e,!0),s.enter(e)):s.leave(e,()=>{_r(e,!1)}):_r(e,t))},beforeUnmount(e,{value:t}){_r(e,t)}};function _r(e,t){e.style.display=t?e._vod:\"none\"}const l2=ot({patchProp:Z3},B3);let gu;function Nd(){return gu||(gu=v3(l2))}const Ta=(...e)=>{Nd().render(...e)},Wi=(...e)=>{const t=Nd().createApp(...e),{mount:n}=t;return t.mount=s=>{const r=u2(s);if(!r)return;const a=t._component;!ye(a)&&!a.render&&!a.template&&(a.template=r.innerHTML),r.innerHTML=\"\";const o=n(r,!1,r instanceof SVGElement);return r instanceof Element&&(r.removeAttribute(\"v-cloak\"),r.setAttribute(\"data-v-app\",\"\")),o},t};function u2(e){return et(e)?document.querySelector(e):e}var c2={\\u5E94\\u7528\\u641C\\u7D22:\"App search\",\\u786E\\u8BA4:\"Confirm\",\\u53D6\\u6D88:\"Cancel\",\\u5B89\\u88C5\\u4EFB\\u52A1\\u8FDB\\u5EA6:\"Installation task progress\",\\u5B89\\u88C5\\u4EFB\\u52A1:\"Installation tasks\",\\u67E5\\u770B\\u65E5\\u5FD7:\"View log\",\\u6210\\u529F:\"Success\",\\u5931\\u8D25:\"Fail\",\\u9996\\u9875\\u6A21\\u5757\\u8BBE\\u7F6E:\"Home module settings\",\\u5411\\u5BFC\\u6A21\\u5F0F:\"Guide mode\",\\u5207\\u6362\\u81F3\\u666E\\u901A\\u7248\\u672C:\"Switch to normal version\",\\u6CE8\\u9500:\"Log out\",\\u5E38\\u7528\\u5DE5\\u5177:\"Tools\",\\u7EC8\\u7AEF:\"Terminal\",\\u56FA\\u4EF6\\u66F4\\u65B0:\"Firmware update\",\\u5185\\u7F51\\u914D\\u7F6E:\"Network setup\",\\u5730\\u5740:\"address\",\\u5B50\\u7F51\\u63A9\\u7801:\"subnet mask\",\\u4FDD\\u6301DHCP\\u670D\\u52A1\\u8BBE\\u7F6E:\"Keep DHCP service settings\",IP\\u6C60\\u8D77\\u59CB\\u5730\\u5740:\"IP pool starting address\",IP\\u6C60\\u7ED3\\u675F\\u5730\\u5740:\"IP pool end address\",DNS\\u914D\\u7F6E:\"DNS setup\",DNS\\u9009\\u9879:\"DNS options\",\\u81EA\\u52A8\\u83B7\\u53D6:\"Obtain DNS automatically\",\\u81EA\\u5B9A\\u4E49DNS:\"Custom DNS\",DNS\\u670D\\u52A1\\u5668\\u5730\\u5740:\"DNS server address\",\\u8BF7\\u8F93\\u5165DNS\\u5730\\u5740:\"Please enter DNS address\",\\u5907\\u7528DNS\\u670D\\u52A1\\u5668\\u5730\\u5740:\"Alternate DNS server address\",\\u5907\\u7528DNS\\u5730\\u5740:\"Alternate DNS address\",\\u8F6F\\u4EF6\\u6E90\\u914D\\u7F6E:\"Software source setup\",\\u5F53\\u524D\\u8F6F\\u4EF6\\u6E90:\"Current software source\",\\u5207\\u6362\\u8F6F\\u4EF6\\u6E90:\"Switch software source\",\\u8BF7\\u9009\\u62E9\\u8F6F\\u4EF6\\u6E90:\"Please select a software source\",\\u5F00\\u542F\\u6C99\\u7BB1:\"Sandbox setup\",\\u6C99\\u7BB1\\u6A21\\u5F0F\\u914D\\u7F6E\\u5411\\u5BFC:\"Sandbox mode configuration guide\",\\u6D41\\u91CF\\u7EDF\\u8BA1:\"Statistics\",\\u4E0A\\u4F20:\"Upload\",\\u4E0B\\u8F7D:\"Download\",\\u5DF2\\u8FDE\\u63A5\\u4E92\\u8054\\u7F51:\"Internet connected\",\\u5DF2\\u8FDE\\u63A5\\u8BBE\\u5907:\"Device\",IP\\u5730\\u5740:\"IP address\",\\u9759\\u6001\\u7F51\\u7EDC:\"Static network\",\\u624B\\u52A8\\u914D\\u7F6E:\"Manual configuration\",\\u7F51\\u7EDC\\u63A5\\u53E3\\u72B6\\u6001:\"Network interface\",\\u7F51\\u53E3\\u914D\\u7F6E:\"Network interface configuration\",\\u5DF2\\u65AD\\u5F00:\"Disconnected\",\\u7CFB\\u7EDF\\u4FE1\\u606F:\"System\",CPU\\u6E29\\u5EA6:\"CPU temperature\",CPU\\u4F7F\\u7528\\u7387:\"CPU usage\",\\u5185\\u5B58\\u4F7F\\u7528\\u7387:\"Memory usage\",\\u7CFB\\u7EDF\\u76D1\\u63A7:\"System monitor\",\\u5907\\u4EFD\\u5347\\u7EA7:\"Backup upgrade\",\\u63D2\\u4EF6\\u5907\\u4EFD:\"Plugin backup\",\\u8BBE\\u5907\\u578B\\u53F7:\"Device model\",\\u56FA\\u4EF6\\u7248\\u672C:\"Firmware version\",\\u5185\\u6838\\u7248\\u672C:\"Kernel version\",\\u5DF2\\u542F\\u52A8:\"Started\",\\u7CFB\\u7EDF\\u65F6\\u95F4:\"System time\",\\u78C1\\u76D8\\u4FE1\\u606F:\"Disk\",RAID\\u7BA1\\u7406:\"RAID management\",\\u78C1\\u76D8\\u7BA1\\u7406:\"Disk management\",\\u6302\\u8F7D\\u70B9:\"Mount point\",\\u7CFB\\u7EDF\\u6839\\u76EE\\u5F55:\"System root directory\",\\u5DF2\\u6302\\u8F7D\\u78C1\\u76D8:\"Disk mounted\",\\u5171\\u4EAB\\u529F\\u80FD:\"Sharing\",\\u5171\\u4EAB\\u6587\\u4EF6:\"Sharing file\",\\u65B0\\u589E:\"New\",\\u5171\\u4EAB\\u65B9\\u5F0F:\"Sharing method\",\\u8BFB\\u5199:\"Read and write\",\\u53EA\\u8BFB:\"Read-only\",\\u9009\\u62E9\\u4F4D\\u7F6E:\"Select location\",\\u5171\\u4EAB\\u540D\\u79F0:\"Share name\",\\u6D4F\\u89C8:\"Browse\",\\u4E0A\\u4E00\\u6B65:\"Previous\",\\u4E0B\\u4E00\\u6B65:\"Next\",\\u7528\\u6237:\"User\",\\u65E0\\u6743\\u9650:\"No permission\",\\u786E\\u8BA4\\u7528\\u6237\\u6743\\u9650:\"Confirm user permissions\",\\u5171\\u4EAB\\u7528\\u6237:\"shared user\",\\u59D3\\u540D:\"Name\",\\u5BC6\\u7801:\"Password\",\\u64CD\\u4F5C:\"Operate\",\\u67E5\\u770B\\u5BC6\\u7801:\"View password\",\\u7528\\u6237\\u540D:\"Username\",\\u7528\\u6237\\u5BC6\\u7801:\"User password\",\\u7F16\\u8F91\\u7528\\u6237:\"Edit user\",\\u5BC6\\u7801\\u786E\\u8BA4:\"Confirm password\",\\u8BF7\\u8F93\\u5165\\u7528\\u6237\\u540D:\"Please enter username\",\\u8BF7\\u8F93\\u5165\\u5BC6\\u7801:\"Please enter password\",\\u5173\\u95ED:\"Close\",\\u4FDD\\u5B58:\"Save\",\\u5171\\u4EAB\\u914D\\u7F6E:\"Shared configuration\",\\u6682\\u672A\\u5F00\\u653E:\"Not available yet\",\\u5176\\u4ED6\\u529F\\u80FD:\"Others\",\\u5411\\u5BFC\\u529F\\u80FD:\"Guide\",\\u6587\\u4EF6\\u7BA1\\u7406:\"File management\",\\u6587\\u4EF6\\u540C\\u6B65:\"File sync\",\\u76F8\\u518C\\u5907\\u4EFD:\"Album Backup\",\\u7F51\\u7EDC\\u5411\\u5BFC:\"Network guide\",\\u6B22\\u8FCE\\u4F7F\\u7528\\u7F51\\u7EDC\\u914D\\u7F6E\\u5411\\u5BFC:\"Welcome to the Network Configuration Guide\",\\u9009\\u62E9\\u4E00\\u79CD\\u8FDE\\u63A5\\u65B9\\u5F0F\\u4EE5\\u5F00\\u59CB:\"Select a connection method to get started\",\\u5BBD\\u5E26\\u62E8\\u53F7\\u8FDE\\u63A5:\"PPPOE connection\",\\u8FDE\\u63A5\\u73B0\\u6709\\u8DEF\\u7531\\u5668:\"Connect to existing router\",\"\\u6CA1\\u627E\\u5230\\u60F3\\u8981\\u7684\\u914D\\u7F6E\\uFF1F\\u8BF7\\u4F7F\\u7528\":\"Didn't find the configuration you wanted? please use\",\\u9AD8\\u7EA7\\u6A21\\u5F0F:\"Advanced mode\",NAS\\u5411\\u5BFC:\"NAS guide\",\\u6B22\\u8FCE\\u4F7F\\u7528iStoreOS:\"Welcome to iStoreOS\",\\u5E94\\u7528\\u4E2D\\u5FC3:\"App Center\",\\u5E94\\u7528\\u5546\\u5E97:\"App Store\",\\u53EF\\u66F4\\u65B0:\"Updatable\",\\u5DF2\\u5B89\\u88C5:\"Installed\",\\u66F4\\u65B0:\"Update\",\\u5378\\u8F7D:\"Uninstall\",\\u6253\\u5F00:\"Open\",\\u5B89\\u88C5:\"Install\",\\u5168\\u90E8\\u8F6F\\u4EF6:\"All software\",\\u670D\\u52A1\\u72B6\\u6001:\"Service\",\\u8FDC\\u7A0B\\u57DF\\u540D:\"Remote domain name\",\\u5FEB\\u901F\\u914D\\u7F6E:\"Quick Setup\",\\u57DF\\u540D\\u5FEB\\u901F\\u914D\\u7F6E:\"Quick configuration of domain name\",\\u63A7\\u5236\\u53F0:\"Control console\",\\u7F16\\u8F91:\"Edit\",\\u5F53\\u524D\\u72B6\\u6001:\"Current status\",\\u6839\\u76EE\\u5F55:\"Root directory\",\\u67E5\\u770BDocker\\u4FE1\\u606F:\"View Docker information\",\\u8FC1\\u79FB\\u5411\\u5BFC:\"Migration guide\",\\u8FC1\\u79FB\\u5230:\"migrated to\",\\u8BF7\\u9009\\u62E9\\u8FC1\\u79FB\\u5730\\u5740:\"Please select a migration address\",\\u81EA\\u5B9A\\u4E49:\"Customize\",\\u9AD8\\u7EA7\\u914D\\u7F6E:\"Advanced configuration\",\\u4E0B\\u8F7D\\u670D\\u52A1:\"Download\",\\u6682\\u65E0\\u4E0B\\u8F7D:\"No download yet\",\\u4E0B\\u8F7D\\u76EE\\u5F55:\"Download directory\",\\u7F51\\u7EDC\\u5730\\u5740:\"Network address\",\\u672A\\u542F\\u52A8:\"Not started\",\\u4E0B\\u8F7D\\u670D\\u52A1\\u914D\\u7F6E\\u5411\\u5BFC:\"Download service configuration guide\",\\u914D\\u7F6E\\u76EE\\u5F55:\"Configuration directory\",RPC\\u4EE4\\u724C:\"RPC token\",\\u9644\\u52A0\\u7684:\"Additional\",\\u9ED8\\u8BA4:\"Default\",\\u81EA\\u5DF1\\u6DFB\\u52A0:\"Add it yourself\",\\u542F\\u7528:\"Enable\",\\u5171\\u4EAB\\u8BBE\\u7F6E:\"Share settings\",\\u53F0:\"pcs\"},d2={\\u5E94\\u7528\\u641C\\u7D22:\"\\u5E94\\u7528\\u641C\\u7D22\",\\u786E\\u8BA4:\"\\u786E\\u8BA4\",\\u53D6\\u6D88:\"\\u53D6\\u6D88\",\\u5B89\\u88C5\\u4EFB\\u52A1\\u8FDB\\u5EA6:\"\\u5B89\\u88C5\\u4EFB\\u52A1\\u8FDB\\u5EA6\",\\u5B89\\u88C5\\u4EFB\\u52A1:\"\\u5B89\\u88C5\\u4EFB\\u52A1\",\\u67E5\\u770B\\u65E5\\u5FD7:\"\\u67E5\\u770B\\u65E5\\u5FD7\",\\u6210\\u529F:\"\\u6210\\u529F\",\\u5931\\u8D25:\"\\u5931\\u8D25\",\\u9996\\u9875\\u6A21\\u5757\\u8BBE\\u7F6E:\"\\u9996\\u9875\\u6A21\\u5757\\u8BBE\\u7F6E\",\\u5411\\u5BFC\\u6A21\\u5F0F:\"\\u5411\\u5BFC\\u6A21\\u5F0F\",\\u5207\\u6362\\u81F3\\u666E\\u901A\\u7248\\u672C:\"\\u5207\\u6362\\u81F3\\u666E\\u901A\\u7248\\u672C\",\\u6CE8\\u9500:\"\\u6CE8\\u9500\",\\u5E38\\u7528\\u5DE5\\u5177:\"\\u5E38\\u7528\\u5DE5\\u5177\",\\u7EC8\\u7AEF:\"\\u7EC8\\u7AEF\",\\u56FA\\u4EF6\\u66F4\\u65B0:\"\\u56FA\\u4EF6\\u66F4\\u65B0\",\\u5185\\u7F51\\u914D\\u7F6E:\"\\u5185\\u7F51\\u914D\\u7F6E\",\\u5730\\u5740:\"\\u5730\\u5740\",\\u5B50\\u7F51\\u63A9\\u7801:\"\\u5B50\\u7F51\\u63A9\\u7801\",\\u4FDD\\u6301DHCP\\u670D\\u52A1\\u8BBE\\u7F6E:\"\\u4FDD\\u6301DHCP\\u670D\\u52A1\\u8BBE\\u7F6E\",IP\\u6C60\\u8D77\\u59CB\\u5730\\u5740:\"IP\\u6C60\\u8D77\\u59CB\\u5730\\u5740\",IP\\u6C60\\u7ED3\\u675F\\u5730\\u5740:\"IP\\u6C60\\u7ED3\\u675F\\u5730\\u5740\",DNS\\u914D\\u7F6E:\"DNS\\u914D\\u7F6E\",DNS\\u9009\\u9879:\"DNS\\u9009\\u9879\",\\u81EA\\u52A8\\u83B7\\u53D6:\"\\u81EA\\u52A8\\u83B7\\u53D6\",\\u81EA\\u5B9A\\u4E49DNS:\"\\u81EA\\u5B9A\\u4E49DNS\",DNS\\u670D\\u52A1\\u5668\\u5730\\u5740:\"DNS\\u670D\\u52A1\\u5668\\u5730\\u5740\",\\u8BF7\\u8F93\\u5165DNS\\u5730\\u5740:\"\\u8BF7\\u8F93\\u5165DNS\\u5730\\u5740\",\\u5907\\u7528DNS\\u670D\\u52A1\\u5668\\u5730\\u5740:\"\\u5907\\u7528DNS\\u670D\\u52A1\\u5668\\u5730\\u5740\",\\u5907\\u7528DNS\\u5730\\u5740:\"\\u5907\\u7528DNS\\u5730\\u5740\",\\u8F6F\\u4EF6\\u6E90\\u914D\\u7F6E:\"\\u8F6F\\u4EF6\\u6E90\\u914D\\u7F6E\",\\u5F53\\u524D\\u8F6F\\u4EF6\\u6E90:\"\\u5F53\\u524D\\u8F6F\\u4EF6\\u6E90\",\\u5207\\u6362\\u8F6F\\u4EF6\\u6E90:\"\\u5207\\u6362\\u8F6F\\u4EF6\\u6E90\",\\u8BF7\\u9009\\u62E9\\u8F6F\\u4EF6\\u6E90:\"\\u8BF7\\u9009\\u62E9\\u8F6F\\u4EF6\\u6E90\",\\u5F00\\u542F\\u6C99\\u7BB1:\"\\u5F00\\u542F\\u6C99\\u7BB1\",\\u6C99\\u7BB1\\u6A21\\u5F0F\\u914D\\u7F6E\\u5411\\u5BFC:\"\\u6C99\\u7BB1\\u6A21\\u5F0F\\u914D\\u7F6E\\u5411\\u5BFC\",\\u6D41\\u91CF\\u7EDF\\u8BA1:\"\\u6D41\\u91CF\\u7EDF\\u8BA1\",\\u4E0A\\u4F20:\"\\u4E0A\\u4F20\",\\u4E0B\\u8F7D:\"\\u4E0B\\u8F7D\",\\u5DF2\\u8FDE\\u63A5\\u4E92\\u8054\\u7F51:\"\\u5DF2\\u8FDE\\u63A5\\u4E92\\u8054\\u7F51\",\\u5DF2\\u8FDE\\u63A5\\u8BBE\\u5907:\"\\u5DF2\\u8FDE\\u63A5\\u8BBE\\u5907\",IP\\u5730\\u5740:\"IP\\u5730\\u5740\",\\u9759\\u6001\\u7F51\\u7EDC:\"\\u9759\\u6001\\u7F51\\u7EDC\",\\u624B\\u52A8\\u914D\\u7F6E:\"\\u624B\\u52A8\\u914D\\u7F6E\",\\u7F51\\u7EDC\\u63A5\\u53E3\\u72B6\\u6001:\"\\u7F51\\u7EDC\\u63A5\\u53E3\\u72B6\\u6001\",\\u7F51\\u53E3\\u914D\\u7F6E:\"\\u7F51\\u53E3\\u914D\\u7F6E\",\\u5DF2\\u65AD\\u5F00:\"\\u5DF2\\u65AD\\u5F00\",\\u7CFB\\u7EDF\\u4FE1\\u606F:\"\\u7CFB\\u7EDF\\u4FE1\\u606F\",CPU\\u6E29\\u5EA6:\"CPU\\u6E29\\u5EA6\",CPU\\u4F7F\\u7528\\u7387:\"CPU\\u4F7F\\u7528\\u7387\",\\u5185\\u5B58\\u4F7F\\u7528\\u7387:\"\\u5185\\u5B58\\u4F7F\\u7528\\u7387\",\\u7CFB\\u7EDF\\u76D1\\u63A7:\"\\u7CFB\\u7EDF\\u76D1\\u63A7\",\\u5907\\u4EFD\\u5347\\u7EA7:\"\\u5907\\u4EFD\\u5347\\u7EA7\",\\u63D2\\u4EF6\\u5907\\u4EFD:\"\\u63D2\\u4EF6\\u5907\\u4EFD\",\\u8BBE\\u5907\\u578B\\u53F7:\"\\u8BBE\\u5907\\u578B\\u53F7\",\\u56FA\\u4EF6\\u7248\\u672C:\"\\u56FA\\u4EF6\\u7248\\u672C\",\\u5185\\u6838\\u7248\\u672C:\"\\u5185\\u6838\\u7248\\u672C\",\\u5DF2\\u542F\\u52A8:\"\\u5DF2\\u542F\\u52A8\",\\u7CFB\\u7EDF\\u65F6\\u95F4:\"\\u7CFB\\u7EDF\\u65F6\\u95F4\",\\u78C1\\u76D8\\u4FE1\\u606F:\"\\u78C1\\u76D8\\u4FE1\\u606F\",RAID\\u7BA1\\u7406:\"RAID\\u7BA1\\u7406\",\\u78C1\\u76D8\\u7BA1\\u7406:\"\\u78C1\\u76D8\\u7BA1\\u7406\",\\u6302\\u8F7D\\u70B9:\"\\u6302\\u8F7D\\u70B9\",\\u7CFB\\u7EDF\\u6839\\u76EE\\u5F55:\"\\u7CFB\\u7EDF\\u6839\\u76EE\\u5F55\",\\u5DF2\\u6302\\u8F7D\\u78C1\\u76D8:\"\\u5DF2\\u6302\\u8F7D\\u78C1\\u76D8\",\\u5171\\u4EAB\\u529F\\u80FD:\"\\u5171\\u4EAB\\u529F\\u80FD\",\\u5171\\u4EAB\\u6587\\u4EF6:\"\\u5171\\u4EAB\\u6587\\u4EF6\",\\u65B0\\u589E:\"\\u65B0\\u589E\",\\u5171\\u4EAB\\u65B9\\u5F0F:\"\\u5171\\u4EAB\\u65B9\\u5F0F\",\\u8BFB\\u5199:\"\\u8BFB\\u5199\",\\u53EA\\u8BFB:\"\\u53EA\\u8BFB\",\\u9009\\u62E9\\u4F4D\\u7F6E:\"\\u9009\\u62E9\\u4F4D\\u7F6E\",\\u5171\\u4EAB\\u540D\\u79F0:\"\\u5171\\u4EAB\\u540D\\u79F0\",\\u6D4F\\u89C8:\"\\u6D4F\\u89C8\",\\u4E0A\\u4E00\\u6B65:\"\\u4E0A\\u4E00\\u6B65\",\\u4E0B\\u4E00\\u6B65:\"\\u4E0B\\u4E00\\u6B65\",\\u7528\\u6237:\"\\u7528\\u6237\",\\u65E0\\u6743\\u9650:\"\\u65E0\\u6743\\u9650\",\\u786E\\u8BA4\\u7528\\u6237\\u6743\\u9650:\"\\u786E\\u8BA4\\u7528\\u6237\\u6743\\u9650\",\\u5171\\u4EAB\\u7528\\u6237:\"\\u5171\\u4EAB\\u7528\\u6237\",\\u59D3\\u540D:\"\\u59D3\\u540D\",\\u5BC6\\u7801:\"\\u5BC6\\u7801\",\\u64CD\\u4F5C:\"\\u64CD\\u4F5C\",\\u67E5\\u770B\\u5BC6\\u7801:\"\\u67E5\\u770B\\u5BC6\\u7801\",\\u7528\\u6237\\u540D:\"\\u7528\\u6237\\u540D\",\\u7528\\u6237\\u5BC6\\u7801:\"\\u7528\\u6237\\u5BC6\\u7801\",\\u7F16\\u8F91\\u7528\\u6237:\"\\u7F16\\u8F91\\u7528\\u6237\",\\u5BC6\\u7801\\u786E\\u8BA4:\"\\u5BC6\\u7801\\u786E\\u8BA4\",\\u8BF7\\u8F93\\u5165\\u7528\\u6237\\u540D:\"\\u8BF7\\u8F93\\u5165\\u7528\\u6237\\u540D\",\\u8BF7\\u8F93\\u5165\\u5BC6\\u7801:\"\\u8BF7\\u8F93\\u5165\\u5BC6\\u7801\",\\u5173\\u95ED:\"\\u5173\\u95ED\",\\u4FDD\\u5B58:\"\\u4FDD\\u5B58\",\\u5171\\u4EAB\\u914D\\u7F6E:\"\\u5171\\u4EAB\\u914D\\u7F6E\",\\u6682\\u672A\\u5F00\\u653E:\"\\u6682\\u672A\\u5F00\\u653E\",\\u5176\\u4ED6\\u529F\\u80FD:\"\\u5176\\u4ED6\\u529F\\u80FD\",\\u5411\\u5BFC\\u529F\\u80FD:\"\\u5411\\u5BFC\\u529F\\u80FD\",\\u6587\\u4EF6\\u7BA1\\u7406:\"\\u6587\\u4EF6\\u7BA1\\u7406\",\\u6587\\u4EF6\\u540C\\u6B65:\"\\u6587\\u4EF6\\u540C\\u6B65\",\\u76F8\\u518C\\u5907\\u4EFD:\"\\u76F8\\u518C\\u5907\\u4EFD\",\\u7F51\\u7EDC\\u5411\\u5BFC:\"\\u7F51\\u7EDC\\u5411\\u5BFC\",\\u6B22\\u8FCE\\u4F7F\\u7528\\u7F51\\u7EDC\\u914D\\u7F6E\\u5411\\u5BFC:\"\\u6B22\\u8FCE\\u4F7F\\u7528\\u7F51\\u7EDC\\u914D\\u7F6E\\u5411\\u5BFC\",\\u9009\\u62E9\\u4E00\\u79CD\\u8FDE\\u63A5\\u65B9\\u5F0F\\u4EE5\\u5F00\\u59CB:\"\\u9009\\u62E9\\u4E00\\u79CD\\u8FDE\\u63A5\\u65B9\\u5F0F\\u4EE5\\u5F00\\u59CB\",\\u5BBD\\u5E26\\u62E8\\u53F7\\u8FDE\\u63A5:\"\\u5BBD\\u5E26\\u62E8\\u53F7\\u8FDE\\u63A5\",\\u8FDE\\u63A5\\u73B0\\u6709\\u8DEF\\u7531\\u5668:\"\\u8FDE\\u63A5\\u73B0\\u6709\\u8DEF\\u7531\\u5668\",\"\\u6CA1\\u627E\\u5230\\u60F3\\u8981\\u7684\\u914D\\u7F6E\\uFF1F\\u8BF7\\u4F7F\\u7528\":\"\\u6CA1\\u627E\\u5230\\u60F3\\u8981\\u7684\\u914D\\u7F6E\\uFF1F\\u8BF7\\u4F7F\\u7528\",\\u9AD8\\u7EA7\\u6A21\\u5F0F:\"\\u9AD8\\u7EA7\\u6A21\\u5F0F\",NAS\\u5411\\u5BFC:\"NAS\\u5411\\u5BFC\",\\u6B22\\u8FCE\\u4F7F\\u7528iStoreOS:\"\\u6B22\\u8FCE\\u4F7F\\u7528iStoreOS\",\\u5E94\\u7528\\u4E2D\\u5FC3:\"\\u5E94\\u7528\\u4E2D\\u5FC3\",\\u5E94\\u7528\\u5546\\u5E97:\"\\u5E94\\u7528\\u5546\\u5E97\",\\u53EF\\u66F4\\u65B0:\"\\u53EF\\u66F4\\u65B0\",\\u5DF2\\u5B89\\u88C5:\"\\u5DF2\\u5B89\\u88C5\",\\u66F4\\u65B0:\"\\u66F4\\u65B0\",\\u5378\\u8F7D:\"\\u5378\\u8F7D\",\\u6253\\u5F00:\"\\u6253\\u5F00\",\\u5B89\\u88C5:\"\\u5B89\\u88C5\",\\u5168\\u90E8\\u8F6F\\u4EF6:\"\\u5168\\u90E8\\u8F6F\\u4EF6\",\\u670D\\u52A1\\u72B6\\u6001:\"\\u670D\\u52A1\\u72B6\\u6001\",\\u8FDC\\u7A0B\\u57DF\\u540D:\"\\u8FDC\\u7A0B\\u57DF\\u540D\",\\u5FEB\\u901F\\u914D\\u7F6E:\"\\u5FEB\\u901F\\u914D\\u7F6E\",\\u57DF\\u540D\\u5FEB\\u901F\\u914D\\u7F6E:\"\\u57DF\\u540D\\u5FEB\\u901F\\u914D\\u7F6E\",\\u63A7\\u5236\\u53F0:\"\\u63A7\\u5236\\u53F0\",\\u7F16\\u8F91:\"\\u7F16\\u8F91\",\\u5F53\\u524D\\u72B6\\u6001:\"\\u5F53\\u524D\\u72B6\\u6001\",\\u6839\\u76EE\\u5F55:\"\\u6839\\u76EE\\u5F55\",\\u67E5\\u770BDocker\\u4FE1\\u606F:\"\\u67E5\\u770BDocker\\u4FE1\\u606F\",\\u8FC1\\u79FB\\u5411\\u5BFC:\"\\u8FC1\\u79FB\\u5411\\u5BFC\",\\u8FC1\\u79FB\\u5230:\"\\u8FC1\\u79FB\\u5230\",\\u8BF7\\u9009\\u62E9\\u8FC1\\u79FB\\u5730\\u5740:\"\\u8BF7\\u9009\\u62E9\\u8FC1\\u79FB\\u5730\\u5740\",\\u81EA\\u5B9A\\u4E49:\"\\u81EA\\u5B9A\\u4E49\",\\u9AD8\\u7EA7\\u914D\\u7F6E:\"\\u9AD8\\u7EA7\\u914D\\u7F6E\",\\u4E0B\\u8F7D\\u670D\\u52A1:\"\\u4E0B\\u8F7D\\u670D\\u52A1\",\\u6682\\u65E0\\u4E0B\\u8F7D:\"\\u6682\\u65E0\\u4E0B\\u8F7D\",\\u4E0B\\u8F7D\\u76EE\\u5F55:\"\\u4E0B\\u8F7D\\u76EE\\u5F55\",\\u7F51\\u7EDC\\u5730\\u5740:\"\\u7F51\\u7EDC\\u5730\\u5740\",\\u672A\\u542F\\u52A8:\"\\u672A\\u542F\\u52A8\",\\u4E0B\\u8F7D\\u670D\\u52A1\\u914D\\u7F6E\\u5411\\u5BFC:\"\\u4E0B\\u8F7D\\u670D\\u52A1\\u914D\\u7F6E\\u5411\\u5BFC\",\\u914D\\u7F6E\\u76EE\\u5F55:\"\\u914D\\u7F6E\\u76EE\\u5F55\",RPC\\u4EE4\\u724C:\"RPC\\u4EE4\\u724C\",\\u9644\\u52A0\\u7684:\"\\u9644\\u52A0\\u7684\",\\u9ED8\\u8BA4:\"\\u9ED8\\u8BA4\",\\u81EA\\u5DF1\\u6DFB\\u52A0:\"\\u81EA\\u5DF1\\u6DFB\\u52A0\",\\u542F\\u7528:\"\\u542F\\u7528\",\\u5171\\u4EAB\\u8BBE\\u7F6E:\"\\u5171\\u4EAB\\u8BBE\\u7F6E\",\\u53F0:\"\\u53F0\"},f2={\\u5E94\\u7528\\u641C\\u7D22:\"\\u7E41\\u4F53DEMOOOOO\",\\u786E\\u8BA4:\"\\u786E\\u8BA4\",\\u53D6\\u6D88:\"\\u53D6\\u6D88\",\\u5B89\\u88C5\\u4EFB\\u52A1\\u8FDB\\u5EA6:\"\\u5B89\\u88C5\\u4EFB\\u52A1\\u8FDB\\u5EA6\",\\u5B89\\u88C5\\u4EFB\\u52A1:\"\\u5B89\\u88C5\\u4EFB\\u52A1\",\\u67E5\\u770B\\u65E5\\u5FD7:\"\\u67E5\\u770B\\u65E5\\u5FD7\",\\u6210\\u529F:\"\\u6210\\u529F\",\\u5931\\u8D25:\"\\u5931\\u8D25\",\\u9996\\u9875\\u6A21\\u5757\\u8BBE\\u7F6E:\"\\u9996\\u9875\\u6A21\\u5757\\u8BBE\\u7F6E\",\\u5411\\u5BFC\\u6A21\\u5F0F:\"\\u5411\\u5BFC\\u6A21\\u5F0F\",\\u5207\\u6362\\u81F3\\u666E\\u901A\\u7248\\u672C:\"\\u5207\\u6362\\u81F3\\u666E\\u901A\\u7248\\u672C\",\\u6CE8\\u9500:\"\\u6CE8\\u9500\",\\u5E38\\u7528\\u5DE5\\u5177:\"\\u5E38\\u7528\\u5DE5\\u5177\",\\u7EC8\\u7AEF:\"\\u7EC8\\u7AEF\",\\u56FA\\u4EF6\\u66F4\\u65B0:\"\\u56FA\\u4EF6\\u66F4\\u65B0\",\\u5185\\u7F51\\u914D\\u7F6E:\"\\u5185\\u7F51\\u914D\\u7F6E\",\\u5730\\u5740:\"\\u5730\\u5740\",\\u5B50\\u7F51\\u63A9\\u7801:\"\\u5B50\\u7F51\\u63A9\\u7801\",\\u4FDD\\u6301DHCP\\u670D\\u52A1\\u8BBE\\u7F6E:\"\\u4FDD\\u6301DHCP\\u670D\\u52A1\\u8BBE\\u7F6E\",IP\\u6C60\\u8D77\\u59CB\\u5730\\u5740:\"IP\\u6C60\\u8D77\\u59CB\\u5730\\u5740\",IP\\u6C60\\u7ED3\\u675F\\u5730\\u5740:\"IP\\u6C60\\u7ED3\\u675F\\u5730\\u5740\",DNS\\u914D\\u7F6E:\"DNS\\u914D\\u7F6E\",DNS\\u9009\\u9879:\"DNS\\u9009\\u9879\",\\u81EA\\u52A8\\u83B7\\u53D6:\"\\u81EA\\u52A8\\u83B7\\u53D6\",\\u81EA\\u5B9A\\u4E49DNS:\"\\u81EA\\u5B9A\\u4E49DNS\",DNS\\u670D\\u52A1\\u5668\\u5730\\u5740:\"DNS\\u670D\\u52A1\\u5668\\u5730\\u5740\",\\u8BF7\\u8F93\\u5165DNS\\u5730\\u5740:\"\\u8BF7\\u8F93\\u5165DNS\\u5730\\u5740\",\\u5907\\u7528DNS\\u670D\\u52A1\\u5668\\u5730\\u5740:\"\\u5907\\u7528DNS\\u670D\\u52A1\\u5668\\u5730\\u5740\",\\u5907\\u7528DNS\\u5730\\u5740:\"\\u5907\\u7528DNS\\u5730\\u5740\",\\u8F6F\\u4EF6\\u6E90\\u914D\\u7F6E:\"\\u8F6F\\u4EF6\\u6E90\\u914D\\u7F6E\",\\u5F53\\u524D\\u8F6F\\u4EF6\\u6E90:\"\\u5F53\\u524D\\u8F6F\\u4EF6\\u6E90\",\\u5207\\u6362\\u8F6F\\u4EF6\\u6E90:\"\\u5207\\u6362\\u8F6F\\u4EF6\\u6E90\",\\u8BF7\\u9009\\u62E9\\u8F6F\\u4EF6\\u6E90:\"\\u8BF7\\u9009\\u62E9\\u8F6F\\u4EF6\\u6E90\",\\u5F00\\u542F\\u6C99\\u7BB1:\"\\u5F00\\u542F\\u6C99\\u7BB1\",\\u6C99\\u7BB1\\u6A21\\u5F0F\\u914D\\u7F6E\\u5411\\u5BFC:\"\\u6C99\\u7BB1\\u6A21\\u5F0F\\u914D\\u7F6E\\u5411\\u5BFC\",\\u6D41\\u91CF\\u7EDF\\u8BA1:\"\\u6D41\\u91CF\\u7EDF\\u8BA1\",\\u4E0A\\u4F20:\"\\u4E0A\\u4F20\",\\u4E0B\\u8F7D:\"\\u4E0B\\u8F7D\",\\u5DF2\\u8FDE\\u63A5\\u4E92\\u8054\\u7F51:\"\\u5DF2\\u8FDE\\u63A5\\u4E92\\u8054\\u7F51\",\\u5DF2\\u8FDE\\u63A5\\u8BBE\\u5907:\"\\u5DF2\\u8FDE\\u63A5\\u8BBE\\u5907\",IP\\u5730\\u5740:\"IP\\u5730\\u5740\",\\u9759\\u6001\\u7F51\\u7EDC:\"\\u9759\\u6001\\u7F51\\u7EDC\",\\u624B\\u52A8\\u914D\\u7F6E:\"\\u624B\\u52A8\\u914D\\u7F6E\",\\u7F51\\u7EDC\\u63A5\\u53E3\\u72B6\\u6001:\"\\u7F51\\u7EDC\\u63A5\\u53E3\\u72B6\\u6001\",\\u7F51\\u53E3\\u914D\\u7F6E:\"\\u7F51\\u53E3\\u914D\\u7F6E\",\\u5DF2\\u65AD\\u5F00:\"\\u5DF2\\u65AD\\u5F00\",\\u7CFB\\u7EDF\\u4FE1\\u606F:\"\\u7CFB\\u7EDF\\u4FE1\\u606F\",CPU\\u6E29\\u5EA6:\"CPU\\u6E29\\u5EA6\",CPU\\u4F7F\\u7528\\u7387:\"CPU\\u4F7F\\u7528\\u7387\",\\u5185\\u5B58\\u4F7F\\u7528\\u7387:\"\\u5185\\u5B58\\u4F7F\\u7528\\u7387\",\\u7CFB\\u7EDF\\u76D1\\u63A7:\"\\u7CFB\\u7EDF\\u76D1\\u63A7\",\\u5907\\u4EFD\\u5347\\u7EA7:\"\\u5907\\u4EFD\\u5347\\u7EA7\",\\u63D2\\u4EF6\\u5907\\u4EFD:\"\\u63D2\\u4EF6\\u5907\\u4EFD\",\\u8BBE\\u5907\\u578B\\u53F7:\"\\u8BBE\\u5907\\u578B\\u53F7\",\\u56FA\\u4EF6\\u7248\\u672C:\"\\u56FA\\u4EF6\\u7248\\u672C\",\\u5185\\u6838\\u7248\\u672C:\"\\u5185\\u6838\\u7248\\u672C\",\\u5DF2\\u542F\\u52A8:\"\\u5DF2\\u542F\\u52A8\",\\u7CFB\\u7EDF\\u65F6\\u95F4:\"\\u7CFB\\u7EDF\\u65F6\\u95F4\",\\u78C1\\u76D8\\u4FE1\\u606F:\"\\u78C1\\u76D8\\u4FE1\\u606F\",RAID\\u7BA1\\u7406:\"RAID\\u7BA1\\u7406\",\\u78C1\\u76D8\\u7BA1\\u7406:\"\\u78C1\\u76D8\\u7BA1\\u7406\",\\u6302\\u8F7D\\u70B9:\"\\u6302\\u8F7D\\u70B9\",\\u7CFB\\u7EDF\\u6839\\u76EE\\u5F55:\"\\u7CFB\\u7EDF\\u6839\\u76EE\\u5F55\",\\u5DF2\\u6302\\u8F7D\\u78C1\\u76D8:\"\\u5DF2\\u6302\\u8F7D\\u78C1\\u76D8\",\\u5171\\u4EAB\\u529F\\u80FD:\"\\u5171\\u4EAB\\u529F\\u80FD\",\\u5171\\u4EAB\\u6587\\u4EF6:\"\\u5171\\u4EAB\\u6587\\u4EF6\",\\u65B0\\u589E:\"\\u65B0\\u589E\",\\u5171\\u4EAB\\u65B9\\u5F0F:\"\\u5171\\u4EAB\\u65B9\\u5F0F\",\\u8BFB\\u5199:\"\\u8BFB\\u5199\",\\u53EA\\u8BFB:\"\\u53EA\\u8BFB\",\\u9009\\u62E9\\u4F4D\\u7F6E:\"\\u9009\\u62E9\\u4F4D\\u7F6E\",\\u5171\\u4EAB\\u540D\\u79F0:\"\\u5171\\u4EAB\\u540D\\u79F0\",\\u6D4F\\u89C8:\"\\u6D4F\\u89C8\",\\u4E0A\\u4E00\\u6B65:\"\\u4E0A\\u4E00\\u6B65\",\\u4E0B\\u4E00\\u6B65:\"\\u4E0B\\u4E00\\u6B65\",\\u7528\\u6237:\"\\u7528\\u6237\",\\u65E0\\u6743\\u9650:\"\\u65E0\\u6743\\u9650\",\\u786E\\u8BA4\\u7528\\u6237\\u6743\\u9650:\"\\u786E\\u8BA4\\u7528\\u6237\\u6743\\u9650\",\\u5171\\u4EAB\\u7528\\u6237:\"\\u5171\\u4EAB\\u7528\\u6237\",\\u59D3\\u540D:\"\\u59D3\\u540D\",\\u5BC6\\u7801:\"\\u5BC6\\u7801\",\\u64CD\\u4F5C:\"\\u64CD\\u4F5C\",\\u67E5\\u770B\\u5BC6\\u7801:\"\\u67E5\\u770B\\u5BC6\\u7801\",\\u7528\\u6237\\u540D:\"\\u7528\\u6237\\u540D\",\\u7528\\u6237\\u5BC6\\u7801:\"\\u7528\\u6237\\u5BC6\\u7801\",\\u7F16\\u8F91\\u7528\\u6237:\"\\u7F16\\u8F91\\u7528\\u6237\",\\u5BC6\\u7801\\u786E\\u8BA4:\"\\u5BC6\\u7801\\u786E\\u8BA4\",\\u8BF7\\u8F93\\u5165\\u7528\\u6237\\u540D:\"\\u8BF7\\u8F93\\u5165\\u7528\\u6237\\u540D\",\\u8BF7\\u8F93\\u5165\\u5BC6\\u7801:\"\\u8BF7\\u8F93\\u5165\\u5BC6\\u7801\",\\u5173\\u95ED:\"\\u5173\\u95ED\",\\u4FDD\\u5B58:\"\\u4FDD\\u5B58\",\\u5171\\u4EAB\\u914D\\u7F6E:\"\\u5171\\u4EAB\\u914D\\u7F6E\",\\u6682\\u672A\\u5F00\\u653E:\"\\u6682\\u672A\\u5F00\\u653E\",\\u5176\\u4ED6\\u529F\\u80FD:\"\\u5176\\u4ED6\\u529F\\u80FD\",\\u5411\\u5BFC\\u529F\\u80FD:\"\\u5411\\u5BFC\\u529F\\u80FD\",\\u6587\\u4EF6\\u7BA1\\u7406:\"\\u6587\\u4EF6\\u7BA1\\u7406\",\\u6587\\u4EF6\\u540C\\u6B65:\"\\u6587\\u4EF6\\u540C\\u6B65\",\\u76F8\\u518C\\u5907\\u4EFD:\"\\u76F8\\u518C\\u5907\\u4EFD\",\\u7F51\\u7EDC\\u5411\\u5BFC:\"\\u7F51\\u7EDC\\u5411\\u5BFC\",\\u6B22\\u8FCE\\u4F7F\\u7528\\u7F51\\u7EDC\\u914D\\u7F6E\\u5411\\u5BFC:\"\\u6B22\\u8FCE\\u4F7F\\u7528\\u7F51\\u7EDC\\u914D\\u7F6E\\u5411\\u5BFC\",\\u9009\\u62E9\\u4E00\\u79CD\\u8FDE\\u63A5\\u65B9\\u5F0F\\u4EE5\\u5F00\\u59CB:\"\\u9009\\u62E9\\u4E00\\u79CD\\u8FDE\\u63A5\\u65B9\\u5F0F\\u4EE5\\u5F00\\u59CB\",\\u5BBD\\u5E26\\u62E8\\u53F7\\u8FDE\\u63A5:\"\\u5BBD\\u5E26\\u62E8\\u53F7\\u8FDE\\u63A5\",\\u8FDE\\u63A5\\u73B0\\u6709\\u8DEF\\u7531\\u5668:\"\\u8FDE\\u63A5\\u73B0\\u6709\\u8DEF\\u7531\\u5668\",\"\\u6CA1\\u627E\\u5230\\u60F3\\u8981\\u7684\\u914D\\u7F6E\\uFF1F\\u8BF7\\u4F7F\\u7528\":\"\\u6CA1\\u627E\\u5230\\u60F3\\u8981\\u7684\\u914D\\u7F6E\\uFF1F\\u8BF7\\u4F7F\\u7528\",\\u9AD8\\u7EA7\\u6A21\\u5F0F:\"\\u9AD8\\u7EA7\\u6A21\\u5F0F\",NAS\\u5411\\u5BFC:\"NAS\\u5411\\u5BFC\",\\u6B22\\u8FCE\\u4F7F\\u7528iStoreOS:\"\\u6B22\\u8FCE\\u4F7F\\u7528iStoreOS\",\\u5E94\\u7528\\u4E2D\\u5FC3:\"\\u5E94\\u7528\\u4E2D\\u5FC3\",\\u5E94\\u7528\\u5546\\u5E97:\"\\u5E94\\u7528\\u5546\\u5E97\",\\u53EF\\u66F4\\u65B0:\"\\u53EF\\u66F4\\u65B0\",\\u5DF2\\u5B89\\u88C5:\"\\u5DF2\\u5B89\\u88C5\",\\u66F4\\u65B0:\"\\u66F4\\u65B0\",\\u5378\\u8F7D:\"\\u5378\\u8F7D\",\\u6253\\u5F00:\"\\u6253\\u5F00\",\\u5B89\\u88C5:\"\\u5B89\\u88C5\",\\u5168\\u90E8\\u8F6F\\u4EF6:\"\\u5168\\u90E8\\u8F6F\\u4EF6\",\\u670D\\u52A1\\u72B6\\u6001:\"\\u670D\\u52A1\\u72B6\\u6001\",\\u8FDC\\u7A0B\\u57DF\\u540D:\"\\u8FDC\\u7A0B\\u57DF\\u540D\",\\u5FEB\\u901F\\u914D\\u7F6E:\"\\u5FEB\\u901F\\u914D\\u7F6E\",\\u57DF\\u540D\\u5FEB\\u901F\\u914D\\u7F6E:\"\\u57DF\\u540D\\u5FEB\\u901F\\u914D\\u7F6E\",\\u63A7\\u5236\\u53F0:\"\\u63A7\\u5236\\u53F0\",\\u7F16\\u8F91:\"\\u7F16\\u8F91\",\\u5F53\\u524D\\u72B6\\u6001:\"\\u5F53\\u524D\\u72B6\\u6001\",\\u6839\\u76EE\\u5F55:\"\\u6839\\u76EE\\u5F55\",\\u67E5\\u770BDocker\\u4FE1\\u606F:\"\\u67E5\\u770BDocker\\u4FE1\\u606F\",\\u8FC1\\u79FB\\u5411\\u5BFC:\"\\u8FC1\\u79FB\\u5411\\u5BFC\",\\u8FC1\\u79FB\\u5230:\"\\u8FC1\\u79FB\\u5230\",\\u8BF7\\u9009\\u62E9\\u8FC1\\u79FB\\u5730\\u5740:\"\\u8BF7\\u9009\\u62E9\\u8FC1\\u79FB\\u5730\\u5740\",\\u81EA\\u5B9A\\u4E49:\"\\u81EA\\u5B9A\\u4E49\",\\u9AD8\\u7EA7\\u914D\\u7F6E:\"\\u9AD8\\u7EA7\\u914D\\u7F6E\",\\u4E0B\\u8F7D\\u670D\\u52A1:\"\\u4E0B\\u8F7D\\u670D\\u52A1\",\\u6682\\u65E0\\u4E0B\\u8F7D:\"\\u6682\\u65E0\\u4E0B\\u8F7D\",\\u4E0B\\u8F7D\\u76EE\\u5F55:\"\\u4E0B\\u8F7D\\u76EE\\u5F55\",\\u7F51\\u7EDC\\u5730\\u5740:\"\\u7F51\\u7EDC\\u5730\\u5740\",\\u672A\\u542F\\u52A8:\"\\u672A\\u542F\\u52A8\",\\u4E0B\\u8F7D\\u670D\\u52A1\\u914D\\u7F6E\\u5411\\u5BFC:\"\\u4E0B\\u8F7D\\u670D\\u52A1\\u914D\\u7F6E\\u5411\\u5BFC\",\\u914D\\u7F6E\\u76EE\\u5F55:\"\\u914D\\u7F6E\\u76EE\\u5F55\",RPC\\u4EE4\\u724C:\"RPC\\u4EE4\\u724C\",\\u9644\\u52A0\\u7684:\"\\u9644\\u52A0\\u7684\",\\u9ED8\\u8BA4:\"\\u9ED8\\u8BA4\",\\u81EA\\u5DF1\\u6DFB\\u52A0:\"\\u81EA\\u5DF1\\u6DFB\\u52A0\",\\u542F\\u7528:\"\\u542F\\u7528\",\\u5171\\u4EAB\\u8BBE\\u7F6E:\"\\u5171\\u4EAB\\u8BBE\\u7F6E\",\\u53F0:\"\\u53F0\"};/*!\n  * shared v9.5.0\n  * (c) 2023 kazuya kawaguchi\n  * Released under the MIT License.\n  */const Go=typeof window!=\"undefined\",Ln=(e,t=!1)=>t?Symbol.for(e):Symbol(e),h2=(e,t,n)=>_2({l:e,k:t,s:n}),_2=e=>JSON.stringify(e).replace(/\\u2028/g,\"\\\\u2028\").replace(/\\u2029/g,\"\\\\u2029\").replace(/\\u0027/g,\"\\\\u0027\"),ut=e=>typeof e==\"number\"&&isFinite(e),p2=e=>Ad(e)===\"[object Date]\",os=e=>Ad(e)===\"[object RegExp]\",Ga=e=>ge(e)&&Object.keys(e).length===0,vt=Object.assign;let vu;const Fn=()=>vu||(vu=typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:typeof window!=\"undefined\"?window:typeof global!=\"undefined\"?global:{});function yu(e){return e.replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&apos;\")}const m2=Object.prototype.hasOwnProperty;function Vi(e,t){return m2.call(e,t)}const Ge=Array.isArray,Qe=e=>typeof e==\"function\",q=e=>typeof e==\"string\",Te=e=>typeof e==\"boolean\",Re=e=>e!==null&&typeof e==\"object\",Id=Object.prototype.toString,Ad=e=>Id.call(e),ge=e=>{if(!Re(e))return!1;const t=Object.getPrototypeOf(e);return t===null||t.constructor===Object},g2=e=>e==null?\"\":Ge(e)||ge(e)&&e.toString===Id?JSON.stringify(e,null,2):String(e);function v2(e,t=\"\"){return e.reduce((n,s,r)=>r===0?n+s:n+t+s,\"\")}function ji(e){let t=e;return()=>++t}function y2(e,t){typeof console!=\"undefined\"&&(console.warn(\"[intlify] \"+e),t&&console.warn(t.stack))}/*!\n  * message-compiler v9.5.0\n  * (c) 2023 kazuya kawaguchi\n  * Released under the MIT License.\n  */function b2(e,t,n){return{line:e,column:t,offset:n}}function zo(e,t,n){const s={start:e,end:t};return n!=null&&(s.source=n),s}const E2=/\\{([0-9a-zA-Z]+)\\}/g;function k2(e,...t){return t.length===1&&w2(t[0])&&(t=t[0]),(!t||!t.hasOwnProperty)&&(t={}),e.replace(E2,(n,s)=>t.hasOwnProperty(s)?t[s]:\"\")}const Ld=Object.assign,bu=e=>typeof e==\"string\",w2=e=>e!==null&&typeof e==\"object\";function Md(e,t=\"\"){return e.reduce((n,s,r)=>r===0?n+s:n+t+s,\"\")}const ce={EXPECTED_TOKEN:1,INVALID_TOKEN_IN_PLACEHOLDER:2,UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER:3,UNKNOWN_ESCAPE_SEQUENCE:4,INVALID_UNICODE_ESCAPE_SEQUENCE:5,UNBALANCED_CLOSING_BRACE:6,UNTERMINATED_CLOSING_BRACE:7,EMPTY_PLACEHOLDER:8,NOT_ALLOW_NEST_PLACEHOLDER:9,INVALID_LINKED_FORMAT:10,MUST_HAVE_MESSAGES_IN_PLURAL:11,UNEXPECTED_EMPTY_LINKED_MODIFIER:12,UNEXPECTED_EMPTY_LINKED_KEY:13,UNEXPECTED_LEXICAL_ANALYSIS:14,UNHANDLED_CODEGEN_NODE_TYPE:15,UNHANDLED_MINIFIER_NODE_TYPE:16,__EXTEND_POINT__:17},S2={[ce.EXPECTED_TOKEN]:\"Expected token: '{0}'\",[ce.INVALID_TOKEN_IN_PLACEHOLDER]:\"Invalid token in placeholder: '{0}'\",[ce.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER]:\"Unterminated single quote in placeholder\",[ce.UNKNOWN_ESCAPE_SEQUENCE]:\"Unknown escape sequence: \\\\{0}\",[ce.INVALID_UNICODE_ESCAPE_SEQUENCE]:\"Invalid unicode escape sequence: {0}\",[ce.UNBALANCED_CLOSING_BRACE]:\"Unbalanced closing brace\",[ce.UNTERMINATED_CLOSING_BRACE]:\"Unterminated closing brace\",[ce.EMPTY_PLACEHOLDER]:\"Empty placeholder\",[ce.NOT_ALLOW_NEST_PLACEHOLDER]:\"Not allowed nest placeholder\",[ce.INVALID_LINKED_FORMAT]:\"Invalid linked format\",[ce.MUST_HAVE_MESSAGES_IN_PLURAL]:\"Plural must have messages\",[ce.UNEXPECTED_EMPTY_LINKED_MODIFIER]:\"Unexpected empty linked modifier\",[ce.UNEXPECTED_EMPTY_LINKED_KEY]:\"Unexpected empty linked key\",[ce.UNEXPECTED_LEXICAL_ANALYSIS]:\"Unexpected lexical analysis in token: '{0}'\",[ce.UNHANDLED_CODEGEN_NODE_TYPE]:\"unhandled codegen node type: '{0}'\",[ce.UNHANDLED_MINIFIER_NODE_TYPE]:\"unhandled mimifier node type: '{0}'\"};function ar(e,t,n={}){const{domain:s,messages:r,args:a}=n,o=k2((r||S2)[e]||\"\",...a||[]),i=new SyntaxError(String(o));return i.code=e,t&&(i.location=t),i.domain=s,i}function C2(e){throw e}const En=\" \",T2=\"\\r\",Ft=`\n`,F2=String.fromCharCode(8232),D2=String.fromCharCode(8233);function O2(e){const t=e;let n=0,s=1,r=1,a=0;const o=V=>t[V]===T2&&t[V+1]===Ft,i=V=>t[V]===Ft,l=V=>t[V]===D2,u=V=>t[V]===F2,c=V=>o(V)||i(V)||l(V)||u(V),_=()=>n,p=()=>s,y=()=>r,E=()=>a,k=V=>o(V)||l(V)||u(V)?Ft:t[V],S=()=>k(n),m=()=>k(n+a);function w(){return a=0,c(n)&&(s++,r=0),o(n)&&n++,n++,r++,t[n]}function P(){return o(n+a)&&a++,a++,t[n+a]}function b(){n=0,s=1,r=1,a=0}function D(V=0){a=V}function I(){const V=n+a;for(;V!==n;)w();a=0}return{index:_,line:p,column:y,peekOffset:E,charAt:k,currentChar:S,currentPeek:m,next:w,peek:P,reset:b,resetPeek:D,skipToPeek:I}}const Un=void 0,P2=\".\",Eu=\"'\",N2=\"tokenizer\";function I2(e,t={}){const n=t.location!==!1,s=O2(e),r=()=>s.index(),a=()=>b2(s.line(),s.column(),s.index()),o=a(),i=r(),l={currentType:14,offset:i,startLoc:o,endLoc:o,lastType:14,lastOffset:i,lastStartLoc:o,lastEndLoc:o,braceNest:0,inLinked:!1,text:\"\"},u=()=>l,{onError:c}=t;function _(f,h,g,...T){const O=u();if(h.column+=g,h.offset+=g,c){const x=n?zo(O.startLoc,h):null,R=ar(f,x,{domain:N2,args:T});c(R)}}function p(f,h,g){f.endLoc=a(),f.currentType=h;const T={type:h};return n&&(T.loc=zo(f.startLoc,f.endLoc)),g!=null&&(T.value=g),T}const y=f=>p(f,14);function E(f,h){return f.currentChar()===h?(f.next(),h):(_(ce.EXPECTED_TOKEN,a(),0,h),\"\")}function k(f){let h=\"\";for(;f.currentPeek()===En||f.currentPeek()===Ft;)h+=f.currentPeek(),f.peek();return h}function S(f){const h=k(f);return f.skipToPeek(),h}function m(f){if(f===Un)return!1;const h=f.charCodeAt(0);return h>=97&&h<=122||h>=65&&h<=90||h===95}function w(f){if(f===Un)return!1;const h=f.charCodeAt(0);return h>=48&&h<=57}function P(f,h){const{currentType:g}=h;if(g!==2)return!1;k(f);const T=m(f.currentPeek());return f.resetPeek(),T}function b(f,h){const{currentType:g}=h;if(g!==2)return!1;k(f);const T=f.currentPeek()===\"-\"?f.peek():f.currentPeek(),O=w(T);return f.resetPeek(),O}function D(f,h){const{currentType:g}=h;if(g!==2)return!1;k(f);const T=f.currentPeek()===Eu;return f.resetPeek(),T}function I(f,h){const{currentType:g}=h;if(g!==8)return!1;k(f);const T=f.currentPeek()===\".\";return f.resetPeek(),T}function V(f,h){const{currentType:g}=h;if(g!==9)return!1;k(f);const T=m(f.currentPeek());return f.resetPeek(),T}function M(f,h){const{currentType:g}=h;if(!(g===8||g===12))return!1;k(f);const T=f.currentPeek()===\":\";return f.resetPeek(),T}function U(f,h){const{currentType:g}=h;if(g!==10)return!1;const T=()=>{const x=f.currentPeek();return x===\"{\"?m(f.peek()):x===\"@\"||x===\"%\"||x===\"|\"||x===\":\"||x===\".\"||x===En||!x?!1:x===Ft?(f.peek(),T()):m(x)},O=T();return f.resetPeek(),O}function ee(f){k(f);const h=f.currentPeek()===\"|\";return f.resetPeek(),h}function _e(f){const h=k(f),g=f.currentPeek()===\"%\"&&f.peek()===\"{\";return f.resetPeek(),{isModulo:g,hasSpace:h.length>0}}function H(f,h=!0){const g=(O=!1,x=\"\",R=!1)=>{const Y=f.currentPeek();return Y===\"{\"?x===\"%\"?!1:O:Y===\"@\"||!Y?x===\"%\"?!0:O:Y===\"%\"?(f.peek(),g(O,\"%\",!0)):Y===\"|\"?x===\"%\"||R?!0:!(x===En||x===Ft):Y===En?(f.peek(),g(!0,En,R)):Y===Ft?(f.peek(),g(!0,Ft,R)):!0},T=g();return h&&f.resetPeek(),T}function ie(f,h){const g=f.currentChar();return g===Un?Un:h(g)?(f.next(),g):null}function Me(f){return ie(f,g=>{const T=g.charCodeAt(0);return T>=97&&T<=122||T>=65&&T<=90||T>=48&&T<=57||T===95||T===36})}function qe(f){return ie(f,g=>{const T=g.charCodeAt(0);return T>=48&&T<=57})}function de(f){return ie(f,g=>{const T=g.charCodeAt(0);return T>=48&&T<=57||T>=65&&T<=70||T>=97&&T<=102})}function we(f){let h=\"\",g=\"\";for(;h=qe(f);)g+=h;return g}function Ee(f){S(f);const h=f.currentChar();return h!==\"%\"&&_(ce.EXPECTED_TOKEN,a(),0,h),f.next(),\"%\"}function mt(f){let h=\"\";for(;;){const g=f.currentChar();if(g===\"{\"||g===\"}\"||g===\"@\"||g===\"|\"||!g)break;if(g===\"%\")if(H(f))h+=g,f.next();else break;else if(g===En||g===Ft)if(H(f))h+=g,f.next();else{if(ee(f))break;h+=g,f.next()}else h+=g,f.next()}return h}function Dt(f){S(f);let h=\"\",g=\"\";for(;h=Me(f);)g+=h;return f.currentChar()===Un&&_(ce.UNTERMINATED_CLOSING_BRACE,a(),0),g}function yt(f){S(f);let h=\"\";return f.currentChar()===\"-\"?(f.next(),h+=`-${we(f)}`):h+=we(f),f.currentChar()===Un&&_(ce.UNTERMINATED_CLOSING_BRACE,a(),0),h}function rt(f){S(f),E(f,\"'\");let h=\"\",g=\"\";const T=x=>x!==Eu&&x!==Ft;for(;h=ie(f,T);)h===\"\\\\\"?g+=Vt(f):g+=h;const O=f.currentChar();return O===Ft||O===Un?(_(ce.UNTERMINATED_SINGLE_QUOTE_IN_PLACEHOLDER,a(),0),O===Ft&&(f.next(),E(f,\"'\")),g):(E(f,\"'\"),g)}function Vt(f){const h=f.currentChar();switch(h){case\"\\\\\":case\"'\":return f.next(),`\\\\${h}`;case\"u\":return jt(f,h,4);case\"U\":return jt(f,h,6);default:return _(ce.UNKNOWN_ESCAPE_SEQUENCE,a(),0,h),\"\"}}function jt(f,h,g){E(f,h);let T=\"\";for(let O=0;O<g;O++){const x=de(f);if(!x){_(ce.INVALID_UNICODE_ESCAPE_SEQUENCE,a(),0,`\\\\${h}${T}${f.currentChar()}`);break}T+=x}return`\\\\${h}${T}`}function cn(f){S(f);let h=\"\",g=\"\";const T=O=>O!==\"{\"&&O!==\"}\"&&O!==En&&O!==Ft;for(;h=ie(f,T);)g+=h;return g}function Ze(f){let h=\"\",g=\"\";for(;h=Me(f);)g+=h;return g}function L(f){const h=(g=!1,T)=>{const O=f.currentChar();return O===\"{\"||O===\"%\"||O===\"@\"||O===\"|\"||O===\"(\"||O===\")\"||!O||O===En?T:O===Ft||O===P2?(T+=O,f.next(),h(g,T)):(T+=O,f.next(),h(!0,T))};return h(!1,\"\")}function z(f){S(f);const h=E(f,\"|\");return S(f),h}function W(f,h){let g=null;switch(f.currentChar()){case\"{\":return h.braceNest>=1&&_(ce.NOT_ALLOW_NEST_PLACEHOLDER,a(),0),f.next(),g=p(h,2,\"{\"),S(f),h.braceNest++,g;case\"}\":return h.braceNest>0&&h.currentType===2&&_(ce.EMPTY_PLACEHOLDER,a(),0),f.next(),g=p(h,3,\"}\"),h.braceNest--,h.braceNest>0&&S(f),h.inLinked&&h.braceNest===0&&(h.inLinked=!1),g;case\"@\":return h.braceNest>0&&_(ce.UNTERMINATED_CLOSING_BRACE,a(),0),g=Q(f,h)||y(h),h.braceNest=0,g;default:let O=!0,x=!0,R=!0;if(ee(f))return h.braceNest>0&&_(ce.UNTERMINATED_CLOSING_BRACE,a(),0),g=p(h,1,z(f)),h.braceNest=0,h.inLinked=!1,g;if(h.braceNest>0&&(h.currentType===5||h.currentType===6||h.currentType===7))return _(ce.UNTERMINATED_CLOSING_BRACE,a(),0),h.braceNest=0,Se(f,h);if(O=P(f,h))return g=p(h,5,Dt(f)),S(f),g;if(x=b(f,h))return g=p(h,6,yt(f)),S(f),g;if(R=D(f,h))return g=p(h,7,rt(f)),S(f),g;if(!O&&!x&&!R)return g=p(h,13,cn(f)),_(ce.INVALID_TOKEN_IN_PLACEHOLDER,a(),0,g.value),S(f),g;break}return g}function Q(f,h){const{currentType:g}=h;let T=null;const O=f.currentChar();switch((g===8||g===9||g===12||g===10)&&(O===Ft||O===En)&&_(ce.INVALID_LINKED_FORMAT,a(),0),O){case\"@\":return f.next(),T=p(h,8,\"@\"),h.inLinked=!0,T;case\".\":return S(f),f.next(),p(h,9,\".\");case\":\":return S(f),f.next(),p(h,10,\":\");default:return ee(f)?(T=p(h,1,z(f)),h.braceNest=0,h.inLinked=!1,T):I(f,h)||M(f,h)?(S(f),Q(f,h)):V(f,h)?(S(f),p(h,12,Ze(f))):U(f,h)?(S(f),O===\"{\"?W(f,h)||T:p(h,11,L(f))):(g===8&&_(ce.INVALID_LINKED_FORMAT,a(),0),h.braceNest=0,h.inLinked=!1,Se(f,h))}}function Se(f,h){let g={type:14};if(h.braceNest>0)return W(f,h)||y(h);if(h.inLinked)return Q(f,h)||y(h);switch(f.currentChar()){case\"{\":return W(f,h)||y(h);case\"}\":return _(ce.UNBALANCED_CLOSING_BRACE,a(),0),f.next(),p(h,3,\"}\");case\"@\":return Q(f,h)||y(h);default:if(ee(f))return g=p(h,1,z(f)),h.braceNest=0,h.inLinked=!1,g;const{isModulo:O,hasSpace:x}=_e(f);if(O)return x?p(h,0,mt(f)):p(h,4,Ee(f));if(H(f))return p(h,0,mt(f));break}return g}function v(){const{currentType:f,offset:h,startLoc:g,endLoc:T}=l;return l.lastType=f,l.lastOffset=h,l.lastStartLoc=g,l.lastEndLoc=T,l.offset=r(),l.startLoc=a(),s.currentChar()===Un?p(l,14):Se(s,l)}return{nextToken:v,currentOffset:r,currentPosition:a,context:u}}const A2=\"parser\",L2=/(?:\\\\\\\\|\\\\'|\\\\u([0-9a-fA-F]{4})|\\\\U([0-9a-fA-F]{6}))/g;function M2(e,t,n){switch(e){case\"\\\\\\\\\":return\"\\\\\";case\"\\\\'\":return\"'\";default:{const s=parseInt(t||n,16);return s<=55295||s>=57344?String.fromCodePoint(s):\"\\uFFFD\"}}}function x2(e={}){const t=e.location!==!1,{onError:n}=e;function s(m,w,P,b,...D){const I=m.currentPosition();if(I.offset+=b,I.column+=b,n){const V=t?zo(P,I):null,M=ar(w,V,{domain:A2,args:D});n(M)}}function r(m,w,P){const b={type:m};return t&&(b.start=w,b.end=w,b.loc={start:P,end:P}),b}function a(m,w,P,b){b&&(m.type=b),t&&(m.end=w,m.loc&&(m.loc.end=P))}function o(m,w){const P=m.context(),b=r(3,P.offset,P.startLoc);return b.value=w,a(b,m.currentOffset(),m.currentPosition()),b}function i(m,w){const P=m.context(),{lastOffset:b,lastStartLoc:D}=P,I=r(5,b,D);return I.index=parseInt(w,10),m.nextToken(),a(I,m.currentOffset(),m.currentPosition()),I}function l(m,w){const P=m.context(),{lastOffset:b,lastStartLoc:D}=P,I=r(4,b,D);return I.key=w,m.nextToken(),a(I,m.currentOffset(),m.currentPosition()),I}function u(m,w){const P=m.context(),{lastOffset:b,lastStartLoc:D}=P,I=r(9,b,D);return I.value=w.replace(L2,M2),m.nextToken(),a(I,m.currentOffset(),m.currentPosition()),I}function c(m){const w=m.nextToken(),P=m.context(),{lastOffset:b,lastStartLoc:D}=P,I=r(8,b,D);return w.type!==12?(s(m,ce.UNEXPECTED_EMPTY_LINKED_MODIFIER,P.lastStartLoc,0),I.value=\"\",a(I,b,D),{nextConsumeToken:w,node:I}):(w.value==null&&s(m,ce.UNEXPECTED_LEXICAL_ANALYSIS,P.lastStartLoc,0,hn(w)),I.value=w.value||\"\",a(I,m.currentOffset(),m.currentPosition()),{node:I})}function _(m,w){const P=m.context(),b=r(7,P.offset,P.startLoc);return b.value=w,a(b,m.currentOffset(),m.currentPosition()),b}function p(m){const w=m.context(),P=r(6,w.offset,w.startLoc);let b=m.nextToken();if(b.type===9){const D=c(m);P.modifier=D.node,b=D.nextConsumeToken||m.nextToken()}switch(b.type!==10&&s(m,ce.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hn(b)),b=m.nextToken(),b.type===2&&(b=m.nextToken()),b.type){case 11:b.value==null&&s(m,ce.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hn(b)),P.key=_(m,b.value||\"\");break;case 5:b.value==null&&s(m,ce.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hn(b)),P.key=l(m,b.value||\"\");break;case 6:b.value==null&&s(m,ce.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hn(b)),P.key=i(m,b.value||\"\");break;case 7:b.value==null&&s(m,ce.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hn(b)),P.key=u(m,b.value||\"\");break;default:s(m,ce.UNEXPECTED_EMPTY_LINKED_KEY,w.lastStartLoc,0);const D=m.context(),I=r(7,D.offset,D.startLoc);return I.value=\"\",a(I,D.offset,D.startLoc),P.key=I,a(P,D.offset,D.startLoc),{nextConsumeToken:b,node:P}}return a(P,m.currentOffset(),m.currentPosition()),{node:P}}function y(m){const w=m.context(),P=w.currentType===1?m.currentOffset():w.offset,b=w.currentType===1?w.endLoc:w.startLoc,D=r(2,P,b);D.items=[];let I=null;do{const U=I||m.nextToken();switch(I=null,U.type){case 0:U.value==null&&s(m,ce.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hn(U)),D.items.push(o(m,U.value||\"\"));break;case 6:U.value==null&&s(m,ce.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hn(U)),D.items.push(i(m,U.value||\"\"));break;case 5:U.value==null&&s(m,ce.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hn(U)),D.items.push(l(m,U.value||\"\"));break;case 7:U.value==null&&s(m,ce.UNEXPECTED_LEXICAL_ANALYSIS,w.lastStartLoc,0,hn(U)),D.items.push(u(m,U.value||\"\"));break;case 8:const ee=p(m);D.items.push(ee.node),I=ee.nextConsumeToken||null;break}}while(w.currentType!==14&&w.currentType!==1);const V=w.currentType===1?w.lastOffset:m.currentOffset(),M=w.currentType===1?w.lastEndLoc:m.currentPosition();return a(D,V,M),D}function E(m,w,P,b){const D=m.context();let I=b.items.length===0;const V=r(1,w,P);V.cases=[],V.cases.push(b);do{const M=y(m);I||(I=M.items.length===0),V.cases.push(M)}while(D.currentType!==14);return I&&s(m,ce.MUST_HAVE_MESSAGES_IN_PLURAL,P,0),a(V,m.currentOffset(),m.currentPosition()),V}function k(m){const w=m.context(),{offset:P,startLoc:b}=w,D=y(m);return w.currentType===14?D:E(m,P,b,D)}function S(m){const w=I2(m,Ld({},e)),P=w.context(),b=r(0,P.offset,P.startLoc);return t&&b.loc&&(b.loc.source=m),b.body=k(w),e.onCacheKey&&(b.cacheKey=e.onCacheKey(m)),P.currentType!==14&&s(w,ce.UNEXPECTED_LEXICAL_ANALYSIS,P.lastStartLoc,0,m[P.offset]||\"\"),a(b,w.currentOffset(),w.currentPosition()),b}return{parse:S}}function hn(e){if(e.type===14)return\"EOF\";const t=(e.value||\"\").replace(/\\r?\\n/gu,\"\\\\n\");return t.length>10?t.slice(0,9)+\"\\u2026\":t}function $2(e,t={}){const n={ast:e,helpers:new Set};return{context:()=>n,helper:a=>(n.helpers.add(a),a)}}function ku(e,t){for(let n=0;n<e.length;n++)Gi(e[n],t)}function Gi(e,t){switch(e.type){case 1:ku(e.cases,t),t.helper(\"plural\");break;case 2:ku(e.items,t);break;case 6:Gi(e.key,t),t.helper(\"linked\"),t.helper(\"type\");break;case 5:t.helper(\"interpolate\"),t.helper(\"list\");break;case 4:t.helper(\"interpolate\"),t.helper(\"named\");break}}function R2(e,t={}){const n=$2(e);n.helper(\"normalize\"),e.body&&Gi(e.body,n);const s=n.context();e.helpers=Array.from(s.helpers)}function B2(e){const t=e.body;return t.type===2?wu(t):t.cases.forEach(n=>wu(n)),e}function wu(e){if(e.items.length===1){const t=e.items[0];(t.type===3||t.type===9)&&(e.static=t.value,delete t.value)}else{const t=[];for(let n=0;n<e.items.length;n++){const s=e.items[n];if(!(s.type===3||s.type===9)||s.value==null)break;t.push(s.value)}if(t.length===e.items.length){e.static=Md(t);for(let n=0;n<e.items.length;n++){const s=e.items[n];(s.type===3||s.type===9)&&delete s.value}}}}const U2=\"minifier\";function As(e){switch(e.t=e.type,e.type){case 0:const t=e;As(t.body),t.b=t.body,delete t.body;break;case 1:const n=e,s=n.cases;for(let c=0;c<s.length;c++)As(s[c]);n.c=s,delete n.cases;break;case 2:const r=e,a=r.items;for(let c=0;c<a.length;c++)As(a[c]);r.i=a,delete r.items,r.static&&(r.s=r.static,delete r.static);break;case 3:case 9:case 8:case 7:const o=e;o.value&&(o.v=o.value,delete o.value);break;case 6:const i=e;As(i.key),i.k=i.key,delete i.key,i.modifier&&(As(i.modifier),i.m=i.modifier,delete i.modifier);break;case 5:const l=e;l.i=l.index,delete l.index;break;case 4:const u=e;u.k=u.key,delete u.key;break;default:throw ar(ce.UNHANDLED_MINIFIER_NODE_TYPE,null,{domain:U2,args:[e.type]})}delete e.type}const Y2=\"parser\";function H2(e,t){const{sourceMap:n,filename:s,breakLineCode:r,needIndent:a}=t,o=t.location!==!1,i={filename:s,code:\"\",column:1,line:1,offset:0,map:void 0,breakLineCode:r,needIndent:a,indentLevel:0};o&&e.loc&&(i.source=e.loc.source);const l=()=>i;function u(S,m){i.code+=S}function c(S,m=!0){const w=m?r:\"\";u(a?w+\"  \".repeat(S):w)}function _(S=!0){const m=++i.indentLevel;S&&c(m)}function p(S=!0){const m=--i.indentLevel;S&&c(m)}function y(){c(i.indentLevel)}return{context:l,push:u,indent:_,deindent:p,newline:y,helper:S=>`_${S}`,needIndent:()=>i.needIndent}}function W2(e,t){const{helper:n}=e;e.push(`${n(\"linked\")}(`),Js(e,t.key),t.modifier?(e.push(\", \"),Js(e,t.modifier),e.push(\", _type\")):e.push(\", undefined, _type\"),e.push(\")\")}function V2(e,t){const{helper:n,needIndent:s}=e;e.push(`${n(\"normalize\")}([`),e.indent(s());const r=t.items.length;for(let a=0;a<r&&(Js(e,t.items[a]),a!==r-1);a++)e.push(\", \");e.deindent(s()),e.push(\"])\")}function j2(e,t){const{helper:n,needIndent:s}=e;if(t.cases.length>1){e.push(`${n(\"plural\")}([`),e.indent(s());const r=t.cases.length;for(let a=0;a<r&&(Js(e,t.cases[a]),a!==r-1);a++)e.push(\", \");e.deindent(s()),e.push(\"])\")}}function G2(e,t){t.body?Js(e,t.body):e.push(\"null\")}function Js(e,t){const{helper:n}=e;switch(t.type){case 0:G2(e,t);break;case 1:j2(e,t);break;case 2:V2(e,t);break;case 6:W2(e,t);break;case 8:e.push(JSON.stringify(t.value),t);break;case 7:e.push(JSON.stringify(t.value),t);break;case 5:e.push(`${n(\"interpolate\")}(${n(\"list\")}(${t.index}))`,t);break;case 4:e.push(`${n(\"interpolate\")}(${n(\"named\")}(${JSON.stringify(t.key)}))`,t);break;case 9:e.push(JSON.stringify(t.value),t);break;case 3:e.push(JSON.stringify(t.value),t);break;default:throw ar(ce.UNHANDLED_CODEGEN_NODE_TYPE,null,{domain:Y2,args:[t.type]})}}const z2=(e,t={})=>{const n=bu(t.mode)?t.mode:\"normal\",s=bu(t.filename)?t.filename:\"message.intl\",r=!!t.sourceMap,a=t.breakLineCode!=null?t.breakLineCode:n===\"arrow\"?\";\":`\n`,o=t.needIndent?t.needIndent:n!==\"arrow\",i=e.helpers||[],l=H2(e,{mode:n,filename:s,sourceMap:r,breakLineCode:a,needIndent:o});l.push(n===\"normal\"?\"function __msg__ (ctx) {\":\"(ctx) => {\"),l.indent(o),i.length>0&&(l.push(`const { ${Md(i.map(_=>`${_}: _${_}`),\", \")} } = ctx`),l.newline()),l.push(\"return \"),Js(l,e),l.deindent(o),l.push(\"}\"),delete e.helpers;const{code:u,map:c}=l.context();return{ast:e,code:u,map:c?c.toJSON():void 0}};function K2(e,t={}){const n=Ld({},t),s=!!n.jit,r=!!n.minify,a=n.optimize==null?!0:n.optimize,i=x2(n).parse(e);return s?(a&&B2(i),r&&As(i),{ast:i,code:\"\"}):(R2(i,n),z2(i,n))}/*!\n  * core-base v9.5.0\n  * (c) 2023 kazuya kawaguchi\n  * Released under the MIT License.\n  */function q2(){typeof __INTLIFY_PROD_DEVTOOLS__!=\"boolean\"&&(Fn().__INTLIFY_PROD_DEVTOOLS__=!1),typeof __INTLIFY_JIT_COMPILATION__!=\"boolean\"&&(Fn().__INTLIFY_JIT_COMPILATION__=!1),typeof __INTLIFY_DROP_MESSAGE_COMPILER__!=\"boolean\"&&(Fn().__INTLIFY_DROP_MESSAGE_COMPILER__=!1)}const us=[];us[0]={w:[0],i:[3,0],[\"[\"]:[4],o:[7]};us[1]={w:[1],[\".\"]:[2],[\"[\"]:[4],o:[7]};us[2]={w:[2],i:[3,0],[0]:[3,0]};us[3]={i:[3,0],[0]:[3,0],w:[1,1],[\".\"]:[2,1],[\"[\"]:[4,1],o:[7,1]};us[4]={[\"'\"]:[5,0],['\"']:[6,0],[\"[\"]:[4,2],[\"]\"]:[1,3],o:8,l:[4,0]};us[5]={[\"'\"]:[4,0],o:8,l:[5,0]};us[6]={['\"']:[4,0],o:8,l:[6,0]};const J2=/^\\s?(?:true|false|-?[\\d.]+|'[^']*'|\"[^\"]*\")\\s?$/;function X2(e){return J2.test(e)}function Z2(e){const t=e.charCodeAt(0),n=e.charCodeAt(e.length-1);return t===n&&(t===34||t===39)?e.slice(1,-1):e}function Q2(e){if(e==null)return\"o\";switch(e.charCodeAt(0)){case 91:case 93:case 46:case 34:case 39:return e;case 95:case 36:case 45:return\"i\";case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return\"w\"}return\"i\"}function eh(e){const t=e.trim();return e.charAt(0)===\"0\"&&isNaN(parseInt(e))?!1:X2(t)?Z2(t):\"*\"+t}function th(e){const t=[];let n=-1,s=0,r=0,a,o,i,l,u,c,_;const p=[];p[0]=()=>{o===void 0?o=i:o+=i},p[1]=()=>{o!==void 0&&(t.push(o),o=void 0)},p[2]=()=>{p[0](),r++},p[3]=()=>{if(r>0)r--,s=4,p[0]();else{if(r=0,o===void 0||(o=eh(o),o===!1))return!1;p[1]()}};function y(){const E=e[n+1];if(s===5&&E===\"'\"||s===6&&E==='\"')return n++,i=\"\\\\\"+E,p[0](),!0}for(;s!==null;)if(n++,a=e[n],!(a===\"\\\\\"&&y())){if(l=Q2(a),_=us[s],u=_[l]||_.l||8,u===8||(s=u[0],u[1]!==void 0&&(c=p[u[1]],c&&(i=a,c()===!1))))return;if(s===7)return t}}const Su=new Map;function nh(e,t){return Re(e)?e[t]:null}function sh(e,t){if(!Re(e))return null;let n=Su.get(t);if(n||(n=th(t),n&&Su.set(t,n)),!n)return null;const s=n.length;let r=e,a=0;for(;a<s;){const o=r[n[a]];if(o===void 0)return null;r=o,a++}return r}const rh=e=>e,ah=e=>\"\",oh=\"text\",ih=e=>e.length===0?\"\":v2(e),lh=g2;function Cu(e,t){return e=Math.abs(e),t===2?e?e>1?1:0:1:e?Math.min(e,2):0}function uh(e){const t=ut(e.pluralIndex)?e.pluralIndex:-1;return e.named&&(ut(e.named.count)||ut(e.named.n))?ut(e.named.count)?e.named.count:ut(e.named.n)?e.named.n:t:t}function ch(e,t){t.count||(t.count=e),t.n||(t.n=e)}function dh(e={}){const t=e.locale,n=uh(e),s=Re(e.pluralRules)&&q(t)&&Qe(e.pluralRules[t])?e.pluralRules[t]:Cu,r=Re(e.pluralRules)&&q(t)&&Qe(e.pluralRules[t])?Cu:void 0,a=m=>m[s(n,m.length,r)],o=e.list||[],i=m=>o[m],l=e.named||{};ut(e.pluralIndex)&&ch(n,l);const u=m=>l[m];function c(m){const w=Qe(e.messages)?e.messages(m):Re(e.messages)?e.messages[m]:!1;return w||(e.parent?e.parent.message(m):ah)}const _=m=>e.modifiers?e.modifiers[m]:rh,p=ge(e.processor)&&Qe(e.processor.normalize)?e.processor.normalize:ih,y=ge(e.processor)&&Qe(e.processor.interpolate)?e.processor.interpolate:lh,E=ge(e.processor)&&q(e.processor.type)?e.processor.type:oh,S={list:i,named:u,plural:a,linked:(m,...w)=>{const[P,b]=w;let D=\"text\",I=\"\";w.length===1?Re(P)?(I=P.modifier||I,D=P.type||D):q(P)&&(I=P||I):w.length===2&&(q(P)&&(I=P||I),q(b)&&(D=b||D));const V=c(m)(S),M=D===\"vnode\"&&Ge(V)&&I?V[0]:V;return I?_(I)(M,D):M},message:c,type:E,interpolate:y,normalize:p,values:vt({},o,l)};return S}let Yr=null;function fh(e){Yr=e}function hh(e,t,n){Yr&&Yr.emit(\"i18n:init\",{timestamp:Date.now(),i18n:e,version:t,meta:n})}const _h=ph(\"function:translate\");function ph(e){return t=>Yr&&Yr.emit(e,t)}const mh={NOT_FOUND_KEY:1,FALLBACK_TO_TRANSLATE:2,CANNOT_FORMAT_NUMBER:3,FALLBACK_TO_NUMBER_FORMAT:4,CANNOT_FORMAT_DATE:5,FALLBACK_TO_DATE_FORMAT:6,EXPERIMENTAL_CUSTOM_MESSAGE_COMPILER:7,__EXTEND_POINT__:8};function zi(e,t){return t.locale!=null?Tu(t.locale):Tu(e.locale)}let wo;function Tu(e){return q(e)?e:wo!=null&&e.resolvedOnce?wo:wo=e()}function gh(e,t,n){return[...new Set([n,...Ge(t)?t:Re(t)?Object.keys(t):q(t)?[t]:[n]])]}function xd(e,t,n){const s=q(n)?n:Xs,r=e;r.__localeChainCache||(r.__localeChainCache=new Map);let a=r.__localeChainCache.get(s);if(!a){a=[];let o=[n];for(;Ge(o);)o=Fu(a,o,t);const i=Ge(t)||!ge(t)?t:t.default?t.default:null;o=q(i)?[i]:i,Ge(o)&&Fu(a,o,!1),r.__localeChainCache.set(s,a)}return a}function Fu(e,t,n){let s=!0;for(let r=0;r<t.length&&Te(s);r++){const a=t[r];q(a)&&(s=vh(e,t[r],n))}return s}function vh(e,t,n){let s;const r=t.split(\"-\");do{const a=r.join(\"-\");s=yh(e,a,n),r.splice(-1,1)}while(r.length&&s===!0);return s}function yh(e,t,n){let s=!1;if(!e.includes(t)&&(s=!0,t)){s=t[t.length-1]!==\"!\";const r=t.replace(/!/g,\"\");e.push(r),(Ge(n)||ge(n))&&n[r]&&(s=n[r])}return s}const bh=\"9.5.0\",za=-1,Xs=\"en-US\",Du=\"\",Ou=e=>`${e.charAt(0).toLocaleUpperCase()}${e.substr(1)}`;function Eh(){return{upper:(e,t)=>t===\"text\"&&q(e)?e.toUpperCase():t===\"vnode\"&&Re(e)&&\"__v_isVNode\"in e?e.children.toUpperCase():e,lower:(e,t)=>t===\"text\"&&q(e)?e.toLowerCase():t===\"vnode\"&&Re(e)&&\"__v_isVNode\"in e?e.children.toLowerCase():e,capitalize:(e,t)=>t===\"text\"&&q(e)?Ou(e):t===\"vnode\"&&Re(e)&&\"__v_isVNode\"in e?Ou(e.children):e}}let $d;function Pu(e){$d=e}let Rd;function kh(e){Rd=e}let Bd;function wh(e){Bd=e}let Ud=null;const Nu=e=>{Ud=e},Sh=()=>Ud;let Yd=null;const Iu=e=>{Yd=e},Ch=()=>Yd;let Au=0;function Th(e={}){const t=Qe(e.onWarn)?e.onWarn:y2,n=q(e.version)?e.version:bh,s=q(e.locale)||Qe(e.locale)?e.locale:Xs,r=Qe(s)?Xs:s,a=Ge(e.fallbackLocale)||ge(e.fallbackLocale)||q(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:r,o=ge(e.messages)?e.messages:{[r]:{}},i=ge(e.datetimeFormats)?e.datetimeFormats:{[r]:{}},l=ge(e.numberFormats)?e.numberFormats:{[r]:{}},u=vt({},e.modifiers||{},Eh()),c=e.pluralRules||{},_=Qe(e.missing)?e.missing:null,p=Te(e.missingWarn)||os(e.missingWarn)?e.missingWarn:!0,y=Te(e.fallbackWarn)||os(e.fallbackWarn)?e.fallbackWarn:!0,E=!!e.fallbackFormat,k=!!e.unresolving,S=Qe(e.postTranslation)?e.postTranslation:null,m=ge(e.processor)?e.processor:null,w=Te(e.warnHtmlMessage)?e.warnHtmlMessage:!0,P=!!e.escapeParameter,b=Qe(e.messageCompiler)?e.messageCompiler:$d,D=Qe(e.messageResolver)?e.messageResolver:Rd||nh,I=Qe(e.localeFallbacker)?e.localeFallbacker:Bd||gh,V=Re(e.fallbackContext)?e.fallbackContext:void 0,M=e,U=Re(M.__datetimeFormatters)?M.__datetimeFormatters:new Map,ee=Re(M.__numberFormatters)?M.__numberFormatters:new Map,_e=Re(M.__meta)?M.__meta:{};Au++;const H={version:n,cid:Au,locale:s,fallbackLocale:a,messages:o,modifiers:u,pluralRules:c,missing:_,missingWarn:p,fallbackWarn:y,fallbackFormat:E,unresolving:k,postTranslation:S,processor:m,warnHtmlMessage:w,escapeParameter:P,messageCompiler:b,messageResolver:D,localeFallbacker:I,fallbackContext:V,onWarn:t,__meta:_e};return H.datetimeFormats=i,H.numberFormats=l,H.__datetimeFormatters=U,H.__numberFormatters=ee,__INTLIFY_PROD_DEVTOOLS__&&hh(H,n,_e),H}function Ki(e,t,n,s,r){const{missing:a,onWarn:o}=e;if(a!==null){const i=a(e,n,t,r);return q(i)?i:t}else return t}function pr(e,t,n){const s=e;s.__localeChainCache=new Map,e.localeFallbacker(e,n,t)}function So(e){return n=>Fh(n,e)}function Fh(e,t){const n=t.b||t.body;if((n.t||n.type)===1){const s=n,r=s.c||s.cases;return e.plural(r.reduce((a,o)=>[...a,Lu(e,o)],[]))}else return Lu(e,n)}function Lu(e,t){const n=t.s||t.static;if(n)return e.type===\"text\"?n:e.normalize([n]);{const s=(t.i||t.items).reduce((r,a)=>[...r,Ko(e,a)],[]);return e.normalize(s)}}function Ko(e,t){const n=t.t||t.type;switch(n){case 3:const s=t;return s.v||s.value;case 9:const r=t;return r.v||r.value;case 4:const a=t;return e.interpolate(e.named(a.k||a.key));case 5:const o=t;return e.interpolate(e.list(o.i!=null?o.i:o.index));case 6:const i=t,l=i.m||i.modifier;return e.linked(Ko(e,i.k||i.key),l?Ko(e,l):void 0,e.type);case 7:const u=t;return u.v||u.value;case 8:const c=t;return c.v||c.value;default:throw new Error(`unhandled node type on format message part: ${n}`)}}const Hd=ce.__EXTEND_POINT__,la=ji(Hd),Gn={INVALID_ARGUMENT:Hd,INVALID_DATE_ARGUMENT:la(),INVALID_ISO_DATE_ARGUMENT:la(),NOT_SUPPORT_NON_STRING_MESSAGE:la(),__EXTEND_POINT__:la()};function Es(e){return ar(e,null,void 0)}const Wd=e=>e;let $s=Object.create(null);const Hr=e=>Re(e)&&(e.t===0||e.type===0)&&(\"b\"in e||\"body\"in e);function Vd(e,t={}){let n=!1;const s=t.onError||C2;return t.onError=r=>{n=!0,s(r)},fr(gt({},K2(e,t)),{detectError:n})}const Dh=(e,t)=>{if(!q(e))throw Es(Gn.NOT_SUPPORT_NON_STRING_MESSAGE);{Te(t.warnHtmlMessage)&&t.warnHtmlMessage;const s=(t.onCacheKey||Wd)(e),r=$s[s];if(r)return r;const{code:a,detectError:o}=Vd(e,t),i=new Function(`return ${a}`)();return o?i:$s[s]=i}};function Oh(e,t){if(__INTLIFY_JIT_COMPILATION__&&!__INTLIFY_DROP_MESSAGE_COMPILER__&&q(e)){Te(t.warnHtmlMessage)&&t.warnHtmlMessage;const s=(t.onCacheKey||Wd)(e),r=$s[s];if(r)return r;const{ast:a,detectError:o}=Vd(e,fr(gt({},t),{location:!1,jit:!0})),i=So(a);return o?i:$s[s]=i}else{const n=e.cacheKey;if(n){const s=$s[n];return s||($s[n]=So(e))}else return So(e)}}const Mu=()=>\"\",en=e=>Qe(e);function xu(e,...t){const{fallbackFormat:n,postTranslation:s,unresolving:r,messageCompiler:a,fallbackLocale:o,messages:i}=e,[l,u]=qo(...t),c=Te(u.missingWarn)?u.missingWarn:e.missingWarn,_=Te(u.fallbackWarn)?u.fallbackWarn:e.fallbackWarn,p=Te(u.escapeParameter)?u.escapeParameter:e.escapeParameter,y=!!u.resolvedMessage,E=q(u.default)||Te(u.default)?Te(u.default)?a?l:()=>l:u.default:n?a?l:()=>l:\"\",k=n||E!==\"\",S=zi(e,u);p&&Ph(u);let[m,w,P]=y?[l,S,i[S]||{}]:jd(e,l,S,o,_,c),b=m,D=l;if(!y&&!(q(b)||Hr(b)||en(b))&&k&&(b=E,D=b),!y&&(!(q(b)||Hr(b)||en(b))||!q(w)))return r?za:l;let I=!1;const V=()=>{I=!0},M=en(b)?b:Gd(e,l,w,b,D,V);if(I)return b;const U=Ah(e,w,P,u),ee=dh(U),_e=Nh(e,M,ee),H=s?s(_e,l):_e;if(__INTLIFY_PROD_DEVTOOLS__){const ie={timestamp:Date.now(),key:q(l)?l:en(b)?b.key:\"\",locale:w||(en(b)?b.locale:\"\"),format:q(b)?b:en(b)?b.source:\"\",message:H};ie.meta=vt({},e.__meta,Sh()||{}),_h(ie)}return H}function Ph(e){Ge(e.list)?e.list=e.list.map(t=>q(t)?yu(t):t):Re(e.named)&&Object.keys(e.named).forEach(t=>{q(e.named[t])&&(e.named[t]=yu(e.named[t]))})}function jd(e,t,n,s,r,a){const{messages:o,onWarn:i,messageResolver:l,localeFallbacker:u}=e,c=u(e,s,n);let _={},p,y=null;const E=\"translate\";for(let k=0;k<c.length&&(p=c[k],_=o[p]||{},(y=l(_,t))===null&&(y=_[t]),!(q(y)||Hr(y)||en(y)));k++){const S=Ki(e,t,p,a,E);S!==t&&(y=S)}return[y,p,_]}function Gd(e,t,n,s,r,a){const{messageCompiler:o,warnHtmlMessage:i}=e;if(en(s)){const u=s;return u.locale=u.locale||n,u.key=u.key||t,u}if(o==null){const u=()=>s;return u.locale=n,u.key=t,u}const l=o(s,Ih(e,n,r,s,i,a));return l.locale=n,l.key=t,l.source=s,l}function Nh(e,t,n){return t(n)}function qo(...e){const[t,n,s]=e,r={};if(!q(t)&&!ut(t)&&!en(t)&&!Hr(t))throw Es(Gn.INVALID_ARGUMENT);const a=ut(t)?String(t):(en(t),t);return ut(n)?r.plural=n:q(n)?r.default=n:ge(n)&&!Ga(n)?r.named=n:Ge(n)&&(r.list=n),ut(s)?r.plural=s:q(s)?r.default=s:ge(s)&&vt(r,s),[a,r]}function Ih(e,t,n,s,r,a){return{locale:t,key:n,warnHtmlMessage:r,onError:o=>{throw a&&a(o),o},onCacheKey:o=>h2(t,n,o)}}function Ah(e,t,n,s){const{modifiers:r,pluralRules:a,messageResolver:o,fallbackLocale:i,fallbackWarn:l,missingWarn:u,fallbackContext:c}=e,p={locale:t,modifiers:r,pluralRules:a,messages:y=>{let E=o(n,y);if(E==null&&c){const[,,k]=jd(c,y,t,i,l,u);E=o(k,y)}if(q(E)||Hr(E)){let k=!1;const m=Gd(e,y,t,E,y,()=>{k=!0});return k?Mu:m}else return en(E)?E:Mu}};return e.processor&&(p.processor=e.processor),s.list&&(p.list=s.list),s.named&&(p.named=s.named),ut(s.plural)&&(p.pluralIndex=s.plural),p}function $u(e,...t){const{datetimeFormats:n,unresolving:s,fallbackLocale:r,onWarn:a,localeFallbacker:o}=e,{__datetimeFormatters:i}=e,[l,u,c,_]=Jo(...t),p=Te(c.missingWarn)?c.missingWarn:e.missingWarn;Te(c.fallbackWarn)?c.fallbackWarn:e.fallbackWarn;const y=!!c.part,E=zi(e,c),k=o(e,r,E);if(!q(l)||l===\"\")return new Intl.DateTimeFormat(E,_).format(u);let S={},m,w=null;const P=\"datetime format\";for(let I=0;I<k.length&&(m=k[I],S=n[m]||{},w=S[l],!ge(w));I++)Ki(e,l,m,p,P);if(!ge(w)||!q(m))return s?za:l;let b=`${m}__${l}`;Ga(_)||(b=`${b}__${JSON.stringify(_)}`);let D=i.get(b);return D||(D=new Intl.DateTimeFormat(m,vt({},w,_)),i.set(b,D)),y?D.formatToParts(u):D.format(u)}const zd=[\"localeMatcher\",\"weekday\",\"era\",\"year\",\"month\",\"day\",\"hour\",\"minute\",\"second\",\"timeZoneName\",\"formatMatcher\",\"hour12\",\"timeZone\",\"dateStyle\",\"timeStyle\",\"calendar\",\"dayPeriod\",\"numberingSystem\",\"hourCycle\",\"fractionalSecondDigits\"];function Jo(...e){const[t,n,s,r]=e,a={};let o={},i;if(q(t)){const l=t.match(/(\\d{4}-\\d{2}-\\d{2})(T|\\s)?(.*)/);if(!l)throw Es(Gn.INVALID_ISO_DATE_ARGUMENT);const u=l[3]?l[3].trim().startsWith(\"T\")?`${l[1].trim()}${l[3].trim()}`:`${l[1].trim()}T${l[3].trim()}`:l[1].trim();i=new Date(u);try{i.toISOString()}catch(c){throw Es(Gn.INVALID_ISO_DATE_ARGUMENT)}}else if(p2(t)){if(isNaN(t.getTime()))throw Es(Gn.INVALID_DATE_ARGUMENT);i=t}else if(ut(t))i=t;else throw Es(Gn.INVALID_ARGUMENT);return q(n)?a.key=n:ge(n)&&Object.keys(n).forEach(l=>{zd.includes(l)?o[l]=n[l]:a[l]=n[l]}),q(s)?a.locale=s:ge(s)&&(o=s),ge(r)&&(o=r),[a.key||\"\",i,a,o]}function Ru(e,t,n){const s=e;for(const r in n){const a=`${t}__${r}`;!s.__datetimeFormatters.has(a)||s.__datetimeFormatters.delete(a)}}function Bu(e,...t){const{numberFormats:n,unresolving:s,fallbackLocale:r,onWarn:a,localeFallbacker:o}=e,{__numberFormatters:i}=e,[l,u,c,_]=Xo(...t),p=Te(c.missingWarn)?c.missingWarn:e.missingWarn;Te(c.fallbackWarn)?c.fallbackWarn:e.fallbackWarn;const y=!!c.part,E=zi(e,c),k=o(e,r,E);if(!q(l)||l===\"\")return new Intl.NumberFormat(E,_).format(u);let S={},m,w=null;const P=\"number format\";for(let I=0;I<k.length&&(m=k[I],S=n[m]||{},w=S[l],!ge(w));I++)Ki(e,l,m,p,P);if(!ge(w)||!q(m))return s?za:l;let b=`${m}__${l}`;Ga(_)||(b=`${b}__${JSON.stringify(_)}`);let D=i.get(b);return D||(D=new Intl.NumberFormat(m,vt({},w,_)),i.set(b,D)),y?D.formatToParts(u):D.format(u)}const Kd=[\"localeMatcher\",\"style\",\"currency\",\"currencyDisplay\",\"currencySign\",\"useGrouping\",\"minimumIntegerDigits\",\"minimumFractionDigits\",\"maximumFractionDigits\",\"minimumSignificantDigits\",\"maximumSignificantDigits\",\"compactDisplay\",\"notation\",\"signDisplay\",\"unit\",\"unitDisplay\",\"roundingMode\",\"roundingPriority\",\"roundingIncrement\",\"trailingZeroDisplay\"];function Xo(...e){const[t,n,s,r]=e,a={};let o={};if(!ut(t))throw Es(Gn.INVALID_ARGUMENT);const i=t;return q(n)?a.key=n:ge(n)&&Object.keys(n).forEach(l=>{Kd.includes(l)?o[l]=n[l]:a[l]=n[l]}),q(s)?a.locale=s:ge(s)&&(o=s),ge(r)&&(o=r),[a.key||\"\",i,a,o]}function Uu(e,t,n){const s=e;for(const r in n){const a=`${t}__${r}`;!s.__numberFormatters.has(a)||s.__numberFormatters.delete(a)}}q2();/*!\n  * vue-i18n v9.5.0\n  * (c) 2023 kazuya kawaguchi\n  * Released under the MIT License.\n  */const Lh=\"9.5.0\";function Mh(){typeof __VUE_I18N_FULL_INSTALL__!=\"boolean\"&&(Fn().__VUE_I18N_FULL_INSTALL__=!0),typeof __VUE_I18N_LEGACY_API__!=\"boolean\"&&(Fn().__VUE_I18N_LEGACY_API__=!0),typeof __INTLIFY_JIT_COMPILATION__!=\"boolean\"&&(Fn().__INTLIFY_JIT_COMPILATION__=!1),typeof __INTLIFY_DROP_MESSAGE_COMPILER__!=\"boolean\"&&(Fn().__INTLIFY_DROP_MESSAGE_COMPILER__=!1),typeof __INTLIFY_PROD_DEVTOOLS__!=\"boolean\"&&(Fn().__INTLIFY_PROD_DEVTOOLS__=!1)}const qd=mh.__EXTEND_POINT__,Yn=ji(qd);Yn(),Yn(),Yn(),Yn(),Yn(),Yn(),Yn(),Yn();const Jd=Gn.__EXTEND_POINT__,Ot=ji(Jd),at={UNEXPECTED_RETURN_TYPE:Jd,INVALID_ARGUMENT:Ot(),MUST_BE_CALL_SETUP_TOP:Ot(),NOT_INSTALLED:Ot(),NOT_AVAILABLE_IN_LEGACY_MODE:Ot(),REQUIRED_VALUE:Ot(),INVALID_VALUE:Ot(),CANNOT_SETUP_VUE_DEVTOOLS_PLUGIN:Ot(),NOT_INSTALLED_WITH_PROVIDE:Ot(),UNEXPECTED_ERROR:Ot(),NOT_COMPATIBLE_LEGACY_VUE_I18N:Ot(),BRIDGE_SUPPORT_VUE_2_ONLY:Ot(),MUST_DEFINE_I18N_OPTION_IN_ALLOW_COMPOSITION:Ot(),NOT_AVAILABLE_COMPOSITION_IN_LEGACY:Ot(),__EXTEND_POINT__:Ot()};function ft(e,...t){return ar(e,null,void 0)}const Zo=Ln(\"__translateVNode\"),Qo=Ln(\"__datetimeParts\"),ei=Ln(\"__numberParts\"),Xd=Ln(\"__setPluralRules\");Ln(\"__intlifyMeta\");const Zd=Ln(\"__injectWithOption\"),ti=Ln(\"__dispose\");function ni(e){if(!Re(e))return e;for(const t in e)if(!!Vi(e,t))if(!t.includes(\".\"))Re(e[t])&&ni(e[t]);else{const n=t.split(\".\"),s=n.length-1;let r=e,a=!1;for(let o=0;o<s;o++){if(n[o]in r||(r[n[o]]={}),!Re(r[n[o]])){a=!0;break}r=r[n[o]]}a||(r[n[s]]=e[t],delete e[t]),Re(r[n[s]])&&ni(r[n[s]])}return e}function Ka(e,t){const{messages:n,__i18n:s,messageResolver:r,flatJson:a}=t,o=ge(n)?n:Ge(s)?{}:{[e]:{}};if(Ge(s)&&s.forEach(i=>{if(\"locale\"in i&&\"resource\"in i){const{locale:l,resource:u}=i;l?(o[l]=o[l]||{},Cr(u,o[l])):Cr(u,o)}else q(i)&&Cr(JSON.parse(i),o)}),r==null&&a)for(const i in o)Vi(o,i)&&ni(o[i]);return o}const ua=e=>!Re(e)||Ge(e);function Cr(e,t){if(ua(e)||ua(t))throw ft(at.INVALID_VALUE);for(const n in e)Vi(e,n)&&(ua(e[n])||ua(t[n])?t[n]=e[n]:Cr(e[n],t[n]))}function Qd(e){return e.type}function ef(e,t,n){let s=Re(t.messages)?t.messages:{};\"__i18nGlobal\"in n&&(s=Ka(e.locale.value,{messages:s,__i18n:n.__i18nGlobal}));const r=Object.keys(s);r.length&&r.forEach(a=>{e.mergeLocaleMessage(a,s[a])});{if(Re(t.datetimeFormats)){const a=Object.keys(t.datetimeFormats);a.length&&a.forEach(o=>{e.mergeDateTimeFormat(o,t.datetimeFormats[o])})}if(Re(t.numberFormats)){const a=Object.keys(t.numberFormats);a.length&&a.forEach(o=>{e.mergeNumberFormat(o,t.numberFormats[o])})}}}function Yu(e){return Ie(qr,null,e,0)}const Hu=\"__INTLIFY_META__\";let Wu=0;function Vu(e){return(t,n,s,r)=>e(n,s,Ht()||void 0,r)}const xh=()=>{const e=Ht();let t=null;return e&&(t=Qd(e)[Hu])?{[Hu]:t}:null};function qi(e={},t){const{__root:n,__injectWithOption:s}=e,r=n===void 0;let a=Te(e.inheritLocale)?e.inheritLocale:!0;const o=le(n&&a?n.locale.value:q(e.locale)?e.locale:Xs),i=le(n&&a?n.fallbackLocale.value:q(e.fallbackLocale)||Ge(e.fallbackLocale)||ge(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:o.value),l=le(Ka(o.value,e)),u=le(ge(e.datetimeFormats)?e.datetimeFormats:{[o.value]:{}}),c=le(ge(e.numberFormats)?e.numberFormats:{[o.value]:{}});let _=n?n.missingWarn:Te(e.missingWarn)||os(e.missingWarn)?e.missingWarn:!0,p=n?n.fallbackWarn:Te(e.fallbackWarn)||os(e.fallbackWarn)?e.fallbackWarn:!0,y=n?n.fallbackRoot:Te(e.fallbackRoot)?e.fallbackRoot:!0,E=!!e.fallbackFormat,k=Qe(e.missing)?e.missing:null,S=Qe(e.missing)?Vu(e.missing):null,m=Qe(e.postTranslation)?e.postTranslation:null,w=n?n.warnHtmlMessage:Te(e.warnHtmlMessage)?e.warnHtmlMessage:!0,P=!!e.escapeParameter;const b=n?n.modifiers:ge(e.modifiers)?e.modifiers:{};let D=e.pluralRules||n&&n.pluralRules,I;I=(()=>{r&&Iu(null);const F={version:Lh,locale:o.value,fallbackLocale:i.value,messages:l.value,modifiers:b,pluralRules:D,missing:S===null?void 0:S,missingWarn:_,fallbackWarn:p,fallbackFormat:E,unresolving:!0,postTranslation:m===null?void 0:m,warnHtmlMessage:w,escapeParameter:P,messageResolver:e.messageResolver,messageCompiler:e.messageCompiler,__meta:{framework:\"vue\"}};F.datetimeFormats=u.value,F.numberFormats=c.value,F.__datetimeFormatters=ge(I)?I.__datetimeFormatters:void 0,F.__numberFormatters=ge(I)?I.__numberFormatters:void 0;const A=Th(F);return r&&Iu(A),A})(),pr(I,o.value,i.value);function M(){return[o.value,i.value,l.value,u.value,c.value]}const U=be({get:()=>o.value,set:F=>{o.value=F,I.locale=o.value}}),ee=be({get:()=>i.value,set:F=>{i.value=F,I.fallbackLocale=i.value,pr(I,o.value,F)}}),_e=be(()=>l.value),H=be(()=>u.value),ie=be(()=>c.value);function Me(){return Qe(m)?m:null}function qe(F){m=F,I.postTranslation=F}function de(){return k}function we(F){F!==null&&(S=Vu(F)),k=F,I.missing=S}const Ee=(F,A,se,ae,xe,Pe)=>{M();let He;try{__INTLIFY_PROD_DEVTOOLS__&&Nu(xh()),r||(I.fallbackContext=n?Ch():void 0),He=F(I)}finally{__INTLIFY_PROD_DEVTOOLS__&&Nu(null),r||(I.fallbackContext=void 0)}if(ut(He)&&He===za){const[$t,fs]=A();return n&&y?ae(n):xe($t)}else{if(Pe(He))return He;throw ft(at.UNEXPECTED_RETURN_TYPE)}};function mt(...F){return Ee(A=>Reflect.apply(xu,null,[A,...F]),()=>qo(...F),\"translate\",A=>Reflect.apply(A.t,A,[...F]),A=>A,A=>q(A))}function Dt(...F){const[A,se,ae]=F;if(ae&&!Re(ae))throw ft(at.INVALID_ARGUMENT);return mt(A,se,vt({resolvedMessage:!0},ae||{}))}function yt(...F){return Ee(A=>Reflect.apply($u,null,[A,...F]),()=>Jo(...F),\"datetime format\",A=>Reflect.apply(A.d,A,[...F]),()=>Du,A=>q(A))}function rt(...F){return Ee(A=>Reflect.apply(Bu,null,[A,...F]),()=>Xo(...F),\"number format\",A=>Reflect.apply(A.n,A,[...F]),()=>Du,A=>q(A))}function Vt(F){return F.map(A=>q(A)||ut(A)||Te(A)?Yu(String(A)):A)}const cn={normalize:Vt,interpolate:F=>F,type:\"vnode\"};function Ze(...F){return Ee(A=>{let se;const ae=A;try{ae.processor=cn,se=Reflect.apply(xu,null,[ae,...F])}finally{ae.processor=null}return se},()=>qo(...F),\"translate\",A=>A[Zo](...F),A=>[Yu(A)],A=>Ge(A))}function L(...F){return Ee(A=>Reflect.apply(Bu,null,[A,...F]),()=>Xo(...F),\"number format\",A=>A[ei](...F),()=>[],A=>q(A)||Ge(A))}function z(...F){return Ee(A=>Reflect.apply($u,null,[A,...F]),()=>Jo(...F),\"datetime format\",A=>A[Qo](...F),()=>[],A=>q(A)||Ge(A))}function W(F){D=F,I.pluralRules=D}function Q(F,A){if(!F)return!1;const se=q(A)?A:o.value,ae=f(se);return I.messageResolver(ae,F)!==null}function Se(F){let A=null;const se=xd(I,i.value,o.value);for(let ae=0;ae<se.length;ae++){const xe=l.value[se[ae]]||{},Pe=I.messageResolver(xe,F);if(Pe!=null){A=Pe;break}}return A}function v(F){const A=Se(F);return A!=null?A:n?n.tm(F)||{}:{}}function f(F){return l.value[F]||{}}function h(F,A){l.value[F]=A,I.messages=l.value}function g(F,A){l.value[F]=l.value[F]||{},Cr(A,l.value[F]),I.messages=l.value}function T(F){return u.value[F]||{}}function O(F,A){u.value[F]=A,I.datetimeFormats=u.value,Ru(I,F,A)}function x(F,A){u.value[F]=vt(u.value[F]||{},A),I.datetimeFormats=u.value,Ru(I,F,A)}function R(F){return c.value[F]||{}}function Y(F,A){c.value[F]=A,I.numberFormats=c.value,Uu(I,F,A)}function $(F,A){c.value[F]=vt(c.value[F]||{},A),I.numberFormats=c.value,Uu(I,F,A)}Wu++,n&&Go&&(Zn(n.locale,F=>{a&&(o.value=F,I.locale=F,pr(I,o.value,i.value))}),Zn(n.fallbackLocale,F=>{a&&(i.value=F,I.fallbackLocale=F,pr(I,o.value,i.value))}));const K={id:Wu,locale:U,fallbackLocale:ee,get inheritLocale(){return a},set inheritLocale(F){a=F,F&&n&&(o.value=n.locale.value,i.value=n.fallbackLocale.value,pr(I,o.value,i.value))},get availableLocales(){return Object.keys(l.value).sort()},messages:_e,get modifiers(){return b},get pluralRules(){return D||{}},get isGlobal(){return r},get missingWarn(){return _},set missingWarn(F){_=F,I.missingWarn=_},get fallbackWarn(){return p},set fallbackWarn(F){p=F,I.fallbackWarn=p},get fallbackRoot(){return y},set fallbackRoot(F){y=F},get fallbackFormat(){return E},set fallbackFormat(F){E=F,I.fallbackFormat=E},get warnHtmlMessage(){return w},set warnHtmlMessage(F){w=F,I.warnHtmlMessage=F},get escapeParameter(){return P},set escapeParameter(F){P=F,I.escapeParameter=F},t:mt,getLocaleMessage:f,setLocaleMessage:h,mergeLocaleMessage:g,getPostTranslationHandler:Me,setPostTranslationHandler:qe,getMissingHandler:de,setMissingHandler:we,[Xd]:W};return K.datetimeFormats=H,K.numberFormats=ie,K.rt=Dt,K.te=Q,K.tm=v,K.d=yt,K.n=rt,K.getDateTimeFormat=T,K.setDateTimeFormat=O,K.mergeDateTimeFormat=x,K.getNumberFormat=R,K.setNumberFormat=Y,K.mergeNumberFormat=$,K[Zd]=s,K[Zo]=Ze,K[Qo]=z,K[ei]=L,K}function $h(e){const t=q(e.locale)?e.locale:Xs,n=q(e.fallbackLocale)||Ge(e.fallbackLocale)||ge(e.fallbackLocale)||e.fallbackLocale===!1?e.fallbackLocale:t,s=Qe(e.missing)?e.missing:void 0,r=Te(e.silentTranslationWarn)||os(e.silentTranslationWarn)?!e.silentTranslationWarn:!0,a=Te(e.silentFallbackWarn)||os(e.silentFallbackWarn)?!e.silentFallbackWarn:!0,o=Te(e.fallbackRoot)?e.fallbackRoot:!0,i=!!e.formatFallbackMessages,l=ge(e.modifiers)?e.modifiers:{},u=e.pluralizationRules,c=Qe(e.postTranslation)?e.postTranslation:void 0,_=q(e.warnHtmlInMessage)?e.warnHtmlInMessage!==\"off\":!0,p=!!e.escapeParameterHtml,y=Te(e.sync)?e.sync:!0;let E=e.messages;if(ge(e.sharedMessages)){const D=e.sharedMessages;E=Object.keys(D).reduce((V,M)=>{const U=V[M]||(V[M]={});return vt(U,D[M]),V},E||{})}const{__i18n:k,__root:S,__injectWithOption:m}=e,w=e.datetimeFormats,P=e.numberFormats,b=e.flatJson;return{locale:t,fallbackLocale:n,messages:E,flatJson:b,datetimeFormats:w,numberFormats:P,missing:s,missingWarn:r,fallbackWarn:a,fallbackRoot:o,fallbackFormat:i,modifiers:l,pluralRules:u,postTranslation:c,warnHtmlMessage:_,escapeParameter:p,messageResolver:e.messageResolver,inheritLocale:y,__i18n:k,__root:S,__injectWithOption:m}}function si(e={},t){{const n=qi($h(e)),{__extender:s}=e,r={id:n.id,get locale(){return n.locale.value},set locale(a){n.locale.value=a},get fallbackLocale(){return n.fallbackLocale.value},set fallbackLocale(a){n.fallbackLocale.value=a},get messages(){return n.messages.value},get datetimeFormats(){return n.datetimeFormats.value},get numberFormats(){return n.numberFormats.value},get availableLocales(){return n.availableLocales},get formatter(){return{interpolate(){return[]}}},set formatter(a){},get missing(){return n.getMissingHandler()},set missing(a){n.setMissingHandler(a)},get silentTranslationWarn(){return Te(n.missingWarn)?!n.missingWarn:n.missingWarn},set silentTranslationWarn(a){n.missingWarn=Te(a)?!a:a},get silentFallbackWarn(){return Te(n.fallbackWarn)?!n.fallbackWarn:n.fallbackWarn},set silentFallbackWarn(a){n.fallbackWarn=Te(a)?!a:a},get modifiers(){return n.modifiers},get formatFallbackMessages(){return n.fallbackFormat},set formatFallbackMessages(a){n.fallbackFormat=a},get postTranslation(){return n.getPostTranslationHandler()},set postTranslation(a){n.setPostTranslationHandler(a)},get sync(){return n.inheritLocale},set sync(a){n.inheritLocale=a},get warnHtmlInMessage(){return n.warnHtmlMessage?\"warn\":\"off\"},set warnHtmlInMessage(a){n.warnHtmlMessage=a!==\"off\"},get escapeParameterHtml(){return n.escapeParameter},set escapeParameterHtml(a){n.escapeParameter=a},get preserveDirectiveContent(){return!0},set preserveDirectiveContent(a){},get pluralizationRules(){return n.pluralRules||{}},__composer:n,t(...a){const[o,i,l]=a,u={};let c=null,_=null;if(!q(o))throw ft(at.INVALID_ARGUMENT);const p=o;return q(i)?u.locale=i:Ge(i)?c=i:ge(i)&&(_=i),Ge(l)?c=l:ge(l)&&(_=l),Reflect.apply(n.t,n,[p,c||_||{},u])},rt(...a){return Reflect.apply(n.rt,n,[...a])},tc(...a){const[o,i,l]=a,u={plural:1};let c=null,_=null;if(!q(o))throw ft(at.INVALID_ARGUMENT);const p=o;return q(i)?u.locale=i:ut(i)?u.plural=i:Ge(i)?c=i:ge(i)&&(_=i),q(l)?u.locale=l:Ge(l)?c=l:ge(l)&&(_=l),Reflect.apply(n.t,n,[p,c||_||{},u])},te(a,o){return n.te(a,o)},tm(a){return n.tm(a)},getLocaleMessage(a){return n.getLocaleMessage(a)},setLocaleMessage(a,o){n.setLocaleMessage(a,o)},mergeLocaleMessage(a,o){n.mergeLocaleMessage(a,o)},d(...a){return Reflect.apply(n.d,n,[...a])},getDateTimeFormat(a){return n.getDateTimeFormat(a)},setDateTimeFormat(a,o){n.setDateTimeFormat(a,o)},mergeDateTimeFormat(a,o){n.mergeDateTimeFormat(a,o)},n(...a){return Reflect.apply(n.n,n,[...a])},getNumberFormat(a){return n.getNumberFormat(a)},setNumberFormat(a,o){n.setNumberFormat(a,o)},mergeNumberFormat(a,o){n.mergeNumberFormat(a,o)},getChoiceIndex(a,o){return-1}};return r.__extender=s,r}}const Ji={tag:{type:[String,Object]},locale:{type:String},scope:{type:String,validator:e=>e===\"parent\"||e===\"global\",default:\"parent\"},i18n:{type:Object}};function Rh({slots:e},t){return t.length===1&&t[0]===\"default\"?(e.default?e.default():[]).reduce((s,r)=>[...s,...r.type===me?r.children:[r]],[]):t.reduce((n,s)=>{const r=e[s];return r&&(n[s]=r()),n},{})}function tf(e){return me}const Bh=ue({name:\"i18n-t\",props:vt({keypath:{type:String,required:!0},plural:{type:[Number,String],validator:e=>ut(e)||!isNaN(e)}},Ji),setup(e,t){const{slots:n,attrs:s}=t,r=e.i18n||Xi({useScope:e.scope,__useComponent:!0});return()=>{const a=Object.keys(n).filter(_=>_!==\"_\"),o={};e.locale&&(o.locale=e.locale),e.plural!==void 0&&(o.plural=q(e.plural)?+e.plural:e.plural);const i=Rh(t,a),l=r[Zo](e.keypath,i,o),u=vt({},s),c=q(e.tag)||Re(e.tag)?e.tag:tf();return Jr(c,u,l)}}}),ju=Bh;function Uh(e){return Ge(e)&&!q(e[0])}function nf(e,t,n,s){const{slots:r,attrs:a}=t;return()=>{const o={part:!0};let i={};e.locale&&(o.locale=e.locale),q(e.format)?o.key=e.format:Re(e.format)&&(q(e.format.key)&&(o.key=e.format.key),i=Object.keys(e.format).reduce((p,y)=>n.includes(y)?vt({},p,{[y]:e.format[y]}):p,{}));const l=s(e.value,o,i);let u=[o.key];Ge(l)?u=l.map((p,y)=>{const E=r[p.type],k=E?E({[p.type]:p.value,index:y,parts:l}):[p.value];return Uh(k)&&(k[0].key=`${p.type}-${y}`),k}):q(l)&&(u=[l]);const c=vt({},a),_=q(e.tag)||Re(e.tag)?e.tag:tf();return Jr(_,c,u)}}const Yh=ue({name:\"i18n-n\",props:vt({value:{type:Number,required:!0},format:{type:[String,Object]}},Ji),setup(e,t){const n=e.i18n||Xi({useScope:\"parent\",__useComponent:!0});return nf(e,t,Kd,(...s)=>n[ei](...s))}}),Gu=Yh,Hh=ue({name:\"i18n-d\",props:vt({value:{type:[Number,Date],required:!0},format:{type:[String,Object]}},Ji),setup(e,t){const n=e.i18n||Xi({useScope:\"parent\",__useComponent:!0});return nf(e,t,zd,(...s)=>n[Qo](...s))}}),zu=Hh;function Wh(e,t){const n=e;if(e.mode===\"composition\")return n.__getInstance(t)||e.global;{const s=n.__getInstance(t);return s!=null?s.__composer:e.global.__composer}}function Vh(e){const t=o=>{const{instance:i,modifiers:l,value:u}=o;if(!i||!i.$)throw ft(at.UNEXPECTED_ERROR);const c=Wh(e,i.$),_=Ku(u);return[Reflect.apply(c.t,c,[...qu(_)]),c]};return{created:(o,i)=>{const[l,u]=t(i);Go&&e.global===u&&(o.__i18nWatcher=Zn(u.locale,()=>{i.instance&&i.instance.$forceUpdate()})),o.__composer=u,o.textContent=l},unmounted:o=>{Go&&o.__i18nWatcher&&(o.__i18nWatcher(),o.__i18nWatcher=void 0,delete o.__i18nWatcher),o.__composer&&(o.__composer=void 0,delete o.__composer)},beforeUpdate:(o,{value:i})=>{if(o.__composer){const l=o.__composer,u=Ku(i);o.textContent=Reflect.apply(l.t,l,[...qu(u)])}},getSSRProps:o=>{const[i]=t(o);return{textContent:i}}}}function Ku(e){if(q(e))return{path:e};if(ge(e)){if(!(\"path\"in e))throw ft(at.REQUIRED_VALUE,\"path\");return e}else throw ft(at.INVALID_VALUE)}function qu(e){const{path:t,locale:n,args:s,choice:r,plural:a}=e,o={},i=s||{};return q(n)&&(o.locale=n),ut(r)&&(o.plural=r),ut(a)&&(o.plural=a),[t,i,o]}function jh(e,t,...n){const s=ge(n[0])?n[0]:{},r=!!s.useI18nComponentName;(Te(s.globalInstall)?s.globalInstall:!0)&&([r?\"i18n\":ju.name,\"I18nT\"].forEach(o=>e.component(o,ju)),[Gu.name,\"I18nN\"].forEach(o=>e.component(o,Gu)),[zu.name,\"I18nD\"].forEach(o=>e.component(o,zu))),e.directive(\"t\",Vh(t))}function Gh(e,t,n){return{beforeCreate(){const s=Ht();if(!s)throw ft(at.UNEXPECTED_ERROR);const r=this.$options;if(r.i18n){const a=r.i18n;if(r.__i18n&&(a.__i18n=r.__i18n),a.__root=t,this===this.$root)this.$i18n=Ju(e,a);else{a.__injectWithOption=!0,a.__extender=n.__vueI18nExtend,this.$i18n=si(a);const o=this.$i18n;o.__extender&&(o.__disposer=o.__extender(this.$i18n))}}else if(r.__i18n)if(this===this.$root)this.$i18n=Ju(e,r);else{this.$i18n=si({__i18n:r.__i18n,__injectWithOption:!0,__extender:n.__vueI18nExtend,__root:t});const a=this.$i18n;a.__extender&&(a.__disposer=a.__extender(this.$i18n))}else this.$i18n=e;r.__i18nGlobal&&ef(t,r,r),this.$t=(...a)=>this.$i18n.t(...a),this.$rt=(...a)=>this.$i18n.rt(...a),this.$tc=(...a)=>this.$i18n.tc(...a),this.$te=(a,o)=>this.$i18n.te(a,o),this.$d=(...a)=>this.$i18n.d(...a),this.$n=(...a)=>this.$i18n.n(...a),this.$tm=a=>this.$i18n.tm(a),n.__setInstance(s,this.$i18n)},mounted(){},unmounted(){const s=Ht();if(!s)throw ft(at.UNEXPECTED_ERROR);const r=this.$i18n;delete this.$t,delete this.$rt,delete this.$tc,delete this.$te,delete this.$d,delete this.$n,delete this.$tm,r.__disposer&&(r.__disposer(),delete r.__disposer,delete r.__extender),n.__deleteInstance(s),delete this.$i18n}}}function Ju(e,t){e.locale=t.locale||e.locale,e.fallbackLocale=t.fallbackLocale||e.fallbackLocale,e.missing=t.missing||e.missing,e.silentTranslationWarn=t.silentTranslationWarn||e.silentFallbackWarn,e.silentFallbackWarn=t.silentFallbackWarn||e.silentFallbackWarn,e.formatFallbackMessages=t.formatFallbackMessages||e.formatFallbackMessages,e.postTranslation=t.postTranslation||e.postTranslation,e.warnHtmlInMessage=t.warnHtmlInMessage||e.warnHtmlInMessage,e.escapeParameterHtml=t.escapeParameterHtml||e.escapeParameterHtml,e.sync=t.sync||e.sync,e.__composer[Xd](t.pluralizationRules||e.pluralizationRules);const n=Ka(e.locale,{messages:t.messages,__i18n:t.__i18n});return Object.keys(n).forEach(s=>e.mergeLocaleMessage(s,n[s])),t.datetimeFormats&&Object.keys(t.datetimeFormats).forEach(s=>e.mergeDateTimeFormat(s,t.datetimeFormats[s])),t.numberFormats&&Object.keys(t.numberFormats).forEach(s=>e.mergeNumberFormat(s,t.numberFormats[s])),e}const zh=Ln(\"global-vue-i18n\");function Kh(e={},t){const n=__VUE_I18N_LEGACY_API__&&Te(e.legacy)?e.legacy:__VUE_I18N_LEGACY_API__,s=Te(e.globalInjection)?e.globalInjection:!0,r=__VUE_I18N_LEGACY_API__&&n?!!e.allowComposition:!0,a=new Map,[o,i]=qh(e,n),l=Ln(\"\");function u(p){return a.get(p)||null}function c(p,y){a.set(p,y)}function _(p){a.delete(p)}{let y;const p={get mode(){return __VUE_I18N_LEGACY_API__&&n?\"legacy\":\"composition\"},get allowComposition(){return r},install(E,...k){return te(this,null,function*(){if(E.__VUE_I18N_SYMBOL__=l,E.provide(E.__VUE_I18N_SYMBOL__,p),ge(k[0])){const w=k[0];p.__composerExtend=w.__composerExtend,p.__vueI18nExtend=w.__vueI18nExtend}let S=null;!n&&s&&(S=r6(E,p.global)),__VUE_I18N_FULL_INSTALL__&&jh(E,p,...k),__VUE_I18N_LEGACY_API__&&n&&E.mixin(Gh(i,i.__composer,p));const m=E.unmount;E.unmount=()=>{S&&S(),p.dispose(),m()}})},get global(){return i},dispose(){o.stop()},__instances:a,__getInstance:u,__setInstance:c,__deleteInstance:_};return p}}function Xi(e={}){const t=Ht();if(t==null)throw ft(at.MUST_BE_CALL_SETUP_TOP);if(!t.isCE&&t.appContext.app!=null&&!t.appContext.app.__VUE_I18N_SYMBOL__)throw ft(at.NOT_INSTALLED);const n=Jh(t),s=Zh(n),r=Qd(t),a=Xh(e,r);if(__VUE_I18N_LEGACY_API__&&n.mode===\"legacy\"&&!e.__useComponent){if(!n.allowComposition)throw ft(at.NOT_AVAILABLE_IN_LEGACY_MODE);return n6(t,a,s,e)}if(a===\"global\")return ef(s,e,r),s;if(a===\"parent\"){let l=Qh(n,t,e.__useComponent);return l==null&&(l=s),l}const o=n;let i=o.__getInstance(t);if(i==null){const l=vt({},e);\"__i18n\"in r&&(l.__i18n=r.__i18n),s&&(l.__root=s),i=qi(l),o.__composerExtend&&(i[ti]=o.__composerExtend(i)),t6(o,t,i),o.__setInstance(t,i)}return i}function qh(e,t,n){const s=wi();{const r=__VUE_I18N_LEGACY_API__&&t?s.run(()=>si(e)):s.run(()=>qi(e));if(r==null)throw ft(at.UNEXPECTED_ERROR);return[s,r]}}function Jh(e){{const t=ve(e.isCE?zh:e.appContext.app.__VUE_I18N_SYMBOL__);if(!t)throw ft(e.isCE?at.NOT_INSTALLED_WITH_PROVIDE:at.UNEXPECTED_ERROR);return t}}function Xh(e,t){return Ga(e)?\"__i18n\"in t?\"local\":\"global\":e.useScope?e.useScope:\"local\"}function Zh(e){return e.mode===\"composition\"?e.global:e.global.__composer}function Qh(e,t,n=!1){let s=null;const r=t.root;let a=e6(t,n);for(;a!=null;){const o=e;if(e.mode===\"composition\")s=o.__getInstance(a);else if(__VUE_I18N_LEGACY_API__){const i=o.__getInstance(a);i!=null&&(s=i.__composer,n&&s&&!s[Zd]&&(s=null))}if(s!=null||r===a)break;a=a.parent}return s}function e6(e,t=!1){return e==null?null:t&&e.vnode.ctx||e.parent}function t6(e,t,n){is(()=>{},t),rr(()=>{const s=n;e.__deleteInstance(t);const r=s[ti];r&&(r(),delete s[ti])},t)}function n6(e,t,n,s={}){const r=t===\"local\",a=Kc(null);if(r&&e.proxy&&!(e.proxy.$options.i18n||e.proxy.$options.__i18n))throw ft(at.MUST_DEFINE_I18N_OPTION_IN_ALLOW_COMPOSITION);const o=Te(s.inheritLocale)?s.inheritLocale:!q(s.locale),i=le(!r||o?n.locale.value:q(s.locale)?s.locale:Xs),l=le(!r||o?n.fallbackLocale.value:q(s.fallbackLocale)||Ge(s.fallbackLocale)||ge(s.fallbackLocale)||s.fallbackLocale===!1?s.fallbackLocale:i.value),u=le(Ka(i.value,s)),c=le(ge(s.datetimeFormats)?s.datetimeFormats:{[i.value]:{}}),_=le(ge(s.numberFormats)?s.numberFormats:{[i.value]:{}}),p=r?n.missingWarn:Te(s.missingWarn)||os(s.missingWarn)?s.missingWarn:!0,y=r?n.fallbackWarn:Te(s.fallbackWarn)||os(s.fallbackWarn)?s.fallbackWarn:!0,E=r?n.fallbackRoot:Te(s.fallbackRoot)?s.fallbackRoot:!0,k=!!s.fallbackFormat,S=Qe(s.missing)?s.missing:null,m=Qe(s.postTranslation)?s.postTranslation:null,w=r?n.warnHtmlMessage:Te(s.warnHtmlMessage)?s.warnHtmlMessage:!0,P=!!s.escapeParameter,b=r?n.modifiers:ge(s.modifiers)?s.modifiers:{},D=s.pluralRules||r&&n.pluralRules;function I(){return[i.value,l.value,u.value,c.value,_.value]}const V=be({get:()=>a.value?a.value.locale.value:i.value,set:h=>{a.value&&(a.value.locale.value=h),i.value=h}}),M=be({get:()=>a.value?a.value.fallbackLocale.value:l.value,set:h=>{a.value&&(a.value.fallbackLocale.value=h),l.value=h}}),U=be(()=>a.value?a.value.messages.value:u.value),ee=be(()=>c.value),_e=be(()=>_.value);function H(){return a.value?a.value.getPostTranslationHandler():m}function ie(h){a.value&&a.value.setPostTranslationHandler(h)}function Me(){return a.value?a.value.getMissingHandler():S}function qe(h){a.value&&a.value.setMissingHandler(h)}function de(h){return I(),h()}function we(...h){return a.value?de(()=>Reflect.apply(a.value.t,null,[...h])):de(()=>\"\")}function Ee(...h){return a.value?Reflect.apply(a.value.rt,null,[...h]):\"\"}function mt(...h){return a.value?de(()=>Reflect.apply(a.value.d,null,[...h])):de(()=>\"\")}function Dt(...h){return a.value?de(()=>Reflect.apply(a.value.n,null,[...h])):de(()=>\"\")}function yt(h){return a.value?a.value.tm(h):{}}function rt(h,g){return a.value?a.value.te(h,g):!1}function Vt(h){return a.value?a.value.getLocaleMessage(h):{}}function jt(h,g){a.value&&(a.value.setLocaleMessage(h,g),u.value[h]=g)}function cn(h,g){a.value&&a.value.mergeLocaleMessage(h,g)}function Ze(h){return a.value?a.value.getDateTimeFormat(h):{}}function L(h,g){a.value&&(a.value.setDateTimeFormat(h,g),c.value[h]=g)}function z(h,g){a.value&&a.value.mergeDateTimeFormat(h,g)}function W(h){return a.value?a.value.getNumberFormat(h):{}}function Q(h,g){a.value&&(a.value.setNumberFormat(h,g),_.value[h]=g)}function Se(h,g){a.value&&a.value.mergeNumberFormat(h,g)}const v={get id(){return a.value?a.value.id:-1},locale:V,fallbackLocale:M,messages:U,datetimeFormats:ee,numberFormats:_e,get inheritLocale(){return a.value?a.value.inheritLocale:o},set inheritLocale(h){a.value&&(a.value.inheritLocale=h)},get availableLocales(){return a.value?a.value.availableLocales:Object.keys(u.value)},get modifiers(){return a.value?a.value.modifiers:b},get pluralRules(){return a.value?a.value.pluralRules:D},get isGlobal(){return a.value?a.value.isGlobal:!1},get missingWarn(){return a.value?a.value.missingWarn:p},set missingWarn(h){a.value&&(a.value.missingWarn=h)},get fallbackWarn(){return a.value?a.value.fallbackWarn:y},set fallbackWarn(h){a.value&&(a.value.missingWarn=h)},get fallbackRoot(){return a.value?a.value.fallbackRoot:E},set fallbackRoot(h){a.value&&(a.value.fallbackRoot=h)},get fallbackFormat(){return a.value?a.value.fallbackFormat:k},set fallbackFormat(h){a.value&&(a.value.fallbackFormat=h)},get warnHtmlMessage(){return a.value?a.value.warnHtmlMessage:w},set warnHtmlMessage(h){a.value&&(a.value.warnHtmlMessage=h)},get escapeParameter(){return a.value?a.value.escapeParameter:P},set escapeParameter(h){a.value&&(a.value.escapeParameter=h)},t:we,getPostTranslationHandler:H,setPostTranslationHandler:ie,getMissingHandler:Me,setMissingHandler:qe,rt:Ee,d:mt,n:Dt,tm:yt,te:rt,getLocaleMessage:Vt,setLocaleMessage:jt,mergeLocaleMessage:cn,getDateTimeFormat:Ze,setDateTimeFormat:L,mergeDateTimeFormat:z,getNumberFormat:W,setNumberFormat:Q,mergeNumberFormat:Se};function f(h){h.locale.value=i.value,h.fallbackLocale.value=l.value,Object.keys(u.value).forEach(g=>{h.mergeLocaleMessage(g,u.value[g])}),Object.keys(c.value).forEach(g=>{h.mergeDateTimeFormat(g,c.value[g])}),Object.keys(_.value).forEach(g=>{h.mergeNumberFormat(g,_.value[g])}),h.escapeParameter=P,h.fallbackFormat=k,h.fallbackRoot=E,h.fallbackWarn=y,h.missingWarn=p,h.warnHtmlMessage=w}return cd(()=>{if(e.proxy==null||e.proxy.$i18n==null)throw ft(at.NOT_AVAILABLE_COMPOSITION_IN_LEGACY);const h=a.value=e.proxy.$i18n.__composer;t===\"global\"?(i.value=h.locale.value,l.value=h.fallbackLocale.value,u.value=h.messages.value,c.value=h.datetimeFormats.value,_.value=h.numberFormats.value):r&&f(h)}),v}const s6=[\"locale\",\"fallbackLocale\",\"availableLocales\"],Xu=[\"t\",\"rt\",\"d\",\"n\",\"tm\",\"te\"];function r6(e,t){const n=Object.create(null);return s6.forEach(r=>{const a=Object.getOwnPropertyDescriptor(t,r);if(!a)throw ft(at.UNEXPECTED_ERROR);const o=je(a.value)?{get(){return a.value.value},set(i){a.value.value=i}}:{get(){return a.get&&a.get()}};Object.defineProperty(n,r,o)}),e.config.globalProperties.$i18n=n,Xu.forEach(r=>{const a=Object.getOwnPropertyDescriptor(t,r);if(!a||!a.value)throw ft(at.UNEXPECTED_ERROR);Object.defineProperty(e.config.globalProperties,`$${r}`,a)}),()=>{delete e.config.globalProperties.$i18n,Xu.forEach(r=>{delete e.config.globalProperties[`$${r}`]})}}Mh();__INTLIFY_JIT_COMPILATION__?Pu(Oh):Pu(Dh);kh(sh);wh(xd);if(__INTLIFY_PROD_DEVTOOLS__){const e=Fn();e.__INTLIFY__=!0,fh(e.__INTLIFY_DEVTOOLS_GLOBAL_HOOK__)}const a6=Object.assign({en:c2,\"zh-CN\":d2,\"zh-TW\":f2});function o6(){const e=localStorage.getItem(\"i18n\");return e?e===\"auto\"?navigator.language:e:(localStorage.setItem(\"i18n\",\"auto\"),navigator.language)}const i6=Kh({locale:o6(),fallbackLocale:\"zh-CN\",messages:a6}),l6=ue({__name:\"App\",setup(e){return(t,n)=>{const s=ht(\"router-view\");return C(),Fe(s)}}});var u6=!1;/*!\n * pinia v2.1.6\n * (c) 2023 Eduardo San Martin Morote\n * @license MIT\n */let sf;const qa=e=>sf=e,rf=Symbol();function ri(e){return e&&typeof e==\"object\"&&Object.prototype.toString.call(e)===\"[object Object]\"&&typeof e.toJSON!=\"function\"}var Tr;(function(e){e.direct=\"direct\",e.patchObject=\"patch object\",e.patchFunction=\"patch function\"})(Tr||(Tr={}));function af(){const e=wi(!0),t=e.run(()=>le({}));let n=[],s=[];const r=Ra({install(a){qa(r),r._a=a,a.provide(rf,r),a.config.globalProperties.$pinia=r,s.forEach(o=>n.push(o)),s=[]},use(a){return!this._a&&!u6?s.push(a):n.push(a),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return r}const of=()=>{};function Zu(e,t,n,s=of){e.push(t);const r=()=>{const a=e.indexOf(t);a>-1&&(e.splice(a,1),s())};return!n&&Ic()&&z1(r),r}function Ps(e,...t){e.slice().forEach(n=>{n(...t)})}const c6=e=>e();function ai(e,t){e instanceof Map&&t instanceof Map&&t.forEach((n,s)=>e.set(s,n)),e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const s=t[n],r=e[n];ri(r)&&ri(s)&&e.hasOwnProperty(n)&&!je(s)&&!Jn(s)?e[n]=ai(r,s):e[n]=s}return e}const d6=Symbol();function f6(e){return!ri(e)||!e.hasOwnProperty(d6)}const{assign:Wn}=Object;function h6(e){return!!(je(e)&&e.effect)}function _6(e,t,n,s){const{state:r,actions:a,getters:o}=t,i=n.state.value[e];let l;function u(){i||(n.state.value[e]=r?r():{});const c=w0(n.state.value[e]);return Wn(c,a,Object.keys(o||{}).reduce((_,p)=>(_[p]=Ra(be(()=>{qa(n);const y=n._s.get(e);return o[p].call(y,y)})),_),{}))}return l=lf(e,u,t,n,s,!0),l}function lf(e,t,n={},s,r,a){let o;const i=Wn({actions:{}},n),l={deep:!0};let u,c,_=[],p=[],y;const E=s.state.value[e];!a&&!E&&(s.state.value[e]={}),le({});let k;function S(M){let U;u=c=!1,typeof M==\"function\"?(M(s.state.value[e]),U={type:Tr.patchFunction,storeId:e,events:y}):(ai(s.state.value[e],M),U={type:Tr.patchObject,payload:M,storeId:e,events:y});const ee=k=Symbol();Ii().then(()=>{k===ee&&(u=!0)}),c=!0,Ps(_,U,s.state.value[e])}const m=a?function(){const{state:U}=n,ee=U?U():{};this.$patch(_e=>{Wn(_e,ee)})}:of;function w(){o.stop(),_=[],p=[],s._s.delete(e)}function P(M,U){return function(){qa(s);const ee=Array.from(arguments),_e=[],H=[];function ie(de){_e.push(de)}function Me(de){H.push(de)}Ps(p,{args:ee,name:M,store:D,after:ie,onError:Me});let qe;try{qe=U.apply(this&&this.$id===e?this:D,ee)}catch(de){throw Ps(H,de),de}return qe instanceof Promise?qe.then(de=>(Ps(_e,de),de)).catch(de=>(Ps(H,de),Promise.reject(de))):(Ps(_e,qe),qe)}}const b={_p:s,$id:e,$onAction:Zu.bind(null,p),$patch:S,$reset:m,$subscribe(M,U={}){const ee=Zu(_,M,U.detached,()=>_e()),_e=o.run(()=>Zn(()=>s.state.value[e],H=>{(U.flush===\"sync\"?c:u)&&M({storeId:e,type:Tr.direct,events:y},H)},Wn({},l,U)));return ee},$dispose:w},D=wt(b);s._s.set(e,D);const I=s._a&&s._a.runWithContext||c6,V=s._e.run(()=>(o=wi(),I(()=>o.run(t))));for(const M in V){const U=V[M];if(je(U)&&!h6(U)||Jn(U))a||(E&&f6(U)&&(je(U)?U.value=E[M]:ai(U,E[M])),s.state.value[e][M]=U);else if(typeof U==\"function\"){const ee=P(M,U);V[M]=ee,i.actions[M]=U}}return Wn(D,V),Wn(De(D),V),Object.defineProperty(D,\"$state\",{get:()=>s.state.value[e],set:M=>{S(U=>{Wn(U,M)})}}),s._p.forEach(M=>{Wn(D,o.run(()=>M({store:D,app:s._a,pinia:s,options:i})))}),E&&a&&n.hydrate&&n.hydrate(D.$state,E),u=!0,c=!0,D}function or(e,t,n){let s,r;const a=typeof t==\"function\";typeof e==\"string\"?(s=e,r=a?n:t):(r=e,s=e.id);function o(i,l){const u=f3();return i=i||(u?ve(rf,null):null),i&&qa(i),i=sf,i._s.has(s)||(a?lf(s,t,r,i):_6(s,r,i)),i._s.get(s)}return o.$id=s,o}const p6=af,uf=or(\"popups\",{state:()=>({index:0,values:new Map}),actions:{addValue(e){const t=this.values.get(e);return t?(this.index=t.config.globalProperties.key,!0):!1},setValue(e,t){this.values.set(e,t)},delValue(e){}}});var he=(e,t)=>{const n=e.__vccOpts||e;for(const[s,r]of t)n[s]=r;return n};const cf=e=>(nt(\"data-v-5bcbebe8\"),e=e(),st(),e),m6={key:0,class:\"bg\"},g6={class:\"title\"},v6=cf(()=>d(\"div\",{class:\"auto\"},null,-1)),y6={class:\"btns\"},b6=cf(()=>d(\"svg\",{class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",width:\"128\",height:\"128\"},[d(\"path\",{d:\"M557.312 513.248l265.28-263.904c12.544-12.48 12.608-32.704 0.128-45.248-12.512-12.576-32.704-12.608-45.248-0.128l-265.344 263.936-263.04-263.84C236.64 191.584 216.384 191.52 203.84 204 191.328 216.48 191.296 236.736 203.776 249.28l262.976 263.776L201.6 776.8c-12.544 12.48-12.608 32.704-0.128 45.248 6.24 6.272 14.464 9.44 22.688 9.44 8.16 0 16.32-3.104 22.56-9.312l265.216-263.808 265.44 266.24c6.24 6.272 14.432 9.408 22.656 9.408 8.192 0 16.352-3.136 22.592-9.344 12.512-12.48 12.544-32.704 0.064-45.248L557.312 513.248z\"})],-1)),E6=[b6],k6=ue({__name:\"app\",props:{title:{type:String},transparent:{type:Boolean,default:!0},bg:{type:Boolean,default:!1},full:{type:Boolean,default:!1}},setup(e){const t=e,n=le(null),s=()=>{u&&u.appContext.config.globalProperties.$close()},r=wt({left:\"\",top:\"\"}),a=y=>{const E=n.value;if(E==null||o.value)return;let k=y.clientX-E.offsetLeft,S=y.clientY-E.offsetTop,m=document.body.clientWidth-E.offsetWidth,w=document.body.clientHeight-E.offsetHeight;document.onmousemove=P=>{let b=P.clientX-k,D=P.clientY-S;D<0&&(D=0),b<0&&(b=0),b>m&&(b=m),D>w&&(D=w),r.left=b+\"px\",r.top=D+\"px\"},document.onmouseup=()=>{document.onmousemove=null,document.onmouseup=null}},o=le(t.full),i=()=>{o.value=!o.value},l=uf(),u=Ht(),c=be(()=>(u==null?void 0:u.appContext.config.globalProperties.key)||0),_=be(()=>l.index==c.value),p=()=>{l.index=c.value};return(y,E)=>(C(),N(me,null,[e.bg?(C(),N(\"div\",m6)):pe(\"\",!0),d(\"div\",{class:_t([\"themedog-popups\",{full:o.value,index:_.value}]),style:Ts(o.value?{}:r),ref_key:\"popus\",ref:n},[d(\"div\",{class:\"themedog-popups_header\",onMousedown:a,onClick:p,onDblclick:i},[d(\"span\",g6,X(e.title),1),v6,d(\"div\",y6,[d(\"button\",{class:\"btn-close\",onClick:E[0]||(E[0]=k=>s())},E6)])],32),d(\"div\",{class:_t([\"themedog-popups_body\",{transparent:e.transparent}])},[Yt(y.$slots,\"default\",{},void 0,!0)],2)],6)],64))}});var w6=he(k6,[[\"__scopeId\",\"data-v-5bcbebe8\"]]);const S6={key:0,class:\"popups-container setup0\"},C6={class:\"popups-container_f\"},T6={class:\"popups-container_r\"},F6={key:1,class:\"popups-container setup1\"},D6={key:2,class:\"popups-container setup2\"},O6=ue({__name:\"app-container\",props:{title:String,bg:Boolean,transparent:Boolean,full:Boolean,type:{type:Number,default:0}},setup(e){return(t,n)=>{const s=ht(\"popups\");return C(),Fe(s,{title:e.title,bg:e.bg,transparent:e.transparent,full:e.full},{default:Ue(()=>[e.type==0?(C(),N(\"div\",S6,[d(\"div\",C6,[Yt(t.$slots,\"left\",{},void 0,!0)]),d(\"div\",T6,[Yt(t.$slots,\"right\",{},void 0,!0)])])):e.type==1?(C(),N(\"div\",F6,[Yt(t.$slots,\"default\",{},void 0,!0)])):e.type==2?(C(),N(\"div\",D6,[Yt(t.$slots,\"default\",{},void 0,!0)])):pe(\"\",!0)]),_:3},8,[\"title\",\"bg\",\"transparent\",\"full\"])}}});var P6=he(O6,[[\"__scopeId\",\"data-v-e3f9f146\"]]);const N6={id:\"action\"},I6={key:0,class:\"bg\"},A6=ue({__name:\"app-action\",props:{bg:{type:Boolean,default:!0}},setup(e){return(t,n)=>(C(),N(\"div\",N6,[e.bg?(C(),N(\"div\",I6)):pe(\"\",!0),Yt(t.$slots,\"default\",{},void 0,!0)]))}});var Qu=he(A6,[[\"__scopeId\",\"data-v-1fde8680\"]]),L6={install(e){e.component(\"popups\",w6),e.component(\"popups-container\",P6),e.component(\"app-action\",Qu),e.component(\"action-component\",Qu)}};const M6=[\"onClick\"];ue({__name:\"index\",props:{setup:{type:String,default:\"pppoe\"}},setup(e){const n=le(e.setup),s=[{name:\"device-router\",title:\"\\u8BBE\\u5907\\u8DEF\\u7531\",f:()=>{}},{name:\"network-monitoring\",title:\"\\u5E26\\u5BBD\\u76D1\\u63A7\",f:()=>{}},{name:\"network-speed\",title:\"\\u5185\\u7F51\\u6D4B\\u901F\",f:()=>{}},{name:\"opkg\",title:\"\\u8F6F\\u4EF6\\u6E90\\u914D\\u7F6E\",f:()=>{}},{name:\"sandbox\",title:\"\\u6C99\\u7BB1\\u529F\\u80FD\",f:()=>{}},{name:\"system-monitor\",title:\"\\u7CFB\\u7EDF\\u76D1\\u63A7\",f:()=>{}},{name:\"backup-upgrade\",title:\"\\u5907\\u4EFD\\u5347\\u7EA7\",f:()=>{}},{name:\"plugin-upgrade\",title:\"\\u63D2\\u4EF6\\u5907\\u4EFD\",f:()=>{}},{name:\"os-upgrade\",title:\"\\u56FA\\u4EF6\\u66F4\\u65B0\",f:()=>{}}];return(r,a)=>{const o=ht(\"popups-container\");return C(),Fe(o,{title:\"\\u529F\\u80FD\\u7BA1\\u7406\",transparent:\"\"},{left:Ue(()=>[(C(),N(me,null,ct(s,i=>d(\"li\",{class:_t([\"network-menu_item\",{on:n.value==i.name}]),onClick:l=>n.value=i.name},[d(\"span\",null,X(i.title),1)],10,M6)),64))]),right:Ue(()=>[]),_:1})}}});const x6=[\"src\"],$6=ue({__name:\"index\",props:{src:{type:String,required:!0}},setup(e){const t=le(),n=s=>{if(t.value){const r=t.value;if(r.contentWindow){let a=document.createElement(\"style\");a.setAttribute(\"rel\",\"stylesheet\"),a.innerHTML=\".main-left{display: none;}.main-right{width: 100%!important;transition:none;}\",r.contentWindow.document.head.appendChild(a)}}};return(s,r)=>(C(),N(\"iframe\",{class:\"themedog-iframe_container\",allowfullscreen:\"true\",mozallowfullscreen:\"mozallowfullscreen\",msallowfullscreen:\"msallowfullscreen\",oallowfullscreen:\"oallowfullscreen\",webkitallowfullscreen:\"webkitallowfullscreen\",src:e.src,onLoad:n,ref_key:\"el\",ref:t},null,40,x6))}});var R6=he($6,[[\"__scopeId\",\"data-v-177d395f\"]]);const B6=ue({__name:\"index\",props:{title:{type:String,default:\"\"},src:{type:String,required:!0},full:{type:Boolean,default:!1}},setup(e){return(t,n)=>{const s=ht(\"popups-container\");return C(),Fe(s,{transparent:!0,title:e.title,type:2,full:e.full},{default:Ue(()=>[Ie(R6,{src:e.src},null,8,[\"src\"])]),_:1},8,[\"title\",\"full\"])}}});const Ja=e=>(nt(\"data-v-c694747c\"),e=e(),st(),e),U6={key:0,class:\"locking\"},Y6={key:0,class:\"loading icon\"},H6=Ja(()=>d(\"svg\",{t:\"1631799919469\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"3453\",width:\"128\",height:\"128\"},[d(\"path\",{d:\"M522.695111 1.991111c-26.339556 0.170667-47.416889 21.475556-47.672889 48.753778-0.284444 26.453333-0.056889 52.963556-0.056889 79.445333 0 27.249778-0.369778 54.528 0.113778 81.777778 0.483556 27.050667 22.016 47.132444 49.351111 46.904889a47.786667 47.786667 0 0 0 47.729778-47.445333c0.284444-53.76 0.284444-107.52-0.028444-161.251556-0.170667-27.676444-21.902222-48.355556-49.436445-48.184889m-195.896889 88.092445c-8.334222-14.222222-21.646222-21.276444-38.314666-21.333334-35.128889 0-56.576 36.949333-38.968889 68.152889a11616.995556 11616.995556 0 0 0 78.961777 137.614222 44.942222 44.942222 0 0 0 61.838223 16.896c21.304889-12.202667 29.667556-38.968889 17.379555-60.871111-26.453333-47.104-53.560889-93.866667-80.896-140.458666m-228.693333 234.524444c44.316444 25.799111 88.746667 51.342222 133.176889 76.970667 6.712889 3.896889 13.681778 6.912 21.703111 6.428444 20.138667 0.142222 35.953778-11.946667 41.301333-31.573333 5.006222-18.261333-2.673778-36.721778-20.224-46.990222-44.629333-26.026667-89.372444-51.882667-134.115555-77.710223-22.528-12.999111-47.815111-7.025778-59.818667 13.909334-12.231111 21.248-4.977778 45.624889 17.948444 58.965333m34.161778 235.975111c26.396444 0 52.821333 0.199111 79.217778-0.085333 23.409778-0.256 39.139556-16.412444 38.798222-39.139556-0.341333-21.617778-16.924444-37.347556-39.594666-37.376-51.655111-0.056889-103.310222-0.056889-154.965334 0.028445-24.177778 0.056889-40.704 15.985778-40.561778 38.684444 0.142222 22.186667 16.583111 37.745778 40.192 37.859556 25.656889 0.142222 51.285333 0.028444 76.913778 0m151.722667 100.238222a34.247111 34.247111 0 0 0-46.876445-12.942222 13764.778667 13764.778667 0 0 0-139.008 80.583111c-11.093333 6.485333-16.327111 16.867556-16.497777 25.372444 0.085333 30.549333 27.249778 47.957333 50.403555 35.072 47.160889-26.197333 93.724444-53.475556 140.145778-80.924444 17.180444-10.154667 21.504-30.378667 11.832889-47.160889m91.875555 101.660444c-14.250667-4.067556-27.619556 1.422222-35.84 15.644445a24375.466667 24375.466667 0 0 0-77.312 134.485333c-10.012444 17.550222-5.859556 35.669333 9.784889 45.027556 16.014222 9.557333 34.247111 4.039111 44.714667-13.994667 25.543111-44.088889 50.915556-88.263111 76.373333-132.352 3.299556-5.745778 5.688889-11.690667 5.745778-14.933333 0-17.834667-9.272889-29.866667-23.466667-33.877334m147.456 44.288c-16.384 0.085333-27.306667 11.918222-27.448888 30.151111-0.142222 25.372444-0.028444 50.716444-0.028445 76.060445h-0.085333c0 26.112-0.113778 52.252444 0.056889 78.364444 0.113778 18.261333 11.064889 30.065778 27.448889 30.208 16.952889 0.142222 28.046222-11.832889 28.103111-30.748444 0.113778-51.086222 0.142222-102.172444 0.056889-153.258667 0-18.773333-11.207111-30.862222-28.103112-30.776889m177.208889-26.112c-7.509333-12.8-21.902222-16.014222-33.792-8.874666a23.722667 23.722667 0 0 0-8.533333 32.995555c26.282667 46.279111 52.906667 92.330667 79.644444 138.353778 4.494222 7.765333 11.633778 11.946667 20.906667 11.804444 18.545778-0.142222 30.520889-19.342222 21.219556-35.868444-26.026667-46.392889-52.650667-92.444444-79.473778-138.410667m239.957333-41.187555c-45.283556-26.254222-90.595556-52.48-135.964444-78.648889-4.693333-2.702222-9.728-4.323556-15.36-2.958222-9.102222 2.247111-14.933333 8.049778-16.497778 17.095111-1.877333 10.894222 3.84 18.204444 12.885333 23.438222 29.809778 17.180444 59.562667 34.417778 89.344 51.598222 15.217778 8.789333 30.236444 17.976889 45.738667 26.225778 14.677333 7.793778 31.061333-2.048 31.061333-18.033778-0.056889-8.448-4.096-14.592-11.207111-18.716444m48.867556-234.638222c-24.888889-0.085333-49.749333 0-74.609778 0v-0.085334c-25.258667 0-50.517333-0.056889-75.776 0.028445-13.425778 0.056889-20.963556 6.343111-21.162667 17.294222-0.199111 11.150222 7.082667 17.521778 20.679111 17.550222 50.488889 0.113778 100.977778 0.142222 151.495112 0.085333 13.368889 0 21.191111-6.485333 21.390222-17.152 0.227556-10.808889-8.106667-17.664-22.016-17.720888m-187.960889-127.146667c45.084444-26.026667 90.140444-52.110222 135.168-78.222222 4.864-2.844444 8.248889-6.855111 8.135111-12.942223-0.142222-11.036444-11.207111-17.436444-21.504-11.548444-45.511111 26.055111-90.851556 52.394667-136.135111 78.819556-7.68 4.494222-10.524444 11.52-5.575111 19.569777 4.835556 7.850667 12.088889 8.817778 19.911111 4.323556m-122.311111-115.114667c5.205333-0.256 8.220444-3.413333 10.609778-7.651555 4.920889-8.647111 10.040889-17.208889 14.990222-25.827556 20.48-35.555556 40.931556-71.025778 61.297778-106.609778 5.091556-8.874667 3.015111-16.668444-4.778667-18.517333-7.68-1.848889-10.894222 3.697778-14.051556 9.159111l-68.778666 119.495111c-2.844444 4.977778-6.030222 9.870222-8.305778 15.104-3.128889 7.196444 1.678222 14.648889 9.045333 14.848\",\"p-id\":\"3454\"})],-1)),W6=[H6],V6={key:1,class:\"success icon\"},j6=Ja(()=>d(\"svg\",{t:\"1632451272305\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2204\",width:\"128\",height:\"128\"},[d(\"path\",{d:\"M1001.305115 275.874141 431.461709 845.718571c-28.221762 28.221762-73.977875 28.221762-102.20066 0L22.661116 539.116591c-28.222785-28.221762-28.222785-73.979922 0-102.20066 28.221762-28.221762 73.977875-28.221762 102.20066 0l255.500115 255.502162 518.743588-518.743588c28.221762-28.221762 73.977875-28.221762 102.199637 0C1029.5279 201.89422 1029.5279 247.65238 1001.305115 275.874141z\",\"p-id\":\"2205\"})],-1)),G6=[j6],z6={key:2,class:\"error icon\"},K6=Ja(()=>d(\"svg\",{t:\"1632451325789\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2204\",width:\"128\",height:\"128\"},[d(\"path\",{d:\"M823.04 840.32 524.16 540.16l296.32-294.4c12.8-12.8 12.8-33.28 0-45.44-12.8-12.8-33.28-12.8-46.08 0L478.08 494.08 184.96 200.32c-12.8-12.8-33.28-12.8-45.44 0s-12.8 33.28 0 45.44l292.48 293.76-302.72 300.8c-12.8 12.8-12.8 33.28 0 45.44 12.8 12.8 33.28 12.8 46.08 0l302.72-300.16 299.52 300.16c12.8 12.8 33.28 12.8 45.44 0C835.2 873.6 835.2 853.12 823.04 840.32z\",\"p-id\":\"2205\"})],-1)),q6=[K6],J6={key:3,class:\"warning icon\"},X6=Ja(()=>d(\"svg\",{t:\"1632451401172\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"1638\",width:\"128\",height:\"128\"},[d(\"path\",{d:\"M512 1021.45211835a60.32985613 60.32985613 0 1 1 60.32985613-60.32985611 60.32985613 60.32985613 0 0 1-60.32985613 60.32985611z m86.85823451-924.97400238L572.32985613 719.80283775a60.32985613 60.32985613 0 0 1-120.65971226 0l-26.52837838-623.32472178c-0.16758294-2.22885301-0.28489098-4.49122263-0.284891-6.78710881a87.14312551 87.14312551 0 0 1 174.28625102 0c0 2.2958862-0.11730806 4.5582558-0.284891 6.78710881z\",\"p-id\":\"1639\"})],-1)),Z6=[X6],Q6=[\"onClick\"],e4=ue({__name:\"app\",props:{type:String,message:String,Close:Function,locking:Boolean},setup(e){const t=e,n=le(!1);is(()=>{n.value=!0});const s=()=>{(t==null?void 0:t.type)!=\"loading\"&&(n.value=!1,t.Close&&t.Close())};return(r,a)=>(C(),N(me,null,[e.locking?(C(),N(\"div\",U6)):pe(\"\",!0),n.value?(C(),N(\"div\",{key:1,class:\"toast\",onClick:a[0]||(a[0]=o=>s())},[e.type==\"loading\"?(C(),N(\"div\",Y6,W6)):e.type==\"success\"?(C(),N(\"div\",V6,G6)):e.type==\"error\"?(C(),N(\"div\",z6,q6)):e.type==\"warning\"?(C(),N(\"div\",J6,Z6)):pe(\"\",!0),d(\"div\",{class:\"message\",onClick:ls(()=>{},[\"stop\"])},X(e.message),9,Q6)])):pe(\"\",!0)],64))}});var t4=he(e4,[[\"__scopeId\",\"data-v-c694747c\"]]);const Fr=new Map,Fs=e=>{const t=Wi(t4,fr(gt({},e),{Close:()=>{s()}})),n=document.createElement(\"div\");document.body.append(n),t.mount(n);const s=()=>{n.remove(),t.unmount(),Fr.get(t._uid)&&Fr.delete(t._uid)};return e.type==\"loading\"&&Fr.set(t._uid,{Close:s}),(e==null?void 0:e.duration)==0||((e==null?void 0:e.duration)>0?setTimeout(()=>{s()},e==null?void 0:e.duration):setTimeout(()=>{s()},3e3)),{Close:s}},fe=e=>Fs(e);fe.Loading=(e,t)=>Fs({type:\"loading\",message:e||\"\\u52A0\\u8F7D\\u4E2D...\",duration:0,locking:t||!1});fe.Success=e=>Fs({type:\"success\",message:e});fe.Error=e=>Fs({type:\"error\",message:e});fe.Warning=e=>Fs({type:\"warning\",message:e});fe.Message=e=>Fs({message:e});fe.Message=e=>Fs({message:e});fe.Clear=()=>{Fr.forEach((e,t)=>{e.Close(),Fr.delete(t)})};const At=(e,t)=>te(void 0,null,function*(){return new Promise((s,r)=>te(void 0,null,function*(){try{const a=yield fetch(e,gt({},t)),o=a;o.status===0||o.status===200?(o.data=yield a.json(),s(o)):r(o)}catch(a){r(a)}}))}),G=(e,t)=>(e=`/cgi-bin/luci/istore${e}`,At(e,t)),n4=(e,t)=>(e=`/cgi-bin/luci/linkease/api${e}`,At(e,t)),s4={Status:{GET(){return G(\"/system/status/\",{method:\"GET\"})}},CPU:{Status:{GET(){return G(\"/system/cpu/status/\",{method:\"GET\"})}},Temperature:{GET(){return G(\"/system/cpu/temperature/\",{method:\"GET\"})}}},Memery:{Status:{GET(){return G(\"/system/memery/status/\",{method:\"GET\"})}}},Version:{GET(){return G(\"/system/version/\",{method:\"GET\"})}},Time:{GET(){return G(\"/system/time/\",{method:\"GET\"})}},CheckUpdate:{GET(){return G(\"/system/check-update/\",{method:\"GET\"})}}},r4={Statistics:{GET(){return G(\"/network/statistics/\",{method:\"GET\"})}},Status:{GET(){return G(\"/network/status/\",{method:\"GET\"})}},Device:{List:{GET(){return G(\"/network/device/list/\",{method:\"GET\"})}}},PortList:{GET(){return G(\"/network/port/list/\",{method:\"GET\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"}})}},CheckPublickNet:{POST(e){return G(\"/network/checkPublicNet/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}}},a4={Pppoe:{GET(){return G(\"/guide/pppoe/\",{method:\"GET\"})},POST(e){return G(\"/guide/pppoe/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},ClientModel:{GET(){return G(\"/guide/client-mode/\",{method:\"GET\"})},POST(e){return G(\"/guide/client-mode/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},GatewayRouter:{POST(e){return G(\"/guide/gateway-router/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},GetLan:{GET(){return G(\"/guide/lan/\",{method:\"GET\"})}},LanIp:{POST(e){return G(\"/guide/lan/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},DnsConfig:{GET(){return G(\"/guide/dns-config/\",{method:\"GET\"})},POST(e){return G(\"/guide/dns-config/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},SoftSourceList:{GET(){return G(\"/guide/soft-source/list/\",{method:\"GET\"})}},GetSoftSource:{GET(){return G(\"/guide/soft-source/\",{method:\"GET\"})}},SoftSource:{POST(e){return G(\"/guide/soft-source/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},DockerStatus:{GET(){return G(\"/guide/docker/status/\",{method:\"GET\"})}},DockerPartitionList:{GET(){return G(\"/guide/docker/partition/list/\",{method:\"GET\"})}},DockerTransfer:{POST(e){return G(\"/guide/docker/transfer/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},DockerSwitch:{POST(e){return G(\"/guide/docker/switch/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},Ddns:{GET(){return G(\"/guide/ddns/\",{method:\"GET\"})},POST(e){return G(\"/guide/ddns/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},Ddnsto:{POST(e){return G(\"/guide/ddnsto/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})},Config:{GET(){return G(\"/guide/ddnsto/config/\",{method:\"GET\"})}},Address:{POST(e){return G(\"/guide/ddnsto/address/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}}},DdntoConfig:{GET(){return G(\"/guide/ddnsto/config/\",{method:\"GET\"})}},PostDdns:{POST(e){return G(\"/guide/ddns/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},DownloadPartition:{List:{GET(){return G(\"/guide/download/partition/list/\",{method:\"GET\"})}}},Aria2Init:{POST(e){return G(\"/guide/aria2/init/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},qbitorrentInit:{POST(e){return G(\"/guide/qbittorrent/init/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},transmissionInit:{POST(e){return G(\"/guide/transmission/init/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},DownloadService:{Status:{GET(){return G(\"/guide/download-service/status/\",{method:\"GET\"})}}}},o4={Disk:{Status:{GET(){return G(\"/nas/disk/status/\",{method:\"GET\"})}},Erase:{POST(e){return G(\"/nas/disk/erase\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},Init:{POST:e=>G(\"/nas/disk/init/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})},InitRest:{POST:e=>G(\"/nas/disk/initrest/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})},Partition:{Format:{POST:e=>G(\"/nas/disk/partition/format\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})},Mount:{POST:e=>G(\"/nas/disk/partition/mount\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}}},Service:{Status:{GET(){return G(\"/nas/service/status/\",{method:\"GET\"})}}},Samba:{Create:{POST(e){return G(\"/nas/samba/create\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}}},Webdav:{Create:{POST(e){return G(\"/nas/webdav/create\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},Status:{GET(){return G(\"/nas/webdav/status/\",{method:\"GET\"})}}},Linkease:{Enable:{POST(){return G(\"/nas/linkease/enable\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"}})}}},Sandbox:{POST(e){return G(\"/nas/sandbox/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},GetSandbox:{GET(){return G(\"/nas/sandbox/\",{method:\"GET\"})}},SandboxDisks:{GET(){return G(\"/nas/sandbox/disks/\",{method:\"GET\"})}},SandboxCommit:{POST(){return G(\"/nas/sandbox/commit/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify({})})}},SandboxReset:{POST(){return G(\"/nas/sandbox/reset/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"}})}}},i4={Create:{POST(e){return G(\"/raid/create/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},Delete:{POST(e){return G(\"/raid/delete/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},Add:{POST(e){return G(\"/raid/add/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},Remove:{POST(e){return G(\"/raid/remove/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},Recover:{POST(e){return G(\"/raid/recover/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},Detail:{POST(e){return G(\"/raid/detail/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},List:{GET(){return G(\"/raid/list/\",{method:\"GET\"})}},CreateList:{GET(){return G(\"/raid/create/list/\",{method:\"GET\"})}}},l4={Check:{POST(e){return G(\"/app/check/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},Install:{POST(e){return G(\"/app/install/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}}},u4={Service:{GET(){return G(\"/share/service/list/\",{method:\"GET\"})},ADD(e){return G(\"/share/service/create/\",{body:JSON.stringify(e),method:\"POST\"})},UPDATE(e){return G(\"/share/service/update/\",{body:JSON.stringify(e),method:\"POST\"})},DELETE(e){return G(\"/share/service/delete/\",{body:JSON.stringify(e),method:\"POST\"})}},User:{GET(){return G(\"/share/user/list/\",{method:\"GET\"})},ADD(e){return G(\"/share/user/create/\",{body:JSON.stringify(e),method:\"POST\"})},DELETE(e){return G(\"/share/user/delete/\",{body:JSON.stringify(e),method:\"POST\"})},UPDATE(e){return G(\"/share/user/update/\",{body:JSON.stringify(e),method:\"POST\"})}}},c4={File:{List:{POST(e){return n4(\"/file/basic/list/\",{body:JSON.stringify(e),method:\"POST\"})}}}};var d4=Object.freeze(Object.defineProperty({__proto__:null,System:s4,Network:r4,Guide:a4,Nas:o4,Raid:i4,App:l4,Share:u4,Linkease:c4},Symbol.toStringTag,{value:\"Module\"}));const f4=window.L,ec=()=>new Promise((e,t)=>{try{f4.require(\"network\").then(n=>{n&&(n.getNetwork(\"wan\").then(s=>{if(s){const r=s.getDevice();if(r)return e({up:r.getTXBytes(),down:r.getRXBytes()})}}),n.flushCache())})}catch(n){t(n)}});//! moment.js\n//! version : 2.29.4\n//! authors : Tim Wood, Iskren Chernev, Moment.js contributors\n//! license : MIT\n//! momentjs.com\nvar df;function j(){return df.apply(null,arguments)}function h4(e){df=e}function an(e){return e instanceof Array||Object.prototype.toString.call(e)===\"[object Array]\"}function Ss(e){return e!=null&&Object.prototype.toString.call(e)===\"[object Object]\"}function Ae(e,t){return Object.prototype.hasOwnProperty.call(e,t)}function Zi(e){if(Object.getOwnPropertyNames)return Object.getOwnPropertyNames(e).length===0;var t;for(t in e)if(Ae(e,t))return!1;return!0}function Nt(e){return e===void 0}function In(e){return typeof e==\"number\"||Object.prototype.toString.call(e)===\"[object Number]\"}function Xr(e){return e instanceof Date||Object.prototype.toString.call(e)===\"[object Date]\"}function ff(e,t){var n=[],s,r=e.length;for(s=0;s<r;++s)n.push(t(e[s],s));return n}function zn(e,t){for(var n in t)Ae(t,n)&&(e[n]=t[n]);return Ae(t,\"toString\")&&(e.toString=t.toString),Ae(t,\"valueOf\")&&(e.valueOf=t.valueOf),e}function yn(e,t,n,s){return xf(e,t,n,s,!0).utc()}function _4(){return{empty:!1,unusedTokens:[],unusedInput:[],overflow:-2,charsLeftOver:0,nullInput:!1,invalidEra:null,invalidMonth:null,invalidFormat:!1,userInvalidated:!1,iso:!1,parsedDateParts:[],era:null,meridiem:null,rfc2822:!1,weekdayMismatch:!1}}function ke(e){return e._pf==null&&(e._pf=_4()),e._pf}var oi;Array.prototype.some?oi=Array.prototype.some:oi=function(e){var t=Object(this),n=t.length>>>0,s;for(s=0;s<n;s++)if(s in t&&e.call(this,t[s],s,t))return!0;return!1};function Qi(e){if(e._isValid==null){var t=ke(e),n=oi.call(t.parsedDateParts,function(r){return r!=null}),s=!isNaN(e._d.getTime())&&t.overflow<0&&!t.empty&&!t.invalidEra&&!t.invalidMonth&&!t.invalidWeekday&&!t.weekdayMismatch&&!t.nullInput&&!t.invalidFormat&&!t.userInvalidated&&(!t.meridiem||t.meridiem&&n);if(e._strict&&(s=s&&t.charsLeftOver===0&&t.unusedTokens.length===0&&t.bigHour===void 0),Object.isFrozen==null||!Object.isFrozen(e))e._isValid=s;else return s}return e._isValid}function Xa(e){var t=yn(NaN);return e!=null?zn(ke(t),e):ke(t).userInvalidated=!0,t}var tc=j.momentProperties=[],Co=!1;function el(e,t){var n,s,r,a=tc.length;if(Nt(t._isAMomentObject)||(e._isAMomentObject=t._isAMomentObject),Nt(t._i)||(e._i=t._i),Nt(t._f)||(e._f=t._f),Nt(t._l)||(e._l=t._l),Nt(t._strict)||(e._strict=t._strict),Nt(t._tzm)||(e._tzm=t._tzm),Nt(t._isUTC)||(e._isUTC=t._isUTC),Nt(t._offset)||(e._offset=t._offset),Nt(t._pf)||(e._pf=ke(t)),Nt(t._locale)||(e._locale=t._locale),a>0)for(n=0;n<a;n++)s=tc[n],r=t[s],Nt(r)||(e[s]=r);return e}function Zr(e){el(this,e),this._d=new Date(e._d!=null?e._d.getTime():NaN),this.isValid()||(this._d=new Date(NaN)),Co===!1&&(Co=!0,j.updateOffset(this),Co=!1)}function on(e){return e instanceof Zr||e!=null&&e._isAMomentObject!=null}function hf(e){j.suppressDeprecationWarnings===!1&&typeof console!=\"undefined\"&&console.warn&&console.warn(\"Deprecation warning: \"+e)}function Jt(e,t){var n=!0;return zn(function(){if(j.deprecationHandler!=null&&j.deprecationHandler(null,e),n){var s=[],r,a,o,i=arguments.length;for(a=0;a<i;a++){if(r=\"\",typeof arguments[a]==\"object\"){r+=`\n[`+a+\"] \";for(o in arguments[0])Ae(arguments[0],o)&&(r+=o+\": \"+arguments[0][o]+\", \");r=r.slice(0,-2)}else r=arguments[a];s.push(r)}hf(e+`\nArguments: `+Array.prototype.slice.call(s).join(\"\")+`\n`+new Error().stack),n=!1}return t.apply(this,arguments)},t)}var nc={};function _f(e,t){j.deprecationHandler!=null&&j.deprecationHandler(e,t),nc[e]||(hf(t),nc[e]=!0)}j.suppressDeprecationWarnings=!1;j.deprecationHandler=null;function bn(e){return typeof Function!=\"undefined\"&&e instanceof Function||Object.prototype.toString.call(e)===\"[object Function]\"}function p4(e){var t,n;for(n in e)Ae(e,n)&&(t=e[n],bn(t)?this[n]=t:this[\"_\"+n]=t);this._config=e,this._dayOfMonthOrdinalParseLenient=new RegExp((this._dayOfMonthOrdinalParse.source||this._ordinalParse.source)+\"|\"+/\\d{1,2}/.source)}function ii(e,t){var n=zn({},e),s;for(s in t)Ae(t,s)&&(Ss(e[s])&&Ss(t[s])?(n[s]={},zn(n[s],e[s]),zn(n[s],t[s])):t[s]!=null?n[s]=t[s]:delete n[s]);for(s in e)Ae(e,s)&&!Ae(t,s)&&Ss(e[s])&&(n[s]=zn({},n[s]));return n}function tl(e){e!=null&&this.set(e)}var li;Object.keys?li=Object.keys:li=function(e){var t,n=[];for(t in e)Ae(e,t)&&n.push(t);return n};var m4={sameDay:\"[Today at] LT\",nextDay:\"[Tomorrow at] LT\",nextWeek:\"dddd [at] LT\",lastDay:\"[Yesterday at] LT\",lastWeek:\"[Last] dddd [at] LT\",sameElse:\"L\"};function g4(e,t,n){var s=this._calendar[e]||this._calendar.sameElse;return bn(s)?s.call(t,n):s}function vn(e,t,n){var s=\"\"+Math.abs(e),r=t-s.length,a=e>=0;return(a?n?\"+\":\"\":\"-\")+Math.pow(10,Math.max(0,r)).toString().substr(1)+s}var nl=/(\\[[^\\[]*\\])|(\\\\)?([Hh]mm(ss)?|Mo|MM?M?M?|Do|DDDo|DD?D?D?|ddd?d?|do?|w[o|w]?|W[o|W]?|Qo?|N{1,5}|YYYYYY|YYYYY|YYYY|YY|y{2,4}|yo?|gg(ggg?)?|GG(GGG?)?|e|E|a|A|hh?|HH?|kk?|mm?|ss?|S{1,9}|x|X|zz?|ZZ?|.)/g,ca=/(\\[[^\\[]*\\])|(\\\\)?(LTS|LT|LL?L?L?|l{1,4})/g,To={},Ws={};function re(e,t,n,s){var r=s;typeof s==\"string\"&&(r=function(){return this[s]()}),e&&(Ws[e]=r),t&&(Ws[t[0]]=function(){return vn(r.apply(this,arguments),t[1],t[2])}),n&&(Ws[n]=function(){return this.localeData().ordinal(r.apply(this,arguments),e)})}function v4(e){return e.match(/\\[[\\s\\S]/)?e.replace(/^\\[|\\]$/g,\"\"):e.replace(/\\\\/g,\"\")}function y4(e){var t=e.match(nl),n,s;for(n=0,s=t.length;n<s;n++)Ws[t[n]]?t[n]=Ws[t[n]]:t[n]=v4(t[n]);return function(r){var a=\"\",o;for(o=0;o<s;o++)a+=bn(t[o])?t[o].call(r,e):t[o];return a}}function ga(e,t){return e.isValid()?(t=pf(t,e.localeData()),To[t]=To[t]||y4(t),To[t](e)):e.localeData().invalidDate()}function pf(e,t){var n=5;function s(r){return t.longDateFormat(r)||r}for(ca.lastIndex=0;n>=0&&ca.test(e);)e=e.replace(ca,s),ca.lastIndex=0,n-=1;return e}var b4={LTS:\"h:mm:ss A\",LT:\"h:mm A\",L:\"MM/DD/YYYY\",LL:\"MMMM D, YYYY\",LLL:\"MMMM D, YYYY h:mm A\",LLLL:\"dddd, MMMM D, YYYY h:mm A\"};function E4(e){var t=this._longDateFormat[e],n=this._longDateFormat[e.toUpperCase()];return t||!n?t:(this._longDateFormat[e]=n.match(nl).map(function(s){return s===\"MMMM\"||s===\"MM\"||s===\"DD\"||s===\"dddd\"?s.slice(1):s}).join(\"\"),this._longDateFormat[e])}var k4=\"Invalid date\";function w4(){return this._invalidDate}var S4=\"%d\",C4=/\\d{1,2}/;function T4(e){return this._ordinal.replace(\"%d\",e)}var F4={future:\"in %s\",past:\"%s ago\",s:\"a few seconds\",ss:\"%d seconds\",m:\"a minute\",mm:\"%d minutes\",h:\"an hour\",hh:\"%d hours\",d:\"a day\",dd:\"%d days\",w:\"a week\",ww:\"%d weeks\",M:\"a month\",MM:\"%d months\",y:\"a year\",yy:\"%d years\"};function D4(e,t,n,s){var r=this._relativeTime[n];return bn(r)?r(e,t,n,s):r.replace(/%d/i,e)}function O4(e,t){var n=this._relativeTime[e>0?\"future\":\"past\"];return bn(n)?n(t):n.replace(/%s/i,t)}var Dr={};function St(e,t){var n=e.toLowerCase();Dr[n]=Dr[n+\"s\"]=Dr[t]=e}function Xt(e){return typeof e==\"string\"?Dr[e]||Dr[e.toLowerCase()]:void 0}function sl(e){var t={},n,s;for(s in e)Ae(e,s)&&(n=Xt(s),n&&(t[n]=e[s]));return t}var mf={};function Ct(e,t){mf[e]=t}function P4(e){var t=[],n;for(n in e)Ae(e,n)&&t.push({unit:n,priority:mf[n]});return t.sort(function(s,r){return s.priority-r.priority}),t}function Za(e){return e%4===0&&e%100!==0||e%400===0}function zt(e){return e<0?Math.ceil(e)||0:Math.floor(e)}function Ce(e){var t=+e,n=0;return t!==0&&isFinite(t)&&(n=zt(t)),n}function ir(e,t){return function(n){return n!=null?(gf(this,e,n),j.updateOffset(this,t),this):Fa(this,e)}}function Fa(e,t){return e.isValid()?e._d[\"get\"+(e._isUTC?\"UTC\":\"\")+t]():NaN}function gf(e,t,n){e.isValid()&&!isNaN(n)&&(t===\"FullYear\"&&Za(e.year())&&e.month()===1&&e.date()===29?(n=Ce(n),e._d[\"set\"+(e._isUTC?\"UTC\":\"\")+t](n,e.month(),ro(n,e.month()))):e._d[\"set\"+(e._isUTC?\"UTC\":\"\")+t](n))}function N4(e){return e=Xt(e),bn(this[e])?this[e]():this}function I4(e,t){if(typeof e==\"object\"){e=sl(e);var n=P4(e),s,r=n.length;for(s=0;s<r;s++)this[n[s].unit](e[n[s].unit])}else if(e=Xt(e),bn(this[e]))return this[e](t);return this}var vf=/\\d/,Wt=/\\d\\d/,yf=/\\d{3}/,rl=/\\d{4}/,Qa=/[+-]?\\d{6}/,Ke=/\\d\\d?/,bf=/\\d\\d\\d\\d?/,Ef=/\\d\\d\\d\\d\\d\\d?/,eo=/\\d{1,3}/,al=/\\d{1,4}/,to=/[+-]?\\d{1,6}/,lr=/\\d+/,no=/[+-]?\\d+/,A4=/Z|[+-]\\d\\d:?\\d\\d/gi,so=/Z|[+-]\\d\\d(?::?\\d\\d)?/gi,L4=/[+-]?\\d+(\\.\\d{1,3})?/,Qr=/[0-9]{0,256}['a-z\\u00A0-\\u05FF\\u0700-\\uD7FF\\uF900-\\uFDCF\\uFDF0-\\uFF07\\uFF10-\\uFFEF]{1,256}|[\\u0600-\\u06FF\\/]{1,256}(\\s*?[\\u0600-\\u06FF]{1,256}){1,2}/i,Da;Da={};function Z(e,t,n){Da[e]=bn(t)?t:function(s,r){return s&&n?n:t}}function M4(e,t){return Ae(Da,e)?Da[e](t._strict,t._locale):new RegExp(x4(e))}function x4(e){return Ut(e.replace(\"\\\\\",\"\").replace(/\\\\(\\[)|\\\\(\\])|\\[([^\\]\\[]*)\\]|\\\\(.)/g,function(t,n,s,r,a){return n||s||r||a}))}function Ut(e){return e.replace(/[-\\/\\\\^$*+?.()|[\\]{}]/g,\"\\\\$&\")}var ui={};function Be(e,t){var n,s=t,r;for(typeof e==\"string\"&&(e=[e]),In(t)&&(s=function(a,o){o[t]=Ce(a)}),r=e.length,n=0;n<r;n++)ui[e[n]]=s}function ea(e,t){Be(e,function(n,s,r,a){r._w=r._w||{},t(n,r._w,r,a)})}function $4(e,t,n){t!=null&&Ae(ui,e)&&ui[e](t,n._a,n,e)}var kt=0,Dn=1,mn=2,dt=3,sn=4,On=5,ks=6,R4=7,B4=8;function U4(e,t){return(e%t+t)%t}var tt;Array.prototype.indexOf?tt=Array.prototype.indexOf:tt=function(e){var t;for(t=0;t<this.length;++t)if(this[t]===e)return t;return-1};function ro(e,t){if(isNaN(e)||isNaN(t))return NaN;var n=U4(t,12);return e+=(t-n)/12,n===1?Za(e)?29:28:31-n%7%2}re(\"M\",[\"MM\",2],\"Mo\",function(){return this.month()+1});re(\"MMM\",0,0,function(e){return this.localeData().monthsShort(this,e)});re(\"MMMM\",0,0,function(e){return this.localeData().months(this,e)});St(\"month\",\"M\");Ct(\"month\",8);Z(\"M\",Ke);Z(\"MM\",Ke,Wt);Z(\"MMM\",function(e,t){return t.monthsShortRegex(e)});Z(\"MMMM\",function(e,t){return t.monthsRegex(e)});Be([\"M\",\"MM\"],function(e,t){t[Dn]=Ce(e)-1});Be([\"MMM\",\"MMMM\"],function(e,t,n,s){var r=n._locale.monthsParse(e,s,n._strict);r!=null?t[Dn]=r:ke(n).invalidMonth=e});var Y4=\"January_February_March_April_May_June_July_August_September_October_November_December\".split(\"_\"),kf=\"Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec\".split(\"_\"),wf=/D[oD]?(\\[[^\\[\\]]*\\]|\\s)+MMMM?/,H4=Qr,W4=Qr;function V4(e,t){return e?an(this._months)?this._months[e.month()]:this._months[(this._months.isFormat||wf).test(t)?\"format\":\"standalone\"][e.month()]:an(this._months)?this._months:this._months.standalone}function j4(e,t){return e?an(this._monthsShort)?this._monthsShort[e.month()]:this._monthsShort[wf.test(t)?\"format\":\"standalone\"][e.month()]:an(this._monthsShort)?this._monthsShort:this._monthsShort.standalone}function G4(e,t,n){var s,r,a,o=e.toLocaleLowerCase();if(!this._monthsParse)for(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[],s=0;s<12;++s)a=yn([2e3,s]),this._shortMonthsParse[s]=this.monthsShort(a,\"\").toLocaleLowerCase(),this._longMonthsParse[s]=this.months(a,\"\").toLocaleLowerCase();return n?t===\"MMM\"?(r=tt.call(this._shortMonthsParse,o),r!==-1?r:null):(r=tt.call(this._longMonthsParse,o),r!==-1?r:null):t===\"MMM\"?(r=tt.call(this._shortMonthsParse,o),r!==-1?r:(r=tt.call(this._longMonthsParse,o),r!==-1?r:null)):(r=tt.call(this._longMonthsParse,o),r!==-1?r:(r=tt.call(this._shortMonthsParse,o),r!==-1?r:null))}function z4(e,t,n){var s,r,a;if(this._monthsParseExact)return G4.call(this,e,t,n);for(this._monthsParse||(this._monthsParse=[],this._longMonthsParse=[],this._shortMonthsParse=[]),s=0;s<12;s++){if(r=yn([2e3,s]),n&&!this._longMonthsParse[s]&&(this._longMonthsParse[s]=new RegExp(\"^\"+this.months(r,\"\").replace(\".\",\"\")+\"$\",\"i\"),this._shortMonthsParse[s]=new RegExp(\"^\"+this.monthsShort(r,\"\").replace(\".\",\"\")+\"$\",\"i\")),!n&&!this._monthsParse[s]&&(a=\"^\"+this.months(r,\"\")+\"|^\"+this.monthsShort(r,\"\"),this._monthsParse[s]=new RegExp(a.replace(\".\",\"\"),\"i\")),n&&t===\"MMMM\"&&this._longMonthsParse[s].test(e))return s;if(n&&t===\"MMM\"&&this._shortMonthsParse[s].test(e))return s;if(!n&&this._monthsParse[s].test(e))return s}}function Sf(e,t){var n;if(!e.isValid())return e;if(typeof t==\"string\"){if(/^\\d+$/.test(t))t=Ce(t);else if(t=e.localeData().monthsParse(t),!In(t))return e}return n=Math.min(e.date(),ro(e.year(),t)),e._d[\"set\"+(e._isUTC?\"UTC\":\"\")+\"Month\"](t,n),e}function Cf(e){return e!=null?(Sf(this,e),j.updateOffset(this,!0),this):Fa(this,\"Month\")}function K4(){return ro(this.year(),this.month())}function q4(e){return this._monthsParseExact?(Ae(this,\"_monthsRegex\")||Tf.call(this),e?this._monthsShortStrictRegex:this._monthsShortRegex):(Ae(this,\"_monthsShortRegex\")||(this._monthsShortRegex=H4),this._monthsShortStrictRegex&&e?this._monthsShortStrictRegex:this._monthsShortRegex)}function J4(e){return this._monthsParseExact?(Ae(this,\"_monthsRegex\")||Tf.call(this),e?this._monthsStrictRegex:this._monthsRegex):(Ae(this,\"_monthsRegex\")||(this._monthsRegex=W4),this._monthsStrictRegex&&e?this._monthsStrictRegex:this._monthsRegex)}function Tf(){function e(o,i){return i.length-o.length}var t=[],n=[],s=[],r,a;for(r=0;r<12;r++)a=yn([2e3,r]),t.push(this.monthsShort(a,\"\")),n.push(this.months(a,\"\")),s.push(this.months(a,\"\")),s.push(this.monthsShort(a,\"\"));for(t.sort(e),n.sort(e),s.sort(e),r=0;r<12;r++)t[r]=Ut(t[r]),n[r]=Ut(n[r]);for(r=0;r<24;r++)s[r]=Ut(s[r]);this._monthsRegex=new RegExp(\"^(\"+s.join(\"|\")+\")\",\"i\"),this._monthsShortRegex=this._monthsRegex,this._monthsStrictRegex=new RegExp(\"^(\"+n.join(\"|\")+\")\",\"i\"),this._monthsShortStrictRegex=new RegExp(\"^(\"+t.join(\"|\")+\")\",\"i\")}re(\"Y\",0,0,function(){var e=this.year();return e<=9999?vn(e,4):\"+\"+e});re(0,[\"YY\",2],0,function(){return this.year()%100});re(0,[\"YYYY\",4],0,\"year\");re(0,[\"YYYYY\",5],0,\"year\");re(0,[\"YYYYYY\",6,!0],0,\"year\");St(\"year\",\"y\");Ct(\"year\",1);Z(\"Y\",no);Z(\"YY\",Ke,Wt);Z(\"YYYY\",al,rl);Z(\"YYYYY\",to,Qa);Z(\"YYYYYY\",to,Qa);Be([\"YYYYY\",\"YYYYYY\"],kt);Be(\"YYYY\",function(e,t){t[kt]=e.length===2?j.parseTwoDigitYear(e):Ce(e)});Be(\"YY\",function(e,t){t[kt]=j.parseTwoDigitYear(e)});Be(\"Y\",function(e,t){t[kt]=parseInt(e,10)});function Or(e){return Za(e)?366:365}j.parseTwoDigitYear=function(e){return Ce(e)+(Ce(e)>68?1900:2e3)};var Ff=ir(\"FullYear\",!0);function X4(){return Za(this.year())}function Z4(e,t,n,s,r,a,o){var i;return e<100&&e>=0?(i=new Date(e+400,t,n,s,r,a,o),isFinite(i.getFullYear())&&i.setFullYear(e)):i=new Date(e,t,n,s,r,a,o),i}function Wr(e){var t,n;return e<100&&e>=0?(n=Array.prototype.slice.call(arguments),n[0]=e+400,t=new Date(Date.UTC.apply(null,n)),isFinite(t.getUTCFullYear())&&t.setUTCFullYear(e)):t=new Date(Date.UTC.apply(null,arguments)),t}function Oa(e,t,n){var s=7+t-n,r=(7+Wr(e,0,s).getUTCDay()-t)%7;return-r+s-1}function Df(e,t,n,s,r){var a=(7+n-s)%7,o=Oa(e,s,r),i=1+7*(t-1)+a+o,l,u;return i<=0?(l=e-1,u=Or(l)+i):i>Or(e)?(l=e+1,u=i-Or(e)):(l=e,u=i),{year:l,dayOfYear:u}}function Vr(e,t,n){var s=Oa(e.year(),t,n),r=Math.floor((e.dayOfYear()-s-1)/7)+1,a,o;return r<1?(o=e.year()-1,a=r+Pn(o,t,n)):r>Pn(e.year(),t,n)?(a=r-Pn(e.year(),t,n),o=e.year()+1):(o=e.year(),a=r),{week:a,year:o}}function Pn(e,t,n){var s=Oa(e,t,n),r=Oa(e+1,t,n);return(Or(e)-s+r)/7}re(\"w\",[\"ww\",2],\"wo\",\"week\");re(\"W\",[\"WW\",2],\"Wo\",\"isoWeek\");St(\"week\",\"w\");St(\"isoWeek\",\"W\");Ct(\"week\",5);Ct(\"isoWeek\",5);Z(\"w\",Ke);Z(\"ww\",Ke,Wt);Z(\"W\",Ke);Z(\"WW\",Ke,Wt);ea([\"w\",\"ww\",\"W\",\"WW\"],function(e,t,n,s){t[s.substr(0,1)]=Ce(e)});function Q4(e){return Vr(e,this._week.dow,this._week.doy).week}var e_={dow:0,doy:6};function t_(){return this._week.dow}function n_(){return this._week.doy}function s_(e){var t=this.localeData().week(this);return e==null?t:this.add((e-t)*7,\"d\")}function r_(e){var t=Vr(this,1,4).week;return e==null?t:this.add((e-t)*7,\"d\")}re(\"d\",0,\"do\",\"day\");re(\"dd\",0,0,function(e){return this.localeData().weekdaysMin(this,e)});re(\"ddd\",0,0,function(e){return this.localeData().weekdaysShort(this,e)});re(\"dddd\",0,0,function(e){return this.localeData().weekdays(this,e)});re(\"e\",0,0,\"weekday\");re(\"E\",0,0,\"isoWeekday\");St(\"day\",\"d\");St(\"weekday\",\"e\");St(\"isoWeekday\",\"E\");Ct(\"day\",11);Ct(\"weekday\",11);Ct(\"isoWeekday\",11);Z(\"d\",Ke);Z(\"e\",Ke);Z(\"E\",Ke);Z(\"dd\",function(e,t){return t.weekdaysMinRegex(e)});Z(\"ddd\",function(e,t){return t.weekdaysShortRegex(e)});Z(\"dddd\",function(e,t){return t.weekdaysRegex(e)});ea([\"dd\",\"ddd\",\"dddd\"],function(e,t,n,s){var r=n._locale.weekdaysParse(e,s,n._strict);r!=null?t.d=r:ke(n).invalidWeekday=e});ea([\"d\",\"e\",\"E\"],function(e,t,n,s){t[s]=Ce(e)});function a_(e,t){return typeof e!=\"string\"?e:isNaN(e)?(e=t.weekdaysParse(e),typeof e==\"number\"?e:null):parseInt(e,10)}function o_(e,t){return typeof e==\"string\"?t.weekdaysParse(e)%7||7:isNaN(e)?null:e}function ol(e,t){return e.slice(t,7).concat(e.slice(0,t))}var i_=\"Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday\".split(\"_\"),Of=\"Sun_Mon_Tue_Wed_Thu_Fri_Sat\".split(\"_\"),l_=\"Su_Mo_Tu_We_Th_Fr_Sa\".split(\"_\"),u_=Qr,c_=Qr,d_=Qr;function f_(e,t){var n=an(this._weekdays)?this._weekdays:this._weekdays[e&&e!==!0&&this._weekdays.isFormat.test(t)?\"format\":\"standalone\"];return e===!0?ol(n,this._week.dow):e?n[e.day()]:n}function h_(e){return e===!0?ol(this._weekdaysShort,this._week.dow):e?this._weekdaysShort[e.day()]:this._weekdaysShort}function __(e){return e===!0?ol(this._weekdaysMin,this._week.dow):e?this._weekdaysMin[e.day()]:this._weekdaysMin}function p_(e,t,n){var s,r,a,o=e.toLocaleLowerCase();if(!this._weekdaysParse)for(this._weekdaysParse=[],this._shortWeekdaysParse=[],this._minWeekdaysParse=[],s=0;s<7;++s)a=yn([2e3,1]).day(s),this._minWeekdaysParse[s]=this.weekdaysMin(a,\"\").toLocaleLowerCase(),this._shortWeekdaysParse[s]=this.weekdaysShort(a,\"\").toLocaleLowerCase(),this._weekdaysParse[s]=this.weekdays(a,\"\").toLocaleLowerCase();return n?t===\"dddd\"?(r=tt.call(this._weekdaysParse,o),r!==-1?r:null):t===\"ddd\"?(r=tt.call(this._shortWeekdaysParse,o),r!==-1?r:null):(r=tt.call(this._minWeekdaysParse,o),r!==-1?r:null):t===\"dddd\"?(r=tt.call(this._weekdaysParse,o),r!==-1||(r=tt.call(this._shortWeekdaysParse,o),r!==-1)?r:(r=tt.call(this._minWeekdaysParse,o),r!==-1?r:null)):t===\"ddd\"?(r=tt.call(this._shortWeekdaysParse,o),r!==-1||(r=tt.call(this._weekdaysParse,o),r!==-1)?r:(r=tt.call(this._minWeekdaysParse,o),r!==-1?r:null)):(r=tt.call(this._minWeekdaysParse,o),r!==-1||(r=tt.call(this._weekdaysParse,o),r!==-1)?r:(r=tt.call(this._shortWeekdaysParse,o),r!==-1?r:null))}function m_(e,t,n){var s,r,a;if(this._weekdaysParseExact)return p_.call(this,e,t,n);for(this._weekdaysParse||(this._weekdaysParse=[],this._minWeekdaysParse=[],this._shortWeekdaysParse=[],this._fullWeekdaysParse=[]),s=0;s<7;s++){if(r=yn([2e3,1]).day(s),n&&!this._fullWeekdaysParse[s]&&(this._fullWeekdaysParse[s]=new RegExp(\"^\"+this.weekdays(r,\"\").replace(\".\",\"\\\\.?\")+\"$\",\"i\"),this._shortWeekdaysParse[s]=new RegExp(\"^\"+this.weekdaysShort(r,\"\").replace(\".\",\"\\\\.?\")+\"$\",\"i\"),this._minWeekdaysParse[s]=new RegExp(\"^\"+this.weekdaysMin(r,\"\").replace(\".\",\"\\\\.?\")+\"$\",\"i\")),this._weekdaysParse[s]||(a=\"^\"+this.weekdays(r,\"\")+\"|^\"+this.weekdaysShort(r,\"\")+\"|^\"+this.weekdaysMin(r,\"\"),this._weekdaysParse[s]=new RegExp(a.replace(\".\",\"\"),\"i\")),n&&t===\"dddd\"&&this._fullWeekdaysParse[s].test(e))return s;if(n&&t===\"ddd\"&&this._shortWeekdaysParse[s].test(e))return s;if(n&&t===\"dd\"&&this._minWeekdaysParse[s].test(e))return s;if(!n&&this._weekdaysParse[s].test(e))return s}}function g_(e){if(!this.isValid())return e!=null?this:NaN;var t=this._isUTC?this._d.getUTCDay():this._d.getDay();return e!=null?(e=a_(e,this.localeData()),this.add(e-t,\"d\")):t}function v_(e){if(!this.isValid())return e!=null?this:NaN;var t=(this.day()+7-this.localeData()._week.dow)%7;return e==null?t:this.add(e-t,\"d\")}function y_(e){if(!this.isValid())return e!=null?this:NaN;if(e!=null){var t=o_(e,this.localeData());return this.day(this.day()%7?t:t-7)}else return this.day()||7}function b_(e){return this._weekdaysParseExact?(Ae(this,\"_weekdaysRegex\")||il.call(this),e?this._weekdaysStrictRegex:this._weekdaysRegex):(Ae(this,\"_weekdaysRegex\")||(this._weekdaysRegex=u_),this._weekdaysStrictRegex&&e?this._weekdaysStrictRegex:this._weekdaysRegex)}function E_(e){return this._weekdaysParseExact?(Ae(this,\"_weekdaysRegex\")||il.call(this),e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex):(Ae(this,\"_weekdaysShortRegex\")||(this._weekdaysShortRegex=c_),this._weekdaysShortStrictRegex&&e?this._weekdaysShortStrictRegex:this._weekdaysShortRegex)}function k_(e){return this._weekdaysParseExact?(Ae(this,\"_weekdaysRegex\")||il.call(this),e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex):(Ae(this,\"_weekdaysMinRegex\")||(this._weekdaysMinRegex=d_),this._weekdaysMinStrictRegex&&e?this._weekdaysMinStrictRegex:this._weekdaysMinRegex)}function il(){function e(c,_){return _.length-c.length}var t=[],n=[],s=[],r=[],a,o,i,l,u;for(a=0;a<7;a++)o=yn([2e3,1]).day(a),i=Ut(this.weekdaysMin(o,\"\")),l=Ut(this.weekdaysShort(o,\"\")),u=Ut(this.weekdays(o,\"\")),t.push(i),n.push(l),s.push(u),r.push(i),r.push(l),r.push(u);t.sort(e),n.sort(e),s.sort(e),r.sort(e),this._weekdaysRegex=new RegExp(\"^(\"+r.join(\"|\")+\")\",\"i\"),this._weekdaysShortRegex=this._weekdaysRegex,this._weekdaysMinRegex=this._weekdaysRegex,this._weekdaysStrictRegex=new RegExp(\"^(\"+s.join(\"|\")+\")\",\"i\"),this._weekdaysShortStrictRegex=new RegExp(\"^(\"+n.join(\"|\")+\")\",\"i\"),this._weekdaysMinStrictRegex=new RegExp(\"^(\"+t.join(\"|\")+\")\",\"i\")}function ll(){return this.hours()%12||12}function w_(){return this.hours()||24}re(\"H\",[\"HH\",2],0,\"hour\");re(\"h\",[\"hh\",2],0,ll);re(\"k\",[\"kk\",2],0,w_);re(\"hmm\",0,0,function(){return\"\"+ll.apply(this)+vn(this.minutes(),2)});re(\"hmmss\",0,0,function(){return\"\"+ll.apply(this)+vn(this.minutes(),2)+vn(this.seconds(),2)});re(\"Hmm\",0,0,function(){return\"\"+this.hours()+vn(this.minutes(),2)});re(\"Hmmss\",0,0,function(){return\"\"+this.hours()+vn(this.minutes(),2)+vn(this.seconds(),2)});function Pf(e,t){re(e,0,0,function(){return this.localeData().meridiem(this.hours(),this.minutes(),t)})}Pf(\"a\",!0);Pf(\"A\",!1);St(\"hour\",\"h\");Ct(\"hour\",13);function Nf(e,t){return t._meridiemParse}Z(\"a\",Nf);Z(\"A\",Nf);Z(\"H\",Ke);Z(\"h\",Ke);Z(\"k\",Ke);Z(\"HH\",Ke,Wt);Z(\"hh\",Ke,Wt);Z(\"kk\",Ke,Wt);Z(\"hmm\",bf);Z(\"hmmss\",Ef);Z(\"Hmm\",bf);Z(\"Hmmss\",Ef);Be([\"H\",\"HH\"],dt);Be([\"k\",\"kk\"],function(e,t,n){var s=Ce(e);t[dt]=s===24?0:s});Be([\"a\",\"A\"],function(e,t,n){n._isPm=n._locale.isPM(e),n._meridiem=e});Be([\"h\",\"hh\"],function(e,t,n){t[dt]=Ce(e),ke(n).bigHour=!0});Be(\"hmm\",function(e,t,n){var s=e.length-2;t[dt]=Ce(e.substr(0,s)),t[sn]=Ce(e.substr(s)),ke(n).bigHour=!0});Be(\"hmmss\",function(e,t,n){var s=e.length-4,r=e.length-2;t[dt]=Ce(e.substr(0,s)),t[sn]=Ce(e.substr(s,2)),t[On]=Ce(e.substr(r)),ke(n).bigHour=!0});Be(\"Hmm\",function(e,t,n){var s=e.length-2;t[dt]=Ce(e.substr(0,s)),t[sn]=Ce(e.substr(s))});Be(\"Hmmss\",function(e,t,n){var s=e.length-4,r=e.length-2;t[dt]=Ce(e.substr(0,s)),t[sn]=Ce(e.substr(s,2)),t[On]=Ce(e.substr(r))});function S_(e){return(e+\"\").toLowerCase().charAt(0)===\"p\"}var C_=/[ap]\\.?m?\\.?/i,T_=ir(\"Hours\",!0);function F_(e,t,n){return e>11?n?\"pm\":\"PM\":n?\"am\":\"AM\"}var If={calendar:m4,longDateFormat:b4,invalidDate:k4,ordinal:S4,dayOfMonthOrdinalParse:C4,relativeTime:F4,months:Y4,monthsShort:kf,week:e_,weekdays:i_,weekdaysMin:l_,weekdaysShort:Of,meridiemParse:C_},Je={},mr={},jr;function D_(e,t){var n,s=Math.min(e.length,t.length);for(n=0;n<s;n+=1)if(e[n]!==t[n])return n;return s}function sc(e){return e&&e.toLowerCase().replace(\"_\",\"-\")}function O_(e){for(var t=0,n,s,r,a;t<e.length;){for(a=sc(e[t]).split(\"-\"),n=a.length,s=sc(e[t+1]),s=s?s.split(\"-\"):null;n>0;){if(r=ao(a.slice(0,n).join(\"-\")),r)return r;if(s&&s.length>=n&&D_(a,s)>=n-1)break;n--}t++}return jr}function P_(e){return e.match(\"^[^/\\\\\\\\]*$\")!=null}function ao(e){var t=null,n;if(Je[e]===void 0&&typeof module!=\"undefined\"&&module&&module.exports&&P_(e))try{t=jr._abbr,n=require,n(\"./locale/\"+e),ts(t)}catch(s){Je[e]=null}return Je[e]}function ts(e,t){var n;return e&&(Nt(t)?n=Mn(e):n=ul(e,t),n?jr=n:typeof console!=\"undefined\"&&console.warn&&console.warn(\"Locale \"+e+\" not found. Did you forget to load it?\")),jr._abbr}function ul(e,t){if(t!==null){var n,s=If;if(t.abbr=e,Je[e]!=null)_f(\"defineLocaleOverride\",\"use moment.updateLocale(localeName, config) to change an existing locale. moment.defineLocale(localeName, config) should only be used for creating a new locale See http://momentjs.com/guides/#/warnings/define-locale/ for more info.\"),s=Je[e]._config;else if(t.parentLocale!=null)if(Je[t.parentLocale]!=null)s=Je[t.parentLocale]._config;else if(n=ao(t.parentLocale),n!=null)s=n._config;else return mr[t.parentLocale]||(mr[t.parentLocale]=[]),mr[t.parentLocale].push({name:e,config:t}),null;return Je[e]=new tl(ii(s,t)),mr[e]&&mr[e].forEach(function(r){ul(r.name,r.config)}),ts(e),Je[e]}else return delete Je[e],null}function N_(e,t){if(t!=null){var n,s,r=If;Je[e]!=null&&Je[e].parentLocale!=null?Je[e].set(ii(Je[e]._config,t)):(s=ao(e),s!=null&&(r=s._config),t=ii(r,t),s==null&&(t.abbr=e),n=new tl(t),n.parentLocale=Je[e],Je[e]=n),ts(e)}else Je[e]!=null&&(Je[e].parentLocale!=null?(Je[e]=Je[e].parentLocale,e===ts()&&ts(e)):Je[e]!=null&&delete Je[e]);return Je[e]}function Mn(e){var t;if(e&&e._locale&&e._locale._abbr&&(e=e._locale._abbr),!e)return jr;if(!an(e)){if(t=ao(e),t)return t;e=[e]}return O_(e)}function I_(){return li(Je)}function cl(e){var t,n=e._a;return n&&ke(e).overflow===-2&&(t=n[Dn]<0||n[Dn]>11?Dn:n[mn]<1||n[mn]>ro(n[kt],n[Dn])?mn:n[dt]<0||n[dt]>24||n[dt]===24&&(n[sn]!==0||n[On]!==0||n[ks]!==0)?dt:n[sn]<0||n[sn]>59?sn:n[On]<0||n[On]>59?On:n[ks]<0||n[ks]>999?ks:-1,ke(e)._overflowDayOfYear&&(t<kt||t>mn)&&(t=mn),ke(e)._overflowWeeks&&t===-1&&(t=R4),ke(e)._overflowWeekday&&t===-1&&(t=B4),ke(e).overflow=t),e}var A_=/^\\s*((?:[+-]\\d{6}|\\d{4})-(?:\\d\\d-\\d\\d|W\\d\\d-\\d|W\\d\\d|\\d\\d\\d|\\d\\d))(?:(T| )(\\d\\d(?::\\d\\d(?::\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,L_=/^\\s*((?:[+-]\\d{6}|\\d{4})(?:\\d\\d\\d\\d|W\\d\\d\\d|W\\d\\d|\\d\\d\\d|\\d\\d|))(?:(T| )(\\d\\d(?:\\d\\d(?:\\d\\d(?:[.,]\\d+)?)?)?)([+-]\\d\\d(?::?\\d\\d)?|\\s*Z)?)?$/,M_=/Z|[+-]\\d\\d(?::?\\d\\d)?/,da=[[\"YYYYYY-MM-DD\",/[+-]\\d{6}-\\d\\d-\\d\\d/],[\"YYYY-MM-DD\",/\\d{4}-\\d\\d-\\d\\d/],[\"GGGG-[W]WW-E\",/\\d{4}-W\\d\\d-\\d/],[\"GGGG-[W]WW\",/\\d{4}-W\\d\\d/,!1],[\"YYYY-DDD\",/\\d{4}-\\d{3}/],[\"YYYY-MM\",/\\d{4}-\\d\\d/,!1],[\"YYYYYYMMDD\",/[+-]\\d{10}/],[\"YYYYMMDD\",/\\d{8}/],[\"GGGG[W]WWE\",/\\d{4}W\\d{3}/],[\"GGGG[W]WW\",/\\d{4}W\\d{2}/,!1],[\"YYYYDDD\",/\\d{7}/],[\"YYYYMM\",/\\d{6}/,!1],[\"YYYY\",/\\d{4}/,!1]],Fo=[[\"HH:mm:ss.SSSS\",/\\d\\d:\\d\\d:\\d\\d\\.\\d+/],[\"HH:mm:ss,SSSS\",/\\d\\d:\\d\\d:\\d\\d,\\d+/],[\"HH:mm:ss\",/\\d\\d:\\d\\d:\\d\\d/],[\"HH:mm\",/\\d\\d:\\d\\d/],[\"HHmmss.SSSS\",/\\d\\d\\d\\d\\d\\d\\.\\d+/],[\"HHmmss,SSSS\",/\\d\\d\\d\\d\\d\\d,\\d+/],[\"HHmmss\",/\\d\\d\\d\\d\\d\\d/],[\"HHmm\",/\\d\\d\\d\\d/],[\"HH\",/\\d\\d/]],x_=/^\\/?Date\\((-?\\d+)/i,$_=/^(?:(Mon|Tue|Wed|Thu|Fri|Sat|Sun),?\\s)?(\\d{1,2})\\s(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\\s(\\d{2,4})\\s(\\d\\d):(\\d\\d)(?::(\\d\\d))?\\s(?:(UT|GMT|[ECMP][SD]T)|([Zz])|([+-]\\d{4}))$/,R_={UT:0,GMT:0,EDT:-4*60,EST:-5*60,CDT:-5*60,CST:-6*60,MDT:-6*60,MST:-7*60,PDT:-7*60,PST:-8*60};function Af(e){var t,n,s=e._i,r=A_.exec(s)||L_.exec(s),a,o,i,l,u=da.length,c=Fo.length;if(r){for(ke(e).iso=!0,t=0,n=u;t<n;t++)if(da[t][1].exec(r[1])){o=da[t][0],a=da[t][2]!==!1;break}if(o==null){e._isValid=!1;return}if(r[3]){for(t=0,n=c;t<n;t++)if(Fo[t][1].exec(r[3])){i=(r[2]||\" \")+Fo[t][0];break}if(i==null){e._isValid=!1;return}}if(!a&&i!=null){e._isValid=!1;return}if(r[4])if(M_.exec(r[4]))l=\"Z\";else{e._isValid=!1;return}e._f=o+(i||\"\")+(l||\"\"),fl(e)}else e._isValid=!1}function B_(e,t,n,s,r,a){var o=[U_(e),kf.indexOf(t),parseInt(n,10),parseInt(s,10),parseInt(r,10)];return a&&o.push(parseInt(a,10)),o}function U_(e){var t=parseInt(e,10);return t<=49?2e3+t:t<=999?1900+t:t}function Y_(e){return e.replace(/\\([^()]*\\)|[\\n\\t]/g,\" \").replace(/(\\s\\s+)/g,\" \").replace(/^\\s\\s*/,\"\").replace(/\\s\\s*$/,\"\")}function H_(e,t,n){if(e){var s=Of.indexOf(e),r=new Date(t[0],t[1],t[2]).getDay();if(s!==r)return ke(n).weekdayMismatch=!0,n._isValid=!1,!1}return!0}function W_(e,t,n){if(e)return R_[e];if(t)return 0;var s=parseInt(n,10),r=s%100,a=(s-r)/100;return a*60+r}function Lf(e){var t=$_.exec(Y_(e._i)),n;if(t){if(n=B_(t[4],t[3],t[2],t[5],t[6],t[7]),!H_(t[1],n,e))return;e._a=n,e._tzm=W_(t[8],t[9],t[10]),e._d=Wr.apply(null,e._a),e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),ke(e).rfc2822=!0}else e._isValid=!1}function V_(e){var t=x_.exec(e._i);if(t!==null){e._d=new Date(+t[1]);return}if(Af(e),e._isValid===!1)delete e._isValid;else return;if(Lf(e),e._isValid===!1)delete e._isValid;else return;e._strict?e._isValid=!1:j.createFromInputFallback(e)}j.createFromInputFallback=Jt(\"value provided is not in a recognized RFC2822 or ISO format. moment construction falls back to js Date(), which is not reliable across all browsers and versions. Non RFC2822/ISO date formats are discouraged. Please refer to http://momentjs.com/guides/#/warnings/js-date/ for more info.\",function(e){e._d=new Date(e._i+(e._useUTC?\" UTC\":\"\"))});function Ls(e,t,n){return e!=null?e:t!=null?t:n}function j_(e){var t=new Date(j.now());return e._useUTC?[t.getUTCFullYear(),t.getUTCMonth(),t.getUTCDate()]:[t.getFullYear(),t.getMonth(),t.getDate()]}function dl(e){var t,n,s=[],r,a,o;if(!e._d){for(r=j_(e),e._w&&e._a[mn]==null&&e._a[Dn]==null&&G_(e),e._dayOfYear!=null&&(o=Ls(e._a[kt],r[kt]),(e._dayOfYear>Or(o)||e._dayOfYear===0)&&(ke(e)._overflowDayOfYear=!0),n=Wr(o,0,e._dayOfYear),e._a[Dn]=n.getUTCMonth(),e._a[mn]=n.getUTCDate()),t=0;t<3&&e._a[t]==null;++t)e._a[t]=s[t]=r[t];for(;t<7;t++)e._a[t]=s[t]=e._a[t]==null?t===2?1:0:e._a[t];e._a[dt]===24&&e._a[sn]===0&&e._a[On]===0&&e._a[ks]===0&&(e._nextDay=!0,e._a[dt]=0),e._d=(e._useUTC?Wr:Z4).apply(null,s),a=e._useUTC?e._d.getUTCDay():e._d.getDay(),e._tzm!=null&&e._d.setUTCMinutes(e._d.getUTCMinutes()-e._tzm),e._nextDay&&(e._a[dt]=24),e._w&&typeof e._w.d!=\"undefined\"&&e._w.d!==a&&(ke(e).weekdayMismatch=!0)}}function G_(e){var t,n,s,r,a,o,i,l,u;t=e._w,t.GG!=null||t.W!=null||t.E!=null?(a=1,o=4,n=Ls(t.GG,e._a[kt],Vr(ze(),1,4).year),s=Ls(t.W,1),r=Ls(t.E,1),(r<1||r>7)&&(l=!0)):(a=e._locale._week.dow,o=e._locale._week.doy,u=Vr(ze(),a,o),n=Ls(t.gg,e._a[kt],u.year),s=Ls(t.w,u.week),t.d!=null?(r=t.d,(r<0||r>6)&&(l=!0)):t.e!=null?(r=t.e+a,(t.e<0||t.e>6)&&(l=!0)):r=a),s<1||s>Pn(n,a,o)?ke(e)._overflowWeeks=!0:l!=null?ke(e)._overflowWeekday=!0:(i=Df(n,s,r,a,o),e._a[kt]=i.year,e._dayOfYear=i.dayOfYear)}j.ISO_8601=function(){};j.RFC_2822=function(){};function fl(e){if(e._f===j.ISO_8601){Af(e);return}if(e._f===j.RFC_2822){Lf(e);return}e._a=[],ke(e).empty=!0;var t=\"\"+e._i,n,s,r,a,o,i=t.length,l=0,u,c;for(r=pf(e._f,e._locale).match(nl)||[],c=r.length,n=0;n<c;n++)a=r[n],s=(t.match(M4(a,e))||[])[0],s&&(o=t.substr(0,t.indexOf(s)),o.length>0&&ke(e).unusedInput.push(o),t=t.slice(t.indexOf(s)+s.length),l+=s.length),Ws[a]?(s?ke(e).empty=!1:ke(e).unusedTokens.push(a),$4(a,s,e)):e._strict&&!s&&ke(e).unusedTokens.push(a);ke(e).charsLeftOver=i-l,t.length>0&&ke(e).unusedInput.push(t),e._a[dt]<=12&&ke(e).bigHour===!0&&e._a[dt]>0&&(ke(e).bigHour=void 0),ke(e).parsedDateParts=e._a.slice(0),ke(e).meridiem=e._meridiem,e._a[dt]=z_(e._locale,e._a[dt],e._meridiem),u=ke(e).era,u!==null&&(e._a[kt]=e._locale.erasConvertYear(u,e._a[kt])),dl(e),cl(e)}function z_(e,t,n){var s;return n==null?t:e.meridiemHour!=null?e.meridiemHour(t,n):(e.isPM!=null&&(s=e.isPM(n),s&&t<12&&(t+=12),!s&&t===12&&(t=0)),t)}function K_(e){var t,n,s,r,a,o,i=!1,l=e._f.length;if(l===0){ke(e).invalidFormat=!0,e._d=new Date(NaN);return}for(r=0;r<l;r++)a=0,o=!1,t=el({},e),e._useUTC!=null&&(t._useUTC=e._useUTC),t._f=e._f[r],fl(t),Qi(t)&&(o=!0),a+=ke(t).charsLeftOver,a+=ke(t).unusedTokens.length*10,ke(t).score=a,i?a<s&&(s=a,n=t):(s==null||a<s||o)&&(s=a,n=t,o&&(i=!0));zn(e,n||t)}function q_(e){if(!e._d){var t=sl(e._i),n=t.day===void 0?t.date:t.day;e._a=ff([t.year,t.month,n,t.hour,t.minute,t.second,t.millisecond],function(s){return s&&parseInt(s,10)}),dl(e)}}function J_(e){var t=new Zr(cl(Mf(e)));return t._nextDay&&(t.add(1,\"d\"),t._nextDay=void 0),t}function Mf(e){var t=e._i,n=e._f;return e._locale=e._locale||Mn(e._l),t===null||n===void 0&&t===\"\"?Xa({nullInput:!0}):(typeof t==\"string\"&&(e._i=t=e._locale.preparse(t)),on(t)?new Zr(cl(t)):(Xr(t)?e._d=t:an(n)?K_(e):n?fl(e):X_(e),Qi(e)||(e._d=null),e))}function X_(e){var t=e._i;Nt(t)?e._d=new Date(j.now()):Xr(t)?e._d=new Date(t.valueOf()):typeof t==\"string\"?V_(e):an(t)?(e._a=ff(t.slice(0),function(n){return parseInt(n,10)}),dl(e)):Ss(t)?q_(e):In(t)?e._d=new Date(t):j.createFromInputFallback(e)}function xf(e,t,n,s,r){var a={};return(t===!0||t===!1)&&(s=t,t=void 0),(n===!0||n===!1)&&(s=n,n=void 0),(Ss(e)&&Zi(e)||an(e)&&e.length===0)&&(e=void 0),a._isAMomentObject=!0,a._useUTC=a._isUTC=r,a._l=n,a._i=e,a._f=t,a._strict=s,J_(a)}function ze(e,t,n,s){return xf(e,t,n,s,!1)}var Z_=Jt(\"moment().min is deprecated, use moment.max instead. http://momentjs.com/guides/#/warnings/min-max/\",function(){var e=ze.apply(null,arguments);return this.isValid()&&e.isValid()?e<this?this:e:Xa()}),Q_=Jt(\"moment().max is deprecated, use moment.min instead. http://momentjs.com/guides/#/warnings/min-max/\",function(){var e=ze.apply(null,arguments);return this.isValid()&&e.isValid()?e>this?this:e:Xa()});function $f(e,t){var n,s;if(t.length===1&&an(t[0])&&(t=t[0]),!t.length)return ze();for(n=t[0],s=1;s<t.length;++s)(!t[s].isValid()||t[s][e](n))&&(n=t[s]);return n}function ep(){var e=[].slice.call(arguments,0);return $f(\"isBefore\",e)}function tp(){var e=[].slice.call(arguments,0);return $f(\"isAfter\",e)}var np=function(){return Date.now?Date.now():+new Date},gr=[\"year\",\"quarter\",\"month\",\"week\",\"day\",\"hour\",\"minute\",\"second\",\"millisecond\"];function sp(e){var t,n=!1,s,r=gr.length;for(t in e)if(Ae(e,t)&&!(tt.call(gr,t)!==-1&&(e[t]==null||!isNaN(e[t]))))return!1;for(s=0;s<r;++s)if(e[gr[s]]){if(n)return!1;parseFloat(e[gr[s]])!==Ce(e[gr[s]])&&(n=!0)}return!0}function rp(){return this._isValid}function ap(){return un(NaN)}function oo(e){var t=sl(e),n=t.year||0,s=t.quarter||0,r=t.month||0,a=t.week||t.isoWeek||0,o=t.day||0,i=t.hour||0,l=t.minute||0,u=t.second||0,c=t.millisecond||0;this._isValid=sp(t),this._milliseconds=+c+u*1e3+l*6e4+i*1e3*60*60,this._days=+o+a*7,this._months=+r+s*3+n*12,this._data={},this._locale=Mn(),this._bubble()}function va(e){return e instanceof oo}function ci(e){return e<0?Math.round(-1*e)*-1:Math.round(e)}function op(e,t,n){var s=Math.min(e.length,t.length),r=Math.abs(e.length-t.length),a=0,o;for(o=0;o<s;o++)(n&&e[o]!==t[o]||!n&&Ce(e[o])!==Ce(t[o]))&&a++;return a+r}function Rf(e,t){re(e,0,0,function(){var n=this.utcOffset(),s=\"+\";return n<0&&(n=-n,s=\"-\"),s+vn(~~(n/60),2)+t+vn(~~n%60,2)})}Rf(\"Z\",\":\");Rf(\"ZZ\",\"\");Z(\"Z\",so);Z(\"ZZ\",so);Be([\"Z\",\"ZZ\"],function(e,t,n){n._useUTC=!0,n._tzm=hl(so,e)});var ip=/([\\+\\-]|\\d\\d)/gi;function hl(e,t){var n=(t||\"\").match(e),s,r,a;return n===null?null:(s=n[n.length-1]||[],r=(s+\"\").match(ip)||[\"-\",0,0],a=+(r[1]*60)+Ce(r[2]),a===0?0:r[0]===\"+\"?a:-a)}function _l(e,t){var n,s;return t._isUTC?(n=t.clone(),s=(on(e)||Xr(e)?e.valueOf():ze(e).valueOf())-n.valueOf(),n._d.setTime(n._d.valueOf()+s),j.updateOffset(n,!1),n):ze(e).local()}function di(e){return-Math.round(e._d.getTimezoneOffset())}j.updateOffset=function(){};function lp(e,t,n){var s=this._offset||0,r;if(!this.isValid())return e!=null?this:NaN;if(e!=null){if(typeof e==\"string\"){if(e=hl(so,e),e===null)return this}else Math.abs(e)<16&&!n&&(e=e*60);return!this._isUTC&&t&&(r=di(this)),this._offset=e,this._isUTC=!0,r!=null&&this.add(r,\"m\"),s!==e&&(!t||this._changeInProgress?Yf(this,un(e-s,\"m\"),1,!1):this._changeInProgress||(this._changeInProgress=!0,j.updateOffset(this,!0),this._changeInProgress=null)),this}else return this._isUTC?s:di(this)}function up(e,t){return e!=null?(typeof e!=\"string\"&&(e=-e),this.utcOffset(e,t),this):-this.utcOffset()}function cp(e){return this.utcOffset(0,e)}function dp(e){return this._isUTC&&(this.utcOffset(0,e),this._isUTC=!1,e&&this.subtract(di(this),\"m\")),this}function fp(){if(this._tzm!=null)this.utcOffset(this._tzm,!1,!0);else if(typeof this._i==\"string\"){var e=hl(A4,this._i);e!=null?this.utcOffset(e):this.utcOffset(0,!0)}return this}function hp(e){return this.isValid()?(e=e?ze(e).utcOffset():0,(this.utcOffset()-e)%60===0):!1}function _p(){return this.utcOffset()>this.clone().month(0).utcOffset()||this.utcOffset()>this.clone().month(5).utcOffset()}function pp(){if(!Nt(this._isDSTShifted))return this._isDSTShifted;var e={},t;return el(e,this),e=Mf(e),e._a?(t=e._isUTC?yn(e._a):ze(e._a),this._isDSTShifted=this.isValid()&&op(e._a,t.toArray())>0):this._isDSTShifted=!1,this._isDSTShifted}function mp(){return this.isValid()?!this._isUTC:!1}function gp(){return this.isValid()?this._isUTC:!1}function Bf(){return this.isValid()?this._isUTC&&this._offset===0:!1}var vp=/^(-|\\+)?(?:(\\d*)[. ])?(\\d+):(\\d+)(?::(\\d+)(\\.\\d*)?)?$/,yp=/^(-|\\+)?P(?:([-+]?[0-9,.]*)Y)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)W)?(?:([-+]?[0-9,.]*)D)?(?:T(?:([-+]?[0-9,.]*)H)?(?:([-+]?[0-9,.]*)M)?(?:([-+]?[0-9,.]*)S)?)?$/;function un(e,t){var n=e,s=null,r,a,o;return va(e)?n={ms:e._milliseconds,d:e._days,M:e._months}:In(e)||!isNaN(+e)?(n={},t?n[t]=+e:n.milliseconds=+e):(s=vp.exec(e))?(r=s[1]===\"-\"?-1:1,n={y:0,d:Ce(s[mn])*r,h:Ce(s[dt])*r,m:Ce(s[sn])*r,s:Ce(s[On])*r,ms:Ce(ci(s[ks]*1e3))*r}):(s=yp.exec(e))?(r=s[1]===\"-\"?-1:1,n={y:gs(s[2],r),M:gs(s[3],r),w:gs(s[4],r),d:gs(s[5],r),h:gs(s[6],r),m:gs(s[7],r),s:gs(s[8],r)}):n==null?n={}:typeof n==\"object\"&&(\"from\"in n||\"to\"in n)&&(o=bp(ze(n.from),ze(n.to)),n={},n.ms=o.milliseconds,n.M=o.months),a=new oo(n),va(e)&&Ae(e,\"_locale\")&&(a._locale=e._locale),va(e)&&Ae(e,\"_isValid\")&&(a._isValid=e._isValid),a}un.fn=oo.prototype;un.invalid=ap;function gs(e,t){var n=e&&parseFloat(e.replace(\",\",\".\"));return(isNaN(n)?0:n)*t}function rc(e,t){var n={};return n.months=t.month()-e.month()+(t.year()-e.year())*12,e.clone().add(n.months,\"M\").isAfter(t)&&--n.months,n.milliseconds=+t-+e.clone().add(n.months,\"M\"),n}function bp(e,t){var n;return e.isValid()&&t.isValid()?(t=_l(t,e),e.isBefore(t)?n=rc(e,t):(n=rc(t,e),n.milliseconds=-n.milliseconds,n.months=-n.months),n):{milliseconds:0,months:0}}function Uf(e,t){return function(n,s){var r,a;return s!==null&&!isNaN(+s)&&(_f(t,\"moment().\"+t+\"(period, number) is deprecated. Please use moment().\"+t+\"(number, period). See http://momentjs.com/guides/#/warnings/add-inverted-param/ for more info.\"),a=n,n=s,s=a),r=un(n,s),Yf(this,r,e),this}}function Yf(e,t,n,s){var r=t._milliseconds,a=ci(t._days),o=ci(t._months);!e.isValid()||(s=s==null?!0:s,o&&Sf(e,Fa(e,\"Month\")+o*n),a&&gf(e,\"Date\",Fa(e,\"Date\")+a*n),r&&e._d.setTime(e._d.valueOf()+r*n),s&&j.updateOffset(e,a||o))}var Ep=Uf(1,\"add\"),kp=Uf(-1,\"subtract\");function Hf(e){return typeof e==\"string\"||e instanceof String}function wp(e){return on(e)||Xr(e)||Hf(e)||In(e)||Cp(e)||Sp(e)||e===null||e===void 0}function Sp(e){var t=Ss(e)&&!Zi(e),n=!1,s=[\"years\",\"year\",\"y\",\"months\",\"month\",\"M\",\"days\",\"day\",\"d\",\"dates\",\"date\",\"D\",\"hours\",\"hour\",\"h\",\"minutes\",\"minute\",\"m\",\"seconds\",\"second\",\"s\",\"milliseconds\",\"millisecond\",\"ms\"],r,a,o=s.length;for(r=0;r<o;r+=1)a=s[r],n=n||Ae(e,a);return t&&n}function Cp(e){var t=an(e),n=!1;return t&&(n=e.filter(function(s){return!In(s)&&Hf(e)}).length===0),t&&n}function Tp(e){var t=Ss(e)&&!Zi(e),n=!1,s=[\"sameDay\",\"nextDay\",\"lastDay\",\"nextWeek\",\"lastWeek\",\"sameElse\"],r,a;for(r=0;r<s.length;r+=1)a=s[r],n=n||Ae(e,a);return t&&n}function Fp(e,t){var n=e.diff(t,\"days\",!0);return n<-6?\"sameElse\":n<-1?\"lastWeek\":n<0?\"lastDay\":n<1?\"sameDay\":n<2?\"nextDay\":n<7?\"nextWeek\":\"sameElse\"}function Dp(e,t){arguments.length===1&&(arguments[0]?wp(arguments[0])?(e=arguments[0],t=void 0):Tp(arguments[0])&&(t=arguments[0],e=void 0):(e=void 0,t=void 0));var n=e||ze(),s=_l(n,this).startOf(\"day\"),r=j.calendarFormat(this,s)||\"sameElse\",a=t&&(bn(t[r])?t[r].call(this,n):t[r]);return this.format(a||this.localeData().calendar(r,this,ze(n)))}function Op(){return new Zr(this)}function Pp(e,t){var n=on(e)?e:ze(e);return this.isValid()&&n.isValid()?(t=Xt(t)||\"millisecond\",t===\"millisecond\"?this.valueOf()>n.valueOf():n.valueOf()<this.clone().startOf(t).valueOf()):!1}function Np(e,t){var n=on(e)?e:ze(e);return this.isValid()&&n.isValid()?(t=Xt(t)||\"millisecond\",t===\"millisecond\"?this.valueOf()<n.valueOf():this.clone().endOf(t).valueOf()<n.valueOf()):!1}function Ip(e,t,n,s){var r=on(e)?e:ze(e),a=on(t)?t:ze(t);return this.isValid()&&r.isValid()&&a.isValid()?(s=s||\"()\",(s[0]===\"(\"?this.isAfter(r,n):!this.isBefore(r,n))&&(s[1]===\")\"?this.isBefore(a,n):!this.isAfter(a,n))):!1}function Ap(e,t){var n=on(e)?e:ze(e),s;return this.isValid()&&n.isValid()?(t=Xt(t)||\"millisecond\",t===\"millisecond\"?this.valueOf()===n.valueOf():(s=n.valueOf(),this.clone().startOf(t).valueOf()<=s&&s<=this.clone().endOf(t).valueOf())):!1}function Lp(e,t){return this.isSame(e,t)||this.isAfter(e,t)}function Mp(e,t){return this.isSame(e,t)||this.isBefore(e,t)}function xp(e,t,n){var s,r,a;if(!this.isValid())return NaN;if(s=_l(e,this),!s.isValid())return NaN;switch(r=(s.utcOffset()-this.utcOffset())*6e4,t=Xt(t),t){case\"year\":a=ya(this,s)/12;break;case\"month\":a=ya(this,s);break;case\"quarter\":a=ya(this,s)/3;break;case\"second\":a=(this-s)/1e3;break;case\"minute\":a=(this-s)/6e4;break;case\"hour\":a=(this-s)/36e5;break;case\"day\":a=(this-s-r)/864e5;break;case\"week\":a=(this-s-r)/6048e5;break;default:a=this-s}return n?a:zt(a)}function ya(e,t){if(e.date()<t.date())return-ya(t,e);var n=(t.year()-e.year())*12+(t.month()-e.month()),s=e.clone().add(n,\"months\"),r,a;return t-s<0?(r=e.clone().add(n-1,\"months\"),a=(t-s)/(s-r)):(r=e.clone().add(n+1,\"months\"),a=(t-s)/(r-s)),-(n+a)||0}j.defaultFormat=\"YYYY-MM-DDTHH:mm:ssZ\";j.defaultFormatUtc=\"YYYY-MM-DDTHH:mm:ss[Z]\";function $p(){return this.clone().locale(\"en\").format(\"ddd MMM DD YYYY HH:mm:ss [GMT]ZZ\")}function Rp(e){if(!this.isValid())return null;var t=e!==!0,n=t?this.clone().utc():this;return n.year()<0||n.year()>9999?ga(n,t?\"YYYYYY-MM-DD[T]HH:mm:ss.SSS[Z]\":\"YYYYYY-MM-DD[T]HH:mm:ss.SSSZ\"):bn(Date.prototype.toISOString)?t?this.toDate().toISOString():new Date(this.valueOf()+this.utcOffset()*60*1e3).toISOString().replace(\"Z\",ga(n,\"Z\")):ga(n,t?\"YYYY-MM-DD[T]HH:mm:ss.SSS[Z]\":\"YYYY-MM-DD[T]HH:mm:ss.SSSZ\")}function Bp(){if(!this.isValid())return\"moment.invalid(/* \"+this._i+\" */)\";var e=\"moment\",t=\"\",n,s,r,a;return this.isLocal()||(e=this.utcOffset()===0?\"moment.utc\":\"moment.parseZone\",t=\"Z\"),n=\"[\"+e+'(\"]',s=0<=this.year()&&this.year()<=9999?\"YYYY\":\"YYYYYY\",r=\"-MM-DD[T]HH:mm:ss.SSS\",a=t+'[\")]',this.format(n+s+r+a)}function Up(e){e||(e=this.isUtc()?j.defaultFormatUtc:j.defaultFormat);var t=ga(this,e);return this.localeData().postformat(t)}function Yp(e,t){return this.isValid()&&(on(e)&&e.isValid()||ze(e).isValid())?un({to:this,from:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function Hp(e){return this.from(ze(),e)}function Wp(e,t){return this.isValid()&&(on(e)&&e.isValid()||ze(e).isValid())?un({from:this,to:e}).locale(this.locale()).humanize(!t):this.localeData().invalidDate()}function Vp(e){return this.to(ze(),e)}function Wf(e){var t;return e===void 0?this._locale._abbr:(t=Mn(e),t!=null&&(this._locale=t),this)}var Vf=Jt(\"moment().lang() is deprecated. Instead, use moment().localeData() to get the language configuration. Use moment().locale() to change languages.\",function(e){return e===void 0?this.localeData():this.locale(e)});function jf(){return this._locale}var Pa=1e3,Vs=60*Pa,Na=60*Vs,Gf=(365*400+97)*24*Na;function js(e,t){return(e%t+t)%t}function zf(e,t,n){return e<100&&e>=0?new Date(e+400,t,n)-Gf:new Date(e,t,n).valueOf()}function Kf(e,t,n){return e<100&&e>=0?Date.UTC(e+400,t,n)-Gf:Date.UTC(e,t,n)}function jp(e){var t,n;if(e=Xt(e),e===void 0||e===\"millisecond\"||!this.isValid())return this;switch(n=this._isUTC?Kf:zf,e){case\"year\":t=n(this.year(),0,1);break;case\"quarter\":t=n(this.year(),this.month()-this.month()%3,1);break;case\"month\":t=n(this.year(),this.month(),1);break;case\"week\":t=n(this.year(),this.month(),this.date()-this.weekday());break;case\"isoWeek\":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1));break;case\"day\":case\"date\":t=n(this.year(),this.month(),this.date());break;case\"hour\":t=this._d.valueOf(),t-=js(t+(this._isUTC?0:this.utcOffset()*Vs),Na);break;case\"minute\":t=this._d.valueOf(),t-=js(t,Vs);break;case\"second\":t=this._d.valueOf(),t-=js(t,Pa);break}return this._d.setTime(t),j.updateOffset(this,!0),this}function Gp(e){var t,n;if(e=Xt(e),e===void 0||e===\"millisecond\"||!this.isValid())return this;switch(n=this._isUTC?Kf:zf,e){case\"year\":t=n(this.year()+1,0,1)-1;break;case\"quarter\":t=n(this.year(),this.month()-this.month()%3+3,1)-1;break;case\"month\":t=n(this.year(),this.month()+1,1)-1;break;case\"week\":t=n(this.year(),this.month(),this.date()-this.weekday()+7)-1;break;case\"isoWeek\":t=n(this.year(),this.month(),this.date()-(this.isoWeekday()-1)+7)-1;break;case\"day\":case\"date\":t=n(this.year(),this.month(),this.date()+1)-1;break;case\"hour\":t=this._d.valueOf(),t+=Na-js(t+(this._isUTC?0:this.utcOffset()*Vs),Na)-1;break;case\"minute\":t=this._d.valueOf(),t+=Vs-js(t,Vs)-1;break;case\"second\":t=this._d.valueOf(),t+=Pa-js(t,Pa)-1;break}return this._d.setTime(t),j.updateOffset(this,!0),this}function zp(){return this._d.valueOf()-(this._offset||0)*6e4}function Kp(){return Math.floor(this.valueOf()/1e3)}function qp(){return new Date(this.valueOf())}function Jp(){var e=this;return[e.year(),e.month(),e.date(),e.hour(),e.minute(),e.second(),e.millisecond()]}function Xp(){var e=this;return{years:e.year(),months:e.month(),date:e.date(),hours:e.hours(),minutes:e.minutes(),seconds:e.seconds(),milliseconds:e.milliseconds()}}function Zp(){return this.isValid()?this.toISOString():null}function Qp(){return Qi(this)}function e8(){return zn({},ke(this))}function t8(){return ke(this).overflow}function n8(){return{input:this._i,format:this._f,locale:this._locale,isUTC:this._isUTC,strict:this._strict}}re(\"N\",0,0,\"eraAbbr\");re(\"NN\",0,0,\"eraAbbr\");re(\"NNN\",0,0,\"eraAbbr\");re(\"NNNN\",0,0,\"eraName\");re(\"NNNNN\",0,0,\"eraNarrow\");re(\"y\",[\"y\",1],\"yo\",\"eraYear\");re(\"y\",[\"yy\",2],0,\"eraYear\");re(\"y\",[\"yyy\",3],0,\"eraYear\");re(\"y\",[\"yyyy\",4],0,\"eraYear\");Z(\"N\",pl);Z(\"NN\",pl);Z(\"NNN\",pl);Z(\"NNNN\",h8);Z(\"NNNNN\",_8);Be([\"N\",\"NN\",\"NNN\",\"NNNN\",\"NNNNN\"],function(e,t,n,s){var r=n._locale.erasParse(e,s,n._strict);r?ke(n).era=r:ke(n).invalidEra=e});Z(\"y\",lr);Z(\"yy\",lr);Z(\"yyy\",lr);Z(\"yyyy\",lr);Z(\"yo\",p8);Be([\"y\",\"yy\",\"yyy\",\"yyyy\"],kt);Be([\"yo\"],function(e,t,n,s){var r;n._locale._eraYearOrdinalRegex&&(r=e.match(n._locale._eraYearOrdinalRegex)),n._locale.eraYearOrdinalParse?t[kt]=n._locale.eraYearOrdinalParse(e,r):t[kt]=parseInt(e,10)});function s8(e,t){var n,s,r,a=this._eras||Mn(\"en\")._eras;for(n=0,s=a.length;n<s;++n){switch(typeof a[n].since){case\"string\":r=j(a[n].since).startOf(\"day\"),a[n].since=r.valueOf();break}switch(typeof a[n].until){case\"undefined\":a[n].until=1/0;break;case\"string\":r=j(a[n].until).startOf(\"day\").valueOf(),a[n].until=r.valueOf();break}}return a}function r8(e,t,n){var s,r,a=this.eras(),o,i,l;for(e=e.toUpperCase(),s=0,r=a.length;s<r;++s)if(o=a[s].name.toUpperCase(),i=a[s].abbr.toUpperCase(),l=a[s].narrow.toUpperCase(),n)switch(t){case\"N\":case\"NN\":case\"NNN\":if(i===e)return a[s];break;case\"NNNN\":if(o===e)return a[s];break;case\"NNNNN\":if(l===e)return a[s];break}else if([o,i,l].indexOf(e)>=0)return a[s]}function a8(e,t){var n=e.since<=e.until?1:-1;return t===void 0?j(e.since).year():j(e.since).year()+(t-e.offset)*n}function o8(){var e,t,n,s=this.localeData().eras();for(e=0,t=s.length;e<t;++e)if(n=this.clone().startOf(\"day\").valueOf(),s[e].since<=n&&n<=s[e].until||s[e].until<=n&&n<=s[e].since)return s[e].name;return\"\"}function i8(){var e,t,n,s=this.localeData().eras();for(e=0,t=s.length;e<t;++e)if(n=this.clone().startOf(\"day\").valueOf(),s[e].since<=n&&n<=s[e].until||s[e].until<=n&&n<=s[e].since)return s[e].narrow;return\"\"}function l8(){var e,t,n,s=this.localeData().eras();for(e=0,t=s.length;e<t;++e)if(n=this.clone().startOf(\"day\").valueOf(),s[e].since<=n&&n<=s[e].until||s[e].until<=n&&n<=s[e].since)return s[e].abbr;return\"\"}function u8(){var e,t,n,s,r=this.localeData().eras();for(e=0,t=r.length;e<t;++e)if(n=r[e].since<=r[e].until?1:-1,s=this.clone().startOf(\"day\").valueOf(),r[e].since<=s&&s<=r[e].until||r[e].until<=s&&s<=r[e].since)return(this.year()-j(r[e].since).year())*n+r[e].offset;return this.year()}function c8(e){return Ae(this,\"_erasNameRegex\")||ml.call(this),e?this._erasNameRegex:this._erasRegex}function d8(e){return Ae(this,\"_erasAbbrRegex\")||ml.call(this),e?this._erasAbbrRegex:this._erasRegex}function f8(e){return Ae(this,\"_erasNarrowRegex\")||ml.call(this),e?this._erasNarrowRegex:this._erasRegex}function pl(e,t){return t.erasAbbrRegex(e)}function h8(e,t){return t.erasNameRegex(e)}function _8(e,t){return t.erasNarrowRegex(e)}function p8(e,t){return t._eraYearOrdinalRegex||lr}function ml(){var e=[],t=[],n=[],s=[],r,a,o=this.eras();for(r=0,a=o.length;r<a;++r)t.push(Ut(o[r].name)),e.push(Ut(o[r].abbr)),n.push(Ut(o[r].narrow)),s.push(Ut(o[r].name)),s.push(Ut(o[r].abbr)),s.push(Ut(o[r].narrow));this._erasRegex=new RegExp(\"^(\"+s.join(\"|\")+\")\",\"i\"),this._erasNameRegex=new RegExp(\"^(\"+t.join(\"|\")+\")\",\"i\"),this._erasAbbrRegex=new RegExp(\"^(\"+e.join(\"|\")+\")\",\"i\"),this._erasNarrowRegex=new RegExp(\"^(\"+n.join(\"|\")+\")\",\"i\")}re(0,[\"gg\",2],0,function(){return this.weekYear()%100});re(0,[\"GG\",2],0,function(){return this.isoWeekYear()%100});function io(e,t){re(0,[e,e.length],0,t)}io(\"gggg\",\"weekYear\");io(\"ggggg\",\"weekYear\");io(\"GGGG\",\"isoWeekYear\");io(\"GGGGG\",\"isoWeekYear\");St(\"weekYear\",\"gg\");St(\"isoWeekYear\",\"GG\");Ct(\"weekYear\",1);Ct(\"isoWeekYear\",1);Z(\"G\",no);Z(\"g\",no);Z(\"GG\",Ke,Wt);Z(\"gg\",Ke,Wt);Z(\"GGGG\",al,rl);Z(\"gggg\",al,rl);Z(\"GGGGG\",to,Qa);Z(\"ggggg\",to,Qa);ea([\"gggg\",\"ggggg\",\"GGGG\",\"GGGGG\"],function(e,t,n,s){t[s.substr(0,2)]=Ce(e)});ea([\"gg\",\"GG\"],function(e,t,n,s){t[s]=j.parseTwoDigitYear(e)});function m8(e){return qf.call(this,e,this.week(),this.weekday(),this.localeData()._week.dow,this.localeData()._week.doy)}function g8(e){return qf.call(this,e,this.isoWeek(),this.isoWeekday(),1,4)}function v8(){return Pn(this.year(),1,4)}function y8(){return Pn(this.isoWeekYear(),1,4)}function b8(){var e=this.localeData()._week;return Pn(this.year(),e.dow,e.doy)}function E8(){var e=this.localeData()._week;return Pn(this.weekYear(),e.dow,e.doy)}function qf(e,t,n,s,r){var a;return e==null?Vr(this,s,r).year:(a=Pn(e,s,r),t>a&&(t=a),k8.call(this,e,t,n,s,r))}function k8(e,t,n,s,r){var a=Df(e,t,n,s,r),o=Wr(a.year,0,a.dayOfYear);return this.year(o.getUTCFullYear()),this.month(o.getUTCMonth()),this.date(o.getUTCDate()),this}re(\"Q\",0,\"Qo\",\"quarter\");St(\"quarter\",\"Q\");Ct(\"quarter\",7);Z(\"Q\",vf);Be(\"Q\",function(e,t){t[Dn]=(Ce(e)-1)*3});function w8(e){return e==null?Math.ceil((this.month()+1)/3):this.month((e-1)*3+this.month()%3)}re(\"D\",[\"DD\",2],\"Do\",\"date\");St(\"date\",\"D\");Ct(\"date\",9);Z(\"D\",Ke);Z(\"DD\",Ke,Wt);Z(\"Do\",function(e,t){return e?t._dayOfMonthOrdinalParse||t._ordinalParse:t._dayOfMonthOrdinalParseLenient});Be([\"D\",\"DD\"],mn);Be(\"Do\",function(e,t){t[mn]=Ce(e.match(Ke)[0])});var Jf=ir(\"Date\",!0);re(\"DDD\",[\"DDDD\",3],\"DDDo\",\"dayOfYear\");St(\"dayOfYear\",\"DDD\");Ct(\"dayOfYear\",4);Z(\"DDD\",eo);Z(\"DDDD\",yf);Be([\"DDD\",\"DDDD\"],function(e,t,n){n._dayOfYear=Ce(e)});function S8(e){var t=Math.round((this.clone().startOf(\"day\")-this.clone().startOf(\"year\"))/864e5)+1;return e==null?t:this.add(e-t,\"d\")}re(\"m\",[\"mm\",2],0,\"minute\");St(\"minute\",\"m\");Ct(\"minute\",14);Z(\"m\",Ke);Z(\"mm\",Ke,Wt);Be([\"m\",\"mm\"],sn);var C8=ir(\"Minutes\",!1);re(\"s\",[\"ss\",2],0,\"second\");St(\"second\",\"s\");Ct(\"second\",15);Z(\"s\",Ke);Z(\"ss\",Ke,Wt);Be([\"s\",\"ss\"],On);var T8=ir(\"Seconds\",!1);re(\"S\",0,0,function(){return~~(this.millisecond()/100)});re(0,[\"SS\",2],0,function(){return~~(this.millisecond()/10)});re(0,[\"SSS\",3],0,\"millisecond\");re(0,[\"SSSS\",4],0,function(){return this.millisecond()*10});re(0,[\"SSSSS\",5],0,function(){return this.millisecond()*100});re(0,[\"SSSSSS\",6],0,function(){return this.millisecond()*1e3});re(0,[\"SSSSSSS\",7],0,function(){return this.millisecond()*1e4});re(0,[\"SSSSSSSS\",8],0,function(){return this.millisecond()*1e5});re(0,[\"SSSSSSSSS\",9],0,function(){return this.millisecond()*1e6});St(\"millisecond\",\"ms\");Ct(\"millisecond\",16);Z(\"S\",eo,vf);Z(\"SS\",eo,Wt);Z(\"SSS\",eo,yf);var Kn,Xf;for(Kn=\"SSSS\";Kn.length<=9;Kn+=\"S\")Z(Kn,lr);function F8(e,t){t[ks]=Ce((\"0.\"+e)*1e3)}for(Kn=\"S\";Kn.length<=9;Kn+=\"S\")Be(Kn,F8);Xf=ir(\"Milliseconds\",!1);re(\"z\",0,0,\"zoneAbbr\");re(\"zz\",0,0,\"zoneName\");function D8(){return this._isUTC?\"UTC\":\"\"}function O8(){return this._isUTC?\"Coordinated Universal Time\":\"\"}var B=Zr.prototype;B.add=Ep;B.calendar=Dp;B.clone=Op;B.diff=xp;B.endOf=Gp;B.format=Up;B.from=Yp;B.fromNow=Hp;B.to=Wp;B.toNow=Vp;B.get=N4;B.invalidAt=t8;B.isAfter=Pp;B.isBefore=Np;B.isBetween=Ip;B.isSame=Ap;B.isSameOrAfter=Lp;B.isSameOrBefore=Mp;B.isValid=Qp;B.lang=Vf;B.locale=Wf;B.localeData=jf;B.max=Q_;B.min=Z_;B.parsingFlags=e8;B.set=I4;B.startOf=jp;B.subtract=kp;B.toArray=Jp;B.toObject=Xp;B.toDate=qp;B.toISOString=Rp;B.inspect=Bp;typeof Symbol!=\"undefined\"&&Symbol.for!=null&&(B[Symbol.for(\"nodejs.util.inspect.custom\")]=function(){return\"Moment<\"+this.format()+\">\"});B.toJSON=Zp;B.toString=$p;B.unix=Kp;B.valueOf=zp;B.creationData=n8;B.eraName=o8;B.eraNarrow=i8;B.eraAbbr=l8;B.eraYear=u8;B.year=Ff;B.isLeapYear=X4;B.weekYear=m8;B.isoWeekYear=g8;B.quarter=B.quarters=w8;B.month=Cf;B.daysInMonth=K4;B.week=B.weeks=s_;B.isoWeek=B.isoWeeks=r_;B.weeksInYear=b8;B.weeksInWeekYear=E8;B.isoWeeksInYear=v8;B.isoWeeksInISOWeekYear=y8;B.date=Jf;B.day=B.days=g_;B.weekday=v_;B.isoWeekday=y_;B.dayOfYear=S8;B.hour=B.hours=T_;B.minute=B.minutes=C8;B.second=B.seconds=T8;B.millisecond=B.milliseconds=Xf;B.utcOffset=lp;B.utc=cp;B.local=dp;B.parseZone=fp;B.hasAlignedHourOffset=hp;B.isDST=_p;B.isLocal=mp;B.isUtcOffset=gp;B.isUtc=Bf;B.isUTC=Bf;B.zoneAbbr=D8;B.zoneName=O8;B.dates=Jt(\"dates accessor is deprecated. Use date instead.\",Jf);B.months=Jt(\"months accessor is deprecated. Use month instead\",Cf);B.years=Jt(\"years accessor is deprecated. Use year instead\",Ff);B.zone=Jt(\"moment().zone is deprecated, use moment().utcOffset instead. http://momentjs.com/guides/#/warnings/zone/\",up);B.isDSTShifted=Jt(\"isDSTShifted is deprecated. See http://momentjs.com/guides/#/warnings/dst-shifted/ for more information\",pp);function P8(e){return ze(e*1e3)}function N8(){return ze.apply(null,arguments).parseZone()}function Zf(e){return e}var Le=tl.prototype;Le.calendar=g4;Le.longDateFormat=E4;Le.invalidDate=w4;Le.ordinal=T4;Le.preparse=Zf;Le.postformat=Zf;Le.relativeTime=D4;Le.pastFuture=O4;Le.set=p4;Le.eras=s8;Le.erasParse=r8;Le.erasConvertYear=a8;Le.erasAbbrRegex=d8;Le.erasNameRegex=c8;Le.erasNarrowRegex=f8;Le.months=V4;Le.monthsShort=j4;Le.monthsParse=z4;Le.monthsRegex=J4;Le.monthsShortRegex=q4;Le.week=Q4;Le.firstDayOfYear=n_;Le.firstDayOfWeek=t_;Le.weekdays=f_;Le.weekdaysMin=__;Le.weekdaysShort=h_;Le.weekdaysParse=m_;Le.weekdaysRegex=b_;Le.weekdaysShortRegex=E_;Le.weekdaysMinRegex=k_;Le.isPM=S_;Le.meridiem=F_;function Ia(e,t,n,s){var r=Mn(),a=yn().set(s,t);return r[n](a,e)}function Qf(e,t,n){if(In(e)&&(t=e,e=void 0),e=e||\"\",t!=null)return Ia(e,t,n,\"month\");var s,r=[];for(s=0;s<12;s++)r[s]=Ia(e,s,n,\"month\");return r}function gl(e,t,n,s){typeof e==\"boolean\"?(In(t)&&(n=t,t=void 0),t=t||\"\"):(t=e,n=t,e=!1,In(t)&&(n=t,t=void 0),t=t||\"\");var r=Mn(),a=e?r._week.dow:0,o,i=[];if(n!=null)return Ia(t,(n+a)%7,s,\"day\");for(o=0;o<7;o++)i[o]=Ia(t,(o+a)%7,s,\"day\");return i}function I8(e,t){return Qf(e,t,\"months\")}function A8(e,t){return Qf(e,t,\"monthsShort\")}function L8(e,t,n){return gl(e,t,n,\"weekdays\")}function M8(e,t,n){return gl(e,t,n,\"weekdaysShort\")}function x8(e,t,n){return gl(e,t,n,\"weekdaysMin\")}ts(\"en\",{eras:[{since:\"0001-01-01\",until:1/0,offset:1,name:\"Anno Domini\",narrow:\"AD\",abbr:\"AD\"},{since:\"0000-12-31\",until:-1/0,offset:1,name:\"Before Christ\",narrow:\"BC\",abbr:\"BC\"}],dayOfMonthOrdinalParse:/\\d{1,2}(th|st|nd|rd)/,ordinal:function(e){var t=e%10,n=Ce(e%100/10)===1?\"th\":t===1?\"st\":t===2?\"nd\":t===3?\"rd\":\"th\";return e+n}});j.lang=Jt(\"moment.lang is deprecated. Use moment.locale instead.\",ts);j.langData=Jt(\"moment.langData is deprecated. Use moment.localeData instead.\",Mn);var kn=Math.abs;function $8(){var e=this._data;return this._milliseconds=kn(this._milliseconds),this._days=kn(this._days),this._months=kn(this._months),e.milliseconds=kn(e.milliseconds),e.seconds=kn(e.seconds),e.minutes=kn(e.minutes),e.hours=kn(e.hours),e.months=kn(e.months),e.years=kn(e.years),this}function e1(e,t,n,s){var r=un(t,n);return e._milliseconds+=s*r._milliseconds,e._days+=s*r._days,e._months+=s*r._months,e._bubble()}function R8(e,t){return e1(this,e,t,1)}function B8(e,t){return e1(this,e,t,-1)}function ac(e){return e<0?Math.floor(e):Math.ceil(e)}function U8(){var e=this._milliseconds,t=this._days,n=this._months,s=this._data,r,a,o,i,l;return e>=0&&t>=0&&n>=0||e<=0&&t<=0&&n<=0||(e+=ac(fi(n)+t)*864e5,t=0,n=0),s.milliseconds=e%1e3,r=zt(e/1e3),s.seconds=r%60,a=zt(r/60),s.minutes=a%60,o=zt(a/60),s.hours=o%24,t+=zt(o/24),l=zt(t1(t)),n+=l,t-=ac(fi(l)),i=zt(n/12),n%=12,s.days=t,s.months=n,s.years=i,this}function t1(e){return e*4800/146097}function fi(e){return e*146097/4800}function Y8(e){if(!this.isValid())return NaN;var t,n,s=this._milliseconds;if(e=Xt(e),e===\"month\"||e===\"quarter\"||e===\"year\")switch(t=this._days+s/864e5,n=this._months+t1(t),e){case\"month\":return n;case\"quarter\":return n/3;case\"year\":return n/12}else switch(t=this._days+Math.round(fi(this._months)),e){case\"week\":return t/7+s/6048e5;case\"day\":return t+s/864e5;case\"hour\":return t*24+s/36e5;case\"minute\":return t*1440+s/6e4;case\"second\":return t*86400+s/1e3;case\"millisecond\":return Math.floor(t*864e5)+s;default:throw new Error(\"Unknown unit \"+e)}}function H8(){return this.isValid()?this._milliseconds+this._days*864e5+this._months%12*2592e6+Ce(this._months/12)*31536e6:NaN}function xn(e){return function(){return this.as(e)}}var W8=xn(\"ms\"),V8=xn(\"s\"),j8=xn(\"m\"),G8=xn(\"h\"),z8=xn(\"d\"),K8=xn(\"w\"),q8=xn(\"M\"),J8=xn(\"Q\"),X8=xn(\"y\");function Z8(){return un(this)}function Q8(e){return e=Xt(e),this.isValid()?this[e+\"s\"]():NaN}function Ds(e){return function(){return this.isValid()?this._data[e]:NaN}}var em=Ds(\"milliseconds\"),tm=Ds(\"seconds\"),nm=Ds(\"minutes\"),sm=Ds(\"hours\"),rm=Ds(\"days\"),am=Ds(\"months\"),om=Ds(\"years\");function im(){return zt(this.days()/7)}var Cn=Math.round,Rs={ss:44,s:45,m:45,h:22,d:26,w:null,M:11};function lm(e,t,n,s,r){return r.relativeTime(t||1,!!n,e,s)}function um(e,t,n,s){var r=un(e).abs(),a=Cn(r.as(\"s\")),o=Cn(r.as(\"m\")),i=Cn(r.as(\"h\")),l=Cn(r.as(\"d\")),u=Cn(r.as(\"M\")),c=Cn(r.as(\"w\")),_=Cn(r.as(\"y\")),p=a<=n.ss&&[\"s\",a]||a<n.s&&[\"ss\",a]||o<=1&&[\"m\"]||o<n.m&&[\"mm\",o]||i<=1&&[\"h\"]||i<n.h&&[\"hh\",i]||l<=1&&[\"d\"]||l<n.d&&[\"dd\",l];return n.w!=null&&(p=p||c<=1&&[\"w\"]||c<n.w&&[\"ww\",c]),p=p||u<=1&&[\"M\"]||u<n.M&&[\"MM\",u]||_<=1&&[\"y\"]||[\"yy\",_],p[2]=t,p[3]=+e>0,p[4]=s,lm.apply(null,p)}function cm(e){return e===void 0?Cn:typeof e==\"function\"?(Cn=e,!0):!1}function dm(e,t){return Rs[e]===void 0?!1:t===void 0?Rs[e]:(Rs[e]=t,e===\"s\"&&(Rs.ss=t-1),!0)}function fm(e,t){if(!this.isValid())return this.localeData().invalidDate();var n=!1,s=Rs,r,a;return typeof e==\"object\"&&(t=e,e=!1),typeof e==\"boolean\"&&(n=e),typeof t==\"object\"&&(s=Object.assign({},Rs,t),t.s!=null&&t.ss==null&&(s.ss=t.s-1)),r=this.localeData(),a=um(this,!n,s,r),n&&(a=r.pastFuture(+this,a)),r.postformat(a)}var Do=Math.abs;function Ns(e){return(e>0)-(e<0)||+e}function lo(){if(!this.isValid())return this.localeData().invalidDate();var e=Do(this._milliseconds)/1e3,t=Do(this._days),n=Do(this._months),s,r,a,o,i=this.asSeconds(),l,u,c,_;return i?(s=zt(e/60),r=zt(s/60),e%=60,s%=60,a=zt(n/12),n%=12,o=e?e.toFixed(3).replace(/\\.?0+$/,\"\"):\"\",l=i<0?\"-\":\"\",u=Ns(this._months)!==Ns(i)?\"-\":\"\",c=Ns(this._days)!==Ns(i)?\"-\":\"\",_=Ns(this._milliseconds)!==Ns(i)?\"-\":\"\",l+\"P\"+(a?u+a+\"Y\":\"\")+(n?u+n+\"M\":\"\")+(t?c+t+\"D\":\"\")+(r||s||e?\"T\":\"\")+(r?_+r+\"H\":\"\")+(s?_+s+\"M\":\"\")+(e?_+o+\"S\":\"\")):\"P0D\"}var Oe=oo.prototype;Oe.isValid=rp;Oe.abs=$8;Oe.add=R8;Oe.subtract=B8;Oe.as=Y8;Oe.asMilliseconds=W8;Oe.asSeconds=V8;Oe.asMinutes=j8;Oe.asHours=G8;Oe.asDays=z8;Oe.asWeeks=K8;Oe.asMonths=q8;Oe.asQuarters=J8;Oe.asYears=X8;Oe.valueOf=H8;Oe._bubble=U8;Oe.clone=Z8;Oe.get=Q8;Oe.milliseconds=em;Oe.seconds=tm;Oe.minutes=nm;Oe.hours=sm;Oe.days=rm;Oe.weeks=im;Oe.months=am;Oe.years=om;Oe.humanize=fm;Oe.toISOString=lo;Oe.toString=lo;Oe.toJSON=lo;Oe.locale=Wf;Oe.localeData=jf;Oe.toIsoString=Jt(\"toIsoString() is deprecated. Please use toISOString() instead (notice the capitals)\",lo);Oe.lang=Vf;re(\"X\",0,0,\"unix\");re(\"x\",0,0,\"valueOf\");Z(\"x\",no);Z(\"X\",L4);Be(\"X\",function(e,t,n){n._d=new Date(parseFloat(e)*1e3)});Be(\"x\",function(e,t,n){n._d=new Date(Ce(e))});//! moment.js\nj.version=\"2.29.4\";h4(ze);j.fn=B;j.min=ep;j.max=tp;j.now=np;j.utc=yn;j.unix=P8;j.months=I8;j.isDate=Xr;j.locale=ts;j.invalid=Xa;j.duration=un;j.isMoment=on;j.weekdays=L8;j.parseZone=N8;j.localeData=Mn;j.isDuration=va;j.monthsShort=A8;j.weekdaysMin=x8;j.defineLocale=ul;j.updateLocale=N_;j.locales=I_;j.weekdaysShort=M8;j.normalizeUnits=Xt;j.relativeTimeRounding=cm;j.relativeTimeThreshold=dm;j.calendarFormat=Fp;j.prototype=B;j.HTML5_FMT={DATETIME_LOCAL:\"YYYY-MM-DDTHH:mm\",DATETIME_LOCAL_SECONDS:\"YYYY-MM-DDTHH:mm:ss\",DATETIME_LOCAL_MS:\"YYYY-MM-DDTHH:mm:ss.SSS\",DATE:\"YYYY-MM-DD\",TIME:\"HH:mm\",TIME_SECONDS:\"HH:mm:ss\",TIME_MS:\"HH:mm:ss.SSS\",WEEK:\"GGGG-[W]WW\",MONTH:\"YYYY-MM\"};j.locale(\"zh-cn\",{});const hm=e=>{if(e)return j(e).utc().format(\"YYYY-MM-DD HH:mm:ss\")},_m=e=>{if(e)return j(e).utc().format(\"YYYY\\u5E74MM\\u6708DD\\u65E5\")},pm=e=>{if(e)return j(e).utc().format(\"HH:mm:ss\")},mm=()=>new Date().getTime(),gm=e=>{if(e<1e3)return`${e} B`;let n=1e3,s=0;for(let o=e/1e3;o>=1e3;o/=1e3)n*=1e3,s++;let r=[\" KB\",\" MB\",\" GB\",\" TB\",\" PB\",\" EB\"];return(e/100/(n/100)).toFixed(1)+r[s]},vm=e=>{if(e<1024)return\"\"+e+\"KB\";let n=1024,s=0;for(let a=e/1024;a>=1024;a/=1024)n*=1024,s++;let r=[\"M\",\"G\",\"T\",\"P\",\"E\"];return(e/100/(n/100)).toFixed(2)+r[s]},ym=e=>{if(e==null)return 0;if(e<1e4)return e;let n=parseInt(`${e/1e4}`),s=e%1e4;return`${n}\\u4E07${s}`},bm=e=>{if(e)try{var t=new Date(e),n=t.getHours(),s=t.getMinutes(),r=t.getSeconds();return n<10&&(n=`0${n}`),s<10&&(s=`0${s}`),r<10&&(r=`0${r}`),`${n}:${s}:${r}`}catch(a){}return\"\"},Em=e=>{if(e)try{var t=new Date(Number(e)*1e3),n=t.getFullYear(),s=t.getMonth()+1,r=t.getDate();return n+\"\\u5E74\"+s+\"\\u6708\"+r+\"\\u65E5 \"}catch(a){}return\"\"},km=e=>{if(e){let t=Math.floor(e/86400),n=Math.floor(e%86400/3600),s=Math.floor(e%86400%3600/60),r=Math.floor(e%86400%3600%60);return t+\"\\u5929\"+n+\"\\u5C0F\\u65F6\"+(s>=10?s:\"0\"+s)+\"\\u5206\"+(r>=10?r:\"0\"+r)+\"\\u79D2\"}},wm=e=>/^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(e),Sm=e=>e.length<3?\"\\u7528\\u6237\\u540D\\u592A\\u77ED\":e.toLowerCase()!=e?\"\\u7528\\u6237\\u540D\\u53EA\\u80FD\\u4E3A\\u5C0F\\u5199\":new RegExp(\"^\\\\d\").exec(e)?\"\\u7528\\u6237\\u540D\\u4E0D\\u80FD\\u4EE5\\u6570\\u5B57\\u5F00\\u5934\":new RegExp(\"^_\").exec(e)?\"\\u7528\\u6237\\u540D\\u4E0D\\u80FD\\u4EE5_\\u5F00\\u5934\":new RegExp(\"^[a-z0-9_]+$\").exec(e)?!0:\"\\u975E\\u6CD5\\u7684\\u7528\\u6237\\u540D\",Cm=()=>window.token||\"\",Tm=new Intl.NumberFormat(\"zh-CN\",{notation:\"compact\"}),Fm=e=>Tm.format(e),Dm=()=>{var e;return((e=window==null?void 0:window.device_id)==null?void 0:e.uid)||\"\"},Om=()=>(window==null?void 0:window.model)||\"wizard\",Pm=()=>(window==null?void 0:window.istoreXVer)||\"\";var Nm=Object.freeze(Object.defineProperty({__proto__:null,formatDate:hm,formatDateYMD:_m,formatDateHMS:pm,UnixDate:mm,byteToSize:gm,numberToSize:vm,numberToSum:ym,dateForm:bm,dateYearDayForm:Em,stampForm:km,checkIsIP:wm,checkSmabaUserName:Sm,getToken:Cm,numberFormat:Fm,getDeviceId:Dm,getModel:Om,getVersion:Pm},Symbol.toStringTag,{value:\"Module\"}));const Im=()=>!!(navigator.userAgent||\"\").match(/(phone|pad|pod|iPhone|iPod|ios|iPad|Android|Mobile|BlackBerry|IEMobile|MQQBrowser|JUC|Fennec|wOSBrowser|BrowserNG|WebOS|Symbian|Windows Phone)/i);var Am=Object.freeze(Object.defineProperty({__proto__:null,isMobile:Im},Symbol.toStringTag,{value:\"Module\"})),it=gt(gt({},Am),Nm);const Is=(e,t)=>(e=`/cgi-bin/luci${e}`,At(e,t)),Lm={installed:{GET(){return Is(\"/admin/store/installed\",{method:\"GET\"})}},installedList:{GET(){return Is(\"/istore/app/install-list/\",{method:\"GET\"})}},install:{POST(e){return Is(\"/admin/store/install?\"+new URLSearchParams({package:e,token:it.getToken(),_t:`${it.UnixDate()}`}),{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"}})}},remove:{POST(e){return Is(\"/admin/store/remove?\"+new URLSearchParams({package:e,token:it.getToken(),_t:`${it.UnixDate()}`}),{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"}})}},upgrade:{POST(e){return Is(\"/admin/store/upgrade?\"+new URLSearchParams({package:e,token:it.getToken(),_t:`${it.UnixDate()}`}),{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"}})}},upload:{POST(e){return Is(\"/admin/store/upload?\"+new URLSearchParams({token:it.getToken(),_t:`${it.UnixDate()}`}),{method:\"POST\",body:e})}}},n1=\"https://istore.linkease.com\",vr=(e,t)=>(e=`${n1}/api${e}`,At(e,t)),Mm={getStoreAppIcon(e){return`${n1}${e}`},list:{GET(){return vr(\"/store/list\",{method:\"GET\"})}},tags:{GET(){return vr(\"/store/tags\",{method:\"GET\"})}},expand:{POST(e){return vr(\"/store/expand\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},star:{POST(e){return vr(\"/store/star\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},download:{POST(e){return vr(\"/store/download\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}}};var xm=Object.freeze(Object.defineProperty({__proto__:null,Store:Lm,ApiStore:Mm},Symbol.toStringTag,{value:\"Module\"}));const hi=(e,t)=>(e=`/cgi-bin/luci/admin/istorex_api${e}`,At(e,t)),$m={Status:{Get:()=>hi(\"/status\",{method:\"GET\"})},Updata:{POST:e=>hi(\"/update\",{method:\"POST\",body:JSON.stringify(e)})}},Rm={BG:{POST(e){return hi(\"/upload-bg\",{method:\"POST\",body:e})}}};var Bm=Object.freeze(Object.defineProperty({__proto__:null,Istorex:$m,Upload:Rm},Symbol.toStringTag,{value:\"Module\"}));const Um={AutoSetup:{POST(e){const t=new URLSearchParams;return t.set(\"token\",it.getToken()),e.packages.forEach(n=>{t.append(\"packages\",n)}),At(\"/cgi-bin/luci/admin/nas/quickstart/auto_setup\",{method:\"POST\",headers:{\"Content-Type\":\"application/x-www-form-urlencoded\"},body:t})}},SetupResult:{GET(){return At(\"/cgi-bin/luci/admin/nas/quickstart/setup_result\",{method:\"GET\"})}},Guide:{GlobalFolders:{GET(){return At(\"/cgi-bin/luci/istore/guide/global-folders/\",{method:\"GET\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"}})},POST(e){return At(\"/cgi-bin/luci/istore/guide/global-folders/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},DockerStatus:{GET(){return At(\"/cgi-bin/luci/istore/guide/docker/status/\",{method:\"GET\"})}},DockerTransfer:{POST(e){return At(\"/cgi-bin/luci/istore/guide/docker/transfer/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}}}},Ym={Get:{POST(e){return At(\"/cgi-bin/luci/istore/quickstart/get/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},Set:{POST(e){return At(\"/cgi-bin/luci/istore/quickstart/set/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}},Delete:{POST(e){return At(\"/cgi-bin/luci/istore/quickstart/delete/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(e)})}}};var Hm=Object.freeze(Object.defineProperty({__proto__:null,Quickstart:Um,Storage:Ym},Symbol.toStringTag,{value:\"Module\"}));const oe=gt(gt(gt(gt({},d4),xm),Bm),Hm);const cs=e=>(nt(\"data-v-840edaba\"),e=e(),st(),e),Wm=[\"onSubmit\"],Vm=cs(()=>d(\"div\",{class:\"action-container_header\"},[d(\"span\",{class:\"title\"},\"\\u52A8\\u6001DDNS\\u914D\\u7F6E\")],-1)),jm={class:\"action-container_body\"},Gm=cs(()=>d(\"div\",{style:{padding:\"15px\"}},null,-1)),zm=cs(()=>d(\"div\",{class:\"label-name\"},[d(\"span\",null,\"\\u4F9B\\u5E94\\u5546\")],-1)),Km={class:\"label-value\"},qm={class:\"label-flex\"},Jm={class:\"label-radio\"},Xm={class:\"label-radio\"},Zm={class:\"label-radio\"},Qm={class:\"label-name\"},e5={key:0,href:\"https://doc.linkease.com/zh/guide/istoreos/basic/domain.html#%E9%98%BF%E9%87%8C%E4%BA%91\",target:\"_blank\"},t5={key:1,href:\"https://doc.linkease.com/zh/guide/istoreos/basic/domain.html#dnspod\",target:\"_blank\"},n5={key:2,href:\"https://doc.linkease.com/zh/guide/istoreos/basic/domain.html#%E8%8A%B1%E7%94%9F%E5%A3%B3\",target:\"_blank\"},s5=cs(()=>d(\"div\",{class:\"label-value\"},null,-1)),r5=cs(()=>d(\"div\",{class:\"label-name\"},[d(\"span\",null,\"\\u57DF\\u540D\")],-1)),a5={class:\"label-value\"},o5=cs(()=>d(\"div\",{class:\"label-name\"},[d(\"span\",null,\"\\u7528\\u6237\\u540D\")],-1)),i5={class:\"label-value\"},l5=cs(()=>d(\"div\",{class:\"label-name\"},[d(\"span\",null,\"\\u5BC6\\u7801\")],-1)),u5={class:\"label-value\"},c5={class:\"action-container_footer\"},d5=cs(()=>d(\"div\",{class:\"auto\"},null,-1)),f5=[\"disabled\"],h5=[\"disabled\"],_5=ue({__name:\"index\",props:{setupe:{type:String,default:\"ipv4\"},callback:{type:Function}},setup(e){const t=e,n=Ht(),s=()=>{n&&n.appContext.config.globalProperties.$close()},r=wt({ipVersion:t.setupe,serviceName:\"ali\",domain:\"\",userName:\"\",password:\"\"}),a=le(!1),o=()=>te(this,null,function*(){a.value=!0;const i=fe.Loading(\"\\u914D\\u7F6E\\u4E2D...\");try{const l=yield oe.Guide.PostDdns.POST({ipVersion:r.ipVersion,serviceName:r.serviceName,domain:r.domain,userName:r.userName,password:r.password});if(l!=null&&l.data){const{error:u,scope:c,success:_}=l.data;if(u==\"-100\"&&c==\"guide.ddns\")throw\"\\u68C0\\u6D4B\\u5230\\u4F60\\u6709\\u672A\\u4FDD\\u5B58\\u7684\\u914D\\u7F6E\\uFF0C\\u53EF\\u524D\\u5F80\\u9875\\u9762\\u53F3\\u4E0A\\u89D2\\u70B9\\u51FB\\u67E5\\u770B\\uFF0C\\u4FDD\\u5B58\\u5E76\\u5E94\\u7528\\u6216\\u8005\\u6062\\u590D\\u914D\\u7F6E\\u540E\\u7EE7\\u7EED\";if(u)throw u;if((_||0)==0){fe.Success(\"\\u914D\\u7F6E\\u6210\\u529F\"),t.callback&&t.callback(r),s();return}}}catch(l){fe.Error(`${l}`)}finally{i.Close(),a.value=!1}});return(i,l)=>{const u=ht(\"app-action\");return C(),Fe(u,null,{default:Ue(()=>[d(\"form\",{class:\"action-container form-container1\",onSubmit:ls(o,[\"prevent\"])},[Vm,d(\"div\",jm,[Gm,zm,d(\"div\",Km,[d(\"div\",qm,[d(\"label\",Jm,[Xe(d(\"input\",{type:\"radio\",value:\"ali\",\"onUpdate:modelValue\":l[0]||(l[0]=c=>r.serviceName=c)},null,512),[[es,r.serviceName,void 0,{trim:!0}]]),Et(\"\\u963F\\u91CC\\u4E91 \")]),d(\"label\",Xm,[Xe(d(\"input\",{type:\"radio\",value:\"dnspod\",\"onUpdate:modelValue\":l[1]||(l[1]=c=>r.serviceName=c)},null,512),[[es,r.serviceName,void 0,{trim:!0}]]),Et(\"Dnspod \")]),d(\"label\",Zm,[Xe(d(\"input\",{type:\"radio\",value:\"oray\",\"onUpdate:modelValue\":l[2]||(l[2]=c=>r.serviceName=c)},null,512),[[es,r.serviceName,void 0,{trim:!0}]]),Et(\"\\u82B1\\u751F\\u58F3 \")])])]),d(\"div\",Qm,[d(\"p\",null,[Et(\" \\u4E3A\\u62E5\\u6709\\u52A8\\u6001IP\\u7684\\u4E3B\\u673A\\u914D\\u7F6E\\u4E00\\u4E2A\\u56FA\\u5B9A\\u7684\\u53EF\\u8BBF\\u95EE\\u57DF\\u540D \"),r.serviceName==\"ali\"?(C(),N(\"a\",e5,\"\\u67E5\\u770B\\u6559\\u7A0B\")):pe(\"\",!0),r.serviceName==\"dnspod\"?(C(),N(\"a\",t5,\"\\u67E5\\u770B\\u6559\\u7A0B\")):pe(\"\",!0),r.serviceName==\"oray\"?(C(),N(\"a\",n5,\"\\u67E5\\u770B\\u6559\\u7A0B\")):pe(\"\",!0)])]),s5,r5,d(\"div\",a5,[Xe(d(\"input\",{type:\"text\",placeholder:\"myhost.example.com\",required:\"\",\"onUpdate:modelValue\":l[3]||(l[3]=c=>r.domain=c)},null,512),[[nn,r.domain,void 0,{trim:!0}]])]),o5,d(\"div\",i5,[Xe(d(\"input\",{type:\"text\",placeholder:\"\\u8BF7\\u8F93\\u5165\\u7528\\u6237\\u540D\",required:\"\",\"onUpdate:modelValue\":l[4]||(l[4]=c=>r.userName=c)},null,512),[[nn,r.userName,void 0,{trim:!0}]])]),l5,d(\"div\",u5,[Xe(d(\"input\",{type:\"password\",placeholder:\"\\u8BF7\\u8F93\\u5165\\u5BC6\\u7801\",required:\"\",\"onUpdate:modelValue\":l[5]||(l[5]=c=>r.password=c)},null,512),[[nn,r.password,void 0,{trim:!0}]])])]),d(\"div\",c5,[d5,d(\"button\",{class:\"app-close\",type:\"button\",onClick:l[6]||(l[6]=c=>s()),disabled:a.value},\" \\u5173\\u95ED\",8,f5),d(\"button\",{class:\"app-next\",disabled:a.value},\"\\u4FDD\\u5B58\",8,h5)])],40,Wm)]),_:1})}}});var p5=he(_5,[[\"__scopeId\",\"data-v-840edaba\"]]);const m5=d(\"div\",{class:\"action-container_header\"},[d(\"span\",{class:\"title\"},\"DDNSTO\\u914D\\u7F6E\")],-1),g5={class:\"action-container_body setup-install message\"},v5={class:\"action-container_footer\"},y5=d(\"div\",{class:\"auto\"},null,-1),b5=[\"disabled\"],E5=[\"disabled\"],k5=ue({__name:\"install\",props:{onSetup:{type:Function,required:!0}},setup(e){const t=e,n=wt({ok:!1,name:\"app-meta-ddnsto\",message:\"\\u68C0\\u6D4B\\u4E2D...\",clear:()=>{t.onSetup(\"close\")},next:()=>te(this,null,function*(){(yield a())?t.onSetup(\"login\"):fe.Error(\"\\u5B89\\u88C5\\u5931\\u8D25\")})}),s=le(!1),r=()=>te(this,null,function*(){s.value=!0;try{const o=yield oe.App.Check.POST({name:n.name});if(o!=null&&o.data){const{result:i,error:l}=o.data;if(l)throw l;i&&(i.status==\"installed\"&&t.onSetup(\"login\"),i.status==\"uninstalled\"&&(n.message='\\u9700\\u8981\\u5B89\\u88C5DDNSTO\\u63D2\\u4EF6\\uFF0C\\u70B9\\u51FB \"\\u5B89\\u88C5\" \\u5F00\\u59CB\\u5B89\\u88C5'))}}catch(o){n.message=`${o}`}finally{s.value=!1,n.ok=!0}}),a=()=>te(this,null,function*(){const o=n.name;try{yield oe.App.Install.POST({name:o})}catch(i){console.log(i)}return new Promise((i,l)=>te(this,null,function*(){let u=0;const c=setInterval(()=>te(this,null,function*(){if(u>10){clearInterval(c),l(!1);return}const _=yield oe.App.Check.POST({name:o});if(_!=null&&_.data){const{result:p}=_.data;if((p==null?void 0:p.status)==\"installed\"){clearInterval(c),i(!0);return}}u++}),3e3)}))});return r(),(o,i)=>(C(),N(\"form\",{class:\"action-container form-container1\",onSubmit:i[1]||(i[1]=ls((...l)=>n.next&&n.next(...l),[\"prevent\"]))},[m5,d(\"div\",g5,X(n.message),1),d(\"div\",v5,[y5,d(\"button\",{class:\"app-close\",type:\"button\",onClick:i[0]||(i[0]=(...l)=>n.clear&&n.clear(...l)),disabled:s.value},\" \\u5173\\u95ED\",8,b5),n.ok?(C(),N(\"button\",{key:0,class:\"app-next\",disabled:s.value},\"\\u5B89\\u88C5\",8,E5)):pe(\"\",!0)])],32))}});const vl=e=>(nt(\"data-v-17e3ba10\"),e=e(),st(),e),w5=[\"onSubmit\"],S5=vl(()=>d(\"div\",{class:\"action-container_header\"},[d(\"span\",{class:\"title\"},\"DDNSTO\\u767B\\u5F55\")],-1)),C5=vl(()=>d(\"div\",{class:\"action-container_body\"},[d(\"iframe\",{src:\"https://www.kooldns.cn/bind/#/auth?send=1&source=openwrt&callback=*\"})],-1)),T5=vl(()=>d(\"div\",{class:\"auto\"},null,-1)),F5=ue({__name:\"login\",props:{onSetup:{type:Function,required:!0},updateLoginConfig:{type:Function,required:!0}},setup(e){const t=e,n=()=>{t.onSetup(\"close\")},s=()=>{t.onSetup(\"run\")},r=a=>{if(a.data.auth==\"ddnsto\"){const{sign:o,token:i}=a.data;if(o&&i){removeEventListener(\"message\",r),t.updateLoginConfig(o,i),s();return}}fe.Error(\"\\u8BA4\\u8BC1\\u5931\\u8D25\")};return is(()=>{window.addEventListener(\"message\",r)}),rr(()=>{removeEventListener(\"message\",r)}),(a,o)=>(C(),N(\"form\",{class:\"action-container form-container1\",onSubmit:ls(()=>{},[\"prevent\"])},[S5,C5,d(\"div\",{class:\"action-container_footer\"},[T5,d(\"button\",{class:\"app-close\",type:\"button\",onClick:n},\" \\u5173\\u95ED\")])],40,w5))}});var D5=he(F5,[[\"__scopeId\",\"data-v-17e3ba10\"]]);const O5=[\"onSubmit\"],P5=d(\"div\",{class:\"action-container_header\"},[d(\"span\",{class:\"title\"},\"\\u68C0\\u67E5\\u8FD0\\u884C\")],-1),N5={class:\"action-container_body setup-install message\"},I5=ue({__name:\"run\",props:{onSetup:{type:Function,required:!0},token:{type:String,required:!0},updateLocalConfig:{type:Function,required:!0}},setup(e){const t=e,n=le(\"\\u6B63\\u5728\\u68C0\\u6D4B\\u63D2\\u4EF6\\u662F\\u5426\\u5DF2\\u542F\\u52A8...\");(()=>te(this,null,function*(){var l;try{const u=yield oe.Guide.Ddnsto.POST({token:t.token});u!=null&&u.data&&(u.data.error&&(n.value=u.data.error),(((l=u==null?void 0:u.data)==null?void 0:l.success)||0)==0&&a())}catch(u){n.value=u}}))();const r=le(),a=()=>te(this,null,function*(){if((yield o())===!0){i();return}r.value=setInterval(()=>te(this,null,function*(){(yield o())===!0&&(clearInterval(r.value),i())}),2e3)}),o=()=>te(this,null,function*(){return new Promise(l=>te(this,null,function*(){try{const u=yield oe.App.Check.POST({name:\"ddnsto\",checkRunning:!0});if(u!=null&&u.data){u.data.error&&(n.value=u.data.error);const c=u.data.result;if((c==null?void 0:c.status)==\"running\"){l(!0);return}}l(!1)}catch(u){n.value=u,l(!1)}}))}),i=()=>te(this,null,function*(){try{const l=yield oe.Guide.Ddnsto.Config.GET();if(l!=null&&l.data){const{success:u,error:c,result:_}=l.data;c&&(n.value=c),(u||0)==0&&_&&(t.updateLocalConfig(_.netAddr,_.deviceId),t.onSetup(\"bind\"))}}catch(l){n.value=l}});return rr(()=>{r.value&&clearInterval(r.value)}),(l,u)=>(C(),N(\"form\",{class:\"action-container form-container1\",onSubmit:ls(()=>{},[\"prevent\"])},[P5,d(\"div\",N5,X(n.value),1)],40,O5))}});const A5=e=>(nt(\"data-v-394e5818\"),e=e(),st(),e),L5=[\"onSubmit\"],M5=A5(()=>d(\"div\",{class:\"action-container_header\"},[d(\"span\",{class:\"title\"},\"DDNSTO\\u57DF\\u540D\\u914D\\u7F6E\\u5411\\u5BFC\")],-1)),x5={class:\"action-container_body\"},$5=[\"src\"],R5=ue({__name:\"bind\",props:{onSetup:{type:Function,required:!0},config:{type:Object,required:!0}},setup(e){const t=e,n=be(()=>{const{domain:a,token:o,sign:i,routerId:l,netaddr:u}=t.config,c=encodeURIComponent(a),_=encodeURIComponent(u);return`https://www.kooldns.cn/bind/#/domain?domain=${c}&sign=${i}&token=${o}&routerId=${l}&netaddr=${_}`}),s=a=>{if(a.data){const{auth:o,url:i}=a.data;o===\"ddnsto\"&&i&&(r(i),removeEventListener(\"message\",s))}},r=a=>te(this,null,function*(){try{const o=yield oe.Guide.Ddnsto.Address.POST({address:a});if(o!=null&&o.data){const{success:i,error:l}=o.data;if(l)throw l;(i||0)==0&&(fe.Success(\"\\u914D\\u7F6E\\u5B8C\\u6210\"),t.onSetup(\"close\"))}}catch(o){fe.Error(`${o}`)}});return is(()=>{window.addEventListener(\"message\",s)}),rr(()=>{removeEventListener(\"message\",s)}),(a,o)=>(C(),N(\"form\",{class:\"action-container form-container1\",onSubmit:ls(()=>{},[\"prevent\"])},[M5,d(\"div\",x5,[d(\"iframe\",{src:n.value},null,8,$5)])],40,L5))}});var B5=he(R5,[[\"__scopeId\",\"data-v-394e5818\"]]);const U5=ue({__name:\"index\",props:{domain:{type:String,required:!0},callback:{type:Function}},setup(e){const t=e,n=Ht(),s=()=>{n&&n.appContext.config.globalProperties.$close()},r=wt({sign:\"\",token:\"\",netAddr:\"\",routerId:\"\",domain:t.domain}),a=(u,c)=>{r.sign=u,r.token=c},o=(u,c)=>{r.netAddr=u,r.routerId=c},i=le(\"install\"),l=u=>{switch(u){case\"install\":case\"login\":case\"bind\":case\"run\":i.value=u;break;case\"close\":s();break}};return(u,c)=>{const _=ht(\"app-action\");return C(),Fe(_,null,{default:Ue(()=>[i.value==\"install\"?(C(),Fe(k5,{key:0,onSetup:l})):i.value==\"login\"?(C(),Fe(D5,{key:1,onSetup:l,updateLoginConfig:a})):i.value==\"run\"?(C(),Fe(I5,{key:2,onSetup:l,token:r.token,updateLocalConfig:o},null,8,[\"token\"])):i.value==\"bind\"?(C(),Fe(B5,{key:3,onSetup:l,config:{token:r.token,sign:r.sign,domain:r.domain,netaddr:r.netAddr,routerId:r.routerId}},null,8,[\"config\"])):pe(\"\",!0)]),_:1})}}});var Y5=he(U5,[[\"__scopeId\",\"data-v-83f0ed5a\"]]);const uo=e=>(nt(\"data-v-6d7a2f13\"),e=e(),st(),e),H5={class:\"action-container form-container1\"},W5=uo(()=>d(\"div\",{class:\"action-container_header\"},[d(\"span\",{class:\"title\"},\"\\u683C\\u5F0F\\u5316\")],-1)),V5={key:0,class:\"confirm\"},j5=uo(()=>d(\"div\",null,[d(\"svg\",{width:\"71\",height:\"62\",viewBox:\"0 0 71 62\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},[d(\"path\",{d:\"M69.666 58.2041L37.166 1.26531C36.6817 0.419133 35.8457 0 35.002 0C34.1582 0 33.3145 0.419133 32.8379 1.26531L0.337917 58.2041C-0.62302 59.8964 0.580104 62 2.50198 62H67.502C69.4238 62 70.627 59.8964 69.666 58.2041ZM32.502 23.4082C32.502 23.0602 32.7832 22.7755 33.127 22.7755H36.877C37.2207 22.7755 37.502 23.0602 37.502 23.4082V37.9592C37.502 38.3071 37.2207 38.5918 36.877 38.5918H33.127C32.7832 38.5918 32.502 38.3071 32.502 37.9592V23.4082ZM35.002 51.2449C34.0207 51.2246 33.0863 50.8158 32.3994 50.1061C31.7125 49.3965 31.3277 48.4425 31.3277 47.449C31.3277 46.4554 31.7125 45.5015 32.3994 44.7918C33.0863 44.0822 34.0207 43.6733 35.002 43.6531C35.9833 43.6733 36.9176 44.0822 37.6046 44.7918C38.2915 45.5015 38.6762 46.4554 38.6762 47.449C38.6762 48.4425 38.2915 49.3965 37.6046 50.1061C36.9176 50.8158 35.9833 51.2246 35.002 51.2449Z\",fill:\"#FFC53D\"})]),d(\"span\",null,\"\\u786E\\u5B9A\\u8981\\u683C\\u5F0F\\u5316\\uFF1F\"),d(\"div\",null,[d(\"span\",null,\"\\u683C\\u5F0F\\u5316\\u4F1A\\u6E05\\u7A7A/dev/sda\\u76D8\\u7684\\u6570\\u636E\"),d(\"span\",null,\"\\uFF08\\u683C\\u5F0F\\u5316\\u4E3AEXT4\\u6587\\u4EF6\\u7CFB\\u7EDF\\uFF0C\\u4F20\\u8F93\\u901F\\u5EA6\\u66F4\\u5FEB\\uFF09\")])],-1)),G5=[j5],z5={key:1,class:\"success\"},K5=uo(()=>d(\"div\",null,[d(\"svg\",{width:\"100\",height:\"100\",viewBox:\"0 0 100 100\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},[d(\"path\",{d:\"M50 0C22.3884 0 0 22.3884 0 50C0 77.6116 22.3884 100 50 100C77.6116 100 100 77.6116 100 50C100 22.3884 77.6116 0 50 0ZM71.596 33.6719L48.0915 66.2612C47.763 66.7197 47.3299 67.0933 46.8282 67.351C46.3265 67.6088 45.7705 67.7432 45.2065 67.7432C44.6424 67.7432 44.0865 67.6088 43.5847 67.351C43.083 67.0933 42.6499 66.7197 42.3214 66.2612L28.404 46.9754C27.9799 46.3839 28.404 45.558 29.1295 45.558H34.3638C35.5022 45.558 36.5848 46.1049 37.2545 47.0424L45.2009 58.0692L62.7455 33.7388C63.4152 32.8125 64.4866 32.2545 65.6362 32.2545H70.8705C71.596 32.2545 72.0201 33.0804 71.596 33.6719Z\",fill:\"#52C41A\"})]),d(\"span\",null,\"\\u683C\\u5F0F\\u5316\\u6210\\u529F\")],-1)),q5=[K5],J5={class:\"action-container_footer\"},X5=uo(()=>d(\"div\",{class:\"auto\"},null,-1)),Z5=ue({__name:\"format\",props:{data:{type:Object,required:!0},onClose:{type:Function,required:!0}},setup(e){const t=e,n=wt({formated:!1}),s=()=>te(this,null,function*(){if(n.formated)t.onClose();else{const r=fe.Loading(\"\\u6B63\\u5728\\u683C\\u5F0F\\u5316...\");console.log(\"format\",t.data);try{yield oe.Nas.Disk.Partition.Format.POST(t.data)}catch(a){console.log(a)}n.formated=!0,r.Close()}});return(r,a)=>(C(),N(\"form\",H5,[W5,n.formated===!1?(C(),N(\"div\",V5,G5)):pe(\"\",!0),n.formated?(C(),N(\"div\",z5,q5)):pe(\"\",!0),d(\"div\",J5,[X5,n.formated===!1?(C(),N(\"button\",{key:0,class:\"app-close\",type:\"button\",onClick:a[0]||(a[0]=(...o)=>e.onClose&&e.onClose(...o))},\" \\u53D6\\u6D88 \")):pe(\"\",!0),d(\"button\",{class:\"app-next\",onClick:s},\"\\u786E\\u5B9A\")])]))}});var Q5=he(Z5,[[\"__scopeId\",\"data-v-6d7a2f13\"]]);const e7=ue({__name:\"index\",props:{step:{type:String,required:!0},data:{type:Object,required:!0},callback:{type:Function}},setup(e){const t=e,n=Ht(),s=()=>{n&&n.appContext.config.globalProperties.$close(),t.callback&&t.callback()},r=le(t.step);return(a,o)=>{const i=ht(\"app-action\");return C(),Fe(i,null,{default:Ue(()=>[r.value==\"format\"?(C(),Fe(Q5,{key:0,onClose:s,data:e.data},null,8,[\"data\"])):pe(\"\",!0)]),_:1})}}});var t7=he(e7,[[\"__scopeId\",\"data-v-16aaa3d0\"]]);const co=e=>(nt(\"data-v-4a0aaeb7\"),e=e(),st(),e),n7=[\"onSubmit\"],s7={class:\"action-container_header\"},r7={class:\"title\"},a7={class:\"action-container_body\"},o7=co(()=>d(\"div\",{class:\"label-name\"},[d(\"span\",null,\"\\u7528\\u6237\\u540D\")],-1)),i7={class:\"label-value\"},l7=[\"disabled\"],u7=co(()=>d(\"div\",{class:\"label-name\"},[d(\"span\",null,\"\\u7528\\u6237\\u5BC6\\u7801\")],-1)),c7={class:\"label-value\"},d7=co(()=>d(\"div\",{class:\"label-name\"},[d(\"span\",null,\"\\u5BC6\\u7801\\u786E\\u8BA4\")],-1)),f7={class:\"label-value\"},h7={class:\"action-container_footer\"},_7=co(()=>d(\"div\",{class:\"auto\"},null,-1)),p7=[\"disabled\"],m7=[\"disabled\"],g7=ue({__name:\"user\",props:{user:{type:Object,required:!1},callback:{type:Function}},setup(e){var l,u;const t=e,n=Ht(),s=()=>{n&&n.appContext.config.globalProperties.$close()},r=wt({userName:((l=t.user)==null?void 0:l.userName)||\"\",password:((u=t.user)==null?void 0:u.password)||\"\"}),a=le(\"\"),o=le(!1),i=()=>te(this,null,function*(){var p,y;if(r.password!==a.value)return fe.Warning(\"\\u5BC6\\u7801\\u4E0D\\u4E00\\u81F4\\uFF0C\\u8BF7\\u91CD\\u65B0\\u8F93\\u5165\");o.value=!0;let c;const _=fe.Loading(\"\\u914D\\u7F6E\\u4E2D...\");try{if((p=t.user)!=null&&p.userName?c=yield oe.Share.User.UPDATE({userName:r.userName,password:r.password}):c=yield oe.Share.User.ADD({userName:r.userName,password:r.password}),c!=null&&c.data){const{error:E,scope:k,success:S}=c.data;if(S===-1e3&&E)return fe.Warning(E);if((S||0)==0){fe.Success((y=t.user)!=null&&y.userName?\"\\u7F16\\u8F91\\u6210\\u529F\":\"\\u65B0\\u5EFA\\u6210\\u529F\"),t.callback&&t.callback({userName:r.userName}),s();return}}}catch(E){fe.Error(`${E}`)}finally{_.Close(),o.value=!1}});return(c,_)=>{const p=ht(\"app-action\");return C(),Fe(p,null,{default:Ue(()=>{var y;return[d(\"form\",{class:\"action-container form-container1\",onSubmit:ls(i,[\"prevent\"])},[d(\"div\",s7,[d(\"span\",r7,X((y=t.user)!=null&&y.userName?\"\\u7F16\\u8F91\\u7528\\u6237\":\"\\u65B0\\u5EFA\\u7528\\u6237\"),1)]),d(\"div\",a7,[o7,d(\"div\",i7,[Xe(d(\"input\",{type:\"text\",disabled:t.user!==void 0,placeholder:\"\\u8BF7\\u8F93\\u5165\\u7528\\u6237\\u540D\",required:\"\",\"onUpdate:modelValue\":_[0]||(_[0]=E=>r.userName=E)},null,8,l7),[[nn,r.userName,void 0,{trim:!0}]])]),u7,d(\"div\",c7,[Xe(d(\"input\",{type:\"password\",placeholder:\"\\u8BF7\\u8F93\\u5165\\u5BC6\\u7801\",required:\"\",\"onUpdate:modelValue\":_[1]||(_[1]=E=>r.password=E)},null,512),[[nn,r.password,void 0,{trim:!0}]])]),d7,d(\"div\",f7,[Xe(d(\"input\",{type:\"password\",placeholder:\"\\u8BF7\\u8F93\\u5165\\u5BC6\\u7801\",required:\"\",\"onUpdate:modelValue\":_[2]||(_[2]=E=>a.value=E)},null,512),[[nn,a.value,void 0,{trim:!0}]])])]),d(\"div\",h7,[_7,d(\"button\",{class:\"app-close\",type:\"button\",onClick:_[3]||(_[3]=E=>s()),disabled:o.value},\" \\u5173\\u95ED \",8,p7),d(\"button\",{class:\"app-next\",disabled:o.value},\"\\u4FDD\\u5B58\",8,m7)])],40,n7)]}),_:1})}}});var v7=he(g7,[[\"__scopeId\",\"data-v-4a0aaeb7\"]]);let y7=0;const ta=(e,t)=>{const n=y7++,s=uf();if(s.addValue(n))return;const r=document.createElement(\"div\");document.body.appendChild(r);const a=Wi(e,t);a.use(p6),s.index=n,a.config.globalProperties.key=n,a.config.globalProperties.$close=()=>{o()};const o=()=>{a.unmount(),r.remove(),s.delValue(n)};return a.use(L6),a.mount(r),s.setValue(n,a),{Close:o}},oc=e=>ta(B6,e),Pw=e=>ta(p5,e),Nw=e=>ta(Y5,e),Iw=e=>ta(t7,e),Aw=e=>ta(v7,e),s1=(e,t)=>{window.taskd.show_log(e,t)},r1=e=>{window.taskd.show_log(e,!1)},a1=e=>{window.taskd.remove(e)},b7={Open:()=>s1(\"istore\",!0),Close:()=>r1(\"istore\"),Remove:()=>a1(\"istore\")},E7={Open:()=>s1(\"auto_setup\",!1),Close:()=>r1(\"auto_setup\"),Remove:()=>a1(\"auto_setup\")};var Ms={istore:b7,autoSetup:E7};const k7=af,Zt=`${location.protocol}//${location.hostname}`,ic=new Map([[\"aria2\",()=>{window.open(\"/ariang/\",\"_blank\")}],[\"transmission\",()=>{const e=`${Zt}:9091/transmission/web/`;window.open(e,\"_blank\")}],[\"jellyfin\",()=>{const e=`${Zt}:8096/web/index.html`;window.open(e,\"_blank\")}],[\"linkease\",()=>{const e=`${Zt}:8897/web/index.html`;window.open(e,\"_blank\")}],[\"wxedge\",()=>{const e=`${Zt}:18888`;window.open(e,\"_blank\")}],[\"kodexplorer\",()=>{const e=`${Zt}:8081`;window.open(e,\"_blank\")}],[\"homeassistant\",()=>{const e=`${Zt}:8123`;window.open(e,\"_blank\")}],[\"gowebdav\",()=>{const e=`${Zt}:6086`;window.open(e,\"_blank\")}],[\"heimdall\",()=>{const e=`${Zt}:8088`;window.open(e,\"_blank\")}],[\"alist\",()=>{const e=`${Zt}:5244`;window.open(e,\"_blank\")}],[\"nastools\",()=>{const e=`${Zt}:3003`;window.open(e,\"_blank\")}],[\"qbittorrent\",()=>{const e=`${Zt}:8080`;window.open(e,\"_blank\")}]]),ur=or(\"system\",{state:()=>({keys:Math.round(Math.random()*100),reloadCount:0,cpu:{usage:0,temperature:0},memery:{total:\"\",available:\"\",availablePercentage:0},network:{defaultInterface:\"\",internetConnected:!1,networkInfo:\"\",proto:\"\",ipv4addr:\"\",ipv6addr:\"\",gateway:\"\",dnsList:[],dnsProto:\"\",uptime:\"\",uptimeStamp:0,dnsReady:!1},device:{devices:[]},version:{kernelVersion:\"\",firmwareVersion:\"\"},time:{uptime:0,uptimeHuman:\"\",localtime:\"\"},updown:{up:0,download:0},disk:{count:-1,disks:[],rootDisks:[],mountedDisks:[],errorDisks:[]},raid:{disks:[]},toips:[],nasStatus:{linkease:!1,sambas:[],webdav:{shareName:\"\",sharePath:\"\"}},localtime:0}),getters:{getAsyncNetworkProto(){return te(this,null,function*(){return new Promise((e,t)=>{if(this.network.proto&&this.network.proto!=\"\"){e(this.network.proto);return}const n=setInterval(()=>{if(this.network.proto&&this.network.proto!=\"\"){clearInterval(n),e(this.network.proto);return}},100)})})}},actions:{getSystemData(){return te(this,null,function*(){const e={cpu:{usage:0,temperature:0},memery:{total:\"\",available:\"\",availablePercentage:0}};try{const t=yield oe.System.CPU.Status.GET();if(t.data){const{success:n,error:s,scope:r,detail:a,result:o}=t.data;o&&o.usage!=null&&(e.cpu.usage=o.usage)}}catch(t){console.error(t)}try{const t=yield oe.System.CPU.Temperature.GET();if(t.data){const{success:n,error:s,scope:r,detail:a,result:o}=t.data;o&&o.temperature!=null&&(e.cpu.temperature=o.temperature)}}catch(t){console.error(t)}try{const t=yield oe.System.Memery.Status.GET();if(t.data){const{success:n,error:s,scope:r,detail:a,result:o}=t.data;if(o){const{available:i,availablePercentage:l,total:u}=o;i!=null&&(e.memery.available=i),l!=null&&(e.memery.availablePercentage=l),u!=null&&(e.memery.total=u)}}}catch(t){console.error(t)}return e})},getUpDown(){return te(this,null,function*(){try{let e=0,t=0,n=0,s=0;const r=yield ec();r&&(e=r.up||0,t=r.down||0);const a=yield new Promise((l,u)=>{setTimeout(()=>{const c=ec();l(c)},1e3)});a&&(n=a.up||0,s=a.down||0);const o=n-e,i=s-t;o>=0&&i>=0?(this.updown.up=o,this.updown.download=i):(this.updown.up=0,this.updown.download=0)}catch(e){}})},getDevice(){return te(this,null,function*(){oe.Network.Device.List.GET().then(e=>{if(e!=null&&e.data){const{result:t}=e==null?void 0:e.data;this.device.devices=(t==null?void 0:t.devices)||[]}})})},getNetwork(){return te(this,null,function*(){oe.Network.Status.GET().then(e=>{if(e!=null&&e.data){const{result:t}=e==null?void 0:e.data;t&&(this.network.internetConnected=t.internetConnected,this.network.defaultInterface=t.defaultInterface,this.network.networkInfo=t.networkInfo,this.network.proto=t.proto,this.network.ipv4addr=t.ipv4addr,this.network.ipv6addr=t.ipv6addr,this.network.gateway=t.gateway,this.network.dnsList=t.dnsList,this.network.dnsProto=t.dnsProto,this.network.uptime=t.uptime,this.network.uptimeStamp=t.uptimeStamp,this.network.dnsReady=t.dnsReady,this.network.internetConnected=t.internetConnected)}})})},getVersion(){return te(this,null,function*(){oe.System.Version.GET().then(e=>{const{result:t}=e.data;t&&(this.version.firmwareVersion=t.firmwareVersion||\"\",this.version.kernelVersion=t.kernelVersion||\"\")})})},getTime(){return te(this,null,function*(){oe.System.Time.GET().then(e=>{const{result:t}=e.data;t&&(this.time.localtime=t.localtime||\"\",this.time.uptime=t.uptime||0,this.time.uptimeHuman=t.uptimeHuman||\"\",this.localtime=Date.parse(this.time.localtime+\" GMT +0\"),setInterval(()=>{this.localtime+=1e3},1e3))})})},getDisks(){return te(this,null,function*(){try{const e=yield oe.Nas.Disk.Status.GET();if(e.data){const{result:t}=e.data,n=(t==null?void 0:t.disks)||[];this.disk.disks=n,this.disk.rootDisks=[],this.disk.errorDisks=[],this.disk.mountedDisks=[];const s=n.length,r=this.disk.count;r>=0&&s>0&&s>r&&this.addToips({info:\"\\u68C0\\u6D4B\\u5230\\u65B0\\u78C1\\u76D8\\u63D2\\u5165\",path:\"/disk\"}),this.disk.count=s,n.forEach(a=>{a.isSystemRoot?this.disk.rootDisks.push(a):a.errorInfo?this.disk.errorDisks.push(a):this.disk.mountedDisks.push(a)})}}catch(e){console.log(e)}})},getRaid(){return te(this,null,function*(){try{const e=yield oe.Raid.List.GET();if(e!=null&&e.data){const{success:t,error:n,result:s}=e.data;if(s&&(this.raid.disks=s.disks||[]),n)throw n}}catch(e){console.log(e)}})},initData(){return te(this,null,function*(){this.getDevice(),this.getNetwork(),this.getVersion(),this.getTime(),this.getUpDown(),this.getDisks(),this.getRaid(),setInterval(()=>{this.network.uptimeStamp&&this.network.uptimeStamp++,this.time.uptime&&this.time.uptime++},1e3)})},addToips(e){return te(this,null,function*(){const t=r=>{this.toips.forEach((a,o)=>{if(a.key==r){this.toips.splice(o,1);return}})},n=this.toips.length,s={key:n,info:e.info,path:e.path,f:()=>{e.f&&e.f(),t(n)}};this.toips.push(s),setTimeout(()=>{t(n)},5e3)})},reload(){return te(this,null,function*(){this.reloadCount++})},incr(){return te(this,null,function*(){this.keys++})}}}),o1=or(\"app\",{state:()=>({ok:!1,localApps:[],remoteApps:[],installAppList:{},removeAppList:{},tags:[],appsExpand:{}}),actions:{getApp(){return te(this,null,function*(){if(!this.ok){try{yield Promise.all([this.getLocalApp(),this.getRemoteApp(),this.getAppTags()])}catch(e){console.log(e)}finally{this.ok=!0}this.getAppData()}})},getAppTags(){return te(this,null,function*(){var t;const e=yield oe.ApiStore.tags.GET();(t=e.data.result)!=null&&t.tags&&(this.tags=e.data.result.tags)})},getLocalApp(){return te(this,null,function*(){var e,t;try{let n;const s=yield oe.System.Version.GET(),r=((e=s.data.result)==null?void 0:e.quickstart)&&((t=s.data.result)==null?void 0:t.quickstart.split(\".\"));if(r&&Number(r[0])===0&&Number(r[1])<7&&Number(r[2])<21?n=yield oe.Store.installed.GET():n=yield oe.Store.installedList.GET(),n&&n.data){const a=n.data||[];for(let o=0;o<a.length;o++)this.installAppList[a[o].name]=a[o],a[o].getFormatDate=()=>it.formatDate(a[o].time*1e3)||\"\",a[o].getIcon=()=>`/luci-static/resources/app-icons/${a[o].name}.png`,a[o].openApp=()=>{oc({title:a[o].name,src:a[o].entry})},a[o].isInstall=()=>!0,a[o].uninstall=()=>te(this,null,function*(){const i=a[o].name;if(confirm(`are you sure you want to uninstall ${i}?`))try{const u=yield oe.Store.remove.POST(a[o].name);if(u.data.code===0&&Ms.istore.Open(),u.data.stderr)throw u.data.stderr}catch(u){fe.Error(`${u}`)}}),a[o].update=()=>te(this,null,function*(){const i=a[o].name;try{const l=yield oe.Store.upgrade.POST(i);if(l.data&&(l.data.code===0&&Ms.istore.Open(),l.data.stderr))throw l.data.stderr}catch(l){fe.Error(`${l}`)}}),a[o].isUpdate=()=>{if(a[o].isInstall()){const i=this.removeAppList[a[o].name],l=this.installAppList[a[o].name];return(i==null?void 0:i.version)!=(l==null?void 0:l.version)}return!1},a[o].isWebUrl=()=>ic.has(a[o].name),a[o].openWebUrl=()=>{const i=ic.get(a[o].name);i&&i()};this.localApps=a}}catch(n){console.log(n)}})},getRemoteApp(){return te(this,null,function*(){try{const e=yield oe.ApiStore.list.GET();if(e.data){const{result:t}=e.data;if(t){const{total:n,apps:s}=t;for(let r=0;r<s.length;r++)s[r].getFormatDate=()=>it.formatDate(s[r].time*1e3)||\"\",s[r].getIcon=()=>oe.ApiStore.getStoreAppIcon(s[r].icon),s[r].openApp=()=>{oc({title:s[r].name,src:s[r].entry})},s[r].isInstall=()=>!!this.installAppList[s[r].name],s[r].install=()=>te(this,null,function*(){try{const a=yield oe.Store.install.POST(s[r].name);if(a.data.code===0&&Ms.istore.Open(),a.data.stderr)throw a.data.stderr}catch(a){fe.Error(`${a}`)}}),s[r].uninstall=()=>te(this,null,function*(){const a=s[r].name,o=s[r].title;if(confirm(`are you sure you want to uninstall ${o}?`))try{const l=yield oe.Store.remove.POST(a);if(l.data.code===0&&Ms.istore.Open(),l.data.stderr)throw l.data.stderr}catch(l){fe.Error(`${l}`)}}),s[r].update=()=>te(this,null,function*(){const a=s[r].name;try{const o=yield oe.Store.upgrade.POST(a);if(o.data&&(o.data.code===0&&Ms.istore.Open(),o.data.stderr))throw o.data.stderr}catch(o){fe.Error(`${o}`)}}),s[r].isUpdate=()=>{if(s[r].isInstall()){const a=this.removeAppList[s[r].name],o=this.installAppList[s[r].name];return(a==null?void 0:a.version)!=(o==null?void 0:o.version)}return!1},this.removeAppList[s[r].name]=s[r];this.remoteApps=s}}}catch(e){console.log(e)}})},getAppData(){return te(this,null,function*(){const e=[];for(const t in this.removeAppList)e.push(t);try{const t=yield oe.ApiStore.expand.POST({appsId:e,deviceId:it.getDeviceId()});if(t.data){const{result:n}=t.data;if(n){this.appsExpand=n;let s=[];for(let r of this.remoteApps)n[r.name]&&s.push(gt(gt({},n[r.name]),r)),this.remoteApps=s}}}catch(t){console.log(t)}})}}}),Lw=or(\"network\",{state:()=>({status:{},statistics:{},deviceList:{}}),getters:{},actions:{updateNetworkStatus(e){this.status=e},requestNetworkStatistics(){return te(this,null,function*(){try{const e=yield oe.Network.Statistics.GET();e!=null&&e.data&&e.data.result&&(this.statistics=e.data.result)}catch(e){console.log(e)}})},requestDeviceList(){oe.Network.Device.List.GET().then(e=>{if(e!=null&&e.data){const{result:t}=e==null?void 0:e.data;t&&(this.deviceList=t)}})},incrTime(){this.status.uptimeStamp&&this.status.uptimeStamp++}}}),w7=or(\"system\",{state:()=>({version:{},checkUpdate:null,systemStatus:{}}),getters:{},actions:{incrTime(){var e;(e=this.systemStatus)!=null&&e.uptime&&this.systemStatus.uptime++},requestVersion(){oe.System.Version.GET().then(e=>{var t;(t=e==null?void 0:e.data)!=null&&t.result&&(this.version=e.data.result)})},requestCheckUpdate(){oe.System.CheckUpdate.GET().then(e=>{var t;(t=e==null?void 0:e.data)!=null&&t.result&&(this.checkUpdate=e.data.result)})},updateSystemStatus(e){this.systemStatus=e}}}),Mw=or(\"interfacer\",{state:()=>({portitemStyle:{show:!1,left:0,top:0,portitem:{name:\"\",macAddress:\"\",linkSpeed:\"\",linkState:\"\",rx_packets:\"\",tx_packets:\"\",interfaceNames:[],master:\"\",duplex:\"\"}}})}),fa=[],S7=()=>te(void 0,null,function*(){fa.length>0&&(fa.forEach(t=>{clearInterval(t)}),fa.splice(0,fa.length));const e=ur();w7(),e.getDevice(),e.getNetwork(),e.getVersion(),e.getTime(),e.getUpDown(),e.getDisks(),e.getRaid()});/*!\n  * vue-router v4.2.4\n  * (c) 2023 Eduardo San Martin Morote\n  * @license MIT\n  */const xs=typeof window!=\"undefined\";function C7(e){return e.__esModule||e[Symbol.toStringTag]===\"Module\"}const $e=Object.assign;function Oo(e,t){const n={};for(const s in t){const r=t[s];n[s]=ln(r)?r.map(e):e(r)}return n}const Pr=()=>{},ln=Array.isArray,T7=/\\/$/,F7=e=>e.replace(T7,\"\");function Po(e,t,n=\"/\"){let s,r={},a=\"\",o=\"\";const i=t.indexOf(\"#\");let l=t.indexOf(\"?\");return i<l&&i>=0&&(l=-1),l>-1&&(s=t.slice(0,l),a=t.slice(l+1,i>-1?i:t.length),r=e(a)),i>-1&&(s=s||t.slice(0,i),o=t.slice(i,t.length)),s=N7(s!=null?s:t,n),{fullPath:s+(a&&\"?\")+a+o,path:s,query:r,hash:o}}function D7(e,t){const n=t.query?e(t.query):\"\";return t.path+(n&&\"?\")+n+(t.hash||\"\")}function lc(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||\"/\"}function O7(e,t,n){const s=t.matched.length-1,r=n.matched.length-1;return s>-1&&s===r&&Zs(t.matched[s],n.matched[r])&&i1(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function Zs(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function i1(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!P7(e[n],t[n]))return!1;return!0}function P7(e,t){return ln(e)?uc(e,t):ln(t)?uc(t,e):e===t}function uc(e,t){return ln(t)?e.length===t.length&&e.every((n,s)=>n===t[s]):e.length===1&&e[0]===t}function N7(e,t){if(e.startsWith(\"/\"))return e;if(!e)return t;const n=t.split(\"/\"),s=e.split(\"/\"),r=s[s.length-1];(r===\"..\"||r===\".\")&&s.push(\"\");let a=n.length-1,o,i;for(o=0;o<s.length;o++)if(i=s[o],i!==\".\")if(i===\"..\")a>1&&a--;else break;return n.slice(0,a).join(\"/\")+\"/\"+s.slice(o-(o===s.length?1:0)).join(\"/\")}var Gr;(function(e){e.pop=\"pop\",e.push=\"push\"})(Gr||(Gr={}));var Nr;(function(e){e.back=\"back\",e.forward=\"forward\",e.unknown=\"\"})(Nr||(Nr={}));function I7(e){if(!e)if(xs){const t=document.querySelector(\"base\");e=t&&t.getAttribute(\"href\")||\"/\",e=e.replace(/^\\w+:\\/\\/[^\\/]+/,\"\")}else e=\"/\";return e[0]!==\"/\"&&e[0]!==\"#\"&&(e=\"/\"+e),F7(e)}const A7=/^[^#]+#/;function L7(e,t){return e.replace(A7,\"#\")+t}function M7(e,t){const n=document.documentElement.getBoundingClientRect(),s=e.getBoundingClientRect();return{behavior:t.behavior,left:s.left-n.left-(t.left||0),top:s.top-n.top-(t.top||0)}}const fo=()=>({left:window.pageXOffset,top:window.pageYOffset});function x7(e){let t;if(\"el\"in e){const n=e.el,s=typeof n==\"string\"&&n.startsWith(\"#\"),r=typeof n==\"string\"?s?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!r)return;t=M7(r,e)}else t=e;\"scrollBehavior\"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function cc(e,t){return(history.state?history.state.position-t:-1)+e}const _i=new Map;function $7(e,t){_i.set(e,t)}function R7(e){const t=_i.get(e);return _i.delete(e),t}let B7=()=>location.protocol+\"//\"+location.host;function l1(e,t){const{pathname:n,search:s,hash:r}=t,a=e.indexOf(\"#\");if(a>-1){let i=r.includes(e.slice(a))?e.slice(a).length:1,l=r.slice(i);return l[0]!==\"/\"&&(l=\"/\"+l),lc(l,\"\")}return lc(n,e)+s+r}function U7(e,t,n,s){let r=[],a=[],o=null;const i=({state:p})=>{const y=l1(e,location),E=n.value,k=t.value;let S=0;if(p){if(n.value=y,t.value=p,o&&o===E){o=null;return}S=k?p.position-k.position:0}else s(y);r.forEach(m=>{m(n.value,E,{delta:S,type:Gr.pop,direction:S?S>0?Nr.forward:Nr.back:Nr.unknown})})};function l(){o=n.value}function u(p){r.push(p);const y=()=>{const E=r.indexOf(p);E>-1&&r.splice(E,1)};return a.push(y),y}function c(){const{history:p}=window;!p.state||p.replaceState($e({},p.state,{scroll:fo()}),\"\")}function _(){for(const p of a)p();a=[],window.removeEventListener(\"popstate\",i),window.removeEventListener(\"beforeunload\",c)}return window.addEventListener(\"popstate\",i),window.addEventListener(\"beforeunload\",c,{passive:!0}),{pauseListeners:l,listen:u,destroy:_}}function dc(e,t,n,s=!1,r=!1){return{back:e,current:t,forward:n,replaced:s,position:window.history.length,scroll:r?fo():null}}function Y7(e){const{history:t,location:n}=window,s={value:l1(e,n)},r={value:t.state};r.value||a(s.value,{back:null,current:s.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function a(l,u,c){const _=e.indexOf(\"#\"),p=_>-1?(n.host&&document.querySelector(\"base\")?e:e.slice(_))+l:B7()+e+l;try{t[c?\"replaceState\":\"pushState\"](u,\"\",p),r.value=u}catch(y){console.error(y),n[c?\"replace\":\"assign\"](p)}}function o(l,u){const c=$e({},t.state,dc(r.value.back,l,r.value.forward,!0),u,{position:r.value.position});a(l,c,!0),s.value=l}function i(l,u){const c=$e({},r.value,t.state,{forward:l,scroll:fo()});a(c.current,c,!0);const _=$e({},dc(s.value,l,null),{position:c.position+1},u);a(l,_,!1),s.value=l}return{location:s,state:r,push:i,replace:o}}function u1(e){e=I7(e);const t=Y7(e),n=U7(e,t.state,t.location,t.replace);function s(a,o=!0){o||n.pauseListeners(),history.go(a)}const r=$e({location:\"\",base:e,go:s,createHref:L7.bind(null,e)},t,n);return Object.defineProperty(r,\"location\",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(r,\"state\",{enumerable:!0,get:()=>t.state.value}),r}function H7(e){return e=location.host?e||location.pathname+location.search:\"\",e.includes(\"#\")||(e+=\"#\"),u1(e)}function W7(e){return typeof e==\"string\"||e&&typeof e==\"object\"}function c1(e){return typeof e==\"string\"||typeof e==\"symbol\"}const Hn={path:\"/\",name:void 0,params:{},query:{},hash:\"\",fullPath:\"/\",matched:[],meta:{},redirectedFrom:void 0},d1=Symbol(\"\");var fc;(function(e){e[e.aborted=4]=\"aborted\",e[e.cancelled=8]=\"cancelled\",e[e.duplicated=16]=\"duplicated\"})(fc||(fc={}));function Qs(e,t){return $e(new Error,{type:e,[d1]:!0},t)}function wn(e,t){return e instanceof Error&&d1 in e&&(t==null||!!(e.type&t))}const hc=\"[^/]+?\",V7={sensitive:!1,strict:!1,start:!0,end:!0},j7=/[.+*?^${}()[\\]/\\\\]/g;function G7(e,t){const n=$e({},V7,t),s=[];let r=n.start?\"^\":\"\";const a=[];for(const u of e){const c=u.length?[]:[90];n.strict&&!u.length&&(r+=\"/\");for(let _=0;_<u.length;_++){const p=u[_];let y=40+(n.sensitive?.25:0);if(p.type===0)_||(r+=\"/\"),r+=p.value.replace(j7,\"\\\\$&\"),y+=40;else if(p.type===1){const{value:E,repeatable:k,optional:S,regexp:m}=p;a.push({name:E,repeatable:k,optional:S});const w=m||hc;if(w!==hc){y+=10;try{new RegExp(`(${w})`)}catch(b){throw new Error(`Invalid custom RegExp for param \"${E}\" (${w}): `+b.message)}}let P=k?`((?:${w})(?:/(?:${w}))*)`:`(${w})`;_||(P=S&&u.length<2?`(?:/${P})`:\"/\"+P),S&&(P+=\"?\"),r+=P,y+=20,S&&(y+=-8),k&&(y+=-20),w===\".*\"&&(y+=-50)}c.push(y)}s.push(c)}if(n.strict&&n.end){const u=s.length-1;s[u][s[u].length-1]+=.7000000000000001}n.strict||(r+=\"/?\"),n.end?r+=\"$\":n.strict&&(r+=\"(?:/|$)\");const o=new RegExp(r,n.sensitive?\"\":\"i\");function i(u){const c=u.match(o),_={};if(!c)return null;for(let p=1;p<c.length;p++){const y=c[p]||\"\",E=a[p-1];_[E.name]=y&&E.repeatable?y.split(\"/\"):y}return _}function l(u){let c=\"\",_=!1;for(const p of e){(!_||!c.endsWith(\"/\"))&&(c+=\"/\"),_=!1;for(const y of p)if(y.type===0)c+=y.value;else if(y.type===1){const{value:E,repeatable:k,optional:S}=y,m=E in u?u[E]:\"\";if(ln(m)&&!k)throw new Error(`Provided param \"${E}\" is an array but it is not repeatable (* or + modifiers)`);const w=ln(m)?m.join(\"/\"):m;if(!w)if(S)p.length<2&&(c.endsWith(\"/\")?c=c.slice(0,-1):_=!0);else throw new Error(`Missing required param \"${E}\"`);c+=w}}return c||\"/\"}return{re:o,score:s,keys:a,parse:i,stringify:l}}function z7(e,t){let n=0;for(;n<e.length&&n<t.length;){const s=t[n]-e[n];if(s)return s;n++}return e.length<t.length?e.length===1&&e[0]===40+40?-1:1:e.length>t.length?t.length===1&&t[0]===40+40?1:-1:0}function K7(e,t){let n=0;const s=e.score,r=t.score;for(;n<s.length&&n<r.length;){const a=z7(s[n],r[n]);if(a)return a;n++}if(Math.abs(r.length-s.length)===1){if(_c(s))return 1;if(_c(r))return-1}return r.length-s.length}function _c(e){const t=e[e.length-1];return e.length>0&&t[t.length-1]<0}const q7={type:0,value:\"\"},J7=/[a-zA-Z0-9_]/;function X7(e){if(!e)return[[]];if(e===\"/\")return[[q7]];if(!e.startsWith(\"/\"))throw new Error(`Invalid path \"${e}\"`);function t(y){throw new Error(`ERR (${n})/\"${u}\": ${y}`)}let n=0,s=n;const r=[];let a;function o(){a&&r.push(a),a=[]}let i=0,l,u=\"\",c=\"\";function _(){!u||(n===0?a.push({type:0,value:u}):n===1||n===2||n===3?(a.length>1&&(l===\"*\"||l===\"+\")&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),a.push({type:1,value:u,regexp:c,repeatable:l===\"*\"||l===\"+\",optional:l===\"*\"||l===\"?\"})):t(\"Invalid state to consume buffer\"),u=\"\")}function p(){u+=l}for(;i<e.length;){if(l=e[i++],l===\"\\\\\"&&n!==2){s=n,n=4;continue}switch(n){case 0:l===\"/\"?(u&&_(),o()):l===\":\"?(_(),n=1):p();break;case 4:p(),n=s;break;case 1:l===\"(\"?n=2:J7.test(l)?p():(_(),n=0,l!==\"*\"&&l!==\"?\"&&l!==\"+\"&&i--);break;case 2:l===\")\"?c[c.length-1]==\"\\\\\"?c=c.slice(0,-1)+l:n=3:c+=l;break;case 3:_(),n=0,l!==\"*\"&&l!==\"?\"&&l!==\"+\"&&i--,c=\"\";break;default:t(\"Unknown state\");break}}return n===2&&t(`Unfinished custom RegExp for param \"${u}\"`),_(),o(),r}function Z7(e,t,n){const s=G7(X7(e.path),n),r=$e(s,{record:e,parent:t,children:[],alias:[]});return t&&!r.record.aliasOf==!t.record.aliasOf&&t.children.push(r),r}function Q7(e,t){const n=[],s=new Map;t=gc({strict:!1,end:!0,sensitive:!1},t);function r(c){return s.get(c)}function a(c,_,p){const y=!p,E=e9(c);E.aliasOf=p&&p.record;const k=gc(t,c),S=[E];if(\"alias\"in c){const P=typeof c.alias==\"string\"?[c.alias]:c.alias;for(const b of P)S.push($e({},E,{components:p?p.record.components:E.components,path:b,aliasOf:p?p.record:E}))}let m,w;for(const P of S){const{path:b}=P;if(_&&b[0]!==\"/\"){const D=_.record.path,I=D[D.length-1]===\"/\"?\"\":\"/\";P.path=_.record.path+(b&&I+b)}if(m=Z7(P,_,k),p?p.alias.push(m):(w=w||m,w!==m&&w.alias.push(m),y&&c.name&&!mc(m)&&o(c.name)),E.children){const D=E.children;for(let I=0;I<D.length;I++)a(D[I],m,p&&p.children[I])}p=p||m,(m.record.components&&Object.keys(m.record.components).length||m.record.name||m.record.redirect)&&l(m)}return w?()=>{o(w)}:Pr}function o(c){if(c1(c)){const _=s.get(c);_&&(s.delete(c),n.splice(n.indexOf(_),1),_.children.forEach(o),_.alias.forEach(o))}else{const _=n.indexOf(c);_>-1&&(n.splice(_,1),c.record.name&&s.delete(c.record.name),c.children.forEach(o),c.alias.forEach(o))}}function i(){return n}function l(c){let _=0;for(;_<n.length&&K7(c,n[_])>=0&&(c.record.path!==n[_].record.path||!f1(c,n[_]));)_++;n.splice(_,0,c),c.record.name&&!mc(c)&&s.set(c.record.name,c)}function u(c,_){let p,y={},E,k;if(\"name\"in c&&c.name){if(p=s.get(c.name),!p)throw Qs(1,{location:c});k=p.record.name,y=$e(pc(_.params,p.keys.filter(w=>!w.optional).map(w=>w.name)),c.params&&pc(c.params,p.keys.map(w=>w.name))),E=p.stringify(y)}else if(\"path\"in c)E=c.path,p=n.find(w=>w.re.test(E)),p&&(y=p.parse(E),k=p.record.name);else{if(p=_.name?s.get(_.name):n.find(w=>w.re.test(_.path)),!p)throw Qs(1,{location:c,currentLocation:_});k=p.record.name,y=$e({},_.params,c.params),E=p.stringify(y)}const S=[];let m=p;for(;m;)S.unshift(m.record),m=m.parent;return{name:k,path:E,params:y,matched:S,meta:n9(S)}}return e.forEach(c=>a(c)),{addRoute:a,resolve:u,removeRoute:o,getRoutes:i,getRecordMatcher:r}}function pc(e,t){const n={};for(const s of t)s in e&&(n[s]=e[s]);return n}function e9(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:t9(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:\"components\"in e?e.components||null:e.component&&{default:e.component}}}function t9(e){const t={},n=e.props||!1;if(\"component\"in e)t.default=n;else for(const s in e.components)t[s]=typeof n==\"object\"?n[s]:n;return t}function mc(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function n9(e){return e.reduce((t,n)=>$e(t,n.meta),{})}function gc(e,t){const n={};for(const s in e)n[s]=s in t?t[s]:e[s];return n}function f1(e,t){return t.children.some(n=>n===e||f1(e,n))}const h1=/#/g,s9=/&/g,r9=/\\//g,a9=/=/g,o9=/\\?/g,_1=/\\+/g,i9=/%5B/g,l9=/%5D/g,p1=/%5E/g,u9=/%60/g,m1=/%7B/g,c9=/%7C/g,g1=/%7D/g,d9=/%20/g;function yl(e){return encodeURI(\"\"+e).replace(c9,\"|\").replace(i9,\"[\").replace(l9,\"]\")}function f9(e){return yl(e).replace(m1,\"{\").replace(g1,\"}\").replace(p1,\"^\")}function pi(e){return yl(e).replace(_1,\"%2B\").replace(d9,\"+\").replace(h1,\"%23\").replace(s9,\"%26\").replace(u9,\"`\").replace(m1,\"{\").replace(g1,\"}\").replace(p1,\"^\")}function h9(e){return pi(e).replace(a9,\"%3D\")}function _9(e){return yl(e).replace(h1,\"%23\").replace(o9,\"%3F\")}function p9(e){return e==null?\"\":_9(e).replace(r9,\"%2F\")}function Aa(e){try{return decodeURIComponent(\"\"+e)}catch(t){}return\"\"+e}function m9(e){const t={};if(e===\"\"||e===\"?\")return t;const s=(e[0]===\"?\"?e.slice(1):e).split(\"&\");for(let r=0;r<s.length;++r){const a=s[r].replace(_1,\" \"),o=a.indexOf(\"=\"),i=Aa(o<0?a:a.slice(0,o)),l=o<0?null:Aa(a.slice(o+1));if(i in t){let u=t[i];ln(u)||(u=t[i]=[u]),u.push(l)}else t[i]=l}return t}function vc(e){let t=\"\";for(let n in e){const s=e[n];if(n=h9(n),s==null){s!==void 0&&(t+=(t.length?\"&\":\"\")+n);continue}(ln(s)?s.map(a=>a&&pi(a)):[s&&pi(s)]).forEach(a=>{a!==void 0&&(t+=(t.length?\"&\":\"\")+n,a!=null&&(t+=\"=\"+a))})}return t}function g9(e){const t={};for(const n in e){const s=e[n];s!==void 0&&(t[n]=ln(s)?s.map(r=>r==null?null:\"\"+r):s==null?s:\"\"+s)}return t}const v9=Symbol(\"\"),yc=Symbol(\"\"),ho=Symbol(\"\"),v1=Symbol(\"\"),mi=Symbol(\"\");function yr(){let e=[];function t(s){return e.push(s),()=>{const r=e.indexOf(s);r>-1&&e.splice(r,1)}}function n(){e=[]}return{add:t,list:()=>e.slice(),reset:n}}function jn(e,t,n,s,r){const a=s&&(s.enterCallbacks[r]=s.enterCallbacks[r]||[]);return()=>new Promise((o,i)=>{const l=_=>{_===!1?i(Qs(4,{from:n,to:t})):_ instanceof Error?i(_):W7(_)?i(Qs(2,{from:t,to:_})):(a&&s.enterCallbacks[r]===a&&typeof _==\"function\"&&a.push(_),o())},u=e.call(s&&s.instances[r],t,n,l);let c=Promise.resolve(u);e.length<3&&(c=c.then(l)),c.catch(_=>i(_))})}function No(e,t,n,s){const r=[];for(const a of e)for(const o in a.components){let i=a.components[o];if(!(t!==\"beforeRouteEnter\"&&!a.instances[o]))if(y9(i)){const u=(i.__vccOpts||i)[t];u&&r.push(jn(u,n,s,a,o))}else{let l=i();r.push(()=>l.then(u=>{if(!u)return Promise.reject(new Error(`Couldn't resolve component \"${o}\" at \"${a.path}\"`));const c=C7(u)?u.default:u;a.components[o]=c;const p=(c.__vccOpts||c)[t];return p&&jn(p,n,s,a,o)()}))}}return r}function y9(e){return typeof e==\"object\"||\"displayName\"in e||\"props\"in e||\"__vccOpts\"in e}function bc(e){const t=ve(ho),n=ve(v1),s=be(()=>t.resolve(J(e.to))),r=be(()=>{const{matched:l}=s.value,{length:u}=l,c=l[u-1],_=n.matched;if(!c||!_.length)return-1;const p=_.findIndex(Zs.bind(null,c));if(p>-1)return p;const y=Ec(l[u-2]);return u>1&&Ec(c)===y&&_[_.length-1].path!==y?_.findIndex(Zs.bind(null,l[u-2])):p}),a=be(()=>r.value>-1&&w9(n.params,s.value.params)),o=be(()=>r.value>-1&&r.value===n.matched.length-1&&i1(n.params,s.value.params));function i(l={}){return k9(l)?t[J(e.replace)?\"replace\":\"push\"](J(e.to)).catch(Pr):Promise.resolve()}return{route:s,href:be(()=>s.value.href),isActive:a,isExactActive:o,navigate:i}}const b9=ue({name:\"RouterLink\",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:\"page\"}},useLink:bc,setup(e,{slots:t}){const n=wt(bc(e)),{options:s}=ve(ho),r=be(()=>({[kc(e.activeClass,s.linkActiveClass,\"router-link-active\")]:n.isActive,[kc(e.exactActiveClass,s.linkExactActiveClass,\"router-link-exact-active\")]:n.isExactActive}));return()=>{const a=t.default&&t.default(n);return e.custom?a:Jr(\"a\",{\"aria-current\":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:r.value},a)}}}),E9=b9;function k9(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute(\"target\");if(/\\b_blank\\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function w9(e,t){for(const n in t){const s=t[n],r=e[n];if(typeof s==\"string\"){if(s!==r)return!1}else if(!ln(r)||r.length!==s.length||s.some((a,o)=>a!==r[o]))return!1}return!0}function Ec(e){return e?e.aliasOf?e.aliasOf.path:e.path:\"\"}const kc=(e,t,n)=>e!=null?e:t!=null?t:n,S9=ue({name:\"RouterView\",inheritAttrs:!1,props:{name:{type:String,default:\"default\"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const s=ve(mi),r=be(()=>e.route||s.value),a=ve(yc,0),o=be(()=>{let u=J(a);const{matched:c}=r.value;let _;for(;(_=c[u])&&!_.components;)u++;return u}),i=be(()=>r.value.matched[o.value]);It(yc,be(()=>o.value+1)),It(v9,i),It(mi,r);const l=le();return Zn(()=>[l.value,i.value,e.name],([u,c,_],[p,y,E])=>{c&&(c.instances[_]=u,y&&y!==c&&u&&u===p&&(c.leaveGuards.size||(c.leaveGuards=y.leaveGuards),c.updateGuards.size||(c.updateGuards=y.updateGuards))),u&&c&&(!y||!Zs(c,y)||!p)&&(c.enterCallbacks[_]||[]).forEach(k=>k(u))},{flush:\"post\"}),()=>{const u=r.value,c=e.name,_=i.value,p=_&&_.components[c];if(!p)return wc(n.default,{Component:p,route:u});const y=_.props[c],E=y?y===!0?u.params:typeof y==\"function\"?y(u):y:null,S=Jr(p,$e({},E,t,{onVnodeUnmounted:m=>{m.component.isUnmounted&&(_.instances[c]=null)},ref:l}));return wc(n.default,{Component:S,route:u})||S}}});function wc(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const C9=S9;function T9(e){const t=Q7(e.routes,e),n=e.parseQuery||m9,s=e.stringifyQuery||vc,r=e.history,a=yr(),o=yr(),i=yr(),l=Kc(Hn);let u=Hn;xs&&e.scrollBehavior&&\"scrollRestoration\"in history&&(history.scrollRestoration=\"manual\");const c=Oo.bind(null,L=>\"\"+L),_=Oo.bind(null,p9),p=Oo.bind(null,Aa);function y(L,z){let W,Q;return c1(L)?(W=t.getRecordMatcher(L),Q=z):Q=L,t.addRoute(Q,W)}function E(L){const z=t.getRecordMatcher(L);z&&t.removeRoute(z)}function k(){return t.getRoutes().map(L=>L.record)}function S(L){return!!t.getRecordMatcher(L)}function m(L,z){if(z=$e({},z||l.value),typeof L==\"string\"){const h=Po(n,L,z.path),g=t.resolve({path:h.path},z),T=r.createHref(h.fullPath);return $e(h,g,{params:p(g.params),hash:Aa(h.hash),redirectedFrom:void 0,href:T})}let W;if(\"path\"in L)W=$e({},L,{path:Po(n,L.path,z.path).path});else{const h=$e({},L.params);for(const g in h)h[g]==null&&delete h[g];W=$e({},L,{params:_(h)}),z.params=_(z.params)}const Q=t.resolve(W,z),Se=L.hash||\"\";Q.params=c(p(Q.params));const v=D7(s,$e({},L,{hash:f9(Se),path:Q.path})),f=r.createHref(v);return $e({fullPath:v,hash:Se,query:s===vc?g9(L.query):L.query||{}},Q,{redirectedFrom:void 0,href:f})}function w(L){return typeof L==\"string\"?Po(n,L,l.value.path):$e({},L)}function P(L,z){if(u!==L)return Qs(8,{from:z,to:L})}function b(L){return V(L)}function D(L){return b($e(w(L),{replace:!0}))}function I(L){const z=L.matched[L.matched.length-1];if(z&&z.redirect){const{redirect:W}=z;let Q=typeof W==\"function\"?W(L):W;return typeof Q==\"string\"&&(Q=Q.includes(\"?\")||Q.includes(\"#\")?Q=w(Q):{path:Q},Q.params={}),$e({query:L.query,hash:L.hash,params:\"path\"in Q?{}:L.params},Q)}}function V(L,z){const W=u=m(L),Q=l.value,Se=L.state,v=L.force,f=L.replace===!0,h=I(W);if(h)return V($e(w(h),{state:typeof h==\"object\"?$e({},Se,h.state):Se,force:v,replace:f}),z||W);const g=W;g.redirectedFrom=z;let T;return!v&&O7(s,Q,W)&&(T=Qs(16,{to:g,from:Q}),yt(Q,Q,!0,!1)),(T?Promise.resolve(T):ee(g,Q)).catch(O=>wn(O)?wn(O,2)?O:Dt(O):Ee(O,g,Q)).then(O=>{if(O){if(wn(O,2))return V($e({replace:f},w(O.to),{state:typeof O.to==\"object\"?$e({},Se,O.to.state):Se,force:v}),z||g)}else O=H(g,Q,!0,f,Se);return _e(g,Q,O),O})}function M(L,z){const W=P(L,z);return W?Promise.reject(W):Promise.resolve()}function U(L){const z=jt.values().next().value;return z&&typeof z.runWithContext==\"function\"?z.runWithContext(L):L()}function ee(L,z){let W;const[Q,Se,v]=F9(L,z);W=No(Q.reverse(),\"beforeRouteLeave\",L,z);for(const h of Q)h.leaveGuards.forEach(g=>{W.push(jn(g,L,z))});const f=M.bind(null,L,z);return W.push(f),Ze(W).then(()=>{W=[];for(const h of a.list())W.push(jn(h,L,z));return W.push(f),Ze(W)}).then(()=>{W=No(Se,\"beforeRouteUpdate\",L,z);for(const h of Se)h.updateGuards.forEach(g=>{W.push(jn(g,L,z))});return W.push(f),Ze(W)}).then(()=>{W=[];for(const h of v)if(h.beforeEnter)if(ln(h.beforeEnter))for(const g of h.beforeEnter)W.push(jn(g,L,z));else W.push(jn(h.beforeEnter,L,z));return W.push(f),Ze(W)}).then(()=>(L.matched.forEach(h=>h.enterCallbacks={}),W=No(v,\"beforeRouteEnter\",L,z),W.push(f),Ze(W))).then(()=>{W=[];for(const h of o.list())W.push(jn(h,L,z));return W.push(f),Ze(W)}).catch(h=>wn(h,8)?h:Promise.reject(h))}function _e(L,z,W){i.list().forEach(Q=>U(()=>Q(L,z,W)))}function H(L,z,W,Q,Se){const v=P(L,z);if(v)return v;const f=z===Hn,h=xs?history.state:{};W&&(Q||f?r.replace(L.fullPath,$e({scroll:f&&h&&h.scroll},Se)):r.push(L.fullPath,Se)),l.value=L,yt(L,z,W,f),Dt()}let ie;function Me(){ie||(ie=r.listen((L,z,W)=>{if(!cn.listening)return;const Q=m(L),Se=I(Q);if(Se){V($e(Se,{replace:!0}),Q).catch(Pr);return}u=Q;const v=l.value;xs&&$7(cc(v.fullPath,W.delta),fo()),ee(Q,v).catch(f=>wn(f,12)?f:wn(f,2)?(V(f.to,Q).then(h=>{wn(h,20)&&!W.delta&&W.type===Gr.pop&&r.go(-1,!1)}).catch(Pr),Promise.reject()):(W.delta&&r.go(-W.delta,!1),Ee(f,Q,v))).then(f=>{f=f||H(Q,v,!1),f&&(W.delta&&!wn(f,8)?r.go(-W.delta,!1):W.type===Gr.pop&&wn(f,20)&&r.go(-1,!1)),_e(Q,v,f)}).catch(Pr)}))}let qe=yr(),de=yr(),we;function Ee(L,z,W){Dt(L);const Q=de.list();return Q.length?Q.forEach(Se=>Se(L,z,W)):console.error(L),Promise.reject(L)}function mt(){return we&&l.value!==Hn?Promise.resolve():new Promise((L,z)=>{qe.add([L,z])})}function Dt(L){return we||(we=!L,Me(),qe.list().forEach(([z,W])=>L?W(L):z()),qe.reset()),L}function yt(L,z,W,Q){const{scrollBehavior:Se}=e;if(!xs||!Se)return Promise.resolve();const v=!W&&R7(cc(L.fullPath,0))||(Q||!W)&&history.state&&history.state.scroll||null;return Ii().then(()=>Se(L,z,v)).then(f=>f&&x7(f)).catch(f=>Ee(f,L,z))}const rt=L=>r.go(L);let Vt;const jt=new Set,cn={currentRoute:l,listening:!0,addRoute:y,removeRoute:E,hasRoute:S,getRoutes:k,resolve:m,options:e,push:b,replace:D,go:rt,back:()=>rt(-1),forward:()=>rt(1),beforeEach:a.add,beforeResolve:o.add,afterEach:i.add,onError:de.add,isReady:mt,install(L){const z=this;L.component(\"RouterLink\",E9),L.component(\"RouterView\",C9),L.config.globalProperties.$router=z,Object.defineProperty(L.config.globalProperties,\"$route\",{enumerable:!0,get:()=>J(l)}),xs&&!Vt&&l.value===Hn&&(Vt=!0,b(r.location).catch(Se=>{}));const W={};for(const Se in Hn)Object.defineProperty(W,Se,{get:()=>l.value[Se],enumerable:!0});L.provide(ho,z),L.provide(v1,Wc(W)),L.provide(mi,l);const Q=L.unmount;jt.add(L),L.unmount=function(){jt.delete(L),jt.size<1&&(u=Hn,ie&&ie(),ie=null,l.value=Hn,Vt=!1,we=!1),Q()}}};function Ze(L){return L.reduce((z,W)=>z.then(()=>U(W)),Promise.resolve())}return cn}function F9(e,t){const n=[],s=[],r=[],a=Math.max(t.matched.length,e.matched.length);for(let o=0;o<a;o++){const i=t.matched[o];i&&(e.matched.find(u=>Zs(u,i))?s.push(i):n.push(i));const l=e.matched[o];l&&(t.matched.find(u=>Zs(u,l))||r.push(l))}return[n,s,r]}function D9(){return ve(ho)}const O9={};function P9(e,t){const n=ht(\"router-view\");return C(),Fe(n)}var N9=he(O9,[[\"render\",P9]]);const I9=\"modulepreload\",Sc={},A9=\"/\",We=function(t,n){return!n||n.length===0?t():Promise.all(n.map(s=>{if(s=`${A9}${s}`,s in Sc)return;Sc[s]=!0;const r=s.endsWith(\".css\"),a=r?'[rel=\"stylesheet\"]':\"\";if(document.querySelector(`link[href=\"${s}\"]${a}`))return;const o=document.createElement(\"link\");if(o.rel=r?\"stylesheet\":I9,r||(o.as=\"script\",o.crossOrigin=\"\"),o.href=s,document.head.appendChild(o),r)return new Promise((i,l)=>{o.addEventListener(\"load\",i),o.addEventListener(\"error\",()=>l(new Error(`Unable to preload CSS for ${s}`)))})})).then(()=>t())};var L9={name:\"PageRouter\",path:\"/router\",component:()=>We(()=>import(\"./chunk.d9ea7f57.js\"),[\"luci-static/istorex/chunk.d9ea7f57.js\",\"luci-static/istorex/index.js\"]),children:[{path:\"\",name:\"PageRouterHome\",redirect:\"/router/index\"},{path:\"index\",name:\"PageRouterIndex\",component:()=>We(()=>import(\"./chunk.de33ea3e.js\"),[\"luci-static/istorex/chunk.de33ea3e.js\",\"luci-static/istorex/index.js\"])},{path:\"network\",name:\"PageNetwork\",component:()=>We(()=>import(\"./chunk.83d679c2.js\"),[\"luci-static/istorex/chunk.83d679c2.js\",\"luci-static/istorex/index.js\"]),children:[{path:\"\",name:\"PageNetworkIndex\",component:()=>We(()=>import(\"./chunk.4f4af73e.js\"),[\"luci-static/istorex/chunk.4f4af73e.js\",\"luci-static/istorex/index.js\"])},{path:\"pppoe\",component:()=>We(()=>import(\"./chunk.8bf617a1.js\"),[\"luci-static/istorex/chunk.8bf617a1.js\",\"luci-static/istorex/index.js\"])},{path:\"dhcp\",component:()=>We(()=>import(\"./chunk.8f1ff823.js\"),[\"luci-static/istorex/chunk.8f1ff823.js\",\"luci-static/istorex/index.js\"])},{path:\"gateway\",component:()=>We(()=>import(\"./chunk.25dae49f.js\"),[\"luci-static/istorex/chunk.25dae49f.js\",\"luci-static/istorex/index.js\"])},{path:\"intranet\",component:()=>We(()=>import(\"./chunk.6f7d3090.js\"),[\"luci-static/istorex/chunk.6f7d3090.js\",\"luci-static/istorex/index.js\",\"luci-static/istorex/chunk.6d3585bb.js\"])},{path:\"dns\",component:()=>We(()=>import(\"./chunk.fb51d2b2.js\"),[\"luci-static/istorex/chunk.fb51d2b2.js\",\"luci-static/istorex/index.js\"])}]},{path:\"setting\",name:\"PageSetting\",component:()=>We(()=>import(\"./chunk.ead1f974.js\"),[\"luci-static/istorex/chunk.ead1f974.js\",\"luci-static/istorex/index.js\"]),children:[{path:\"\",name:\"PageSettingIndex\",component:()=>We(()=>import(\"./chunk.5e41a3f0.js\"),[\"luci-static/istorex/chunk.5e41a3f0.js\",\"luci-static/istorex/index.js\"])},{path:\"opkg\",name:\"SettingOpkg\",component:()=>We(()=>import(\"./chunk.4d4bc89c.js\"),[\"luci-static/istorex/chunk.4d4bc89c.js\",\"luci-static/istorex/index.js\"])},{path:\"sandbox\",component:()=>We(()=>import(\"./chunk.2147605f.js\"),[\"luci-static/istorex/chunk.2147605f.js\",\"luci-static/istorex/index.js\"])},{path:\"remotely\",component:()=>We(()=>import(\"./chunk.42bb6629.js\"),[\"luci-static/istorex/chunk.42bb6629.js\",\"luci-static/istorex/index.js\"])}]},{path:\"disk\",component:()=>We(()=>import(\"./chunk.18e0c91d.js\"),[\"luci-static/istorex/chunk.18e0c91d.js\",\"luci-static/istorex/index.js\"]),children:[{path:\"\",component:()=>We(()=>import(\"./chunk.167c223d.js\"),[\"luci-static/istorex/chunk.167c223d.js\",\"luci-static/istorex/index.js\"])}]},{path:\"istore\",component:()=>We(()=>import(\"./chunk.403244cc.js\"),[\"luci-static/istorex/chunk.403244cc.js\",\"luci-static/istorex/index.js\"])},{path:\"device\",component:()=>We(()=>import(\"./chunk.211ffb47.js\"),[\"luci-static/istorex/chunk.211ffb47.js\",\"luci-static/istorex/index.js\"]),children:[{path:\"list\",component:()=>We(()=>import(\"./chunk.f2b02e0d.js\"),[\"luci-static/istorex/chunk.f2b02e0d.js\",\"luci-static/istorex/index.js\"])},{path:\"interface\",component:()=>We(()=>import(\"./chunk.b7ccb4ed.js\"),[\"luci-static/istorex/chunk.b7ccb4ed.js\",\"luci-static/istorex/index.js\"])}]},{name:\"DDNSPage\",path:\"ddns\",component:()=>We(()=>import(\"./chunk.ff94f9f2.js\"),[\"luci-static/istorex/chunk.ff94f9f2.js\",\"luci-static/istorex/index.js\"])},{path:\":pathMatch(.*)*\",name:\"notfound\",redirect:\"/router/index\"}]},M9={name:\"PageWizard\",path:\"/wizard\",component:()=>We(()=>import(\"./chunk.7deee291.js\"),[\"luci-static/istorex/chunk.7deee291.js\",\"luci-static/istorex/index.js\"])},x9={name:\"PageNas\",path:\"/nas\",component:()=>We(()=>import(\"./chunk.41b74402.js\"),[\"luci-static/istorex/chunk.41b74402.js\",\"luci-static/istorex/index.js\"]),children:[{name:\"PageNasIndex\",path:\"\",component:()=>We(()=>import(\"./chunk.a1bcc52b.js\"),[\"luci-static/istorex/chunk.a1bcc52b.js\",\"luci-static/istorex/index.js\",\"luci-static/istorex/chunk.ffd7724b.js\"])}]},$9={name:\"NextNas\",path:\"/next-nas\",component:()=>We(()=>import(\"./chunk.fdf02bc2.js\"),[\"luci-static/istorex/chunk.fdf02bc2.js\",\"luci-static/istorex/index.js\",\"luci-static/istorex/chunk.6d3585bb.js\",\"luci-static/istorex/chunk.ffd7724b.js\"])};const R9=T9({history:window.path_base?u1(window.path_base):H7(),routes:[{path:\"/\",name:\"PageIndex\",component:N9,beforeEnter(e,t,n){return te(this,null,function*(){switch(it.getModel()){case\"next-nas\":n({name:\"NextNas\"});break;case\"router\":n({name:\"PageRouterHome\"});break;default:n({name:\"PageWizard\"});break}})}},M9,L9,x9,$9,{path:\"/:pathMatch(.*)*\",name:\"notfound\",redirect:e=>{switch(console.log(\"redirec:\",e),it.getModel()){case\"next-nas\":return\"/next-nas\";case\"router\":return\"/router/index\";default:return\"/wizard\"}}}]});const B9={},U9={t:\"1655777339433\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2673\",width:\"128\",height:\"128\"},Y9=d(\"path\",{d:\"M59.733333 614.4h930.133334a8.533333 8.533333 0 0 1 8.533333 8.533333v238.933334a8.533333 8.533333 0 0 1-8.533333 8.533333H59.733333a8.533333 8.533333 0 0 1-8.533333-8.533333V622.933333a8.533333 8.533333 0 0 1 8.533333-8.533333z\",fill:\"#96CAFF\",\"p-id\":\"2674\"},null,-1),H9=d(\"path\",{d:\"M76.8 588.8l176.128-377.941333A76.8 76.8 0 0 1 315.050667 179.2H759.466667a76.8 76.8 0 0 1 62.122666 31.658667L996.266667 588.8\",fill:\"#B3D9FF\",\"p-id\":\"2675\"},null,-1),W9=d(\"path\",{d:\"M742.4 204.8l175.274667 362.752h57.941333L805.290667 204.8H742.4z\",fill:\"#96CAFF\",\"p-id\":\"2676\"},null,-1),V9=d(\"path\",{d:\"M51.2 588.8a25.6 25.6 0 0 0-25.6 25.6v204.8a25.6 25.6 0 0 0 25.6 25.6h921.6a25.6 25.6 0 0 0 25.6-25.6V614.4a25.6 25.6 0 0 0-25.6-25.6z m0-25.6h921.6a51.2 51.2 0 0 1 51.2 51.2v204.8a51.2 51.2 0 0 1-51.2 51.2H51.2a51.2 51.2 0 0 1-51.2-51.2V614.4a51.2 51.2 0 0 1 51.2-51.2z\",fill:\"#175AA7\",\"p-id\":\"2677\"},null,-1),j9=d(\"path\",{d:\"M204.8 221.866667l-23.210667-10.837334 20.736 15.018667 1.365334-1.792z m616.533333 4.266666l20.736-15.018666L818.432 221.866667l1.194667 2.474666zM243.370667 204.8h536.149333A51.2 51.2 0 0 1 819.2 224.085333L988.501333 588.8h28.245334L841.642667 210.858667A76.8 76.8 0 0 0 779.52 179.2H243.370667a76.8 76.8 0 0 0-62.122667 31.658667L5.12 588.8h28.245333l169.898667-364.714667a51.2 51.2 0 0 1 40.106667-19.285333z m577.536 21.077333l20.736-15.018666L818.432 221.866667l1.194667 2.474666z m-619.008 0l-20.736-15.018666L204.8 221.866667l-1.109333 2.474666zM988.501333 588.8h28.245334L841.642667 210.858667A76.8 76.8 0 0 0 779.52 179.2H243.370667a76.8 76.8 0 0 0-62.122667 31.658667L5.12 588.8h28.245333l169.898667-364.714667a51.2 51.2 0 0 1 40.106667-19.285333h536.149333A51.2 51.2 0 0 1 819.2 224.085333zM883.2 768a38.4 38.4 0 1 0-38.4-38.4 38.4 38.4 0 0 0 38.4 38.4z m0 25.6a64 64 0 1 1 64-64 64 64 0 0 1-64 64z\",fill:\"#175AA7\",\"p-id\":\"2678\"},null,-1),G9=d(\"path\",{d:\"M512 492.458667c125.696 0 200.789333-67.413333 174.165333-129.877334C666.794667 316.672 592.725333 281.6 512 281.6s-154.538667 35.072-174.165333 80.981333C311.552 425.045333 386.56 492.458667 512 492.458667z m-197.376-139.946667C339.712 293.717333 425.898667 256 512 256s172.885333 37.717333 197.973333 96.512c33.621333 78.848-49.493333 165.546667-197.717333 165.546667s-231.253333-86.698667-197.632-165.546667zM842.922667 479.829333c-13.226667 0-20.309333 11.52-15.616 26.112a40.533333 40.533333 0 0 0 34.133333 27.818667c14.165333 0 20.821333-12.714667 15.018667-27.818667a40.618667 40.618667 0 0 0-34.133334-26.112M155.648 505.941333c-5.717333 15.189333 0.853333 27.818667 15.018667 27.818667a40.533333 40.533333 0 0 0 34.56-27.818667c4.693333-14.677333-2.389333-26.112-15.616-26.112a40.618667 40.618667 0 0 0-33.962667 26.112zM264.533333 260.608c-3.157333 8.533333 2.645333 15.104 13.056 15.104a25.6 25.6 0 0 0 23.722667-15.104c2.56-8.106667-3.413333-14.421333-13.312-14.421333A26.026667 26.026667 0 0 0 264.533333 260.608zM754.688 275.797333c10.410667 0 16.213333-6.912 13.056-15.104a26.026667 26.026667 0 0 0-23.381333-14.421333c-9.898667 0-15.872 6.4-13.312 14.421333a25.6 25.6 0 0 0 23.722666 15.104\",fill:\"#175AA7\",\"p-id\":\"2679\"},null,-1),z9=[Y9,H9,W9,V9,j9,G9];function K9(e,t){return C(),N(\"svg\",U9,z9)}var q9=he(B9,[[\"render\",K9]]);const J9={},X9={t:\"1657017066197\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"7436\",width:\"128\",height:\"128\"},Z9=d(\"path\",{d:\"M25.6 54.84032v152.79104h967.68V54.84032H25.6z m0 534.76864h967.68V436.81792H25.6v152.79104z m0 381.98272h967.68v-152.79104H25.6v152.79104z\",\"p-id\":\"7437\"},null,-1),Q9=[Z9];function eg(e,t){return C(),N(\"svg\",X9,Q9)}var tg=he(J9,[[\"render\",eg]]);const ng={key:0,t:\"1657180381358\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"3686\",width:\"128\",height:\"128\"},sg=d(\"path\",{d:\"M512 958.016C266.08 958.016 65.984 757.952 65.984 512 65.984 266.08 266.08 65.984 512 65.984c245.952 0 446.016 200.064 446.016 446.016C958.016 757.952 757.952 958.016 512 958.016zM512 129.984C301.344 129.984 129.984 301.344 129.984 512c0 210.624 171.36 382.016 382.016 382.016 210.624 0 382.016-171.36 382.016-382.016C894.016 301.344 722.624 129.984 512 129.984z\",\"p-id\":\"3687\"},null,-1),rg=d(\"path\",{d:\"M512 304m-48 0a1.5 1.5 0 1 0 96 0 1.5 1.5 0 1 0-96 0Z\",\"p-id\":\"3688\"},null,-1),ag=d(\"path\",{d:\"M512 768c-17.664 0-32-14.304-32-32l0-288c0-17.664 14.336-32 32-32s32 14.336 32 32l0 288C544 753.696 529.664 768 512 768z\",\"p-id\":\"3689\"},null,-1),og=[sg,rg,ag],ig={key:1,t:\"1657180370515\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"3532\",width:\"128\",height:\"128\"},lg=d(\"path\",{d:\"M512 65.984C266.048 65.984 65.984 266.048 65.984 512S266.048 958.016 512 958.016 958.016 757.952 958.016 512 757.952 65.984 512 65.984zM544 736c0 17.696-14.304 32-32 32s-32-14.304-32-32l0-288c0-17.696 14.304-32 32-32s32 14.304 32 32L544 736zM512 352c-26.496 0-48-21.536-48-48C464 277.472 485.504 256 512 256s48 21.472 48 48C560 330.464 538.496 352 512 352z\",\"p-id\":\"3533\"},null,-1),ug=[lg],cg=ue({__name:\"info\",props:{type:{type:Number,default:0}},setup(e){return(t,n)=>e.type==0?(C(),N(\"svg\",ng,og)):e.type==1?(C(),N(\"svg\",ig,ug)):pe(\"\",!0)}}),dg={},fg={width:\"16px\",height:\"16px\",viewBox:\"0 0 16 16\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},hg=d(\"path\",{d:\"M14.9234958,14.5525054 L10.84453,10.4679606 C11.8849284,9.46327833 12.5294813,8.07823887 12.5294813,6.55073066 C12.5294813,3.48989918 9.94358337,1 6.76474066,1 C3.58589795,1 1,3.48989918 1,6.55073066 C1,9.61156213 3.58589795,12.1014613 6.76474066,12.1014613 C8.16008242,12.1014613 9.44067838,11.621191 10.438802,10.8242646 L14.5276502,14.9188536 C14.5814545,14.9730393 14.6533765,15 14.725573,15 C14.7942009,15 14.8625542,14.9754182 14.9158095,14.9262546 C15.025065,14.8250198 15.0283592,14.6577049 14.9234958,14.5525054 Z M6.76474066,11.5728203 C3.8886841,11.5728203 1.54902292,9.32001661 1.54902292,6.55073066 C1.54902292,3.7814447 3.8886841,1.52864101 6.76474066,1.52864101 C9.64079723,1.52864101 11.9804584,3.7814447 11.9804584,6.55073066 C11.9804584,9.32001661 9.64052272,11.5728203 6.76474066,11.5728203 Z\",id:\"Shape\",stroke:\"#FFFFFF\",\"stroke-width\":\"1.3\"},null,-1),_g=[hg];function pg(e,t){return C(),N(\"svg\",fg,_g)}var mg=he(dg,[[\"render\",pg]]);const gg={},vg={width:\"12px\",height:\"12px\",viewBox:\"0 0 12 12\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},yg=d(\"path\",{d:\"M10.171916,3.81818329 C10.6519813,3.81274681 11.1102149,4.01840688 11.4252438,4.38069009 C11.7402726,4.74297329 11.8803105,5.2253253 11.8081406,5.70080197 L11.0555552,10.608963 C10.9332063,11.4157454 10.2351606,12.0090843 9.42537185,12 L3.27269856,12 C2.97145497,12 2.7272488,11.7556885 2.7272488,11.454445 L2.7272488,5.4544976 C2.7272488,5.37817917 2.74326442,5.30271013 2.77426027,5.23296947 L4.95605931,0.323921631 C5.04360472,0.126944443 5.23894201,0 5.4544976,0 C6.65947193,0 7.63629663,0.976824702 7.63629663,2.18179904 L7.63629663,3.81815451 L10.171916,3.81818329 Z M3.81814832,10.9090654 L9.43153778,10.9090654 C9.70352269,10.9121048 9.93620458,10.7143252 9.97712277,10.4445109 L10.7297188,5.53628009 C10.7537339,5.3780602 10.7070546,5.2172762 10.602045,5.09651513 C10.4970353,4.97575406 10.3442908,4.9072007 10.1780925,4.90904784 L7.09084687,4.90904784 C6.78960329,4.90904784 6.54539711,4.66484166 6.54539711,4.36359808 L6.54539711,2.18179904 C6.54539711,1.69494967 6.22647822,1.2825878 5.78615711,1.14223013 L3.81814832,5.57024992 L3.81814832,10.9090654 Z M2.7272488,5.99994736 L1.63634928,5.99994736 C1.33510569,5.99994736 1.09089952,6.24415353 1.09089952,6.54539711 L1.09089952,10.3635454 C1.09089952,10.664789 1.33510569,10.9089952 1.63634928,10.9089952 L2.7272488,10.9089952 L2.7272488,5.99994736 Z M3.27269856,11.9998947 L1.63634928,11.9998947 C0.732618527,11.9998947 -1.03028697e-13,11.2672762 -1.03028697e-13,10.3635454 L-1.03028697e-13,6.54539711 C-1.03028697e-13,5.64166636 0.732618527,4.90904784 1.63634928,4.90904784 L3.27269856,4.90904784 C3.57394214,4.90904784 3.81814832,5.15325401 3.81814832,5.4544976 L3.81814832,11.454445 C3.81814832,11.7556885 3.57394214,11.9998947 3.27269856,11.9998947 Z\",id:\"Shape\",fill:\"#FFFFFF\",\"fill-rule\":\"nonzero\"},null,-1),bg=[yg];function Eg(e,t){return C(),N(\"svg\",vg,bg)}var kg=he(gg,[[\"render\",Eg]]);const wg={},Sg={width:\"12px\",height:\"12px\",viewBox:\"0 0 12 12\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},Cg=d(\"path\",{d:\"M10.171916,3.81818329 C10.6519813,3.81274681 11.1102149,4.01840688 11.4252438,4.38069009 C11.7402726,4.74297329 11.8803105,5.2253253 11.8081406,5.70080197 L11.0555552,10.608963 C10.9332063,11.4157454 10.2351606,12.0090843 9.42537185,12 L3.27269856,12 C2.97145497,12 2.7272488,11.7556885 2.7272488,11.454445 L2.7272488,5.4544976 C2.7272488,5.37817917 2.74326442,5.30271013 2.77426027,5.23296947 L4.95605931,0.323921631 C5.04360472,0.126944443 5.23894201,0 5.4544976,0 C6.65947193,0 7.63629663,0.976824702 7.63629663,2.18179904 L7.63629663,3.81815451 L10.171916,3.81818329 Z M3.27269856,11.9998947 L1.63634928,11.9998947 C0.732618527,11.9998947 0,11.2672762 0,10.3635454 L0,6.54539711 C0,5.64166636 0.732618527,4.90904784 1.63634928,4.90904784 L3.27269856,4.90904784 C3.57394214,4.90904784 3.81814832,5.15325401 3.81814832,5.4544976 L3.81814832,11.454445 C3.81814832,11.7556885 3.57394214,11.9998947 3.27269856,11.9998947 Z\",id:\"Shape\",fill:\"#FFE45A\",\"fill-rule\":\"nonzero\"},null,-1),Tg=[Cg];function Fg(e,t){return C(),N(\"svg\",Sg,Tg)}var Dg=he(wg,[[\"render\",Fg]]);const Og={},Pg={t:\"1660284166208\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"1616\",width:\"128\",height:\"128\"},Ng=d(\"path\",{d:\"M347.008 574.378667a85.546667 85.546667 0 0 1 0-124.757334L632.490667 182.144a42.389333 42.389333 0 0 1 60.074666 2.069333c16.021333 17.237333 15.104 44.224-2.069333 60.309334L405.013333 512l285.482667 267.477333c17.173333 16.085333 18.090667 43.093333 2.069333 60.309334a42.389333 42.389333 0 0 1-60.074666 2.069333L347.008 574.378667z\",\"p-id\":\"1617\"},null,-1),Ig=[Ng];function Ag(e,t){return C(),N(\"svg\",Pg,Ig)}var Lg=he(Og,[[\"render\",Ag]]);const Mg={},xg={t:\"1660284150684\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"1462\",width:\"128\",height:\"128\"},$g=d(\"path\",{d:\"M676.992 449.621333a85.546667 85.546667 0 0 1 0 124.757334L391.509333 841.856a42.389333 42.389333 0 0 1-60.074666-2.069333 42.773333 42.773333 0 0 1 2.069333-60.309334L618.986667 512 333.504 244.522667a42.773333 42.773333 0 0 1-2.069333-60.309334 42.389333 42.389333 0 0 1 60.074666-2.069333l285.482667 267.477333z\",\"p-id\":\"1463\"},null,-1),Rg=[$g];function Bg(e,t){return C(),N(\"svg\",xg,Rg)}var Ug=he(Mg,[[\"render\",Bg]]);const Yg={},Hg={t:\"1660284192070\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"1770\",width:\"128\",height:\"128\"},Wg=d(\"path\",{d:\"M449.621333 347.008a85.546667 85.546667 0 0 1 124.757334 0l267.477333 285.482667c16.085333 17.173333 15.146667 44.053333-2.069333 60.074666a42.773333 42.773333 0 0 1-60.309334-2.069333L512 405.013333 244.522667 690.496a42.773333 42.773333 0 0 1-60.309334 2.069333 42.389333 42.389333 0 0 1-2.069333-60.074666l267.477333-285.482667z\",\"p-id\":\"1771\"},null,-1),Vg=[Wg];function jg(e,t){return C(),N(\"svg\",Hg,Vg)}var Gg=he(Yg,[[\"render\",jg]]);const zg={},Kg={t:\"1660284208062\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"1924\",width:\"128\",height:\"128\"},qg=d(\"path\",{d:\"M574.378667 676.992a85.546667 85.546667 0 0 1-124.757334 0L182.144 391.509333a42.389333 42.389333 0 0 1 2.069333-60.074666 42.773333 42.773333 0 0 1 60.309334 2.069333L512 618.986667l267.477333-285.482667a42.773333 42.773333 0 0 1 60.309334-2.069333c17.216 16 18.133333 42.901333 2.069333 60.074666L574.378667 676.992z\",\"p-id\":\"1925\"},null,-1),Jg=[qg];function Xg(e,t){return C(),N(\"svg\",Kg,Jg)}var Zg=he(zg,[[\"render\",Xg]]);const Qg={},ev={t:\"1660287979761\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"1495\",width:\"128\",height:\"128\"},tv=d(\"path\",{d:\"M773.214133 167.117045c-4.330056 0.2048-5.441827 0.146286-9.713368 0.760685a74.693464 74.693464 0 0 0-54.008671 36.86399 72.762493 72.762493 0 0 0-6.436569 55.64707c2.662399 9.215997 7.197255 17.876109 13.253482 25.365935 2.720914 3.335313 3.510856 4.037485 6.524341 7.109484l3.627884 3.218285c16.091424 13.37051 30.954048 27.999078 44.295302 44.061244a327.504364 327.504364 0 0 1 67.057352 134.495048 327.094764 327.094764 0 0 1-37.858732 241.429873 330.839677 330.839677 0 0 1-63.107639 76.185579 336.457047 336.457047 0 0 1-80.45712 53.365013 335.930418 335.930418 0 0 1-100.995628 29.374163 341.928131 341.928131 0 0 1-119.807966-5.997713 336.310761 336.310761 0 0 1-114.24911-49.971185 334.321276 334.321276 0 0 1-92.803631-96.051173 324.403107 324.403107 0 0 1-47.396557-127.795163 326.304821 326.304821 0 0 1 106.144884-290.201517c4.59337-4.008227 9.215997-7.899426 13.750853-11.907654 3.013485-3.071999 3.803427-3.744913 6.495084-7.080227a72.206608 72.206608 0 0 0-4.944456-96.343744 75.395636 75.395636 0 0 0-93.622831-10.503311c-6.085484 3.891199-11.468797 8.718626-16.852109 13.429025a475.633236 475.633236 0 0 0-98.8306 119.281337 470.07438 470.07438 0 0 0-31.012563 409.83394 474.521464 474.521464 0 0 0 76.214835 128.058478 481.455405 481.455405 0 0 0 257.638327 160.387611 493.86043 493.86043 0 0 0 189.849546 8.338284c58.485012-8.835655 115.185339-28.37942 166.473095-57.431755a484.498147 484.498147 0 0 0 126.800421-103.599514 473.263408 473.263408 0 0 0 72.99655-113.312882 473.087865 473.087865 0 0 0 38.590161-256.906898c-6.787655-51.785128-22.323194-102.399971-45.816673-149.211386a475.925807 475.925807 0 0 0-110.88454-143.65253c-3.832685-3.335313-7.753141-6.64137-11.644339-9.918169-3.36457-2.633142-4.154513-3.393828-7.811655-5.705141a75.775978 75.775978 0 0 0-22.206165-9.450054 91.808888 91.808888 0 0 0-14.39451-2.106514c-1.6384 0-3.218285 0-4.856685-0.058514m-186.836061 418.084452c0 19.39748-7.840912 38.005018-21.767308 51.726614a74.898264 74.898264 0 0 1-52.516556 21.416222 74.810493 74.810493 0 0 1-52.516556-21.416222 72.616208 72.616208 0 0 1-21.767309-51.726614V73.143129c0-19.426737 7.840912-38.005018 21.767309-51.755871A74.781236 74.781236 0 0 1 512.094208 0.000293c19.690052 0 38.59016 7.694626 52.516556 21.386965 13.926396 13.750853 21.767308 32.329134 21.767308 51.785128v512.029111z\",\"p-id\":\"1496\"},null,-1),nv=[tv];function sv(e,t){return C(),N(\"svg\",ev,nv)}var rv=he(Qg,[[\"render\",sv]]);const av={},ov={t:\"1661742094849\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2478\",width:\"128\",height:\"128\"},iv=d(\"path\",{d:\"M210.304 813.696a42.666667 42.666667 0 0 1 0-60.330667L753.365333 210.304a42.666667 42.666667 0 1 1 60.330667 60.330667L270.634667 813.696a42.666667 42.666667 0 0 1-60.330667 0z\",\"p-id\":\"2479\"},null,-1),lv=d(\"path\",{d:\"M210.304 210.304a42.666667 42.666667 0 0 1 60.330667 0l543.061333 543.061333a42.666667 42.666667 0 1 1-60.330667 60.330667L210.304 270.634667a42.666667 42.666667 0 0 1 0-60.330667z\",\"p-id\":\"2480\"},null,-1),uv=[iv,lv];function cv(e,t){return C(),N(\"svg\",ov,uv)}var y1=he(av,[[\"render\",cv]]);const dv={},fv=e=>(nt(\"data-v-70156d34\"),e=e(),st(),e),hv={t:\"1631799919469\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"3453\",width:\"128\",height:\"128\"},_v=fv(()=>d(\"path\",{d:\"M522.695111 1.991111c-26.339556 0.170667-47.416889 21.475556-47.672889 48.753778-0.284444 26.453333-0.056889 52.963556-0.056889 79.445333 0 27.249778-0.369778 54.528 0.113778 81.777778 0.483556 27.050667 22.016 47.132444 49.351111 46.904889a47.786667 47.786667 0 0 0 47.729778-47.445333c0.284444-53.76 0.284444-107.52-0.028444-161.251556-0.170667-27.676444-21.902222-48.355556-49.436445-48.184889m-195.896889 88.092445c-8.334222-14.222222-21.646222-21.276444-38.314666-21.333334-35.128889 0-56.576 36.949333-38.968889 68.152889a11616.995556 11616.995556 0 0 0 78.961777 137.614222 44.942222 44.942222 0 0 0 61.838223 16.896c21.304889-12.202667 29.667556-38.968889 17.379555-60.871111-26.453333-47.104-53.560889-93.866667-80.896-140.458666m-228.693333 234.524444c44.316444 25.799111 88.746667 51.342222 133.176889 76.970667 6.712889 3.896889 13.681778 6.912 21.703111 6.428444 20.138667 0.142222 35.953778-11.946667 41.301333-31.573333 5.006222-18.261333-2.673778-36.721778-20.224-46.990222-44.629333-26.026667-89.372444-51.882667-134.115555-77.710223-22.528-12.999111-47.815111-7.025778-59.818667 13.909334-12.231111 21.248-4.977778 45.624889 17.948444 58.965333m34.161778 235.975111c26.396444 0 52.821333 0.199111 79.217778-0.085333 23.409778-0.256 39.139556-16.412444 38.798222-39.139556-0.341333-21.617778-16.924444-37.347556-39.594666-37.376-51.655111-0.056889-103.310222-0.056889-154.965334 0.028445-24.177778 0.056889-40.704 15.985778-40.561778 38.684444 0.142222 22.186667 16.583111 37.745778 40.192 37.859556 25.656889 0.142222 51.285333 0.028444 76.913778 0m151.722667 100.238222a34.247111 34.247111 0 0 0-46.876445-12.942222 13764.778667 13764.778667 0 0 0-139.008 80.583111c-11.093333 6.485333-16.327111 16.867556-16.497777 25.372444 0.085333 30.549333 27.249778 47.957333 50.403555 35.072 47.160889-26.197333 93.724444-53.475556 140.145778-80.924444 17.180444-10.154667 21.504-30.378667 11.832889-47.160889m91.875555 101.660444c-14.250667-4.067556-27.619556 1.422222-35.84 15.644445a24375.466667 24375.466667 0 0 0-77.312 134.485333c-10.012444 17.550222-5.859556 35.669333 9.784889 45.027556 16.014222 9.557333 34.247111 4.039111 44.714667-13.994667 25.543111-44.088889 50.915556-88.263111 76.373333-132.352 3.299556-5.745778 5.688889-11.690667 5.745778-14.933333 0-17.834667-9.272889-29.866667-23.466667-33.877334m147.456 44.288c-16.384 0.085333-27.306667 11.918222-27.448888 30.151111-0.142222 25.372444-0.028444 50.716444-0.028445 76.060445h-0.085333c0 26.112-0.113778 52.252444 0.056889 78.364444 0.113778 18.261333 11.064889 30.065778 27.448889 30.208 16.952889 0.142222 28.046222-11.832889 28.103111-30.748444 0.113778-51.086222 0.142222-102.172444 0.056889-153.258667 0-18.773333-11.207111-30.862222-28.103112-30.776889m177.208889-26.112c-7.509333-12.8-21.902222-16.014222-33.792-8.874666a23.722667 23.722667 0 0 0-8.533333 32.995555c26.282667 46.279111 52.906667 92.330667 79.644444 138.353778 4.494222 7.765333 11.633778 11.946667 20.906667 11.804444 18.545778-0.142222 30.520889-19.342222 21.219556-35.868444-26.026667-46.392889-52.650667-92.444444-79.473778-138.410667m239.957333-41.187555c-45.283556-26.254222-90.595556-52.48-135.964444-78.648889-4.693333-2.702222-9.728-4.323556-15.36-2.958222-9.102222 2.247111-14.933333 8.049778-16.497778 17.095111-1.877333 10.894222 3.84 18.204444 12.885333 23.438222 29.809778 17.180444 59.562667 34.417778 89.344 51.598222 15.217778 8.789333 30.236444 17.976889 45.738667 26.225778 14.677333 7.793778 31.061333-2.048 31.061333-18.033778-0.056889-8.448-4.096-14.592-11.207111-18.716444m48.867556-234.638222c-24.888889-0.085333-49.749333 0-74.609778 0v-0.085334c-25.258667 0-50.517333-0.056889-75.776 0.028445-13.425778 0.056889-20.963556 6.343111-21.162667 17.294222-0.199111 11.150222 7.082667 17.521778 20.679111 17.550222 50.488889 0.113778 100.977778 0.142222 151.495112 0.085333 13.368889 0 21.191111-6.485333 21.390222-17.152 0.227556-10.808889-8.106667-17.664-22.016-17.720888m-187.960889-127.146667c45.084444-26.026667 90.140444-52.110222 135.168-78.222222 4.864-2.844444 8.248889-6.855111 8.135111-12.942223-0.142222-11.036444-11.207111-17.436444-21.504-11.548444-45.511111 26.055111-90.851556 52.394667-136.135111 78.819556-7.68 4.494222-10.524444 11.52-5.575111 19.569777 4.835556 7.850667 12.088889 8.817778 19.911111 4.323556m-122.311111-115.114667c5.205333-0.256 8.220444-3.413333 10.609778-7.651555 4.920889-8.647111 10.040889-17.208889 14.990222-25.827556 20.48-35.555556 40.931556-71.025778 61.297778-106.609778 5.091556-8.874667 3.015111-16.668444-4.778667-18.517333-7.68-1.848889-10.894222 3.697778-14.051556 9.159111l-68.778666 119.495111c-2.844444 4.977778-6.030222 9.870222-8.305778 15.104-3.128889 7.196444 1.678222 14.648889 9.045333 14.848\",\"p-id\":\"3454\"},null,-1)),pv=[_v];function mv(e,t){return C(),N(\"svg\",hv,pv)}var gv=he(dv,[[\"render\",mv],[\"__scopeId\",\"data-v-70156d34\"]]),vv={install(e){e.component(\"icon-disk\",q9),e.component(\"icon-nav\",tg),e.component(\"icon-info\",cg),e.component(\"icon-search\",mg),e.component(\"icon-star-off\",Dg),e.component(\"icon-star-on\",kg),e.component(\"icon-left\",Lg),e.component(\"icon-right\",Ug),e.component(\"icon-top\",Gg),e.component(\"icon-bottom\",Zg),e.component(\"icon-outlogin\",rv),e.component(\"icon-close\",y1),e.component(\"icon-loading\",gv)}};const yv={class:\"toips-container\"},bv=[\"onClick\"],Ev={key:1},kv=ue({__name:\"index\",setup(e){const t=ur(),n=be(()=>t.toips);return(s,r)=>{const a=ht(\"router-link\");return C(),N(\"div\",yv,[(C(!0),N(me,null,ct(n.value,o=>(C(),N(\"li\",{class:\"toips-item\",onClick:i=>o.f()},[o.path?(C(),Fe(a,{key:0,to:o.path},{default:Ue(()=>[Et(X(o.info),1)]),_:2},1032,[\"to\"])):(C(),N(\"span\",Ev,X(o.info),1))],8,bv))),256))])}}});var wv=he(kv,[[\"__scopeId\",\"data-v-d6bd3248\"]]);const Sv=ue({__name:\"main\",setup(e){const t=ur();return(n,s)=>{const r=ht(\"layout-header\"),a=ht(\"router-view\");return C(),N(\"div\",{id:\"main\",key:J(t).reloadCount},[Ie(r),Ie(a,null,{default:Ue(({Component:o,route:i})=>[(C(),Fe(sd,null,{default:Ue(()=>[(C(),Fe($i(o),{key:i.path}))]),_:2},1024))]),_:1}),Ie(wv)])}}}),Cv={id:\"page\",class:\"page-container\"},Tv={class:\"page-flex\"},Fv={class:\"page-sidebar\"},Dv=[\"onClick\"],Ov={class:\"page-main\"},Pv=ue({__name:\"page\",props:{menus:{type:Array,required:!0}},setup(e){return(t,n)=>{const s=ht(\"router-link\");return C(),N(\"div\",Cv,[d(\"div\",Tv,[d(\"div\",Fv,[(C(!0),N(me,null,ct(e.menus,r=>(C(),N(me,null,[r.path?(C(),Fe(s,{key:0,to:r.path},{default:Ue(()=>[d(\"span\",null,X(r.title),1)]),_:2},1032,[\"to\"])):pe(\"\",!0),r.fn?(C(),N(\"a\",{key:1,onClick:r.fn},[d(\"span\",null,X(r.title),1)],8,Dv)):pe(\"\",!0)],64))),256))]),d(\"div\",Ov,[Yt(t.$slots,\"default\")])])])}}}),b1=window.HostName||\"iStoreX\",Nv=(window==null?void 0:window.istoreXVer)||\"\";var E1={HostName:b1};console.log(\"\".concat(`%c OpenWrt-${b1}_iStoreX v${Nv}`),\"color: #fadfa3; background: #030307; padding:5px 0;\");const k1=e=>(nt(\"data-v-ab2441f8\"),e=e(),st(),e),Iv={class:\"logo\"},Av=[\"href\"],Lv={key:0,class:\"nav-item ota-upgrade\",target:\"_blank\",href:\"/cgi-bin/luci/admin/system/ota\"},Mv=k1(()=>d(\"span\",null,\"\\u56FA\\u4EF6\\u66F4\\u65B0\",-1)),xv=k1(()=>d(\"em\",null,null,-1)),$v=[Mv,xv],Rv=ue({__name:\"nav\",setup(e){ur();const t=le(!1),n=be(()=>[{name:\"\\u8DEF\\u7531\\u72B6\\u6001\",path:\"/router/index\"},{name:\"\\u7F51\\u7EDC\\u914D\\u7F6E\",path:\"/router/network\"},{name:\"\\u8FDC\\u7A0BDDNS\",path:\"/router/ddns\"},{name:\"\\u5B58\\u50A8\\u7BA1\\u7406\",path:\"/router/disk\"},{name:\"\\u529F\\u80FD\\u914D\\u7F6E\",path:\"/router/setting\"},{name:\"\\u5E94\\u7528\\u5546\\u5E97\",path:\"/router/istore\"},{name:\"\\u9AD8\\u7EA7\\u914D\\u7F6E\",href:\"/cgi-bin/luci/admin/quickstart/\"}]);return(()=>te(this,null,function*(){try{const r=yield oe.System.CheckUpdate.GET(),{result:a}=r.data;a&&(t.value=a.needUpdate)}catch(r){console.log(r)}}))(),(r,a)=>{const o=ht(\"router-link\");return C(),N(\"nav\",null,[d(\"div\",Iv,X(J(E1).HostName),1),(C(!0),N(me,null,ct(n.value,i=>(C(),N(me,null,[i.path?(C(),Fe(o,{key:0,class:\"nav-item\",to:i.path},{default:Ue(()=>[d(\"span\",null,X(i.name),1)]),_:2},1032,[\"to\"])):pe(\"\",!0),i.href?(C(),N(\"a\",{key:1,class:\"nav-item\",target:\"_blank\",href:i.href},[d(\"span\",null,X(i.name),1)],8,Av)):pe(\"\",!0)],64))),256)),t.value?(C(),N(\"a\",Lv,$v)):pe(\"\",!0)])}}});var Bv=he(Rv,[[\"__scopeId\",\"data-v-ab2441f8\"]]);const xt=e=>(nt(\"data-v-0003d2de\"),e=e(),st(),e),Uv={class:\"tool\"},Yv=xt(()=>d(\"div\",{class:\"tool-item_icon\"},[d(\"svg\",{t:\"1654872227326\",class:\"icon\",viewBox:\"0 0 1070 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"18915\",width:\"128\",height:\"128\"},[d(\"path\",{d:\"M616.56114032 913.71326004h-10.78499707c-0.00697165 0 4.88008933 1.06316208 10.78499706 0z m194.47155643-0.01045789c-28.60778047 0.01045706-31.10708332-23.73117654-31.28137207-29.83825964v-36.61809823h-142.70078101v35.18544369c0 23.05842188-11.4333522 29.67094253-20.48591711 31.27091418\",fill:\"#F0F0FF\",\"p-id\":\"18916\"}),d(\"path\",{d:\"M610.47497217 928.2489541c-5.85959326 0-12.22462327-1.32110979-15.86029011-6.17679877l-16.69339104-22.29852201h37.23508135c2.98731171-0.70412751 7.94757376-3.1650867 7.94757377-17.33825994v-49.12855499h170.58700443v50.34160629c0.54378122 15.96137778 12.92875076 16.11126617 17.20928649 16.11126617h0.12548804l0.00697165 27.88622343h-0.01742871c-21.89068588 0-44.35303958-13.4132742-45.20357007-43.38399272l-0.00697165-0.39389282v-22.67498611h-114.81455594v21.24233075c0 35.45036225-22.30549365 43.2724488-31.95412756 44.99093766v0.01045705c-2.35638611 0.42177942-5.38552688 0.81218601-8.56107065 0.81218602z\",fill:\"#6E6E96\",\"p-id\":\"18917\"}),d(\"path\",{d:\"M458.17784421 794.47525079V479.73040964c0-21.50027847 17.58923602-39.09300073 39.09648614-39.09299991h422.25320764c21.50725013 0 39.09997238 17.59272143 39.09997156 39.09299991v314.74135574\",fill:\"#9F9FBD\",\"p-id\":\"18918\"}),d(\"path\",{d:\"M958.63099579 763.19387873v44.95259398c0 21.51073636-17.59969309 39.10694403-39.09997238 39.10694321H497.27433035c-21.50376471 0-39.09648614-17.60666473-39.09648614-39.10694321V763.19387873h500.45315158z\",fill:\"#F0F0FF\",\"p-id\":\"18919\"}),d(\"path\",{d:\"M919.53102341 861.19304263H497.27433035c-29.2456777 0-53.03959826-23.79740679-53.03959826-53.05005615V749.2507666h528.33937582v58.89570612c0 29.24916311-23.79392056 53.04656992-53.0430845 53.04656991zM472.12095633 777.13699084v31.00948187c0 13.87339645 11.2834638 25.16383191 25.15337402 25.1638311H919.53102341c13.86991103 0 25.15686025-11.28694922 25.15686026-25.1638311v-31.00948187h-472.56692734z\",fill:\"#6E6E96\",\"p-id\":\"18920\"}),d(\"path\",{d:\"M472.12095633 794.47525079h-27.88622424V479.73040964c0-29.2456777 23.79392056-53.03611286 53.03959826-53.03611203h422.25320764c29.24916311 0 53.0430845 23.79043515 53.04308369 53.03611203v314.74135574h-27.88622425V479.73040964c0-13.86991103-11.2834638-25.14988861-25.15685944-25.14988779H497.27433035c-13.86991103 0-25.15337403 11.27997757-25.15337402 25.14988779v314.74484115z\",fill:\"#6E6E96\",\"p-id\":\"18921\"}),d(\"path\",{d:\"M458.17784421 744.17198816h500.44617993v11.03945938H458.17784421zM637.0540299 847.24644427h142.70078019v24.94771326h-142.70078019z\",fill:\"#6E6E96\",\"p-id\":\"18922\"}),d(\"path\",{d:\"M821.84906582 927.65637216h-241.2576686a13.94311212 13.94311212 0 0 1 0-27.88622423h241.2576686a13.94311212 13.94311212 0 0 1 0 27.88622424z\",fill:\"#6E6E96\",\"p-id\":\"18923\"}),d(\"path\",{d:\"M919.53102341 817.88922183H497.27433035c-21.50376471 0-39.09648614-17.59969309-39.09648614-39.10345779v26.0945343c0 21.50027847 17.58574978 39.09997238 39.09648614 39.09997238H919.53102341c21.50027847 0 39.10345779-17.59272143 39.10345779-39.09997238v-26.0945343c-0.00348542 21.517708-17.61015097 39.10345779-39.10345779 39.10345779z\",fill:\"#6E6E96\",\"p-id\":\"18924\"}),d(\"path\",{d:\"M512.22134677 487.62221103h396.47936426v229.11670432H512.22134677z\",fill:\"#A2C8F2\",\"p-id\":\"18925\"}),d(\"path\",{d:\"M653.79970709 714.00257971l250.40435038-226.38036868v73.11070843l-166.0798938 153.26966025z\",fill:\"#DEEFFF\",\"p-id\":\"18926\"}),d(\"path\",{d:\"M904.20405747 560.73291946l-166.0798938 153.26966025h166.0798938z\",fill:\"#FFFFFF\",\"p-id\":\"18927\"}),d(\"path\",{d:\"M908.70071103 730.68551288H512.22134677a13.94311212 13.94311212 0 0 1-13.94311212-13.94311212v-229.11670349a13.94311212 13.94311212 0 0 1 13.94311212-13.94311212h396.47936426a13.94311212 13.94311212 0 0 1 13.94311212 13.94311212v229.11670349a13.94311212 13.94311212 0 0 1-13.94311212 13.94311212z m-382.53625214-27.88622425h368.59314002v-201.23047924H526.16445889v201.23047924z\",fill:\"#6E6E96\",\"p-id\":\"18928\"}),d(\"path\",{d:\"M427.31825156 436.74379516c0 17.12911295-14.01282779 31.15588403-31.14194074 31.15588404H258.11858637c-17.1221413 0-31.14194074-14.0163132-31.14194074-31.15588404v-296.04712774c0-17.12911295 14.0163132-31.14542697 31.14194073-31.14542615H396.17631082c17.12911295 0 31.14194074 14.0163132 31.14194074 31.14542615v296.04712774z\",fill:\"#F0F0FF\",\"p-id\":\"18929\"}),d(\"path\",{d:\"M427.31825156 436.74379516c0 17.12911295-14.01282779 31.15588403-31.14194074 31.15588404H258.11858637c-17.1221413 0-31.14194074-14.0163132-31.14194074-31.15588404v-296.04712774c0-17.12911295 14.0163132-31.14542697 31.14194073-31.14542615H396.17631082c17.12911295 0 31.14194074 14.0163132 31.14194074 31.14542615v296.04712774z\",fill:\"#FFFFFF\",\"p-id\":\"18930\"}),d(\"path\",{d:\"M226.97315939 172.01289774h200.35206382v257.6896257H226.97315939z\",fill:\"#B4D1F2\",\"p-id\":\"18931\"}),d(\"path\",{d:\"M236.25578625 429.70252344l191.06246531-191.07640779v64.35791951L300.59976327 429.70252344z\",fill:\"#DEEFFF\",\"p-id\":\"18932\"}),d(\"path\",{d:\"M427.31825156 302.98403516L300.59976327 429.70252344h126.71848829z\",fill:\"#FFFFFF\",\"p-id\":\"18933\"}),d(\"path\",{d:\"M226.97315939 397.73793882h200.34509217v27.88622424H226.97315939z\",fill:\"#6E6E96\",\"p-id\":\"18934\"}),d(\"path\",{d:\"M229.07508402 216.7528585l47.87716085-57.25041835H362.81741532L230.36830723 301.32131867z\",fill:\"#FFFFFF\",\"p-id\":\"18935\"}),d(\"path\",{d:\"M404.10994128 159.50244015L233.14995816 330.45545163l-0.20217535 24.4597044 195.40923047-195.41271588z\",fill:\"#FFFFFF\",\"p-id\":\"18936\"}),d(\"path\",{d:\"M396.17631082 481.83930591H258.11858637c-30.33672637 0-45.08505286-14.75181272-45.08505286-45.09899616v-296.04712774c0-30.34021179 14.74832648-45.08853909 45.08505285-45.0885391H396.17631082c30.33672637 0 45.08505286 14.74832648 45.08505286 45.0885391v296.04712774c0 30.34718345-14.74832648 45.09899615-45.08505286 45.09899616zM258.11858637 123.49435339c-14.95050183 0-17.19882862 2.25181219-17.19882862 17.20231403v296.04712774c0 14.96095889 2.25181219 17.21277191 17.19882861 17.21277192H396.17631082c14.95050183 0 17.19882862-2.25181219 17.19882861-17.21277192v-296.04712774c0-14.95050183-2.25181219-17.20231485-17.19882861-17.20231403H258.11858637z\",fill:\"#6E6E96\",\"p-id\":\"18937\"}),d(\"path\",{d:\"M226.97315939 150.84725349h200.34509217v27.88622423H226.97315939z\",fill:\"#6E6E96\",\"p-id\":\"18938\"}),d(\"path\",{d:\"M185.52028714 757.89549622H149.7422615a13.94311212 13.94311212 0 0 1 0-27.88622425h35.77802564a13.94311212 13.94311212 0 0 1 0 27.88622425z\",fill:\"#6E6E96\",\"p-id\":\"18939\"}),d(\"path\",{d:\"M125.32787241 876.34920522v-292.89249892c0-21.09244317 10.49916357-23.86712246 23.33379831-23.86712164h378.63915215c12.83463473 0 23.33728372 2.78513635 23.33728373 23.86712164v292.89249892\",fill:\"#B9BCC9\",\"p-id\":\"18940\"}),d(\"path\",{d:\"M527.30430828 566.06964563H148.66515613c-12.83463473 0-23.33728372 2.77467929-23.33728372 23.86712246v19.04629093c0-21.09592859 10.50264898-23.87060788 23.33728371-23.87060788h378.63915216c12.83114933 0 23.34076996 2.78862259 23.34076997 23.87060788v-19.04629093c0-21.08198529-10.50962063-23.86712246-23.34076996-23.86712246z\",fill:\"#FFFFFF\",\"p-id\":\"18941\"}),d(\"path\",{d:\"M561.66710809 873.83595908h-27.88622424v-290.39319526c0-9.92401035-0.52983792-9.92401035-9.39765702-9.92401034H151.58972382c-9.39765784 0-9.39765784 0.56120993-9.39765784 9.92401034v290.39319526h-27.88622342v-290.39319526c0-25.08714458 12.545315-37.81023459 37.28388126-37.81023459H524.38322683c24.74205249 0 37.28388208 12.71960376 37.28388127 37.81023459v290.39319526z\",fill:\"#6E6E96\",\"p-id\":\"18942\"}),d(\"path\",{d:\"M559.90679016 867.71841892H393.74672363v15.99274978H276.45377896v-15.99274978H117.39772735a13.37144431 13.37144431 0 0 0-13.32961523 13.32264358v34.65211954h469.16829327v-34.64863412a13.36795889 13.36795889 0 0 0-13.32961523-13.326129z\",fill:\"#B9BCC9\",\"p-id\":\"18943\"}),d(\"path\",{d:\"M559.90679016 862.00522864H393.74672363v15.9962352H276.45377896v-15.9962352H117.39772735a13.36795889 13.36795889 0 0 0-13.32961523 13.32612983v20.953011a13.37144431 13.37144431 0 0 1 13.32961524-13.33310064h159.0560516v16.00669309h117.29294467v-16.00669309h166.15658111a13.37144431 13.37144431 0 0 1 13.326129 13.33310064v-20.953011a13.35053018 13.35053018 0 0 0-13.32264358-13.32612983z\",fill:\"#FFFFFF\",\"p-id\":\"18944\"}),d(\"path\",{d:\"M173.14577548 601.65595379h329.98814813v222.86670365H173.14577548z\",fill:\"#8CBDF2\",\"p-id\":\"18945\"}),d(\"path\",{d:\"M279.39228913 814.06183752l217.77049649-204.02607348v59.87172381l-144.43321235 144.15434967z\",fill:\"#DEEFFF\",\"p-id\":\"18946\"}),d(\"path\",{d:\"M497.16278562 669.90748785l-144.43321235 144.15434967h144.43321235z\",fill:\"#FFFFFF\",\"p-id\":\"18947\"}),d(\"path\",{d:\"M503.13392361 838.46576956H173.14577548a13.94311212 13.94311212 0 0 1-13.94311212-13.94311212v-222.86670365a13.94311212 13.94311212 0 0 1 13.94311212-13.94311212h329.98814813a13.94311212 13.94311212 0 0 1 13.94311213 13.94311212v222.86670365a13.94311212 13.94311212 0 0 1-13.94311213 13.94311212z m-316.045036-27.88622424h302.10192389v-194.9804794H187.0888876v194.9804794z\",fill:\"#6E6E96\",\"p-id\":\"18948\"}),d(\"path\",{d:\"M173.14577548 601.65595379h324.02049637v23.37562739H173.14577548zM104.07159753 899.06602042h469.17177952v16.63761867H104.07159753z\",fill:\"#6E6E96\",\"p-id\":\"18949\"}),d(\"path\",{d:\"M573.23640539 929.63977957H104.06811212a13.94311212 13.94311212 0 0 1-13.94311212-13.94311211v-34.65211955c0-15.03416079 12.23508115-27.26575571 27.27272736-27.2657557h159.0560516a13.94311212 13.94311212 0 0 1 13.94311212 13.94311212v2.04963767h89.40672044v-2.04963767a13.94311212 13.94311212 0 0 1 13.94311211-13.94311212h166.15658112c15.03764621 0 27.27272736 12.23508115 27.27272736 27.26924194v34.64863331c0.00348542 7.70008392-6.23954278 13.94311212-13.93962672 13.94311211z m-455.22518115-27.88622424h441.28206904v-20.0920243H407.68983575v2.04963767a13.94311212 13.94311212 0 0 1-13.94311212 13.94311212H276.45377896a13.94311212 13.94311212 0 0 1-13.94311212-13.94311212v-2.04963767H118.01122424v20.0920243z\",fill:\"#6E6E96\",\"p-id\":\"18950\"}),d(\"path\",{d:\"M699.94792285 373.26429193c-45.72992175-77.71193509-122.75515887-130.53541552-211.32180752-144.92470743l4.4722532-27.52370342c96.78262719 15.724345 180.93279419 73.42094228 230.88050766 158.30660879l-24.03095334 14.14180205zM138.3646825 505.03018664h-27.88622425c0-62.44422775 17.55437778-123.22573901 50.76687113-175.76338513l23.5743165 14.89821488c-30.39249875 48.0758508-46.45496338 103.7018963-46.45496338 160.86517025z\",fill:\"#6E6E96\",\"p-id\":\"18951\"})])],-1)),Hv={class:\"tool-item_name\"},Wv=xt(()=>d(\"span\",{class:\"t\"},null,-1)),Vv={class:\"b\"},jv={class:\"tool-item_icon\"},Gv={t:\"1654871923674\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"1414\",width:\"128\",height:\"128\",style:{padding:\"5px\"}},zv=xt(()=>d(\"path\",{d:\"M247.466667 76.8h25.6l51.2 307.2h-25.6L247.466667 76.8zM762.453333 76.8h25.6L742.4 385.706667h-25.6L762.453333 76.8z\",fill:\"#96CAFF\",\"p-id\":\"1415\"},null,-1)),Kv=xt(()=>d(\"path\",{d:\"M275.2 409.6H324.266667L256.938667 51.2H230.4zM230.4 25.6h26.538667a25.6 25.6 0 0 1 25.173333 20.906667l67.242667 358.4A25.6 25.6 0 0 1 324.266667 435.2h-49.066667a25.6 25.6 0 0 1-25.6-22.442667L204.8 54.357333A25.6 25.6 0 0 1 227.242667 25.6zM785.066667 51.2l-44.885334 358.4H691.2l67.242667-358.4z m0-25.6h-26.624a25.6 25.6 0 0 0-25.173334 20.906667l-67.157333 358.4A25.6 25.6 0 0 0 691.2 435.2h48.981333a25.6 25.6 0 0 0 25.6-22.442667l44.885334-358.4A25.6 25.6 0 0 0 788.138667 25.6z\",fill:\"#175AA7\",\"p-id\":\"1416\"},null,-1)),qv=xt(()=>d(\"path\",{d:\"M59.733333 665.6h930.133334a8.533333 8.533333 0 0 1 8.533333 8.533333v162.133334a8.533333 8.533333 0 0 1-8.533333 8.533333H59.733333a8.533333 8.533333 0 0 1-8.533333-8.533333V674.133333a8.533333 8.533333 0 0 1 8.533333-8.533333z\",fill:\"#96CAFF\",\"p-id\":\"1417\"},null,-1)),Jv=xt(()=>d(\"path\",{d:\"M460.8 768h25.6v-25.6h-25.6z m-25.6-51.2h76.8v76.8h-76.8zM716.8 768h25.6v-25.6h-25.6z m-25.6-51.2h76.8v76.8h-76.8zM588.8 768h25.6v-25.6h-25.6z m-25.6-51.2h76.8v76.8h-76.8zM844.8 768h25.6v-25.6h-25.6z m-25.6-51.2h76.8v76.8h-76.8z\",fill:\"#175AA7\",\"p-id\":\"1418\"},null,-1)),Xv=xt(()=>d(\"path\",{d:\"M153.6 844.8h68.693333l-25.6 76.8H179.2l-25.6-76.8z\",fill:\"#96CAFF\",\"p-id\":\"1419\"},null,-1)),Zv=xt(()=>d(\"path\",{d:\"M203.434667 844.8h8.533333l12.629333 17.493333-2.730666 8.106667h-26.965334z m-74.069334 0h-8.533333l-12.629333 17.493333 2.730666 8.106667h26.965334z m17.066667 51.2h39.936l8.533333-25.6h-57.002666zM102.4 844.8h128l-25.6 76.8h-76.8z\",fill:\"#175AA7\",\"p-id\":\"1420\"},null,-1)),Qv=xt(()=>d(\"path\",{d:\"M844.8 844.8h68.693333l-25.6 76.8H870.4l-25.6-76.8z\",fill:\"#96CAFF\",\"p-id\":\"1421\"},null,-1)),ey=xt(()=>d(\"path\",{d:\"M913.066667 870.4l2.730666-8.106667-12.629333-17.493333h-8.533333l-8.533334 25.6z m-92.501334-25.6h-8.533333l-12.629333 17.493333 2.730666 8.106667h26.965334z m17.066667 51.2h39.936l8.533333-25.6h-57.002666zM793.6 844.8h128l-25.6 76.8h-76.8zM204.8 768h25.6v25.6h-25.6zM281.6 768h25.6v25.6h-25.6zM128 768h25.6v25.6h-25.6zM358.4 768h25.6v25.6h-25.6zM204.8 716.8h25.6v25.6h-25.6zM281.6 716.8h25.6v25.6h-25.6zM128 716.8h25.6v25.6h-25.6zM358.4 716.8h25.6v25.6h-25.6z\",fill:\"#175AA7\",\"p-id\":\"1422\"},null,-1)),ty=xt(()=>d(\"path\",{d:\"M69.12 640l176.128-249.941333A76.8 76.8 0 0 1 307.2 358.4h441.6A76.8 76.8 0 0 1 810.666667 390.058667L986.026667 640\",fill:\"#B3D9FF\",\"p-id\":\"1423\"},null,-1)),ny=xt(()=>d(\"path\",{d:\"M742.4 358.4l187.050667 256.597333h57.941333L805.290667 358.4H742.4z\",fill:\"#96CAFF\",\"p-id\":\"1424\"},null,-1)),sy=xt(()=>d(\"path\",{d:\"M51.2 640a25.6 25.6 0 0 0-25.6 25.6v153.6a25.6 25.6 0 0 0 25.6 25.6h921.6a25.6 25.6 0 0 0 25.6-25.6V665.6a25.6 25.6 0 0 0-25.6-25.6z m0-25.6h921.6a51.2 51.2 0 0 1 51.2 51.2v153.6a51.2 51.2 0 0 1-51.2 51.2H51.2a51.2 51.2 0 0 1-51.2-51.2V665.6a51.2 51.2 0 0 1 51.2-51.2z\",fill:\"#175AA7\",\"p-id\":\"1425\"},null,-1)),ry=xt(()=>d(\"path\",{d:\"M167.936 451.84L186.197333 426.666667l15.786667-21.674667A51.2 51.2 0 0 1 243.370667 384h536.149333a51.2 51.2 0 0 1 41.386667 21.077333L985.429333 640h31.232L841.642667 390.058667A76.8 76.8 0 0 0 779.52 358.4H243.370667a76.8 76.8 0 0 0-62.122667 31.658667l-34.133333 47.104L5.12 640h31.232z\",fill:\"#175AA7\",\"p-id\":\"1426\"},null,-1)),ay=[zv,Kv,qv,Jv,Xv,Zv,Qv,ey,ty,ny,sy,ry],oy={class:\"tool-item_name\"},iy={class:\"t\"},ly={key:0},uy={key:1},cy={key:2},dy={key:4},fy={class:\"b\"},hy={class:\"tool-item\"},_y=S3('<div class=\"tool-item_icon\" data-v-0003d2de><svg class=\"icon\" viewBox=\"0 0 1024 1024\" version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\" width=\"128\" height=\"128\" data-v-0003d2de><path d=\"M122 512a390 390 0 1 0 780 0 390 390 0 1 0-780 0z\" fill=\"#37BBEF\" data-v-0003d2de></path><path d=\"M645.3 225.6c53.2 0 104.5 7.6 153.1 21.8C727.2 170.3 625.2 122 512 122c-215.4 0-390 174.6-390 390 0 27 2.7 53.3 8 78.8 74.6-212.7 277.1-365.2 515.3-365.2z\" fill=\"#3ED6FF\" data-v-0003d2de></path><path d=\"M632.4 141c104.4 71.7 170.2 176.7 170.2 293.6 0 216.2-225.1 391.5-502.8 391.5-6.5 0-13.1-0.1-19.5-0.3C345.1 873.7 425.2 902 512 902c215.4 0 390-174.6 390-390 0-173.4-113.1-320.3-269.6-371z\" fill=\"#3495C6\" data-v-0003d2de></path><path d=\"M638.5 523.6s-14.4-8.6-23.9-11.5c-9.6-2.9-4.8-17.2-4.8-17.2s5.7 8.6 22 11.5 43.1 6.7 50.7 16.3c7.7 9.6 8.6 15.3 12.4 19.1 3.8 3.8 6.7 13.4 6.7 13.4s-15.8-2.5-19.1-9.6c-3.3-7.1-6.7-18.2-9.6-15.3-2.9 2.9-1 13.4-11.5 13.4s-13.4-9.6-21-11.5-1.9-8.6-1.9-8.6z m-43-199l26.8-4.8 13.4-14.4-3.8-13.4 5.7-21-7.7-11.5s0-22-8.6-25.8-5.7-27.7-5.7-27.7l1-4.8-9.6 8.6 5.7 24.9 8.6 24.9 1 43.1-20.1 12.3-15.3 20.1 8.6-10.5z m20.1-48.8l-5.7-7.7-6.7 1-1.9 12.4 6.7 1 7.6-6.7z m75.5 330s-1-17.2-8.6-17.2-10.5-19.1-10.5-19.1l-15.3-16.3s0 23.9 1 27.7c1 3.8-10.5 9.6-13.4 7.7-2.9-1.9-13.4-18.2-13.4-18.2s4.3-9.1-1.9-8.6c-0.6 0-1 0.1-1.2 0.2-1.5-0.2-4.1-0.6-8.3-1.1l-19.8-2.4-2.2 8.1s-11.5 9.6-18.2 12.4c-6.7 2.9-14.4 30.6-23 30.6s-21 1-21 1-15.3 25.8-10.5 35.4c4.8 9.6 6.7 19.1 5.7 30.6s1 9.6 17.2 6.7c16.3-2.9 29.7-24.9 47.8-21 18.2 3.8 23.9 22 23.9 22l15.3-13.4s-1.9 9.6-4.8 10.5 2.9 1.9 6.7 8.6c3.8 6.7 24.8 16.2 51.7-9.6 26.9-25.7 17.2-47.8 17.2-47.8l-14.4-26.8z m-420-22.9c1.9-18.2-8.6-13.4-7.7-39.2 1-25.8 36.4-86.1 33.5-86.1-2.9 0-19.1 12.4-24.9 11.5-5.7-1-30.6-57.4-30.6-66 0-8.6-6.7-41.1-6.7-41.1s7.7 22 13.4 23 7.7 24.9 12.4 36.4 20.1 30.6 29.7 29.7c9.6-1 39.2-54.5 39.2-54.5l-16.3-9.6-17.1 10.3s-4.8-11.5-10.5-18.2c-5.7-6.7-4.8-23-1-23s8.1 11.1 27.7 23.9c19.6 12.8 37.3 0 41.1 2.9 3.8 2.9 19.1 15.3 20.1 23 1 7.7 20.1 60.3 23 64.1 2.9 3.8 14.4-13.4 19.1-35.4 4.8-22 27.7-32.5 35.4-38.3 7.7-5.7 6.7 6.7 11.5 18.2s17.2 18.2 23 23c5.7 4.8 1 20.1 10.5 20.1 9.6 0 17.2-16.3 17.2-16.3l-6.7-18.2c-6.7-18.2 2.9-20.1 11.5-23.9 8.6-3.8 23.9-18.2 34.4-34.4 10.5-16.3-8.6-31.6-14.4-45.9-5.7-14.4 6.7-13.4 13.4-14.4s13.4 37.3 13.4 37.3l12.4-6.7s-2.9-12.4-8.6-23.9 7.7-11.5 23.9-28.7c16.3-17.2 7-25.4 7.7-46.9S580 216.5 580 216.5s-4.8 7.7 1-19.1c5.7-26.8 45-11.5 54.5-12.4 7.5-0.8 16.9-19.3 20.5-27.2-44.7-18.3-93.7-28.4-145-28.4-204.4 0-371.4 160.2-382.1 362 4.7 2.5 10.8 5.2 17.7 6.5 15.3 2.9 8.6 26.8 9.6 39.2 1 12.4 3.8 25.8 9.6 38.3 5.7 12.4-1.9 20.1-4.8 28.7-2.9 8.6 3.8 22 9.6 22s-10.5 29.7 7.7 60.3 45-2.9 57.4-46.9c12.5-44.2 33.5-38.4 35.4-56.6zM518 499.6l7.7 15.3 16.3 7.7s5.7-23 15.3-34.4c9.6-11.5-5.7-22-12.4-23.9L518 499.6z m159.2-262.2c0.6 1.9 1.5 2.9 1.5 2.9s-0.6-1.1-1.5-2.9zM562.3 547.1c-5-1.5-13.1-3.8-25.2-7.2-30.6-8.6-23-5.7-33.5-12.4s-1-9.6 1-18.2c1.9-8.6-9.6-36.4-9.6-36.4l-11.5-9.6-2.9 17.2-12.4 3.8 15.3 36.4s25.8 22 42.1 29.7c9.7 4.5 25.5 0.6 36.7-3.3zM285.5 649.9s15.3-27.7 18.2-41.1c2.9-13.4-1.9-34.4-1.9-34.4s-20.1 15.3-16.3 17.2c3.8 1.9-5.7 10.5-7.7 25.8-1.9 15.2 7.7 32.5 7.7 32.5zM670.6 164c-8.4 10.3-19.7 25.1-19.7 30.5 0 8.6 13.4 8.6 14.4 15.3 0.7 5.2 8.6 21.1 11.9 27.7-0.8-2.5-1.2-6.5 1.5-11.4 4.8-8.6 5.7-28.7 1-37.3-2.3-4.1 0.6-11.5 4.2-18.3-4.4-2.3-8.8-4.5-13.3-6.5z m-99.5 379.7c2.7-1.1 4.3-1.9 4.3-1.9s-2.2 0.8-4.3 1.9z m-3.4 4.7c-2.8-1.1 0.3-3.2 3.4-4.8-2.3 1-5.3 2.2-8.8 3.4 7.7 2.4 8.3 2.6 5.4 1.4z\" fill=\"#E8EEEF\" data-v-0003d2de></path></svg></div>',1),py={class:\"tool-item_name\"},my=[\"href\"],gy=ue({__name:\"tool\",setup(e){const t=it.stampForm;it.stampForm;const n=it.byteToSize,s=ur(),r=be(()=>s.network),a=be(()=>s.device),o=be(()=>s.updown);return(i,l)=>{const u=ht(\"router-link\");return C(),N(\"div\",Uv,[Ie(u,{class:\"tool-item\",to:\"/router/device/list\",title:\"\\u67E5\\u770B\\u5F53\\u524D\\u8FDE\\u63A5\\u8BBE\\u5907\"},{default:Ue(()=>[Yv,d(\"div\",Hv,[d(\"span\",null,X(a.value.devices.length),1)])]),_:1}),d(\"em\",null,[Wv,d(\"span\",Vv,X(J(t)(r.value.uptimeStamp)),1)]),Ie(u,{class:\"tool-item\",to:\"/router/device/interface\",title:\"\\u67E5\\u770B\\u5F53\\u524D\\u63A5\\u53E3\"},{default:Ue(()=>{var c;return[d(\"div\",jv,[(C(),N(\"svg\",Gv,ay))]),d(\"div\",oy,[d(\"span\",null,X(((c=r.value.defaultInterface)==null?void 0:c.toLocaleUpperCase())||\"--\"),1)])]}),_:1}),d(\"em\",null,[d(\"span\",iy,[r.value.networkInfo==\"netSuccess\"?(C(),N(\"span\",ly,\" \\u5DF2\\u8054\\u7F51 \")):r.value.networkInfo==\"dnsFailed\"?(C(),N(\"span\",uy,\" DNS\\u9519\\u8BEF \")):r.value.networkInfo==\"softSourceFailed\"?(C(),N(\"span\",cy,\" \\u8F6F\\u4EF6\\u6E90\\u89E3\\u6790\\u9519\\u8BEF \")):(C(),N(\"span\",dy,\" \\u68C0\\u6D4B\\u4E2D \"))]),d(\"span\",fy,\" \\u4E0A\\u4F20: \"+X(J(n)(o.value.up))+\" \\uFF5C \\u4E0B\\u8F7D: \"+X(J(n)(o.value.download)),1)]),d(\"div\",hy,[_y,d(\"div\",py,[d(\"a\",{href:r.value.ipv4addr},[d(\"span\",null,X(r.value.ipv4addr||\"--\"),1)],8,my)])])])}}});var vy=he(gy,[[\"__scopeId\",\"data-v-0003d2de\"]]);const yy={class:\"header-desktop\"},by=ue({__name:\"header\",setup(e){const t=le(!1);return D9().afterEach(()=>{t.value=!1}),(s,r)=>(C(),N(\"header\",yy,[Ie(Bv),Ie(vy)]))}});var Ey=he(by,[[\"__scopeId\",\"data-v-5fdbc26a\"]]);const ky={};function wy(e,t){const n=ht(\"router-view\");return C(),Fe(n,{name:\"default\"},{default:Ue(({Component:s,route:r})=>[(C(),Fe(sd,null,{default:Ue(()=>[(C(),Fe($i(s),{key:r.path}))]),fallback:Ue(()=>[]),_:2},1024))]),_:1})}var Sy=he(ky,[[\"render\",wy],[\"__scopeId\",\"data-v-b888f30a\"]]);const Cy={};function Ty(e,t){return C(),N(\"section\",null,[Yt(e.$slots,\"default\",{},void 0,!0)])}var Fy=he(Cy,[[\"render\",Ty],[\"__scopeId\",\"data-v-6a6bc058\"]]);const Dy={class:\"section-title\"},Oy=ue({__name:\"section-title\",props:{title:{type:String,default:\"\"}},setup(e){return(t,n)=>(C(),N(\"div\",Dy,[d(\"span\",null,X(e.title),1),Yt(t.$slots,\"default\",{},void 0,!0)]))}});var Py=he(Oy,[[\"__scopeId\",\"data-v-5cb5900e\"]]);const Ny={},Iy={class:\"section-container\"};function Ay(e,t){return C(),N(\"div\",Iy,[Yt(e.$slots,\"default\",{},void 0,!0)])}var Ly=he(Ny,[[\"render\",Ay],[\"__scopeId\",\"data-v-790a0322\"]]);const My={},xy={class:\"section-item\"};function $y(e,t){return C(),N(\"div\",xy,[Yt(e.$slots,\"default\",{},void 0,!0)])}var Ry=he(My,[[\"render\",$y],[\"__scopeId\",\"data-v-abe9a852\"]]),By={install(e){e.component(\"layout-main\",Sv),e.component(\"layout-page\",Pv),e.component(\"layout-header\",Ey),e.component(\"router-loading\",Sy),e.component(\"nas-section\",Fy),e.component(\"nas-section-title\",Py),e.component(\"nas-section-container\",Ly),e.component(\"nas-section-item\",Ry)}},Gs;class bl{constructor(){Pl(this,Gs,void 0)}install(t){Nl(this,Gs,t)}openWindow(t,n){const s=document.createElement(\"div\"),r=Ie(t,fr(gt({},n),{close:()=>{Ta(null,s),s.remove()}}));po(this,Gs)&&(r.appContext=po(this,Gs)._context),Ta(r,s),document.body.appendChild(s)}}Gs=new WeakMap;const Uy=[\"onClick\"],Yy=ue({__name:\"index\",props:{setup:{type:String,default:\"pppoe\"}},setup(e){const n=le(e.setup),s=[{name:\"device-router\",title:\"\\u8BBE\\u5907\\u8DEF\\u7531\",f:()=>{}},{name:\"network-monitoring\",title:\"\\u5E26\\u5BBD\\u76D1\\u63A7\",f:()=>{}},{name:\"network-speed\",title:\"\\u5185\\u7F51\\u6D4B\\u901F\",f:()=>{}},{name:\"opkg\",title:\"\\u8F6F\\u4EF6\\u6E90\\u914D\\u7F6E\",f:()=>{}},{name:\"sandbox\",title:\"\\u6C99\\u7BB1\\u529F\\u80FD\",f:()=>{}},{name:\"system-monitor\",title:\"\\u7CFB\\u7EDF\\u76D1\\u63A7\",f:()=>{}},{name:\"backup-upgrade\",title:\"\\u5907\\u4EFD\\u5347\\u7EA7\",f:()=>{}},{name:\"plugin-upgrade\",title:\"\\u63D2\\u4EF6\\u5907\\u4EFD\",f:()=>{}},{name:\"os-upgrade\",title:\"\\u56FA\\u4EF6\\u66F4\\u65B0\",f:()=>{}}];return(r,a)=>{const o=ht(\"popups-container\");return C(),Fe(o,{title:\"\\u529F\\u80FD\\u7BA1\\u7406\",transparent:\"\"},{left:Ue(()=>[(C(),N(me,null,ct(s,i=>d(\"li\",{class:_t([\"network-menu_item\",{on:n.value==i.name}]),onClick:l=>n.value=i.name},[d(\"span\",null,X(i.title),1)],10,Uy)),64))]),right:Ue(()=>[]),_:1})}}});const Hy={key:0,id:\"app-dialog\"},Wy={key:0,class:\"app-dialog_bg\"},Vy={key:0,class:\"app-dialog_header\"},jy={class:\"app-dialog_body\"},Gy=ue({__name:\"index\",props:{title:{type:String},bg:{type:Boolean,default:!0},width:{type:String},beforeClose:{type:Function}},emits:[\"change\",\"update:modelValue\",\"handleClose\"],setup(e,{emit:t}){const n=e,s=le(!1),r=()=>{n.beforeClose&&n.beforeClose()===!1||(s.value=!1,t(\"update:modelValue\",!1),t(\"handleClose\"))};return is(()=>{s.value=!0}),(a,o)=>(C(),Fe(ja,{name:\"dialog1\"},{default:Ue(()=>[s.value?(C(),N(\"div\",Hy,[e.bg?(C(),N(\"div\",Wy)):pe(\"\",!0),d(\"div\",{class:\"app-dialog_container\",style:Ts({width:e.width})},[e.title!==void 0?(C(),N(\"div\",Vy,[d(\"span\",null,X(e.title),1),d(\"button\",{class:\"close\",onClick:o[0]||(o[0]=i=>r())},[Ie(y1)])])):pe(\"\",!0),d(\"div\",jy,[Yt(a.$slots,\"default\",{},void 0,!0)])],4)])):pe(\"\",!0)]),_:3}))}});var El=he(Gy,[[\"__scopeId\",\"data-v-0af2e383\"]]);const kl=e=>(nt(\"data-v-24ffa06c\"),e=e(),st(),e),zy={class:\"tools-container\"},Ky=kl(()=>d(\"h1\",null,\"\\u6B22\\u8FCE\\u4F7F\\u7528iStoreOS\",-1)),qy=kl(()=>d(\"p\",null,\"\\u70B9\\u51FB\\u5F00\\u59CB\\u8BBE\\u7F6E\\uFF0C\\u6211\\u4EEC\\u5C06\\u4F1A\\u5F15\\u5BFC\\u4F60\\u5B8C\\u6210iStoreOS\\u7684\\u4E00\\u4E9B\\u57FA\\u7840\\u914D\\u7F6E\\uFF0C\",-1)),Jy=kl(()=>d(\"p\",null,\"\\u6BD4\\u5982\\u6570\\u636E\\u76EE\\u5F55\\u3001\\u5F71\\u97F3\\u548C\\u8FDC\\u7A0B\\u4E0B\\u8F7D\\u914D\\u7F6E\\u7B49\",-1)),Xy={class:\"btns\"},Zy=ue({__name:\"top\",setup(e){const t=ve(\"next\");return ve(\"back\"),(n,s)=>(C(),N(\"div\",zy,[Ky,qy,Jy,d(\"div\",Xy,[d(\"button\",{class:\"next\",onClick:s[0]||(s[0]=(...r)=>J(t)&&J(t)(...r))},\"\\u4E0B\\u4E00\\u6B65\")])]))}});var Qy=he(Zy,[[\"__scopeId\",\"data-v-24ffa06c\"]]);const ds=e=>(nt(\"data-v-99d95164\"),e=e(),st(),e),eb=[\"onSubmit\"],tb=ds(()=>d(\"div\",{class:\"label-name\"},\" \\u63A5\\u4E0B\\u6765\\u8BF7\\u9009\\u62E9\\u4E00\\u4E2A\\u4E3B\\u76EE\\u5F55\\u7A7A\\u95F4\\uFF08>20G && EXT4\\uFF09 \",-1)),nb={class:\"label-value\"},sb=ds(()=>d(\"option\",{value:\"\"},\"\\u9009\\u62E9\\u5B58\\u50A8\\u7A7A\\u95F4\",-1)),rb=[\"value\",\"disabled\"],ab=ds(()=>d(\"div\",{class:\"msg\"},\" \\u6570\\u636E\\u76EE\\u5F55\\u4E3B\\u8981\\u5B58\\u653E\\u4F60\\u5728\\u4F7F\\u7528\\u8FC7\\u7A0B\\u4E2D\\u4EA7\\u751F\\u7684\\u914D\\u7F6E\\u6587\\u4EF6\\u3001\\u7D22\\u5F15\\u6587\\u4EF6\\u3001\\u7F29\\u7565\\u56FE\\u7B49\\uFF0C\\u5EFA\\u8BAE\\u63A5\\u5165\\u5BB9\\u91CF\\u8F83\\u5927\\u7684\\u786C\\u76D8\\u5206\\u533A\\uFF0C\\u9009\\u62E9\\u4F5C\\u4E3A\\u6570\\u636E\\u76EE\\u5F55\\u3002 \",-1)),ob={class:\"form-item\"},ib=ds(()=>d(\"label\",null,\" \\u7F13\\u5B58\\u76EE\\u5F55 \",-1)),lb={class:\"label-value\"},ub=ds(()=>d(\"label\",null,\" \\u4E0B\\u8F7D\\u76EE\\u5F55 \",-1)),cb={class:\"label-value\"},db=ds(()=>d(\"label\",null,\" \\u914D\\u7F6E\\u76EE\\u5F55 \",-1)),fb={class:\"label-value\"},hb=ds(()=>d(\"label\",null,[Et(\" docker\\u76EE\\u5F55 \"),d(\"span\",null,[d(\"div\",{class:\"msg\"},\" \\uFF08\\u5982\\u679Cdocker\\u6709\\u6548\\uFF0C\\u5C06\\u6E05\\u7A7A\\u8BE5\\u76EE\\u6807\\u8DEF\\u5F84\\u4E0B\\u7684\\u6587\\u4EF6\\u5E76\\u8FC1\\u79FB\\u5230\\u8BE5\\u76EE\\u5F55\\uFF09 \")])],-1)),_b={class:\"label-value\"},pb={class:\"btns\"},mb=ds(()=>d(\"button\",{class:\"next\"},\"\\u4E0B\\u4E00\\u6B65\",-1)),gb=ue({__name:\"path\",setup(e){const t=ur(),n=be(()=>{var _;return((_=t==null?void 0:t.disk)==null?void 0:_.disks)||[]}),s=be(()=>{var _;return((_=t==null?void 0:t.raid)==null?void 0:_.disks)||[]}),r=be(()=>[...n.value,...s.value].filter(y=>y.childrens).map(y=>y.childrens)),a=ve(\"back\"),o=ve(\"next\"),i=()=>{o()},l=_=>!(_!=null&&_.mountPoint)||_.filesystem!=\"ext4\"||Number(_.sizeInt)<21474836480,u=()=>{c.value.cachePath=c.value.path+\"/Caches\",c.value.plublicPath=c.value.path+\"/Public\",c.value.downloadPath=c.value.path+\"/Public/Downloads\",c.value.settingPath=c.value.path+\"/Configs\",c.value.dockerPath=c.value.path+\"/docker\"},c=ve(\"config\");return(_,p)=>(C(),N(\"form\",{class:\"tools-container\",onSubmit:ls(i,[\"prevent\"])},[tb,d(\"div\",nb,[d(\"label\",null,[Xe(d(\"select\",{required:\"\",\"onUpdate:modelValue\":p[0]||(p[0]=y=>J(c).path=y),onChange:u},[sb,(C(!0),N(me,null,ct(r.value,y=>(C(),N(me,null,[(C(!0),N(me,null,ct(y,E=>(C(),N(me,null,[E.mountPoint?(C(),N(\"option\",{key:0,value:E.mountPoint,disabled:l(E)},X(E.mountPoint)+\" [\"+X(`${E.name} ${E.total}`)+\"] \",9,rb)):pe(\"\",!0)],64))),256))],64))),256))],544),[[Od,J(c).path]])])]),ab,J(c).path!=\"\"?(C(),N(me,{key:0},[d(\"div\",ob,[ib,d(\"div\",lb,[d(\"label\",null,[Xe(d(\"input\",{type:\"text\",\"onUpdate:modelValue\":p[1]||(p[1]=y=>J(c).cachePath=y),required:\"\"},null,512),[[nn,J(c).cachePath,void 0,{trim:!0}]])])]),ub,d(\"div\",cb,[d(\"label\",null,[Xe(d(\"input\",{type:\"text\",\"onUpdate:modelValue\":p[2]||(p[2]=y=>J(c).downloadPath=y),required:\"\"},null,512),[[nn,J(c).downloadPath,void 0,{trim:!0}]])])]),db,d(\"div\",fb,[d(\"label\",null,[Xe(d(\"input\",{type:\"text\",\"onUpdate:modelValue\":p[3]||(p[3]=y=>J(c).settingPath=y),required:\"\"},null,512),[[nn,J(c).settingPath,void 0,{trim:!0}]])])]),hb,d(\"div\",_b,[d(\"label\",null,[Xe(d(\"input\",{type:\"text\",\"onUpdate:modelValue\":p[4]||(p[4]=y=>J(c).dockerPath=y),required:\"\"},null,512),[[nn,J(c).dockerPath,void 0,{trim:!0}]])])])]),d(\"div\",pb,[d(\"button\",{class:\"back\",type:\"button\",onClick:p[5]||(p[5]=(...y)=>J(a)&&J(a)(...y))},\"\\u4E0A\\u4E00\\u6B65\"),mb])],64)):pe(\"\",!0)],40,eb))}});var vb=he(gb,[[\"__scopeId\",\"data-v-99d95164\"]]);const yb=e=>(nt(\"data-v-7b090953\"),e=e(),st(),e),bb={class:\"tools-container\"},Eb=yb(()=>d(\"div\",{class:\"label-name\"},\" \\u9009\\u62E9\\u8981\\u5B89\\u88C5\\u7684\\u4E0B\\u8F7D\\u5DE5\\u5177? \",-1)),kb={class:\"form-item\"},wb=[\"value\"],Sb=[\"src\"],Cb={class:\"btns\"},Tb=ue({__name:\"download\",setup(e){const t=ve(\"next\"),n=ve(\"back\"),s=ve(\"config\"),r=ve(\"apps\");be(()=>s.value);const a=wt([{name:\"aria2\",title:\"Aria2\\u4E0B\\u8F7D\\u5668\"},{name:\"transmission\",title:\"Transmission\\u4E0B\\u8F7D\\u5668\"},{name:\"qbittorrent\",title:\"qBittorrent\\u4E0B\\u8F7D\\u5668\"}]),o=i=>oe.ApiStore.getStoreAppIcon(`/static-icon/openwrt-app-meta/app-meta-${i}/logo.png`);return(i,l)=>(C(),N(\"div\",bb,[Eb,(C(!0),N(me,null,ct(a,u=>(C(),N(\"div\",kb,[d(\"label\",null,[Xe(d(\"input\",{type:\"checkbox\",value:u.name,\"onUpdate:modelValue\":l[0]||(l[0]=c=>je(r)?r.value=c:null)},null,8,wb),[[Hi,J(r)]]),d(\"img\",{src:o(u.name),alt:\"\"},null,8,Sb),Et(\" \"+X(u.title),1)])]))),256)),d(\"div\",Cb,[d(\"button\",{type:\"button\",class:\"back\",onClick:l[1]||(l[1]=(...u)=>J(n)&&J(n)(...u))},\"\\u4E0A\\u4E00\\u6B65\"),d(\"button\",{class:\"next\",type:\"button\",onClick:l[2]||(l[2]=(...u)=>J(t)&&J(t)(...u))},\"\\u4E0B\\u4E00\\u6B65\")])]))}});var Fb=he(Tb,[[\"__scopeId\",\"data-v-7b090953\"]]);const Db=e=>(nt(\"data-v-4d855e61\"),e=e(),st(),e),Ob={class:\"tools-container\"},Pb=Db(()=>d(\"div\",{class:\"label-name\"},\" \\u9009\\u62E9\\u8981\\u5B89\\u88C5\\u7684\\u5F71\\u97F3\\u5A31\\u4E50? \",-1)),Nb={class:\"form-item\"},Ib=[\"value\"],Ab=[\"src\"],Lb={class:\"btns\"},Mb=ue({__name:\"media\",setup(e){const t=ve(\"next\"),n=ve(\"back\"),s=ve(\"config\"),r=ve(\"apps\");be(()=>s.value);const a=wt([{name:\"jellyfin\",title:\"Jellyfin\\u79C1\\u6709\\u5F71\\u9662\"},{name:\"emby\",title:\"Emby\\u5F71\\u9662\"},{name:\"plex\",title:\"Plex\\u5F71\\u9662\"}]),o=i=>oe.ApiStore.getStoreAppIcon(`/static-icon/openwrt-app-meta/app-meta-${i}/logo.png`);return(i,l)=>(C(),N(\"div\",Ob,[Pb,(C(!0),N(me,null,ct(a,u=>(C(),N(\"div\",Nb,[d(\"label\",null,[Xe(d(\"input\",{type:\"checkbox\",value:u.name,\"onUpdate:modelValue\":l[0]||(l[0]=c=>je(r)?r.value=c:null)},null,8,Ib),[[Hi,J(r)]]),d(\"img\",{src:o(u.name),alt:\"\"},null,8,Ab),Et(\" \"+X(u.title),1)])]))),256)),d(\"div\",Lb,[d(\"button\",{type:\"button\",class:\"back\",onClick:l[1]||(l[1]=(...u)=>J(n)&&J(n)(...u))},\"\\u4E0A\\u4E00\\u6B65\"),d(\"button\",{class:\"next\",type:\"button\",onClick:l[2]||(l[2]=(...u)=>J(t)&&J(t)(...u))},\"\\u4E0B\\u4E00\\u6B65\")])]))}});var xb=he(Mb,[[\"__scopeId\",\"data-v-4d855e61\"]]);const $b=e=>(nt(\"data-v-2b6459ac\"),e=e(),st(),e),Rb={class:\"tools-container\"},Bb=$b(()=>d(\"div\",{class:\"label-name\"},\" \\u9009\\u62E9\\u8981\\u5B89\\u88C5\\u7684\\u591A\\u5A92\\u4F53\\u5DE5\\u5177 \",-1)),Ub={class:\"form-item\"},Yb=[\"value\"],Hb=[\"src\"],Wb={class:\"btns\"},Vb=ue({__name:\"multimedia\",setup(e){const t=ve(\"next\"),n=ve(\"back\"),s=ve(\"config\"),r=ve(\"apps\");be(()=>s.value);const a=wt([{name:\"photoprism\",title:\"PhotoPrism\\u76F8\\u518C\\u7BA1\\u7406\"},{name:\"navidrome\",title:\"Navidrome\\u97F3\\u4E50\"},{name:\"lanraragi\",title:\"LANraragi\\u7535\\u5B50\\u4E66\"}]),o=i=>oe.ApiStore.getStoreAppIcon(`/static-icon/openwrt-app-meta/app-meta-${i}/logo.png`);return(i,l)=>(C(),N(\"div\",Rb,[Bb,(C(!0),N(me,null,ct(a,u=>(C(),N(\"div\",Ub,[d(\"label\",null,[Xe(d(\"input\",{type:\"checkbox\",value:u.name,\"onUpdate:modelValue\":l[0]||(l[0]=c=>je(r)?r.value=c:null)},null,8,Yb),[[Hi,J(r)]]),d(\"img\",{src:o(u.name),alt:\"\"},null,8,Hb),Et(\" \"+X(u.title),1)])]))),256)),d(\"div\",Wb,[d(\"button\",{type:\"button\",class:\"back\",onClick:l[1]||(l[1]=(...u)=>J(n)&&J(n)(...u))},\"\\u4E0A\\u4E00\\u6B65\"),d(\"button\",{class:\"next\",type:\"button\",onClick:l[2]||(l[2]=(...u)=>J(t)&&J(t)(...u))},\"\\u4E0B\\u4E00\\u6B65\")])]))}});var jb=he(Vb,[[\"__scopeId\",\"data-v-2b6459ac\"]]);const w1=e=>(nt(\"data-v-a11bdd32\"),e=e(),st(),e),Gb={class:\"nalert\"},zb={key:0,class:\"nalert-container\"},Kb={class:\"nalert-data\"},qb={class:\"nalert-body\"},Jb=w1(()=>d(\"div\",{class:\"nalert-bodt_title\"},[d(\"svg\",{t:\"1670832330919\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2696\",width:\"128\",height:\"128\"},[d(\"path\",{d:\"M849.92 174.08C759.466667 83.626667 640 34.133333 512 34.133333s-247.466667 49.493333-337.92 139.946667C83.626667 264.533333 34.133333 384 34.133333 512s49.493333 247.466667 139.946667 337.92C264.533333 940.373333 384 989.866667 512 989.866667s247.466667-49.493333 337.92-139.946667C940.373333 759.466667 989.866667 640 989.866667 512s-49.493333-247.466667-139.946667-337.92zM512 218.453333c30.72 0 56.32 25.6 56.32 56.32 0 30.72-25.6 56.32-56.32 56.32s-56.32-25.6-56.32-56.32c0-30.72 25.6-56.32 56.32-56.32z m90.453333 552.96H443.733333c-18.773333 0-34.133333-15.36-34.133333-34.133333s15.36-34.133333 34.133333-34.133333h44.373334V455.68H477.866667c-18.773333 0-34.133333-15.36-34.133334-34.133333s15.36-34.133333 34.133334-34.133334h44.373333c18.773333 0 34.133333 15.36 34.133333 34.133334v281.6h44.373334c18.773333 0 34.133333 15.36 34.133333 34.133333s-13.653333 34.133333-32.426667 34.133333z\",fill:\"#333333\",\"p-id\":\"2697\"})]),d(\"span\",null,X(\"\\u63D0\\u793A\"))],-1)),Xb={class:\"nalert-bodt_msg\"},Zb=w1(()=>d(\"a\",null,\"docker\\u8981\\u8FC1\\u79FB\\u7684\\u8DEF\\u5F84\\u4E0D\\u4E3A\\u7A7A\",-1)),Qb={class:\"nalert-bodt_btns\"},eE=ue({__name:\"app\",props:{close:{type:Function,required:!0},callback:{type:Function,required:!0},bg:{type:Boolean,default:!0}},setup(e){const t=e,n=le(!1),s=le(1),r=()=>{t.callback(s.value)},a=()=>{t.close()};return is(()=>{setTimeout(()=>{n.value=!0},0)}),(o,i)=>(C(),N(\"div\",Gb,[e.bg?(C(),N(\"div\",{key:0,class:\"nalert-bg\",onClick:a})):pe(\"\",!0),Ie(ja,{name:\"dialog-nlaert\"},{default:Ue(()=>[n.value?(C(),N(\"div\",zb,[d(\"div\",Kb,[d(\"div\",qb,[Jb,d(\"div\",Xb,[Zb,d(\"label\",null,[Xe(d(\"input\",{type:\"radio\",value:1,\"onUpdate:modelValue\":i[0]||(i[0]=l=>s.value=l)},null,512),[[es,s.value]]),Et(\" \\u66F4\\u6362\\u76EE\\u5F55\\uFF08\\u4E0D\\u8986\\u76D6\\u76EE\\u6807\\u8DEF\\u5F84\\uFF0C\\u4EC5\\u5C06docker\\u76EE\\u5F55\\u4FEE\\u6539\\u4E3A\\u76EE\\u6807\\u8DEF\\u5F84\\uFF09 \")]),d(\"label\",null,[Xe(d(\"input\",{type:\"radio\",value:0,\"onUpdate:modelValue\":i[1]||(i[1]=l=>s.value=l)},null,512),[[es,s.value]]),Et(\" \\u8986\\u76D6\\u8FC1\\u79FB\\uFF08\\u8986\\u76D6\\u76EE\\u6807\\u8DEF\\u5F84\\uFF0C\\u7EE7\\u7EED\\u8FC1\\u79FB\\u4F1A\\u6E05\\u7A7A\\u8BE5\\u76EE\\u6807\\u8DEF\\u5F84\\u4E0B\\u7684\\u6587\\u4EF6\\uFF09 \")])]),d(\"div\",Qb,[d(\"button\",{class:\"next\",onClick:i[2]||(i[2]=l=>r())},\" \\u786E\\u5B9A \"),d(\"button\",{class:\"clear\",onClick:i[3]||(i[3]=l=>a())},\" \\u53D6\\u6D88 \")])])])])):pe(\"\",!0)]),_:1})]))}});var tE=he(eE,[[\"__scopeId\",\"data-v-a11bdd32\"]]),nE=()=>new Promise((e,t)=>{const n=document.createElement(\"div\"),s=()=>{Ta(null,n),n.remove()},a=Ie(tE,gt({},{callback:o=>{e(o),s()},close:()=>{t(),s()}}));Ta(a,n),document.body.appendChild(n)});const wl=e=>(nt(\"data-v-11842e6c\"),e=e(),st(),e),sE={class:\"tools-container\"},rE={key:0,class:\"block\"},aE=wl(()=>d(\"li\",null,\" \\u8FC1\\u79FBdocker\\u76EE\\u5F55 \",-1)),oE=wl(()=>d(\"li\",null,\" \\u751F\\u6210\\u6570\\u636E\\u7684\\u914D\\u7F6E\\u76EE\\u5F55 \",-1)),iE=wl(()=>d(\"li\",null,\" \\u662F\\u5426\\u7EE7\\u7EED\\uFF1F \",-1)),lE={key:1,class:\"block block-msg\"},uE={class:\"msg-li\"},cE={class:\"msg-item\"},dE={class:\"btns\"},fE=[\"disabled\"],hE=[\"disabled\"],_E=ue({__name:\"install\",setup(e){ve(\"next\");const t=ve(\"back\");ve(\"init\");const n=ve(\"apps\"),s=ve(\"config\");le(0);const r=ve(\"disabled\"),a=le([]),o=le(!1),i=()=>te(this,null,function*(){if(!!window.confirm(\"\\u60A8\\u786E\\u5B9A\\u8981\\u6267\\u884C\\u64CD\\u4F5C\\u5417?\")){if(a.value=[],a.value.push(\"\\u521D\\u59CB\\u5316\\u914D\\u7F6E...\"),r.value=!0,(yield _())!==!0){r.value=!1;return}if((yield u())!==!0){r.value=!1;return}if((yield c())!==!0){r.value=!1;return}a.value.push(\"\\u914D\\u7F6E\\u5B8C\\u6210,\\u7CFB\\u7EDF\\u4F1A\\u5728\\u540E\\u53F0\\u6267\\u884C\\u8F6F\\u4EF6\\u7684\\u5B89\\u88C5\\u548C\\u914D\\u7F6E\"),a.value.push(\"\\u8BF7\\u5173\\u95ED\\u7A97\\u53E3\"),o.value=!0}}),l=()=>{localStorage.setItem(\"nas_guide_init\",\"1\"),window.location.reload()},u=()=>te(this,null,function*(){let E=!1;a.value.push(\"\\u914D\\u7F6E\\u76EE\\u5F55...\");try{const k=s.value,S={home:k.path,downloads:k.downloadPath,configs:k.settingPath,caches:k.cachePath,public:k.plublicPath},m=yield oe.Quickstart.Guide.GlobalFolders.POST(S);if(m.data){const{success:w,error:P,scope:b,detail:D}=m.data;if((w||0)==0&&(E=!0,a.value.push(\"\\u76EE\\u5F55\\u914D\\u7F6E\\u5B8C\\u6210...\")),P)throw P}}catch(k){a.value.push(k)}return E}),c=()=>te(this,null,function*(){let E=!1;const k=n.value;if(a.value.push(\"\\u5B89\\u88C5\\u63D2\\u4EF6...\"),k.length>0)try{const S={packages:k},m=yield oe.Quickstart.AutoSetup.POST(S);if(m.data){const{success:w,error:P}=m.data;if(w==0&&(a.value.push(\"\\u5DF2\\u63D0\\u4EA4\\u81F3\\u540E\\u5929\\u5B89\\u88C5\"),E=!0),P)throw P}}catch(S){a.value.push(S)}else a.value.push(\"\\u6CA1\\u6709\\u9700\\u8981\\u5B89\\u88C5\\u7684\\u63D2\\u4EF6,\\u8DF3\\u8FC7\"),E=!0;return E}),_=()=>te(this,null,function*(){let E=!1;a.value.push(\"\\u6B63\\u5728\\u83B7\\u53D6docker\\u72B6\\u6001\");const{dockerPath:k}=s.value;try{const S=yield oe.Quickstart.Guide.DockerStatus.GET();if(S.data){const{success:m,error:w,result:P}=S.data;if(w)throw w;if(P&&P.path===k)return a.value.push(\"docker\\u8DEF\\u5F84\\u4E00\\u81F4,\\u8DF3\\u8FC7\\u8FC1\\u79FB\"),!0}}catch(S){return a.value.push(S),!1}a.value.push(\"\\u6B63\\u5728\\u8FC1\\u79FBdocker...\");try{const S=yield oe.Quickstart.Guide.DockerTransfer.POST({path:k,force:!1});if(S.data){const{result:m,success:w,error:P}=S.data;if((w||0)==0)if(m!=null&&m.emptyPathWarning)try{switch(yield nE()){case 0:E=yield p(k);break;case 1:E=yield y(k);break;default:a.value.push(\"\\u8DF3\\u8FC7\\u8FC1\\u79FBdocker\"),E=!0}}catch(b){a.value.push(\"\\u8DF3\\u8FC7\\u8FC1\\u79FBdocker\"),E=!0}else E=!0,a.value.push(\"\\u8FC1\\u79FB\\u5B8C\\u6210...\");if(P)throw S.data.error}}catch(S){a.value.push(S)}return E}),p=E=>te(this,null,function*(){let k=!1;try{const S=yield oe.Quickstart.Guide.DockerTransfer.POST({path:E,force:!0,overwriteDir:!0});if(S.data){const{result:m,success:w,error:P}=S.data;if((w||0)==0&&(m!=null&&m.emptyPathWarning?a.value.push(\"\\u8FC1\\u79FB\\u5931\\u8D25...\"):(k=!0,a.value.push(\"\\u8FC1\\u79FB\\u5B8C\\u6210...\"))),P)throw S.data.error}}catch(S){a.value.push(S)}return k}),y=E=>te(this,null,function*(){let k=!1;try{const S=yield oe.Quickstart.Guide.DockerTransfer.POST({path:E,force:!0,overwriteDir:!1});if(S.data){const{result:m,success:w,error:P}=S.data;if((w||0)==0&&(m!=null&&m.emptyPathWarning?a.value.push(\"\\u8FC1\\u79FB\\u5931\\u8D25...\"):(k=!0,a.value.push(\"\\u8FC1\\u79FB\\u5B8C\\u6210...\"))),P)throw S.data.error}}catch(S){a.value.push(S)}return k});return(E,k)=>(C(),N(\"div\",sE,[J(r)?pe(\"\",!0):(C(),N(\"div\",rE,[aE,oE,d(\"li\",null,\" \\u5B89\\u88C5\\u9009\\u4E2D\\u7684 \"+X(J(n).length)+\" \\u4E2A\\u63D2\\u4EF6 \",1),iE])),a.value.length>0?(C(),N(\"div\",lE,[(C(!0),N(me,null,ct(a.value,S=>(C(),N(\"li\",uE,[d(\"div\",cE,X(S),1)]))),256))])):pe(\"\",!0),d(\"div\",dE,[o.value?(C(),N(\"button\",{key:1,onClick:l,class:\"next\"},\"\\u5173\\u95ED\")):(C(),N(me,{key:0},[d(\"button\",{class:\"back\",onClick:k[0]||(k[0]=(...S)=>J(t)&&J(t)(...S)),disabled:J(r)},\"\\u4E0A\\u4E00\\u6B65\",8,fE),d(\"button\",{class:\"next\",onClick:i,disabled:J(r)},\"\\u5B89\\u88C5\\u5E76\\u914D\\u7F6E\",8,hE)],64))])]))}});var pE=he(_E,[[\"__scopeId\",\"data-v-11842e6c\"]]);const mE=e=>(nt(\"data-v-0dc4c17e\"),e=e(),st(),e),gE={class:\"tools-container\"},vE=mE(()=>d(\"div\",{class:\"block\"},[d(\"p\",null,\" \\u914D\\u7F6E\\u5B8C\\u6210 \"),d(\"p\",null,\"\\u7CFB\\u7EDF\\u4F1A\\u5728\\u540E\\u53F0\\u6267\\u884C\\u8F6F\\u4EF6\\u7684\\u5B89\\u88C5\\u548C\\u914D\\u7F6E\")],-1)),yE=ue({__name:\"success\",setup(e){const t=ve(\"init\"),n=()=>{t(),window.location.reload()};return(s,r)=>(C(),N(\"div\",gE,[vE,d(\"div\",{class:\"btns\"},[d(\"button\",{onClick:n,class:\"next\"},\"\\u77E5\\u9053\\u4E86\")])]))}});var bE=he(yE,[[\"__scopeId\",\"data-v-0dc4c17e\"]]);const EE={class:\"nas-tools_item\"},kE=ue({__name:\"index\",props:{close:Function},setup(e){const t=e,n=be(()=>[Qy,vb,Fb,xb,jb,pE,bE]),s=Ht(),r=()=>{if(y.value)return!1},a=()=>{var E,k,S,m;u(),t.close&&t.close(),s&&((S=(k=(E=s==null?void 0:s.appContext)==null?void 0:E.config)==null?void 0:k.globalProperties)==null?void 0:S.$close)&&((m=s.appContext.config.globalProperties)==null||m.$close())},o=le(0),i=()=>{y.value||o.value>=n.value.length-1||o.value++},l=()=>{y.value||o.value!=0&&o.value--},u=()=>{oe.Storage.Set.POST({key:\"nas_guide_init\",type:\"option\",values:[\"1\"]}).then(E=>{})},c=be(()=>({transform:`translateX(${o.value*-100}%)`})),_=le({path:\"\",cachePath:\"\",downloadPath:\"\",settingPath:\"\",dockerPath:\"\",plublicPath:\"\"}),p=le([]),y=le(!1);return It(\"next\",i),It(\"back\",l),It(\"init\",u),It(\"config\",_),It(\"apps\",p),It(\"disabled\",y),(E,k)=>(C(),Fe(El,{class:\"nas-dialog\",title:\"iStoreOS\",onHandleClose:a,\"before-close\":r,width:\"860px\"},{default:Ue(()=>[d(\"div\",{class:\"nas-tools\",style:Ts(c.value)},[(C(!0),N(me,null,ct(n.value,(S,m)=>(C(),N(\"div\",EE,[m==o.value?(C(),Fe($i(S),{key:0})):pe(\"\",!0)]))),256))],4)]),_:1}))}});var wE=he(kE,[[\"__scopeId\",\"data-v-c4e63fa4\"]]);class SE extends bl{OpenNasSettingWindow(){this.openWindow(Yy)}OpenGuideWindow(){this.openWindow(wE)}}const CE=new SE;const S1=e=>(nt(\"data-v-529c6a5d\"),e=e(),st(),e),TE={class:\"app-item\"},FE={class:\"app-card\"},DE={class:\"app-item_icon\"},OE=[\"src\"],PE={class:\"app-item_info\"},NE={class:\"app-title\"},IE={class:\"app-as\"},AE={style:{\"font-weight\":\"600\"}},LE=S1(()=>d(\"span\",{style:{margin:\"0 10px\"}},\"|\",-1)),ME={style:{\"font-weight\":\"600\"}},xE=[\"title\"],$E={key:0,class:\"app-btn\"},RE={key:1,class:\"app-btn\"},BE=S1(()=>d(\"div\",null,null,-1)),UE=ue({__name:\"app\",props:{app:{type:Object,required:!0}},setup(e){const t=e,n=le(localStorage.getItem(\"i18n\")),s=o1(),r=it.numberFormat,a=be(()=>s.appsExpand[t.app.name]||{downloadCount:0,isStar:null,name:t.app.name,starCount:0}),o=()=>{fe.Message(\"\\u60A8\\u5DF2\\u70B9\\u8D5E\\u8FC7\\u4E86\")},i=()=>te(this,null,function*(){var l;try{const u=yield oe.ApiStore.star.POST({appId:t.app.name,deviceId:it.getDeviceId()});((l=u==null?void 0:u.data)==null?void 0:l.success)==0&&s.appsExpand[t.app.name]&&(s.appsExpand[t.app.name].isStar=!0)}catch(u){fe.Error(`${u}`)}});return(l,u)=>{const c=ht(\"icon-star-off\"),_=ht(\"icon-star-on\");return C(),N(\"div\",TE,[d(\"div\",FE,[d(\"div\",DE,[d(\"img\",{src:e.app.getIcon(),alt:\"\"},null,8,OE)]),d(\"div\",PE,[d(\"div\",NE,[Et(X(n.value===\"en\"&&e.app.title_en||e.app.title)+\" \",1),d(\"em\",null,X(e.app.version),1)]),d(\"div\",IE,[d(\"span\",AE,X(J(r)(a.value.downloadCount))+\" \"+X(l.$t(\"\\u6B21\\u4E0B\\u8F7D\")),1),LE,d(\"span\",ME,X(J(r)(a.value.starCount))+\" \"+X(l.$t(\"\\u6B21\\u70B9\\u8D5E\")),1),a.value.isStar!=null?(C(),N(me,{key:0},[a.value.isStar?(C(),N(\"a\",{key:0,class:\"star-btn\",onClick:u[0]||(u[0]=p=>o())},[Ie(c)])):(C(),N(\"a\",{key:1,class:\"star-btn\",onClick:u[1]||(u[1]=p=>i())},[Ie(_)]))],64)):pe(\"\",!0)]),d(\"div\",{class:\"app-desc\",title:e.app.description},X(n.value===\"en\"&&e.app.description_en||e.app.description),9,xE)])]),e.app.isInstall()?(C(),N(\"div\",$E,[e.app.isUpdate()?(C(),N(\"button\",{key:0,class:\"update\",onClick:u[2]||(u[2]=p=>e.app.update())},X(l.$t(\"\\u66F4\\u65B0\")),1)):pe(\"\",!0),d(\"button\",{class:\"del\",onClick:u[3]||(u[3]=p=>e.app.uninstall())},X(l.$t(\"\\u5378\\u8F7D\")),1),d(\"button\",{onClick:u[4]||(u[4]=p=>e.app.openApp()),class:\"open\"},X(l.$t(\"\\u6253\\u5F00\")),1)])):(C(),N(\"div\",RE,[BE,d(\"button\",{class:\"install\",onClick:u[5]||(u[5]=p=>e.app.install())},X(l.$t(\"\\u5B89\\u88C5\")),1)]))])}}});var Cc=he(UE,[[\"__scopeId\",\"data-v-529c6a5d\"]]);const YE=ue({__name:\"index\",emits:[\"change\"],setup(e,{emit:t}){const n=i=>{},s=i=>{i===null&&console.log(\"dragleave\")},r=i=>{i.preventDefault(),i.dataTransfer&&(i.dataTransfer.dropEffect=\"link\")},a=i=>{i.preventDefault(),o(i)},o=i=>{var u;const l=(u=i==null?void 0:i.dataTransfer)==null?void 0:u.files;if(l&&l.length>0){const c=[];for(let _=0;_<l.length;_++){const p=l.item(_);p&&c.push(p)}t(\"change\",c);return}};return(i,l)=>(C(),N(\"div\",{onDrop:a,onDragenter:n,onDragleave:s,onDragover:r},[Yt(i.$slots,\"default\")],32))}});const C1=e=>(nt(\"data-v-19021bf0\"),e=e(),st(),e),HE={class:\"tab\"},WE={key:1,class:\"filter\"},VE=C1(()=>d(\"span\",null,\"\\u6807\\u7B7E\\uFF1A\",-1)),jE=[\"onClick\"],GE={key:2,class:\"filter\"},zE=C1(()=>d(\"span\",null,\"\\u6392\\u5E8F\\uFF1A\",-1)),KE=[\"onClick\"],qE={key:3},JE={class:\"section-list\"},XE={key:4},ZE={class:\"section-list\"},QE=ue({__name:\"appStore\",setup(e){const t=le(\"installed\"),n=le(\"\"),s=le(null),r=o1(),a=be(()=>r.localApps||[]),o=be(()=>r.remoteApps||[]),i=be(()=>r.tags||[]),l=wt({filterRemoteApps:[...o.value]});be(()=>a.value.filter(k=>k.isUpdate()));const u=k=>{if(k&&k.length>0){const S=k[0];(S.name.endsWith(\".run\")||S.name.endsWith(\".ipk\"))&&E(S)}},c=k=>{k!==t.value&&(t.value===\"installed\"?t.value=\"all\":t.value=\"installed\")},_=k=>{if(n.value=k,k!==\"\"){const S=[...o.value.filter(m=>m.tags.includes(k))];l.filterRemoteApps=S}else l.filterRemoteApps=[...o.value]},p=k=>(s.value=k,k===null?_(n.value):l.filterRemoteApps=l.filterRemoteApps.sort((S,m)=>k===0?m.downloadCount-S.downloadCount:k===1?m.starCount-S.starCount:k===2?m.time-S.time:0)),y=k=>{if(k.target.value===\"\")return _(n.value);l.filterRemoteApps=l.filterRemoteApps.filter(S=>S.title.includes(k.target.value))},E=k=>te(this,null,function*(){const S=new FormData;S.append(k.name,k);const m=fe.Loading(\"\\u4E0A\\u4F20\\u4E2D...\");try{const w=yield oe.Store.upload.POST(S);if(w.data){const{stderr:P,code:b}=w.data;if(b==0&&Ms.istore.Open(),P)throw P}}catch(w){fe.Error(`${w}`)}finally{m.Close()}});return(k,S)=>(C(),Fe(YE,{onChange:u},{default:Ue(()=>[d(\"div\",HE,[d(\"span\",{class:_t(t.value===\"installed\"&&\"active\"),onClick:S[0]||(S[0]=m=>c(\"installed\"))},\"\\u5DF2\\u5B89\\u88C5\\uFF08\"+X(a.value.length)+\"\\uFF09\",3),d(\"span\",{class:_t(t.value===\"all\"&&\"active\"),onClick:S[1]||(S[1]=m=>c(\"all\"))},\"\\u5168\\u90E8\\u8F6F\\u4EF6\\uFF08\"+X(o.value.length)+\"\\uFF09\",3)]),t.value===\"all\"?(C(),N(\"input\",{key:0,class:\"search\",type:\"text\",onChange:y},null,32)):pe(\"\",!0),t.value===\"all\"?(C(),N(\"div\",WE,[d(\"span\",null,[VE,d(\"span\",{onClick:S[2]||(S[2]=m=>_(\"\")),class:_t(`default tag ${n.value===\"\"&&\"active\"}`)},\"\\u9ED8\\u8BA4\",2)]),d(\"div\",null,[(C(!0),N(me,null,ct(i.value,m=>(C(),N(\"span\",{onClick:w=>_(m),class:_t(`tag ${n.value===m&&\"active\"}`)},X(m),11,jE))),256))])])):pe(\"\",!0),t.value===\"all\"?(C(),N(\"div\",GE,[d(\"span\",null,[zE,d(\"span\",{onClick:S[3]||(S[3]=m=>p(null)),class:_t(`default tag ${s.value===null&&\"active\"}`)},\"\\u9ED8\\u8BA4\",2)]),d(\"div\",null,[(C(),N(me,null,ct([\"\\u6309\\u4E0B\\u8F7D\\u91CF\",\"\\u6309\\u8BC4\\u5206\",\"\\u6700\\u8FD1\\u66F4\\u65B0\"],(m,w)=>d(\"span\",{onClick:P=>p(w),class:_t(`tag ${s.value===w&&\"active\"}`)},X(m),11,KE)),64))])])):pe(\"\",!0),a.value.length>0&&t.value===\"installed\"?(C(),N(\"section\",qE,[d(\"div\",JE,[(C(!0),N(me,null,ct(a.value,m=>(C(),Fe(Cc,{app:m},null,8,[\"app\"]))),256))])])):pe(\"\",!0),l.filterRemoteApps.length>0&&t.value===\"all\"?(C(),N(\"section\",XE,[d(\"div\",ZE,[(C(!0),N(me,null,ct(l.filterRemoteApps,m=>(C(),N(me,null,[m.isInstall()?pe(\"\",!0):(C(),Fe(Cc,{key:0,app:m},null,8,[\"app\"]))],64))),256))])])):pe(\"\",!0)]),_:1}))}});var ek=he(QE,[[\"__scopeId\",\"data-v-19021bf0\"]]);const tk=ue({__name:\"index\",props:{close:Function},setup(e){const t=e,n=()=>{t.close&&t.close()};return(s,r)=>(C(),Fe(El,{onHandleClose:n,title:s.$t(\"\\u5E94\\u7528\\u4E2D\\u5FC3\")},{default:Ue(()=>[Ie(ek)]),_:1},8,[\"title\"]))}});class nk extends bl{Open(){this.openWindow(tk)}}const sk=new nk,rk={class:\"tab-content\"},ak={class:\"item-label\"},ok=d(\"div\",{class:\"item-label_key\"},[d(\"span\",null,\"\\u540D\\u79F0\")],-1),ik={class:\"item-label_value\"},lk={key:0,class:\"item-label\"},uk=d(\"div\",{class:\"item-label_key\"},[d(\"span\",null,\"\\u578B\\u53F7\")],-1),ck={class:\"item-label_value\"},dk={class:\"item-label\"},fk=d(\"div\",{class:\"item-label_key\"},[d(\"span\",null,\"\\u8DEF\\u5F84\")],-1),hk={class:\"item-label_value\"},_k={class:\"item-label\"},pk=d(\"div\",{class:\"item-label_key\"},[d(\"span\",null,\"\\u5BB9\\u91CF\")],-1),mk={class:\"item-label_value\"},gk={class:\"item-label\"},vk=d(\"div\",{class:\"item-label_key\"},[d(\"span\",null,\"\\u7C7B\\u578B\")],-1),yk={class:\"item-label_value\"},bk={key:1,class:\"item-label\"},Ek=d(\"div\",{class:\"item-label_key\"},[d(\"span\",null,\"\\u7CFB\\u7EDF\\u5206\\u533A\")],-1),kk=d(\"div\",{class:\"item-label_value\"},[d(\"span\",null,\"true\")],-1),wk=[Ek,kk],Sk={key:2,class:\"item-label\"},Ck=d(\"div\",{class:\"item-label_key\"},[d(\"span\",null,\"docker\\u5206\\u533A\")],-1),Tk=d(\"div\",{class:\"item-label_value\"},[d(\"span\",null,\"true\")],-1),Fk=[Ck,Tk],Dk={key:3,class:\"item-label\"},Ok=d(\"div\",{class:\"item-label_key\"},[d(\"span\",null,\"\\u63A5\\u5165\\u65B9\\u5F0F\")],-1),Pk=d(\"div\",{class:\"item-label_value\"},[d(\"span\",null,\"\\u5916\\u63A5\")],-1),Nk=[Ok,Pk],Ik={class:\"item-label\"},Ak=d(\"div\",{class:\"item-label_key\"},[d(\"span\",null,\"\\u5206\\u533A\\u6570\\u91CF\")],-1),Lk={class:\"item-label_value\"},Mk={key:4,class:\"item-label\"},xk=d(\"div\",{class:\"item-label_key\"},[d(\"span\",null,\"error\")],-1),$k={class:\"item-label_value\"},Rk=ue({__name:\"main\",setup(e){const t=ve(\"disk\");return(n,s)=>{var r;return C(),N(\"section\",rk,[d(\"div\",ak,[ok,d(\"div\",ik,[d(\"span\",null,X(J(t).name),1)])]),J(t).venderModel?(C(),N(\"div\",lk,[uk,d(\"div\",ck,[d(\"span\",null,X(J(t).venderModel),1)])])):pe(\"\",!0),d(\"div\",dk,[fk,d(\"div\",hk,[d(\"span\",null,X(J(t).path),1)])]),d(\"div\",_k,[pk,d(\"div\",mk,[d(\"span\",null,X(J(t).used)+\"/\"+X(J(t).total),1)])]),d(\"div\",gk,[vk,d(\"div\",yk,[d(\"span\",null,X(J(t).partyLabelType),1)])]),J(t).isSystemRoot?(C(),N(\"div\",bk,wk)):pe(\"\",!0),J(t).isDockerRoot?(C(),N(\"div\",Sk,Fk)):pe(\"\",!0),J(t).isExternalDisk?(C(),N(\"div\",Dk,Nk)):pe(\"\",!0),d(\"div\",Ik,[Ak,d(\"div\",Lk,[d(\"span\",null,X((r=J(t).childrens)==null?void 0:r.length),1)])]),J(t).errorInfo?(C(),N(\"div\",Mk,[xk,d(\"div\",$k,[d(\"span\",null,X(J(t).errorInfo),1)])])):pe(\"\",!0)])}}}),Bk={class:\"tab-content\"},Uk=d(\"div\",{class:\"label-name\"},[d(\"span\",null,\"\\u76EE\\u6807\\u5206\\u533A\")],-1),Yk={class:\"label-value\"},Hk=d(\"option\",{value:-1},\"\\u9009\\u62E9\\u8981\\u6302\\u8F7D\\u7684\\u5206\\u533A\",-1),Wk=[\"value\"],Vk=d(\"div\",{class:\"label-name\"},[d(\"span\",null,\"\\u6302\\u8F7D\\u70B9\")],-1),jk={class:\"label-value\"},Gk={class:\"label-btns\"},zk=[\"disabled\"],Kk=ue({__name:\"mount\",props:{mountIndex:{type:Number,required:!0}},setup(e){const t=e,n=ve(\"disk\"),s=ve(\"disabled\"),r=wt({index:t.mountIndex!=null?t.mountIndex:-1,mountPoint:\"\",item:{mountPoint:\"\",path:\"\",name:\"\",filesystem:\"\",total:\"\",used:\"\",usage:0,uuid:\"\",isReadOnly:!1,isSystemRoot:!1,sizeInt:\"\"}}),a=()=>{var l;const i=n.value;r.index==-1&&(r.item=null,r.mountPoint=\"\"),i.childrens&&(r.item=i.childrens[r.index],r.mountPoint=\"/mnt/data_\"+((l=r==null?void 0:r.item)==null?void 0:l.name))},o=()=>te(this,null,function*(){const i=n.value,l=r.item;if(l==null||r.index==-1){fe.Message(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u8981\\u6302\\u8F7D\\u7684\\u5206\\u533A\");return}if(l.path==null||l.path==\"\"){fe.Message(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u6302\\u8F7D\\u7684\\u5206\\u533A\\u8DEF\\u5F84\");return}if(l.uuid==null||l.uuid==\"\"){fe.Message(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u6302\\u8F7D\\u7684\\u5206\\u533AID\");return}if(r.mountPoint==\"\"){fe.Message(\"\\u6302\\u8F7D\\u70B9\\u4E0D\\u80FD\\u4E3A\\u7A7A\");return}const u=fe.Loading(\"\\u6302\\u8F7D\\u4E2D...\");try{const c=yield oe.Nas.Disk.Partition.Mount.POST({path:l.path,uuid:l.uuid,mountPoint:r.mountPoint});if(c!=null&&c.data){const{result:_,error:p}=c==null?void 0:c.data;if(p)throw p;_&&(i&&i.childrens&&i.childrens[r.index]&&(i.childrens[r.index].mountPoint=_.mountPoint),fe.Success(\"\\u6302\\u8F7D\\u6210\\u529F,\\u8BF7\\u5173\\u95ED\\u7A97\\u53E3\"))}}catch(c){fe.Error(`${c}`)}finally{u.Close(),s.value=!1}});return r.index>=0&&a(),(i,l)=>(C(),N(\"section\",Bk,[Uk,d(\"div\",Yk,[Xe(d(\"select\",{\"onUpdate:modelValue\":l[0]||(l[0]=u=>r.index=u),onChange:a},[Hk,(C(!0),N(me,null,ct(J(n).childrens,(u,c)=>{var _;return C(),N(me,null,[u.mountPoint?pe(\"\",!0):(C(),N(\"option\",{key:0,value:c},X(u.path)+\"\\uFF08\"+X(u.total)+\"\\uFF0C\"+X((_=u==null?void 0:u.filesystem)==null?void 0:_.toUpperCase())+\"\\uFF09 \",9,Wk))],64)}),256))],544),[[Od,r.index]])]),r.index!=-1?(C(),N(me,{key:0},[Vk,d(\"div\",jk,[Xe(d(\"input\",{type:\"text\",\"onUpdate:modelValue\":l[1]||(l[1]=u=>r.mountPoint=u)},null,512),[[nn,r.mountPoint,void 0,{trim:!0}]])]),d(\"div\",Gk,[d(\"button\",{class:\"mount\",disabled:J(s),onClick:l[2]||(l[2]=u=>o())},\"\\u6302\\u8F7D\",8,zk)])],64)):pe(\"\",!0)]))}}),qk={class:\"tab-content\"},Jk=d(\"colgroup\",null,[d(\"col\"),d(\"col\"),d(\"col\"),d(\"col\"),d(\"col\")],-1),Xk=d(\"thead\",null,[d(\"tr\",null,[d(\"th\",null,\" \\u540D\\u79F0 \"),d(\"th\",null,\" \\u8DEF\\u5F84 \"),d(\"th\",null,\" \\u5BB9\\u91CF \"),d(\"th\",null,\"\\u683C\\u5F0F\"),d(\"th\",null,\" \\u72B6\\u6001 \"),d(\"th\",null,\" \\u6302\\u8F7D\\u70B9 \")])],-1),Zk={key:0},Qk={key:1,class:\"warning\"},ew={key:0},tw=[\"onClick\"],nw=ue({__name:\"partition\",setup(e){const t=ve(\"disk\"),n=ve(\"onMount\");return(s,r)=>(C(),N(\"section\",qk,[d(\"table\",null,[Jk,Xk,d(\"tbody\",null,[(C(!0),N(me,null,ct(J(t).childrens,(a,o)=>(C(),N(\"tr\",null,[d(\"th\",null,[d(\"span\",null,X(a.name),1)]),d(\"th\",null,X(a.path),1),d(\"th\",null,[d(\"span\",null,X(a.used||0)+\"/\"+X(a.total||0),1)]),d(\"th\",null,[a.filesystem==\"ext4\"?(C(),N(\"span\",Zk,X(a.filesystem),1)):(C(),N(\"span\",Qk,X(a.filesystem),1))]),d(\"th\",null,[d(\"span\",null,X(a.isReadOnly?\"\\u53EA\\u8BFB\":\"\\u8BFB\\u5199\"),1)]),d(\"th\",null,[a.mountPoint?(C(),N(\"span\",ew,[d(\"span\",null,X(a.mountPoint),1)])):(C(),N(\"a\",{key:1,onClick:i=>J(n)(o)},\" \\u53BB\\u6302\\u8F7D \",8,tw))])]))),256))])])]))}});const _o=e=>(nt(\"data-v-7d47f8ad\"),e=e(),st(),e),sw={class:\"tab-content\"},rw=_o(()=>d(\"div\",{class:\"label-name\"},[d(\"span\",null,\"\\u8981\\u683C\\u5F0F\\u5316\\u7684\\u76EE\\u6807\")],-1)),aw={class:\"label-value2\"},ow={class:\"disk-item\"},iw=_o(()=>d(\"em\",{class:\"disk_main\"},\"\\u5168\\u76D8\",-1)),lw={class:\"disk-item\"},uw=[\"value\"],cw=_o(()=>d(\"em\",null,\"\\u5206\\u533A\",-1)),dw=_o(()=>d(\"div\",{class:\"label-name\"},[d(\"span\",null,\"\\u683C\\u5F0F\\u5316\\u4E3A\")],-1)),fw={class:\"label-value2\"},hw={class:\"disk-item\"},_w={class:\"label-btns\"},pw=[\"disabled\"],mw=ue({__name:\"foramt\",setup(e){const t=ve(\"disk\"),n=ve(\"updateDisk\"),s=ve(\"disabled\"),r=le(-1),a=le(\"ext4\"),o=()=>te(this,null,function*(){const u=gt({},t.value),c=r.value;if(c==-1){if(!confirm(`\\u8B66\\u544A\\uFF1A\\u8BE5\\u64CD\\u4F5C\\u5C06\\u521D\\u59CB\\u5316 ${u.venderModel} \\u786C\\u76D8\\u5E76\\u521B\\u5EFA\\u4E00\\u4E2A\\u5206\\u533A\\uFF0C\\u8BF7\\u4F60\\u8C28\\u614E\\u64CD\\u4F5C`)||!confirm(\"\\u662F\\u5426\\u786E\\u5B9A\\u521D\\u59CB\\u5316?\"))return;i(u);return}if(u.childrens){const _=u.childrens[c],p=_.mountPoint||_.path;if(!confirm(`\\u8B66\\u544A\\uFF1A\\u683C\\u5F0F\\u5316\\u4F1A\\u6E05\\u7A7A ${p} \\u5206\\u533A\\u6570\\u636E\\uFF0C\\u8BF7\\u4F60\\u8C28\\u614E\\u64CD\\u4F5C`)||!confirm(`\\u662F\\u5426\\u786E\\u5B9A\\u683C\\u5F0F\\u5316 ${p}?`))return;l(_,c);return}}),i=u=>te(this,null,function*(){if(s.value=!0,u.name==null||u.path==\"\"){fe.Warning(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u8BBE\\u5907\\u540D\\u79F0\");return}if(u.path==null||u.path==\"\"){fe.Warning(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u8BBE\\u5907\\u8DEF\\u5F84\");return}s.value=!0;const c=fe.Loading(\"\\u521D\\u59CB\\u5316\\u4E2D...\");try{const _=yield oe.Nas.Disk.Init.POST({name:u.name,path:u.path});if(_!=null&&_.data){const{result:p,error:y}=_==null?void 0:_.data;if(y&&fe.Warning(y),p){if(p.errorInfo){fe.Warning(p.errorInfo);return}fe.Success(\"\\u521D\\u59CB\\u5316\\u6210\\u529F\"),n(p)}}}catch(_){fe.Error(_)}finally{c.Close(),s.value=!1}}),l=(u,c)=>te(this,null,function*(){if(s.value=!0,u.path==null||u.path==\"\"){fe.Warning(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u5206\\u533A\\u8DEF\\u5F84\");return}s.value=!0;const _=fe.Loading(\"\\u683C\\u5F0F\\u5316\\u4E2D...\");try{const p=yield oe.Nas.Disk.Partition.Format.POST({path:u.path,uuid:u.uuid,mountPoint:u.mountPoint});if(p!=null&&p.data){const{result:y,error:E}=p==null?void 0:p.data;if(E&&fe.Warning(E),y){fe.Success(\"\\u683C\\u5F0F\\u5316\\u6210\\u529F\");const k=gt({},t.value);k.childrens&&(k.childrens[c]=y),n(k)}}}catch(p){fe.Error(p)}finally{_.Close(),s.value=!1}});return(u,c)=>(C(),N(\"section\",sw,[rw,d(\"div\",aw,[d(\"label\",ow,[Xe(d(\"input\",{type:\"radio\",value:-1,\"onUpdate:modelValue\":c[0]||(c[0]=_=>r.value=_)},null,512),[[es,r.value]]),iw,Et(X(J(t).path)+\"\\uFF08\"+X(J(t).total)+\"\\uFF09 \",1)]),(C(!0),N(me,null,ct(J(t).childrens,(_,p)=>{var y;return C(),N(\"label\",lw,[Xe(d(\"input\",{type:\"radio\",value:p,\"onUpdate:modelValue\":c[1]||(c[1]=E=>r.value=E)},null,8,uw),[[es,r.value]]),cw,Et(X(_.path)+\"\\uFF08\"+X(_.total)+\"\\uFF0C\"+X((y=_==null?void 0:_.filesystem)==null?void 0:y.toUpperCase())+\"\\uFF09 \",1)])}),256))]),dw,d(\"div\",fw,[d(\"label\",hw,[Xe(d(\"input\",{type:\"radio\",value:\"ext4\",\"onUpdate:modelValue\":c[2]||(c[2]=_=>a.value=_)},null,512),[[es,a.value]]),Et(\" EXT4 \")])]),d(\"div\",_w,[d(\"button\",{class:\"mount\",disabled:J(s),onClick:c[3]||(c[3]=_=>o())},\"\\u683C\\u5F0F\\u5316\",8,pw)])]))}});var gw=he(mw,[[\"__scopeId\",\"data-v-7d47f8ad\"]]);const vw={class:\"tabls\"},yw=[\"disabled\"],bw=[\"disabled\"],Ew=[\"disabled\"],kw=[\"disabled\"],ww=ue({__name:\"index\",props:{disk:{type:Object,required:!0},close:Function},setup(e){const t=e,n=()=>{i.value&&location.reload(),t.close&&t.close()},s=le(\"main\"),r=le(!1),a=le(t.disk),o=le(null),i=le(!1);It(\"disk\",a),It(\"updateDisk\",u=>{a.value=u,i.value=!0}),It(\"disabled\",r),It(\"onMount\",u=>{o.value=u,s.value=\"mount\"});const l=u=>{u==\"mount\"&&(o.value=null),s.value=u};return(u,c)=>(C(),Fe(El,{onHandleClose:n,title:\"Storage Manager\",width:\"920px\"},{default:Ue(()=>[d(\"ul\",vw,[d(\"button\",{class:_t({on:s.value==\"main\"}),onClick:c[0]||(c[0]=_=>l(\"main\")),disabled:r.value},\"\\u6458\\u8981\",10,yw),d(\"button\",{class:_t({on:s.value==\"partition\"}),onClick:c[1]||(c[1]=_=>l(\"partition\")),disabled:r.value},\"\\u5206\\u533A\",10,bw),d(\"button\",{class:_t({on:s.value==\"mount\"}),onClick:c[2]||(c[2]=_=>l(\"mount\")),disabled:r.value},\"\\u6302\\u8F7D\",10,Ew),d(\"button\",{class:_t({on:s.value==\"foramt\"}),onClick:c[3]||(c[3]=_=>l(\"foramt\")),disabled:r.value},\"\\u683C\\u5F0F\\u5316\",10,kw)]),s.value==\"main\"?(C(),Fe(Rk,{key:0})):s.value==\"partition\"?(C(),Fe(nw,{key:1})):s.value==\"mount\"?(C(),Fe(Kk,{key:2,mountIndex:o.value},null,8,[\"mountIndex\"])):s.value==\"foramt\"?(C(),Fe(gw,{key:3})):pe(\"\",!0)]),_:1}))}});var Sw=he(ww,[[\"__scopeId\",\"data-v-1b963653\"]]);class Cw extends bl{OpenDisk(t){this.openWindow(Sw,t)}}const T1=new Cw;T1.OpenDisk;document.title=E1.HostName;const cr=Wi(l6);cr.use(k7());S7();cr.use(vv).use(By);cr.use(R9);cr.use(i6);cr.use(CE).use(sk).use(T1);cr.mount(\"#app\");export{Ts as $,nn as A,ls as B,oe as C,Od as D,ct as E,me as F,S3 as G,T1 as H,o1 as I,ek as J,Nw as K,Pw as L,D9 as M,ja as N,sk as O,oc as P,CE as Q,It as R,sd as S,fe as T,_t as U,El as V,bl as W,is as X,Ms as Y,Yt as Z,he as _,d as a,Ow as a0,Iw as a1,Hi as a2,Aw as a3,i6 as a4,rr as a5,Wi as a6,Lw as a7,Mw as a8,Ii as a9,j as aa,Fw as ab,w3 as ac,Zn as ad,Ie as b,N as c,ue as d,Fe as e,$i as f,J as g,it as h,be as i,wt as j,dd as k,X as l,pe as m,E1 as n,C as o,nt as p,st as q,ht as r,le as s,wv as t,ur as u,Dw as v,Ue as w,Xe as x,es as y,Et as z};\n"
  },
  {
    "path": "luci-app-istorex/htdocs/luci-static/istorex/style.css",
    "content": "@keyframes turns-5bcbebe8{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-5bcbebe8]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-5bcbebe8]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-5bcbebe8]{color:#f9ad1e}.notice_info li[data-v-5bcbebe8]{font-size:14px;list-style:revert}.text-container[data-v-5bcbebe8]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-5bcbebe8]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-5bcbebe8]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-5bcbebe8]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-5bcbebe8]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-5bcbebe8]{width:100%}.text-container .text-container_item p.info-desc[data-v-5bcbebe8]{width:100%;color:#999;font-size:14px}.page-container[data-v-5bcbebe8]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-5bcbebe8]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-5bcbebe8]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-5bcbebe8]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-5bcbebe8],.page-container .page-flex .page-sidebar a[data-v-5bcbebe8]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5bcbebe8]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5bcbebe8]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-5bcbebe8]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-5bcbebe8]{border-radius:0;padding:1rem}ul.ul-container[data-v-5bcbebe8]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-5bcbebe8]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-5bcbebe8]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-5bcbebe8]{width:100%}form.form-container[data-v-5bcbebe8]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-5bcbebe8]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-5bcbebe8]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-5bcbebe8]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-5bcbebe8]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-5bcbebe8],form.form-container .label-value select[data-v-5bcbebe8]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-5bcbebe8]:focus,form.form-container .label-value select[data-v-5bcbebe8]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-5bcbebe8]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-5bcbebe8]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-5bcbebe8],form.form-container .label-value input[type=radio][data-v-5bcbebe8]{width:auto}form.form-container .label-value input[type=radio][data-v-5bcbebe8]{margin:0 4px 0 0}form.form-container .label-value input[data-v-5bcbebe8]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-5bcbebe8]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5bcbebe8]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5bcbebe8]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-5bcbebe8]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-5bcbebe8]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-5bcbebe8]:hover{background-color:#747474}form.form-container .label-msg[data-v-5bcbebe8]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-5bcbebe8]{color:#f9ad1e}form.form-container .label-flex[data-v-5bcbebe8]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-5bcbebe8]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-5bcbebe8]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-5bcbebe8]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-5bcbebe8]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-5bcbebe8]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-5bcbebe8]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-5bcbebe8],form.form-container1 .label-value select[data-v-5bcbebe8]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-5bcbebe8]:focus,form.form-container1 .label-value select[data-v-5bcbebe8]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-5bcbebe8]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-5bcbebe8],form.form-container1 .label-value input[type=radio][data-v-5bcbebe8]{width:auto}form.form-container1 .label-value input[type=radio][data-v-5bcbebe8]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-5bcbebe8]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-5bcbebe8]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5bcbebe8]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5bcbebe8]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-5bcbebe8]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-5bcbebe8]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-5bcbebe8]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-5bcbebe8]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-5bcbebe8]{color:#f9ad1e}form.form-container1 .label-flex[data-v-5bcbebe8]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-5bcbebe8]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-5bcbebe8]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-5bcbebe8]{width:100px}table.page-table th.checkbox[data-v-5bcbebe8]{width:50px;text-align:center}table.page-table th.setting[data-v-5bcbebe8]{width:100px;text-align:center}table.page-table thead[data-v-5bcbebe8]{color:#909399}table.page-table thead tr[data-v-5bcbebe8]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-5bcbebe8]{padding:10px 16px}table.page-table tbody tr[data-v-5bcbebe8]:hover{background-color:#eeee}table.page-table tbody tr[data-v-5bcbebe8]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-5bcbebe8]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-5bcbebe8]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-5bcbebe8]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-5bcbebe8]{width:100px}table.popups-table th.checkbox[data-v-5bcbebe8]{width:50px;text-align:center}table.popups-table th.setting[data-v-5bcbebe8]{width:100px;text-align:center}table.popups-table thead[data-v-5bcbebe8]{color:#eee}table.popups-table thead tr[data-v-5bcbebe8]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-5bcbebe8]{padding:10px 16px}table.popups-table tbody tr[data-v-5bcbebe8]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-5bcbebe8]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-5bcbebe8]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-5bcbebe8]{width:100%}header.header-desktop[data-v-5bcbebe8]{display:block}header.header-mobile[data-v-5bcbebe8]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-5bcbebe8]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-5bcbebe8]{width:100%;height:100%}header.header-mobile button svg path[data-v-5bcbebe8]{fill:#fff}nav.sidebar[data-v-5bcbebe8]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-5bcbebe8]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-5bcbebe8]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-5bcbebe8]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-5bcbebe8]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-5bcbebe8]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-5bcbebe8]{color:#fff}nav.sidebar .container .children[data-v-5bcbebe8]{padding-left:30px}@-moz-keyframes tada-5bcbebe8{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-5bcbebe8{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-5bcbebe8{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-5bcbebe8{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-5bcbebe8]{animation:dialogEnter-5bcbebe8 .3s linear forwards}.dialog-leave-active[data-v-5bcbebe8]{animation:dialogLeave-5bcbebe8 .3s linear forwards}@keyframes dialogEnter-5bcbebe8{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-5bcbebe8{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-5bcbebe8]{animation:dialogEnter-5bcbebe8 .2s linear forwards}.dialog1-leave-active[data-v-5bcbebe8]{animation:dialogLeave-5bcbebe8 .2s linear forwards}@keyframes rotateEnter-5bcbebe8{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-5bcbebe8]{animation:rotateEnter-5bcbebe8 .7s;position:relative}.rotate-leave-active[data-v-5bcbebe8]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-5bcbebe8{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-5bcbebe8{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-5bcbebe8]{animation:slideOutTop-5bcbebe8 .5s linear forwards}.slide-top-leave-active[data-v-5bcbebe8],.slide-bottom-enter-active[data-v-5bcbebe8]{animation:slideOutBottom-5bcbebe8 .5s linear forwards}@keyframes slideInLeft-5bcbebe8{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-5bcbebe8{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-5bcbebe8]{animation:slideInLeft-5bcbebe8 .3s linear forwards}.slide-left-leave-active[data-v-5bcbebe8]{animation:slideInRight-5bcbebe8 .3s linear forwards}@keyframes slideOutLeft-5bcbebe8{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-5bcbebe8{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-5bcbebe8]{animation:slideOutLeft-5bcbebe8 .3s linear forwards}.slide-right-leave-active[data-v-5bcbebe8]{animation:slideOutRight-5bcbebe8 .3s linear forwards}@keyframes bganimation-5bcbebe8{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-5bcbebe8{0%{height:0}to{height:100px}}@keyframes fadeEnd-5bcbebe8{0%{height:100%}to{height:0}}.fade-enter-active[data-v-5bcbebe8]{animation:fadeStart-5bcbebe8 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-5bcbebe8]{animation:fadeEnd-5bcbebe8 .1s linear forwards;overflow:hidden}.bg[data-v-5bcbebe8]{position:fixed;inset:0;z-index:98;width:100%;height:100%}.themedog-popups[data-v-5bcbebe8]{border-radius:10px;box-shadow:0 2px 20px 3px #00000080;border-top:1px solid #6d6d6d;width:860px;height:620px;max-width:100%;overflow:hidden;color:#fff;position:absolute;left:calc(50% - 430px);top:calc(50% - 310px);z-index:99}.themedog-popups .themedog-popups_header[data-v-5bcbebe8]{width:100%;height:36px;padding:0 8px;background-color:#373838;cursor:pointer;display:flex;flex-wrap:wrap;align-items:center;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;-khtml-user-select:none;user-select:none}.themedog-popups .themedog-popups_header .auto[data-v-5bcbebe8]{flex:auto}.themedog-popups .themedog-popups_header span.title[data-v-5bcbebe8]{font-size:14px;color:#eee;margin-left:8px;overflow:hidden;text-overflow:ellipsis}.themedog-popups .themedog-popups_header .btns button[data-v-5bcbebe8]{background:none;border:none;padding:0;cursor:pointer;margin:0 0 0 10px;width:30px;height:30px}.themedog-popups .themedog-popups_header .btns button:hover svg.icon path[data-v-5bcbebe8]{fill:#eee}.themedog-popups .themedog-popups_header .btns button svg.icon[data-v-5bcbebe8]{width:18px;height:18px}.themedog-popups .themedog-popups_header .btns button svg.icon path[data-v-5bcbebe8]{fill:#9b9b9b}.themedog-popups .themedog-popups_body[data-v-5bcbebe8]{width:100%;height:calc(100% - 36px);overflow:overlay;background-color:#242424}.themedog-popups .themedog-popups_body.transparent[data-v-5bcbebe8]{background-color:transparent}.themedog-popups.full[data-v-5bcbebe8]{width:100%;height:100%;border-radius:0;position:fixed;inset:0;box-shadow:none;border:none}.themedog-popups.index[data-v-5bcbebe8]{z-index:100}@keyframes turns-e3f9f146{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-e3f9f146]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-e3f9f146]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-e3f9f146]{color:#f9ad1e}.notice_info li[data-v-e3f9f146]{font-size:14px;list-style:revert}.text-container[data-v-e3f9f146]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-e3f9f146]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-e3f9f146]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-e3f9f146]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-e3f9f146]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-e3f9f146]{width:100%}.text-container .text-container_item p.info-desc[data-v-e3f9f146]{width:100%;color:#999;font-size:14px}.page-container[data-v-e3f9f146]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-e3f9f146]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-e3f9f146]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-e3f9f146]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-e3f9f146],.page-container .page-flex .page-sidebar a[data-v-e3f9f146]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-e3f9f146]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-e3f9f146]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-e3f9f146]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-e3f9f146]{border-radius:0;padding:1rem}ul.ul-container[data-v-e3f9f146]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-e3f9f146]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-e3f9f146]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-e3f9f146]{width:100%}form.form-container[data-v-e3f9f146]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-e3f9f146]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-e3f9f146]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-e3f9f146]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-e3f9f146]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-e3f9f146],form.form-container .label-value select[data-v-e3f9f146]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-e3f9f146]:focus,form.form-container .label-value select[data-v-e3f9f146]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-e3f9f146]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-e3f9f146]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-e3f9f146],form.form-container .label-value input[type=radio][data-v-e3f9f146]{width:auto}form.form-container .label-value input[type=radio][data-v-e3f9f146]{margin:0 4px 0 0}form.form-container .label-value input[data-v-e3f9f146]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-e3f9f146]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-e3f9f146]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-e3f9f146]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-e3f9f146]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-e3f9f146]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-e3f9f146]:hover{background-color:#747474}form.form-container .label-msg[data-v-e3f9f146]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-e3f9f146]{color:#f9ad1e}form.form-container .label-flex[data-v-e3f9f146]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-e3f9f146]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-e3f9f146]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-e3f9f146]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-e3f9f146]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-e3f9f146]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-e3f9f146]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-e3f9f146],form.form-container1 .label-value select[data-v-e3f9f146]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-e3f9f146]:focus,form.form-container1 .label-value select[data-v-e3f9f146]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-e3f9f146]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-e3f9f146],form.form-container1 .label-value input[type=radio][data-v-e3f9f146]{width:auto}form.form-container1 .label-value input[type=radio][data-v-e3f9f146]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-e3f9f146]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-e3f9f146]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-e3f9f146]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-e3f9f146]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-e3f9f146]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-e3f9f146]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-e3f9f146]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-e3f9f146]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-e3f9f146]{color:#f9ad1e}form.form-container1 .label-flex[data-v-e3f9f146]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-e3f9f146]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-e3f9f146]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-e3f9f146]{width:100px}table.page-table th.checkbox[data-v-e3f9f146]{width:50px;text-align:center}table.page-table th.setting[data-v-e3f9f146]{width:100px;text-align:center}table.page-table thead[data-v-e3f9f146]{color:#909399}table.page-table thead tr[data-v-e3f9f146]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-e3f9f146]{padding:10px 16px}table.page-table tbody tr[data-v-e3f9f146]:hover{background-color:#eeee}table.page-table tbody tr[data-v-e3f9f146]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-e3f9f146]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-e3f9f146]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-e3f9f146]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-e3f9f146]{width:100px}table.popups-table th.checkbox[data-v-e3f9f146]{width:50px;text-align:center}table.popups-table th.setting[data-v-e3f9f146]{width:100px;text-align:center}table.popups-table thead[data-v-e3f9f146]{color:#eee}table.popups-table thead tr[data-v-e3f9f146]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-e3f9f146]{padding:10px 16px}table.popups-table tbody tr[data-v-e3f9f146]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-e3f9f146]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-e3f9f146]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-e3f9f146]{width:100%}header.header-desktop[data-v-e3f9f146]{display:block}header.header-mobile[data-v-e3f9f146]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-e3f9f146]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-e3f9f146]{width:100%;height:100%}header.header-mobile button svg path[data-v-e3f9f146]{fill:#fff}nav.sidebar[data-v-e3f9f146]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-e3f9f146]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-e3f9f146]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-e3f9f146]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-e3f9f146]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-e3f9f146]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-e3f9f146]{color:#fff}nav.sidebar .container .children[data-v-e3f9f146]{padding-left:30px}@-moz-keyframes tada-e3f9f146{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-e3f9f146{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-e3f9f146{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-e3f9f146{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-e3f9f146]{animation:dialogEnter-e3f9f146 .3s linear forwards}.dialog-leave-active[data-v-e3f9f146]{animation:dialogLeave-e3f9f146 .3s linear forwards}@keyframes dialogEnter-e3f9f146{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-e3f9f146{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-e3f9f146]{animation:dialogEnter-e3f9f146 .2s linear forwards}.dialog1-leave-active[data-v-e3f9f146]{animation:dialogLeave-e3f9f146 .2s linear forwards}@keyframes rotateEnter-e3f9f146{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-e3f9f146]{animation:rotateEnter-e3f9f146 .7s;position:relative}.rotate-leave-active[data-v-e3f9f146]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-e3f9f146{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-e3f9f146{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-e3f9f146]{animation:slideOutTop-e3f9f146 .5s linear forwards}.slide-top-leave-active[data-v-e3f9f146],.slide-bottom-enter-active[data-v-e3f9f146]{animation:slideOutBottom-e3f9f146 .5s linear forwards}@keyframes slideInLeft-e3f9f146{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-e3f9f146{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-e3f9f146]{animation:slideInLeft-e3f9f146 .3s linear forwards}.slide-left-leave-active[data-v-e3f9f146]{animation:slideInRight-e3f9f146 .3s linear forwards}@keyframes slideOutLeft-e3f9f146{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-e3f9f146{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-e3f9f146]{animation:slideOutLeft-e3f9f146 .3s linear forwards}.slide-right-leave-active[data-v-e3f9f146]{animation:slideOutRight-e3f9f146 .3s linear forwards}@keyframes bganimation-e3f9f146{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-e3f9f146{0%{height:0}to{height:100px}}@keyframes fadeEnd-e3f9f146{0%{height:100%}to{height:0}}.fade-enter-active[data-v-e3f9f146]{animation:fadeStart-e3f9f146 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-e3f9f146]{animation:fadeEnd-e3f9f146 .1s linear forwards;overflow:hidden}.popups-container[data-v-e3f9f146]{width:100%;height:100%;display:flex;flex-wrap:wrap}.popups-container .popups-container_f[data-v-e3f9f146]{flex:0 0 100%;max-width:200px;height:100%;overflow:overlay;border-right:1px solid #4a4a4a;padding:1rem;background-color:#1b1b1be8;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px)}.popups-container .popups-container_f[data-v-e3f9f146] .network-menu_item{width:100%;height:32px;line-height:32px;font-size:14px;cursor:pointer;color:#eee;padding:0 10px;margin-bottom:.5rem;display:block;user-select:none}.popups-container .popups-container_f[data-v-e3f9f146] .network-menu_item.on,.popups-container .popups-container_f[data-v-e3f9f146] .network-menu_item:hover{transition:.3s;color:#fff;background-color:#fffefe36;border-radius:6px}.popups-container .popups-container_r[data-v-e3f9f146]{flex:0 0 100%;max-width:calc(100% - 200px);height:100%;overflow:overlay;background-color:#1b1b1be8;-webkit-backdrop-filter:blur(20px);backdrop-filter:blur(20px)}.popups-container[data-v-e3f9f146] main{display:block;width:100%;padding:1rem}.popups-container[data-v-e3f9f146] main .item-label{display:flex;flex-wrap:wrap;align-items:flex-start;align-content:flex-start;width:100%;margin:1rem 0}.popups-container[data-v-e3f9f146] main .item-label .item-label_key{flex:0 0 100%;max-width:100px;text-align:left}.popups-container[data-v-e3f9f146] main .item-label .item-label_key span{font-size:14px;color:#eee}.popups-container[data-v-e3f9f146] main .item-label .item-label_value{flex:1;text-align:left}.popups-container[data-v-e3f9f146] main .item-label .item-label_value span{font-size:14px;color:#eee}.popups-container[data-v-e3f9f146] form{display:block;width:100%;padding:1rem}.popups-container[data-v-e3f9f146] form .label-name{display:block;width:100%;margin-bottom:.5rem}.popups-container[data-v-e3f9f146] form .label-name span:before{content:\"*\";color:#f56c6c;margin-right:4px}.popups-container[data-v-e3f9f146] form .label-value{display:block;width:100%;margin-bottom:1rem}.popups-container[data-v-e3f9f146] form .label-value input,.popups-container[data-v-e3f9f146] form .label-value select{display:block;width:100%;height:36px;background:none;border:1px solid #747474;color:#eee;font-size:14px;padding:0 10px}.popups-container[data-v-e3f9f146] form .label-value input:placeholder{color:#eee}.popups-container[data-v-e3f9f146] form .label-value select{border-radius:3px;padding:0 10px}.popups-container[data-v-e3f9f146] form .label-value input{border-left:none;border-right:none;border-top:none}.popups-container[data-v-e3f9f146] form .label-value input[type=checkbox],.popups-container[data-v-e3f9f146] form .label-value input[type=radio]{width:auto}.popups-container[data-v-e3f9f146] form .label-btns{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}.popups-container[data-v-e3f9f146] form .label-btns button.sumbit{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}.popups-container[data-v-e3f9f146] form .label-btns button.sumbit:hover{background-color:#747474}.popups-container[data-v-e3f9f146] form .label-msg{display:block;width:100%;color:#ff3b3b;font-size:14px;margin-bottom:1rem}.popups-container[data-v-e3f9f146] form .label-flex{width:100%;display:flex;flex-wrap:wrap}.popups-container[data-v-e3f9f146] form .label-flex label{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer}.popups-container.setup1[data-v-e3f9f146]{overflow:overlay;padding:1rem;background-color:#1e1e1e}.popups-container.setup2[data-v-e3f9f146]{overflow:overlay;background-color:#1e1e1e}@keyframes turns-1fde8680{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-1fde8680]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-1fde8680]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-1fde8680]{color:#f9ad1e}.notice_info li[data-v-1fde8680]{font-size:14px;list-style:revert}.text-container[data-v-1fde8680]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-1fde8680]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-1fde8680]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-1fde8680]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-1fde8680]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-1fde8680]{width:100%}.text-container .text-container_item p.info-desc[data-v-1fde8680]{width:100%;color:#999;font-size:14px}.page-container[data-v-1fde8680]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-1fde8680]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-1fde8680]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-1fde8680]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-1fde8680],.page-container .page-flex .page-sidebar a[data-v-1fde8680]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-1fde8680]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-1fde8680]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-1fde8680]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-1fde8680]{border-radius:0;padding:1rem}ul.ul-container[data-v-1fde8680]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-1fde8680]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-1fde8680]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-1fde8680]{width:100%}form.form-container[data-v-1fde8680]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-1fde8680]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-1fde8680]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-1fde8680]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-1fde8680]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-1fde8680],form.form-container .label-value select[data-v-1fde8680]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-1fde8680]:focus,form.form-container .label-value select[data-v-1fde8680]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-1fde8680]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-1fde8680]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-1fde8680],form.form-container .label-value input[type=radio][data-v-1fde8680]{width:auto}form.form-container .label-value input[type=radio][data-v-1fde8680]{margin:0 4px 0 0}form.form-container .label-value input[data-v-1fde8680]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-1fde8680]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-1fde8680]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-1fde8680]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-1fde8680]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-1fde8680]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-1fde8680]:hover{background-color:#747474}form.form-container .label-msg[data-v-1fde8680]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-1fde8680]{color:#f9ad1e}form.form-container .label-flex[data-v-1fde8680]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-1fde8680]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-1fde8680]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-1fde8680]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-1fde8680]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-1fde8680]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-1fde8680]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-1fde8680],form.form-container1 .label-value select[data-v-1fde8680]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-1fde8680]:focus,form.form-container1 .label-value select[data-v-1fde8680]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-1fde8680]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-1fde8680],form.form-container1 .label-value input[type=radio][data-v-1fde8680]{width:auto}form.form-container1 .label-value input[type=radio][data-v-1fde8680]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-1fde8680]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-1fde8680]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-1fde8680]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-1fde8680]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-1fde8680]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-1fde8680]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-1fde8680]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-1fde8680]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-1fde8680]{color:#f9ad1e}form.form-container1 .label-flex[data-v-1fde8680]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-1fde8680]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-1fde8680]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-1fde8680]{width:100px}table.page-table th.checkbox[data-v-1fde8680]{width:50px;text-align:center}table.page-table th.setting[data-v-1fde8680]{width:100px;text-align:center}table.page-table thead[data-v-1fde8680]{color:#909399}table.page-table thead tr[data-v-1fde8680]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-1fde8680]{padding:10px 16px}table.page-table tbody tr[data-v-1fde8680]:hover{background-color:#eeee}table.page-table tbody tr[data-v-1fde8680]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-1fde8680]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-1fde8680]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-1fde8680]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-1fde8680]{width:100px}table.popups-table th.checkbox[data-v-1fde8680]{width:50px;text-align:center}table.popups-table th.setting[data-v-1fde8680]{width:100px;text-align:center}table.popups-table thead[data-v-1fde8680]{color:#eee}table.popups-table thead tr[data-v-1fde8680]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-1fde8680]{padding:10px 16px}table.popups-table tbody tr[data-v-1fde8680]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-1fde8680]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-1fde8680]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-1fde8680]{width:100%}header.header-desktop[data-v-1fde8680]{display:block}header.header-mobile[data-v-1fde8680]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-1fde8680]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-1fde8680]{width:100%;height:100%}header.header-mobile button svg path[data-v-1fde8680]{fill:#fff}nav.sidebar[data-v-1fde8680]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-1fde8680]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-1fde8680]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-1fde8680]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-1fde8680]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-1fde8680]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-1fde8680]{color:#fff}nav.sidebar .container .children[data-v-1fde8680]{padding-left:30px}@-moz-keyframes tada-1fde8680{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-1fde8680{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-1fde8680{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-1fde8680{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-1fde8680]{animation:dialogEnter-1fde8680 .3s linear forwards}.dialog-leave-active[data-v-1fde8680]{animation:dialogLeave-1fde8680 .3s linear forwards}@keyframes dialogEnter-1fde8680{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-1fde8680{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-1fde8680]{animation:dialogEnter-1fde8680 .2s linear forwards}.dialog1-leave-active[data-v-1fde8680]{animation:dialogLeave-1fde8680 .2s linear forwards}@keyframes rotateEnter-1fde8680{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-1fde8680]{animation:rotateEnter-1fde8680 .7s;position:relative}.rotate-leave-active[data-v-1fde8680]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-1fde8680{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-1fde8680{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-1fde8680]{animation:slideOutTop-1fde8680 .5s linear forwards}.slide-top-leave-active[data-v-1fde8680],.slide-bottom-enter-active[data-v-1fde8680]{animation:slideOutBottom-1fde8680 .5s linear forwards}@keyframes slideInLeft-1fde8680{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-1fde8680{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-1fde8680]{animation:slideInLeft-1fde8680 .3s linear forwards}.slide-left-leave-active[data-v-1fde8680]{animation:slideInRight-1fde8680 .3s linear forwards}@keyframes slideOutLeft-1fde8680{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-1fde8680{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-1fde8680]{animation:slideOutLeft-1fde8680 .3s linear forwards}.slide-right-leave-active[data-v-1fde8680]{animation:slideOutRight-1fde8680 .3s linear forwards}@keyframes bganimation-1fde8680{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-1fde8680{0%{height:0}to{height:100px}}@keyframes fadeEnd-1fde8680{0%{height:100%}to{height:0}}.fade-enter-active[data-v-1fde8680]{animation:fadeStart-1fde8680 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-1fde8680]{animation:fadeEnd-1fde8680 .1s linear forwards;overflow:hidden}#action[data-v-1fde8680]{position:fixed;z-index:1000;width:100%;height:100%;inset:0;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;overflow:auto}#action .bg[data-v-1fde8680]{position:fixed;inset:0;width:100%;height:100%;background:rgba(0,0,0,.5);z-index:9}#action[data-v-1fde8680] .action-container{width:720px;background-color:#fff;position:fixed;z-index:10;left:0;right:0;margin:auto;overflow:auto;border-radius:3px}#action[data-v-1fde8680] .action-container .action-container_header{width:100%;height:50px;line-height:50px;cursor:pointer;display:flex;flex-wrap:wrap;align-items:center;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;-khtml-user-select:none;user-select:none;padding:0 25px;border-bottom:1px solid #eee}#action[data-v-1fde8680] .action-container .action-container_header span.title{margin:0;color:#333;font:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-moz-user-select:none;-webkit-user-select:none;user-select:none;font-size:20px}#action[data-v-1fde8680] .action-container .action-container_body{width:100%;min-height:400px;overflow:overlay;padding:0 25px}#action[data-v-1fde8680] .action-container .action-container_footer{width:100%;height:50px;line-height:50px;color:#333;display:flex;flex-wrap:wrap;align-items:center;padding:0 25px;border-top:1px solid #eee}#action[data-v-1fde8680] .action-container .action-container_footer .auto{flex:auto}#action[data-v-1fde8680] .action-container .action-container_footer button{margin-left:16px;height:30px;border-radius:4px;background:#0060ff;display:inline-flex;padding:4px 24px;justify-content:center;align-items:center;gap:10px;text-align:center;font-weight:500}#action[data-v-1fde8680] .action-container .action-container_footer button:hover{opacity:.9}#action[data-v-1fde8680] .action-container .action-container_footer .app-close{background-color:#fff}#action[data-v-1fde8680] .action-container .action-container_footer .app-next{background-color:#0060ff;color:#fff}@keyframes turns-177d395f{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-177d395f]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-177d395f]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-177d395f]{color:#f9ad1e}.notice_info li[data-v-177d395f]{font-size:14px;list-style:revert}.text-container[data-v-177d395f]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-177d395f]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-177d395f]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-177d395f]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-177d395f]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-177d395f]{width:100%}.text-container .text-container_item p.info-desc[data-v-177d395f]{width:100%;color:#999;font-size:14px}.page-container[data-v-177d395f]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-177d395f]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-177d395f]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-177d395f]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-177d395f],.page-container .page-flex .page-sidebar a[data-v-177d395f]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-177d395f]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-177d395f]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-177d395f]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-177d395f]{border-radius:0;padding:1rem}ul.ul-container[data-v-177d395f]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-177d395f]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-177d395f]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-177d395f]{width:100%}form.form-container[data-v-177d395f]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-177d395f]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-177d395f]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-177d395f]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-177d395f]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-177d395f],form.form-container .label-value select[data-v-177d395f]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-177d395f]:focus,form.form-container .label-value select[data-v-177d395f]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-177d395f]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-177d395f]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-177d395f],form.form-container .label-value input[type=radio][data-v-177d395f]{width:auto}form.form-container .label-value input[type=radio][data-v-177d395f]{margin:0 4px 0 0}form.form-container .label-value input[data-v-177d395f]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-177d395f]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-177d395f]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-177d395f]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-177d395f]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-177d395f]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-177d395f]:hover{background-color:#747474}form.form-container .label-msg[data-v-177d395f]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-177d395f]{color:#f9ad1e}form.form-container .label-flex[data-v-177d395f]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-177d395f]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-177d395f]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-177d395f]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-177d395f]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-177d395f]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-177d395f]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-177d395f],form.form-container1 .label-value select[data-v-177d395f]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-177d395f]:focus,form.form-container1 .label-value select[data-v-177d395f]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-177d395f]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-177d395f],form.form-container1 .label-value input[type=radio][data-v-177d395f]{width:auto}form.form-container1 .label-value input[type=radio][data-v-177d395f]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-177d395f]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-177d395f]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-177d395f]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-177d395f]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-177d395f]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-177d395f]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-177d395f]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-177d395f]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-177d395f]{color:#f9ad1e}form.form-container1 .label-flex[data-v-177d395f]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-177d395f]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-177d395f]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-177d395f]{width:100px}table.page-table th.checkbox[data-v-177d395f]{width:50px;text-align:center}table.page-table th.setting[data-v-177d395f]{width:100px;text-align:center}table.page-table thead[data-v-177d395f]{color:#909399}table.page-table thead tr[data-v-177d395f]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-177d395f]{padding:10px 16px}table.page-table tbody tr[data-v-177d395f]:hover{background-color:#eeee}table.page-table tbody tr[data-v-177d395f]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-177d395f]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-177d395f]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-177d395f]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-177d395f]{width:100px}table.popups-table th.checkbox[data-v-177d395f]{width:50px;text-align:center}table.popups-table th.setting[data-v-177d395f]{width:100px;text-align:center}table.popups-table thead[data-v-177d395f]{color:#eee}table.popups-table thead tr[data-v-177d395f]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-177d395f]{padding:10px 16px}table.popups-table tbody tr[data-v-177d395f]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-177d395f]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-177d395f]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-177d395f]{width:100%}header.header-desktop[data-v-177d395f]{display:block}header.header-mobile[data-v-177d395f]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-177d395f]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-177d395f]{width:100%;height:100%}header.header-mobile button svg path[data-v-177d395f]{fill:#fff}nav.sidebar[data-v-177d395f]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-177d395f]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-177d395f]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-177d395f]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-177d395f]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-177d395f]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-177d395f]{color:#fff}nav.sidebar .container .children[data-v-177d395f]{padding-left:30px}@-moz-keyframes tada-177d395f{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-177d395f{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-177d395f{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-177d395f{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-177d395f]{animation:dialogEnter-177d395f .3s linear forwards}.dialog-leave-active[data-v-177d395f]{animation:dialogLeave-177d395f .3s linear forwards}@keyframes dialogEnter-177d395f{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-177d395f{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-177d395f]{animation:dialogEnter-177d395f .2s linear forwards}.dialog1-leave-active[data-v-177d395f]{animation:dialogLeave-177d395f .2s linear forwards}@keyframes rotateEnter-177d395f{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-177d395f]{animation:rotateEnter-177d395f .7s;position:relative}.rotate-leave-active[data-v-177d395f]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-177d395f{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-177d395f{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-177d395f]{animation:slideOutTop-177d395f .5s linear forwards}.slide-top-leave-active[data-v-177d395f],.slide-bottom-enter-active[data-v-177d395f]{animation:slideOutBottom-177d395f .5s linear forwards}@keyframes slideInLeft-177d395f{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-177d395f{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-177d395f]{animation:slideInLeft-177d395f .3s linear forwards}.slide-left-leave-active[data-v-177d395f]{animation:slideInRight-177d395f .3s linear forwards}@keyframes slideOutLeft-177d395f{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-177d395f{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-177d395f]{animation:slideOutLeft-177d395f .3s linear forwards}.slide-right-leave-active[data-v-177d395f]{animation:slideOutRight-177d395f .3s linear forwards}@keyframes bganimation-177d395f{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-177d395f{0%{height:0}to{height:100px}}@keyframes fadeEnd-177d395f{0%{height:100%}to{height:0}}.fade-enter-active[data-v-177d395f]{animation:fadeStart-177d395f .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-177d395f]{animation:fadeEnd-177d395f .1s linear forwards;overflow:hidden}iframe[data-v-177d395f]{width:100%;height:100%;border:none;resize:vertical;background:#2b2b2b}@keyframes turns-c694747c{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-c694747c]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-c694747c]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-c694747c]{color:#f9ad1e}.notice_info li[data-v-c694747c]{font-size:14px;list-style:revert}.text-container[data-v-c694747c]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-c694747c]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-c694747c]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-c694747c]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-c694747c]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-c694747c]{width:100%}.text-container .text-container_item p.info-desc[data-v-c694747c]{width:100%;color:#999;font-size:14px}.page-container[data-v-c694747c]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-c694747c]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-c694747c]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-c694747c]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-c694747c],.page-container .page-flex .page-sidebar a[data-v-c694747c]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-c694747c]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-c694747c]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-c694747c]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-c694747c]{border-radius:0;padding:1rem}ul.ul-container[data-v-c694747c]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-c694747c]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-c694747c]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-c694747c]{width:100%}form.form-container[data-v-c694747c]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-c694747c]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-c694747c]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-c694747c]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-c694747c]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-c694747c],form.form-container .label-value select[data-v-c694747c]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-c694747c]:focus,form.form-container .label-value select[data-v-c694747c]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-c694747c]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-c694747c]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-c694747c],form.form-container .label-value input[type=radio][data-v-c694747c]{width:auto}form.form-container .label-value input[type=radio][data-v-c694747c]{margin:0 4px 0 0}form.form-container .label-value input[data-v-c694747c]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-c694747c]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-c694747c]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-c694747c]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-c694747c]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-c694747c]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-c694747c]:hover{background-color:#747474}form.form-container .label-msg[data-v-c694747c]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-c694747c]{color:#f9ad1e}form.form-container .label-flex[data-v-c694747c]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-c694747c]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-c694747c]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-c694747c]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-c694747c]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-c694747c]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-c694747c]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-c694747c],form.form-container1 .label-value select[data-v-c694747c]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-c694747c]:focus,form.form-container1 .label-value select[data-v-c694747c]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-c694747c]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-c694747c],form.form-container1 .label-value input[type=radio][data-v-c694747c]{width:auto}form.form-container1 .label-value input[type=radio][data-v-c694747c]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-c694747c]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-c694747c]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-c694747c]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-c694747c]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-c694747c]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-c694747c]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-c694747c]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-c694747c]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-c694747c]{color:#f9ad1e}form.form-container1 .label-flex[data-v-c694747c]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-c694747c]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-c694747c]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-c694747c]{width:100px}table.page-table th.checkbox[data-v-c694747c]{width:50px;text-align:center}table.page-table th.setting[data-v-c694747c]{width:100px;text-align:center}table.page-table thead[data-v-c694747c]{color:#909399}table.page-table thead tr[data-v-c694747c]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-c694747c]{padding:10px 16px}table.page-table tbody tr[data-v-c694747c]:hover{background-color:#eeee}table.page-table tbody tr[data-v-c694747c]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-c694747c]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-c694747c]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-c694747c]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-c694747c]{width:100px}table.popups-table th.checkbox[data-v-c694747c]{width:50px;text-align:center}table.popups-table th.setting[data-v-c694747c]{width:100px;text-align:center}table.popups-table thead[data-v-c694747c]{color:#eee}table.popups-table thead tr[data-v-c694747c]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-c694747c]{padding:10px 16px}table.popups-table tbody tr[data-v-c694747c]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-c694747c]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-c694747c]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-c694747c]{width:100%}header.header-desktop[data-v-c694747c]{display:block}header.header-mobile[data-v-c694747c]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-c694747c]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-c694747c]{width:100%;height:100%}header.header-mobile button svg path[data-v-c694747c]{fill:#fff}nav.sidebar[data-v-c694747c]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-c694747c]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-c694747c]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-c694747c]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-c694747c]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-c694747c]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-c694747c]{color:#fff}nav.sidebar .container .children[data-v-c694747c]{padding-left:30px}@-moz-keyframes tada-c694747c{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-c694747c{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-c694747c{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-c694747c{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-c694747c]{animation:dialogEnter-c694747c .3s linear forwards}.dialog-leave-active[data-v-c694747c]{animation:dialogLeave-c694747c .3s linear forwards}@keyframes dialogEnter-c694747c{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-c694747c{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-c694747c]{animation:dialogEnter-c694747c .2s linear forwards}.dialog1-leave-active[data-v-c694747c]{animation:dialogLeave-c694747c .2s linear forwards}@keyframes rotateEnter-c694747c{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-c694747c]{animation:rotateEnter-c694747c .7s;position:relative}.rotate-leave-active[data-v-c694747c]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-c694747c{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-c694747c{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-c694747c]{animation:slideOutTop-c694747c .5s linear forwards}.slide-top-leave-active[data-v-c694747c],.slide-bottom-enter-active[data-v-c694747c]{animation:slideOutBottom-c694747c .5s linear forwards}@keyframes slideInLeft-c694747c{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-c694747c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-c694747c]{animation:slideInLeft-c694747c .3s linear forwards}.slide-left-leave-active[data-v-c694747c]{animation:slideInRight-c694747c .3s linear forwards}@keyframes slideOutLeft-c694747c{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-c694747c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-c694747c]{animation:slideOutLeft-c694747c .3s linear forwards}.slide-right-leave-active[data-v-c694747c]{animation:slideOutRight-c694747c .3s linear forwards}@keyframes bganimation-c694747c{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-c694747c{0%{height:0}to{height:100px}}@keyframes fadeEnd-c694747c{0%{height:100%}to{height:0}}.fade-enter-active[data-v-c694747c]{animation:fadeStart-c694747c .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-c694747c]{animation:fadeEnd-c694747c .1s linear forwards;overflow:hidden}@keyframes turn-c694747c{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.locking[data-v-c694747c]{position:fixed;inset:0;width:100%;height:100%;z-index:9998}.toast[data-v-c694747c]{position:fixed;top:50%;left:50%;display:flex;flex-direction:column;align-items:center;justify-content:space-around;box-sizing:content-box;width:100px;max-width:70%;padding:16px;color:#fff;font-size:14px;text-align:center;background-color:#000000b3;border-radius:8px;transform:translate3d(-50%,-50%,0);z-index:9999;transition:.3s;cursor:pointer}.toast div.icon[data-v-c694747c]{width:50px;height:50px;margin:15px 0}.toast div.icon svg[data-v-c694747c]{width:100%;height:100%}.toast div.icon svg path[data-v-c694747c]{fill:#fff}.toast .loading[data-v-c694747c]{animation:turn-c694747c 5s linear infinite}.toast .message[data-v-c694747c]{display:block;width:100%}@keyframes turns-840edaba{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-840edaba]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-840edaba]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-840edaba]{color:#f9ad1e}.notice_info li[data-v-840edaba]{font-size:14px;list-style:revert}.text-container[data-v-840edaba]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-840edaba]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-840edaba]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-840edaba]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-840edaba]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-840edaba]{width:100%}.text-container .text-container_item p.info-desc[data-v-840edaba]{width:100%;color:#999;font-size:14px}.page-container[data-v-840edaba]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-840edaba]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-840edaba]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-840edaba]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-840edaba],.page-container .page-flex .page-sidebar a[data-v-840edaba]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-840edaba]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-840edaba]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-840edaba]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-840edaba]{border-radius:0;padding:1rem}ul.ul-container[data-v-840edaba]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-840edaba]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-840edaba]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-840edaba]{width:100%}form.form-container[data-v-840edaba]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-840edaba]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-840edaba]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-840edaba]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-840edaba]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-840edaba],form.form-container .label-value select[data-v-840edaba]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-840edaba]:focus,form.form-container .label-value select[data-v-840edaba]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-840edaba]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-840edaba]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-840edaba],form.form-container .label-value input[type=radio][data-v-840edaba]{width:auto}form.form-container .label-value input[type=radio][data-v-840edaba]{margin:0 4px 0 0}form.form-container .label-value input[data-v-840edaba]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-840edaba]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-840edaba]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-840edaba]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-840edaba]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-840edaba]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-840edaba]:hover{background-color:#747474}form.form-container .label-msg[data-v-840edaba]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-840edaba]{color:#f9ad1e}form.form-container .label-flex[data-v-840edaba]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-840edaba]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-840edaba]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-840edaba]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-840edaba]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-840edaba]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-840edaba]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-840edaba],form.form-container1 .label-value select[data-v-840edaba]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-840edaba]:focus,form.form-container1 .label-value select[data-v-840edaba]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-840edaba]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-840edaba],form.form-container1 .label-value input[type=radio][data-v-840edaba]{width:auto}form.form-container1 .label-value input[type=radio][data-v-840edaba]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-840edaba]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-840edaba]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-840edaba]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-840edaba]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-840edaba]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-840edaba]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-840edaba]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-840edaba]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-840edaba]{color:#f9ad1e}form.form-container1 .label-flex[data-v-840edaba]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-840edaba]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-840edaba]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-840edaba]{width:100px}table.page-table th.checkbox[data-v-840edaba]{width:50px;text-align:center}table.page-table th.setting[data-v-840edaba]{width:100px;text-align:center}table.page-table thead[data-v-840edaba]{color:#909399}table.page-table thead tr[data-v-840edaba]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-840edaba]{padding:10px 16px}table.page-table tbody tr[data-v-840edaba]:hover{background-color:#eeee}table.page-table tbody tr[data-v-840edaba]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-840edaba]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-840edaba]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-840edaba]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-840edaba]{width:100px}table.popups-table th.checkbox[data-v-840edaba]{width:50px;text-align:center}table.popups-table th.setting[data-v-840edaba]{width:100px;text-align:center}table.popups-table thead[data-v-840edaba]{color:#eee}table.popups-table thead tr[data-v-840edaba]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-840edaba]{padding:10px 16px}table.popups-table tbody tr[data-v-840edaba]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-840edaba]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-840edaba]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-840edaba]{width:100%}header.header-desktop[data-v-840edaba]{display:block}header.header-mobile[data-v-840edaba]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-840edaba]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-840edaba]{width:100%;height:100%}header.header-mobile button svg path[data-v-840edaba]{fill:#fff}nav.sidebar[data-v-840edaba]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-840edaba]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-840edaba]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-840edaba]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-840edaba]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-840edaba]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-840edaba]{color:#fff}nav.sidebar .container .children[data-v-840edaba]{padding-left:30px}@-moz-keyframes tada-840edaba{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-840edaba{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-840edaba{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-840edaba{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-840edaba]{animation:dialogEnter-840edaba .3s linear forwards}.dialog-leave-active[data-v-840edaba]{animation:dialogLeave-840edaba .3s linear forwards}@keyframes dialogEnter-840edaba{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-840edaba{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-840edaba]{animation:dialogEnter-840edaba .2s linear forwards}.dialog1-leave-active[data-v-840edaba]{animation:dialogLeave-840edaba .2s linear forwards}@keyframes rotateEnter-840edaba{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-840edaba]{animation:rotateEnter-840edaba .7s;position:relative}.rotate-leave-active[data-v-840edaba]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-840edaba{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-840edaba{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-840edaba]{animation:slideOutTop-840edaba .5s linear forwards}.slide-top-leave-active[data-v-840edaba],.slide-bottom-enter-active[data-v-840edaba]{animation:slideOutBottom-840edaba .5s linear forwards}@keyframes slideInLeft-840edaba{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-840edaba{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-840edaba]{animation:slideInLeft-840edaba .3s linear forwards}.slide-left-leave-active[data-v-840edaba]{animation:slideInRight-840edaba .3s linear forwards}@keyframes slideOutLeft-840edaba{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-840edaba{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-840edaba]{animation:slideOutLeft-840edaba .3s linear forwards}.slide-right-leave-active[data-v-840edaba]{animation:slideOutRight-840edaba .3s linear forwards}@keyframes bganimation-840edaba{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-840edaba{0%{height:0}to{height:100px}}@keyframes fadeEnd-840edaba{0%{height:100%}to{height:0}}.fade-enter-active[data-v-840edaba]{animation:fadeStart-840edaba .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-840edaba]{animation:fadeEnd-840edaba .1s linear forwards;overflow:hidden}form[data-v-840edaba]{margin-top:1rem;padding:0!important}button[disabled][data-v-840edaba],button[disabled][data-v-840edaba]:hover{opacity:.5}@keyframes turns-17e3ba10{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-17e3ba10]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-17e3ba10]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-17e3ba10]{color:#f9ad1e}.notice_info li[data-v-17e3ba10]{font-size:14px;list-style:revert}.text-container[data-v-17e3ba10]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-17e3ba10]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-17e3ba10]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-17e3ba10]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-17e3ba10]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-17e3ba10]{width:100%}.text-container .text-container_item p.info-desc[data-v-17e3ba10]{width:100%;color:#999;font-size:14px}.page-container[data-v-17e3ba10]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-17e3ba10]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-17e3ba10]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-17e3ba10]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-17e3ba10],.page-container .page-flex .page-sidebar a[data-v-17e3ba10]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-17e3ba10]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-17e3ba10]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-17e3ba10]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-17e3ba10]{border-radius:0;padding:1rem}ul.ul-container[data-v-17e3ba10]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-17e3ba10]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-17e3ba10]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-17e3ba10]{width:100%}form.form-container[data-v-17e3ba10]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-17e3ba10]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-17e3ba10]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-17e3ba10]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-17e3ba10]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-17e3ba10],form.form-container .label-value select[data-v-17e3ba10]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-17e3ba10]:focus,form.form-container .label-value select[data-v-17e3ba10]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-17e3ba10]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-17e3ba10]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-17e3ba10],form.form-container .label-value input[type=radio][data-v-17e3ba10]{width:auto}form.form-container .label-value input[type=radio][data-v-17e3ba10]{margin:0 4px 0 0}form.form-container .label-value input[data-v-17e3ba10]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-17e3ba10]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-17e3ba10]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-17e3ba10]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-17e3ba10]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-17e3ba10]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-17e3ba10]:hover{background-color:#747474}form.form-container .label-msg[data-v-17e3ba10]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-17e3ba10]{color:#f9ad1e}form.form-container .label-flex[data-v-17e3ba10]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-17e3ba10]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-17e3ba10]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-17e3ba10]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-17e3ba10]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-17e3ba10]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-17e3ba10]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-17e3ba10],form.form-container1 .label-value select[data-v-17e3ba10]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-17e3ba10]:focus,form.form-container1 .label-value select[data-v-17e3ba10]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-17e3ba10]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-17e3ba10],form.form-container1 .label-value input[type=radio][data-v-17e3ba10]{width:auto}form.form-container1 .label-value input[type=radio][data-v-17e3ba10]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-17e3ba10]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-17e3ba10]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-17e3ba10]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-17e3ba10]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-17e3ba10]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-17e3ba10]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-17e3ba10]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-17e3ba10]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-17e3ba10]{color:#f9ad1e}form.form-container1 .label-flex[data-v-17e3ba10]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-17e3ba10]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-17e3ba10]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-17e3ba10]{width:100px}table.page-table th.checkbox[data-v-17e3ba10]{width:50px;text-align:center}table.page-table th.setting[data-v-17e3ba10]{width:100px;text-align:center}table.page-table thead[data-v-17e3ba10]{color:#909399}table.page-table thead tr[data-v-17e3ba10]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-17e3ba10]{padding:10px 16px}table.page-table tbody tr[data-v-17e3ba10]:hover{background-color:#eeee}table.page-table tbody tr[data-v-17e3ba10]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-17e3ba10]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-17e3ba10]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-17e3ba10]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-17e3ba10]{width:100px}table.popups-table th.checkbox[data-v-17e3ba10]{width:50px;text-align:center}table.popups-table th.setting[data-v-17e3ba10]{width:100px;text-align:center}table.popups-table thead[data-v-17e3ba10]{color:#eee}table.popups-table thead tr[data-v-17e3ba10]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-17e3ba10]{padding:10px 16px}table.popups-table tbody tr[data-v-17e3ba10]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-17e3ba10]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-17e3ba10]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-17e3ba10]{width:100%}header.header-desktop[data-v-17e3ba10]{display:block}header.header-mobile[data-v-17e3ba10]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-17e3ba10]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-17e3ba10]{width:100%;height:100%}header.header-mobile button svg path[data-v-17e3ba10]{fill:#fff}nav.sidebar[data-v-17e3ba10]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-17e3ba10]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-17e3ba10]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-17e3ba10]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-17e3ba10]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-17e3ba10]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-17e3ba10]{color:#fff}nav.sidebar .container .children[data-v-17e3ba10]{padding-left:30px}@-moz-keyframes tada-17e3ba10{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-17e3ba10{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-17e3ba10{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-17e3ba10{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-17e3ba10]{animation:dialogEnter-17e3ba10 .3s linear forwards}.dialog-leave-active[data-v-17e3ba10]{animation:dialogLeave-17e3ba10 .3s linear forwards}@keyframes dialogEnter-17e3ba10{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-17e3ba10{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-17e3ba10]{animation:dialogEnter-17e3ba10 .2s linear forwards}.dialog1-leave-active[data-v-17e3ba10]{animation:dialogLeave-17e3ba10 .2s linear forwards}@keyframes rotateEnter-17e3ba10{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-17e3ba10]{animation:rotateEnter-17e3ba10 .7s;position:relative}.rotate-leave-active[data-v-17e3ba10]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-17e3ba10{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-17e3ba10{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-17e3ba10]{animation:slideOutTop-17e3ba10 .5s linear forwards}.slide-top-leave-active[data-v-17e3ba10],.slide-bottom-enter-active[data-v-17e3ba10]{animation:slideOutBottom-17e3ba10 .5s linear forwards}@keyframes slideInLeft-17e3ba10{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-17e3ba10{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-17e3ba10]{animation:slideInLeft-17e3ba10 .3s linear forwards}.slide-left-leave-active[data-v-17e3ba10]{animation:slideInRight-17e3ba10 .3s linear forwards}@keyframes slideOutLeft-17e3ba10{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-17e3ba10{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-17e3ba10]{animation:slideOutLeft-17e3ba10 .3s linear forwards}.slide-right-leave-active[data-v-17e3ba10]{animation:slideOutRight-17e3ba10 .3s linear forwards}@keyframes bganimation-17e3ba10{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-17e3ba10{0%{height:0}to{height:100px}}@keyframes fadeEnd-17e3ba10{0%{height:100%}to{height:0}}.fade-enter-active[data-v-17e3ba10]{animation:fadeStart-17e3ba10 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-17e3ba10]{animation:fadeEnd-17e3ba10 .1s linear forwards;overflow:hidden}iframe[data-v-17e3ba10]{width:100%;height:400px;border:none}@keyframes turns-394e5818{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-394e5818]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-394e5818]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-394e5818]{color:#f9ad1e}.notice_info li[data-v-394e5818]{font-size:14px;list-style:revert}.text-container[data-v-394e5818]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-394e5818]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-394e5818]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-394e5818]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-394e5818]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-394e5818]{width:100%}.text-container .text-container_item p.info-desc[data-v-394e5818]{width:100%;color:#999;font-size:14px}.page-container[data-v-394e5818]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-394e5818]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-394e5818]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-394e5818]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-394e5818],.page-container .page-flex .page-sidebar a[data-v-394e5818]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-394e5818]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-394e5818]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-394e5818]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-394e5818]{border-radius:0;padding:1rem}ul.ul-container[data-v-394e5818]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-394e5818]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-394e5818]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-394e5818]{width:100%}form.form-container[data-v-394e5818]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-394e5818]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-394e5818]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-394e5818]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-394e5818]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-394e5818],form.form-container .label-value select[data-v-394e5818]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-394e5818]:focus,form.form-container .label-value select[data-v-394e5818]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-394e5818]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-394e5818]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-394e5818],form.form-container .label-value input[type=radio][data-v-394e5818]{width:auto}form.form-container .label-value input[type=radio][data-v-394e5818]{margin:0 4px 0 0}form.form-container .label-value input[data-v-394e5818]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-394e5818]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-394e5818]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-394e5818]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-394e5818]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-394e5818]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-394e5818]:hover{background-color:#747474}form.form-container .label-msg[data-v-394e5818]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-394e5818]{color:#f9ad1e}form.form-container .label-flex[data-v-394e5818]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-394e5818]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-394e5818]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-394e5818]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-394e5818]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-394e5818]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-394e5818]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-394e5818],form.form-container1 .label-value select[data-v-394e5818]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-394e5818]:focus,form.form-container1 .label-value select[data-v-394e5818]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-394e5818]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-394e5818],form.form-container1 .label-value input[type=radio][data-v-394e5818]{width:auto}form.form-container1 .label-value input[type=radio][data-v-394e5818]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-394e5818]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-394e5818]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-394e5818]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-394e5818]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-394e5818]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-394e5818]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-394e5818]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-394e5818]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-394e5818]{color:#f9ad1e}form.form-container1 .label-flex[data-v-394e5818]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-394e5818]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-394e5818]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-394e5818]{width:100px}table.page-table th.checkbox[data-v-394e5818]{width:50px;text-align:center}table.page-table th.setting[data-v-394e5818]{width:100px;text-align:center}table.page-table thead[data-v-394e5818]{color:#909399}table.page-table thead tr[data-v-394e5818]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-394e5818]{padding:10px 16px}table.page-table tbody tr[data-v-394e5818]:hover{background-color:#eeee}table.page-table tbody tr[data-v-394e5818]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-394e5818]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-394e5818]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-394e5818]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-394e5818]{width:100px}table.popups-table th.checkbox[data-v-394e5818]{width:50px;text-align:center}table.popups-table th.setting[data-v-394e5818]{width:100px;text-align:center}table.popups-table thead[data-v-394e5818]{color:#eee}table.popups-table thead tr[data-v-394e5818]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-394e5818]{padding:10px 16px}table.popups-table tbody tr[data-v-394e5818]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-394e5818]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-394e5818]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-394e5818]{width:100%}header.header-desktop[data-v-394e5818]{display:block}header.header-mobile[data-v-394e5818]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-394e5818]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-394e5818]{width:100%;height:100%}header.header-mobile button svg path[data-v-394e5818]{fill:#fff}nav.sidebar[data-v-394e5818]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-394e5818]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-394e5818]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-394e5818]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-394e5818]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-394e5818]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-394e5818]{color:#fff}nav.sidebar .container .children[data-v-394e5818]{padding-left:30px}@-moz-keyframes tada-394e5818{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-394e5818{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-394e5818{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-394e5818{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-394e5818]{animation:dialogEnter-394e5818 .3s linear forwards}.dialog-leave-active[data-v-394e5818]{animation:dialogLeave-394e5818 .3s linear forwards}@keyframes dialogEnter-394e5818{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-394e5818{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-394e5818]{animation:dialogEnter-394e5818 .2s linear forwards}.dialog1-leave-active[data-v-394e5818]{animation:dialogLeave-394e5818 .2s linear forwards}@keyframes rotateEnter-394e5818{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-394e5818]{animation:rotateEnter-394e5818 .7s;position:relative}.rotate-leave-active[data-v-394e5818]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-394e5818{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-394e5818{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-394e5818]{animation:slideOutTop-394e5818 .5s linear forwards}.slide-top-leave-active[data-v-394e5818],.slide-bottom-enter-active[data-v-394e5818]{animation:slideOutBottom-394e5818 .5s linear forwards}@keyframes slideInLeft-394e5818{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-394e5818{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-394e5818]{animation:slideInLeft-394e5818 .3s linear forwards}.slide-left-leave-active[data-v-394e5818]{animation:slideInRight-394e5818 .3s linear forwards}@keyframes slideOutLeft-394e5818{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-394e5818{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-394e5818]{animation:slideOutLeft-394e5818 .3s linear forwards}.slide-right-leave-active[data-v-394e5818]{animation:slideOutRight-394e5818 .3s linear forwards}@keyframes bganimation-394e5818{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-394e5818{0%{height:0}to{height:100px}}@keyframes fadeEnd-394e5818{0%{height:100%}to{height:0}}.fade-enter-active[data-v-394e5818]{animation:fadeStart-394e5818 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-394e5818]{animation:fadeEnd-394e5818 .1s linear forwards;overflow:hidden}iframe[data-v-394e5818]{width:100%;height:400px;border:none}@keyframes turns-83f0ed5a{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-83f0ed5a]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-83f0ed5a]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-83f0ed5a]{color:#f9ad1e}.notice_info li[data-v-83f0ed5a]{font-size:14px;list-style:revert}.text-container[data-v-83f0ed5a]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-83f0ed5a]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-83f0ed5a]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-83f0ed5a]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-83f0ed5a]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-83f0ed5a]{width:100%}.text-container .text-container_item p.info-desc[data-v-83f0ed5a]{width:100%;color:#999;font-size:14px}.page-container[data-v-83f0ed5a]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-83f0ed5a]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-83f0ed5a]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-83f0ed5a]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-83f0ed5a],.page-container .page-flex .page-sidebar a[data-v-83f0ed5a]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-83f0ed5a]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-83f0ed5a]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-83f0ed5a]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-83f0ed5a]{border-radius:0;padding:1rem}ul.ul-container[data-v-83f0ed5a]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-83f0ed5a]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-83f0ed5a]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-83f0ed5a]{width:100%}form.form-container[data-v-83f0ed5a]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-83f0ed5a]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-83f0ed5a]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-83f0ed5a]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-83f0ed5a]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-83f0ed5a],form.form-container .label-value select[data-v-83f0ed5a]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-83f0ed5a]:focus,form.form-container .label-value select[data-v-83f0ed5a]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-83f0ed5a]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-83f0ed5a]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-83f0ed5a],form.form-container .label-value input[type=radio][data-v-83f0ed5a]{width:auto}form.form-container .label-value input[type=radio][data-v-83f0ed5a]{margin:0 4px 0 0}form.form-container .label-value input[data-v-83f0ed5a]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-83f0ed5a]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-83f0ed5a]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-83f0ed5a]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-83f0ed5a]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-83f0ed5a]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-83f0ed5a]:hover{background-color:#747474}form.form-container .label-msg[data-v-83f0ed5a]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-83f0ed5a]{color:#f9ad1e}form.form-container .label-flex[data-v-83f0ed5a]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-83f0ed5a]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-83f0ed5a]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-83f0ed5a]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-83f0ed5a]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-83f0ed5a]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-83f0ed5a]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-83f0ed5a],form.form-container1 .label-value select[data-v-83f0ed5a]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-83f0ed5a]:focus,form.form-container1 .label-value select[data-v-83f0ed5a]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-83f0ed5a]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-83f0ed5a],form.form-container1 .label-value input[type=radio][data-v-83f0ed5a]{width:auto}form.form-container1 .label-value input[type=radio][data-v-83f0ed5a]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-83f0ed5a]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-83f0ed5a]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-83f0ed5a]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-83f0ed5a]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-83f0ed5a]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-83f0ed5a]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-83f0ed5a]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-83f0ed5a]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-83f0ed5a]{color:#f9ad1e}form.form-container1 .label-flex[data-v-83f0ed5a]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-83f0ed5a]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-83f0ed5a]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-83f0ed5a]{width:100px}table.page-table th.checkbox[data-v-83f0ed5a]{width:50px;text-align:center}table.page-table th.setting[data-v-83f0ed5a]{width:100px;text-align:center}table.page-table thead[data-v-83f0ed5a]{color:#909399}table.page-table thead tr[data-v-83f0ed5a]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-83f0ed5a]{padding:10px 16px}table.page-table tbody tr[data-v-83f0ed5a]:hover{background-color:#eeee}table.page-table tbody tr[data-v-83f0ed5a]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-83f0ed5a]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-83f0ed5a]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-83f0ed5a]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-83f0ed5a]{width:100px}table.popups-table th.checkbox[data-v-83f0ed5a]{width:50px;text-align:center}table.popups-table th.setting[data-v-83f0ed5a]{width:100px;text-align:center}table.popups-table thead[data-v-83f0ed5a]{color:#eee}table.popups-table thead tr[data-v-83f0ed5a]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-83f0ed5a]{padding:10px 16px}table.popups-table tbody tr[data-v-83f0ed5a]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-83f0ed5a]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-83f0ed5a]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-83f0ed5a]{width:100%}header.header-desktop[data-v-83f0ed5a]{display:block}header.header-mobile[data-v-83f0ed5a]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-83f0ed5a]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-83f0ed5a]{width:100%;height:100%}header.header-mobile button svg path[data-v-83f0ed5a]{fill:#fff}nav.sidebar[data-v-83f0ed5a]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-83f0ed5a]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-83f0ed5a]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-83f0ed5a]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-83f0ed5a]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-83f0ed5a]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-83f0ed5a]{color:#fff}nav.sidebar .container .children[data-v-83f0ed5a]{padding-left:30px}@-moz-keyframes tada-83f0ed5a{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-83f0ed5a{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-83f0ed5a{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-83f0ed5a{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-83f0ed5a]{animation:dialogEnter-83f0ed5a .3s linear forwards}.dialog-leave-active[data-v-83f0ed5a]{animation:dialogLeave-83f0ed5a .3s linear forwards}@keyframes dialogEnter-83f0ed5a{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-83f0ed5a{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-83f0ed5a]{animation:dialogEnter-83f0ed5a .2s linear forwards}.dialog1-leave-active[data-v-83f0ed5a]{animation:dialogLeave-83f0ed5a .2s linear forwards}@keyframes rotateEnter-83f0ed5a{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-83f0ed5a]{animation:rotateEnter-83f0ed5a .7s;position:relative}.rotate-leave-active[data-v-83f0ed5a]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-83f0ed5a{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-83f0ed5a{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-83f0ed5a]{animation:slideOutTop-83f0ed5a .5s linear forwards}.slide-top-leave-active[data-v-83f0ed5a],.slide-bottom-enter-active[data-v-83f0ed5a]{animation:slideOutBottom-83f0ed5a .5s linear forwards}@keyframes slideInLeft-83f0ed5a{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-83f0ed5a{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-83f0ed5a]{animation:slideInLeft-83f0ed5a .3s linear forwards}.slide-left-leave-active[data-v-83f0ed5a]{animation:slideInRight-83f0ed5a .3s linear forwards}@keyframes slideOutLeft-83f0ed5a{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-83f0ed5a{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-83f0ed5a]{animation:slideOutLeft-83f0ed5a .3s linear forwards}.slide-right-leave-active[data-v-83f0ed5a]{animation:slideOutRight-83f0ed5a .3s linear forwards}@keyframes bganimation-83f0ed5a{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-83f0ed5a{0%{height:0}to{height:100px}}@keyframes fadeEnd-83f0ed5a{0%{height:100%}to{height:0}}.fade-enter-active[data-v-83f0ed5a]{animation:fadeStart-83f0ed5a .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-83f0ed5a]{animation:fadeEnd-83f0ed5a .1s linear forwards;overflow:hidden}[data-v-83f0ed5a] form{margin-top:1rem;padding:0!important}[data-v-83f0ed5a] form button[disabled],[data-v-83f0ed5a] form button[disabled]:hover{opacity:.5}[data-v-83f0ed5a] form .setup-install.message{text-align:center;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}@keyframes turns-6d7a2f13{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-6d7a2f13]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-6d7a2f13]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-6d7a2f13]{color:#f9ad1e}.notice_info li[data-v-6d7a2f13]{font-size:14px;list-style:revert}.text-container[data-v-6d7a2f13]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-6d7a2f13]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-6d7a2f13]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-6d7a2f13]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-6d7a2f13]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-6d7a2f13]{width:100%}.text-container .text-container_item p.info-desc[data-v-6d7a2f13]{width:100%;color:#999;font-size:14px}.page-container[data-v-6d7a2f13]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-6d7a2f13]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-6d7a2f13]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-6d7a2f13]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-6d7a2f13],.page-container .page-flex .page-sidebar a[data-v-6d7a2f13]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-6d7a2f13]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-6d7a2f13]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-6d7a2f13]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-6d7a2f13]{border-radius:0;padding:1rem}ul.ul-container[data-v-6d7a2f13]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-6d7a2f13]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-6d7a2f13]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-6d7a2f13]{width:100%}form.form-container[data-v-6d7a2f13]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-6d7a2f13]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-6d7a2f13]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-6d7a2f13]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-6d7a2f13]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-6d7a2f13],form.form-container .label-value select[data-v-6d7a2f13]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-6d7a2f13]:focus,form.form-container .label-value select[data-v-6d7a2f13]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-6d7a2f13]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-6d7a2f13]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-6d7a2f13],form.form-container .label-value input[type=radio][data-v-6d7a2f13]{width:auto}form.form-container .label-value input[type=radio][data-v-6d7a2f13]{margin:0 4px 0 0}form.form-container .label-value input[data-v-6d7a2f13]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-6d7a2f13]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-6d7a2f13]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-6d7a2f13]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-6d7a2f13]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-6d7a2f13]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-6d7a2f13]:hover{background-color:#747474}form.form-container .label-msg[data-v-6d7a2f13]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-6d7a2f13]{color:#f9ad1e}form.form-container .label-flex[data-v-6d7a2f13]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-6d7a2f13]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-6d7a2f13]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-6d7a2f13]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-6d7a2f13]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-6d7a2f13]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-6d7a2f13]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-6d7a2f13],form.form-container1 .label-value select[data-v-6d7a2f13]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-6d7a2f13]:focus,form.form-container1 .label-value select[data-v-6d7a2f13]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-6d7a2f13]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-6d7a2f13],form.form-container1 .label-value input[type=radio][data-v-6d7a2f13]{width:auto}form.form-container1 .label-value input[type=radio][data-v-6d7a2f13]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-6d7a2f13]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-6d7a2f13]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-6d7a2f13]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-6d7a2f13]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-6d7a2f13]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-6d7a2f13]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-6d7a2f13]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-6d7a2f13]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-6d7a2f13]{color:#f9ad1e}form.form-container1 .label-flex[data-v-6d7a2f13]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-6d7a2f13]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-6d7a2f13]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-6d7a2f13]{width:100px}table.page-table th.checkbox[data-v-6d7a2f13]{width:50px;text-align:center}table.page-table th.setting[data-v-6d7a2f13]{width:100px;text-align:center}table.page-table thead[data-v-6d7a2f13]{color:#909399}table.page-table thead tr[data-v-6d7a2f13]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-6d7a2f13]{padding:10px 16px}table.page-table tbody tr[data-v-6d7a2f13]:hover{background-color:#eeee}table.page-table tbody tr[data-v-6d7a2f13]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-6d7a2f13]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-6d7a2f13]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-6d7a2f13]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-6d7a2f13]{width:100px}table.popups-table th.checkbox[data-v-6d7a2f13]{width:50px;text-align:center}table.popups-table th.setting[data-v-6d7a2f13]{width:100px;text-align:center}table.popups-table thead[data-v-6d7a2f13]{color:#eee}table.popups-table thead tr[data-v-6d7a2f13]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-6d7a2f13]{padding:10px 16px}table.popups-table tbody tr[data-v-6d7a2f13]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-6d7a2f13]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-6d7a2f13]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-6d7a2f13]{width:100%}header.header-desktop[data-v-6d7a2f13]{display:block}header.header-mobile[data-v-6d7a2f13]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-6d7a2f13]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-6d7a2f13]{width:100%;height:100%}header.header-mobile button svg path[data-v-6d7a2f13]{fill:#fff}nav.sidebar[data-v-6d7a2f13]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-6d7a2f13]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-6d7a2f13]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-6d7a2f13]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-6d7a2f13]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-6d7a2f13]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-6d7a2f13]{color:#fff}nav.sidebar .container .children[data-v-6d7a2f13]{padding-left:30px}@-moz-keyframes tada-6d7a2f13{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-6d7a2f13{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-6d7a2f13{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-6d7a2f13{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-6d7a2f13]{animation:dialogEnter-6d7a2f13 .3s linear forwards}.dialog-leave-active[data-v-6d7a2f13]{animation:dialogLeave-6d7a2f13 .3s linear forwards}@keyframes dialogEnter-6d7a2f13{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-6d7a2f13{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-6d7a2f13]{animation:dialogEnter-6d7a2f13 .2s linear forwards}.dialog1-leave-active[data-v-6d7a2f13]{animation:dialogLeave-6d7a2f13 .2s linear forwards}@keyframes rotateEnter-6d7a2f13{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-6d7a2f13]{animation:rotateEnter-6d7a2f13 .7s;position:relative}.rotate-leave-active[data-v-6d7a2f13]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-6d7a2f13{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-6d7a2f13{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-6d7a2f13]{animation:slideOutTop-6d7a2f13 .5s linear forwards}.slide-top-leave-active[data-v-6d7a2f13],.slide-bottom-enter-active[data-v-6d7a2f13]{animation:slideOutBottom-6d7a2f13 .5s linear forwards}@keyframes slideInLeft-6d7a2f13{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-6d7a2f13{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-6d7a2f13]{animation:slideInLeft-6d7a2f13 .3s linear forwards}.slide-left-leave-active[data-v-6d7a2f13]{animation:slideInRight-6d7a2f13 .3s linear forwards}@keyframes slideOutLeft-6d7a2f13{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-6d7a2f13{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-6d7a2f13]{animation:slideOutLeft-6d7a2f13 .3s linear forwards}.slide-right-leave-active[data-v-6d7a2f13]{animation:slideOutRight-6d7a2f13 .3s linear forwards}@keyframes bganimation-6d7a2f13{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-6d7a2f13{0%{height:0}to{height:100px}}@keyframes fadeEnd-6d7a2f13{0%{height:100%}to{height:0}}.fade-enter-active[data-v-6d7a2f13]{animation:fadeStart-6d7a2f13 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-6d7a2f13]{animation:fadeEnd-6d7a2f13 .1s linear forwards;overflow:hidden}.action-container[data-v-6d7a2f13]{width:619px!important}.confirm[data-v-6d7a2f13],.success[data-v-6d7a2f13]{height:383px}.confirm>div[data-v-6d7a2f13],.success>div[data-v-6d7a2f13]{position:relative;top:50%;margin:0 auto;transform:translateY(-50%);width:242px}.confirm>div>svg[data-v-6d7a2f13],.success>div>svg[data-v-6d7a2f13]{display:block;margin:0 auto}.confirm>div span[data-v-6d7a2f13],.success>div span[data-v-6d7a2f13]{display:inline-block;width:100%;color:#000c;text-align:center}.confirm>div>span[data-v-6d7a2f13],.success>div>span[data-v-6d7a2f13]{margin:16px 0;font-size:15px;font-weight:600}.confirm>div>div>span[data-v-6d7a2f13]:first-of-type,.success>div>div>span[data-v-6d7a2f13]:first-of-type{font-size:15px}.confirm>div>div>span[data-v-6d7a2f13]:last-of-type,.success>div>div>span[data-v-6d7a2f13]:last-of-type{font-size:12px}@keyframes turns-16aaa3d0{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-16aaa3d0]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-16aaa3d0]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-16aaa3d0]{color:#f9ad1e}.notice_info li[data-v-16aaa3d0]{font-size:14px;list-style:revert}.text-container[data-v-16aaa3d0]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-16aaa3d0]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-16aaa3d0]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-16aaa3d0]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-16aaa3d0]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-16aaa3d0]{width:100%}.text-container .text-container_item p.info-desc[data-v-16aaa3d0]{width:100%;color:#999;font-size:14px}.page-container[data-v-16aaa3d0]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-16aaa3d0]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-16aaa3d0]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-16aaa3d0]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-16aaa3d0],.page-container .page-flex .page-sidebar a[data-v-16aaa3d0]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-16aaa3d0]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-16aaa3d0]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-16aaa3d0]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-16aaa3d0]{border-radius:0;padding:1rem}ul.ul-container[data-v-16aaa3d0]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-16aaa3d0]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-16aaa3d0]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-16aaa3d0]{width:100%}form.form-container[data-v-16aaa3d0]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-16aaa3d0]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-16aaa3d0]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-16aaa3d0]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-16aaa3d0]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-16aaa3d0],form.form-container .label-value select[data-v-16aaa3d0]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-16aaa3d0]:focus,form.form-container .label-value select[data-v-16aaa3d0]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-16aaa3d0]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-16aaa3d0]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-16aaa3d0],form.form-container .label-value input[type=radio][data-v-16aaa3d0]{width:auto}form.form-container .label-value input[type=radio][data-v-16aaa3d0]{margin:0 4px 0 0}form.form-container .label-value input[data-v-16aaa3d0]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-16aaa3d0]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-16aaa3d0]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-16aaa3d0]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-16aaa3d0]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-16aaa3d0]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-16aaa3d0]:hover{background-color:#747474}form.form-container .label-msg[data-v-16aaa3d0]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-16aaa3d0]{color:#f9ad1e}form.form-container .label-flex[data-v-16aaa3d0]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-16aaa3d0]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-16aaa3d0]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-16aaa3d0]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-16aaa3d0]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-16aaa3d0]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-16aaa3d0]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-16aaa3d0],form.form-container1 .label-value select[data-v-16aaa3d0]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-16aaa3d0]:focus,form.form-container1 .label-value select[data-v-16aaa3d0]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-16aaa3d0]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-16aaa3d0],form.form-container1 .label-value input[type=radio][data-v-16aaa3d0]{width:auto}form.form-container1 .label-value input[type=radio][data-v-16aaa3d0]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-16aaa3d0]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-16aaa3d0]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-16aaa3d0]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-16aaa3d0]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-16aaa3d0]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-16aaa3d0]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-16aaa3d0]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-16aaa3d0]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-16aaa3d0]{color:#f9ad1e}form.form-container1 .label-flex[data-v-16aaa3d0]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-16aaa3d0]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-16aaa3d0]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-16aaa3d0]{width:100px}table.page-table th.checkbox[data-v-16aaa3d0]{width:50px;text-align:center}table.page-table th.setting[data-v-16aaa3d0]{width:100px;text-align:center}table.page-table thead[data-v-16aaa3d0]{color:#909399}table.page-table thead tr[data-v-16aaa3d0]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-16aaa3d0]{padding:10px 16px}table.page-table tbody tr[data-v-16aaa3d0]:hover{background-color:#eeee}table.page-table tbody tr[data-v-16aaa3d0]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-16aaa3d0]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-16aaa3d0]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-16aaa3d0]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-16aaa3d0]{width:100px}table.popups-table th.checkbox[data-v-16aaa3d0]{width:50px;text-align:center}table.popups-table th.setting[data-v-16aaa3d0]{width:100px;text-align:center}table.popups-table thead[data-v-16aaa3d0]{color:#eee}table.popups-table thead tr[data-v-16aaa3d0]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-16aaa3d0]{padding:10px 16px}table.popups-table tbody tr[data-v-16aaa3d0]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-16aaa3d0]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-16aaa3d0]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-16aaa3d0]{width:100%}header.header-desktop[data-v-16aaa3d0]{display:block}header.header-mobile[data-v-16aaa3d0]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-16aaa3d0]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-16aaa3d0]{width:100%;height:100%}header.header-mobile button svg path[data-v-16aaa3d0]{fill:#fff}nav.sidebar[data-v-16aaa3d0]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-16aaa3d0]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-16aaa3d0]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-16aaa3d0]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-16aaa3d0]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-16aaa3d0]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-16aaa3d0]{color:#fff}nav.sidebar .container .children[data-v-16aaa3d0]{padding-left:30px}@-moz-keyframes tada-16aaa3d0{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-16aaa3d0{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-16aaa3d0{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-16aaa3d0{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-16aaa3d0]{animation:dialogEnter-16aaa3d0 .3s linear forwards}.dialog-leave-active[data-v-16aaa3d0]{animation:dialogLeave-16aaa3d0 .3s linear forwards}@keyframes dialogEnter-16aaa3d0{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-16aaa3d0{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-16aaa3d0]{animation:dialogEnter-16aaa3d0 .2s linear forwards}.dialog1-leave-active[data-v-16aaa3d0]{animation:dialogLeave-16aaa3d0 .2s linear forwards}@keyframes rotateEnter-16aaa3d0{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-16aaa3d0]{animation:rotateEnter-16aaa3d0 .7s;position:relative}.rotate-leave-active[data-v-16aaa3d0]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-16aaa3d0{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-16aaa3d0{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-16aaa3d0]{animation:slideOutTop-16aaa3d0 .5s linear forwards}.slide-top-leave-active[data-v-16aaa3d0],.slide-bottom-enter-active[data-v-16aaa3d0]{animation:slideOutBottom-16aaa3d0 .5s linear forwards}@keyframes slideInLeft-16aaa3d0{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-16aaa3d0{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-16aaa3d0]{animation:slideInLeft-16aaa3d0 .3s linear forwards}.slide-left-leave-active[data-v-16aaa3d0]{animation:slideInRight-16aaa3d0 .3s linear forwards}@keyframes slideOutLeft-16aaa3d0{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-16aaa3d0{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-16aaa3d0]{animation:slideOutLeft-16aaa3d0 .3s linear forwards}.slide-right-leave-active[data-v-16aaa3d0]{animation:slideOutRight-16aaa3d0 .3s linear forwards}@keyframes bganimation-16aaa3d0{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-16aaa3d0{0%{height:0}to{height:100px}}@keyframes fadeEnd-16aaa3d0{0%{height:100%}to{height:0}}.fade-enter-active[data-v-16aaa3d0]{animation:fadeStart-16aaa3d0 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-16aaa3d0]{animation:fadeEnd-16aaa3d0 .1s linear forwards;overflow:hidden}[data-v-16aaa3d0] form{margin-top:1rem;padding:0!important}[data-v-16aaa3d0] form button[disabled],[data-v-16aaa3d0] form button[disabled]:hover{opacity:.5}@keyframes turns-4a0aaeb7{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-4a0aaeb7]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-4a0aaeb7]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-4a0aaeb7]{color:#f9ad1e}.notice_info li[data-v-4a0aaeb7]{font-size:14px;list-style:revert}.text-container[data-v-4a0aaeb7]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-4a0aaeb7]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-4a0aaeb7]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-4a0aaeb7]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-4a0aaeb7]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-4a0aaeb7]{width:100%}.text-container .text-container_item p.info-desc[data-v-4a0aaeb7]{width:100%;color:#999;font-size:14px}.page-container[data-v-4a0aaeb7]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-4a0aaeb7]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-4a0aaeb7]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-4a0aaeb7]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-4a0aaeb7],.page-container .page-flex .page-sidebar a[data-v-4a0aaeb7]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-4a0aaeb7]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-4a0aaeb7]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-4a0aaeb7]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-4a0aaeb7]{border-radius:0;padding:1rem}ul.ul-container[data-v-4a0aaeb7]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-4a0aaeb7]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-4a0aaeb7]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-4a0aaeb7]{width:100%}form.form-container[data-v-4a0aaeb7]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-4a0aaeb7]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-4a0aaeb7]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-4a0aaeb7]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-4a0aaeb7]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-4a0aaeb7],form.form-container .label-value select[data-v-4a0aaeb7]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-4a0aaeb7]:focus,form.form-container .label-value select[data-v-4a0aaeb7]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-4a0aaeb7]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-4a0aaeb7]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-4a0aaeb7],form.form-container .label-value input[type=radio][data-v-4a0aaeb7]{width:auto}form.form-container .label-value input[type=radio][data-v-4a0aaeb7]{margin:0 4px 0 0}form.form-container .label-value input[data-v-4a0aaeb7]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-4a0aaeb7]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-4a0aaeb7]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-4a0aaeb7]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-4a0aaeb7]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-4a0aaeb7]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-4a0aaeb7]:hover{background-color:#747474}form.form-container .label-msg[data-v-4a0aaeb7]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-4a0aaeb7]{color:#f9ad1e}form.form-container .label-flex[data-v-4a0aaeb7]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-4a0aaeb7]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-4a0aaeb7]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-4a0aaeb7]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-4a0aaeb7]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-4a0aaeb7]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-4a0aaeb7]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-4a0aaeb7],form.form-container1 .label-value select[data-v-4a0aaeb7]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-4a0aaeb7]:focus,form.form-container1 .label-value select[data-v-4a0aaeb7]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-4a0aaeb7]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-4a0aaeb7],form.form-container1 .label-value input[type=radio][data-v-4a0aaeb7]{width:auto}form.form-container1 .label-value input[type=radio][data-v-4a0aaeb7]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-4a0aaeb7]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-4a0aaeb7]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-4a0aaeb7]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-4a0aaeb7]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-4a0aaeb7]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-4a0aaeb7]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-4a0aaeb7]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-4a0aaeb7]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-4a0aaeb7]{color:#f9ad1e}form.form-container1 .label-flex[data-v-4a0aaeb7]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-4a0aaeb7]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-4a0aaeb7]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-4a0aaeb7]{width:100px}table.page-table th.checkbox[data-v-4a0aaeb7]{width:50px;text-align:center}table.page-table th.setting[data-v-4a0aaeb7]{width:100px;text-align:center}table.page-table thead[data-v-4a0aaeb7]{color:#909399}table.page-table thead tr[data-v-4a0aaeb7]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-4a0aaeb7]{padding:10px 16px}table.page-table tbody tr[data-v-4a0aaeb7]:hover{background-color:#eeee}table.page-table tbody tr[data-v-4a0aaeb7]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-4a0aaeb7]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-4a0aaeb7]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-4a0aaeb7]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-4a0aaeb7]{width:100px}table.popups-table th.checkbox[data-v-4a0aaeb7]{width:50px;text-align:center}table.popups-table th.setting[data-v-4a0aaeb7]{width:100px;text-align:center}table.popups-table thead[data-v-4a0aaeb7]{color:#eee}table.popups-table thead tr[data-v-4a0aaeb7]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-4a0aaeb7]{padding:10px 16px}table.popups-table tbody tr[data-v-4a0aaeb7]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-4a0aaeb7]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-4a0aaeb7]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-4a0aaeb7]{width:100%}header.header-desktop[data-v-4a0aaeb7]{display:block}header.header-mobile[data-v-4a0aaeb7]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-4a0aaeb7]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-4a0aaeb7]{width:100%;height:100%}header.header-mobile button svg path[data-v-4a0aaeb7]{fill:#fff}nav.sidebar[data-v-4a0aaeb7]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-4a0aaeb7]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-4a0aaeb7]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-4a0aaeb7]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-4a0aaeb7]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-4a0aaeb7]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-4a0aaeb7]{color:#fff}nav.sidebar .container .children[data-v-4a0aaeb7]{padding-left:30px}@-moz-keyframes tada-4a0aaeb7{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-4a0aaeb7{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-4a0aaeb7{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-4a0aaeb7{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-4a0aaeb7]{animation:dialogEnter-4a0aaeb7 .3s linear forwards}.dialog-leave-active[data-v-4a0aaeb7]{animation:dialogLeave-4a0aaeb7 .3s linear forwards}@keyframes dialogEnter-4a0aaeb7{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-4a0aaeb7{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-4a0aaeb7]{animation:dialogEnter-4a0aaeb7 .2s linear forwards}.dialog1-leave-active[data-v-4a0aaeb7]{animation:dialogLeave-4a0aaeb7 .2s linear forwards}@keyframes rotateEnter-4a0aaeb7{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-4a0aaeb7]{animation:rotateEnter-4a0aaeb7 .7s;position:relative}.rotate-leave-active[data-v-4a0aaeb7]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-4a0aaeb7{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-4a0aaeb7{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-4a0aaeb7]{animation:slideOutTop-4a0aaeb7 .5s linear forwards}.slide-top-leave-active[data-v-4a0aaeb7],.slide-bottom-enter-active[data-v-4a0aaeb7]{animation:slideOutBottom-4a0aaeb7 .5s linear forwards}@keyframes slideInLeft-4a0aaeb7{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-4a0aaeb7{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-4a0aaeb7]{animation:slideInLeft-4a0aaeb7 .3s linear forwards}.slide-left-leave-active[data-v-4a0aaeb7]{animation:slideInRight-4a0aaeb7 .3s linear forwards}@keyframes slideOutLeft-4a0aaeb7{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-4a0aaeb7{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-4a0aaeb7]{animation:slideOutLeft-4a0aaeb7 .3s linear forwards}.slide-right-leave-active[data-v-4a0aaeb7]{animation:slideOutRight-4a0aaeb7 .3s linear forwards}@keyframes bganimation-4a0aaeb7{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-4a0aaeb7{0%{height:0}to{height:100px}}@keyframes fadeEnd-4a0aaeb7{0%{height:100%}to{height:0}}.fade-enter-active[data-v-4a0aaeb7]{animation:fadeStart-4a0aaeb7 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-4a0aaeb7]{animation:fadeEnd-4a0aaeb7 .1s linear forwards;overflow:hidden}.action-container[data-v-4a0aaeb7]{width:300px!important}form[data-v-4a0aaeb7]{margin-top:1rem;padding:0!important}.action-container_body[data-v-4a0aaeb7]{padding-top:12px!important;padding-bottom:24px!important;min-height:0!important}button[disabled][data-v-4a0aaeb7],button[disabled][data-v-4a0aaeb7]:hover{opacity:.5}@keyframes turns{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning{color:#f9ad1e}.notice_info li{font-size:14px;list-style:revert}.text-container{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block{width:100%}.text-container .text-container_item p.info-desc{width:100%;color:#999;font-size:14px}.page-container{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on,.page-container .page-flex .page-sidebar a:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile{border-radius:0;padding:1rem}ul.ul-container{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body{width:100%}form.form-container{display:block;width:100%;padding:0 1rem}form.form-container .label-info{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input,form.form-container .label-value select{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input:focus,form.form-container .label-value select:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select{border-radius:3px;padding:0 10px}form.form-container .label-value input{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox],form.form-container .label-value input[type=radio]{width:auto}form.form-container .label-value input[type=radio]{margin:0 4px 0 0}form.form-container .label-value input:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit:hover{background-color:#747474}form.form-container .label-msg{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning{color:#f9ad1e}form.form-container .label-flex{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input,form.form-container1 .label-value select{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input:focus,form.form-container1 .label-value select:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox],form.form-container1 .label-value input[type=radio]{width:auto}form.form-container1 .label-value input[type=radio]{margin:0 4px 0 0}form.form-container1 .label-value input:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit:hover{background-color:#747474}form.form-container1 .label-msg{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning{color:#f9ad1e}form.form-container1 .label-flex{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid{width:100px}table.page-table th.checkbox{width:50px;text-align:center}table.page-table th.setting{width:100px;text-align:center}table.page-table thead{color:#909399}table.page-table thead tr{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th{padding:10px 16px}table.page-table tbody tr:hover{background-color:#eeee}table.page-table tbody tr{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr:nth-child(odd){background-color:#f6f7f7}table.popups-table{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid{width:100px}table.popups-table th.checkbox{width:50px;text-align:center}table.popups-table th.setting{width:100px;text-align:center}table.popups-table thead{color:#eee}table.popups-table thead tr{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th{padding:10px 16px}table.popups-table tbody tr{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th{font-size:12px;padding:16px;vertical-align:top}.body{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header{width:100%}header.header-desktop{display:block}header.header-mobile{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg{width:100%;height:100%}header.header-mobile button svg path{fill:#fff}nav.sidebar{position:fixed;inset:0;z-index:101}nav.sidebar .bg{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active{color:#fff}nav.sidebar .container .children{padding-left:30px}@-moz-keyframes tada{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active{animation:dialogEnter .3s linear forwards}.dialog-leave-active{animation:dialogLeave .3s linear forwards}@keyframes dialogEnter{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active{animation:dialogEnter .2s linear forwards}.dialog1-leave-active{animation:dialogLeave .2s linear forwards}@keyframes rotateEnter{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active{animation:rotateEnter .7s;position:relative}.rotate-leave-active{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active{animation:slideOutTop .5s linear forwards}.slide-top-leave-active,.slide-bottom-enter-active{animation:slideOutBottom .5s linear forwards}@keyframes slideInLeft{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active{animation:slideInLeft .3s linear forwards}.slide-left-leave-active{animation:slideInRight .3s linear forwards}@keyframes slideOutLeft{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active{animation:slideOutLeft .3s linear forwards}.slide-right-leave-active{animation:slideOutRight .3s linear forwards}@keyframes bganimation{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart{0%{height:0}to{height:100px}}@keyframes fadeEnd{0%{height:100%}to{height:0}}.fade-enter-active{animation:fadeStart .1s linear forwards;overflow:hidden}.fade-leave-active{animation:fadeEnd .1s linear forwards;overflow:hidden}*{-webkit-box-sizing:border-box;-webkit-tap-highlight-color:transparent;box-sizing:border-box;word-wrap:break-word;outline:none}*{font-style:normal;font-family:PingFangSC-Regular,PingFang SC,Helvetica Neue,Helvetica,Arial,sans-serif}html,body,ul,p{margin:0;padding:0}html,body{width:100%;height:100%;position:relative;-webkit-overflow-scrolling:touch;overflow:hidden}a{cursor:pointer;text-decoration:none;outline:none}i{font-style:normal}img{object-fit:cover}img:not([src]){opacity:0}img:not([src]):not([srcset]){visibility:hidden}li{list-style:none}input,button{outline:none;cursor:pointer;border:none}.auto{flex:auto}body{font-size:100%;font-weight:500;font-style:normal;-webkit-font-smoothing:antialiased;-webkit-text-stroke-width:0;-moz-osx-font-smoothing:grayscale}body,html{background-color:#1e1e1e}body.modal-overlay-active div#modal_overlay{opacity:1;display:block}div#modal_overlay{position:fixed;z-index:9999;inset:0;background:rgba(0,0,0,.5);opacity:0;display:none}div#modal_overlay .modal{border-radius:6px;background:#fff;padding:1.875rem;max-width:90%;margin:0 auto;margin-top:3rem;width:720px}div#modal_overlay .modal h4{display:block;width:100%;text-align:center;font-size:1.6em;margin:0;padding:0}div#modal_overlay .modal .alert-message.warning{display:block;width:100%;text-align:center;font-size:1em;margin:2rem 0}div#modal_overlay .modal .right{text-align:right;margin-left:auto}div#modal_overlay .modal .right .btn.primary{width:100%;height:36px;line-height:36px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px;text-align:center;cursor:pointer}div#modal_overlay .modal .right .btn.primary:hover{opacity:.9}progress{width:300px;margin-right:10px;display:block;position:relative;border-radius:4px;height:12px;line-height:12px;cursor:pointer;overflow:hidden;background-color:#eee;color:#53c31b;border-radius:.1rem;transition:.3s}progress::-webkit-progress-bar{background-color:#eee;border-radius:.2rem}progress::-webkit-progress-value{background:rgb(83,195,27);border-radius:.2rem;transition:.3s}.dialog-footer{position:relative;height:30px}.dialog-footer>div{position:absolute;right:0}.dialog-footer>div>button{width:90px}.dialog-footer>div>button:first-of-type{background:#fff}.dialog-footer>div>button:last-of-type{margin-left:16px;height:30px;border-radius:4px;background:#0060ff;display:inline-flex;padding:4px 24px;justify-content:center;align-items:center;gap:10px;color:#fff;text-align:center;font-weight:500}#main .app-btn,#actioner .app-btn{display:inline-block}.btn.danger,.cbi-section-remove>.cbi-button,.cbi-button-remove,.cbi-button-reset,.cbi-button-negative,.cbi-button[value=Stop],.cbi-button[value=Kill],.cbi-button[onclick=\"reboot(this)\"],.cbi-button-neutral[value=Restart]{background-color:#fff!important;border:1px solid #0060ff;margin-left:16px;height:30px;border-radius:4px;background:#0060ff;display:inline-flex;padding:4px 24px;justify-content:center;align-items:center;gap:10px;text-align:center;font-weight:500;color:#0060ff}.cbi-page-actions .cbi-button-apply,.cbi-section-actions .cbi-button-edit,.cbi-button-edit,.cbi-button-apply,.cbi-button-reload,.cbi-button-action,.cbi-button[value=Submit],.cbi-button[value=Upload],.cbi-button[value$=Apply],.cbi-button[onclick=\"addKey(event)\"]{background-color:#0060ff;color:#fff;margin-left:16px;height:30px;border-radius:4px;background:#0060ff;display:inline-flex;padding:4px 12px;justify-content:center;align-items:center;gap:10px;text-align:center;font-weight:500}@keyframes turns-70156d34{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-70156d34]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-70156d34]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-70156d34]{color:#f9ad1e}.notice_info li[data-v-70156d34]{font-size:14px;list-style:revert}.text-container[data-v-70156d34]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-70156d34]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-70156d34]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-70156d34]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-70156d34]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-70156d34]{width:100%}.text-container .text-container_item p.info-desc[data-v-70156d34]{width:100%;color:#999;font-size:14px}.page-container[data-v-70156d34]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-70156d34]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-70156d34]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-70156d34]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-70156d34],.page-container .page-flex .page-sidebar a[data-v-70156d34]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-70156d34]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-70156d34]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-70156d34]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-70156d34]{border-radius:0;padding:1rem}ul.ul-container[data-v-70156d34]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-70156d34]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-70156d34]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-70156d34]{width:100%}form.form-container[data-v-70156d34]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-70156d34]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-70156d34]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-70156d34]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-70156d34]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-70156d34],form.form-container .label-value select[data-v-70156d34]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-70156d34]:focus,form.form-container .label-value select[data-v-70156d34]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-70156d34]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-70156d34]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-70156d34],form.form-container .label-value input[type=radio][data-v-70156d34]{width:auto}form.form-container .label-value input[type=radio][data-v-70156d34]{margin:0 4px 0 0}form.form-container .label-value input[data-v-70156d34]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-70156d34]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-70156d34]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-70156d34]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-70156d34]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-70156d34]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-70156d34]:hover{background-color:#747474}form.form-container .label-msg[data-v-70156d34]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-70156d34]{color:#f9ad1e}form.form-container .label-flex[data-v-70156d34]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-70156d34]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-70156d34]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-70156d34]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-70156d34]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-70156d34]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-70156d34]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-70156d34],form.form-container1 .label-value select[data-v-70156d34]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-70156d34]:focus,form.form-container1 .label-value select[data-v-70156d34]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-70156d34]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-70156d34],form.form-container1 .label-value input[type=radio][data-v-70156d34]{width:auto}form.form-container1 .label-value input[type=radio][data-v-70156d34]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-70156d34]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-70156d34]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-70156d34]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-70156d34]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-70156d34]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-70156d34]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-70156d34]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-70156d34]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-70156d34]{color:#f9ad1e}form.form-container1 .label-flex[data-v-70156d34]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-70156d34]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-70156d34]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-70156d34]{width:100px}table.page-table th.checkbox[data-v-70156d34]{width:50px;text-align:center}table.page-table th.setting[data-v-70156d34]{width:100px;text-align:center}table.page-table thead[data-v-70156d34]{color:#909399}table.page-table thead tr[data-v-70156d34]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-70156d34]{padding:10px 16px}table.page-table tbody tr[data-v-70156d34]:hover{background-color:#eeee}table.page-table tbody tr[data-v-70156d34]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-70156d34]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-70156d34]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-70156d34]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-70156d34]{width:100px}table.popups-table th.checkbox[data-v-70156d34]{width:50px;text-align:center}table.popups-table th.setting[data-v-70156d34]{width:100px;text-align:center}table.popups-table thead[data-v-70156d34]{color:#eee}table.popups-table thead tr[data-v-70156d34]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-70156d34]{padding:10px 16px}table.popups-table tbody tr[data-v-70156d34]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-70156d34]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-70156d34]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-70156d34]{width:100%}header.header-desktop[data-v-70156d34]{display:block}header.header-mobile[data-v-70156d34]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-70156d34]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-70156d34]{width:100%;height:100%}header.header-mobile button svg path[data-v-70156d34]{fill:#fff}nav.sidebar[data-v-70156d34]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-70156d34]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-70156d34]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-70156d34]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-70156d34]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-70156d34]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-70156d34]{color:#fff}nav.sidebar .container .children[data-v-70156d34]{padding-left:30px}@-moz-keyframes tada-70156d34{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-70156d34{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-70156d34{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-70156d34{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-70156d34]{animation:dialogEnter-70156d34 .3s linear forwards}.dialog-leave-active[data-v-70156d34]{animation:dialogLeave-70156d34 .3s linear forwards}@keyframes dialogEnter-70156d34{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-70156d34{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-70156d34]{animation:dialogEnter-70156d34 .2s linear forwards}.dialog1-leave-active[data-v-70156d34]{animation:dialogLeave-70156d34 .2s linear forwards}@keyframes rotateEnter-70156d34{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-70156d34]{animation:rotateEnter-70156d34 .7s;position:relative}.rotate-leave-active[data-v-70156d34]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-70156d34{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-70156d34{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-70156d34]{animation:slideOutTop-70156d34 .5s linear forwards}.slide-top-leave-active[data-v-70156d34],.slide-bottom-enter-active[data-v-70156d34]{animation:slideOutBottom-70156d34 .5s linear forwards}@keyframes slideInLeft-70156d34{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-70156d34{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-70156d34]{animation:slideInLeft-70156d34 .3s linear forwards}.slide-left-leave-active[data-v-70156d34]{animation:slideInRight-70156d34 .3s linear forwards}@keyframes slideOutLeft-70156d34{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-70156d34{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-70156d34]{animation:slideOutLeft-70156d34 .3s linear forwards}.slide-right-leave-active[data-v-70156d34]{animation:slideOutRight-70156d34 .3s linear forwards}@keyframes bganimation-70156d34{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-70156d34{0%{height:0}to{height:100px}}@keyframes fadeEnd-70156d34{0%{height:100%}to{height:0}}.fade-enter-active[data-v-70156d34]{animation:fadeStart-70156d34 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-70156d34]{animation:fadeEnd-70156d34 .1s linear forwards;overflow:hidden}@keyframes turn-70156d34{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}svg.icon[data-v-70156d34]{animation:turn-70156d34 5s linear infinite}@keyframes turns-d6bd3248{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-d6bd3248]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-d6bd3248]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-d6bd3248]{color:#f9ad1e}.notice_info li[data-v-d6bd3248]{font-size:14px;list-style:revert}.text-container[data-v-d6bd3248]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-d6bd3248]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-d6bd3248]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-d6bd3248]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-d6bd3248]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-d6bd3248]{width:100%}.text-container .text-container_item p.info-desc[data-v-d6bd3248]{width:100%;color:#999;font-size:14px}.page-container[data-v-d6bd3248]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-d6bd3248]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-d6bd3248]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-d6bd3248]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-d6bd3248],.page-container .page-flex .page-sidebar a[data-v-d6bd3248]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-d6bd3248]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-d6bd3248]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-d6bd3248]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-d6bd3248]{border-radius:0;padding:1rem}ul.ul-container[data-v-d6bd3248]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-d6bd3248]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-d6bd3248]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-d6bd3248]{width:100%}form.form-container[data-v-d6bd3248]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-d6bd3248]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-d6bd3248]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-d6bd3248]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-d6bd3248]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-d6bd3248],form.form-container .label-value select[data-v-d6bd3248]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-d6bd3248]:focus,form.form-container .label-value select[data-v-d6bd3248]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-d6bd3248]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-d6bd3248]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-d6bd3248],form.form-container .label-value input[type=radio][data-v-d6bd3248]{width:auto}form.form-container .label-value input[type=radio][data-v-d6bd3248]{margin:0 4px 0 0}form.form-container .label-value input[data-v-d6bd3248]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-d6bd3248]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-d6bd3248]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-d6bd3248]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-d6bd3248]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-d6bd3248]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-d6bd3248]:hover{background-color:#747474}form.form-container .label-msg[data-v-d6bd3248]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-d6bd3248]{color:#f9ad1e}form.form-container .label-flex[data-v-d6bd3248]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-d6bd3248]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-d6bd3248]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-d6bd3248]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-d6bd3248]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-d6bd3248]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-d6bd3248]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-d6bd3248],form.form-container1 .label-value select[data-v-d6bd3248]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-d6bd3248]:focus,form.form-container1 .label-value select[data-v-d6bd3248]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-d6bd3248]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-d6bd3248],form.form-container1 .label-value input[type=radio][data-v-d6bd3248]{width:auto}form.form-container1 .label-value input[type=radio][data-v-d6bd3248]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-d6bd3248]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-d6bd3248]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-d6bd3248]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-d6bd3248]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-d6bd3248]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-d6bd3248]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-d6bd3248]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-d6bd3248]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-d6bd3248]{color:#f9ad1e}form.form-container1 .label-flex[data-v-d6bd3248]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-d6bd3248]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-d6bd3248]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-d6bd3248]{width:100px}table.page-table th.checkbox[data-v-d6bd3248]{width:50px;text-align:center}table.page-table th.setting[data-v-d6bd3248]{width:100px;text-align:center}table.page-table thead[data-v-d6bd3248]{color:#909399}table.page-table thead tr[data-v-d6bd3248]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-d6bd3248]{padding:10px 16px}table.page-table tbody tr[data-v-d6bd3248]:hover{background-color:#eeee}table.page-table tbody tr[data-v-d6bd3248]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-d6bd3248]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-d6bd3248]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-d6bd3248]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-d6bd3248]{width:100px}table.popups-table th.checkbox[data-v-d6bd3248]{width:50px;text-align:center}table.popups-table th.setting[data-v-d6bd3248]{width:100px;text-align:center}table.popups-table thead[data-v-d6bd3248]{color:#eee}table.popups-table thead tr[data-v-d6bd3248]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-d6bd3248]{padding:10px 16px}table.popups-table tbody tr[data-v-d6bd3248]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-d6bd3248]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-d6bd3248]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-d6bd3248]{width:100%}header.header-desktop[data-v-d6bd3248]{display:block}header.header-mobile[data-v-d6bd3248]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-d6bd3248]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-d6bd3248]{width:100%;height:100%}header.header-mobile button svg path[data-v-d6bd3248]{fill:#fff}nav.sidebar[data-v-d6bd3248]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-d6bd3248]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-d6bd3248]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-d6bd3248]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-d6bd3248]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-d6bd3248]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-d6bd3248]{color:#fff}nav.sidebar .container .children[data-v-d6bd3248]{padding-left:30px}@-moz-keyframes tada-d6bd3248{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-d6bd3248{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-d6bd3248{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-d6bd3248{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-d6bd3248]{animation:dialogEnter-d6bd3248 .3s linear forwards}.dialog-leave-active[data-v-d6bd3248]{animation:dialogLeave-d6bd3248 .3s linear forwards}@keyframes dialogEnter-d6bd3248{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-d6bd3248{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-d6bd3248]{animation:dialogEnter-d6bd3248 .2s linear forwards}.dialog1-leave-active[data-v-d6bd3248]{animation:dialogLeave-d6bd3248 .2s linear forwards}@keyframes rotateEnter-d6bd3248{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-d6bd3248]{animation:rotateEnter-d6bd3248 .7s;position:relative}.rotate-leave-active[data-v-d6bd3248]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-d6bd3248{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-d6bd3248{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-d6bd3248]{animation:slideOutTop-d6bd3248 .5s linear forwards}.slide-top-leave-active[data-v-d6bd3248],.slide-bottom-enter-active[data-v-d6bd3248]{animation:slideOutBottom-d6bd3248 .5s linear forwards}@keyframes slideInLeft-d6bd3248{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-d6bd3248{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-d6bd3248]{animation:slideInLeft-d6bd3248 .3s linear forwards}.slide-left-leave-active[data-v-d6bd3248]{animation:slideInRight-d6bd3248 .3s linear forwards}@keyframes slideOutLeft-d6bd3248{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-d6bd3248{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-d6bd3248]{animation:slideOutLeft-d6bd3248 .3s linear forwards}.slide-right-leave-active[data-v-d6bd3248]{animation:slideOutRight-d6bd3248 .3s linear forwards}@keyframes bganimation-d6bd3248{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-d6bd3248{0%{height:0}to{height:100px}}@keyframes fadeEnd-d6bd3248{0%{height:100%}to{height:0}}.fade-enter-active[data-v-d6bd3248]{animation:fadeStart-d6bd3248 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-d6bd3248]{animation:fadeEnd-d6bd3248 .1s linear forwards;overflow:hidden}.toips-container[data-v-d6bd3248]{position:fixed;bottom:1rem;right:1rem;transition:1s}.toips-container li.toips-item[data-v-d6bd3248]{width:160px;background:rgba(0,0,0,.5);padding:6px 16px;color:#fff;font-size:14px;text-align:left;border-radius:4px;margin-bottom:.5rem;transition:1s;display:flex;flex-wrap:wrap;cursor:pointer}.toips-container li.toips-item a[data-v-d6bd3248]{display:block;font-size:14px;width:100%;color:#fff}@keyframes turns-ab2441f8{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-ab2441f8]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-ab2441f8]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-ab2441f8]{color:#f9ad1e}.notice_info li[data-v-ab2441f8]{font-size:14px;list-style:revert}.text-container[data-v-ab2441f8]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-ab2441f8]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-ab2441f8]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-ab2441f8]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-ab2441f8]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-ab2441f8]{width:100%}.text-container .text-container_item p.info-desc[data-v-ab2441f8]{width:100%;color:#999;font-size:14px}.page-container[data-v-ab2441f8]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-ab2441f8]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-ab2441f8]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-ab2441f8]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-ab2441f8],.page-container .page-flex .page-sidebar a[data-v-ab2441f8]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-ab2441f8]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-ab2441f8]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-ab2441f8]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-ab2441f8]{border-radius:0;padding:1rem}ul.ul-container[data-v-ab2441f8]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-ab2441f8]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-ab2441f8]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-ab2441f8]{width:100%}form.form-container[data-v-ab2441f8]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-ab2441f8]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-ab2441f8]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-ab2441f8]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-ab2441f8]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-ab2441f8],form.form-container .label-value select[data-v-ab2441f8]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-ab2441f8]:focus,form.form-container .label-value select[data-v-ab2441f8]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-ab2441f8]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-ab2441f8]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-ab2441f8],form.form-container .label-value input[type=radio][data-v-ab2441f8]{width:auto}form.form-container .label-value input[type=radio][data-v-ab2441f8]{margin:0 4px 0 0}form.form-container .label-value input[data-v-ab2441f8]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-ab2441f8]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-ab2441f8]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-ab2441f8]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-ab2441f8]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-ab2441f8]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-ab2441f8]:hover{background-color:#747474}form.form-container .label-msg[data-v-ab2441f8]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-ab2441f8]{color:#f9ad1e}form.form-container .label-flex[data-v-ab2441f8]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-ab2441f8]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-ab2441f8]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-ab2441f8]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-ab2441f8]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-ab2441f8]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-ab2441f8]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-ab2441f8],form.form-container1 .label-value select[data-v-ab2441f8]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-ab2441f8]:focus,form.form-container1 .label-value select[data-v-ab2441f8]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-ab2441f8]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-ab2441f8],form.form-container1 .label-value input[type=radio][data-v-ab2441f8]{width:auto}form.form-container1 .label-value input[type=radio][data-v-ab2441f8]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-ab2441f8]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-ab2441f8]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-ab2441f8]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-ab2441f8]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-ab2441f8]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-ab2441f8]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-ab2441f8]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-ab2441f8]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-ab2441f8]{color:#f9ad1e}form.form-container1 .label-flex[data-v-ab2441f8]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-ab2441f8]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-ab2441f8]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-ab2441f8]{width:100px}table.page-table th.checkbox[data-v-ab2441f8]{width:50px;text-align:center}table.page-table th.setting[data-v-ab2441f8]{width:100px;text-align:center}table.page-table thead[data-v-ab2441f8]{color:#909399}table.page-table thead tr[data-v-ab2441f8]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-ab2441f8]{padding:10px 16px}table.page-table tbody tr[data-v-ab2441f8]:hover{background-color:#eeee}table.page-table tbody tr[data-v-ab2441f8]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-ab2441f8]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-ab2441f8]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-ab2441f8]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-ab2441f8]{width:100px}table.popups-table th.checkbox[data-v-ab2441f8]{width:50px;text-align:center}table.popups-table th.setting[data-v-ab2441f8]{width:100px;text-align:center}table.popups-table thead[data-v-ab2441f8]{color:#eee}table.popups-table thead tr[data-v-ab2441f8]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-ab2441f8]{padding:10px 16px}table.popups-table tbody tr[data-v-ab2441f8]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-ab2441f8]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-ab2441f8]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-ab2441f8]{width:100%}header.header-desktop[data-v-ab2441f8]{display:block}header.header-mobile[data-v-ab2441f8]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-ab2441f8]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-ab2441f8]{width:100%;height:100%}header.header-mobile button svg path[data-v-ab2441f8]{fill:#fff}nav.sidebar[data-v-ab2441f8]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-ab2441f8]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-ab2441f8]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-ab2441f8]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-ab2441f8]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-ab2441f8]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-ab2441f8]{color:#fff}nav.sidebar .container .children[data-v-ab2441f8]{padding-left:30px}@-moz-keyframes tada-ab2441f8{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-ab2441f8{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-ab2441f8{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-ab2441f8{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-ab2441f8]{animation:dialogEnter-ab2441f8 .3s linear forwards}.dialog-leave-active[data-v-ab2441f8]{animation:dialogLeave-ab2441f8 .3s linear forwards}@keyframes dialogEnter-ab2441f8{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-ab2441f8{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-ab2441f8]{animation:dialogEnter-ab2441f8 .2s linear forwards}.dialog1-leave-active[data-v-ab2441f8]{animation:dialogLeave-ab2441f8 .2s linear forwards}@keyframes rotateEnter-ab2441f8{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-ab2441f8]{animation:rotateEnter-ab2441f8 .7s;position:relative}.rotate-leave-active[data-v-ab2441f8]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-ab2441f8{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-ab2441f8{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-ab2441f8]{animation:slideOutTop-ab2441f8 .5s linear forwards}.slide-top-leave-active[data-v-ab2441f8],.slide-bottom-enter-active[data-v-ab2441f8]{animation:slideOutBottom-ab2441f8 .5s linear forwards}@keyframes slideInLeft-ab2441f8{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-ab2441f8{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-ab2441f8]{animation:slideInLeft-ab2441f8 .3s linear forwards}.slide-left-leave-active[data-v-ab2441f8]{animation:slideInRight-ab2441f8 .3s linear forwards}@keyframes slideOutLeft-ab2441f8{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-ab2441f8{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-ab2441f8]{animation:slideOutLeft-ab2441f8 .3s linear forwards}.slide-right-leave-active[data-v-ab2441f8]{animation:slideOutRight-ab2441f8 .3s linear forwards}@keyframes bganimation-ab2441f8{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-ab2441f8{0%{height:0}to{height:100px}}@keyframes fadeEnd-ab2441f8{0%{height:100%}to{height:0}}.fade-enter-active[data-v-ab2441f8]{animation:fadeStart-ab2441f8 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-ab2441f8]{animation:fadeEnd-ab2441f8 .1s linear forwards;overflow:hidden}nav[data-v-ab2441f8]{width:100%;display:flex;flex-wrap:nowrap;align-items:center;height:50px}nav .logo[data-v-ab2441f8]{color:#fff;font-size:26px;font-weight:600;margin-right:10px}nav a.nav-item[data-v-ab2441f8]{color:#e3dfdf;font-size:16px;margin-right:1rem;width:100px;text-align:center}nav a.router-link-active[data-v-ab2441f8],nav a.router-link-exact-active[data-v-ab2441f8]{color:#fff;font-weight:600}nav a.nav-item.ota-upgrade[data-v-ab2441f8]{position:relative}nav a.nav-item.ota-upgrade span[data-v-ab2441f8]{opacity:.7}nav a.nav-item.ota-upgrade em[data-v-ab2441f8]{display:block;position:absolute;top:0;width:5px;height:5px;border-radius:50%;background-color:red;right:5px}nav a.outlogin[data-v-ab2441f8]{display:flex;align-items:center;justify-content:center;padding:5px;opacity:.6}nav a.outlogin[data-v-ab2441f8]:hover{opacity:1}nav a.outlogin[data-v-ab2441f8] svg.icon{width:14px;height:14px}nav a.outlogin[data-v-ab2441f8] svg.icon path{fill:#e3dfdf}@keyframes turns-0003d2de{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-0003d2de]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-0003d2de]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-0003d2de]{color:#f9ad1e}.notice_info li[data-v-0003d2de]{font-size:14px;list-style:revert}.text-container[data-v-0003d2de]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-0003d2de]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-0003d2de]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-0003d2de]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-0003d2de]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-0003d2de]{width:100%}.text-container .text-container_item p.info-desc[data-v-0003d2de]{width:100%;color:#999;font-size:14px}.page-container[data-v-0003d2de]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-0003d2de]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-0003d2de]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-0003d2de]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-0003d2de],.page-container .page-flex .page-sidebar a[data-v-0003d2de]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-0003d2de]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-0003d2de]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-0003d2de]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-0003d2de]{border-radius:0;padding:1rem}ul.ul-container[data-v-0003d2de]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-0003d2de]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-0003d2de]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-0003d2de]{width:100%}form.form-container[data-v-0003d2de]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-0003d2de]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-0003d2de]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-0003d2de]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-0003d2de]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-0003d2de],form.form-container .label-value select[data-v-0003d2de]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-0003d2de]:focus,form.form-container .label-value select[data-v-0003d2de]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-0003d2de]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-0003d2de]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-0003d2de],form.form-container .label-value input[type=radio][data-v-0003d2de]{width:auto}form.form-container .label-value input[type=radio][data-v-0003d2de]{margin:0 4px 0 0}form.form-container .label-value input[data-v-0003d2de]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-0003d2de]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-0003d2de]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-0003d2de]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-0003d2de]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-0003d2de]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-0003d2de]:hover{background-color:#747474}form.form-container .label-msg[data-v-0003d2de]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-0003d2de]{color:#f9ad1e}form.form-container .label-flex[data-v-0003d2de]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-0003d2de]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-0003d2de]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-0003d2de]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-0003d2de]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-0003d2de]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-0003d2de]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-0003d2de],form.form-container1 .label-value select[data-v-0003d2de]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-0003d2de]:focus,form.form-container1 .label-value select[data-v-0003d2de]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-0003d2de]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-0003d2de],form.form-container1 .label-value input[type=radio][data-v-0003d2de]{width:auto}form.form-container1 .label-value input[type=radio][data-v-0003d2de]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-0003d2de]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-0003d2de]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-0003d2de]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-0003d2de]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-0003d2de]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-0003d2de]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-0003d2de]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-0003d2de]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-0003d2de]{color:#f9ad1e}form.form-container1 .label-flex[data-v-0003d2de]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-0003d2de]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-0003d2de]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-0003d2de]{width:100px}table.page-table th.checkbox[data-v-0003d2de]{width:50px;text-align:center}table.page-table th.setting[data-v-0003d2de]{width:100px;text-align:center}table.page-table thead[data-v-0003d2de]{color:#909399}table.page-table thead tr[data-v-0003d2de]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-0003d2de]{padding:10px 16px}table.page-table tbody tr[data-v-0003d2de]:hover{background-color:#eeee}table.page-table tbody tr[data-v-0003d2de]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-0003d2de]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-0003d2de]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-0003d2de]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-0003d2de]{width:100px}table.popups-table th.checkbox[data-v-0003d2de]{width:50px;text-align:center}table.popups-table th.setting[data-v-0003d2de]{width:100px;text-align:center}table.popups-table thead[data-v-0003d2de]{color:#eee}table.popups-table thead tr[data-v-0003d2de]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-0003d2de]{padding:10px 16px}table.popups-table tbody tr[data-v-0003d2de]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-0003d2de]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-0003d2de]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-0003d2de]{width:100%}header.header-desktop[data-v-0003d2de]{display:block}header.header-mobile[data-v-0003d2de]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-0003d2de]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-0003d2de]{width:100%;height:100%}header.header-mobile button svg path[data-v-0003d2de]{fill:#fff}nav.sidebar[data-v-0003d2de]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-0003d2de]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-0003d2de]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-0003d2de]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-0003d2de]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-0003d2de]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-0003d2de]{color:#fff}nav.sidebar .container .children[data-v-0003d2de]{padding-left:30px}@-moz-keyframes tada-0003d2de{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-0003d2de{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-0003d2de{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-0003d2de{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-0003d2de]{animation:dialogEnter-0003d2de .3s linear forwards}.dialog-leave-active[data-v-0003d2de]{animation:dialogLeave-0003d2de .3s linear forwards}@keyframes dialogEnter-0003d2de{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-0003d2de{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-0003d2de]{animation:dialogEnter-0003d2de .2s linear forwards}.dialog1-leave-active[data-v-0003d2de]{animation:dialogLeave-0003d2de .2s linear forwards}@keyframes rotateEnter-0003d2de{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-0003d2de]{animation:rotateEnter-0003d2de .7s;position:relative}.rotate-leave-active[data-v-0003d2de]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-0003d2de{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-0003d2de{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-0003d2de]{animation:slideOutTop-0003d2de .5s linear forwards}.slide-top-leave-active[data-v-0003d2de],.slide-bottom-enter-active[data-v-0003d2de]{animation:slideOutBottom-0003d2de .5s linear forwards}@keyframes slideInLeft-0003d2de{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-0003d2de{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-0003d2de]{animation:slideInLeft-0003d2de .3s linear forwards}.slide-left-leave-active[data-v-0003d2de]{animation:slideInRight-0003d2de .3s linear forwards}@keyframes slideOutLeft-0003d2de{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-0003d2de{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-0003d2de]{animation:slideOutLeft-0003d2de .3s linear forwards}.slide-right-leave-active[data-v-0003d2de]{animation:slideOutRight-0003d2de .3s linear forwards}@keyframes bganimation-0003d2de{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-0003d2de{0%{height:0}to{height:100px}}@keyframes fadeEnd-0003d2de{0%{height:100%}to{height:0}}.fade-enter-active[data-v-0003d2de]{animation:fadeStart-0003d2de .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-0003d2de]{animation:fadeEnd-0003d2de .1s linear forwards;overflow:hidden}.tool[data-v-0003d2de]{width:100%;height:200px;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.tool .tool-item[data-v-0003d2de]{width:100px;text-align:center;display:flex;flex-wrap:wrap;justify-content:center;cursor:pointer}.tool .tool-item .tool-item_icon[data-v-0003d2de]{width:80px;height:80px}.tool .tool-item .tool-item_icon svg[data-v-0003d2de]{width:100%;height:100%}.tool .tool-item .tool-item_name[data-v-0003d2de]{margin-top:.5rem;width:100%;text-align:center}.tool .tool-item .tool-item_name span[data-v-0003d2de]{color:#eee;font-size:16px}.tool em[data-v-0003d2de]{flex:auto;position:relative;padding:0 5px;display:inline-block;text-align:center}.tool em span[data-v-0003d2de]{position:absolute;width:100%;left:0;right:0;text-align:center;color:#fff}.tool em span.t[data-v-0003d2de]{top:-30px}.tool em span.b[data-v-0003d2de]{bottom:-30px;font-size:12px}.tool em[data-v-0003d2de]:after{content:\"\";background-color:#eeee;width:100%;height:1.5px;display:block;margin:0 auto}@keyframes turns-5fdbc26a{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-5fdbc26a]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-5fdbc26a]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-5fdbc26a]{color:#f9ad1e}.notice_info li[data-v-5fdbc26a]{font-size:14px;list-style:revert}.text-container[data-v-5fdbc26a]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-5fdbc26a]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-5fdbc26a]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-5fdbc26a]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-5fdbc26a]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-5fdbc26a]{width:100%}.text-container .text-container_item p.info-desc[data-v-5fdbc26a]{width:100%;color:#999;font-size:14px}.page-container[data-v-5fdbc26a]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-5fdbc26a]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-5fdbc26a]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-5fdbc26a]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-5fdbc26a],.page-container .page-flex .page-sidebar a[data-v-5fdbc26a]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5fdbc26a]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5fdbc26a]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-5fdbc26a]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-5fdbc26a]{border-radius:0;padding:1rem}ul.ul-container[data-v-5fdbc26a]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-5fdbc26a]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-5fdbc26a]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-5fdbc26a]{width:100%}form.form-container[data-v-5fdbc26a]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-5fdbc26a]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-5fdbc26a]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-5fdbc26a]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-5fdbc26a]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-5fdbc26a],form.form-container .label-value select[data-v-5fdbc26a]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-5fdbc26a]:focus,form.form-container .label-value select[data-v-5fdbc26a]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-5fdbc26a]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-5fdbc26a]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-5fdbc26a],form.form-container .label-value input[type=radio][data-v-5fdbc26a]{width:auto}form.form-container .label-value input[type=radio][data-v-5fdbc26a]{margin:0 4px 0 0}form.form-container .label-value input[data-v-5fdbc26a]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-5fdbc26a]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5fdbc26a]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5fdbc26a]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-5fdbc26a]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-5fdbc26a]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-5fdbc26a]:hover{background-color:#747474}form.form-container .label-msg[data-v-5fdbc26a]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-5fdbc26a]{color:#f9ad1e}form.form-container .label-flex[data-v-5fdbc26a]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-5fdbc26a]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-5fdbc26a]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-5fdbc26a]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-5fdbc26a]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-5fdbc26a]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-5fdbc26a]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-5fdbc26a],form.form-container1 .label-value select[data-v-5fdbc26a]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-5fdbc26a]:focus,form.form-container1 .label-value select[data-v-5fdbc26a]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-5fdbc26a]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-5fdbc26a],form.form-container1 .label-value input[type=radio][data-v-5fdbc26a]{width:auto}form.form-container1 .label-value input[type=radio][data-v-5fdbc26a]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-5fdbc26a]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-5fdbc26a]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5fdbc26a]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5fdbc26a]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-5fdbc26a]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-5fdbc26a]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-5fdbc26a]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-5fdbc26a]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-5fdbc26a]{color:#f9ad1e}form.form-container1 .label-flex[data-v-5fdbc26a]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-5fdbc26a]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-5fdbc26a]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-5fdbc26a]{width:100px}table.page-table th.checkbox[data-v-5fdbc26a]{width:50px;text-align:center}table.page-table th.setting[data-v-5fdbc26a]{width:100px;text-align:center}table.page-table thead[data-v-5fdbc26a]{color:#909399}table.page-table thead tr[data-v-5fdbc26a]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-5fdbc26a]{padding:10px 16px}table.page-table tbody tr[data-v-5fdbc26a]:hover{background-color:#eeee}table.page-table tbody tr[data-v-5fdbc26a]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-5fdbc26a]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-5fdbc26a]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-5fdbc26a]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-5fdbc26a]{width:100px}table.popups-table th.checkbox[data-v-5fdbc26a]{width:50px;text-align:center}table.popups-table th.setting[data-v-5fdbc26a]{width:100px;text-align:center}table.popups-table thead[data-v-5fdbc26a]{color:#eee}table.popups-table thead tr[data-v-5fdbc26a]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-5fdbc26a]{padding:10px 16px}table.popups-table tbody tr[data-v-5fdbc26a]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-5fdbc26a]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-5fdbc26a]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-5fdbc26a]{width:100%}header.header-desktop[data-v-5fdbc26a]{display:block}header.header-mobile[data-v-5fdbc26a]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-5fdbc26a]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-5fdbc26a]{width:100%;height:100%}header.header-mobile button svg path[data-v-5fdbc26a]{fill:#fff}nav.sidebar[data-v-5fdbc26a]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-5fdbc26a]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-5fdbc26a]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-5fdbc26a]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-5fdbc26a]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-5fdbc26a]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-5fdbc26a]{color:#fff}nav.sidebar .container .children[data-v-5fdbc26a]{padding-left:30px}@-moz-keyframes tada-5fdbc26a{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-5fdbc26a{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-5fdbc26a{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-5fdbc26a{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-5fdbc26a]{animation:dialogEnter-5fdbc26a .3s linear forwards}.dialog-leave-active[data-v-5fdbc26a]{animation:dialogLeave-5fdbc26a .3s linear forwards}@keyframes dialogEnter-5fdbc26a{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-5fdbc26a{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-5fdbc26a]{animation:dialogEnter-5fdbc26a .2s linear forwards}.dialog1-leave-active[data-v-5fdbc26a]{animation:dialogLeave-5fdbc26a .2s linear forwards}@keyframes rotateEnter-5fdbc26a{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-5fdbc26a]{animation:rotateEnter-5fdbc26a .7s;position:relative}.rotate-leave-active[data-v-5fdbc26a]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-5fdbc26a{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-5fdbc26a{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-5fdbc26a]{animation:slideOutTop-5fdbc26a .5s linear forwards}.slide-top-leave-active[data-v-5fdbc26a],.slide-bottom-enter-active[data-v-5fdbc26a]{animation:slideOutBottom-5fdbc26a .5s linear forwards}@keyframes slideInLeft-5fdbc26a{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-5fdbc26a{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-5fdbc26a]{animation:slideInLeft-5fdbc26a .3s linear forwards}.slide-left-leave-active[data-v-5fdbc26a]{animation:slideInRight-5fdbc26a .3s linear forwards}@keyframes slideOutLeft-5fdbc26a{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-5fdbc26a{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-5fdbc26a]{animation:slideOutLeft-5fdbc26a .3s linear forwards}.slide-right-leave-active[data-v-5fdbc26a]{animation:slideOutRight-5fdbc26a .3s linear forwards}@keyframes bganimation-5fdbc26a{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-5fdbc26a{0%{height:0}to{height:100px}}@keyframes fadeEnd-5fdbc26a{0%{height:100%}to{height:0}}.fade-enter-active[data-v-5fdbc26a]{animation:fadeStart-5fdbc26a .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-5fdbc26a]{animation:fadeEnd-5fdbc26a .1s linear forwards;overflow:hidden}.logo[data-v-5fdbc26a]{color:#fff;font-size:1.5em;font-weight:600;margin-left:10px}@keyframes turns-b888f30a{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-b888f30a]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-b888f30a]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-b888f30a]{color:#f9ad1e}.notice_info li[data-v-b888f30a]{font-size:14px;list-style:revert}.text-container[data-v-b888f30a]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-b888f30a]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-b888f30a]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-b888f30a]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-b888f30a]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-b888f30a]{width:100%}.text-container .text-container_item p.info-desc[data-v-b888f30a]{width:100%;color:#999;font-size:14px}.page-container[data-v-b888f30a]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-b888f30a]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-b888f30a]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-b888f30a]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-b888f30a],.page-container .page-flex .page-sidebar a[data-v-b888f30a]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-b888f30a]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-b888f30a]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-b888f30a]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-b888f30a]{border-radius:0;padding:1rem}ul.ul-container[data-v-b888f30a]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-b888f30a]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-b888f30a]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-b888f30a]{width:100%}form.form-container[data-v-b888f30a]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-b888f30a]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-b888f30a]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-b888f30a]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-b888f30a]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-b888f30a],form.form-container .label-value select[data-v-b888f30a]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-b888f30a]:focus,form.form-container .label-value select[data-v-b888f30a]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-b888f30a]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-b888f30a]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-b888f30a],form.form-container .label-value input[type=radio][data-v-b888f30a]{width:auto}form.form-container .label-value input[type=radio][data-v-b888f30a]{margin:0 4px 0 0}form.form-container .label-value input[data-v-b888f30a]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-b888f30a]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-b888f30a]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-b888f30a]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-b888f30a]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-b888f30a]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-b888f30a]:hover{background-color:#747474}form.form-container .label-msg[data-v-b888f30a]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-b888f30a]{color:#f9ad1e}form.form-container .label-flex[data-v-b888f30a]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-b888f30a]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-b888f30a]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-b888f30a]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-b888f30a]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-b888f30a]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-b888f30a]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-b888f30a],form.form-container1 .label-value select[data-v-b888f30a]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-b888f30a]:focus,form.form-container1 .label-value select[data-v-b888f30a]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-b888f30a]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-b888f30a],form.form-container1 .label-value input[type=radio][data-v-b888f30a]{width:auto}form.form-container1 .label-value input[type=radio][data-v-b888f30a]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-b888f30a]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-b888f30a]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-b888f30a]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-b888f30a]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-b888f30a]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-b888f30a]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-b888f30a]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-b888f30a]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-b888f30a]{color:#f9ad1e}form.form-container1 .label-flex[data-v-b888f30a]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-b888f30a]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-b888f30a]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-b888f30a]{width:100px}table.page-table th.checkbox[data-v-b888f30a]{width:50px;text-align:center}table.page-table th.setting[data-v-b888f30a]{width:100px;text-align:center}table.page-table thead[data-v-b888f30a]{color:#909399}table.page-table thead tr[data-v-b888f30a]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-b888f30a]{padding:10px 16px}table.page-table tbody tr[data-v-b888f30a]:hover{background-color:#eeee}table.page-table tbody tr[data-v-b888f30a]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-b888f30a]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-b888f30a]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-b888f30a]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-b888f30a]{width:100px}table.popups-table th.checkbox[data-v-b888f30a]{width:50px;text-align:center}table.popups-table th.setting[data-v-b888f30a]{width:100px;text-align:center}table.popups-table thead[data-v-b888f30a]{color:#eee}table.popups-table thead tr[data-v-b888f30a]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-b888f30a]{padding:10px 16px}table.popups-table tbody tr[data-v-b888f30a]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-b888f30a]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-b888f30a]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-b888f30a]{width:100%}header.header-desktop[data-v-b888f30a]{display:block}header.header-mobile[data-v-b888f30a]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-b888f30a]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-b888f30a]{width:100%;height:100%}header.header-mobile button svg path[data-v-b888f30a]{fill:#fff}nav.sidebar[data-v-b888f30a]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-b888f30a]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-b888f30a]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-b888f30a]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-b888f30a]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-b888f30a]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-b888f30a]{color:#fff}nav.sidebar .container .children[data-v-b888f30a]{padding-left:30px}@-moz-keyframes tada-b888f30a{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-b888f30a{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-b888f30a{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-b888f30a{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-b888f30a]{animation:dialogEnter-b888f30a .3s linear forwards}.dialog-leave-active[data-v-b888f30a]{animation:dialogLeave-b888f30a .3s linear forwards}@keyframes dialogEnter-b888f30a{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-b888f30a{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-b888f30a]{animation:dialogEnter-b888f30a .2s linear forwards}.dialog1-leave-active[data-v-b888f30a]{animation:dialogLeave-b888f30a .2s linear forwards}@keyframes rotateEnter-b888f30a{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-b888f30a]{animation:rotateEnter-b888f30a .7s;position:relative}.rotate-leave-active[data-v-b888f30a]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-b888f30a{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-b888f30a{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-b888f30a]{animation:slideOutTop-b888f30a .5s linear forwards}.slide-top-leave-active[data-v-b888f30a],.slide-bottom-enter-active[data-v-b888f30a]{animation:slideOutBottom-b888f30a .5s linear forwards}@keyframes slideInLeft-b888f30a{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-b888f30a{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-b888f30a]{animation:slideInLeft-b888f30a .3s linear forwards}.slide-left-leave-active[data-v-b888f30a]{animation:slideInRight-b888f30a .3s linear forwards}@keyframes slideOutLeft-b888f30a{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-b888f30a{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-b888f30a]{animation:slideOutLeft-b888f30a .3s linear forwards}.slide-right-leave-active[data-v-b888f30a]{animation:slideOutRight-b888f30a .3s linear forwards}@keyframes bganimation-b888f30a{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-b888f30a{0%{height:0}to{height:100px}}@keyframes fadeEnd-b888f30a{0%{height:100%}to{height:0}}.fade-enter-active[data-v-b888f30a]{animation:fadeStart-b888f30a .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-b888f30a]{animation:fadeEnd-b888f30a .1s linear forwards;overflow:hidden}.router-loading[data-v-b888f30a]{margin:1rem}.skeleton[data-v-b888f30a]{width:100%;padding:1rem}.skeleton .skeleton-item[data-v-b888f30a]{margin-top:20px;width:100%;height:16px;display:block;background-color:#f2f3f5}.skeleton .skeleton-item[data-v-b888f30a]:first-child{width:40%}.skeleton .skeleton-item[data-v-b888f30a]:last-child{width:70%}@keyframes turns-6a6bc058{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-6a6bc058]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-6a6bc058]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-6a6bc058]{color:#f9ad1e}.notice_info li[data-v-6a6bc058]{font-size:14px;list-style:revert}.text-container[data-v-6a6bc058]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-6a6bc058]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-6a6bc058]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-6a6bc058]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-6a6bc058]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-6a6bc058]{width:100%}.text-container .text-container_item p.info-desc[data-v-6a6bc058]{width:100%;color:#999;font-size:14px}.page-container[data-v-6a6bc058]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-6a6bc058]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-6a6bc058]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-6a6bc058]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-6a6bc058],.page-container .page-flex .page-sidebar a[data-v-6a6bc058]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-6a6bc058]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-6a6bc058]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-6a6bc058]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-6a6bc058]{border-radius:0;padding:1rem}ul.ul-container[data-v-6a6bc058]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-6a6bc058]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-6a6bc058]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-6a6bc058]{width:100%}form.form-container[data-v-6a6bc058]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-6a6bc058]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-6a6bc058]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-6a6bc058]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-6a6bc058]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-6a6bc058],form.form-container .label-value select[data-v-6a6bc058]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-6a6bc058]:focus,form.form-container .label-value select[data-v-6a6bc058]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-6a6bc058]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-6a6bc058]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-6a6bc058],form.form-container .label-value input[type=radio][data-v-6a6bc058]{width:auto}form.form-container .label-value input[type=radio][data-v-6a6bc058]{margin:0 4px 0 0}form.form-container .label-value input[data-v-6a6bc058]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-6a6bc058]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-6a6bc058]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-6a6bc058]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-6a6bc058]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-6a6bc058]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-6a6bc058]:hover{background-color:#747474}form.form-container .label-msg[data-v-6a6bc058]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-6a6bc058]{color:#f9ad1e}form.form-container .label-flex[data-v-6a6bc058]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-6a6bc058]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-6a6bc058]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-6a6bc058]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-6a6bc058]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-6a6bc058]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-6a6bc058]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-6a6bc058],form.form-container1 .label-value select[data-v-6a6bc058]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-6a6bc058]:focus,form.form-container1 .label-value select[data-v-6a6bc058]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-6a6bc058]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-6a6bc058],form.form-container1 .label-value input[type=radio][data-v-6a6bc058]{width:auto}form.form-container1 .label-value input[type=radio][data-v-6a6bc058]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-6a6bc058]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-6a6bc058]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-6a6bc058]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-6a6bc058]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-6a6bc058]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-6a6bc058]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-6a6bc058]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-6a6bc058]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-6a6bc058]{color:#f9ad1e}form.form-container1 .label-flex[data-v-6a6bc058]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-6a6bc058]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-6a6bc058]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-6a6bc058]{width:100px}table.page-table th.checkbox[data-v-6a6bc058]{width:50px;text-align:center}table.page-table th.setting[data-v-6a6bc058]{width:100px;text-align:center}table.page-table thead[data-v-6a6bc058]{color:#909399}table.page-table thead tr[data-v-6a6bc058]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-6a6bc058]{padding:10px 16px}table.page-table tbody tr[data-v-6a6bc058]:hover{background-color:#eeee}table.page-table tbody tr[data-v-6a6bc058]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-6a6bc058]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-6a6bc058]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-6a6bc058]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-6a6bc058]{width:100px}table.popups-table th.checkbox[data-v-6a6bc058]{width:50px;text-align:center}table.popups-table th.setting[data-v-6a6bc058]{width:100px;text-align:center}table.popups-table thead[data-v-6a6bc058]{color:#eee}table.popups-table thead tr[data-v-6a6bc058]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-6a6bc058]{padding:10px 16px}table.popups-table tbody tr[data-v-6a6bc058]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-6a6bc058]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-6a6bc058]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-6a6bc058]{width:100%}header.header-desktop[data-v-6a6bc058]{display:block}header.header-mobile[data-v-6a6bc058]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-6a6bc058]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-6a6bc058]{width:100%;height:100%}header.header-mobile button svg path[data-v-6a6bc058]{fill:#fff}nav.sidebar[data-v-6a6bc058]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-6a6bc058]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-6a6bc058]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-6a6bc058]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-6a6bc058]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-6a6bc058]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-6a6bc058]{color:#fff}nav.sidebar .container .children[data-v-6a6bc058]{padding-left:30px}@-moz-keyframes tada-6a6bc058{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-6a6bc058{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-6a6bc058{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-6a6bc058{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-6a6bc058]{animation:dialogEnter-6a6bc058 .3s linear forwards}.dialog-leave-active[data-v-6a6bc058]{animation:dialogLeave-6a6bc058 .3s linear forwards}@keyframes dialogEnter-6a6bc058{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-6a6bc058{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-6a6bc058]{animation:dialogEnter-6a6bc058 .2s linear forwards}.dialog1-leave-active[data-v-6a6bc058]{animation:dialogLeave-6a6bc058 .2s linear forwards}@keyframes rotateEnter-6a6bc058{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-6a6bc058]{animation:rotateEnter-6a6bc058 .7s;position:relative}.rotate-leave-active[data-v-6a6bc058]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-6a6bc058{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-6a6bc058{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-6a6bc058]{animation:slideOutTop-6a6bc058 .5s linear forwards}.slide-top-leave-active[data-v-6a6bc058],.slide-bottom-enter-active[data-v-6a6bc058]{animation:slideOutBottom-6a6bc058 .5s linear forwards}@keyframes slideInLeft-6a6bc058{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-6a6bc058{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-6a6bc058]{animation:slideInLeft-6a6bc058 .3s linear forwards}.slide-left-leave-active[data-v-6a6bc058]{animation:slideInRight-6a6bc058 .3s linear forwards}@keyframes slideOutLeft-6a6bc058{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-6a6bc058{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-6a6bc058]{animation:slideOutLeft-6a6bc058 .3s linear forwards}.slide-right-leave-active[data-v-6a6bc058]{animation:slideOutRight-6a6bc058 .3s linear forwards}@keyframes bganimation-6a6bc058{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-6a6bc058{0%{height:0}to{height:100px}}@keyframes fadeEnd-6a6bc058{0%{height:100%}to{height:0}}.fade-enter-active[data-v-6a6bc058]{animation:fadeStart-6a6bc058 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-6a6bc058]{animation:fadeEnd-6a6bc058 .1s linear forwards;overflow:hidden}section[data-v-6a6bc058]{width:100%;margin-bottom:1rem;display:block}@keyframes turns-5cb5900e{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-5cb5900e]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-5cb5900e]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-5cb5900e]{color:#f9ad1e}.notice_info li[data-v-5cb5900e]{font-size:14px;list-style:revert}.text-container[data-v-5cb5900e]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-5cb5900e]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-5cb5900e]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-5cb5900e]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-5cb5900e]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-5cb5900e]{width:100%}.text-container .text-container_item p.info-desc[data-v-5cb5900e]{width:100%;color:#999;font-size:14px}.page-container[data-v-5cb5900e]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-5cb5900e]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-5cb5900e]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-5cb5900e]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-5cb5900e],.page-container .page-flex .page-sidebar a[data-v-5cb5900e]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5cb5900e]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5cb5900e]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-5cb5900e]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-5cb5900e]{border-radius:0;padding:1rem}ul.ul-container[data-v-5cb5900e]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-5cb5900e]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-5cb5900e]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-5cb5900e]{width:100%}form.form-container[data-v-5cb5900e]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-5cb5900e]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-5cb5900e]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-5cb5900e]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-5cb5900e]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-5cb5900e],form.form-container .label-value select[data-v-5cb5900e]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-5cb5900e]:focus,form.form-container .label-value select[data-v-5cb5900e]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-5cb5900e]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-5cb5900e]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-5cb5900e],form.form-container .label-value input[type=radio][data-v-5cb5900e]{width:auto}form.form-container .label-value input[type=radio][data-v-5cb5900e]{margin:0 4px 0 0}form.form-container .label-value input[data-v-5cb5900e]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-5cb5900e]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5cb5900e]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5cb5900e]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-5cb5900e]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-5cb5900e]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-5cb5900e]:hover{background-color:#747474}form.form-container .label-msg[data-v-5cb5900e]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-5cb5900e]{color:#f9ad1e}form.form-container .label-flex[data-v-5cb5900e]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-5cb5900e]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-5cb5900e]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-5cb5900e]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-5cb5900e]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-5cb5900e]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-5cb5900e]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-5cb5900e],form.form-container1 .label-value select[data-v-5cb5900e]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-5cb5900e]:focus,form.form-container1 .label-value select[data-v-5cb5900e]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-5cb5900e]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-5cb5900e],form.form-container1 .label-value input[type=radio][data-v-5cb5900e]{width:auto}form.form-container1 .label-value input[type=radio][data-v-5cb5900e]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-5cb5900e]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-5cb5900e]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5cb5900e]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5cb5900e]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-5cb5900e]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-5cb5900e]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-5cb5900e]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-5cb5900e]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-5cb5900e]{color:#f9ad1e}form.form-container1 .label-flex[data-v-5cb5900e]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-5cb5900e]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-5cb5900e]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-5cb5900e]{width:100px}table.page-table th.checkbox[data-v-5cb5900e]{width:50px;text-align:center}table.page-table th.setting[data-v-5cb5900e]{width:100px;text-align:center}table.page-table thead[data-v-5cb5900e]{color:#909399}table.page-table thead tr[data-v-5cb5900e]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-5cb5900e]{padding:10px 16px}table.page-table tbody tr[data-v-5cb5900e]:hover{background-color:#eeee}table.page-table tbody tr[data-v-5cb5900e]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-5cb5900e]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-5cb5900e]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-5cb5900e]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-5cb5900e]{width:100px}table.popups-table th.checkbox[data-v-5cb5900e]{width:50px;text-align:center}table.popups-table th.setting[data-v-5cb5900e]{width:100px;text-align:center}table.popups-table thead[data-v-5cb5900e]{color:#eee}table.popups-table thead tr[data-v-5cb5900e]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-5cb5900e]{padding:10px 16px}table.popups-table tbody tr[data-v-5cb5900e]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-5cb5900e]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-5cb5900e]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-5cb5900e]{width:100%}header.header-desktop[data-v-5cb5900e]{display:block}header.header-mobile[data-v-5cb5900e]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-5cb5900e]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-5cb5900e]{width:100%;height:100%}header.header-mobile button svg path[data-v-5cb5900e]{fill:#fff}nav.sidebar[data-v-5cb5900e]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-5cb5900e]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-5cb5900e]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-5cb5900e]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-5cb5900e]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-5cb5900e]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-5cb5900e]{color:#fff}nav.sidebar .container .children[data-v-5cb5900e]{padding-left:30px}@-moz-keyframes tada-5cb5900e{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-5cb5900e{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-5cb5900e{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-5cb5900e{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-5cb5900e]{animation:dialogEnter-5cb5900e .3s linear forwards}.dialog-leave-active[data-v-5cb5900e]{animation:dialogLeave-5cb5900e .3s linear forwards}@keyframes dialogEnter-5cb5900e{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-5cb5900e{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-5cb5900e]{animation:dialogEnter-5cb5900e .2s linear forwards}.dialog1-leave-active[data-v-5cb5900e]{animation:dialogLeave-5cb5900e .2s linear forwards}@keyframes rotateEnter-5cb5900e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-5cb5900e]{animation:rotateEnter-5cb5900e .7s;position:relative}.rotate-leave-active[data-v-5cb5900e]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-5cb5900e{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-5cb5900e{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-5cb5900e]{animation:slideOutTop-5cb5900e .5s linear forwards}.slide-top-leave-active[data-v-5cb5900e],.slide-bottom-enter-active[data-v-5cb5900e]{animation:slideOutBottom-5cb5900e .5s linear forwards}@keyframes slideInLeft-5cb5900e{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-5cb5900e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-5cb5900e]{animation:slideInLeft-5cb5900e .3s linear forwards}.slide-left-leave-active[data-v-5cb5900e]{animation:slideInRight-5cb5900e .3s linear forwards}@keyframes slideOutLeft-5cb5900e{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-5cb5900e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-5cb5900e]{animation:slideOutLeft-5cb5900e .3s linear forwards}.slide-right-leave-active[data-v-5cb5900e]{animation:slideOutRight-5cb5900e .3s linear forwards}@keyframes bganimation-5cb5900e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-5cb5900e{0%{height:0}to{height:100px}}@keyframes fadeEnd-5cb5900e{0%{height:100%}to{height:0}}.fade-enter-active[data-v-5cb5900e]{animation:fadeStart-5cb5900e .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-5cb5900e]{animation:fadeEnd-5cb5900e .1s linear forwards;overflow:hidden}.section-title[data-v-5cb5900e]{margin-bottom:1rem;color:#fff;font-weight:bolder;font-size:1.125rem}@keyframes turns-790a0322{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-790a0322]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-790a0322]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-790a0322]{color:#f9ad1e}.notice_info li[data-v-790a0322]{font-size:14px;list-style:revert}.text-container[data-v-790a0322]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-790a0322]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-790a0322]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-790a0322]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-790a0322]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-790a0322]{width:100%}.text-container .text-container_item p.info-desc[data-v-790a0322]{width:100%;color:#999;font-size:14px}.page-container[data-v-790a0322]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-790a0322]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-790a0322]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-790a0322]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-790a0322],.page-container .page-flex .page-sidebar a[data-v-790a0322]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-790a0322]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-790a0322]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-790a0322]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-790a0322]{border-radius:0;padding:1rem}ul.ul-container[data-v-790a0322]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-790a0322]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-790a0322]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-790a0322]{width:100%}form.form-container[data-v-790a0322]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-790a0322]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-790a0322]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-790a0322]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-790a0322]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-790a0322],form.form-container .label-value select[data-v-790a0322]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-790a0322]:focus,form.form-container .label-value select[data-v-790a0322]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-790a0322]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-790a0322]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-790a0322],form.form-container .label-value input[type=radio][data-v-790a0322]{width:auto}form.form-container .label-value input[type=radio][data-v-790a0322]{margin:0 4px 0 0}form.form-container .label-value input[data-v-790a0322]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-790a0322]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-790a0322]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-790a0322]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-790a0322]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-790a0322]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-790a0322]:hover{background-color:#747474}form.form-container .label-msg[data-v-790a0322]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-790a0322]{color:#f9ad1e}form.form-container .label-flex[data-v-790a0322]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-790a0322]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-790a0322]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-790a0322]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-790a0322]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-790a0322]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-790a0322]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-790a0322],form.form-container1 .label-value select[data-v-790a0322]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-790a0322]:focus,form.form-container1 .label-value select[data-v-790a0322]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-790a0322]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-790a0322],form.form-container1 .label-value input[type=radio][data-v-790a0322]{width:auto}form.form-container1 .label-value input[type=radio][data-v-790a0322]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-790a0322]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-790a0322]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-790a0322]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-790a0322]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-790a0322]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-790a0322]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-790a0322]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-790a0322]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-790a0322]{color:#f9ad1e}form.form-container1 .label-flex[data-v-790a0322]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-790a0322]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-790a0322]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-790a0322]{width:100px}table.page-table th.checkbox[data-v-790a0322]{width:50px;text-align:center}table.page-table th.setting[data-v-790a0322]{width:100px;text-align:center}table.page-table thead[data-v-790a0322]{color:#909399}table.page-table thead tr[data-v-790a0322]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-790a0322]{padding:10px 16px}table.page-table tbody tr[data-v-790a0322]:hover{background-color:#eeee}table.page-table tbody tr[data-v-790a0322]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-790a0322]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-790a0322]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-790a0322]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-790a0322]{width:100px}table.popups-table th.checkbox[data-v-790a0322]{width:50px;text-align:center}table.popups-table th.setting[data-v-790a0322]{width:100px;text-align:center}table.popups-table thead[data-v-790a0322]{color:#eee}table.popups-table thead tr[data-v-790a0322]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-790a0322]{padding:10px 16px}table.popups-table tbody tr[data-v-790a0322]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-790a0322]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-790a0322]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-790a0322]{width:100%}header.header-desktop[data-v-790a0322]{display:block}header.header-mobile[data-v-790a0322]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-790a0322]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-790a0322]{width:100%;height:100%}header.header-mobile button svg path[data-v-790a0322]{fill:#fff}nav.sidebar[data-v-790a0322]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-790a0322]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-790a0322]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-790a0322]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-790a0322]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-790a0322]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-790a0322]{color:#fff}nav.sidebar .container .children[data-v-790a0322]{padding-left:30px}@-moz-keyframes tada-790a0322{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-790a0322{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-790a0322{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-790a0322{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-790a0322]{animation:dialogEnter-790a0322 .3s linear forwards}.dialog-leave-active[data-v-790a0322]{animation:dialogLeave-790a0322 .3s linear forwards}@keyframes dialogEnter-790a0322{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-790a0322{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-790a0322]{animation:dialogEnter-790a0322 .2s linear forwards}.dialog1-leave-active[data-v-790a0322]{animation:dialogLeave-790a0322 .2s linear forwards}@keyframes rotateEnter-790a0322{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-790a0322]{animation:rotateEnter-790a0322 .7s;position:relative}.rotate-leave-active[data-v-790a0322]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-790a0322{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-790a0322{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-790a0322]{animation:slideOutTop-790a0322 .5s linear forwards}.slide-top-leave-active[data-v-790a0322],.slide-bottom-enter-active[data-v-790a0322]{animation:slideOutBottom-790a0322 .5s linear forwards}@keyframes slideInLeft-790a0322{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-790a0322{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-790a0322]{animation:slideInLeft-790a0322 .3s linear forwards}.slide-left-leave-active[data-v-790a0322]{animation:slideInRight-790a0322 .3s linear forwards}@keyframes slideOutLeft-790a0322{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-790a0322{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-790a0322]{animation:slideOutLeft-790a0322 .3s linear forwards}.slide-right-leave-active[data-v-790a0322]{animation:slideOutRight-790a0322 .3s linear forwards}@keyframes bganimation-790a0322{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-790a0322{0%{height:0}to{height:100px}}@keyframes fadeEnd-790a0322{0%{height:100%}to{height:0}}.fade-enter-active[data-v-790a0322]{animation:fadeStart-790a0322 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-790a0322]{animation:fadeEnd-790a0322 .1s linear forwards;overflow:hidden}.section-container[data-v-790a0322]{display:grid;width:100%;grid-gap:1rem;grid-template-columns:repeat(auto-fill,minmax(50%,1fr))}@keyframes turns-abe9a852{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-abe9a852]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-abe9a852]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-abe9a852]{color:#f9ad1e}.notice_info li[data-v-abe9a852]{font-size:14px;list-style:revert}.text-container[data-v-abe9a852]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-abe9a852]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-abe9a852]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-abe9a852]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-abe9a852]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-abe9a852]{width:100%}.text-container .text-container_item p.info-desc[data-v-abe9a852]{width:100%;color:#999;font-size:14px}.page-container[data-v-abe9a852]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-abe9a852]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-abe9a852]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-abe9a852]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-abe9a852],.page-container .page-flex .page-sidebar a[data-v-abe9a852]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-abe9a852]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-abe9a852]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-abe9a852]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-abe9a852]{border-radius:0;padding:1rem}ul.ul-container[data-v-abe9a852]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-abe9a852]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-abe9a852]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-abe9a852]{width:100%}form.form-container[data-v-abe9a852]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-abe9a852]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-abe9a852]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-abe9a852]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-abe9a852]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-abe9a852],form.form-container .label-value select[data-v-abe9a852]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-abe9a852]:focus,form.form-container .label-value select[data-v-abe9a852]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-abe9a852]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-abe9a852]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-abe9a852],form.form-container .label-value input[type=radio][data-v-abe9a852]{width:auto}form.form-container .label-value input[type=radio][data-v-abe9a852]{margin:0 4px 0 0}form.form-container .label-value input[data-v-abe9a852]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-abe9a852]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-abe9a852]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-abe9a852]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-abe9a852]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-abe9a852]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-abe9a852]:hover{background-color:#747474}form.form-container .label-msg[data-v-abe9a852]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-abe9a852]{color:#f9ad1e}form.form-container .label-flex[data-v-abe9a852]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-abe9a852]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-abe9a852]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-abe9a852]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-abe9a852]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-abe9a852]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-abe9a852]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-abe9a852],form.form-container1 .label-value select[data-v-abe9a852]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-abe9a852]:focus,form.form-container1 .label-value select[data-v-abe9a852]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-abe9a852]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-abe9a852],form.form-container1 .label-value input[type=radio][data-v-abe9a852]{width:auto}form.form-container1 .label-value input[type=radio][data-v-abe9a852]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-abe9a852]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-abe9a852]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-abe9a852]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-abe9a852]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-abe9a852]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-abe9a852]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-abe9a852]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-abe9a852]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-abe9a852]{color:#f9ad1e}form.form-container1 .label-flex[data-v-abe9a852]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-abe9a852]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-abe9a852]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-abe9a852]{width:100px}table.page-table th.checkbox[data-v-abe9a852]{width:50px;text-align:center}table.page-table th.setting[data-v-abe9a852]{width:100px;text-align:center}table.page-table thead[data-v-abe9a852]{color:#909399}table.page-table thead tr[data-v-abe9a852]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-abe9a852]{padding:10px 16px}table.page-table tbody tr[data-v-abe9a852]:hover{background-color:#eeee}table.page-table tbody tr[data-v-abe9a852]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-abe9a852]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-abe9a852]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-abe9a852]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-abe9a852]{width:100px}table.popups-table th.checkbox[data-v-abe9a852]{width:50px;text-align:center}table.popups-table th.setting[data-v-abe9a852]{width:100px;text-align:center}table.popups-table thead[data-v-abe9a852]{color:#eee}table.popups-table thead tr[data-v-abe9a852]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-abe9a852]{padding:10px 16px}table.popups-table tbody tr[data-v-abe9a852]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-abe9a852]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-abe9a852]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-abe9a852]{width:100%}header.header-desktop[data-v-abe9a852]{display:block}header.header-mobile[data-v-abe9a852]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-abe9a852]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-abe9a852]{width:100%;height:100%}header.header-mobile button svg path[data-v-abe9a852]{fill:#fff}nav.sidebar[data-v-abe9a852]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-abe9a852]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-abe9a852]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-abe9a852]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-abe9a852]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-abe9a852]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-abe9a852]{color:#fff}nav.sidebar .container .children[data-v-abe9a852]{padding-left:30px}@-moz-keyframes tada-abe9a852{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-abe9a852{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-abe9a852{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-abe9a852{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-abe9a852]{animation:dialogEnter-abe9a852 .3s linear forwards}.dialog-leave-active[data-v-abe9a852]{animation:dialogLeave-abe9a852 .3s linear forwards}@keyframes dialogEnter-abe9a852{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-abe9a852{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-abe9a852]{animation:dialogEnter-abe9a852 .2s linear forwards}.dialog1-leave-active[data-v-abe9a852]{animation:dialogLeave-abe9a852 .2s linear forwards}@keyframes rotateEnter-abe9a852{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-abe9a852]{animation:rotateEnter-abe9a852 .7s;position:relative}.rotate-leave-active[data-v-abe9a852]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-abe9a852{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-abe9a852{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-abe9a852]{animation:slideOutTop-abe9a852 .5s linear forwards}.slide-top-leave-active[data-v-abe9a852],.slide-bottom-enter-active[data-v-abe9a852]{animation:slideOutBottom-abe9a852 .5s linear forwards}@keyframes slideInLeft-abe9a852{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-abe9a852{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-abe9a852]{animation:slideInLeft-abe9a852 .3s linear forwards}.slide-left-leave-active[data-v-abe9a852]{animation:slideInRight-abe9a852 .3s linear forwards}@keyframes slideOutLeft-abe9a852{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-abe9a852{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-abe9a852]{animation:slideOutLeft-abe9a852 .3s linear forwards}.slide-right-leave-active[data-v-abe9a852]{animation:slideOutRight-abe9a852 .3s linear forwards}@keyframes bganimation-abe9a852{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-abe9a852{0%{height:0}to{height:100px}}@keyframes fadeEnd-abe9a852{0%{height:100%}to{height:0}}.fade-enter-active[data-v-abe9a852]{animation:fadeStart-abe9a852 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-abe9a852]{animation:fadeEnd-abe9a852 .1s linear forwards;overflow:hidden}.section-item[data-v-abe9a852]{position:relative}.section-item[data-v-abe9a852]:hover{transition:.3s;box-shadow:0 0 17px #0003}.section-item[data-v-abe9a852]:before{content:\"\";background:hsla(217,5%,48%,.35);backdrop-filter:blur(20px);-webkit-backdrop-filter:blur(20px);border-radius:.5rem;height:100%;overflow:hidden;position:absolute;width:100%;z-index:0;inset:0;z-index:-1}@keyframes turns-0af2e383{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-0af2e383]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-0af2e383]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-0af2e383]{color:#f9ad1e}.notice_info li[data-v-0af2e383]{font-size:14px;list-style:revert}.text-container[data-v-0af2e383]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-0af2e383]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-0af2e383]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-0af2e383]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-0af2e383]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-0af2e383]{width:100%}.text-container .text-container_item p.info-desc[data-v-0af2e383]{width:100%;color:#999;font-size:14px}.page-container[data-v-0af2e383]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-0af2e383]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-0af2e383]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-0af2e383]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-0af2e383],.page-container .page-flex .page-sidebar a[data-v-0af2e383]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-0af2e383]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-0af2e383]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-0af2e383]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-0af2e383]{border-radius:0;padding:1rem}ul.ul-container[data-v-0af2e383]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-0af2e383]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-0af2e383]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-0af2e383]{width:100%}form.form-container[data-v-0af2e383]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-0af2e383]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-0af2e383]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-0af2e383]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-0af2e383]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-0af2e383],form.form-container .label-value select[data-v-0af2e383]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-0af2e383]:focus,form.form-container .label-value select[data-v-0af2e383]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-0af2e383]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-0af2e383]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-0af2e383],form.form-container .label-value input[type=radio][data-v-0af2e383]{width:auto}form.form-container .label-value input[type=radio][data-v-0af2e383]{margin:0 4px 0 0}form.form-container .label-value input[data-v-0af2e383]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-0af2e383]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-0af2e383]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-0af2e383]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-0af2e383]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-0af2e383]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-0af2e383]:hover{background-color:#747474}form.form-container .label-msg[data-v-0af2e383]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-0af2e383]{color:#f9ad1e}form.form-container .label-flex[data-v-0af2e383]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-0af2e383]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-0af2e383]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-0af2e383]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-0af2e383]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-0af2e383]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-0af2e383]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-0af2e383],form.form-container1 .label-value select[data-v-0af2e383]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-0af2e383]:focus,form.form-container1 .label-value select[data-v-0af2e383]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-0af2e383]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-0af2e383],form.form-container1 .label-value input[type=radio][data-v-0af2e383]{width:auto}form.form-container1 .label-value input[type=radio][data-v-0af2e383]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-0af2e383]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-0af2e383]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-0af2e383]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-0af2e383]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-0af2e383]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-0af2e383]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-0af2e383]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-0af2e383]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-0af2e383]{color:#f9ad1e}form.form-container1 .label-flex[data-v-0af2e383]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-0af2e383]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-0af2e383]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-0af2e383]{width:100px}table.page-table th.checkbox[data-v-0af2e383]{width:50px;text-align:center}table.page-table th.setting[data-v-0af2e383]{width:100px;text-align:center}table.page-table thead[data-v-0af2e383]{color:#909399}table.page-table thead tr[data-v-0af2e383]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-0af2e383]{padding:10px 16px}table.page-table tbody tr[data-v-0af2e383]:hover{background-color:#eeee}table.page-table tbody tr[data-v-0af2e383]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-0af2e383]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-0af2e383]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-0af2e383]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-0af2e383]{width:100px}table.popups-table th.checkbox[data-v-0af2e383]{width:50px;text-align:center}table.popups-table th.setting[data-v-0af2e383]{width:100px;text-align:center}table.popups-table thead[data-v-0af2e383]{color:#eee}table.popups-table thead tr[data-v-0af2e383]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-0af2e383]{padding:10px 16px}table.popups-table tbody tr[data-v-0af2e383]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-0af2e383]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-0af2e383]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-0af2e383]{width:100%}header.header-desktop[data-v-0af2e383]{display:block}header.header-mobile[data-v-0af2e383]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-0af2e383]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-0af2e383]{width:100%;height:100%}header.header-mobile button svg path[data-v-0af2e383]{fill:#fff}nav.sidebar[data-v-0af2e383]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-0af2e383]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-0af2e383]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-0af2e383]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-0af2e383]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-0af2e383]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-0af2e383]{color:#fff}nav.sidebar .container .children[data-v-0af2e383]{padding-left:30px}@-moz-keyframes tada-0af2e383{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-0af2e383{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-0af2e383{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-0af2e383{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-0af2e383]{animation:dialogEnter-0af2e383 .3s linear forwards}.dialog-leave-active[data-v-0af2e383]{animation:dialogLeave-0af2e383 .3s linear forwards}@keyframes dialogEnter-0af2e383{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-0af2e383{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-0af2e383]{animation:dialogEnter-0af2e383 .2s linear forwards}.dialog1-leave-active[data-v-0af2e383]{animation:dialogLeave-0af2e383 .2s linear forwards}@keyframes rotateEnter-0af2e383{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-0af2e383]{animation:rotateEnter-0af2e383 .7s;position:relative}.rotate-leave-active[data-v-0af2e383]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-0af2e383{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-0af2e383{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-0af2e383]{animation:slideOutTop-0af2e383 .5s linear forwards}.slide-top-leave-active[data-v-0af2e383],.slide-bottom-enter-active[data-v-0af2e383]{animation:slideOutBottom-0af2e383 .5s linear forwards}@keyframes slideInLeft-0af2e383{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-0af2e383{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-0af2e383]{animation:slideInLeft-0af2e383 .3s linear forwards}.slide-left-leave-active[data-v-0af2e383]{animation:slideInRight-0af2e383 .3s linear forwards}@keyframes slideOutLeft-0af2e383{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-0af2e383{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-0af2e383]{animation:slideOutLeft-0af2e383 .3s linear forwards}.slide-right-leave-active[data-v-0af2e383]{animation:slideOutRight-0af2e383 .3s linear forwards}@keyframes bganimation-0af2e383{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-0af2e383{0%{height:0}to{height:100px}}@keyframes fadeEnd-0af2e383{0%{height:100%}to{height:0}}.fade-enter-active[data-v-0af2e383]{animation:fadeStart-0af2e383 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-0af2e383]{animation:fadeEnd-0af2e383 .1s linear forwards;overflow:hidden}#app-dialog[data-v-0af2e383]{display:flex;align-items:center;justify-content:center;position:fixed;inset:0;z-index:99}#app-dialog .app-dialog_bg[data-v-0af2e383]{position:fixed;background:rgba(0,0,0,.8);inset:-100%}#app-dialog .app-dialog_container[data-v-0af2e383]{position:relative;max-width:90%!important;background:#fff;border-radius:.5rem;display:flex;flex-direction:column;max-height:calc(100vh - 40px);overflow:auto;transition:all .3s;width:90vw;min-height:152px}#app-dialog .app-dialog_container .app-dialog_header[data-v-0af2e383]{height:56px;padding:0 24px;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}#app-dialog .app-dialog_container .app-dialog_header[data-v-0af2e383]:after{content:\"\";width:100%;border-bottom:1px solid #cfcfcf}#app-dialog .app-dialog_container .app-dialog_header span[data-v-0af2e383]{color:#363636;font-size:1.25rem;line-height:56px;font-weight:600}#app-dialog .app-dialog_container .app-dialog_header button.close[data-v-0af2e383]{margin:0;padding:0;background:none;width:26px;height:26px}#app-dialog .app-dialog_container .app-dialog_header button.close svg.icon[data-v-0af2e383]{width:100%;height:100%}#app-dialog .app-dialog_container .app-dialog_header button.close svg.icon path[data-v-0af2e383]{fill:#363636}#app-dialog .app-dialog_container .app-dialog_body[data-v-0af2e383]{flex-grow:1;flex-shrink:1;overflow-y:auto;overflow-x:hidden;padding:12px 24px;background-color:transparent;border:none;position:relative;min-height:320px}@keyframes turns-24ffa06c{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-24ffa06c]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-24ffa06c]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-24ffa06c]{color:#f9ad1e}.notice_info li[data-v-24ffa06c]{font-size:14px;list-style:revert}.text-container[data-v-24ffa06c]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-24ffa06c]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-24ffa06c]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-24ffa06c]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-24ffa06c]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-24ffa06c]{width:100%}.text-container .text-container_item p.info-desc[data-v-24ffa06c]{width:100%;color:#999;font-size:14px}.page-container[data-v-24ffa06c]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-24ffa06c]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-24ffa06c]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-24ffa06c]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-24ffa06c],.page-container .page-flex .page-sidebar a[data-v-24ffa06c]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-24ffa06c]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-24ffa06c]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-24ffa06c]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-24ffa06c]{border-radius:0;padding:1rem}ul.ul-container[data-v-24ffa06c]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-24ffa06c]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-24ffa06c]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-24ffa06c]{width:100%}form.form-container[data-v-24ffa06c]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-24ffa06c]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-24ffa06c]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-24ffa06c]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-24ffa06c]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-24ffa06c],form.form-container .label-value select[data-v-24ffa06c]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-24ffa06c]:focus,form.form-container .label-value select[data-v-24ffa06c]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-24ffa06c]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-24ffa06c]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-24ffa06c],form.form-container .label-value input[type=radio][data-v-24ffa06c]{width:auto}form.form-container .label-value input[type=radio][data-v-24ffa06c]{margin:0 4px 0 0}form.form-container .label-value input[data-v-24ffa06c]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-24ffa06c]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-24ffa06c]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-24ffa06c]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-24ffa06c]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-24ffa06c]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-24ffa06c]:hover{background-color:#747474}form.form-container .label-msg[data-v-24ffa06c]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-24ffa06c]{color:#f9ad1e}form.form-container .label-flex[data-v-24ffa06c]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-24ffa06c]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-24ffa06c]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-24ffa06c]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-24ffa06c]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-24ffa06c]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-24ffa06c]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-24ffa06c],form.form-container1 .label-value select[data-v-24ffa06c]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-24ffa06c]:focus,form.form-container1 .label-value select[data-v-24ffa06c]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-24ffa06c]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-24ffa06c],form.form-container1 .label-value input[type=radio][data-v-24ffa06c]{width:auto}form.form-container1 .label-value input[type=radio][data-v-24ffa06c]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-24ffa06c]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-24ffa06c]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-24ffa06c]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-24ffa06c]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-24ffa06c]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-24ffa06c]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-24ffa06c]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-24ffa06c]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-24ffa06c]{color:#f9ad1e}form.form-container1 .label-flex[data-v-24ffa06c]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-24ffa06c]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-24ffa06c]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-24ffa06c]{width:100px}table.page-table th.checkbox[data-v-24ffa06c]{width:50px;text-align:center}table.page-table th.setting[data-v-24ffa06c]{width:100px;text-align:center}table.page-table thead[data-v-24ffa06c]{color:#909399}table.page-table thead tr[data-v-24ffa06c]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-24ffa06c]{padding:10px 16px}table.page-table tbody tr[data-v-24ffa06c]:hover{background-color:#eeee}table.page-table tbody tr[data-v-24ffa06c]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-24ffa06c]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-24ffa06c]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-24ffa06c]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-24ffa06c]{width:100px}table.popups-table th.checkbox[data-v-24ffa06c]{width:50px;text-align:center}table.popups-table th.setting[data-v-24ffa06c]{width:100px;text-align:center}table.popups-table thead[data-v-24ffa06c]{color:#eee}table.popups-table thead tr[data-v-24ffa06c]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-24ffa06c]{padding:10px 16px}table.popups-table tbody tr[data-v-24ffa06c]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-24ffa06c]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-24ffa06c]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-24ffa06c]{width:100%}header.header-desktop[data-v-24ffa06c]{display:block}header.header-mobile[data-v-24ffa06c]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-24ffa06c]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-24ffa06c]{width:100%;height:100%}header.header-mobile button svg path[data-v-24ffa06c]{fill:#fff}nav.sidebar[data-v-24ffa06c]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-24ffa06c]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-24ffa06c]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-24ffa06c]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-24ffa06c]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-24ffa06c]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-24ffa06c]{color:#fff}nav.sidebar .container .children[data-v-24ffa06c]{padding-left:30px}@-moz-keyframes tada-24ffa06c{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-24ffa06c{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-24ffa06c{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-24ffa06c{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-24ffa06c]{animation:dialogEnter-24ffa06c .3s linear forwards}.dialog-leave-active[data-v-24ffa06c]{animation:dialogLeave-24ffa06c .3s linear forwards}@keyframes dialogEnter-24ffa06c{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-24ffa06c{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-24ffa06c]{animation:dialogEnter-24ffa06c .2s linear forwards}.dialog1-leave-active[data-v-24ffa06c]{animation:dialogLeave-24ffa06c .2s linear forwards}@keyframes rotateEnter-24ffa06c{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-24ffa06c]{animation:rotateEnter-24ffa06c .7s;position:relative}.rotate-leave-active[data-v-24ffa06c]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-24ffa06c{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-24ffa06c{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-24ffa06c]{animation:slideOutTop-24ffa06c .5s linear forwards}.slide-top-leave-active[data-v-24ffa06c],.slide-bottom-enter-active[data-v-24ffa06c]{animation:slideOutBottom-24ffa06c .5s linear forwards}@keyframes slideInLeft-24ffa06c{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-24ffa06c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-24ffa06c]{animation:slideInLeft-24ffa06c .3s linear forwards}.slide-left-leave-active[data-v-24ffa06c]{animation:slideInRight-24ffa06c .3s linear forwards}@keyframes slideOutLeft-24ffa06c{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-24ffa06c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-24ffa06c]{animation:slideOutLeft-24ffa06c .3s linear forwards}.slide-right-leave-active[data-v-24ffa06c]{animation:slideOutRight-24ffa06c .3s linear forwards}@keyframes bganimation-24ffa06c{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-24ffa06c{0%{height:0}to{height:100px}}@keyframes fadeEnd-24ffa06c{0%{height:100%}to{height:0}}.fade-enter-active[data-v-24ffa06c]{animation:fadeStart-24ffa06c .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-24ffa06c]{animation:fadeEnd-24ffa06c .1s linear forwards;overflow:hidden}h1[data-v-24ffa06c]{margin:0;text-align:center;width:100%;font-size:26px;margin:2rem 0;color:#363636}p[data-v-24ffa06c]{width:100%;text-align:center;margin:.5rem 0}button.next[data-v-24ffa06c]{width:300px!important;height:32px!important;margin:1rem 0}@keyframes turns-99d95164{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-99d95164]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-99d95164]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-99d95164]{color:#f9ad1e}.notice_info li[data-v-99d95164]{font-size:14px;list-style:revert}.text-container[data-v-99d95164]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-99d95164]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-99d95164]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-99d95164]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-99d95164]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-99d95164]{width:100%}.text-container .text-container_item p.info-desc[data-v-99d95164]{width:100%;color:#999;font-size:14px}.page-container[data-v-99d95164]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-99d95164]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-99d95164]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-99d95164]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-99d95164],.page-container .page-flex .page-sidebar a[data-v-99d95164]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-99d95164]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-99d95164]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-99d95164]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-99d95164]{border-radius:0;padding:1rem}ul.ul-container[data-v-99d95164]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-99d95164]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-99d95164]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-99d95164]{width:100%}form.form-container[data-v-99d95164]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-99d95164]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-99d95164]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-99d95164]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-99d95164]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-99d95164],form.form-container .label-value select[data-v-99d95164]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-99d95164]:focus,form.form-container .label-value select[data-v-99d95164]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-99d95164]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-99d95164]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-99d95164],form.form-container .label-value input[type=radio][data-v-99d95164]{width:auto}form.form-container .label-value input[type=radio][data-v-99d95164]{margin:0 4px 0 0}form.form-container .label-value input[data-v-99d95164]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-99d95164]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-99d95164]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-99d95164]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-99d95164]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-99d95164]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-99d95164]:hover{background-color:#747474}form.form-container .label-msg[data-v-99d95164]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-99d95164]{color:#f9ad1e}form.form-container .label-flex[data-v-99d95164]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-99d95164]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-99d95164]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-99d95164]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-99d95164]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-99d95164]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-99d95164]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-99d95164],form.form-container1 .label-value select[data-v-99d95164]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-99d95164]:focus,form.form-container1 .label-value select[data-v-99d95164]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-99d95164]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-99d95164],form.form-container1 .label-value input[type=radio][data-v-99d95164]{width:auto}form.form-container1 .label-value input[type=radio][data-v-99d95164]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-99d95164]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-99d95164]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-99d95164]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-99d95164]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-99d95164]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-99d95164]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-99d95164]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-99d95164]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-99d95164]{color:#f9ad1e}form.form-container1 .label-flex[data-v-99d95164]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-99d95164]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-99d95164]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-99d95164]{width:100px}table.page-table th.checkbox[data-v-99d95164]{width:50px;text-align:center}table.page-table th.setting[data-v-99d95164]{width:100px;text-align:center}table.page-table thead[data-v-99d95164]{color:#909399}table.page-table thead tr[data-v-99d95164]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-99d95164]{padding:10px 16px}table.page-table tbody tr[data-v-99d95164]:hover{background-color:#eeee}table.page-table tbody tr[data-v-99d95164]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-99d95164]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-99d95164]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-99d95164]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-99d95164]{width:100px}table.popups-table th.checkbox[data-v-99d95164]{width:50px;text-align:center}table.popups-table th.setting[data-v-99d95164]{width:100px;text-align:center}table.popups-table thead[data-v-99d95164]{color:#eee}table.popups-table thead tr[data-v-99d95164]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-99d95164]{padding:10px 16px}table.popups-table tbody tr[data-v-99d95164]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-99d95164]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-99d95164]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-99d95164]{width:100%}header.header-desktop[data-v-99d95164]{display:block}header.header-mobile[data-v-99d95164]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-99d95164]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-99d95164]{width:100%;height:100%}header.header-mobile button svg path[data-v-99d95164]{fill:#fff}nav.sidebar[data-v-99d95164]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-99d95164]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-99d95164]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-99d95164]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-99d95164]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-99d95164]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-99d95164]{color:#fff}nav.sidebar .container .children[data-v-99d95164]{padding-left:30px}@-moz-keyframes tada-99d95164{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-99d95164{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-99d95164{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-99d95164{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-99d95164]{animation:dialogEnter-99d95164 .3s linear forwards}.dialog-leave-active[data-v-99d95164]{animation:dialogLeave-99d95164 .3s linear forwards}@keyframes dialogEnter-99d95164{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-99d95164{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-99d95164]{animation:dialogEnter-99d95164 .2s linear forwards}.dialog1-leave-active[data-v-99d95164]{animation:dialogLeave-99d95164 .2s linear forwards}@keyframes rotateEnter-99d95164{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-99d95164]{animation:rotateEnter-99d95164 .7s;position:relative}.rotate-leave-active[data-v-99d95164]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-99d95164{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-99d95164{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-99d95164]{animation:slideOutTop-99d95164 .5s linear forwards}.slide-top-leave-active[data-v-99d95164],.slide-bottom-enter-active[data-v-99d95164]{animation:slideOutBottom-99d95164 .5s linear forwards}@keyframes slideInLeft-99d95164{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-99d95164{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-99d95164]{animation:slideInLeft-99d95164 .3s linear forwards}.slide-left-leave-active[data-v-99d95164]{animation:slideInRight-99d95164 .3s linear forwards}@keyframes slideOutLeft-99d95164{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-99d95164{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-99d95164]{animation:slideOutLeft-99d95164 .3s linear forwards}.slide-right-leave-active[data-v-99d95164]{animation:slideOutRight-99d95164 .3s linear forwards}@keyframes bganimation-99d95164{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-99d95164{0%{height:0}to{height:100px}}@keyframes fadeEnd-99d95164{0%{height:100%}to{height:0}}.fade-enter-active[data-v-99d95164]{animation:fadeStart-99d95164 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-99d95164]{animation:fadeEnd-99d95164 .1s linear forwards;overflow:hidden}label input[data-v-99d95164]{margin-right:5px!important}@keyframes turns-7b090953{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-7b090953]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-7b090953]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-7b090953]{color:#f9ad1e}.notice_info li[data-v-7b090953]{font-size:14px;list-style:revert}.text-container[data-v-7b090953]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-7b090953]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-7b090953]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-7b090953]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-7b090953]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-7b090953]{width:100%}.text-container .text-container_item p.info-desc[data-v-7b090953]{width:100%;color:#999;font-size:14px}.page-container[data-v-7b090953]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-7b090953]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-7b090953]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-7b090953]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-7b090953],.page-container .page-flex .page-sidebar a[data-v-7b090953]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-7b090953]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-7b090953]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-7b090953]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-7b090953]{border-radius:0;padding:1rem}ul.ul-container[data-v-7b090953]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-7b090953]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-7b090953]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-7b090953]{width:100%}form.form-container[data-v-7b090953]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-7b090953]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-7b090953]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-7b090953]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-7b090953]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-7b090953],form.form-container .label-value select[data-v-7b090953]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-7b090953]:focus,form.form-container .label-value select[data-v-7b090953]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-7b090953]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-7b090953]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-7b090953],form.form-container .label-value input[type=radio][data-v-7b090953]{width:auto}form.form-container .label-value input[type=radio][data-v-7b090953]{margin:0 4px 0 0}form.form-container .label-value input[data-v-7b090953]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-7b090953]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-7b090953]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-7b090953]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-7b090953]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-7b090953]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-7b090953]:hover{background-color:#747474}form.form-container .label-msg[data-v-7b090953]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-7b090953]{color:#f9ad1e}form.form-container .label-flex[data-v-7b090953]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-7b090953]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-7b090953]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-7b090953]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-7b090953]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-7b090953]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-7b090953]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-7b090953],form.form-container1 .label-value select[data-v-7b090953]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-7b090953]:focus,form.form-container1 .label-value select[data-v-7b090953]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-7b090953]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-7b090953],form.form-container1 .label-value input[type=radio][data-v-7b090953]{width:auto}form.form-container1 .label-value input[type=radio][data-v-7b090953]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-7b090953]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-7b090953]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-7b090953]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-7b090953]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-7b090953]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-7b090953]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-7b090953]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-7b090953]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-7b090953]{color:#f9ad1e}form.form-container1 .label-flex[data-v-7b090953]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-7b090953]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-7b090953]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-7b090953]{width:100px}table.page-table th.checkbox[data-v-7b090953]{width:50px;text-align:center}table.page-table th.setting[data-v-7b090953]{width:100px;text-align:center}table.page-table thead[data-v-7b090953]{color:#909399}table.page-table thead tr[data-v-7b090953]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-7b090953]{padding:10px 16px}table.page-table tbody tr[data-v-7b090953]:hover{background-color:#eeee}table.page-table tbody tr[data-v-7b090953]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-7b090953]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-7b090953]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-7b090953]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-7b090953]{width:100px}table.popups-table th.checkbox[data-v-7b090953]{width:50px;text-align:center}table.popups-table th.setting[data-v-7b090953]{width:100px;text-align:center}table.popups-table thead[data-v-7b090953]{color:#eee}table.popups-table thead tr[data-v-7b090953]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-7b090953]{padding:10px 16px}table.popups-table tbody tr[data-v-7b090953]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-7b090953]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-7b090953]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-7b090953]{width:100%}header.header-desktop[data-v-7b090953]{display:block}header.header-mobile[data-v-7b090953]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-7b090953]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-7b090953]{width:100%;height:100%}header.header-mobile button svg path[data-v-7b090953]{fill:#fff}nav.sidebar[data-v-7b090953]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-7b090953]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-7b090953]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-7b090953]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-7b090953]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-7b090953]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-7b090953]{color:#fff}nav.sidebar .container .children[data-v-7b090953]{padding-left:30px}@-moz-keyframes tada-7b090953{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-7b090953{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-7b090953{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-7b090953{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-7b090953]{animation:dialogEnter-7b090953 .3s linear forwards}.dialog-leave-active[data-v-7b090953]{animation:dialogLeave-7b090953 .3s linear forwards}@keyframes dialogEnter-7b090953{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-7b090953{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-7b090953]{animation:dialogEnter-7b090953 .2s linear forwards}.dialog1-leave-active[data-v-7b090953]{animation:dialogLeave-7b090953 .2s linear forwards}@keyframes rotateEnter-7b090953{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-7b090953]{animation:rotateEnter-7b090953 .7s;position:relative}.rotate-leave-active[data-v-7b090953]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-7b090953{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-7b090953{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-7b090953]{animation:slideOutTop-7b090953 .5s linear forwards}.slide-top-leave-active[data-v-7b090953],.slide-bottom-enter-active[data-v-7b090953]{animation:slideOutBottom-7b090953 .5s linear forwards}@keyframes slideInLeft-7b090953{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-7b090953{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-7b090953]{animation:slideInLeft-7b090953 .3s linear forwards}.slide-left-leave-active[data-v-7b090953]{animation:slideInRight-7b090953 .3s linear forwards}@keyframes slideOutLeft-7b090953{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-7b090953{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-7b090953]{animation:slideOutLeft-7b090953 .3s linear forwards}.slide-right-leave-active[data-v-7b090953]{animation:slideOutRight-7b090953 .3s linear forwards}@keyframes bganimation-7b090953{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-7b090953{0%{height:0}to{height:100px}}@keyframes fadeEnd-7b090953{0%{height:100%}to{height:0}}.fade-enter-active[data-v-7b090953]{animation:fadeStart-7b090953 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-7b090953]{animation:fadeEnd-7b090953 .1s linear forwards;overflow:hidden}input[disabled][data-v-7b090953]{background-color:#eee!important}img[data-v-7b090953]{width:36px;margin:0 .5rem}@keyframes turns-4d855e61{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-4d855e61]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-4d855e61]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-4d855e61]{color:#f9ad1e}.notice_info li[data-v-4d855e61]{font-size:14px;list-style:revert}.text-container[data-v-4d855e61]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-4d855e61]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-4d855e61]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-4d855e61]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-4d855e61]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-4d855e61]{width:100%}.text-container .text-container_item p.info-desc[data-v-4d855e61]{width:100%;color:#999;font-size:14px}.page-container[data-v-4d855e61]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-4d855e61]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-4d855e61]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-4d855e61]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-4d855e61],.page-container .page-flex .page-sidebar a[data-v-4d855e61]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-4d855e61]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-4d855e61]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-4d855e61]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-4d855e61]{border-radius:0;padding:1rem}ul.ul-container[data-v-4d855e61]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-4d855e61]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-4d855e61]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-4d855e61]{width:100%}form.form-container[data-v-4d855e61]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-4d855e61]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-4d855e61]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-4d855e61]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-4d855e61]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-4d855e61],form.form-container .label-value select[data-v-4d855e61]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-4d855e61]:focus,form.form-container .label-value select[data-v-4d855e61]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-4d855e61]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-4d855e61]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-4d855e61],form.form-container .label-value input[type=radio][data-v-4d855e61]{width:auto}form.form-container .label-value input[type=radio][data-v-4d855e61]{margin:0 4px 0 0}form.form-container .label-value input[data-v-4d855e61]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-4d855e61]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-4d855e61]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-4d855e61]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-4d855e61]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-4d855e61]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-4d855e61]:hover{background-color:#747474}form.form-container .label-msg[data-v-4d855e61]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-4d855e61]{color:#f9ad1e}form.form-container .label-flex[data-v-4d855e61]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-4d855e61]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-4d855e61]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-4d855e61]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-4d855e61]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-4d855e61]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-4d855e61]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-4d855e61],form.form-container1 .label-value select[data-v-4d855e61]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-4d855e61]:focus,form.form-container1 .label-value select[data-v-4d855e61]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-4d855e61]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-4d855e61],form.form-container1 .label-value input[type=radio][data-v-4d855e61]{width:auto}form.form-container1 .label-value input[type=radio][data-v-4d855e61]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-4d855e61]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-4d855e61]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-4d855e61]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-4d855e61]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-4d855e61]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-4d855e61]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-4d855e61]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-4d855e61]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-4d855e61]{color:#f9ad1e}form.form-container1 .label-flex[data-v-4d855e61]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-4d855e61]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-4d855e61]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-4d855e61]{width:100px}table.page-table th.checkbox[data-v-4d855e61]{width:50px;text-align:center}table.page-table th.setting[data-v-4d855e61]{width:100px;text-align:center}table.page-table thead[data-v-4d855e61]{color:#909399}table.page-table thead tr[data-v-4d855e61]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-4d855e61]{padding:10px 16px}table.page-table tbody tr[data-v-4d855e61]:hover{background-color:#eeee}table.page-table tbody tr[data-v-4d855e61]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-4d855e61]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-4d855e61]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-4d855e61]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-4d855e61]{width:100px}table.popups-table th.checkbox[data-v-4d855e61]{width:50px;text-align:center}table.popups-table th.setting[data-v-4d855e61]{width:100px;text-align:center}table.popups-table thead[data-v-4d855e61]{color:#eee}table.popups-table thead tr[data-v-4d855e61]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-4d855e61]{padding:10px 16px}table.popups-table tbody tr[data-v-4d855e61]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-4d855e61]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-4d855e61]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-4d855e61]{width:100%}header.header-desktop[data-v-4d855e61]{display:block}header.header-mobile[data-v-4d855e61]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-4d855e61]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-4d855e61]{width:100%;height:100%}header.header-mobile button svg path[data-v-4d855e61]{fill:#fff}nav.sidebar[data-v-4d855e61]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-4d855e61]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-4d855e61]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-4d855e61]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-4d855e61]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-4d855e61]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-4d855e61]{color:#fff}nav.sidebar .container .children[data-v-4d855e61]{padding-left:30px}@-moz-keyframes tada-4d855e61{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-4d855e61{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-4d855e61{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-4d855e61{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-4d855e61]{animation:dialogEnter-4d855e61 .3s linear forwards}.dialog-leave-active[data-v-4d855e61]{animation:dialogLeave-4d855e61 .3s linear forwards}@keyframes dialogEnter-4d855e61{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-4d855e61{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-4d855e61]{animation:dialogEnter-4d855e61 .2s linear forwards}.dialog1-leave-active[data-v-4d855e61]{animation:dialogLeave-4d855e61 .2s linear forwards}@keyframes rotateEnter-4d855e61{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-4d855e61]{animation:rotateEnter-4d855e61 .7s;position:relative}.rotate-leave-active[data-v-4d855e61]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-4d855e61{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-4d855e61{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-4d855e61]{animation:slideOutTop-4d855e61 .5s linear forwards}.slide-top-leave-active[data-v-4d855e61],.slide-bottom-enter-active[data-v-4d855e61]{animation:slideOutBottom-4d855e61 .5s linear forwards}@keyframes slideInLeft-4d855e61{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-4d855e61{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-4d855e61]{animation:slideInLeft-4d855e61 .3s linear forwards}.slide-left-leave-active[data-v-4d855e61]{animation:slideInRight-4d855e61 .3s linear forwards}@keyframes slideOutLeft-4d855e61{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-4d855e61{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-4d855e61]{animation:slideOutLeft-4d855e61 .3s linear forwards}.slide-right-leave-active[data-v-4d855e61]{animation:slideOutRight-4d855e61 .3s linear forwards}@keyframes bganimation-4d855e61{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-4d855e61{0%{height:0}to{height:100px}}@keyframes fadeEnd-4d855e61{0%{height:100%}to{height:0}}.fade-enter-active[data-v-4d855e61]{animation:fadeStart-4d855e61 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-4d855e61]{animation:fadeEnd-4d855e61 .1s linear forwards;overflow:hidden}input[disabled][data-v-4d855e61]{background-color:#eee!important}img[data-v-4d855e61]{width:36px;margin:0 .5rem}@keyframes turns-2b6459ac{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-2b6459ac]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-2b6459ac]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-2b6459ac]{color:#f9ad1e}.notice_info li[data-v-2b6459ac]{font-size:14px;list-style:revert}.text-container[data-v-2b6459ac]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-2b6459ac]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-2b6459ac]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-2b6459ac]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-2b6459ac]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-2b6459ac]{width:100%}.text-container .text-container_item p.info-desc[data-v-2b6459ac]{width:100%;color:#999;font-size:14px}.page-container[data-v-2b6459ac]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-2b6459ac]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-2b6459ac]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-2b6459ac]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-2b6459ac],.page-container .page-flex .page-sidebar a[data-v-2b6459ac]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-2b6459ac]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-2b6459ac]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-2b6459ac]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-2b6459ac]{border-radius:0;padding:1rem}ul.ul-container[data-v-2b6459ac]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-2b6459ac]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-2b6459ac]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-2b6459ac]{width:100%}form.form-container[data-v-2b6459ac]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-2b6459ac]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-2b6459ac]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-2b6459ac]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-2b6459ac]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-2b6459ac],form.form-container .label-value select[data-v-2b6459ac]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-2b6459ac]:focus,form.form-container .label-value select[data-v-2b6459ac]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-2b6459ac]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-2b6459ac]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-2b6459ac],form.form-container .label-value input[type=radio][data-v-2b6459ac]{width:auto}form.form-container .label-value input[type=radio][data-v-2b6459ac]{margin:0 4px 0 0}form.form-container .label-value input[data-v-2b6459ac]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-2b6459ac]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-2b6459ac]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-2b6459ac]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-2b6459ac]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-2b6459ac]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-2b6459ac]:hover{background-color:#747474}form.form-container .label-msg[data-v-2b6459ac]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-2b6459ac]{color:#f9ad1e}form.form-container .label-flex[data-v-2b6459ac]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-2b6459ac]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-2b6459ac]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-2b6459ac]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-2b6459ac]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-2b6459ac]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-2b6459ac]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-2b6459ac],form.form-container1 .label-value select[data-v-2b6459ac]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-2b6459ac]:focus,form.form-container1 .label-value select[data-v-2b6459ac]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-2b6459ac]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-2b6459ac],form.form-container1 .label-value input[type=radio][data-v-2b6459ac]{width:auto}form.form-container1 .label-value input[type=radio][data-v-2b6459ac]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-2b6459ac]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-2b6459ac]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-2b6459ac]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-2b6459ac]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-2b6459ac]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-2b6459ac]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-2b6459ac]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-2b6459ac]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-2b6459ac]{color:#f9ad1e}form.form-container1 .label-flex[data-v-2b6459ac]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-2b6459ac]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-2b6459ac]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-2b6459ac]{width:100px}table.page-table th.checkbox[data-v-2b6459ac]{width:50px;text-align:center}table.page-table th.setting[data-v-2b6459ac]{width:100px;text-align:center}table.page-table thead[data-v-2b6459ac]{color:#909399}table.page-table thead tr[data-v-2b6459ac]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-2b6459ac]{padding:10px 16px}table.page-table tbody tr[data-v-2b6459ac]:hover{background-color:#eeee}table.page-table tbody tr[data-v-2b6459ac]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-2b6459ac]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-2b6459ac]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-2b6459ac]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-2b6459ac]{width:100px}table.popups-table th.checkbox[data-v-2b6459ac]{width:50px;text-align:center}table.popups-table th.setting[data-v-2b6459ac]{width:100px;text-align:center}table.popups-table thead[data-v-2b6459ac]{color:#eee}table.popups-table thead tr[data-v-2b6459ac]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-2b6459ac]{padding:10px 16px}table.popups-table tbody tr[data-v-2b6459ac]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-2b6459ac]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-2b6459ac]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-2b6459ac]{width:100%}header.header-desktop[data-v-2b6459ac]{display:block}header.header-mobile[data-v-2b6459ac]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-2b6459ac]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-2b6459ac]{width:100%;height:100%}header.header-mobile button svg path[data-v-2b6459ac]{fill:#fff}nav.sidebar[data-v-2b6459ac]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-2b6459ac]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-2b6459ac]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-2b6459ac]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-2b6459ac]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-2b6459ac]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-2b6459ac]{color:#fff}nav.sidebar .container .children[data-v-2b6459ac]{padding-left:30px}@-moz-keyframes tada-2b6459ac{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-2b6459ac{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-2b6459ac{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-2b6459ac{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-2b6459ac]{animation:dialogEnter-2b6459ac .3s linear forwards}.dialog-leave-active[data-v-2b6459ac]{animation:dialogLeave-2b6459ac .3s linear forwards}@keyframes dialogEnter-2b6459ac{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-2b6459ac{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-2b6459ac]{animation:dialogEnter-2b6459ac .2s linear forwards}.dialog1-leave-active[data-v-2b6459ac]{animation:dialogLeave-2b6459ac .2s linear forwards}@keyframes rotateEnter-2b6459ac{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-2b6459ac]{animation:rotateEnter-2b6459ac .7s;position:relative}.rotate-leave-active[data-v-2b6459ac]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-2b6459ac{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-2b6459ac{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-2b6459ac]{animation:slideOutTop-2b6459ac .5s linear forwards}.slide-top-leave-active[data-v-2b6459ac],.slide-bottom-enter-active[data-v-2b6459ac]{animation:slideOutBottom-2b6459ac .5s linear forwards}@keyframes slideInLeft-2b6459ac{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-2b6459ac{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-2b6459ac]{animation:slideInLeft-2b6459ac .3s linear forwards}.slide-left-leave-active[data-v-2b6459ac]{animation:slideInRight-2b6459ac .3s linear forwards}@keyframes slideOutLeft-2b6459ac{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-2b6459ac{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-2b6459ac]{animation:slideOutLeft-2b6459ac .3s linear forwards}.slide-right-leave-active[data-v-2b6459ac]{animation:slideOutRight-2b6459ac .3s linear forwards}@keyframes bganimation-2b6459ac{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-2b6459ac{0%{height:0}to{height:100px}}@keyframes fadeEnd-2b6459ac{0%{height:100%}to{height:0}}.fade-enter-active[data-v-2b6459ac]{animation:fadeStart-2b6459ac .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-2b6459ac]{animation:fadeEnd-2b6459ac .1s linear forwards;overflow:hidden}input[disabled][data-v-2b6459ac]{background-color:#eee!important}img[data-v-2b6459ac]{width:36px;margin:0 .5rem}@keyframes dialogEnter-a11bdd32{0%{transform:scale(.95)}to{transform:scale(1)}}@keyframes dialogLeave-a11bdd32{0%{transform:scale(1)}to{transform:scale(.95)}}.dialog-nlaert-enter-active[data-v-a11bdd32]{animation:dialogEnter-a11bdd32 .3s linear forwards}.dialog-nlaert-leave-active[data-v-a11bdd32]{animation:dialogLeave-a11bdd32 .3s linear forwards}@keyframes turns-a11bdd32{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-a11bdd32]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-a11bdd32]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-a11bdd32]{color:#f9ad1e}.notice_info li[data-v-a11bdd32]{font-size:14px;list-style:revert}.text-container[data-v-a11bdd32]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-a11bdd32]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-a11bdd32]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-a11bdd32]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-a11bdd32]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-a11bdd32]{width:100%}.text-container .text-container_item p.info-desc[data-v-a11bdd32]{width:100%;color:#999;font-size:14px}.page-container[data-v-a11bdd32]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-a11bdd32]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-a11bdd32]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-a11bdd32]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-a11bdd32],.page-container .page-flex .page-sidebar a[data-v-a11bdd32]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-a11bdd32]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-a11bdd32]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-a11bdd32]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-a11bdd32]{border-radius:0;padding:1rem}ul.ul-container[data-v-a11bdd32]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-a11bdd32]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-a11bdd32]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-a11bdd32]{width:100%}form.form-container[data-v-a11bdd32]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-a11bdd32]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-a11bdd32]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-a11bdd32]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-a11bdd32]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-a11bdd32],form.form-container .label-value select[data-v-a11bdd32]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-a11bdd32]:focus,form.form-container .label-value select[data-v-a11bdd32]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-a11bdd32]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-a11bdd32]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-a11bdd32],form.form-container .label-value input[type=radio][data-v-a11bdd32]{width:auto}form.form-container .label-value input[type=radio][data-v-a11bdd32]{margin:0 4px 0 0}form.form-container .label-value input[data-v-a11bdd32]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-a11bdd32]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-a11bdd32]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-a11bdd32]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-a11bdd32]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-a11bdd32]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-a11bdd32]:hover{background-color:#747474}form.form-container .label-msg[data-v-a11bdd32]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-a11bdd32]{color:#f9ad1e}form.form-container .label-flex[data-v-a11bdd32]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-a11bdd32]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-a11bdd32]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-a11bdd32]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-a11bdd32]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-a11bdd32]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-a11bdd32]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-a11bdd32],form.form-container1 .label-value select[data-v-a11bdd32]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-a11bdd32]:focus,form.form-container1 .label-value select[data-v-a11bdd32]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-a11bdd32]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-a11bdd32],form.form-container1 .label-value input[type=radio][data-v-a11bdd32]{width:auto}form.form-container1 .label-value input[type=radio][data-v-a11bdd32]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-a11bdd32]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-a11bdd32]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-a11bdd32]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-a11bdd32]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-a11bdd32]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-a11bdd32]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-a11bdd32]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-a11bdd32]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-a11bdd32]{color:#f9ad1e}form.form-container1 .label-flex[data-v-a11bdd32]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-a11bdd32]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-a11bdd32]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-a11bdd32]{width:100px}table.page-table th.checkbox[data-v-a11bdd32]{width:50px;text-align:center}table.page-table th.setting[data-v-a11bdd32]{width:100px;text-align:center}table.page-table thead[data-v-a11bdd32]{color:#909399}table.page-table thead tr[data-v-a11bdd32]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-a11bdd32]{padding:10px 16px}table.page-table tbody tr[data-v-a11bdd32]:hover{background-color:#eeee}table.page-table tbody tr[data-v-a11bdd32]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-a11bdd32]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-a11bdd32]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-a11bdd32]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-a11bdd32]{width:100px}table.popups-table th.checkbox[data-v-a11bdd32]{width:50px;text-align:center}table.popups-table th.setting[data-v-a11bdd32]{width:100px;text-align:center}table.popups-table thead[data-v-a11bdd32]{color:#eee}table.popups-table thead tr[data-v-a11bdd32]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-a11bdd32]{padding:10px 16px}table.popups-table tbody tr[data-v-a11bdd32]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-a11bdd32]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-a11bdd32]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-a11bdd32]{width:100%}header.header-desktop[data-v-a11bdd32]{display:block}header.header-mobile[data-v-a11bdd32]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-a11bdd32]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-a11bdd32]{width:100%;height:100%}header.header-mobile button svg path[data-v-a11bdd32]{fill:#fff}nav.sidebar[data-v-a11bdd32]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-a11bdd32]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-a11bdd32]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-a11bdd32]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-a11bdd32]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-a11bdd32]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-a11bdd32]{color:#fff}nav.sidebar .container .children[data-v-a11bdd32]{padding-left:30px}@-moz-keyframes tada-a11bdd32{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-a11bdd32{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-a11bdd32{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-a11bdd32{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-a11bdd32]{animation:dialogEnter-a11bdd32 .3s linear forwards}.dialog-leave-active[data-v-a11bdd32]{animation:dialogLeave-a11bdd32 .3s linear forwards}@keyframes dialogEnter-a11bdd32{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-a11bdd32{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-a11bdd32]{animation:dialogEnter-a11bdd32 .2s linear forwards}.dialog1-leave-active[data-v-a11bdd32]{animation:dialogLeave-a11bdd32 .2s linear forwards}@keyframes rotateEnter-a11bdd32{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-a11bdd32]{animation:rotateEnter-a11bdd32 .7s;position:relative}.rotate-leave-active[data-v-a11bdd32]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-a11bdd32{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-a11bdd32{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-a11bdd32]{animation:slideOutTop-a11bdd32 .5s linear forwards}.slide-top-leave-active[data-v-a11bdd32],.slide-bottom-enter-active[data-v-a11bdd32]{animation:slideOutBottom-a11bdd32 .5s linear forwards}@keyframes slideInLeft-a11bdd32{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-a11bdd32{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-a11bdd32]{animation:slideInLeft-a11bdd32 .3s linear forwards}.slide-left-leave-active[data-v-a11bdd32]{animation:slideInRight-a11bdd32 .3s linear forwards}@keyframes slideOutLeft-a11bdd32{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-a11bdd32{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-a11bdd32]{animation:slideOutLeft-a11bdd32 .3s linear forwards}.slide-right-leave-active[data-v-a11bdd32]{animation:slideOutRight-a11bdd32 .3s linear forwards}@keyframes bganimation-a11bdd32{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-a11bdd32{0%{height:0}to{height:100px}}@keyframes fadeEnd-a11bdd32{0%{height:100%}to{height:0}}.fade-enter-active[data-v-a11bdd32]{animation:fadeStart-a11bdd32 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-a11bdd32]{animation:fadeEnd-a11bdd32 .1s linear forwards;overflow:hidden}.nalert[data-v-a11bdd32]{position:fixed;inset:0;text-align:center;z-index:2001;overflow:auto}.nalert[data-v-a11bdd32]:after{content:\"\";display:inline-block;height:100%;width:0;vertical-align:middle}.nalert .nalert-bg[data-v-a11bdd32]{position:fixed;inset:-100%;opacity:.5;background:#000}.nalert .nalert-container[data-v-a11bdd32]{position:relative;display:inline-block;text-align:left;overflow:hidden;backface-visibility:hidden;width:560px;background:#FFFFFF;box-shadow:0 12px 48px 16px #00000008,0 9px 28px #0000000d,0 6px 16px -8px #00000014;border-radius:2px}.nalert .nalert-container .nalert-data[data-v-a11bdd32],.nalert .nalert-container .nalert-data .nalert-body[data-v-a11bdd32]{width:100%}.nalert .nalert-container .nalert-data .nalert-body .nalert-bodt_title[data-v-a11bdd32]{width:100%;padding:15px 15px 10px;display:flex;flex-wrap:wrap;align-items:center}.nalert .nalert-container .nalert-data .nalert-body .nalert-bodt_title svg.icon[data-v-a11bdd32]{width:16px;height:16px;margin:0 6px 0 0;padding:0}.nalert .nalert-container .nalert-data .nalert-body .nalert-bodt_title svg.icon path[data-v-a11bdd32]{fill:#faad14}.nalert .nalert-container .nalert-data .nalert-body .nalert-bodt_title span[data-v-a11bdd32]{font-size:16px;font-family:SFUIText-Medium,SFUIText;font-weight:500;color:#000000d9}.nalert .nalert-container .nalert-data .nalert-body[data-v-a11bdd32] .nalert-bodt_msg{font-size:14px;font-family:PingFangSC-Regular,PingFang SC;font-weight:400;color:#606266;width:100%;padding:10px 15px}.nalert .nalert-container .nalert-data .nalert-body[data-v-a11bdd32] .nalert-bodt_msg label{display:block;margin:8px 0;cursor:pointer}.nalert .nalert-container .nalert-data .nalert-body[data-v-a11bdd32] .nalert-bodt_msg a{color:#ff0202;font-size:16px;padding:0 8px}.nalert .nalert-container .nalert-data .nalert-body .nalert-bodt_btns[data-v-a11bdd32]{padding:5px 15px 10px;text-align:right}.nalert .nalert-container .nalert-data .nalert-body .nalert-bodt_btns button[data-v-a11bdd32]{display:inline-block;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #dcdfe6;color:#606266;text-align:center;box-sizing:border-box;outline:none;transition:.1s;font-weight:500;padding:9px 15px;font-size:12px;border-radius:3px;margin:0 0 0 8px}.nalert .nalert-container .nalert-data .nalert-body .nalert-bodt_btns button[data-v-a11bdd32]:hover{opacity:.9}.nalert .nalert-container .nalert-data .nalert-body .nalert-bodt_btns button.next[data-v-a11bdd32]{color:#fff;background-color:#409eff;border-color:#409eff}@keyframes turns-11842e6c{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-11842e6c]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-11842e6c]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-11842e6c]{color:#f9ad1e}.notice_info li[data-v-11842e6c]{font-size:14px;list-style:revert}.text-container[data-v-11842e6c]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-11842e6c]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-11842e6c]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-11842e6c]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-11842e6c]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-11842e6c]{width:100%}.text-container .text-container_item p.info-desc[data-v-11842e6c]{width:100%;color:#999;font-size:14px}.page-container[data-v-11842e6c]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-11842e6c]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-11842e6c]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-11842e6c]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-11842e6c],.page-container .page-flex .page-sidebar a[data-v-11842e6c]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-11842e6c]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-11842e6c]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-11842e6c]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-11842e6c]{border-radius:0;padding:1rem}ul.ul-container[data-v-11842e6c]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-11842e6c]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-11842e6c]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-11842e6c]{width:100%}form.form-container[data-v-11842e6c]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-11842e6c]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-11842e6c]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-11842e6c]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-11842e6c]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-11842e6c],form.form-container .label-value select[data-v-11842e6c]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-11842e6c]:focus,form.form-container .label-value select[data-v-11842e6c]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-11842e6c]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-11842e6c]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-11842e6c],form.form-container .label-value input[type=radio][data-v-11842e6c]{width:auto}form.form-container .label-value input[type=radio][data-v-11842e6c]{margin:0 4px 0 0}form.form-container .label-value input[data-v-11842e6c]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-11842e6c]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-11842e6c]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-11842e6c]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-11842e6c]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-11842e6c]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-11842e6c]:hover{background-color:#747474}form.form-container .label-msg[data-v-11842e6c]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-11842e6c]{color:#f9ad1e}form.form-container .label-flex[data-v-11842e6c]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-11842e6c]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-11842e6c]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-11842e6c]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-11842e6c]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-11842e6c]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-11842e6c]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-11842e6c],form.form-container1 .label-value select[data-v-11842e6c]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-11842e6c]:focus,form.form-container1 .label-value select[data-v-11842e6c]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-11842e6c]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-11842e6c],form.form-container1 .label-value input[type=radio][data-v-11842e6c]{width:auto}form.form-container1 .label-value input[type=radio][data-v-11842e6c]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-11842e6c]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-11842e6c]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-11842e6c]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-11842e6c]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-11842e6c]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-11842e6c]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-11842e6c]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-11842e6c]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-11842e6c]{color:#f9ad1e}form.form-container1 .label-flex[data-v-11842e6c]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-11842e6c]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-11842e6c]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-11842e6c]{width:100px}table.page-table th.checkbox[data-v-11842e6c]{width:50px;text-align:center}table.page-table th.setting[data-v-11842e6c]{width:100px;text-align:center}table.page-table thead[data-v-11842e6c]{color:#909399}table.page-table thead tr[data-v-11842e6c]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-11842e6c]{padding:10px 16px}table.page-table tbody tr[data-v-11842e6c]:hover{background-color:#eeee}table.page-table tbody tr[data-v-11842e6c]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-11842e6c]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-11842e6c]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-11842e6c]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-11842e6c]{width:100px}table.popups-table th.checkbox[data-v-11842e6c]{width:50px;text-align:center}table.popups-table th.setting[data-v-11842e6c]{width:100px;text-align:center}table.popups-table thead[data-v-11842e6c]{color:#eee}table.popups-table thead tr[data-v-11842e6c]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-11842e6c]{padding:10px 16px}table.popups-table tbody tr[data-v-11842e6c]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-11842e6c]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-11842e6c]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-11842e6c]{width:100%}header.header-desktop[data-v-11842e6c]{display:block}header.header-mobile[data-v-11842e6c]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-11842e6c]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-11842e6c]{width:100%;height:100%}header.header-mobile button svg path[data-v-11842e6c]{fill:#fff}nav.sidebar[data-v-11842e6c]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-11842e6c]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-11842e6c]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-11842e6c]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-11842e6c]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-11842e6c]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-11842e6c]{color:#fff}nav.sidebar .container .children[data-v-11842e6c]{padding-left:30px}@-moz-keyframes tada-11842e6c{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-11842e6c{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-11842e6c{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-11842e6c{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-11842e6c]{animation:dialogEnter-11842e6c .3s linear forwards}.dialog-leave-active[data-v-11842e6c]{animation:dialogLeave-11842e6c .3s linear forwards}@keyframes dialogEnter-11842e6c{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-11842e6c{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-11842e6c]{animation:dialogEnter-11842e6c .2s linear forwards}.dialog1-leave-active[data-v-11842e6c]{animation:dialogLeave-11842e6c .2s linear forwards}@keyframes rotateEnter-11842e6c{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-11842e6c]{animation:rotateEnter-11842e6c .7s;position:relative}.rotate-leave-active[data-v-11842e6c]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-11842e6c{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-11842e6c{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-11842e6c]{animation:slideOutTop-11842e6c .5s linear forwards}.slide-top-leave-active[data-v-11842e6c],.slide-bottom-enter-active[data-v-11842e6c]{animation:slideOutBottom-11842e6c .5s linear forwards}@keyframes slideInLeft-11842e6c{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-11842e6c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-11842e6c]{animation:slideInLeft-11842e6c .3s linear forwards}.slide-left-leave-active[data-v-11842e6c]{animation:slideInRight-11842e6c .3s linear forwards}@keyframes slideOutLeft-11842e6c{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-11842e6c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-11842e6c]{animation:slideOutLeft-11842e6c .3s linear forwards}.slide-right-leave-active[data-v-11842e6c]{animation:slideOutRight-11842e6c .3s linear forwards}@keyframes bganimation-11842e6c{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-11842e6c{0%{height:0}to{height:100px}}@keyframes fadeEnd-11842e6c{0%{height:100%}to{height:0}}.fade-enter-active[data-v-11842e6c]{animation:fadeStart-11842e6c .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-11842e6c]{animation:fadeEnd-11842e6c .1s linear forwards;overflow:hidden}.block[data-v-11842e6c]{padding:0 10%;display:flex;flex-wrap:wrap;align-items:center;align-content:center}.block li[data-v-11842e6c]{margin-bottom:.5rem;width:100%;list-style:inherit;color:#333;font-size:16px}.block li .msg-item[data-v-11842e6c]{font-size:14px;display:inline-block;color:#0023ff!important;line-height:20px}.block li.msg-li[data-v-11842e6c]{margin:0}@keyframes turns-0dc4c17e{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-0dc4c17e]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-0dc4c17e]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-0dc4c17e]{color:#f9ad1e}.notice_info li[data-v-0dc4c17e]{font-size:14px;list-style:revert}.text-container[data-v-0dc4c17e]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-0dc4c17e]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-0dc4c17e]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-0dc4c17e]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-0dc4c17e]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-0dc4c17e]{width:100%}.text-container .text-container_item p.info-desc[data-v-0dc4c17e]{width:100%;color:#999;font-size:14px}.page-container[data-v-0dc4c17e]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-0dc4c17e]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-0dc4c17e]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-0dc4c17e]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-0dc4c17e],.page-container .page-flex .page-sidebar a[data-v-0dc4c17e]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-0dc4c17e]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-0dc4c17e]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-0dc4c17e]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-0dc4c17e]{border-radius:0;padding:1rem}ul.ul-container[data-v-0dc4c17e]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-0dc4c17e]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-0dc4c17e]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-0dc4c17e]{width:100%}form.form-container[data-v-0dc4c17e]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-0dc4c17e]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-0dc4c17e]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-0dc4c17e]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-0dc4c17e]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-0dc4c17e],form.form-container .label-value select[data-v-0dc4c17e]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-0dc4c17e]:focus,form.form-container .label-value select[data-v-0dc4c17e]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-0dc4c17e]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-0dc4c17e]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-0dc4c17e],form.form-container .label-value input[type=radio][data-v-0dc4c17e]{width:auto}form.form-container .label-value input[type=radio][data-v-0dc4c17e]{margin:0 4px 0 0}form.form-container .label-value input[data-v-0dc4c17e]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-0dc4c17e]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-0dc4c17e]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-0dc4c17e]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-0dc4c17e]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-0dc4c17e]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-0dc4c17e]:hover{background-color:#747474}form.form-container .label-msg[data-v-0dc4c17e]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-0dc4c17e]{color:#f9ad1e}form.form-container .label-flex[data-v-0dc4c17e]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-0dc4c17e]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-0dc4c17e]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-0dc4c17e]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-0dc4c17e]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-0dc4c17e]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-0dc4c17e]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-0dc4c17e],form.form-container1 .label-value select[data-v-0dc4c17e]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-0dc4c17e]:focus,form.form-container1 .label-value select[data-v-0dc4c17e]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-0dc4c17e]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-0dc4c17e],form.form-container1 .label-value input[type=radio][data-v-0dc4c17e]{width:auto}form.form-container1 .label-value input[type=radio][data-v-0dc4c17e]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-0dc4c17e]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-0dc4c17e]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-0dc4c17e]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-0dc4c17e]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-0dc4c17e]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-0dc4c17e]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-0dc4c17e]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-0dc4c17e]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-0dc4c17e]{color:#f9ad1e}form.form-container1 .label-flex[data-v-0dc4c17e]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-0dc4c17e]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-0dc4c17e]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-0dc4c17e]{width:100px}table.page-table th.checkbox[data-v-0dc4c17e]{width:50px;text-align:center}table.page-table th.setting[data-v-0dc4c17e]{width:100px;text-align:center}table.page-table thead[data-v-0dc4c17e]{color:#909399}table.page-table thead tr[data-v-0dc4c17e]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-0dc4c17e]{padding:10px 16px}table.page-table tbody tr[data-v-0dc4c17e]:hover{background-color:#eeee}table.page-table tbody tr[data-v-0dc4c17e]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-0dc4c17e]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-0dc4c17e]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-0dc4c17e]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-0dc4c17e]{width:100px}table.popups-table th.checkbox[data-v-0dc4c17e]{width:50px;text-align:center}table.popups-table th.setting[data-v-0dc4c17e]{width:100px;text-align:center}table.popups-table thead[data-v-0dc4c17e]{color:#eee}table.popups-table thead tr[data-v-0dc4c17e]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-0dc4c17e]{padding:10px 16px}table.popups-table tbody tr[data-v-0dc4c17e]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-0dc4c17e]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-0dc4c17e]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-0dc4c17e]{width:100%}header.header-desktop[data-v-0dc4c17e]{display:block}header.header-mobile[data-v-0dc4c17e]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-0dc4c17e]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-0dc4c17e]{width:100%;height:100%}header.header-mobile button svg path[data-v-0dc4c17e]{fill:#fff}nav.sidebar[data-v-0dc4c17e]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-0dc4c17e]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-0dc4c17e]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-0dc4c17e]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-0dc4c17e]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-0dc4c17e]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-0dc4c17e]{color:#fff}nav.sidebar .container .children[data-v-0dc4c17e]{padding-left:30px}@-moz-keyframes tada-0dc4c17e{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-0dc4c17e{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-0dc4c17e{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-0dc4c17e{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-0dc4c17e]{animation:dialogEnter-0dc4c17e .3s linear forwards}.dialog-leave-active[data-v-0dc4c17e]{animation:dialogLeave-0dc4c17e .3s linear forwards}@keyframes dialogEnter-0dc4c17e{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-0dc4c17e{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-0dc4c17e]{animation:dialogEnter-0dc4c17e .2s linear forwards}.dialog1-leave-active[data-v-0dc4c17e]{animation:dialogLeave-0dc4c17e .2s linear forwards}@keyframes rotateEnter-0dc4c17e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-0dc4c17e]{animation:rotateEnter-0dc4c17e .7s;position:relative}.rotate-leave-active[data-v-0dc4c17e]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-0dc4c17e{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-0dc4c17e{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-0dc4c17e]{animation:slideOutTop-0dc4c17e .5s linear forwards}.slide-top-leave-active[data-v-0dc4c17e],.slide-bottom-enter-active[data-v-0dc4c17e]{animation:slideOutBottom-0dc4c17e .5s linear forwards}@keyframes slideInLeft-0dc4c17e{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-0dc4c17e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-0dc4c17e]{animation:slideInLeft-0dc4c17e .3s linear forwards}.slide-left-leave-active[data-v-0dc4c17e]{animation:slideInRight-0dc4c17e .3s linear forwards}@keyframes slideOutLeft-0dc4c17e{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-0dc4c17e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-0dc4c17e]{animation:slideOutLeft-0dc4c17e .3s linear forwards}.slide-right-leave-active[data-v-0dc4c17e]{animation:slideOutRight-0dc4c17e .3s linear forwards}@keyframes bganimation-0dc4c17e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-0dc4c17e{0%{height:0}to{height:100px}}@keyframes fadeEnd-0dc4c17e{0%{height:100%}to{height:0}}.fade-enter-active[data-v-0dc4c17e]{animation:fadeStart-0dc4c17e .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-0dc4c17e]{animation:fadeEnd-0dc4c17e .1s linear forwards;overflow:hidden}.block[data-v-0dc4c17e]{min-height:160px;padding:0 10%;display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center}.block p[data-v-0dc4c17e]{margin:.5rem 0;font-size:18px;width:100%;display:block;color:#333;text-align:center}@keyframes turns-c4e63fa4{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-c4e63fa4]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-c4e63fa4]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-c4e63fa4]{color:#f9ad1e}.notice_info li[data-v-c4e63fa4]{font-size:14px;list-style:revert}.text-container[data-v-c4e63fa4]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-c4e63fa4]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-c4e63fa4]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-c4e63fa4]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-c4e63fa4]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-c4e63fa4]{width:100%}.text-container .text-container_item p.info-desc[data-v-c4e63fa4]{width:100%;color:#999;font-size:14px}.page-container[data-v-c4e63fa4]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-c4e63fa4]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-c4e63fa4]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-c4e63fa4]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-c4e63fa4],.page-container .page-flex .page-sidebar a[data-v-c4e63fa4]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-c4e63fa4]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-c4e63fa4]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-c4e63fa4]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-c4e63fa4]{border-radius:0;padding:1rem}ul.ul-container[data-v-c4e63fa4]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-c4e63fa4]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-c4e63fa4]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-c4e63fa4]{width:100%}form.form-container[data-v-c4e63fa4]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-c4e63fa4]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-c4e63fa4]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-c4e63fa4]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-c4e63fa4]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-c4e63fa4],form.form-container .label-value select[data-v-c4e63fa4]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-c4e63fa4]:focus,form.form-container .label-value select[data-v-c4e63fa4]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-c4e63fa4]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-c4e63fa4]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-c4e63fa4],form.form-container .label-value input[type=radio][data-v-c4e63fa4]{width:auto}form.form-container .label-value input[type=radio][data-v-c4e63fa4]{margin:0 4px 0 0}form.form-container .label-value input[data-v-c4e63fa4]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-c4e63fa4]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-c4e63fa4]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-c4e63fa4]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-c4e63fa4]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-c4e63fa4]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-c4e63fa4]:hover{background-color:#747474}form.form-container .label-msg[data-v-c4e63fa4]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-c4e63fa4]{color:#f9ad1e}form.form-container .label-flex[data-v-c4e63fa4]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-c4e63fa4]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-c4e63fa4]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-c4e63fa4]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-c4e63fa4]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-c4e63fa4]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-c4e63fa4]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-c4e63fa4],form.form-container1 .label-value select[data-v-c4e63fa4]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-c4e63fa4]:focus,form.form-container1 .label-value select[data-v-c4e63fa4]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-c4e63fa4]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-c4e63fa4],form.form-container1 .label-value input[type=radio][data-v-c4e63fa4]{width:auto}form.form-container1 .label-value input[type=radio][data-v-c4e63fa4]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-c4e63fa4]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-c4e63fa4]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-c4e63fa4]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-c4e63fa4]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-c4e63fa4]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-c4e63fa4]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-c4e63fa4]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-c4e63fa4]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-c4e63fa4]{color:#f9ad1e}form.form-container1 .label-flex[data-v-c4e63fa4]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-c4e63fa4]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-c4e63fa4]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-c4e63fa4]{width:100px}table.page-table th.checkbox[data-v-c4e63fa4]{width:50px;text-align:center}table.page-table th.setting[data-v-c4e63fa4]{width:100px;text-align:center}table.page-table thead[data-v-c4e63fa4]{color:#909399}table.page-table thead tr[data-v-c4e63fa4]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-c4e63fa4]{padding:10px 16px}table.page-table tbody tr[data-v-c4e63fa4]:hover{background-color:#eeee}table.page-table tbody tr[data-v-c4e63fa4]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-c4e63fa4]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-c4e63fa4]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-c4e63fa4]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-c4e63fa4]{width:100px}table.popups-table th.checkbox[data-v-c4e63fa4]{width:50px;text-align:center}table.popups-table th.setting[data-v-c4e63fa4]{width:100px;text-align:center}table.popups-table thead[data-v-c4e63fa4]{color:#eee}table.popups-table thead tr[data-v-c4e63fa4]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-c4e63fa4]{padding:10px 16px}table.popups-table tbody tr[data-v-c4e63fa4]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-c4e63fa4]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-c4e63fa4]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-c4e63fa4]{width:100%}header.header-desktop[data-v-c4e63fa4]{display:block}header.header-mobile[data-v-c4e63fa4]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-c4e63fa4]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-c4e63fa4]{width:100%;height:100%}header.header-mobile button svg path[data-v-c4e63fa4]{fill:#fff}nav.sidebar[data-v-c4e63fa4]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-c4e63fa4]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-c4e63fa4]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-c4e63fa4]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-c4e63fa4]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-c4e63fa4]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-c4e63fa4]{color:#fff}nav.sidebar .container .children[data-v-c4e63fa4]{padding-left:30px}@-moz-keyframes tada-c4e63fa4{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-c4e63fa4{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-c4e63fa4{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-c4e63fa4{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-c4e63fa4]{animation:dialogEnter-c4e63fa4 .3s linear forwards}.dialog-leave-active[data-v-c4e63fa4]{animation:dialogLeave-c4e63fa4 .3s linear forwards}@keyframes dialogEnter-c4e63fa4{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-c4e63fa4{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-c4e63fa4]{animation:dialogEnter-c4e63fa4 .2s linear forwards}.dialog1-leave-active[data-v-c4e63fa4]{animation:dialogLeave-c4e63fa4 .2s linear forwards}@keyframes rotateEnter-c4e63fa4{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-c4e63fa4]{animation:rotateEnter-c4e63fa4 .7s;position:relative}.rotate-leave-active[data-v-c4e63fa4]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-c4e63fa4{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-c4e63fa4{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-c4e63fa4]{animation:slideOutTop-c4e63fa4 .5s linear forwards}.slide-top-leave-active[data-v-c4e63fa4],.slide-bottom-enter-active[data-v-c4e63fa4]{animation:slideOutBottom-c4e63fa4 .5s linear forwards}@keyframes slideInLeft-c4e63fa4{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-c4e63fa4{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-c4e63fa4]{animation:slideInLeft-c4e63fa4 .3s linear forwards}.slide-left-leave-active[data-v-c4e63fa4]{animation:slideInRight-c4e63fa4 .3s linear forwards}@keyframes slideOutLeft-c4e63fa4{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-c4e63fa4{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-c4e63fa4]{animation:slideOutLeft-c4e63fa4 .3s linear forwards}.slide-right-leave-active[data-v-c4e63fa4]{animation:slideOutRight-c4e63fa4 .3s linear forwards}@keyframes bganimation-c4e63fa4{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-c4e63fa4{0%{height:0}to{height:100px}}@keyframes fadeEnd-c4e63fa4{0%{height:100%}to{height:0}}.fade-enter-active[data-v-c4e63fa4]{animation:fadeStart-c4e63fa4 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-c4e63fa4]{animation:fadeEnd-c4e63fa4 .1s linear forwards;overflow:hidden}.nas-dialog[data-v-c4e63fa4] .app-dialog_container{overflow:hidden!important}.nas-dialog[data-v-c4e63fa4] .app-dialog_container .app-dialog_body{padding:0!important;overflow:hidden!important}.nas-tools[data-v-c4e63fa4]{width:100%;display:flex;flex-wrap:nowrap;position:relative;transition:.3s;min-height:300px}.nas-tools .nas-tools_item[data-v-c4e63fa4]{display:block;width:100%;flex:0 0 100%}.nas-tools[data-v-c4e63fa4] .tools-container{display:block;width:100%;flex:0 0 100%;padding:0 2rem}.nas-tools[data-v-c4e63fa4] .tools-container .msg{width:100%;font-size:14px;margin:.3rem 0;color:#999}.nas-tools[data-v-c4e63fa4] .tools-container .form-item{width:100%;margin-bottom:1rem;border-bottom:1px solid rgba(238,238,238,.5019607843)}.nas-tools[data-v-c4e63fa4] .tools-container .form-item p{font-size:1em;color:#333;width:100%;height:26px;display:block}.nas-tools[data-v-c4e63fa4] .tools-container .form-item label{display:flex;flex-wrap:wrap;margin:.5rem 0;align-items:center;font-size:14px;cursor:pointer}.nas-tools[data-v-c4e63fa4] .tools-container .form-item input{margin:0}.nas-tools[data-v-c4e63fa4] .tools-container .btns{margin:1rem 0;display:flex;justify-content:center}.nas-tools[data-v-c4e63fa4] .tools-container .btns button{width:300px;margin:1rem;height:32px;font-size:14px;border-radius:4px}.nas-tools[data-v-c4e63fa4] .tools-container .btns button:hover{opacity:.8}.nas-tools[data-v-c4e63fa4] .tools-container .btns button.next{background-color:#70b5ff;color:#fff}.nas-tools[data-v-c4e63fa4] .tools-container .label-name,.nas-tools[data-v-c4e63fa4] .tools-container .label-value{display:block;width:100%;margin-bottom:1rem}.nas-tools[data-v-c4e63fa4] .tools-container .label-value select,.nas-tools[data-v-c4e63fa4] .tools-container .label-value input{display:block;width:100%;height:36px;background:none;border:1px solid #adadad;color:#1e1e1e;font-size:14px;border-radius:3px;padding:0 10px}.nas-tools[data-v-c4e63fa4] .tools-container .label-value2{display:block;width:100%;margin-bottom:1rem}@keyframes turns-529c6a5d{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-529c6a5d]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-529c6a5d]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-529c6a5d]{color:#f9ad1e}.notice_info li[data-v-529c6a5d]{font-size:14px;list-style:revert}.text-container[data-v-529c6a5d]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-529c6a5d]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-529c6a5d]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-529c6a5d]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-529c6a5d]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-529c6a5d]{width:100%}.text-container .text-container_item p.info-desc[data-v-529c6a5d]{width:100%;color:#999;font-size:14px}.page-container[data-v-529c6a5d]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-529c6a5d]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-529c6a5d]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-529c6a5d]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-529c6a5d],.page-container .page-flex .page-sidebar a[data-v-529c6a5d]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-529c6a5d]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-529c6a5d]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-529c6a5d]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-529c6a5d]{border-radius:0;padding:1rem}ul.ul-container[data-v-529c6a5d]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-529c6a5d]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-529c6a5d]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-529c6a5d]{width:100%}form.form-container[data-v-529c6a5d]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-529c6a5d]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-529c6a5d]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-529c6a5d]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-529c6a5d]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-529c6a5d],form.form-container .label-value select[data-v-529c6a5d]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-529c6a5d]:focus,form.form-container .label-value select[data-v-529c6a5d]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-529c6a5d]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-529c6a5d]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-529c6a5d],form.form-container .label-value input[type=radio][data-v-529c6a5d]{width:auto}form.form-container .label-value input[type=radio][data-v-529c6a5d]{margin:0 4px 0 0}form.form-container .label-value input[data-v-529c6a5d]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-529c6a5d]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-529c6a5d]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-529c6a5d]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-529c6a5d]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-529c6a5d]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-529c6a5d]:hover{background-color:#747474}form.form-container .label-msg[data-v-529c6a5d]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-529c6a5d]{color:#f9ad1e}form.form-container .label-flex[data-v-529c6a5d]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-529c6a5d]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-529c6a5d]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-529c6a5d]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-529c6a5d]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-529c6a5d]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-529c6a5d]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-529c6a5d],form.form-container1 .label-value select[data-v-529c6a5d]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-529c6a5d]:focus,form.form-container1 .label-value select[data-v-529c6a5d]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-529c6a5d]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-529c6a5d],form.form-container1 .label-value input[type=radio][data-v-529c6a5d]{width:auto}form.form-container1 .label-value input[type=radio][data-v-529c6a5d]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-529c6a5d]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-529c6a5d]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-529c6a5d]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-529c6a5d]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-529c6a5d]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-529c6a5d]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-529c6a5d]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-529c6a5d]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-529c6a5d]{color:#f9ad1e}form.form-container1 .label-flex[data-v-529c6a5d]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-529c6a5d]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-529c6a5d]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-529c6a5d]{width:100px}table.page-table th.checkbox[data-v-529c6a5d]{width:50px;text-align:center}table.page-table th.setting[data-v-529c6a5d]{width:100px;text-align:center}table.page-table thead[data-v-529c6a5d]{color:#909399}table.page-table thead tr[data-v-529c6a5d]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-529c6a5d]{padding:10px 16px}table.page-table tbody tr[data-v-529c6a5d]:hover{background-color:#eeee}table.page-table tbody tr[data-v-529c6a5d]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-529c6a5d]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-529c6a5d]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-529c6a5d]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-529c6a5d]{width:100px}table.popups-table th.checkbox[data-v-529c6a5d]{width:50px;text-align:center}table.popups-table th.setting[data-v-529c6a5d]{width:100px;text-align:center}table.popups-table thead[data-v-529c6a5d]{color:#eee}table.popups-table thead tr[data-v-529c6a5d]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-529c6a5d]{padding:10px 16px}table.popups-table tbody tr[data-v-529c6a5d]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-529c6a5d]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-529c6a5d]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-529c6a5d]{width:100%}header.header-desktop[data-v-529c6a5d]{display:block}header.header-mobile[data-v-529c6a5d]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-529c6a5d]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-529c6a5d]{width:100%;height:100%}header.header-mobile button svg path[data-v-529c6a5d]{fill:#fff}nav.sidebar[data-v-529c6a5d]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-529c6a5d]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-529c6a5d]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-529c6a5d]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-529c6a5d]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-529c6a5d]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-529c6a5d]{color:#fff}nav.sidebar .container .children[data-v-529c6a5d]{padding-left:30px}@-moz-keyframes tada-529c6a5d{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-529c6a5d{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-529c6a5d{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-529c6a5d{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-529c6a5d]{animation:dialogEnter-529c6a5d .3s linear forwards}.dialog-leave-active[data-v-529c6a5d]{animation:dialogLeave-529c6a5d .3s linear forwards}@keyframes dialogEnter-529c6a5d{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-529c6a5d{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-529c6a5d]{animation:dialogEnter-529c6a5d .2s linear forwards}.dialog1-leave-active[data-v-529c6a5d]{animation:dialogLeave-529c6a5d .2s linear forwards}@keyframes rotateEnter-529c6a5d{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-529c6a5d]{animation:rotateEnter-529c6a5d .7s;position:relative}.rotate-leave-active[data-v-529c6a5d]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-529c6a5d{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-529c6a5d{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-529c6a5d]{animation:slideOutTop-529c6a5d .5s linear forwards}.slide-top-leave-active[data-v-529c6a5d],.slide-bottom-enter-active[data-v-529c6a5d]{animation:slideOutBottom-529c6a5d .5s linear forwards}@keyframes slideInLeft-529c6a5d{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-529c6a5d{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-529c6a5d]{animation:slideInLeft-529c6a5d .3s linear forwards}.slide-left-leave-active[data-v-529c6a5d]{animation:slideInRight-529c6a5d .3s linear forwards}@keyframes slideOutLeft-529c6a5d{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-529c6a5d{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-529c6a5d]{animation:slideOutLeft-529c6a5d .3s linear forwards}.slide-right-leave-active[data-v-529c6a5d]{animation:slideOutRight-529c6a5d .3s linear forwards}@keyframes bganimation-529c6a5d{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-529c6a5d{0%{height:0}to{height:100px}}@keyframes fadeEnd-529c6a5d{0%{height:100%}to{height:0}}.fade-enter-active[data-v-529c6a5d]{animation:fadeStart-529c6a5d .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-529c6a5d]{animation:fadeEnd-529c6a5d .1s linear forwards;overflow:hidden}.app-item[data-v-529c6a5d]{padding:.75rem}.app-item .app-card[data-v-529c6a5d]{display:flex}.app-item .app-card .app-item_icon[data-v-529c6a5d]{width:72px;height:72px;background-color:#f3f5f8;padding:.5rem;border-radius:1rem;flex:0 0 100%;max-width:72px}.app-item .app-card .app-item_icon img[data-v-529c6a5d]{width:100%}.app-item .app-card .app-item_info[data-v-529c6a5d]{flex:1;padding-left:1rem}.app-item .app-card .app-item_info .app-title[data-v-529c6a5d]{overflow:hidden;color:#363636;font-size:1em;line-height:1.125;font-weight:600}.app-item .app-card .app-item_info .app-title em[data-v-529c6a5d]{font-size:.8125rem}.app-item .app-card .app-item_info .app-desc[data-v-529c6a5d]{word-break:break-all;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden;font-size:.75em;color:#4a4a4a;font-weight:400;line-height:1.5}.app-item .app-btn[data-v-529c6a5d]{margin-top:5px;display:flex;justify-content:flex-end}.app-item .app-btn button[data-v-529c6a5d]{background-color:#ecf3fe;color:#0b5cd5;font-size:.75rem;padding-bottom:calc(.1875rem - 1px);padding-top:calc(.1875rem - 1px);border-radius:1rem;padding-left:1.25em;padding-right:1.25em;margin-left:.5rem}.app-item .app-btn button[data-v-529c6a5d]:hover{opacity:.8}.app-item .app-as[data-v-529c6a5d]{width:100%;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;margin:.1rem 0}.app-item .app-as span[data-v-529c6a5d]{font-size:.75em;color:#4a4a4a;font-weight:400}.app-item .app-as .star-btn[data-v-529c6a5d]{padding:0;margin:0 0 0 10px;width:30px;border:none!important;cursor:pointer;background:none;box-shadow:none}.app-item .app-as .star-btn[data-v-529c6a5d] svg path{fill:currentColor}.app-item .app-as .star-btn[data-v-529c6a5d]:hover svg path{filter:invert(.6)}.app-item .app-author[data-v-529c6a5d],.app-item .app-date[data-v-529c6a5d]{width:100%;height:20px;line-height:20px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;font-size:.75em;color:#4a4a4a;font-weight:400}@keyframes turns-19021bf0{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-19021bf0]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-19021bf0]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-19021bf0]{color:#f9ad1e}.notice_info li[data-v-19021bf0]{font-size:14px;list-style:revert}.text-container[data-v-19021bf0]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-19021bf0]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-19021bf0]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-19021bf0]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-19021bf0]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-19021bf0]{width:100%}.text-container .text-container_item p.info-desc[data-v-19021bf0]{width:100%;color:#999;font-size:14px}.page-container[data-v-19021bf0]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-19021bf0]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-19021bf0]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-19021bf0]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-19021bf0],.page-container .page-flex .page-sidebar a[data-v-19021bf0]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-19021bf0]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-19021bf0]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-19021bf0]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-19021bf0]{border-radius:0;padding:1rem}ul.ul-container[data-v-19021bf0]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-19021bf0]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-19021bf0]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-19021bf0]{width:100%}form.form-container[data-v-19021bf0]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-19021bf0]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-19021bf0]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-19021bf0]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-19021bf0]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-19021bf0],form.form-container .label-value select[data-v-19021bf0]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-19021bf0]:focus,form.form-container .label-value select[data-v-19021bf0]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-19021bf0]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-19021bf0]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-19021bf0],form.form-container .label-value input[type=radio][data-v-19021bf0]{width:auto}form.form-container .label-value input[type=radio][data-v-19021bf0]{margin:0 4px 0 0}form.form-container .label-value input[data-v-19021bf0]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-19021bf0]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-19021bf0]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-19021bf0]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-19021bf0]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-19021bf0]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-19021bf0]:hover{background-color:#747474}form.form-container .label-msg[data-v-19021bf0]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-19021bf0]{color:#f9ad1e}form.form-container .label-flex[data-v-19021bf0]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-19021bf0]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-19021bf0]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-19021bf0]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-19021bf0]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-19021bf0]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-19021bf0]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-19021bf0],form.form-container1 .label-value select[data-v-19021bf0]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-19021bf0]:focus,form.form-container1 .label-value select[data-v-19021bf0]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-19021bf0]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-19021bf0],form.form-container1 .label-value input[type=radio][data-v-19021bf0]{width:auto}form.form-container1 .label-value input[type=radio][data-v-19021bf0]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-19021bf0]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-19021bf0]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-19021bf0]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-19021bf0]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-19021bf0]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-19021bf0]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-19021bf0]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-19021bf0]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-19021bf0]{color:#f9ad1e}form.form-container1 .label-flex[data-v-19021bf0]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-19021bf0]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-19021bf0]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-19021bf0]{width:100px}table.page-table th.checkbox[data-v-19021bf0]{width:50px;text-align:center}table.page-table th.setting[data-v-19021bf0]{width:100px;text-align:center}table.page-table thead[data-v-19021bf0]{color:#909399}table.page-table thead tr[data-v-19021bf0]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-19021bf0]{padding:10px 16px}table.page-table tbody tr[data-v-19021bf0]:hover{background-color:#eeee}table.page-table tbody tr[data-v-19021bf0]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-19021bf0]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-19021bf0]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-19021bf0]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-19021bf0]{width:100px}table.popups-table th.checkbox[data-v-19021bf0]{width:50px;text-align:center}table.popups-table th.setting[data-v-19021bf0]{width:100px;text-align:center}table.popups-table thead[data-v-19021bf0]{color:#eee}table.popups-table thead tr[data-v-19021bf0]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-19021bf0]{padding:10px 16px}table.popups-table tbody tr[data-v-19021bf0]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-19021bf0]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-19021bf0]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-19021bf0]{width:100%}header.header-desktop[data-v-19021bf0]{display:block}header.header-mobile[data-v-19021bf0]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-19021bf0]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-19021bf0]{width:100%;height:100%}header.header-mobile button svg path[data-v-19021bf0]{fill:#fff}nav.sidebar[data-v-19021bf0]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-19021bf0]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-19021bf0]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-19021bf0]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-19021bf0]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-19021bf0]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-19021bf0]{color:#fff}nav.sidebar .container .children[data-v-19021bf0]{padding-left:30px}@-moz-keyframes tada-19021bf0{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-19021bf0{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-19021bf0{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-19021bf0{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-19021bf0]{animation:dialogEnter-19021bf0 .3s linear forwards}.dialog-leave-active[data-v-19021bf0]{animation:dialogLeave-19021bf0 .3s linear forwards}@keyframes dialogEnter-19021bf0{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-19021bf0{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-19021bf0]{animation:dialogEnter-19021bf0 .2s linear forwards}.dialog1-leave-active[data-v-19021bf0]{animation:dialogLeave-19021bf0 .2s linear forwards}@keyframes rotateEnter-19021bf0{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-19021bf0]{animation:rotateEnter-19021bf0 .7s;position:relative}.rotate-leave-active[data-v-19021bf0]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-19021bf0{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-19021bf0{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-19021bf0]{animation:slideOutTop-19021bf0 .5s linear forwards}.slide-top-leave-active[data-v-19021bf0],.slide-bottom-enter-active[data-v-19021bf0]{animation:slideOutBottom-19021bf0 .5s linear forwards}@keyframes slideInLeft-19021bf0{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-19021bf0{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-19021bf0]{animation:slideInLeft-19021bf0 .3s linear forwards}.slide-left-leave-active[data-v-19021bf0]{animation:slideInRight-19021bf0 .3s linear forwards}@keyframes slideOutLeft-19021bf0{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-19021bf0{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-19021bf0]{animation:slideOutLeft-19021bf0 .3s linear forwards}.slide-right-leave-active[data-v-19021bf0]{animation:slideOutRight-19021bf0 .3s linear forwards}@keyframes bganimation-19021bf0{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-19021bf0{0%{height:0}to{height:100px}}@keyframes fadeEnd-19021bf0{0%{height:100%}to{height:0}}.fade-enter-active[data-v-19021bf0]{animation:fadeStart-19021bf0 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-19021bf0]{animation:fadeEnd-19021bf0 .1s linear forwards;overflow:hidden}section[data-v-19021bf0]{margin-top:8px}section .section-list[data-v-19021bf0]{width:100%;display:grid;grid-gap:15px 15px;grid-template-columns:repeat(auto-fill,minmax(320px,1fr))}.tab[data-v-19021bf0]{margin-bottom:16px;font-size:15px;color:#0009;font-weight:500}.tab span[data-v-19021bf0]{margin-right:18px;cursor:pointer}.tab span.active[data-v-19021bf0]{color:#06f}.search[data-v-19021bf0]{width:100%;padding:8px 32px;border-radius:32px;border:1px solid rgba(0,0,0,.11);background:rgba(255,255,255,.05);backdrop-filter:blur(12px);margin-bottom:16px;cursor:text}.filter[data-v-19021bf0]{display:flex;font-size:13px;line-height:13px}.filter>span[data-v-19021bf0]{width:112px;color:#000c}.filter>span>span.default[data-v-19021bf0]{width:60px}.filter>div[data-v-19021bf0]{flex:1}.filter span.active[data-v-19021bf0]{background:rgba(255,164,27,.08);border:1px solid #ffa41b!important;color:#ffa41b}.filter span.tag[data-v-19021bf0]{line-height:25px;text-align:center;display:inline-block;width:100px;height:28px;border-radius:4px;border:1px solid rgba(0,0,0,.08);background:#fafafa;margin:0 4px 8px;cursor:pointer}@keyframes turns-7d47f8ad{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-7d47f8ad]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-7d47f8ad]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-7d47f8ad]{color:#f9ad1e}.notice_info li[data-v-7d47f8ad]{font-size:14px;list-style:revert}.text-container[data-v-7d47f8ad]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-7d47f8ad]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-7d47f8ad]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-7d47f8ad]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-7d47f8ad]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-7d47f8ad]{width:100%}.text-container .text-container_item p.info-desc[data-v-7d47f8ad]{width:100%;color:#999;font-size:14px}.page-container[data-v-7d47f8ad]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-7d47f8ad]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-7d47f8ad]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-7d47f8ad]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-7d47f8ad],.page-container .page-flex .page-sidebar a[data-v-7d47f8ad]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-7d47f8ad]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-7d47f8ad]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-7d47f8ad]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-7d47f8ad]{border-radius:0;padding:1rem}ul.ul-container[data-v-7d47f8ad]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-7d47f8ad]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-7d47f8ad]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-7d47f8ad]{width:100%}form.form-container[data-v-7d47f8ad]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-7d47f8ad]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-7d47f8ad]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-7d47f8ad]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-7d47f8ad]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-7d47f8ad],form.form-container .label-value select[data-v-7d47f8ad]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-7d47f8ad]:focus,form.form-container .label-value select[data-v-7d47f8ad]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-7d47f8ad]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-7d47f8ad]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-7d47f8ad],form.form-container .label-value input[type=radio][data-v-7d47f8ad]{width:auto}form.form-container .label-value input[type=radio][data-v-7d47f8ad]{margin:0 4px 0 0}form.form-container .label-value input[data-v-7d47f8ad]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-7d47f8ad]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-7d47f8ad]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-7d47f8ad]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-7d47f8ad]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-7d47f8ad]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-7d47f8ad]:hover{background-color:#747474}form.form-container .label-msg[data-v-7d47f8ad]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-7d47f8ad]{color:#f9ad1e}form.form-container .label-flex[data-v-7d47f8ad]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-7d47f8ad]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-7d47f8ad]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-7d47f8ad]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-7d47f8ad]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-7d47f8ad]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-7d47f8ad]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-7d47f8ad],form.form-container1 .label-value select[data-v-7d47f8ad]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-7d47f8ad]:focus,form.form-container1 .label-value select[data-v-7d47f8ad]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-7d47f8ad]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-7d47f8ad],form.form-container1 .label-value input[type=radio][data-v-7d47f8ad]{width:auto}form.form-container1 .label-value input[type=radio][data-v-7d47f8ad]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-7d47f8ad]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-7d47f8ad]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-7d47f8ad]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-7d47f8ad]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-7d47f8ad]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-7d47f8ad]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-7d47f8ad]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-7d47f8ad]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-7d47f8ad]{color:#f9ad1e}form.form-container1 .label-flex[data-v-7d47f8ad]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-7d47f8ad]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-7d47f8ad]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-7d47f8ad]{width:100px}table.page-table th.checkbox[data-v-7d47f8ad]{width:50px;text-align:center}table.page-table th.setting[data-v-7d47f8ad]{width:100px;text-align:center}table.page-table thead[data-v-7d47f8ad]{color:#909399}table.page-table thead tr[data-v-7d47f8ad]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-7d47f8ad]{padding:10px 16px}table.page-table tbody tr[data-v-7d47f8ad]:hover{background-color:#eeee}table.page-table tbody tr[data-v-7d47f8ad]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-7d47f8ad]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-7d47f8ad]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-7d47f8ad]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-7d47f8ad]{width:100px}table.popups-table th.checkbox[data-v-7d47f8ad]{width:50px;text-align:center}table.popups-table th.setting[data-v-7d47f8ad]{width:100px;text-align:center}table.popups-table thead[data-v-7d47f8ad]{color:#eee}table.popups-table thead tr[data-v-7d47f8ad]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-7d47f8ad]{padding:10px 16px}table.popups-table tbody tr[data-v-7d47f8ad]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-7d47f8ad]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-7d47f8ad]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-7d47f8ad]{width:100%}header.header-desktop[data-v-7d47f8ad]{display:block}header.header-mobile[data-v-7d47f8ad]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-7d47f8ad]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-7d47f8ad]{width:100%;height:100%}header.header-mobile button svg path[data-v-7d47f8ad]{fill:#fff}nav.sidebar[data-v-7d47f8ad]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-7d47f8ad]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-7d47f8ad]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-7d47f8ad]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-7d47f8ad]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-7d47f8ad]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-7d47f8ad]{color:#fff}nav.sidebar .container .children[data-v-7d47f8ad]{padding-left:30px}@-moz-keyframes tada-7d47f8ad{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-7d47f8ad{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-7d47f8ad{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-7d47f8ad{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-7d47f8ad]{animation:dialogEnter-7d47f8ad .3s linear forwards}.dialog-leave-active[data-v-7d47f8ad]{animation:dialogLeave-7d47f8ad .3s linear forwards}@keyframes dialogEnter-7d47f8ad{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-7d47f8ad{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-7d47f8ad]{animation:dialogEnter-7d47f8ad .2s linear forwards}.dialog1-leave-active[data-v-7d47f8ad]{animation:dialogLeave-7d47f8ad .2s linear forwards}@keyframes rotateEnter-7d47f8ad{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-7d47f8ad]{animation:rotateEnter-7d47f8ad .7s;position:relative}.rotate-leave-active[data-v-7d47f8ad]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-7d47f8ad{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-7d47f8ad{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-7d47f8ad]{animation:slideOutTop-7d47f8ad .5s linear forwards}.slide-top-leave-active[data-v-7d47f8ad],.slide-bottom-enter-active[data-v-7d47f8ad]{animation:slideOutBottom-7d47f8ad .5s linear forwards}@keyframes slideInLeft-7d47f8ad{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-7d47f8ad{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-7d47f8ad]{animation:slideInLeft-7d47f8ad .3s linear forwards}.slide-left-leave-active[data-v-7d47f8ad]{animation:slideInRight-7d47f8ad .3s linear forwards}@keyframes slideOutLeft-7d47f8ad{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-7d47f8ad{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-7d47f8ad]{animation:slideOutLeft-7d47f8ad .3s linear forwards}.slide-right-leave-active[data-v-7d47f8ad]{animation:slideOutRight-7d47f8ad .3s linear forwards}@keyframes bganimation-7d47f8ad{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-7d47f8ad{0%{height:0}to{height:100px}}@keyframes fadeEnd-7d47f8ad{0%{height:100%}to{height:0}}.fade-enter-active[data-v-7d47f8ad]{animation:fadeStart-7d47f8ad .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-7d47f8ad]{animation:fadeEnd-7d47f8ad .1s linear forwards;overflow:hidden}label.disk-item[data-v-7d47f8ad]{display:flex;flex-wrap:wrap;align-items:center;width:100%;margin:.5rem 0;font-size:14px;cursor:pointer}label.disk-item input[data-v-7d47f8ad]{margin:0;margin-right:.5rem}label.disk-item em[data-v-7d47f8ad]{font-size:12px;background-color:#2276f3;padding:2px 5px;color:#fff;border-radius:3px;margin-right:.5rem;font-style:none}label.disk-item .disk_main[data-v-7d47f8ad]{background-color:#f32222}@keyframes turns-1b963653{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-1b963653]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-1b963653]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-1b963653]{color:#f9ad1e}.notice_info li[data-v-1b963653]{font-size:14px;list-style:revert}.text-container[data-v-1b963653]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-1b963653]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-1b963653]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-1b963653]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-1b963653]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-1b963653]{width:100%}.text-container .text-container_item p.info-desc[data-v-1b963653]{width:100%;color:#999;font-size:14px}.page-container[data-v-1b963653]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-1b963653]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-1b963653]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-1b963653]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-1b963653],.page-container .page-flex .page-sidebar a[data-v-1b963653]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-1b963653]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-1b963653]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-1b963653]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-1b963653]{border-radius:0;padding:1rem}ul.ul-container[data-v-1b963653]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-1b963653]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-1b963653]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-1b963653]{width:100%}form.form-container[data-v-1b963653]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-1b963653]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-1b963653]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-1b963653]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-1b963653]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-1b963653],form.form-container .label-value select[data-v-1b963653]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-1b963653]:focus,form.form-container .label-value select[data-v-1b963653]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-1b963653]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-1b963653]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-1b963653],form.form-container .label-value input[type=radio][data-v-1b963653]{width:auto}form.form-container .label-value input[type=radio][data-v-1b963653]{margin:0 4px 0 0}form.form-container .label-value input[data-v-1b963653]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-1b963653]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-1b963653]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-1b963653]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-1b963653]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-1b963653]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-1b963653]:hover{background-color:#747474}form.form-container .label-msg[data-v-1b963653]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-1b963653]{color:#f9ad1e}form.form-container .label-flex[data-v-1b963653]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-1b963653]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-1b963653]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-1b963653]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-1b963653]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-1b963653]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-1b963653]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-1b963653],form.form-container1 .label-value select[data-v-1b963653]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-1b963653]:focus,form.form-container1 .label-value select[data-v-1b963653]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-1b963653]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-1b963653],form.form-container1 .label-value input[type=radio][data-v-1b963653]{width:auto}form.form-container1 .label-value input[type=radio][data-v-1b963653]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-1b963653]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-1b963653]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-1b963653]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-1b963653]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-1b963653]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-1b963653]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-1b963653]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-1b963653]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-1b963653]{color:#f9ad1e}form.form-container1 .label-flex[data-v-1b963653]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-1b963653]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-1b963653]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-1b963653]{width:100px}table.page-table th.checkbox[data-v-1b963653]{width:50px;text-align:center}table.page-table th.setting[data-v-1b963653]{width:100px;text-align:center}table.page-table thead[data-v-1b963653]{color:#909399}table.page-table thead tr[data-v-1b963653]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-1b963653]{padding:10px 16px}table.page-table tbody tr[data-v-1b963653]:hover{background-color:#eeee}table.page-table tbody tr[data-v-1b963653]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-1b963653]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-1b963653]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-1b963653]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-1b963653]{width:100px}table.popups-table th.checkbox[data-v-1b963653]{width:50px;text-align:center}table.popups-table th.setting[data-v-1b963653]{width:100px;text-align:center}table.popups-table thead[data-v-1b963653]{color:#eee}table.popups-table thead tr[data-v-1b963653]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-1b963653]{padding:10px 16px}table.popups-table tbody tr[data-v-1b963653]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-1b963653]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-1b963653]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-1b963653]{width:100%}header.header-desktop[data-v-1b963653]{display:block}header.header-mobile[data-v-1b963653]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-1b963653]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-1b963653]{width:100%;height:100%}header.header-mobile button svg path[data-v-1b963653]{fill:#fff}nav.sidebar[data-v-1b963653]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-1b963653]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-1b963653]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-1b963653]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-1b963653]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-1b963653]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-1b963653]{color:#fff}nav.sidebar .container .children[data-v-1b963653]{padding-left:30px}@-moz-keyframes tada-1b963653{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-1b963653{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-1b963653{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-1b963653{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-1b963653]{animation:dialogEnter-1b963653 .3s linear forwards}.dialog-leave-active[data-v-1b963653]{animation:dialogLeave-1b963653 .3s linear forwards}@keyframes dialogEnter-1b963653{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-1b963653{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-1b963653]{animation:dialogEnter-1b963653 .2s linear forwards}.dialog1-leave-active[data-v-1b963653]{animation:dialogLeave-1b963653 .2s linear forwards}@keyframes rotateEnter-1b963653{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-1b963653]{animation:rotateEnter-1b963653 .7s;position:relative}.rotate-leave-active[data-v-1b963653]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-1b963653{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-1b963653{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-1b963653]{animation:slideOutTop-1b963653 .5s linear forwards}.slide-top-leave-active[data-v-1b963653],.slide-bottom-enter-active[data-v-1b963653]{animation:slideOutBottom-1b963653 .5s linear forwards}@keyframes slideInLeft-1b963653{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-1b963653{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-1b963653]{animation:slideInLeft-1b963653 .3s linear forwards}.slide-left-leave-active[data-v-1b963653]{animation:slideInRight-1b963653 .3s linear forwards}@keyframes slideOutLeft-1b963653{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-1b963653{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-1b963653]{animation:slideOutLeft-1b963653 .3s linear forwards}.slide-right-leave-active[data-v-1b963653]{animation:slideOutRight-1b963653 .3s linear forwards}@keyframes bganimation-1b963653{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-1b963653{0%{height:0}to{height:100px}}@keyframes fadeEnd-1b963653{0%{height:100%}to{height:0}}.fade-enter-active[data-v-1b963653]{animation:fadeStart-1b963653 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-1b963653]{animation:fadeEnd-1b963653 .1s linear forwards;overflow:hidden}ul.tabls[data-v-1b963653]{display:flex;flex-wrap:wrap;align-items:center}ul.tabls button[data-v-1b963653]{padding:0;margin:0;background:none;color:#898989;font-size:1.2rem;margin-right:1rem;cursor:pointer}ul.tabls button[data-v-1b963653]:hover{color:#2276f3}ul.tabls button.on[data-v-1b963653]{font-size:1.3rem;font-weight:700;color:#2276f3;border-bottom:2px solid rgb(32,117,243)!important}[data-v-1b963653] section.tab-content{margin:2rem 0}[data-v-1b963653] section.tab-content section.tab-content{margin:1rem 0}[data-v-1b963653] section.tab-content .item-label{display:flex;flex-wrap:wrap;align-items:flex-start;align-content:flex-start;width:100%;margin:1rem 0}[data-v-1b963653] section.tab-content .item-label .item-label_key{flex:0 0 100%;max-width:100px;text-align:left}[data-v-1b963653] section.tab-content .item-label .item-label_value{flex:1;text-align:left}[data-v-1b963653] section.tab-content .item-label .item-label_key span,[data-v-1b963653] section.tab-content .item-label .item-label_value span{font-size:1em;color:#373737}[data-v-1b963653] section.tab-content table{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#373737}[data-v-1b963653] section.tab-content table th.uid{width:100px}[data-v-1b963653] section.tab-content table th.checkbox{width:50px;text-align:center}[data-v-1b963653] section.tab-content table th.setting{width:100px;text-align:center}[data-v-1b963653] section.tab-content table thead{color:#373737}[data-v-1b963653] section.tab-content table thead tr{width:100%;height:28px;line-height:28px;color:#373737;font-size:14px}[data-v-1b963653] section.tab-content table thead tr th{padding:16px 10px}[data-v-1b963653] section.tab-content table tbody tr{cursor:pointer;width:100%;color:#373737}[data-v-1b963653] section.tab-content table tbody tr th{font-size:14px;padding:16px 10px;vertical-align:top}[data-v-1b963653] section.tab-content table tbody tr th a{color:#ff7373}[data-v-1b963653] section.tab-content .label-name{display:block;width:100%;margin-bottom:.5rem}[data-v-1b963653] section.tab-content .label-value{display:block;width:100%;margin-bottom:1rem}[data-v-1b963653] section.tab-content .label-value select,[data-v-1b963653] section.tab-content .label-value input{display:block;width:100%;height:36px;background:none;border:1px solid #adadad;color:#1e1e1e;font-size:14px;border-radius:3px;padding:0 10px}[data-v-1b963653] section.tab-content .label-value2{display:block;width:100%;margin-bottom:1rem}[data-v-1b963653] section.tab-content .label-btns{display:flex;justify-content:flex-end}[data-v-1b963653] section.tab-content .label-btns button{width:100px;height:28px;border-radius:3px;font-size:14px}[data-v-1b963653] section.tab-content .label-btns button:hover{opacity:.9}[data-v-1b963653] section.tab-content .label-btns button.mount{background-color:#70b5ff;color:#fff}@keyframes turns-5f4eb506{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-5f4eb506]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-5f4eb506]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-5f4eb506]{color:#f9ad1e}.notice_info li[data-v-5f4eb506]{font-size:14px;list-style:revert}.text-container[data-v-5f4eb506]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-5f4eb506]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-5f4eb506]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-5f4eb506]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-5f4eb506]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-5f4eb506]{width:100%}.text-container .text-container_item p.info-desc[data-v-5f4eb506]{width:100%;color:#999;font-size:14px}.page-container[data-v-5f4eb506]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-5f4eb506]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-5f4eb506]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-5f4eb506]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-5f4eb506],.page-container .page-flex .page-sidebar a[data-v-5f4eb506]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5f4eb506]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5f4eb506]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-5f4eb506]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-5f4eb506]{border-radius:0;padding:1rem}ul.ul-container[data-v-5f4eb506]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-5f4eb506]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-5f4eb506]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-5f4eb506]{width:100%}form.form-container[data-v-5f4eb506]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-5f4eb506]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-5f4eb506]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-5f4eb506]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-5f4eb506]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-5f4eb506],form.form-container .label-value select[data-v-5f4eb506]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-5f4eb506]:focus,form.form-container .label-value select[data-v-5f4eb506]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-5f4eb506]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-5f4eb506]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-5f4eb506],form.form-container .label-value input[type=radio][data-v-5f4eb506]{width:auto}form.form-container .label-value input[type=radio][data-v-5f4eb506]{margin:0 4px 0 0}form.form-container .label-value input[data-v-5f4eb506]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-5f4eb506]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5f4eb506]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5f4eb506]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-5f4eb506]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-5f4eb506]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-5f4eb506]:hover{background-color:#747474}form.form-container .label-msg[data-v-5f4eb506]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-5f4eb506]{color:#f9ad1e}form.form-container .label-flex[data-v-5f4eb506]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-5f4eb506]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-5f4eb506]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-5f4eb506]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-5f4eb506]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-5f4eb506]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-5f4eb506]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-5f4eb506],form.form-container1 .label-value select[data-v-5f4eb506]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-5f4eb506]:focus,form.form-container1 .label-value select[data-v-5f4eb506]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-5f4eb506]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-5f4eb506],form.form-container1 .label-value input[type=radio][data-v-5f4eb506]{width:auto}form.form-container1 .label-value input[type=radio][data-v-5f4eb506]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-5f4eb506]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-5f4eb506]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5f4eb506]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5f4eb506]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-5f4eb506]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-5f4eb506]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-5f4eb506]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-5f4eb506]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-5f4eb506]{color:#f9ad1e}form.form-container1 .label-flex[data-v-5f4eb506]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-5f4eb506]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-5f4eb506]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-5f4eb506]{width:100px}table.page-table th.checkbox[data-v-5f4eb506]{width:50px;text-align:center}table.page-table th.setting[data-v-5f4eb506]{width:100px;text-align:center}table.page-table thead[data-v-5f4eb506]{color:#909399}table.page-table thead tr[data-v-5f4eb506]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-5f4eb506]{padding:10px 16px}table.page-table tbody tr[data-v-5f4eb506]:hover{background-color:#eeee}table.page-table tbody tr[data-v-5f4eb506]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-5f4eb506]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-5f4eb506]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-5f4eb506]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-5f4eb506]{width:100px}table.popups-table th.checkbox[data-v-5f4eb506]{width:50px;text-align:center}table.popups-table th.setting[data-v-5f4eb506]{width:100px;text-align:center}table.popups-table thead[data-v-5f4eb506]{color:#eee}table.popups-table thead tr[data-v-5f4eb506]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-5f4eb506]{padding:10px 16px}table.popups-table tbody tr[data-v-5f4eb506]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-5f4eb506]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-5f4eb506]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-5f4eb506]{width:100%}header.header-desktop[data-v-5f4eb506]{display:block}header.header-mobile[data-v-5f4eb506]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-5f4eb506]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-5f4eb506]{width:100%;height:100%}header.header-mobile button svg path[data-v-5f4eb506]{fill:#fff}nav.sidebar[data-v-5f4eb506]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-5f4eb506]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-5f4eb506]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-5f4eb506]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-5f4eb506]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-5f4eb506]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-5f4eb506]{color:#fff}nav.sidebar .container .children[data-v-5f4eb506]{padding-left:30px}@-moz-keyframes tada-5f4eb506{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-5f4eb506{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-5f4eb506{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-5f4eb506{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-5f4eb506]{animation:dialogEnter-5f4eb506 .3s linear forwards}.dialog-leave-active[data-v-5f4eb506]{animation:dialogLeave-5f4eb506 .3s linear forwards}@keyframes dialogEnter-5f4eb506{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-5f4eb506{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-5f4eb506]{animation:dialogEnter-5f4eb506 .2s linear forwards}.dialog1-leave-active[data-v-5f4eb506]{animation:dialogLeave-5f4eb506 .2s linear forwards}@keyframes rotateEnter-5f4eb506{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-5f4eb506]{animation:rotateEnter-5f4eb506 .7s;position:relative}.rotate-leave-active[data-v-5f4eb506]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-5f4eb506{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-5f4eb506{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-5f4eb506]{animation:slideOutTop-5f4eb506 .5s linear forwards}.slide-top-leave-active[data-v-5f4eb506],.slide-bottom-enter-active[data-v-5f4eb506]{animation:slideOutBottom-5f4eb506 .5s linear forwards}@keyframes slideInLeft-5f4eb506{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-5f4eb506{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-5f4eb506]{animation:slideInLeft-5f4eb506 .3s linear forwards}.slide-left-leave-active[data-v-5f4eb506]{animation:slideInRight-5f4eb506 .3s linear forwards}@keyframes slideOutLeft-5f4eb506{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-5f4eb506{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-5f4eb506]{animation:slideOutLeft-5f4eb506 .3s linear forwards}.slide-right-leave-active[data-v-5f4eb506]{animation:slideOutRight-5f4eb506 .3s linear forwards}@keyframes bganimation-5f4eb506{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-5f4eb506{0%{height:0}to{height:100px}}@keyframes fadeEnd-5f4eb506{0%{height:100%}to{height:0}}.fade-enter-active[data-v-5f4eb506]{animation:fadeStart-5f4eb506 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-5f4eb506]{animation:fadeEnd-5f4eb506 .1s linear forwards;overflow:hidden}#main[data-v-5f4eb506]{width:100vw;height:100vh;overflow:auto;overflow:overlay;background:linear-gradient(180deg,#4587ff,#3f90fe,#6dd5fa,#fff)}@keyframes turns-a9949144{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-a9949144]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-a9949144]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-a9949144]{color:#f9ad1e}.notice_info li[data-v-a9949144]{font-size:14px;list-style:revert}.text-container[data-v-a9949144]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-a9949144]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-a9949144]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-a9949144]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-a9949144]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-a9949144]{width:100%}.text-container .text-container_item p.info-desc[data-v-a9949144]{width:100%;color:#999;font-size:14px}.page-container[data-v-a9949144]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-a9949144]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-a9949144]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-a9949144]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-a9949144],.page-container .page-flex .page-sidebar a[data-v-a9949144]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-a9949144]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-a9949144]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-a9949144]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-a9949144]{border-radius:0;padding:1rem}ul.ul-container[data-v-a9949144]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-a9949144]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-a9949144]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-a9949144]{width:100%}form.form-container[data-v-a9949144]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-a9949144]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-a9949144]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-a9949144]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-a9949144]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-a9949144],form.form-container .label-value select[data-v-a9949144]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-a9949144]:focus,form.form-container .label-value select[data-v-a9949144]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-a9949144]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-a9949144]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-a9949144],form.form-container .label-value input[type=radio][data-v-a9949144]{width:auto}form.form-container .label-value input[type=radio][data-v-a9949144]{margin:0 4px 0 0}form.form-container .label-value input[data-v-a9949144]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-a9949144]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-a9949144]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-a9949144]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-a9949144]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-a9949144]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-a9949144]:hover{background-color:#747474}form.form-container .label-msg[data-v-a9949144]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-a9949144]{color:#f9ad1e}form.form-container .label-flex[data-v-a9949144]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-a9949144]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-a9949144]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-a9949144]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-a9949144]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-a9949144]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-a9949144]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-a9949144],form.form-container1 .label-value select[data-v-a9949144]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-a9949144]:focus,form.form-container1 .label-value select[data-v-a9949144]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-a9949144]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-a9949144],form.form-container1 .label-value input[type=radio][data-v-a9949144]{width:auto}form.form-container1 .label-value input[type=radio][data-v-a9949144]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-a9949144]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-a9949144]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-a9949144]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-a9949144]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-a9949144]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-a9949144]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-a9949144]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-a9949144]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-a9949144]{color:#f9ad1e}form.form-container1 .label-flex[data-v-a9949144]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-a9949144]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-a9949144]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-a9949144]{width:100px}table.page-table th.checkbox[data-v-a9949144]{width:50px;text-align:center}table.page-table th.setting[data-v-a9949144]{width:100px;text-align:center}table.page-table thead[data-v-a9949144]{color:#909399}table.page-table thead tr[data-v-a9949144]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-a9949144]{padding:10px 16px}table.page-table tbody tr[data-v-a9949144]:hover{background-color:#eeee}table.page-table tbody tr[data-v-a9949144]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-a9949144]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-a9949144]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-a9949144]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-a9949144]{width:100px}table.popups-table th.checkbox[data-v-a9949144]{width:50px;text-align:center}table.popups-table th.setting[data-v-a9949144]{width:100px;text-align:center}table.popups-table thead[data-v-a9949144]{color:#eee}table.popups-table thead tr[data-v-a9949144]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-a9949144]{padding:10px 16px}table.popups-table tbody tr[data-v-a9949144]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-a9949144]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-a9949144]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-a9949144]{width:100%}header.header-desktop[data-v-a9949144]{display:block}header.header-mobile[data-v-a9949144]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-a9949144]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-a9949144]{width:100%;height:100%}header.header-mobile button svg path[data-v-a9949144]{fill:#fff}nav.sidebar[data-v-a9949144]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-a9949144]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-a9949144]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-a9949144]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-a9949144]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-a9949144]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-a9949144]{color:#fff}nav.sidebar .container .children[data-v-a9949144]{padding-left:30px}@-moz-keyframes tada-a9949144{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-a9949144{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-a9949144{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-a9949144{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-a9949144]{animation:dialogEnter-a9949144 .3s linear forwards}.dialog-leave-active[data-v-a9949144]{animation:dialogLeave-a9949144 .3s linear forwards}@keyframes dialogEnter-a9949144{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-a9949144{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-a9949144]{animation:dialogEnter-a9949144 .2s linear forwards}.dialog1-leave-active[data-v-a9949144]{animation:dialogLeave-a9949144 .2s linear forwards}@keyframes rotateEnter-a9949144{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-a9949144]{animation:rotateEnter-a9949144 .7s;position:relative}.rotate-leave-active[data-v-a9949144]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-a9949144{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-a9949144{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-a9949144]{animation:slideOutTop-a9949144 .5s linear forwards}.slide-top-leave-active[data-v-a9949144],.slide-bottom-enter-active[data-v-a9949144]{animation:slideOutBottom-a9949144 .5s linear forwards}@keyframes slideInLeft-a9949144{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-a9949144{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-a9949144]{animation:slideInLeft-a9949144 .3s linear forwards}.slide-left-leave-active[data-v-a9949144]{animation:slideInRight-a9949144 .3s linear forwards}@keyframes slideOutLeft-a9949144{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-a9949144{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-a9949144]{animation:slideOutLeft-a9949144 .3s linear forwards}.slide-right-leave-active[data-v-a9949144]{animation:slideOutRight-a9949144 .3s linear forwards}@keyframes bganimation-a9949144{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-a9949144{0%{height:0}to{height:100px}}@keyframes fadeEnd-a9949144{0%{height:100%}to{height:0}}.fade-enter-active[data-v-a9949144]{animation:fadeStart-a9949144 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-a9949144]{animation:fadeEnd-a9949144 .1s linear forwards;overflow:hidden}.progress-container[data-v-a9949144]{height:40px;display:flex;flex-wrap:wrap;align-items:center}.progress-container .progress[data-v-a9949144]{width:300px;margin-right:10px}.progress-container span[data-v-a9949144]{font-size:14px;color:#999}@keyframes turns-c5783954{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-c5783954]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-c5783954]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-c5783954]{color:#f9ad1e}.notice_info li[data-v-c5783954]{font-size:14px;list-style:revert}.text-container[data-v-c5783954]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-c5783954]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-c5783954]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-c5783954]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-c5783954]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-c5783954]{width:100%}.text-container .text-container_item p.info-desc[data-v-c5783954]{width:100%;color:#999;font-size:14px}.page-container[data-v-c5783954]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-c5783954]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-c5783954]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-c5783954]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-c5783954],.page-container .page-flex .page-sidebar a[data-v-c5783954]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-c5783954]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-c5783954]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-c5783954]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-c5783954]{border-radius:0;padding:1rem}ul.ul-container[data-v-c5783954]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-c5783954]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-c5783954]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-c5783954]{width:100%}form.form-container[data-v-c5783954]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-c5783954]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-c5783954]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-c5783954]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-c5783954]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-c5783954],form.form-container .label-value select[data-v-c5783954]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-c5783954]:focus,form.form-container .label-value select[data-v-c5783954]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-c5783954]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-c5783954]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-c5783954],form.form-container .label-value input[type=radio][data-v-c5783954]{width:auto}form.form-container .label-value input[type=radio][data-v-c5783954]{margin:0 4px 0 0}form.form-container .label-value input[data-v-c5783954]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-c5783954]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-c5783954]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-c5783954]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-c5783954]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-c5783954]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-c5783954]:hover{background-color:#747474}form.form-container .label-msg[data-v-c5783954]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-c5783954]{color:#f9ad1e}form.form-container .label-flex[data-v-c5783954]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-c5783954]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-c5783954]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-c5783954]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-c5783954]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-c5783954]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-c5783954]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-c5783954],form.form-container1 .label-value select[data-v-c5783954]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-c5783954]:focus,form.form-container1 .label-value select[data-v-c5783954]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-c5783954]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-c5783954],form.form-container1 .label-value input[type=radio][data-v-c5783954]{width:auto}form.form-container1 .label-value input[type=radio][data-v-c5783954]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-c5783954]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-c5783954]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-c5783954]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-c5783954]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-c5783954]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-c5783954]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-c5783954]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-c5783954]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-c5783954]{color:#f9ad1e}form.form-container1 .label-flex[data-v-c5783954]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-c5783954]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-c5783954]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-c5783954]{width:100px}table.page-table th.checkbox[data-v-c5783954]{width:50px;text-align:center}table.page-table th.setting[data-v-c5783954]{width:100px;text-align:center}table.page-table thead[data-v-c5783954]{color:#909399}table.page-table thead tr[data-v-c5783954]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-c5783954]{padding:10px 16px}table.page-table tbody tr[data-v-c5783954]:hover{background-color:#eeee}table.page-table tbody tr[data-v-c5783954]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-c5783954]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-c5783954]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-c5783954]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-c5783954]{width:100px}table.popups-table th.checkbox[data-v-c5783954]{width:50px;text-align:center}table.popups-table th.setting[data-v-c5783954]{width:100px;text-align:center}table.popups-table thead[data-v-c5783954]{color:#eee}table.popups-table thead tr[data-v-c5783954]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-c5783954]{padding:10px 16px}table.popups-table tbody tr[data-v-c5783954]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-c5783954]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-c5783954]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-c5783954]{width:100%}header.header-desktop[data-v-c5783954]{display:block}header.header-mobile[data-v-c5783954]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-c5783954]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-c5783954]{width:100%;height:100%}header.header-mobile button svg path[data-v-c5783954]{fill:#fff}nav.sidebar[data-v-c5783954]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-c5783954]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-c5783954]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-c5783954]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-c5783954]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-c5783954]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-c5783954]{color:#fff}nav.sidebar .container .children[data-v-c5783954]{padding-left:30px}@-moz-keyframes tada-c5783954{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-c5783954{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-c5783954{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-c5783954{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-c5783954]{animation:dialogEnter-c5783954 .3s linear forwards}.dialog-leave-active[data-v-c5783954]{animation:dialogLeave-c5783954 .3s linear forwards}@keyframes dialogEnter-c5783954{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-c5783954{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-c5783954]{animation:dialogEnter-c5783954 .2s linear forwards}.dialog1-leave-active[data-v-c5783954]{animation:dialogLeave-c5783954 .2s linear forwards}@keyframes rotateEnter-c5783954{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-c5783954]{animation:rotateEnter-c5783954 .7s;position:relative}.rotate-leave-active[data-v-c5783954]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-c5783954{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-c5783954{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-c5783954]{animation:slideOutTop-c5783954 .5s linear forwards}.slide-top-leave-active[data-v-c5783954],.slide-bottom-enter-active[data-v-c5783954]{animation:slideOutBottom-c5783954 .5s linear forwards}@keyframes slideInLeft-c5783954{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-c5783954{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-c5783954]{animation:slideInLeft-c5783954 .3s linear forwards}.slide-left-leave-active[data-v-c5783954]{animation:slideInRight-c5783954 .3s linear forwards}@keyframes slideOutLeft-c5783954{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-c5783954{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-c5783954]{animation:slideOutLeft-c5783954 .3s linear forwards}.slide-right-leave-active[data-v-c5783954]{animation:slideOutRight-c5783954 .3s linear forwards}@keyframes bganimation-c5783954{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-c5783954{0%{height:0}to{height:100px}}@keyframes fadeEnd-c5783954{0%{height:100%}to{height:0}}.fade-enter-active[data-v-c5783954]{animation:fadeStart-c5783954 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-c5783954]{animation:fadeEnd-c5783954 .1s linear forwards;overflow:hidden}p[data-v-c5783954]{font-size:1em;color:#999;line-height:26px;text-align:left;margin-bottom:1rem}@keyframes turns-6bbc1a4d{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-6bbc1a4d]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-6bbc1a4d]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-6bbc1a4d]{color:#f9ad1e}.notice_info li[data-v-6bbc1a4d]{font-size:14px;list-style:revert}.text-container[data-v-6bbc1a4d]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-6bbc1a4d]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-6bbc1a4d]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-6bbc1a4d]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-6bbc1a4d]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-6bbc1a4d]{width:100%}.text-container .text-container_item p.info-desc[data-v-6bbc1a4d]{width:100%;color:#999;font-size:14px}.page-container[data-v-6bbc1a4d]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-6bbc1a4d]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-6bbc1a4d]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-6bbc1a4d]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-6bbc1a4d],.page-container .page-flex .page-sidebar a[data-v-6bbc1a4d]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-6bbc1a4d]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-6bbc1a4d]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-6bbc1a4d]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-6bbc1a4d]{border-radius:0;padding:1rem}ul.ul-container[data-v-6bbc1a4d]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-6bbc1a4d]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-6bbc1a4d]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-6bbc1a4d]{width:100%}form.form-container[data-v-6bbc1a4d]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-6bbc1a4d]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-6bbc1a4d]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-6bbc1a4d]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-6bbc1a4d]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-6bbc1a4d],form.form-container .label-value select[data-v-6bbc1a4d]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-6bbc1a4d]:focus,form.form-container .label-value select[data-v-6bbc1a4d]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-6bbc1a4d]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-6bbc1a4d]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-6bbc1a4d],form.form-container .label-value input[type=radio][data-v-6bbc1a4d]{width:auto}form.form-container .label-value input[type=radio][data-v-6bbc1a4d]{margin:0 4px 0 0}form.form-container .label-value input[data-v-6bbc1a4d]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-6bbc1a4d]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-6bbc1a4d]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-6bbc1a4d]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-6bbc1a4d]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-6bbc1a4d]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-6bbc1a4d]:hover{background-color:#747474}form.form-container .label-msg[data-v-6bbc1a4d]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-6bbc1a4d]{color:#f9ad1e}form.form-container .label-flex[data-v-6bbc1a4d]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-6bbc1a4d]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-6bbc1a4d]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-6bbc1a4d]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-6bbc1a4d]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-6bbc1a4d]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-6bbc1a4d]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-6bbc1a4d],form.form-container1 .label-value select[data-v-6bbc1a4d]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-6bbc1a4d]:focus,form.form-container1 .label-value select[data-v-6bbc1a4d]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-6bbc1a4d]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-6bbc1a4d],form.form-container1 .label-value input[type=radio][data-v-6bbc1a4d]{width:auto}form.form-container1 .label-value input[type=radio][data-v-6bbc1a4d]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-6bbc1a4d]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-6bbc1a4d]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-6bbc1a4d]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-6bbc1a4d]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-6bbc1a4d]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-6bbc1a4d]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-6bbc1a4d]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-6bbc1a4d]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-6bbc1a4d]{color:#f9ad1e}form.form-container1 .label-flex[data-v-6bbc1a4d]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-6bbc1a4d]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-6bbc1a4d]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-6bbc1a4d]{width:100px}table.page-table th.checkbox[data-v-6bbc1a4d]{width:50px;text-align:center}table.page-table th.setting[data-v-6bbc1a4d]{width:100px;text-align:center}table.page-table thead[data-v-6bbc1a4d]{color:#909399}table.page-table thead tr[data-v-6bbc1a4d]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-6bbc1a4d]{padding:10px 16px}table.page-table tbody tr[data-v-6bbc1a4d]:hover{background-color:#eeee}table.page-table tbody tr[data-v-6bbc1a4d]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-6bbc1a4d]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-6bbc1a4d]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-6bbc1a4d]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-6bbc1a4d]{width:100px}table.popups-table th.checkbox[data-v-6bbc1a4d]{width:50px;text-align:center}table.popups-table th.setting[data-v-6bbc1a4d]{width:100px;text-align:center}table.popups-table thead[data-v-6bbc1a4d]{color:#eee}table.popups-table thead tr[data-v-6bbc1a4d]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-6bbc1a4d]{padding:10px 16px}table.popups-table tbody tr[data-v-6bbc1a4d]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-6bbc1a4d]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-6bbc1a4d]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-6bbc1a4d]{width:100%}header.header-desktop[data-v-6bbc1a4d]{display:block}header.header-mobile[data-v-6bbc1a4d]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-6bbc1a4d]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-6bbc1a4d]{width:100%;height:100%}header.header-mobile button svg path[data-v-6bbc1a4d]{fill:#fff}nav.sidebar[data-v-6bbc1a4d]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-6bbc1a4d]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-6bbc1a4d]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-6bbc1a4d]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-6bbc1a4d]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-6bbc1a4d]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-6bbc1a4d]{color:#fff}nav.sidebar .container .children[data-v-6bbc1a4d]{padding-left:30px}@-moz-keyframes tada-6bbc1a4d{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-6bbc1a4d{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-6bbc1a4d{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-6bbc1a4d{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-6bbc1a4d]{animation:dialogEnter-6bbc1a4d .3s linear forwards}.dialog-leave-active[data-v-6bbc1a4d]{animation:dialogLeave-6bbc1a4d .3s linear forwards}@keyframes dialogEnter-6bbc1a4d{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-6bbc1a4d{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-6bbc1a4d]{animation:dialogEnter-6bbc1a4d .2s linear forwards}.dialog1-leave-active[data-v-6bbc1a4d]{animation:dialogLeave-6bbc1a4d .2s linear forwards}@keyframes rotateEnter-6bbc1a4d{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-6bbc1a4d]{animation:rotateEnter-6bbc1a4d .7s;position:relative}.rotate-leave-active[data-v-6bbc1a4d]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-6bbc1a4d{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-6bbc1a4d{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-6bbc1a4d]{animation:slideOutTop-6bbc1a4d .5s linear forwards}.slide-top-leave-active[data-v-6bbc1a4d],.slide-bottom-enter-active[data-v-6bbc1a4d]{animation:slideOutBottom-6bbc1a4d .5s linear forwards}@keyframes slideInLeft-6bbc1a4d{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-6bbc1a4d{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-6bbc1a4d]{animation:slideInLeft-6bbc1a4d .3s linear forwards}.slide-left-leave-active[data-v-6bbc1a4d]{animation:slideInRight-6bbc1a4d .3s linear forwards}@keyframes slideOutLeft-6bbc1a4d{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-6bbc1a4d{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-6bbc1a4d]{animation:slideOutLeft-6bbc1a4d .3s linear forwards}.slide-right-leave-active[data-v-6bbc1a4d]{animation:slideOutRight-6bbc1a4d .3s linear forwards}@keyframes bganimation-6bbc1a4d{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-6bbc1a4d{0%{height:0}to{height:100px}}@keyframes fadeEnd-6bbc1a4d{0%{height:100%}to{height:0}}.fade-enter-active[data-v-6bbc1a4d]{animation:fadeStart-6bbc1a4d .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-6bbc1a4d]{animation:fadeEnd-6bbc1a4d .1s linear forwards;overflow:hidden}p[data-v-6bbc1a4d]{font-size:1em;color:#999;line-height:20px;text-align:center}.label-msg.warning[data-v-6bbc1a4d]{width:100%;text-align:center;height:300px;line-height:300px}@keyframes turns-f0f8da84{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-f0f8da84]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-f0f8da84]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-f0f8da84]{color:#f9ad1e}.notice_info li[data-v-f0f8da84]{font-size:14px;list-style:revert}.text-container[data-v-f0f8da84]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-f0f8da84]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-f0f8da84]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-f0f8da84]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-f0f8da84]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-f0f8da84]{width:100%}.text-container .text-container_item p.info-desc[data-v-f0f8da84]{width:100%;color:#999;font-size:14px}.page-container[data-v-f0f8da84]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-f0f8da84]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-f0f8da84]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-f0f8da84]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-f0f8da84],.page-container .page-flex .page-sidebar a[data-v-f0f8da84]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-f0f8da84]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-f0f8da84]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-f0f8da84]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-f0f8da84]{border-radius:0;padding:1rem}ul.ul-container[data-v-f0f8da84]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-f0f8da84]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-f0f8da84]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-f0f8da84]{width:100%}form.form-container[data-v-f0f8da84]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-f0f8da84]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-f0f8da84]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-f0f8da84]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-f0f8da84]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-f0f8da84],form.form-container .label-value select[data-v-f0f8da84]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-f0f8da84]:focus,form.form-container .label-value select[data-v-f0f8da84]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-f0f8da84]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-f0f8da84]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-f0f8da84],form.form-container .label-value input[type=radio][data-v-f0f8da84]{width:auto}form.form-container .label-value input[type=radio][data-v-f0f8da84]{margin:0 4px 0 0}form.form-container .label-value input[data-v-f0f8da84]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-f0f8da84]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-f0f8da84]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-f0f8da84]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-f0f8da84]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-f0f8da84]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-f0f8da84]:hover{background-color:#747474}form.form-container .label-msg[data-v-f0f8da84]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-f0f8da84]{color:#f9ad1e}form.form-container .label-flex[data-v-f0f8da84]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-f0f8da84]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-f0f8da84]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-f0f8da84]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-f0f8da84]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-f0f8da84]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-f0f8da84]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-f0f8da84],form.form-container1 .label-value select[data-v-f0f8da84]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-f0f8da84]:focus,form.form-container1 .label-value select[data-v-f0f8da84]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-f0f8da84]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-f0f8da84],form.form-container1 .label-value input[type=radio][data-v-f0f8da84]{width:auto}form.form-container1 .label-value input[type=radio][data-v-f0f8da84]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-f0f8da84]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-f0f8da84]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-f0f8da84]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-f0f8da84]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-f0f8da84]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-f0f8da84]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-f0f8da84]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-f0f8da84]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-f0f8da84]{color:#f9ad1e}form.form-container1 .label-flex[data-v-f0f8da84]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-f0f8da84]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-f0f8da84]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-f0f8da84]{width:100px}table.page-table th.checkbox[data-v-f0f8da84]{width:50px;text-align:center}table.page-table th.setting[data-v-f0f8da84]{width:100px;text-align:center}table.page-table thead[data-v-f0f8da84]{color:#909399}table.page-table thead tr[data-v-f0f8da84]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-f0f8da84]{padding:10px 16px}table.page-table tbody tr[data-v-f0f8da84]:hover{background-color:#eeee}table.page-table tbody tr[data-v-f0f8da84]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-f0f8da84]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-f0f8da84]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-f0f8da84]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-f0f8da84]{width:100px}table.popups-table th.checkbox[data-v-f0f8da84]{width:50px;text-align:center}table.popups-table th.setting[data-v-f0f8da84]{width:100px;text-align:center}table.popups-table thead[data-v-f0f8da84]{color:#eee}table.popups-table thead tr[data-v-f0f8da84]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-f0f8da84]{padding:10px 16px}table.popups-table tbody tr[data-v-f0f8da84]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-f0f8da84]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-f0f8da84]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-f0f8da84]{width:100%}header.header-desktop[data-v-f0f8da84]{display:block}header.header-mobile[data-v-f0f8da84]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-f0f8da84]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-f0f8da84]{width:100%;height:100%}header.header-mobile button svg path[data-v-f0f8da84]{fill:#fff}nav.sidebar[data-v-f0f8da84]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-f0f8da84]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-f0f8da84]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-f0f8da84]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-f0f8da84]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-f0f8da84]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-f0f8da84]{color:#fff}nav.sidebar .container .children[data-v-f0f8da84]{padding-left:30px}@-moz-keyframes tada-f0f8da84{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-f0f8da84{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-f0f8da84{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-f0f8da84{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-f0f8da84]{animation:dialogEnter-f0f8da84 .3s linear forwards}.dialog-leave-active[data-v-f0f8da84]{animation:dialogLeave-f0f8da84 .3s linear forwards}@keyframes dialogEnter-f0f8da84{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-f0f8da84{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-f0f8da84]{animation:dialogEnter-f0f8da84 .2s linear forwards}.dialog1-leave-active[data-v-f0f8da84]{animation:dialogLeave-f0f8da84 .2s linear forwards}@keyframes rotateEnter-f0f8da84{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-f0f8da84]{animation:rotateEnter-f0f8da84 .7s;position:relative}.rotate-leave-active[data-v-f0f8da84]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-f0f8da84{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-f0f8da84{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-f0f8da84]{animation:slideOutTop-f0f8da84 .5s linear forwards}.slide-top-leave-active[data-v-f0f8da84],.slide-bottom-enter-active[data-v-f0f8da84]{animation:slideOutBottom-f0f8da84 .5s linear forwards}@keyframes slideInLeft-f0f8da84{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-f0f8da84{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-f0f8da84]{animation:slideInLeft-f0f8da84 .3s linear forwards}.slide-left-leave-active[data-v-f0f8da84]{animation:slideInRight-f0f8da84 .3s linear forwards}@keyframes slideOutLeft-f0f8da84{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-f0f8da84{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-f0f8da84]{animation:slideOutLeft-f0f8da84 .3s linear forwards}.slide-right-leave-active[data-v-f0f8da84]{animation:slideOutRight-f0f8da84 .3s linear forwards}@keyframes bganimation-f0f8da84{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-f0f8da84{0%{height:0}to{height:100px}}@keyframes fadeEnd-f0f8da84{0%{height:100%}to{height:0}}.fade-enter-active[data-v-f0f8da84]{animation:fadeStart-f0f8da84 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-f0f8da84]{animation:fadeEnd-f0f8da84 .1s linear forwards;overflow:hidden}.disk-item[data-v-f0f8da84]{width:100%;margin-top:10px;padding-bottom:5px;border-bottom:1px solid #eee;cursor:pointer}.disk-item .disk-item_contanier[data-v-f0f8da84]{width:100%;display:flex;flex-wrap:wrap;align-items:center}.disk-item .disk-item_contanier .disk-item_icon[data-v-f0f8da84]{width:30px;height:30px;margin-right:10px}.disk-item .disk-item_contanier .disk-item_icon svg[data-v-f0f8da84]{width:100%;height:100%}.disk-item .disk-item_contanier .disk-item_name[data-v-f0f8da84]{color:#666;font-size:14px}.disk-item .disk-item_contanier .disk-item_used[data-v-f0f8da84]{color:#666;font-size:13px}.disk-item .disk-item_info[data-v-f0f8da84]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end;margin-top:10px}.disk-item .disk-item_info span[data-v-f0f8da84]{margin-right:10px;color:#666;font-size:14px}.disk-item .disk-item_info a[data-v-f0f8da84]{margin-left:16px;color:#666;font-size:14px}.disk-item .disk-item_info span[data-v-f0f8da84]:hover,.disk-item .disk-item_info a[data-v-f0f8da84]:hover{color:#418cff}@keyframes turns-bf0d8af0{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-bf0d8af0]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-bf0d8af0]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-bf0d8af0]{color:#f9ad1e}.notice_info li[data-v-bf0d8af0]{font-size:14px;list-style:revert}.text-container[data-v-bf0d8af0]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-bf0d8af0]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-bf0d8af0]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-bf0d8af0]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-bf0d8af0]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-bf0d8af0]{width:100%}.text-container .text-container_item p.info-desc[data-v-bf0d8af0]{width:100%;color:#999;font-size:14px}.page-container[data-v-bf0d8af0]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-bf0d8af0]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-bf0d8af0]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-bf0d8af0]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-bf0d8af0],.page-container .page-flex .page-sidebar a[data-v-bf0d8af0]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-bf0d8af0]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-bf0d8af0]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-bf0d8af0]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-bf0d8af0]{border-radius:0;padding:1rem}ul.ul-container[data-v-bf0d8af0]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-bf0d8af0]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-bf0d8af0]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-bf0d8af0]{width:100%}form.form-container[data-v-bf0d8af0]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-bf0d8af0]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-bf0d8af0]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-bf0d8af0]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-bf0d8af0]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-bf0d8af0],form.form-container .label-value select[data-v-bf0d8af0]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-bf0d8af0]:focus,form.form-container .label-value select[data-v-bf0d8af0]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-bf0d8af0]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-bf0d8af0]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-bf0d8af0],form.form-container .label-value input[type=radio][data-v-bf0d8af0]{width:auto}form.form-container .label-value input[type=radio][data-v-bf0d8af0]{margin:0 4px 0 0}form.form-container .label-value input[data-v-bf0d8af0]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-bf0d8af0]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-bf0d8af0]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-bf0d8af0]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-bf0d8af0]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-bf0d8af0]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-bf0d8af0]:hover{background-color:#747474}form.form-container .label-msg[data-v-bf0d8af0]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-bf0d8af0]{color:#f9ad1e}form.form-container .label-flex[data-v-bf0d8af0]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-bf0d8af0]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-bf0d8af0]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-bf0d8af0]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-bf0d8af0]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-bf0d8af0]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-bf0d8af0]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-bf0d8af0],form.form-container1 .label-value select[data-v-bf0d8af0]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-bf0d8af0]:focus,form.form-container1 .label-value select[data-v-bf0d8af0]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-bf0d8af0]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-bf0d8af0],form.form-container1 .label-value input[type=radio][data-v-bf0d8af0]{width:auto}form.form-container1 .label-value input[type=radio][data-v-bf0d8af0]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-bf0d8af0]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-bf0d8af0]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-bf0d8af0]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-bf0d8af0]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-bf0d8af0]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-bf0d8af0]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-bf0d8af0]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-bf0d8af0]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-bf0d8af0]{color:#f9ad1e}form.form-container1 .label-flex[data-v-bf0d8af0]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-bf0d8af0]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-bf0d8af0]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-bf0d8af0]{width:100px}table.page-table th.checkbox[data-v-bf0d8af0]{width:50px;text-align:center}table.page-table th.setting[data-v-bf0d8af0]{width:100px;text-align:center}table.page-table thead[data-v-bf0d8af0]{color:#909399}table.page-table thead tr[data-v-bf0d8af0]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-bf0d8af0]{padding:10px 16px}table.page-table tbody tr[data-v-bf0d8af0]:hover{background-color:#eeee}table.page-table tbody tr[data-v-bf0d8af0]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-bf0d8af0]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-bf0d8af0]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-bf0d8af0]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-bf0d8af0]{width:100px}table.popups-table th.checkbox[data-v-bf0d8af0]{width:50px;text-align:center}table.popups-table th.setting[data-v-bf0d8af0]{width:100px;text-align:center}table.popups-table thead[data-v-bf0d8af0]{color:#eee}table.popups-table thead tr[data-v-bf0d8af0]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-bf0d8af0]{padding:10px 16px}table.popups-table tbody tr[data-v-bf0d8af0]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-bf0d8af0]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-bf0d8af0]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-bf0d8af0]{width:100%}header.header-desktop[data-v-bf0d8af0]{display:block}header.header-mobile[data-v-bf0d8af0]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-bf0d8af0]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-bf0d8af0]{width:100%;height:100%}header.header-mobile button svg path[data-v-bf0d8af0]{fill:#fff}nav.sidebar[data-v-bf0d8af0]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-bf0d8af0]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-bf0d8af0]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-bf0d8af0]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-bf0d8af0]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-bf0d8af0]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-bf0d8af0]{color:#fff}nav.sidebar .container .children[data-v-bf0d8af0]{padding-left:30px}@-moz-keyframes tada-bf0d8af0{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-bf0d8af0{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-bf0d8af0{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-bf0d8af0{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-bf0d8af0]{animation:dialogEnter-bf0d8af0 .3s linear forwards}.dialog-leave-active[data-v-bf0d8af0]{animation:dialogLeave-bf0d8af0 .3s linear forwards}@keyframes dialogEnter-bf0d8af0{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-bf0d8af0{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-bf0d8af0]{animation:dialogEnter-bf0d8af0 .2s linear forwards}.dialog1-leave-active[data-v-bf0d8af0]{animation:dialogLeave-bf0d8af0 .2s linear forwards}@keyframes rotateEnter-bf0d8af0{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-bf0d8af0]{animation:rotateEnter-bf0d8af0 .7s;position:relative}.rotate-leave-active[data-v-bf0d8af0]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-bf0d8af0{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-bf0d8af0{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-bf0d8af0]{animation:slideOutTop-bf0d8af0 .5s linear forwards}.slide-top-leave-active[data-v-bf0d8af0],.slide-bottom-enter-active[data-v-bf0d8af0]{animation:slideOutBottom-bf0d8af0 .5s linear forwards}@keyframes slideInLeft-bf0d8af0{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-bf0d8af0{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-bf0d8af0]{animation:slideInLeft-bf0d8af0 .3s linear forwards}.slide-left-leave-active[data-v-bf0d8af0]{animation:slideInRight-bf0d8af0 .3s linear forwards}@keyframes slideOutLeft-bf0d8af0{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-bf0d8af0{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-bf0d8af0]{animation:slideOutLeft-bf0d8af0 .3s linear forwards}.slide-right-leave-active[data-v-bf0d8af0]{animation:slideOutRight-bf0d8af0 .3s linear forwards}@keyframes bganimation-bf0d8af0{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-bf0d8af0{0%{height:0}to{height:100px}}@keyframes fadeEnd-bf0d8af0{0%{height:100%}to{height:0}}.fade-enter-active[data-v-bf0d8af0]{animation:fadeStart-bf0d8af0 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-bf0d8af0]{animation:fadeEnd-bf0d8af0 .1s linear forwards;overflow:hidden}main[data-v-bf0d8af0]{padding:0 1rem}@keyframes turns-701aba0b{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-701aba0b]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-701aba0b]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-701aba0b]{color:#f9ad1e}.notice_info li[data-v-701aba0b]{font-size:14px;list-style:revert}.text-container[data-v-701aba0b]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-701aba0b]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-701aba0b]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-701aba0b]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-701aba0b]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-701aba0b]{width:100%}.text-container .text-container_item p.info-desc[data-v-701aba0b]{width:100%;color:#999;font-size:14px}.page-container[data-v-701aba0b]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-701aba0b]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-701aba0b]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-701aba0b]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-701aba0b],.page-container .page-flex .page-sidebar a[data-v-701aba0b]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-701aba0b]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-701aba0b]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-701aba0b]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-701aba0b]{border-radius:0;padding:1rem}ul.ul-container[data-v-701aba0b]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-701aba0b]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-701aba0b]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-701aba0b]{width:100%}form.form-container[data-v-701aba0b]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-701aba0b]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-701aba0b]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-701aba0b]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-701aba0b]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-701aba0b],form.form-container .label-value select[data-v-701aba0b]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-701aba0b]:focus,form.form-container .label-value select[data-v-701aba0b]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-701aba0b]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-701aba0b]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-701aba0b],form.form-container .label-value input[type=radio][data-v-701aba0b]{width:auto}form.form-container .label-value input[type=radio][data-v-701aba0b]{margin:0 4px 0 0}form.form-container .label-value input[data-v-701aba0b]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-701aba0b]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-701aba0b]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-701aba0b]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-701aba0b]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-701aba0b]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-701aba0b]:hover{background-color:#747474}form.form-container .label-msg[data-v-701aba0b]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-701aba0b]{color:#f9ad1e}form.form-container .label-flex[data-v-701aba0b]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-701aba0b]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-701aba0b]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-701aba0b]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-701aba0b]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-701aba0b]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-701aba0b]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-701aba0b],form.form-container1 .label-value select[data-v-701aba0b]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-701aba0b]:focus,form.form-container1 .label-value select[data-v-701aba0b]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-701aba0b]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-701aba0b],form.form-container1 .label-value input[type=radio][data-v-701aba0b]{width:auto}form.form-container1 .label-value input[type=radio][data-v-701aba0b]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-701aba0b]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-701aba0b]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-701aba0b]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-701aba0b]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-701aba0b]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-701aba0b]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-701aba0b]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-701aba0b]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-701aba0b]{color:#f9ad1e}form.form-container1 .label-flex[data-v-701aba0b]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-701aba0b]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-701aba0b]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-701aba0b]{width:100px}table.page-table th.checkbox[data-v-701aba0b]{width:50px;text-align:center}table.page-table th.setting[data-v-701aba0b]{width:100px;text-align:center}table.page-table thead[data-v-701aba0b]{color:#909399}table.page-table thead tr[data-v-701aba0b]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-701aba0b]{padding:10px 16px}table.page-table tbody tr[data-v-701aba0b]:hover{background-color:#eeee}table.page-table tbody tr[data-v-701aba0b]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-701aba0b]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-701aba0b]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-701aba0b]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-701aba0b]{width:100px}table.popups-table th.checkbox[data-v-701aba0b]{width:50px;text-align:center}table.popups-table th.setting[data-v-701aba0b]{width:100px;text-align:center}table.popups-table thead[data-v-701aba0b]{color:#eee}table.popups-table thead tr[data-v-701aba0b]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-701aba0b]{padding:10px 16px}table.popups-table tbody tr[data-v-701aba0b]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-701aba0b]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-701aba0b]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-701aba0b]{width:100%}header.header-desktop[data-v-701aba0b]{display:block}header.header-mobile[data-v-701aba0b]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-701aba0b]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-701aba0b]{width:100%;height:100%}header.header-mobile button svg path[data-v-701aba0b]{fill:#fff}nav.sidebar[data-v-701aba0b]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-701aba0b]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-701aba0b]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-701aba0b]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-701aba0b]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-701aba0b]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-701aba0b]{color:#fff}nav.sidebar .container .children[data-v-701aba0b]{padding-left:30px}@-moz-keyframes tada-701aba0b{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-701aba0b{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-701aba0b{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-701aba0b{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-701aba0b]{animation:dialogEnter-701aba0b .3s linear forwards}.dialog-leave-active[data-v-701aba0b]{animation:dialogLeave-701aba0b .3s linear forwards}@keyframes dialogEnter-701aba0b{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-701aba0b{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-701aba0b]{animation:dialogEnter-701aba0b .2s linear forwards}.dialog1-leave-active[data-v-701aba0b]{animation:dialogLeave-701aba0b .2s linear forwards}@keyframes rotateEnter-701aba0b{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-701aba0b]{animation:rotateEnter-701aba0b .7s;position:relative}.rotate-leave-active[data-v-701aba0b]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-701aba0b{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-701aba0b{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-701aba0b]{animation:slideOutTop-701aba0b .5s linear forwards}.slide-top-leave-active[data-v-701aba0b],.slide-bottom-enter-active[data-v-701aba0b]{animation:slideOutBottom-701aba0b .5s linear forwards}@keyframes slideInLeft-701aba0b{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-701aba0b{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-701aba0b]{animation:slideInLeft-701aba0b .3s linear forwards}.slide-left-leave-active[data-v-701aba0b]{animation:slideInRight-701aba0b .3s linear forwards}@keyframes slideOutLeft-701aba0b{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-701aba0b{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-701aba0b]{animation:slideOutLeft-701aba0b .3s linear forwards}.slide-right-leave-active[data-v-701aba0b]{animation:slideOutRight-701aba0b .3s linear forwards}@keyframes bganimation-701aba0b{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-701aba0b{0%{height:0}to{height:100px}}@keyframes fadeEnd-701aba0b{0%{height:100%}to{height:0}}.fade-enter-active[data-v-701aba0b]{animation:fadeStart-701aba0b .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-701aba0b]{animation:fadeEnd-701aba0b .1s linear forwards;overflow:hidden}.page-top-container[data-v-701aba0b]{background-color:#fff;padding:1rem;border-radius:1rem}.page-top-container .page-tabs[data-v-701aba0b]{width:100%;display:flex;flex-wrap:wrap;align-items:center;background-color:#fff;padding:0 1rem;border-radius:6px;margin-bottom:1rem;backdrop-filter:blur(20px)}.page-top-container .page-tabs a[data-v-701aba0b]{display:inline-block;transition:all .2s;margin:0;color:#404040;text-decoration:none;padding:1.3rem .8rem;font-size:1.1em;position:relative}.page-top-container .page-tabs a.router-link-active.router-link-exact-active[data-v-701aba0b]{color:#4388ff}.page-top-container .page-tabs a.router-link-active.router-link-exact-active[data-v-701aba0b]:after{content:\"\";display:block;position:absolute;background-color:#4388ff;bottom:0;left:15%;right:15%;height:4px;border-radius:6px}.page-top-container .page-main[data-v-701aba0b]{width:100%;display:flex;flex-wrap:wrap;align-items:center;border-radius:6px}.page-top-container .page-footer[data-v-701aba0b]{padding:160px 0 40px;text-align:center;color:#666;font-size:14px}.page-top-container .page-footer a[data-v-701aba0b]{color:#666}@keyframes turns-16a9b49b{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-16a9b49b]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-16a9b49b]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-16a9b49b]{color:#f9ad1e}.notice_info li[data-v-16a9b49b]{font-size:14px;list-style:revert}.text-container[data-v-16a9b49b]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-16a9b49b]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-16a9b49b]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-16a9b49b]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-16a9b49b]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-16a9b49b]{width:100%}.text-container .text-container_item p.info-desc[data-v-16a9b49b]{width:100%;color:#999;font-size:14px}.page-container[data-v-16a9b49b]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-16a9b49b]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-16a9b49b]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-16a9b49b]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-16a9b49b],.page-container .page-flex .page-sidebar a[data-v-16a9b49b]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-16a9b49b]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-16a9b49b]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-16a9b49b]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-16a9b49b]{border-radius:0;padding:1rem}ul.ul-container[data-v-16a9b49b]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-16a9b49b]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-16a9b49b]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-16a9b49b]{width:100%}form.form-container[data-v-16a9b49b]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-16a9b49b]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-16a9b49b]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-16a9b49b]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-16a9b49b]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-16a9b49b],form.form-container .label-value select[data-v-16a9b49b]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-16a9b49b]:focus,form.form-container .label-value select[data-v-16a9b49b]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-16a9b49b]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-16a9b49b]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-16a9b49b],form.form-container .label-value input[type=radio][data-v-16a9b49b]{width:auto}form.form-container .label-value input[type=radio][data-v-16a9b49b]{margin:0 4px 0 0}form.form-container .label-value input[data-v-16a9b49b]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-16a9b49b]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-16a9b49b]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-16a9b49b]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-16a9b49b]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-16a9b49b]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-16a9b49b]:hover{background-color:#747474}form.form-container .label-msg[data-v-16a9b49b]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-16a9b49b]{color:#f9ad1e}form.form-container .label-flex[data-v-16a9b49b]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-16a9b49b]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-16a9b49b]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-16a9b49b]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-16a9b49b]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-16a9b49b]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-16a9b49b]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-16a9b49b],form.form-container1 .label-value select[data-v-16a9b49b]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-16a9b49b]:focus,form.form-container1 .label-value select[data-v-16a9b49b]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-16a9b49b]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-16a9b49b],form.form-container1 .label-value input[type=radio][data-v-16a9b49b]{width:auto}form.form-container1 .label-value input[type=radio][data-v-16a9b49b]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-16a9b49b]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-16a9b49b]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-16a9b49b]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-16a9b49b]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-16a9b49b]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-16a9b49b]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-16a9b49b]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-16a9b49b]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-16a9b49b]{color:#f9ad1e}form.form-container1 .label-flex[data-v-16a9b49b]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-16a9b49b]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-16a9b49b]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-16a9b49b]{width:100px}table.page-table th.checkbox[data-v-16a9b49b]{width:50px;text-align:center}table.page-table th.setting[data-v-16a9b49b]{width:100px;text-align:center}table.page-table thead[data-v-16a9b49b]{color:#909399}table.page-table thead tr[data-v-16a9b49b]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-16a9b49b]{padding:10px 16px}table.page-table tbody tr[data-v-16a9b49b]:hover{background-color:#eeee}table.page-table tbody tr[data-v-16a9b49b]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-16a9b49b]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-16a9b49b]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-16a9b49b]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-16a9b49b]{width:100px}table.popups-table th.checkbox[data-v-16a9b49b]{width:50px;text-align:center}table.popups-table th.setting[data-v-16a9b49b]{width:100px;text-align:center}table.popups-table thead[data-v-16a9b49b]{color:#eee}table.popups-table thead tr[data-v-16a9b49b]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-16a9b49b]{padding:10px 16px}table.popups-table tbody tr[data-v-16a9b49b]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-16a9b49b]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-16a9b49b]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-16a9b49b]{width:100%}header.header-desktop[data-v-16a9b49b]{display:block}header.header-mobile[data-v-16a9b49b]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-16a9b49b]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-16a9b49b]{width:100%;height:100%}header.header-mobile button svg path[data-v-16a9b49b]{fill:#fff}nav.sidebar[data-v-16a9b49b]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-16a9b49b]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-16a9b49b]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-16a9b49b]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-16a9b49b]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-16a9b49b]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-16a9b49b]{color:#fff}nav.sidebar .container .children[data-v-16a9b49b]{padding-left:30px}@-moz-keyframes tada-16a9b49b{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-16a9b49b{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-16a9b49b{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-16a9b49b{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-16a9b49b]{animation:dialogEnter-16a9b49b .3s linear forwards}.dialog-leave-active[data-v-16a9b49b]{animation:dialogLeave-16a9b49b .3s linear forwards}@keyframes dialogEnter-16a9b49b{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-16a9b49b{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-16a9b49b]{animation:dialogEnter-16a9b49b .2s linear forwards}.dialog1-leave-active[data-v-16a9b49b]{animation:dialogLeave-16a9b49b .2s linear forwards}@keyframes rotateEnter-16a9b49b{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-16a9b49b]{animation:rotateEnter-16a9b49b .7s;position:relative}.rotate-leave-active[data-v-16a9b49b]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-16a9b49b{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-16a9b49b{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-16a9b49b]{animation:slideOutTop-16a9b49b .5s linear forwards}.slide-top-leave-active[data-v-16a9b49b],.slide-bottom-enter-active[data-v-16a9b49b]{animation:slideOutBottom-16a9b49b .5s linear forwards}@keyframes slideInLeft-16a9b49b{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-16a9b49b{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-16a9b49b]{animation:slideInLeft-16a9b49b .3s linear forwards}.slide-left-leave-active[data-v-16a9b49b]{animation:slideInRight-16a9b49b .3s linear forwards}@keyframes slideOutLeft-16a9b49b{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-16a9b49b{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-16a9b49b]{animation:slideOutLeft-16a9b49b .3s linear forwards}.slide-right-leave-active[data-v-16a9b49b]{animation:slideOutRight-16a9b49b .3s linear forwards}@keyframes bganimation-16a9b49b{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-16a9b49b{0%{height:0}to{height:100px}}@keyframes fadeEnd-16a9b49b{0%{height:100%}to{height:0}}.fade-enter-active[data-v-16a9b49b]{animation:fadeStart-16a9b49b .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-16a9b49b]{animation:fadeEnd-16a9b49b .1s linear forwards;overflow:hidden}th.flex-icon[data-v-16a9b49b]{display:flex;align-items:center}th.flex-icon svg[data-v-16a9b49b]{width:35px;height:35px;margin-right:5px}@keyframes turns-613b66e3{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-613b66e3]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-613b66e3]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-613b66e3]{color:#f9ad1e}.notice_info li[data-v-613b66e3]{font-size:14px;list-style:revert}.text-container[data-v-613b66e3]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-613b66e3]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-613b66e3]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-613b66e3]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-613b66e3]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-613b66e3]{width:100%}.text-container .text-container_item p.info-desc[data-v-613b66e3]{width:100%;color:#999;font-size:14px}.page-container[data-v-613b66e3]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-613b66e3]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-613b66e3]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-613b66e3]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-613b66e3],.page-container .page-flex .page-sidebar a[data-v-613b66e3]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-613b66e3]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-613b66e3]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-613b66e3]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-613b66e3]{border-radius:0;padding:1rem}ul.ul-container[data-v-613b66e3]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-613b66e3]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-613b66e3]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-613b66e3]{width:100%}form.form-container[data-v-613b66e3]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-613b66e3]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-613b66e3]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-613b66e3]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-613b66e3]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-613b66e3],form.form-container .label-value select[data-v-613b66e3]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-613b66e3]:focus,form.form-container .label-value select[data-v-613b66e3]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-613b66e3]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-613b66e3]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-613b66e3],form.form-container .label-value input[type=radio][data-v-613b66e3]{width:auto}form.form-container .label-value input[type=radio][data-v-613b66e3]{margin:0 4px 0 0}form.form-container .label-value input[data-v-613b66e3]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-613b66e3]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-613b66e3]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-613b66e3]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-613b66e3]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-613b66e3]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-613b66e3]:hover{background-color:#747474}form.form-container .label-msg[data-v-613b66e3]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-613b66e3]{color:#f9ad1e}form.form-container .label-flex[data-v-613b66e3]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-613b66e3]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-613b66e3]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-613b66e3]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-613b66e3]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-613b66e3]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-613b66e3]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-613b66e3],form.form-container1 .label-value select[data-v-613b66e3]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-613b66e3]:focus,form.form-container1 .label-value select[data-v-613b66e3]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-613b66e3]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-613b66e3],form.form-container1 .label-value input[type=radio][data-v-613b66e3]{width:auto}form.form-container1 .label-value input[type=radio][data-v-613b66e3]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-613b66e3]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-613b66e3]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-613b66e3]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-613b66e3]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-613b66e3]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-613b66e3]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-613b66e3]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-613b66e3]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-613b66e3]{color:#f9ad1e}form.form-container1 .label-flex[data-v-613b66e3]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-613b66e3]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-613b66e3]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-613b66e3]{width:100px}table.page-table th.checkbox[data-v-613b66e3]{width:50px;text-align:center}table.page-table th.setting[data-v-613b66e3]{width:100px;text-align:center}table.page-table thead[data-v-613b66e3]{color:#909399}table.page-table thead tr[data-v-613b66e3]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-613b66e3]{padding:10px 16px}table.page-table tbody tr[data-v-613b66e3]:hover{background-color:#eeee}table.page-table tbody tr[data-v-613b66e3]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-613b66e3]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-613b66e3]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-613b66e3]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-613b66e3]{width:100px}table.popups-table th.checkbox[data-v-613b66e3]{width:50px;text-align:center}table.popups-table th.setting[data-v-613b66e3]{width:100px;text-align:center}table.popups-table thead[data-v-613b66e3]{color:#eee}table.popups-table thead tr[data-v-613b66e3]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-613b66e3]{padding:10px 16px}table.popups-table tbody tr[data-v-613b66e3]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-613b66e3]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-613b66e3]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-613b66e3]{width:100%}header.header-desktop[data-v-613b66e3]{display:block}header.header-mobile[data-v-613b66e3]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-613b66e3]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-613b66e3]{width:100%;height:100%}header.header-mobile button svg path[data-v-613b66e3]{fill:#fff}nav.sidebar[data-v-613b66e3]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-613b66e3]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-613b66e3]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-613b66e3]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-613b66e3]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-613b66e3]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-613b66e3]{color:#fff}nav.sidebar .container .children[data-v-613b66e3]{padding-left:30px}@-moz-keyframes tada-613b66e3{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-613b66e3{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-613b66e3{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-613b66e3{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-613b66e3]{animation:dialogEnter-613b66e3 .3s linear forwards}.dialog-leave-active[data-v-613b66e3]{animation:dialogLeave-613b66e3 .3s linear forwards}@keyframes dialogEnter-613b66e3{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-613b66e3{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-613b66e3]{animation:dialogEnter-613b66e3 .2s linear forwards}.dialog1-leave-active[data-v-613b66e3]{animation:dialogLeave-613b66e3 .2s linear forwards}@keyframes rotateEnter-613b66e3{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-613b66e3]{animation:rotateEnter-613b66e3 .7s;position:relative}.rotate-leave-active[data-v-613b66e3]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-613b66e3{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-613b66e3{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-613b66e3]{animation:slideOutTop-613b66e3 .5s linear forwards}.slide-top-leave-active[data-v-613b66e3],.slide-bottom-enter-active[data-v-613b66e3]{animation:slideOutBottom-613b66e3 .5s linear forwards}@keyframes slideInLeft-613b66e3{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-613b66e3{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-613b66e3]{animation:slideInLeft-613b66e3 .3s linear forwards}.slide-left-leave-active[data-v-613b66e3]{animation:slideInRight-613b66e3 .3s linear forwards}@keyframes slideOutLeft-613b66e3{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-613b66e3{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-613b66e3]{animation:slideOutLeft-613b66e3 .3s linear forwards}.slide-right-leave-active[data-v-613b66e3]{animation:slideOutRight-613b66e3 .3s linear forwards}@keyframes bganimation-613b66e3{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-613b66e3{0%{height:0}to{height:100px}}@keyframes fadeEnd-613b66e3{0%{height:100%}to{height:0}}.fade-enter-active[data-v-613b66e3]{animation:fadeStart-613b66e3 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-613b66e3]{animation:fadeEnd-613b66e3 .1s linear forwards;overflow:hidden}.text-container_item_title[data-v-613b66e3]{width:200px}.text-container_item_flex .text-container_item_block[data-v-613b66e3]{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between}.text-container_item_flex a[data-v-613b66e3]{font-size:14px}.text-container_item_flex a[href^=h][data-v-613b66e3]{color:#418cff}.text-container_item_flex a[href^=h][data-v-613b66e3]:hover{opacity:.8}.text-container_item_flex a.setting[data-v-613b66e3]{border-radius:4px;font-size:12px;font-family:PingFangSC-Medium,PingFang SC;font-weight:500;color:#418cff;display:inline-block;border:1px solid #418cff;cursor:pointer;background:none;padding:0 6px;height:26px;line-height:26px;margin-left:2rem}.text-container_item_flex a.setting[data-v-613b66e3]:hover{background-color:#418cff;color:#fff;transition:.2s}.text-container_item_flex button[data-v-613b66e3]{border-radius:4px;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;font-weight:500;color:#418cff;display:inline-block;padding:6px 16px;border:1px solid #418cff;cursor:pointer;background:none}.text-container_item_flex button[data-v-613b66e3]:hover{background-color:#418cff;color:#fff;transition:.2s}.text-container_item_flex p.info-desc[data-v-613b66e3]{vertical-align:middle;line-height:22px}.text-container_item_flex p.info-desc svg[data-v-613b66e3]{width:16px;height:16px;opacity:.5;vertical-align:sub}@keyframes turns-7b2637d8{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-7b2637d8]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-7b2637d8]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-7b2637d8]{color:#f9ad1e}.notice_info li[data-v-7b2637d8]{font-size:14px;list-style:revert}.text-container[data-v-7b2637d8]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-7b2637d8]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-7b2637d8]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-7b2637d8]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-7b2637d8]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-7b2637d8]{width:100%}.text-container .text-container_item p.info-desc[data-v-7b2637d8]{width:100%;color:#999;font-size:14px}.page-container[data-v-7b2637d8]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-7b2637d8]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-7b2637d8]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-7b2637d8]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-7b2637d8],.page-container .page-flex .page-sidebar a[data-v-7b2637d8]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-7b2637d8]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-7b2637d8]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-7b2637d8]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-7b2637d8]{border-radius:0;padding:1rem}ul.ul-container[data-v-7b2637d8]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-7b2637d8]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-7b2637d8]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-7b2637d8]{width:100%}form.form-container[data-v-7b2637d8]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-7b2637d8]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-7b2637d8]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-7b2637d8]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-7b2637d8]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-7b2637d8],form.form-container .label-value select[data-v-7b2637d8]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-7b2637d8]:focus,form.form-container .label-value select[data-v-7b2637d8]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-7b2637d8]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-7b2637d8]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-7b2637d8],form.form-container .label-value input[type=radio][data-v-7b2637d8]{width:auto}form.form-container .label-value input[type=radio][data-v-7b2637d8]{margin:0 4px 0 0}form.form-container .label-value input[data-v-7b2637d8]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-7b2637d8]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-7b2637d8]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-7b2637d8]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-7b2637d8]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-7b2637d8]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-7b2637d8]:hover{background-color:#747474}form.form-container .label-msg[data-v-7b2637d8]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-7b2637d8]{color:#f9ad1e}form.form-container .label-flex[data-v-7b2637d8]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-7b2637d8]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-7b2637d8]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-7b2637d8]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-7b2637d8]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-7b2637d8]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-7b2637d8]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-7b2637d8],form.form-container1 .label-value select[data-v-7b2637d8]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-7b2637d8]:focus,form.form-container1 .label-value select[data-v-7b2637d8]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-7b2637d8]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-7b2637d8],form.form-container1 .label-value input[type=radio][data-v-7b2637d8]{width:auto}form.form-container1 .label-value input[type=radio][data-v-7b2637d8]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-7b2637d8]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-7b2637d8]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-7b2637d8]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-7b2637d8]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-7b2637d8]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-7b2637d8]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-7b2637d8]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-7b2637d8]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-7b2637d8]{color:#f9ad1e}form.form-container1 .label-flex[data-v-7b2637d8]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-7b2637d8]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-7b2637d8]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-7b2637d8]{width:100px}table.page-table th.checkbox[data-v-7b2637d8]{width:50px;text-align:center}table.page-table th.setting[data-v-7b2637d8]{width:100px;text-align:center}table.page-table thead[data-v-7b2637d8]{color:#909399}table.page-table thead tr[data-v-7b2637d8]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-7b2637d8]{padding:10px 16px}table.page-table tbody tr[data-v-7b2637d8]:hover{background-color:#eeee}table.page-table tbody tr[data-v-7b2637d8]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-7b2637d8]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-7b2637d8]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-7b2637d8]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-7b2637d8]{width:100px}table.popups-table th.checkbox[data-v-7b2637d8]{width:50px;text-align:center}table.popups-table th.setting[data-v-7b2637d8]{width:100px;text-align:center}table.popups-table thead[data-v-7b2637d8]{color:#eee}table.popups-table thead tr[data-v-7b2637d8]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-7b2637d8]{padding:10px 16px}table.popups-table tbody tr[data-v-7b2637d8]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-7b2637d8]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-7b2637d8]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-7b2637d8]{width:100%}header.header-desktop[data-v-7b2637d8]{display:block}header.header-mobile[data-v-7b2637d8]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-7b2637d8]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-7b2637d8]{width:100%;height:100%}header.header-mobile button svg path[data-v-7b2637d8]{fill:#fff}nav.sidebar[data-v-7b2637d8]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-7b2637d8]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-7b2637d8]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-7b2637d8]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-7b2637d8]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-7b2637d8]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-7b2637d8]{color:#fff}nav.sidebar .container .children[data-v-7b2637d8]{padding-left:30px}@-moz-keyframes tada-7b2637d8{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-7b2637d8{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-7b2637d8{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-7b2637d8{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-7b2637d8]{animation:dialogEnter-7b2637d8 .3s linear forwards}.dialog-leave-active[data-v-7b2637d8]{animation:dialogLeave-7b2637d8 .3s linear forwards}@keyframes dialogEnter-7b2637d8{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-7b2637d8{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-7b2637d8]{animation:dialogEnter-7b2637d8 .2s linear forwards}.dialog1-leave-active[data-v-7b2637d8]{animation:dialogLeave-7b2637d8 .2s linear forwards}@keyframes rotateEnter-7b2637d8{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-7b2637d8]{animation:rotateEnter-7b2637d8 .7s;position:relative}.rotate-leave-active[data-v-7b2637d8]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-7b2637d8{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-7b2637d8{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-7b2637d8]{animation:slideOutTop-7b2637d8 .5s linear forwards}.slide-top-leave-active[data-v-7b2637d8],.slide-bottom-enter-active[data-v-7b2637d8]{animation:slideOutBottom-7b2637d8 .5s linear forwards}@keyframes slideInLeft-7b2637d8{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-7b2637d8{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-7b2637d8]{animation:slideInLeft-7b2637d8 .3s linear forwards}.slide-left-leave-active[data-v-7b2637d8]{animation:slideInRight-7b2637d8 .3s linear forwards}@keyframes slideOutLeft-7b2637d8{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-7b2637d8{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-7b2637d8]{animation:slideOutLeft-7b2637d8 .3s linear forwards}.slide-right-leave-active[data-v-7b2637d8]{animation:slideOutRight-7b2637d8 .3s linear forwards}@keyframes bganimation-7b2637d8{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-7b2637d8{0%{height:0}to{height:100px}}@keyframes fadeEnd-7b2637d8{0%{height:100%}to{height:0}}.fade-enter-active[data-v-7b2637d8]{animation:fadeStart-7b2637d8 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-7b2637d8]{animation:fadeEnd-7b2637d8 .1s linear forwards;overflow:hidden}form[data-v-7b2637d8]{width:740px;height:100%;display:table;margin:0 auto;padding-top:30px}form .f[data-v-7b2637d8]{display:table-cell;width:200px;color:#007aff;text-align:right;vertical-align:top;color:#92650f}form .f .titleMain[data-v-7b2637d8]{line-height:50px;font-size:40px;font-weight:700}form .f .titleSub[data-v-7b2637d8]{font-size:22px}form .r[data-v-7b2637d8]{width:calc(100% - 250px);padding-left:15px;display:table-cell}form .title[data-v-7b2637d8]{font-size:1.4em;color:#eee;margin:20px 0 30px;text-align:left;font-weight:bolder;width:100%}form .title span[data-v-7b2637d8]{display:block;color:#92650f;font-size:1.4em;font-weight:700;margin-bottom:4px}form .selector-container .selector-container_item[data-v-7b2637d8]{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;border-bottom:1px solid #999;padding:1rem 0;width:100%;color:#ccc;cursor:pointer}form .selector-container .selector-container_item[data-v-7b2637d8]:hover{color:#92650f}form .selector-container .selector-container_item:hover .narrow-container[data-v-7b2637d8] svg.icon path{fill:#92650f}form .selector-container .selector-container_item .select-bar[data-v-7b2637d8]{font-size:1.6em;font-weight:700;cursor:pointer}form .selector-container .selector-container_item .narrow-container[data-v-7b2637d8]{width:24px;height:24px}form .selector-container .selector-container_item .narrow-container[data-v-7b2637d8] svg.icon{width:100%;height:100%}form .selector-container .selector-container_item .narrow-container[data-v-7b2637d8] svg.icon path{fill:#ccc}form .btns[data-v-7b2637d8]{width:100%;margin-top:50px;display:flex;flex-wrap:wrap;justify-content:space-between}form .btns button[data-v-7b2637d8]{display:inline-block;width:40%;height:46px;line-height:46px;font-size:1em;cursor:pointer;border-radius:35px}form .btns button[data-v-7b2637d8]:hover{opacity:.9}form .btns button.back[data-v-7b2637d8]{color:#007aff;background:#FFF}form .btns button.next[data-v-7b2637d8]{color:#fff;background:rgb(255,165,35)}@keyframes turns-041c9ebc{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-041c9ebc]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-041c9ebc]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-041c9ebc]{color:#f9ad1e}.notice_info li[data-v-041c9ebc]{font-size:14px;list-style:revert}.text-container[data-v-041c9ebc]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-041c9ebc]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-041c9ebc]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-041c9ebc]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-041c9ebc]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-041c9ebc]{width:100%}.text-container .text-container_item p.info-desc[data-v-041c9ebc]{width:100%;color:#999;font-size:14px}.page-container[data-v-041c9ebc]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-041c9ebc]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-041c9ebc]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-041c9ebc]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-041c9ebc],.page-container .page-flex .page-sidebar a[data-v-041c9ebc]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-041c9ebc]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-041c9ebc]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-041c9ebc]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-041c9ebc]{border-radius:0;padding:1rem}ul.ul-container[data-v-041c9ebc]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-041c9ebc]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-041c9ebc]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-041c9ebc]{width:100%}form.form-container[data-v-041c9ebc]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-041c9ebc]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-041c9ebc]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-041c9ebc]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-041c9ebc]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-041c9ebc],form.form-container .label-value select[data-v-041c9ebc]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-041c9ebc]:focus,form.form-container .label-value select[data-v-041c9ebc]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-041c9ebc]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-041c9ebc]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-041c9ebc],form.form-container .label-value input[type=radio][data-v-041c9ebc]{width:auto}form.form-container .label-value input[type=radio][data-v-041c9ebc]{margin:0 4px 0 0}form.form-container .label-value input[data-v-041c9ebc]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-041c9ebc]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-041c9ebc]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-041c9ebc]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-041c9ebc]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-041c9ebc]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-041c9ebc]:hover{background-color:#747474}form.form-container .label-msg[data-v-041c9ebc]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-041c9ebc]{color:#f9ad1e}form.form-container .label-flex[data-v-041c9ebc]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-041c9ebc]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-041c9ebc]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-041c9ebc]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-041c9ebc]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-041c9ebc]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-041c9ebc]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-041c9ebc],form.form-container1 .label-value select[data-v-041c9ebc]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-041c9ebc]:focus,form.form-container1 .label-value select[data-v-041c9ebc]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-041c9ebc]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-041c9ebc],form.form-container1 .label-value input[type=radio][data-v-041c9ebc]{width:auto}form.form-container1 .label-value input[type=radio][data-v-041c9ebc]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-041c9ebc]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-041c9ebc]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-041c9ebc]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-041c9ebc]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-041c9ebc]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-041c9ebc]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-041c9ebc]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-041c9ebc]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-041c9ebc]{color:#f9ad1e}form.form-container1 .label-flex[data-v-041c9ebc]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-041c9ebc]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-041c9ebc]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-041c9ebc]{width:100px}table.page-table th.checkbox[data-v-041c9ebc]{width:50px;text-align:center}table.page-table th.setting[data-v-041c9ebc]{width:100px;text-align:center}table.page-table thead[data-v-041c9ebc]{color:#909399}table.page-table thead tr[data-v-041c9ebc]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-041c9ebc]{padding:10px 16px}table.page-table tbody tr[data-v-041c9ebc]:hover{background-color:#eeee}table.page-table tbody tr[data-v-041c9ebc]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-041c9ebc]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-041c9ebc]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-041c9ebc]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-041c9ebc]{width:100px}table.popups-table th.checkbox[data-v-041c9ebc]{width:50px;text-align:center}table.popups-table th.setting[data-v-041c9ebc]{width:100px;text-align:center}table.popups-table thead[data-v-041c9ebc]{color:#eee}table.popups-table thead tr[data-v-041c9ebc]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-041c9ebc]{padding:10px 16px}table.popups-table tbody tr[data-v-041c9ebc]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-041c9ebc]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-041c9ebc]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-041c9ebc]{width:100%}header.header-desktop[data-v-041c9ebc]{display:block}header.header-mobile[data-v-041c9ebc]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-041c9ebc]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-041c9ebc]{width:100%;height:100%}header.header-mobile button svg path[data-v-041c9ebc]{fill:#fff}nav.sidebar[data-v-041c9ebc]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-041c9ebc]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-041c9ebc]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-041c9ebc]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-041c9ebc]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-041c9ebc]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-041c9ebc]{color:#fff}nav.sidebar .container .children[data-v-041c9ebc]{padding-left:30px}@-moz-keyframes tada-041c9ebc{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-041c9ebc{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-041c9ebc{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-041c9ebc{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-041c9ebc]{animation:dialogEnter-041c9ebc .3s linear forwards}.dialog-leave-active[data-v-041c9ebc]{animation:dialogLeave-041c9ebc .3s linear forwards}@keyframes dialogEnter-041c9ebc{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-041c9ebc{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-041c9ebc]{animation:dialogEnter-041c9ebc .2s linear forwards}.dialog1-leave-active[data-v-041c9ebc]{animation:dialogLeave-041c9ebc .2s linear forwards}@keyframes rotateEnter-041c9ebc{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-041c9ebc]{animation:rotateEnter-041c9ebc .7s;position:relative}.rotate-leave-active[data-v-041c9ebc]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-041c9ebc{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-041c9ebc{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-041c9ebc]{animation:slideOutTop-041c9ebc .5s linear forwards}.slide-top-leave-active[data-v-041c9ebc],.slide-bottom-enter-active[data-v-041c9ebc]{animation:slideOutBottom-041c9ebc .5s linear forwards}@keyframes slideInLeft-041c9ebc{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-041c9ebc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-041c9ebc]{animation:slideInLeft-041c9ebc .3s linear forwards}.slide-left-leave-active[data-v-041c9ebc]{animation:slideInRight-041c9ebc .3s linear forwards}@keyframes slideOutLeft-041c9ebc{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-041c9ebc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-041c9ebc]{animation:slideOutLeft-041c9ebc .3s linear forwards}.slide-right-leave-active[data-v-041c9ebc]{animation:slideOutRight-041c9ebc .3s linear forwards}@keyframes bganimation-041c9ebc{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-041c9ebc{0%{height:0}to{height:100px}}@keyframes fadeEnd-041c9ebc{0%{height:100%}to{height:0}}.fade-enter-active[data-v-041c9ebc]{animation:fadeStart-041c9ebc .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-041c9ebc]{animation:fadeEnd-041c9ebc .1s linear forwards;overflow:hidden}#wizard[data-v-041c9ebc]{width:100%;height:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;align-content:center}#wizard h1.wizard_title[data-v-041c9ebc]{font-size:2.6rem;margin:0 46px 50px;color:#fff}#wizard .wizard_body[data-v-041c9ebc]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}#wizard .wizard_body .wizard-item[data-v-041c9ebc]{margin:0 3rem;text-align:center;cursor:pointer}#wizard .wizard_body .wizard-item[data-v-041c9ebc]:hover{transition:.3s;transform:scale(1.1)}#wizard .wizard_body .wizard-item .wizard-item_icon[data-v-041c9ebc]{background-color:#eee;border-radius:1rem;padding:2rem}#wizard .wizard_body .wizard-item .wizard-item_icon svg.icon[data-v-041c9ebc]{width:100%;height:100%}#wizard .wizard_body .wizard-item .wizard-item_name[data-v-041c9ebc]{margin:1rem 0;color:#fff;font-size:2rem;font-weight:700}#wizard .wizard_body .wizard-item[disabled][data-v-041c9ebc]{cursor:not-allowed}@keyframes turns-72afa128{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-72afa128]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-72afa128]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-72afa128]{color:#f9ad1e}.notice_info li[data-v-72afa128]{font-size:14px;list-style:revert}.text-container[data-v-72afa128]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-72afa128]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-72afa128]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-72afa128]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-72afa128]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-72afa128]{width:100%}.text-container .text-container_item p.info-desc[data-v-72afa128]{width:100%;color:#999;font-size:14px}.page-container[data-v-72afa128]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-72afa128]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-72afa128]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-72afa128]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-72afa128],.page-container .page-flex .page-sidebar a[data-v-72afa128]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-72afa128]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-72afa128]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-72afa128]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-72afa128]{border-radius:0;padding:1rem}ul.ul-container[data-v-72afa128]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-72afa128]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-72afa128]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-72afa128]{width:100%}form.form-container[data-v-72afa128]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-72afa128]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-72afa128]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-72afa128]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-72afa128]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-72afa128],form.form-container .label-value select[data-v-72afa128]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-72afa128]:focus,form.form-container .label-value select[data-v-72afa128]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-72afa128]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-72afa128]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-72afa128],form.form-container .label-value input[type=radio][data-v-72afa128]{width:auto}form.form-container .label-value input[type=radio][data-v-72afa128]{margin:0 4px 0 0}form.form-container .label-value input[data-v-72afa128]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-72afa128]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-72afa128]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-72afa128]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-72afa128]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-72afa128]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-72afa128]:hover{background-color:#747474}form.form-container .label-msg[data-v-72afa128]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-72afa128]{color:#f9ad1e}form.form-container .label-flex[data-v-72afa128]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-72afa128]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-72afa128]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-72afa128]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-72afa128]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-72afa128]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-72afa128]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-72afa128],form.form-container1 .label-value select[data-v-72afa128]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-72afa128]:focus,form.form-container1 .label-value select[data-v-72afa128]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-72afa128]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-72afa128],form.form-container1 .label-value input[type=radio][data-v-72afa128]{width:auto}form.form-container1 .label-value input[type=radio][data-v-72afa128]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-72afa128]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-72afa128]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-72afa128]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-72afa128]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-72afa128]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-72afa128]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-72afa128]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-72afa128]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-72afa128]{color:#f9ad1e}form.form-container1 .label-flex[data-v-72afa128]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-72afa128]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-72afa128]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-72afa128]{width:100px}table.page-table th.checkbox[data-v-72afa128]{width:50px;text-align:center}table.page-table th.setting[data-v-72afa128]{width:100px;text-align:center}table.page-table thead[data-v-72afa128]{color:#909399}table.page-table thead tr[data-v-72afa128]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-72afa128]{padding:10px 16px}table.page-table tbody tr[data-v-72afa128]:hover{background-color:#eeee}table.page-table tbody tr[data-v-72afa128]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-72afa128]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-72afa128]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-72afa128]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-72afa128]{width:100px}table.popups-table th.checkbox[data-v-72afa128]{width:50px;text-align:center}table.popups-table th.setting[data-v-72afa128]{width:100px;text-align:center}table.popups-table thead[data-v-72afa128]{color:#eee}table.popups-table thead tr[data-v-72afa128]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-72afa128]{padding:10px 16px}table.popups-table tbody tr[data-v-72afa128]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-72afa128]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-72afa128]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-72afa128]{width:100%}header.header-desktop[data-v-72afa128]{display:block}header.header-mobile[data-v-72afa128]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-72afa128]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-72afa128]{width:100%;height:100%}header.header-mobile button svg path[data-v-72afa128]{fill:#fff}nav.sidebar[data-v-72afa128]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-72afa128]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-72afa128]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-72afa128]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-72afa128]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-72afa128]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-72afa128]{color:#fff}nav.sidebar .container .children[data-v-72afa128]{padding-left:30px}@-moz-keyframes tada-72afa128{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-72afa128{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-72afa128{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-72afa128{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-72afa128]{animation:dialogEnter-72afa128 .3s linear forwards}.dialog-leave-active[data-v-72afa128]{animation:dialogLeave-72afa128 .3s linear forwards}@keyframes dialogEnter-72afa128{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-72afa128{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-72afa128]{animation:dialogEnter-72afa128 .2s linear forwards}.dialog1-leave-active[data-v-72afa128]{animation:dialogLeave-72afa128 .2s linear forwards}@keyframes rotateEnter-72afa128{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-72afa128]{animation:rotateEnter-72afa128 .7s;position:relative}.rotate-leave-active[data-v-72afa128]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-72afa128{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-72afa128{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-72afa128]{animation:slideOutTop-72afa128 .5s linear forwards}.slide-top-leave-active[data-v-72afa128],.slide-bottom-enter-active[data-v-72afa128]{animation:slideOutBottom-72afa128 .5s linear forwards}@keyframes slideInLeft-72afa128{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-72afa128{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-72afa128]{animation:slideInLeft-72afa128 .3s linear forwards}.slide-left-leave-active[data-v-72afa128]{animation:slideInRight-72afa128 .3s linear forwards}@keyframes slideOutLeft-72afa128{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-72afa128{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-72afa128]{animation:slideOutLeft-72afa128 .3s linear forwards}.slide-right-leave-active[data-v-72afa128]{animation:slideOutRight-72afa128 .3s linear forwards}@keyframes bganimation-72afa128{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-72afa128{0%{height:0}to{height:100px}}@keyframes fadeEnd-72afa128{0%{height:100%}to{height:0}}.fade-enter-active[data-v-72afa128]{animation:fadeStart-72afa128 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-72afa128]{animation:fadeEnd-72afa128 .1s linear forwards;overflow:hidden}form[data-v-72afa128]{width:600px;height:100%;display:flex;flex-wrap:wrap;align-items:flex-start;align-content:flex-start;justify-content:center;margin:0 auto}form .title[data-v-72afa128]{font-size:1.4em;color:#eee;margin:30px 0;text-align:left;font-weight:bolder;width:100%}form .title span[data-v-72afa128]{display:block;color:#92650f;font-size:1.4em;font-weight:700;margin-bottom:4px}form .form-item[data-v-72afa128]{display:block;width:100%}form .form-item span.name[data-v-72afa128]{font-size:1.6em;color:#ccc;display:flex;justify-content:space-between;align-items:center;margin:30px 0 20px;width:100%}form .form-item label[data-v-72afa128]{display:block;width:100%}form .form-item label input[data-v-72afa128]{width:100%;height:52px;border-radius:35px;padding:0 1.25rem;font-size:1.25em;background:rgba(48,48,48,.2);border:1px solid #DBDBDB;color:#ccc}form .form-item label input[data-v-72afa128]:focus{transition:1s;border:1px solid rgb(255,165,35)}form .btns[data-v-72afa128]{width:100%;margin-top:50px;display:flex;flex-wrap:wrap;justify-content:space-between}form .btns button[data-v-72afa128]{display:inline-block;width:40%;height:46px;line-height:46px;font-size:1.3em;cursor:pointer;border-radius:35px}form .btns button[data-v-72afa128]:hover{opacity:.9}form .btns button.back[data-v-72afa128]{color:#007aff;background:#FFF}form .btns button.next[data-v-72afa128]{color:#fff;background:rgb(255,165,35)}form .target[data-v-72afa128]{width:100%;text-align:center;font-size:1em;color:#eee;margin-top:50px;cursor:pointer}form .target[data-v-72afa128]:hover{color:#ffa523}@keyframes turns-56e86acc{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-56e86acc]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-56e86acc]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-56e86acc]{color:#f9ad1e}.notice_info li[data-v-56e86acc]{font-size:14px;list-style:revert}.text-container[data-v-56e86acc]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-56e86acc]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-56e86acc]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-56e86acc]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-56e86acc]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-56e86acc]{width:100%}.text-container .text-container_item p.info-desc[data-v-56e86acc]{width:100%;color:#999;font-size:14px}.page-container[data-v-56e86acc]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-56e86acc]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-56e86acc]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-56e86acc]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-56e86acc],.page-container .page-flex .page-sidebar a[data-v-56e86acc]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-56e86acc]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-56e86acc]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-56e86acc]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-56e86acc]{border-radius:0;padding:1rem}ul.ul-container[data-v-56e86acc]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-56e86acc]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-56e86acc]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-56e86acc]{width:100%}form.form-container[data-v-56e86acc]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-56e86acc]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-56e86acc]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-56e86acc]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-56e86acc]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-56e86acc],form.form-container .label-value select[data-v-56e86acc]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-56e86acc]:focus,form.form-container .label-value select[data-v-56e86acc]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-56e86acc]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-56e86acc]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-56e86acc],form.form-container .label-value input[type=radio][data-v-56e86acc]{width:auto}form.form-container .label-value input[type=radio][data-v-56e86acc]{margin:0 4px 0 0}form.form-container .label-value input[data-v-56e86acc]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-56e86acc]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-56e86acc]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-56e86acc]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-56e86acc]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-56e86acc]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-56e86acc]:hover{background-color:#747474}form.form-container .label-msg[data-v-56e86acc]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-56e86acc]{color:#f9ad1e}form.form-container .label-flex[data-v-56e86acc]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-56e86acc]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-56e86acc]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-56e86acc]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-56e86acc]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-56e86acc]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-56e86acc]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-56e86acc],form.form-container1 .label-value select[data-v-56e86acc]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-56e86acc]:focus,form.form-container1 .label-value select[data-v-56e86acc]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-56e86acc]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-56e86acc],form.form-container1 .label-value input[type=radio][data-v-56e86acc]{width:auto}form.form-container1 .label-value input[type=radio][data-v-56e86acc]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-56e86acc]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-56e86acc]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-56e86acc]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-56e86acc]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-56e86acc]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-56e86acc]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-56e86acc]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-56e86acc]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-56e86acc]{color:#f9ad1e}form.form-container1 .label-flex[data-v-56e86acc]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-56e86acc]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-56e86acc]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-56e86acc]{width:100px}table.page-table th.checkbox[data-v-56e86acc]{width:50px;text-align:center}table.page-table th.setting[data-v-56e86acc]{width:100px;text-align:center}table.page-table thead[data-v-56e86acc]{color:#909399}table.page-table thead tr[data-v-56e86acc]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-56e86acc]{padding:10px 16px}table.page-table tbody tr[data-v-56e86acc]:hover{background-color:#eeee}table.page-table tbody tr[data-v-56e86acc]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-56e86acc]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-56e86acc]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-56e86acc]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-56e86acc]{width:100px}table.popups-table th.checkbox[data-v-56e86acc]{width:50px;text-align:center}table.popups-table th.setting[data-v-56e86acc]{width:100px;text-align:center}table.popups-table thead[data-v-56e86acc]{color:#eee}table.popups-table thead tr[data-v-56e86acc]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-56e86acc]{padding:10px 16px}table.popups-table tbody tr[data-v-56e86acc]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-56e86acc]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-56e86acc]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-56e86acc]{width:100%}header.header-desktop[data-v-56e86acc]{display:block}header.header-mobile[data-v-56e86acc]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-56e86acc]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-56e86acc]{width:100%;height:100%}header.header-mobile button svg path[data-v-56e86acc]{fill:#fff}nav.sidebar[data-v-56e86acc]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-56e86acc]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-56e86acc]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-56e86acc]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-56e86acc]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-56e86acc]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-56e86acc]{color:#fff}nav.sidebar .container .children[data-v-56e86acc]{padding-left:30px}@-moz-keyframes tada-56e86acc{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-56e86acc{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-56e86acc{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-56e86acc{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-56e86acc]{animation:dialogEnter-56e86acc .3s linear forwards}.dialog-leave-active[data-v-56e86acc]{animation:dialogLeave-56e86acc .3s linear forwards}@keyframes dialogEnter-56e86acc{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-56e86acc{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-56e86acc]{animation:dialogEnter-56e86acc .2s linear forwards}.dialog1-leave-active[data-v-56e86acc]{animation:dialogLeave-56e86acc .2s linear forwards}@keyframes rotateEnter-56e86acc{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-56e86acc]{animation:rotateEnter-56e86acc .7s;position:relative}.rotate-leave-active[data-v-56e86acc]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-56e86acc{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-56e86acc{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-56e86acc]{animation:slideOutTop-56e86acc .5s linear forwards}.slide-top-leave-active[data-v-56e86acc],.slide-bottom-enter-active[data-v-56e86acc]{animation:slideOutBottom-56e86acc .5s linear forwards}@keyframes slideInLeft-56e86acc{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-56e86acc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-56e86acc]{animation:slideInLeft-56e86acc .3s linear forwards}.slide-left-leave-active[data-v-56e86acc]{animation:slideInRight-56e86acc .3s linear forwards}@keyframes slideOutLeft-56e86acc{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-56e86acc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-56e86acc]{animation:slideOutLeft-56e86acc .3s linear forwards}.slide-right-leave-active[data-v-56e86acc]{animation:slideOutRight-56e86acc .3s linear forwards}@keyframes bganimation-56e86acc{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-56e86acc{0%{height:0}to{height:100px}}@keyframes fadeEnd-56e86acc{0%{height:100%}to{height:0}}.fade-enter-active[data-v-56e86acc]{animation:fadeStart-56e86acc .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-56e86acc]{animation:fadeEnd-56e86acc .1s linear forwards;overflow:hidden}form[data-v-56e86acc]{width:600px;height:100%;display:flex;flex-wrap:wrap;align-items:flex-start;justify-content:center;align-content:flex-start;margin:0 auto}form .title[data-v-56e86acc]{font-size:1.4em;color:#eee;margin:30px 0;text-align:left;font-weight:bolder;width:100%}form .title span[data-v-56e86acc]{display:block;color:#92650f;font-size:1.4em;font-weight:700;margin-bottom:4px}form .form-item[data-v-56e86acc]{display:block;width:100%}form .form-item span.name[data-v-56e86acc]{font-size:1.6em;color:#ccc;display:flex;justify-content:space-between;align-items:center;margin:30px 0 20px;width:100%}form .form-item label[data-v-56e86acc]{display:block;width:100%}form .form-item label input[data-v-56e86acc],form .form-item label select[data-v-56e86acc]{width:100%;height:52px;font-size:1.25em;background:rgba(48,48,48,.2);border:1px solid #DBDBDB;color:#ccc}form .form-item label input[data-v-56e86acc]:focus,form .form-item label select[data-v-56e86acc]:focus{transition:1s;border:1px solid rgb(255,165,35)}form .form-item label input[data-v-56e86acc]{border-radius:35px;padding:0 1.25rem}form .form-item label select[data-v-56e86acc]{border-radius:3px;padding:0 .5rem}form .btns[data-v-56e86acc]{width:100%;margin-top:50px;display:flex;flex-wrap:wrap;justify-content:space-between}form .btns button[data-v-56e86acc]{display:inline-block;width:40%;height:46px;line-height:46px;font-size:1.3em;cursor:pointer;border-radius:35px}form .btns button[data-v-56e86acc]:hover{opacity:.9}form .btns button.back[data-v-56e86acc]{color:#007aff;background:#FFF}form .btns button.next[data-v-56e86acc]{color:#fff;background:rgb(255,165,35)}form .target[data-v-56e86acc]{width:100%;text-align:center;font-size:1em;color:#eee;margin-top:50px;cursor:pointer}form .target[data-v-56e86acc]:hover{color:#ffa523}@keyframes turns-06e7b595{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-06e7b595]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-06e7b595]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-06e7b595]{color:#f9ad1e}.notice_info li[data-v-06e7b595]{font-size:14px;list-style:revert}.text-container[data-v-06e7b595]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-06e7b595]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-06e7b595]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-06e7b595]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-06e7b595]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-06e7b595]{width:100%}.text-container .text-container_item p.info-desc[data-v-06e7b595]{width:100%;color:#999;font-size:14px}.page-container[data-v-06e7b595]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-06e7b595]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-06e7b595]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-06e7b595]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-06e7b595],.page-container .page-flex .page-sidebar a[data-v-06e7b595]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-06e7b595]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-06e7b595]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-06e7b595]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-06e7b595]{border-radius:0;padding:1rem}ul.ul-container[data-v-06e7b595]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-06e7b595]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-06e7b595]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-06e7b595]{width:100%}form.form-container[data-v-06e7b595]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-06e7b595]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-06e7b595]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-06e7b595]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-06e7b595]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-06e7b595],form.form-container .label-value select[data-v-06e7b595]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-06e7b595]:focus,form.form-container .label-value select[data-v-06e7b595]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-06e7b595]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-06e7b595]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-06e7b595],form.form-container .label-value input[type=radio][data-v-06e7b595]{width:auto}form.form-container .label-value input[type=radio][data-v-06e7b595]{margin:0 4px 0 0}form.form-container .label-value input[data-v-06e7b595]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-06e7b595]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-06e7b595]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-06e7b595]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-06e7b595]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-06e7b595]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-06e7b595]:hover{background-color:#747474}form.form-container .label-msg[data-v-06e7b595]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-06e7b595]{color:#f9ad1e}form.form-container .label-flex[data-v-06e7b595]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-06e7b595]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-06e7b595]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-06e7b595]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-06e7b595]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-06e7b595]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-06e7b595]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-06e7b595],form.form-container1 .label-value select[data-v-06e7b595]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-06e7b595]:focus,form.form-container1 .label-value select[data-v-06e7b595]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-06e7b595]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-06e7b595],form.form-container1 .label-value input[type=radio][data-v-06e7b595]{width:auto}form.form-container1 .label-value input[type=radio][data-v-06e7b595]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-06e7b595]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-06e7b595]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-06e7b595]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-06e7b595]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-06e7b595]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-06e7b595]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-06e7b595]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-06e7b595]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-06e7b595]{color:#f9ad1e}form.form-container1 .label-flex[data-v-06e7b595]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-06e7b595]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-06e7b595]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-06e7b595]{width:100px}table.page-table th.checkbox[data-v-06e7b595]{width:50px;text-align:center}table.page-table th.setting[data-v-06e7b595]{width:100px;text-align:center}table.page-table thead[data-v-06e7b595]{color:#909399}table.page-table thead tr[data-v-06e7b595]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-06e7b595]{padding:10px 16px}table.page-table tbody tr[data-v-06e7b595]:hover{background-color:#eeee}table.page-table tbody tr[data-v-06e7b595]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-06e7b595]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-06e7b595]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-06e7b595]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-06e7b595]{width:100px}table.popups-table th.checkbox[data-v-06e7b595]{width:50px;text-align:center}table.popups-table th.setting[data-v-06e7b595]{width:100px;text-align:center}table.popups-table thead[data-v-06e7b595]{color:#eee}table.popups-table thead tr[data-v-06e7b595]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-06e7b595]{padding:10px 16px}table.popups-table tbody tr[data-v-06e7b595]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-06e7b595]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-06e7b595]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-06e7b595]{width:100%}header.header-desktop[data-v-06e7b595]{display:block}header.header-mobile[data-v-06e7b595]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-06e7b595]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-06e7b595]{width:100%;height:100%}header.header-mobile button svg path[data-v-06e7b595]{fill:#fff}nav.sidebar[data-v-06e7b595]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-06e7b595]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-06e7b595]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-06e7b595]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-06e7b595]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-06e7b595]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-06e7b595]{color:#fff}nav.sidebar .container .children[data-v-06e7b595]{padding-left:30px}@-moz-keyframes tada-06e7b595{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-06e7b595{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-06e7b595{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-06e7b595{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-06e7b595]{animation:dialogEnter-06e7b595 .3s linear forwards}.dialog-leave-active[data-v-06e7b595]{animation:dialogLeave-06e7b595 .3s linear forwards}@keyframes dialogEnter-06e7b595{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-06e7b595{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-06e7b595]{animation:dialogEnter-06e7b595 .2s linear forwards}.dialog1-leave-active[data-v-06e7b595]{animation:dialogLeave-06e7b595 .2s linear forwards}@keyframes rotateEnter-06e7b595{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-06e7b595]{animation:rotateEnter-06e7b595 .7s;position:relative}.rotate-leave-active[data-v-06e7b595]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-06e7b595{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-06e7b595{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-06e7b595]{animation:slideOutTop-06e7b595 .5s linear forwards}.slide-top-leave-active[data-v-06e7b595],.slide-bottom-enter-active[data-v-06e7b595]{animation:slideOutBottom-06e7b595 .5s linear forwards}@keyframes slideInLeft-06e7b595{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-06e7b595{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-06e7b595]{animation:slideInLeft-06e7b595 .3s linear forwards}.slide-left-leave-active[data-v-06e7b595]{animation:slideInRight-06e7b595 .3s linear forwards}@keyframes slideOutLeft-06e7b595{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-06e7b595{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-06e7b595]{animation:slideOutLeft-06e7b595 .3s linear forwards}.slide-right-leave-active[data-v-06e7b595]{animation:slideOutRight-06e7b595 .3s linear forwards}@keyframes bganimation-06e7b595{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-06e7b595{0%{height:0}to{height:100px}}@keyframes fadeEnd-06e7b595{0%{height:100%}to{height:0}}.fade-enter-active[data-v-06e7b595]{animation:fadeStart-06e7b595 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-06e7b595]{animation:fadeEnd-06e7b595 .1s linear forwards;overflow:hidden}#main[data-v-06e7b595]{width:100vw;height:100vh;overflow:overlay;background-color:#1e1e1e}@keyframes turns-37664f80{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-37664f80]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-37664f80]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-37664f80]{color:#f9ad1e}.notice_info li[data-v-37664f80]{font-size:14px;list-style:revert}.text-container[data-v-37664f80]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-37664f80]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-37664f80]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-37664f80]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-37664f80]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-37664f80]{width:100%}.text-container .text-container_item p.info-desc[data-v-37664f80]{width:100%;color:#999;font-size:14px}.page-container[data-v-37664f80]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-37664f80]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-37664f80]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-37664f80]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-37664f80],.page-container .page-flex .page-sidebar a[data-v-37664f80]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-37664f80]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-37664f80]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-37664f80]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-37664f80]{border-radius:0;padding:1rem}ul.ul-container[data-v-37664f80]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-37664f80]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-37664f80]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-37664f80]{width:100%}form.form-container[data-v-37664f80]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-37664f80]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-37664f80]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-37664f80]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-37664f80]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-37664f80],form.form-container .label-value select[data-v-37664f80]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-37664f80]:focus,form.form-container .label-value select[data-v-37664f80]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-37664f80]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-37664f80]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-37664f80],form.form-container .label-value input[type=radio][data-v-37664f80]{width:auto}form.form-container .label-value input[type=radio][data-v-37664f80]{margin:0 4px 0 0}form.form-container .label-value input[data-v-37664f80]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-37664f80]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-37664f80]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-37664f80]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-37664f80]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-37664f80]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-37664f80]:hover{background-color:#747474}form.form-container .label-msg[data-v-37664f80]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-37664f80]{color:#f9ad1e}form.form-container .label-flex[data-v-37664f80]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-37664f80]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-37664f80]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-37664f80]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-37664f80]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-37664f80]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-37664f80]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-37664f80],form.form-container1 .label-value select[data-v-37664f80]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-37664f80]:focus,form.form-container1 .label-value select[data-v-37664f80]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-37664f80]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-37664f80],form.form-container1 .label-value input[type=radio][data-v-37664f80]{width:auto}form.form-container1 .label-value input[type=radio][data-v-37664f80]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-37664f80]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-37664f80]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-37664f80]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-37664f80]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-37664f80]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-37664f80]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-37664f80]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-37664f80]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-37664f80]{color:#f9ad1e}form.form-container1 .label-flex[data-v-37664f80]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-37664f80]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-37664f80]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-37664f80]{width:100px}table.page-table th.checkbox[data-v-37664f80]{width:50px;text-align:center}table.page-table th.setting[data-v-37664f80]{width:100px;text-align:center}table.page-table thead[data-v-37664f80]{color:#909399}table.page-table thead tr[data-v-37664f80]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-37664f80]{padding:10px 16px}table.page-table tbody tr[data-v-37664f80]:hover{background-color:#eeee}table.page-table tbody tr[data-v-37664f80]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-37664f80]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-37664f80]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-37664f80]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-37664f80]{width:100px}table.popups-table th.checkbox[data-v-37664f80]{width:50px;text-align:center}table.popups-table th.setting[data-v-37664f80]{width:100px;text-align:center}table.popups-table thead[data-v-37664f80]{color:#eee}table.popups-table thead tr[data-v-37664f80]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-37664f80]{padding:10px 16px}table.popups-table tbody tr[data-v-37664f80]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-37664f80]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-37664f80]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-37664f80]{width:100%}header.header-desktop[data-v-37664f80]{display:block}header.header-mobile[data-v-37664f80]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-37664f80]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-37664f80]{width:100%;height:100%}header.header-mobile button svg path[data-v-37664f80]{fill:#fff}nav.sidebar[data-v-37664f80]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-37664f80]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-37664f80]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-37664f80]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-37664f80]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-37664f80]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-37664f80]{color:#fff}nav.sidebar .container .children[data-v-37664f80]{padding-left:30px}@-moz-keyframes tada-37664f80{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-37664f80{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-37664f80{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-37664f80{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-37664f80]{animation:dialogEnter-37664f80 .3s linear forwards}.dialog-leave-active[data-v-37664f80]{animation:dialogLeave-37664f80 .3s linear forwards}@keyframes dialogEnter-37664f80{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-37664f80{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-37664f80]{animation:dialogEnter-37664f80 .2s linear forwards}.dialog1-leave-active[data-v-37664f80]{animation:dialogLeave-37664f80 .2s linear forwards}@keyframes rotateEnter-37664f80{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-37664f80]{animation:rotateEnter-37664f80 .7s;position:relative}.rotate-leave-active[data-v-37664f80]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-37664f80{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-37664f80{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-37664f80]{animation:slideOutTop-37664f80 .5s linear forwards}.slide-top-leave-active[data-v-37664f80],.slide-bottom-enter-active[data-v-37664f80]{animation:slideOutBottom-37664f80 .5s linear forwards}@keyframes slideInLeft-37664f80{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-37664f80{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-37664f80]{animation:slideInLeft-37664f80 .3s linear forwards}.slide-left-leave-active[data-v-37664f80]{animation:slideInRight-37664f80 .3s linear forwards}@keyframes slideOutLeft-37664f80{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-37664f80{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-37664f80]{animation:slideOutLeft-37664f80 .3s linear forwards}.slide-right-leave-active[data-v-37664f80]{animation:slideOutRight-37664f80 .3s linear forwards}@keyframes bganimation-37664f80{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-37664f80{0%{height:0}to{height:100px}}@keyframes fadeEnd-37664f80{0%{height:100%}to{height:0}}.fade-enter-active[data-v-37664f80]{animation:fadeStart-37664f80 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-37664f80]{animation:fadeEnd-37664f80 .1s linear forwards;overflow:hidden}.section-app-container[data-v-37664f80]{grid-template-columns:repeat(auto-fill,minmax(190px,1fr))!important}.app-content[data-v-37664f80]{position:relative;width:100%;height:100%;color:#fff;font-style:normal;font-weight:300;text-align:center;padding:2rem;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;cursor:pointer}.app-content:hover .app-icon[data-v-37664f80]{transition:.3s;transform:scale(1.1)}.app-content .app-icon[data-v-37664f80]{width:80px;height:80px;background-color:#fff;padding:.5rem;border-radius:1rem;overflow:hidden}.app-content .app-icon img[data-v-37664f80],.app-content .app-icon svg.icon[data-v-37664f80]{width:100%;height:100%;object-fit:contain}.app-content .app-name[data-v-37664f80]{width:100%;text-align:center;margin-top:.75rem!important;-webkit-box-orient:vertical;display:-webkit-box;overflow:hidden}.app-item:hover .app-footer[data-v-37664f80]{visibility:visible;transition:.3s;opacity:1}.app-footer[data-v-37664f80]{position:absolute;bottom:0;left:0;right:0;width:100%;display:flex;flex-wrap:wrap;height:28px;border-bottom-left-radius:.5rem;border-bottom-right-radius:.5rem;overflow:hidden;visibility:hidden;opacity:0}.app-footer a[data-v-37664f80],.app-footer button[data-v-37664f80]{flex-grow:1;flex-shrink:1;text-align:center;font-size:14px;display:flex;align-items:center;justify-content:center}.app-footer a[data-v-37664f80]:hover,.app-footer button[data-v-37664f80]:hover{opacity:.8}.app-footer .open[data-v-37664f80]{background-color:#636363;color:#fff}.app-footer .setting[data-v-37664f80]{background-color:#6b6b6b;color:#fff}@keyframes turns-c01a3f98{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-c01a3f98]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-c01a3f98]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-c01a3f98]{color:#f9ad1e}.notice_info li[data-v-c01a3f98]{font-size:14px;list-style:revert}.text-container[data-v-c01a3f98]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-c01a3f98]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-c01a3f98]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-c01a3f98]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-c01a3f98]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-c01a3f98]{width:100%}.text-container .text-container_item p.info-desc[data-v-c01a3f98]{width:100%;color:#999;font-size:14px}.page-container[data-v-c01a3f98]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-c01a3f98]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-c01a3f98]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-c01a3f98]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-c01a3f98],.page-container .page-flex .page-sidebar a[data-v-c01a3f98]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-c01a3f98]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-c01a3f98]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-c01a3f98]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-c01a3f98]{border-radius:0;padding:1rem}ul.ul-container[data-v-c01a3f98]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-c01a3f98]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-c01a3f98]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-c01a3f98]{width:100%}form.form-container[data-v-c01a3f98]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-c01a3f98]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-c01a3f98]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-c01a3f98]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-c01a3f98]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-c01a3f98],form.form-container .label-value select[data-v-c01a3f98]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-c01a3f98]:focus,form.form-container .label-value select[data-v-c01a3f98]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-c01a3f98]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-c01a3f98]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-c01a3f98],form.form-container .label-value input[type=radio][data-v-c01a3f98]{width:auto}form.form-container .label-value input[type=radio][data-v-c01a3f98]{margin:0 4px 0 0}form.form-container .label-value input[data-v-c01a3f98]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-c01a3f98]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-c01a3f98]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-c01a3f98]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-c01a3f98]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-c01a3f98]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-c01a3f98]:hover{background-color:#747474}form.form-container .label-msg[data-v-c01a3f98]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-c01a3f98]{color:#f9ad1e}form.form-container .label-flex[data-v-c01a3f98]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-c01a3f98]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-c01a3f98]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-c01a3f98]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-c01a3f98]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-c01a3f98]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-c01a3f98]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-c01a3f98],form.form-container1 .label-value select[data-v-c01a3f98]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-c01a3f98]:focus,form.form-container1 .label-value select[data-v-c01a3f98]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-c01a3f98]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-c01a3f98],form.form-container1 .label-value input[type=radio][data-v-c01a3f98]{width:auto}form.form-container1 .label-value input[type=radio][data-v-c01a3f98]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-c01a3f98]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-c01a3f98]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-c01a3f98]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-c01a3f98]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-c01a3f98]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-c01a3f98]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-c01a3f98]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-c01a3f98]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-c01a3f98]{color:#f9ad1e}form.form-container1 .label-flex[data-v-c01a3f98]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-c01a3f98]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-c01a3f98]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-c01a3f98]{width:100px}table.page-table th.checkbox[data-v-c01a3f98]{width:50px;text-align:center}table.page-table th.setting[data-v-c01a3f98]{width:100px;text-align:center}table.page-table thead[data-v-c01a3f98]{color:#909399}table.page-table thead tr[data-v-c01a3f98]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-c01a3f98]{padding:10px 16px}table.page-table tbody tr[data-v-c01a3f98]:hover{background-color:#eeee}table.page-table tbody tr[data-v-c01a3f98]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-c01a3f98]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-c01a3f98]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-c01a3f98]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-c01a3f98]{width:100px}table.popups-table th.checkbox[data-v-c01a3f98]{width:50px;text-align:center}table.popups-table th.setting[data-v-c01a3f98]{width:100px;text-align:center}table.popups-table thead[data-v-c01a3f98]{color:#eee}table.popups-table thead tr[data-v-c01a3f98]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-c01a3f98]{padding:10px 16px}table.popups-table tbody tr[data-v-c01a3f98]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-c01a3f98]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-c01a3f98]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-c01a3f98]{width:100%}header.header-desktop[data-v-c01a3f98]{display:block}header.header-mobile[data-v-c01a3f98]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-c01a3f98]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-c01a3f98]{width:100%;height:100%}header.header-mobile button svg path[data-v-c01a3f98]{fill:#fff}nav.sidebar[data-v-c01a3f98]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-c01a3f98]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-c01a3f98]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-c01a3f98]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-c01a3f98]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-c01a3f98]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-c01a3f98]{color:#fff}nav.sidebar .container .children[data-v-c01a3f98]{padding-left:30px}@-moz-keyframes tada-c01a3f98{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-c01a3f98{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-c01a3f98{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-c01a3f98{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-c01a3f98]{animation:dialogEnter-c01a3f98 .3s linear forwards}.dialog-leave-active[data-v-c01a3f98]{animation:dialogLeave-c01a3f98 .3s linear forwards}@keyframes dialogEnter-c01a3f98{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-c01a3f98{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-c01a3f98]{animation:dialogEnter-c01a3f98 .2s linear forwards}.dialog1-leave-active[data-v-c01a3f98]{animation:dialogLeave-c01a3f98 .2s linear forwards}@keyframes rotateEnter-c01a3f98{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-c01a3f98]{animation:rotateEnter-c01a3f98 .7s;position:relative}.rotate-leave-active[data-v-c01a3f98]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-c01a3f98{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-c01a3f98{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-c01a3f98]{animation:slideOutTop-c01a3f98 .5s linear forwards}.slide-top-leave-active[data-v-c01a3f98],.slide-bottom-enter-active[data-v-c01a3f98]{animation:slideOutBottom-c01a3f98 .5s linear forwards}@keyframes slideInLeft-c01a3f98{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-c01a3f98{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-c01a3f98]{animation:slideInLeft-c01a3f98 .3s linear forwards}.slide-left-leave-active[data-v-c01a3f98]{animation:slideInRight-c01a3f98 .3s linear forwards}@keyframes slideOutLeft-c01a3f98{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-c01a3f98{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-c01a3f98]{animation:slideOutLeft-c01a3f98 .3s linear forwards}.slide-right-leave-active[data-v-c01a3f98]{animation:slideOutRight-c01a3f98 .3s linear forwards}@keyframes bganimation-c01a3f98{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-c01a3f98{0%{height:0}to{height:100px}}@keyframes fadeEnd-c01a3f98{0%{height:100%}to{height:0}}.fade-enter-active[data-v-c01a3f98]{animation:fadeStart-c01a3f98 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-c01a3f98]{animation:fadeEnd-c01a3f98 .1s linear forwards;overflow:hidden}ul.tabls[data-v-c01a3f98]{display:flex;flex-wrap:wrap;align-items:center}ul.tabls button[data-v-c01a3f98]{padding:0;margin:0;background:none;color:#898989;font-size:1.2rem;margin-right:1rem;cursor:pointer}ul.tabls button[data-v-c01a3f98]:hover{color:#2276f3}ul.tabls button.on[data-v-c01a3f98]{font-size:1.3rem;font-weight:700;color:#2276f3;border-bottom:2px solid rgb(32,117,243)!important}[data-v-c01a3f98] section.tab-content{margin:2rem 0}[data-v-c01a3f98] section.tab-content section.tab-content{margin:1rem 0}[data-v-c01a3f98] section.tab-content .item-label{display:flex;flex-wrap:wrap;align-items:flex-start;align-content:flex-start;width:100%;margin:1rem 0}[data-v-c01a3f98] section.tab-content .item-label .item-label_key{flex:0 0 100%;max-width:100px;text-align:left}[data-v-c01a3f98] section.tab-content .item-label .item-label_value{flex:1;text-align:left}[data-v-c01a3f98] section.tab-content .item-label .item-label_key span,[data-v-c01a3f98] section.tab-content .item-label .item-label_value span{font-size:1em;color:#373737}[data-v-c01a3f98] section.tab-content table{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#373737}[data-v-c01a3f98] section.tab-content table th.uid{width:100px}[data-v-c01a3f98] section.tab-content table th.checkbox{width:50px;text-align:center}[data-v-c01a3f98] section.tab-content table th.setting{width:100px;text-align:center}[data-v-c01a3f98] section.tab-content table thead{color:#373737}[data-v-c01a3f98] section.tab-content table thead tr{width:100%;height:28px;line-height:28px;color:#373737;font-size:14px}[data-v-c01a3f98] section.tab-content table thead tr th{padding:16px 10px}[data-v-c01a3f98] section.tab-content table tbody tr{cursor:pointer;width:100%;color:#373737}[data-v-c01a3f98] section.tab-content table tbody tr th{font-size:14px;padding:16px 10px;vertical-align:top}[data-v-c01a3f98] section.tab-content table tbody tr th a{color:#ff7373}[data-v-c01a3f98] section.tab-content .label-name{display:block;width:100%;margin-bottom:.5rem}[data-v-c01a3f98] section.tab-content .label-value{display:block;width:100%;margin-bottom:1rem}[data-v-c01a3f98] section.tab-content .label-value select,[data-v-c01a3f98] section.tab-content .label-value input{display:block;width:100%;height:36px;background:none;border:1px solid #adadad;color:#1e1e1e;font-size:14px;border-radius:3px;padding:0 10px}[data-v-c01a3f98] section.tab-content .label-value2{display:block;width:100%;margin-bottom:1rem}[data-v-c01a3f98] section.tab-content .label-btns{display:flex;justify-content:flex-end}[data-v-c01a3f98] section.tab-content .label-btns button{width:100px;height:28px;border-radius:3px;font-size:14px}[data-v-c01a3f98] section.tab-content .label-btns button:hover{opacity:.9}[data-v-c01a3f98] section.tab-content .label-btns button.mount{background-color:#70b5ff;color:#fff}@keyframes turns-2815b650{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-2815b650]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-2815b650]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-2815b650]{color:#f9ad1e}.notice_info li[data-v-2815b650]{font-size:14px;list-style:revert}.text-container[data-v-2815b650]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-2815b650]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-2815b650]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-2815b650]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-2815b650]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-2815b650]{width:100%}.text-container .text-container_item p.info-desc[data-v-2815b650]{width:100%;color:#999;font-size:14px}.page-container[data-v-2815b650]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-2815b650]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-2815b650]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-2815b650]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-2815b650],.page-container .page-flex .page-sidebar a[data-v-2815b650]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-2815b650]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-2815b650]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-2815b650]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-2815b650]{border-radius:0;padding:1rem}ul.ul-container[data-v-2815b650]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-2815b650]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-2815b650]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-2815b650]{width:100%}form.form-container[data-v-2815b650]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-2815b650]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-2815b650]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-2815b650]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-2815b650]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-2815b650],form.form-container .label-value select[data-v-2815b650]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-2815b650]:focus,form.form-container .label-value select[data-v-2815b650]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-2815b650]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-2815b650]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-2815b650],form.form-container .label-value input[type=radio][data-v-2815b650]{width:auto}form.form-container .label-value input[type=radio][data-v-2815b650]{margin:0 4px 0 0}form.form-container .label-value input[data-v-2815b650]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-2815b650]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-2815b650]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-2815b650]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-2815b650]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-2815b650]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-2815b650]:hover{background-color:#747474}form.form-container .label-msg[data-v-2815b650]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-2815b650]{color:#f9ad1e}form.form-container .label-flex[data-v-2815b650]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-2815b650]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-2815b650]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-2815b650]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-2815b650]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-2815b650]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-2815b650]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-2815b650],form.form-container1 .label-value select[data-v-2815b650]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-2815b650]:focus,form.form-container1 .label-value select[data-v-2815b650]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-2815b650]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-2815b650],form.form-container1 .label-value input[type=radio][data-v-2815b650]{width:auto}form.form-container1 .label-value input[type=radio][data-v-2815b650]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-2815b650]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-2815b650]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-2815b650]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-2815b650]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-2815b650]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-2815b650]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-2815b650]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-2815b650]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-2815b650]{color:#f9ad1e}form.form-container1 .label-flex[data-v-2815b650]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-2815b650]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-2815b650]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-2815b650]{width:100px}table.page-table th.checkbox[data-v-2815b650]{width:50px;text-align:center}table.page-table th.setting[data-v-2815b650]{width:100px;text-align:center}table.page-table thead[data-v-2815b650]{color:#909399}table.page-table thead tr[data-v-2815b650]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-2815b650]{padding:10px 16px}table.page-table tbody tr[data-v-2815b650]:hover{background-color:#eeee}table.page-table tbody tr[data-v-2815b650]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-2815b650]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-2815b650]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-2815b650]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-2815b650]{width:100px}table.popups-table th.checkbox[data-v-2815b650]{width:50px;text-align:center}table.popups-table th.setting[data-v-2815b650]{width:100px;text-align:center}table.popups-table thead[data-v-2815b650]{color:#eee}table.popups-table thead tr[data-v-2815b650]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-2815b650]{padding:10px 16px}table.popups-table tbody tr[data-v-2815b650]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-2815b650]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-2815b650]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-2815b650]{width:100%}header.header-desktop[data-v-2815b650]{display:block}header.header-mobile[data-v-2815b650]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-2815b650]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-2815b650]{width:100%;height:100%}header.header-mobile button svg path[data-v-2815b650]{fill:#fff}nav.sidebar[data-v-2815b650]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-2815b650]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-2815b650]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-2815b650]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-2815b650]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-2815b650]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-2815b650]{color:#fff}nav.sidebar .container .children[data-v-2815b650]{padding-left:30px}@-moz-keyframes tada-2815b650{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-2815b650{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-2815b650{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-2815b650{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-2815b650]{animation:dialogEnter-2815b650 .3s linear forwards}.dialog-leave-active[data-v-2815b650]{animation:dialogLeave-2815b650 .3s linear forwards}@keyframes dialogEnter-2815b650{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-2815b650{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-2815b650]{animation:dialogEnter-2815b650 .2s linear forwards}.dialog1-leave-active[data-v-2815b650]{animation:dialogLeave-2815b650 .2s linear forwards}@keyframes rotateEnter-2815b650{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-2815b650]{animation:rotateEnter-2815b650 .7s;position:relative}.rotate-leave-active[data-v-2815b650]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-2815b650{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-2815b650{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-2815b650]{animation:slideOutTop-2815b650 .5s linear forwards}.slide-top-leave-active[data-v-2815b650],.slide-bottom-enter-active[data-v-2815b650]{animation:slideOutBottom-2815b650 .5s linear forwards}@keyframes slideInLeft-2815b650{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-2815b650{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-2815b650]{animation:slideInLeft-2815b650 .3s linear forwards}.slide-left-leave-active[data-v-2815b650]{animation:slideInRight-2815b650 .3s linear forwards}@keyframes slideOutLeft-2815b650{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-2815b650{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-2815b650]{animation:slideOutLeft-2815b650 .3s linear forwards}.slide-right-leave-active[data-v-2815b650]{animation:slideOutRight-2815b650 .3s linear forwards}@keyframes bganimation-2815b650{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-2815b650{0%{height:0}to{height:100px}}@keyframes fadeEnd-2815b650{0%{height:100%}to{height:0}}.fade-enter-active[data-v-2815b650]{animation:fadeStart-2815b650 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-2815b650]{animation:fadeEnd-2815b650 .1s linear forwards;overflow:hidden}.section-setting-container[data-v-2815b650]{grid-template-columns:repeat(auto-fill,minmax(500px,1fr))!important}.tool-content[data-v-2815b650]{position:relative;width:100%;height:100%;color:#fff;font-style:normal;font-weight:300;padding:2rem;display:flex;flex-wrap:wrap;align-items:center}.tool-content .f[data-v-2815b650]{flex:1;max-width:calc(100% - 100px)}.tool-content .f .title[data-v-2815b650]{font-size:1.125rem;font-weight:6;margin-bottom:0}.tool-content .f .desc[data-v-2815b650]{color:#eee;margin-right:1rem;width:100%;font-size:14px;margin:.8rem 0}.tool-content .f .btns[data-v-2815b650]{width:100%}.tool-content .f .btns a[data-v-2815b650],.tool-content .f .btns button[data-v-2815b650]{border-radius:.3rem;color:#eee;min-width:70px;font-size:13px;padding:.2rem 1rem;cursor:pointer;box-shadow:0 0 17px #0000001a}.tool-content .f .btns a[data-v-2815b650]:hover,.tool-content .f .btns button[data-v-2815b650]:hover{opacity:.9}.tool-content .f .btns a.open[data-v-2815b650],.tool-content .f .btns button.open[data-v-2815b650]{background-color:#2075f3}.tool-content .r[data-v-2815b650]{flex:0 0 100%;max-width:100px;text-align:right}.tool-content .r svg.icon[data-v-2815b650]{width:64px;height:64px;background:#fff;border-radius:1rem}.tool-content .content[data-v-2815b650]{width:304px;display:flex;justify-content:space-between}.tool-content .content>div[data-v-2815b650]{width:84px}.tool-content .content>div>div[data-v-2815b650]{height:84px;border:1px solid;border-radius:12px;background:#FFF;cursor:pointer}.tool-content .content>div>span[data-v-2815b650]{display:inline-block;width:100%;text-align:center;font-size:12px}@keyframes turns-1880f8c7{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-1880f8c7]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-1880f8c7]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-1880f8c7]{color:#f9ad1e}.notice_info li[data-v-1880f8c7]{font-size:14px;list-style:revert}.text-container[data-v-1880f8c7]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-1880f8c7]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-1880f8c7]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-1880f8c7]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-1880f8c7]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-1880f8c7]{width:100%}.text-container .text-container_item p.info-desc[data-v-1880f8c7]{width:100%;color:#999;font-size:14px}.page-container[data-v-1880f8c7]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-1880f8c7]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-1880f8c7]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-1880f8c7]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-1880f8c7],.page-container .page-flex .page-sidebar a[data-v-1880f8c7]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-1880f8c7]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-1880f8c7]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-1880f8c7]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-1880f8c7]{border-radius:0;padding:1rem}ul.ul-container[data-v-1880f8c7]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-1880f8c7]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-1880f8c7]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-1880f8c7]{width:100%}form.form-container[data-v-1880f8c7]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-1880f8c7]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-1880f8c7]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-1880f8c7]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-1880f8c7]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-1880f8c7],form.form-container .label-value select[data-v-1880f8c7]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-1880f8c7]:focus,form.form-container .label-value select[data-v-1880f8c7]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-1880f8c7]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-1880f8c7]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-1880f8c7],form.form-container .label-value input[type=radio][data-v-1880f8c7]{width:auto}form.form-container .label-value input[type=radio][data-v-1880f8c7]{margin:0 4px 0 0}form.form-container .label-value input[data-v-1880f8c7]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-1880f8c7]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-1880f8c7]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-1880f8c7]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-1880f8c7]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-1880f8c7]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-1880f8c7]:hover{background-color:#747474}form.form-container .label-msg[data-v-1880f8c7]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-1880f8c7]{color:#f9ad1e}form.form-container .label-flex[data-v-1880f8c7]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-1880f8c7]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-1880f8c7]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-1880f8c7]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-1880f8c7]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-1880f8c7]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-1880f8c7]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-1880f8c7],form.form-container1 .label-value select[data-v-1880f8c7]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-1880f8c7]:focus,form.form-container1 .label-value select[data-v-1880f8c7]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-1880f8c7]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-1880f8c7],form.form-container1 .label-value input[type=radio][data-v-1880f8c7]{width:auto}form.form-container1 .label-value input[type=radio][data-v-1880f8c7]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-1880f8c7]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-1880f8c7]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-1880f8c7]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-1880f8c7]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-1880f8c7]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-1880f8c7]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-1880f8c7]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-1880f8c7]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-1880f8c7]{color:#f9ad1e}form.form-container1 .label-flex[data-v-1880f8c7]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-1880f8c7]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-1880f8c7]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-1880f8c7]{width:100px}table.page-table th.checkbox[data-v-1880f8c7]{width:50px;text-align:center}table.page-table th.setting[data-v-1880f8c7]{width:100px;text-align:center}table.page-table thead[data-v-1880f8c7]{color:#909399}table.page-table thead tr[data-v-1880f8c7]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-1880f8c7]{padding:10px 16px}table.page-table tbody tr[data-v-1880f8c7]:hover{background-color:#eeee}table.page-table tbody tr[data-v-1880f8c7]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-1880f8c7]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-1880f8c7]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-1880f8c7]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-1880f8c7]{width:100px}table.popups-table th.checkbox[data-v-1880f8c7]{width:50px;text-align:center}table.popups-table th.setting[data-v-1880f8c7]{width:100px;text-align:center}table.popups-table thead[data-v-1880f8c7]{color:#eee}table.popups-table thead tr[data-v-1880f8c7]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-1880f8c7]{padding:10px 16px}table.popups-table tbody tr[data-v-1880f8c7]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-1880f8c7]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-1880f8c7]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-1880f8c7]{width:100%}header.header-desktop[data-v-1880f8c7]{display:block}header.header-mobile[data-v-1880f8c7]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-1880f8c7]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-1880f8c7]{width:100%;height:100%}header.header-mobile button svg path[data-v-1880f8c7]{fill:#fff}nav.sidebar[data-v-1880f8c7]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-1880f8c7]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-1880f8c7]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-1880f8c7]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-1880f8c7]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-1880f8c7]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-1880f8c7]{color:#fff}nav.sidebar .container .children[data-v-1880f8c7]{padding-left:30px}@-moz-keyframes tada-1880f8c7{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-1880f8c7{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-1880f8c7{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-1880f8c7{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-1880f8c7]{animation:dialogEnter-1880f8c7 .3s linear forwards}.dialog-leave-active[data-v-1880f8c7]{animation:dialogLeave-1880f8c7 .3s linear forwards}@keyframes dialogEnter-1880f8c7{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-1880f8c7{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-1880f8c7]{animation:dialogEnter-1880f8c7 .2s linear forwards}.dialog1-leave-active[data-v-1880f8c7]{animation:dialogLeave-1880f8c7 .2s linear forwards}@keyframes rotateEnter-1880f8c7{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-1880f8c7]{animation:rotateEnter-1880f8c7 .7s;position:relative}.rotate-leave-active[data-v-1880f8c7]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-1880f8c7{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-1880f8c7{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-1880f8c7]{animation:slideOutTop-1880f8c7 .5s linear forwards}.slide-top-leave-active[data-v-1880f8c7],.slide-bottom-enter-active[data-v-1880f8c7]{animation:slideOutBottom-1880f8c7 .5s linear forwards}@keyframes slideInLeft-1880f8c7{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-1880f8c7{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-1880f8c7]{animation:slideInLeft-1880f8c7 .3s linear forwards}.slide-left-leave-active[data-v-1880f8c7]{animation:slideInRight-1880f8c7 .3s linear forwards}@keyframes slideOutLeft-1880f8c7{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-1880f8c7{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-1880f8c7]{animation:slideOutLeft-1880f8c7 .3s linear forwards}.slide-right-leave-active[data-v-1880f8c7]{animation:slideOutRight-1880f8c7 .3s linear forwards}@keyframes bganimation-1880f8c7{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-1880f8c7{0%{height:0}to{height:100px}}@keyframes fadeEnd-1880f8c7{0%{height:100%}to{height:0}}.fade-enter-active[data-v-1880f8c7]{animation:fadeStart-1880f8c7 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-1880f8c7]{animation:fadeEnd-1880f8c7 .1s linear forwards;overflow:hidden}.disk-content[data-v-1880f8c7]{position:relative;width:100%;height:100%;color:#fff;font-style:normal;font-weight:300;padding:2rem;display:flex;flex-wrap:wrap;align-items:center}.disk-content .name[data-v-1880f8c7]{font-size:1rem;font-weight:400;color:#eee;width:100%}.disk-content .info[data-v-1880f8c7]{width:100%;margin:.5rem 0;display:flex;flex-wrap:wrap}.disk-content .info .icon[data-v-1880f8c7]{width:50px;height:50px}.disk-content .info .card[data-v-1880f8c7]{flex:0 0 100%;max-width:calc(100% - 50px);padding-left:1rem;font-size:14px}.disk-content progress[data-v-1880f8c7]{width:100%;height:12px}.info .card li[data-v-1880f8c7]{margin:5px 0}.info .status[data-v-1880f8c7]{display:inline-block;height:1.125rem;padding-left:.5rem;padding-right:.5rem;border-radius:2px;line-height:1.5;text-align:center;font-size:.75rem;height:1.3rem;line-height:2;margin-right:.5rem}.info .main[data-v-1880f8c7]{background-color:#2175f3;color:#fff}.info .success[data-v-1880f8c7]{background-color:#48c78e;color:#fff}.info .error[data-v-1880f8c7]{background-color:#c7486d;color:#fff}.info .load[data-v-1880f8c7]{background-color:#b5c748}.info .unmounted[data-v-1880f8c7]{background-color:#48c752}@keyframes turns-32ba2e94{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-32ba2e94]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-32ba2e94]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-32ba2e94]{color:#f9ad1e}.notice_info li[data-v-32ba2e94]{font-size:14px;list-style:revert}.text-container[data-v-32ba2e94]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-32ba2e94]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-32ba2e94]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-32ba2e94]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-32ba2e94]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-32ba2e94]{width:100%}.text-container .text-container_item p.info-desc[data-v-32ba2e94]{width:100%;color:#999;font-size:14px}.page-container[data-v-32ba2e94]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-32ba2e94]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-32ba2e94]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-32ba2e94]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-32ba2e94],.page-container .page-flex .page-sidebar a[data-v-32ba2e94]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-32ba2e94]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-32ba2e94]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-32ba2e94]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-32ba2e94]{border-radius:0;padding:1rem}ul.ul-container[data-v-32ba2e94]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-32ba2e94]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-32ba2e94]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-32ba2e94]{width:100%}form.form-container[data-v-32ba2e94]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-32ba2e94]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-32ba2e94]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-32ba2e94]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-32ba2e94]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-32ba2e94],form.form-container .label-value select[data-v-32ba2e94]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-32ba2e94]:focus,form.form-container .label-value select[data-v-32ba2e94]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-32ba2e94]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-32ba2e94]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-32ba2e94],form.form-container .label-value input[type=radio][data-v-32ba2e94]{width:auto}form.form-container .label-value input[type=radio][data-v-32ba2e94]{margin:0 4px 0 0}form.form-container .label-value input[data-v-32ba2e94]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-32ba2e94]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-32ba2e94]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-32ba2e94]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-32ba2e94]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-32ba2e94]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-32ba2e94]:hover{background-color:#747474}form.form-container .label-msg[data-v-32ba2e94]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-32ba2e94]{color:#f9ad1e}form.form-container .label-flex[data-v-32ba2e94]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-32ba2e94]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-32ba2e94]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-32ba2e94]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-32ba2e94]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-32ba2e94]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-32ba2e94]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-32ba2e94],form.form-container1 .label-value select[data-v-32ba2e94]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-32ba2e94]:focus,form.form-container1 .label-value select[data-v-32ba2e94]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-32ba2e94]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-32ba2e94],form.form-container1 .label-value input[type=radio][data-v-32ba2e94]{width:auto}form.form-container1 .label-value input[type=radio][data-v-32ba2e94]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-32ba2e94]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-32ba2e94]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-32ba2e94]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-32ba2e94]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-32ba2e94]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-32ba2e94]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-32ba2e94]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-32ba2e94]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-32ba2e94]{color:#f9ad1e}form.form-container1 .label-flex[data-v-32ba2e94]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-32ba2e94]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-32ba2e94]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-32ba2e94]{width:100px}table.page-table th.checkbox[data-v-32ba2e94]{width:50px;text-align:center}table.page-table th.setting[data-v-32ba2e94]{width:100px;text-align:center}table.page-table thead[data-v-32ba2e94]{color:#909399}table.page-table thead tr[data-v-32ba2e94]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-32ba2e94]{padding:10px 16px}table.page-table tbody tr[data-v-32ba2e94]:hover{background-color:#eeee}table.page-table tbody tr[data-v-32ba2e94]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-32ba2e94]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-32ba2e94]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-32ba2e94]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-32ba2e94]{width:100px}table.popups-table th.checkbox[data-v-32ba2e94]{width:50px;text-align:center}table.popups-table th.setting[data-v-32ba2e94]{width:100px;text-align:center}table.popups-table thead[data-v-32ba2e94]{color:#eee}table.popups-table thead tr[data-v-32ba2e94]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-32ba2e94]{padding:10px 16px}table.popups-table tbody tr[data-v-32ba2e94]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-32ba2e94]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-32ba2e94]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-32ba2e94]{width:100%}header.header-desktop[data-v-32ba2e94]{display:block}header.header-mobile[data-v-32ba2e94]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-32ba2e94]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-32ba2e94]{width:100%;height:100%}header.header-mobile button svg path[data-v-32ba2e94]{fill:#fff}nav.sidebar[data-v-32ba2e94]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-32ba2e94]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-32ba2e94]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-32ba2e94]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-32ba2e94]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-32ba2e94]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-32ba2e94]{color:#fff}nav.sidebar .container .children[data-v-32ba2e94]{padding-left:30px}@-moz-keyframes tada-32ba2e94{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-32ba2e94{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-32ba2e94{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-32ba2e94{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-32ba2e94]{animation:dialogEnter-32ba2e94 .3s linear forwards}.dialog-leave-active[data-v-32ba2e94]{animation:dialogLeave-32ba2e94 .3s linear forwards}@keyframes dialogEnter-32ba2e94{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-32ba2e94{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-32ba2e94]{animation:dialogEnter-32ba2e94 .2s linear forwards}.dialog1-leave-active[data-v-32ba2e94]{animation:dialogLeave-32ba2e94 .2s linear forwards}@keyframes rotateEnter-32ba2e94{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-32ba2e94]{animation:rotateEnter-32ba2e94 .7s;position:relative}.rotate-leave-active[data-v-32ba2e94]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-32ba2e94{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-32ba2e94{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-32ba2e94]{animation:slideOutTop-32ba2e94 .5s linear forwards}.slide-top-leave-active[data-v-32ba2e94],.slide-bottom-enter-active[data-v-32ba2e94]{animation:slideOutBottom-32ba2e94 .5s linear forwards}@keyframes slideInLeft-32ba2e94{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-32ba2e94{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-32ba2e94]{animation:slideInLeft-32ba2e94 .3s linear forwards}.slide-left-leave-active[data-v-32ba2e94]{animation:slideInRight-32ba2e94 .3s linear forwards}@keyframes slideOutLeft-32ba2e94{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-32ba2e94{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-32ba2e94]{animation:slideOutLeft-32ba2e94 .3s linear forwards}.slide-right-leave-active[data-v-32ba2e94]{animation:slideOutRight-32ba2e94 .3s linear forwards}@keyframes bganimation-32ba2e94{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-32ba2e94{0%{height:0}to{height:100px}}@keyframes fadeEnd-32ba2e94{0%{height:100%}to{height:0}}.fade-enter-active[data-v-32ba2e94]{animation:fadeStart-32ba2e94 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-32ba2e94]{animation:fadeEnd-32ba2e94 .1s linear forwards;overflow:hidden}.section-disk-container[data-v-32ba2e94]{grid-template-columns:repeat(auto-fill,minmax(500px,1fr))!important}@keyframes turns-eb492a5a{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-eb492a5a]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-eb492a5a]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-eb492a5a]{color:#f9ad1e}.notice_info li[data-v-eb492a5a]{font-size:14px;list-style:revert}.text-container[data-v-eb492a5a]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-eb492a5a]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-eb492a5a]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-eb492a5a]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-eb492a5a]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-eb492a5a]{width:100%}.text-container .text-container_item p.info-desc[data-v-eb492a5a]{width:100%;color:#999;font-size:14px}.page-container[data-v-eb492a5a]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-eb492a5a]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-eb492a5a]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-eb492a5a]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-eb492a5a],.page-container .page-flex .page-sidebar a[data-v-eb492a5a]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-eb492a5a]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-eb492a5a]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-eb492a5a]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-eb492a5a]{border-radius:0;padding:1rem}ul.ul-container[data-v-eb492a5a]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-eb492a5a]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-eb492a5a]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-eb492a5a]{width:100%}form.form-container[data-v-eb492a5a]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-eb492a5a]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-eb492a5a]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-eb492a5a]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-eb492a5a]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-eb492a5a],form.form-container .label-value select[data-v-eb492a5a]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-eb492a5a]:focus,form.form-container .label-value select[data-v-eb492a5a]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-eb492a5a]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-eb492a5a]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-eb492a5a],form.form-container .label-value input[type=radio][data-v-eb492a5a]{width:auto}form.form-container .label-value input[type=radio][data-v-eb492a5a]{margin:0 4px 0 0}form.form-container .label-value input[data-v-eb492a5a]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-eb492a5a]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-eb492a5a]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-eb492a5a]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-eb492a5a]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-eb492a5a]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-eb492a5a]:hover{background-color:#747474}form.form-container .label-msg[data-v-eb492a5a]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-eb492a5a]{color:#f9ad1e}form.form-container .label-flex[data-v-eb492a5a]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-eb492a5a]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-eb492a5a]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-eb492a5a]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-eb492a5a]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-eb492a5a]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-eb492a5a]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-eb492a5a],form.form-container1 .label-value select[data-v-eb492a5a]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-eb492a5a]:focus,form.form-container1 .label-value select[data-v-eb492a5a]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-eb492a5a]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-eb492a5a],form.form-container1 .label-value input[type=radio][data-v-eb492a5a]{width:auto}form.form-container1 .label-value input[type=radio][data-v-eb492a5a]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-eb492a5a]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-eb492a5a]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-eb492a5a]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-eb492a5a]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-eb492a5a]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-eb492a5a]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-eb492a5a]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-eb492a5a]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-eb492a5a]{color:#f9ad1e}form.form-container1 .label-flex[data-v-eb492a5a]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-eb492a5a]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-eb492a5a]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-eb492a5a]{width:100px}table.page-table th.checkbox[data-v-eb492a5a]{width:50px;text-align:center}table.page-table th.setting[data-v-eb492a5a]{width:100px;text-align:center}table.page-table thead[data-v-eb492a5a]{color:#909399}table.page-table thead tr[data-v-eb492a5a]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-eb492a5a]{padding:10px 16px}table.page-table tbody tr[data-v-eb492a5a]:hover{background-color:#eeee}table.page-table tbody tr[data-v-eb492a5a]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-eb492a5a]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-eb492a5a]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-eb492a5a]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-eb492a5a]{width:100px}table.popups-table th.checkbox[data-v-eb492a5a]{width:50px;text-align:center}table.popups-table th.setting[data-v-eb492a5a]{width:100px;text-align:center}table.popups-table thead[data-v-eb492a5a]{color:#eee}table.popups-table thead tr[data-v-eb492a5a]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-eb492a5a]{padding:10px 16px}table.popups-table tbody tr[data-v-eb492a5a]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-eb492a5a]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-eb492a5a]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-eb492a5a]{width:100%}header.header-desktop[data-v-eb492a5a]{display:block}header.header-mobile[data-v-eb492a5a]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-eb492a5a]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-eb492a5a]{width:100%;height:100%}header.header-mobile button svg path[data-v-eb492a5a]{fill:#fff}nav.sidebar[data-v-eb492a5a]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-eb492a5a]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-eb492a5a]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-eb492a5a]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-eb492a5a]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-eb492a5a]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-eb492a5a]{color:#fff}nav.sidebar .container .children[data-v-eb492a5a]{padding-left:30px}@-moz-keyframes tada-eb492a5a{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-eb492a5a{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-eb492a5a{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-eb492a5a{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-eb492a5a]{animation:dialogEnter-eb492a5a .3s linear forwards}.dialog-leave-active[data-v-eb492a5a]{animation:dialogLeave-eb492a5a .3s linear forwards}@keyframes dialogEnter-eb492a5a{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-eb492a5a{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-eb492a5a]{animation:dialogEnter-eb492a5a .2s linear forwards}.dialog1-leave-active[data-v-eb492a5a]{animation:dialogLeave-eb492a5a .2s linear forwards}@keyframes rotateEnter-eb492a5a{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-eb492a5a]{animation:rotateEnter-eb492a5a .7s;position:relative}.rotate-leave-active[data-v-eb492a5a]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-eb492a5a{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-eb492a5a{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-eb492a5a]{animation:slideOutTop-eb492a5a .5s linear forwards}.slide-top-leave-active[data-v-eb492a5a],.slide-bottom-enter-active[data-v-eb492a5a]{animation:slideOutBottom-eb492a5a .5s linear forwards}@keyframes slideInLeft-eb492a5a{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-eb492a5a{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-eb492a5a]{animation:slideInLeft-eb492a5a .3s linear forwards}.slide-left-leave-active[data-v-eb492a5a]{animation:slideInRight-eb492a5a .3s linear forwards}@keyframes slideOutLeft-eb492a5a{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-eb492a5a{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-eb492a5a]{animation:slideOutLeft-eb492a5a .3s linear forwards}.slide-right-leave-active[data-v-eb492a5a]{animation:slideOutRight-eb492a5a .3s linear forwards}@keyframes bganimation-eb492a5a{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-eb492a5a{0%{height:0}to{height:100px}}@keyframes fadeEnd-eb492a5a{0%{height:100%}to{height:0}}.fade-enter-active[data-v-eb492a5a]{animation:fadeStart-eb492a5a .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-eb492a5a]{animation:fadeEnd-eb492a5a .1s linear forwards;overflow:hidden}.widget-content[data-v-eb492a5a]{width:100%;display:flex}.gauge[data-v-eb492a5a]{width:50%;height:160px;text-align:center;display:flex;justify-content:center;align-items:center}@keyframes turns-5efc00dc{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-5efc00dc]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-5efc00dc]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-5efc00dc]{color:#f9ad1e}.notice_info li[data-v-5efc00dc]{font-size:14px;list-style:revert}.text-container[data-v-5efc00dc]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-5efc00dc]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-5efc00dc]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-5efc00dc]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-5efc00dc]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-5efc00dc]{width:100%}.text-container .text-container_item p.info-desc[data-v-5efc00dc]{width:100%;color:#999;font-size:14px}.page-container[data-v-5efc00dc]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-5efc00dc]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-5efc00dc]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-5efc00dc]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-5efc00dc],.page-container .page-flex .page-sidebar a[data-v-5efc00dc]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5efc00dc]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5efc00dc]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-5efc00dc]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-5efc00dc]{border-radius:0;padding:1rem}ul.ul-container[data-v-5efc00dc]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-5efc00dc]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-5efc00dc]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-5efc00dc]{width:100%}form.form-container[data-v-5efc00dc]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-5efc00dc]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-5efc00dc]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-5efc00dc]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-5efc00dc]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-5efc00dc],form.form-container .label-value select[data-v-5efc00dc]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-5efc00dc]:focus,form.form-container .label-value select[data-v-5efc00dc]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-5efc00dc]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-5efc00dc]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-5efc00dc],form.form-container .label-value input[type=radio][data-v-5efc00dc]{width:auto}form.form-container .label-value input[type=radio][data-v-5efc00dc]{margin:0 4px 0 0}form.form-container .label-value input[data-v-5efc00dc]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-5efc00dc]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5efc00dc]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5efc00dc]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-5efc00dc]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-5efc00dc]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-5efc00dc]:hover{background-color:#747474}form.form-container .label-msg[data-v-5efc00dc]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-5efc00dc]{color:#f9ad1e}form.form-container .label-flex[data-v-5efc00dc]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-5efc00dc]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-5efc00dc]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-5efc00dc]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-5efc00dc]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-5efc00dc]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-5efc00dc]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-5efc00dc],form.form-container1 .label-value select[data-v-5efc00dc]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-5efc00dc]:focus,form.form-container1 .label-value select[data-v-5efc00dc]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-5efc00dc]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-5efc00dc],form.form-container1 .label-value input[type=radio][data-v-5efc00dc]{width:auto}form.form-container1 .label-value input[type=radio][data-v-5efc00dc]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-5efc00dc]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-5efc00dc]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5efc00dc]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5efc00dc]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-5efc00dc]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-5efc00dc]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-5efc00dc]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-5efc00dc]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-5efc00dc]{color:#f9ad1e}form.form-container1 .label-flex[data-v-5efc00dc]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-5efc00dc]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-5efc00dc]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-5efc00dc]{width:100px}table.page-table th.checkbox[data-v-5efc00dc]{width:50px;text-align:center}table.page-table th.setting[data-v-5efc00dc]{width:100px;text-align:center}table.page-table thead[data-v-5efc00dc]{color:#909399}table.page-table thead tr[data-v-5efc00dc]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-5efc00dc]{padding:10px 16px}table.page-table tbody tr[data-v-5efc00dc]:hover{background-color:#eeee}table.page-table tbody tr[data-v-5efc00dc]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-5efc00dc]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-5efc00dc]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-5efc00dc]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-5efc00dc]{width:100px}table.popups-table th.checkbox[data-v-5efc00dc]{width:50px;text-align:center}table.popups-table th.setting[data-v-5efc00dc]{width:100px;text-align:center}table.popups-table thead[data-v-5efc00dc]{color:#eee}table.popups-table thead tr[data-v-5efc00dc]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-5efc00dc]{padding:10px 16px}table.popups-table tbody tr[data-v-5efc00dc]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-5efc00dc]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-5efc00dc]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-5efc00dc]{width:100%}header.header-desktop[data-v-5efc00dc]{display:block}header.header-mobile[data-v-5efc00dc]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-5efc00dc]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-5efc00dc]{width:100%;height:100%}header.header-mobile button svg path[data-v-5efc00dc]{fill:#fff}nav.sidebar[data-v-5efc00dc]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-5efc00dc]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-5efc00dc]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-5efc00dc]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-5efc00dc]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-5efc00dc]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-5efc00dc]{color:#fff}nav.sidebar .container .children[data-v-5efc00dc]{padding-left:30px}@-moz-keyframes tada-5efc00dc{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-5efc00dc{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-5efc00dc{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-5efc00dc{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-5efc00dc]{animation:dialogEnter-5efc00dc .3s linear forwards}.dialog-leave-active[data-v-5efc00dc]{animation:dialogLeave-5efc00dc .3s linear forwards}@keyframes dialogEnter-5efc00dc{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-5efc00dc{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-5efc00dc]{animation:dialogEnter-5efc00dc .2s linear forwards}.dialog1-leave-active[data-v-5efc00dc]{animation:dialogLeave-5efc00dc .2s linear forwards}@keyframes rotateEnter-5efc00dc{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-5efc00dc]{animation:rotateEnter-5efc00dc .7s;position:relative}.rotate-leave-active[data-v-5efc00dc]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-5efc00dc{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-5efc00dc{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-5efc00dc]{animation:slideOutTop-5efc00dc .5s linear forwards}.slide-top-leave-active[data-v-5efc00dc],.slide-bottom-enter-active[data-v-5efc00dc]{animation:slideOutBottom-5efc00dc .5s linear forwards}@keyframes slideInLeft-5efc00dc{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-5efc00dc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-5efc00dc]{animation:slideInLeft-5efc00dc .3s linear forwards}.slide-left-leave-active[data-v-5efc00dc]{animation:slideInRight-5efc00dc .3s linear forwards}@keyframes slideOutLeft-5efc00dc{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-5efc00dc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-5efc00dc]{animation:slideOutLeft-5efc00dc .3s linear forwards}.slide-right-leave-active[data-v-5efc00dc]{animation:slideOutRight-5efc00dc .3s linear forwards}@keyframes bganimation-5efc00dc{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-5efc00dc{0%{height:0}to{height:100px}}@keyframes fadeEnd-5efc00dc{0%{height:100%}to{height:0}}.fade-enter-active[data-v-5efc00dc]{animation:fadeStart-5efc00dc .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-5efc00dc]{animation:fadeEnd-5efc00dc .1s linear forwards;overflow:hidden}.widget-main[data-v-5efc00dc]{position:relative;padding:1rem}.widget-main .widget-title[data-v-5efc00dc]{position:relative;width:100%;color:#fff;font-style:normal;font-weight:300;text-align:left}.widget-main .widget-item[data-v-5efc00dc]{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;margin:1rem 0}.widget-main .widget-item .widget-item_title[data-v-5efc00dc]{color:#fff;font-size:1em;font-weight:6}.widget-main .widget-item .widget-item_value[data-v-5efc00dc]{color:#eee;font-size:14px}@keyframes turns-ce99f322{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-ce99f322]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-ce99f322]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-ce99f322]{color:#f9ad1e}.notice_info li[data-v-ce99f322]{font-size:14px;list-style:revert}.text-container[data-v-ce99f322]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-ce99f322]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-ce99f322]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-ce99f322]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-ce99f322]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-ce99f322]{width:100%}.text-container .text-container_item p.info-desc[data-v-ce99f322]{width:100%;color:#999;font-size:14px}.page-container[data-v-ce99f322]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-ce99f322]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-ce99f322]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-ce99f322]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-ce99f322],.page-container .page-flex .page-sidebar a[data-v-ce99f322]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-ce99f322]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-ce99f322]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-ce99f322]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-ce99f322]{border-radius:0;padding:1rem}ul.ul-container[data-v-ce99f322]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-ce99f322]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-ce99f322]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-ce99f322]{width:100%}form.form-container[data-v-ce99f322]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-ce99f322]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-ce99f322]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-ce99f322]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-ce99f322]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-ce99f322],form.form-container .label-value select[data-v-ce99f322]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-ce99f322]:focus,form.form-container .label-value select[data-v-ce99f322]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-ce99f322]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-ce99f322]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-ce99f322],form.form-container .label-value input[type=radio][data-v-ce99f322]{width:auto}form.form-container .label-value input[type=radio][data-v-ce99f322]{margin:0 4px 0 0}form.form-container .label-value input[data-v-ce99f322]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-ce99f322]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-ce99f322]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-ce99f322]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-ce99f322]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-ce99f322]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-ce99f322]:hover{background-color:#747474}form.form-container .label-msg[data-v-ce99f322]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-ce99f322]{color:#f9ad1e}form.form-container .label-flex[data-v-ce99f322]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-ce99f322]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-ce99f322]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-ce99f322]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-ce99f322]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-ce99f322]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-ce99f322]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-ce99f322],form.form-container1 .label-value select[data-v-ce99f322]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-ce99f322]:focus,form.form-container1 .label-value select[data-v-ce99f322]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-ce99f322]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-ce99f322],form.form-container1 .label-value input[type=radio][data-v-ce99f322]{width:auto}form.form-container1 .label-value input[type=radio][data-v-ce99f322]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-ce99f322]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-ce99f322]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-ce99f322]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-ce99f322]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-ce99f322]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-ce99f322]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-ce99f322]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-ce99f322]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-ce99f322]{color:#f9ad1e}form.form-container1 .label-flex[data-v-ce99f322]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-ce99f322]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-ce99f322]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-ce99f322]{width:100px}table.page-table th.checkbox[data-v-ce99f322]{width:50px;text-align:center}table.page-table th.setting[data-v-ce99f322]{width:100px;text-align:center}table.page-table thead[data-v-ce99f322]{color:#909399}table.page-table thead tr[data-v-ce99f322]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-ce99f322]{padding:10px 16px}table.page-table tbody tr[data-v-ce99f322]:hover{background-color:#eeee}table.page-table tbody tr[data-v-ce99f322]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-ce99f322]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-ce99f322]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-ce99f322]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-ce99f322]{width:100px}table.popups-table th.checkbox[data-v-ce99f322]{width:50px;text-align:center}table.popups-table th.setting[data-v-ce99f322]{width:100px;text-align:center}table.popups-table thead[data-v-ce99f322]{color:#eee}table.popups-table thead tr[data-v-ce99f322]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-ce99f322]{padding:10px 16px}table.popups-table tbody tr[data-v-ce99f322]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-ce99f322]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-ce99f322]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-ce99f322]{width:100%}header.header-desktop[data-v-ce99f322]{display:block}header.header-mobile[data-v-ce99f322]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-ce99f322]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-ce99f322]{width:100%;height:100%}header.header-mobile button svg path[data-v-ce99f322]{fill:#fff}nav.sidebar[data-v-ce99f322]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-ce99f322]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-ce99f322]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-ce99f322]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-ce99f322]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-ce99f322]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-ce99f322]{color:#fff}nav.sidebar .container .children[data-v-ce99f322]{padding-left:30px}@-moz-keyframes tada-ce99f322{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-ce99f322{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-ce99f322{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-ce99f322{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-ce99f322]{animation:dialogEnter-ce99f322 .3s linear forwards}.dialog-leave-active[data-v-ce99f322]{animation:dialogLeave-ce99f322 .3s linear forwards}@keyframes dialogEnter-ce99f322{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-ce99f322{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-ce99f322]{animation:dialogEnter-ce99f322 .2s linear forwards}.dialog1-leave-active[data-v-ce99f322]{animation:dialogLeave-ce99f322 .2s linear forwards}@keyframes rotateEnter-ce99f322{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-ce99f322]{animation:rotateEnter-ce99f322 .7s;position:relative}.rotate-leave-active[data-v-ce99f322]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-ce99f322{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-ce99f322{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-ce99f322]{animation:slideOutTop-ce99f322 .5s linear forwards}.slide-top-leave-active[data-v-ce99f322],.slide-bottom-enter-active[data-v-ce99f322]{animation:slideOutBottom-ce99f322 .5s linear forwards}@keyframes slideInLeft-ce99f322{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-ce99f322{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-ce99f322]{animation:slideInLeft-ce99f322 .3s linear forwards}.slide-left-leave-active[data-v-ce99f322]{animation:slideInRight-ce99f322 .3s linear forwards}@keyframes slideOutLeft-ce99f322{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-ce99f322{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-ce99f322]{animation:slideOutLeft-ce99f322 .3s linear forwards}.slide-right-leave-active[data-v-ce99f322]{animation:slideOutRight-ce99f322 .3s linear forwards}@keyframes bganimation-ce99f322{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-ce99f322{0%{height:0}to{height:100px}}@keyframes fadeEnd-ce99f322{0%{height:100%}to{height:0}}.fade-enter-active[data-v-ce99f322]{animation:fadeStart-ce99f322 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-ce99f322]{animation:fadeEnd-ce99f322 .1s linear forwards;overflow:hidden}.widget-content[data-v-ce99f322]{position:relative;width:100%;height:100%;color:#fff;font-style:normal;font-weight:300;text-align:left;padding:1rem 1.25rem}.widget-content .time[data-v-ce99f322]{font-size:2rem;font-weight:500}.widget-content .date[data-v-ce99f322]{font-size:.875rem}@keyframes turns-642968c3{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-642968c3]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-642968c3]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-642968c3]{color:#f9ad1e}.notice_info li[data-v-642968c3]{font-size:14px;list-style:revert}.text-container[data-v-642968c3]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-642968c3]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-642968c3]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-642968c3]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-642968c3]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-642968c3]{width:100%}.text-container .text-container_item p.info-desc[data-v-642968c3]{width:100%;color:#999;font-size:14px}.page-container[data-v-642968c3]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-642968c3]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-642968c3]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-642968c3]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-642968c3],.page-container .page-flex .page-sidebar a[data-v-642968c3]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-642968c3]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-642968c3]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-642968c3]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-642968c3]{border-radius:0;padding:1rem}ul.ul-container[data-v-642968c3]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-642968c3]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-642968c3]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-642968c3]{width:100%}form.form-container[data-v-642968c3]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-642968c3]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-642968c3]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-642968c3]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-642968c3]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-642968c3],form.form-container .label-value select[data-v-642968c3]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-642968c3]:focus,form.form-container .label-value select[data-v-642968c3]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-642968c3]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-642968c3]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-642968c3],form.form-container .label-value input[type=radio][data-v-642968c3]{width:auto}form.form-container .label-value input[type=radio][data-v-642968c3]{margin:0 4px 0 0}form.form-container .label-value input[data-v-642968c3]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-642968c3]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-642968c3]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-642968c3]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-642968c3]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-642968c3]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-642968c3]:hover{background-color:#747474}form.form-container .label-msg[data-v-642968c3]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-642968c3]{color:#f9ad1e}form.form-container .label-flex[data-v-642968c3]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-642968c3]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-642968c3]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-642968c3]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-642968c3]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-642968c3]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-642968c3]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-642968c3],form.form-container1 .label-value select[data-v-642968c3]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-642968c3]:focus,form.form-container1 .label-value select[data-v-642968c3]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-642968c3]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-642968c3],form.form-container1 .label-value input[type=radio][data-v-642968c3]{width:auto}form.form-container1 .label-value input[type=radio][data-v-642968c3]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-642968c3]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-642968c3]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-642968c3]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-642968c3]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-642968c3]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-642968c3]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-642968c3]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-642968c3]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-642968c3]{color:#f9ad1e}form.form-container1 .label-flex[data-v-642968c3]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-642968c3]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-642968c3]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-642968c3]{width:100px}table.page-table th.checkbox[data-v-642968c3]{width:50px;text-align:center}table.page-table th.setting[data-v-642968c3]{width:100px;text-align:center}table.page-table thead[data-v-642968c3]{color:#909399}table.page-table thead tr[data-v-642968c3]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-642968c3]{padding:10px 16px}table.page-table tbody tr[data-v-642968c3]:hover{background-color:#eeee}table.page-table tbody tr[data-v-642968c3]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-642968c3]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-642968c3]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-642968c3]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-642968c3]{width:100px}table.popups-table th.checkbox[data-v-642968c3]{width:50px;text-align:center}table.popups-table th.setting[data-v-642968c3]{width:100px;text-align:center}table.popups-table thead[data-v-642968c3]{color:#eee}table.popups-table thead tr[data-v-642968c3]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-642968c3]{padding:10px 16px}table.popups-table tbody tr[data-v-642968c3]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-642968c3]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-642968c3]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-642968c3]{width:100%}header.header-desktop[data-v-642968c3]{display:block}header.header-mobile[data-v-642968c3]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-642968c3]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-642968c3]{width:100%;height:100%}header.header-mobile button svg path[data-v-642968c3]{fill:#fff}nav.sidebar[data-v-642968c3]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-642968c3]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-642968c3]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-642968c3]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-642968c3]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-642968c3]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-642968c3]{color:#fff}nav.sidebar .container .children[data-v-642968c3]{padding-left:30px}@-moz-keyframes tada-642968c3{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-642968c3{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-642968c3{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-642968c3{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-642968c3]{animation:dialogEnter-642968c3 .3s linear forwards}.dialog-leave-active[data-v-642968c3]{animation:dialogLeave-642968c3 .3s linear forwards}@keyframes dialogEnter-642968c3{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-642968c3{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-642968c3]{animation:dialogEnter-642968c3 .2s linear forwards}.dialog1-leave-active[data-v-642968c3]{animation:dialogLeave-642968c3 .2s linear forwards}@keyframes rotateEnter-642968c3{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-642968c3]{animation:rotateEnter-642968c3 .7s;position:relative}.rotate-leave-active[data-v-642968c3]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-642968c3{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-642968c3{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-642968c3]{animation:slideOutTop-642968c3 .5s linear forwards}.slide-top-leave-active[data-v-642968c3],.slide-bottom-enter-active[data-v-642968c3]{animation:slideOutBottom-642968c3 .5s linear forwards}@keyframes slideInLeft-642968c3{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-642968c3{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-642968c3]{animation:slideInLeft-642968c3 .3s linear forwards}.slide-left-leave-active[data-v-642968c3]{animation:slideInRight-642968c3 .3s linear forwards}@keyframes slideOutLeft-642968c3{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-642968c3{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-642968c3]{animation:slideOutLeft-642968c3 .3s linear forwards}.slide-right-leave-active[data-v-642968c3]{animation:slideOutRight-642968c3 .3s linear forwards}@keyframes bganimation-642968c3{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-642968c3{0%{height:0}to{height:100px}}@keyframes fadeEnd-642968c3{0%{height:100%}to{height:0}}.fade-enter-active[data-v-642968c3]{animation:fadeStart-642968c3 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-642968c3]{animation:fadeEnd-642968c3 .1s linear forwards;overflow:hidden}.dropdown-container[data-v-642968c3]{padding:0!important}.dropdown-container h2.title[data-v-642968c3]{display:flex;align-items:center;padding:0 1.25rem}.dropdown-container h2.title a[data-v-642968c3]{font-size:14px;color:#666}.dropdown-container h2.title a[data-v-642968c3]:hover{color:#418cff}.dropdown-container .status[data-v-642968c3]{display:flex;align-items:center}.dropdown-container .status span[data-v-642968c3]{font-size:13px;margin-left:.3rem}.dropdown-container .dropdown-container_menus[data-v-642968c3]{max-height:460px;overflow:auto;padding:0 1.25rem}@keyframes turns-6eeee710{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-6eeee710]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-6eeee710]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-6eeee710]{color:#f9ad1e}.notice_info li[data-v-6eeee710]{font-size:14px;list-style:revert}.text-container[data-v-6eeee710]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-6eeee710]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-6eeee710]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-6eeee710]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-6eeee710]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-6eeee710]{width:100%}.text-container .text-container_item p.info-desc[data-v-6eeee710]{width:100%;color:#999;font-size:14px}.page-container[data-v-6eeee710]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-6eeee710]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-6eeee710]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-6eeee710]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-6eeee710],.page-container .page-flex .page-sidebar a[data-v-6eeee710]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-6eeee710]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-6eeee710]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-6eeee710]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-6eeee710]{border-radius:0;padding:1rem}ul.ul-container[data-v-6eeee710]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-6eeee710]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-6eeee710]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-6eeee710]{width:100%}form.form-container[data-v-6eeee710]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-6eeee710]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-6eeee710]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-6eeee710]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-6eeee710]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-6eeee710],form.form-container .label-value select[data-v-6eeee710]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-6eeee710]:focus,form.form-container .label-value select[data-v-6eeee710]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-6eeee710]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-6eeee710]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-6eeee710],form.form-container .label-value input[type=radio][data-v-6eeee710]{width:auto}form.form-container .label-value input[type=radio][data-v-6eeee710]{margin:0 4px 0 0}form.form-container .label-value input[data-v-6eeee710]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-6eeee710]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-6eeee710]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-6eeee710]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-6eeee710]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-6eeee710]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-6eeee710]:hover{background-color:#747474}form.form-container .label-msg[data-v-6eeee710]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-6eeee710]{color:#f9ad1e}form.form-container .label-flex[data-v-6eeee710]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-6eeee710]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-6eeee710]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-6eeee710]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-6eeee710]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-6eeee710]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-6eeee710]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-6eeee710],form.form-container1 .label-value select[data-v-6eeee710]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-6eeee710]:focus,form.form-container1 .label-value select[data-v-6eeee710]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-6eeee710]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-6eeee710],form.form-container1 .label-value input[type=radio][data-v-6eeee710]{width:auto}form.form-container1 .label-value input[type=radio][data-v-6eeee710]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-6eeee710]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-6eeee710]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-6eeee710]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-6eeee710]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-6eeee710]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-6eeee710]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-6eeee710]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-6eeee710]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-6eeee710]{color:#f9ad1e}form.form-container1 .label-flex[data-v-6eeee710]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-6eeee710]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-6eeee710]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-6eeee710]{width:100px}table.page-table th.checkbox[data-v-6eeee710]{width:50px;text-align:center}table.page-table th.setting[data-v-6eeee710]{width:100px;text-align:center}table.page-table thead[data-v-6eeee710]{color:#909399}table.page-table thead tr[data-v-6eeee710]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-6eeee710]{padding:10px 16px}table.page-table tbody tr[data-v-6eeee710]:hover{background-color:#eeee}table.page-table tbody tr[data-v-6eeee710]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-6eeee710]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-6eeee710]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-6eeee710]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-6eeee710]{width:100px}table.popups-table th.checkbox[data-v-6eeee710]{width:50px;text-align:center}table.popups-table th.setting[data-v-6eeee710]{width:100px;text-align:center}table.popups-table thead[data-v-6eeee710]{color:#eee}table.popups-table thead tr[data-v-6eeee710]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-6eeee710]{padding:10px 16px}table.popups-table tbody tr[data-v-6eeee710]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-6eeee710]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-6eeee710]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-6eeee710]{width:100%}header.header-desktop[data-v-6eeee710]{display:block}header.header-mobile[data-v-6eeee710]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-6eeee710]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-6eeee710]{width:100%;height:100%}header.header-mobile button svg path[data-v-6eeee710]{fill:#fff}nav.sidebar[data-v-6eeee710]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-6eeee710]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-6eeee710]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-6eeee710]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-6eeee710]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-6eeee710]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-6eeee710]{color:#fff}nav.sidebar .container .children[data-v-6eeee710]{padding-left:30px}@-moz-keyframes tada-6eeee710{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-6eeee710{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-6eeee710{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-6eeee710{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-6eeee710]{animation:dialogEnter-6eeee710 .3s linear forwards}.dialog-leave-active[data-v-6eeee710]{animation:dialogLeave-6eeee710 .3s linear forwards}@keyframes dialogEnter-6eeee710{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-6eeee710{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-6eeee710]{animation:dialogEnter-6eeee710 .2s linear forwards}.dialog1-leave-active[data-v-6eeee710]{animation:dialogLeave-6eeee710 .2s linear forwards}@keyframes rotateEnter-6eeee710{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-6eeee710]{animation:rotateEnter-6eeee710 .7s;position:relative}.rotate-leave-active[data-v-6eeee710]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-6eeee710{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-6eeee710{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-6eeee710]{animation:slideOutTop-6eeee710 .5s linear forwards}.slide-top-leave-active[data-v-6eeee710],.slide-bottom-enter-active[data-v-6eeee710]{animation:slideOutBottom-6eeee710 .5s linear forwards}@keyframes slideInLeft-6eeee710{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-6eeee710{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-6eeee710]{animation:slideInLeft-6eeee710 .3s linear forwards}.slide-left-leave-active[data-v-6eeee710]{animation:slideInRight-6eeee710 .3s linear forwards}@keyframes slideOutLeft-6eeee710{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-6eeee710{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-6eeee710]{animation:slideOutLeft-6eeee710 .3s linear forwards}.slide-right-leave-active[data-v-6eeee710]{animation:slideOutRight-6eeee710 .3s linear forwards}@keyframes bganimation-6eeee710{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-6eeee710{0%{height:0}to{height:100px}}@keyframes fadeEnd-6eeee710{0%{height:100%}to{height:0}}.fade-enter-active[data-v-6eeee710]{animation:fadeStart-6eeee710 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-6eeee710]{animation:fadeEnd-6eeee710 .1s linear forwards;overflow:hidden}header[data-v-6eeee710]{position:relative;width:100%;height:42px;background-color:#35363a;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:0 2rem}header .f .hostname[data-v-6eeee710]{margin-left:.5rem;display:inline-block;font-size:1.5rem;font-style:normal;font-variant:normal;font-weight:500;line-height:1;text-transform:none;color:#fff}header .r[data-v-6eeee710]{display:flex;align-items:center;justify-content:flex-end}header .r[data-v-6eeee710] .dropdown-item{position:relative;margin-left:.5rem}header .r[data-v-6eeee710] .dropdown-item .dropdown-bg{position:fixed;inset:0;z-index:10}header .r[data-v-6eeee710] .dropdown-item .dropdown-container{right:0;position:absolute;top:100%;z-index:20;margin-top:.5rem;min-width:20rem;backdrop-filter:blur(1rem);background:#fff;border-radius:4px;padding:0 1.25rem;text-align:left;z-index:11}header .r[data-v-6eeee710] .dropdown-item .dropdown-container h2.title{font-size:1.125rem;margin-top:1.5rem;margin-bottom:1.5rem;font-weight:600;color:#363636;line-height:1.125}header .r[data-v-6eeee710] .dropdown-item .dropdown-container .dropdown-menu_item{width:100%;display:flex;align-items:center;margin-bottom:1rem}header .r[data-v-6eeee710] .dropdown-item .dropdown-container .dropdown-menu_item>span{color:#4a4a4a;display:block;font-size:.875rem;font-weight:700;position:relative}header .r[data-v-6eeee710] .dropdown-item .dropdown-container .dropdown-menu_item>span em{position:absolute;padding:3px;border-radius:50%;background:#ef6a6a;right:-.3rem}header .r[data-v-6eeee710] .dropdown-item .dropdown-container .dropdown-menu_item .icons{width:16px;height:16px;margin:0;padding:0;margin-right:.1rem;display:flex}header .r[data-v-6eeee710] .dropdown-item .dropdown-container .dropdown-menu_item label{background-color:#363636;border-color:transparent;color:#fff;border-radius:9999px;padding:.1rem .8rem;font-size:12px;cursor:pointer}header .r[data-v-6eeee710] .dropdown-item .dropdown-container .dropdown-menu_item a{color:#4a4a4a;display:block;font-size:.875rem;line-height:1.5;position:relative}header .r[data-v-6eeee710] .dropdown-item .dropdown-container .dropdown-menu_item .btn{width:18px;height:18px;margin:0;padding:0;margin-left:.1rem}header .r[data-v-6eeee710] .dropdown-item .dropdown-container .dropdown-menu_item svg.icon{width:100%;height:100%}header .r[data-v-6eeee710] .dropdown-item .dropdown-container .dropdown-menu_item svg.icon path{fill:#363636}header .r[data-v-6eeee710] button{background:none;margin:0;padding:0;width:14px;height:14px;margin-left:1rem;display:flex;cursor:pointer;position:relative}header .r[data-v-6eeee710] button svg{width:100%;height:100%}header .r[data-v-6eeee710] button path{fill:#d5d5d5}header .r[data-v-6eeee710] button:hover path{fill:#fff}header .r[data-v-6eeee710] button em{position:absolute;padding:3px;border-radius:50%;background:#ef6a6a;right:-.5rem;top:-.3rem}@keyframes turns-763fd268{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-763fd268]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-763fd268]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-763fd268]{color:#f9ad1e}.notice_info li[data-v-763fd268]{font-size:14px;list-style:revert}.text-container[data-v-763fd268]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-763fd268]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-763fd268]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-763fd268]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-763fd268]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-763fd268]{width:100%}.text-container .text-container_item p.info-desc[data-v-763fd268]{width:100%;color:#999;font-size:14px}.page-container[data-v-763fd268]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-763fd268]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-763fd268]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-763fd268]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-763fd268],.page-container .page-flex .page-sidebar a[data-v-763fd268]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-763fd268]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-763fd268]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-763fd268]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-763fd268]{border-radius:0;padding:1rem}ul.ul-container[data-v-763fd268]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-763fd268]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-763fd268]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-763fd268]{width:100%}form.form-container[data-v-763fd268]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-763fd268]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-763fd268]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-763fd268]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-763fd268]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-763fd268],form.form-container .label-value select[data-v-763fd268]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-763fd268]:focus,form.form-container .label-value select[data-v-763fd268]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-763fd268]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-763fd268]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-763fd268],form.form-container .label-value input[type=radio][data-v-763fd268]{width:auto}form.form-container .label-value input[type=radio][data-v-763fd268]{margin:0 4px 0 0}form.form-container .label-value input[data-v-763fd268]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-763fd268]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-763fd268]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-763fd268]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-763fd268]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-763fd268]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-763fd268]:hover{background-color:#747474}form.form-container .label-msg[data-v-763fd268]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-763fd268]{color:#f9ad1e}form.form-container .label-flex[data-v-763fd268]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-763fd268]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-763fd268]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-763fd268]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-763fd268]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-763fd268]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-763fd268]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-763fd268],form.form-container1 .label-value select[data-v-763fd268]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-763fd268]:focus,form.form-container1 .label-value select[data-v-763fd268]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-763fd268]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-763fd268],form.form-container1 .label-value input[type=radio][data-v-763fd268]{width:auto}form.form-container1 .label-value input[type=radio][data-v-763fd268]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-763fd268]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-763fd268]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-763fd268]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-763fd268]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-763fd268]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-763fd268]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-763fd268]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-763fd268]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-763fd268]{color:#f9ad1e}form.form-container1 .label-flex[data-v-763fd268]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-763fd268]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-763fd268]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-763fd268]{width:100px}table.page-table th.checkbox[data-v-763fd268]{width:50px;text-align:center}table.page-table th.setting[data-v-763fd268]{width:100px;text-align:center}table.page-table thead[data-v-763fd268]{color:#909399}table.page-table thead tr[data-v-763fd268]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-763fd268]{padding:10px 16px}table.page-table tbody tr[data-v-763fd268]:hover{background-color:#eeee}table.page-table tbody tr[data-v-763fd268]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-763fd268]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-763fd268]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-763fd268]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-763fd268]{width:100px}table.popups-table th.checkbox[data-v-763fd268]{width:50px;text-align:center}table.popups-table th.setting[data-v-763fd268]{width:100px;text-align:center}table.popups-table thead[data-v-763fd268]{color:#eee}table.popups-table thead tr[data-v-763fd268]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-763fd268]{padding:10px 16px}table.popups-table tbody tr[data-v-763fd268]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-763fd268]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-763fd268]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-763fd268]{width:100%}header.header-desktop[data-v-763fd268]{display:block}header.header-mobile[data-v-763fd268]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-763fd268]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-763fd268]{width:100%;height:100%}header.header-mobile button svg path[data-v-763fd268]{fill:#fff}nav.sidebar[data-v-763fd268]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-763fd268]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-763fd268]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-763fd268]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-763fd268]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-763fd268]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-763fd268]{color:#fff}nav.sidebar .container .children[data-v-763fd268]{padding-left:30px}@-moz-keyframes tada-763fd268{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-763fd268{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-763fd268{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-763fd268{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-763fd268]{animation:dialogEnter-763fd268 .3s linear forwards}.dialog-leave-active[data-v-763fd268]{animation:dialogLeave-763fd268 .3s linear forwards}@keyframes dialogEnter-763fd268{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-763fd268{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-763fd268]{animation:dialogEnter-763fd268 .2s linear forwards}.dialog1-leave-active[data-v-763fd268]{animation:dialogLeave-763fd268 .2s linear forwards}@keyframes rotateEnter-763fd268{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-763fd268]{animation:rotateEnter-763fd268 .7s;position:relative}.rotate-leave-active[data-v-763fd268]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-763fd268{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-763fd268{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-763fd268]{animation:slideOutTop-763fd268 .5s linear forwards}.slide-top-leave-active[data-v-763fd268],.slide-bottom-enter-active[data-v-763fd268]{animation:slideOutBottom-763fd268 .5s linear forwards}@keyframes slideInLeft-763fd268{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-763fd268{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-763fd268]{animation:slideInLeft-763fd268 .3s linear forwards}.slide-left-leave-active[data-v-763fd268]{animation:slideInRight-763fd268 .3s linear forwards}@keyframes slideOutLeft-763fd268{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-763fd268{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-763fd268]{animation:slideOutLeft-763fd268 .3s linear forwards}.slide-right-leave-active[data-v-763fd268]{animation:slideOutRight-763fd268 .3s linear forwards}@keyframes bganimation-763fd268{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-763fd268{0%{height:0}to{height:100px}}@keyframes fadeEnd-763fd268{0%{height:100%}to{height:0}}.fade-enter-active[data-v-763fd268]{animation:fadeStart-763fd268 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-763fd268]{animation:fadeEnd-763fd268 .1s linear forwards;overflow:hidden}#page *[data-v-763fd268]{font-family:BlinkMacSystemFont,-apple-system,Segoe UI,Roboto,Oxygen,Ubuntu,Cantarell,Fira Sans,Droid Sans,Helvetica Neue,Helvetica,Arial,sans-serif}#page[data-v-763fd268]{width:100vw;height:100vh;background-repeat:no-repeat;background-size:100% 100%;position:relative}#page .bg[data-v-763fd268]{animation-duration:.5s;background-position:50%;background-repeat:no-repeat;background-size:cover;height:100%;overflow:hidden;position:fixed;transition:background-image .3s ease;width:100%;z-index:0}#page #main[data-v-763fd268]{width:100%;height:calc(100% - 42px);overflow:auto;overflow:overlay;padding:2rem 0;position:relative;z-index:1}#page #main .main-container[data-v-763fd268]{flex:0 0 100%;width:100%}#page #main .body[data-v-763fd268]{display:flex;max-width:1380px;min-width:1380px;position:relative}#page #main .f[data-v-763fd268]{flex:0 0 100%;max-width:20rem;padding-right:1rem}#page #main .r[data-v-763fd268]{flex:0 0 100%;max-width:calc(100% - 20rem)}#page #main[data-v-763fd268]::-webkit-scrollbar{width:8px;height:0}#page #main[data-v-763fd268]::-webkit-scrollbar-thumb{background-color:#fff6;border-radius:10px;outline:none;border:none;height:30px}#page #main[data-v-763fd268]::-webkit-scrollbar-track{background:none;-webkit-border-radius:0;border-radius:0}@keyframes turns-8009221e{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-8009221e]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-8009221e]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-8009221e]{color:#f9ad1e}.notice_info li[data-v-8009221e]{font-size:14px;list-style:revert}.text-container[data-v-8009221e]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-8009221e]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-8009221e]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-8009221e]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-8009221e]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-8009221e]{width:100%}.text-container .text-container_item p.info-desc[data-v-8009221e]{width:100%;color:#999;font-size:14px}.page-container[data-v-8009221e]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-8009221e]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-8009221e]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-8009221e]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-8009221e],.page-container .page-flex .page-sidebar a[data-v-8009221e]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-8009221e]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-8009221e]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-8009221e]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-8009221e]{border-radius:0;padding:1rem}ul.ul-container[data-v-8009221e]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-8009221e]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-8009221e]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-8009221e]{width:100%}form.form-container[data-v-8009221e]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-8009221e]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-8009221e]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-8009221e]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-8009221e]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-8009221e],form.form-container .label-value select[data-v-8009221e]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-8009221e]:focus,form.form-container .label-value select[data-v-8009221e]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-8009221e]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-8009221e]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-8009221e],form.form-container .label-value input[type=radio][data-v-8009221e]{width:auto}form.form-container .label-value input[type=radio][data-v-8009221e]{margin:0 4px 0 0}form.form-container .label-value input[data-v-8009221e]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-8009221e]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-8009221e]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-8009221e]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-8009221e]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-8009221e]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-8009221e]:hover{background-color:#747474}form.form-container .label-msg[data-v-8009221e]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-8009221e]{color:#f9ad1e}form.form-container .label-flex[data-v-8009221e]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-8009221e]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-8009221e]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-8009221e]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-8009221e]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-8009221e]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-8009221e]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-8009221e],form.form-container1 .label-value select[data-v-8009221e]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-8009221e]:focus,form.form-container1 .label-value select[data-v-8009221e]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-8009221e]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-8009221e],form.form-container1 .label-value input[type=radio][data-v-8009221e]{width:auto}form.form-container1 .label-value input[type=radio][data-v-8009221e]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-8009221e]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-8009221e]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-8009221e]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-8009221e]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-8009221e]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-8009221e]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-8009221e]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-8009221e]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-8009221e]{color:#f9ad1e}form.form-container1 .label-flex[data-v-8009221e]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-8009221e]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-8009221e]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-8009221e]{width:100px}table.page-table th.checkbox[data-v-8009221e]{width:50px;text-align:center}table.page-table th.setting[data-v-8009221e]{width:100px;text-align:center}table.page-table thead[data-v-8009221e]{color:#909399}table.page-table thead tr[data-v-8009221e]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-8009221e]{padding:10px 16px}table.page-table tbody tr[data-v-8009221e]:hover{background-color:#eeee}table.page-table tbody tr[data-v-8009221e]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-8009221e]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-8009221e]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-8009221e]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-8009221e]{width:100px}table.popups-table th.checkbox[data-v-8009221e]{width:50px;text-align:center}table.popups-table th.setting[data-v-8009221e]{width:100px;text-align:center}table.popups-table thead[data-v-8009221e]{color:#eee}table.popups-table thead tr[data-v-8009221e]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-8009221e]{padding:10px 16px}table.popups-table tbody tr[data-v-8009221e]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-8009221e]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-8009221e]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-8009221e]{width:100%}header.header-desktop[data-v-8009221e]{display:block}header.header-mobile[data-v-8009221e]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-8009221e]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-8009221e]{width:100%;height:100%}header.header-mobile button svg path[data-v-8009221e]{fill:#fff}nav.sidebar[data-v-8009221e]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-8009221e]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-8009221e]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-8009221e]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-8009221e]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-8009221e]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-8009221e]{color:#fff}nav.sidebar .container .children[data-v-8009221e]{padding-left:30px}@-moz-keyframes tada-8009221e{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-8009221e{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-8009221e{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-8009221e{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-8009221e]{animation:dialogEnter-8009221e .3s linear forwards}.dialog-leave-active[data-v-8009221e]{animation:dialogLeave-8009221e .3s linear forwards}@keyframes dialogEnter-8009221e{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-8009221e{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-8009221e]{animation:dialogEnter-8009221e .2s linear forwards}.dialog1-leave-active[data-v-8009221e]{animation:dialogLeave-8009221e .2s linear forwards}@keyframes rotateEnter-8009221e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-8009221e]{animation:rotateEnter-8009221e .7s;position:relative}.rotate-leave-active[data-v-8009221e]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-8009221e{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-8009221e{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-8009221e]{animation:slideOutTop-8009221e .5s linear forwards}.slide-top-leave-active[data-v-8009221e],.slide-bottom-enter-active[data-v-8009221e]{animation:slideOutBottom-8009221e .5s linear forwards}@keyframes slideInLeft-8009221e{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-8009221e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-8009221e]{animation:slideInLeft-8009221e .3s linear forwards}.slide-left-leave-active[data-v-8009221e]{animation:slideInRight-8009221e .3s linear forwards}@keyframes slideOutLeft-8009221e{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-8009221e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-8009221e]{animation:slideOutLeft-8009221e .3s linear forwards}.slide-right-leave-active[data-v-8009221e]{animation:slideOutRight-8009221e .3s linear forwards}@keyframes bganimation-8009221e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-8009221e{0%{height:0}to{height:100px}}@keyframes fadeEnd-8009221e{0%{height:100%}to{height:0}}.fade-enter-active[data-v-8009221e]{animation:fadeStart-8009221e .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-8009221e]{animation:fadeEnd-8009221e .1s linear forwards;overflow:hidden}.folder-body[data-v-8009221e]{margin-left:24px;margin-top:2px}.folder-body>div.content[data-v-8009221e]{cursor:pointer;display:flex;align-items:center;padding:0 6px}.folder-body>div.content[data-v-8009221e]:hover{background-color:#ecf5ff}.folder-body>div.content>span[data-v-8009221e]{color:#000000d4;font-size:13px;line-height:32px;font-weight:500}.folder-body>div.content>img[data-v-8009221e]{width:24px;margin-right:10px;margin-left:16px}.empty[data-v-8009221e]{color:#000000d4;font-size:12px;margin-left:38px;line-height:32px}@keyframes turns-2ec06138{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-2ec06138]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-2ec06138]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-2ec06138]{color:#f9ad1e}.notice_info li[data-v-2ec06138]{font-size:14px;list-style:revert}.text-container[data-v-2ec06138]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-2ec06138]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-2ec06138]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-2ec06138]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-2ec06138]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-2ec06138]{width:100%}.text-container .text-container_item p.info-desc[data-v-2ec06138]{width:100%;color:#999;font-size:14px}.page-container[data-v-2ec06138]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-2ec06138]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-2ec06138]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-2ec06138]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-2ec06138],.page-container .page-flex .page-sidebar a[data-v-2ec06138]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-2ec06138]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-2ec06138]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-2ec06138]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-2ec06138]{border-radius:0;padding:1rem}ul.ul-container[data-v-2ec06138]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-2ec06138]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-2ec06138]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-2ec06138]{width:100%}form.form-container[data-v-2ec06138]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-2ec06138]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-2ec06138]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-2ec06138]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-2ec06138]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-2ec06138],form.form-container .label-value select[data-v-2ec06138]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-2ec06138]:focus,form.form-container .label-value select[data-v-2ec06138]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-2ec06138]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-2ec06138]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-2ec06138],form.form-container .label-value input[type=radio][data-v-2ec06138]{width:auto}form.form-container .label-value input[type=radio][data-v-2ec06138]{margin:0 4px 0 0}form.form-container .label-value input[data-v-2ec06138]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-2ec06138]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-2ec06138]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-2ec06138]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-2ec06138]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-2ec06138]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-2ec06138]:hover{background-color:#747474}form.form-container .label-msg[data-v-2ec06138]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-2ec06138]{color:#f9ad1e}form.form-container .label-flex[data-v-2ec06138]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-2ec06138]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-2ec06138]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-2ec06138]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-2ec06138]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-2ec06138]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-2ec06138]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-2ec06138],form.form-container1 .label-value select[data-v-2ec06138]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-2ec06138]:focus,form.form-container1 .label-value select[data-v-2ec06138]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-2ec06138]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-2ec06138],form.form-container1 .label-value input[type=radio][data-v-2ec06138]{width:auto}form.form-container1 .label-value input[type=radio][data-v-2ec06138]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-2ec06138]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-2ec06138]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-2ec06138]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-2ec06138]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-2ec06138]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-2ec06138]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-2ec06138]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-2ec06138]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-2ec06138]{color:#f9ad1e}form.form-container1 .label-flex[data-v-2ec06138]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-2ec06138]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-2ec06138]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-2ec06138]{width:100px}table.page-table th.checkbox[data-v-2ec06138]{width:50px;text-align:center}table.page-table th.setting[data-v-2ec06138]{width:100px;text-align:center}table.page-table thead[data-v-2ec06138]{color:#909399}table.page-table thead tr[data-v-2ec06138]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-2ec06138]{padding:10px 16px}table.page-table tbody tr[data-v-2ec06138]:hover{background-color:#eeee}table.page-table tbody tr[data-v-2ec06138]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-2ec06138]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-2ec06138]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-2ec06138]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-2ec06138]{width:100px}table.popups-table th.checkbox[data-v-2ec06138]{width:50px;text-align:center}table.popups-table th.setting[data-v-2ec06138]{width:100px;text-align:center}table.popups-table thead[data-v-2ec06138]{color:#eee}table.popups-table thead tr[data-v-2ec06138]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-2ec06138]{padding:10px 16px}table.popups-table tbody tr[data-v-2ec06138]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-2ec06138]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-2ec06138]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-2ec06138]{width:100%}header.header-desktop[data-v-2ec06138]{display:block}header.header-mobile[data-v-2ec06138]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-2ec06138]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-2ec06138]{width:100%;height:100%}header.header-mobile button svg path[data-v-2ec06138]{fill:#fff}nav.sidebar[data-v-2ec06138]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-2ec06138]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-2ec06138]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-2ec06138]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-2ec06138]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-2ec06138]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-2ec06138]{color:#fff}nav.sidebar .container .children[data-v-2ec06138]{padding-left:30px}@-moz-keyframes tada-2ec06138{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-2ec06138{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-2ec06138{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-2ec06138{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-2ec06138]{animation:dialogEnter-2ec06138 .3s linear forwards}.dialog-leave-active[data-v-2ec06138]{animation:dialogLeave-2ec06138 .3s linear forwards}@keyframes dialogEnter-2ec06138{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-2ec06138{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-2ec06138]{animation:dialogEnter-2ec06138 .2s linear forwards}.dialog1-leave-active[data-v-2ec06138]{animation:dialogLeave-2ec06138 .2s linear forwards}@keyframes rotateEnter-2ec06138{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-2ec06138]{animation:rotateEnter-2ec06138 .7s;position:relative}.rotate-leave-active[data-v-2ec06138]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-2ec06138{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-2ec06138{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-2ec06138]{animation:slideOutTop-2ec06138 .5s linear forwards}.slide-top-leave-active[data-v-2ec06138],.slide-bottom-enter-active[data-v-2ec06138]{animation:slideOutBottom-2ec06138 .5s linear forwards}@keyframes slideInLeft-2ec06138{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-2ec06138{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-2ec06138]{animation:slideInLeft-2ec06138 .3s linear forwards}.slide-left-leave-active[data-v-2ec06138]{animation:slideInRight-2ec06138 .3s linear forwards}@keyframes slideOutLeft-2ec06138{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-2ec06138{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-2ec06138]{animation:slideOutLeft-2ec06138 .3s linear forwards}.slide-right-leave-active[data-v-2ec06138]{animation:slideOutRight-2ec06138 .3s linear forwards}@keyframes bganimation-2ec06138{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-2ec06138{0%{height:0}to{height:100px}}@keyframes fadeEnd-2ec06138{0%{height:100%}to{height:0}}.fade-enter-active[data-v-2ec06138]{animation:fadeStart-2ec06138 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-2ec06138]{animation:fadeEnd-2ec06138 .1s linear forwards;overflow:hidden}ul.disk-item[data-v-2ec06138]{width:100%;margin-bottom:10px}ul.disk-item .auto[data-v-2ec06138]{flex:auto}ul.disk-item .disk-item_icon[data-v-2ec06138]{width:24px;height:24px;margin-right:.5rem}ul.disk-item .disk-item_icon img[data-v-2ec06138]{width:100%;height:100%}ul.disk-item li.disk-info[data-v-2ec06138]{display:flex;flex-wrap:nowrap;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%;padding:5px 8px;height:50px;cursor:pointer;color:#666;font-size:12px}ul.disk-item li.disk-info>svg[data-v-2ec06138]{margin-right:8px}ul.disk-item li.disk-info[data-v-2ec06138]:hover{background-color:#ecf5ff}ul.disk-item li.disk-info .disk-item_icon svg path[data-v-2ec06138]{fill:#09aaff}ul.disk-item li.disk-info .disk-item_f[data-v-2ec06138]{display:flex;flex-wrap:wrap;color:#000000d4}ul.disk-item li.disk-info .disk-item_f .disk-item_venderModel[data-v-2ec06138]{width:100%;font-size:14px;font-weight:500}ul.disk-item li.disk-info .disk-item_f .disk-item_used[data-v-2ec06138]{width:100%;font-size:12px}ul.disk-item .disk-children[data-v-2ec06138]{width:100%;color:#666;padding-left:24px;margin-top:4px}ul.disk-item .disk-children li.disk-children-item[data-v-2ec06138]{height:40px;font-size:12px;cursor:pointer;display:flex;flex-wrap:nowrap;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding:0 6px}ul.disk-item .disk-children li.disk-children-item>svg[data-v-2ec06138]{margin-right:20px}ul.disk-item .disk-children li.disk-children-item[data-v-2ec06138]:hover{background-color:#ecf5ff}ul.disk-item .disk-children li.disk-children-item>.disk-children-item_f[data-v-2ec06138]{color:#000000d4;display:flex;justify-content:center;justify-items:center}ul.disk-item .disk-children li.disk-children-item>.disk-children-item_f>div>span[data-v-2ec06138]{font-size:14px;font-weight:500}ul.disk-item .disk-children li.disk-children-item>.disk-children-item_f>div>div[data-v-2ec06138]{transform:scale(.8);transform-origin:0 50%}span.tag[data-v-2ec06138]{cursor:pointer;height:14px;margin-left:8px;display:inline-flex;padding:2px 8px;justify-content:center;align-items:center;font-size:12px;border-radius:16px;background:rgba(97,216,4,.2);line-height:12px}@keyframes turns-0763aef7{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-0763aef7]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-0763aef7]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-0763aef7]{color:#f9ad1e}.notice_info li[data-v-0763aef7]{font-size:14px;list-style:revert}.text-container[data-v-0763aef7]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-0763aef7]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-0763aef7]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-0763aef7]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-0763aef7]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-0763aef7]{width:100%}.text-container .text-container_item p.info-desc[data-v-0763aef7]{width:100%;color:#999;font-size:14px}.page-container[data-v-0763aef7]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-0763aef7]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-0763aef7]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-0763aef7]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-0763aef7],.page-container .page-flex .page-sidebar a[data-v-0763aef7]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-0763aef7]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-0763aef7]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-0763aef7]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-0763aef7]{border-radius:0;padding:1rem}ul.ul-container[data-v-0763aef7]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-0763aef7]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-0763aef7]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-0763aef7]{width:100%}form.form-container[data-v-0763aef7]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-0763aef7]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-0763aef7]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-0763aef7]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-0763aef7]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-0763aef7],form.form-container .label-value select[data-v-0763aef7]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-0763aef7]:focus,form.form-container .label-value select[data-v-0763aef7]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-0763aef7]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-0763aef7]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-0763aef7],form.form-container .label-value input[type=radio][data-v-0763aef7]{width:auto}form.form-container .label-value input[type=radio][data-v-0763aef7]{margin:0 4px 0 0}form.form-container .label-value input[data-v-0763aef7]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-0763aef7]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-0763aef7]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-0763aef7]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-0763aef7]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-0763aef7]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-0763aef7]:hover{background-color:#747474}form.form-container .label-msg[data-v-0763aef7]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-0763aef7]{color:#f9ad1e}form.form-container .label-flex[data-v-0763aef7]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-0763aef7]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-0763aef7]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-0763aef7]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-0763aef7]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-0763aef7]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-0763aef7]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-0763aef7],form.form-container1 .label-value select[data-v-0763aef7]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-0763aef7]:focus,form.form-container1 .label-value select[data-v-0763aef7]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-0763aef7]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-0763aef7],form.form-container1 .label-value input[type=radio][data-v-0763aef7]{width:auto}form.form-container1 .label-value input[type=radio][data-v-0763aef7]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-0763aef7]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-0763aef7]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-0763aef7]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-0763aef7]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-0763aef7]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-0763aef7]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-0763aef7]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-0763aef7]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-0763aef7]{color:#f9ad1e}form.form-container1 .label-flex[data-v-0763aef7]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-0763aef7]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-0763aef7]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-0763aef7]{width:100px}table.page-table th.checkbox[data-v-0763aef7]{width:50px;text-align:center}table.page-table th.setting[data-v-0763aef7]{width:100px;text-align:center}table.page-table thead[data-v-0763aef7]{color:#909399}table.page-table thead tr[data-v-0763aef7]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-0763aef7]{padding:10px 16px}table.page-table tbody tr[data-v-0763aef7]:hover{background-color:#eeee}table.page-table tbody tr[data-v-0763aef7]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-0763aef7]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-0763aef7]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-0763aef7]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-0763aef7]{width:100px}table.popups-table th.checkbox[data-v-0763aef7]{width:50px;text-align:center}table.popups-table th.setting[data-v-0763aef7]{width:100px;text-align:center}table.popups-table thead[data-v-0763aef7]{color:#eee}table.popups-table thead tr[data-v-0763aef7]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-0763aef7]{padding:10px 16px}table.popups-table tbody tr[data-v-0763aef7]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-0763aef7]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-0763aef7]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-0763aef7]{width:100%}header.header-desktop[data-v-0763aef7]{display:block}header.header-mobile[data-v-0763aef7]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-0763aef7]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-0763aef7]{width:100%;height:100%}header.header-mobile button svg path[data-v-0763aef7]{fill:#fff}nav.sidebar[data-v-0763aef7]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-0763aef7]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-0763aef7]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-0763aef7]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-0763aef7]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-0763aef7]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-0763aef7]{color:#fff}nav.sidebar .container .children[data-v-0763aef7]{padding-left:30px}@-moz-keyframes tada-0763aef7{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-0763aef7{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-0763aef7{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-0763aef7{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-0763aef7]{animation:dialogEnter-0763aef7 .3s linear forwards}.dialog-leave-active[data-v-0763aef7]{animation:dialogLeave-0763aef7 .3s linear forwards}@keyframes dialogEnter-0763aef7{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-0763aef7{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-0763aef7]{animation:dialogEnter-0763aef7 .2s linear forwards}.dialog1-leave-active[data-v-0763aef7]{animation:dialogLeave-0763aef7 .2s linear forwards}@keyframes rotateEnter-0763aef7{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-0763aef7]{animation:rotateEnter-0763aef7 .7s;position:relative}.rotate-leave-active[data-v-0763aef7]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-0763aef7{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-0763aef7{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-0763aef7]{animation:slideOutTop-0763aef7 .5s linear forwards}.slide-top-leave-active[data-v-0763aef7],.slide-bottom-enter-active[data-v-0763aef7]{animation:slideOutBottom-0763aef7 .5s linear forwards}@keyframes slideInLeft-0763aef7{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-0763aef7{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-0763aef7]{animation:slideInLeft-0763aef7 .3s linear forwards}.slide-left-leave-active[data-v-0763aef7]{animation:slideInRight-0763aef7 .3s linear forwards}@keyframes slideOutLeft-0763aef7{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-0763aef7{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-0763aef7]{animation:slideOutLeft-0763aef7 .3s linear forwards}.slide-right-leave-active[data-v-0763aef7]{animation:slideOutRight-0763aef7 .3s linear forwards}@keyframes bganimation-0763aef7{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-0763aef7{0%{height:0}to{height:100px}}@keyframes fadeEnd-0763aef7{0%{height:100%}to{height:0}}.fade-enter-active[data-v-0763aef7]{animation:fadeStart-0763aef7 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-0763aef7]{animation:fadeEnd-0763aef7 .1s linear forwards;overflow:hidden}.content .header[data-v-0763aef7]{font-size:12px;display:flex;justify-content:space-between;margin-bottom:16px}.content .header>div[data-v-0763aef7]:first-of-type{color:#000000a1}.content .header>div[data-v-0763aef7]:last-of-type{color:#0060ff;cursor:pointer}@keyframes turns-e79621ae{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-e79621ae]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-e79621ae]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-e79621ae]{color:#f9ad1e}.notice_info li[data-v-e79621ae]{font-size:14px;list-style:revert}.text-container[data-v-e79621ae]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-e79621ae]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-e79621ae]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-e79621ae]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-e79621ae]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-e79621ae]{width:100%}.text-container .text-container_item p.info-desc[data-v-e79621ae]{width:100%;color:#999;font-size:14px}.page-container[data-v-e79621ae]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-e79621ae]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-e79621ae]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-e79621ae]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-e79621ae],.page-container .page-flex .page-sidebar a[data-v-e79621ae]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-e79621ae]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-e79621ae]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-e79621ae]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-e79621ae]{border-radius:0;padding:1rem}ul.ul-container[data-v-e79621ae]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-e79621ae]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-e79621ae]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-e79621ae]{width:100%}form.form-container[data-v-e79621ae]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-e79621ae]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-e79621ae]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-e79621ae]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-e79621ae]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-e79621ae],form.form-container .label-value select[data-v-e79621ae]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-e79621ae]:focus,form.form-container .label-value select[data-v-e79621ae]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-e79621ae]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-e79621ae]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-e79621ae],form.form-container .label-value input[type=radio][data-v-e79621ae]{width:auto}form.form-container .label-value input[type=radio][data-v-e79621ae]{margin:0 4px 0 0}form.form-container .label-value input[data-v-e79621ae]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-e79621ae]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-e79621ae]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-e79621ae]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-e79621ae]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-e79621ae]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-e79621ae]:hover{background-color:#747474}form.form-container .label-msg[data-v-e79621ae]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-e79621ae]{color:#f9ad1e}form.form-container .label-flex[data-v-e79621ae]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-e79621ae]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-e79621ae]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-e79621ae]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-e79621ae]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-e79621ae]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-e79621ae]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-e79621ae],form.form-container1 .label-value select[data-v-e79621ae]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-e79621ae]:focus,form.form-container1 .label-value select[data-v-e79621ae]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-e79621ae]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-e79621ae],form.form-container1 .label-value input[type=radio][data-v-e79621ae]{width:auto}form.form-container1 .label-value input[type=radio][data-v-e79621ae]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-e79621ae]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-e79621ae]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-e79621ae]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-e79621ae]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-e79621ae]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-e79621ae]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-e79621ae]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-e79621ae]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-e79621ae]{color:#f9ad1e}form.form-container1 .label-flex[data-v-e79621ae]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-e79621ae]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-e79621ae]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-e79621ae]{width:100px}table.page-table th.checkbox[data-v-e79621ae]{width:50px;text-align:center}table.page-table th.setting[data-v-e79621ae]{width:100px;text-align:center}table.page-table thead[data-v-e79621ae]{color:#909399}table.page-table thead tr[data-v-e79621ae]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-e79621ae]{padding:10px 16px}table.page-table tbody tr[data-v-e79621ae]:hover{background-color:#eeee}table.page-table tbody tr[data-v-e79621ae]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-e79621ae]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-e79621ae]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-e79621ae]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-e79621ae]{width:100px}table.popups-table th.checkbox[data-v-e79621ae]{width:50px;text-align:center}table.popups-table th.setting[data-v-e79621ae]{width:100px;text-align:center}table.popups-table thead[data-v-e79621ae]{color:#eee}table.popups-table thead tr[data-v-e79621ae]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-e79621ae]{padding:10px 16px}table.popups-table tbody tr[data-v-e79621ae]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-e79621ae]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-e79621ae]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-e79621ae]{width:100%}header.header-desktop[data-v-e79621ae]{display:block}header.header-mobile[data-v-e79621ae]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-e79621ae]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-e79621ae]{width:100%;height:100%}header.header-mobile button svg path[data-v-e79621ae]{fill:#fff}nav.sidebar[data-v-e79621ae]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-e79621ae]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-e79621ae]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-e79621ae]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-e79621ae]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-e79621ae]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-e79621ae]{color:#fff}nav.sidebar .container .children[data-v-e79621ae]{padding-left:30px}@-moz-keyframes tada-e79621ae{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-e79621ae{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-e79621ae{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-e79621ae{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-e79621ae]{animation:dialogEnter-e79621ae .3s linear forwards}.dialog-leave-active[data-v-e79621ae]{animation:dialogLeave-e79621ae .3s linear forwards}@keyframes dialogEnter-e79621ae{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-e79621ae{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-e79621ae]{animation:dialogEnter-e79621ae .2s linear forwards}.dialog1-leave-active[data-v-e79621ae]{animation:dialogLeave-e79621ae .2s linear forwards}@keyframes rotateEnter-e79621ae{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-e79621ae]{animation:rotateEnter-e79621ae .7s;position:relative}.rotate-leave-active[data-v-e79621ae]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-e79621ae{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-e79621ae{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-e79621ae]{animation:slideOutTop-e79621ae .5s linear forwards}.slide-top-leave-active[data-v-e79621ae],.slide-bottom-enter-active[data-v-e79621ae]{animation:slideOutBottom-e79621ae .5s linear forwards}@keyframes slideInLeft-e79621ae{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-e79621ae{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-e79621ae]{animation:slideInLeft-e79621ae .3s linear forwards}.slide-left-leave-active[data-v-e79621ae]{animation:slideInRight-e79621ae .3s linear forwards}@keyframes slideOutLeft-e79621ae{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-e79621ae{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-e79621ae]{animation:slideOutLeft-e79621ae .3s linear forwards}.slide-right-leave-active[data-v-e79621ae]{animation:slideOutRight-e79621ae .3s linear forwards}@keyframes bganimation-e79621ae{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-e79621ae{0%{height:0}to{height:100px}}@keyframes fadeEnd-e79621ae{0%{height:100%}to{height:0}}.fade-enter-active[data-v-e79621ae]{animation:fadeStart-e79621ae .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-e79621ae]{animation:fadeEnd-e79621ae .1s linear forwards;overflow:hidden}.content[data-v-e79621ae]{height:230px}.form-container1 .label-value[data-v-e79621ae]{display:flex!important}.form-container1 .label-value>input[data-v-e79621ae]{height:30px!important;width:400px!important}.form-container1 .label-value input[type=checkbox][data-v-e79621ae]{height:auto!important}.form-container1 .label-value>.button[data-v-e79621ae]{cursor:pointer;margin-left:16px;color:#fff;font-size:14px;font-weight:500;display:flex;width:76px;height:30px;padding:5px 24px;justify-content:center;align-items:center;flex-shrink:0;border-radius:4px;background:#0060ff;box-shadow:0 1px 2px #00000026}@keyframes turns-6363551b{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-6363551b]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-6363551b]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-6363551b]{color:#f9ad1e}.notice_info li[data-v-6363551b]{font-size:14px;list-style:revert}.text-container[data-v-6363551b]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-6363551b]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-6363551b]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-6363551b]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-6363551b]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-6363551b]{width:100%}.text-container .text-container_item p.info-desc[data-v-6363551b]{width:100%;color:#999;font-size:14px}.page-container[data-v-6363551b]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-6363551b]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-6363551b]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-6363551b]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-6363551b],.page-container .page-flex .page-sidebar a[data-v-6363551b]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-6363551b]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-6363551b]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-6363551b]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-6363551b]{border-radius:0;padding:1rem}ul.ul-container[data-v-6363551b]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-6363551b]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-6363551b]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-6363551b]{width:100%}form.form-container[data-v-6363551b]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-6363551b]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-6363551b]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-6363551b]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-6363551b]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-6363551b],form.form-container .label-value select[data-v-6363551b]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-6363551b]:focus,form.form-container .label-value select[data-v-6363551b]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-6363551b]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-6363551b]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-6363551b],form.form-container .label-value input[type=radio][data-v-6363551b]{width:auto}form.form-container .label-value input[type=radio][data-v-6363551b]{margin:0 4px 0 0}form.form-container .label-value input[data-v-6363551b]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-6363551b]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-6363551b]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-6363551b]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-6363551b]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-6363551b]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-6363551b]:hover{background-color:#747474}form.form-container .label-msg[data-v-6363551b]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-6363551b]{color:#f9ad1e}form.form-container .label-flex[data-v-6363551b]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-6363551b]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-6363551b]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-6363551b]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-6363551b]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-6363551b]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-6363551b]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-6363551b],form.form-container1 .label-value select[data-v-6363551b]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-6363551b]:focus,form.form-container1 .label-value select[data-v-6363551b]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-6363551b]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-6363551b],form.form-container1 .label-value input[type=radio][data-v-6363551b]{width:auto}form.form-container1 .label-value input[type=radio][data-v-6363551b]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-6363551b]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-6363551b]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-6363551b]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-6363551b]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-6363551b]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-6363551b]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-6363551b]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-6363551b]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-6363551b]{color:#f9ad1e}form.form-container1 .label-flex[data-v-6363551b]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-6363551b]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-6363551b]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-6363551b]{width:100px}table.page-table th.checkbox[data-v-6363551b]{width:50px;text-align:center}table.page-table th.setting[data-v-6363551b]{width:100px;text-align:center}table.page-table thead[data-v-6363551b]{color:#909399}table.page-table thead tr[data-v-6363551b]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-6363551b]{padding:10px 16px}table.page-table tbody tr[data-v-6363551b]:hover{background-color:#eeee}table.page-table tbody tr[data-v-6363551b]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-6363551b]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-6363551b]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-6363551b]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-6363551b]{width:100px}table.popups-table th.checkbox[data-v-6363551b]{width:50px;text-align:center}table.popups-table th.setting[data-v-6363551b]{width:100px;text-align:center}table.popups-table thead[data-v-6363551b]{color:#eee}table.popups-table thead tr[data-v-6363551b]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-6363551b]{padding:10px 16px}table.popups-table tbody tr[data-v-6363551b]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-6363551b]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-6363551b]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-6363551b]{width:100%}header.header-desktop[data-v-6363551b]{display:block}header.header-mobile[data-v-6363551b]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-6363551b]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-6363551b]{width:100%;height:100%}header.header-mobile button svg path[data-v-6363551b]{fill:#fff}nav.sidebar[data-v-6363551b]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-6363551b]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-6363551b]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-6363551b]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-6363551b]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-6363551b]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-6363551b]{color:#fff}nav.sidebar .container .children[data-v-6363551b]{padding-left:30px}@-moz-keyframes tada-6363551b{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-6363551b{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-6363551b{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-6363551b{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-6363551b]{animation:dialogEnter-6363551b .3s linear forwards}.dialog-leave-active[data-v-6363551b]{animation:dialogLeave-6363551b .3s linear forwards}@keyframes dialogEnter-6363551b{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-6363551b{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-6363551b]{animation:dialogEnter-6363551b .2s linear forwards}.dialog1-leave-active[data-v-6363551b]{animation:dialogLeave-6363551b .2s linear forwards}@keyframes rotateEnter-6363551b{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-6363551b]{animation:rotateEnter-6363551b .7s;position:relative}.rotate-leave-active[data-v-6363551b]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-6363551b{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-6363551b{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-6363551b]{animation:slideOutTop-6363551b .5s linear forwards}.slide-top-leave-active[data-v-6363551b],.slide-bottom-enter-active[data-v-6363551b]{animation:slideOutBottom-6363551b .5s linear forwards}@keyframes slideInLeft-6363551b{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-6363551b{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-6363551b]{animation:slideInLeft-6363551b .3s linear forwards}.slide-left-leave-active[data-v-6363551b]{animation:slideInRight-6363551b .3s linear forwards}@keyframes slideOutLeft-6363551b{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-6363551b{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-6363551b]{animation:slideOutLeft-6363551b .3s linear forwards}.slide-right-leave-active[data-v-6363551b]{animation:slideOutRight-6363551b .3s linear forwards}@keyframes bganimation-6363551b{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-6363551b{0%{height:0}to{height:100px}}@keyframes fadeEnd-6363551b{0%{height:100%}to{height:0}}.fade-enter-active[data-v-6363551b]{animation:fadeStart-6363551b .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-6363551b]{animation:fadeEnd-6363551b .1s linear forwards;overflow:hidden}span[data-v-6363551b]{display:inline-block}.title[data-v-6363551b]{margin-top:18px;width:100%;text-align:center;color:#3c4149;font-size:20px;font-weight:600}.detail[data-v-6363551b]{padding:32px;margin-bottom:12px}.detail>div>span[data-v-6363551b]{color:#3c4149;font-size:13px;font-weight:500;line-height:23px}.detail>div>span[data-v-6363551b]:first-of-type{margin-right:8px}@keyframes turns-26847234{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-26847234]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-26847234]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-26847234]{color:#f9ad1e}.notice_info li[data-v-26847234]{font-size:14px;list-style:revert}.text-container[data-v-26847234]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-26847234]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-26847234]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-26847234]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-26847234]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-26847234]{width:100%}.text-container .text-container_item p.info-desc[data-v-26847234]{width:100%;color:#999;font-size:14px}.page-container[data-v-26847234]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-26847234]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-26847234]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-26847234]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-26847234],.page-container .page-flex .page-sidebar a[data-v-26847234]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-26847234]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-26847234]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-26847234]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-26847234]{border-radius:0;padding:1rem}ul.ul-container[data-v-26847234]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-26847234]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-26847234]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-26847234]{width:100%}form.form-container[data-v-26847234]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-26847234]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-26847234]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-26847234]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-26847234]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-26847234],form.form-container .label-value select[data-v-26847234]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-26847234]:focus,form.form-container .label-value select[data-v-26847234]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-26847234]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-26847234]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-26847234],form.form-container .label-value input[type=radio][data-v-26847234]{width:auto}form.form-container .label-value input[type=radio][data-v-26847234]{margin:0 4px 0 0}form.form-container .label-value input[data-v-26847234]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-26847234]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-26847234]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-26847234]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-26847234]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-26847234]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-26847234]:hover{background-color:#747474}form.form-container .label-msg[data-v-26847234]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-26847234]{color:#f9ad1e}form.form-container .label-flex[data-v-26847234]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-26847234]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-26847234]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-26847234]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-26847234]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-26847234]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-26847234]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-26847234],form.form-container1 .label-value select[data-v-26847234]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-26847234]:focus,form.form-container1 .label-value select[data-v-26847234]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-26847234]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-26847234],form.form-container1 .label-value input[type=radio][data-v-26847234]{width:auto}form.form-container1 .label-value input[type=radio][data-v-26847234]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-26847234]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-26847234]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-26847234]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-26847234]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-26847234]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-26847234]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-26847234]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-26847234]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-26847234]{color:#f9ad1e}form.form-container1 .label-flex[data-v-26847234]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-26847234]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-26847234]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-26847234]{width:100px}table.page-table th.checkbox[data-v-26847234]{width:50px;text-align:center}table.page-table th.setting[data-v-26847234]{width:100px;text-align:center}table.page-table thead[data-v-26847234]{color:#909399}table.page-table thead tr[data-v-26847234]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-26847234]{padding:10px 16px}table.page-table tbody tr[data-v-26847234]:hover{background-color:#eeee}table.page-table tbody tr[data-v-26847234]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-26847234]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-26847234]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-26847234]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-26847234]{width:100px}table.popups-table th.checkbox[data-v-26847234]{width:50px;text-align:center}table.popups-table th.setting[data-v-26847234]{width:100px;text-align:center}table.popups-table thead[data-v-26847234]{color:#eee}table.popups-table thead tr[data-v-26847234]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-26847234]{padding:10px 16px}table.popups-table tbody tr[data-v-26847234]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-26847234]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-26847234]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-26847234]{width:100%}header.header-desktop[data-v-26847234]{display:block}header.header-mobile[data-v-26847234]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-26847234]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-26847234]{width:100%;height:100%}header.header-mobile button svg path[data-v-26847234]{fill:#fff}nav.sidebar[data-v-26847234]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-26847234]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-26847234]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-26847234]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-26847234]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-26847234]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-26847234]{color:#fff}nav.sidebar .container .children[data-v-26847234]{padding-left:30px}@-moz-keyframes tada-26847234{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-26847234{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-26847234{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-26847234{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-26847234]{animation:dialogEnter-26847234 .3s linear forwards}.dialog-leave-active[data-v-26847234]{animation:dialogLeave-26847234 .3s linear forwards}@keyframes dialogEnter-26847234{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-26847234{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-26847234]{animation:dialogEnter-26847234 .2s linear forwards}.dialog1-leave-active[data-v-26847234]{animation:dialogLeave-26847234 .2s linear forwards}@keyframes rotateEnter-26847234{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-26847234]{animation:rotateEnter-26847234 .7s;position:relative}.rotate-leave-active[data-v-26847234]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-26847234{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-26847234{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-26847234]{animation:slideOutTop-26847234 .5s linear forwards}.slide-top-leave-active[data-v-26847234],.slide-bottom-enter-active[data-v-26847234]{animation:slideOutBottom-26847234 .5s linear forwards}@keyframes slideInLeft-26847234{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-26847234{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-26847234]{animation:slideInLeft-26847234 .3s linear forwards}.slide-left-leave-active[data-v-26847234]{animation:slideInRight-26847234 .3s linear forwards}@keyframes slideOutLeft-26847234{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-26847234{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-26847234]{animation:slideOutLeft-26847234 .3s linear forwards}.slide-right-leave-active[data-v-26847234]{animation:slideOutRight-26847234 .3s linear forwards}@keyframes bganimation-26847234{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-26847234{0%{height:0}to{height:100px}}@keyframes fadeEnd-26847234{0%{height:100%}to{height:0}}.fade-enter-active[data-v-26847234]{animation:fadeStart-26847234 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-26847234]{animation:fadeEnd-26847234 .1s linear forwards;overflow:hidden}.add-user[data-v-26847234]{display:inline-flex;padding:4px 24px;justify-content:center;align-items:center;gap:10px;border-radius:4px;background:#0060ff;color:#fff;text-align:center;font-size:14px;line-height:22px;margin-bottom:12px}@keyframes turns-9c961df4{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-9c961df4]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-9c961df4]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-9c961df4]{color:#f9ad1e}.notice_info li[data-v-9c961df4]{font-size:14px;list-style:revert}.text-container[data-v-9c961df4]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-9c961df4]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-9c961df4]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-9c961df4]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-9c961df4]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-9c961df4]{width:100%}.text-container .text-container_item p.info-desc[data-v-9c961df4]{width:100%;color:#999;font-size:14px}.page-container[data-v-9c961df4]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-9c961df4]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-9c961df4]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-9c961df4]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-9c961df4],.page-container .page-flex .page-sidebar a[data-v-9c961df4]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-9c961df4]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-9c961df4]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-9c961df4]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-9c961df4]{border-radius:0;padding:1rem}ul.ul-container[data-v-9c961df4]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-9c961df4]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-9c961df4]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-9c961df4]{width:100%}form.form-container[data-v-9c961df4]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-9c961df4]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-9c961df4]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-9c961df4]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-9c961df4]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-9c961df4],form.form-container .label-value select[data-v-9c961df4]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-9c961df4]:focus,form.form-container .label-value select[data-v-9c961df4]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-9c961df4]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-9c961df4]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-9c961df4],form.form-container .label-value input[type=radio][data-v-9c961df4]{width:auto}form.form-container .label-value input[type=radio][data-v-9c961df4]{margin:0 4px 0 0}form.form-container .label-value input[data-v-9c961df4]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-9c961df4]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-9c961df4]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-9c961df4]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-9c961df4]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-9c961df4]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-9c961df4]:hover{background-color:#747474}form.form-container .label-msg[data-v-9c961df4]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-9c961df4]{color:#f9ad1e}form.form-container .label-flex[data-v-9c961df4]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-9c961df4]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-9c961df4]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-9c961df4]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-9c961df4]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-9c961df4]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-9c961df4]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-9c961df4],form.form-container1 .label-value select[data-v-9c961df4]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-9c961df4]:focus,form.form-container1 .label-value select[data-v-9c961df4]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-9c961df4]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-9c961df4],form.form-container1 .label-value input[type=radio][data-v-9c961df4]{width:auto}form.form-container1 .label-value input[type=radio][data-v-9c961df4]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-9c961df4]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-9c961df4]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-9c961df4]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-9c961df4]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-9c961df4]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-9c961df4]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-9c961df4]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-9c961df4]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-9c961df4]{color:#f9ad1e}form.form-container1 .label-flex[data-v-9c961df4]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-9c961df4]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-9c961df4]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-9c961df4]{width:100px}table.page-table th.checkbox[data-v-9c961df4]{width:50px;text-align:center}table.page-table th.setting[data-v-9c961df4]{width:100px;text-align:center}table.page-table thead[data-v-9c961df4]{color:#909399}table.page-table thead tr[data-v-9c961df4]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-9c961df4]{padding:10px 16px}table.page-table tbody tr[data-v-9c961df4]:hover{background-color:#eeee}table.page-table tbody tr[data-v-9c961df4]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-9c961df4]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-9c961df4]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-9c961df4]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-9c961df4]{width:100px}table.popups-table th.checkbox[data-v-9c961df4]{width:50px;text-align:center}table.popups-table th.setting[data-v-9c961df4]{width:100px;text-align:center}table.popups-table thead[data-v-9c961df4]{color:#eee}table.popups-table thead tr[data-v-9c961df4]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-9c961df4]{padding:10px 16px}table.popups-table tbody tr[data-v-9c961df4]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-9c961df4]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-9c961df4]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-9c961df4]{width:100%}header.header-desktop[data-v-9c961df4]{display:block}header.header-mobile[data-v-9c961df4]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-9c961df4]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-9c961df4]{width:100%;height:100%}header.header-mobile button svg path[data-v-9c961df4]{fill:#fff}nav.sidebar[data-v-9c961df4]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-9c961df4]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-9c961df4]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-9c961df4]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-9c961df4]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-9c961df4]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-9c961df4]{color:#fff}nav.sidebar .container .children[data-v-9c961df4]{padding-left:30px}@-moz-keyframes tada-9c961df4{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-9c961df4{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-9c961df4{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-9c961df4{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-9c961df4]{animation:dialogEnter-9c961df4 .3s linear forwards}.dialog-leave-active[data-v-9c961df4]{animation:dialogLeave-9c961df4 .3s linear forwards}@keyframes dialogEnter-9c961df4{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-9c961df4{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-9c961df4]{animation:dialogEnter-9c961df4 .2s linear forwards}.dialog1-leave-active[data-v-9c961df4]{animation:dialogLeave-9c961df4 .2s linear forwards}@keyframes rotateEnter-9c961df4{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-9c961df4]{animation:rotateEnter-9c961df4 .7s;position:relative}.rotate-leave-active[data-v-9c961df4]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-9c961df4{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-9c961df4{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-9c961df4]{animation:slideOutTop-9c961df4 .5s linear forwards}.slide-top-leave-active[data-v-9c961df4],.slide-bottom-enter-active[data-v-9c961df4]{animation:slideOutBottom-9c961df4 .5s linear forwards}@keyframes slideInLeft-9c961df4{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-9c961df4{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-9c961df4]{animation:slideInLeft-9c961df4 .3s linear forwards}.slide-left-leave-active[data-v-9c961df4]{animation:slideInRight-9c961df4 .3s linear forwards}@keyframes slideOutLeft-9c961df4{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-9c961df4{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-9c961df4]{animation:slideOutLeft-9c961df4 .3s linear forwards}.slide-right-leave-active[data-v-9c961df4]{animation:slideOutRight-9c961df4 .3s linear forwards}@keyframes bganimation-9c961df4{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-9c961df4{0%{height:0}to{height:100px}}@keyframes fadeEnd-9c961df4{0%{height:100%}to{height:0}}.fade-enter-active[data-v-9c961df4]{animation:fadeStart-9c961df4 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-9c961df4]{animation:fadeEnd-9c961df4 .1s linear forwards;overflow:hidden}.list[data-v-9c961df4]{min-height:230px}.list>div>div[data-v-9c961df4]{width:100%;height:80px;border:1px solid #d1d1d1;padding:0 16px;display:flex;align-items:center;margin-bottom:8px}.list>div>div>div.img[data-v-9c961df4]{display:inline-block;width:60px;height:60px;margin-right:12px}.list>div>div>div.img>svg[data-v-9c961df4]{width:100%}.list>div>div>div.name[data-v-9c961df4]{flex:1}.list>div>div>div.name>div[data-v-9c961df4]{width:125%;transform:scale(.8);transform-origin:0 0;color:#000c;font-size:12px;font-weight:400;line-height:24px;display:flex}.list>div>div>div.name>div>span[data-v-9c961df4]{display:inline-block}.list>div>div>div.name>div>span[data-v-9c961df4]:first-of-type{margin-right:12px}.list>div>div>div.name>div>span[data-v-9c961df4]:last-of-type{flex:1;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.list>div>div>div.name>span[data-v-9c961df4]:first-of-type{color:#000;font-size:18px;font-weight:700;width:100%;display:inline-block}.list>div>div>div.name>span[data-v-9c961df4]:last-of-type{color:#3c4149;font-size:13px}.list>div>div>div.action[data-v-9c961df4]{width:82px;display:flex;justify-content:space-between;cursor:pointer}.list>div>div>div.action>span[data-v-9c961df4]{display:inline-block;width:30px;height:30px}.list>div>div>div.action>span>svg[data-v-9c961df4]{height:100%;width:100%}.list>button[data-v-9c961df4]{display:inline-flex;padding:4px 24px;justify-content:center;align-items:center;gap:10px;border-radius:4px;background:#0060ff;color:#fff;text-align:center;font-size:14px;line-height:22px;margin-bottom:10px}.no-data[data-v-9c961df4]{height:230px;position:relative}.no-data>div[data-v-9c961df4]{width:176px;height:94px;display:block;position:relative;top:50%;margin:0 auto;transform:translateY(-50%)}.no-data>div>span[data-v-9c961df4]{display:inline-block;width:100%;text-align:center;font-size:14px;margin-bottom:32px}.no-data>div .btns[data-v-9c961df4]{margin:0 auto;width:120px;border-radius:.3rem;color:#eee;min-width:70px;font-size:13px;height:32px;line-height:32px;cursor:pointer;box-shadow:0 0 17px #0000001a;background-color:#2075f3}.no-data>div .btns>span[data-v-9c961df4]{display:inline-block;width:100%;text-align:center}@keyframes turns-4a2e9fae{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-4a2e9fae]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-4a2e9fae]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-4a2e9fae]{color:#f9ad1e}.notice_info li[data-v-4a2e9fae]{font-size:14px;list-style:revert}.text-container[data-v-4a2e9fae]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-4a2e9fae]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-4a2e9fae]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-4a2e9fae]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-4a2e9fae]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-4a2e9fae]{width:100%}.text-container .text-container_item p.info-desc[data-v-4a2e9fae]{width:100%;color:#999;font-size:14px}.page-container[data-v-4a2e9fae]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-4a2e9fae]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-4a2e9fae]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-4a2e9fae]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-4a2e9fae],.page-container .page-flex .page-sidebar a[data-v-4a2e9fae]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-4a2e9fae]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-4a2e9fae]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-4a2e9fae]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-4a2e9fae]{border-radius:0;padding:1rem}ul.ul-container[data-v-4a2e9fae]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-4a2e9fae]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-4a2e9fae]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-4a2e9fae]{width:100%}form.form-container[data-v-4a2e9fae]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-4a2e9fae]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-4a2e9fae]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-4a2e9fae]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-4a2e9fae]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-4a2e9fae],form.form-container .label-value select[data-v-4a2e9fae]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-4a2e9fae]:focus,form.form-container .label-value select[data-v-4a2e9fae]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-4a2e9fae]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-4a2e9fae]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-4a2e9fae],form.form-container .label-value input[type=radio][data-v-4a2e9fae]{width:auto}form.form-container .label-value input[type=radio][data-v-4a2e9fae]{margin:0 4px 0 0}form.form-container .label-value input[data-v-4a2e9fae]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-4a2e9fae]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-4a2e9fae]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-4a2e9fae]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-4a2e9fae]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-4a2e9fae]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-4a2e9fae]:hover{background-color:#747474}form.form-container .label-msg[data-v-4a2e9fae]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-4a2e9fae]{color:#f9ad1e}form.form-container .label-flex[data-v-4a2e9fae]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-4a2e9fae]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-4a2e9fae]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-4a2e9fae]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-4a2e9fae]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-4a2e9fae]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-4a2e9fae]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-4a2e9fae],form.form-container1 .label-value select[data-v-4a2e9fae]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-4a2e9fae]:focus,form.form-container1 .label-value select[data-v-4a2e9fae]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-4a2e9fae]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-4a2e9fae],form.form-container1 .label-value input[type=radio][data-v-4a2e9fae]{width:auto}form.form-container1 .label-value input[type=radio][data-v-4a2e9fae]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-4a2e9fae]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-4a2e9fae]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-4a2e9fae]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-4a2e9fae]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-4a2e9fae]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-4a2e9fae]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-4a2e9fae]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-4a2e9fae]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-4a2e9fae]{color:#f9ad1e}form.form-container1 .label-flex[data-v-4a2e9fae]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-4a2e9fae]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-4a2e9fae]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-4a2e9fae]{width:100px}table.page-table th.checkbox[data-v-4a2e9fae]{width:50px;text-align:center}table.page-table th.setting[data-v-4a2e9fae]{width:100px;text-align:center}table.page-table thead[data-v-4a2e9fae]{color:#909399}table.page-table thead tr[data-v-4a2e9fae]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-4a2e9fae]{padding:10px 16px}table.page-table tbody tr[data-v-4a2e9fae]:hover{background-color:#eeee}table.page-table tbody tr[data-v-4a2e9fae]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-4a2e9fae]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-4a2e9fae]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-4a2e9fae]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-4a2e9fae]{width:100px}table.popups-table th.checkbox[data-v-4a2e9fae]{width:50px;text-align:center}table.popups-table th.setting[data-v-4a2e9fae]{width:100px;text-align:center}table.popups-table thead[data-v-4a2e9fae]{color:#eee}table.popups-table thead tr[data-v-4a2e9fae]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-4a2e9fae]{padding:10px 16px}table.popups-table tbody tr[data-v-4a2e9fae]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-4a2e9fae]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-4a2e9fae]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-4a2e9fae]{width:100%}header.header-desktop[data-v-4a2e9fae]{display:block}header.header-mobile[data-v-4a2e9fae]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-4a2e9fae]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-4a2e9fae]{width:100%;height:100%}header.header-mobile button svg path[data-v-4a2e9fae]{fill:#fff}nav.sidebar[data-v-4a2e9fae]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-4a2e9fae]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-4a2e9fae]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-4a2e9fae]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-4a2e9fae]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-4a2e9fae]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-4a2e9fae]{color:#fff}nav.sidebar .container .children[data-v-4a2e9fae]{padding-left:30px}@-moz-keyframes tada-4a2e9fae{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-4a2e9fae{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-4a2e9fae{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-4a2e9fae{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-4a2e9fae]{animation:dialogEnter-4a2e9fae .3s linear forwards}.dialog-leave-active[data-v-4a2e9fae]{animation:dialogLeave-4a2e9fae .3s linear forwards}@keyframes dialogEnter-4a2e9fae{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-4a2e9fae{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-4a2e9fae]{animation:dialogEnter-4a2e9fae .2s linear forwards}.dialog1-leave-active[data-v-4a2e9fae]{animation:dialogLeave-4a2e9fae .2s linear forwards}@keyframes rotateEnter-4a2e9fae{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-4a2e9fae]{animation:rotateEnter-4a2e9fae .7s;position:relative}.rotate-leave-active[data-v-4a2e9fae]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-4a2e9fae{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-4a2e9fae{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-4a2e9fae]{animation:slideOutTop-4a2e9fae .5s linear forwards}.slide-top-leave-active[data-v-4a2e9fae],.slide-bottom-enter-active[data-v-4a2e9fae]{animation:slideOutBottom-4a2e9fae .5s linear forwards}@keyframes slideInLeft-4a2e9fae{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-4a2e9fae{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-4a2e9fae]{animation:slideInLeft-4a2e9fae .3s linear forwards}.slide-left-leave-active[data-v-4a2e9fae]{animation:slideInRight-4a2e9fae .3s linear forwards}@keyframes slideOutLeft-4a2e9fae{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-4a2e9fae{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-4a2e9fae]{animation:slideOutLeft-4a2e9fae .3s linear forwards}.slide-right-leave-active[data-v-4a2e9fae]{animation:slideOutRight-4a2e9fae .3s linear forwards}@keyframes bganimation-4a2e9fae{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-4a2e9fae{0%{height:0}to{height:100px}}@keyframes fadeEnd-4a2e9fae{0%{height:100%}to{height:0}}.fade-enter-active[data-v-4a2e9fae]{animation:fadeStart-4a2e9fae .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-4a2e9fae]{animation:fadeEnd-4a2e9fae .1s linear forwards;overflow:hidden}.list>button[data-v-4a2e9fae]{display:inline-flex;padding:4px 24px;justify-content:center;align-items:center;gap:10px;border-radius:4px;background:#0060ff;color:#fff;text-align:center;font-size:14px;line-height:22px;margin-bottom:10px}.action[data-v-4a2e9fae]{display:flex;flex:1;justify-items:center;justify-content:space-between}.action>span[data-v-4a2e9fae]{display:inline-block;width:80px;height:30px;line-height:30px;text-align:center;cursor:pointer}.action>span>svg[data-v-4a2e9fae]{height:100%;width:100%}.no-data[data-v-4a2e9fae]{height:230px;position:relative}.no-data>div[data-v-4a2e9fae]{width:176px;height:94px;display:block;position:relative;top:50%;margin:0 auto;transform:translateY(-50%)}.no-data>div>span[data-v-4a2e9fae]{display:inline-block;width:100%;text-align:center;font-size:14px;margin-bottom:32px}.no-data>div .btns[data-v-4a2e9fae]{margin:0 auto;width:120px;border-radius:.3rem;color:#eee;min-width:70px;font-size:13px;height:32px;line-height:32px;cursor:pointer;box-shadow:0 0 17px #0000001a;background-color:#2075f3}.no-data>div .btns>span[data-v-4a2e9fae]{display:inline-block;width:100%;text-align:center}@keyframes turns-019a9ac0{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-019a9ac0]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-019a9ac0]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-019a9ac0]{color:#f9ad1e}.notice_info li[data-v-019a9ac0]{font-size:14px;list-style:revert}.text-container[data-v-019a9ac0]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-019a9ac0]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-019a9ac0]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-019a9ac0]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-019a9ac0]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-019a9ac0]{width:100%}.text-container .text-container_item p.info-desc[data-v-019a9ac0]{width:100%;color:#999;font-size:14px}.page-container[data-v-019a9ac0]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-019a9ac0]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-019a9ac0]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-019a9ac0]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-019a9ac0],.page-container .page-flex .page-sidebar a[data-v-019a9ac0]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-019a9ac0]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-019a9ac0]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-019a9ac0]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-019a9ac0]{border-radius:0;padding:1rem}ul.ul-container[data-v-019a9ac0]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-019a9ac0]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-019a9ac0]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-019a9ac0]{width:100%}form.form-container[data-v-019a9ac0]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-019a9ac0]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-019a9ac0]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-019a9ac0]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-019a9ac0]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-019a9ac0],form.form-container .label-value select[data-v-019a9ac0]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-019a9ac0]:focus,form.form-container .label-value select[data-v-019a9ac0]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-019a9ac0]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-019a9ac0]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-019a9ac0],form.form-container .label-value input[type=radio][data-v-019a9ac0]{width:auto}form.form-container .label-value input[type=radio][data-v-019a9ac0]{margin:0 4px 0 0}form.form-container .label-value input[data-v-019a9ac0]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-019a9ac0]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-019a9ac0]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-019a9ac0]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-019a9ac0]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-019a9ac0]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-019a9ac0]:hover{background-color:#747474}form.form-container .label-msg[data-v-019a9ac0]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-019a9ac0]{color:#f9ad1e}form.form-container .label-flex[data-v-019a9ac0]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-019a9ac0]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-019a9ac0]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-019a9ac0]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-019a9ac0]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-019a9ac0]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-019a9ac0]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-019a9ac0],form.form-container1 .label-value select[data-v-019a9ac0]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-019a9ac0]:focus,form.form-container1 .label-value select[data-v-019a9ac0]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-019a9ac0]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-019a9ac0],form.form-container1 .label-value input[type=radio][data-v-019a9ac0]{width:auto}form.form-container1 .label-value input[type=radio][data-v-019a9ac0]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-019a9ac0]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-019a9ac0]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-019a9ac0]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-019a9ac0]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-019a9ac0]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-019a9ac0]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-019a9ac0]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-019a9ac0]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-019a9ac0]{color:#f9ad1e}form.form-container1 .label-flex[data-v-019a9ac0]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-019a9ac0]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-019a9ac0]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-019a9ac0]{width:100px}table.page-table th.checkbox[data-v-019a9ac0]{width:50px;text-align:center}table.page-table th.setting[data-v-019a9ac0]{width:100px;text-align:center}table.page-table thead[data-v-019a9ac0]{color:#909399}table.page-table thead tr[data-v-019a9ac0]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-019a9ac0]{padding:10px 16px}table.page-table tbody tr[data-v-019a9ac0]:hover{background-color:#eeee}table.page-table tbody tr[data-v-019a9ac0]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-019a9ac0]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-019a9ac0]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-019a9ac0]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-019a9ac0]{width:100px}table.popups-table th.checkbox[data-v-019a9ac0]{width:50px;text-align:center}table.popups-table th.setting[data-v-019a9ac0]{width:100px;text-align:center}table.popups-table thead[data-v-019a9ac0]{color:#eee}table.popups-table thead tr[data-v-019a9ac0]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-019a9ac0]{padding:10px 16px}table.popups-table tbody tr[data-v-019a9ac0]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-019a9ac0]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-019a9ac0]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-019a9ac0]{width:100%}header.header-desktop[data-v-019a9ac0]{display:block}header.header-mobile[data-v-019a9ac0]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-019a9ac0]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-019a9ac0]{width:100%;height:100%}header.header-mobile button svg path[data-v-019a9ac0]{fill:#fff}nav.sidebar[data-v-019a9ac0]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-019a9ac0]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-019a9ac0]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-019a9ac0]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-019a9ac0]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-019a9ac0]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-019a9ac0]{color:#fff}nav.sidebar .container .children[data-v-019a9ac0]{padding-left:30px}@-moz-keyframes tada-019a9ac0{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-019a9ac0{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-019a9ac0{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-019a9ac0{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-019a9ac0]{animation:dialogEnter-019a9ac0 .3s linear forwards}.dialog-leave-active[data-v-019a9ac0]{animation:dialogLeave-019a9ac0 .3s linear forwards}@keyframes dialogEnter-019a9ac0{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-019a9ac0{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-019a9ac0]{animation:dialogEnter-019a9ac0 .2s linear forwards}.dialog1-leave-active[data-v-019a9ac0]{animation:dialogLeave-019a9ac0 .2s linear forwards}@keyframes rotateEnter-019a9ac0{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-019a9ac0]{animation:rotateEnter-019a9ac0 .7s;position:relative}.rotate-leave-active[data-v-019a9ac0]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-019a9ac0{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-019a9ac0{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-019a9ac0]{animation:slideOutTop-019a9ac0 .5s linear forwards}.slide-top-leave-active[data-v-019a9ac0],.slide-bottom-enter-active[data-v-019a9ac0]{animation:slideOutBottom-019a9ac0 .5s linear forwards}@keyframes slideInLeft-019a9ac0{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-019a9ac0{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-019a9ac0]{animation:slideInLeft-019a9ac0 .3s linear forwards}.slide-left-leave-active[data-v-019a9ac0]{animation:slideInRight-019a9ac0 .3s linear forwards}@keyframes slideOutLeft-019a9ac0{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-019a9ac0{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-019a9ac0]{animation:slideOutLeft-019a9ac0 .3s linear forwards}.slide-right-leave-active[data-v-019a9ac0]{animation:slideOutRight-019a9ac0 .3s linear forwards}@keyframes bganimation-019a9ac0{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-019a9ac0{0%{height:0}to{height:100px}}@keyframes fadeEnd-019a9ac0{0%{height:100%}to{height:0}}.fade-enter-active[data-v-019a9ac0]{animation:fadeStart-019a9ac0 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-019a9ac0]{animation:fadeEnd-019a9ac0 .1s linear forwards;overflow:hidden}.header[data-v-019a9ac0]{position:relative;height:44px;width:100%;background:linear-gradient(180deg,rgba(255,255,255,.64) 0%,rgba(255,255,255,.4) 100%);display:flex;justify-content:space-between;align-items:center;padding:0 32px 0 80px}.header>img[data-v-019a9ac0]{height:28px}.header>.menu[data-v-019a9ac0]{position:relative;display:flex}.header>.menu>*[data-v-019a9ac0]{margin-left:16px;cursor:pointer;width:28px;height:28px}.header>.menu .language[data-v-019a9ac0]{position:relative}.header>.menu .language .actions[data-v-019a9ac0]{position:absolute;z-index:999;width:30%;right:0;top:1em}.header>.menu .language .actions .menu_background[data-v-019a9ac0]{position:fixed;inset:0}.header>.menu .language .actions ul[data-v-019a9ac0]{background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:4px 8px;border-radius:6px;top:18px;right:0;text-align:center;position:absolute;word-break:keep-all}.header>.menu .language .actions ul li[data-v-019a9ac0]{margin:6px 0;cursor:pointer;font-size:12px;font-weight:400}.header>.menu .language .actions ul li[data-v-019a9ac0]:hover{background-color:#eee}.header>.menu>.dropdown-container[data-v-019a9ac0]{position:relative}.dropdown-container[data-v-019a9ac0]{width:240px;right:0;position:absolute;top:100%;z-index:20;margin-top:.5rem;backdrop-filter:blur(1rem);background:#fff;border-radius:4px;padding:8px;text-align:left}.dropdown-container h2.title[data-v-019a9ac0]{font-size:14px;font-weight:600;color:#363636;line-height:1.125;width:100%;display:flex}.dropdown-container h2.title a[data-v-019a9ac0]{font-size:14px;color:#666}.dropdown-container h2.title a[data-v-019a9ac0]:hover{color:#418cff}.dropdown-container .dropdown-menu_item[data-v-019a9ac0]{width:100%;display:flex;align-items:center;margin-bottom:1rem;font-size:12px;font-weight:400}.dropdown-container .dropdown-menu_item>span[data-v-019a9ac0]{color:#4a4a4a;display:block;font-size:.875rem;font-weight:700;position:relative}.dropdown-container .dropdown-menu_item>span em[data-v-019a9ac0]{position:absolute;padding:3px;border-radius:50%;background:#ef6a6a;right:-.3rem}.dropdown-container .dropdown-menu_item .icons[data-v-019a9ac0]{width:16px;height:16px;margin:0;padding:0;margin-right:.1rem;display:flex}.dropdown-container .dropdown-menu_item label[data-v-019a9ac0]{background-color:#363636;border-color:transparent;color:#fff;border-radius:9999px;padding:.1rem .8rem;font-size:12px;cursor:pointer}.dropdown-container .dropdown-menu_item a[data-v-019a9ac0]{color:#4a4a4a;display:block;font-size:.875rem;line-height:1.5;position:relative}.dropdown-container .dropdown-menu_item .status[data-v-019a9ac0]{display:flex;align-items:center}.dropdown-container .dropdown-menu_item .status span[data-v-019a9ac0]{font-size:13px;margin-left:.3rem}.dropdown-container .dropdown-menu_item .btn[data-v-019a9ac0]{width:18px;height:18px;margin:0;padding:0;margin-left:.1rem}.dropdown-container .dropdown-menu_item svg.icon[data-v-019a9ac0]{width:100%;height:100%}.dropdown-container .dropdown-menu_item svg.icon path[data-v-019a9ac0]{fill:#363636}.dropdown-bg[data-v-019a9ac0]{position:fixed;inset:0;z-index:10}.i18n[data-v-019a9ac0]{fill:#297ff3}@media screen and (max-width: 668px){.header[data-v-019a9ac0]{padding:0 8px}.header>img[data-v-019a9ac0]{height:22px}.header>.menu>*[data-v-019a9ac0]{margin-left:4px;cursor:pointer}}@keyframes turns-a531abbc{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-a531abbc]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-a531abbc]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-a531abbc]{color:#f9ad1e}.notice_info li[data-v-a531abbc]{font-size:14px;list-style:revert}.text-container[data-v-a531abbc]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-a531abbc]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-a531abbc]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-a531abbc]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-a531abbc]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-a531abbc]{width:100%}.text-container .text-container_item p.info-desc[data-v-a531abbc]{width:100%;color:#999;font-size:14px}.page-container[data-v-a531abbc]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-a531abbc]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-a531abbc]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-a531abbc]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-a531abbc],.page-container .page-flex .page-sidebar a[data-v-a531abbc]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-a531abbc]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-a531abbc]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-a531abbc]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-a531abbc]{border-radius:0;padding:1rem}ul.ul-container[data-v-a531abbc]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-a531abbc]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-a531abbc]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-a531abbc]{width:100%}form.form-container[data-v-a531abbc]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-a531abbc]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-a531abbc]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-a531abbc]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-a531abbc]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-a531abbc],form.form-container .label-value select[data-v-a531abbc]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-a531abbc]:focus,form.form-container .label-value select[data-v-a531abbc]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-a531abbc]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-a531abbc]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-a531abbc],form.form-container .label-value input[type=radio][data-v-a531abbc]{width:auto}form.form-container .label-value input[type=radio][data-v-a531abbc]{margin:0 4px 0 0}form.form-container .label-value input[data-v-a531abbc]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-a531abbc]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-a531abbc]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-a531abbc]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-a531abbc]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-a531abbc]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-a531abbc]:hover{background-color:#747474}form.form-container .label-msg[data-v-a531abbc]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-a531abbc]{color:#f9ad1e}form.form-container .label-flex[data-v-a531abbc]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-a531abbc]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-a531abbc]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-a531abbc]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-a531abbc]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-a531abbc]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-a531abbc]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-a531abbc],form.form-container1 .label-value select[data-v-a531abbc]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-a531abbc]:focus,form.form-container1 .label-value select[data-v-a531abbc]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-a531abbc]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-a531abbc],form.form-container1 .label-value input[type=radio][data-v-a531abbc]{width:auto}form.form-container1 .label-value input[type=radio][data-v-a531abbc]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-a531abbc]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-a531abbc]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-a531abbc]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-a531abbc]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-a531abbc]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-a531abbc]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-a531abbc]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-a531abbc]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-a531abbc]{color:#f9ad1e}form.form-container1 .label-flex[data-v-a531abbc]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-a531abbc]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-a531abbc]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-a531abbc]{width:100px}table.page-table th.checkbox[data-v-a531abbc]{width:50px;text-align:center}table.page-table th.setting[data-v-a531abbc]{width:100px;text-align:center}table.page-table thead[data-v-a531abbc]{color:#909399}table.page-table thead tr[data-v-a531abbc]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-a531abbc]{padding:10px 16px}table.page-table tbody tr[data-v-a531abbc]:hover{background-color:#eeee}table.page-table tbody tr[data-v-a531abbc]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-a531abbc]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-a531abbc]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-a531abbc]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-a531abbc]{width:100px}table.popups-table th.checkbox[data-v-a531abbc]{width:50px;text-align:center}table.popups-table th.setting[data-v-a531abbc]{width:100px;text-align:center}table.popups-table thead[data-v-a531abbc]{color:#eee}table.popups-table thead tr[data-v-a531abbc]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-a531abbc]{padding:10px 16px}table.popups-table tbody tr[data-v-a531abbc]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-a531abbc]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-a531abbc]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-a531abbc]{width:100%}header.header-desktop[data-v-a531abbc]{display:block}header.header-mobile[data-v-a531abbc]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-a531abbc]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-a531abbc]{width:100%;height:100%}header.header-mobile button svg path[data-v-a531abbc]{fill:#fff}nav.sidebar[data-v-a531abbc]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-a531abbc]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-a531abbc]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-a531abbc]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-a531abbc]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-a531abbc]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-a531abbc]{color:#fff}nav.sidebar .container .children[data-v-a531abbc]{padding-left:30px}@-moz-keyframes tada-a531abbc{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-a531abbc{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-a531abbc{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-a531abbc{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-a531abbc]{animation:dialogEnter-a531abbc .3s linear forwards}.dialog-leave-active[data-v-a531abbc]{animation:dialogLeave-a531abbc .3s linear forwards}@keyframes dialogEnter-a531abbc{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-a531abbc{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-a531abbc]{animation:dialogEnter-a531abbc .2s linear forwards}.dialog1-leave-active[data-v-a531abbc]{animation:dialogLeave-a531abbc .2s linear forwards}@keyframes rotateEnter-a531abbc{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-a531abbc]{animation:rotateEnter-a531abbc .7s;position:relative}.rotate-leave-active[data-v-a531abbc]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-a531abbc{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-a531abbc{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-a531abbc]{animation:slideOutTop-a531abbc .5s linear forwards}.slide-top-leave-active[data-v-a531abbc],.slide-bottom-enter-active[data-v-a531abbc]{animation:slideOutBottom-a531abbc .5s linear forwards}@keyframes slideInLeft-a531abbc{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-a531abbc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-a531abbc]{animation:slideInLeft-a531abbc .3s linear forwards}.slide-left-leave-active[data-v-a531abbc]{animation:slideInRight-a531abbc .3s linear forwards}@keyframes slideOutLeft-a531abbc{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-a531abbc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-a531abbc]{animation:slideOutLeft-a531abbc .3s linear forwards}.slide-right-leave-active[data-v-a531abbc]{animation:slideOutRight-a531abbc .3s linear forwards}@keyframes bganimation-a531abbc{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-a531abbc{0%{height:0}to{height:100px}}@keyframes fadeEnd-a531abbc{0%{height:100%}to{height:0}}.fade-enter-active[data-v-a531abbc]{animation:fadeStart-a531abbc .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-a531abbc]{animation:fadeEnd-a531abbc .1s linear forwards;overflow:hidden}.SearchBar[data-v-a531abbc]{height:56px;width:100%;box-sizing:border-box;padding:4px}.SearchBar>input[data-v-a531abbc]{width:100%;height:100%;border-radius:32px;background:rgba(255,255,255,.6);backdrop-filter:blur(12px);padding:16px 32px;justify-content:center;align-items:center;gap:10px;font-size:14px}@keyframes turns-261e10c6{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-261e10c6]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-261e10c6]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-261e10c6]{color:#f9ad1e}.notice_info li[data-v-261e10c6]{font-size:14px;list-style:revert}.text-container[data-v-261e10c6]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-261e10c6]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-261e10c6]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-261e10c6]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-261e10c6]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-261e10c6]{width:100%}.text-container .text-container_item p.info-desc[data-v-261e10c6]{width:100%;color:#999;font-size:14px}.page-container[data-v-261e10c6]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-261e10c6]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-261e10c6]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-261e10c6]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-261e10c6],.page-container .page-flex .page-sidebar a[data-v-261e10c6]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-261e10c6]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-261e10c6]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-261e10c6]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-261e10c6]{border-radius:0;padding:1rem}ul.ul-container[data-v-261e10c6]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-261e10c6]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-261e10c6]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-261e10c6]{width:100%}form.form-container[data-v-261e10c6]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-261e10c6]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-261e10c6]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-261e10c6]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-261e10c6]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-261e10c6],form.form-container .label-value select[data-v-261e10c6]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-261e10c6]:focus,form.form-container .label-value select[data-v-261e10c6]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-261e10c6]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-261e10c6]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-261e10c6],form.form-container .label-value input[type=radio][data-v-261e10c6]{width:auto}form.form-container .label-value input[type=radio][data-v-261e10c6]{margin:0 4px 0 0}form.form-container .label-value input[data-v-261e10c6]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-261e10c6]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-261e10c6]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-261e10c6]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-261e10c6]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-261e10c6]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-261e10c6]:hover{background-color:#747474}form.form-container .label-msg[data-v-261e10c6]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-261e10c6]{color:#f9ad1e}form.form-container .label-flex[data-v-261e10c6]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-261e10c6]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-261e10c6]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-261e10c6]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-261e10c6]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-261e10c6]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-261e10c6]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-261e10c6],form.form-container1 .label-value select[data-v-261e10c6]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-261e10c6]:focus,form.form-container1 .label-value select[data-v-261e10c6]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-261e10c6]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-261e10c6],form.form-container1 .label-value input[type=radio][data-v-261e10c6]{width:auto}form.form-container1 .label-value input[type=radio][data-v-261e10c6]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-261e10c6]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-261e10c6]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-261e10c6]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-261e10c6]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-261e10c6]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-261e10c6]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-261e10c6]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-261e10c6]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-261e10c6]{color:#f9ad1e}form.form-container1 .label-flex[data-v-261e10c6]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-261e10c6]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-261e10c6]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-261e10c6]{width:100px}table.page-table th.checkbox[data-v-261e10c6]{width:50px;text-align:center}table.page-table th.setting[data-v-261e10c6]{width:100px;text-align:center}table.page-table thead[data-v-261e10c6]{color:#909399}table.page-table thead tr[data-v-261e10c6]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-261e10c6]{padding:10px 16px}table.page-table tbody tr[data-v-261e10c6]:hover{background-color:#eeee}table.page-table tbody tr[data-v-261e10c6]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-261e10c6]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-261e10c6]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-261e10c6]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-261e10c6]{width:100px}table.popups-table th.checkbox[data-v-261e10c6]{width:50px;text-align:center}table.popups-table th.setting[data-v-261e10c6]{width:100px;text-align:center}table.popups-table thead[data-v-261e10c6]{color:#eee}table.popups-table thead tr[data-v-261e10c6]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-261e10c6]{padding:10px 16px}table.popups-table tbody tr[data-v-261e10c6]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-261e10c6]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-261e10c6]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-261e10c6]{width:100%}header.header-desktop[data-v-261e10c6]{display:block}header.header-mobile[data-v-261e10c6]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-261e10c6]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-261e10c6]{width:100%;height:100%}header.header-mobile button svg path[data-v-261e10c6]{fill:#fff}nav.sidebar[data-v-261e10c6]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-261e10c6]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-261e10c6]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-261e10c6]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-261e10c6]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-261e10c6]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-261e10c6]{color:#fff}nav.sidebar .container .children[data-v-261e10c6]{padding-left:30px}@-moz-keyframes tada-261e10c6{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-261e10c6{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-261e10c6{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-261e10c6{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-261e10c6]{animation:dialogEnter-261e10c6 .3s linear forwards}.dialog-leave-active[data-v-261e10c6]{animation:dialogLeave-261e10c6 .3s linear forwards}@keyframes dialogEnter-261e10c6{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-261e10c6{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-261e10c6]{animation:dialogEnter-261e10c6 .2s linear forwards}.dialog1-leave-active[data-v-261e10c6]{animation:dialogLeave-261e10c6 .2s linear forwards}@keyframes rotateEnter-261e10c6{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-261e10c6]{animation:rotateEnter-261e10c6 .7s;position:relative}.rotate-leave-active[data-v-261e10c6]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-261e10c6{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-261e10c6{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-261e10c6]{animation:slideOutTop-261e10c6 .5s linear forwards}.slide-top-leave-active[data-v-261e10c6],.slide-bottom-enter-active[data-v-261e10c6]{animation:slideOutBottom-261e10c6 .5s linear forwards}@keyframes slideInLeft-261e10c6{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-261e10c6{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-261e10c6]{animation:slideInLeft-261e10c6 .3s linear forwards}.slide-left-leave-active[data-v-261e10c6]{animation:slideInRight-261e10c6 .3s linear forwards}@keyframes slideOutLeft-261e10c6{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-261e10c6{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-261e10c6]{animation:slideOutLeft-261e10c6 .3s linear forwards}.slide-right-leave-active[data-v-261e10c6]{animation:slideOutRight-261e10c6 .3s linear forwards}@keyframes bganimation-261e10c6{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-261e10c6{0%{height:0}to{height:100px}}@keyframes fadeEnd-261e10c6{0%{height:100%}to{height:0}}.fade-enter-active[data-v-261e10c6]{animation:fadeStart-261e10c6 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-261e10c6]{animation:fadeEnd-261e10c6 .1s linear forwards;overflow:hidden}.widget[data-v-261e10c6]{box-sizing:border-box;padding:4px}.widget>div[data-v-261e10c6]{padding:12px 8px;border-radius:12px;background:rgba(255,255,255,.6);background:linear-gradient(180deg,rgba(255,255,255,.64) 0%,rgba(255,255,255,.4) 100%);height:100%}.widget>div>.title[data-v-261e10c6]{display:inline-block;width:100%;margin-bottom:8px;margin-left:4px;color:#000c;font-size:15px;font-weight:600}@media screen and (max-width: 668px){.widget>div[data-v-261e10c6]{padding:6px}}[lock-scroll=true]{overflow:hidden!important;height:100vh}@keyframes turns-664f08dd{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-664f08dd]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-664f08dd]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-664f08dd]{color:#f9ad1e}.notice_info li[data-v-664f08dd]{font-size:14px;list-style:revert}.text-container[data-v-664f08dd]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-664f08dd]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-664f08dd]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-664f08dd]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-664f08dd]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-664f08dd]{width:100%}.text-container .text-container_item p.info-desc[data-v-664f08dd]{width:100%;color:#999;font-size:14px}.page-container[data-v-664f08dd]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-664f08dd]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-664f08dd]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-664f08dd]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-664f08dd],.page-container .page-flex .page-sidebar a[data-v-664f08dd]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-664f08dd]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-664f08dd]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-664f08dd]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-664f08dd]{border-radius:0;padding:1rem}ul.ul-container[data-v-664f08dd]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-664f08dd]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-664f08dd]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-664f08dd]{width:100%}form.form-container[data-v-664f08dd]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-664f08dd]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-664f08dd]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-664f08dd]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-664f08dd]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-664f08dd],form.form-container .label-value select[data-v-664f08dd]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-664f08dd]:focus,form.form-container .label-value select[data-v-664f08dd]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-664f08dd]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-664f08dd]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-664f08dd],form.form-container .label-value input[type=radio][data-v-664f08dd]{width:auto}form.form-container .label-value input[type=radio][data-v-664f08dd]{margin:0 4px 0 0}form.form-container .label-value input[data-v-664f08dd]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-664f08dd]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-664f08dd]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-664f08dd]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-664f08dd]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-664f08dd]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-664f08dd]:hover{background-color:#747474}form.form-container .label-msg[data-v-664f08dd]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-664f08dd]{color:#f9ad1e}form.form-container .label-flex[data-v-664f08dd]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-664f08dd]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-664f08dd]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-664f08dd]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-664f08dd]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-664f08dd]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-664f08dd]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-664f08dd],form.form-container1 .label-value select[data-v-664f08dd]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-664f08dd]:focus,form.form-container1 .label-value select[data-v-664f08dd]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-664f08dd]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-664f08dd],form.form-container1 .label-value input[type=radio][data-v-664f08dd]{width:auto}form.form-container1 .label-value input[type=radio][data-v-664f08dd]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-664f08dd]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-664f08dd]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-664f08dd]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-664f08dd]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-664f08dd]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-664f08dd]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-664f08dd]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-664f08dd]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-664f08dd]{color:#f9ad1e}form.form-container1 .label-flex[data-v-664f08dd]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-664f08dd]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-664f08dd]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-664f08dd]{width:100px}table.page-table th.checkbox[data-v-664f08dd]{width:50px;text-align:center}table.page-table th.setting[data-v-664f08dd]{width:100px;text-align:center}table.page-table thead[data-v-664f08dd]{color:#909399}table.page-table thead tr[data-v-664f08dd]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-664f08dd]{padding:10px 16px}table.page-table tbody tr[data-v-664f08dd]:hover{background-color:#eeee}table.page-table tbody tr[data-v-664f08dd]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-664f08dd]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-664f08dd]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-664f08dd]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-664f08dd]{width:100px}table.popups-table th.checkbox[data-v-664f08dd]{width:50px;text-align:center}table.popups-table th.setting[data-v-664f08dd]{width:100px;text-align:center}table.popups-table thead[data-v-664f08dd]{color:#eee}table.popups-table thead tr[data-v-664f08dd]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-664f08dd]{padding:10px 16px}table.popups-table tbody tr[data-v-664f08dd]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-664f08dd]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-664f08dd]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-664f08dd]{width:100%}header.header-desktop[data-v-664f08dd]{display:block}header.header-mobile[data-v-664f08dd]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-664f08dd]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-664f08dd]{width:100%;height:100%}header.header-mobile button svg path[data-v-664f08dd]{fill:#fff}nav.sidebar[data-v-664f08dd]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-664f08dd]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-664f08dd]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-664f08dd]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-664f08dd]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-664f08dd]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-664f08dd]{color:#fff}nav.sidebar .container .children[data-v-664f08dd]{padding-left:30px}@-moz-keyframes tada-664f08dd{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-664f08dd{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-664f08dd{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-664f08dd{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-664f08dd]{animation:dialogEnter-664f08dd .3s linear forwards}.dialog-leave-active[data-v-664f08dd]{animation:dialogLeave-664f08dd .3s linear forwards}@keyframes dialogEnter-664f08dd{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-664f08dd{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-664f08dd]{animation:dialogEnter-664f08dd .2s linear forwards}.dialog1-leave-active[data-v-664f08dd]{animation:dialogLeave-664f08dd .2s linear forwards}@keyframes rotateEnter-664f08dd{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-664f08dd]{animation:rotateEnter-664f08dd .7s;position:relative}.rotate-leave-active[data-v-664f08dd]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-664f08dd{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-664f08dd{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-664f08dd]{animation:slideOutTop-664f08dd .5s linear forwards}.slide-top-leave-active[data-v-664f08dd],.slide-bottom-enter-active[data-v-664f08dd]{animation:slideOutBottom-664f08dd .5s linear forwards}@keyframes slideInLeft-664f08dd{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-664f08dd{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-664f08dd]{animation:slideInLeft-664f08dd .3s linear forwards}.slide-left-leave-active[data-v-664f08dd]{animation:slideInRight-664f08dd .3s linear forwards}@keyframes slideOutLeft-664f08dd{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-664f08dd{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-664f08dd]{animation:slideOutLeft-664f08dd .3s linear forwards}.slide-right-leave-active[data-v-664f08dd]{animation:slideOutRight-664f08dd .3s linear forwards}@keyframes bganimation-664f08dd{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-664f08dd{0%{height:0}to{height:100px}}@keyframes fadeEnd-664f08dd{0%{height:100%}to{height:0}}.fade-enter-active[data-v-664f08dd]{animation:fadeStart-664f08dd .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-664f08dd]{animation:fadeEnd-664f08dd .1s linear forwards;overflow:hidden}.bg[data-v-664f08dd]{position:fixed;inset:0;width:100%;height:100%;background:rgba(0,0,0,.5);z-index:999}#actioner[data-v-664f08dd]{position:fixed;z-index:1000;width:100%;height:100%;inset:0;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;overflow:auto}#actioner[data-v-664f08dd],#actioner[data-v-664f08dd] *{-webkit-box-sizing:border-box;-webkit-tap-highlight-color:transparent;box-sizing:border-box;word-wrap:break-word;outline:none}.action-container[data-v-664f08dd]{width:100%;height:100%;background-color:#fff;position:fixed;z-index:9999;inset:0;margin:auto;overflow:auto}.action-container .action-container_header[data-v-664f08dd]{width:100%;height:36px;line-height:36px;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:0 .625rem;position:absolute;top:0;left:0;right:0;border-bottom:1px solid #1e1e1e;background-color:#252526}.action-container .action-container_header .title[data-v-664f08dd]{color:#eee;font-size:16px}.action-container .action-container_header button.close[data-v-664f08dd]{width:36px;height:36px;margin:0;padding:10px;background:none;border:none;cursor:pointer;opacity:1}.action-container .action-container_header button.close[data-v-664f08dd] svg.icon{width:100%;height:100%}.action-container .action-container_header button.close[data-v-664f08dd] svg.icon path{fill:#eee}.action-container .action-container_header button.close[data-v-664f08dd]:hover{opacity:.9}.action-container .action-container_body[data-v-664f08dd]{width:100%;height:100%;padding-top:36px}@keyframes turns{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning{color:#f9ad1e}.notice_info li{font-size:14px;list-style:revert}.text-container{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block{width:100%}.text-container .text-container_item p.info-desc{width:100%;color:#999;font-size:14px}.page-container{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on,.page-container .page-flex .page-sidebar a:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile{border-radius:0;padding:1rem}ul.ul-container{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body{width:100%}form.form-container{display:block;width:100%;padding:0 1rem}form.form-container .label-info{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input,form.form-container .label-value select{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input:focus,form.form-container .label-value select:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select{border-radius:3px;padding:0 10px}form.form-container .label-value input{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox],form.form-container .label-value input[type=radio]{width:auto}form.form-container .label-value input[type=radio]{margin:0 4px 0 0}form.form-container .label-value input:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit:hover{background-color:#747474}form.form-container .label-msg{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning{color:#f9ad1e}form.form-container .label-flex{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input,form.form-container1 .label-value select{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input:focus,form.form-container1 .label-value select:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox],form.form-container1 .label-value input[type=radio]{width:auto}form.form-container1 .label-value input[type=radio]{margin:0 4px 0 0}form.form-container1 .label-value input:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit:hover{background-color:#747474}form.form-container1 .label-msg{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning{color:#f9ad1e}form.form-container1 .label-flex{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid{width:100px}table.page-table th.checkbox{width:50px;text-align:center}table.page-table th.setting{width:100px;text-align:center}table.page-table thead{color:#909399}table.page-table thead tr{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th{padding:10px 16px}table.page-table tbody tr:hover{background-color:#eeee}table.page-table tbody tr{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr:nth-child(odd){background-color:#f6f7f7}table.popups-table{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid{width:100px}table.popups-table th.checkbox{width:50px;text-align:center}table.popups-table th.setting{width:100px;text-align:center}table.popups-table thead{color:#eee}table.popups-table thead tr{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th{padding:10px 16px}table.popups-table tbody tr{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th{font-size:12px;padding:16px;vertical-align:top}.body{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header{width:100%}header.header-desktop{display:block}header.header-mobile{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg{width:100%;height:100%}header.header-mobile button svg path{fill:#fff}nav.sidebar{position:fixed;inset:0;z-index:101}nav.sidebar .bg{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active{color:#fff}nav.sidebar .container .children{padding-left:30px}@-moz-keyframes tada{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active{animation:dialogEnter .2s linear forwards}.dialog1-leave-active{animation:dialogLeave .2s linear forwards}@keyframes rotateEnter{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active{animation:rotateEnter .7s;position:relative}.rotate-leave-active{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active{animation:slideOutTop .5s linear forwards}.slide-top-leave-active,.slide-bottom-enter-active{animation:slideOutBottom .5s linear forwards}@keyframes slideInLeft{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active{animation:slideInLeft .3s linear forwards}.slide-left-leave-active{animation:slideInRight .3s linear forwards}@keyframes slideOutLeft{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active{animation:slideOutLeft .3s linear forwards}.slide-right-leave-active{animation:slideOutRight .3s linear forwards}@keyframes bganimation{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart{0%{height:0}to{height:100px}}@keyframes fadeEnd{0%{height:100%}to{height:0}}.fade-enter-active{animation:fadeStart .1s linear forwards;overflow:hidden}.fade-leave-active{animation:fadeEnd .1s linear forwards;overflow:hidden}@keyframes dialogEnter{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active{animation:dialogEnter .3s linear forwards}.dialog-leave-active{animation:dialogLeave .3s linear forwards}@keyframes turns-1b6cddbc{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-1b6cddbc]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-1b6cddbc]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-1b6cddbc]{color:#f9ad1e}.notice_info li[data-v-1b6cddbc]{font-size:14px;list-style:revert}.text-container[data-v-1b6cddbc]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-1b6cddbc]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-1b6cddbc]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-1b6cddbc]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-1b6cddbc]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-1b6cddbc]{width:100%}.text-container .text-container_item p.info-desc[data-v-1b6cddbc]{width:100%;color:#999;font-size:14px}.page-container[data-v-1b6cddbc]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-1b6cddbc]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-1b6cddbc]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-1b6cddbc]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-1b6cddbc],.page-container .page-flex .page-sidebar a[data-v-1b6cddbc]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-1b6cddbc]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-1b6cddbc]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-1b6cddbc]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-1b6cddbc]{border-radius:0;padding:1rem}ul.ul-container[data-v-1b6cddbc]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-1b6cddbc]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-1b6cddbc]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-1b6cddbc]{width:100%}form.form-container[data-v-1b6cddbc]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-1b6cddbc]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-1b6cddbc]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-1b6cddbc]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-1b6cddbc]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-1b6cddbc],form.form-container .label-value select[data-v-1b6cddbc]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-1b6cddbc]:focus,form.form-container .label-value select[data-v-1b6cddbc]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-1b6cddbc]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-1b6cddbc]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-1b6cddbc],form.form-container .label-value input[type=radio][data-v-1b6cddbc]{width:auto}form.form-container .label-value input[type=radio][data-v-1b6cddbc]{margin:0 4px 0 0}form.form-container .label-value input[data-v-1b6cddbc]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-1b6cddbc]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-1b6cddbc]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-1b6cddbc]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-1b6cddbc]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-1b6cddbc]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-1b6cddbc]:hover{background-color:#747474}form.form-container .label-msg[data-v-1b6cddbc]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-1b6cddbc]{color:#f9ad1e}form.form-container .label-flex[data-v-1b6cddbc]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-1b6cddbc]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-1b6cddbc]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-1b6cddbc]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-1b6cddbc]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-1b6cddbc]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-1b6cddbc]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-1b6cddbc],form.form-container1 .label-value select[data-v-1b6cddbc]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-1b6cddbc]:focus,form.form-container1 .label-value select[data-v-1b6cddbc]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-1b6cddbc]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-1b6cddbc],form.form-container1 .label-value input[type=radio][data-v-1b6cddbc]{width:auto}form.form-container1 .label-value input[type=radio][data-v-1b6cddbc]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-1b6cddbc]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-1b6cddbc]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-1b6cddbc]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-1b6cddbc]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-1b6cddbc]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-1b6cddbc]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-1b6cddbc]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-1b6cddbc]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-1b6cddbc]{color:#f9ad1e}form.form-container1 .label-flex[data-v-1b6cddbc]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-1b6cddbc]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-1b6cddbc]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-1b6cddbc]{width:100px}table.page-table th.checkbox[data-v-1b6cddbc]{width:50px;text-align:center}table.page-table th.setting[data-v-1b6cddbc]{width:100px;text-align:center}table.page-table thead[data-v-1b6cddbc]{color:#909399}table.page-table thead tr[data-v-1b6cddbc]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-1b6cddbc]{padding:10px 16px}table.page-table tbody tr[data-v-1b6cddbc]:hover{background-color:#eeee}table.page-table tbody tr[data-v-1b6cddbc]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-1b6cddbc]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-1b6cddbc]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-1b6cddbc]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-1b6cddbc]{width:100px}table.popups-table th.checkbox[data-v-1b6cddbc]{width:50px;text-align:center}table.popups-table th.setting[data-v-1b6cddbc]{width:100px;text-align:center}table.popups-table thead[data-v-1b6cddbc]{color:#eee}table.popups-table thead tr[data-v-1b6cddbc]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-1b6cddbc]{padding:10px 16px}table.popups-table tbody tr[data-v-1b6cddbc]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-1b6cddbc]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-1b6cddbc]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-1b6cddbc]{width:100%}header.header-desktop[data-v-1b6cddbc]{display:block}header.header-mobile[data-v-1b6cddbc]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-1b6cddbc]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-1b6cddbc]{width:100%;height:100%}header.header-mobile button svg path[data-v-1b6cddbc]{fill:#fff}nav.sidebar[data-v-1b6cddbc]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-1b6cddbc]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-1b6cddbc]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-1b6cddbc]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-1b6cddbc]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-1b6cddbc]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-1b6cddbc]{color:#fff}nav.sidebar .container .children[data-v-1b6cddbc]{padding-left:30px}@-moz-keyframes tada-1b6cddbc{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-1b6cddbc{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-1b6cddbc{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-1b6cddbc{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-1b6cddbc]{animation:dialogEnter-1b6cddbc .3s linear forwards}.dialog-leave-active[data-v-1b6cddbc]{animation:dialogLeave-1b6cddbc .3s linear forwards}@keyframes dialogEnter-1b6cddbc{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-1b6cddbc{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-1b6cddbc]{animation:dialogEnter-1b6cddbc .2s linear forwards}.dialog1-leave-active[data-v-1b6cddbc]{animation:dialogLeave-1b6cddbc .2s linear forwards}@keyframes rotateEnter-1b6cddbc{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-1b6cddbc]{animation:rotateEnter-1b6cddbc .7s;position:relative}.rotate-leave-active[data-v-1b6cddbc]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-1b6cddbc{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-1b6cddbc{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-1b6cddbc]{animation:slideOutTop-1b6cddbc .5s linear forwards}.slide-top-leave-active[data-v-1b6cddbc],.slide-bottom-enter-active[data-v-1b6cddbc]{animation:slideOutBottom-1b6cddbc .5s linear forwards}@keyframes slideInLeft-1b6cddbc{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-1b6cddbc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-1b6cddbc]{animation:slideInLeft-1b6cddbc .3s linear forwards}.slide-left-leave-active[data-v-1b6cddbc]{animation:slideInRight-1b6cddbc .3s linear forwards}@keyframes slideOutLeft-1b6cddbc{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-1b6cddbc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-1b6cddbc]{animation:slideOutLeft-1b6cddbc .3s linear forwards}.slide-right-leave-active[data-v-1b6cddbc]{animation:slideOutRight-1b6cddbc .3s linear forwards}@keyframes bganimation-1b6cddbc{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-1b6cddbc{0%{height:0}to{height:100px}}@keyframes fadeEnd-1b6cddbc{0%{height:100%}to{height:0}}.fade-enter-active[data-v-1b6cddbc]{animation:fadeStart-1b6cddbc .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-1b6cddbc]{animation:fadeEnd-1b6cddbc .1s linear forwards;overflow:hidden}label.checkbox_switch[data-v-1b6cddbc]{cursor:pointer;display:flex!important;width:initial!important}label.checkbox_switch input[type=checkbox][data-v-1b6cddbc]{display:none!important}label.checkbox_switch .checkbox_switch_on[data-v-1b6cddbc],label.checkbox_switch .checkbox_switch_off[data-v-1b6cddbc]{flex:none}label.checkbox_switch .checkbox_switch_on[data-v-1b6cddbc]{display:none!important}label.checkbox_switch .checkbox_switch_off[data-v-1b6cddbc]{display:inline-flex!important}label.checkbox_switch input[type=checkbox]:checked~.checkbox_switch_on[data-v-1b6cddbc]{display:inline-flex!important}label.checkbox_switch input[type=checkbox]:checked~.checkbox_switch_off[data-v-1b6cddbc]{display:none!important}.actioner-dns[data-v-76799e09]{width:860px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.actioner-dns .actioner-dns_header[data-v-76799e09]{width:100%;display:flex;flex-wrap:wrap;align-items:center;padding:1rem;font-size:2em;border-bottom:1px solid #eee}.actioner-dns .actioner-dns_body[data-v-76799e09]{padding:1rem;min-height:50vh}.actioner-dns .actioner-dns_body .label-item[data-v-76799e09]{width:100%;margin:1rem 0}.actioner-dns .actioner-dns_body .label-item .label-item_key[data-v-76799e09]{width:100%;font-size:12px;color:#666}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-76799e09]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-76799e09]:before{content:\"*\";color:#f56c6c;margin-right:4px}.actioner-dns .actioner-dns_body .label-item .label-item_value[data-v-76799e09]{width:100%;margin-top:5px}.actioner-dns .actioner-dns_body .label-item .label-item_value select[data-v-76799e09],.actioner-dns .actioner-dns_body .label-item .label-item_value input[data-v-76799e09]{width:100%;height:36px}.actioner-dns .actioner-dns_body .chose_dhcp[data-v-76799e09]{height:1em;font-size:1.3em}.actioner-dns .actioner-dns_body .chose_dhcp .dhcp_info[data-v-76799e09]{margin-left:10px;user-select:none}.actioner-dns .actioner-dns_body .label-message[data-v-76799e09]{width:100%;text-align:left;font-size:14px;color:red;text-align:center}.actioner-dns .config-message[data-v-76799e09]{width:100%;min-height:inherit;height:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;font-size:2em}.actioner-dns .actioner-dns_footer[data-v-76799e09]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:1rem;font-size:2em;border-top:1px solid #eee}.actioner-dns .actioner-dns_footer button[data-v-76799e09]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}.setting_status[data-v-76799e09]{text-align:center}.setting_status p[data-v-76799e09]{margin:10px 0}.setting_status a[data-v-76799e09]{text-align:center;display:block;text-decoration:none}.NewAdress[data-v-76799e09]{margin-top:10px}@keyframes turns-76799e09{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-76799e09]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-76799e09]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-76799e09]{color:#f9ad1e}.notice_info li[data-v-76799e09]{font-size:14px;list-style:revert}.text-container[data-v-76799e09]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-76799e09]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-76799e09]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-76799e09]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-76799e09]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-76799e09]{width:100%}.text-container .text-container_item p.info-desc[data-v-76799e09]{width:100%;color:#999;font-size:14px}.page-container[data-v-76799e09]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-76799e09]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-76799e09]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-76799e09]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-76799e09],.page-container .page-flex .page-sidebar a[data-v-76799e09]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-76799e09]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-76799e09]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-76799e09]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-76799e09]{border-radius:0;padding:1rem}ul.ul-container[data-v-76799e09]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-76799e09]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-76799e09]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-76799e09]{width:100%}form.form-container[data-v-76799e09]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-76799e09]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-76799e09]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-76799e09]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-76799e09]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-76799e09],form.form-container .label-value select[data-v-76799e09]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-76799e09]:focus,form.form-container .label-value select[data-v-76799e09]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-76799e09]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-76799e09]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-76799e09],form.form-container .label-value input[type=radio][data-v-76799e09]{width:auto}form.form-container .label-value input[type=radio][data-v-76799e09]{margin:0 4px 0 0}form.form-container .label-value input[data-v-76799e09]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-76799e09]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-76799e09]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-76799e09]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-76799e09]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-76799e09]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-76799e09]:hover{background-color:#747474}form.form-container .label-msg[data-v-76799e09]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-76799e09]{color:#f9ad1e}form.form-container .label-flex[data-v-76799e09]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-76799e09]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-76799e09]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-76799e09]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-76799e09]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-76799e09]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-76799e09]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-76799e09],form.form-container1 .label-value select[data-v-76799e09]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-76799e09]:focus,form.form-container1 .label-value select[data-v-76799e09]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-76799e09]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-76799e09],form.form-container1 .label-value input[type=radio][data-v-76799e09]{width:auto}form.form-container1 .label-value input[type=radio][data-v-76799e09]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-76799e09]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-76799e09]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-76799e09]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-76799e09]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-76799e09]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-76799e09]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-76799e09]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-76799e09]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-76799e09]{color:#f9ad1e}form.form-container1 .label-flex[data-v-76799e09]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-76799e09]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-76799e09]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-76799e09]{width:100px}table.page-table th.checkbox[data-v-76799e09]{width:50px;text-align:center}table.page-table th.setting[data-v-76799e09]{width:100px;text-align:center}table.page-table thead[data-v-76799e09]{color:#909399}table.page-table thead tr[data-v-76799e09]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-76799e09]{padding:10px 16px}table.page-table tbody tr[data-v-76799e09]:hover{background-color:#eeee}table.page-table tbody tr[data-v-76799e09]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-76799e09]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-76799e09]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-76799e09]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-76799e09]{width:100px}table.popups-table th.checkbox[data-v-76799e09]{width:50px;text-align:center}table.popups-table th.setting[data-v-76799e09]{width:100px;text-align:center}table.popups-table thead[data-v-76799e09]{color:#eee}table.popups-table thead tr[data-v-76799e09]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-76799e09]{padding:10px 16px}table.popups-table tbody tr[data-v-76799e09]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-76799e09]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-76799e09]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-76799e09]{width:100%}header.header-desktop[data-v-76799e09]{display:block}header.header-mobile[data-v-76799e09]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-76799e09]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-76799e09]{width:100%;height:100%}header.header-mobile button svg path[data-v-76799e09]{fill:#fff}nav.sidebar[data-v-76799e09]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-76799e09]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-76799e09]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-76799e09]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-76799e09]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-76799e09]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-76799e09]{color:#fff}nav.sidebar .container .children[data-v-76799e09]{padding-left:30px}@-moz-keyframes tada-76799e09{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-76799e09{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-76799e09{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-76799e09{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-76799e09]{animation:dialogEnter-76799e09 .3s linear forwards}.dialog-leave-active[data-v-76799e09]{animation:dialogLeave-76799e09 .3s linear forwards}@keyframes dialogEnter-76799e09{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-76799e09{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-76799e09]{animation:dialogEnter-76799e09 .2s linear forwards}.dialog1-leave-active[data-v-76799e09]{animation:dialogLeave-76799e09 .2s linear forwards}@keyframes rotateEnter-76799e09{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-76799e09]{animation:rotateEnter-76799e09 .7s;position:relative}.rotate-leave-active[data-v-76799e09]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-76799e09{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-76799e09{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-76799e09]{animation:slideOutTop-76799e09 .5s linear forwards}.slide-top-leave-active[data-v-76799e09],.slide-bottom-enter-active[data-v-76799e09]{animation:slideOutBottom-76799e09 .5s linear forwards}@keyframes slideInLeft-76799e09{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-76799e09{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-76799e09]{animation:slideInLeft-76799e09 .3s linear forwards}.slide-left-leave-active[data-v-76799e09]{animation:slideInRight-76799e09 .3s linear forwards}@keyframes slideOutLeft-76799e09{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-76799e09{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-76799e09]{animation:slideOutLeft-76799e09 .3s linear forwards}.slide-right-leave-active[data-v-76799e09]{animation:slideOutRight-76799e09 .3s linear forwards}@keyframes bganimation-76799e09{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-76799e09{0%{height:0}to{height:100px}}@keyframes fadeEnd-76799e09{0%{height:100%}to{height:0}}.fade-enter-active[data-v-76799e09]{animation:fadeStart-76799e09 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-76799e09]{animation:fadeEnd-76799e09 .1s linear forwards;overflow:hidden}@media screen and (max-width: 1400px){.actioner-dns .actioner-dns_body[data-v-76799e09]{min-height:34vh}}@media screen and (max-width: 800px){.actioner-dns[data-v-76799e09]{width:100%}}.actioner-dns[data-v-95c09170]{width:860px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.actioner-dns .actioner-dns_header[data-v-95c09170]{width:100%;display:flex;flex-wrap:wrap;align-items:center;padding:1rem;font-size:2em;border-bottom:1px solid #eee}.actioner-dns .actioner-dns_body[data-v-95c09170]{padding:1rem;min-height:50vh}.actioner-dns .actioner-dns_body .label-item[data-v-95c09170]{width:100%;margin:1rem 0}.actioner-dns .actioner-dns_body .label-item .label-item_key[data-v-95c09170]{width:100%;font-size:12px;color:#666}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-95c09170]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-95c09170]:before{content:\"*\";color:#f56c6c;margin-right:4px}.actioner-dns .actioner-dns_body .label-item .label-item_value[data-v-95c09170]{width:100%;margin-top:5px}.actioner-dns .actioner-dns_body .label-item .label-item_value select[data-v-95c09170],.actioner-dns .actioner-dns_body .label-item .label-item_value input[data-v-95c09170]{width:100%;height:36px}.actioner-dns .actioner-dns_body .label-message[data-v-95c09170]{width:100%;text-align:left;font-size:14px;color:red;text-align:center}.actioner-dns .config-message[data-v-95c09170]{width:100%;min-height:inherit;height:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;font-size:2em}.actioner-dns .actioner-dns_footer[data-v-95c09170]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:1rem;font-size:2em;border-top:1px solid #eee}.actioner-dns .actioner-dns_footer button[data-v-95c09170]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}@keyframes turns-95c09170{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-95c09170]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-95c09170]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-95c09170]{color:#f9ad1e}.notice_info li[data-v-95c09170]{font-size:14px;list-style:revert}.text-container[data-v-95c09170]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-95c09170]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-95c09170]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-95c09170]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-95c09170]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-95c09170]{width:100%}.text-container .text-container_item p.info-desc[data-v-95c09170]{width:100%;color:#999;font-size:14px}.page-container[data-v-95c09170]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-95c09170]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-95c09170]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-95c09170]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-95c09170],.page-container .page-flex .page-sidebar a[data-v-95c09170]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-95c09170]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-95c09170]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-95c09170]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-95c09170]{border-radius:0;padding:1rem}ul.ul-container[data-v-95c09170]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-95c09170]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-95c09170]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-95c09170]{width:100%}form.form-container[data-v-95c09170]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-95c09170]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-95c09170]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-95c09170]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-95c09170]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-95c09170],form.form-container .label-value select[data-v-95c09170]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-95c09170]:focus,form.form-container .label-value select[data-v-95c09170]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-95c09170]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-95c09170]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-95c09170],form.form-container .label-value input[type=radio][data-v-95c09170]{width:auto}form.form-container .label-value input[type=radio][data-v-95c09170]{margin:0 4px 0 0}form.form-container .label-value input[data-v-95c09170]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-95c09170]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-95c09170]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-95c09170]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-95c09170]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-95c09170]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-95c09170]:hover{background-color:#747474}form.form-container .label-msg[data-v-95c09170]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-95c09170]{color:#f9ad1e}form.form-container .label-flex[data-v-95c09170]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-95c09170]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-95c09170]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-95c09170]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-95c09170]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-95c09170]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-95c09170]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-95c09170],form.form-container1 .label-value select[data-v-95c09170]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-95c09170]:focus,form.form-container1 .label-value select[data-v-95c09170]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-95c09170]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-95c09170],form.form-container1 .label-value input[type=radio][data-v-95c09170]{width:auto}form.form-container1 .label-value input[type=radio][data-v-95c09170]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-95c09170]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-95c09170]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-95c09170]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-95c09170]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-95c09170]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-95c09170]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-95c09170]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-95c09170]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-95c09170]{color:#f9ad1e}form.form-container1 .label-flex[data-v-95c09170]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-95c09170]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-95c09170]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-95c09170]{width:100px}table.page-table th.checkbox[data-v-95c09170]{width:50px;text-align:center}table.page-table th.setting[data-v-95c09170]{width:100px;text-align:center}table.page-table thead[data-v-95c09170]{color:#909399}table.page-table thead tr[data-v-95c09170]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-95c09170]{padding:10px 16px}table.page-table tbody tr[data-v-95c09170]:hover{background-color:#eeee}table.page-table tbody tr[data-v-95c09170]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-95c09170]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-95c09170]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-95c09170]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-95c09170]{width:100px}table.popups-table th.checkbox[data-v-95c09170]{width:50px;text-align:center}table.popups-table th.setting[data-v-95c09170]{width:100px;text-align:center}table.popups-table thead[data-v-95c09170]{color:#eee}table.popups-table thead tr[data-v-95c09170]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-95c09170]{padding:10px 16px}table.popups-table tbody tr[data-v-95c09170]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-95c09170]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-95c09170]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-95c09170]{width:100%}header.header-desktop[data-v-95c09170]{display:block}header.header-mobile[data-v-95c09170]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-95c09170]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-95c09170]{width:100%;height:100%}header.header-mobile button svg path[data-v-95c09170]{fill:#fff}nav.sidebar[data-v-95c09170]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-95c09170]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-95c09170]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-95c09170]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-95c09170]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-95c09170]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-95c09170]{color:#fff}nav.sidebar .container .children[data-v-95c09170]{padding-left:30px}@-moz-keyframes tada-95c09170{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-95c09170{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-95c09170{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-95c09170{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-95c09170]{animation:dialogEnter-95c09170 .3s linear forwards}.dialog-leave-active[data-v-95c09170]{animation:dialogLeave-95c09170 .3s linear forwards}@keyframes dialogEnter-95c09170{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-95c09170{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-95c09170]{animation:dialogEnter-95c09170 .2s linear forwards}.dialog1-leave-active[data-v-95c09170]{animation:dialogLeave-95c09170 .2s linear forwards}@keyframes rotateEnter-95c09170{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-95c09170]{animation:rotateEnter-95c09170 .7s;position:relative}.rotate-leave-active[data-v-95c09170]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-95c09170{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-95c09170{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-95c09170]{animation:slideOutTop-95c09170 .5s linear forwards}.slide-top-leave-active[data-v-95c09170],.slide-bottom-enter-active[data-v-95c09170]{animation:slideOutBottom-95c09170 .5s linear forwards}@keyframes slideInLeft-95c09170{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-95c09170{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-95c09170]{animation:slideInLeft-95c09170 .3s linear forwards}.slide-left-leave-active[data-v-95c09170]{animation:slideInRight-95c09170 .3s linear forwards}@keyframes slideOutLeft-95c09170{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-95c09170{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-95c09170]{animation:slideOutLeft-95c09170 .3s linear forwards}.slide-right-leave-active[data-v-95c09170]{animation:slideOutRight-95c09170 .3s linear forwards}@keyframes bganimation-95c09170{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-95c09170{0%{height:0}to{height:100px}}@keyframes fadeEnd-95c09170{0%{height:100%}to{height:0}}.fade-enter-active[data-v-95c09170]{animation:fadeStart-95c09170 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-95c09170]{animation:fadeEnd-95c09170 .1s linear forwards;overflow:hidden}@media screen and (max-width: 1400px){.actioner-dns .actioner-dns_body[data-v-95c09170]{min-height:34vh}}@media screen and (max-width: 800px){.actioner-dns[data-v-95c09170]{width:100%}}.actioner-dns[data-v-5141058a]{width:860px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.actioner-dns .actioner-dns_header[data-v-5141058a]{width:100%;display:flex;flex-wrap:wrap;align-items:center;padding:1rem;font-size:2em;border-bottom:1px solid #eee}.actioner-dns .actioner-dns_header span[data-v-5141058a]{margin:0 auto}.actioner-dns .actioner-dns_body[data-v-5141058a]{padding:1rem;min-height:50vh}.actioner-dns .actioner-dns_body .sandbox_roboot_tips[data-v-5141058a]{margin-top:24px;text-align:center}.actioner-dns .actioner-dns_body .disk_loading_icon[data-v-5141058a]{position:absolute;left:50%;transform:translate(-50%);display:flex;flex-direction:column;align-items:center;padding:10px}.actioner-dns .actioner-dns_body .disk_loading_icon .disk_loading_info[data-v-5141058a]{margin-top:5px}.actioner-dns .actioner-dns_body .disk_tips[data-v-5141058a]{text-align:center;font-size:16px;margin-top:159px;color:#f9ad1e}.actioner-dns .actioner-dns_body .disk_tips svg[data-v-5141058a]{vertical-align:middle}.actioner-dns .actioner-dns_body .disk_tips span[data-v-5141058a]{margin-left:6px}.actioner-dns .actioner-dns_body .sandbox_info[data-v-5141058a]{text-align:center;line-height:22px}.actioner-dns .actioner-dns_body .label-item[data-v-5141058a]{width:100%;margin:1rem 0}.actioner-dns .actioner-dns_body .label-item .label-item_key[data-v-5141058a]{width:100%;font-size:12px;color:#666}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-5141058a]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-5141058a]:before{content:\"*\";color:#f56c6c;margin-right:4px}.actioner-dns .actioner-dns_body .label-item .label-item_value[data-v-5141058a]{width:100%;margin-top:5px}.actioner-dns .actioner-dns_body .label-item .label-item_value select[data-v-5141058a],.actioner-dns .actioner-dns_body .label-item .label-item_value input[data-v-5141058a]{width:100%;height:36px}.actioner-dns .actioner-dns_body .label-message[data-v-5141058a]{width:100%;text-align:left;font-size:14px;color:red;text-align:center}.actioner-dns .actioner-dns_body .sandbox_tips svg[data-v-5141058a]{vertical-align:middle}.actioner-dns .actioner-dns_body .sandbox_tips span[data-v-5141058a]{font-size:12px;margin-left:4px}.actioner-dns .config-message[data-v-5141058a]{width:100%;min-height:inherit;height:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;font-size:2em}.actioner-dns .actioner-dns_footer[data-v-5141058a]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:1rem;font-size:2em;border-top:1px solid #eee}.actioner-dns .actioner-dns_footer button[data-v-5141058a]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}.actioner-tips[data-v-5141058a]{width:400px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.actioner-tips .actioner-tips_header[data-v-5141058a]{width:100%;display:flex;flex-wrap:wrap;align-items:center;padding:1rem;font-size:2em;border-bottom:1px solid #eee}.actioner-tips .sandbox_info[data-v-5141058a]{padding:62px 54px;line-height:20px}.actioner-tips .actioner-tips_footer[data-v-5141058a]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:1rem;font-size:2em;border-top:1px solid #eee}.timeout[data-v-5141058a]{margin-top:114px}.timeout span[data-v-5141058a],.sandbox_roboot_refresh[data-v-5141058a]{color:#5e72e4}option[data-v-5141058a]:disabled{background-color:#e0e0e0}@keyframes turns-5141058a{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-5141058a]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-5141058a]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-5141058a]{color:#f9ad1e}.notice_info li[data-v-5141058a]{font-size:14px;list-style:revert}.text-container[data-v-5141058a]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-5141058a]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-5141058a]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-5141058a]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-5141058a]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-5141058a]{width:100%}.text-container .text-container_item p.info-desc[data-v-5141058a]{width:100%;color:#999;font-size:14px}.page-container[data-v-5141058a]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-5141058a]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-5141058a]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-5141058a]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-5141058a],.page-container .page-flex .page-sidebar a[data-v-5141058a]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5141058a]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5141058a]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-5141058a]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-5141058a]{border-radius:0;padding:1rem}ul.ul-container[data-v-5141058a]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-5141058a]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-5141058a]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-5141058a]{width:100%}form.form-container[data-v-5141058a]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-5141058a]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-5141058a]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-5141058a]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-5141058a]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-5141058a],form.form-container .label-value select[data-v-5141058a]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-5141058a]:focus,form.form-container .label-value select[data-v-5141058a]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-5141058a]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-5141058a]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-5141058a],form.form-container .label-value input[type=radio][data-v-5141058a]{width:auto}form.form-container .label-value input[type=radio][data-v-5141058a]{margin:0 4px 0 0}form.form-container .label-value input[data-v-5141058a]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-5141058a]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5141058a]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5141058a]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-5141058a]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-5141058a]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-5141058a]:hover{background-color:#747474}form.form-container .label-msg[data-v-5141058a]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-5141058a]{color:#f9ad1e}form.form-container .label-flex[data-v-5141058a]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-5141058a]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-5141058a]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-5141058a]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-5141058a]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-5141058a]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-5141058a]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-5141058a],form.form-container1 .label-value select[data-v-5141058a]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-5141058a]:focus,form.form-container1 .label-value select[data-v-5141058a]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-5141058a]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-5141058a],form.form-container1 .label-value input[type=radio][data-v-5141058a]{width:auto}form.form-container1 .label-value input[type=radio][data-v-5141058a]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-5141058a]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-5141058a]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5141058a]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5141058a]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-5141058a]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-5141058a]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-5141058a]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-5141058a]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-5141058a]{color:#f9ad1e}form.form-container1 .label-flex[data-v-5141058a]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-5141058a]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-5141058a]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-5141058a]{width:100px}table.page-table th.checkbox[data-v-5141058a]{width:50px;text-align:center}table.page-table th.setting[data-v-5141058a]{width:100px;text-align:center}table.page-table thead[data-v-5141058a]{color:#909399}table.page-table thead tr[data-v-5141058a]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-5141058a]{padding:10px 16px}table.page-table tbody tr[data-v-5141058a]:hover{background-color:#eeee}table.page-table tbody tr[data-v-5141058a]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-5141058a]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-5141058a]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-5141058a]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-5141058a]{width:100px}table.popups-table th.checkbox[data-v-5141058a]{width:50px;text-align:center}table.popups-table th.setting[data-v-5141058a]{width:100px;text-align:center}table.popups-table thead[data-v-5141058a]{color:#eee}table.popups-table thead tr[data-v-5141058a]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-5141058a]{padding:10px 16px}table.popups-table tbody tr[data-v-5141058a]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-5141058a]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-5141058a]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-5141058a]{width:100%}header.header-desktop[data-v-5141058a]{display:block}header.header-mobile[data-v-5141058a]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-5141058a]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-5141058a]{width:100%;height:100%}header.header-mobile button svg path[data-v-5141058a]{fill:#fff}nav.sidebar[data-v-5141058a]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-5141058a]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-5141058a]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-5141058a]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-5141058a]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-5141058a]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-5141058a]{color:#fff}nav.sidebar .container .children[data-v-5141058a]{padding-left:30px}@-moz-keyframes tada-5141058a{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-5141058a{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-5141058a{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-5141058a{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-5141058a]{animation:dialogEnter-5141058a .3s linear forwards}.dialog-leave-active[data-v-5141058a]{animation:dialogLeave-5141058a .3s linear forwards}@keyframes dialogEnter-5141058a{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-5141058a{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-5141058a]{animation:dialogEnter-5141058a .2s linear forwards}.dialog1-leave-active[data-v-5141058a]{animation:dialogLeave-5141058a .2s linear forwards}@keyframes rotateEnter-5141058a{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-5141058a]{animation:rotateEnter-5141058a .7s;position:relative}.rotate-leave-active[data-v-5141058a]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-5141058a{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-5141058a{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-5141058a]{animation:slideOutTop-5141058a .5s linear forwards}.slide-top-leave-active[data-v-5141058a],.slide-bottom-enter-active[data-v-5141058a]{animation:slideOutBottom-5141058a .5s linear forwards}@keyframes slideInLeft-5141058a{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-5141058a{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-5141058a]{animation:slideInLeft-5141058a .3s linear forwards}.slide-left-leave-active[data-v-5141058a]{animation:slideInRight-5141058a .3s linear forwards}@keyframes slideOutLeft-5141058a{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-5141058a{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-5141058a]{animation:slideOutLeft-5141058a .3s linear forwards}.slide-right-leave-active[data-v-5141058a]{animation:slideOutRight-5141058a .3s linear forwards}@keyframes bganimation-5141058a{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-5141058a{0%{height:0}to{height:100px}}@keyframes fadeEnd-5141058a{0%{height:100%}to{height:0}}.fade-enter-active[data-v-5141058a]{animation:fadeStart-5141058a .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-5141058a]{animation:fadeEnd-5141058a .1s linear forwards;overflow:hidden}@media screen and (max-width: 1400px){.actioner-tips_footer button[data-v-5141058a]{width:100%!important}}@media screen and (max-width: 900px){.actioner-dns[data-v-5141058a]{width:100%}}@media screen and (max-width: 700px){.actioner-dns .actioner-dns_body[data-v-5141058a]{min-height:42vh}.actioner-tips[data-v-5141058a]{width:80%;line-height:22px}.actioner-tips .sandbox_info[data-v-5141058a]{padding:34px 10px;font-size:10px}.actioner-tips .actioner-tips_header[data-v-5141058a]{font-size:20px}.actioner-tips .actioner-tips_footer button[data-v-5141058a]{width:100%!important}}@media screen and (max-width: 600px){.actioner-dns .actioner-dns_footer button[data-v-5141058a]{width:100%!important;margin-bottom:10px;margin-left:0}}@media screen and (max-width: 500px){.actioner-dns .actioner-dns_body .label-item .label-item_key[data-v-5141058a]{width:228px;overflow:hidden;text-overflow:ellipsis}}@media screen and (max-width: 400px){.actioner-dns .actioner-dns_body .label-item .label-item_key[data-v-5141058a]{width:163px;overflow:hidden;text-overflow:ellipsis}.actioner-dns .actioner-dns_footer button[data-v-5141058a]{width:100%!important;margin-bottom:10px}.actioner-tips .sandbox_info[data-v-5141058a]{padding:3px 10px}}.actioner-dns[data-v-5cf1870c]{width:800px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.actioner-dns .actioner-dns_header[data-v-5cf1870c]{width:100%;display:flex;flex-wrap:wrap;align-items:center;padding:1rem;font-size:2em;border-bottom:1px solid #eee}.actioner-dns .actioner-dns_body[data-v-5cf1870c]{padding:1rem;min-height:50vh}.actioner-dns .actioner-dns_body .label-item[data-v-5cf1870c]{width:100%;margin:1rem 0}.actioner-dns .actioner-dns_body .label-item .label-item_key[data-v-5cf1870c]{width:100%;font-size:12px;color:#666}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-5cf1870c]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-5cf1870c]:before{content:\"*\";color:#f56c6c;margin-right:4px}.actioner-dns .actioner-dns_body .label-item .label-item_value[data-v-5cf1870c]{width:100%;margin-top:5px}.actioner-dns .actioner-dns_body .label-item .label-item_value select[data-v-5cf1870c],.actioner-dns .actioner-dns_body .label-item .label-item_value input[data-v-5cf1870c]{height:36px}.actioner-dns .actioner-dns_body .label-message[data-v-5cf1870c]{width:100%;text-align:left;font-size:14px;color:red;text-align:center}.actioner-dns .config-message[data-v-5cf1870c]{width:100%;min-height:inherit;height:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;font-size:2em}.actioner-dns .actioner-dns_footer[data-v-5cf1870c]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:1rem;font-size:2em;border-top:1px solid #eee}.actioner-dns .actioner-dns_footer button[data-v-5cf1870c]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}.actioner-dns .select-editable[data-v-5cf1870c]{position:relative;border:solid grey 1px;width:100%}.actioner-dns .select-editable select[data-v-5cf1870c]{top:0;left:0;font-size:14px;border:none;width:100%;margin:0}.actioner-dns .select-editable input[data-v-5cf1870c]{position:absolute;top:-4px;left:0;width:95%;padding:1px;font-size:14px;border:none}.actioner-dns .select-editable select[data-v-5cf1870c]:focus,.actioner-dns .select-editable input[data-v-5cf1870c]:focus{outline:none}.actioner-dns[data-v-5cf1870c] ::placeholder{color:#999}.successed[data-v-5cf1870c]{text-align:center;font-size:14px;margin-bottom:104px}.finished[data-v-5cf1870c]{display:flex;justify-content:center;margin:80px 80px 28px}.docker_moves[data-v-5cf1870c]{text-align:center}.docker_moves .moves[data-v-5cf1870c]{margin-top:10px}.docker_moves .moves input[data-v-5cf1870c]{cursor:pointer}.docker_moves .moves label[data-v-5cf1870c]{margin-left:10px;cursor:pointer}.btns[data-v-5cf1870c]{text-align:center}.item_info[data-v-5cf1870c]{margin-left:10px}.softsource_tit[data-v-5cf1870c]{margin:0 auto}.softsource_successed[data-v-5cf1870c]{width:20%!important}@keyframes turns-5cf1870c{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-5cf1870c]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-5cf1870c]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-5cf1870c]{color:#f9ad1e}.notice_info li[data-v-5cf1870c]{font-size:14px;list-style:revert}.text-container[data-v-5cf1870c]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-5cf1870c]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-5cf1870c]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-5cf1870c]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-5cf1870c]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-5cf1870c]{width:100%}.text-container .text-container_item p.info-desc[data-v-5cf1870c]{width:100%;color:#999;font-size:14px}.page-container[data-v-5cf1870c]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-5cf1870c]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-5cf1870c]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-5cf1870c]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-5cf1870c],.page-container .page-flex .page-sidebar a[data-v-5cf1870c]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5cf1870c]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5cf1870c]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-5cf1870c]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-5cf1870c]{border-radius:0;padding:1rem}ul.ul-container[data-v-5cf1870c]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-5cf1870c]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-5cf1870c]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-5cf1870c]{width:100%}form.form-container[data-v-5cf1870c]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-5cf1870c]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-5cf1870c]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-5cf1870c]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-5cf1870c]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-5cf1870c],form.form-container .label-value select[data-v-5cf1870c]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-5cf1870c]:focus,form.form-container .label-value select[data-v-5cf1870c]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-5cf1870c]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-5cf1870c]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-5cf1870c],form.form-container .label-value input[type=radio][data-v-5cf1870c]{width:auto}form.form-container .label-value input[type=radio][data-v-5cf1870c]{margin:0 4px 0 0}form.form-container .label-value input[data-v-5cf1870c]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-5cf1870c]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5cf1870c]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5cf1870c]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-5cf1870c]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-5cf1870c]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-5cf1870c]:hover{background-color:#747474}form.form-container .label-msg[data-v-5cf1870c]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-5cf1870c]{color:#f9ad1e}form.form-container .label-flex[data-v-5cf1870c]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-5cf1870c]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-5cf1870c]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-5cf1870c]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-5cf1870c]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-5cf1870c]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-5cf1870c]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-5cf1870c],form.form-container1 .label-value select[data-v-5cf1870c]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-5cf1870c]:focus,form.form-container1 .label-value select[data-v-5cf1870c]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-5cf1870c]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-5cf1870c],form.form-container1 .label-value input[type=radio][data-v-5cf1870c]{width:auto}form.form-container1 .label-value input[type=radio][data-v-5cf1870c]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-5cf1870c]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-5cf1870c]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5cf1870c]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5cf1870c]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-5cf1870c]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-5cf1870c]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-5cf1870c]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-5cf1870c]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-5cf1870c]{color:#f9ad1e}form.form-container1 .label-flex[data-v-5cf1870c]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-5cf1870c]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-5cf1870c]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-5cf1870c]{width:100px}table.page-table th.checkbox[data-v-5cf1870c]{width:50px;text-align:center}table.page-table th.setting[data-v-5cf1870c]{width:100px;text-align:center}table.page-table thead[data-v-5cf1870c]{color:#909399}table.page-table thead tr[data-v-5cf1870c]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-5cf1870c]{padding:10px 16px}table.page-table tbody tr[data-v-5cf1870c]:hover{background-color:#eeee}table.page-table tbody tr[data-v-5cf1870c]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-5cf1870c]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-5cf1870c]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-5cf1870c]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-5cf1870c]{width:100px}table.popups-table th.checkbox[data-v-5cf1870c]{width:50px;text-align:center}table.popups-table th.setting[data-v-5cf1870c]{width:100px;text-align:center}table.popups-table thead[data-v-5cf1870c]{color:#eee}table.popups-table thead tr[data-v-5cf1870c]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-5cf1870c]{padding:10px 16px}table.popups-table tbody tr[data-v-5cf1870c]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-5cf1870c]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-5cf1870c]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-5cf1870c]{width:100%}header.header-desktop[data-v-5cf1870c]{display:block}header.header-mobile[data-v-5cf1870c]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-5cf1870c]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-5cf1870c]{width:100%;height:100%}header.header-mobile button svg path[data-v-5cf1870c]{fill:#fff}nav.sidebar[data-v-5cf1870c]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-5cf1870c]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-5cf1870c]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-5cf1870c]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-5cf1870c]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-5cf1870c]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-5cf1870c]{color:#fff}nav.sidebar .container .children[data-v-5cf1870c]{padding-left:30px}@-moz-keyframes tada-5cf1870c{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-5cf1870c{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-5cf1870c{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-5cf1870c{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-5cf1870c]{animation:dialogEnter-5cf1870c .3s linear forwards}.dialog-leave-active[data-v-5cf1870c]{animation:dialogLeave-5cf1870c .3s linear forwards}@keyframes dialogEnter-5cf1870c{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-5cf1870c{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-5cf1870c]{animation:dialogEnter-5cf1870c .2s linear forwards}.dialog1-leave-active[data-v-5cf1870c]{animation:dialogLeave-5cf1870c .2s linear forwards}@keyframes rotateEnter-5cf1870c{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-5cf1870c]{animation:rotateEnter-5cf1870c .7s;position:relative}.rotate-leave-active[data-v-5cf1870c]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-5cf1870c{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-5cf1870c{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-5cf1870c]{animation:slideOutTop-5cf1870c .5s linear forwards}.slide-top-leave-active[data-v-5cf1870c],.slide-bottom-enter-active[data-v-5cf1870c]{animation:slideOutBottom-5cf1870c .5s linear forwards}@keyframes slideInLeft-5cf1870c{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-5cf1870c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-5cf1870c]{animation:slideInLeft-5cf1870c .3s linear forwards}.slide-left-leave-active[data-v-5cf1870c]{animation:slideInRight-5cf1870c .3s linear forwards}@keyframes slideOutLeft-5cf1870c{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-5cf1870c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-5cf1870c]{animation:slideOutLeft-5cf1870c .3s linear forwards}.slide-right-leave-active[data-v-5cf1870c]{animation:slideOutRight-5cf1870c .3s linear forwards}@keyframes bganimation-5cf1870c{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-5cf1870c{0%{height:0}to{height:100px}}@keyframes fadeEnd-5cf1870c{0%{height:100%}to{height:0}}.fade-enter-active[data-v-5cf1870c]{animation:fadeStart-5cf1870c .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-5cf1870c]{animation:fadeEnd-5cf1870c .1s linear forwards;overflow:hidden}@media screen and (max-width: 1400px){.actioner-dns .actioner-dns_body[data-v-5cf1870c]{min-height:34vh}}@media screen and (max-width: 860px){.actioner-dns[data-v-5cf1870c]{width:100%}}@keyframes turns-47b0529a{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-47b0529a]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-47b0529a]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-47b0529a]{color:#f9ad1e}.notice_info li[data-v-47b0529a]{font-size:14px;list-style:revert}.text-container[data-v-47b0529a]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-47b0529a]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-47b0529a]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-47b0529a]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-47b0529a]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-47b0529a]{width:100%}.text-container .text-container_item p.info-desc[data-v-47b0529a]{width:100%;color:#999;font-size:14px}.page-container[data-v-47b0529a]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-47b0529a]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-47b0529a]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-47b0529a]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-47b0529a],.page-container .page-flex .page-sidebar a[data-v-47b0529a]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-47b0529a]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-47b0529a]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-47b0529a]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-47b0529a]{border-radius:0;padding:1rem}ul.ul-container[data-v-47b0529a]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-47b0529a]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-47b0529a]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-47b0529a]{width:100%}form.form-container[data-v-47b0529a]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-47b0529a]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-47b0529a]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-47b0529a]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-47b0529a]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-47b0529a],form.form-container .label-value select[data-v-47b0529a]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-47b0529a]:focus,form.form-container .label-value select[data-v-47b0529a]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-47b0529a]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-47b0529a]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-47b0529a],form.form-container .label-value input[type=radio][data-v-47b0529a]{width:auto}form.form-container .label-value input[type=radio][data-v-47b0529a]{margin:0 4px 0 0}form.form-container .label-value input[data-v-47b0529a]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-47b0529a]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-47b0529a]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-47b0529a]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-47b0529a]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-47b0529a]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-47b0529a]:hover{background-color:#747474}form.form-container .label-msg[data-v-47b0529a]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-47b0529a]{color:#f9ad1e}form.form-container .label-flex[data-v-47b0529a]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-47b0529a]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-47b0529a]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-47b0529a]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-47b0529a]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-47b0529a]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-47b0529a]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-47b0529a],form.form-container1 .label-value select[data-v-47b0529a]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-47b0529a]:focus,form.form-container1 .label-value select[data-v-47b0529a]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-47b0529a]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-47b0529a],form.form-container1 .label-value input[type=radio][data-v-47b0529a]{width:auto}form.form-container1 .label-value input[type=radio][data-v-47b0529a]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-47b0529a]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-47b0529a]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-47b0529a]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-47b0529a]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-47b0529a]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-47b0529a]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-47b0529a]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-47b0529a]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-47b0529a]{color:#f9ad1e}form.form-container1 .label-flex[data-v-47b0529a]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-47b0529a]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-47b0529a]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-47b0529a]{width:100px}table.page-table th.checkbox[data-v-47b0529a]{width:50px;text-align:center}table.page-table th.setting[data-v-47b0529a]{width:100px;text-align:center}table.page-table thead[data-v-47b0529a]{color:#909399}table.page-table thead tr[data-v-47b0529a]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-47b0529a]{padding:10px 16px}table.page-table tbody tr[data-v-47b0529a]:hover{background-color:#eeee}table.page-table tbody tr[data-v-47b0529a]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-47b0529a]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-47b0529a]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-47b0529a]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-47b0529a]{width:100px}table.popups-table th.checkbox[data-v-47b0529a]{width:50px;text-align:center}table.popups-table th.setting[data-v-47b0529a]{width:100px;text-align:center}table.popups-table thead[data-v-47b0529a]{color:#eee}table.popups-table thead tr[data-v-47b0529a]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-47b0529a]{padding:10px 16px}table.popups-table tbody tr[data-v-47b0529a]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-47b0529a]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-47b0529a]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-47b0529a]{width:100%}header.header-desktop[data-v-47b0529a]{display:block}header.header-mobile[data-v-47b0529a]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-47b0529a]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-47b0529a]{width:100%;height:100%}header.header-mobile button svg path[data-v-47b0529a]{fill:#fff}nav.sidebar[data-v-47b0529a]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-47b0529a]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-47b0529a]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-47b0529a]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-47b0529a]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-47b0529a]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-47b0529a]{color:#fff}nav.sidebar .container .children[data-v-47b0529a]{padding-left:30px}@-moz-keyframes tada-47b0529a{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-47b0529a{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-47b0529a{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-47b0529a{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-47b0529a]{animation:dialogEnter-47b0529a .3s linear forwards}.dialog-leave-active[data-v-47b0529a]{animation:dialogLeave-47b0529a .3s linear forwards}@keyframes dialogEnter-47b0529a{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-47b0529a{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-47b0529a]{animation:dialogEnter-47b0529a .2s linear forwards}.dialog1-leave-active[data-v-47b0529a]{animation:dialogLeave-47b0529a .2s linear forwards}@keyframes rotateEnter-47b0529a{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-47b0529a]{animation:rotateEnter-47b0529a .7s;position:relative}.rotate-leave-active[data-v-47b0529a]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-47b0529a{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-47b0529a{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-47b0529a]{animation:slideOutTop-47b0529a .5s linear forwards}.slide-top-leave-active[data-v-47b0529a],.slide-bottom-enter-active[data-v-47b0529a]{animation:slideOutBottom-47b0529a .5s linear forwards}@keyframes slideInLeft-47b0529a{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-47b0529a{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-47b0529a]{animation:slideInLeft-47b0529a .3s linear forwards}.slide-left-leave-active[data-v-47b0529a]{animation:slideInRight-47b0529a .3s linear forwards}@keyframes slideOutLeft-47b0529a{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-47b0529a{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-47b0529a]{animation:slideOutLeft-47b0529a .3s linear forwards}.slide-right-leave-active[data-v-47b0529a]{animation:slideOutRight-47b0529a .3s linear forwards}@keyframes bganimation-47b0529a{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-47b0529a{0%{height:0}to{height:100px}}@keyframes fadeEnd-47b0529a{0%{height:100%}to{height:0}}.fade-enter-active[data-v-47b0529a]{animation:fadeStart-47b0529a .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-47b0529a]{animation:fadeEnd-47b0529a .1s linear forwards;overflow:hidden}.utilities[data-v-47b0529a]{width:100%}.utilities>div[data-v-47b0529a]{display:inline-block;cursor:pointer;position:relative;height:42px;margin-right:8px;margin-bottom:4px;border-radius:8px;padding:0 12px;background-size:100% 100%}.utilities>div>span[data-v-47b0529a]{display:inline-block;line-height:42px;color:#fff;font-size:14px;font-weight:600;z-index:999;width:100%;text-align:center}.utilities>div[data-v-47b0529a]:nth-of-type(1){background-image:url(/luci-static/istorex/tag-0.png?v=3b986a1b)}.utilities>div[data-v-47b0529a]:nth-of-type(2){background-image:url(/luci-static/istorex/tag-1.png?v=16e2fe5a)}.utilities>div[data-v-47b0529a]:nth-of-type(3){background-image:url(/luci-static/istorex/tag-2.png?v=b66239bc)}.utilities>div[data-v-47b0529a]:nth-of-type(4){background-image:url(/luci-static/istorex/tag-3.png?v=537ee5e7)}.utilities>div[data-v-47b0529a]:nth-of-type(5){background-image:url(/luci-static/istorex/tag-4.png?v=5f48ef97)}.utilities>div[data-v-47b0529a]:nth-of-type(6){background-image:url(/luci-static/istorex/tag-0.png?v=3b986a1b)}i[data-v-47b0529a]{display:inline-block;padding:3px;background-color:red;border-radius:50%}@keyframes turns-21e54302{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-21e54302]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-21e54302]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-21e54302]{color:#f9ad1e}.notice_info li[data-v-21e54302]{font-size:14px;list-style:revert}.text-container[data-v-21e54302]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-21e54302]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-21e54302]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-21e54302]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-21e54302]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-21e54302]{width:100%}.text-container .text-container_item p.info-desc[data-v-21e54302]{width:100%;color:#999;font-size:14px}.page-container[data-v-21e54302]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-21e54302]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-21e54302]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-21e54302]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-21e54302],.page-container .page-flex .page-sidebar a[data-v-21e54302]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-21e54302]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-21e54302]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-21e54302]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-21e54302]{border-radius:0;padding:1rem}ul.ul-container[data-v-21e54302]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-21e54302]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-21e54302]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-21e54302]{width:100%}form.form-container[data-v-21e54302]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-21e54302]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-21e54302]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-21e54302]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-21e54302]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-21e54302],form.form-container .label-value select[data-v-21e54302]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-21e54302]:focus,form.form-container .label-value select[data-v-21e54302]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-21e54302]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-21e54302]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-21e54302],form.form-container .label-value input[type=radio][data-v-21e54302]{width:auto}form.form-container .label-value input[type=radio][data-v-21e54302]{margin:0 4px 0 0}form.form-container .label-value input[data-v-21e54302]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-21e54302]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-21e54302]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-21e54302]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-21e54302]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-21e54302]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-21e54302]:hover{background-color:#747474}form.form-container .label-msg[data-v-21e54302]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-21e54302]{color:#f9ad1e}form.form-container .label-flex[data-v-21e54302]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-21e54302]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-21e54302]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-21e54302]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-21e54302]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-21e54302]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-21e54302]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-21e54302],form.form-container1 .label-value select[data-v-21e54302]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-21e54302]:focus,form.form-container1 .label-value select[data-v-21e54302]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-21e54302]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-21e54302],form.form-container1 .label-value input[type=radio][data-v-21e54302]{width:auto}form.form-container1 .label-value input[type=radio][data-v-21e54302]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-21e54302]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-21e54302]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-21e54302]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-21e54302]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-21e54302]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-21e54302]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-21e54302]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-21e54302]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-21e54302]{color:#f9ad1e}form.form-container1 .label-flex[data-v-21e54302]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-21e54302]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-21e54302]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-21e54302]{width:100px}table.page-table th.checkbox[data-v-21e54302]{width:50px;text-align:center}table.page-table th.setting[data-v-21e54302]{width:100px;text-align:center}table.page-table thead[data-v-21e54302]{color:#909399}table.page-table thead tr[data-v-21e54302]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-21e54302]{padding:10px 16px}table.page-table tbody tr[data-v-21e54302]:hover{background-color:#eeee}table.page-table tbody tr[data-v-21e54302]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-21e54302]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-21e54302]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-21e54302]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-21e54302]{width:100px}table.popups-table th.checkbox[data-v-21e54302]{width:50px;text-align:center}table.popups-table th.setting[data-v-21e54302]{width:100px;text-align:center}table.popups-table thead[data-v-21e54302]{color:#eee}table.popups-table thead tr[data-v-21e54302]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-21e54302]{padding:10px 16px}table.popups-table tbody tr[data-v-21e54302]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-21e54302]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-21e54302]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-21e54302]{width:100%}header.header-desktop[data-v-21e54302]{display:block}header.header-mobile[data-v-21e54302]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-21e54302]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-21e54302]{width:100%;height:100%}header.header-mobile button svg path[data-v-21e54302]{fill:#fff}nav.sidebar[data-v-21e54302]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-21e54302]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-21e54302]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-21e54302]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-21e54302]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-21e54302]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-21e54302]{color:#fff}nav.sidebar .container .children[data-v-21e54302]{padding-left:30px}@-moz-keyframes tada-21e54302{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-21e54302{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-21e54302{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-21e54302{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-21e54302]{animation:dialogEnter-21e54302 .3s linear forwards}.dialog-leave-active[data-v-21e54302]{animation:dialogLeave-21e54302 .3s linear forwards}@keyframes dialogEnter-21e54302{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-21e54302{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-21e54302]{animation:dialogEnter-21e54302 .2s linear forwards}.dialog1-leave-active[data-v-21e54302]{animation:dialogLeave-21e54302 .2s linear forwards}@keyframes rotateEnter-21e54302{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-21e54302]{animation:rotateEnter-21e54302 .7s;position:relative}.rotate-leave-active[data-v-21e54302]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-21e54302{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-21e54302{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-21e54302]{animation:slideOutTop-21e54302 .5s linear forwards}.slide-top-leave-active[data-v-21e54302],.slide-bottom-enter-active[data-v-21e54302]{animation:slideOutBottom-21e54302 .5s linear forwards}@keyframes slideInLeft-21e54302{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-21e54302{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-21e54302]{animation:slideInLeft-21e54302 .3s linear forwards}.slide-left-leave-active[data-v-21e54302]{animation:slideInRight-21e54302 .3s linear forwards}@keyframes slideOutLeft-21e54302{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-21e54302{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-21e54302]{animation:slideOutLeft-21e54302 .3s linear forwards}.slide-right-leave-active[data-v-21e54302]{animation:slideOutRight-21e54302 .3s linear forwards}@keyframes bganimation-21e54302{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-21e54302{0%{height:0}to{height:100px}}@keyframes fadeEnd-21e54302{0%{height:100%}to{height:0}}.fade-enter-active[data-v-21e54302]{animation:fadeStart-21e54302 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-21e54302]{animation:fadeEnd-21e54302 .1s linear forwards;overflow:hidden}.card[data-v-21e54302]{display:inline-block;width:100%;padding:4px;box-sizing:content-box;vertical-align:top}.card>div[data-v-21e54302]{border-radius:12px;background:#fff;width:100%;height:100%}.card>div>.title[data-v-21e54302]{padding:12px 12px 8px;color:#000c;font-size:14px;font-weight:600;position:relative}.card>div>.title>span[data-v-21e54302]{margin-right:6px}.card>div>.title>a>svg[data-v-21e54302]{position:relative;top:2px}.card>div>.title .toolbar[data-v-21e54302]{position:absolute;right:10px;top:8px;display:flex;flex-wrap:wrap;align-items:center}.card>div>.title .toolbar .action[data-v-21e54302]{display:inline-block;border:1px solid #eaeaea;padding:0 6px;height:26px;color:#000c;text-align:center;font-size:12px;cursor:pointer;line-height:26px;border-radius:5px}.card>div>.title .toolbar .actions[data-v-21e54302]{position:absolute;z-index:999;width:30%;right:0}.card>div>.title .toolbar .actions .menu_background[data-v-21e54302]{position:fixed;inset:0}.card>div>.title .toolbar .actions ul[data-v-21e54302]{background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:4px 8px;border-radius:6px;top:18px;right:0;text-align:center;position:absolute;word-break:keep-all}.card>div>.title .toolbar .actions ul li[data-v-21e54302]{margin:6px 0;cursor:pointer;font-size:12px;font-weight:400}.card>div>.title .toolbar .actions ul li[data-v-21e54302]:hover{background-color:#eee}.card>div>.title .toolbar .more-icon[data-v-21e54302]{border-radius:4px;border:1px solid #eaeaea;height:18px;width:18px;display:inline-block;cursor:pointer;display:flex;align-items:center;justify-content:center}.card>div>.card-body[data-v-21e54302]{height:100%}@keyframes turns-475e377c{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-475e377c]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-475e377c]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-475e377c]{color:#f9ad1e}.notice_info li[data-v-475e377c]{font-size:14px;list-style:revert}.text-container[data-v-475e377c]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-475e377c]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-475e377c]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-475e377c]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-475e377c]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-475e377c]{width:100%}.text-container .text-container_item p.info-desc[data-v-475e377c]{width:100%;color:#999;font-size:14px}.page-container[data-v-475e377c]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-475e377c]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-475e377c]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-475e377c]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-475e377c],.page-container .page-flex .page-sidebar a[data-v-475e377c]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-475e377c]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-475e377c]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-475e377c]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-475e377c]{border-radius:0;padding:1rem}ul.ul-container[data-v-475e377c]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-475e377c]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-475e377c]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-475e377c]{width:100%}form.form-container[data-v-475e377c]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-475e377c]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-475e377c]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-475e377c]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-475e377c]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-475e377c],form.form-container .label-value select[data-v-475e377c]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-475e377c]:focus,form.form-container .label-value select[data-v-475e377c]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-475e377c]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-475e377c]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-475e377c],form.form-container .label-value input[type=radio][data-v-475e377c]{width:auto}form.form-container .label-value input[type=radio][data-v-475e377c]{margin:0 4px 0 0}form.form-container .label-value input[data-v-475e377c]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-475e377c]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-475e377c]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-475e377c]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-475e377c]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-475e377c]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-475e377c]:hover{background-color:#747474}form.form-container .label-msg[data-v-475e377c]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-475e377c]{color:#f9ad1e}form.form-container .label-flex[data-v-475e377c]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-475e377c]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-475e377c]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-475e377c]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-475e377c]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-475e377c]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-475e377c]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-475e377c],form.form-container1 .label-value select[data-v-475e377c]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-475e377c]:focus,form.form-container1 .label-value select[data-v-475e377c]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-475e377c]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-475e377c],form.form-container1 .label-value input[type=radio][data-v-475e377c]{width:auto}form.form-container1 .label-value input[type=radio][data-v-475e377c]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-475e377c]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-475e377c]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-475e377c]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-475e377c]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-475e377c]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-475e377c]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-475e377c]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-475e377c]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-475e377c]{color:#f9ad1e}form.form-container1 .label-flex[data-v-475e377c]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-475e377c]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-475e377c]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-475e377c]{width:100px}table.page-table th.checkbox[data-v-475e377c]{width:50px;text-align:center}table.page-table th.setting[data-v-475e377c]{width:100px;text-align:center}table.page-table thead[data-v-475e377c]{color:#909399}table.page-table thead tr[data-v-475e377c]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-475e377c]{padding:10px 16px}table.page-table tbody tr[data-v-475e377c]:hover{background-color:#eeee}table.page-table tbody tr[data-v-475e377c]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-475e377c]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-475e377c]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-475e377c]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-475e377c]{width:100px}table.popups-table th.checkbox[data-v-475e377c]{width:50px;text-align:center}table.popups-table th.setting[data-v-475e377c]{width:100px;text-align:center}table.popups-table thead[data-v-475e377c]{color:#eee}table.popups-table thead tr[data-v-475e377c]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-475e377c]{padding:10px 16px}table.popups-table tbody tr[data-v-475e377c]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-475e377c]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-475e377c]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-475e377c]{width:100%}header.header-desktop[data-v-475e377c]{display:block}header.header-mobile[data-v-475e377c]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-475e377c]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-475e377c]{width:100%;height:100%}header.header-mobile button svg path[data-v-475e377c]{fill:#fff}nav.sidebar[data-v-475e377c]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-475e377c]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-475e377c]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-475e377c]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-475e377c]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-475e377c]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-475e377c]{color:#fff}nav.sidebar .container .children[data-v-475e377c]{padding-left:30px}@-moz-keyframes tada-475e377c{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-475e377c{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-475e377c{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-475e377c{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-475e377c]{animation:dialogEnter-475e377c .3s linear forwards}.dialog-leave-active[data-v-475e377c]{animation:dialogLeave-475e377c .3s linear forwards}@keyframes dialogEnter-475e377c{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-475e377c{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-475e377c]{animation:dialogEnter-475e377c .2s linear forwards}.dialog1-leave-active[data-v-475e377c]{animation:dialogLeave-475e377c .2s linear forwards}@keyframes rotateEnter-475e377c{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-475e377c]{animation:rotateEnter-475e377c .7s;position:relative}.rotate-leave-active[data-v-475e377c]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-475e377c{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-475e377c{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-475e377c]{animation:slideOutTop-475e377c .5s linear forwards}.slide-top-leave-active[data-v-475e377c],.slide-bottom-enter-active[data-v-475e377c]{animation:slideOutBottom-475e377c .5s linear forwards}@keyframes slideInLeft-475e377c{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-475e377c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-475e377c]{animation:slideInLeft-475e377c .3s linear forwards}.slide-left-leave-active[data-v-475e377c]{animation:slideInRight-475e377c .3s linear forwards}@keyframes slideOutLeft-475e377c{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-475e377c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-475e377c]{animation:slideOutLeft-475e377c .3s linear forwards}.slide-right-leave-active[data-v-475e377c]{animation:slideOutRight-475e377c .3s linear forwards}@keyframes bganimation-475e377c{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-475e377c{0%{height:0}to{height:100px}}@keyframes fadeEnd-475e377c{0%{height:100%}to{height:0}}.fade-enter-active[data-v-475e377c]{animation:fadeStart-475e377c .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-475e377c]{animation:fadeEnd-475e377c .1s linear forwards;overflow:hidden}.flow[data-v-475e377c]{position:relative;height:176px}.flow .echart[data-v-475e377c]{width:100%;height:100%}.flow .flow-data[data-v-475e377c]{position:absolute;right:4px;top:-30px;font-size:12px}.flow .flow-data span[data-v-475e377c]{display:block;color:#0009;transform:scale(.9)}@keyframes turns-39628bee{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-39628bee]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-39628bee]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-39628bee]{color:#f9ad1e}.notice_info li[data-v-39628bee]{font-size:14px;list-style:revert}.text-container[data-v-39628bee]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-39628bee]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-39628bee]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-39628bee]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-39628bee]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-39628bee]{width:100%}.text-container .text-container_item p.info-desc[data-v-39628bee]{width:100%;color:#999;font-size:14px}.page-container[data-v-39628bee]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-39628bee]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-39628bee]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-39628bee]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-39628bee],.page-container .page-flex .page-sidebar a[data-v-39628bee]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-39628bee]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-39628bee]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-39628bee]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-39628bee]{border-radius:0;padding:1rem}ul.ul-container[data-v-39628bee]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-39628bee]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-39628bee]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-39628bee]{width:100%}form.form-container[data-v-39628bee]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-39628bee]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-39628bee]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-39628bee]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-39628bee]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-39628bee],form.form-container .label-value select[data-v-39628bee]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-39628bee]:focus,form.form-container .label-value select[data-v-39628bee]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-39628bee]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-39628bee]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-39628bee],form.form-container .label-value input[type=radio][data-v-39628bee]{width:auto}form.form-container .label-value input[type=radio][data-v-39628bee]{margin:0 4px 0 0}form.form-container .label-value input[data-v-39628bee]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-39628bee]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-39628bee]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-39628bee]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-39628bee]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-39628bee]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-39628bee]:hover{background-color:#747474}form.form-container .label-msg[data-v-39628bee]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-39628bee]{color:#f9ad1e}form.form-container .label-flex[data-v-39628bee]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-39628bee]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-39628bee]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-39628bee]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-39628bee]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-39628bee]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-39628bee]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-39628bee],form.form-container1 .label-value select[data-v-39628bee]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-39628bee]:focus,form.form-container1 .label-value select[data-v-39628bee]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-39628bee]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-39628bee],form.form-container1 .label-value input[type=radio][data-v-39628bee]{width:auto}form.form-container1 .label-value input[type=radio][data-v-39628bee]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-39628bee]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-39628bee]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-39628bee]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-39628bee]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-39628bee]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-39628bee]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-39628bee]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-39628bee]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-39628bee]{color:#f9ad1e}form.form-container1 .label-flex[data-v-39628bee]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-39628bee]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-39628bee]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-39628bee]{width:100px}table.page-table th.checkbox[data-v-39628bee]{width:50px;text-align:center}table.page-table th.setting[data-v-39628bee]{width:100px;text-align:center}table.page-table thead[data-v-39628bee]{color:#909399}table.page-table thead tr[data-v-39628bee]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-39628bee]{padding:10px 16px}table.page-table tbody tr[data-v-39628bee]:hover{background-color:#eeee}table.page-table tbody tr[data-v-39628bee]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-39628bee]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-39628bee]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-39628bee]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-39628bee]{width:100px}table.popups-table th.checkbox[data-v-39628bee]{width:50px;text-align:center}table.popups-table th.setting[data-v-39628bee]{width:100px;text-align:center}table.popups-table thead[data-v-39628bee]{color:#eee}table.popups-table thead tr[data-v-39628bee]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-39628bee]{padding:10px 16px}table.popups-table tbody tr[data-v-39628bee]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-39628bee]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-39628bee]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-39628bee]{width:100%}header.header-desktop[data-v-39628bee]{display:block}header.header-mobile[data-v-39628bee]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-39628bee]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-39628bee]{width:100%;height:100%}header.header-mobile button svg path[data-v-39628bee]{fill:#fff}nav.sidebar[data-v-39628bee]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-39628bee]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-39628bee]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-39628bee]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-39628bee]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-39628bee]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-39628bee]{color:#fff}nav.sidebar .container .children[data-v-39628bee]{padding-left:30px}@-moz-keyframes tada-39628bee{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-39628bee{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-39628bee{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-39628bee{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-39628bee]{animation:dialogEnter-39628bee .3s linear forwards}.dialog-leave-active[data-v-39628bee]{animation:dialogLeave-39628bee .3s linear forwards}@keyframes dialogEnter-39628bee{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-39628bee{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-39628bee]{animation:dialogEnter-39628bee .2s linear forwards}.dialog1-leave-active[data-v-39628bee]{animation:dialogLeave-39628bee .2s linear forwards}@keyframes rotateEnter-39628bee{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-39628bee]{animation:rotateEnter-39628bee .7s;position:relative}.rotate-leave-active[data-v-39628bee]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-39628bee{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-39628bee{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-39628bee]{animation:slideOutTop-39628bee .5s linear forwards}.slide-top-leave-active[data-v-39628bee],.slide-bottom-enter-active[data-v-39628bee]{animation:slideOutBottom-39628bee .5s linear forwards}@keyframes slideInLeft-39628bee{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-39628bee{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-39628bee]{animation:slideInLeft-39628bee .3s linear forwards}.slide-left-leave-active[data-v-39628bee]{animation:slideInRight-39628bee .3s linear forwards}@keyframes slideOutLeft-39628bee{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-39628bee{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-39628bee]{animation:slideOutLeft-39628bee .3s linear forwards}.slide-right-leave-active[data-v-39628bee]{animation:slideOutRight-39628bee .3s linear forwards}@keyframes bganimation-39628bee{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-39628bee{0%{height:0}to{height:100px}}@keyframes fadeEnd-39628bee{0%{height:100%}to{height:0}}.fade-enter-active[data-v-39628bee]{animation:fadeStart-39628bee .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-39628bee]{animation:fadeEnd-39628bee .1s linear forwards;overflow:hidden}.network[data-v-39628bee],.device[data-v-39628bee]{display:flex;align-items:center;padding:8px}.network img[data-v-39628bee],.device img[data-v-39628bee]{display:inline-block;margin-right:8px;width:32px}.network div[data-v-39628bee],.device div[data-v-39628bee]{display:inline-block;overflow:hidden}.network div>span[data-v-39628bee],.device div>span[data-v-39628bee]{display:inline-block;width:100%}.network div>span[data-v-39628bee]:first-of-type,.device div>span[data-v-39628bee]:first-of-type{font-size:13px;font-weight:600}.network div>span[data-v-39628bee]:last-of-type,.device div>span[data-v-39628bee]:last-of-type{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:#000c;font-size:12px;font-weight:500}.ip-dns[data-v-39628bee]{padding:12px}.ip-dns>div[data-v-39628bee]{color:#000c;font-size:12px;font-weight:500}.ip-dns>div[data-v-39628bee]:not(:last-of-type){margin-bottom:16px}.ip-dns>div>span[data-v-39628bee]{display:inline-block;margin-bottom:4px}.ip-dns>div.ip>span[data-v-39628bee]{width:100%}.ip-dns>div.dns>span[data-v-39628bee]{display:inline-block;width:50%;padding-right:8px}.ip-dns>.title[data-v-39628bee]{font-size:13px;font-weight:600;margin-bottom:10px}.width-45[data-v-39628bee]{display:inline-block;vertical-align:top;width:45%}.width-55[data-v-39628bee]{display:inline-block;vertical-align:top;width:55%}@media screen and (max-width: 668px){.responsive[data-v-39628bee]{width:100%}}.action .action-footer button[data-v-bd2acf72]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}.action.format[data-v-bd2acf72]{width:700px;height:560px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;overflow:auto;padding:0 25px;border:1px solid #dfdfdf;border-radius:4px;background:#fff;box-shadow:0 1px 4px #0000004d}.action.format .action-header[data-v-bd2acf72]{width:100%;height:70px;line-height:70px}.action.format .action-header .action-header_title[data-v-bd2acf72]{margin:0;color:#333;font:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-moz-user-select:none;-webkit-user-select:none;user-select:none;font-size:20px}.action.format .action-body[data-v-bd2acf72]{width:100%;height:calc(100% - 140px);overflow:auto}.action.format .action-footer[data-v-bd2acf72]{width:100%;height:70px;line-height:70px;color:#333;display:flex;flex-wrap:wrap;align-items:center}.action.format .action-footer .auto[data-v-bd2acf72]{flex:auto}.action.format .disk-list[data-v-bd2acf72]{width:100%;height:100%;border:1px solid #dfe1e5;overflow:auto}.action.format .label-item[data-v-bd2acf72]{width:100%;margin:1rem 0}.action.format .label-item .label-item_key[data-v-bd2acf72]{width:100%;font-size:16px;color:#666}.action.format .label-item .label-item_key span[data-v-bd2acf72]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.action.format .label-item .label-item_key span[data-v-bd2acf72]:before{content:\"*\";color:#f56c6c;margin-right:4px}.action.format .label-item .label-item_value[data-v-bd2acf72]{width:100%;margin-top:5px}.action.format .label-item .label-item_value select[data-v-bd2acf72],.action.format .label-item .label-item_value input[data-v-bd2acf72]{width:100%;height:36px}.action.format .label-item .label-item_path[data-v-bd2acf72]{padding:0 14px;background-color:#e5e5e5;width:100%;height:28px;line-height:28px;margin-top:10px}.action.format .auto[data-v-bd2acf72]{flex:auto}.action.format p.msg[data-v-bd2acf72]{margin:.5rem 0;color:red}.action.format .disk-info[data-v-bd2acf72]{width:100%;text-align:center}.action.format .disk-info .disk-info_icon[data-v-bd2acf72]{width:100px;height:100px;margin:0 auto}.action.format .disk-info .disk-info_icon svg[data-v-bd2acf72]{width:100%;height:100%}.action.format .disk-info .disk-info_mount-name[data-v-bd2acf72]{margin:1rem 0;font-size:1.5em;color:#333}.action.result[data-v-bd2acf72]{width:700px;height:560px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;overflow:auto;padding:0 25px;border:1px solid #dfdfdf;border-radius:4px;background:#fff;box-shadow:0 1px 4px #0000004d}.action.result .action-body[data-v-bd2acf72]{width:100%;height:100%;display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center}.action.result .action-body .action-body_icon[data-v-bd2acf72]{width:100px;height:100px}.action.result .action-body .action-body_icon svg.icon[data-v-bd2acf72]{width:100%;height:100%}.action.result .action-body .action-body_msg[data-v-bd2acf72]{font-size:2em;color:#666;text-align:center;width:100%;margin:1rem 0}.action.result .action-body .action-body_info[data-v-bd2acf72]{margin:1rem 0;width:100%;text-align:center;color:#666;font-size:1.2em}.action.result .action-body .action-body_info a[data-v-bd2acf72]{color:#0000fb}.action.result .btns[data-v-bd2acf72]{width:100%;text-align:center;margin:1rem 0}@keyframes turns-bd2acf72{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-bd2acf72]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-bd2acf72]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-bd2acf72]{color:#f9ad1e}.notice_info li[data-v-bd2acf72]{font-size:14px;list-style:revert}.text-container[data-v-bd2acf72]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-bd2acf72]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-bd2acf72]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-bd2acf72]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-bd2acf72]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-bd2acf72]{width:100%}.text-container .text-container_item p.info-desc[data-v-bd2acf72]{width:100%;color:#999;font-size:14px}.page-container[data-v-bd2acf72]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-bd2acf72]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-bd2acf72]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-bd2acf72]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-bd2acf72],.page-container .page-flex .page-sidebar a[data-v-bd2acf72]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-bd2acf72]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-bd2acf72]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-bd2acf72]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-bd2acf72]{border-radius:0;padding:1rem}ul.ul-container[data-v-bd2acf72]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-bd2acf72]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-bd2acf72]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-bd2acf72]{width:100%}form.form-container[data-v-bd2acf72]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-bd2acf72]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-bd2acf72]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-bd2acf72]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-bd2acf72]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-bd2acf72],form.form-container .label-value select[data-v-bd2acf72]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-bd2acf72]:focus,form.form-container .label-value select[data-v-bd2acf72]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-bd2acf72]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-bd2acf72]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-bd2acf72],form.form-container .label-value input[type=radio][data-v-bd2acf72]{width:auto}form.form-container .label-value input[type=radio][data-v-bd2acf72]{margin:0 4px 0 0}form.form-container .label-value input[data-v-bd2acf72]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-bd2acf72]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-bd2acf72]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-bd2acf72]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-bd2acf72]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-bd2acf72]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-bd2acf72]:hover{background-color:#747474}form.form-container .label-msg[data-v-bd2acf72]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-bd2acf72]{color:#f9ad1e}form.form-container .label-flex[data-v-bd2acf72]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-bd2acf72]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-bd2acf72]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-bd2acf72]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-bd2acf72]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-bd2acf72]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-bd2acf72]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-bd2acf72],form.form-container1 .label-value select[data-v-bd2acf72]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-bd2acf72]:focus,form.form-container1 .label-value select[data-v-bd2acf72]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-bd2acf72]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-bd2acf72],form.form-container1 .label-value input[type=radio][data-v-bd2acf72]{width:auto}form.form-container1 .label-value input[type=radio][data-v-bd2acf72]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-bd2acf72]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-bd2acf72]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-bd2acf72]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-bd2acf72]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-bd2acf72]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-bd2acf72]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-bd2acf72]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-bd2acf72]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-bd2acf72]{color:#f9ad1e}form.form-container1 .label-flex[data-v-bd2acf72]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-bd2acf72]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-bd2acf72]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-bd2acf72]{width:100px}table.page-table th.checkbox[data-v-bd2acf72]{width:50px;text-align:center}table.page-table th.setting[data-v-bd2acf72]{width:100px;text-align:center}table.page-table thead[data-v-bd2acf72]{color:#909399}table.page-table thead tr[data-v-bd2acf72]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-bd2acf72]{padding:10px 16px}table.page-table tbody tr[data-v-bd2acf72]:hover{background-color:#eeee}table.page-table tbody tr[data-v-bd2acf72]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-bd2acf72]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-bd2acf72]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-bd2acf72]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-bd2acf72]{width:100px}table.popups-table th.checkbox[data-v-bd2acf72]{width:50px;text-align:center}table.popups-table th.setting[data-v-bd2acf72]{width:100px;text-align:center}table.popups-table thead[data-v-bd2acf72]{color:#eee}table.popups-table thead tr[data-v-bd2acf72]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-bd2acf72]{padding:10px 16px}table.popups-table tbody tr[data-v-bd2acf72]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-bd2acf72]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-bd2acf72]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-bd2acf72]{width:100%}header.header-desktop[data-v-bd2acf72]{display:block}header.header-mobile[data-v-bd2acf72]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-bd2acf72]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-bd2acf72]{width:100%;height:100%}header.header-mobile button svg path[data-v-bd2acf72]{fill:#fff}nav.sidebar[data-v-bd2acf72]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-bd2acf72]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-bd2acf72]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-bd2acf72]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-bd2acf72]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-bd2acf72]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-bd2acf72]{color:#fff}nav.sidebar .container .children[data-v-bd2acf72]{padding-left:30px}@-moz-keyframes tada-bd2acf72{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-bd2acf72{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-bd2acf72{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-bd2acf72{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-bd2acf72]{animation:dialogEnter-bd2acf72 .3s linear forwards}.dialog-leave-active[data-v-bd2acf72]{animation:dialogLeave-bd2acf72 .3s linear forwards}@keyframes dialogEnter-bd2acf72{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-bd2acf72{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-bd2acf72]{animation:dialogEnter-bd2acf72 .2s linear forwards}.dialog1-leave-active[data-v-bd2acf72]{animation:dialogLeave-bd2acf72 .2s linear forwards}@keyframes rotateEnter-bd2acf72{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-bd2acf72]{animation:rotateEnter-bd2acf72 .7s;position:relative}.rotate-leave-active[data-v-bd2acf72]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-bd2acf72{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-bd2acf72{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-bd2acf72]{animation:slideOutTop-bd2acf72 .5s linear forwards}.slide-top-leave-active[data-v-bd2acf72],.slide-bottom-enter-active[data-v-bd2acf72]{animation:slideOutBottom-bd2acf72 .5s linear forwards}@keyframes slideInLeft-bd2acf72{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-bd2acf72{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-bd2acf72]{animation:slideInLeft-bd2acf72 .3s linear forwards}.slide-left-leave-active[data-v-bd2acf72]{animation:slideInRight-bd2acf72 .3s linear forwards}@keyframes slideOutLeft-bd2acf72{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-bd2acf72{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-bd2acf72]{animation:slideOutLeft-bd2acf72 .3s linear forwards}.slide-right-leave-active[data-v-bd2acf72]{animation:slideOutRight-bd2acf72 .3s linear forwards}@keyframes bganimation-bd2acf72{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-bd2acf72{0%{height:0}to{height:100px}}@keyframes fadeEnd-bd2acf72{0%{height:100%}to{height:0}}.fade-enter-active[data-v-bd2acf72]{animation:fadeStart-bd2acf72 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-bd2acf72]{animation:fadeEnd-bd2acf72 .1s linear forwards;overflow:hidden}@media screen and (max-width: 1000px){.action.format[data-v-bd2acf72]{width:168%}}@media screen and (max-width: 900px){.action.format[data-v-bd2acf72]{width:146%}}@media screen and (max-width: 800px){.action.format[data-v-bd2acf72]{width:136%}}@media screen and (max-width: 700px){.action.format[data-v-bd2acf72]{width:116%}}@media screen and (max-width: 500px){.action.format[data-v-bd2acf72]{width:100%}}.action .action-footer button[data-v-3a7479d2]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}.app-container[data-v-3a7479d2]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-3a7479d2]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-3a7479d2]{color:#f9ad1e}.notice_info li[data-v-3a7479d2]{font-size:14px;list-style:revert}.text-container[data-v-3a7479d2]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-3a7479d2]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-3a7479d2]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-3a7479d2]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-3a7479d2]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-3a7479d2]{width:100%}.text-container .text-container_item p.info-desc[data-v-3a7479d2]{width:100%;color:#999;font-size:14px}.page-container[data-v-3a7479d2]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-3a7479d2]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-3a7479d2]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-3a7479d2]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-3a7479d2],.page-container .page-flex .page-sidebar a[data-v-3a7479d2]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-3a7479d2]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-3a7479d2]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-3a7479d2]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-3a7479d2]{border-radius:0;padding:1rem}ul.ul-container[data-v-3a7479d2]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-3a7479d2]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-3a7479d2]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-3a7479d2]{width:100%}form.form-container[data-v-3a7479d2]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-3a7479d2]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-3a7479d2]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-3a7479d2]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-3a7479d2]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-3a7479d2],form.form-container .label-value select[data-v-3a7479d2]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-3a7479d2]:focus,form.form-container .label-value select[data-v-3a7479d2]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-3a7479d2]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-3a7479d2]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-3a7479d2],form.form-container .label-value input[type=radio][data-v-3a7479d2]{width:auto}form.form-container .label-value input[type=radio][data-v-3a7479d2]{margin:0 4px 0 0}form.form-container .label-value input[data-v-3a7479d2]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-3a7479d2]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-3a7479d2]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-3a7479d2]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-3a7479d2]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-3a7479d2]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-3a7479d2]:hover{background-color:#747474}form.form-container .label-msg[data-v-3a7479d2]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-3a7479d2]{color:#f9ad1e}form.form-container .label-flex[data-v-3a7479d2]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-3a7479d2]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-3a7479d2]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-3a7479d2]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-3a7479d2]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-3a7479d2]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-3a7479d2]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-3a7479d2],form.form-container1 .label-value select[data-v-3a7479d2]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-3a7479d2]:focus,form.form-container1 .label-value select[data-v-3a7479d2]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-3a7479d2]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-3a7479d2],form.form-container1 .label-value input[type=radio][data-v-3a7479d2]{width:auto}form.form-container1 .label-value input[type=radio][data-v-3a7479d2]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-3a7479d2]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-3a7479d2]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-3a7479d2]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-3a7479d2]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-3a7479d2]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-3a7479d2]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-3a7479d2]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-3a7479d2]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-3a7479d2]{color:#f9ad1e}form.form-container1 .label-flex[data-v-3a7479d2]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-3a7479d2]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-3a7479d2]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-3a7479d2]{width:100px}table.page-table th.checkbox[data-v-3a7479d2]{width:50px;text-align:center}table.page-table th.setting[data-v-3a7479d2]{width:100px;text-align:center}table.page-table thead[data-v-3a7479d2]{color:#909399}table.page-table thead tr[data-v-3a7479d2]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-3a7479d2]{padding:10px 16px}table.page-table tbody tr[data-v-3a7479d2]:hover{background-color:#eeee}table.page-table tbody tr[data-v-3a7479d2]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-3a7479d2]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-3a7479d2]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-3a7479d2]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-3a7479d2]{width:100px}table.popups-table th.checkbox[data-v-3a7479d2]{width:50px;text-align:center}table.popups-table th.setting[data-v-3a7479d2]{width:100px;text-align:center}table.popups-table thead[data-v-3a7479d2]{color:#eee}table.popups-table thead tr[data-v-3a7479d2]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-3a7479d2]{padding:10px 16px}table.popups-table tbody tr[data-v-3a7479d2]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-3a7479d2]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-3a7479d2]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-3a7479d2]{width:100%}header.header-desktop[data-v-3a7479d2]{display:block}header.header-mobile[data-v-3a7479d2]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-3a7479d2]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-3a7479d2]{width:100%;height:100%}header.header-mobile button svg path[data-v-3a7479d2]{fill:#fff}nav.sidebar[data-v-3a7479d2]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-3a7479d2]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-3a7479d2]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-3a7479d2]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-3a7479d2]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-3a7479d2]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-3a7479d2]{color:#fff}nav.sidebar .container .children[data-v-3a7479d2]{padding-left:30px}@-moz-keyframes tada-3a7479d2{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-3a7479d2{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-3a7479d2{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-3a7479d2{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-3a7479d2]{animation:dialogEnter-3a7479d2 .3s linear forwards}.dialog-leave-active[data-v-3a7479d2]{animation:dialogLeave-3a7479d2 .3s linear forwards}@keyframes dialogEnter-3a7479d2{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-3a7479d2{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-3a7479d2]{animation:dialogEnter-3a7479d2 .2s linear forwards}.dialog1-leave-active[data-v-3a7479d2]{animation:dialogLeave-3a7479d2 .2s linear forwards}@keyframes rotateEnter-3a7479d2{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-3a7479d2]{animation:rotateEnter-3a7479d2 .7s;position:relative}.rotate-leave-active[data-v-3a7479d2]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-3a7479d2{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-3a7479d2{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-3a7479d2]{animation:slideOutTop-3a7479d2 .5s linear forwards}.slide-top-leave-active[data-v-3a7479d2],.slide-bottom-enter-active[data-v-3a7479d2]{animation:slideOutBottom-3a7479d2 .5s linear forwards}@keyframes slideInLeft-3a7479d2{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-3a7479d2{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-3a7479d2]{animation:slideInLeft-3a7479d2 .3s linear forwards}.slide-left-leave-active[data-v-3a7479d2]{animation:slideInRight-3a7479d2 .3s linear forwards}@keyframes slideOutLeft-3a7479d2{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-3a7479d2{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-3a7479d2]{animation:slideOutLeft-3a7479d2 .3s linear forwards}.slide-right-leave-active[data-v-3a7479d2]{animation:slideOutRight-3a7479d2 .3s linear forwards}@keyframes bganimation-3a7479d2{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-3a7479d2{0%{height:0}to{height:100px}}@keyframes fadeEnd-3a7479d2{0%{height:100%}to{height:0}}.fade-enter-active[data-v-3a7479d2]{animation:fadeStart-3a7479d2 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-3a7479d2]{animation:fadeEnd-3a7479d2 .1s linear forwards;overflow:hidden}.action.format[data-v-3a7479d2]{width:700px;height:560px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;overflow:auto;padding:0 25px;border:1px solid #dfdfdf;border-radius:4px;background:#fff;box-shadow:0 1px 4px #0000004d}.action.format .action-header[data-v-3a7479d2]{width:100%;height:70px;line-height:70px}.action.format .action-header .action-header_title[data-v-3a7479d2]{margin:0;color:#333;font:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-moz-user-select:none;-webkit-user-select:none;user-select:none;font-size:20px}.action.format .action-body[data-v-3a7479d2]{width:100%;height:calc(100% - 140px);overflow:auto}.action.format .action-footer[data-v-3a7479d2]{width:100%;height:70px;line-height:70px;color:#333;display:flex;flex-wrap:wrap;align-items:center}.action.format .action-footer .auto[data-v-3a7479d2]{flex:auto}.action.format .disk-list[data-v-3a7479d2]{width:100%;height:100%;border:1px solid #dfe1e5;overflow:auto}.action.format .label-item[data-v-3a7479d2]{width:100%;margin:1rem 0}.action.format .label-item .label-item_key[data-v-3a7479d2]{width:100%;font-size:16px;color:#666}.action.format .label-item .label-item_key span[data-v-3a7479d2]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.action.format .label-item .label-item_key span[data-v-3a7479d2]:before{content:\"*\";color:#f56c6c;margin-right:4px}.action.format .label-item .label-item_value[data-v-3a7479d2]{width:100%;margin-top:5px}.action.format .label-item .label-item_value select[data-v-3a7479d2],.action.format .label-item .label-item_value input[data-v-3a7479d2]{width:100%;height:36px}.action.format .label-item .label-item_path[data-v-3a7479d2]{padding:0 14px;background-color:#e5e5e5;width:100%;height:28px;line-height:28px;margin-top:10px}.action.format .auto[data-v-3a7479d2]{flex:auto}.action.format p.msg[data-v-3a7479d2]{margin:.5rem 0;color:red}.action.format .disk-info[data-v-3a7479d2]{width:100%;text-align:center}.action.format .disk-info .disk-info_icon[data-v-3a7479d2]{width:100px;height:100px;margin:0 auto}.action.format .disk-info .disk-info_icon svg[data-v-3a7479d2]{width:100%;height:100%}.action.format .disk-info .disk-info_mount-name[data-v-3a7479d2]{margin:1rem 0;font-size:1.5em;color:#333}@keyframes turns-3a7479d2{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-3a7479d2]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-3a7479d2]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-3a7479d2]{color:#f9ad1e}.notice_info li[data-v-3a7479d2]{font-size:14px;list-style:revert}.text-container[data-v-3a7479d2]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-3a7479d2]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-3a7479d2]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-3a7479d2]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-3a7479d2]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-3a7479d2]{width:100%}.text-container .text-container_item p.info-desc[data-v-3a7479d2]{width:100%;color:#999;font-size:14px}.page-container[data-v-3a7479d2]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-3a7479d2]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-3a7479d2]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-3a7479d2]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-3a7479d2],.page-container .page-flex .page-sidebar a[data-v-3a7479d2]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-3a7479d2]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-3a7479d2]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-3a7479d2]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-3a7479d2]{border-radius:0;padding:1rem}ul.ul-container[data-v-3a7479d2]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-3a7479d2]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-3a7479d2]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-3a7479d2]{width:100%}form.form-container[data-v-3a7479d2]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-3a7479d2]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-3a7479d2]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-3a7479d2]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-3a7479d2]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-3a7479d2],form.form-container .label-value select[data-v-3a7479d2]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-3a7479d2]:focus,form.form-container .label-value select[data-v-3a7479d2]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-3a7479d2]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-3a7479d2]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-3a7479d2],form.form-container .label-value input[type=radio][data-v-3a7479d2]{width:auto}form.form-container .label-value input[type=radio][data-v-3a7479d2]{margin:0 4px 0 0}form.form-container .label-value input[data-v-3a7479d2]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-3a7479d2]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-3a7479d2]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-3a7479d2]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-3a7479d2]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-3a7479d2]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-3a7479d2]:hover{background-color:#747474}form.form-container .label-msg[data-v-3a7479d2]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-3a7479d2]{color:#f9ad1e}form.form-container .label-flex[data-v-3a7479d2]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-3a7479d2]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-3a7479d2]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-3a7479d2]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-3a7479d2]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-3a7479d2]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-3a7479d2]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-3a7479d2],form.form-container1 .label-value select[data-v-3a7479d2]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-3a7479d2]:focus,form.form-container1 .label-value select[data-v-3a7479d2]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-3a7479d2]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-3a7479d2],form.form-container1 .label-value input[type=radio][data-v-3a7479d2]{width:auto}form.form-container1 .label-value input[type=radio][data-v-3a7479d2]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-3a7479d2]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-3a7479d2]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-3a7479d2]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-3a7479d2]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-3a7479d2]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-3a7479d2]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-3a7479d2]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-3a7479d2]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-3a7479d2]{color:#f9ad1e}form.form-container1 .label-flex[data-v-3a7479d2]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-3a7479d2]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-3a7479d2]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-3a7479d2]{width:100px}table.page-table th.checkbox[data-v-3a7479d2]{width:50px;text-align:center}table.page-table th.setting[data-v-3a7479d2]{width:100px;text-align:center}table.page-table thead[data-v-3a7479d2]{color:#909399}table.page-table thead tr[data-v-3a7479d2]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-3a7479d2]{padding:10px 16px}table.page-table tbody tr[data-v-3a7479d2]:hover{background-color:#eeee}table.page-table tbody tr[data-v-3a7479d2]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-3a7479d2]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-3a7479d2]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-3a7479d2]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-3a7479d2]{width:100px}table.popups-table th.checkbox[data-v-3a7479d2]{width:50px;text-align:center}table.popups-table th.setting[data-v-3a7479d2]{width:100px;text-align:center}table.popups-table thead[data-v-3a7479d2]{color:#eee}table.popups-table thead tr[data-v-3a7479d2]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-3a7479d2]{padding:10px 16px}table.popups-table tbody tr[data-v-3a7479d2]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-3a7479d2]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-3a7479d2]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-3a7479d2]{width:100%}header.header-desktop[data-v-3a7479d2]{display:block}header.header-mobile[data-v-3a7479d2]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-3a7479d2]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-3a7479d2]{width:100%;height:100%}header.header-mobile button svg path[data-v-3a7479d2]{fill:#fff}nav.sidebar[data-v-3a7479d2]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-3a7479d2]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-3a7479d2]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-3a7479d2]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-3a7479d2]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-3a7479d2]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-3a7479d2]{color:#fff}nav.sidebar .container .children[data-v-3a7479d2]{padding-left:30px}@-moz-keyframes tada-3a7479d2{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-3a7479d2{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-3a7479d2{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-3a7479d2{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-3a7479d2]{animation:dialogEnter-3a7479d2 .3s linear forwards}.dialog-leave-active[data-v-3a7479d2]{animation:dialogLeave-3a7479d2 .3s linear forwards}@keyframes dialogEnter-3a7479d2{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-3a7479d2{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-3a7479d2]{animation:dialogEnter-3a7479d2 .2s linear forwards}.dialog1-leave-active[data-v-3a7479d2]{animation:dialogLeave-3a7479d2 .2s linear forwards}@keyframes rotateEnter-3a7479d2{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-3a7479d2]{animation:rotateEnter-3a7479d2 .7s;position:relative}.rotate-leave-active[data-v-3a7479d2]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-3a7479d2{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-3a7479d2{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-3a7479d2]{animation:slideOutTop-3a7479d2 .5s linear forwards}.slide-top-leave-active[data-v-3a7479d2],.slide-bottom-enter-active[data-v-3a7479d2]{animation:slideOutBottom-3a7479d2 .5s linear forwards}@keyframes slideInLeft-3a7479d2{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-3a7479d2{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-3a7479d2]{animation:slideInLeft-3a7479d2 .3s linear forwards}.slide-left-leave-active[data-v-3a7479d2]{animation:slideInRight-3a7479d2 .3s linear forwards}@keyframes slideOutLeft-3a7479d2{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-3a7479d2{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-3a7479d2]{animation:slideOutLeft-3a7479d2 .3s linear forwards}.slide-right-leave-active[data-v-3a7479d2]{animation:slideOutRight-3a7479d2 .3s linear forwards}@keyframes bganimation-3a7479d2{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-3a7479d2{0%{height:0}to{height:100px}}@keyframes fadeEnd-3a7479d2{0%{height:100%}to{height:0}}.fade-enter-active[data-v-3a7479d2]{animation:fadeStart-3a7479d2 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-3a7479d2]{animation:fadeEnd-3a7479d2 .1s linear forwards;overflow:hidden}.action.result[data-v-3a7479d2]{width:700px;height:560px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;overflow:auto;padding:0 25px;border:1px solid #dfdfdf;border-radius:4px;background:#fff;box-shadow:0 1px 4px #0000004d}.action.result .action-body[data-v-3a7479d2]{width:100%;height:100%;display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center}.action.result .action-body .action-body_icon[data-v-3a7479d2]{width:100px;height:100px}.action.result .action-body .action-body_icon svg.icon[data-v-3a7479d2]{width:100%;height:100%}.action.result .action-body .action-body_msg[data-v-3a7479d2]{font-size:2em;color:#666;text-align:center;width:100%;margin:1rem 0}.action.result .action-body .action-body_info[data-v-3a7479d2]{margin:1rem 0;width:100%;text-align:center;color:#666;font-size:1.2em}.action.result .action-body .action-body_info a[data-v-3a7479d2]{color:#0000fb}.action.result .btns[data-v-3a7479d2]{width:100%;text-align:center;margin:1rem 0}@keyframes turns-733828e1{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.app-container[data-v-733828e1]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-733828e1]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-733828e1]{color:#f9ad1e}.notice_info li[data-v-733828e1]{font-size:14px;list-style:revert}.text-container[data-v-733828e1]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-733828e1]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-733828e1]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-733828e1]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-733828e1]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-733828e1]{width:100%}.text-container .text-container_item p.info-desc[data-v-733828e1]{width:100%;color:#999;font-size:14px}.page-container[data-v-733828e1]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-733828e1]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-733828e1]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-733828e1]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-733828e1],.page-container .page-flex .page-sidebar a[data-v-733828e1]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-733828e1]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-733828e1]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-733828e1]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-733828e1]{border-radius:0;padding:1rem}ul.ul-container[data-v-733828e1]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-733828e1]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-733828e1]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-733828e1]{width:100%}form.form-container[data-v-733828e1]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-733828e1]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-733828e1]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-733828e1]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-733828e1]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-733828e1],form.form-container .label-value select[data-v-733828e1]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-733828e1]:focus,form.form-container .label-value select[data-v-733828e1]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-733828e1]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-733828e1]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-733828e1],form.form-container .label-value input[type=radio][data-v-733828e1]{width:auto}form.form-container .label-value input[type=radio][data-v-733828e1]{margin:0 4px 0 0}form.form-container .label-value input[data-v-733828e1]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-733828e1]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-733828e1]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-733828e1]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-733828e1]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-733828e1]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-733828e1]:hover{background-color:#747474}form.form-container .label-msg[data-v-733828e1]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-733828e1]{color:#f9ad1e}form.form-container .label-flex[data-v-733828e1]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-733828e1]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-733828e1]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-733828e1]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-733828e1]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-733828e1]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-733828e1]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-733828e1],form.form-container1 .label-value select[data-v-733828e1]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-733828e1]:focus,form.form-container1 .label-value select[data-v-733828e1]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-733828e1]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-733828e1],form.form-container1 .label-value input[type=radio][data-v-733828e1]{width:auto}form.form-container1 .label-value input[type=radio][data-v-733828e1]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-733828e1]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-733828e1]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-733828e1]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-733828e1]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-733828e1]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-733828e1]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-733828e1]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-733828e1]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-733828e1]{color:#f9ad1e}form.form-container1 .label-flex[data-v-733828e1]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-733828e1]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-733828e1]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-733828e1]{width:100px}table.page-table th.checkbox[data-v-733828e1]{width:50px;text-align:center}table.page-table th.setting[data-v-733828e1]{width:100px;text-align:center}table.page-table thead[data-v-733828e1]{color:#909399}table.page-table thead tr[data-v-733828e1]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-733828e1]{padding:10px 16px}table.page-table tbody tr[data-v-733828e1]:hover{background-color:#eeee}table.page-table tbody tr[data-v-733828e1]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-733828e1]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-733828e1]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-733828e1]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-733828e1]{width:100px}table.popups-table th.checkbox[data-v-733828e1]{width:50px;text-align:center}table.popups-table th.setting[data-v-733828e1]{width:100px;text-align:center}table.popups-table thead[data-v-733828e1]{color:#eee}table.popups-table thead tr[data-v-733828e1]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-733828e1]{padding:10px 16px}table.popups-table tbody tr[data-v-733828e1]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-733828e1]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-733828e1]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-733828e1]{width:100%}header.header-desktop[data-v-733828e1]{display:block}header.header-mobile[data-v-733828e1]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-733828e1]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-733828e1]{width:100%;height:100%}header.header-mobile button svg path[data-v-733828e1]{fill:#fff}nav.sidebar[data-v-733828e1]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-733828e1]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-733828e1]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-733828e1]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-733828e1]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-733828e1]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-733828e1]{color:#fff}nav.sidebar .container .children[data-v-733828e1]{padding-left:30px}@-moz-keyframes tada-733828e1{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-733828e1{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-733828e1{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-733828e1{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-733828e1]{animation:dialogEnter-733828e1 .3s linear forwards}.dialog-leave-active[data-v-733828e1]{animation:dialogLeave-733828e1 .3s linear forwards}@keyframes dialogEnter-733828e1{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-733828e1{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-733828e1]{animation:dialogEnter-733828e1 .2s linear forwards}.dialog1-leave-active[data-v-733828e1]{animation:dialogLeave-733828e1 .2s linear forwards}@keyframes rotateEnter-733828e1{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-733828e1]{animation:rotateEnter-733828e1 .7s;position:relative}.rotate-leave-active[data-v-733828e1]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-733828e1{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-733828e1{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-733828e1]{animation:slideOutTop-733828e1 .5s linear forwards}.slide-top-leave-active[data-v-733828e1],.slide-bottom-enter-active[data-v-733828e1]{animation:slideOutBottom-733828e1 .5s linear forwards}@keyframes slideInLeft-733828e1{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-733828e1{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-733828e1]{animation:slideInLeft-733828e1 .3s linear forwards}.slide-left-leave-active[data-v-733828e1]{animation:slideInRight-733828e1 .3s linear forwards}@keyframes slideOutLeft-733828e1{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-733828e1{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-733828e1]{animation:slideOutLeft-733828e1 .3s linear forwards}.slide-right-leave-active[data-v-733828e1]{animation:slideOutRight-733828e1 .3s linear forwards}@keyframes bganimation-733828e1{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-733828e1{0%{height:0}to{height:100px}}@keyframes fadeEnd-733828e1{0%{height:100%}to{height:0}}.fade-enter-active[data-v-733828e1]{animation:fadeStart-733828e1 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-733828e1]{animation:fadeEnd-733828e1 .1s linear forwards;overflow:hidden}.progress[data-v-733828e1]{width:100%;display:block;position:relative;background-color:#eee;border-radius:4px;height:18px;line-height:18px;overflow:hidden}.progress .progress-value[data-v-733828e1]{transition:.5s;position:absolute;left:0;top:0;bottom:0;height:100%;text-align:center;color:#fff;vertical-align:middle;font-size:12px}@keyframes bganimation-4b3c5909{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-4b3c5909{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-4b3c5909{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-4b3c5909{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-4b3c5909{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-4b3c5909]{animation:slideInLeft-4b3c5909 .3s linear forwards}.slide-left-leave-active[data-v-4b3c5909]{animation:slideInRight-4b3c5909 .3s linear forwards}@keyframes slideOutLeft-4b3c5909{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-4b3c5909{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-4b3c5909]{animation:slideOutLeft-4b3c5909 .3s linear forwards}.slide-right-leave-active[data-v-4b3c5909]{animation:slideOutRight-4b3c5909 .3s linear forwards}.app-container[data-v-4b3c5909]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-4b3c5909]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-4b3c5909]{color:#f9ad1e}.notice_info li[data-v-4b3c5909]{font-size:14px;list-style:revert}.text-container[data-v-4b3c5909]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-4b3c5909]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-4b3c5909]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-4b3c5909]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-4b3c5909]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-4b3c5909]{width:100%}.text-container .text-container_item p.info-desc[data-v-4b3c5909]{width:100%;color:#999;font-size:14px}.page-container[data-v-4b3c5909]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-4b3c5909]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-4b3c5909]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-4b3c5909]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-4b3c5909],.page-container .page-flex .page-sidebar a[data-v-4b3c5909]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-4b3c5909]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-4b3c5909]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-4b3c5909]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-4b3c5909]{border-radius:0;padding:1rem}ul.ul-container[data-v-4b3c5909]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-4b3c5909]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-4b3c5909]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-4b3c5909]{width:100%}form.form-container[data-v-4b3c5909]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-4b3c5909]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-4b3c5909]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-4b3c5909]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-4b3c5909]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-4b3c5909],form.form-container .label-value select[data-v-4b3c5909]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-4b3c5909]:focus,form.form-container .label-value select[data-v-4b3c5909]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-4b3c5909]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-4b3c5909]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-4b3c5909],form.form-container .label-value input[type=radio][data-v-4b3c5909]{width:auto}form.form-container .label-value input[type=radio][data-v-4b3c5909]{margin:0 4px 0 0}form.form-container .label-value input[data-v-4b3c5909]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-4b3c5909]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-4b3c5909]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-4b3c5909]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-4b3c5909]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-4b3c5909]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-4b3c5909]:hover{background-color:#747474}form.form-container .label-msg[data-v-4b3c5909]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-4b3c5909]{color:#f9ad1e}form.form-container .label-flex[data-v-4b3c5909]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-4b3c5909]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-4b3c5909]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-4b3c5909]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-4b3c5909]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-4b3c5909]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-4b3c5909]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-4b3c5909],form.form-container1 .label-value select[data-v-4b3c5909]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-4b3c5909]:focus,form.form-container1 .label-value select[data-v-4b3c5909]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-4b3c5909]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-4b3c5909],form.form-container1 .label-value input[type=radio][data-v-4b3c5909]{width:auto}form.form-container1 .label-value input[type=radio][data-v-4b3c5909]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-4b3c5909]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-4b3c5909]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-4b3c5909]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-4b3c5909]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-4b3c5909]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-4b3c5909]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-4b3c5909]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-4b3c5909]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-4b3c5909]{color:#f9ad1e}form.form-container1 .label-flex[data-v-4b3c5909]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-4b3c5909]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-4b3c5909]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-4b3c5909]{width:100px}table.page-table th.checkbox[data-v-4b3c5909]{width:50px;text-align:center}table.page-table th.setting[data-v-4b3c5909]{width:100px;text-align:center}table.page-table thead[data-v-4b3c5909]{color:#909399}table.page-table thead tr[data-v-4b3c5909]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-4b3c5909]{padding:10px 16px}table.page-table tbody tr[data-v-4b3c5909]:hover{background-color:#eeee}table.page-table tbody tr[data-v-4b3c5909]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-4b3c5909]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-4b3c5909]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-4b3c5909]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-4b3c5909]{width:100px}table.popups-table th.checkbox[data-v-4b3c5909]{width:50px;text-align:center}table.popups-table th.setting[data-v-4b3c5909]{width:100px;text-align:center}table.popups-table thead[data-v-4b3c5909]{color:#eee}table.popups-table thead tr[data-v-4b3c5909]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-4b3c5909]{padding:10px 16px}table.popups-table tbody tr[data-v-4b3c5909]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-4b3c5909]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-4b3c5909]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-4b3c5909]{width:100%}header.header-desktop[data-v-4b3c5909]{display:block}header.header-mobile[data-v-4b3c5909]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-4b3c5909]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-4b3c5909]{width:100%;height:100%}header.header-mobile button svg path[data-v-4b3c5909]{fill:#fff}nav.sidebar[data-v-4b3c5909]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-4b3c5909]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-4b3c5909]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-4b3c5909]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-4b3c5909]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-4b3c5909]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-4b3c5909]{color:#fff}nav.sidebar .container .children[data-v-4b3c5909]{padding-left:30px}@-moz-keyframes tada-4b3c5909{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-4b3c5909{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-4b3c5909{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-4b3c5909{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-4b3c5909]{animation:dialogEnter-4b3c5909 .3s linear forwards}.dialog-leave-active[data-v-4b3c5909]{animation:dialogLeave-4b3c5909 .3s linear forwards}@keyframes dialogEnter-4b3c5909{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-4b3c5909{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-4b3c5909]{animation:dialogEnter-4b3c5909 .2s linear forwards}.dialog1-leave-active[data-v-4b3c5909]{animation:dialogLeave-4b3c5909 .2s linear forwards}.rotate-enter-active[data-v-4b3c5909]{animation:rotateEnter-4b3c5909 .7s;position:relative}.rotate-leave-active[data-v-4b3c5909]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-4b3c5909{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-4b3c5909{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-4b3c5909]{animation:slideOutTop-4b3c5909 .5s linear forwards}.slide-top-leave-active[data-v-4b3c5909],.slide-bottom-enter-active[data-v-4b3c5909]{animation:slideOutBottom-4b3c5909 .5s linear forwards}@keyframes fadeStart-4b3c5909{0%{height:0}to{height:100px}}@keyframes fadeEnd-4b3c5909{0%{height:100%}to{height:0}}.fade-enter-active[data-v-4b3c5909]{animation:fadeStart-4b3c5909 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-4b3c5909]{animation:fadeEnd-4b3c5909 .1s linear forwards;overflow:hidden}li.disk-item.error[data-v-4b3c5909]{color:red}.disk-content[data-v-4b3c5909]{padding:1rem;border:1px solid #cfcfcf;margin:16px 0}.disk-content li.disk-item[data-v-4b3c5909]{width:100%;display:flex;align-items:center}.disk-content li.disk-item .disk-item_name[data-v-4b3c5909]{flex:0 0 50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:10px}.disk-content li.disk-item .disk_value[data-v-4b3c5909]{flex:0 0 50%;display:flex;justify-content:space-between;align-items:center}.disk-content li.disk-item .disk_value .cbi-button[data-v-4b3c5909]{margin-left:10px}.disk-content li.disk-item .disk_value .disk-item_value[data-v-4b3c5909]{flex:auto;padding-left:10px;position:relative}.disk-content li.disk-item .disk_value .disk-item_value .value-data[data-v-4b3c5909]{width:100%;text-overflow:ellipsis;white-space:nowrap;height:100%;color:#297ff3;cursor:default}.disk-content li.disk-item .disk_value .disk-item_value .value-data button[data-v-4b3c5909]{background:none;border:none;width:100%;text-align:right;color:#297ff3;cursor:pointer}.disk-content li.disk-item .disk_value .disk-item_value .value-data button[data-v-4b3c5909]:hover{opacity:.7}.disk-content li.disk-item .disk_value .disk-item_value .value-data.buttondiv[data-v-4b3c5909]{cursor:pointer}.disk-content li.disk-item .disk_value .disk-item_value .disk-item-tooltip[data-v-4b3c5909]{position:absolute;background:rgba(0,0,0,.7);z-index:10111;color:#fff;padding:.5rem 1rem;left:10px;right:0;bottom:100%;margin-bottom:6px;text-align:center;font-size:1em;visibility:hidden;opacity:0}.disk-content li.disk-item .disk_value .disk-item_value .disk-item-tooltip[data-v-4b3c5909]:after{content:\"\";position:absolute;bottom:-6px;border-color:#4c4c4c rgba(0,0,0,0) rgba(0,0,0,0);left:0;right:0;text-align:center;width:0;margin:0 auto;border-width:6px 8px 0;border-style:solid}.disk-content li.disk-item .disk_value .disk-item_value:hover .disk-item-tooltip[data-v-4b3c5909]{visibility:visible;transition:.7s;opacity:1}.disk-content .disk_status[data-v-4b3c5909]{display:flex;text-align:left;padding-left:10px;font-size:12px;padding-top:6px}.disk-content .disk_status .disk_status_item[data-v-4b3c5909]{display:flex;margin-right:20px}.disk-content .disk_status .disk_status_item .disk_tip[data-v-4b3c5909]{display:flex;align-items:center}.disk_infoicon[data-v-4b3c5909]{margin-left:10px;cursor:pointer}.tooltip-trigger[data-v-4b3c5909]{flex:none}.tooltip-trigger[data-v-4b3c5909]{position:relative;display:inline-block;cursor:help;margin-right:6px;margin-left:10px}.tooltip-trigger .tooltip-text[data-v-4b3c5909]{visibility:hidden;position:absolute;padding:.5rem 1rem;background-color:#555;color:#fff;text-align:center;border-radius:6px;opacity:0;transition:opacity .6s}.tooltip-trigger .tooltip-text span[data-v-4b3c5909]{color:#fff}.tooltip-trigger .tooltip-text .disk_dir_tip[data-v-4b3c5909]{min-width:15rem;display:inline-block}.tooltip-trigger:hover .tooltip-text[data-v-4b3c5909]{visibility:visible;opacity:1}.tooltip-top[data-v-4b3c5909]{bottom:100%;left:50%;margin-bottom:5px;transform:translate(-50%)}.tooltip-top[data-v-4b3c5909]:after{content:\"\";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:#555 transparent transparent transparent}.tooltip-bottom[data-v-4b3c5909]:after{content:\"\";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:transparent transparent #555 transparent}@keyframes bganimation-4b3c5909{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-4b3c5909{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-4b3c5909{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-4b3c5909{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-4b3c5909{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-4b3c5909]{animation:slideInLeft-4b3c5909 .3s linear forwards}.slide-left-leave-active[data-v-4b3c5909]{animation:slideInRight-4b3c5909 .3s linear forwards}@keyframes slideOutLeft-4b3c5909{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-4b3c5909{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-4b3c5909]{animation:slideOutLeft-4b3c5909 .3s linear forwards}.slide-right-leave-active[data-v-4b3c5909]{animation:slideOutRight-4b3c5909 .3s linear forwards}.app-container[data-v-4b3c5909]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-4b3c5909]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-4b3c5909]{color:#f9ad1e}.notice_info li[data-v-4b3c5909]{font-size:14px;list-style:revert}.text-container[data-v-4b3c5909]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-4b3c5909]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-4b3c5909]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-4b3c5909]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-4b3c5909]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-4b3c5909]{width:100%}.text-container .text-container_item p.info-desc[data-v-4b3c5909]{width:100%;color:#999;font-size:14px}.page-container[data-v-4b3c5909]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-4b3c5909]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-4b3c5909]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-4b3c5909]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-4b3c5909],.page-container .page-flex .page-sidebar a[data-v-4b3c5909]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-4b3c5909]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-4b3c5909]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-4b3c5909]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-4b3c5909]{border-radius:0;padding:1rem}ul.ul-container[data-v-4b3c5909]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-4b3c5909]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-4b3c5909]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-4b3c5909]{width:100%}form.form-container[data-v-4b3c5909]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-4b3c5909]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-4b3c5909]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-4b3c5909]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-4b3c5909]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-4b3c5909],form.form-container .label-value select[data-v-4b3c5909]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-4b3c5909]:focus,form.form-container .label-value select[data-v-4b3c5909]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-4b3c5909]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-4b3c5909]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-4b3c5909],form.form-container .label-value input[type=radio][data-v-4b3c5909]{width:auto}form.form-container .label-value input[type=radio][data-v-4b3c5909]{margin:0 4px 0 0}form.form-container .label-value input[data-v-4b3c5909]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-4b3c5909]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-4b3c5909]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-4b3c5909]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-4b3c5909]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-4b3c5909]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-4b3c5909]:hover{background-color:#747474}form.form-container .label-msg[data-v-4b3c5909]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-4b3c5909]{color:#f9ad1e}form.form-container .label-flex[data-v-4b3c5909]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-4b3c5909]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-4b3c5909]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-4b3c5909]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-4b3c5909]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-4b3c5909]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-4b3c5909]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-4b3c5909],form.form-container1 .label-value select[data-v-4b3c5909]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-4b3c5909]:focus,form.form-container1 .label-value select[data-v-4b3c5909]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-4b3c5909]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-4b3c5909],form.form-container1 .label-value input[type=radio][data-v-4b3c5909]{width:auto}form.form-container1 .label-value input[type=radio][data-v-4b3c5909]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-4b3c5909]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-4b3c5909]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-4b3c5909]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-4b3c5909]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-4b3c5909]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-4b3c5909]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-4b3c5909]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-4b3c5909]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-4b3c5909]{color:#f9ad1e}form.form-container1 .label-flex[data-v-4b3c5909]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-4b3c5909]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-4b3c5909]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-4b3c5909]{width:100px}table.page-table th.checkbox[data-v-4b3c5909]{width:50px;text-align:center}table.page-table th.setting[data-v-4b3c5909]{width:100px;text-align:center}table.page-table thead[data-v-4b3c5909]{color:#909399}table.page-table thead tr[data-v-4b3c5909]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-4b3c5909]{padding:10px 16px}table.page-table tbody tr[data-v-4b3c5909]:hover{background-color:#eeee}table.page-table tbody tr[data-v-4b3c5909]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-4b3c5909]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-4b3c5909]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-4b3c5909]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-4b3c5909]{width:100px}table.popups-table th.checkbox[data-v-4b3c5909]{width:50px;text-align:center}table.popups-table th.setting[data-v-4b3c5909]{width:100px;text-align:center}table.popups-table thead[data-v-4b3c5909]{color:#eee}table.popups-table thead tr[data-v-4b3c5909]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-4b3c5909]{padding:10px 16px}table.popups-table tbody tr[data-v-4b3c5909]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-4b3c5909]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-4b3c5909]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-4b3c5909]{width:100%}header.header-desktop[data-v-4b3c5909]{display:block}header.header-mobile[data-v-4b3c5909]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-4b3c5909]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-4b3c5909]{width:100%;height:100%}header.header-mobile button svg path[data-v-4b3c5909]{fill:#fff}nav.sidebar[data-v-4b3c5909]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-4b3c5909]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-4b3c5909]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-4b3c5909]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-4b3c5909]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-4b3c5909]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-4b3c5909]{color:#fff}nav.sidebar .container .children[data-v-4b3c5909]{padding-left:30px}@-moz-keyframes tada-4b3c5909{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-4b3c5909{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-4b3c5909{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-4b3c5909{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-4b3c5909]{animation:dialogEnter-4b3c5909 .3s linear forwards}.dialog-leave-active[data-v-4b3c5909]{animation:dialogLeave-4b3c5909 .3s linear forwards}@keyframes dialogEnter-4b3c5909{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-4b3c5909{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-4b3c5909]{animation:dialogEnter-4b3c5909 .2s linear forwards}.dialog1-leave-active[data-v-4b3c5909]{animation:dialogLeave-4b3c5909 .2s linear forwards}@keyframes rotateEnter-4b3c5909{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-4b3c5909]{animation:rotateEnter-4b3c5909 .7s;position:relative}.rotate-leave-active[data-v-4b3c5909]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-4b3c5909{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-4b3c5909{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-4b3c5909]{animation:slideOutTop-4b3c5909 .5s linear forwards}.slide-top-leave-active[data-v-4b3c5909],.slide-bottom-enter-active[data-v-4b3c5909]{animation:slideOutBottom-4b3c5909 .5s linear forwards}@keyframes slideInLeft-4b3c5909{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-4b3c5909{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-4b3c5909]{animation:slideInLeft-4b3c5909 .3s linear forwards}.slide-left-leave-active[data-v-4b3c5909]{animation:slideInRight-4b3c5909 .3s linear forwards}@keyframes slideOutLeft-4b3c5909{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-4b3c5909{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-4b3c5909]{animation:slideOutLeft-4b3c5909 .3s linear forwards}.slide-right-leave-active[data-v-4b3c5909]{animation:slideOutRight-4b3c5909 .3s linear forwards}@keyframes bganimation-4b3c5909{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-4b3c5909{0%{height:0}to{height:100px}}@keyframes fadeEnd-4b3c5909{0%{height:100%}to{height:0}}.fade-enter-active[data-v-4b3c5909]{animation:fadeStart-4b3c5909 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-4b3c5909]{animation:fadeEnd-4b3c5909 .1s linear forwards;overflow:hidden}@media screen and (max-width: 1000px){.disk-content li.disk-item .disk_value[data-v-4b3c5909]{display:block}.disk-content .disk_status[data-v-4b3c5909]{flex-wrap:wrap}}@keyframes bganimation-5f29973e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-5f29973e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-5f29973e{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-5f29973e{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-5f29973e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-5f29973e]{animation:slideInLeft-5f29973e .3s linear forwards}.slide-left-leave-active[data-v-5f29973e]{animation:slideInRight-5f29973e .3s linear forwards}@keyframes slideOutLeft-5f29973e{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-5f29973e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-5f29973e]{animation:slideOutLeft-5f29973e .3s linear forwards}.slide-right-leave-active[data-v-5f29973e]{animation:slideOutRight-5f29973e .3s linear forwards}.rotate-enter-active[data-v-5f29973e]{animation:rotateEnter-5f29973e .7s;position:relative}.rotate-leave-active[data-v-5f29973e]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-5f29973e]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-5f29973e]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-5f29973e]{color:#f9ad1e}.notice_info li[data-v-5f29973e]{font-size:14px;list-style:revert}.text-container[data-v-5f29973e]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-5f29973e]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-5f29973e]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-5f29973e]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-5f29973e]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-5f29973e]{width:100%}.text-container .text-container_item p.info-desc[data-v-5f29973e]{width:100%;color:#999;font-size:14px}.page-container[data-v-5f29973e]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-5f29973e]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-5f29973e]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-5f29973e]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-5f29973e],.page-container .page-flex .page-sidebar a[data-v-5f29973e]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5f29973e]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5f29973e]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-5f29973e]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-5f29973e]{border-radius:0;padding:1rem}ul.ul-container[data-v-5f29973e]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-5f29973e]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-5f29973e]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-5f29973e]{width:100%}form.form-container[data-v-5f29973e]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-5f29973e]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-5f29973e]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-5f29973e]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-5f29973e]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-5f29973e],form.form-container .label-value select[data-v-5f29973e]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-5f29973e]:focus,form.form-container .label-value select[data-v-5f29973e]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-5f29973e]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-5f29973e]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-5f29973e],form.form-container .label-value input[type=radio][data-v-5f29973e]{width:auto}form.form-container .label-value input[type=radio][data-v-5f29973e]{margin:0 4px 0 0}form.form-container .label-value input[data-v-5f29973e]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-5f29973e]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5f29973e]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5f29973e]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-5f29973e]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-5f29973e]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-5f29973e]:hover{background-color:#747474}form.form-container .label-msg[data-v-5f29973e]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-5f29973e]{color:#f9ad1e}form.form-container .label-flex[data-v-5f29973e]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-5f29973e]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-5f29973e]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-5f29973e]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-5f29973e]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-5f29973e]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-5f29973e]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-5f29973e],form.form-container1 .label-value select[data-v-5f29973e]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-5f29973e]:focus,form.form-container1 .label-value select[data-v-5f29973e]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-5f29973e]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-5f29973e],form.form-container1 .label-value input[type=radio][data-v-5f29973e]{width:auto}form.form-container1 .label-value input[type=radio][data-v-5f29973e]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-5f29973e]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-5f29973e]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5f29973e]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5f29973e]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-5f29973e]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-5f29973e]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-5f29973e]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-5f29973e]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-5f29973e]{color:#f9ad1e}form.form-container1 .label-flex[data-v-5f29973e]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-5f29973e]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-5f29973e]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-5f29973e]{width:100px}table.page-table th.checkbox[data-v-5f29973e]{width:50px;text-align:center}table.page-table th.setting[data-v-5f29973e]{width:100px;text-align:center}table.page-table thead[data-v-5f29973e]{color:#909399}table.page-table thead tr[data-v-5f29973e]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-5f29973e]{padding:10px 16px}table.page-table tbody tr[data-v-5f29973e]:hover{background-color:#eeee}table.page-table tbody tr[data-v-5f29973e]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-5f29973e]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-5f29973e]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-5f29973e]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-5f29973e]{width:100px}table.popups-table th.checkbox[data-v-5f29973e]{width:50px;text-align:center}table.popups-table th.setting[data-v-5f29973e]{width:100px;text-align:center}table.popups-table thead[data-v-5f29973e]{color:#eee}table.popups-table thead tr[data-v-5f29973e]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-5f29973e]{padding:10px 16px}table.popups-table tbody tr[data-v-5f29973e]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-5f29973e]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-5f29973e]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-5f29973e]{width:100%}header.header-desktop[data-v-5f29973e]{display:block}header.header-mobile[data-v-5f29973e]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-5f29973e]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-5f29973e]{width:100%;height:100%}header.header-mobile button svg path[data-v-5f29973e]{fill:#fff}nav.sidebar[data-v-5f29973e]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-5f29973e]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-5f29973e]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-5f29973e]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-5f29973e]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-5f29973e]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-5f29973e]{color:#fff}nav.sidebar .container .children[data-v-5f29973e]{padding-left:30px}@-moz-keyframes tada-5f29973e{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-5f29973e{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-5f29973e{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-5f29973e{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-5f29973e]{animation:dialogEnter-5f29973e .3s linear forwards}.dialog-leave-active[data-v-5f29973e]{animation:dialogLeave-5f29973e .3s linear forwards}@keyframes dialogEnter-5f29973e{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-5f29973e{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-5f29973e]{animation:dialogEnter-5f29973e .2s linear forwards}.dialog1-leave-active[data-v-5f29973e]{animation:dialogLeave-5f29973e .2s linear forwards}@keyframes slideOutTop-5f29973e{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-5f29973e{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-5f29973e]{animation:slideOutTop-5f29973e .5s linear forwards}.slide-top-leave-active[data-v-5f29973e],.slide-bottom-enter-active[data-v-5f29973e]{animation:slideOutBottom-5f29973e .5s linear forwards}@keyframes fadeStart-5f29973e{0%{height:0}to{height:100px}}@keyframes fadeEnd-5f29973e{0%{height:100%}to{height:0}}.fade-enter-active[data-v-5f29973e]{animation:fadeStart-5f29973e .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-5f29973e]{animation:fadeEnd-5f29973e .1s linear forwards;overflow:hidden}.action[data-v-5f29973e]{width:860px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;padding:3rem;border-radius:6px;display:flex;flex-direction:column;flex-wrap:nowrap}.action ul[data-v-5f29973e]{overflow:auto}.action ul .app-container_info[data-v-5f29973e]{display:flex;justify-content:space-between;max-width:56%;margin-top:18px;font-weight:600}.action ul .app-container_body[data-v-5f29973e]{width:100%;height:100%}.action .action-footer[data-v-5f29973e]{text-align:center;margin-top:46px}.action .action-footer button[data-v-5f29973e]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}@keyframes bganimation-5f29973e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-5f29973e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-5f29973e{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-5f29973e{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-5f29973e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-5f29973e]{animation:slideInLeft-5f29973e .3s linear forwards}.slide-left-leave-active[data-v-5f29973e]{animation:slideInRight-5f29973e .3s linear forwards}@keyframes slideOutLeft-5f29973e{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-5f29973e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-5f29973e]{animation:slideOutLeft-5f29973e .3s linear forwards}.slide-right-leave-active[data-v-5f29973e]{animation:slideOutRight-5f29973e .3s linear forwards}.rotate-enter-active[data-v-5f29973e]{animation:rotateEnter-5f29973e .7s;position:relative}.rotate-leave-active[data-v-5f29973e]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-5f29973e]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-5f29973e]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-5f29973e]{color:#f9ad1e}.notice_info li[data-v-5f29973e]{font-size:14px;list-style:revert}.text-container[data-v-5f29973e]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-5f29973e]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-5f29973e]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-5f29973e]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-5f29973e]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-5f29973e]{width:100%}.text-container .text-container_item p.info-desc[data-v-5f29973e]{width:100%;color:#999;font-size:14px}.page-container[data-v-5f29973e]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-5f29973e]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-5f29973e]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-5f29973e]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-5f29973e],.page-container .page-flex .page-sidebar a[data-v-5f29973e]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5f29973e]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5f29973e]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-5f29973e]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-5f29973e]{border-radius:0;padding:1rem}ul.ul-container[data-v-5f29973e]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-5f29973e]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-5f29973e]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-5f29973e]{width:100%}form.form-container[data-v-5f29973e]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-5f29973e]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-5f29973e]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-5f29973e]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-5f29973e]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-5f29973e],form.form-container .label-value select[data-v-5f29973e]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-5f29973e]:focus,form.form-container .label-value select[data-v-5f29973e]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-5f29973e]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-5f29973e]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-5f29973e],form.form-container .label-value input[type=radio][data-v-5f29973e]{width:auto}form.form-container .label-value input[type=radio][data-v-5f29973e]{margin:0 4px 0 0}form.form-container .label-value input[data-v-5f29973e]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-5f29973e]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5f29973e]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5f29973e]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-5f29973e]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-5f29973e]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-5f29973e]:hover{background-color:#747474}form.form-container .label-msg[data-v-5f29973e]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-5f29973e]{color:#f9ad1e}form.form-container .label-flex[data-v-5f29973e]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-5f29973e]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-5f29973e]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-5f29973e]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-5f29973e]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-5f29973e]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-5f29973e]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-5f29973e],form.form-container1 .label-value select[data-v-5f29973e]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-5f29973e]:focus,form.form-container1 .label-value select[data-v-5f29973e]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-5f29973e]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-5f29973e],form.form-container1 .label-value input[type=radio][data-v-5f29973e]{width:auto}form.form-container1 .label-value input[type=radio][data-v-5f29973e]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-5f29973e]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-5f29973e]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5f29973e]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5f29973e]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-5f29973e]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-5f29973e]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-5f29973e]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-5f29973e]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-5f29973e]{color:#f9ad1e}form.form-container1 .label-flex[data-v-5f29973e]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-5f29973e]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-5f29973e]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-5f29973e]{width:100px}table.page-table th.checkbox[data-v-5f29973e]{width:50px;text-align:center}table.page-table th.setting[data-v-5f29973e]{width:100px;text-align:center}table.page-table thead[data-v-5f29973e]{color:#909399}table.page-table thead tr[data-v-5f29973e]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-5f29973e]{padding:10px 16px}table.page-table tbody tr[data-v-5f29973e]:hover{background-color:#eeee}table.page-table tbody tr[data-v-5f29973e]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-5f29973e]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-5f29973e]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-5f29973e]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-5f29973e]{width:100px}table.popups-table th.checkbox[data-v-5f29973e]{width:50px;text-align:center}table.popups-table th.setting[data-v-5f29973e]{width:100px;text-align:center}table.popups-table thead[data-v-5f29973e]{color:#eee}table.popups-table thead tr[data-v-5f29973e]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-5f29973e]{padding:10px 16px}table.popups-table tbody tr[data-v-5f29973e]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-5f29973e]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-5f29973e]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-5f29973e]{width:100%}header.header-desktop[data-v-5f29973e]{display:block}header.header-mobile[data-v-5f29973e]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-5f29973e]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-5f29973e]{width:100%;height:100%}header.header-mobile button svg path[data-v-5f29973e]{fill:#fff}nav.sidebar[data-v-5f29973e]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-5f29973e]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-5f29973e]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-5f29973e]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-5f29973e]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-5f29973e]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-5f29973e]{color:#fff}nav.sidebar .container .children[data-v-5f29973e]{padding-left:30px}@-moz-keyframes tada-5f29973e{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-5f29973e{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-5f29973e{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-5f29973e{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-5f29973e]{animation:dialogEnter-5f29973e .3s linear forwards}.dialog-leave-active[data-v-5f29973e]{animation:dialogLeave-5f29973e .3s linear forwards}@keyframes dialogEnter-5f29973e{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-5f29973e{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-5f29973e]{animation:dialogEnter-5f29973e .2s linear forwards}.dialog1-leave-active[data-v-5f29973e]{animation:dialogLeave-5f29973e .2s linear forwards}@keyframes rotateEnter-5f29973e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-5f29973e]{animation:rotateEnter-5f29973e .7s;position:relative}.rotate-leave-active[data-v-5f29973e]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-5f29973e{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-5f29973e{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-5f29973e]{animation:slideOutTop-5f29973e .5s linear forwards}.slide-top-leave-active[data-v-5f29973e],.slide-bottom-enter-active[data-v-5f29973e]{animation:slideOutBottom-5f29973e .5s linear forwards}@keyframes slideInLeft-5f29973e{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-5f29973e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-5f29973e]{animation:slideInLeft-5f29973e .3s linear forwards}.slide-left-leave-active[data-v-5f29973e]{animation:slideInRight-5f29973e .3s linear forwards}@keyframes slideOutLeft-5f29973e{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-5f29973e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-5f29973e]{animation:slideOutLeft-5f29973e .3s linear forwards}.slide-right-leave-active[data-v-5f29973e]{animation:slideOutRight-5f29973e .3s linear forwards}@keyframes bganimation-5f29973e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-5f29973e{0%{height:0}to{height:100px}}@keyframes fadeEnd-5f29973e{0%{height:100%}to{height:0}}.fade-enter-active[data-v-5f29973e]{animation:fadeStart-5f29973e .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-5f29973e]{animation:fadeEnd-5f29973e .1s linear forwards;overflow:hidden}@media screen and (max-width: 1000px){.action[data-v-5f29973e]{width:160%}}@media screen and (max-width: 800px){.action[data-v-5f29973e]{width:138%}}@media screen and (max-width: 700px){.action[data-v-5f29973e]{width:132%}}@media screen and (max-width: 600px){.action[data-v-5f29973e]{width:116%}}@media screen and (max-width: 500px){.action[data-v-5f29973e]{width:100%}}@media screen and (max-width: 400px){.action[data-v-5f29973e]{width:90%}}@media screen and (max-width: 300px){.action[data-v-5f29973e]{width:100%}}@keyframes bganimation-e039a994{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-e039a994{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-e039a994{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-e039a994{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-e039a994{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-e039a994]{animation:slideInLeft-e039a994 .3s linear forwards}.slide-left-leave-active[data-v-e039a994]{animation:slideInRight-e039a994 .3s linear forwards}@keyframes slideOutLeft-e039a994{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-e039a994{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-e039a994]{animation:slideOutLeft-e039a994 .3s linear forwards}.slide-right-leave-active[data-v-e039a994]{animation:slideOutRight-e039a994 .3s linear forwards}.rotate-enter-active[data-v-e039a994]{animation:rotateEnter-e039a994 .7s;position:relative}.rotate-leave-active[data-v-e039a994]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-e039a994]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-e039a994]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-e039a994]{color:#f9ad1e}.notice_info li[data-v-e039a994]{font-size:14px;list-style:revert}.text-container[data-v-e039a994]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-e039a994]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-e039a994]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-e039a994]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-e039a994]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-e039a994]{width:100%}.text-container .text-container_item p.info-desc[data-v-e039a994]{width:100%;color:#999;font-size:14px}.page-container[data-v-e039a994]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-e039a994]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-e039a994]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-e039a994]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-e039a994],.page-container .page-flex .page-sidebar a[data-v-e039a994]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-e039a994]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-e039a994]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-e039a994]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-e039a994]{border-radius:0;padding:1rem}ul.ul-container[data-v-e039a994]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-e039a994]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-e039a994]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-e039a994]{width:100%}form.form-container[data-v-e039a994]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-e039a994]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-e039a994]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-e039a994]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-e039a994]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-e039a994],form.form-container .label-value select[data-v-e039a994]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-e039a994]:focus,form.form-container .label-value select[data-v-e039a994]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-e039a994]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-e039a994]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-e039a994],form.form-container .label-value input[type=radio][data-v-e039a994]{width:auto}form.form-container .label-value input[type=radio][data-v-e039a994]{margin:0 4px 0 0}form.form-container .label-value input[data-v-e039a994]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-e039a994]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-e039a994]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-e039a994]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-e039a994]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-e039a994]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-e039a994]:hover{background-color:#747474}form.form-container .label-msg[data-v-e039a994]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-e039a994]{color:#f9ad1e}form.form-container .label-flex[data-v-e039a994]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-e039a994]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-e039a994]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-e039a994]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-e039a994]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-e039a994]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-e039a994]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-e039a994],form.form-container1 .label-value select[data-v-e039a994]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-e039a994]:focus,form.form-container1 .label-value select[data-v-e039a994]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-e039a994]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-e039a994],form.form-container1 .label-value input[type=radio][data-v-e039a994]{width:auto}form.form-container1 .label-value input[type=radio][data-v-e039a994]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-e039a994]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-e039a994]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-e039a994]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-e039a994]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-e039a994]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-e039a994]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-e039a994]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-e039a994]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-e039a994]{color:#f9ad1e}form.form-container1 .label-flex[data-v-e039a994]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-e039a994]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-e039a994]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-e039a994]{width:100px}table.page-table th.checkbox[data-v-e039a994]{width:50px;text-align:center}table.page-table th.setting[data-v-e039a994]{width:100px;text-align:center}table.page-table thead[data-v-e039a994]{color:#909399}table.page-table thead tr[data-v-e039a994]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-e039a994]{padding:10px 16px}table.page-table tbody tr[data-v-e039a994]:hover{background-color:#eeee}table.page-table tbody tr[data-v-e039a994]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-e039a994]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-e039a994]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-e039a994]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-e039a994]{width:100px}table.popups-table th.checkbox[data-v-e039a994]{width:50px;text-align:center}table.popups-table th.setting[data-v-e039a994]{width:100px;text-align:center}table.popups-table thead[data-v-e039a994]{color:#eee}table.popups-table thead tr[data-v-e039a994]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-e039a994]{padding:10px 16px}table.popups-table tbody tr[data-v-e039a994]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-e039a994]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-e039a994]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-e039a994]{width:100%}header.header-desktop[data-v-e039a994]{display:block}header.header-mobile[data-v-e039a994]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-e039a994]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-e039a994]{width:100%;height:100%}header.header-mobile button svg path[data-v-e039a994]{fill:#fff}nav.sidebar[data-v-e039a994]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-e039a994]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-e039a994]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-e039a994]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-e039a994]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-e039a994]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-e039a994]{color:#fff}nav.sidebar .container .children[data-v-e039a994]{padding-left:30px}@-moz-keyframes tada-e039a994{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-e039a994{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-e039a994{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-e039a994{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-e039a994]{animation:dialogEnter-e039a994 .3s linear forwards}.dialog-leave-active[data-v-e039a994]{animation:dialogLeave-e039a994 .3s linear forwards}@keyframes dialogEnter-e039a994{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-e039a994{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-e039a994]{animation:dialogEnter-e039a994 .2s linear forwards}.dialog1-leave-active[data-v-e039a994]{animation:dialogLeave-e039a994 .2s linear forwards}@keyframes rotateEnter-e039a994{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-e039a994]{animation:rotateEnter-e039a994 .7s;position:relative}.rotate-leave-active[data-v-e039a994]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-e039a994{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-e039a994{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-e039a994]{animation:slideOutTop-e039a994 .5s linear forwards}.slide-top-leave-active[data-v-e039a994],.slide-bottom-enter-active[data-v-e039a994]{animation:slideOutBottom-e039a994 .5s linear forwards}@keyframes slideInLeft-e039a994{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-e039a994{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-e039a994]{animation:slideInLeft-e039a994 .3s linear forwards}.slide-left-leave-active[data-v-e039a994]{animation:slideInRight-e039a994 .3s linear forwards}@keyframes slideOutLeft-e039a994{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-e039a994{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-e039a994]{animation:slideOutLeft-e039a994 .3s linear forwards}.slide-right-leave-active[data-v-e039a994]{animation:slideOutRight-e039a994 .3s linear forwards}@keyframes bganimation-e039a994{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-e039a994{0%{height:0}to{height:100px}}@keyframes fadeEnd-e039a994{0%{height:100%}to{height:0}}.fade-enter-active[data-v-e039a994]{animation:fadeStart-e039a994 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-e039a994]{animation:fadeEnd-e039a994 .1s linear forwards;overflow:hidden}.disk[data-v-e039a994]{line-height:14px;color:#000c;margin-bottom:13px}.disk>span.title[data-v-e039a994]{display:inline-block;font-size:12px;font-weight:500;margin-bottom:6px}.disk>div.item[data-v-e039a994]{border-radius:8px;background:#f2efee;padding:6px 8px;margin-bottom:4px}.disk>div.item>span[data-v-e039a994]{display:inline-block;font-size:12px;font-weight:600;margin-bottom:4px}.disk>div.item>.not-progress>span[data-v-e039a994]{font-size:12px}.disk>div.item>.not-progress>span.btn[data-v-e039a994]{cursor:pointer;color:#297ff3}.disk>div.item>div[data-v-e039a994]{height:22px;display:flex;align-items:center;justify-items:center}.disk>div.item>div>.progress[data-v-e039a994]{position:relative;flex:1;border-radius:6px;background:rgba(0,0,0,.04);height:14px}.disk>div.item>div>.progress>div[data-v-e039a994]{border-radius:6px;background:rgb(0,0,0);height:100%}.disk>div.item>div>.progress>span[data-v-e039a994]{display:inline-block;width:100%;position:absolute;top:0;left:0;color:#000c;text-align:center;font-size:20px;transform:scale(.7);font-size:12px}.disk>div.item>div>.button[data-v-e039a994]{display:inline-block;text-align:right}.disk>div.item>div>.button>span.btn[data-v-e039a994]{display:flex;align-items:center;border-radius:12px;background:rgba(0,0,0,.04);color:#0009;font-size:12px;font-weight:600;padding:4px 10px;cursor:pointer;line-height:12px;transform:scale(.8)}.disk>div.item>div>.button>span.btn>img[data-v-e039a994]{margin-right:2px;transform:scale(.8)}.disk>div.item>div>.button>img[data-v-e039a994]{cursor:pointer;width:16px;margin-left:6px}.tooltip-trigger[data-v-e039a994]{flex:none;cursor:help}.tooltip-trigger[data-v-e039a994]{position:relative;display:inline-block;cursor:help;margin-right:6px;margin-left:10px}.tooltip-trigger .tooltip-text[data-v-e039a994]{visibility:visible;position:absolute;padding:.5rem 1rem;background-color:#555;color:#fff;text-align:center;border-radius:6px;opacity:0;transition:opacity .6s}.tooltip-trigger .tooltip-text span[data-v-e039a994]{color:#fff}.tooltip-trigger .tooltip-text .disk_dir_tip[data-v-e039a994]{font-size:12px;min-width:15rem;display:inline-block}.tooltip-trigger:hover .tooltip-text[data-v-e039a994]{visibility:visible;opacity:1}.tooltip-top[data-v-e039a994]{bottom:100%;left:50%;margin-bottom:5px;transform:translate(-50%)}.tooltip-top[data-v-e039a994]:after{content:\"\";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:#555 transparent transparent transparent}.tooltip-bottom[data-v-e039a994]:after{content:\"\";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:transparent transparent #555 transparent}@keyframes bganimation-580b5628{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-580b5628{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-580b5628{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-580b5628{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-580b5628{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-580b5628]{animation:slideInLeft-580b5628 .3s linear forwards}.slide-left-leave-active[data-v-580b5628]{animation:slideInRight-580b5628 .3s linear forwards}@keyframes slideOutLeft-580b5628{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-580b5628{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-580b5628]{animation:slideOutLeft-580b5628 .3s linear forwards}.slide-right-leave-active[data-v-580b5628]{animation:slideOutRight-580b5628 .3s linear forwards}.rotate-enter-active[data-v-580b5628]{animation:rotateEnter-580b5628 .7s;position:relative}.rotate-leave-active[data-v-580b5628]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-580b5628]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-580b5628]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-580b5628]{color:#f9ad1e}.notice_info li[data-v-580b5628]{font-size:14px;list-style:revert}.text-container[data-v-580b5628]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-580b5628]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-580b5628]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-580b5628]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-580b5628]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-580b5628]{width:100%}.text-container .text-container_item p.info-desc[data-v-580b5628]{width:100%;color:#999;font-size:14px}.page-container[data-v-580b5628]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-580b5628]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-580b5628]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-580b5628]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-580b5628],.page-container .page-flex .page-sidebar a[data-v-580b5628]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-580b5628]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-580b5628]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-580b5628]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-580b5628]{border-radius:0;padding:1rem}ul.ul-container[data-v-580b5628]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-580b5628]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-580b5628]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-580b5628]{width:100%}form.form-container[data-v-580b5628]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-580b5628]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-580b5628]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-580b5628]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-580b5628]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-580b5628],form.form-container .label-value select[data-v-580b5628]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-580b5628]:focus,form.form-container .label-value select[data-v-580b5628]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-580b5628]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-580b5628]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-580b5628],form.form-container .label-value input[type=radio][data-v-580b5628]{width:auto}form.form-container .label-value input[type=radio][data-v-580b5628]{margin:0 4px 0 0}form.form-container .label-value input[data-v-580b5628]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-580b5628]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-580b5628]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-580b5628]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-580b5628]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-580b5628]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-580b5628]:hover{background-color:#747474}form.form-container .label-msg[data-v-580b5628]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-580b5628]{color:#f9ad1e}form.form-container .label-flex[data-v-580b5628]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-580b5628]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-580b5628]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-580b5628]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-580b5628]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-580b5628]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-580b5628]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-580b5628],form.form-container1 .label-value select[data-v-580b5628]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-580b5628]:focus,form.form-container1 .label-value select[data-v-580b5628]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-580b5628]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-580b5628],form.form-container1 .label-value input[type=radio][data-v-580b5628]{width:auto}form.form-container1 .label-value input[type=radio][data-v-580b5628]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-580b5628]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-580b5628]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-580b5628]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-580b5628]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-580b5628]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-580b5628]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-580b5628]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-580b5628]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-580b5628]{color:#f9ad1e}form.form-container1 .label-flex[data-v-580b5628]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-580b5628]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-580b5628]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-580b5628]{width:100px}table.page-table th.checkbox[data-v-580b5628]{width:50px;text-align:center}table.page-table th.setting[data-v-580b5628]{width:100px;text-align:center}table.page-table thead[data-v-580b5628]{color:#909399}table.page-table thead tr[data-v-580b5628]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-580b5628]{padding:10px 16px}table.page-table tbody tr[data-v-580b5628]:hover{background-color:#eeee}table.page-table tbody tr[data-v-580b5628]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-580b5628]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-580b5628]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-580b5628]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-580b5628]{width:100px}table.popups-table th.checkbox[data-v-580b5628]{width:50px;text-align:center}table.popups-table th.setting[data-v-580b5628]{width:100px;text-align:center}table.popups-table thead[data-v-580b5628]{color:#eee}table.popups-table thead tr[data-v-580b5628]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-580b5628]{padding:10px 16px}table.popups-table tbody tr[data-v-580b5628]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-580b5628]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-580b5628]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-580b5628]{width:100%}header.header-desktop[data-v-580b5628]{display:block}header.header-mobile[data-v-580b5628]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-580b5628]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-580b5628]{width:100%;height:100%}header.header-mobile button svg path[data-v-580b5628]{fill:#fff}nav.sidebar[data-v-580b5628]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-580b5628]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-580b5628]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-580b5628]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-580b5628]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-580b5628]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-580b5628]{color:#fff}nav.sidebar .container .children[data-v-580b5628]{padding-left:30px}@-moz-keyframes tada-580b5628{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-580b5628{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-580b5628{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-580b5628{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-580b5628]{animation:dialogEnter-580b5628 .3s linear forwards}.dialog-leave-active[data-v-580b5628]{animation:dialogLeave-580b5628 .3s linear forwards}@keyframes dialogEnter-580b5628{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-580b5628{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-580b5628]{animation:dialogEnter-580b5628 .2s linear forwards}.dialog1-leave-active[data-v-580b5628]{animation:dialogLeave-580b5628 .2s linear forwards}@keyframes rotateEnter-580b5628{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-580b5628]{animation:rotateEnter-580b5628 .7s;position:relative}.rotate-leave-active[data-v-580b5628]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-580b5628{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-580b5628{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-580b5628]{animation:slideOutTop-580b5628 .5s linear forwards}.slide-top-leave-active[data-v-580b5628],.slide-bottom-enter-active[data-v-580b5628]{animation:slideOutBottom-580b5628 .5s linear forwards}@keyframes slideInLeft-580b5628{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-580b5628{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-580b5628]{animation:slideInLeft-580b5628 .3s linear forwards}.slide-left-leave-active[data-v-580b5628]{animation:slideInRight-580b5628 .3s linear forwards}@keyframes slideOutLeft-580b5628{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-580b5628{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-580b5628]{animation:slideOutLeft-580b5628 .3s linear forwards}.slide-right-leave-active[data-v-580b5628]{animation:slideOutRight-580b5628 .3s linear forwards}@keyframes bganimation-580b5628{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-580b5628{0%{height:0}to{height:100px}}@keyframes fadeEnd-580b5628{0%{height:100%}to{height:0}}.fade-enter-active[data-v-580b5628]{animation:fadeStart-580b5628 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-580b5628]{animation:fadeEnd-580b5628 .1s linear forwards;overflow:hidden}.app-container_status-label_bg[data-v-580b5628]{flex:0 0 128px;width:128px;height:100%;display:flex;background:#f3f3f3;align-items:center;padding:10px;margin-right:10px;transition:.3s;border-radius:4px;opacity:.8;background:#f2efee}.app-container_status-label_bg .app-container_status-label_text[data-v-580b5628]{margin-left:6px;font-size:20px;transform:scale(.5);line-height:22px;text-align:left;transform-origin:left}.app-container_status-label_bg .app-container_status-label_text .text_status[data-v-580b5628]{color:#999}.app-container_status-label_bg .app-container_status-label_text .text_style[data-v-580b5628]{margin:6px 0}.app-container_status-label_bg .app-container_status-label_text .text_style.close[data-v-580b5628]{color:#999}.app-container_status-label_bg .app-container_status-label_text .text_info[data-v-580b5628]{font-weight:700;font-size:14px}@keyframes bganimation-92f8fb6c{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-92f8fb6c{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-92f8fb6c{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-92f8fb6c{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-92f8fb6c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-92f8fb6c]{animation:slideInLeft-92f8fb6c .3s linear forwards}.slide-left-leave-active[data-v-92f8fb6c]{animation:slideInRight-92f8fb6c .3s linear forwards}@keyframes slideOutLeft-92f8fb6c{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-92f8fb6c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-92f8fb6c]{animation:slideOutLeft-92f8fb6c .3s linear forwards}.slide-right-leave-active[data-v-92f8fb6c]{animation:slideOutRight-92f8fb6c .3s linear forwards}.rotate-enter-active[data-v-92f8fb6c]{animation:rotateEnter-92f8fb6c .7s;position:relative}.rotate-leave-active[data-v-92f8fb6c]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-92f8fb6c]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-92f8fb6c]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-92f8fb6c]{color:#f9ad1e}.notice_info li[data-v-92f8fb6c]{font-size:14px;list-style:revert}.text-container[data-v-92f8fb6c]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-92f8fb6c]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-92f8fb6c]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-92f8fb6c]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-92f8fb6c]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-92f8fb6c]{width:100%}.text-container .text-container_item p.info-desc[data-v-92f8fb6c]{width:100%;color:#999;font-size:14px}.page-container[data-v-92f8fb6c]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-92f8fb6c]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-92f8fb6c]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-92f8fb6c]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-92f8fb6c],.page-container .page-flex .page-sidebar a[data-v-92f8fb6c]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-92f8fb6c]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-92f8fb6c]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-92f8fb6c]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-92f8fb6c]{border-radius:0;padding:1rem}ul.ul-container[data-v-92f8fb6c]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-92f8fb6c]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-92f8fb6c]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-92f8fb6c]{width:100%}form.form-container[data-v-92f8fb6c]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-92f8fb6c]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-92f8fb6c]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-92f8fb6c]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-92f8fb6c]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-92f8fb6c],form.form-container .label-value select[data-v-92f8fb6c]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-92f8fb6c]:focus,form.form-container .label-value select[data-v-92f8fb6c]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-92f8fb6c]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-92f8fb6c]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-92f8fb6c],form.form-container .label-value input[type=radio][data-v-92f8fb6c]{width:auto}form.form-container .label-value input[type=radio][data-v-92f8fb6c]{margin:0 4px 0 0}form.form-container .label-value input[data-v-92f8fb6c]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-92f8fb6c]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-92f8fb6c]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-92f8fb6c]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-92f8fb6c]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-92f8fb6c]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-92f8fb6c]:hover{background-color:#747474}form.form-container .label-msg[data-v-92f8fb6c]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-92f8fb6c]{color:#f9ad1e}form.form-container .label-flex[data-v-92f8fb6c]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-92f8fb6c]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-92f8fb6c]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-92f8fb6c]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-92f8fb6c]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-92f8fb6c]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-92f8fb6c]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-92f8fb6c],form.form-container1 .label-value select[data-v-92f8fb6c]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-92f8fb6c]:focus,form.form-container1 .label-value select[data-v-92f8fb6c]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-92f8fb6c]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-92f8fb6c],form.form-container1 .label-value input[type=radio][data-v-92f8fb6c]{width:auto}form.form-container1 .label-value input[type=radio][data-v-92f8fb6c]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-92f8fb6c]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-92f8fb6c]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-92f8fb6c]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-92f8fb6c]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-92f8fb6c]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-92f8fb6c]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-92f8fb6c]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-92f8fb6c]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-92f8fb6c]{color:#f9ad1e}form.form-container1 .label-flex[data-v-92f8fb6c]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-92f8fb6c]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-92f8fb6c]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-92f8fb6c]{width:100px}table.page-table th.checkbox[data-v-92f8fb6c]{width:50px;text-align:center}table.page-table th.setting[data-v-92f8fb6c]{width:100px;text-align:center}table.page-table thead[data-v-92f8fb6c]{color:#909399}table.page-table thead tr[data-v-92f8fb6c]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-92f8fb6c]{padding:10px 16px}table.page-table tbody tr[data-v-92f8fb6c]:hover{background-color:#eeee}table.page-table tbody tr[data-v-92f8fb6c]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-92f8fb6c]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-92f8fb6c]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-92f8fb6c]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-92f8fb6c]{width:100px}table.popups-table th.checkbox[data-v-92f8fb6c]{width:50px;text-align:center}table.popups-table th.setting[data-v-92f8fb6c]{width:100px;text-align:center}table.popups-table thead[data-v-92f8fb6c]{color:#eee}table.popups-table thead tr[data-v-92f8fb6c]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-92f8fb6c]{padding:10px 16px}table.popups-table tbody tr[data-v-92f8fb6c]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-92f8fb6c]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-92f8fb6c]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-92f8fb6c]{width:100%}header.header-desktop[data-v-92f8fb6c]{display:block}header.header-mobile[data-v-92f8fb6c]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-92f8fb6c]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-92f8fb6c]{width:100%;height:100%}header.header-mobile button svg path[data-v-92f8fb6c]{fill:#fff}nav.sidebar[data-v-92f8fb6c]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-92f8fb6c]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-92f8fb6c]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-92f8fb6c]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-92f8fb6c]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-92f8fb6c]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-92f8fb6c]{color:#fff}nav.sidebar .container .children[data-v-92f8fb6c]{padding-left:30px}@-moz-keyframes tada-92f8fb6c{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-92f8fb6c{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-92f8fb6c{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-92f8fb6c{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-92f8fb6c]{animation:dialogEnter-92f8fb6c .3s linear forwards}.dialog-leave-active[data-v-92f8fb6c]{animation:dialogLeave-92f8fb6c .3s linear forwards}@keyframes dialogEnter-92f8fb6c{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-92f8fb6c{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-92f8fb6c]{animation:dialogEnter-92f8fb6c .2s linear forwards}.dialog1-leave-active[data-v-92f8fb6c]{animation:dialogLeave-92f8fb6c .2s linear forwards}@keyframes rotateEnter-92f8fb6c{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-92f8fb6c]{animation:rotateEnter-92f8fb6c .7s;position:relative}.rotate-leave-active[data-v-92f8fb6c]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-92f8fb6c{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-92f8fb6c{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-92f8fb6c]{animation:slideOutTop-92f8fb6c .5s linear forwards}.slide-top-leave-active[data-v-92f8fb6c],.slide-bottom-enter-active[data-v-92f8fb6c]{animation:slideOutBottom-92f8fb6c .5s linear forwards}@keyframes slideInLeft-92f8fb6c{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-92f8fb6c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-92f8fb6c]{animation:slideInLeft-92f8fb6c .3s linear forwards}.slide-left-leave-active[data-v-92f8fb6c]{animation:slideInRight-92f8fb6c .3s linear forwards}@keyframes slideOutLeft-92f8fb6c{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-92f8fb6c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-92f8fb6c]{animation:slideOutLeft-92f8fb6c .3s linear forwards}.slide-right-leave-active[data-v-92f8fb6c]{animation:slideOutRight-92f8fb6c .3s linear forwards}@keyframes bganimation-92f8fb6c{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-92f8fb6c{0%{height:0}to{height:100px}}@keyframes fadeEnd-92f8fb6c{0%{height:100%}to{height:0}}.fade-enter-active[data-v-92f8fb6c]{animation:fadeStart-92f8fb6c .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-92f8fb6c]{animation:fadeEnd-92f8fb6c .1s linear forwards;overflow:hidden}.app-interfaces[data-v-92f8fb6c]{width:100%;height:58px;display:flex;flex-wrap:nowrap;overflow:hidden;position:relative}.app-interfaces a[data-v-92f8fb6c]{list-style:none;text-decoration:none}.app-interfaces img.btn-f[data-v-92f8fb6c]{position:absolute;left:-15px;top:-10px;cursor:pointer;opacity:0;transition:.3s;z-index:1}.app-interfaces img.btn-f[data-v-92f8fb6c]:hover{opacity:1;transition:.3s}.app-interfaces img.btn-r[data-v-92f8fb6c]{position:absolute;right:-15px;top:-10px;transform:rotateY(180deg);cursor:pointer;opacity:0;transition:.3s;z-index:1}.app-interfaces img.btn-r[data-v-92f8fb6c]:hover{opacity:1;transition:.3s}@keyframes bganimation-2244abae{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-2244abae{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-2244abae{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-2244abae{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-2244abae{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-2244abae]{animation:slideInLeft-2244abae .3s linear forwards}.slide-left-leave-active[data-v-2244abae]{animation:slideInRight-2244abae .3s linear forwards}@keyframes slideOutLeft-2244abae{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-2244abae{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-2244abae]{animation:slideOutLeft-2244abae .3s linear forwards}.slide-right-leave-active[data-v-2244abae]{animation:slideOutRight-2244abae .3s linear forwards}.rotate-enter-active[data-v-2244abae]{animation:rotateEnter-2244abae .7s;position:relative}.rotate-leave-active[data-v-2244abae]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-2244abae]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-2244abae]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-2244abae]{color:#f9ad1e}.notice_info li[data-v-2244abae]{font-size:14px;list-style:revert}.text-container[data-v-2244abae]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-2244abae]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-2244abae]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-2244abae]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-2244abae]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-2244abae]{width:100%}.text-container .text-container_item p.info-desc[data-v-2244abae]{width:100%;color:#999;font-size:14px}.page-container[data-v-2244abae]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-2244abae]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-2244abae]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-2244abae]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-2244abae],.page-container .page-flex .page-sidebar a[data-v-2244abae]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-2244abae]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-2244abae]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-2244abae]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-2244abae]{border-radius:0;padding:1rem}ul.ul-container[data-v-2244abae]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-2244abae]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-2244abae]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-2244abae]{width:100%}form.form-container[data-v-2244abae]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-2244abae]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-2244abae]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-2244abae]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-2244abae]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-2244abae],form.form-container .label-value select[data-v-2244abae]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-2244abae]:focus,form.form-container .label-value select[data-v-2244abae]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-2244abae]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-2244abae]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-2244abae],form.form-container .label-value input[type=radio][data-v-2244abae]{width:auto}form.form-container .label-value input[type=radio][data-v-2244abae]{margin:0 4px 0 0}form.form-container .label-value input[data-v-2244abae]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-2244abae]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-2244abae]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-2244abae]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-2244abae]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-2244abae]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-2244abae]:hover{background-color:#747474}form.form-container .label-msg[data-v-2244abae]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-2244abae]{color:#f9ad1e}form.form-container .label-flex[data-v-2244abae]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-2244abae]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-2244abae]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-2244abae]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-2244abae]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-2244abae]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-2244abae]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-2244abae],form.form-container1 .label-value select[data-v-2244abae]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-2244abae]:focus,form.form-container1 .label-value select[data-v-2244abae]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-2244abae]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-2244abae],form.form-container1 .label-value input[type=radio][data-v-2244abae]{width:auto}form.form-container1 .label-value input[type=radio][data-v-2244abae]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-2244abae]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-2244abae]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-2244abae]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-2244abae]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-2244abae]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-2244abae]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-2244abae]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-2244abae]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-2244abae]{color:#f9ad1e}form.form-container1 .label-flex[data-v-2244abae]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-2244abae]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-2244abae]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-2244abae]{width:100px}table.page-table th.checkbox[data-v-2244abae]{width:50px;text-align:center}table.page-table th.setting[data-v-2244abae]{width:100px;text-align:center}table.page-table thead[data-v-2244abae]{color:#909399}table.page-table thead tr[data-v-2244abae]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-2244abae]{padding:10px 16px}table.page-table tbody tr[data-v-2244abae]:hover{background-color:#eeee}table.page-table tbody tr[data-v-2244abae]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-2244abae]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-2244abae]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-2244abae]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-2244abae]{width:100px}table.popups-table th.checkbox[data-v-2244abae]{width:50px;text-align:center}table.popups-table th.setting[data-v-2244abae]{width:100px;text-align:center}table.popups-table thead[data-v-2244abae]{color:#eee}table.popups-table thead tr[data-v-2244abae]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-2244abae]{padding:10px 16px}table.popups-table tbody tr[data-v-2244abae]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-2244abae]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-2244abae]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-2244abae]{width:100%}header.header-desktop[data-v-2244abae]{display:block}header.header-mobile[data-v-2244abae]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-2244abae]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-2244abae]{width:100%;height:100%}header.header-mobile button svg path[data-v-2244abae]{fill:#fff}nav.sidebar[data-v-2244abae]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-2244abae]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-2244abae]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-2244abae]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-2244abae]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-2244abae]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-2244abae]{color:#fff}nav.sidebar .container .children[data-v-2244abae]{padding-left:30px}@-moz-keyframes tada-2244abae{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-2244abae{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-2244abae{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-2244abae{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-2244abae]{animation:dialogEnter-2244abae .3s linear forwards}.dialog-leave-active[data-v-2244abae]{animation:dialogLeave-2244abae .3s linear forwards}@keyframes dialogEnter-2244abae{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-2244abae{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-2244abae]{animation:dialogEnter-2244abae .2s linear forwards}.dialog1-leave-active[data-v-2244abae]{animation:dialogLeave-2244abae .2s linear forwards}@keyframes rotateEnter-2244abae{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-2244abae]{animation:rotateEnter-2244abae .7s;position:relative}.rotate-leave-active[data-v-2244abae]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-2244abae{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-2244abae{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-2244abae]{animation:slideOutTop-2244abae .5s linear forwards}.slide-top-leave-active[data-v-2244abae],.slide-bottom-enter-active[data-v-2244abae]{animation:slideOutBottom-2244abae .5s linear forwards}@keyframes slideInLeft-2244abae{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-2244abae{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-2244abae]{animation:slideInLeft-2244abae .3s linear forwards}.slide-left-leave-active[data-v-2244abae]{animation:slideInRight-2244abae .3s linear forwards}@keyframes slideOutLeft-2244abae{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-2244abae{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-2244abae]{animation:slideOutLeft-2244abae .3s linear forwards}.slide-right-leave-active[data-v-2244abae]{animation:slideOutRight-2244abae .3s linear forwards}@keyframes bganimation-2244abae{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-2244abae{0%{height:0}to{height:100px}}@keyframes fadeEnd-2244abae{0%{height:100%}to{height:0}}.fade-enter-active[data-v-2244abae]{animation:fadeStart-2244abae .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-2244abae]{animation:fadeEnd-2244abae .1s linear forwards;overflow:hidden}.status-card[data-v-2244abae]{overflow-x:hidden;white-space:nowrap}@keyframes bganimation-3f470552{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-3f470552{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-3f470552{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-3f470552{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-3f470552{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-3f470552]{animation:slideInLeft-3f470552 .3s linear forwards}.slide-left-leave-active[data-v-3f470552]{animation:slideInRight-3f470552 .3s linear forwards}@keyframes slideOutLeft-3f470552{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-3f470552{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-3f470552]{animation:slideOutLeft-3f470552 .3s linear forwards}.slide-right-leave-active[data-v-3f470552]{animation:slideOutRight-3f470552 .3s linear forwards}.rotate-enter-active[data-v-3f470552]{animation:rotateEnter-3f470552 .7s;position:relative}.rotate-leave-active[data-v-3f470552]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-3f470552]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-3f470552]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-3f470552]{color:#f9ad1e}.notice_info li[data-v-3f470552]{font-size:14px;list-style:revert}.text-container[data-v-3f470552]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-3f470552]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-3f470552]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-3f470552]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-3f470552]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-3f470552]{width:100%}.text-container .text-container_item p.info-desc[data-v-3f470552]{width:100%;color:#999;font-size:14px}.page-container[data-v-3f470552]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-3f470552]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-3f470552]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-3f470552]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-3f470552],.page-container .page-flex .page-sidebar a[data-v-3f470552]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-3f470552]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-3f470552]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-3f470552]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-3f470552]{border-radius:0;padding:1rem}ul.ul-container[data-v-3f470552]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-3f470552]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-3f470552]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-3f470552]{width:100%}form.form-container[data-v-3f470552]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-3f470552]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-3f470552]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-3f470552]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-3f470552]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-3f470552],form.form-container .label-value select[data-v-3f470552]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-3f470552]:focus,form.form-container .label-value select[data-v-3f470552]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-3f470552]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-3f470552]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-3f470552],form.form-container .label-value input[type=radio][data-v-3f470552]{width:auto}form.form-container .label-value input[type=radio][data-v-3f470552]{margin:0 4px 0 0}form.form-container .label-value input[data-v-3f470552]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-3f470552]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-3f470552]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-3f470552]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-3f470552]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-3f470552]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-3f470552]:hover{background-color:#747474}form.form-container .label-msg[data-v-3f470552]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-3f470552]{color:#f9ad1e}form.form-container .label-flex[data-v-3f470552]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-3f470552]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-3f470552]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-3f470552]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-3f470552]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-3f470552]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-3f470552]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-3f470552],form.form-container1 .label-value select[data-v-3f470552]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-3f470552]:focus,form.form-container1 .label-value select[data-v-3f470552]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-3f470552]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-3f470552],form.form-container1 .label-value input[type=radio][data-v-3f470552]{width:auto}form.form-container1 .label-value input[type=radio][data-v-3f470552]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-3f470552]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-3f470552]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-3f470552]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-3f470552]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-3f470552]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-3f470552]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-3f470552]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-3f470552]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-3f470552]{color:#f9ad1e}form.form-container1 .label-flex[data-v-3f470552]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-3f470552]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-3f470552]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-3f470552]{width:100px}table.page-table th.checkbox[data-v-3f470552]{width:50px;text-align:center}table.page-table th.setting[data-v-3f470552]{width:100px;text-align:center}table.page-table thead[data-v-3f470552]{color:#909399}table.page-table thead tr[data-v-3f470552]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-3f470552]{padding:10px 16px}table.page-table tbody tr[data-v-3f470552]:hover{background-color:#eeee}table.page-table tbody tr[data-v-3f470552]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-3f470552]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-3f470552]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-3f470552]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-3f470552]{width:100px}table.popups-table th.checkbox[data-v-3f470552]{width:50px;text-align:center}table.popups-table th.setting[data-v-3f470552]{width:100px;text-align:center}table.popups-table thead[data-v-3f470552]{color:#eee}table.popups-table thead tr[data-v-3f470552]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-3f470552]{padding:10px 16px}table.popups-table tbody tr[data-v-3f470552]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-3f470552]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-3f470552]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-3f470552]{width:100%}header.header-desktop[data-v-3f470552]{display:block}header.header-mobile[data-v-3f470552]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-3f470552]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-3f470552]{width:100%;height:100%}header.header-mobile button svg path[data-v-3f470552]{fill:#fff}nav.sidebar[data-v-3f470552]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-3f470552]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-3f470552]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-3f470552]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-3f470552]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-3f470552]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-3f470552]{color:#fff}nav.sidebar .container .children[data-v-3f470552]{padding-left:30px}@-moz-keyframes tada-3f470552{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-3f470552{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-3f470552{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-3f470552{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-3f470552]{animation:dialogEnter-3f470552 .3s linear forwards}.dialog-leave-active[data-v-3f470552]{animation:dialogLeave-3f470552 .3s linear forwards}@keyframes dialogEnter-3f470552{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-3f470552{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-3f470552]{animation:dialogEnter-3f470552 .2s linear forwards}.dialog1-leave-active[data-v-3f470552]{animation:dialogLeave-3f470552 .2s linear forwards}@keyframes rotateEnter-3f470552{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-3f470552]{animation:rotateEnter-3f470552 .7s;position:relative}.rotate-leave-active[data-v-3f470552]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-3f470552{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-3f470552{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-3f470552]{animation:slideOutTop-3f470552 .5s linear forwards}.slide-top-leave-active[data-v-3f470552],.slide-bottom-enter-active[data-v-3f470552]{animation:slideOutBottom-3f470552 .5s linear forwards}@keyframes slideInLeft-3f470552{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-3f470552{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-3f470552]{animation:slideInLeft-3f470552 .3s linear forwards}.slide-left-leave-active[data-v-3f470552]{animation:slideInRight-3f470552 .3s linear forwards}@keyframes slideOutLeft-3f470552{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-3f470552{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-3f470552]{animation:slideOutLeft-3f470552 .3s linear forwards}.slide-right-leave-active[data-v-3f470552]{animation:slideOutRight-3f470552 .3s linear forwards}@keyframes bganimation-3f470552{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-3f470552{0%{height:0}to{height:100px}}@keyframes fadeEnd-3f470552{0%{height:100%}to{height:0}}.fade-enter-active[data-v-3f470552]{animation:fadeStart-3f470552 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-3f470552]{animation:fadeEnd-3f470552 .1s linear forwards;overflow:hidden}.disk-info[data-v-3f470552]{padding:4px 20px}.gauge[data-v-3f470552]{width:78px;height:78px;text-align:center;display:flex;justify-content:center;align-items:center}.chart[data-v-3f470552]{display:flex;justify-content:space-between;padding:0 12px;margin:0 auto}.info[data-v-3f470552]{padding-top:14px}.info>div[data-v-3f470552]{display:flex;align-items:center;margin-bottom:3px}.info>div>span[data-v-3f470552]:first-of-type{color:#000c;font-size:12px;font-weight:600}.info>div>span[data-v-3f470552]:last-of-type{color:#000c;font-size:12px}.width-50[data-v-3f470552]{display:inline-block;vertical-align:top;width:50%}@media screen and (max-width: 668px){.responsive[data-v-3f470552]{width:100%}}@keyframes bganimation-61b6e601{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-61b6e601{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-61b6e601{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-61b6e601{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-61b6e601{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-61b6e601]{animation:slideInLeft-61b6e601 .3s linear forwards}.slide-left-leave-active[data-v-61b6e601]{animation:slideInRight-61b6e601 .3s linear forwards}@keyframes slideOutLeft-61b6e601{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-61b6e601{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-61b6e601]{animation:slideOutLeft-61b6e601 .3s linear forwards}.slide-right-leave-active[data-v-61b6e601]{animation:slideOutRight-61b6e601 .3s linear forwards}.rotate-enter-active[data-v-61b6e601]{animation:rotateEnter-61b6e601 .7s;position:relative}.rotate-leave-active[data-v-61b6e601]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-61b6e601]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-61b6e601]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-61b6e601]{color:#f9ad1e}.notice_info li[data-v-61b6e601]{font-size:14px;list-style:revert}.text-container[data-v-61b6e601]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-61b6e601]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-61b6e601]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-61b6e601]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-61b6e601]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-61b6e601]{width:100%}.text-container .text-container_item p.info-desc[data-v-61b6e601]{width:100%;color:#999;font-size:14px}.page-container[data-v-61b6e601]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-61b6e601]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-61b6e601]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-61b6e601]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-61b6e601],.page-container .page-flex .page-sidebar a[data-v-61b6e601]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-61b6e601]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-61b6e601]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-61b6e601]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-61b6e601]{border-radius:0;padding:1rem}ul.ul-container[data-v-61b6e601]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-61b6e601]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-61b6e601]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-61b6e601]{width:100%}form.form-container[data-v-61b6e601]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-61b6e601]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-61b6e601]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-61b6e601]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-61b6e601]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-61b6e601],form.form-container .label-value select[data-v-61b6e601]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-61b6e601]:focus,form.form-container .label-value select[data-v-61b6e601]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-61b6e601]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-61b6e601]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-61b6e601],form.form-container .label-value input[type=radio][data-v-61b6e601]{width:auto}form.form-container .label-value input[type=radio][data-v-61b6e601]{margin:0 4px 0 0}form.form-container .label-value input[data-v-61b6e601]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-61b6e601]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-61b6e601]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-61b6e601]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-61b6e601]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-61b6e601]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-61b6e601]:hover{background-color:#747474}form.form-container .label-msg[data-v-61b6e601]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-61b6e601]{color:#f9ad1e}form.form-container .label-flex[data-v-61b6e601]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-61b6e601]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-61b6e601]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-61b6e601]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-61b6e601]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-61b6e601]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-61b6e601]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-61b6e601],form.form-container1 .label-value select[data-v-61b6e601]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-61b6e601]:focus,form.form-container1 .label-value select[data-v-61b6e601]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-61b6e601]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-61b6e601],form.form-container1 .label-value input[type=radio][data-v-61b6e601]{width:auto}form.form-container1 .label-value input[type=radio][data-v-61b6e601]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-61b6e601]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-61b6e601]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-61b6e601]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-61b6e601]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-61b6e601]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-61b6e601]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-61b6e601]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-61b6e601]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-61b6e601]{color:#f9ad1e}form.form-container1 .label-flex[data-v-61b6e601]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-61b6e601]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-61b6e601]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-61b6e601]{width:100px}table.page-table th.checkbox[data-v-61b6e601]{width:50px;text-align:center}table.page-table th.setting[data-v-61b6e601]{width:100px;text-align:center}table.page-table thead[data-v-61b6e601]{color:#909399}table.page-table thead tr[data-v-61b6e601]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-61b6e601]{padding:10px 16px}table.page-table tbody tr[data-v-61b6e601]:hover{background-color:#eeee}table.page-table tbody tr[data-v-61b6e601]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-61b6e601]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-61b6e601]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-61b6e601]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-61b6e601]{width:100px}table.popups-table th.checkbox[data-v-61b6e601]{width:50px;text-align:center}table.popups-table th.setting[data-v-61b6e601]{width:100px;text-align:center}table.popups-table thead[data-v-61b6e601]{color:#eee}table.popups-table thead tr[data-v-61b6e601]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-61b6e601]{padding:10px 16px}table.popups-table tbody tr[data-v-61b6e601]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-61b6e601]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-61b6e601]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-61b6e601]{width:100%}header.header-desktop[data-v-61b6e601]{display:block}header.header-mobile[data-v-61b6e601]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-61b6e601]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-61b6e601]{width:100%;height:100%}header.header-mobile button svg path[data-v-61b6e601]{fill:#fff}nav.sidebar[data-v-61b6e601]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-61b6e601]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-61b6e601]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-61b6e601]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-61b6e601]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-61b6e601]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-61b6e601]{color:#fff}nav.sidebar .container .children[data-v-61b6e601]{padding-left:30px}@-moz-keyframes tada-61b6e601{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-61b6e601{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-61b6e601{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-61b6e601{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-61b6e601]{animation:dialogEnter-61b6e601 .3s linear forwards}.dialog-leave-active[data-v-61b6e601]{animation:dialogLeave-61b6e601 .3s linear forwards}@keyframes dialogEnter-61b6e601{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-61b6e601{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-61b6e601]{animation:dialogEnter-61b6e601 .2s linear forwards}.dialog1-leave-active[data-v-61b6e601]{animation:dialogLeave-61b6e601 .2s linear forwards}@keyframes rotateEnter-61b6e601{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-61b6e601]{animation:rotateEnter-61b6e601 .7s;position:relative}.rotate-leave-active[data-v-61b6e601]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-61b6e601{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-61b6e601{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-61b6e601]{animation:slideOutTop-61b6e601 .5s linear forwards}.slide-top-leave-active[data-v-61b6e601],.slide-bottom-enter-active[data-v-61b6e601]{animation:slideOutBottom-61b6e601 .5s linear forwards}@keyframes slideInLeft-61b6e601{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-61b6e601{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-61b6e601]{animation:slideInLeft-61b6e601 .3s linear forwards}.slide-left-leave-active[data-v-61b6e601]{animation:slideInRight-61b6e601 .3s linear forwards}@keyframes slideOutLeft-61b6e601{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-61b6e601{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-61b6e601]{animation:slideOutLeft-61b6e601 .3s linear forwards}.slide-right-leave-active[data-v-61b6e601]{animation:slideOutRight-61b6e601 .3s linear forwards}@keyframes bganimation-61b6e601{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-61b6e601{0%{height:0}to{height:100px}}@keyframes fadeEnd-61b6e601{0%{height:100%}to{height:0}}.fade-enter-active[data-v-61b6e601]{animation:fadeStart-61b6e601 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-61b6e601]{animation:fadeEnd-61b6e601 .1s linear forwards;overflow:hidden}.app[data-v-61b6e601]{width:20%;padding:4px;height:120px}.app>div[data-v-61b6e601]{border-radius:16px;background:#fff;backdrop-filter:blur(12px);position:relative;width:100%;height:100%;cursor:pointer}.app>div .setting[data-v-61b6e601]{position:absolute;top:6px;right:10px;border-radius:4px;border:1px solid #eaeaea;height:18px;width:18px;display:inline-block;cursor:pointer;display:flex;align-items:center;justify-content:center}.app>div .setting>img[data-v-61b6e601]{width:16px}.app>div>div[data-v-61b6e601]{position:absolute;width:80%;top:50%;left:50%;transform:translate(-50%,-50%)}.app>div>div>img[data-v-61b6e601]{display:block;width:54px;height:54px;margin:0 auto 6px}.app>div>div>span[data-v-61b6e601]{display:inline-block;width:100%;color:#000;text-align:center;font-size:12px}.app>div:hover .app-icon[data-v-61b6e601]{transition:.3s;transform:scale(1.1)}@media screen and (max-width: 668px){.app[data-v-61b6e601]{width:120px;height:126px}}@keyframes bganimation-283b2956{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-283b2956{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-283b2956{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-283b2956{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-283b2956{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-283b2956]{animation:slideInLeft-283b2956 .3s linear forwards}.slide-left-leave-active[data-v-283b2956]{animation:slideInRight-283b2956 .3s linear forwards}@keyframes slideOutLeft-283b2956{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-283b2956{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-283b2956]{animation:slideOutLeft-283b2956 .3s linear forwards}.slide-right-leave-active[data-v-283b2956]{animation:slideOutRight-283b2956 .3s linear forwards}.rotate-enter-active[data-v-283b2956]{animation:rotateEnter-283b2956 .7s;position:relative}.rotate-leave-active[data-v-283b2956]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-283b2956]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-283b2956]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-283b2956]{color:#f9ad1e}.notice_info li[data-v-283b2956]{font-size:14px;list-style:revert}.text-container[data-v-283b2956]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-283b2956]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-283b2956]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-283b2956]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-283b2956]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-283b2956]{width:100%}.text-container .text-container_item p.info-desc[data-v-283b2956]{width:100%;color:#999;font-size:14px}.page-container[data-v-283b2956]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-283b2956]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-283b2956]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-283b2956]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-283b2956],.page-container .page-flex .page-sidebar a[data-v-283b2956]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-283b2956]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-283b2956]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-283b2956]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-283b2956]{border-radius:0;padding:1rem}ul.ul-container[data-v-283b2956]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-283b2956]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-283b2956]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-283b2956]{width:100%}form.form-container[data-v-283b2956]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-283b2956]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-283b2956]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-283b2956]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-283b2956]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-283b2956],form.form-container .label-value select[data-v-283b2956]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-283b2956]:focus,form.form-container .label-value select[data-v-283b2956]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-283b2956]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-283b2956]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-283b2956],form.form-container .label-value input[type=radio][data-v-283b2956]{width:auto}form.form-container .label-value input[type=radio][data-v-283b2956]{margin:0 4px 0 0}form.form-container .label-value input[data-v-283b2956]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-283b2956]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-283b2956]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-283b2956]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-283b2956]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-283b2956]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-283b2956]:hover{background-color:#747474}form.form-container .label-msg[data-v-283b2956]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-283b2956]{color:#f9ad1e}form.form-container .label-flex[data-v-283b2956]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-283b2956]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-283b2956]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-283b2956]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-283b2956]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-283b2956]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-283b2956]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-283b2956],form.form-container1 .label-value select[data-v-283b2956]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-283b2956]:focus,form.form-container1 .label-value select[data-v-283b2956]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-283b2956]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-283b2956],form.form-container1 .label-value input[type=radio][data-v-283b2956]{width:auto}form.form-container1 .label-value input[type=radio][data-v-283b2956]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-283b2956]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-283b2956]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-283b2956]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-283b2956]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-283b2956]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-283b2956]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-283b2956]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-283b2956]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-283b2956]{color:#f9ad1e}form.form-container1 .label-flex[data-v-283b2956]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-283b2956]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-283b2956]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-283b2956]{width:100px}table.page-table th.checkbox[data-v-283b2956]{width:50px;text-align:center}table.page-table th.setting[data-v-283b2956]{width:100px;text-align:center}table.page-table thead[data-v-283b2956]{color:#909399}table.page-table thead tr[data-v-283b2956]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-283b2956]{padding:10px 16px}table.page-table tbody tr[data-v-283b2956]:hover{background-color:#eeee}table.page-table tbody tr[data-v-283b2956]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-283b2956]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-283b2956]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-283b2956]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-283b2956]{width:100px}table.popups-table th.checkbox[data-v-283b2956]{width:50px;text-align:center}table.popups-table th.setting[data-v-283b2956]{width:100px;text-align:center}table.popups-table thead[data-v-283b2956]{color:#eee}table.popups-table thead tr[data-v-283b2956]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-283b2956]{padding:10px 16px}table.popups-table tbody tr[data-v-283b2956]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-283b2956]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-283b2956]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-283b2956]{width:100%}header.header-desktop[data-v-283b2956]{display:block}header.header-mobile[data-v-283b2956]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-283b2956]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-283b2956]{width:100%;height:100%}header.header-mobile button svg path[data-v-283b2956]{fill:#fff}nav.sidebar[data-v-283b2956]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-283b2956]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-283b2956]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-283b2956]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-283b2956]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-283b2956]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-283b2956]{color:#fff}nav.sidebar .container .children[data-v-283b2956]{padding-left:30px}@-moz-keyframes tada-283b2956{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-283b2956{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-283b2956{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-283b2956{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-283b2956]{animation:dialogEnter-283b2956 .3s linear forwards}.dialog-leave-active[data-v-283b2956]{animation:dialogLeave-283b2956 .3s linear forwards}@keyframes dialogEnter-283b2956{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-283b2956{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-283b2956]{animation:dialogEnter-283b2956 .2s linear forwards}.dialog1-leave-active[data-v-283b2956]{animation:dialogLeave-283b2956 .2s linear forwards}@keyframes rotateEnter-283b2956{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-283b2956]{animation:rotateEnter-283b2956 .7s;position:relative}.rotate-leave-active[data-v-283b2956]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-283b2956{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-283b2956{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-283b2956]{animation:slideOutTop-283b2956 .5s linear forwards}.slide-top-leave-active[data-v-283b2956],.slide-bottom-enter-active[data-v-283b2956]{animation:slideOutBottom-283b2956 .5s linear forwards}@keyframes slideInLeft-283b2956{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-283b2956{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-283b2956]{animation:slideInLeft-283b2956 .3s linear forwards}.slide-left-leave-active[data-v-283b2956]{animation:slideInRight-283b2956 .3s linear forwards}@keyframes slideOutLeft-283b2956{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-283b2956{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-283b2956]{animation:slideOutLeft-283b2956 .3s linear forwards}.slide-right-leave-active[data-v-283b2956]{animation:slideOutRight-283b2956 .3s linear forwards}@keyframes bganimation-283b2956{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-283b2956{0%{height:0}to{height:100px}}@keyframes fadeEnd-283b2956{0%{height:100%}to{height:0}}.fade-enter-active[data-v-283b2956]{animation:fadeStart-283b2956 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-283b2956]{animation:fadeEnd-283b2956 .1s linear forwards;overflow:hidden}.app-store[data-v-283b2956]{width:100%;display:flex;justify-content:flex-start;flex-wrap:wrap;transition-duration:1s}.app-store>div.store[data-v-283b2956]{position:relative;padding:4px;width:40%;height:120px;cursor:pointer}.app-store>div.store>div[data-v-283b2956]{border-radius:12px;height:100%;width:100%;background:url(/luci-static/istorex/store@3x.png?v=01a7e93b) no-repeat;background-size:cover}.app-store>div.store>div>div[data-v-283b2956]{position:absolute;top:50%;left:32px;transform:translateY(-50%)}.app-store>div.store>div>div>span[data-v-283b2956]{width:100%;display:inline-block}.app-store>div.store>div>div>span[data-v-283b2956]:first-of-type{font-size:16px;font-weight:600}.app-store>div.store>div>div>span[data-v-283b2956]:last-of-type{margin-top:4px;color:#0000004d;font-size:16px}@media screen and (max-width: 668px){.app-store div.store[data-v-283b2956]{width:100%;height:138px}}@keyframes bganimation-43beecef{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-43beecef{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-43beecef{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-43beecef{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-43beecef{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-43beecef]{animation:slideInLeft-43beecef .3s linear forwards}.slide-left-leave-active[data-v-43beecef]{animation:slideInRight-43beecef .3s linear forwards}@keyframes slideOutLeft-43beecef{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-43beecef{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-43beecef]{animation:slideOutLeft-43beecef .3s linear forwards}.slide-right-leave-active[data-v-43beecef]{animation:slideOutRight-43beecef .3s linear forwards}.rotate-enter-active[data-v-43beecef]{animation:rotateEnter-43beecef .7s;position:relative}.rotate-leave-active[data-v-43beecef]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-43beecef]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-43beecef]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-43beecef]{color:#f9ad1e}.notice_info li[data-v-43beecef]{font-size:14px;list-style:revert}.text-container[data-v-43beecef]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-43beecef]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-43beecef]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-43beecef]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-43beecef]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-43beecef]{width:100%}.text-container .text-container_item p.info-desc[data-v-43beecef]{width:100%;color:#999;font-size:14px}.page-container[data-v-43beecef]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-43beecef]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-43beecef]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-43beecef]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-43beecef],.page-container .page-flex .page-sidebar a[data-v-43beecef]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-43beecef]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-43beecef]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-43beecef]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-43beecef]{border-radius:0;padding:1rem}ul.ul-container[data-v-43beecef]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-43beecef]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-43beecef]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-43beecef]{width:100%}form.form-container[data-v-43beecef]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-43beecef]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-43beecef]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-43beecef]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-43beecef]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-43beecef],form.form-container .label-value select[data-v-43beecef]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-43beecef]:focus,form.form-container .label-value select[data-v-43beecef]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-43beecef]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-43beecef]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-43beecef],form.form-container .label-value input[type=radio][data-v-43beecef]{width:auto}form.form-container .label-value input[type=radio][data-v-43beecef]{margin:0 4px 0 0}form.form-container .label-value input[data-v-43beecef]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-43beecef]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-43beecef]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-43beecef]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-43beecef]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-43beecef]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-43beecef]:hover{background-color:#747474}form.form-container .label-msg[data-v-43beecef]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-43beecef]{color:#f9ad1e}form.form-container .label-flex[data-v-43beecef]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-43beecef]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-43beecef]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-43beecef]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-43beecef]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-43beecef]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-43beecef]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-43beecef],form.form-container1 .label-value select[data-v-43beecef]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-43beecef]:focus,form.form-container1 .label-value select[data-v-43beecef]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-43beecef]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-43beecef],form.form-container1 .label-value input[type=radio][data-v-43beecef]{width:auto}form.form-container1 .label-value input[type=radio][data-v-43beecef]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-43beecef]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-43beecef]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-43beecef]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-43beecef]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-43beecef]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-43beecef]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-43beecef]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-43beecef]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-43beecef]{color:#f9ad1e}form.form-container1 .label-flex[data-v-43beecef]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-43beecef]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-43beecef]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-43beecef]{width:100px}table.page-table th.checkbox[data-v-43beecef]{width:50px;text-align:center}table.page-table th.setting[data-v-43beecef]{width:100px;text-align:center}table.page-table thead[data-v-43beecef]{color:#909399}table.page-table thead tr[data-v-43beecef]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-43beecef]{padding:10px 16px}table.page-table tbody tr[data-v-43beecef]:hover{background-color:#eeee}table.page-table tbody tr[data-v-43beecef]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-43beecef]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-43beecef]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-43beecef]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-43beecef]{width:100px}table.popups-table th.checkbox[data-v-43beecef]{width:50px;text-align:center}table.popups-table th.setting[data-v-43beecef]{width:100px;text-align:center}table.popups-table thead[data-v-43beecef]{color:#eee}table.popups-table thead tr[data-v-43beecef]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-43beecef]{padding:10px 16px}table.popups-table tbody tr[data-v-43beecef]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-43beecef]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-43beecef]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-43beecef]{width:100%}header.header-desktop[data-v-43beecef]{display:block}header.header-mobile[data-v-43beecef]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-43beecef]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-43beecef]{width:100%;height:100%}header.header-mobile button svg path[data-v-43beecef]{fill:#fff}nav.sidebar[data-v-43beecef]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-43beecef]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-43beecef]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-43beecef]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-43beecef]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-43beecef]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-43beecef]{color:#fff}nav.sidebar .container .children[data-v-43beecef]{padding-left:30px}@-moz-keyframes tada-43beecef{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-43beecef{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-43beecef{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-43beecef{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-43beecef]{animation:dialogEnter-43beecef .3s linear forwards}.dialog-leave-active[data-v-43beecef]{animation:dialogLeave-43beecef .3s linear forwards}@keyframes dialogEnter-43beecef{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-43beecef{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-43beecef]{animation:dialogEnter-43beecef .2s linear forwards}.dialog1-leave-active[data-v-43beecef]{animation:dialogLeave-43beecef .2s linear forwards}@keyframes rotateEnter-43beecef{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-43beecef]{animation:rotateEnter-43beecef .7s;position:relative}.rotate-leave-active[data-v-43beecef]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-43beecef{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-43beecef{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-43beecef]{animation:slideOutTop-43beecef .5s linear forwards}.slide-top-leave-active[data-v-43beecef],.slide-bottom-enter-active[data-v-43beecef]{animation:slideOutBottom-43beecef .5s linear forwards}@keyframes slideInLeft-43beecef{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-43beecef{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-43beecef]{animation:slideInLeft-43beecef .3s linear forwards}.slide-left-leave-active[data-v-43beecef]{animation:slideInRight-43beecef .3s linear forwards}@keyframes slideOutLeft-43beecef{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-43beecef{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-43beecef]{animation:slideOutLeft-43beecef .3s linear forwards}.slide-right-leave-active[data-v-43beecef]{animation:slideOutRight-43beecef .3s linear forwards}@keyframes bganimation-43beecef{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-43beecef{0%{height:0}to{height:100px}}@keyframes fadeEnd-43beecef{0%{height:100%}to{height:0}}.fade-enter-active[data-v-43beecef]{animation:fadeStart-43beecef .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-43beecef]{animation:fadeEnd-43beecef .1s linear forwards;overflow:hidden}h3[data-v-43beecef]{text-align:center;margin-bottom:20px}.label-item[data-v-43beecef]{display:flex;align-items:center;flex-wrap:wrap;margin:1rem 0;padding:0 30px}.label-item label[data-v-43beecef]{display:flex;flex-wrap:wrap;align-items:center;width:100%;height:26px;line-height:26px;cursor:pointer}.label-item label input[type=radio][data-v-43beecef]{top:0;right:0;vertical-align:middle}.label-item label span[data-v-43beecef]{font-size:14px;font-family:PingFangSC-Regular,PingFang SC;font-weight:400;color:#000000d4;display:inline-block;margin-left:10px}.label-item p.label_info[data-v-43beecef]{color:#999;font-size:12px;padding-left:24px;line-height:20px}.label-item .label-item_key[data-v-43beecef]{display:flex;flex-wrap:wrap;align-items:center}.label-item .label-item_key .ddnsto_serve[data-v-43beecef]{flex:0 0 100%;display:flex;justify-content:space-between;margin-bottom:14px}.label-item .label-item_key .ddnsto_serve_item[data-v-43beecef]{flex:0 0 100%;display:flex;justify-content:space-between}@keyframes bganimation-43dd65a2{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-43dd65a2{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-43dd65a2{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-43dd65a2{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-43dd65a2{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-43dd65a2]{animation:slideInLeft-43dd65a2 .3s linear forwards}.slide-left-leave-active[data-v-43dd65a2]{animation:slideInRight-43dd65a2 .3s linear forwards}@keyframes slideOutLeft-43dd65a2{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-43dd65a2{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-43dd65a2]{animation:slideOutLeft-43dd65a2 .3s linear forwards}.slide-right-leave-active[data-v-43dd65a2]{animation:slideOutRight-43dd65a2 .3s linear forwards}.rotate-enter-active[data-v-43dd65a2]{animation:rotateEnter-43dd65a2 .7s;position:relative}.rotate-leave-active[data-v-43dd65a2]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-43dd65a2]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-43dd65a2]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-43dd65a2]{color:#f9ad1e}.notice_info li[data-v-43dd65a2]{font-size:14px;list-style:revert}.text-container[data-v-43dd65a2]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-43dd65a2]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-43dd65a2]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-43dd65a2]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-43dd65a2]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-43dd65a2]{width:100%}.text-container .text-container_item p.info-desc[data-v-43dd65a2]{width:100%;color:#999;font-size:14px}.page-container[data-v-43dd65a2]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-43dd65a2]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-43dd65a2]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-43dd65a2]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-43dd65a2],.page-container .page-flex .page-sidebar a[data-v-43dd65a2]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-43dd65a2]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-43dd65a2]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-43dd65a2]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-43dd65a2]{border-radius:0;padding:1rem}ul.ul-container[data-v-43dd65a2]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-43dd65a2]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-43dd65a2]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-43dd65a2]{width:100%}form.form-container[data-v-43dd65a2]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-43dd65a2]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-43dd65a2]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-43dd65a2]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-43dd65a2]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-43dd65a2],form.form-container .label-value select[data-v-43dd65a2]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-43dd65a2]:focus,form.form-container .label-value select[data-v-43dd65a2]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-43dd65a2]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-43dd65a2]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-43dd65a2],form.form-container .label-value input[type=radio][data-v-43dd65a2]{width:auto}form.form-container .label-value input[type=radio][data-v-43dd65a2]{margin:0 4px 0 0}form.form-container .label-value input[data-v-43dd65a2]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-43dd65a2]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-43dd65a2]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-43dd65a2]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-43dd65a2]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-43dd65a2]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-43dd65a2]:hover{background-color:#747474}form.form-container .label-msg[data-v-43dd65a2]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-43dd65a2]{color:#f9ad1e}form.form-container .label-flex[data-v-43dd65a2]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-43dd65a2]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-43dd65a2]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-43dd65a2]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-43dd65a2]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-43dd65a2]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-43dd65a2]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-43dd65a2],form.form-container1 .label-value select[data-v-43dd65a2]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-43dd65a2]:focus,form.form-container1 .label-value select[data-v-43dd65a2]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-43dd65a2]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-43dd65a2],form.form-container1 .label-value input[type=radio][data-v-43dd65a2]{width:auto}form.form-container1 .label-value input[type=radio][data-v-43dd65a2]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-43dd65a2]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-43dd65a2]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-43dd65a2]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-43dd65a2]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-43dd65a2]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-43dd65a2]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-43dd65a2]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-43dd65a2]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-43dd65a2]{color:#f9ad1e}form.form-container1 .label-flex[data-v-43dd65a2]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-43dd65a2]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-43dd65a2]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-43dd65a2]{width:100px}table.page-table th.checkbox[data-v-43dd65a2]{width:50px;text-align:center}table.page-table th.setting[data-v-43dd65a2]{width:100px;text-align:center}table.page-table thead[data-v-43dd65a2]{color:#909399}table.page-table thead tr[data-v-43dd65a2]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-43dd65a2]{padding:10px 16px}table.page-table tbody tr[data-v-43dd65a2]:hover{background-color:#eeee}table.page-table tbody tr[data-v-43dd65a2]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-43dd65a2]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-43dd65a2]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-43dd65a2]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-43dd65a2]{width:100px}table.popups-table th.checkbox[data-v-43dd65a2]{width:50px;text-align:center}table.popups-table th.setting[data-v-43dd65a2]{width:100px;text-align:center}table.popups-table thead[data-v-43dd65a2]{color:#eee}table.popups-table thead tr[data-v-43dd65a2]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-43dd65a2]{padding:10px 16px}table.popups-table tbody tr[data-v-43dd65a2]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-43dd65a2]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-43dd65a2]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-43dd65a2]{width:100%}header.header-desktop[data-v-43dd65a2]{display:block}header.header-mobile[data-v-43dd65a2]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-43dd65a2]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-43dd65a2]{width:100%;height:100%}header.header-mobile button svg path[data-v-43dd65a2]{fill:#fff}nav.sidebar[data-v-43dd65a2]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-43dd65a2]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-43dd65a2]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-43dd65a2]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-43dd65a2]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-43dd65a2]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-43dd65a2]{color:#fff}nav.sidebar .container .children[data-v-43dd65a2]{padding-left:30px}@-moz-keyframes tada-43dd65a2{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-43dd65a2{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-43dd65a2{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-43dd65a2{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-43dd65a2]{animation:dialogEnter-43dd65a2 .3s linear forwards}.dialog-leave-active[data-v-43dd65a2]{animation:dialogLeave-43dd65a2 .3s linear forwards}@keyframes dialogEnter-43dd65a2{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-43dd65a2{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-43dd65a2]{animation:dialogEnter-43dd65a2 .2s linear forwards}.dialog1-leave-active[data-v-43dd65a2]{animation:dialogLeave-43dd65a2 .2s linear forwards}@keyframes rotateEnter-43dd65a2{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-43dd65a2]{animation:rotateEnter-43dd65a2 .7s;position:relative}.rotate-leave-active[data-v-43dd65a2]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-43dd65a2{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-43dd65a2{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-43dd65a2]{animation:slideOutTop-43dd65a2 .5s linear forwards}.slide-top-leave-active[data-v-43dd65a2],.slide-bottom-enter-active[data-v-43dd65a2]{animation:slideOutBottom-43dd65a2 .5s linear forwards}@keyframes slideInLeft-43dd65a2{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-43dd65a2{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-43dd65a2]{animation:slideInLeft-43dd65a2 .3s linear forwards}.slide-left-leave-active[data-v-43dd65a2]{animation:slideInRight-43dd65a2 .3s linear forwards}@keyframes slideOutLeft-43dd65a2{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-43dd65a2{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-43dd65a2]{animation:slideOutLeft-43dd65a2 .3s linear forwards}.slide-right-leave-active[data-v-43dd65a2]{animation:slideOutRight-43dd65a2 .3s linear forwards}@keyframes bganimation-43dd65a2{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-43dd65a2{0%{height:0}to{height:100px}}@keyframes fadeEnd-43dd65a2{0%{height:100%}to{height:0}}.fade-enter-active[data-v-43dd65a2]{animation:fadeStart-43dd65a2 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-43dd65a2]{animation:fadeEnd-43dd65a2 .1s linear forwards;overflow:hidden}.actioner-container_body[data-v-43dd65a2]{display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center}.actioner-container_body svg.icon[data-v-43dd65a2]{width:100px;height:100px}.actioner-container_body .body-title[data-v-43dd65a2]{width:100%;display:block;color:#1e1e1e;font-size:2em;padding:0;margin:1rem 0;text-align:center}.actioner-container_body .body-tips[data-v-43dd65a2]{text-align:center}.actioner-container_body .body-info[data-v-43dd65a2]{color:#666;font-size:1.3em;margin:1rem 0;width:100%;text-align:center}.actioner-container_body .body-tips[data-v-43dd65a2]{margin:1rem 0;display:block;width:100%}.actioner-container_body .body-btns[data-v-43dd65a2]{width:100%;margin-top:3rem}.actioner-container_body .body-btns button[data-v-43dd65a2]{display:block;width:100%!important;margin:.5rem 0}@keyframes bganimation-7790f1da{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-7790f1da{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-7790f1da{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-7790f1da{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-7790f1da{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-7790f1da]{animation:slideInLeft-7790f1da .3s linear forwards}.slide-left-leave-active[data-v-7790f1da]{animation:slideInRight-7790f1da .3s linear forwards}@keyframes slideOutLeft-7790f1da{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-7790f1da{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-7790f1da]{animation:slideOutLeft-7790f1da .3s linear forwards}.slide-right-leave-active[data-v-7790f1da]{animation:slideOutRight-7790f1da .3s linear forwards}.rotate-enter-active[data-v-7790f1da]{animation:rotateEnter-7790f1da .7s;position:relative}.rotate-leave-active[data-v-7790f1da]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-7790f1da]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-7790f1da]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-7790f1da]{color:#f9ad1e}.notice_info li[data-v-7790f1da]{font-size:14px;list-style:revert}.text-container[data-v-7790f1da]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-7790f1da]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-7790f1da]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-7790f1da]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-7790f1da]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-7790f1da]{width:100%}.text-container .text-container_item p.info-desc[data-v-7790f1da]{width:100%;color:#999;font-size:14px}.page-container[data-v-7790f1da]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-7790f1da]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-7790f1da]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-7790f1da]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-7790f1da],.page-container .page-flex .page-sidebar a[data-v-7790f1da]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-7790f1da]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-7790f1da]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-7790f1da]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-7790f1da]{border-radius:0;padding:1rem}ul.ul-container[data-v-7790f1da]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-7790f1da]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-7790f1da]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-7790f1da]{width:100%}form.form-container[data-v-7790f1da]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-7790f1da]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-7790f1da]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-7790f1da]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-7790f1da]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-7790f1da],form.form-container .label-value select[data-v-7790f1da]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-7790f1da]:focus,form.form-container .label-value select[data-v-7790f1da]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-7790f1da]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-7790f1da]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-7790f1da],form.form-container .label-value input[type=radio][data-v-7790f1da]{width:auto}form.form-container .label-value input[type=radio][data-v-7790f1da]{margin:0 4px 0 0}form.form-container .label-value input[data-v-7790f1da]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-7790f1da]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-7790f1da]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-7790f1da]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-7790f1da]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-7790f1da]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-7790f1da]:hover{background-color:#747474}form.form-container .label-msg[data-v-7790f1da]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-7790f1da]{color:#f9ad1e}form.form-container .label-flex[data-v-7790f1da]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-7790f1da]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-7790f1da]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-7790f1da]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-7790f1da]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-7790f1da]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-7790f1da]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-7790f1da],form.form-container1 .label-value select[data-v-7790f1da]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-7790f1da]:focus,form.form-container1 .label-value select[data-v-7790f1da]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-7790f1da]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-7790f1da],form.form-container1 .label-value input[type=radio][data-v-7790f1da]{width:auto}form.form-container1 .label-value input[type=radio][data-v-7790f1da]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-7790f1da]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-7790f1da]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-7790f1da]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-7790f1da]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-7790f1da]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-7790f1da]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-7790f1da]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-7790f1da]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-7790f1da]{color:#f9ad1e}form.form-container1 .label-flex[data-v-7790f1da]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-7790f1da]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-7790f1da]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-7790f1da]{width:100px}table.page-table th.checkbox[data-v-7790f1da]{width:50px;text-align:center}table.page-table th.setting[data-v-7790f1da]{width:100px;text-align:center}table.page-table thead[data-v-7790f1da]{color:#909399}table.page-table thead tr[data-v-7790f1da]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-7790f1da]{padding:10px 16px}table.page-table tbody tr[data-v-7790f1da]:hover{background-color:#eeee}table.page-table tbody tr[data-v-7790f1da]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-7790f1da]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-7790f1da]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-7790f1da]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-7790f1da]{width:100px}table.popups-table th.checkbox[data-v-7790f1da]{width:50px;text-align:center}table.popups-table th.setting[data-v-7790f1da]{width:100px;text-align:center}table.popups-table thead[data-v-7790f1da]{color:#eee}table.popups-table thead tr[data-v-7790f1da]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-7790f1da]{padding:10px 16px}table.popups-table tbody tr[data-v-7790f1da]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-7790f1da]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-7790f1da]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-7790f1da]{width:100%}header.header-desktop[data-v-7790f1da]{display:block}header.header-mobile[data-v-7790f1da]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-7790f1da]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-7790f1da]{width:100%;height:100%}header.header-mobile button svg path[data-v-7790f1da]{fill:#fff}nav.sidebar[data-v-7790f1da]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-7790f1da]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-7790f1da]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-7790f1da]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-7790f1da]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-7790f1da]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-7790f1da]{color:#fff}nav.sidebar .container .children[data-v-7790f1da]{padding-left:30px}@-moz-keyframes tada-7790f1da{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-7790f1da{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-7790f1da{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-7790f1da{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-7790f1da]{animation:dialogEnter-7790f1da .3s linear forwards}.dialog-leave-active[data-v-7790f1da]{animation:dialogLeave-7790f1da .3s linear forwards}@keyframes dialogEnter-7790f1da{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-7790f1da{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-7790f1da]{animation:dialogEnter-7790f1da .2s linear forwards}.dialog1-leave-active[data-v-7790f1da]{animation:dialogLeave-7790f1da .2s linear forwards}@keyframes rotateEnter-7790f1da{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-7790f1da]{animation:rotateEnter-7790f1da .7s;position:relative}.rotate-leave-active[data-v-7790f1da]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-7790f1da{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-7790f1da{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-7790f1da]{animation:slideOutTop-7790f1da .5s linear forwards}.slide-top-leave-active[data-v-7790f1da],.slide-bottom-enter-active[data-v-7790f1da]{animation:slideOutBottom-7790f1da .5s linear forwards}@keyframes slideInLeft-7790f1da{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-7790f1da{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-7790f1da]{animation:slideInLeft-7790f1da .3s linear forwards}.slide-left-leave-active[data-v-7790f1da]{animation:slideInRight-7790f1da .3s linear forwards}@keyframes slideOutLeft-7790f1da{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-7790f1da{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-7790f1da]{animation:slideOutLeft-7790f1da .3s linear forwards}.slide-right-leave-active[data-v-7790f1da]{animation:slideOutRight-7790f1da .3s linear forwards}@keyframes bganimation-7790f1da{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-7790f1da{0%{height:0}to{height:100px}}@keyframes fadeEnd-7790f1da{0%{height:100%}to{height:0}}.fade-enter-active[data-v-7790f1da]{animation:fadeStart-7790f1da .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-7790f1da]{animation:fadeEnd-7790f1da .1s linear forwards;overflow:hidden}iframe[data-v-7790f1da]{width:100%;height:100%;border:none}@keyframes bganimation-5baf4b05{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-5baf4b05{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-5baf4b05{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-5baf4b05{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-5baf4b05{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-5baf4b05]{animation:slideInLeft-5baf4b05 .3s linear forwards}.slide-left-leave-active[data-v-5baf4b05]{animation:slideInRight-5baf4b05 .3s linear forwards}@keyframes slideOutLeft-5baf4b05{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-5baf4b05{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-5baf4b05]{animation:slideOutLeft-5baf4b05 .3s linear forwards}.slide-right-leave-active[data-v-5baf4b05]{animation:slideOutRight-5baf4b05 .3s linear forwards}.rotate-enter-active[data-v-5baf4b05]{animation:rotateEnter-5baf4b05 .7s;position:relative}.rotate-leave-active[data-v-5baf4b05]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-5baf4b05]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-5baf4b05]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-5baf4b05]{color:#f9ad1e}.notice_info li[data-v-5baf4b05]{font-size:14px;list-style:revert}.text-container[data-v-5baf4b05]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-5baf4b05]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-5baf4b05]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-5baf4b05]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-5baf4b05]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-5baf4b05]{width:100%}.text-container .text-container_item p.info-desc[data-v-5baf4b05]{width:100%;color:#999;font-size:14px}.page-container[data-v-5baf4b05]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-5baf4b05]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-5baf4b05]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-5baf4b05]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-5baf4b05],.page-container .page-flex .page-sidebar a[data-v-5baf4b05]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5baf4b05]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5baf4b05]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-5baf4b05]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-5baf4b05]{border-radius:0;padding:1rem}ul.ul-container[data-v-5baf4b05]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-5baf4b05]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-5baf4b05]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-5baf4b05]{width:100%}form.form-container[data-v-5baf4b05]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-5baf4b05]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-5baf4b05]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-5baf4b05]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-5baf4b05]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-5baf4b05],form.form-container .label-value select[data-v-5baf4b05]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-5baf4b05]:focus,form.form-container .label-value select[data-v-5baf4b05]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-5baf4b05]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-5baf4b05]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-5baf4b05],form.form-container .label-value input[type=radio][data-v-5baf4b05]{width:auto}form.form-container .label-value input[type=radio][data-v-5baf4b05]{margin:0 4px 0 0}form.form-container .label-value input[data-v-5baf4b05]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-5baf4b05]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5baf4b05]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5baf4b05]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-5baf4b05]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-5baf4b05]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-5baf4b05]:hover{background-color:#747474}form.form-container .label-msg[data-v-5baf4b05]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-5baf4b05]{color:#f9ad1e}form.form-container .label-flex[data-v-5baf4b05]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-5baf4b05]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-5baf4b05]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-5baf4b05]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-5baf4b05]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-5baf4b05]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-5baf4b05]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-5baf4b05],form.form-container1 .label-value select[data-v-5baf4b05]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-5baf4b05]:focus,form.form-container1 .label-value select[data-v-5baf4b05]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-5baf4b05]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-5baf4b05],form.form-container1 .label-value input[type=radio][data-v-5baf4b05]{width:auto}form.form-container1 .label-value input[type=radio][data-v-5baf4b05]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-5baf4b05]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-5baf4b05]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5baf4b05]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5baf4b05]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-5baf4b05]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-5baf4b05]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-5baf4b05]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-5baf4b05]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-5baf4b05]{color:#f9ad1e}form.form-container1 .label-flex[data-v-5baf4b05]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-5baf4b05]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-5baf4b05]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-5baf4b05]{width:100px}table.page-table th.checkbox[data-v-5baf4b05]{width:50px;text-align:center}table.page-table th.setting[data-v-5baf4b05]{width:100px;text-align:center}table.page-table thead[data-v-5baf4b05]{color:#909399}table.page-table thead tr[data-v-5baf4b05]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-5baf4b05]{padding:10px 16px}table.page-table tbody tr[data-v-5baf4b05]:hover{background-color:#eeee}table.page-table tbody tr[data-v-5baf4b05]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-5baf4b05]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-5baf4b05]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-5baf4b05]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-5baf4b05]{width:100px}table.popups-table th.checkbox[data-v-5baf4b05]{width:50px;text-align:center}table.popups-table th.setting[data-v-5baf4b05]{width:100px;text-align:center}table.popups-table thead[data-v-5baf4b05]{color:#eee}table.popups-table thead tr[data-v-5baf4b05]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-5baf4b05]{padding:10px 16px}table.popups-table tbody tr[data-v-5baf4b05]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-5baf4b05]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-5baf4b05]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-5baf4b05]{width:100%}header.header-desktop[data-v-5baf4b05]{display:block}header.header-mobile[data-v-5baf4b05]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-5baf4b05]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-5baf4b05]{width:100%;height:100%}header.header-mobile button svg path[data-v-5baf4b05]{fill:#fff}nav.sidebar[data-v-5baf4b05]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-5baf4b05]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-5baf4b05]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-5baf4b05]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-5baf4b05]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-5baf4b05]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-5baf4b05]{color:#fff}nav.sidebar .container .children[data-v-5baf4b05]{padding-left:30px}@-moz-keyframes tada-5baf4b05{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-5baf4b05{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-5baf4b05{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-5baf4b05{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-5baf4b05]{animation:dialogEnter-5baf4b05 .3s linear forwards}.dialog-leave-active[data-v-5baf4b05]{animation:dialogLeave-5baf4b05 .3s linear forwards}@keyframes dialogEnter-5baf4b05{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-5baf4b05{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-5baf4b05]{animation:dialogEnter-5baf4b05 .2s linear forwards}.dialog1-leave-active[data-v-5baf4b05]{animation:dialogLeave-5baf4b05 .2s linear forwards}@keyframes rotateEnter-5baf4b05{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-5baf4b05]{animation:rotateEnter-5baf4b05 .7s;position:relative}.rotate-leave-active[data-v-5baf4b05]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-5baf4b05{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-5baf4b05{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-5baf4b05]{animation:slideOutTop-5baf4b05 .5s linear forwards}.slide-top-leave-active[data-v-5baf4b05],.slide-bottom-enter-active[data-v-5baf4b05]{animation:slideOutBottom-5baf4b05 .5s linear forwards}@keyframes slideInLeft-5baf4b05{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-5baf4b05{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-5baf4b05]{animation:slideInLeft-5baf4b05 .3s linear forwards}.slide-left-leave-active[data-v-5baf4b05]{animation:slideInRight-5baf4b05 .3s linear forwards}@keyframes slideOutLeft-5baf4b05{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-5baf4b05{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-5baf4b05]{animation:slideOutLeft-5baf4b05 .3s linear forwards}.slide-right-leave-active[data-v-5baf4b05]{animation:slideOutRight-5baf4b05 .3s linear forwards}@keyframes bganimation-5baf4b05{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-5baf4b05{0%{height:0}to{height:100px}}@keyframes fadeEnd-5baf4b05{0%{height:100%}to{height:0}}.fade-enter-active[data-v-5baf4b05]{animation:fadeStart-5baf4b05 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-5baf4b05]{animation:fadeEnd-5baf4b05 .1s linear forwards;overflow:hidden}iframe[data-v-5baf4b05]{width:100%;height:100%;border:none}@keyframes bganimation-02a6c9d8{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-02a6c9d8{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-02a6c9d8{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-02a6c9d8{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-02a6c9d8{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-02a6c9d8]{animation:slideInLeft-02a6c9d8 .3s linear forwards}.slide-left-leave-active[data-v-02a6c9d8]{animation:slideInRight-02a6c9d8 .3s linear forwards}@keyframes slideOutLeft-02a6c9d8{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-02a6c9d8{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-02a6c9d8]{animation:slideOutLeft-02a6c9d8 .3s linear forwards}.slide-right-leave-active[data-v-02a6c9d8]{animation:slideOutRight-02a6c9d8 .3s linear forwards}.rotate-enter-active[data-v-02a6c9d8]{animation:rotateEnter-02a6c9d8 .7s;position:relative}.rotate-leave-active[data-v-02a6c9d8]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-02a6c9d8]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-02a6c9d8]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-02a6c9d8]{color:#f9ad1e}.notice_info li[data-v-02a6c9d8]{font-size:14px;list-style:revert}.text-container[data-v-02a6c9d8]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-02a6c9d8]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-02a6c9d8]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-02a6c9d8]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-02a6c9d8]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-02a6c9d8]{width:100%}.text-container .text-container_item p.info-desc[data-v-02a6c9d8]{width:100%;color:#999;font-size:14px}.page-container[data-v-02a6c9d8]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-02a6c9d8]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-02a6c9d8]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-02a6c9d8]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-02a6c9d8],.page-container .page-flex .page-sidebar a[data-v-02a6c9d8]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-02a6c9d8]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-02a6c9d8]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-02a6c9d8]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-02a6c9d8]{border-radius:0;padding:1rem}ul.ul-container[data-v-02a6c9d8]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-02a6c9d8]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-02a6c9d8]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-02a6c9d8]{width:100%}form.form-container[data-v-02a6c9d8]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-02a6c9d8]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-02a6c9d8]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-02a6c9d8]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-02a6c9d8]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-02a6c9d8],form.form-container .label-value select[data-v-02a6c9d8]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-02a6c9d8]:focus,form.form-container .label-value select[data-v-02a6c9d8]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-02a6c9d8]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-02a6c9d8]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-02a6c9d8],form.form-container .label-value input[type=radio][data-v-02a6c9d8]{width:auto}form.form-container .label-value input[type=radio][data-v-02a6c9d8]{margin:0 4px 0 0}form.form-container .label-value input[data-v-02a6c9d8]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-02a6c9d8]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-02a6c9d8]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-02a6c9d8]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-02a6c9d8]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-02a6c9d8]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-02a6c9d8]:hover{background-color:#747474}form.form-container .label-msg[data-v-02a6c9d8]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-02a6c9d8]{color:#f9ad1e}form.form-container .label-flex[data-v-02a6c9d8]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-02a6c9d8]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-02a6c9d8]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-02a6c9d8]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-02a6c9d8]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-02a6c9d8]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-02a6c9d8]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-02a6c9d8],form.form-container1 .label-value select[data-v-02a6c9d8]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-02a6c9d8]:focus,form.form-container1 .label-value select[data-v-02a6c9d8]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-02a6c9d8]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-02a6c9d8],form.form-container1 .label-value input[type=radio][data-v-02a6c9d8]{width:auto}form.form-container1 .label-value input[type=radio][data-v-02a6c9d8]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-02a6c9d8]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-02a6c9d8]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-02a6c9d8]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-02a6c9d8]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-02a6c9d8]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-02a6c9d8]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-02a6c9d8]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-02a6c9d8]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-02a6c9d8]{color:#f9ad1e}form.form-container1 .label-flex[data-v-02a6c9d8]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-02a6c9d8]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-02a6c9d8]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-02a6c9d8]{width:100px}table.page-table th.checkbox[data-v-02a6c9d8]{width:50px;text-align:center}table.page-table th.setting[data-v-02a6c9d8]{width:100px;text-align:center}table.page-table thead[data-v-02a6c9d8]{color:#909399}table.page-table thead tr[data-v-02a6c9d8]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-02a6c9d8]{padding:10px 16px}table.page-table tbody tr[data-v-02a6c9d8]:hover{background-color:#eeee}table.page-table tbody tr[data-v-02a6c9d8]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-02a6c9d8]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-02a6c9d8]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-02a6c9d8]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-02a6c9d8]{width:100px}table.popups-table th.checkbox[data-v-02a6c9d8]{width:50px;text-align:center}table.popups-table th.setting[data-v-02a6c9d8]{width:100px;text-align:center}table.popups-table thead[data-v-02a6c9d8]{color:#eee}table.popups-table thead tr[data-v-02a6c9d8]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-02a6c9d8]{padding:10px 16px}table.popups-table tbody tr[data-v-02a6c9d8]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-02a6c9d8]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-02a6c9d8]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-02a6c9d8]{width:100%}header.header-desktop[data-v-02a6c9d8]{display:block}header.header-mobile[data-v-02a6c9d8]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-02a6c9d8]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-02a6c9d8]{width:100%;height:100%}header.header-mobile button svg path[data-v-02a6c9d8]{fill:#fff}nav.sidebar[data-v-02a6c9d8]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-02a6c9d8]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-02a6c9d8]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-02a6c9d8]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-02a6c9d8]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-02a6c9d8]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-02a6c9d8]{color:#fff}nav.sidebar .container .children[data-v-02a6c9d8]{padding-left:30px}@-moz-keyframes tada-02a6c9d8{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-02a6c9d8{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-02a6c9d8{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-02a6c9d8{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-02a6c9d8]{animation:dialogEnter-02a6c9d8 .3s linear forwards}.dialog-leave-active[data-v-02a6c9d8]{animation:dialogLeave-02a6c9d8 .3s linear forwards}@keyframes dialogEnter-02a6c9d8{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-02a6c9d8{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-02a6c9d8]{animation:dialogEnter-02a6c9d8 .2s linear forwards}.dialog1-leave-active[data-v-02a6c9d8]{animation:dialogLeave-02a6c9d8 .2s linear forwards}@keyframes rotateEnter-02a6c9d8{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-02a6c9d8]{animation:rotateEnter-02a6c9d8 .7s;position:relative}.rotate-leave-active[data-v-02a6c9d8]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-02a6c9d8{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-02a6c9d8{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-02a6c9d8]{animation:slideOutTop-02a6c9d8 .5s linear forwards}.slide-top-leave-active[data-v-02a6c9d8],.slide-bottom-enter-active[data-v-02a6c9d8]{animation:slideOutBottom-02a6c9d8 .5s linear forwards}@keyframes slideInLeft-02a6c9d8{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-02a6c9d8{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-02a6c9d8]{animation:slideInLeft-02a6c9d8 .3s linear forwards}.slide-left-leave-active[data-v-02a6c9d8]{animation:slideInRight-02a6c9d8 .3s linear forwards}@keyframes slideOutLeft-02a6c9d8{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-02a6c9d8{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-02a6c9d8]{animation:slideOutLeft-02a6c9d8 .3s linear forwards}.slide-right-leave-active[data-v-02a6c9d8]{animation:slideOutRight-02a6c9d8 .3s linear forwards}@keyframes bganimation-02a6c9d8{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-02a6c9d8{0%{height:0}to{height:100px}}@keyframes fadeEnd-02a6c9d8{0%{height:100%}to{height:0}}.fade-enter-active[data-v-02a6c9d8]{animation:fadeStart-02a6c9d8 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-02a6c9d8]{animation:fadeEnd-02a6c9d8 .1s linear forwards;overflow:hidden}.actioner-container_body[data-v-02a6c9d8]{display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center}.actioner-container_body svg.icon[data-v-02a6c9d8]{width:100px;height:100px}.actioner-container_body .body-title[data-v-02a6c9d8]{width:100%;display:block;color:#1e1e1e;font-size:2em;padding:0;margin:1rem 0;text-align:center}.actioner-container_body .body-info[data-v-02a6c9d8]{color:#666;font-size:1.3em;margin:1rem 0;width:100%}.actioner-container_body .body-tips[data-v-02a6c9d8]{margin:1rem 0;display:block;width:100%}.actioner-container_body .body-btns[data-v-02a6c9d8]{width:100%;margin-top:3rem}.actioner-container_body .body-btns button[data-v-02a6c9d8]{display:block;width:100%!important;margin:.5rem 0}@keyframes bganimation-4f87c1d1{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-4f87c1d1{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-4f87c1d1{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-4f87c1d1{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-4f87c1d1{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-4f87c1d1]{animation:slideInLeft-4f87c1d1 .3s linear forwards}.slide-left-leave-active[data-v-4f87c1d1]{animation:slideInRight-4f87c1d1 .3s linear forwards}@keyframes slideOutLeft-4f87c1d1{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-4f87c1d1{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-4f87c1d1]{animation:slideOutLeft-4f87c1d1 .3s linear forwards}.slide-right-leave-active[data-v-4f87c1d1]{animation:slideOutRight-4f87c1d1 .3s linear forwards}.rotate-enter-active[data-v-4f87c1d1]{animation:rotateEnter-4f87c1d1 .7s;position:relative}.rotate-leave-active[data-v-4f87c1d1]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-4f87c1d1]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-4f87c1d1]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-4f87c1d1]{color:#f9ad1e}.notice_info li[data-v-4f87c1d1]{font-size:14px;list-style:revert}.text-container[data-v-4f87c1d1]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-4f87c1d1]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-4f87c1d1]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-4f87c1d1]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-4f87c1d1]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-4f87c1d1]{width:100%}.text-container .text-container_item p.info-desc[data-v-4f87c1d1]{width:100%;color:#999;font-size:14px}.page-container[data-v-4f87c1d1]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-4f87c1d1]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-4f87c1d1]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-4f87c1d1]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-4f87c1d1],.page-container .page-flex .page-sidebar a[data-v-4f87c1d1]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-4f87c1d1]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-4f87c1d1]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-4f87c1d1]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-4f87c1d1]{border-radius:0;padding:1rem}ul.ul-container[data-v-4f87c1d1]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-4f87c1d1]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-4f87c1d1]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-4f87c1d1]{width:100%}form.form-container[data-v-4f87c1d1]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-4f87c1d1]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-4f87c1d1]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-4f87c1d1]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-4f87c1d1]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-4f87c1d1],form.form-container .label-value select[data-v-4f87c1d1]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-4f87c1d1]:focus,form.form-container .label-value select[data-v-4f87c1d1]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-4f87c1d1]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-4f87c1d1]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-4f87c1d1],form.form-container .label-value input[type=radio][data-v-4f87c1d1]{width:auto}form.form-container .label-value input[type=radio][data-v-4f87c1d1]{margin:0 4px 0 0}form.form-container .label-value input[data-v-4f87c1d1]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-4f87c1d1]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-4f87c1d1]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-4f87c1d1]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-4f87c1d1]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-4f87c1d1]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-4f87c1d1]:hover{background-color:#747474}form.form-container .label-msg[data-v-4f87c1d1]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-4f87c1d1]{color:#f9ad1e}form.form-container .label-flex[data-v-4f87c1d1]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-4f87c1d1]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-4f87c1d1]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-4f87c1d1]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-4f87c1d1]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-4f87c1d1]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-4f87c1d1]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-4f87c1d1],form.form-container1 .label-value select[data-v-4f87c1d1]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-4f87c1d1]:focus,form.form-container1 .label-value select[data-v-4f87c1d1]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-4f87c1d1]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-4f87c1d1],form.form-container1 .label-value input[type=radio][data-v-4f87c1d1]{width:auto}form.form-container1 .label-value input[type=radio][data-v-4f87c1d1]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-4f87c1d1]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-4f87c1d1]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-4f87c1d1]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-4f87c1d1]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-4f87c1d1]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-4f87c1d1]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-4f87c1d1]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-4f87c1d1]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-4f87c1d1]{color:#f9ad1e}form.form-container1 .label-flex[data-v-4f87c1d1]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-4f87c1d1]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-4f87c1d1]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-4f87c1d1]{width:100px}table.page-table th.checkbox[data-v-4f87c1d1]{width:50px;text-align:center}table.page-table th.setting[data-v-4f87c1d1]{width:100px;text-align:center}table.page-table thead[data-v-4f87c1d1]{color:#909399}table.page-table thead tr[data-v-4f87c1d1]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-4f87c1d1]{padding:10px 16px}table.page-table tbody tr[data-v-4f87c1d1]:hover{background-color:#eeee}table.page-table tbody tr[data-v-4f87c1d1]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-4f87c1d1]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-4f87c1d1]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-4f87c1d1]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-4f87c1d1]{width:100px}table.popups-table th.checkbox[data-v-4f87c1d1]{width:50px;text-align:center}table.popups-table th.setting[data-v-4f87c1d1]{width:100px;text-align:center}table.popups-table thead[data-v-4f87c1d1]{color:#eee}table.popups-table thead tr[data-v-4f87c1d1]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-4f87c1d1]{padding:10px 16px}table.popups-table tbody tr[data-v-4f87c1d1]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-4f87c1d1]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-4f87c1d1]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-4f87c1d1]{width:100%}header.header-desktop[data-v-4f87c1d1]{display:block}header.header-mobile[data-v-4f87c1d1]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-4f87c1d1]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-4f87c1d1]{width:100%;height:100%}header.header-mobile button svg path[data-v-4f87c1d1]{fill:#fff}nav.sidebar[data-v-4f87c1d1]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-4f87c1d1]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-4f87c1d1]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-4f87c1d1]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-4f87c1d1]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-4f87c1d1]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-4f87c1d1]{color:#fff}nav.sidebar .container .children[data-v-4f87c1d1]{padding-left:30px}@-moz-keyframes tada-4f87c1d1{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-4f87c1d1{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-4f87c1d1{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-4f87c1d1{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-4f87c1d1]{animation:dialogEnter-4f87c1d1 .3s linear forwards}.dialog-leave-active[data-v-4f87c1d1]{animation:dialogLeave-4f87c1d1 .3s linear forwards}@keyframes dialogEnter-4f87c1d1{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-4f87c1d1{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-4f87c1d1]{animation:dialogEnter-4f87c1d1 .2s linear forwards}.dialog1-leave-active[data-v-4f87c1d1]{animation:dialogLeave-4f87c1d1 .2s linear forwards}@keyframes rotateEnter-4f87c1d1{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-4f87c1d1]{animation:rotateEnter-4f87c1d1 .7s;position:relative}.rotate-leave-active[data-v-4f87c1d1]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-4f87c1d1{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-4f87c1d1{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-4f87c1d1]{animation:slideOutTop-4f87c1d1 .5s linear forwards}.slide-top-leave-active[data-v-4f87c1d1],.slide-bottom-enter-active[data-v-4f87c1d1]{animation:slideOutBottom-4f87c1d1 .5s linear forwards}@keyframes slideInLeft-4f87c1d1{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-4f87c1d1{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-4f87c1d1]{animation:slideInLeft-4f87c1d1 .3s linear forwards}.slide-left-leave-active[data-v-4f87c1d1]{animation:slideInRight-4f87c1d1 .3s linear forwards}@keyframes slideOutLeft-4f87c1d1{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-4f87c1d1{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-4f87c1d1]{animation:slideOutLeft-4f87c1d1 .3s linear forwards}.slide-right-leave-active[data-v-4f87c1d1]{animation:slideOutRight-4f87c1d1 .3s linear forwards}@keyframes bganimation-4f87c1d1{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-4f87c1d1{0%{height:0}to{height:100px}}@keyframes fadeEnd-4f87c1d1{0%{height:100%}to{height:0}}.fade-enter-active[data-v-4f87c1d1]{animation:fadeStart-4f87c1d1 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-4f87c1d1]{animation:fadeEnd-4f87c1d1 .1s linear forwards;overflow:hidden}.actioner-container_body[data-v-4f87c1d1]{display:flex;align-items:center;justify-content:center}@keyframes bganimation-06c9d91d{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-06c9d91d{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-06c9d91d{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-06c9d91d{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-06c9d91d{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-06c9d91d]{animation:slideInLeft-06c9d91d .3s linear forwards}.slide-left-leave-active[data-v-06c9d91d]{animation:slideInRight-06c9d91d .3s linear forwards}@keyframes slideOutLeft-06c9d91d{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-06c9d91d{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-06c9d91d]{animation:slideOutLeft-06c9d91d .3s linear forwards}.slide-right-leave-active[data-v-06c9d91d]{animation:slideOutRight-06c9d91d .3s linear forwards}.rotate-enter-active[data-v-06c9d91d]{animation:rotateEnter-06c9d91d .7s;position:relative}.rotate-leave-active[data-v-06c9d91d]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-06c9d91d]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-06c9d91d]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-06c9d91d]{color:#f9ad1e}.notice_info li[data-v-06c9d91d]{font-size:14px;list-style:revert}.text-container[data-v-06c9d91d]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-06c9d91d]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-06c9d91d]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-06c9d91d]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-06c9d91d]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-06c9d91d]{width:100%}.text-container .text-container_item p.info-desc[data-v-06c9d91d]{width:100%;color:#999;font-size:14px}.page-container[data-v-06c9d91d]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-06c9d91d]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-06c9d91d]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-06c9d91d]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-06c9d91d],.page-container .page-flex .page-sidebar a[data-v-06c9d91d]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-06c9d91d]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-06c9d91d]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-06c9d91d]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-06c9d91d]{border-radius:0;padding:1rem}ul.ul-container[data-v-06c9d91d]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-06c9d91d]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-06c9d91d]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-06c9d91d]{width:100%}form.form-container[data-v-06c9d91d]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-06c9d91d]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-06c9d91d]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-06c9d91d]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-06c9d91d]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-06c9d91d],form.form-container .label-value select[data-v-06c9d91d]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-06c9d91d]:focus,form.form-container .label-value select[data-v-06c9d91d]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-06c9d91d]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-06c9d91d]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-06c9d91d],form.form-container .label-value input[type=radio][data-v-06c9d91d]{width:auto}form.form-container .label-value input[type=radio][data-v-06c9d91d]{margin:0 4px 0 0}form.form-container .label-value input[data-v-06c9d91d]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-06c9d91d]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-06c9d91d]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-06c9d91d]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-06c9d91d]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-06c9d91d]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-06c9d91d]:hover{background-color:#747474}form.form-container .label-msg[data-v-06c9d91d]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-06c9d91d]{color:#f9ad1e}form.form-container .label-flex[data-v-06c9d91d]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-06c9d91d]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-06c9d91d]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-06c9d91d]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-06c9d91d]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-06c9d91d]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-06c9d91d]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-06c9d91d],form.form-container1 .label-value select[data-v-06c9d91d]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-06c9d91d]:focus,form.form-container1 .label-value select[data-v-06c9d91d]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-06c9d91d]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-06c9d91d],form.form-container1 .label-value input[type=radio][data-v-06c9d91d]{width:auto}form.form-container1 .label-value input[type=radio][data-v-06c9d91d]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-06c9d91d]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-06c9d91d]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-06c9d91d]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-06c9d91d]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-06c9d91d]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-06c9d91d]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-06c9d91d]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-06c9d91d]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-06c9d91d]{color:#f9ad1e}form.form-container1 .label-flex[data-v-06c9d91d]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-06c9d91d]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-06c9d91d]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-06c9d91d]{width:100px}table.page-table th.checkbox[data-v-06c9d91d]{width:50px;text-align:center}table.page-table th.setting[data-v-06c9d91d]{width:100px;text-align:center}table.page-table thead[data-v-06c9d91d]{color:#909399}table.page-table thead tr[data-v-06c9d91d]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-06c9d91d]{padding:10px 16px}table.page-table tbody tr[data-v-06c9d91d]:hover{background-color:#eeee}table.page-table tbody tr[data-v-06c9d91d]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-06c9d91d]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-06c9d91d]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-06c9d91d]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-06c9d91d]{width:100px}table.popups-table th.checkbox[data-v-06c9d91d]{width:50px;text-align:center}table.popups-table th.setting[data-v-06c9d91d]{width:100px;text-align:center}table.popups-table thead[data-v-06c9d91d]{color:#eee}table.popups-table thead tr[data-v-06c9d91d]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-06c9d91d]{padding:10px 16px}table.popups-table tbody tr[data-v-06c9d91d]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-06c9d91d]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-06c9d91d]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-06c9d91d]{width:100%}header.header-desktop[data-v-06c9d91d]{display:block}header.header-mobile[data-v-06c9d91d]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-06c9d91d]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-06c9d91d]{width:100%;height:100%}header.header-mobile button svg path[data-v-06c9d91d]{fill:#fff}nav.sidebar[data-v-06c9d91d]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-06c9d91d]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-06c9d91d]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-06c9d91d]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-06c9d91d]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-06c9d91d]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-06c9d91d]{color:#fff}nav.sidebar .container .children[data-v-06c9d91d]{padding-left:30px}@-moz-keyframes tada-06c9d91d{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-06c9d91d{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-06c9d91d{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-06c9d91d{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-06c9d91d]{animation:dialogEnter-06c9d91d .3s linear forwards}.dialog-leave-active[data-v-06c9d91d]{animation:dialogLeave-06c9d91d .3s linear forwards}@keyframes dialogEnter-06c9d91d{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-06c9d91d{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-06c9d91d]{animation:dialogEnter-06c9d91d .2s linear forwards}.dialog1-leave-active[data-v-06c9d91d]{animation:dialogLeave-06c9d91d .2s linear forwards}@keyframes rotateEnter-06c9d91d{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-06c9d91d]{animation:rotateEnter-06c9d91d .7s;position:relative}.rotate-leave-active[data-v-06c9d91d]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-06c9d91d{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-06c9d91d{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-06c9d91d]{animation:slideOutTop-06c9d91d .5s linear forwards}.slide-top-leave-active[data-v-06c9d91d],.slide-bottom-enter-active[data-v-06c9d91d]{animation:slideOutBottom-06c9d91d .5s linear forwards}@keyframes slideInLeft-06c9d91d{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-06c9d91d{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-06c9d91d]{animation:slideInLeft-06c9d91d .3s linear forwards}.slide-left-leave-active[data-v-06c9d91d]{animation:slideInRight-06c9d91d .3s linear forwards}@keyframes slideOutLeft-06c9d91d{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-06c9d91d{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-06c9d91d]{animation:slideOutLeft-06c9d91d .3s linear forwards}.slide-right-leave-active[data-v-06c9d91d]{animation:slideOutRight-06c9d91d .3s linear forwards}@keyframes bganimation-06c9d91d{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-06c9d91d{0%{height:0}to{height:100px}}@keyframes fadeEnd-06c9d91d{0%{height:100%}to{height:0}}.fade-enter-active[data-v-06c9d91d]{animation:fadeStart-06c9d91d .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-06c9d91d]{animation:fadeEnd-06c9d91d .1s linear forwards;overflow:hidden}.actioner-container_body[data-v-06c9d91d]{display:flex;align-items:center;justify-content:center}@keyframes bganimation-2b767e18{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-2b767e18{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-2b767e18{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-2b767e18{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-2b767e18{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-2b767e18]{animation:slideInLeft-2b767e18 .3s linear forwards}.slide-left-leave-active[data-v-2b767e18]{animation:slideInRight-2b767e18 .3s linear forwards}@keyframes slideOutLeft-2b767e18{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-2b767e18{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-2b767e18]{animation:slideOutLeft-2b767e18 .3s linear forwards}.slide-right-leave-active[data-v-2b767e18]{animation:slideOutRight-2b767e18 .3s linear forwards}.rotate-enter-active[data-v-2b767e18]{animation:rotateEnter-2b767e18 .7s;position:relative}.rotate-leave-active[data-v-2b767e18]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-2b767e18]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-2b767e18]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-2b767e18]{color:#f9ad1e}.notice_info li[data-v-2b767e18]{font-size:14px;list-style:revert}.text-container[data-v-2b767e18]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-2b767e18]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-2b767e18]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-2b767e18]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-2b767e18]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-2b767e18]{width:100%}.text-container .text-container_item p.info-desc[data-v-2b767e18]{width:100%;color:#999;font-size:14px}.page-container[data-v-2b767e18]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-2b767e18]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-2b767e18]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-2b767e18]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-2b767e18],.page-container .page-flex .page-sidebar a[data-v-2b767e18]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-2b767e18]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-2b767e18]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-2b767e18]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-2b767e18]{border-radius:0;padding:1rem}ul.ul-container[data-v-2b767e18]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-2b767e18]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-2b767e18]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-2b767e18]{width:100%}form.form-container[data-v-2b767e18]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-2b767e18]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-2b767e18]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-2b767e18]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-2b767e18]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-2b767e18],form.form-container .label-value select[data-v-2b767e18]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-2b767e18]:focus,form.form-container .label-value select[data-v-2b767e18]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-2b767e18]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-2b767e18]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-2b767e18],form.form-container .label-value input[type=radio][data-v-2b767e18]{width:auto}form.form-container .label-value input[type=radio][data-v-2b767e18]{margin:0 4px 0 0}form.form-container .label-value input[data-v-2b767e18]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-2b767e18]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-2b767e18]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-2b767e18]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-2b767e18]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-2b767e18]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-2b767e18]:hover{background-color:#747474}form.form-container .label-msg[data-v-2b767e18]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-2b767e18]{color:#f9ad1e}form.form-container .label-flex[data-v-2b767e18]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-2b767e18]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-2b767e18]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-2b767e18]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-2b767e18]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-2b767e18]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-2b767e18]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-2b767e18],form.form-container1 .label-value select[data-v-2b767e18]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-2b767e18]:focus,form.form-container1 .label-value select[data-v-2b767e18]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-2b767e18]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-2b767e18],form.form-container1 .label-value input[type=radio][data-v-2b767e18]{width:auto}form.form-container1 .label-value input[type=radio][data-v-2b767e18]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-2b767e18]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-2b767e18]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-2b767e18]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-2b767e18]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-2b767e18]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-2b767e18]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-2b767e18]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-2b767e18]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-2b767e18]{color:#f9ad1e}form.form-container1 .label-flex[data-v-2b767e18]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-2b767e18]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-2b767e18]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-2b767e18]{width:100px}table.page-table th.checkbox[data-v-2b767e18]{width:50px;text-align:center}table.page-table th.setting[data-v-2b767e18]{width:100px;text-align:center}table.page-table thead[data-v-2b767e18]{color:#909399}table.page-table thead tr[data-v-2b767e18]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-2b767e18]{padding:10px 16px}table.page-table tbody tr[data-v-2b767e18]:hover{background-color:#eeee}table.page-table tbody tr[data-v-2b767e18]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-2b767e18]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-2b767e18]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-2b767e18]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-2b767e18]{width:100px}table.popups-table th.checkbox[data-v-2b767e18]{width:50px;text-align:center}table.popups-table th.setting[data-v-2b767e18]{width:100px;text-align:center}table.popups-table thead[data-v-2b767e18]{color:#eee}table.popups-table thead tr[data-v-2b767e18]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-2b767e18]{padding:10px 16px}table.popups-table tbody tr[data-v-2b767e18]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-2b767e18]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-2b767e18]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-2b767e18]{width:100%}header.header-desktop[data-v-2b767e18]{display:block}header.header-mobile[data-v-2b767e18]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-2b767e18]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-2b767e18]{width:100%;height:100%}header.header-mobile button svg path[data-v-2b767e18]{fill:#fff}nav.sidebar[data-v-2b767e18]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-2b767e18]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-2b767e18]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-2b767e18]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-2b767e18]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-2b767e18]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-2b767e18]{color:#fff}nav.sidebar .container .children[data-v-2b767e18]{padding-left:30px}@-moz-keyframes tada-2b767e18{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-2b767e18{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-2b767e18{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-2b767e18{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-2b767e18]{animation:dialogEnter-2b767e18 .3s linear forwards}.dialog-leave-active[data-v-2b767e18]{animation:dialogLeave-2b767e18 .3s linear forwards}@keyframes dialogEnter-2b767e18{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-2b767e18{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-2b767e18]{animation:dialogEnter-2b767e18 .2s linear forwards}.dialog1-leave-active[data-v-2b767e18]{animation:dialogLeave-2b767e18 .2s linear forwards}@keyframes slideOutTop-2b767e18{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-2b767e18{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-2b767e18]{animation:slideOutTop-2b767e18 .5s linear forwards}.slide-top-leave-active[data-v-2b767e18],.slide-bottom-enter-active[data-v-2b767e18]{animation:slideOutBottom-2b767e18 .5s linear forwards}@keyframes fadeStart-2b767e18{0%{height:0}to{height:100px}}@keyframes fadeEnd-2b767e18{0%{height:100%}to{height:0}}.fade-enter-active[data-v-2b767e18]{animation:fadeStart-2b767e18 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-2b767e18]{animation:fadeEnd-2b767e18 .1s linear forwards;overflow:hidden}.action-main[data-v-2b767e18]{width:680px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.action-main[data-v-2b767e18] .actioner-container{width:100%}.action-main[data-v-2b767e18] .actioner-container .actioner-container_header{width:100%;height:50px;line-height:50px;display:flex;flex-wrap:wrap;align-items:center;font-size:20px;border-bottom:1px solid #eee;justify-content:center;padding:0 10px}.action-main[data-v-2b767e18] .actioner-container .actioner-container_footer{width:100%;height:50px;border-top:1px solid rgba(0,0,0,.06);display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:0 30px}.action-main[data-v-2b767e18] .actioner-container .actioner-container_footer button{display:inline-block;width:100px!important;margin:0;margin-left:1rem}.action-main[data-v-2b767e18] .actioner-container .actioner-container_footer .close{min-width:65px;font-weight:400;color:#0060ff;line-height:30px;text-align:center;cursor:pointer;height:32px;border-radius:2px;border:1px solid rgba(0,0,0,.15);font-size:14px;font-family:PingFangSC-Regular,PingFang SC;color:#000000d4;line-height:32px}.action-main[data-v-2b767e18] .actioner-container .actioner-container_footer .next{min-width:65px;line-height:32px;text-align:center;cursor:pointer;font-size:14px;font-family:PingFangSC-Regular,PingFang SC;font-weight:400;color:#fff;margin-left:20px;width:74px;height:32px;background:#553AFE;border-radius:2px}.action-main[data-v-2b767e18] .actioner-container .actioner-container_footer .next:hover,.action-main[data-v-2b767e18] .actioner-container .actioner-container_footer .close:hover{opacity:.9}.action-main[data-v-2b767e18] .actioner-container .actioner-container_body{padding:1rem;text-align:center;width:100%;height:400px}.action-main[data-v-2b767e18] .actioner-container .actioner-container_body a{text-decoration:none}.action-main[data-v-2b767e18] .actioner-container .actioner-container_body.ddnsto-bind{height:280px}@keyframes bganimation-2b767e18{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-2b767e18{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-2b767e18{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-2b767e18{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-2b767e18{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-2b767e18]{animation:slideInLeft-2b767e18 .3s linear forwards}.slide-left-leave-active[data-v-2b767e18]{animation:slideInRight-2b767e18 .3s linear forwards}@keyframes slideOutLeft-2b767e18{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-2b767e18{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-2b767e18]{animation:slideOutLeft-2b767e18 .3s linear forwards}.slide-right-leave-active[data-v-2b767e18]{animation:slideOutRight-2b767e18 .3s linear forwards}.rotate-enter-active[data-v-2b767e18]{animation:rotateEnter-2b767e18 .7s;position:relative}.rotate-leave-active[data-v-2b767e18]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-2b767e18]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-2b767e18]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-2b767e18]{color:#f9ad1e}.notice_info li[data-v-2b767e18]{font-size:14px;list-style:revert}.text-container[data-v-2b767e18]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-2b767e18]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-2b767e18]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-2b767e18]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-2b767e18]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-2b767e18]{width:100%}.text-container .text-container_item p.info-desc[data-v-2b767e18]{width:100%;color:#999;font-size:14px}.page-container[data-v-2b767e18]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-2b767e18]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-2b767e18]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-2b767e18]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-2b767e18],.page-container .page-flex .page-sidebar a[data-v-2b767e18]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-2b767e18]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-2b767e18]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-2b767e18]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-2b767e18]{border-radius:0;padding:1rem}ul.ul-container[data-v-2b767e18]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-2b767e18]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-2b767e18]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-2b767e18]{width:100%}form.form-container[data-v-2b767e18]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-2b767e18]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-2b767e18]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-2b767e18]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-2b767e18]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-2b767e18],form.form-container .label-value select[data-v-2b767e18]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-2b767e18]:focus,form.form-container .label-value select[data-v-2b767e18]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-2b767e18]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-2b767e18]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-2b767e18],form.form-container .label-value input[type=radio][data-v-2b767e18]{width:auto}form.form-container .label-value input[type=radio][data-v-2b767e18]{margin:0 4px 0 0}form.form-container .label-value input[data-v-2b767e18]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-2b767e18]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-2b767e18]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-2b767e18]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-2b767e18]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-2b767e18]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-2b767e18]:hover{background-color:#747474}form.form-container .label-msg[data-v-2b767e18]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-2b767e18]{color:#f9ad1e}form.form-container .label-flex[data-v-2b767e18]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-2b767e18]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-2b767e18]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-2b767e18]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-2b767e18]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-2b767e18]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-2b767e18]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-2b767e18],form.form-container1 .label-value select[data-v-2b767e18]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-2b767e18]:focus,form.form-container1 .label-value select[data-v-2b767e18]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-2b767e18]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-2b767e18],form.form-container1 .label-value input[type=radio][data-v-2b767e18]{width:auto}form.form-container1 .label-value input[type=radio][data-v-2b767e18]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-2b767e18]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-2b767e18]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-2b767e18]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-2b767e18]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-2b767e18]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-2b767e18]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-2b767e18]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-2b767e18]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-2b767e18]{color:#f9ad1e}form.form-container1 .label-flex[data-v-2b767e18]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-2b767e18]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-2b767e18]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-2b767e18]{width:100px}table.page-table th.checkbox[data-v-2b767e18]{width:50px;text-align:center}table.page-table th.setting[data-v-2b767e18]{width:100px;text-align:center}table.page-table thead[data-v-2b767e18]{color:#909399}table.page-table thead tr[data-v-2b767e18]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-2b767e18]{padding:10px 16px}table.page-table tbody tr[data-v-2b767e18]:hover{background-color:#eeee}table.page-table tbody tr[data-v-2b767e18]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-2b767e18]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-2b767e18]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-2b767e18]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-2b767e18]{width:100px}table.popups-table th.checkbox[data-v-2b767e18]{width:50px;text-align:center}table.popups-table th.setting[data-v-2b767e18]{width:100px;text-align:center}table.popups-table thead[data-v-2b767e18]{color:#eee}table.popups-table thead tr[data-v-2b767e18]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-2b767e18]{padding:10px 16px}table.popups-table tbody tr[data-v-2b767e18]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-2b767e18]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-2b767e18]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-2b767e18]{width:100%}header.header-desktop[data-v-2b767e18]{display:block}header.header-mobile[data-v-2b767e18]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-2b767e18]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-2b767e18]{width:100%;height:100%}header.header-mobile button svg path[data-v-2b767e18]{fill:#fff}nav.sidebar[data-v-2b767e18]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-2b767e18]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-2b767e18]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-2b767e18]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-2b767e18]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-2b767e18]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-2b767e18]{color:#fff}nav.sidebar .container .children[data-v-2b767e18]{padding-left:30px}@-moz-keyframes tada-2b767e18{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-2b767e18{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-2b767e18{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-2b767e18{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-2b767e18]{animation:dialogEnter-2b767e18 .3s linear forwards}.dialog-leave-active[data-v-2b767e18]{animation:dialogLeave-2b767e18 .3s linear forwards}@keyframes dialogEnter-2b767e18{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-2b767e18{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-2b767e18]{animation:dialogEnter-2b767e18 .2s linear forwards}.dialog1-leave-active[data-v-2b767e18]{animation:dialogLeave-2b767e18 .2s linear forwards}@keyframes rotateEnter-2b767e18{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-2b767e18]{animation:rotateEnter-2b767e18 .7s;position:relative}.rotate-leave-active[data-v-2b767e18]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-2b767e18{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-2b767e18{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-2b767e18]{animation:slideOutTop-2b767e18 .5s linear forwards}.slide-top-leave-active[data-v-2b767e18],.slide-bottom-enter-active[data-v-2b767e18]{animation:slideOutBottom-2b767e18 .5s linear forwards}@keyframes slideInLeft-2b767e18{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-2b767e18{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-2b767e18]{animation:slideInLeft-2b767e18 .3s linear forwards}.slide-left-leave-active[data-v-2b767e18]{animation:slideInRight-2b767e18 .3s linear forwards}@keyframes slideOutLeft-2b767e18{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-2b767e18{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-2b767e18]{animation:slideOutLeft-2b767e18 .3s linear forwards}.slide-right-leave-active[data-v-2b767e18]{animation:slideOutRight-2b767e18 .3s linear forwards}@keyframes bganimation-2b767e18{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-2b767e18{0%{height:0}to{height:100px}}@keyframes fadeEnd-2b767e18{0%{height:100%}to{height:0}}.fade-enter-active[data-v-2b767e18]{animation:fadeStart-2b767e18 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-2b767e18]{animation:fadeEnd-2b767e18 .1s linear forwards;overflow:hidden}@media screen and (max-width: 800px){.action-main[data-v-2b767e18]{width:90%}}@keyframes bganimation-4283f74c{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-4283f74c{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-4283f74c{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-4283f74c{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-4283f74c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-4283f74c]{animation:slideInLeft-4283f74c .3s linear forwards}.slide-left-leave-active[data-v-4283f74c]{animation:slideInRight-4283f74c .3s linear forwards}@keyframes slideOutLeft-4283f74c{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-4283f74c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-4283f74c]{animation:slideOutLeft-4283f74c .3s linear forwards}.slide-right-leave-active[data-v-4283f74c]{animation:slideOutRight-4283f74c .3s linear forwards}.rotate-enter-active[data-v-4283f74c]{animation:rotateEnter-4283f74c .7s;position:relative}.rotate-leave-active[data-v-4283f74c]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-4283f74c]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-4283f74c]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-4283f74c]{color:#f9ad1e}.notice_info li[data-v-4283f74c]{font-size:14px;list-style:revert}.text-container[data-v-4283f74c]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-4283f74c]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-4283f74c]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-4283f74c]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-4283f74c]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-4283f74c]{width:100%}.text-container .text-container_item p.info-desc[data-v-4283f74c]{width:100%;color:#999;font-size:14px}.page-container[data-v-4283f74c]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-4283f74c]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-4283f74c]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-4283f74c]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-4283f74c],.page-container .page-flex .page-sidebar a[data-v-4283f74c]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-4283f74c]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-4283f74c]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-4283f74c]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-4283f74c]{border-radius:0;padding:1rem}ul.ul-container[data-v-4283f74c]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-4283f74c]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-4283f74c]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-4283f74c]{width:100%}form.form-container[data-v-4283f74c]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-4283f74c]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-4283f74c]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-4283f74c]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-4283f74c]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-4283f74c],form.form-container .label-value select[data-v-4283f74c]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-4283f74c]:focus,form.form-container .label-value select[data-v-4283f74c]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-4283f74c]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-4283f74c]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-4283f74c],form.form-container .label-value input[type=radio][data-v-4283f74c]{width:auto}form.form-container .label-value input[type=radio][data-v-4283f74c]{margin:0 4px 0 0}form.form-container .label-value input[data-v-4283f74c]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-4283f74c]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-4283f74c]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-4283f74c]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-4283f74c]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-4283f74c]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-4283f74c]:hover{background-color:#747474}form.form-container .label-msg[data-v-4283f74c]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-4283f74c]{color:#f9ad1e}form.form-container .label-flex[data-v-4283f74c]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-4283f74c]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-4283f74c]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-4283f74c]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-4283f74c]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-4283f74c]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-4283f74c]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-4283f74c],form.form-container1 .label-value select[data-v-4283f74c]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-4283f74c]:focus,form.form-container1 .label-value select[data-v-4283f74c]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-4283f74c]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-4283f74c],form.form-container1 .label-value input[type=radio][data-v-4283f74c]{width:auto}form.form-container1 .label-value input[type=radio][data-v-4283f74c]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-4283f74c]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-4283f74c]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-4283f74c]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-4283f74c]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-4283f74c]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-4283f74c]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-4283f74c]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-4283f74c]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-4283f74c]{color:#f9ad1e}form.form-container1 .label-flex[data-v-4283f74c]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-4283f74c]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-4283f74c]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-4283f74c]{width:100px}table.page-table th.checkbox[data-v-4283f74c]{width:50px;text-align:center}table.page-table th.setting[data-v-4283f74c]{width:100px;text-align:center}table.page-table thead[data-v-4283f74c]{color:#909399}table.page-table thead tr[data-v-4283f74c]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-4283f74c]{padding:10px 16px}table.page-table tbody tr[data-v-4283f74c]:hover{background-color:#eeee}table.page-table tbody tr[data-v-4283f74c]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-4283f74c]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-4283f74c]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-4283f74c]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-4283f74c]{width:100px}table.popups-table th.checkbox[data-v-4283f74c]{width:50px;text-align:center}table.popups-table th.setting[data-v-4283f74c]{width:100px;text-align:center}table.popups-table thead[data-v-4283f74c]{color:#eee}table.popups-table thead tr[data-v-4283f74c]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-4283f74c]{padding:10px 16px}table.popups-table tbody tr[data-v-4283f74c]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-4283f74c]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-4283f74c]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-4283f74c]{width:100%}header.header-desktop[data-v-4283f74c]{display:block}header.header-mobile[data-v-4283f74c]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-4283f74c]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-4283f74c]{width:100%;height:100%}header.header-mobile button svg path[data-v-4283f74c]{fill:#fff}nav.sidebar[data-v-4283f74c]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-4283f74c]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-4283f74c]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-4283f74c]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-4283f74c]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-4283f74c]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-4283f74c]{color:#fff}nav.sidebar .container .children[data-v-4283f74c]{padding-left:30px}@-moz-keyframes tada-4283f74c{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-4283f74c{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-4283f74c{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-4283f74c{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-4283f74c]{animation:dialogEnter-4283f74c .3s linear forwards}.dialog-leave-active[data-v-4283f74c]{animation:dialogLeave-4283f74c .3s linear forwards}@keyframes dialogEnter-4283f74c{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-4283f74c{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-4283f74c]{animation:dialogEnter-4283f74c .2s linear forwards}.dialog1-leave-active[data-v-4283f74c]{animation:dialogLeave-4283f74c .2s linear forwards}@keyframes rotateEnter-4283f74c{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-4283f74c]{animation:rotateEnter-4283f74c .7s;position:relative}.rotate-leave-active[data-v-4283f74c]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-4283f74c{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-4283f74c{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-4283f74c]{animation:slideOutTop-4283f74c .5s linear forwards}.slide-top-leave-active[data-v-4283f74c],.slide-bottom-enter-active[data-v-4283f74c]{animation:slideOutBottom-4283f74c .5s linear forwards}@keyframes slideInLeft-4283f74c{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-4283f74c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-4283f74c]{animation:slideInLeft-4283f74c .3s linear forwards}.slide-left-leave-active[data-v-4283f74c]{animation:slideInRight-4283f74c .3s linear forwards}@keyframes slideOutLeft-4283f74c{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-4283f74c{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-4283f74c]{animation:slideOutLeft-4283f74c .3s linear forwards}.slide-right-leave-active[data-v-4283f74c]{animation:slideOutRight-4283f74c .3s linear forwards}@keyframes bganimation-4283f74c{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-4283f74c{0%{height:0}to{height:100px}}@keyframes fadeEnd-4283f74c{0%{height:100%}to{height:0}}.fade-enter-active[data-v-4283f74c]{animation:fadeStart-4283f74c .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-4283f74c]{animation:fadeEnd-4283f74c .1s linear forwards;overflow:hidden}.action[data-v-4283f74c]{width:500px;max-height:90%;background-color:#fff;position:relative;z-index:99999;margin:auto;border-radius:4px;padding:10px 0}.action .action-header[data-v-4283f74c]{width:100%;font-family:PingFangSC-Medium,PingFang SC;font-weight:500;padding-left:1rem;padding-right:1rem;text-align:left;font-size:18px;line-height:1;color:#303133}.action .action-body[data-v-4283f74c]{display:block;margin:2rem 0;line-height:24px;padding:0 15px;color:#606266;font-size:14px}.action .action-footer[data-v-4283f74c]{width:100%;height:50px;border-top:1px solid rgba(0,0,0,.06);display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:0 30px}.action .next[data-v-4283f74c]{min-width:65px;line-height:32px;text-align:center;cursor:pointer;font-size:14px;font-family:PingFangSC-Regular,PingFang SC;font-weight:400;color:#fff;margin-left:20px;width:120px;height:32px;background:#553afe;border-radius:2px}.action .next[data-v-4283f74c]:hover{opacity:.8}.action .clear[data-v-4283f74c]{min-width:65px;font-weight:400;line-height:30px;text-align:center;cursor:pointer;height:32px;border-radius:2px;border:1px solid rgba(0,0,0,.15);font-size:14px;font-family:PingFangSC-Regular,PingFang SC;color:#000000d4;line-height:32px}.action .clear[data-v-4283f74c]:hover{opacity:.8}@keyframes bganimation-b1e12544{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-b1e12544{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-b1e12544{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-b1e12544{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-b1e12544{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-b1e12544]{animation:slideInLeft-b1e12544 .3s linear forwards}.slide-left-leave-active[data-v-b1e12544]{animation:slideInRight-b1e12544 .3s linear forwards}@keyframes slideOutLeft-b1e12544{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-b1e12544{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-b1e12544]{animation:slideOutLeft-b1e12544 .3s linear forwards}.slide-right-leave-active[data-v-b1e12544]{animation:slideOutRight-b1e12544 .3s linear forwards}.rotate-enter-active[data-v-b1e12544]{animation:rotateEnter-b1e12544 .7s;position:relative}.rotate-leave-active[data-v-b1e12544]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-b1e12544]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-b1e12544]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-b1e12544]{color:#f9ad1e}.notice_info li[data-v-b1e12544]{font-size:14px;list-style:revert}.text-container[data-v-b1e12544]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-b1e12544]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-b1e12544]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-b1e12544]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-b1e12544]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-b1e12544]{width:100%}.text-container .text-container_item p.info-desc[data-v-b1e12544]{width:100%;color:#999;font-size:14px}.page-container[data-v-b1e12544]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-b1e12544]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-b1e12544]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-b1e12544]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-b1e12544],.page-container .page-flex .page-sidebar a[data-v-b1e12544]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-b1e12544]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-b1e12544]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-b1e12544]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-b1e12544]{border-radius:0;padding:1rem}ul.ul-container[data-v-b1e12544]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-b1e12544]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-b1e12544]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-b1e12544]{width:100%}form.form-container[data-v-b1e12544]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-b1e12544]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-b1e12544]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-b1e12544]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-b1e12544]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-b1e12544],form.form-container .label-value select[data-v-b1e12544]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-b1e12544]:focus,form.form-container .label-value select[data-v-b1e12544]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-b1e12544]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-b1e12544]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-b1e12544],form.form-container .label-value input[type=radio][data-v-b1e12544]{width:auto}form.form-container .label-value input[type=radio][data-v-b1e12544]{margin:0 4px 0 0}form.form-container .label-value input[data-v-b1e12544]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-b1e12544]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-b1e12544]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-b1e12544]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-b1e12544]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-b1e12544]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-b1e12544]:hover{background-color:#747474}form.form-container .label-msg[data-v-b1e12544]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-b1e12544]{color:#f9ad1e}form.form-container .label-flex[data-v-b1e12544]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-b1e12544]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-b1e12544]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-b1e12544]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-b1e12544]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-b1e12544]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-b1e12544]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-b1e12544],form.form-container1 .label-value select[data-v-b1e12544]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-b1e12544]:focus,form.form-container1 .label-value select[data-v-b1e12544]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-b1e12544]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-b1e12544],form.form-container1 .label-value input[type=radio][data-v-b1e12544]{width:auto}form.form-container1 .label-value input[type=radio][data-v-b1e12544]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-b1e12544]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-b1e12544]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-b1e12544]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-b1e12544]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-b1e12544]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-b1e12544]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-b1e12544]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-b1e12544]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-b1e12544]{color:#f9ad1e}form.form-container1 .label-flex[data-v-b1e12544]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-b1e12544]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-b1e12544]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-b1e12544]{width:100px}table.page-table th.checkbox[data-v-b1e12544]{width:50px;text-align:center}table.page-table th.setting[data-v-b1e12544]{width:100px;text-align:center}table.page-table thead[data-v-b1e12544]{color:#909399}table.page-table thead tr[data-v-b1e12544]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-b1e12544]{padding:10px 16px}table.page-table tbody tr[data-v-b1e12544]:hover{background-color:#eeee}table.page-table tbody tr[data-v-b1e12544]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-b1e12544]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-b1e12544]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-b1e12544]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-b1e12544]{width:100px}table.popups-table th.checkbox[data-v-b1e12544]{width:50px;text-align:center}table.popups-table th.setting[data-v-b1e12544]{width:100px;text-align:center}table.popups-table thead[data-v-b1e12544]{color:#eee}table.popups-table thead tr[data-v-b1e12544]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-b1e12544]{padding:10px 16px}table.popups-table tbody tr[data-v-b1e12544]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-b1e12544]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-b1e12544]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-b1e12544]{width:100%}header.header-desktop[data-v-b1e12544]{display:block}header.header-mobile[data-v-b1e12544]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-b1e12544]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-b1e12544]{width:100%;height:100%}header.header-mobile button svg path[data-v-b1e12544]{fill:#fff}nav.sidebar[data-v-b1e12544]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-b1e12544]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-b1e12544]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-b1e12544]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-b1e12544]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-b1e12544]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-b1e12544]{color:#fff}nav.sidebar .container .children[data-v-b1e12544]{padding-left:30px}@-moz-keyframes tada-b1e12544{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-b1e12544{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-b1e12544{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-b1e12544{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-b1e12544]{animation:dialogEnter-b1e12544 .3s linear forwards}.dialog-leave-active[data-v-b1e12544]{animation:dialogLeave-b1e12544 .3s linear forwards}@keyframes dialogEnter-b1e12544{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-b1e12544{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-b1e12544]{animation:dialogEnter-b1e12544 .2s linear forwards}.dialog1-leave-active[data-v-b1e12544]{animation:dialogLeave-b1e12544 .2s linear forwards}@keyframes rotateEnter-b1e12544{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-b1e12544]{animation:rotateEnter-b1e12544 .7s;position:relative}.rotate-leave-active[data-v-b1e12544]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-b1e12544{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-b1e12544{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-b1e12544]{animation:slideOutTop-b1e12544 .5s linear forwards}.slide-top-leave-active[data-v-b1e12544],.slide-bottom-enter-active[data-v-b1e12544]{animation:slideOutBottom-b1e12544 .5s linear forwards}@keyframes slideInLeft-b1e12544{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-b1e12544{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-b1e12544]{animation:slideInLeft-b1e12544 .3s linear forwards}.slide-left-leave-active[data-v-b1e12544]{animation:slideInRight-b1e12544 .3s linear forwards}@keyframes slideOutLeft-b1e12544{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-b1e12544{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-b1e12544]{animation:slideOutLeft-b1e12544 .3s linear forwards}.slide-right-leave-active[data-v-b1e12544]{animation:slideOutRight-b1e12544 .3s linear forwards}@keyframes bganimation-b1e12544{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-b1e12544{0%{height:0}to{height:100px}}@keyframes fadeEnd-b1e12544{0%{height:100%}to{height:0}}.fade-enter-active[data-v-b1e12544]{animation:fadeStart-b1e12544 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-b1e12544]{animation:fadeEnd-b1e12544 .1s linear forwards;overflow:hidden}.title_info[data-v-b1e12544]{display:block;width:100%;text-align:center}.title_info p[data-v-b1e12544]{font-size:20px;margin-bottom:10px}.label-item[data-v-b1e12544]{width:100%;margin:1rem 0}.label-item .label-item_key[data-v-b1e12544]{width:100%;font-size:12px;color:#666}.label-item .label-item_key span[data-v-b1e12544]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.label-item .label-item_key span[data-v-b1e12544]:before{content:\"*\";color:#f56c6c;margin-right:4px}.label-item .label-item_value[data-v-b1e12544]{width:100%;margin-top:5px}.label-item .label-item_value select[data-v-b1e12544],.label-item .label-item_value input[data-v-b1e12544]{width:100%;height:36px;color:#000}.label-item .label-item_value input[data-v-b1e12544]::placeholder{color:#999;font-size:12px}.label-item .label_tips[data-v-b1e12544]{display:flex;margin-top:6px}.label-item .label_tips .info[data-v-b1e12544]{margin-left:8px}.label-message[data-v-b1e12544]{width:100%;text-align:left;font-size:14px;color:red;text-align:center}@keyframes bganimation-5d97cabd{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-5d97cabd{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-5d97cabd{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-5d97cabd{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-5d97cabd{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-5d97cabd]{animation:slideInLeft-5d97cabd .3s linear forwards}.slide-left-leave-active[data-v-5d97cabd]{animation:slideInRight-5d97cabd .3s linear forwards}@keyframes slideOutLeft-5d97cabd{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-5d97cabd{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-5d97cabd]{animation:slideOutLeft-5d97cabd .3s linear forwards}.slide-right-leave-active[data-v-5d97cabd]{animation:slideOutRight-5d97cabd .3s linear forwards}.rotate-enter-active[data-v-5d97cabd]{animation:rotateEnter-5d97cabd .7s;position:relative}.rotate-leave-active[data-v-5d97cabd]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-5d97cabd]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-5d97cabd]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-5d97cabd]{color:#f9ad1e}.notice_info li[data-v-5d97cabd]{font-size:14px;list-style:revert}.text-container[data-v-5d97cabd]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-5d97cabd]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-5d97cabd]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-5d97cabd]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-5d97cabd]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-5d97cabd]{width:100%}.text-container .text-container_item p.info-desc[data-v-5d97cabd]{width:100%;color:#999;font-size:14px}.page-container[data-v-5d97cabd]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-5d97cabd]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-5d97cabd]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-5d97cabd]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-5d97cabd],.page-container .page-flex .page-sidebar a[data-v-5d97cabd]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5d97cabd]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5d97cabd]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-5d97cabd]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-5d97cabd]{border-radius:0;padding:1rem}ul.ul-container[data-v-5d97cabd]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-5d97cabd]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-5d97cabd]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-5d97cabd]{width:100%}form.form-container[data-v-5d97cabd]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-5d97cabd]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-5d97cabd]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-5d97cabd]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-5d97cabd]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-5d97cabd],form.form-container .label-value select[data-v-5d97cabd]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-5d97cabd]:focus,form.form-container .label-value select[data-v-5d97cabd]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-5d97cabd]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-5d97cabd]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-5d97cabd],form.form-container .label-value input[type=radio][data-v-5d97cabd]{width:auto}form.form-container .label-value input[type=radio][data-v-5d97cabd]{margin:0 4px 0 0}form.form-container .label-value input[data-v-5d97cabd]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-5d97cabd]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5d97cabd]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5d97cabd]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-5d97cabd]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-5d97cabd]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-5d97cabd]:hover{background-color:#747474}form.form-container .label-msg[data-v-5d97cabd]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-5d97cabd]{color:#f9ad1e}form.form-container .label-flex[data-v-5d97cabd]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-5d97cabd]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-5d97cabd]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-5d97cabd]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-5d97cabd]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-5d97cabd]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-5d97cabd]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-5d97cabd],form.form-container1 .label-value select[data-v-5d97cabd]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-5d97cabd]:focus,form.form-container1 .label-value select[data-v-5d97cabd]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-5d97cabd]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-5d97cabd],form.form-container1 .label-value input[type=radio][data-v-5d97cabd]{width:auto}form.form-container1 .label-value input[type=radio][data-v-5d97cabd]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-5d97cabd]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-5d97cabd]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5d97cabd]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5d97cabd]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-5d97cabd]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-5d97cabd]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-5d97cabd]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-5d97cabd]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-5d97cabd]{color:#f9ad1e}form.form-container1 .label-flex[data-v-5d97cabd]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-5d97cabd]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-5d97cabd]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-5d97cabd]{width:100px}table.page-table th.checkbox[data-v-5d97cabd]{width:50px;text-align:center}table.page-table th.setting[data-v-5d97cabd]{width:100px;text-align:center}table.page-table thead[data-v-5d97cabd]{color:#909399}table.page-table thead tr[data-v-5d97cabd]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-5d97cabd]{padding:10px 16px}table.page-table tbody tr[data-v-5d97cabd]:hover{background-color:#eeee}table.page-table tbody tr[data-v-5d97cabd]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-5d97cabd]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-5d97cabd]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-5d97cabd]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-5d97cabd]{width:100px}table.popups-table th.checkbox[data-v-5d97cabd]{width:50px;text-align:center}table.popups-table th.setting[data-v-5d97cabd]{width:100px;text-align:center}table.popups-table thead[data-v-5d97cabd]{color:#eee}table.popups-table thead tr[data-v-5d97cabd]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-5d97cabd]{padding:10px 16px}table.popups-table tbody tr[data-v-5d97cabd]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-5d97cabd]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-5d97cabd]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-5d97cabd]{width:100%}header.header-desktop[data-v-5d97cabd]{display:block}header.header-mobile[data-v-5d97cabd]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-5d97cabd]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-5d97cabd]{width:100%;height:100%}header.header-mobile button svg path[data-v-5d97cabd]{fill:#fff}nav.sidebar[data-v-5d97cabd]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-5d97cabd]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-5d97cabd]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-5d97cabd]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-5d97cabd]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-5d97cabd]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-5d97cabd]{color:#fff}nav.sidebar .container .children[data-v-5d97cabd]{padding-left:30px}@-moz-keyframes tada-5d97cabd{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-5d97cabd{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-5d97cabd{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-5d97cabd{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-5d97cabd]{animation:dialogEnter-5d97cabd .3s linear forwards}.dialog-leave-active[data-v-5d97cabd]{animation:dialogLeave-5d97cabd .3s linear forwards}@keyframes dialogEnter-5d97cabd{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-5d97cabd{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-5d97cabd]{animation:dialogEnter-5d97cabd .2s linear forwards}.dialog1-leave-active[data-v-5d97cabd]{animation:dialogLeave-5d97cabd .2s linear forwards}@keyframes slideOutTop-5d97cabd{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-5d97cabd{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-5d97cabd]{animation:slideOutTop-5d97cabd .5s linear forwards}.slide-top-leave-active[data-v-5d97cabd],.slide-bottom-enter-active[data-v-5d97cabd]{animation:slideOutBottom-5d97cabd .5s linear forwards}@keyframes fadeStart-5d97cabd{0%{height:0}to{height:100px}}@keyframes fadeEnd-5d97cabd{0%{height:100%}to{height:0}}.fade-enter-active[data-v-5d97cabd]{animation:fadeStart-5d97cabd .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-5d97cabd]{animation:fadeEnd-5d97cabd .1s linear forwards;overflow:hidden}.action-main[data-v-5d97cabd]{width:680px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.action-main[data-v-5d97cabd] .actioner-container{width:100%}.action-main[data-v-5d97cabd] .actioner-container .actioner-container_header{width:100%;height:50px;line-height:50px;display:flex;flex-wrap:wrap;align-items:center;font-size:20px;border-bottom:1px solid #eee;justify-content:center;padding:0 10px}.action-main[data-v-5d97cabd] .actioner-container .actioner-container_footer{width:100%;height:50px;border-top:1px solid rgba(0,0,0,.06);display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:0 30px}.action-main[data-v-5d97cabd] .actioner-container .actioner-container_footer button{display:inline-block;width:100px!important;margin:0;margin-left:1rem}.action-main[data-v-5d97cabd] .actioner-container .actioner-container_footer .close{min-width:65px;font-weight:400;line-height:30px;text-align:center;cursor:pointer;height:32px;border-radius:2px;border:1px solid rgba(0,0,0,.15);font-size:14px;font-family:PingFangSC-Regular,PingFang SC;color:#000000d4;line-height:32px}.action-main[data-v-5d97cabd] .actioner-container .actioner-container_footer .next{min-width:65px;line-height:32px;text-align:center;cursor:pointer;font-size:14px;font-family:PingFangSC-Regular,PingFang SC;font-weight:400;color:#fff;margin-left:20px;width:74px;height:32px;background:#553AFE;border-radius:2px}.action-main[data-v-5d97cabd] .actioner-container .actioner-container_footer .next.save{height:32px;background:#553AFE;border-radius:2px;line-height:16px}.action-main[data-v-5d97cabd] .actioner-container .actioner-container_footer .next:hover,.action-main[data-v-5d97cabd] .actioner-container .actioner-container_footer .close:hover{opacity:.9}.action-main[data-v-5d97cabd] .actioner-container .actioner-container_body{padding:1rem;width:100%;height:400px}.action-main[data-v-5d97cabd] .actioner-container .actioner-container_body a{text-decoration:none}.action-main[data-v-5d97cabd] .actioner-container .actioner-container_body.ali,.action-main[data-v-5d97cabd] .actioner-container .actioner-container_body.dnspod,.action-main[data-v-5d97cabd] .actioner-container .actioner-container_body.oray{height:451px}@keyframes bganimation-5d97cabd{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-5d97cabd{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-5d97cabd{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-5d97cabd{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-5d97cabd{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-5d97cabd]{animation:slideInLeft-5d97cabd .3s linear forwards}.slide-left-leave-active[data-v-5d97cabd]{animation:slideInRight-5d97cabd .3s linear forwards}@keyframes slideOutLeft-5d97cabd{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-5d97cabd{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-5d97cabd]{animation:slideOutLeft-5d97cabd .3s linear forwards}.slide-right-leave-active[data-v-5d97cabd]{animation:slideOutRight-5d97cabd .3s linear forwards}.rotate-enter-active[data-v-5d97cabd]{animation:rotateEnter-5d97cabd .7s;position:relative}.rotate-leave-active[data-v-5d97cabd]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-5d97cabd]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-5d97cabd]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-5d97cabd]{color:#f9ad1e}.notice_info li[data-v-5d97cabd]{font-size:14px;list-style:revert}.text-container[data-v-5d97cabd]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-5d97cabd]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-5d97cabd]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-5d97cabd]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-5d97cabd]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-5d97cabd]{width:100%}.text-container .text-container_item p.info-desc[data-v-5d97cabd]{width:100%;color:#999;font-size:14px}.page-container[data-v-5d97cabd]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-5d97cabd]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-5d97cabd]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-5d97cabd]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-5d97cabd],.page-container .page-flex .page-sidebar a[data-v-5d97cabd]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5d97cabd]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-5d97cabd]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-5d97cabd]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-5d97cabd]{border-radius:0;padding:1rem}ul.ul-container[data-v-5d97cabd]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-5d97cabd]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-5d97cabd]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-5d97cabd]{width:100%}form.form-container[data-v-5d97cabd]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-5d97cabd]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-5d97cabd]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-5d97cabd]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-5d97cabd]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-5d97cabd],form.form-container .label-value select[data-v-5d97cabd]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-5d97cabd]:focus,form.form-container .label-value select[data-v-5d97cabd]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-5d97cabd]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-5d97cabd]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-5d97cabd],form.form-container .label-value input[type=radio][data-v-5d97cabd]{width:auto}form.form-container .label-value input[type=radio][data-v-5d97cabd]{margin:0 4px 0 0}form.form-container .label-value input[data-v-5d97cabd]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-5d97cabd]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5d97cabd]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-5d97cabd]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-5d97cabd]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-5d97cabd]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-5d97cabd]:hover{background-color:#747474}form.form-container .label-msg[data-v-5d97cabd]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-5d97cabd]{color:#f9ad1e}form.form-container .label-flex[data-v-5d97cabd]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-5d97cabd]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-5d97cabd]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-5d97cabd]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-5d97cabd]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-5d97cabd]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-5d97cabd]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-5d97cabd],form.form-container1 .label-value select[data-v-5d97cabd]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-5d97cabd]:focus,form.form-container1 .label-value select[data-v-5d97cabd]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-5d97cabd]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-5d97cabd],form.form-container1 .label-value input[type=radio][data-v-5d97cabd]{width:auto}form.form-container1 .label-value input[type=radio][data-v-5d97cabd]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-5d97cabd]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-5d97cabd]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5d97cabd]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-5d97cabd]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-5d97cabd]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-5d97cabd]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-5d97cabd]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-5d97cabd]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-5d97cabd]{color:#f9ad1e}form.form-container1 .label-flex[data-v-5d97cabd]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-5d97cabd]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-5d97cabd]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-5d97cabd]{width:100px}table.page-table th.checkbox[data-v-5d97cabd]{width:50px;text-align:center}table.page-table th.setting[data-v-5d97cabd]{width:100px;text-align:center}table.page-table thead[data-v-5d97cabd]{color:#909399}table.page-table thead tr[data-v-5d97cabd]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-5d97cabd]{padding:10px 16px}table.page-table tbody tr[data-v-5d97cabd]:hover{background-color:#eeee}table.page-table tbody tr[data-v-5d97cabd]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-5d97cabd]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-5d97cabd]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-5d97cabd]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-5d97cabd]{width:100px}table.popups-table th.checkbox[data-v-5d97cabd]{width:50px;text-align:center}table.popups-table th.setting[data-v-5d97cabd]{width:100px;text-align:center}table.popups-table thead[data-v-5d97cabd]{color:#eee}table.popups-table thead tr[data-v-5d97cabd]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-5d97cabd]{padding:10px 16px}table.popups-table tbody tr[data-v-5d97cabd]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-5d97cabd]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-5d97cabd]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-5d97cabd]{width:100%}header.header-desktop[data-v-5d97cabd]{display:block}header.header-mobile[data-v-5d97cabd]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-5d97cabd]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-5d97cabd]{width:100%;height:100%}header.header-mobile button svg path[data-v-5d97cabd]{fill:#fff}nav.sidebar[data-v-5d97cabd]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-5d97cabd]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-5d97cabd]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-5d97cabd]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-5d97cabd]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-5d97cabd]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-5d97cabd]{color:#fff}nav.sidebar .container .children[data-v-5d97cabd]{padding-left:30px}@-moz-keyframes tada-5d97cabd{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-5d97cabd{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-5d97cabd{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-5d97cabd{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-5d97cabd]{animation:dialogEnter-5d97cabd .3s linear forwards}.dialog-leave-active[data-v-5d97cabd]{animation:dialogLeave-5d97cabd .3s linear forwards}@keyframes dialogEnter-5d97cabd{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-5d97cabd{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-5d97cabd]{animation:dialogEnter-5d97cabd .2s linear forwards}.dialog1-leave-active[data-v-5d97cabd]{animation:dialogLeave-5d97cabd .2s linear forwards}@keyframes rotateEnter-5d97cabd{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-5d97cabd]{animation:rotateEnter-5d97cabd .7s;position:relative}.rotate-leave-active[data-v-5d97cabd]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-5d97cabd{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-5d97cabd{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-5d97cabd]{animation:slideOutTop-5d97cabd .5s linear forwards}.slide-top-leave-active[data-v-5d97cabd],.slide-bottom-enter-active[data-v-5d97cabd]{animation:slideOutBottom-5d97cabd .5s linear forwards}@keyframes slideInLeft-5d97cabd{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-5d97cabd{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-5d97cabd]{animation:slideInLeft-5d97cabd .3s linear forwards}.slide-left-leave-active[data-v-5d97cabd]{animation:slideInRight-5d97cabd .3s linear forwards}@keyframes slideOutLeft-5d97cabd{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-5d97cabd{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-5d97cabd]{animation:slideOutLeft-5d97cabd .3s linear forwards}.slide-right-leave-active[data-v-5d97cabd]{animation:slideOutRight-5d97cabd .3s linear forwards}@keyframes bganimation-5d97cabd{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-5d97cabd{0%{height:0}to{height:100px}}@keyframes fadeEnd-5d97cabd{0%{height:100%}to{height:0}}.fade-enter-active[data-v-5d97cabd]{animation:fadeStart-5d97cabd .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-5d97cabd]{animation:fadeEnd-5d97cabd .1s linear forwards;overflow:hidden}@media screen and (max-width: 800px){.action-main[data-v-5d97cabd]{width:90%}}@keyframes bganimation-2f910f70{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-2f910f70{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-2f910f70{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-2f910f70{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-2f910f70{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-2f910f70]{animation:slideInLeft-2f910f70 .3s linear forwards}.slide-left-leave-active[data-v-2f910f70]{animation:slideInRight-2f910f70 .3s linear forwards}@keyframes slideOutLeft-2f910f70{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-2f910f70{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-2f910f70]{animation:slideOutLeft-2f910f70 .3s linear forwards}.slide-right-leave-active[data-v-2f910f70]{animation:slideOutRight-2f910f70 .3s linear forwards}.rotate-enter-active[data-v-2f910f70]{animation:rotateEnter-2f910f70 .7s;position:relative}.rotate-leave-active[data-v-2f910f70]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-2f910f70]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-2f910f70]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-2f910f70]{color:#f9ad1e}.notice_info li[data-v-2f910f70]{font-size:14px;list-style:revert}.text-container[data-v-2f910f70]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-2f910f70]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-2f910f70]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-2f910f70]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-2f910f70]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-2f910f70]{width:100%}.text-container .text-container_item p.info-desc[data-v-2f910f70]{width:100%;color:#999;font-size:14px}.page-container[data-v-2f910f70]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-2f910f70]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-2f910f70]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-2f910f70]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-2f910f70],.page-container .page-flex .page-sidebar a[data-v-2f910f70]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-2f910f70]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-2f910f70]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-2f910f70]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-2f910f70]{border-radius:0;padding:1rem}ul.ul-container[data-v-2f910f70]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-2f910f70]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-2f910f70]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-2f910f70]{width:100%}form.form-container[data-v-2f910f70]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-2f910f70]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-2f910f70]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-2f910f70]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-2f910f70]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-2f910f70],form.form-container .label-value select[data-v-2f910f70]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-2f910f70]:focus,form.form-container .label-value select[data-v-2f910f70]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-2f910f70]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-2f910f70]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-2f910f70],form.form-container .label-value input[type=radio][data-v-2f910f70]{width:auto}form.form-container .label-value input[type=radio][data-v-2f910f70]{margin:0 4px 0 0}form.form-container .label-value input[data-v-2f910f70]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-2f910f70]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-2f910f70]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-2f910f70]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-2f910f70]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-2f910f70]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-2f910f70]:hover{background-color:#747474}form.form-container .label-msg[data-v-2f910f70]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-2f910f70]{color:#f9ad1e}form.form-container .label-flex[data-v-2f910f70]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-2f910f70]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-2f910f70]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-2f910f70]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-2f910f70]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-2f910f70]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-2f910f70]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-2f910f70],form.form-container1 .label-value select[data-v-2f910f70]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-2f910f70]:focus,form.form-container1 .label-value select[data-v-2f910f70]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-2f910f70]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-2f910f70],form.form-container1 .label-value input[type=radio][data-v-2f910f70]{width:auto}form.form-container1 .label-value input[type=radio][data-v-2f910f70]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-2f910f70]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-2f910f70]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-2f910f70]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-2f910f70]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-2f910f70]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-2f910f70]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-2f910f70]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-2f910f70]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-2f910f70]{color:#f9ad1e}form.form-container1 .label-flex[data-v-2f910f70]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-2f910f70]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-2f910f70]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-2f910f70]{width:100px}table.page-table th.checkbox[data-v-2f910f70]{width:50px;text-align:center}table.page-table th.setting[data-v-2f910f70]{width:100px;text-align:center}table.page-table thead[data-v-2f910f70]{color:#909399}table.page-table thead tr[data-v-2f910f70]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-2f910f70]{padding:10px 16px}table.page-table tbody tr[data-v-2f910f70]:hover{background-color:#eeee}table.page-table tbody tr[data-v-2f910f70]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-2f910f70]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-2f910f70]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-2f910f70]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-2f910f70]{width:100px}table.popups-table th.checkbox[data-v-2f910f70]{width:50px;text-align:center}table.popups-table th.setting[data-v-2f910f70]{width:100px;text-align:center}table.popups-table thead[data-v-2f910f70]{color:#eee}table.popups-table thead tr[data-v-2f910f70]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-2f910f70]{padding:10px 16px}table.popups-table tbody tr[data-v-2f910f70]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-2f910f70]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-2f910f70]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-2f910f70]{width:100%}header.header-desktop[data-v-2f910f70]{display:block}header.header-mobile[data-v-2f910f70]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-2f910f70]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-2f910f70]{width:100%;height:100%}header.header-mobile button svg path[data-v-2f910f70]{fill:#fff}nav.sidebar[data-v-2f910f70]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-2f910f70]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-2f910f70]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-2f910f70]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-2f910f70]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-2f910f70]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-2f910f70]{color:#fff}nav.sidebar .container .children[data-v-2f910f70]{padding-left:30px}@-moz-keyframes tada-2f910f70{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-2f910f70{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-2f910f70{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-2f910f70{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-2f910f70]{animation:dialogEnter-2f910f70 .3s linear forwards}.dialog-leave-active[data-v-2f910f70]{animation:dialogLeave-2f910f70 .3s linear forwards}@keyframes dialogEnter-2f910f70{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-2f910f70{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-2f910f70]{animation:dialogEnter-2f910f70 .2s linear forwards}.dialog1-leave-active[data-v-2f910f70]{animation:dialogLeave-2f910f70 .2s linear forwards}@keyframes rotateEnter-2f910f70{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-2f910f70]{animation:rotateEnter-2f910f70 .7s;position:relative}.rotate-leave-active[data-v-2f910f70]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-2f910f70{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-2f910f70{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-2f910f70]{animation:slideOutTop-2f910f70 .5s linear forwards}.slide-top-leave-active[data-v-2f910f70],.slide-bottom-enter-active[data-v-2f910f70]{animation:slideOutBottom-2f910f70 .5s linear forwards}@keyframes slideInLeft-2f910f70{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-2f910f70{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-2f910f70]{animation:slideInLeft-2f910f70 .3s linear forwards}.slide-left-leave-active[data-v-2f910f70]{animation:slideInRight-2f910f70 .3s linear forwards}@keyframes slideOutLeft-2f910f70{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-2f910f70{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-2f910f70]{animation:slideOutLeft-2f910f70 .3s linear forwards}.slide-right-leave-active[data-v-2f910f70]{animation:slideOutRight-2f910f70 .3s linear forwards}@keyframes bganimation-2f910f70{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-2f910f70{0%{height:0}to{height:100px}}@keyframes fadeEnd-2f910f70{0%{height:100%}to{height:0}}.fade-enter-active[data-v-2f910f70]{animation:fadeStart-2f910f70 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-2f910f70]{animation:fadeEnd-2f910f70 .1s linear forwards;overflow:hidden}.row[data-v-2f910f70]{border-radius:8px;background:#f2efee;padding:8px 12px;display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;font-size:14px}.row>.text[data-v-2f910f70]{color:#000c;font-weight:500;display:flex;align-items:center}.row>.text>span[data-v-2f910f70]:last-of-type{display:flex;align-items:center}.row>.text>span:last-of-type>img[data-v-2f910f70]{margin-left:8px;cursor:pointer}.row>.text>span:last-of-type>img[data-v-2f910f70]:hover{transform:scale(1.1);transition-duration:.3s}.row>.text>.configure[data-v-2f910f70]{font-size:13px}.button>*[data-v-2f910f70]{color:#0009;font-size:12px;font-weight:500;border-radius:32px;background:rgba(0,0,0,.08);display:inline-block;height:24px;line-height:24px;padding:0 8px;justify-content:center;align-items:center;cursor:pointer}@keyframes bganimation-097a32fc{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-097a32fc{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-097a32fc{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-097a32fc{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-097a32fc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-097a32fc]{animation:slideInLeft-097a32fc .3s linear forwards}.slide-left-leave-active[data-v-097a32fc]{animation:slideInRight-097a32fc .3s linear forwards}@keyframes slideOutLeft-097a32fc{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-097a32fc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-097a32fc]{animation:slideOutLeft-097a32fc .3s linear forwards}.slide-right-leave-active[data-v-097a32fc]{animation:slideOutRight-097a32fc .3s linear forwards}.rotate-enter-active[data-v-097a32fc]{animation:rotateEnter-097a32fc .7s;position:relative}.rotate-leave-active[data-v-097a32fc]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-097a32fc]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-097a32fc]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-097a32fc]{color:#f9ad1e}.notice_info li[data-v-097a32fc]{font-size:14px;list-style:revert}.text-container[data-v-097a32fc]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-097a32fc]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-097a32fc]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-097a32fc]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-097a32fc]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-097a32fc]{width:100%}.text-container .text-container_item p.info-desc[data-v-097a32fc]{width:100%;color:#999;font-size:14px}.page-container[data-v-097a32fc]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-097a32fc]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-097a32fc]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-097a32fc]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-097a32fc],.page-container .page-flex .page-sidebar a[data-v-097a32fc]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-097a32fc]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-097a32fc]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-097a32fc]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-097a32fc]{border-radius:0;padding:1rem}ul.ul-container[data-v-097a32fc]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-097a32fc]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-097a32fc]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-097a32fc]{width:100%}form.form-container[data-v-097a32fc]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-097a32fc]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-097a32fc]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-097a32fc]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-097a32fc]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-097a32fc],form.form-container .label-value select[data-v-097a32fc]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-097a32fc]:focus,form.form-container .label-value select[data-v-097a32fc]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-097a32fc]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-097a32fc]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-097a32fc],form.form-container .label-value input[type=radio][data-v-097a32fc]{width:auto}form.form-container .label-value input[type=radio][data-v-097a32fc]{margin:0 4px 0 0}form.form-container .label-value input[data-v-097a32fc]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-097a32fc]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-097a32fc]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-097a32fc]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-097a32fc]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-097a32fc]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-097a32fc]:hover{background-color:#747474}form.form-container .label-msg[data-v-097a32fc]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-097a32fc]{color:#f9ad1e}form.form-container .label-flex[data-v-097a32fc]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-097a32fc]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-097a32fc]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-097a32fc]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-097a32fc]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-097a32fc]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-097a32fc]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-097a32fc],form.form-container1 .label-value select[data-v-097a32fc]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-097a32fc]:focus,form.form-container1 .label-value select[data-v-097a32fc]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-097a32fc]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-097a32fc],form.form-container1 .label-value input[type=radio][data-v-097a32fc]{width:auto}form.form-container1 .label-value input[type=radio][data-v-097a32fc]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-097a32fc]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-097a32fc]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-097a32fc]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-097a32fc]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-097a32fc]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-097a32fc]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-097a32fc]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-097a32fc]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-097a32fc]{color:#f9ad1e}form.form-container1 .label-flex[data-v-097a32fc]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-097a32fc]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-097a32fc]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-097a32fc]{width:100px}table.page-table th.checkbox[data-v-097a32fc]{width:50px;text-align:center}table.page-table th.setting[data-v-097a32fc]{width:100px;text-align:center}table.page-table thead[data-v-097a32fc]{color:#909399}table.page-table thead tr[data-v-097a32fc]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-097a32fc]{padding:10px 16px}table.page-table tbody tr[data-v-097a32fc]:hover{background-color:#eeee}table.page-table tbody tr[data-v-097a32fc]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-097a32fc]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-097a32fc]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-097a32fc]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-097a32fc]{width:100px}table.popups-table th.checkbox[data-v-097a32fc]{width:50px;text-align:center}table.popups-table th.setting[data-v-097a32fc]{width:100px;text-align:center}table.popups-table thead[data-v-097a32fc]{color:#eee}table.popups-table thead tr[data-v-097a32fc]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-097a32fc]{padding:10px 16px}table.popups-table tbody tr[data-v-097a32fc]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-097a32fc]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-097a32fc]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-097a32fc]{width:100%}header.header-desktop[data-v-097a32fc]{display:block}header.header-mobile[data-v-097a32fc]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-097a32fc]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-097a32fc]{width:100%;height:100%}header.header-mobile button svg path[data-v-097a32fc]{fill:#fff}nav.sidebar[data-v-097a32fc]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-097a32fc]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-097a32fc]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-097a32fc]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-097a32fc]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-097a32fc]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-097a32fc]{color:#fff}nav.sidebar .container .children[data-v-097a32fc]{padding-left:30px}@-moz-keyframes tada-097a32fc{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-097a32fc{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-097a32fc{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-097a32fc{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-097a32fc]{animation:dialogEnter-097a32fc .3s linear forwards}.dialog-leave-active[data-v-097a32fc]{animation:dialogLeave-097a32fc .3s linear forwards}@keyframes dialogEnter-097a32fc{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-097a32fc{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-097a32fc]{animation:dialogEnter-097a32fc .2s linear forwards}.dialog1-leave-active[data-v-097a32fc]{animation:dialogLeave-097a32fc .2s linear forwards}@keyframes rotateEnter-097a32fc{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-097a32fc]{animation:rotateEnter-097a32fc .7s;position:relative}.rotate-leave-active[data-v-097a32fc]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-097a32fc{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-097a32fc{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-097a32fc]{animation:slideOutTop-097a32fc .5s linear forwards}.slide-top-leave-active[data-v-097a32fc],.slide-bottom-enter-active[data-v-097a32fc]{animation:slideOutBottom-097a32fc .5s linear forwards}@keyframes slideInLeft-097a32fc{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-097a32fc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-097a32fc]{animation:slideInLeft-097a32fc .3s linear forwards}.slide-left-leave-active[data-v-097a32fc]{animation:slideInRight-097a32fc .3s linear forwards}@keyframes slideOutLeft-097a32fc{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-097a32fc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-097a32fc]{animation:slideOutLeft-097a32fc .3s linear forwards}.slide-right-leave-active[data-v-097a32fc]{animation:slideOutRight-097a32fc .3s linear forwards}@keyframes fadeStart-097a32fc{0%{height:0}to{height:100px}}@keyframes fadeEnd-097a32fc{0%{height:100%}to{height:0}}.fade-enter-active[data-v-097a32fc]{animation:fadeStart-097a32fc .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-097a32fc]{animation:fadeEnd-097a32fc .1s linear forwards;overflow:hidden}.action[data-v-097a32fc]{width:860px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;overflow:auto;padding:1rem 87px;border-radius:6px}.action h2.title[data-v-097a32fc]{width:100%;display:block;color:#1e1e1e;font-size:22px;padding:0;margin:0;text-align:center}.action .roots[data-v-097a32fc]{display:flex;max-width:342px;align-items:center;margin-top:32px;margin-bottom:16px}.action .roots .root[data-v-097a32fc]{color:#000000d4;font-size:14px;text-align:center}.action .move[data-v-097a32fc]{display:flex;justify-content:left;align-items:center}.action .change[data-v-097a32fc]{width:678px}.action .desc[data-v-097a32fc]{width:100%;display:block;font-size:1.2em;padding:0;margin:1rem 0;margin-top:32px;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;color:#000000d4}.action form[data-v-097a32fc]{width:100%;display:block}.action .tips[data-v-097a32fc]{width:477px}.action .tips .tip[data-v-097a32fc]{color:#faad14;padding-left:6px}.action .btns[data-v-097a32fc]{width:100%;margin:104px auto 0}.action .btns button[data-v-097a32fc]{display:block;width:100%!important;margin-left:0;margin-right:0;margin-bottom:8px}.action .roots_tit[data-v-097a32fc]{color:#000000d4;font-size:14px;font-weight:700;width:118px;text-align:right;flex:none}.action .successed[data-v-097a32fc]{text-align:center;font-size:14px}.action .finished[data-v-097a32fc]{display:flex;justify-content:center;margin:80px 80px 28px}.action .docker_moves[data-v-097a32fc]{text-align:center}.action .docker_moves .moves[data-v-097a32fc]{margin-top:10px}.action .docker_moves .moves input[data-v-097a32fc]{cursor:pointer}.action .docker_moves .moves label[data-v-097a32fc]{margin-left:10px;cursor:pointer}.select-editable[data-v-097a32fc]{position:relative;border:solid grey 1px;width:438px;height:34px}.select-editable select[data-v-097a32fc]{position:absolute;top:0;left:0;font-size:14px;border:none;width:100%;height:100%;margin:0}.select-editable input[data-v-097a32fc]{position:absolute;top:0;left:0;width:95%;padding:1px;font-size:14px;border:none}.select-editable select[data-v-097a32fc]:focus,.select-editable input[data-v-097a32fc]:focus{outline:none}[data-v-097a32fc]::placeholder{color:#999}@keyframes bganimation-097a32fc{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-097a32fc{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-097a32fc{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-097a32fc{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-097a32fc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-097a32fc]{animation:slideInLeft-097a32fc .3s linear forwards}.slide-left-leave-active[data-v-097a32fc]{animation:slideInRight-097a32fc .3s linear forwards}@keyframes slideOutLeft-097a32fc{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-097a32fc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-097a32fc]{animation:slideOutLeft-097a32fc .3s linear forwards}.slide-right-leave-active[data-v-097a32fc]{animation:slideOutRight-097a32fc .3s linear forwards}.rotate-enter-active[data-v-097a32fc]{animation:rotateEnter-097a32fc .7s;position:relative}.rotate-leave-active[data-v-097a32fc]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-097a32fc]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-097a32fc]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-097a32fc]{color:#f9ad1e}.notice_info li[data-v-097a32fc]{font-size:14px;list-style:revert}.text-container[data-v-097a32fc]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-097a32fc]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-097a32fc]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-097a32fc]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-097a32fc]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-097a32fc]{width:100%}.text-container .text-container_item p.info-desc[data-v-097a32fc]{width:100%;color:#999;font-size:14px}.page-container[data-v-097a32fc]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-097a32fc]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-097a32fc]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-097a32fc]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-097a32fc],.page-container .page-flex .page-sidebar a[data-v-097a32fc]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-097a32fc]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-097a32fc]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-097a32fc]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-097a32fc]{border-radius:0;padding:1rem}ul.ul-container[data-v-097a32fc]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-097a32fc]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-097a32fc]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-097a32fc]{width:100%}form.form-container[data-v-097a32fc]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-097a32fc]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-097a32fc]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-097a32fc]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-097a32fc]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-097a32fc],form.form-container .label-value select[data-v-097a32fc]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-097a32fc]:focus,form.form-container .label-value select[data-v-097a32fc]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-097a32fc]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-097a32fc]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-097a32fc],form.form-container .label-value input[type=radio][data-v-097a32fc]{width:auto}form.form-container .label-value input[type=radio][data-v-097a32fc]{margin:0 4px 0 0}form.form-container .label-value input[data-v-097a32fc]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-097a32fc]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-097a32fc]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-097a32fc]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-097a32fc]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-097a32fc]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-097a32fc]:hover{background-color:#747474}form.form-container .label-msg[data-v-097a32fc]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-097a32fc]{color:#f9ad1e}form.form-container .label-flex[data-v-097a32fc]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-097a32fc]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-097a32fc]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-097a32fc]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-097a32fc]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-097a32fc]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-097a32fc]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-097a32fc],form.form-container1 .label-value select[data-v-097a32fc]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-097a32fc]:focus,form.form-container1 .label-value select[data-v-097a32fc]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-097a32fc]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-097a32fc],form.form-container1 .label-value input[type=radio][data-v-097a32fc]{width:auto}form.form-container1 .label-value input[type=radio][data-v-097a32fc]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-097a32fc]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-097a32fc]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-097a32fc]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-097a32fc]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-097a32fc]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-097a32fc]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-097a32fc]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-097a32fc]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-097a32fc]{color:#f9ad1e}form.form-container1 .label-flex[data-v-097a32fc]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-097a32fc]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-097a32fc]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-097a32fc]{width:100px}table.page-table th.checkbox[data-v-097a32fc]{width:50px;text-align:center}table.page-table th.setting[data-v-097a32fc]{width:100px;text-align:center}table.page-table thead[data-v-097a32fc]{color:#909399}table.page-table thead tr[data-v-097a32fc]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-097a32fc]{padding:10px 16px}table.page-table tbody tr[data-v-097a32fc]:hover{background-color:#eeee}table.page-table tbody tr[data-v-097a32fc]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-097a32fc]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-097a32fc]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-097a32fc]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-097a32fc]{width:100px}table.popups-table th.checkbox[data-v-097a32fc]{width:50px;text-align:center}table.popups-table th.setting[data-v-097a32fc]{width:100px;text-align:center}table.popups-table thead[data-v-097a32fc]{color:#eee}table.popups-table thead tr[data-v-097a32fc]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-097a32fc]{padding:10px 16px}table.popups-table tbody tr[data-v-097a32fc]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-097a32fc]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-097a32fc]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-097a32fc]{width:100%}header.header-desktop[data-v-097a32fc]{display:block}header.header-mobile[data-v-097a32fc]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-097a32fc]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-097a32fc]{width:100%;height:100%}header.header-mobile button svg path[data-v-097a32fc]{fill:#fff}nav.sidebar[data-v-097a32fc]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-097a32fc]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-097a32fc]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-097a32fc]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-097a32fc]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-097a32fc]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-097a32fc]{color:#fff}nav.sidebar .container .children[data-v-097a32fc]{padding-left:30px}@-moz-keyframes tada-097a32fc{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-097a32fc{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-097a32fc{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-097a32fc{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-097a32fc]{animation:dialogEnter-097a32fc .3s linear forwards}.dialog-leave-active[data-v-097a32fc]{animation:dialogLeave-097a32fc .3s linear forwards}@keyframes dialogEnter-097a32fc{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-097a32fc{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-097a32fc]{animation:dialogEnter-097a32fc .2s linear forwards}.dialog1-leave-active[data-v-097a32fc]{animation:dialogLeave-097a32fc .2s linear forwards}@keyframes rotateEnter-097a32fc{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-097a32fc]{animation:rotateEnter-097a32fc .7s;position:relative}.rotate-leave-active[data-v-097a32fc]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-097a32fc{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-097a32fc{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-097a32fc]{animation:slideOutTop-097a32fc .5s linear forwards}.slide-top-leave-active[data-v-097a32fc],.slide-bottom-enter-active[data-v-097a32fc]{animation:slideOutBottom-097a32fc .5s linear forwards}@keyframes slideInLeft-097a32fc{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-097a32fc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-097a32fc]{animation:slideInLeft-097a32fc .3s linear forwards}.slide-left-leave-active[data-v-097a32fc]{animation:slideInRight-097a32fc .3s linear forwards}@keyframes slideOutLeft-097a32fc{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-097a32fc{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-097a32fc]{animation:slideOutLeft-097a32fc .3s linear forwards}.slide-right-leave-active[data-v-097a32fc]{animation:slideOutRight-097a32fc .3s linear forwards}@keyframes bganimation-097a32fc{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-097a32fc{0%{height:0}to{height:100px}}@keyframes fadeEnd-097a32fc{0%{height:100%}to{height:0}}.fade-enter-active[data-v-097a32fc]{animation:fadeStart-097a32fc .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-097a32fc]{animation:fadeEnd-097a32fc .1s linear forwards;overflow:hidden}@media screen and (max-width: 800px){.action[data-v-097a32fc]{width:100%}.docker_download[data-v-097a32fc]{width:80%}}@keyframes bganimation-750b6b3e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-750b6b3e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-750b6b3e{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-750b6b3e{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-750b6b3e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-750b6b3e]{animation:slideInLeft-750b6b3e .3s linear forwards}.slide-left-leave-active[data-v-750b6b3e]{animation:slideInRight-750b6b3e .3s linear forwards}@keyframes slideOutLeft-750b6b3e{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-750b6b3e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-750b6b3e]{animation:slideOutLeft-750b6b3e .3s linear forwards}.slide-right-leave-active[data-v-750b6b3e]{animation:slideOutRight-750b6b3e .3s linear forwards}.rotate-enter-active[data-v-750b6b3e]{animation:rotateEnter-750b6b3e .7s;position:relative}.rotate-leave-active[data-v-750b6b3e]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-750b6b3e]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-750b6b3e]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-750b6b3e]{color:#f9ad1e}.notice_info li[data-v-750b6b3e]{font-size:14px;list-style:revert}.text-container[data-v-750b6b3e]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-750b6b3e]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-750b6b3e]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-750b6b3e]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-750b6b3e]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-750b6b3e]{width:100%}.text-container .text-container_item p.info-desc[data-v-750b6b3e]{width:100%;color:#999;font-size:14px}.page-container[data-v-750b6b3e]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-750b6b3e]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-750b6b3e]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-750b6b3e]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-750b6b3e],.page-container .page-flex .page-sidebar a[data-v-750b6b3e]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-750b6b3e]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-750b6b3e]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-750b6b3e]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-750b6b3e]{border-radius:0;padding:1rem}ul.ul-container[data-v-750b6b3e]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-750b6b3e]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-750b6b3e]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-750b6b3e]{width:100%}form.form-container[data-v-750b6b3e]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-750b6b3e]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-750b6b3e]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-750b6b3e]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-750b6b3e]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-750b6b3e],form.form-container .label-value select[data-v-750b6b3e]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-750b6b3e]:focus,form.form-container .label-value select[data-v-750b6b3e]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-750b6b3e]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-750b6b3e]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-750b6b3e],form.form-container .label-value input[type=radio][data-v-750b6b3e]{width:auto}form.form-container .label-value input[type=radio][data-v-750b6b3e]{margin:0 4px 0 0}form.form-container .label-value input[data-v-750b6b3e]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-750b6b3e]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-750b6b3e]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-750b6b3e]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-750b6b3e]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-750b6b3e]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-750b6b3e]:hover{background-color:#747474}form.form-container .label-msg[data-v-750b6b3e]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-750b6b3e]{color:#f9ad1e}form.form-container .label-flex[data-v-750b6b3e]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-750b6b3e]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-750b6b3e]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-750b6b3e]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-750b6b3e]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-750b6b3e]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-750b6b3e]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-750b6b3e],form.form-container1 .label-value select[data-v-750b6b3e]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-750b6b3e]:focus,form.form-container1 .label-value select[data-v-750b6b3e]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-750b6b3e]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-750b6b3e],form.form-container1 .label-value input[type=radio][data-v-750b6b3e]{width:auto}form.form-container1 .label-value input[type=radio][data-v-750b6b3e]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-750b6b3e]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-750b6b3e]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-750b6b3e]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-750b6b3e]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-750b6b3e]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-750b6b3e]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-750b6b3e]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-750b6b3e]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-750b6b3e]{color:#f9ad1e}form.form-container1 .label-flex[data-v-750b6b3e]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-750b6b3e]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-750b6b3e]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-750b6b3e]{width:100px}table.page-table th.checkbox[data-v-750b6b3e]{width:50px;text-align:center}table.page-table th.setting[data-v-750b6b3e]{width:100px;text-align:center}table.page-table thead[data-v-750b6b3e]{color:#909399}table.page-table thead tr[data-v-750b6b3e]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-750b6b3e]{padding:10px 16px}table.page-table tbody tr[data-v-750b6b3e]:hover{background-color:#eeee}table.page-table tbody tr[data-v-750b6b3e]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-750b6b3e]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-750b6b3e]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-750b6b3e]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-750b6b3e]{width:100px}table.popups-table th.checkbox[data-v-750b6b3e]{width:50px;text-align:center}table.popups-table th.setting[data-v-750b6b3e]{width:100px;text-align:center}table.popups-table thead[data-v-750b6b3e]{color:#eee}table.popups-table thead tr[data-v-750b6b3e]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-750b6b3e]{padding:10px 16px}table.popups-table tbody tr[data-v-750b6b3e]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-750b6b3e]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-750b6b3e]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-750b6b3e]{width:100%}header.header-desktop[data-v-750b6b3e]{display:block}header.header-mobile[data-v-750b6b3e]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-750b6b3e]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-750b6b3e]{width:100%;height:100%}header.header-mobile button svg path[data-v-750b6b3e]{fill:#fff}nav.sidebar[data-v-750b6b3e]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-750b6b3e]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-750b6b3e]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-750b6b3e]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-750b6b3e]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-750b6b3e]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-750b6b3e]{color:#fff}nav.sidebar .container .children[data-v-750b6b3e]{padding-left:30px}@-moz-keyframes tada-750b6b3e{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-750b6b3e{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-750b6b3e{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-750b6b3e{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-750b6b3e]{animation:dialogEnter-750b6b3e .3s linear forwards}.dialog-leave-active[data-v-750b6b3e]{animation:dialogLeave-750b6b3e .3s linear forwards}@keyframes dialogEnter-750b6b3e{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-750b6b3e{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-750b6b3e]{animation:dialogEnter-750b6b3e .2s linear forwards}.dialog1-leave-active[data-v-750b6b3e]{animation:dialogLeave-750b6b3e .2s linear forwards}@keyframes rotateEnter-750b6b3e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-750b6b3e]{animation:rotateEnter-750b6b3e .7s;position:relative}.rotate-leave-active[data-v-750b6b3e]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-750b6b3e{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-750b6b3e{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-750b6b3e]{animation:slideOutTop-750b6b3e .5s linear forwards}.slide-top-leave-active[data-v-750b6b3e],.slide-bottom-enter-active[data-v-750b6b3e]{animation:slideOutBottom-750b6b3e .5s linear forwards}@keyframes slideInLeft-750b6b3e{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-750b6b3e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-750b6b3e]{animation:slideInLeft-750b6b3e .3s linear forwards}.slide-left-leave-active[data-v-750b6b3e]{animation:slideInRight-750b6b3e .3s linear forwards}@keyframes slideOutLeft-750b6b3e{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-750b6b3e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-750b6b3e]{animation:slideOutLeft-750b6b3e .3s linear forwards}.slide-right-leave-active[data-v-750b6b3e]{animation:slideOutRight-750b6b3e .3s linear forwards}@keyframes bganimation-750b6b3e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-750b6b3e{0%{height:0}to{height:100px}}@keyframes fadeEnd-750b6b3e{0%{height:100%}to{height:0}}.fade-enter-active[data-v-750b6b3e]{animation:fadeStart-750b6b3e .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-750b6b3e]{animation:fadeEnd-750b6b3e .1s linear forwards;overflow:hidden}.row[data-v-750b6b3e]{border-radius:8px;background:#f2efee;padding:8px 12px;display:flex;justify-content:space-between;align-items:center;margin-bottom:4px;font-size:14px}.row>.text[data-v-750b6b3e]{color:#000c;font-weight:500;width:100%}.row>.text>div[data-v-750b6b3e]{display:flex;width:100%;align-items:center;justify-content:space-between}.row>.text .configure[data-v-750b6b3e]{font-size:13px}.button[data-v-750b6b3e]{margin-bottom:8px}.button>span[data-v-750b6b3e]{margin-right:10px;color:#0009;font-size:12px;font-weight:500;border-radius:32px;background:rgba(0,0,0,.08);display:inline-block;height:24px;line-height:24px;padding:0 8px;justify-content:center;align-items:center;cursor:pointer}.input-switch[data-v-750b6b3e]{display:inline-block;cursor:pointer;position:relative}.input-switch span[data-v-750b6b3e]{display:block;position:relative;width:40px;height:20px;border-radius:10px;padding:2px}.input-switch span em[data-v-750b6b3e]{display:block;width:16px;height:16px;background-color:#fff;border-radius:10px}.input-switch span.enable[data-v-750b6b3e]{background-color:#297ff3;transition:.3s}.input-switch span.enable em[data-v-750b6b3e]{transform:translate(20px);transition:.3s}.input-switch span.close[data-v-750b6b3e]{background-color:#cecece;transition:.3s}.input-switch span.close em[data-v-750b6b3e]{transform:translate(0);transition:.3s}.tooltip-trigger[data-v-750b6b3e]{position:relative;display:inline-block;cursor:help;margin-right:6px}.tooltip-trigger .docker_tip[data-v-750b6b3e]{position:relative;top:2px}.tooltip-trigger .tooltip-text[data-v-750b6b3e]{visibility:hidden;position:absolute;padding:.5rem 1rem;background-color:#555;color:#fff;text-align:center;border-radius:6px;opacity:0;transition:opacity .6s}.tooltip-trigger .tooltip-text span[data-v-750b6b3e]{color:#fff}.tooltip-trigger .tooltip-text .docker_dir_tip[data-v-750b6b3e]{min-width:15rem;display:inline-block}.tooltip-trigger:hover .tooltip-text[data-v-750b6b3e]{visibility:visible;opacity:1}@keyframes bganimation-68b4579e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-68b4579e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-68b4579e{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-68b4579e{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-68b4579e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-68b4579e]{animation:slideInLeft-68b4579e .3s linear forwards}.slide-left-leave-active[data-v-68b4579e]{animation:slideInRight-68b4579e .3s linear forwards}@keyframes slideOutLeft-68b4579e{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-68b4579e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-68b4579e]{animation:slideOutLeft-68b4579e .3s linear forwards}.slide-right-leave-active[data-v-68b4579e]{animation:slideOutRight-68b4579e .3s linear forwards}.rotate-enter-active[data-v-68b4579e]{animation:rotateEnter-68b4579e .7s;position:relative}.rotate-leave-active[data-v-68b4579e]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-68b4579e]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-68b4579e]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-68b4579e]{color:#f9ad1e}.notice_info li[data-v-68b4579e]{font-size:14px;list-style:revert}.text-container[data-v-68b4579e]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-68b4579e]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-68b4579e]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-68b4579e]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-68b4579e]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-68b4579e]{width:100%}.text-container .text-container_item p.info-desc[data-v-68b4579e]{width:100%;color:#999;font-size:14px}.page-container[data-v-68b4579e]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-68b4579e]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-68b4579e]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-68b4579e]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-68b4579e],.page-container .page-flex .page-sidebar a[data-v-68b4579e]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-68b4579e]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-68b4579e]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-68b4579e]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-68b4579e]{border-radius:0;padding:1rem}ul.ul-container[data-v-68b4579e]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-68b4579e]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-68b4579e]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-68b4579e]{width:100%}form.form-container[data-v-68b4579e]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-68b4579e]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-68b4579e]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-68b4579e]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-68b4579e]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-68b4579e],form.form-container .label-value select[data-v-68b4579e]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-68b4579e]:focus,form.form-container .label-value select[data-v-68b4579e]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-68b4579e]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-68b4579e]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-68b4579e],form.form-container .label-value input[type=radio][data-v-68b4579e]{width:auto}form.form-container .label-value input[type=radio][data-v-68b4579e]{margin:0 4px 0 0}form.form-container .label-value input[data-v-68b4579e]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-68b4579e]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-68b4579e]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-68b4579e]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-68b4579e]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-68b4579e]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-68b4579e]:hover{background-color:#747474}form.form-container .label-msg[data-v-68b4579e]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-68b4579e]{color:#f9ad1e}form.form-container .label-flex[data-v-68b4579e]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-68b4579e]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-68b4579e]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-68b4579e]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-68b4579e]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-68b4579e]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-68b4579e]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-68b4579e],form.form-container1 .label-value select[data-v-68b4579e]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-68b4579e]:focus,form.form-container1 .label-value select[data-v-68b4579e]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-68b4579e]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-68b4579e],form.form-container1 .label-value input[type=radio][data-v-68b4579e]{width:auto}form.form-container1 .label-value input[type=radio][data-v-68b4579e]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-68b4579e]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-68b4579e]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-68b4579e]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-68b4579e]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-68b4579e]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-68b4579e]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-68b4579e]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-68b4579e]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-68b4579e]{color:#f9ad1e}form.form-container1 .label-flex[data-v-68b4579e]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-68b4579e]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-68b4579e]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-68b4579e]{width:100px}table.page-table th.checkbox[data-v-68b4579e]{width:50px;text-align:center}table.page-table th.setting[data-v-68b4579e]{width:100px;text-align:center}table.page-table thead[data-v-68b4579e]{color:#909399}table.page-table thead tr[data-v-68b4579e]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-68b4579e]{padding:10px 16px}table.page-table tbody tr[data-v-68b4579e]:hover{background-color:#eeee}table.page-table tbody tr[data-v-68b4579e]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-68b4579e]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-68b4579e]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-68b4579e]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-68b4579e]{width:100px}table.popups-table th.checkbox[data-v-68b4579e]{width:50px;text-align:center}table.popups-table th.setting[data-v-68b4579e]{width:100px;text-align:center}table.popups-table thead[data-v-68b4579e]{color:#eee}table.popups-table thead tr[data-v-68b4579e]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-68b4579e]{padding:10px 16px}table.popups-table tbody tr[data-v-68b4579e]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-68b4579e]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-68b4579e]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-68b4579e]{width:100%}header.header-desktop[data-v-68b4579e]{display:block}header.header-mobile[data-v-68b4579e]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-68b4579e]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-68b4579e]{width:100%;height:100%}header.header-mobile button svg path[data-v-68b4579e]{fill:#fff}nav.sidebar[data-v-68b4579e]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-68b4579e]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-68b4579e]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-68b4579e]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-68b4579e]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-68b4579e]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-68b4579e]{color:#fff}nav.sidebar .container .children[data-v-68b4579e]{padding-left:30px}@-moz-keyframes tada-68b4579e{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-68b4579e{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-68b4579e{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-68b4579e{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-68b4579e]{animation:dialogEnter-68b4579e .3s linear forwards}.dialog-leave-active[data-v-68b4579e]{animation:dialogLeave-68b4579e .3s linear forwards}@keyframes dialogEnter-68b4579e{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-68b4579e{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-68b4579e]{animation:dialogEnter-68b4579e .2s linear forwards}.dialog1-leave-active[data-v-68b4579e]{animation:dialogLeave-68b4579e .2s linear forwards}@keyframes rotateEnter-68b4579e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-68b4579e]{animation:rotateEnter-68b4579e .7s;position:relative}.rotate-leave-active[data-v-68b4579e]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-68b4579e{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-68b4579e{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-68b4579e]{animation:slideOutTop-68b4579e .5s linear forwards}.slide-top-leave-active[data-v-68b4579e],.slide-bottom-enter-active[data-v-68b4579e]{animation:slideOutBottom-68b4579e .5s linear forwards}@keyframes slideInLeft-68b4579e{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-68b4579e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-68b4579e]{animation:slideInLeft-68b4579e .3s linear forwards}.slide-left-leave-active[data-v-68b4579e]{animation:slideInRight-68b4579e .3s linear forwards}@keyframes slideOutLeft-68b4579e{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-68b4579e{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-68b4579e]{animation:slideOutLeft-68b4579e .3s linear forwards}.slide-right-leave-active[data-v-68b4579e]{animation:slideOutRight-68b4579e .3s linear forwards}@keyframes bganimation-68b4579e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-68b4579e{0%{height:0}to{height:100px}}@keyframes fadeEnd-68b4579e{0%{height:100%}to{height:0}}.fade-enter-active[data-v-68b4579e]{animation:fadeStart-68b4579e .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-68b4579e]{animation:fadeEnd-68b4579e .1s linear forwards;overflow:hidden}.select-editable[data-v-68b4579e]{position:relative;line-height:1.5rem;padding:.5rem .75rem;border:1px solid #dee2e6;border-radius:.25rem;margin:.25rem .1rem}.select-editable select[data-v-68b4579e],.select-editable input[data-v-68b4579e]{height:100%;padding:0;border:none;margin:0}.select-editable select[data-v-68b4579e]{position:relative;width:100%}.select-editable input[data-v-68b4579e]{position:absolute;top:0;left:.75rem;width:88%}.select-editable select[data-v-68b4579e]:focus,.select-editable input[data-v-68b4579e]:focus{outline:none;box-shadow:none}@keyframes bganimation-f4c41bf2{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-f4c41bf2{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-f4c41bf2{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-f4c41bf2{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-f4c41bf2{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-f4c41bf2]{animation:slideInLeft-f4c41bf2 .3s linear forwards}.slide-left-leave-active[data-v-f4c41bf2]{animation:slideInRight-f4c41bf2 .3s linear forwards}@keyframes slideOutLeft-f4c41bf2{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-f4c41bf2{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-f4c41bf2]{animation:slideOutLeft-f4c41bf2 .3s linear forwards}.slide-right-leave-active[data-v-f4c41bf2]{animation:slideOutRight-f4c41bf2 .3s linear forwards}.rotate-enter-active[data-v-f4c41bf2]{animation:rotateEnter-f4c41bf2 .7s;position:relative}.rotate-leave-active[data-v-f4c41bf2]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-f4c41bf2]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-f4c41bf2]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-f4c41bf2]{color:#f9ad1e}.notice_info li[data-v-f4c41bf2]{font-size:14px;list-style:revert}.text-container[data-v-f4c41bf2]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-f4c41bf2]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-f4c41bf2]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-f4c41bf2]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-f4c41bf2]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-f4c41bf2]{width:100%}.text-container .text-container_item p.info-desc[data-v-f4c41bf2]{width:100%;color:#999;font-size:14px}.page-container[data-v-f4c41bf2]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-f4c41bf2]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-f4c41bf2]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-f4c41bf2]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-f4c41bf2],.page-container .page-flex .page-sidebar a[data-v-f4c41bf2]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-f4c41bf2]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-f4c41bf2]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-f4c41bf2]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-f4c41bf2]{border-radius:0;padding:1rem}ul.ul-container[data-v-f4c41bf2]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-f4c41bf2]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-f4c41bf2]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-f4c41bf2]{width:100%}form.form-container[data-v-f4c41bf2]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-f4c41bf2]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-f4c41bf2]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-f4c41bf2]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-f4c41bf2]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-f4c41bf2],form.form-container .label-value select[data-v-f4c41bf2]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-f4c41bf2]:focus,form.form-container .label-value select[data-v-f4c41bf2]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-f4c41bf2]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-f4c41bf2]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-f4c41bf2],form.form-container .label-value input[type=radio][data-v-f4c41bf2]{width:auto}form.form-container .label-value input[type=radio][data-v-f4c41bf2]{margin:0 4px 0 0}form.form-container .label-value input[data-v-f4c41bf2]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-f4c41bf2]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-f4c41bf2]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-f4c41bf2]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-f4c41bf2]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-f4c41bf2]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-f4c41bf2]:hover{background-color:#747474}form.form-container .label-msg[data-v-f4c41bf2]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-f4c41bf2]{color:#f9ad1e}form.form-container .label-flex[data-v-f4c41bf2]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-f4c41bf2]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-f4c41bf2]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-f4c41bf2]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-f4c41bf2]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-f4c41bf2]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-f4c41bf2]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-f4c41bf2],form.form-container1 .label-value select[data-v-f4c41bf2]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-f4c41bf2]:focus,form.form-container1 .label-value select[data-v-f4c41bf2]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-f4c41bf2]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-f4c41bf2],form.form-container1 .label-value input[type=radio][data-v-f4c41bf2]{width:auto}form.form-container1 .label-value input[type=radio][data-v-f4c41bf2]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-f4c41bf2]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-f4c41bf2]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-f4c41bf2]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-f4c41bf2]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-f4c41bf2]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-f4c41bf2]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-f4c41bf2]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-f4c41bf2]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-f4c41bf2]{color:#f9ad1e}form.form-container1 .label-flex[data-v-f4c41bf2]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-f4c41bf2]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-f4c41bf2]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-f4c41bf2]{width:100px}table.page-table th.checkbox[data-v-f4c41bf2]{width:50px;text-align:center}table.page-table th.setting[data-v-f4c41bf2]{width:100px;text-align:center}table.page-table thead[data-v-f4c41bf2]{color:#909399}table.page-table thead tr[data-v-f4c41bf2]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-f4c41bf2]{padding:10px 16px}table.page-table tbody tr[data-v-f4c41bf2]:hover{background-color:#eeee}table.page-table tbody tr[data-v-f4c41bf2]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-f4c41bf2]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-f4c41bf2]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-f4c41bf2]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-f4c41bf2]{width:100px}table.popups-table th.checkbox[data-v-f4c41bf2]{width:50px;text-align:center}table.popups-table th.setting[data-v-f4c41bf2]{width:100px;text-align:center}table.popups-table thead[data-v-f4c41bf2]{color:#eee}table.popups-table thead tr[data-v-f4c41bf2]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-f4c41bf2]{padding:10px 16px}table.popups-table tbody tr[data-v-f4c41bf2]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-f4c41bf2]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-f4c41bf2]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-f4c41bf2]{width:100%}header.header-desktop[data-v-f4c41bf2]{display:block}header.header-mobile[data-v-f4c41bf2]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-f4c41bf2]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-f4c41bf2]{width:100%;height:100%}header.header-mobile button svg path[data-v-f4c41bf2]{fill:#fff}nav.sidebar[data-v-f4c41bf2]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-f4c41bf2]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-f4c41bf2]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-f4c41bf2]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-f4c41bf2]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-f4c41bf2]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-f4c41bf2]{color:#fff}nav.sidebar .container .children[data-v-f4c41bf2]{padding-left:30px}@-moz-keyframes tada-f4c41bf2{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-f4c41bf2{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-f4c41bf2{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-f4c41bf2{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-f4c41bf2]{animation:dialogEnter-f4c41bf2 .3s linear forwards}.dialog-leave-active[data-v-f4c41bf2]{animation:dialogLeave-f4c41bf2 .3s linear forwards}@keyframes dialogEnter-f4c41bf2{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-f4c41bf2{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-f4c41bf2]{animation:dialogEnter-f4c41bf2 .2s linear forwards}.dialog1-leave-active[data-v-f4c41bf2]{animation:dialogLeave-f4c41bf2 .2s linear forwards}@keyframes rotateEnter-f4c41bf2{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-f4c41bf2]{animation:rotateEnter-f4c41bf2 .7s;position:relative}.rotate-leave-active[data-v-f4c41bf2]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-f4c41bf2{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-f4c41bf2{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-f4c41bf2]{animation:slideOutTop-f4c41bf2 .5s linear forwards}.slide-top-leave-active[data-v-f4c41bf2],.slide-bottom-enter-active[data-v-f4c41bf2]{animation:slideOutBottom-f4c41bf2 .5s linear forwards}@keyframes slideInLeft-f4c41bf2{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-f4c41bf2{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-f4c41bf2]{animation:slideInLeft-f4c41bf2 .3s linear forwards}.slide-left-leave-active[data-v-f4c41bf2]{animation:slideInRight-f4c41bf2 .3s linear forwards}@keyframes slideOutLeft-f4c41bf2{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-f4c41bf2{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-f4c41bf2]{animation:slideOutLeft-f4c41bf2 .3s linear forwards}.slide-right-leave-active[data-v-f4c41bf2]{animation:slideOutRight-f4c41bf2 .3s linear forwards}@keyframes bganimation-f4c41bf2{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-f4c41bf2{0%{height:0}to{height:100px}}@keyframes fadeEnd-f4c41bf2{0%{height:100%}to{height:0}}.fade-enter-active[data-v-f4c41bf2]{animation:fadeStart-f4c41bf2 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-f4c41bf2]{animation:fadeEnd-f4c41bf2 .1s linear forwards;overflow:hidden}.action[data-v-f4c41bf2]{width:860px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;padding:1rem 87px;border-radius:6px}.action p[data-v-f4c41bf2]{color:#999;font-size:14px}.action input[data-v-f4c41bf2]{font-size:14px;font-family:PingFangSC-Regular,PingFang SC}.action h2.title[data-v-f4c41bf2]{width:100%;color:#1e1e1e;font-size:22px;font-family:PingFangSC-Medium,PingFang SC;padding:0;margin:0;text-align:center}.action span[data-v-f4c41bf2]{font-size:14px;font-family:PingFangSC-Medium,PingFang SC;color:#000000d4;font-weight:700}.action form label[data-v-f4c41bf2]{width:100%}.action form label input[data-v-f4c41bf2],.action form label select[data-v-f4c41bf2]{height:100%;font-size:14px}.action .myinput_wrap[data-v-f4c41bf2],.action .RPC_input[data-v-f4c41bf2]{width:85%}.action .myinput_wrap textarea[data-v-f4c41bf2]{width:100%;padding:2px 3px;border:1px solid #dee2e6;border-radius:.25rem}.action .input_row[data-v-f4c41bf2]{margin:16px 0;display:flex;justify-content:left;align-items:center}.action .input_row .radios[data-v-f4c41bf2]{margin-right:10px}.action .input_row .radios input[data-v-f4c41bf2],.action .input_row .radios label[data-v-f4c41bf2]{cursor:pointer}.action .Tracker label[data-v-f4c41bf2]{margin-right:10px;cursor:pointer}.action .Tracker_input[data-v-f4c41bf2]{padding:6px 2px}.action .btns[data-v-f4c41bf2]{width:100%;margin:0 auto}.action .btns button[data-v-f4c41bf2]{display:block;width:100%!important;margin-bottom:8px}.action .tooltip-trigger[data-v-f4c41bf2]{position:relative;display:inline-block;cursor:help;margin-right:6px}.action .tooltip-trigger .tooltip-text[data-v-f4c41bf2]{visibility:hidden;position:absolute;padding:.5rem 1rem;background-color:#555;color:#fff;text-align:center;border-radius:6px;opacity:0;transition:opacity .6s}.action .tooltip-trigger .tooltip-text span[data-v-f4c41bf2]{color:#fff}.action .tooltip-trigger .tooltip-text .dowload_dir_tip[data-v-f4c41bf2]{min-width:14rem;display:inline-block}.action .tooltip-trigger:hover .tooltip-text[data-v-f4c41bf2]{visibility:visible;opacity:1}.action .tooltip-top[data-v-f4c41bf2]{bottom:100%;left:50%;margin-bottom:5px;transform:translate(-50%)}.action .tooltip-bottom[data-v-f4c41bf2]{top:100%;left:50%;margin-top:5px;transform:translate(-50%)}.action .tooltip-bottom .dowload_rpc_tip[data-v-f4c41bf2]{min-width:10rem;display:inline-block}.action .tooltip-right[data-v-f4c41bf2]{top:50%;left:100%;margin-left:5px;transform:translateY(-50%)}.action .tooltip-left[data-v-f4c41bf2]{top:50%;right:100%;margin-right:5px;transform:translateY(-50%)}.action .tooltip-top[data-v-f4c41bf2]:after{content:\"\";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:#555 transparent transparent transparent}.action .tooltip-bottom[data-v-f4c41bf2]:after{content:\"\";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:transparent transparent #555 transparent}.action .successed[data-v-f4c41bf2]{text-align:center;font-size:14px}.action .finished[data-v-f4c41bf2]{display:flex;justify-content:center;margin:80px 80px 28px}.left[data-v-f4c41bf2]{display:flex;align-items:center;justify-content:flex-start;width:110px;flex:none}.select-editable[data-v-f4c41bf2]{position:relative;border:1px solid #dee2e6;border-radius:.25rem;margin:.25rem .1rem}.select-editable select[data-v-f4c41bf2]{top:0;left:0;font-size:14px;border:none;width:100%;margin:0}.select-editable input[data-v-f4c41bf2]{position:absolute;top:-4px;left:0;width:95%;padding:1px;font-size:14px;border:none}.select-editable select[data-v-f4c41bf2]:focus,.select-editable input[data-v-f4c41bf2]:focus{outline:none}[data-v-f4c41bf2]::placeholder{color:#999}@keyframes bganimation-f4c41bf2{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-f4c41bf2{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-f4c41bf2{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-f4c41bf2{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-f4c41bf2{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-f4c41bf2]{animation:slideInLeft-f4c41bf2 .3s linear forwards}.slide-left-leave-active[data-v-f4c41bf2]{animation:slideInRight-f4c41bf2 .3s linear forwards}@keyframes slideOutLeft-f4c41bf2{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-f4c41bf2{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-f4c41bf2]{animation:slideOutLeft-f4c41bf2 .3s linear forwards}.slide-right-leave-active[data-v-f4c41bf2]{animation:slideOutRight-f4c41bf2 .3s linear forwards}.rotate-enter-active[data-v-f4c41bf2]{animation:rotateEnter-f4c41bf2 .7s;position:relative}.rotate-leave-active[data-v-f4c41bf2]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-f4c41bf2]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-f4c41bf2]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-f4c41bf2]{color:#f9ad1e}.notice_info li[data-v-f4c41bf2]{font-size:14px;list-style:revert}.text-container[data-v-f4c41bf2]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-f4c41bf2]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-f4c41bf2]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-f4c41bf2]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-f4c41bf2]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-f4c41bf2]{width:100%}.text-container .text-container_item p.info-desc[data-v-f4c41bf2]{width:100%;color:#999;font-size:14px}.page-container[data-v-f4c41bf2]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-f4c41bf2]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-f4c41bf2]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-f4c41bf2]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-f4c41bf2],.page-container .page-flex .page-sidebar a[data-v-f4c41bf2]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-f4c41bf2]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-f4c41bf2]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-f4c41bf2]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-f4c41bf2]{border-radius:0;padding:1rem}ul.ul-container[data-v-f4c41bf2]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-f4c41bf2]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-f4c41bf2]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-f4c41bf2]{width:100%}form.form-container[data-v-f4c41bf2]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-f4c41bf2]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-f4c41bf2]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-f4c41bf2]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-f4c41bf2]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-f4c41bf2],form.form-container .label-value select[data-v-f4c41bf2]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-f4c41bf2]:focus,form.form-container .label-value select[data-v-f4c41bf2]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-f4c41bf2]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-f4c41bf2]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-f4c41bf2],form.form-container .label-value input[type=radio][data-v-f4c41bf2]{width:auto}form.form-container .label-value input[type=radio][data-v-f4c41bf2]{margin:0 4px 0 0}form.form-container .label-value input[data-v-f4c41bf2]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-f4c41bf2]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-f4c41bf2]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-f4c41bf2]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-f4c41bf2]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-f4c41bf2]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-f4c41bf2]:hover{background-color:#747474}form.form-container .label-msg[data-v-f4c41bf2]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-f4c41bf2]{color:#f9ad1e}form.form-container .label-flex[data-v-f4c41bf2]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-f4c41bf2]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-f4c41bf2]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-f4c41bf2]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-f4c41bf2]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-f4c41bf2]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-f4c41bf2]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-f4c41bf2],form.form-container1 .label-value select[data-v-f4c41bf2]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-f4c41bf2]:focus,form.form-container1 .label-value select[data-v-f4c41bf2]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-f4c41bf2]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-f4c41bf2],form.form-container1 .label-value input[type=radio][data-v-f4c41bf2]{width:auto}form.form-container1 .label-value input[type=radio][data-v-f4c41bf2]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-f4c41bf2]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-f4c41bf2]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-f4c41bf2]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-f4c41bf2]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-f4c41bf2]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-f4c41bf2]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-f4c41bf2]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-f4c41bf2]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-f4c41bf2]{color:#f9ad1e}form.form-container1 .label-flex[data-v-f4c41bf2]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-f4c41bf2]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-f4c41bf2]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-f4c41bf2]{width:100px}table.page-table th.checkbox[data-v-f4c41bf2]{width:50px;text-align:center}table.page-table th.setting[data-v-f4c41bf2]{width:100px;text-align:center}table.page-table thead[data-v-f4c41bf2]{color:#909399}table.page-table thead tr[data-v-f4c41bf2]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-f4c41bf2]{padding:10px 16px}table.page-table tbody tr[data-v-f4c41bf2]:hover{background-color:#eeee}table.page-table tbody tr[data-v-f4c41bf2]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-f4c41bf2]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-f4c41bf2]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-f4c41bf2]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-f4c41bf2]{width:100px}table.popups-table th.checkbox[data-v-f4c41bf2]{width:50px;text-align:center}table.popups-table th.setting[data-v-f4c41bf2]{width:100px;text-align:center}table.popups-table thead[data-v-f4c41bf2]{color:#eee}table.popups-table thead tr[data-v-f4c41bf2]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-f4c41bf2]{padding:10px 16px}table.popups-table tbody tr[data-v-f4c41bf2]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-f4c41bf2]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-f4c41bf2]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-f4c41bf2]{width:100%}header.header-desktop[data-v-f4c41bf2]{display:block}header.header-mobile[data-v-f4c41bf2]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-f4c41bf2]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-f4c41bf2]{width:100%;height:100%}header.header-mobile button svg path[data-v-f4c41bf2]{fill:#fff}nav.sidebar[data-v-f4c41bf2]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-f4c41bf2]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-f4c41bf2]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-f4c41bf2]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-f4c41bf2]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-f4c41bf2]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-f4c41bf2]{color:#fff}nav.sidebar .container .children[data-v-f4c41bf2]{padding-left:30px}@-moz-keyframes tada-f4c41bf2{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-f4c41bf2{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-f4c41bf2{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-f4c41bf2{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-f4c41bf2]{animation:dialogEnter-f4c41bf2 .3s linear forwards}.dialog-leave-active[data-v-f4c41bf2]{animation:dialogLeave-f4c41bf2 .3s linear forwards}@keyframes dialogEnter-f4c41bf2{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-f4c41bf2{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-f4c41bf2]{animation:dialogEnter-f4c41bf2 .2s linear forwards}.dialog1-leave-active[data-v-f4c41bf2]{animation:dialogLeave-f4c41bf2 .2s linear forwards}@keyframes rotateEnter-f4c41bf2{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-f4c41bf2]{animation:rotateEnter-f4c41bf2 .7s;position:relative}.rotate-leave-active[data-v-f4c41bf2]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-f4c41bf2{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-f4c41bf2{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-f4c41bf2]{animation:slideOutTop-f4c41bf2 .5s linear forwards}.slide-top-leave-active[data-v-f4c41bf2],.slide-bottom-enter-active[data-v-f4c41bf2]{animation:slideOutBottom-f4c41bf2 .5s linear forwards}@keyframes slideInLeft-f4c41bf2{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-f4c41bf2{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-f4c41bf2]{animation:slideInLeft-f4c41bf2 .3s linear forwards}.slide-left-leave-active[data-v-f4c41bf2]{animation:slideInRight-f4c41bf2 .3s linear forwards}@keyframes slideOutLeft-f4c41bf2{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-f4c41bf2{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-f4c41bf2]{animation:slideOutLeft-f4c41bf2 .3s linear forwards}.slide-right-leave-active[data-v-f4c41bf2]{animation:slideOutRight-f4c41bf2 .3s linear forwards}@keyframes bganimation-f4c41bf2{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-f4c41bf2{0%{height:0}to{height:100px}}@keyframes fadeEnd-f4c41bf2{0%{height:100%}to{height:0}}.fade-enter-active[data-v-f4c41bf2]{animation:fadeStart-f4c41bf2 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-f4c41bf2]{animation:fadeEnd-f4c41bf2 .1s linear forwards;overflow:hidden}@media screen and (max-width: 500px){.action[data-v-f4c41bf2]{width:100%}.action .input_row[data-v-f4c41bf2]{display:block}.action .input_row .myinput_wrap[data-v-f4c41bf2],.action .input_row .RPC_input[data-v-f4c41bf2]{width:100%}}@keyframes bganimation-63fbd04d{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-63fbd04d{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-63fbd04d{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-63fbd04d{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-63fbd04d{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-63fbd04d]{animation:slideInLeft-63fbd04d .3s linear forwards}.slide-left-leave-active[data-v-63fbd04d]{animation:slideInRight-63fbd04d .3s linear forwards}@keyframes slideOutLeft-63fbd04d{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-63fbd04d{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-63fbd04d]{animation:slideOutLeft-63fbd04d .3s linear forwards}.slide-right-leave-active[data-v-63fbd04d]{animation:slideOutRight-63fbd04d .3s linear forwards}.rotate-enter-active[data-v-63fbd04d]{animation:rotateEnter-63fbd04d .7s;position:relative}.rotate-leave-active[data-v-63fbd04d]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-63fbd04d]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-63fbd04d]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-63fbd04d]{color:#f9ad1e}.notice_info li[data-v-63fbd04d]{font-size:14px;list-style:revert}.text-container[data-v-63fbd04d]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-63fbd04d]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-63fbd04d]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-63fbd04d]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-63fbd04d]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-63fbd04d]{width:100%}.text-container .text-container_item p.info-desc[data-v-63fbd04d]{width:100%;color:#999;font-size:14px}.page-container[data-v-63fbd04d]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-63fbd04d]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-63fbd04d]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-63fbd04d]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-63fbd04d],.page-container .page-flex .page-sidebar a[data-v-63fbd04d]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-63fbd04d]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-63fbd04d]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-63fbd04d]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-63fbd04d]{border-radius:0;padding:1rem}ul.ul-container[data-v-63fbd04d]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-63fbd04d]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-63fbd04d]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-63fbd04d]{width:100%}form.form-container[data-v-63fbd04d]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-63fbd04d]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-63fbd04d]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-63fbd04d]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-63fbd04d]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-63fbd04d],form.form-container .label-value select[data-v-63fbd04d]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-63fbd04d]:focus,form.form-container .label-value select[data-v-63fbd04d]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-63fbd04d]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-63fbd04d]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-63fbd04d],form.form-container .label-value input[type=radio][data-v-63fbd04d]{width:auto}form.form-container .label-value input[type=radio][data-v-63fbd04d]{margin:0 4px 0 0}form.form-container .label-value input[data-v-63fbd04d]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-63fbd04d]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-63fbd04d]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-63fbd04d]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-63fbd04d]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-63fbd04d]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-63fbd04d]:hover{background-color:#747474}form.form-container .label-msg[data-v-63fbd04d]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-63fbd04d]{color:#f9ad1e}form.form-container .label-flex[data-v-63fbd04d]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-63fbd04d]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-63fbd04d]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-63fbd04d]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-63fbd04d]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-63fbd04d]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-63fbd04d]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-63fbd04d],form.form-container1 .label-value select[data-v-63fbd04d]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-63fbd04d]:focus,form.form-container1 .label-value select[data-v-63fbd04d]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-63fbd04d]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-63fbd04d],form.form-container1 .label-value input[type=radio][data-v-63fbd04d]{width:auto}form.form-container1 .label-value input[type=radio][data-v-63fbd04d]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-63fbd04d]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-63fbd04d]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-63fbd04d]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-63fbd04d]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-63fbd04d]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-63fbd04d]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-63fbd04d]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-63fbd04d]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-63fbd04d]{color:#f9ad1e}form.form-container1 .label-flex[data-v-63fbd04d]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-63fbd04d]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-63fbd04d]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-63fbd04d]{width:100px}table.page-table th.checkbox[data-v-63fbd04d]{width:50px;text-align:center}table.page-table th.setting[data-v-63fbd04d]{width:100px;text-align:center}table.page-table thead[data-v-63fbd04d]{color:#909399}table.page-table thead tr[data-v-63fbd04d]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-63fbd04d]{padding:10px 16px}table.page-table tbody tr[data-v-63fbd04d]:hover{background-color:#eeee}table.page-table tbody tr[data-v-63fbd04d]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-63fbd04d]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-63fbd04d]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-63fbd04d]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-63fbd04d]{width:100px}table.popups-table th.checkbox[data-v-63fbd04d]{width:50px;text-align:center}table.popups-table th.setting[data-v-63fbd04d]{width:100px;text-align:center}table.popups-table thead[data-v-63fbd04d]{color:#eee}table.popups-table thead tr[data-v-63fbd04d]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-63fbd04d]{padding:10px 16px}table.popups-table tbody tr[data-v-63fbd04d]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-63fbd04d]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-63fbd04d]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-63fbd04d]{width:100%}header.header-desktop[data-v-63fbd04d]{display:block}header.header-mobile[data-v-63fbd04d]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-63fbd04d]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-63fbd04d]{width:100%;height:100%}header.header-mobile button svg path[data-v-63fbd04d]{fill:#fff}nav.sidebar[data-v-63fbd04d]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-63fbd04d]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-63fbd04d]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-63fbd04d]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-63fbd04d]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-63fbd04d]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-63fbd04d]{color:#fff}nav.sidebar .container .children[data-v-63fbd04d]{padding-left:30px}@-moz-keyframes tada-63fbd04d{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-63fbd04d{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-63fbd04d{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-63fbd04d{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-63fbd04d]{animation:dialogEnter-63fbd04d .3s linear forwards}.dialog-leave-active[data-v-63fbd04d]{animation:dialogLeave-63fbd04d .3s linear forwards}@keyframes dialogEnter-63fbd04d{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-63fbd04d{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-63fbd04d]{animation:dialogEnter-63fbd04d .2s linear forwards}.dialog1-leave-active[data-v-63fbd04d]{animation:dialogLeave-63fbd04d .2s linear forwards}@keyframes rotateEnter-63fbd04d{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-63fbd04d]{animation:rotateEnter-63fbd04d .7s;position:relative}.rotate-leave-active[data-v-63fbd04d]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-63fbd04d{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-63fbd04d{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-63fbd04d]{animation:slideOutTop-63fbd04d .5s linear forwards}.slide-top-leave-active[data-v-63fbd04d],.slide-bottom-enter-active[data-v-63fbd04d]{animation:slideOutBottom-63fbd04d .5s linear forwards}@keyframes slideInLeft-63fbd04d{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-63fbd04d{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-63fbd04d]{animation:slideInLeft-63fbd04d .3s linear forwards}.slide-left-leave-active[data-v-63fbd04d]{animation:slideInRight-63fbd04d .3s linear forwards}@keyframes slideOutLeft-63fbd04d{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-63fbd04d{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-63fbd04d]{animation:slideOutLeft-63fbd04d .3s linear forwards}.slide-right-leave-active[data-v-63fbd04d]{animation:slideOutRight-63fbd04d .3s linear forwards}@keyframes bganimation-63fbd04d{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-63fbd04d{0%{height:0}to{height:100px}}@keyframes fadeEnd-63fbd04d{0%{height:100%}to{height:0}}.fade-enter-active[data-v-63fbd04d]{animation:fadeStart-63fbd04d .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-63fbd04d]{animation:fadeEnd-63fbd04d .1s linear forwards;overflow:hidden}.service-item[data-v-63fbd04d]{border-radius:8px;background:#f2efee;padding:8px 12px;display:flex;flex-direction:column;margin-bottom:4px}.service-item>.name[data-v-63fbd04d]{display:flex;justify-content:space-between;margin-bottom:4px;align-items:center}.service-item>.name>span[data-v-63fbd04d]{display:flex;align-items:center}.service-item>.name>span span[data-v-63fbd04d]{display:inline-block;text-align:center;color:#000c}.service-item>.name>span span[data-v-63fbd04d]:first-of-type{font-size:16px;font-weight:600;margin-right:8px}.service-item>.name>span span[data-v-63fbd04d]:last-of-type{font-size:12px}.service-item>.info[data-v-63fbd04d]{flex:1}.service-item>.info a[data-v-63fbd04d]{color:#0166ff}.service-item>.info>span[data-v-63fbd04d]{display:inline-block;width:100%;font-size:13px;font-weight:500}.service-item>.info>div[data-v-63fbd04d]{margin-top:8px;color:#0009;font-size:12px}.service-item .button[data-v-63fbd04d]{text-align:right}.service-item .button>span[data-v-63fbd04d]{margin-left:10px;color:#0009;font-size:12px;font-weight:500;border-radius:32px;background:rgba(0,0,0,.08);display:inline-block;height:24px;line-height:24px;padding:0 8px;justify-content:center;align-items:center;cursor:pointer}@keyframes bganimation-a711c820{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-a711c820{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-a711c820{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-a711c820{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-a711c820{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-a711c820]{animation:slideInLeft-a711c820 .3s linear forwards}.slide-left-leave-active[data-v-a711c820]{animation:slideInRight-a711c820 .3s linear forwards}@keyframes slideOutLeft-a711c820{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-a711c820{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-a711c820]{animation:slideOutLeft-a711c820 .3s linear forwards}.slide-right-leave-active[data-v-a711c820]{animation:slideOutRight-a711c820 .3s linear forwards}.rotate-enter-active[data-v-a711c820]{animation:rotateEnter-a711c820 .7s;position:relative}.rotate-leave-active[data-v-a711c820]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-a711c820]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-a711c820]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-a711c820]{color:#f9ad1e}.notice_info li[data-v-a711c820]{font-size:14px;list-style:revert}.text-container[data-v-a711c820]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-a711c820]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-a711c820]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-a711c820]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-a711c820]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-a711c820]{width:100%}.text-container .text-container_item p.info-desc[data-v-a711c820]{width:100%;color:#999;font-size:14px}.page-container[data-v-a711c820]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-a711c820]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-a711c820]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-a711c820]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-a711c820],.page-container .page-flex .page-sidebar a[data-v-a711c820]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-a711c820]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-a711c820]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-a711c820]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-a711c820]{border-radius:0;padding:1rem}ul.ul-container[data-v-a711c820]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-a711c820]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-a711c820]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-a711c820]{width:100%}form.form-container[data-v-a711c820]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-a711c820]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-a711c820]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-a711c820]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-a711c820]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-a711c820],form.form-container .label-value select[data-v-a711c820]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-a711c820]:focus,form.form-container .label-value select[data-v-a711c820]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-a711c820]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-a711c820]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-a711c820],form.form-container .label-value input[type=radio][data-v-a711c820]{width:auto}form.form-container .label-value input[type=radio][data-v-a711c820]{margin:0 4px 0 0}form.form-container .label-value input[data-v-a711c820]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-a711c820]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-a711c820]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-a711c820]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-a711c820]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-a711c820]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-a711c820]:hover{background-color:#747474}form.form-container .label-msg[data-v-a711c820]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-a711c820]{color:#f9ad1e}form.form-container .label-flex[data-v-a711c820]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-a711c820]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-a711c820]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-a711c820]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-a711c820]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-a711c820]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-a711c820]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-a711c820],form.form-container1 .label-value select[data-v-a711c820]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-a711c820]:focus,form.form-container1 .label-value select[data-v-a711c820]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-a711c820]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-a711c820],form.form-container1 .label-value input[type=radio][data-v-a711c820]{width:auto}form.form-container1 .label-value input[type=radio][data-v-a711c820]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-a711c820]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-a711c820]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-a711c820]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-a711c820]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-a711c820]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-a711c820]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-a711c820]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-a711c820]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-a711c820]{color:#f9ad1e}form.form-container1 .label-flex[data-v-a711c820]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-a711c820]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-a711c820]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-a711c820]{width:100px}table.page-table th.checkbox[data-v-a711c820]{width:50px;text-align:center}table.page-table th.setting[data-v-a711c820]{width:100px;text-align:center}table.page-table thead[data-v-a711c820]{color:#909399}table.page-table thead tr[data-v-a711c820]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-a711c820]{padding:10px 16px}table.page-table tbody tr[data-v-a711c820]:hover{background-color:#eeee}table.page-table tbody tr[data-v-a711c820]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-a711c820]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-a711c820]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-a711c820]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-a711c820]{width:100px}table.popups-table th.checkbox[data-v-a711c820]{width:50px;text-align:center}table.popups-table th.setting[data-v-a711c820]{width:100px;text-align:center}table.popups-table thead[data-v-a711c820]{color:#eee}table.popups-table thead tr[data-v-a711c820]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-a711c820]{padding:10px 16px}table.popups-table tbody tr[data-v-a711c820]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-a711c820]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-a711c820]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-a711c820]{width:100%}header.header-desktop[data-v-a711c820]{display:block}header.header-mobile[data-v-a711c820]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-a711c820]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-a711c820]{width:100%;height:100%}header.header-mobile button svg path[data-v-a711c820]{fill:#fff}nav.sidebar[data-v-a711c820]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-a711c820]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-a711c820]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-a711c820]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-a711c820]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-a711c820]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-a711c820]{color:#fff}nav.sidebar .container .children[data-v-a711c820]{padding-left:30px}@-moz-keyframes tada-a711c820{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-a711c820{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-a711c820{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-a711c820{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-a711c820]{animation:dialogEnter-a711c820 .3s linear forwards}.dialog-leave-active[data-v-a711c820]{animation:dialogLeave-a711c820 .3s linear forwards}@keyframes dialogEnter-a711c820{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-a711c820{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-a711c820]{animation:dialogEnter-a711c820 .2s linear forwards}.dialog1-leave-active[data-v-a711c820]{animation:dialogLeave-a711c820 .2s linear forwards}@keyframes rotateEnter-a711c820{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-a711c820]{animation:rotateEnter-a711c820 .7s;position:relative}.rotate-leave-active[data-v-a711c820]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-a711c820{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-a711c820{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-a711c820]{animation:slideOutTop-a711c820 .5s linear forwards}.slide-top-leave-active[data-v-a711c820],.slide-bottom-enter-active[data-v-a711c820]{animation:slideOutBottom-a711c820 .5s linear forwards}@keyframes slideInLeft-a711c820{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-a711c820{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-a711c820]{animation:slideInLeft-a711c820 .3s linear forwards}.slide-left-leave-active[data-v-a711c820]{animation:slideInRight-a711c820 .3s linear forwards}@keyframes slideOutLeft-a711c820{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-a711c820{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-a711c820]{animation:slideOutLeft-a711c820 .3s linear forwards}.slide-right-leave-active[data-v-a711c820]{animation:slideOutRight-a711c820 .3s linear forwards}@keyframes bganimation-a711c820{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-a711c820{0%{height:0}to{height:100px}}@keyframes fadeEnd-a711c820{0%{height:100%}to{height:0}}.fade-enter-active[data-v-a711c820]{animation:fadeStart-a711c820 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-a711c820]{animation:fadeEnd-a711c820 .1s linear forwards;overflow:hidden}.container[data-v-a711c820]{width:100%;padding:60px 0}.desc[data-v-a711c820]{text-align:center;width:452px;margin:0 auto 40px}.desc a[data-v-a711c820]{color:#06f}.desc span[data-v-a711c820]{display:inline-block;width:100%}.btn[data-v-a711c820]{display:block;padding:10px 32px;border-radius:4px;background:#0060ff;color:#fff;margin:0 auto;width:fit-content}@keyframes bganimation-7c1d7115{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-7c1d7115{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-7c1d7115{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-7c1d7115{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-7c1d7115{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-7c1d7115]{animation:slideInLeft-7c1d7115 .3s linear forwards}.slide-left-leave-active[data-v-7c1d7115]{animation:slideInRight-7c1d7115 .3s linear forwards}@keyframes slideOutLeft-7c1d7115{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-7c1d7115{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-7c1d7115]{animation:slideOutLeft-7c1d7115 .3s linear forwards}.slide-right-leave-active[data-v-7c1d7115]{animation:slideOutRight-7c1d7115 .3s linear forwards}.rotate-enter-active[data-v-7c1d7115]{animation:rotateEnter-7c1d7115 .7s;position:relative}.rotate-leave-active[data-v-7c1d7115]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-7c1d7115]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-7c1d7115]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-7c1d7115]{color:#f9ad1e}.notice_info li[data-v-7c1d7115]{font-size:14px;list-style:revert}.text-container[data-v-7c1d7115]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-7c1d7115]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-7c1d7115]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-7c1d7115]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-7c1d7115]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-7c1d7115]{width:100%}.text-container .text-container_item p.info-desc[data-v-7c1d7115]{width:100%;color:#999;font-size:14px}.page-container[data-v-7c1d7115]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-7c1d7115]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-7c1d7115]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-7c1d7115]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-7c1d7115],.page-container .page-flex .page-sidebar a[data-v-7c1d7115]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-7c1d7115]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-7c1d7115]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-7c1d7115]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-7c1d7115]{border-radius:0;padding:1rem}ul.ul-container[data-v-7c1d7115]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-7c1d7115]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-7c1d7115]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-7c1d7115]{width:100%}form.form-container[data-v-7c1d7115]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-7c1d7115]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-7c1d7115]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-7c1d7115]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-7c1d7115]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-7c1d7115],form.form-container .label-value select[data-v-7c1d7115]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-7c1d7115]:focus,form.form-container .label-value select[data-v-7c1d7115]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-7c1d7115]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-7c1d7115]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-7c1d7115],form.form-container .label-value input[type=radio][data-v-7c1d7115]{width:auto}form.form-container .label-value input[type=radio][data-v-7c1d7115]{margin:0 4px 0 0}form.form-container .label-value input[data-v-7c1d7115]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-7c1d7115]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-7c1d7115]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-7c1d7115]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-7c1d7115]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-7c1d7115]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-7c1d7115]:hover{background-color:#747474}form.form-container .label-msg[data-v-7c1d7115]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-7c1d7115]{color:#f9ad1e}form.form-container .label-flex[data-v-7c1d7115]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-7c1d7115]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-7c1d7115]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-7c1d7115]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-7c1d7115]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-7c1d7115]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-7c1d7115]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-7c1d7115],form.form-container1 .label-value select[data-v-7c1d7115]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-7c1d7115]:focus,form.form-container1 .label-value select[data-v-7c1d7115]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-7c1d7115]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-7c1d7115],form.form-container1 .label-value input[type=radio][data-v-7c1d7115]{width:auto}form.form-container1 .label-value input[type=radio][data-v-7c1d7115]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-7c1d7115]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-7c1d7115]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-7c1d7115]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-7c1d7115]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-7c1d7115]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-7c1d7115]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-7c1d7115]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-7c1d7115]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-7c1d7115]{color:#f9ad1e}form.form-container1 .label-flex[data-v-7c1d7115]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-7c1d7115]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-7c1d7115]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-7c1d7115]{width:100px}table.page-table th.checkbox[data-v-7c1d7115]{width:50px;text-align:center}table.page-table th.setting[data-v-7c1d7115]{width:100px;text-align:center}table.page-table thead[data-v-7c1d7115]{color:#909399}table.page-table thead tr[data-v-7c1d7115]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-7c1d7115]{padding:10px 16px}table.page-table tbody tr[data-v-7c1d7115]:hover{background-color:#eeee}table.page-table tbody tr[data-v-7c1d7115]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-7c1d7115]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-7c1d7115]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-7c1d7115]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-7c1d7115]{width:100px}table.popups-table th.checkbox[data-v-7c1d7115]{width:50px;text-align:center}table.popups-table th.setting[data-v-7c1d7115]{width:100px;text-align:center}table.popups-table thead[data-v-7c1d7115]{color:#eee}table.popups-table thead tr[data-v-7c1d7115]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-7c1d7115]{padding:10px 16px}table.popups-table tbody tr[data-v-7c1d7115]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-7c1d7115]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-7c1d7115]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-7c1d7115]{width:100%}header.header-desktop[data-v-7c1d7115]{display:block}header.header-mobile[data-v-7c1d7115]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-7c1d7115]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-7c1d7115]{width:100%;height:100%}header.header-mobile button svg path[data-v-7c1d7115]{fill:#fff}nav.sidebar[data-v-7c1d7115]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-7c1d7115]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-7c1d7115]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-7c1d7115]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-7c1d7115]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-7c1d7115]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-7c1d7115]{color:#fff}nav.sidebar .container .children[data-v-7c1d7115]{padding-left:30px}@-moz-keyframes tada-7c1d7115{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-7c1d7115{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-7c1d7115{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-7c1d7115{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-7c1d7115]{animation:dialogEnter-7c1d7115 .3s linear forwards}.dialog-leave-active[data-v-7c1d7115]{animation:dialogLeave-7c1d7115 .3s linear forwards}@keyframes dialogEnter-7c1d7115{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-7c1d7115{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-7c1d7115]{animation:dialogEnter-7c1d7115 .2s linear forwards}.dialog1-leave-active[data-v-7c1d7115]{animation:dialogLeave-7c1d7115 .2s linear forwards}@keyframes rotateEnter-7c1d7115{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-7c1d7115]{animation:rotateEnter-7c1d7115 .7s;position:relative}.rotate-leave-active[data-v-7c1d7115]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-7c1d7115{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-7c1d7115{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-7c1d7115]{animation:slideOutTop-7c1d7115 .5s linear forwards}.slide-top-leave-active[data-v-7c1d7115],.slide-bottom-enter-active[data-v-7c1d7115]{animation:slideOutBottom-7c1d7115 .5s linear forwards}@keyframes slideInLeft-7c1d7115{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-7c1d7115{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-7c1d7115]{animation:slideInLeft-7c1d7115 .3s linear forwards}.slide-left-leave-active[data-v-7c1d7115]{animation:slideInRight-7c1d7115 .3s linear forwards}@keyframes slideOutLeft-7c1d7115{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-7c1d7115{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-7c1d7115]{animation:slideOutLeft-7c1d7115 .3s linear forwards}.slide-right-leave-active[data-v-7c1d7115]{animation:slideOutRight-7c1d7115 .3s linear forwards}@keyframes bganimation-7c1d7115{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-7c1d7115{0%{height:0}to{height:100px}}@keyframes fadeEnd-7c1d7115{0%{height:100%}to{height:0}}.fade-enter-active[data-v-7c1d7115]{animation:fadeStart-7c1d7115 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-7c1d7115]{animation:fadeEnd-7c1d7115 .1s linear forwards;overflow:hidden}.container[data-v-7c1d7115]{width:100%;padding:60px 0}.desc[data-v-7c1d7115]{text-align:center;width:452px;margin:0 auto 40px}.desc a[data-v-7c1d7115]{color:#06f}.desc span[data-v-7c1d7115]{display:inline-block;width:100%}.btn[data-v-7c1d7115]{display:block;padding:10px 32px;border-radius:4px;background:#0060ff;color:#fff;margin:0 auto;width:fit-content}@keyframes bganimation-719851d0{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-719851d0{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-719851d0{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-719851d0{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-719851d0{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-719851d0]{animation:slideInLeft-719851d0 .3s linear forwards}.slide-left-leave-active[data-v-719851d0]{animation:slideInRight-719851d0 .3s linear forwards}@keyframes slideOutLeft-719851d0{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-719851d0{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-719851d0]{animation:slideOutLeft-719851d0 .3s linear forwards}.slide-right-leave-active[data-v-719851d0]{animation:slideOutRight-719851d0 .3s linear forwards}.rotate-enter-active[data-v-719851d0]{animation:rotateEnter-719851d0 .7s;position:relative}.rotate-leave-active[data-v-719851d0]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-719851d0]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-719851d0]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-719851d0]{color:#f9ad1e}.notice_info li[data-v-719851d0]{font-size:14px;list-style:revert}.text-container[data-v-719851d0]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-719851d0]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-719851d0]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-719851d0]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-719851d0]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-719851d0]{width:100%}.text-container .text-container_item p.info-desc[data-v-719851d0]{width:100%;color:#999;font-size:14px}.page-container[data-v-719851d0]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-719851d0]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-719851d0]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-719851d0]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-719851d0],.page-container .page-flex .page-sidebar a[data-v-719851d0]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-719851d0]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-719851d0]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-719851d0]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-719851d0]{border-radius:0;padding:1rem}ul.ul-container[data-v-719851d0]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-719851d0]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-719851d0]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-719851d0]{width:100%}form.form-container[data-v-719851d0]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-719851d0]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-719851d0]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-719851d0]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-719851d0]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-719851d0],form.form-container .label-value select[data-v-719851d0]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-719851d0]:focus,form.form-container .label-value select[data-v-719851d0]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-719851d0]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-719851d0]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-719851d0],form.form-container .label-value input[type=radio][data-v-719851d0]{width:auto}form.form-container .label-value input[type=radio][data-v-719851d0]{margin:0 4px 0 0}form.form-container .label-value input[data-v-719851d0]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-719851d0]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-719851d0]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-719851d0]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-719851d0]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-719851d0]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-719851d0]:hover{background-color:#747474}form.form-container .label-msg[data-v-719851d0]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-719851d0]{color:#f9ad1e}form.form-container .label-flex[data-v-719851d0]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-719851d0]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-719851d0]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-719851d0]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-719851d0]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-719851d0]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-719851d0]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-719851d0],form.form-container1 .label-value select[data-v-719851d0]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-719851d0]:focus,form.form-container1 .label-value select[data-v-719851d0]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-719851d0]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-719851d0],form.form-container1 .label-value input[type=radio][data-v-719851d0]{width:auto}form.form-container1 .label-value input[type=radio][data-v-719851d0]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-719851d0]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-719851d0]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-719851d0]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-719851d0]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-719851d0]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-719851d0]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-719851d0]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-719851d0]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-719851d0]{color:#f9ad1e}form.form-container1 .label-flex[data-v-719851d0]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-719851d0]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-719851d0]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-719851d0]{width:100px}table.page-table th.checkbox[data-v-719851d0]{width:50px;text-align:center}table.page-table th.setting[data-v-719851d0]{width:100px;text-align:center}table.page-table thead[data-v-719851d0]{color:#909399}table.page-table thead tr[data-v-719851d0]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-719851d0]{padding:10px 16px}table.page-table tbody tr[data-v-719851d0]:hover{background-color:#eeee}table.page-table tbody tr[data-v-719851d0]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-719851d0]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-719851d0]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-719851d0]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-719851d0]{width:100px}table.popups-table th.checkbox[data-v-719851d0]{width:50px;text-align:center}table.popups-table th.setting[data-v-719851d0]{width:100px;text-align:center}table.popups-table thead[data-v-719851d0]{color:#eee}table.popups-table thead tr[data-v-719851d0]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-719851d0]{padding:10px 16px}table.popups-table tbody tr[data-v-719851d0]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-719851d0]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-719851d0]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-719851d0]{width:100%}header.header-desktop[data-v-719851d0]{display:block}header.header-mobile[data-v-719851d0]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-719851d0]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-719851d0]{width:100%;height:100%}header.header-mobile button svg path[data-v-719851d0]{fill:#fff}nav.sidebar[data-v-719851d0]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-719851d0]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-719851d0]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-719851d0]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-719851d0]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-719851d0]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-719851d0]{color:#fff}nav.sidebar .container .children[data-v-719851d0]{padding-left:30px}@-moz-keyframes tada-719851d0{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-719851d0{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-719851d0{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-719851d0{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-719851d0]{animation:dialogEnter-719851d0 .3s linear forwards}.dialog-leave-active[data-v-719851d0]{animation:dialogLeave-719851d0 .3s linear forwards}@keyframes dialogEnter-719851d0{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-719851d0{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-719851d0]{animation:dialogEnter-719851d0 .2s linear forwards}.dialog1-leave-active[data-v-719851d0]{animation:dialogLeave-719851d0 .2s linear forwards}@keyframes rotateEnter-719851d0{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-719851d0]{animation:rotateEnter-719851d0 .7s;position:relative}.rotate-leave-active[data-v-719851d0]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-719851d0{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-719851d0{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-719851d0]{animation:slideOutTop-719851d0 .5s linear forwards}.slide-top-leave-active[data-v-719851d0],.slide-bottom-enter-active[data-v-719851d0]{animation:slideOutBottom-719851d0 .5s linear forwards}@keyframes slideInLeft-719851d0{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-719851d0{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-719851d0]{animation:slideInLeft-719851d0 .3s linear forwards}.slide-left-leave-active[data-v-719851d0]{animation:slideInRight-719851d0 .3s linear forwards}@keyframes slideOutLeft-719851d0{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-719851d0{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-719851d0]{animation:slideOutLeft-719851d0 .3s linear forwards}.slide-right-leave-active[data-v-719851d0]{animation:slideOutRight-719851d0 .3s linear forwards}@keyframes bganimation-719851d0{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-719851d0{0%{height:0}to{height:100px}}@keyframes fadeEnd-719851d0{0%{height:100%}to{height:0}}.fade-enter-active[data-v-719851d0]{animation:fadeStart-719851d0 .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-719851d0]{animation:fadeEnd-719851d0 .1s linear forwards;overflow:hidden}.card-content[data-v-719851d0]{width:100%;height:100%;cursor:pointer}.card-content>span[data-v-719851d0]{display:inline-block;position:relative;top:-8px;width:100%;font-size:13px;line-height:14px;text-align:center}.card-content>div[data-v-719851d0]{height:52px;position:relative}.card-content>div>img[data-v-719851d0]{position:relative;width:52px;top:50%;transform:translateY(-50%);display:block;margin:0 auto}.width-60[data-v-719851d0]{display:inline-block;vertical-align:top;width:60%}.width-40[data-v-719851d0]{display:inline-block;vertical-align:top;width:40%}@media screen and (max-width: 668px){.responsive[data-v-719851d0]{width:100%}}@keyframes bganimation-4955cc3f{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-4955cc3f{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-4955cc3f{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}@keyframes slideInLeft-4955cc3f{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-4955cc3f{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-4955cc3f]{animation:slideInLeft-4955cc3f .3s linear forwards}.slide-left-leave-active[data-v-4955cc3f]{animation:slideInRight-4955cc3f .3s linear forwards}@keyframes slideOutLeft-4955cc3f{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-4955cc3f{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-4955cc3f]{animation:slideOutLeft-4955cc3f .3s linear forwards}.slide-right-leave-active[data-v-4955cc3f]{animation:slideOutRight-4955cc3f .3s linear forwards}.rotate-enter-active[data-v-4955cc3f]{animation:rotateEnter-4955cc3f .7s;position:relative}.rotate-leave-active[data-v-4955cc3f]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-4955cc3f]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-4955cc3f]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-4955cc3f]{color:#f9ad1e}.notice_info li[data-v-4955cc3f]{font-size:14px;list-style:revert}.text-container[data-v-4955cc3f]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-4955cc3f]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-4955cc3f]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-4955cc3f]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-4955cc3f]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-4955cc3f]{width:100%}.text-container .text-container_item p.info-desc[data-v-4955cc3f]{width:100%;color:#999;font-size:14px}.page-container[data-v-4955cc3f]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-4955cc3f]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-4955cc3f]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-4955cc3f]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-4955cc3f],.page-container .page-flex .page-sidebar a[data-v-4955cc3f]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-4955cc3f]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-4955cc3f]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-4955cc3f]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-4955cc3f]{border-radius:0;padding:1rem}ul.ul-container[data-v-4955cc3f]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-4955cc3f]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-4955cc3f]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-4955cc3f]{width:100%}form.form-container[data-v-4955cc3f]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-4955cc3f]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-4955cc3f]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-4955cc3f]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-4955cc3f]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-4955cc3f],form.form-container .label-value select[data-v-4955cc3f]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-4955cc3f]:focus,form.form-container .label-value select[data-v-4955cc3f]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-4955cc3f]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-4955cc3f]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-4955cc3f],form.form-container .label-value input[type=radio][data-v-4955cc3f]{width:auto}form.form-container .label-value input[type=radio][data-v-4955cc3f]{margin:0 4px 0 0}form.form-container .label-value input[data-v-4955cc3f]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-4955cc3f]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-4955cc3f]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-4955cc3f]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-4955cc3f]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-4955cc3f]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-4955cc3f]:hover{background-color:#747474}form.form-container .label-msg[data-v-4955cc3f]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-4955cc3f]{color:#f9ad1e}form.form-container .label-flex[data-v-4955cc3f]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-4955cc3f]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-4955cc3f]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-4955cc3f]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-4955cc3f]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-4955cc3f]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-4955cc3f]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-4955cc3f],form.form-container1 .label-value select[data-v-4955cc3f]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-4955cc3f]:focus,form.form-container1 .label-value select[data-v-4955cc3f]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-4955cc3f]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-4955cc3f],form.form-container1 .label-value input[type=radio][data-v-4955cc3f]{width:auto}form.form-container1 .label-value input[type=radio][data-v-4955cc3f]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-4955cc3f]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-4955cc3f]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-4955cc3f]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-4955cc3f]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-4955cc3f]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-4955cc3f]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-4955cc3f]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-4955cc3f]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-4955cc3f]{color:#f9ad1e}form.form-container1 .label-flex[data-v-4955cc3f]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-4955cc3f]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-4955cc3f]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-4955cc3f]{width:100px}table.page-table th.checkbox[data-v-4955cc3f]{width:50px;text-align:center}table.page-table th.setting[data-v-4955cc3f]{width:100px;text-align:center}table.page-table thead[data-v-4955cc3f]{color:#909399}table.page-table thead tr[data-v-4955cc3f]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-4955cc3f]{padding:10px 16px}table.page-table tbody tr[data-v-4955cc3f]:hover{background-color:#eeee}table.page-table tbody tr[data-v-4955cc3f]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-4955cc3f]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-4955cc3f]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-4955cc3f]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-4955cc3f]{width:100px}table.popups-table th.checkbox[data-v-4955cc3f]{width:50px;text-align:center}table.popups-table th.setting[data-v-4955cc3f]{width:100px;text-align:center}table.popups-table thead[data-v-4955cc3f]{color:#eee}table.popups-table thead tr[data-v-4955cc3f]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-4955cc3f]{padding:10px 16px}table.popups-table tbody tr[data-v-4955cc3f]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-4955cc3f]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-4955cc3f]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-4955cc3f]{width:100%}header.header-desktop[data-v-4955cc3f]{display:block}header.header-mobile[data-v-4955cc3f]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-4955cc3f]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-4955cc3f]{width:100%;height:100%}header.header-mobile button svg path[data-v-4955cc3f]{fill:#fff}nav.sidebar[data-v-4955cc3f]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-4955cc3f]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-4955cc3f]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-4955cc3f]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-4955cc3f]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-4955cc3f]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-4955cc3f]{color:#fff}nav.sidebar .container .children[data-v-4955cc3f]{padding-left:30px}@-moz-keyframes tada-4955cc3f{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-4955cc3f{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-4955cc3f{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-4955cc3f{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-4955cc3f]{animation:dialogEnter-4955cc3f .3s linear forwards}.dialog-leave-active[data-v-4955cc3f]{animation:dialogLeave-4955cc3f .3s linear forwards}@keyframes dialogEnter-4955cc3f{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-4955cc3f{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-4955cc3f]{animation:dialogEnter-4955cc3f .2s linear forwards}.dialog1-leave-active[data-v-4955cc3f]{animation:dialogLeave-4955cc3f .2s linear forwards}@keyframes rotateEnter-4955cc3f{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-4955cc3f]{animation:rotateEnter-4955cc3f .7s;position:relative}.rotate-leave-active[data-v-4955cc3f]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-4955cc3f{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-4955cc3f{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-4955cc3f]{animation:slideOutTop-4955cc3f .5s linear forwards}.slide-top-leave-active[data-v-4955cc3f],.slide-bottom-enter-active[data-v-4955cc3f]{animation:slideOutBottom-4955cc3f .5s linear forwards}@keyframes slideInLeft-4955cc3f{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-4955cc3f{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-4955cc3f]{animation:slideInLeft-4955cc3f .3s linear forwards}.slide-left-leave-active[data-v-4955cc3f]{animation:slideInRight-4955cc3f .3s linear forwards}@keyframes slideOutLeft-4955cc3f{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-4955cc3f{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-4955cc3f]{animation:slideOutLeft-4955cc3f .3s linear forwards}.slide-right-leave-active[data-v-4955cc3f]{animation:slideOutRight-4955cc3f .3s linear forwards}@keyframes bganimation-4955cc3f{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-4955cc3f{0%{height:0}to{height:100px}}@keyframes fadeEnd-4955cc3f{0%{height:100%}to{height:0}}.fade-enter-active[data-v-4955cc3f]{animation:fadeStart-4955cc3f .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-4955cc3f]{animation:fadeEnd-4955cc3f .1s linear forwards;overflow:hidden}.disk-item-tooltip[data-v-4955cc3f]{position:fixed;background:rgba(0,0,0,.7);z-index:10111;color:#fff;padding:8px;font-size:12px;min-width:200px;line-height:16px}.disk-item-tooltip[data-v-4955cc3f]:after{content:\"\";position:absolute;bottom:-6px;border-color:#4c4c4c rgba(0,0,0,0) rgba(0,0,0,0);left:0;right:0;text-align:center;width:0;margin:0 auto;border-width:6px 8px 0;border-style:solid}@keyframes rotateEnter-cbe9b60a{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-cbe9b60a{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-cbe9b60a]{animation:rotateEnter-cbe9b60a .7s;position:relative}.rotate-leave-active[data-v-cbe9b60a]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-cbe9b60a]{width:100%;background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:10px 30px;border-radius:6px;position:relative}.notice_info[data-v-cbe9b60a]{width:100%;display:block;margin-bottom:1rem;font-size:16px;line-height:24px;text-align:left;color:#666}.notice_info.warning[data-v-cbe9b60a]{color:#f9ad1e}.notice_info li[data-v-cbe9b60a]{font-size:14px;list-style:revert}.text-container[data-v-cbe9b60a]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.text-container .text-container_item[data-v-cbe9b60a]{width:100%;display:flex;flex-wrap:wrap;align-items:flex-start;min-height:42px;line-height:42px}.text-container .text-container_item .text-container_item_title[data-v-cbe9b60a]{color:#333;font-size:16px;font-weight:700;min-width:100px}.text-container .text-container_item .text-container_item_value[data-v-cbe9b60a]{flex:1;color:#666;font-size:16px;display:flex;flex-wrap:wrap;padding-left:10px}.text-container .text-container_item .text-container_item_flex[data-v-cbe9b60a]{flex:1;color:#666;font-size:16px}.text-container .text-container_item .text-container_item_block[data-v-cbe9b60a]{width:100%}.text-container .text-container_item p.info-desc[data-v-cbe9b60a]{width:100%;color:#999;font-size:14px}.page-container[data-v-cbe9b60a]{width:100%;background-color:#fff;border-radius:6px;padding:3rem}.page-container .page-flex[data-v-cbe9b60a]{display:flex;flex-wrap:wrap}.page-container .page-flex .page-sidebar[data-v-cbe9b60a]{flex:0 0 100%;max-width:200px;border-right:1px solid #eee}.page-container .page-flex .page-sidebar a[data-v-cbe9b60a]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:#333;display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-container .page-flex .page-sidebar a.on[data-v-cbe9b60a],.page-container .page-flex .page-sidebar a[data-v-cbe9b60a]:hover,.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-cbe9b60a]{transition:.3s;color:#418cff}.page-container .page-flex .page-sidebar a.router-link-active.router-link-exact-active[data-v-cbe9b60a]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-container .page-flex .page-main[data-v-cbe9b60a]{flex:0 0 100%;max-width:calc(100% - 200px)}.page-container.page-mobile[data-v-cbe9b60a]{border-radius:0;padding:1rem}ul.ul-container[data-v-cbe9b60a]{width:100%;display:block;margin-bottom:1rem}ul.ul-container .ul-container_title[data-v-cbe9b60a]{width:100%;color:#ff6b6b;font-size:14px;display:flex;flex-wrap:wrap;align-items:center}ul.ul-container .ul-container_title[data-v-cbe9b60a]:before{content:\"\";padding:3px;background:#ff6b6b;border-radius:50%;display:inline-block;margin-right:.2rem}ul.ul-container .ul-container_body[data-v-cbe9b60a]{width:100%}form.form-container[data-v-cbe9b60a]{display:block;width:100%;padding:0 1rem}form.form-container .label-info[data-v-cbe9b60a]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container .label-name[data-v-cbe9b60a]{display:block;width:100%;margin-bottom:.5rem;color:#666}form.form-container .label-name span[data-v-cbe9b60a]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-cbe9b60a]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-cbe9b60a],form.form-container .label-value select[data-v-cbe9b60a]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px}form.form-container .label-value input[data-v-cbe9b60a]:focus,form.form-container .label-value select[data-v-cbe9b60a]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-cbe9b60a]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-cbe9b60a]{border-left:none!important;border-right:none!important;border-top:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-cbe9b60a],form.form-container .label-value input[type=radio][data-v-cbe9b60a]{width:auto}form.form-container .label-value input[type=radio][data-v-cbe9b60a]{margin:0 4px 0 0}form.form-container .label-value input[data-v-cbe9b60a]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-cbe9b60a]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-cbe9b60a]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-value input[data-v-cbe9b60a]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container .label-btns[data-v-cbe9b60a]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-btns button.sumbit[data-v-cbe9b60a]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container .label-btns button.sumbit[data-v-cbe9b60a]:hover{background-color:#747474}form.form-container .label-msg[data-v-cbe9b60a]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-cbe9b60a]{color:#f9ad1e}form.form-container .label-flex[data-v-cbe9b60a]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-cbe9b60a]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}form.form-container1[data-v-cbe9b60a]{display:block;width:100%;padding:0 1rem}form.form-container1 .label-info[data-v-cbe9b60a]{width:100%;display:block;margin-bottom:1rem;color:#f9ad1e;font-size:16px;line-height:24px;text-align:left}form.form-container1 .label-name[data-v-cbe9b60a]{display:block;width:100%;margin-bottom:4px;color:#666;font-size:14px}form.form-container1 .label-name span[data-v-cbe9b60a]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container1 .label-value[data-v-cbe9b60a]{display:block;width:100%;margin-bottom:.5rem}form.form-container1 .label-value input[data-v-cbe9b60a],form.form-container1 .label-value select[data-v-cbe9b60a]{display:block;width:100%;height:36px;background:none;border:1px solid #c2c2c2;color:#333;font-size:14px;padding:0 10px;border-radius:4px}form.form-container1 .label-value input[data-v-cbe9b60a]:focus,form.form-container1 .label-value select[data-v-cbe9b60a]:focus{transition:.2s;border:1px solid #418dfe}form.form-container1 .label-value select[data-v-cbe9b60a]{border-radius:3px;padding:0 10px}form.form-container1 .label-value input[type=checkbox][data-v-cbe9b60a],form.form-container1 .label-value input[type=radio][data-v-cbe9b60a]{width:auto}form.form-container1 .label-value input[type=radio][data-v-cbe9b60a]{margin:0 4px 0 0}form.form-container1 .label-value input[data-v-cbe9b60a]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container1 .label-value input[data-v-cbe9b60a]::placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-cbe9b60a]:-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-value input[data-v-cbe9b60a]::-ms-input-placeholder{color:#666;opacity:.54;font-size:14px}form.form-container1 .label-btns[data-v-cbe9b60a]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container1 .label-btns button.sumbit[data-v-cbe9b60a]{width:100px;height:28px;border-radius:3px;background-color:#5d5b5b;color:#fff;font-size:14px}form.form-container1 .label-btns button.sumbit[data-v-cbe9b60a]:hover{background-color:#747474}form.form-container1 .label-msg[data-v-cbe9b60a]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container1 .label-msg.warning[data-v-cbe9b60a]{color:#f9ad1e}form.form-container1 .label-flex[data-v-cbe9b60a]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container1 .label-flex label[data-v-cbe9b60a]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}table.page-table[data-v-cbe9b60a]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666;border:1px solid #d8d8d8;background-color:#fff}table.page-table th.uid[data-v-cbe9b60a]{width:100px}table.page-table th.checkbox[data-v-cbe9b60a]{width:50px;text-align:center}table.page-table th.setting[data-v-cbe9b60a]{width:100px;text-align:center}table.page-table thead[data-v-cbe9b60a]{color:#909399}table.page-table thead tr[data-v-cbe9b60a]{width:100%;height:28px;line-height:28px;border-bottom:1px solid #d8d8d8;color:#909399;font-size:12px}table.page-table thead tr th[data-v-cbe9b60a]{padding:10px 16px}table.page-table tbody tr[data-v-cbe9b60a]:hover{background-color:#eeee}table.page-table tbody tr[data-v-cbe9b60a]{cursor:pointer;width:100%;border-bottom:1px solid #d8d8d8;color:#50575e}table.page-table tbody tr th[data-v-cbe9b60a]{font-size:12px;padding:16px;vertical-align:middle}table.page-table tbody tr[data-v-cbe9b60a]:nth-child(odd){background-color:#f6f7f7}table.popups-table[data-v-cbe9b60a]{table-layout:fixed;border-collapse:collapse;border-spacing:0;width:100%;text-align:left;color:#666}table.popups-table th.uid[data-v-cbe9b60a]{width:100px}table.popups-table th.checkbox[data-v-cbe9b60a]{width:50px;text-align:center}table.popups-table th.setting[data-v-cbe9b60a]{width:100px;text-align:center}table.popups-table thead[data-v-cbe9b60a]{color:#eee}table.popups-table thead tr[data-v-cbe9b60a]{width:100%;height:28px;line-height:28px;color:#eee;font-size:12px}table.popups-table thead tr th[data-v-cbe9b60a]{padding:10px 16px}table.popups-table tbody tr[data-v-cbe9b60a]{cursor:pointer;width:100%;color:#eee}table.popups-table tbody tr th[data-v-cbe9b60a]{font-size:12px;padding:16px;vertical-align:top}.body[data-v-cbe9b60a]{max-width:1080px;min-width:1080px;position:relative;margin:0 auto;width:100%;padding:1rem 0}header[data-v-cbe9b60a]{width:100%}header.header-desktop[data-v-cbe9b60a]{display:block}header.header-mobile[data-v-cbe9b60a]{display:none;background-color:#1e1e1e;height:50px;position:fixed;z-index:100;width:100%;flex-wrap:wrap;align-items:center}header.header-mobile button[data-v-cbe9b60a]{background:none;width:50px;height:100%;padding:1rem}header.header-mobile button svg[data-v-cbe9b60a]{width:100%;height:100%}header.header-mobile button svg path[data-v-cbe9b60a]{fill:#fff}nav.sidebar[data-v-cbe9b60a]{position:fixed;inset:0;z-index:101}nav.sidebar .bg[data-v-cbe9b60a]{background:rgba(0,0,0,.5);z-index:100;inset:0 -100% 0 0;position:fixed}nav.sidebar .container[data-v-cbe9b60a]{position:fixed;inset:0 20% 0 0;background-color:#000000e8;z-index:101;padding:2rem 1rem;width:80%;overflow:auto}nav.sidebar .container li.tag[data-v-cbe9b60a]{margin:10px;display:block;cursor:pointer;height:32px;line-height:32px}nav.sidebar .container li.tag a[data-v-cbe9b60a]{color:#c9c7c7;font-size:.875rem;display:block}nav.sidebar .container li.tag a i.icon.iconfont[data-v-cbe9b60a]{width:22px;font-size:.875rem;margin-right:5px;display:inline-block}nav.sidebar .container li.tag a.router-link-active.router-link-exact-active[data-v-cbe9b60a]{color:#fff}nav.sidebar .container .children[data-v-cbe9b60a]{padding-left:30px}@-moz-keyframes tada-cbe9b60a{0%{-moz-transform:scale(1)}10%,20%{-moz-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-moz-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-moz-transform:scale(1.2) rotate(-3deg)}to{-moz-transform:scale(1) rotate(0)}}@-webkit-keyframes tada-cbe9b60a{0%{-webkit-transform:scale(1)}10%,20%{-webkit-transform:scale(.9) rotate(-3deg)}30%,50%,70%,90%{-webkit-transform:scale(1.2) rotate(3deg)}40%,60%,80%{-webkit-transform:scale(1.2) rotate(-3deg)}to{-webkit-transform:scale(1) rotate(0)}}@keyframes dialogEnter-cbe9b60a{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave-cbe9b60a{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active[data-v-cbe9b60a]{animation:dialogEnter-cbe9b60a .3s linear forwards}.dialog-leave-active[data-v-cbe9b60a]{animation:dialogLeave-cbe9b60a .3s linear forwards}@keyframes dialogEnter-cbe9b60a{0%{transform:scale(.9)}to{transform:scale(1)}}@keyframes dialogLeave-cbe9b60a{0%{transform:scale(1)}to{transform:scale(.9)}}.dialog1-enter-active[data-v-cbe9b60a]{animation:dialogEnter-cbe9b60a .2s linear forwards}.dialog1-leave-active[data-v-cbe9b60a]{animation:dialogLeave-cbe9b60a .2s linear forwards}@keyframes rotateEnter-cbe9b60a{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}.rotate-enter-active[data-v-cbe9b60a]{animation:rotateEnter-cbe9b60a .7s;position:relative}.rotate-leave-active[data-v-cbe9b60a]{opacity:0;display:none;position:relative;z-index:-999}@keyframes slideOutTop-cbe9b60a{0%{position:fixed;top:100%;left:0;right:0;z-index:9999}to{position:fixed;inset:0;z-index:9999}}@keyframes slideOutBottom-cbe9b60a{0%{position:fixed;top:0;left:0;right:0;z-index:9999}to{position:fixed;top:-100%;left:0;right:0;z-index:9999}}.slide-top-enter-active[data-v-cbe9b60a]{animation:slideOutTop-cbe9b60a .5s linear forwards}.slide-top-leave-active[data-v-cbe9b60a],.slide-bottom-enter-active[data-v-cbe9b60a]{animation:slideOutBottom-cbe9b60a .5s linear forwards}@keyframes slideInLeft-cbe9b60a{0%{transform:translate3d(100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideInRight-cbe9b60a{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(100%,0,0);position:fixed}}.slide-left-enter-active[data-v-cbe9b60a]{animation:slideInLeft-cbe9b60a .3s linear forwards}.slide-left-leave-active[data-v-cbe9b60a]{animation:slideInRight-cbe9b60a .3s linear forwards}@keyframes slideOutLeft-cbe9b60a{0%{transform:translate3d(-100%,0,0);position:fixed}to{transform:translateZ(0);position:fixed}}@keyframes slideOutRight-cbe9b60a{0%{transform:translateZ(0);position:fixed}to{transform:translate3d(-100%,0,0);position:fixed}}.slide-right-enter-active[data-v-cbe9b60a]{animation:slideOutLeft-cbe9b60a .3s linear forwards}.slide-right-leave-active[data-v-cbe9b60a]{animation:slideOutRight-cbe9b60a .3s linear forwards}@keyframes bganimation-cbe9b60a{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes fadeStart-cbe9b60a{0%{height:0}to{height:100px}}@keyframes fadeEnd-cbe9b60a{0%{height:100%}to{height:0}}.fade-enter-active[data-v-cbe9b60a]{animation:fadeStart-cbe9b60a .1s linear forwards;overflow:hidden}.fade-leave-active[data-v-cbe9b60a]{animation:fadeEnd-cbe9b60a .1s linear forwards;overflow:hidden}.next-main[data-v-cbe9b60a]{width:100vw;height:100vh;background:url(/luci-static/istorex/bg.jpg?v=d8e6f6fb) no-repeat;background-size:cover;overflow-y:auto}.next-main[data-v-cbe9b60a]::-webkit-scrollbar{width:0px;height:0px}.next-main[data-v-cbe9b60a]::-webkit-scrollbar,.next-main[data-v-cbe9b60a]::-webkit-scrollbar-corner{background:transparent}.next-main[data-v-cbe9b60a]::-webkit-scrollbar-thumb{background:#9e9e9e}.next-main[data-v-cbe9b60a]::-webkit-scrollbar-thumb:hover{background:#757575}.next-main[data-v-cbe9b60a]::-webkit-scrollbar-thumb:active{background:#424242}.content[data-v-cbe9b60a]{padding:8px 0;margin:0 auto;max-width:1280px}.content>div[data-v-cbe9b60a]{display:inline-block;vertical-align:top;width:50%}@media screen and (max-width: 1106px){.content[data-v-cbe9b60a]{width:100vw;padding:4px}.content>div[data-v-cbe9b60a]{width:100%}}\n"
  },
  {
    "path": "luci-app-istorex/luasrc/controller/istorex.lua",
    "content": "\nmodule(\"luci.controller.istorex\", package.seeall)\n\nfunction index()\n    if luci.sys.call(\"pgrep quickstart >/dev/null\") == 0 then\n        entry({\"admin\", \"istorex\"}, call(\"istorex_template\")).leaf = true\n        if nixio.fs.access(\"/usr/lib/lua/luci/view/istorex/main_dev.htm\") then\n            entry({\"admin\", \"istorex_dev\"}, call(\"istorex_template_dev\")).leaf = true\n        end\n    else\n        entry({\"admin\", \"istorex\"}, call(\"redirect_fallback\")).leaf = true\n    end\n    entry({\"admin\", \"istorex_api\",\"status\"}, call(\"istorex_api_status\")).dependent = false\n    entry({\"admin\", \"istorex_api\",\"update\"}, call(\"istorex_api_update\")).dependent = false\n    entry({\"admin\", \"istorex_api\",\"upload-bg\"}, call(\"istorex_api_uploadbg\")).dependent = false\nend\n\nlocal function user_id()\n    local jsonc = require \"luci.jsonc\"\n    local json_parse = jsonc.parse\n    local fs   = require \"nixio.fs\"\n\tlocal data = fs.readfile(\"/etc/.app_store.id\")\n\n    local id\n    if data ~= nil then\n        id = json_parse(data)\n    end\n    if id == nil then\n        fs.unlink(\"/etc/.app_store.id\")\n        id = {arch=\"\",uid=\"\"}\n    end\n\n    id.version = (fs.readfile(\"/etc/.app_store.version\") or \"?\"):gsub(\"[\\r\\n]\", \"\")\n\n    return id\nend\n\nfunction get_config_data()\n    local uci  = require \"luci.model.uci\".cursor()\n    local model   = uci:get_first(\"istorex\", \"istorex\", \"model\")\n    local enabled = uci:get_first(\"istorex\", \"istorex\", \"enabled\")\n    local data = {\n        model   = model,\n        enabled = enabled,\n    }\n    return data\nend\n\nfunction get_params()\n    local config = get_config_data()\n    local data = {\n        prefix=luci.dispatcher.build_url(unpack({\"admin\", \"istorex\"})),\n        id=user_id(),\n        model = config.model,\n    }\n    return data\nend\n\nfunction get_dev_params()\n    local config = get_config_data()\n    local data = {\n        prefix=luci.dispatcher.build_url(unpack({\"admin\", \"istorex_dev\"})),\n        id=user_id(),\n        model = config.model,\n    }\n    return data\nend\n\nfunction redirect_fallback()\n    luci.http.redirect(luci.dispatcher.build_url(\"admin\",\"status\"))\nend\n\nfunction istorex_template()\n    luci.template.render(\"istorex/main\", get_params())\nend\n\nfunction istorex_template_dev()\n    luci.template.render(\"istorex/main_dev\", get_dev_params())\nend\n\nfunction istorex_api_status()\n    local result = get_config_data()\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json({\n         success = 0,\n         result  = result,\n    })\nend\n\nfunction istorex_api_update()\n    local http = require \"luci.http\"\n    local jsonc = require \"luci.jsonc\"\n    local uci  = require \"luci.model.uci\".cursor()\n    local content = http.content()\n    local json_parse = jsonc.parse\n    local req = json_parse(content)\n    local data = {\n    }\n    if req == nil or next(req) == nil then\n        data.error = \"invalid request\"\n    else\n        uci:set(\"istorex\",\"@istorex[0]\",\"model\", req.model)\n        uci:commit(\"istorex\")\n        data.success = 0\n    end\n    http.prepare_content(\"application/json\")\n    http.write_json(data)\nend\n\nfunction istorex_api_uploadbg()\n    local uci = require \"uci\"\n    local x = uci.cursor()\n    local fd\n    local path\n    local finished = false\n    local tmpdir = \"/www/luci-static/istorex/image\"\n    local filename = \"\"\n    luci.http.setfilehandler(\n        function(meta, chunk, eof)\n            if not fd then\n                filename = meta.file\n                path = tmpdir .. \"/bg.gif\" \n                fd = io.open(path, \"w\")\n            end\n            if chunk then\n                fd:write(chunk)\n            end\n            if eof then\n                fd:close()\n                finished = true\n            end\n        end\n    )\n    luci.http.formvalue(\"file\")\n    local result = {\n        filename = filename\n    }\n    local data = {\n        success = finished,\n        result  = result\n    }\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json(data)\nend\n"
  },
  {
    "path": "luci-app-istorex/luasrc/view/istorex/index.htm",
    "content": "<% \n   local istorex = require \"luci.controller.istorex\"\n   istorex.istorex_template()\n%>"
  },
  {
    "path": "luci-app-istorex/luasrc/view/istorex/main.htm",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" href=\"/favicon.ico\" />\n    <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" />\n    <!-- <meta name=\"viewport\" content=\"width=1400, initial-scale=1.0\" /> -->\n    <!-- <meta name=\"viewport\" content=\"width=1100\" /> -->\n    <title><%=luci.sys.hostname()%></title>\n</head>\n<body>\n    <script src=\"<%=url('admin/translations', luci.i18n.context.lang)%><%# ?v=PKG_VERSION %>\"></script>\n    <script src=\"<%=resource%>/cbi.js<%# ?v=PKG_VERSION %>\"></script>\n    <script type=\"text/javascript\" src=\"<%=resource%>/promis.min.js<%# ?v=PKG_VERSION %>\"></script>\n    <script type=\"text/javascript\" src=\"<%=resource%>/luci.js<%# ?v=PKG_VERSION %>\"></script>\n    <%+tasks/embed%>\n    <script>\n        (function(){\n            var pathe_prefix    =   \"<%=prefix%>\"\n            window.istoreXVer   =   \"<%# PKG_VERSION %>\"\n            window.HostName     =   \"<%=luci.sys.hostname()%>\"\n            window.path_base    =   pathe_prefix\n            window.token        =   \"<%=token%>\"\n            window.model        =   \"<%=model%>\"\n            window.device_id    =   {\n                                      arch:\"<%=id.arch%>\",\n                                      uid:\"<%=id.uid%>\",\n                                      version:\"<%=id.version%>\"\n                                     }\n        })();\n    </script>\n    <script type=\"text/javascript\">\n      L = new LuCI(<%= luci.http.write_json({\n        token          = token,\n        media          = media,\n        resource       = resource,\n        scriptname     = luci.http.getenv(\"SCRIPT_NAME\"),\n        pathinfo       = luci.http.getenv(\"PATH_INFO\"),\n        documentroot   = luci.http.getenv(\"DOCUMENT_ROOT\"),\n        requestpath    = luci.dispatcher.context.requestpath,\n        dispatchpath   = luci.dispatcher.context.path,\n        pollinterval   = luci.config.main.pollinterval or 5,\n        ubuspath       = luci.config.main.ubuspath or '/ubus/',\n        sessionid      = luci.dispatcher.context.authsession,\n        nodespec       = luci.dispatcher.context.dispatched,\n        apply_rollback = math.max(applyconf and applyconf.rollback or 90, 30),\n        apply_holdoff  = math.max(applyconf and applyconf.holdoff or 4, 1),\n        apply_timeout  = math.max(applyconf and applyconf.timeout or 5, 1),\n        apply_display  = math.max(applyconf and applyconf.display or 1.5, 1),\n        rollback_token = rollback_token\n      }) %>);\n    </script>\n    <div id=\"app\"></div>\n    <link rel=\"stylesheet\" href=\"/luci-static/istorex/style.css<%# ?v=PKG_VERSION %>\">\n    <script type=\"module\" crossorigin src=\"/luci-static/istorex/index.js<%# ?v=PKG_VERSION %>\"></script>\n</body>\n</html>\n"
  },
  {
    "path": "luci-app-istorex/luasrc/view/istorex/main_dev.htm",
    "content": "<%\n  local ver = require \"luci.version\"\n-%>\n<!DOCTYPE html>\n<html lang=\"en\">\n<head>\n    <meta charset=\"UTF-8\" />\n    <link rel=\"icon\" href=\"/favicon.ico\" />\n    <!-- <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" /> -->\n    <meta name=\"viewport\" content=\"width=1100\" />\n\n    <title></title>\n</head>\n<body>\n    <script src=\"<%=url('admin/translations', luci.i18n.context.lang)%><%# ?v=PKG_VERSION %>\"></script>\n    <script src=\"<%=resource%>/cbi.js<%# ?v=PKG_VERSION %>\"></script>\n    <script type=\"text/javascript\" src=\"<%=resource%>/promis.min.js<%# ?v=PKG_VERSION %>\"></script>\n    <script type=\"text/javascript\" src=\"<%=resource%>/luci.js<%# ?v=PKG_VERSION %>\"></script>\n    <%+tasks/embed%>\n    <script>\n        (function(){\n            var pathe_prefix    =   \"<%=prefix%>\"\n            window.istoreXVer   =   \"<%# PKG_VERSION %>\"\n            window.HostName     =   \"<%=luci.sys.hostname()%>\"\n            window.path_base    =   pathe_prefix\n            window.token        =   \"<%=token%>\"\n            window.model        =   \"<%=model%>\"\n            window.device_id    =   {\n                                      arch:\"<%=id.arch%>\",\n                                      uid:\"<%=id.uid%>\",\n                                      version:\"<%=id.version%>\"\n                                     }\n\n        })();\n    </script>\n    <script type=\"text/javascript\">\n        L = new LuCI(<%= luci.http.write_json({\n            token          = token,\n            media          = media,\n            resource       = resource,\n            scriptname     = luci.http.getenv(\"SCRIPT_NAME\"),\n            pathinfo       = luci.http.getenv(\"PATH_INFO\"),\n            documentroot   = luci.http.getenv(\"DOCUMENT_ROOT\"),\n            requestpath    = luci.dispatcher.context.requestpath,\n            dispatchpath   = luci.dispatcher.context.path,\n            pollinterval   = luci.config.main.pollinterval or 5,\n            ubuspath       = luci.config.main.ubuspath or '/ubus/',\n            sessionid      = luci.dispatcher.context.authsession,\n            nodespec       = luci.dispatcher.context.dispatched,\n            apply_rollback = math.max(applyconf and applyconf.rollback or 90, 30),\n            apply_holdoff  = math.max(applyconf and applyconf.holdoff or 4, 1),\n            apply_timeout  = math.max(applyconf and applyconf.timeout or 5, 1),\n            apply_display  = math.max(applyconf and applyconf.display or 1.5, 1),\n            rollback_token = rollback_token\n        }) %>);\n    </script>\n    <div id=\"app\"></div>\n\t<script type=\"module\" src=\"http://localhost:3000/src/main.ts\"></script>\n</body>\n</html>"
  },
  {
    "path": "luci-app-istorex/root/etc/config/istorex",
    "content": "config istorex\n\toption enabled '1'\n\toption model  'wizard'\n"
  },
  {
    "path": "luci-app-istorex/root/etc/uci-defaults/50_luci-istorex",
    "content": "#!/bin/sh\n\nrm -f /tmp/luci-indexcache /tmp/luci-indexcache.*\nexit 0\n"
  },
  {
    "path": "luci-app-istorex/root/usr/share/luci/menu.d/luci-app-istorex.json",
    "content": "{\n    \"admin/istorex\": {\n        \"order\": 0,\n        \"action\": {\n            \"type\": \"template\",\n            \"path\": \"istorex/index\"\n        }\n    }\n}"
  },
  {
    "path": "luci-app-kai/Makefile",
    "content": "#\n# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=kai\nPKG_VERSION:=1.0.1\nPKG_RELEASE:=1\nLUCI_DEPENDS:=+kai +kai_session +luci-compat\nLUCI_MINIFY_CSS:=0\nLUCI_MINIFY_JS:=0\n\ndefine Package/luci-app-kai/conffiles\n/etc/config/kai\nendef\n\ndefine Package/luci-app-kai/postrm\n#!/bin/sh\nrm -f /tmp/luci-indexcache\nexit 0\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-kai/luasrc/controller/kai.lua",
    "content": "local http = require \"luci.http\"\n\nmodule(\"luci.controller.kai\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/kai\") then\n\t\treturn\n\tend\n\tlocal page\n\tpage = entry({\"admin\", \"services\",\"kai\"}, cbi(\"kai\"), _(\"KAI\"), 100)\n\tpage.dependent = true\n    entry({\"admin\", \"services\", \"kai_status\"}, call(\"kai_status\"))\n\nend\n\nfunction kai_status()\n\tlocal sys  = require \"luci.sys\"\n\tlocal uci  = require \"luci.model.uci\".cursor()\n\tlocal status = {\n\t\trunning = (sys.call(\"pidof kai_bin >/dev/null\") == 0),\n\t\tport = 8197\n\t}\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(status)\nend\n"
  },
  {
    "path": "luci-app-kai/luasrc/model/cbi/kai.lua",
    "content": "local m, s\n\nm = Map(\"kai\", translate(\"KAI\"), translate(\"KAI is an efficient AI tool.\"))\nm:section(SimpleSection).template  = \"kai/kai_status\"\n\ns=m:section(TypedSection, \"kai\", translate(\"Global settings\"))\ns.addremove=false\ns.anonymous=true\n\ns:option(Flag, \"enabled\", translate(\"Enable\")).rmempty=false\n\nlocal kai_model = require \"luci.model.kai\"\nlocal blocks = kai_model.blocks()\nlocal home = kai_model.home()\n\nlocal data_dir = s:option(Value, \"data_dir\", translate(\"Data directory\"))\ndata_dir.rmempty = false\ndata_dir.description = translate(\"Required. KAI session will store cwd/cache/data/config/state under this directory (subfolders: cwd, cache, data, config, state).\")\n\nlocal paths, default_path = kai_model.find_paths(blocks, home, \"Configs\")\nfor _, val in pairs(paths) do\n\tdata_dir:value(val, val)\nend\ndata_dir.default = default_path\n\nlocal port = s:option(Value, \"port\", translate(\"API port\"))\nport.default = \"8197\"\nport.rmempty = false\nport.datatype = \"port\"\nport.description = translate(\"Port for KAI HTTP server (kai_bin). kai_session will read OPENCODE_CONFIG via 127.0.0.1:<port>.\")\n\nreturn m\n"
  },
  {
    "path": "luci-app-kai/luasrc/model/kai.lua",
    "content": "local jsonc = require \"luci.jsonc\"\n\nlocal kai = {}\n\nkai.blocks = function()\n  local f = io.popen(\"lsblk -s -f -b -o NAME,FSSIZE,MOUNTPOINT --json\", \"r\")\n  local vals = {}\n  if f then\n    local ret = f:read(\"*all\")\n    f:close()\n    local obj = jsonc.parse(ret)\n    for _, val in pairs(obj and obj[\"blockdevices\"] or {}) do\n      local fsize = val[\"fssize\"]\n      if fsize ~= nil and string.len(fsize) > 10 and val[\"mountpoint\"] then\n        vals[#vals + 1] = val[\"mountpoint\"]\n      end\n    end\n  end\n  return vals\nend\n\nkai.home = function()\n  local uci = require \"luci.model.uci\".cursor()\n  local home_dirs = {}\n  home_dirs[\"main_dir\"] = uci:get_first(\"quickstart\", \"main\", \"main_dir\", \"/root\")\n  home_dirs[\"Configs\"] = uci:get_first(\"quickstart\", \"main\", \"conf_dir\", home_dirs[\"main_dir\"] .. \"/Configs\")\n  home_dirs[\"Public\"] = uci:get_first(\"quickstart\", \"main\", \"pub_dir\", home_dirs[\"main_dir\"] .. \"/Public\")\n  home_dirs[\"Downloads\"] = uci:get_first(\"quickstart\", \"main\", \"dl_dir\", home_dirs[\"Public\"] .. \"/Downloads\")\n  home_dirs[\"Caches\"] = uci:get_first(\"quickstart\", \"main\", \"tmp_dir\", home_dirs[\"main_dir\"] .. \"/Caches\")\n  return home_dirs\nend\n\nkai.find_paths = function(blocks, home_dirs, path_name)\n  local default_path = \"\"\n  local paths = {}\n\n  default_path = home_dirs[path_name] .. \"/KAI\"\n  if #blocks == 0 then\n    table.insert(paths, default_path)\n  else\n    for _, val in pairs(blocks) do\n      table.insert(paths, val .. \"/\" .. path_name .. \"/KAI\")\n    end\n    local without_conf_dir = \"/root/\" .. path_name .. \"/KAI\"\n    if default_path == without_conf_dir then\n      default_path = paths[1]\n    end\n  end\n\n  return paths, default_path\nend\n\nreturn kai\n\n"
  },
  {
    "path": "luci-app-kai/luasrc/view/kai/kai_status.htm",
    "content": "<script <script type=\"text/javascript\">//<![CDATA[\nXHR.poll(5, '<%=url(\"admin/services/kai_status\")%>', null,function(x, st){\n\tvar el = document.getElementById('kai_status');\n\tif (st && el){\n\t\tif(!st.running){\n\t\t\tel.innerHTML = '<br/><em style=\\\"color:red\\\"><%:The KAI service is not running.%></em>';\n\t\t}\n\t\tif (st.running){\n\t\t\tel.innerHTML = '<br/><em style=\\\"color:green\\\"><%:The KAI service is running.%></em>'\n\t\t\t\t+ \"<br/><br/><input class=\\\"btn cbi-button cbi-button-apply\\\" type=\\\"button\\\" value=\\\" <%:Click to open KAI%> \\\" onclick=\\\"window.open('http://\" + window.location.hostname + \":\" + st.port + \"/')\\\"/>\";\n\t\t}\n\t}\n});\n//]]></script>\n\n<fieldset class=\"cbi-section\">\n\t<legend><%:Status%></legend>\n\t<p id=\"kai_status\">\n\t\t<em><%:Collecting data...%></em>\n\t</p>\n</fieldset>\n\n"
  },
  {
    "path": "luci-app-linkease/Makefile",
    "content": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for linkease\nLUCI_DEPENDS:=+linkease\nLUCI_PKGARCH:=all\nPKG_VERSION:=2.1.70-r3\n# PKG_RELEASE MUST be empty for luci.mk\nPKG_RELEASE:=\nLUCI_MINIFY_CSS:=0\nLUCI_MINIFY_JS:=0\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n\n"
  },
  {
    "path": "luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.22632dc4.js",
    "content": "import{ab as L,i as v,ac as M}from\"./index.js\";var N=/\\s/;function $(n){for(var r=n.length;r--&&N.test(n.charAt(r)););return r}var B=/^\\s+/;function R(n){return n&&n.slice(0,$(n)+1).replace(B,\"\")}var k=0/0,F=/^[-+]0x[0-9a-f]+$/i,_=/^0b[01]+$/i,j=/^0o[0-7]+$/i,D=parseInt;function S(n){if(typeof n==\"number\")return n;if(L(n))return k;if(v(n)){var r=typeof n.valueOf==\"function\"?n.valueOf():n;n=v(r)?r+\"\":r}if(typeof n!=\"string\")return n===0?n:+n;n=R(n);var t=_.test(n);return t||j.test(n)?D(n.slice(2),t?2:8):F.test(n)?k:+n}var H=function(){return M.Date.now()};const h=H;var P=\"Expected a function\",U=Math.max,X=Math.min;function z(n,r,t){var u,c,l,s,i,f,o=0,b=!1,d=!1,T=!0;if(typeof n!=\"function\")throw new TypeError(P);r=S(r)||0,v(t)&&(b=!!t.leading,d=\"maxWait\"in t,l=d?U(S(t.maxWait)||0,r):l,T=\"trailing\"in t?!!t.trailing:T);function x(e){var a=u,m=c;return u=c=void 0,o=e,s=n.apply(m,a),s}function W(e){return o=e,i=setTimeout(g,r),b?x(e):s}function O(e){var a=e-f,m=e-o,E=r-a;return d?X(E,l-m):E}function p(e){var a=e-f,m=e-o;return f===void 0||a>=r||a<0||d&&m>=l}function g(){var e=h();if(p(e))return y(e);i=setTimeout(g,O(e))}function y(e){return i=void 0,T&&u?x(e):(u=c=void 0,s)}function A(){i!==void 0&&clearTimeout(i),o=0,u=f=c=i=void 0}function C(){return i===void 0?s:y(h())}function I(){var e=h(),a=p(e);if(u=arguments,c=this,f=e,a){if(i===void 0)return W(f);if(d)return clearTimeout(i),i=setTimeout(g,r),x(f)}return i===void 0&&(i=setTimeout(g,r)),s}return I.cancel=A,I.flush=C,I}export{z as d};\n"
  },
  {
    "path": "luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.324cab41.js",
    "content": "var w9=Object.defineProperty,S9=Object.defineProperties;var y9=Object.getOwnPropertyDescriptors;var VN=Object.getOwnPropertySymbols;var L9=Object.prototype.hasOwnProperty,D9=Object.prototype.propertyIsEnumerable;var HN=(o,e,t)=>e in o?w9(o,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):o[e]=t,I_=(o,e)=>{for(var t in e||(e={}))L9.call(e,t)&&HN(o,t,e[t]);if(VN)for(var t of VN(e))D9.call(e,t)&&HN(o,t,e[t]);return o},E_=(o,e)=>S9(o,y9(e));var io=(o,e,t)=>new Promise((i,n)=>{var s=l=>{try{a(t.next(l))}catch(c){n(c)}},r=l=>{try{a(t.throw(l))}catch(c){n(c)}},a=l=>l.done?i(l.value):Promise.resolve(l.value).then(s,r);a((t=t.apply(o,e)).next())});import{a as uC}from\"./chunk.6424c2fc.js\";import{bJ as k9,b as gC,d as vx,m as qR,e as Un,aD as Nd,au as Cx,h as fC,r as ki,w as Ul,o as pC,b6 as GR,q as li,F as Wn,z as y0,A as si,R as x9,_ as ZR,as as wx,bK as I9,bL as E9,n as Ho,p as Sx,b7 as N9,v as Nt,E as fd,G as T9,H as M9,D as A9,W as Gb,ae as YR,aA as XR,al as R9,aC as uy,bM as O9,S as yx,ag as P9,c as F9,bk as zN,b1 as B9,bN as UN,bA as QR,P as JR,Q as eO,C as L0,Y as W9,aF as V9,az as tO,O as Lx,t as Ka,I as mC,a9 as Dx,av as _C,$ as bC,a1 as iO,y as Xn,a4 as H9,x as Hr,by as z9,aN as U9,a5 as nO,a6 as sO,a7 as Xr,a2 as oO,aa as $N,N as $9,bO as jN,bP as j9,aB as N_,L as K9,a0 as rO}from\"./index.js\";import{l as q9}from\"./chunk.4a114b4a.js\";const Gc=o=>k9(o),vC=Symbol(\"tabsRootContextKey\"),G9=gC({tabs:{type:vx(Array),default:()=>qR([])}}),Z9={name:\"ElTabBar\"},Y9=Un(E_(I_({},Z9),{props:G9,setup(o,{expose:e}){const t=o,i=\"ElTabBar\",n=wx(),s=Nd(vC);s||Cx(i,\"<el-tabs><el-tab-bar /></el-tabs>\");const r=fC(\"tabs\"),a=ki(),l=ki(),c=()=>{let h=0,u=0;const g=[\"top\",\"bottom\"].includes(s.props.tabPosition)?\"width\":\"height\",f=g===\"width\"?\"x\":\"y\";return t.tabs.every(_=>{var b,v,C,w;const S=(v=(b=n.parent)==null?void 0:b.refs)==null?void 0:v[`tab-${_.uid}`];if(!S)return!1;if(!_.active)return!0;u=S[`client${Gc(g)}`];const k=f===\"x\"?\"left\":\"top\";h=S.getBoundingClientRect()[k]-((w=(C=S.parentElement)==null?void 0:C.getBoundingClientRect()[k])!=null?w:0);const x=window.getComputedStyle(S);return g===\"width\"&&(t.tabs.length>1&&(u-=Number.parseFloat(x.paddingLeft)+Number.parseFloat(x.paddingRight)),h+=Number.parseFloat(x.paddingLeft)),!1}),{[g]:`${u}px`,transform:`translate${Gc(f)}(${h}px)`}},d=()=>l.value=c();return Ul(()=>t.tabs,()=>io(this,null,function*(){yield pC(),d()}),{immediate:!0}),GR(a,()=>d()),e({ref:a,update:d}),(h,u)=>(li(),Wn(\"div\",{ref_key:\"barRef\",ref:a,class:y0([si(r).e(\"active-bar\"),si(r).is(si(s).props.tabPosition)]),style:x9(l.value)},null,6))}}));var X9=ZR(Y9,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/tabs/src/tab-bar.vue\"]]);const Q9=gC({panes:{type:vx(Array),default:()=>qR([])},currentName:{type:[String,Number],default:\"\"},editable:Boolean,type:{type:String,values:[\"card\",\"border-card\",\"\"],default:\"\"},stretch:Boolean}),J9={tabClick:(o,e,t)=>t instanceof Event,tabRemove:(o,e)=>e instanceof Event},KN=\"ElTabNav\",e8=Un({name:KN,props:Q9,emits:J9,setup(o,{expose:e,emit:t}){const i=wx(),n=Nd(vC);n||Cx(KN,\"<el-tabs><tab-nav /></el-tabs>\");const s=fC(\"tabs\"),r=I9(),a=E9(),l=ki(),c=ki(),d=ki(),h=ki(!1),u=ki(0),g=ki(!1),f=ki(!0),_=Ho(()=>[\"top\",\"bottom\"].includes(n.props.tabPosition)?\"width\":\"height\"),b=Ho(()=>({transform:`translate${_.value===\"width\"?\"X\":\"Y\"}(-${u.value}px)`})),v=()=>{if(!l.value)return;const D=l.value[`offset${Gc(_.value)}`],I=u.value;if(!I)return;const R=I>D?I-D:0;u.value=R},C=()=>{if(!l.value||!c.value)return;const D=c.value[`offset${Gc(_.value)}`],I=l.value[`offset${Gc(_.value)}`],R=u.value;if(D-R<=I)return;const P=D-R>I*2?R+I:D-I;u.value=P},w=()=>io(this,null,function*(){const D=c.value;if(!h.value||!d.value||!l.value||!D)return;yield pC();const I=d.value.querySelector(\".is-active\");if(!I)return;const R=l.value,P=[\"top\",\"bottom\"].includes(n.props.tabPosition),H=I.getBoundingClientRect(),$=R.getBoundingClientRect(),ne=P?D.offsetWidth-$.width:D.offsetHeight-$.height,ae=u.value;let de=ae;P?(H.left<$.left&&(de=ae-($.left-H.left)),H.right>$.right&&(de=ae+H.right-$.right)):(H.top<$.top&&(de=ae-($.top-H.top)),H.bottom>$.bottom&&(de=ae+(H.bottom-$.bottom))),de=Math.max(de,0),u.value=Math.min(de,ne)}),S=()=>{if(!c.value||!l.value)return;const D=c.value[`offset${Gc(_.value)}`],I=l.value[`offset${Gc(_.value)}`],R=u.value;if(I<D){const P=u.value;h.value=h.value||{},h.value.prev=P,h.value.next=P+I<D,D-P<I&&(u.value=D-I)}else h.value=!1,R>0&&(u.value=0)},k=D=>{const I=D.code,{up:R,down:P,left:H,right:$}=Gb;if(![R,P,H,$].includes(I))return;const ne=Array.from(D.currentTarget.querySelectorAll(\"[role=tab]:not(.is-disabled)\")),ae=ne.indexOf(D.target);let de;I===H||I===R?ae===0?de=ne.length-1:de=ae-1:ae<ne.length-1?de=ae+1:de=0,ne[de].focus(),ne[de].click(),x()},x=()=>{f.value&&(g.value=!0)},y=()=>g.value=!1;return Ul(r,D=>{D===\"hidden\"?f.value=!1:D===\"visible\"&&setTimeout(()=>f.value=!0,50)}),Ul(a,D=>{D?setTimeout(()=>f.value=!0,50):f.value=!1}),GR(d,S),Sx(()=>setTimeout(()=>w(),0)),N9(()=>S()),e({scrollToActiveTab:w,removeFocus:y}),Ul(()=>o.panes,()=>i.update(),{flush:\"post\"}),()=>{const D=h.value?[Nt(\"span\",{class:[s.e(\"nav-prev\"),s.is(\"disabled\",!h.value.prev)],onClick:v},[Nt(fd,null,{default:()=>[Nt(T9,null,null)]})]),Nt(\"span\",{class:[s.e(\"nav-next\"),s.is(\"disabled\",!h.value.next)],onClick:C},[Nt(fd,null,{default:()=>[Nt(M9,null,null)]})])]:null,I=o.panes.map((R,P)=>{var H,$,ne,ae;const de=R.uid,we=R.props.disabled,Se=($=(H=R.props.name)!=null?H:R.index)!=null?$:`${P}`,Me=!we&&(R.isClosable||o.editable);R.index=`${P}`;const St=Me?Nt(fd,{class:\"is-icon-close\",onClick:ge=>t(\"tabRemove\",R,ge)},{default:()=>[Nt(A9,null,null)]}):null,mt=((ae=(ne=R.slots).label)==null?void 0:ae.call(ne))||R.props.label,_e=!we&&R.active?0:-1;return Nt(\"div\",{ref:`tab-${de}`,class:[s.e(\"item\"),s.is(n.props.tabPosition),s.is(\"active\",R.active),s.is(\"disabled\",we),s.is(\"closable\",Me),s.is(\"focus\",g.value)],id:`tab-${Se}`,key:`tab-${de}`,\"aria-controls\":`pane-${Se}`,role:\"tab\",\"aria-selected\":R.active,tabindex:_e,onFocus:()=>x(),onBlur:()=>y(),onClick:ge=>{y(),t(\"tabClick\",R,Se,ge)},onKeydown:ge=>{Me&&(ge.code===Gb.delete||ge.code===Gb.backspace)&&t(\"tabRemove\",R,ge)}},[mt,St])});return Nt(\"div\",{ref:d,class:[s.e(\"nav-wrap\"),s.is(\"scrollable\",!!h.value),s.is(n.props.tabPosition)]},[D,Nt(\"div\",{class:s.e(\"nav-scroll\"),ref:l},[Nt(\"div\",{class:[s.e(\"nav\"),s.is(n.props.tabPosition),s.is(\"stretch\",o.stretch&&[\"top\",\"bottom\"].includes(n.props.tabPosition))],ref:c,style:b.value,role:\"tablist\",onKeydown:k},[o.type?null:Nt(X9,{tabs:[...o.panes]},null),I])])])}}}),t8=gC({type:{type:String,values:[\"card\",\"border-card\",\"\"],default:\"\"},activeName:{type:[String,Number]},closable:Boolean,addable:Boolean,modelValue:{type:[String,Number]},editable:Boolean,tabPosition:{type:String,values:[\"top\",\"right\",\"bottom\",\"left\"],default:\"top\"},beforeLeave:{type:vx(Function),default:()=>!0},stretch:Boolean}),dw=o=>P9(o)||F9(o),i8={[YR]:o=>dw(o),tabClick:(o,e)=>e instanceof Event,tabChange:o=>dw(o),edit:(o,e)=>[\"remove\",\"add\"].includes(e),tabRemove:o=>dw(o),tabAdd:()=>!0};var n8=Un({name:\"ElTabs\",props:t8,emits:i8,setup(o,{emit:e,slots:t,expose:i}){var n,s;const r=fC(\"tabs\"),a=ki(),l=XR({}),c=ki((s=(n=o.modelValue)!=null?n:o.activeName)!=null?s:\"0\"),d=_=>{c.value=_,e(YR,_),e(\"tabChange\",_)},h=_=>io(this,null,function*(){var b,v,C;if(!(c.value===_||zN(_)))try{(yield(b=o.beforeLeave)==null?void 0:b.call(o,_,c.value))!==!1&&(d(_),(C=(v=a.value)==null?void 0:v.removeFocus)==null||C.call(v))}catch(w){}}),u=(_,b,v)=>{_.props.disabled||(h(b),e(\"tabClick\",_,v))},g=(_,b)=>{_.props.disabled||zN(_.props.name)||(b.stopPropagation(),e(\"edit\",_.props.name,\"remove\"),e(\"tabRemove\",_.props.name))},f=()=>{e(\"edit\",void 0,\"add\"),e(\"tabAdd\")};return R9({from:'\"activeName\"',replacement:'\"model-value\" or \"v-model\"',scope:\"ElTabs\",version:\"2.3.0\",ref:\"https://element-plus.org/en-US/component/tabs.html#attributes\",type:\"Attribute\"},Ho(()=>!!o.activeName)),Ul(()=>o.activeName,_=>h(_)),Ul(()=>o.modelValue,_=>h(_)),Ul(c,()=>io(this,null,function*(){var _;yield pC(),(_=a.value)==null||_.scrollToActiveTab()})),uy(vC,{props:o,currentName:c,registerPane:v=>l[v.uid]=v,unregisterPane:v=>delete l[v]}),i({currentName:c}),()=>{const _=o.editable||o.addable?Nt(\"span\",{class:r.e(\"new-tab\"),tabindex:\"0\",onClick:f,onKeydown:C=>{C.code===Gb.enter&&f()}},[Nt(fd,{class:r.is(\"icon-plus\")},{default:()=>[Nt(O9,null,null)]})]):null,b=Nt(\"div\",{class:[r.e(\"header\"),r.is(o.tabPosition)]},[_,Nt(e8,{ref:a,currentName:c.value,editable:o.editable,type:o.type,panes:Object.values(l),stretch:o.stretch,onTabClick:u,onTabRemove:g},null)]),v=Nt(\"div\",{class:r.e(\"content\")},[yx(t,\"default\")]);return Nt(\"div\",{class:[r.b(),r.m(o.tabPosition),{[r.m(\"card\")]:o.type===\"card\",[r.m(\"border-card\")]:o.type===\"border-card\"}]},[...o.tabPosition!==\"bottom\"?[b,v]:[v,b]])}}});const s8=gC({label:{type:String,default:\"\"},name:{type:[String,Number]},closable:Boolean,disabled:Boolean,lazy:Boolean}),o8=[\"id\",\"aria-hidden\",\"aria-labelledby\"],r8={name:\"ElTabPane\"},a8=Un(E_(I_({},r8),{props:s8,setup(o){const e=o,t=\"ElTabPane\",i=wx(),n=B9(),s=Nd(vC);s||Cx(t,\"usage: <el-tabs><el-tab-pane /></el-tabs/>\");const r=fC(\"tab-pane\"),a=ki(),l=Ho(()=>e.closable||s.props.closable),c=UN(()=>{var f;return s.currentName.value===((f=e.name)!=null?f:a.value)}),d=ki(c.value),h=Ho(()=>{var f;return(f=e.name)!=null?f:a.value}),u=UN(()=>!e.lazy||d.value||c.value);Ul(c,f=>{f&&(d.value=!0)});const g=XR({uid:i.uid,slots:n,props:e,paneName:h,active:c,index:a,isClosable:l});return Sx(()=>{s.registerPane(g)}),QR(()=>{s.unregisterPane(g.uid)}),(f,_)=>si(u)?JR((li(),Wn(\"div\",{key:0,id:`pane-${si(h)}`,class:y0(si(r).b()),role:\"tabpanel\",\"aria-hidden\":!si(c),\"aria-labelledby\":`tab-${si(h)}`},[yx(f.$slots,\"default\")],10,o8)),[[eO,si(c)]]):L0(\"v-if\",!0)}}));var aO=ZR(a8,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/tabs/src/tab-pane.vue\"]]);const l8=W9(n8,{TabPane:aO}),c8=V9(aO),d8=Un({__name:\"asides\",props:{path:{type:String,default:\"\"}},setup(o){return io(this,null,function*(){let e,t;const i=o,n=ki([]),s=()=>io(this,null,function*(){try{const r={path:`/local${i.path}`},a=yield Dx.File.Basic.List.POST(r);if(a.data){const{success:l,result:c,error:d}=a.data;l==0&&(n.value=_C.FileBasicEntryArray(c.entries||[]))}}catch(r){console.log(r)}finally{}});return[e,t]=tO(()=>s()),yield e,t(),(r,a)=>(li(!0),Wn(mC,null,Lx(n.value,l=>(li(),Ka(lO,{entrie:l},null,8,[\"entrie\"]))),256))})}}),h8=o=>(nO(\"data-v-92de20f9\"),o=o(),sO(),o),u8={class:\"file_name\"},g8=h8(()=>Xn(\"div\",{class:\"auto\"},null,-1)),f8={key:0,class:\"file-icon\"},p8={class:\"children\"},m8=Un({__name:\"aside-item\",props:{entrie:{type:Object,default:[]}},setup(o){const e=uC();bC();const t=ki(!1),i=ki(!1),n=a=>{a.fileType===\"dir\"?s():r(a)},s=a=>{i.value=!i.value,t.value||(t.value=!0)},r=a=>{switch(console.log(a.iconType),a.iconType){case\"archive\":return;case\"music\":return}e.addTab(a)};return(a,l)=>{const c=iO(\"thumbnail\");return li(),Wn(mC,null,[Xn(\"li\",{class:y0([\"file-item\",{on:o.entrie.rootPath===si(e).editableTabsValue}]),onClick:l[0]||(l[0]=d=>n(o.entrie))},[Xn(\"div\",{class:y0([\"file_cover\",o.entrie.fileType])},[Nt(c,{file:o.entrie},null,8,[\"file\"])],2),Xn(\"span\",u8,H9(o.entrie.name),1),g8,o.entrie.fileType===\"dir\"?(li(),Wn(\"div\",f8,[i.value?(li(),Ka(si(fd),{key:0},{default:Hr(()=>[Nt(si(z9))]),_:1})):(li(),Ka(si(fd),{key:1},{default:Hr(()=>[Nt(si(U9))]),_:1}))])):L0(\"\",!0)],2),JR(Xn(\"ul\",p8,[t.value?(li(),Ka(d8,{key:0,path:o.entrie.rootPath||`/${o.entrie.name}`},null,8,[\"path\"])):L0(\"\",!0)],512),[[eO,i.value]])],64)}}});const lO=Xr(m8,[[\"__scopeId\",\"data-v-92de20f9\"]]),_8=Un({__name:\"list\",setup(o){return io(this,null,function*(){let e,t;const i=uC();bC();const n=Nd(\"path\"),s=Nd(\"absPath\"),r=ki([]),a=()=>io(this,null,function*(){try{const l=yield Dx.File.Basic.List.POST({path:\"/local\"+s.value});if(l.data){const{success:c,result:d,error:h}=l.data;if(d!=null&&d.entries){r.value=_C.FileBasicEntryArray(d.entries);for(let u=0;u<r.value.length;u++)if(r.value[u].fileType!==\"dir\"&&r.value[u].rootPath===n.value){i.addTab(r.value[u]);break}}h&&$N.Warning(h)}}catch(l){console.log(l),$N.Error(`${l}`)}});return[e,t]=tO(()=>a()),yield e,t(),(l,c)=>(li(),Ka(si(oO),{class:\"aside-container\"},{default:Hr(()=>[(li(!0),Wn(mC,null,Lx(r.value,d=>(li(),Ka(lO,{entrie:d},null,8,[\"entrie\"]))),256))]),_:1}))})}});const b8=Xr(_8,[[\"__scopeId\",\"data-v-0674120d\"]]),cO=o=>(nO(\"data-v-0b8be308\"),o=o(),sO(),o),v8={class:\"aside-header\"},C8=cO(()=>Xn(\"span\",null,\"\\u8D44\\u6E90\\u7BA1\\u7406\",-1)),w8=cO(()=>Xn(\"div\",{class:\"auto\"},null,-1)),S8=Un({__name:\"index\",setup(o){const e=ki(0),t=()=>{e.value++};return(i,n)=>(li(),Wn(\"aside\",null,[Xn(\"div\",v8,[C8,w8,Xn(\"button\",{class:\"refresh\",title:\"\\u5237\\u65B0\",onClick:t},[Nt(si(fd),null,{default:Hr(()=>[Nt(si($9))]),_:1})])]),Nt(si(oO),{class:\"aside-container\"},{default:Hr(()=>[(li(),Ka(b8,{key:e.value}))]),_:1})]))}});const y8=Xr(S8,[[\"__scopeId\",\"data-v-0b8be308\"]]),L8={class:\"main-eidtor\"},D8={class:\"main-footer\"},k8=[\"disabled\"],x8=Un({__name:\"container\",props:{disabled:Boolean},emits:[\"save\"],setup(o,{emit:e}){const t=()=>{e(\"save\")},i=n=>{n.keyCode===83&&(navigator.platform.match(\"Mac\")?n.metaKey:n.ctrlKey)&&(t(),n.preventDefault())};return(n,s)=>(li(),Wn(\"div\",{class:\"main-container\",onKeydown:s[0]||(s[0]=r=>i(r))},[Xn(\"div\",L8,[yx(n.$slots,\"default\",{},void 0,!0)]),Xn(\"div\",D8,[Xn(\"button\",{class:\"save\",onClick:t,disabled:o.disabled},\" \\u4FDD\\u5B58 \",8,k8)])],32))}});const I8=Xr(x8,[[\"__scopeId\",\"data-v-be306a98\"]]);globalThis&&globalThis.__awaiter;let E8=typeof document!=\"undefined\"&&document.location&&document.location.hash.indexOf(\"pseudo=true\")>=0;function N8(o,e){let t;return e.length===0?t=o:t=o.replace(/\\{(\\d+)\\}/g,(i,n)=>{const s=n[0],r=e[s];let a=i;return typeof r==\"string\"?a=r:(typeof r==\"number\"||typeof r==\"boolean\"||r===void 0||r===null)&&(a=String(r)),a}),E8&&(t=\"\\uFF3B\"+t.replace(/[aouei]/g,\"$&$&\")+\"\\uFF3D\"),t}function p(o,e,...t){return N8(e,t)}class T8{constructor(){this.listeners=[],this.unexpectedErrorHandler=function(e){setTimeout(()=>{throw e.stack?Yu.isErrorNoTelemetry(e)?new Yu(e.message+`\n\n`+e.stack):new Error(e.message+`\n\n`+e.stack):e},0)}}emit(e){this.listeners.forEach(t=>{t(e)})}onUnexpectedError(e){this.unexpectedErrorHandler(e),this.emit(e)}onUnexpectedExternalError(e){this.unexpectedErrorHandler(e)}}const dO=new T8;function Ee(o){ol(o)||dO.onUnexpectedError(o)}function Ai(o){ol(o)||dO.onUnexpectedExternalError(o)}function qN(o){if(o instanceof Error){const{name:e,message:t}=o,i=o.stacktrace||o.stack;return{$isError:!0,name:e,message:t,stack:i,noTelemetry:Yu.isErrorNoTelemetry(o)}}return o}const D0=\"Canceled\";function ol(o){return o instanceof yc?!0:o instanceof Error&&o.name===D0&&o.message===D0}class yc extends Error{constructor(){super(D0),this.name=this.message}}function hO(){const o=new Error(D0);return o.name=o.message,o}function zo(o){return o?new Error(`Illegal argument: ${o}`):new Error(\"Illegal argument\")}function M8(o){return o?new Error(`Illegal state: ${o}`):new Error(\"Illegal state\")}class A8 extends Error{constructor(e){super(\"NotSupported\"),e&&(this.message=e)}}class Yu extends Error{constructor(e){super(e),this.name=\"ErrorNoTelemetry\"}static fromError(e){if(e instanceof Yu)return e;const t=new Yu;return t.message=e.message,t.stack=e.stack,t}static isErrorNoTelemetry(e){return e.name===\"ErrorNoTelemetry\"}}class kx extends Error{constructor(e){super(e||\"An unexpected bug occurred.\"),Object.setPrototypeOf(this,kx.prototype);debugger}}function nc(o){const e=this;let t=!1,i;return function(){return t||(t=!0,i=o.apply(e,arguments)),i}}var Ue;(function(o){function e(S){return S&&typeof S==\"object\"&&typeof S[Symbol.iterator]==\"function\"}o.is=e;const t=Object.freeze([]);function i(){return t}o.empty=i;function*n(S){yield S}o.single=n;function s(S){return S||t}o.from=s;function r(S){return!S||S[Symbol.iterator]().next().done===!0}o.isEmpty=r;function a(S){return S[Symbol.iterator]().next().value}o.first=a;function l(S,k){for(const x of S)if(k(x))return!0;return!1}o.some=l;function c(S,k){for(const x of S)if(k(x))return x}o.find=c;function*d(S,k){for(const x of S)k(x)&&(yield x)}o.filter=d;function*h(S,k){let x=0;for(const y of S)yield k(y,x++)}o.map=h;function*u(...S){for(const k of S)for(const x of k)yield x}o.concat=u;function*g(S){for(const k of S)for(const x of k)yield x}o.concatNested=g;function f(S,k,x){let y=x;for(const D of S)y=k(y,D);return y}o.reduce=f;function _(S,k){let x=0;for(const y of S)k(y,x++)}o.forEach=_;function*b(S,k,x=S.length){for(k<0&&(k+=S.length),x<0?x+=S.length:x>S.length&&(x=S.length);k<x;k++)yield S[k]}o.slice=b;function v(S,k=Number.POSITIVE_INFINITY){const x=[];if(k===0)return[x,S];const y=S[Symbol.iterator]();for(let D=0;D<k;D++){const I=y.next();if(I.done)return[x,o.empty()];x.push(I.value)}return[x,{[Symbol.iterator](){return y}}]}o.consume=v;function C(S){return v(S)[0]}o.collect=C;function w(S,k,x=(y,D)=>y===D){const y=S[Symbol.iterator](),D=k[Symbol.iterator]();for(;;){const I=y.next(),R=D.next();if(I.done!==R.done)return!1;if(I.done)return!0;if(!x(I.value,R.value))return!1}}o.equals=w})(Ue||(Ue={}));class R8 extends Error{constructor(e){super(`Encountered errors while disposing of store. Errors: [${e.join(\", \")}]`),this.errors=e}}function xx(o){return typeof o.dispose==\"function\"&&o.dispose.length===0}function et(o){if(Ue.is(o)){const e=[];for(const t of o)if(t)try{t.dispose()}catch(i){e.push(i)}if(e.length===1)throw e[0];if(e.length>1)throw new R8(e);return Array.isArray(o)?[]:o}else if(o)return o.dispose(),o}function Pr(...o){return ze(()=>et(o))}function ze(o){return{dispose:nc(()=>{o()})}}class ee{constructor(){this._toDispose=new Set,this._isDisposed=!1}dispose(){this._isDisposed||(this._isDisposed=!0,this.clear())}get isDisposed(){return this._isDisposed}clear(){try{et(this._toDispose.values())}finally{this._toDispose.clear()}}add(e){if(!e)return e;if(e===this)throw new Error(\"Cannot register a disposable on itself!\");return this._isDisposed?ee.DISABLE_DISPOSED_WARNING||console.warn(new Error(\"Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!\").stack):this._toDispose.add(e),e}}ee.DISABLE_DISPOSED_WARNING=!1;class z{constructor(){this._store=new ee,this._store}dispose(){this._store.dispose()}_register(e){if(e===this)throw new Error(\"Cannot register a disposable on itself!\");return this._store.add(e)}}z.None=Object.freeze({dispose(){}});class Vn{constructor(){this._isDisposed=!1}get value(){return this._isDisposed?void 0:this._value}set value(e){var t;this._isDisposed||e===this._value||((t=this._value)===null||t===void 0||t.dispose(),this._value=e)}clear(){this.value=void 0}dispose(){var e;this._isDisposed=!0,(e=this._value)===null||e===void 0||e.dispose(),this._value=void 0}clearAndLeak(){const e=this._value;return this._value=void 0,e}}class O8{constructor(e){this._disposable=e,this._counter=1}acquire(){return this._counter++,this}release(){return--this._counter===0&&this._disposable.dispose(),this}}class P8{constructor(){this.dispose=()=>{},this.unset=()=>{},this.isset=()=>!1}set(e){let t=e;return this.unset=()=>t=void 0,this.isset=()=>t!==void 0,this.dispose=()=>{t&&(t(),t=void 0)},this}}class F8{constructor(e){this.object=e}dispose(){}}class $t{constructor(e){this.element=e,this.next=$t.Undefined,this.prev=$t.Undefined}}$t.Undefined=new $t(void 0);class wn{constructor(){this._first=$t.Undefined,this._last=$t.Undefined,this._size=0}get size(){return this._size}isEmpty(){return this._first===$t.Undefined}clear(){let e=this._first;for(;e!==$t.Undefined;){const t=e.next;e.prev=$t.Undefined,e.next=$t.Undefined,e=t}this._first=$t.Undefined,this._last=$t.Undefined,this._size=0}unshift(e){return this._insert(e,!1)}push(e){return this._insert(e,!0)}_insert(e,t){const i=new $t(e);if(this._first===$t.Undefined)this._first=i,this._last=i;else if(t){const s=this._last;this._last=i,i.prev=s,s.next=i}else{const s=this._first;this._first=i,i.next=s,s.prev=i}this._size+=1;let n=!1;return()=>{n||(n=!0,this._remove(i))}}shift(){if(this._first!==$t.Undefined){const e=this._first.element;return this._remove(this._first),e}}pop(){if(this._last!==$t.Undefined){const e=this._last.element;return this._remove(this._last),e}}_remove(e){if(e.prev!==$t.Undefined&&e.next!==$t.Undefined){const t=e.prev;t.next=e.next,e.next.prev=t}else e.prev===$t.Undefined&&e.next===$t.Undefined?(this._first=$t.Undefined,this._last=$t.Undefined):e.next===$t.Undefined?(this._last=this._last.prev,this._last.next=$t.Undefined):e.prev===$t.Undefined&&(this._first=this._first.next,this._first.prev=$t.Undefined);this._size-=1}*[Symbol.iterator](){let e=this._first;for(;e!==$t.Undefined;)yield e.element,e=e.next}}var hw;const Mf=\"en\";let k0=!1,x0=!1,Zb=!1,uO=!1,Ix=!1,Ex=!1,T_,Yb=Mf,B8,Cl;const ei=typeof self==\"object\"?self:typeof global==\"object\"?global:{};let bn;typeof ei.vscode!=\"undefined\"&&typeof ei.vscode.process!=\"undefined\"?bn=ei.vscode.process:typeof process!=\"undefined\"&&(bn=process);const W8=typeof((hw=bn==null?void 0:bn.versions)===null||hw===void 0?void 0:hw.electron)==\"string\",V8=W8&&(bn==null?void 0:bn.type)===\"renderer\";if(typeof navigator==\"object\"&&!V8)Cl=navigator.userAgent,k0=Cl.indexOf(\"Windows\")>=0,x0=Cl.indexOf(\"Macintosh\")>=0,Ex=(Cl.indexOf(\"Macintosh\")>=0||Cl.indexOf(\"iPad\")>=0||Cl.indexOf(\"iPhone\")>=0)&&!!navigator.maxTouchPoints&&navigator.maxTouchPoints>0,Zb=Cl.indexOf(\"Linux\")>=0,Ix=!0,p({key:\"ensureLoaderPluginIsLoaded\",comment:[\"{Locked}\"]},\"_\"),T_=Mf,Yb=T_;else if(typeof bn==\"object\"){k0=bn.platform===\"win32\",x0=bn.platform===\"darwin\",Zb=bn.platform===\"linux\",Zb&&!!bn.env.SNAP&&bn.env.SNAP_REVISION,bn.env.CI||bn.env.BUILD_ARTIFACTSTAGINGDIRECTORY,T_=Mf,Yb=Mf;const o=bn.env.VSCODE_NLS_CONFIG;if(o)try{const e=JSON.parse(o),t=e.availableLanguages[\"*\"];T_=e.locale,Yb=t||Mf,B8=e._translationsConfigFile}catch(e){}uO=!0}else console.error(\"Unable to resolve platform.\");const nn=k0,Ze=x0,sn=Zb,Uo=uO,Lc=Ix,H8=Ix&&typeof ei.importScripts==\"function\",Xa=Ex,zr=Cl,z8=Yb,U8=typeof ei.postMessage==\"function\"&&!ei.importScripts,gO=(()=>{if(U8){const o=[];ei.addEventListener(\"message\",t=>{if(t.data&&t.data.vscodeScheduleAsyncWork)for(let i=0,n=o.length;i<n;i++){const s=o[i];if(s.id===t.data.vscodeScheduleAsyncWork){o.splice(i,1),s.callback();return}}});let e=0;return t=>{const i=++e;o.push({id:i,callback:t}),ei.postMessage({vscodeScheduleAsyncWork:i},\"*\")}}return o=>setTimeout(o)})(),Os=x0||Ex?2:k0?1:3;let GN=!0,ZN=!1;function fO(){if(!ZN){ZN=!0;const o=new Uint8Array(2);o[0]=1,o[1]=2,GN=new Uint16Array(o.buffer)[0]===(2<<8)+1}return GN}const pO=!!(zr&&zr.indexOf(\"Chrome\")>=0),$8=!!(zr&&zr.indexOf(\"Firefox\")>=0),j8=!!(!pO&&zr&&zr.indexOf(\"Safari\")>=0),K8=!!(zr&&zr.indexOf(\"Edg/\")>=0);zr&&zr.indexOf(\"Android\")>=0;const q8=ei.performance&&typeof ei.performance.now==\"function\";class Hn{constructor(e){this._highResolution=q8&&e,this._startTime=this._now(),this._stopTime=-1}static create(e=!0){return new Hn(e)}stop(){this._stopTime=this._now()}elapsed(){return this._stopTime!==-1?this._stopTime-this._startTime:this._now()-this._startTime}_now(){return this._highResolution?ei.performance.now():Date.now()}}var pe;(function(o){o.None=()=>z.None;function e(x){return(y,D=null,I)=>{let R=!1,P;return P=x(H=>{if(!R)return P?P.dispose():R=!0,y.call(D,H)},null,I),R&&P.dispose(),P}}o.once=e;function t(x,y,D){return l((I,R=null,P)=>x(H=>I.call(R,y(H)),null,P),D)}o.map=t;function i(x,y,D){return l((I,R=null,P)=>x(H=>{y(H),I.call(R,H)},null,P),D)}o.forEach=i;function n(x,y,D){return l((I,R=null,P)=>x(H=>y(H)&&I.call(R,H),null,P),D)}o.filter=n;function s(x){return x}o.signal=s;function r(...x){return(y,D=null,I)=>Pr(...x.map(R=>R(P=>y.call(D,P),null,I)))}o.any=r;function a(x,y,D,I){let R=D;return t(x,P=>(R=y(R,P),R),I)}o.reduce=a;function l(x,y){let D;const I={onFirstListenerAdd(){D=x(R.fire,R)},onLastListenerRemove(){D==null||D.dispose()}},R=new O(I);return y==null||y.add(R),R.event}function c(x,y,D=100,I=!1,R,P){let H,$,ne,ae=0;const de={leakWarningThreshold:R,onFirstListenerAdd(){H=x(Se=>{ae++,$=y($,Se),I&&!ne&&(we.fire($),$=void 0),clearTimeout(ne),ne=setTimeout(()=>{const Me=$;$=void 0,ne=void 0,(!I||ae>1)&&we.fire(Me),ae=0},D)})},onLastListenerRemove(){H.dispose()}},we=new O(de);return P==null||P.add(we),we.event}o.debounce=c;function d(x,y=(I,R)=>I===R,D){let I=!0,R;return n(x,P=>{const H=I||!y(P,R);return I=!1,R=P,H},D)}o.latch=d;function h(x,y,D){return[o.filter(x,y,D),o.filter(x,I=>!y(I),D)]}o.split=h;function u(x,y=!1,D=[]){let I=D.slice(),R=x($=>{I?I.push($):H.fire($)});const P=()=>{I==null||I.forEach($=>H.fire($)),I=null},H=new O({onFirstListenerAdd(){R||(R=x($=>H.fire($)))},onFirstListenerDidAdd(){I&&(y?setTimeout(P):P())},onLastListenerRemove(){R&&R.dispose(),R=null}});return H.event}o.buffer=u;class g{constructor(y){this.event=y,this.disposables=new ee}map(y){return new g(t(this.event,y,this.disposables))}forEach(y){return new g(i(this.event,y,this.disposables))}filter(y){return new g(n(this.event,y,this.disposables))}reduce(y,D){return new g(a(this.event,y,D,this.disposables))}latch(){return new g(d(this.event,void 0,this.disposables))}debounce(y,D=100,I=!1,R){return new g(c(this.event,y,D,I,R,this.disposables))}on(y,D,I){return this.event(y,D,I)}once(y,D,I){return e(this.event)(y,D,I)}dispose(){this.disposables.dispose()}}function f(x){return new g(x)}o.chain=f;function _(x,y,D=I=>I){const I=(...$)=>H.fire(D(...$)),R=()=>x.on(y,I),P=()=>x.removeListener(y,I),H=new O({onFirstListenerAdd:R,onLastListenerRemove:P});return H.event}o.fromNodeEventEmitter=_;function b(x,y,D=I=>I){const I=(...$)=>H.fire(D(...$)),R=()=>x.addEventListener(y,I),P=()=>x.removeEventListener(y,I),H=new O({onFirstListenerAdd:R,onLastListenerRemove:P});return H.event}o.fromDOMEventEmitter=b;function v(x){return new Promise(y=>e(x)(y))}o.toPromise=v;function C(x,y){return y(void 0),x(D=>y(D))}o.runAndSubscribe=C;function w(x,y){let D=null;function I(P){D==null||D.dispose(),D=new ee,y(P,D)}I(void 0);const R=x(P=>I(P));return ze(()=>{R.dispose(),D==null||D.dispose()})}o.runAndSubscribeWithStore=w;class S{constructor(y,D){this.obs=y,this._counter=0,this._hasChanged=!1;const I={onFirstListenerAdd:()=>{y.addObserver(this)},onLastListenerRemove:()=>{y.removeObserver(this)}};this.emitter=new O(I),D&&D.add(this.emitter)}beginUpdate(y){this._counter++}handleChange(y,D){this._hasChanged=!0}endUpdate(y){--this._counter===0&&this._hasChanged&&(this._hasChanged=!1,this.emitter.fire(this.obs.get()))}}function k(x,y){return new S(x,y).emitter.event}o.fromObservable=k})(pe||(pe={}));class CC{constructor(e){this._listenerCount=0,this._invocationCount=0,this._elapsedOverall=0,this._name=`${e}_${CC._idPool++}`}start(e){this._stopWatch=new Hn(!0),this._listenerCount=e}stop(){if(this._stopWatch){const e=this._stopWatch.elapsed();this._elapsedOverall+=e,this._invocationCount+=1,console.info(`did FIRE ${this._name}: elapsed_ms: ${e.toFixed(5)}, listener: ${this._listenerCount} (elapsed_overall: ${this._elapsedOverall.toFixed(2)}, invocations: ${this._invocationCount})`),this._stopWatch=void 0}}}CC._idPool=0;class Nx{constructor(e){this.value=e}static create(){var e;return new Nx((e=new Error().stack)!==null&&e!==void 0?e:\"\")}print(){console.warn(this.value.split(`\n`).slice(2).join(`\n`))}}class G8{constructor(e,t,i){this.callback=e,this.callbackThis=t,this.stack=i,this.subscription=new P8}invoke(e){this.callback.call(this.callbackThis,e)}}class O{constructor(e){var t,i;this._disposed=!1,this._options=e,this._leakageMon=void 0,this._perfMon=!((t=this._options)===null||t===void 0)&&t._profName?new CC(this._options._profName):void 0,this._deliveryQueue=(i=this._options)===null||i===void 0?void 0:i.deliveryQueue}dispose(){var e,t,i,n;this._disposed||(this._disposed=!0,this._listeners&&this._listeners.clear(),(e=this._deliveryQueue)===null||e===void 0||e.clear(this),(i=(t=this._options)===null||t===void 0?void 0:t.onLastListenerRemove)===null||i===void 0||i.call(t),(n=this._leakageMon)===null||n===void 0||n.dispose())}get event(){return this._event||(this._event=(e,t,i)=>{var n,s,r;this._listeners||(this._listeners=new wn);const a=this._listeners.isEmpty();a&&((n=this._options)===null||n===void 0?void 0:n.onFirstListenerAdd)&&this._options.onFirstListenerAdd(this);let l,c;this._leakageMon&&this._listeners.size>=30&&(c=Nx.create(),l=this._leakageMon.check(c,this._listeners.size+1));const d=new G8(e,t,c),h=this._listeners.push(d);a&&((s=this._options)===null||s===void 0?void 0:s.onFirstListenerDidAdd)&&this._options.onFirstListenerDidAdd(this),!((r=this._options)===null||r===void 0)&&r.onListenerDidAdd&&this._options.onListenerDidAdd(this,e,t);const u=d.subscription.set(()=>{l==null||l(),this._disposed||(h(),this._options&&this._options.onLastListenerRemove&&(this._listeners&&!this._listeners.isEmpty()||this._options.onLastListenerRemove(this)))});return i instanceof ee?i.add(u):Array.isArray(i)&&i.push(u),u}),this._event}fire(e){var t,i;if(this._listeners){this._deliveryQueue||(this._deliveryQueue=new Z8);for(const n of this._listeners)this._deliveryQueue.push(this,n,e);(t=this._perfMon)===null||t===void 0||t.start(this._deliveryQueue.size),this._deliveryQueue.deliver(),(i=this._perfMon)===null||i===void 0||i.stop()}}}class mO{constructor(){this._queue=new wn}get size(){return this._queue.size}push(e,t,i){this._queue.push(new Y8(e,t,i))}clear(e){const t=new wn;for(const i of this._queue)i.emitter!==e&&t.push(i);this._queue=t}deliver(){for(;this._queue.size>0;){const e=this._queue.shift();try{e.listener.invoke(e.event)}catch(t){Ee(t)}}}}class Z8 extends mO{clear(e){this._queue.clear()}}class Y8{constructor(e,t,i){this.emitter=e,this.listener=t,this.event=i}}class I0 extends O{constructor(e){super(e),this._isPaused=0,this._eventQueue=new wn,this._mergeFn=e==null?void 0:e.merge}pause(){this._isPaused++}resume(){if(this._isPaused!==0&&--this._isPaused===0)if(this._mergeFn){const e=Array.from(this._eventQueue);this._eventQueue.clear(),super.fire(this._mergeFn(e))}else for(;!this._isPaused&&this._eventQueue.size!==0;)super.fire(this._eventQueue.shift())}fire(e){this._listeners&&(this._isPaused!==0?this._eventQueue.push(e):super.fire(e))}}class X8 extends I0{constructor(e){var t;super(e),this._delay=(t=e.delay)!==null&&t!==void 0?t:100}fire(e){this._handle||(this.pause(),this._handle=setTimeout(()=>{this._handle=void 0,this.resume()},this._delay)),super.fire(e)}}class Tx{constructor(){this.buffers=[]}wrapEvent(e){return(t,i,n)=>e(s=>{const r=this.buffers[this.buffers.length-1];r?r.push(()=>t.call(i,s)):t.call(i,s)},void 0,n)}bufferEvents(e){const t=[];this.buffers.push(t);const i=e();return this.buffers.pop(),t.forEach(n=>n()),i}}class YN{constructor(){this.listening=!1,this.inputEvent=pe.None,this.inputEventListener=z.None,this.emitter=new O({onFirstListenerDidAdd:()=>{this.listening=!0,this.inputEventListener=this.inputEvent(this.emitter.fire,this.emitter)},onLastListenerRemove:()=>{this.listening=!1,this.inputEventListener.dispose()}}),this.event=this.emitter.event}set input(e){this.inputEvent=e,this.listening&&(this.inputEventListener.dispose(),this.inputEventListener=e(this.emitter.fire,this.emitter))}dispose(){this.inputEventListener.dispose(),this.emitter.dispose()}}class gy{constructor(){this._zoomFactor=1}getZoomFactor(){return this._zoomFactor}}gy.INSTANCE=new gy;class Q8 extends z{constructor(){super(),this._onDidChange=this._register(new O),this.onDidChange=this._onDidChange.event,this._listener=()=>this._handleChange(!0),this._mediaQueryList=null,this._handleChange(!1)}_handleChange(e){var t;(t=this._mediaQueryList)===null||t===void 0||t.removeEventListener(\"change\",this._listener),this._mediaQueryList=matchMedia(`(resolution: ${window.devicePixelRatio}dppx)`),this._mediaQueryList.addEventListener(\"change\",this._listener),e&&this._onDidChange.fire()}}class J8 extends z{constructor(){super(),this._onDidChange=this._register(new O),this.onDidChange=this._onDidChange.event,this._value=this._getPixelRatio();const e=this._register(new Q8);this._register(e.onDidChange(()=>{this._value=this._getPixelRatio(),this._onDidChange.fire(this._value)}))}get value(){return this._value}_getPixelRatio(){const e=document.createElement(\"canvas\").getContext(\"2d\"),t=window.devicePixelRatio||1,i=e.webkitBackingStorePixelRatio||e.mozBackingStorePixelRatio||e.msBackingStorePixelRatio||e.oBackingStorePixelRatio||e.backingStorePixelRatio||1;return t/i}}class e6{constructor(){this._pixelRatioMonitor=null}_getOrCreatePixelRatioMonitor(){return this._pixelRatioMonitor||(this._pixelRatioMonitor=new J8),this._pixelRatioMonitor}get value(){return this._getOrCreatePixelRatioMonitor().value}get onDidChange(){return this._getOrCreatePixelRatioMonitor().onDidChange}}function Mx(o,e){typeof o==\"string\"&&(o=window.matchMedia(o)),o.addEventListener(\"change\",e)}const Xu=new e6;function _O(){return gy.INSTANCE.getZoomFactor()}const Rg=navigator.userAgent,Ls=Rg.indexOf(\"Firefox\")>=0,$l=Rg.indexOf(\"AppleWebKit\")>=0,Ax=Rg.indexOf(\"Chrome\")>=0,Qa=!Ax&&Rg.indexOf(\"Safari\")>=0,Rx=!Ax&&!Qa&&$l,t6=Rg.indexOf(\"Electron/\")>=0,bO=Rg.indexOf(\"Android\")>=0;let fy=!1;if(window.matchMedia){const o=window.matchMedia(\"(display-mode: standalone)\");fy=o.matches,Mx(o,({matches:e})=>{fy=e})}function Ox(){return fy}const i6=Object.freeze(Object.defineProperty({__proto__:null,addMatchMediaChangeListener:Mx,PixelRatio:Xu,getZoomFactor:_O,isFirefox:Ls,isWebKit:$l,isChrome:Ax,isSafari:Qa,isWebkitWebView:Rx,isElectron:t6,isAndroid:bO,isStandalone:Ox},Symbol.toStringTag,{value:\"Module\"}));function vO(o){return Array.isArray(o)}function ts(o){return typeof o==\"string\"}function Fn(o){return typeof o==\"object\"&&o!==null&&!Array.isArray(o)&&!(o instanceof RegExp)&&!(o instanceof Date)}function n6(o){const e=Object.getPrototypeOf(Uint8Array);return typeof o==\"object\"&&o instanceof e}function sc(o){return typeof o==\"number\"&&!isNaN(o)}function XN(o){return!!o&&typeof o[Symbol.iterator]==\"function\"}function CO(o){return o===!0||o===!1}function Qn(o){return typeof o==\"undefined\"}function s6(o){return!_s(o)}function _s(o){return Qn(o)||o===null}function gt(o,e){if(!o)throw new Error(e?`Unexpected type, expected '${e}'`:\"Unexpected type\")}function M_(o){if(_s(o))throw new Error(\"Assertion Failed: argument is undefined or null\");return o}function E0(o){return typeof o==\"function\"}function o6(o,e){const t=Math.min(o.length,e.length);for(let i=0;i<t;i++)r6(o[i],e[i])}function r6(o,e){if(ts(e)){if(typeof o!==e)throw new Error(`argument does not match constraint: typeof ${e}`)}else if(E0(e)){try{if(o instanceof e)return}catch(t){}if(!_s(o)&&o.constructor===e||e.length===1&&e.call(void 0,o)===!0)return;throw new Error(\"argument does not match one of these constraints: arg instanceof constraint, arg.constructor === constraint, nor constraint(arg) === true\")}}function a6(o){let e=[],t=Object.getPrototypeOf(o);for(;Object.prototype!==t;)e=e.concat(Object.getOwnPropertyNames(t)),t=Object.getPrototypeOf(t);return e}function Px(o){const e=[];for(const t of a6(o))typeof o[t]==\"function\"&&e.push(t);return e}function l6(o,e){const t=n=>function(){const s=Array.prototype.slice.call(arguments,0);return e(n,s)},i={};for(const n of o)i[n]=t(n);return i}function Na(o){return o===null?void 0:o}function wC(o,e=\"Unreachable\"){throw new Error(e)}const Fx={clipboard:{writeText:Uo||document.queryCommandSupported&&document.queryCommandSupported(\"copy\")||!!(navigator&&navigator.clipboard&&navigator.clipboard.writeText),readText:Uo||!!(navigator&&navigator.clipboard&&navigator.clipboard.readText)},keyboard:(()=>Uo||Ox()?0:navigator.keyboard||Qa?1:2)(),touch:\"ontouchstart\"in window||navigator.maxTouchPoints>0,pointerEvents:window.PointerEvent&&(\"ontouchstart\"in window||window.navigator.maxTouchPoints>0||navigator.maxTouchPoints>0)};class Bx{constructor(){this._keyCodeToStr=[],this._strToKeyCode=Object.create(null)}define(e,t){this._keyCodeToStr[e]=t,this._strToKeyCode[t.toLowerCase()]=e}keyCodeToStr(e){return this._keyCodeToStr[e]}strToKeyCode(e){return this._strToKeyCode[e.toLowerCase()]||0}}const Xb=new Bx,py=new Bx,my=new Bx,wO=new Array(230),c6=Object.create(null),d6=Object.create(null),Wx=[];for(let o=0;o<=193;o++)Wx[o]=-1;(function(){const o=\"\",e=[[0,1,0,\"None\",0,\"unknown\",0,\"VK_UNKNOWN\",o,o],[0,1,1,\"Hyper\",0,o,0,o,o,o],[0,1,2,\"Super\",0,o,0,o,o,o],[0,1,3,\"Fn\",0,o,0,o,o,o],[0,1,4,\"FnLock\",0,o,0,o,o,o],[0,1,5,\"Suspend\",0,o,0,o,o,o],[0,1,6,\"Resume\",0,o,0,o,o,o],[0,1,7,\"Turbo\",0,o,0,o,o,o],[0,1,8,\"Sleep\",0,o,0,\"VK_SLEEP\",o,o],[0,1,9,\"WakeUp\",0,o,0,o,o,o],[31,0,10,\"KeyA\",31,\"A\",65,\"VK_A\",o,o],[32,0,11,\"KeyB\",32,\"B\",66,\"VK_B\",o,o],[33,0,12,\"KeyC\",33,\"C\",67,\"VK_C\",o,o],[34,0,13,\"KeyD\",34,\"D\",68,\"VK_D\",o,o],[35,0,14,\"KeyE\",35,\"E\",69,\"VK_E\",o,o],[36,0,15,\"KeyF\",36,\"F\",70,\"VK_F\",o,o],[37,0,16,\"KeyG\",37,\"G\",71,\"VK_G\",o,o],[38,0,17,\"KeyH\",38,\"H\",72,\"VK_H\",o,o],[39,0,18,\"KeyI\",39,\"I\",73,\"VK_I\",o,o],[40,0,19,\"KeyJ\",40,\"J\",74,\"VK_J\",o,o],[41,0,20,\"KeyK\",41,\"K\",75,\"VK_K\",o,o],[42,0,21,\"KeyL\",42,\"L\",76,\"VK_L\",o,o],[43,0,22,\"KeyM\",43,\"M\",77,\"VK_M\",o,o],[44,0,23,\"KeyN\",44,\"N\",78,\"VK_N\",o,o],[45,0,24,\"KeyO\",45,\"O\",79,\"VK_O\",o,o],[46,0,25,\"KeyP\",46,\"P\",80,\"VK_P\",o,o],[47,0,26,\"KeyQ\",47,\"Q\",81,\"VK_Q\",o,o],[48,0,27,\"KeyR\",48,\"R\",82,\"VK_R\",o,o],[49,0,28,\"KeyS\",49,\"S\",83,\"VK_S\",o,o],[50,0,29,\"KeyT\",50,\"T\",84,\"VK_T\",o,o],[51,0,30,\"KeyU\",51,\"U\",85,\"VK_U\",o,o],[52,0,31,\"KeyV\",52,\"V\",86,\"VK_V\",o,o],[53,0,32,\"KeyW\",53,\"W\",87,\"VK_W\",o,o],[54,0,33,\"KeyX\",54,\"X\",88,\"VK_X\",o,o],[55,0,34,\"KeyY\",55,\"Y\",89,\"VK_Y\",o,o],[56,0,35,\"KeyZ\",56,\"Z\",90,\"VK_Z\",o,o],[22,0,36,\"Digit1\",22,\"1\",49,\"VK_1\",o,o],[23,0,37,\"Digit2\",23,\"2\",50,\"VK_2\",o,o],[24,0,38,\"Digit3\",24,\"3\",51,\"VK_3\",o,o],[25,0,39,\"Digit4\",25,\"4\",52,\"VK_4\",o,o],[26,0,40,\"Digit5\",26,\"5\",53,\"VK_5\",o,o],[27,0,41,\"Digit6\",27,\"6\",54,\"VK_6\",o,o],[28,0,42,\"Digit7\",28,\"7\",55,\"VK_7\",o,o],[29,0,43,\"Digit8\",29,\"8\",56,\"VK_8\",o,o],[30,0,44,\"Digit9\",30,\"9\",57,\"VK_9\",o,o],[21,0,45,\"Digit0\",21,\"0\",48,\"VK_0\",o,o],[3,1,46,\"Enter\",3,\"Enter\",13,\"VK_RETURN\",o,o],[9,1,47,\"Escape\",9,\"Escape\",27,\"VK_ESCAPE\",o,o],[1,1,48,\"Backspace\",1,\"Backspace\",8,\"VK_BACK\",o,o],[2,1,49,\"Tab\",2,\"Tab\",9,\"VK_TAB\",o,o],[10,1,50,\"Space\",10,\"Space\",32,\"VK_SPACE\",o,o],[83,0,51,\"Minus\",83,\"-\",189,\"VK_OEM_MINUS\",\"-\",\"OEM_MINUS\"],[81,0,52,\"Equal\",81,\"=\",187,\"VK_OEM_PLUS\",\"=\",\"OEM_PLUS\"],[87,0,53,\"BracketLeft\",87,\"[\",219,\"VK_OEM_4\",\"[\",\"OEM_4\"],[89,0,54,\"BracketRight\",89,\"]\",221,\"VK_OEM_6\",\"]\",\"OEM_6\"],[88,0,55,\"Backslash\",88,\"\\\\\",220,\"VK_OEM_5\",\"\\\\\",\"OEM_5\"],[0,0,56,\"IntlHash\",0,o,0,o,o,o],[80,0,57,\"Semicolon\",80,\";\",186,\"VK_OEM_1\",\";\",\"OEM_1\"],[90,0,58,\"Quote\",90,\"'\",222,\"VK_OEM_7\",\"'\",\"OEM_7\"],[86,0,59,\"Backquote\",86,\"`\",192,\"VK_OEM_3\",\"`\",\"OEM_3\"],[82,0,60,\"Comma\",82,\",\",188,\"VK_OEM_COMMA\",\",\",\"OEM_COMMA\"],[84,0,61,\"Period\",84,\".\",190,\"VK_OEM_PERIOD\",\".\",\"OEM_PERIOD\"],[85,0,62,\"Slash\",85,\"/\",191,\"VK_OEM_2\",\"/\",\"OEM_2\"],[8,1,63,\"CapsLock\",8,\"CapsLock\",20,\"VK_CAPITAL\",o,o],[59,1,64,\"F1\",59,\"F1\",112,\"VK_F1\",o,o],[60,1,65,\"F2\",60,\"F2\",113,\"VK_F2\",o,o],[61,1,66,\"F3\",61,\"F3\",114,\"VK_F3\",o,o],[62,1,67,\"F4\",62,\"F4\",115,\"VK_F4\",o,o],[63,1,68,\"F5\",63,\"F5\",116,\"VK_F5\",o,o],[64,1,69,\"F6\",64,\"F6\",117,\"VK_F6\",o,o],[65,1,70,\"F7\",65,\"F7\",118,\"VK_F7\",o,o],[66,1,71,\"F8\",66,\"F8\",119,\"VK_F8\",o,o],[67,1,72,\"F9\",67,\"F9\",120,\"VK_F9\",o,o],[68,1,73,\"F10\",68,\"F10\",121,\"VK_F10\",o,o],[69,1,74,\"F11\",69,\"F11\",122,\"VK_F11\",o,o],[70,1,75,\"F12\",70,\"F12\",123,\"VK_F12\",o,o],[0,1,76,\"PrintScreen\",0,o,0,o,o,o],[79,1,77,\"ScrollLock\",79,\"ScrollLock\",145,\"VK_SCROLL\",o,o],[7,1,78,\"Pause\",7,\"PauseBreak\",19,\"VK_PAUSE\",o,o],[19,1,79,\"Insert\",19,\"Insert\",45,\"VK_INSERT\",o,o],[14,1,80,\"Home\",14,\"Home\",36,\"VK_HOME\",o,o],[11,1,81,\"PageUp\",11,\"PageUp\",33,\"VK_PRIOR\",o,o],[20,1,82,\"Delete\",20,\"Delete\",46,\"VK_DELETE\",o,o],[13,1,83,\"End\",13,\"End\",35,\"VK_END\",o,o],[12,1,84,\"PageDown\",12,\"PageDown\",34,\"VK_NEXT\",o,o],[17,1,85,\"ArrowRight\",17,\"RightArrow\",39,\"VK_RIGHT\",\"Right\",o],[15,1,86,\"ArrowLeft\",15,\"LeftArrow\",37,\"VK_LEFT\",\"Left\",o],[18,1,87,\"ArrowDown\",18,\"DownArrow\",40,\"VK_DOWN\",\"Down\",o],[16,1,88,\"ArrowUp\",16,\"UpArrow\",38,\"VK_UP\",\"Up\",o],[78,1,89,\"NumLock\",78,\"NumLock\",144,\"VK_NUMLOCK\",o,o],[108,1,90,\"NumpadDivide\",108,\"NumPad_Divide\",111,\"VK_DIVIDE\",o,o],[103,1,91,\"NumpadMultiply\",103,\"NumPad_Multiply\",106,\"VK_MULTIPLY\",o,o],[106,1,92,\"NumpadSubtract\",106,\"NumPad_Subtract\",109,\"VK_SUBTRACT\",o,o],[104,1,93,\"NumpadAdd\",104,\"NumPad_Add\",107,\"VK_ADD\",o,o],[3,1,94,\"NumpadEnter\",3,o,0,o,o,o],[94,1,95,\"Numpad1\",94,\"NumPad1\",97,\"VK_NUMPAD1\",o,o],[95,1,96,\"Numpad2\",95,\"NumPad2\",98,\"VK_NUMPAD2\",o,o],[96,1,97,\"Numpad3\",96,\"NumPad3\",99,\"VK_NUMPAD3\",o,o],[97,1,98,\"Numpad4\",97,\"NumPad4\",100,\"VK_NUMPAD4\",o,o],[98,1,99,\"Numpad5\",98,\"NumPad5\",101,\"VK_NUMPAD5\",o,o],[99,1,100,\"Numpad6\",99,\"NumPad6\",102,\"VK_NUMPAD6\",o,o],[100,1,101,\"Numpad7\",100,\"NumPad7\",103,\"VK_NUMPAD7\",o,o],[101,1,102,\"Numpad8\",101,\"NumPad8\",104,\"VK_NUMPAD8\",o,o],[102,1,103,\"Numpad9\",102,\"NumPad9\",105,\"VK_NUMPAD9\",o,o],[93,1,104,\"Numpad0\",93,\"NumPad0\",96,\"VK_NUMPAD0\",o,o],[107,1,105,\"NumpadDecimal\",107,\"NumPad_Decimal\",110,\"VK_DECIMAL\",o,o],[92,0,106,\"IntlBackslash\",92,\"OEM_102\",226,\"VK_OEM_102\",o,o],[58,1,107,\"ContextMenu\",58,\"ContextMenu\",93,o,o,o],[0,1,108,\"Power\",0,o,0,o,o,o],[0,1,109,\"NumpadEqual\",0,o,0,o,o,o],[71,1,110,\"F13\",71,\"F13\",124,\"VK_F13\",o,o],[72,1,111,\"F14\",72,\"F14\",125,\"VK_F14\",o,o],[73,1,112,\"F15\",73,\"F15\",126,\"VK_F15\",o,o],[74,1,113,\"F16\",74,\"F16\",127,\"VK_F16\",o,o],[75,1,114,\"F17\",75,\"F17\",128,\"VK_F17\",o,o],[76,1,115,\"F18\",76,\"F18\",129,\"VK_F18\",o,o],[77,1,116,\"F19\",77,\"F19\",130,\"VK_F19\",o,o],[0,1,117,\"F20\",0,o,0,\"VK_F20\",o,o],[0,1,118,\"F21\",0,o,0,\"VK_F21\",o,o],[0,1,119,\"F22\",0,o,0,\"VK_F22\",o,o],[0,1,120,\"F23\",0,o,0,\"VK_F23\",o,o],[0,1,121,\"F24\",0,o,0,\"VK_F24\",o,o],[0,1,122,\"Open\",0,o,0,o,o,o],[0,1,123,\"Help\",0,o,0,o,o,o],[0,1,124,\"Select\",0,o,0,o,o,o],[0,1,125,\"Again\",0,o,0,o,o,o],[0,1,126,\"Undo\",0,o,0,o,o,o],[0,1,127,\"Cut\",0,o,0,o,o,o],[0,1,128,\"Copy\",0,o,0,o,o,o],[0,1,129,\"Paste\",0,o,0,o,o,o],[0,1,130,\"Find\",0,o,0,o,o,o],[0,1,131,\"AudioVolumeMute\",112,\"AudioVolumeMute\",173,\"VK_VOLUME_MUTE\",o,o],[0,1,132,\"AudioVolumeUp\",113,\"AudioVolumeUp\",175,\"VK_VOLUME_UP\",o,o],[0,1,133,\"AudioVolumeDown\",114,\"AudioVolumeDown\",174,\"VK_VOLUME_DOWN\",o,o],[105,1,134,\"NumpadComma\",105,\"NumPad_Separator\",108,\"VK_SEPARATOR\",o,o],[110,0,135,\"IntlRo\",110,\"ABNT_C1\",193,\"VK_ABNT_C1\",o,o],[0,1,136,\"KanaMode\",0,o,0,o,o,o],[0,0,137,\"IntlYen\",0,o,0,o,o,o],[0,1,138,\"Convert\",0,o,0,o,o,o],[0,1,139,\"NonConvert\",0,o,0,o,o,o],[0,1,140,\"Lang1\",0,o,0,o,o,o],[0,1,141,\"Lang2\",0,o,0,o,o,o],[0,1,142,\"Lang3\",0,o,0,o,o,o],[0,1,143,\"Lang4\",0,o,0,o,o,o],[0,1,144,\"Lang5\",0,o,0,o,o,o],[0,1,145,\"Abort\",0,o,0,o,o,o],[0,1,146,\"Props\",0,o,0,o,o,o],[0,1,147,\"NumpadParenLeft\",0,o,0,o,o,o],[0,1,148,\"NumpadParenRight\",0,o,0,o,o,o],[0,1,149,\"NumpadBackspace\",0,o,0,o,o,o],[0,1,150,\"NumpadMemoryStore\",0,o,0,o,o,o],[0,1,151,\"NumpadMemoryRecall\",0,o,0,o,o,o],[0,1,152,\"NumpadMemoryClear\",0,o,0,o,o,o],[0,1,153,\"NumpadMemoryAdd\",0,o,0,o,o,o],[0,1,154,\"NumpadMemorySubtract\",0,o,0,o,o,o],[0,1,155,\"NumpadClear\",126,\"Clear\",12,\"VK_CLEAR\",o,o],[0,1,156,\"NumpadClearEntry\",0,o,0,o,o,o],[5,1,0,o,5,\"Ctrl\",17,\"VK_CONTROL\",o,o],[4,1,0,o,4,\"Shift\",16,\"VK_SHIFT\",o,o],[6,1,0,o,6,\"Alt\",18,\"VK_MENU\",o,o],[57,1,0,o,57,\"Meta\",0,\"VK_COMMAND\",o,o],[5,1,157,\"ControlLeft\",5,o,0,\"VK_LCONTROL\",o,o],[4,1,158,\"ShiftLeft\",4,o,0,\"VK_LSHIFT\",o,o],[6,1,159,\"AltLeft\",6,o,0,\"VK_LMENU\",o,o],[57,1,160,\"MetaLeft\",57,o,0,\"VK_LWIN\",o,o],[5,1,161,\"ControlRight\",5,o,0,\"VK_RCONTROL\",o,o],[4,1,162,\"ShiftRight\",4,o,0,\"VK_RSHIFT\",o,o],[6,1,163,\"AltRight\",6,o,0,\"VK_RMENU\",o,o],[57,1,164,\"MetaRight\",57,o,0,\"VK_RWIN\",o,o],[0,1,165,\"BrightnessUp\",0,o,0,o,o,o],[0,1,166,\"BrightnessDown\",0,o,0,o,o,o],[0,1,167,\"MediaPlay\",0,o,0,o,o,o],[0,1,168,\"MediaRecord\",0,o,0,o,o,o],[0,1,169,\"MediaFastForward\",0,o,0,o,o,o],[0,1,170,\"MediaRewind\",0,o,0,o,o,o],[114,1,171,\"MediaTrackNext\",119,\"MediaTrackNext\",176,\"VK_MEDIA_NEXT_TRACK\",o,o],[115,1,172,\"MediaTrackPrevious\",120,\"MediaTrackPrevious\",177,\"VK_MEDIA_PREV_TRACK\",o,o],[116,1,173,\"MediaStop\",121,\"MediaStop\",178,\"VK_MEDIA_STOP\",o,o],[0,1,174,\"Eject\",0,o,0,o,o,o],[117,1,175,\"MediaPlayPause\",122,\"MediaPlayPause\",179,\"VK_MEDIA_PLAY_PAUSE\",o,o],[0,1,176,\"MediaSelect\",123,\"LaunchMediaPlayer\",181,\"VK_MEDIA_LAUNCH_MEDIA_SELECT\",o,o],[0,1,177,\"LaunchMail\",124,\"LaunchMail\",180,\"VK_MEDIA_LAUNCH_MAIL\",o,o],[0,1,178,\"LaunchApp2\",125,\"LaunchApp2\",183,\"VK_MEDIA_LAUNCH_APP2\",o,o],[0,1,179,\"LaunchApp1\",0,o,0,\"VK_MEDIA_LAUNCH_APP1\",o,o],[0,1,180,\"SelectTask\",0,o,0,o,o,o],[0,1,181,\"LaunchScreenSaver\",0,o,0,o,o,o],[0,1,182,\"BrowserSearch\",115,\"BrowserSearch\",170,\"VK_BROWSER_SEARCH\",o,o],[0,1,183,\"BrowserHome\",116,\"BrowserHome\",172,\"VK_BROWSER_HOME\",o,o],[112,1,184,\"BrowserBack\",117,\"BrowserBack\",166,\"VK_BROWSER_BACK\",o,o],[113,1,185,\"BrowserForward\",118,\"BrowserForward\",167,\"VK_BROWSER_FORWARD\",o,o],[0,1,186,\"BrowserStop\",0,o,0,\"VK_BROWSER_STOP\",o,o],[0,1,187,\"BrowserRefresh\",0,o,0,\"VK_BROWSER_REFRESH\",o,o],[0,1,188,\"BrowserFavorites\",0,o,0,\"VK_BROWSER_FAVORITES\",o,o],[0,1,189,\"ZoomToggle\",0,o,0,o,o,o],[0,1,190,\"MailReply\",0,o,0,o,o,o],[0,1,191,\"MailForward\",0,o,0,o,o,o],[0,1,192,\"MailSend\",0,o,0,o,o,o],[109,1,0,o,109,\"KeyInComposition\",229,o,o,o],[111,1,0,o,111,\"ABNT_C2\",194,\"VK_ABNT_C2\",o,o],[91,1,0,o,91,\"OEM_8\",223,\"VK_OEM_8\",o,o],[0,1,0,o,0,o,0,\"VK_KANA\",o,o],[0,1,0,o,0,o,0,\"VK_HANGUL\",o,o],[0,1,0,o,0,o,0,\"VK_JUNJA\",o,o],[0,1,0,o,0,o,0,\"VK_FINAL\",o,o],[0,1,0,o,0,o,0,\"VK_HANJA\",o,o],[0,1,0,o,0,o,0,\"VK_KANJI\",o,o],[0,1,0,o,0,o,0,\"VK_CONVERT\",o,o],[0,1,0,o,0,o,0,\"VK_NONCONVERT\",o,o],[0,1,0,o,0,o,0,\"VK_ACCEPT\",o,o],[0,1,0,o,0,o,0,\"VK_MODECHANGE\",o,o],[0,1,0,o,0,o,0,\"VK_SELECT\",o,o],[0,1,0,o,0,o,0,\"VK_PRINT\",o,o],[0,1,0,o,0,o,0,\"VK_EXECUTE\",o,o],[0,1,0,o,0,o,0,\"VK_SNAPSHOT\",o,o],[0,1,0,o,0,o,0,\"VK_HELP\",o,o],[0,1,0,o,0,o,0,\"VK_APPS\",o,o],[0,1,0,o,0,o,0,\"VK_PROCESSKEY\",o,o],[0,1,0,o,0,o,0,\"VK_PACKET\",o,o],[0,1,0,o,0,o,0,\"VK_DBE_SBCSCHAR\",o,o],[0,1,0,o,0,o,0,\"VK_DBE_DBCSCHAR\",o,o],[0,1,0,o,0,o,0,\"VK_ATTN\",o,o],[0,1,0,o,0,o,0,\"VK_CRSEL\",o,o],[0,1,0,o,0,o,0,\"VK_EXSEL\",o,o],[0,1,0,o,0,o,0,\"VK_EREOF\",o,o],[0,1,0,o,0,o,0,\"VK_PLAY\",o,o],[0,1,0,o,0,o,0,\"VK_ZOOM\",o,o],[0,1,0,o,0,o,0,\"VK_NONAME\",o,o],[0,1,0,o,0,o,0,\"VK_PA1\",o,o],[0,1,0,o,0,o,0,\"VK_OEM_CLEAR\",o,o]],t=[],i=[];for(const n of e){const[s,r,a,l,c,d,h,u,g,f]=n;if(i[a]||(i[a]=!0,c6[l]=a,d6[l.toLowerCase()]=a,r&&(Wx[a]=c)),!t[c]){if(t[c]=!0,!d)throw new Error(`String representation missing for key code ${c} around scan code ${l}`);Xb.define(c,d),py.define(c,g||d),my.define(c,f||g||d)}h&&(wO[h]=c)}})();var sd;(function(o){function e(a){return Xb.keyCodeToStr(a)}o.toString=e;function t(a){return Xb.strToKeyCode(a)}o.fromString=t;function i(a){return py.keyCodeToStr(a)}o.toUserSettingsUS=i;function n(a){return my.keyCodeToStr(a)}o.toUserSettingsGeneral=n;function s(a){return py.strToKeyCode(a)||my.strToKeyCode(a)}o.fromUserSettings=s;function r(a){if(a>=93&&a<=108)return null;switch(a){case 16:return\"Up\";case 18:return\"Down\";case 15:return\"Left\";case 17:return\"Right\"}return Xb.keyCodeToStr(a)}o.toElectronAccelerator=r})(sd||(sd={}));function vi(o,e){const t=(e&65535)<<16>>>0;return(o|t)>>>0}function _y(o,e){if(o===0)return null;const t=(o&65535)>>>0,i=(o&4294901760)>>>16;return i!==0?new N0([uw(t,e),uw(i,e)]):new N0([uw(t,e)])}function uw(o,e){const t=!!(o&2048),i=!!(o&256),n=e===2?i:t,s=!!(o&1024),r=!!(o&512),a=e===2?t:i,l=o&255;return new Td(n,s,r,a,l)}class Td{constructor(e,t,i,n,s){this.ctrlKey=e,this.shiftKey=t,this.altKey=i,this.metaKey=n,this.keyCode=s}equals(e){return this.ctrlKey===e.ctrlKey&&this.shiftKey===e.shiftKey&&this.altKey===e.altKey&&this.metaKey===e.metaKey&&this.keyCode===e.keyCode}isModifierKey(){return this.keyCode===0||this.keyCode===5||this.keyCode===57||this.keyCode===6||this.keyCode===4}toChord(){return new N0([this])}isDuplicateModifierCase(){return this.ctrlKey&&this.keyCode===5||this.shiftKey&&this.keyCode===4||this.altKey&&this.keyCode===6||this.metaKey&&this.keyCode===57}}class N0{constructor(e){if(e.length===0)throw zo(\"parts\");this.parts=e}}class h6{constructor(e,t,i,n,s,r){this.ctrlKey=e,this.shiftKey=t,this.altKey=i,this.metaKey=n,this.keyLabel=s,this.keyAriaLabel=r}}class u6{}function g6(o){if(o.charCode){const t=String.fromCharCode(o.charCode).toUpperCase();return sd.fromString(t)}const e=o.keyCode;if(e===3)return 7;if(Ls){if(e===59)return 80;if(e===107)return 81;if(e===109)return 83;if(Ze&&e===224)return 57}else if($l){if(e===91)return 57;if(Ze&&e===93)return 57;if(!Ze&&e===92)return 57}return wO[e]||0}const f6=Ze?256:2048,p6=512,m6=1024,_6=Ze?2048:256;class Mt{constructor(e){this._standardKeyboardEventBrand=!0;const t=e;this.browserEvent=t,this.target=t.target,this.ctrlKey=t.ctrlKey,this.shiftKey=t.shiftKey,this.altKey=t.altKey,this.metaKey=t.metaKey,this.keyCode=g6(t),this.code=t.code,this.ctrlKey=this.ctrlKey||this.keyCode===5,this.altKey=this.altKey||this.keyCode===6,this.shiftKey=this.shiftKey||this.keyCode===4,this.metaKey=this.metaKey||this.keyCode===57,this._asKeybinding=this._computeKeybinding(),this._asRuntimeKeybinding=this._computeRuntimeKeybinding()}preventDefault(){this.browserEvent&&this.browserEvent.preventDefault&&this.browserEvent.preventDefault()}stopPropagation(){this.browserEvent&&this.browserEvent.stopPropagation&&this.browserEvent.stopPropagation()}toKeybinding(){return this._asRuntimeKeybinding}equals(e){return this._asKeybinding===e}_computeKeybinding(){let e=0;this.keyCode!==5&&this.keyCode!==4&&this.keyCode!==6&&this.keyCode!==57&&(e=this.keyCode);let t=0;return this.ctrlKey&&(t|=f6),this.altKey&&(t|=p6),this.shiftKey&&(t|=m6),this.metaKey&&(t|=_6),t|=e,t}_computeRuntimeKeybinding(){let e=0;return this.keyCode!==5&&this.keyCode!==4&&this.keyCode!==6&&this.keyCode!==57&&(e=this.keyCode),new Td(this.ctrlKey,this.shiftKey,this.altKey,this.metaKey,e)}}let QN=!1,af=null;function b6(o){if(!o.parent||o.parent===o)return null;try{const e=o.location,t=o.parent.location;if(e.origin!==\"null\"&&t.origin!==\"null\"&&e.origin!==t.origin)return QN=!0,null}catch(e){return QN=!0,null}return o.parent}class v6{static getSameOriginWindowChain(){if(!af){af=[];let e=window,t;do t=b6(e),t?af.push({window:e,iframeElement:e.frameElement||null}):af.push({window:e,iframeElement:null}),e=t;while(e)}return af.slice(0)}static getPositionOfChildWindowRelativeToAncestorWindow(e,t){if(!t||e===t)return{top:0,left:0};let i=0,n=0;const s=this.getSameOriginWindowChain();for(const r of s){if(i+=r.window.scrollY,n+=r.window.scrollX,r.window===t||!r.iframeElement)break;const a=r.iframeElement.getBoundingClientRect();i+=a.top,n+=a.left}return{top:i,left:n}}}class Ir{constructor(e){this.timestamp=Date.now(),this.browserEvent=e,this.leftButton=e.button===0,this.middleButton=e.button===1,this.rightButton=e.button===2,this.buttons=e.buttons,this.target=e.target,this.detail=e.detail||1,e.type===\"dblclick\"&&(this.detail=2),this.ctrlKey=e.ctrlKey,this.shiftKey=e.shiftKey,this.altKey=e.altKey,this.metaKey=e.metaKey,typeof e.pageX==\"number\"?(this.posx=e.pageX,this.posy=e.pageY):(this.posx=e.clientX+document.body.scrollLeft+document.documentElement.scrollLeft,this.posy=e.clientY+document.body.scrollTop+document.documentElement.scrollTop);const t=v6.getPositionOfChildWindowRelativeToAncestorWindow(self,e.view);this.posx-=t.left,this.posy-=t.top}preventDefault(){this.browserEvent.preventDefault()}stopPropagation(){this.browserEvent.stopPropagation()}}class Qu{constructor(e,t=0,i=0){if(this.browserEvent=e||null,this.target=e?e.target||e.targetNode||e.srcElement:null,this.deltaY=i,this.deltaX=t,e){const n=e,s=e;if(typeof n.wheelDeltaY!=\"undefined\")this.deltaY=n.wheelDeltaY/120;else if(typeof s.VERTICAL_AXIS!=\"undefined\"&&s.axis===s.VERTICAL_AXIS)this.deltaY=-s.detail/3;else if(e.type===\"wheel\"){const r=e;r.deltaMode===r.DOM_DELTA_LINE?Ls&&!Ze?this.deltaY=-e.deltaY/3:this.deltaY=-e.deltaY:this.deltaY=-e.deltaY/40}if(typeof n.wheelDeltaX!=\"undefined\")Qa&&nn?this.deltaX=-(n.wheelDeltaX/120):this.deltaX=n.wheelDeltaX/120;else if(typeof s.HORIZONTAL_AXIS!=\"undefined\"&&s.axis===s.HORIZONTAL_AXIS)this.deltaX=-e.detail/3;else if(e.type===\"wheel\"){const r=e;r.deltaMode===r.DOM_DELTA_LINE?Ls&&!Ze?this.deltaX=-e.deltaX/3:this.deltaX=-e.deltaX:this.deltaX=-e.deltaX/40}this.deltaY===0&&this.deltaX===0&&e.wheelDelta&&(this.deltaY=e.wheelDelta/120)}}preventDefault(){this.browserEvent&&this.browserEvent.preventDefault()}stopPropagation(){this.browserEvent&&this.browserEvent.stopPropagation()}}/*! @license DOMPurify 2.3.1 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/2.3.1/LICENSE */function C6(o){if(Array.isArray(o)){for(var e=0,t=Array(o.length);e<o.length;e++)t[e]=o[e];return t}else return Array.from(o)}var w6=Object.hasOwnProperty,JN=Object.setPrototypeOf,S6=Object.isFrozen,y6=Object.getPrototypeOf,L6=Object.getOwnPropertyDescriptor,os=Object.freeze,Ja=Object.seal,D6=Object.create,SO=typeof Reflect!=\"undefined\"&&Reflect,T0=SO.apply,by=SO.construct;T0||(T0=function(e,t,i){return e.apply(t,i)});os||(os=function(e){return e});Ja||(Ja=function(e){return e});by||(by=function(e,t){return new(Function.prototype.bind.apply(e,[null].concat(C6(t))))});var k6=qo(Array.prototype.forEach),eT=qo(Array.prototype.pop),lf=qo(Array.prototype.push),$c=qo(String.prototype.toLowerCase),tT=qo(String.prototype.match),fl=qo(String.prototype.replace),x6=qo(String.prototype.indexOf),I6=qo(String.prototype.trim),aa=qo(RegExp.prototype.test),iT=E6(TypeError);function qo(o){return function(e){for(var t=arguments.length,i=Array(t>1?t-1:0),n=1;n<t;n++)i[n-1]=arguments[n];return T0(o,e,i)}}function E6(o){return function(){for(var e=arguments.length,t=Array(e),i=0;i<e;i++)t[i]=arguments[i];return by(o,t)}}function ht(o,e){JN&&JN(o,null);for(var t=e.length;t--;){var i=e[t];if(typeof i==\"string\"){var n=$c(i);n!==i&&(S6(e)||(e[t]=n),i=n)}o[i]=!0}return o}function Fc(o){var e=D6(null),t=void 0;for(t in o)T0(w6,o,[t])&&(e[t]=o[t]);return e}function A_(o,e){for(;o!==null;){var t=L6(o,e);if(t){if(t.get)return qo(t.get);if(typeof t.value==\"function\")return qo(t.value)}o=y6(o)}function i(n){return console.warn(\"fallback value for\",n),null}return i}var nT=os([\"a\",\"abbr\",\"acronym\",\"address\",\"area\",\"article\",\"aside\",\"audio\",\"b\",\"bdi\",\"bdo\",\"big\",\"blink\",\"blockquote\",\"body\",\"br\",\"button\",\"canvas\",\"caption\",\"center\",\"cite\",\"code\",\"col\",\"colgroup\",\"content\",\"data\",\"datalist\",\"dd\",\"decorator\",\"del\",\"details\",\"dfn\",\"dialog\",\"dir\",\"div\",\"dl\",\"dt\",\"element\",\"em\",\"fieldset\",\"figcaption\",\"figure\",\"font\",\"footer\",\"form\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"head\",\"header\",\"hgroup\",\"hr\",\"html\",\"i\",\"img\",\"input\",\"ins\",\"kbd\",\"label\",\"legend\",\"li\",\"main\",\"map\",\"mark\",\"marquee\",\"menu\",\"menuitem\",\"meter\",\"nav\",\"nobr\",\"ol\",\"optgroup\",\"option\",\"output\",\"p\",\"picture\",\"pre\",\"progress\",\"q\",\"rp\",\"rt\",\"ruby\",\"s\",\"samp\",\"section\",\"select\",\"shadow\",\"small\",\"source\",\"spacer\",\"span\",\"strike\",\"strong\",\"style\",\"sub\",\"summary\",\"sup\",\"table\",\"tbody\",\"td\",\"template\",\"textarea\",\"tfoot\",\"th\",\"thead\",\"time\",\"tr\",\"track\",\"tt\",\"u\",\"ul\",\"var\",\"video\",\"wbr\"]),gw=os([\"svg\",\"a\",\"altglyph\",\"altglyphdef\",\"altglyphitem\",\"animatecolor\",\"animatemotion\",\"animatetransform\",\"circle\",\"clippath\",\"defs\",\"desc\",\"ellipse\",\"filter\",\"font\",\"g\",\"glyph\",\"glyphref\",\"hkern\",\"image\",\"line\",\"lineargradient\",\"marker\",\"mask\",\"metadata\",\"mpath\",\"path\",\"pattern\",\"polygon\",\"polyline\",\"radialgradient\",\"rect\",\"stop\",\"style\",\"switch\",\"symbol\",\"text\",\"textpath\",\"title\",\"tref\",\"tspan\",\"view\",\"vkern\"]),fw=os([\"feBlend\",\"feColorMatrix\",\"feComponentTransfer\",\"feComposite\",\"feConvolveMatrix\",\"feDiffuseLighting\",\"feDisplacementMap\",\"feDistantLight\",\"feFlood\",\"feFuncA\",\"feFuncB\",\"feFuncG\",\"feFuncR\",\"feGaussianBlur\",\"feMerge\",\"feMergeNode\",\"feMorphology\",\"feOffset\",\"fePointLight\",\"feSpecularLighting\",\"feSpotLight\",\"feTile\",\"feTurbulence\"]),N6=os([\"animate\",\"color-profile\",\"cursor\",\"discard\",\"fedropshadow\",\"feimage\",\"font-face\",\"font-face-format\",\"font-face-name\",\"font-face-src\",\"font-face-uri\",\"foreignobject\",\"hatch\",\"hatchpath\",\"mesh\",\"meshgradient\",\"meshpatch\",\"meshrow\",\"missing-glyph\",\"script\",\"set\",\"solidcolor\",\"unknown\",\"use\"]),pw=os([\"math\",\"menclose\",\"merror\",\"mfenced\",\"mfrac\",\"mglyph\",\"mi\",\"mlabeledtr\",\"mmultiscripts\",\"mn\",\"mo\",\"mover\",\"mpadded\",\"mphantom\",\"mroot\",\"mrow\",\"ms\",\"mspace\",\"msqrt\",\"mstyle\",\"msub\",\"msup\",\"msubsup\",\"mtable\",\"mtd\",\"mtext\",\"mtr\",\"munder\",\"munderover\"]),T6=os([\"maction\",\"maligngroup\",\"malignmark\",\"mlongdiv\",\"mscarries\",\"mscarry\",\"msgroup\",\"mstack\",\"msline\",\"msrow\",\"semantics\",\"annotation\",\"annotation-xml\",\"mprescripts\",\"none\"]),sT=os([\"#text\"]),oT=os([\"accept\",\"action\",\"align\",\"alt\",\"autocapitalize\",\"autocomplete\",\"autopictureinpicture\",\"autoplay\",\"background\",\"bgcolor\",\"border\",\"capture\",\"cellpadding\",\"cellspacing\",\"checked\",\"cite\",\"class\",\"clear\",\"color\",\"cols\",\"colspan\",\"controls\",\"controlslist\",\"coords\",\"crossorigin\",\"datetime\",\"decoding\",\"default\",\"dir\",\"disabled\",\"disablepictureinpicture\",\"disableremoteplayback\",\"download\",\"draggable\",\"enctype\",\"enterkeyhint\",\"face\",\"for\",\"headers\",\"height\",\"hidden\",\"high\",\"href\",\"hreflang\",\"id\",\"inputmode\",\"integrity\",\"ismap\",\"kind\",\"label\",\"lang\",\"list\",\"loading\",\"loop\",\"low\",\"max\",\"maxlength\",\"media\",\"method\",\"min\",\"minlength\",\"multiple\",\"muted\",\"name\",\"noshade\",\"novalidate\",\"nowrap\",\"open\",\"optimum\",\"pattern\",\"placeholder\",\"playsinline\",\"poster\",\"preload\",\"pubdate\",\"radiogroup\",\"readonly\",\"rel\",\"required\",\"rev\",\"reversed\",\"role\",\"rows\",\"rowspan\",\"spellcheck\",\"scope\",\"selected\",\"shape\",\"size\",\"sizes\",\"span\",\"srclang\",\"start\",\"src\",\"srcset\",\"step\",\"style\",\"summary\",\"tabindex\",\"title\",\"translate\",\"type\",\"usemap\",\"valign\",\"value\",\"width\",\"xmlns\",\"slot\"]),mw=os([\"accent-height\",\"accumulate\",\"additive\",\"alignment-baseline\",\"ascent\",\"attributename\",\"attributetype\",\"azimuth\",\"basefrequency\",\"baseline-shift\",\"begin\",\"bias\",\"by\",\"class\",\"clip\",\"clippathunits\",\"clip-path\",\"clip-rule\",\"color\",\"color-interpolation\",\"color-interpolation-filters\",\"color-profile\",\"color-rendering\",\"cx\",\"cy\",\"d\",\"dx\",\"dy\",\"diffuseconstant\",\"direction\",\"display\",\"divisor\",\"dur\",\"edgemode\",\"elevation\",\"end\",\"fill\",\"fill-opacity\",\"fill-rule\",\"filter\",\"filterunits\",\"flood-color\",\"flood-opacity\",\"font-family\",\"font-size\",\"font-size-adjust\",\"font-stretch\",\"font-style\",\"font-variant\",\"font-weight\",\"fx\",\"fy\",\"g1\",\"g2\",\"glyph-name\",\"glyphref\",\"gradientunits\",\"gradienttransform\",\"height\",\"href\",\"id\",\"image-rendering\",\"in\",\"in2\",\"k\",\"k1\",\"k2\",\"k3\",\"k4\",\"kerning\",\"keypoints\",\"keysplines\",\"keytimes\",\"lang\",\"lengthadjust\",\"letter-spacing\",\"kernelmatrix\",\"kernelunitlength\",\"lighting-color\",\"local\",\"marker-end\",\"marker-mid\",\"marker-start\",\"markerheight\",\"markerunits\",\"markerwidth\",\"maskcontentunits\",\"maskunits\",\"max\",\"mask\",\"media\",\"method\",\"mode\",\"min\",\"name\",\"numoctaves\",\"offset\",\"operator\",\"opacity\",\"order\",\"orient\",\"orientation\",\"origin\",\"overflow\",\"paint-order\",\"path\",\"pathlength\",\"patterncontentunits\",\"patterntransform\",\"patternunits\",\"points\",\"preservealpha\",\"preserveaspectratio\",\"primitiveunits\",\"r\",\"rx\",\"ry\",\"radius\",\"refx\",\"refy\",\"repeatcount\",\"repeatdur\",\"restart\",\"result\",\"rotate\",\"scale\",\"seed\",\"shape-rendering\",\"specularconstant\",\"specularexponent\",\"spreadmethod\",\"startoffset\",\"stddeviation\",\"stitchtiles\",\"stop-color\",\"stop-opacity\",\"stroke-dasharray\",\"stroke-dashoffset\",\"stroke-linecap\",\"stroke-linejoin\",\"stroke-miterlimit\",\"stroke-opacity\",\"stroke\",\"stroke-width\",\"style\",\"surfacescale\",\"systemlanguage\",\"tabindex\",\"targetx\",\"targety\",\"transform\",\"text-anchor\",\"text-decoration\",\"text-rendering\",\"textlength\",\"type\",\"u1\",\"u2\",\"unicode\",\"values\",\"viewbox\",\"visibility\",\"version\",\"vert-adv-y\",\"vert-origin-x\",\"vert-origin-y\",\"width\",\"word-spacing\",\"wrap\",\"writing-mode\",\"xchannelselector\",\"ychannelselector\",\"x\",\"x1\",\"x2\",\"xmlns\",\"y\",\"y1\",\"y2\",\"z\",\"zoomandpan\"]),rT=os([\"accent\",\"accentunder\",\"align\",\"bevelled\",\"close\",\"columnsalign\",\"columnlines\",\"columnspan\",\"denomalign\",\"depth\",\"dir\",\"display\",\"displaystyle\",\"encoding\",\"fence\",\"frame\",\"height\",\"href\",\"id\",\"largeop\",\"length\",\"linethickness\",\"lspace\",\"lquote\",\"mathbackground\",\"mathcolor\",\"mathsize\",\"mathvariant\",\"maxsize\",\"minsize\",\"movablelimits\",\"notation\",\"numalign\",\"open\",\"rowalign\",\"rowlines\",\"rowspacing\",\"rowspan\",\"rspace\",\"rquote\",\"scriptlevel\",\"scriptminsize\",\"scriptsizemultiplier\",\"selection\",\"separator\",\"separators\",\"stretchy\",\"subscriptshift\",\"supscriptshift\",\"symmetric\",\"voffset\",\"width\",\"xmlns\"]),R_=os([\"xlink:href\",\"xml:id\",\"xlink:title\",\"xml:space\",\"xmlns:xlink\"]),M6=Ja(/\\{\\{[\\s\\S]*|[\\s\\S]*\\}\\}/gm),A6=Ja(/<%[\\s\\S]*|[\\s\\S]*%>/gm),R6=Ja(/^data-[\\-\\w.\\u00B7-\\uFFFF]/),O6=Ja(/^aria-[\\-\\w]+$/),P6=Ja(/^(?:(?:(?:f|ht)tps?|mailto|tel|callto|cid|xmpp):|[^a-z]|[a-z+.\\-]+(?:[^a-z+.\\-:]|$))/i),F6=Ja(/^(?:\\w+script|data):/i),B6=Ja(/[\\u0000-\\u0020\\u00A0\\u1680\\u180E\\u2000-\\u2029\\u205F\\u3000]/g),Af=typeof Symbol==\"function\"&&typeof Symbol.iterator==\"symbol\"?function(o){return typeof o}:function(o){return o&&typeof Symbol==\"function\"&&o.constructor===Symbol&&o!==Symbol.prototype?\"symbol\":typeof o};function ar(o){if(Array.isArray(o)){for(var e=0,t=Array(o.length);e<o.length;e++)t[e]=o[e];return t}else return Array.from(o)}var W6=function(){return typeof window==\"undefined\"?null:window},V6=function(e,t){if((typeof e==\"undefined\"?\"undefined\":Af(e))!==\"object\"||typeof e.createPolicy!=\"function\")return null;var i=null,n=\"data-tt-policy-suffix\";t.currentScript&&t.currentScript.hasAttribute(n)&&(i=t.currentScript.getAttribute(n));var s=\"dompurify\"+(i?\"#\"+i:\"\");try{return e.createPolicy(s,{createHTML:function(a){return a}})}catch(r){return console.warn(\"TrustedTypes policy \"+s+\" could not be created.\"),null}};function yO(){var o=arguments.length>0&&arguments[0]!==void 0?arguments[0]:W6(),e=function(K){return yO(K)};if(e.version=\"2.3.1\",e.removed=[],!o||!o.document||o.document.nodeType!==9)return e.isSupported=!1,e;var t=o.document,i=o.document,n=o.DocumentFragment,s=o.HTMLTemplateElement,r=o.Node,a=o.Element,l=o.NodeFilter,c=o.NamedNodeMap,d=c===void 0?o.NamedNodeMap||o.MozNamedAttrMap:c,h=o.Text,u=o.Comment,g=o.DOMParser,f=o.trustedTypes,_=a.prototype,b=A_(_,\"cloneNode\"),v=A_(_,\"nextSibling\"),C=A_(_,\"childNodes\"),w=A_(_,\"parentNode\");if(typeof s==\"function\"){var S=i.createElement(\"template\");S.content&&S.content.ownerDocument&&(i=S.content.ownerDocument)}var k=V6(f,t),x=k&&Eh?k.createHTML(\"\"):\"\",y=i,D=y.implementation,I=y.createNodeIterator,R=y.createDocumentFragment,P=y.getElementsByTagName,H=t.importNode,$={};try{$=Fc(i).documentMode?i.documentMode:{}}catch(Ve){}var ne={};e.isSupported=typeof w==\"function\"&&D&&typeof D.createHTMLDocument!=\"undefined\"&&$!==9;var ae=M6,de=A6,we=R6,Se=O6,Me=F6,St=B6,mt=P6,_e=null,ge=ht({},[].concat(ar(nT),ar(gw),ar(fw),ar(pw),ar(sT))),It=null,Ri=ht({},[].concat(ar(oT),ar(mw),ar(rT),ar(R_))),Dn=null,Lo=null,sa=!0,Do=!0,or=!1,Oe=!1,hl=!1,nf=!1,sf=!1,ul=!1,Ih=!1,L_=!0,Eh=!1,D_=!0,Z=!0,U=!1,j={},E=null,M=ht({},[\"annotation-xml\",\"audio\",\"colgroup\",\"desc\",\"foreignobject\",\"head\",\"iframe\",\"math\",\"mi\",\"mn\",\"mo\",\"ms\",\"mtext\",\"noembed\",\"noframes\",\"noscript\",\"plaintext\",\"script\",\"style\",\"svg\",\"template\",\"thead\",\"title\",\"video\",\"xmp\"]),V=null,F=ht({},[\"audio\",\"video\",\"img\",\"source\",\"image\",\"track\"]),Y=null,ie=ht({},[\"alt\",\"class\",\"for\",\"id\",\"label\",\"name\",\"pattern\",\"placeholder\",\"role\",\"summary\",\"title\",\"value\",\"style\",\"xmlns\"]),ye=\"http://www.w3.org/1998/Math/MathML\",ve=\"http://www.w3.org/2000/svg\",Fe=\"http://www.w3.org/1999/xhtml\",Pe=Fe,Ct=!1,at=null,De=i.createElement(\"form\"),pi=function(K){at&&at===K||((!K||(typeof K==\"undefined\"?\"undefined\":Af(K))!==\"object\")&&(K={}),K=Fc(K),_e=\"ALLOWED_TAGS\"in K?ht({},K.ALLOWED_TAGS):ge,It=\"ALLOWED_ATTR\"in K?ht({},K.ALLOWED_ATTR):Ri,Y=\"ADD_URI_SAFE_ATTR\"in K?ht(Fc(ie),K.ADD_URI_SAFE_ATTR):ie,V=\"ADD_DATA_URI_TAGS\"in K?ht(Fc(F),K.ADD_DATA_URI_TAGS):F,E=\"FORBID_CONTENTS\"in K?ht({},K.FORBID_CONTENTS):M,Dn=\"FORBID_TAGS\"in K?ht({},K.FORBID_TAGS):{},Lo=\"FORBID_ATTR\"in K?ht({},K.FORBID_ATTR):{},j=\"USE_PROFILES\"in K?K.USE_PROFILES:!1,sa=K.ALLOW_ARIA_ATTR!==!1,Do=K.ALLOW_DATA_ATTR!==!1,or=K.ALLOW_UNKNOWN_PROTOCOLS||!1,Oe=K.SAFE_FOR_TEMPLATES||!1,hl=K.WHOLE_DOCUMENT||!1,ul=K.RETURN_DOM||!1,Ih=K.RETURN_DOM_FRAGMENT||!1,L_=K.RETURN_DOM_IMPORT!==!1,Eh=K.RETURN_TRUSTED_TYPE||!1,sf=K.FORCE_BODY||!1,D_=K.SANITIZE_DOM!==!1,Z=K.KEEP_CONTENT!==!1,U=K.IN_PLACE||!1,mt=K.ALLOWED_URI_REGEXP||mt,Pe=K.NAMESPACE||Fe,Oe&&(Do=!1),Ih&&(ul=!0),j&&(_e=ht({},[].concat(ar(sT))),It=[],j.html===!0&&(ht(_e,nT),ht(It,oT)),j.svg===!0&&(ht(_e,gw),ht(It,mw),ht(It,R_)),j.svgFilters===!0&&(ht(_e,fw),ht(It,mw),ht(It,R_)),j.mathMl===!0&&(ht(_e,pw),ht(It,rT),ht(It,R_))),K.ADD_TAGS&&(_e===ge&&(_e=Fc(_e)),ht(_e,K.ADD_TAGS)),K.ADD_ATTR&&(It===Ri&&(It=Fc(It)),ht(It,K.ADD_ATTR)),K.ADD_URI_SAFE_ATTR&&ht(Y,K.ADD_URI_SAFE_ATTR),K.FORBID_CONTENTS&&(E===M&&(E=Fc(E)),ht(E,K.FORBID_CONTENTS)),Z&&(_e[\"#text\"]=!0),hl&&ht(_e,[\"html\",\"head\",\"body\"]),_e.table&&(ht(_e,[\"tbody\"]),delete Dn.tbody),os&&os(K),at=K)},Gt=ht({},[\"mi\",\"mo\",\"mn\",\"ms\",\"mtext\"]),Ns=ht({},[\"foreignobject\",\"desc\",\"title\",\"annotation-xml\"]),zt=ht({},gw);ht(zt,fw),ht(zt,N6);var Oi=ht({},pw);ht(Oi,T6);var Rc=function(K){var be=w(K);(!be||!be.tagName)&&(be={namespaceURI:Fe,tagName:\"template\"});var Te=$c(K.tagName),Ut=$c(be.tagName);if(K.namespaceURI===ve)return be.namespaceURI===Fe?Te===\"svg\":be.namespaceURI===ye?Te===\"svg\"&&(Ut===\"annotation-xml\"||Gt[Ut]):Boolean(zt[Te]);if(K.namespaceURI===ye)return be.namespaceURI===Fe?Te===\"math\":be.namespaceURI===ve?Te===\"math\"&&Ns[Ut]:Boolean(Oi[Te]);if(K.namespaceURI===Fe){if(be.namespaceURI===ve&&!Ns[Ut]||be.namespaceURI===ye&&!Gt[Ut])return!1;var kn=ht({},[\"title\",\"style\",\"font\",\"a\",\"script\"]);return!Oi[Te]&&(kn[Te]||!zt[Te])}return!1},ds=function(K){lf(e.removed,{element:K});try{K.parentNode.removeChild(K)}catch(be){try{K.outerHTML=x}catch(Te){K.remove()}}},rr=function(K,be){try{lf(e.removed,{attribute:be.getAttributeNode(K),from:be})}catch(Te){lf(e.removed,{attribute:null,from:be})}if(be.removeAttribute(K),K===\"is\"&&!It[K])if(ul||Ih)try{ds(be)}catch(Te){}else try{be.setAttribute(K,\"\")}catch(Te){}},oa=function(K){var be=void 0,Te=void 0;if(sf)K=\"<remove></remove>\"+K;else{var Ut=tT(K,/^[\\r\\n\\t ]+/);Te=Ut&&Ut[0]}var kn=k?k.createHTML(K):K;if(Pe===Fe)try{be=new g().parseFromString(kn,\"text/html\")}catch(In){}if(!be||!be.documentElement){be=D.createDocument(Pe,\"template\",null);try{be.documentElement.innerHTML=Ct?\"\":kn}catch(In){}}var xn=be.body||be.documentElement;return K&&Te&&xn.insertBefore(i.createTextNode(Te),xn.childNodes[0]||null),Pe===Fe?P.call(be,hl?\"html\":\"body\")[0]:hl?be.documentElement:xn},Oc=function(K){return I.call(K.ownerDocument||K,K,l.SHOW_ELEMENT|l.SHOW_COMMENT|l.SHOW_TEXT,null,!1)},gl=function(K){return K instanceof h||K instanceof u?!1:typeof K.nodeName!=\"string\"||typeof K.textContent!=\"string\"||typeof K.removeChild!=\"function\"||!(K.attributes instanceof d)||typeof K.removeAttribute!=\"function\"||typeof K.setAttribute!=\"function\"||typeof K.namespaceURI!=\"string\"||typeof K.insertBefore!=\"function\"},Pc=function(K){return(typeof r==\"undefined\"?\"undefined\":Af(r))===\"object\"?K instanceof r:K&&(typeof K==\"undefined\"?\"undefined\":Af(K))===\"object\"&&typeof K.nodeType==\"number\"&&typeof K.nodeName==\"string\"},to=function(K,be,Te){!ne[K]||k6(ne[K],function(Ut){Ut.call(e,be,Te,at)})},k_=function(K){var be=void 0;if(to(\"beforeSanitizeElements\",K,null),gl(K)||tT(K.nodeName,/[\\u0080-\\uFFFF]/))return ds(K),!0;var Te=$c(K.nodeName);if(to(\"uponSanitizeElement\",K,{tagName:Te,allowedTags:_e}),!Pc(K.firstElementChild)&&(!Pc(K.content)||!Pc(K.content.firstElementChild))&&aa(/<[/\\w]/g,K.innerHTML)&&aa(/<[/\\w]/g,K.textContent)||Te===\"select\"&&aa(/<template/i,K.innerHTML))return ds(K),!0;if(!_e[Te]||Dn[Te]){if(Z&&!E[Te]){var Ut=w(K)||K.parentNode,kn=C(K)||K.childNodes;if(kn&&Ut)for(var xn=kn.length,In=xn-1;In>=0;--In)Ut.insertBefore(b(kn[In],!0),v(K))}return ds(K),!0}return K instanceof a&&!Rc(K)||(Te===\"noscript\"||Te===\"noembed\")&&aa(/<\\/no(script|embed)/i,K.innerHTML)?(ds(K),!0):(Oe&&K.nodeType===3&&(be=K.textContent,be=fl(be,ae,\" \"),be=fl(be,de,\" \"),K.textContent!==be&&(lf(e.removed,{element:K.cloneNode()}),K.textContent=be)),to(\"afterSanitizeElements\",K,null),!1)},of=function(K,be,Te){if(D_&&(be===\"id\"||be===\"name\")&&(Te in i||Te in De))return!1;if(!(Do&&!Lo[be]&&aa(we,be))){if(!(sa&&aa(Se,be))){if(!It[be]||Lo[be])return!1;if(!Y[be]){if(!aa(mt,fl(Te,St,\"\"))){if(!((be===\"src\"||be===\"xlink:href\"||be===\"href\")&&K!==\"script\"&&x6(Te,\"data:\")===0&&V[K])){if(!(or&&!aa(Me,fl(Te,St,\"\")))){if(Te)return!1}}}}}}return!0},x_=function(K){var be=void 0,Te=void 0,Ut=void 0,kn=void 0;to(\"beforeSanitizeAttributes\",K,null);var xn=K.attributes;if(!!xn){var In={attrName:\"\",attrValue:\"\",keepAttr:!0,allowedAttributes:It};for(kn=xn.length;kn--;){be=xn[kn];var ra=be,rf=ra.name,WN=ra.namespaceURI;if(Te=I6(be.value),Ut=$c(rf),In.attrName=Ut,In.attrValue=Te,In.keepAttr=!0,In.forceKeepAttr=void 0,to(\"uponSanitizeAttribute\",K,In),Te=In.attrValue,!In.forceKeepAttr&&(rr(rf,K),!!In.keepAttr)){if(aa(/\\/>/i,Te)){rr(rf,K);continue}Oe&&(Te=fl(Te,ae,\" \"),Te=fl(Te,de,\" \"));var C9=K.nodeName.toLowerCase();if(!!of(C9,Ut,Te))try{WN?K.setAttributeNS(WN,rf,Te):K.setAttribute(rf,Te),eT(e.removed)}catch(mhe){}}}to(\"afterSanitizeAttributes\",K,null)}},v9=function Ve(K){var be=void 0,Te=Oc(K);for(to(\"beforeSanitizeShadowDOM\",K,null);be=Te.nextNode();)to(\"uponSanitizeShadowNode\",be,null),!k_(be)&&(be.content instanceof n&&Ve(be.content),x_(be));to(\"afterSanitizeShadowDOM\",K,null)};return e.sanitize=function(Ve,K){var be=void 0,Te=void 0,Ut=void 0,kn=void 0,xn=void 0;if(Ct=!Ve,Ct&&(Ve=\"<!-->\"),typeof Ve!=\"string\"&&!Pc(Ve)){if(typeof Ve.toString!=\"function\")throw iT(\"toString is not a function\");if(Ve=Ve.toString(),typeof Ve!=\"string\")throw iT(\"dirty is not a string, aborting\")}if(!e.isSupported){if(Af(o.toStaticHTML)===\"object\"||typeof o.toStaticHTML==\"function\"){if(typeof Ve==\"string\")return o.toStaticHTML(Ve);if(Pc(Ve))return o.toStaticHTML(Ve.outerHTML)}return Ve}if(nf||pi(K),e.removed=[],typeof Ve==\"string\"&&(U=!1),!U)if(Ve instanceof r)be=oa(\"<!---->\"),Te=be.ownerDocument.importNode(Ve,!0),Te.nodeType===1&&Te.nodeName===\"BODY\"||Te.nodeName===\"HTML\"?be=Te:be.appendChild(Te);else{if(!ul&&!Oe&&!hl&&Ve.indexOf(\"<\")===-1)return k&&Eh?k.createHTML(Ve):Ve;if(be=oa(Ve),!be)return ul?null:x}be&&sf&&ds(be.firstChild);for(var In=Oc(U?Ve:be);Ut=In.nextNode();)Ut.nodeType===3&&Ut===kn||k_(Ut)||(Ut.content instanceof n&&v9(Ut.content),x_(Ut),kn=Ut);if(kn=null,U)return Ve;if(ul){if(Ih)for(xn=R.call(be.ownerDocument);be.firstChild;)xn.appendChild(be.firstChild);else xn=be;return L_&&(xn=H.call(t,xn,!0)),xn}var ra=hl?be.outerHTML:be.innerHTML;return Oe&&(ra=fl(ra,ae,\" \"),ra=fl(ra,de,\" \")),k&&Eh?k.createHTML(ra):ra},e.setConfig=function(Ve){pi(Ve),nf=!0},e.clearConfig=function(){at=null,nf=!1},e.isValidAttribute=function(Ve,K,be){at||pi({});var Te=$c(Ve),Ut=$c(K);return of(Te,Ut,be)},e.addHook=function(Ve,K){typeof K==\"function\"&&(ne[Ve]=ne[Ve]||[],lf(ne[Ve],K))},e.removeHook=function(Ve){ne[Ve]&&eT(ne[Ve])},e.removeHooks=function(Ve){ne[Ve]&&(ne[Ve]=[])},e.removeAllHooks=function(){ne={}},e}var Qr=yO();Qr.version;Qr.isSupported;const H6=Qr.sanitize;Qr.setConfig;Qr.clearConfig;Qr.isValidAttribute;const LO=Qr.addHook,DO=Qr.removeHook;Qr.removeHooks;Qr.removeAllHooks;let ku;if(typeof ei.vscode!=\"undefined\"&&typeof ei.vscode.process!=\"undefined\"){const o=ei.vscode.process;ku={get platform(){return o.platform},get arch(){return o.arch},get env(){return o.env},cwd(){return o.cwd()}}}else typeof process!=\"undefined\"?ku={get platform(){return process.platform},get arch(){return process.arch},get env(){return process.env},cwd(){return process.env.VSCODE_CWD||process.cwd()}}:ku={get platform(){return nn?\"win32\":Ze?\"darwin\":\"linux\"},get arch(){},get env(){return{}},cwd(){return\"/\"}};const vy=ku.cwd,z6=ku.env,uh=ku.platform,U6=65,$6=97,j6=90,K6=122,jl=46,ln=47,gs=92,pl=58,q6=63;class kO extends Error{constructor(e,t,i){let n;typeof t==\"string\"&&t.indexOf(\"not \")===0?(n=\"must not be\",t=t.replace(/^not /,\"\")):n=\"must be\";const s=e.indexOf(\".\")!==-1?\"property\":\"argument\";let r=`The \"${e}\" ${s} ${n} of type ${t}`;r+=`. Received type ${typeof i}`,super(r),this.code=\"ERR_INVALID_ARG_TYPE\"}}function Di(o,e){if(typeof o!=\"string\")throw new kO(e,\"string\",o)}function lt(o){return o===ln||o===gs}function Cy(o){return o===ln}function ml(o){return o>=U6&&o<=j6||o>=$6&&o<=K6}function M0(o,e,t,i){let n=\"\",s=0,r=-1,a=0,l=0;for(let c=0;c<=o.length;++c){if(c<o.length)l=o.charCodeAt(c);else{if(i(l))break;l=ln}if(i(l)){if(!(r===c-1||a===1))if(a===2){if(n.length<2||s!==2||n.charCodeAt(n.length-1)!==jl||n.charCodeAt(n.length-2)!==jl){if(n.length>2){const d=n.lastIndexOf(t);d===-1?(n=\"\",s=0):(n=n.slice(0,d),s=n.length-1-n.lastIndexOf(t)),r=c,a=0;continue}else if(n.length!==0){n=\"\",s=0,r=c,a=0;continue}}e&&(n+=n.length>0?`${t}..`:\"..\",s=2)}else n.length>0?n+=`${t}${o.slice(r+1,c)}`:n=o.slice(r+1,c),s=c-r-1;r=c,a=0}else l===jl&&a!==-1?++a:a=-1}return n}function xO(o,e){if(e===null||typeof e!=\"object\")throw new kO(\"pathObject\",\"Object\",e);const t=e.dir||e.root,i=e.base||`${e.name||\"\"}${e.ext||\"\"}`;return t?t===e.root?`${t}${i}`:`${t}${o}${i}`:i}const Jn={resolve(...o){let e=\"\",t=\"\",i=!1;for(let n=o.length-1;n>=-1;n--){let s;if(n>=0){if(s=o[n],Di(s,\"path\"),s.length===0)continue}else e.length===0?s=vy():(s=z6[`=${e}`]||vy(),(s===void 0||s.slice(0,2).toLowerCase()!==e.toLowerCase()&&s.charCodeAt(2)===gs)&&(s=`${e}\\\\`));const r=s.length;let a=0,l=\"\",c=!1;const d=s.charCodeAt(0);if(r===1)lt(d)&&(a=1,c=!0);else if(lt(d))if(c=!0,lt(s.charCodeAt(1))){let h=2,u=h;for(;h<r&&!lt(s.charCodeAt(h));)h++;if(h<r&&h!==u){const g=s.slice(u,h);for(u=h;h<r&&lt(s.charCodeAt(h));)h++;if(h<r&&h!==u){for(u=h;h<r&&!lt(s.charCodeAt(h));)h++;(h===r||h!==u)&&(l=`\\\\\\\\${g}\\\\${s.slice(u,h)}`,a=h)}}}else a=1;else ml(d)&&s.charCodeAt(1)===pl&&(l=s.slice(0,2),a=2,r>2&&lt(s.charCodeAt(2))&&(c=!0,a=3));if(l.length>0)if(e.length>0){if(l.toLowerCase()!==e.toLowerCase())continue}else e=l;if(i){if(e.length>0)break}else if(t=`${s.slice(a)}\\\\${t}`,i=c,c&&e.length>0)break}return t=M0(t,!i,\"\\\\\",lt),i?`${e}\\\\${t}`:`${e}${t}`||\".\"},normalize(o){Di(o,\"path\");const e=o.length;if(e===0)return\".\";let t=0,i,n=!1;const s=o.charCodeAt(0);if(e===1)return Cy(s)?\"\\\\\":o;if(lt(s))if(n=!0,lt(o.charCodeAt(1))){let a=2,l=a;for(;a<e&&!lt(o.charCodeAt(a));)a++;if(a<e&&a!==l){const c=o.slice(l,a);for(l=a;a<e&&lt(o.charCodeAt(a));)a++;if(a<e&&a!==l){for(l=a;a<e&&!lt(o.charCodeAt(a));)a++;if(a===e)return`\\\\\\\\${c}\\\\${o.slice(l)}\\\\`;a!==l&&(i=`\\\\\\\\${c}\\\\${o.slice(l,a)}`,t=a)}}}else t=1;else ml(s)&&o.charCodeAt(1)===pl&&(i=o.slice(0,2),t=2,e>2&&lt(o.charCodeAt(2))&&(n=!0,t=3));let r=t<e?M0(o.slice(t),!n,\"\\\\\",lt):\"\";return r.length===0&&!n&&(r=\".\"),r.length>0&&lt(o.charCodeAt(e-1))&&(r+=\"\\\\\"),i===void 0?n?`\\\\${r}`:r:n?`${i}\\\\${r}`:`${i}${r}`},isAbsolute(o){Di(o,\"path\");const e=o.length;if(e===0)return!1;const t=o.charCodeAt(0);return lt(t)||e>2&&ml(t)&&o.charCodeAt(1)===pl&&lt(o.charCodeAt(2))},join(...o){if(o.length===0)return\".\";let e,t;for(let s=0;s<o.length;++s){const r=o[s];Di(r,\"path\"),r.length>0&&(e===void 0?e=t=r:e+=`\\\\${r}`)}if(e===void 0)return\".\";let i=!0,n=0;if(typeof t==\"string\"&&lt(t.charCodeAt(0))){++n;const s=t.length;s>1&&lt(t.charCodeAt(1))&&(++n,s>2&&(lt(t.charCodeAt(2))?++n:i=!1))}if(i){for(;n<e.length&&lt(e.charCodeAt(n));)n++;n>=2&&(e=`\\\\${e.slice(n)}`)}return Jn.normalize(e)},relative(o,e){if(Di(o,\"from\"),Di(e,\"to\"),o===e)return\"\";const t=Jn.resolve(o),i=Jn.resolve(e);if(t===i||(o=t.toLowerCase(),e=i.toLowerCase(),o===e))return\"\";let n=0;for(;n<o.length&&o.charCodeAt(n)===gs;)n++;let s=o.length;for(;s-1>n&&o.charCodeAt(s-1)===gs;)s--;const r=s-n;let a=0;for(;a<e.length&&e.charCodeAt(a)===gs;)a++;let l=e.length;for(;l-1>a&&e.charCodeAt(l-1)===gs;)l--;const c=l-a,d=r<c?r:c;let h=-1,u=0;for(;u<d;u++){const f=o.charCodeAt(n+u);if(f!==e.charCodeAt(a+u))break;f===gs&&(h=u)}if(u!==d){if(h===-1)return i}else{if(c>d){if(e.charCodeAt(a+u)===gs)return i.slice(a+u+1);if(u===2)return i.slice(a+u)}r>d&&(o.charCodeAt(n+u)===gs?h=u:u===2&&(h=3)),h===-1&&(h=0)}let g=\"\";for(u=n+h+1;u<=s;++u)(u===s||o.charCodeAt(u)===gs)&&(g+=g.length===0?\"..\":\"\\\\..\");return a+=h,g.length>0?`${g}${i.slice(a,l)}`:(i.charCodeAt(a)===gs&&++a,i.slice(a,l))},toNamespacedPath(o){if(typeof o!=\"string\")return o;if(o.length===0)return\"\";const e=Jn.resolve(o);if(e.length<=2)return o;if(e.charCodeAt(0)===gs){if(e.charCodeAt(1)===gs){const t=e.charCodeAt(2);if(t!==q6&&t!==jl)return`\\\\\\\\?\\\\UNC\\\\${e.slice(2)}`}}else if(ml(e.charCodeAt(0))&&e.charCodeAt(1)===pl&&e.charCodeAt(2)===gs)return`\\\\\\\\?\\\\${e}`;return o},dirname(o){Di(o,\"path\");const e=o.length;if(e===0)return\".\";let t=-1,i=0;const n=o.charCodeAt(0);if(e===1)return lt(n)?o:\".\";if(lt(n)){if(t=i=1,lt(o.charCodeAt(1))){let a=2,l=a;for(;a<e&&!lt(o.charCodeAt(a));)a++;if(a<e&&a!==l){for(l=a;a<e&&lt(o.charCodeAt(a));)a++;if(a<e&&a!==l){for(l=a;a<e&&!lt(o.charCodeAt(a));)a++;if(a===e)return o;a!==l&&(t=i=a+1)}}}}else ml(n)&&o.charCodeAt(1)===pl&&(t=e>2&&lt(o.charCodeAt(2))?3:2,i=t);let s=-1,r=!0;for(let a=e-1;a>=i;--a)if(lt(o.charCodeAt(a))){if(!r){s=a;break}}else r=!1;if(s===-1){if(t===-1)return\".\";s=t}return o.slice(0,s)},basename(o,e){e!==void 0&&Di(e,\"ext\"),Di(o,\"path\");let t=0,i=-1,n=!0,s;if(o.length>=2&&ml(o.charCodeAt(0))&&o.charCodeAt(1)===pl&&(t=2),e!==void 0&&e.length>0&&e.length<=o.length){if(e===o)return\"\";let r=e.length-1,a=-1;for(s=o.length-1;s>=t;--s){const l=o.charCodeAt(s);if(lt(l)){if(!n){t=s+1;break}}else a===-1&&(n=!1,a=s+1),r>=0&&(l===e.charCodeAt(r)?--r===-1&&(i=s):(r=-1,i=a))}return t===i?i=a:i===-1&&(i=o.length),o.slice(t,i)}for(s=o.length-1;s>=t;--s)if(lt(o.charCodeAt(s))){if(!n){t=s+1;break}}else i===-1&&(n=!1,i=s+1);return i===-1?\"\":o.slice(t,i)},extname(o){Di(o,\"path\");let e=0,t=-1,i=0,n=-1,s=!0,r=0;o.length>=2&&o.charCodeAt(1)===pl&&ml(o.charCodeAt(0))&&(e=i=2);for(let a=o.length-1;a>=e;--a){const l=o.charCodeAt(a);if(lt(l)){if(!s){i=a+1;break}continue}n===-1&&(s=!1,n=a+1),l===jl?t===-1?t=a:r!==1&&(r=1):t!==-1&&(r=-1)}return t===-1||n===-1||r===0||r===1&&t===n-1&&t===i+1?\"\":o.slice(t,n)},format:xO.bind(null,\"\\\\\"),parse(o){Di(o,\"path\");const e={root:\"\",dir:\"\",base:\"\",ext:\"\",name:\"\"};if(o.length===0)return e;const t=o.length;let i=0,n=o.charCodeAt(0);if(t===1)return lt(n)?(e.root=e.dir=o,e):(e.base=e.name=o,e);if(lt(n)){if(i=1,lt(o.charCodeAt(1))){let h=2,u=h;for(;h<t&&!lt(o.charCodeAt(h));)h++;if(h<t&&h!==u){for(u=h;h<t&&lt(o.charCodeAt(h));)h++;if(h<t&&h!==u){for(u=h;h<t&&!lt(o.charCodeAt(h));)h++;h===t?i=h:h!==u&&(i=h+1)}}}}else if(ml(n)&&o.charCodeAt(1)===pl){if(t<=2)return e.root=e.dir=o,e;if(i=2,lt(o.charCodeAt(2))){if(t===3)return e.root=e.dir=o,e;i=3}}i>0&&(e.root=o.slice(0,i));let s=-1,r=i,a=-1,l=!0,c=o.length-1,d=0;for(;c>=i;--c){if(n=o.charCodeAt(c),lt(n)){if(!l){r=c+1;break}continue}a===-1&&(l=!1,a=c+1),n===jl?s===-1?s=c:d!==1&&(d=1):s!==-1&&(d=-1)}return a!==-1&&(s===-1||d===0||d===1&&s===a-1&&s===r+1?e.base=e.name=o.slice(r,a):(e.name=o.slice(r,s),e.base=o.slice(r,a),e.ext=o.slice(s,a))),r>0&&r!==i?e.dir=o.slice(0,r-1):e.dir=e.root,e},sep:\"\\\\\",delimiter:\";\",win32:null,posix:null},ai={resolve(...o){let e=\"\",t=!1;for(let i=o.length-1;i>=-1&&!t;i--){const n=i>=0?o[i]:vy();Di(n,\"path\"),n.length!==0&&(e=`${n}/${e}`,t=n.charCodeAt(0)===ln)}return e=M0(e,!t,\"/\",Cy),t?`/${e}`:e.length>0?e:\".\"},normalize(o){if(Di(o,\"path\"),o.length===0)return\".\";const e=o.charCodeAt(0)===ln,t=o.charCodeAt(o.length-1)===ln;return o=M0(o,!e,\"/\",Cy),o.length===0?e?\"/\":t?\"./\":\".\":(t&&(o+=\"/\"),e?`/${o}`:o)},isAbsolute(o){return Di(o,\"path\"),o.length>0&&o.charCodeAt(0)===ln},join(...o){if(o.length===0)return\".\";let e;for(let t=0;t<o.length;++t){const i=o[t];Di(i,\"path\"),i.length>0&&(e===void 0?e=i:e+=`/${i}`)}return e===void 0?\".\":ai.normalize(e)},relative(o,e){if(Di(o,\"from\"),Di(e,\"to\"),o===e||(o=ai.resolve(o),e=ai.resolve(e),o===e))return\"\";const t=1,i=o.length,n=i-t,s=1,r=e.length-s,a=n<r?n:r;let l=-1,c=0;for(;c<a;c++){const h=o.charCodeAt(t+c);if(h!==e.charCodeAt(s+c))break;h===ln&&(l=c)}if(c===a)if(r>a){if(e.charCodeAt(s+c)===ln)return e.slice(s+c+1);if(c===0)return e.slice(s+c)}else n>a&&(o.charCodeAt(t+c)===ln?l=c:c===0&&(l=0));let d=\"\";for(c=t+l+1;c<=i;++c)(c===i||o.charCodeAt(c)===ln)&&(d+=d.length===0?\"..\":\"/..\");return`${d}${e.slice(s+l)}`},toNamespacedPath(o){return o},dirname(o){if(Di(o,\"path\"),o.length===0)return\".\";const e=o.charCodeAt(0)===ln;let t=-1,i=!0;for(let n=o.length-1;n>=1;--n)if(o.charCodeAt(n)===ln){if(!i){t=n;break}}else i=!1;return t===-1?e?\"/\":\".\":e&&t===1?\"//\":o.slice(0,t)},basename(o,e){e!==void 0&&Di(e,\"ext\"),Di(o,\"path\");let t=0,i=-1,n=!0,s;if(e!==void 0&&e.length>0&&e.length<=o.length){if(e===o)return\"\";let r=e.length-1,a=-1;for(s=o.length-1;s>=0;--s){const l=o.charCodeAt(s);if(l===ln){if(!n){t=s+1;break}}else a===-1&&(n=!1,a=s+1),r>=0&&(l===e.charCodeAt(r)?--r===-1&&(i=s):(r=-1,i=a))}return t===i?i=a:i===-1&&(i=o.length),o.slice(t,i)}for(s=o.length-1;s>=0;--s)if(o.charCodeAt(s)===ln){if(!n){t=s+1;break}}else i===-1&&(n=!1,i=s+1);return i===-1?\"\":o.slice(t,i)},extname(o){Di(o,\"path\");let e=-1,t=0,i=-1,n=!0,s=0;for(let r=o.length-1;r>=0;--r){const a=o.charCodeAt(r);if(a===ln){if(!n){t=r+1;break}continue}i===-1&&(n=!1,i=r+1),a===jl?e===-1?e=r:s!==1&&(s=1):e!==-1&&(s=-1)}return e===-1||i===-1||s===0||s===1&&e===i-1&&e===t+1?\"\":o.slice(e,i)},format:xO.bind(null,\"/\"),parse(o){Di(o,\"path\");const e={root:\"\",dir:\"\",base:\"\",ext:\"\",name:\"\"};if(o.length===0)return e;const t=o.charCodeAt(0)===ln;let i;t?(e.root=\"/\",i=1):i=0;let n=-1,s=0,r=-1,a=!0,l=o.length-1,c=0;for(;l>=i;--l){const d=o.charCodeAt(l);if(d===ln){if(!a){s=l+1;break}continue}r===-1&&(a=!1,r=l+1),d===jl?n===-1?n=l:c!==1&&(c=1):n!==-1&&(c=-1)}if(r!==-1){const d=s===0&&t?1:s;n===-1||c===0||c===1&&n===r-1&&n===s+1?e.base=e.name=o.slice(d,r):(e.name=o.slice(d,n),e.base=o.slice(d,r),e.ext=o.slice(n,r))}return s>0?e.dir=o.slice(0,s-1):t&&(e.dir=\"/\"),e},sep:\"/\",delimiter:\":\",win32:null,posix:null};ai.win32=Jn.win32=Jn;ai.posix=Jn.posix=ai;const IO=uh===\"win32\"?Jn.normalize:ai.normalize,G6=uh===\"win32\"?Jn.resolve:ai.resolve,Z6=uh===\"win32\"?Jn.relative:ai.relative,EO=uh===\"win32\"?Jn.dirname:ai.dirname,pd=uh===\"win32\"?Jn.basename:ai.basename,Y6=uh===\"win32\"?Jn.extname:ai.extname,md=uh===\"win32\"?Jn.sep:ai.sep,X6=/^\\w[\\w\\d+.-]*$/,Q6=/^\\//,J6=/^\\/\\//;function aT(o,e){if(!o.scheme&&e)throw new Error(`[UriError]: Scheme is missing: {scheme: \"\", authority: \"${o.authority}\", path: \"${o.path}\", query: \"${o.query}\", fragment: \"${o.fragment}\"}`);if(o.scheme&&!X6.test(o.scheme))throw new Error(\"[UriError]: Scheme contains illegal characters.\");if(o.path){if(o.authority){if(!Q6.test(o.path))throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash (\"/\") character')}else if(J6.test(o.path))throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters (\"//\")')}}function eB(o,e){return!o&&!e?\"file\":o}function tB(o,e){switch(o){case\"https\":case\"http\":case\"file\":e?e[0]!==Ao&&(e=Ao+e):e=Ao;break}return e}const Zt=\"\",Ao=\"/\",iB=/^(([^:/?#]+?):)?(\\/\\/([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?/;class me{constructor(e,t,i,n,s,r=!1){typeof e==\"object\"?(this.scheme=e.scheme||Zt,this.authority=e.authority||Zt,this.path=e.path||Zt,this.query=e.query||Zt,this.fragment=e.fragment||Zt):(this.scheme=eB(e,r),this.authority=t||Zt,this.path=tB(this.scheme,i||Zt),this.query=n||Zt,this.fragment=s||Zt,aT(this,r))}static isUri(e){return e instanceof me?!0:e?typeof e.authority==\"string\"&&typeof e.fragment==\"string\"&&typeof e.path==\"string\"&&typeof e.query==\"string\"&&typeof e.scheme==\"string\"&&typeof e.fsPath==\"string\"&&typeof e.with==\"function\"&&typeof e.toString==\"function\":!1}get fsPath(){return A0(this,!1)}with(e){if(!e)return this;let{scheme:t,authority:i,path:n,query:s,fragment:r}=e;return t===void 0?t=this.scheme:t===null&&(t=Zt),i===void 0?i=this.authority:i===null&&(i=Zt),n===void 0?n=this.path:n===null&&(n=Zt),s===void 0?s=this.query:s===null&&(s=Zt),r===void 0?r=this.fragment:r===null&&(r=Zt),t===this.scheme&&i===this.authority&&n===this.path&&s===this.query&&r===this.fragment?this:new Nh(t,i,n,s,r)}static parse(e,t=!1){const i=iB.exec(e);return i?new Nh(i[2]||Zt,O_(i[4]||Zt),O_(i[5]||Zt),O_(i[7]||Zt),O_(i[9]||Zt),t):new Nh(Zt,Zt,Zt,Zt,Zt)}static file(e){let t=Zt;if(nn&&(e=e.replace(/\\\\/g,Ao)),e[0]===Ao&&e[1]===Ao){const i=e.indexOf(Ao,2);i===-1?(t=e.substring(2),e=Ao):(t=e.substring(2,i),e=e.substring(i)||Ao)}return new Nh(\"file\",t,e,Zt,Zt)}static from(e){const t=new Nh(e.scheme,e.authority,e.path,e.query,e.fragment);return aT(t,!0),t}static joinPath(e,...t){if(!e.path)throw new Error(\"[UriError]: cannot call joinPath on URI without path\");let i;return nn&&e.scheme===\"file\"?i=me.file(Jn.join(A0(e,!0),...t)).path:i=ai.join(e.path,...t),e.with({path:i})}toString(e=!1){return wy(this,e)}toJSON(){return this}static revive(e){if(e){if(e instanceof me)return e;{const t=new Nh(e);return t._formatted=e.external,t._fsPath=e._sep===NO?e.fsPath:null,t}}else return e}}const NO=nn?1:void 0;class Nh extends me{constructor(){super(...arguments),this._formatted=null,this._fsPath=null}get fsPath(){return this._fsPath||(this._fsPath=A0(this,!1)),this._fsPath}toString(e=!1){return e?wy(this,!0):(this._formatted||(this._formatted=wy(this,!1)),this._formatted)}toJSON(){const e={$mid:1};return this._fsPath&&(e.fsPath=this._fsPath,e._sep=NO),this._formatted&&(e.external=this._formatted),this.path&&(e.path=this.path),this.scheme&&(e.scheme=this.scheme),this.authority&&(e.authority=this.authority),this.query&&(e.query=this.query),this.fragment&&(e.fragment=this.fragment),e}}const TO={[58]:\"%3A\",[47]:\"%2F\",[63]:\"%3F\",[35]:\"%23\",[91]:\"%5B\",[93]:\"%5D\",[64]:\"%40\",[33]:\"%21\",[36]:\"%24\",[38]:\"%26\",[39]:\"%27\",[40]:\"%28\",[41]:\"%29\",[42]:\"%2A\",[43]:\"%2B\",[44]:\"%2C\",[59]:\"%3B\",[61]:\"%3D\",[32]:\"%20\"};function lT(o,e){let t,i=-1;for(let n=0;n<o.length;n++){const s=o.charCodeAt(n);if(s>=97&&s<=122||s>=65&&s<=90||s>=48&&s<=57||s===45||s===46||s===95||s===126||e&&s===47)i!==-1&&(t+=encodeURIComponent(o.substring(i,n)),i=-1),t!==void 0&&(t+=o.charAt(n));else{t===void 0&&(t=o.substr(0,n));const r=TO[s];r!==void 0?(i!==-1&&(t+=encodeURIComponent(o.substring(i,n)),i=-1),t+=r):i===-1&&(i=n)}}return i!==-1&&(t+=encodeURIComponent(o.substring(i))),t!==void 0?t:o}function nB(o){let e;for(let t=0;t<o.length;t++){const i=o.charCodeAt(t);i===35||i===63?(e===void 0&&(e=o.substr(0,t)),e+=TO[i]):e!==void 0&&(e+=o[t])}return e!==void 0?e:o}function A0(o,e){let t;return o.authority&&o.path.length>1&&o.scheme===\"file\"?t=`//${o.authority}${o.path}`:o.path.charCodeAt(0)===47&&(o.path.charCodeAt(1)>=65&&o.path.charCodeAt(1)<=90||o.path.charCodeAt(1)>=97&&o.path.charCodeAt(1)<=122)&&o.path.charCodeAt(2)===58?e?t=o.path.substr(1):t=o.path[1].toLowerCase()+o.path.substr(2):t=o.path,nn&&(t=t.replace(/\\//g,\"\\\\\")),t}function wy(o,e){const t=e?nB:lT;let i=\"\",{scheme:n,authority:s,path:r,query:a,fragment:l}=o;if(n&&(i+=n,i+=\":\"),(s||n===\"file\")&&(i+=Ao,i+=Ao),s){let c=s.indexOf(\"@\");if(c!==-1){const d=s.substr(0,c);s=s.substr(c+1),c=d.indexOf(\":\"),c===-1?i+=t(d,!1):(i+=t(d.substr(0,c),!1),i+=\":\",i+=t(d.substr(c+1),!1)),i+=\"@\"}s=s.toLowerCase(),c=s.indexOf(\":\"),c===-1?i+=t(s,!1):(i+=t(s.substr(0,c),!1),i+=s.substr(c))}if(r){if(r.length>=3&&r.charCodeAt(0)===47&&r.charCodeAt(2)===58){const c=r.charCodeAt(1);c>=65&&c<=90&&(r=`/${String.fromCharCode(c+32)}:${r.substr(3)}`)}else if(r.length>=2&&r.charCodeAt(1)===58){const c=r.charCodeAt(0);c>=65&&c<=90&&(r=`${String.fromCharCode(c+32)}:${r.substr(2)}`)}i+=t(r,!0)}return a&&(i+=\"?\",i+=t(a,!1)),l&&(i+=\"#\",i+=e?l:lT(l,!1)),i}function MO(o){try{return decodeURIComponent(o)}catch(e){return o.length>3?o.substr(0,3)+MO(o.substr(3)):o}}const cT=/(%[0-9A-Za-z][0-9A-Za-z])+/g;function O_(o){return o.match(cT)?o.replace(cT,e=>MO(e)):o}var Ne;(function(o){o.inMemory=\"inmemory\",o.vscode=\"vscode\",o.internal=\"private\",o.walkThrough=\"walkThrough\",o.walkThroughSnippet=\"walkThroughSnippet\",o.http=\"http\",o.https=\"https\",o.file=\"file\",o.mailto=\"mailto\",o.untitled=\"untitled\",o.data=\"data\",o.command=\"command\",o.vscodeRemote=\"vscode-remote\",o.vscodeRemoteResource=\"vscode-remote-resource\",o.vscodeUserData=\"vscode-userdata\",o.vscodeCustomEditor=\"vscode-custom-editor\",o.vscodeNotebook=\"vscode-notebook\",o.vscodeNotebookCell=\"vscode-notebook-cell\",o.vscodeNotebookCellMetadata=\"vscode-notebook-cell-metadata\",o.vscodeNotebookCellOutput=\"vscode-notebook-cell-output\",o.vscodeInteractive=\"vscode-interactive\",o.vscodeInteractiveInput=\"vscode-interactive-input\",o.vscodeSettings=\"vscode-settings\",o.vscodeWorkspaceTrust=\"vscode-workspace-trust\",o.vscodeTerminal=\"vscode-terminal\",o.webviewPanel=\"webview-panel\",o.vscodeWebview=\"vscode-webview\",o.extension=\"extension\",o.vscodeFileResource=\"vscode-file\",o.tmp=\"tmp\",o.vsls=\"vsls\",o.vscodeSourceControl=\"vscode-scm\"})(Ne||(Ne={}));const sB=\"tkn\";class oB{constructor(){this._hosts=Object.create(null),this._ports=Object.create(null),this._connectionTokens=Object.create(null),this._preferredWebSchema=\"http\",this._delegate=null,this._remoteResourcesPath=`/${Ne.vscodeRemoteResource}`}setPreferredWebSchema(e){this._preferredWebSchema=e}rewrite(e){if(this._delegate)return this._delegate(e);const t=e.authority;let i=this._hosts[t];i&&i.indexOf(\":\")!==-1&&(i=`[${i}]`);const n=this._ports[t],s=this._connectionTokens[t];let r=`path=${encodeURIComponent(e.path)}`;return typeof s==\"string\"&&(r+=`&${sB}=${encodeURIComponent(s)}`),me.from({scheme:Lc?this._preferredWebSchema:Ne.vscodeRemoteResource,authority:`${i}:${n}`,path:this._remoteResourcesPath,query:r})}}const AO=new oB;class Lp{asBrowserUri(e,t){const i=this.toUri(e,t);return i.scheme===Ne.vscodeRemote?AO.rewrite(i):i.scheme===Ne.file&&(Uo||H8&&ei.origin===`${Ne.vscodeFileResource}://${Lp.FALLBACK_AUTHORITY}`)?i.with({scheme:Ne.vscodeFileResource,authority:i.authority||Lp.FALLBACK_AUTHORITY,query:null,fragment:null}):i}toUri(e,t){return me.isUri(e)?e:me.parse(t.toUrl(e))}}Lp.FALLBACK_AUTHORITY=\"vscode-app\";const RO=new Lp;function Ii(o){for(;o.firstChild;)o.firstChild.remove()}function Vx(o){var e;return(e=o==null?void 0:o.isConnected)!==null&&e!==void 0?e:!1}class OO{constructor(e,t,i,n){this._node=e,this._type=t,this._handler=i,this._options=n||!1,this._node.addEventListener(this._type,this._handler,this._options)}dispose(){!this._handler||(this._node.removeEventListener(this._type,this._handler,this._options),this._node=null,this._handler=null)}}function q(o,e,t,i){return new OO(o,e,t,i)}function PO(o){return function(e){return o(new Ir(e))}}function rB(o){return function(e){return o(new Mt(e))}}const Ei=function(e,t,i,n){let s=i;return t===\"click\"||t===\"mousedown\"?s=PO(i):(t===\"keydown\"||t===\"keypress\"||t===\"keyup\")&&(s=rB(i)),q(e,t,s,n)},aB=function(e,t,i){const n=PO(t);return lB(e,n,i)};function lB(o,e,t){return q(o,Xa&&Fx.pointerEvents?le.POINTER_DOWN:le.MOUSE_DOWN,e,t)}function ko(o,e,t){let i=null;const n=l=>a.fire(l),s=()=>{i||(i=new OO(o,e,n,t))},r=()=>{i&&(i.dispose(),i=null)},a=new O({onFirstListenerAdd:s,onLastListenerRemove:r});return a}let _w=null;function cB(o){if(!_w){const e=t=>setTimeout(()=>t(new Date().getTime()),0);_w=self.requestAnimationFrame||self.msRequestAnimationFrame||self.webkitRequestAnimationFrame||self.mozRequestAnimationFrame||self.oRequestAnimationFrame||e}return _w.call(self,o)}let FO,Go;class bw{constructor(e,t=0){this._runner=e,this.priority=t,this._canceled=!1}dispose(){this._canceled=!0}execute(){if(!this._canceled)try{this._runner()}catch(e){Ee(e)}}static sort(e,t){return t.priority-e.priority}}(function(){let o=[],e=null,t=!1,i=!1;const n=()=>{for(t=!1,e=o,o=[],i=!0;e.length>0;)e.sort(bw.sort),e.shift().execute();i=!1};Go=(s,r=0)=>{const a=new bw(s,r);return o.push(a),t||(t=!0,cB(n)),a},FO=(s,r)=>{if(i){const a=new bw(s,r);return e.push(a),a}else return Go(s,r)}})();function SC(o){return document.defaultView.getComputedStyle(o,null)}function yC(o){if(o!==document.body)return new bt(o.clientWidth,o.clientHeight);if(Xa&&window.visualViewport)return new bt(window.visualViewport.width,window.visualViewport.height);if(window.innerWidth&&window.innerHeight)return new bt(window.innerWidth,window.innerHeight);if(document.body&&document.body.clientWidth&&document.body.clientHeight)return new bt(document.body.clientWidth,document.body.clientHeight);if(document.documentElement&&document.documentElement.clientWidth&&document.documentElement.clientHeight)return new bt(document.documentElement.clientWidth,document.documentElement.clientHeight);throw new Error(\"Unable to figure out browser width and height\")}class Kt{static convertToPixels(e,t){return parseFloat(t)||0}static getDimension(e,t,i){const n=SC(e);let s=\"0\";return n&&(n.getPropertyValue?s=n.getPropertyValue(t):s=n.getAttribute(i)),Kt.convertToPixels(e,s)}static getBorderLeftWidth(e){return Kt.getDimension(e,\"border-left-width\",\"borderLeftWidth\")}static getBorderRightWidth(e){return Kt.getDimension(e,\"border-right-width\",\"borderRightWidth\")}static getBorderTopWidth(e){return Kt.getDimension(e,\"border-top-width\",\"borderTopWidth\")}static getBorderBottomWidth(e){return Kt.getDimension(e,\"border-bottom-width\",\"borderBottomWidth\")}static getPaddingLeft(e){return Kt.getDimension(e,\"padding-left\",\"paddingLeft\")}static getPaddingRight(e){return Kt.getDimension(e,\"padding-right\",\"paddingRight\")}static getPaddingTop(e){return Kt.getDimension(e,\"padding-top\",\"paddingTop\")}static getPaddingBottom(e){return Kt.getDimension(e,\"padding-bottom\",\"paddingBottom\")}static getMarginLeft(e){return Kt.getDimension(e,\"margin-left\",\"marginLeft\")}static getMarginTop(e){return Kt.getDimension(e,\"margin-top\",\"marginTop\")}static getMarginRight(e){return Kt.getDimension(e,\"margin-right\",\"marginRight\")}static getMarginBottom(e){return Kt.getDimension(e,\"margin-bottom\",\"marginBottom\")}}class bt{constructor(e,t){this.width=e,this.height=t}with(e=this.width,t=this.height){return e!==this.width||t!==this.height?new bt(e,t):this}static is(e){return typeof e==\"object\"&&typeof e.height==\"number\"&&typeof e.width==\"number\"}static lift(e){return e instanceof bt?e:new bt(e.width,e.height)}static equals(e,t){return e===t?!0:!e||!t?!1:e.width===t.width&&e.height===t.height}}bt.None=new bt(0,0);function BO(o){let e=o.offsetParent,t=o.offsetTop,i=o.offsetLeft;for(;(o=o.parentNode)!==null&&o!==document.body&&o!==document.documentElement;){t-=o.scrollTop;const n=VO(o)?null:SC(o);n&&(i-=n.direction!==\"rtl\"?o.scrollLeft:-o.scrollLeft),o===e&&(i+=Kt.getBorderLeftWidth(o),t+=Kt.getBorderTopWidth(o),t+=o.offsetTop,i+=o.offsetLeft,e=o.offsetParent)}return{left:i,top:t}}function dB(o,e,t){typeof e==\"number\"&&(o.style.width=`${e}px`),typeof t==\"number\"&&(o.style.height=`${t}px`)}function Qi(o){const e=o.getBoundingClientRect();return{left:e.left+qa.scrollX,top:e.top+qa.scrollY,width:e.width,height:e.height}}function hB(o){let e=o,t=1;do{const i=SC(e).zoom;i!=null&&i!==\"1\"&&(t*=i),e=e.parentElement}while(e!==null&&e!==document.documentElement);return t}const qa=new class{get scrollX(){return typeof window.scrollX==\"number\"?window.scrollX:document.body.scrollLeft+document.documentElement.scrollLeft}get scrollY(){return typeof window.scrollY==\"number\"?window.scrollY:document.body.scrollTop+document.documentElement.scrollTop}};function ro(o){const e=Kt.getMarginLeft(o)+Kt.getMarginRight(o);return o.offsetWidth+e}function vw(o){const e=Kt.getBorderLeftWidth(o)+Kt.getBorderRightWidth(o),t=Kt.getPaddingLeft(o)+Kt.getPaddingRight(o);return o.offsetWidth-e-t}function uB(o){const e=Kt.getBorderTopWidth(o)+Kt.getBorderBottomWidth(o),t=Kt.getPaddingTop(o)+Kt.getPaddingBottom(o);return o.offsetHeight-e-t}function Sy(o){const e=Kt.getMarginTop(o)+Kt.getMarginBottom(o);return o.offsetHeight+e}function Ga(o,e){for(;o;){if(o===e)return!0;o=o.parentNode}return!1}function WO(o,e,t){for(;o&&o.nodeType===o.ELEMENT_NODE;){if(o.classList.contains(e))return o;if(t){if(typeof t==\"string\"){if(o.classList.contains(t))return null}else if(o===t)return null}o=o.parentNode}return null}function Cw(o,e,t){return!!WO(o,e,t)}function VO(o){return o&&!!o.host&&!!o.mode}function Dp(o){return!!Md(o)}function Md(o){for(;o.parentNode;){if(o===document.body)return null;o=o.parentNode}return VO(o)?o:null}function xu(){let o=document.activeElement;for(;o!=null&&o.shadowRoot;)o=o.shadowRoot.activeElement;return o}function qs(o=document.getElementsByTagName(\"head\")[0]){const e=document.createElement(\"style\");return e.type=\"text/css\",e.media=\"screen\",o.appendChild(e),e}let ww=null;function HO(){return ww||(ww=qs()),ww}function gB(o){var e,t;return!((e=o==null?void 0:o.sheet)===null||e===void 0)&&e.rules?o.sheet.rules:!((t=o==null?void 0:o.sheet)===null||t===void 0)&&t.cssRules?o.sheet.cssRules:[]}function yy(o,e,t=HO()){!t||!e||t.sheet.insertRule(o+\"{\"+e+\"}\",0)}function dT(o,e=HO()){if(!e)return;const t=gB(e),i=[];for(let n=0;n<t.length;n++)t[n].selectorText.indexOf(o)!==-1&&i.push(n);for(let n=i.length-1;n>=0;n--)e.sheet.deleteRule(i[n])}function zO(o){return typeof HTMLElement==\"object\"?o instanceof HTMLElement:o&&typeof o==\"object\"&&o.nodeType===1&&typeof o.nodeName==\"string\"}const le={CLICK:\"click\",AUXCLICK:\"auxclick\",DBLCLICK:\"dblclick\",MOUSE_UP:\"mouseup\",MOUSE_DOWN:\"mousedown\",MOUSE_OVER:\"mouseover\",MOUSE_MOVE:\"mousemove\",MOUSE_OUT:\"mouseout\",MOUSE_ENTER:\"mouseenter\",MOUSE_LEAVE:\"mouseleave\",MOUSE_WHEEL:\"wheel\",POINTER_UP:\"pointerup\",POINTER_DOWN:\"pointerdown\",POINTER_MOVE:\"pointermove\",POINTER_LEAVE:\"pointerleave\",CONTEXT_MENU:\"contextmenu\",WHEEL:\"wheel\",KEY_DOWN:\"keydown\",KEY_PRESS:\"keypress\",KEY_UP:\"keyup\",LOAD:\"load\",BEFORE_UNLOAD:\"beforeunload\",UNLOAD:\"unload\",PAGE_SHOW:\"pageshow\",PAGE_HIDE:\"pagehide\",ABORT:\"abort\",ERROR:\"error\",RESIZE:\"resize\",SCROLL:\"scroll\",FULLSCREEN_CHANGE:\"fullscreenchange\",WK_FULLSCREEN_CHANGE:\"webkitfullscreenchange\",SELECT:\"select\",CHANGE:\"change\",SUBMIT:\"submit\",RESET:\"reset\",FOCUS:\"focus\",FOCUS_IN:\"focusin\",FOCUS_OUT:\"focusout\",BLUR:\"blur\",INPUT:\"input\",STORAGE:\"storage\",DRAG_START:\"dragstart\",DRAG:\"drag\",DRAG_ENTER:\"dragenter\",DRAG_LEAVE:\"dragleave\",DRAG_OVER:\"dragover\",DROP:\"drop\",DRAG_END:\"dragend\",ANIMATION_START:$l?\"webkitAnimationStart\":\"animationstart\",ANIMATION_END:$l?\"webkitAnimationEnd\":\"animationend\",ANIMATION_ITERATION:$l?\"webkitAnimationIteration\":\"animationiteration\"},ct={stop:function(o,e){o.preventDefault?o.preventDefault():o.returnValue=!1,e&&(o.stopPropagation?o.stopPropagation():o.cancelBubble=!0)}};function fB(o){const e=[];for(let t=0;o&&o.nodeType===o.ELEMENT_NODE;t++)e[t]=o.scrollTop,o=o.parentNode;return e}function pB(o,e){for(let t=0;o&&o.nodeType===o.ELEMENT_NODE;t++)o.scrollTop!==e[t]&&(o.scrollTop=e[t]),o=o.parentNode}class R0 extends z{constructor(e){super(),this._onDidFocus=this._register(new O),this.onDidFocus=this._onDidFocus.event,this._onDidBlur=this._register(new O),this.onDidBlur=this._onDidBlur.event;let t=R0.hasFocusWithin(e),i=!1;const n=()=>{i=!1,t||(t=!0,this._onDidFocus.fire())},s=()=>{t&&(i=!0,window.setTimeout(()=>{i&&(i=!1,t=!1,this._onDidBlur.fire())},0))};this._refreshStateHandler=()=>{R0.hasFocusWithin(e)!==t&&(t?s():n())},this._register(q(e,le.FOCUS,n,!0)),this._register(q(e,le.BLUR,s,!0)),this._register(q(e,le.FOCUS_IN,()=>this._refreshStateHandler())),this._register(q(e,le.FOCUS_OUT,()=>this._refreshStateHandler()))}static hasFocusWithin(e){const t=Md(e),i=t?t.activeElement:document.activeElement;return Ga(i,e)}}function Ad(o){return new R0(o)}function G(o,...e){if(o.append(...e),e.length===1&&typeof e[0]!=\"string\")return e[0]}function mB(o,e){return o.insertBefore(e,o.firstChild),e}function Rd(o,...e){o.innerText=\"\",G(o,...e)}const _B=/([\\w\\-]+)?(#([\\w\\-]+))?((\\.([\\w\\-]+))*)/;var kp;(function(o){o.HTML=\"http://www.w3.org/1999/xhtml\",o.SVG=\"http://www.w3.org/2000/svg\"})(kp||(kp={}));function UO(o,e,t,...i){const n=_B.exec(e);if(!n)throw new Error(\"Bad use of emmet\");t=Object.assign({},t||{});const s=n[1]||\"div\";let r;return o!==kp.HTML?r=document.createElementNS(o,s):r=document.createElement(s),n[3]&&(r.id=n[3]),n[4]&&(r.className=n[4].replace(/\\./g,\" \").trim()),Object.keys(t).forEach(a=>{const l=t[a];typeof l!=\"undefined\"&&(/^on\\w+$/.test(a)?r[a]=l:a===\"selected\"?l&&r.setAttribute(a,\"true\"):r.setAttribute(a,l))}),r.append(...i),r}function se(o,e,...t){return UO(kp.HTML,o,e,...t)}se.SVG=function(o,e,...t){return UO(kp.SVG,o,e,...t)};function bs(...o){for(const e of o)e.style.display=\"\",e.removeAttribute(\"aria-hidden\")}function An(...o){for(const e of o)e.style.display=\"none\",e.setAttribute(\"aria-hidden\",\"true\")}function bB(o){return Array.prototype.slice.call(document.getElementsByTagName(o),0)}function hT(o){const e=window.devicePixelRatio*o;return Math.max(1,Math.floor(e))/window.devicePixelRatio}function $O(o){window.open(o,\"_blank\",\"noopener\")}function vB(o){const e=()=>{o(),t=Go(e)};let t=Go(e);return ze(()=>t.dispose())}AO.setPreferredWebSchema(/^https:/.test(window.location.href)?\"https\":\"http\");function Od(o){return o?`url('${RO.asBrowserUri(o).toString(!0).replace(/'/g,\"%27\")}')`:\"url('')\"}function uT(o){return`'${o.replace(/'/g,\"%27\")}'`}function CB(o,e=!1){const t=document.createElement(\"a\");return LO(\"afterSanitizeAttributes\",i=>{for(const n of[\"href\",\"src\"])if(i.hasAttribute(n)){const s=i.getAttribute(n);if(n===\"href\"&&s.startsWith(\"#\"))continue;if(t.href=s,!o.includes(t.protocol.replace(/:$/,\"\"))){if(e&&n===\"src\"&&t.href.startsWith(\"data:\"))continue;i.removeAttribute(n)}}}),ze(()=>{DO(\"afterSanitizeAttributes\")})}class Rl extends O{constructor(){super(),this._subscriptions=new ee,this._keyStatus={altKey:!1,shiftKey:!1,ctrlKey:!1,metaKey:!1},this._subscriptions.add(q(window,\"keydown\",e=>{if(e.defaultPrevented)return;const t=new Mt(e);if(!(t.keyCode===6&&e.repeat)){if(e.altKey&&!this._keyStatus.altKey)this._keyStatus.lastKeyPressed=\"alt\";else if(e.ctrlKey&&!this._keyStatus.ctrlKey)this._keyStatus.lastKeyPressed=\"ctrl\";else if(e.metaKey&&!this._keyStatus.metaKey)this._keyStatus.lastKeyPressed=\"meta\";else if(e.shiftKey&&!this._keyStatus.shiftKey)this._keyStatus.lastKeyPressed=\"shift\";else if(t.keyCode!==6)this._keyStatus.lastKeyPressed=void 0;else return;this._keyStatus.altKey=e.altKey,this._keyStatus.ctrlKey=e.ctrlKey,this._keyStatus.metaKey=e.metaKey,this._keyStatus.shiftKey=e.shiftKey,this._keyStatus.lastKeyPressed&&(this._keyStatus.event=e,this.fire(this._keyStatus))}},!0)),this._subscriptions.add(q(window,\"keyup\",e=>{e.defaultPrevented||(!e.altKey&&this._keyStatus.altKey?this._keyStatus.lastKeyReleased=\"alt\":!e.ctrlKey&&this._keyStatus.ctrlKey?this._keyStatus.lastKeyReleased=\"ctrl\":!e.metaKey&&this._keyStatus.metaKey?this._keyStatus.lastKeyReleased=\"meta\":!e.shiftKey&&this._keyStatus.shiftKey?this._keyStatus.lastKeyReleased=\"shift\":this._keyStatus.lastKeyReleased=void 0,this._keyStatus.lastKeyPressed!==this._keyStatus.lastKeyReleased&&(this._keyStatus.lastKeyPressed=void 0),this._keyStatus.altKey=e.altKey,this._keyStatus.ctrlKey=e.ctrlKey,this._keyStatus.metaKey=e.metaKey,this._keyStatus.shiftKey=e.shiftKey,this._keyStatus.lastKeyReleased&&(this._keyStatus.event=e,this.fire(this._keyStatus)))},!0)),this._subscriptions.add(q(document.body,\"mousedown\",()=>{this._keyStatus.lastKeyPressed=void 0},!0)),this._subscriptions.add(q(document.body,\"mouseup\",()=>{this._keyStatus.lastKeyPressed=void 0},!0)),this._subscriptions.add(q(document.body,\"mousemove\",e=>{e.buttons&&(this._keyStatus.lastKeyPressed=void 0)},!0)),this._subscriptions.add(q(window,\"blur\",()=>{this.resetKeyStatus()}))}get keyStatus(){return this._keyStatus}resetKeyStatus(){this.doResetKeyStatus(),this.fire(this._keyStatus)}doResetKeyStatus(){this._keyStatus={altKey:!1,shiftKey:!1,ctrlKey:!1,metaKey:!1}}static getInstance(){return Rl.instance||(Rl.instance=new Rl),Rl.instance}dispose(){super.dispose(),this._subscriptions.dispose()}}class wB extends z{constructor(e,t){super(),this.element=e,this.callbacks=t,this.counter=0,this.dragStartTime=0,this.registerListeners()}registerListeners(){this._register(q(this.element,le.DRAG_ENTER,e=>{this.counter++,this.dragStartTime=e.timeStamp,this.callbacks.onDragEnter(e)})),this._register(q(this.element,le.DRAG_OVER,e=>{var t,i;e.preventDefault(),(i=(t=this.callbacks).onDragOver)===null||i===void 0||i.call(t,e,e.timeStamp-this.dragStartTime)})),this._register(q(this.element,le.DRAG_LEAVE,e=>{this.counter--,this.counter===0&&(this.dragStartTime=0,this.callbacks.onDragLeave(e))})),this._register(q(this.element,le.DRAG_END,e=>{this.counter=0,this.dragStartTime=0,this.callbacks.onDragEnd(e)})),this._register(q(this.element,le.DROP,e=>{this.counter=0,this.dragStartTime=0,this.callbacks.onDrop(e)}))}}const gT=2e4;let Zc,Qb,Ly,Jb,Dy;function SB(o){Zc=document.createElement(\"div\"),Zc.className=\"monaco-aria-container\";const e=()=>{const i=document.createElement(\"div\");return i.className=\"monaco-alert\",i.setAttribute(\"role\",\"alert\"),i.setAttribute(\"aria-atomic\",\"true\"),Zc.appendChild(i),i};Qb=e(),Ly=e();const t=()=>{const i=document.createElement(\"div\");return i.className=\"monaco-status\",i.setAttribute(\"role\",\"complementary\"),i.setAttribute(\"aria-live\",\"polite\"),i.setAttribute(\"aria-atomic\",\"true\"),Zc.appendChild(i),i};Jb=t(),Dy=t(),o.appendChild(Zc)}function un(o){!Zc||(Qb.textContent!==o?(Ii(Ly),P0(Qb,o)):(Ii(Qb),P0(Ly,o)))}function O0(o){!Zc||(Ze?un(o):Jb.textContent!==o?(Ii(Dy),P0(Jb,o)):(Ii(Jb),P0(Dy,o)))}function P0(o,e){Ii(o),e.length>gT&&(e=e.substr(0,gT)),o.textContent=e,o.style.visibility=\"hidden\",o.style.visibility=\"visible\"}var Po;(function(o){o.serviceIds=new Map,o.DI_TARGET=\"$di$target\",o.DI_DEPENDENCIES=\"$di$dependencies\";function e(t){return t[o.DI_DEPENDENCIES]||[]}o.getServiceDependencies=e})(Po||(Po={}));const Re=qe(\"instantiationService\");function yB(o,e,t){e[Po.DI_TARGET]===e?e[Po.DI_DEPENDENCIES].push({id:o,index:t}):(e[Po.DI_DEPENDENCIES]=[{id:o,index:t}],e[Po.DI_TARGET]=e)}function qe(o){if(Po.serviceIds.has(o))return Po.serviceIds.get(o);const e=function(t,i,n){if(arguments.length!==3)throw new Error(\"@IServiceName-decorator can only be used to decorate a parameter\");yB(e,t,n)};return e.toString=()=>o,Po.serviceIds.set(o,e),e}const dt=qe(\"codeEditorService\");class B{constructor(e,t){this.lineNumber=e,this.column=t}with(e=this.lineNumber,t=this.column){return e===this.lineNumber&&t===this.column?this:new B(e,t)}delta(e=0,t=0){return this.with(this.lineNumber+e,this.column+t)}equals(e){return B.equals(this,e)}static equals(e,t){return!e&&!t?!0:!!e&&!!t&&e.lineNumber===t.lineNumber&&e.column===t.column}isBefore(e){return B.isBefore(this,e)}static isBefore(e,t){return e.lineNumber<t.lineNumber?!0:t.lineNumber<e.lineNumber?!1:e.column<t.column}isBeforeOrEqual(e){return B.isBeforeOrEqual(this,e)}static isBeforeOrEqual(e,t){return e.lineNumber<t.lineNumber?!0:t.lineNumber<e.lineNumber?!1:e.column<=t.column}static compare(e,t){const i=e.lineNumber|0,n=t.lineNumber|0;if(i===n){const s=e.column|0,r=t.column|0;return s-r}return i-n}clone(){return new B(this.lineNumber,this.column)}toString(){return\"(\"+this.lineNumber+\",\"+this.column+\")\"}static lift(e){return new B(e.lineNumber,e.column)}static isIPosition(e){return e&&typeof e.lineNumber==\"number\"&&typeof e.column==\"number\"}}const Bt=qe(\"modelService\"),$n=qe(\"textModelService\");var xp=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class is extends z{constructor(e,t=\"\",i=\"\",n=!0,s){super(),this._onDidChange=this._register(new O),this.onDidChange=this._onDidChange.event,this._enabled=!0,this._id=e,this._label=t,this._cssClass=i,this._enabled=n,this._actionCallback=s}get id(){return this._id}get label(){return this._label}set label(e){this._setLabel(e)}_setLabel(e){this._label!==e&&(this._label=e,this._onDidChange.fire({label:e}))}get tooltip(){return this._tooltip||\"\"}set tooltip(e){this._setTooltip(e)}_setTooltip(e){this._tooltip!==e&&(this._tooltip=e,this._onDidChange.fire({tooltip:e}))}get class(){return this._cssClass}set class(e){this._setClass(e)}_setClass(e){this._cssClass!==e&&(this._cssClass=e,this._onDidChange.fire({class:e}))}get enabled(){return this._enabled}set enabled(e){this._setEnabled(e)}_setEnabled(e){this._enabled!==e&&(this._enabled=e,this._onDidChange.fire({enabled:e}))}get checked(){return this._checked}set checked(e){this._setChecked(e)}_setChecked(e){this._checked!==e&&(this._checked=e,this._onDidChange.fire({checked:e}))}run(e,t){return xp(this,void 0,void 0,function*(){this._actionCallback&&(yield this._actionCallback(e))})}}class Ju extends z{constructor(){super(...arguments),this._onBeforeRun=this._register(new O),this.onBeforeRun=this._onBeforeRun.event,this._onDidRun=this._register(new O),this.onDidRun=this._onDidRun.event}run(e,t){return xp(this,void 0,void 0,function*(){if(!e.enabled)return;this._onBeforeRun.fire({action:e});let i;try{yield this.runAction(e,t)}catch(n){i=n}this._onDidRun.fire({action:e,error:i})})}runAction(e,t){return xp(this,void 0,void 0,function*(){yield e.run(t)})}}class Ji extends is{constructor(e){super(Ji.ID,e,e?\"separator text\":\"separator\"),this.checked=!1,this.enabled=!1}}Ji.ID=\"vs.actions.separator\";class Ip{constructor(e,t,i,n){this.tooltip=\"\",this.enabled=!0,this.checked=void 0,this.id=e,this.label=t,this.class=n,this._actions=i}get actions(){return this._actions}dispose(){}run(){return xp(this,void 0,void 0,function*(){})}}class LC extends is{constructor(){super(LC.ID,p(\"submenu.empty\",\"(empty)\"),void 0,!1)}}LC.ID=\"vs.actions.empty\";function fT(o){var e,t;return{id:o.id,label:o.label,class:void 0,enabled:(e=o.enabled)!==null&&e!==void 0?e:!0,checked:(t=o.checked)!==null&&t!==void 0?t:!1,run:()=>xp(this,void 0,void 0,function*(){return o.run()}),tooltip:o.label,dispose:()=>{}}}function LB(o){return o?o.replace(/\\$\\((.*?)\\)/g,(e,t)=>` ${t} `).trim():\"\"}class m{constructor(e,t,i){this.id=e,this.definition=t,this.description=i,m._allCodicons.push(this)}get classNames(){return\"codicon codicon-\"+this.id}get classNamesArray(){return[\"codicon\",\"codicon-\"+this.id]}get cssSelector(){return\".codicon.codicon-\"+this.id}static getAll(){return m._allCodicons}}m._allCodicons=[];m.add=new m(\"add\",{fontCharacter:\"\\\\ea60\"});m.plus=new m(\"plus\",m.add.definition);m.gistNew=new m(\"gist-new\",m.add.definition);m.repoCreate=new m(\"repo-create\",m.add.definition);m.lightbulb=new m(\"lightbulb\",{fontCharacter:\"\\\\ea61\"});m.lightBulb=new m(\"light-bulb\",{fontCharacter:\"\\\\ea61\"});m.repo=new m(\"repo\",{fontCharacter:\"\\\\ea62\"});m.repoDelete=new m(\"repo-delete\",{fontCharacter:\"\\\\ea62\"});m.gistFork=new m(\"gist-fork\",{fontCharacter:\"\\\\ea63\"});m.repoForked=new m(\"repo-forked\",{fontCharacter:\"\\\\ea63\"});m.gitPullRequest=new m(\"git-pull-request\",{fontCharacter:\"\\\\ea64\"});m.gitPullRequestAbandoned=new m(\"git-pull-request-abandoned\",{fontCharacter:\"\\\\ea64\"});m.recordKeys=new m(\"record-keys\",{fontCharacter:\"\\\\ea65\"});m.keyboard=new m(\"keyboard\",{fontCharacter:\"\\\\ea65\"});m.tag=new m(\"tag\",{fontCharacter:\"\\\\ea66\"});m.tagAdd=new m(\"tag-add\",{fontCharacter:\"\\\\ea66\"});m.tagRemove=new m(\"tag-remove\",{fontCharacter:\"\\\\ea66\"});m.person=new m(\"person\",{fontCharacter:\"\\\\ea67\"});m.personFollow=new m(\"person-follow\",{fontCharacter:\"\\\\ea67\"});m.personOutline=new m(\"person-outline\",{fontCharacter:\"\\\\ea67\"});m.personFilled=new m(\"person-filled\",{fontCharacter:\"\\\\ea67\"});m.gitBranch=new m(\"git-branch\",{fontCharacter:\"\\\\ea68\"});m.gitBranchCreate=new m(\"git-branch-create\",{fontCharacter:\"\\\\ea68\"});m.gitBranchDelete=new m(\"git-branch-delete\",{fontCharacter:\"\\\\ea68\"});m.sourceControl=new m(\"source-control\",{fontCharacter:\"\\\\ea68\"});m.mirror=new m(\"mirror\",{fontCharacter:\"\\\\ea69\"});m.mirrorPublic=new m(\"mirror-public\",{fontCharacter:\"\\\\ea69\"});m.star=new m(\"star\",{fontCharacter:\"\\\\ea6a\"});m.starAdd=new m(\"star-add\",{fontCharacter:\"\\\\ea6a\"});m.starDelete=new m(\"star-delete\",{fontCharacter:\"\\\\ea6a\"});m.starEmpty=new m(\"star-empty\",{fontCharacter:\"\\\\ea6a\"});m.comment=new m(\"comment\",{fontCharacter:\"\\\\ea6b\"});m.commentAdd=new m(\"comment-add\",{fontCharacter:\"\\\\ea6b\"});m.alert=new m(\"alert\",{fontCharacter:\"\\\\ea6c\"});m.warning=new m(\"warning\",{fontCharacter:\"\\\\ea6c\"});m.search=new m(\"search\",{fontCharacter:\"\\\\ea6d\"});m.searchSave=new m(\"search-save\",{fontCharacter:\"\\\\ea6d\"});m.logOut=new m(\"log-out\",{fontCharacter:\"\\\\ea6e\"});m.signOut=new m(\"sign-out\",{fontCharacter:\"\\\\ea6e\"});m.logIn=new m(\"log-in\",{fontCharacter:\"\\\\ea6f\"});m.signIn=new m(\"sign-in\",{fontCharacter:\"\\\\ea6f\"});m.eye=new m(\"eye\",{fontCharacter:\"\\\\ea70\"});m.eyeUnwatch=new m(\"eye-unwatch\",{fontCharacter:\"\\\\ea70\"});m.eyeWatch=new m(\"eye-watch\",{fontCharacter:\"\\\\ea70\"});m.circleFilled=new m(\"circle-filled\",{fontCharacter:\"\\\\ea71\"});m.primitiveDot=new m(\"primitive-dot\",{fontCharacter:\"\\\\ea71\"});m.closeDirty=new m(\"close-dirty\",{fontCharacter:\"\\\\ea71\"});m.debugBreakpoint=new m(\"debug-breakpoint\",{fontCharacter:\"\\\\ea71\"});m.debugBreakpointDisabled=new m(\"debug-breakpoint-disabled\",{fontCharacter:\"\\\\ea71\"});m.debugHint=new m(\"debug-hint\",{fontCharacter:\"\\\\ea71\"});m.primitiveSquare=new m(\"primitive-square\",{fontCharacter:\"\\\\ea72\"});m.edit=new m(\"edit\",{fontCharacter:\"\\\\ea73\"});m.pencil=new m(\"pencil\",{fontCharacter:\"\\\\ea73\"});m.info=new m(\"info\",{fontCharacter:\"\\\\ea74\"});m.issueOpened=new m(\"issue-opened\",{fontCharacter:\"\\\\ea74\"});m.gistPrivate=new m(\"gist-private\",{fontCharacter:\"\\\\ea75\"});m.gitForkPrivate=new m(\"git-fork-private\",{fontCharacter:\"\\\\ea75\"});m.lock=new m(\"lock\",{fontCharacter:\"\\\\ea75\"});m.mirrorPrivate=new m(\"mirror-private\",{fontCharacter:\"\\\\ea75\"});m.close=new m(\"close\",{fontCharacter:\"\\\\ea76\"});m.removeClose=new m(\"remove-close\",{fontCharacter:\"\\\\ea76\"});m.x=new m(\"x\",{fontCharacter:\"\\\\ea76\"});m.repoSync=new m(\"repo-sync\",{fontCharacter:\"\\\\ea77\"});m.sync=new m(\"sync\",{fontCharacter:\"\\\\ea77\"});m.clone=new m(\"clone\",{fontCharacter:\"\\\\ea78\"});m.desktopDownload=new m(\"desktop-download\",{fontCharacter:\"\\\\ea78\"});m.beaker=new m(\"beaker\",{fontCharacter:\"\\\\ea79\"});m.microscope=new m(\"microscope\",{fontCharacter:\"\\\\ea79\"});m.vm=new m(\"vm\",{fontCharacter:\"\\\\ea7a\"});m.deviceDesktop=new m(\"device-desktop\",{fontCharacter:\"\\\\ea7a\"});m.file=new m(\"file\",{fontCharacter:\"\\\\ea7b\"});m.fileText=new m(\"file-text\",{fontCharacter:\"\\\\ea7b\"});m.more=new m(\"more\",{fontCharacter:\"\\\\ea7c\"});m.ellipsis=new m(\"ellipsis\",{fontCharacter:\"\\\\ea7c\"});m.kebabHorizontal=new m(\"kebab-horizontal\",{fontCharacter:\"\\\\ea7c\"});m.mailReply=new m(\"mail-reply\",{fontCharacter:\"\\\\ea7d\"});m.reply=new m(\"reply\",{fontCharacter:\"\\\\ea7d\"});m.organization=new m(\"organization\",{fontCharacter:\"\\\\ea7e\"});m.organizationFilled=new m(\"organization-filled\",{fontCharacter:\"\\\\ea7e\"});m.organizationOutline=new m(\"organization-outline\",{fontCharacter:\"\\\\ea7e\"});m.newFile=new m(\"new-file\",{fontCharacter:\"\\\\ea7f\"});m.fileAdd=new m(\"file-add\",{fontCharacter:\"\\\\ea7f\"});m.newFolder=new m(\"new-folder\",{fontCharacter:\"\\\\ea80\"});m.fileDirectoryCreate=new m(\"file-directory-create\",{fontCharacter:\"\\\\ea80\"});m.trash=new m(\"trash\",{fontCharacter:\"\\\\ea81\"});m.trashcan=new m(\"trashcan\",{fontCharacter:\"\\\\ea81\"});m.history=new m(\"history\",{fontCharacter:\"\\\\ea82\"});m.clock=new m(\"clock\",{fontCharacter:\"\\\\ea82\"});m.folder=new m(\"folder\",{fontCharacter:\"\\\\ea83\"});m.fileDirectory=new m(\"file-directory\",{fontCharacter:\"\\\\ea83\"});m.symbolFolder=new m(\"symbol-folder\",{fontCharacter:\"\\\\ea83\"});m.logoGithub=new m(\"logo-github\",{fontCharacter:\"\\\\ea84\"});m.markGithub=new m(\"mark-github\",{fontCharacter:\"\\\\ea84\"});m.github=new m(\"github\",{fontCharacter:\"\\\\ea84\"});m.terminal=new m(\"terminal\",{fontCharacter:\"\\\\ea85\"});m.console=new m(\"console\",{fontCharacter:\"\\\\ea85\"});m.repl=new m(\"repl\",{fontCharacter:\"\\\\ea85\"});m.zap=new m(\"zap\",{fontCharacter:\"\\\\ea86\"});m.symbolEvent=new m(\"symbol-event\",{fontCharacter:\"\\\\ea86\"});m.error=new m(\"error\",{fontCharacter:\"\\\\ea87\"});m.stop=new m(\"stop\",{fontCharacter:\"\\\\ea87\"});m.variable=new m(\"variable\",{fontCharacter:\"\\\\ea88\"});m.symbolVariable=new m(\"symbol-variable\",{fontCharacter:\"\\\\ea88\"});m.array=new m(\"array\",{fontCharacter:\"\\\\ea8a\"});m.symbolArray=new m(\"symbol-array\",{fontCharacter:\"\\\\ea8a\"});m.symbolModule=new m(\"symbol-module\",{fontCharacter:\"\\\\ea8b\"});m.symbolPackage=new m(\"symbol-package\",{fontCharacter:\"\\\\ea8b\"});m.symbolNamespace=new m(\"symbol-namespace\",{fontCharacter:\"\\\\ea8b\"});m.symbolObject=new m(\"symbol-object\",{fontCharacter:\"\\\\ea8b\"});m.symbolMethod=new m(\"symbol-method\",{fontCharacter:\"\\\\ea8c\"});m.symbolFunction=new m(\"symbol-function\",{fontCharacter:\"\\\\ea8c\"});m.symbolConstructor=new m(\"symbol-constructor\",{fontCharacter:\"\\\\ea8c\"});m.symbolBoolean=new m(\"symbol-boolean\",{fontCharacter:\"\\\\ea8f\"});m.symbolNull=new m(\"symbol-null\",{fontCharacter:\"\\\\ea8f\"});m.symbolNumeric=new m(\"symbol-numeric\",{fontCharacter:\"\\\\ea90\"});m.symbolNumber=new m(\"symbol-number\",{fontCharacter:\"\\\\ea90\"});m.symbolStructure=new m(\"symbol-structure\",{fontCharacter:\"\\\\ea91\"});m.symbolStruct=new m(\"symbol-struct\",{fontCharacter:\"\\\\ea91\"});m.symbolParameter=new m(\"symbol-parameter\",{fontCharacter:\"\\\\ea92\"});m.symbolTypeParameter=new m(\"symbol-type-parameter\",{fontCharacter:\"\\\\ea92\"});m.symbolKey=new m(\"symbol-key\",{fontCharacter:\"\\\\ea93\"});m.symbolText=new m(\"symbol-text\",{fontCharacter:\"\\\\ea93\"});m.symbolReference=new m(\"symbol-reference\",{fontCharacter:\"\\\\ea94\"});m.goToFile=new m(\"go-to-file\",{fontCharacter:\"\\\\ea94\"});m.symbolEnum=new m(\"symbol-enum\",{fontCharacter:\"\\\\ea95\"});m.symbolValue=new m(\"symbol-value\",{fontCharacter:\"\\\\ea95\"});m.symbolRuler=new m(\"symbol-ruler\",{fontCharacter:\"\\\\ea96\"});m.symbolUnit=new m(\"symbol-unit\",{fontCharacter:\"\\\\ea96\"});m.activateBreakpoints=new m(\"activate-breakpoints\",{fontCharacter:\"\\\\ea97\"});m.archive=new m(\"archive\",{fontCharacter:\"\\\\ea98\"});m.arrowBoth=new m(\"arrow-both\",{fontCharacter:\"\\\\ea99\"});m.arrowDown=new m(\"arrow-down\",{fontCharacter:\"\\\\ea9a\"});m.arrowLeft=new m(\"arrow-left\",{fontCharacter:\"\\\\ea9b\"});m.arrowRight=new m(\"arrow-right\",{fontCharacter:\"\\\\ea9c\"});m.arrowSmallDown=new m(\"arrow-small-down\",{fontCharacter:\"\\\\ea9d\"});m.arrowSmallLeft=new m(\"arrow-small-left\",{fontCharacter:\"\\\\ea9e\"});m.arrowSmallRight=new m(\"arrow-small-right\",{fontCharacter:\"\\\\ea9f\"});m.arrowSmallUp=new m(\"arrow-small-up\",{fontCharacter:\"\\\\eaa0\"});m.arrowUp=new m(\"arrow-up\",{fontCharacter:\"\\\\eaa1\"});m.bell=new m(\"bell\",{fontCharacter:\"\\\\eaa2\"});m.bold=new m(\"bold\",{fontCharacter:\"\\\\eaa3\"});m.book=new m(\"book\",{fontCharacter:\"\\\\eaa4\"});m.bookmark=new m(\"bookmark\",{fontCharacter:\"\\\\eaa5\"});m.debugBreakpointConditionalUnverified=new m(\"debug-breakpoint-conditional-unverified\",{fontCharacter:\"\\\\eaa6\"});m.debugBreakpointConditional=new m(\"debug-breakpoint-conditional\",{fontCharacter:\"\\\\eaa7\"});m.debugBreakpointConditionalDisabled=new m(\"debug-breakpoint-conditional-disabled\",{fontCharacter:\"\\\\eaa7\"});m.debugBreakpointDataUnverified=new m(\"debug-breakpoint-data-unverified\",{fontCharacter:\"\\\\eaa8\"});m.debugBreakpointData=new m(\"debug-breakpoint-data\",{fontCharacter:\"\\\\eaa9\"});m.debugBreakpointDataDisabled=new m(\"debug-breakpoint-data-disabled\",{fontCharacter:\"\\\\eaa9\"});m.debugBreakpointLogUnverified=new m(\"debug-breakpoint-log-unverified\",{fontCharacter:\"\\\\eaaa\"});m.debugBreakpointLog=new m(\"debug-breakpoint-log\",{fontCharacter:\"\\\\eaab\"});m.debugBreakpointLogDisabled=new m(\"debug-breakpoint-log-disabled\",{fontCharacter:\"\\\\eaab\"});m.briefcase=new m(\"briefcase\",{fontCharacter:\"\\\\eaac\"});m.broadcast=new m(\"broadcast\",{fontCharacter:\"\\\\eaad\"});m.browser=new m(\"browser\",{fontCharacter:\"\\\\eaae\"});m.bug=new m(\"bug\",{fontCharacter:\"\\\\eaaf\"});m.calendar=new m(\"calendar\",{fontCharacter:\"\\\\eab0\"});m.caseSensitive=new m(\"case-sensitive\",{fontCharacter:\"\\\\eab1\"});m.check=new m(\"check\",{fontCharacter:\"\\\\eab2\"});m.checklist=new m(\"checklist\",{fontCharacter:\"\\\\eab3\"});m.chevronDown=new m(\"chevron-down\",{fontCharacter:\"\\\\eab4\"});m.dropDownButton=new m(\"drop-down-button\",m.chevronDown.definition);m.chevronLeft=new m(\"chevron-left\",{fontCharacter:\"\\\\eab5\"});m.chevronRight=new m(\"chevron-right\",{fontCharacter:\"\\\\eab6\"});m.chevronUp=new m(\"chevron-up\",{fontCharacter:\"\\\\eab7\"});m.chromeClose=new m(\"chrome-close\",{fontCharacter:\"\\\\eab8\"});m.chromeMaximize=new m(\"chrome-maximize\",{fontCharacter:\"\\\\eab9\"});m.chromeMinimize=new m(\"chrome-minimize\",{fontCharacter:\"\\\\eaba\"});m.chromeRestore=new m(\"chrome-restore\",{fontCharacter:\"\\\\eabb\"});m.circleOutline=new m(\"circle-outline\",{fontCharacter:\"\\\\eabc\"});m.debugBreakpointUnverified=new m(\"debug-breakpoint-unverified\",{fontCharacter:\"\\\\eabc\"});m.circleSlash=new m(\"circle-slash\",{fontCharacter:\"\\\\eabd\"});m.circuitBoard=new m(\"circuit-board\",{fontCharacter:\"\\\\eabe\"});m.clearAll=new m(\"clear-all\",{fontCharacter:\"\\\\eabf\"});m.clippy=new m(\"clippy\",{fontCharacter:\"\\\\eac0\"});m.closeAll=new m(\"close-all\",{fontCharacter:\"\\\\eac1\"});m.cloudDownload=new m(\"cloud-download\",{fontCharacter:\"\\\\eac2\"});m.cloudUpload=new m(\"cloud-upload\",{fontCharacter:\"\\\\eac3\"});m.code=new m(\"code\",{fontCharacter:\"\\\\eac4\"});m.collapseAll=new m(\"collapse-all\",{fontCharacter:\"\\\\eac5\"});m.colorMode=new m(\"color-mode\",{fontCharacter:\"\\\\eac6\"});m.commentDiscussion=new m(\"comment-discussion\",{fontCharacter:\"\\\\eac7\"});m.compareChanges=new m(\"compare-changes\",{fontCharacter:\"\\\\eafd\"});m.creditCard=new m(\"credit-card\",{fontCharacter:\"\\\\eac9\"});m.dash=new m(\"dash\",{fontCharacter:\"\\\\eacc\"});m.dashboard=new m(\"dashboard\",{fontCharacter:\"\\\\eacd\"});m.database=new m(\"database\",{fontCharacter:\"\\\\eace\"});m.debugContinue=new m(\"debug-continue\",{fontCharacter:\"\\\\eacf\"});m.debugDisconnect=new m(\"debug-disconnect\",{fontCharacter:\"\\\\ead0\"});m.debugPause=new m(\"debug-pause\",{fontCharacter:\"\\\\ead1\"});m.debugRestart=new m(\"debug-restart\",{fontCharacter:\"\\\\ead2\"});m.debugStart=new m(\"debug-start\",{fontCharacter:\"\\\\ead3\"});m.debugStepInto=new m(\"debug-step-into\",{fontCharacter:\"\\\\ead4\"});m.debugStepOut=new m(\"debug-step-out\",{fontCharacter:\"\\\\ead5\"});m.debugStepOver=new m(\"debug-step-over\",{fontCharacter:\"\\\\ead6\"});m.debugStop=new m(\"debug-stop\",{fontCharacter:\"\\\\ead7\"});m.debug=new m(\"debug\",{fontCharacter:\"\\\\ead8\"});m.deviceCameraVideo=new m(\"device-camera-video\",{fontCharacter:\"\\\\ead9\"});m.deviceCamera=new m(\"device-camera\",{fontCharacter:\"\\\\eada\"});m.deviceMobile=new m(\"device-mobile\",{fontCharacter:\"\\\\eadb\"});m.diffAdded=new m(\"diff-added\",{fontCharacter:\"\\\\eadc\"});m.diffIgnored=new m(\"diff-ignored\",{fontCharacter:\"\\\\eadd\"});m.diffModified=new m(\"diff-modified\",{fontCharacter:\"\\\\eade\"});m.diffRemoved=new m(\"diff-removed\",{fontCharacter:\"\\\\eadf\"});m.diffRenamed=new m(\"diff-renamed\",{fontCharacter:\"\\\\eae0\"});m.diff=new m(\"diff\",{fontCharacter:\"\\\\eae1\"});m.discard=new m(\"discard\",{fontCharacter:\"\\\\eae2\"});m.editorLayout=new m(\"editor-layout\",{fontCharacter:\"\\\\eae3\"});m.emptyWindow=new m(\"empty-window\",{fontCharacter:\"\\\\eae4\"});m.exclude=new m(\"exclude\",{fontCharacter:\"\\\\eae5\"});m.extensions=new m(\"extensions\",{fontCharacter:\"\\\\eae6\"});m.eyeClosed=new m(\"eye-closed\",{fontCharacter:\"\\\\eae7\"});m.fileBinary=new m(\"file-binary\",{fontCharacter:\"\\\\eae8\"});m.fileCode=new m(\"file-code\",{fontCharacter:\"\\\\eae9\"});m.fileMedia=new m(\"file-media\",{fontCharacter:\"\\\\eaea\"});m.filePdf=new m(\"file-pdf\",{fontCharacter:\"\\\\eaeb\"});m.fileSubmodule=new m(\"file-submodule\",{fontCharacter:\"\\\\eaec\"});m.fileSymlinkDirectory=new m(\"file-symlink-directory\",{fontCharacter:\"\\\\eaed\"});m.fileSymlinkFile=new m(\"file-symlink-file\",{fontCharacter:\"\\\\eaee\"});m.fileZip=new m(\"file-zip\",{fontCharacter:\"\\\\eaef\"});m.files=new m(\"files\",{fontCharacter:\"\\\\eaf0\"});m.filter=new m(\"filter\",{fontCharacter:\"\\\\eaf1\"});m.flame=new m(\"flame\",{fontCharacter:\"\\\\eaf2\"});m.foldDown=new m(\"fold-down\",{fontCharacter:\"\\\\eaf3\"});m.foldUp=new m(\"fold-up\",{fontCharacter:\"\\\\eaf4\"});m.fold=new m(\"fold\",{fontCharacter:\"\\\\eaf5\"});m.folderActive=new m(\"folder-active\",{fontCharacter:\"\\\\eaf6\"});m.folderOpened=new m(\"folder-opened\",{fontCharacter:\"\\\\eaf7\"});m.gear=new m(\"gear\",{fontCharacter:\"\\\\eaf8\"});m.gift=new m(\"gift\",{fontCharacter:\"\\\\eaf9\"});m.gistSecret=new m(\"gist-secret\",{fontCharacter:\"\\\\eafa\"});m.gist=new m(\"gist\",{fontCharacter:\"\\\\eafb\"});m.gitCommit=new m(\"git-commit\",{fontCharacter:\"\\\\eafc\"});m.gitCompare=new m(\"git-compare\",{fontCharacter:\"\\\\eafd\"});m.gitMerge=new m(\"git-merge\",{fontCharacter:\"\\\\eafe\"});m.githubAction=new m(\"github-action\",{fontCharacter:\"\\\\eaff\"});m.githubAlt=new m(\"github-alt\",{fontCharacter:\"\\\\eb00\"});m.globe=new m(\"globe\",{fontCharacter:\"\\\\eb01\"});m.grabber=new m(\"grabber\",{fontCharacter:\"\\\\eb02\"});m.graph=new m(\"graph\",{fontCharacter:\"\\\\eb03\"});m.gripper=new m(\"gripper\",{fontCharacter:\"\\\\eb04\"});m.heart=new m(\"heart\",{fontCharacter:\"\\\\eb05\"});m.home=new m(\"home\",{fontCharacter:\"\\\\eb06\"});m.horizontalRule=new m(\"horizontal-rule\",{fontCharacter:\"\\\\eb07\"});m.hubot=new m(\"hubot\",{fontCharacter:\"\\\\eb08\"});m.inbox=new m(\"inbox\",{fontCharacter:\"\\\\eb09\"});m.issueClosed=new m(\"issue-closed\",{fontCharacter:\"\\\\eba4\"});m.issueReopened=new m(\"issue-reopened\",{fontCharacter:\"\\\\eb0b\"});m.issues=new m(\"issues\",{fontCharacter:\"\\\\eb0c\"});m.italic=new m(\"italic\",{fontCharacter:\"\\\\eb0d\"});m.jersey=new m(\"jersey\",{fontCharacter:\"\\\\eb0e\"});m.json=new m(\"json\",{fontCharacter:\"\\\\eb0f\"});m.kebabVertical=new m(\"kebab-vertical\",{fontCharacter:\"\\\\eb10\"});m.key=new m(\"key\",{fontCharacter:\"\\\\eb11\"});m.law=new m(\"law\",{fontCharacter:\"\\\\eb12\"});m.lightbulbAutofix=new m(\"lightbulb-autofix\",{fontCharacter:\"\\\\eb13\"});m.linkExternal=new m(\"link-external\",{fontCharacter:\"\\\\eb14\"});m.link=new m(\"link\",{fontCharacter:\"\\\\eb15\"});m.listOrdered=new m(\"list-ordered\",{fontCharacter:\"\\\\eb16\"});m.listUnordered=new m(\"list-unordered\",{fontCharacter:\"\\\\eb17\"});m.liveShare=new m(\"live-share\",{fontCharacter:\"\\\\eb18\"});m.loading=new m(\"loading\",{fontCharacter:\"\\\\eb19\"});m.location=new m(\"location\",{fontCharacter:\"\\\\eb1a\"});m.mailRead=new m(\"mail-read\",{fontCharacter:\"\\\\eb1b\"});m.mail=new m(\"mail\",{fontCharacter:\"\\\\eb1c\"});m.markdown=new m(\"markdown\",{fontCharacter:\"\\\\eb1d\"});m.megaphone=new m(\"megaphone\",{fontCharacter:\"\\\\eb1e\"});m.mention=new m(\"mention\",{fontCharacter:\"\\\\eb1f\"});m.milestone=new m(\"milestone\",{fontCharacter:\"\\\\eb20\"});m.mortarBoard=new m(\"mortar-board\",{fontCharacter:\"\\\\eb21\"});m.move=new m(\"move\",{fontCharacter:\"\\\\eb22\"});m.multipleWindows=new m(\"multiple-windows\",{fontCharacter:\"\\\\eb23\"});m.mute=new m(\"mute\",{fontCharacter:\"\\\\eb24\"});m.noNewline=new m(\"no-newline\",{fontCharacter:\"\\\\eb25\"});m.note=new m(\"note\",{fontCharacter:\"\\\\eb26\"});m.octoface=new m(\"octoface\",{fontCharacter:\"\\\\eb27\"});m.openPreview=new m(\"open-preview\",{fontCharacter:\"\\\\eb28\"});m.package_=new m(\"package\",{fontCharacter:\"\\\\eb29\"});m.paintcan=new m(\"paintcan\",{fontCharacter:\"\\\\eb2a\"});m.pin=new m(\"pin\",{fontCharacter:\"\\\\eb2b\"});m.play=new m(\"play\",{fontCharacter:\"\\\\eb2c\"});m.run=new m(\"run\",{fontCharacter:\"\\\\eb2c\"});m.plug=new m(\"plug\",{fontCharacter:\"\\\\eb2d\"});m.preserveCase=new m(\"preserve-case\",{fontCharacter:\"\\\\eb2e\"});m.preview=new m(\"preview\",{fontCharacter:\"\\\\eb2f\"});m.project=new m(\"project\",{fontCharacter:\"\\\\eb30\"});m.pulse=new m(\"pulse\",{fontCharacter:\"\\\\eb31\"});m.question=new m(\"question\",{fontCharacter:\"\\\\eb32\"});m.quote=new m(\"quote\",{fontCharacter:\"\\\\eb33\"});m.radioTower=new m(\"radio-tower\",{fontCharacter:\"\\\\eb34\"});m.reactions=new m(\"reactions\",{fontCharacter:\"\\\\eb35\"});m.references=new m(\"references\",{fontCharacter:\"\\\\eb36\"});m.refresh=new m(\"refresh\",{fontCharacter:\"\\\\eb37\"});m.regex=new m(\"regex\",{fontCharacter:\"\\\\eb38\"});m.remoteExplorer=new m(\"remote-explorer\",{fontCharacter:\"\\\\eb39\"});m.remote=new m(\"remote\",{fontCharacter:\"\\\\eb3a\"});m.remove=new m(\"remove\",{fontCharacter:\"\\\\eb3b\"});m.replaceAll=new m(\"replace-all\",{fontCharacter:\"\\\\eb3c\"});m.replace=new m(\"replace\",{fontCharacter:\"\\\\eb3d\"});m.repoClone=new m(\"repo-clone\",{fontCharacter:\"\\\\eb3e\"});m.repoForcePush=new m(\"repo-force-push\",{fontCharacter:\"\\\\eb3f\"});m.repoPull=new m(\"repo-pull\",{fontCharacter:\"\\\\eb40\"});m.repoPush=new m(\"repo-push\",{fontCharacter:\"\\\\eb41\"});m.report=new m(\"report\",{fontCharacter:\"\\\\eb42\"});m.requestChanges=new m(\"request-changes\",{fontCharacter:\"\\\\eb43\"});m.rocket=new m(\"rocket\",{fontCharacter:\"\\\\eb44\"});m.rootFolderOpened=new m(\"root-folder-opened\",{fontCharacter:\"\\\\eb45\"});m.rootFolder=new m(\"root-folder\",{fontCharacter:\"\\\\eb46\"});m.rss=new m(\"rss\",{fontCharacter:\"\\\\eb47\"});m.ruby=new m(\"ruby\",{fontCharacter:\"\\\\eb48\"});m.saveAll=new m(\"save-all\",{fontCharacter:\"\\\\eb49\"});m.saveAs=new m(\"save-as\",{fontCharacter:\"\\\\eb4a\"});m.save=new m(\"save\",{fontCharacter:\"\\\\eb4b\"});m.screenFull=new m(\"screen-full\",{fontCharacter:\"\\\\eb4c\"});m.screenNormal=new m(\"screen-normal\",{fontCharacter:\"\\\\eb4d\"});m.searchStop=new m(\"search-stop\",{fontCharacter:\"\\\\eb4e\"});m.server=new m(\"server\",{fontCharacter:\"\\\\eb50\"});m.settingsGear=new m(\"settings-gear\",{fontCharacter:\"\\\\eb51\"});m.settings=new m(\"settings\",{fontCharacter:\"\\\\eb52\"});m.shield=new m(\"shield\",{fontCharacter:\"\\\\eb53\"});m.smiley=new m(\"smiley\",{fontCharacter:\"\\\\eb54\"});m.sortPrecedence=new m(\"sort-precedence\",{fontCharacter:\"\\\\eb55\"});m.splitHorizontal=new m(\"split-horizontal\",{fontCharacter:\"\\\\eb56\"});m.splitVertical=new m(\"split-vertical\",{fontCharacter:\"\\\\eb57\"});m.squirrel=new m(\"squirrel\",{fontCharacter:\"\\\\eb58\"});m.starFull=new m(\"star-full\",{fontCharacter:\"\\\\eb59\"});m.starHalf=new m(\"star-half\",{fontCharacter:\"\\\\eb5a\"});m.symbolClass=new m(\"symbol-class\",{fontCharacter:\"\\\\eb5b\"});m.symbolColor=new m(\"symbol-color\",{fontCharacter:\"\\\\eb5c\"});m.symbolCustomColor=new m(\"symbol-customcolor\",{fontCharacter:\"\\\\eb5c\"});m.symbolConstant=new m(\"symbol-constant\",{fontCharacter:\"\\\\eb5d\"});m.symbolEnumMember=new m(\"symbol-enum-member\",{fontCharacter:\"\\\\eb5e\"});m.symbolField=new m(\"symbol-field\",{fontCharacter:\"\\\\eb5f\"});m.symbolFile=new m(\"symbol-file\",{fontCharacter:\"\\\\eb60\"});m.symbolInterface=new m(\"symbol-interface\",{fontCharacter:\"\\\\eb61\"});m.symbolKeyword=new m(\"symbol-keyword\",{fontCharacter:\"\\\\eb62\"});m.symbolMisc=new m(\"symbol-misc\",{fontCharacter:\"\\\\eb63\"});m.symbolOperator=new m(\"symbol-operator\",{fontCharacter:\"\\\\eb64\"});m.symbolProperty=new m(\"symbol-property\",{fontCharacter:\"\\\\eb65\"});m.wrench=new m(\"wrench\",{fontCharacter:\"\\\\eb65\"});m.wrenchSubaction=new m(\"wrench-subaction\",{fontCharacter:\"\\\\eb65\"});m.symbolSnippet=new m(\"symbol-snippet\",{fontCharacter:\"\\\\eb66\"});m.tasklist=new m(\"tasklist\",{fontCharacter:\"\\\\eb67\"});m.telescope=new m(\"telescope\",{fontCharacter:\"\\\\eb68\"});m.textSize=new m(\"text-size\",{fontCharacter:\"\\\\eb69\"});m.threeBars=new m(\"three-bars\",{fontCharacter:\"\\\\eb6a\"});m.thumbsdown=new m(\"thumbsdown\",{fontCharacter:\"\\\\eb6b\"});m.thumbsup=new m(\"thumbsup\",{fontCharacter:\"\\\\eb6c\"});m.tools=new m(\"tools\",{fontCharacter:\"\\\\eb6d\"});m.triangleDown=new m(\"triangle-down\",{fontCharacter:\"\\\\eb6e\"});m.triangleLeft=new m(\"triangle-left\",{fontCharacter:\"\\\\eb6f\"});m.triangleRight=new m(\"triangle-right\",{fontCharacter:\"\\\\eb70\"});m.triangleUp=new m(\"triangle-up\",{fontCharacter:\"\\\\eb71\"});m.twitter=new m(\"twitter\",{fontCharacter:\"\\\\eb72\"});m.unfold=new m(\"unfold\",{fontCharacter:\"\\\\eb73\"});m.unlock=new m(\"unlock\",{fontCharacter:\"\\\\eb74\"});m.unmute=new m(\"unmute\",{fontCharacter:\"\\\\eb75\"});m.unverified=new m(\"unverified\",{fontCharacter:\"\\\\eb76\"});m.verified=new m(\"verified\",{fontCharacter:\"\\\\eb77\"});m.versions=new m(\"versions\",{fontCharacter:\"\\\\eb78\"});m.vmActive=new m(\"vm-active\",{fontCharacter:\"\\\\eb79\"});m.vmOutline=new m(\"vm-outline\",{fontCharacter:\"\\\\eb7a\"});m.vmRunning=new m(\"vm-running\",{fontCharacter:\"\\\\eb7b\"});m.watch=new m(\"watch\",{fontCharacter:\"\\\\eb7c\"});m.whitespace=new m(\"whitespace\",{fontCharacter:\"\\\\eb7d\"});m.wholeWord=new m(\"whole-word\",{fontCharacter:\"\\\\eb7e\"});m.window=new m(\"window\",{fontCharacter:\"\\\\eb7f\"});m.wordWrap=new m(\"word-wrap\",{fontCharacter:\"\\\\eb80\"});m.zoomIn=new m(\"zoom-in\",{fontCharacter:\"\\\\eb81\"});m.zoomOut=new m(\"zoom-out\",{fontCharacter:\"\\\\eb82\"});m.listFilter=new m(\"list-filter\",{fontCharacter:\"\\\\eb83\"});m.listFlat=new m(\"list-flat\",{fontCharacter:\"\\\\eb84\"});m.listSelection=new m(\"list-selection\",{fontCharacter:\"\\\\eb85\"});m.selection=new m(\"selection\",{fontCharacter:\"\\\\eb85\"});m.listTree=new m(\"list-tree\",{fontCharacter:\"\\\\eb86\"});m.debugBreakpointFunctionUnverified=new m(\"debug-breakpoint-function-unverified\",{fontCharacter:\"\\\\eb87\"});m.debugBreakpointFunction=new m(\"debug-breakpoint-function\",{fontCharacter:\"\\\\eb88\"});m.debugBreakpointFunctionDisabled=new m(\"debug-breakpoint-function-disabled\",{fontCharacter:\"\\\\eb88\"});m.debugStackframeActive=new m(\"debug-stackframe-active\",{fontCharacter:\"\\\\eb89\"});m.circleSmallFilled=new m(\"circle-small-filled\",{fontCharacter:\"\\\\eb8a\"});m.debugStackframeDot=new m(\"debug-stackframe-dot\",m.circleSmallFilled.definition);m.debugStackframe=new m(\"debug-stackframe\",{fontCharacter:\"\\\\eb8b\"});m.debugStackframeFocused=new m(\"debug-stackframe-focused\",{fontCharacter:\"\\\\eb8b\"});m.debugBreakpointUnsupported=new m(\"debug-breakpoint-unsupported\",{fontCharacter:\"\\\\eb8c\"});m.symbolString=new m(\"symbol-string\",{fontCharacter:\"\\\\eb8d\"});m.debugReverseContinue=new m(\"debug-reverse-continue\",{fontCharacter:\"\\\\eb8e\"});m.debugStepBack=new m(\"debug-step-back\",{fontCharacter:\"\\\\eb8f\"});m.debugRestartFrame=new m(\"debug-restart-frame\",{fontCharacter:\"\\\\eb90\"});m.callIncoming=new m(\"call-incoming\",{fontCharacter:\"\\\\eb92\"});m.callOutgoing=new m(\"call-outgoing\",{fontCharacter:\"\\\\eb93\"});m.menu=new m(\"menu\",{fontCharacter:\"\\\\eb94\"});m.expandAll=new m(\"expand-all\",{fontCharacter:\"\\\\eb95\"});m.feedback=new m(\"feedback\",{fontCharacter:\"\\\\eb96\"});m.groupByRefType=new m(\"group-by-ref-type\",{fontCharacter:\"\\\\eb97\"});m.ungroupByRefType=new m(\"ungroup-by-ref-type\",{fontCharacter:\"\\\\eb98\"});m.account=new m(\"account\",{fontCharacter:\"\\\\eb99\"});m.bellDot=new m(\"bell-dot\",{fontCharacter:\"\\\\eb9a\"});m.debugConsole=new m(\"debug-console\",{fontCharacter:\"\\\\eb9b\"});m.library=new m(\"library\",{fontCharacter:\"\\\\eb9c\"});m.output=new m(\"output\",{fontCharacter:\"\\\\eb9d\"});m.runAll=new m(\"run-all\",{fontCharacter:\"\\\\eb9e\"});m.syncIgnored=new m(\"sync-ignored\",{fontCharacter:\"\\\\eb9f\"});m.pinned=new m(\"pinned\",{fontCharacter:\"\\\\eba0\"});m.githubInverted=new m(\"github-inverted\",{fontCharacter:\"\\\\eba1\"});m.debugAlt=new m(\"debug-alt\",{fontCharacter:\"\\\\eb91\"});m.serverProcess=new m(\"server-process\",{fontCharacter:\"\\\\eba2\"});m.serverEnvironment=new m(\"server-environment\",{fontCharacter:\"\\\\eba3\"});m.pass=new m(\"pass\",{fontCharacter:\"\\\\eba4\"});m.stopCircle=new m(\"stop-circle\",{fontCharacter:\"\\\\eba5\"});m.playCircle=new m(\"play-circle\",{fontCharacter:\"\\\\eba6\"});m.record=new m(\"record\",{fontCharacter:\"\\\\eba7\"});m.debugAltSmall=new m(\"debug-alt-small\",{fontCharacter:\"\\\\eba8\"});m.vmConnect=new m(\"vm-connect\",{fontCharacter:\"\\\\eba9\"});m.cloud=new m(\"cloud\",{fontCharacter:\"\\\\ebaa\"});m.merge=new m(\"merge\",{fontCharacter:\"\\\\ebab\"});m.exportIcon=new m(\"export\",{fontCharacter:\"\\\\ebac\"});m.graphLeft=new m(\"graph-left\",{fontCharacter:\"\\\\ebad\"});m.magnet=new m(\"magnet\",{fontCharacter:\"\\\\ebae\"});m.notebook=new m(\"notebook\",{fontCharacter:\"\\\\ebaf\"});m.redo=new m(\"redo\",{fontCharacter:\"\\\\ebb0\"});m.checkAll=new m(\"check-all\",{fontCharacter:\"\\\\ebb1\"});m.pinnedDirty=new m(\"pinned-dirty\",{fontCharacter:\"\\\\ebb2\"});m.passFilled=new m(\"pass-filled\",{fontCharacter:\"\\\\ebb3\"});m.circleLargeFilled=new m(\"circle-large-filled\",{fontCharacter:\"\\\\ebb4\"});m.circleLargeOutline=new m(\"circle-large-outline\",{fontCharacter:\"\\\\ebb5\"});m.combine=new m(\"combine\",{fontCharacter:\"\\\\ebb6\"});m.gather=new m(\"gather\",{fontCharacter:\"\\\\ebb6\"});m.table=new m(\"table\",{fontCharacter:\"\\\\ebb7\"});m.variableGroup=new m(\"variable-group\",{fontCharacter:\"\\\\ebb8\"});m.typeHierarchy=new m(\"type-hierarchy\",{fontCharacter:\"\\\\ebb9\"});m.typeHierarchySub=new m(\"type-hierarchy-sub\",{fontCharacter:\"\\\\ebba\"});m.typeHierarchySuper=new m(\"type-hierarchy-super\",{fontCharacter:\"\\\\ebbb\"});m.gitPullRequestCreate=new m(\"git-pull-request-create\",{fontCharacter:\"\\\\ebbc\"});m.runAbove=new m(\"run-above\",{fontCharacter:\"\\\\ebbd\"});m.runBelow=new m(\"run-below\",{fontCharacter:\"\\\\ebbe\"});m.notebookTemplate=new m(\"notebook-template\",{fontCharacter:\"\\\\ebbf\"});m.debugRerun=new m(\"debug-rerun\",{fontCharacter:\"\\\\ebc0\"});m.workspaceTrusted=new m(\"workspace-trusted\",{fontCharacter:\"\\\\ebc1\"});m.workspaceUntrusted=new m(\"workspace-untrusted\",{fontCharacter:\"\\\\ebc2\"});m.workspaceUnspecified=new m(\"workspace-unspecified\",{fontCharacter:\"\\\\ebc3\"});m.terminalCmd=new m(\"terminal-cmd\",{fontCharacter:\"\\\\ebc4\"});m.terminalDebian=new m(\"terminal-debian\",{fontCharacter:\"\\\\ebc5\"});m.terminalLinux=new m(\"terminal-linux\",{fontCharacter:\"\\\\ebc6\"});m.terminalPowershell=new m(\"terminal-powershell\",{fontCharacter:\"\\\\ebc7\"});m.terminalTmux=new m(\"terminal-tmux\",{fontCharacter:\"\\\\ebc8\"});m.terminalUbuntu=new m(\"terminal-ubuntu\",{fontCharacter:\"\\\\ebc9\"});m.terminalBash=new m(\"terminal-bash\",{fontCharacter:\"\\\\ebca\"});m.arrowSwap=new m(\"arrow-swap\",{fontCharacter:\"\\\\ebcb\"});m.copy=new m(\"copy\",{fontCharacter:\"\\\\ebcc\"});m.personAdd=new m(\"person-add\",{fontCharacter:\"\\\\ebcd\"});m.filterFilled=new m(\"filter-filled\",{fontCharacter:\"\\\\ebce\"});m.wand=new m(\"wand\",{fontCharacter:\"\\\\ebcf\"});m.debugLineByLine=new m(\"debug-line-by-line\",{fontCharacter:\"\\\\ebd0\"});m.inspect=new m(\"inspect\",{fontCharacter:\"\\\\ebd1\"});m.layers=new m(\"layers\",{fontCharacter:\"\\\\ebd2\"});m.layersDot=new m(\"layers-dot\",{fontCharacter:\"\\\\ebd3\"});m.layersActive=new m(\"layers-active\",{fontCharacter:\"\\\\ebd4\"});m.compass=new m(\"compass\",{fontCharacter:\"\\\\ebd5\"});m.compassDot=new m(\"compass-dot\",{fontCharacter:\"\\\\ebd6\"});m.compassActive=new m(\"compass-active\",{fontCharacter:\"\\\\ebd7\"});m.azure=new m(\"azure\",{fontCharacter:\"\\\\ebd8\"});m.issueDraft=new m(\"issue-draft\",{fontCharacter:\"\\\\ebd9\"});m.gitPullRequestClosed=new m(\"git-pull-request-closed\",{fontCharacter:\"\\\\ebda\"});m.gitPullRequestDraft=new m(\"git-pull-request-draft\",{fontCharacter:\"\\\\ebdb\"});m.debugAll=new m(\"debug-all\",{fontCharacter:\"\\\\ebdc\"});m.debugCoverage=new m(\"debug-coverage\",{fontCharacter:\"\\\\ebdd\"});m.runErrors=new m(\"run-errors\",{fontCharacter:\"\\\\ebde\"});m.folderLibrary=new m(\"folder-library\",{fontCharacter:\"\\\\ebdf\"});m.debugContinueSmall=new m(\"debug-continue-small\",{fontCharacter:\"\\\\ebe0\"});m.beakerStop=new m(\"beaker-stop\",{fontCharacter:\"\\\\ebe1\"});m.graphLine=new m(\"graph-line\",{fontCharacter:\"\\\\ebe2\"});m.graphScatter=new m(\"graph-scatter\",{fontCharacter:\"\\\\ebe3\"});m.pieChart=new m(\"pie-chart\",{fontCharacter:\"\\\\ebe4\"});m.bracket=new m(\"bracket\",m.json.definition);m.bracketDot=new m(\"bracket-dot\",{fontCharacter:\"\\\\ebe5\"});m.bracketError=new m(\"bracket-error\",{fontCharacter:\"\\\\ebe6\"});m.lockSmall=new m(\"lock-small\",{fontCharacter:\"\\\\ebe7\"});m.azureDevops=new m(\"azure-devops\",{fontCharacter:\"\\\\ebe8\"});m.verifiedFilled=new m(\"verified-filled\",{fontCharacter:\"\\\\ebe9\"});m.newLine=new m(\"newline\",{fontCharacter:\"\\\\ebea\"});m.layout=new m(\"layout\",{fontCharacter:\"\\\\ebeb\"});m.layoutActivitybarLeft=new m(\"layout-activitybar-left\",{fontCharacter:\"\\\\ebec\"});m.layoutActivitybarRight=new m(\"layout-activitybar-right\",{fontCharacter:\"\\\\ebed\"});m.layoutPanelLeft=new m(\"layout-panel-left\",{fontCharacter:\"\\\\ebee\"});m.layoutPanelCenter=new m(\"layout-panel-center\",{fontCharacter:\"\\\\ebef\"});m.layoutPanelJustify=new m(\"layout-panel-justify\",{fontCharacter:\"\\\\ebf0\"});m.layoutPanelRight=new m(\"layout-panel-right\",{fontCharacter:\"\\\\ebf1\"});m.layoutPanel=new m(\"layout-panel\",{fontCharacter:\"\\\\ebf2\"});m.layoutSidebarLeft=new m(\"layout-sidebar-left\",{fontCharacter:\"\\\\ebf3\"});m.layoutSidebarRight=new m(\"layout-sidebar-right\",{fontCharacter:\"\\\\ebf4\"});m.layoutStatusbar=new m(\"layout-statusbar\",{fontCharacter:\"\\\\ebf5\"});m.layoutMenubar=new m(\"layout-menubar\",{fontCharacter:\"\\\\ebf6\"});m.layoutCentered=new m(\"layout-centered\",{fontCharacter:\"\\\\ebf7\"});m.layoutSidebarRightOff=new m(\"layout-sidebar-right-off\",{fontCharacter:\"\\\\ec00\"});m.layoutPanelOff=new m(\"layout-panel-off\",{fontCharacter:\"\\\\ec01\"});m.layoutSidebarLeftOff=new m(\"layout-sidebar-left-off\",{fontCharacter:\"\\\\ec02\"});m.target=new m(\"target\",{fontCharacter:\"\\\\ebf8\"});m.indent=new m(\"indent\",{fontCharacter:\"\\\\ebf9\"});m.recordSmall=new m(\"record-small\",{fontCharacter:\"\\\\ebfa\"});m.errorSmall=new m(\"error-small\",{fontCharacter:\"\\\\ebfb\"});m.arrowCircleDown=new m(\"arrow-circle-down\",{fontCharacter:\"\\\\ebfc\"});m.arrowCircleLeft=new m(\"arrow-circle-left\",{fontCharacter:\"\\\\ebfd\"});m.arrowCircleRight=new m(\"arrow-circle-right\",{fontCharacter:\"\\\\ebfe\"});m.arrowCircleUp=new m(\"arrow-circle-up\",{fontCharacter:\"\\\\ebff\"});m.heartFilled=new m(\"heart-filled\",{fontCharacter:\"\\\\ec04\"});m.map=new m(\"map\",{fontCharacter:\"\\\\ec05\"});m.mapFilled=new m(\"map-filled\",{fontCharacter:\"\\\\ec06\"});m.circleSmall=new m(\"circle-small\",{fontCharacter:\"\\\\ec07\"});m.bellSlash=new m(\"bell-slash\",{fontCharacter:\"\\\\ec08\"});m.bellSlashDot=new m(\"bell-slash-dot\",{fontCharacter:\"\\\\ec09\"});m.commentUnresolved=new m(\"comment-unresolved\",{fontCharacter:\"\\\\ec0a\"});m.gitPullRequestGoToChanges=new m(\"git-pull-request-go-to-changes\",{fontCharacter:\"\\\\ec0b\"});m.gitPullRequestNewChanges=new m(\"git-pull-request-new-changes\",{fontCharacter:\"\\\\ec0c\"});m.dialogError=new m(\"dialog-error\",m.error.definition);m.dialogWarning=new m(\"dialog-warning\",m.warning.definition);m.dialogInfo=new m(\"dialog-info\",m.info.definition);m.dialogClose=new m(\"dialog-close\",m.close.definition);m.treeItemExpanded=new m(\"tree-item-expanded\",m.chevronDown.definition);m.treeFilterOnTypeOn=new m(\"tree-filter-on-type-on\",m.listFilter.definition);m.treeFilterOnTypeOff=new m(\"tree-filter-on-type-off\",m.listSelection.definition);m.treeFilterClear=new m(\"tree-filter-clear\",m.close.definition);m.treeItemLoading=new m(\"tree-item-loading\",m.loading.definition);m.menuSelection=new m(\"menu-selection\",m.check.definition);m.menuSubmenu=new m(\"menu-submenu\",m.chevronRight.definition);m.menuBarMore=new m(\"menubar-more\",m.more.definition);m.scrollbarButtonLeft=new m(\"scrollbar-button-left\",m.triangleLeft.definition);m.scrollbarButtonRight=new m(\"scrollbar-button-right\",m.triangleRight.definition);m.scrollbarButtonUp=new m(\"scrollbar-button-up\",m.triangleUp.definition);m.scrollbarButtonDown=new m(\"scrollbar-button-down\",m.triangleDown.definition);m.toolBarMore=new m(\"toolbar-more\",m.more.definition);m.quickInputBack=new m(\"quick-input-back\",m.arrowLeft.definition);var Cn;(function(o){o.iconNameSegment=\"[A-Za-z0-9]+\",o.iconNameExpression=\"[A-Za-z0-9-]+\",o.iconModifierExpression=\"~[A-Za-z]+\",o.iconNameCharacter=\"[A-Za-z0-9~-]\";const e=new RegExp(`^(${o.iconNameExpression})(${o.iconModifierExpression})?$`);function t(s){if(s instanceof m)return[\"codicon\",\"codicon-\"+s.id];const r=e.exec(s.id);if(!r)return t(m.error);const[,a,l]=r,c=[\"codicon\",\"codicon-\"+a];return l&&c.push(\"codicon-modifier-\"+l.substr(1)),c}o.asClassNameArray=t;function i(s){return t(s).join(\" \")}o.asClassName=i;function n(s){return\".\"+t(s).join(\".\")}o.asCSSSelector=n})(Cn||(Cn={}));const Ci=qe(\"commandService\"),Ye=new class{constructor(){this._commands=new Map,this._onDidRegisterCommand=new O,this.onDidRegisterCommand=this._onDidRegisterCommand.event}registerCommand(o,e){if(!o)throw new Error(\"invalid command\");if(typeof o==\"string\"){if(!e)throw new Error(\"invalid command\");return this.registerCommand({id:o,handler:e})}if(o.description){const r=[];for(const l of o.description.args)r.push(l.constraint);const a=o.handler;o.handler=function(l,...c){return o6(c,r),a(l,...c)}}const{id:t}=o;let i=this._commands.get(t);i||(i=new wn,this._commands.set(t,i));const n=i.unshift(o),s=ze(()=>{n();const r=this._commands.get(t);r!=null&&r.isEmpty()&&this._commands.delete(t)});return this._onDidRegisterCommand.fire(t),s}registerCommandAlias(o,e){return Ye.registerCommand(o,(t,...i)=>t.get(Ci).executeCommand(e,...i))}getCommand(o){const e=this._commands.get(o);if(!(!e||e.isEmpty()))return Ue.first(e)}getCommands(){const o=new Map;for(const e of this._commands.keys()){const t=this.getCommand(e);t&&o.set(e,t)}return o}};Ye.registerCommand(\"noop\",()=>{});class DB{constructor(e){this.fn=e,this.lastCache=void 0,this.lastArgKey=void 0}get(e){const t=JSON.stringify(e);return this.lastArgKey!==t&&(this.lastArgKey=t,this.lastCache=this.fn(e)),this.lastCache}}class pT{constructor(e){this.fn=e,this._map=new Map}get cachedValues(){return this._map}get(e){if(this._map.has(e))return this._map.get(e);const t=this.fn(e);return this._map.set(e,t),t}}class eg{constructor(e){this.executor=e,this._didRun=!1}hasValue(){return this._didRun}getValue(){if(!this._didRun)try{this._value=this.executor()}catch(e){this._error=e}finally{this._didRun=!0}if(this._error)throw this._error;return this._value}get rawValue(){return this._value}}var jO;function KO(o){return!o||typeof o!=\"string\"?!0:o.trim().length===0}const kB=/{(\\d+)}/g;function tg(o,...e){return e.length===0?o:o.replace(kB,function(t,i){const n=parseInt(i,10);return isNaN(n)||n<0||n>=e.length?t:e[n]})}function Hx(o){return o.replace(/[<>&]/g,function(e){switch(e){case\"<\":return\"&lt;\";case\">\":return\"&gt;\";case\"&\":return\"&amp;\";default:return e}})}function Ds(o){return o.replace(/[\\\\\\{\\}\\*\\+\\?\\|\\^\\$\\.\\[\\]\\(\\)]/g,\"\\\\$&\")}function zx(o,e){if(!o||!e)return o;const t=e.length;if(t===0||o.length===0)return o;let i=0;for(;o.indexOf(e,i)===i;)i=i+t;return o.substring(i)}function xB(o,e){if(!o||!e)return o;const t=e.length,i=o.length;if(t===0||i===0)return o;let n=i,s=-1;for(;s=o.lastIndexOf(e,n-1),!(s===-1||s+t!==n);){if(s===0)return\"\";n=s}return o.substring(0,n)}function IB(o){return o.replace(/[\\-\\\\\\{\\}\\+\\?\\|\\^\\$\\.\\,\\[\\]\\(\\)\\#\\s]/g,\"\\\\$&\").replace(/[\\*]/g,\".*\")}function qO(o,e,t={}){if(!o)throw new Error(\"Cannot create regex from empty string\");e||(o=Ds(o)),t.wholeWord&&(/\\B/.test(o.charAt(0))||(o=\"\\\\b\"+o),/\\B/.test(o.charAt(o.length-1))||(o=o+\"\\\\b\"));let i=\"\";return t.global&&(i+=\"g\"),t.matchCase||(i+=\"i\"),t.multiline&&(i+=\"m\"),t.unicode&&(i+=\"u\"),new RegExp(o,i)}function EB(o){return o.source===\"^\"||o.source===\"^$\"||o.source===\"$\"||o.source===\"^\\\\s*$\"?!1:!!(o.exec(\"\")&&o.lastIndex===0)}function Sw(o){return(o.global?\"g\":\"\")+(o.ignoreCase?\"i\":\"\")+(o.multiline?\"m\":\"\")+(o.unicode?\"u\":\"\")}function Ur(o){return o.split(/\\r\\n|\\r|\\n/)}function Sn(o){for(let e=0,t=o.length;e<t;e++){const i=o.charCodeAt(e);if(i!==32&&i!==9)return e}return-1}function pt(o,e=0,t=o.length){for(let i=e;i<t;i++){const n=o.charCodeAt(i);if(n!==32&&n!==9)return o.substring(e,i)}return o.substring(e,t)}function Fr(o,e=o.length-1){for(let t=e;t>=0;t--){const i=o.charCodeAt(t);if(i!==32&&i!==9)return t}return-1}function Ep(o,e){return o<e?-1:o>e?1:0}function Ux(o,e,t=0,i=o.length,n=0,s=e.length){for(;t<i&&n<s;t++,n++){const l=o.charCodeAt(t),c=e.charCodeAt(n);if(l<c)return-1;if(l>c)return 1}const r=i-t,a=s-n;return r<a?-1:r>a?1:0}function ky(o,e){return $m(o,e,0,o.length,0,e.length)}function $m(o,e,t=0,i=o.length,n=0,s=e.length){for(;t<i&&n<s;t++,n++){let l=o.charCodeAt(t),c=e.charCodeAt(n);if(l===c)continue;if(l>=128||c>=128)return Ux(o.toLowerCase(),e.toLowerCase(),t,i,n,s);Ol(l)&&(l-=32),Ol(c)&&(c-=32);const d=l-c;if(d!==0)return d}const r=i-t,a=s-n;return r<a?-1:r>a?1:0}function P_(o){return o>=48&&o<=57}function Ol(o){return o>=97&&o<=122}function br(o){return o>=65&&o<=90}function su(o,e){return o.length===e.length&&$m(o,e)===0}function $x(o,e){const t=e.length;return e.length>o.length?!1:$m(o,e,0,t)===0}function Pd(o,e){const t=Math.min(o.length,e.length);let i;for(i=0;i<t;i++)if(o.charCodeAt(i)!==e.charCodeAt(i))return i;return t}function Np(o,e){const t=Math.min(o.length,e.length);let i;const n=o.length-1,s=e.length-1;for(i=0;i<t;i++)if(o.charCodeAt(n-i)!==e.charCodeAt(s-i))return i;return t}function wi(o){return 55296<=o&&o<=56319}function Fd(o){return 56320<=o&&o<=57343}function jx(o,e){return(o-55296<<10)+(e-56320)+65536}function F0(o,e,t){const i=o.charCodeAt(t);if(wi(i)&&t+1<e){const n=o.charCodeAt(t+1);if(Fd(n))return jx(i,n)}return i}function NB(o,e){const t=o.charCodeAt(e-1);if(Fd(t)&&e>1){const i=o.charCodeAt(e-2);if(wi(i))return jx(i,t)}return t}class Kx{constructor(e,t=0){this._str=e,this._len=e.length,this._offset=t}get offset(){return this._offset}setOffset(e){this._offset=e}prevCodePoint(){const e=NB(this._str,this._offset);return this._offset-=e>=65536?2:1,e}nextCodePoint(){const e=F0(this._str,this._len,this._offset);return this._offset+=e>=65536?2:1,e}eol(){return this._offset>=this._len}}class B0{constructor(e,t=0){this._iterator=new Kx(e,t)}get offset(){return this._iterator.offset}nextGraphemeLength(){const e=Pl.getInstance(),t=this._iterator,i=t.offset;let n=e.getGraphemeBreakType(t.nextCodePoint());for(;!t.eol();){const s=t.offset,r=e.getGraphemeBreakType(t.nextCodePoint());if(mT(n,r)){t.setOffset(s);break}n=r}return t.offset-i}prevGraphemeLength(){const e=Pl.getInstance(),t=this._iterator,i=t.offset;let n=e.getGraphemeBreakType(t.prevCodePoint());for(;t.offset>0;){const s=t.offset,r=e.getGraphemeBreakType(t.prevCodePoint());if(mT(r,n)){t.setOffset(s);break}n=r}return i-t.offset}eol(){return this._iterator.eol()}}function qx(o,e){return new B0(o,e).nextGraphemeLength()}function GO(o,e){return new B0(o,e).prevGraphemeLength()}function TB(o,e){e>0&&Fd(o.charCodeAt(e))&&e--;const t=e+qx(o,e);return[t-GO(o,t),t]}const MB=/(?:[\\u05BE\\u05C0\\u05C3\\u05C6\\u05D0-\\u05F4\\u0608\\u060B\\u060D\\u061B-\\u064A\\u066D-\\u066F\\u0671-\\u06D5\\u06E5\\u06E6\\u06EE\\u06EF\\u06FA-\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1-\\u07EA\\u07F4\\u07F5\\u07FA\\u07FE-\\u0815\\u081A\\u0824\\u0828\\u0830-\\u0858\\u085E-\\u088E\\u08A0-\\u08C9\\u200F\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFD3D\\uFD50-\\uFDC7\\uFDF0-\\uFDFC\\uFE70-\\uFEFC]|\\uD802[\\uDC00-\\uDD1B\\uDD20-\\uDE00\\uDE10-\\uDE35\\uDE40-\\uDEE4\\uDEEB-\\uDF35\\uDF40-\\uDFFF]|\\uD803[\\uDC00-\\uDD23\\uDE80-\\uDEA9\\uDEAD-\\uDF45\\uDF51-\\uDF81\\uDF86-\\uDFF6]|\\uD83A[\\uDC00-\\uDCCF\\uDD00-\\uDD43\\uDD4B-\\uDFFF]|\\uD83B[\\uDC00-\\uDEBB])/;function ig(o){return MB.test(o)}const AB=/^[\\t\\n\\r\\x20-\\x7E]*$/;function DC(o){return AB.test(o)}const ZO=/[\\u2028\\u2029]/;function YO(o){return ZO.test(o)}function oc(o){return o>=11904&&o<=55215||o>=63744&&o<=64255||o>=65281&&o<=65374}function Gx(o){return o>=127462&&o<=127487||o===8986||o===8987||o===9200||o===9203||o>=9728&&o<=10175||o===11088||o===11093||o>=127744&&o<=128591||o>=128640&&o<=128764||o>=128992&&o<=129008||o>=129280&&o<=129535||o>=129648&&o<=129782}const RB=String.fromCharCode(65279);function Zx(o){return!!(o&&o.length>0&&o.charCodeAt(0)===65279)}function OB(o,e=!1){return o?(e&&(o=o.replace(/\\\\./g,\"\")),o.toLowerCase()!==o):!1}function XO(o){return o=o%(2*26),o<26?String.fromCharCode(97+o):String.fromCharCode(65+o-26)}function mT(o,e){return o===0?e!==5&&e!==7:o===2&&e===3?!1:o===4||o===2||o===3||e===4||e===2||e===3?!0:!(o===8&&(e===8||e===9||e===11||e===12)||(o===11||o===9)&&(e===9||e===10)||(o===12||o===10)&&e===10||e===5||e===13||e===7||o===1||o===13&&e===14||o===6&&e===6)}class Pl{constructor(){this._data=PB()}static getInstance(){return Pl._INSTANCE||(Pl._INSTANCE=new Pl),Pl._INSTANCE}getGraphemeBreakType(e){if(e<32)return e===10?3:e===13?2:4;if(e<127)return 0;const t=this._data,i=t.length/3;let n=1;for(;n<=i;)if(e<t[3*n])n=2*n;else if(e>t[3*n+1])n=2*n+1;else return t[3*n+2];return 0}}Pl._INSTANCE=null;function PB(){return JSON.parse(\"[0,0,0,51229,51255,12,44061,44087,12,127462,127487,6,7083,7085,5,47645,47671,12,54813,54839,12,128678,128678,14,3270,3270,5,9919,9923,14,45853,45879,12,49437,49463,12,53021,53047,12,71216,71218,7,128398,128399,14,129360,129374,14,2519,2519,5,4448,4519,9,9742,9742,14,12336,12336,14,44957,44983,12,46749,46775,12,48541,48567,12,50333,50359,12,52125,52151,12,53917,53943,12,69888,69890,5,73018,73018,5,127990,127990,14,128558,128559,14,128759,128760,14,129653,129655,14,2027,2035,5,2891,2892,7,3761,3761,5,6683,6683,5,8293,8293,4,9825,9826,14,9999,9999,14,43452,43453,5,44509,44535,12,45405,45431,12,46301,46327,12,47197,47223,12,48093,48119,12,48989,49015,12,49885,49911,12,50781,50807,12,51677,51703,12,52573,52599,12,53469,53495,12,54365,54391,12,65279,65279,4,70471,70472,7,72145,72147,7,119173,119179,5,127799,127818,14,128240,128244,14,128512,128512,14,128652,128652,14,128721,128722,14,129292,129292,14,129445,129450,14,129734,129743,14,1476,1477,5,2366,2368,7,2750,2752,7,3076,3076,5,3415,3415,5,4141,4144,5,6109,6109,5,6964,6964,5,7394,7400,5,9197,9198,14,9770,9770,14,9877,9877,14,9968,9969,14,10084,10084,14,43052,43052,5,43713,43713,5,44285,44311,12,44733,44759,12,45181,45207,12,45629,45655,12,46077,46103,12,46525,46551,12,46973,46999,12,47421,47447,12,47869,47895,12,48317,48343,12,48765,48791,12,49213,49239,12,49661,49687,12,50109,50135,12,50557,50583,12,51005,51031,12,51453,51479,12,51901,51927,12,52349,52375,12,52797,52823,12,53245,53271,12,53693,53719,12,54141,54167,12,54589,54615,12,55037,55063,12,69506,69509,5,70191,70193,5,70841,70841,7,71463,71467,5,72330,72342,5,94031,94031,5,123628,123631,5,127763,127765,14,127941,127941,14,128043,128062,14,128302,128317,14,128465,128467,14,128539,128539,14,128640,128640,14,128662,128662,14,128703,128703,14,128745,128745,14,129004,129007,14,129329,129330,14,129402,129402,14,129483,129483,14,129686,129704,14,130048,131069,14,173,173,4,1757,1757,1,2200,2207,5,2434,2435,7,2631,2632,5,2817,2817,5,3008,3008,5,3201,3201,5,3387,3388,5,3542,3542,5,3902,3903,7,4190,4192,5,6002,6003,5,6439,6440,5,6765,6770,7,7019,7027,5,7154,7155,7,8205,8205,13,8505,8505,14,9654,9654,14,9757,9757,14,9792,9792,14,9852,9853,14,9890,9894,14,9937,9937,14,9981,9981,14,10035,10036,14,11035,11036,14,42654,42655,5,43346,43347,7,43587,43587,5,44006,44007,7,44173,44199,12,44397,44423,12,44621,44647,12,44845,44871,12,45069,45095,12,45293,45319,12,45517,45543,12,45741,45767,12,45965,45991,12,46189,46215,12,46413,46439,12,46637,46663,12,46861,46887,12,47085,47111,12,47309,47335,12,47533,47559,12,47757,47783,12,47981,48007,12,48205,48231,12,48429,48455,12,48653,48679,12,48877,48903,12,49101,49127,12,49325,49351,12,49549,49575,12,49773,49799,12,49997,50023,12,50221,50247,12,50445,50471,12,50669,50695,12,50893,50919,12,51117,51143,12,51341,51367,12,51565,51591,12,51789,51815,12,52013,52039,12,52237,52263,12,52461,52487,12,52685,52711,12,52909,52935,12,53133,53159,12,53357,53383,12,53581,53607,12,53805,53831,12,54029,54055,12,54253,54279,12,54477,54503,12,54701,54727,12,54925,54951,12,55149,55175,12,68101,68102,5,69762,69762,7,70067,70069,7,70371,70378,5,70720,70721,7,71087,71087,5,71341,71341,5,71995,71996,5,72249,72249,7,72850,72871,5,73109,73109,5,118576,118598,5,121505,121519,5,127245,127247,14,127568,127569,14,127777,127777,14,127872,127891,14,127956,127967,14,128015,128016,14,128110,128172,14,128259,128259,14,128367,128368,14,128424,128424,14,128488,128488,14,128530,128532,14,128550,128551,14,128566,128566,14,128647,128647,14,128656,128656,14,128667,128673,14,128691,128693,14,128715,128715,14,128728,128732,14,128752,128752,14,128765,128767,14,129096,129103,14,129311,129311,14,129344,129349,14,129394,129394,14,129413,129425,14,129466,129471,14,129511,129535,14,129664,129666,14,129719,129722,14,129760,129767,14,917536,917631,5,13,13,2,1160,1161,5,1564,1564,4,1807,1807,1,2085,2087,5,2307,2307,7,2382,2383,7,2497,2500,5,2563,2563,7,2677,2677,5,2763,2764,7,2879,2879,5,2914,2915,5,3021,3021,5,3142,3144,5,3263,3263,5,3285,3286,5,3398,3400,7,3530,3530,5,3633,3633,5,3864,3865,5,3974,3975,5,4155,4156,7,4229,4230,5,5909,5909,7,6078,6085,7,6277,6278,5,6451,6456,7,6744,6750,5,6846,6846,5,6972,6972,5,7074,7077,5,7146,7148,7,7222,7223,5,7416,7417,5,8234,8238,4,8417,8417,5,9000,9000,14,9203,9203,14,9730,9731,14,9748,9749,14,9762,9763,14,9776,9783,14,9800,9811,14,9831,9831,14,9872,9873,14,9882,9882,14,9900,9903,14,9929,9933,14,9941,9960,14,9974,9974,14,9989,9989,14,10006,10006,14,10062,10062,14,10160,10160,14,11647,11647,5,12953,12953,14,43019,43019,5,43232,43249,5,43443,43443,5,43567,43568,7,43696,43696,5,43765,43765,7,44013,44013,5,44117,44143,12,44229,44255,12,44341,44367,12,44453,44479,12,44565,44591,12,44677,44703,12,44789,44815,12,44901,44927,12,45013,45039,12,45125,45151,12,45237,45263,12,45349,45375,12,45461,45487,12,45573,45599,12,45685,45711,12,45797,45823,12,45909,45935,12,46021,46047,12,46133,46159,12,46245,46271,12,46357,46383,12,46469,46495,12,46581,46607,12,46693,46719,12,46805,46831,12,46917,46943,12,47029,47055,12,47141,47167,12,47253,47279,12,47365,47391,12,47477,47503,12,47589,47615,12,47701,47727,12,47813,47839,12,47925,47951,12,48037,48063,12,48149,48175,12,48261,48287,12,48373,48399,12,48485,48511,12,48597,48623,12,48709,48735,12,48821,48847,12,48933,48959,12,49045,49071,12,49157,49183,12,49269,49295,12,49381,49407,12,49493,49519,12,49605,49631,12,49717,49743,12,49829,49855,12,49941,49967,12,50053,50079,12,50165,50191,12,50277,50303,12,50389,50415,12,50501,50527,12,50613,50639,12,50725,50751,12,50837,50863,12,50949,50975,12,51061,51087,12,51173,51199,12,51285,51311,12,51397,51423,12,51509,51535,12,51621,51647,12,51733,51759,12,51845,51871,12,51957,51983,12,52069,52095,12,52181,52207,12,52293,52319,12,52405,52431,12,52517,52543,12,52629,52655,12,52741,52767,12,52853,52879,12,52965,52991,12,53077,53103,12,53189,53215,12,53301,53327,12,53413,53439,12,53525,53551,12,53637,53663,12,53749,53775,12,53861,53887,12,53973,53999,12,54085,54111,12,54197,54223,12,54309,54335,12,54421,54447,12,54533,54559,12,54645,54671,12,54757,54783,12,54869,54895,12,54981,55007,12,55093,55119,12,55243,55291,10,66045,66045,5,68325,68326,5,69688,69702,5,69817,69818,5,69957,69958,7,70089,70092,5,70198,70199,5,70462,70462,5,70502,70508,5,70750,70750,5,70846,70846,7,71100,71101,5,71230,71230,7,71351,71351,5,71737,71738,5,72000,72000,7,72160,72160,5,72273,72278,5,72752,72758,5,72882,72883,5,73031,73031,5,73461,73462,7,94192,94193,7,119149,119149,7,121403,121452,5,122915,122916,5,126980,126980,14,127358,127359,14,127535,127535,14,127759,127759,14,127771,127771,14,127792,127793,14,127825,127867,14,127897,127899,14,127945,127945,14,127985,127986,14,128000,128007,14,128021,128021,14,128066,128100,14,128184,128235,14,128249,128252,14,128266,128276,14,128335,128335,14,128379,128390,14,128407,128419,14,128444,128444,14,128481,128481,14,128499,128499,14,128526,128526,14,128536,128536,14,128543,128543,14,128556,128556,14,128564,128564,14,128577,128580,14,128643,128645,14,128649,128649,14,128654,128654,14,128660,128660,14,128664,128664,14,128675,128675,14,128686,128689,14,128695,128696,14,128705,128709,14,128717,128719,14,128725,128725,14,128736,128741,14,128747,128748,14,128755,128755,14,128762,128762,14,128981,128991,14,129009,129023,14,129160,129167,14,129296,129304,14,129320,129327,14,129340,129342,14,129356,129356,14,129388,129392,14,129399,129400,14,129404,129407,14,129432,129442,14,129454,129455,14,129473,129474,14,129485,129487,14,129648,129651,14,129659,129660,14,129671,129679,14,129709,129711,14,129728,129730,14,129751,129753,14,129776,129782,14,917505,917505,4,917760,917999,5,10,10,3,127,159,4,768,879,5,1471,1471,5,1536,1541,1,1648,1648,5,1767,1768,5,1840,1866,5,2070,2073,5,2137,2139,5,2274,2274,1,2363,2363,7,2377,2380,7,2402,2403,5,2494,2494,5,2507,2508,7,2558,2558,5,2622,2624,7,2641,2641,5,2691,2691,7,2759,2760,5,2786,2787,5,2876,2876,5,2881,2884,5,2901,2902,5,3006,3006,5,3014,3016,7,3072,3072,5,3134,3136,5,3157,3158,5,3260,3260,5,3266,3266,5,3274,3275,7,3328,3329,5,3391,3392,7,3405,3405,5,3457,3457,5,3536,3537,7,3551,3551,5,3636,3642,5,3764,3772,5,3895,3895,5,3967,3967,7,3993,4028,5,4146,4151,5,4182,4183,7,4226,4226,5,4253,4253,5,4957,4959,5,5940,5940,7,6070,6070,7,6087,6088,7,6158,6158,4,6432,6434,5,6448,6449,7,6679,6680,5,6742,6742,5,6754,6754,5,6783,6783,5,6912,6915,5,6966,6970,5,6978,6978,5,7042,7042,7,7080,7081,5,7143,7143,7,7150,7150,7,7212,7219,5,7380,7392,5,7412,7412,5,8203,8203,4,8232,8232,4,8265,8265,14,8400,8412,5,8421,8432,5,8617,8618,14,9167,9167,14,9200,9200,14,9410,9410,14,9723,9726,14,9733,9733,14,9745,9745,14,9752,9752,14,9760,9760,14,9766,9766,14,9774,9774,14,9786,9786,14,9794,9794,14,9823,9823,14,9828,9828,14,9833,9850,14,9855,9855,14,9875,9875,14,9880,9880,14,9885,9887,14,9896,9897,14,9906,9916,14,9926,9927,14,9935,9935,14,9939,9939,14,9962,9962,14,9972,9972,14,9978,9978,14,9986,9986,14,9997,9997,14,10002,10002,14,10017,10017,14,10055,10055,14,10071,10071,14,10133,10135,14,10548,10549,14,11093,11093,14,12330,12333,5,12441,12442,5,42608,42610,5,43010,43010,5,43045,43046,5,43188,43203,7,43302,43309,5,43392,43394,5,43446,43449,5,43493,43493,5,43571,43572,7,43597,43597,7,43703,43704,5,43756,43757,5,44003,44004,7,44009,44010,7,44033,44059,12,44089,44115,12,44145,44171,12,44201,44227,12,44257,44283,12,44313,44339,12,44369,44395,12,44425,44451,12,44481,44507,12,44537,44563,12,44593,44619,12,44649,44675,12,44705,44731,12,44761,44787,12,44817,44843,12,44873,44899,12,44929,44955,12,44985,45011,12,45041,45067,12,45097,45123,12,45153,45179,12,45209,45235,12,45265,45291,12,45321,45347,12,45377,45403,12,45433,45459,12,45489,45515,12,45545,45571,12,45601,45627,12,45657,45683,12,45713,45739,12,45769,45795,12,45825,45851,12,45881,45907,12,45937,45963,12,45993,46019,12,46049,46075,12,46105,46131,12,46161,46187,12,46217,46243,12,46273,46299,12,46329,46355,12,46385,46411,12,46441,46467,12,46497,46523,12,46553,46579,12,46609,46635,12,46665,46691,12,46721,46747,12,46777,46803,12,46833,46859,12,46889,46915,12,46945,46971,12,47001,47027,12,47057,47083,12,47113,47139,12,47169,47195,12,47225,47251,12,47281,47307,12,47337,47363,12,47393,47419,12,47449,47475,12,47505,47531,12,47561,47587,12,47617,47643,12,47673,47699,12,47729,47755,12,47785,47811,12,47841,47867,12,47897,47923,12,47953,47979,12,48009,48035,12,48065,48091,12,48121,48147,12,48177,48203,12,48233,48259,12,48289,48315,12,48345,48371,12,48401,48427,12,48457,48483,12,48513,48539,12,48569,48595,12,48625,48651,12,48681,48707,12,48737,48763,12,48793,48819,12,48849,48875,12,48905,48931,12,48961,48987,12,49017,49043,12,49073,49099,12,49129,49155,12,49185,49211,12,49241,49267,12,49297,49323,12,49353,49379,12,49409,49435,12,49465,49491,12,49521,49547,12,49577,49603,12,49633,49659,12,49689,49715,12,49745,49771,12,49801,49827,12,49857,49883,12,49913,49939,12,49969,49995,12,50025,50051,12,50081,50107,12,50137,50163,12,50193,50219,12,50249,50275,12,50305,50331,12,50361,50387,12,50417,50443,12,50473,50499,12,50529,50555,12,50585,50611,12,50641,50667,12,50697,50723,12,50753,50779,12,50809,50835,12,50865,50891,12,50921,50947,12,50977,51003,12,51033,51059,12,51089,51115,12,51145,51171,12,51201,51227,12,51257,51283,12,51313,51339,12,51369,51395,12,51425,51451,12,51481,51507,12,51537,51563,12,51593,51619,12,51649,51675,12,51705,51731,12,51761,51787,12,51817,51843,12,51873,51899,12,51929,51955,12,51985,52011,12,52041,52067,12,52097,52123,12,52153,52179,12,52209,52235,12,52265,52291,12,52321,52347,12,52377,52403,12,52433,52459,12,52489,52515,12,52545,52571,12,52601,52627,12,52657,52683,12,52713,52739,12,52769,52795,12,52825,52851,12,52881,52907,12,52937,52963,12,52993,53019,12,53049,53075,12,53105,53131,12,53161,53187,12,53217,53243,12,53273,53299,12,53329,53355,12,53385,53411,12,53441,53467,12,53497,53523,12,53553,53579,12,53609,53635,12,53665,53691,12,53721,53747,12,53777,53803,12,53833,53859,12,53889,53915,12,53945,53971,12,54001,54027,12,54057,54083,12,54113,54139,12,54169,54195,12,54225,54251,12,54281,54307,12,54337,54363,12,54393,54419,12,54449,54475,12,54505,54531,12,54561,54587,12,54617,54643,12,54673,54699,12,54729,54755,12,54785,54811,12,54841,54867,12,54897,54923,12,54953,54979,12,55009,55035,12,55065,55091,12,55121,55147,12,55177,55203,12,65024,65039,5,65520,65528,4,66422,66426,5,68152,68154,5,69291,69292,5,69633,69633,5,69747,69748,5,69811,69814,5,69826,69826,5,69932,69932,7,70016,70017,5,70079,70080,7,70095,70095,5,70196,70196,5,70367,70367,5,70402,70403,7,70464,70464,5,70487,70487,5,70709,70711,7,70725,70725,7,70833,70834,7,70843,70844,7,70849,70849,7,71090,71093,5,71103,71104,5,71227,71228,7,71339,71339,5,71344,71349,5,71458,71461,5,71727,71735,5,71985,71989,7,71998,71998,5,72002,72002,7,72154,72155,5,72193,72202,5,72251,72254,5,72281,72283,5,72344,72345,5,72766,72766,7,72874,72880,5,72885,72886,5,73023,73029,5,73104,73105,5,73111,73111,5,92912,92916,5,94095,94098,5,113824,113827,4,119142,119142,7,119155,119162,4,119362,119364,5,121476,121476,5,122888,122904,5,123184,123190,5,125252,125258,5,127183,127183,14,127340,127343,14,127377,127386,14,127491,127503,14,127548,127551,14,127744,127756,14,127761,127761,14,127769,127769,14,127773,127774,14,127780,127788,14,127796,127797,14,127820,127823,14,127869,127869,14,127894,127895,14,127902,127903,14,127943,127943,14,127947,127950,14,127972,127972,14,127988,127988,14,127992,127994,14,128009,128011,14,128019,128019,14,128023,128041,14,128064,128064,14,128102,128107,14,128174,128181,14,128238,128238,14,128246,128247,14,128254,128254,14,128264,128264,14,128278,128299,14,128329,128330,14,128348,128359,14,128371,128377,14,128392,128393,14,128401,128404,14,128421,128421,14,128433,128434,14,128450,128452,14,128476,128478,14,128483,128483,14,128495,128495,14,128506,128506,14,128519,128520,14,128528,128528,14,128534,128534,14,128538,128538,14,128540,128542,14,128544,128549,14,128552,128555,14,128557,128557,14,128560,128563,14,128565,128565,14,128567,128576,14,128581,128591,14,128641,128642,14,128646,128646,14,128648,128648,14,128650,128651,14,128653,128653,14,128655,128655,14,128657,128659,14,128661,128661,14,128663,128663,14,128665,128666,14,128674,128674,14,128676,128677,14,128679,128685,14,128690,128690,14,128694,128694,14,128697,128702,14,128704,128704,14,128710,128714,14,128716,128716,14,128720,128720,14,128723,128724,14,128726,128727,14,128733,128735,14,128742,128744,14,128746,128746,14,128749,128751,14,128753,128754,14,128756,128758,14,128761,128761,14,128763,128764,14,128884,128895,14,128992,129003,14,129008,129008,14,129036,129039,14,129114,129119,14,129198,129279,14,129293,129295,14,129305,129310,14,129312,129319,14,129328,129328,14,129331,129338,14,129343,129343,14,129351,129355,14,129357,129359,14,129375,129387,14,129393,129393,14,129395,129398,14,129401,129401,14,129403,129403,14,129408,129412,14,129426,129431,14,129443,129444,14,129451,129453,14,129456,129465,14,129472,129472,14,129475,129482,14,129484,129484,14,129488,129510,14,129536,129647,14,129652,129652,14,129656,129658,14,129661,129663,14,129667,129670,14,129680,129685,14,129705,129708,14,129712,129718,14,129723,129727,14,129731,129733,14,129744,129750,14,129754,129759,14,129768,129775,14,129783,129791,14,917504,917504,4,917506,917535,4,917632,917759,4,918000,921599,4,0,9,4,11,12,4,14,31,4,169,169,14,174,174,14,1155,1159,5,1425,1469,5,1473,1474,5,1479,1479,5,1552,1562,5,1611,1631,5,1750,1756,5,1759,1764,5,1770,1773,5,1809,1809,5,1958,1968,5,2045,2045,5,2075,2083,5,2089,2093,5,2192,2193,1,2250,2273,5,2275,2306,5,2362,2362,5,2364,2364,5,2369,2376,5,2381,2381,5,2385,2391,5,2433,2433,5,2492,2492,5,2495,2496,7,2503,2504,7,2509,2509,5,2530,2531,5,2561,2562,5,2620,2620,5,2625,2626,5,2635,2637,5,2672,2673,5,2689,2690,5,2748,2748,5,2753,2757,5,2761,2761,7,2765,2765,5,2810,2815,5,2818,2819,7,2878,2878,5,2880,2880,7,2887,2888,7,2893,2893,5,2903,2903,5,2946,2946,5,3007,3007,7,3009,3010,7,3018,3020,7,3031,3031,5,3073,3075,7,3132,3132,5,3137,3140,7,3146,3149,5,3170,3171,5,3202,3203,7,3262,3262,7,3264,3265,7,3267,3268,7,3271,3272,7,3276,3277,5,3298,3299,5,3330,3331,7,3390,3390,5,3393,3396,5,3402,3404,7,3406,3406,1,3426,3427,5,3458,3459,7,3535,3535,5,3538,3540,5,3544,3550,7,3570,3571,7,3635,3635,7,3655,3662,5,3763,3763,7,3784,3789,5,3893,3893,5,3897,3897,5,3953,3966,5,3968,3972,5,3981,3991,5,4038,4038,5,4145,4145,7,4153,4154,5,4157,4158,5,4184,4185,5,4209,4212,5,4228,4228,7,4237,4237,5,4352,4447,8,4520,4607,10,5906,5908,5,5938,5939,5,5970,5971,5,6068,6069,5,6071,6077,5,6086,6086,5,6089,6099,5,6155,6157,5,6159,6159,5,6313,6313,5,6435,6438,7,6441,6443,7,6450,6450,5,6457,6459,5,6681,6682,7,6741,6741,7,6743,6743,7,6752,6752,5,6757,6764,5,6771,6780,5,6832,6845,5,6847,6862,5,6916,6916,7,6965,6965,5,6971,6971,7,6973,6977,7,6979,6980,7,7040,7041,5,7073,7073,7,7078,7079,7,7082,7082,7,7142,7142,5,7144,7145,5,7149,7149,5,7151,7153,5,7204,7211,7,7220,7221,7,7376,7378,5,7393,7393,7,7405,7405,5,7415,7415,7,7616,7679,5,8204,8204,5,8206,8207,4,8233,8233,4,8252,8252,14,8288,8292,4,8294,8303,4,8413,8416,5,8418,8420,5,8482,8482,14,8596,8601,14,8986,8987,14,9096,9096,14,9193,9196,14,9199,9199,14,9201,9202,14,9208,9210,14,9642,9643,14,9664,9664,14,9728,9729,14,9732,9732,14,9735,9741,14,9743,9744,14,9746,9746,14,9750,9751,14,9753,9756,14,9758,9759,14,9761,9761,14,9764,9765,14,9767,9769,14,9771,9773,14,9775,9775,14,9784,9785,14,9787,9791,14,9793,9793,14,9795,9799,14,9812,9822,14,9824,9824,14,9827,9827,14,9829,9830,14,9832,9832,14,9851,9851,14,9854,9854,14,9856,9861,14,9874,9874,14,9876,9876,14,9878,9879,14,9881,9881,14,9883,9884,14,9888,9889,14,9895,9895,14,9898,9899,14,9904,9905,14,9917,9918,14,9924,9925,14,9928,9928,14,9934,9934,14,9936,9936,14,9938,9938,14,9940,9940,14,9961,9961,14,9963,9967,14,9970,9971,14,9973,9973,14,9975,9977,14,9979,9980,14,9982,9985,14,9987,9988,14,9992,9996,14,9998,9998,14,10000,10001,14,10004,10004,14,10013,10013,14,10024,10024,14,10052,10052,14,10060,10060,14,10067,10069,14,10083,10083,14,10085,10087,14,10145,10145,14,10175,10175,14,11013,11015,14,11088,11088,14,11503,11505,5,11744,11775,5,12334,12335,5,12349,12349,14,12951,12951,14,42607,42607,5,42612,42621,5,42736,42737,5,43014,43014,5,43043,43044,7,43047,43047,7,43136,43137,7,43204,43205,5,43263,43263,5,43335,43345,5,43360,43388,8,43395,43395,7,43444,43445,7,43450,43451,7,43454,43456,7,43561,43566,5,43569,43570,5,43573,43574,5,43596,43596,5,43644,43644,5,43698,43700,5,43710,43711,5,43755,43755,7,43758,43759,7,43766,43766,5,44005,44005,5,44008,44008,5,44012,44012,7,44032,44032,11,44060,44060,11,44088,44088,11,44116,44116,11,44144,44144,11,44172,44172,11,44200,44200,11,44228,44228,11,44256,44256,11,44284,44284,11,44312,44312,11,44340,44340,11,44368,44368,11,44396,44396,11,44424,44424,11,44452,44452,11,44480,44480,11,44508,44508,11,44536,44536,11,44564,44564,11,44592,44592,11,44620,44620,11,44648,44648,11,44676,44676,11,44704,44704,11,44732,44732,11,44760,44760,11,44788,44788,11,44816,44816,11,44844,44844,11,44872,44872,11,44900,44900,11,44928,44928,11,44956,44956,11,44984,44984,11,45012,45012,11,45040,45040,11,45068,45068,11,45096,45096,11,45124,45124,11,45152,45152,11,45180,45180,11,45208,45208,11,45236,45236,11,45264,45264,11,45292,45292,11,45320,45320,11,45348,45348,11,45376,45376,11,45404,45404,11,45432,45432,11,45460,45460,11,45488,45488,11,45516,45516,11,45544,45544,11,45572,45572,11,45600,45600,11,45628,45628,11,45656,45656,11,45684,45684,11,45712,45712,11,45740,45740,11,45768,45768,11,45796,45796,11,45824,45824,11,45852,45852,11,45880,45880,11,45908,45908,11,45936,45936,11,45964,45964,11,45992,45992,11,46020,46020,11,46048,46048,11,46076,46076,11,46104,46104,11,46132,46132,11,46160,46160,11,46188,46188,11,46216,46216,11,46244,46244,11,46272,46272,11,46300,46300,11,46328,46328,11,46356,46356,11,46384,46384,11,46412,46412,11,46440,46440,11,46468,46468,11,46496,46496,11,46524,46524,11,46552,46552,11,46580,46580,11,46608,46608,11,46636,46636,11,46664,46664,11,46692,46692,11,46720,46720,11,46748,46748,11,46776,46776,11,46804,46804,11,46832,46832,11,46860,46860,11,46888,46888,11,46916,46916,11,46944,46944,11,46972,46972,11,47000,47000,11,47028,47028,11,47056,47056,11,47084,47084,11,47112,47112,11,47140,47140,11,47168,47168,11,47196,47196,11,47224,47224,11,47252,47252,11,47280,47280,11,47308,47308,11,47336,47336,11,47364,47364,11,47392,47392,11,47420,47420,11,47448,47448,11,47476,47476,11,47504,47504,11,47532,47532,11,47560,47560,11,47588,47588,11,47616,47616,11,47644,47644,11,47672,47672,11,47700,47700,11,47728,47728,11,47756,47756,11,47784,47784,11,47812,47812,11,47840,47840,11,47868,47868,11,47896,47896,11,47924,47924,11,47952,47952,11,47980,47980,11,48008,48008,11,48036,48036,11,48064,48064,11,48092,48092,11,48120,48120,11,48148,48148,11,48176,48176,11,48204,48204,11,48232,48232,11,48260,48260,11,48288,48288,11,48316,48316,11,48344,48344,11,48372,48372,11,48400,48400,11,48428,48428,11,48456,48456,11,48484,48484,11,48512,48512,11,48540,48540,11,48568,48568,11,48596,48596,11,48624,48624,11,48652,48652,11,48680,48680,11,48708,48708,11,48736,48736,11,48764,48764,11,48792,48792,11,48820,48820,11,48848,48848,11,48876,48876,11,48904,48904,11,48932,48932,11,48960,48960,11,48988,48988,11,49016,49016,11,49044,49044,11,49072,49072,11,49100,49100,11,49128,49128,11,49156,49156,11,49184,49184,11,49212,49212,11,49240,49240,11,49268,49268,11,49296,49296,11,49324,49324,11,49352,49352,11,49380,49380,11,49408,49408,11,49436,49436,11,49464,49464,11,49492,49492,11,49520,49520,11,49548,49548,11,49576,49576,11,49604,49604,11,49632,49632,11,49660,49660,11,49688,49688,11,49716,49716,11,49744,49744,11,49772,49772,11,49800,49800,11,49828,49828,11,49856,49856,11,49884,49884,11,49912,49912,11,49940,49940,11,49968,49968,11,49996,49996,11,50024,50024,11,50052,50052,11,50080,50080,11,50108,50108,11,50136,50136,11,50164,50164,11,50192,50192,11,50220,50220,11,50248,50248,11,50276,50276,11,50304,50304,11,50332,50332,11,50360,50360,11,50388,50388,11,50416,50416,11,50444,50444,11,50472,50472,11,50500,50500,11,50528,50528,11,50556,50556,11,50584,50584,11,50612,50612,11,50640,50640,11,50668,50668,11,50696,50696,11,50724,50724,11,50752,50752,11,50780,50780,11,50808,50808,11,50836,50836,11,50864,50864,11,50892,50892,11,50920,50920,11,50948,50948,11,50976,50976,11,51004,51004,11,51032,51032,11,51060,51060,11,51088,51088,11,51116,51116,11,51144,51144,11,51172,51172,11,51200,51200,11,51228,51228,11,51256,51256,11,51284,51284,11,51312,51312,11,51340,51340,11,51368,51368,11,51396,51396,11,51424,51424,11,51452,51452,11,51480,51480,11,51508,51508,11,51536,51536,11,51564,51564,11,51592,51592,11,51620,51620,11,51648,51648,11,51676,51676,11,51704,51704,11,51732,51732,11,51760,51760,11,51788,51788,11,51816,51816,11,51844,51844,11,51872,51872,11,51900,51900,11,51928,51928,11,51956,51956,11,51984,51984,11,52012,52012,11,52040,52040,11,52068,52068,11,52096,52096,11,52124,52124,11,52152,52152,11,52180,52180,11,52208,52208,11,52236,52236,11,52264,52264,11,52292,52292,11,52320,52320,11,52348,52348,11,52376,52376,11,52404,52404,11,52432,52432,11,52460,52460,11,52488,52488,11,52516,52516,11,52544,52544,11,52572,52572,11,52600,52600,11,52628,52628,11,52656,52656,11,52684,52684,11,52712,52712,11,52740,52740,11,52768,52768,11,52796,52796,11,52824,52824,11,52852,52852,11,52880,52880,11,52908,52908,11,52936,52936,11,52964,52964,11,52992,52992,11,53020,53020,11,53048,53048,11,53076,53076,11,53104,53104,11,53132,53132,11,53160,53160,11,53188,53188,11,53216,53216,11,53244,53244,11,53272,53272,11,53300,53300,11,53328,53328,11,53356,53356,11,53384,53384,11,53412,53412,11,53440,53440,11,53468,53468,11,53496,53496,11,53524,53524,11,53552,53552,11,53580,53580,11,53608,53608,11,53636,53636,11,53664,53664,11,53692,53692,11,53720,53720,11,53748,53748,11,53776,53776,11,53804,53804,11,53832,53832,11,53860,53860,11,53888,53888,11,53916,53916,11,53944,53944,11,53972,53972,11,54000,54000,11,54028,54028,11,54056,54056,11,54084,54084,11,54112,54112,11,54140,54140,11,54168,54168,11,54196,54196,11,54224,54224,11,54252,54252,11,54280,54280,11,54308,54308,11,54336,54336,11,54364,54364,11,54392,54392,11,54420,54420,11,54448,54448,11,54476,54476,11,54504,54504,11,54532,54532,11,54560,54560,11,54588,54588,11,54616,54616,11,54644,54644,11,54672,54672,11,54700,54700,11,54728,54728,11,54756,54756,11,54784,54784,11,54812,54812,11,54840,54840,11,54868,54868,11,54896,54896,11,54924,54924,11,54952,54952,11,54980,54980,11,55008,55008,11,55036,55036,11,55064,55064,11,55092,55092,11,55120,55120,11,55148,55148,11,55176,55176,11,55216,55238,9,64286,64286,5,65056,65071,5,65438,65439,5,65529,65531,4,66272,66272,5,68097,68099,5,68108,68111,5,68159,68159,5,68900,68903,5,69446,69456,5,69632,69632,7,69634,69634,7,69744,69744,5,69759,69761,5,69808,69810,7,69815,69816,7,69821,69821,1,69837,69837,1,69927,69931,5,69933,69940,5,70003,70003,5,70018,70018,7,70070,70078,5,70082,70083,1,70094,70094,7,70188,70190,7,70194,70195,7,70197,70197,7,70206,70206,5,70368,70370,7,70400,70401,5,70459,70460,5,70463,70463,7,70465,70468,7,70475,70477,7,70498,70499,7,70512,70516,5,70712,70719,5,70722,70724,5,70726,70726,5,70832,70832,5,70835,70840,5,70842,70842,5,70845,70845,5,70847,70848,5,70850,70851,5,71088,71089,7,71096,71099,7,71102,71102,7,71132,71133,5,71219,71226,5,71229,71229,5,71231,71232,5,71340,71340,7,71342,71343,7,71350,71350,7,71453,71455,5,71462,71462,7,71724,71726,7,71736,71736,7,71984,71984,5,71991,71992,7,71997,71997,7,71999,71999,1,72001,72001,1,72003,72003,5,72148,72151,5,72156,72159,7,72164,72164,7,72243,72248,5,72250,72250,1,72263,72263,5,72279,72280,7,72324,72329,1,72343,72343,7,72751,72751,7,72760,72765,5,72767,72767,5,72873,72873,7,72881,72881,7,72884,72884,7,73009,73014,5,73020,73021,5,73030,73030,1,73098,73102,7,73107,73108,7,73110,73110,7,73459,73460,5,78896,78904,4,92976,92982,5,94033,94087,7,94180,94180,5,113821,113822,5,118528,118573,5,119141,119141,5,119143,119145,5,119150,119154,5,119163,119170,5,119210,119213,5,121344,121398,5,121461,121461,5,121499,121503,5,122880,122886,5,122907,122913,5,122918,122922,5,123566,123566,5,125136,125142,5,126976,126979,14,126981,127182,14,127184,127231,14,127279,127279,14,127344,127345,14,127374,127374,14,127405,127461,14,127489,127490,14,127514,127514,14,127538,127546,14,127561,127567,14,127570,127743,14,127757,127758,14,127760,127760,14,127762,127762,14,127766,127768,14,127770,127770,14,127772,127772,14,127775,127776,14,127778,127779,14,127789,127791,14,127794,127795,14,127798,127798,14,127819,127819,14,127824,127824,14,127868,127868,14,127870,127871,14,127892,127893,14,127896,127896,14,127900,127901,14,127904,127940,14,127942,127942,14,127944,127944,14,127946,127946,14,127951,127955,14,127968,127971,14,127973,127984,14,127987,127987,14,127989,127989,14,127991,127991,14,127995,127999,5,128008,128008,14,128012,128014,14,128017,128018,14,128020,128020,14,128022,128022,14,128042,128042,14,128063,128063,14,128065,128065,14,128101,128101,14,128108,128109,14,128173,128173,14,128182,128183,14,128236,128237,14,128239,128239,14,128245,128245,14,128248,128248,14,128253,128253,14,128255,128258,14,128260,128263,14,128265,128265,14,128277,128277,14,128300,128301,14,128326,128328,14,128331,128334,14,128336,128347,14,128360,128366,14,128369,128370,14,128378,128378,14,128391,128391,14,128394,128397,14,128400,128400,14,128405,128406,14,128420,128420,14,128422,128423,14,128425,128432,14,128435,128443,14,128445,128449,14,128453,128464,14,128468,128475,14,128479,128480,14,128482,128482,14,128484,128487,14,128489,128494,14,128496,128498,14,128500,128505,14,128507,128511,14,128513,128518,14,128521,128525,14,128527,128527,14,128529,128529,14,128533,128533,14,128535,128535,14,128537,128537,14]\")}function FB(o,e){if(o===0)return 0;const t=BB(o,e);if(t!==void 0)return t;const i=new Kx(e,o);return i.prevCodePoint(),i.offset}function BB(o,e){const t=new Kx(e,o);let i=t.prevCodePoint();for(;WB(i)||i===65039||i===8419;){if(t.offset===0)return;i=t.prevCodePoint()}if(!Gx(i))return;let n=t.offset;return n>0&&t.prevCodePoint()===8205&&(n=t.offset),n}function WB(o){return 127995<=o&&o<=127999}const VB=\"\\xA0\";class bo{constructor(e){this.confusableDictionary=e}static getInstance(e){return bo.cache.get(Array.from(e))}static getLocales(){return bo._locales.getValue()}isAmbiguous(e){return this.confusableDictionary.has(e)}getPrimaryConfusable(e){return this.confusableDictionary.get(e)}getConfusableCodePoints(){return new Set(this.confusableDictionary.keys())}}jO=bo;bo.ambiguousCharacterData=new eg(()=>JSON.parse('{\"_common\":[8232,32,8233,32,5760,32,8192,32,8193,32,8194,32,8195,32,8196,32,8197,32,8198,32,8200,32,8201,32,8202,32,8287,32,8199,32,8239,32,2042,95,65101,95,65102,95,65103,95,8208,45,8209,45,8210,45,65112,45,1748,45,8259,45,727,45,8722,45,10134,45,11450,45,1549,44,1643,44,8218,44,184,44,42233,44,894,59,2307,58,2691,58,1417,58,1795,58,1796,58,5868,58,65072,58,6147,58,6153,58,8282,58,1475,58,760,58,42889,58,8758,58,720,58,42237,58,451,33,11601,33,660,63,577,63,2429,63,5038,63,42731,63,119149,46,8228,46,1793,46,1794,46,42510,46,68176,46,1632,46,1776,46,42232,46,1373,96,65287,96,8219,96,8242,96,1370,96,1523,96,8175,96,65344,96,900,96,8189,96,8125,96,8127,96,8190,96,697,96,884,96,712,96,714,96,715,96,756,96,699,96,701,96,700,96,702,96,42892,96,1497,96,2036,96,2037,96,5194,96,5836,96,94033,96,94034,96,65339,91,10088,40,10098,40,12308,40,64830,40,65341,93,10089,41,10099,41,12309,41,64831,41,10100,123,119060,123,10101,125,65342,94,8270,42,1645,42,8727,42,66335,42,5941,47,8257,47,8725,47,8260,47,9585,47,10187,47,10744,47,119354,47,12755,47,12339,47,11462,47,20031,47,12035,47,65340,92,65128,92,8726,92,10189,92,10741,92,10745,92,119311,92,119355,92,12756,92,20022,92,12034,92,42872,38,708,94,710,94,5869,43,10133,43,66203,43,8249,60,10094,60,706,60,119350,60,5176,60,5810,60,5120,61,11840,61,12448,61,42239,61,8250,62,10095,62,707,62,119351,62,5171,62,94015,62,8275,126,732,126,8128,126,8764,126,65372,124,65293,45,120784,50,120794,50,120804,50,120814,50,120824,50,130034,50,42842,50,423,50,1000,50,42564,50,5311,50,42735,50,119302,51,120785,51,120795,51,120805,51,120815,51,120825,51,130035,51,42923,51,540,51,439,51,42858,51,11468,51,1248,51,94011,51,71882,51,120786,52,120796,52,120806,52,120816,52,120826,52,130036,52,5070,52,71855,52,120787,53,120797,53,120807,53,120817,53,120827,53,130037,53,444,53,71867,53,120788,54,120798,54,120808,54,120818,54,120828,54,130038,54,11474,54,5102,54,71893,54,119314,55,120789,55,120799,55,120809,55,120819,55,120829,55,130039,55,66770,55,71878,55,2819,56,2538,56,2666,56,125131,56,120790,56,120800,56,120810,56,120820,56,120830,56,130040,56,547,56,546,56,66330,56,2663,57,2920,57,2541,57,3437,57,120791,57,120801,57,120811,57,120821,57,120831,57,130041,57,42862,57,11466,57,71884,57,71852,57,71894,57,9082,97,65345,97,119834,97,119886,97,119938,97,119990,97,120042,97,120094,97,120146,97,120198,97,120250,97,120302,97,120354,97,120406,97,120458,97,593,97,945,97,120514,97,120572,97,120630,97,120688,97,120746,97,65313,65,119808,65,119860,65,119912,65,119964,65,120016,65,120068,65,120120,65,120172,65,120224,65,120276,65,120328,65,120380,65,120432,65,913,65,120488,65,120546,65,120604,65,120662,65,120720,65,5034,65,5573,65,42222,65,94016,65,66208,65,119835,98,119887,98,119939,98,119991,98,120043,98,120095,98,120147,98,120199,98,120251,98,120303,98,120355,98,120407,98,120459,98,388,98,5071,98,5234,98,5551,98,65314,66,8492,66,119809,66,119861,66,119913,66,120017,66,120069,66,120121,66,120173,66,120225,66,120277,66,120329,66,120381,66,120433,66,42932,66,914,66,120489,66,120547,66,120605,66,120663,66,120721,66,5108,66,5623,66,42192,66,66178,66,66209,66,66305,66,65347,99,8573,99,119836,99,119888,99,119940,99,119992,99,120044,99,120096,99,120148,99,120200,99,120252,99,120304,99,120356,99,120408,99,120460,99,7428,99,1010,99,11429,99,43951,99,66621,99,128844,67,71922,67,71913,67,65315,67,8557,67,8450,67,8493,67,119810,67,119862,67,119914,67,119966,67,120018,67,120174,67,120226,67,120278,67,120330,67,120382,67,120434,67,1017,67,11428,67,5087,67,42202,67,66210,67,66306,67,66581,67,66844,67,8574,100,8518,100,119837,100,119889,100,119941,100,119993,100,120045,100,120097,100,120149,100,120201,100,120253,100,120305,100,120357,100,120409,100,120461,100,1281,100,5095,100,5231,100,42194,100,8558,68,8517,68,119811,68,119863,68,119915,68,119967,68,120019,68,120071,68,120123,68,120175,68,120227,68,120279,68,120331,68,120383,68,120435,68,5024,68,5598,68,5610,68,42195,68,8494,101,65349,101,8495,101,8519,101,119838,101,119890,101,119942,101,120046,101,120098,101,120150,101,120202,101,120254,101,120306,101,120358,101,120410,101,120462,101,43826,101,1213,101,8959,69,65317,69,8496,69,119812,69,119864,69,119916,69,120020,69,120072,69,120124,69,120176,69,120228,69,120280,69,120332,69,120384,69,120436,69,917,69,120492,69,120550,69,120608,69,120666,69,120724,69,11577,69,5036,69,42224,69,71846,69,71854,69,66182,69,119839,102,119891,102,119943,102,119995,102,120047,102,120099,102,120151,102,120203,102,120255,102,120307,102,120359,102,120411,102,120463,102,43829,102,42905,102,383,102,7837,102,1412,102,119315,70,8497,70,119813,70,119865,70,119917,70,120021,70,120073,70,120125,70,120177,70,120229,70,120281,70,120333,70,120385,70,120437,70,42904,70,988,70,120778,70,5556,70,42205,70,71874,70,71842,70,66183,70,66213,70,66853,70,65351,103,8458,103,119840,103,119892,103,119944,103,120048,103,120100,103,120152,103,120204,103,120256,103,120308,103,120360,103,120412,103,120464,103,609,103,7555,103,397,103,1409,103,119814,71,119866,71,119918,71,119970,71,120022,71,120074,71,120126,71,120178,71,120230,71,120282,71,120334,71,120386,71,120438,71,1292,71,5056,71,5107,71,42198,71,65352,104,8462,104,119841,104,119945,104,119997,104,120049,104,120101,104,120153,104,120205,104,120257,104,120309,104,120361,104,120413,104,120465,104,1211,104,1392,104,5058,104,65320,72,8459,72,8460,72,8461,72,119815,72,119867,72,119919,72,120023,72,120179,72,120231,72,120283,72,120335,72,120387,72,120439,72,919,72,120494,72,120552,72,120610,72,120668,72,120726,72,11406,72,5051,72,5500,72,42215,72,66255,72,731,105,9075,105,65353,105,8560,105,8505,105,8520,105,119842,105,119894,105,119946,105,119998,105,120050,105,120102,105,120154,105,120206,105,120258,105,120310,105,120362,105,120414,105,120466,105,120484,105,618,105,617,105,953,105,8126,105,890,105,120522,105,120580,105,120638,105,120696,105,120754,105,1110,105,42567,105,1231,105,43893,105,5029,105,71875,105,65354,106,8521,106,119843,106,119895,106,119947,106,119999,106,120051,106,120103,106,120155,106,120207,106,120259,106,120311,106,120363,106,120415,106,120467,106,1011,106,1112,106,65322,74,119817,74,119869,74,119921,74,119973,74,120025,74,120077,74,120129,74,120181,74,120233,74,120285,74,120337,74,120389,74,120441,74,42930,74,895,74,1032,74,5035,74,5261,74,42201,74,119844,107,119896,107,119948,107,120000,107,120052,107,120104,107,120156,107,120208,107,120260,107,120312,107,120364,107,120416,107,120468,107,8490,75,65323,75,119818,75,119870,75,119922,75,119974,75,120026,75,120078,75,120130,75,120182,75,120234,75,120286,75,120338,75,120390,75,120442,75,922,75,120497,75,120555,75,120613,75,120671,75,120729,75,11412,75,5094,75,5845,75,42199,75,66840,75,1472,108,8739,73,9213,73,65512,73,1633,108,1777,73,66336,108,125127,108,120783,73,120793,73,120803,73,120813,73,120823,73,130033,73,65321,73,8544,73,8464,73,8465,73,119816,73,119868,73,119920,73,120024,73,120128,73,120180,73,120232,73,120284,73,120336,73,120388,73,120440,73,65356,108,8572,73,8467,108,119845,108,119897,108,119949,108,120001,108,120053,108,120105,73,120157,73,120209,73,120261,73,120313,73,120365,73,120417,73,120469,73,448,73,120496,73,120554,73,120612,73,120670,73,120728,73,11410,73,1030,73,1216,73,1493,108,1503,108,1575,108,126464,108,126592,108,65166,108,65165,108,1994,108,11599,73,5825,73,42226,73,93992,73,66186,124,66313,124,119338,76,8556,76,8466,76,119819,76,119871,76,119923,76,120027,76,120079,76,120131,76,120183,76,120235,76,120287,76,120339,76,120391,76,120443,76,11472,76,5086,76,5290,76,42209,76,93974,76,71843,76,71858,76,66587,76,66854,76,65325,77,8559,77,8499,77,119820,77,119872,77,119924,77,120028,77,120080,77,120132,77,120184,77,120236,77,120288,77,120340,77,120392,77,120444,77,924,77,120499,77,120557,77,120615,77,120673,77,120731,77,1018,77,11416,77,5047,77,5616,77,5846,77,42207,77,66224,77,66321,77,119847,110,119899,110,119951,110,120003,110,120055,110,120107,110,120159,110,120211,110,120263,110,120315,110,120367,110,120419,110,120471,110,1400,110,1404,110,65326,78,8469,78,119821,78,119873,78,119925,78,119977,78,120029,78,120081,78,120185,78,120237,78,120289,78,120341,78,120393,78,120445,78,925,78,120500,78,120558,78,120616,78,120674,78,120732,78,11418,78,42208,78,66835,78,3074,111,3202,111,3330,111,3458,111,2406,111,2662,111,2790,111,3046,111,3174,111,3302,111,3430,111,3664,111,3792,111,4160,111,1637,111,1781,111,65359,111,8500,111,119848,111,119900,111,119952,111,120056,111,120108,111,120160,111,120212,111,120264,111,120316,111,120368,111,120420,111,120472,111,7439,111,7441,111,43837,111,959,111,120528,111,120586,111,120644,111,120702,111,120760,111,963,111,120532,111,120590,111,120648,111,120706,111,120764,111,11423,111,4351,111,1413,111,1505,111,1607,111,126500,111,126564,111,126596,111,65259,111,65260,111,65258,111,65257,111,1726,111,64428,111,64429,111,64427,111,64426,111,1729,111,64424,111,64425,111,64423,111,64422,111,1749,111,3360,111,4125,111,66794,111,71880,111,71895,111,66604,111,1984,79,2534,79,2918,79,12295,79,70864,79,71904,79,120782,79,120792,79,120802,79,120812,79,120822,79,130032,79,65327,79,119822,79,119874,79,119926,79,119978,79,120030,79,120082,79,120134,79,120186,79,120238,79,120290,79,120342,79,120394,79,120446,79,927,79,120502,79,120560,79,120618,79,120676,79,120734,79,11422,79,1365,79,11604,79,4816,79,2848,79,66754,79,42227,79,71861,79,66194,79,66219,79,66564,79,66838,79,9076,112,65360,112,119849,112,119901,112,119953,112,120005,112,120057,112,120109,112,120161,112,120213,112,120265,112,120317,112,120369,112,120421,112,120473,112,961,112,120530,112,120544,112,120588,112,120602,112,120646,112,120660,112,120704,112,120718,112,120762,112,120776,112,11427,112,65328,80,8473,80,119823,80,119875,80,119927,80,119979,80,120031,80,120083,80,120187,80,120239,80,120291,80,120343,80,120395,80,120447,80,929,80,120504,80,120562,80,120620,80,120678,80,120736,80,11426,80,5090,80,5229,80,42193,80,66197,80,119850,113,119902,113,119954,113,120006,113,120058,113,120110,113,120162,113,120214,113,120266,113,120318,113,120370,113,120422,113,120474,113,1307,113,1379,113,1382,113,8474,81,119824,81,119876,81,119928,81,119980,81,120032,81,120084,81,120188,81,120240,81,120292,81,120344,81,120396,81,120448,81,11605,81,119851,114,119903,114,119955,114,120007,114,120059,114,120111,114,120163,114,120215,114,120267,114,120319,114,120371,114,120423,114,120475,114,43847,114,43848,114,7462,114,11397,114,43905,114,119318,82,8475,82,8476,82,8477,82,119825,82,119877,82,119929,82,120033,82,120189,82,120241,82,120293,82,120345,82,120397,82,120449,82,422,82,5025,82,5074,82,66740,82,5511,82,42211,82,94005,82,65363,115,119852,115,119904,115,119956,115,120008,115,120060,115,120112,115,120164,115,120216,115,120268,115,120320,115,120372,115,120424,115,120476,115,42801,115,445,115,1109,115,43946,115,71873,115,66632,115,65331,83,119826,83,119878,83,119930,83,119982,83,120034,83,120086,83,120138,83,120190,83,120242,83,120294,83,120346,83,120398,83,120450,83,1029,83,1359,83,5077,83,5082,83,42210,83,94010,83,66198,83,66592,83,119853,116,119905,116,119957,116,120009,116,120061,116,120113,116,120165,116,120217,116,120269,116,120321,116,120373,116,120425,116,120477,116,8868,84,10201,84,128872,84,65332,84,119827,84,119879,84,119931,84,119983,84,120035,84,120087,84,120139,84,120191,84,120243,84,120295,84,120347,84,120399,84,120451,84,932,84,120507,84,120565,84,120623,84,120681,84,120739,84,11430,84,5026,84,42196,84,93962,84,71868,84,66199,84,66225,84,66325,84,119854,117,119906,117,119958,117,120010,117,120062,117,120114,117,120166,117,120218,117,120270,117,120322,117,120374,117,120426,117,120478,117,42911,117,7452,117,43854,117,43858,117,651,117,965,117,120534,117,120592,117,120650,117,120708,117,120766,117,1405,117,66806,117,71896,117,8746,85,8899,85,119828,85,119880,85,119932,85,119984,85,120036,85,120088,85,120140,85,120192,85,120244,85,120296,85,120348,85,120400,85,120452,85,1357,85,4608,85,66766,85,5196,85,42228,85,94018,85,71864,85,8744,118,8897,118,65366,118,8564,118,119855,118,119907,118,119959,118,120011,118,120063,118,120115,118,120167,118,120219,118,120271,118,120323,118,120375,118,120427,118,120479,118,7456,118,957,118,120526,118,120584,118,120642,118,120700,118,120758,118,1141,118,1496,118,71430,118,43945,118,71872,118,119309,86,1639,86,1783,86,8548,86,119829,86,119881,86,119933,86,119985,86,120037,86,120089,86,120141,86,120193,86,120245,86,120297,86,120349,86,120401,86,120453,86,1140,86,11576,86,5081,86,5167,86,42719,86,42214,86,93960,86,71840,86,66845,86,623,119,119856,119,119908,119,119960,119,120012,119,120064,119,120116,119,120168,119,120220,119,120272,119,120324,119,120376,119,120428,119,120480,119,7457,119,1121,119,1309,119,1377,119,71434,119,71438,119,71439,119,43907,119,71919,87,71910,87,119830,87,119882,87,119934,87,119986,87,120038,87,120090,87,120142,87,120194,87,120246,87,120298,87,120350,87,120402,87,120454,87,1308,87,5043,87,5076,87,42218,87,5742,120,10539,120,10540,120,10799,120,65368,120,8569,120,119857,120,119909,120,119961,120,120013,120,120065,120,120117,120,120169,120,120221,120,120273,120,120325,120,120377,120,120429,120,120481,120,5441,120,5501,120,5741,88,9587,88,66338,88,71916,88,65336,88,8553,88,119831,88,119883,88,119935,88,119987,88,120039,88,120091,88,120143,88,120195,88,120247,88,120299,88,120351,88,120403,88,120455,88,42931,88,935,88,120510,88,120568,88,120626,88,120684,88,120742,88,11436,88,11613,88,5815,88,42219,88,66192,88,66228,88,66327,88,66855,88,611,121,7564,121,65369,121,119858,121,119910,121,119962,121,120014,121,120066,121,120118,121,120170,121,120222,121,120274,121,120326,121,120378,121,120430,121,120482,121,655,121,7935,121,43866,121,947,121,8509,121,120516,121,120574,121,120632,121,120690,121,120748,121,1199,121,4327,121,71900,121,65337,89,119832,89,119884,89,119936,89,119988,89,120040,89,120092,89,120144,89,120196,89,120248,89,120300,89,120352,89,120404,89,120456,89,933,89,978,89,120508,89,120566,89,120624,89,120682,89,120740,89,11432,89,1198,89,5033,89,5053,89,42220,89,94019,89,71844,89,66226,89,119859,122,119911,122,119963,122,120015,122,120067,122,120119,122,120171,122,120223,122,120275,122,120327,122,120379,122,120431,122,120483,122,7458,122,43923,122,71876,122,66293,90,71909,90,65338,90,8484,90,8488,90,119833,90,119885,90,119937,90,119989,90,120041,90,120197,90,120249,90,120301,90,120353,90,120405,90,120457,90,918,90,120493,90,120551,90,120609,90,120667,90,120725,90,5059,90,42204,90,71849,90,65282,34,65284,36,65285,37,65286,38,65290,42,65291,43,65294,46,65295,47,65296,48,65297,49,65298,50,65299,51,65300,52,65301,53,65302,54,65303,55,65304,56,65305,57,65308,60,65309,61,65310,62,65312,64,65316,68,65318,70,65319,71,65324,76,65329,81,65330,82,65333,85,65334,86,65335,87,65343,95,65346,98,65348,100,65350,102,65355,107,65357,109,65358,110,65361,113,65362,114,65364,116,65365,117,65367,119,65370,122,65371,123,65373,125],\"_default\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"cs\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"de\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"es\":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"fr\":[65374,126,65306,58,65281,33,8216,96,8245,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"it\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"ja\":[8211,45,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65292,44,65307,59],\"ko\":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"pl\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"pt-BR\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"qps-ploc\":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"ru\":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,305,105,921,73,1009,112,215,120,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"tr\":[160,32,8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],\"zh-hans\":[65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41],\"zh-hant\":[8211,45,65374,126,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65307,59]}'));bo.cache=new DB(o=>{function e(c){const d=new Map;for(let h=0;h<c.length;h+=2)d.set(c[h],c[h+1]);return d}function t(c,d){const h=new Map(c);for(const[u,g]of d)h.set(u,g);return h}function i(c,d){if(!c)return d;const h=new Map;for(const[u,g]of c)d.has(u)&&h.set(u,g);return h}const n=jO.ambiguousCharacterData.getValue();let s=o.filter(c=>!c.startsWith(\"_\")&&c in n);s.length===0&&(s=[\"_default\"]);let r;for(const c of s){const d=e(n[c]);r=i(r,d)}const a=e(n._common),l=t(a,r);return new bo(l)});bo._locales=new eg(()=>Object.keys(bo.ambiguousCharacterData.getValue()).filter(o=>!o.startsWith(\"_\")));class Br{static getRawData(){return JSON.parse(\"[9,10,11,12,13,32,127,160,173,847,1564,4447,4448,6068,6069,6155,6156,6157,6158,7355,7356,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8234,8235,8236,8237,8238,8239,8287,8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,10240,12288,12644,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65279,65440,65520,65521,65522,65523,65524,65525,65526,65527,65528,65532,78844,119155,119156,119157,119158,119159,119160,119161,119162,917504,917505,917506,917507,917508,917509,917510,917511,917512,917513,917514,917515,917516,917517,917518,917519,917520,917521,917522,917523,917524,917525,917526,917527,917528,917529,917530,917531,917532,917533,917534,917535,917536,917537,917538,917539,917540,917541,917542,917543,917544,917545,917546,917547,917548,917549,917550,917551,917552,917553,917554,917555,917556,917557,917558,917559,917560,917561,917562,917563,917564,917565,917566,917567,917568,917569,917570,917571,917572,917573,917574,917575,917576,917577,917578,917579,917580,917581,917582,917583,917584,917585,917586,917587,917588,917589,917590,917591,917592,917593,917594,917595,917596,917597,917598,917599,917600,917601,917602,917603,917604,917605,917606,917607,917608,917609,917610,917611,917612,917613,917614,917615,917616,917617,917618,917619,917620,917621,917622,917623,917624,917625,917626,917627,917628,917629,917630,917631,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999]\")}static getData(){return this._data||(this._data=new Set(Br.getRawData())),this._data}static isInvisibleCharacter(e){return Br.getData().has(e)}static get codePoints(){return Br.getData()}}Br._data=void 0;const on=new Map;on.set(\"false\",!1);on.set(\"true\",!0);on.set(\"isMac\",Ze);on.set(\"isLinux\",sn);on.set(\"isWindows\",nn);on.set(\"isWeb\",Lc);on.set(\"isMacNative\",Ze&&!Lc);on.set(\"isEdge\",K8);on.set(\"isFirefox\",$8);on.set(\"isChrome\",pO);on.set(\"isSafari\",j8);const HB=Object.prototype.hasOwnProperty;class re{static has(e){return rc.create(e)}static equals(e,t){return ng.create(e,t)}static regex(e,t){return W0.create(e,t)}static not(e){return Bd.create(e)}static and(...e){return Fl.create(e,null)}static or(...e){return Ra.create(e,null,!0)}static deserialize(e,t=!1){if(!!e)return this._deserializeOrExpression(e,t)}static _deserializeOrExpression(e,t){const i=e.split(\"||\");return Ra.create(i.map(n=>this._deserializeAndExpression(n,t)),null,!0)}static _deserializeAndExpression(e,t){const i=e.split(\"&&\");return Fl.create(i.map(n=>this._deserializeOne(n,t)),null)}static _deserializeOne(e,t){if(e=e.trim(),e.indexOf(\"!=\")>=0){const i=e.split(\"!=\");return IC.create(i[0].trim(),this._deserializeValue(i[1],t))}if(e.indexOf(\"==\")>=0){const i=e.split(\"==\");return ng.create(i[0].trim(),this._deserializeValue(i[1],t))}if(e.indexOf(\"=~\")>=0){const i=e.split(\"=~\");return W0.create(i[0].trim(),this._deserializeRegexValue(i[1],t))}if(e.indexOf(\" not in \")>=0){const i=e.split(\" not in \");return xC.create(i[0].trim(),i[1].trim())}if(e.indexOf(\" in \")>=0){const i=e.split(\" in \");return kC.create(i[0].trim(),i[1].trim())}if(/^[^<=>]+>=[^<=>]+$/.test(e)){const i=e.split(\">=\");return TC.create(i[0].trim(),i[1].trim())}if(/^[^<=>]+>[^<=>]+$/.test(e)){const i=e.split(\">\");return NC.create(i[0].trim(),i[1].trim())}if(/^[^<=>]+<=[^<=>]+$/.test(e)){const i=e.split(\"<=\");return AC.create(i[0].trim(),i[1].trim())}if(/^[^<=>]+<[^<=>]+$/.test(e)){const i=e.split(\"<\");return MC.create(i[0].trim(),i[1].trim())}return/^\\!\\s*/.test(e)?Bd.create(e.substr(1).trim()):rc.create(e)}static _deserializeValue(e,t){if(e=e.trim(),e===\"true\")return!0;if(e===\"false\")return!1;const i=/^'([^']*)'$/.exec(e);return i?i[1].trim():e}static _deserializeRegexValue(e,t){if(KO(e)){if(t)throw new Error(\"missing regexp-value for =~-expression\");return console.warn(\"missing regexp-value for =~-expression\"),null}const i=e.indexOf(\"/\"),n=e.lastIndexOf(\"/\");if(i===n||i<0){if(t)throw new Error(`bad regexp-value '${e}', missing /-enclosure`);return console.warn(`bad regexp-value '${e}', missing /-enclosure`),null}const s=e.slice(i+1,n),r=e[n+1]===\"i\"?\"i\":\"\";try{return new RegExp(s,r)}catch(a){if(t)throw new Error(`bad regexp-value '${e}', parse error: ${a}`);return console.warn(`bad regexp-value '${e}', parse error: ${a}`),null}}}function zB(o,e){const t=o?o.substituteConstants():void 0,i=e?e.substituteConstants():void 0;return!t&&!i?!0:!t||!i?!1:t.equals(i)}function Iu(o,e){return o.cmp(e)}class ks{constructor(){this.type=0}cmp(e){return this.type-e.type}equals(e){return e.type===this.type}substituteConstants(){return this}evaluate(e){return!1}serialize(){return\"false\"}keys(){return[]}negate(){return Gs.INSTANCE}}ks.INSTANCE=new ks;class Gs{constructor(){this.type=1}cmp(e){return this.type-e.type}equals(e){return e.type===this.type}substituteConstants(){return this}evaluate(e){return!0}serialize(){return\"true\"}keys(){return[]}negate(){return ks.INSTANCE}}Gs.INSTANCE=new Gs;class rc{constructor(e,t){this.key=e,this.negated=t,this.type=2}static create(e,t=null){const i=on.get(e);return typeof i==\"boolean\"?i?Gs.INSTANCE:ks.INSTANCE:new rc(e,t)}cmp(e){return e.type!==this.type?this.type-e.type:JO(this.key,e.key)}equals(e){return e.type===this.type?this.key===e.key:!1}substituteConstants(){const e=on.get(this.key);return typeof e==\"boolean\"?e?Gs.INSTANCE:ks.INSTANCE:this}evaluate(e){return!!e.getValue(this.key)}serialize(){return this.key}keys(){return[this.key]}negate(){return this.negated||(this.negated=Bd.create(this.key,this)),this.negated}}class ng{constructor(e,t,i){this.key=e,this.value=t,this.negated=i,this.type=4}static create(e,t,i=null){if(typeof t==\"boolean\")return t?rc.create(e,i):Bd.create(e,i);const n=on.get(e);return typeof n==\"boolean\"?t===(n?\"true\":\"false\")?Gs.INSTANCE:ks.INSTANCE:new ng(e,t,i)}cmp(e){return e.type!==this.type?this.type-e.type:gh(this.key,this.value,e.key,e.value)}equals(e){return e.type===this.type?this.key===e.key&&this.value===e.value:!1}substituteConstants(){const e=on.get(this.key);if(typeof e==\"boolean\"){const t=e?\"true\":\"false\";return this.value===t?Gs.INSTANCE:ks.INSTANCE}return this}evaluate(e){return e.getValue(this.key)==this.value}serialize(){return`${this.key} == '${this.value}'`}keys(){return[this.key]}negate(){return this.negated||(this.negated=IC.create(this.key,this.value,this)),this.negated}}class kC{constructor(e,t){this.key=e,this.valueKey=t,this.type=10,this.negated=null}static create(e,t){return new kC(e,t)}cmp(e){return e.type!==this.type?this.type-e.type:gh(this.key,this.valueKey,e.key,e.valueKey)}equals(e){return e.type===this.type?this.key===e.key&&this.valueKey===e.valueKey:!1}substituteConstants(){return this}evaluate(e){const t=e.getValue(this.valueKey),i=e.getValue(this.key);return Array.isArray(t)?t.includes(i):typeof i==\"string\"&&typeof t==\"object\"&&t!==null?HB.call(t,i):!1}serialize(){return`${this.key} in '${this.valueKey}'`}keys(){return[this.key,this.valueKey]}negate(){return this.negated||(this.negated=xC.create(this.key,this.valueKey)),this.negated}}class xC{constructor(e,t){this.key=e,this.valueKey=t,this.type=11,this._negated=kC.create(e,t)}static create(e,t){return new xC(e,t)}cmp(e){return e.type!==this.type?this.type-e.type:this._negated.cmp(e._negated)}equals(e){return e.type===this.type?this._negated.equals(e._negated):!1}substituteConstants(){return this}evaluate(e){return!this._negated.evaluate(e)}serialize(){return`${this.key} not in '${this.valueKey}'`}keys(){return this._negated.keys()}negate(){return this._negated}}class IC{constructor(e,t,i){this.key=e,this.value=t,this.negated=i,this.type=5}static create(e,t,i=null){if(typeof t==\"boolean\")return t?Bd.create(e,i):rc.create(e,i);const n=on.get(e);return typeof n==\"boolean\"?t===(n?\"true\":\"false\")?ks.INSTANCE:Gs.INSTANCE:new IC(e,t,i)}cmp(e){return e.type!==this.type?this.type-e.type:gh(this.key,this.value,e.key,e.value)}equals(e){return e.type===this.type?this.key===e.key&&this.value===e.value:!1}substituteConstants(){const e=on.get(this.key);if(typeof e==\"boolean\"){const t=e?\"true\":\"false\";return this.value===t?ks.INSTANCE:Gs.INSTANCE}return this}evaluate(e){return e.getValue(this.key)!=this.value}serialize(){return`${this.key} != '${this.value}'`}keys(){return[this.key]}negate(){return this.negated||(this.negated=ng.create(this.key,this.value,this)),this.negated}}class Bd{constructor(e,t){this.key=e,this.negated=t,this.type=3}static create(e,t=null){const i=on.get(e);return typeof i==\"boolean\"?i?ks.INSTANCE:Gs.INSTANCE:new Bd(e,t)}cmp(e){return e.type!==this.type?this.type-e.type:JO(this.key,e.key)}equals(e){return e.type===this.type?this.key===e.key:!1}substituteConstants(){const e=on.get(this.key);return typeof e==\"boolean\"?e?ks.INSTANCE:Gs.INSTANCE:this}evaluate(e){return!e.getValue(this.key)}serialize(){return`!${this.key}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=rc.create(this.key,this)),this.negated}}function EC(o,e){if(typeof o==\"string\"){const t=parseFloat(o);isNaN(t)||(o=t)}return typeof o==\"string\"||typeof o==\"number\"?e(o):ks.INSTANCE}class NC{constructor(e,t,i){this.key=e,this.value=t,this.negated=i,this.type=12}static create(e,t,i=null){return EC(t,n=>new NC(e,n,i))}cmp(e){return e.type!==this.type?this.type-e.type:gh(this.key,this.value,e.key,e.value)}equals(e){return e.type===this.type?this.key===e.key&&this.value===e.value:!1}substituteConstants(){return this}evaluate(e){return typeof this.value==\"string\"?!1:parseFloat(e.getValue(this.key))>this.value}serialize(){return`${this.key} > ${this.value}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=AC.create(this.key,this.value,this)),this.negated}}class TC{constructor(e,t,i){this.key=e,this.value=t,this.negated=i,this.type=13}static create(e,t,i=null){return EC(t,n=>new TC(e,n,i))}cmp(e){return e.type!==this.type?this.type-e.type:gh(this.key,this.value,e.key,e.value)}equals(e){return e.type===this.type?this.key===e.key&&this.value===e.value:!1}substituteConstants(){return this}evaluate(e){return typeof this.value==\"string\"?!1:parseFloat(e.getValue(this.key))>=this.value}serialize(){return`${this.key} >= ${this.value}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=MC.create(this.key,this.value,this)),this.negated}}class MC{constructor(e,t,i){this.key=e,this.value=t,this.negated=i,this.type=14}static create(e,t,i=null){return EC(t,n=>new MC(e,n,i))}cmp(e){return e.type!==this.type?this.type-e.type:gh(this.key,this.value,e.key,e.value)}equals(e){return e.type===this.type?this.key===e.key&&this.value===e.value:!1}substituteConstants(){return this}evaluate(e){return typeof this.value==\"string\"?!1:parseFloat(e.getValue(this.key))<this.value}serialize(){return`${this.key} < ${this.value}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=TC.create(this.key,this.value,this)),this.negated}}class AC{constructor(e,t,i){this.key=e,this.value=t,this.negated=i,this.type=15}static create(e,t,i=null){return EC(t,n=>new AC(e,n,i))}cmp(e){return e.type!==this.type?this.type-e.type:gh(this.key,this.value,e.key,e.value)}equals(e){return e.type===this.type?this.key===e.key&&this.value===e.value:!1}substituteConstants(){return this}evaluate(e){return typeof this.value==\"string\"?!1:parseFloat(e.getValue(this.key))<=this.value}serialize(){return`${this.key} <= ${this.value}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=NC.create(this.key,this.value,this)),this.negated}}class W0{constructor(e,t){this.key=e,this.regexp=t,this.type=7,this.negated=null}static create(e,t){return new W0(e,t)}cmp(e){if(e.type!==this.type)return this.type-e.type;if(this.key<e.key)return-1;if(this.key>e.key)return 1;const t=this.regexp?this.regexp.source:\"\",i=e.regexp?e.regexp.source:\"\";return t<i?-1:t>i?1:0}equals(e){if(e.type===this.type){const t=this.regexp?this.regexp.source:\"\",i=e.regexp?e.regexp.source:\"\";return this.key===e.key&&t===i}return!1}substituteConstants(){return this}evaluate(e){const t=e.getValue(this.key);return this.regexp?this.regexp.test(t):!1}serialize(){const e=this.regexp?`/${this.regexp.source}/${this.regexp.ignoreCase?\"i\":\"\"}`:\"/invalid/\";return`${this.key} =~ ${e}`}keys(){return[this.key]}negate(){return this.negated||(this.negated=Yx.create(this)),this.negated}}class Yx{constructor(e){this._actual=e,this.type=8}static create(e){return new Yx(e)}cmp(e){return e.type!==this.type?this.type-e.type:this._actual.cmp(e._actual)}equals(e){return e.type===this.type?this._actual.equals(e._actual):!1}substituteConstants(){return this}evaluate(e){return!this._actual.evaluate(e)}serialize(){throw new Error(\"Method not implemented.\")}keys(){return this._actual.keys()}negate(){return this._actual}}function QO(o){let e=null;for(let t=0,i=o.length;t<i;t++){const n=o[t].substituteConstants();if(o[t]!==n&&e===null){e=[];for(let s=0;s<t;s++)e[s]=o[s]}e!==null&&(e[t]=n)}return e===null?o:e}class Fl{constructor(e,t){this.expr=e,this.negated=t,this.type=6}static create(e,t){return Fl._normalizeArr(e,t)}cmp(e){if(e.type!==this.type)return this.type-e.type;if(this.expr.length<e.expr.length)return-1;if(this.expr.length>e.expr.length)return 1;for(let t=0,i=this.expr.length;t<i;t++){const n=Iu(this.expr[t],e.expr[t]);if(n!==0)return n}return 0}equals(e){if(e.type===this.type){if(this.expr.length!==e.expr.length)return!1;for(let t=0,i=this.expr.length;t<i;t++)if(!this.expr[t].equals(e.expr[t]))return!1;return!0}return!1}substituteConstants(){const e=QO(this.expr);return e===this.expr?this:Fl.create(e,this.negated)}evaluate(e){for(let t=0,i=this.expr.length;t<i;t++)if(!this.expr[t].evaluate(e))return!1;return!0}static _normalizeArr(e,t){const i=[];let n=!1;for(const s of e)if(!!s){if(s.type===1){n=!0;continue}if(s.type===0)return ks.INSTANCE;if(s.type===6){i.push(...s.expr);continue}i.push(s)}if(i.length===0&&n)return Gs.INSTANCE;if(i.length!==0){if(i.length===1)return i[0];i.sort(Iu);for(let s=1;s<i.length;s++)i[s-1].equals(i[s])&&(i.splice(s,1),s--);if(i.length===1)return i[0];for(;i.length>1;){const s=i[i.length-1];if(s.type!==9)break;i.pop();const r=i.pop(),a=i.length===0,l=Ra.create(s.expr.map(c=>Fl.create([c,r],null)),null,a);l&&(i.push(l),i.sort(Iu))}return i.length===1?i[0]:new Fl(i,t)}}serialize(){return this.expr.map(e=>e.serialize()).join(\" && \")}keys(){const e=[];for(const t of this.expr)e.push(...t.keys());return e}negate(){if(!this.negated){const e=[];for(const t of this.expr)e.push(t.negate());this.negated=Ra.create(e,this,!0)}return this.negated}}class Ra{constructor(e,t){this.expr=e,this.negated=t,this.type=9}static create(e,t,i){return Ra._normalizeArr(e,t,i)}cmp(e){if(e.type!==this.type)return this.type-e.type;if(this.expr.length<e.expr.length)return-1;if(this.expr.length>e.expr.length)return 1;for(let t=0,i=this.expr.length;t<i;t++){const n=Iu(this.expr[t],e.expr[t]);if(n!==0)return n}return 0}equals(e){if(e.type===this.type){if(this.expr.length!==e.expr.length)return!1;for(let t=0,i=this.expr.length;t<i;t++)if(!this.expr[t].equals(e.expr[t]))return!1;return!0}return!1}substituteConstants(){const e=QO(this.expr);return e===this.expr?this:Ra.create(e,this.negated,!1)}evaluate(e){for(let t=0,i=this.expr.length;t<i;t++)if(this.expr[t].evaluate(e))return!0;return!1}static _normalizeArr(e,t,i){let n=[],s=!1;if(e){for(let r=0,a=e.length;r<a;r++){const l=e[r];if(!!l){if(l.type===0){s=!0;continue}if(l.type===1)return Gs.INSTANCE;if(l.type===9){n=n.concat(l.expr);continue}n.push(l)}}if(n.length===0&&s)return ks.INSTANCE;n.sort(Iu)}if(n.length!==0){if(n.length===1)return n[0];for(let r=1;r<n.length;r++)n[r-1].equals(n[r])&&(n.splice(r,1),r--);if(n.length===1)return n[0];if(i){for(let r=0;r<n.length;r++)for(let a=r+1;a<n.length;a++)eP(n[r],n[a])&&(n.splice(a,1),a--);if(n.length===1)return n[0]}return new Ra(n,t)}}serialize(){return this.expr.map(e=>e.serialize()).join(\" || \")}keys(){const e=[];for(const t of this.expr)e.push(...t.keys());return e}negate(){if(!this.negated){const e=[];for(const t of this.expr)e.push(t.negate());for(;e.length>1;){const t=e.shift(),i=e.shift(),n=[];for(const r of V0(t))for(const a of V0(i))n.push(Fl.create([r,a],null));const s=e.length===0;e.unshift(Ra.create(n,null,s))}this.negated=e[0]}return this.negated}}class ce extends rc{constructor(e,t,i){super(e,null),this._defaultValue=t,typeof i==\"object\"?ce._info.push(Object.assign(Object.assign({},i),{key:e})):i!==!0&&ce._info.push({key:e,description:i,type:t!=null?typeof t:void 0})}static all(){return ce._info.values()}bindTo(e){return e.createKey(this.key,this._defaultValue)}getValue(e){return e.getContextKeyValue(this.key)}toNegated(){return this.negate()}isEqualTo(e){return ng.create(this.key,e)}}ce._info=[];const xe=qe(\"contextKeyService\"),UB=\"setContext\";function JO(o,e){return o<e?-1:o>e?1:0}function gh(o,e,t,i){return o<t?-1:o>t?1:e<i?-1:e>i?1:0}function eP(o,e){if(e.type===6&&o.type!==9&&o.type!==6){for(const n of e.expr)if(o.equals(n))return!0}const t=o.negate(),i=V0(t).concat(V0(e));i.sort(Iu);for(let n=0;n<i.length;n++){const r=i[n].negate();for(let a=n+1;a<i.length;a++){const l=i[a];if(r.equals(l))return!0}}return!1}function V0(o){return o.type===9?o.expr:[o]}function Yf(o,e){if(!o)throw new Error(e?`Assertion failed (${e})`:\"Assertion Failed\")}class $B{constructor(){this.data=new Map}add(e,t){Yf(ts(e)),Yf(Fn(t)),Yf(!this.data.has(e),\"There is already an extension with this id\"),this.data.set(e,t)}as(e){return this.data.get(e)||null}}const di=new $B;var Vs;(function(o){o.DARK=\"dark\",o.LIGHT=\"light\",o.HIGH_CONTRAST_DARK=\"hcDark\",o.HIGH_CONTRAST_LIGHT=\"hcLight\"})(Vs||(Vs={}));function yn(o){return o===Vs.HIGH_CONTRAST_DARK||o===Vs.HIGH_CONTRAST_LIGHT}function Xx(o){return o===Vs.DARK||o===Vs.HIGH_CONTRAST_DARK}const vt=qe(\"themeService\");var xy;(function(o){function e(t){return t&&typeof t==\"object\"&&typeof t.id==\"string\"}o.isThemeColor=e})(xy||(xy={}));function Qt(o){return{id:o}}var nt;(function(o){function e(c){return c&&typeof c==\"object\"&&typeof c.id==\"string\"&&(typeof c.color==\"undefined\"||xy.isThemeColor(c.color))}o.isThemeIcon=e;const t=new RegExp(`^\\\\$\\\\((${Cn.iconNameExpression}(?:${Cn.iconModifierExpression})?)\\\\)$`);function i(c){const d=t.exec(c);if(!d)return;const[,h]=d;return{id:h}}o.fromString=i;function n(c){return{id:c}}o.fromId=n;function s(c,d){let h=c.id;const u=h.lastIndexOf(\"~\");return u!==-1&&(h=h.substring(0,u)),d&&(h=`${h}~${d}`),{id:h}}o.modify=s;function r(c){const d=c.id.lastIndexOf(\"~\");if(d!==-1)return c.id.substring(d+1)}o.getModifier=r;function a(c,d){var h,u;return c.id===d.id&&((h=c.color)===null||h===void 0?void 0:h.id)===((u=d.color)===null||u===void 0?void 0:u.id)}o.isEqual=a;function l(c,d){return{id:c.id,color:d?Qt(d):void 0}}o.asThemeIcon=l,o.asClassNameArray=Cn.asClassNameArray,o.asClassName=Cn.asClassName,o.asCSSSelector=Cn.asCSSSelector})(nt||(nt={}));function H0(o){switch(o){case Vs.DARK:return\"vs-dark\";case Vs.HIGH_CONTRAST_DARK:return\"hc-black\";case Vs.HIGH_CONTRAST_LIGHT:return\"hc-light\";default:return\"vs\"}}const tP={ThemingContribution:\"base.contributions.theming\"};class jB{constructor(){this.themingParticipants=[],this.themingParticipants=[],this.onThemingParticipantAddedEmitter=new O}onColorThemeChange(e){return this.themingParticipants.push(e),this.onThemingParticipantAddedEmitter.fire(e),ze(()=>{const t=this.themingParticipants.indexOf(e);this.themingParticipants.splice(t,1)})}getThemingParticipants(){return this.themingParticipants}}const iP=new jB;di.add(tP.ThemingContribution,iP);function Rt(o){return iP.onColorThemeChange(o)}class KB extends z{constructor(e){super(),this.themeService=e,this.theme=e.getColorTheme(),this._register(this.themeService.onDidColorThemeChange(t=>this.onThemeChange(t)))}onThemeChange(e){this.theme=e,this.updateStyles()}updateStyles(){}}var qB=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},_T=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};function ou(o){return o.command!==void 0}class A{constructor(e){if(A._instances.has(e))throw new TypeError(`MenuId with identifier '${e}' already exists. Use MenuId.for(ident) or a unique identifier`);A._instances.set(e,this),this.id=e}}A._instances=new Map;A.CommandPalette=new A(\"CommandPalette\");A.DebugBreakpointsContext=new A(\"DebugBreakpointsContext\");A.DebugCallStackContext=new A(\"DebugCallStackContext\");A.DebugConsoleContext=new A(\"DebugConsoleContext\");A.DebugVariablesContext=new A(\"DebugVariablesContext\");A.DebugWatchContext=new A(\"DebugWatchContext\");A.DebugToolBar=new A(\"DebugToolBar\");A.DebugToolBarStop=new A(\"DebugToolBarStop\");A.EditorContext=new A(\"EditorContext\");A.SimpleEditorContext=new A(\"SimpleEditorContext\");A.EditorContextCopy=new A(\"EditorContextCopy\");A.EditorContextPeek=new A(\"EditorContextPeek\");A.EditorContextShare=new A(\"EditorContextShare\");A.EditorTitle=new A(\"EditorTitle\");A.EditorTitleRun=new A(\"EditorTitleRun\");A.EditorTitleContext=new A(\"EditorTitleContext\");A.EmptyEditorGroup=new A(\"EmptyEditorGroup\");A.EmptyEditorGroupContext=new A(\"EmptyEditorGroupContext\");A.ExplorerContext=new A(\"ExplorerContext\");A.ExtensionContext=new A(\"ExtensionContext\");A.GlobalActivity=new A(\"GlobalActivity\");A.CommandCenter=new A(\"CommandCenter\");A.LayoutControlMenuSubmenu=new A(\"LayoutControlMenuSubmenu\");A.LayoutControlMenu=new A(\"LayoutControlMenu\");A.MenubarMainMenu=new A(\"MenubarMainMenu\");A.MenubarAppearanceMenu=new A(\"MenubarAppearanceMenu\");A.MenubarDebugMenu=new A(\"MenubarDebugMenu\");A.MenubarEditMenu=new A(\"MenubarEditMenu\");A.MenubarCopy=new A(\"MenubarCopy\");A.MenubarFileMenu=new A(\"MenubarFileMenu\");A.MenubarGoMenu=new A(\"MenubarGoMenu\");A.MenubarHelpMenu=new A(\"MenubarHelpMenu\");A.MenubarLayoutMenu=new A(\"MenubarLayoutMenu\");A.MenubarNewBreakpointMenu=new A(\"MenubarNewBreakpointMenu\");A.MenubarPanelAlignmentMenu=new A(\"MenubarPanelAlignmentMenu\");A.MenubarPanelPositionMenu=new A(\"MenubarPanelPositionMenu\");A.MenubarPreferencesMenu=new A(\"MenubarPreferencesMenu\");A.MenubarRecentMenu=new A(\"MenubarRecentMenu\");A.MenubarSelectionMenu=new A(\"MenubarSelectionMenu\");A.MenubarShare=new A(\"MenubarShare\");A.MenubarSwitchEditorMenu=new A(\"MenubarSwitchEditorMenu\");A.MenubarSwitchGroupMenu=new A(\"MenubarSwitchGroupMenu\");A.MenubarTerminalMenu=new A(\"MenubarTerminalMenu\");A.MenubarViewMenu=new A(\"MenubarViewMenu\");A.MenubarHomeMenu=new A(\"MenubarHomeMenu\");A.OpenEditorsContext=new A(\"OpenEditorsContext\");A.ProblemsPanelContext=new A(\"ProblemsPanelContext\");A.SCMChangeContext=new A(\"SCMChangeContext\");A.SCMResourceContext=new A(\"SCMResourceContext\");A.SCMResourceFolderContext=new A(\"SCMResourceFolderContext\");A.SCMResourceGroupContext=new A(\"SCMResourceGroupContext\");A.SCMSourceControl=new A(\"SCMSourceControl\");A.SCMTitle=new A(\"SCMTitle\");A.SearchContext=new A(\"SearchContext\");A.StatusBarWindowIndicatorMenu=new A(\"StatusBarWindowIndicatorMenu\");A.StatusBarRemoteIndicatorMenu=new A(\"StatusBarRemoteIndicatorMenu\");A.TestItem=new A(\"TestItem\");A.TestItemGutter=new A(\"TestItemGutter\");A.TestPeekElement=new A(\"TestPeekElement\");A.TestPeekTitle=new A(\"TestPeekTitle\");A.TouchBarContext=new A(\"TouchBarContext\");A.TitleBarContext=new A(\"TitleBarContext\");A.TitleBarTitleContext=new A(\"TitleBarTitleContext\");A.TunnelContext=new A(\"TunnelContext\");A.TunnelPrivacy=new A(\"TunnelPrivacy\");A.TunnelProtocol=new A(\"TunnelProtocol\");A.TunnelPortInline=new A(\"TunnelInline\");A.TunnelTitle=new A(\"TunnelTitle\");A.TunnelLocalAddressInline=new A(\"TunnelLocalAddressInline\");A.TunnelOriginInline=new A(\"TunnelOriginInline\");A.ViewItemContext=new A(\"ViewItemContext\");A.ViewContainerTitle=new A(\"ViewContainerTitle\");A.ViewContainerTitleContext=new A(\"ViewContainerTitleContext\");A.ViewTitle=new A(\"ViewTitle\");A.ViewTitleContext=new A(\"ViewTitleContext\");A.CommentThreadTitle=new A(\"CommentThreadTitle\");A.CommentThreadActions=new A(\"CommentThreadActions\");A.CommentTitle=new A(\"CommentTitle\");A.CommentActions=new A(\"CommentActions\");A.InteractiveToolbar=new A(\"InteractiveToolbar\");A.InteractiveCellTitle=new A(\"InteractiveCellTitle\");A.InteractiveCellDelete=new A(\"InteractiveCellDelete\");A.InteractiveCellExecute=new A(\"InteractiveCellExecute\");A.InteractiveInputExecute=new A(\"InteractiveInputExecute\");A.NotebookToolbar=new A(\"NotebookToolbar\");A.NotebookCellTitle=new A(\"NotebookCellTitle\");A.NotebookCellDelete=new A(\"NotebookCellDelete\");A.NotebookCellInsert=new A(\"NotebookCellInsert\");A.NotebookCellBetween=new A(\"NotebookCellBetween\");A.NotebookCellListTop=new A(\"NotebookCellTop\");A.NotebookCellExecute=new A(\"NotebookCellExecute\");A.NotebookCellExecutePrimary=new A(\"NotebookCellExecutePrimary\");A.NotebookDiffCellInputTitle=new A(\"NotebookDiffCellInputTitle\");A.NotebookDiffCellMetadataTitle=new A(\"NotebookDiffCellMetadataTitle\");A.NotebookDiffCellOutputsTitle=new A(\"NotebookDiffCellOutputsTitle\");A.NotebookOutputToolbar=new A(\"NotebookOutputToolbar\");A.NotebookEditorLayoutConfigure=new A(\"NotebookEditorLayoutConfigure\");A.NotebookKernelSource=new A(\"NotebookKernelSource\");A.BulkEditTitle=new A(\"BulkEditTitle\");A.BulkEditContext=new A(\"BulkEditContext\");A.TimelineItemContext=new A(\"TimelineItemContext\");A.TimelineTitle=new A(\"TimelineTitle\");A.TimelineTitleContext=new A(\"TimelineTitleContext\");A.TimelineFilterSubMenu=new A(\"TimelineFilterSubMenu\");A.AccountsContext=new A(\"AccountsContext\");A.PanelTitle=new A(\"PanelTitle\");A.AuxiliaryBarTitle=new A(\"AuxiliaryBarTitle\");A.TerminalInstanceContext=new A(\"TerminalInstanceContext\");A.TerminalEditorInstanceContext=new A(\"TerminalEditorInstanceContext\");A.TerminalNewDropdownContext=new A(\"TerminalNewDropdownContext\");A.TerminalTabContext=new A(\"TerminalTabContext\");A.TerminalTabEmptyAreaContext=new A(\"TerminalTabEmptyAreaContext\");A.TerminalInlineTabContext=new A(\"TerminalInlineTabContext\");A.WebviewContext=new A(\"WebviewContext\");A.InlineCompletionsActions=new A(\"InlineCompletionsActions\");A.NewFile=new A(\"NewFile\");A.MergeToolbar=new A(\"MergeToolbar\");A.MergeInput1Toolbar=new A(\"MergeToolbar1Toolbar\");A.MergeInput2Toolbar=new A(\"MergeToolbar2Toolbar\");const fh=qe(\"menuService\"),po=new class{constructor(){this._commands=new Map,this._menuItems=new Map,this._onDidChangeMenu=new O,this.onDidChangeMenu=this._onDidChangeMenu.event,this._commandPaletteChangeEvent={has:o=>o===A.CommandPalette}}addCommand(o){return this.addCommands(Ue.single(o))}addCommands(o){for(const e of o)this._commands.set(e.id,e);return this._onDidChangeMenu.fire(this._commandPaletteChangeEvent),ze(()=>{let e=!1;for(const t of o)e=this._commands.delete(t.id)||e;e&&this._onDidChangeMenu.fire(this._commandPaletteChangeEvent)})}getCommand(o){return this._commands.get(o)}getCommands(){const o=new Map;return this._commands.forEach((e,t)=>o.set(t,e)),o}appendMenuItem(o,e){return this.appendMenuItems(Ue.single({id:o,item:e}))}appendMenuItems(o){const e=new Set,t=new wn;for(const{id:i,item:n}of o){let s=this._menuItems.get(i);s||(s=new wn,this._menuItems.set(i,s)),t.push(s.push(n)),e.add(i)}return this._onDidChangeMenu.fire(e),ze(()=>{if(t.size>0){for(const i of t)i();this._onDidChangeMenu.fire(e),t.clear()}})}getMenuItems(o){let e;return this._menuItems.has(o)?e=[...this._menuItems.get(o)]:e=[],o===A.CommandPalette&&this._appendImplicitItems(e),e}_appendImplicitItems(o){const e=new Set;for(const t of o)ou(t)&&(e.add(t.command.id),t.alt&&e.add(t.alt.id));this._commands.forEach((t,i)=>{e.has(i)||o.push({command:t})})}};class Qx extends Ip{constructor(e,t,i,n){super(`submenuitem.${e.submenu.id}`,typeof e.title==\"string\"?e.title:e.title.value,[],\"submenu\"),this.item=e,this._menuService=t,this._contextKeyService=i,this._options=n}get actions(){const e=[],t=this._menuService.createMenu(this.item.submenu,this._contextKeyService),i=t.getActions(this._options);t.dispose();for(const[,n]of i)n.length>0&&(e.push(...n),e.push(new Ji));return e.length&&e.pop(),e}}let ac=class nP{constructor(e,t,i,n,s,r){var a,l;if(this.hideActions=n,this._commandService=r,this.id=e.id,this.label=(i==null?void 0:i.renderShortTitle)&&e.shortTitle?typeof e.shortTitle==\"string\"?e.shortTitle:e.shortTitle.value:typeof e.title==\"string\"?e.title:e.title.value,this.tooltip=(l=typeof e.tooltip==\"string\"?e.tooltip:(a=e.tooltip)===null||a===void 0?void 0:a.value)!==null&&l!==void 0?l:\"\",this.enabled=!e.precondition||s.contextMatchesRules(e.precondition),this.checked=void 0,e.toggled){const c=e.toggled.condition?e.toggled:{condition:e.toggled};this.checked=s.contextMatchesRules(c.condition),this.checked&&c.tooltip&&(this.tooltip=typeof c.tooltip==\"string\"?c.tooltip:c.tooltip.value),c.title&&(this.label=typeof c.title==\"string\"?c.title:c.title.value)}this.item=e,this.alt=t?new nP(t,void 0,i,n,s,r):void 0,this._options=i,nt.isThemeIcon(e.icon)&&(this.class=Cn.asClassName(e.icon))}dispose(){}run(...e){var t,i;let n=[];return!((t=this._options)===null||t===void 0)&&t.arg&&(n=[...n,this._options.arg]),!((i=this._options)===null||i===void 0)&&i.shouldForwardArgs&&(n=[...n,...e]),this._commandService.executeCommand(this.id,...n)}};ac=qB([_T(4,xe),_T(5,Ci)],ac);class z0{constructor(){this._coreKeybindings=[],this._extensionKeybindings=[],this._cachedMergedKeybindings=null}static bindToCurrentPlatform(e){if(Os===1){if(e&&e.win)return e.win}else if(Os===2){if(e&&e.mac)return e.mac}else if(e&&e.linux)return e.linux;return e}registerKeybindingRule(e){const t=z0.bindToCurrentPlatform(e);if(t&&t.primary){const i=_y(t.primary,Os);i&&this._registerDefaultKeybinding(i,e.id,e.args,e.weight,0,e.when)}if(t&&Array.isArray(t.secondary))for(let i=0,n=t.secondary.length;i<n;i++){const s=t.secondary[i],r=_y(s,Os);r&&this._registerDefaultKeybinding(r,e.id,e.args,e.weight,-i-1,e.when)}}registerCommandAndKeybindingRule(e){this.registerKeybindingRule(e),Ye.registerCommand(e)}static _mightProduceChar(e){return e>=21&&e<=30||e>=31&&e<=56?!0:e===80||e===81||e===82||e===83||e===84||e===85||e===86||e===110||e===111||e===87||e===88||e===89||e===90||e===91||e===92}_assertNoCtrlAlt(e,t){e.ctrlKey&&e.altKey&&!e.metaKey&&z0._mightProduceChar(e.keyCode)&&console.warn(\"Ctrl+Alt+ keybindings should not be used by default under Windows. Offender: \",e,\" for \",t)}_registerDefaultKeybinding(e,t,i,n,s,r){Os===1&&this._assertNoCtrlAlt(e.parts[0],t),this._coreKeybindings.push({keybinding:e.parts,command:t,commandArgs:i,when:r,weight1:n,weight2:s,extensionId:null,isBuiltinExtension:!1}),this._cachedMergedKeybindings=null}getDefaultKeybindings(){return this._cachedMergedKeybindings||(this._cachedMergedKeybindings=[].concat(this._coreKeybindings).concat(this._extensionKeybindings),this._cachedMergedKeybindings.sort(ZB)),this._cachedMergedKeybindings.slice(0)}}const ls=new z0,GB={EditorModes:\"platform.keybindingsRegistry\"};di.add(GB.EditorModes,ls);function ZB(o,e){return o.weight1!==e.weight1?o.weight1-e.weight1:o.command<e.command?-1:o.command>e.command?1:o.weight2-e.weight2}const rl=qe(\"telemetryService\"),Co=qe(\"logService\");var Fo;(function(o){o[o.Trace=0]=\"Trace\",o[o.Debug=1]=\"Debug\",o[o.Info=2]=\"Info\",o[o.Warning=3]=\"Warning\",o[o.Error=4]=\"Error\",o[o.Critical=5]=\"Critical\",o[o.Off=6]=\"Off\"})(Fo||(Fo={}));const sP=Fo.Info;class YB extends z{constructor(){super(...arguments),this.level=sP,this._onDidChangeLogLevel=this._register(new O)}setLevel(e){this.level!==e&&(this.level=e,this._onDidChangeLogLevel.fire(this.level))}getLevel(){return this.level}}class XB extends YB{constructor(e=sP){super(),this.setLevel(e)}trace(e,...t){this.getLevel()<=Fo.Trace&&console.log(\"%cTRACE\",\"color: #888\",e,...t)}debug(e,...t){this.getLevel()<=Fo.Debug&&console.log(\"%cDEBUG\",\"background: #eee; color: #888\",e,...t)}info(e,...t){this.getLevel()<=Fo.Info&&console.log(\"%c INFO\",\"color: #33f\",e,...t)}error(e,...t){this.getLevel()<=Fo.Error&&console.log(\"%c  ERR\",\"color: #f33\",e,...t)}dispose(){}}class QB extends z{constructor(e){super(),this.logger=e,this._register(e)}getLevel(){return this.logger.getLevel()}trace(e,...t){this.logger.trace(e,...t)}debug(e,...t){this.logger.debug(e,...t)}info(e,...t){this.logger.info(e,...t)}error(e,...t){this.logger.error(e,...t)}}class RC{constructor(e){this.id=e.id,this.precondition=e.precondition,this._kbOpts=e.kbOpts,this._menuOpts=e.menuOpts,this._description=e.description}register(){if(Array.isArray(this._menuOpts)?this._menuOpts.forEach(this._registerMenuItem,this):this._menuOpts&&this._registerMenuItem(this._menuOpts),this._kbOpts){const e=Array.isArray(this._kbOpts)?this._kbOpts:[this._kbOpts];for(const t of e){let i=t.kbExpr;this.precondition&&(i?i=re.and(i,this.precondition):i=this.precondition);const n={id:this.id,weight:t.weight,args:t.args,when:i,primary:t.primary,secondary:t.secondary,win:t.win,linux:t.linux,mac:t.mac};ls.registerKeybindingRule(n)}}Ye.registerCommand({id:this.id,handler:(e,t)=>this.runCommand(e,t),description:this._description})}_registerMenuItem(e){po.appendMenuItem(e.menuId,{group:e.group,command:{id:this.id,title:e.title,icon:e.icon,precondition:this.precondition},when:e.when,order:e.order})}}class Og extends RC{constructor(){super(...arguments),this._implementations=[]}addImplementation(e,t,i){return this._implementations.push({priority:e,name:t,implementation:i}),this._implementations.sort((n,s)=>s.priority-n.priority),{dispose:()=>{for(let n=0;n<this._implementations.length;n++)if(this._implementations[n].implementation===i){this._implementations.splice(n,1);return}}}}runCommand(e,t){const i=e.get(Co);i.trace(`Executing Command '${this.id}' which has ${this._implementations.length} bound.`);for(const n of this._implementations){const s=n.implementation(e,t);if(s)return i.trace(`Command '${this.id}' was handled by '${n.name}'.`),typeof s==\"boolean\"?void 0:s}i.trace(`The Command '${this.id}' was not handled by any implementation.`)}}class oP extends RC{constructor(e,t){super(t),this.command=e}runCommand(e,t){return this.command.runCommand(e,t)}}class ji extends RC{static bindToContribution(e){return class extends ji{constructor(i){super(i),this._callback=i.handler}runEditorCommand(i,n,s){const r=e(n);r&&this._callback(r,s)}}}runCommand(e,t){const i=e.get(dt),n=i.getFocusedCodeEditor()||i.getActiveCodeEditor();if(!!n)return n.invokeWithinContext(s=>{if(!!s.get(xe).contextMatchesRules(Na(this.precondition)))return this.runEditorCommand(s,n,t)})}}class he extends ji{constructor(e){super(he.convertOptions(e)),this.label=e.label,this.alias=e.alias}static convertOptions(e){let t;Array.isArray(e.menuOpts)?t=e.menuOpts:e.menuOpts?t=[e.menuOpts]:t=[];function i(n){return n.menuId||(n.menuId=A.EditorContext),n.title||(n.title=e.label),n.when=re.and(e.precondition,n.when),n}return Array.isArray(e.contextMenuOpts)?t.push(...e.contextMenuOpts.map(i)):e.contextMenuOpts&&t.push(i(e.contextMenuOpts)),e.menuOpts=t,e}runEditorCommand(e,t,i){return this.reportTelemetry(e,t),this.run(e,t,i||{})}reportTelemetry(e,t){e.get(rl).publicLog2(\"editorActionInvoked\",{name:this.label,id:this.id})}}class rP extends he{constructor(){super(...arguments),this._implementations=[]}addImplementation(e,t){return this._implementations.push([e,t]),this._implementations.sort((i,n)=>n[0]-i[0]),{dispose:()=>{for(let i=0;i<this._implementations.length;i++)if(this._implementations[i][1]===t){this._implementations.splice(i,1);return}}}}run(e,t,i){for(const n of this._implementations){const s=n[1](e,t,i);if(s)return typeof s==\"boolean\"?void 0:s}}}function Jr(o,e){Ye.registerCommand(o,function(t,...i){const n=t.get(Re),[s,r]=i;gt(me.isUri(s)),gt(B.isIPosition(r));const a=t.get(Bt).getModel(s);if(a){const l=B.lift(r);return n.invokeFunction(e,a,l,...i.slice(2))}return t.get($n).createModelReference(s).then(l=>new Promise((c,d)=>{try{const h=n.invokeFunction(e,l.object.textEditorModel,B.lift(r),i.slice(2));c(h)}catch(h){d(h)}}).finally(()=>{l.dispose()}))})}function Q(o){return Ps.INSTANCE.registerEditorCommand(o),o}function te(o){const e=new o;return Ps.INSTANCE.registerEditorAction(e),e}function aP(o){return Ps.INSTANCE.registerEditorAction(o),o}function lP(o){Ps.INSTANCE.registerEditorAction(o)}function rt(o,e){Ps.INSTANCE.registerEditorContribution(o,e)}var _d;(function(o){function e(r){return Ps.INSTANCE.getEditorCommand(r)}o.getEditorCommand=e;function t(){return Ps.INSTANCE.getEditorActions()}o.getEditorActions=t;function i(){return Ps.INSTANCE.getEditorContributions()}o.getEditorContributions=i;function n(r){return Ps.INSTANCE.getEditorContributions().filter(a=>r.indexOf(a.id)>=0)}o.getSomeEditorContributions=n;function s(){return Ps.INSTANCE.getDiffEditorContributions()}o.getDiffEditorContributions=s})(_d||(_d={}));const JB={EditorCommonContributions:\"editor.contributions\"};class Ps{constructor(){this.editorContributions=[],this.diffEditorContributions=[],this.editorActions=[],this.editorCommands=Object.create(null)}registerEditorContribution(e,t){this.editorContributions.push({id:e,ctor:t})}getEditorContributions(){return this.editorContributions.slice(0)}getDiffEditorContributions(){return this.diffEditorContributions.slice(0)}registerEditorAction(e){e.register(),this.editorActions.push(e)}getEditorActions(){return this.editorActions.slice(0)}registerEditorCommand(e){e.register(),this.editorCommands[e.id]=e}getEditorCommand(e){return this.editorCommands[e]||null}}Ps.INSTANCE=new Ps;di.add(JB.EditorCommonContributions,Ps.INSTANCE);function jm(o){return o.register(),o}const cP=jm(new Og({id:\"undo\",precondition:void 0,kbOpts:{weight:0,primary:2104},menuOpts:[{menuId:A.MenubarEditMenu,group:\"1_do\",title:p({key:\"miUndo\",comment:[\"&& denotes a mnemonic\"]},\"&&Undo\"),order:1},{menuId:A.CommandPalette,group:\"\",title:p(\"undo\",\"Undo\"),order:1}]}));jm(new oP(cP,{id:\"default:undo\",precondition:void 0}));const dP=jm(new Og({id:\"redo\",precondition:void 0,kbOpts:{weight:0,primary:2103,secondary:[3128],mac:{primary:3128}},menuOpts:[{menuId:A.MenubarEditMenu,group:\"1_do\",title:p({key:\"miRedo\",comment:[\"&& denotes a mnemonic\"]},\"&&Redo\"),order:2},{menuId:A.CommandPalette,group:\"\",title:p(\"redo\",\"Redo\"),order:1}]}));jm(new oP(dP,{id:\"default:redo\",precondition:void 0}));const eW=jm(new Og({id:\"editor.action.selectAll\",precondition:void 0,kbOpts:{weight:0,kbExpr:null,primary:2079},menuOpts:[{menuId:A.MenubarSelectionMenu,group:\"1_basic\",title:p({key:\"miSelectAll\",comment:[\"&& denotes a mnemonic\"]},\"&&Select All\"),order:1},{menuId:A.CommandPalette,group:\"\",title:p(\"selectAll\",\"Select All\"),order:1}]}));class L{constructor(e,t,i,n){e>i||e===i&&t>n?(this.startLineNumber=i,this.startColumn=n,this.endLineNumber=e,this.endColumn=t):(this.startLineNumber=e,this.startColumn=t,this.endLineNumber=i,this.endColumn=n)}isEmpty(){return L.isEmpty(this)}static isEmpty(e){return e.startLineNumber===e.endLineNumber&&e.startColumn===e.endColumn}containsPosition(e){return L.containsPosition(this,e)}static containsPosition(e,t){return!(t.lineNumber<e.startLineNumber||t.lineNumber>e.endLineNumber||t.lineNumber===e.startLineNumber&&t.column<e.startColumn||t.lineNumber===e.endLineNumber&&t.column>e.endColumn)}static strictContainsPosition(e,t){return!(t.lineNumber<e.startLineNumber||t.lineNumber>e.endLineNumber||t.lineNumber===e.startLineNumber&&t.column<=e.startColumn||t.lineNumber===e.endLineNumber&&t.column>=e.endColumn)}containsRange(e){return L.containsRange(this,e)}static containsRange(e,t){return!(t.startLineNumber<e.startLineNumber||t.endLineNumber<e.startLineNumber||t.startLineNumber>e.endLineNumber||t.endLineNumber>e.endLineNumber||t.startLineNumber===e.startLineNumber&&t.startColumn<e.startColumn||t.endLineNumber===e.endLineNumber&&t.endColumn>e.endColumn)}strictContainsRange(e){return L.strictContainsRange(this,e)}static strictContainsRange(e,t){return!(t.startLineNumber<e.startLineNumber||t.endLineNumber<e.startLineNumber||t.startLineNumber>e.endLineNumber||t.endLineNumber>e.endLineNumber||t.startLineNumber===e.startLineNumber&&t.startColumn<=e.startColumn||t.endLineNumber===e.endLineNumber&&t.endColumn>=e.endColumn)}plusRange(e){return L.plusRange(this,e)}static plusRange(e,t){let i,n,s,r;return t.startLineNumber<e.startLineNumber?(i=t.startLineNumber,n=t.startColumn):t.startLineNumber===e.startLineNumber?(i=t.startLineNumber,n=Math.min(t.startColumn,e.startColumn)):(i=e.startLineNumber,n=e.startColumn),t.endLineNumber>e.endLineNumber?(s=t.endLineNumber,r=t.endColumn):t.endLineNumber===e.endLineNumber?(s=t.endLineNumber,r=Math.max(t.endColumn,e.endColumn)):(s=e.endLineNumber,r=e.endColumn),new L(i,n,s,r)}intersectRanges(e){return L.intersectRanges(this,e)}static intersectRanges(e,t){let i=e.startLineNumber,n=e.startColumn,s=e.endLineNumber,r=e.endColumn;const a=t.startLineNumber,l=t.startColumn,c=t.endLineNumber,d=t.endColumn;return i<a?(i=a,n=l):i===a&&(n=Math.max(n,l)),s>c?(s=c,r=d):s===c&&(r=Math.min(r,d)),i>s||i===s&&n>r?null:new L(i,n,s,r)}equalsRange(e){return L.equalsRange(this,e)}static equalsRange(e,t){return!!e&&!!t&&e.startLineNumber===t.startLineNumber&&e.startColumn===t.startColumn&&e.endLineNumber===t.endLineNumber&&e.endColumn===t.endColumn}getEndPosition(){return L.getEndPosition(this)}static getEndPosition(e){return new B(e.endLineNumber,e.endColumn)}getStartPosition(){return L.getStartPosition(this)}static getStartPosition(e){return new B(e.startLineNumber,e.startColumn)}toString(){return\"[\"+this.startLineNumber+\",\"+this.startColumn+\" -> \"+this.endLineNumber+\",\"+this.endColumn+\"]\"}setEndPosition(e,t){return new L(this.startLineNumber,this.startColumn,e,t)}setStartPosition(e,t){return new L(e,t,this.endLineNumber,this.endColumn)}collapseToStart(){return L.collapseToStart(this)}static collapseToStart(e){return new L(e.startLineNumber,e.startColumn,e.startLineNumber,e.startColumn)}static fromPositions(e,t=e){return new L(e.lineNumber,e.column,t.lineNumber,t.column)}static lift(e){return e?new L(e.startLineNumber,e.startColumn,e.endLineNumber,e.endColumn):null}static isIRange(e){return e&&typeof e.startLineNumber==\"number\"&&typeof e.startColumn==\"number\"&&typeof e.endLineNumber==\"number\"&&typeof e.endColumn==\"number\"}static areIntersectingOrTouching(e,t){return!(e.endLineNumber<t.startLineNumber||e.endLineNumber===t.startLineNumber&&e.endColumn<t.startColumn||t.endLineNumber<e.startLineNumber||t.endLineNumber===e.startLineNumber&&t.endColumn<e.startColumn)}static areIntersecting(e,t){return!(e.endLineNumber<t.startLineNumber||e.endLineNumber===t.startLineNumber&&e.endColumn<=t.startColumn||t.endLineNumber<e.startLineNumber||t.endLineNumber===e.startLineNumber&&t.endColumn<=e.startColumn)}static compareRangesUsingStarts(e,t){if(e&&t){const s=e.startLineNumber|0,r=t.startLineNumber|0;if(s===r){const a=e.startColumn|0,l=t.startColumn|0;if(a===l){const c=e.endLineNumber|0,d=t.endLineNumber|0;if(c===d){const h=e.endColumn|0,u=t.endColumn|0;return h-u}return c-d}return a-l}return s-r}return(e?1:0)-(t?1:0)}static compareRangesUsingEnds(e,t){return e.endLineNumber===t.endLineNumber?e.endColumn===t.endColumn?e.startLineNumber===t.startLineNumber?e.startColumn-t.startColumn:e.startLineNumber-t.startLineNumber:e.endColumn-t.endColumn:e.endLineNumber-t.endLineNumber}static spansMultipleLines(e){return e.endLineNumber>e.startLineNumber}toJSON(){return this}}class oe extends L{constructor(e,t,i,n){super(e,t,i,n),this.selectionStartLineNumber=e,this.selectionStartColumn=t,this.positionLineNumber=i,this.positionColumn=n}toString(){return\"[\"+this.selectionStartLineNumber+\",\"+this.selectionStartColumn+\" -> \"+this.positionLineNumber+\",\"+this.positionColumn+\"]\"}equalsSelection(e){return oe.selectionsEqual(this,e)}static selectionsEqual(e,t){return e.selectionStartLineNumber===t.selectionStartLineNumber&&e.selectionStartColumn===t.selectionStartColumn&&e.positionLineNumber===t.positionLineNumber&&e.positionColumn===t.positionColumn}getDirection(){return this.selectionStartLineNumber===this.startLineNumber&&this.selectionStartColumn===this.startColumn?0:1}setEndPosition(e,t){return this.getDirection()===0?new oe(this.startLineNumber,this.startColumn,e,t):new oe(e,t,this.startLineNumber,this.startColumn)}getPosition(){return new B(this.positionLineNumber,this.positionColumn)}getSelectionStart(){return new B(this.selectionStartLineNumber,this.selectionStartColumn)}setStartPosition(e,t){return this.getDirection()===0?new oe(e,t,this.endLineNumber,this.endColumn):new oe(this.endLineNumber,this.endColumn,e,t)}static fromPositions(e,t=e){return new oe(e.lineNumber,e.column,t.lineNumber,t.column)}static fromRange(e,t){return t===0?new oe(e.startLineNumber,e.startColumn,e.endLineNumber,e.endColumn):new oe(e.endLineNumber,e.endColumn,e.startLineNumber,e.startColumn)}static liftSelection(e){return new oe(e.selectionStartLineNumber,e.selectionStartColumn,e.positionLineNumber,e.positionColumn)}static selectionsArrEqual(e,t){if(e&&!t||!e&&t)return!1;if(!e&&!t)return!0;if(e.length!==t.length)return!1;for(let i=0,n=e.length;i<n;i++)if(!this.selectionsEqual(e[i],t[i]))return!1;return!0}static isISelection(e){return e&&typeof e.selectionStartLineNumber==\"number\"&&typeof e.selectionStartColumn==\"number\"&&typeof e.positionLineNumber==\"number\"&&typeof e.positionColumn==\"number\"}static createWithDirection(e,t,i,n,s){return s===0?new oe(e,t,i,n):new oe(i,n,e,t)}}function OC(o,e){const t=o.getCount(),i=o.findTokenIndexAtOffset(e),n=o.getLanguageId(i);let s=i;for(;s+1<t&&o.getLanguageId(s+1)===n;)s++;let r=i;for(;r>0&&o.getLanguageId(r-1)===n;)r--;return new tW(o,n,r,s+1,o.getStartOffset(r),o.getEndOffset(s))}class tW{constructor(e,t,i,n,s,r){this._scopedLineTokensBrand=void 0,this._actual=e,this.languageId=t,this._firstTokenIndex=i,this._lastTokenIndex=n,this.firstCharOffset=s,this._lastCharOffset=r}getLineContent(){return this._actual.getLineContent().substring(this.firstCharOffset,this._lastCharOffset)}getActualLineContentBefore(e){return this._actual.getLineContent().substring(0,this.firstCharOffset+e)}getTokenCount(){return this._lastTokenIndex-this._firstTokenIndex}findTokenIndexAtOffset(e){return this._actual.findTokenIndexAtOffset(e+this.firstCharOffset)-this._firstTokenIndex}getStandardTokenType(e){return this._actual.getStandardTokenType(e+this._firstTokenIndex)}}function ur(o){return(o&3)!==0}class _i{static _nextVisibleColumn(e,t,i){return e===9?_i.nextRenderTabStop(t,i):oc(e)||Gx(e)?t+2:t+1}static visibleColumnFromColumn(e,t,i){const n=Math.min(t-1,e.length),s=e.substring(0,n),r=new B0(s);let a=0;for(;!r.eol();){const l=F0(s,n,r.offset);r.nextGraphemeLength(),a=this._nextVisibleColumn(l,a,i)}return a}static columnFromVisibleColumn(e,t,i){if(t<=0)return 1;const n=e.length,s=new B0(e);let r=0,a=1;for(;!s.eol();){const l=F0(e,n,s.offset);s.nextGraphemeLength();const c=this._nextVisibleColumn(l,r,i),d=s.offset+1;if(c>=t){const h=t-r;return c-t<h?d:a}r=c,a=d}return n+1}static nextRenderTabStop(e,t){return e+t-e%t}static nextIndentTabStop(e,t){return e+t-e%t}static prevRenderTabStop(e,t){return Math.max(0,e-1-(e-1)%t)}static prevIndentTabStop(e,t){return Math.max(0,e-1-(e-1)%t)}}function iW(o,e,t){let i=0;for(let s=0;s<o.length;s++)o.charAt(s)===\"\t\"?i=_i.nextIndentTabStop(i,e):i++;let n=\"\";if(!t){const s=Math.floor(i/e);i=i%e;for(let r=0;r<s;r++)n+=\"\t\"}for(let s=0;s<i;s++)n+=\" \";return n}function U0(o,e,t){let i=Sn(o);return i===-1&&(i=o.length),iW(o.substring(0,i),e,t)+o.substring(i)}const nW=()=>!0,sW=()=>!1,oW=o=>o===\" \"||o===\"\t\";class Th{constructor(e,t,i,n){this.languageConfigurationService=n,this._cursorMoveConfigurationBrand=void 0,this._languageId=e;const s=i.options,r=s.get(133);this.readOnly=s.get(83),this.tabSize=t.tabSize,this.indentSize=t.indentSize,this.insertSpaces=t.insertSpaces,this.stickyTabStops=s.get(106),this.lineHeight=s.get(61),this.pageSize=Math.max(1,Math.floor(r.height/this.lineHeight)-2),this.useTabStops=s.get(118),this.wordSeparators=s.get(119),this.emptySelectionClipboard=s.get(33),this.copyWithSyntaxHighlighting=s.get(21),this.multiCursorMergeOverlapping=s.get(71),this.multiCursorPaste=s.get(73),this.autoClosingBrackets=s.get(5),this.autoClosingQuotes=s.get(8),this.autoClosingDelete=s.get(6),this.autoClosingOvertype=s.get(7),this.autoSurround=s.get(11),this.autoIndent=s.get(9),this.surroundingPairs={},this._electricChars=null,this.shouldAutoCloseBefore={quote:this._getShouldAutoClose(e,this.autoClosingQuotes),bracket:this._getShouldAutoClose(e,this.autoClosingBrackets)},this.autoClosingPairs=this.languageConfigurationService.getLanguageConfiguration(e).getAutoClosingPairs();const a=this.languageConfigurationService.getLanguageConfiguration(e).getSurroundingPairs();if(a)for(const l of a)this.surroundingPairs[l.open]=l.close}static shouldRecreate(e){return e.hasChanged(133)||e.hasChanged(119)||e.hasChanged(33)||e.hasChanged(71)||e.hasChanged(73)||e.hasChanged(5)||e.hasChanged(8)||e.hasChanged(6)||e.hasChanged(7)||e.hasChanged(11)||e.hasChanged(118)||e.hasChanged(61)||e.hasChanged(83)}get electricChars(){var e;if(!this._electricChars){this._electricChars={};const t=(e=this.languageConfigurationService.getLanguageConfiguration(this._languageId).electricCharacter)===null||e===void 0?void 0:e.getElectricCharacters();if(t)for(const i of t)this._electricChars[i]=!0}return this._electricChars}onElectricCharacter(e,t,i){const n=OC(t,i-1),s=this.languageConfigurationService.getLanguageConfiguration(n.languageId).electricCharacter;return s?s.onElectricCharacter(e,n,i-n.firstCharOffset):null}normalizeIndentation(e){return U0(e,this.indentSize,this.insertSpaces)}_getShouldAutoClose(e,t){switch(t){case\"beforeWhitespace\":return oW;case\"languageDefined\":return this._getLanguageDefinedShouldAutoClose(e);case\"always\":return nW;case\"never\":return sW}}_getLanguageDefinedShouldAutoClose(e){const t=this.languageConfigurationService.getLanguageConfiguration(e).getAutoCloseBeforeSet();return i=>t.indexOf(i)!==-1}visibleColumnFromColumn(e,t){return _i.visibleColumnFromColumn(e.getLineContent(t.lineNumber),t.column,this.tabSize)}columnFromVisibleColumn(e,t,i){const n=_i.columnFromVisibleColumn(e.getLineContent(t),i,this.tabSize),s=e.getLineMinColumn(t);if(n<s)return s;const r=e.getLineMaxColumn(t);return n>r?r:n}}class He{constructor(e,t){this._cursorStateBrand=void 0,this.modelState=e,this.viewState=t}static fromModelState(e){return new rW(e)}static fromViewState(e){return new aW(e)}static fromModelSelection(e){const t=oe.liftSelection(e),i=new Fi(L.fromPositions(t.getSelectionStart()),0,t.getPosition(),0);return He.fromModelState(i)}static fromModelSelections(e){const t=[];for(let i=0,n=e.length;i<n;i++)t[i]=this.fromModelSelection(e[i]);return t}equals(e){return this.viewState.equals(e.viewState)&&this.modelState.equals(e.modelState)}}class rW{constructor(e){this.modelState=e,this.viewState=null}}class aW{constructor(e){this.modelState=null,this.viewState=e}}class Fi{constructor(e,t,i,n){this._singleCursorStateBrand=void 0,this.selectionStart=e,this.selectionStartLeftoverVisibleColumns=t,this.position=i,this.leftoverVisibleColumns=n,this.selection=Fi._computeSelection(this.selectionStart,this.position)}equals(e){return this.selectionStartLeftoverVisibleColumns===e.selectionStartLeftoverVisibleColumns&&this.leftoverVisibleColumns===e.leftoverVisibleColumns&&this.position.equals(e.position)&&this.selectionStart.equalsRange(e.selectionStart)}hasSelection(){return!this.selection.isEmpty()||!this.selectionStart.isEmpty()}move(e,t,i,n){return e?new Fi(this.selectionStart,this.selectionStartLeftoverVisibleColumns,new B(t,i),n):new Fi(new L(t,i,t,i),n,new B(t,i),n)}static _computeSelection(e,t){return e.isEmpty()||!t.isBeforeOrEqual(e.getStartPosition())?oe.fromPositions(e.getStartPosition(),t):oe.fromPositions(e.getEndPosition(),t)}}class En{constructor(e,t,i){this._editOperationResultBrand=void 0,this.type=e,this.commands=t,this.shouldPushStackElementBefore=i.shouldPushStackElementBefore,this.shouldPushStackElementAfter=i.shouldPushStackElementAfter}}function wl(o){return o===\"'\"||o==='\"'||o===\"`\"}class Yc{static columnSelect(e,t,i,n,s,r){const a=Math.abs(s-i)+1,l=i>s,c=n>r,d=n<r,h=[];for(let u=0;u<a;u++){const g=i+(l?-u:u),f=e.columnFromVisibleColumn(t,g,n),_=e.columnFromVisibleColumn(t,g,r),b=e.visibleColumnFromColumn(t,new B(g,f)),v=e.visibleColumnFromColumn(t,new B(g,_));d&&(b>r||v<n)||c&&(v>n||b<r)||h.push(new Fi(new L(g,f,g,f),0,new B(g,_),0))}if(h.length===0)for(let u=0;u<a;u++){const g=i+(l?-u:u),f=t.getLineMaxColumn(g);h.push(new Fi(new L(g,f,g,f),0,new B(g,f),0))}return{viewStates:h,reversed:l,fromLineNumber:i,fromVisualColumn:n,toLineNumber:s,toVisualColumn:r}}static columnSelectLeft(e,t,i){let n=i.toViewVisualColumn;return n>0&&n--,Yc.columnSelect(e,t,i.fromViewLineNumber,i.fromViewVisualColumn,i.toViewLineNumber,n)}static columnSelectRight(e,t,i){let n=0;const s=Math.min(i.fromViewLineNumber,i.toViewLineNumber),r=Math.max(i.fromViewLineNumber,i.toViewLineNumber);for(let l=s;l<=r;l++){const c=t.getLineMaxColumn(l),d=e.visibleColumnFromColumn(t,new B(l,c));n=Math.max(n,d)}let a=i.toViewVisualColumn;return a<n&&a++,this.columnSelect(e,t,i.fromViewLineNumber,i.fromViewVisualColumn,i.toViewLineNumber,a)}static columnSelectUp(e,t,i,n){const s=n?e.pageSize:1,r=Math.max(1,i.toViewLineNumber-s);return this.columnSelect(e,t,i.fromViewLineNumber,i.fromViewVisualColumn,r,i.toViewVisualColumn)}static columnSelectDown(e,t,i,n){const s=n?e.pageSize:1,r=Math.min(t.getLineCount(),i.toViewLineNumber+s);return this.columnSelect(e,t,i.fromViewLineNumber,i.fromViewVisualColumn,r,i.toViewVisualColumn)}}class Wi{constructor(e,t,i=!1){this._range=e,this._text=t,this.insertsAutoWhitespace=i}getEditOperations(e,t){t.addTrackedEditOperation(this._range,this._text)}computeCursorState(e,t){const n=t.getInverseEditOperations()[0].range;return oe.fromPositions(n.getEndPosition())}}class lW{constructor(e,t){this._range=e,this._text=t}getEditOperations(e,t){t.addTrackedEditOperation(this._range,this._text)}computeCursorState(e,t){const n=t.getInverseEditOperations()[0].range;return oe.fromRange(n,0)}}class F_{constructor(e,t,i=!1){this._range=e,this._text=t,this.insertsAutoWhitespace=i}getEditOperations(e,t){t.addTrackedEditOperation(this._range,this._text)}computeCursorState(e,t){const n=t.getInverseEditOperations()[0].range;return oe.fromPositions(n.getStartPosition())}}class e0{constructor(e,t,i,n,s=!1){this._range=e,this._text=t,this._columnDeltaOffset=n,this._lineNumberDeltaOffset=i,this.insertsAutoWhitespace=s}getEditOperations(e,t){t.addTrackedEditOperation(this._range,this._text)}computeCursorState(e,t){const n=t.getInverseEditOperations()[0].range;return oe.fromPositions(n.getEndPosition().delta(this._lineNumberDeltaOffset,this._columnDeltaOffset))}}class Jx{constructor(e,t,i,n=!1){this._range=e,this._text=t,this._initialSelection=i,this._forceMoveMarkers=n,this._selectionId=null}getEditOperations(e,t){t.addTrackedEditOperation(this._range,this._text,this._forceMoveMarkers),this._selectionId=t.trackSelection(this._initialSelection)}computeCursorState(e,t){return t.getTrackedSelection(this._selectionId)}}class Tp{static whitespaceVisibleColumn(e,t,i){const n=e.length;let s=0,r=-1,a=-1;for(let l=0;l<n;l++){if(l===t)return[r,a,s];switch(s%i===0&&(r=l,a=s),e.charCodeAt(l)){case 32:s+=1;break;case 9:s=_i.nextRenderTabStop(s,i);break;default:return[-1,-1,-1]}}return t===n?[r,a,s]:[-1,-1,-1]}static atomicPosition(e,t,i,n){const s=e.length,[r,a,l]=Tp.whitespaceVisibleColumn(e,t,i);if(l===-1)return-1;let c;switch(n){case 0:c=!0;break;case 1:c=!1;break;case 2:if(l%i===0)return t;c=l%i<=i/2;break}if(c){if(r===-1)return-1;let u=a;for(let g=r;g<s;++g){if(u===a+i)return r;switch(e.charCodeAt(g)){case 32:u+=1;break;case 9:u=_i.nextRenderTabStop(u,i);break;default:return-1}}return u===a+i?r:-1}const d=_i.nextRenderTabStop(l,i);let h=l;for(let u=t;u<s;u++){if(h===d)return u;switch(e.charCodeAt(u)){case 32:h+=1;break;case 9:h=_i.nextRenderTabStop(h,i);break;default:return-1}}return h===d?s:-1}}class yw{constructor(e,t,i){this._cursorPositionBrand=void 0,this.lineNumber=e,this.column=t,this.leftoverVisibleColumns=i}}class st{static leftPosition(e,t){if(t.column>e.getLineMinColumn(t.lineNumber))return t.delta(void 0,-GO(e.getLineContent(t.lineNumber),t.column-1));if(t.lineNumber>1){const i=t.lineNumber-1;return new B(i,e.getLineMaxColumn(i))}else return t}static leftPositionAtomicSoftTabs(e,t,i){if(t.column<=e.getLineIndentColumn(t.lineNumber)){const n=e.getLineMinColumn(t.lineNumber),s=e.getLineContent(t.lineNumber),r=Tp.atomicPosition(s,t.column-1,i,0);if(r!==-1&&r+1>=n)return new B(t.lineNumber,r+1)}return this.leftPosition(e,t)}static left(e,t,i){const n=e.stickyTabStops?st.leftPositionAtomicSoftTabs(t,i,e.tabSize):st.leftPosition(t,i);return new yw(n.lineNumber,n.column,0)}static moveLeft(e,t,i,n,s){let r,a;if(i.hasSelection()&&!n)r=i.selection.startLineNumber,a=i.selection.startColumn;else{const l=i.position.delta(void 0,-(s-1)),c=t.normalizePosition(st.clipPositionColumn(l,t),0),d=st.left(e,t,c);r=d.lineNumber,a=d.column}return i.move(n,r,a,0)}static clipPositionColumn(e,t){return new B(e.lineNumber,st.clipRange(e.column,t.getLineMinColumn(e.lineNumber),t.getLineMaxColumn(e.lineNumber)))}static clipRange(e,t,i){return e<t?t:e>i?i:e}static rightPosition(e,t,i){return i<e.getLineMaxColumn(t)?i=i+qx(e.getLineContent(t),i-1):t<e.getLineCount()&&(t=t+1,i=e.getLineMinColumn(t)),new B(t,i)}static rightPositionAtomicSoftTabs(e,t,i,n,s){if(i<e.getLineIndentColumn(t)){const r=e.getLineContent(t),a=Tp.atomicPosition(r,i-1,n,1);if(a!==-1)return new B(t,a+1)}return this.rightPosition(e,t,i)}static right(e,t,i){const n=e.stickyTabStops?st.rightPositionAtomicSoftTabs(t,i.lineNumber,i.column,e.tabSize,e.indentSize):st.rightPosition(t,i.lineNumber,i.column);return new yw(n.lineNumber,n.column,0)}static moveRight(e,t,i,n,s){let r,a;if(i.hasSelection()&&!n)r=i.selection.endLineNumber,a=i.selection.endColumn;else{const l=i.position.delta(void 0,s-1),c=t.normalizePosition(st.clipPositionColumn(l,t),1),d=st.right(e,t,c);r=d.lineNumber,a=d.column}return i.move(n,r,a,0)}static vertical(e,t,i,n,s,r,a,l){const c=_i.visibleColumnFromColumn(t.getLineContent(i),n,e.tabSize)+s,d=t.getLineCount(),h=i===1&&n===1,u=i===d&&n===t.getLineMaxColumn(i),g=r<i?h:u;if(i=r,i<1?(i=1,a?n=t.getLineMinColumn(i):n=Math.min(t.getLineMaxColumn(i),n)):i>d?(i=d,a?n=t.getLineMaxColumn(i):n=Math.min(t.getLineMaxColumn(i),n)):n=e.columnFromVisibleColumn(t,i,c),g?s=0:s=c-_i.visibleColumnFromColumn(t.getLineContent(i),n,e.tabSize),l!==void 0){const f=new B(i,n),_=t.normalizePosition(f,l);s=s+(n-_.column),i=_.lineNumber,n=_.column}return new yw(i,n,s)}static down(e,t,i,n,s,r,a){return this.vertical(e,t,i,n,s,i+r,a,4)}static moveDown(e,t,i,n,s){let r,a;i.hasSelection()&&!n?(r=i.selection.endLineNumber,a=i.selection.endColumn):(r=i.position.lineNumber,a=i.position.column);const l=st.down(e,t,r,a,i.leftoverVisibleColumns,s,!0);return i.move(n,l.lineNumber,l.column,l.leftoverVisibleColumns)}static translateDown(e,t,i){const n=i.selection,s=st.down(e,t,n.selectionStartLineNumber,n.selectionStartColumn,i.selectionStartLeftoverVisibleColumns,1,!1),r=st.down(e,t,n.positionLineNumber,n.positionColumn,i.leftoverVisibleColumns,1,!1);return new Fi(new L(s.lineNumber,s.column,s.lineNumber,s.column),s.leftoverVisibleColumns,new B(r.lineNumber,r.column),r.leftoverVisibleColumns)}static up(e,t,i,n,s,r,a){return this.vertical(e,t,i,n,s,i-r,a,3)}static moveUp(e,t,i,n,s){let r,a;i.hasSelection()&&!n?(r=i.selection.startLineNumber,a=i.selection.startColumn):(r=i.position.lineNumber,a=i.position.column);const l=st.up(e,t,r,a,i.leftoverVisibleColumns,s,!0);return i.move(n,l.lineNumber,l.column,l.leftoverVisibleColumns)}static translateUp(e,t,i){const n=i.selection,s=st.up(e,t,n.selectionStartLineNumber,n.selectionStartColumn,i.selectionStartLeftoverVisibleColumns,1,!1),r=st.up(e,t,n.positionLineNumber,n.positionColumn,i.leftoverVisibleColumns,1,!1);return new Fi(new L(s.lineNumber,s.column,s.lineNumber,s.column),s.leftoverVisibleColumns,new B(r.lineNumber,r.column),r.leftoverVisibleColumns)}static _isBlankLine(e,t){return e.getLineFirstNonWhitespaceColumn(t)===0}static moveToPrevBlankLine(e,t,i,n){let s=i.position.lineNumber;for(;s>1&&this._isBlankLine(t,s);)s--;for(;s>1&&!this._isBlankLine(t,s);)s--;return i.move(n,s,t.getLineMinColumn(s),0)}static moveToNextBlankLine(e,t,i,n){const s=t.getLineCount();let r=i.position.lineNumber;for(;r<s&&this._isBlankLine(t,r);)r++;for(;r<s&&!this._isBlankLine(t,r);)r++;return i.move(n,r,t.getLineMinColumn(r),0)}static moveToBeginningOfLine(e,t,i,n){const s=i.position.lineNumber,r=t.getLineMinColumn(s),a=t.getLineFirstNonWhitespaceColumn(s)||r;let l;return i.position.column===a?l=r:l=a,i.move(n,s,l,0)}static moveToEndOfLine(e,t,i,n,s){const r=i.position.lineNumber,a=t.getLineMaxColumn(r);return i.move(n,r,a,s?1073741824-a:0)}static moveToBeginningOfBuffer(e,t,i,n){return i.move(n,1,1,0)}static moveToEndOfBuffer(e,t,i,n){const s=t.getLineCount(),r=t.getLineMaxColumn(s);return i.move(n,s,r,0)}}class Wd{static deleteRight(e,t,i,n){const s=[];let r=e!==3;for(let a=0,l=n.length;a<l;a++){const c=n[a];let d=c;if(d.isEmpty()){const h=c.getPosition(),u=st.right(t,i,h);d=new L(u.lineNumber,u.column,h.lineNumber,h.column)}if(d.isEmpty()){s[a]=null;continue}d.startLineNumber!==d.endLineNumber&&(r=!0),s[a]=new Wi(d,\"\")}return[r,s]}static isAutoClosingPairDelete(e,t,i,n,s,r,a){if(t===\"never\"&&i===\"never\"||e===\"never\")return!1;for(let l=0,c=r.length;l<c;l++){const d=r[l],h=d.getPosition();if(!d.isEmpty())return!1;const u=s.getLineContent(h.lineNumber);if(h.column<2||h.column>=u.length+1)return!1;const g=u.charAt(h.column-2),f=n.get(g);if(!f)return!1;if(wl(g)){if(i===\"never\")return!1}else if(t===\"never\")return!1;const _=u.charAt(h.column-1);let b=!1;for(const v of f)v.open===g&&v.close===_&&(b=!0);if(!b)return!1;if(e===\"auto\"){let v=!1;for(let C=0,w=a.length;C<w;C++){const S=a[C];if(h.lineNumber===S.startLineNumber&&h.column===S.startColumn){v=!0;break}}if(!v)return!1}}return!0}static _runAutoClosingPairDelete(e,t,i){const n=[];for(let s=0,r=i.length;s<r;s++){const a=i[s].getPosition(),l=new L(a.lineNumber,a.column-1,a.lineNumber,a.column+1);n[s]=new Wi(l,\"\")}return[!0,n]}static deleteLeft(e,t,i,n,s){if(this.isAutoClosingPairDelete(t.autoClosingDelete,t.autoClosingBrackets,t.autoClosingQuotes,t.autoClosingPairs.autoClosingPairsOpenByEnd,i,n,s))return this._runAutoClosingPairDelete(t,i,n);const r=[];let a=e!==2;for(let l=0,c=n.length;l<c;l++){const d=Wd.getDeleteRange(n[l],i,t);if(d.isEmpty()){r[l]=null;continue}d.startLineNumber!==d.endLineNumber&&(a=!0),r[l]=new Wi(d,\"\")}return[a,r]}static getDeleteRange(e,t,i){if(!e.isEmpty())return e;const n=e.getPosition();if(i.useTabStops&&n.column>1){const s=t.getLineContent(n.lineNumber),r=Sn(s),a=r===-1?s.length+1:r+1;if(n.column<=a){const l=i.visibleColumnFromColumn(t,n),c=_i.prevIndentTabStop(l,i.indentSize),d=i.columnFromVisibleColumn(t,n.lineNumber,c);return new L(n.lineNumber,d,n.lineNumber,n.column)}}return L.fromPositions(Wd.getPositionAfterDeleteLeft(n,t),n)}static getPositionAfterDeleteLeft(e,t){if(e.column>1){const i=FB(e.column-1,t.getLineContent(e.lineNumber));return e.with(void 0,i+1)}else if(e.lineNumber>1){const i=e.lineNumber-1;return new B(i,t.getLineMaxColumn(i))}else return e}static cut(e,t,i){const n=[];let s=null;i.sort((r,a)=>B.compare(r.getStartPosition(),a.getEndPosition()));for(let r=0,a=i.length;r<a;r++){const l=i[r];if(l.isEmpty())if(e.emptySelectionClipboard){const c=l.getPosition();let d,h,u,g;c.lineNumber<t.getLineCount()?(d=c.lineNumber,h=1,u=c.lineNumber+1,g=1):c.lineNumber>1&&(s==null?void 0:s.endLineNumber)!==c.lineNumber?(d=c.lineNumber-1,h=t.getLineMaxColumn(c.lineNumber-1),u=c.lineNumber,g=t.getLineMaxColumn(c.lineNumber)):(d=c.lineNumber,h=1,u=c.lineNumber,g=t.getLineMaxColumn(c.lineNumber));const f=new L(d,h,u,g);s=f,f.isEmpty()?n[r]=null:n[r]=new Wi(f,\"\")}else n[r]=null;else n[r]=new Wi(l,\"\")}return new En(0,n,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!0})}}function $0(o){return o<0?0:o>255?255:o|0}function Mh(o){return o<0?0:o>4294967295?4294967295:o|0}class Pg{constructor(e){const t=$0(e);this._defaultValue=t,this._asciiMap=Pg._createAsciiMap(t),this._map=new Map}static _createAsciiMap(e){const t=new Uint8Array(256);for(let i=0;i<256;i++)t[i]=e;return t}set(e,t){const i=$0(t);e>=0&&e<256?this._asciiMap[e]=i:this._map.set(e,i)}get(e){return e>=0&&e<256?this._asciiMap[e]:this._map.get(e)||this._defaultValue}}class ru{constructor(){this._actual=new Pg(0)}add(e){this._actual.set(e,1)}has(e){return this._actual.get(e)===1}}class cW extends Pg{constructor(e){super(0);for(let t=0,i=e.length;t<i;t++)this.set(e.charCodeAt(t),2);this.set(32,1),this.set(9,1)}}function dW(o){const e={};return t=>(e.hasOwnProperty(t)||(e[t]=o(t)),e[t])}const Zs=dW(o=>new cW(o));class Qe{static _createWord(e,t,i,n,s){return{start:n,end:s,wordType:t,nextCharClass:i}}static _findPreviousWordOnLine(e,t,i){const n=t.getLineContent(i.lineNumber);return this._doFindPreviousWordOnLine(n,e,i)}static _doFindPreviousWordOnLine(e,t,i){let n=0;for(let s=i.column-2;s>=0;s--){const r=e.charCodeAt(s),a=t.get(r);if(a===0){if(n===2)return this._createWord(e,n,a,s+1,this._findEndOfWord(e,t,n,s+1));n=1}else if(a===2){if(n===1)return this._createWord(e,n,a,s+1,this._findEndOfWord(e,t,n,s+1));n=2}else if(a===1&&n!==0)return this._createWord(e,n,a,s+1,this._findEndOfWord(e,t,n,s+1))}return n!==0?this._createWord(e,n,1,0,this._findEndOfWord(e,t,n,0)):null}static _findEndOfWord(e,t,i,n){const s=e.length;for(let r=n;r<s;r++){const a=e.charCodeAt(r),l=t.get(a);if(l===1||i===1&&l===2||i===2&&l===0)return r}return s}static _findNextWordOnLine(e,t,i){const n=t.getLineContent(i.lineNumber);return this._doFindNextWordOnLine(n,e,i)}static _doFindNextWordOnLine(e,t,i){let n=0;const s=e.length;for(let r=i.column-1;r<s;r++){const a=e.charCodeAt(r),l=t.get(a);if(l===0){if(n===2)return this._createWord(e,n,l,this._findStartOfWord(e,t,n,r-1),r);n=1}else if(l===2){if(n===1)return this._createWord(e,n,l,this._findStartOfWord(e,t,n,r-1),r);n=2}else if(l===1&&n!==0)return this._createWord(e,n,l,this._findStartOfWord(e,t,n,r-1),r)}return n!==0?this._createWord(e,n,1,this._findStartOfWord(e,t,n,s-1),s):null}static _findStartOfWord(e,t,i,n){for(let s=n;s>=0;s--){const r=e.charCodeAt(s),a=t.get(r);if(a===1||i===1&&a===2||i===2&&a===0)return s+1}return 0}static moveWordLeft(e,t,i,n){let s=i.lineNumber,r=i.column;r===1&&s>1&&(s=s-1,r=t.getLineMaxColumn(s));let a=Qe._findPreviousWordOnLine(e,t,new B(s,r));if(n===0)return new B(s,a?a.start+1:1);if(n===1)return a&&a.wordType===2&&a.end-a.start===1&&a.nextCharClass===0&&(a=Qe._findPreviousWordOnLine(e,t,new B(s,a.start+1))),new B(s,a?a.start+1:1);if(n===3){for(;a&&a.wordType===2;)a=Qe._findPreviousWordOnLine(e,t,new B(s,a.start+1));return new B(s,a?a.start+1:1)}return a&&r<=a.end+1&&(a=Qe._findPreviousWordOnLine(e,t,new B(s,a.start+1))),new B(s,a?a.end+1:1)}static _moveWordPartLeft(e,t){const i=t.lineNumber,n=e.getLineMaxColumn(i);if(t.column===1)return i>1?new B(i-1,e.getLineMaxColumn(i-1)):t;const s=e.getLineContent(i);for(let r=t.column-1;r>1;r--){const a=s.charCodeAt(r-2),l=s.charCodeAt(r-1);if(a===95&&l!==95)return new B(i,r);if((Ol(a)||P_(a))&&br(l))return new B(i,r);if(br(a)&&br(l)&&r+1<n){const c=s.charCodeAt(r);if(Ol(c)||P_(c))return new B(i,r)}}return new B(i,1)}static moveWordRight(e,t,i,n){let s=i.lineNumber,r=i.column,a=!1;r===t.getLineMaxColumn(s)&&s<t.getLineCount()&&(a=!0,s=s+1,r=1);let l=Qe._findNextWordOnLine(e,t,new B(s,r));if(n===2)l&&l.wordType===2&&l.end-l.start===1&&l.nextCharClass===0&&(l=Qe._findNextWordOnLine(e,t,new B(s,l.end+1))),l?r=l.end+1:r=t.getLineMaxColumn(s);else if(n===3){for(a&&(r=0);l&&(l.wordType===2||l.start+1<=r);)l=Qe._findNextWordOnLine(e,t,new B(s,l.end+1));l?r=l.start+1:r=t.getLineMaxColumn(s)}else l&&!a&&r>=l.start+1&&(l=Qe._findNextWordOnLine(e,t,new B(s,l.end+1))),l?r=l.start+1:r=t.getLineMaxColumn(s);return new B(s,r)}static _moveWordPartRight(e,t){const i=t.lineNumber,n=e.getLineMaxColumn(i);if(t.column===n)return i<e.getLineCount()?new B(i+1,1):t;const s=e.getLineContent(i);for(let r=t.column+1;r<n;r++){const a=s.charCodeAt(r-2),l=s.charCodeAt(r-1);if(a!==95&&l===95)return new B(i,r);if((Ol(a)||P_(a))&&br(l))return new B(i,r);if(br(a)&&br(l)&&r+1<n){const c=s.charCodeAt(r);if(Ol(c)||P_(c))return new B(i,r)}}return new B(i,n)}static _deleteWordLeftWhitespace(e,t){const i=e.getLineContent(t.lineNumber),n=t.column-2,s=Fr(i,n);return s+1<n?new L(t.lineNumber,s+2,t.lineNumber,t.column):null}static deleteWordLeft(e,t){const i=e.wordSeparators,n=e.model,s=e.selection,r=e.whitespaceHeuristics;if(!s.isEmpty())return s;if(Wd.isAutoClosingPairDelete(e.autoClosingDelete,e.autoClosingBrackets,e.autoClosingQuotes,e.autoClosingPairs.autoClosingPairsOpenByEnd,e.model,[e.selection],e.autoClosedCharacters)){const h=e.selection.getPosition();return new L(h.lineNumber,h.column-1,h.lineNumber,h.column+1)}const a=new B(s.positionLineNumber,s.positionColumn);let l=a.lineNumber,c=a.column;if(l===1&&c===1)return null;if(r){const h=this._deleteWordLeftWhitespace(n,a);if(h)return h}let d=Qe._findPreviousWordOnLine(i,n,a);return t===0?d?c=d.start+1:c>1?c=1:(l--,c=n.getLineMaxColumn(l)):(d&&c<=d.end+1&&(d=Qe._findPreviousWordOnLine(i,n,new B(l,d.start+1))),d?c=d.end+1:c>1?c=1:(l--,c=n.getLineMaxColumn(l))),new L(l,c,a.lineNumber,a.column)}static deleteInsideWord(e,t,i){if(!i.isEmpty())return i;const n=new B(i.positionLineNumber,i.positionColumn),s=this._deleteInsideWordWhitespace(t,n);return s||this._deleteInsideWordDetermineDeleteRange(e,t,n)}static _charAtIsWhitespace(e,t){const i=e.charCodeAt(t);return i===32||i===9}static _deleteInsideWordWhitespace(e,t){const i=e.getLineContent(t.lineNumber),n=i.length;if(n===0)return null;let s=Math.max(t.column-2,0);if(!this._charAtIsWhitespace(i,s))return null;let r=Math.min(t.column-1,n-1);if(!this._charAtIsWhitespace(i,r))return null;for(;s>0&&this._charAtIsWhitespace(i,s-1);)s--;for(;r+1<n&&this._charAtIsWhitespace(i,r+1);)r++;return new L(t.lineNumber,s+1,t.lineNumber,r+2)}static _deleteInsideWordDetermineDeleteRange(e,t,i){const n=t.getLineContent(i.lineNumber),s=n.length;if(s===0)return i.lineNumber>1?new L(i.lineNumber-1,t.getLineMaxColumn(i.lineNumber-1),i.lineNumber,1):i.lineNumber<t.getLineCount()?new L(i.lineNumber,1,i.lineNumber+1,1):new L(i.lineNumber,1,i.lineNumber,1);const r=h=>h.start+1<=i.column&&i.column<=h.end+1,a=(h,u)=>(h=Math.min(h,i.column),u=Math.max(u,i.column),new L(i.lineNumber,h,i.lineNumber,u)),l=h=>{let u=h.start+1,g=h.end+1,f=!1;for(;g-1<s&&this._charAtIsWhitespace(n,g-1);)f=!0,g++;if(!f)for(;u>1&&this._charAtIsWhitespace(n,u-2);)u--;return a(u,g)},c=Qe._findPreviousWordOnLine(e,t,i);if(c&&r(c))return l(c);const d=Qe._findNextWordOnLine(e,t,i);return d&&r(d)?l(d):c&&d?a(c.end+1,d.start+1):c?a(c.start+1,c.end+1):d?a(d.start+1,d.end+1):a(1,s+1)}static _deleteWordPartLeft(e,t){if(!t.isEmpty())return t;const i=t.getPosition(),n=Qe._moveWordPartLeft(e,i);return new L(i.lineNumber,i.column,n.lineNumber,n.column)}static _findFirstNonWhitespaceChar(e,t){const i=e.length;for(let n=t;n<i;n++){const s=e.charAt(n);if(s!==\" \"&&s!==\"\t\")return n}return i}static _deleteWordRightWhitespace(e,t){const i=e.getLineContent(t.lineNumber),n=t.column-1,s=this._findFirstNonWhitespaceChar(i,n);return n+1<s?new L(t.lineNumber,t.column,t.lineNumber,s+1):null}static deleteWordRight(e,t){const i=e.wordSeparators,n=e.model,s=e.selection,r=e.whitespaceHeuristics;if(!s.isEmpty())return s;const a=new B(s.positionLineNumber,s.positionColumn);let l=a.lineNumber,c=a.column;const d=n.getLineCount(),h=n.getLineMaxColumn(l);if(l===d&&c===h)return null;if(r){const g=this._deleteWordRightWhitespace(n,a);if(g)return g}let u=Qe._findNextWordOnLine(i,n,a);return t===2?u?c=u.end+1:c<h||l===d?c=h:(l++,u=Qe._findNextWordOnLine(i,n,new B(l,1)),u?c=u.start+1:c=n.getLineMaxColumn(l)):(u&&c>=u.start+1&&(u=Qe._findNextWordOnLine(i,n,new B(l,u.end+1))),u?c=u.start+1:c<h||l===d?c=h:(l++,u=Qe._findNextWordOnLine(i,n,new B(l,1)),u?c=u.start+1:c=n.getLineMaxColumn(l))),new L(l,c,a.lineNumber,a.column)}static _deleteWordPartRight(e,t){if(!t.isEmpty())return t;const i=t.getPosition(),n=Qe._moveWordPartRight(e,i);return new L(i.lineNumber,i.column,n.lineNumber,n.column)}static _createWordAtPosition(e,t,i){const n=new L(t,i.start+1,t,i.end+1);return{word:e.getValueInRange(n),startColumn:n.startColumn,endColumn:n.endColumn}}static getWordAtPosition(e,t,i){const n=Zs(t),s=Qe._findPreviousWordOnLine(n,e,i);if(s&&s.wordType===1&&s.start<=i.column-1&&i.column-1<=s.end)return Qe._createWordAtPosition(e,i.lineNumber,s);const r=Qe._findNextWordOnLine(n,e,i);return r&&r.wordType===1&&r.start<=i.column-1&&i.column-1<=r.end?Qe._createWordAtPosition(e,i.lineNumber,r):null}static word(e,t,i,n,s){const r=Zs(e.wordSeparators),a=Qe._findPreviousWordOnLine(r,t,s),l=Qe._findNextWordOnLine(r,t,s);if(!n){let g,f;return a&&a.wordType===1&&a.start<=s.column-1&&s.column-1<=a.end?(g=a.start+1,f=a.end+1):l&&l.wordType===1&&l.start<=s.column-1&&s.column-1<=l.end?(g=l.start+1,f=l.end+1):(a?g=a.end+1:g=1,l?f=l.start+1:f=t.getLineMaxColumn(s.lineNumber)),new Fi(new L(s.lineNumber,g,s.lineNumber,f),0,new B(s.lineNumber,f),0)}let c,d;a&&a.wordType===1&&a.start<s.column-1&&s.column-1<a.end?(c=a.start+1,d=a.end+1):l&&l.wordType===1&&l.start<s.column-1&&s.column-1<l.end?(c=l.start+1,d=l.end+1):(c=s.column,d=s.column);const h=s.lineNumber;let u;if(i.selectionStart.containsPosition(s))u=i.selectionStart.endColumn;else if(s.isBeforeOrEqual(i.selectionStart.getStartPosition())){u=c;const g=new B(h,u);i.selectionStart.containsPosition(g)&&(u=i.selectionStart.endColumn)}else{u=d;const g=new B(h,u);i.selectionStart.containsPosition(g)&&(u=i.selectionStart.startColumn)}return i.move(!0,h,u,0)}}class PC extends Qe{static deleteWordPartLeft(e){const t=B_([Qe.deleteWordLeft(e,0),Qe.deleteWordLeft(e,2),Qe._deleteWordPartLeft(e.model,e.selection)]);return t.sort(L.compareRangesUsingEnds),t[2]}static deleteWordPartRight(e){const t=B_([Qe.deleteWordRight(e,0),Qe.deleteWordRight(e,2),Qe._deleteWordPartRight(e.model,e.selection)]);return t.sort(L.compareRangesUsingStarts),t[0]}static moveWordPartLeft(e,t,i){const n=B_([Qe.moveWordLeft(e,t,i,0),Qe.moveWordLeft(e,t,i,2),Qe._moveWordPartLeft(t,i)]);return n.sort(B.compare),n[2]}static moveWordPartRight(e,t,i){const n=B_([Qe.moveWordRight(e,t,i,0),Qe.moveWordRight(e,t,i,2),Qe._moveWordPartRight(t,i)]);return n.sort(B.compare),n[0]}}function B_(o){return o.filter(e=>Boolean(e))}class Pi{static addCursorDown(e,t,i){const n=[];let s=0;for(let r=0,a=t.length;r<a;r++){const l=t[r];n[s++]=new He(l.modelState,l.viewState),i?n[s++]=He.fromModelState(st.translateDown(e.cursorConfig,e.model,l.modelState)):n[s++]=He.fromViewState(st.translateDown(e.cursorConfig,e,l.viewState))}return n}static addCursorUp(e,t,i){const n=[];let s=0;for(let r=0,a=t.length;r<a;r++){const l=t[r];n[s++]=new He(l.modelState,l.viewState),i?n[s++]=He.fromModelState(st.translateUp(e.cursorConfig,e.model,l.modelState)):n[s++]=He.fromViewState(st.translateUp(e.cursorConfig,e,l.viewState))}return n}static moveToBeginningOfLine(e,t,i){const n=[];for(let s=0,r=t.length;s<r;s++){const a=t[s];n[s]=this._moveToLineStart(e,a,i)}return n}static _moveToLineStart(e,t,i){const n=t.viewState.position.column,s=t.modelState.position.column,r=n===s,a=t.viewState.position.lineNumber,l=e.getLineFirstNonWhitespaceColumn(a);return!r&&!(n===l)?this._moveToLineStartByView(e,t,i):this._moveToLineStartByModel(e,t,i)}static _moveToLineStartByView(e,t,i){return He.fromViewState(st.moveToBeginningOfLine(e.cursorConfig,e,t.viewState,i))}static _moveToLineStartByModel(e,t,i){return He.fromModelState(st.moveToBeginningOfLine(e.cursorConfig,e.model,t.modelState,i))}static moveToEndOfLine(e,t,i,n){const s=[];for(let r=0,a=t.length;r<a;r++){const l=t[r];s[r]=this._moveToLineEnd(e,l,i,n)}return s}static _moveToLineEnd(e,t,i,n){const s=t.viewState.position,r=e.getLineMaxColumn(s.lineNumber),a=s.column===r,l=t.modelState.position,c=e.model.getLineMaxColumn(l.lineNumber),d=r-s.column===c-l.column;return a||d?this._moveToLineEndByModel(e,t,i,n):this._moveToLineEndByView(e,t,i,n)}static _moveToLineEndByView(e,t,i,n){return He.fromViewState(st.moveToEndOfLine(e.cursorConfig,e,t.viewState,i,n))}static _moveToLineEndByModel(e,t,i,n){return He.fromModelState(st.moveToEndOfLine(e.cursorConfig,e.model,t.modelState,i,n))}static expandLineSelection(e,t){const i=[];for(let n=0,s=t.length;n<s;n++){const r=t[n],a=r.modelState.selection.startLineNumber,l=e.model.getLineCount();let c=r.modelState.selection.endLineNumber,d;c===l?d=e.model.getLineMaxColumn(l):(c++,d=1),i[n]=He.fromModelState(new Fi(new L(a,1,a,1),0,new B(c,d),0))}return i}static moveToBeginningOfBuffer(e,t,i){const n=[];for(let s=0,r=t.length;s<r;s++){const a=t[s];n[s]=He.fromModelState(st.moveToBeginningOfBuffer(e.cursorConfig,e.model,a.modelState,i))}return n}static moveToEndOfBuffer(e,t,i){const n=[];for(let s=0,r=t.length;s<r;s++){const a=t[s];n[s]=He.fromModelState(st.moveToEndOfBuffer(e.cursorConfig,e.model,a.modelState,i))}return n}static selectAll(e,t){const i=e.model.getLineCount(),n=e.model.getLineMaxColumn(i);return He.fromModelState(new Fi(new L(1,1,1,1),0,new B(i,n),0))}static line(e,t,i,n,s){const r=e.model.validatePosition(n),a=s?e.coordinatesConverter.validateViewPosition(new B(s.lineNumber,s.column),r):e.coordinatesConverter.convertModelPositionToViewPosition(r);if(!i||!t.modelState.hasSelection()){const c=e.model.getLineCount();let d=r.lineNumber+1,h=1;return d>c&&(d=c,h=e.model.getLineMaxColumn(d)),He.fromModelState(new Fi(new L(r.lineNumber,1,d,h),0,new B(d,h),0))}const l=t.modelState.selectionStart.getStartPosition().lineNumber;if(r.lineNumber<l)return He.fromViewState(t.viewState.move(t.modelState.hasSelection(),a.lineNumber,1,0));if(r.lineNumber>l){const c=e.getLineCount();let d=a.lineNumber+1,h=1;return d>c&&(d=c,h=e.getLineMaxColumn(d)),He.fromViewState(t.viewState.move(t.modelState.hasSelection(),d,h,0))}else{const c=t.modelState.selectionStart.getEndPosition();return He.fromModelState(t.modelState.move(t.modelState.hasSelection(),c.lineNumber,c.column,0))}}static word(e,t,i,n){const s=e.model.validatePosition(n);return He.fromModelState(Qe.word(e.cursorConfig,e.model,t.modelState,i,s))}static cancelSelection(e,t){if(!t.modelState.hasSelection())return new He(t.modelState,t.viewState);const i=t.viewState.position.lineNumber,n=t.viewState.position.column;return He.fromViewState(new Fi(new L(i,n,i,n),0,new B(i,n),0))}static moveTo(e,t,i,n,s){const r=e.model.validatePosition(n),a=s?e.coordinatesConverter.validateViewPosition(new B(s.lineNumber,s.column),r):e.coordinatesConverter.convertModelPositionToViewPosition(r);return He.fromViewState(t.viewState.move(i,a.lineNumber,a.column,0))}static simpleMove(e,t,i,n,s,r){switch(i){case 0:return r===4?this._moveHalfLineLeft(e,t,n):this._moveLeft(e,t,n,s);case 1:return r===4?this._moveHalfLineRight(e,t,n):this._moveRight(e,t,n,s);case 2:return r===2?this._moveUpByViewLines(e,t,n,s):this._moveUpByModelLines(e,t,n,s);case 3:return r===2?this._moveDownByViewLines(e,t,n,s):this._moveDownByModelLines(e,t,n,s);case 4:return r===2?t.map(a=>He.fromViewState(st.moveToPrevBlankLine(e.cursorConfig,e,a.viewState,n))):t.map(a=>He.fromModelState(st.moveToPrevBlankLine(e.cursorConfig,e.model,a.modelState,n)));case 5:return r===2?t.map(a=>He.fromViewState(st.moveToNextBlankLine(e.cursorConfig,e,a.viewState,n))):t.map(a=>He.fromModelState(st.moveToNextBlankLine(e.cursorConfig,e.model,a.modelState,n)));case 6:return this._moveToViewMinColumn(e,t,n);case 7:return this._moveToViewFirstNonWhitespaceColumn(e,t,n);case 8:return this._moveToViewCenterColumn(e,t,n);case 9:return this._moveToViewMaxColumn(e,t,n);case 10:return this._moveToViewLastNonWhitespaceColumn(e,t,n);default:return null}}static viewportMove(e,t,i,n,s){const r=e.getCompletelyVisibleViewRange(),a=e.coordinatesConverter.convertViewRangeToModelRange(r);switch(i){case 11:{const l=this._firstLineNumberInRange(e.model,a,s),c=e.model.getLineFirstNonWhitespaceColumn(l);return[this._moveToModelPosition(e,t[0],n,l,c)]}case 13:{const l=this._lastLineNumberInRange(e.model,a,s),c=e.model.getLineFirstNonWhitespaceColumn(l);return[this._moveToModelPosition(e,t[0],n,l,c)]}case 12:{const l=Math.round((a.startLineNumber+a.endLineNumber)/2),c=e.model.getLineFirstNonWhitespaceColumn(l);return[this._moveToModelPosition(e,t[0],n,l,c)]}case 14:{const l=[];for(let c=0,d=t.length;c<d;c++){const h=t[c];l[c]=this.findPositionInViewportIfOutside(e,h,r,n)}return l}default:return null}}static findPositionInViewportIfOutside(e,t,i,n){const s=t.viewState.position.lineNumber;if(i.startLineNumber<=s&&s<=i.endLineNumber-1)return new He(t.modelState,t.viewState);{let r;s>i.endLineNumber-1?r=i.endLineNumber-1:s<i.startLineNumber?r=i.startLineNumber:r=s;const a=st.vertical(e.cursorConfig,e,s,t.viewState.position.column,t.viewState.leftoverVisibleColumns,r,!1);return He.fromViewState(t.viewState.move(n,a.lineNumber,a.column,a.leftoverVisibleColumns))}}static _firstLineNumberInRange(e,t,i){let n=t.startLineNumber;return t.startColumn!==e.getLineMinColumn(n)&&n++,Math.min(t.endLineNumber,n+i-1)}static _lastLineNumberInRange(e,t,i){let n=t.startLineNumber;return t.startColumn!==e.getLineMinColumn(n)&&n++,Math.max(n,t.endLineNumber-i+1)}static _moveLeft(e,t,i,n){return t.map(s=>He.fromViewState(st.moveLeft(e.cursorConfig,e,s.viewState,i,n)))}static _moveHalfLineLeft(e,t,i){const n=[];for(let s=0,r=t.length;s<r;s++){const a=t[s],l=a.viewState.position.lineNumber,c=Math.round(e.getLineContent(l).length/2);n[s]=He.fromViewState(st.moveLeft(e.cursorConfig,e,a.viewState,i,c))}return n}static _moveRight(e,t,i,n){return t.map(s=>He.fromViewState(st.moveRight(e.cursorConfig,e,s.viewState,i,n)))}static _moveHalfLineRight(e,t,i){const n=[];for(let s=0,r=t.length;s<r;s++){const a=t[s],l=a.viewState.position.lineNumber,c=Math.round(e.getLineContent(l).length/2);n[s]=He.fromViewState(st.moveRight(e.cursorConfig,e,a.viewState,i,c))}return n}static _moveDownByViewLines(e,t,i,n){const s=[];for(let r=0,a=t.length;r<a;r++){const l=t[r];s[r]=He.fromViewState(st.moveDown(e.cursorConfig,e,l.viewState,i,n))}return s}static _moveDownByModelLines(e,t,i,n){const s=[];for(let r=0,a=t.length;r<a;r++){const l=t[r];s[r]=He.fromModelState(st.moveDown(e.cursorConfig,e.model,l.modelState,i,n))}return s}static _moveUpByViewLines(e,t,i,n){const s=[];for(let r=0,a=t.length;r<a;r++){const l=t[r];s[r]=He.fromViewState(st.moveUp(e.cursorConfig,e,l.viewState,i,n))}return s}static _moveUpByModelLines(e,t,i,n){const s=[];for(let r=0,a=t.length;r<a;r++){const l=t[r];s[r]=He.fromModelState(st.moveUp(e.cursorConfig,e.model,l.modelState,i,n))}return s}static _moveToViewPosition(e,t,i,n,s){return He.fromViewState(t.viewState.move(i,n,s,0))}static _moveToModelPosition(e,t,i,n,s){return He.fromModelState(t.modelState.move(i,n,s,0))}static _moveToViewMinColumn(e,t,i){const n=[];for(let s=0,r=t.length;s<r;s++){const a=t[s],l=a.viewState.position.lineNumber,c=e.getLineMinColumn(l);n[s]=this._moveToViewPosition(e,a,i,l,c)}return n}static _moveToViewFirstNonWhitespaceColumn(e,t,i){const n=[];for(let s=0,r=t.length;s<r;s++){const a=t[s],l=a.viewState.position.lineNumber,c=e.getLineFirstNonWhitespaceColumn(l);n[s]=this._moveToViewPosition(e,a,i,l,c)}return n}static _moveToViewCenterColumn(e,t,i){const n=[];for(let s=0,r=t.length;s<r;s++){const a=t[s],l=a.viewState.position.lineNumber,c=Math.round((e.getLineMaxColumn(l)+e.getLineMinColumn(l))/2);n[s]=this._moveToViewPosition(e,a,i,l,c)}return n}static _moveToViewMaxColumn(e,t,i){const n=[];for(let s=0,r=t.length;s<r;s++){const a=t[s],l=a.viewState.position.lineNumber,c=e.getLineMaxColumn(l);n[s]=this._moveToViewPosition(e,a,i,l,c)}return n}static _moveToViewLastNonWhitespaceColumn(e,t,i){const n=[];for(let s=0,r=t.length;s<r;s++){const a=t[s],l=a.viewState.position.lineNumber,c=e.getLineLastNonWhitespaceColumn(l);n[s]=this._moveToViewPosition(e,a,i,l,c)}return n}}var j0;(function(o){const e=function(i){if(!Fn(i))return!1;const n=i;return!(!ts(n.to)||!Qn(n.select)&&!CO(n.select)||!Qn(n.by)&&!ts(n.by)||!Qn(n.value)&&!sc(n.value))};o.description={description:\"Move cursor to a logical position in the view\",args:[{name:\"Cursor move argument object\",description:`Property-value pairs that can be passed through this argument:\n\t\t\t\t\t* 'to': A mandatory logical position value providing where to move the cursor.\n\t\t\t\t\t\t\\`\\`\\`\n\t\t\t\t\t\t'left', 'right', 'up', 'down', 'prevBlankLine', 'nextBlankLine',\n\t\t\t\t\t\t'wrappedLineStart', 'wrappedLineEnd', 'wrappedLineColumnCenter'\n\t\t\t\t\t\t'wrappedLineFirstNonWhitespaceCharacter', 'wrappedLineLastNonWhitespaceCharacter'\n\t\t\t\t\t\t'viewPortTop', 'viewPortCenter', 'viewPortBottom', 'viewPortIfOutside'\n\t\t\t\t\t\t\\`\\`\\`\n\t\t\t\t\t* 'by': Unit to move. Default is computed based on 'to' value.\n\t\t\t\t\t\t\\`\\`\\`\n\t\t\t\t\t\t'line', 'wrappedLine', 'character', 'halfLine'\n\t\t\t\t\t\t\\`\\`\\`\n\t\t\t\t\t* 'value': Number of units to move. Default is '1'.\n\t\t\t\t\t* 'select': If 'true' makes the selection. Default is 'false'.\n\t\t\t\t`,constraint:e,schema:{type:\"object\",required:[\"to\"],properties:{to:{type:\"string\",enum:[\"left\",\"right\",\"up\",\"down\",\"prevBlankLine\",\"nextBlankLine\",\"wrappedLineStart\",\"wrappedLineEnd\",\"wrappedLineColumnCenter\",\"wrappedLineFirstNonWhitespaceCharacter\",\"wrappedLineLastNonWhitespaceCharacter\",\"viewPortTop\",\"viewPortCenter\",\"viewPortBottom\",\"viewPortIfOutside\"]},by:{type:\"string\",enum:[\"line\",\"wrappedLine\",\"character\",\"halfLine\"]},value:{type:\"number\",default:1},select:{type:\"boolean\",default:!1}}}}]},o.RawDirection={Left:\"left\",Right:\"right\",Up:\"up\",Down:\"down\",PrevBlankLine:\"prevBlankLine\",NextBlankLine:\"nextBlankLine\",WrappedLineStart:\"wrappedLineStart\",WrappedLineFirstNonWhitespaceCharacter:\"wrappedLineFirstNonWhitespaceCharacter\",WrappedLineColumnCenter:\"wrappedLineColumnCenter\",WrappedLineEnd:\"wrappedLineEnd\",WrappedLineLastNonWhitespaceCharacter:\"wrappedLineLastNonWhitespaceCharacter\",ViewPortTop:\"viewPortTop\",ViewPortCenter:\"viewPortCenter\",ViewPortBottom:\"viewPortBottom\",ViewPortIfOutside:\"viewPortIfOutside\"},o.RawUnit={Line:\"line\",WrappedLine:\"wrappedLine\",Character:\"character\",HalfLine:\"halfLine\"};function t(i){if(!i.to)return null;let n;switch(i.to){case o.RawDirection.Left:n=0;break;case o.RawDirection.Right:n=1;break;case o.RawDirection.Up:n=2;break;case o.RawDirection.Down:n=3;break;case o.RawDirection.PrevBlankLine:n=4;break;case o.RawDirection.NextBlankLine:n=5;break;case o.RawDirection.WrappedLineStart:n=6;break;case o.RawDirection.WrappedLineFirstNonWhitespaceCharacter:n=7;break;case o.RawDirection.WrappedLineColumnCenter:n=8;break;case o.RawDirection.WrappedLineEnd:n=9;break;case o.RawDirection.WrappedLineLastNonWhitespaceCharacter:n=10;break;case o.RawDirection.ViewPortTop:n=11;break;case o.RawDirection.ViewPortBottom:n=13;break;case o.RawDirection.ViewPortCenter:n=12;break;case o.RawDirection.ViewPortIfOutside:n=14;break;default:return null}let s=0;switch(i.by){case o.RawUnit.Line:s=1;break;case o.RawUnit.WrappedLine:s=2;break;case o.RawUnit.Character:s=3;break;case o.RawUnit.HalfLine:s=4;break}return{direction:n,unit:s,select:!!i.select,value:i.value||1}}o.parse=t})(j0||(j0={}));var oi;(function(o){o[o.None=0]=\"None\",o[o.Indent=1]=\"Indent\",o[o.IndentOutdent=2]=\"IndentOutdent\",o[o.Outdent=3]=\"Outdent\"})(oi||(oi={}));class Lw{constructor(e){if(this._neutralCharacter=null,this._neutralCharacterSearched=!1,this.open=e.open,this.close=e.close,this._inString=!0,this._inComment=!0,this._inRegEx=!0,Array.isArray(e.notIn))for(let t=0,i=e.notIn.length;t<i;t++)switch(e.notIn[t]){case\"string\":this._inString=!1;break;case\"comment\":this._inComment=!1;break;case\"regex\":this._inRegEx=!1;break}}isOK(e){switch(e){case 0:return!0;case 1:return this._inComment;case 2:return this._inString;case 3:return this._inRegEx}}shouldAutoClose(e,t){if(e.getTokenCount()===0)return!0;const i=e.findTokenIndexAtOffset(t-2),n=e.getStandardTokenType(i);return this.isOK(n)}_findNeutralCharacterInRange(e,t){for(let i=e;i<=t;i++){const n=String.fromCharCode(i);if(!this.open.includes(n)&&!this.close.includes(n))return n}return null}findNeutralCharacter(){return this._neutralCharacterSearched||(this._neutralCharacterSearched=!0,this._neutralCharacter||(this._neutralCharacter=this._findNeutralCharacterInRange(48,57)),this._neutralCharacter||(this._neutralCharacter=this._findNeutralCharacterInRange(97,122)),this._neutralCharacter||(this._neutralCharacter=this._findNeutralCharacterInRange(65,90))),this._neutralCharacter}}class hW{constructor(e){this.autoClosingPairsOpenByStart=new Map,this.autoClosingPairsOpenByEnd=new Map,this.autoClosingPairsCloseByStart=new Map,this.autoClosingPairsCloseByEnd=new Map,this.autoClosingPairsCloseSingleChar=new Map;for(const t of e)cf(this.autoClosingPairsOpenByStart,t.open.charAt(0),t),cf(this.autoClosingPairsOpenByEnd,t.open.charAt(t.open.length-1),t),cf(this.autoClosingPairsCloseByStart,t.close.charAt(0),t),cf(this.autoClosingPairsCloseByEnd,t.close.charAt(t.close.length-1),t),t.close.length===1&&t.open.length===1&&cf(this.autoClosingPairsCloseSingleChar,t.close,t)}}function cf(o,e,t){o.has(e)?o.get(e).push(t):o.set(e,[t])}const hP=\"`~!@#$%^&*()-=+[{]}\\\\|;:'\\\",.<>/?\";function uW(o=\"\"){let e=\"(-?\\\\d*\\\\.\\\\d\\\\w*)|([^\";for(const t of hP)o.indexOf(t)>=0||(e+=\"\\\\\"+t);return e+=\"\\\\s]+)\",new RegExp(e,\"g\")}const eI=uW();function uP(o){let e=eI;if(o&&o instanceof RegExp)if(o.global)e=o;else{let t=\"g\";o.ignoreCase&&(t+=\"i\"),o.multiline&&(t+=\"m\"),o.unicode&&(t+=\"u\"),e=new RegExp(o.source,t)}return e.lastIndex=0,e}const gP=new wn;gP.unshift({maxLen:1e3,windowSize:15,timeBudget:150});function Mp(o,e,t,i,n){if(n||(n=Ue.first(gP)),t.length>n.maxLen){let c=o-n.maxLen/2;return c<0?c=0:i+=c,t=t.substring(c,o+n.maxLen/2),Mp(o,e,t,i,n)}const s=Date.now(),r=o-1-i;let a=-1,l=null;for(let c=1;!(Date.now()-s>=n.timeBudget);c++){const d=r-n.windowSize*c;e.lastIndex=Math.max(0,d);const h=gW(e,t,r,a);if(!h&&l||(l=h,d<=0))break;a=d}if(l){const c={word:l[0],startColumn:i+1+l.index,endColumn:i+1+l.index+l[0].length};return e.lastIndex=0,c}return null}function gW(o,e,t,i){let n;for(;n=o.exec(e);){const s=n.index||0;if(s<=t&&o.lastIndex>=t)return n;if(i>0&&s>i)return null}return null}class FC{constructor(e){if(e.autoClosingPairs?this._autoClosingPairs=e.autoClosingPairs.map(t=>new Lw(t)):e.brackets?this._autoClosingPairs=e.brackets.map(t=>new Lw({open:t[0],close:t[1]})):this._autoClosingPairs=[],e.__electricCharacterSupport&&e.__electricCharacterSupport.docComment){const t=e.__electricCharacterSupport.docComment;this._autoClosingPairs.push(new Lw({open:t.open,close:t.close||\"\"}))}this._autoCloseBefore=typeof e.autoCloseBefore==\"string\"?e.autoCloseBefore:FC.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED,this._surroundingPairs=e.surroundingPairs||this._autoClosingPairs}getAutoClosingPairs(){return this._autoClosingPairs}getAutoCloseBeforeSet(){return this._autoCloseBefore}getSurroundingPairs(){return this._surroundingPairs}}FC.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED=`;:.,=}])> \n\t`;function Ts(o,e=0){return o[o.length-(1+e)]}function fW(o){if(o.length===0)throw new Error(\"Invalid tail call\");return[o.slice(0,o.length-1),o[o.length-1]]}function ys(o,e,t=(i,n)=>i===n){if(o===e)return!0;if(!o||!e||o.length!==e.length)return!1;for(let i=0,n=o.length;i<n;i++)if(!t(o[i],e[i]))return!1;return!0}function pW(o,e){const t=o.length-1;e<t&&(o[e]=o[t]),o.pop()}function tI(o,e,t){return mW(o.length,i=>t(o[i],e))}function mW(o,e){let t=0,i=o-1;for(;t<=i;){const n=(t+i)/2|0,s=e(n);if(s<0)t=n+1;else if(s>0)i=n-1;else return n}return-(t+1)}function fP(o,e){let t=0,i=o.length;if(i===0)return 0;for(;t<i;){const n=Math.floor((t+i)/2);e(o[n])?i=n:t=n+1}return t}function Iy(o,e,t){if(o=o|0,o>=e.length)throw new TypeError(\"invalid index\");const i=e[Math.floor(e.length*Math.random())],n=[],s=[],r=[];for(const a of e){const l=t(a,i);l<0?n.push(a):l>0?s.push(a):r.push(a)}return o<n.length?Iy(o,n,t):o<n.length+r.length?r[0]:Iy(o-(n.length+r.length),s,t)}function bT(o,e){const t=[];let i;for(const n of o.slice(0).sort(e))!i||e(i[0],n)!==0?(i=[n],t.push(i)):i.push(n);return t}function BC(o){return o.filter(e=>!!e)}function pP(o){return!Array.isArray(o)||o.length===0}function en(o){return Array.isArray(o)&&o.length>0}function el(o,e=t=>t){const t=new Set;return o.filter(i=>{const n=e(i);return t.has(n)?!1:(t.add(n),!0)})}function Ey(o,e){const t=_W(o,e);if(t!==-1)return o[t]}function _W(o,e){for(let t=o.length-1;t>=0;t--){const i=o[t];if(e(i))return t}return-1}function mP(o,e){return o.length>0?o[0]:e}function mn(o,e){let t=typeof e==\"number\"?o:0;typeof e==\"number\"?t=o:(t=0,e=o);const i=[];if(t<=e)for(let n=t;n<e;n++)i.push(n);else for(let n=t;n>e;n--)i.push(n);return i}function WC(o,e,t){const i=o.slice(0,e),n=o.slice(e);return i.concat(t,n)}function Dw(o,e){const t=o.indexOf(e);t>-1&&(o.splice(t,1),o.unshift(e))}function W_(o,e){const t=o.indexOf(e);t>-1&&(o.splice(t,1),o.push(e))}function vT(o,e){for(const t of e)o.push(t)}function iI(o){return Array.isArray(o)?o:[o]}function bW(o,e,t){const i=_P(o,e),n=o.length,s=t.length;o.length=n+s;for(let r=n-1;r>=i;r--)o[r+s]=o[r];for(let r=0;r<s;r++)o[r+i]=t[r]}function CT(o,e,t,i){const n=_P(o,e),s=o.splice(n,t);return bW(o,n,i),s}function _P(o,e){return e<0?Math.max(e+o.length,0):Math.min(e,o.length)}var wT;(function(o){function e(n){return n<0}o.isLessThan=e;function t(n){return n>0}o.isGreaterThan=t;function i(n){return n===0}o.isNeitherLessOrGreaterThan=i,o.greaterThan=1,o.lessThan=-1,o.neitherLessOrGreaterThan=0})(wT||(wT={}));function Xf(o,e){return(t,i)=>e(o(t),o(i))}const vW=(o,e)=>o-e;function bP(o,e){if(o.length===0)return;let t=o[0];for(let i=1;i<o.length;i++){const n=o[i];e(n,t)>0&&(t=n)}return t}function vP(o,e){if(o.length===0)return;let t=o[0];for(let i=1;i<o.length;i++){const n=o[i];e(n,t)>=0&&(t=n)}return t}function CW(o,e){return bP(o,(t,i)=>-e(t,i))}class Ap{constructor(e){this.items=e,this.firstIdx=0,this.lastIdx=this.items.length-1}get length(){return this.lastIdx-this.firstIdx+1}takeWhile(e){let t=this.firstIdx;for(;t<this.items.length&&e(this.items[t]);)t++;const i=t===this.firstIdx?null:this.items.slice(this.firstIdx,t);return this.firstIdx=t,i}takeFromEndWhile(e){let t=this.lastIdx;for(;t>=0&&e(this.items[t]);)t--;const i=t===this.lastIdx?null:this.items.slice(t+1,this.lastIdx+1);return this.lastIdx=t,i}peek(){if(this.length!==0)return this.items[this.firstIdx]}dequeue(){const e=this.items[this.firstIdx];return this.firstIdx++,e}takeCount(e){const t=this.items.slice(this.firstIdx,this.firstIdx+e);return this.firstIdx+=e,t}}const ST=typeof Buffer!=\"undefined\";let kw;class VC{constructor(e){this.buffer=e,this.byteLength=this.buffer.byteLength}static wrap(e){return ST&&!Buffer.isBuffer(e)&&(e=Buffer.from(e.buffer,e.byteOffset,e.byteLength)),new VC(e)}toString(){return ST?this.buffer.toString():(kw||(kw=new TextDecoder),kw.decode(this.buffer))}}function wW(o,e){return o[e+0]<<0>>>0|o[e+1]<<8>>>0}function SW(o,e,t){o[t+0]=e&255,e=e>>>8,o[t+1]=e&255}function xo(o,e){return o[e]*Math.pow(2,24)+o[e+1]*Math.pow(2,16)+o[e+2]*Math.pow(2,8)+o[e+3]}function Io(o,e,t){o[t+3]=e,e=e>>>8,o[t+2]=e,e=e>>>8,o[t+1]=e,e=e>>>8,o[t]=e}function yT(o,e){return o[e]}function LT(o,e,t){o[t]=e}let xw;function CP(){return xw||(xw=new TextDecoder(\"UTF-16LE\")),xw}let Iw;function yW(){return Iw||(Iw=new TextDecoder(\"UTF-16BE\")),Iw}let Ew;function wP(){return Ew||(Ew=fO()?CP():yW()),Ew}const SP=typeof TextDecoder!=\"undefined\";let lc,Ny;SP?(lc=o=>new DW(o),Ny=LW):(lc=o=>new kW,Ny=yP);function LW(o,e,t){const i=new Uint16Array(o.buffer,e,t);return t>0&&(i[0]===65279||i[0]===65534)?yP(o,e,t):CP().decode(i)}function yP(o,e,t){const i=[];let n=0;for(let s=0;s<t;s++){const r=wW(o,e);e+=2,i[n++]=String.fromCharCode(r)}return i.join(\"\")}class DW{constructor(e){this._capacity=e|0,this._buffer=new Uint16Array(this._capacity),this._completedStrings=null,this._bufferLength=0}reset(){this._completedStrings=null,this._bufferLength=0}build(){return this._completedStrings!==null?(this._flushBuffer(),this._completedStrings.join(\"\")):this._buildBuffer()}_buildBuffer(){if(this._bufferLength===0)return\"\";const e=new Uint16Array(this._buffer.buffer,0,this._bufferLength);return wP().decode(e)}_flushBuffer(){const e=this._buildBuffer();this._bufferLength=0,this._completedStrings===null?this._completedStrings=[e]:this._completedStrings[this._completedStrings.length]=e}write1(e){const t=this._capacity-this._bufferLength;t<=1&&(t===0||wi(e))&&this._flushBuffer(),this._buffer[this._bufferLength++]=e}appendASCII(e){this._bufferLength===this._capacity&&this._flushBuffer(),this._buffer[this._bufferLength++]=e}appendASCIIString(e){const t=e.length;if(this._bufferLength+t>=this._capacity){this._flushBuffer(),this._completedStrings[this._completedStrings.length]=e;return}for(let i=0;i<t;i++)this._buffer[this._bufferLength++]=e.charCodeAt(i)}}class kW{constructor(){this._pieces=[],this._piecesLen=0}reset(){this._pieces=[],this._piecesLen=0}build(){return this._pieces.join(\"\")}write1(e){this._pieces[this._piecesLen++]=String.fromCharCode(e)}appendASCII(e){this._pieces[this._piecesLen++]=String.fromCharCode(e)}appendASCIIString(e){this._pieces[this._piecesLen++]=e}}class K0{constructor(e,t,i,n,s,r){this._richEditBracketBrand=void 0,this.languageId=e,this.index=t,this.open=i,this.close=n,this.forwardRegex=s,this.reversedRegex=r,this._openSet=K0._toSet(this.open),this._closeSet=K0._toSet(this.close)}isOpen(e){return this._openSet.has(e)}isClose(e){return this._closeSet.has(e)}static _toSet(e){const t=new Set;for(const i of e)t.add(i);return t}}function xW(o){const e=o.length;o=o.map(r=>[r[0].toLowerCase(),r[1].toLowerCase()]);const t=[];for(let r=0;r<e;r++)t[r]=r;const i=(r,a)=>{const[l,c]=r,[d,h]=a;return l===d||l===h||c===d||c===h},n=(r,a)=>{const l=Math.min(r,a),c=Math.max(r,a);for(let d=0;d<e;d++)t[d]===c&&(t[d]=l)};for(let r=0;r<e;r++){const a=o[r];for(let l=r+1;l<e;l++){const c=o[l];i(a,c)&&n(t[r],t[l])}}const s=[];for(let r=0;r<e;r++){const a=[],l=[];for(let c=0;c<e;c++)if(t[c]===r){const[d,h]=o[c];a.push(d),l.push(h)}a.length>0&&s.push({open:a,close:l})}return s}class IW{constructor(e,t){this._richEditBracketsBrand=void 0;const i=xW(t);this.brackets=i.map((n,s)=>new K0(e,s,n.open,n.close,EW(n.open,n.close,i,s),NW(n.open,n.close,i,s))),this.forwardRegex=TW(this.brackets),this.reversedRegex=MW(this.brackets),this.textIsBracket={},this.textIsOpenBracket={},this.maxBracketLength=0;for(const n of this.brackets){for(const s of n.open)this.textIsBracket[s]=n,this.textIsOpenBracket[s]=!0,this.maxBracketLength=Math.max(this.maxBracketLength,s.length);for(const s of n.close)this.textIsBracket[s]=n,this.textIsOpenBracket[s]=!1,this.maxBracketLength=Math.max(this.maxBracketLength,s.length)}}}function LP(o,e,t,i){for(let n=0,s=e.length;n<s;n++){if(n===t)continue;const r=e[n];for(const a of r.open)a.indexOf(o)>=0&&i.push(a);for(const a of r.close)a.indexOf(o)>=0&&i.push(a)}}function DP(o,e){return o.length-e.length}function HC(o){if(o.length<=1)return o;const e=[],t=new Set;for(const i of o)t.has(i)||(e.push(i),t.add(i));return e}function EW(o,e,t,i){let n=[];n=n.concat(o),n=n.concat(e);for(let s=0,r=n.length;s<r;s++)LP(n[s],t,i,n);return n=HC(n),n.sort(DP),n.reverse(),zC(n)}function NW(o,e,t,i){let n=[];n=n.concat(o),n=n.concat(e);for(let s=0,r=n.length;s<r;s++)LP(n[s],t,i,n);return n=HC(n),n.sort(DP),n.reverse(),zC(n.map(nI))}function TW(o){let e=[];for(const t of o){for(const i of t.open)e.push(i);for(const i of t.close)e.push(i)}return e=HC(e),zC(e)}function MW(o){let e=[];for(const t of o){for(const i of t.open)e.push(i);for(const i of t.close)e.push(i)}return e=HC(e),zC(e.map(nI))}function AW(o){const e=/^[\\w ]+$/.test(o);return o=Ds(o),e?`\\\\b${o}\\\\b`:o}function zC(o){const e=`(${o.map(AW).join(\")|(\")})`;return qO(e,!0)}const nI=function(){function o(i){if(SP){const n=new Uint16Array(i.length);let s=0;for(let r=i.length-1;r>=0;r--)n[s++]=i.charCodeAt(r);return wP().decode(n)}else{const n=[];let s=0;for(let r=i.length-1;r>=0;r--)n[s++]=i.charAt(r);return n.join(\"\")}}let e=null,t=null;return function(n){return e!==n&&(e=n,t=o(e)),t}}();class oo{static _findPrevBracketInText(e,t,i,n){const s=i.match(e);if(!s)return null;const r=i.length-(s.index||0),a=s[0].length,l=n+r;return new L(t,l-a+1,t,l+1)}static findPrevBracketInRange(e,t,i,n,s){const a=nI(i).substring(i.length-s,i.length-n);return this._findPrevBracketInText(e,t,a,n)}static findNextBracketInText(e,t,i,n){const s=i.match(e);if(!s)return null;const r=s.index||0,a=s[0].length;if(a===0)return null;const l=n+r;return new L(t,l+1,t,l+1+a)}static findNextBracketInRange(e,t,i,n,s){const r=i.substring(n,s);return this.findNextBracketInText(e,t,r,n)}}class RW{constructor(e){this._richEditBrackets=e}getElectricCharacters(){const e=[];if(this._richEditBrackets)for(const t of this._richEditBrackets.brackets)for(const i of t.close){const n=i.charAt(i.length-1);e.push(n)}return el(e)}onElectricCharacter(e,t,i){if(!this._richEditBrackets||this._richEditBrackets.brackets.length===0)return null;const n=t.findTokenIndexAtOffset(i-1);if(ur(t.getStandardTokenType(n)))return null;const s=this._richEditBrackets.reversedRegex,r=t.getLineContent().substring(0,i-1)+e,a=oo.findPrevBracketInRange(s,1,r,0,r.length);if(!a)return null;const l=r.substring(a.startColumn-1,a.endColumn-1).toLowerCase();if(this._richEditBrackets.textIsOpenBracket[l])return null;const d=t.getActualLineContentBefore(a.startColumn-1);return/^\\s*$/.test(d)?{matchOpenBracket:l}:null}}function V_(o){return o.global&&(o.lastIndex=0),!0}class OW{constructor(e){this._indentationRules=e}shouldIncrease(e){return!!(this._indentationRules&&this._indentationRules.increaseIndentPattern&&V_(this._indentationRules.increaseIndentPattern)&&this._indentationRules.increaseIndentPattern.test(e))}shouldDecrease(e){return!!(this._indentationRules&&this._indentationRules.decreaseIndentPattern&&V_(this._indentationRules.decreaseIndentPattern)&&this._indentationRules.decreaseIndentPattern.test(e))}shouldIndentNextLine(e){return!!(this._indentationRules&&this._indentationRules.indentNextLinePattern&&V_(this._indentationRules.indentNextLinePattern)&&this._indentationRules.indentNextLinePattern.test(e))}shouldIgnore(e){return!!(this._indentationRules&&this._indentationRules.unIndentedLinePattern&&V_(this._indentationRules.unIndentedLinePattern)&&this._indentationRules.unIndentedLinePattern.test(e))}getIndentMetadata(e){let t=0;return this.shouldIncrease(e)&&(t+=1),this.shouldDecrease(e)&&(t+=2),this.shouldIndentNextLine(e)&&(t+=4),this.shouldIgnore(e)&&(t+=8),t}}class au{constructor(e){e=e||{},e.brackets=e.brackets||[[\"(\",\")\"],[\"{\",\"}\"],[\"[\",\"]\"]],this._brackets=[],e.brackets.forEach(t=>{const i=au._createOpenBracketRegExp(t[0]),n=au._createCloseBracketRegExp(t[1]);i&&n&&this._brackets.push({open:t[0],openRegExp:i,close:t[1],closeRegExp:n})}),this._regExpRules=e.onEnterRules||[]}onEnter(e,t,i,n){if(e>=3)for(let s=0,r=this._regExpRules.length;s<r;s++){const a=this._regExpRules[s];if([{reg:a.beforeText,text:i},{reg:a.afterText,text:n},{reg:a.previousLineText,text:t}].every(c=>c.reg?(c.reg.lastIndex=0,c.reg.test(c.text)):!0))return a.action}if(e>=2&&i.length>0&&n.length>0)for(let s=0,r=this._brackets.length;s<r;s++){const a=this._brackets[s];if(a.openRegExp.test(i)&&a.closeRegExp.test(n))return{indentAction:oi.IndentOutdent}}if(e>=2&&i.length>0){for(let s=0,r=this._brackets.length;s<r;s++)if(this._brackets[s].openRegExp.test(i))return{indentAction:oi.Indent}}return null}static _createOpenBracketRegExp(e){let t=Ds(e);return/\\B/.test(t.charAt(0))||(t=\"\\\\b\"+t),t+=\"\\\\s*$\",au._safeRegExp(t)}static _createCloseBracketRegExp(e){let t=Ds(e);return/\\B/.test(t.charAt(t.length-1))||(t=t+\"\\\\b\"),t=\"^\\\\s*\"+t,au._safeRegExp(t)}static _safeRegExp(e){try{return new RegExp(e)}catch(t){return Ee(t),null}}}const ot=qe(\"configurationService\");function kP(o,e){const t=Object.create(null);for(const i in o)sI(t,i,o[i],e);return t}function sI(o,e,t,i){const n=e.split(\".\"),s=n.pop();let r=o;for(let a=0;a<n.length;a++){const l=n[a];let c=r[l];switch(typeof c){case\"undefined\":c=r[l]=Object.create(null);break;case\"object\":break;default:i(`Ignoring ${e} as ${n.slice(0,a+1).join(\".\")} is ${JSON.stringify(c)}`);return}r=c}if(typeof r==\"object\"&&r!==null)try{r[s]=t}catch(a){i(`Ignoring ${e} as ${n.join(\".\")} is ${JSON.stringify(r)}`)}else i(`Ignoring ${e} as ${n.join(\".\")} is ${JSON.stringify(r)}`)}function PW(o,e){const t=e.split(\".\");xP(o,t)}function xP(o,e){const t=e.shift();if(e.length===0){delete o[t];return}if(Object.keys(o).indexOf(t)!==-1){const i=o[t];typeof i==\"object\"&&!Array.isArray(i)&&(xP(i,e),Object.keys(i).length===0&&delete o[t])}}function DT(o,e,t){function i(r,a){let l=r;for(const c of a){if(typeof l!=\"object\"||l===null)return;l=l[c]}return l}const n=e.split(\".\"),s=i(o,n);return typeof s==\"undefined\"?t:s}function FW(o){return o.replace(/[\\[\\]]/g,\"\")}const Ht=qe(\"languageService\");class vr{constructor(e,t=[],i=!1){this.ctor=e,this.staticArguments=t,this.supportsDelayedInstantiation=i}}const IP=[];function Xe(o,e,t){e instanceof vr||(e=new vr(e,[],t)),IP.push([o,e])}function kT(){return IP}const Pn=Object.freeze({text:\"text/plain\",binary:\"application/octet-stream\",unknown:\"application/unknown\",markdown:\"text/markdown\",latex:\"text/latex\",uriList:\"text/uri-list\"}),UC={JSONContribution:\"base.contributions.json\"};function BW(o){return o.length>0&&o.charAt(o.length-1)===\"#\"?o.substring(0,o.length-1):o}class WW{constructor(){this._onDidChangeSchema=new O,this.schemasById={}}registerSchema(e,t){this.schemasById[BW(e)]=t,this._onDidChangeSchema.fire(e)}notifySchemaChanged(e){this._onDidChangeSchema.fire(e)}}const VW=new WW;di.add(UC.JSONContribution,VW);const al={Configuration:\"base.contributions.configuration\"},df=\"vscode://schemas/settings/resourceLanguage\",xT=di.as(UC.JSONContribution);class HW{constructor(){this.overrideIdentifiers=new Set,this._onDidSchemaChange=new O,this._onDidUpdateConfiguration=new O,this.configurationDefaultsOverrides=new Map,this.defaultLanguageConfigurationOverridesNode={id:\"defaultOverrides\",title:p(\"defaultLanguageConfigurationOverrides.title\",\"Default Language Configuration Overrides\"),properties:{}},this.configurationContributors=[this.defaultLanguageConfigurationOverridesNode],this.resourceLanguageSettingsSchema={properties:{},patternProperties:{},additionalProperties:!1,errorMessage:\"Unknown editor configuration setting\",allowTrailingCommas:!0,allowComments:!0},this.configurationProperties={},this.policyConfigurations=new Map,this.excludedConfigurationProperties={},xT.registerSchema(df,this.resourceLanguageSettingsSchema),this.registerOverridePropertyPatternKey()}registerConfiguration(e,t=!0){this.registerConfigurations([e],t)}registerConfigurations(e,t=!0){const i=this.doRegisterConfigurations(e,t);xT.registerSchema(df,this.resourceLanguageSettingsSchema),this._onDidSchemaChange.fire(),this._onDidUpdateConfiguration.fire({properties:i})}registerDefaultConfigurations(e){var t;const i=[],n=[];for(const{overrides:s,source:r}of e)for(const a in s)if(i.push(a),Rp.test(a)){const l=this.configurationDefaultsOverrides.get(a),c=(t=l==null?void 0:l.valuesSources)!==null&&t!==void 0?t:new Map;if(r)for(const g of Object.keys(s[a]))c.set(g,r);const d=Object.assign(Object.assign({},(l==null?void 0:l.value)||{}),s[a]);this.configurationDefaultsOverrides.set(a,{source:r,value:d,valuesSources:c});const h=FW(a),u={type:\"object\",default:d,description:p(\"defaultLanguageConfiguration.description\",\"Configure settings to be overridden for the {0} language.\",h),$ref:df,defaultDefaultValue:d,source:ts(r)?void 0:r,defaultValueSource:r};n.push(...NP(a)),this.configurationProperties[a]=u,this.defaultLanguageConfigurationOverridesNode.properties[a]=u}else{this.configurationDefaultsOverrides.set(a,{value:s[a],source:r});const l=this.configurationProperties[a];l&&(this.updatePropertyDefaultValue(a,l),this.updateSchema(a,l))}this.registerOverrideIdentifiers(n),this._onDidSchemaChange.fire(),this._onDidUpdateConfiguration.fire({properties:i,defaultsOverrides:!0})}registerOverrideIdentifiers(e){for(const t of e)this.overrideIdentifiers.add(t);this.updateOverridePropertyPatternKey()}doRegisterConfigurations(e,t){const i=[];return e.forEach(n=>{i.push(...this.validateAndRegisterProperties(n,t,n.extensionInfo,n.restrictedProperties)),this.configurationContributors.push(n),this.registerJSONConfiguration(n)}),i}validateAndRegisterProperties(e,t=!0,i,n,s=3){var r;s=_s(e.scope)?s:e.scope;const a=[],l=e.properties;if(l)for(const d in l){const h=l[d];if(t&&$W(d,h)){delete l[d];continue}if(h.source=i,h.defaultDefaultValue=l[d].default,this.updatePropertyDefaultValue(d,h),Rp.test(d)?h.scope=void 0:(h.scope=_s(h.scope)?s:h.scope,h.restricted=_s(h.restricted)?!!(n!=null&&n.includes(d)):h.restricted),l[d].hasOwnProperty(\"included\")&&!l[d].included){this.excludedConfigurationProperties[d]=l[d],delete l[d];continue}else this.configurationProperties[d]=l[d],!((r=l[d].policy)===null||r===void 0)&&r.name&&this.policyConfigurations.set(l[d].policy.name,d);!l[d].deprecationMessage&&l[d].markdownDeprecationMessage&&(l[d].deprecationMessage=l[d].markdownDeprecationMessage),a.push(d)}const c=e.allOf;if(c)for(const d of c)a.push(...this.validateAndRegisterProperties(d,t,i,n,s));return a}getConfigurationProperties(){return this.configurationProperties}getPolicyConfigurations(){return this.policyConfigurations}registerJSONConfiguration(e){const t=i=>{const n=i.properties;if(n)for(const r in n)this.updateSchema(r,n[r]);const s=i.allOf;s==null||s.forEach(t)};t(e)}updateSchema(e,t){switch(t.scope){case 1:break;case 2:break;case 6:break;case 3:break;case 4:break;case 5:this.resourceLanguageSettingsSchema.properties[e]=t;break}}updateOverridePropertyPatternKey(){for(const e of this.overrideIdentifiers.values()){const t=`[${e}]`,i={type:\"object\",description:p(\"overrideSettings.defaultDescription\",\"Configure editor settings to be overridden for a language.\"),errorMessage:p(\"overrideSettings.errorMessage\",\"This setting does not support per-language configuration.\"),$ref:df};this.updatePropertyDefaultValue(t,i)}this._onDidSchemaChange.fire()}registerOverridePropertyPatternKey(){p(\"overrideSettings.defaultDescription\",\"Configure editor settings to be overridden for a language.\"),p(\"overrideSettings.errorMessage\",\"This setting does not support per-language configuration.\"),this._onDidSchemaChange.fire()}updatePropertyDefaultValue(e,t){const i=this.configurationDefaultsOverrides.get(e);let n=i==null?void 0:i.value,s=i==null?void 0:i.source;Qn(n)&&(n=t.defaultDefaultValue,s=void 0),Qn(n)&&(n=UW(t.type)),t.default=n,t.defaultValueSource=s}}const EP=\"\\\\[([^\\\\]]+)\\\\]\",IT=new RegExp(EP,\"g\"),zW=`^(${EP})+$`,Rp=new RegExp(zW);function NP(o){const e=[];if(Rp.test(o)){let t=IT.exec(o);for(;t!=null&&t.length;){const i=t[1].trim();i&&e.push(i),t=IT.exec(o)}}return el(e)}function UW(o){switch(Array.isArray(o)?o[0]:o){case\"boolean\":return!1;case\"integer\":case\"number\":return 0;case\"string\":return\"\";case\"array\":return[];case\"object\":return{};default:return null}}const t0=new HW;di.add(al.Configuration,t0);function $W(o,e){var t,i,n,s;return o.trim()?Rp.test(o)?p(\"config.property.languageDefault\",\"Cannot register '{0}'. This matches property pattern '\\\\\\\\[.*\\\\\\\\]$' for describing language specific editor settings. Use 'configurationDefaults' contribution.\",o):t0.getConfigurationProperties()[o]!==void 0?p(\"config.property.duplicate\",\"Cannot register '{0}'. This property is already registered.\",o):((t=e.policy)===null||t===void 0?void 0:t.name)&&t0.getPolicyConfigurations().get((i=e.policy)===null||i===void 0?void 0:i.name)!==void 0?p(\"config.policy.duplicate\",\"Cannot register '{0}'. The associated policy {1} is already registered with {2}.\",o,(n=e.policy)===null||n===void 0?void 0:n.name,t0.getPolicyConfigurations().get((s=e.policy)===null||s===void 0?void 0:s.name)):null:p(\"config.property.empty\",\"Cannot register an empty property\")}const jW={ModesRegistry:\"editor.modesRegistry\"};class KW{constructor(){this._onDidChangeLanguages=new O,this.onDidChangeLanguages=this._onDidChangeLanguages.event,this._languages=[]}registerLanguage(e){return this._languages.push(e),this._onDidChangeLanguages.fire(void 0),{dispose:()=>{for(let t=0,i=this._languages.length;t<i;t++)if(this._languages[t]===e){this._languages.splice(t,1);return}}}}getLanguages(){return this._languages}}const sg=new KW;di.add(jW.ModesRegistry,sg);const Us=\"plaintext\",qW=\".txt\";sg.registerLanguage({id:Us,extensions:[qW],aliases:[p(\"plainText.alias\",\"Plain Text\"),\"text\"],mimetypes:[Pn.text]});di.as(al.Configuration).registerDefaultConfigurations([{overrides:{\"[plaintext]\":{\"editor.unicodeHighlight.ambiguousCharacters\":!1,\"editor.unicodeHighlight.invisibleCharacters\":!1}}}]);class GW{constructor(e,t){this.languageId=e;let i;t.colorizedBracketPairs?i=ET(t.colorizedBracketPairs.map(r=>[r[0],r[1]])):t.brackets?i=ET(t.brackets.map(r=>[r[0],r[1]]).filter(r=>!(r[0]===\"<\"&&r[1]===\">\"))):i=[];const n=new pT(r=>{const a=new Set;return{info:new ZW(this,r,a),closing:a}}),s=new pT(r=>{const a=new Set;return{info:new YW(this,r,a),opening:a}});for(const[r,a]of i){const l=n.get(r),c=s.get(a);l.closing.add(c.info),c.opening.add(l.info)}this._openingBrackets=new Map([...n.cachedValues].map(([r,a])=>[r,a.info])),this._closingBrackets=new Map([...s.cachedValues].map(([r,a])=>[r,a.info]))}get openingBrackets(){return[...this._openingBrackets.values()]}get closingBrackets(){return[...this._closingBrackets.values()]}getOpeningBracketInfo(e){return this._openingBrackets.get(e)}getClosingBracketInfo(e){return this._closingBrackets.get(e)}getBracketInfo(e){return this.getOpeningBracketInfo(e)||this.getClosingBracketInfo(e)}}function ET(o){return o.filter(([e,t])=>e!==\"\"&&t!==\"\")}class TP{constructor(e,t){this.config=e,this.bracketText=t}get languageId(){return this.config.languageId}}class ZW extends TP{constructor(e,t,i){super(e,t),this.openedBrackets=i,this.isOpeningBracket=!0}}class YW extends TP{constructor(e,t,i){super(e,t),this.closedBrackets=i,this.isOpeningBracket=!1}closes(e){if(e.languageId===this.languageId&&e.config!==this.config)throw new kx(\"Brackets from different language configuration cannot be used.\");return this.closedBrackets.has(e)}getClosedBrackets(){return[...this.closedBrackets]}}var XW=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},NT=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};class Nw{constructor(e){this.languageId=e}affects(e){return this.languageId?this.languageId===e:!0}}const ti=qe(\"languageConfigurationService\");let Ty=class extends z{constructor(e,t){super(),this.configurationService=e,this.languageService=t,this._registry=this._register(new tV),this.onDidChangeEmitter=this._register(new O),this.onDidChange=this.onDidChangeEmitter.event,this.configurations=new Map;const i=new Set(Object.values(My));this._register(this.configurationService.onDidChangeConfiguration(n=>{const s=n.change.keys.some(a=>i.has(a)),r=n.change.overrides.filter(([a,l])=>l.some(c=>i.has(c))).map(([a])=>a);if(s)this.configurations.clear(),this.onDidChangeEmitter.fire(new Nw(void 0));else for(const a of r)this.languageService.isRegisteredLanguageId(a)&&(this.configurations.delete(a),this.onDidChangeEmitter.fire(new Nw(a)))})),this._register(this._registry.onDidChange(n=>{this.configurations.delete(n.languageId),this.onDidChangeEmitter.fire(new Nw(n.languageId))}))}register(e,t,i){return this._registry.register(e,t,i)}getLanguageConfiguration(e){let t=this.configurations.get(e);return t||(t=QW(e,this._registry,this.configurationService,this.languageService),this.configurations.set(e,t)),t}};Ty=XW([NT(0,ot),NT(1,Ht)],Ty);function QW(o,e,t,i){let n=e.getLanguageConfiguration(o);if(!n){if(!i.isRegisteredLanguageId(o))throw new Error(`Language id \"${o}\" is not configured nor known`);n=new Op(o,{})}const s=JW(n.languageId,t),r=AP([n.underlyingConfig,s]);return new Op(n.languageId,r)}const My={brackets:\"editor.language.brackets\",colorizedBracketPairs:\"editor.language.colorizedBracketPairs\"};function JW(o,e){const t=e.getValue(My.brackets,{overrideIdentifier:o}),i=e.getValue(My.colorizedBracketPairs,{overrideIdentifier:o});return{brackets:TT(t),colorizedBracketPairs:TT(i)}}function TT(o){if(!!Array.isArray(o))return o.map(e=>{if(!(!Array.isArray(e)||e.length!==2))return[e[0],e[1]]}).filter(e=>!!e)}function MP(o,e,t){const i=o.getLineContent(e);let n=pt(i);return n.length>t-1&&(n=n.substring(0,t-1)),n}function Eu(o,e,t){o.tokenization.forceTokenization(e);const i=o.tokenization.getLineTokens(e),n=typeof t==\"undefined\"?o.getLineMaxColumn(e)-1:t-1;return OC(i,n)}class eV{constructor(e){this.languageId=e,this._resolved=null,this._entries=[],this._order=0,this._resolved=null}register(e,t){const i=new MT(e,t,++this._order);return this._entries.push(i),this._resolved=null,ze(()=>{for(let n=0;n<this._entries.length;n++)if(this._entries[n]===i){this._entries.splice(n,1),this._resolved=null;break}})}getResolvedConfiguration(){if(!this._resolved){const e=this._resolve();e&&(this._resolved=new Op(this.languageId,e))}return this._resolved}_resolve(){return this._entries.length===0?null:(this._entries.sort(MT.cmp),AP(this._entries.map(e=>e.configuration)))}}function AP(o){let e={comments:void 0,brackets:void 0,wordPattern:void 0,indentationRules:void 0,onEnterRules:void 0,autoClosingPairs:void 0,surroundingPairs:void 0,autoCloseBefore:void 0,folding:void 0,colorizedBracketPairs:void 0,__electricCharacterSupport:void 0};for(const t of o)e={comments:t.comments||e.comments,brackets:t.brackets||e.brackets,wordPattern:t.wordPattern||e.wordPattern,indentationRules:t.indentationRules||e.indentationRules,onEnterRules:t.onEnterRules||e.onEnterRules,autoClosingPairs:t.autoClosingPairs||e.autoClosingPairs,surroundingPairs:t.surroundingPairs||e.surroundingPairs,autoCloseBefore:t.autoCloseBefore||e.autoCloseBefore,folding:t.folding||e.folding,colorizedBracketPairs:t.colorizedBracketPairs||e.colorizedBracketPairs,__electricCharacterSupport:t.__electricCharacterSupport||e.__electricCharacterSupport};return e}class MT{constructor(e,t,i){this.configuration=e,this.priority=t,this.order=i}static cmp(e,t){return e.priority===t.priority?e.order-t.order:e.priority-t.priority}}class AT{constructor(e){this.languageId=e}}class tV extends z{constructor(){super(),this._entries=new Map,this._onDidChange=this._register(new O),this.onDidChange=this._onDidChange.event,this._register(this.register(Us,{brackets:[[\"(\",\")\"],[\"[\",\"]\"],[\"{\",\"}\"]],surroundingPairs:[{open:\"{\",close:\"}\"},{open:\"[\",close:\"]\"},{open:\"(\",close:\")\"},{open:\"<\",close:\">\"},{open:'\"',close:'\"'},{open:\"'\",close:\"'\"},{open:\"`\",close:\"`\"}],colorizedBracketPairs:[],folding:{offSide:!0}},0))}register(e,t,i=0){let n=this._entries.get(e);n||(n=new eV(e),this._entries.set(e,n));const s=n.register(t,i);return this._onDidChange.fire(new AT(e)),ze(()=>{s.dispose(),this._onDidChange.fire(new AT(e))})}getLanguageConfiguration(e){const t=this._entries.get(e);return(t==null?void 0:t.getResolvedConfiguration())||null}}class Op{constructor(e,t){this.languageId=e,this.underlyingConfig=t,this._brackets=null,this._electricCharacter=null,this._onEnterSupport=this.underlyingConfig.brackets||this.underlyingConfig.indentationRules||this.underlyingConfig.onEnterRules?new au(this.underlyingConfig):null,this.comments=Op._handleComments(this.underlyingConfig),this.characterPair=new FC(this.underlyingConfig),this.wordDefinition=this.underlyingConfig.wordPattern||eI,this.indentationRules=this.underlyingConfig.indentationRules,this.underlyingConfig.indentationRules?this.indentRulesSupport=new OW(this.underlyingConfig.indentationRules):this.indentRulesSupport=null,this.foldingRules=this.underlyingConfig.folding||{},this.bracketsNew=new GW(e,this.underlyingConfig)}getWordDefinition(){return uP(this.wordDefinition)}get brackets(){return!this._brackets&&this.underlyingConfig.brackets&&(this._brackets=new IW(this.languageId,this.underlyingConfig.brackets)),this._brackets}get electricCharacter(){return this._electricCharacter||(this._electricCharacter=new RW(this.brackets)),this._electricCharacter}onEnter(e,t,i,n){return this._onEnterSupport?this._onEnterSupport.onEnter(e,t,i,n):null}getAutoClosingPairs(){return new hW(this.characterPair.getAutoClosingPairs())}getAutoCloseBeforeSet(){return this.characterPair.getAutoCloseBeforeSet()}getSurroundingPairs(){return this.characterPair.getSurroundingPairs()}static _handleComments(e){const t=e.comments;if(!t)return null;const i={};if(t.lineComment&&(i.lineCommentToken=t.lineComment),t.blockComment){const[n,s]=t.blockComment;i.blockCommentStartToken=n,i.blockCommentEndToken=s}return i}}Xe(ti,Ty);function Nu(o,e,t,i){const n=Eu(e,t.startLineNumber,t.startColumn),s=i.getLanguageConfiguration(n.languageId);if(!s)return null;const r=n.getLineContent(),a=r.substr(0,t.startColumn-1-n.firstCharOffset);let l;t.isEmpty()?l=r.substr(t.startColumn-1-n.firstCharOffset):l=Eu(e,t.endLineNumber,t.endColumn).getLineContent().substr(t.endColumn-1-n.firstCharOffset);let c=\"\";if(t.startLineNumber>1&&n.firstCharOffset===0){const _=Eu(e,t.startLineNumber-1);_.languageId===n.languageId&&(c=_.getLineContent())}const d=s.onEnter(o,c,a,l);if(!d)return null;const h=d.indentAction;let u=d.appendText;const g=d.removeText||0;u?h===oi.Indent&&(u=\"\t\"+u):h===oi.Indent||h===oi.IndentOutdent?u=\"\t\":u=\"\";let f=MP(e,t.startLineNumber,t.startColumn);return g&&(f=f.substring(0,f.length-g)),{indentAction:h,appendText:u,removeText:g,indentation:f}}var iV=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},nV=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const Tw=Object.create(null);function Bc(o,e){if(e<=0)return\"\";Tw[o]||(Tw[o]=[\"\",o]);const t=Tw[o];for(let i=t.length;i<=e;i++)t[i]=t[i-1]+o;return t[e]}let Fs=class Ay{constructor(e,t,i){this._languageConfigurationService=i,this._opts=t,this._selection=e,this._selectionId=null,this._useLastEditRangeForCursorEndPosition=!1,this._selectionStartColumnStaysPut=!1}static unshiftIndent(e,t,i,n,s){const r=_i.visibleColumnFromColumn(e,t,i);if(s){const a=Bc(\" \",n),c=_i.prevIndentTabStop(r,n)/n;return Bc(a,c)}else{const a=\"\t\",c=_i.prevRenderTabStop(r,i)/i;return Bc(a,c)}}static shiftIndent(e,t,i,n,s){const r=_i.visibleColumnFromColumn(e,t,i);if(s){const a=Bc(\" \",n),c=_i.nextIndentTabStop(r,n)/n;return Bc(a,c)}else{const a=\"\t\",c=_i.nextRenderTabStop(r,i)/i;return Bc(a,c)}}_addEditOperation(e,t,i){this._useLastEditRangeForCursorEndPosition?e.addTrackedEditOperation(t,i):e.addEditOperation(t,i)}getEditOperations(e,t){const i=this._selection.startLineNumber;let n=this._selection.endLineNumber;this._selection.endColumn===1&&i!==n&&(n=n-1);const{tabSize:s,indentSize:r,insertSpaces:a}=this._opts,l=i===n;if(this._opts.useTabStops){this._selection.isEmpty()&&/^\\s*$/.test(e.getLineContent(i))&&(this._useLastEditRangeForCursorEndPosition=!0);let c=0,d=0;for(let h=i;h<=n;h++,c=d){d=0;const u=e.getLineContent(h);let g=Sn(u);if(this._opts.isUnshift&&(u.length===0||g===0)||!l&&!this._opts.isUnshift&&u.length===0)continue;if(g===-1&&(g=u.length),h>1&&_i.visibleColumnFromColumn(u,g+1,s)%r!==0&&e.tokenization.isCheapToTokenize(h-1)){const b=Nu(this._opts.autoIndent,e,new L(h-1,e.getLineMaxColumn(h-1),h-1,e.getLineMaxColumn(h-1)),this._languageConfigurationService);if(b){if(d=c,b.appendText)for(let v=0,C=b.appendText.length;v<C&&d<r&&b.appendText.charCodeAt(v)===32;v++)d++;b.removeText&&(d=Math.max(0,d-b.removeText));for(let v=0;v<d&&!(g===0||u.charCodeAt(g-1)!==32);v++)g--}}if(this._opts.isUnshift&&g===0)continue;let f;this._opts.isUnshift?f=Ay.unshiftIndent(u,g+1,s,r,a):f=Ay.shiftIndent(u,g+1,s,r,a),this._addEditOperation(t,new L(h,1,h,g+1),f),h===i&&!this._selection.isEmpty()&&(this._selectionStartColumnStaysPut=this._selection.startColumn<=g+1)}}else{!this._opts.isUnshift&&this._selection.isEmpty()&&e.getLineLength(i)===0&&(this._useLastEditRangeForCursorEndPosition=!0);const c=a?Bc(\" \",r):\"\t\";for(let d=i;d<=n;d++){const h=e.getLineContent(d);let u=Sn(h);if(!(this._opts.isUnshift&&(h.length===0||u===0))&&!(!l&&!this._opts.isUnshift&&h.length===0)&&(u===-1&&(u=h.length),!(this._opts.isUnshift&&u===0)))if(this._opts.isUnshift){u=Math.min(u,r);for(let g=0;g<u;g++)if(h.charCodeAt(g)===9){u=g+1;break}this._addEditOperation(t,new L(d,1,d,u+1),\"\")}else this._addEditOperation(t,new L(d,1,d,1),c),d===i&&!this._selection.isEmpty()&&(this._selectionStartColumnStaysPut=this._selection.startColumn===1)}}this._selectionId=t.trackSelection(this._selection)}computeCursorState(e,t){if(this._useLastEditRangeForCursorEndPosition){const n=t.getInverseEditOperations()[0];return new oe(n.range.endLineNumber,n.range.endColumn,n.range.endLineNumber,n.range.endColumn)}const i=t.getTrackedSelection(this._selectionId);if(this._selectionStartColumnStaysPut){const n=this._selection.startColumn;return i.startColumn<=n?i:i.getDirection()===0?new oe(i.startLineNumber,n,i.endLineNumber,i.endColumn):new oe(i.endLineNumber,i.endColumn,i.startLineNumber,n)}return i}};Fs=iV([nV(2,ti)],Fs);class sV{constructor(e,t,i){this._range=e,this._charBeforeSelection=t,this._charAfterSelection=i}getEditOperations(e,t){t.addTrackedEditOperation(new L(this._range.startLineNumber,this._range.startColumn,this._range.startLineNumber,this._range.startColumn),this._charBeforeSelection),t.addTrackedEditOperation(new L(this._range.endLineNumber,this._range.endColumn,this._range.endLineNumber,this._range.endColumn),this._charAfterSelection)}computeCursorState(e,t){const i=t.getInverseEditOperations(),n=i[0].range,s=i[1].range;return new oe(n.endLineNumber,n.endColumn,s.endLineNumber,s.endColumn-this._charAfterSelection.length)}}class oV{constructor(e,t,i){this._position=e,this._text=t,this._charAfter=i}getEditOperations(e,t){t.addTrackedEditOperation(new L(this._position.lineNumber,this._position.column,this._position.lineNumber,this._position.column),this._text+this._charAfter)}computeCursorState(e,t){const n=t.getInverseEditOperations()[0].range;return new oe(n.endLineNumber,n.startColumn,n.endLineNumber,n.endColumn-this._charAfter.length)}}function rV(o,e,t){const i=o.tokenization.getLanguageIdAtPosition(e,0);if(e>1){let n,s=-1;for(n=e-1;n>=1;n--){if(o.tokenization.getLanguageIdAtPosition(n,0)!==i)return s;const r=o.getLineContent(n);if(t.shouldIgnore(r)||/^\\s+$/.test(r)||r===\"\"){s=n;continue}return n}}return-1}function $C(o,e,t,i=!0,n){if(o<4)return null;const s=n.getLanguageConfiguration(e.tokenization.getLanguageId()).indentRulesSupport;if(!s)return null;if(t<=1)return{indentation:\"\",action:null};const r=rV(e,t,s);if(r<0)return null;if(r<1)return{indentation:\"\",action:null};const a=e.getLineContent(r);if(s.shouldIncrease(a)||s.shouldIndentNextLine(a))return{indentation:pt(a),action:oi.Indent,line:r};if(s.shouldDecrease(a))return{indentation:pt(a),action:null,line:r};{if(r===1)return{indentation:pt(e.getLineContent(r)),action:null,line:r};const l=r-1,c=s.getIndentMetadata(e.getLineContent(l));if(!(c&3)&&c&4){let d=0;for(let h=l-1;h>0;h--)if(!s.shouldIndentNextLine(e.getLineContent(h))){d=h;break}return{indentation:pt(e.getLineContent(d+1)),action:null,line:d+1}}if(i)return{indentation:pt(e.getLineContent(r)),action:null,line:r};for(let d=r;d>0;d--){const h=e.getLineContent(d);if(s.shouldIncrease(h))return{indentation:pt(h),action:oi.Indent,line:d};if(s.shouldIndentNextLine(h)){let u=0;for(let g=d-1;g>0;g--)if(!s.shouldIndentNextLine(e.getLineContent(d))){u=g;break}return{indentation:pt(e.getLineContent(u+1)),action:null,line:u+1}}else if(s.shouldDecrease(h))return{indentation:pt(h),action:null,line:d}}return{indentation:pt(e.getLineContent(1)),action:null,line:1}}}function Qf(o,e,t,i,n,s){if(o<4)return null;const r=s.getLanguageConfiguration(t);if(!r)return null;const a=s.getLanguageConfiguration(t).indentRulesSupport;if(!a)return null;const l=$C(o,e,i,void 0,s),c=e.getLineContent(i);if(l){const d=l.line;if(d!==void 0){const h=r.onEnter(o,\"\",e.getLineContent(d),\"\");if(h){let u=pt(e.getLineContent(d));return h.removeText&&(u=u.substring(0,u.length-h.removeText)),h.indentAction===oi.Indent||h.indentAction===oi.IndentOutdent?u=n.shiftIndent(u):h.indentAction===oi.Outdent&&(u=n.unshiftIndent(u)),a.shouldDecrease(c)&&(u=n.unshiftIndent(u)),h.appendText&&(u+=h.appendText),pt(u)}}return a.shouldDecrease(c)?l.action===oi.Indent?l.indentation:n.unshiftIndent(l.indentation):l.action===oi.Indent?n.shiftIndent(l.indentation):l.indentation}return null}function aV(o,e,t,i,n){if(o<4)return null;e.tokenization.forceTokenization(t.startLineNumber);const s=e.tokenization.getLineTokens(t.startLineNumber),r=OC(s,t.startColumn-1),a=r.getLineContent();let l=!1,c;r.firstCharOffset>0&&s.getLanguageId(0)!==r.languageId?(l=!0,c=a.substr(0,t.startColumn-1-r.firstCharOffset)):c=s.getLineContent().substring(0,t.startColumn-1);let d;t.isEmpty()?d=a.substr(t.startColumn-1-r.firstCharOffset):d=Eu(e,t.endLineNumber,t.endColumn).getLineContent().substr(t.endColumn-1-r.firstCharOffset);const h=n.getLanguageConfiguration(r.languageId).indentRulesSupport;if(!h)return null;const u=c,g=pt(c),f={tokenization:{getLineTokens:C=>e.tokenization.getLineTokens(C),getLanguageId:()=>e.getLanguageId(),getLanguageIdAtPosition:(C,w)=>e.getLanguageIdAtPosition(C,w)},getLineContent:C=>C===t.startLineNumber?u:e.getLineContent(C)},_=pt(s.getLineContent()),b=$C(o,f,t.startLineNumber+1,void 0,n);if(!b){const C=l?_:g;return{beforeEnter:C,afterEnter:C}}let v=l?_:b.indentation;return b.action===oi.Indent&&(v=i.shiftIndent(v)),h.shouldDecrease(d)&&(v=i.unshiftIndent(v)),{beforeEnter:l?_:g,afterEnter:v}}function lV(o,e,t,i,n,s){if(o<4)return null;const r=Eu(e,t.startLineNumber,t.startColumn);if(r.firstCharOffset)return null;const a=s.getLanguageConfiguration(r.languageId).indentRulesSupport;if(!a)return null;const l=r.getLineContent(),c=l.substr(0,t.startColumn-1-r.firstCharOffset);let d;if(t.isEmpty()?d=l.substr(t.startColumn-1-r.firstCharOffset):d=Eu(e,t.endLineNumber,t.endColumn).getLineContent().substr(t.endColumn-1-r.firstCharOffset),!a.shouldDecrease(c+d)&&a.shouldDecrease(c+i+d)){const h=$C(o,e,t.startLineNumber,!1,s);if(!h)return null;let u=h.indentation;return h.action!==oi.Indent&&(u=n.unshiftIndent(u)),u}return null}function RP(o,e,t){const i=t.getLanguageConfiguration(o.getLanguageId()).indentRulesSupport;return!i||e<1||e>o.getLineCount()?null:i.getIndentMetadata(o.getLineContent(e))}class Ot{static indent(e,t,i){if(t===null||i===null)return[];const n=[];for(let s=0,r=i.length;s<r;s++)n[s]=new Fs(i[s],{isUnshift:!1,tabSize:e.tabSize,indentSize:e.indentSize,insertSpaces:e.insertSpaces,useTabStops:e.useTabStops,autoIndent:e.autoIndent},e.languageConfigurationService);return n}static outdent(e,t,i){const n=[];for(let s=0,r=i.length;s<r;s++)n[s]=new Fs(i[s],{isUnshift:!0,tabSize:e.tabSize,indentSize:e.indentSize,insertSpaces:e.insertSpaces,useTabStops:e.useTabStops,autoIndent:e.autoIndent},e.languageConfigurationService);return n}static shiftIndent(e,t,i){return i=i||1,Fs.shiftIndent(t,t.length+i,e.tabSize,e.indentSize,e.insertSpaces)}static unshiftIndent(e,t,i){return i=i||1,Fs.unshiftIndent(t,t.length+i,e.tabSize,e.indentSize,e.insertSpaces)}static _distributedPaste(e,t,i,n){const s=[];for(let r=0,a=i.length;r<a;r++)s[r]=new Wi(i[r],n[r]);return new En(0,s,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!0})}static _simplePaste(e,t,i,n,s){const r=[];for(let a=0,l=i.length;a<l;a++){const c=i[a],d=c.getPosition();if(s&&!c.isEmpty()&&(s=!1),s&&n.indexOf(`\n`)!==n.length-1&&(s=!1),s){const h=new L(d.lineNumber,1,d.lineNumber,1);r[a]=new Jx(h,n,c,!0)}else r[a]=new Wi(c,n)}return new En(0,r,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!0})}static _distributePasteToCursors(e,t,i,n,s){if(n||t.length===1)return null;if(s&&s.length===t.length)return s;if(e.multiCursorPaste===\"spread\"){i.charCodeAt(i.length-1)===10&&(i=i.substr(0,i.length-1)),i.charCodeAt(i.length-1)===13&&(i=i.substr(0,i.length-1));const r=Ur(i);if(r.length===t.length)return r}return null}static paste(e,t,i,n,s,r){const a=this._distributePasteToCursors(e,i,n,s,r);return a?(i=i.sort(L.compareRangesUsingStarts),this._distributedPaste(e,t,i,a)):this._simplePaste(e,t,i,n,s)}static _goodIndentForLine(e,t,i){let n=null,s=\"\";const r=$C(e.autoIndent,t,i,!1,e.languageConfigurationService);if(r)n=r.action,s=r.indentation;else if(i>1){let a;for(a=i-1;a>=1;a--){const d=t.getLineContent(a);if(Fr(d)>=0)break}if(a<1)return null;const l=t.getLineMaxColumn(a),c=Nu(e.autoIndent,t,new L(a,l,a,l),e.languageConfigurationService);c&&(s=c.indentation+c.appendText)}return n&&(n===oi.Indent&&(s=Ot.shiftIndent(e,s)),n===oi.Outdent&&(s=Ot.unshiftIndent(e,s)),s=e.normalizeIndentation(s)),s||null}static _replaceJumpToNextIndent(e,t,i,n){let s=\"\";const r=i.getStartPosition();if(e.insertSpaces){const a=e.visibleColumnFromColumn(t,r),l=e.indentSize,c=l-a%l;for(let d=0;d<c;d++)s+=\" \"}else s=\"\t\";return new Wi(i,s,n)}static tab(e,t,i){const n=[];for(let s=0,r=i.length;s<r;s++){const a=i[s];if(a.isEmpty()){const l=t.getLineContent(a.startLineNumber);if(/^\\s*$/.test(l)&&t.tokenization.isCheapToTokenize(a.startLineNumber)){let c=this._goodIndentForLine(e,t,a.startLineNumber);c=c||\"\t\";const d=e.normalizeIndentation(c);if(!l.startsWith(d)){n[s]=new Wi(new L(a.startLineNumber,1,a.startLineNumber,l.length+1),d,!0);continue}}n[s]=this._replaceJumpToNextIndent(e,t,a,!0)}else{if(a.startLineNumber===a.endLineNumber){const l=t.getLineMaxColumn(a.startLineNumber);if(a.startColumn!==1||a.endColumn!==l){n[s]=this._replaceJumpToNextIndent(e,t,a,!1);continue}}n[s]=new Fs(a,{isUnshift:!1,tabSize:e.tabSize,indentSize:e.indentSize,insertSpaces:e.insertSpaces,useTabStops:e.useTabStops,autoIndent:e.autoIndent},e.languageConfigurationService)}}return n}static compositionType(e,t,i,n,s,r,a,l){const c=n.map(d=>this._compositionType(i,d,s,r,a,l));return new En(4,c,{shouldPushStackElementBefore:H_(e,4),shouldPushStackElementAfter:!1})}static _compositionType(e,t,i,n,s,r){if(!t.isEmpty())return null;const a=t.getPosition(),l=Math.max(1,a.column-n),c=Math.min(e.getLineMaxColumn(a.lineNumber),a.column+s),d=new L(a.lineNumber,l,a.lineNumber,c);return e.getValueInRange(d)===i&&r===0?null:new e0(d,i,0,r)}static _typeCommand(e,t,i){return i?new F_(e,t,!0):new Wi(e,t,!0)}static _enter(e,t,i,n){if(e.autoIndent===0)return Ot._typeCommand(n,`\n`,i);if(!t.tokenization.isCheapToTokenize(n.getStartPosition().lineNumber)||e.autoIndent===1){const l=t.getLineContent(n.startLineNumber),c=pt(l).substring(0,n.startColumn-1);return Ot._typeCommand(n,`\n`+e.normalizeIndentation(c),i)}const s=Nu(e.autoIndent,t,n,e.languageConfigurationService);if(s){if(s.indentAction===oi.None)return Ot._typeCommand(n,`\n`+e.normalizeIndentation(s.indentation+s.appendText),i);if(s.indentAction===oi.Indent)return Ot._typeCommand(n,`\n`+e.normalizeIndentation(s.indentation+s.appendText),i);if(s.indentAction===oi.IndentOutdent){const l=e.normalizeIndentation(s.indentation),c=e.normalizeIndentation(s.indentation+s.appendText),d=`\n`+c+`\n`+l;return i?new F_(n,d,!0):new e0(n,d,-1,c.length-l.length,!0)}else if(s.indentAction===oi.Outdent){const l=Ot.unshiftIndent(e,s.indentation);return Ot._typeCommand(n,`\n`+e.normalizeIndentation(l+s.appendText),i)}}const r=t.getLineContent(n.startLineNumber),a=pt(r).substring(0,n.startColumn-1);if(e.autoIndent>=4){const l=aV(e.autoIndent,t,n,{unshiftIndent:c=>Ot.unshiftIndent(e,c),shiftIndent:c=>Ot.shiftIndent(e,c),normalizeIndentation:c=>e.normalizeIndentation(c)},e.languageConfigurationService);if(l){let c=e.visibleColumnFromColumn(t,n.getEndPosition());const d=n.endColumn,h=t.getLineContent(n.endLineNumber),u=Sn(h);if(u>=0?n=n.setEndPosition(n.endLineNumber,Math.max(n.endColumn,u+1)):n=n.setEndPosition(n.endLineNumber,t.getLineMaxColumn(n.endLineNumber)),i)return new F_(n,`\n`+e.normalizeIndentation(l.afterEnter),!0);{let g=0;return d<=u+1&&(e.insertSpaces||(c=Math.ceil(c/e.indentSize)),g=Math.min(c+1-e.normalizeIndentation(l.afterEnter).length-1,0)),new e0(n,`\n`+e.normalizeIndentation(l.afterEnter),0,g,!0)}}}return Ot._typeCommand(n,`\n`+e.normalizeIndentation(a),i)}static _isAutoIndentType(e,t,i){if(e.autoIndent<4)return!1;for(let n=0,s=i.length;n<s;n++)if(!t.tokenization.isCheapToTokenize(i[n].getEndPosition().lineNumber))return!1;return!0}static _runAutoIndentType(e,t,i,n){const s=MP(t,i.startLineNumber,i.startColumn),r=lV(e.autoIndent,t,i,n,{shiftIndent:a=>Ot.shiftIndent(e,a),unshiftIndent:a=>Ot.unshiftIndent(e,a)},e.languageConfigurationService);if(r===null)return null;if(r!==e.normalizeIndentation(s)){const a=t.getLineFirstNonWhitespaceColumn(i.startLineNumber);return a===0?Ot._typeCommand(new L(i.startLineNumber,1,i.endLineNumber,i.endColumn),e.normalizeIndentation(r)+n,!1):Ot._typeCommand(new L(i.startLineNumber,1,i.endLineNumber,i.endColumn),e.normalizeIndentation(r)+t.getLineContent(i.startLineNumber).substring(a-1,i.startColumn-1)+n,!1)}return null}static _isAutoClosingOvertype(e,t,i,n,s){if(e.autoClosingOvertype===\"never\"||!e.autoClosingPairs.autoClosingPairsCloseSingleChar.has(s))return!1;for(let r=0,a=i.length;r<a;r++){const l=i[r];if(!l.isEmpty())return!1;const c=l.getPosition(),d=t.getLineContent(c.lineNumber);if(d.charAt(c.column-1)!==s)return!1;const u=wl(s);if((c.column>2?d.charCodeAt(c.column-2):0)===92&&u)return!1;if(e.autoClosingOvertype===\"auto\"){let f=!1;for(let _=0,b=n.length;_<b;_++){const v=n[_];if(c.lineNumber===v.startLineNumber&&c.column===v.startColumn){f=!0;break}}if(!f)return!1}}return!0}static _runAutoClosingOvertype(e,t,i,n,s){const r=[];for(let a=0,l=n.length;a<l;a++){const d=n[a].getPosition(),h=new L(d.lineNumber,d.column,d.lineNumber,d.column+1);r[a]=new Wi(h,s)}return new En(4,r,{shouldPushStackElementBefore:H_(e,4),shouldPushStackElementAfter:!1})}static _isBeforeClosingBrace(e,t){const i=t.charAt(0),n=e.autoClosingPairs.autoClosingPairsOpenByStart.get(i)||[],s=e.autoClosingPairs.autoClosingPairsCloseByStart.get(i)||[],r=n.some(l=>t.startsWith(l.open)),a=s.some(l=>t.startsWith(l.close));return!r&&a}static _findAutoClosingPairOpen(e,t,i,n){const s=e.autoClosingPairs.autoClosingPairsOpenByEnd.get(n);if(!s)return null;let r=null;for(const a of s)if(r===null||a.open.length>r.open.length){let l=!0;for(const c of i)if(t.getValueInRange(new L(c.lineNumber,c.column-a.open.length+1,c.lineNumber,c.column))+n!==a.open){l=!1;break}l&&(r=a)}return r}static _findContainedAutoClosingPair(e,t){if(t.open.length<=1)return null;const i=t.close.charAt(t.close.length-1),n=e.autoClosingPairs.autoClosingPairsCloseByEnd.get(i)||[];let s=null;for(const r of n)r.open!==t.open&&t.open.includes(r.open)&&t.close.endsWith(r.close)&&(!s||r.open.length>s.open.length)&&(s=r);return s}static _getAutoClosingPairClose(e,t,i,n,s){const r=wl(n),a=r?e.autoClosingQuotes:e.autoClosingBrackets,l=r?e.shouldAutoCloseBefore.quote:e.shouldAutoCloseBefore.bracket;if(a===\"never\")return null;for(const f of i)if(!f.isEmpty())return null;const c=i.map(f=>{const _=f.getPosition();return s?{lineNumber:_.lineNumber,beforeColumn:_.column-n.length,afterColumn:_.column}:{lineNumber:_.lineNumber,beforeColumn:_.column,afterColumn:_.column}}),d=this._findAutoClosingPairOpen(e,t,c.map(f=>new B(f.lineNumber,f.beforeColumn)),n);if(!d)return null;const h=this._findContainedAutoClosingPair(e,d),u=h?h.close:\"\";let g=!0;for(const f of c){const{lineNumber:_,beforeColumn:b,afterColumn:v}=f,C=t.getLineContent(_),w=C.substring(0,b-1),S=C.substring(v-1);if(S.startsWith(u)||(g=!1),S.length>0){const D=S.charAt(0);if(!Ot._isBeforeClosingBrace(e,S)&&!l(D))return null}if(d.open.length===1&&(n===\"'\"||n==='\"')&&a!==\"always\"){const D=Zs(e.wordSeparators);if(w.length>0){const I=w.charCodeAt(w.length-1);if(D.get(I)===0)return null}}if(!t.tokenization.isCheapToTokenize(_))return null;t.tokenization.forceTokenization(_);const k=t.tokenization.getLineTokens(_),x=OC(k,b-1);if(!d.shouldAutoClose(x,b-x.firstCharOffset))return null;const y=d.findNeutralCharacter();if(y){const D=t.tokenization.getTokenTypeIfInsertingCharacter(_,b,y);if(!d.isOK(D))return null}}return g?d.close.substring(0,d.close.length-u.length):d.close}static _runAutoClosingOpenCharType(e,t,i,n,s,r,a){const l=[];for(let c=0,d=n.length;c<d;c++){const h=n[c];l[c]=new OP(h,s,!r,a)}return new En(4,l,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!1})}static _shouldSurroundChar(e,t){return wl(t)?e.autoSurround===\"quotes\"||e.autoSurround===\"languageDefined\":e.autoSurround===\"brackets\"||e.autoSurround===\"languageDefined\"}static _isSurroundSelectionType(e,t,i,n){if(!Ot._shouldSurroundChar(e,n)||!e.surroundingPairs.hasOwnProperty(n))return!1;const s=wl(n);for(const r of i){if(r.isEmpty())return!1;let a=!0;for(let l=r.startLineNumber;l<=r.endLineNumber;l++){const c=t.getLineContent(l),d=l===r.startLineNumber?r.startColumn-1:0,h=l===r.endLineNumber?r.endColumn-1:c.length,u=c.substring(d,h);if(/[^ \\t]/.test(u)){a=!1;break}}if(a)return!1;if(s&&r.startLineNumber===r.endLineNumber&&r.startColumn+1===r.endColumn){const l=t.getValueInRange(r);if(wl(l))return!1}}return!0}static _runSurroundSelectionType(e,t,i,n,s){const r=[];for(let a=0,l=n.length;a<l;a++){const c=n[a],d=t.surroundingPairs[s];r[a]=new sV(c,s,d)}return new En(0,r,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!0})}static _isTypeInterceptorElectricChar(e,t,i){return!!(i.length===1&&t.tokenization.isCheapToTokenize(i[0].getEndPosition().lineNumber))}static _typeInterceptorElectricChar(e,t,i,n,s){if(!t.electricChars.hasOwnProperty(s)||!n.isEmpty())return null;const r=n.getPosition();i.tokenization.forceTokenization(r.lineNumber);const a=i.tokenization.getLineTokens(r.lineNumber);let l;try{l=t.onElectricCharacter(s,a,r.column)}catch(c){return Ee(c),null}if(!l)return null;if(l.matchOpenBracket){const c=(a.getLineContent()+s).lastIndexOf(l.matchOpenBracket)+1,d=i.bracketPairs.findMatchingBracketUp(l.matchOpenBracket,{lineNumber:r.lineNumber,column:c},500);if(d){if(d.startLineNumber===r.lineNumber)return null;const h=i.getLineContent(d.startLineNumber),u=pt(h),g=t.normalizeIndentation(u),f=i.getLineContent(r.lineNumber),_=i.getLineFirstNonWhitespaceColumn(r.lineNumber)||r.column,b=f.substring(_-1,r.column-1),v=g+b+s,C=new L(r.lineNumber,1,r.lineNumber,r.column),w=new Wi(C,v);return new En(Mw(v,e),[w],{shouldPushStackElementBefore:!1,shouldPushStackElementAfter:!0})}}return null}static compositionEndWithInterceptors(e,t,i,n,s,r){if(!n)return null;let a=null;for(const h of n)if(a===null)a=h.insertedText;else if(a!==h.insertedText)return null;if(!a||a.length!==1)return null;const l=a;let c=!1;for(const h of n)if(h.deletedText.length!==0){c=!0;break}if(c){if(!Ot._shouldSurroundChar(t,l)||!t.surroundingPairs.hasOwnProperty(l))return null;const h=wl(l);for(const f of n)if(f.deletedSelectionStart!==0||f.deletedSelectionEnd!==f.deletedText.length||/^[ \\t]+$/.test(f.deletedText)||h&&wl(f.deletedText))return null;const u=[];for(const f of s){if(!f.isEmpty())return null;u.push(f.getPosition())}if(u.length!==n.length)return null;const g=[];for(let f=0,_=u.length;f<_;f++)g.push(new oV(u[f],n[f].deletedText,l));return new En(4,g,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!1})}if(this._isAutoClosingOvertype(t,i,s,r,l)){const h=s.map(u=>new Wi(new L(u.positionLineNumber,u.positionColumn,u.positionLineNumber,u.positionColumn+1),\"\",!1));return new En(4,h,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!1})}const d=this._getAutoClosingPairClose(t,i,s,l,!0);return d!==null?this._runAutoClosingOpenCharType(e,t,i,s,l,!0,d):null}static typeWithInterceptors(e,t,i,n,s,r,a){if(!e&&a===`\n`){const d=[];for(let h=0,u=s.length;h<u;h++)d[h]=Ot._enter(i,n,!1,s[h]);return new En(4,d,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!1})}if(!e&&this._isAutoIndentType(i,n,s)){const d=[];let h=!1;for(let u=0,g=s.length;u<g;u++)if(d[u]=this._runAutoIndentType(i,n,s[u],a),!d[u]){h=!0;break}if(!h)return new En(4,d,{shouldPushStackElementBefore:!0,shouldPushStackElementAfter:!1})}if(this._isAutoClosingOvertype(i,n,s,r,a))return this._runAutoClosingOvertype(t,i,n,s,a);if(!e){const d=this._getAutoClosingPairClose(i,n,s,a,!1);if(d)return this._runAutoClosingOpenCharType(t,i,n,s,a,!1,d)}if(!e&&this._isSurroundSelectionType(i,n,s,a))return this._runSurroundSelectionType(t,i,n,s,a);if(!e&&this._isTypeInterceptorElectricChar(i,n,s)){const d=this._typeInterceptorElectricChar(t,i,n,s[0],a);if(d)return d}const l=[];for(let d=0,h=s.length;d<h;d++)l[d]=new Wi(s[d],a);const c=Mw(a,t);return new En(c,l,{shouldPushStackElementBefore:H_(t,c),shouldPushStackElementAfter:!1})}static typeWithoutInterceptors(e,t,i,n,s){const r=[];for(let l=0,c=n.length;l<c;l++)r[l]=new Wi(n[l],s);const a=Mw(s,e);return new En(a,r,{shouldPushStackElementBefore:H_(e,a),shouldPushStackElementAfter:!1})}static lineInsertBefore(e,t,i){if(t===null||i===null)return[];const n=[];for(let s=0,r=i.length;s<r;s++){let a=i[s].positionLineNumber;if(a===1)n[s]=new F_(new L(1,1,1,1),`\n`);else{a--;const l=t.getLineMaxColumn(a);n[s]=this._enter(e,t,!1,new L(a,l,a,l))}}return n}static lineInsertAfter(e,t,i){if(t===null||i===null)return[];const n=[];for(let s=0,r=i.length;s<r;s++){const a=i[s].positionLineNumber,l=t.getLineMaxColumn(a);n[s]=this._enter(e,t,!1,new L(a,l,a,l))}return n}static lineBreakInsert(e,t,i){const n=[];for(let s=0,r=i.length;s<r;s++)n[s]=this._enter(e,t,!0,i[s]);return n}}class OP extends e0{constructor(e,t,i,n){super(e,(i?t:\"\")+n,0,-n.length),this._openCharacter=t,this._closeCharacter=n,this.closeCharacterRange=null,this.enclosingRange=null}computeCursorState(e,t){const n=t.getInverseEditOperations()[0].range;return this.closeCharacterRange=new L(n.startLineNumber,n.endColumn-this._closeCharacter.length,n.endLineNumber,n.endColumn),this.enclosingRange=new L(n.startLineNumber,n.endColumn-this._openCharacter.length-this._closeCharacter.length,n.endLineNumber,n.endColumn),super.computeCursorState(e,t)}}class cV{constructor(e,t,i,n,s,r){this.deletedText=e,this.deletedSelectionStart=t,this.deletedSelectionEnd=i,this.insertedText=n,this.insertedSelectionStart=s,this.insertedSelectionEnd=r}}function Mw(o,e){return o===\" \"?e===5||e===6?6:5:4}function H_(o,e){return OT(o)&&!OT(e)?!0:o===5?!1:RT(o)!==RT(e)}function RT(o){return o===6||o===5?\"space\":o}function OT(o){return o===4||o===5||o===6}var T;(function(o){o.editorSimpleInput=new ce(\"editorSimpleInput\",!1,!0),o.editorTextFocus=new ce(\"editorTextFocus\",!1,p(\"editorTextFocus\",\"Whether the editor text has focus (cursor is blinking)\")),o.focus=new ce(\"editorFocus\",!1,p(\"editorFocus\",\"Whether the editor or an editor widget has focus (e.g. focus is in the find widget)\")),o.textInputFocus=new ce(\"textInputFocus\",!1,p(\"textInputFocus\",\"Whether an editor or a rich text input has focus (cursor is blinking)\")),o.readOnly=new ce(\"editorReadonly\",!1,p(\"editorReadonly\",\"Whether the editor is read only\")),o.inDiffEditor=new ce(\"inDiffEditor\",!1,p(\"inDiffEditor\",\"Whether the context is a diff editor\")),o.columnSelection=new ce(\"editorColumnSelection\",!1,p(\"editorColumnSelection\",\"Whether `editor.columnSelection` is enabled\")),o.writable=o.readOnly.toNegated(),o.hasNonEmptySelection=new ce(\"editorHasSelection\",!1,p(\"editorHasSelection\",\"Whether the editor has text selected\")),o.hasOnlyEmptySelection=o.hasNonEmptySelection.toNegated(),o.hasMultipleSelections=new ce(\"editorHasMultipleSelections\",!1,p(\"editorHasMultipleSelections\",\"Whether the editor has multiple selections\")),o.hasSingleSelection=o.hasMultipleSelections.toNegated(),o.tabMovesFocus=new ce(\"editorTabMovesFocus\",!1,p(\"editorTabMovesFocus\",\"Whether `Tab` will move focus out of the editor\")),o.tabDoesNotMoveFocus=o.tabMovesFocus.toNegated(),o.isInWalkThroughSnippet=new ce(\"isInEmbeddedEditor\",!1,!0),o.canUndo=new ce(\"canUndo\",!1,!0),o.canRedo=new ce(\"canRedo\",!1,!0),o.hoverVisible=new ce(\"editorHoverVisible\",!1,p(\"editorHoverVisible\",\"Whether the editor hover is visible\")),o.inCompositeEditor=new ce(\"inCompositeEditor\",void 0,p(\"inCompositeEditor\",\"Whether the editor is part of a larger editor (e.g. notebooks)\")),o.notInCompositeEditor=o.inCompositeEditor.toNegated(),o.languageId=new ce(\"editorLangId\",\"\",p(\"editorLangId\",\"The language identifier of the editor\")),o.hasCompletionItemProvider=new ce(\"editorHasCompletionItemProvider\",!1,p(\"editorHasCompletionItemProvider\",\"Whether the editor has a completion item provider\")),o.hasCodeActionsProvider=new ce(\"editorHasCodeActionsProvider\",!1,p(\"editorHasCodeActionsProvider\",\"Whether the editor has a code actions provider\")),o.hasCodeLensProvider=new ce(\"editorHasCodeLensProvider\",!1,p(\"editorHasCodeLensProvider\",\"Whether the editor has a code lens provider\")),o.hasDefinitionProvider=new ce(\"editorHasDefinitionProvider\",!1,p(\"editorHasDefinitionProvider\",\"Whether the editor has a definition provider\")),o.hasDeclarationProvider=new ce(\"editorHasDeclarationProvider\",!1,p(\"editorHasDeclarationProvider\",\"Whether the editor has a declaration provider\")),o.hasImplementationProvider=new ce(\"editorHasImplementationProvider\",!1,p(\"editorHasImplementationProvider\",\"Whether the editor has an implementation provider\")),o.hasTypeDefinitionProvider=new ce(\"editorHasTypeDefinitionProvider\",!1,p(\"editorHasTypeDefinitionProvider\",\"Whether the editor has a type definition provider\")),o.hasHoverProvider=new ce(\"editorHasHoverProvider\",!1,p(\"editorHasHoverProvider\",\"Whether the editor has a hover provider\")),o.hasDocumentHighlightProvider=new ce(\"editorHasDocumentHighlightProvider\",!1,p(\"editorHasDocumentHighlightProvider\",\"Whether the editor has a document highlight provider\")),o.hasDocumentSymbolProvider=new ce(\"editorHasDocumentSymbolProvider\",!1,p(\"editorHasDocumentSymbolProvider\",\"Whether the editor has a document symbol provider\")),o.hasReferenceProvider=new ce(\"editorHasReferenceProvider\",!1,p(\"editorHasReferenceProvider\",\"Whether the editor has a reference provider\")),o.hasRenameProvider=new ce(\"editorHasRenameProvider\",!1,p(\"editorHasRenameProvider\",\"Whether the editor has a rename provider\")),o.hasSignatureHelpProvider=new ce(\"editorHasSignatureHelpProvider\",!1,p(\"editorHasSignatureHelpProvider\",\"Whether the editor has a signature help provider\")),o.hasInlayHintsProvider=new ce(\"editorHasInlayHintsProvider\",!1,p(\"editorHasInlayHintsProvider\",\"Whether the editor has an inline hints provider\")),o.hasDocumentFormattingProvider=new ce(\"editorHasDocumentFormattingProvider\",!1,p(\"editorHasDocumentFormattingProvider\",\"Whether the editor has a document formatting provider\")),o.hasDocumentSelectionFormattingProvider=new ce(\"editorHasDocumentSelectionFormattingProvider\",!1,p(\"editorHasDocumentSelectionFormattingProvider\",\"Whether the editor has a document selection formatting provider\")),o.hasMultipleDocumentFormattingProvider=new ce(\"editorHasMultipleDocumentFormattingProvider\",!1,p(\"editorHasMultipleDocumentFormattingProvider\",\"Whether the editor has multiple document formatting providers\")),o.hasMultipleDocumentSelectionFormattingProvider=new ce(\"editorHasMultipleDocumentSelectionFormattingProvider\",!1,p(\"editorHasMultipleDocumentSelectionFormattingProvider\",\"Whether the editor has multiple document selection formatting providers\"))})(T||(T={}));const it=0;class Yt extends ji{runEditorCommand(e,t,i){const n=t._getViewModel();!n||this.runCoreEditorCommand(n,i||{})}}var q0;(function(o){const e=function(i){if(!Fn(i))return!1;const n=i;return!(!ts(n.to)||!Qn(n.by)&&!ts(n.by)||!Qn(n.value)&&!sc(n.value)||!Qn(n.revealCursor)&&!CO(n.revealCursor))};o.description={description:\"Scroll editor in the given direction\",args:[{name:\"Editor scroll argument object\",description:\"Property-value pairs that can be passed through this argument:\\n\t\t\t\t\t* 'to': A mandatory direction value.\\n\t\t\t\t\t\t```\\n\t\t\t\t\t\t'up', 'down'\\n\t\t\t\t\t\t```\\n\t\t\t\t\t* 'by': Unit to move. Default is computed based on 'to' value.\\n\t\t\t\t\t\t```\\n\t\t\t\t\t\t'line', 'wrappedLine', 'page', 'halfPage', 'editor'\\n\t\t\t\t\t\t```\\n\t\t\t\t\t* 'value': Number of units to move. Default is '1'.\\n\t\t\t\t\t* 'revealCursor': If 'true' reveals the cursor if it is outside view port.\\n\t\t\t\t\",constraint:e,schema:{type:\"object\",required:[\"to\"],properties:{to:{type:\"string\",enum:[\"up\",\"down\"]},by:{type:\"string\",enum:[\"line\",\"wrappedLine\",\"page\",\"halfPage\",\"editor\"]},value:{type:\"number\",default:1},revealCursor:{type:\"boolean\"}}}}]},o.RawDirection={Up:\"up\",Down:\"down\"},o.RawUnit={Line:\"line\",WrappedLine:\"wrappedLine\",Page:\"page\",HalfPage:\"halfPage\",Editor:\"editor\"};function t(i){let n;switch(i.to){case o.RawDirection.Up:n=1;break;case o.RawDirection.Down:n=2;break;default:return null}let s;switch(i.by){case o.RawUnit.Line:s=1;break;case o.RawUnit.WrappedLine:s=2;break;case o.RawUnit.Page:s=3;break;case o.RawUnit.HalfPage:s=4;break;case o.RawUnit.Editor:s=5;break;default:s=2}const r=Math.floor(i.value||1),a=!!i.revealCursor;return{direction:n,unit:s,value:r,revealCursor:a,select:!!i.select}}o.parse=t})(q0||(q0={}));var lu;(function(o){const e=function(t){if(!Fn(t))return!1;const i=t;return!(!sc(i.lineNumber)&&!ts(i.lineNumber)||!Qn(i.at)&&!ts(i.at))};o.description={description:\"Reveal the given line at the given logical position\",args:[{name:\"Reveal line argument object\",description:\"Property-value pairs that can be passed through this argument:\\n\t\t\t\t\t* 'lineNumber': A mandatory line number value.\\n\t\t\t\t\t* 'at': Logical position at which line has to be revealed.\\n\t\t\t\t\t\t```\\n\t\t\t\t\t\t'top', 'center', 'bottom'\\n\t\t\t\t\t\t```\\n\t\t\t\t\",constraint:e,schema:{type:\"object\",required:[\"lineNumber\"],properties:{lineNumber:{type:[\"number\",\"string\"]},at:{type:\"string\",enum:[\"top\",\"center\",\"bottom\"]}}}}]},o.RawAtArgument={Top:\"top\",Center:\"center\",Bottom:\"bottom\"}})(lu||(lu={}));class Ry{constructor(e){e.addImplementation(1e4,\"code-editor\",(t,i)=>{const n=t.get(dt).getFocusedCodeEditor();return n&&n.hasTextFocus()?this._runEditorCommand(t,n,i):!1}),e.addImplementation(1e3,\"generic-dom-input-textarea\",(t,i)=>{const n=document.activeElement;return n&&[\"input\",\"textarea\"].indexOf(n.tagName.toLowerCase())>=0?(this.runDOMCommand(),!0):!1}),e.addImplementation(0,\"generic-dom\",(t,i)=>{const n=t.get(dt).getActiveCodeEditor();return n?(n.focus(),this._runEditorCommand(t,n,i)):!1})}_runEditorCommand(e,t,i){const n=this.runEditorCommand(e,t,i);return n||!0}}var yi;(function(o){class e extends Yt{constructor(C){super(C),this._minimalReveal=C.minimalReveal,this._inSelectionMode=C.inSelectionMode}runCoreEditorCommand(C,w){C.model.pushStackElement(),C.setCursorStates(w.source,3,[Pi.moveTo(C,C.getPrimaryCursorState(),this._inSelectionMode,w.position,w.viewPosition)])&&C.revealPrimaryCursor(w.source,!0,this._minimalReveal)}}o.MoveTo=Q(new e({id:\"_moveTo\",minimalReveal:!0,inSelectionMode:!1,precondition:void 0})),o.MoveToSelect=Q(new e({id:\"_moveToSelect\",minimalReveal:!1,inSelectionMode:!0,precondition:void 0}));class t extends Yt{runCoreEditorCommand(C,w){C.model.pushStackElement();const S=this._getColumnSelectResult(C,C.getPrimaryCursorState(),C.getCursorColumnSelectData(),w);C.setCursorStates(w.source,3,S.viewStates.map(k=>He.fromViewState(k))),C.setCursorColumnSelectData({isReal:!0,fromViewLineNumber:S.fromLineNumber,fromViewVisualColumn:S.fromVisualColumn,toViewLineNumber:S.toLineNumber,toViewVisualColumn:S.toVisualColumn}),S.reversed?C.revealTopMostCursor(w.source):C.revealBottomMostCursor(w.source)}}o.ColumnSelect=Q(new class extends t{constructor(){super({id:\"columnSelect\",precondition:void 0})}_getColumnSelectResult(v,C,w,S){const k=v.model.validatePosition(S.position),x=v.coordinatesConverter.validateViewPosition(new B(S.viewPosition.lineNumber,S.viewPosition.column),k),y=S.doColumnSelect?w.fromViewLineNumber:x.lineNumber,D=S.doColumnSelect?w.fromViewVisualColumn:S.mouseColumn-1;return Yc.columnSelect(v.cursorConfig,v,y,D,x.lineNumber,S.mouseColumn-1)}}),o.CursorColumnSelectLeft=Q(new class extends t{constructor(){super({id:\"cursorColumnSelectLeft\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:3599,linux:{primary:0}}})}_getColumnSelectResult(v,C,w,S){return Yc.columnSelectLeft(v.cursorConfig,v,w)}}),o.CursorColumnSelectRight=Q(new class extends t{constructor(){super({id:\"cursorColumnSelectRight\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:3601,linux:{primary:0}}})}_getColumnSelectResult(v,C,w,S){return Yc.columnSelectRight(v.cursorConfig,v,w)}});class i extends t{constructor(C){super(C),this._isPaged=C.isPaged}_getColumnSelectResult(C,w,S,k){return Yc.columnSelectUp(C.cursorConfig,C,S,this._isPaged)}}o.CursorColumnSelectUp=Q(new i({isPaged:!1,id:\"cursorColumnSelectUp\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:3600,linux:{primary:0}}})),o.CursorColumnSelectPageUp=Q(new i({isPaged:!0,id:\"cursorColumnSelectPageUp\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:3595,linux:{primary:0}}}));class n extends t{constructor(C){super(C),this._isPaged=C.isPaged}_getColumnSelectResult(C,w,S,k){return Yc.columnSelectDown(C.cursorConfig,C,S,this._isPaged)}}o.CursorColumnSelectDown=Q(new n({isPaged:!1,id:\"cursorColumnSelectDown\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:3602,linux:{primary:0}}})),o.CursorColumnSelectPageDown=Q(new n({isPaged:!0,id:\"cursorColumnSelectPageDown\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:3596,linux:{primary:0}}}));class s extends Yt{constructor(){super({id:\"cursorMove\",precondition:void 0,description:j0.description})}runCoreEditorCommand(C,w){const S=j0.parse(w);!S||this._runCursorMove(C,w.source,S)}_runCursorMove(C,w,S){C.model.pushStackElement(),C.setCursorStates(w,3,s._move(C,C.getCursorStates(),S)),C.revealPrimaryCursor(w,!0)}static _move(C,w,S){const k=S.select,x=S.value;switch(S.direction){case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:case 8:case 9:case 10:return Pi.simpleMove(C,w,S.direction,k,x,S.unit);case 11:case 13:case 12:case 14:return Pi.viewportMove(C,w,S.direction,k,x);default:return null}}}o.CursorMoveImpl=s,o.CursorMove=Q(new s);class r extends Yt{constructor(C){super(C),this._staticArgs=C.args}runCoreEditorCommand(C,w){let S=this._staticArgs;this._staticArgs.value===-1&&(S={direction:this._staticArgs.direction,unit:this._staticArgs.unit,select:this._staticArgs.select,value:w.pageSize||C.cursorConfig.pageSize}),C.model.pushStackElement(),C.setCursorStates(w.source,3,Pi.simpleMove(C,C.getCursorStates(),S.direction,S.select,S.value,S.unit)),C.revealPrimaryCursor(w.source,!0)}}o.CursorLeft=Q(new r({args:{direction:0,unit:0,select:!1,value:1},id:\"cursorLeft\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:15,mac:{primary:15,secondary:[288]}}})),o.CursorLeftSelect=Q(new r({args:{direction:0,unit:0,select:!0,value:1},id:\"cursorLeftSelect\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:1039}})),o.CursorRight=Q(new r({args:{direction:1,unit:0,select:!1,value:1},id:\"cursorRight\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:17,mac:{primary:17,secondary:[292]}}})),o.CursorRightSelect=Q(new r({args:{direction:1,unit:0,select:!0,value:1},id:\"cursorRightSelect\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:1041}})),o.CursorUp=Q(new r({args:{direction:2,unit:2,select:!1,value:1},id:\"cursorUp\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:16,mac:{primary:16,secondary:[302]}}})),o.CursorUpSelect=Q(new r({args:{direction:2,unit:2,select:!0,value:1},id:\"cursorUpSelect\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:1040,secondary:[3088],mac:{primary:1040},linux:{primary:1040}}})),o.CursorPageUp=Q(new r({args:{direction:2,unit:2,select:!1,value:-1},id:\"cursorPageUp\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:11}})),o.CursorPageUpSelect=Q(new r({args:{direction:2,unit:2,select:!0,value:-1},id:\"cursorPageUpSelect\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:1035}})),o.CursorDown=Q(new r({args:{direction:3,unit:2,select:!1,value:1},id:\"cursorDown\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:18,mac:{primary:18,secondary:[300]}}})),o.CursorDownSelect=Q(new r({args:{direction:3,unit:2,select:!0,value:1},id:\"cursorDownSelect\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:1042,secondary:[3090],mac:{primary:1042},linux:{primary:1042}}})),o.CursorPageDown=Q(new r({args:{direction:3,unit:2,select:!1,value:-1},id:\"cursorPageDown\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:12}})),o.CursorPageDownSelect=Q(new r({args:{direction:3,unit:2,select:!0,value:-1},id:\"cursorPageDownSelect\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:1036}})),o.CreateCursor=Q(new class extends Yt{constructor(){super({id:\"createCursor\",precondition:void 0})}runCoreEditorCommand(v,C){let w;C.wholeLine?w=Pi.line(v,v.getPrimaryCursorState(),!1,C.position,C.viewPosition):w=Pi.moveTo(v,v.getPrimaryCursorState(),!1,C.position,C.viewPosition);const S=v.getCursorStates();if(S.length>1){const k=w.modelState?w.modelState.position:null,x=w.viewState?w.viewState.position:null;for(let y=0,D=S.length;y<D;y++){const I=S[y];if(!(k&&!I.modelState.selection.containsPosition(k))&&!(x&&!I.viewState.selection.containsPosition(x))){S.splice(y,1),v.model.pushStackElement(),v.setCursorStates(C.source,3,S);return}}}S.push(w),v.model.pushStackElement(),v.setCursorStates(C.source,3,S)}}),o.LastCursorMoveToSelect=Q(new class extends Yt{constructor(){super({id:\"_lastCursorMoveToSelect\",precondition:void 0})}runCoreEditorCommand(v,C){const w=v.getLastAddedCursorIndex(),S=v.getCursorStates(),k=S.slice(0);k[w]=Pi.moveTo(v,S[w],!0,C.position,C.viewPosition),v.model.pushStackElement(),v.setCursorStates(C.source,3,k)}});class a extends Yt{constructor(C){super(C),this._inSelectionMode=C.inSelectionMode}runCoreEditorCommand(C,w){C.model.pushStackElement(),C.setCursorStates(w.source,3,Pi.moveToBeginningOfLine(C,C.getCursorStates(),this._inSelectionMode)),C.revealPrimaryCursor(w.source,!0)}}o.CursorHome=Q(new a({inSelectionMode:!1,id:\"cursorHome\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:14,mac:{primary:14,secondary:[2063]}}})),o.CursorHomeSelect=Q(new a({inSelectionMode:!0,id:\"cursorHomeSelect\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:1038,mac:{primary:1038,secondary:[3087]}}}));class l extends Yt{constructor(C){super(C),this._inSelectionMode=C.inSelectionMode}runCoreEditorCommand(C,w){C.model.pushStackElement(),C.setCursorStates(w.source,3,this._exec(C.getCursorStates())),C.revealPrimaryCursor(w.source,!0)}_exec(C){const w=[];for(let S=0,k=C.length;S<k;S++){const x=C[S],y=x.modelState.position.lineNumber;w[S]=He.fromModelState(x.modelState.move(this._inSelectionMode,y,1,0))}return w}}o.CursorLineStart=Q(new l({inSelectionMode:!1,id:\"cursorLineStart\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:0,mac:{primary:287}}})),o.CursorLineStartSelect=Q(new l({inSelectionMode:!0,id:\"cursorLineStartSelect\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:0,mac:{primary:1311}}}));class c extends Yt{constructor(C){super(C),this._inSelectionMode=C.inSelectionMode}runCoreEditorCommand(C,w){C.model.pushStackElement(),C.setCursorStates(w.source,3,Pi.moveToEndOfLine(C,C.getCursorStates(),this._inSelectionMode,w.sticky||!1)),C.revealPrimaryCursor(w.source,!0)}}o.CursorEnd=Q(new c({inSelectionMode:!1,id:\"cursorEnd\",precondition:void 0,kbOpts:{args:{sticky:!1},weight:it,kbExpr:T.textInputFocus,primary:13,mac:{primary:13,secondary:[2065]}},description:{description:\"Go to End\",args:[{name:\"args\",schema:{type:\"object\",properties:{sticky:{description:p(\"stickydesc\",\"Stick to the end even when going to longer lines\"),type:\"boolean\",default:!1}}}}]}})),o.CursorEndSelect=Q(new c({inSelectionMode:!0,id:\"cursorEndSelect\",precondition:void 0,kbOpts:{args:{sticky:!1},weight:it,kbExpr:T.textInputFocus,primary:1037,mac:{primary:1037,secondary:[3089]}},description:{description:\"Select to End\",args:[{name:\"args\",schema:{type:\"object\",properties:{sticky:{description:p(\"stickydesc\",\"Stick to the end even when going to longer lines\"),type:\"boolean\",default:!1}}}}]}}));class d extends Yt{constructor(C){super(C),this._inSelectionMode=C.inSelectionMode}runCoreEditorCommand(C,w){C.model.pushStackElement(),C.setCursorStates(w.source,3,this._exec(C,C.getCursorStates())),C.revealPrimaryCursor(w.source,!0)}_exec(C,w){const S=[];for(let k=0,x=w.length;k<x;k++){const y=w[k],D=y.modelState.position.lineNumber,I=C.model.getLineMaxColumn(D);S[k]=He.fromModelState(y.modelState.move(this._inSelectionMode,D,I,0))}return S}}o.CursorLineEnd=Q(new d({inSelectionMode:!1,id:\"cursorLineEnd\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:0,mac:{primary:291}}})),o.CursorLineEndSelect=Q(new d({inSelectionMode:!0,id:\"cursorLineEndSelect\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:0,mac:{primary:1315}}}));class h extends Yt{constructor(C){super(C),this._inSelectionMode=C.inSelectionMode}runCoreEditorCommand(C,w){C.model.pushStackElement(),C.setCursorStates(w.source,3,Pi.moveToBeginningOfBuffer(C,C.getCursorStates(),this._inSelectionMode)),C.revealPrimaryCursor(w.source,!0)}}o.CursorTop=Q(new h({inSelectionMode:!1,id:\"cursorTop\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:2062,mac:{primary:2064}}})),o.CursorTopSelect=Q(new h({inSelectionMode:!0,id:\"cursorTopSelect\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:3086,mac:{primary:3088}}}));class u extends Yt{constructor(C){super(C),this._inSelectionMode=C.inSelectionMode}runCoreEditorCommand(C,w){C.model.pushStackElement(),C.setCursorStates(w.source,3,Pi.moveToEndOfBuffer(C,C.getCursorStates(),this._inSelectionMode)),C.revealPrimaryCursor(w.source,!0)}}o.CursorBottom=Q(new u({inSelectionMode:!1,id:\"cursorBottom\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:2061,mac:{primary:2066}}})),o.CursorBottomSelect=Q(new u({inSelectionMode:!0,id:\"cursorBottomSelect\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:3085,mac:{primary:3090}}}));class g extends Yt{constructor(){super({id:\"editorScroll\",precondition:void 0,description:q0.description})}runCoreEditorCommand(C,w){const S=q0.parse(w);!S||this._runEditorScroll(C,w.source,S)}_runEditorScroll(C,w,S){const k=this._computeDesiredScrollTop(C,S);if(S.revealCursor){const x=C.getCompletelyVisibleViewRangeAtScrollTop(k);C.setCursorStates(w,3,[Pi.findPositionInViewportIfOutside(C,C.getPrimaryCursorState(),x,S.select)])}C.viewLayout.setScrollPosition({scrollTop:k},0)}_computeDesiredScrollTop(C,w){if(w.unit===1){const x=C.getCompletelyVisibleViewRange(),y=C.coordinatesConverter.convertViewRangeToModelRange(x);let D;w.direction===1?D=Math.max(1,y.startLineNumber-w.value):D=Math.min(C.model.getLineCount(),y.startLineNumber+w.value);const I=C.coordinatesConverter.convertModelPositionToViewPosition(new B(D,1));return C.viewLayout.getVerticalOffsetForLineNumber(I.lineNumber)}if(w.unit===5){let x=0;return w.direction===2&&(x=C.model.getLineCount()-C.cursorConfig.pageSize),C.viewLayout.getVerticalOffsetForLineNumber(x)}let S;w.unit===3?S=C.cursorConfig.pageSize*w.value:w.unit===4?S=Math.round(C.cursorConfig.pageSize/2)*w.value:S=w.value;const k=(w.direction===1?-1:1)*S;return C.viewLayout.getCurrentScrollTop()+k*C.cursorConfig.lineHeight}}o.EditorScrollImpl=g,o.EditorScroll=Q(new g),o.ScrollLineUp=Q(new class extends Yt{constructor(){super({id:\"scrollLineUp\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:2064,mac:{primary:267}}})}runCoreEditorCommand(v,C){o.EditorScroll._runEditorScroll(v,C.source,{direction:1,unit:2,value:1,revealCursor:!1,select:!1})}}),o.ScrollPageUp=Q(new class extends Yt{constructor(){super({id:\"scrollPageUp\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:2059,win:{primary:523},linux:{primary:523}}})}runCoreEditorCommand(v,C){o.EditorScroll._runEditorScroll(v,C.source,{direction:1,unit:3,value:1,revealCursor:!1,select:!1})}}),o.ScrollEditorTop=Q(new class extends Yt{constructor(){super({id:\"scrollEditorTop\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus}})}runCoreEditorCommand(v,C){o.EditorScroll._runEditorScroll(v,C.source,{direction:1,unit:5,value:1,revealCursor:!1,select:!1})}}),o.ScrollLineDown=Q(new class extends Yt{constructor(){super({id:\"scrollLineDown\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:2066,mac:{primary:268}}})}runCoreEditorCommand(v,C){o.EditorScroll._runEditorScroll(v,C.source,{direction:2,unit:2,value:1,revealCursor:!1,select:!1})}}),o.ScrollPageDown=Q(new class extends Yt{constructor(){super({id:\"scrollPageDown\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:2060,win:{primary:524},linux:{primary:524}}})}runCoreEditorCommand(v,C){o.EditorScroll._runEditorScroll(v,C.source,{direction:2,unit:3,value:1,revealCursor:!1,select:!1})}}),o.ScrollEditorBottom=Q(new class extends Yt{constructor(){super({id:\"scrollEditorBottom\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus}})}runCoreEditorCommand(v,C){o.EditorScroll._runEditorScroll(v,C.source,{direction:2,unit:5,value:1,revealCursor:!1,select:!1})}});class f extends Yt{constructor(C){super(C),this._inSelectionMode=C.inSelectionMode}runCoreEditorCommand(C,w){C.model.pushStackElement(),C.setCursorStates(w.source,3,[Pi.word(C,C.getPrimaryCursorState(),this._inSelectionMode,w.position)]),C.revealPrimaryCursor(w.source,!0)}}o.WordSelect=Q(new f({inSelectionMode:!1,id:\"_wordSelect\",precondition:void 0})),o.WordSelectDrag=Q(new f({inSelectionMode:!0,id:\"_wordSelectDrag\",precondition:void 0})),o.LastCursorWordSelect=Q(new class extends Yt{constructor(){super({id:\"lastCursorWordSelect\",precondition:void 0})}runCoreEditorCommand(v,C){const w=v.getLastAddedCursorIndex(),S=v.getCursorStates(),k=S.slice(0),x=S[w];k[w]=Pi.word(v,x,x.modelState.hasSelection(),C.position),v.model.pushStackElement(),v.setCursorStates(C.source,3,k)}});class _ extends Yt{constructor(C){super(C),this._inSelectionMode=C.inSelectionMode}runCoreEditorCommand(C,w){C.model.pushStackElement(),C.setCursorStates(w.source,3,[Pi.line(C,C.getPrimaryCursorState(),this._inSelectionMode,w.position,w.viewPosition)]),C.revealPrimaryCursor(w.source,!1)}}o.LineSelect=Q(new _({inSelectionMode:!1,id:\"_lineSelect\",precondition:void 0})),o.LineSelectDrag=Q(new _({inSelectionMode:!0,id:\"_lineSelectDrag\",precondition:void 0}));class b extends Yt{constructor(C){super(C),this._inSelectionMode=C.inSelectionMode}runCoreEditorCommand(C,w){const S=C.getLastAddedCursorIndex(),k=C.getCursorStates(),x=k.slice(0);x[S]=Pi.line(C,k[S],this._inSelectionMode,w.position,w.viewPosition),C.model.pushStackElement(),C.setCursorStates(w.source,3,x)}}o.LastCursorLineSelect=Q(new b({inSelectionMode:!1,id:\"lastCursorLineSelect\",precondition:void 0})),o.LastCursorLineSelectDrag=Q(new b({inSelectionMode:!0,id:\"lastCursorLineSelectDrag\",precondition:void 0})),o.CancelSelection=Q(new class extends Yt{constructor(){super({id:\"cancelSelection\",precondition:T.hasNonEmptySelection,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:9,secondary:[1033]}})}runCoreEditorCommand(v,C){v.model.pushStackElement(),v.setCursorStates(C.source,3,[Pi.cancelSelection(v,v.getPrimaryCursorState())]),v.revealPrimaryCursor(C.source,!0)}}),o.RemoveSecondaryCursors=Q(new class extends Yt{constructor(){super({id:\"removeSecondaryCursors\",precondition:T.hasMultipleSelections,kbOpts:{weight:it+1,kbExpr:T.textInputFocus,primary:9,secondary:[1033]}})}runCoreEditorCommand(v,C){v.model.pushStackElement(),v.setCursorStates(C.source,3,[v.getPrimaryCursorState()]),v.revealPrimaryCursor(C.source,!0),O0(p(\"removedCursor\",\"Removed secondary cursors\"))}}),o.RevealLine=Q(new class extends Yt{constructor(){super({id:\"revealLine\",precondition:void 0,description:lu.description})}runCoreEditorCommand(v,C){const w=C,S=w.lineNumber||0;let k=typeof S==\"number\"?S+1:parseInt(S)+1;k<1&&(k=1);const x=v.model.getLineCount();k>x&&(k=x);const y=new L(k,1,k,v.model.getLineMaxColumn(k));let D=0;if(w.at)switch(w.at){case lu.RawAtArgument.Top:D=3;break;case lu.RawAtArgument.Center:D=1;break;case lu.RawAtArgument.Bottom:D=4;break}const I=v.coordinatesConverter.convertModelRangeToViewRange(y);v.revealRange(C.source,!1,I,D,0)}}),o.SelectAll=new class extends Ry{constructor(){super(eW)}runDOMCommand(){Ls&&(document.activeElement.focus(),document.activeElement.select()),document.execCommand(\"selectAll\")}runEditorCommand(v,C,w){const S=C._getViewModel();!S||this.runCoreEditorCommand(S,w)}runCoreEditorCommand(v,C){v.model.pushStackElement(),v.setCursorStates(\"keyboard\",3,[Pi.selectAll(v,v.getPrimaryCursorState())])}},o.SetSelection=Q(new class extends Yt{constructor(){super({id:\"setSelection\",precondition:void 0})}runCoreEditorCommand(v,C){v.model.pushStackElement(),v.setCursorStates(C.source,3,[He.fromModelSelection(C.selection)])}})})(yi||(yi={}));const dV=re.and(T.textInputFocus,T.columnSelection);function Fg(o,e){ls.registerKeybindingRule({id:o,primary:e,when:dV,weight:it+1})}Fg(yi.CursorColumnSelectLeft.id,1039);Fg(yi.CursorColumnSelectRight.id,1041);Fg(yi.CursorColumnSelectUp.id,1040);Fg(yi.CursorColumnSelectPageUp.id,1035);Fg(yi.CursorColumnSelectDown.id,1042);Fg(yi.CursorColumnSelectPageDown.id,1036);function PT(o){return o.register(),o}var Tu;(function(o){class e extends ji{runEditorCommand(i,n,s){const r=n._getViewModel();!r||this.runCoreEditingCommand(n,r,s||{})}}o.CoreEditingCommand=e,o.LineBreakInsert=Q(new class extends e{constructor(){super({id:\"lineBreakInsert\",precondition:T.writable,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:0,mac:{primary:301}}})}runCoreEditingCommand(t,i,n){t.pushUndoStop(),t.executeCommands(this.id,Ot.lineBreakInsert(i.cursorConfig,i.model,i.getCursorStates().map(s=>s.modelState.selection)))}}),o.Outdent=Q(new class extends e{constructor(){super({id:\"outdent\",precondition:T.writable,kbOpts:{weight:it,kbExpr:re.and(T.editorTextFocus,T.tabDoesNotMoveFocus),primary:1026}})}runCoreEditingCommand(t,i,n){t.pushUndoStop(),t.executeCommands(this.id,Ot.outdent(i.cursorConfig,i.model,i.getCursorStates().map(s=>s.modelState.selection))),t.pushUndoStop()}}),o.Tab=Q(new class extends e{constructor(){super({id:\"tab\",precondition:T.writable,kbOpts:{weight:it,kbExpr:re.and(T.editorTextFocus,T.tabDoesNotMoveFocus),primary:2}})}runCoreEditingCommand(t,i,n){t.pushUndoStop(),t.executeCommands(this.id,Ot.tab(i.cursorConfig,i.model,i.getCursorStates().map(s=>s.modelState.selection))),t.pushUndoStop()}}),o.DeleteLeft=Q(new class extends e{constructor(){super({id:\"deleteLeft\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:1,secondary:[1025],mac:{primary:1,secondary:[1025,294,257]}}})}runCoreEditingCommand(t,i,n){const[s,r]=Wd.deleteLeft(i.getPrevEditOperationType(),i.cursorConfig,i.model,i.getCursorStates().map(a=>a.modelState.selection),i.getCursorAutoClosedCharacters());s&&t.pushUndoStop(),t.executeCommands(this.id,r),i.setPrevEditOperationType(2)}}),o.DeleteRight=Q(new class extends e{constructor(){super({id:\"deleteRight\",precondition:void 0,kbOpts:{weight:it,kbExpr:T.textInputFocus,primary:20,mac:{primary:20,secondary:[290,276]}}})}runCoreEditingCommand(t,i,n){const[s,r]=Wd.deleteRight(i.getPrevEditOperationType(),i.cursorConfig,i.model,i.getCursorStates().map(a=>a.modelState.selection));s&&t.pushUndoStop(),t.executeCommands(this.id,r),i.setPrevEditOperationType(3)}}),o.Undo=new class extends Ry{constructor(){super(cP)}runDOMCommand(){document.execCommand(\"undo\")}runEditorCommand(t,i,n){if(!(!i.hasModel()||i.getOption(83)===!0))return i.getModel().undo()}},o.Redo=new class extends Ry{constructor(){super(dP)}runDOMCommand(){document.execCommand(\"redo\")}runEditorCommand(t,i,n){if(!(!i.hasModel()||i.getOption(83)===!0))return i.getModel().redo()}}})(Tu||(Tu={}));class FT extends RC{constructor(e,t,i){super({id:e,precondition:void 0,description:i}),this._handlerId=t}runCommand(e,t){const i=e.get(dt).getFocusedCodeEditor();!i||i.trigger(\"keyboard\",this._handlerId,t)}}function ph(o,e){PT(new FT(\"default:\"+o,o)),PT(new FT(o,o,e))}ph(\"type\",{description:\"Type\",args:[{name:\"args\",schema:{type:\"object\",required:[\"text\"],properties:{text:{type:\"string\"}}}}]});ph(\"replacePreviousChar\");ph(\"compositionType\");ph(\"compositionStart\");ph(\"compositionEnd\");ph(\"paste\");ph(\"cut\");const oI=qe(\"markerDecorationsService\");var hV=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},uV=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let Pp=class{constructor(e,t){}dispose(){}};Pp.ID=\"editor.contrib.markerDecorations\";Pp=hV([uV(1,oI)],Pp);rt(Pp.ID,Pp);function ya(o){if(!o||typeof o!=\"object\"||o instanceof RegExp)return o;const e=Array.isArray(o)?[]:{};return Object.keys(o).forEach(t=>{o[t]&&typeof o[t]==\"object\"?e[t]=ya(o[t]):e[t]=o[t]}),e}function gV(o){if(!o||typeof o!=\"object\")return o;const e=[o];for(;e.length>0;){const t=e.shift();Object.freeze(t);for(const i in t)if(PP.call(t,i)){const n=t[i];typeof n==\"object\"&&!Object.isFrozen(n)&&!n6(n)&&e.push(n)}}return o}const PP=Object.prototype.hasOwnProperty;function FP(o,e){return Oy(o,e,new Set)}function Oy(o,e,t){if(_s(o))return o;const i=e(o);if(typeof i!=\"undefined\")return i;if(vO(o)){const n=[];for(const s of o)n.push(Oy(s,e,t));return n}if(Fn(o)){if(t.has(o))throw new Error(\"Cannot clone recursive data-structure\");t.add(o);const n={};for(const s in o)PP.call(o,s)&&(n[s]=Oy(o[s],e,t));return t.delete(o),n}return o}function ea(o,e,t=!0){return Fn(o)?(Fn(e)&&Object.keys(e).forEach(i=>{i in o?t&&(Fn(o[i])&&Fn(e[i])?ea(o[i],e[i],t):o[i]=e[i]):o[i]=e[i]}),o):e}function $s(o,e){if(o===e)return!0;if(o==null||e===null||e===void 0||typeof o!=typeof e||typeof o!=\"object\"||Array.isArray(o)!==Array.isArray(e))return!1;let t,i;if(Array.isArray(o)){if(o.length!==e.length)return!1;for(t=0;t<o.length;t++)if(!$s(o[t],e[t]))return!1}else{const n=[];for(i in o)n.push(i);n.sort();const s=[];for(i in e)s.push(i);if(s.sort(),!$s(n,s))return!1;for(t=0;t<n.length;t++)if(!$s(o[n[t]],e[n[t]]))return!1}return!0}class BP extends z{constructor(e,t){super(),this._onDidChange=this._register(new O),this.onDidChange=this._onDidChange.event,this._referenceDomElement=e,this._width=-1,this._height=-1,this._resizeObserver=null,this.measureReferenceDomElement(!1,t)}dispose(){this.stopObserving(),super.dispose()}getWidth(){return this._width}getHeight(){return this._height}startObserving(){!this._resizeObserver&&this._referenceDomElement&&(this._resizeObserver=new ResizeObserver(e=>{e&&e[0]&&e[0].contentRect?this.observe({width:e[0].contentRect.width,height:e[0].contentRect.height}):this.observe()}),this._resizeObserver.observe(this._referenceDomElement))}stopObserving(){this._resizeObserver&&(this._resizeObserver.disconnect(),this._resizeObserver=null)}observe(e){this.measureReferenceDomElement(!0,e)}measureReferenceDomElement(e,t){let i=0,n=0;t?(i=t.width,n=t.height):this._referenceDomElement&&(i=this._referenceDomElement.clientWidth,n=this._referenceDomElement.clientHeight),i=Math.max(5,i),n=Math.max(5,n),(this._width!==i||this._height!==n)&&(this._width=i,this._height=n,e&&this._onDidChange.fire())}}class WP{constructor(e){this.domNode=e,this._maxWidth=\"\",this._width=\"\",this._height=\"\",this._top=\"\",this._left=\"\",this._bottom=\"\",this._right=\"\",this._fontFamily=\"\",this._fontWeight=\"\",this._fontSize=\"\",this._fontStyle=\"\",this._fontFeatureSettings=\"\",this._textDecoration=\"\",this._lineHeight=\"\",this._letterSpacing=\"\",this._className=\"\",this._display=\"\",this._position=\"\",this._visibility=\"\",this._color=\"\",this._backgroundColor=\"\",this._layerHint=!1,this._contain=\"none\",this._boxShadow=\"\"}setMaxWidth(e){const t=lr(e);this._maxWidth!==t&&(this._maxWidth=t,this.domNode.style.maxWidth=this._maxWidth)}setWidth(e){const t=lr(e);this._width!==t&&(this._width=t,this.domNode.style.width=this._width)}setHeight(e){const t=lr(e);this._height!==t&&(this._height=t,this.domNode.style.height=this._height)}setTop(e){const t=lr(e);this._top!==t&&(this._top=t,this.domNode.style.top=this._top)}setLeft(e){const t=lr(e);this._left!==t&&(this._left=t,this.domNode.style.left=this._left)}setBottom(e){const t=lr(e);this._bottom!==t&&(this._bottom=t,this.domNode.style.bottom=this._bottom)}setRight(e){const t=lr(e);this._right!==t&&(this._right=t,this.domNode.style.right=this._right)}setFontFamily(e){this._fontFamily!==e&&(this._fontFamily=e,this.domNode.style.fontFamily=this._fontFamily)}setFontWeight(e){this._fontWeight!==e&&(this._fontWeight=e,this.domNode.style.fontWeight=this._fontWeight)}setFontSize(e){const t=lr(e);this._fontSize!==t&&(this._fontSize=t,this.domNode.style.fontSize=this._fontSize)}setFontStyle(e){this._fontStyle!==e&&(this._fontStyle=e,this.domNode.style.fontStyle=this._fontStyle)}setFontFeatureSettings(e){this._fontFeatureSettings!==e&&(this._fontFeatureSettings=e,this.domNode.style.fontFeatureSettings=this._fontFeatureSettings)}setTextDecoration(e){this._textDecoration!==e&&(this._textDecoration=e,this.domNode.style.textDecoration=this._textDecoration)}setLineHeight(e){const t=lr(e);this._lineHeight!==t&&(this._lineHeight=t,this.domNode.style.lineHeight=this._lineHeight)}setLetterSpacing(e){const t=lr(e);this._letterSpacing!==t&&(this._letterSpacing=t,this.domNode.style.letterSpacing=this._letterSpacing)}setClassName(e){this._className!==e&&(this._className=e,this.domNode.className=this._className)}toggleClassName(e,t){this.domNode.classList.toggle(e,t),this._className=this.domNode.className}setDisplay(e){this._display!==e&&(this._display=e,this.domNode.style.display=this._display)}setPosition(e){this._position!==e&&(this._position=e,this.domNode.style.position=this._position)}setVisibility(e){this._visibility!==e&&(this._visibility=e,this.domNode.style.visibility=this._visibility)}setColor(e){this._color!==e&&(this._color=e,this.domNode.style.color=this._color)}setBackgroundColor(e){this._backgroundColor!==e&&(this._backgroundColor=e,this.domNode.style.backgroundColor=this._backgroundColor)}setLayerHinting(e){this._layerHint!==e&&(this._layerHint=e,this.domNode.style.transform=this._layerHint?\"translate3d(0px, 0px, 0px)\":\"\")}setBoxShadow(e){this._boxShadow!==e&&(this._boxShadow=e,this.domNode.style.boxShadow=e)}setContain(e){this._contain!==e&&(this._contain=e,this.domNode.style.contain=this._contain)}setAttribute(e,t){this.domNode.setAttribute(e,t)}removeAttribute(e){this.domNode.removeAttribute(e)}appendChild(e){this.domNode.appendChild(e.domNode)}removeChild(e){this.domNode.removeChild(e.domNode)}}function lr(o){return typeof o==\"number\"?`${o}px`:o}function Je(o){return new WP(o)}function tn(o,e){o instanceof WP?(o.setFontFamily(e.getMassagedFontFamily()),o.setFontWeight(e.fontWeight),o.setFontSize(e.fontSize),o.setFontFeatureSettings(e.fontFeatureSettings),o.setLineHeight(e.lineHeight),o.setLetterSpacing(e.letterSpacing)):(o.style.fontFamily=e.getMassagedFontFamily(),o.style.fontWeight=e.fontWeight,o.style.fontSize=e.fontSize+\"px\",o.style.fontFeatureSettings=e.fontFeatureSettings,o.style.lineHeight=e.lineHeight+\"px\",o.style.letterSpacing=e.letterSpacing+\"px\")}class fV{constructor(e,t){this.chr=e,this.type=t,this.width=0}fulfill(e){this.width=e}}class rI{constructor(e,t){this._bareFontInfo=e,this._requests=t,this._container=null,this._testElements=null}read(){this._createDomElements(),document.body.appendChild(this._container),this._readFromDomElements(),document.body.removeChild(this._container),this._container=null,this._testElements=null}_createDomElements(){const e=document.createElement(\"div\");e.style.position=\"absolute\",e.style.top=\"-50000px\",e.style.width=\"50000px\";const t=document.createElement(\"div\");tn(t,this._bareFontInfo),e.appendChild(t);const i=document.createElement(\"div\");tn(i,this._bareFontInfo),i.style.fontWeight=\"bold\",e.appendChild(i);const n=document.createElement(\"div\");tn(n,this._bareFontInfo),n.style.fontStyle=\"italic\",e.appendChild(n);const s=[];for(const r of this._requests){let a;r.type===0&&(a=t),r.type===2&&(a=i),r.type===1&&(a=n),a.appendChild(document.createElement(\"br\"));const l=document.createElement(\"span\");rI._render(l,r),a.appendChild(l),s.push(l)}this._container=e,this._testElements=s}static _render(e,t){if(t.chr===\" \"){let i=\"\\xA0\";for(let n=0;n<8;n++)i+=i;e.innerText=i}else{let i=t.chr;for(let n=0;n<8;n++)i+=i;e.textContent=i}}_readFromDomElements(){for(let e=0,t=this._requests.length;e<t;e++){const i=this._requests[e],n=this._testElements[e];i.fulfill(n.offsetWidth/256)}}}function pV(o,e){new rI(o,e).read()}const Xi={tabSize:4,indentSize:4,insertSpaces:!0,detectIndentation:!0,trimAutoWhitespace:!0,largeFileOptimizations:!0,bracketPairColorizationOptions:{enabled:!0,independentColorPoolPerBracketType:!1}},Sl=8;class VP{constructor(e){this._values=e}hasChanged(e){return this._values[e]}}class HP{constructor(){this.stableMinimapLayoutInput=null,this.stableFitMaxMinimapScale=0,this.stableFitRemainingWidth=0}}class hi{constructor(e,t,i,n){this.id=e,this.name=t,this.defaultValue=i,this.schema=n}applyUpdate(e,t){return jC(e,t)}compute(e,t,i){return i}}class Jf{constructor(e,t){this.newValue=e,this.didChange=t}}function jC(o,e){if(typeof o!=\"object\"||typeof e!=\"object\"||!o||!e)return new Jf(e,o!==e);if(Array.isArray(o)||Array.isArray(e)){const i=Array.isArray(o)&&Array.isArray(e)&&ys(o,e);return new Jf(e,!i)}let t=!1;for(const i in e)if(e.hasOwnProperty(i)){const n=jC(o[i],e[i]);n.didChange&&(o[i]=n.newValue,t=!0)}return new Jf(o,t)}class Bg{constructor(e){this.schema=void 0,this.id=e,this.name=\"_never_\",this.defaultValue=void 0}applyUpdate(e,t){return jC(e,t)}validate(e){return this.defaultValue}}class mh{constructor(e,t,i,n){this.id=e,this.name=t,this.defaultValue=i,this.schema=n}applyUpdate(e,t){return jC(e,t)}validate(e){return typeof e==\"undefined\"?this.defaultValue:e}compute(e,t,i){return i}}function Ce(o,e){return typeof o==\"undefined\"?e:o===\"false\"?!1:Boolean(o)}class Ge extends mh{constructor(e,t,i,n=void 0){typeof n!=\"undefined\"&&(n.type=\"boolean\",n.default=i),super(e,t,i,n)}validate(e){return Ce(e,this.defaultValue)}}function Py(o,e,t,i){if(typeof o==\"undefined\")return e;let n=parseInt(o,10);return isNaN(n)?e:(n=Math.max(t,n),n=Math.min(i,n),n|0)}class Et extends mh{constructor(e,t,i,n,s,r=void 0){typeof r!=\"undefined\"&&(r.type=\"integer\",r.default=i,r.minimum=n,r.maximum=s),super(e,t,i,r),this.minimum=n,this.maximum=s}static clampedInt(e,t,i,n){return Py(e,t,i,n)}validate(e){return Et.clampedInt(e,this.defaultValue,this.minimum,this.maximum)}}class Er extends mh{constructor(e,t,i,n,s){typeof s!=\"undefined\"&&(s.type=\"number\",s.default=i),super(e,t,i,s),this.validationFn=n}static clamp(e,t,i){return e<t?t:e>i?i:e}static float(e,t){if(typeof e==\"number\")return e;if(typeof e==\"undefined\")return t;const i=parseFloat(e);return isNaN(i)?t:i}validate(e){return this.validationFn(Er.float(e,this.defaultValue))}}class Gn extends mh{static string(e,t){return typeof e!=\"string\"?t:e}constructor(e,t,i,n=void 0){typeof n!=\"undefined\"&&(n.type=\"string\",n.default=i),super(e,t,i,n)}validate(e){return Gn.string(e,this.defaultValue)}}function Ui(o,e,t){return typeof o!=\"string\"||t.indexOf(o)===-1?e:o}class mi extends mh{constructor(e,t,i,n,s=void 0){typeof s!=\"undefined\"&&(s.type=\"string\",s.enum=n,s.default=i),super(e,t,i,s),this._allowedValues=n}validate(e){return Ui(e,this.defaultValue,this._allowedValues)}}class hf extends hi{constructor(e,t,i,n,s,r,a=void 0){typeof a!=\"undefined\"&&(a.type=\"string\",a.enum=s,a.default=n),super(e,t,i,a),this._allowedValues=s,this._convert=r}validate(e){return typeof e!=\"string\"?this.defaultValue:this._allowedValues.indexOf(e)===-1?this.defaultValue:this._convert(e)}}function mV(o){switch(o){case\"none\":return 0;case\"keep\":return 1;case\"brackets\":return 2;case\"advanced\":return 3;case\"full\":return 4}}class _V extends hi{constructor(){super(2,\"accessibilitySupport\",0,{type:\"string\",enum:[\"auto\",\"on\",\"off\"],enumDescriptions:[p(\"accessibilitySupport.auto\",\"The editor will use platform APIs to detect when a Screen Reader is attached.\"),p(\"accessibilitySupport.on\",\"The editor will be permanently optimized for usage with a Screen Reader. Word wrapping will be disabled.\"),p(\"accessibilitySupport.off\",\"The editor will never be optimized for usage with a Screen Reader.\")],default:\"auto\",description:p(\"accessibilitySupport\",\"Controls whether the editor should run in a mode where it is optimized for screen readers. Setting to on will disable word wrapping.\")})}validate(e){switch(e){case\"auto\":return 0;case\"off\":return 1;case\"on\":return 2}return this.defaultValue}compute(e,t,i){return i===0?e.accessibilitySupport:i}}class bV extends hi{constructor(){const e={insertSpace:!0,ignoreEmptyLines:!0};super(19,\"comments\",e,{\"editor.comments.insertSpace\":{type:\"boolean\",default:e.insertSpace,description:p(\"comments.insertSpace\",\"Controls whether a space character is inserted when commenting.\")},\"editor.comments.ignoreEmptyLines\":{type:\"boolean\",default:e.ignoreEmptyLines,description:p(\"comments.ignoreEmptyLines\",\"Controls if empty lines should be ignored with toggle, add or remove actions for line comments.\")}})}validate(e){if(!e||typeof e!=\"object\")return this.defaultValue;const t=e;return{insertSpace:Ce(t.insertSpace,this.defaultValue.insertSpace),ignoreEmptyLines:Ce(t.ignoreEmptyLines,this.defaultValue.ignoreEmptyLines)}}}function vV(o){switch(o){case\"blink\":return 1;case\"smooth\":return 2;case\"phase\":return 3;case\"expand\":return 4;case\"solid\":return 5}}var Bi;(function(o){o[o.Line=1]=\"Line\",o[o.Block=2]=\"Block\",o[o.Underline=3]=\"Underline\",o[o.LineThin=4]=\"LineThin\",o[o.BlockOutline=5]=\"BlockOutline\",o[o.UnderlineThin=6]=\"UnderlineThin\"})(Bi||(Bi={}));function CV(o){switch(o){case\"line\":return Bi.Line;case\"block\":return Bi.Block;case\"underline\":return Bi.Underline;case\"line-thin\":return Bi.LineThin;case\"block-outline\":return Bi.BlockOutline;case\"underline-thin\":return Bi.UnderlineThin}}class wV extends Bg{constructor(){super(130)}compute(e,t,i){const n=[\"monaco-editor\"];return t.get(35)&&n.push(t.get(35)),e.extraEditorClassName&&n.push(e.extraEditorClassName),t.get(68)===\"default\"?n.push(\"mouse-default\"):t.get(68)===\"copy\"&&n.push(\"mouse-copy\"),t.get(102)&&n.push(\"showUnused\"),t.get(128)&&n.push(\"showDeprecated\"),n.join(\" \")}}class SV extends Ge{constructor(){super(33,\"emptySelectionClipboard\",!0,{description:p(\"emptySelectionClipboard\",\"Controls whether copying without a selection copies the current line.\")})}compute(e,t,i){return i&&e.emptySelectionClipboard}}class yV extends hi{constructor(){const e={cursorMoveOnType:!0,seedSearchStringFromSelection:\"always\",autoFindInSelection:\"never\",globalFindClipboard:!1,addExtraSpaceOnTop:!0,loop:!0};super(37,\"find\",e,{\"editor.find.cursorMoveOnType\":{type:\"boolean\",default:e.cursorMoveOnType,description:p(\"find.cursorMoveOnType\",\"Controls whether the cursor should jump to find matches while typing.\")},\"editor.find.seedSearchStringFromSelection\":{type:\"string\",enum:[\"never\",\"always\",\"selection\"],default:e.seedSearchStringFromSelection,enumDescriptions:[p(\"editor.find.seedSearchStringFromSelection.never\",\"Never seed search string from the editor selection.\"),p(\"editor.find.seedSearchStringFromSelection.always\",\"Always seed search string from the editor selection, including word at cursor position.\"),p(\"editor.find.seedSearchStringFromSelection.selection\",\"Only seed search string from the editor selection.\")],description:p(\"find.seedSearchStringFromSelection\",\"Controls whether the search string in the Find Widget is seeded from the editor selection.\")},\"editor.find.autoFindInSelection\":{type:\"string\",enum:[\"never\",\"always\",\"multiline\"],default:e.autoFindInSelection,enumDescriptions:[p(\"editor.find.autoFindInSelection.never\",\"Never turn on Find in Selection automatically (default).\"),p(\"editor.find.autoFindInSelection.always\",\"Always turn on Find in Selection automatically.\"),p(\"editor.find.autoFindInSelection.multiline\",\"Turn on Find in Selection automatically when multiple lines of content are selected.\")],description:p(\"find.autoFindInSelection\",\"Controls the condition for turning on Find in Selection automatically.\")},\"editor.find.globalFindClipboard\":{type:\"boolean\",default:e.globalFindClipboard,description:p(\"find.globalFindClipboard\",\"Controls whether the Find Widget should read or modify the shared find clipboard on macOS.\"),included:Ze},\"editor.find.addExtraSpaceOnTop\":{type:\"boolean\",default:e.addExtraSpaceOnTop,description:p(\"find.addExtraSpaceOnTop\",\"Controls whether the Find Widget should add extra lines on top of the editor. When true, you can scroll beyond the first line when the Find Widget is visible.\")},\"editor.find.loop\":{type:\"boolean\",default:e.loop,description:p(\"find.loop\",\"Controls whether the search automatically restarts from the beginning (or the end) when no further matches can be found.\")}})}validate(e){if(!e||typeof e!=\"object\")return this.defaultValue;const t=e;return{cursorMoveOnType:Ce(t.cursorMoveOnType,this.defaultValue.cursorMoveOnType),seedSearchStringFromSelection:typeof e.seedSearchStringFromSelection==\"boolean\"?e.seedSearchStringFromSelection?\"always\":\"never\":Ui(t.seedSearchStringFromSelection,this.defaultValue.seedSearchStringFromSelection,[\"never\",\"always\",\"selection\"]),autoFindInSelection:typeof e.autoFindInSelection==\"boolean\"?e.autoFindInSelection?\"always\":\"never\":Ui(t.autoFindInSelection,this.defaultValue.autoFindInSelection,[\"never\",\"always\",\"multiline\"]),globalFindClipboard:Ce(t.globalFindClipboard,this.defaultValue.globalFindClipboard),addExtraSpaceOnTop:Ce(t.addExtraSpaceOnTop,this.defaultValue.addExtraSpaceOnTop),loop:Ce(t.loop,this.defaultValue.loop)}}}class vs extends hi{constructor(){super(47,\"fontLigatures\",vs.OFF,{anyOf:[{type:\"boolean\",description:p(\"fontLigatures\",\"Enables/Disables font ligatures ('calt' and 'liga' font features). Change this to a string for fine-grained control of the 'font-feature-settings' CSS property.\")},{type:\"string\",description:p(\"fontFeatureSettings\",\"Explicit 'font-feature-settings' CSS property. A boolean can be passed instead if one only needs to turn on/off ligatures.\")}],description:p(\"fontLigaturesGeneral\",\"Configures font ligatures or font features. Can be either a boolean to enable/disable ligatures or a string for the value of the CSS 'font-feature-settings' property.\"),default:!1})}validate(e){return typeof e==\"undefined\"?this.defaultValue:typeof e==\"string\"?e===\"false\"?vs.OFF:e===\"true\"?vs.ON:e:Boolean(e)?vs.ON:vs.OFF}}vs.OFF='\"liga\" off, \"calt\" off';vs.ON='\"liga\" on, \"calt\" on';class LV extends Bg{constructor(){super(46)}compute(e,t,i){return e.fontInfo}}class DV extends mh{constructor(){super(48,\"fontSize\",ns.fontSize,{type:\"number\",minimum:6,maximum:100,default:ns.fontSize,description:p(\"fontSize\",\"Controls the font size in pixels.\")})}validate(e){const t=Er.float(e,this.defaultValue);return t===0?ns.fontSize:Er.clamp(t,6,100)}compute(e,t,i){return e.fontInfo.fontSize}}class Sr extends hi{constructor(){super(49,\"fontWeight\",ns.fontWeight,{anyOf:[{type:\"number\",minimum:Sr.MINIMUM_VALUE,maximum:Sr.MAXIMUM_VALUE,errorMessage:p(\"fontWeightErrorMessage\",'Only \"normal\" and \"bold\" keywords or numbers between 1 and 1000 are allowed.')},{type:\"string\",pattern:\"^(normal|bold|1000|[1-9][0-9]{0,2})$\"},{enum:Sr.SUGGESTION_VALUES}],default:ns.fontWeight,description:p(\"fontWeight\",'Controls the font weight. Accepts \"normal\" and \"bold\" keywords or numbers between 1 and 1000.')})}validate(e){return e===\"normal\"||e===\"bold\"?e:String(Et.clampedInt(e,ns.fontWeight,Sr.MINIMUM_VALUE,Sr.MAXIMUM_VALUE))}}Sr.SUGGESTION_VALUES=[\"normal\",\"bold\",\"100\",\"200\",\"300\",\"400\",\"500\",\"600\",\"700\",\"800\",\"900\"];Sr.MINIMUM_VALUE=1;Sr.MAXIMUM_VALUE=1e3;class kV extends hi{constructor(){const e={multiple:\"peek\",multipleDefinitions:\"peek\",multipleTypeDefinitions:\"peek\",multipleDeclarations:\"peek\",multipleImplementations:\"peek\",multipleReferences:\"peek\",alternativeDefinitionCommand:\"editor.action.goToReferences\",alternativeTypeDefinitionCommand:\"editor.action.goToReferences\",alternativeDeclarationCommand:\"editor.action.goToReferences\",alternativeImplementationCommand:\"\",alternativeReferenceCommand:\"\"},t={type:\"string\",enum:[\"peek\",\"gotoAndPeek\",\"goto\"],default:e.multiple,enumDescriptions:[p(\"editor.gotoLocation.multiple.peek\",\"Show peek view of the results (default)\"),p(\"editor.gotoLocation.multiple.gotoAndPeek\",\"Go to the primary result and show a peek view\"),p(\"editor.gotoLocation.multiple.goto\",\"Go to the primary result and enable peek-less navigation to others\")]},i=[\"\",\"editor.action.referenceSearch.trigger\",\"editor.action.goToReferences\",\"editor.action.peekImplementation\",\"editor.action.goToImplementation\",\"editor.action.peekTypeDefinition\",\"editor.action.goToTypeDefinition\",\"editor.action.peekDeclaration\",\"editor.action.revealDeclaration\",\"editor.action.peekDefinition\",\"editor.action.revealDefinitionAside\",\"editor.action.revealDefinition\"];super(53,\"gotoLocation\",e,{\"editor.gotoLocation.multiple\":{deprecationMessage:p(\"editor.gotoLocation.multiple.deprecated\",\"This setting is deprecated, please use separate settings like 'editor.editor.gotoLocation.multipleDefinitions' or 'editor.editor.gotoLocation.multipleImplementations' instead.\")},\"editor.gotoLocation.multipleDefinitions\":Object.assign({description:p(\"editor.editor.gotoLocation.multipleDefinitions\",\"Controls the behavior the 'Go to Definition'-command when multiple target locations exist.\")},t),\"editor.gotoLocation.multipleTypeDefinitions\":Object.assign({description:p(\"editor.editor.gotoLocation.multipleTypeDefinitions\",\"Controls the behavior the 'Go to Type Definition'-command when multiple target locations exist.\")},t),\"editor.gotoLocation.multipleDeclarations\":Object.assign({description:p(\"editor.editor.gotoLocation.multipleDeclarations\",\"Controls the behavior the 'Go to Declaration'-command when multiple target locations exist.\")},t),\"editor.gotoLocation.multipleImplementations\":Object.assign({description:p(\"editor.editor.gotoLocation.multipleImplemenattions\",\"Controls the behavior the 'Go to Implementations'-command when multiple target locations exist.\")},t),\"editor.gotoLocation.multipleReferences\":Object.assign({description:p(\"editor.editor.gotoLocation.multipleReferences\",\"Controls the behavior the 'Go to References'-command when multiple target locations exist.\")},t),\"editor.gotoLocation.alternativeDefinitionCommand\":{type:\"string\",default:e.alternativeDefinitionCommand,enum:i,description:p(\"alternativeDefinitionCommand\",\"Alternative command id that is being executed when the result of 'Go to Definition' is the current location.\")},\"editor.gotoLocation.alternativeTypeDefinitionCommand\":{type:\"string\",default:e.alternativeTypeDefinitionCommand,enum:i,description:p(\"alternativeTypeDefinitionCommand\",\"Alternative command id that is being executed when the result of 'Go to Type Definition' is the current location.\")},\"editor.gotoLocation.alternativeDeclarationCommand\":{type:\"string\",default:e.alternativeDeclarationCommand,enum:i,description:p(\"alternativeDeclarationCommand\",\"Alternative command id that is being executed when the result of 'Go to Declaration' is the current location.\")},\"editor.gotoLocation.alternativeImplementationCommand\":{type:\"string\",default:e.alternativeImplementationCommand,enum:i,description:p(\"alternativeImplementationCommand\",\"Alternative command id that is being executed when the result of 'Go to Implementation' is the current location.\")},\"editor.gotoLocation.alternativeReferenceCommand\":{type:\"string\",default:e.alternativeReferenceCommand,enum:i,description:p(\"alternativeReferenceCommand\",\"Alternative command id that is being executed when the result of 'Go to Reference' is the current location.\")}})}validate(e){var t,i,n,s,r;if(!e||typeof e!=\"object\")return this.defaultValue;const a=e;return{multiple:Ui(a.multiple,this.defaultValue.multiple,[\"peek\",\"gotoAndPeek\",\"goto\"]),multipleDefinitions:(t=a.multipleDefinitions)!==null&&t!==void 0?t:Ui(a.multipleDefinitions,\"peek\",[\"peek\",\"gotoAndPeek\",\"goto\"]),multipleTypeDefinitions:(i=a.multipleTypeDefinitions)!==null&&i!==void 0?i:Ui(a.multipleTypeDefinitions,\"peek\",[\"peek\",\"gotoAndPeek\",\"goto\"]),multipleDeclarations:(n=a.multipleDeclarations)!==null&&n!==void 0?n:Ui(a.multipleDeclarations,\"peek\",[\"peek\",\"gotoAndPeek\",\"goto\"]),multipleImplementations:(s=a.multipleImplementations)!==null&&s!==void 0?s:Ui(a.multipleImplementations,\"peek\",[\"peek\",\"gotoAndPeek\",\"goto\"]),multipleReferences:(r=a.multipleReferences)!==null&&r!==void 0?r:Ui(a.multipleReferences,\"peek\",[\"peek\",\"gotoAndPeek\",\"goto\"]),alternativeDefinitionCommand:Gn.string(a.alternativeDefinitionCommand,this.defaultValue.alternativeDefinitionCommand),alternativeTypeDefinitionCommand:Gn.string(a.alternativeTypeDefinitionCommand,this.defaultValue.alternativeTypeDefinitionCommand),alternativeDeclarationCommand:Gn.string(a.alternativeDeclarationCommand,this.defaultValue.alternativeDeclarationCommand),alternativeImplementationCommand:Gn.string(a.alternativeImplementationCommand,this.defaultValue.alternativeImplementationCommand),alternativeReferenceCommand:Gn.string(a.alternativeReferenceCommand,this.defaultValue.alternativeReferenceCommand)}}}class xV extends hi{constructor(){const e={enabled:!0,delay:300,sticky:!0,above:!0};super(55,\"hover\",e,{\"editor.hover.enabled\":{type:\"boolean\",default:e.enabled,description:p(\"hover.enabled\",\"Controls whether the hover is shown.\")},\"editor.hover.delay\":{type:\"number\",default:e.delay,minimum:0,maximum:1e4,description:p(\"hover.delay\",\"Controls the delay in milliseconds after which the hover is shown.\")},\"editor.hover.sticky\":{type:\"boolean\",default:e.sticky,description:p(\"hover.sticky\",\"Controls whether the hover should remain visible when mouse is moved over it.\")},\"editor.hover.above\":{type:\"boolean\",default:e.above,description:p(\"hover.above\",\"Prefer showing hovers above the line, if there's space.\")}})}validate(e){if(!e||typeof e!=\"object\")return this.defaultValue;const t=e;return{enabled:Ce(t.enabled,this.defaultValue.enabled),delay:Et.clampedInt(t.delay,this.defaultValue.delay,0,1e4),sticky:Ce(t.sticky,this.defaultValue.sticky),above:Ce(t.above,this.defaultValue.above)}}}class Mu extends Bg{constructor(){super(133)}compute(e,t,i){return Mu.computeLayout(t,{memory:e.memory,outerWidth:e.outerWidth,outerHeight:e.outerHeight,isDominatedByLongLines:e.isDominatedByLongLines,lineHeight:e.fontInfo.lineHeight,viewLineCount:e.viewLineCount,lineNumbersDigitCount:e.lineNumbersDigitCount,typicalHalfwidthCharacterWidth:e.fontInfo.typicalHalfwidthCharacterWidth,maxDigitWidth:e.fontInfo.maxDigitWidth,pixelRatio:e.pixelRatio})}static computeContainedMinimapLineCount(e){const t=e.height/e.lineHeight,i=e.scrollBeyondLastLine?t-1:0,n=(e.viewLineCount+i)/(e.pixelRatio*e.height),s=Math.floor(e.viewLineCount/n);return{typicalViewportLineCount:t,extraLinesBeyondLastLine:i,desiredRatio:n,minimapLineCount:s}}static _computeMinimapLayout(e,t){const i=e.outerWidth,n=e.outerHeight,s=e.pixelRatio;if(!e.minimap.enabled)return{renderMinimap:0,minimapLeft:0,minimapWidth:0,minimapHeightIsEditorHeight:!1,minimapIsSampling:!1,minimapScale:1,minimapLineHeight:1,minimapCanvasInnerWidth:0,minimapCanvasInnerHeight:Math.floor(s*n),minimapCanvasOuterWidth:0,minimapCanvasOuterHeight:n};const r=t.stableMinimapLayoutInput,a=r&&e.outerHeight===r.outerHeight&&e.lineHeight===r.lineHeight&&e.typicalHalfwidthCharacterWidth===r.typicalHalfwidthCharacterWidth&&e.pixelRatio===r.pixelRatio&&e.scrollBeyondLastLine===r.scrollBeyondLastLine&&e.minimap.enabled===r.minimap.enabled&&e.minimap.side===r.minimap.side&&e.minimap.size===r.minimap.size&&e.minimap.showSlider===r.minimap.showSlider&&e.minimap.renderCharacters===r.minimap.renderCharacters&&e.minimap.maxColumn===r.minimap.maxColumn&&e.minimap.scale===r.minimap.scale&&e.verticalScrollbarWidth===r.verticalScrollbarWidth&&e.isViewportWrapping===r.isViewportWrapping,l=e.lineHeight,c=e.typicalHalfwidthCharacterWidth,d=e.scrollBeyondLastLine,h=e.minimap.renderCharacters;let u=s>=2?Math.round(e.minimap.scale*2):e.minimap.scale;const g=e.minimap.maxColumn,f=e.minimap.size,_=e.minimap.side,b=e.verticalScrollbarWidth,v=e.viewLineCount,C=e.remainingWidth,w=e.isViewportWrapping,S=h?2:3;let k=Math.floor(s*n);const x=k/s;let y=!1,D=!1,I=S*u,R=u/s,P=1;if(f===\"fill\"||f===\"fit\"){const{typicalViewportLineCount:Se,extraLinesBeyondLastLine:Me,desiredRatio:St,minimapLineCount:mt}=Mu.computeContainedMinimapLineCount({viewLineCount:v,scrollBeyondLastLine:d,height:n,lineHeight:l,pixelRatio:s});if(v/mt>1)y=!0,D=!0,u=1,I=1,R=u/s;else{let ge=!1,It=u+1;if(f===\"fit\"){const Ri=Math.ceil((v+Me)*I);w&&a&&C<=t.stableFitRemainingWidth?(ge=!0,It=t.stableFitMaxMinimapScale):ge=Ri>k}if(f===\"fill\"||ge){y=!0;const Ri=u;I=Math.min(l*s,Math.max(1,Math.floor(1/St))),w&&a&&C<=t.stableFitRemainingWidth&&(It=t.stableFitMaxMinimapScale),u=Math.min(It,Math.max(1,Math.floor(I/S))),u>Ri&&(P=Math.min(2,u/Ri)),R=u/s/P,k=Math.ceil(Math.max(Se,v+Me)*I),w?(t.stableMinimapLayoutInput=e,t.stableFitRemainingWidth=C,t.stableFitMaxMinimapScale=u):(t.stableMinimapLayoutInput=null,t.stableFitRemainingWidth=0)}}}const H=Math.floor(g*R),$=Math.min(H,Math.max(0,Math.floor((C-b-2)*R/(c+R)))+Sl);let ne=Math.floor(s*$);const ae=ne/s;ne=Math.floor(ne*P);const de=h?1:2,we=_===\"left\"?0:i-$-b;return{renderMinimap:de,minimapLeft:we,minimapWidth:$,minimapHeightIsEditorHeight:y,minimapIsSampling:D,minimapScale:u,minimapLineHeight:I,minimapCanvasInnerWidth:ne,minimapCanvasInnerHeight:k,minimapCanvasOuterWidth:ae,minimapCanvasOuterHeight:x}}static computeLayout(e,t){const i=t.outerWidth|0,n=t.outerHeight|0,s=t.lineHeight|0,r=t.lineNumbersDigitCount|0,a=t.typicalHalfwidthCharacterWidth,l=t.maxDigitWidth,c=t.pixelRatio,d=t.viewLineCount,h=e.get(125),u=h===\"inherit\"?e.get(124):h,g=u===\"inherit\"?e.get(120):u,f=e.get(123),_=e.get(2),b=t.isDominatedByLongLines,v=e.get(52),C=e.get(62).renderType!==0,w=e.get(63),S=e.get(96),k=e.get(67),x=e.get(94),y=x.verticalScrollbarSize,D=x.verticalHasArrows,I=x.arrowSize,R=x.horizontalScrollbarSize,P=e.get(60),H=e.get(39),$=e.get(101)!==\"never\";let ne;if(typeof P==\"string\"&&/^\\d+(\\.\\d+)?ch$/.test(P)){const Do=parseFloat(P.substr(0,P.length-2));ne=Et.clampedInt(Do*a,0,0,1e3)}else ne=Et.clampedInt(P,0,0,1e3);H&&$&&(ne+=16);let ae=0;if(C){const Do=Math.max(r,w);ae=Math.round(Do*l)}let de=0;v&&(de=s);let we=0,Se=we+de,Me=Se+ae,St=Me+ne;const mt=i-de-ae-ne;let _e=!1,ge=!1,It=-1;_!==2&&(u===\"inherit\"&&b?(_e=!0,ge=!0):g===\"on\"||g===\"bounded\"?ge=!0:g===\"wordWrapColumn\"&&(It=f));const Ri=Mu._computeMinimapLayout({outerWidth:i,outerHeight:n,lineHeight:s,typicalHalfwidthCharacterWidth:a,pixelRatio:c,scrollBeyondLastLine:S,minimap:k,verticalScrollbarWidth:y,viewLineCount:d,remainingWidth:mt,isViewportWrapping:ge},t.memory||new HP);Ri.renderMinimap!==0&&Ri.minimapLeft===0&&(we+=Ri.minimapWidth,Se+=Ri.minimapWidth,Me+=Ri.minimapWidth,St+=Ri.minimapWidth);const Dn=mt-Ri.minimapWidth,Lo=Math.max(1,Math.floor((Dn-y-2)/a)),sa=D?I:0;return ge&&(It=Math.max(1,Lo),g===\"bounded\"&&(It=Math.min(It,f))),{width:i,height:n,glyphMarginLeft:we,glyphMarginWidth:de,lineNumbersLeft:Se,lineNumbersWidth:ae,decorationsLeft:Me,decorationsWidth:ne,contentLeft:St,contentWidth:Dn,minimap:Ri,viewportColumn:Lo,isWordWrapMinified:_e,isViewportWrapping:ge,wrappingColumn:It,verticalScrollbarWidth:y,horizontalScrollbarHeight:R,overviewRuler:{top:sa,width:y,height:n-2*sa,right:0}}}}class IV extends hi{constructor(){const e={enabled:!0};super(59,\"lightbulb\",e,{\"editor.lightbulb.enabled\":{type:\"boolean\",default:e.enabled,description:p(\"codeActions\",\"Enables the code action lightbulb in the editor.\")}})}validate(e){return!e||typeof e!=\"object\"?this.defaultValue:{enabled:Ce(e.enabled,this.defaultValue.enabled)}}}class EV extends hi{constructor(){const e={stickyScroll:{enabled:!1}};super(34,\"experimental\",e,{\"editor.experimental.stickyScroll.enabled\":{type:\"boolean\",default:e.stickyScroll.enabled,description:p(\"editor.experimental.stickyScroll\",\"Shows the nested current scopes during the scroll at the top of the editor.\")}})}validate(e){var t;return!e||typeof e!=\"object\"?this.defaultValue:{stickyScroll:{enabled:Ce((t=e.stickyScroll)===null||t===void 0?void 0:t.enabled,this.defaultValue.stickyScroll.enabled)}}}}class NV extends hi{constructor(){const e={enabled:\"on\",fontSize:0,fontFamily:\"\",padding:!1};super(129,\"inlayHints\",e,{\"editor.inlayHints.enabled\":{type:\"string\",default:e.enabled,description:p(\"inlayHints.enable\",\"Enables the inlay hints in the editor.\"),enum:[\"on\",\"onUnlessPressed\",\"offUnlessPressed\",\"off\"],markdownEnumDescriptions:[p(\"editor.inlayHints.on\",\"Inlay hints are enabled\"),p(\"editor.inlayHints.onUnlessPressed\",\"Inlay hints are showing by default and hide when holding `Ctrl+Alt`\"),p(\"editor.inlayHints.offUnlessPressed\",\"Inlay hints are hidden by default and show when holding `Ctrl+Alt`\"),p(\"editor.inlayHints.off\",\"Inlay hints are disabled\")]},\"editor.inlayHints.fontSize\":{type:\"number\",default:e.fontSize,markdownDescription:p(\"inlayHints.fontSize\",\"Controls font size of inlay hints in the editor. As default the {0} is used when the configured value is less than {1} or greater than the editor font size.\",\"`#editor.fontSize#`\",\"`5`\")},\"editor.inlayHints.fontFamily\":{type:\"string\",default:e.fontFamily,markdownDescription:p(\"inlayHints.fontFamily\",\"Controls font family of inlay hints in the editor. When set to empty, the {0} is used.\",\"`#editor.fontFamily#`\")},\"editor.inlayHints.padding\":{type:\"boolean\",default:e.padding,description:p(\"inlayHints.padding\",\"Enables the padding around the inlay hints in the editor.\")}})}validate(e){if(!e||typeof e!=\"object\")return this.defaultValue;const t=e;return typeof t.enabled==\"boolean\"&&(t.enabled=t.enabled?\"on\":\"off\"),{enabled:Ui(t.enabled,this.defaultValue.enabled,[\"on\",\"off\",\"offUnlessPressed\",\"onUnlessPressed\"]),fontSize:Et.clampedInt(t.fontSize,this.defaultValue.fontSize,0,100),fontFamily:Gn.string(t.fontFamily,this.defaultValue.fontFamily),padding:Ce(t.padding,this.defaultValue.padding)}}}class TV extends Er{constructor(){super(61,\"lineHeight\",ns.lineHeight,e=>Er.clamp(e,0,150),{markdownDescription:p(\"lineHeight\",`Controls the line height. \n - Use 0 to automatically compute the line height from the font size.\n - Values between 0 and 8 will be used as a multiplier with the font size.\n - Values greater than or equal to 8 will be used as effective values.`)})}compute(e,t,i){return e.fontInfo.lineHeight}}class MV extends hi{constructor(){const e={enabled:!0,size:\"proportional\",side:\"right\",showSlider:\"mouseover\",autohide:!1,renderCharacters:!0,maxColumn:120,scale:1};super(67,\"minimap\",e,{\"editor.minimap.enabled\":{type:\"boolean\",default:e.enabled,description:p(\"minimap.enabled\",\"Controls whether the minimap is shown.\")},\"editor.minimap.autohide\":{type:\"boolean\",default:e.autohide,description:p(\"minimap.autohide\",\"Controls whether the minimap is hidden automatically.\")},\"editor.minimap.size\":{type:\"string\",enum:[\"proportional\",\"fill\",\"fit\"],enumDescriptions:[p(\"minimap.size.proportional\",\"The minimap has the same size as the editor contents (and might scroll).\"),p(\"minimap.size.fill\",\"The minimap will stretch or shrink as necessary to fill the height of the editor (no scrolling).\"),p(\"minimap.size.fit\",\"The minimap will shrink as necessary to never be larger than the editor (no scrolling).\")],default:e.size,description:p(\"minimap.size\",\"Controls the size of the minimap.\")},\"editor.minimap.side\":{type:\"string\",enum:[\"left\",\"right\"],default:e.side,description:p(\"minimap.side\",\"Controls the side where to render the minimap.\")},\"editor.minimap.showSlider\":{type:\"string\",enum:[\"always\",\"mouseover\"],default:e.showSlider,description:p(\"minimap.showSlider\",\"Controls when the minimap slider is shown.\")},\"editor.minimap.scale\":{type:\"number\",default:e.scale,minimum:1,maximum:3,enum:[1,2,3],description:p(\"minimap.scale\",\"Scale of content drawn in the minimap: 1, 2 or 3.\")},\"editor.minimap.renderCharacters\":{type:\"boolean\",default:e.renderCharacters,description:p(\"minimap.renderCharacters\",\"Render the actual characters on a line as opposed to color blocks.\")},\"editor.minimap.maxColumn\":{type:\"number\",default:e.maxColumn,description:p(\"minimap.maxColumn\",\"Limit the width of the minimap to render at most a certain number of columns.\")}})}validate(e){if(!e||typeof e!=\"object\")return this.defaultValue;const t=e;return{enabled:Ce(t.enabled,this.defaultValue.enabled),autohide:Ce(t.autohide,this.defaultValue.autohide),size:Ui(t.size,this.defaultValue.size,[\"proportional\",\"fill\",\"fit\"]),side:Ui(t.side,this.defaultValue.side,[\"right\",\"left\"]),showSlider:Ui(t.showSlider,this.defaultValue.showSlider,[\"always\",\"mouseover\"]),renderCharacters:Ce(t.renderCharacters,this.defaultValue.renderCharacters),scale:Et.clampedInt(t.scale,1,1,3),maxColumn:Et.clampedInt(t.maxColumn,this.defaultValue.maxColumn,1,1e4)}}}function AV(o){return o===\"ctrlCmd\"?Ze?\"metaKey\":\"ctrlKey\":\"altKey\"}class RV extends hi{constructor(){super(77,\"padding\",{top:0,bottom:0},{\"editor.padding.top\":{type:\"number\",default:0,minimum:0,maximum:1e3,description:p(\"padding.top\",\"Controls the amount of space between the top edge of the editor and the first line.\")},\"editor.padding.bottom\":{type:\"number\",default:0,minimum:0,maximum:1e3,description:p(\"padding.bottom\",\"Controls the amount of space between the bottom edge of the editor and the last line.\")}})}validate(e){if(!e||typeof e!=\"object\")return this.defaultValue;const t=e;return{top:Et.clampedInt(t.top,0,0,1e3),bottom:Et.clampedInt(t.bottom,0,0,1e3)}}}class OV extends hi{constructor(){const e={enabled:!0,cycle:!1};super(78,\"parameterHints\",e,{\"editor.parameterHints.enabled\":{type:\"boolean\",default:e.enabled,description:p(\"parameterHints.enabled\",\"Enables a pop-up that shows parameter documentation and type information as you type.\")},\"editor.parameterHints.cycle\":{type:\"boolean\",default:e.cycle,description:p(\"parameterHints.cycle\",\"Controls whether the parameter hints menu cycles or closes when reaching the end of the list.\")}})}validate(e){if(!e||typeof e!=\"object\")return this.defaultValue;const t=e;return{enabled:Ce(t.enabled,this.defaultValue.enabled),cycle:Ce(t.cycle,this.defaultValue.cycle)}}}class PV extends Bg{constructor(){super(131)}compute(e,t,i){return e.pixelRatio}}class FV extends hi{constructor(){const e={other:\"on\",comments:\"off\",strings:\"off\"},t=[{type:\"boolean\"},{type:\"string\",enum:[\"on\",\"inline\",\"off\"],enumDescriptions:[p(\"on\",\"Quick suggestions show inside the suggest widget\"),p(\"inline\",\"Quick suggestions show as ghost text\"),p(\"off\",\"Quick suggestions are disabled\")]}];super(81,\"quickSuggestions\",e,{type:\"object\",additionalProperties:!1,properties:{strings:{anyOf:t,default:e.strings,description:p(\"quickSuggestions.strings\",\"Enable quick suggestions inside strings.\")},comments:{anyOf:t,default:e.comments,description:p(\"quickSuggestions.comments\",\"Enable quick suggestions inside comments.\")},other:{anyOf:t,default:e.other,description:p(\"quickSuggestions.other\",\"Enable quick suggestions outside of strings and comments.\")}},default:e,markdownDescription:p(\"quickSuggestions\",\"Controls whether suggestions should automatically show up while typing. This can be controlled for typing in comments, strings, and other code. Quick suggestion can be configured to show as ghost text or with the suggest widget. Also be aware of the '{0}'-setting which controls if suggestions are triggered by special characters.\",\"#editor.suggestOnTriggerCharacters#\")}),this.defaultValue=e}validate(e){if(typeof e==\"boolean\"){const c=e?\"on\":\"off\";return{comments:c,strings:c,other:c}}if(!e||typeof e!=\"object\")return this.defaultValue;const{other:t,comments:i,strings:n}=e,s=[\"on\",\"inline\",\"off\"];let r,a,l;return typeof t==\"boolean\"?r=t?\"on\":\"off\":r=Ui(t,this.defaultValue.other,s),typeof i==\"boolean\"?a=i?\"on\":\"off\":a=Ui(i,this.defaultValue.comments,s),typeof n==\"boolean\"?l=n?\"on\":\"off\":l=Ui(n,this.defaultValue.strings,s),{other:r,comments:a,strings:l}}}class BV extends hi{constructor(){super(62,\"lineNumbers\",{renderType:1,renderFn:null},{type:\"string\",enum:[\"off\",\"on\",\"relative\",\"interval\"],enumDescriptions:[p(\"lineNumbers.off\",\"Line numbers are not rendered.\"),p(\"lineNumbers.on\",\"Line numbers are rendered as absolute number.\"),p(\"lineNumbers.relative\",\"Line numbers are rendered as distance in lines to cursor position.\"),p(\"lineNumbers.interval\",\"Line numbers are rendered every 10 lines.\")],default:\"on\",description:p(\"lineNumbers\",\"Controls the display of line numbers.\")})}validate(e){let t=this.defaultValue.renderType,i=this.defaultValue.renderFn;return typeof e!=\"undefined\"&&(typeof e==\"function\"?(t=4,i=e):e===\"interval\"?t=3:e===\"relative\"?t=2:e===\"on\"?t=1:t=0),{renderType:t,renderFn:i}}}function G0(o){const e=o.get(89);return e===\"editable\"?o.get(83):e!==\"on\"}class WV extends hi{constructor(){const e=[],t={type:\"number\",description:p(\"rulers.size\",\"Number of monospace characters at which this editor ruler will render.\")};super(93,\"rulers\",e,{type:\"array\",items:{anyOf:[t,{type:[\"object\"],properties:{column:t,color:{type:\"string\",description:p(\"rulers.color\",\"Color of this editor ruler.\"),format:\"color-hex\"}}}]},default:e,description:p(\"rulers\",\"Render vertical rulers after a certain number of monospace characters. Use multiple values for multiple rulers. No rulers are drawn if array is empty.\")})}validate(e){if(Array.isArray(e)){const t=[];for(const i of e)if(typeof i==\"number\")t.push({column:Et.clampedInt(i,0,0,1e4),color:null});else if(i&&typeof i==\"object\"){const n=i;t.push({column:Et.clampedInt(n.column,0,0,1e4),color:n.color})}return t.sort((i,n)=>i.column-n.column),t}return this.defaultValue}}function BT(o,e){if(typeof o!=\"string\")return e;switch(o){case\"hidden\":return 2;case\"visible\":return 3;default:return 1}}class VV extends hi{constructor(){const e={vertical:1,horizontal:1,arrowSize:11,useShadows:!0,verticalHasArrows:!1,horizontalHasArrows:!1,horizontalScrollbarSize:12,horizontalSliderSize:12,verticalScrollbarSize:14,verticalSliderSize:14,handleMouseWheel:!0,alwaysConsumeMouseWheel:!0,scrollByPage:!1};super(94,\"scrollbar\",e,{\"editor.scrollbar.vertical\":{type:\"string\",enum:[\"auto\",\"visible\",\"hidden\"],enumDescriptions:[p(\"scrollbar.vertical.auto\",\"The vertical scrollbar will be visible only when necessary.\"),p(\"scrollbar.vertical.visible\",\"The vertical scrollbar will always be visible.\"),p(\"scrollbar.vertical.fit\",\"The vertical scrollbar will always be hidden.\")],default:\"auto\",description:p(\"scrollbar.vertical\",\"Controls the visibility of the vertical scrollbar.\")},\"editor.scrollbar.horizontal\":{type:\"string\",enum:[\"auto\",\"visible\",\"hidden\"],enumDescriptions:[p(\"scrollbar.horizontal.auto\",\"The horizontal scrollbar will be visible only when necessary.\"),p(\"scrollbar.horizontal.visible\",\"The horizontal scrollbar will always be visible.\"),p(\"scrollbar.horizontal.fit\",\"The horizontal scrollbar will always be hidden.\")],default:\"auto\",description:p(\"scrollbar.horizontal\",\"Controls the visibility of the horizontal scrollbar.\")},\"editor.scrollbar.verticalScrollbarSize\":{type:\"number\",default:e.verticalScrollbarSize,description:p(\"scrollbar.verticalScrollbarSize\",\"The width of the vertical scrollbar.\")},\"editor.scrollbar.horizontalScrollbarSize\":{type:\"number\",default:e.horizontalScrollbarSize,description:p(\"scrollbar.horizontalScrollbarSize\",\"The height of the horizontal scrollbar.\")},\"editor.scrollbar.scrollByPage\":{type:\"boolean\",default:e.scrollByPage,description:p(\"scrollbar.scrollByPage\",\"Controls whether clicks scroll by page or jump to click position.\")}})}validate(e){if(!e||typeof e!=\"object\")return this.defaultValue;const t=e,i=Et.clampedInt(t.horizontalScrollbarSize,this.defaultValue.horizontalScrollbarSize,0,1e3),n=Et.clampedInt(t.verticalScrollbarSize,this.defaultValue.verticalScrollbarSize,0,1e3);return{arrowSize:Et.clampedInt(t.arrowSize,this.defaultValue.arrowSize,0,1e3),vertical:BT(t.vertical,this.defaultValue.vertical),horizontal:BT(t.horizontal,this.defaultValue.horizontal),useShadows:Ce(t.useShadows,this.defaultValue.useShadows),verticalHasArrows:Ce(t.verticalHasArrows,this.defaultValue.verticalHasArrows),horizontalHasArrows:Ce(t.horizontalHasArrows,this.defaultValue.horizontalHasArrows),handleMouseWheel:Ce(t.handleMouseWheel,this.defaultValue.handleMouseWheel),alwaysConsumeMouseWheel:Ce(t.alwaysConsumeMouseWheel,this.defaultValue.alwaysConsumeMouseWheel),horizontalScrollbarSize:i,horizontalSliderSize:Et.clampedInt(t.horizontalSliderSize,i,0,1e3),verticalScrollbarSize:n,verticalSliderSize:Et.clampedInt(t.verticalSliderSize,n,0,1e3),scrollByPage:Ce(t.scrollByPage,this.defaultValue.scrollByPage)}}}const fs=\"inUntrustedWorkspace\",Mn={allowedCharacters:\"editor.unicodeHighlight.allowedCharacters\",invisibleCharacters:\"editor.unicodeHighlight.invisibleCharacters\",nonBasicASCII:\"editor.unicodeHighlight.nonBasicASCII\",ambiguousCharacters:\"editor.unicodeHighlight.ambiguousCharacters\",includeComments:\"editor.unicodeHighlight.includeComments\",includeStrings:\"editor.unicodeHighlight.includeStrings\",allowedLocales:\"editor.unicodeHighlight.allowedLocales\"};class HV extends hi{constructor(){const e={nonBasicASCII:fs,invisibleCharacters:!0,ambiguousCharacters:!0,includeComments:fs,includeStrings:!0,allowedCharacters:{},allowedLocales:{_os:!0,_vscode:!0}};super(115,\"unicodeHighlight\",e,{[Mn.nonBasicASCII]:{restricted:!0,type:[\"boolean\",\"string\"],enum:[!0,!1,fs],default:e.nonBasicASCII,description:p(\"unicodeHighlight.nonBasicASCII\",\"Controls whether all non-basic ASCII characters are highlighted. Only characters between U+0020 and U+007E, tab, line-feed and carriage-return are considered basic ASCII.\")},[Mn.invisibleCharacters]:{restricted:!0,type:\"boolean\",default:e.invisibleCharacters,description:p(\"unicodeHighlight.invisibleCharacters\",\"Controls whether characters that just reserve space or have no width at all are highlighted.\")},[Mn.ambiguousCharacters]:{restricted:!0,type:\"boolean\",default:e.ambiguousCharacters,description:p(\"unicodeHighlight.ambiguousCharacters\",\"Controls whether characters are highlighted that can be confused with basic ASCII characters, except those that are common in the current user locale.\")},[Mn.includeComments]:{restricted:!0,type:[\"boolean\",\"string\"],enum:[!0,!1,fs],default:e.includeComments,description:p(\"unicodeHighlight.includeComments\",\"Controls whether characters in comments should also be subject to unicode highlighting.\")},[Mn.includeStrings]:{restricted:!0,type:[\"boolean\",\"string\"],enum:[!0,!1,fs],default:e.includeStrings,description:p(\"unicodeHighlight.includeStrings\",\"Controls whether characters in strings should also be subject to unicode highlighting.\")},[Mn.allowedCharacters]:{restricted:!0,type:\"object\",default:e.allowedCharacters,description:p(\"unicodeHighlight.allowedCharacters\",\"Defines allowed characters that are not being highlighted.\"),additionalProperties:{type:\"boolean\"}},[Mn.allowedLocales]:{restricted:!0,type:\"object\",additionalProperties:{type:\"boolean\"},default:e.allowedLocales,description:p(\"unicodeHighlight.allowedLocales\",\"Unicode characters that are common in allowed locales are not being highlighted.\")}})}applyUpdate(e,t){let i=!1;t.allowedCharacters&&e&&($s(e.allowedCharacters,t.allowedCharacters)||(e=Object.assign(Object.assign({},e),{allowedCharacters:t.allowedCharacters}),i=!0)),t.allowedLocales&&e&&($s(e.allowedLocales,t.allowedLocales)||(e=Object.assign(Object.assign({},e),{allowedLocales:t.allowedLocales}),i=!0));const n=super.applyUpdate(e,t);return i?new Jf(n.newValue,!0):n}validate(e){if(!e||typeof e!=\"object\")return this.defaultValue;const t=e;return{nonBasicASCII:Au(t.nonBasicASCII,fs,[!0,!1,fs]),invisibleCharacters:Ce(t.invisibleCharacters,this.defaultValue.invisibleCharacters),ambiguousCharacters:Ce(t.ambiguousCharacters,this.defaultValue.ambiguousCharacters),includeComments:Au(t.includeComments,fs,[!0,!1,fs]),includeStrings:Au(t.includeStrings,fs,[!0,!1,fs]),allowedCharacters:this.validateBooleanMap(e.allowedCharacters,this.defaultValue.allowedCharacters),allowedLocales:this.validateBooleanMap(e.allowedLocales,this.defaultValue.allowedLocales)}}validateBooleanMap(e,t){if(typeof e!=\"object\"||!e)return t;const i={};for(const[n,s]of Object.entries(e))s===!0&&(i[n]=!0);return i}}class zV extends hi{constructor(){const e={enabled:!0,mode:\"subwordSmart\"};super(57,\"inlineSuggest\",e,{\"editor.inlineSuggest.enabled\":{type:\"boolean\",default:e.enabled,description:p(\"inlineSuggest.enabled\",\"Controls whether to automatically show inline suggestions in the editor.\")}})}validate(e){if(!e||typeof e!=\"object\")return this.defaultValue;const t=e;return{enabled:Ce(t.enabled,this.defaultValue.enabled),mode:Ui(t.mode,this.defaultValue.mode,[\"prefix\",\"subword\",\"subwordSmart\"])}}}class UV extends hi{constructor(){const e={enabled:Xi.bracketPairColorizationOptions.enabled,independentColorPoolPerBracketType:Xi.bracketPairColorizationOptions.independentColorPoolPerBracketType};super(12,\"bracketPairColorization\",e,{\"editor.bracketPairColorization.enabled\":{type:\"boolean\",default:e.enabled,markdownDescription:p(\"bracketPairColorization.enabled\",\"Controls whether bracket pair colorization is enabled or not. Use {0} to override the bracket highlight colors.\",\"`#workbench.colorCustomizations#`\")},\"editor.bracketPairColorization.independentColorPoolPerBracketType\":{type:\"boolean\",default:e.independentColorPoolPerBracketType,description:p(\"bracketPairColorization.independentColorPoolPerBracketType\",\"Controls whether each bracket type has its own independent color pool.\")}})}validate(e){if(!e||typeof e!=\"object\")return this.defaultValue;const t=e;return{enabled:Ce(t.enabled,this.defaultValue.enabled),independentColorPoolPerBracketType:Ce(t.independentColorPoolPerBracketType,this.defaultValue.independentColorPoolPerBracketType)}}}class $V extends hi{constructor(){const e={bracketPairs:!1,bracketPairsHorizontal:\"active\",highlightActiveBracketPair:!0,indentation:!0,highlightActiveIndentation:!0};super(13,\"guides\",e,{\"editor.guides.bracketPairs\":{type:[\"boolean\",\"string\"],enum:[!0,\"active\",!1],enumDescriptions:[p(\"editor.guides.bracketPairs.true\",\"Enables bracket pair guides.\"),p(\"editor.guides.bracketPairs.active\",\"Enables bracket pair guides only for the active bracket pair.\"),p(\"editor.guides.bracketPairs.false\",\"Disables bracket pair guides.\")],default:e.bracketPairs,description:p(\"editor.guides.bracketPairs\",\"Controls whether bracket pair guides are enabled or not.\")},\"editor.guides.bracketPairsHorizontal\":{type:[\"boolean\",\"string\"],enum:[!0,\"active\",!1],enumDescriptions:[p(\"editor.guides.bracketPairsHorizontal.true\",\"Enables horizontal guides as addition to vertical bracket pair guides.\"),p(\"editor.guides.bracketPairsHorizontal.active\",\"Enables horizontal guides only for the active bracket pair.\"),p(\"editor.guides.bracketPairsHorizontal.false\",\"Disables horizontal bracket pair guides.\")],default:e.bracketPairsHorizontal,description:p(\"editor.guides.bracketPairsHorizontal\",\"Controls whether horizontal bracket pair guides are enabled or not.\")},\"editor.guides.highlightActiveBracketPair\":{type:\"boolean\",default:e.highlightActiveBracketPair,description:p(\"editor.guides.highlightActiveBracketPair\",\"Controls whether the editor should highlight the active bracket pair.\")},\"editor.guides.indentation\":{type:\"boolean\",default:e.indentation,description:p(\"editor.guides.indentation\",\"Controls whether the editor should render indent guides.\")},\"editor.guides.highlightActiveIndentation\":{type:[\"boolean\",\"string\"],enum:[!0,\"always\",!1],enumDescriptions:[p(\"editor.guides.highlightActiveIndentation.true\",\"Highlights the active indent guide.\"),p(\"editor.guides.highlightActiveIndentation.always\",\"Highlights the active indent guide even if bracket guides are highlighted.\"),p(\"editor.guides.highlightActiveIndentation.false\",\"Do not highlight the active indent guide.\")],default:e.highlightActiveIndentation,description:p(\"editor.guides.highlightActiveIndentation\",\"Controls whether the editor should highlight the active indent guide.\")}})}validate(e){if(!e||typeof e!=\"object\")return this.defaultValue;const t=e;return{bracketPairs:Au(t.bracketPairs,this.defaultValue.bracketPairs,[!0,!1,\"active\"]),bracketPairsHorizontal:Au(t.bracketPairsHorizontal,this.defaultValue.bracketPairsHorizontal,[!0,!1,\"active\"]),highlightActiveBracketPair:Ce(t.highlightActiveBracketPair,this.defaultValue.highlightActiveBracketPair),indentation:Ce(t.indentation,this.defaultValue.indentation),highlightActiveIndentation:Au(t.highlightActiveIndentation,this.defaultValue.highlightActiveIndentation,[!0,!1,\"always\"])}}}function Au(o,e,t){const i=t.indexOf(o);return i===-1?e:t[i]}class jV extends hi{constructor(){const e={insertMode:\"insert\",filterGraceful:!0,snippetsPreventQuickSuggestions:!0,localityBonus:!1,shareSuggestSelections:!1,showIcons:!0,showStatusBar:!1,preview:!1,previewMode:\"subwordSmart\",showInlineDetails:!0,showMethods:!0,showFunctions:!0,showConstructors:!0,showDeprecated:!0,showFields:!0,showVariables:!0,showClasses:!0,showStructs:!0,showInterfaces:!0,showModules:!0,showProperties:!0,showEvents:!0,showOperators:!0,showUnits:!0,showValues:!0,showConstants:!0,showEnums:!0,showEnumMembers:!0,showKeywords:!0,showWords:!0,showColors:!0,showFiles:!0,showReferences:!0,showFolders:!0,showTypeParameters:!0,showSnippets:!0,showUsers:!0,showIssues:!0};super(108,\"suggest\",e,{\"editor.suggest.insertMode\":{type:\"string\",enum:[\"insert\",\"replace\"],enumDescriptions:[p(\"suggest.insertMode.insert\",\"Insert suggestion without overwriting text right of the cursor.\"),p(\"suggest.insertMode.replace\",\"Insert suggestion and overwrite text right of the cursor.\")],default:e.insertMode,description:p(\"suggest.insertMode\",\"Controls whether words are overwritten when accepting completions. Note that this depends on extensions opting into this feature.\")},\"editor.suggest.filterGraceful\":{type:\"boolean\",default:e.filterGraceful,description:p(\"suggest.filterGraceful\",\"Controls whether filtering and sorting suggestions accounts for small typos.\")},\"editor.suggest.localityBonus\":{type:\"boolean\",default:e.localityBonus,description:p(\"suggest.localityBonus\",\"Controls whether sorting favors words that appear close to the cursor.\")},\"editor.suggest.shareSuggestSelections\":{type:\"boolean\",default:e.shareSuggestSelections,markdownDescription:p(\"suggest.shareSuggestSelections\",\"Controls whether remembered suggestion selections are shared between multiple workspaces and windows (needs `#editor.suggestSelection#`).\")},\"editor.suggest.snippetsPreventQuickSuggestions\":{type:\"boolean\",default:e.snippetsPreventQuickSuggestions,description:p(\"suggest.snippetsPreventQuickSuggestions\",\"Controls whether an active snippet prevents quick suggestions.\")},\"editor.suggest.showIcons\":{type:\"boolean\",default:e.showIcons,description:p(\"suggest.showIcons\",\"Controls whether to show or hide icons in suggestions.\")},\"editor.suggest.showStatusBar\":{type:\"boolean\",default:e.showStatusBar,description:p(\"suggest.showStatusBar\",\"Controls the visibility of the status bar at the bottom of the suggest widget.\")},\"editor.suggest.preview\":{type:\"boolean\",default:e.preview,description:p(\"suggest.preview\",\"Controls whether to preview the suggestion outcome in the editor.\")},\"editor.suggest.showInlineDetails\":{type:\"boolean\",default:e.showInlineDetails,description:p(\"suggest.showInlineDetails\",\"Controls whether suggest details show inline with the label or only in the details widget\")},\"editor.suggest.maxVisibleSuggestions\":{type:\"number\",deprecationMessage:p(\"suggest.maxVisibleSuggestions.dep\",\"This setting is deprecated. The suggest widget can now be resized.\")},\"editor.suggest.filteredTypes\":{type:\"object\",deprecationMessage:p(\"deprecated\",\"This setting is deprecated, please use separate settings like 'editor.suggest.showKeywords' or 'editor.suggest.showSnippets' instead.\")},\"editor.suggest.showMethods\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showMethods\",\"When enabled IntelliSense shows `method`-suggestions.\")},\"editor.suggest.showFunctions\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showFunctions\",\"When enabled IntelliSense shows `function`-suggestions.\")},\"editor.suggest.showConstructors\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showConstructors\",\"When enabled IntelliSense shows `constructor`-suggestions.\")},\"editor.suggest.showDeprecated\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showDeprecated\",\"When enabled IntelliSense shows `deprecated`-suggestions.\")},\"editor.suggest.showFields\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showFields\",\"When enabled IntelliSense shows `field`-suggestions.\")},\"editor.suggest.showVariables\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showVariables\",\"When enabled IntelliSense shows `variable`-suggestions.\")},\"editor.suggest.showClasses\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showClasss\",\"When enabled IntelliSense shows `class`-suggestions.\")},\"editor.suggest.showStructs\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showStructs\",\"When enabled IntelliSense shows `struct`-suggestions.\")},\"editor.suggest.showInterfaces\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showInterfaces\",\"When enabled IntelliSense shows `interface`-suggestions.\")},\"editor.suggest.showModules\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showModules\",\"When enabled IntelliSense shows `module`-suggestions.\")},\"editor.suggest.showProperties\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showPropertys\",\"When enabled IntelliSense shows `property`-suggestions.\")},\"editor.suggest.showEvents\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showEvents\",\"When enabled IntelliSense shows `event`-suggestions.\")},\"editor.suggest.showOperators\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showOperators\",\"When enabled IntelliSense shows `operator`-suggestions.\")},\"editor.suggest.showUnits\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showUnits\",\"When enabled IntelliSense shows `unit`-suggestions.\")},\"editor.suggest.showValues\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showValues\",\"When enabled IntelliSense shows `value`-suggestions.\")},\"editor.suggest.showConstants\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showConstants\",\"When enabled IntelliSense shows `constant`-suggestions.\")},\"editor.suggest.showEnums\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showEnums\",\"When enabled IntelliSense shows `enum`-suggestions.\")},\"editor.suggest.showEnumMembers\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showEnumMembers\",\"When enabled IntelliSense shows `enumMember`-suggestions.\")},\"editor.suggest.showKeywords\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showKeywords\",\"When enabled IntelliSense shows `keyword`-suggestions.\")},\"editor.suggest.showWords\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showTexts\",\"When enabled IntelliSense shows `text`-suggestions.\")},\"editor.suggest.showColors\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showColors\",\"When enabled IntelliSense shows `color`-suggestions.\")},\"editor.suggest.showFiles\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showFiles\",\"When enabled IntelliSense shows `file`-suggestions.\")},\"editor.suggest.showReferences\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showReferences\",\"When enabled IntelliSense shows `reference`-suggestions.\")},\"editor.suggest.showCustomcolors\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showCustomcolors\",\"When enabled IntelliSense shows `customcolor`-suggestions.\")},\"editor.suggest.showFolders\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showFolders\",\"When enabled IntelliSense shows `folder`-suggestions.\")},\"editor.suggest.showTypeParameters\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showTypeParameters\",\"When enabled IntelliSense shows `typeParameter`-suggestions.\")},\"editor.suggest.showSnippets\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showSnippets\",\"When enabled IntelliSense shows `snippet`-suggestions.\")},\"editor.suggest.showUsers\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showUsers\",\"When enabled IntelliSense shows `user`-suggestions.\")},\"editor.suggest.showIssues\":{type:\"boolean\",default:!0,markdownDescription:p(\"editor.suggest.showIssues\",\"When enabled IntelliSense shows `issues`-suggestions.\")}})}validate(e){if(!e||typeof e!=\"object\")return this.defaultValue;const t=e;return{insertMode:Ui(t.insertMode,this.defaultValue.insertMode,[\"insert\",\"replace\"]),filterGraceful:Ce(t.filterGraceful,this.defaultValue.filterGraceful),snippetsPreventQuickSuggestions:Ce(t.snippetsPreventQuickSuggestions,this.defaultValue.filterGraceful),localityBonus:Ce(t.localityBonus,this.defaultValue.localityBonus),shareSuggestSelections:Ce(t.shareSuggestSelections,this.defaultValue.shareSuggestSelections),showIcons:Ce(t.showIcons,this.defaultValue.showIcons),showStatusBar:Ce(t.showStatusBar,this.defaultValue.showStatusBar),preview:Ce(t.preview,this.defaultValue.preview),previewMode:Ui(t.previewMode,this.defaultValue.previewMode,[\"prefix\",\"subword\",\"subwordSmart\"]),showInlineDetails:Ce(t.showInlineDetails,this.defaultValue.showInlineDetails),showMethods:Ce(t.showMethods,this.defaultValue.showMethods),showFunctions:Ce(t.showFunctions,this.defaultValue.showFunctions),showConstructors:Ce(t.showConstructors,this.defaultValue.showConstructors),showDeprecated:Ce(t.showDeprecated,this.defaultValue.showDeprecated),showFields:Ce(t.showFields,this.defaultValue.showFields),showVariables:Ce(t.showVariables,this.defaultValue.showVariables),showClasses:Ce(t.showClasses,this.defaultValue.showClasses),showStructs:Ce(t.showStructs,this.defaultValue.showStructs),showInterfaces:Ce(t.showInterfaces,this.defaultValue.showInterfaces),showModules:Ce(t.showModules,this.defaultValue.showModules),showProperties:Ce(t.showProperties,this.defaultValue.showProperties),showEvents:Ce(t.showEvents,this.defaultValue.showEvents),showOperators:Ce(t.showOperators,this.defaultValue.showOperators),showUnits:Ce(t.showUnits,this.defaultValue.showUnits),showValues:Ce(t.showValues,this.defaultValue.showValues),showConstants:Ce(t.showConstants,this.defaultValue.showConstants),showEnums:Ce(t.showEnums,this.defaultValue.showEnums),showEnumMembers:Ce(t.showEnumMembers,this.defaultValue.showEnumMembers),showKeywords:Ce(t.showKeywords,this.defaultValue.showKeywords),showWords:Ce(t.showWords,this.defaultValue.showWords),showColors:Ce(t.showColors,this.defaultValue.showColors),showFiles:Ce(t.showFiles,this.defaultValue.showFiles),showReferences:Ce(t.showReferences,this.defaultValue.showReferences),showFolders:Ce(t.showFolders,this.defaultValue.showFolders),showTypeParameters:Ce(t.showTypeParameters,this.defaultValue.showTypeParameters),showSnippets:Ce(t.showSnippets,this.defaultValue.showSnippets),showUsers:Ce(t.showUsers,this.defaultValue.showUsers),showIssues:Ce(t.showIssues,this.defaultValue.showIssues)}}}class KV extends hi{constructor(){super(104,\"smartSelect\",{selectLeadingAndTrailingWhitespace:!0},{\"editor.smartSelect.selectLeadingAndTrailingWhitespace\":{description:p(\"selectLeadingAndTrailingWhitespace\",\"Whether leading and trailing whitespace should always be selected.\"),default:!0,type:\"boolean\"}})}validate(e){return!e||typeof e!=\"object\"?this.defaultValue:{selectLeadingAndTrailingWhitespace:Ce(e.selectLeadingAndTrailingWhitespace,this.defaultValue.selectLeadingAndTrailingWhitespace)}}}class qV extends Bg{constructor(){super(132)}compute(e,t,i){return t.get(83)?!0:e.tabFocusMode}}function GV(o){switch(o){case\"none\":return 0;case\"same\":return 1;case\"indent\":return 2;case\"deepIndent\":return 3}}class ZV extends Bg{constructor(){super(134)}compute(e,t,i){const n=t.get(133);return{isDominatedByLongLines:e.isDominatedByLongLines,isWordWrapMinified:n.isWordWrapMinified,isViewportWrapping:n.isViewportWrapping,wrappingColumn:n.wrappingColumn}}}class YV extends hi{constructor(){const e={enabled:!0};super(32,\"dropIntoEditor\",e,{\"editor.dropIntoEditor.enabled\":{type:\"boolean\",default:e.enabled,markdownDescription:p(\"dropIntoEditor.enabled\",\"Controls whether you can drag and drop a file into a text editor by holding down `shift` (instead of opening the file in an editor).\")}})}validate(e){return!e||typeof e!=\"object\"?this.defaultValue:{enabled:Ce(e.enabled,this.defaultValue.enabled)}}}const XV=\"Consolas, 'Courier New', monospace\",QV=\"Menlo, Monaco, 'Courier New', monospace\",JV=\"'Droid Sans Mono', 'monospace', monospace\",ns={fontFamily:Ze?QV:sn?JV:XV,fontWeight:\"normal\",fontSize:Ze?12:14,lineHeight:0,letterSpacing:0},cu=[];function J(o){return cu[o.id]=o,o}const Jo={acceptSuggestionOnCommitCharacter:J(new Ge(0,\"acceptSuggestionOnCommitCharacter\",!0,{markdownDescription:p(\"acceptSuggestionOnCommitCharacter\",\"Controls whether suggestions should be accepted on commit characters. For example, in JavaScript, the semi-colon (`; `) can be a commit character that accepts a suggestion and types that character.\")})),acceptSuggestionOnEnter:J(new mi(1,\"acceptSuggestionOnEnter\",\"on\",[\"on\",\"smart\",\"off\"],{markdownEnumDescriptions:[\"\",p(\"acceptSuggestionOnEnterSmart\",\"Only accept a suggestion with `Enter` when it makes a textual change.\"),\"\"],markdownDescription:p(\"acceptSuggestionOnEnter\",\"Controls whether suggestions should be accepted on `Enter`, in addition to `Tab`. Helps to avoid ambiguity between inserting new lines or accepting suggestions.\")})),accessibilitySupport:J(new _V),accessibilityPageSize:J(new Et(3,\"accessibilityPageSize\",10,1,1073741824,{description:p(\"accessibilityPageSize\",\"Controls the number of lines in the editor that can be read out by a screen reader at once. When we detect a screen reader we automatically set the default to be 500. Warning: this has a performance implication for numbers larger than the default.\")})),ariaLabel:J(new Gn(4,\"ariaLabel\",p(\"editorViewAccessibleLabel\",\"Editor content\"))),autoClosingBrackets:J(new mi(5,\"autoClosingBrackets\",\"languageDefined\",[\"always\",\"languageDefined\",\"beforeWhitespace\",\"never\"],{enumDescriptions:[\"\",p(\"editor.autoClosingBrackets.languageDefined\",\"Use language configurations to determine when to autoclose brackets.\"),p(\"editor.autoClosingBrackets.beforeWhitespace\",\"Autoclose brackets only when the cursor is to the left of whitespace.\"),\"\"],description:p(\"autoClosingBrackets\",\"Controls whether the editor should automatically close brackets after the user adds an opening bracket.\")})),autoClosingDelete:J(new mi(6,\"autoClosingDelete\",\"auto\",[\"always\",\"auto\",\"never\"],{enumDescriptions:[\"\",p(\"editor.autoClosingDelete.auto\",\"Remove adjacent closing quotes or brackets only if they were automatically inserted.\"),\"\"],description:p(\"autoClosingDelete\",\"Controls whether the editor should remove adjacent closing quotes or brackets when deleting.\")})),autoClosingOvertype:J(new mi(7,\"autoClosingOvertype\",\"auto\",[\"always\",\"auto\",\"never\"],{enumDescriptions:[\"\",p(\"editor.autoClosingOvertype.auto\",\"Type over closing quotes or brackets only if they were automatically inserted.\"),\"\"],description:p(\"autoClosingOvertype\",\"Controls whether the editor should type over closing quotes or brackets.\")})),autoClosingQuotes:J(new mi(8,\"autoClosingQuotes\",\"languageDefined\",[\"always\",\"languageDefined\",\"beforeWhitespace\",\"never\"],{enumDescriptions:[\"\",p(\"editor.autoClosingQuotes.languageDefined\",\"Use language configurations to determine when to autoclose quotes.\"),p(\"editor.autoClosingQuotes.beforeWhitespace\",\"Autoclose quotes only when the cursor is to the left of whitespace.\"),\"\"],description:p(\"autoClosingQuotes\",\"Controls whether the editor should automatically close quotes after the user adds an opening quote.\")})),autoIndent:J(new hf(9,\"autoIndent\",4,\"full\",[\"none\",\"keep\",\"brackets\",\"advanced\",\"full\"],mV,{enumDescriptions:[p(\"editor.autoIndent.none\",\"The editor will not insert indentation automatically.\"),p(\"editor.autoIndent.keep\",\"The editor will keep the current line's indentation.\"),p(\"editor.autoIndent.brackets\",\"The editor will keep the current line's indentation and honor language defined brackets.\"),p(\"editor.autoIndent.advanced\",\"The editor will keep the current line's indentation, honor language defined brackets and invoke special onEnterRules defined by languages.\"),p(\"editor.autoIndent.full\",\"The editor will keep the current line's indentation, honor language defined brackets, invoke special onEnterRules defined by languages, and honor indentationRules defined by languages.\")],description:p(\"autoIndent\",\"Controls whether the editor should automatically adjust the indentation when users type, paste, move or indent lines.\")})),automaticLayout:J(new Ge(10,\"automaticLayout\",!1)),autoSurround:J(new mi(11,\"autoSurround\",\"languageDefined\",[\"languageDefined\",\"quotes\",\"brackets\",\"never\"],{enumDescriptions:[p(\"editor.autoSurround.languageDefined\",\"Use language configurations to determine when to automatically surround selections.\"),p(\"editor.autoSurround.quotes\",\"Surround with quotes but not brackets.\"),p(\"editor.autoSurround.brackets\",\"Surround with brackets but not quotes.\"),\"\"],description:p(\"autoSurround\",\"Controls whether the editor should automatically surround selections when typing quotes or brackets.\")})),bracketPairColorization:J(new UV),bracketPairGuides:J(new $V),stickyTabStops:J(new Ge(106,\"stickyTabStops\",!1,{description:p(\"stickyTabStops\",\"Emulate selection behavior of tab characters when using spaces for indentation. Selection will stick to tab stops.\")})),codeLens:J(new Ge(14,\"codeLens\",!0,{description:p(\"codeLens\",\"Controls whether the editor shows CodeLens.\")})),codeLensFontFamily:J(new Gn(15,\"codeLensFontFamily\",\"\",{description:p(\"codeLensFontFamily\",\"Controls the font family for CodeLens.\")})),codeLensFontSize:J(new Et(16,\"codeLensFontSize\",0,0,100,{type:\"number\",default:0,minimum:0,maximum:100,markdownDescription:p(\"codeLensFontSize\",\"Controls the font size in pixels for CodeLens. When set to `0`, 90% of `#editor.fontSize#` is used.\")})),colorDecorators:J(new Ge(17,\"colorDecorators\",!0,{description:p(\"colorDecorators\",\"Controls whether the editor should render the inline color decorators and color picker.\")})),columnSelection:J(new Ge(18,\"columnSelection\",!1,{description:p(\"columnSelection\",\"Enable that the selection with the mouse and keys is doing column selection.\")})),comments:J(new bV),contextmenu:J(new Ge(20,\"contextmenu\",!0)),copyWithSyntaxHighlighting:J(new Ge(21,\"copyWithSyntaxHighlighting\",!0,{description:p(\"copyWithSyntaxHighlighting\",\"Controls whether syntax highlighting should be copied into the clipboard.\")})),cursorBlinking:J(new hf(22,\"cursorBlinking\",1,\"blink\",[\"blink\",\"smooth\",\"phase\",\"expand\",\"solid\"],vV,{description:p(\"cursorBlinking\",\"Control the cursor animation style.\")})),cursorSmoothCaretAnimation:J(new Ge(23,\"cursorSmoothCaretAnimation\",!1,{description:p(\"cursorSmoothCaretAnimation\",\"Controls whether the smooth caret animation should be enabled.\")})),cursorStyle:J(new hf(24,\"cursorStyle\",Bi.Line,\"line\",[\"line\",\"block\",\"underline\",\"line-thin\",\"block-outline\",\"underline-thin\"],CV,{description:p(\"cursorStyle\",\"Controls the cursor style.\")})),cursorSurroundingLines:J(new Et(25,\"cursorSurroundingLines\",0,0,1073741824,{description:p(\"cursorSurroundingLines\",\"Controls the minimal number of visible leading and trailing lines surrounding the cursor. Known as 'scrollOff' or 'scrollOffset' in some other editors.\")})),cursorSurroundingLinesStyle:J(new mi(26,\"cursorSurroundingLinesStyle\",\"default\",[\"default\",\"all\"],{enumDescriptions:[p(\"cursorSurroundingLinesStyle.default\",\"`cursorSurroundingLines` is enforced only when triggered via the keyboard or API.\"),p(\"cursorSurroundingLinesStyle.all\",\"`cursorSurroundingLines` is enforced always.\")],description:p(\"cursorSurroundingLinesStyle\",\"Controls when `cursorSurroundingLines` should be enforced.\")})),cursorWidth:J(new Et(27,\"cursorWidth\",0,0,1073741824,{markdownDescription:p(\"cursorWidth\",\"Controls the width of the cursor when `#editor.cursorStyle#` is set to `line`.\")})),disableLayerHinting:J(new Ge(28,\"disableLayerHinting\",!1)),disableMonospaceOptimizations:J(new Ge(29,\"disableMonospaceOptimizations\",!1)),domReadOnly:J(new Ge(30,\"domReadOnly\",!1)),dragAndDrop:J(new Ge(31,\"dragAndDrop\",!0,{description:p(\"dragAndDrop\",\"Controls whether the editor should allow moving selections via drag and drop.\")})),emptySelectionClipboard:J(new SV),dropIntoEditor:J(new YV),experimental:J(new EV),extraEditorClassName:J(new Gn(35,\"extraEditorClassName\",\"\")),fastScrollSensitivity:J(new Er(36,\"fastScrollSensitivity\",5,o=>o<=0?5:o,{markdownDescription:p(\"fastScrollSensitivity\",\"Scrolling speed multiplier when pressing `Alt`.\")})),find:J(new yV),fixedOverflowWidgets:J(new Ge(38,\"fixedOverflowWidgets\",!1)),folding:J(new Ge(39,\"folding\",!0,{description:p(\"folding\",\"Controls whether the editor has code folding enabled.\")})),foldingStrategy:J(new mi(40,\"foldingStrategy\",\"auto\",[\"auto\",\"indentation\"],{enumDescriptions:[p(\"foldingStrategy.auto\",\"Use a language-specific folding strategy if available, else the indentation-based one.\"),p(\"foldingStrategy.indentation\",\"Use the indentation-based folding strategy.\")],description:p(\"foldingStrategy\",\"Controls the strategy for computing folding ranges.\")})),foldingHighlight:J(new Ge(41,\"foldingHighlight\",!0,{description:p(\"foldingHighlight\",\"Controls whether the editor should highlight folded ranges.\")})),foldingImportsByDefault:J(new Ge(42,\"foldingImportsByDefault\",!1,{description:p(\"foldingImportsByDefault\",\"Controls whether the editor automatically collapses import ranges.\")})),foldingMaximumRegions:J(new Et(43,\"foldingMaximumRegions\",5e3,10,65e3,{description:p(\"foldingMaximumRegions\",\"The maximum number of foldable regions. Increasing this value may result in the editor becoming less responsive when the current source has a large number of foldable regions.\")})),unfoldOnClickAfterEndOfLine:J(new Ge(44,\"unfoldOnClickAfterEndOfLine\",!1,{description:p(\"unfoldOnClickAfterEndOfLine\",\"Controls whether clicking on the empty content after a folded line will unfold the line.\")})),fontFamily:J(new Gn(45,\"fontFamily\",ns.fontFamily,{description:p(\"fontFamily\",\"Controls the font family.\")})),fontInfo:J(new LV),fontLigatures2:J(new vs),fontSize:J(new DV),fontWeight:J(new Sr),formatOnPaste:J(new Ge(50,\"formatOnPaste\",!1,{description:p(\"formatOnPaste\",\"Controls whether the editor should automatically format the pasted content. A formatter must be available and the formatter should be able to format a range in a document.\")})),formatOnType:J(new Ge(51,\"formatOnType\",!1,{description:p(\"formatOnType\",\"Controls whether the editor should automatically format the line after typing.\")})),glyphMargin:J(new Ge(52,\"glyphMargin\",!0,{description:p(\"glyphMargin\",\"Controls whether the editor should render the vertical glyph margin. Glyph margin is mostly used for debugging.\")})),gotoLocation:J(new kV),hideCursorInOverviewRuler:J(new Ge(54,\"hideCursorInOverviewRuler\",!1,{description:p(\"hideCursorInOverviewRuler\",\"Controls whether the cursor should be hidden in the overview ruler.\")})),hover:J(new xV),inDiffEditor:J(new Ge(56,\"inDiffEditor\",!1)),letterSpacing:J(new Er(58,\"letterSpacing\",ns.letterSpacing,o=>Er.clamp(o,-5,20),{description:p(\"letterSpacing\",\"Controls the letter spacing in pixels.\")})),lightbulb:J(new IV),lineDecorationsWidth:J(new mh(60,\"lineDecorationsWidth\",10)),lineHeight:J(new TV),lineNumbers:J(new BV),lineNumbersMinChars:J(new Et(63,\"lineNumbersMinChars\",5,1,300)),linkedEditing:J(new Ge(64,\"linkedEditing\",!1,{description:p(\"linkedEditing\",\"Controls whether the editor has linked editing enabled. Depending on the language, related symbols, e.g. HTML tags, are updated while editing.\")})),links:J(new Ge(65,\"links\",!0,{description:p(\"links\",\"Controls whether the editor should detect links and make them clickable.\")})),matchBrackets:J(new mi(66,\"matchBrackets\",\"always\",[\"always\",\"near\",\"never\"],{description:p(\"matchBrackets\",\"Highlight matching brackets.\")})),minimap:J(new MV),mouseStyle:J(new mi(68,\"mouseStyle\",\"text\",[\"text\",\"default\",\"copy\"])),mouseWheelScrollSensitivity:J(new Er(69,\"mouseWheelScrollSensitivity\",1,o=>o===0?1:o,{markdownDescription:p(\"mouseWheelScrollSensitivity\",\"A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.\")})),mouseWheelZoom:J(new Ge(70,\"mouseWheelZoom\",!1,{markdownDescription:p(\"mouseWheelZoom\",\"Zoom the font of the editor when using mouse wheel and holding `Ctrl`.\")})),multiCursorMergeOverlapping:J(new Ge(71,\"multiCursorMergeOverlapping\",!0,{description:p(\"multiCursorMergeOverlapping\",\"Merge multiple cursors when they are overlapping.\")})),multiCursorModifier:J(new hf(72,\"multiCursorModifier\",\"altKey\",\"alt\",[\"ctrlCmd\",\"alt\"],AV,{markdownEnumDescriptions:[p(\"multiCursorModifier.ctrlCmd\",\"Maps to `Control` on Windows and Linux and to `Command` on macOS.\"),p(\"multiCursorModifier.alt\",\"Maps to `Alt` on Windows and Linux and to `Option` on macOS.\")],markdownDescription:p({key:\"multiCursorModifier\",comment:[\"- `ctrlCmd` refers to a value the setting can take and should not be localized.\",\"- `Control` and `Command` refer to the modifier keys Ctrl or Cmd on the keyboard and can be localized.\"]},\"The modifier to be used to add multiple cursors with the mouse. The Go to Definition and Open Link mouse gestures will adapt such that they do not conflict with the [multicursor modifier](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).\")})),multiCursorPaste:J(new mi(73,\"multiCursorPaste\",\"spread\",[\"spread\",\"full\"],{markdownEnumDescriptions:[p(\"multiCursorPaste.spread\",\"Each cursor pastes a single line of the text.\"),p(\"multiCursorPaste.full\",\"Each cursor pastes the full text.\")],markdownDescription:p(\"multiCursorPaste\",\"Controls pasting when the line count of the pasted text matches the cursor count.\")})),occurrencesHighlight:J(new Ge(74,\"occurrencesHighlight\",!0,{description:p(\"occurrencesHighlight\",\"Controls whether the editor should highlight semantic symbol occurrences.\")})),overviewRulerBorder:J(new Ge(75,\"overviewRulerBorder\",!0,{description:p(\"overviewRulerBorder\",\"Controls whether a border should be drawn around the overview ruler.\")})),overviewRulerLanes:J(new Et(76,\"overviewRulerLanes\",3,0,3)),padding:J(new RV),parameterHints:J(new OV),peekWidgetDefaultFocus:J(new mi(79,\"peekWidgetDefaultFocus\",\"tree\",[\"tree\",\"editor\"],{enumDescriptions:[p(\"peekWidgetDefaultFocus.tree\",\"Focus the tree when opening peek\"),p(\"peekWidgetDefaultFocus.editor\",\"Focus the editor when opening peek\")],description:p(\"peekWidgetDefaultFocus\",\"Controls whether to focus the inline editor or the tree in the peek widget.\")})),definitionLinkOpensInPeek:J(new Ge(80,\"definitionLinkOpensInPeek\",!1,{description:p(\"definitionLinkOpensInPeek\",\"Controls whether the Go to Definition mouse gesture always opens the peek widget.\")})),quickSuggestions:J(new FV),quickSuggestionsDelay:J(new Et(82,\"quickSuggestionsDelay\",10,0,1073741824,{description:p(\"quickSuggestionsDelay\",\"Controls the delay in milliseconds after which quick suggestions will show up.\")})),readOnly:J(new Ge(83,\"readOnly\",!1)),renameOnType:J(new Ge(84,\"renameOnType\",!1,{description:p(\"renameOnType\",\"Controls whether the editor auto renames on type.\"),markdownDeprecationMessage:p(\"renameOnTypeDeprecate\",\"Deprecated, use `editor.linkedEditing` instead.\")})),renderControlCharacters:J(new Ge(85,\"renderControlCharacters\",!0,{description:p(\"renderControlCharacters\",\"Controls whether the editor should render control characters.\"),restricted:!0})),renderFinalNewline:J(new Ge(86,\"renderFinalNewline\",!0,{description:p(\"renderFinalNewline\",\"Render last line number when the file ends with a newline.\")})),renderLineHighlight:J(new mi(87,\"renderLineHighlight\",\"line\",[\"none\",\"gutter\",\"line\",\"all\"],{enumDescriptions:[\"\",\"\",\"\",p(\"renderLineHighlight.all\",\"Highlights both the gutter and the current line.\")],description:p(\"renderLineHighlight\",\"Controls how the editor should render the current line highlight.\")})),renderLineHighlightOnlyWhenFocus:J(new Ge(88,\"renderLineHighlightOnlyWhenFocus\",!1,{description:p(\"renderLineHighlightOnlyWhenFocus\",\"Controls if the editor should render the current line highlight only when the editor is focused.\")})),renderValidationDecorations:J(new mi(89,\"renderValidationDecorations\",\"editable\",[\"editable\",\"on\",\"off\"])),renderWhitespace:J(new mi(90,\"renderWhitespace\",\"selection\",[\"none\",\"boundary\",\"selection\",\"trailing\",\"all\"],{enumDescriptions:[\"\",p(\"renderWhitespace.boundary\",\"Render whitespace characters except for single spaces between words.\"),p(\"renderWhitespace.selection\",\"Render whitespace characters only on selected text.\"),p(\"renderWhitespace.trailing\",\"Render only trailing whitespace characters.\"),\"\"],description:p(\"renderWhitespace\",\"Controls how the editor should render whitespace characters.\")})),revealHorizontalRightPadding:J(new Et(91,\"revealHorizontalRightPadding\",30,0,1e3)),roundedSelection:J(new Ge(92,\"roundedSelection\",!0,{description:p(\"roundedSelection\",\"Controls whether selections should have rounded corners.\")})),rulers:J(new WV),scrollbar:J(new VV),scrollBeyondLastColumn:J(new Et(95,\"scrollBeyondLastColumn\",4,0,1073741824,{description:p(\"scrollBeyondLastColumn\",\"Controls the number of extra characters beyond which the editor will scroll horizontally.\")})),scrollBeyondLastLine:J(new Ge(96,\"scrollBeyondLastLine\",!0,{description:p(\"scrollBeyondLastLine\",\"Controls whether the editor will scroll beyond the last line.\")})),scrollPredominantAxis:J(new Ge(97,\"scrollPredominantAxis\",!0,{description:p(\"scrollPredominantAxis\",\"Scroll only along the predominant axis when scrolling both vertically and horizontally at the same time. Prevents horizontal drift when scrolling vertically on a trackpad.\")})),selectionClipboard:J(new Ge(98,\"selectionClipboard\",!0,{description:p(\"selectionClipboard\",\"Controls whether the Linux primary clipboard should be supported.\"),included:sn})),selectionHighlight:J(new Ge(99,\"selectionHighlight\",!0,{description:p(\"selectionHighlight\",\"Controls whether the editor should highlight matches similar to the selection.\")})),selectOnLineNumbers:J(new Ge(100,\"selectOnLineNumbers\",!0)),showFoldingControls:J(new mi(101,\"showFoldingControls\",\"mouseover\",[\"always\",\"never\",\"mouseover\"],{enumDescriptions:[p(\"showFoldingControls.always\",\"Always show the folding controls.\"),p(\"showFoldingControls.never\",\"Never show the folding controls and reduce the gutter size.\"),p(\"showFoldingControls.mouseover\",\"Only show the folding controls when the mouse is over the gutter.\")],description:p(\"showFoldingControls\",\"Controls when the folding controls on the gutter are shown.\")})),showUnused:J(new Ge(102,\"showUnused\",!0,{description:p(\"showUnused\",\"Controls fading out of unused code.\")})),showDeprecated:J(new Ge(128,\"showDeprecated\",!0,{description:p(\"showDeprecated\",\"Controls strikethrough deprecated variables.\")})),inlayHints:J(new NV),snippetSuggestions:J(new mi(103,\"snippetSuggestions\",\"inline\",[\"top\",\"bottom\",\"inline\",\"none\"],{enumDescriptions:[p(\"snippetSuggestions.top\",\"Show snippet suggestions on top of other suggestions.\"),p(\"snippetSuggestions.bottom\",\"Show snippet suggestions below other suggestions.\"),p(\"snippetSuggestions.inline\",\"Show snippets suggestions with other suggestions.\"),p(\"snippetSuggestions.none\",\"Do not show snippet suggestions.\")],description:p(\"snippetSuggestions\",\"Controls whether snippets are shown with other suggestions and how they are sorted.\")})),smartSelect:J(new KV),smoothScrolling:J(new Ge(105,\"smoothScrolling\",!1,{description:p(\"smoothScrolling\",\"Controls whether the editor will scroll using an animation.\")})),stopRenderingLineAfter:J(new Et(107,\"stopRenderingLineAfter\",1e4,-1,1073741824)),suggest:J(new jV),inlineSuggest:J(new zV),suggestFontSize:J(new Et(109,\"suggestFontSize\",0,0,1e3,{markdownDescription:p(\"suggestFontSize\",\"Font size for the suggest widget. When set to {0}, the value of {1} is used.\",\"`0`\",\"`#editor.fontSize#`\")})),suggestLineHeight:J(new Et(110,\"suggestLineHeight\",0,0,1e3,{markdownDescription:p(\"suggestLineHeight\",\"Line height for the suggest widget. When set to {0}, the value of {1} is used. The minimum value is 8.\",\"`0`\",\"`#editor.lineHeight#`\")})),suggestOnTriggerCharacters:J(new Ge(111,\"suggestOnTriggerCharacters\",!0,{description:p(\"suggestOnTriggerCharacters\",\"Controls whether suggestions should automatically show up when typing trigger characters.\")})),suggestSelection:J(new mi(112,\"suggestSelection\",\"first\",[\"first\",\"recentlyUsed\",\"recentlyUsedByPrefix\"],{markdownEnumDescriptions:[p(\"suggestSelection.first\",\"Always select the first suggestion.\"),p(\"suggestSelection.recentlyUsed\",\"Select recent suggestions unless further typing selects one, e.g. `console.| -> console.log` because `log` has been completed recently.\"),p(\"suggestSelection.recentlyUsedByPrefix\",\"Select suggestions based on previous prefixes that have completed those suggestions, e.g. `co -> console` and `con -> const`.\")],description:p(\"suggestSelection\",\"Controls how suggestions are pre-selected when showing the suggest list.\")})),tabCompletion:J(new mi(113,\"tabCompletion\",\"off\",[\"on\",\"off\",\"onlySnippets\"],{enumDescriptions:[p(\"tabCompletion.on\",\"Tab complete will insert the best matching suggestion when pressing tab.\"),p(\"tabCompletion.off\",\"Disable tab completions.\"),p(\"tabCompletion.onlySnippets\",\"Tab complete snippets when their prefix match. Works best when 'quickSuggestions' aren't enabled.\")],description:p(\"tabCompletion\",\"Enables tab completions.\")})),tabIndex:J(new Et(114,\"tabIndex\",0,-1,1073741824)),unicodeHighlight:J(new HV),unusualLineTerminators:J(new mi(116,\"unusualLineTerminators\",\"prompt\",[\"auto\",\"off\",\"prompt\"],{enumDescriptions:[p(\"unusualLineTerminators.auto\",\"Unusual line terminators are automatically removed.\"),p(\"unusualLineTerminators.off\",\"Unusual line terminators are ignored.\"),p(\"unusualLineTerminators.prompt\",\"Unusual line terminators prompt to be removed.\")],description:p(\"unusualLineTerminators\",\"Remove unusual line terminators that might cause problems.\")})),useShadowDOM:J(new Ge(117,\"useShadowDOM\",!0)),useTabStops:J(new Ge(118,\"useTabStops\",!0,{description:p(\"useTabStops\",\"Inserting and deleting whitespace follows tab stops.\")})),wordSeparators:J(new Gn(119,\"wordSeparators\",hP,{description:p(\"wordSeparators\",\"Characters that will be used as word separators when doing word related navigations or operations.\")})),wordWrap:J(new mi(120,\"wordWrap\",\"off\",[\"off\",\"on\",\"wordWrapColumn\",\"bounded\"],{markdownEnumDescriptions:[p(\"wordWrap.off\",\"Lines will never wrap.\"),p(\"wordWrap.on\",\"Lines will wrap at the viewport width.\"),p({key:\"wordWrap.wordWrapColumn\",comment:[\"- `editor.wordWrapColumn` refers to a different setting and should not be localized.\"]},\"Lines will wrap at `#editor.wordWrapColumn#`.\"),p({key:\"wordWrap.bounded\",comment:[\"- viewport means the edge of the visible window size.\",\"- `editor.wordWrapColumn` refers to a different setting and should not be localized.\"]},\"Lines will wrap at the minimum of viewport and `#editor.wordWrapColumn#`.\")],description:p({key:\"wordWrap\",comment:[\"- 'off', 'on', 'wordWrapColumn' and 'bounded' refer to values the setting can take and should not be localized.\",\"- `editor.wordWrapColumn` refers to a different setting and should not be localized.\"]},\"Controls how lines should wrap.\")})),wordWrapBreakAfterCharacters:J(new Gn(121,\"wordWrapBreakAfterCharacters\",\" \t})]?|/&.,;\\xA2\\xB0\\u2032\\u2033\\u2030\\u2103\\u3001\\u3002\\uFF61\\uFF64\\uFFE0\\uFF0C\\uFF0E\\uFF1A\\uFF1B\\uFF1F\\uFF01\\uFF05\\u30FB\\uFF65\\u309D\\u309E\\u30FD\\u30FE\\u30FC\\u30A1\\u30A3\\u30A5\\u30A7\\u30A9\\u30C3\\u30E3\\u30E5\\u30E7\\u30EE\\u30F5\\u30F6\\u3041\\u3043\\u3045\\u3047\\u3049\\u3063\\u3083\\u3085\\u3087\\u308E\\u3095\\u3096\\u31F0\\u31F1\\u31F2\\u31F3\\u31F4\\u31F5\\u31F6\\u31F7\\u31F8\\u31F9\\u31FA\\u31FB\\u31FC\\u31FD\\u31FE\\u31FF\\u3005\\u303B\\uFF67\\uFF68\\uFF69\\uFF6A\\uFF6B\\uFF6C\\uFF6D\\uFF6E\\uFF6F\\uFF70\\u201D\\u3009\\u300B\\u300D\\u300F\\u3011\\u3015\\uFF09\\uFF3D\\uFF5D\\uFF63\")),wordWrapBreakBeforeCharacters:J(new Gn(122,\"wordWrapBreakBeforeCharacters\",\"([{\\u2018\\u201C\\u3008\\u300A\\u300C\\u300E\\u3010\\u3014\\uFF08\\uFF3B\\uFF5B\\uFF62\\xA3\\xA5\\uFF04\\uFFE1\\uFFE5+\\uFF0B\")),wordWrapColumn:J(new Et(123,\"wordWrapColumn\",80,1,1073741824,{markdownDescription:p({key:\"wordWrapColumn\",comment:[\"- `editor.wordWrap` refers to a different setting and should not be localized.\",\"- 'wordWrapColumn' and 'bounded' refer to values the different setting can take and should not be localized.\"]},\"Controls the wrapping column of the editor when `#editor.wordWrap#` is `wordWrapColumn` or `bounded`.\")})),wordWrapOverride1:J(new mi(124,\"wordWrapOverride1\",\"inherit\",[\"off\",\"on\",\"inherit\"])),wordWrapOverride2:J(new mi(125,\"wordWrapOverride2\",\"inherit\",[\"off\",\"on\",\"inherit\"])),wrappingIndent:J(new hf(126,\"wrappingIndent\",1,\"same\",[\"none\",\"same\",\"indent\",\"deepIndent\"],GV,{enumDescriptions:[p(\"wrappingIndent.none\",\"No indentation. Wrapped lines begin at column 1.\"),p(\"wrappingIndent.same\",\"Wrapped lines get the same indentation as the parent.\"),p(\"wrappingIndent.indent\",\"Wrapped lines get +1 indentation toward the parent.\"),p(\"wrappingIndent.deepIndent\",\"Wrapped lines get +2 indentation toward the parent.\")],description:p(\"wrappingIndent\",\"Controls the indentation of wrapped lines.\")})),wrappingStrategy:J(new mi(127,\"wrappingStrategy\",\"simple\",[\"simple\",\"advanced\"],{enumDescriptions:[p(\"wrappingStrategy.simple\",\"Assumes that all characters are of the same width. This is a fast algorithm that works correctly for monospace fonts and certain scripts (like Latin characters) where glyphs are of equal width.\"),p(\"wrappingStrategy.advanced\",\"Delegates wrapping points computation to the browser. This is a slow algorithm, that might cause freezes for large files, but it works correctly in all cases.\")],description:p(\"wrappingStrategy\",\"Controls the algorithm that computes wrapping points.\")})),editorClassName:J(new wV),pixelRatio:J(new PV),tabFocusMode:J(new qV),layoutInfo:J(new Mu),wrappingInfo:J(new ZV)},tl=new class{constructor(){this._zoomLevel=0,this._onDidChangeZoomLevel=new O,this.onDidChangeZoomLevel=this._onDidChangeZoomLevel.event}getZoomLevel(){return this._zoomLevel}setZoomLevel(o){o=Math.min(Math.max(-5,o),20),this._zoomLevel!==o&&(this._zoomLevel=o,this._onDidChangeZoomLevel.fire(this._zoomLevel))}},eH=Ze?1.5:1.35,Aw=8;class bd{constructor(e){this._bareFontInfoBrand=void 0,this.pixelRatio=e.pixelRatio,this.fontFamily=String(e.fontFamily),this.fontWeight=String(e.fontWeight),this.fontSize=e.fontSize,this.fontFeatureSettings=e.fontFeatureSettings,this.lineHeight=e.lineHeight|0,this.letterSpacing=e.letterSpacing}static createFromValidatedSettings(e,t,i){const n=e.get(45),s=e.get(49),r=e.get(48),a=e.get(47),l=e.get(61),c=e.get(58);return bd._create(n,s,r,a,l,c,t,i)}static _create(e,t,i,n,s,r,a,l){s===0?s=eH*i:s<Aw&&(s=s*i),s=Math.round(s),s<Aw&&(s=Aw);const c=1+(l?0:tl.getZoomLevel()*.1);return i*=c,s*=c,new bd({pixelRatio:a,fontFamily:e,fontWeight:t,fontSize:i,fontFeatureSettings:n,lineHeight:s,letterSpacing:r})}getId(){return`${this.pixelRatio}-${this.fontFamily}-${this.fontWeight}-${this.fontSize}-${this.fontFeatureSettings}-${this.lineHeight}-${this.letterSpacing}`}getMassagedFontFamily(){const e=ns.fontFamily,t=bd._wrapInQuotes(this.fontFamily);return e&&this.fontFamily!==e?`${t}, ${e}`:t}static _wrapInQuotes(e){return/[,\"']/.test(e)?e:/[+ ]/.test(e)?`\"${e}\"`:e}}const tH=1;class Fy extends bd{constructor(e,t){super(e),this._editorStylingBrand=void 0,this.version=tH,this.isTrusted=t,this.isMonospace=e.isMonospace,this.typicalHalfwidthCharacterWidth=e.typicalHalfwidthCharacterWidth,this.typicalFullwidthCharacterWidth=e.typicalFullwidthCharacterWidth,this.canUseHalfwidthRightwardsArrow=e.canUseHalfwidthRightwardsArrow,this.spaceWidth=e.spaceWidth,this.middotWidth=e.middotWidth,this.wsmiddotWidth=e.wsmiddotWidth,this.maxDigitWidth=e.maxDigitWidth}equals(e){return this.fontFamily===e.fontFamily&&this.fontWeight===e.fontWeight&&this.fontSize===e.fontSize&&this.fontFeatureSettings===e.fontFeatureSettings&&this.lineHeight===e.lineHeight&&this.letterSpacing===e.letterSpacing&&this.typicalHalfwidthCharacterWidth===e.typicalHalfwidthCharacterWidth&&this.typicalFullwidthCharacterWidth===e.typicalFullwidthCharacterWidth&&this.canUseHalfwidthRightwardsArrow===e.canUseHalfwidthRightwardsArrow&&this.spaceWidth===e.spaceWidth&&this.middotWidth===e.middotWidth&&this.wsmiddotWidth===e.wsmiddotWidth&&this.maxDigitWidth===e.maxDigitWidth}}class iH extends z{constructor(){super(),this._onDidChange=this._register(new O),this.onDidChange=this._onDidChange.event,this._cache=new WT,this._evictUntrustedReadingsTimeout=-1}dispose(){this._evictUntrustedReadingsTimeout!==-1&&(window.clearTimeout(this._evictUntrustedReadingsTimeout),this._evictUntrustedReadingsTimeout=-1),super.dispose()}clearAllFontInfos(){this._cache=new WT,this._onDidChange.fire()}_writeToCache(e,t){this._cache.put(e,t),!t.isTrusted&&this._evictUntrustedReadingsTimeout===-1&&(this._evictUntrustedReadingsTimeout=window.setTimeout(()=>{this._evictUntrustedReadingsTimeout=-1,this._evictUntrustedReadings()},5e3))}_evictUntrustedReadings(){const e=this._cache.getValues();let t=!1;for(const i of e)i.isTrusted||(t=!0,this._cache.remove(i));t&&this._onDidChange.fire()}readFontInfo(e){if(!this._cache.has(e)){let t=this._actualReadFontInfo(e);(t.typicalHalfwidthCharacterWidth<=2||t.typicalFullwidthCharacterWidth<=2||t.spaceWidth<=2||t.maxDigitWidth<=2)&&(t=new Fy({pixelRatio:Xu.value,fontFamily:t.fontFamily,fontWeight:t.fontWeight,fontSize:t.fontSize,fontFeatureSettings:t.fontFeatureSettings,lineHeight:t.lineHeight,letterSpacing:t.letterSpacing,isMonospace:t.isMonospace,typicalHalfwidthCharacterWidth:Math.max(t.typicalHalfwidthCharacterWidth,5),typicalFullwidthCharacterWidth:Math.max(t.typicalFullwidthCharacterWidth,5),canUseHalfwidthRightwardsArrow:t.canUseHalfwidthRightwardsArrow,spaceWidth:Math.max(t.spaceWidth,5),middotWidth:Math.max(t.middotWidth,5),wsmiddotWidth:Math.max(t.wsmiddotWidth,5),maxDigitWidth:Math.max(t.maxDigitWidth,5)},!1)),this._writeToCache(e,t)}return this._cache.get(e)}_createRequest(e,t,i,n){const s=new fV(e,t);return i.push(s),n==null||n.push(s),s}_actualReadFontInfo(e){const t=[],i=[],n=this._createRequest(\"n\",0,t,i),s=this._createRequest(\"\\uFF4D\",0,t,null),r=this._createRequest(\" \",0,t,i),a=this._createRequest(\"0\",0,t,i),l=this._createRequest(\"1\",0,t,i),c=this._createRequest(\"2\",0,t,i),d=this._createRequest(\"3\",0,t,i),h=this._createRequest(\"4\",0,t,i),u=this._createRequest(\"5\",0,t,i),g=this._createRequest(\"6\",0,t,i),f=this._createRequest(\"7\",0,t,i),_=this._createRequest(\"8\",0,t,i),b=this._createRequest(\"9\",0,t,i),v=this._createRequest(\"\\u2192\",0,t,i),C=this._createRequest(\"\\uFFEB\",0,t,null),w=this._createRequest(\"\\xB7\",0,t,i),S=this._createRequest(String.fromCharCode(11825),0,t,null),k=\"|/-_ilm%\";for(let R=0,P=k.length;R<P;R++)this._createRequest(k.charAt(R),0,t,i),this._createRequest(k.charAt(R),1,t,i),this._createRequest(k.charAt(R),2,t,i);pV(e,t);const x=Math.max(a.width,l.width,c.width,d.width,h.width,u.width,g.width,f.width,_.width,b.width);let y=e.fontFeatureSettings===vs.OFF;const D=i[0].width;for(let R=1,P=i.length;y&&R<P;R++){const H=D-i[R].width;if(H<-.001||H>.001){y=!1;break}}let I=!0;return y&&C.width!==D&&(I=!1),C.width>v.width&&(I=!1),new Fy({pixelRatio:Xu.value,fontFamily:e.fontFamily,fontWeight:e.fontWeight,fontSize:e.fontSize,fontFeatureSettings:e.fontFeatureSettings,lineHeight:e.lineHeight,letterSpacing:e.letterSpacing,isMonospace:y,typicalHalfwidthCharacterWidth:n.width,typicalFullwidthCharacterWidth:s.width,canUseHalfwidthRightwardsArrow:I,spaceWidth:r.width,middotWidth:w.width,wsmiddotWidth:S.width,maxDigitWidth:x},!0)}}class WT{constructor(){this._keys=Object.create(null),this._values=Object.create(null)}has(e){const t=e.getId();return!!this._values[t]}get(e){const t=e.getId();return this._values[t]}put(e,t){const i=e.getId();this._keys[i]=e,this._values[i]=t}remove(e){const t=e.getId();delete this._keys[t],delete this._values[t]}getValues(){return Object.keys(this._keys).map(e=>this._values[e])}}const By=new iH;class Kl{constructor(e,t){this.key=e,this.migrate=t}apply(e){const t=Kl._read(e,this.key),i=s=>Kl._read(e,s),n=(s,r)=>Kl._write(e,s,r);this.migrate(t,i,n)}static _read(e,t){if(typeof e==\"undefined\")return;const i=t.indexOf(\".\");if(i>=0){const n=t.substring(0,i);return this._read(e[n],t.substring(i+1))}return e[t]}static _write(e,t,i){const n=t.indexOf(\".\");if(n>=0){const s=t.substring(0,n);e[s]=e[s]||{},this._write(e[s],t.substring(n+1),i);return}e[t]=i}}Kl.items=[];function Wg(o,e){Kl.items.push(new Kl(o,e))}function er(o,e){Wg(o,(t,i,n)=>{if(typeof t!=\"undefined\"){for(const[s,r]of e)if(t===s){n(o,r);return}}})}function nH(o){Kl.items.forEach(e=>e.apply(o))}er(\"wordWrap\",[[!0,\"on\"],[!1,\"off\"]]);er(\"lineNumbers\",[[!0,\"on\"],[!1,\"off\"]]);er(\"cursorBlinking\",[[\"visible\",\"solid\"]]);er(\"renderWhitespace\",[[!0,\"boundary\"],[!1,\"none\"]]);er(\"renderLineHighlight\",[[!0,\"line\"],[!1,\"none\"]]);er(\"acceptSuggestionOnEnter\",[[!0,\"on\"],[!1,\"off\"]]);er(\"tabCompletion\",[[!1,\"off\"],[!0,\"onlySnippets\"]]);er(\"hover\",[[!0,{enabled:!0}],[!1,{enabled:!1}]]);er(\"parameterHints\",[[!0,{enabled:!0}],[!1,{enabled:!1}]]);er(\"autoIndent\",[[!1,\"advanced\"],[!0,\"full\"]]);er(\"matchBrackets\",[[!0,\"always\"],[!1,\"never\"]]);Wg(\"autoClosingBrackets\",(o,e,t)=>{o===!1&&(t(\"autoClosingBrackets\",\"never\"),typeof e(\"autoClosingQuotes\")==\"undefined\"&&t(\"autoClosingQuotes\",\"never\"),typeof e(\"autoSurround\")==\"undefined\"&&t(\"autoSurround\",\"never\"))});Wg(\"renderIndentGuides\",(o,e,t)=>{typeof o!=\"undefined\"&&(t(\"renderIndentGuides\",void 0),typeof e(\"guides.indentation\")==\"undefined\"&&t(\"guides.indentation\",!!o))});Wg(\"highlightActiveIndentGuide\",(o,e,t)=>{typeof o!=\"undefined\"&&(t(\"highlightActiveIndentGuide\",void 0),typeof e(\"guides.highlightActiveIndentation\")==\"undefined\"&&t(\"guides.highlightActiveIndentation\",!!o))});const sH={method:\"showMethods\",function:\"showFunctions\",constructor:\"showConstructors\",deprecated:\"showDeprecated\",field:\"showFields\",variable:\"showVariables\",class:\"showClasses\",struct:\"showStructs\",interface:\"showInterfaces\",module:\"showModules\",property:\"showProperties\",event:\"showEvents\",operator:\"showOperators\",unit:\"showUnits\",value:\"showValues\",constant:\"showConstants\",enum:\"showEnums\",enumMember:\"showEnumMembers\",keyword:\"showKeywords\",text:\"showWords\",color:\"showColors\",file:\"showFiles\",reference:\"showReferences\",folder:\"showFolders\",typeParameter:\"showTypeParameters\",snippet:\"showSnippets\"};Wg(\"suggest.filteredTypes\",(o,e,t)=>{if(o&&typeof o==\"object\"){for(const i of Object.entries(sH))o[i[0]]===!1&&typeof e(`suggest.${i[1]}`)==\"undefined\"&&t(`suggest.${i[1]}`,!1);t(\"suggest.filteredTypes\",void 0)}});Wg(\"quickSuggestions\",(o,e,t)=>{if(typeof o==\"boolean\"){const i=o?\"on\":\"off\";t(\"quickSuggestions\",{comments:i,strings:i,other:i})}});class oH{constructor(){this._tabFocus=!1,this._onDidChangeTabFocus=new O,this.onDidChangeTabFocus=this._onDidChangeTabFocus.event}getTabFocusMode(){return this._tabFocus}setTabFocusMode(e){this._tabFocus!==e&&(this._tabFocus=e,this._onDidChangeTabFocus.fire(this._tabFocus))}}const Z0=new oH,ll=qe(\"accessibilityService\"),Km=new ce(\"accessibilityModeEnabled\",!1);var rH=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},aH=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let Wy=class extends z{constructor(e,t,i,n){super(),this._accessibilityService=n,this._onDidChange=this._register(new O),this.onDidChange=this._onDidChange.event,this._onDidChangeFast=this._register(new O),this.onDidChangeFast=this._onDidChangeFast.event,this._isDominatedByLongLines=!1,this._viewLineCount=1,this._lineNumbersDigitCount=1,this._reservedHeight=0,this._computeOptionsMemory=new HP,this.isSimpleWidget=e,this._containerObserver=this._register(new BP(i,t.dimension)),this._rawOptions=VT(t),this._validatedOptions=Il.validateOptions(this._rawOptions),this.options=this._computeOptions(),this.options.get(10)&&this._containerObserver.startObserving(),this._register(tl.onDidChangeZoomLevel(()=>this._recomputeOptions())),this._register(Z0.onDidChangeTabFocus(()=>this._recomputeOptions())),this._register(this._containerObserver.onDidChange(()=>this._recomputeOptions())),this._register(By.onDidChange(()=>this._recomputeOptions())),this._register(Xu.onDidChange(()=>this._recomputeOptions())),this._register(this._accessibilityService.onDidChangeScreenReaderOptimized(()=>this._recomputeOptions()))}_recomputeOptions(){const e=this._computeOptions(),t=Il.checkEquals(this.options,e);t!==null&&(this.options=e,this._onDidChangeFast.fire(t),this._onDidChange.fire(t))}_computeOptions(){const e=this._readEnvConfiguration(),t=bd.createFromValidatedSettings(this._validatedOptions,e.pixelRatio,this.isSimpleWidget),i=this._readFontInfo(t),n={memory:this._computeOptionsMemory,outerWidth:e.outerWidth,outerHeight:e.outerHeight-this._reservedHeight,fontInfo:i,extraEditorClassName:e.extraEditorClassName,isDominatedByLongLines:this._isDominatedByLongLines,viewLineCount:this._viewLineCount,lineNumbersDigitCount:this._lineNumbersDigitCount,emptySelectionClipboard:e.emptySelectionClipboard,pixelRatio:e.pixelRatio,tabFocusMode:Z0.getTabFocusMode(),accessibilitySupport:e.accessibilitySupport};return Il.computeOptions(this._validatedOptions,n)}_readEnvConfiguration(){return{extraEditorClassName:cH(),outerWidth:this._containerObserver.getWidth(),outerHeight:this._containerObserver.getHeight(),emptySelectionClipboard:$l||Ls,pixelRatio:Xu.value,accessibilitySupport:this._accessibilityService.isScreenReaderOptimized()?2:this._accessibilityService.getAccessibilitySupport()}}_readFontInfo(e){return By.readFontInfo(e)}getRawOptions(){return this._rawOptions}updateOptions(e){const t=VT(e);!Il.applyUpdate(this._rawOptions,t)||(this._validatedOptions=Il.validateOptions(this._rawOptions),this._recomputeOptions())}observeContainer(e){this._containerObserver.observe(e)}setIsDominatedByLongLines(e){this._isDominatedByLongLines!==e&&(this._isDominatedByLongLines=e,this._recomputeOptions())}setModelLineCount(e){const t=lH(e);this._lineNumbersDigitCount!==t&&(this._lineNumbersDigitCount=t,this._recomputeOptions())}setViewLineCount(e){this._viewLineCount!==e&&(this._viewLineCount=e,this._recomputeOptions())}setReservedHeight(e){this._reservedHeight!==e&&(this._reservedHeight=e,this._recomputeOptions())}};Wy=rH([aH(3,ll)],Wy);function lH(o){let e=0;for(;o;)o=Math.floor(o/10),e++;return e||1}function cH(){let o=\"\";return!Qa&&!Rx&&(o+=\"no-user-select \"),Qa&&(o+=\"no-minimap-shadow \",o+=\"enable-user-select \"),Ze&&(o+=\"mac \"),o}class dH{constructor(){this._values=[]}_read(e){return this._values[e]}get(e){return this._values[e]}_write(e,t){this._values[e]=t}}class hH{constructor(){this._values=[]}_read(e){if(e>=this._values.length)throw new Error(\"Cannot read uninitialized value\");return this._values[e]}get(e){return this._read(e)}_write(e,t){this._values[e]=t}}class Il{static validateOptions(e){const t=new dH;for(const i of cu){const n=i.name===\"_never_\"?void 0:e[i.name];t._write(i.id,i.validate(n))}return t}static computeOptions(e,t){const i=new hH;for(const n of cu)i._write(n.id,n.compute(t,i,e._read(n.id)));return i}static _deepEquals(e,t){if(typeof e!=\"object\"||typeof t!=\"object\"||!e||!t)return e===t;if(Array.isArray(e)||Array.isArray(t))return Array.isArray(e)&&Array.isArray(t)?ys(e,t):!1;if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const i in e)if(!Il._deepEquals(e[i],t[i]))return!1;return!0}static checkEquals(e,t){const i=[];let n=!1;for(const s of cu){const r=!Il._deepEquals(e._read(s.id),t._read(s.id));i[s.id]=r,r&&(n=!0)}return n?new VP(i):null}static applyUpdate(e,t){let i=!1;for(const n of cu)if(t.hasOwnProperty(n.name)){const s=n.applyUpdate(e[n.name],t[n.name]);e[n.name]=s.newValue,i=i||s.didChange}return i}}function VT(o){const e=ya(o);return nH(e),e}function ui(o,e,t){let i=null,n=null;if(typeof t.value==\"function\"?(i=\"value\",n=t.value,n.length!==0&&console.warn(\"Memoize should only be used in functions with zero parameters\")):typeof t.get==\"function\"&&(i=\"get\",n=t.get),!n)throw new Error(\"not supported\");const s=`$memoize$${e}`;t[i]=function(...r){return this.hasOwnProperty(s)||Object.defineProperty(this,s,{configurable:!1,enumerable:!1,writable:!1,value:n.apply(this,r)}),this[s]}}var uH=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},kt;(function(o){o.Tap=\"-monaco-gesturetap\",o.Change=\"-monaco-gesturechange\",o.Start=\"-monaco-gesturestart\",o.End=\"-monaco-gesturesend\",o.Contextmenu=\"-monaco-gesturecontextmenu\"})(kt||(kt={}));class ut extends z{constructor(){super(),this.dispatched=!1,this.activeTouches={},this.handle=null,this.targets=[],this.ignoreTargets=[],this._lastSetTapCountTime=0,this._register(q(document,\"touchstart\",e=>this.onTouchStart(e),{passive:!1})),this._register(q(document,\"touchend\",e=>this.onTouchEnd(e))),this._register(q(document,\"touchmove\",e=>this.onTouchMove(e),{passive:!1}))}static addTarget(e){return ut.isTouchDevice()?(ut.INSTANCE||(ut.INSTANCE=new ut),ut.INSTANCE.targets.push(e),{dispose:()=>{ut.INSTANCE.targets=ut.INSTANCE.targets.filter(t=>t!==e)}}):z.None}static ignoreTarget(e){return ut.isTouchDevice()?(ut.INSTANCE||(ut.INSTANCE=new ut),ut.INSTANCE.ignoreTargets.push(e),{dispose:()=>{ut.INSTANCE.ignoreTargets=ut.INSTANCE.ignoreTargets.filter(t=>t!==e)}}):z.None}static isTouchDevice(){return\"ontouchstart\"in window||navigator.maxTouchPoints>0}dispose(){this.handle&&(this.handle.dispose(),this.handle=null),super.dispose()}onTouchStart(e){const t=Date.now();this.handle&&(this.handle.dispose(),this.handle=null);for(let i=0,n=e.targetTouches.length;i<n;i++){const s=e.targetTouches.item(i);this.activeTouches[s.identifier]={id:s.identifier,initialTarget:s.target,initialTimeStamp:t,initialPageX:s.pageX,initialPageY:s.pageY,rollingTimestamps:[t],rollingPageX:[s.pageX],rollingPageY:[s.pageY]};const r=this.newGestureEvent(kt.Start,s.target);r.pageX=s.pageX,r.pageY=s.pageY,this.dispatchEvent(r)}this.dispatched&&(e.preventDefault(),e.stopPropagation(),this.dispatched=!1)}onTouchEnd(e){const t=Date.now(),i=Object.keys(this.activeTouches).length;for(let n=0,s=e.changedTouches.length;n<s;n++){const r=e.changedTouches.item(n);if(!this.activeTouches.hasOwnProperty(String(r.identifier))){console.warn(\"move of an UNKNOWN touch\",r);continue}const a=this.activeTouches[r.identifier],l=Date.now()-a.initialTimeStamp;if(l<ut.HOLD_DELAY&&Math.abs(a.initialPageX-Ts(a.rollingPageX))<30&&Math.abs(a.initialPageY-Ts(a.rollingPageY))<30){const c=this.newGestureEvent(kt.Tap,a.initialTarget);c.pageX=Ts(a.rollingPageX),c.pageY=Ts(a.rollingPageY),this.dispatchEvent(c)}else if(l>=ut.HOLD_DELAY&&Math.abs(a.initialPageX-Ts(a.rollingPageX))<30&&Math.abs(a.initialPageY-Ts(a.rollingPageY))<30){const c=this.newGestureEvent(kt.Contextmenu,a.initialTarget);c.pageX=Ts(a.rollingPageX),c.pageY=Ts(a.rollingPageY),this.dispatchEvent(c)}else if(i===1){const c=Ts(a.rollingPageX),d=Ts(a.rollingPageY),h=Ts(a.rollingTimestamps)-a.rollingTimestamps[0],u=c-a.rollingPageX[0],g=d-a.rollingPageY[0],f=this.targets.filter(_=>a.initialTarget instanceof Node&&_.contains(a.initialTarget));this.inertia(f,t,Math.abs(u)/h,u>0?1:-1,c,Math.abs(g)/h,g>0?1:-1,d)}this.dispatchEvent(this.newGestureEvent(kt.End,a.initialTarget)),delete this.activeTouches[r.identifier]}this.dispatched&&(e.preventDefault(),e.stopPropagation(),this.dispatched=!1)}newGestureEvent(e,t){const i=document.createEvent(\"CustomEvent\");return i.initEvent(e,!1,!0),i.initialTarget=t,i.tapCount=0,i}dispatchEvent(e){if(e.type===kt.Tap){const t=new Date().getTime();let i=0;t-this._lastSetTapCountTime>ut.CLEAR_TAP_COUNT_TIME?i=1:i=2,this._lastSetTapCountTime=t,e.tapCount=i}else(e.type===kt.Change||e.type===kt.Contextmenu)&&(this._lastSetTapCountTime=0);for(let t=0;t<this.ignoreTargets.length;t++)if(e.initialTarget instanceof Node&&this.ignoreTargets[t].contains(e.initialTarget))return;this.targets.forEach(t=>{e.initialTarget instanceof Node&&t.contains(e.initialTarget)&&(t.dispatchEvent(e),this.dispatched=!0)})}inertia(e,t,i,n,s,r,a,l){this.handle=Go(()=>{const c=Date.now(),d=c-t;let h=0,u=0,g=!0;i+=ut.SCROLL_FRICTION*d,r+=ut.SCROLL_FRICTION*d,i>0&&(g=!1,h=n*i*d),r>0&&(g=!1,u=a*r*d);const f=this.newGestureEvent(kt.Change);f.translationX=h,f.translationY=u,e.forEach(_=>_.dispatchEvent(f)),g||this.inertia(e,c,i,n,s+h,r,a,l+u)})}onTouchMove(e){const t=Date.now();for(let i=0,n=e.changedTouches.length;i<n;i++){const s=e.changedTouches.item(i);if(!this.activeTouches.hasOwnProperty(String(s.identifier))){console.warn(\"end of an UNKNOWN touch\",s);continue}const r=this.activeTouches[s.identifier],a=this.newGestureEvent(kt.Change,r.initialTarget);a.translationX=s.pageX-Ts(r.rollingPageX),a.translationY=s.pageY-Ts(r.rollingPageY),a.pageX=s.pageX,a.pageY=s.pageY,this.dispatchEvent(a),r.rollingPageX.length>3&&(r.rollingPageX.shift(),r.rollingPageY.shift(),r.rollingTimestamps.shift()),r.rollingPageX.push(s.pageX),r.rollingPageY.push(s.pageY),r.rollingTimestamps.push(t)}this.dispatched&&(e.preventDefault(),e.stopPropagation(),this.dispatched=!1)}}ut.SCROLL_FRICTION=-.005;ut.HOLD_DELAY=700;ut.CLEAR_TAP_COUNT_TIME=400;uH([ui],ut,\"isTouchDevice\",null);const zP=Object.freeze(function(o,e){const t=setTimeout(o.bind(e),0);return{dispose(){clearTimeout(t)}}});var We;(function(o){function e(t){return t===o.None||t===o.Cancelled||t instanceof i0?!0:!t||typeof t!=\"object\"?!1:typeof t.isCancellationRequested==\"boolean\"&&typeof t.onCancellationRequested==\"function\"}o.isCancellationToken=e,o.None=Object.freeze({isCancellationRequested:!1,onCancellationRequested:pe.None}),o.Cancelled=Object.freeze({isCancellationRequested:!0,onCancellationRequested:zP})})(We||(We={}));class i0{constructor(){this._isCancelled=!1,this._emitter=null}cancel(){this._isCancelled||(this._isCancelled=!0,this._emitter&&(this._emitter.fire(void 0),this.dispose()))}get isCancellationRequested(){return this._isCancelled}get onCancellationRequested(){return this._isCancelled?zP:(this._emitter||(this._emitter=new O),this._emitter.event)}dispose(){this._emitter&&(this._emitter.dispose(),this._emitter=null)}}class gn{constructor(e){this._token=void 0,this._parentListener=void 0,this._parentListener=e&&e.onCancellationRequested(this.cancel,this)}get token(){return this._token||(this._token=new i0),this._token}cancel(){this._token?this._token instanceof i0&&this._token.cancel():this._token=We.Cancelled}dispose(e=!1){e&&this.cancel(),this._parentListener&&this._parentListener.dispose(),this._token?this._token instanceof i0&&this._token.dispose():this._token=We.None}}var Ms=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})},Rf=globalThis&&globalThis.__asyncValues||function(o){if(!Symbol.asyncIterator)throw new TypeError(\"Symbol.asyncIterator is not defined.\");var e=o[Symbol.asyncIterator],t;return e?e.call(o):(o=typeof __values==\"function\"?__values(o):o[Symbol.iterator](),t={},i(\"next\"),i(\"throw\"),i(\"return\"),t[Symbol.asyncIterator]=function(){return this},t);function i(s){t[s]=o[s]&&function(r){return new Promise(function(a,l){r=o[s](r),n(a,l,r.done,r.value)})}}function n(s,r,a,l){Promise.resolve(l).then(function(c){s({value:c,done:a})},r)}};function Vy(o){return!!o&&typeof o.then==\"function\"}function Ti(o){const e=new gn,t=o(e.token),i=new Promise((n,s)=>{const r=e.token.onCancellationRequested(()=>{r.dispose(),e.dispose(),s(new yc)});Promise.resolve(t).then(a=>{r.dispose(),e.dispose(),n(a)},a=>{r.dispose(),e.dispose(),s(a)})});return new class{cancel(){e.cancel()}then(n,s){return i.then(n,s)}catch(n){return this.then(void 0,n)}finally(n){return i.finally(n)}}}function aI(o,e,t){return new Promise((i,n)=>{const s=e.onCancellationRequested(()=>{s.dispose(),i(t)});o.then(i,n).finally(()=>s.dispose())})}class gH{constructor(){this.activePromise=null,this.queuedPromise=null,this.queuedPromiseFactory=null}queue(e){if(this.activePromise){if(this.queuedPromiseFactory=e,!this.queuedPromise){const t=()=>{this.queuedPromise=null;const i=this.queue(this.queuedPromiseFactory);return this.queuedPromiseFactory=null,i};this.queuedPromise=new Promise(i=>{this.activePromise.then(t,t).then(i)})}return new Promise((t,i)=>{this.queuedPromise.then(t,i)})}return this.activePromise=e(),new Promise((t,i)=>{this.activePromise.then(n=>{this.activePromise=null,t(n)},n=>{this.activePromise=null,i(n)})})}}const fH=(o,e)=>{let t=!0;const i=setTimeout(()=>{t=!1,e()},o);return{isTriggered:()=>t,dispose:()=>{clearTimeout(i),t=!1}}},pH=o=>{let e=!0;return queueMicrotask(()=>{e&&(e=!1,o())}),{isTriggered:()=>e,dispose:()=>{e=!1}}},UP=Symbol(\"MicrotaskDelay\");class $r{constructor(e){this.defaultDelay=e,this.deferred=null,this.completionPromise=null,this.doResolve=null,this.doReject=null,this.task=null}trigger(e,t=this.defaultDelay){this.task=e,this.cancelTimeout(),this.completionPromise||(this.completionPromise=new Promise((n,s)=>{this.doResolve=n,this.doReject=s}).then(()=>{if(this.completionPromise=null,this.doResolve=null,this.task){const n=this.task;return this.task=null,n()}}));const i=()=>{var n;this.deferred=null,(n=this.doResolve)===null||n===void 0||n.call(this,null)};return this.deferred=t===UP?pH(i):fH(t,i),this.completionPromise}isTriggered(){var e;return!!(!((e=this.deferred)===null||e===void 0)&&e.isTriggered())}cancel(){var e;this.cancelTimeout(),this.completionPromise&&((e=this.doReject)===null||e===void 0||e.call(this,new yc),this.completionPromise=null)}cancelTimeout(){var e;(e=this.deferred)===null||e===void 0||e.dispose(),this.deferred=null}dispose(){this.cancel()}}class mH{constructor(e){this.delayer=new $r(e),this.throttler=new gH}trigger(e,t){return this.delayer.trigger(()=>this.throttler.queue(e),t)}dispose(){this.delayer.dispose()}}function Vd(o,e){return e?new Promise((t,i)=>{const n=setTimeout(()=>{s.dispose(),t()},o),s=e.onCancellationRequested(()=>{clearTimeout(n),s.dispose(),i(new yc)})}):Ti(t=>Vd(o,t))}function Hd(o,e=0){const t=setTimeout(o,e);return ze(()=>clearTimeout(t))}function $P(o,e=i=>!!i,t=null){let i=0;const n=o.length,s=()=>{if(i>=n)return Promise.resolve(t);const r=o[i++];return Promise.resolve(r()).then(l=>e(l)?Promise.resolve(l):s())};return s()}class Is{constructor(e,t){this._token=-1,typeof e==\"function\"&&typeof t==\"number\"&&this.setIfNotSet(e,t)}dispose(){this.cancel()}cancel(){this._token!==-1&&(clearTimeout(this._token),this._token=-1)}cancelAndSet(e,t){this.cancel(),this._token=setTimeout(()=>{this._token=-1,e()},t)}setIfNotSet(e,t){this._token===-1&&(this._token=setTimeout(()=>{this._token=-1,e()},t))}}class qm{constructor(){this._token=-1}dispose(){this.cancel()}cancel(){this._token!==-1&&(clearInterval(this._token),this._token=-1)}cancelAndSet(e,t){this.cancel(),this._token=setInterval(()=>{e()},t)}}class ft{constructor(e,t){this.timeoutToken=-1,this.runner=e,this.timeout=t,this.timeoutHandler=this.onTimeout.bind(this)}dispose(){this.cancel(),this.runner=null}cancel(){this.isScheduled()&&(clearTimeout(this.timeoutToken),this.timeoutToken=-1)}schedule(e=this.timeout){this.cancel(),this.timeoutToken=setTimeout(this.timeoutHandler,e)}get delay(){return this.timeout}set delay(e){this.timeout=e}isScheduled(){return this.timeoutToken!==-1}onTimeout(){this.timeoutToken=-1,this.runner&&this.doRun()}doRun(){var e;(e=this.runner)===null||e===void 0||e.call(this)}}let Fp;(function(){typeof requestIdleCallback!=\"function\"||typeof cancelIdleCallback!=\"function\"?Fp=o=>{gO(()=>{if(e)return;const t=Date.now()+15;o(Object.freeze({didTimeout:!0,timeRemaining(){return Math.max(0,t-Date.now())}}))});let e=!1;return{dispose(){e||(e=!0)}}}:Fp=(o,e)=>{const t=requestIdleCallback(o,typeof e==\"number\"?{timeout:e}:void 0);let i=!1;return{dispose(){i||(i=!0,cancelIdleCallback(t))}}}})();class ql{constructor(e){this._didRun=!1,this._executor=()=>{try{this._value=e()}catch(t){this._error=t}finally{this._didRun=!0}},this._handle=Fp(()=>this._executor())}dispose(){this._handle.dispose()}get value(){if(this._didRun||(this._handle.dispose(),this._executor()),this._error)throw this._error;return this._value}get isInitialized(){return this._didRun}}class jP{constructor(){this.rejected=!1,this.resolved=!1,this.p=new Promise((e,t)=>{this.completeCallback=e,this.errorCallback=t})}get isRejected(){return this.rejected}get isSettled(){return this.rejected||this.resolved}complete(e){return new Promise(t=>{this.completeCallback(e),this.resolved=!0,t()})}cancel(){new Promise(e=>{this.errorCallback(new yc),this.rejected=!0,e()})}}var Hy;(function(o){function e(i){return Ms(this,void 0,void 0,function*(){let n;const s=yield Promise.all(i.map(r=>r.then(a=>a,a=>{n||(n=a)})));if(typeof n!=\"undefined\")throw n;return s})}o.settled=e;function t(i){return new Promise((n,s)=>Ms(this,void 0,void 0,function*(){try{yield i(n,s)}catch(r){s(r)}}))}o.withAsyncBody=t})(Hy||(Hy={}));class ni{constructor(e){this._state=0,this._results=[],this._error=null,this._onStateChanged=new O,queueMicrotask(()=>Ms(this,void 0,void 0,function*(){const t={emitOne:i=>this.emitOne(i),emitMany:i=>this.emitMany(i),reject:i=>this.reject(i)};try{yield Promise.resolve(e(t)),this.resolve()}catch(i){this.reject(i)}finally{t.emitOne=void 0,t.emitMany=void 0,t.reject=void 0}}))}static fromArray(e){return new ni(t=>{t.emitMany(e)})}static fromPromise(e){return new ni(t=>Ms(this,void 0,void 0,function*(){t.emitMany(yield e)}))}static fromPromises(e){return new ni(t=>Ms(this,void 0,void 0,function*(){yield Promise.all(e.map(i=>Ms(this,void 0,void 0,function*(){return t.emitOne(yield i)})))}))}static merge(e){return new ni(t=>Ms(this,void 0,void 0,function*(){yield Promise.all(e.map(i=>{var n,s;return Ms(this,void 0,void 0,function*(){var r,a;try{for(n=Rf(i);s=yield n.next(),!s.done;){const l=s.value;t.emitOne(l)}}catch(l){r={error:l}}finally{try{s&&!s.done&&(a=n.return)&&(yield a.call(n))}finally{if(r)throw r.error}}})}))}))}[Symbol.asyncIterator](){let e=0;return{next:()=>Ms(this,void 0,void 0,function*(){do{if(this._state===2)throw this._error;if(e<this._results.length)return{done:!1,value:this._results[e++]};if(this._state===1)return{done:!0,value:void 0};yield pe.toPromise(this._onStateChanged.event)}while(!0)})}}static map(e,t){return new ni(i=>Ms(this,void 0,void 0,function*(){var n,s;try{for(var r=Rf(e),a;a=yield r.next(),!a.done;){const l=a.value;i.emitOne(t(l))}}catch(l){n={error:l}}finally{try{a&&!a.done&&(s=r.return)&&(yield s.call(r))}finally{if(n)throw n.error}}}))}map(e){return ni.map(this,e)}static filter(e,t){return new ni(i=>Ms(this,void 0,void 0,function*(){var n,s;try{for(var r=Rf(e),a;a=yield r.next(),!a.done;){const l=a.value;t(l)&&i.emitOne(l)}}catch(l){n={error:l}}finally{try{a&&!a.done&&(s=r.return)&&(yield s.call(r))}finally{if(n)throw n.error}}}))}filter(e){return ni.filter(this,e)}static coalesce(e){return ni.filter(e,t=>!!t)}coalesce(){return ni.coalesce(this)}static toPromise(e){var t,i,n,s;return Ms(this,void 0,void 0,function*(){const r=[];try{for(t=Rf(e);i=yield t.next(),!i.done;){const a=i.value;r.push(a)}}catch(a){n={error:a}}finally{try{i&&!i.done&&(s=t.return)&&(yield s.call(t))}finally{if(n)throw n.error}}return r})}toPromise(){return ni.toPromise(this)}emitOne(e){this._state===0&&(this._results.push(e),this._onStateChanged.fire())}emitMany(e){this._state===0&&(this._results=this._results.concat(e),this._onStateChanged.fire())}resolve(){this._state===0&&(this._state=1,this._onStateChanged.fire())}reject(e){this._state===0&&(this._state=2,this._error=e,this._onStateChanged.fire())}}ni.EMPTY=ni.fromArray([]);class _H extends ni{constructor(e,t){super(t),this._source=e}cancel(){this._source.cancel()}}function bH(o){const e=new gn,t=o(e.token);return new _H(e,i=>Ms(this,void 0,void 0,function*(){var n,s;const r=e.token.onCancellationRequested(()=>{r.dispose(),e.dispose(),i.reject(new yc)});try{try{for(var a=Rf(t),l;l=yield a.next(),!l.done;){const c=l.value;if(e.token.isCancellationRequested)return;i.emitOne(c)}}catch(c){n={error:c}}finally{try{l&&!l.done&&(s=a.return)&&(yield s.call(a))}finally{if(n)throw n.error}}r.dispose(),e.dispose()}catch(c){r.dispose(),e.dispose(),i.reject(c)}}))}class Vg{constructor(){this._hooks=new ee,this._pointerMoveCallback=null,this._onStopCallback=null}dispose(){this.stopMonitoring(!1),this._hooks.dispose()}stopMonitoring(e,t){if(!this.isMonitoring())return;this._hooks.clear(),this._pointerMoveCallback=null;const i=this._onStopCallback;this._onStopCallback=null,e&&i&&i(t)}isMonitoring(){return!!this._pointerMoveCallback}startMonitoring(e,t,i,n,s){this.isMonitoring()&&this.stopMonitoring(!1),this._pointerMoveCallback=n,this._onStopCallback=s;let r=e;try{e.setPointerCapture(t),this._hooks.add(ze(()=>{e.releasePointerCapture(t)}))}catch(a){r=window}this._hooks.add(q(r,le.POINTER_MOVE,a=>{if(a.buttons!==i){this.stopMonitoring(!0);return}a.preventDefault(),this._pointerMoveCallback(a)})),this._hooks.add(q(r,le.POINTER_UP,a=>this.stopMonitoring(!0)))}}function Gl(o,e){const t=Math.pow(10,e);return Math.round(o*t)/t}class je{constructor(e,t,i,n=1){this._rgbaBrand=void 0,this.r=Math.min(255,Math.max(0,e))|0,this.g=Math.min(255,Math.max(0,t))|0,this.b=Math.min(255,Math.max(0,i))|0,this.a=Gl(Math.max(Math.min(1,n),0),3)}static equals(e,t){return e.r===t.r&&e.g===t.g&&e.b===t.b&&e.a===t.a}}class Ro{constructor(e,t,i,n){this._hslaBrand=void 0,this.h=Math.max(Math.min(360,e),0)|0,this.s=Gl(Math.max(Math.min(1,t),0),3),this.l=Gl(Math.max(Math.min(1,i),0),3),this.a=Gl(Math.max(Math.min(1,n),0),3)}static equals(e,t){return e.h===t.h&&e.s===t.s&&e.l===t.l&&e.a===t.a}static fromRGBA(e){const t=e.r/255,i=e.g/255,n=e.b/255,s=e.a,r=Math.max(t,i,n),a=Math.min(t,i,n);let l=0,c=0;const d=(a+r)/2,h=r-a;if(h>0){switch(c=Math.min(d<=.5?h/(2*d):h/(2-2*d),1),r){case t:l=(i-n)/h+(i<n?6:0);break;case i:l=(n-t)/h+2;break;case n:l=(t-i)/h+4;break}l*=60,l=Math.round(l)}return new Ro(l,c,d,s)}static _hue2rgb(e,t,i){return i<0&&(i+=1),i>1&&(i-=1),i<1/6?e+(t-e)*6*i:i<1/2?t:i<2/3?e+(t-e)*(2/3-i)*6:e}static toRGBA(e){const t=e.h/360,{s:i,l:n,a:s}=e;let r,a,l;if(i===0)r=a=l=n;else{const c=n<.5?n*(1+i):n+i-n*i,d=2*n-c;r=Ro._hue2rgb(d,c,t+1/3),a=Ro._hue2rgb(d,c,t),l=Ro._hue2rgb(d,c,t-1/3)}return new je(Math.round(r*255),Math.round(a*255),Math.round(l*255),s)}}class Nr{constructor(e,t,i,n){this._hsvaBrand=void 0,this.h=Math.max(Math.min(360,e),0)|0,this.s=Gl(Math.max(Math.min(1,t),0),3),this.v=Gl(Math.max(Math.min(1,i),0),3),this.a=Gl(Math.max(Math.min(1,n),0),3)}static equals(e,t){return e.h===t.h&&e.s===t.s&&e.v===t.v&&e.a===t.a}static fromRGBA(e){const t=e.r/255,i=e.g/255,n=e.b/255,s=Math.max(t,i,n),r=Math.min(t,i,n),a=s-r,l=s===0?0:a/s;let c;return a===0?c=0:s===t?c=((i-n)/a%6+6)%6:s===i?c=(n-t)/a+2:c=(t-i)/a+4,new Nr(Math.round(c*60),l,s,e.a)}static toRGBA(e){const{h:t,s:i,v:n,a:s}=e,r=n*i,a=r*(1-Math.abs(t/60%2-1)),l=n-r;let[c,d,h]=[0,0,0];return t<60?(c=r,d=a):t<120?(c=a,d=r):t<180?(d=r,h=a):t<240?(d=a,h=r):t<300?(c=a,h=r):t<=360&&(c=r,h=a),c=Math.round((c+l)*255),d=Math.round((d+l)*255),h=Math.round((h+l)*255),new je(c,d,h,s)}}class W{constructor(e){if(e)if(e instanceof je)this.rgba=e;else if(e instanceof Ro)this._hsla=e,this.rgba=Ro.toRGBA(e);else if(e instanceof Nr)this._hsva=e,this.rgba=Nr.toRGBA(e);else throw new Error(\"Invalid color ctor argument\");else throw new Error(\"Color needs a value\")}static fromHex(e){return W.Format.CSS.parseHex(e)||W.red}get hsla(){return this._hsla?this._hsla:Ro.fromRGBA(this.rgba)}get hsva(){return this._hsva?this._hsva:Nr.fromRGBA(this.rgba)}equals(e){return!!e&&je.equals(this.rgba,e.rgba)&&Ro.equals(this.hsla,e.hsla)&&Nr.equals(this.hsva,e.hsva)}getRelativeLuminance(){const e=W._relativeLuminanceForComponent(this.rgba.r),t=W._relativeLuminanceForComponent(this.rgba.g),i=W._relativeLuminanceForComponent(this.rgba.b),n=.2126*e+.7152*t+.0722*i;return Gl(n,4)}static _relativeLuminanceForComponent(e){const t=e/255;return t<=.03928?t/12.92:Math.pow((t+.055)/1.055,2.4)}isLighter(){return(this.rgba.r*299+this.rgba.g*587+this.rgba.b*114)/1e3>=128}isLighterThan(e){const t=this.getRelativeLuminance(),i=e.getRelativeLuminance();return t>i}isDarkerThan(e){const t=this.getRelativeLuminance(),i=e.getRelativeLuminance();return t<i}lighten(e){return new W(new Ro(this.hsla.h,this.hsla.s,this.hsla.l+this.hsla.l*e,this.hsla.a))}darken(e){return new W(new Ro(this.hsla.h,this.hsla.s,this.hsla.l-this.hsla.l*e,this.hsla.a))}transparent(e){const{r:t,g:i,b:n,a:s}=this.rgba;return new W(new je(t,i,n,s*e))}isTransparent(){return this.rgba.a===0}isOpaque(){return this.rgba.a===1}opposite(){return new W(new je(255-this.rgba.r,255-this.rgba.g,255-this.rgba.b,this.rgba.a))}toString(){return this._toString||(this._toString=W.Format.CSS.format(this)),this._toString}static getLighterColor(e,t,i){if(e.isLighterThan(t))return e;i=i||.5;const n=e.getRelativeLuminance(),s=t.getRelativeLuminance();return i=i*(s-n)/s,e.lighten(i)}static getDarkerColor(e,t,i){if(e.isDarkerThan(t))return e;i=i||.5;const n=e.getRelativeLuminance(),s=t.getRelativeLuminance();return i=i*(n-s)/n,e.darken(i)}}W.white=new W(new je(255,255,255,1));W.black=new W(new je(0,0,0,1));W.red=new W(new je(255,0,0,1));W.blue=new W(new je(0,0,255,1));W.green=new W(new je(0,255,0,1));W.cyan=new W(new je(0,255,255,1));W.lightgrey=new W(new je(211,211,211,1));W.transparent=new W(new je(0,0,0,0));(function(o){(function(e){(function(t){function i(g){return g.rgba.a===1?`rgb(${g.rgba.r}, ${g.rgba.g}, ${g.rgba.b})`:o.Format.CSS.formatRGBA(g)}t.formatRGB=i;function n(g){return`rgba(${g.rgba.r}, ${g.rgba.g}, ${g.rgba.b}, ${+g.rgba.a.toFixed(2)})`}t.formatRGBA=n;function s(g){return g.hsla.a===1?`hsl(${g.hsla.h}, ${(g.hsla.s*100).toFixed(2)}%, ${(g.hsla.l*100).toFixed(2)}%)`:o.Format.CSS.formatHSLA(g)}t.formatHSL=s;function r(g){return`hsla(${g.hsla.h}, ${(g.hsla.s*100).toFixed(2)}%, ${(g.hsla.l*100).toFixed(2)}%, ${g.hsla.a.toFixed(2)})`}t.formatHSLA=r;function a(g){const f=g.toString(16);return f.length!==2?\"0\"+f:f}function l(g){return`#${a(g.rgba.r)}${a(g.rgba.g)}${a(g.rgba.b)}`}t.formatHex=l;function c(g,f=!1){return f&&g.rgba.a===1?o.Format.CSS.formatHex(g):`#${a(g.rgba.r)}${a(g.rgba.g)}${a(g.rgba.b)}${a(Math.round(g.rgba.a*255))}`}t.formatHexA=c;function d(g){return g.isOpaque()?o.Format.CSS.formatHex(g):o.Format.CSS.formatRGBA(g)}t.format=d;function h(g){const f=g.length;if(f===0||g.charCodeAt(0)!==35)return null;if(f===7){const _=16*u(g.charCodeAt(1))+u(g.charCodeAt(2)),b=16*u(g.charCodeAt(3))+u(g.charCodeAt(4)),v=16*u(g.charCodeAt(5))+u(g.charCodeAt(6));return new o(new je(_,b,v,1))}if(f===9){const _=16*u(g.charCodeAt(1))+u(g.charCodeAt(2)),b=16*u(g.charCodeAt(3))+u(g.charCodeAt(4)),v=16*u(g.charCodeAt(5))+u(g.charCodeAt(6)),C=16*u(g.charCodeAt(7))+u(g.charCodeAt(8));return new o(new je(_,b,v,C/255))}if(f===4){const _=u(g.charCodeAt(1)),b=u(g.charCodeAt(2)),v=u(g.charCodeAt(3));return new o(new je(16*_+_,16*b+b,16*v+v))}if(f===5){const _=u(g.charCodeAt(1)),b=u(g.charCodeAt(2)),v=u(g.charCodeAt(3)),C=u(g.charCodeAt(4));return new o(new je(16*_+_,16*b+b,16*v+v,(16*C+C)/255))}return null}t.parseHex=h;function u(g){switch(g){case 48:return 0;case 49:return 1;case 50:return 2;case 51:return 3;case 52:return 4;case 53:return 5;case 54:return 6;case 55:return 7;case 56:return 8;case 57:return 9;case 97:return 10;case 65:return 10;case 98:return 11;case 66:return 11;case 99:return 12;case 67:return 12;case 100:return 13;case 68:return 13;case 101:return 14;case 69:return 14;case 102:return 15;case 70:return 15}return 0}})(e.CSS||(e.CSS={}))})(o.Format||(o.Format={}))})(W||(W={}));function KP(o){return`--vscode-${o.replace(/\\./g,\"-\")}`}const qP={ColorContribution:\"base.contributions.colors\"};class vH{constructor(){this._onDidChangeSchema=new O,this.onDidChangeSchema=this._onDidChangeSchema.event,this.colorSchema={type:\"object\",properties:{}},this.colorReferenceSchema={type:\"string\",enum:[],enumDescriptions:[]},this.colorsById={}}registerColor(e,t,i,n=!1,s){const r={id:e,description:i,defaults:t,needsTransparency:n,deprecationMessage:s};this.colorsById[e]=r;const a={type:\"string\",description:i,format:\"color-hex\",defaultSnippets:[{body:\"${1:#ff0000}\"}]};return s&&(a.deprecationMessage=s),this.colorSchema.properties[e]=a,this.colorReferenceSchema.enum.push(e),this.colorReferenceSchema.enumDescriptions.push(i),this._onDidChangeSchema.fire(),e}getColors(){return Object.keys(this.colorsById).map(e=>this.colorsById[e])}resolveDefaultColor(e,t){const i=this.colorsById[e];if(i&&i.defaults){const n=i.defaults[t.type];return ba(n,t)}}getColorSchema(){return this.colorSchema}toString(){const e=(t,i)=>{const n=t.indexOf(\".\")===-1?0:1,s=i.indexOf(\".\")===-1?0:1;return n!==s?n-s:t.localeCompare(i)};return Object.keys(this.colorsById).sort(e).map(t=>`- \\`${t}\\`: ${this.colorsById[t].description}`).join(`\n`)}}const KC=new vH;di.add(qP.ColorContribution,KC);function CH(o){return o===null||typeof o.hcLight==\"undefined\"&&(o.hcDark===null||typeof o.hcDark==\"string\"?o.hcLight=o.hcDark:o.hcLight=o.light),o}function N(o,e,t,i,n){return KC.registerColor(o,CH(e),t,i,n)}const X=N(\"foreground\",{dark:\"#CCCCCC\",light:\"#616161\",hcDark:\"#FFFFFF\",hcLight:\"#292929\"},p(\"foreground\",\"Overall foreground color. This color is only used if not overridden by a component.\"));N(\"disabledForeground\",{dark:\"#CCCCCC80\",light:\"#61616180\",hcDark:\"#A5A5A5\",hcLight:\"#7F7F7F\"},p(\"disabledForeground\",\"Overall foreground for disabled elements. This color is only used if not overridden by a component.\"));const wH=N(\"errorForeground\",{dark:\"#F48771\",light:\"#A1260D\",hcDark:\"#F48771\",hcLight:\"#B5200D\"},p(\"errorForeground\",\"Overall foreground color for error messages. This color is only used if not overridden by a component.\"));N(\"descriptionForeground\",{light:\"#717171\",dark:fe(X,.7),hcDark:fe(X,.7),hcLight:fe(X,.7)},p(\"descriptionForeground\",\"Foreground color for description text providing additional information, for example for a label.\"));const z_=N(\"icon.foreground\",{dark:\"#C5C5C5\",light:\"#424242\",hcDark:\"#FFFFFF\",hcLight:\"#292929\"},p(\"iconForeground\",\"The default color for icons in the workbench.\")),Hs=N(\"focusBorder\",{dark:\"#007FD4\",light:\"#0090F1\",hcDark:\"#F38518\",hcLight:\"#0F4A85\"},p(\"focusBorder\",\"Overall border color for focused elements. This color is only used if not overridden by a component.\")),Be=N(\"contrastBorder\",{light:null,dark:null,hcDark:\"#6FC3DF\",hcLight:\"#0F4A85\"},p(\"contrastBorder\",\"An extra border around elements to separate them from others for greater contrast.\")),At=N(\"contrastActiveBorder\",{light:null,dark:null,hcDark:Hs,hcLight:Hs},p(\"activeContrastBorder\",\"An extra border around active elements to separate them from others for greater contrast.\"));N(\"selection.background\",{light:null,dark:null,hcDark:null,hcLight:null},p(\"selectionBackground\",\"The background color of text selections in the workbench (e.g. for input fields or text areas). Note that this does not apply to selections within the editor.\"));N(\"textSeparator.foreground\",{light:\"#0000002e\",dark:\"#ffffff2e\",hcDark:W.black,hcLight:\"#292929\"},p(\"textSeparatorForeground\",\"Color for text separators.\"));const qC=N(\"textLink.foreground\",{light:\"#006AB1\",dark:\"#3794FF\",hcDark:\"#3794FF\",hcLight:\"#0F4A85\"},p(\"textLinkForeground\",\"Foreground color for links in text.\")),GC=N(\"textLink.activeForeground\",{light:\"#006AB1\",dark:\"#3794FF\",hcDark:\"#3794FF\",hcLight:\"#0F4A85\"},p(\"textLinkActiveForeground\",\"Foreground color for links in text when clicked on and on mouse hover.\"));N(\"textPreformat.foreground\",{light:\"#A31515\",dark:\"#D7BA7D\",hcDark:\"#D7BA7D\",hcLight:\"#292929\"},p(\"textPreformatForeground\",\"Foreground color for preformatted text segments.\"));N(\"textBlockQuote.background\",{light:\"#7f7f7f1a\",dark:\"#7f7f7f1a\",hcDark:null,hcLight:\"#F2F2F2\"},p(\"textBlockQuoteBackground\",\"Background color for block quotes in text.\"));N(\"textBlockQuote.border\",{light:\"#007acc80\",dark:\"#007acc80\",hcDark:W.white,hcLight:\"#292929\"},p(\"textBlockQuoteBorder\",\"Border color for block quotes in text.\"));const GP=N(\"textCodeBlock.background\",{light:\"#dcdcdc66\",dark:\"#0a0a0a66\",hcDark:W.black,hcLight:\"#F2F2F2\"},p(\"textCodeBlockBackground\",\"Background color for code blocks in text.\")),Tr=N(\"widget.shadow\",{dark:fe(W.black,.36),light:fe(W.black,.16),hcDark:null,hcLight:null},p(\"widgetShadow\",\"Shadow color of widgets such as find/replace inside the editor.\")),ZC=N(\"input.background\",{dark:\"#3C3C3C\",light:W.white,hcDark:W.black,hcLight:W.white},p(\"inputBoxBackground\",\"Input box background.\")),YC=N(\"input.foreground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"inputBoxForeground\",\"Input box foreground.\")),XC=N(\"input.border\",{dark:null,light:null,hcDark:Be,hcLight:Be},p(\"inputBoxBorder\",\"Input box border.\")),Y0=N(\"inputOption.activeBorder\",{dark:\"#007ACC00\",light:\"#007ACC00\",hcDark:Be,hcLight:Be},p(\"inputBoxActiveOptionBorder\",\"Border color of activated options in input fields.\"));N(\"inputOption.hoverBackground\",{dark:\"#5a5d5e80\",light:\"#b8b8b850\",hcDark:null,hcLight:null},p(\"inputOption.hoverBackground\",\"Background color of activated options in input fields.\"));const X0=N(\"inputOption.activeBackground\",{dark:fe(Hs,.4),light:fe(Hs,.2),hcDark:W.transparent,hcLight:W.transparent},p(\"inputOption.activeBackground\",\"Background hover color of options in input fields.\")),Q0=N(\"inputOption.activeForeground\",{dark:W.white,light:W.black,hcDark:null,hcLight:X},p(\"inputOption.activeForeground\",\"Foreground color of activated options in input fields.\"));N(\"input.placeholderForeground\",{light:fe(X,.5),dark:fe(X,.5),hcDark:fe(X,.7),hcLight:fe(X,.7)},p(\"inputPlaceholderForeground\",\"Input box foreground color for placeholder text.\"));const lI=N(\"inputValidation.infoBackground\",{dark:\"#063B49\",light:\"#D6ECF2\",hcDark:W.black,hcLight:W.white},p(\"inputValidationInfoBackground\",\"Input validation background color for information severity.\")),cI=N(\"inputValidation.infoForeground\",{dark:null,light:null,hcDark:null,hcLight:X},p(\"inputValidationInfoForeground\",\"Input validation foreground color for information severity.\")),dI=N(\"inputValidation.infoBorder\",{dark:\"#007acc\",light:\"#007acc\",hcDark:Be,hcLight:Be},p(\"inputValidationInfoBorder\",\"Input validation border color for information severity.\")),hI=N(\"inputValidation.warningBackground\",{dark:\"#352A05\",light:\"#F6F5D2\",hcDark:W.black,hcLight:W.white},p(\"inputValidationWarningBackground\",\"Input validation background color for warning severity.\")),uI=N(\"inputValidation.warningForeground\",{dark:null,light:null,hcDark:null,hcLight:X},p(\"inputValidationWarningForeground\",\"Input validation foreground color for warning severity.\")),gI=N(\"inputValidation.warningBorder\",{dark:\"#B89500\",light:\"#B89500\",hcDark:Be,hcLight:Be},p(\"inputValidationWarningBorder\",\"Input validation border color for warning severity.\")),fI=N(\"inputValidation.errorBackground\",{dark:\"#5A1D1D\",light:\"#F2DEDE\",hcDark:W.black,hcLight:W.white},p(\"inputValidationErrorBackground\",\"Input validation background color for error severity.\")),pI=N(\"inputValidation.errorForeground\",{dark:null,light:null,hcDark:null,hcLight:X},p(\"inputValidationErrorForeground\",\"Input validation foreground color for error severity.\")),mI=N(\"inputValidation.errorBorder\",{dark:\"#BE1100\",light:\"#BE1100\",hcDark:Be,hcLight:Be},p(\"inputValidationErrorBorder\",\"Input validation border color for error severity.\")),Oa=N(\"dropdown.background\",{dark:\"#3C3C3C\",light:W.white,hcDark:W.black,hcLight:W.white},p(\"dropdownBackground\",\"Dropdown background.\"));N(\"dropdown.listBackground\",{dark:null,light:null,hcDark:W.black,hcLight:W.white},p(\"dropdownListBackground\",\"Dropdown list background.\"));const od=N(\"dropdown.foreground\",{dark:\"#F0F0F0\",light:null,hcDark:W.white,hcLight:X},p(\"dropdownForeground\",\"Dropdown foreground.\")),U_=N(\"dropdown.border\",{dark:Oa,light:\"#CECECE\",hcDark:Be,hcLight:Be},p(\"dropdownBorder\",\"Dropdown border.\"));N(\"checkbox.background\",{dark:Oa,light:Oa,hcDark:Oa,hcLight:Oa},p(\"checkbox.background\",\"Background color of checkbox widget.\"));N(\"checkbox.foreground\",{dark:od,light:od,hcDark:od,hcLight:od},p(\"checkbox.foreground\",\"Foreground color of checkbox widget.\"));N(\"checkbox.border\",{dark:U_,light:U_,hcDark:U_,hcLight:U_},p(\"checkbox.border\",\"Border color of checkbox widget.\"));const Of=N(\"button.foreground\",{dark:W.white,light:W.white,hcDark:W.white,hcLight:W.white},p(\"buttonForeground\",\"Button foreground color.\"));N(\"button.separator\",{dark:fe(Of,.4),light:fe(Of,.4),hcDark:fe(Of,.4),hcLight:fe(Of,.4)},p(\"buttonSeparator\",\"Button separator color.\"));const zy=N(\"button.background\",{dark:\"#0E639C\",light:\"#007ACC\",hcDark:null,hcLight:\"#0F4A85\"},p(\"buttonBackground\",\"Button background color.\")),SH=N(\"button.hoverBackground\",{dark:$o(zy,.2),light:_h(zy,.2),hcDark:null,hcLight:null},p(\"buttonHoverBackground\",\"Button background color when hovering.\"));N(\"button.border\",{dark:Be,light:Be,hcDark:Be,hcLight:Be},p(\"buttonBorder\",\"Button border color.\"));N(\"button.secondaryForeground\",{dark:W.white,light:W.white,hcDark:W.white,hcLight:X},p(\"buttonSecondaryForeground\",\"Secondary button foreground color.\"));const HT=N(\"button.secondaryBackground\",{dark:\"#3A3D41\",light:\"#5F6A79\",hcDark:null,hcLight:W.white},p(\"buttonSecondaryBackground\",\"Secondary button background color.\"));N(\"button.secondaryHoverBackground\",{dark:$o(HT,.2),light:_h(HT,.2),hcDark:null,hcLight:null},p(\"buttonSecondaryHoverBackground\",\"Secondary button background color when hovering.\"));const du=N(\"badge.background\",{dark:\"#4D4D4D\",light:\"#C4C4C4\",hcDark:W.black,hcLight:\"#0F4A85\"},p(\"badgeBackground\",\"Badge background color. Badges are small information labels, e.g. for search results count.\")),hu=N(\"badge.foreground\",{dark:W.white,light:\"#333\",hcDark:W.white,hcLight:W.white},p(\"badgeForeground\",\"Badge foreground color. Badges are small information labels, e.g. for search results count.\")),Hg=N(\"scrollbar.shadow\",{dark:\"#000000\",light:\"#DDDDDD\",hcDark:null,hcLight:null},p(\"scrollbarShadow\",\"Scrollbar shadow to indicate that the view is scrolled.\")),rd=N(\"scrollbarSlider.background\",{dark:W.fromHex(\"#797979\").transparent(.4),light:W.fromHex(\"#646464\").transparent(.4),hcDark:fe(Be,.6),hcLight:fe(Be,.4)},p(\"scrollbarSliderBackground\",\"Scrollbar slider background color.\")),ad=N(\"scrollbarSlider.hoverBackground\",{dark:W.fromHex(\"#646464\").transparent(.7),light:W.fromHex(\"#646464\").transparent(.7),hcDark:fe(Be,.8),hcLight:fe(Be,.8)},p(\"scrollbarSliderHoverBackground\",\"Scrollbar slider background color when hovering.\")),ld=N(\"scrollbarSlider.activeBackground\",{dark:W.fromHex(\"#BFBFBF\").transparent(.4),light:W.fromHex(\"#000000\").transparent(.6),hcDark:Be,hcLight:Be},p(\"scrollbarSliderActiveBackground\",\"Scrollbar slider background color when clicked on.\")),yH=N(\"progressBar.background\",{dark:W.fromHex(\"#0E70C0\"),light:W.fromHex(\"#0E70C0\"),hcDark:Be,hcLight:Be},p(\"progressBarBackground\",\"Background color of the progress bar that can show for long running operations.\")),LH=N(\"editorError.background\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"editorError.background\",\"Background color of error text in the editor. The color must not be opaque so as not to hide underlying decorations.\"),!0),Mr=N(\"editorError.foreground\",{dark:\"#F14C4C\",light:\"#E51400\",hcDark:\"#F48771\",hcLight:\"#B5200D\"},p(\"editorError.foreground\",\"Foreground color of error squigglies in the editor.\")),ZP=N(\"editorError.border\",{dark:null,light:null,hcDark:W.fromHex(\"#E47777\").transparent(.8),hcLight:\"#B5200D\"},p(\"errorBorder\",\"Border color of error boxes in the editor.\")),DH=N(\"editorWarning.background\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"editorWarning.background\",\"Background color of warning text in the editor. The color must not be opaque so as not to hide underlying decorations.\"),!0),Cs=N(\"editorWarning.foreground\",{dark:\"#CCA700\",light:\"#BF8803\",hcDark:\"#FFD37\",hcLight:\"#895503\"},p(\"editorWarning.foreground\",\"Foreground color of warning squigglies in the editor.\")),og=N(\"editorWarning.border\",{dark:null,light:null,hcDark:W.fromHex(\"#FFCC00\").transparent(.8),hcLight:\"#\"},p(\"warningBorder\",\"Border color of warning boxes in the editor.\")),kH=N(\"editorInfo.background\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"editorInfo.background\",\"Background color of info text in the editor. The color must not be opaque so as not to hide underlying decorations.\"),!0),Bn=N(\"editorInfo.foreground\",{dark:\"#3794FF\",light:\"#1a85ff\",hcDark:\"#3794FF\",hcLight:\"#1a85ff\"},p(\"editorInfo.foreground\",\"Foreground color of info squigglies in the editor.\")),J0=N(\"editorInfo.border\",{dark:null,light:null,hcDark:W.fromHex(\"#3794FF\").transparent(.8),hcLight:\"#292929\"},p(\"infoBorder\",\"Border color of info boxes in the editor.\")),xH=N(\"editorHint.foreground\",{dark:W.fromHex(\"#eeeeee\").transparent(.7),light:\"#6c6c6c\",hcDark:null,hcLight:null},p(\"editorHint.foreground\",\"Foreground color of hint squigglies in the editor.\")),IH=N(\"editorHint.border\",{dark:null,light:null,hcDark:W.fromHex(\"#eeeeee\").transparent(.8),hcLight:\"#292929\"},p(\"hintBorder\",\"Border color of hint boxes in the editor.\"));N(\"sash.hoverBorder\",{dark:Hs,light:Hs,hcDark:Hs,hcLight:Hs},p(\"sashActiveBorder\",\"Border color of active sashes.\"));const bi=N(\"editor.background\",{light:\"#ffffff\",dark:\"#1E1E1E\",hcDark:W.black,hcLight:W.white},p(\"editorBackground\",\"Editor background color.\")),ws=N(\"editor.foreground\",{light:\"#333333\",dark:\"#BBBBBB\",hcDark:W.white,hcLight:X},p(\"editorForeground\",\"Editor default foreground color.\"));N(\"editorStickyScroll.background\",{light:bi,dark:bi,hcDark:bi,hcLight:bi},p(\"editorStickyScrollBackground\",\"Sticky scroll background color for the editor\"));N(\"editorStickyScrollHover.background\",{dark:\"#2A2D2E\",light:\"#F0F0F0\",hcDark:null,hcLight:W.fromHex(\"#0F4A85\").transparent(.1)},p(\"editorStickyScrollHoverBackground\",\"Sticky scroll on hover background color for the editor\"));const ci=N(\"editorWidget.background\",{dark:\"#252526\",light:\"#F3F3F3\",hcDark:\"#0C141F\",hcLight:W.white},p(\"editorWidgetBackground\",\"Background color of editor widgets, such as find/replace.\")),Ar=N(\"editorWidget.foreground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"editorWidgetForeground\",\"Foreground color of editor widgets, such as find/replace.\")),Pa=N(\"editorWidget.border\",{dark:\"#454545\",light:\"#C8C8C8\",hcDark:Be,hcLight:Be},p(\"editorWidgetBorder\",\"Border color of editor widgets. The color is only used if the widget chooses to have a border and if the color is not overridden by a widget.\")),EH=N(\"editorWidget.resizeBorder\",{light:null,dark:null,hcDark:null,hcLight:null},p(\"editorWidgetResizeBorder\",\"Border color of the resize bar of editor widgets. The color is only used if the widget chooses to have a resize border and if the color is not overridden by a widget.\")),zT=N(\"quickInput.background\",{dark:ci,light:ci,hcDark:ci,hcLight:ci},p(\"pickerBackground\",\"Quick picker background color. The quick picker widget is the container for pickers like the command palette.\")),NH=N(\"quickInput.foreground\",{dark:Ar,light:Ar,hcDark:Ar,hcLight:Ar},p(\"pickerForeground\",\"Quick picker foreground color. The quick picker widget is the container for pickers like the command palette.\")),TH=N(\"quickInputTitle.background\",{dark:new W(new je(255,255,255,.105)),light:new W(new je(0,0,0,.06)),hcDark:\"#000000\",hcLight:W.white},p(\"pickerTitleBackground\",\"Quick picker title background color. The quick picker widget is the container for pickers like the command palette.\")),MH=N(\"pickerGroup.foreground\",{dark:\"#3794FF\",light:\"#0066BF\",hcDark:W.white,hcLight:\"#0F4A85\"},p(\"pickerGroupForeground\",\"Quick picker color for grouping labels.\")),AH=N(\"pickerGroup.border\",{dark:\"#3F3F46\",light:\"#CCCEDB\",hcDark:W.white,hcLight:\"#0F4A85\"},p(\"pickerGroupBorder\",\"Quick picker color for grouping borders.\")),RH=N(\"keybindingLabel.background\",{dark:new W(new je(128,128,128,.17)),light:new W(new je(221,221,221,.4)),hcDark:W.transparent,hcLight:W.transparent},p(\"keybindingLabelBackground\",\"Keybinding label background color. The keybinding label is used to represent a keyboard shortcut.\")),OH=N(\"keybindingLabel.foreground\",{dark:W.fromHex(\"#CCCCCC\"),light:W.fromHex(\"#555555\"),hcDark:W.white,hcLight:X},p(\"keybindingLabelForeground\",\"Keybinding label foreground color. The keybinding label is used to represent a keyboard shortcut.\")),PH=N(\"keybindingLabel.border\",{dark:new W(new je(51,51,51,.6)),light:new W(new je(204,204,204,.4)),hcDark:new W(new je(111,195,223)),hcLight:Be},p(\"keybindingLabelBorder\",\"Keybinding label border color. The keybinding label is used to represent a keyboard shortcut.\")),FH=N(\"keybindingLabel.bottomBorder\",{dark:new W(new je(68,68,68,.6)),light:new W(new je(187,187,187,.4)),hcDark:new W(new je(111,195,223)),hcLight:X},p(\"keybindingLabelBottomBorder\",\"Keybinding label border bottom color. The keybinding label is used to represent a keyboard shortcut.\")),Fa=N(\"editor.selectionBackground\",{light:\"#ADD6FF\",dark:\"#264F78\",hcDark:\"#f3f518\",hcLight:\"#0F4A85\"},p(\"editorSelectionBackground\",\"Color of the editor selection.\")),BH=N(\"editor.selectionForeground\",{light:null,dark:null,hcDark:\"#000000\",hcLight:W.white},p(\"editorSelectionForeground\",\"Color of the selected text for high contrast.\")),_I=N(\"editor.inactiveSelectionBackground\",{light:fe(Fa,.5),dark:fe(Fa,.5),hcDark:fe(Fa,.7),hcLight:fe(Fa,.5)},p(\"editorInactiveSelection\",\"Color of the selection in an inactive editor. The color must not be opaque so as not to hide underlying decorations.\"),!0),bI=N(\"editor.selectionHighlightBackground\",{light:GT(Fa,bi,.3,.6),dark:GT(Fa,bi,.3,.6),hcDark:null,hcLight:null},p(\"editorSelectionHighlight\",\"Color for regions with the same content as the selection. The color must not be opaque so as not to hide underlying decorations.\"),!0),WH=N(\"editor.selectionHighlightBorder\",{light:null,dark:null,hcDark:At,hcLight:At},p(\"editorSelectionHighlightBorder\",\"Border color for regions with the same content as the selection.\")),VH=N(\"editor.findMatchBackground\",{light:\"#A8AC94\",dark:\"#515C6A\",hcDark:null,hcLight:null},p(\"editorFindMatch\",\"Color of the current search match.\")),Ba=N(\"editor.findMatchHighlightBackground\",{light:\"#EA5C0055\",dark:\"#EA5C0055\",hcDark:null,hcLight:null},p(\"findMatchHighlight\",\"Color of the other search matches. The color must not be opaque so as not to hide underlying decorations.\"),!0),HH=N(\"editor.findRangeHighlightBackground\",{dark:\"#3a3d4166\",light:\"#b4b4b44d\",hcDark:null,hcLight:null},p(\"findRangeHighlight\",\"Color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations.\"),!0),zH=N(\"editor.findMatchBorder\",{light:null,dark:null,hcDark:At,hcLight:At},p(\"editorFindMatchBorder\",\"Border color of the current search match.\")),cd=N(\"editor.findMatchHighlightBorder\",{light:null,dark:null,hcDark:At,hcLight:At},p(\"findMatchHighlightBorder\",\"Border color of the other search matches.\")),UH=N(\"editor.findRangeHighlightBorder\",{dark:null,light:null,hcDark:fe(At,.4),hcLight:fe(At,.4)},p(\"findRangeHighlightBorder\",\"Border color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations.\"),!0);N(\"searchEditor.findMatchBackground\",{light:fe(Ba,.66),dark:fe(Ba,.66),hcDark:Ba,hcLight:Ba},p(\"searchEditor.queryMatch\",\"Color of the Search Editor query matches.\"));N(\"searchEditor.findMatchBorder\",{light:fe(cd,.66),dark:fe(cd,.66),hcDark:cd,hcLight:cd},p(\"searchEditor.editorFindMatchBorder\",\"Border color of the Search Editor query matches.\"));const $H=N(\"editor.hoverHighlightBackground\",{light:\"#ADD6FF26\",dark:\"#264f7840\",hcDark:\"#ADD6FF26\",hcLight:null},p(\"hoverHighlight\",\"Highlight below the word for which a hover is shown. The color must not be opaque so as not to hide underlying decorations.\"),!0),rg=N(\"editorHoverWidget.background\",{light:ci,dark:ci,hcDark:ci,hcLight:ci},p(\"hoverBackground\",\"Background color of the editor hover.\")),YP=N(\"editorHoverWidget.foreground\",{light:Ar,dark:Ar,hcDark:Ar,hcLight:Ar},p(\"hoverForeground\",\"Foreground color of the editor hover.\")),XP=N(\"editorHoverWidget.border\",{light:Pa,dark:Pa,hcDark:Pa,hcLight:Pa},p(\"hoverBorder\",\"Border color of the editor hover.\")),jH=N(\"editorHoverWidget.statusBarBackground\",{dark:$o(rg,.2),light:_h(rg,.05),hcDark:ci,hcLight:ci},p(\"statusBarBackground\",\"Background color of the editor hover status bar.\")),vI=N(\"editorLink.activeForeground\",{dark:\"#4E94CE\",light:W.blue,hcDark:W.cyan,hcLight:\"#292929\"},p(\"activeLinkForeground\",\"Color of active links.\")),Wa=N(\"editorInlayHint.foreground\",{dark:fe(hu,.8),light:fe(hu,.8),hcDark:hu,hcLight:hu},p(\"editorInlayHintForeground\",\"Foreground color of inline hints\")),Va=N(\"editorInlayHint.background\",{dark:fe(du,.6),light:fe(du,.3),hcDark:du,hcLight:du},p(\"editorInlayHintBackground\",\"Background color of inline hints\")),KH=N(\"editorInlayHint.typeForeground\",{dark:Wa,light:Wa,hcDark:Wa,hcLight:Wa},p(\"editorInlayHintForegroundTypes\",\"Foreground color of inline hints for types\")),qH=N(\"editorInlayHint.typeBackground\",{dark:Va,light:Va,hcDark:Va,hcLight:Va},p(\"editorInlayHintBackgroundTypes\",\"Background color of inline hints for types\")),GH=N(\"editorInlayHint.parameterForeground\",{dark:Wa,light:Wa,hcDark:Wa,hcLight:Wa},p(\"editorInlayHintForegroundParameter\",\"Foreground color of inline hints for parameters\")),ZH=N(\"editorInlayHint.parameterBackground\",{dark:Va,light:Va,hcDark:Va,hcLight:Va},p(\"editorInlayHintBackgroundParameter\",\"Background color of inline hints for parameters\")),YH=N(\"editorLightBulb.foreground\",{dark:\"#FFCC00\",light:\"#DDB100\",hcDark:\"#FFCC00\",hcLight:\"#007ACC\"},p(\"editorLightBulbForeground\",\"The color used for the lightbulb actions icon.\")),XH=N(\"editorLightBulbAutoFix.foreground\",{dark:\"#75BEFF\",light:\"#007ACC\",hcDark:\"#75BEFF\",hcLight:\"#007ACC\"},p(\"editorLightBulbAutoFixForeground\",\"The color used for the lightbulb auto fix actions icon.\")),Uy=new W(new je(155,185,85,.2)),$y=new W(new je(255,0,0,.2)),QP=N(\"diffEditor.insertedTextBackground\",{dark:\"#9ccc2c33\",light:\"#9ccc2c66\",hcDark:null,hcLight:null},p(\"diffEditorInserted\",\"Background color for text that got inserted. The color must not be opaque so as not to hide underlying decorations.\"),!0),JP=N(\"diffEditor.removedTextBackground\",{dark:\"#ff000066\",light:\"#ff00004d\",hcDark:null,hcLight:null},p(\"diffEditorRemoved\",\"Background color for text that got removed. The color must not be opaque so as not to hide underlying decorations.\"),!0),QH=N(\"diffEditor.insertedLineBackground\",{dark:Uy,light:Uy,hcDark:null,hcLight:null},p(\"diffEditorInsertedLines\",\"Background color for lines that got inserted. The color must not be opaque so as not to hide underlying decorations.\"),!0),JH=N(\"diffEditor.removedLineBackground\",{dark:$y,light:$y,hcDark:null,hcLight:null},p(\"diffEditorRemovedLines\",\"Background color for lines that got removed. The color must not be opaque so as not to hide underlying decorations.\"),!0),ez=N(\"diffEditorGutter.insertedLineBackground\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"diffEditorInsertedLineGutter\",\"Background color for the margin where lines got inserted.\")),tz=N(\"diffEditorGutter.removedLineBackground\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"diffEditorRemovedLineGutter\",\"Background color for the margin where lines got removed.\")),iz=N(\"diffEditorOverview.insertedForeground\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"diffEditorOverviewInserted\",\"Diff overview ruler foreground for inserted content.\")),nz=N(\"diffEditorOverview.removedForeground\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"diffEditorOverviewRemoved\",\"Diff overview ruler foreground for removed content.\")),sz=N(\"diffEditor.insertedTextBorder\",{dark:null,light:null,hcDark:\"#33ff2eff\",hcLight:\"#374E06\"},p(\"diffEditorInsertedOutline\",\"Outline color for the text that got inserted.\")),oz=N(\"diffEditor.removedTextBorder\",{dark:null,light:null,hcDark:\"#FF008F\",hcLight:\"#AD0707\"},p(\"diffEditorRemovedOutline\",\"Outline color for text that got removed.\")),rz=N(\"diffEditor.border\",{dark:null,light:null,hcDark:Be,hcLight:Be},p(\"diffEditorBorder\",\"Border color between the two text editors.\")),az=N(\"diffEditor.diagonalFill\",{dark:\"#cccccc33\",light:\"#22222233\",hcDark:null,hcLight:null},p(\"diffDiagonalFill\",\"Color of the diff editor's diagonal fill. The diagonal fill is used in side-by-side diff views.\")),lz=N(\"list.focusBackground\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"listFocusBackground\",\"List/Tree background color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.\")),cz=N(\"list.focusForeground\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"listFocusForeground\",\"List/Tree foreground color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.\")),dz=N(\"list.focusOutline\",{dark:Hs,light:Hs,hcDark:At,hcLight:At},p(\"listFocusOutline\",\"List/Tree outline color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.\")),hz=N(\"list.focusAndSelectionOutline\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"listFocusAndSelectionOutline\",\"List/Tree outline color for the focused item when the list/tree is active and selected. An active list/tree has keyboard focus, an inactive does not.\")),Ha=N(\"list.activeSelectionBackground\",{dark:\"#04395E\",light:\"#0060C0\",hcDark:null,hcLight:W.fromHex(\"#0F4A85\").transparent(.1)},p(\"listActiveSelectionBackground\",\"List/Tree background color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.\")),Rr=N(\"list.activeSelectionForeground\",{dark:W.white,light:W.white,hcDark:null,hcLight:null},p(\"listActiveSelectionForeground\",\"List/Tree foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.\")),Pf=N(\"list.activeSelectionIconForeground\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"listActiveSelectionIconForeground\",\"List/Tree icon foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.\")),uz=N(\"list.inactiveSelectionBackground\",{dark:\"#37373D\",light:\"#E4E6F1\",hcDark:null,hcLight:W.fromHex(\"#0F4A85\").transparent(.1)},p(\"listInactiveSelectionBackground\",\"List/Tree background color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.\")),gz=N(\"list.inactiveSelectionForeground\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"listInactiveSelectionForeground\",\"List/Tree foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.\")),fz=N(\"list.inactiveSelectionIconForeground\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"listInactiveSelectionIconForeground\",\"List/Tree icon foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.\")),pz=N(\"list.inactiveFocusBackground\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"listInactiveFocusBackground\",\"List/Tree background color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.\")),mz=N(\"list.inactiveFocusOutline\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"listInactiveFocusOutline\",\"List/Tree outline color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.\")),_z=N(\"list.hoverBackground\",{dark:\"#2A2D2E\",light:\"#F0F0F0\",hcDark:null,hcLight:W.fromHex(\"#0F4A85\").transparent(.1)},p(\"listHoverBackground\",\"List/Tree background when hovering over items using the mouse.\")),bz=N(\"list.hoverForeground\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"listHoverForeground\",\"List/Tree foreground when hovering over items using the mouse.\")),vz=N(\"list.dropBackground\",{dark:\"#062F4A\",light:\"#D6EBFF\",hcDark:null,hcLight:null},p(\"listDropBackground\",\"List/Tree drag and drop background when moving items around using the mouse.\")),ho=N(\"list.highlightForeground\",{dark:\"#2AAAFF\",light:\"#0066BF\",hcDark:Hs,hcLight:Hs},p(\"highlight\",\"List/Tree foreground color of the match highlights when searching inside the list/tree.\")),$_=N(\"list.focusHighlightForeground\",{dark:ho,light:jz(Ha,ho,\"#BBE7FF\"),hcDark:ho,hcLight:ho},p(\"listFocusHighlightForeground\",\"List/Tree foreground color of the match highlights on actively focused items when searching inside the list/tree.\"));N(\"list.invalidItemForeground\",{dark:\"#B89500\",light:\"#B89500\",hcDark:\"#B89500\",hcLight:\"#B5200D\"},p(\"invalidItemForeground\",\"List/Tree foreground color for invalid items, for example an unresolved root in explorer.\"));N(\"list.errorForeground\",{dark:\"#F88070\",light:\"#B01011\",hcDark:null,hcLight:null},p(\"listErrorForeground\",\"Foreground color of list items containing errors.\"));N(\"list.warningForeground\",{dark:\"#CCA700\",light:\"#855F00\",hcDark:null,hcLight:null},p(\"listWarningForeground\",\"Foreground color of list items containing warnings.\"));const Cz=N(\"listFilterWidget.background\",{light:_h(ci,0),dark:$o(ci,0),hcDark:ci,hcLight:ci},p(\"listFilterWidgetBackground\",\"Background color of the type filter widget in lists and trees.\")),wz=N(\"listFilterWidget.outline\",{dark:W.transparent,light:W.transparent,hcDark:\"#f38518\",hcLight:\"#007ACC\"},p(\"listFilterWidgetOutline\",\"Outline color of the type filter widget in lists and trees.\")),Sz=N(\"listFilterWidget.noMatchesOutline\",{dark:\"#BE1100\",light:\"#BE1100\",hcDark:Be,hcLight:Be},p(\"listFilterWidgetNoMatchesOutline\",\"Outline color of the type filter widget in lists and trees, when there are no matches.\")),yz=N(\"listFilterWidget.shadow\",{dark:Tr,light:Tr,hcDark:Tr,hcLight:Tr},p(\"listFilterWidgetShadow\",\"Shadown color of the type filter widget in lists and trees.\"));N(\"list.filterMatchBackground\",{dark:Ba,light:Ba,hcDark:null,hcLight:null},p(\"listFilterMatchHighlight\",\"Background color of the filtered match.\"));N(\"list.filterMatchBorder\",{dark:cd,light:cd,hcDark:Be,hcLight:At},p(\"listFilterMatchHighlightBorder\",\"Border color of the filtered match.\"));const Lz=N(\"tree.indentGuidesStroke\",{dark:\"#585858\",light:\"#a9a9a9\",hcDark:\"#a9a9a9\",hcLight:\"#a5a5a5\"},p(\"treeIndentGuidesStroke\",\"Tree stroke color for the indentation guides.\")),Dz=N(\"tree.tableColumnsBorder\",{dark:\"#CCCCCC20\",light:\"#61616120\",hcDark:null,hcLight:null},p(\"tableColumnsBorder\",\"Table border color between columns.\")),kz=N(\"tree.tableOddRowsBackground\",{dark:fe(X,.04),light:fe(X,.04),hcDark:null,hcLight:null},p(\"tableOddRowsBackgroundColor\",\"Background color for odd table rows.\"));N(\"list.deemphasizedForeground\",{dark:\"#8C8C8C\",light:\"#8E8E90\",hcDark:\"#A7A8A9\",hcLight:\"#666666\"},p(\"listDeemphasizedForeground\",\"List/Tree foreground color for items that are deemphasized. \"));const UT=N(\"quickInput.list.focusBackground\",{dark:null,light:null,hcDark:null,hcLight:null},\"\",void 0,p(\"quickInput.list.focusBackground deprecation\",\"Please use quickInputList.focusBackground instead\")),Ff=N(\"quickInputList.focusForeground\",{dark:Rr,light:Rr,hcDark:Rr,hcLight:Rr},p(\"quickInput.listFocusForeground\",\"Quick picker foreground color for the focused item.\")),Bf=N(\"quickInputList.focusIconForeground\",{dark:Pf,light:Pf,hcDark:Pf,hcLight:Pf},p(\"quickInput.listFocusIconForeground\",\"Quick picker icon foreground color for the focused item.\")),Wf=N(\"quickInputList.focusBackground\",{dark:Bp(UT,Ha),light:Bp(UT,Ha),hcDark:null,hcLight:null},p(\"quickInput.listFocusBackground\",\"Quick picker background color for the focused item.\")),xz=N(\"menu.border\",{dark:null,light:null,hcDark:Be,hcLight:Be},p(\"menuBorder\",\"Border color of menus.\")),Iz=N(\"menu.foreground\",{dark:od,light:X,hcDark:od,hcLight:od},p(\"menuForeground\",\"Foreground color of menu items.\")),Ez=N(\"menu.background\",{dark:Oa,light:Oa,hcDark:Oa,hcLight:Oa},p(\"menuBackground\",\"Background color of menu items.\")),Nz=N(\"menu.selectionForeground\",{dark:Rr,light:Rr,hcDark:Rr,hcLight:Rr},p(\"menuSelectionForeground\",\"Foreground color of the selected menu item in menus.\")),Tz=N(\"menu.selectionBackground\",{dark:Ha,light:Ha,hcDark:Ha,hcLight:Ha},p(\"menuSelectionBackground\",\"Background color of the selected menu item in menus.\")),Mz=N(\"menu.selectionBorder\",{dark:null,light:null,hcDark:At,hcLight:At},p(\"menuSelectionBorder\",\"Border color of the selected menu item in menus.\")),Az=N(\"menu.separatorBackground\",{dark:\"#606060\",light:\"#D4D4D4\",hcDark:Be,hcLight:Be},p(\"menuSeparatorBackground\",\"Color of a separator menu item in menus.\")),jy=N(\"toolbar.hoverBackground\",{dark:\"#5a5d5e50\",light:\"#b8b8b850\",hcDark:null,hcLight:null},p(\"toolbarHoverBackground\",\"Toolbar background when hovering over actions using the mouse\"));N(\"toolbar.hoverOutline\",{dark:null,light:null,hcDark:At,hcLight:At},p(\"toolbarHoverOutline\",\"Toolbar outline when hovering over actions using the mouse\"));N(\"toolbar.activeBackground\",{dark:$o(jy,.1),light:_h(jy,.1),hcDark:null,hcLight:null},p(\"toolbarActiveBackground\",\"Toolbar background when holding the mouse over actions\"));N(\"editor.snippetTabstopHighlightBackground\",{dark:new W(new je(124,124,124,.3)),light:new W(new je(10,50,100,.2)),hcDark:new W(new je(124,124,124,.3)),hcLight:new W(new je(10,50,100,.2))},p(\"snippetTabstopHighlightBackground\",\"Highlight background color of a snippet tabstop.\"));N(\"editor.snippetTabstopHighlightBorder\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"snippetTabstopHighlightBorder\",\"Highlight border color of a snippet tabstop.\"));N(\"editor.snippetFinalTabstopHighlightBackground\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"snippetFinalTabstopHighlightBackground\",\"Highlight background color of the final tabstop of a snippet.\"));N(\"editor.snippetFinalTabstopHighlightBorder\",{dark:\"#525252\",light:new W(new je(10,50,100,.5)),hcDark:\"#525252\",hcLight:\"#292929\"},p(\"snippetFinalTabstopHighlightBorder\",\"Highlight border color of the final tabstop of a snippet.\"));N(\"breadcrumb.foreground\",{light:fe(X,.8),dark:fe(X,.8),hcDark:fe(X,.8),hcLight:fe(X,.8)},p(\"breadcrumbsFocusForeground\",\"Color of focused breadcrumb items.\"));N(\"breadcrumb.background\",{light:bi,dark:bi,hcDark:bi,hcLight:bi},p(\"breadcrumbsBackground\",\"Background color of breadcrumb items.\"));N(\"breadcrumb.focusForeground\",{light:_h(X,.2),dark:$o(X,.1),hcDark:$o(X,.1),hcLight:$o(X,.1)},p(\"breadcrumbsFocusForeground\",\"Color of focused breadcrumb items.\"));N(\"breadcrumb.activeSelectionForeground\",{light:_h(X,.2),dark:$o(X,.1),hcDark:$o(X,.1),hcLight:$o(X,.1)},p(\"breadcrumbsSelectedForeground\",\"Color of selected breadcrumb items.\"));N(\"breadcrumbPicker.background\",{light:ci,dark:ci,hcDark:ci,hcLight:ci},p(\"breadcrumbsSelectedBackground\",\"Background color of breadcrumb item picker.\"));const e4=.5,$T=W.fromHex(\"#40C8AE\").transparent(e4),jT=W.fromHex(\"#40A6FF\").transparent(e4),KT=W.fromHex(\"#606060\").transparent(.4),uo=.4,ag=1,uu=N(\"merge.currentHeaderBackground\",{dark:$T,light:$T,hcDark:null,hcLight:null},p(\"mergeCurrentHeaderBackground\",\"Current header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.\"),!0);N(\"merge.currentContentBackground\",{dark:fe(uu,uo),light:fe(uu,uo),hcDark:fe(uu,uo),hcLight:fe(uu,uo)},p(\"mergeCurrentContentBackground\",\"Current content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.\"),!0);const gu=N(\"merge.incomingHeaderBackground\",{dark:jT,light:jT,hcDark:null,hcLight:null},p(\"mergeIncomingHeaderBackground\",\"Incoming header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.\"),!0);N(\"merge.incomingContentBackground\",{dark:fe(gu,uo),light:fe(gu,uo),hcDark:fe(gu,uo),hcLight:fe(gu,uo)},p(\"mergeIncomingContentBackground\",\"Incoming content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.\"),!0);const fu=N(\"merge.commonHeaderBackground\",{dark:KT,light:KT,hcDark:null,hcLight:null},p(\"mergeCommonHeaderBackground\",\"Common ancestor header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.\"),!0);N(\"merge.commonContentBackground\",{dark:fe(fu,uo),light:fe(fu,uo),hcDark:fe(fu,uo),hcLight:fe(fu,uo)},p(\"mergeCommonContentBackground\",\"Common ancestor content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations.\"),!0);const lg=N(\"merge.border\",{dark:null,light:null,hcDark:\"#C3DF6F\",hcLight:\"#007ACC\"},p(\"mergeBorder\",\"Border color on headers and the splitter in inline merge-conflicts.\"));N(\"editorOverviewRuler.currentContentForeground\",{dark:fe(uu,ag),light:fe(uu,ag),hcDark:lg,hcLight:lg},p(\"overviewRulerCurrentContentForeground\",\"Current overview ruler foreground for inline merge-conflicts.\"));N(\"editorOverviewRuler.incomingContentForeground\",{dark:fe(gu,ag),light:fe(gu,ag),hcDark:lg,hcLight:lg},p(\"overviewRulerIncomingContentForeground\",\"Incoming overview ruler foreground for inline merge-conflicts.\"));N(\"editorOverviewRuler.commonContentForeground\",{dark:fe(fu,ag),light:fe(fu,ag),hcDark:lg,hcLight:lg},p(\"overviewRulerCommonContentForeground\",\"Common ancestor overview ruler foreground for inline merge-conflicts.\"));const CI=N(\"editorOverviewRuler.findMatchForeground\",{dark:\"#d186167e\",light:\"#d186167e\",hcDark:\"#AB5A00\",hcLight:\"\"},p(\"overviewRulerFindMatchForeground\",\"Overview ruler marker color for find matches. The color must not be opaque so as not to hide underlying decorations.\"),!0),t4=N(\"editorOverviewRuler.selectionHighlightForeground\",{dark:\"#A0A0A0CC\",light:\"#A0A0A0CC\",hcDark:\"#A0A0A0CC\",hcLight:\"#A0A0A0CC\"},p(\"overviewRulerSelectionHighlightForeground\",\"Overview ruler marker color for selection highlights. The color must not be opaque so as not to hide underlying decorations.\"),!0),pu=N(\"minimap.findMatchHighlight\",{light:\"#d18616\",dark:\"#d18616\",hcDark:\"#AB5A00\",hcLight:\"#0F4A85\"},p(\"minimapFindMatchHighlight\",\"Minimap marker color for find matches.\"),!0),QC=N(\"minimap.selectionOccurrenceHighlight\",{light:\"#c9c9c9\",dark:\"#676767\",hcDark:\"#ffffff\",hcLight:\"#0F4A85\"},p(\"minimapSelectionOccurrenceHighlight\",\"Minimap marker color for repeating editor selections.\"),!0),qT=N(\"minimap.selectionHighlight\",{light:\"#ADD6FF\",dark:\"#264F78\",hcDark:\"#ffffff\",hcLight:\"#0F4A85\"},p(\"minimapSelectionHighlight\",\"Minimap marker color for the editor selection.\"),!0),Rz=N(\"minimap.errorHighlight\",{dark:new W(new je(255,18,18,.7)),light:new W(new je(255,18,18,.7)),hcDark:new W(new je(255,50,50,1)),hcLight:\"#B5200D\"},p(\"minimapError\",\"Minimap marker color for errors.\")),Oz=N(\"minimap.warningHighlight\",{dark:Cs,light:Cs,hcDark:og,hcLight:og},p(\"overviewRuleWarning\",\"Minimap marker color for warnings.\")),Pz=N(\"minimap.background\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"minimapBackground\",\"Minimap background color.\")),Fz=N(\"minimap.foregroundOpacity\",{dark:W.fromHex(\"#000f\"),light:W.fromHex(\"#000f\"),hcDark:W.fromHex(\"#000f\"),hcLight:W.fromHex(\"#000f\")},p(\"minimapForegroundOpacity\",'Opacity of foreground elements rendered in the minimap. For example, \"#000000c0\" will render the elements with 75% opacity.')),Bz=N(\"minimapSlider.background\",{light:fe(rd,.5),dark:fe(rd,.5),hcDark:fe(rd,.5),hcLight:fe(rd,.5)},p(\"minimapSliderBackground\",\"Minimap slider background color.\")),Wz=N(\"minimapSlider.hoverBackground\",{light:fe(ad,.5),dark:fe(ad,.5),hcDark:fe(ad,.5),hcLight:fe(ad,.5)},p(\"minimapSliderHoverBackground\",\"Minimap slider background color when hovering.\")),Vz=N(\"minimapSlider.activeBackground\",{light:fe(ld,.5),dark:fe(ld,.5),hcDark:fe(ld,.5),hcLight:fe(ld,.5)},p(\"minimapSliderActiveBackground\",\"Minimap slider background color when clicked on.\")),Hz=N(\"problemsErrorIcon.foreground\",{dark:Mr,light:Mr,hcDark:Mr,hcLight:Mr},p(\"problemsErrorIconForeground\",\"The color used for the problems error icon.\")),zz=N(\"problemsWarningIcon.foreground\",{dark:Cs,light:Cs,hcDark:Cs,hcLight:Cs},p(\"problemsWarningIconForeground\",\"The color used for the problems warning icon.\")),Uz=N(\"problemsInfoIcon.foreground\",{dark:Bn,light:Bn,hcDark:Bn,hcLight:Bn},p(\"problemsInfoIconForeground\",\"The color used for the problems info icon.\"));N(\"charts.foreground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"chartsForeground\",\"The foreground color used in charts.\"));N(\"charts.lines\",{dark:fe(X,.5),light:fe(X,.5),hcDark:fe(X,.5),hcLight:fe(X,.5)},p(\"chartsLines\",\"The color used for horizontal lines in charts.\"));N(\"charts.red\",{dark:Mr,light:Mr,hcDark:Mr,hcLight:Mr},p(\"chartsRed\",\"The red color used in chart visualizations.\"));N(\"charts.blue\",{dark:Bn,light:Bn,hcDark:Bn,hcLight:Bn},p(\"chartsBlue\",\"The blue color used in chart visualizations.\"));N(\"charts.yellow\",{dark:Cs,light:Cs,hcDark:Cs,hcLight:Cs},p(\"chartsYellow\",\"The yellow color used in chart visualizations.\"));N(\"charts.orange\",{dark:pu,light:pu,hcDark:pu,hcLight:pu},p(\"chartsOrange\",\"The orange color used in chart visualizations.\"));N(\"charts.green\",{dark:\"#89D185\",light:\"#388A34\",hcDark:\"#89D185\",hcLight:\"#374e06\"},p(\"chartsGreen\",\"The green color used in chart visualizations.\"));N(\"charts.purple\",{dark:\"#B180D7\",light:\"#652D90\",hcDark:\"#B180D7\",hcLight:\"#652D90\"},p(\"chartsPurple\",\"The purple color used in chart visualizations.\"));function $z(o,e){var t,i,n;switch(o.op){case 0:return(t=ba(o.value,e))===null||t===void 0?void 0:t.darken(o.factor);case 1:return(i=ba(o.value,e))===null||i===void 0?void 0:i.lighten(o.factor);case 2:return(n=ba(o.value,e))===null||n===void 0?void 0:n.transparent(o.factor);case 3:for(const s of o.values){const r=ba(s,e);if(r)return r}return;case 5:return ba(e.defines(o.if)?o.then:o.else,e);case 4:{const s=ba(o.value,e);if(!s)return;const r=ba(o.background,e);return r?s.isDarkerThan(r)?W.getLighterColor(s,r,o.factor).transparent(o.transparency):W.getDarkerColor(s,r,o.factor).transparent(o.transparency):s.transparent(o.factor*o.transparency)}default:throw wC()}}function _h(o,e){return{op:0,value:o,factor:e}}function $o(o,e){return{op:1,value:o,factor:e}}function fe(o,e){return{op:2,value:o,factor:e}}function Bp(...o){return{op:3,values:o}}function jz(o,e,t){return{op:5,if:o,then:e,else:t}}function GT(o,e,t,i){return{op:4,value:o,background:e,factor:t,transparency:i}}function ba(o,e){if(o!==null){if(typeof o==\"string\")return o[0]===\"#\"?W.fromHex(o):e.getColor(o);if(o instanceof W)return o;if(typeof o==\"object\")return $z(o,e)}}const i4=\"vscode://schemas/workbench-colors\",n4=di.as(UC.JSONContribution);n4.registerSchema(i4,KC.getColorSchema());const ZT=new ft(()=>n4.notifySchemaChanged(i4),200);KC.onDidChangeSchema(()=>{ZT.isScheduled()||ZT.schedule()});class wI{constructor(e,t){this.x=e,this.y=t,this._pageCoordinatesBrand=void 0}toClientCoordinates(){return new s4(this.x-qa.scrollX,this.y-qa.scrollY)}}class s4{constructor(e,t){this.clientX=e,this.clientY=t,this._clientCoordinatesBrand=void 0}toPageCoordinates(){return new wI(this.clientX+qa.scrollX,this.clientY+qa.scrollY)}}class Kz{constructor(e,t,i,n){this.x=e,this.y=t,this.width=i,this.height=n,this._editorPagePositionBrand=void 0}}class qz{constructor(e,t){this.x=e,this.y=t,this._positionRelativeToEditorBrand=void 0}}function o4(o){const e=Qi(o);return new Kz(e.left,e.top,e.width,e.height)}function r4(o,e,t){const i=e.width/o.offsetWidth,n=e.height/o.offsetHeight,s=(t.x-e.x)/i,r=(t.y-e.y)/n;return new qz(s,r)}class cc extends Ir{constructor(e,t,i){super(e),this._editorMouseEventBrand=void 0,this.isFromPointerCapture=t,this.pos=new wI(this.posx,this.posy),this.editorPos=o4(i),this.relativePos=r4(i,this.editorPos,this.pos)}}class Gz{constructor(e){this._editorViewDomNode=e}_create(e){return new cc(e,!1,this._editorViewDomNode)}onContextMenu(e,t){return q(e,\"contextmenu\",i=>{t(this._create(i))})}onMouseUp(e,t){return q(e,\"mouseup\",i=>{t(this._create(i))})}onMouseDown(e,t){return q(e,le.MOUSE_DOWN,i=>{t(this._create(i))})}onPointerDown(e,t){return q(e,le.POINTER_DOWN,i=>{t(this._create(i),i.pointerId)})}onMouseLeave(e,t){return q(e,le.MOUSE_LEAVE,i=>{t(this._create(i))})}onMouseMove(e,t){return q(e,\"mousemove\",i=>t(this._create(i)))}}class Zz{constructor(e){this._editorViewDomNode=e}_create(e){return new cc(e,!1,this._editorViewDomNode)}onPointerUp(e,t){return q(e,\"pointerup\",i=>{t(this._create(i))})}onPointerDown(e,t){return q(e,le.POINTER_DOWN,i=>{t(this._create(i),i.pointerId)})}onPointerLeave(e,t){return q(e,le.POINTER_LEAVE,i=>{t(this._create(i))})}onPointerMove(e,t){return q(e,\"pointermove\",i=>t(this._create(i)))}}class Yz extends z{constructor(e){super(),this._editorViewDomNode=e,this._globalPointerMoveMonitor=this._register(new Vg),this._keydownListener=null}startMonitoring(e,t,i,n,s){this._keydownListener=Ei(document,\"keydown\",r=>{r.toKeybinding().isModifierKey()||this._globalPointerMoveMonitor.stopMonitoring(!0,r.browserEvent)},!0),this._globalPointerMoveMonitor.startMonitoring(e,t,i,r=>{n(new cc(r,!0,this._editorViewDomNode))},r=>{this._keydownListener.dispose(),s(r)})}stopMonitoring(){this._globalPointerMoveMonitor.stopMonitoring(!0)}}class Gm{constructor(e){this._editor=e,this._instanceId=++Gm._idPool,this._counter=0,this._rules=new Map,this._garbageCollectionScheduler=new ft(()=>this.garbageCollect(),1e3)}createClassNameRef(e){const t=this.getOrCreateRule(e);return t.increaseRefCount(),{className:t.className,dispose:()=>{t.decreaseRefCount(),this._garbageCollectionScheduler.schedule()}}}getOrCreateRule(e){const t=this.computeUniqueKey(e);let i=this._rules.get(t);if(!i){const n=this._counter++;i=new Xz(t,`dyn-rule-${this._instanceId}-${n}`,Dp(this._editor.getContainerDomNode())?this._editor.getContainerDomNode():void 0,e),this._rules.set(t,i)}return i}computeUniqueKey(e){return JSON.stringify(e)}garbageCollect(){for(const e of this._rules.values())e.hasReferences()||(this._rules.delete(e.key),e.dispose())}}Gm._idPool=0;class Xz{constructor(e,t,i,n){this.key=e,this.className=t,this.properties=n,this._referenceCount=0,this._styleElement=qs(i),this._styleElement.textContent=this.getCssText(this.className,this.properties)}getCssText(e,t){let i=`.${e} {`;for(const n in t){const s=t[n];let r;typeof s==\"object\"?r=`var(${KP(s.id)})`:r=s,i+=`\n\t${Qz(n)}: ${r};`}return i+=`\n}`,i}dispose(){this._styleElement.remove()}increaseRefCount(){this._referenceCount++}decreaseRefCount(){this._referenceCount--}hasReferences(){return this._referenceCount>0}}function Qz(o){return o.replace(/(^[A-Z])/,([e])=>e.toLowerCase()).replace(/([A-Z])/g,([e])=>`-${e.toLowerCase()}`)}class Zm extends z{constructor(){super(),this._shouldRender=!0}shouldRender(){return this._shouldRender}forceShouldRender(){this._shouldRender=!0}setShouldRender(){this._shouldRender=!0}onDidRender(){this._shouldRender=!1}onCompositionStart(e){return!1}onCompositionEnd(e){return!1}onConfigurationChanged(e){return!1}onCursorStateChanged(e){return!1}onDecorationsChanged(e){return!1}onFlushed(e){return!1}onFocusChanged(e){return!1}onLanguageConfigurationChanged(e){return!1}onLineMappingChanged(e){return!1}onLinesChanged(e){return!1}onLinesDeleted(e){return!1}onLinesInserted(e){return!1}onRevealRangeRequest(e){return!1}onScrollChanged(e){return!1}onThemeChanged(e){return!1}onTokensChanged(e){return!1}onTokensColorsChanged(e){return!1}onZonesChanged(e){return!1}handleEvents(e){let t=!1;for(let i=0,n=e.length;i<n;i++){const s=e[i];switch(s.type){case 0:this.onCompositionStart(s)&&(t=!0);break;case 1:this.onCompositionEnd(s)&&(t=!0);break;case 2:this.onConfigurationChanged(s)&&(t=!0);break;case 3:this.onCursorStateChanged(s)&&(t=!0);break;case 4:this.onDecorationsChanged(s)&&(t=!0);break;case 5:this.onFlushed(s)&&(t=!0);break;case 6:this.onFocusChanged(s)&&(t=!0);break;case 7:this.onLanguageConfigurationChanged(s)&&(t=!0);break;case 8:this.onLineMappingChanged(s)&&(t=!0);break;case 9:this.onLinesChanged(s)&&(t=!0);break;case 10:this.onLinesDeleted(s)&&(t=!0);break;case 11:this.onLinesInserted(s)&&(t=!0);break;case 12:this.onRevealRangeRequest(s)&&(t=!0);break;case 13:this.onScrollChanged(s)&&(t=!0);break;case 15:this.onTokensChanged(s)&&(t=!0);break;case 14:this.onThemeChanged(s)&&(t=!0);break;case 16:this.onTokensColorsChanged(s)&&(t=!0);break;case 17:this.onZonesChanged(s)&&(t=!0);break;default:console.info(\"View received unknown event: \"),console.info(s)}}t&&(this._shouldRender=!0)}}class Es extends Zm{constructor(e){super(),this._context=e,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),super.dispose()}}class jr{static write(e,t){e.setAttribute(\"data-mprt\",String(t))}static read(e){const t=e.getAttribute(\"data-mprt\");return t===null?0:parseInt(t,10)}static collect(e,t){const i=[];let n=0;for(;e&&e!==document.body&&e!==t;)e.nodeType===e.ELEMENT_NODE&&(i[n++]=this.read(e)),e=e.parentElement;const s=new Uint8Array(n);for(let r=0;r<n;r++)s[r]=i[n-r-1];return s}}class Jz{constructor(e,t){this._restrictedRenderingContextBrand=void 0,this._viewLayout=e,this.viewportData=t,this.scrollWidth=this._viewLayout.getScrollWidth(),this.scrollHeight=this._viewLayout.getScrollHeight(),this.visibleRange=this.viewportData.visibleRange,this.bigNumbersDelta=this.viewportData.bigNumbersDelta;const i=this._viewLayout.getCurrentViewport();this.scrollTop=i.top,this.scrollLeft=i.left,this.viewportWidth=i.width,this.viewportHeight=i.height}getScrolledTopFromAbsoluteTop(e){return e-this.scrollTop}getVerticalOffsetForLineNumber(e){return this._viewLayout.getVerticalOffsetForLineNumber(e)}getDecorationsInViewport(){return this.viewportData.getDecorationsInViewport()}}class eU extends Jz{constructor(e,t,i){super(e,t),this._renderingContextBrand=void 0,this._viewLines=i}linesVisibleRangesForRange(e,t){return this._viewLines.linesVisibleRangesForRange(e,t)}visibleRangeForPosition(e){return this._viewLines.visibleRangeForPosition(e)}}class tU{constructor(e,t,i){this.outsideRenderedLine=e,this.lineNumber=t,this.ranges=i}}class JC{constructor(e,t){this._horizontalRangeBrand=void 0,this.left=Math.round(e),this.width=Math.round(t)}static from(e){const t=new Array(e.length);for(let i=0,n=e.length;i<n;i++){const s=e[i];t[i]=new JC(s.left,s.width)}return t}toString(){return`[${this.left},${this.width}]`}}class Ru{constructor(e,t){this._floatHorizontalRangeBrand=void 0,this.left=e,this.width=t}toString(){return`[${this.left},${this.width}]`}static compare(e,t){return e.left-t.left}}class iU{constructor(e,t){this.outsideRenderedLine=e,this.originalLeft=t,this.left=Math.round(this.originalLeft)}}class nU{constructor(e,t){this.outsideRenderedLine=e,this.ranges=t}}class Rw{static _createRange(){return this._handyReadyRange||(this._handyReadyRange=document.createRange()),this._handyReadyRange}static _detachRange(e,t){e.selectNodeContents(t)}static _readClientRects(e,t,i,n,s){const r=this._createRange();try{return r.setStart(e,t),r.setEnd(i,n),r.getClientRects()}catch(a){return null}finally{this._detachRange(r,s)}}static _mergeAdjacentRanges(e){if(e.length===1)return e;e.sort(Ru.compare);const t=[];let i=0,n=e[0];for(let s=1,r=e.length;s<r;s++){const a=e[s];n.left+n.width+.9>=a.left?n.width=Math.max(n.width,a.left+a.width-n.left):(t[i++]=n,n=a)}return t[i++]=n,t}static _createHorizontalRangesFromClientRects(e,t,i){if(!e||e.length===0)return null;const n=[];for(let s=0,r=e.length;s<r;s++){const a=e[s];n[s]=new Ru(Math.max(0,(a.left-t)/i),a.width/i)}return this._mergeAdjacentRanges(n)}static readHorizontalRanges(e,t,i,n,s,r,a,l){const d=e.children.length-1;if(0>d)return null;if(t=Math.min(d,Math.max(0,t)),n=Math.min(d,Math.max(0,n)),t===n&&i===s&&i===0&&!e.children[t].firstChild){const f=e.children[t].getClientRects();return this._createHorizontalRangesFromClientRects(f,r,a)}t!==n&&n>0&&s===0&&(n--,s=1073741824);let h=e.children[t].firstChild,u=e.children[n].firstChild;if((!h||!u)&&(!h&&i===0&&t>0&&(h=e.children[t-1].firstChild,i=1073741824),!u&&s===0&&n>0&&(u=e.children[n-1].firstChild,s=1073741824)),!h||!u)return null;i=Math.min(h.textContent.length,Math.max(0,i)),s=Math.min(u.textContent.length,Math.max(0,s));const g=this._readClientRects(h,i,u,s,l);return this._createHorizontalRangesFromClientRects(g,r,a)}}class es{constructor(e,t,i,n){this.startColumn=e,this.endColumn=t,this.className=i,this.type=n,this._lineDecorationBrand=void 0}static _equals(e,t){return e.startColumn===t.startColumn&&e.endColumn===t.endColumn&&e.className===t.className&&e.type===t.type}static equalsArr(e,t){const i=e.length,n=t.length;if(i!==n)return!1;for(let s=0;s<i;s++)if(!es._equals(e[s],t[s]))return!1;return!0}static extractWrapped(e,t,i){if(e.length===0)return e;const n=t+1,s=i+1,r=i-t,a=[];let l=0;for(const c of e)c.endColumn<=n||c.startColumn>=s||(a[l++]=new es(Math.max(1,c.startColumn-n+1),Math.min(r+1,c.endColumn-n+1),c.className,c.type));return a}static filter(e,t,i,n){if(e.length===0)return[];const s=[];let r=0;for(let a=0,l=e.length;a<l;a++){const c=e[a],d=c.range;if(d.endLineNumber<t||d.startLineNumber>t||d.isEmpty()&&(c.type===0||c.type===3))continue;const h=d.startLineNumber===t?d.startColumn:i,u=d.endLineNumber===t?d.endColumn:n;s[r++]=new es(h,u,c.inlineClassName,c.type)}return s}static _typeCompare(e,t){const i=[2,0,1,3];return i[e]-i[t]}static compare(e,t){if(e.startColumn!==t.startColumn)return e.startColumn-t.startColumn;if(e.endColumn!==t.endColumn)return e.endColumn-t.endColumn;const i=es._typeCompare(e.type,t.type);return i!==0?i:e.className!==t.className?e.className<t.className?-1:1:0}}class YT{constructor(e,t,i,n){this.startOffset=e,this.endOffset=t,this.className=i,this.metadata=n}}class ev{constructor(){this.stopOffsets=[],this.classNames=[],this.metadata=[],this.count=0}static _metadata(e){let t=0;for(let i=0,n=e.length;i<n;i++)t|=e[i];return t}consumeLowerThan(e,t,i){for(;this.count>0&&this.stopOffsets[0]<e;){let n=0;for(;n+1<this.count&&this.stopOffsets[n]===this.stopOffsets[n+1];)n++;i.push(new YT(t,this.stopOffsets[n],this.classNames.join(\" \"),ev._metadata(this.metadata))),t=this.stopOffsets[n]+1,this.stopOffsets.splice(0,n+1),this.classNames.splice(0,n+1),this.metadata.splice(0,n+1),this.count-=n+1}return this.count>0&&t<e&&(i.push(new YT(t,e-1,this.classNames.join(\" \"),ev._metadata(this.metadata))),t=e),t}insert(e,t,i){if(this.count===0||this.stopOffsets[this.count-1]<=e)this.stopOffsets.push(e),this.classNames.push(t),this.metadata.push(i);else for(let n=0;n<this.count;n++)if(this.stopOffsets[n]>=e){this.stopOffsets.splice(n,0,e),this.classNames.splice(n,0,t),this.metadata.splice(n,0,i);break}this.count++}}class sU{static normalize(e,t){if(t.length===0)return[];const i=[],n=new ev;let s=0;for(let r=0,a=t.length;r<a;r++){const l=t[r];let c=l.startColumn,d=l.endColumn;const h=l.className,u=l.type===1?2:l.type===2?4:0;if(c>1){const _=e.charCodeAt(c-2);wi(_)&&c--}if(d>1){const _=e.charCodeAt(d-2);wi(_)&&d--}const g=c-1,f=d-2;s=n.consumeLowerThan(g,s,i),n.count===0&&(s=g),n.insert(f,h,u)}return n.consumeLowerThan(1073741824,s,i),i}}class xi{constructor(e,t,i,n){this.endIndex=e,this.type=t,this.metadata=i,this.containsRTL=n,this._linePartBrand=void 0}isWhitespace(){return!!(this.metadata&1)}isPseudoAfter(){return!!(this.metadata&4)}}class oU{constructor(e,t){this.startOffset=e,this.endOffset=t}equals(e){return this.startOffset===e.startOffset&&this.endOffset===e.endOffset}}class Dc{constructor(e,t,i,n,s,r,a,l,c,d,h,u,g,f,_,b,v,C,w){this.useMonospaceOptimizations=e,this.canUseHalfwidthRightwardsArrow=t,this.lineContent=i,this.continuesWithWrappedLine=n,this.isBasicASCII=s,this.containsRTL=r,this.fauxIndentLength=a,this.lineTokens=l,this.lineDecorations=c.sort(es.compare),this.tabSize=d,this.startVisibleColumn=h,this.spaceWidth=u,this.stopRenderingLineAfter=_,this.renderWhitespace=b===\"all\"?4:b===\"boundary\"?1:b===\"selection\"?2:b===\"trailing\"?3:0,this.renderControlCharacters=v,this.fontLigatures=C,this.selectionsOnLine=w&&w.sort((x,y)=>x.startOffset<y.startOffset?-1:1);const S=Math.abs(f-u),k=Math.abs(g-u);S<k?(this.renderSpaceWidth=f,this.renderSpaceCharCode=11825):(this.renderSpaceWidth=g,this.renderSpaceCharCode=183)}sameSelection(e){if(this.selectionsOnLine===null)return e===null;if(e===null||e.length!==this.selectionsOnLine.length)return!1;for(let t=0;t<this.selectionsOnLine.length;t++)if(!this.selectionsOnLine[t].equals(e[t]))return!1;return!0}equals(e){return this.useMonospaceOptimizations===e.useMonospaceOptimizations&&this.canUseHalfwidthRightwardsArrow===e.canUseHalfwidthRightwardsArrow&&this.lineContent===e.lineContent&&this.continuesWithWrappedLine===e.continuesWithWrappedLine&&this.isBasicASCII===e.isBasicASCII&&this.containsRTL===e.containsRTL&&this.fauxIndentLength===e.fauxIndentLength&&this.tabSize===e.tabSize&&this.startVisibleColumn===e.startVisibleColumn&&this.spaceWidth===e.spaceWidth&&this.renderSpaceWidth===e.renderSpaceWidth&&this.renderSpaceCharCode===e.renderSpaceCharCode&&this.stopRenderingLineAfter===e.stopRenderingLineAfter&&this.renderWhitespace===e.renderWhitespace&&this.renderControlCharacters===e.renderControlCharacters&&this.fontLigatures===e.fontLigatures&&es.equalsArr(this.lineDecorations,e.lineDecorations)&&this.lineTokens.equals(e.lineTokens)&&this.sameSelection(e.selectionsOnLine)}}class SI{constructor(e,t){this.partIndex=e,this.charIndex=t}}class Cr{constructor(e,t){this.length=e,this._data=new Uint32Array(this.length),this._horizontalOffset=new Uint32Array(this.length)}static getPartIndex(e){return(e&4294901760)>>>16}static getCharIndex(e){return(e&65535)>>>0}setColumnInfo(e,t,i,n){const s=(t<<16|i<<0)>>>0;this._data[e-1]=s,this._horizontalOffset[e-1]=n}getHorizontalOffset(e){return this._horizontalOffset.length===0?0:this._horizontalOffset[e-1]}charOffsetToPartData(e){return this.length===0?0:e<0?this._data[0]:e>=this.length?this._data[this.length-1]:this._data[e]}getDomPosition(e){const t=this.charOffsetToPartData(e-1),i=Cr.getPartIndex(t),n=Cr.getCharIndex(t);return new SI(i,n)}getColumn(e,t){return this.partDataToCharOffset(e.partIndex,t,e.charIndex)+1}partDataToCharOffset(e,t,i){if(this.length===0)return 0;const n=(e<<16|i<<0)>>>0;let s=0,r=this.length-1;for(;s+1<r;){const _=s+r>>>1,b=this._data[_];if(b===n)return _;b>n?r=_:s=_}if(s===r)return s;const a=this._data[s],l=this._data[r];if(a===n)return s;if(l===n)return r;const c=Cr.getPartIndex(a),d=Cr.getCharIndex(a),h=Cr.getPartIndex(l);let u;c!==h?u=t:u=Cr.getCharIndex(l);const g=i-d,f=u-i;return g<=f?s:r}}class Ky{constructor(e,t,i){this._renderLineOutputBrand=void 0,this.characterMapping=e,this.containsRTL=t,this.containsForeignElements=i}}function Ym(o,e){if(o.lineContent.length===0){if(o.lineDecorations.length>0){e.appendASCIIString(\"<span>\");let t=0,i=0,n=0;for(const r of o.lineDecorations)(r.type===1||r.type===2)&&(e.appendASCIIString('<span class=\"'),e.appendASCIIString(r.className),e.appendASCIIString('\"></span>'),r.type===1&&(n|=1,t++),r.type===2&&(n|=2,i++));e.appendASCIIString(\"</span>\");const s=new Cr(1,t+i);return s.setColumnInfo(1,t,0,0),new Ky(s,!1,n)}return e.appendASCIIString(\"<span><span></span></span>\"),new Ky(new Cr(0,0),!1,0)}return fU(lU(o),e)}class rU{constructor(e,t,i,n){this.characterMapping=e,this.html=t,this.containsRTL=i,this.containsForeignElements=n}}function e1(o){const e=lc(1e4),t=Ym(o,e);return new rU(t.characterMapping,e.build(),t.containsRTL,t.containsForeignElements)}class aU{constructor(e,t,i,n,s,r,a,l,c,d,h,u,g,f,_){this.fontIsMonospace=e,this.canUseHalfwidthRightwardsArrow=t,this.lineContent=i,this.len=n,this.isOverflowing=s,this.parts=r,this.containsForeignElements=a,this.fauxIndentLength=l,this.tabSize=c,this.startVisibleColumn=d,this.containsRTL=h,this.spaceWidth=u,this.renderSpaceCharCode=g,this.renderWhitespace=f,this.renderControlCharacters=_}}function lU(o){const e=o.lineContent;let t,i;o.stopRenderingLineAfter!==-1&&o.stopRenderingLineAfter<e.length?(t=!0,i=o.stopRenderingLineAfter):(t=!1,i=e.length);let n=cU(e,o.containsRTL,o.lineTokens,o.fauxIndentLength,i);o.renderControlCharacters&&!o.isBasicASCII&&(n=hU(e,n)),(o.renderWhitespace===4||o.renderWhitespace===1||o.renderWhitespace===2&&!!o.selectionsOnLine||o.renderWhitespace===3)&&(n=uU(o,e,i,n));let s=0;if(o.lineDecorations.length>0){for(let r=0,a=o.lineDecorations.length;r<a;r++){const l=o.lineDecorations[r];l.type===3||l.type===1?s|=1:l.type===2&&(s|=2)}n=gU(e,i,n,o.lineDecorations)}return o.containsRTL||(n=dU(e,n,!o.isBasicASCII||o.fontLigatures)),new aU(o.useMonospaceOptimizations,o.canUseHalfwidthRightwardsArrow,e,i,t,n,s,o.fauxIndentLength,o.tabSize,o.startVisibleColumn,o.containsRTL,o.spaceWidth,o.renderSpaceCharCode,o.renderWhitespace,o.renderControlCharacters)}function cU(o,e,t,i,n){const s=[];let r=0;i>0&&(s[r++]=new xi(i,\"\",0,!1));let a=i;for(let l=0,c=t.getCount();l<c;l++){const d=t.getEndOffset(l);if(d<=i)continue;const h=t.getClassName(l);if(d>=n){const g=e?ig(o.substring(a,n)):!1;s[r++]=new xi(n,h,0,g);break}const u=e?ig(o.substring(a,d)):!1;s[r++]=new xi(d,h,0,u),a=d}return s}function dU(o,e,t){let i=0;const n=[];let s=0;if(t)for(let r=0,a=e.length;r<a;r++){const l=e[r],c=l.endIndex;if(i+50<c){const d=l.type,h=l.metadata,u=l.containsRTL;let g=-1,f=i;for(let _=i;_<c;_++)o.charCodeAt(_)===32&&(g=_),g!==-1&&_-f>=50&&(n[s++]=new xi(g+1,d,h,u),f=g+1,g=-1);f!==c&&(n[s++]=new xi(c,d,h,u))}else n[s++]=l;i=c}else for(let r=0,a=e.length;r<a;r++){const l=e[r],c=l.endIndex,d=c-i;if(d>50){const h=l.type,u=l.metadata,g=l.containsRTL,f=Math.ceil(d/50);for(let _=1;_<f;_++){const b=i+_*50;n[s++]=new xi(b,h,u,g)}n[s++]=new xi(c,h,u,g)}else n[s++]=l;i=c}return n}function a4(o){return o<32?o!==9:o===127||o>=8234&&o<=8238||o>=8294&&o<=8297||o>=8206&&o<=8207||o===1564}function hU(o,e){const t=[];let i=new xi(0,\"\",0,!1),n=0;for(const s of e){const r=s.endIndex;for(;n<r;n++){const a=o.charCodeAt(n);a4(a)&&(n>i.endIndex&&(i=new xi(n,s.type,s.metadata,s.containsRTL),t.push(i)),i=new xi(n+1,\"mtkcontrol\",s.metadata,!1),t.push(i))}n>i.endIndex&&(i=new xi(r,s.type,s.metadata,s.containsRTL),t.push(i))}return t}function uU(o,e,t,i){const n=o.continuesWithWrappedLine,s=o.fauxIndentLength,r=o.tabSize,a=o.startVisibleColumn,l=o.useMonospaceOptimizations,c=o.selectionsOnLine,d=o.renderWhitespace===1,h=o.renderWhitespace===3,u=o.renderSpaceWidth!==o.spaceWidth,g=[];let f=0,_=0,b=i[_].type,v=i[_].containsRTL,C=i[_].endIndex;const w=i.length;let S=!1,k=Sn(e),x;k===-1?(S=!0,k=t,x=t):x=Fr(e);let y=!1,D=0,I=c&&c[D],R=a%r;for(let H=s;H<t;H++){const $=e.charCodeAt(H);I&&H>=I.endOffset&&(D++,I=c&&c[D]);let ne;if(H<k||H>x)ne=!0;else if($===9)ne=!0;else if($===32)if(d)if(y)ne=!0;else{const ae=H+1<t?e.charCodeAt(H+1):0;ne=ae===32||ae===9}else ne=!0;else ne=!1;if(ne&&c&&(ne=!!I&&I.startOffset<=H&&I.endOffset>H),ne&&h&&(ne=S||H>x),ne&&v&&H>=k&&H<=x&&(ne=!1),y){if(!ne||!l&&R>=r){if(u){const ae=f>0?g[f-1].endIndex:s;for(let de=ae+1;de<=H;de++)g[f++]=new xi(de,\"mtkw\",1,!1)}else g[f++]=new xi(H,\"mtkw\",1,!1);R=R%r}}else(H===C||ne&&H>s)&&(g[f++]=new xi(H,b,0,v),R=R%r);for($===9?R=r:oc($)?R+=2:R++,y=ne;H===C&&(_++,_<w);)b=i[_].type,v=i[_].containsRTL,C=i[_].endIndex}let P=!1;if(y)if(n&&d){const H=t>0?e.charCodeAt(t-1):0,$=t>1?e.charCodeAt(t-2):0;H===32&&$!==32&&$!==9||(P=!0)}else P=!0;if(P)if(u){const H=f>0?g[f-1].endIndex:s;for(let $=H+1;$<=t;$++)g[f++]=new xi($,\"mtkw\",1,!1)}else g[f++]=new xi(t,\"mtkw\",1,!1);else g[f++]=new xi(t,b,0,v);return g}function gU(o,e,t,i){i.sort(es.compare);const n=sU.normalize(o,i),s=n.length;let r=0;const a=[];let l=0,c=0;for(let h=0,u=t.length;h<u;h++){const g=t[h],f=g.endIndex,_=g.type,b=g.metadata,v=g.containsRTL;for(;r<s&&n[r].startOffset<f;){const C=n[r];if(C.startOffset>c&&(c=C.startOffset,a[l++]=new xi(c,_,b,v)),C.endOffset+1<=f)c=C.endOffset+1,a[l++]=new xi(c,_+\" \"+C.className,b|C.metadata,v),r++;else{c=f,a[l++]=new xi(c,_+\" \"+C.className,b|C.metadata,v);break}}f>c&&(c=f,a[l++]=new xi(c,_,b,v))}const d=t[t.length-1].endIndex;if(r<s&&n[r].startOffset===d)for(;r<s&&n[r].startOffset===d;){const h=n[r];a[l++]=new xi(c,h.className,h.metadata,!1),r++}return a}function fU(o,e){const t=o.fontIsMonospace,i=o.canUseHalfwidthRightwardsArrow,n=o.containsForeignElements,s=o.lineContent,r=o.len,a=o.isOverflowing,l=o.parts,c=o.fauxIndentLength,d=o.tabSize,h=o.startVisibleColumn,u=o.containsRTL,g=o.spaceWidth,f=o.renderSpaceCharCode,_=o.renderWhitespace,b=o.renderControlCharacters,v=new Cr(r+1,l.length);let C=!1,w=0,S=h,k=0,x=0,y=0;u?e.appendASCIIString('<span dir=\"ltr\">'):e.appendASCIIString(\"<span>\");for(let D=0,I=l.length;D<I;D++){const R=l[D],P=R.endIndex,H=R.type,$=R.containsRTL,ne=_!==0&&R.isWhitespace(),ae=ne&&!t&&(H===\"mtkw\"||!n),de=w===P&&R.isPseudoAfter();if(k=0,e.appendASCIIString(\"<span \"),$&&e.appendASCIIString('style=\"unicode-bidi:isolate\" '),e.appendASCIIString('class=\"'),e.appendASCIIString(ae?\"mtkz\":H),e.appendASCII(34),ne){let we=0;{let Se=w,Me=S;for(;Se<P;Se++){const mt=(s.charCodeAt(Se)===9?d-Me%d:1)|0;we+=mt,Se>=c&&(Me+=mt)}}for(ae&&(e.appendASCIIString(' style=\"width:'),e.appendASCIIString(String(g*we)),e.appendASCIIString('px\"')),e.appendASCII(62);w<P;w++){v.setColumnInfo(w+1,D-y,k,x),y=0;const Se=s.charCodeAt(w);let Me,St;if(Se===9){Me=d-S%d|0,St=Me,!i||St>1?e.write1(8594):e.write1(65515);for(let mt=2;mt<=St;mt++)e.write1(160)}else Me=2,St=1,e.write1(f),e.write1(8204);k+=Me,x+=St,w>=c&&(S+=St)}}else for(e.appendASCII(62);w<P;w++){v.setColumnInfo(w+1,D-y,k,x),y=0;const we=s.charCodeAt(w);let Se=1,Me=1;switch(we){case 9:Se=d-S%d,Me=Se;for(let St=1;St<=Se;St++)e.write1(160);break;case 32:e.write1(160);break;case 60:e.appendASCIIString(\"&lt;\");break;case 62:e.appendASCIIString(\"&gt;\");break;case 38:e.appendASCIIString(\"&amp;\");break;case 0:b?e.write1(9216):e.appendASCIIString(\"&#00;\");break;case 65279:case 8232:case 8233:case 133:e.write1(65533);break;default:oc(we)&&Me++,b&&we<32?e.write1(9216+we):b&&we===127?e.write1(9249):b&&a4(we)?(e.appendASCIIString(\"[U+\"),e.appendASCIIString(pU(we)),e.appendASCIIString(\"]\"),Se=8,Me=Se):e.write1(we)}k+=Se,x+=Me,w>=c&&(S+=Me)}de?y++:y=0,w>=r&&!C&&R.isPseudoAfter()&&(C=!0,v.setColumnInfo(w+1,D,k,x)),e.appendASCIIString(\"</span>\")}return C||v.setColumnInfo(r+1,l.length-1,k,x),a&&e.appendASCIIString(\"<span>&hellip;</span>\"),e.appendASCIIString(\"</span>\"),new Ky(v,u,n)}function pU(o){return o.toString(16).toUpperCase().padStart(4,\"0\")}const mU=function(){return Uo?!0:!(sn||Ls||Qa)}();let Ou=!0;class XT{constructor(e,t){this._domNode=e,this._clientRectDeltaLeft=0,this._clientRectScale=1,this._clientRectRead=!1,this.endNode=t}readClientRect(){if(!this._clientRectRead){this._clientRectRead=!0;const e=this._domNode.getBoundingClientRect();this._clientRectDeltaLeft=e.left,this._clientRectScale=e.width/this._domNode.offsetWidth}}get clientRectDeltaLeft(){return this._clientRectRead||this.readClientRect(),this._clientRectDeltaLeft}get clientRectScale(){return this._clientRectRead||this.readClientRect(),this._clientRectScale}}class QT{constructor(e,t){this.themeType=t;const i=e.options,n=i.get(46);this.renderWhitespace=i.get(90),this.renderControlCharacters=i.get(85),this.spaceWidth=n.spaceWidth,this.middotWidth=n.middotWidth,this.wsmiddotWidth=n.wsmiddotWidth,this.useMonospaceOptimizations=n.isMonospace&&!i.get(29),this.canUseHalfwidthRightwardsArrow=n.canUseHalfwidthRightwardsArrow,this.lineHeight=i.get(61),this.stopRenderingLineAfter=i.get(107),this.fontLigatures=i.get(47)}equals(e){return this.themeType===e.themeType&&this.renderWhitespace===e.renderWhitespace&&this.renderControlCharacters===e.renderControlCharacters&&this.spaceWidth===e.spaceWidth&&this.middotWidth===e.middotWidth&&this.wsmiddotWidth===e.wsmiddotWidth&&this.useMonospaceOptimizations===e.useMonospaceOptimizations&&this.canUseHalfwidthRightwardsArrow===e.canUseHalfwidthRightwardsArrow&&this.lineHeight===e.lineHeight&&this.stopRenderingLineAfter===e.stopRenderingLineAfter&&this.fontLigatures===e.fontLigatures}}class yr{constructor(e){this._options=e,this._isMaybeInvalid=!0,this._renderedViewLine=null}getDomNode(){return this._renderedViewLine&&this._renderedViewLine.domNode?this._renderedViewLine.domNode.domNode:null}setDomNode(e){if(this._renderedViewLine)this._renderedViewLine.domNode=Je(e);else throw new Error(\"I have no rendered view line to set the dom node to...\")}onContentChanged(){this._isMaybeInvalid=!0}onTokensChanged(){this._isMaybeInvalid=!0}onDecorationsChanged(){this._isMaybeInvalid=!0}onOptionsChanged(e){this._isMaybeInvalid=!0,this._options=e}onSelectionChanged(){return yn(this._options.themeType)||this._options.renderWhitespace===\"selection\"?(this._isMaybeInvalid=!0,!0):!1}renderLine(e,t,i,n){if(this._isMaybeInvalid===!1)return!1;this._isMaybeInvalid=!1;const s=i.getViewLineRenderingData(e),r=this._options,a=es.filter(s.inlineDecorations,e,s.minColumn,s.maxColumn);let l=null;if(yn(r.themeType)||this._options.renderWhitespace===\"selection\"){const u=i.selections;for(const g of u){if(g.endLineNumber<e||g.startLineNumber>e)continue;const f=g.startLineNumber===e?g.startColumn:s.minColumn,_=g.endLineNumber===e?g.endColumn:s.maxColumn;f<_&&(yn(r.themeType)||this._options.renderWhitespace!==\"selection\"?a.push(new es(f,_,\"inline-selected-text\",0)):(l||(l=[]),l.push(new oU(f-1,_-1))))}}const c=new Dc(r.useMonospaceOptimizations,r.canUseHalfwidthRightwardsArrow,s.content,s.continuesWithWrappedLine,s.isBasicASCII,s.containsRTL,s.minColumn-1,s.tokens,a,s.tabSize,s.startVisibleColumn,r.spaceWidth,r.middotWidth,r.wsmiddotWidth,r.stopRenderingLineAfter,r.renderWhitespace,r.renderControlCharacters,r.fontLigatures!==vs.OFF,l);if(this._renderedViewLine&&this._renderedViewLine.input.equals(c))return!1;n.appendASCIIString('<div style=\"top:'),n.appendASCIIString(String(t)),n.appendASCIIString(\"px;height:\"),n.appendASCIIString(String(this._options.lineHeight)),n.appendASCIIString('px;\" class=\"'),n.appendASCIIString(yr.CLASS_NAME),n.appendASCIIString('\">');const d=Ym(c,n);n.appendASCIIString(\"</div>\");let h=null;return Ou&&mU&&s.isBasicASCII&&r.useMonospaceOptimizations&&d.containsForeignElements===0&&s.content.length<300&&c.lineTokens.getCount()<100&&(h=new j_(this._renderedViewLine?this._renderedViewLine.domNode:null,c,d.characterMapping)),h||(h=c4(this._renderedViewLine?this._renderedViewLine.domNode:null,c,d.characterMapping,d.containsRTL,d.containsForeignElements)),this._renderedViewLine=h,!0}layoutLine(e,t){this._renderedViewLine&&this._renderedViewLine.domNode&&(this._renderedViewLine.domNode.setTop(t),this._renderedViewLine.domNode.setHeight(this._options.lineHeight))}getWidth(){return this._renderedViewLine?this._renderedViewLine.getWidth():0}getWidthIsFast(){return this._renderedViewLine?this._renderedViewLine.getWidthIsFast():!0}needsMonospaceFontCheck(){return this._renderedViewLine?this._renderedViewLine instanceof j_:!1}monospaceAssumptionsAreValid(){return this._renderedViewLine&&this._renderedViewLine instanceof j_?this._renderedViewLine.monospaceAssumptionsAreValid():Ou}onMonospaceAssumptionsInvalidated(){this._renderedViewLine&&this._renderedViewLine instanceof j_&&(this._renderedViewLine=this._renderedViewLine.toSlowRenderedLine())}getVisibleRangesForRange(e,t,i,n){if(!this._renderedViewLine)return null;t=Math.min(this._renderedViewLine.input.lineContent.length+1,Math.max(1,t)),i=Math.min(this._renderedViewLine.input.lineContent.length+1,Math.max(1,i));const s=this._renderedViewLine.input.stopRenderingLineAfter;let r=!1;s!==-1&&t>s+1&&i>s+1&&(r=!0),s!==-1&&t>s+1&&(t=s+1),s!==-1&&i>s+1&&(i=s+1);const a=this._renderedViewLine.getVisibleRangesForRange(e,t,i,n);return a&&a.length>0?new nU(r,a):null}getColumnOfNodeOffset(e,t,i){return this._renderedViewLine?this._renderedViewLine.getColumnOfNodeOffset(e,t,i):1}}yr.CLASS_NAME=\"view-line\";class j_{constructor(e,t,i){this.domNode=e,this.input=t,this._characterMapping=i,this._charWidth=t.spaceWidth}getWidth(){return Math.round(this._getCharPosition(this._characterMapping.length))}getWidthIsFast(){return!0}monospaceAssumptionsAreValid(){if(!this.domNode)return Ou;const e=this.getWidth(),t=this.domNode.domNode.firstChild.offsetWidth;return Math.abs(e-t)>=2&&(console.warn(\"monospace assumptions have been violated, therefore disabling monospace optimizations!\"),Ou=!1),Ou}toSlowRenderedLine(){return c4(this.domNode,this.input,this._characterMapping,!1,0)}getVisibleRangesForRange(e,t,i,n){const s=this._getCharPosition(t),r=this._getCharPosition(i);return[new Ru(s,r-s)]}_getCharPosition(e){const t=this._characterMapping.getHorizontalOffset(e);return this._charWidth*t}getColumnOfNodeOffset(e,t,i){const n=t.textContent.length;let s=-1;for(;t;)t=t.previousSibling,s++;return this._characterMapping.getColumn(new SI(s,i),n)}}class l4{constructor(e,t,i,n,s){if(this.domNode=e,this.input=t,this._characterMapping=i,this._isWhitespaceOnly=/^\\s*$/.test(t.lineContent),this._containsForeignElements=s,this._cachedWidth=-1,this._pixelOffsetCache=null,!n||this._characterMapping.length===0){this._pixelOffsetCache=new Float32Array(Math.max(2,this._characterMapping.length+1));for(let r=0,a=this._characterMapping.length;r<=a;r++)this._pixelOffsetCache[r]=-1}}_getReadingTarget(e){return e.domNode.firstChild}getWidth(){return this.domNode?(this._cachedWidth===-1&&(this._cachedWidth=this._getReadingTarget(this.domNode).offsetWidth),this._cachedWidth):0}getWidthIsFast(){return this._cachedWidth!==-1}getVisibleRangesForRange(e,t,i,n){if(!this.domNode)return null;if(this._pixelOffsetCache!==null){const s=this._readPixelOffset(this.domNode,e,t,n);if(s===-1)return null;const r=this._readPixelOffset(this.domNode,e,i,n);return r===-1?null:[new Ru(s,r-s)]}return this._readVisibleRangesForRange(this.domNode,e,t,i,n)}_readVisibleRangesForRange(e,t,i,n,s){if(i===n){const r=this._readPixelOffset(e,t,i,s);return r===-1?null:[new Ru(r,0)]}else return this._readRawVisibleRangesForRange(e,i,n,s)}_readPixelOffset(e,t,i,n){if(this._characterMapping.length===0){if(this._containsForeignElements===0||this._containsForeignElements===2)return 0;if(this._containsForeignElements===1)return this.getWidth();const s=this._getReadingTarget(e);return s.firstChild?s.firstChild.offsetWidth:0}if(this._pixelOffsetCache!==null){const s=this._pixelOffsetCache[i];if(s!==-1)return s;const r=this._actualReadPixelOffset(e,t,i,n);return this._pixelOffsetCache[i]=r,r}return this._actualReadPixelOffset(e,t,i,n)}_actualReadPixelOffset(e,t,i,n){if(this._characterMapping.length===0){const l=Rw.readHorizontalRanges(this._getReadingTarget(e),0,0,0,0,n.clientRectDeltaLeft,n.clientRectScale,n.endNode);return!l||l.length===0?-1:l[0].left}if(i===this._characterMapping.length&&this._isWhitespaceOnly&&this._containsForeignElements===0)return this.getWidth();const s=this._characterMapping.getDomPosition(i),r=Rw.readHorizontalRanges(this._getReadingTarget(e),s.partIndex,s.charIndex,s.partIndex,s.charIndex,n.clientRectDeltaLeft,n.clientRectScale,n.endNode);if(!r||r.length===0)return-1;const a=r[0].left;if(this.input.isBasicASCII){const l=this._characterMapping.getHorizontalOffset(i),c=Math.round(this.input.spaceWidth*l);if(Math.abs(c-a)<=1)return c}return a}_readRawVisibleRangesForRange(e,t,i,n){if(t===1&&i===this._characterMapping.length)return[new Ru(0,this.getWidth())];const s=this._characterMapping.getDomPosition(t),r=this._characterMapping.getDomPosition(i);return Rw.readHorizontalRanges(this._getReadingTarget(e),s.partIndex,s.charIndex,r.partIndex,r.charIndex,n.clientRectDeltaLeft,n.clientRectScale,n.endNode)}getColumnOfNodeOffset(e,t,i){const n=t.textContent.length;let s=-1;for(;t;)t=t.previousSibling,s++;return this._characterMapping.getColumn(new SI(s,i),n)}}class _U extends l4{_readVisibleRangesForRange(e,t,i,n,s){const r=super._readVisibleRangesForRange(e,t,i,n,s);if(!r||r.length===0||i===n||i===1&&n===this._characterMapping.length)return r;if(!this.input.containsRTL){const a=this._readPixelOffset(e,t,n,s);if(a!==-1){const l=r[r.length-1];l.left<a&&(l.width=a-l.left)}}return r}}const c4=function(){return $l?bU:vU}();function bU(o,e,t,i,n){return new _U(o,e,t,i,n)}function vU(o,e,t,i,n){return new l4(o,e,t,i,n)}class yl{constructor(e=null){this.hitTarget=e,this.type=0}}class qy{constructor(e,t,i){this.position=e,this.spanNode=t,this.injectedText=i,this.type=1}}var Xc;(function(o){function e(t,i,n){const s=t.getPositionFromDOMInfo(i,n);return s?new qy(s,i,null):new yl(i)}o.createFromDOMInfo=e})(Xc||(Xc={}));class CU{constructor(e,t){this.lastViewCursorsRenderData=e,this.lastTextareaPosition=t}}class Tn{static _deduceRage(e,t=null){return!t&&e?new L(e.lineNumber,e.column,e.lineNumber,e.column):t!=null?t:null}static createUnknown(e,t,i){return{type:0,element:e,mouseColumn:t,position:i,range:this._deduceRage(i)}}static createTextarea(e,t){return{type:1,element:e,mouseColumn:t,position:null,range:null}}static createMargin(e,t,i,n,s,r){return{type:e,element:t,mouseColumn:i,position:n,range:s,detail:r}}static createViewZone(e,t,i,n,s){return{type:e,element:t,mouseColumn:i,position:n,range:this._deduceRage(n),detail:s}}static createContentText(e,t,i,n,s){return{type:6,element:e,mouseColumn:t,position:i,range:this._deduceRage(i,n),detail:s}}static createContentEmpty(e,t,i,n){return{type:7,element:e,mouseColumn:t,position:i,range:this._deduceRage(i),detail:n}}static createContentWidget(e,t,i){return{type:9,element:e,mouseColumn:t,position:null,range:null,detail:i}}static createScrollbar(e,t,i){return{type:11,element:e,mouseColumn:t,position:i,range:this._deduceRage(i)}}static createOverlayWidget(e,t,i){return{type:12,element:e,mouseColumn:t,position:null,range:null,detail:i}}static createOutsideEditor(e,t){return{type:13,element:null,mouseColumn:e,position:t,range:this._deduceRage(t)}}static _typeToString(e){return e===1?\"TEXTAREA\":e===2?\"GUTTER_GLYPH_MARGIN\":e===3?\"GUTTER_LINE_NUMBERS\":e===4?\"GUTTER_LINE_DECORATIONS\":e===5?\"GUTTER_VIEW_ZONE\":e===6?\"CONTENT_TEXT\":e===7?\"CONTENT_EMPTY\":e===8?\"CONTENT_VIEW_ZONE\":e===9?\"CONTENT_WIDGET\":e===10?\"OVERVIEW_RULER\":e===11?\"SCROLLBAR\":e===12?\"OVERLAY_WIDGET\":\"UNKNOWN\"}static toString(e){return this._typeToString(e.type)+\": \"+e.position+\" - \"+e.range+\" - \"+JSON.stringify(e.detail)}}class no{static isTextArea(e){return e.length===2&&e[0]===3&&e[1]===6}static isChildOfViewLines(e){return e.length>=4&&e[0]===3&&e[3]===7}static isStrictChildOfViewLines(e){return e.length>4&&e[0]===3&&e[3]===7}static isChildOfScrollableElement(e){return e.length>=2&&e[0]===3&&e[1]===5}static isChildOfMinimap(e){return e.length>=2&&e[0]===3&&e[1]===8}static isChildOfContentWidgets(e){return e.length>=4&&e[0]===3&&e[3]===1}static isChildOfOverflowingContentWidgets(e){return e.length>=1&&e[0]===2}static isChildOfOverlayWidgets(e){return e.length>=2&&e[0]===3&&e[1]===4}}class cg{constructor(e,t,i){this.viewModel=e.viewModel;const n=e.configuration.options;this.layoutInfo=n.get(133),this.viewDomNode=t.viewDomNode,this.lineHeight=n.get(61),this.stickyTabStops=n.get(106),this.typicalHalfwidthCharacterWidth=n.get(46).typicalHalfwidthCharacterWidth,this.lastRenderData=i,this._context=e,this._viewHelper=t}getZoneAtCoord(e){return cg.getZoneAtCoord(this._context,e)}static getZoneAtCoord(e,t){const i=e.viewLayout.getWhitespaceAtVerticalOffset(t);if(i){const n=i.verticalOffset+i.height/2,s=e.viewModel.getLineCount();let r=null,a,l=null;return i.afterLineNumber!==s&&(l=new B(i.afterLineNumber+1,1)),i.afterLineNumber>0&&(r=new B(i.afterLineNumber,e.viewModel.getLineMaxColumn(i.afterLineNumber))),l===null?a=r:r===null?a=l:t<n?a=r:a=l,{viewZoneId:i.id,afterLineNumber:i.afterLineNumber,positionBefore:r,positionAfter:l,position:a}}return null}getFullLineRangeAtCoord(e){if(this._context.viewLayout.isAfterLines(e)){const n=this._context.viewModel.getLineCount(),s=this._context.viewModel.getLineMaxColumn(n);return{range:new L(n,s,n,s),isAfterLines:!0}}const t=this._context.viewLayout.getLineNumberAtVerticalOffset(e),i=this._context.viewModel.getLineMaxColumn(t);return{range:new L(t,1,t,i),isAfterLines:!1}}getLineNumberAtVerticalOffset(e){return this._context.viewLayout.getLineNumberAtVerticalOffset(e)}isAfterLines(e){return this._context.viewLayout.isAfterLines(e)}isInTopPadding(e){return this._context.viewLayout.isInTopPadding(e)}isInBottomPadding(e){return this._context.viewLayout.isInBottomPadding(e)}getVerticalOffsetForLineNumber(e){return this._context.viewLayout.getVerticalOffsetForLineNumber(e)}findAttribute(e,t){return cg._findAttribute(e,t,this._viewHelper.viewDomNode)}static _findAttribute(e,t,i){for(;e&&e!==document.body;){if(e.hasAttribute&&e.hasAttribute(t))return e.getAttribute(t);if(e===i)return null;e=e.parentNode}return null}getLineWidth(e){return this._viewHelper.getLineWidth(e)}visibleRangeForPosition(e,t){return this._viewHelper.visibleRangeForPosition(e,t)}getPositionFromDOMInfo(e,t){return this._viewHelper.getPositionFromDOMInfo(e,t)}getCurrentScrollTop(){return this._context.viewLayout.getCurrentScrollTop()}getCurrentScrollLeft(){return this._context.viewLayout.getCurrentScrollLeft()}}class wU{constructor(e,t,i,n){this.editorPos=t,this.pos=i,this.relativePos=n,this.mouseVerticalOffset=Math.max(0,e.getCurrentScrollTop()+this.relativePos.y),this.mouseContentHorizontalOffset=e.getCurrentScrollLeft()+this.relativePos.x-e.layoutInfo.contentLeft,this.isInMarginArea=this.relativePos.x<e.layoutInfo.contentLeft&&this.relativePos.x>=e.layoutInfo.glyphMarginLeft,this.isInContentArea=!this.isInMarginArea,this.mouseColumn=Math.max(0,qi._getMouseColumn(this.mouseContentHorizontalOffset,e.typicalHalfwidthCharacterWidth))}}class yI extends wU{constructor(e,t,i,n,s){super(e,t,i,n),this._ctx=e,s?(this.target=s,this.targetPath=jr.collect(s,e.viewDomNode)):(this.target=null,this.targetPath=new Uint8Array(0))}toString(){return`pos(${this.pos.x},${this.pos.y}), editorPos(${this.editorPos.x},${this.editorPos.y}), relativePos(${this.relativePos.x},${this.relativePos.y}), mouseVerticalOffset: ${this.mouseVerticalOffset}, mouseContentHorizontalOffset: ${this.mouseContentHorizontalOffset}\n\ttarget: ${this.target?this.target.outerHTML:null}`}_getMouseColumn(e=null){return e&&e.column<this._ctx.viewModel.getLineMaxColumn(e.lineNumber)?_i.visibleColumnFromColumn(this._ctx.viewModel.getLineContent(e.lineNumber),e.column,this._ctx.viewModel.model.getOptions().tabSize)+1:this.mouseColumn}fulfillUnknown(e=null){return Tn.createUnknown(this.target,this._getMouseColumn(e),e)}fulfillTextarea(){return Tn.createTextarea(this.target,this._getMouseColumn())}fulfillMargin(e,t,i,n){return Tn.createMargin(e,this.target,this._getMouseColumn(t),t,i,n)}fulfillViewZone(e,t,i){return Tn.createViewZone(e,this.target,this._getMouseColumn(t),t,i)}fulfillContentText(e,t,i){return Tn.createContentText(this.target,this._getMouseColumn(e),e,t,i)}fulfillContentEmpty(e,t){return Tn.createContentEmpty(this.target,this._getMouseColumn(e),e,t)}fulfillContentWidget(e){return Tn.createContentWidget(this.target,this._getMouseColumn(),e)}fulfillScrollbar(e){return Tn.createScrollbar(this.target,this._getMouseColumn(e),e)}fulfillOverlayWidget(e){return Tn.createOverlayWidget(this.target,this._getMouseColumn(),e)}withTarget(e){return new yI(this._ctx,this.editorPos,this.pos,this.relativePos,e)}}const JT={isAfterLines:!0};function Ow(o){return{isAfterLines:!1,horizontalDistanceToText:o}}class qi{constructor(e,t){this._context=e,this._viewHelper=t}mouseTargetIsWidget(e){const t=e.target,i=jr.collect(t,this._viewHelper.viewDomNode);return!!(no.isChildOfContentWidgets(i)||no.isChildOfOverflowingContentWidgets(i)||no.isChildOfOverlayWidgets(i))}createMouseTarget(e,t,i,n,s){const r=new cg(this._context,this._viewHelper,e),a=new yI(r,t,i,n,s);try{return qi._createMouseTarget(r,a,!1)}catch(l){return a.fulfillUnknown()}}static _createMouseTarget(e,t,i){if(t.target===null){if(i)return t.fulfillUnknown();const r=qi._doHitTest(e,t);return r.type===1?qi.createMouseTargetFromHitTestPosition(e,t,r.spanNode,r.position,r.injectedText):this._createMouseTarget(e,t.withTarget(r.hitTarget),!0)}const n=t;let s=null;return s=s||qi._hitTestContentWidget(e,n),s=s||qi._hitTestOverlayWidget(e,n),s=s||qi._hitTestMinimap(e,n),s=s||qi._hitTestScrollbarSlider(e,n),s=s||qi._hitTestViewZone(e,n),s=s||qi._hitTestMargin(e,n),s=s||qi._hitTestViewCursor(e,n),s=s||qi._hitTestTextArea(e,n),s=s||qi._hitTestViewLines(e,n,i),s=s||qi._hitTestScrollbar(e,n),s||t.fulfillUnknown()}static _hitTestContentWidget(e,t){if(no.isChildOfContentWidgets(t.targetPath)||no.isChildOfOverflowingContentWidgets(t.targetPath)){const i=e.findAttribute(t.target,\"widgetId\");return i?t.fulfillContentWidget(i):t.fulfillUnknown()}return null}static _hitTestOverlayWidget(e,t){if(no.isChildOfOverlayWidgets(t.targetPath)){const i=e.findAttribute(t.target,\"widgetId\");return i?t.fulfillOverlayWidget(i):t.fulfillUnknown()}return null}static _hitTestViewCursor(e,t){if(t.target){const i=e.lastRenderData.lastViewCursorsRenderData;for(const n of i)if(t.target===n.domNode)return t.fulfillContentText(n.position,null,{mightBeForeignElement:!1,injectedText:null})}if(t.isInContentArea){const i=e.lastRenderData.lastViewCursorsRenderData,n=t.mouseContentHorizontalOffset,s=t.mouseVerticalOffset;for(const r of i){if(n<r.contentLeft||n>r.contentLeft+r.width)continue;const a=e.getVerticalOffsetForLineNumber(r.position.lineNumber);if(a<=s&&s<=a+r.height)return t.fulfillContentText(r.position,null,{mightBeForeignElement:!1,injectedText:null})}}return null}static _hitTestViewZone(e,t){const i=e.getZoneAtCoord(t.mouseVerticalOffset);if(i){const n=t.isInContentArea?8:5;return t.fulfillViewZone(n,i.position,i)}return null}static _hitTestTextArea(e,t){return no.isTextArea(t.targetPath)?e.lastRenderData.lastTextareaPosition?t.fulfillContentText(e.lastRenderData.lastTextareaPosition,null,{mightBeForeignElement:!1,injectedText:null}):t.fulfillTextarea():null}static _hitTestMargin(e,t){if(t.isInMarginArea){const i=e.getFullLineRangeAtCoord(t.mouseVerticalOffset),n=i.range.getStartPosition();let s=Math.abs(t.relativePos.x);const r={isAfterLines:i.isAfterLines,glyphMarginLeft:e.layoutInfo.glyphMarginLeft,glyphMarginWidth:e.layoutInfo.glyphMarginWidth,lineNumbersWidth:e.layoutInfo.lineNumbersWidth,offsetX:s};return s-=e.layoutInfo.glyphMarginLeft,s<=e.layoutInfo.glyphMarginWidth?t.fulfillMargin(2,n,i.range,r):(s-=e.layoutInfo.glyphMarginWidth,s<=e.layoutInfo.lineNumbersWidth?t.fulfillMargin(3,n,i.range,r):(s-=e.layoutInfo.lineNumbersWidth,t.fulfillMargin(4,n,i.range,r)))}return null}static _hitTestViewLines(e,t,i){if(!no.isChildOfViewLines(t.targetPath))return null;if(e.isInTopPadding(t.mouseVerticalOffset))return t.fulfillContentEmpty(new B(1,1),JT);if(e.isAfterLines(t.mouseVerticalOffset)||e.isInBottomPadding(t.mouseVerticalOffset)){const s=e.viewModel.getLineCount(),r=e.viewModel.getLineMaxColumn(s);return t.fulfillContentEmpty(new B(s,r),JT)}if(i){if(no.isStrictChildOfViewLines(t.targetPath)){const s=e.getLineNumberAtVerticalOffset(t.mouseVerticalOffset);if(e.viewModel.getLineLength(s)===0){const a=e.getLineWidth(s),l=Ow(t.mouseContentHorizontalOffset-a);return t.fulfillContentEmpty(new B(s,1),l)}const r=e.getLineWidth(s);if(t.mouseContentHorizontalOffset>=r){const a=Ow(t.mouseContentHorizontalOffset-r),l=new B(s,e.viewModel.getLineMaxColumn(s));return t.fulfillContentEmpty(l,a)}}return t.fulfillUnknown()}const n=qi._doHitTest(e,t);return n.type===1?qi.createMouseTargetFromHitTestPosition(e,t,n.spanNode,n.position,n.injectedText):this._createMouseTarget(e,t.withTarget(n.hitTarget),!0)}static _hitTestMinimap(e,t){if(no.isChildOfMinimap(t.targetPath)){const i=e.getLineNumberAtVerticalOffset(t.mouseVerticalOffset),n=e.viewModel.getLineMaxColumn(i);return t.fulfillScrollbar(new B(i,n))}return null}static _hitTestScrollbarSlider(e,t){if(no.isChildOfScrollableElement(t.targetPath)&&t.target&&t.target.nodeType===1){const i=t.target.className;if(i&&/\\b(slider|scrollbar)\\b/.test(i)){const n=e.getLineNumberAtVerticalOffset(t.mouseVerticalOffset),s=e.viewModel.getLineMaxColumn(n);return t.fulfillScrollbar(new B(n,s))}}return null}static _hitTestScrollbar(e,t){if(no.isChildOfScrollableElement(t.targetPath)){const i=e.getLineNumberAtVerticalOffset(t.mouseVerticalOffset),n=e.viewModel.getLineMaxColumn(i);return t.fulfillScrollbar(new B(i,n))}return null}getMouseColumn(e){const t=this._context.configuration.options,i=t.get(133),n=this._context.viewLayout.getCurrentScrollLeft()+e.x-i.contentLeft;return qi._getMouseColumn(n,t.get(46).typicalHalfwidthCharacterWidth)}static _getMouseColumn(e,t){return e<0?1:Math.round(e/t)+1}static createMouseTargetFromHitTestPosition(e,t,i,n,s){const r=n.lineNumber,a=n.column,l=e.getLineWidth(r);if(t.mouseContentHorizontalOffset>l){const b=Ow(t.mouseContentHorizontalOffset-l);return t.fulfillContentEmpty(n,b)}const c=e.visibleRangeForPosition(r,a);if(!c)return t.fulfillUnknown(n);const d=c.left;if(t.mouseContentHorizontalOffset===d)return t.fulfillContentText(n,null,{mightBeForeignElement:!!s,injectedText:s});const h=[];if(h.push({offset:c.left,column:a}),a>1){const b=e.visibleRangeForPosition(r,a-1);b&&h.push({offset:b.left,column:a-1})}const u=e.viewModel.getLineMaxColumn(r);if(a<u){const b=e.visibleRangeForPosition(r,a+1);b&&h.push({offset:b.left,column:a+1})}h.sort((b,v)=>b.offset-v.offset);const g=t.pos.toClientCoordinates(),f=i.getBoundingClientRect(),_=f.left<=g.clientX&&g.clientX<=f.right;for(let b=1;b<h.length;b++){const v=h[b-1],C=h[b];if(v.offset<=t.mouseContentHorizontalOffset&&t.mouseContentHorizontalOffset<=C.offset){const w=new L(r,v.column,r,C.column),S=Math.abs(v.offset-t.mouseContentHorizontalOffset),k=Math.abs(C.offset-t.mouseContentHorizontalOffset),x=S<k?new B(r,v.column):new B(r,C.column);return t.fulfillContentText(x,w,{mightBeForeignElement:!_||!!s,injectedText:s})}}return t.fulfillContentText(n,null,{mightBeForeignElement:!_||!!s,injectedText:s})}static _doHitTestWithCaretRangeFromPoint(e,t){const i=e.getLineNumberAtVerticalOffset(t.mouseVerticalOffset),s=e.getVerticalOffsetForLineNumber(i)+Math.floor(e.lineHeight/2);let r=t.pos.y+(s-t.mouseVerticalOffset);r<=t.editorPos.y&&(r=t.editorPos.y+1),r>=t.editorPos.y+t.editorPos.height&&(r=t.editorPos.y+t.editorPos.height-1);const a=new wI(t.pos.x,r),l=this._actualDoHitTestWithCaretRangeFromPoint(e,a.toClientCoordinates());return l.type===1?l:this._actualDoHitTestWithCaretRangeFromPoint(e,t.pos.toClientCoordinates())}static _actualDoHitTestWithCaretRangeFromPoint(e,t){const i=Md(e.viewDomNode);let n;if(i?typeof i.caretRangeFromPoint==\"undefined\"?n=SU(i,t.clientX,t.clientY):n=i.caretRangeFromPoint(t.clientX,t.clientY):n=document.caretRangeFromPoint(t.clientX,t.clientY),!n||!n.startContainer)return new yl;const s=n.startContainer;if(s.nodeType===s.TEXT_NODE){const r=s.parentNode,a=r?r.parentNode:null,l=a?a.parentNode:null;return(l&&l.nodeType===l.ELEMENT_NODE?l.className:null)===yr.CLASS_NAME?Xc.createFromDOMInfo(e,r,n.startOffset):new yl(s.parentNode)}else if(s.nodeType===s.ELEMENT_NODE){const r=s.parentNode,a=r?r.parentNode:null;return(a&&a.nodeType===a.ELEMENT_NODE?a.className:null)===yr.CLASS_NAME?Xc.createFromDOMInfo(e,s,s.textContent.length):new yl(s)}return new yl}static _doHitTestWithCaretPositionFromPoint(e,t){const i=document.caretPositionFromPoint(t.clientX,t.clientY);if(i.offsetNode.nodeType===i.offsetNode.TEXT_NODE){const n=i.offsetNode.parentNode,s=n?n.parentNode:null,r=s?s.parentNode:null;return(r&&r.nodeType===r.ELEMENT_NODE?r.className:null)===yr.CLASS_NAME?Xc.createFromDOMInfo(e,i.offsetNode.parentNode,i.offset):new yl(i.offsetNode.parentNode)}if(i.offsetNode.nodeType===i.offsetNode.ELEMENT_NODE){const n=i.offsetNode.parentNode,s=n&&n.nodeType===n.ELEMENT_NODE?n.className:null,r=n?n.parentNode:null,a=r&&r.nodeType===r.ELEMENT_NODE?r.className:null;if(s===yr.CLASS_NAME){const l=i.offsetNode.childNodes[Math.min(i.offset,i.offsetNode.childNodes.length-1)];if(l)return Xc.createFromDOMInfo(e,l,0)}else if(a===yr.CLASS_NAME)return Xc.createFromDOMInfo(e,i.offsetNode,0)}return new yl(i.offsetNode)}static _snapToSoftTabBoundary(e,t){const i=t.getLineContent(e.lineNumber),{tabSize:n}=t.model.getOptions(),s=Tp.atomicPosition(i,e.column-1,n,2);return s!==-1?new B(e.lineNumber,s+1):e}static _doHitTest(e,t){let i=new yl;if(typeof document.caretRangeFromPoint==\"function\"?i=this._doHitTestWithCaretRangeFromPoint(e,t):document.caretPositionFromPoint&&(i=this._doHitTestWithCaretPositionFromPoint(e,t.pos.toClientCoordinates())),i.type===1){const n=e.viewModel.getInjectedTextAt(i.position),s=e.viewModel.normalizePosition(i.position,2);(n||!s.equals(i.position))&&(i=new qy(s,i.spanNode,n))}return i.type===1&&e.stickyTabStops&&(i=new qy(this._snapToSoftTabBoundary(i.position,e.viewModel),i.spanNode,i.injectedText)),i}}function SU(o,e,t){const i=document.createRange();let n=o.elementFromPoint(e,t);if(n!==null){for(;n&&n.firstChild&&n.firstChild.nodeType!==n.firstChild.TEXT_NODE&&n.lastChild&&n.lastChild.firstChild;)n=n.lastChild;const s=n.getBoundingClientRect(),r=window.getComputedStyle(n,null).getPropertyValue(\"font\"),a=n.innerText;let l=s.left,c=0,d;if(e>s.left+s.width)c=a.length;else{const h=dd.getInstance();for(let u=0;u<a.length+1;u++){if(d=h.getCharWidth(a.charAt(u),r)/2,l+=d,e<l){c=u;break}l+=d}}i.setStart(n.firstChild,c),i.setEnd(n.firstChild,c)}return i}class dd{constructor(){this._cache={},this._canvas=document.createElement(\"canvas\")}static getInstance(){return dd._INSTANCE||(dd._INSTANCE=new dd),dd._INSTANCE}getCharWidth(e,t){const i=e+t;if(this._cache[i])return this._cache[i];const n=this._canvas.getContext(\"2d\");n.font=t;const r=n.measureText(e).width;return this._cache[i]=r,r}}dd._INSTANCE=null;class LI extends Zm{constructor(e,t,i){super(),this._mouseLeaveMonitor=null,this._context=e,this.viewController=t,this.viewHelper=i,this.mouseTargetFactory=new qi(this._context,i),this._mouseDownOperation=this._register(new yU(this._context,this.viewController,this.viewHelper,(a,l)=>this._createMouseTarget(a,l),a=>this._getMouseColumn(a))),this.lastMouseLeaveTime=-1,this._height=this._context.configuration.options.get(133).height;const n=new Gz(this.viewHelper.viewDomNode);this._register(n.onContextMenu(this.viewHelper.viewDomNode,a=>this._onContextMenu(a,!0))),this._register(n.onMouseMove(this.viewHelper.viewDomNode,a=>{this._onMouseMove(a),this._mouseLeaveMonitor||(this._mouseLeaveMonitor=q(document,\"mousemove\",l=>{this.viewHelper.viewDomNode.contains(l.target)||this._onMouseLeave(new cc(l,!1,this.viewHelper.viewDomNode))}))})),this._register(n.onMouseUp(this.viewHelper.viewDomNode,a=>this._onMouseUp(a))),this._register(n.onMouseLeave(this.viewHelper.viewDomNode,a=>this._onMouseLeave(a)));let s=0;this._register(n.onPointerDown(this.viewHelper.viewDomNode,(a,l)=>{s=l})),this._register(q(this.viewHelper.viewDomNode,le.POINTER_UP,a=>{this._mouseDownOperation.onPointerUp()})),this._register(n.onMouseDown(this.viewHelper.viewDomNode,a=>this._onMouseDown(a,s)));const r=a=>{if(this.viewController.emitMouseWheel(a),!this._context.configuration.options.get(70))return;const l=new Qu(a);if(Ze?(a.metaKey||a.ctrlKey)&&!a.shiftKey&&!a.altKey:a.ctrlKey&&!a.metaKey&&!a.shiftKey&&!a.altKey){const d=tl.getZoomLevel(),h=l.deltaY>0?1:-1;tl.setZoomLevel(d+h),l.preventDefault(),l.stopPropagation()}};this._register(q(this.viewHelper.viewDomNode,le.MOUSE_WHEEL,r,{capture:!0,passive:!1})),this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._mouseLeaveMonitor&&(this._mouseLeaveMonitor.dispose(),this._mouseLeaveMonitor=null),super.dispose()}onConfigurationChanged(e){if(e.hasChanged(133)){const t=this._context.configuration.options.get(133).height;this._height!==t&&(this._height=t,this._mouseDownOperation.onHeightChanged())}return!1}onCursorStateChanged(e){return this._mouseDownOperation.onCursorStateChanged(e),!1}onFocusChanged(e){return!1}onScrollChanged(e){return this._mouseDownOperation.onScrollChanged(),!1}getTargetAtClientPoint(e,t){const n=new s4(e,t).toPageCoordinates(),s=o4(this.viewHelper.viewDomNode);if(n.y<s.y||n.y>s.y+s.height||n.x<s.x||n.x>s.x+s.width)return null;const r=r4(this.viewHelper.viewDomNode,s,n);return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(),s,n,r,null)}_createMouseTarget(e,t){let i=e.target;if(!this.viewHelper.viewDomNode.contains(i)){const n=Md(this.viewHelper.viewDomNode);n&&(i=n.elementsFromPoint(e.posx,e.posy).find(s=>this.viewHelper.viewDomNode.contains(s)))}return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(),e.editorPos,e.pos,e.relativePos,t?i:null)}_getMouseColumn(e){return this.mouseTargetFactory.getMouseColumn(e.relativePos)}_onContextMenu(e,t){this.viewController.emitContextMenu({event:e,target:this._createMouseTarget(e,t)})}_onMouseMove(e){this.mouseTargetFactory.mouseTargetIsWidget(e)||e.preventDefault(),!(this._mouseDownOperation.isActive()||e.timestamp<this.lastMouseLeaveTime)&&this.viewController.emitMouseMove({event:e,target:this._createMouseTarget(e,!0)})}_onMouseLeave(e){this._mouseLeaveMonitor&&(this._mouseLeaveMonitor.dispose(),this._mouseLeaveMonitor=null),this.lastMouseLeaveTime=new Date().getTime(),this.viewController.emitMouseLeave({event:e,target:null})}_onMouseUp(e){this.viewController.emitMouseUp({event:e,target:this._createMouseTarget(e,!0)})}_onMouseDown(e,t){const i=this._createMouseTarget(e,!0),n=i.type===6||i.type===7,s=i.type===2||i.type===3||i.type===4,r=i.type===3,a=this._context.configuration.options.get(100),l=i.type===8||i.type===5,c=i.type===9;let d=e.leftButton||e.middleButton;Ze&&e.leftButton&&e.ctrlKey&&(d=!1);const h=()=>{e.preventDefault(),this.viewHelper.focusTextArea()};if(d&&(n||r&&a))h(),this._mouseDownOperation.start(i.type,e,t);else if(s)e.preventDefault();else if(l){const u=i.detail;d&&this.viewHelper.shouldSuppressMouseDownOnViewZone(u.viewZoneId)&&(h(),this._mouseDownOperation.start(i.type,e,t),e.preventDefault())}else c&&this.viewHelper.shouldSuppressMouseDownOnWidget(i.detail)&&(h(),e.preventDefault());this.viewController.emitMouseDown({event:e,target:i})}}class yU extends z{constructor(e,t,i,n,s){super(),this._context=e,this._viewController=t,this._viewHelper=i,this._createMouseTarget=n,this._getMouseColumn=s,this._mouseMoveMonitor=this._register(new Yz(this._viewHelper.viewDomNode)),this._onScrollTimeout=this._register(new Is),this._mouseState=new t1,this._currentSelection=new oe(1,1,1,1),this._isActive=!1,this._lastMouseEvent=null}dispose(){super.dispose()}isActive(){return this._isActive}_onMouseDownThenMove(e){this._lastMouseEvent=e,this._mouseState.setModifiers(e);const t=this._findMousePosition(e,!1);!t||(this._mouseState.isDragAndDrop?this._viewController.emitMouseDrag({event:e,target:t}):this._dispatchMouse(t,!0))}start(e,t,i){this._lastMouseEvent=t,this._mouseState.setStartedOnLineNumbers(e===3),this._mouseState.setStartButtons(t),this._mouseState.setModifiers(t);const n=this._findMousePosition(t,!0);if(!n||!n.position)return;this._mouseState.trySetCount(t.detail,n.position),t.detail=this._mouseState.count;const s=this._context.configuration.options;if(!s.get(83)&&s.get(31)&&!s.get(18)&&!this._mouseState.altKey&&t.detail<2&&!this._isActive&&!this._currentSelection.isEmpty()&&n.type===6&&n.position&&this._currentSelection.containsPosition(n.position)){this._mouseState.isDragAndDrop=!0,this._isActive=!0,this._mouseMoveMonitor.startMonitoring(this._viewHelper.viewLinesDomNode,i,t.buttons,r=>this._onMouseDownThenMove(r),r=>{const a=this._findMousePosition(this._lastMouseEvent,!1);r&&r instanceof KeyboardEvent?this._viewController.emitMouseDropCanceled():this._viewController.emitMouseDrop({event:this._lastMouseEvent,target:a?this._createMouseTarget(this._lastMouseEvent,!0):null}),this._stop()});return}this._mouseState.isDragAndDrop=!1,this._dispatchMouse(n,t.shiftKey),this._isActive||(this._isActive=!0,this._mouseMoveMonitor.startMonitoring(this._viewHelper.viewLinesDomNode,i,t.buttons,r=>this._onMouseDownThenMove(r),()=>this._stop()))}_stop(){this._isActive=!1,this._onScrollTimeout.cancel()}onHeightChanged(){this._mouseMoveMonitor.stopMonitoring()}onPointerUp(){this._mouseMoveMonitor.stopMonitoring()}onScrollChanged(){!this._isActive||this._onScrollTimeout.setIfNotSet(()=>{if(!this._lastMouseEvent)return;const e=this._findMousePosition(this._lastMouseEvent,!1);!e||this._mouseState.isDragAndDrop||this._dispatchMouse(e,!0)},10)}onCursorStateChanged(e){this._currentSelection=e.selections[0]}_getPositionOutsideEditor(e){const t=e.editorPos,i=this._context.viewModel,n=this._context.viewLayout,s=this._getMouseColumn(e);if(e.posy<t.y){const a=Math.max(n.getCurrentScrollTop()-(t.y-e.posy),0),l=cg.getZoneAtCoord(this._context,a);if(l){const d=this._helpPositionJumpOverViewZone(l);if(d)return Tn.createOutsideEditor(s,d)}const c=n.getLineNumberAtVerticalOffset(a);return Tn.createOutsideEditor(s,new B(c,1))}if(e.posy>t.y+t.height){const a=n.getCurrentScrollTop()+e.relativePos.y,l=cg.getZoneAtCoord(this._context,a);if(l){const d=this._helpPositionJumpOverViewZone(l);if(d)return Tn.createOutsideEditor(s,d)}const c=n.getLineNumberAtVerticalOffset(a);return Tn.createOutsideEditor(s,new B(c,i.getLineMaxColumn(c)))}const r=n.getLineNumberAtVerticalOffset(n.getCurrentScrollTop()+e.relativePos.y);return e.posx<t.x?Tn.createOutsideEditor(s,new B(r,1)):e.posx>t.x+t.width?Tn.createOutsideEditor(s,new B(r,i.getLineMaxColumn(r))):null}_findMousePosition(e,t){const i=this._getPositionOutsideEditor(e);if(i)return i;const n=this._createMouseTarget(e,t);if(!n.position)return null;if(n.type===8||n.type===5){const r=this._helpPositionJumpOverViewZone(n.detail);if(r)return Tn.createViewZone(n.type,n.element,n.mouseColumn,r,n.detail)}return n}_helpPositionJumpOverViewZone(e){const t=new B(this._currentSelection.selectionStartLineNumber,this._currentSelection.selectionStartColumn),i=e.positionBefore,n=e.positionAfter;return i&&n?i.isBefore(t)?i:n:null}_dispatchMouse(e,t){!e.position||this._viewController.dispatchMouse({position:e.position,mouseColumn:e.mouseColumn,startedOnLineNumbers:this._mouseState.startedOnLineNumbers,inSelectionMode:t,mouseDownCount:this._mouseState.count,altKey:this._mouseState.altKey,ctrlKey:this._mouseState.ctrlKey,metaKey:this._mouseState.metaKey,shiftKey:this._mouseState.shiftKey,leftButton:this._mouseState.leftButton,middleButton:this._mouseState.middleButton,onInjectedText:e.type===6&&e.detail.injectedText!==null})}}class t1{constructor(){this._altKey=!1,this._ctrlKey=!1,this._metaKey=!1,this._shiftKey=!1,this._leftButton=!1,this._middleButton=!1,this._startedOnLineNumbers=!1,this._lastMouseDownPosition=null,this._lastMouseDownPositionEqualCount=0,this._lastMouseDownCount=0,this._lastSetMouseDownCountTime=0,this.isDragAndDrop=!1}get altKey(){return this._altKey}get ctrlKey(){return this._ctrlKey}get metaKey(){return this._metaKey}get shiftKey(){return this._shiftKey}get leftButton(){return this._leftButton}get middleButton(){return this._middleButton}get startedOnLineNumbers(){return this._startedOnLineNumbers}get count(){return this._lastMouseDownCount}setModifiers(e){this._altKey=e.altKey,this._ctrlKey=e.ctrlKey,this._metaKey=e.metaKey,this._shiftKey=e.shiftKey}setStartButtons(e){this._leftButton=e.leftButton,this._middleButton=e.middleButton}setStartedOnLineNumbers(e){this._startedOnLineNumbers=e}trySetCount(e,t){const i=new Date().getTime();i-this._lastSetMouseDownCountTime>t1.CLEAR_MOUSE_DOWN_COUNT_TIME&&(e=1),this._lastSetMouseDownCountTime=i,e>this._lastMouseDownCount+1&&(e=this._lastMouseDownCount+1),this._lastMouseDownPosition&&this._lastMouseDownPosition.equals(t)?this._lastMouseDownPositionEqualCount++:this._lastMouseDownPositionEqualCount=1,this._lastMouseDownPosition=t,this._lastMouseDownCount=Math.min(e,this._lastMouseDownPositionEqualCount)}}t1.CLEAR_MOUSE_DOWN_COUNT_TIME=400;class Vi{constructor(e,t,i,n,s){this.value=e,this.selectionStart=t,this.selectionEnd=i,this.selectionStartPosition=n,this.selectionEndPosition=s}toString(){return`[ <${this.value}>, selectionStart: ${this.selectionStart}, selectionEnd: ${this.selectionEnd}]`}static readFromTextArea(e){return new Vi(e.getValue(),e.getSelectionStart(),e.getSelectionEnd(),null,null)}collapseSelection(){return new Vi(this.value,this.value.length,this.value.length,null,null)}writeToTextArea(e,t,i){t.setValue(e,this.value),i&&t.setSelectionRange(e,this.selectionStart,this.selectionEnd)}deduceEditorPosition(e){if(e<=this.selectionStart){const n=this.value.substring(e,this.selectionStart);return this._finishDeduceEditorPosition(this.selectionStartPosition,n,-1)}if(e>=this.selectionEnd){const n=this.value.substring(this.selectionEnd,e);return this._finishDeduceEditorPosition(this.selectionEndPosition,n,1)}const t=this.value.substring(this.selectionStart,e);if(t.indexOf(String.fromCharCode(8230))===-1)return this._finishDeduceEditorPosition(this.selectionStartPosition,t,1);const i=this.value.substring(e,this.selectionEnd);return this._finishDeduceEditorPosition(this.selectionEndPosition,i,-1)}_finishDeduceEditorPosition(e,t,i){let n=0,s=-1;for(;(s=t.indexOf(`\n`,s+1))!==-1;)n++;return[e,i*t.length,n]}static deduceInput(e,t,i){if(!e)return{text:\"\",replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:0};const n=Math.min(Pd(e.value,t.value),e.selectionStart,t.selectionStart),s=Math.min(Np(e.value,t.value),e.value.length-e.selectionEnd,t.value.length-t.selectionEnd);e.value.substring(n,e.value.length-s);const r=t.value.substring(n,t.value.length-s),a=e.selectionStart-n,l=e.selectionEnd-n,c=t.selectionStart-n,d=t.selectionEnd-n;if(c===d){const u=e.selectionStart-n;return{text:r,replacePrevCharCnt:u,replaceNextCharCnt:0,positionDelta:0}}const h=l-a;return{text:r,replacePrevCharCnt:h,replaceNextCharCnt:0,positionDelta:0}}static deduceAndroidCompositionInput(e,t){if(!e)return{text:\"\",replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:0};if(e.value===t.value)return{text:\"\",replacePrevCharCnt:0,replaceNextCharCnt:0,positionDelta:t.selectionEnd-e.selectionEnd};const i=Math.min(Pd(e.value,t.value),e.selectionEnd),n=Math.min(Np(e.value,t.value),e.value.length-e.selectionEnd),s=e.value.substring(i,e.value.length-n),r=t.value.substring(i,t.value.length-n);e.selectionStart-i;const a=e.selectionEnd-i;t.selectionStart-i;const l=t.selectionEnd-i;return{text:r,replacePrevCharCnt:a,replaceNextCharCnt:s.length-a,positionDelta:l-r.length}}}Vi.EMPTY=new Vi(\"\",0,0,null,null);class mu{static _getPageOfLine(e,t){return Math.floor((e-1)/t)}static _getRangeForPage(e,t){const i=e*t,n=i+1,s=i+t;return new L(n,1,s+1,1)}static fromEditorSelection(e,t,i,n,s){const r=mu._getPageOfLine(i.startLineNumber,n),a=mu._getRangeForPage(r,n),l=mu._getPageOfLine(i.endLineNumber,n),c=mu._getRangeForPage(l,n),d=a.intersectRanges(new L(1,1,i.startLineNumber,i.startColumn));let h=t.getValueInRange(d,1);const u=t.getLineCount(),g=t.getLineMaxColumn(u),f=c.intersectRanges(new L(i.endLineNumber,i.endColumn,u,g));let _=t.getValueInRange(f,1),b;if(r===l||r+1===l)b=t.getValueInRange(i,1);else{const v=a.intersectRanges(i),C=c.intersectRanges(i);b=t.getValueInRange(v,1)+String.fromCharCode(8230)+t.getValueInRange(C,1)}return s&&(h.length>500&&(h=h.substring(h.length-500,h.length)),_.length>500&&(_=_.substring(0,500)),b.length>2*500&&(b=b.substring(0,500)+String.fromCharCode(8230)+b.substring(b.length-500,b.length))),new Vi(h+b+_,h.length,h.length+b.length,new B(i.startLineNumber,i.startColumn),new B(i.endLineNumber,i.endColumn))}}var tv;(function(o){o.Tap=\"-monaco-textarea-synthetic-tap\"})(tv||(tv={}));const Gy={forceCopyWithSyntaxHighlighting:!1};class Wp{constructor(){this._lastState=null}set(e,t){this._lastState={lastCopiedValue:e,data:t}}get(e){return this._lastState&&this._lastState.lastCopiedValue===e?this._lastState.data:(this._lastState=null,null)}}Wp.INSTANCE=new Wp;class LU{constructor(){this._lastTypeTextLength=0}handleCompositionUpdate(e){e=e||\"\";const t={text:e,replacePrevCharCnt:this._lastTypeTextLength,replaceNextCharCnt:0,positionDelta:0};return this._lastTypeTextLength=e.length,t}}class DU extends z{constructor(e,t,i,n){super(),this._host=e,this._textArea=t,this._OS=i,this._browser=n,this._onFocus=this._register(new O),this.onFocus=this._onFocus.event,this._onBlur=this._register(new O),this.onBlur=this._onBlur.event,this._onKeyDown=this._register(new O),this.onKeyDown=this._onKeyDown.event,this._onKeyUp=this._register(new O),this.onKeyUp=this._onKeyUp.event,this._onCut=this._register(new O),this.onCut=this._onCut.event,this._onPaste=this._register(new O),this.onPaste=this._onPaste.event,this._onType=this._register(new O),this.onType=this._onType.event,this._onCompositionStart=this._register(new O),this.onCompositionStart=this._onCompositionStart.event,this._onCompositionUpdate=this._register(new O),this.onCompositionUpdate=this._onCompositionUpdate.event,this._onCompositionEnd=this._register(new O),this.onCompositionEnd=this._onCompositionEnd.event,this._onSelectionChangeRequest=this._register(new O),this.onSelectionChangeRequest=this._onSelectionChangeRequest.event,this._asyncTriggerCut=this._register(new ft(()=>this._onCut.fire(),0)),this._asyncFocusGainWriteScreenReaderContent=this._register(new ft(()=>this.writeScreenReaderContent(\"asyncFocusGain\"),0)),this._textAreaState=Vi.EMPTY,this._selectionChangeListener=null,this.writeScreenReaderContent(\"ctor\"),this._hasFocus=!1,this._currentComposition=null;let s=null;this._register(this._textArea.onKeyDown(r=>{const a=new Mt(r);(a.keyCode===109||this._currentComposition&&a.keyCode===1)&&a.stopPropagation(),a.equals(9)&&a.preventDefault(),s=a,this._onKeyDown.fire(a)})),this._register(this._textArea.onKeyUp(r=>{const a=new Mt(r);this._onKeyUp.fire(a)})),this._register(this._textArea.onCompositionStart(r=>{const a=new LU;if(this._currentComposition){this._currentComposition=a;return}if(this._currentComposition=a,this._OS===2&&s&&s.equals(109)&&this._textAreaState.selectionStart===this._textAreaState.selectionEnd&&this._textAreaState.selectionStart>0&&this._textAreaState.value.substr(this._textAreaState.selectionStart-1,1)===r.data&&(s.code===\"ArrowRight\"||s.code===\"ArrowLeft\")){a.handleCompositionUpdate(\"x\"),this._onCompositionStart.fire({data:r.data});return}if(this._browser.isAndroid){this._onCompositionStart.fire({data:r.data});return}this._onCompositionStart.fire({data:r.data})})),this._register(this._textArea.onCompositionUpdate(r=>{const a=this._currentComposition;if(!a)return;if(this._browser.isAndroid){const c=Vi.readFromTextArea(this._textArea),d=Vi.deduceAndroidCompositionInput(this._textAreaState,c);this._textAreaState=c,this._onType.fire(d),this._onCompositionUpdate.fire(r);return}const l=a.handleCompositionUpdate(r.data);this._textAreaState=Vi.readFromTextArea(this._textArea),this._onType.fire(l),this._onCompositionUpdate.fire(r)})),this._register(this._textArea.onCompositionEnd(r=>{const a=this._currentComposition;if(!a)return;if(this._currentComposition=null,this._browser.isAndroid){const c=Vi.readFromTextArea(this._textArea),d=Vi.deduceAndroidCompositionInput(this._textAreaState,c);this._textAreaState=c,this._onType.fire(d),this._onCompositionEnd.fire();return}const l=a.handleCompositionUpdate(r.data);this._textAreaState=Vi.readFromTextArea(this._textArea),this._onType.fire(l),this._onCompositionEnd.fire()})),this._register(this._textArea.onInput(r=>{if(this._textArea.setIgnoreSelectionChangeTime(\"received input event\"),this._currentComposition)return;const a=Vi.readFromTextArea(this._textArea),l=Vi.deduceInput(this._textAreaState,a,this._OS===2);l.replacePrevCharCnt===0&&l.text.length===1&&wi(l.text.charCodeAt(0))||(this._textAreaState=a,(l.text!==\"\"||l.replacePrevCharCnt!==0||l.replaceNextCharCnt!==0||l.positionDelta!==0)&&this._onType.fire(l))})),this._register(this._textArea.onCut(r=>{this._textArea.setIgnoreSelectionChangeTime(\"received cut event\"),this._ensureClipboardGetsEditorSelection(r),this._asyncTriggerCut.schedule()})),this._register(this._textArea.onCopy(r=>{this._ensureClipboardGetsEditorSelection(r)})),this._register(this._textArea.onPaste(r=>{if(this._textArea.setIgnoreSelectionChangeTime(\"received paste event\"),r.preventDefault(),!r.clipboardData)return;let[a,l]=e2.getTextData(r.clipboardData);!a||(l=l||Wp.INSTANCE.get(a),this._onPaste.fire({text:a,metadata:l}))})),this._register(this._textArea.onFocus(()=>{const r=this._hasFocus;this._setHasFocus(!0),this._browser.isSafari&&!r&&this._hasFocus&&this._asyncFocusGainWriteScreenReaderContent.schedule()})),this._register(this._textArea.onBlur(()=>{this._currentComposition&&(this._currentComposition=null,this.writeScreenReaderContent(\"blurWithoutCompositionEnd\"),this._onCompositionEnd.fire()),this._setHasFocus(!1)})),this._register(this._textArea.onSyntheticTap(()=>{this._browser.isAndroid&&this._currentComposition&&(this._currentComposition=null,this.writeScreenReaderContent(\"tapWithoutCompositionEnd\"),this._onCompositionEnd.fire())}))}_installSelectionChangeListener(){let e=0;return q(document,\"selectionchange\",t=>{if(!this._hasFocus||this._currentComposition||!this._browser.isChrome)return;const i=Date.now(),n=i-e;if(e=i,n<5)return;const s=i-this._textArea.getIgnoreSelectionChangeTime();if(this._textArea.resetSelectionChangeTime(),s<100||!this._textAreaState.selectionStartPosition||!this._textAreaState.selectionEndPosition)return;const r=this._textArea.getValue();if(this._textAreaState.value!==r)return;const a=this._textArea.getSelectionStart(),l=this._textArea.getSelectionEnd();if(this._textAreaState.selectionStart===a&&this._textAreaState.selectionEnd===l)return;const c=this._textAreaState.deduceEditorPosition(a),d=this._host.deduceModelPosition(c[0],c[1],c[2]),h=this._textAreaState.deduceEditorPosition(l),u=this._host.deduceModelPosition(h[0],h[1],h[2]),g=new oe(d.lineNumber,d.column,u.lineNumber,u.column);this._onSelectionChangeRequest.fire(g)})}dispose(){super.dispose(),this._selectionChangeListener&&(this._selectionChangeListener.dispose(),this._selectionChangeListener=null)}focusTextArea(){this._setHasFocus(!0),this.refreshFocusState()}isFocused(){return this._hasFocus}refreshFocusState(){this._setHasFocus(this._textArea.hasFocus())}_setHasFocus(e){this._hasFocus!==e&&(this._hasFocus=e,this._selectionChangeListener&&(this._selectionChangeListener.dispose(),this._selectionChangeListener=null),this._hasFocus&&(this._selectionChangeListener=this._installSelectionChangeListener()),this._hasFocus&&this.writeScreenReaderContent(\"focusgain\"),this._hasFocus?this._onFocus.fire():this._onBlur.fire())}_setAndWriteTextAreaState(e,t){this._hasFocus||(t=t.collapseSelection()),t.writeToTextArea(e,this._textArea,this._hasFocus),this._textAreaState=t}writeScreenReaderContent(e){this._currentComposition||this._setAndWriteTextAreaState(e,this._host.getScreenReaderContent(this._textAreaState))}_ensureClipboardGetsEditorSelection(e){const t=this._host.getDataToCopy(),i={version:1,isFromEmptySelection:t.isFromEmptySelection,multicursorText:t.multicursorText,mode:t.mode};Wp.INSTANCE.set(this._browser.isFirefox?t.text.replace(/\\r\\n/g,`\n`):t.text,i),e.preventDefault(),e.clipboardData&&e2.setTextData(e.clipboardData,t.text,t.html,i)}}class e2{static getTextData(e){const t=e.getData(Pn.text);let i=null;const n=e.getData(\"vscode-editor-data\");if(typeof n==\"string\")try{i=JSON.parse(n),i.version!==1&&(i=null)}catch(s){}return t.length===0&&i===null&&e.files.length>0?[Array.prototype.slice.call(e.files,0).map(r=>r.name).join(`\n`),null]:[t,i]}static setTextData(e,t,i,n){e.setData(Pn.text,t),typeof i==\"string\"&&e.setData(\"text/html\",i),e.setData(\"vscode-editor-data\",JSON.stringify(n))}}class kU extends z{constructor(e){super(),this._actual=e,this.onKeyDown=this._register(ko(this._actual,\"keydown\")).event,this.onKeyUp=this._register(ko(this._actual,\"keyup\")).event,this.onCompositionStart=this._register(ko(this._actual,\"compositionstart\")).event,this.onCompositionUpdate=this._register(ko(this._actual,\"compositionupdate\")).event,this.onCompositionEnd=this._register(ko(this._actual,\"compositionend\")).event,this.onInput=this._register(ko(this._actual,\"input\")).event,this.onCut=this._register(ko(this._actual,\"cut\")).event,this.onCopy=this._register(ko(this._actual,\"copy\")).event,this.onPaste=this._register(ko(this._actual,\"paste\")).event,this.onFocus=this._register(ko(this._actual,\"focus\")).event,this.onBlur=this._register(ko(this._actual,\"blur\")).event,this._onSyntheticTap=this._register(new O),this.onSyntheticTap=this._onSyntheticTap.event,this._ignoreSelectionChangeTime=0,this._register(q(this._actual,tv.Tap,()=>this._onSyntheticTap.fire()))}hasFocus(){const e=Md(this._actual);return e?e.activeElement===this._actual:Vx(this._actual)?document.activeElement===this._actual:!1}setIgnoreSelectionChangeTime(e){this._ignoreSelectionChangeTime=Date.now()}getIgnoreSelectionChangeTime(){return this._ignoreSelectionChangeTime}resetSelectionChangeTime(){this._ignoreSelectionChangeTime=0}getValue(){return this._actual.value}setValue(e,t){const i=this._actual;i.value!==t&&(this.setIgnoreSelectionChangeTime(\"setValue\"),i.value=t)}getSelectionStart(){return this._actual.selectionDirection===\"backward\"?this._actual.selectionEnd:this._actual.selectionStart}getSelectionEnd(){return this._actual.selectionDirection===\"backward\"?this._actual.selectionStart:this._actual.selectionEnd}setSelectionRange(e,t,i){const n=this._actual;let s=null;const r=Md(n);r?s=r.activeElement:s=document.activeElement;const a=s===n,l=n.selectionStart,c=n.selectionEnd;if(a&&l===t&&c===i){Ls&&window.parent!==window&&n.focus();return}if(a){this.setIgnoreSelectionChangeTime(\"setSelectionRange\"),n.setSelectionRange(t,i),Ls&&window.parent!==window&&n.focus();return}try{const d=fB(n);this.setIgnoreSelectionChangeTime(\"setSelectionRange\"),n.focus(),n.setSelectionRange(t,i),pB(n,d)}catch(d){}}}class xU extends LI{constructor(e,t,i){super(e,t,i),this._register(ut.addTarget(this.viewHelper.linesContentDomNode)),this._register(q(this.viewHelper.linesContentDomNode,kt.Tap,s=>this.onTap(s))),this._register(q(this.viewHelper.linesContentDomNode,kt.Change,s=>this.onChange(s))),this._register(q(this.viewHelper.linesContentDomNode,kt.Contextmenu,s=>this._onContextMenu(new cc(s,!1,this.viewHelper.viewDomNode),!1))),this._lastPointerType=\"mouse\",this._register(q(this.viewHelper.linesContentDomNode,\"pointerdown\",s=>{const r=s.pointerType;if(r===\"mouse\"){this._lastPointerType=\"mouse\";return}else r===\"touch\"?this._lastPointerType=\"touch\":this._lastPointerType=\"pen\"}));const n=new Zz(this.viewHelper.viewDomNode);this._register(n.onPointerMove(this.viewHelper.viewDomNode,s=>this._onMouseMove(s))),this._register(n.onPointerUp(this.viewHelper.viewDomNode,s=>this._onMouseUp(s))),this._register(n.onPointerLeave(this.viewHelper.viewDomNode,s=>this._onMouseLeave(s))),this._register(n.onPointerDown(this.viewHelper.viewDomNode,(s,r)=>this._onMouseDown(s,r)))}onTap(e){if(!e.initialTarget||!this.viewHelper.linesContentDomNode.contains(e.initialTarget))return;e.preventDefault(),this.viewHelper.focusTextArea();const t=this._createMouseTarget(new cc(e,!1,this.viewHelper.viewDomNode),!1);t.position&&this.viewController.dispatchMouse({position:t.position,mouseColumn:t.position.column,startedOnLineNumbers:!1,mouseDownCount:e.tapCount,inSelectionMode:!1,altKey:!1,ctrlKey:!1,metaKey:!1,shiftKey:!1,leftButton:!1,middleButton:!1,onInjectedText:t.type===6&&t.detail.injectedText!==null})}onChange(e){this._lastPointerType===\"touch\"&&this._context.viewModel.viewLayout.deltaScrollNow(-e.translationX,-e.translationY)}_onMouseDown(e,t){e.browserEvent.pointerType!==\"touch\"&&super._onMouseDown(e,t)}}class IU extends LI{constructor(e,t,i){super(e,t,i),this._register(ut.addTarget(this.viewHelper.linesContentDomNode)),this._register(q(this.viewHelper.linesContentDomNode,kt.Tap,n=>this.onTap(n))),this._register(q(this.viewHelper.linesContentDomNode,kt.Change,n=>this.onChange(n))),this._register(q(this.viewHelper.linesContentDomNode,kt.Contextmenu,n=>this._onContextMenu(new cc(n,!1,this.viewHelper.viewDomNode),!1)))}onTap(e){e.preventDefault(),this.viewHelper.focusTextArea();const t=this._createMouseTarget(new cc(e,!1,this.viewHelper.viewDomNode),!1);if(t.position){const i=document.createEvent(\"CustomEvent\");i.initEvent(tv.Tap,!1,!0),this.viewHelper.dispatchTextAreaEvent(i),this.viewController.moveTo(t.position)}}onChange(e){this._context.viewModel.viewLayout.deltaScrollNow(-e.translationX,-e.translationY)}}class EU extends z{constructor(e,t,i){super(),Xa&&Fx.pointerEvents?this.handler=this._register(new xU(e,t,i)):window.TouchEvent?this.handler=this._register(new IU(e,t,i)):this.handler=this._register(new LI(e,t,i))}getTargetAtClientPoint(e,t){return this.handler.getTargetAtClientPoint(e,t)}}class zg extends Zm{}const d4=N(\"editor.lineHighlightBackground\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"lineHighlight\",\"Background color for the highlight of line at the cursor position.\")),t2=N(\"editor.lineHighlightBorder\",{dark:\"#282828\",light:\"#eeeeee\",hcDark:\"#f38518\",hcLight:Be},p(\"lineHighlightBorderBox\",\"Background color for the border around the line at the cursor position.\")),NU=N(\"editor.rangeHighlightBackground\",{dark:\"#ffffff0b\",light:\"#fdff0033\",hcDark:null,hcLight:null},p(\"rangeHighlight\",\"Background color of highlighted ranges, like by quick open and find features. The color must not be opaque so as not to hide underlying decorations.\"),!0),TU=N(\"editor.rangeHighlightBorder\",{dark:null,light:null,hcDark:At,hcLight:At},p(\"rangeHighlightBorder\",\"Background color of the border around highlighted ranges.\"),!0),MU=N(\"editor.symbolHighlightBackground\",{dark:Ba,light:Ba,hcDark:null,hcLight:null},p(\"symbolHighlight\",\"Background color of highlighted symbol, like for go to definition or go next/previous symbol. The color must not be opaque so as not to hide underlying decorations.\"),!0),AU=N(\"editor.symbolHighlightBorder\",{dark:null,light:null,hcDark:At,hcLight:At},p(\"symbolHighlightBorder\",\"Background color of the border around highlighted symbols.\"),!0),h4=N(\"editorCursor.foreground\",{dark:\"#AEAFAD\",light:W.black,hcDark:W.white,hcLight:\"#0F4A85\"},p(\"caret\",\"Color of the editor cursor.\")),RU=N(\"editorCursor.background\",null,p(\"editorCursorBackground\",\"The background color of the editor cursor. Allows customizing the color of a character overlapped by a block cursor.\")),za=N(\"editorWhitespace.foreground\",{dark:\"#e3e4e229\",light:\"#33333333\",hcDark:\"#e3e4e229\",hcLight:\"#CCCCCC\"},p(\"editorWhitespaces\",\"Color of whitespace characters in the editor.\")),Xm=N(\"editorIndentGuide.background\",{dark:za,light:za,hcDark:za,hcLight:za},p(\"editorIndentGuides\",\"Color of the editor indentation guides.\")),Qm=N(\"editorIndentGuide.activeBackground\",{dark:za,light:za,hcDark:za,hcLight:za},p(\"editorActiveIndentGuide\",\"Color of the active editor indentation guides.\")),u4=N(\"editorLineNumber.foreground\",{dark:\"#858585\",light:\"#237893\",hcDark:W.white,hcLight:\"#292929\"},p(\"editorLineNumbers\",\"Color of editor line numbers.\")),K_=N(\"editorActiveLineNumber.foreground\",{dark:\"#c6c6c6\",light:\"#0B216F\",hcDark:At,hcLight:At},p(\"editorActiveLineNumber\",\"Color of editor active line number\"),!1,p(\"deprecatedEditorActiveLineNumber\",\"Id is deprecated. Use 'editorLineNumber.activeForeground' instead.\")),OU=N(\"editorLineNumber.activeForeground\",{dark:K_,light:K_,hcDark:K_,hcLight:K_},p(\"editorActiveLineNumber\",\"Color of editor active line number\")),PU=N(\"editorRuler.foreground\",{dark:\"#5A5A5A\",light:W.lightgrey,hcDark:W.white,hcLight:\"#292929\"},p(\"editorRuler\",\"Color of the editor rulers.\"));N(\"editorCodeLens.foreground\",{dark:\"#999999\",light:\"#919191\",hcDark:\"#999999\",hcLight:\"#292929\"},p(\"editorCodeLensForeground\",\"Foreground color of editor CodeLens\"));const FU=N(\"editorBracketMatch.background\",{dark:\"#0064001a\",light:\"#0064001a\",hcDark:\"#0064001a\",hcLight:\"#0000\"},p(\"editorBracketMatchBackground\",\"Background color behind matching brackets\")),g4=N(\"editorBracketMatch.border\",{dark:\"#888\",light:\"#B9B9B9\",hcDark:Be,hcLight:Be},p(\"editorBracketMatchBorder\",\"Color for matching brackets boxes\")),BU=N(\"editorOverviewRuler.border\",{dark:\"#7f7f7f4d\",light:\"#7f7f7f4d\",hcDark:\"#7f7f7f4d\",hcLight:\"#666666\"},p(\"editorOverviewRulerBorder\",\"Color of the overview ruler border.\")),WU=N(\"editorOverviewRuler.background\",null,p(\"editorOverviewRulerBackground\",\"Background color of the editor overview ruler. Only used when the minimap is enabled and placed on the right side of the editor.\")),VU=N(\"editorGutter.background\",{dark:bi,light:bi,hcDark:bi,hcLight:bi},p(\"editorGutter\",\"Background color of the editor gutter. The gutter contains the glyph margins and the line numbers.\")),HU=N(\"editorUnnecessaryCode.border\",{dark:null,light:null,hcDark:W.fromHex(\"#fff\").transparent(.8),hcLight:Be},p(\"unnecessaryCodeBorder\",\"Border color of unnecessary (unused) source code in the editor.\")),zU=N(\"editorUnnecessaryCode.opacity\",{dark:W.fromHex(\"#000a\"),light:W.fromHex(\"#0007\"),hcDark:null,hcLight:null},p(\"unnecessaryCodeOpacity\",`Opacity of unnecessary (unused) source code in the editor. For example, \"#000000c0\" will render the code with 75% opacity. For high contrast themes, use the  'editorUnnecessaryCode.border' theme color to underline unnecessary code instead of fading it out.`)),UU=N(\"editorGhostText.border\",{dark:null,light:null,hcDark:W.fromHex(\"#fff\").transparent(.8),hcLight:W.fromHex(\"#292929\").transparent(.8)},p(\"editorGhostTextBorder\",\"Border color of ghost text in the editor.\")),$U=N(\"editorGhostText.foreground\",{dark:W.fromHex(\"#ffffff56\"),light:W.fromHex(\"#0007\"),hcDark:null,hcLight:null},p(\"editorGhostTextForeground\",\"Foreground color of the ghost text in the editor.\")),jU=N(\"editorGhostText.background\",{dark:null,light:null,hcDark:null,hcLight:null},p(\"editorGhostTextBackground\",\"Background color of the ghost text in the editor.\")),q_=new W(new je(0,122,204,.6));N(\"editorOverviewRuler.rangeHighlightForeground\",{dark:q_,light:q_,hcDark:q_,hcLight:q_},p(\"overviewRulerRangeHighlight\",\"Overview ruler marker color for range highlights. The color must not be opaque so as not to hide underlying decorations.\"),!0);const KU=N(\"editorOverviewRuler.errorForeground\",{dark:new W(new je(255,18,18,.7)),light:new W(new je(255,18,18,.7)),hcDark:new W(new je(255,50,50,1)),hcLight:\"#B5200D\"},p(\"overviewRuleError\",\"Overview ruler marker color for errors.\")),qU=N(\"editorOverviewRuler.warningForeground\",{dark:Cs,light:Cs,hcDark:og,hcLight:og},p(\"overviewRuleWarning\",\"Overview ruler marker color for warnings.\")),GU=N(\"editorOverviewRuler.infoForeground\",{dark:Bn,light:Bn,hcDark:J0,hcLight:J0},p(\"overviewRuleInfo\",\"Overview ruler marker color for infos.\")),f4=N(\"editorBracketHighlight.foreground1\",{dark:\"#FFD700\",light:\"#0431FAFF\",hcDark:\"#FFD700\",hcLight:\"#0431FAFF\"},p(\"editorBracketHighlightForeground1\",\"Foreground color of brackets (1). Requires enabling bracket pair colorization.\")),p4=N(\"editorBracketHighlight.foreground2\",{dark:\"#DA70D6\",light:\"#319331FF\",hcDark:\"#DA70D6\",hcLight:\"#319331FF\"},p(\"editorBracketHighlightForeground2\",\"Foreground color of brackets (2). Requires enabling bracket pair colorization.\")),m4=N(\"editorBracketHighlight.foreground3\",{dark:\"#179FFF\",light:\"#7B3814FF\",hcDark:\"#87CEFA\",hcLight:\"#7B3814FF\"},p(\"editorBracketHighlightForeground3\",\"Foreground color of brackets (3). Requires enabling bracket pair colorization.\")),_4=N(\"editorBracketHighlight.foreground4\",{dark:\"#00000000\",light:\"#00000000\",hcDark:\"#00000000\",hcLight:\"#00000000\"},p(\"editorBracketHighlightForeground4\",\"Foreground color of brackets (4). Requires enabling bracket pair colorization.\")),b4=N(\"editorBracketHighlight.foreground5\",{dark:\"#00000000\",light:\"#00000000\",hcDark:\"#00000000\",hcLight:\"#00000000\"},p(\"editorBracketHighlightForeground5\",\"Foreground color of brackets (5). Requires enabling bracket pair colorization.\")),v4=N(\"editorBracketHighlight.foreground6\",{dark:\"#00000000\",light:\"#00000000\",hcDark:\"#00000000\",hcLight:\"#00000000\"},p(\"editorBracketHighlightForeground6\",\"Foreground color of brackets (6). Requires enabling bracket pair colorization.\")),ZU=N(\"editorBracketHighlight.unexpectedBracket.foreground\",{dark:new W(new je(255,18,18,.8)),light:new W(new je(255,18,18,.8)),hcDark:new W(new je(255,50,50,1)),hcLight:\"\"},p(\"editorBracketHighlightUnexpectedBracketForeground\",\"Foreground color of unexpected brackets.\")),YU=N(\"editorBracketPairGuide.background1\",{dark:\"#00000000\",light:\"#00000000\",hcDark:\"#00000000\",hcLight:\"#00000000\"},p(\"editorBracketPairGuide.background1\",\"Background color of inactive bracket pair guides (1). Requires enabling bracket pair guides.\")),XU=N(\"editorBracketPairGuide.background2\",{dark:\"#00000000\",light:\"#00000000\",hcDark:\"#00000000\",hcLight:\"#00000000\"},p(\"editorBracketPairGuide.background2\",\"Background color of inactive bracket pair guides (2). Requires enabling bracket pair guides.\")),QU=N(\"editorBracketPairGuide.background3\",{dark:\"#00000000\",light:\"#00000000\",hcDark:\"#00000000\",hcLight:\"#00000000\"},p(\"editorBracketPairGuide.background3\",\"Background color of inactive bracket pair guides (3). Requires enabling bracket pair guides.\")),JU=N(\"editorBracketPairGuide.background4\",{dark:\"#00000000\",light:\"#00000000\",hcDark:\"#00000000\",hcLight:\"#00000000\"},p(\"editorBracketPairGuide.background4\",\"Background color of inactive bracket pair guides (4). Requires enabling bracket pair guides.\")),e$=N(\"editorBracketPairGuide.background5\",{dark:\"#00000000\",light:\"#00000000\",hcDark:\"#00000000\",hcLight:\"#00000000\"},p(\"editorBracketPairGuide.background5\",\"Background color of inactive bracket pair guides (5). Requires enabling bracket pair guides.\")),t$=N(\"editorBracketPairGuide.background6\",{dark:\"#00000000\",light:\"#00000000\",hcDark:\"#00000000\",hcLight:\"#00000000\"},p(\"editorBracketPairGuide.background6\",\"Background color of inactive bracket pair guides (6). Requires enabling bracket pair guides.\")),i$=N(\"editorBracketPairGuide.activeBackground1\",{dark:\"#00000000\",light:\"#00000000\",hcDark:\"#00000000\",hcLight:\"#00000000\"},p(\"editorBracketPairGuide.activeBackground1\",\"Background color of active bracket pair guides (1). Requires enabling bracket pair guides.\")),n$=N(\"editorBracketPairGuide.activeBackground2\",{dark:\"#00000000\",light:\"#00000000\",hcDark:\"#00000000\",hcLight:\"#00000000\"},p(\"editorBracketPairGuide.activeBackground2\",\"Background color of active bracket pair guides (2). Requires enabling bracket pair guides.\")),s$=N(\"editorBracketPairGuide.activeBackground3\",{dark:\"#00000000\",light:\"#00000000\",hcDark:\"#00000000\",hcLight:\"#00000000\"},p(\"editorBracketPairGuide.activeBackground3\",\"Background color of active bracket pair guides (3). Requires enabling bracket pair guides.\")),o$=N(\"editorBracketPairGuide.activeBackground4\",{dark:\"#00000000\",light:\"#00000000\",hcDark:\"#00000000\",hcLight:\"#00000000\"},p(\"editorBracketPairGuide.activeBackground4\",\"Background color of active bracket pair guides (4). Requires enabling bracket pair guides.\")),r$=N(\"editorBracketPairGuide.activeBackground5\",{dark:\"#00000000\",light:\"#00000000\",hcDark:\"#00000000\",hcLight:\"#00000000\"},p(\"editorBracketPairGuide.activeBackground5\",\"Background color of active bracket pair guides (5). Requires enabling bracket pair guides.\")),a$=N(\"editorBracketPairGuide.activeBackground6\",{dark:\"#00000000\",light:\"#00000000\",hcDark:\"#00000000\",hcLight:\"#00000000\"},p(\"editorBracketPairGuide.activeBackground6\",\"Background color of active bracket pair guides (6). Requires enabling bracket pair guides.\"));N(\"editorUnicodeHighlight.border\",{dark:\"#BD9B03\",light:\"#CEA33D\",hcDark:\"#ff0000\",hcLight:\"\"},p(\"editorUnicodeHighlight.border\",\"Border color used to highlight unicode characters.\"));N(\"editorUnicodeHighlight.background\",{dark:\"#bd9b0326\",light:\"#cea33d14\",hcDark:\"#00000000\",hcLight:\"\"},p(\"editorUnicodeHighlight.background\",\"Background color used to highlight unicode characters.\"));Rt((o,e)=>{const t=o.getColor(bi);t&&e.addRule(`.monaco-editor, .monaco-editor-background { background-color: ${t}; }`);const i=o.getColor(d4),n=i&&!i.isTransparent()?i:t;n&&e.addRule(`.monaco-editor .inputarea.ime-input { background-color: ${n}; }`);const s=o.getColor(ws);s&&e.addRule(`.monaco-editor, .monaco-editor .inputarea.ime-input { color: ${s}; }`);const r=o.getColor(VU);r&&e.addRule(`.monaco-editor .margin { background-color: ${r}; }`);const a=o.getColor(NU);a&&e.addRule(`.monaco-editor .rangeHighlight { background-color: ${a}; }`);const l=o.getColor(TU);l&&e.addRule(`.monaco-editor .rangeHighlight { border: 1px ${yn(o.type)?\"dotted\":\"solid\"} ${l}; }`);const c=o.getColor(MU);c&&e.addRule(`.monaco-editor .symbolHighlight { background-color: ${c}; }`);const d=o.getColor(AU);d&&e.addRule(`.monaco-editor .symbolHighlight { border: 1px ${yn(o.type)?\"dotted\":\"solid\"} ${d}; }`);const h=o.getColor(za);h&&(e.addRule(`.monaco-editor .mtkw { color: ${h} !important; }`),e.addRule(`.monaco-editor .mtkz { color: ${h} !important; }`))});class dg extends zg{constructor(e){super(),this._context=e,this._readConfig(),this._lastCursorModelPosition=new B(1,1),this._lastCursorViewPosition=new B(1,1),this._renderResult=null,this._activeLineNumber=1,this._context.addEventHandler(this)}_readConfig(){const e=this._context.configuration.options;this._lineHeight=e.get(61);const t=e.get(62);this._renderLineNumbers=t.renderType,this._renderCustomLineNumbers=t.renderFn,this._renderFinalNewline=e.get(86);const i=e.get(133);this._lineNumbersLeft=i.lineNumbersLeft,this._lineNumbersWidth=i.lineNumbersWidth}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(e){return this._readConfig(),!0}onCursorStateChanged(e){const t=e.selections[0].getPosition();this._lastCursorViewPosition=t,this._lastCursorModelPosition=this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(t);let i=!1;return this._activeLineNumber!==t.lineNumber&&(this._activeLineNumber=t.lineNumber,i=!0),(this._renderLineNumbers===2||this._renderLineNumbers===3)&&(i=!0),i}onFlushed(e){return!0}onLinesChanged(e){return!0}onLinesDeleted(e){return!0}onLinesInserted(e){return!0}onScrollChanged(e){return e.scrollTopChanged}onZonesChanged(e){return!0}_getLineRenderLineNumber(e){const t=this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new B(e,1));if(t.column!==1)return\"\";const i=t.lineNumber;return this._renderCustomLineNumbers?this._renderCustomLineNumbers(i):this._renderLineNumbers===3?this._lastCursorModelPosition.lineNumber===i||i%10===0?String(i):\"\":String(i)}prepareRender(e){if(this._renderLineNumbers===0){this._renderResult=null;return}const t=sn?this._lineHeight%2===0?\" lh-even\":\" lh-odd\":\"\",i=e.visibleRange.startLineNumber,n=e.visibleRange.endLineNumber,s='<div class=\"'+dg.CLASS_NAME+t+'\" style=\"left:'+this._lineNumbersLeft+\"px;width:\"+this._lineNumbersWidth+'px;\">';let r=null;if(this._renderLineNumbers===2){r=new Array(n-i+1),this._lastCursorViewPosition.lineNumber>=i&&this._lastCursorViewPosition.lineNumber<=n&&(r[this._lastCursorViewPosition.lineNumber-i]=this._lastCursorModelPosition.lineNumber);{let c=0;for(let d=this._lastCursorViewPosition.lineNumber+1;d<=n;d++){const u=this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new B(d,1)).column!==1;u||c++,d>=i&&(r[d-i]=u?0:c)}}{let c=0;for(let d=this._lastCursorViewPosition.lineNumber-1;d>=i;d--){const u=this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new B(d,1)).column!==1;u||c++,d<=n&&(r[d-i]=u?0:c)}}}const a=this._context.viewModel.getLineCount(),l=[];for(let c=i;c<=n;c++){const d=c-i;if(!this._renderFinalNewline&&c===a&&this._context.viewModel.getLineLength(c)===0){l[d]=\"\";continue}let h;if(r){const u=r[d];this._lastCursorViewPosition.lineNumber===c?h=`<span class=\"relative-current-line-number\">${u}</span>`:u?h=String(u):h=\"\"}else h=this._getLineRenderLineNumber(c);h?c===this._activeLineNumber?l[d]='<div class=\"active-line-number '+dg.CLASS_NAME+t+'\" style=\"left:'+this._lineNumbersLeft+\"px;width:\"+this._lineNumbersWidth+'px;\">'+h+\"</div>\":l[d]=s+h+\"</div>\":l[d]=\"\"}this._renderResult=l}render(e,t){if(!this._renderResult)return\"\";const i=t-e;return i<0||i>=this._renderResult.length?\"\":this._renderResult[i]}}dg.CLASS_NAME=\"line-numbers\";Rt((o,e)=>{const t=o.getColor(u4);t&&e.addRule(`.monaco-editor .line-numbers { color: ${t}; }`);const i=o.getColor(OU);i&&e.addRule(`.monaco-editor .line-numbers.active-line-number { color: ${i}; }`)});class zd extends Es{constructor(e){super(e);const t=this._context.configuration.options,i=t.get(133);this._canUseLayerHinting=!t.get(28),this._contentLeft=i.contentLeft,this._glyphMarginLeft=i.glyphMarginLeft,this._glyphMarginWidth=i.glyphMarginWidth,this._domNode=Je(document.createElement(\"div\")),this._domNode.setClassName(zd.OUTER_CLASS_NAME),this._domNode.setPosition(\"absolute\"),this._domNode.setAttribute(\"role\",\"presentation\"),this._domNode.setAttribute(\"aria-hidden\",\"true\"),this._glyphMarginBackgroundDomNode=Je(document.createElement(\"div\")),this._glyphMarginBackgroundDomNode.setClassName(zd.CLASS_NAME),this._domNode.appendChild(this._glyphMarginBackgroundDomNode)}dispose(){super.dispose()}getDomNode(){return this._domNode}onConfigurationChanged(e){const t=this._context.configuration.options,i=t.get(133);return this._canUseLayerHinting=!t.get(28),this._contentLeft=i.contentLeft,this._glyphMarginLeft=i.glyphMarginLeft,this._glyphMarginWidth=i.glyphMarginWidth,!0}onScrollChanged(e){return super.onScrollChanged(e)||e.scrollTopChanged}prepareRender(e){}render(e){this._domNode.setLayerHinting(this._canUseLayerHinting),this._domNode.setContain(\"strict\");const t=e.scrollTop-e.bigNumbersDelta;this._domNode.setTop(-t);const i=Math.min(e.scrollHeight,1e6);this._domNode.setHeight(i),this._domNode.setWidth(this._contentLeft),this._glyphMarginBackgroundDomNode.setLeft(this._glyphMarginLeft),this._glyphMarginBackgroundDomNode.setWidth(this._glyphMarginWidth),this._glyphMarginBackgroundDomNode.setHeight(i)}}zd.CLASS_NAME=\"glyph-margin\";zd.OUTER_CLASS_NAME=\"margin\";const vd=\"monaco-mouse-cursor-text\";var Zy=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class l${constructor(){this._map=new Map,this._factories=new Map,this._onDidChange=new O,this.onDidChange=this._onDidChange.event,this._colorMap=null}fire(e){this._onDidChange.fire({changedLanguages:e,changedColorMap:!1})}register(e,t){return this._map.set(e,t),this.fire([e]),ze(()=>{this._map.get(e)===t&&(this._map.delete(e),this.fire([e]))})}registerFactory(e,t){var i;(i=this._factories.get(e))===null||i===void 0||i.dispose();const n=new c$(this,e,t);return this._factories.set(e,n),ze(()=>{const s=this._factories.get(e);!s||s!==n||(this._factories.delete(e),s.dispose())})}getOrCreate(e){return Zy(this,void 0,void 0,function*(){const t=this.get(e);if(t)return t;const i=this._factories.get(e);return!i||i.isResolved?null:(yield i.resolve(),this.get(e))})}get(e){return this._map.get(e)||null}isResolved(e){if(this.get(e))return!0;const i=this._factories.get(e);return!!(!i||i.isResolved)}setColorMap(e){this._colorMap=e,this._onDidChange.fire({changedLanguages:Array.from(this._map.keys()),changedColorMap:!0})}getColorMap(){return this._colorMap}getDefaultBackground(){return this._colorMap&&this._colorMap.length>2?this._colorMap[2]:null}}class c$ extends z{constructor(e,t,i){super(),this._registry=e,this._languageId=t,this._factory=i,this._isDisposed=!1,this._resolvePromise=null,this._isResolved=!1}get isResolved(){return this._isResolved}dispose(){this._isDisposed=!0,super.dispose()}resolve(){return Zy(this,void 0,void 0,function*(){return this._resolvePromise||(this._resolvePromise=this._create()),this._resolvePromise})}_create(){return Zy(this,void 0,void 0,function*(){const e=yield Promise.resolve(this._factory.createTokenizationSupport());this._isResolved=!0,e&&!this._isDisposed&&this._register(this._registry.register(this._languageId,e))})}}class Vp{constructor(e,t,i){this._tokenBrand=void 0,this.offset=e,this.type=t,this.language=i}toString(){return\"(\"+this.offset+\", \"+this.type+\")\"}}class DI{constructor(e,t){this._tokenizationResultBrand=void 0,this.tokens=e,this.endState=t}}class i1{constructor(e,t){this._encodedTokenizationResultBrand=void 0,this.tokens=e,this.endState=t}}var Hp;(function(o){const e=new Map;e.set(0,m.symbolMethod),e.set(1,m.symbolFunction),e.set(2,m.symbolConstructor),e.set(3,m.symbolField),e.set(4,m.symbolVariable),e.set(5,m.symbolClass),e.set(6,m.symbolStruct),e.set(7,m.symbolInterface),e.set(8,m.symbolModule),e.set(9,m.symbolProperty),e.set(10,m.symbolEvent),e.set(11,m.symbolOperator),e.set(12,m.symbolUnit),e.set(13,m.symbolValue),e.set(15,m.symbolEnum),e.set(14,m.symbolConstant),e.set(15,m.symbolEnum),e.set(16,m.symbolEnumMember),e.set(17,m.symbolKeyword),e.set(27,m.symbolSnippet),e.set(18,m.symbolText),e.set(19,m.symbolColor),e.set(20,m.symbolFile),e.set(21,m.symbolReference),e.set(22,m.symbolCustomColor),e.set(23,m.symbolFolder),e.set(24,m.symbolTypeParameter),e.set(25,m.account),e.set(26,m.issues);function t(s){let r=e.get(s);return r||(console.info(\"No codicon found for CompletionItemKind \"+s),r=m.symbolProperty),r}o.toIcon=t;const i=new Map;i.set(\"method\",0),i.set(\"function\",1),i.set(\"constructor\",2),i.set(\"field\",3),i.set(\"variable\",4),i.set(\"class\",5),i.set(\"struct\",6),i.set(\"interface\",7),i.set(\"module\",8),i.set(\"property\",9),i.set(\"event\",10),i.set(\"operator\",11),i.set(\"unit\",12),i.set(\"value\",13),i.set(\"constant\",14),i.set(\"enum\",15),i.set(\"enum-member\",16),i.set(\"enumMember\",16),i.set(\"keyword\",17),i.set(\"snippet\",27),i.set(\"text\",18),i.set(\"color\",19),i.set(\"file\",20),i.set(\"reference\",21),i.set(\"customcolor\",22),i.set(\"folder\",23),i.set(\"type-parameter\",24),i.set(\"typeParameter\",24),i.set(\"account\",25),i.set(\"issue\",26);function n(s,r){let a=i.get(s);return typeof a==\"undefined\"&&!r&&(a=9),a}o.fromString=n})(Hp||(Hp={}));var Bs;(function(o){o[o.Automatic=0]=\"Automatic\",o[o.Explicit=1]=\"Explicit\"})(Bs||(Bs={}));var Wr;(function(o){o[o.Invoke=1]=\"Invoke\",o[o.TriggerCharacter=2]=\"TriggerCharacter\",o[o.ContentChange=3]=\"ContentChange\"})(Wr||(Wr={}));var zp;(function(o){o[o.Text=0]=\"Text\",o[o.Read=1]=\"Read\",o[o.Write=2]=\"Write\"})(zp||(zp={}));function d$(o){return o&&me.isUri(o.uri)&&L.isIRange(o.range)&&(L.isIRange(o.originSelectionRange)||L.isIRange(o.targetSelectionRange))}var i2;(function(o){const e=new Map;e.set(0,m.symbolFile),e.set(1,m.symbolModule),e.set(2,m.symbolNamespace),e.set(3,m.symbolPackage),e.set(4,m.symbolClass),e.set(5,m.symbolMethod),e.set(6,m.symbolProperty),e.set(7,m.symbolField),e.set(8,m.symbolConstructor),e.set(9,m.symbolEnum),e.set(10,m.symbolInterface),e.set(11,m.symbolFunction),e.set(12,m.symbolVariable),e.set(13,m.symbolConstant),e.set(14,m.symbolString),e.set(15,m.symbolNumber),e.set(16,m.symbolBoolean),e.set(17,m.symbolArray),e.set(18,m.symbolObject),e.set(19,m.symbolKey),e.set(20,m.symbolNull),e.set(21,m.symbolEnumMember),e.set(22,m.symbolStruct),e.set(23,m.symbolEvent),e.set(24,m.symbolOperator),e.set(25,m.symbolTypeParameter);function t(i){let n=e.get(i);return n||(console.info(\"No codicon found for SymbolKind \"+i),n=m.symbolProperty),n}o.toIcon=t})(i2||(i2={}));class Zo{constructor(e){this.value=e}}Zo.Comment=new Zo(\"comment\");Zo.Imports=new Zo(\"imports\");Zo.Region=new Zo(\"region\");var Yy;(function(o){function e(t){return!t||typeof t!=\"object\"?!1:typeof t.id==\"string\"&&typeof t.title==\"string\"}o.is=e})(Yy||(Yy={}));var iv;(function(o){o[o.Type=1]=\"Type\",o[o.Parameter=2]=\"Parameter\"})(iv||(iv={}));const Jt=new l$;class h${constructor(e,t,i,n,s){this._context=e,this.modelLineNumber=t,this.distanceToModelLineStart=i,this.widthOfHiddenLineTextBefore=n,this.distanceToModelLineEnd=s,this._visibleTextAreaBrand=void 0,this.startPosition=null,this.endPosition=null,this.visibleTextareaStart=null,this.visibleTextareaEnd=null,this._previousPresentation=null}prepareRender(e){const t=new B(this.modelLineNumber,this.distanceToModelLineStart+1),i=new B(this.modelLineNumber,this._context.viewModel.model.getLineMaxColumn(this.modelLineNumber)-this.distanceToModelLineEnd);this.startPosition=this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(t),this.endPosition=this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(i),this.startPosition.lineNumber===this.endPosition.lineNumber?(this.visibleTextareaStart=e.visibleRangeForPosition(this.startPosition),this.visibleTextareaEnd=e.visibleRangeForPosition(this.endPosition)):(this.visibleTextareaStart=null,this.visibleTextareaEnd=null)}definePresentation(e){return this._previousPresentation||(e?this._previousPresentation=e:this._previousPresentation={foreground:1,italic:!1,bold:!1,underline:!1,strikethrough:!1}),this._previousPresentation}}const uf=Ls;class u$ extends Es{constructor(e,t,i){super(e),this._primaryCursorPosition=new B(1,1),this._primaryCursorVisibleRange=null,this._viewController=t,this._visibleRangeProvider=i,this._scrollLeft=0,this._scrollTop=0;const n=this._context.configuration.options,s=n.get(133);this._setAccessibilityOptions(n),this._contentLeft=s.contentLeft,this._contentWidth=s.contentWidth,this._contentHeight=s.height,this._fontInfo=n.get(46),this._lineHeight=n.get(61),this._emptySelectionClipboard=n.get(33),this._copyWithSyntaxHighlighting=n.get(21),this._visibleTextArea=null,this._selections=[new oe(1,1,1,1)],this._modelSelections=[new oe(1,1,1,1)],this._lastRenderPosition=null,this.textArea=Je(document.createElement(\"textarea\")),jr.write(this.textArea,6),this.textArea.setClassName(`inputarea ${vd}`),this.textArea.setAttribute(\"wrap\",\"off\"),this.textArea.setAttribute(\"autocorrect\",\"off\"),this.textArea.setAttribute(\"autocapitalize\",\"off\"),this.textArea.setAttribute(\"autocomplete\",\"off\"),this.textArea.setAttribute(\"spellcheck\",\"false\"),this.textArea.setAttribute(\"aria-label\",this._getAriaLabel(n)),this.textArea.setAttribute(\"tabindex\",String(n.get(114))),this.textArea.setAttribute(\"role\",\"textbox\"),this.textArea.setAttribute(\"aria-roledescription\",p(\"editor\",\"editor\")),this.textArea.setAttribute(\"aria-multiline\",\"true\"),this.textArea.setAttribute(\"aria-haspopup\",\"false\"),this.textArea.setAttribute(\"aria-autocomplete\",\"both\"),n.get(30)&&n.get(83)&&this.textArea.setAttribute(\"readonly\",\"true\"),this.textAreaCover=Je(document.createElement(\"div\")),this.textAreaCover.setPosition(\"absolute\");const r={getLineCount:()=>this._context.viewModel.getLineCount(),getLineMaxColumn:c=>this._context.viewModel.getLineMaxColumn(c),getValueInRange:(c,d)=>this._context.viewModel.getValueInRange(c,d)},a={getDataToCopy:()=>{const c=this._context.viewModel.getPlainTextToCopy(this._modelSelections,this._emptySelectionClipboard,nn),d=this._context.viewModel.model.getEOL(),h=this._emptySelectionClipboard&&this._modelSelections.length===1&&this._modelSelections[0].isEmpty(),u=Array.isArray(c)?c:null,g=Array.isArray(c)?c.join(d):c;let f,_=null;if(Gy.forceCopyWithSyntaxHighlighting||this._copyWithSyntaxHighlighting&&g.length<65536){const b=this._context.viewModel.getRichTextToCopy(this._modelSelections,this._emptySelectionClipboard);b&&(f=b.html,_=b.mode)}return{isFromEmptySelection:h,multicursorText:u,text:g,html:f,mode:_}},getScreenReaderContent:c=>{if(this._accessibilitySupport===1){const d=this._selections[0];if(Ze&&d.isEmpty()){const h=d.getStartPosition();let u=this._getWordBeforePosition(h);if(u.length===0&&(u=this._getCharacterBeforePosition(h)),u.length>0)return new Vi(u,u.length,u.length,h,h)}if(Qa&&!d.isEmpty()){const h=\"vscode-placeholder\";return new Vi(h,0,h.length,null,null)}return Vi.EMPTY}if(bO){const d=this._selections[0];if(d.isEmpty()){const h=d.getStartPosition(),[u,g]=this._getAndroidWordAtPosition(h);if(u.length>0)return new Vi(u,g,g,h,h)}return Vi.EMPTY}return mu.fromEditorSelection(c,r,this._selections[0],this._accessibilityPageSize,this._accessibilitySupport===0)},deduceModelPosition:(c,d,h)=>this._context.viewModel.deduceModelPositionRelativeToViewPosition(c,d,h)},l=this._register(new kU(this.textArea.domNode));this._textAreaInput=this._register(new DU(a,l,Os,i6)),this._register(this._textAreaInput.onKeyDown(c=>{this._viewController.emitKeyDown(c)})),this._register(this._textAreaInput.onKeyUp(c=>{this._viewController.emitKeyUp(c)})),this._register(this._textAreaInput.onPaste(c=>{let d=!1,h=null,u=null;c.metadata&&(d=this._emptySelectionClipboard&&!!c.metadata.isFromEmptySelection,h=typeof c.metadata.multicursorText!=\"undefined\"?c.metadata.multicursorText:null,u=c.metadata.mode),this._viewController.paste(c.text,d,h,u)})),this._register(this._textAreaInput.onCut(()=>{this._viewController.cut()})),this._register(this._textAreaInput.onType(c=>{c.replacePrevCharCnt||c.replaceNextCharCnt||c.positionDelta?this._viewController.compositionType(c.text,c.replacePrevCharCnt,c.replaceNextCharCnt,c.positionDelta):this._viewController.type(c.text)})),this._register(this._textAreaInput.onSelectionChangeRequest(c=>{this._viewController.setSelection(c)})),this._register(this._textAreaInput.onCompositionStart(c=>{const d=this.textArea.domNode,h=this._modelSelections[0],{distanceToModelLineStart:u,widthOfHiddenTextBefore:g}=(()=>{const _=d.value.substring(0,Math.min(d.selectionStart,d.selectionEnd)),b=_.lastIndexOf(`\n`),v=_.substring(b+1),C=v.lastIndexOf(\"\t\"),w=v.length-C-1,S=h.getStartPosition(),k=Math.min(S.column-1,w),x=S.column-1-k,y=v.substring(0,v.length-k),D=g$(y,this._fontInfo);return{distanceToModelLineStart:x,widthOfHiddenTextBefore:D}})(),{distanceToModelLineEnd:f}=(()=>{const _=d.value.substring(Math.max(d.selectionStart,d.selectionEnd)),b=_.indexOf(`\n`),v=b===-1?_:_.substring(0,b),C=v.indexOf(\"\t\"),w=C===-1?v.length:v.length-C-1,S=h.getEndPosition(),k=Math.min(this._context.viewModel.model.getLineMaxColumn(S.lineNumber)-S.column,w);return{distanceToModelLineEnd:this._context.viewModel.model.getLineMaxColumn(S.lineNumber)-S.column-k}})();this._context.viewModel.revealRange(\"keyboard\",!0,L.fromPositions(this._selections[0].getStartPosition()),0,1),this._visibleTextArea=new h$(this._context,h.startLineNumber,u,g,f),this._visibleTextArea.prepareRender(this._visibleRangeProvider),this._render(),this.textArea.setClassName(`inputarea ${vd} ime-input`),this._viewController.compositionStart(),this._context.viewModel.onCompositionStart()})),this._register(this._textAreaInput.onCompositionUpdate(c=>{!this._visibleTextArea||(this._visibleTextArea.prepareRender(this._visibleRangeProvider),this._render())})),this._register(this._textAreaInput.onCompositionEnd(()=>{this._visibleTextArea=null,this._render(),this.textArea.setClassName(`inputarea ${vd}`),this._viewController.compositionEnd(),this._context.viewModel.onCompositionEnd()})),this._register(this._textAreaInput.onFocus(()=>{this._context.viewModel.setHasFocus(!0)})),this._register(this._textAreaInput.onBlur(()=>{this._context.viewModel.setHasFocus(!1)}))}dispose(){super.dispose()}_getAndroidWordAtPosition(e){const t='`~!@#$%^&*()-=+[{]}\\\\|;:\",.<>/?',i=this._context.viewModel.getLineContent(e.lineNumber),n=Zs(t);let s=!0,r=e.column,a=!0,l=e.column,c=0;for(;c<50&&(s||a);){if(s&&r<=1&&(s=!1),s){const d=i.charCodeAt(r-2);n.get(d)!==0?s=!1:r--}if(a&&l>i.length&&(a=!1),a){const d=i.charCodeAt(l-1);n.get(d)!==0?a=!1:l++}c++}return[i.substring(r-1,l-1),e.column-r]}_getWordBeforePosition(e){const t=this._context.viewModel.getLineContent(e.lineNumber),i=Zs(this._context.configuration.options.get(119));let n=e.column,s=0;for(;n>1;){const r=t.charCodeAt(n-2);if(i.get(r)!==0||s>50)return t.substring(n-1,e.column-1);s++,n--}return t.substring(0,e.column-1)}_getCharacterBeforePosition(e){if(e.column>1){const i=this._context.viewModel.getLineContent(e.lineNumber).charAt(e.column-2);if(!wi(i.charCodeAt(0)))return i}return\"\"}_getAriaLabel(e){return e.get(2)===1?p(\"accessibilityOffAriaLabel\",\"The editor is not accessible at this time. Press {0} for options.\",sn?\"Shift+Alt+F1\":\"Alt+F1\"):e.get(4)}_setAccessibilityOptions(e){this._accessibilitySupport=e.get(2);const t=e.get(3);this._accessibilitySupport===2&&t===Jo.accessibilityPageSize.defaultValue?this._accessibilityPageSize=500:this._accessibilityPageSize=t}onConfigurationChanged(e){const t=this._context.configuration.options,i=t.get(133);return this._setAccessibilityOptions(t),this._contentLeft=i.contentLeft,this._contentWidth=i.contentWidth,this._contentHeight=i.height,this._fontInfo=t.get(46),this._lineHeight=t.get(61),this._emptySelectionClipboard=t.get(33),this._copyWithSyntaxHighlighting=t.get(21),this.textArea.setAttribute(\"aria-label\",this._getAriaLabel(t)),this.textArea.setAttribute(\"tabindex\",String(t.get(114))),(e.hasChanged(30)||e.hasChanged(83))&&(t.get(30)&&t.get(83)?this.textArea.setAttribute(\"readonly\",\"true\"):this.textArea.removeAttribute(\"readonly\")),e.hasChanged(2)&&this._textAreaInput.writeScreenReaderContent(\"strategy changed\"),!0}onCursorStateChanged(e){return this._selections=e.selections.slice(0),this._modelSelections=e.modelSelections.slice(0),this._textAreaInput.writeScreenReaderContent(\"selection changed\"),!0}onDecorationsChanged(e){return!0}onFlushed(e){return!0}onLinesChanged(e){return!0}onLinesDeleted(e){return!0}onLinesInserted(e){return!0}onScrollChanged(e){return this._scrollLeft=e.scrollLeft,this._scrollTop=e.scrollTop,!0}onZonesChanged(e){return!0}isFocused(){return this._textAreaInput.isFocused()}focusTextArea(){this._textAreaInput.focusTextArea()}getLastRenderData(){return this._lastRenderPosition}setAriaOptions(e){e.activeDescendant?(this.textArea.setAttribute(\"aria-haspopup\",\"true\"),this.textArea.setAttribute(\"aria-autocomplete\",\"list\"),this.textArea.setAttribute(\"aria-activedescendant\",e.activeDescendant)):(this.textArea.setAttribute(\"aria-haspopup\",\"false\"),this.textArea.setAttribute(\"aria-autocomplete\",\"both\"),this.textArea.removeAttribute(\"aria-activedescendant\")),e.role&&this.textArea.setAttribute(\"role\",e.role)}prepareRender(e){var t;this._primaryCursorPosition=new B(this._selections[0].positionLineNumber,this._selections[0].positionColumn),this._primaryCursorVisibleRange=e.visibleRangeForPosition(this._primaryCursorPosition),(t=this._visibleTextArea)===null||t===void 0||t.prepareRender(e)}render(e){this._textAreaInput.writeScreenReaderContent(\"render\"),this._render()}_render(){if(this._visibleTextArea){const i=this._visibleTextArea.visibleTextareaStart,n=this._visibleTextArea.visibleTextareaEnd,s=this._visibleTextArea.startPosition,r=this._visibleTextArea.endPosition;if(s&&r&&i&&n&&n.left>=this._scrollLeft&&i.left<=this._scrollLeft+this._contentWidth){const a=this._context.viewLayout.getVerticalOffsetForLineNumber(this._primaryCursorPosition.lineNumber)-this._scrollTop,l=this._newlinecount(this.textArea.domNode.value.substr(0,this.textArea.domNode.selectionStart));let c=this._visibleTextArea.widthOfHiddenLineTextBefore,d=this._contentLeft+i.left-this._scrollLeft,h=n.left-i.left+1;if(d<this._contentLeft){const v=this._contentLeft-d;d+=v,c+=v,h-=v}h>this._contentWidth&&(h=this._contentWidth);const u=this._context.viewModel.getViewLineData(s.lineNumber),g=u.tokens.findTokenIndexAtOffset(s.column-1),f=u.tokens.findTokenIndexAtOffset(r.column-1),_=g===f,b=this._visibleTextArea.definePresentation(_?u.tokens.getPresentation(g):null);this.textArea.domNode.scrollTop=l*this._lineHeight,this.textArea.domNode.scrollLeft=c,this._doRender({lastRenderPosition:null,top:a,left:d,width:h,height:this._lineHeight,useCover:!1,color:(Jt.getColorMap()||[])[b.foreground],italic:b.italic,bold:b.bold,underline:b.underline,strikethrough:b.strikethrough})}return}if(!this._primaryCursorVisibleRange){this._renderAtTopLeft();return}const e=this._contentLeft+this._primaryCursorVisibleRange.left-this._scrollLeft;if(e<this._contentLeft||e>this._contentLeft+this._contentWidth){this._renderAtTopLeft();return}const t=this._context.viewLayout.getVerticalOffsetForLineNumber(this._selections[0].positionLineNumber)-this._scrollTop;if(t<0||t>this._contentHeight){this._renderAtTopLeft();return}if(Ze){this._doRender({lastRenderPosition:this._primaryCursorPosition,top:t,left:e,width:uf?0:1,height:this._lineHeight,useCover:!1}),this.textArea.domNode.scrollLeft=this._primaryCursorVisibleRange.left;const i=this._newlinecount(this.textArea.domNode.value.substr(0,this.textArea.domNode.selectionStart));this.textArea.domNode.scrollTop=i*this._lineHeight;return}this._doRender({lastRenderPosition:this._primaryCursorPosition,top:t,left:e,width:uf?0:1,height:uf?0:1,useCover:!1})}_newlinecount(e){let t=0,i=-1;do{if(i=e.indexOf(`\n`,i+1),i===-1)break;t++}while(!0);return t}_renderAtTopLeft(){this._doRender({lastRenderPosition:null,top:0,left:0,width:uf?0:1,height:uf?0:1,useCover:!0})}_doRender(e){this._lastRenderPosition=e.lastRenderPosition;const t=this.textArea,i=this.textAreaCover;tn(t,this._fontInfo),t.setTop(e.top),t.setLeft(e.left),t.setWidth(e.width),t.setHeight(e.height),t.setColor(e.color?W.Format.CSS.formatHex(e.color):\"\"),t.setFontStyle(e.italic?\"italic\":\"\"),e.bold&&t.setFontWeight(\"bold\"),t.setTextDecoration(`${e.underline?\" underline\":\"\"}${e.strikethrough?\" line-through\":\"\"}`),i.setTop(e.useCover?e.top:0),i.setLeft(e.useCover?e.left:0),i.setWidth(e.useCover?e.width:0),i.setHeight(e.useCover?e.height:0);const n=this._context.configuration.options;n.get(52)?i.setClassName(\"monaco-editor-background textAreaCover \"+zd.OUTER_CLASS_NAME):n.get(62).renderType!==0?i.setClassName(\"monaco-editor-background textAreaCover \"+dg.CLASS_NAME):i.setClassName(\"monaco-editor-background textAreaCover\")}}function g$(o,e){if(o.length===0)return 0;const t=document.createElement(\"div\");t.style.position=\"absolute\",t.style.top=\"-50000px\",t.style.width=\"50000px\";const i=document.createElement(\"span\");tn(i,e),i.style.whiteSpace=\"pre\",i.append(o),t.appendChild(i),document.body.appendChild(t);const n=i.offsetWidth;return document.body.removeChild(t),n}class f${constructor(e,t,i,n){this.configuration=e,this.viewModel=t,this.userInputEvents=i,this.commandDelegate=n}paste(e,t,i,n){this.commandDelegate.paste(e,t,i,n)}type(e){this.commandDelegate.type(e)}compositionType(e,t,i,n){this.commandDelegate.compositionType(e,t,i,n)}compositionStart(){this.commandDelegate.startComposition()}compositionEnd(){this.commandDelegate.endComposition()}cut(){this.commandDelegate.cut()}setSelection(e){yi.SetSelection.runCoreEditorCommand(this.viewModel,{source:\"keyboard\",selection:e})}_validateViewColumn(e){const t=this.viewModel.getLineMinColumn(e.lineNumber);return e.column<t?new B(e.lineNumber,t):e}_hasMulticursorModifier(e){switch(this.configuration.options.get(72)){case\"altKey\":return e.altKey;case\"ctrlKey\":return e.ctrlKey;case\"metaKey\":return e.metaKey;default:return!1}}_hasNonMulticursorModifier(e){switch(this.configuration.options.get(72)){case\"altKey\":return e.ctrlKey||e.metaKey;case\"ctrlKey\":return e.altKey||e.metaKey;case\"metaKey\":return e.ctrlKey||e.altKey;default:return!1}}dispatchMouse(e){const t=this.configuration.options,i=sn&&t.get(98),n=t.get(18);e.middleButton&&!i?this._columnSelect(e.position,e.mouseColumn,e.inSelectionMode):e.startedOnLineNumbers?this._hasMulticursorModifier(e)?e.inSelectionMode?this._lastCursorLineSelect(e.position):this._createCursor(e.position,!0):e.inSelectionMode?this._lineSelectDrag(e.position):this._lineSelect(e.position):e.mouseDownCount>=4?this._selectAll():e.mouseDownCount===3?this._hasMulticursorModifier(e)?e.inSelectionMode?this._lastCursorLineSelectDrag(e.position):this._lastCursorLineSelect(e.position):e.inSelectionMode?this._lineSelectDrag(e.position):this._lineSelect(e.position):e.mouseDownCount===2?e.onInjectedText||(this._hasMulticursorModifier(e)?this._lastCursorWordSelect(e.position):e.inSelectionMode?this._wordSelectDrag(e.position):this._wordSelect(e.position)):this._hasMulticursorModifier(e)?this._hasNonMulticursorModifier(e)||(e.shiftKey?this._columnSelect(e.position,e.mouseColumn,!0):e.inSelectionMode?this._lastCursorMoveToSelect(e.position):this._createCursor(e.position,!1)):e.inSelectionMode?e.altKey?this._columnSelect(e.position,e.mouseColumn,!0):n?this._columnSelect(e.position,e.mouseColumn,!0):this._moveToSelect(e.position):this.moveTo(e.position)}_usualArgs(e){return e=this._validateViewColumn(e),{source:\"mouse\",position:this._convertViewToModelPosition(e),viewPosition:e}}moveTo(e){yi.MoveTo.runCoreEditorCommand(this.viewModel,this._usualArgs(e))}_moveToSelect(e){yi.MoveToSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(e))}_columnSelect(e,t,i){e=this._validateViewColumn(e),yi.ColumnSelect.runCoreEditorCommand(this.viewModel,{source:\"mouse\",position:this._convertViewToModelPosition(e),viewPosition:e,mouseColumn:t,doColumnSelect:i})}_createCursor(e,t){e=this._validateViewColumn(e),yi.CreateCursor.runCoreEditorCommand(this.viewModel,{source:\"mouse\",position:this._convertViewToModelPosition(e),viewPosition:e,wholeLine:t})}_lastCursorMoveToSelect(e){yi.LastCursorMoveToSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(e))}_wordSelect(e){yi.WordSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(e))}_wordSelectDrag(e){yi.WordSelectDrag.runCoreEditorCommand(this.viewModel,this._usualArgs(e))}_lastCursorWordSelect(e){yi.LastCursorWordSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(e))}_lineSelect(e){yi.LineSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(e))}_lineSelectDrag(e){yi.LineSelectDrag.runCoreEditorCommand(this.viewModel,this._usualArgs(e))}_lastCursorLineSelect(e){yi.LastCursorLineSelect.runCoreEditorCommand(this.viewModel,this._usualArgs(e))}_lastCursorLineSelectDrag(e){yi.LastCursorLineSelectDrag.runCoreEditorCommand(this.viewModel,this._usualArgs(e))}_selectAll(){yi.SelectAll.runCoreEditorCommand(this.viewModel,{source:\"mouse\"})}_convertViewToModelPosition(e){return this.viewModel.coordinatesConverter.convertViewPositionToModelPosition(e)}emitKeyDown(e){this.userInputEvents.emitKeyDown(e)}emitKeyUp(e){this.userInputEvents.emitKeyUp(e)}emitContextMenu(e){this.userInputEvents.emitContextMenu(e)}emitMouseMove(e){this.userInputEvents.emitMouseMove(e)}emitMouseLeave(e){this.userInputEvents.emitMouseLeave(e)}emitMouseUp(e){this.userInputEvents.emitMouseUp(e)}emitMouseDown(e){this.userInputEvents.emitMouseDown(e)}emitMouseDrag(e){this.userInputEvents.emitMouseDrag(e)}emitMouseDrop(e){this.userInputEvents.emitMouseDrop(e)}emitMouseDropCanceled(){this.userInputEvents.emitMouseDropCanceled()}emitMouseWheel(e){this.userInputEvents.emitMouseWheel(e)}}class n1{constructor(e){this.onKeyDown=null,this.onKeyUp=null,this.onContextMenu=null,this.onMouseMove=null,this.onMouseLeave=null,this.onMouseDown=null,this.onMouseUp=null,this.onMouseDrag=null,this.onMouseDrop=null,this.onMouseDropCanceled=null,this.onMouseWheel=null,this._coordinatesConverter=e}emitKeyDown(e){var t;(t=this.onKeyDown)===null||t===void 0||t.call(this,e)}emitKeyUp(e){var t;(t=this.onKeyUp)===null||t===void 0||t.call(this,e)}emitContextMenu(e){var t;(t=this.onContextMenu)===null||t===void 0||t.call(this,this._convertViewToModelMouseEvent(e))}emitMouseMove(e){var t;(t=this.onMouseMove)===null||t===void 0||t.call(this,this._convertViewToModelMouseEvent(e))}emitMouseLeave(e){var t;(t=this.onMouseLeave)===null||t===void 0||t.call(this,this._convertViewToModelMouseEvent(e))}emitMouseDown(e){var t;(t=this.onMouseDown)===null||t===void 0||t.call(this,this._convertViewToModelMouseEvent(e))}emitMouseUp(e){var t;(t=this.onMouseUp)===null||t===void 0||t.call(this,this._convertViewToModelMouseEvent(e))}emitMouseDrag(e){var t;(t=this.onMouseDrag)===null||t===void 0||t.call(this,this._convertViewToModelMouseEvent(e))}emitMouseDrop(e){var t;(t=this.onMouseDrop)===null||t===void 0||t.call(this,this._convertViewToModelMouseEvent(e))}emitMouseDropCanceled(){var e;(e=this.onMouseDropCanceled)===null||e===void 0||e.call(this)}emitMouseWheel(e){var t;(t=this.onMouseWheel)===null||t===void 0||t.call(this,e)}_convertViewToModelMouseEvent(e){return e.target?{event:e.event,target:this._convertViewToModelMouseTarget(e.target)}:e}_convertViewToModelMouseTarget(e){return n1.convertViewToModelMouseTarget(e,this._coordinatesConverter)}static convertViewToModelMouseTarget(e,t){const i=Object.assign({},e);return i.position&&(i.position=t.convertViewPositionToModelPosition(i.position)),i.range&&(i.range=t.convertViewRangeToModelRange(i.range)),i}}var Pw;class C4{constructor(e){this._createLine=e,this._set(1,[])}flush(){this._set(1,[])}_set(e,t){this._lines=t,this._rendLineNumberStart=e}_get(){return{rendLineNumberStart:this._rendLineNumberStart,lines:this._lines}}getStartLineNumber(){return this._rendLineNumberStart}getEndLineNumber(){return this._rendLineNumberStart+this._lines.length-1}getCount(){return this._lines.length}getLine(e){const t=e-this._rendLineNumberStart;if(t<0||t>=this._lines.length)throw new Error(\"Illegal value for lineNumber\");return this._lines[t]}onLinesDeleted(e,t){if(this.getCount()===0)return null;const i=this.getStartLineNumber(),n=this.getEndLineNumber();if(t<i){const l=t-e+1;return this._rendLineNumberStart-=l,null}if(e>n)return null;let s=0,r=0;for(let l=i;l<=n;l++){const c=l-this._rendLineNumberStart;e<=l&&l<=t&&(r===0?(s=c,r=1):r++)}if(e<i){let l=0;t<i?l=t-e+1:l=i-e,this._rendLineNumberStart-=l}return this._lines.splice(s,r)}onLinesChanged(e,t){const i=e+t-1;if(this.getCount()===0)return!1;const n=this.getStartLineNumber(),s=this.getEndLineNumber();let r=!1;for(let a=e;a<=i;a++)a>=n&&a<=s&&(this._lines[a-this._rendLineNumberStart].onContentChanged(),r=!0);return r}onLinesInserted(e,t){if(this.getCount()===0)return null;const i=t-e+1,n=this.getStartLineNumber(),s=this.getEndLineNumber();if(e<=n)return this._rendLineNumberStart+=i,null;if(e>s)return null;if(i+e>s)return this._lines.splice(e-this._rendLineNumberStart,s-e+1);const r=[];for(let h=0;h<i;h++)r[h]=this._createLine();const a=e-this._rendLineNumberStart,l=this._lines.slice(0,a),c=this._lines.slice(a,this._lines.length-i),d=this._lines.slice(this._lines.length-i,this._lines.length);return this._lines=l.concat(r).concat(c),d}onTokensChanged(e){if(this.getCount()===0)return!1;const t=this.getStartLineNumber(),i=this.getEndLineNumber();let n=!1;for(let s=0,r=e.length;s<r;s++){const a=e[s];if(a.toLineNumber<t||a.fromLineNumber>i)continue;const l=Math.max(t,a.fromLineNumber),c=Math.min(i,a.toLineNumber);for(let d=l;d<=c;d++){const h=d-this._rendLineNumberStart;this._lines[h].onTokensChanged(),n=!0}}return n}}class w4{constructor(e){this._host=e,this.domNode=this._createDomNode(),this._linesCollection=new C4(()=>this._host.createVisibleLine())}_createDomNode(){const e=Je(document.createElement(\"div\"));return e.setClassName(\"view-layer\"),e.setPosition(\"absolute\"),e.domNode.setAttribute(\"role\",\"presentation\"),e.domNode.setAttribute(\"aria-hidden\",\"true\"),e}onConfigurationChanged(e){return!!e.hasChanged(133)}onFlushed(e){return this._linesCollection.flush(),!0}onLinesChanged(e){return this._linesCollection.onLinesChanged(e.fromLineNumber,e.count)}onLinesDeleted(e){const t=this._linesCollection.onLinesDeleted(e.fromLineNumber,e.toLineNumber);if(t)for(let i=0,n=t.length;i<n;i++){const s=t[i].getDomNode();s&&this.domNode.domNode.removeChild(s)}return!0}onLinesInserted(e){const t=this._linesCollection.onLinesInserted(e.fromLineNumber,e.toLineNumber);if(t)for(let i=0,n=t.length;i<n;i++){const s=t[i].getDomNode();s&&this.domNode.domNode.removeChild(s)}return!0}onScrollChanged(e){return e.scrollTopChanged}onTokensChanged(e){return this._linesCollection.onTokensChanged(e.ranges)}onZonesChanged(e){return!0}getStartLineNumber(){return this._linesCollection.getStartLineNumber()}getEndLineNumber(){return this._linesCollection.getEndLineNumber()}getVisibleLine(e){return this._linesCollection.getLine(e)}renderLines(e){const t=this._linesCollection._get(),i=new Ta(this.domNode.domNode,this._host,e),n={rendLineNumberStart:t.rendLineNumberStart,lines:t.lines,linesLength:t.lines.length},s=i.render(n,e.startLineNumber,e.endLineNumber,e.relativeVerticalOffset);this._linesCollection._set(s.rendLineNumberStart,s.lines)}}class Ta{constructor(e,t,i){this.domNode=e,this.host=t,this.viewportData=i}render(e,t,i,n){const s={rendLineNumberStart:e.rendLineNumberStart,lines:e.lines.slice(0),linesLength:e.linesLength};if(s.rendLineNumberStart+s.linesLength-1<t||i<s.rendLineNumberStart){s.rendLineNumberStart=t,s.linesLength=i-t+1,s.lines=[];for(let r=t;r<=i;r++)s.lines[r-t]=this.host.createVisibleLine();return this._finishRendering(s,!0,n),s}if(this._renderUntouchedLines(s,Math.max(t-s.rendLineNumberStart,0),Math.min(i-s.rendLineNumberStart,s.linesLength-1),n,t),s.rendLineNumberStart>t){const r=t,a=Math.min(i,s.rendLineNumberStart-1);r<=a&&(this._insertLinesBefore(s,r,a,n,t),s.linesLength+=a-r+1)}else if(s.rendLineNumberStart<t){const r=Math.min(s.linesLength,t-s.rendLineNumberStart);r>0&&(this._removeLinesBefore(s,r),s.linesLength-=r)}if(s.rendLineNumberStart=t,s.rendLineNumberStart+s.linesLength-1<i){const r=s.rendLineNumberStart+s.linesLength,a=i;r<=a&&(this._insertLinesAfter(s,r,a,n,t),s.linesLength+=a-r+1)}else if(s.rendLineNumberStart+s.linesLength-1>i){const r=Math.max(0,i-s.rendLineNumberStart+1),l=s.linesLength-1-r+1;l>0&&(this._removeLinesAfter(s,l),s.linesLength-=l)}return this._finishRendering(s,!1,n),s}_renderUntouchedLines(e,t,i,n,s){const r=e.rendLineNumberStart,a=e.lines;for(let l=t;l<=i;l++){const c=r+l;a[l].layoutLine(c,n[c-s])}}_insertLinesBefore(e,t,i,n,s){const r=[];let a=0;for(let l=t;l<=i;l++)r[a++]=this.host.createVisibleLine();e.lines=r.concat(e.lines)}_removeLinesBefore(e,t){for(let i=0;i<t;i++){const n=e.lines[i].getDomNode();n&&this.domNode.removeChild(n)}e.lines.splice(0,t)}_insertLinesAfter(e,t,i,n,s){const r=[];let a=0;for(let l=t;l<=i;l++)r[a++]=this.host.createVisibleLine();e.lines=e.lines.concat(r)}_removeLinesAfter(e,t){const i=e.linesLength-t;for(let n=0;n<t;n++){const s=e.lines[i+n].getDomNode();s&&this.domNode.removeChild(s)}e.lines.splice(i,t)}_finishRenderingNewLines(e,t,i,n){Ta._ttPolicy&&(i=Ta._ttPolicy.createHTML(i));const s=this.domNode.lastChild;t||!s?this.domNode.innerHTML=i:s.insertAdjacentHTML(\"afterend\",i);let r=this.domNode.lastChild;for(let a=e.linesLength-1;a>=0;a--){const l=e.lines[a];n[a]&&(l.setDomNode(r),r=r.previousSibling)}}_finishRenderingInvalidLines(e,t,i){const n=document.createElement(\"div\");Ta._ttPolicy&&(t=Ta._ttPolicy.createHTML(t)),n.innerHTML=t;for(let s=0;s<e.linesLength;s++){const r=e.lines[s];if(i[s]){const a=n.firstChild,l=r.getDomNode();l.parentNode.replaceChild(a,l),r.setDomNode(a)}}}_finishRendering(e,t,i){const n=Ta._sb,s=e.linesLength,r=e.lines,a=e.rendLineNumberStart,l=[];{n.reset();let c=!1;for(let d=0;d<s;d++){const h=r[d];l[d]=!1,!(h.getDomNode()||!h.renderLine(d+a,i[d],this.viewportData,n))&&(l[d]=!0,c=!0)}c&&this._finishRenderingNewLines(e,t,n.build(),l)}{n.reset();let c=!1;const d=[];for(let h=0;h<s;h++){const u=r[h];d[h]=!1,!(l[h]||!u.renderLine(h+a,i[h],this.viewportData,n))&&(d[h]=!0,c=!0)}c&&this._finishRenderingInvalidLines(e,n.build(),d)}}}Ta._ttPolicy=(Pw=window.trustedTypes)===null||Pw===void 0?void 0:Pw.createPolicy(\"editorViewLayer\",{createHTML:o=>o});Ta._sb=lc(1e5);class S4 extends Es{constructor(e){super(e),this._visibleLines=new w4(this),this.domNode=this._visibleLines.domNode,this._dynamicOverlays=[],this._isFocused=!1,this.domNode.setClassName(\"view-overlays\")}shouldRender(){if(super.shouldRender())return!0;for(let e=0,t=this._dynamicOverlays.length;e<t;e++)if(this._dynamicOverlays[e].shouldRender())return!0;return!1}dispose(){super.dispose();for(let e=0,t=this._dynamicOverlays.length;e<t;e++)this._dynamicOverlays[e].dispose();this._dynamicOverlays=[]}getDomNode(){return this.domNode}createVisibleLine(){return new p$(this._context.configuration,this._dynamicOverlays)}addDynamicOverlay(e){this._dynamicOverlays.push(e)}onConfigurationChanged(e){this._visibleLines.onConfigurationChanged(e);const t=this._visibleLines.getStartLineNumber(),i=this._visibleLines.getEndLineNumber();for(let n=t;n<=i;n++)this._visibleLines.getVisibleLine(n).onConfigurationChanged(e);return!0}onFlushed(e){return this._visibleLines.onFlushed(e)}onFocusChanged(e){return this._isFocused=e.isFocused,!0}onLinesChanged(e){return this._visibleLines.onLinesChanged(e)}onLinesDeleted(e){return this._visibleLines.onLinesDeleted(e)}onLinesInserted(e){return this._visibleLines.onLinesInserted(e)}onScrollChanged(e){return this._visibleLines.onScrollChanged(e)||!0}onTokensChanged(e){return this._visibleLines.onTokensChanged(e)}onZonesChanged(e){return this._visibleLines.onZonesChanged(e)}prepareRender(e){const t=this._dynamicOverlays.filter(i=>i.shouldRender());for(let i=0,n=t.length;i<n;i++){const s=t[i];s.prepareRender(e),s.onDidRender()}}render(e){this._viewOverlaysRender(e),this.domNode.toggleClassName(\"focused\",this._isFocused)}_viewOverlaysRender(e){this._visibleLines.renderLines(e.viewportData)}}class p${constructor(e,t){this._configuration=e,this._lineHeight=this._configuration.options.get(61),this._dynamicOverlays=t,this._domNode=null,this._renderedContent=null}getDomNode(){return this._domNode?this._domNode.domNode:null}setDomNode(e){this._domNode=Je(e)}onContentChanged(){}onTokensChanged(){}onConfigurationChanged(e){this._lineHeight=this._configuration.options.get(61)}renderLine(e,t,i,n){let s=\"\";for(let r=0,a=this._dynamicOverlays.length;r<a;r++)s+=this._dynamicOverlays[r].render(i.startLineNumber,e);return this._renderedContent===s?!1:(this._renderedContent=s,n.appendASCIIString('<div style=\"position:absolute;top:'),n.appendASCIIString(String(t)),n.appendASCIIString(\"px;width:100%;height:\"),n.appendASCIIString(String(this._lineHeight)),n.appendASCIIString('px;\">'),n.appendASCIIString(s),n.appendASCIIString(\"</div>\"),!0)}layoutLine(e,t){this._domNode&&(this._domNode.setTop(t),this._domNode.setHeight(this._lineHeight))}}class m$ extends S4{constructor(e){super(e);const i=this._context.configuration.options.get(133);this._contentWidth=i.contentWidth,this.domNode.setHeight(0)}onConfigurationChanged(e){const i=this._context.configuration.options.get(133);return this._contentWidth=i.contentWidth,super.onConfigurationChanged(e)||!0}onScrollChanged(e){return super.onScrollChanged(e)||e.scrollWidthChanged}_viewOverlaysRender(e){super._viewOverlaysRender(e),this.domNode.setWidth(Math.max(e.scrollWidth,this._contentWidth))}}class _$ extends S4{constructor(e){super(e);const t=this._context.configuration.options,i=t.get(133);this._contentLeft=i.contentLeft,this.domNode.setClassName(\"margin-view-overlays\"),this.domNode.setWidth(1),tn(this.domNode,t.get(46))}onConfigurationChanged(e){const t=this._context.configuration.options;tn(this.domNode,t.get(46));const i=t.get(133);return this._contentLeft=i.contentLeft,super.onConfigurationChanged(e)||!0}onScrollChanged(e){return super.onScrollChanged(e)||e.scrollHeightChanged}_viewOverlaysRender(e){super._viewOverlaysRender(e);const t=Math.min(e.scrollHeight,1e6);this.domNode.setHeight(t),this.domNode.setWidth(this._contentLeft)}}class gf{constructor(e,t){this._coordinateBrand=void 0,this.top=e,this.left=t}}class b$ extends Es{constructor(e,t){super(e),this._viewDomNode=t,this._widgets={},this.domNode=Je(document.createElement(\"div\")),jr.write(this.domNode,1),this.domNode.setClassName(\"contentWidgets\"),this.domNode.setPosition(\"absolute\"),this.domNode.setTop(0),this.overflowingContentWidgetsDomNode=Je(document.createElement(\"div\")),jr.write(this.overflowingContentWidgetsDomNode,2),this.overflowingContentWidgetsDomNode.setClassName(\"overflowingContentWidgets\")}dispose(){super.dispose(),this._widgets={}}onConfigurationChanged(e){const t=Object.keys(this._widgets);for(const i of t)this._widgets[i].onConfigurationChanged(e);return!0}onDecorationsChanged(e){return!0}onFlushed(e){return!0}onLineMappingChanged(e){const t=Object.keys(this._widgets);for(const i of t)this._widgets[i].onLineMappingChanged(e);return!0}onLinesChanged(e){return!0}onLinesDeleted(e){return!0}onLinesInserted(e){return!0}onScrollChanged(e){return!0}onZonesChanged(e){return!0}addWidget(e){const t=new v$(this._context,this._viewDomNode,e);this._widgets[t.id]=t,t.allowEditorOverflow?this.overflowingContentWidgetsDomNode.appendChild(t.domNode):this.domNode.appendChild(t.domNode),this.setShouldRender()}setWidgetPosition(e,t,i,n){this._widgets[e.getId()].setPosition(t,i,n),this.setShouldRender()}removeWidget(e){const t=e.getId();if(this._widgets.hasOwnProperty(t)){const i=this._widgets[t];delete this._widgets[t];const n=i.domNode.domNode;n.parentNode.removeChild(n),n.removeAttribute(\"monaco-visible-content-widget\"),this.setShouldRender()}}shouldSuppressMouseDownOnWidget(e){return this._widgets.hasOwnProperty(e)?this._widgets[e].suppressMouseDown:!1}onBeforeRender(e){const t=Object.keys(this._widgets);for(const i of t)this._widgets[i].onBeforeRender(e)}prepareRender(e){const t=Object.keys(this._widgets);for(const i of t)this._widgets[i].prepareRender(e)}render(e){const t=Object.keys(this._widgets);for(const i of t)this._widgets[i].render(e)}}class v${constructor(e,t,i){this._context=e,this._viewDomNode=t,this._actual=i,this.domNode=Je(this._actual.getDomNode()),this.id=this._actual.getId(),this.allowEditorOverflow=this._actual.allowEditorOverflow||!1,this.suppressMouseDown=this._actual.suppressMouseDown||!1;const n=this._context.configuration.options,s=n.get(133);this._fixedOverflowWidgets=n.get(38),this._contentWidth=s.contentWidth,this._contentLeft=s.contentLeft,this._lineHeight=n.get(61),this._range=null,this._viewRange=null,this._affinity=null,this._preference=[],this._cachedDomNodeOffsetWidth=-1,this._cachedDomNodeOffsetHeight=-1,this._maxWidth=this._getMaxWidth(),this._isVisible=!1,this._renderData=null,this.domNode.setPosition(this._fixedOverflowWidgets&&this.allowEditorOverflow?\"fixed\":\"absolute\"),this.domNode.setDisplay(\"none\"),this.domNode.setVisibility(\"hidden\"),this.domNode.setAttribute(\"widgetId\",this.id),this.domNode.setMaxWidth(this._maxWidth)}onConfigurationChanged(e){const t=this._context.configuration.options;if(this._lineHeight=t.get(61),e.hasChanged(133)){const i=t.get(133);this._contentLeft=i.contentLeft,this._contentWidth=i.contentWidth,this._maxWidth=this._getMaxWidth()}}onLineMappingChanged(e){this._setPosition(this._range,this._affinity)}_setPosition(e,t){var i;if(this._range=e,this._viewRange=null,this._affinity=t,this._range){const n=this._context.viewModel.model.validateRange(this._range);(this._context.viewModel.coordinatesConverter.modelPositionIsVisible(n.getStartPosition())||this._context.viewModel.coordinatesConverter.modelPositionIsVisible(n.getEndPosition()))&&(this._viewRange=this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(n,(i=this._affinity)!==null&&i!==void 0?i:void 0))}}_getMaxWidth(){return this.allowEditorOverflow?window.innerWidth||document.documentElement.offsetWidth||document.body.offsetWidth:this._contentWidth}setPosition(e,t,i){this._setPosition(e,i),this._preference=t,this._viewRange&&this._preference&&this._preference.length>0?this.domNode.setDisplay(\"block\"):this.domNode.setDisplay(\"none\"),this._cachedDomNodeOffsetWidth=-1,this._cachedDomNodeOffsetHeight=-1}_layoutBoxInViewport(e,t,i,n,s){const r=e.top,a=r,l=t.top+this._lineHeight,c=s.viewportHeight-l,d=r-n,h=a>=n,u=l,g=c>=n;let f=e.left,_=t.left;return f+i>s.scrollLeft+s.viewportWidth&&(f=s.scrollLeft+s.viewportWidth-i),_+i>s.scrollLeft+s.viewportWidth&&(_=s.scrollLeft+s.viewportWidth-i),f<s.scrollLeft&&(f=s.scrollLeft),_<s.scrollLeft&&(_=s.scrollLeft),{fitsAbove:h,aboveTop:d,aboveLeft:f,fitsBelow:g,belowTop:u,belowLeft:_}}_layoutHorizontalSegmentInPage(e,t,i,n){const s=Math.max(0,t.left-n),r=Math.min(t.left+t.width+n,e.width);let a=t.left+i-qa.scrollX;if(a+n>r){const l=a-(r-n);a-=l,i-=l}if(a<s){const l=a-s;a-=l,i-=l}return[i,a]}_layoutBoxInPage(e,t,i,n,s){const r=e.top-n,a=t.top+this._lineHeight,l=Qi(this._viewDomNode.domNode),c=l.top+r-qa.scrollY,d=l.top+a-qa.scrollY,h=yC(document.body),[u,g]=this._layoutHorizontalSegmentInPage(h,l,e.left-s.scrollLeft+this._contentLeft,i),[f,_]=this._layoutHorizontalSegmentInPage(h,l,t.left-s.scrollLeft+this._contentLeft,i),b=22,v=22,C=c>=b,w=d+n<=h.height-v;return this._fixedOverflowWidgets?{fitsAbove:C,aboveTop:Math.max(c,b),aboveLeft:g,fitsBelow:w,belowTop:d,belowLeft:_}:{fitsAbove:C,aboveTop:r,aboveLeft:u,fitsBelow:w,belowTop:a,belowLeft:f}}_prepareRenderWidgetAtExactPositionOverflowing(e){return new gf(e.top,e.left+this._contentLeft)}_getTopAndBottomLeft(e){if(!this._viewRange)return[null,null];const t=e.linesVisibleRangesForRange(this._viewRange,!1);if(!t||t.length===0)return[null,null];let i=t[0],n=t[0];for(const h of t)h.lineNumber<i.lineNumber&&(i=h),h.lineNumber>n.lineNumber&&(n=h);let s=1073741824;for(const h of i.ranges)h.left<s&&(s=h.left);let r=1073741824;for(const h of n.ranges)h.left<r&&(r=h.left);const a=e.getVerticalOffsetForLineNumber(i.lineNumber)-e.scrollTop,l=new gf(a,s),c=e.getVerticalOffsetForLineNumber(n.lineNumber)-e.scrollTop,d=new gf(c,r);return[l,d]}_prepareRenderWidget(e){if(!this._preference||this._preference.length===0)return null;const[t,i]=this._getTopAndBottomLeft(e);if(!t||!i)return null;if(this._cachedDomNodeOffsetWidth===-1||this._cachedDomNodeOffsetHeight===-1){let s=null;if(typeof this._actual.beforeRender==\"function\"&&(s=Fw(this._actual.beforeRender,this._actual)),s)this._cachedDomNodeOffsetWidth=s.width,this._cachedDomNodeOffsetHeight=s.height;else{const a=this.domNode.domNode.getBoundingClientRect();this._cachedDomNodeOffsetWidth=Math.round(a.width),this._cachedDomNodeOffsetHeight=Math.round(a.height)}}let n;this.allowEditorOverflow?n=this._layoutBoxInPage(t,i,this._cachedDomNodeOffsetWidth,this._cachedDomNodeOffsetHeight,e):n=this._layoutBoxInViewport(t,i,this._cachedDomNodeOffsetWidth,this._cachedDomNodeOffsetHeight,e);for(let s=1;s<=2;s++)for(const r of this._preference)if(r===1){if(!n)return null;if(s===2||n.fitsAbove)return{coordinate:new gf(n.aboveTop,n.aboveLeft),position:1}}else if(r===2){if(!n)return null;if(s===2||n.fitsBelow)return{coordinate:new gf(n.belowTop,n.belowLeft),position:2}}else return this.allowEditorOverflow?{coordinate:this._prepareRenderWidgetAtExactPositionOverflowing(t),position:0}:{coordinate:t,position:0};return null}onBeforeRender(e){!this._viewRange||!this._preference||this._viewRange.endLineNumber<e.startLineNumber||this._viewRange.startLineNumber>e.endLineNumber||this.domNode.setMaxWidth(this._maxWidth)}prepareRender(e){this._renderData=this._prepareRenderWidget(e)}render(e){if(!this._renderData){this._isVisible&&(this.domNode.removeAttribute(\"monaco-visible-content-widget\"),this._isVisible=!1,this.domNode.setVisibility(\"hidden\")),typeof this._actual.afterRender==\"function\"&&Fw(this._actual.afterRender,this._actual,null);return}this.allowEditorOverflow?(this.domNode.setTop(this._renderData.coordinate.top),this.domNode.setLeft(this._renderData.coordinate.left)):(this.domNode.setTop(this._renderData.coordinate.top+e.scrollTop-e.bigNumbersDelta),this.domNode.setLeft(this._renderData.coordinate.left)),this._isVisible||(this.domNode.setVisibility(\"inherit\"),this.domNode.setAttribute(\"monaco-visible-content-widget\",\"true\"),this._isVisible=!0),typeof this._actual.afterRender==\"function\"&&Fw(this._actual.afterRender,this._actual,this._renderData.position)}}function Fw(o,e,...t){try{return o.call(e,...t)}catch(i){return null}}class y4 extends zg{constructor(e){super(),this._context=e;const t=this._context.configuration.options,i=t.get(133);this._lineHeight=t.get(61),this._renderLineHighlight=t.get(87),this._renderLineHighlightOnlyWhenFocus=t.get(88),this._contentLeft=i.contentLeft,this._contentWidth=i.contentWidth,this._selectionIsEmpty=!0,this._focused=!1,this._cursorLineNumbers=[1],this._selections=[new oe(1,1,1,1)],this._renderData=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),super.dispose()}_readFromSelections(){let e=!1;const t=this._selections.map(n=>n.positionLineNumber);t.sort((n,s)=>n-s),ys(this._cursorLineNumbers,t)||(this._cursorLineNumbers=t,e=!0);const i=this._selections.every(n=>n.isEmpty());return this._selectionIsEmpty!==i&&(this._selectionIsEmpty=i,e=!0),e}onThemeChanged(e){return this._readFromSelections()}onConfigurationChanged(e){const t=this._context.configuration.options,i=t.get(133);return this._lineHeight=t.get(61),this._renderLineHighlight=t.get(87),this._renderLineHighlightOnlyWhenFocus=t.get(88),this._contentLeft=i.contentLeft,this._contentWidth=i.contentWidth,!0}onCursorStateChanged(e){return this._selections=e.selections,this._readFromSelections()}onFlushed(e){return!0}onLinesDeleted(e){return!0}onLinesInserted(e){return!0}onScrollChanged(e){return e.scrollWidthChanged||e.scrollTopChanged}onZonesChanged(e){return!0}onFocusChanged(e){return this._renderLineHighlightOnlyWhenFocus?(this._focused=e.isFocused,!0):!1}prepareRender(e){if(!this._shouldRenderThis()){this._renderData=null;return}const t=this._renderOne(e),i=e.visibleRange.startLineNumber,n=e.visibleRange.endLineNumber,s=this._cursorLineNumbers.length;let r=0;const a=[];for(let l=i;l<=n;l++){const c=l-i;for(;r<s&&this._cursorLineNumbers[r]<l;)r++;r<s&&this._cursorLineNumbers[r]===l?a[c]=t:a[c]=\"\"}this._renderData=a}render(e,t){if(!this._renderData)return\"\";const i=t-e;return i>=this._renderData.length?\"\":this._renderData[i]}_shouldRenderInMargin(){return(this._renderLineHighlight===\"gutter\"||this._renderLineHighlight===\"all\")&&(!this._renderLineHighlightOnlyWhenFocus||this._focused)}_shouldRenderInContent(){return(this._renderLineHighlight===\"line\"||this._renderLineHighlight===\"all\")&&this._selectionIsEmpty&&(!this._renderLineHighlightOnlyWhenFocus||this._focused)}}class C$ extends y4{_renderOne(e){return`<div class=\"${\"current-line\"+(this._shouldRenderOther()?\" current-line-both\":\"\")}\" style=\"width:${Math.max(e.scrollWidth,this._contentWidth)}px; height:${this._lineHeight}px;\"></div>`}_shouldRenderThis(){return this._shouldRenderInContent()}_shouldRenderOther(){return this._shouldRenderInMargin()}}class w$ extends y4{_renderOne(e){return`<div class=\"${\"current-line\"+(this._shouldRenderInMargin()?\" current-line-margin\":\"\")+(this._shouldRenderOther()?\" current-line-margin-both\":\"\")}\" style=\"width:${this._contentLeft}px; height:${this._lineHeight}px;\"></div>`}_shouldRenderThis(){return!0}_shouldRenderOther(){return this._shouldRenderInContent()}}Rt((o,e)=>{const t=o.getColor(d4);if(t&&(e.addRule(`.monaco-editor .view-overlays .current-line { background-color: ${t}; }`),e.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { background-color: ${t}; border: none; }`)),!t||t.isTransparent()||o.defines(t2)){const i=o.getColor(t2);i&&(e.addRule(`.monaco-editor .view-overlays .current-line { border: 2px solid ${i}; }`),e.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { border: 2px solid ${i}; }`),yn(o.type)&&(e.addRule(\".monaco-editor .view-overlays .current-line { border-width: 1px; }\"),e.addRule(\".monaco-editor .margin-view-overlays .current-line-margin { border-width: 1px; }\")))}});class S$ extends zg{constructor(e){super(),this._context=e;const t=this._context.configuration.options;this._lineHeight=t.get(61),this._typicalHalfwidthCharacterWidth=t.get(46).typicalHalfwidthCharacterWidth,this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(e){const t=this._context.configuration.options;return this._lineHeight=t.get(61),this._typicalHalfwidthCharacterWidth=t.get(46).typicalHalfwidthCharacterWidth,!0}onDecorationsChanged(e){return!0}onFlushed(e){return!0}onLinesChanged(e){return!0}onLinesDeleted(e){return!0}onLinesInserted(e){return!0}onScrollChanged(e){return e.scrollTopChanged||e.scrollWidthChanged}onZonesChanged(e){return!0}prepareRender(e){const t=e.getDecorationsInViewport();let i=[],n=0;for(let l=0,c=t.length;l<c;l++){const d=t[l];d.options.className&&(i[n++]=d)}i=i.sort((l,c)=>{if(l.options.zIndex<c.options.zIndex)return-1;if(l.options.zIndex>c.options.zIndex)return 1;const d=l.options.className,h=c.options.className;return d<h?-1:d>h?1:L.compareRangesUsingStarts(l.range,c.range)});const s=e.visibleRange.startLineNumber,r=e.visibleRange.endLineNumber,a=[];for(let l=s;l<=r;l++){const c=l-s;a[c]=\"\"}this._renderWholeLineDecorations(e,i,a),this._renderNormalDecorations(e,i,a),this._renderResult=a}_renderWholeLineDecorations(e,t,i){const n=String(this._lineHeight),s=e.visibleRange.startLineNumber,r=e.visibleRange.endLineNumber;for(let a=0,l=t.length;a<l;a++){const c=t[a];if(!c.options.isWholeLine)continue;const d='<div class=\"cdr '+c.options.className+'\" style=\"left:0;width:100%;height:'+n+'px;\"></div>',h=Math.max(c.range.startLineNumber,s),u=Math.min(c.range.endLineNumber,r);for(let g=h;g<=u;g++){const f=g-s;i[f]+=d}}}_renderNormalDecorations(e,t,i){const n=String(this._lineHeight),s=e.visibleRange.startLineNumber;let r=null,a=!1,l=null;for(let c=0,d=t.length;c<d;c++){const h=t[c];if(h.options.isWholeLine)continue;const u=h.options.className,g=Boolean(h.options.showIfCollapsed);let f=h.range;if(g&&f.endColumn===1&&f.endLineNumber!==f.startLineNumber&&(f=new L(f.startLineNumber,f.startColumn,f.endLineNumber-1,this._context.viewModel.getLineMaxColumn(f.endLineNumber-1))),r===u&&a===g&&L.areIntersectingOrTouching(l,f)){l=L.plusRange(l,f);continue}r!==null&&this._renderNormalDecoration(e,l,r,a,n,s,i),r=u,a=g,l=f}r!==null&&this._renderNormalDecoration(e,l,r,a,n,s,i)}_renderNormalDecoration(e,t,i,n,s,r,a){const l=e.linesVisibleRangesForRange(t,i===\"findMatch\");if(!!l)for(let c=0,d=l.length;c<d;c++){const h=l[c];if(h.outsideRenderedLine)continue;const u=h.lineNumber-r;if(n&&h.ranges.length===1){const g=h.ranges[0];if(g.width<this._typicalHalfwidthCharacterWidth){const f=Math.round(g.left+g.width/2),_=Math.max(0,Math.round(f-this._typicalHalfwidthCharacterWidth/2));h.ranges[0]=new JC(_,this._typicalHalfwidthCharacterWidth)}}for(let g=0,f=h.ranges.length;g<f;g++){const _=h.ranges[g],b='<div class=\"cdr '+i+'\" style=\"left:'+String(_.left)+\"px;width:\"+String(_.width)+\"px;height:\"+s+'px;\"></div>';a[u]+=b}}}render(e,t){if(!this._renderResult)return\"\";const i=t-e;return i<0||i>=this._renderResult.length?\"\":this._renderResult[i]}}class tr extends z{onclick(e,t){this._register(q(e,le.CLICK,i=>t(new Ir(i))))}onmousedown(e,t){this._register(q(e,le.MOUSE_DOWN,i=>t(new Ir(i))))}onmouseover(e,t){this._register(q(e,le.MOUSE_OVER,i=>t(new Ir(i))))}onmouseleave(e,t){this._register(q(e,le.MOUSE_LEAVE,i=>t(new Ir(i))))}onkeydown(e,t){this._register(q(e,le.KEY_DOWN,i=>t(new Mt(i))))}onkeyup(e,t){this._register(q(e,le.KEY_UP,i=>t(new Mt(i))))}oninput(e,t){this._register(q(e,le.INPUT,t))}onblur(e,t){this._register(q(e,le.BLUR,t))}onfocus(e,t){this._register(q(e,le.FOCUS,t))}ignoreGesture(e){ut.ignoreTarget(e)}}const hg=11;class y$ extends tr{constructor(e){super(),this._onActivate=e.onActivate,this.bgDomNode=document.createElement(\"div\"),this.bgDomNode.className=\"arrow-background\",this.bgDomNode.style.position=\"absolute\",this.bgDomNode.style.width=e.bgWidth+\"px\",this.bgDomNode.style.height=e.bgHeight+\"px\",typeof e.top!=\"undefined\"&&(this.bgDomNode.style.top=\"0px\"),typeof e.left!=\"undefined\"&&(this.bgDomNode.style.left=\"0px\"),typeof e.bottom!=\"undefined\"&&(this.bgDomNode.style.bottom=\"0px\"),typeof e.right!=\"undefined\"&&(this.bgDomNode.style.right=\"0px\"),this.domNode=document.createElement(\"div\"),this.domNode.className=e.className,this.domNode.classList.add(...e.icon.classNamesArray),this.domNode.style.position=\"absolute\",this.domNode.style.width=hg+\"px\",this.domNode.style.height=hg+\"px\",typeof e.top!=\"undefined\"&&(this.domNode.style.top=e.top+\"px\"),typeof e.left!=\"undefined\"&&(this.domNode.style.left=e.left+\"px\"),typeof e.bottom!=\"undefined\"&&(this.domNode.style.bottom=e.bottom+\"px\"),typeof e.right!=\"undefined\"&&(this.domNode.style.right=e.right+\"px\"),this._pointerMoveMonitor=this._register(new Vg),this._register(Ei(this.bgDomNode,le.POINTER_DOWN,t=>this._arrowPointerDown(t))),this._register(Ei(this.domNode,le.POINTER_DOWN,t=>this._arrowPointerDown(t))),this._pointerdownRepeatTimer=this._register(new qm),this._pointerdownScheduleRepeatTimer=this._register(new Is)}_arrowPointerDown(e){if(!e.target||!(e.target instanceof Element))return;const t=()=>{this._pointerdownRepeatTimer.cancelAndSet(()=>this._onActivate(),1e3/24)};this._onActivate(),this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancelAndSet(t,200),this._pointerMoveMonitor.startMonitoring(e.target,e.pointerId,e.buttons,i=>{},()=>{this._pointerdownRepeatTimer.cancel(),this._pointerdownScheduleRepeatTimer.cancel()}),e.preventDefault()}}class L$ extends z{constructor(e,t,i){super(),this._visibility=e,this._visibleClassName=t,this._invisibleClassName=i,this._domNode=null,this._isVisible=!1,this._isNeeded=!1,this._rawShouldBeVisible=!1,this._shouldBeVisible=!1,this._revealTimer=this._register(new Is)}setVisibility(e){this._visibility!==e&&(this._visibility=e,this._updateShouldBeVisible())}setShouldBeVisible(e){this._rawShouldBeVisible=e,this._updateShouldBeVisible()}_applyVisibilitySetting(){return this._visibility===2?!1:this._visibility===3?!0:this._rawShouldBeVisible}_updateShouldBeVisible(){const e=this._applyVisibilitySetting();this._shouldBeVisible!==e&&(this._shouldBeVisible=e,this.ensureVisibility())}setIsNeeded(e){this._isNeeded!==e&&(this._isNeeded=e,this.ensureVisibility())}setDomNode(e){this._domNode=e,this._domNode.setClassName(this._invisibleClassName),this.setShouldBeVisible(!1)}ensureVisibility(){if(!this._isNeeded){this._hide(!1);return}this._shouldBeVisible?this._reveal():this._hide(!0)}_reveal(){this._isVisible||(this._isVisible=!0,this._revealTimer.setIfNotSet(()=>{var e;(e=this._domNode)===null||e===void 0||e.setClassName(this._visibleClassName)},0))}_hide(e){var t;this._revealTimer.cancel(),this._isVisible&&(this._isVisible=!1,(t=this._domNode)===null||t===void 0||t.setClassName(this._invisibleClassName+(e?\" fade\":\"\")))}}const D$=140;class L4 extends tr{constructor(e){super(),this._lazyRender=e.lazyRender,this._host=e.host,this._scrollable=e.scrollable,this._scrollByPage=e.scrollByPage,this._scrollbarState=e.scrollbarState,this._visibilityController=this._register(new L$(e.visibility,\"visible scrollbar \"+e.extraScrollbarClassName,\"invisible scrollbar \"+e.extraScrollbarClassName)),this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._pointerMoveMonitor=this._register(new Vg),this._shouldRender=!0,this.domNode=Je(document.createElement(\"div\")),this.domNode.setAttribute(\"role\",\"presentation\"),this.domNode.setAttribute(\"aria-hidden\",\"true\"),this._visibilityController.setDomNode(this.domNode),this.domNode.setPosition(\"absolute\"),this._register(q(this.domNode.domNode,le.POINTER_DOWN,t=>this._domNodePointerDown(t)))}_createArrow(e){const t=this._register(new y$(e));this.domNode.domNode.appendChild(t.bgDomNode),this.domNode.domNode.appendChild(t.domNode)}_createSlider(e,t,i,n){this.slider=Je(document.createElement(\"div\")),this.slider.setClassName(\"slider\"),this.slider.setPosition(\"absolute\"),this.slider.setTop(e),this.slider.setLeft(t),typeof i==\"number\"&&this.slider.setWidth(i),typeof n==\"number\"&&this.slider.setHeight(n),this.slider.setLayerHinting(!0),this.slider.setContain(\"strict\"),this.domNode.domNode.appendChild(this.slider.domNode),this._register(q(this.slider.domNode,le.POINTER_DOWN,s=>{s.button===0&&(s.preventDefault(),this._sliderPointerDown(s))})),this.onclick(this.slider.domNode,s=>{s.leftButton&&s.stopPropagation()})}_onElementSize(e){return this._scrollbarState.setVisibleSize(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_onElementScrollSize(e){return this._scrollbarState.setScrollSize(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}_onElementScrollPosition(e){return this._scrollbarState.setScrollPosition(e)&&(this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()),this._shouldRender=!0,this._lazyRender||this.render()),this._shouldRender}beginReveal(){this._visibilityController.setShouldBeVisible(!0)}beginHide(){this._visibilityController.setShouldBeVisible(!1)}render(){!this._shouldRender||(this._shouldRender=!1,this._renderDomNode(this._scrollbarState.getRectangleLargeSize(),this._scrollbarState.getRectangleSmallSize()),this._updateSlider(this._scrollbarState.getSliderSize(),this._scrollbarState.getArrowSize()+this._scrollbarState.getSliderPosition()))}_domNodePointerDown(e){e.target===this.domNode.domNode&&this._onPointerDown(e)}delegatePointerDown(e){const t=this.domNode.domNode.getClientRects()[0].top,i=t+this._scrollbarState.getSliderPosition(),n=t+this._scrollbarState.getSliderPosition()+this._scrollbarState.getSliderSize(),s=this._sliderPointerPosition(e);i<=s&&s<=n?e.button===0&&(e.preventDefault(),this._sliderPointerDown(e)):this._onPointerDown(e)}_onPointerDown(e){let t,i;if(e.target===this.domNode.domNode&&typeof e.offsetX==\"number\"&&typeof e.offsetY==\"number\")t=e.offsetX,i=e.offsetY;else{const s=Qi(this.domNode.domNode);t=e.pageX-s.left,i=e.pageY-s.top}const n=this._pointerDownRelativePosition(t,i);this._setDesiredScrollPositionNow(this._scrollByPage?this._scrollbarState.getDesiredScrollPositionFromOffsetPaged(n):this._scrollbarState.getDesiredScrollPositionFromOffset(n)),e.button===0&&(e.preventDefault(),this._sliderPointerDown(e))}_sliderPointerDown(e){if(!e.target||!(e.target instanceof Element))return;const t=this._sliderPointerPosition(e),i=this._sliderOrthogonalPointerPosition(e),n=this._scrollbarState.clone();this.slider.toggleClassName(\"active\",!0),this._pointerMoveMonitor.startMonitoring(e.target,e.pointerId,e.buttons,s=>{const r=this._sliderOrthogonalPointerPosition(s),a=Math.abs(r-i);if(nn&&a>D$){this._setDesiredScrollPositionNow(n.getScrollPosition());return}const c=this._sliderPointerPosition(s)-t;this._setDesiredScrollPositionNow(n.getDesiredScrollPositionFromDelta(c))},()=>{this.slider.toggleClassName(\"active\",!1),this._host.onDragEnd()}),this._host.onDragStart()}_setDesiredScrollPositionNow(e){const t={};this.writeScrollPosition(t,e),this._scrollable.setScrollPositionNow(t)}updateScrollbarSize(e){this._updateScrollbarSize(e),this._scrollbarState.setScrollbarSize(e),this._shouldRender=!0,this._lazyRender||this.render()}isNeeded(){return this._scrollbarState.isNeeded()}}const k$=20;class Up{constructor(e,t,i,n,s,r){this._scrollbarSize=Math.round(t),this._oppositeScrollbarSize=Math.round(i),this._arrowSize=Math.round(e),this._visibleSize=n,this._scrollSize=s,this._scrollPosition=r,this._computedAvailableSize=0,this._computedIsNeeded=!1,this._computedSliderSize=0,this._computedSliderRatio=0,this._computedSliderPosition=0,this._refreshComputedValues()}clone(){return new Up(this._arrowSize,this._scrollbarSize,this._oppositeScrollbarSize,this._visibleSize,this._scrollSize,this._scrollPosition)}setVisibleSize(e){const t=Math.round(e);return this._visibleSize!==t?(this._visibleSize=t,this._refreshComputedValues(),!0):!1}setScrollSize(e){const t=Math.round(e);return this._scrollSize!==t?(this._scrollSize=t,this._refreshComputedValues(),!0):!1}setScrollPosition(e){const t=Math.round(e);return this._scrollPosition!==t?(this._scrollPosition=t,this._refreshComputedValues(),!0):!1}setScrollbarSize(e){this._scrollbarSize=Math.round(e)}setOppositeScrollbarSize(e){this._oppositeScrollbarSize=Math.round(e)}static _computeValues(e,t,i,n,s){const r=Math.max(0,i-e),a=Math.max(0,r-2*t),l=n>0&&n>i;if(!l)return{computedAvailableSize:Math.round(r),computedIsNeeded:l,computedSliderSize:Math.round(a),computedSliderRatio:0,computedSliderPosition:0};const c=Math.round(Math.max(k$,Math.floor(i*a/n))),d=(a-c)/(n-i),h=s*d;return{computedAvailableSize:Math.round(r),computedIsNeeded:l,computedSliderSize:Math.round(c),computedSliderRatio:d,computedSliderPosition:Math.round(h)}}_refreshComputedValues(){const e=Up._computeValues(this._oppositeScrollbarSize,this._arrowSize,this._visibleSize,this._scrollSize,this._scrollPosition);this._computedAvailableSize=e.computedAvailableSize,this._computedIsNeeded=e.computedIsNeeded,this._computedSliderSize=e.computedSliderSize,this._computedSliderRatio=e.computedSliderRatio,this._computedSliderPosition=e.computedSliderPosition}getArrowSize(){return this._arrowSize}getScrollPosition(){return this._scrollPosition}getRectangleLargeSize(){return this._computedAvailableSize}getRectangleSmallSize(){return this._scrollbarSize}isNeeded(){return this._computedIsNeeded}getSliderSize(){return this._computedSliderSize}getSliderPosition(){return this._computedSliderPosition}getDesiredScrollPositionFromOffset(e){if(!this._computedIsNeeded)return 0;const t=e-this._arrowSize-this._computedSliderSize/2;return Math.round(t/this._computedSliderRatio)}getDesiredScrollPositionFromOffsetPaged(e){if(!this._computedIsNeeded)return 0;const t=e-this._arrowSize;let i=this._scrollPosition;return t<this._computedSliderPosition?i-=this._visibleSize:i+=this._visibleSize,i}getDesiredScrollPositionFromDelta(e){if(!this._computedIsNeeded)return 0;const t=this._computedSliderPosition+e;return Math.round(t/this._computedSliderRatio)}}class x$ extends L4{constructor(e,t,i){const n=e.getScrollDimensions(),s=e.getCurrentScrollPosition();if(super({lazyRender:t.lazyRender,host:i,scrollbarState:new Up(t.horizontalHasArrows?t.arrowSize:0,t.horizontal===2?0:t.horizontalScrollbarSize,t.vertical===2?0:t.verticalScrollbarSize,n.width,n.scrollWidth,s.scrollLeft),visibility:t.horizontal,extraScrollbarClassName:\"horizontal\",scrollable:e,scrollByPage:t.scrollByPage}),t.horizontalHasArrows){const r=(t.arrowSize-hg)/2,a=(t.horizontalScrollbarSize-hg)/2;this._createArrow({className:\"scra\",icon:m.scrollbarButtonLeft,top:a,left:r,bottom:void 0,right:void 0,bgWidth:t.arrowSize,bgHeight:t.horizontalScrollbarSize,onActivate:()=>this._host.onMouseWheel(new Qu(null,1,0))}),this._createArrow({className:\"scra\",icon:m.scrollbarButtonRight,top:a,left:void 0,bottom:void 0,right:r,bgWidth:t.arrowSize,bgHeight:t.horizontalScrollbarSize,onActivate:()=>this._host.onMouseWheel(new Qu(null,-1,0))})}this._createSlider(Math.floor((t.horizontalScrollbarSize-t.horizontalSliderSize)/2),0,void 0,t.horizontalSliderSize)}_updateSlider(e,t){this.slider.setWidth(e),this.slider.setLeft(t)}_renderDomNode(e,t){this.domNode.setWidth(e),this.domNode.setHeight(t),this.domNode.setLeft(0),this.domNode.setBottom(0)}onDidScroll(e){return this._shouldRender=this._onElementScrollSize(e.scrollWidth)||this._shouldRender,this._shouldRender=this._onElementScrollPosition(e.scrollLeft)||this._shouldRender,this._shouldRender=this._onElementSize(e.width)||this._shouldRender,this._shouldRender}_pointerDownRelativePosition(e,t){return e}_sliderPointerPosition(e){return e.pageX}_sliderOrthogonalPointerPosition(e){return e.pageY}_updateScrollbarSize(e){this.slider.setHeight(e)}writeScrollPosition(e,t){e.scrollLeft=t}updateOptions(e){this.updateScrollbarSize(e.horizontal===2?0:e.horizontalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(e.vertical===2?0:e.verticalScrollbarSize),this._visibilityController.setVisibility(e.horizontal),this._scrollByPage=e.scrollByPage}}class I$ extends L4{constructor(e,t,i){const n=e.getScrollDimensions(),s=e.getCurrentScrollPosition();if(super({lazyRender:t.lazyRender,host:i,scrollbarState:new Up(t.verticalHasArrows?t.arrowSize:0,t.vertical===2?0:t.verticalScrollbarSize,0,n.height,n.scrollHeight,s.scrollTop),visibility:t.vertical,extraScrollbarClassName:\"vertical\",scrollable:e,scrollByPage:t.scrollByPage}),t.verticalHasArrows){const r=(t.arrowSize-hg)/2,a=(t.verticalScrollbarSize-hg)/2;this._createArrow({className:\"scra\",icon:m.scrollbarButtonUp,top:r,left:a,bottom:void 0,right:void 0,bgWidth:t.verticalScrollbarSize,bgHeight:t.arrowSize,onActivate:()=>this._host.onMouseWheel(new Qu(null,0,1))}),this._createArrow({className:\"scra\",icon:m.scrollbarButtonDown,top:void 0,left:a,bottom:r,right:void 0,bgWidth:t.verticalScrollbarSize,bgHeight:t.arrowSize,onActivate:()=>this._host.onMouseWheel(new Qu(null,0,-1))})}this._createSlider(0,Math.floor((t.verticalScrollbarSize-t.verticalSliderSize)/2),t.verticalSliderSize,void 0)}_updateSlider(e,t){this.slider.setHeight(e),this.slider.setTop(t)}_renderDomNode(e,t){this.domNode.setWidth(t),this.domNode.setHeight(e),this.domNode.setRight(0),this.domNode.setTop(0)}onDidScroll(e){return this._shouldRender=this._onElementScrollSize(e.scrollHeight)||this._shouldRender,this._shouldRender=this._onElementScrollPosition(e.scrollTop)||this._shouldRender,this._shouldRender=this._onElementSize(e.height)||this._shouldRender,this._shouldRender}_pointerDownRelativePosition(e,t){return t}_sliderPointerPosition(e){return e.pageY}_sliderOrthogonalPointerPosition(e){return e.pageX}_updateScrollbarSize(e){this.slider.setWidth(e)}writeScrollPosition(e,t){e.scrollTop=t}updateOptions(e){this.updateScrollbarSize(e.vertical===2?0:e.verticalScrollbarSize),this._scrollbarState.setOppositeScrollbarSize(0),this._visibilityController.setVisibility(e.vertical),this._scrollByPage=e.scrollByPage}}class nv{constructor(e,t,i,n,s,r,a){this._forceIntegerValues=e,this._scrollStateBrand=void 0,this._forceIntegerValues&&(t=t|0,i=i|0,n=n|0,s=s|0,r=r|0,a=a|0),this.rawScrollLeft=n,this.rawScrollTop=a,t<0&&(t=0),n+t>i&&(n=i-t),n<0&&(n=0),s<0&&(s=0),a+s>r&&(a=r-s),a<0&&(a=0),this.width=t,this.scrollWidth=i,this.scrollLeft=n,this.height=s,this.scrollHeight=r,this.scrollTop=a}equals(e){return this.rawScrollLeft===e.rawScrollLeft&&this.rawScrollTop===e.rawScrollTop&&this.width===e.width&&this.scrollWidth===e.scrollWidth&&this.scrollLeft===e.scrollLeft&&this.height===e.height&&this.scrollHeight===e.scrollHeight&&this.scrollTop===e.scrollTop}withScrollDimensions(e,t){return new nv(this._forceIntegerValues,typeof e.width!=\"undefined\"?e.width:this.width,typeof e.scrollWidth!=\"undefined\"?e.scrollWidth:this.scrollWidth,t?this.rawScrollLeft:this.scrollLeft,typeof e.height!=\"undefined\"?e.height:this.height,typeof e.scrollHeight!=\"undefined\"?e.scrollHeight:this.scrollHeight,t?this.rawScrollTop:this.scrollTop)}withScrollPosition(e){return new nv(this._forceIntegerValues,this.width,this.scrollWidth,typeof e.scrollLeft!=\"undefined\"?e.scrollLeft:this.rawScrollLeft,this.height,this.scrollHeight,typeof e.scrollTop!=\"undefined\"?e.scrollTop:this.rawScrollTop)}createScrollEvent(e,t){const i=this.width!==e.width,n=this.scrollWidth!==e.scrollWidth,s=this.scrollLeft!==e.scrollLeft,r=this.height!==e.height,a=this.scrollHeight!==e.scrollHeight,l=this.scrollTop!==e.scrollTop;return{inSmoothScrolling:t,oldWidth:e.width,oldScrollWidth:e.scrollWidth,oldScrollLeft:e.scrollLeft,width:this.width,scrollWidth:this.scrollWidth,scrollLeft:this.scrollLeft,oldHeight:e.height,oldScrollHeight:e.scrollHeight,oldScrollTop:e.scrollTop,height:this.height,scrollHeight:this.scrollHeight,scrollTop:this.scrollTop,widthChanged:i,scrollWidthChanged:n,scrollLeftChanged:s,heightChanged:r,scrollHeightChanged:a,scrollTopChanged:l}}}class Jm extends z{constructor(e){super(),this._scrollableBrand=void 0,this._onScroll=this._register(new O),this.onScroll=this._onScroll.event,this._smoothScrollDuration=e.smoothScrollDuration,this._scheduleAtNextAnimationFrame=e.scheduleAtNextAnimationFrame,this._state=new nv(e.forceIntegerValues,0,0,0,0,0,0),this._smoothScrolling=null}dispose(){this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),super.dispose()}setSmoothScrollDuration(e){this._smoothScrollDuration=e}validateScrollPosition(e){return this._state.withScrollPosition(e)}getScrollDimensions(){return this._state}setScrollDimensions(e,t){var i;const n=this._state.withScrollDimensions(e,t);this._setState(n,Boolean(this._smoothScrolling)),(i=this._smoothScrolling)===null||i===void 0||i.acceptScrollDimensions(this._state)}getFutureScrollPosition(){return this._smoothScrolling?this._smoothScrolling.to:this._state}getCurrentScrollPosition(){return this._state}setScrollPositionNow(e){const t=this._state.withScrollPosition(e);this._smoothScrolling&&(this._smoothScrolling.dispose(),this._smoothScrolling=null),this._setState(t,!1)}setScrollPositionSmooth(e,t){if(this._smoothScrollDuration===0)return this.setScrollPositionNow(e);if(this._smoothScrolling){e={scrollLeft:typeof e.scrollLeft==\"undefined\"?this._smoothScrolling.to.scrollLeft:e.scrollLeft,scrollTop:typeof e.scrollTop==\"undefined\"?this._smoothScrolling.to.scrollTop:e.scrollTop};const i=this._state.withScrollPosition(e);if(this._smoothScrolling.to.scrollLeft===i.scrollLeft&&this._smoothScrolling.to.scrollTop===i.scrollTop)return;let n;t?n=new $p(this._smoothScrolling.from,i,this._smoothScrolling.startTime,this._smoothScrolling.duration):n=this._smoothScrolling.combine(this._state,i,this._smoothScrollDuration),this._smoothScrolling.dispose(),this._smoothScrolling=n}else{const i=this._state.withScrollPosition(e);this._smoothScrolling=$p.start(this._state,i,this._smoothScrollDuration)}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{!this._smoothScrolling||(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}_performSmoothScrolling(){if(!this._smoothScrolling)return;const e=this._smoothScrolling.tick(),t=this._state.withScrollPosition(e);if(this._setState(t,!0),!!this._smoothScrolling){if(e.isDone){this._smoothScrolling.dispose(),this._smoothScrolling=null;return}this._smoothScrolling.animationFrameDisposable=this._scheduleAtNextAnimationFrame(()=>{!this._smoothScrolling||(this._smoothScrolling.animationFrameDisposable=null,this._performSmoothScrolling())})}}_setState(e,t){const i=this._state;i.equals(e)||(this._state=e,this._onScroll.fire(this._state.createScrollEvent(i,t)))}}class n2{constructor(e,t,i){this.scrollLeft=e,this.scrollTop=t,this.isDone=i}}function Bw(o,e){const t=e-o;return function(i){return o+t*T$(i)}}function E$(o,e,t){return function(i){return i<t?o(i/t):e((i-t)/(1-t))}}class $p{constructor(e,t,i,n){this.from=e,this.to=t,this.duration=n,this.startTime=i,this.animationFrameDisposable=null,this._initAnimations()}_initAnimations(){this.scrollLeft=this._initAnimation(this.from.scrollLeft,this.to.scrollLeft,this.to.width),this.scrollTop=this._initAnimation(this.from.scrollTop,this.to.scrollTop,this.to.height)}_initAnimation(e,t,i){if(Math.abs(e-t)>2.5*i){let s,r;return e<t?(s=e+.75*i,r=t-.75*i):(s=e-.75*i,r=t+.75*i),E$(Bw(e,s),Bw(r,t),.33)}return Bw(e,t)}dispose(){this.animationFrameDisposable!==null&&(this.animationFrameDisposable.dispose(),this.animationFrameDisposable=null)}acceptScrollDimensions(e){this.to=e.withScrollPosition(this.to),this._initAnimations()}tick(){return this._tick(Date.now())}_tick(e){const t=(e-this.startTime)/this.duration;if(t<1){const i=this.scrollLeft(t),n=this.scrollTop(t);return new n2(i,n,!1)}return new n2(this.to.scrollLeft,this.to.scrollTop,!0)}combine(e,t,i){return $p.start(e,t,i)}static start(e,t,i){i=i+10;const n=Date.now()-10;return new $p(e,t,n,i)}}function N$(o){return Math.pow(o,3)}function T$(o){return 1-N$(1-o)}const M$=500,s2=50;class A${constructor(e,t,i){this.timestamp=e,this.deltaX=t,this.deltaY=i,this.score=0}}class Xy{constructor(){this._capacity=5,this._memory=[],this._front=-1,this._rear=-1}isPhysicalMouseWheel(){if(this._front===-1&&this._rear===-1)return!1;let e=1,t=0,i=1,n=this._rear;do{const s=n===this._front?e:Math.pow(2,-i);if(e-=s,t+=this._memory[n].score*s,n===this._front)break;n=(this._capacity+n-1)%this._capacity,i++}while(!0);return t<=.5}accept(e,t,i){const n=new A$(e,t,i);n.score=this._computeScore(n),this._front===-1&&this._rear===-1?(this._memory[0]=n,this._front=0,this._rear=0):(this._rear=(this._rear+1)%this._capacity,this._rear===this._front&&(this._front=(this._front+1)%this._capacity),this._memory[this._rear]=n)}_computeScore(e){if(Math.abs(e.deltaX)>0&&Math.abs(e.deltaY)>0)return 1;let t=.5;return this._front===-1&&this._rear===-1||this._memory[this._rear],(!this._isAlmostInt(e.deltaX)||!this._isAlmostInt(e.deltaY))&&(t+=.25),Math.min(Math.max(t,0),1)}_isAlmostInt(e){return Math.abs(Math.round(e)-e)<.01}}Xy.INSTANCE=new Xy;class kI extends tr{constructor(e,t,i){super(),this._onScroll=this._register(new O),this.onScroll=this._onScroll.event,this._onWillScroll=this._register(new O),e.style.overflow=\"hidden\",this._options=R$(t),this._scrollable=i,this._register(this._scrollable.onScroll(s=>{this._onWillScroll.fire(s),this._onDidScroll(s),this._onScroll.fire(s)}));const n={onMouseWheel:s=>this._onMouseWheel(s),onDragStart:()=>this._onDragStart(),onDragEnd:()=>this._onDragEnd()};this._verticalScrollbar=this._register(new I$(this._scrollable,this._options,n)),this._horizontalScrollbar=this._register(new x$(this._scrollable,this._options,n)),this._domNode=document.createElement(\"div\"),this._domNode.className=\"monaco-scrollable-element \"+this._options.className,this._domNode.setAttribute(\"role\",\"presentation\"),this._domNode.style.position=\"relative\",this._domNode.style.overflow=\"hidden\",this._domNode.appendChild(e),this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode),this._domNode.appendChild(this._verticalScrollbar.domNode.domNode),this._options.useShadows?(this._leftShadowDomNode=Je(document.createElement(\"div\")),this._leftShadowDomNode.setClassName(\"shadow\"),this._domNode.appendChild(this._leftShadowDomNode.domNode),this._topShadowDomNode=Je(document.createElement(\"div\")),this._topShadowDomNode.setClassName(\"shadow\"),this._domNode.appendChild(this._topShadowDomNode.domNode),this._topLeftShadowDomNode=Je(document.createElement(\"div\")),this._topLeftShadowDomNode.setClassName(\"shadow\"),this._domNode.appendChild(this._topLeftShadowDomNode.domNode)):(this._leftShadowDomNode=null,this._topShadowDomNode=null,this._topLeftShadowDomNode=null),this._listenOnDomNode=this._options.listenOnDomNode||this._domNode,this._mouseWheelToDispose=[],this._setListeningToMouseWheel(this._options.handleMouseWheel),this.onmouseover(this._listenOnDomNode,s=>this._onMouseOver(s)),this.onmouseleave(this._listenOnDomNode,s=>this._onMouseLeave(s)),this._hideTimeout=this._register(new Is),this._isDragging=!1,this._mouseIsOver=!1,this._shouldRender=!0,this._revealOnScroll=!0}get options(){return this._options}dispose(){this._mouseWheelToDispose=et(this._mouseWheelToDispose),super.dispose()}getDomNode(){return this._domNode}getOverviewRulerLayoutInfo(){return{parent:this._domNode,insertBefore:this._verticalScrollbar.domNode.domNode}}delegateVerticalScrollbarPointerDown(e){this._verticalScrollbar.delegatePointerDown(e)}getScrollDimensions(){return this._scrollable.getScrollDimensions()}setScrollDimensions(e){this._scrollable.setScrollDimensions(e,!1)}updateClassName(e){this._options.className=e,Ze&&(this._options.className+=\" mac\"),this._domNode.className=\"monaco-scrollable-element \"+this._options.className}updateOptions(e){typeof e.handleMouseWheel!=\"undefined\"&&(this._options.handleMouseWheel=e.handleMouseWheel,this._setListeningToMouseWheel(this._options.handleMouseWheel)),typeof e.mouseWheelScrollSensitivity!=\"undefined\"&&(this._options.mouseWheelScrollSensitivity=e.mouseWheelScrollSensitivity),typeof e.fastScrollSensitivity!=\"undefined\"&&(this._options.fastScrollSensitivity=e.fastScrollSensitivity),typeof e.scrollPredominantAxis!=\"undefined\"&&(this._options.scrollPredominantAxis=e.scrollPredominantAxis),typeof e.horizontal!=\"undefined\"&&(this._options.horizontal=e.horizontal),typeof e.vertical!=\"undefined\"&&(this._options.vertical=e.vertical),typeof e.horizontalScrollbarSize!=\"undefined\"&&(this._options.horizontalScrollbarSize=e.horizontalScrollbarSize),typeof e.verticalScrollbarSize!=\"undefined\"&&(this._options.verticalScrollbarSize=e.verticalScrollbarSize),typeof e.scrollByPage!=\"undefined\"&&(this._options.scrollByPage=e.scrollByPage),this._horizontalScrollbar.updateOptions(this._options),this._verticalScrollbar.updateOptions(this._options),this._options.lazyRender||this._render()}_setListeningToMouseWheel(e){if(this._mouseWheelToDispose.length>0!==e&&(this._mouseWheelToDispose=et(this._mouseWheelToDispose),e)){const i=n=>{this._onMouseWheel(new Qu(n))};this._mouseWheelToDispose.push(q(this._listenOnDomNode,le.MOUSE_WHEEL,i,{passive:!1}))}}_onMouseWheel(e){const t=Xy.INSTANCE;{const s=window.devicePixelRatio/_O();nn||sn?t.accept(Date.now(),e.deltaX/s,e.deltaY/s):t.accept(Date.now(),e.deltaX,e.deltaY)}let i=!1;if(e.deltaY||e.deltaX){let s=e.deltaY*this._options.mouseWheelScrollSensitivity,r=e.deltaX*this._options.mouseWheelScrollSensitivity;this._options.scrollPredominantAxis&&(Math.abs(s)>=Math.abs(r)?r=0:s=0),this._options.flipAxes&&([s,r]=[r,s]);const a=!Ze&&e.browserEvent&&e.browserEvent.shiftKey;(this._options.scrollYToX||a)&&!r&&(r=s,s=0),e.browserEvent&&e.browserEvent.altKey&&(r=r*this._options.fastScrollSensitivity,s=s*this._options.fastScrollSensitivity);const l=this._scrollable.getFutureScrollPosition();let c={};if(s){const d=s2*s,h=l.scrollTop-(d<0?Math.floor(d):Math.ceil(d));this._verticalScrollbar.writeScrollPosition(c,h)}if(r){const d=s2*r,h=l.scrollLeft-(d<0?Math.floor(d):Math.ceil(d));this._horizontalScrollbar.writeScrollPosition(c,h)}c=this._scrollable.validateScrollPosition(c),(l.scrollLeft!==c.scrollLeft||l.scrollTop!==c.scrollTop)&&(this._options.mouseWheelSmoothScroll&&t.isPhysicalMouseWheel()?this._scrollable.setScrollPositionSmooth(c):this._scrollable.setScrollPositionNow(c),i=!0)}let n=i;!n&&this._options.alwaysConsumeMouseWheel&&(n=!0),!n&&this._options.consumeMouseWheelIfScrollbarIsNeeded&&(this._verticalScrollbar.isNeeded()||this._horizontalScrollbar.isNeeded())&&(n=!0),n&&(e.preventDefault(),e.stopPropagation())}_onDidScroll(e){this._shouldRender=this._horizontalScrollbar.onDidScroll(e)||this._shouldRender,this._shouldRender=this._verticalScrollbar.onDidScroll(e)||this._shouldRender,this._options.useShadows&&(this._shouldRender=!0),this._revealOnScroll&&this._reveal(),this._options.lazyRender||this._render()}renderNow(){if(!this._options.lazyRender)throw new Error(\"Please use `lazyRender` together with `renderNow`!\");this._render()}_render(){if(!!this._shouldRender&&(this._shouldRender=!1,this._horizontalScrollbar.render(),this._verticalScrollbar.render(),this._options.useShadows)){const e=this._scrollable.getCurrentScrollPosition(),t=e.scrollTop>0,i=e.scrollLeft>0,n=i?\" left\":\"\",s=t?\" top\":\"\",r=i||t?\" top-left-corner\":\"\";this._leftShadowDomNode.setClassName(`shadow${n}`),this._topShadowDomNode.setClassName(`shadow${s}`),this._topLeftShadowDomNode.setClassName(`shadow${r}${s}${n}`)}}_onDragStart(){this._isDragging=!0,this._reveal()}_onDragEnd(){this._isDragging=!1,this._hide()}_onMouseLeave(e){this._mouseIsOver=!1,this._hide()}_onMouseOver(e){this._mouseIsOver=!0,this._reveal()}_reveal(){this._verticalScrollbar.beginReveal(),this._horizontalScrollbar.beginReveal(),this._scheduleHide()}_hide(){!this._mouseIsOver&&!this._isDragging&&(this._verticalScrollbar.beginHide(),this._horizontalScrollbar.beginHide())}_scheduleHide(){!this._mouseIsOver&&!this._isDragging&&this._hideTimeout.cancelAndSet(()=>this._hide(),M$)}}class D4 extends kI{constructor(e,t){t=t||{},t.mouseWheelSmoothScroll=!1;const i=new Jm({forceIntegerValues:!0,smoothScrollDuration:0,scheduleAtNextAnimationFrame:n=>Go(n)});super(e,t,i),this._register(i)}setScrollPosition(e){this._scrollable.setScrollPositionNow(e)}}class xI extends kI{constructor(e,t,i){super(e,t,i)}setScrollPosition(e){e.reuseAnimation?this._scrollable.setScrollPositionSmooth(e,e.reuseAnimation):this._scrollable.setScrollPositionNow(e)}getScrollPosition(){return this._scrollable.getCurrentScrollPosition()}}class e_ extends kI{constructor(e,t){t=t||{},t.mouseWheelSmoothScroll=!1;const i=new Jm({forceIntegerValues:!1,smoothScrollDuration:0,scheduleAtNextAnimationFrame:n=>Go(n)});super(e,t,i),this._register(i),this._element=e,this.onScroll(n=>{n.scrollTopChanged&&(this._element.scrollTop=n.scrollTop),n.scrollLeftChanged&&(this._element.scrollLeft=n.scrollLeft)}),this.scanDomNode()}setScrollPosition(e){this._scrollable.setScrollPositionNow(e)}getScrollPosition(){return this._scrollable.getCurrentScrollPosition()}scanDomNode(){this.setScrollDimensions({width:this._element.clientWidth,scrollWidth:this._element.scrollWidth,height:this._element.clientHeight,scrollHeight:this._element.scrollHeight}),this.setScrollPosition({scrollLeft:this._element.scrollLeft,scrollTop:this._element.scrollTop})}}function R$(o){const e={lazyRender:typeof o.lazyRender!=\"undefined\"?o.lazyRender:!1,className:typeof o.className!=\"undefined\"?o.className:\"\",useShadows:typeof o.useShadows!=\"undefined\"?o.useShadows:!0,handleMouseWheel:typeof o.handleMouseWheel!=\"undefined\"?o.handleMouseWheel:!0,flipAxes:typeof o.flipAxes!=\"undefined\"?o.flipAxes:!1,consumeMouseWheelIfScrollbarIsNeeded:typeof o.consumeMouseWheelIfScrollbarIsNeeded!=\"undefined\"?o.consumeMouseWheelIfScrollbarIsNeeded:!1,alwaysConsumeMouseWheel:typeof o.alwaysConsumeMouseWheel!=\"undefined\"?o.alwaysConsumeMouseWheel:!1,scrollYToX:typeof o.scrollYToX!=\"undefined\"?o.scrollYToX:!1,mouseWheelScrollSensitivity:typeof o.mouseWheelScrollSensitivity!=\"undefined\"?o.mouseWheelScrollSensitivity:1,fastScrollSensitivity:typeof o.fastScrollSensitivity!=\"undefined\"?o.fastScrollSensitivity:5,scrollPredominantAxis:typeof o.scrollPredominantAxis!=\"undefined\"?o.scrollPredominantAxis:!0,mouseWheelSmoothScroll:typeof o.mouseWheelSmoothScroll!=\"undefined\"?o.mouseWheelSmoothScroll:!0,arrowSize:typeof o.arrowSize!=\"undefined\"?o.arrowSize:11,listenOnDomNode:typeof o.listenOnDomNode!=\"undefined\"?o.listenOnDomNode:null,horizontal:typeof o.horizontal!=\"undefined\"?o.horizontal:1,horizontalScrollbarSize:typeof o.horizontalScrollbarSize!=\"undefined\"?o.horizontalScrollbarSize:10,horizontalSliderSize:typeof o.horizontalSliderSize!=\"undefined\"?o.horizontalSliderSize:0,horizontalHasArrows:typeof o.horizontalHasArrows!=\"undefined\"?o.horizontalHasArrows:!1,vertical:typeof o.vertical!=\"undefined\"?o.vertical:1,verticalScrollbarSize:typeof o.verticalScrollbarSize!=\"undefined\"?o.verticalScrollbarSize:10,verticalHasArrows:typeof o.verticalHasArrows!=\"undefined\"?o.verticalHasArrows:!1,verticalSliderSize:typeof o.verticalSliderSize!=\"undefined\"?o.verticalSliderSize:0,scrollByPage:typeof o.scrollByPage!=\"undefined\"?o.scrollByPage:!1};return e.horizontalSliderSize=typeof o.horizontalSliderSize!=\"undefined\"?o.horizontalSliderSize:e.horizontalScrollbarSize,e.verticalSliderSize=typeof o.verticalSliderSize!=\"undefined\"?o.verticalSliderSize:e.verticalScrollbarSize,Ze&&(e.className+=\" mac\"),e}class O$ extends Es{constructor(e,t,i,n){super(e);const s=this._context.configuration.options,r=s.get(94),a=s.get(69),l=s.get(36),c=s.get(97),d={listenOnDomNode:i.domNode,className:\"editor-scrollable \"+H0(e.theme.type),useShadows:!1,lazyRender:!0,vertical:r.vertical,horizontal:r.horizontal,verticalHasArrows:r.verticalHasArrows,horizontalHasArrows:r.horizontalHasArrows,verticalScrollbarSize:r.verticalScrollbarSize,verticalSliderSize:r.verticalSliderSize,horizontalScrollbarSize:r.horizontalScrollbarSize,horizontalSliderSize:r.horizontalSliderSize,handleMouseWheel:r.handleMouseWheel,alwaysConsumeMouseWheel:r.alwaysConsumeMouseWheel,arrowSize:r.arrowSize,mouseWheelScrollSensitivity:a,fastScrollSensitivity:l,scrollPredominantAxis:c,scrollByPage:r.scrollByPage};this.scrollbar=this._register(new xI(t.domNode,d,this._context.viewLayout.getScrollable())),jr.write(this.scrollbar.getDomNode(),5),this.scrollbarDomNode=Je(this.scrollbar.getDomNode()),this.scrollbarDomNode.setPosition(\"absolute\"),this._setLayout();const h=(u,g,f)=>{const _={};if(g){const b=u.scrollTop;b&&(_.scrollTop=this._context.viewLayout.getCurrentScrollTop()+b,u.scrollTop=0)}if(f){const b=u.scrollLeft;b&&(_.scrollLeft=this._context.viewLayout.getCurrentScrollLeft()+b,u.scrollLeft=0)}this._context.viewModel.viewLayout.setScrollPosition(_,1)};this._register(q(i.domNode,\"scroll\",u=>h(i.domNode,!0,!0))),this._register(q(t.domNode,\"scroll\",u=>h(t.domNode,!0,!1))),this._register(q(n.domNode,\"scroll\",u=>h(n.domNode,!0,!1))),this._register(q(this.scrollbarDomNode.domNode,\"scroll\",u=>h(this.scrollbarDomNode.domNode,!0,!1)))}dispose(){super.dispose()}_setLayout(){const e=this._context.configuration.options,t=e.get(133);this.scrollbarDomNode.setLeft(t.contentLeft),e.get(67).side===\"right\"?this.scrollbarDomNode.setWidth(t.contentWidth+t.minimap.minimapWidth):this.scrollbarDomNode.setWidth(t.contentWidth),this.scrollbarDomNode.setHeight(t.height)}getOverviewRulerLayoutInfo(){return this.scrollbar.getOverviewRulerLayoutInfo()}getDomNode(){return this.scrollbarDomNode}delegateVerticalScrollbarPointerDown(e){this.scrollbar.delegateVerticalScrollbarPointerDown(e)}onConfigurationChanged(e){if(e.hasChanged(94)||e.hasChanged(69)||e.hasChanged(36)){const t=this._context.configuration.options,i=t.get(94),n=t.get(69),s=t.get(36),r=t.get(97),a={vertical:i.vertical,horizontal:i.horizontal,verticalScrollbarSize:i.verticalScrollbarSize,horizontalScrollbarSize:i.horizontalScrollbarSize,scrollByPage:i.scrollByPage,handleMouseWheel:i.handleMouseWheel,mouseWheelScrollSensitivity:n,fastScrollSensitivity:s,scrollPredominantAxis:r};this.scrollbar.updateOptions(a)}return e.hasChanged(133)&&this._setLayout(),!0}onScrollChanged(e){return!0}onThemeChanged(e){return this.scrollbar.updateClassName(\"editor-scrollable \"+H0(this._context.theme.type)),!0}prepareRender(e){}render(e){this.scrollbar.renderNow()}}Rt((o,e)=>{const t=o.getColor(Hg);t&&e.addRule(`\n\t\t\t.monaco-scrollable-element > .shadow.top {\n\t\t\t\tbox-shadow: ${t} 0 6px 6px -6px inset;\n\t\t\t}\n\n\t\t\t.monaco-scrollable-element > .shadow.left {\n\t\t\t\tbox-shadow: ${t} 6px 0 6px -6px inset;\n\t\t\t}\n\n\t\t\t.monaco-scrollable-element > .shadow.top.left {\n\t\t\t\tbox-shadow: ${t} 6px 6px 6px -6px inset;\n\t\t\t}\n\t\t`);const i=o.getColor(rd);i&&e.addRule(`\n\t\t\t.monaco-scrollable-element > .scrollbar > .slider {\n\t\t\t\tbackground: ${i};\n\t\t\t}\n\t\t`);const n=o.getColor(ad);n&&e.addRule(`\n\t\t\t.monaco-scrollable-element > .scrollbar > .slider:hover {\n\t\t\t\tbackground: ${n};\n\t\t\t}\n\t\t`);const s=o.getColor(ld);s&&e.addRule(`\n\t\t\t.monaco-scrollable-element > .scrollbar > .slider.active {\n\t\t\t\tbackground: ${s};\n\t\t\t}\n\t\t`)});class sv{constructor(e,t,i){this._decorationToRenderBrand=void 0,this.startLineNumber=+e,this.endLineNumber=+t,this.className=String(i)}}class II extends zg{_render(e,t,i){const n=[];for(let a=e;a<=t;a++){const l=a-e;n[l]=[]}if(i.length===0)return n;i.sort((a,l)=>a.className===l.className?a.startLineNumber===l.startLineNumber?a.endLineNumber-l.endLineNumber:a.startLineNumber-l.startLineNumber:a.className<l.className?-1:1);let s=null,r=0;for(let a=0,l=i.length;a<l;a++){const c=i[a],d=c.className;let h=Math.max(c.startLineNumber,e)-e;const u=Math.min(c.endLineNumber,t)-e;s===d?(h=Math.max(r+1,h),r=Math.max(r,u)):(s=d,r=u);for(let g=h;g<=r;g++)n[g].push(s)}return n}}class P$ extends II{constructor(e){super(),this._context=e;const t=this._context.configuration.options,i=t.get(133);this._lineHeight=t.get(61),this._glyphMargin=t.get(52),this._glyphMarginLeft=i.glyphMarginLeft,this._glyphMarginWidth=i.glyphMarginWidth,this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(e){const t=this._context.configuration.options,i=t.get(133);return this._lineHeight=t.get(61),this._glyphMargin=t.get(52),this._glyphMarginLeft=i.glyphMarginLeft,this._glyphMarginWidth=i.glyphMarginWidth,!0}onDecorationsChanged(e){return!0}onFlushed(e){return!0}onLinesChanged(e){return!0}onLinesDeleted(e){return!0}onLinesInserted(e){return!0}onScrollChanged(e){return e.scrollTopChanged}onZonesChanged(e){return!0}_getDecorations(e){const t=e.getDecorationsInViewport(),i=[];let n=0;for(let s=0,r=t.length;s<r;s++){const a=t[s],l=a.options.glyphMarginClassName;l&&(i[n++]=new sv(a.range.startLineNumber,a.range.endLineNumber,l))}return i}prepareRender(e){if(!this._glyphMargin){this._renderResult=null;return}const t=e.visibleRange.startLineNumber,i=e.visibleRange.endLineNumber,n=this._render(t,i,this._getDecorations(e)),s=this._lineHeight.toString(),r=this._glyphMarginLeft.toString(),a=this._glyphMarginWidth.toString(),l='\" style=\"left:'+r+\"px;width:\"+a+\"px;height:\"+s+'px;\"></div>',c=[];for(let d=t;d<=i;d++){const h=d-t,u=n[h];u.length===0?c[h]=\"\":c[h]='<div class=\"cgmr codicon '+u.join(\" \")+l}this._renderResult=c}render(e,t){if(!this._renderResult)return\"\";const i=t-e;return i<0||i>=this._renderResult.length?\"\":this._renderResult[i]}}class k4 extends z{constructor(){super(...arguments),this._isDisposed=!1}dispose(){super.dispose(),this._isDisposed=!0}assertNotDisposed(){if(this._isDisposed)throw new Error(\"TextModelPart is disposed!\")}}function s1(o,e){let t=0,i=0;const n=o.length;for(;i<n;){const s=o.charCodeAt(i);if(s===32)t++;else if(s===9)t=t-t%e+e;else break;i++}return i===n?-1:t}var Cd;(function(o){o[o.Disabled=0]=\"Disabled\",o[o.EnabledForActive=1]=\"EnabledForActive\",o[o.Enabled=2]=\"Enabled\"})(Cd||(Cd={}));class hd{constructor(e,t,i,n,s,r){if(this.visibleColumn=e,this.column=t,this.className=i,this.horizontalLine=n,this.forWrappedLinesAfterColumn=s,this.forWrappedLinesBeforeOrAtColumn=r,e!==-1==(t!==-1))throw new Error}}class ep{constructor(e,t){this.top=e,this.endColumn=t}}class F$ extends k4{constructor(e,t){super(),this.textModel=e,this.languageConfigurationService=t}getLanguageConfiguration(e){return this.languageConfigurationService.getLanguageConfiguration(e)}_computeIndentLevel(e){return s1(this.textModel.getLineContent(e+1),this.textModel.getOptions().tabSize)}getActiveIndentGuide(e,t,i){this.assertNotDisposed();const n=this.textModel.getLineCount();if(e<1||e>n)throw new Error(\"Illegal value for lineNumber\");const s=this.getLanguageConfiguration(this.textModel.getLanguageId()).foldingRules,r=Boolean(s&&s.offSide);let a=-2,l=-1,c=-2,d=-1;const h=y=>{if(a!==-1&&(a===-2||a>y-1)){a=-1,l=-1;for(let D=y-2;D>=0;D--){const I=this._computeIndentLevel(D);if(I>=0){a=D,l=I;break}}}if(c===-2){c=-1,d=-1;for(let D=y;D<n;D++){const I=this._computeIndentLevel(D);if(I>=0){c=D,d=I;break}}}};let u=-2,g=-1,f=-2,_=-1;const b=y=>{if(u===-2){u=-1,g=-1;for(let D=y-2;D>=0;D--){const I=this._computeIndentLevel(D);if(I>=0){u=D,g=I;break}}}if(f!==-1&&(f===-2||f<y-1)){f=-1,_=-1;for(let D=y;D<n;D++){const I=this._computeIndentLevel(D);if(I>=0){f=D,_=I;break}}}};let v=0,C=!0,w=0,S=!0,k=0,x=0;for(let y=0;C||S;y++){const D=e-y,I=e+y;y>1&&(D<1||D<t)&&(C=!1),y>1&&(I>n||I>i)&&(S=!1),y>5e4&&(C=!1,S=!1);let R=-1;if(C&&D>=1){const H=this._computeIndentLevel(D-1);H>=0?(c=D-1,d=H,R=Math.ceil(H/this.textModel.getOptions().indentSize)):(h(D),R=this._getIndentLevelForWhitespaceLine(r,l,d))}let P=-1;if(S&&I<=n){const H=this._computeIndentLevel(I-1);H>=0?(u=I-1,g=H,P=Math.ceil(H/this.textModel.getOptions().indentSize)):(b(I),P=this._getIndentLevelForWhitespaceLine(r,g,_))}if(y===0){x=R;continue}if(y===1){if(I<=n&&P>=0&&x+1===P){C=!1,v=I,w=I,k=P;continue}if(D>=1&&R>=0&&R-1===x){S=!1,v=D,w=D,k=R;continue}if(v=e,w=e,k=x,k===0)return{startLineNumber:v,endLineNumber:w,indent:k}}C&&(R>=k?v=D:C=!1),S&&(P>=k?w=I:S=!1)}return{startLineNumber:v,endLineNumber:w,indent:k}}getLinesBracketGuides(e,t,i,n){var s;const r=[];for(let u=e;u<=t;u++)r.push([]);const a=!0,l=this.textModel.bracketPairs.getBracketPairsInRangeWithMinIndentation(new L(e,1,t,this.textModel.getLineMaxColumn(t)));let c;if(i&&l.length>0){const u=(e<=i.lineNumber&&i.lineNumber<=t?l:this.textModel.bracketPairs.getBracketPairsInRange(L.fromPositions(i))).filter(g=>L.strictContainsPosition(g.range,i));c=(s=Ey(u,g=>a))===null||s===void 0?void 0:s.range}const d=this.textModel.getOptions().bracketPairColorizationOptions.independentColorPoolPerBracketType,h=new x4;for(const u of l){if(!u.closingBracketRange)continue;const g=c&&u.range.equalsRange(c);if(!g&&!n.includeInactive)continue;const f=h.getInlineClassName(u.nestingLevel,u.nestingLevelOfEqualBracketType,d)+(n.highlightActive&&g?\" \"+h.activeClassName:\"\"),_=u.openingBracketRange.getStartPosition(),b=u.closingBracketRange.getStartPosition(),v=n.horizontalGuides===Cd.Enabled||n.horizontalGuides===Cd.EnabledForActive&&g;if(u.range.startLineNumber===u.range.endLineNumber){v&&r[u.range.startLineNumber-e].push(new hd(-1,u.openingBracketRange.getEndPosition().column,f,new ep(!1,b.column),-1,-1));continue}const C=this.getVisibleColumnFromPosition(b),w=this.getVisibleColumnFromPosition(u.openingBracketRange.getStartPosition()),S=Math.min(w,C,u.minVisibleColumnIndentation+1);let k=!1;Sn(this.textModel.getLineContent(u.closingBracketRange.startLineNumber))<u.closingBracketRange.startColumn-1&&(k=!0);const D=Math.max(_.lineNumber,e),I=Math.min(b.lineNumber,t),R=k?1:0;for(let P=D;P<I+R;P++)r[P-e].push(new hd(S,-1,f,null,P===_.lineNumber?_.column:-1,P===b.lineNumber?b.column:-1));v&&(_.lineNumber>=e&&w>S&&r[_.lineNumber-e].push(new hd(S,-1,f,new ep(!1,_.column),-1,-1)),b.lineNumber<=t&&C>S&&r[b.lineNumber-e].push(new hd(S,-1,f,new ep(!k,b.column),-1,-1)))}for(const u of r)u.sort((g,f)=>g.visibleColumn-f.visibleColumn);return r}getVisibleColumnFromPosition(e){return _i.visibleColumnFromColumn(this.textModel.getLineContent(e.lineNumber),e.column,this.textModel.getOptions().tabSize)+1}getLinesIndentGuides(e,t){this.assertNotDisposed();const i=this.textModel.getLineCount();if(e<1||e>i)throw new Error(\"Illegal value for startLineNumber\");if(t<1||t>i)throw new Error(\"Illegal value for endLineNumber\");const n=this.textModel.getOptions(),s=this.getLanguageConfiguration(this.textModel.getLanguageId()).foldingRules,r=Boolean(s&&s.offSide),a=new Array(t-e+1);let l=-2,c=-1,d=-2,h=-1;for(let u=e;u<=t;u++){const g=u-e,f=this._computeIndentLevel(u-1);if(f>=0){l=u-1,c=f,a[g]=Math.ceil(f/n.indentSize);continue}if(l===-2){l=-1,c=-1;for(let _=u-2;_>=0;_--){const b=this._computeIndentLevel(_);if(b>=0){l=_,c=b;break}}}if(d!==-1&&(d===-2||d<u-1)){d=-1,h=-1;for(let _=u;_<i;_++){const b=this._computeIndentLevel(_);if(b>=0){d=_,h=b;break}}}a[g]=this._getIndentLevelForWhitespaceLine(r,c,h)}return a}_getIndentLevelForWhitespaceLine(e,t,i){const n=this.textModel.getOptions();return t===-1||i===-1?0:t<i?1+Math.floor(t/n.indentSize):t===i||e?Math.ceil(i/n.indentSize):1+Math.floor(i/n.indentSize)}}class x4{constructor(){this.activeClassName=\"indent-active\"}getInlineClassName(e,t,i){return this.getInlineClassNameOfLevel(i?t:e)}getInlineClassNameOfLevel(e){return`bracket-indent-guide lvl-${e%30}`}}class B$ extends zg{constructor(e){super(),this._context=e,this._primaryPosition=null;const t=this._context.configuration.options,i=t.get(134),n=t.get(46);this._lineHeight=t.get(61),this._spaceWidth=n.spaceWidth,this._maxIndentLeft=i.wrappingColumn===-1?-1:i.wrappingColumn*n.typicalHalfwidthCharacterWidth,this._bracketPairGuideOptions=t.get(13),this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(e){const t=this._context.configuration.options,i=t.get(134),n=t.get(46);return this._lineHeight=t.get(61),this._spaceWidth=n.spaceWidth,this._maxIndentLeft=i.wrappingColumn===-1?-1:i.wrappingColumn*n.typicalHalfwidthCharacterWidth,this._bracketPairGuideOptions=t.get(13),!0}onCursorStateChanged(e){var t;const n=e.selections[0].getPosition();return!((t=this._primaryPosition)===null||t===void 0)&&t.equals(n)?!1:(this._primaryPosition=n,!0)}onDecorationsChanged(e){return!0}onFlushed(e){return!0}onLinesChanged(e){return!0}onLinesDeleted(e){return!0}onLinesInserted(e){return!0}onScrollChanged(e){return e.scrollTopChanged}onZonesChanged(e){return!0}onLanguageConfigurationChanged(e){return!0}prepareRender(e){var t,i,n,s;if(!this._bracketPairGuideOptions.indentation&&this._bracketPairGuideOptions.bracketPairs===!1){this._renderResult=null;return}const r=e.visibleRange.startLineNumber,a=e.visibleRange.endLineNumber,l=e.scrollWidth,c=this._lineHeight,d=this._primaryPosition,h=this.getGuidesByLine(r,a,d),u=[];for(let g=r;g<=a;g++){const f=g-r,_=h[f];let b=\"\";const v=(i=(t=e.visibleRangeForPosition(new B(g,1)))===null||t===void 0?void 0:t.left)!==null&&i!==void 0?i:0;for(const C of _){const w=C.column===-1?v+(C.visibleColumn-1)*this._spaceWidth:e.visibleRangeForPosition(new B(g,C.column)).left;if(w>l||this._maxIndentLeft>0&&w>this._maxIndentLeft)break;const S=C.horizontalLine?C.horizontalLine.top?\"horizontal-top\":\"horizontal-bottom\":\"vertical\",k=C.horizontalLine?((s=(n=e.visibleRangeForPosition(new B(g,C.horizontalLine.endColumn)))===null||n===void 0?void 0:n.left)!==null&&s!==void 0?s:w+this._spaceWidth)-w:this._spaceWidth;b+=`<div class=\"core-guide ${C.className} ${S}\" style=\"left:${w}px;height:${c}px;width:${k}px\"></div>`}u[f]=b}this._renderResult=u}getGuidesByLine(e,t,i){const n=this._bracketPairGuideOptions.bracketPairs!==!1?this._context.viewModel.getBracketGuidesInRangeByLine(e,t,i,{highlightActive:this._bracketPairGuideOptions.highlightActiveBracketPair,horizontalGuides:this._bracketPairGuideOptions.bracketPairsHorizontal===!0?Cd.Enabled:this._bracketPairGuideOptions.bracketPairsHorizontal===\"active\"?Cd.EnabledForActive:Cd.Disabled,includeInactive:this._bracketPairGuideOptions.bracketPairs===!0}):null,s=this._bracketPairGuideOptions.indentation?this._context.viewModel.getLinesIndentGuides(e,t):null;let r=0,a=0,l=0;if(this._bracketPairGuideOptions.highlightActiveIndentation!==!1&&i){const h=this._context.viewModel.getActiveIndentGuide(i.lineNumber,e,t);r=h.startLineNumber,a=h.endLineNumber,l=h.indent}const{indentSize:c}=this._context.viewModel.model.getOptions(),d=[];for(let h=e;h<=t;h++){const u=new Array;d.push(u);const g=n?n[h-e]:[],f=new Ap(g),_=s?s[h-e]:[];for(let b=1;b<=_;b++){const v=(b-1)*c+1,C=(this._bracketPairGuideOptions.highlightActiveIndentation===\"always\"||g.length===0)&&r<=h&&h<=a&&b===l;u.push(...f.takeWhile(S=>S.visibleColumn<v)||[]);const w=f.peek();(!w||w.visibleColumn!==v||w.horizontalLine)&&u.push(new hd(v,-1,C?\"core-guide-indent-active\":\"core-guide-indent\",null,-1,-1))}u.push(...f.takeWhile(b=>!0)||[])}return d}render(e,t){if(!this._renderResult)return\"\";const i=t-e;return i<0||i>=this._renderResult.length?\"\":this._renderResult[i]}}function G_(o){if(!(o&&o.isTransparent()))return o}Rt((o,e)=>{const t=o.getColor(Xm);t&&e.addRule(`.monaco-editor .lines-content .core-guide-indent { box-shadow: 1px 0 0 0 ${t} inset; }`);const i=o.getColor(Qm)||t;i&&e.addRule(`.monaco-editor .lines-content .core-guide-indent-active { box-shadow: 1px 0 0 0 ${i} inset; }`);const n=[{bracketColor:f4,guideColor:YU,guideColorActive:i$},{bracketColor:p4,guideColor:XU,guideColorActive:n$},{bracketColor:m4,guideColor:QU,guideColorActive:s$},{bracketColor:_4,guideColor:JU,guideColorActive:o$},{bracketColor:b4,guideColor:e$,guideColorActive:r$},{bracketColor:v4,guideColor:t$,guideColorActive:a$}],s=new x4,r=n.map(a=>{var l,c;const d=o.getColor(a.bracketColor),h=o.getColor(a.guideColor),u=o.getColor(a.guideColorActive),g=G_((l=G_(h))!==null&&l!==void 0?l:d==null?void 0:d.transparent(.3)),f=G_((c=G_(u))!==null&&c!==void 0?c:d);if(!(!g||!f))return{guideColor:g,guideColorActive:f}}).filter(s6);if(r.length>0){for(let a=0;a<30;a++){const l=r[a%r.length];e.addRule(`.monaco-editor .${s.getInlineClassNameOfLevel(a).replace(/ /g,\".\")} { --guide-color: ${l.guideColor}; --guide-color-active: ${l.guideColorActive}; }`)}e.addRule(\".monaco-editor .vertical { box-shadow: 1px 0 0 0 var(--guide-color) inset; }\"),e.addRule(\".monaco-editor .horizontal-top { border-top: 1px solid var(--guide-color); }\"),e.addRule(\".monaco-editor .horizontal-bottom { border-bottom: 1px solid var(--guide-color); }\"),e.addRule(`.monaco-editor .vertical.${s.activeClassName} { box-shadow: 1px 0 0 0 var(--guide-color-active) inset; }`),e.addRule(`.monaco-editor .horizontal-top.${s.activeClassName} { border-top: 1px solid var(--guide-color-active); }`),e.addRule(`.monaco-editor .horizontal-bottom.${s.activeClassName} { border-bottom: 1px solid var(--guide-color-active); }`)}});class W${constructor(){this._currentVisibleRange=new L(1,1,1,1)}getCurrentVisibleRange(){return this._currentVisibleRange}setCurrentVisibleRange(e){this._currentVisibleRange=e}}class V${constructor(e,t,i,n,s,r,a){this.minimalReveal=e,this.lineNumber=t,this.startColumn=i,this.endColumn=n,this.startScrollTop=s,this.stopScrollTop=r,this.scrollType=a,this.type=\"range\",this.minLineNumber=t,this.maxLineNumber=t}}class H${constructor(e,t,i,n,s){this.minimalReveal=e,this.selections=t,this.startScrollTop=i,this.stopScrollTop=n,this.scrollType=s,this.type=\"selections\";let r=t[0].startLineNumber,a=t[0].endLineNumber;for(let l=1,c=t.length;l<c;l++){const d=t[l];r=Math.min(r,d.startLineNumber),a=Math.max(a,d.endLineNumber)}this.minLineNumber=r,this.maxLineNumber=a}}class o1 extends Es{constructor(e,t){super(e),this._linesContent=t,this._textRangeRestingSpot=document.createElement(\"div\"),this._visibleLines=new w4(this),this.domNode=this._visibleLines.domNode;const i=this._context.configuration,n=this._context.configuration.options,s=n.get(46),r=n.get(134),a=n.get(133);this._lineHeight=n.get(61),this._typicalHalfwidthCharacterWidth=s.typicalHalfwidthCharacterWidth,this._isViewportWrapping=r.isViewportWrapping,this._revealHorizontalRightPadding=n.get(91),this._horizontalScrollbarHeight=a.horizontalScrollbarHeight,this._cursorSurroundingLines=n.get(25),this._cursorSurroundingLinesStyle=n.get(26),this._canUseLayerHinting=!n.get(28),this._viewLineOptions=new QT(i,this._context.theme.type),jr.write(this.domNode,7),this.domNode.setClassName(`view-lines ${vd}`),tn(this.domNode,s),this._maxLineWidth=0,this._asyncUpdateLineWidths=new ft(()=>{this._updateLineWidthsSlow()},200),this._asyncCheckMonospaceFontAssumptions=new ft(()=>{this._checkMonospaceFontAssumptions()},2e3),this._lastRenderedData=new W$,this._horizontalRevealRequest=null}dispose(){this._asyncUpdateLineWidths.dispose(),this._asyncCheckMonospaceFontAssumptions.dispose(),super.dispose()}getDomNode(){return this.domNode}createVisibleLine(){return new yr(this._viewLineOptions)}onConfigurationChanged(e){this._visibleLines.onConfigurationChanged(e),e.hasChanged(134)&&(this._maxLineWidth=0);const t=this._context.configuration.options,i=t.get(46),n=t.get(134),s=t.get(133);return this._lineHeight=t.get(61),this._typicalHalfwidthCharacterWidth=i.typicalHalfwidthCharacterWidth,this._isViewportWrapping=n.isViewportWrapping,this._revealHorizontalRightPadding=t.get(91),this._horizontalScrollbarHeight=s.horizontalScrollbarHeight,this._cursorSurroundingLines=t.get(25),this._cursorSurroundingLinesStyle=t.get(26),this._canUseLayerHinting=!t.get(28),tn(this.domNode,i),this._onOptionsMaybeChanged(),e.hasChanged(133)&&(this._maxLineWidth=0),!0}_onOptionsMaybeChanged(){const e=this._context.configuration,t=new QT(e,this._context.theme.type);if(!this._viewLineOptions.equals(t)){this._viewLineOptions=t;const i=this._visibleLines.getStartLineNumber(),n=this._visibleLines.getEndLineNumber();for(let s=i;s<=n;s++)this._visibleLines.getVisibleLine(s).onOptionsChanged(this._viewLineOptions);return!0}return!1}onCursorStateChanged(e){const t=this._visibleLines.getStartLineNumber(),i=this._visibleLines.getEndLineNumber();let n=!1;for(let s=t;s<=i;s++)n=this._visibleLines.getVisibleLine(s).onSelectionChanged()||n;return n}onDecorationsChanged(e){{const t=this._visibleLines.getStartLineNumber(),i=this._visibleLines.getEndLineNumber();for(let n=t;n<=i;n++)this._visibleLines.getVisibleLine(n).onDecorationsChanged()}return!0}onFlushed(e){const t=this._visibleLines.onFlushed(e);return this._maxLineWidth=0,t}onLinesChanged(e){return this._visibleLines.onLinesChanged(e)}onLinesDeleted(e){return this._visibleLines.onLinesDeleted(e)}onLinesInserted(e){return this._visibleLines.onLinesInserted(e)}onRevealRangeRequest(e){const t=this._computeScrollTopToRevealRange(this._context.viewLayout.getFutureViewport(),e.source,e.minimalReveal,e.range,e.selections,e.verticalType);if(t===-1)return!1;let i=this._context.viewLayout.validateScrollPosition({scrollTop:t});e.revealHorizontal?e.range&&e.range.startLineNumber!==e.range.endLineNumber?i={scrollTop:i.scrollTop,scrollLeft:0}:e.range?this._horizontalRevealRequest=new V$(e.minimalReveal,e.range.startLineNumber,e.range.startColumn,e.range.endColumn,this._context.viewLayout.getCurrentScrollTop(),i.scrollTop,e.scrollType):e.selections&&e.selections.length>0&&(this._horizontalRevealRequest=new H$(e.minimalReveal,e.selections,this._context.viewLayout.getCurrentScrollTop(),i.scrollTop,e.scrollType)):this._horizontalRevealRequest=null;const s=Math.abs(this._context.viewLayout.getCurrentScrollTop()-i.scrollTop)<=this._lineHeight?1:e.scrollType;return this._context.viewModel.viewLayout.setScrollPosition(i,s),!0}onScrollChanged(e){if(this._horizontalRevealRequest&&e.scrollLeftChanged&&(this._horizontalRevealRequest=null),this._horizontalRevealRequest&&e.scrollTopChanged){const t=Math.min(this._horizontalRevealRequest.startScrollTop,this._horizontalRevealRequest.stopScrollTop),i=Math.max(this._horizontalRevealRequest.startScrollTop,this._horizontalRevealRequest.stopScrollTop);(e.scrollTop<t||e.scrollTop>i)&&(this._horizontalRevealRequest=null)}return this.domNode.setWidth(e.scrollWidth),this._visibleLines.onScrollChanged(e)||!0}onTokensChanged(e){return this._visibleLines.onTokensChanged(e)}onZonesChanged(e){return this._context.viewModel.viewLayout.setMaxLineWidth(this._maxLineWidth),this._visibleLines.onZonesChanged(e)}onThemeChanged(e){return this._onOptionsMaybeChanged()}getPositionFromDOMInfo(e,t){const i=this._getViewLineDomNode(e);if(i===null)return null;const n=this._getLineNumberFor(i);if(n===-1||n<1||n>this._context.viewModel.getLineCount())return null;if(this._context.viewModel.getLineMaxColumn(n)===1)return new B(n,1);const s=this._visibleLines.getStartLineNumber(),r=this._visibleLines.getEndLineNumber();if(n<s||n>r)return null;let a=this._visibleLines.getVisibleLine(n).getColumnOfNodeOffset(n,e,t);const l=this._context.viewModel.getLineMinColumn(n);return a<l&&(a=l),new B(n,a)}_getViewLineDomNode(e){for(;e&&e.nodeType===1;){if(e.className===yr.CLASS_NAME)return e;e=e.parentElement}return null}_getLineNumberFor(e){const t=this._visibleLines.getStartLineNumber(),i=this._visibleLines.getEndLineNumber();for(let n=t;n<=i;n++){const s=this._visibleLines.getVisibleLine(n);if(e===s.getDomNode())return n}return-1}getLineWidth(e){const t=this._visibleLines.getStartLineNumber(),i=this._visibleLines.getEndLineNumber();return e<t||e>i?-1:this._visibleLines.getVisibleLine(e).getWidth()}linesVisibleRangesForRange(e,t){if(this.shouldRender())return null;const i=e.endLineNumber,n=L.intersectRanges(e,this._lastRenderedData.getCurrentVisibleRange());if(!n)return null;const s=[];let r=0;const a=new XT(this.domNode.domNode,this._textRangeRestingSpot);let l=0;t&&(l=this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new B(n.startLineNumber,1)).lineNumber);const c=this._visibleLines.getStartLineNumber(),d=this._visibleLines.getEndLineNumber();for(let h=n.startLineNumber;h<=n.endLineNumber;h++){if(h<c||h>d)continue;const u=h===n.startLineNumber?n.startColumn:1,g=h===n.endLineNumber?n.endColumn:this._context.viewModel.getLineMaxColumn(h),f=this._visibleLines.getVisibleLine(h).getVisibleRangesForRange(h,u,g,a);if(!!f){if(t&&h<i){const _=l;l=this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new B(h+1,1)).lineNumber,_!==l&&(f.ranges[f.ranges.length-1].width+=this._typicalHalfwidthCharacterWidth)}s[r++]=new tU(f.outsideRenderedLine,h,JC.from(f.ranges))}}return r===0?null:s}_visibleRangesForLineRange(e,t,i){return this.shouldRender()||e<this._visibleLines.getStartLineNumber()||e>this._visibleLines.getEndLineNumber()?null:this._visibleLines.getVisibleLine(e).getVisibleRangesForRange(e,t,i,new XT(this.domNode.domNode,this._textRangeRestingSpot))}visibleRangeForPosition(e){const t=this._visibleRangesForLineRange(e.lineNumber,e.column,e.column);return t?new iU(t.outsideRenderedLine,t.ranges[0].left):null}updateLineWidths(){this._updateLineWidths(!1)}_updateLineWidthsFast(){return this._updateLineWidths(!0)}_updateLineWidthsSlow(){this._updateLineWidths(!1)}_updateLineWidths(e){const t=this._visibleLines.getStartLineNumber(),i=this._visibleLines.getEndLineNumber();let n=1,s=!0;for(let r=t;r<=i;r++){const a=this._visibleLines.getVisibleLine(r);if(e&&!a.getWidthIsFast()){s=!1;continue}n=Math.max(n,a.getWidth())}return s&&t===1&&i===this._context.viewModel.getLineCount()&&(this._maxLineWidth=0),this._ensureMaxLineWidth(n),s}_checkMonospaceFontAssumptions(){let e=-1,t=-1;const i=this._visibleLines.getStartLineNumber(),n=this._visibleLines.getEndLineNumber();for(let s=i;s<=n;s++){const r=this._visibleLines.getVisibleLine(s);if(r.needsMonospaceFontCheck()){const a=r.getWidth();a>t&&(t=a,e=s)}}if(e!==-1&&!this._visibleLines.getVisibleLine(e).monospaceAssumptionsAreValid())for(let s=i;s<=n;s++)this._visibleLines.getVisibleLine(s).onMonospaceAssumptionsInvalidated()}prepareRender(){throw new Error(\"Not supported\")}render(){throw new Error(\"Not supported\")}renderText(e){if(this._visibleLines.renderLines(e),this._lastRenderedData.setCurrentVisibleRange(e.visibleRange),this.domNode.setWidth(this._context.viewLayout.getScrollWidth()),this.domNode.setHeight(Math.min(this._context.viewLayout.getScrollHeight(),1e6)),this._horizontalRevealRequest){const i=this._horizontalRevealRequest;if(e.startLineNumber<=i.minLineNumber&&i.maxLineNumber<=e.endLineNumber){this._horizontalRevealRequest=null,this.onDidRender();const n=this._computeScrollLeftToReveal(i);n&&(this._isViewportWrapping||this._ensureMaxLineWidth(n.maxHorizontalOffset),this._context.viewModel.viewLayout.setScrollPosition({scrollLeft:n.scrollLeft},i.scrollType))}}if(this._updateLineWidthsFast()||this._asyncUpdateLineWidths.schedule(),sn&&!this._asyncCheckMonospaceFontAssumptions.isScheduled()){const i=this._visibleLines.getStartLineNumber(),n=this._visibleLines.getEndLineNumber();for(let s=i;s<=n;s++)if(this._visibleLines.getVisibleLine(s).needsMonospaceFontCheck()){this._asyncCheckMonospaceFontAssumptions.schedule();break}}this._linesContent.setLayerHinting(this._canUseLayerHinting),this._linesContent.setContain(\"strict\");const t=this._context.viewLayout.getCurrentScrollTop()-e.bigNumbersDelta;this._linesContent.setTop(-t),this._linesContent.setLeft(-this._context.viewLayout.getCurrentScrollLeft())}_ensureMaxLineWidth(e){const t=Math.ceil(e);this._maxLineWidth<t&&(this._maxLineWidth=t,this._context.viewModel.viewLayout.setMaxLineWidth(this._maxLineWidth))}_computeScrollTopToRevealRange(e,t,i,n,s,r){const a=e.top,l=e.height,c=a+l;let d,h,u;if(s&&s.length>0){let _=s[0].startLineNumber,b=s[0].endLineNumber;for(let v=1,C=s.length;v<C;v++){const w=s[v];_=Math.min(_,w.startLineNumber),b=Math.max(b,w.endLineNumber)}d=!1,h=this._context.viewLayout.getVerticalOffsetForLineNumber(_),u=this._context.viewLayout.getVerticalOffsetForLineNumber(b)+this._lineHeight}else if(n)d=!0,h=this._context.viewLayout.getVerticalOffsetForLineNumber(n.startLineNumber),u=this._context.viewLayout.getVerticalOffsetForLineNumber(n.endLineNumber)+this._lineHeight;else return-1;if((t===\"mouse\"||i)&&this._cursorSurroundingLinesStyle===\"default\")i||(h-=this._lineHeight);else{const _=Math.min(l/this._lineHeight/2,this._cursorSurroundingLines);h-=_*this._lineHeight,u+=Math.max(0,_-1)*this._lineHeight}(r===0||r===4)&&(u+=i?this._horizontalScrollbarHeight:this._lineHeight);let f;if(u-h>l){if(!d)return-1;f=h}else if(r===5||r===6)if(r===6&&a<=h&&u<=c)f=a;else{const _=Math.max(5*this._lineHeight,l*.2),b=h-_,v=u-l;f=Math.max(v,b)}else if(r===1||r===2)if(r===2&&a<=h&&u<=c)f=a;else{const _=(h+u)/2;f=Math.max(0,_-l/2)}else f=this._computeMinimumScrolling(a,c,h,u,r===3,r===4);return f}_computeScrollLeftToReveal(e){const t=this._context.viewLayout.getCurrentViewport(),i=t.left,n=i+t.width;let s=1073741824,r=0;if(e.type===\"range\"){const l=this._visibleRangesForLineRange(e.lineNumber,e.startColumn,e.endColumn);if(!l)return null;for(const c of l.ranges)s=Math.min(s,Math.round(c.left)),r=Math.max(r,Math.round(c.left+c.width))}else for(const l of e.selections){if(l.startLineNumber!==l.endLineNumber)return null;const c=this._visibleRangesForLineRange(l.startLineNumber,l.startColumn,l.endColumn);if(!c)return null;for(const d of c.ranges)s=Math.min(s,Math.round(d.left)),r=Math.max(r,Math.round(d.left+d.width))}return e.minimalReveal||(s=Math.max(0,s-o1.HORIZONTAL_EXTRA_PX),r+=this._revealHorizontalRightPadding),e.type===\"selections\"&&r-s>t.width?null:{scrollLeft:this._computeMinimumScrolling(i,n,s,r),maxHorizontalOffset:r}}_computeMinimumScrolling(e,t,i,n,s,r){e=e|0,t=t|0,i=i|0,n=n|0,s=!!s,r=!!r;const a=t-e;if(n-i<a){if(s)return i;if(r)return Math.max(0,n-a);if(i<e)return i;if(n>t)return Math.max(0,n-a)}else return i;return e}}o1.HORIZONTAL_EXTRA_PX=30;class z$ extends II{constructor(e){super(),this._context=e;const i=this._context.configuration.options.get(133);this._decorationsLeft=i.decorationsLeft,this._decorationsWidth=i.decorationsWidth,this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(e){const i=this._context.configuration.options.get(133);return this._decorationsLeft=i.decorationsLeft,this._decorationsWidth=i.decorationsWidth,!0}onDecorationsChanged(e){return!0}onFlushed(e){return!0}onLinesChanged(e){return!0}onLinesDeleted(e){return!0}onLinesInserted(e){return!0}onScrollChanged(e){return e.scrollTopChanged}onZonesChanged(e){return!0}_getDecorations(e){const t=e.getDecorationsInViewport(),i=[];let n=0;for(let s=0,r=t.length;s<r;s++){const a=t[s],l=a.options.linesDecorationsClassName;l&&(i[n++]=new sv(a.range.startLineNumber,a.range.endLineNumber,l));const c=a.options.firstLineDecorationClassName;c&&(i[n++]=new sv(a.range.startLineNumber,a.range.startLineNumber,c))}return i}prepareRender(e){const t=e.visibleRange.startLineNumber,i=e.visibleRange.endLineNumber,n=this._render(t,i,this._getDecorations(e)),s=this._decorationsLeft.toString(),r=this._decorationsWidth.toString(),a='\" style=\"left:'+s+\"px;width:\"+r+'px;\"></div>',l=[];for(let c=t;c<=i;c++){const d=c-t,h=n[d];let u=\"\";for(let g=0,f=h.length;g<f;g++)u+='<div class=\"cldr '+h[g]+a;l[d]=u}this._renderResult=l}render(e,t){return this._renderResult?this._renderResult[t-e]:\"\"}}class U$ extends II{constructor(e){super(),this._context=e,this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(e){return!0}onDecorationsChanged(e){return!0}onFlushed(e){return!0}onLinesChanged(e){return!0}onLinesDeleted(e){return!0}onLinesInserted(e){return!0}onScrollChanged(e){return e.scrollTopChanged}onZonesChanged(e){return!0}_getDecorations(e){const t=e.getDecorationsInViewport(),i=[];let n=0;for(let s=0,r=t.length;s<r;s++){const a=t[s],l=a.options.marginClassName;l&&(i[n++]=new sv(a.range.startLineNumber,a.range.endLineNumber,l))}return i}prepareRender(e){const t=e.visibleRange.startLineNumber,i=e.visibleRange.endLineNumber,n=this._render(t,i,this._getDecorations(e)),s=[];for(let r=t;r<=i;r++){const a=r-t,l=n[a];let c=\"\";for(let d=0,h=l.length;d<h;d++)c+='<div class=\"cmdr '+l[d]+'\" style=\"\"></div>';s[a]=c}this._renderResult=s}render(e,t){return this._renderResult?this._renderResult[t-e]:\"\"}}class zs{constructor(e,t,i,n){this._rgba8Brand=void 0,this.r=zs._clamp(e),this.g=zs._clamp(t),this.b=zs._clamp(i),this.a=zs._clamp(n)}equals(e){return this.r===e.r&&this.g===e.g&&this.b===e.b&&this.a===e.a}static _clamp(e){return e<0?0:e>255?255:e|0}}zs.Empty=new zs(0,0,0,0);class t_ extends z{constructor(){super(),this._onDidChange=new O,this.onDidChange=this._onDidChange.event,this._updateColorMap(),this._register(Jt.onDidChange(e=>{e.changedColorMap&&this._updateColorMap()}))}static getInstance(){return this._INSTANCE||(this._INSTANCE=new t_),this._INSTANCE}_updateColorMap(){const e=Jt.getColorMap();if(!e){this._colors=[zs.Empty],this._backgroundIsLight=!0;return}this._colors=[zs.Empty];for(let i=1;i<e.length;i++){const n=e[i].rgba;this._colors[i]=new zs(n.r,n.g,n.b,Math.round(n.a*255))}const t=e[2].getRelativeLuminance();this._backgroundIsLight=t>=.5,this._onDidChange.fire(void 0)}getColor(e){return(e<1||e>=this._colors.length)&&(e=2),this._colors[e]}backgroundIsLight(){return this._backgroundIsLight}}t_._INSTANCE=null;class o2{constructor(e,t,i,n){this._viewportBrand=void 0,this.top=e|0,this.left=t|0,this.width=i|0,this.height=n|0}}class $${constructor(e,t){this.tabSize=e,this.data=t}}class EI{constructor(e,t,i,n,s,r,a){this._viewLineDataBrand=void 0,this.content=e,this.continuesWithWrappedLine=t,this.minColumn=i,this.maxColumn=n,this.startVisibleColumn=s,this.tokens=r,this.inlineDecorations=a}}class xs{constructor(e,t,i,n,s,r,a,l,c,d){this.minColumn=e,this.maxColumn=t,this.content=i,this.continuesWithWrappedLine=n,this.isBasicASCII=xs.isBasicASCII(i,r),this.containsRTL=xs.containsRTL(i,this.isBasicASCII,s),this.tokens=a,this.inlineDecorations=l,this.tabSize=c,this.startVisibleColumn=d}static isBasicASCII(e,t){return t?DC(e):!0}static containsRTL(e,t,i){return!t&&i?ig(e):!1}}class tp{constructor(e,t,i){this.range=e,this.inlineClassName=t,this.type=i}}class j${constructor(e,t,i,n){this.startOffset=e,this.endOffset=t,this.inlineClassName=i,this.inlineClassNameAffectsLetterSpacing=n}toInlineDecoration(e){return new tp(new L(e,this.startOffset+1,e,this.endOffset+1),this.inlineClassName,this.inlineClassNameAffectsLetterSpacing?3:0)}}class I4{constructor(e,t){this._viewModelDecorationBrand=void 0,this.range=e,this.options=t}}class E4{constructor(e,t,i){this.color=e,this.zIndex=t,this.data=i}static cmp(e,t){return e.zIndex===t.zIndex?e.color<t.color?-1:e.color>t.color?1:0:e.zIndex-t.zIndex}}const K$=(()=>{const o=[];for(let e=32;e<=126;e++)o.push(e);return o.push(65533),o})(),q$=(o,e)=>(o-=32,o<0||o>96?e<=2?(o+96)%96:96-1:o);class jp{constructor(e,t){this.scale=t,this._minimapCharRendererBrand=void 0,this.charDataNormal=jp.soften(e,12/15),this.charDataLight=jp.soften(e,50/60)}static soften(e,t){const i=new Uint8ClampedArray(e.length);for(let n=0,s=e.length;n<s;n++)i[n]=$0(e[n]*t);return i}renderChar(e,t,i,n,s,r,a,l,c,d,h){const u=1*this.scale,g=2*this.scale,f=h?1:g;if(t+u>e.width||i+f>e.height){console.warn(\"bad render request outside image data\");return}const _=d?this.charDataLight:this.charDataNormal,b=q$(n,c),v=e.width*4,C=a.r,w=a.g,S=a.b,k=s.r-C,x=s.g-w,y=s.b-S,D=Math.max(r,l),I=e.data;let R=b*u*g,P=i*v+t*4;for(let H=0;H<f;H++){let $=P;for(let ne=0;ne<u;ne++){const ae=_[R++]/255*(r/255);I[$++]=C+k*ae,I[$++]=w+x*ae,I[$++]=S+y*ae,I[$++]=D}P+=v}}blockRenderChar(e,t,i,n,s,r,a,l){const c=1*this.scale,d=2*this.scale,h=l?1:d;if(t+c>e.width||i+h>e.height){console.warn(\"bad render request outside image data\");return}const u=e.width*4,g=.5*(s/255),f=r.r,_=r.g,b=r.b,v=n.r-f,C=n.g-_,w=n.b-b,S=f+v*g,k=_+C*g,x=b+w*g,y=Math.max(s,a),D=e.data;let I=i*u+t*4;for(let R=0;R<h;R++){let P=I;for(let H=0;H<c;H++)D[P++]=S,D[P++]=k,D[P++]=x,D[P++]=y;I+=u}}}const r2={0:0,1:1,2:2,3:3,4:4,5:5,6:6,7:7,8:8,9:9,A:10,B:11,C:12,D:13,E:14,F:15},a2=o=>{const e=new Uint8ClampedArray(o.length/2);for(let t=0;t<o.length;t+=2)e[t>>1]=r2[o[t]]<<4|r2[o[t+1]]&15;return e},l2={1:nc(()=>a2(\"0000511D6300CF609C709645A78432005642574171487021003C451900274D35D762755E8B629C5BA856AF57BA649530C167D1512A272A3F6038604460398526BCA2A968DB6F8957C768BE5FBE2FB467CF5D8D5B795DC7625B5DFF50DE64C466DB2FC47CD860A65E9A2EB96CB54CE06DA763AB2EA26860524D3763536601005116008177A8705E53AB738E6A982F88BAA35B5F5B626D9C636B449B737E5B7B678598869A662F6B5B8542706C704C80736A607578685B70594A49715A4522E792\")),2:nc(()=>a2(\"000000000000000055394F383D2800008B8B1F210002000081B1CBCBCC820000847AAF6B9AAF2119BE08B8881AD60000A44FD07DCCF107015338130C00000000385972265F390B406E2437634B4B48031B12B8A0847000001E15B29A402F0000000000004B33460B00007A752C2A0000000000004D3900000084394B82013400ABA5CFC7AD9C0302A45A3E5A98AB000089A43382D97900008BA54AA087A70A0248A6A7AE6DBE0000BF6F94987EA40A01A06DCFA7A7A9030496C32F77891D0000A99FB1A0AFA80603B29AB9CA75930D010C0948354D3900000C0948354F37460D0028BE673D8400000000AF9D7B6E00002B007AA8933400007AA642675C2700007984CFB9C3985B768772A8A6B7B20000CAAECAAFC4B700009F94A6009F840009D09F9BA4CA9C0000CC8FC76DC87F0000C991C472A2000000A894A48CA7B501079BA2C9C69BA20000B19A5D3FA89000005CA6009DA2960901B0A7F0669FB200009D009E00B7890000DAD0F5D092820000D294D4C48BD10000B5A7A4A3B1A50402CAB6CBA6A2000000B5A7A4A3B1A8044FCDADD19D9CB00000B7778F7B8AAE0803C9AB5D3F5D3F00009EA09EA0BAB006039EA0989A8C7900009B9EF4D6B7C00000A9A7816CACA80000ABAC84705D3F000096DA635CDC8C00006F486F266F263D4784006124097B00374F6D2D6D2D6D4A3A95872322000000030000000000008D8939130000000000002E22A5C9CBC70600AB25C0B5C9B400061A2DB04CA67001082AA6BEBEBFC606002321DACBC19E03087AA08B6768380000282FBAC0B8CA7A88AD25BBA5A29900004C396C5894A6000040485A6E356E9442A32CD17EADA70000B4237923628600003E2DE9C1D7B500002F25BBA5A2990000231DB6AFB4A804023025C0B5CAB588062B2CBDBEC0C706882435A75CA20000002326BD6A82A908048B4B9A5A668000002423A09CB4BB060025259C9D8A7900001C1FCAB2C7C700002A2A9387ABA200002626A4A47D6E9D14333163A0C87500004B6F9C2D643A257049364936493647358A34438355497F1A0000A24C1D590000D38DFFBDD4CD3126\"))};class ip{static create(e,t){if(this.lastCreated&&e===this.lastCreated.scale&&t===this.lastFontFamily)return this.lastCreated;let i;return l2[e]?i=new jp(l2[e](),e):i=ip.createFromSampleData(ip.createSampleData(t).data,e),this.lastFontFamily=t,this.lastCreated=i,i}static createSampleData(e){const t=document.createElement(\"canvas\"),i=t.getContext(\"2d\");t.style.height=`${16}px`,t.height=16,t.width=96*10,t.style.width=96*10+\"px\",i.fillStyle=\"#ffffff\",i.font=`bold ${16}px ${e}`,i.textBaseline=\"middle\";let n=0;for(const s of K$)i.fillText(String.fromCharCode(s),n,16/2),n+=10;return i.getImageData(0,0,96*10,16)}static createFromSampleData(e,t){if(e.length!==61440)throw new Error(\"Unexpected source in MinimapCharRenderer\");const n=ip._downsample(e,t);return new jp(n,t)}static _downsampleChar(e,t,i,n,s){const r=1*s,a=2*s;let l=n,c=0;for(let d=0;d<a;d++){const h=d/a*16,u=(d+1)/a*16;for(let g=0;g<r;g++){const f=g/r*10,_=(g+1)/r*10;let b=0,v=0;for(let w=h;w<u;w++){const S=t+Math.floor(w)*3840,k=1-(w-Math.floor(w));for(let x=f;x<_;x++){const y=1-(x-Math.floor(x)),D=S+Math.floor(x)*4,I=y*k;v+=I,b+=e[D]*e[D+3]/255*I}}const C=b/v;c=Math.max(c,C),i[l++]=$0(C)}}return c}static _downsample(e,t){const i=2*t*1*t,n=i*96,s=new Uint8ClampedArray(n);let r=0,a=0,l=0;for(let c=0;c<96;c++)l=Math.max(l,this._downsampleChar(e,a,s,r,t)),r+=i,a+=10*4;if(l>0){const c=255/l;for(let d=0;d<n;d++)s[d]*=c}return s}}var vo;(function(o){o[o.Left=1]=\"Left\",o[o.Center=2]=\"Center\",o[o.Right=4]=\"Right\",o[o.Full=7]=\"Full\"})(vo||(vo={}));var js;(function(o){o[o.Inline=1]=\"Inline\",o[o.Gutter=2]=\"Gutter\"})(js||(js={}));var Bo;(function(o){o[o.Both=0]=\"Both\",o[o.Right=1]=\"Right\",o[o.Left=2]=\"Left\",o[o.None=3]=\"None\"})(Bo||(Bo={}));class n0{constructor(e){this._textModelResolvedOptionsBrand=void 0,this.tabSize=Math.max(1,e.tabSize|0),this.indentSize=e.tabSize|0,this.insertSpaces=Boolean(e.insertSpaces),this.defaultEOL=e.defaultEOL|0,this.trimAutoWhitespace=Boolean(e.trimAutoWhitespace),this.bracketPairColorizationOptions=e.bracketPairColorizationOptions}equals(e){return this.tabSize===e.tabSize&&this.indentSize===e.indentSize&&this.insertSpaces===e.insertSpaces&&this.defaultEOL===e.defaultEOL&&this.trimAutoWhitespace===e.trimAutoWhitespace&&$s(this.bracketPairColorizationOptions,e.bracketPairColorizationOptions)}createChangeEvent(e){return{tabSize:this.tabSize!==e.tabSize,indentSize:this.indentSize!==e.indentSize,insertSpaces:this.insertSpaces!==e.insertSpaces,trimAutoWhitespace:this.trimAutoWhitespace!==e.trimAutoWhitespace}}}class Kp{constructor(e,t){this._findMatchBrand=void 0,this.range=e,this.matches=t}}function G$(o){return o&&typeof o.read==\"function\"}class Ww{constructor(e,t,i,n,s,r){this.identifier=e,this.range=t,this.text=i,this.forceMoveMarkers=n,this.isAutoWhitespaceEdit=s,this._isTracked=r}}class Z${constructor(e,t,i){this.regex=e,this.wordSeparators=t,this.simpleSearch=i}}class Y${constructor(e,t,i){this.reverseEdits=e,this.changes=t,this.trimAutoWhitespaceLineNumbers=i}}function X$(o){return!o.isTooLargeForSyncing()&&!o.isForSimpleWidget}const Q$=140,J$=2;class qp{constructor(e,t,i){const n=e.options,s=n.get(131),r=n.get(133),a=r.minimap,l=n.get(46),c=n.get(67);this.renderMinimap=a.renderMinimap,this.size=c.size,this.minimapHeightIsEditorHeight=a.minimapHeightIsEditorHeight,this.scrollBeyondLastLine=n.get(96),this.showSlider=c.showSlider,this.autohide=c.autohide,this.pixelRatio=s,this.typicalHalfwidthCharacterWidth=l.typicalHalfwidthCharacterWidth,this.lineHeight=n.get(61),this.minimapLeft=a.minimapLeft,this.minimapWidth=a.minimapWidth,this.minimapHeight=r.height,this.canvasInnerWidth=a.minimapCanvasInnerWidth,this.canvasInnerHeight=a.minimapCanvasInnerHeight,this.canvasOuterWidth=a.minimapCanvasOuterWidth,this.canvasOuterHeight=a.minimapCanvasOuterHeight,this.isSampling=a.minimapIsSampling,this.editorHeight=r.height,this.fontScale=a.minimapScale,this.minimapLineHeight=a.minimapLineHeight,this.minimapCharWidth=1*this.fontScale,this.charRenderer=nc(()=>ip.create(this.fontScale,l.fontFamily)),this.defaultBackgroundColor=i.getColor(2),this.backgroundColor=qp._getMinimapBackground(t,this.defaultBackgroundColor),this.foregroundAlpha=qp._getMinimapForegroundOpacity(t)}static _getMinimapBackground(e,t){const i=e.getColor(Pz);return i?new zs(i.rgba.r,i.rgba.g,i.rgba.b,Math.round(255*i.rgba.a)):t}static _getMinimapForegroundOpacity(e){const t=e.getColor(Fz);return t?zs._clamp(Math.round(255*t.rgba.a)):255}equals(e){return this.renderMinimap===e.renderMinimap&&this.size===e.size&&this.minimapHeightIsEditorHeight===e.minimapHeightIsEditorHeight&&this.scrollBeyondLastLine===e.scrollBeyondLastLine&&this.showSlider===e.showSlider&&this.autohide===e.autohide&&this.pixelRatio===e.pixelRatio&&this.typicalHalfwidthCharacterWidth===e.typicalHalfwidthCharacterWidth&&this.lineHeight===e.lineHeight&&this.minimapLeft===e.minimapLeft&&this.minimapWidth===e.minimapWidth&&this.minimapHeight===e.minimapHeight&&this.canvasInnerWidth===e.canvasInnerWidth&&this.canvasInnerHeight===e.canvasInnerHeight&&this.canvasOuterWidth===e.canvasOuterWidth&&this.canvasOuterHeight===e.canvasOuterHeight&&this.isSampling===e.isSampling&&this.editorHeight===e.editorHeight&&this.fontScale===e.fontScale&&this.minimapLineHeight===e.minimapLineHeight&&this.minimapCharWidth===e.minimapCharWidth&&this.defaultBackgroundColor&&this.defaultBackgroundColor.equals(e.defaultBackgroundColor)&&this.backgroundColor&&this.backgroundColor.equals(e.backgroundColor)&&this.foregroundAlpha===e.foregroundAlpha}}class np{constructor(e,t,i,n,s,r,a,l){this.scrollTop=e,this.scrollHeight=t,this.sliderNeeded=i,this._computedSliderRatio=n,this.sliderTop=s,this.sliderHeight=r,this.startLineNumber=a,this.endLineNumber=l}getDesiredScrollTopFromDelta(e){return Math.round(this.scrollTop+e/this._computedSliderRatio)}getDesiredScrollTopFromTouchLocation(e){return Math.round((e-this.sliderHeight/2)/this._computedSliderRatio)}static create(e,t,i,n,s,r,a,l,c,d,h){const u=e.pixelRatio,g=e.minimapLineHeight,f=Math.floor(e.canvasInnerHeight/g),_=e.lineHeight;if(e.minimapHeightIsEditorHeight){const k=l*e.lineHeight+(e.scrollBeyondLastLine?s-e.lineHeight:0),x=Math.max(1,Math.floor(s*s/k)),y=Math.max(0,e.minimapHeight-x),D=y/(d-s),I=c*D,R=y>0,P=Math.floor(e.canvasInnerHeight/e.minimapLineHeight);return new np(c,d,R,D,I,x,1,Math.min(a,P))}let b;if(r&&i!==a){const k=i-t+1;b=Math.floor(k*g/u)}else{const k=s/_;b=Math.floor(k*g/u)}let v;e.scrollBeyondLastLine?v=(a-1)*g/u:v=Math.max(0,a*g/u-b),v=Math.min(e.minimapHeight-b,v);const C=v/(d-s),w=c*C;let S=0;if(e.scrollBeyondLastLine&&(S=s/_-1),f>=a+S){const x=a,y=v>0;return new np(c,d,y,C,w,b,1,x)}else{let k=Math.max(1,Math.floor(t-w*u/g));h&&h.scrollHeight===d&&(h.scrollTop>c&&(k=Math.min(k,h.startLineNumber)),h.scrollTop<c&&(k=Math.max(k,h.startLineNumber)));const x=Math.min(a,k+f-1),y=(c-n)/_,D=(t-k+y)*g/u;return new np(c,d,!0,C,D,b,k,x)}}}class ov{constructor(e){this.dy=e}onContentChanged(){this.dy=-1}onTokensChanged(){this.dy=-1}}ov.INVALID=new ov(-1);class c2{constructor(e,t,i){this.renderedLayout=e,this._imageData=t,this._renderedLines=new C4(()=>ov.INVALID),this._renderedLines._set(e.startLineNumber,i)}linesEquals(e){if(!this.scrollEquals(e))return!1;const i=this._renderedLines._get().lines;for(let n=0,s=i.length;n<s;n++)if(i[n].dy===-1)return!1;return!0}scrollEquals(e){return this.renderedLayout.startLineNumber===e.startLineNumber&&this.renderedLayout.endLineNumber===e.endLineNumber}_get(){const e=this._renderedLines._get();return{imageData:this._imageData,rendLineNumberStart:e.rendLineNumberStart,lines:e.lines}}onLinesChanged(e,t){return this._renderedLines.onLinesChanged(e,t)}onLinesDeleted(e,t){this._renderedLines.onLinesDeleted(e,t)}onLinesInserted(e,t){this._renderedLines.onLinesInserted(e,t)}onTokensChanged(e){return this._renderedLines.onTokensChanged(e)}}class NI{constructor(e,t,i,n){this._backgroundFillData=NI._createBackgroundFillData(t,i,n),this._buffers=[e.createImageData(t,i),e.createImageData(t,i)],this._lastUsedBuffer=0}getBuffer(){this._lastUsedBuffer=1-this._lastUsedBuffer;const e=this._buffers[this._lastUsedBuffer];return e.data.set(this._backgroundFillData),e}static _createBackgroundFillData(e,t,i){const n=i.r,s=i.g,r=i.b,a=i.a,l=new Uint8ClampedArray(e*t*4);let c=0;for(let d=0;d<t;d++)for(let h=0;h<e;h++)l[c]=n,l[c+1]=s,l[c+2]=r,l[c+3]=a,c+=4;return l}}class Gp{constructor(e,t){this.samplingRatio=e,this.minimapLines=t}static compute(e,t,i){if(e.renderMinimap===0||!e.isSampling)return[null,[]];const n=e.pixelRatio,s=e.lineHeight,r=e.scrollBeyondLastLine,{minimapLineCount:a}=Mu.computeContainedMinimapLineCount({viewLineCount:t,scrollBeyondLastLine:r,height:e.editorHeight,lineHeight:s,pixelRatio:n}),l=t/a,c=l/2;if(!i||i.minimapLines.length===0){const w=[];if(w[0]=1,a>1){for(let S=0,k=a-1;S<k;S++)w[S]=Math.round(S*l+c);w[a-1]=t}return[new Gp(l,w),[]]}const d=i.minimapLines,h=d.length,u=[];let g=0,f=0,_=1;const b=10;let v=[],C=null;for(let w=0;w<a;w++){const S=Math.max(_,Math.round(w*l)),k=Math.max(S,Math.round((w+1)*l));for(;g<h&&d[g]<S;){if(v.length<b){const y=g+1+f;C&&C.type===\"deleted\"&&C._oldIndex===g-1?C.deleteToLineNumber++:(C={type:\"deleted\",_oldIndex:g,deleteFromLineNumber:y,deleteToLineNumber:y},v.push(C)),f--}g++}let x;if(g<h&&d[g]<=k)x=d[g],g++;else if(w===0?x=1:w+1===a?x=t:x=Math.round(w*l+c),v.length<b){const y=g+1+f;C&&C.type===\"inserted\"&&C._i===w-1?C.insertToLineNumber++:(C={type:\"inserted\",_i:w,insertFromLineNumber:y,insertToLineNumber:y},v.push(C)),f++}u[w]=x,_=x}if(v.length<b)for(;g<h;){const w=g+1+f;C&&C.type===\"deleted\"&&C._oldIndex===g-1?C.deleteToLineNumber++:(C={type:\"deleted\",_oldIndex:g,deleteFromLineNumber:w,deleteToLineNumber:w},v.push(C)),f--,g++}else v=[{type:\"flush\"}];return[new Gp(l,u),v]}modelLineToMinimapLine(e){return Math.min(this.minimapLines.length,Math.max(1,Math.round(e/this.samplingRatio)))}modelLineRangeToMinimapLineRange(e,t){let i=this.modelLineToMinimapLine(e)-1;for(;i>0&&this.minimapLines[i-1]>=e;)i--;let n=this.modelLineToMinimapLine(t)-1;for(;n+1<this.minimapLines.length&&this.minimapLines[n+1]<=t;)n++;if(i===n){const s=this.minimapLines[i];if(s<e||s>t)return null}return[i+1,n+1]}decorationLineRangeToMinimapLineRange(e,t){let i=this.modelLineToMinimapLine(e),n=this.modelLineToMinimapLine(t);return e!==t&&n===i&&(n===this.minimapLines.length?i>1&&i--:n++),[i,n]}onLinesDeleted(e){const t=e.toLineNumber-e.fromLineNumber+1;let i=this.minimapLines.length,n=0;for(let s=this.minimapLines.length-1;s>=0&&!(this.minimapLines[s]<e.fromLineNumber);s--)this.minimapLines[s]<=e.toLineNumber?(this.minimapLines[s]=Math.max(1,e.fromLineNumber-1),i=Math.min(i,s),n=Math.max(n,s)):this.minimapLines[s]-=t;return[i,n]}onLinesInserted(e){const t=e.toLineNumber-e.fromLineNumber+1;for(let i=this.minimapLines.length-1;i>=0&&!(this.minimapLines[i]<e.fromLineNumber);i--)this.minimapLines[i]+=t}}class ej extends Es{constructor(e){super(e),this.tokensColorTracker=t_.getInstance(),this._selections=[],this._minimapSelections=null,this.options=new qp(this._context.configuration,this._context.theme,this.tokensColorTracker);const[t]=Gp.compute(this.options,this._context.viewModel.getLineCount(),null);this._samplingState=t,this._shouldCheckSampling=!1,this._actual=new rv(e.theme,this)}dispose(){this._actual.dispose(),super.dispose()}getDomNode(){return this._actual.getDomNode()}_onOptionsMaybeChanged(){const e=new qp(this._context.configuration,this._context.theme,this.tokensColorTracker);return this.options.equals(e)?!1:(this.options=e,this._recreateLineSampling(),this._actual.onDidChangeOptions(),!0)}onConfigurationChanged(e){return this._onOptionsMaybeChanged()}onCursorStateChanged(e){return this._selections=e.selections,this._minimapSelections=null,this._actual.onSelectionChanged()}onDecorationsChanged(e){return e.affectsMinimap?this._actual.onDecorationsChanged():!1}onFlushed(e){return this._samplingState&&(this._shouldCheckSampling=!0),this._actual.onFlushed()}onLinesChanged(e){if(this._samplingState){const t=this._samplingState.modelLineRangeToMinimapLineRange(e.fromLineNumber,e.fromLineNumber+e.count-1);return t?this._actual.onLinesChanged(t[0],t[1]-t[0]+1):!1}else return this._actual.onLinesChanged(e.fromLineNumber,e.count)}onLinesDeleted(e){if(this._samplingState){const[t,i]=this._samplingState.onLinesDeleted(e);return t<=i&&this._actual.onLinesChanged(t+1,i-t+1),this._shouldCheckSampling=!0,!0}else return this._actual.onLinesDeleted(e.fromLineNumber,e.toLineNumber)}onLinesInserted(e){return this._samplingState?(this._samplingState.onLinesInserted(e),this._shouldCheckSampling=!0,!0):this._actual.onLinesInserted(e.fromLineNumber,e.toLineNumber)}onScrollChanged(e){return this._actual.onScrollChanged()}onThemeChanged(e){return this._actual.onThemeChanged(),this._onOptionsMaybeChanged(),!0}onTokensChanged(e){if(this._samplingState){const t=[];for(const i of e.ranges){const n=this._samplingState.modelLineRangeToMinimapLineRange(i.fromLineNumber,i.toLineNumber);n&&t.push({fromLineNumber:n[0],toLineNumber:n[1]})}return t.length?this._actual.onTokensChanged(t):!1}else return this._actual.onTokensChanged(e.ranges)}onTokensColorsChanged(e){return this._onOptionsMaybeChanged(),this._actual.onTokensColorsChanged()}onZonesChanged(e){return this._actual.onZonesChanged()}prepareRender(e){this._shouldCheckSampling&&(this._shouldCheckSampling=!1,this._recreateLineSampling())}render(e){let t=e.visibleRange.startLineNumber,i=e.visibleRange.endLineNumber;this._samplingState&&(t=this._samplingState.modelLineToMinimapLine(t),i=this._samplingState.modelLineToMinimapLine(i));const n={viewportContainsWhitespaceGaps:e.viewportData.whitespaceViewportData.length>0,scrollWidth:e.scrollWidth,scrollHeight:e.scrollHeight,viewportStartLineNumber:t,viewportEndLineNumber:i,viewportStartLineNumberVerticalOffset:e.getVerticalOffsetForLineNumber(t),scrollTop:e.scrollTop,scrollLeft:e.scrollLeft,viewportWidth:e.viewportWidth,viewportHeight:e.viewportHeight};this._actual.render(n)}_recreateLineSampling(){this._minimapSelections=null;const e=Boolean(this._samplingState),[t,i]=Gp.compute(this.options,this._context.viewModel.getLineCount(),this._samplingState);if(this._samplingState=t,e&&this._samplingState)for(const n of i)switch(n.type){case\"deleted\":this._actual.onLinesDeleted(n.deleteFromLineNumber,n.deleteToLineNumber);break;case\"inserted\":this._actual.onLinesInserted(n.insertFromLineNumber,n.insertToLineNumber);break;case\"flush\":this._actual.onFlushed();break}}getLineCount(){return this._samplingState?this._samplingState.minimapLines.length:this._context.viewModel.getLineCount()}getRealLineCount(){return this._context.viewModel.getLineCount()}getLineContent(e){return this._samplingState?this._context.viewModel.getLineContent(this._samplingState.minimapLines[e-1]):this._context.viewModel.getLineContent(e)}getLineMaxColumn(e){return this._samplingState?this._context.viewModel.getLineMaxColumn(this._samplingState.minimapLines[e-1]):this._context.viewModel.getLineMaxColumn(e)}getMinimapLinesRenderingData(e,t,i){if(this._samplingState){const n=[];for(let s=0,r=t-e+1;s<r;s++)i[s]?n[s]=this._context.viewModel.getViewLineData(this._samplingState.minimapLines[e+s-1]):n[s]=null;return n}return this._context.viewModel.getMinimapLinesRenderingData(e,t,i).data}getSelections(){if(this._minimapSelections===null)if(this._samplingState){this._minimapSelections=[];for(const e of this._selections){const[t,i]=this._samplingState.decorationLineRangeToMinimapLineRange(e.startLineNumber,e.endLineNumber);this._minimapSelections.push(new oe(t,e.startColumn,i,e.endColumn))}}else this._minimapSelections=this._selections;return this._minimapSelections}getMinimapDecorationsInViewport(e,t){let i;if(this._samplingState){const s=this._samplingState.minimapLines[e-1],r=this._samplingState.minimapLines[t-1];i=new L(s,1,r,this._context.viewModel.getLineMaxColumn(r))}else i=new L(e,1,t,this._context.viewModel.getLineMaxColumn(t));const n=this._context.viewModel.getDecorationsInViewport(i);if(this._samplingState){const s=[];for(const r of n){if(!r.options.minimap)continue;const a=r.range,l=this._samplingState.modelLineToMinimapLine(a.startLineNumber),c=this._samplingState.modelLineToMinimapLine(a.endLineNumber);s.push(new I4(new L(l,a.startColumn,c,a.endColumn),r.options))}return s}return n}getOptions(){return this._context.viewModel.model.getOptions()}revealLineNumber(e){this._samplingState&&(e=this._samplingState.minimapLines[e-1]),this._context.viewModel.revealRange(\"mouse\",!1,new L(e,1,e,1),1,0)}setScrollTop(e){this._context.viewModel.viewLayout.setScrollPosition({scrollTop:e},1)}}class rv extends z{constructor(e,t){super(),this._renderDecorations=!1,this._gestureInProgress=!1,this._theme=e,this._model=t,this._lastRenderData=null,this._buffers=null,this._selectionColor=this._theme.getColor(qT),this._domNode=Je(document.createElement(\"div\")),jr.write(this._domNode,8),this._domNode.setClassName(this._getMinimapDomNodeClassName()),this._domNode.setPosition(\"absolute\"),this._domNode.setAttribute(\"role\",\"presentation\"),this._domNode.setAttribute(\"aria-hidden\",\"true\"),this._shadow=Je(document.createElement(\"div\")),this._shadow.setClassName(\"minimap-shadow-hidden\"),this._domNode.appendChild(this._shadow),this._canvas=Je(document.createElement(\"canvas\")),this._canvas.setPosition(\"absolute\"),this._canvas.setLeft(0),this._domNode.appendChild(this._canvas),this._decorationsCanvas=Je(document.createElement(\"canvas\")),this._decorationsCanvas.setPosition(\"absolute\"),this._decorationsCanvas.setClassName(\"minimap-decorations-layer\"),this._decorationsCanvas.setLeft(0),this._domNode.appendChild(this._decorationsCanvas),this._slider=Je(document.createElement(\"div\")),this._slider.setPosition(\"absolute\"),this._slider.setClassName(\"minimap-slider\"),this._slider.setLayerHinting(!0),this._slider.setContain(\"strict\"),this._domNode.appendChild(this._slider),this._sliderHorizontal=Je(document.createElement(\"div\")),this._sliderHorizontal.setPosition(\"absolute\"),this._sliderHorizontal.setClassName(\"minimap-slider-horizontal\"),this._slider.appendChild(this._sliderHorizontal),this._applyLayout(),this._pointerDownListener=Ei(this._domNode.domNode,le.POINTER_DOWN,i=>{if(i.preventDefault(),this._model.options.renderMinimap===0||!this._lastRenderData)return;if(this._model.options.size!==\"proportional\"){if(i.button===0&&this._lastRenderData){const c=Qi(this._slider.domNode),d=c.top+c.height/2;this._startSliderDragging(i,d,this._lastRenderData.renderedLayout)}return}const s=this._model.options.minimapLineHeight,r=this._model.options.canvasInnerHeight/this._model.options.canvasOuterHeight*i.offsetY;let l=Math.floor(r/s)+this._lastRenderData.renderedLayout.startLineNumber;l=Math.min(l,this._model.getLineCount()),this._model.revealLineNumber(l)}),this._sliderPointerMoveMonitor=new Vg,this._sliderPointerDownListener=Ei(this._slider.domNode,le.POINTER_DOWN,i=>{i.preventDefault(),i.stopPropagation(),i.button===0&&this._lastRenderData&&this._startSliderDragging(i,i.pageY,this._lastRenderData.renderedLayout)}),this._gestureDisposable=ut.addTarget(this._domNode.domNode),this._sliderTouchStartListener=q(this._domNode.domNode,kt.Start,i=>{i.preventDefault(),i.stopPropagation(),this._lastRenderData&&(this._slider.toggleClassName(\"active\",!0),this._gestureInProgress=!0,this.scrollDueToTouchEvent(i))},{passive:!1}),this._sliderTouchMoveListener=q(this._domNode.domNode,kt.Change,i=>{i.preventDefault(),i.stopPropagation(),this._lastRenderData&&this._gestureInProgress&&this.scrollDueToTouchEvent(i)},{passive:!1}),this._sliderTouchEndListener=Ei(this._domNode.domNode,kt.End,i=>{i.preventDefault(),i.stopPropagation(),this._gestureInProgress=!1,this._slider.toggleClassName(\"active\",!1)})}_startSliderDragging(e,t,i){if(!e.target||!(e.target instanceof Element))return;const n=e.pageX;this._slider.toggleClassName(\"active\",!0);const s=(r,a)=>{const l=Math.abs(a-n);if(nn&&l>Q$){this._model.setScrollTop(i.scrollTop);return}const c=r-t;this._model.setScrollTop(i.getDesiredScrollTopFromDelta(c))};e.pageY!==t&&s(e.pageY,n),this._sliderPointerMoveMonitor.startMonitoring(e.target,e.pointerId,e.buttons,r=>s(r.pageY,r.pageX),()=>{this._slider.toggleClassName(\"active\",!1)})}scrollDueToTouchEvent(e){const t=this._domNode.domNode.getBoundingClientRect().top,i=this._lastRenderData.renderedLayout.getDesiredScrollTopFromTouchLocation(e.pageY-t);this._model.setScrollTop(i)}dispose(){this._pointerDownListener.dispose(),this._sliderPointerMoveMonitor.dispose(),this._sliderPointerDownListener.dispose(),this._gestureDisposable.dispose(),this._sliderTouchStartListener.dispose(),this._sliderTouchMoveListener.dispose(),this._sliderTouchEndListener.dispose(),super.dispose()}_getMinimapDomNodeClassName(){const e=[\"minimap\"];return this._model.options.showSlider===\"always\"?e.push(\"slider-always\"):e.push(\"slider-mouseover\"),this._model.options.autohide&&e.push(\"autohide\"),e.join(\" \")}getDomNode(){return this._domNode}_applyLayout(){this._domNode.setLeft(this._model.options.minimapLeft),this._domNode.setWidth(this._model.options.minimapWidth),this._domNode.setHeight(this._model.options.minimapHeight),this._shadow.setHeight(this._model.options.minimapHeight),this._canvas.setWidth(this._model.options.canvasOuterWidth),this._canvas.setHeight(this._model.options.canvasOuterHeight),this._canvas.domNode.width=this._model.options.canvasInnerWidth,this._canvas.domNode.height=this._model.options.canvasInnerHeight,this._decorationsCanvas.setWidth(this._model.options.canvasOuterWidth),this._decorationsCanvas.setHeight(this._model.options.canvasOuterHeight),this._decorationsCanvas.domNode.width=this._model.options.canvasInnerWidth,this._decorationsCanvas.domNode.height=this._model.options.canvasInnerHeight,this._slider.setWidth(this._model.options.minimapWidth)}_getBuffer(){return this._buffers||this._model.options.canvasInnerWidth>0&&this._model.options.canvasInnerHeight>0&&(this._buffers=new NI(this._canvas.domNode.getContext(\"2d\"),this._model.options.canvasInnerWidth,this._model.options.canvasInnerHeight,this._model.options.backgroundColor)),this._buffers?this._buffers.getBuffer():null}onDidChangeOptions(){this._lastRenderData=null,this._buffers=null,this._applyLayout(),this._domNode.setClassName(this._getMinimapDomNodeClassName())}onSelectionChanged(){return this._renderDecorations=!0,!0}onDecorationsChanged(){return this._renderDecorations=!0,!0}onFlushed(){return this._lastRenderData=null,!0}onLinesChanged(e,t){return this._lastRenderData?this._lastRenderData.onLinesChanged(e,t):!1}onLinesDeleted(e,t){var i;return(i=this._lastRenderData)===null||i===void 0||i.onLinesDeleted(e,t),!0}onLinesInserted(e,t){var i;return(i=this._lastRenderData)===null||i===void 0||i.onLinesInserted(e,t),!0}onScrollChanged(){return this._renderDecorations=!0,!0}onThemeChanged(){return this._selectionColor=this._theme.getColor(qT),this._renderDecorations=!0,!0}onTokensChanged(e){return this._lastRenderData?this._lastRenderData.onTokensChanged(e):!1}onTokensColorsChanged(){return this._lastRenderData=null,this._buffers=null,!0}onZonesChanged(){return this._lastRenderData=null,!0}render(e){if(this._model.options.renderMinimap===0){this._shadow.setClassName(\"minimap-shadow-hidden\"),this._sliderHorizontal.setWidth(0),this._sliderHorizontal.setHeight(0);return}e.scrollLeft+e.viewportWidth>=e.scrollWidth?this._shadow.setClassName(\"minimap-shadow-hidden\"):this._shadow.setClassName(\"minimap-shadow-visible\");const i=np.create(this._model.options,e.viewportStartLineNumber,e.viewportEndLineNumber,e.viewportStartLineNumberVerticalOffset,e.viewportHeight,e.viewportContainsWhitespaceGaps,this._model.getLineCount(),this._model.getRealLineCount(),e.scrollTop,e.scrollHeight,this._lastRenderData?this._lastRenderData.renderedLayout:null);this._slider.setDisplay(i.sliderNeeded?\"block\":\"none\"),this._slider.setTop(i.sliderTop),this._slider.setHeight(i.sliderHeight),this._sliderHorizontal.setLeft(0),this._sliderHorizontal.setWidth(this._model.options.minimapWidth),this._sliderHorizontal.setTop(0),this._sliderHorizontal.setHeight(i.sliderHeight),this.renderDecorations(i),this._lastRenderData=this.renderLines(i)}renderDecorations(e){if(this._renderDecorations){this._renderDecorations=!1;const t=this._model.getSelections();t.sort(L.compareRangesUsingStarts);const i=this._model.getMinimapDecorationsInViewport(e.startLineNumber,e.endLineNumber);i.sort((u,g)=>(u.options.zIndex||0)-(g.options.zIndex||0));const{canvasInnerWidth:n,canvasInnerHeight:s}=this._model.options,r=this._model.options.minimapLineHeight,a=this._model.options.minimapCharWidth,l=this._model.getOptions().tabSize,c=this._decorationsCanvas.domNode.getContext(\"2d\");c.clearRect(0,0,n,s);const d=new d2(e.startLineNumber,e.endLineNumber,!1);this._renderSelectionLineHighlights(c,t,d,e,r),this._renderDecorationsLineHighlights(c,i,d,e,r);const h=new d2(e.startLineNumber,e.endLineNumber,null);this._renderSelectionsHighlights(c,t,h,e,r,l,a,n),this._renderDecorationsHighlights(c,i,h,e,r,l,a,n)}}_renderSelectionLineHighlights(e,t,i,n,s){if(!this._selectionColor||this._selectionColor.isTransparent())return;e.fillStyle=this._selectionColor.transparent(.5).toString();let r=0,a=0;for(const l of t){const c=Math.max(n.startLineNumber,l.startLineNumber),d=Math.min(n.endLineNumber,l.endLineNumber);if(c>d)continue;for(let g=c;g<=d;g++)i.set(g,!0);const h=(c-n.startLineNumber)*s,u=(d-n.startLineNumber)*s+s;a>=h||(a>r&&e.fillRect(Sl,r,e.canvas.width,a-r),r=h),a=u}a>r&&e.fillRect(Sl,r,e.canvas.width,a-r)}_renderDecorationsLineHighlights(e,t,i,n,s){const r=new Map;for(let a=t.length-1;a>=0;a--){const l=t[a],c=l.options.minimap;if(!c||c.position!==js.Inline)continue;const d=Math.max(n.startLineNumber,l.range.startLineNumber),h=Math.min(n.endLineNumber,l.range.endLineNumber);if(d>h)continue;const u=c.getColor(this._theme.value);if(!u||u.isTransparent())continue;let g=r.get(u.toString());g||(g=u.transparent(.5).toString(),r.set(u.toString(),g)),e.fillStyle=g;for(let f=d;f<=h;f++){if(i.has(f))continue;i.set(f,!0);const _=(d-n.startLineNumber)*s;e.fillRect(Sl,_,e.canvas.width,s)}}}_renderSelectionsHighlights(e,t,i,n,s,r,a,l){if(!(!this._selectionColor||this._selectionColor.isTransparent()))for(const c of t){const d=Math.max(n.startLineNumber,c.startLineNumber),h=Math.min(n.endLineNumber,c.endLineNumber);if(!(d>h))for(let u=d;u<=h;u++)this.renderDecorationOnLine(e,i,c,this._selectionColor,n,u,s,s,r,a,l)}}_renderDecorationsHighlights(e,t,i,n,s,r,a,l){for(const c of t){const d=c.options.minimap;if(!d)continue;const h=Math.max(n.startLineNumber,c.range.startLineNumber),u=Math.min(n.endLineNumber,c.range.endLineNumber);if(h>u)continue;const g=d.getColor(this._theme.value);if(!(!g||g.isTransparent()))for(let f=h;f<=u;f++)switch(d.position){case js.Inline:this.renderDecorationOnLine(e,i,c.range,g,n,f,s,s,r,a,l);continue;case js.Gutter:{const _=(f-n.startLineNumber)*s,b=2;this.renderDecoration(e,g,b,_,J$,s);continue}}}}renderDecorationOnLine(e,t,i,n,s,r,a,l,c,d,h){const u=(r-s.startLineNumber)*l;if(u+a<0||u>this._model.options.canvasInnerHeight)return;const{startLineNumber:g,endLineNumber:f}=i,_=g===r?i.startColumn:1,b=f===r?i.endColumn:this._model.getLineMaxColumn(r),v=this.getXOffsetForPosition(t,r,_,c,d,h),C=this.getXOffsetForPosition(t,r,b,c,d,h);this.renderDecoration(e,n,v,u,C-v,a)}getXOffsetForPosition(e,t,i,n,s,r){if(i===1)return Sl;if((i-1)*s>=r)return r;let l=e.get(t);if(!l){const c=this._model.getLineContent(t);l=[Sl];let d=Sl;for(let h=1;h<c.length+1;h++){const u=c.charCodeAt(h-1),g=u===9?n*s:oc(u)?2*s:s,f=d+g;if(f>=r){l[h]=r;break}l[h]=f,d=f}e.set(t,l)}return i-1<l.length?l[i-1]:r}renderDecoration(e,t,i,n,s,r){e.fillStyle=t&&t.toString()||\"\",e.fillRect(i,n,s,r)}renderLines(e){const t=e.startLineNumber,i=e.endLineNumber,n=this._model.options.minimapLineHeight;if(this._lastRenderData&&this._lastRenderData.linesEquals(e)){const ae=this._lastRenderData._get();return new c2(e,ae.imageData,ae.lines)}const s=this._getBuffer();if(!s)return null;const[r,a,l]=rv._renderUntouchedLines(s,t,i,n,this._lastRenderData),c=this._model.getMinimapLinesRenderingData(t,i,l),d=this._model.getOptions().tabSize,h=this._model.options.defaultBackgroundColor,u=this._model.options.backgroundColor,g=this._model.options.foregroundAlpha,f=this._model.tokensColorTracker,_=f.backgroundIsLight(),b=this._model.options.renderMinimap,v=this._model.options.charRenderer(),C=this._model.options.fontScale,w=this._model.options.minimapCharWidth,k=(b===1?2:2+1)*C,x=n>k?Math.floor((n-k)/2):0,y=u.a/255,D=new zs(Math.round((u.r-h.r)*y+h.r),Math.round((u.g-h.g)*y+h.g),Math.round((u.b-h.b)*y+h.b),255);let I=0;const R=[];for(let ae=0,de=i-t+1;ae<de;ae++)l[ae]&&rv._renderLine(s,D,u.a,_,b,w,f,g,v,I,x,d,c[ae],C,n),R[ae]=new ov(I),I+=n;const P=r===-1?0:r,$=(a===-1?s.height:a)-P;return this._canvas.domNode.getContext(\"2d\").putImageData(s,0,0,0,P,s.width,$),new c2(e,s,R)}static _renderUntouchedLines(e,t,i,n,s){const r=[];if(!s){for(let D=0,I=i-t+1;D<I;D++)r[D]=!0;return[-1,-1,r]}const a=s._get(),l=a.imageData.data,c=a.rendLineNumberStart,d=a.lines,h=d.length,u=e.width,g=e.data,f=(i-t+1)*n*u*4;let _=-1,b=-1,v=-1,C=-1,w=-1,S=-1,k=0;for(let D=t;D<=i;D++){const I=D-t,R=D-c,P=R>=0&&R<h?d[R].dy:-1;if(P===-1){r[I]=!0,k+=n;continue}const H=P*u*4,$=(P+n)*u*4,ne=k*u*4,ae=(k+n)*u*4;C===H&&S===ne?(C=$,S=ae):(v!==-1&&(g.set(l.subarray(v,C),w),_===-1&&v===0&&v===w&&(_=C),b===-1&&C===f&&v===w&&(b=v)),v=H,C=$,w=ne,S=ae),r[I]=!1,k+=n}v!==-1&&(g.set(l.subarray(v,C),w),_===-1&&v===0&&v===w&&(_=C),b===-1&&C===f&&v===w&&(b=v));const x=_===-1?-1:_/(u*4),y=b===-1?-1:b/(u*4);return[x,y,r]}static _renderLine(e,t,i,n,s,r,a,l,c,d,h,u,g,f,_){const b=g.content,v=g.tokens,C=e.width-r,w=_===1;let S=Sl,k=0,x=0;for(let y=0,D=v.getCount();y<D;y++){const I=v.getEndOffset(y),R=v.getForeground(y),P=a.getColor(R);for(;k<I;k++){if(S>C)return;const H=b.charCodeAt(k);if(H===9){const $=u-(k+x)%u;x+=$-1,S+=$*r}else if(H===32)S+=r;else{const $=oc(H)?2:1;for(let ne=0;ne<$;ne++)if(s===2?c.blockRenderChar(e,S,d+h,P,l,t,i,w):c.renderChar(e,S,d+h,H,P,l,t,i,f,n,w),S+=r,S>C)return}}}}}class d2{constructor(e,t,i){this._startLineNumber=e,this._endLineNumber=t,this._defaultValue=i,this._values=[];for(let n=0,s=this._endLineNumber-this._startLineNumber+1;n<s;n++)this._values[n]=i}has(e){return this.get(e)!==this._defaultValue}set(e,t){e<this._startLineNumber||e>this._endLineNumber||(this._values[e-this._startLineNumber]=t)}get(e){return e<this._startLineNumber||e>this._endLineNumber?this._defaultValue:this._values[e-this._startLineNumber]}}Rt((o,e)=>{const t=o.getColor(Bz);t&&e.addRule(`.monaco-editor .minimap-slider .minimap-slider-horizontal { background: ${t}; }`);const i=o.getColor(Wz);i&&e.addRule(`.monaco-editor .minimap-slider:hover .minimap-slider-horizontal { background: ${i}; }`);const n=o.getColor(Vz);n&&e.addRule(`.monaco-editor .minimap-slider.active .minimap-slider-horizontal { background: ${n}; }`);const s=o.getColor(Hg);s&&e.addRule(`.monaco-editor .minimap-shadow-visible { box-shadow: ${s} -6px 0 6px -6px inset; }`)});class tj extends Es{constructor(e){super(e);const i=this._context.configuration.options.get(133);this._widgets={},this._verticalScrollbarWidth=i.verticalScrollbarWidth,this._minimapWidth=i.minimap.minimapWidth,this._horizontalScrollbarHeight=i.horizontalScrollbarHeight,this._editorHeight=i.height,this._editorWidth=i.width,this._domNode=Je(document.createElement(\"div\")),jr.write(this._domNode,4),this._domNode.setClassName(\"overlayWidgets\")}dispose(){super.dispose(),this._widgets={}}getDomNode(){return this._domNode}onConfigurationChanged(e){const i=this._context.configuration.options.get(133);return this._verticalScrollbarWidth=i.verticalScrollbarWidth,this._minimapWidth=i.minimap.minimapWidth,this._horizontalScrollbarHeight=i.horizontalScrollbarHeight,this._editorHeight=i.height,this._editorWidth=i.width,!0}addWidget(e){const t=Je(e.getDomNode());this._widgets[e.getId()]={widget:e,preference:null,domNode:t},t.setPosition(\"absolute\"),t.setAttribute(\"widgetId\",e.getId()),this._domNode.appendChild(t),this.setShouldRender()}setWidgetPosition(e,t){const i=this._widgets[e.getId()];return i.preference===t?!1:(i.preference=t,this.setShouldRender(),!0)}removeWidget(e){const t=e.getId();if(this._widgets.hasOwnProperty(t)){const n=this._widgets[t].domNode.domNode;delete this._widgets[t],n.parentNode.removeChild(n),this.setShouldRender()}}_renderWidget(e){const t=e.domNode;if(e.preference===null){t.setTop(\"\");return}if(e.preference===0)t.setTop(0),t.setRight(2*this._verticalScrollbarWidth+this._minimapWidth);else if(e.preference===1){const i=t.domNode.clientHeight;t.setTop(this._editorHeight-i-2*this._horizontalScrollbarHeight),t.setRight(2*this._verticalScrollbarWidth+this._minimapWidth)}else e.preference===2&&(t.setTop(0),t.domNode.style.right=\"50%\")}prepareRender(e){}render(e){this._domNode.setWidth(this._editorWidth);const t=Object.keys(this._widgets);for(let i=0,n=t.length;i<n;i++){const s=t[i];this._renderWidget(this._widgets[s])}}}class ij{constructor(e,t){const i=e.options;this.lineHeight=i.get(61),this.pixelRatio=i.get(131),this.overviewRulerLanes=i.get(76),this.renderBorder=i.get(75);const n=t.getColor(BU);this.borderColor=n?n.toString():null,this.hideCursor=i.get(54);const s=t.getColor(h4);this.cursorColor=s?s.transparent(.7).toString():null,this.themeType=t.type;const r=i.get(67),a=r.enabled,l=r.side,c=t.getColor(WU),d=Jt.getDefaultBackground();let h=null;c!==void 0?h=c:a&&(h=d),h===null||l===\"left\"?this.backgroundColor=null:this.backgroundColor=W.Format.CSS.formatHex(h);const g=i.get(133).overviewRuler;this.top=g.top,this.right=g.right,this.domWidth=g.width,this.domHeight=g.height,this.overviewRulerLanes===0?(this.canvasWidth=0,this.canvasHeight=0):(this.canvasWidth=this.domWidth*this.pixelRatio|0,this.canvasHeight=this.domHeight*this.pixelRatio|0);const[f,_]=this._initLanes(1,this.canvasWidth,this.overviewRulerLanes);this.x=f,this.w=_}_initLanes(e,t,i){const n=t-e;if(i>=3){const s=Math.floor(n/3),r=Math.floor(n/3),a=n-s-r,l=e,c=l+s,d=l+s+a;return[[0,l,c,l,d,l,c,l],[0,s,a,s+a,r,s+a+r,a+r,s+a+r]]}else if(i===2){const s=Math.floor(n/2),r=n-s,a=e,l=a+s;return[[0,a,a,a,l,a,a,a],[0,s,s,s,r,s+r,s+r,s+r]]}else{const s=e,r=n;return[[0,s,s,s,s,s,s,s],[0,r,r,r,r,r,r,r]]}}equals(e){return this.lineHeight===e.lineHeight&&this.pixelRatio===e.pixelRatio&&this.overviewRulerLanes===e.overviewRulerLanes&&this.renderBorder===e.renderBorder&&this.borderColor===e.borderColor&&this.hideCursor===e.hideCursor&&this.cursorColor===e.cursorColor&&this.themeType===e.themeType&&this.backgroundColor===e.backgroundColor&&this.top===e.top&&this.right===e.right&&this.domWidth===e.domWidth&&this.domHeight===e.domHeight&&this.canvasWidth===e.canvasWidth&&this.canvasHeight===e.canvasHeight}}class nj extends Es{constructor(e){super(e),this._domNode=Je(document.createElement(\"canvas\")),this._domNode.setClassName(\"decorationsOverviewRuler\"),this._domNode.setPosition(\"absolute\"),this._domNode.setLayerHinting(!0),this._domNode.setContain(\"strict\"),this._domNode.setAttribute(\"aria-hidden\",\"true\"),this._updateSettings(!1),this._tokensColorTrackerListener=Jt.onDidChange(t=>{t.changedColorMap&&this._updateSettings(!0)}),this._cursorPositions=[]}dispose(){super.dispose(),this._tokensColorTrackerListener.dispose()}_updateSettings(e){const t=new ij(this._context.configuration,this._context.theme);return this._settings&&this._settings.equals(t)?!1:(this._settings=t,this._domNode.setTop(this._settings.top),this._domNode.setRight(this._settings.right),this._domNode.setWidth(this._settings.domWidth),this._domNode.setHeight(this._settings.domHeight),this._domNode.domNode.width=this._settings.canvasWidth,this._domNode.domNode.height=this._settings.canvasHeight,e&&this._render(),!0)}onConfigurationChanged(e){return this._updateSettings(!1)}onCursorStateChanged(e){this._cursorPositions=[];for(let t=0,i=e.selections.length;t<i;t++)this._cursorPositions[t]=e.selections[t].getPosition();return this._cursorPositions.sort(B.compare),!0}onDecorationsChanged(e){return!!e.affectsOverviewRuler}onFlushed(e){return!0}onScrollChanged(e){return e.scrollHeightChanged}onZonesChanged(e){return!0}onThemeChanged(e){return this._updateSettings(!1)}getDomNode(){return this._domNode.domNode}prepareRender(e){}render(e){this._render()}_render(){if(this._settings.overviewRulerLanes===0){this._domNode.setBackgroundColor(this._settings.backgroundColor?this._settings.backgroundColor:\"\"),this._domNode.setDisplay(\"none\");return}this._domNode.setDisplay(\"block\");const e=this._settings.canvasWidth,t=this._settings.canvasHeight,i=this._settings.lineHeight,n=this._context.viewLayout,s=this._context.viewLayout.getScrollHeight(),r=t/s,a=this._context.viewModel.getAllOverviewRulerDecorations(this._context.theme),l=6*this._settings.pixelRatio|0,c=l/2|0,d=this._domNode.domNode.getContext(\"2d\");this._settings.backgroundColor===null?d.clearRect(0,0,e,t):(d.fillStyle=this._settings.backgroundColor,d.fillRect(0,0,e,t));const h=this._settings.x,u=this._settings.w;a.sort(E4.cmp);for(const g of a){const f=g.color,_=g.data;d.fillStyle=f;let b=0,v=0,C=0;for(let w=0,S=_.length/3;w<S;w++){const k=_[3*w],x=_[3*w+1],y=_[3*w+2];let D=n.getVerticalOffsetForLineNumber(x)*r|0,I=(n.getVerticalOffsetForLineNumber(y)+i)*r|0;if(I-D<l){let P=(D+I)/2|0;P<c?P=c:P+c>t&&(P=t-c),D=P-c,I=P+c}D>C+1||k!==b?(w!==0&&d.fillRect(h[b],v,u[b],C-v),b=k,v=D,C=I):I>C&&(C=I)}d.fillRect(h[b],v,u[b],C-v)}if(!this._settings.hideCursor&&this._settings.cursorColor){const g=2*this._settings.pixelRatio|0,f=g/2|0,_=this._settings.x[7],b=this._settings.w[7];d.fillStyle=this._settings.cursorColor;let v=-100,C=-100;for(let w=0,S=this._cursorPositions.length;w<S;w++){const k=this._cursorPositions[w];let x=n.getVerticalOffsetForLineNumber(k.lineNumber)*r|0;x<f?x=f:x+f>t&&(x=t-f);const y=x-f,D=y+g;y>C+1?(w!==0&&d.fillRect(_,v,b,C-v),v=y,C=D):D>C&&(C=D)}d.fillRect(_,v,b,C-v)}this._settings.renderBorder&&this._settings.borderColor&&this._settings.overviewRulerLanes>0&&(d.beginPath(),d.lineWidth=1,d.strokeStyle=this._settings.borderColor,d.moveTo(0,0),d.lineTo(0,t),d.stroke(),d.moveTo(0,0),d.lineTo(e,0),d.stroke())}}class h2{constructor(e,t,i){this._colorZoneBrand=void 0,this.from=e|0,this.to=t|0,this.colorId=i|0}static compare(e,t){return e.colorId===t.colorId?e.from===t.from?e.to-t.to:e.from-t.from:e.colorId-t.colorId}}class Zp{constructor(e,t,i,n){this._overviewRulerZoneBrand=void 0,this.startLineNumber=e,this.endLineNumber=t,this.heightInLines=i,this.color=n,this._colorZone=null}static compare(e,t){return e.color===t.color?e.startLineNumber===t.startLineNumber?e.heightInLines===t.heightInLines?e.endLineNumber-t.endLineNumber:e.heightInLines-t.heightInLines:e.startLineNumber-t.startLineNumber:e.color<t.color?-1:1}setColorZone(e){this._colorZone=e}getColorZones(){return this._colorZone}}class sj{constructor(e){this._getVerticalOffsetForLine=e,this._zones=[],this._colorZonesInvalid=!1,this._lineHeight=0,this._domWidth=0,this._domHeight=0,this._outerHeight=0,this._pixelRatio=1,this._lastAssignedId=0,this._color2Id=Object.create(null),this._id2Color=[]}getId2Color(){return this._id2Color}setZones(e){this._zones=e,this._zones.sort(Zp.compare)}setLineHeight(e){return this._lineHeight===e?!1:(this._lineHeight=e,this._colorZonesInvalid=!0,!0)}setPixelRatio(e){this._pixelRatio=e,this._colorZonesInvalid=!0}getDOMWidth(){return this._domWidth}getCanvasWidth(){return this._domWidth*this._pixelRatio}setDOMWidth(e){return this._domWidth===e?!1:(this._domWidth=e,this._colorZonesInvalid=!0,!0)}getDOMHeight(){return this._domHeight}getCanvasHeight(){return this._domHeight*this._pixelRatio}setDOMHeight(e){return this._domHeight===e?!1:(this._domHeight=e,this._colorZonesInvalid=!0,!0)}getOuterHeight(){return this._outerHeight}setOuterHeight(e){return this._outerHeight===e?!1:(this._outerHeight=e,this._colorZonesInvalid=!0,!0)}resolveColorZones(){const e=this._colorZonesInvalid,t=Math.floor(this._lineHeight),i=Math.floor(this.getCanvasHeight()),n=Math.floor(this._outerHeight),s=i/n,r=Math.floor(4*this._pixelRatio/2),a=[];for(let l=0,c=this._zones.length;l<c;l++){const d=this._zones[l];if(!e){const S=d.getColorZones();if(S){a.push(S);continue}}const h=this._getVerticalOffsetForLine(d.startLineNumber),u=d.heightInLines===0?this._getVerticalOffsetForLine(d.endLineNumber)+t:h+d.heightInLines*t,g=Math.floor(s*h),f=Math.floor(s*u);let _=Math.floor((g+f)/2),b=f-_;b<r&&(b=r),_-b<0&&(_=b),_+b>i&&(_=i-b);const v=d.color;let C=this._color2Id[v];C||(C=++this._lastAssignedId,this._color2Id[v]=C,this._id2Color[C]=v);const w=new h2(_-b,_+b,C);d.setColorZone(w),a.push(w)}return this._colorZonesInvalid=!1,a.sort(h2.compare),a}}class oj extends Zm{constructor(e,t){super(),this._context=e;const i=this._context.configuration.options;this._domNode=Je(document.createElement(\"canvas\")),this._domNode.setClassName(t),this._domNode.setPosition(\"absolute\"),this._domNode.setLayerHinting(!0),this._domNode.setContain(\"strict\"),this._zoneManager=new sj(n=>this._context.viewLayout.getVerticalOffsetForLineNumber(n)),this._zoneManager.setDOMWidth(0),this._zoneManager.setDOMHeight(0),this._zoneManager.setOuterHeight(this._context.viewLayout.getScrollHeight()),this._zoneManager.setLineHeight(i.get(61)),this._zoneManager.setPixelRatio(i.get(131)),this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),super.dispose()}onConfigurationChanged(e){const t=this._context.configuration.options;return e.hasChanged(61)&&(this._zoneManager.setLineHeight(t.get(61)),this._render()),e.hasChanged(131)&&(this._zoneManager.setPixelRatio(t.get(131)),this._domNode.setWidth(this._zoneManager.getDOMWidth()),this._domNode.setHeight(this._zoneManager.getDOMHeight()),this._domNode.domNode.width=this._zoneManager.getCanvasWidth(),this._domNode.domNode.height=this._zoneManager.getCanvasHeight(),this._render()),!0}onFlushed(e){return this._render(),!0}onScrollChanged(e){return e.scrollHeightChanged&&(this._zoneManager.setOuterHeight(e.scrollHeight),this._render()),!0}onZonesChanged(e){return this._render(),!0}getDomNode(){return this._domNode.domNode}setLayout(e){this._domNode.setTop(e.top),this._domNode.setRight(e.right);let t=!1;t=this._zoneManager.setDOMWidth(e.width)||t,t=this._zoneManager.setDOMHeight(e.height)||t,t&&(this._domNode.setWidth(this._zoneManager.getDOMWidth()),this._domNode.setHeight(this._zoneManager.getDOMHeight()),this._domNode.domNode.width=this._zoneManager.getCanvasWidth(),this._domNode.domNode.height=this._zoneManager.getCanvasHeight(),this._render())}setZones(e){this._zoneManager.setZones(e),this._render()}_render(){if(this._zoneManager.getOuterHeight()===0)return!1;const e=this._zoneManager.getCanvasWidth(),t=this._zoneManager.getCanvasHeight(),i=this._zoneManager.resolveColorZones(),n=this._zoneManager.getId2Color(),s=this._domNode.domNode.getContext(\"2d\");return s.clearRect(0,0,e,t),i.length>0&&this._renderOneLane(s,i,n,e),!0}_renderOneLane(e,t,i,n){let s=0,r=0,a=0;for(const l of t){const c=l.colorId,d=l.from,h=l.to;c!==s?(e.fillRect(0,r,n,a-r),s=c,e.fillStyle=i[s],r=d,a=h):a>=d?a=Math.max(a,h):(e.fillRect(0,r,n,a-r),r=d,a=h)}e.fillRect(0,r,n,a-r)}}class rj extends Es{constructor(e){super(e),this.domNode=Je(document.createElement(\"div\")),this.domNode.setAttribute(\"role\",\"presentation\"),this.domNode.setAttribute(\"aria-hidden\",\"true\"),this.domNode.setClassName(\"view-rulers\"),this._renderedRulers=[];const t=this._context.configuration.options;this._rulers=t.get(93),this._typicalHalfwidthCharacterWidth=t.get(46).typicalHalfwidthCharacterWidth}dispose(){super.dispose()}onConfigurationChanged(e){const t=this._context.configuration.options;return this._rulers=t.get(93),this._typicalHalfwidthCharacterWidth=t.get(46).typicalHalfwidthCharacterWidth,!0}onScrollChanged(e){return e.scrollHeightChanged}prepareRender(e){}_ensureRulersCount(){const e=this._renderedRulers.length,t=this._rulers.length;if(e===t)return;if(e<t){const{tabSize:n}=this._context.viewModel.model.getOptions(),s=n;let r=t-e;for(;r>0;){const a=Je(document.createElement(\"div\"));a.setClassName(\"view-ruler\"),a.setWidth(s),this.domNode.appendChild(a),this._renderedRulers.push(a),r--}return}let i=e-t;for(;i>0;){const n=this._renderedRulers.pop();this.domNode.removeChild(n),i--}}render(e){this._ensureRulersCount();for(let t=0,i=this._rulers.length;t<i;t++){const n=this._renderedRulers[t],s=this._rulers[t];n.setBoxShadow(s.color?`1px 0 0 0 ${s.color} inset`:\"\"),n.setHeight(Math.min(e.scrollHeight,1e6)),n.setLeft(s.column*this._typicalHalfwidthCharacterWidth)}}}Rt((o,e)=>{const t=o.getColor(PU);t&&e.addRule(`.monaco-editor .view-ruler { box-shadow: 1px 0 0 0 ${t} inset; }`)});class aj extends Es{constructor(e){super(e),this._scrollTop=0,this._width=0,this._updateWidth(),this._shouldShow=!1;const i=this._context.configuration.options.get(94);this._useShadows=i.useShadows,this._domNode=Je(document.createElement(\"div\")),this._domNode.setAttribute(\"role\",\"presentation\"),this._domNode.setAttribute(\"aria-hidden\",\"true\")}dispose(){super.dispose()}_updateShouldShow(){const e=this._useShadows&&this._scrollTop>0;return this._shouldShow!==e?(this._shouldShow=e,!0):!1}getDomNode(){return this._domNode}_updateWidth(){const t=this._context.configuration.options.get(133);t.minimap.renderMinimap===0||t.minimap.minimapWidth>0&&t.minimap.minimapLeft===0?this._width=t.width:this._width=t.width-t.verticalScrollbarWidth}onConfigurationChanged(e){const i=this._context.configuration.options.get(94);return this._useShadows=i.useShadows,this._updateWidth(),this._updateShouldShow(),!0}onScrollChanged(e){return this._scrollTop=e.scrollTop,this._updateShouldShow()}prepareRender(e){}render(e){this._domNode.setWidth(this._width),this._domNode.setClassName(this._shouldShow?\"scroll-decoration\":\"\")}}Rt((o,e)=>{const t=o.getColor(Hg);t&&e.addRule(`.monaco-editor .scroll-decoration { box-shadow: ${t} 0 6px 6px -6px inset; }`)});class lj{constructor(e){this.left=e.left,this.width=e.width,this.startStyle=null,this.endStyle=null}}class cj{constructor(e,t){this.lineNumber=e,this.ranges=t}}function dj(o){return new lj(o)}function hj(o){return new cj(o.lineNumber,o.ranges.map(dj))}class jt extends zg{constructor(e){super(),this._previousFrameVisibleRangesWithStyle=[],this._context=e;const t=this._context.configuration.options;this._lineHeight=t.get(61),this._roundedSelection=t.get(92),this._typicalHalfwidthCharacterWidth=t.get(46).typicalHalfwidthCharacterWidth,this._selections=[],this._renderResult=null,this._context.addEventHandler(this)}dispose(){this._context.removeEventHandler(this),this._renderResult=null,super.dispose()}onConfigurationChanged(e){const t=this._context.configuration.options;return this._lineHeight=t.get(61),this._roundedSelection=t.get(92),this._typicalHalfwidthCharacterWidth=t.get(46).typicalHalfwidthCharacterWidth,!0}onCursorStateChanged(e){return this._selections=e.selections.slice(0),!0}onDecorationsChanged(e){return!0}onFlushed(e){return!0}onLinesChanged(e){return!0}onLinesDeleted(e){return!0}onLinesInserted(e){return!0}onScrollChanged(e){return e.scrollTopChanged}onZonesChanged(e){return!0}_visibleRangesHaveGaps(e){for(let t=0,i=e.length;t<i;t++)if(e[t].ranges.length>1)return!0;return!1}_enrichVisibleRangesWithStyle(e,t,i){const n=this._typicalHalfwidthCharacterWidth/4;let s=null,r=null;if(i&&i.length>0&&t.length>0){const a=t[0].lineNumber;if(a===e.startLineNumber)for(let c=0;!s&&c<i.length;c++)i[c].lineNumber===a&&(s=i[c].ranges[0]);const l=t[t.length-1].lineNumber;if(l===e.endLineNumber)for(let c=i.length-1;!r&&c>=0;c--)i[c].lineNumber===l&&(r=i[c].ranges[0]);s&&!s.startStyle&&(s=null),r&&!r.startStyle&&(r=null)}for(let a=0,l=t.length;a<l;a++){const c=t[a].ranges[0],d=c.left,h=c.left+c.width,u={top:0,bottom:0},g={top:0,bottom:0};if(a>0){const f=t[a-1].ranges[0].left,_=t[a-1].ranges[0].left+t[a-1].ranges[0].width;Z_(d-f)<n?u.top=2:d>f&&(u.top=1),Z_(h-_)<n?g.top=2:f<h&&h<_&&(g.top=1)}else s&&(u.top=s.startStyle.top,g.top=s.endStyle.top);if(a+1<l){const f=t[a+1].ranges[0].left,_=t[a+1].ranges[0].left+t[a+1].ranges[0].width;Z_(d-f)<n?u.bottom=2:f<d&&d<_&&(u.bottom=1),Z_(h-_)<n?g.bottom=2:h<_&&(g.bottom=1)}else r&&(u.bottom=r.startStyle.bottom,g.bottom=r.endStyle.bottom);c.startStyle=u,c.endStyle=g}}_getVisibleRangesWithStyle(e,t,i){const s=(t.linesVisibleRangesForRange(e,!0)||[]).map(hj);return!this._visibleRangesHaveGaps(s)&&this._roundedSelection&&this._enrichVisibleRangesWithStyle(t.visibleRange,s,i),s}_createSelectionPiece(e,t,i,n,s){return'<div class=\"cslr '+i+'\" style=\"top:'+e.toString()+\"px;left:\"+n.toString()+\"px;width:\"+s.toString()+\"px;height:\"+t+'px;\"></div>'}_actualRenderOneSelection(e,t,i,n){if(n.length===0)return;const s=!!n[0].ranges[0].startStyle,r=this._lineHeight.toString(),a=(this._lineHeight-1).toString(),l=n[0].lineNumber,c=n[n.length-1].lineNumber;for(let d=0,h=n.length;d<h;d++){const u=n[d],g=u.lineNumber,f=g-t,_=i&&(g===c||g===l)?a:r,b=i&&g===l?1:0;let v=\"\",C=\"\";for(let w=0,S=u.ranges.length;w<S;w++){const k=u.ranges[w];if(s){const y=k.startStyle,D=k.endStyle;if(y.top===1||y.bottom===1){v+=this._createSelectionPiece(b,_,jt.SELECTION_CLASS_NAME,k.left-jt.ROUNDED_PIECE_WIDTH,jt.ROUNDED_PIECE_WIDTH);let I=jt.EDITOR_BACKGROUND_CLASS_NAME;y.top===1&&(I+=\" \"+jt.SELECTION_TOP_RIGHT),y.bottom===1&&(I+=\" \"+jt.SELECTION_BOTTOM_RIGHT),v+=this._createSelectionPiece(b,_,I,k.left-jt.ROUNDED_PIECE_WIDTH,jt.ROUNDED_PIECE_WIDTH)}if(D.top===1||D.bottom===1){v+=this._createSelectionPiece(b,_,jt.SELECTION_CLASS_NAME,k.left+k.width,jt.ROUNDED_PIECE_WIDTH);let I=jt.EDITOR_BACKGROUND_CLASS_NAME;D.top===1&&(I+=\" \"+jt.SELECTION_TOP_LEFT),D.bottom===1&&(I+=\" \"+jt.SELECTION_BOTTOM_LEFT),v+=this._createSelectionPiece(b,_,I,k.left+k.width,jt.ROUNDED_PIECE_WIDTH)}}let x=jt.SELECTION_CLASS_NAME;if(s){const y=k.startStyle,D=k.endStyle;y.top===0&&(x+=\" \"+jt.SELECTION_TOP_LEFT),y.bottom===0&&(x+=\" \"+jt.SELECTION_BOTTOM_LEFT),D.top===0&&(x+=\" \"+jt.SELECTION_TOP_RIGHT),D.bottom===0&&(x+=\" \"+jt.SELECTION_BOTTOM_RIGHT)}C+=this._createSelectionPiece(b,_,x,k.left,k.width)}e[f][0]+=v,e[f][1]+=C}}prepareRender(e){const t=[],i=e.visibleRange.startLineNumber,n=e.visibleRange.endLineNumber;for(let r=i;r<=n;r++){const a=r-i;t[a]=[\"\",\"\"]}const s=[];for(let r=0,a=this._selections.length;r<a;r++){const l=this._selections[r];if(l.isEmpty()){s[r]=null;continue}const c=this._getVisibleRangesWithStyle(l,e,this._previousFrameVisibleRangesWithStyle[r]);s[r]=c,this._actualRenderOneSelection(t,i,this._selections.length>1,c)}this._previousFrameVisibleRangesWithStyle=s,this._renderResult=t.map(([r,a])=>r+a)}render(e,t){if(!this._renderResult)return\"\";const i=t-e;return i<0||i>=this._renderResult.length?\"\":this._renderResult[i]}}jt.SELECTION_CLASS_NAME=\"selected-text\";jt.SELECTION_TOP_LEFT=\"top-left-radius\";jt.SELECTION_BOTTOM_LEFT=\"bottom-left-radius\";jt.SELECTION_TOP_RIGHT=\"top-right-radius\";jt.SELECTION_BOTTOM_RIGHT=\"bottom-right-radius\";jt.EDITOR_BACKGROUND_CLASS_NAME=\"monaco-editor-background\";jt.ROUNDED_PIECE_WIDTH=10;Rt((o,e)=>{const t=o.getColor(Fa);t&&e.addRule(`.monaco-editor .focused .selected-text { background-color: ${t}; }`);const i=o.getColor(_I);i&&e.addRule(`.monaco-editor .selected-text { background-color: ${i}; }`);const n=o.getColor(BH);n&&!n.isTransparent()&&e.addRule(`.monaco-editor .view-line span.inline-selected-text { color: ${n}; }`)});function Z_(o){return o<0?-o:o}class u2{constructor(e,t,i,n,s,r){this.top=e,this.left=t,this.width=i,this.height=n,this.textContent=s,this.textContentClassName=r}}class g2{constructor(e){this._context=e;const t=this._context.configuration.options,i=t.get(46);this._cursorStyle=t.get(24),this._lineHeight=t.get(61),this._typicalHalfwidthCharacterWidth=i.typicalHalfwidthCharacterWidth,this._lineCursorWidth=Math.min(t.get(27),this._typicalHalfwidthCharacterWidth),this._isVisible=!0,this._domNode=Je(document.createElement(\"div\")),this._domNode.setClassName(`cursor ${vd}`),this._domNode.setHeight(this._lineHeight),this._domNode.setTop(0),this._domNode.setLeft(0),tn(this._domNode,i),this._domNode.setDisplay(\"none\"),this._position=new B(1,1),this._lastRenderedContent=\"\",this._renderData=null}getDomNode(){return this._domNode}getPosition(){return this._position}show(){this._isVisible||(this._domNode.setVisibility(\"inherit\"),this._isVisible=!0)}hide(){this._isVisible&&(this._domNode.setVisibility(\"hidden\"),this._isVisible=!1)}onConfigurationChanged(e){const t=this._context.configuration.options,i=t.get(46);return this._cursorStyle=t.get(24),this._lineHeight=t.get(61),this._typicalHalfwidthCharacterWidth=i.typicalHalfwidthCharacterWidth,this._lineCursorWidth=Math.min(t.get(27),this._typicalHalfwidthCharacterWidth),tn(this._domNode,i),!0}onCursorPositionChanged(e){return this._position=e,!0}_getGraphemeAwarePosition(){const{lineNumber:e,column:t}=this._position,i=this._context.viewModel.getLineContent(e),[n,s]=TB(i,t-1);return[new B(e,n+1),i.substring(n,s)]}_prepareRender(e){let t=\"\";const[i,n]=this._getGraphemeAwarePosition();if(this._cursorStyle===Bi.Line||this._cursorStyle===Bi.LineThin){const u=e.visibleRangeForPosition(i);if(!u||u.outsideRenderedLine)return null;let g;this._cursorStyle===Bi.Line?(g=hT(this._lineCursorWidth>0?this._lineCursorWidth:2),g>2&&(t=n)):g=hT(1);let f=u.left;g>=2&&f>=1&&(f-=1);const _=e.getVerticalOffsetForLineNumber(i.lineNumber)-e.bigNumbersDelta;return new u2(_,f,g,this._lineHeight,t,\"\")}const s=e.linesVisibleRangesForRange(new L(i.lineNumber,i.column,i.lineNumber,i.column+n.length),!1);if(!s||s.length===0)return null;const r=s[0];if(r.outsideRenderedLine||r.ranges.length===0)return null;const a=r.ranges[0],l=n===\"\t\"?this._typicalHalfwidthCharacterWidth:a.width<1?this._typicalHalfwidthCharacterWidth:a.width;let c=\"\";if(this._cursorStyle===Bi.Block){const u=this._context.viewModel.getViewLineData(i.lineNumber);t=n;const g=u.tokens.findTokenIndexAtOffset(i.column-1);c=u.tokens.getClassName(g)}let d=e.getVerticalOffsetForLineNumber(i.lineNumber)-e.bigNumbersDelta,h=this._lineHeight;return(this._cursorStyle===Bi.Underline||this._cursorStyle===Bi.UnderlineThin)&&(d+=this._lineHeight-2,h=2),new u2(d,a.left,l,h,t,c)}prepareRender(e){this._renderData=this._prepareRender(e)}render(e){return this._renderData?(this._lastRenderedContent!==this._renderData.textContent&&(this._lastRenderedContent=this._renderData.textContent,this._domNode.domNode.textContent=this._lastRenderedContent),this._domNode.setClassName(`cursor ${vd} ${this._renderData.textContentClassName}`),this._domNode.setDisplay(\"block\"),this._domNode.setTop(this._renderData.top),this._domNode.setLeft(this._renderData.left),this._domNode.setWidth(this._renderData.width),this._domNode.setLineHeight(this._renderData.height),this._domNode.setHeight(this._renderData.height),{domNode:this._domNode.domNode,position:this._position,contentLeft:this._renderData.left,height:this._renderData.height,width:2}):(this._domNode.setDisplay(\"none\"),null)}}class Yp extends Es{constructor(e){super(e);const t=this._context.configuration.options;this._readOnly=t.get(83),this._cursorBlinking=t.get(22),this._cursorStyle=t.get(24),this._cursorSmoothCaretAnimation=t.get(23),this._selectionIsEmpty=!0,this._isComposingInput=!1,this._isVisible=!1,this._primaryCursor=new g2(this._context),this._secondaryCursors=[],this._renderData=[],this._domNode=Je(document.createElement(\"div\")),this._domNode.setAttribute(\"role\",\"presentation\"),this._domNode.setAttribute(\"aria-hidden\",\"true\"),this._updateDomClassName(),this._domNode.appendChild(this._primaryCursor.getDomNode()),this._startCursorBlinkAnimation=new Is,this._cursorFlatBlinkInterval=new qm,this._blinkingEnabled=!1,this._editorHasFocus=!1,this._updateBlinking()}dispose(){super.dispose(),this._startCursorBlinkAnimation.dispose(),this._cursorFlatBlinkInterval.dispose()}getDomNode(){return this._domNode}onCompositionStart(e){return this._isComposingInput=!0,this._updateBlinking(),!0}onCompositionEnd(e){return this._isComposingInput=!1,this._updateBlinking(),!0}onConfigurationChanged(e){const t=this._context.configuration.options;this._readOnly=t.get(83),this._cursorBlinking=t.get(22),this._cursorStyle=t.get(24),this._cursorSmoothCaretAnimation=t.get(23),this._updateBlinking(),this._updateDomClassName(),this._primaryCursor.onConfigurationChanged(e);for(let i=0,n=this._secondaryCursors.length;i<n;i++)this._secondaryCursors[i].onConfigurationChanged(e);return!0}_onCursorPositionChanged(e,t){if(this._primaryCursor.onCursorPositionChanged(e),this._updateBlinking(),this._secondaryCursors.length<t.length){const i=t.length-this._secondaryCursors.length;for(let n=0;n<i;n++){const s=new g2(this._context);this._domNode.domNode.insertBefore(s.getDomNode().domNode,this._primaryCursor.getDomNode().domNode.nextSibling),this._secondaryCursors.push(s)}}else if(this._secondaryCursors.length>t.length){const i=this._secondaryCursors.length-t.length;for(let n=0;n<i;n++)this._domNode.removeChild(this._secondaryCursors[0].getDomNode()),this._secondaryCursors.splice(0,1)}for(let i=0;i<t.length;i++)this._secondaryCursors[i].onCursorPositionChanged(t[i])}onCursorStateChanged(e){const t=[];for(let n=0,s=e.selections.length;n<s;n++)t[n]=e.selections[n].getPosition();this._onCursorPositionChanged(t[0],t.slice(1));const i=e.selections[0].isEmpty();return this._selectionIsEmpty!==i&&(this._selectionIsEmpty=i,this._updateDomClassName()),!0}onDecorationsChanged(e){return!0}onFlushed(e){return!0}onFocusChanged(e){return this._editorHasFocus=e.isFocused,this._updateBlinking(),!1}onLinesChanged(e){return!0}onLinesDeleted(e){return!0}onLinesInserted(e){return!0}onScrollChanged(e){return!0}onTokensChanged(e){const t=i=>{for(let n=0,s=e.ranges.length;n<s;n++)if(e.ranges[n].fromLineNumber<=i.lineNumber&&i.lineNumber<=e.ranges[n].toLineNumber)return!0;return!1};if(t(this._primaryCursor.getPosition()))return!0;for(const i of this._secondaryCursors)if(t(i.getPosition()))return!0;return!1}onZonesChanged(e){return!0}_getCursorBlinking(){return this._isComposingInput||!this._editorHasFocus?0:this._readOnly?5:this._cursorBlinking}_updateBlinking(){this._startCursorBlinkAnimation.cancel(),this._cursorFlatBlinkInterval.cancel();const e=this._getCursorBlinking(),t=e===0,i=e===5;t?this._hide():this._show(),this._blinkingEnabled=!1,this._updateDomClassName(),!t&&!i&&(e===1?this._cursorFlatBlinkInterval.cancelAndSet(()=>{this._isVisible?this._hide():this._show()},Yp.BLINK_INTERVAL):this._startCursorBlinkAnimation.setIfNotSet(()=>{this._blinkingEnabled=!0,this._updateDomClassName()},Yp.BLINK_INTERVAL))}_updateDomClassName(){this._domNode.setClassName(this._getClassName())}_getClassName(){let e=\"cursors-layer\";switch(this._selectionIsEmpty||(e+=\" has-selection\"),this._cursorStyle){case Bi.Line:e+=\" cursor-line-style\";break;case Bi.Block:e+=\" cursor-block-style\";break;case Bi.Underline:e+=\" cursor-underline-style\";break;case Bi.LineThin:e+=\" cursor-line-thin-style\";break;case Bi.BlockOutline:e+=\" cursor-block-outline-style\";break;case Bi.UnderlineThin:e+=\" cursor-underline-thin-style\";break;default:e+=\" cursor-line-style\"}if(this._blinkingEnabled)switch(this._getCursorBlinking()){case 1:e+=\" cursor-blink\";break;case 2:e+=\" cursor-smooth\";break;case 3:e+=\" cursor-phase\";break;case 4:e+=\" cursor-expand\";break;case 5:e+=\" cursor-solid\";break;default:e+=\" cursor-solid\"}else e+=\" cursor-solid\";return this._cursorSmoothCaretAnimation&&(e+=\" cursor-smooth-caret-animation\"),e}_show(){this._primaryCursor.show();for(let e=0,t=this._secondaryCursors.length;e<t;e++)this._secondaryCursors[e].show();this._isVisible=!0}_hide(){this._primaryCursor.hide();for(let e=0,t=this._secondaryCursors.length;e<t;e++)this._secondaryCursors[e].hide();this._isVisible=!1}prepareRender(e){this._primaryCursor.prepareRender(e);for(let t=0,i=this._secondaryCursors.length;t<i;t++)this._secondaryCursors[t].prepareRender(e)}render(e){const t=[];let i=0;const n=this._primaryCursor.render(e);n&&(t[i++]=n);for(let s=0,r=this._secondaryCursors.length;s<r;s++){const a=this._secondaryCursors[s].render(e);a&&(t[i++]=a)}this._renderData=t}getLastRenderData(){return this._renderData}}Yp.BLINK_INTERVAL=500;Rt((o,e)=>{const t=o.getColor(h4);if(t){let i=o.getColor(RU);i||(i=t.opposite()),e.addRule(`.monaco-editor .inputarea.ime-input { caret-color: ${t}; }`),e.addRule(`.monaco-editor .cursors-layer .cursor { background-color: ${t}; border-color: ${t}; color: ${i}; }`),yn(o.type)&&e.addRule(`.monaco-editor .cursors-layer.has-selection .cursor { border-left: 1px solid ${i}; border-right: 1px solid ${i}; }`)}});const Vw=()=>{throw new Error(\"Invalid change accessor\")};class uj extends Es{constructor(e){super(e);const t=this._context.configuration.options,i=t.get(133);this._lineHeight=t.get(61),this._contentWidth=i.contentWidth,this._contentLeft=i.contentLeft,this.domNode=Je(document.createElement(\"div\")),this.domNode.setClassName(\"view-zones\"),this.domNode.setPosition(\"absolute\"),this.domNode.setAttribute(\"role\",\"presentation\"),this.domNode.setAttribute(\"aria-hidden\",\"true\"),this.marginDomNode=Je(document.createElement(\"div\")),this.marginDomNode.setClassName(\"margin-view-zones\"),this.marginDomNode.setPosition(\"absolute\"),this.marginDomNode.setAttribute(\"role\",\"presentation\"),this.marginDomNode.setAttribute(\"aria-hidden\",\"true\"),this._zones={}}dispose(){super.dispose(),this._zones={}}_recomputeWhitespacesProps(){const e=this._context.viewLayout.getWhitespaces(),t=new Map;for(const n of e)t.set(n.id,n);let i=!1;return this._context.viewModel.changeWhitespace(n=>{const s=Object.keys(this._zones);for(let r=0,a=s.length;r<a;r++){const l=s[r],c=this._zones[l],d=this._computeWhitespaceProps(c.delegate);c.isInHiddenArea=d.isInHiddenArea;const h=t.get(l);h&&(h.afterLineNumber!==d.afterViewLineNumber||h.height!==d.heightInPx)&&(n.changeOneWhitespace(l,d.afterViewLineNumber,d.heightInPx),this._safeCallOnComputedHeight(c.delegate,d.heightInPx),i=!0)}}),i}onConfigurationChanged(e){const t=this._context.configuration.options,i=t.get(133);return this._lineHeight=t.get(61),this._contentWidth=i.contentWidth,this._contentLeft=i.contentLeft,e.hasChanged(61)&&this._recomputeWhitespacesProps(),!0}onLineMappingChanged(e){return this._recomputeWhitespacesProps()}onLinesDeleted(e){return!0}onScrollChanged(e){return e.scrollTopChanged||e.scrollWidthChanged}onZonesChanged(e){return!0}onLinesInserted(e){return!0}_getZoneOrdinal(e){return typeof e.afterColumn!=\"undefined\"?e.afterColumn:1e4}_computeWhitespaceProps(e){if(e.afterLineNumber===0)return{isInHiddenArea:!1,afterViewLineNumber:0,heightInPx:this._heightInPixels(e),minWidthInPx:this._minWidthInPixels(e)};let t;if(typeof e.afterColumn!=\"undefined\")t=this._context.viewModel.model.validatePosition({lineNumber:e.afterLineNumber,column:e.afterColumn});else{const r=this._context.viewModel.model.validatePosition({lineNumber:e.afterLineNumber,column:1}).lineNumber;t=new B(r,this._context.viewModel.model.getLineMaxColumn(r))}let i;t.column===this._context.viewModel.model.getLineMaxColumn(t.lineNumber)?i=this._context.viewModel.model.validatePosition({lineNumber:t.lineNumber+1,column:1}):i=this._context.viewModel.model.validatePosition({lineNumber:t.lineNumber,column:t.column+1});const n=this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(t,e.afterColumnAffinity),s=this._context.viewModel.coordinatesConverter.modelPositionIsVisible(i);return{isInHiddenArea:!s,afterViewLineNumber:n.lineNumber,heightInPx:s?this._heightInPixels(e):0,minWidthInPx:this._minWidthInPixels(e)}}changeViewZones(e){let t=!1;return this._context.viewModel.changeWhitespace(i=>{const n={addZone:s=>(t=!0,this._addZone(i,s)),removeZone:s=>{!s||(t=this._removeZone(i,s)||t)},layoutZone:s=>{!s||(t=this._layoutZone(i,s)||t)}};gj(e,n),n.addZone=Vw,n.removeZone=Vw,n.layoutZone=Vw}),t}_addZone(e,t){const i=this._computeWhitespaceProps(t),s={whitespaceId:e.insertWhitespace(i.afterViewLineNumber,this._getZoneOrdinal(t),i.heightInPx,i.minWidthInPx),delegate:t,isInHiddenArea:i.isInHiddenArea,isVisible:!1,domNode:Je(t.domNode),marginDomNode:t.marginDomNode?Je(t.marginDomNode):null};return this._safeCallOnComputedHeight(s.delegate,i.heightInPx),s.domNode.setPosition(\"absolute\"),s.domNode.domNode.style.width=\"100%\",s.domNode.setDisplay(\"none\"),s.domNode.setAttribute(\"monaco-view-zone\",s.whitespaceId),this.domNode.appendChild(s.domNode),s.marginDomNode&&(s.marginDomNode.setPosition(\"absolute\"),s.marginDomNode.domNode.style.width=\"100%\",s.marginDomNode.setDisplay(\"none\"),s.marginDomNode.setAttribute(\"monaco-view-zone\",s.whitespaceId),this.marginDomNode.appendChild(s.marginDomNode)),this._zones[s.whitespaceId]=s,this.setShouldRender(),s.whitespaceId}_removeZone(e,t){if(this._zones.hasOwnProperty(t)){const i=this._zones[t];return delete this._zones[t],e.removeWhitespace(i.whitespaceId),i.domNode.removeAttribute(\"monaco-visible-view-zone\"),i.domNode.removeAttribute(\"monaco-view-zone\"),i.domNode.domNode.parentNode.removeChild(i.domNode.domNode),i.marginDomNode&&(i.marginDomNode.removeAttribute(\"monaco-visible-view-zone\"),i.marginDomNode.removeAttribute(\"monaco-view-zone\"),i.marginDomNode.domNode.parentNode.removeChild(i.marginDomNode.domNode)),this.setShouldRender(),!0}return!1}_layoutZone(e,t){if(this._zones.hasOwnProperty(t)){const i=this._zones[t],n=this._computeWhitespaceProps(i.delegate);return i.isInHiddenArea=n.isInHiddenArea,e.changeOneWhitespace(i.whitespaceId,n.afterViewLineNumber,n.heightInPx),this._safeCallOnComputedHeight(i.delegate,n.heightInPx),this.setShouldRender(),!0}return!1}shouldSuppressMouseDownOnViewZone(e){if(this._zones.hasOwnProperty(e)){const t=this._zones[e];return Boolean(t.delegate.suppressMouseDown)}return!1}_heightInPixels(e){return typeof e.heightInPx==\"number\"?e.heightInPx:typeof e.heightInLines==\"number\"?this._lineHeight*e.heightInLines:this._lineHeight}_minWidthInPixels(e){return typeof e.minWidthInPx==\"number\"?e.minWidthInPx:0}_safeCallOnComputedHeight(e,t){if(typeof e.onComputedHeight==\"function\")try{e.onComputedHeight(t)}catch(i){Ee(i)}}_safeCallOnDomNodeTop(e,t){if(typeof e.onDomNodeTop==\"function\")try{e.onDomNodeTop(t)}catch(i){Ee(i)}}prepareRender(e){}render(e){const t=e.viewportData.whitespaceViewportData,i={};let n=!1;for(const r of t)this._zones[r.id].isInHiddenArea||(i[r.id]=r,n=!0);const s=Object.keys(this._zones);for(let r=0,a=s.length;r<a;r++){const l=s[r],c=this._zones[l];let d=0,h=0,u=\"none\";i.hasOwnProperty(l)?(d=i[l].verticalOffset-e.bigNumbersDelta,h=i[l].height,u=\"block\",c.isVisible||(c.domNode.setAttribute(\"monaco-visible-view-zone\",\"true\"),c.isVisible=!0),this._safeCallOnDomNodeTop(c.delegate,e.getScrolledTopFromAbsoluteTop(i[l].verticalOffset))):(c.isVisible&&(c.domNode.removeAttribute(\"monaco-visible-view-zone\"),c.isVisible=!1),this._safeCallOnDomNodeTop(c.delegate,e.getScrolledTopFromAbsoluteTop(-1e6))),c.domNode.setTop(d),c.domNode.setHeight(h),c.domNode.setDisplay(u),c.marginDomNode&&(c.marginDomNode.setTop(d),c.marginDomNode.setHeight(h),c.marginDomNode.setDisplay(u))}n&&(this.domNode.setWidth(Math.max(e.scrollWidth,this._contentWidth)),this.marginDomNode.setWidth(this._contentLeft))}}function gj(o,e){try{return o(e)}catch(t){Ee(t)}}class fj{constructor(e){this._theme=e}get type(){return this._theme.type}get value(){return this._theme}update(e){this._theme=e}getColor(e){return this._theme.getColor(e)}}class pj{constructor(e,t,i){this.configuration=e,this.theme=new fj(t),this.viewModel=i,this.viewLayout=i.viewLayout}addEventHandler(e){this.viewModel.addViewEventHandler(e)}removeEventHandler(e){this.viewModel.removeViewEventHandler(e)}}class mj{constructor(e,t,i,n){this.selections=e,this.startLineNumber=t.startLineNumber|0,this.endLineNumber=t.endLineNumber|0,this.relativeVerticalOffset=t.relativeVerticalOffset,this.bigNumbersDelta=t.bigNumbersDelta|0,this.whitespaceViewportData=i,this._model=n,this.visibleRange=new L(t.startLineNumber,this._model.getLineMinColumn(t.startLineNumber),t.endLineNumber,this._model.getLineMaxColumn(t.endLineNumber))}getViewLineRenderingData(e){return this._model.getViewportViewLineRenderingData(this.visibleRange,e)}getDecorationsInViewport(){return this._model.getDecorationsInViewport(this.visibleRange)}}class _j extends Es{constructor(e){super(e),this.blocks=[],this.contentWidth=-1,this.domNode=Je(document.createElement(\"div\")),this.domNode.setAttribute(\"role\",\"presentation\"),this.domNode.setAttribute(\"aria-hidden\",\"true\"),this.domNode.setClassName(\"blockDecorations-container\"),this.update()}update(){let e=!1;const i=this._context.configuration.options.get(133),n=i.contentWidth-i.verticalScrollbarWidth;return this.contentWidth!==n&&(this.contentWidth=n,e=!0),e}dispose(){super.dispose()}onConfigurationChanged(e){return this.update()}onScrollChanged(e){return e.scrollTopChanged||e.scrollLeftChanged}onDecorationsChanged(e){return!0}onZonesChanged(e){return!0}prepareRender(e){}render(e){let t=0;const i=e.getDecorationsInViewport();for(const n of i){if(!n.options.blockClassName)continue;let s=this.blocks[t];s||(s=this.blocks[t]=Je(document.createElement(\"div\")),this.domNode.appendChild(s));const r=e.getVerticalOffsetForLineNumber(n.range.startLineNumber),a=e.getVerticalOffsetForLineNumber(n.range.endLineNumber+1);s.setClassName(\"blockDecorations-block \"+n.options.blockClassName),s.setLeft(e.scrollLeft),s.setWidth(this.contentWidth),s.setTop(r),s.setHeight(a-r),t++}for(let n=t;n<this.blocks.length;n++)this.blocks[n].domNode.remove();this.blocks.length=t}}class bj extends Zm{constructor(e,t,i,n,s,r){super(),this._selections=[new oe(1,1,1,1)],this._renderAnimationFrame=null;const a=new f$(t,n,s,e);this._context=new pj(t,i,n),this._context.addEventHandler(this),this._viewParts=[],this._textAreaHandler=new u$(this._context,a,this._createTextAreaHandlerHelper()),this._viewParts.push(this._textAreaHandler),this._linesContent=Je(document.createElement(\"div\")),this._linesContent.setClassName(\"lines-content monaco-editor-background\"),this._linesContent.setPosition(\"absolute\"),this.domNode=Je(document.createElement(\"div\")),this.domNode.setClassName(this._getEditorClassName()),this.domNode.setAttribute(\"role\",\"code\"),this._overflowGuardContainer=Je(document.createElement(\"div\")),jr.write(this._overflowGuardContainer,3),this._overflowGuardContainer.setClassName(\"overflow-guard\"),this._scrollbar=new O$(this._context,this._linesContent,this.domNode,this._overflowGuardContainer),this._viewParts.push(this._scrollbar),this._viewLines=new o1(this._context,this._linesContent),this._viewZones=new uj(this._context),this._viewParts.push(this._viewZones);const l=new nj(this._context);this._viewParts.push(l);const c=new aj(this._context);this._viewParts.push(c);const d=new m$(this._context);this._viewParts.push(d),d.addDynamicOverlay(new C$(this._context)),d.addDynamicOverlay(new jt(this._context)),d.addDynamicOverlay(new B$(this._context)),d.addDynamicOverlay(new S$(this._context));const h=new _$(this._context);this._viewParts.push(h),h.addDynamicOverlay(new w$(this._context)),h.addDynamicOverlay(new P$(this._context)),h.addDynamicOverlay(new U$(this._context)),h.addDynamicOverlay(new z$(this._context)),h.addDynamicOverlay(new dg(this._context));const u=new zd(this._context);u.getDomNode().appendChild(this._viewZones.marginDomNode),u.getDomNode().appendChild(h.getDomNode()),this._viewParts.push(u),this._contentWidgets=new b$(this._context,this.domNode),this._viewParts.push(this._contentWidgets),this._viewCursors=new Yp(this._context),this._viewParts.push(this._viewCursors),this._overlayWidgets=new tj(this._context),this._viewParts.push(this._overlayWidgets);const g=new rj(this._context);this._viewParts.push(g);const f=new _j(this._context);this._viewParts.push(f);const _=new ej(this._context);if(this._viewParts.push(_),l){const b=this._scrollbar.getOverviewRulerLayoutInfo();b.parent.insertBefore(l.getDomNode(),b.insertBefore)}this._linesContent.appendChild(d.getDomNode()),this._linesContent.appendChild(g.domNode),this._linesContent.appendChild(f.domNode),this._linesContent.appendChild(this._viewZones.domNode),this._linesContent.appendChild(this._viewLines.getDomNode()),this._linesContent.appendChild(this._contentWidgets.domNode),this._linesContent.appendChild(this._viewCursors.getDomNode()),this._overflowGuardContainer.appendChild(u.getDomNode()),this._overflowGuardContainer.appendChild(this._scrollbar.getDomNode()),this._overflowGuardContainer.appendChild(c.getDomNode()),this._overflowGuardContainer.appendChild(this._textAreaHandler.textArea),this._overflowGuardContainer.appendChild(this._textAreaHandler.textAreaCover),this._overflowGuardContainer.appendChild(this._overlayWidgets.getDomNode()),this._overflowGuardContainer.appendChild(_.getDomNode()),this.domNode.appendChild(this._overflowGuardContainer),r?r.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode.domNode):this.domNode.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode),this._applyLayout(),this._pointerHandler=this._register(new EU(this._context,a,this._createPointerHandlerHelper()))}_flushAccumulatedAndRenderNow(){this._renderNow()}_createPointerHandlerHelper(){return{viewDomNode:this.domNode.domNode,linesContentDomNode:this._linesContent.domNode,viewLinesDomNode:this._viewLines.getDomNode().domNode,focusTextArea:()=>{this.focus()},dispatchTextAreaEvent:e=>{this._textAreaHandler.textArea.domNode.dispatchEvent(e)},getLastRenderData:()=>{const e=this._viewCursors.getLastRenderData()||[],t=this._textAreaHandler.getLastRenderData();return new CU(e,t)},shouldSuppressMouseDownOnViewZone:e=>this._viewZones.shouldSuppressMouseDownOnViewZone(e),shouldSuppressMouseDownOnWidget:e=>this._contentWidgets.shouldSuppressMouseDownOnWidget(e),getPositionFromDOMInfo:(e,t)=>(this._flushAccumulatedAndRenderNow(),this._viewLines.getPositionFromDOMInfo(e,t)),visibleRangeForPosition:(e,t)=>(this._flushAccumulatedAndRenderNow(),this._viewLines.visibleRangeForPosition(new B(e,t))),getLineWidth:e=>(this._flushAccumulatedAndRenderNow(),this._viewLines.getLineWidth(e))}}_createTextAreaHandlerHelper(){return{visibleRangeForPosition:e=>(this._flushAccumulatedAndRenderNow(),this._viewLines.visibleRangeForPosition(e))}}_applyLayout(){const t=this._context.configuration.options.get(133);this.domNode.setWidth(t.width),this.domNode.setHeight(t.height),this._overflowGuardContainer.setWidth(t.width),this._overflowGuardContainer.setHeight(t.height),this._linesContent.setWidth(1e6),this._linesContent.setHeight(1e6)}_getEditorClassName(){const e=this._textAreaHandler.isFocused()?\" focused\":\"\";return this._context.configuration.options.get(130)+\" \"+H0(this._context.theme.type)+e}handleEvents(e){super.handleEvents(e),this._scheduleRender()}onConfigurationChanged(e){return this.domNode.setClassName(this._getEditorClassName()),this._applyLayout(),!1}onCursorStateChanged(e){return this._selections=e.selections,!1}onFocusChanged(e){return this.domNode.setClassName(this._getEditorClassName()),!1}onThemeChanged(e){return this._context.theme.update(e.theme),this.domNode.setClassName(this._getEditorClassName()),!1}dispose(){this._renderAnimationFrame!==null&&(this._renderAnimationFrame.dispose(),this._renderAnimationFrame=null),this._contentWidgets.overflowingContentWidgetsDomNode.domNode.remove(),this._context.removeEventHandler(this),this._viewLines.dispose();for(const e of this._viewParts)e.dispose();super.dispose()}_scheduleRender(){this._renderAnimationFrame===null&&(this._renderAnimationFrame=FO(this._onRenderScheduled.bind(this),100))}_onRenderScheduled(){this._renderAnimationFrame=null,this._flushAccumulatedAndRenderNow()}_renderNow(){vj(()=>this._actualRender())}_getViewPartsToRender(){const e=[];let t=0;for(const i of this._viewParts)i.shouldRender()&&(e[t++]=i);return e}_actualRender(){if(!Vx(this.domNode.domNode))return;let e=this._getViewPartsToRender();if(!this._viewLines.shouldRender()&&e.length===0)return;const t=this._context.viewLayout.getLinesViewportData();this._context.viewModel.setViewport(t.startLineNumber,t.endLineNumber,t.centeredLineNumber);const i=new mj(this._selections,t,this._context.viewLayout.getWhitespaceViewportData(),this._context.viewModel);this._contentWidgets.shouldRender()&&this._contentWidgets.onBeforeRender(i),this._viewLines.shouldRender()&&(this._viewLines.renderText(i),this._viewLines.onDidRender(),e=this._getViewPartsToRender());const n=new eU(this._context.viewLayout,i,this._viewLines);for(const s of e)s.prepareRender(n);for(const s of e)s.render(n),s.onDidRender()}delegateVerticalScrollbarPointerDown(e){this._scrollbar.delegateVerticalScrollbarPointerDown(e)}restoreState(e){this._context.viewModel.viewLayout.setScrollPosition({scrollTop:e.scrollTop},1),this._context.viewModel.tokenizeViewport(),this._renderNow(),this._viewLines.updateLineWidths(),this._context.viewModel.viewLayout.setScrollPosition({scrollLeft:e.scrollLeft},1)}getOffsetForColumn(e,t){const i=this._context.viewModel.model.validatePosition({lineNumber:e,column:t}),n=this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(i);this._flushAccumulatedAndRenderNow();const s=this._viewLines.visibleRangeForPosition(new B(n.lineNumber,n.column));return s?s.left:-1}getTargetAtClientPoint(e,t){const i=this._pointerHandler.getTargetAtClientPoint(e,t);return i?n1.convertViewToModelMouseTarget(i,this._context.viewModel.coordinatesConverter):null}createOverviewRuler(e){return new oj(this._context,e)}change(e){this._viewZones.changeViewZones(e),this._scheduleRender()}render(e,t){if(t){this._viewLines.forceShouldRender();for(const i of this._viewParts)i.forceShouldRender()}e?this._flushAccumulatedAndRenderNow():this._scheduleRender()}focus(){this._textAreaHandler.focusTextArea()}isFocused(){return this._textAreaHandler.isFocused()}setAriaOptions(e){this._textAreaHandler.setAriaOptions(e)}addContentWidget(e){this._contentWidgets.addWidget(e.widget),this.layoutContentWidget(e),this._scheduleRender()}layoutContentWidget(e){var t,i;let n=e.position&&e.position.range||null;if(n===null){const r=e.position?e.position.position:null;r!==null&&(n=new L(r.lineNumber,r.column,r.lineNumber,r.column))}const s=e.position?e.position.preference:null;this._contentWidgets.setWidgetPosition(e.widget,n,s,(i=(t=e.position)===null||t===void 0?void 0:t.positionAffinity)!==null&&i!==void 0?i:null),this._scheduleRender()}removeContentWidget(e){this._contentWidgets.removeWidget(e.widget),this._scheduleRender()}addOverlayWidget(e){this._overlayWidgets.addWidget(e.widget),this.layoutOverlayWidget(e),this._scheduleRender()}layoutOverlayWidget(e){const t=e.position?e.position.preference:null;this._overlayWidgets.setWidgetPosition(e.widget,t)&&this._scheduleRender()}removeOverlayWidget(e){this._overlayWidgets.removeWidget(e.widget),this._scheduleRender()}}function vj(o){try{return o()}catch(e){Ee(e)}}class av{constructor(e){this._selTrackedRange=null,this._trackSelection=!0,this._setState(e,new Fi(new L(1,1,1,1),0,new B(1,1),0),new Fi(new L(1,1,1,1),0,new B(1,1),0))}dispose(e){this._removeTrackedRange(e)}startTrackingSelection(e){this._trackSelection=!0,this._updateTrackedRange(e)}stopTrackingSelection(e){this._trackSelection=!1,this._removeTrackedRange(e)}_updateTrackedRange(e){!this._trackSelection||(this._selTrackedRange=e.model._setTrackedRange(this._selTrackedRange,this.modelState.selection,0))}_removeTrackedRange(e){this._selTrackedRange=e.model._setTrackedRange(this._selTrackedRange,null,0)}asCursorState(){return new He(this.modelState,this.viewState)}readSelectionFromMarkers(e){const t=e.model._getTrackedRange(this._selTrackedRange);return oe.fromRange(t,this.modelState.selection.getDirection())}ensureValidState(e){this._setState(e,this.modelState,this.viewState)}setState(e,t,i){this._setState(e,t,i)}static _validatePositionWithCache(e,t,i,n){return t.equals(i)?n:e.normalizePosition(t,2)}static _validateViewState(e,t){const i=t.position,n=t.selectionStart.getStartPosition(),s=t.selectionStart.getEndPosition(),r=e.normalizePosition(i,2),a=this._validatePositionWithCache(e,n,i,r),l=this._validatePositionWithCache(e,s,n,a);return i.equals(r)&&n.equals(a)&&s.equals(l)?t:new Fi(L.fromPositions(a,l),t.selectionStartLeftoverVisibleColumns+n.column-a.column,r,t.leftoverVisibleColumns+i.column-r.column)}_setState(e,t,i){if(i&&(i=av._validateViewState(e.viewModel,i)),t){const n=e.model.validateRange(t.selectionStart),s=t.selectionStart.equalsRange(n)?t.selectionStartLeftoverVisibleColumns:0,r=e.model.validatePosition(t.position),a=t.position.equals(r)?t.leftoverVisibleColumns:0;t=new Fi(n,s,r,a)}else{if(!i)return;const n=e.model.validateRange(e.coordinatesConverter.convertViewRangeToModelRange(i.selectionStart)),s=e.model.validatePosition(e.coordinatesConverter.convertViewPositionToModelPosition(i.position));t=new Fi(n,i.selectionStartLeftoverVisibleColumns,s,i.leftoverVisibleColumns)}if(i){const n=e.coordinatesConverter.validateViewRange(i.selectionStart,t.selectionStart),s=e.coordinatesConverter.validateViewPosition(i.position,t.position);i=new Fi(n,t.selectionStartLeftoverVisibleColumns,s,t.leftoverVisibleColumns)}else{const n=e.coordinatesConverter.convertModelPositionToViewPosition(new B(t.selectionStart.startLineNumber,t.selectionStart.startColumn)),s=e.coordinatesConverter.convertModelPositionToViewPosition(new B(t.selectionStart.endLineNumber,t.selectionStart.endColumn)),r=new L(n.lineNumber,n.column,s.lineNumber,s.column),a=e.coordinatesConverter.convertModelPositionToViewPosition(t.position);i=new Fi(r,t.selectionStartLeftoverVisibleColumns,a,t.leftoverVisibleColumns)}this.modelState=t,this.viewState=i,this._updateTrackedRange(e)}}class f2{constructor(e){this.context=e,this.cursors=[new av(e)],this.lastAddedCursorIndex=0}dispose(){for(const e of this.cursors)e.dispose(this.context)}startTrackingSelections(){for(const e of this.cursors)e.startTrackingSelection(this.context)}stopTrackingSelections(){for(const e of this.cursors)e.stopTrackingSelection(this.context)}updateContext(e){this.context=e}ensureValidState(){for(const e of this.cursors)e.ensureValidState(this.context)}readSelectionFromMarkers(){return this.cursors.map(e=>e.readSelectionFromMarkers(this.context))}getAll(){return this.cursors.map(e=>e.asCursorState())}getViewPositions(){return this.cursors.map(e=>e.viewState.position)}getTopMostViewPosition(){return CW(this.cursors,Xf(e=>e.viewState.position,B.compare)).viewState.position}getBottomMostViewPosition(){return vP(this.cursors,Xf(e=>e.viewState.position,B.compare)).viewState.position}getSelections(){return this.cursors.map(e=>e.modelState.selection)}getViewSelections(){return this.cursors.map(e=>e.viewState.selection)}setSelections(e){this.setStates(He.fromModelSelections(e))}getPrimaryCursor(){return this.cursors[0].asCursorState()}setStates(e){e!==null&&(this.cursors[0].setState(this.context,e[0].modelState,e[0].viewState),this._setSecondaryStates(e.slice(1)))}_setSecondaryStates(e){const t=this.cursors.length-1,i=e.length;if(t<i){const n=i-t;for(let s=0;s<n;s++)this._addSecondaryCursor()}else if(t>i){const n=t-i;for(let s=0;s<n;s++)this._removeSecondaryCursor(this.cursors.length-2)}for(let n=0;n<i;n++)this.cursors[n+1].setState(this.context,e[n].modelState,e[n].viewState)}killSecondaryCursors(){this._setSecondaryStates([])}_addSecondaryCursor(){this.cursors.push(new av(this.context)),this.lastAddedCursorIndex=this.cursors.length-1}getLastAddedCursorIndex(){return this.cursors.length===1||this.lastAddedCursorIndex===0?0:this.lastAddedCursorIndex}_removeSecondaryCursor(e){this.lastAddedCursorIndex>=e+1&&this.lastAddedCursorIndex--,this.cursors[e+1].dispose(this.context),this.cursors.splice(e+1,1)}normalize(){if(this.cursors.length===1)return;const e=this.cursors.slice(0),t=[];for(let i=0,n=e.length;i<n;i++)t.push({index:i,selection:e[i].modelState.selection});t.sort(Xf(i=>i.selection,L.compareRangesUsingStarts));for(let i=0;i<t.length-1;i++){const n=t[i],s=t[i+1],r=n.selection,a=s.selection;if(!this.context.cursorConfig.multiCursorMergeOverlapping)continue;let l;if(a.isEmpty()||r.isEmpty()?l=a.getStartPosition().isBeforeOrEqual(r.getEndPosition()):l=a.getStartPosition().isBefore(r.getEndPosition()),l){const c=n.index<s.index?i:i+1,d=n.index<s.index?i+1:i,h=t[d].index,u=t[c].index,g=t[d].selection,f=t[c].selection;if(!g.equalsSelection(f)){const _=g.plusRange(f),b=g.selectionStartLineNumber===g.startLineNumber&&g.selectionStartColumn===g.startColumn,v=f.selectionStartLineNumber===f.startLineNumber&&f.selectionStartColumn===f.startColumn;let C;h===this.lastAddedCursorIndex?(C=b,this.lastAddedCursorIndex=u):C=v;let w;C?w=new oe(_.startLineNumber,_.startColumn,_.endLineNumber,_.endColumn):w=new oe(_.endLineNumber,_.endColumn,_.startLineNumber,_.startColumn),t[c].selection=w;const S=He.fromModelSelection(w);e[u].setState(this.context,S.modelState,S.viewState)}for(const _ of t)_.index>h&&_.index--;e.splice(h,1),t.splice(d,1),this._removeSecondaryCursor(h-1),i--}}}}class p2{constructor(e,t,i,n){this._cursorContextBrand=void 0,this.model=e,this.viewModel=t,this.coordinatesConverter=i,this.cursorConfig=n}}class Cj{constructor(){this.changeType=1}}class Yo{constructor(e,t,i,n,s){this.ownerId=e,this.lineNumber=t,this.column=i,this.options=n,this.order=s}static applyInjectedText(e,t){if(!t||t.length===0)return e;let i=\"\",n=0;for(const s of t)i+=e.substring(n,s.column-1),n=s.column-1,i+=s.options.content;return i+=e.substring(n),i}static fromDecorations(e){const t=[];for(const i of e)i.options.before&&i.options.before.content.length>0&&t.push(new Yo(i.ownerId,i.range.startLineNumber,i.range.startColumn,i.options.before,0)),i.options.after&&i.options.after.content.length>0&&t.push(new Yo(i.ownerId,i.range.endLineNumber,i.range.endColumn,i.options.after,1));return t.sort((i,n)=>i.lineNumber===n.lineNumber?i.column===n.column?i.order-n.order:i.column-n.column:i.lineNumber-n.lineNumber),t}}class m2{constructor(e,t,i){this.changeType=2,this.lineNumber=e,this.detail=t,this.injectedText=i}}class wj{constructor(e,t){this.changeType=3,this.fromLineNumber=e,this.toLineNumber=t}}class Sj{constructor(e,t,i,n){this.changeType=4,this.injectedTexts=n,this.fromLineNumber=e,this.toLineNumber=t,this.detail=i}}class yj{constructor(){this.changeType=5}}class Pu{constructor(e,t,i,n){this.changes=e,this.versionId=t,this.isUndoing=i,this.isRedoing=n,this.resultingSelection=null}containsEvent(e){for(let t=0,i=this.changes.length;t<i;t++)if(this.changes[t].changeType===e)return!0;return!1}static merge(e,t){const i=[].concat(e.changes).concat(t.changes),n=t.versionId,s=e.isUndoing||t.isUndoing,r=e.isRedoing||t.isRedoing;return new Pu(i,n,s,r)}}class N4{constructor(e){this.changes=e}}class wd{constructor(e,t){this.rawContentChangedEvent=e,this.contentChangedEvent=t}merge(e){const t=Pu.merge(this.rawContentChangedEvent,e.rawContentChangedEvent),i=wd._mergeChangeEvents(this.contentChangedEvent,e.contentChangedEvent);return new wd(t,i)}static _mergeChangeEvents(e,t){const i=[].concat(e.changes).concat(t.changes),n=t.eol,s=t.versionId,r=e.isUndoing||t.isUndoing,a=e.isRedoing||t.isRedoing,l=e.isFlush||t.isFlush;return{changes:i,eol:n,versionId:s,isUndoing:r,isRedoing:a,isFlush:l}}}class Lj{constructor(){this.type=0}}class Dj{constructor(){this.type=1}}class kj{constructor(e){this.type=2,this._source=e}hasChanged(e){return this._source.hasChanged(e)}}class xj{constructor(e,t){this.type=3,this.selections=e,this.modelSelections=t}}class Ah{constructor(e){this.type=4,e?(this.affectsMinimap=e.affectsMinimap,this.affectsOverviewRuler=e.affectsOverviewRuler):(this.affectsMinimap=!0,this.affectsOverviewRuler=!0)}}class Y_{constructor(){this.type=5}}class Ij{constructor(e){this.type=6,this.isFocused=e}}class Ej{constructor(){this.type=7}}class X_{constructor(){this.type=8}}class T4{constructor(e,t){this.fromLineNumber=e,this.count=t,this.type=9}}class Qy{constructor(e,t){this.type=10,this.fromLineNumber=e,this.toLineNumber=t}}class Jy{constructor(e,t){this.type=11,this.fromLineNumber=e,this.toLineNumber=t}}class s0{constructor(e,t,i,n,s,r,a){this.source=e,this.minimalReveal=t,this.range=i,this.selections=n,this.verticalType=s,this.revealHorizontal=r,this.scrollType=a,this.type=12}}class Nj{constructor(e){this.type=13,this.scrollWidth=e.scrollWidth,this.scrollLeft=e.scrollLeft,this.scrollHeight=e.scrollHeight,this.scrollTop=e.scrollTop,this.scrollWidthChanged=e.scrollWidthChanged,this.scrollLeftChanged=e.scrollLeftChanged,this.scrollHeightChanged=e.scrollHeightChanged,this.scrollTopChanged=e.scrollTopChanged}}class Tj{constructor(e){this.theme=e,this.type=14}}class Mj{constructor(e){this.type=15,this.ranges=e}}class Aj{constructor(){this.type=16}}class Rj{constructor(){this.type=17}}class Oj extends z{constructor(){super(),this._onEvent=this._register(new O),this.onEvent=this._onEvent.event,this._eventHandlers=[],this._viewEventQueue=null,this._isConsumingViewEventQueue=!1,this._collector=null,this._collectorCnt=0,this._outgoingEvents=[]}emitOutgoingEvent(e){this._addOutgoingEvent(e),this._emitOutgoingEvents()}_addOutgoingEvent(e){for(let t=0,i=this._outgoingEvents.length;t<i;t++){const n=this._outgoingEvents[t].kind===e.kind?this._outgoingEvents[t].attemptToMerge(e):null;if(n){this._outgoingEvents[t]=n;return}}this._outgoingEvents.push(e)}_emitOutgoingEvents(){for(;this._outgoingEvents.length>0;){if(this._collector||this._isConsumingViewEventQueue)return;const e=this._outgoingEvents.shift();e.isNoOp()||this._onEvent.fire(e)}}addViewEventHandler(e){for(let t=0,i=this._eventHandlers.length;t<i;t++)this._eventHandlers[t]===e&&console.warn(\"Detected duplicate listener in ViewEventDispatcher\",e);this._eventHandlers.push(e)}removeViewEventHandler(e){for(let t=0;t<this._eventHandlers.length;t++)if(this._eventHandlers[t]===e){this._eventHandlers.splice(t,1);break}}beginEmitViewEvents(){return this._collectorCnt++,this._collectorCnt===1&&(this._collector=new Pj),this._collector}endEmitViewEvents(){if(this._collectorCnt--,this._collectorCnt===0){const e=this._collector.outgoingEvents,t=this._collector.viewEvents;this._collector=null;for(const i of e)this._addOutgoingEvent(i);t.length>0&&this._emitMany(t)}this._emitOutgoingEvents()}emitSingleViewEvent(e){try{this.beginEmitViewEvents().emitViewEvent(e)}finally{this.endEmitViewEvents()}}_emitMany(e){this._viewEventQueue?this._viewEventQueue=this._viewEventQueue.concat(e):this._viewEventQueue=e,this._isConsumingViewEventQueue||this._consumeViewEventQueue()}_consumeViewEventQueue(){try{this._isConsumingViewEventQueue=!0,this._doConsumeQueue()}finally{this._isConsumingViewEventQueue=!1}}_doConsumeQueue(){for(;this._viewEventQueue;){const e=this._viewEventQueue;this._viewEventQueue=null;const t=this._eventHandlers.slice(0);for(const i of t)i.handleEvents(e)}}}class Pj{constructor(){this.viewEvents=[],this.outgoingEvents=[]}emitViewEvent(e){this.viewEvents.push(e)}emitOutgoingEvent(e){this.outgoingEvents.push(e)}}class TI{constructor(e,t,i,n){this.kind=0,this._oldContentWidth=e,this._oldContentHeight=t,this.contentWidth=i,this.contentHeight=n,this.contentWidthChanged=this._oldContentWidth!==this.contentWidth,this.contentHeightChanged=this._oldContentHeight!==this.contentHeight}isNoOp(){return!this.contentWidthChanged&&!this.contentHeightChanged}attemptToMerge(e){return e.kind!==this.kind?null:new TI(this._oldContentWidth,this._oldContentHeight,e.contentWidth,e.contentHeight)}}class MI{constructor(e,t){this.kind=1,this.oldHasFocus=e,this.hasFocus=t}isNoOp(){return this.oldHasFocus===this.hasFocus}attemptToMerge(e){return e.kind!==this.kind?null:new MI(this.oldHasFocus,e.hasFocus)}}class AI{constructor(e,t,i,n,s,r,a,l){this.kind=2,this._oldScrollWidth=e,this._oldScrollLeft=t,this._oldScrollHeight=i,this._oldScrollTop=n,this.scrollWidth=s,this.scrollLeft=r,this.scrollHeight=a,this.scrollTop=l,this.scrollWidthChanged=this._oldScrollWidth!==this.scrollWidth,this.scrollLeftChanged=this._oldScrollLeft!==this.scrollLeft,this.scrollHeightChanged=this._oldScrollHeight!==this.scrollHeight,this.scrollTopChanged=this._oldScrollTop!==this.scrollTop}isNoOp(){return!this.scrollWidthChanged&&!this.scrollLeftChanged&&!this.scrollHeightChanged&&!this.scrollTopChanged}attemptToMerge(e){return e.kind!==this.kind?null:new AI(this._oldScrollWidth,this._oldScrollLeft,this._oldScrollHeight,this._oldScrollTop,e.scrollWidth,e.scrollLeft,e.scrollHeight,e.scrollTop)}}class Fj{constructor(){this.kind=3}isNoOp(){return!1}attemptToMerge(e){return e.kind!==this.kind?null:this}}class Bj{constructor(){this.kind=4}isNoOp(){return!1}attemptToMerge(e){return e.kind!==this.kind?null:this}}class lv{constructor(e,t,i,n,s,r,a){this.kind=6,this.oldSelections=e,this.selections=t,this.oldModelVersionId=i,this.modelVersionId=n,this.source=s,this.reason=r,this.reachedMaxCursorCount=a}static _selectionsAreEqual(e,t){if(!e&&!t)return!0;if(!e||!t)return!1;const i=e.length,n=t.length;if(i!==n)return!1;for(let s=0;s<i;s++)if(!e[s].equalsSelection(t[s]))return!1;return!0}isNoOp(){return lv._selectionsAreEqual(this.oldSelections,this.selections)&&this.oldModelVersionId===this.modelVersionId}attemptToMerge(e){return e.kind!==this.kind?null:new lv(this.oldSelections,e.selections,this.oldModelVersionId,e.modelVersionId,e.source,e.reason,this.reachedMaxCursorCount||e.reachedMaxCursorCount)}}class Wj{constructor(){this.kind=5}isNoOp(){return!1}attemptToMerge(e){return e.kind!==this.kind?null:this}}class Vj{constructor(e){this.event=e,this.kind=7}isNoOp(){return!1}attemptToMerge(e){return null}}class Hj{constructor(e){this.event=e,this.kind=8}isNoOp(){return!1}attemptToMerge(e){return null}}class zj{constructor(e){this.event=e,this.kind=9}isNoOp(){return!1}attemptToMerge(e){return null}}class Uj{constructor(e){this.event=e,this.kind=10}isNoOp(){return!1}attemptToMerge(e){return null}}class $j{constructor(e){this.event=e,this.kind=11}isNoOp(){return!1}attemptToMerge(e){return null}}class jj{constructor(e){this.event=e,this.kind=12}isNoOp(){return!1}attemptToMerge(e){return null}}class ug extends z{constructor(e,t,i,n){super(),this._model=e,this._knownModelVersionId=this._model.getVersionId(),this._viewModel=t,this._coordinatesConverter=i,this.context=new p2(this._model,this._viewModel,this._coordinatesConverter,n),this._cursors=new f2(this.context),this._hasFocus=!1,this._isHandling=!1,this._compositionState=null,this._columnSelectData=null,this._autoClosedActions=[],this._prevEditOperationType=0}dispose(){this._cursors.dispose(),this._autoClosedActions=et(this._autoClosedActions),super.dispose()}updateConfiguration(e){this.context=new p2(this._model,this._viewModel,this._coordinatesConverter,e),this._cursors.updateContext(this.context)}onLineMappingChanged(e){this._knownModelVersionId===this._model.getVersionId()&&this.setStates(e,\"viewModel\",0,this.getCursorStates())}setHasFocus(e){this._hasFocus=e}_validateAutoClosedActions(){if(this._autoClosedActions.length>0){const e=this._cursors.getSelections();for(let t=0;t<this._autoClosedActions.length;t++){const i=this._autoClosedActions[t];i.isValid(e)||(i.dispose(),this._autoClosedActions.splice(t,1),t--)}}}getPrimaryCursorState(){return this._cursors.getPrimaryCursor()}getLastAddedCursorIndex(){return this._cursors.getLastAddedCursorIndex()}getCursorStates(){return this._cursors.getAll()}setStates(e,t,i,n){let s=!1;n!==null&&n.length>ug.MAX_CURSOR_COUNT&&(n=n.slice(0,ug.MAX_CURSOR_COUNT),s=!0);const r=sp.from(this._model,this);return this._cursors.setStates(n),this._cursors.normalize(),this._columnSelectData=null,this._validateAutoClosedActions(),this._emitStateChangedIfNecessary(e,t,i,r,s)}setCursorColumnSelectData(e){this._columnSelectData=e}revealPrimary(e,t,i,n,s,r){const a=this._cursors.getViewPositions();let l=null,c=null;a.length>1?c=this._cursors.getViewSelections():l=L.fromPositions(a[0],a[0]),e.emitViewEvent(new s0(t,i,l,c,n,s,r))}saveState(){const e=[],t=this._cursors.getSelections();for(let i=0,n=t.length;i<n;i++){const s=t[i];e.push({inSelectionMode:!s.isEmpty(),selectionStart:{lineNumber:s.selectionStartLineNumber,column:s.selectionStartColumn},position:{lineNumber:s.positionLineNumber,column:s.positionColumn}})}return e}restoreState(e,t){const i=[];for(let n=0,s=t.length;n<s;n++){const r=t[n];let a=1,l=1;r.position&&r.position.lineNumber&&(a=r.position.lineNumber),r.position&&r.position.column&&(l=r.position.column);let c=a,d=l;r.selectionStart&&r.selectionStart.lineNumber&&(c=r.selectionStart.lineNumber),r.selectionStart&&r.selectionStart.column&&(d=r.selectionStart.column),i.push({selectionStartLineNumber:c,selectionStartColumn:d,positionLineNumber:a,positionColumn:l})}this.setStates(e,\"restoreState\",0,He.fromModelSelections(i)),this.revealPrimary(e,\"restoreState\",!1,0,!0,1)}onModelContentChanged(e,t){if(t instanceof N4){if(this._isHandling)return;this._isHandling=!0;try{this.setStates(e,\"modelChange\",0,this.getCursorStates())}finally{this._isHandling=!1}}else{const i=t.rawContentChangedEvent;if(this._knownModelVersionId=i.versionId,this._isHandling)return;const n=i.containsEvent(1);if(this._prevEditOperationType=0,n)this._cursors.dispose(),this._cursors=new f2(this.context),this._validateAutoClosedActions(),this._emitStateChangedIfNecessary(e,\"model\",1,null,!1);else if(this._hasFocus&&i.resultingSelection&&i.resultingSelection.length>0){const s=He.fromModelSelections(i.resultingSelection);this.setStates(e,\"modelChange\",i.isUndoing?5:i.isRedoing?6:2,s)&&this.revealPrimary(e,\"modelChange\",!1,0,!0,0)}else{const s=this._cursors.readSelectionFromMarkers();this.setStates(e,\"modelChange\",2,He.fromModelSelections(s))}}}getSelection(){return this._cursors.getPrimaryCursor().modelState.selection}getTopMostViewPosition(){return this._cursors.getTopMostViewPosition()}getBottomMostViewPosition(){return this._cursors.getBottomMostViewPosition()}getCursorColumnSelectData(){if(this._columnSelectData)return this._columnSelectData;const e=this._cursors.getPrimaryCursor(),t=e.viewState.selectionStart.getStartPosition(),i=e.viewState.position;return{isReal:!1,fromViewLineNumber:t.lineNumber,fromViewVisualColumn:this.context.cursorConfig.visibleColumnFromColumn(this._viewModel,t),toViewLineNumber:i.lineNumber,toViewVisualColumn:this.context.cursorConfig.visibleColumnFromColumn(this._viewModel,i)}}getSelections(){return this._cursors.getSelections()}setSelections(e,t,i,n){this.setStates(e,t,n,He.fromModelSelections(i))}getPrevEditOperationType(){return this._prevEditOperationType}setPrevEditOperationType(e){this._prevEditOperationType=e}_pushAutoClosedAction(e,t){const i=[],n=[];for(let a=0,l=e.length;a<l;a++)i.push({range:e[a],options:{description:\"auto-closed-character\",inlineClassName:\"auto-closed-character\",stickiness:1}}),n.push({range:t[a],options:{description:\"auto-closed-enclosing\",stickiness:1}});const s=this._model.deltaDecorations([],i),r=this._model.deltaDecorations([],n);this._autoClosedActions.push(new _2(this._model,s,r))}_executeEditOperation(e){if(!e)return;e.shouldPushStackElementBefore&&this._model.pushStackElement();const t=Kj.executeCommands(this._model,this._cursors.getSelections(),e.commands);if(t){this._interpretCommandResult(t);const i=[],n=[];for(let s=0;s<e.commands.length;s++){const r=e.commands[s];r instanceof OP&&r.enclosingRange&&r.closeCharacterRange&&(i.push(r.closeCharacterRange),n.push(r.enclosingRange))}i.length>0&&this._pushAutoClosedAction(i,n),this._prevEditOperationType=e.type}e.shouldPushStackElementAfter&&this._model.pushStackElement()}_interpretCommandResult(e){(!e||e.length===0)&&(e=this._cursors.readSelectionFromMarkers()),this._columnSelectData=null,this._cursors.setSelections(e),this._cursors.normalize()}_emitStateChangedIfNecessary(e,t,i,n,s){const r=sp.from(this._model,this);if(r.equals(n))return!1;const a=this._cursors.getSelections(),l=this._cursors.getViewSelections();if(e.emitViewEvent(new xj(l,a)),!n||n.cursorState.length!==r.cursorState.length||r.cursorState.some((c,d)=>!c.modelState.equals(n.cursorState[d].modelState))){const c=n?n.cursorState.map(h=>h.modelState.selection):null,d=n?n.modelVersionId:0;e.emitOutgoingEvent(new lv(c,a,d,r.modelVersionId,t||\"keyboard\",i,s))}return!0}_findAutoClosingPairs(e){if(!e.length)return null;const t=[];for(let i=0,n=e.length;i<n;i++){const s=e[i];if(!s.text||s.text.indexOf(`\n`)>=0)return null;const r=s.text.match(/([)\\]}>'\"`])([^)\\]}>'\"`]*)$/);if(!r)return null;const a=r[1],l=this.context.cursorConfig.autoClosingPairs.autoClosingPairsCloseSingleChar.get(a);if(!l||l.length!==1)return null;const c=l[0].open,d=s.text.length-r[2].length-1,h=s.text.lastIndexOf(c,d-1);if(h===-1)return null;t.push([h,d])}return t}executeEdits(e,t,i,n){let s=null;t===\"snippet\"&&(s=this._findAutoClosingPairs(i)),s&&(i[0]._isTracked=!0);const r=[],a=[],l=this._model.pushEditOperations(this.getSelections(),i,c=>{if(s)for(let h=0,u=s.length;h<u;h++){const[g,f]=s[h],_=c[h],b=_.range.startLineNumber,v=_.range.startColumn-1+g,C=_.range.startColumn-1+f;r.push(new L(b,C+1,b,C+2)),a.push(new L(b,v+1,b,C+2))}const d=n(c);return d&&(this._isHandling=!0),d});l&&(this._isHandling=!1,this.setSelections(e,t,l,0)),r.length>0&&this._pushAutoClosedAction(r,a)}_executeEdit(e,t,i,n=0){if(this.context.cursorConfig.readOnly)return;const s=sp.from(this._model,this);this._cursors.stopTrackingSelections(),this._isHandling=!0;try{this._cursors.ensureValidState(),e()}catch(r){Ee(r)}this._isHandling=!1,this._cursors.startTrackingSelections(),this._validateAutoClosedActions(),this._emitStateChangedIfNecessary(t,i,n,s,!1)&&this.revealPrimary(t,i,!1,0,!0,0)}getAutoClosedCharacters(){return _2.getAllAutoClosedCharacters(this._autoClosedActions)}startComposition(e){this._compositionState=new op(this._model,this.getSelections())}endComposition(e,t){const i=this._compositionState?this._compositionState.deduceOutcome(this._model,this.getSelections()):null;this._compositionState=null,this._executeEdit(()=>{t===\"keyboard\"&&this._executeEditOperation(Ot.compositionEndWithInterceptors(this._prevEditOperationType,this.context.cursorConfig,this._model,i,this.getSelections(),this.getAutoClosedCharacters()))},e,t)}type(e,t,i){this._executeEdit(()=>{if(i===\"keyboard\"){const n=t.length;let s=0;for(;s<n;){const r=qx(t,s),a=t.substr(s,r);this._executeEditOperation(Ot.typeWithInterceptors(!!this._compositionState,this._prevEditOperationType,this.context.cursorConfig,this._model,this.getSelections(),this.getAutoClosedCharacters(),a)),s+=r}}else this._executeEditOperation(Ot.typeWithoutInterceptors(this._prevEditOperationType,this.context.cursorConfig,this._model,this.getSelections(),t))},e,i)}compositionType(e,t,i,n,s,r){if(t.length===0&&i===0&&n===0){if(s!==0){const a=this.getSelections().map(l=>{const c=l.getPosition();return new oe(c.lineNumber,c.column+s,c.lineNumber,c.column+s)});this.setSelections(e,r,a,0)}return}this._executeEdit(()=>{this._executeEditOperation(Ot.compositionType(this._prevEditOperationType,this.context.cursorConfig,this._model,this.getSelections(),t,i,n,s))},e,r)}paste(e,t,i,n,s){this._executeEdit(()=>{this._executeEditOperation(Ot.paste(this.context.cursorConfig,this._model,this.getSelections(),t,i,n||[]))},e,s,4)}cut(e,t){this._executeEdit(()=>{this._executeEditOperation(Wd.cut(this.context.cursorConfig,this._model,this.getSelections()))},e,t)}executeCommand(e,t,i){this._executeEdit(()=>{this._cursors.killSecondaryCursors(),this._executeEditOperation(new En(0,[t],{shouldPushStackElementBefore:!1,shouldPushStackElementAfter:!1}))},e,i)}executeCommands(e,t,i){this._executeEdit(()=>{this._executeEditOperation(new En(0,t,{shouldPushStackElementBefore:!1,shouldPushStackElementAfter:!1}))},e,i)}}ug.MAX_CURSOR_COUNT=1e4;class sp{constructor(e,t){this.modelVersionId=e,this.cursorState=t}static from(e,t){return new sp(e.getVersionId(),t.getCursorStates())}equals(e){if(!e||this.modelVersionId!==e.modelVersionId||this.cursorState.length!==e.cursorState.length)return!1;for(let t=0,i=this.cursorState.length;t<i;t++)if(!this.cursorState[t].equals(e.cursorState[t]))return!1;return!0}}class _2{constructor(e,t,i){this._model=e,this._autoClosedCharactersDecorations=t,this._autoClosedEnclosingDecorations=i}static getAllAutoClosedCharacters(e){let t=[];for(const i of e)t=t.concat(i.getAutoClosedCharactersRanges());return t}dispose(){this._autoClosedCharactersDecorations=this._model.deltaDecorations(this._autoClosedCharactersDecorations,[]),this._autoClosedEnclosingDecorations=this._model.deltaDecorations(this._autoClosedEnclosingDecorations,[])}getAutoClosedCharactersRanges(){const e=[];for(let t=0;t<this._autoClosedCharactersDecorations.length;t++){const i=this._model.getDecorationRange(this._autoClosedCharactersDecorations[t]);i&&e.push(i)}return e}isValid(e){const t=[];for(let i=0;i<this._autoClosedEnclosingDecorations.length;i++){const n=this._model.getDecorationRange(this._autoClosedEnclosingDecorations[i]);if(n&&(t.push(n),n.startLineNumber!==n.endLineNumber))return!1}t.sort(L.compareRangesUsingStarts),e.sort(L.compareRangesUsingStarts);for(let i=0;i<e.length;i++)if(i>=t.length||!t[i].strictContainsRange(e[i]))return!1;return!0}}class Kj{static executeCommands(e,t,i){const n={model:e,selectionsBefore:t,trackedRanges:[],trackedRangesDirection:[]},s=this._innerExecuteCommands(n,i);for(let r=0,a=n.trackedRanges.length;r<a;r++)n.model._setTrackedRange(n.trackedRanges[r],null,0);return s}static _innerExecuteCommands(e,t){if(this._arrayIsEmpty(t))return null;const i=this._getEditOperations(e,t);if(i.operations.length===0)return null;const n=i.operations,s=this._getLoserCursorMap(n);if(s.hasOwnProperty(\"0\"))return console.warn(\"Ignoring commands\"),null;const r=[];for(let c=0,d=n.length;c<d;c++)s.hasOwnProperty(n[c].identifier.major.toString())||r.push(n[c]);i.hadTrackedEditOperation&&r.length>0&&(r[0]._isTracked=!0);let a=e.model.pushEditOperations(e.selectionsBefore,r,c=>{const d=[];for(let g=0;g<e.selectionsBefore.length;g++)d[g]=[];for(const g of c)!g.identifier||d[g.identifier.major].push(g);const h=(g,f)=>g.identifier.minor-f.identifier.minor,u=[];for(let g=0;g<e.selectionsBefore.length;g++)d[g].length>0?(d[g].sort(h),u[g]=t[g].computeCursorState(e.model,{getInverseEditOperations:()=>d[g],getTrackedSelection:f=>{const _=parseInt(f,10),b=e.model._getTrackedRange(e.trackedRanges[_]);return e.trackedRangesDirection[_]===0?new oe(b.startLineNumber,b.startColumn,b.endLineNumber,b.endColumn):new oe(b.endLineNumber,b.endColumn,b.startLineNumber,b.startColumn)}})):u[g]=e.selectionsBefore[g];return u});a||(a=e.selectionsBefore);const l=[];for(const c in s)s.hasOwnProperty(c)&&l.push(parseInt(c,10));l.sort((c,d)=>d-c);for(const c of l)a.splice(c,1);return a}static _arrayIsEmpty(e){for(let t=0,i=e.length;t<i;t++)if(e[t])return!1;return!0}static _getEditOperations(e,t){let i=[],n=!1;for(let s=0,r=t.length;s<r;s++){const a=t[s];if(a){const l=this._getEditOperationsFromCommand(e,s,a);i=i.concat(l.operations),n=n||l.hadTrackedEditOperation}}return{operations:i,hadTrackedEditOperation:n}}static _getEditOperationsFromCommand(e,t,i){const n=[];let s=0;const r=(h,u,g=!1)=>{L.isEmpty(h)&&u===\"\"||n.push({identifier:{major:t,minor:s++},range:h,text:u,forceMoveMarkers:g,isAutoWhitespaceEdit:i.insertsAutoWhitespace})};let a=!1;const d={addEditOperation:r,addTrackedEditOperation:(h,u,g)=>{a=!0,r(h,u,g)},trackSelection:(h,u)=>{const g=oe.liftSelection(h);let f;if(g.isEmpty())if(typeof u==\"boolean\")u?f=2:f=3;else{const v=e.model.getLineMaxColumn(g.startLineNumber);g.startColumn===v?f=2:f=3}else f=1;const _=e.trackedRanges.length,b=e.model._setTrackedRange(null,g,f);return e.trackedRanges[_]=b,e.trackedRangesDirection[_]=g.getDirection(),_.toString()}};try{i.getEditOperations(e.model,d)}catch(h){return Ee(h),{operations:[],hadTrackedEditOperation:!1}}return{operations:n,hadTrackedEditOperation:a}}static _getLoserCursorMap(e){e=e.slice(0),e.sort((i,n)=>-L.compareRangesUsingEnds(i.range,n.range));const t={};for(let i=1;i<e.length;i++){const n=e[i-1],s=e[i];if(L.getStartPosition(n.range).isBefore(L.getEndPosition(s.range))){let r;n.identifier.major>s.identifier.major?r=n.identifier.major:r=s.identifier.major,t[r.toString()]=!0;for(let a=0;a<e.length;a++)e[a].identifier.major===r&&(e.splice(a,1),a<i&&i--,a--);i>0&&i--}}return t}}class qj{constructor(e,t,i){this.text=e,this.startSelection=t,this.endSelection=i}}class op{constructor(e,t){this._original=op._capture(e,t)}static _capture(e,t){const i=[];for(const n of t){if(n.startLineNumber!==n.endLineNumber)return null;i.push(new qj(e.getLineContent(n.startLineNumber),n.startColumn-1,n.endColumn-1))}return i}deduceOutcome(e,t){if(!this._original)return null;const i=op._capture(e,t);if(!i||this._original.length!==i.length)return null;const n=[];for(let s=0,r=this._original.length;s<r;s++)n.push(op._deduceOutcome(this._original[s],i[s]));return n}static _deduceOutcome(e,t){const i=Math.min(e.startSelection,t.startSelection,Pd(e.text,t.text)),n=Math.min(e.text.length-e.endSelection,t.text.length-t.endSelection,Np(e.text,t.text)),s=e.text.substring(i,e.text.length-n),r=t.text.substring(i,t.text.length-n);return new cV(s,e.startSelection-i,e.endSelection-i,r,t.startSelection-i,t.endSelection-i)}}class M4{constructor(e,t,i,n,s,r){this.id=e,this.label=t,this.alias=i,this._precondition=n,this._run=s,this._contextKeyService=r}isSupported(){return this._contextKeyService.contextMatchesRules(this._precondition)}run(){return this.isSupported()?this._run():Promise.resolve(void 0)}}const r1={ICodeEditor:\"vs.editor.ICodeEditor\",IDiffEditor:\"vs.editor.IDiffEditor\"};function Ud(o){let e=0,t=0,i=0,n=0;for(let s=0,r=o.length;s<r;s++){const a=o.charCodeAt(s);a===13?(e===0&&(t=s),e++,s+1<r&&o.charCodeAt(s+1)===10?(n|=2,s++):n|=3,i=s+1):a===10&&(n|=1,e===0&&(t=s),e++,i=s+1)}return e===0&&(t=o.length),[e,t,o.length-i,n]}class Q_{constructor(e,t,i,n){this.range=e,this.nestingLevel=t,this.nestingLevelOfEqualBracketType=i,this.isInvalid=n}}class Gj{constructor(e,t,i,n,s,r){this.range=e,this.openingBracketRange=t,this.closingBracketRange=i,this.nestingLevel=n,this.nestingLevelOfEqualBracketType=s,this.bracketPairNode=r}get openingBracketInfo(){return this.bracketPairNode.openingBracket.bracketInfo}}class Zj extends Gj{constructor(e,t,i,n,s,r,a){super(e,t,i,n,s,r),this.minVisibleColumnIndentation=a}}class eL{constructor(e,t){this.lineCount=e,this.columnCount=t}toString(){return`${this.lineCount},${this.columnCount}`}}eL.zero=new eL(0,0);function Yj(o,e,t,i){return o!==t?Xt(t-o,i):Xt(0,i-e)}const go=0;function Xj(o){return o===0}const Ss=Math.pow(2,26);function Xt(o,e){return o*Ss+e}function Zl(o){const e=o,t=Math.floor(e/Ss),i=e-t*Ss;return new eL(t,i)}function Qj(o){return Math.floor(o/Ss)}function qt(o,e){return e<Ss?o+e:o-o%Ss+e}function Jj(o,e){const t=o,i=e;if(i-t<=0)return go;const s=Math.floor(t/Ss),r=Math.floor(i/Ss),a=i-r*Ss;if(s===r){const l=t-s*Ss;return Xt(0,a-l)}else return Xt(r-s,a)}function Fu(o,e){return o<e}function Bl(o,e){return o<=e}function Vf(o,e){return o>=e}function Rh(o){return Xt(o.lineNumber-1,o.column-1)}function Ua(o,e){const t=o,i=Math.floor(t/Ss),n=t-i*Ss,s=e,r=Math.floor(s/Ss),a=s-r*Ss;return new L(i+1,n+1,r+1,a+1)}function eK(o){const e=Ur(o);return Xt(e.length-1,e[e.length-1].length)}class b2{constructor(e,t,i){this.startOffset=e,this.endOffset=t,this.newLength=i}}class tK{constructor(e,t){this.documentLength=t,this.nextEditIdx=0,this.deltaOldToNewLineCount=0,this.deltaOldToNewColumnCount=0,this.deltaLineIdxInOld=-1,this.edits=e.map(i=>RI.from(i))}getOffsetBeforeChange(e){return this.adjustNextEdit(e),this.translateCurToOld(e)}getDistanceToNextChange(e){this.adjustNextEdit(e);const t=this.edits[this.nextEditIdx],i=t?this.translateOldToCur(t.offsetObj):this.documentLength;return Jj(e,i)}translateOldToCur(e){return e.lineCount===this.deltaLineIdxInOld?Xt(e.lineCount+this.deltaOldToNewLineCount,e.columnCount+this.deltaOldToNewColumnCount):Xt(e.lineCount+this.deltaOldToNewLineCount,e.columnCount)}translateCurToOld(e){const t=Zl(e);return t.lineCount-this.deltaOldToNewLineCount===this.deltaLineIdxInOld?Xt(t.lineCount-this.deltaOldToNewLineCount,t.columnCount-this.deltaOldToNewColumnCount):Xt(t.lineCount-this.deltaOldToNewLineCount,t.columnCount)}adjustNextEdit(e){for(;this.nextEditIdx<this.edits.length;){const t=this.edits[this.nextEditIdx],i=this.translateOldToCur(t.endOffsetAfterObj);if(Bl(i,e)){this.nextEditIdx++;const n=Zl(i),s=Zl(this.translateOldToCur(t.endOffsetBeforeObj)),r=n.lineCount-s.lineCount;this.deltaOldToNewLineCount+=r;const a=this.deltaLineIdxInOld===t.endOffsetBeforeObj.lineCount?this.deltaOldToNewColumnCount:0,l=n.columnCount-s.columnCount;this.deltaOldToNewColumnCount=a+l,this.deltaLineIdxInOld=t.endOffsetBeforeObj.lineCount}else break}}}class RI{constructor(e,t,i){this.endOffsetBeforeObj=Zl(t),this.endOffsetAfterObj=Zl(qt(e,i)),this.offsetObj=Zl(e)}static from(e){return new RI(e.startOffset,e.endOffset,e.newLength)}}const o0=new Array;class ri{constructor(e,t){this.items=e,this.additionalItems=t}static create(e,t){if(e<=128&&t.length===0){let i=ri.cache[e];return i||(i=new ri(e,t),ri.cache[e]=i),i}return new ri(e,t)}static getEmpty(){return this.empty}add(e,t){const i=t.getKey(e);let n=i>>5;if(n===0){const r=1<<i|this.items;return r===this.items?this:ri.create(r,this.additionalItems)}n--;const s=this.additionalItems.slice(0);for(;s.length<n;)s.push(0);return s[n]|=1<<(i&31),ri.create(this.items,s)}merge(e){const t=this.items|e.items;if(this.additionalItems===o0&&e.additionalItems===o0)return t===this.items?this:t===e.items?e:ri.create(t,o0);const i=new Array;for(let n=0;n<Math.max(this.additionalItems.length,e.additionalItems.length);n++){const s=this.additionalItems[n]||0,r=e.additionalItems[n]||0;i.push(s|r)}return ri.create(t,i)}intersects(e){if((this.items&e.items)!==0)return!0;for(let t=0;t<Math.min(this.additionalItems.length,e.additionalItems.length);t++)if((this.additionalItems[t]&e.additionalItems[t])!==0)return!0;return!1}}ri.cache=new Array(129);ri.empty=ri.create(0,o0);const v2={getKey(o){return o}};class A4{constructor(){this.items=new Map}getKey(e){let t=this.items.get(e);return t===void 0&&(t=this.items.size,this.items.set(e,t)),t}}class OI{constructor(e){this._length=e}get length(){return this._length}}class Xp extends OI{constructor(e,t,i,n,s){super(e),this.openingBracket=t,this.child=i,this.closingBracket=n,this.missingOpeningBracketIds=s}static create(e,t,i){let n=e.length;return t&&(n=qt(n,t.length)),i&&(n=qt(n,i.length)),new Xp(n,e,t,i,t?t.missingOpeningBracketIds:ri.getEmpty())}get kind(){return 2}get listHeight(){return 0}get childrenLength(){return 3}getChild(e){switch(e){case 0:return this.openingBracket;case 1:return this.child;case 2:return this.closingBracket}throw new Error(\"Invalid child index\")}get children(){const e=new Array;return e.push(this.openingBracket),this.child&&e.push(this.child),this.closingBracket&&e.push(this.closingBracket),e}canBeReused(e){return!(this.closingBracket===null||e.intersects(this.missingOpeningBracketIds))}deepClone(){return new Xp(this.length,this.openingBracket.deepClone(),this.child&&this.child.deepClone(),this.closingBracket&&this.closingBracket.deepClone(),this.missingOpeningBracketIds)}computeMinIndentation(e,t){return this.child?this.child.computeMinIndentation(qt(e,this.openingBracket.length),t):Number.MAX_SAFE_INTEGER}}class Kr extends OI{constructor(e,t,i){super(e),this.listHeight=t,this._missingOpeningBracketIds=i,this.cachedMinIndentation=-1}static create23(e,t,i,n=!1){let s=e.length,r=e.missingOpeningBracketIds;if(e.listHeight!==t.listHeight)throw new Error(\"Invalid list heights\");if(s=qt(s,t.length),r=r.merge(t.missingOpeningBracketIds),i){if(e.listHeight!==i.listHeight)throw new Error(\"Invalid list heights\");s=qt(s,i.length),r=r.merge(i.missingOpeningBracketIds)}return n?new iK(s,e.listHeight+1,e,t,i,r):new Qp(s,e.listHeight+1,e,t,i,r)}static getEmpty(){return new nK(go,0,[],ri.getEmpty())}get kind(){return 4}get missingOpeningBracketIds(){return this._missingOpeningBracketIds}throwIfImmutable(){}makeLastElementMutable(){this.throwIfImmutable();const e=this.childrenLength;if(e===0)return;const t=this.getChild(e-1),i=t.kind===4?t.toMutable():t;return t!==i&&this.setChild(e-1,i),i}makeFirstElementMutable(){if(this.throwIfImmutable(),this.childrenLength===0)return;const t=this.getChild(0),i=t.kind===4?t.toMutable():t;return t!==i&&this.setChild(0,i),i}canBeReused(e){if(e.intersects(this.missingOpeningBracketIds))return!1;let t=this,i;for(;t.kind===4&&(i=t.childrenLength)>0;)t=t.getChild(i-1);return t.canBeReused(e)}handleChildrenChanged(){this.throwIfImmutable();const e=this.childrenLength;let t=this.getChild(0).length,i=this.getChild(0).missingOpeningBracketIds;for(let n=1;n<e;n++){const s=this.getChild(n);t=qt(t,s.length),i=i.merge(s.missingOpeningBracketIds)}this._length=t,this._missingOpeningBracketIds=i,this.cachedMinIndentation=-1}computeMinIndentation(e,t){if(this.cachedMinIndentation!==-1)return this.cachedMinIndentation;let i=Number.MAX_SAFE_INTEGER,n=e;for(let s=0;s<this.childrenLength;s++){const r=this.getChild(s);r&&(i=Math.min(i,r.computeMinIndentation(n,t)),n=qt(n,r.length))}return this.cachedMinIndentation=i,i}}class Qp extends Kr{constructor(e,t,i,n,s,r){super(e,t,r),this._item1=i,this._item2=n,this._item3=s}get childrenLength(){return this._item3!==null?3:2}getChild(e){switch(e){case 0:return this._item1;case 1:return this._item2;case 2:return this._item3}throw new Error(\"Invalid child index\")}setChild(e,t){switch(e){case 0:this._item1=t;return;case 1:this._item2=t;return;case 2:this._item3=t;return}throw new Error(\"Invalid child index\")}get children(){return this._item3?[this._item1,this._item2,this._item3]:[this._item1,this._item2]}get item1(){return this._item1}get item2(){return this._item2}get item3(){return this._item3}deepClone(){return new Qp(this.length,this.listHeight,this._item1.deepClone(),this._item2.deepClone(),this._item3?this._item3.deepClone():null,this.missingOpeningBracketIds)}appendChildOfSameHeight(e){if(this._item3)throw new Error(\"Cannot append to a full (2,3) tree node\");this.throwIfImmutable(),this._item3=e,this.handleChildrenChanged()}unappendChild(){if(!this._item3)throw new Error(\"Cannot remove from a non-full (2,3) tree node\");this.throwIfImmutable();const e=this._item3;return this._item3=null,this.handleChildrenChanged(),e}prependChildOfSameHeight(e){if(this._item3)throw new Error(\"Cannot prepend to a full (2,3) tree node\");this.throwIfImmutable(),this._item3=this._item2,this._item2=this._item1,this._item1=e,this.handleChildrenChanged()}unprependChild(){if(!this._item3)throw new Error(\"Cannot remove from a non-full (2,3) tree node\");this.throwIfImmutable();const e=this._item1;return this._item1=this._item2,this._item2=this._item3,this._item3=null,this.handleChildrenChanged(),e}toMutable(){return this}}class iK extends Qp{toMutable(){return new Qp(this.length,this.listHeight,this.item1,this.item2,this.item3,this.missingOpeningBracketIds)}throwIfImmutable(){throw new Error(\"this instance is immutable\")}}class cv extends Kr{constructor(e,t,i,n){super(e,t,n),this._children=i}get childrenLength(){return this._children.length}getChild(e){return this._children[e]}setChild(e,t){this._children[e]=t}get children(){return this._children}deepClone(){const e=new Array(this._children.length);for(let t=0;t<this._children.length;t++)e[t]=this._children[t].deepClone();return new cv(this.length,this.listHeight,e,this.missingOpeningBracketIds)}appendChildOfSameHeight(e){this.throwIfImmutable(),this._children.push(e),this.handleChildrenChanged()}unappendChild(){this.throwIfImmutable();const e=this._children.pop();return this.handleChildrenChanged(),e}prependChildOfSameHeight(e){this.throwIfImmutable(),this._children.unshift(e),this.handleChildrenChanged()}unprependChild(){this.throwIfImmutable();const e=this._children.shift();return this.handleChildrenChanged(),e}toMutable(){return this}}class nK extends cv{toMutable(){return new cv(this.length,this.listHeight,[...this.children],this.missingOpeningBracketIds)}throwIfImmutable(){throw new Error(\"this instance is immutable\")}}const sK=[];class PI extends OI{get listHeight(){return 0}get childrenLength(){return 0}getChild(e){return null}get children(){return sK}deepClone(){return this}}class Xh extends PI{get kind(){return 0}get missingOpeningBracketIds(){return ri.getEmpty()}canBeReused(e){return!0}computeMinIndentation(e,t){const i=Zl(e),n=(i.columnCount===0?i.lineCount:i.lineCount+1)+1,s=Qj(qt(e,this.length))+1;let r=Number.MAX_SAFE_INTEGER;for(let a=n;a<=s;a++){const l=t.getLineFirstNonWhitespaceColumn(a),c=t.getLineContent(a);if(l===0)continue;const d=_i.visibleColumnFromColumn(c,l,t.getOptions().tabSize);r=Math.min(r,d)}return r}}class dv extends PI{constructor(e,t,i){super(e),this.bracketInfo=t,this.bracketIds=i}static create(e,t,i){return new dv(e,t,i)}get kind(){return 1}get missingOpeningBracketIds(){return ri.getEmpty()}get text(){return this.bracketInfo.bracketText}get languageId(){return this.bracketInfo.languageId}canBeReused(e){return!1}computeMinIndentation(e,t){return Number.MAX_SAFE_INTEGER}}class oK extends PI{constructor(e,t){super(t),this.missingOpeningBracketIds=e}get kind(){return 3}canBeReused(e){return!e.intersects(this.missingOpeningBracketIds)}computeMinIndentation(e,t){return Number.MAX_SAFE_INTEGER}}class Yn{static getLanguageId(e){return(e&255)>>>0}static getTokenType(e){return(e&768)>>>8}static containsBalancedBrackets(e){return(e&1024)!==0}static getFontStyle(e){return(e&30720)>>>11}static getForeground(e){return(e&16744448)>>>15}static getBackground(e){return(e&4278190080)>>>24}static getClassNameFromMetadata(e){const t=this.getForeground(e);let i=\"mtk\"+t;const n=this.getFontStyle(e);return n&1&&(i+=\" mtki\"),n&2&&(i+=\" mtkb\"),n&4&&(i+=\" mtku\"),n&8&&(i+=\" mtks\"),i}static getInlineStyleFromMetadata(e,t){const i=this.getForeground(e),n=this.getFontStyle(e);let s=`color: ${t[i]};`;n&1&&(s+=\"font-style: italic;\"),n&2&&(s+=\"font-weight: bold;\");let r=\"\";return n&4&&(r+=\" underline\"),n&8&&(r+=\" line-through\"),r&&(s+=`text-decoration:${r};`),s}static getPresentationFromMetadata(e){const t=this.getForeground(e),i=this.getFontStyle(e);return{foreground:t,italic:Boolean(i&1),bold:Boolean(i&2),underline:Boolean(i&4),strikethrough:Boolean(i&8)}}}class El{constructor(e,t,i,n,s){this.length=e,this.kind=t,this.bracketId=i,this.bracketIds=n,this.astNode=s}}class R4{constructor(e,t){this.textModel=e,this.bracketTokens=t,this.reader=new rK(this.textModel,this.bracketTokens),this._offset=go,this.didPeek=!1,this.peeked=null,this.textBufferLineCount=e.getLineCount(),this.textBufferLastLineLength=e.getLineLength(this.textBufferLineCount)}get offset(){return this._offset}get length(){return Xt(this.textBufferLineCount,this.textBufferLastLineLength)}skip(e){this.didPeek=!1,this._offset=qt(this._offset,e);const t=Zl(this._offset);this.reader.setPosition(t.lineCount,t.columnCount)}read(){let e;return this.peeked?(this.didPeek=!1,e=this.peeked):e=this.reader.read(),e&&(this._offset=qt(this._offset,e.length)),e}peek(){return this.didPeek||(this.peeked=this.reader.read(),this.didPeek=!0),this.peeked}}class rK{constructor(e,t){this.textModel=e,this.bracketTokens=t,this.lineIdx=0,this.line=null,this.lineCharOffset=0,this.lineTokens=null,this.lineTokenOffset=0,this.peekedToken=null,this.textBufferLineCount=e.getLineCount(),this.textBufferLastLineLength=e.getLineLength(this.textBufferLineCount)}setPosition(e,t){e===this.lineIdx?(this.lineCharOffset=t,this.lineTokenOffset=this.lineCharOffset===0?0:this.lineTokens.findTokenIndexAtOffset(this.lineCharOffset)):(this.lineIdx=e,this.lineCharOffset=t,this.line=null),this.peekedToken=null}read(){if(this.peekedToken){const s=this.peekedToken;return this.peekedToken=null,this.lineCharOffset+=s.length,s}if(this.lineIdx>this.textBufferLineCount-1||this.lineIdx===this.textBufferLineCount-1&&this.lineCharOffset>=this.textBufferLastLineLength)return null;this.line===null&&(this.lineTokens=this.textModel.tokenization.getLineTokens(this.lineIdx+1),this.line=this.lineTokens.getLineContent(),this.lineTokenOffset=this.lineCharOffset===0?0:this.lineTokens.findTokenIndexAtOffset(this.lineCharOffset));const e=this.lineIdx,t=this.lineCharOffset;let i=0;for(;;){const s=this.lineTokens,r=s.getCount();let a=null;if(this.lineTokenOffset<r){const l=s.getMetadata(this.lineTokenOffset);for(;this.lineTokenOffset+1<r&&l===s.getMetadata(this.lineTokenOffset+1);)this.lineTokenOffset++;const c=Yn.getTokenType(l)===0,d=Yn.containsBalancedBrackets(l),h=s.getEndOffset(this.lineTokenOffset);if(d&&c&&this.lineCharOffset<h){const u=s.getLanguageId(this.lineTokenOffset),g=this.line.substring(this.lineCharOffset,h),f=this.bracketTokens.getSingleLanguageBracketTokens(u),_=f.regExpGlobal;if(_){_.lastIndex=0;const b=_.exec(g);b&&(a=f.getToken(b[0]),a&&(this.lineCharOffset+=b.index))}}if(i+=h-this.lineCharOffset,a)if(e!==this.lineIdx||t!==this.lineCharOffset){this.peekedToken=a;break}else return this.lineCharOffset+=a.length,a;else this.lineTokenOffset++,this.lineCharOffset=h}else if(this.lineIdx===this.textBufferLineCount-1||(this.lineIdx++,this.lineTokens=this.textModel.tokenization.getLineTokens(this.lineIdx+1),this.lineTokenOffset=0,this.line=this.lineTokens.getLineContent(),this.lineCharOffset=0,i+=33,i>1e3))break;if(i>1500)break}const n=Yj(e,t,this.lineIdx,this.lineCharOffset);return new El(n,0,-1,ri.getEmpty(),new Xh(n))}}class aK{constructor(e,t){this.text=e,this._offset=go,this.idx=0;const i=t.getRegExpStr(),n=i?new RegExp(i+`|\n`,\"gi\"):null,s=[];let r,a=0,l=0,c=0,d=0;const h=new Array;for(let f=0;f<60;f++)h.push(new El(Xt(0,f),0,-1,ri.getEmpty(),new Xh(Xt(0,f))));const u=new Array;for(let f=0;f<60;f++)u.push(new El(Xt(1,f),0,-1,ri.getEmpty(),new Xh(Xt(1,f))));if(n)for(n.lastIndex=0;(r=n.exec(e))!==null;){const f=r.index,_=r[0];if(_===`\n`)a++,l=f+1;else{if(c!==f){let b;if(d===a){const v=f-c;if(v<h.length)b=h[v];else{const C=Xt(0,v);b=new El(C,0,-1,ri.getEmpty(),new Xh(C))}}else{const v=a-d,C=f-l;if(v===1&&C<u.length)b=u[C];else{const w=Xt(v,C);b=new El(w,0,-1,ri.getEmpty(),new Xh(w))}}s.push(b)}s.push(t.getToken(_)),c=f+_.length,d=a}}const g=e.length;if(c!==g){const f=d===a?Xt(0,g-c):Xt(a-d,g-l);s.push(new El(f,0,-1,ri.getEmpty(),new Xh(f)))}this.length=Xt(a,g-l),this.tokens=s}get offset(){return this._offset}read(){return this.tokens[this.idx++]||null}peek(){return this.tokens[this.idx]||null}skip(e){throw new A8}}class FI{constructor(e){this.map=e,this.hasRegExp=!1,this._regExpGlobal=null}static createFromLanguage(e,t){function i(s){return t.getKey(`${s.languageId}:::${s.bracketText}`)}const n=new Map;for(const s of e.bracketsNew.openingBrackets){const r=Xt(0,s.bracketText.length),a=i(s),l=ri.getEmpty().add(a,v2);n.set(s.bracketText,new El(r,1,a,l,dv.create(r,s,l)))}for(const s of e.bracketsNew.closingBrackets){const r=Xt(0,s.bracketText.length);let a=ri.getEmpty();const l=s.getClosedBrackets();for(const c of l)a=a.add(i(c),v2);n.set(s.bracketText,new El(r,2,i(l[0]),a,dv.create(r,s,a)))}return new FI(n)}getRegExpStr(){if(this.isEmpty)return null;{const e=[...this.map.keys()];return e.sort(),e.reverse(),e.map(t=>lK(t)).join(\"|\")}}get regExpGlobal(){if(!this.hasRegExp){const e=this.getRegExpStr();this._regExpGlobal=e?new RegExp(e,\"gi\"):null,this.hasRegExp=!0}return this._regExpGlobal}getToken(e){return this.map.get(e.toLowerCase())}findClosingTokenText(e){for(const[t,i]of this.map)if(i.kind===2&&i.bracketIds.intersects(e))return t}get isEmpty(){return this.map.size===0}}function lK(o){let e=Ds(o);return/^[\\w ]+/.test(o)&&(e=`\\\\b${e}`),/[\\w ]+$/.test(o)&&(e=`${e}\\\\b`),e}class O4{constructor(e,t){this.denseKeyProvider=e,this.getLanguageConfiguration=t,this.languageIdToBracketTokens=new Map}didLanguageChange(e){return this.languageIdToBracketTokens.has(e)}getSingleLanguageBracketTokens(e){let t=this.languageIdToBracketTokens.get(e);return t||(t=FI.createFromLanguage(this.getLanguageConfiguration(e),this.denseKeyProvider),this.languageIdToBracketTokens.set(e,t)),t}}function cK(o){if(o.length===0)return null;if(o.length===1)return o[0];let e=0;function t(){if(e>=o.length)return null;const r=e,a=o[r].listHeight;for(e++;e<o.length&&o[e].listHeight===a;)e++;return e-r>=2?P4(r===0&&e===o.length?o:o.slice(r,e),!1):o[r]}let i=t(),n=t();if(!n)return i;for(let r=t();r;r=t())C2(i,n)<=C2(n,r)?(i=Hw(i,n),n=r):n=Hw(n,r);return Hw(i,n)}function P4(o,e=!1){if(o.length===0)return null;if(o.length===1)return o[0];let t=o.length;for(;t>3;){const i=t>>1;for(let n=0;n<i;n++){const s=n<<1;o[n]=Kr.create23(o[s],o[s+1],s+3===t?o[s+2]:null,e)}t=i}return Kr.create23(o[0],o[1],t>=3?o[2]:null,e)}function C2(o,e){return Math.abs(o.listHeight-e.listHeight)}function Hw(o,e){return o.listHeight===e.listHeight?Kr.create23(o,e,null,!1):o.listHeight>e.listHeight?dK(o,e):hK(e,o)}function dK(o,e){o=o.toMutable();let t=o;const i=new Array;let n;for(;;){if(e.listHeight===t.listHeight){n=e;break}if(t.kind!==4)throw new Error(\"unexpected\");i.push(t),t=t.makeLastElementMutable()}for(let s=i.length-1;s>=0;s--){const r=i[s];n?r.childrenLength>=3?n=Kr.create23(r.unappendChild(),n,null,!1):(r.appendChildOfSameHeight(n),n=void 0):r.handleChildrenChanged()}return n?Kr.create23(o,n,null,!1):o}function hK(o,e){o=o.toMutable();let t=o;const i=new Array;for(;e.listHeight!==t.listHeight;){if(t.kind!==4)throw new Error(\"unexpected\");i.push(t),t=t.makeFirstElementMutable()}let n=e;for(let s=i.length-1;s>=0;s--){const r=i[s];n?r.childrenLength>=3?n=Kr.create23(n,r.unprependChild(),null,!1):(r.prependChildOfSameHeight(n),n=void 0):r.handleChildrenChanged()}return n?Kr.create23(n,o,null,!1):o}class uK{constructor(e){this.lastOffset=go,this.nextNodes=[e],this.offsets=[go],this.idxs=[]}readLongestNodeAt(e,t){if(Fu(e,this.lastOffset))throw new Error(\"Invalid offset\");for(this.lastOffset=e;;){const i=ff(this.nextNodes);if(!i)return;const n=ff(this.offsets);if(Fu(e,n))return;if(Fu(n,e))if(qt(n,i.length)<=e)this.nextNodeAfterCurrent();else{const s=zw(i);s!==-1?(this.nextNodes.push(i.getChild(s)),this.offsets.push(n),this.idxs.push(s)):this.nextNodeAfterCurrent()}else{if(t(i))return this.nextNodeAfterCurrent(),i;{const s=zw(i);if(s===-1){this.nextNodeAfterCurrent();return}else this.nextNodes.push(i.getChild(s)),this.offsets.push(n),this.idxs.push(s)}}}}nextNodeAfterCurrent(){for(;;){const e=ff(this.offsets),t=ff(this.nextNodes);if(this.nextNodes.pop(),this.offsets.pop(),this.idxs.length===0)break;const i=ff(this.nextNodes),n=zw(i,this.idxs[this.idxs.length-1]);if(n!==-1){this.nextNodes.push(i.getChild(n)),this.offsets.push(qt(e,t.length)),this.idxs[this.idxs.length-1]=n;break}else this.idxs.pop()}}}function zw(o,e=-1){for(;;){if(e++,e>=o.childrenLength)return-1;if(o.getChild(e))return e}}function ff(o){return o.length>0?o[o.length-1]:void 0}function tL(o,e,t,i){return new gK(o,e,t,i).parseDocument()}class gK{constructor(e,t,i,n){if(this.tokenizer=e,this.createImmutableLists=n,this._itemsConstructed=0,this._itemsFromCache=0,i&&n)throw new Error(\"Not supported\");this.oldNodeReader=i?new uK(i):void 0,this.positionMapper=new tK(t,e.length)}parseDocument(){this._itemsConstructed=0,this._itemsFromCache=0;let e=this.parseList(ri.getEmpty());return e||(e=Kr.getEmpty()),e}parseList(e){const t=new Array;for(;;){const n=this.tokenizer.peek();if(!n||n.kind===2&&n.bracketIds.intersects(e))break;const s=this.parseChild(e);s.kind===4&&s.childrenLength===0||t.push(s)}return this.oldNodeReader?cK(t):P4(t,this.createImmutableLists)}parseChild(e){if(this.oldNodeReader){const i=this.positionMapper.getDistanceToNextChange(this.tokenizer.offset);if(!Xj(i)){const n=this.oldNodeReader.readLongestNodeAt(this.positionMapper.getOffsetBeforeChange(this.tokenizer.offset),s=>Fu(s.length,i)?s.canBeReused(e):!1);if(n)return this._itemsFromCache++,this.tokenizer.skip(n.length),n}}this._itemsConstructed++;const t=this.tokenizer.read();switch(t.kind){case 2:return new oK(t.bracketIds,t.length);case 0:return t.astNode;case 1:{const i=e.merge(t.bracketIds),n=this.parseList(i),s=this.tokenizer.peek();return s&&s.kind===2&&(s.bracketId===t.bracketId||s.bracketIds.intersects(t.bracketIds))?(this.tokenizer.read(),Xp.create(t.astNode,n,s.astNode)):Xp.create(t.astNode,n,null)}default:throw new Error(\"unexpected\")}}}class fK extends z{constructor(e,t){if(super(),this.textModel=e,this.getLanguageConfiguration=t,this.didChangeEmitter=new O,this.denseKeyProvider=new A4,this.brackets=new O4(this.denseKeyProvider,this.getLanguageConfiguration),this.onDidChange=this.didChangeEmitter.event,e.tokenization.backgroundTokenizationState===0){const i=this.brackets.getSingleLanguageBracketTokens(this.textModel.getLanguageId()),n=new aK(this.textModel.getValue(),i);this.initialAstWithoutTokens=tL(n,[],void 0,!0),this.astWithTokens=this.initialAstWithoutTokens}else e.tokenization.backgroundTokenizationState===2?(this.initialAstWithoutTokens=void 0,this.astWithTokens=this.parseDocumentFromTextBuffer([],void 0,!1)):e.tokenization.backgroundTokenizationState===1&&(this.initialAstWithoutTokens=this.parseDocumentFromTextBuffer([],void 0,!0),this.astWithTokens=this.initialAstWithoutTokens)}didLanguageChange(e){return this.brackets.didLanguageChange(e)}handleDidChangeBackgroundTokenizationState(){if(this.textModel.tokenization.backgroundTokenizationState===2){const e=this.initialAstWithoutTokens===void 0;this.initialAstWithoutTokens=void 0,e||this.didChangeEmitter.fire()}}handleDidChangeTokens({ranges:e}){const t=e.map(i=>new b2(Xt(i.fromLineNumber-1,0),Xt(i.toLineNumber,0),Xt(i.toLineNumber-i.fromLineNumber+1,0)));this.astWithTokens=this.parseDocumentFromTextBuffer(t,this.astWithTokens,!1),this.initialAstWithoutTokens||this.didChangeEmitter.fire()}handleContentChanged(e){const t=e.changes.map(i=>{const n=L.lift(i.range);return new b2(Rh(n.getStartPosition()),Rh(n.getEndPosition()),eK(i.text))}).reverse();this.astWithTokens=this.parseDocumentFromTextBuffer(t,this.astWithTokens,!1),this.initialAstWithoutTokens&&(this.initialAstWithoutTokens=this.parseDocumentFromTextBuffer(t,this.initialAstWithoutTokens,!1))}parseDocumentFromTextBuffer(e,t,i){const n=t,s=new R4(this.textModel,this.brackets);return tL(s,e,n,i)}getBracketsInRange(e){const t=Xt(e.startLineNumber-1,e.startColumn-1),i=Xt(e.endLineNumber-1,e.endColumn-1),n=new Array,s=this.initialAstWithoutTokens||this.astWithTokens;return iL(s,go,s.length,t,i,n,0,new Map),n}getBracketPairsInRange(e,t){const i=new Array,n=Rh(e.getStartPosition()),s=Rh(e.getEndPosition()),r=this.initialAstWithoutTokens||this.astWithTokens,a=new pK(i,t,this.textModel);return nL(r,go,r.length,n,s,a,0,new Map),i}getFirstBracketAfter(e){const t=this.initialAstWithoutTokens||this.astWithTokens;return B4(t,go,t.length,Rh(e))}getFirstBracketBefore(e){const t=this.initialAstWithoutTokens||this.astWithTokens;return F4(t,go,t.length,Rh(e))}}function F4(o,e,t,i){if(o.kind===4||o.kind===2){const n=[];for(const s of o.children)t=qt(e,s.length),n.push({nodeOffsetStart:e,nodeOffsetEnd:t}),e=t;for(let s=n.length-1;s>=0;s--){const{nodeOffsetStart:r,nodeOffsetEnd:a}=n[s];if(Fu(r,i)){const l=F4(o.children[s],r,a,i);if(l)return l}}return null}else{if(o.kind===3)return null;if(o.kind===1){const n=Ua(e,t);return{bracketInfo:o.bracketInfo,range:n}}}return null}function B4(o,e,t,i){if(o.kind===4||o.kind===2){for(const n of o.children){if(t=qt(e,n.length),Fu(i,t)){const s=B4(n,e,t,i);if(s)return s}e=t}return null}else{if(o.kind===3)return null;if(o.kind===1){const n=Ua(e,t);return{bracketInfo:o.bracketInfo,range:n}}}return null}function iL(o,e,t,i,n,s,r,a){if(!(r>200)){if(o.kind===4)for(const l of o.children)t=qt(e,l.length),Bl(e,n)&&Vf(t,i)&&iL(l,e,t,i,n,s,r,a),e=t;else if(o.kind===2){let l=0;if(a){let c=a.get(o.openingBracket.text);c===void 0&&(c=0),l=c,c++,a.set(o.openingBracket.text,c)}{const c=o.openingBracket;if(t=qt(e,c.length),Bl(e,n)&&Vf(t,i)){const d=Ua(e,t);s.push(new Q_(d,r,l,!o.closingBracket))}e=t}if(o.child){const c=o.child;t=qt(e,c.length),Bl(e,n)&&Vf(t,i)&&iL(c,e,t,i,n,s,r+1,a),e=t}if(o.closingBracket){const c=o.closingBracket;if(t=qt(e,c.length),Bl(e,n)&&Vf(t,i)){const d=Ua(e,t);s.push(new Q_(d,r,l,!1))}e=t}a==null||a.set(o.openingBracket.text,l)}else if(o.kind===3){const l=Ua(e,t);s.push(new Q_(l,r-1,0,!0))}else if(o.kind===1){const l=Ua(e,t);s.push(new Q_(l,r-1,0,!1))}}}class pK{constructor(e,t,i){this.result=e,this.includeMinIndentation=t,this.textModel=i}}function nL(o,e,t,i,n,s,r,a){var l;if(!(r>200))if(o.kind===2){let c=0;if(a){let u=a.get(o.openingBracket.text);u===void 0&&(u=0),c=u,u++,a.set(o.openingBracket.text,u)}const d=qt(e,o.openingBracket.length);let h=-1;if(s.includeMinIndentation&&(h=o.computeMinIndentation(e,s.textModel)),s.result.push(new Zj(Ua(e,t),Ua(e,d),o.closingBracket?Ua(qt(d,((l=o.child)===null||l===void 0?void 0:l.length)||go),t):void 0,r,c,o,h)),e=d,o.child){const u=o.child;t=qt(e,u.length),Bl(e,n)&&Vf(t,i)&&nL(u,e,t,i,n,s,r+1,a)}a==null||a.set(o.openingBracket.text,c)}else{let c=e;for(const d of o.children){const h=c;c=qt(c,d.length),Bl(h,n)&&Bl(i,c)&&nL(d,h,c,i,n,s,r,a)}}}class mK extends z{constructor(e,t){super(),this.textModel=e,this.languageConfigurationService=t,this.bracketPairsTree=this._register(new Vn),this.onDidChangeEmitter=new O,this.onDidChange=this.onDidChangeEmitter.event,this.bracketsRequested=!1,this._register(this.languageConfigurationService.onDidChange(i=>{var n;(!i.languageId||((n=this.bracketPairsTree.value)===null||n===void 0?void 0:n.object.didLanguageChange(i.languageId)))&&(this.bracketPairsTree.clear(),this.updateBracketPairsTree())}))}get canBuildAST(){return this.textModel.getValueLength()<=5e6}handleDidChangeOptions(e){this.bracketPairsTree.clear(),this.updateBracketPairsTree()}handleDidChangeLanguage(e){this.bracketPairsTree.clear(),this.updateBracketPairsTree()}handleDidChangeContent(e){var t;(t=this.bracketPairsTree.value)===null||t===void 0||t.object.handleContentChanged(e)}handleDidChangeBackgroundTokenizationState(){var e;(e=this.bracketPairsTree.value)===null||e===void 0||e.object.handleDidChangeBackgroundTokenizationState()}handleDidChangeTokens(e){var t;(t=this.bracketPairsTree.value)===null||t===void 0||t.object.handleDidChangeTokens(e)}updateBracketPairsTree(){if(this.bracketsRequested&&this.canBuildAST){if(!this.bracketPairsTree.value){const e=new ee;this.bracketPairsTree.value=_K(e.add(new fK(this.textModel,t=>this.languageConfigurationService.getLanguageConfiguration(t))),e),e.add(this.bracketPairsTree.value.object.onDidChange(t=>this.onDidChangeEmitter.fire(t))),this.onDidChangeEmitter.fire()}}else this.bracketPairsTree.value&&(this.bracketPairsTree.clear(),this.onDidChangeEmitter.fire())}getBracketPairsInRange(e){var t;return this.bracketsRequested=!0,this.updateBracketPairsTree(),((t=this.bracketPairsTree.value)===null||t===void 0?void 0:t.object.getBracketPairsInRange(e,!1))||[]}getBracketPairsInRangeWithMinIndentation(e){var t;return this.bracketsRequested=!0,this.updateBracketPairsTree(),((t=this.bracketPairsTree.value)===null||t===void 0?void 0:t.object.getBracketPairsInRange(e,!0))||[]}getBracketsInRange(e){var t;return this.bracketsRequested=!0,this.updateBracketPairsTree(),((t=this.bracketPairsTree.value)===null||t===void 0?void 0:t.object.getBracketsInRange(e))||[]}findMatchingBracketUp(e,t,i){const n=this.textModel.validatePosition(t),s=this.textModel.getLanguageIdAtPosition(n.lineNumber,n.column);if(this.canBuildAST){const r=this.languageConfigurationService.getLanguageConfiguration(s).bracketsNew.getClosingBracketInfo(e);if(!r)return null;const a=Ey(this.getBracketPairsInRange(L.fromPositions(t,t))||[],l=>r.closes(l.openingBracketInfo));return a?a.openingBracketRange:null}else{const r=e.toLowerCase(),a=this.languageConfigurationService.getLanguageConfiguration(s).brackets;if(!a)return null;const l=a.textIsBracket[r];return l?J_(this._findMatchingBracketUp(l,n,Uw(i))):null}}matchBracket(e,t){if(this.canBuildAST){const i=vP(this.getBracketPairsInRange(L.fromPositions(e,e)).filter(n=>n.closingBracketRange!==void 0&&(n.openingBracketRange.containsPosition(e)||n.closingBracketRange.containsPosition(e))),Xf(n=>n.openingBracketRange.containsPosition(e)?n.openingBracketRange:n.closingBracketRange,L.compareRangesUsingStarts));return i?[i.openingBracketRange,i.closingBracketRange]:null}else{const i=Uw(t);return this._matchBracket(this.textModel.validatePosition(e),i)}}_establishBracketSearchOffsets(e,t,i,n){const s=t.getCount(),r=t.getLanguageId(n);let a=Math.max(0,e.column-1-i.maxBracketLength);for(let c=n-1;c>=0;c--){const d=t.getEndOffset(c);if(d<=a)break;if(ur(t.getStandardTokenType(c))||t.getLanguageId(c)!==r){a=d;break}}let l=Math.min(t.getLineContent().length,e.column-1+i.maxBracketLength);for(let c=n+1;c<s;c++){const d=t.getStartOffset(c);if(d>=l)break;if(ur(t.getStandardTokenType(c))||t.getLanguageId(c)!==r){l=d;break}}return{searchStartOffset:a,searchEndOffset:l}}_matchBracket(e,t){const i=e.lineNumber,n=this.textModel.tokenization.getLineTokens(i),s=this.textModel.getLineContent(i),r=n.findTokenIndexAtOffset(e.column-1);if(r<0)return null;const a=this.languageConfigurationService.getLanguageConfiguration(n.getLanguageId(r)).brackets;if(a&&!ur(n.getStandardTokenType(r))){let{searchStartOffset:l,searchEndOffset:c}=this._establishBracketSearchOffsets(e,n,a,r),d=null;for(;;){const h=oo.findNextBracketInRange(a.forwardRegex,i,s,l,c);if(!h)break;if(h.startColumn<=e.column&&e.column<=h.endColumn){const u=s.substring(h.startColumn-1,h.endColumn-1).toLowerCase(),g=this._matchFoundBracket(h,a.textIsBracket[u],a.textIsOpenBracket[u],t);if(g){if(g instanceof La)return null;d=g}}l=h.endColumn-1}if(d)return d}if(r>0&&n.getStartOffset(r)===e.column-1){const l=r-1,c=this.languageConfigurationService.getLanguageConfiguration(n.getLanguageId(l)).brackets;if(c&&!ur(n.getStandardTokenType(l))){const{searchStartOffset:d,searchEndOffset:h}=this._establishBracketSearchOffsets(e,n,c,l),u=oo.findPrevBracketInRange(c.reversedRegex,i,s,d,h);if(u&&u.startColumn<=e.column&&e.column<=u.endColumn){const g=s.substring(u.startColumn-1,u.endColumn-1).toLowerCase(),f=this._matchFoundBracket(u,c.textIsBracket[g],c.textIsOpenBracket[g],t);if(f)return f instanceof La?null:f}}}return null}_matchFoundBracket(e,t,i,n){if(!t)return null;const s=i?this._findMatchingBracketDown(t,e.getEndPosition(),n):this._findMatchingBracketUp(t,e.getStartPosition(),n);return s?s instanceof La?s:[e,s]:null}_findMatchingBracketUp(e,t,i){const n=e.languageId,s=e.reversedRegex;let r=-1,a=0;const l=(c,d,h,u)=>{for(;;){if(i&&++a%100===0&&!i())return La.INSTANCE;const g=oo.findPrevBracketInRange(s,c,d,h,u);if(!g)break;const f=d.substring(g.startColumn-1,g.endColumn-1).toLowerCase();if(e.isOpen(f)?r++:e.isClose(f)&&r--,r===0)return g;u=g.startColumn-1}return null};for(let c=t.lineNumber;c>=1;c--){const d=this.textModel.tokenization.getLineTokens(c),h=d.getCount(),u=this.textModel.getLineContent(c);let g=h-1,f=u.length,_=u.length;c===t.lineNumber&&(g=d.findTokenIndexAtOffset(t.column-1),f=t.column-1,_=t.column-1);let b=!0;for(;g>=0;g--){const v=d.getLanguageId(g)===n&&!ur(d.getStandardTokenType(g));if(v)b?f=d.getStartOffset(g):(f=d.getStartOffset(g),_=d.getEndOffset(g));else if(b&&f!==_){const C=l(c,u,f,_);if(C)return C}b=v}if(b&&f!==_){const v=l(c,u,f,_);if(v)return v}}return null}_findMatchingBracketDown(e,t,i){const n=e.languageId,s=e.forwardRegex;let r=1,a=0;const l=(d,h,u,g)=>{for(;;){if(i&&++a%100===0&&!i())return La.INSTANCE;const f=oo.findNextBracketInRange(s,d,h,u,g);if(!f)break;const _=h.substring(f.startColumn-1,f.endColumn-1).toLowerCase();if(e.isOpen(_)?r++:e.isClose(_)&&r--,r===0)return f;u=f.endColumn-1}return null},c=this.textModel.getLineCount();for(let d=t.lineNumber;d<=c;d++){const h=this.textModel.tokenization.getLineTokens(d),u=h.getCount(),g=this.textModel.getLineContent(d);let f=0,_=0,b=0;d===t.lineNumber&&(f=h.findTokenIndexAtOffset(t.column-1),_=t.column-1,b=t.column-1);let v=!0;for(;f<u;f++){const C=h.getLanguageId(f)===n&&!ur(h.getStandardTokenType(f));if(C)v||(_=h.getStartOffset(f)),b=h.getEndOffset(f);else if(v&&_!==b){const w=l(d,g,_,b);if(w)return w}v=C}if(v&&_!==b){const C=l(d,g,_,b);if(C)return C}}return null}findPrevBracket(e){var t;const i=this.textModel.validatePosition(e);if(this.canBuildAST)return this.bracketsRequested=!0,this.updateBracketPairsTree(),((t=this.bracketPairsTree.value)===null||t===void 0?void 0:t.object.getFirstBracketBefore(i))||null;let n=null,s=null,r=null;for(let a=i.lineNumber;a>=1;a--){const l=this.textModel.tokenization.getLineTokens(a),c=l.getCount(),d=this.textModel.getLineContent(a);let h=c-1,u=d.length,g=d.length;if(a===i.lineNumber){h=l.findTokenIndexAtOffset(i.column-1),u=i.column-1,g=i.column-1;const _=l.getLanguageId(h);n!==_&&(n=_,s=this.languageConfigurationService.getLanguageConfiguration(n).brackets,r=this.languageConfigurationService.getLanguageConfiguration(n).bracketsNew)}let f=!0;for(;h>=0;h--){const _=l.getLanguageId(h);if(n!==_){if(s&&r&&f&&u!==g){const v=oo.findPrevBracketInRange(s.reversedRegex,a,d,u,g);if(v)return this._toFoundBracket(r,v);f=!1}n=_,s=this.languageConfigurationService.getLanguageConfiguration(n).brackets,r=this.languageConfigurationService.getLanguageConfiguration(n).bracketsNew}const b=!!s&&!ur(l.getStandardTokenType(h));if(b)f?u=l.getStartOffset(h):(u=l.getStartOffset(h),g=l.getEndOffset(h));else if(r&&s&&f&&u!==g){const v=oo.findPrevBracketInRange(s.reversedRegex,a,d,u,g);if(v)return this._toFoundBracket(r,v)}f=b}if(r&&s&&f&&u!==g){const _=oo.findPrevBracketInRange(s.reversedRegex,a,d,u,g);if(_)return this._toFoundBracket(r,_)}}return null}findNextBracket(e){var t;const i=this.textModel.validatePosition(e);if(this.canBuildAST)return this.bracketsRequested=!0,this.updateBracketPairsTree(),((t=this.bracketPairsTree.value)===null||t===void 0?void 0:t.object.getFirstBracketAfter(i))||null;const n=this.textModel.getLineCount();let s=null,r=null,a=null;for(let l=i.lineNumber;l<=n;l++){const c=this.textModel.tokenization.getLineTokens(l),d=c.getCount(),h=this.textModel.getLineContent(l);let u=0,g=0,f=0;if(l===i.lineNumber){u=c.findTokenIndexAtOffset(i.column-1),g=i.column-1,f=i.column-1;const b=c.getLanguageId(u);s!==b&&(s=b,r=this.languageConfigurationService.getLanguageConfiguration(s).brackets,a=this.languageConfigurationService.getLanguageConfiguration(s).bracketsNew)}let _=!0;for(;u<d;u++){const b=c.getLanguageId(u);if(s!==b){if(a&&r&&_&&g!==f){const C=oo.findNextBracketInRange(r.forwardRegex,l,h,g,f);if(C)return this._toFoundBracket(a,C);_=!1}s=b,r=this.languageConfigurationService.getLanguageConfiguration(s).brackets,a=this.languageConfigurationService.getLanguageConfiguration(s).bracketsNew}const v=!!r&&!ur(c.getStandardTokenType(u));if(v)_||(g=c.getStartOffset(u)),f=c.getEndOffset(u);else if(a&&r&&_&&g!==f){const C=oo.findNextBracketInRange(r.forwardRegex,l,h,g,f);if(C)return this._toFoundBracket(a,C)}_=v}if(a&&r&&_&&g!==f){const b=oo.findNextBracketInRange(r.forwardRegex,l,h,g,f);if(b)return this._toFoundBracket(a,b)}}return null}findEnclosingBrackets(e,t){const i=this.textModel.validatePosition(e);if(this.canBuildAST){const g=L.fromPositions(i),f=Ey(this.getBracketPairsInRange(L.fromPositions(i,i)),_=>_.closingBracketRange!==void 0&&_.range.strictContainsRange(g));return f?[f.openingBracketRange,f.closingBracketRange]:null}const n=Uw(t),s=this.textModel.getLineCount(),r=new Map;let a=[];const l=(g,f)=>{if(!r.has(g)){const _=[];for(let b=0,v=f?f.brackets.length:0;b<v;b++)_[b]=0;r.set(g,_)}a=r.get(g)};let c=0;const d=(g,f,_,b,v)=>{for(;;){if(n&&++c%100===0&&!n())return La.INSTANCE;const C=oo.findNextBracketInRange(g.forwardRegex,f,_,b,v);if(!C)break;const w=_.substring(C.startColumn-1,C.endColumn-1).toLowerCase(),S=g.textIsBracket[w];if(S&&(S.isOpen(w)?a[S.index]++:S.isClose(w)&&a[S.index]--,a[S.index]===-1))return this._matchFoundBracket(C,S,!1,n);b=C.endColumn-1}return null};let h=null,u=null;for(let g=i.lineNumber;g<=s;g++){const f=this.textModel.tokenization.getLineTokens(g),_=f.getCount(),b=this.textModel.getLineContent(g);let v=0,C=0,w=0;if(g===i.lineNumber){v=f.findTokenIndexAtOffset(i.column-1),C=i.column-1,w=i.column-1;const k=f.getLanguageId(v);h!==k&&(h=k,u=this.languageConfigurationService.getLanguageConfiguration(h).brackets,l(h,u))}let S=!0;for(;v<_;v++){const k=f.getLanguageId(v);if(h!==k){if(u&&S&&C!==w){const y=d(u,g,b,C,w);if(y)return J_(y);S=!1}h=k,u=this.languageConfigurationService.getLanguageConfiguration(h).brackets,l(h,u)}const x=!!u&&!ur(f.getStandardTokenType(v));if(x)S||(C=f.getStartOffset(v)),w=f.getEndOffset(v);else if(u&&S&&C!==w){const y=d(u,g,b,C,w);if(y)return J_(y)}S=x}if(u&&S&&C!==w){const k=d(u,g,b,C,w);if(k)return J_(k)}}return null}_toFoundBracket(e,t){if(!t)return null;let i=this.textModel.getValueInRange(t);i=i.toLowerCase();const n=e.getBracketInfo(i);return n?{range:t,bracketInfo:n}:null}}function _K(o,e){return{object:o,dispose:()=>e==null?void 0:e.dispose()}}function Uw(o){if(typeof o==\"undefined\")return()=>!0;{const e=Date.now();return()=>Date.now()-e<=o}}class La{constructor(){this._searchCanceledBrand=void 0}}La.INSTANCE=new La;function J_(o){return o instanceof La?null:o}class bK extends z{constructor(e){super(),this.textModel=e,this.colorProvider=new W4,this.onDidChangeEmitter=new O,this.onDidChange=this.onDidChangeEmitter.event,this.colorizationOptions=e.getOptions().bracketPairColorizationOptions,this._register(e.bracketPairs.onDidChange(t=>{this.onDidChangeEmitter.fire()}))}handleDidChangeOptions(e){this.colorizationOptions=this.textModel.getOptions().bracketPairColorizationOptions}getDecorationsInRange(e,t,i){if(t===void 0)return[];if(!this.colorizationOptions.enabled)return[];const n=new Array,s=this.textModel.bracketPairs.getBracketsInRange(e);for(const r of s)n.push({id:`bracket${r.range.toString()}-${r.nestingLevel}`,options:{description:\"BracketPairColorization\",inlineClassName:this.colorProvider.getInlineClassName(r,this.colorizationOptions.independentColorPoolPerBracketType)},ownerId:0,range:r.range});return n}getAllDecorations(e,t){return e===void 0?[]:this.colorizationOptions.enabled?this.getDecorationsInRange(new L(1,1,this.textModel.getLineCount(),1),e,t):[]}}class W4{constructor(){this.unexpectedClosingBracketClassName=\"unexpected-closing-bracket\"}getInlineClassName(e,t){return e.isInvalid?this.unexpectedClosingBracketClassName:this.getInlineClassNameOfLevel(t?e.nestingLevelOfEqualBracketType:e.nestingLevel)}getInlineClassNameOfLevel(e){return`bracket-highlighting-${e%30}`}}Rt((o,e)=>{const t=[f4,p4,m4,_4,b4,v4],i=new W4;e.addRule(`.monaco-editor .${i.unexpectedClosingBracketClassName} { color: ${o.getColor(ZU)}; }`);const n=t.map(s=>o.getColor(s)).filter(s=>!!s).filter(s=>!s.isTransparent());for(let s=0;s<30;s++){const r=n[s%n.length];e.addRule(`.monaco-editor .${i.getInlineClassNameOfLevel(s)} { color: ${r}; }`)}});function eb(o){return o.replace(/\\n/g,\"\\\\n\").replace(/\\r/g,\"\\\\r\")}class Hi{constructor(e,t,i,n){this.oldPosition=e,this.oldText=t,this.newPosition=i,this.newText=n}get oldLength(){return this.oldText.length}get oldEnd(){return this.oldPosition+this.oldText.length}get newLength(){return this.newText.length}get newEnd(){return this.newPosition+this.newText.length}toString(){return this.oldText.length===0?`(insert@${this.oldPosition} \"${eb(this.newText)}\")`:this.newText.length===0?`(delete@${this.oldPosition} \"${eb(this.oldText)}\")`:`(replace@${this.oldPosition} \"${eb(this.oldText)}\" with \"${eb(this.newText)}\")`}static _writeStringSize(e){return 4+2*e.length}static _writeString(e,t,i){const n=t.length;Io(e,n,i),i+=4;for(let s=0;s<n;s++)SW(e,t.charCodeAt(s),i),i+=2;return i}static _readString(e,t){const i=xo(e,t);return t+=4,Ny(e,t,i)}writeSize(){return 4+4+Hi._writeStringSize(this.oldText)+Hi._writeStringSize(this.newText)}write(e,t){return Io(e,this.oldPosition,t),t+=4,Io(e,this.newPosition,t),t+=4,t=Hi._writeString(e,this.oldText,t),t=Hi._writeString(e,this.newText,t),t}static read(e,t,i){const n=xo(e,t);t+=4;const s=xo(e,t);t+=4;const r=Hi._readString(e,t);t+=Hi._writeStringSize(r);const a=Hi._readString(e,t);return t+=Hi._writeStringSize(a),i.push(new Hi(n,r,s,a)),t}}function vK(o,e){return o===null||o.length===0?e:new pr(o,e).compress()}class pr{constructor(e,t){this._prevEdits=e,this._currEdits=t,this._result=[],this._resultLen=0,this._prevLen=this._prevEdits.length,this._prevDeltaOffset=0,this._currLen=this._currEdits.length,this._currDeltaOffset=0}compress(){let e=0,t=0,i=this._getPrev(e),n=this._getCurr(t);for(;e<this._prevLen||t<this._currLen;){if(i===null){this._acceptCurr(n),n=this._getCurr(++t);continue}if(n===null){this._acceptPrev(i),i=this._getPrev(++e);continue}if(n.oldEnd<=i.newPosition){this._acceptCurr(n),n=this._getCurr(++t);continue}if(i.newEnd<=n.oldPosition){this._acceptPrev(i),i=this._getPrev(++e);continue}if(n.oldPosition<i.newPosition){const[c,d]=pr._splitCurr(n,i.newPosition-n.oldPosition);this._acceptCurr(c),n=d;continue}if(i.newPosition<n.oldPosition){const[c,d]=pr._splitPrev(i,n.oldPosition-i.newPosition);this._acceptPrev(c),i=d;continue}let a,l;if(n.oldEnd===i.newEnd)a=i,l=n,i=this._getPrev(++e),n=this._getCurr(++t);else if(n.oldEnd<i.newEnd){const[c,d]=pr._splitPrev(i,n.oldLength);a=c,l=n,i=d,n=this._getCurr(++t)}else{const[c,d]=pr._splitCurr(n,i.newLength);a=i,l=c,i=this._getPrev(++e),n=d}this._result[this._resultLen++]=new Hi(a.oldPosition,a.oldText,l.newPosition,l.newText),this._prevDeltaOffset+=a.newLength-a.oldLength,this._currDeltaOffset+=l.newLength-l.oldLength}const s=pr._merge(this._result);return pr._removeNoOps(s)}_acceptCurr(e){this._result[this._resultLen++]=pr._rebaseCurr(this._prevDeltaOffset,e),this._currDeltaOffset+=e.newLength-e.oldLength}_getCurr(e){return e<this._currLen?this._currEdits[e]:null}_acceptPrev(e){this._result[this._resultLen++]=pr._rebasePrev(this._currDeltaOffset,e),this._prevDeltaOffset+=e.newLength-e.oldLength}_getPrev(e){return e<this._prevLen?this._prevEdits[e]:null}static _rebaseCurr(e,t){return new Hi(t.oldPosition-e,t.oldText,t.newPosition,t.newText)}static _rebasePrev(e,t){return new Hi(t.oldPosition,t.oldText,t.newPosition+e,t.newText)}static _splitPrev(e,t){const i=e.newText.substr(0,t),n=e.newText.substr(t);return[new Hi(e.oldPosition,e.oldText,e.newPosition,i),new Hi(e.oldEnd,\"\",e.newPosition+t,n)]}static _splitCurr(e,t){const i=e.oldText.substr(0,t),n=e.oldText.substr(t);return[new Hi(e.oldPosition,i,e.newPosition,e.newText),new Hi(e.oldPosition+t,n,e.newEnd,\"\")]}static _merge(e){if(e.length===0)return e;const t=[];let i=0,n=e[0];for(let s=1;s<e.length;s++){const r=e[s];n.oldEnd===r.oldPosition?n=new Hi(n.oldPosition,n.oldText+r.oldText,n.newPosition,n.newText+r.newText):(t[i++]=n,n=r)}return t[i++]=n,t}static _removeNoOps(e){if(e.length===0)return e;const t=[];let i=0;for(let n=0;n<e.length;n++){const s=e[n];s.oldText!==s.newText&&(t[i++]=s)}return t}}function _l(o){return o===47||o===92}function V4(o){return o.replace(/[\\\\/]/g,ai.sep)}function CK(o){return o.indexOf(\"/\")===-1&&(o=V4(o)),/^[a-zA-Z]:(\\/|$)/.test(o)&&(o=\"/\"+o),o}function w2(o,e=ai.sep){if(!o)return\"\";const t=o.length,i=o.charCodeAt(0);if(_l(i)){if(_l(o.charCodeAt(1))&&!_l(o.charCodeAt(2))){let s=3;const r=s;for(;s<t&&!_l(o.charCodeAt(s));s++);if(r!==s&&!_l(o.charCodeAt(s+1))){for(s+=1;s<t;s++)if(_l(o.charCodeAt(s)))return o.slice(0,s+1).replace(/[\\\\/]/g,e)}}return e}else if(H4(i)&&o.charCodeAt(1)===58)return _l(o.charCodeAt(2))?o.slice(0,2)+e:o.slice(0,2);let n=o.indexOf(\"://\");if(n!==-1){for(n+=3;n<t;n++)if(_l(o.charCodeAt(n)))return o.slice(0,n+1)}return\"\"}function sL(o,e,t,i=md){if(o===e)return!0;if(!o||!e||e.length>o.length)return!1;if(t){if(!$x(o,e))return!1;if(e.length===o.length)return!0;let s=e.length;return e.charAt(e.length-1)===i&&s--,o.charAt(s)===i}return e.charAt(e.length-1)!==i&&(e+=i),o.indexOf(e)===0}function H4(o){return o>=65&&o<=90||o>=97&&o<=122}function wK(o,e=nn){return e?H4(o.charCodeAt(0))&&o.charCodeAt(1)===58:!1}function gr(o){return A0(o,!0)}class BI{constructor(e){this._ignorePathCasing=e}compare(e,t,i=!1){return e===t?0:Ep(this.getComparisonKey(e,i),this.getComparisonKey(t,i))}isEqual(e,t,i=!1){return e===t?!0:!e||!t?!1:this.getComparisonKey(e,i)===this.getComparisonKey(t,i)}getComparisonKey(e,t=!1){return e.with({path:this._ignorePathCasing(e)?e.path.toLowerCase():void 0,fragment:t?null:void 0}).toString()}isEqualOrParent(e,t,i=!1){if(e.scheme===t.scheme){if(e.scheme===Ne.file)return sL(gr(e),gr(t),this._ignorePathCasing(e))&&e.query===t.query&&(i||e.fragment===t.fragment);if(y2(e.authority,t.authority))return sL(e.path,t.path,this._ignorePathCasing(e),\"/\")&&e.query===t.query&&(i||e.fragment===t.fragment)}return!1}joinPath(e,...t){return me.joinPath(e,...t)}basenameOrAuthority(e){return Ys(e)||e.authority}basename(e){return ai.basename(e.path)}extname(e){return ai.extname(e.path)}dirname(e){if(e.path.length===0)return e;let t;return e.scheme===Ne.file?t=me.file(EO(gr(e))).path:(t=ai.dirname(e.path),e.authority&&t.length&&t.charCodeAt(0)!==47&&(console.error(`dirname(\"${e.toString})) resulted in a relative path`),t=\"/\")),e.with({path:t})}normalizePath(e){if(!e.path.length)return e;let t;return e.scheme===Ne.file?t=me.file(IO(gr(e))).path:t=ai.normalize(e.path),e.with({path:t})}relativePath(e,t){if(e.scheme!==t.scheme||!y2(e.authority,t.authority))return;if(e.scheme===Ne.file){const s=Z6(gr(e),gr(t));return nn?V4(s):s}let i=e.path||\"/\";const n=t.path||\"/\";if(this._ignorePathCasing(e)){let s=0;for(const r=Math.min(i.length,n.length);s<r&&!(i.charCodeAt(s)!==n.charCodeAt(s)&&i.charAt(s).toLowerCase()!==n.charAt(s).toLowerCase());s++);i=n.substr(0,s)+i.substr(s)}return ai.relative(i,n)}resolvePath(e,t){if(e.scheme===Ne.file){const i=me.file(G6(gr(e),t));return e.with({authority:i.authority,path:i.path})}return t=CK(t),e.with({path:ai.resolve(e.path,t)})}isAbsolutePath(e){return!!e.path&&e.path[0]===\"/\"}isEqualAuthority(e,t){return e===t||e!==void 0&&t!==void 0&&su(e,t)}hasTrailingPathSeparator(e,t=md){if(e.scheme===Ne.file){const i=gr(e);return i.length>w2(i).length&&i[i.length-1]===t}else{const i=e.path;return i.length>1&&i.charCodeAt(i.length-1)===47&&!/^[a-zA-Z]:(\\/$|\\\\$)/.test(e.fsPath)}}removeTrailingPathSeparator(e,t=md){return L2(e,t)?e.with({path:e.path.substr(0,e.path.length-1)}):e}addTrailingPathSeparator(e,t=md){let i=!1;if(e.scheme===Ne.file){const n=gr(e);i=n!==void 0&&n.length===w2(n).length&&n[n.length-1]===t}else{t=\"/\";const n=e.path;i=n.length===1&&n.charCodeAt(n.length-1)===47}return!i&&!L2(e,t)?e.with({path:e.path+\"/\"}):e}}const xt=new BI(()=>!1);new BI(o=>o.scheme===Ne.file?!sn:!0);new BI(o=>!0);const z4=xt.isEqual.bind(xt);xt.isEqualOrParent.bind(xt);xt.getComparisonKey.bind(xt);const SK=xt.basenameOrAuthority.bind(xt),Ys=xt.basename.bind(xt),yK=xt.extname.bind(xt),a1=xt.dirname.bind(xt),LK=xt.joinPath.bind(xt),DK=xt.normalizePath.bind(xt),kK=xt.relativePath.bind(xt),S2=xt.resolvePath.bind(xt);xt.isAbsolutePath.bind(xt);const y2=xt.isEqualAuthority.bind(xt),L2=xt.hasTrailingPathSeparator.bind(xt);xt.removeTrailingPathSeparator.bind(xt);xt.addTrailingPathSeparator.bind(xt);var dc;(function(o){o.META_DATA_LABEL=\"label\",o.META_DATA_DESCRIPTION=\"description\",o.META_DATA_SIZE=\"size\",o.META_DATA_MIME=\"mime\";function e(t){const i=new Map;t.path.substring(t.path.indexOf(\";\")+1,t.path.lastIndexOf(\";\")).split(\";\").forEach(r=>{const[a,l]=r.split(\":\");a&&l&&i.set(a,l)});const s=t.path.substring(0,t.path.indexOf(\";\"));return s&&i.set(o.META_DATA_MIME,s),i}o.parseMetaData=e})(dc||(dc={}));function Oh(o){return o.toString()}class Li{constructor(e,t,i,n,s,r,a){this.beforeVersionId=e,this.afterVersionId=t,this.beforeEOL=i,this.afterEOL=n,this.beforeCursorState=s,this.afterCursorState=r,this.changes=a}static create(e,t){const i=e.getAlternativeVersionId(),n=oL(e);return new Li(i,i,n,n,t,t,[])}append(e,t,i,n,s){t.length>0&&(this.changes=vK(this.changes,t)),this.afterEOL=i,this.afterVersionId=n,this.afterCursorState=s}static _writeSelectionsSize(e){return 4+4*4*(e?e.length:0)}static _writeSelections(e,t,i){if(Io(e,t?t.length:0,i),i+=4,t)for(const n of t)Io(e,n.selectionStartLineNumber,i),i+=4,Io(e,n.selectionStartColumn,i),i+=4,Io(e,n.positionLineNumber,i),i+=4,Io(e,n.positionColumn,i),i+=4;return i}static _readSelections(e,t,i){const n=xo(e,t);t+=4;for(let s=0;s<n;s++){const r=xo(e,t);t+=4;const a=xo(e,t);t+=4;const l=xo(e,t);t+=4;const c=xo(e,t);t+=4,i.push(new oe(r,a,l,c))}return t}serialize(){let e=10+Li._writeSelectionsSize(this.beforeCursorState)+Li._writeSelectionsSize(this.afterCursorState)+4;for(const n of this.changes)e+=n.writeSize();const t=new Uint8Array(e);let i=0;Io(t,this.beforeVersionId,i),i+=4,Io(t,this.afterVersionId,i),i+=4,LT(t,this.beforeEOL,i),i+=1,LT(t,this.afterEOL,i),i+=1,i=Li._writeSelections(t,this.beforeCursorState,i),i=Li._writeSelections(t,this.afterCursorState,i),Io(t,this.changes.length,i),i+=4;for(const n of this.changes)i=n.write(t,i);return t.buffer}static deserialize(e){const t=new Uint8Array(e);let i=0;const n=xo(t,i);i+=4;const s=xo(t,i);i+=4;const r=yT(t,i);i+=1;const a=yT(t,i);i+=1;const l=[];i=Li._readSelections(t,i,l);const c=[];i=Li._readSelections(t,i,c);const d=xo(t,i);i+=4;const h=[];for(let u=0;u<d;u++)i=Hi.read(t,i,h);return new Li(n,s,r,a,l,c,h)}}class U4{constructor(e,t,i,n){this.label=e,this.code=t,this.model=i,this._data=Li.create(i,n)}get type(){return 0}get resource(){return me.isUri(this.model)?this.model:this.model.uri}toString(){return(this._data instanceof Li?this._data:Li.deserialize(this._data)).changes.map(t=>t.toString()).join(\", \")}matchesResource(e){return(me.isUri(this.model)?this.model:this.model.uri).toString()===e.toString()}setModel(e){this.model=e}canAppend(e){return this.model===e&&this._data instanceof Li}append(e,t,i,n,s){this._data instanceof Li&&this._data.append(e,t,i,n,s)}close(){this._data instanceof Li&&(this._data=this._data.serialize())}open(){this._data instanceof Li||(this._data=Li.deserialize(this._data))}undo(){if(me.isUri(this.model))throw new Error(\"Invalid SingleModelEditStackElement\");this._data instanceof Li&&(this._data=this._data.serialize());const e=Li.deserialize(this._data);this.model._applyUndo(e.changes,e.beforeEOL,e.beforeVersionId,e.beforeCursorState)}redo(){if(me.isUri(this.model))throw new Error(\"Invalid SingleModelEditStackElement\");this._data instanceof Li&&(this._data=this._data.serialize());const e=Li.deserialize(this._data);this.model._applyRedo(e.changes,e.afterEOL,e.afterVersionId,e.afterCursorState)}heapSize(){return this._data instanceof Li&&(this._data=this._data.serialize()),this._data.byteLength+168}}class xK{constructor(e,t,i){this.label=e,this.code=t,this.type=1,this._isOpen=!0,this._editStackElementsArr=i.slice(0),this._editStackElementsMap=new Map;for(const n of this._editStackElementsArr){const s=Oh(n.resource);this._editStackElementsMap.set(s,n)}this._delegate=null}get resources(){return this._editStackElementsArr.map(e=>e.resource)}prepareUndoRedo(){if(this._delegate)return this._delegate.prepareUndoRedo(this)}matchesResource(e){const t=Oh(e);return this._editStackElementsMap.has(t)}setModel(e){const t=Oh(me.isUri(e)?e:e.uri);this._editStackElementsMap.has(t)&&this._editStackElementsMap.get(t).setModel(e)}canAppend(e){if(!this._isOpen)return!1;const t=Oh(e.uri);return this._editStackElementsMap.has(t)?this._editStackElementsMap.get(t).canAppend(e):!1}append(e,t,i,n,s){const r=Oh(e.uri);this._editStackElementsMap.get(r).append(e,t,i,n,s)}close(){this._isOpen=!1}open(){}undo(){this._isOpen=!1;for(const e of this._editStackElementsArr)e.undo()}redo(){for(const e of this._editStackElementsArr)e.redo()}heapSize(e){const t=Oh(e);return this._editStackElementsMap.has(t)?this._editStackElementsMap.get(t).heapSize():0}split(){return this._editStackElementsArr}toString(){const e=[];for(const t of this._editStackElementsArr)e.push(`${Ys(t.resource)}: ${t}`);return`{${e.join(\", \")}}`}}function oL(o){return o.getEOL()===`\n`?0:1}function Da(o){return o?o instanceof U4||o instanceof xK:!1}class WI{constructor(e,t){this._model=e,this._undoRedoService=t}pushStackElement(){const e=this._undoRedoService.getLastElement(this._model.uri);Da(e)&&e.close()}popStackElement(){const e=this._undoRedoService.getLastElement(this._model.uri);Da(e)&&e.open()}clear(){this._undoRedoService.removeElements(this._model.uri)}_getOrCreateEditStackElement(e){const t=this._undoRedoService.getLastElement(this._model.uri);if(Da(t)&&t.canAppend(this._model))return t;const i=new U4(p(\"edit\",\"Typing\"),\"undoredo.textBufferEdit\",this._model,e);return this._undoRedoService.pushElement(i),i}pushEOL(e){const t=this._getOrCreateEditStackElement(null);this._model.setEOL(e),t.append(this._model,[],oL(this._model),this._model.getAlternativeVersionId(),null)}pushEditOperation(e,t,i){const n=this._getOrCreateEditStackElement(e),s=this._model.applyEdits(t,!0),r=WI._computeCursorState(i,s),a=s.map((l,c)=>({index:c,textChange:l.textChange}));return a.sort((l,c)=>l.textChange.oldPosition===c.textChange.oldPosition?l.index-c.index:l.textChange.oldPosition-c.textChange.oldPosition),n.append(this._model,a.map(l=>l.textChange),oL(this._model),this._model.getAlternativeVersionId(),r),r}static _computeCursorState(e,t){try{return e?e(t):null}catch(i){return Ee(i),null}}}class IK{constructor(){this.spacesDiff=0,this.looksLikeAlignment=!1}}function EK(o,e,t,i,n){n.spacesDiff=0,n.looksLikeAlignment=!1;let s;for(s=0;s<e&&s<i;s++){const u=o.charCodeAt(s),g=t.charCodeAt(s);if(u!==g)break}let r=0,a=0;for(let u=s;u<e;u++)o.charCodeAt(u)===32?r++:a++;let l=0,c=0;for(let u=s;u<i;u++)t.charCodeAt(u)===32?l++:c++;if(r>0&&a>0||l>0&&c>0)return;const d=Math.abs(a-c),h=Math.abs(r-l);if(d===0){n.spacesDiff=h,h>0&&0<=l-1&&l-1<o.length&&l<t.length&&t.charCodeAt(l)!==32&&o.charCodeAt(l-1)===32&&o.charCodeAt(o.length-1)===44&&(n.looksLikeAlignment=!0);return}if(h%d===0){n.spacesDiff=h/d;return}}function D2(o,e,t){const i=Math.min(o.getLineCount(),1e4);let n=0,s=0,r=\"\",a=0;const l=[2,4,6,8,3,5,7],c=8,d=[0,0,0,0,0,0,0,0,0],h=new IK;for(let f=1;f<=i;f++){const _=o.getLineLength(f),b=o.getLineContent(f),v=_<=65536;let C=!1,w=0,S=0,k=0;for(let y=0,D=_;y<D;y++){const I=v?b.charCodeAt(y):o.getLineCharCode(f,y);if(I===9)k++;else if(I===32)S++;else{C=!0,w=y;break}}if(!C||(k>0?n++:S>1&&s++,EK(r,a,b,w,h),h.looksLikeAlignment&&!(t&&e===h.spacesDiff)))continue;const x=h.spacesDiff;x<=c&&d[x]++,r=b,a=w}let u=t;n!==s&&(u=n<s);let g=e;if(u){let f=u?0:.1*i;l.forEach(_=>{const b=d[_];b>f&&(f=b,g=_)}),g===4&&d[4]>0&&d[2]>0&&d[2]>=d[4]/2&&(g=2)}return{insertSpaces:u,tabSize:g}}function Nn(o){return(o.metadata&1)>>>0}function yt(o,e){o.metadata=o.metadata&254|e<<0}function $i(o){return(o.metadata&2)>>>1===1}function wt(o,e){o.metadata=o.metadata&253|(e?1:0)<<1}function $4(o){return(o.metadata&4)>>>2===1}function k2(o,e){o.metadata=o.metadata&251|(e?1:0)<<2}function NK(o){return(o.metadata&24)>>>3}function x2(o,e){o.metadata=o.metadata&231|e<<3}function TK(o){return(o.metadata&32)>>>5===1}function I2(o,e){o.metadata=o.metadata&223|(e?1:0)<<5}class j4{constructor(e,t,i){this.metadata=0,this.parent=this,this.left=this,this.right=this,yt(this,1),this.start=t,this.end=i,this.delta=0,this.maxEnd=i,this.id=e,this.ownerId=0,this.options=null,k2(this,!1),x2(this,1),I2(this,!1),this.cachedVersionId=0,this.cachedAbsoluteStart=t,this.cachedAbsoluteEnd=i,this.range=null,wt(this,!1)}reset(e,t,i,n){this.start=t,this.end=i,this.maxEnd=i,this.cachedVersionId=e,this.cachedAbsoluteStart=t,this.cachedAbsoluteEnd=i,this.range=n}setOptions(e){this.options=e;const t=this.options.className;k2(this,t===\"squiggly-error\"||t===\"squiggly-warning\"||t===\"squiggly-info\"),x2(this,this.options.stickiness),I2(this,this.options.collapseOnReplaceEdit)}setCachedOffsets(e,t,i){this.cachedVersionId!==i&&(this.range=null),this.cachedVersionId=i,this.cachedAbsoluteStart=e,this.cachedAbsoluteEnd=t}detach(){this.parent=null,this.left=null,this.right=null}}const Ae=new j4(null,0,0);Ae.parent=Ae;Ae.left=Ae;Ae.right=Ae;yt(Ae,0);class $w{constructor(){this.root=Ae,this.requestNormalizeDelta=!1}intervalSearch(e,t,i,n,s){return this.root===Ae?[]:WK(this,e,t,i,n,s)}search(e,t,i){return this.root===Ae?[]:BK(this,e,t,i)}collectNodesFromOwner(e){return PK(this,e)}collectNodesPostOrder(){return FK(this)}insert(e){E2(this,e),this._normalizeDeltaIfNecessary()}delete(e){N2(this,e),this._normalizeDeltaIfNecessary()}resolveNode(e,t){const i=e;let n=0;for(;e!==this.root;)e===e.parent.right&&(n+=e.parent.delta),e=e.parent;const s=i.start+n,r=i.end+n;i.setCachedOffsets(s,r,t)}acceptReplace(e,t,i,n){const s=RK(this,e,e+t);for(let r=0,a=s.length;r<a;r++){const l=s[r];N2(this,l)}this._normalizeDeltaIfNecessary(),OK(this,e,e+t,i),this._normalizeDeltaIfNecessary();for(let r=0,a=s.length;r<a;r++){const l=s[r];l.start=l.cachedAbsoluteStart,l.end=l.cachedAbsoluteEnd,AK(l,e,e+t,i,n),l.maxEnd=l.end,E2(this,l)}this._normalizeDeltaIfNecessary()}_normalizeDeltaIfNecessary(){!this.requestNormalizeDelta||(this.requestNormalizeDelta=!1,MK(this))}}function MK(o){let e=o.root,t=0;for(;e!==Ae;){if(e.left!==Ae&&!$i(e.left)){e=e.left;continue}if(e.right!==Ae&&!$i(e.right)){t+=e.delta,e=e.right;continue}e.start=t+e.start,e.end=t+e.end,e.delta=0,hc(e),wt(e,!0),wt(e.left,!1),wt(e.right,!1),e===e.parent.right&&(t-=e.parent.delta),e=e.parent}wt(o.root,!1)}function Ph(o,e,t,i){return o<t?!0:o>t||i===1?!1:i===2?!0:e}function AK(o,e,t,i,n){const s=NK(o),r=s===0||s===2,a=s===1||s===2,l=t-e,c=i,d=Math.min(l,c),h=o.start;let u=!1;const g=o.end;let f=!1;e<=h&&g<=t&&TK(o)&&(o.start=e,u=!0,o.end=e,f=!0);{const b=n?1:l>0?2:0;!u&&Ph(h,r,e,b)&&(u=!0),!f&&Ph(g,a,e,b)&&(f=!0)}if(d>0&&!n){const b=l>c?2:0;!u&&Ph(h,r,e+d,b)&&(u=!0),!f&&Ph(g,a,e+d,b)&&(f=!0)}{const b=n?1:0;!u&&Ph(h,r,t,b)&&(o.start=e+c,u=!0),!f&&Ph(g,a,t,b)&&(o.end=e+c,f=!0)}const _=c-l;u||(o.start=Math.max(0,h+_)),f||(o.end=Math.max(0,g+_)),o.start>o.end&&(o.end=o.start)}function RK(o,e,t){let i=o.root,n=0,s=0,r=0,a=0;const l=[];let c=0;for(;i!==Ae;){if($i(i)){wt(i.left,!1),wt(i.right,!1),i===i.parent.right&&(n-=i.parent.delta),i=i.parent;continue}if(!$i(i.left)){if(s=n+i.maxEnd,s<e){wt(i,!0);continue}if(i.left!==Ae){i=i.left;continue}}if(r=n+i.start,r>t){wt(i,!0);continue}if(a=n+i.end,a>=e&&(i.setCachedOffsets(r,a,0),l[c++]=i),wt(i,!0),i.right!==Ae&&!$i(i.right)){n+=i.delta,i=i.right;continue}}return wt(o.root,!1),l}function OK(o,e,t,i){let n=o.root,s=0,r=0,a=0;const l=i-(t-e);for(;n!==Ae;){if($i(n)){wt(n.left,!1),wt(n.right,!1),n===n.parent.right&&(s-=n.parent.delta),hc(n),n=n.parent;continue}if(!$i(n.left)){if(r=s+n.maxEnd,r<e){wt(n,!0);continue}if(n.left!==Ae){n=n.left;continue}}if(a=s+n.start,a>t){n.start+=l,n.end+=l,n.delta+=l,(n.delta<-1073741824||n.delta>1073741824)&&(o.requestNormalizeDelta=!0),wt(n,!0);continue}if(wt(n,!0),n.right!==Ae&&!$i(n.right)){s+=n.delta,n=n.right;continue}}wt(o.root,!1)}function PK(o,e){let t=o.root;const i=[];let n=0;for(;t!==Ae;){if($i(t)){wt(t.left,!1),wt(t.right,!1),t=t.parent;continue}if(t.left!==Ae&&!$i(t.left)){t=t.left;continue}if(t.ownerId===e&&(i[n++]=t),wt(t,!0),t.right!==Ae&&!$i(t.right)){t=t.right;continue}}return wt(o.root,!1),i}function FK(o){let e=o.root;const t=[];let i=0;for(;e!==Ae;){if($i(e)){wt(e.left,!1),wt(e.right,!1),e=e.parent;continue}if(e.left!==Ae&&!$i(e.left)){e=e.left;continue}if(e.right!==Ae&&!$i(e.right)){e=e.right;continue}t[i++]=e,wt(e,!0)}return wt(o.root,!1),t}function BK(o,e,t,i){let n=o.root,s=0,r=0,a=0;const l=[];let c=0;for(;n!==Ae;){if($i(n)){wt(n.left,!1),wt(n.right,!1),n===n.parent.right&&(s-=n.parent.delta),n=n.parent;continue}if(n.left!==Ae&&!$i(n.left)){n=n.left;continue}r=s+n.start,a=s+n.end,n.setCachedOffsets(r,a,i);let d=!0;if(e&&n.ownerId&&n.ownerId!==e&&(d=!1),t&&$4(n)&&(d=!1),d&&(l[c++]=n),wt(n,!0),n.right!==Ae&&!$i(n.right)){s+=n.delta,n=n.right;continue}}return wt(o.root,!1),l}function WK(o,e,t,i,n,s){let r=o.root,a=0,l=0,c=0,d=0;const h=[];let u=0;for(;r!==Ae;){if($i(r)){wt(r.left,!1),wt(r.right,!1),r===r.parent.right&&(a-=r.parent.delta),r=r.parent;continue}if(!$i(r.left)){if(l=a+r.maxEnd,l<e){wt(r,!0);continue}if(r.left!==Ae){r=r.left;continue}}if(c=a+r.start,c>t){wt(r,!0);continue}if(d=a+r.end,d>=e){r.setCachedOffsets(c,d,s);let g=!0;i&&r.ownerId&&r.ownerId!==i&&(g=!1),n&&$4(r)&&(g=!1),g&&(h[u++]=r)}if(wt(r,!0),r.right!==Ae&&!$i(r.right)){a+=r.delta,r=r.right;continue}}return wt(o.root,!1),h}function E2(o,e){if(o.root===Ae)return e.parent=Ae,e.left=Ae,e.right=Ae,yt(e,0),o.root=e,o.root;VK(o,e),Ll(e.parent);let t=e;for(;t!==o.root&&Nn(t.parent)===1;)if(t.parent===t.parent.parent.left){const i=t.parent.parent.right;Nn(i)===1?(yt(t.parent,0),yt(i,0),yt(t.parent.parent,1),t=t.parent.parent):(t===t.parent.right&&(t=t.parent,rp(o,t)),yt(t.parent,0),yt(t.parent.parent,1),ap(o,t.parent.parent))}else{const i=t.parent.parent.left;Nn(i)===1?(yt(t.parent,0),yt(i,0),yt(t.parent.parent,1),t=t.parent.parent):(t===t.parent.left&&(t=t.parent,ap(o,t)),yt(t.parent,0),yt(t.parent.parent,1),rp(o,t.parent.parent))}return yt(o.root,0),e}function VK(o,e){let t=0,i=o.root;const n=e.start,s=e.end;for(;;)if(zK(n,s,i.start+t,i.end+t)<0)if(i.left===Ae){e.start-=t,e.end-=t,e.maxEnd-=t,i.left=e;break}else i=i.left;else if(i.right===Ae){e.start-=t+i.delta,e.end-=t+i.delta,e.maxEnd-=t+i.delta,i.right=e;break}else t+=i.delta,i=i.right;e.parent=i,e.left=Ae,e.right=Ae,yt(e,1)}function N2(o,e){let t,i;if(e.left===Ae?(t=e.right,i=e,t.delta+=e.delta,(t.delta<-1073741824||t.delta>1073741824)&&(o.requestNormalizeDelta=!0),t.start+=e.delta,t.end+=e.delta):e.right===Ae?(t=e.left,i=e):(i=HK(e.right),t=i.right,t.start+=i.delta,t.end+=i.delta,t.delta+=i.delta,(t.delta<-1073741824||t.delta>1073741824)&&(o.requestNormalizeDelta=!0),i.start+=e.delta,i.end+=e.delta,i.delta=e.delta,(i.delta<-1073741824||i.delta>1073741824)&&(o.requestNormalizeDelta=!0)),i===o.root){o.root=t,yt(t,0),e.detach(),jw(),hc(t),o.root.parent=Ae;return}const n=Nn(i)===1;if(i===i.parent.left?i.parent.left=t:i.parent.right=t,i===e?t.parent=i.parent:(i.parent===e?t.parent=i:t.parent=i.parent,i.left=e.left,i.right=e.right,i.parent=e.parent,yt(i,Nn(e)),e===o.root?o.root=i:e===e.parent.left?e.parent.left=i:e.parent.right=i,i.left!==Ae&&(i.left.parent=i),i.right!==Ae&&(i.right.parent=i)),e.detach(),n){Ll(t.parent),i!==e&&(Ll(i),Ll(i.parent)),jw();return}Ll(t),Ll(t.parent),i!==e&&(Ll(i),Ll(i.parent));let s;for(;t!==o.root&&Nn(t)===0;)t===t.parent.left?(s=t.parent.right,Nn(s)===1&&(yt(s,0),yt(t.parent,1),rp(o,t.parent),s=t.parent.right),Nn(s.left)===0&&Nn(s.right)===0?(yt(s,1),t=t.parent):(Nn(s.right)===0&&(yt(s.left,0),yt(s,1),ap(o,s),s=t.parent.right),yt(s,Nn(t.parent)),yt(t.parent,0),yt(s.right,0),rp(o,t.parent),t=o.root)):(s=t.parent.left,Nn(s)===1&&(yt(s,0),yt(t.parent,1),ap(o,t.parent),s=t.parent.left),Nn(s.left)===0&&Nn(s.right)===0?(yt(s,1),t=t.parent):(Nn(s.left)===0&&(yt(s.right,0),yt(s,1),rp(o,s),s=t.parent.left),yt(s,Nn(t.parent)),yt(t.parent,0),yt(s.left,0),ap(o,t.parent),t=o.root));yt(t,0),jw()}function HK(o){for(;o.left!==Ae;)o=o.left;return o}function jw(){Ae.parent=Ae,Ae.delta=0,Ae.start=0,Ae.end=0}function rp(o,e){const t=e.right;t.delta+=e.delta,(t.delta<-1073741824||t.delta>1073741824)&&(o.requestNormalizeDelta=!0),t.start+=e.delta,t.end+=e.delta,e.right=t.left,t.left!==Ae&&(t.left.parent=e),t.parent=e.parent,e.parent===Ae?o.root=t:e===e.parent.left?e.parent.left=t:e.parent.right=t,t.left=e,e.parent=t,hc(e),hc(t)}function ap(o,e){const t=e.left;e.delta-=t.delta,(e.delta<-1073741824||e.delta>1073741824)&&(o.requestNormalizeDelta=!0),e.start-=t.delta,e.end-=t.delta,e.left=t.right,t.right!==Ae&&(t.right.parent=e),t.parent=e.parent,e.parent===Ae?o.root=t:e===e.parent.right?e.parent.right=t:e.parent.left=t,t.right=e,e.parent=t,hc(e),hc(t)}function K4(o){let e=o.end;if(o.left!==Ae){const t=o.left.maxEnd;t>e&&(e=t)}if(o.right!==Ae){const t=o.right.maxEnd+o.delta;t>e&&(e=t)}return e}function hc(o){o.maxEnd=K4(o)}function Ll(o){for(;o!==Ae;){const e=K4(o);if(o.maxEnd===e)return;o.maxEnd=e,o=o.parent}}function zK(o,e,t,i){return o===t?e-i:o-t}class rL{constructor(e,t){this.piece=e,this.color=t,this.size_left=0,this.lf_left=0,this.parent=this,this.left=this,this.right=this}next(){if(this.right!==ke)return VI(this.right);let e=this;for(;e.parent!==ke&&e.parent.left!==e;)e=e.parent;return e.parent===ke?ke:e.parent}prev(){if(this.left!==ke)return q4(this.left);let e=this;for(;e.parent!==ke&&e.parent.right!==e;)e=e.parent;return e.parent===ke?ke:e.parent}detach(){this.parent=null,this.left=null,this.right=null}}const ke=new rL(null,0);ke.parent=ke;ke.left=ke;ke.right=ke;ke.color=0;function VI(o){for(;o.left!==ke;)o=o.left;return o}function q4(o){for(;o.right!==ke;)o=o.right;return o}function HI(o){return o===ke?0:o.size_left+o.piece.length+HI(o.right)}function zI(o){return o===ke?0:o.lf_left+o.piece.lineFeedCnt+zI(o.right)}function Kw(){ke.parent=ke}function lp(o,e){const t=e.right;t.size_left+=e.size_left+(e.piece?e.piece.length:0),t.lf_left+=e.lf_left+(e.piece?e.piece.lineFeedCnt:0),e.right=t.left,t.left!==ke&&(t.left.parent=e),t.parent=e.parent,e.parent===ke?o.root=t:e.parent.left===e?e.parent.left=t:e.parent.right=t,t.left=e,e.parent=t}function cp(o,e){const t=e.left;e.left=t.right,t.right!==ke&&(t.right.parent=e),t.parent=e.parent,e.size_left-=t.size_left+(t.piece?t.piece.length:0),e.lf_left-=t.lf_left+(t.piece?t.piece.lineFeedCnt:0),e.parent===ke?o.root=t:e===e.parent.right?e.parent.right=t:e.parent.left=t,t.right=e,e.parent=t}function tb(o,e){let t,i;if(e.left===ke?(i=e,t=i.right):e.right===ke?(i=e,t=i.left):(i=VI(e.right),t=i.right),i===o.root){o.root=t,t.color=0,e.detach(),Kw(),o.root.parent=ke;return}const n=i.color===1;if(i===i.parent.left?i.parent.left=t:i.parent.right=t,i===e?(t.parent=i.parent,Hf(o,t)):(i.parent===e?t.parent=i:t.parent=i.parent,Hf(o,t),i.left=e.left,i.right=e.right,i.parent=e.parent,i.color=e.color,e===o.root?o.root=i:e===e.parent.left?e.parent.left=i:e.parent.right=i,i.left!==ke&&(i.left.parent=i),i.right!==ke&&(i.right.parent=i),i.size_left=e.size_left,i.lf_left=e.lf_left,Hf(o,i)),e.detach(),t.parent.left===t){const r=HI(t),a=zI(t);if(r!==t.parent.size_left||a!==t.parent.lf_left){const l=r-t.parent.size_left,c=a-t.parent.lf_left;t.parent.size_left=r,t.parent.lf_left=a,pa(o,t.parent,l,c)}}if(Hf(o,t.parent),n){Kw();return}let s;for(;t!==o.root&&t.color===0;)t===t.parent.left?(s=t.parent.right,s.color===1&&(s.color=0,t.parent.color=1,lp(o,t.parent),s=t.parent.right),s.left.color===0&&s.right.color===0?(s.color=1,t=t.parent):(s.right.color===0&&(s.left.color=0,s.color=1,cp(o,s),s=t.parent.right),s.color=t.parent.color,t.parent.color=0,s.right.color=0,lp(o,t.parent),t=o.root)):(s=t.parent.left,s.color===1&&(s.color=0,t.parent.color=1,cp(o,t.parent),s=t.parent.left),s.left.color===0&&s.right.color===0?(s.color=1,t=t.parent):(s.left.color===0&&(s.right.color=0,s.color=1,lp(o,s),s=t.parent.left),s.color=t.parent.color,t.parent.color=0,s.left.color=0,cp(o,t.parent),t=o.root));t.color=0,Kw()}function T2(o,e){for(Hf(o,e);e!==o.root&&e.parent.color===1;)if(e.parent===e.parent.parent.left){const t=e.parent.parent.right;t.color===1?(e.parent.color=0,t.color=0,e.parent.parent.color=1,e=e.parent.parent):(e===e.parent.right&&(e=e.parent,lp(o,e)),e.parent.color=0,e.parent.parent.color=1,cp(o,e.parent.parent))}else{const t=e.parent.parent.left;t.color===1?(e.parent.color=0,t.color=0,e.parent.parent.color=1,e=e.parent.parent):(e===e.parent.left&&(e=e.parent,cp(o,e)),e.parent.color=0,e.parent.parent.color=1,lp(o,e.parent.parent))}o.root.color=0}function pa(o,e,t,i){for(;e!==o.root&&e!==ke;)e.parent.left===e&&(e.parent.size_left+=t,e.parent.lf_left+=i),e=e.parent}function Hf(o,e){let t=0,i=0;if(e!==o.root){for(;e!==o.root&&e===e.parent.right;)e=e.parent;if(e!==o.root)for(e=e.parent,t=HI(e.left)-e.size_left,i=zI(e.left)-e.lf_left,e.size_left+=t,e.lf_left+=i;e!==o.root&&(t!==0||i!==0);)e.parent.left===e&&(e.parent.size_left+=t,e.parent.lf_left+=i),e=e.parent}}const UK=999;class jc{constructor(e,t,i,n){this.searchString=e,this.isRegex=t,this.matchCase=i,this.wordSeparators=n}parseSearchRequest(){if(this.searchString===\"\")return null;let e;this.isRegex?e=$K(this.searchString):e=this.searchString.indexOf(`\n`)>=0;let t=null;try{t=qO(this.searchString,this.isRegex,{matchCase:this.matchCase,wholeWord:!1,multiline:e,global:!0,unicode:!0})}catch(n){return null}if(!t)return null;let i=!this.isRegex&&!e;return i&&this.searchString.toLowerCase()!==this.searchString.toUpperCase()&&(i=this.matchCase),new Z$(t,this.wordSeparators?Zs(this.wordSeparators):null,i?this.searchString:null)}}function $K(o){if(!o||o.length===0)return!1;for(let e=0,t=o.length;e<t;e++){const i=o.charCodeAt(e);if(i===10)return!0;if(i===92){if(e++,e>=t)break;const n=o.charCodeAt(e);if(n===110||n===114||n===87)return!0}}return!1}function Qc(o,e,t){if(!t)return new Kp(o,null);const i=[];for(let n=0,s=e.length;n<s;n++)i[n]=e[n];return new Kp(o,i)}class M2{constructor(e){const t=[];let i=0;for(let n=0,s=e.length;n<s;n++)e.charCodeAt(n)===10&&(t[i++]=n);this._lineFeedsOffsets=t}findLineFeedCountBeforeOffset(e){const t=this._lineFeedsOffsets;let i=0,n=t.length-1;if(n===-1||e<=t[0])return 0;for(;i<n;){const s=i+((n-i)/2>>0);t[s]>=e?n=s-1:t[s+1]>=e?(i=s,n=s):i=s+1}return i+1}}class ib{static findMatches(e,t,i,n,s){const r=t.parseSearchRequest();return r?r.regex.multiline?this._doFindMatchesMultiline(e,i,new _u(r.wordSeparators,r.regex),n,s):this._doFindMatchesLineByLine(e,i,r,n,s):[]}static _getMultilineMatchRange(e,t,i,n,s,r){let a,l=0;n?(l=n.findLineFeedCountBeforeOffset(s),a=t+s+l):a=t+s;let c;if(n){const g=n.findLineFeedCountBeforeOffset(s+r.length)-l;c=a+r.length+g}else c=a+r.length;const d=e.getPositionAt(a),h=e.getPositionAt(c);return new L(d.lineNumber,d.column,h.lineNumber,h.column)}static _doFindMatchesMultiline(e,t,i,n,s){const r=e.getOffsetAt(t.getStartPosition()),a=e.getValueInRange(t,1),l=e.getEOL()===`\\r\n`?new M2(a):null,c=[];let d=0,h;for(i.reset(0);h=i.next(a);)if(c[d++]=Qc(this._getMultilineMatchRange(e,r,a,l,h.index,h[0]),h,n),d>=s)return c;return c}static _doFindMatchesLineByLine(e,t,i,n,s){const r=[];let a=0;if(t.startLineNumber===t.endLineNumber){const c=e.getLineContent(t.startLineNumber).substring(t.startColumn-1,t.endColumn-1);return a=this._findMatchesInLine(i,c,t.startLineNumber,t.startColumn-1,a,r,n,s),r}const l=e.getLineContent(t.startLineNumber).substring(t.startColumn-1);a=this._findMatchesInLine(i,l,t.startLineNumber,t.startColumn-1,a,r,n,s);for(let c=t.startLineNumber+1;c<t.endLineNumber&&a<s;c++)a=this._findMatchesInLine(i,e.getLineContent(c),c,0,a,r,n,s);if(a<s){const c=e.getLineContent(t.endLineNumber).substring(0,t.endColumn-1);a=this._findMatchesInLine(i,c,t.endLineNumber,0,a,r,n,s)}return r}static _findMatchesInLine(e,t,i,n,s,r,a,l){const c=e.wordSeparators;if(!a&&e.simpleSearch){const u=e.simpleSearch,g=u.length,f=t.length;let _=-g;for(;(_=t.indexOf(u,_+g))!==-1;)if((!c||UI(c,t,f,_,g))&&(r[s++]=new Kp(new L(i,_+1+n,i,_+1+g+n),null),s>=l))return s;return s}const d=new _u(e.wordSeparators,e.regex);let h;d.reset(0);do if(h=d.next(t),h&&(r[s++]=Qc(new L(i,h.index+1+n,i,h.index+1+h[0].length+n),h,a),s>=l))return s;while(h);return s}static findNextMatch(e,t,i,n){const s=t.parseSearchRequest();if(!s)return null;const r=new _u(s.wordSeparators,s.regex);return s.regex.multiline?this._doFindNextMatchMultiline(e,i,r,n):this._doFindNextMatchLineByLine(e,i,r,n)}static _doFindNextMatchMultiline(e,t,i,n){const s=new B(t.lineNumber,1),r=e.getOffsetAt(s),a=e.getLineCount(),l=e.getValueInRange(new L(s.lineNumber,s.column,a,e.getLineMaxColumn(a)),1),c=e.getEOL()===`\\r\n`?new M2(l):null;i.reset(t.column-1);const d=i.next(l);return d?Qc(this._getMultilineMatchRange(e,r,l,c,d.index,d[0]),d,n):t.lineNumber!==1||t.column!==1?this._doFindNextMatchMultiline(e,new B(1,1),i,n):null}static _doFindNextMatchLineByLine(e,t,i,n){const s=e.getLineCount(),r=t.lineNumber,a=e.getLineContent(r),l=this._findFirstMatchInLine(i,a,r,t.column,n);if(l)return l;for(let c=1;c<=s;c++){const d=(r+c-1)%s,h=e.getLineContent(d+1),u=this._findFirstMatchInLine(i,h,d+1,1,n);if(u)return u}return null}static _findFirstMatchInLine(e,t,i,n,s){e.reset(n-1);const r=e.next(t);return r?Qc(new L(i,r.index+1,i,r.index+1+r[0].length),r,s):null}static findPreviousMatch(e,t,i,n){const s=t.parseSearchRequest();if(!s)return null;const r=new _u(s.wordSeparators,s.regex);return s.regex.multiline?this._doFindPreviousMatchMultiline(e,i,r,n):this._doFindPreviousMatchLineByLine(e,i,r,n)}static _doFindPreviousMatchMultiline(e,t,i,n){const s=this._doFindMatchesMultiline(e,new L(1,1,t.lineNumber,t.column),i,n,10*UK);if(s.length>0)return s[s.length-1];const r=e.getLineCount();return t.lineNumber!==r||t.column!==e.getLineMaxColumn(r)?this._doFindPreviousMatchMultiline(e,new B(r,e.getLineMaxColumn(r)),i,n):null}static _doFindPreviousMatchLineByLine(e,t,i,n){const s=e.getLineCount(),r=t.lineNumber,a=e.getLineContent(r).substring(0,t.column-1),l=this._findLastMatchInLine(i,a,r,n);if(l)return l;for(let c=1;c<=s;c++){const d=(s+r-c-1)%s,h=e.getLineContent(d+1),u=this._findLastMatchInLine(i,h,d+1,n);if(u)return u}return null}static _findLastMatchInLine(e,t,i,n){let s=null,r;for(e.reset(0);r=e.next(t);)s=Qc(new L(i,r.index+1,i,r.index+1+r[0].length),r,n);return s}}function jK(o,e,t,i,n){if(i===0)return!0;const s=e.charCodeAt(i-1);if(o.get(s)!==0||s===13||s===10)return!0;if(n>0){const r=e.charCodeAt(i);if(o.get(r)!==0)return!0}return!1}function KK(o,e,t,i,n){if(i+n===t)return!0;const s=e.charCodeAt(i+n);if(o.get(s)!==0||s===13||s===10)return!0;if(n>0){const r=e.charCodeAt(i+n-1);if(o.get(r)!==0)return!0}return!1}function UI(o,e,t,i,n){return jK(o,e,t,i,n)&&KK(o,e,t,i,n)}class _u{constructor(e,t){this._wordSeparators=e,this._searchRegex=t,this._prevMatchStartIndex=-1,this._prevMatchLength=0}reset(e){this._searchRegex.lastIndex=e,this._prevMatchStartIndex=-1,this._prevMatchLength=0}next(e){const t=e.length;let i;do{if(this._prevMatchStartIndex+this._prevMatchLength===t||(i=this._searchRegex.exec(e),!i))return null;const n=i.index,s=i[0].length;if(n===this._prevMatchStartIndex&&s===this._prevMatchLength){if(s===0){F0(e,t,this._searchRegex.lastIndex)>65535?this._searchRegex.lastIndex+=2:this._searchRegex.lastIndex+=1;continue}return null}if(this._prevMatchStartIndex=n,this._prevMatchLength=s,!this._wordSeparators||UI(this._wordSeparators,e,t,n,s))return i}while(i);return null}}const la=65535;function G4(o){let e;return o[o.length-1]<65536?e=new Uint16Array(o.length):e=new Uint32Array(o.length),e.set(o,0),e}class qK{constructor(e,t,i,n,s){this.lineStarts=e,this.cr=t,this.lf=i,this.crlf=n,this.isBasicASCII=s}}function va(o,e=!0){const t=[0];let i=1;for(let n=0,s=o.length;n<s;n++){const r=o.charCodeAt(n);r===13?n+1<s&&o.charCodeAt(n+1)===10?(t[i++]=n+2,n++):t[i++]=n+1:r===10&&(t[i++]=n+1)}return e?G4(t):t}function GK(o,e){o.length=0,o[0]=0;let t=1,i=0,n=0,s=0,r=!0;for(let l=0,c=e.length;l<c;l++){const d=e.charCodeAt(l);d===13?l+1<c&&e.charCodeAt(l+1)===10?(s++,o[t++]=l+2,l++):(i++,o[t++]=l+1):d===10?(n++,o[t++]=l+1):r&&d!==9&&(d<32||d>126)&&(r=!1)}const a=new qK(G4(o),i,n,s,r);return o.length=0,a}class jn{constructor(e,t,i,n,s){this.bufferIndex=e,this.start=t,this.end=i,this.lineFeedCnt=n,this.length=s}}class Jc{constructor(e,t){this.buffer=e,this.lineStarts=t}}class ZK{constructor(e,t){this._pieces=[],this._tree=e,this._BOM=t,this._index=0,e.root!==ke&&e.iterate(e.root,i=>(i!==ke&&this._pieces.push(i.piece),!0))}read(){return this._pieces.length===0?this._index===0?(this._index++,this._BOM):null:this._index>this._pieces.length-1?null:this._index===0?this._BOM+this._tree.getPieceContent(this._pieces[this._index++]):this._tree.getPieceContent(this._pieces[this._index++])}}class YK{constructor(e){this._limit=e,this._cache=[]}get(e){for(let t=this._cache.length-1;t>=0;t--){const i=this._cache[t];if(i.nodeStartOffset<=e&&i.nodeStartOffset+i.node.piece.length>=e)return i}return null}get2(e){for(let t=this._cache.length-1;t>=0;t--){const i=this._cache[t];if(i.nodeStartLineNumber&&i.nodeStartLineNumber<e&&i.nodeStartLineNumber+i.node.piece.lineFeedCnt>=e)return i}return null}set(e){this._cache.length>=this._limit&&this._cache.shift(),this._cache.push(e)}validate(e){let t=!1;const i=this._cache;for(let n=0;n<i.length;n++){const s=i[n];if(s.node.parent===null||s.nodeStartOffset>=e){i[n]=null,t=!0;continue}}if(t){const n=[];for(const s of i)s!==null&&n.push(s);this._cache=n}}}class XK{constructor(e,t,i){this.create(e,t,i)}create(e,t,i){this._buffers=[new Jc(\"\",[0])],this._lastChangeBufferPos={line:0,column:0},this.root=ke,this._lineCnt=1,this._length=0,this._EOL=t,this._EOLLength=t.length,this._EOLNormalized=i;let n=null;for(let s=0,r=e.length;s<r;s++)if(e[s].buffer.length>0){e[s].lineStarts||(e[s].lineStarts=va(e[s].buffer));const a=new jn(s+1,{line:0,column:0},{line:e[s].lineStarts.length-1,column:e[s].buffer.length-e[s].lineStarts[e[s].lineStarts.length-1]},e[s].lineStarts.length-1,e[s].buffer.length);this._buffers.push(e[s]),n=this.rbInsertRight(n,a)}this._searchCache=new YK(1),this._lastVisitedLine={lineNumber:0,value:\"\"},this.computeBufferMetadata()}normalizeEOL(e){const t=la,i=t-Math.floor(t/3),n=i*2;let s=\"\",r=0;const a=[];if(this.iterate(this.root,l=>{const c=this.getNodeContent(l),d=c.length;if(r<=i||r+d<n)return s+=c,r+=d,!0;const h=s.replace(/\\r\\n|\\r|\\n/g,e);return a.push(new Jc(h,va(h))),s=c,r=d,!0}),r>0){const l=s.replace(/\\r\\n|\\r|\\n/g,e);a.push(new Jc(l,va(l)))}this.create(a,e,!0)}getEOL(){return this._EOL}setEOL(e){this._EOL=e,this._EOLLength=this._EOL.length,this.normalizeEOL(e)}createSnapshot(e){return new ZK(this,e)}getOffsetAt(e,t){let i=0,n=this.root;for(;n!==ke;)if(n.left!==ke&&n.lf_left+1>=e)n=n.left;else{if(n.lf_left+n.piece.lineFeedCnt+1>=e)return i+=n.size_left,i+=this.getAccumulatedValue(n,e-n.lf_left-2)+t-1;e-=n.lf_left+n.piece.lineFeedCnt,i+=n.size_left+n.piece.length,n=n.right}return i}getPositionAt(e){e=Math.floor(e),e=Math.max(0,e);let t=this.root,i=0;const n=e;for(;t!==ke;)if(t.size_left!==0&&t.size_left>=e)t=t.left;else if(t.size_left+t.piece.length>=e){const s=this.getIndexOf(t,e-t.size_left);if(i+=t.lf_left+s.index,s.index===0){const r=this.getOffsetAt(i+1,1),a=n-r;return new B(i+1,a+1)}return new B(i+1,s.remainder+1)}else if(e-=t.size_left+t.piece.length,i+=t.lf_left+t.piece.lineFeedCnt,t.right===ke){const s=this.getOffsetAt(i+1,1),r=n-e-s;return new B(i+1,r+1)}else t=t.right;return new B(1,1)}getValueInRange(e,t){if(e.startLineNumber===e.endLineNumber&&e.startColumn===e.endColumn)return\"\";const i=this.nodeAt2(e.startLineNumber,e.startColumn),n=this.nodeAt2(e.endLineNumber,e.endColumn),s=this.getValueInRange2(i,n);return t?t!==this._EOL||!this._EOLNormalized?s.replace(/\\r\\n|\\r|\\n/g,t):t===this.getEOL()&&this._EOLNormalized?s:s.replace(/\\r\\n|\\r|\\n/g,t):s}getValueInRange2(e,t){if(e.node===t.node){const a=e.node,l=this._buffers[a.piece.bufferIndex].buffer,c=this.offsetInBuffer(a.piece.bufferIndex,a.piece.start);return l.substring(c+e.remainder,c+t.remainder)}let i=e.node;const n=this._buffers[i.piece.bufferIndex].buffer,s=this.offsetInBuffer(i.piece.bufferIndex,i.piece.start);let r=n.substring(s+e.remainder,s+i.piece.length);for(i=i.next();i!==ke;){const a=this._buffers[i.piece.bufferIndex].buffer,l=this.offsetInBuffer(i.piece.bufferIndex,i.piece.start);if(i===t.node){r+=a.substring(l,l+t.remainder);break}else r+=a.substr(l,i.piece.length);i=i.next()}return r}getLinesContent(){const e=[];let t=0,i=\"\",n=!1;return this.iterate(this.root,s=>{if(s===ke)return!0;const r=s.piece;let a=r.length;if(a===0)return!0;const l=this._buffers[r.bufferIndex].buffer,c=this._buffers[r.bufferIndex].lineStarts,d=r.start.line,h=r.end.line;let u=c[d]+r.start.column;if(n&&(l.charCodeAt(u)===10&&(u++,a--),e[t++]=i,i=\"\",n=!1,a===0))return!0;if(d===h)return!this._EOLNormalized&&l.charCodeAt(u+a-1)===13?(n=!0,i+=l.substr(u,a-1)):i+=l.substr(u,a),!0;i+=this._EOLNormalized?l.substring(u,Math.max(u,c[d+1]-this._EOLLength)):l.substring(u,c[d+1]).replace(/(\\r\\n|\\r|\\n)$/,\"\"),e[t++]=i;for(let g=d+1;g<h;g++)i=this._EOLNormalized?l.substring(c[g],c[g+1]-this._EOLLength):l.substring(c[g],c[g+1]).replace(/(\\r\\n|\\r|\\n)$/,\"\"),e[t++]=i;return!this._EOLNormalized&&l.charCodeAt(c[h]+r.end.column-1)===13?(n=!0,r.end.column===0?t--:i=l.substr(c[h],r.end.column-1)):i=l.substr(c[h],r.end.column),!0}),n&&(e[t++]=i,i=\"\"),e[t++]=i,e}getLength(){return this._length}getLineCount(){return this._lineCnt}getLineContent(e){return this._lastVisitedLine.lineNumber===e?this._lastVisitedLine.value:(this._lastVisitedLine.lineNumber=e,e===this._lineCnt?this._lastVisitedLine.value=this.getLineRawContent(e):this._EOLNormalized?this._lastVisitedLine.value=this.getLineRawContent(e,this._EOLLength):this._lastVisitedLine.value=this.getLineRawContent(e).replace(/(\\r\\n|\\r|\\n)$/,\"\"),this._lastVisitedLine.value)}_getCharCode(e){if(e.remainder===e.node.piece.length){const t=e.node.next();if(!t)return 0;const i=this._buffers[t.piece.bufferIndex],n=this.offsetInBuffer(t.piece.bufferIndex,t.piece.start);return i.buffer.charCodeAt(n)}else{const t=this._buffers[e.node.piece.bufferIndex],n=this.offsetInBuffer(e.node.piece.bufferIndex,e.node.piece.start)+e.remainder;return t.buffer.charCodeAt(n)}}getLineCharCode(e,t){const i=this.nodeAt2(e,t+1);return this._getCharCode(i)}getLineLength(e){if(e===this.getLineCount()){const t=this.getOffsetAt(e,1);return this.getLength()-t}return this.getOffsetAt(e+1,1)-this.getOffsetAt(e,1)-this._EOLLength}findMatchesInNode(e,t,i,n,s,r,a,l,c,d,h){const u=this._buffers[e.piece.bufferIndex],g=this.offsetInBuffer(e.piece.bufferIndex,e.piece.start),f=this.offsetInBuffer(e.piece.bufferIndex,s),_=this.offsetInBuffer(e.piece.bufferIndex,r);let b;const v={line:0,column:0};let C,w;t._wordSeparators?(C=u.buffer.substring(f,_),w=S=>S+f,t.reset(0)):(C=u.buffer,w=S=>S,t.reset(f));do if(b=t.next(C),b){if(w(b.index)>=_)return d;this.positionInBuffer(e,w(b.index)-g,v);const S=this.getLineFeedCnt(e.piece.bufferIndex,s,v),k=v.line===s.line?v.column-s.column+n:v.column+1,x=k+b[0].length;if(h[d++]=Qc(new L(i+S,k,i+S,x),b,l),w(b.index)+b[0].length>=_||d>=c)return d}while(b);return d}findMatchesLineByLine(e,t,i,n){const s=[];let r=0;const a=new _u(t.wordSeparators,t.regex);let l=this.nodeAt2(e.startLineNumber,e.startColumn);if(l===null)return[];const c=this.nodeAt2(e.endLineNumber,e.endColumn);if(c===null)return[];let d=this.positionInBuffer(l.node,l.remainder);const h=this.positionInBuffer(c.node,c.remainder);if(l.node===c.node)return this.findMatchesInNode(l.node,a,e.startLineNumber,e.startColumn,d,h,t,i,n,r,s),s;let u=e.startLineNumber,g=l.node;for(;g!==c.node;){const _=this.getLineFeedCnt(g.piece.bufferIndex,d,g.piece.end);if(_>=1){const v=this._buffers[g.piece.bufferIndex].lineStarts,C=this.offsetInBuffer(g.piece.bufferIndex,g.piece.start),w=v[d.line+_],S=u===e.startLineNumber?e.startColumn:1;if(r=this.findMatchesInNode(g,a,u,S,d,this.positionInBuffer(g,w-C),t,i,n,r,s),r>=n)return s;u+=_}const b=u===e.startLineNumber?e.startColumn-1:0;if(u===e.endLineNumber){const v=this.getLineContent(u).substring(b,e.endColumn-1);return r=this._findMatchesInLine(t,a,v,e.endLineNumber,b,r,s,i,n),s}if(r=this._findMatchesInLine(t,a,this.getLineContent(u).substr(b),u,b,r,s,i,n),r>=n)return s;u++,l=this.nodeAt2(u,1),g=l.node,d=this.positionInBuffer(l.node,l.remainder)}if(u===e.endLineNumber){const _=u===e.startLineNumber?e.startColumn-1:0,b=this.getLineContent(u).substring(_,e.endColumn-1);return r=this._findMatchesInLine(t,a,b,e.endLineNumber,_,r,s,i,n),s}const f=u===e.startLineNumber?e.startColumn:1;return r=this.findMatchesInNode(c.node,a,u,f,d,h,t,i,n,r,s),s}_findMatchesInLine(e,t,i,n,s,r,a,l,c){const d=e.wordSeparators;if(!l&&e.simpleSearch){const u=e.simpleSearch,g=u.length,f=i.length;let _=-g;for(;(_=i.indexOf(u,_+g))!==-1;)if((!d||UI(d,i,f,_,g))&&(a[r++]=new Kp(new L(n,_+1+s,n,_+1+g+s),null),r>=c))return r;return r}let h;t.reset(0);do if(h=t.next(i),h&&(a[r++]=Qc(new L(n,h.index+1+s,n,h.index+1+h[0].length+s),h,l),r>=c))return r;while(h);return r}insert(e,t,i=!1){if(this._EOLNormalized=this._EOLNormalized&&i,this._lastVisitedLine.lineNumber=0,this._lastVisitedLine.value=\"\",this.root!==ke){const{node:n,remainder:s,nodeStartOffset:r}=this.nodeAt(e),a=n.piece,l=a.bufferIndex,c=this.positionInBuffer(n,s);if(n.piece.bufferIndex===0&&a.end.line===this._lastChangeBufferPos.line&&a.end.column===this._lastChangeBufferPos.column&&r+a.length===e&&t.length<la){this.appendToNode(n,t),this.computeBufferMetadata();return}if(r===e)this.insertContentToNodeLeft(t,n),this._searchCache.validate(e);else if(r+n.piece.length>e){const d=[];let h=new jn(a.bufferIndex,c,a.end,this.getLineFeedCnt(a.bufferIndex,c,a.end),this.offsetInBuffer(l,a.end)-this.offsetInBuffer(l,c));if(this.shouldCheckCRLF()&&this.endWithCR(t)&&this.nodeCharCodeAt(n,s)===10){const _={line:h.start.line+1,column:0};h=new jn(h.bufferIndex,_,h.end,this.getLineFeedCnt(h.bufferIndex,_,h.end),h.length-1),t+=`\n`}if(this.shouldCheckCRLF()&&this.startWithLF(t))if(this.nodeCharCodeAt(n,s-1)===13){const _=this.positionInBuffer(n,s-1);this.deleteNodeTail(n,_),t=\"\\r\"+t,n.piece.length===0&&d.push(n)}else this.deleteNodeTail(n,c);else this.deleteNodeTail(n,c);const u=this.createNewPieces(t);h.length>0&&this.rbInsertRight(n,h);let g=n;for(let f=0;f<u.length;f++)g=this.rbInsertRight(g,u[f]);this.deleteNodes(d)}else this.insertContentToNodeRight(t,n)}else{const n=this.createNewPieces(t);let s=this.rbInsertLeft(null,n[0]);for(let r=1;r<n.length;r++)s=this.rbInsertRight(s,n[r])}this.computeBufferMetadata()}delete(e,t){if(this._lastVisitedLine.lineNumber=0,this._lastVisitedLine.value=\"\",t<=0||this.root===ke)return;const i=this.nodeAt(e),n=this.nodeAt(e+t),s=i.node,r=n.node;if(s===r){const u=this.positionInBuffer(s,i.remainder),g=this.positionInBuffer(s,n.remainder);if(i.nodeStartOffset===e){if(t===s.piece.length){const f=s.next();tb(this,s),this.validateCRLFWithPrevNode(f),this.computeBufferMetadata();return}this.deleteNodeHead(s,g),this._searchCache.validate(e),this.validateCRLFWithPrevNode(s),this.computeBufferMetadata();return}if(i.nodeStartOffset+s.piece.length===e+t){this.deleteNodeTail(s,u),this.validateCRLFWithNextNode(s),this.computeBufferMetadata();return}this.shrinkNode(s,u,g),this.computeBufferMetadata();return}const a=[],l=this.positionInBuffer(s,i.remainder);this.deleteNodeTail(s,l),this._searchCache.validate(e),s.piece.length===0&&a.push(s);const c=this.positionInBuffer(r,n.remainder);this.deleteNodeHead(r,c),r.piece.length===0&&a.push(r);const d=s.next();for(let u=d;u!==ke&&u!==r;u=u.next())a.push(u);const h=s.piece.length===0?s.prev():s;this.deleteNodes(a),this.validateCRLFWithNextNode(h),this.computeBufferMetadata()}insertContentToNodeLeft(e,t){const i=[];if(this.shouldCheckCRLF()&&this.endWithCR(e)&&this.startWithLF(t)){const r=t.piece,a={line:r.start.line+1,column:0},l=new jn(r.bufferIndex,a,r.end,this.getLineFeedCnt(r.bufferIndex,a,r.end),r.length-1);t.piece=l,e+=`\n`,pa(this,t,-1,-1),t.piece.length===0&&i.push(t)}const n=this.createNewPieces(e);let s=this.rbInsertLeft(t,n[n.length-1]);for(let r=n.length-2;r>=0;r--)s=this.rbInsertLeft(s,n[r]);this.validateCRLFWithPrevNode(s),this.deleteNodes(i)}insertContentToNodeRight(e,t){this.adjustCarriageReturnFromNext(e,t)&&(e+=`\n`);const i=this.createNewPieces(e),n=this.rbInsertRight(t,i[0]);let s=n;for(let r=1;r<i.length;r++)s=this.rbInsertRight(s,i[r]);this.validateCRLFWithPrevNode(n)}positionInBuffer(e,t,i){const n=e.piece,s=e.piece.bufferIndex,r=this._buffers[s].lineStarts,l=r[n.start.line]+n.start.column+t;let c=n.start.line,d=n.end.line,h=0,u=0,g=0;for(;c<=d&&(h=c+(d-c)/2|0,g=r[h],h!==d);)if(u=r[h+1],l<g)d=h-1;else if(l>=u)c=h+1;else break;return i?(i.line=h,i.column=l-g,null):{line:h,column:l-g}}getLineFeedCnt(e,t,i){if(i.column===0)return i.line-t.line;const n=this._buffers[e].lineStarts;if(i.line===n.length-1)return i.line-t.line;const s=n[i.line+1],r=n[i.line]+i.column;if(s>r+1)return i.line-t.line;const a=r-1;return this._buffers[e].buffer.charCodeAt(a)===13?i.line-t.line+1:i.line-t.line}offsetInBuffer(e,t){return this._buffers[e].lineStarts[t.line]+t.column}deleteNodes(e){for(let t=0;t<e.length;t++)tb(this,e[t])}createNewPieces(e){if(e.length>la){const d=[];for(;e.length>la;){const u=e.charCodeAt(la-1);let g;u===13||u>=55296&&u<=56319?(g=e.substring(0,la-1),e=e.substring(la-1)):(g=e.substring(0,la),e=e.substring(la));const f=va(g);d.push(new jn(this._buffers.length,{line:0,column:0},{line:f.length-1,column:g.length-f[f.length-1]},f.length-1,g.length)),this._buffers.push(new Jc(g,f))}const h=va(e);return d.push(new jn(this._buffers.length,{line:0,column:0},{line:h.length-1,column:e.length-h[h.length-1]},h.length-1,e.length)),this._buffers.push(new Jc(e,h)),d}let t=this._buffers[0].buffer.length;const i=va(e,!1);let n=this._lastChangeBufferPos;if(this._buffers[0].lineStarts[this._buffers[0].lineStarts.length-1]===t&&t!==0&&this.startWithLF(e)&&this.endWithCR(this._buffers[0].buffer)){this._lastChangeBufferPos={line:this._lastChangeBufferPos.line,column:this._lastChangeBufferPos.column+1},n=this._lastChangeBufferPos;for(let d=0;d<i.length;d++)i[d]+=t+1;this._buffers[0].lineStarts=this._buffers[0].lineStarts.concat(i.slice(1)),this._buffers[0].buffer+=\"_\"+e,t+=1}else{if(t!==0)for(let d=0;d<i.length;d++)i[d]+=t;this._buffers[0].lineStarts=this._buffers[0].lineStarts.concat(i.slice(1)),this._buffers[0].buffer+=e}const s=this._buffers[0].buffer.length,r=this._buffers[0].lineStarts.length-1,a=s-this._buffers[0].lineStarts[r],l={line:r,column:a},c=new jn(0,n,l,this.getLineFeedCnt(0,n,l),s-t);return this._lastChangeBufferPos=l,[c]}getLineRawContent(e,t=0){let i=this.root,n=\"\";const s=this._searchCache.get2(e);if(s){i=s.node;const r=this.getAccumulatedValue(i,e-s.nodeStartLineNumber-1),a=this._buffers[i.piece.bufferIndex].buffer,l=this.offsetInBuffer(i.piece.bufferIndex,i.piece.start);if(s.nodeStartLineNumber+i.piece.lineFeedCnt===e)n=a.substring(l+r,l+i.piece.length);else{const c=this.getAccumulatedValue(i,e-s.nodeStartLineNumber);return a.substring(l+r,l+c-t)}}else{let r=0;const a=e;for(;i!==ke;)if(i.left!==ke&&i.lf_left>=e-1)i=i.left;else if(i.lf_left+i.piece.lineFeedCnt>e-1){const l=this.getAccumulatedValue(i,e-i.lf_left-2),c=this.getAccumulatedValue(i,e-i.lf_left-1),d=this._buffers[i.piece.bufferIndex].buffer,h=this.offsetInBuffer(i.piece.bufferIndex,i.piece.start);return r+=i.size_left,this._searchCache.set({node:i,nodeStartOffset:r,nodeStartLineNumber:a-(e-1-i.lf_left)}),d.substring(h+l,h+c-t)}else if(i.lf_left+i.piece.lineFeedCnt===e-1){const l=this.getAccumulatedValue(i,e-i.lf_left-2),c=this._buffers[i.piece.bufferIndex].buffer,d=this.offsetInBuffer(i.piece.bufferIndex,i.piece.start);n=c.substring(d+l,d+i.piece.length);break}else e-=i.lf_left+i.piece.lineFeedCnt,r+=i.size_left+i.piece.length,i=i.right}for(i=i.next();i!==ke;){const r=this._buffers[i.piece.bufferIndex].buffer;if(i.piece.lineFeedCnt>0){const a=this.getAccumulatedValue(i,0),l=this.offsetInBuffer(i.piece.bufferIndex,i.piece.start);return n+=r.substring(l,l+a-t),n}else{const a=this.offsetInBuffer(i.piece.bufferIndex,i.piece.start);n+=r.substr(a,i.piece.length)}i=i.next()}return n}computeBufferMetadata(){let e=this.root,t=1,i=0;for(;e!==ke;)t+=e.lf_left+e.piece.lineFeedCnt,i+=e.size_left+e.piece.length,e=e.right;this._lineCnt=t,this._length=i,this._searchCache.validate(this._length)}getIndexOf(e,t){const i=e.piece,n=this.positionInBuffer(e,t),s=n.line-i.start.line;if(this.offsetInBuffer(i.bufferIndex,i.end)-this.offsetInBuffer(i.bufferIndex,i.start)===t){const r=this.getLineFeedCnt(e.piece.bufferIndex,i.start,n);if(r!==s)return{index:r,remainder:0}}return{index:s,remainder:n.column}}getAccumulatedValue(e,t){if(t<0)return 0;const i=e.piece,n=this._buffers[i.bufferIndex].lineStarts,s=i.start.line+t+1;return s>i.end.line?n[i.end.line]+i.end.column-n[i.start.line]-i.start.column:n[s]-n[i.start.line]-i.start.column}deleteNodeTail(e,t){const i=e.piece,n=i.lineFeedCnt,s=this.offsetInBuffer(i.bufferIndex,i.end),r=t,a=this.offsetInBuffer(i.bufferIndex,r),l=this.getLineFeedCnt(i.bufferIndex,i.start,r),c=l-n,d=a-s,h=i.length+d;e.piece=new jn(i.bufferIndex,i.start,r,l,h),pa(this,e,d,c)}deleteNodeHead(e,t){const i=e.piece,n=i.lineFeedCnt,s=this.offsetInBuffer(i.bufferIndex,i.start),r=t,a=this.getLineFeedCnt(i.bufferIndex,r,i.end),l=this.offsetInBuffer(i.bufferIndex,r),c=a-n,d=s-l,h=i.length+d;e.piece=new jn(i.bufferIndex,r,i.end,a,h),pa(this,e,d,c)}shrinkNode(e,t,i){const n=e.piece,s=n.start,r=n.end,a=n.length,l=n.lineFeedCnt,c=t,d=this.getLineFeedCnt(n.bufferIndex,n.start,c),h=this.offsetInBuffer(n.bufferIndex,t)-this.offsetInBuffer(n.bufferIndex,s);e.piece=new jn(n.bufferIndex,n.start,c,d,h),pa(this,e,h-a,d-l);const u=new jn(n.bufferIndex,i,r,this.getLineFeedCnt(n.bufferIndex,i,r),this.offsetInBuffer(n.bufferIndex,r)-this.offsetInBuffer(n.bufferIndex,i)),g=this.rbInsertRight(e,u);this.validateCRLFWithPrevNode(g)}appendToNode(e,t){this.adjustCarriageReturnFromNext(t,e)&&(t+=`\n`);const i=this.shouldCheckCRLF()&&this.startWithLF(t)&&this.endWithCR(e),n=this._buffers[0].buffer.length;this._buffers[0].buffer+=t;const s=va(t,!1);for(let g=0;g<s.length;g++)s[g]+=n;if(i){const g=this._buffers[0].lineStarts[this._buffers[0].lineStarts.length-2];this._buffers[0].lineStarts.pop(),this._lastChangeBufferPos={line:this._lastChangeBufferPos.line-1,column:n-g}}this._buffers[0].lineStarts=this._buffers[0].lineStarts.concat(s.slice(1));const r=this._buffers[0].lineStarts.length-1,a=this._buffers[0].buffer.length-this._buffers[0].lineStarts[r],l={line:r,column:a},c=e.piece.length+t.length,d=e.piece.lineFeedCnt,h=this.getLineFeedCnt(0,e.piece.start,l),u=h-d;e.piece=new jn(e.piece.bufferIndex,e.piece.start,l,h,c),this._lastChangeBufferPos=l,pa(this,e,t.length,u)}nodeAt(e){let t=this.root;const i=this._searchCache.get(e);if(i)return{node:i.node,nodeStartOffset:i.nodeStartOffset,remainder:e-i.nodeStartOffset};let n=0;for(;t!==ke;)if(t.size_left>e)t=t.left;else if(t.size_left+t.piece.length>=e){n+=t.size_left;const s={node:t,remainder:e-t.size_left,nodeStartOffset:n};return this._searchCache.set(s),s}else e-=t.size_left+t.piece.length,n+=t.size_left+t.piece.length,t=t.right;return null}nodeAt2(e,t){let i=this.root,n=0;for(;i!==ke;)if(i.left!==ke&&i.lf_left>=e-1)i=i.left;else if(i.lf_left+i.piece.lineFeedCnt>e-1){const s=this.getAccumulatedValue(i,e-i.lf_left-2),r=this.getAccumulatedValue(i,e-i.lf_left-1);return n+=i.size_left,{node:i,remainder:Math.min(s+t-1,r),nodeStartOffset:n}}else if(i.lf_left+i.piece.lineFeedCnt===e-1){const s=this.getAccumulatedValue(i,e-i.lf_left-2);if(s+t-1<=i.piece.length)return{node:i,remainder:s+t-1,nodeStartOffset:n};t-=i.piece.length-s;break}else e-=i.lf_left+i.piece.lineFeedCnt,n+=i.size_left+i.piece.length,i=i.right;for(i=i.next();i!==ke;){if(i.piece.lineFeedCnt>0){const s=this.getAccumulatedValue(i,0),r=this.offsetOfNode(i);return{node:i,remainder:Math.min(t-1,s),nodeStartOffset:r}}else if(i.piece.length>=t-1){const s=this.offsetOfNode(i);return{node:i,remainder:t-1,nodeStartOffset:s}}else t-=i.piece.length;i=i.next()}return null}nodeCharCodeAt(e,t){if(e.piece.lineFeedCnt<1)return-1;const i=this._buffers[e.piece.bufferIndex],n=this.offsetInBuffer(e.piece.bufferIndex,e.piece.start)+t;return i.buffer.charCodeAt(n)}offsetOfNode(e){if(!e)return 0;let t=e.size_left;for(;e!==this.root;)e.parent.right===e&&(t+=e.parent.size_left+e.parent.piece.length),e=e.parent;return t}shouldCheckCRLF(){return!(this._EOLNormalized&&this._EOL===`\n`)}startWithLF(e){if(typeof e==\"string\")return e.charCodeAt(0)===10;if(e===ke||e.piece.lineFeedCnt===0)return!1;const t=e.piece,i=this._buffers[t.bufferIndex].lineStarts,n=t.start.line,s=i[n]+t.start.column;return n===i.length-1||i[n+1]>s+1?!1:this._buffers[t.bufferIndex].buffer.charCodeAt(s)===10}endWithCR(e){return typeof e==\"string\"?e.charCodeAt(e.length-1)===13:e===ke||e.piece.lineFeedCnt===0?!1:this.nodeCharCodeAt(e,e.piece.length-1)===13}validateCRLFWithPrevNode(e){if(this.shouldCheckCRLF()&&this.startWithLF(e)){const t=e.prev();this.endWithCR(t)&&this.fixCRLF(t,e)}}validateCRLFWithNextNode(e){if(this.shouldCheckCRLF()&&this.endWithCR(e)){const t=e.next();this.startWithLF(t)&&this.fixCRLF(e,t)}}fixCRLF(e,t){const i=[],n=this._buffers[e.piece.bufferIndex].lineStarts;let s;e.piece.end.column===0?s={line:e.piece.end.line-1,column:n[e.piece.end.line]-n[e.piece.end.line-1]-1}:s={line:e.piece.end.line,column:e.piece.end.column-1};const r=e.piece.length-1,a=e.piece.lineFeedCnt-1;e.piece=new jn(e.piece.bufferIndex,e.piece.start,s,a,r),pa(this,e,-1,-1),e.piece.length===0&&i.push(e);const l={line:t.piece.start.line+1,column:0},c=t.piece.length-1,d=this.getLineFeedCnt(t.piece.bufferIndex,l,t.piece.end);t.piece=new jn(t.piece.bufferIndex,l,t.piece.end,d,c),pa(this,t,-1,-1),t.piece.length===0&&i.push(t);const h=this.createNewPieces(`\\r\n`);this.rbInsertRight(e,h[0]);for(let u=0;u<i.length;u++)tb(this,i[u])}adjustCarriageReturnFromNext(e,t){if(this.shouldCheckCRLF()&&this.endWithCR(e)){const i=t.next();if(this.startWithLF(i)){if(e+=`\n`,i.piece.length===1)tb(this,i);else{const n=i.piece,s={line:n.start.line+1,column:0},r=n.length-1,a=this.getLineFeedCnt(n.bufferIndex,s,n.end);i.piece=new jn(n.bufferIndex,s,n.end,a,r),pa(this,i,-1,-1)}return!0}}return!1}iterate(e,t){if(e===ke)return t(ke);const i=this.iterate(e.left,t);return i&&t(e)&&this.iterate(e.right,t)}getNodeContent(e){if(e===ke)return\"\";const t=this._buffers[e.piece.bufferIndex],i=e.piece,n=this.offsetInBuffer(i.bufferIndex,i.start),s=this.offsetInBuffer(i.bufferIndex,i.end);return t.buffer.substring(n,s)}getPieceContent(e){const t=this._buffers[e.bufferIndex],i=this.offsetInBuffer(e.bufferIndex,e.start),n=this.offsetInBuffer(e.bufferIndex,e.end);return t.buffer.substring(i,n)}rbInsertRight(e,t){const i=new rL(t,1);if(i.left=ke,i.right=ke,i.parent=ke,i.size_left=0,i.lf_left=0,this.root===ke)this.root=i,i.color=0;else if(e.right===ke)e.right=i,i.parent=e;else{const s=VI(e.right);s.left=i,i.parent=s}return T2(this,i),i}rbInsertLeft(e,t){const i=new rL(t,1);if(i.left=ke,i.right=ke,i.parent=ke,i.size_left=0,i.lf_left=0,this.root===ke)this.root=i,i.color=0;else if(e.left===ke)e.left=i,i.parent=e;else{const n=q4(e.left);n.right=i,i.parent=n}return T2(this,i),i}}class Bu extends z{constructor(e,t,i,n,s,r,a){super(),this._onDidChangeContent=this._register(new O),this._BOM=t,this._mightContainNonBasicASCII=!r,this._mightContainRTL=n,this._mightContainUnusualLineTerminators=s,this._pieceTree=new XK(e,i,a)}mightContainRTL(){return this._mightContainRTL}mightContainUnusualLineTerminators(){return this._mightContainUnusualLineTerminators}resetMightContainUnusualLineTerminators(){this._mightContainUnusualLineTerminators=!1}mightContainNonBasicASCII(){return this._mightContainNonBasicASCII}getBOM(){return this._BOM}getEOL(){return this._pieceTree.getEOL()}createSnapshot(e){return this._pieceTree.createSnapshot(e?this._BOM:\"\")}getOffsetAt(e,t){return this._pieceTree.getOffsetAt(e,t)}getPositionAt(e){return this._pieceTree.getPositionAt(e)}getRangeAt(e,t){const i=e+t,n=this.getPositionAt(e),s=this.getPositionAt(i);return new L(n.lineNumber,n.column,s.lineNumber,s.column)}getValueInRange(e,t=0){if(e.isEmpty())return\"\";const i=this._getEndOfLine(t);return this._pieceTree.getValueInRange(e,i)}getValueLengthInRange(e,t=0){if(e.isEmpty())return 0;if(e.startLineNumber===e.endLineNumber)return e.endColumn-e.startColumn;const i=this.getOffsetAt(e.startLineNumber,e.startColumn);return this.getOffsetAt(e.endLineNumber,e.endColumn)-i}getCharacterCountInRange(e,t=0){if(this._mightContainNonBasicASCII){let i=0;const n=e.startLineNumber,s=e.endLineNumber;for(let r=n;r<=s;r++){const a=this.getLineContent(r),l=r===n?e.startColumn-1:0,c=r===s?e.endColumn-1:a.length;for(let d=l;d<c;d++)wi(a.charCodeAt(d))?(i=i+1,d=d+1):i=i+1}return i+=this._getEndOfLine(t).length*(s-n),i}return this.getValueLengthInRange(e,t)}getLength(){return this._pieceTree.getLength()}getLineCount(){return this._pieceTree.getLineCount()}getLinesContent(){return this._pieceTree.getLinesContent()}getLineContent(e){return this._pieceTree.getLineContent(e)}getLineCharCode(e,t){return this._pieceTree.getLineCharCode(e,t)}getLineLength(e){return this._pieceTree.getLineLength(e)}getLineFirstNonWhitespaceColumn(e){const t=Sn(this.getLineContent(e));return t===-1?0:t+1}getLineLastNonWhitespaceColumn(e){const t=Fr(this.getLineContent(e));return t===-1?0:t+2}_getEndOfLine(e){switch(e){case 1:return`\n`;case 2:return`\\r\n`;case 0:return this.getEOL();default:throw new Error(\"Unknown EOL preference\")}}setEOL(e){this._pieceTree.setEOL(e)}applyEdits(e,t,i){let n=this._mightContainRTL,s=this._mightContainUnusualLineTerminators,r=this._mightContainNonBasicASCII,a=!0,l=[];for(let _=0;_<e.length;_++){const b=e[_];a&&b._isTracked&&(a=!1);const v=b.range;if(b.text){let x=!0;r||(x=!DC(b.text),r=x),!n&&x&&(n=ig(b.text)),!s&&x&&(s=YO(b.text))}let C=\"\",w=0,S=0,k=0;if(b.text){let x;[w,S,k,x]=Ud(b.text);const y=this.getEOL();x===0||x===(y===`\\r\n`?2:1)?C=b.text:C=b.text.replace(/\\r\\n|\\r|\\n/g,y)}l[_]={sortIndex:_,identifier:b.identifier||null,range:v,rangeOffset:this.getOffsetAt(v.startLineNumber,v.startColumn),rangeLength:this.getValueLengthInRange(v),text:C,eolCount:w,firstLineLength:S,lastLineLength:k,forceMoveMarkers:Boolean(b.forceMoveMarkers),isAutoWhitespaceEdit:b.isAutoWhitespaceEdit||!1}}l.sort(Bu._sortOpsAscending);let c=!1;for(let _=0,b=l.length-1;_<b;_++){const v=l[_].range.getEndPosition(),C=l[_+1].range.getStartPosition();if(C.isBeforeOrEqual(v)){if(C.isBefore(v))throw new Error(\"Overlapping ranges are not allowed!\");c=!0}}a&&(l=this._reduceOperations(l));const d=i||t?Bu._getInverseEditRanges(l):[],h=[];if(t)for(let _=0;_<l.length;_++){const b=l[_],v=d[_];if(b.isAutoWhitespaceEdit&&b.range.isEmpty())for(let C=v.startLineNumber;C<=v.endLineNumber;C++){let w=\"\";C===v.startLineNumber&&(w=this.getLineContent(b.range.startLineNumber),Sn(w)!==-1)||h.push({lineNumber:C,oldContent:w})}}let u=null;if(i){let _=0;u=[];for(let b=0;b<l.length;b++){const v=l[b],C=d[b],w=this.getValueInRange(v.range),S=v.rangeOffset+_;_+=v.text.length-w.length,u[b]={sortIndex:v.sortIndex,identifier:v.identifier,range:C,text:w,textChange:new Hi(v.rangeOffset,w,S,v.text)}}c||u.sort((b,v)=>b.sortIndex-v.sortIndex)}this._mightContainRTL=n,this._mightContainUnusualLineTerminators=s,this._mightContainNonBasicASCII=r;const g=this._doApplyEdits(l);let f=null;if(t&&h.length>0){h.sort((_,b)=>b.lineNumber-_.lineNumber),f=[];for(let _=0,b=h.length;_<b;_++){const v=h[_].lineNumber;if(_>0&&h[_-1].lineNumber===v)continue;const C=h[_].oldContent,w=this.getLineContent(v);w.length===0||w===C||Sn(w)!==-1||f.push(v)}}return this._onDidChangeContent.fire(),new Y$(u,g,f)}_reduceOperations(e){return e.length<1e3?e:[this._toSingleEditOperation(e)]}_toSingleEditOperation(e){let t=!1;const i=e[0].range,n=e[e.length-1].range,s=new L(i.startLineNumber,i.startColumn,n.endLineNumber,n.endColumn);let r=i.startLineNumber,a=i.startColumn;const l=[];for(let g=0,f=e.length;g<f;g++){const _=e[g],b=_.range;t=t||_.forceMoveMarkers,l.push(this.getValueInRange(new L(r,a,b.startLineNumber,b.startColumn))),_.text.length>0&&l.push(_.text),r=b.endLineNumber,a=b.endColumn}const c=l.join(\"\"),[d,h,u]=Ud(c);return{sortIndex:0,identifier:e[0].identifier,range:s,rangeOffset:this.getOffsetAt(s.startLineNumber,s.startColumn),rangeLength:this.getValueLengthInRange(s,0),text:c,eolCount:d,firstLineLength:h,lastLineLength:u,forceMoveMarkers:t,isAutoWhitespaceEdit:!1}}_doApplyEdits(e){e.sort(Bu._sortOpsDescending);const t=[];for(let i=0;i<e.length;i++){const n=e[i],s=n.range.startLineNumber,r=n.range.startColumn,a=n.range.endLineNumber,l=n.range.endColumn;if(s===a&&r===l&&n.text.length===0)continue;n.text?(this._pieceTree.delete(n.rangeOffset,n.rangeLength),this._pieceTree.insert(n.rangeOffset,n.text,!0)):this._pieceTree.delete(n.rangeOffset,n.rangeLength);const c=new L(s,r,a,l);t.push({range:c,rangeLength:n.rangeLength,text:n.text,rangeOffset:n.rangeOffset,forceMoveMarkers:n.forceMoveMarkers})}return t}findMatchesLineByLine(e,t,i,n){return this._pieceTree.findMatchesLineByLine(e,t,i,n)}static _getInverseEditRanges(e){const t=[];let i=0,n=0,s=null;for(let r=0,a=e.length;r<a;r++){const l=e[r];let c,d;s?s.range.endLineNumber===l.range.startLineNumber?(c=i,d=n+(l.range.startColumn-s.range.endColumn)):(c=i+(l.range.startLineNumber-s.range.endLineNumber),d=l.range.startColumn):(c=l.range.startLineNumber,d=l.range.startColumn);let h;if(l.text.length>0){const u=l.eolCount+1;u===1?h=new L(c,d,c,d+l.firstLineLength):h=new L(c,d,c+u-1,l.lastLineLength+1)}else h=new L(c,d,c,d);i=h.endLineNumber,n=h.endColumn,t.push(h),s=l}return t}static _sortOpsAscending(e,t){const i=L.compareRangesUsingEnds(e.range,t.range);return i===0?e.sortIndex-t.sortIndex:i}static _sortOpsDescending(e,t){const i=L.compareRangesUsingEnds(e.range,t.range);return i===0?t.sortIndex-e.sortIndex:-i}}class QK{constructor(e,t,i,n,s,r,a,l,c){this._chunks=e,this._bom=t,this._cr=i,this._lf=n,this._crlf=s,this._containsRTL=r,this._containsUnusualLineTerminators=a,this._isBasicASCII=l,this._normalizeEOL=c}_getEOL(e){const t=this._cr+this._lf+this._crlf,i=this._cr+this._crlf;return t===0?e===1?`\n`:`\\r\n`:i>t/2?`\\r\n`:`\n`}create(e){const t=this._getEOL(e),i=this._chunks;if(this._normalizeEOL&&(t===`\\r\n`&&(this._cr>0||this._lf>0)||t===`\n`&&(this._cr>0||this._crlf>0)))for(let s=0,r=i.length;s<r;s++){const a=i[s].buffer.replace(/\\r\\n|\\r|\\n/g,t),l=va(a);i[s]=new Jc(a,l)}const n=new Bu(i,this._bom,t,this._containsRTL,this._containsUnusualLineTerminators,this._isBasicASCII,this._normalizeEOL);return{textBuffer:n,disposable:n}}}class Z4{constructor(){this.chunks=[],this.BOM=\"\",this._hasPreviousChar=!1,this._previousChar=0,this._tmpLineStarts=[],this.cr=0,this.lf=0,this.crlf=0,this.containsRTL=!1,this.containsUnusualLineTerminators=!1,this.isBasicASCII=!0}acceptChunk(e){if(e.length===0)return;this.chunks.length===0&&Zx(e)&&(this.BOM=RB,e=e.substr(1));const t=e.charCodeAt(e.length-1);t===13||t>=55296&&t<=56319?(this._acceptChunk1(e.substr(0,e.length-1),!1),this._hasPreviousChar=!0,this._previousChar=t):(this._acceptChunk1(e,!1),this._hasPreviousChar=!1,this._previousChar=t)}_acceptChunk1(e,t){!t&&e.length===0||(this._hasPreviousChar?this._acceptChunk2(String.fromCharCode(this._previousChar)+e):this._acceptChunk2(e))}_acceptChunk2(e){const t=GK(this._tmpLineStarts,e);this.chunks.push(new Jc(e,t.lineStarts)),this.cr+=t.cr,this.lf+=t.lf,this.crlf+=t.crlf,this.isBasicASCII&&(this.isBasicASCII=t.isBasicASCII),!this.isBasicASCII&&!this.containsRTL&&(this.containsRTL=ig(e)),!this.isBasicASCII&&!this.containsUnusualLineTerminators&&(this.containsUnusualLineTerminators=YO(e))}finish(e=!0){return this._finish(),new QK(this.chunks,this.BOM,this.cr,this.lf,this.crlf,this.containsRTL,this.containsUnusualLineTerminators,this.isBasicASCII,e)}_finish(){if(this.chunks.length===0&&this._acceptChunk1(\"\",!0),this._hasPreviousChar){this._hasPreviousChar=!1;const e=this.chunks[this.chunks.length-1];e.buffer+=String.fromCharCode(this._previousChar);const t=va(e.buffer);e.lineStarts=t,this._previousChar===13&&this.cr++}}}class Si{constructor(e,t,i){this._lineTokensBrand=void 0,this._tokens=e,this._tokensCount=this._tokens.length>>>1,this._text=t,this._languageIdCodec=i}static createEmpty(e,t){const i=Si.defaultTokenMetadata,n=new Uint32Array(2);return n[0]=e.length,n[1]=i,new Si(n,e,t)}equals(e){return e instanceof Si?this.slicedEquals(e,0,this._tokensCount):!1}slicedEquals(e,t,i){if(this._text!==e._text||this._tokensCount!==e._tokensCount)return!1;const n=t<<1,s=n+(i<<1);for(let r=n;r<s;r++)if(this._tokens[r]!==e._tokens[r])return!1;return!0}getLineContent(){return this._text}getCount(){return this._tokensCount}getStartOffset(e){return e>0?this._tokens[e-1<<1]:0}getMetadata(e){return this._tokens[(e<<1)+1]}getLanguageId(e){const t=this._tokens[(e<<1)+1],i=Yn.getLanguageId(t);return this._languageIdCodec.decodeLanguageId(i)}getStandardTokenType(e){const t=this._tokens[(e<<1)+1];return Yn.getTokenType(t)}getForeground(e){const t=this._tokens[(e<<1)+1];return Yn.getForeground(t)}getClassName(e){const t=this._tokens[(e<<1)+1];return Yn.getClassNameFromMetadata(t)}getInlineStyle(e,t){const i=this._tokens[(e<<1)+1];return Yn.getInlineStyleFromMetadata(i,t)}getPresentation(e){const t=this._tokens[(e<<1)+1];return Yn.getPresentationFromMetadata(t)}getEndOffset(e){return this._tokens[e<<1]}findTokenIndexAtOffset(e){return Si.findIndexInTokensArray(this._tokens,e)}inflate(){return this}sliceAndInflate(e,t,i){return new $I(this,e,t,i)}static convertToEndOffset(e,t){const n=(e.length>>>1)-1;for(let s=0;s<n;s++)e[s<<1]=e[s+1<<1];e[n<<1]=t}static findIndexInTokensArray(e,t){if(e.length<=2)return 0;let i=0,n=(e.length>>>1)-1;for(;i<n;){const s=i+Math.floor((n-i)/2),r=e[s<<1];if(r===t)return s+1;r<t?i=s+1:r>t&&(n=s)}return i}withInserted(e){if(e.length===0)return this;let t=0,i=0,n=\"\";const s=new Array;let r=0;for(;;){const a=t<this._tokensCount?this._tokens[t<<1]:-1,l=i<e.length?e[i]:null;if(a!==-1&&(l===null||a<=l.offset)){n+=this._text.substring(r,a);const c=this._tokens[(t<<1)+1];s.push(n.length,c),t++,r=a}else if(l){if(l.offset>r){n+=this._text.substring(r,l.offset);const c=this._tokens[(t<<1)+1];s.push(n.length,c),r=l.offset}n+=l.text,s.push(n.length,l.tokenMetadata),i++}else break}return new Si(new Uint32Array(s),n,this._languageIdCodec)}}Si.defaultTokenMetadata=(0<<11|1<<15|2<<24)>>>0;class $I{constructor(e,t,i,n){this._source=e,this._startOffset=t,this._endOffset=i,this._deltaOffset=n,this._firstTokenIndex=e.findTokenIndexAtOffset(t),this._tokensCount=0;for(let s=this._firstTokenIndex,r=e.getCount();s<r&&!(e.getStartOffset(s)>=i);s++)this._tokensCount++}getMetadata(e){return this._source.getMetadata(this._firstTokenIndex+e)}getLanguageId(e){return this._source.getLanguageId(this._firstTokenIndex+e)}getLineContent(){return this._source.getLineContent().substring(this._startOffset,this._endOffset)}equals(e){return e instanceof $I?this._startOffset===e._startOffset&&this._endOffset===e._endOffset&&this._deltaOffset===e._deltaOffset&&this._source.slicedEquals(e._source,this._firstTokenIndex,this._tokensCount):!1}getCount(){return this._tokensCount}getForeground(e){return this._source.getForeground(this._firstTokenIndex+e)}getEndOffset(e){const t=this._source.getEndOffset(this._firstTokenIndex+e);return Math.min(this._endOffset,t)-this._startOffset+this._deltaOffset}getClassName(e){return this._source.getClassName(this._firstTokenIndex+e)}getInlineStyle(e,t){return this._source.getInlineStyle(this._firstTokenIndex+e,t)}getPresentation(e){return this._source.getPresentation(this._firstTokenIndex+e)}findTokenIndexAtOffset(e){return this._source.findTokenIndexAtOffset(e+this._startOffset-this._deltaOffset)-this._firstTokenIndex}}const Jp=new class{clone(){return this}equals(o){return this===o}};function Y4(o,e){return new DI([new Vp(0,\"\",o)],e)}function jI(o,e){const t=new Uint32Array(2);return t[0]=0,t[1]=(o<<0|0<<8|0<<11|1<<15|2<<24)>>>0,new i1(t,e===null?Jp:e)}class JK{constructor(e,t){this._startLineNumber=e,this._tokens=t}get startLineNumber(){return this._startLineNumber}get endLineNumber(){return this._startLineNumber+this._tokens.length-1}getLineTokens(e){return this._tokens[e-this._startLineNumber]}appendLineTokens(e){this._tokens.push(e)}}class qw{constructor(){this._tokens=[]}add(e,t){if(this._tokens.length>0){const i=this._tokens[this._tokens.length-1];if(i.endLineNumber+1===e){i.appendLineTokens(t);return}}this._tokens.push(new JK(e,[t]))}finalize(){return this._tokens}}class A2{constructor(e){this._default=e,this._store=[]}get(e){return e<this._store.length?this._store[e]:this._default}set(e,t){for(;e>=this._store.length;)this._store[this._store.length]=this._default;this._store[e]=t}delete(e,t){t===0||e>=this._store.length||this._store.splice(e,t)}insert(e,t){if(t===0||e>=this._store.length)return;const i=[];for(let n=0;n<t;n++)i[n]=this._default;this._store=WC(this._store,e,i)}}class eq{constructor(e,t){this.tokenizationSupport=e,this.initialState=t,this._lineBeginState=new A2(null),this._lineNeedsTokenization=new A2(!0),this._firstLineNeedsTokenization=0,this._lineBeginState.set(0,this.initialState)}get invalidLineStartIndex(){return this._firstLineNeedsTokenization}markMustBeTokenized(e){this._lineNeedsTokenization.set(e,!0),this._firstLineNeedsTokenization=Math.min(this._firstLineNeedsTokenization,e)}getBeginState(e){return this._lineBeginState.get(e)}setEndState(e,t,i){if(this._lineNeedsTokenization.set(t,!1),this._firstLineNeedsTokenization=t+1,t===e-1)return;const n=this._lineBeginState.get(t+1);if(n===null||!i.equals(n)){this._lineBeginState.set(t+1,i),this.markMustBeTokenized(t+1);return}let s=t+1;for(;s<e&&!this._lineNeedsTokenization.get(s);)s++;this._firstLineNeedsTokenization=s}applyEdits(e,t){this.markMustBeTokenized(e.startLineNumber-1),this._lineBeginState.delete(e.startLineNumber,e.endLineNumber-e.startLineNumber),this._lineNeedsTokenization.delete(e.startLineNumber,e.endLineNumber-e.startLineNumber),this._lineBeginState.insert(e.startLineNumber,t),this._lineNeedsTokenization.insert(e.startLineNumber,t)}}class tq extends z{constructor(e,t,i){super(),this._textModel=e,this._tokenizationPart=t,this._languageIdCodec=i,this._isScheduled=!1,this._isDisposed=!1,this._tokenizationStateStore=null,this._register(Jt.onDidChange(n=>{const s=this._textModel.getLanguageId();n.changedLanguages.indexOf(s)!==-1&&(this._resetTokenizationState(),this._tokenizationPart.clearTokens())})),this._resetTokenizationState()}dispose(){this._isDisposed=!0,super.dispose()}handleDidChangeContent(e){if(e.isFlush){this._resetTokenizationState();return}if(this._tokenizationStateStore)for(let t=0,i=e.changes.length;t<i;t++){const n=e.changes[t],[s]=Ud(n.text);this._tokenizationStateStore.applyEdits(n.range,s)}this._beginBackgroundTokenization()}handleDidChangeAttached(){this._beginBackgroundTokenization()}handleDidChangeLanguage(e){this._resetTokenizationState(),this._tokenizationPart.clearTokens()}_resetTokenizationState(){const[e,t]=iq(this._textModel,this._tokenizationPart);e&&t?this._tokenizationStateStore=new eq(e,t):this._tokenizationStateStore=null,this._beginBackgroundTokenization()}_beginBackgroundTokenization(){this._isScheduled||!this._textModel.isAttachedToEditor()||!this._hasLinesToTokenize()||(this._isScheduled=!0,Fp(e=>{this._isScheduled=!1,this._backgroundTokenizeWithDeadline(e)}))}_backgroundTokenizeWithDeadline(e){const t=Date.now()+e.timeRemaining(),i=()=>{this._isDisposed||!this._textModel.isAttachedToEditor()||!this._hasLinesToTokenize()||(this._backgroundTokenizeForAtLeast1ms(),Date.now()<t?gO(i):this._beginBackgroundTokenization())};i()}_backgroundTokenizeForAtLeast1ms(){const e=this._textModel.getLineCount(),t=new qw,i=Hn.create(!1);do if(i.elapsed()>1||this._tokenizeOneInvalidLine(t)>=e)break;while(this._hasLinesToTokenize());this._tokenizationPart.setTokens(t.finalize(),this._isTokenizationComplete())}tokenizeViewport(e,t){const i=new qw;this._tokenizeViewport(i,e,t),this._tokenizationPart.setTokens(i.finalize(),this._isTokenizationComplete())}reset(){this._resetTokenizationState(),this._tokenizationPart.clearTokens()}forceTokenization(e){const t=new qw;this._updateTokensUntilLine(t,e),this._tokenizationPart.setTokens(t.finalize(),this._isTokenizationComplete())}getTokenTypeIfInsertingCharacter(e,t){if(!this._tokenizationStateStore)return 0;this.forceTokenization(e.lineNumber);const i=this._tokenizationStateStore.getBeginState(e.lineNumber-1);if(!i)return 0;const n=this._textModel.getLanguageId(),s=this._textModel.getLineContent(e.lineNumber),r=s.substring(0,e.column-1)+t+s.substring(e.column-1),a=pf(this._languageIdCodec,n,this._tokenizationStateStore.tokenizationSupport,r,!0,i),l=new Si(a.tokens,r,this._languageIdCodec);if(l.getCount()===0)return 0;const c=l.findTokenIndexAtOffset(e.column-1);return l.getStandardTokenType(c)}tokenizeLineWithEdit(e,t,i){const n=e.lineNumber,s=e.column;if(!this._tokenizationStateStore)return null;this.forceTokenization(n);const r=this._tokenizationStateStore.getBeginState(n-1);if(!r)return null;const a=this._textModel.getLineContent(n),l=a.substring(0,s-1)+i+a.substring(s-1+t),c=this._textModel.getLanguageIdAtPosition(n,0),d=pf(this._languageIdCodec,c,this._tokenizationStateStore.tokenizationSupport,l,!0,r);return new Si(d.tokens,l,this._languageIdCodec)}isCheapToTokenize(e){if(!this._tokenizationStateStore)return!0;const t=this._tokenizationStateStore.invalidLineStartIndex+1;return e>t?!1:e<t||this._textModel.getLineLength(e)<2048}_hasLinesToTokenize(){return this._tokenizationStateStore?this._tokenizationStateStore.invalidLineStartIndex<this._textModel.getLineCount():!1}_isTokenizationComplete(){return this._tokenizationStateStore?this._tokenizationStateStore.invalidLineStartIndex>=this._textModel.getLineCount():!1}_tokenizeOneInvalidLine(e){if(!this._tokenizationStateStore||!this._hasLinesToTokenize())return this._textModel.getLineCount()+1;const t=this._tokenizationStateStore.invalidLineStartIndex+1;return this._updateTokensUntilLine(e,t),t}_updateTokensUntilLine(e,t){if(!this._tokenizationStateStore)return;const i=this._textModel.getLanguageId(),n=this._textModel.getLineCount(),s=t-1;for(let r=this._tokenizationStateStore.invalidLineStartIndex;r<=s;r++){const a=this._textModel.getLineContent(r+1),l=this._tokenizationStateStore.getBeginState(r),c=pf(this._languageIdCodec,i,this._tokenizationStateStore.tokenizationSupport,a,!0,l);e.add(r+1,c.tokens),this._tokenizationStateStore.setEndState(n,r,c.endState),r=this._tokenizationStateStore.invalidLineStartIndex-1}}_tokenizeViewport(e,t,i){if(!this._tokenizationStateStore||i<=this._tokenizationStateStore.invalidLineStartIndex)return;if(t<=this._tokenizationStateStore.invalidLineStartIndex){this._updateTokensUntilLine(e,i);return}let n=this._textModel.getLineFirstNonWhitespaceColumn(t);const s=[];let r=null;for(let c=t-1;n>1&&c>=1;c--){const d=this._textModel.getLineFirstNonWhitespaceColumn(c);if(d!==0&&d<n&&(s.push(this._textModel.getLineContent(c)),n=d,r=this._tokenizationStateStore.getBeginState(c-1),r))break}r||(r=this._tokenizationStateStore.initialState);const a=this._textModel.getLanguageId();let l=r;for(let c=s.length-1;c>=0;c--)l=pf(this._languageIdCodec,a,this._tokenizationStateStore.tokenizationSupport,s[c],!1,l).endState;for(let c=t;c<=i;c++){const d=this._textModel.getLineContent(c),h=pf(this._languageIdCodec,a,this._tokenizationStateStore.tokenizationSupport,d,!0,l);e.add(c,h.tokens),this._tokenizationStateStore.markMustBeTokenized(c-1),l=h.endState}}}function iq(o,e){if(o.isTooLargeForTokenization())return[null,null];const t=Jt.get(e.getLanguageId());if(!t)return[null,null];let i;try{i=t.getInitialState()}catch(n){return Ee(n),[null,null]}return[t,i]}function pf(o,e,t,i,n,s){let r=null;if(t)try{r=t.tokenizeEncoded(i,n,s.clone())}catch(a){Ee(a)}return r||(r=jI(o.encodeLanguageId(e),s)),Si.convertToEndOffset(r.tokens,i.length),r}const Ca=new Uint32Array(0).buffer;class mr{static deleteBeginning(e,t){return e===null||e===Ca?e:mr.delete(e,0,t)}static deleteEnding(e,t){if(e===null||e===Ca)return e;const i=Ma(e),n=i[i.length-2];return mr.delete(e,t,n)}static delete(e,t,i){if(e===null||e===Ca||t===i)return e;const n=Ma(e),s=n.length>>>1;if(t===0&&n[n.length-2]===i)return Ca;const r=Si.findIndexInTokensArray(n,t),a=r>0?n[r-1<<1]:0,l=n[r<<1];if(i<l){const g=i-t;for(let f=r;f<s;f++)n[f<<1]-=g;return e}let c,d;a!==t?(n[r<<1]=t,c=r+1<<1,d=t):(c=r<<1,d=a);const h=i-t;for(let g=r+1;g<s;g++){const f=n[g<<1]-h;f>d&&(n[c++]=f,n[c++]=n[(g<<1)+1],d=f)}if(c===n.length)return e;const u=new Uint32Array(c);return u.set(n.subarray(0,c),0),u.buffer}static append(e,t){if(t===Ca)return e;if(e===Ca)return t;if(e===null)return e;if(t===null)return null;const i=Ma(e),n=Ma(t),s=n.length>>>1,r=new Uint32Array(i.length+n.length);r.set(i,0);let a=i.length;const l=i[i.length-2];for(let c=0;c<s;c++)r[a++]=n[c<<1]+l,r[a++]=n[(c<<1)+1];return r.buffer}static insert(e,t,i){if(e===null||e===Ca)return e;const n=Ma(e),s=n.length>>>1;let r=Si.findIndexInTokensArray(n,t);r>0&&n[r-1<<1]===t&&r--;for(let a=r;a<s;a++)n[a<<1]+=i;return e}}function Ma(o){return o instanceof Uint32Array?o:new Uint32Array(o)}class hv{constructor(e){this._lineTokens=[],this._len=0,this._languageIdCodec=e}flush(){this._lineTokens=[],this._len=0}getTokens(e,t,i){let n=null;if(t<this._len&&(n=this._lineTokens[t]),n!==null&&n!==Ca)return new Si(Ma(n),i,this._languageIdCodec);const s=new Uint32Array(2);return s[0]=i.length,s[1]=R2(this._languageIdCodec.encodeLanguageId(e)),new Si(s,i,this._languageIdCodec)}static _massageTokens(e,t,i){const n=i?Ma(i):null;if(t===0){let s=!1;if(n&&n.length>1&&(s=Yn.getLanguageId(n[1])!==e),!s)return Ca}if(!n||n.length===0){const s=new Uint32Array(2);return s[0]=t,s[1]=R2(e),s.buffer}return n[n.length-2]=t,n.byteOffset===0&&n.byteLength===n.buffer.byteLength?n.buffer:n}_ensureLine(e){for(;e>=this._len;)this._lineTokens[this._len]=null,this._len++}_deleteLines(e,t){t!==0&&(e+t>this._len&&(t=this._len-e),this._lineTokens.splice(e,t),this._len-=t)}_insertLines(e,t){if(t===0)return;const i=[];for(let n=0;n<t;n++)i[n]=null;this._lineTokens=WC(this._lineTokens,e,i),this._len+=t}setTokens(e,t,i,n,s){const r=hv._massageTokens(this._languageIdCodec.encodeLanguageId(e),i,n);this._ensureLine(t);const a=this._lineTokens[t];return this._lineTokens[t]=r,s?!hv._equals(a,r):!1}static _equals(e,t){if(!e||!t)return!e&&!t;const i=Ma(e),n=Ma(t);if(i.length!==n.length)return!1;for(let s=0,r=i.length;s<r;s++)if(i[s]!==n[s])return!1;return!0}acceptEdit(e,t,i){this._acceptDeleteRange(e),this._acceptInsertText(new B(e.startLineNumber,e.startColumn),t,i)}_acceptDeleteRange(e){const t=e.startLineNumber-1;if(t>=this._len)return;if(e.startLineNumber===e.endLineNumber){if(e.startColumn===e.endColumn)return;this._lineTokens[t]=mr.delete(this._lineTokens[t],e.startColumn-1,e.endColumn-1);return}this._lineTokens[t]=mr.deleteEnding(this._lineTokens[t],e.startColumn-1);const i=e.endLineNumber-1;let n=null;i<this._len&&(n=mr.deleteBeginning(this._lineTokens[i],e.endColumn-1)),this._lineTokens[t]=mr.append(this._lineTokens[t],n),this._deleteLines(e.startLineNumber,e.endLineNumber-e.startLineNumber)}_acceptInsertText(e,t,i){if(t===0&&i===0)return;const n=e.lineNumber-1;if(!(n>=this._len)){if(t===0){this._lineTokens[n]=mr.insert(this._lineTokens[n],e.column-1,i);return}this._lineTokens[n]=mr.deleteEnding(this._lineTokens[n],e.column-1),this._lineTokens[n]=mr.insert(this._lineTokens[n],e.column-1,i),this._insertLines(e.lineNumber,t)}}}function R2(o){return(o<<0|0<<8|0<<11|1<<15|2<<24|1024)>>>0}class KI{constructor(e){this._pieces=[],this._isComplete=!1,this._languageIdCodec=e}flush(){this._pieces=[],this._isComplete=!1}isEmpty(){return this._pieces.length===0}set(e,t){this._pieces=e||[],this._isComplete=t}setPartial(e,t){let i=e;if(t.length>0){const s=t[0].getRange(),r=t[t.length-1].getRange();if(!s||!r)return e;i=e.plusRange(s).plusRange(r)}let n=null;for(let s=0,r=this._pieces.length;s<r;s++){const a=this._pieces[s];if(a.endLineNumber<i.startLineNumber)continue;if(a.startLineNumber>i.endLineNumber){n=n||{index:s};break}if(a.removeTokens(i),a.isEmpty()){this._pieces.splice(s,1),s--,r--;continue}if(a.endLineNumber<i.startLineNumber)continue;if(a.startLineNumber>i.endLineNumber){n=n||{index:s};continue}const[l,c]=a.split(i);if(l.isEmpty()){n=n||{index:s};continue}c.isEmpty()||(this._pieces.splice(s,1,l,c),s++,r++,n=n||{index:s})}return n=n||{index:this._pieces.length},t.length>0&&(this._pieces=WC(this._pieces,n.index,t)),i}isComplete(){return this._isComplete}addSparseTokens(e,t){if(t.getLineContent().length===0)return t;const i=this._pieces;if(i.length===0)return t;const n=KI._findFirstPieceWithLine(i,e),s=i[n].getLineTokens(e);if(!s)return t;const r=t.getCount(),a=s.getCount();let l=0;const c=[];let d=0,h=0;const u=(g,f)=>{g!==h&&(h=g,c[d++]=g,c[d++]=f)};for(let g=0;g<a;g++){const f=s.getStartCharacter(g),_=s.getEndCharacter(g),b=s.getMetadata(g),v=((b&1?2048:0)|(b&2?4096:0)|(b&4?8192:0)|(b&8?16384:0)|(b&16?16744448:0)|(b&32?4278190080:0))>>>0,C=~v>>>0;for(;l<r&&t.getEndOffset(l)<=f;)u(t.getEndOffset(l),t.getMetadata(l)),l++;for(l<r&&t.getStartOffset(l)<f&&u(f,t.getMetadata(l));l<r&&t.getEndOffset(l)<_;)u(t.getEndOffset(l),t.getMetadata(l)&C|b&v),l++;if(l<r)u(_,t.getMetadata(l)&C|b&v),t.getEndOffset(l)===_&&l++;else{const w=Math.min(Math.max(0,l-1),r-1);u(_,t.getMetadata(w)&C|b&v)}}for(;l<r;)u(t.getEndOffset(l),t.getMetadata(l)),l++;return new Si(new Uint32Array(c),t.getLineContent(),this._languageIdCodec)}static _findFirstPieceWithLine(e,t){let i=0,n=e.length-1;for(;i<n;){let s=i+Math.floor((n-i)/2);if(e[s].endLineNumber<t)i=s+1;else if(e[s].startLineNumber>t)n=s-1;else{for(;s>i&&e[s-1].startLineNumber<=t&&t<=e[s-1].endLineNumber;)s--;return s}}return i}acceptEdit(e,t,i,n,s){for(const r of this._pieces)r.acceptEdit(e,t,i,n,s)}}class uv extends k4{constructor(e,t,i,n,s){super(),this._languageService=e,this._languageConfigurationService=t,this._textModel=i,this.bracketPairsTextModelPart=n,this._languageId=s,this._onDidChangeLanguage=this._register(new O),this.onDidChangeLanguage=this._onDidChangeLanguage.event,this._onDidChangeLanguageConfiguration=this._register(new O),this.onDidChangeLanguageConfiguration=this._onDidChangeLanguageConfiguration.event,this._onDidChangeTokens=this._register(new O),this.onDidChangeTokens=this._onDidChangeTokens.event,this._backgroundTokenizationState=0,this._onBackgroundTokenizationStateChanged=this._register(new O),this._tokens=new hv(this._languageService.languageIdCodec),this._semanticTokens=new KI(this._languageService.languageIdCodec),this._tokenization=new tq(i,this,this._languageService.languageIdCodec),this._languageRegistryListener=this._languageConfigurationService.onDidChange(r=>{r.affects(this._languageId)&&this._onDidChangeLanguageConfiguration.fire({})})}acceptEdit(e,t,i,n,s){this._tokens.acceptEdit(e,i,n),this._semanticTokens.acceptEdit(e,i,n,s,t.length>0?t.charCodeAt(0):0)}handleDidChangeAttached(){this._tokenization.handleDidChangeAttached()}flush(){this._tokens.flush(),this._semanticTokens.flush()}handleDidChangeContent(e){this._tokenization.handleDidChangeContent(e)}dispose(){this._languageRegistryListener.dispose(),this._tokenization.dispose(),super.dispose()}get backgroundTokenizationState(){return this._backgroundTokenizationState}handleTokenizationProgress(e){if(this._backgroundTokenizationState===2)return;const t=e?2:1;this._backgroundTokenizationState!==t&&(this._backgroundTokenizationState=t,this.bracketPairsTextModelPart.handleDidChangeBackgroundTokenizationState(),this._onBackgroundTokenizationStateChanged.fire())}setTokens(e,t=!1){if(e.length!==0){const i=[];for(let n=0,s=e.length;n<s;n++){const r=e[n];let a=0,l=0,c=!1;for(let d=r.startLineNumber;d<=r.endLineNumber;d++)c?(this._tokens.setTokens(this._languageId,d-1,this._textModel.getLineLength(d),r.getLineTokens(d),!1),l=d):this._tokens.setTokens(this._languageId,d-1,this._textModel.getLineLength(d),r.getLineTokens(d),!0)&&(c=!0,a=d,l=d);c&&i.push({fromLineNumber:a,toLineNumber:l})}i.length>0&&this._emitModelTokensChangedEvent({tokenizationSupportChanged:!1,semanticTokensApplied:!1,ranges:i})}this.handleTokenizationProgress(t)}setSemanticTokens(e,t){this._semanticTokens.set(e,t),this._emitModelTokensChangedEvent({tokenizationSupportChanged:!1,semanticTokensApplied:e!==null,ranges:[{fromLineNumber:1,toLineNumber:this._textModel.getLineCount()}]})}hasCompleteSemanticTokens(){return this._semanticTokens.isComplete()}hasSomeSemanticTokens(){return!this._semanticTokens.isEmpty()}setPartialSemanticTokens(e,t){if(this.hasCompleteSemanticTokens())return;const i=this._textModel.validateRange(this._semanticTokens.setPartial(e,t));this._emitModelTokensChangedEvent({tokenizationSupportChanged:!1,semanticTokensApplied:!0,ranges:[{fromLineNumber:i.startLineNumber,toLineNumber:i.endLineNumber}]})}tokenizeViewport(e,t){e=Math.max(1,e),t=Math.min(this._textModel.getLineCount(),t),this._tokenization.tokenizeViewport(e,t)}clearTokens(){this._tokens.flush(),this._emitModelTokensChangedEvent({tokenizationSupportChanged:!0,semanticTokensApplied:!1,ranges:[{fromLineNumber:1,toLineNumber:this._textModel.getLineCount()}]})}_emitModelTokensChangedEvent(e){this._textModel._isDisposing()||(this.bracketPairsTextModelPart.handleDidChangeTokens(e),this._onDidChangeTokens.fire(e))}resetTokenization(){this._tokenization.reset()}forceTokenization(e){if(e<1||e>this._textModel.getLineCount())throw new Error(\"Illegal value for lineNumber\");this._tokenization.forceTokenization(e)}isCheapToTokenize(e){return this._tokenization.isCheapToTokenize(e)}tokenizeIfCheap(e){this.isCheapToTokenize(e)&&this.forceTokenization(e)}getLineTokens(e){if(e<1||e>this._textModel.getLineCount())throw new Error(\"Illegal value for lineNumber\");return this._getLineTokens(e)}_getLineTokens(e){const t=this._textModel.getLineContent(e),i=this._tokens.getTokens(this._languageId,e-1,t);return this._semanticTokens.addSparseTokens(e,i)}getTokenTypeIfInsertingCharacter(e,t,i){const n=this._textModel.validatePosition(new B(e,t));return this._tokenization.getTokenTypeIfInsertingCharacter(n,i)}tokenizeLineWithEdit(e,t,i){const n=this._textModel.validatePosition(e);return this._tokenization.tokenizeLineWithEdit(n,t,i)}getLanguageConfiguration(e){return this._languageConfigurationService.getLanguageConfiguration(e)}getWordAtPosition(e){this.assertNotDisposed();const t=this._textModel.validatePosition(e),i=this._textModel.getLineContent(t.lineNumber),n=this._getLineTokens(t.lineNumber),s=n.findTokenIndexAtOffset(t.column-1),[r,a]=uv._findLanguageBoundaries(n,s),l=Mp(t.column,this.getLanguageConfiguration(n.getLanguageId(s)).getWordDefinition(),i.substring(r,a),r);if(l&&l.startColumn<=e.column&&e.column<=l.endColumn)return l;if(s>0&&r===t.column-1){const[c,d]=uv._findLanguageBoundaries(n,s-1),h=Mp(t.column,this.getLanguageConfiguration(n.getLanguageId(s-1)).getWordDefinition(),i.substring(c,d),c);if(h&&h.startColumn<=e.column&&e.column<=h.endColumn)return h}return null}static _findLanguageBoundaries(e,t){const i=e.getLanguageId(t);let n=0;for(let r=t;r>=0&&e.getLanguageId(r)===i;r--)n=e.getStartOffset(r);let s=e.getLineContent().length;for(let r=t,a=e.getCount();r<a&&e.getLanguageId(r)===i;r++)s=e.getEndOffset(r);return[n,s]}getWordUntilPosition(e){const t=this.getWordAtPosition(e);return t?{word:t.word.substr(0,e.column-t.startColumn),startColumn:t.startColumn,endColumn:e.column}:{word:\"\",startColumn:e.column,endColumn:e.column}}getLanguageId(){return this._languageId}getLanguageIdAtPosition(e,t){const i=this._textModel.validatePosition(new B(e,t)),n=this.getLineTokens(i.lineNumber);return n.getLanguageId(n.findTokenIndexAtOffset(i.column-1))}setLanguageId(e){if(this._languageId===e)return;const t={oldLanguage:this._languageId,newLanguage:e};this._languageId=e,this.bracketPairsTextModelPart.handleDidChangeLanguage(t),this._tokenization.handleDidChangeLanguage(t),this._onDidChangeLanguage.fire(t),this._onDidChangeLanguageConfiguration.fire({})}}const l1=qe(\"undoRedoService\");class X4{constructor(e,t){this.resource=e,this.elements=t}}class gg{constructor(){this.id=gg._ID++,this.order=1}nextOrder(){return this.id===0?0:this.order++}}gg._ID=0;gg.None=new gg;class Lr{constructor(){this.id=Lr._ID++,this.order=1}nextOrder(){return this.id===0?0:this.order++}}Lr._ID=0;Lr.None=new Lr;var nq=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Gw=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};function sq(o){const e=new Z4;return e.acceptChunk(o),e.finish()}function oq(o){const e=new Z4;let t;for(;typeof(t=o.read())==\"string\";)e.acceptChunk(t);return e.finish()}function O2(o,e){let t;return typeof o==\"string\"?t=sq(o):G$(o)?t=oq(o):t=o,t.create(e)}let nb=0;const rq=999,aq=1e4;class lq{constructor(e){this._source=e,this._eos=!1}read(){if(this._eos)return null;const e=[];let t=0,i=0;do{const n=this._source.read();if(n===null)return this._eos=!0,t===0?null:e.join(\"\");if(n.length>0&&(e[t++]=n,i+=n.length),i>=64*1024)return e.join(\"\")}while(!0)}}const mf=()=>{throw new Error(\"Invalid change accessor\")};let il=class zf extends z{constructor(e,t,i,n=null,s,r,a){super(),this._undoRedoService=s,this._languageService=r,this._languageConfigurationService=a,this._onWillDispose=this._register(new O),this.onWillDispose=this._onWillDispose.event,this._onDidChangeDecorations=this._register(new uq(u=>this.handleBeforeFireDecorationsChangedEvent(u))),this.onDidChangeDecorations=this._onDidChangeDecorations.event,this._onDidChangeOptions=this._register(new O),this.onDidChangeOptions=this._onDidChangeOptions.event,this._onDidChangeAttached=this._register(new O),this.onDidChangeAttached=this._onDidChangeAttached.event,this._onDidChangeInjectedText=this._register(new O),this._eventEmitter=this._register(new gq),this._deltaDecorationCallCnt=0,nb++,this.id=\"$model\"+nb,this.isForSimpleWidget=i.isForSimpleWidget,typeof n==\"undefined\"||n===null?this._associatedResource=me.parse(\"inmemory://model/\"+nb):this._associatedResource=n,this._attachedEditorCount=0;const{textBuffer:l,disposable:c}=O2(e,i.defaultEOL);this._buffer=l,this._bufferDisposable=c,this._options=zf.resolveOptions(this._buffer,i),this._bracketPairs=this._register(new mK(this,this._languageConfigurationService)),this._guidesTextModelPart=this._register(new F$(this,this._languageConfigurationService)),this._decorationProvider=this._register(new bK(this)),this._tokenizationTextModelPart=new uv(this._languageService,this._languageConfigurationService,this,this._bracketPairs,t);const d=this._buffer.getLineCount(),h=this._buffer.getValueLengthInRange(new L(1,1,d,this._buffer.getLineLength(d)+1),0);i.largeFileOptimizations?this._isTooLargeForTokenization=h>zf.LARGE_FILE_SIZE_THRESHOLD||d>zf.LARGE_FILE_LINE_COUNT_THRESHOLD:this._isTooLargeForTokenization=!1,this._isTooLargeForSyncing=h>zf.MODEL_SYNC_LIMIT,this._versionId=1,this._alternativeVersionId=1,this._initialUndoRedoSnapshot=null,this._isDisposed=!1,this.__isDisposing=!1,this._instanceId=XO(nb),this._lastDecorationId=0,this._decorations=Object.create(null),this._decorationsTree=new P2,this._commandManager=new WI(this,this._undoRedoService),this._isUndoing=!1,this._isRedoing=!1,this._trimAutoWhitespaceLines=null,this._register(this._decorationProvider.onDidChange(()=>{this._onDidChangeDecorations.beginDeferredEmit(),this._onDidChangeDecorations.fire(),this._onDidChangeDecorations.endDeferredEmit()}))}static resolveOptions(e,t){if(t.detectIndentation){const i=D2(e,t.tabSize,t.insertSpaces);return new n0({tabSize:i.tabSize,indentSize:i.tabSize,insertSpaces:i.insertSpaces,trimAutoWhitespace:t.trimAutoWhitespace,defaultEOL:t.defaultEOL,bracketPairColorizationOptions:t.bracketPairColorizationOptions})}return new n0({tabSize:t.tabSize,indentSize:t.indentSize,insertSpaces:t.insertSpaces,trimAutoWhitespace:t.trimAutoWhitespace,defaultEOL:t.defaultEOL,bracketPairColorizationOptions:t.bracketPairColorizationOptions})}get onDidChangeLanguage(){return this._tokenizationTextModelPart.onDidChangeLanguage}get onDidChangeLanguageConfiguration(){return this._tokenizationTextModelPart.onDidChangeLanguageConfiguration}get onDidChangeTokens(){return this._tokenizationTextModelPart.onDidChangeTokens}onDidChangeContent(e){return this._eventEmitter.slowEvent(t=>e(t.contentChangedEvent))}onDidChangeContentOrInjectedText(e){return Pr(this._eventEmitter.fastEvent(t=>e(t)),this._onDidChangeInjectedText.event(t=>e(t)))}_isDisposing(){return this.__isDisposing}get tokenization(){return this._tokenizationTextModelPart}get bracketPairs(){return this._bracketPairs}get guides(){return this._guidesTextModelPart}dispose(){this.__isDisposing=!0,this._onWillDispose.fire(),this._tokenizationTextModelPart.dispose(),this._isDisposed=!0,super.dispose(),this._bufferDisposable.dispose(),this.__isDisposing=!1;const e=new Bu([],\"\",`\n`,!1,!1,!0,!0);e.dispose(),this._buffer=e,this._bufferDisposable=z.None}_assertNotDisposed(){if(this._isDisposed)throw new Error(\"Model is disposed!\")}_emitContentChangedEvent(e,t){this.__isDisposing||(this._tokenizationTextModelPart.handleDidChangeContent(t),this._bracketPairs.handleDidChangeContent(t),this._eventEmitter.fire(new wd(e,t)))}setValue(e){if(this._assertNotDisposed(),e===null)return;const{textBuffer:t,disposable:i}=O2(e,this._options.defaultEOL);this._setValueFromTextBuffer(t,i)}_createContentChanged2(e,t,i,n,s,r,a){return{changes:[{range:e,rangeOffset:t,rangeLength:i,text:n}],eol:this._buffer.getEOL(),versionId:this.getVersionId(),isUndoing:s,isRedoing:r,isFlush:a}}_setValueFromTextBuffer(e,t){this._assertNotDisposed();const i=this.getFullModelRange(),n=this.getValueLengthInRange(i),s=this.getLineCount(),r=this.getLineMaxColumn(s);this._buffer=e,this._bufferDisposable.dispose(),this._bufferDisposable=t,this._increaseVersionId(),this._tokenizationTextModelPart.flush(),this._decorations=Object.create(null),this._decorationsTree=new P2,this._commandManager.clear(),this._trimAutoWhitespaceLines=null,this._emitContentChangedEvent(new Pu([new Cj],this._versionId,!1,!1),this._createContentChanged2(new L(1,1,s,r),0,n,this.getValue(),!1,!1,!0))}setEOL(e){this._assertNotDisposed();const t=e===1?`\\r\n`:`\n`;if(this._buffer.getEOL()===t)return;const i=this.getFullModelRange(),n=this.getValueLengthInRange(i),s=this.getLineCount(),r=this.getLineMaxColumn(s);this._onBeforeEOLChange(),this._buffer.setEOL(t),this._increaseVersionId(),this._onAfterEOLChange(),this._emitContentChangedEvent(new Pu([new yj],this._versionId,!1,!1),this._createContentChanged2(new L(1,1,s,r),0,n,this.getValue(),!1,!1,!1))}_onBeforeEOLChange(){this._decorationsTree.ensureAllNodesHaveRanges(this)}_onAfterEOLChange(){const e=this.getVersionId(),t=this._decorationsTree.collectNodesPostOrder();for(let i=0,n=t.length;i<n;i++){const s=t[i],r=s.range,a=s.cachedAbsoluteStart-s.start,l=this._buffer.getOffsetAt(r.startLineNumber,r.startColumn),c=this._buffer.getOffsetAt(r.endLineNumber,r.endColumn);s.cachedAbsoluteStart=l,s.cachedAbsoluteEnd=c,s.cachedVersionId=e,s.start=l-a,s.end=c-a,hc(s)}}onBeforeAttached(){this._attachedEditorCount++,this._attachedEditorCount===1&&(this._tokenizationTextModelPart.handleDidChangeAttached(),this._onDidChangeAttached.fire(void 0))}onBeforeDetached(){this._attachedEditorCount--,this._attachedEditorCount===0&&(this._tokenizationTextModelPart.handleDidChangeAttached(),this._onDidChangeAttached.fire(void 0))}isAttachedToEditor(){return this._attachedEditorCount>0}getAttachedEditorCount(){return this._attachedEditorCount}isTooLargeForSyncing(){return this._isTooLargeForSyncing}isTooLargeForTokenization(){return this._isTooLargeForTokenization}isDisposed(){return this._isDisposed}isDominatedByLongLines(){if(this._assertNotDisposed(),this.isTooLargeForTokenization())return!1;let e=0,t=0;const i=this._buffer.getLineCount();for(let n=1;n<=i;n++){const s=this._buffer.getLineLength(n);s>=aq?t+=s:e+=s}return t>e}get uri(){return this._associatedResource}getOptions(){return this._assertNotDisposed(),this._options}getFormattingOptions(){return{tabSize:this._options.indentSize,insertSpaces:this._options.insertSpaces}}updateOptions(e){this._assertNotDisposed();const t=typeof e.tabSize!=\"undefined\"?e.tabSize:this._options.tabSize,i=typeof e.indentSize!=\"undefined\"?e.indentSize:this._options.indentSize,n=typeof e.insertSpaces!=\"undefined\"?e.insertSpaces:this._options.insertSpaces,s=typeof e.trimAutoWhitespace!=\"undefined\"?e.trimAutoWhitespace:this._options.trimAutoWhitespace,r=typeof e.bracketColorizationOptions!=\"undefined\"?e.bracketColorizationOptions:this._options.bracketPairColorizationOptions,a=new n0({tabSize:t,indentSize:i,insertSpaces:n,defaultEOL:this._options.defaultEOL,trimAutoWhitespace:s,bracketPairColorizationOptions:r});if(this._options.equals(a))return;const l=this._options.createChangeEvent(a);this._options=a,this._bracketPairs.handleDidChangeOptions(l),this._decorationProvider.handleDidChangeOptions(l),this._onDidChangeOptions.fire(l)}detectIndentation(e,t){this._assertNotDisposed();const i=D2(this._buffer,t,e);this.updateOptions({insertSpaces:i.insertSpaces,tabSize:i.tabSize,indentSize:i.tabSize})}normalizeIndentation(e){return this._assertNotDisposed(),U0(e,this._options.indentSize,this._options.insertSpaces)}getVersionId(){return this._assertNotDisposed(),this._versionId}mightContainRTL(){return this._buffer.mightContainRTL()}mightContainUnusualLineTerminators(){return this._buffer.mightContainUnusualLineTerminators()}removeUnusualLineTerminators(e=null){const t=this.findMatches(ZO.source,!1,!0,!1,null,!1,1073741824);this._buffer.resetMightContainUnusualLineTerminators(),this.pushEditOperations(e,t.map(i=>({range:i.range,text:null})),()=>null)}mightContainNonBasicASCII(){return this._buffer.mightContainNonBasicASCII()}getAlternativeVersionId(){return this._assertNotDisposed(),this._alternativeVersionId}getInitialUndoRedoSnapshot(){return this._assertNotDisposed(),this._initialUndoRedoSnapshot}getOffsetAt(e){this._assertNotDisposed();const t=this._validatePosition(e.lineNumber,e.column,0);return this._buffer.getOffsetAt(t.lineNumber,t.column)}getPositionAt(e){this._assertNotDisposed();const t=Math.min(this._buffer.getLength(),Math.max(0,e));return this._buffer.getPositionAt(t)}_increaseVersionId(){this._versionId=this._versionId+1,this._alternativeVersionId=this._versionId}_overwriteVersionId(e){this._versionId=e}_overwriteAlternativeVersionId(e){this._alternativeVersionId=e}_overwriteInitialUndoRedoSnapshot(e){this._initialUndoRedoSnapshot=e}getValue(e,t=!1){this._assertNotDisposed();const i=this.getFullModelRange(),n=this.getValueInRange(i,e);return t?this._buffer.getBOM()+n:n}createSnapshot(e=!1){return new lq(this._buffer.createSnapshot(e))}getValueLength(e,t=!1){this._assertNotDisposed();const i=this.getFullModelRange(),n=this.getValueLengthInRange(i,e);return t?this._buffer.getBOM().length+n:n}getValueInRange(e,t=0){return this._assertNotDisposed(),this._buffer.getValueInRange(this.validateRange(e),t)}getValueLengthInRange(e,t=0){return this._assertNotDisposed(),this._buffer.getValueLengthInRange(this.validateRange(e),t)}getCharacterCountInRange(e,t=0){return this._assertNotDisposed(),this._buffer.getCharacterCountInRange(this.validateRange(e),t)}getLineCount(){return this._assertNotDisposed(),this._buffer.getLineCount()}getLineContent(e){if(this._assertNotDisposed(),e<1||e>this.getLineCount())throw new Error(\"Illegal value for lineNumber\");return this._buffer.getLineContent(e)}getLineLength(e){if(this._assertNotDisposed(),e<1||e>this.getLineCount())throw new Error(\"Illegal value for lineNumber\");return this._buffer.getLineLength(e)}getLinesContent(){return this._assertNotDisposed(),this._buffer.getLinesContent()}getEOL(){return this._assertNotDisposed(),this._buffer.getEOL()}getEndOfLineSequence(){return this._assertNotDisposed(),this._buffer.getEOL()===`\n`?0:1}getLineMinColumn(e){return this._assertNotDisposed(),1}getLineMaxColumn(e){if(this._assertNotDisposed(),e<1||e>this.getLineCount())throw new Error(\"Illegal value for lineNumber\");return this._buffer.getLineLength(e)+1}getLineFirstNonWhitespaceColumn(e){if(this._assertNotDisposed(),e<1||e>this.getLineCount())throw new Error(\"Illegal value for lineNumber\");return this._buffer.getLineFirstNonWhitespaceColumn(e)}getLineLastNonWhitespaceColumn(e){if(this._assertNotDisposed(),e<1||e>this.getLineCount())throw new Error(\"Illegal value for lineNumber\");return this._buffer.getLineLastNonWhitespaceColumn(e)}_validateRangeRelaxedNoAllocations(e){const t=this._buffer.getLineCount(),i=e.startLineNumber,n=e.startColumn;let s=Math.floor(typeof i==\"number\"&&!isNaN(i)?i:1),r=Math.floor(typeof n==\"number\"&&!isNaN(n)?n:1);if(s<1)s=1,r=1;else if(s>t)s=t,r=this.getLineMaxColumn(s);else if(r<=1)r=1;else{const h=this.getLineMaxColumn(s);r>=h&&(r=h)}const a=e.endLineNumber,l=e.endColumn;let c=Math.floor(typeof a==\"number\"&&!isNaN(a)?a:1),d=Math.floor(typeof l==\"number\"&&!isNaN(l)?l:1);if(c<1)c=1,d=1;else if(c>t)c=t,d=this.getLineMaxColumn(c);else if(d<=1)d=1;else{const h=this.getLineMaxColumn(c);d>=h&&(d=h)}return i===s&&n===r&&a===c&&l===d&&e instanceof L&&!(e instanceof oe)?e:new L(s,r,c,d)}_isValidPosition(e,t,i){if(typeof e!=\"number\"||typeof t!=\"number\"||isNaN(e)||isNaN(t)||e<1||t<1||(e|0)!==e||(t|0)!==t)return!1;const n=this._buffer.getLineCount();if(e>n)return!1;if(t===1)return!0;const s=this.getLineMaxColumn(e);if(t>s)return!1;if(i===1){const r=this._buffer.getLineCharCode(e,t-2);if(wi(r))return!1}return!0}_validatePosition(e,t,i){const n=Math.floor(typeof e==\"number\"&&!isNaN(e)?e:1),s=Math.floor(typeof t==\"number\"&&!isNaN(t)?t:1),r=this._buffer.getLineCount();if(n<1)return new B(1,1);if(n>r)return new B(r,this.getLineMaxColumn(r));if(s<=1)return new B(n,1);const a=this.getLineMaxColumn(n);if(s>=a)return new B(n,a);if(i===1){const l=this._buffer.getLineCharCode(n,s-2);if(wi(l))return new B(n,s-1)}return new B(n,s)}validatePosition(e){return this._assertNotDisposed(),e instanceof B&&this._isValidPosition(e.lineNumber,e.column,1)?e:this._validatePosition(e.lineNumber,e.column,1)}_isValidRange(e,t){const i=e.startLineNumber,n=e.startColumn,s=e.endLineNumber,r=e.endColumn;if(!this._isValidPosition(i,n,0)||!this._isValidPosition(s,r,0))return!1;if(t===1){const a=n>1?this._buffer.getLineCharCode(i,n-2):0,l=r>1&&r<=this._buffer.getLineLength(s)?this._buffer.getLineCharCode(s,r-2):0,c=wi(a),d=wi(l);return!c&&!d}return!0}validateRange(e){if(this._assertNotDisposed(),e instanceof L&&!(e instanceof oe)&&this._isValidRange(e,1))return e;const i=this._validatePosition(e.startLineNumber,e.startColumn,0),n=this._validatePosition(e.endLineNumber,e.endColumn,0),s=i.lineNumber,r=i.column,a=n.lineNumber,l=n.column;{const c=r>1?this._buffer.getLineCharCode(s,r-2):0,d=l>1&&l<=this._buffer.getLineLength(a)?this._buffer.getLineCharCode(a,l-2):0,h=wi(c),u=wi(d);return!h&&!u?new L(s,r,a,l):s===a&&r===l?new L(s,r-1,a,l-1):h&&u?new L(s,r-1,a,l+1):h?new L(s,r-1,a,l):new L(s,r,a,l+1)}}modifyPosition(e,t){this._assertNotDisposed();const i=this.getOffsetAt(e)+t;return this.getPositionAt(Math.min(this._buffer.getLength(),Math.max(0,i)))}getFullModelRange(){this._assertNotDisposed();const e=this.getLineCount();return new L(1,1,e,this.getLineMaxColumn(e))}findMatchesLineByLine(e,t,i,n){return this._buffer.findMatchesLineByLine(e,t,i,n)}findMatches(e,t,i,n,s,r,a=rq){this._assertNotDisposed();let l=null;t!==null&&(Array.isArray(t)||(t=[t]),t.every(h=>L.isIRange(h))&&(l=t.map(h=>this.validateRange(h)))),l===null&&(l=[this.getFullModelRange()]),l=l.sort((h,u)=>h.startLineNumber-u.startLineNumber||h.startColumn-u.startColumn);const c=[];c.push(l.reduce((h,u)=>L.areIntersecting(h,u)?h.plusRange(u):(c.push(h),u)));let d;if(!i&&e.indexOf(`\n`)<0){const u=new jc(e,i,n,s).parseSearchRequest();if(!u)return[];d=g=>this.findMatchesLineByLine(g,u,r,a)}else d=h=>ib.findMatches(this,new jc(e,i,n,s),h,r,a);return c.map(d).reduce((h,u)=>h.concat(u),[])}findNextMatch(e,t,i,n,s,r){this._assertNotDisposed();const a=this.validatePosition(t);if(!i&&e.indexOf(`\n`)<0){const c=new jc(e,i,n,s).parseSearchRequest();if(!c)return null;const d=this.getLineCount();let h=new L(a.lineNumber,a.column,d,this.getLineMaxColumn(d)),u=this.findMatchesLineByLine(h,c,r,1);return ib.findNextMatch(this,new jc(e,i,n,s),a,r),u.length>0||(h=new L(1,1,a.lineNumber,this.getLineMaxColumn(a.lineNumber)),u=this.findMatchesLineByLine(h,c,r,1),u.length>0)?u[0]:null}return ib.findNextMatch(this,new jc(e,i,n,s),a,r)}findPreviousMatch(e,t,i,n,s,r){this._assertNotDisposed();const a=this.validatePosition(t);return ib.findPreviousMatch(this,new jc(e,i,n,s),a,r)}pushStackElement(){this._commandManager.pushStackElement()}popStackElement(){this._commandManager.popStackElement()}pushEOL(e){if((this.getEOL()===`\n`?0:1)!==e)try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit(),this._initialUndoRedoSnapshot===null&&(this._initialUndoRedoSnapshot=this._undoRedoService.createSnapshot(this.uri)),this._commandManager.pushEOL(e)}finally{this._eventEmitter.endDeferredEmit(),this._onDidChangeDecorations.endDeferredEmit()}}_validateEditOperation(e){return e instanceof Ww?e:new Ww(e.identifier||null,this.validateRange(e.range),e.text,e.forceMoveMarkers||!1,e.isAutoWhitespaceEdit||!1,e._isTracked||!1)}_validateEditOperations(e){const t=[];for(let i=0,n=e.length;i<n;i++)t[i]=this._validateEditOperation(e[i]);return t}pushEditOperations(e,t,i){try{return this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit(),this._pushEditOperations(e,this._validateEditOperations(t),i)}finally{this._eventEmitter.endDeferredEmit(),this._onDidChangeDecorations.endDeferredEmit()}}_pushEditOperations(e,t,i){if(this._options.trimAutoWhitespace&&this._trimAutoWhitespaceLines){const n=t.map(r=>({range:this.validateRange(r.range),text:r.text}));let s=!0;if(e)for(let r=0,a=e.length;r<a;r++){const l=e[r];let c=!1;for(let d=0,h=n.length;d<h;d++){const u=n[d].range,g=u.startLineNumber>l.endLineNumber,f=l.startLineNumber>u.endLineNumber;if(!g&&!f){c=!0;break}}if(!c){s=!1;break}}if(s)for(let r=0,a=this._trimAutoWhitespaceLines.length;r<a;r++){const l=this._trimAutoWhitespaceLines[r],c=this.getLineMaxColumn(l);let d=!0;for(let h=0,u=n.length;h<u;h++){const g=n[h].range,f=n[h].text;if(!(l<g.startLineNumber||l>g.endLineNumber)&&!(l===g.startLineNumber&&g.startColumn===c&&g.isEmpty()&&f&&f.length>0&&f.charAt(0)===`\n`)&&!(l===g.startLineNumber&&g.startColumn===1&&g.isEmpty()&&f&&f.length>0&&f.charAt(f.length-1)===`\n`)){d=!1;break}}if(d){const h=new L(l,1,l,c);t.push(new Ww(null,h,null,!1,!1,!1))}}this._trimAutoWhitespaceLines=null}return this._initialUndoRedoSnapshot===null&&(this._initialUndoRedoSnapshot=this._undoRedoService.createSnapshot(this.uri)),this._commandManager.pushEditOperation(e,t,i)}_applyUndo(e,t,i,n){const s=e.map(r=>{const a=this.getPositionAt(r.newPosition),l=this.getPositionAt(r.newEnd);return{range:new L(a.lineNumber,a.column,l.lineNumber,l.column),text:r.oldText}});this._applyUndoRedoEdits(s,t,!0,!1,i,n)}_applyRedo(e,t,i,n){const s=e.map(r=>{const a=this.getPositionAt(r.oldPosition),l=this.getPositionAt(r.oldEnd);return{range:new L(a.lineNumber,a.column,l.lineNumber,l.column),text:r.newText}});this._applyUndoRedoEdits(s,t,!1,!0,i,n)}_applyUndoRedoEdits(e,t,i,n,s,r){try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit(),this._isUndoing=i,this._isRedoing=n,this.applyEdits(e,!1),this.setEOL(t),this._overwriteAlternativeVersionId(s)}finally{this._isUndoing=!1,this._isRedoing=!1,this._eventEmitter.endDeferredEmit(r),this._onDidChangeDecorations.endDeferredEmit()}}applyEdits(e,t=!1){try{this._onDidChangeDecorations.beginDeferredEmit(),this._eventEmitter.beginDeferredEmit();const i=this._validateEditOperations(e);return this._doApplyEdits(i,t)}finally{this._eventEmitter.endDeferredEmit(),this._onDidChangeDecorations.endDeferredEmit()}}_doApplyEdits(e,t){const i=this._buffer.getLineCount(),n=this._buffer.applyEdits(e,this._options.trimAutoWhitespace,t),s=this._buffer.getLineCount(),r=n.changes;if(this._trimAutoWhitespaceLines=n.trimAutoWhitespaceLineNumbers,r.length!==0){for(let c=0,d=r.length;c<d;c++){const h=r[c],[u,g,f]=Ud(h.text);this._tokenizationTextModelPart.acceptEdit(h.range,h.text,u,g,f),this._decorationsTree.acceptReplace(h.rangeOffset,h.rangeLength,h.text.length,h.forceMoveMarkers)}const a=[];this._increaseVersionId();let l=i;for(let c=0,d=r.length;c<d;c++){const h=r[c],[u]=Ud(h.text);this._onDidChangeDecorations.fire();const g=h.range.startLineNumber,f=h.range.endLineNumber,_=f-g,b=u,v=Math.min(_,b),C=b-_,w=s-l-C+g,S=w,k=w+b,x=this._decorationsTree.getInjectedTextInInterval(this,this.getOffsetAt(new B(S,1)),this.getOffsetAt(new B(k,this.getLineMaxColumn(k))),0),y=Yo.fromDecorations(x),D=new Ap(y);for(let I=v;I>=0;I--){const R=g+I,P=w+I;D.takeFromEndWhile($=>$.lineNumber>P);const H=D.takeFromEndWhile($=>$.lineNumber===P);a.push(new m2(R,this.getLineContent(P),H))}if(v<_){const I=g+v;a.push(new wj(I+1,f))}if(v<b){const I=new Ap(y),R=g+v,P=b-v,H=s-l-P+R+1,$=[],ne=[];for(let ae=0;ae<P;ae++){const de=H+ae;ne[ae]=this.getLineContent(de),I.takeWhile(we=>we.lineNumber<de),$[ae]=I.takeWhile(we=>we.lineNumber===de)}a.push(new Sj(R+1,g+b,ne,$))}l+=C}this._emitContentChangedEvent(new Pu(a,this.getVersionId(),this._isUndoing,this._isRedoing),{changes:r,eol:this._buffer.getEOL(),versionId:this.getVersionId(),isUndoing:this._isUndoing,isRedoing:this._isRedoing,isFlush:!1})}return n.reverseEdits===null?void 0:n.reverseEdits}undo(){return this._undoRedoService.undo(this.uri)}canUndo(){return this._undoRedoService.canUndo(this.uri)}redo(){return this._undoRedoService.redo(this.uri)}canRedo(){return this._undoRedoService.canRedo(this.uri)}handleBeforeFireDecorationsChangedEvent(e){if(e===null||e.size===0)return;const i=Array.from(e).map(n=>new m2(n,this.getLineContent(n),this._getInjectedTextInLine(n)));this._onDidChangeInjectedText.fire(new N4(i))}changeDecorations(e,t=0){this._assertNotDisposed();try{return this._onDidChangeDecorations.beginDeferredEmit(),this._changeDecorations(t,e)}finally{this._onDidChangeDecorations.endDeferredEmit()}}_changeDecorations(e,t){const i={addDecoration:(s,r)=>this._deltaDecorationsImpl(e,[],[{range:s,options:r}])[0],changeDecoration:(s,r)=>{this._changeDecorationImpl(s,r)},changeDecorationOptions:(s,r)=>{this._changeDecorationOptionsImpl(s,B2(r))},removeDecoration:s=>{this._deltaDecorationsImpl(e,[s],[])},deltaDecorations:(s,r)=>s.length===0&&r.length===0?[]:this._deltaDecorationsImpl(e,s,r)};let n=null;try{n=t(i)}catch(s){Ee(s)}return i.addDecoration=mf,i.changeDecoration=mf,i.changeDecorationOptions=mf,i.removeDecoration=mf,i.deltaDecorations=mf,n}deltaDecorations(e,t,i=0){if(this._assertNotDisposed(),e||(e=[]),e.length===0&&t.length===0)return[];try{return this._deltaDecorationCallCnt++,this._deltaDecorationCallCnt>1&&(console.warn(\"Invoking deltaDecorations recursively could lead to leaking decorations.\"),Ee(new Error(\"Invoking deltaDecorations recursively could lead to leaking decorations.\"))),this._onDidChangeDecorations.beginDeferredEmit(),this._deltaDecorationsImpl(i,e,t)}finally{this._onDidChangeDecorations.endDeferredEmit(),this._deltaDecorationCallCnt--}}_getTrackedRange(e){return this.getDecorationRange(e)}_setTrackedRange(e,t,i){const n=e?this._decorations[e]:null;if(!n)return t?this._deltaDecorationsImpl(0,[],[{range:t,options:F2[i]}])[0]:null;if(!t)return this._decorationsTree.delete(n),delete this._decorations[n.id],null;const s=this._validateRangeRelaxedNoAllocations(t),r=this._buffer.getOffsetAt(s.startLineNumber,s.startColumn),a=this._buffer.getOffsetAt(s.endLineNumber,s.endColumn);return this._decorationsTree.delete(n),n.reset(this.getVersionId(),r,a,s),n.setOptions(F2[i]),this._decorationsTree.insert(n),n.id}removeAllDecorationsWithOwnerId(e){if(this._isDisposed)return;const t=this._decorationsTree.collectNodesFromOwner(e);for(let i=0,n=t.length;i<n;i++){const s=t[i];this._decorationsTree.delete(s),delete this._decorations[s.id]}}getDecorationOptions(e){const t=this._decorations[e];return t?t.options:null}getDecorationRange(e){const t=this._decorations[e];return t?this._decorationsTree.getNodeRange(this,t):null}getLineDecorations(e,t=0,i=!1){return e<1||e>this.getLineCount()?[]:this.getLinesDecorations(e,e,t,i)}getLinesDecorations(e,t,i=0,n=!1){const s=this.getLineCount(),r=Math.min(s,Math.max(1,e)),a=Math.min(s,Math.max(1,t)),l=this.getLineMaxColumn(a),c=new L(r,1,a,l),d=this._getDecorationsInRange(c,i,n);return vT(d,this._decorationProvider.getDecorationsInRange(c,i,n)),d}getDecorationsInRange(e,t=0,i=!1){const n=this.validateRange(e),s=this._getDecorationsInRange(n,t,i);return vT(s,this._decorationProvider.getDecorationsInRange(n,t,i)),s}getOverviewRulerDecorations(e=0,t=!1){return this._decorationsTree.getAll(this,e,t,!0)}getInjectedTextDecorations(e=0){return this._decorationsTree.getAllInjectedText(this,e)}_getInjectedTextInLine(e){const t=this._buffer.getOffsetAt(e,1),i=t+this._buffer.getLineLength(e),n=this._decorationsTree.getInjectedTextInInterval(this,t,i,0);return Yo.fromDecorations(n).filter(s=>s.lineNumber===e)}getAllDecorations(e=0,t=!1){let i=this._decorationsTree.getAll(this,e,t,!1);return i=i.concat(this._decorationProvider.getAllDecorations(e,t)),i}_getDecorationsInRange(e,t,i){const n=this._buffer.getOffsetAt(e.startLineNumber,e.startColumn),s=this._buffer.getOffsetAt(e.endLineNumber,e.endColumn);return this._decorationsTree.getAllInInterval(this,n,s,t,i)}getRangeAt(e,t){return this._buffer.getRangeAt(e,t-e)}_changeDecorationImpl(e,t){const i=this._decorations[e];if(!i)return;if(i.options.after){const a=this.getDecorationRange(e);this._onDidChangeDecorations.recordLineAffectedByInjectedText(a.endLineNumber)}if(i.options.before){const a=this.getDecorationRange(e);this._onDidChangeDecorations.recordLineAffectedByInjectedText(a.startLineNumber)}const n=this._validateRangeRelaxedNoAllocations(t),s=this._buffer.getOffsetAt(n.startLineNumber,n.startColumn),r=this._buffer.getOffsetAt(n.endLineNumber,n.endColumn);this._decorationsTree.delete(i),i.reset(this.getVersionId(),s,r,n),this._decorationsTree.insert(i),this._onDidChangeDecorations.checkAffectedAndFire(i.options),i.options.after&&this._onDidChangeDecorations.recordLineAffectedByInjectedText(n.endLineNumber),i.options.before&&this._onDidChangeDecorations.recordLineAffectedByInjectedText(n.startLineNumber)}_changeDecorationOptionsImpl(e,t){const i=this._decorations[e];if(!i)return;const n=!!(i.options.overviewRuler&&i.options.overviewRuler.color),s=!!(t.overviewRuler&&t.overviewRuler.color);if(this._onDidChangeDecorations.checkAffectedAndFire(i.options),this._onDidChangeDecorations.checkAffectedAndFire(t),i.options.after||t.after){const r=this._decorationsTree.getNodeRange(this,i);this._onDidChangeDecorations.recordLineAffectedByInjectedText(r.endLineNumber)}if(i.options.before||t.before){const r=this._decorationsTree.getNodeRange(this,i);this._onDidChangeDecorations.recordLineAffectedByInjectedText(r.startLineNumber)}n!==s?(this._decorationsTree.delete(i),i.setOptions(t),this._decorationsTree.insert(i)):i.setOptions(t)}_deltaDecorationsImpl(e,t,i){const n=this.getVersionId(),s=t.length;let r=0;const a=i.length;let l=0;const c=new Array(a);for(;r<s||l<a;){let d=null;if(r<s){do d=this._decorations[t[r++]];while(!d&&r<s);if(d){if(d.options.after){const h=this._decorationsTree.getNodeRange(this,d);this._onDidChangeDecorations.recordLineAffectedByInjectedText(h.endLineNumber)}if(d.options.before){const h=this._decorationsTree.getNodeRange(this,d);this._onDidChangeDecorations.recordLineAffectedByInjectedText(h.startLineNumber)}this._decorationsTree.delete(d),this._onDidChangeDecorations.checkAffectedAndFire(d.options)}}if(l<a){if(!d){const b=++this._lastDecorationId,v=`${this._instanceId};${b}`;d=new j4(v,0,0),this._decorations[v]=d}const h=i[l],u=this._validateRangeRelaxedNoAllocations(h.range),g=B2(h.options),f=this._buffer.getOffsetAt(u.startLineNumber,u.startColumn),_=this._buffer.getOffsetAt(u.endLineNumber,u.endColumn);d.ownerId=e,d.reset(n,f,_,u),d.setOptions(g),d.options.after&&this._onDidChangeDecorations.recordLineAffectedByInjectedText(u.endLineNumber),d.options.before&&this._onDidChangeDecorations.recordLineAffectedByInjectedText(u.startLineNumber),this._onDidChangeDecorations.checkAffectedAndFire(g),this._decorationsTree.insert(d),c[l]=d.id,l++}else d&&delete this._decorations[d.id]}return c}getLanguageId(){return this.tokenization.getLanguageId()}setMode(e){this.tokenization.setLanguageId(e)}getLanguageIdAtPosition(e,t){return this.tokenization.getLanguageIdAtPosition(e,t)}getWordAtPosition(e){return this._tokenizationTextModelPart.getWordAtPosition(e)}getWordUntilPosition(e){return this._tokenizationTextModelPart.getWordUntilPosition(e)}normalizePosition(e,t){return e}getLineIndentColumn(e){return cq(this.getLineContent(e))+1}};il.MODEL_SYNC_LIMIT=50*1024*1024;il.LARGE_FILE_SIZE_THRESHOLD=20*1024*1024;il.LARGE_FILE_LINE_COUNT_THRESHOLD=300*1e3;il.DEFAULT_CREATION_OPTIONS={isForSimpleWidget:!1,tabSize:Xi.tabSize,indentSize:Xi.indentSize,insertSpaces:Xi.insertSpaces,detectIndentation:!1,defaultEOL:1,trimAutoWhitespace:Xi.trimAutoWhitespace,largeFileOptimizations:Xi.largeFileOptimizations,bracketPairColorizationOptions:Xi.bracketPairColorizationOptions};il=nq([Gw(4,l1),Gw(5,Ht),Gw(6,ti)],il);function cq(o){let e=0;for(const t of o)if(t===\" \"||t===\"\t\")e++;else break;return e}function Zw(o){return!!(o.options.overviewRuler&&o.options.overviewRuler.color)}function Yw(o){return!!o.options.after||!!o.options.before}class P2{constructor(){this._decorationsTree0=new $w,this._decorationsTree1=new $w,this._injectedTextDecorationsTree=new $w}ensureAllNodesHaveRanges(e){this.getAll(e,0,!1,!1)}_ensureNodesHaveRanges(e,t){for(const i of t)i.range===null&&(i.range=e.getRangeAt(i.cachedAbsoluteStart,i.cachedAbsoluteEnd));return t}getAllInInterval(e,t,i,n,s){const r=e.getVersionId(),a=this._intervalSearch(t,i,n,s,r);return this._ensureNodesHaveRanges(e,a)}_intervalSearch(e,t,i,n,s){const r=this._decorationsTree0.intervalSearch(e,t,i,n,s),a=this._decorationsTree1.intervalSearch(e,t,i,n,s),l=this._injectedTextDecorationsTree.intervalSearch(e,t,i,n,s);return r.concat(a).concat(l)}getInjectedTextInInterval(e,t,i,n){const s=e.getVersionId(),r=this._injectedTextDecorationsTree.intervalSearch(t,i,n,!1,s);return this._ensureNodesHaveRanges(e,r).filter(a=>a.options.showIfCollapsed||!a.range.isEmpty())}getAllInjectedText(e,t){const i=e.getVersionId(),n=this._injectedTextDecorationsTree.search(t,!1,i);return this._ensureNodesHaveRanges(e,n).filter(s=>s.options.showIfCollapsed||!s.range.isEmpty())}getAll(e,t,i,n){const s=e.getVersionId(),r=this._search(t,i,n,s);return this._ensureNodesHaveRanges(e,r)}_search(e,t,i,n){if(i)return this._decorationsTree1.search(e,t,n);{const s=this._decorationsTree0.search(e,t,n),r=this._decorationsTree1.search(e,t,n),a=this._injectedTextDecorationsTree.search(e,t,n);return s.concat(r).concat(a)}}collectNodesFromOwner(e){const t=this._decorationsTree0.collectNodesFromOwner(e),i=this._decorationsTree1.collectNodesFromOwner(e),n=this._injectedTextDecorationsTree.collectNodesFromOwner(e);return t.concat(i).concat(n)}collectNodesPostOrder(){const e=this._decorationsTree0.collectNodesPostOrder(),t=this._decorationsTree1.collectNodesPostOrder(),i=this._injectedTextDecorationsTree.collectNodesPostOrder();return e.concat(t).concat(i)}insert(e){Yw(e)?this._injectedTextDecorationsTree.insert(e):Zw(e)?this._decorationsTree1.insert(e):this._decorationsTree0.insert(e)}delete(e){Yw(e)?this._injectedTextDecorationsTree.delete(e):Zw(e)?this._decorationsTree1.delete(e):this._decorationsTree0.delete(e)}getNodeRange(e,t){const i=e.getVersionId();return t.cachedVersionId!==i&&this._resolveNode(t,i),t.range===null&&(t.range=e.getRangeAt(t.cachedAbsoluteStart,t.cachedAbsoluteEnd)),t.range}_resolveNode(e,t){Yw(e)?this._injectedTextDecorationsTree.resolveNode(e,t):Zw(e)?this._decorationsTree1.resolveNode(e,t):this._decorationsTree0.resolveNode(e,t)}acceptReplace(e,t,i,n){this._decorationsTree0.acceptReplace(e,t,i,n),this._decorationsTree1.acceptReplace(e,t,i,n),this._injectedTextDecorationsTree.acceptReplace(e,t,i,n)}}function ca(o){return o.replace(/[^a-z0-9\\-_]/gi,\" \")}class Q4{constructor(e){this.color=e.color||\"\",this.darkColor=e.darkColor||\"\"}}class dq extends Q4{constructor(e){super(e),this._resolvedColor=null,this.position=typeof e.position==\"number\"?e.position:vo.Center}getColor(e){return this._resolvedColor||(e.type!==\"light\"&&this.darkColor?this._resolvedColor=this._resolveColor(this.darkColor,e):this._resolvedColor=this._resolveColor(this.color,e)),this._resolvedColor}invalidateCachedColor(){this._resolvedColor=null}_resolveColor(e,t){if(typeof e==\"string\")return e;const i=e?t.getColor(e.id):null;return i?i.toString():\"\"}}class hq extends Q4{constructor(e){super(e),this.position=e.position}getColor(e){return this._resolvedColor||(e.type!==\"light\"&&this.darkColor?this._resolvedColor=this._resolveColor(this.darkColor,e):this._resolvedColor=this._resolveColor(this.color,e)),this._resolvedColor}invalidateCachedColor(){this._resolvedColor=void 0}_resolveColor(e,t){return typeof e==\"string\"?W.fromHex(e):t.getColor(e.id)}}class $d{constructor(e){this.content=e.content||\"\",this.inlineClassName=e.inlineClassName||null,this.inlineClassNameAffectsLetterSpacing=e.inlineClassNameAffectsLetterSpacing||!1,this.attachedData=e.attachedData||null,this.cursorStops=e.cursorStops||null}static from(e){return e instanceof $d?e:new $d(e)}}class Ie{constructor(e){var t,i;this.description=e.description,this.blockClassName=e.blockClassName?ca(e.blockClassName):null,this.stickiness=e.stickiness||0,this.zIndex=e.zIndex||0,this.className=e.className?ca(e.className):null,this.hoverMessage=e.hoverMessage||null,this.glyphMarginHoverMessage=e.glyphMarginHoverMessage||null,this.isWholeLine=e.isWholeLine||!1,this.showIfCollapsed=e.showIfCollapsed||!1,this.collapseOnReplaceEdit=e.collapseOnReplaceEdit||!1,this.overviewRuler=e.overviewRuler?new dq(e.overviewRuler):null,this.minimap=e.minimap?new hq(e.minimap):null,this.glyphMarginClassName=e.glyphMarginClassName?ca(e.glyphMarginClassName):null,this.linesDecorationsClassName=e.linesDecorationsClassName?ca(e.linesDecorationsClassName):null,this.firstLineDecorationClassName=e.firstLineDecorationClassName?ca(e.firstLineDecorationClassName):null,this.marginClassName=e.marginClassName?ca(e.marginClassName):null,this.inlineClassName=e.inlineClassName?ca(e.inlineClassName):null,this.inlineClassNameAffectsLetterSpacing=e.inlineClassNameAffectsLetterSpacing||!1,this.beforeContentClassName=e.beforeContentClassName?ca(e.beforeContentClassName):null,this.afterContentClassName=e.afterContentClassName?ca(e.afterContentClassName):null,this.after=e.after?$d.from(e.after):null,this.before=e.before?$d.from(e.before):null,this.hideInCommentTokens=(t=e.hideInCommentTokens)!==null&&t!==void 0?t:!1,this.hideInStringTokens=(i=e.hideInStringTokens)!==null&&i!==void 0?i:!1}static register(e){return new Ie(e)}static createDynamic(e){return new Ie(e)}}Ie.EMPTY=Ie.register({description:\"empty\"});const F2=[Ie.register({description:\"tracked-range-always-grows-when-typing-at-edges\",stickiness:0}),Ie.register({description:\"tracked-range-never-grows-when-typing-at-edges\",stickiness:1}),Ie.register({description:\"tracked-range-grows-only-when-typing-before\",stickiness:2}),Ie.register({description:\"tracked-range-grows-only-when-typing-after\",stickiness:3})];function B2(o){return o instanceof Ie?o:Ie.createDynamic(o)}class uq extends z{constructor(e){super(),this.handleBeforeFire=e,this._actual=this._register(new O),this.event=this._actual.event,this._affectedInjectedTextLines=null,this._deferredCnt=0,this._shouldFire=!1,this._affectsMinimap=!1,this._affectsOverviewRuler=!1}beginDeferredEmit(){this._deferredCnt++}endDeferredEmit(){var e;if(this._deferredCnt--,this._deferredCnt===0){if(this._shouldFire){this.handleBeforeFire(this._affectedInjectedTextLines);const t={affectsMinimap:this._affectsMinimap,affectsOverviewRuler:this._affectsOverviewRuler};this._shouldFire=!1,this._affectsMinimap=!1,this._affectsOverviewRuler=!1,this._actual.fire(t)}(e=this._affectedInjectedTextLines)===null||e===void 0||e.clear(),this._affectedInjectedTextLines=null}}recordLineAffectedByInjectedText(e){this._affectedInjectedTextLines||(this._affectedInjectedTextLines=new Set),this._affectedInjectedTextLines.add(e)}checkAffectedAndFire(e){this._affectsMinimap||(this._affectsMinimap=!!(e.minimap&&e.minimap.position)),this._affectsOverviewRuler||(this._affectsOverviewRuler=!!(e.overviewRuler&&e.overviewRuler.color)),this._shouldFire=!0}fire(){this._affectsMinimap=!0,this._affectsOverviewRuler=!0,this._shouldFire=!0}}class gq extends z{constructor(){super(),this._fastEmitter=this._register(new O),this.fastEvent=this._fastEmitter.event,this._slowEmitter=this._register(new O),this.slowEvent=this._slowEmitter.event,this._deferredCnt=0,this._deferredEvent=null}beginDeferredEmit(){this._deferredCnt++}endDeferredEmit(e=null){if(this._deferredCnt--,this._deferredCnt===0&&this._deferredEvent!==null){this._deferredEvent.rawContentChangedEvent.resultingSelection=e;const t=this._deferredEvent;this._deferredEvent=null,this._fastEmitter.fire(t),this._slowEmitter.fire(t)}}fire(e){if(this._deferredCnt>0){this._deferredEvent?this._deferredEvent=this._deferredEvent.merge(e):this._deferredEvent=e;return}this._fastEmitter.fire(e),this._slowEmitter.fire(e)}}var fq=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const W2={getInitialState:()=>Jp,tokenizeEncoded:(o,e,t)=>jI(0,t)};function pq(o,e,t){return fq(this,void 0,void 0,function*(){if(!t)return V2(e,o.languageIdCodec,W2);const i=yield Jt.getOrCreate(t);return V2(e,o.languageIdCodec,i||W2)})}function mq(o,e,t,i,n,s,r){let a=\"<div>\",l=i,c=0,d=!0;for(let h=0,u=e.getCount();h<u;h++){const g=e.getEndOffset(h);if(g<=i)continue;let f=\"\";for(;l<g&&l<n;l++){const _=o.charCodeAt(l);switch(_){case 9:{let b=s-(l+c)%s;for(c+=b-1;b>0;)r&&d?(f+=\"&#160;\",d=!1):(f+=\" \",d=!0),b--;break}case 60:f+=\"&lt;\",d=!1;break;case 62:f+=\"&gt;\",d=!1;break;case 38:f+=\"&amp;\",d=!1;break;case 0:f+=\"&#00;\",d=!1;break;case 65279:case 8232:case 8233:case 133:f+=\"\\uFFFD\",d=!1;break;case 13:f+=\"&#8203\",d=!1;break;case 32:r&&d?(f+=\"&#160;\",d=!1):(f+=\" \",d=!0);break;default:f+=String.fromCharCode(_),d=!1}}if(a+=`<span style=\"${e.getInlineStyle(h,t)}\">${f}</span>`,g>n||l>=n)break}return a+=\"</div>\",a}function V2(o,e,t){let i='<div class=\"monaco-tokenized-source\">';const n=Ur(o);let s=t.getInitialState();for(let r=0,a=n.length;r<a;r++){const l=n[r];r>0&&(i+=\"<br/>\");const c=t.tokenizeEncoded(l,!0,s);Si.convertToEndOffset(c.tokens,l.length);const h=new Si(c.tokens,l,e).inflate();let u=0;for(let g=0,f=h.getCount();g<f;g++){const _=h.getClassName(g),b=h.getEndOffset(g);i+=`<span class=\"${_}\">${Hx(l.substring(u,b))}</span>`,u=b}s=c.endState}return i+=\"</div>\",i}class _q{constructor(){this._hasPending=!1,this._inserts=[],this._changes=[],this._removes=[]}insert(e){this._hasPending=!0,this._inserts.push(e)}change(e){this._hasPending=!0,this._changes.push(e)}remove(e){this._hasPending=!0,this._removes.push(e)}mustCommit(){return this._hasPending}commit(e){if(!this._hasPending)return;const t=this._inserts,i=this._changes,n=this._removes;this._hasPending=!1,this._inserts=[],this._changes=[],this._removes=[],e._commitPendingChanges(t,i,n)}}class bq{constructor(e,t,i,n,s){this.id=e,this.afterLineNumber=t,this.ordinal=i,this.height=n,this.minWidth=s,this.prefixSum=0}}class em{constructor(e,t,i,n){this._instanceId=XO(++em.INSTANCE_COUNT),this._pendingChanges=new _q,this._lastWhitespaceId=0,this._arr=[],this._prefixSumValidIndex=-1,this._minWidth=-1,this._lineCount=e,this._lineHeight=t,this._paddingTop=i,this._paddingBottom=n}static findInsertionIndex(e,t,i){let n=0,s=e.length;for(;n<s;){const r=n+s>>>1;t===e[r].afterLineNumber?i<e[r].ordinal?s=r:n=r+1:t<e[r].afterLineNumber?s=r:n=r+1}return n}setLineHeight(e){this._checkPendingChanges(),this._lineHeight=e}setPadding(e,t){this._paddingTop=e,this._paddingBottom=t}onFlushed(e){this._checkPendingChanges(),this._lineCount=e}changeWhitespace(e){let t=!1;try{e({insertWhitespace:(n,s,r,a)=>{t=!0,n=n|0,s=s|0,r=r|0,a=a|0;const l=this._instanceId+ ++this._lastWhitespaceId;return this._pendingChanges.insert(new bq(l,n,s,r,a)),l},changeOneWhitespace:(n,s,r)=>{t=!0,s=s|0,r=r|0,this._pendingChanges.change({id:n,newAfterLineNumber:s,newHeight:r})},removeWhitespace:n=>{t=!0,this._pendingChanges.remove({id:n})}})}finally{this._pendingChanges.commit(this)}return t}_commitPendingChanges(e,t,i){if((e.length>0||i.length>0)&&(this._minWidth=-1),e.length+t.length+i.length<=1){for(const l of e)this._insertWhitespace(l);for(const l of t)this._changeOneWhitespace(l.id,l.newAfterLineNumber,l.newHeight);for(const l of i){const c=this._findWhitespaceIndex(l.id);c!==-1&&this._removeWhitespace(c)}return}const n=new Set;for(const l of i)n.add(l.id);const s=new Map;for(const l of t)s.set(l.id,l);const r=l=>{const c=[];for(const d of l)if(!n.has(d.id)){if(s.has(d.id)){const h=s.get(d.id);d.afterLineNumber=h.newAfterLineNumber,d.height=h.newHeight}c.push(d)}return c},a=r(this._arr).concat(r(e));a.sort((l,c)=>l.afterLineNumber===c.afterLineNumber?l.ordinal-c.ordinal:l.afterLineNumber-c.afterLineNumber),this._arr=a,this._prefixSumValidIndex=-1}_checkPendingChanges(){this._pendingChanges.mustCommit()&&this._pendingChanges.commit(this)}_insertWhitespace(e){const t=em.findInsertionIndex(this._arr,e.afterLineNumber,e.ordinal);this._arr.splice(t,0,e),this._prefixSumValidIndex=Math.min(this._prefixSumValidIndex,t-1)}_findWhitespaceIndex(e){const t=this._arr;for(let i=0,n=t.length;i<n;i++)if(t[i].id===e)return i;return-1}_changeOneWhitespace(e,t,i){const n=this._findWhitespaceIndex(e);if(n!==-1&&(this._arr[n].height!==i&&(this._arr[n].height=i,this._prefixSumValidIndex=Math.min(this._prefixSumValidIndex,n-1)),this._arr[n].afterLineNumber!==t)){const s=this._arr[n];this._removeWhitespace(n),s.afterLineNumber=t,this._insertWhitespace(s)}}_removeWhitespace(e){this._arr.splice(e,1),this._prefixSumValidIndex=Math.min(this._prefixSumValidIndex,e-1)}onLinesDeleted(e,t){this._checkPendingChanges(),e=e|0,t=t|0,this._lineCount-=t-e+1;for(let i=0,n=this._arr.length;i<n;i++){const s=this._arr[i].afterLineNumber;e<=s&&s<=t?this._arr[i].afterLineNumber=e-1:s>t&&(this._arr[i].afterLineNumber-=t-e+1)}}onLinesInserted(e,t){this._checkPendingChanges(),e=e|0,t=t|0,this._lineCount+=t-e+1;for(let i=0,n=this._arr.length;i<n;i++){const s=this._arr[i].afterLineNumber;e<=s&&(this._arr[i].afterLineNumber+=t-e+1)}}getWhitespacesTotalHeight(){return this._checkPendingChanges(),this._arr.length===0?0:this.getWhitespacesAccumulatedHeight(this._arr.length-1)}getWhitespacesAccumulatedHeight(e){this._checkPendingChanges(),e=e|0;let t=Math.max(0,this._prefixSumValidIndex+1);t===0&&(this._arr[0].prefixSum=this._arr[0].height,t++);for(let i=t;i<=e;i++)this._arr[i].prefixSum=this._arr[i-1].prefixSum+this._arr[i].height;return this._prefixSumValidIndex=Math.max(this._prefixSumValidIndex,e),this._arr[e].prefixSum}getLinesTotalHeight(){this._checkPendingChanges();const e=this._lineHeight*this._lineCount,t=this.getWhitespacesTotalHeight();return e+t+this._paddingTop+this._paddingBottom}getWhitespaceAccumulatedHeightBeforeLineNumber(e){this._checkPendingChanges(),e=e|0;const t=this._findLastWhitespaceBeforeLineNumber(e);return t===-1?0:this.getWhitespacesAccumulatedHeight(t)}_findLastWhitespaceBeforeLineNumber(e){e=e|0;const t=this._arr;let i=0,n=t.length-1;for(;i<=n;){const r=(n-i|0)/2|0,a=i+r|0;if(t[a].afterLineNumber<e){if(a+1>=t.length||t[a+1].afterLineNumber>=e)return a;i=a+1|0}else n=a-1|0}return-1}_findFirstWhitespaceAfterLineNumber(e){e=e|0;const i=this._findLastWhitespaceBeforeLineNumber(e)+1;return i<this._arr.length?i:-1}getFirstWhitespaceIndexAfterLineNumber(e){return this._checkPendingChanges(),e=e|0,this._findFirstWhitespaceAfterLineNumber(e)}getVerticalOffsetForLineNumber(e,t=!1){this._checkPendingChanges(),e=e|0;let i;e>1?i=this._lineHeight*(e-1):i=0;const n=this.getWhitespaceAccumulatedHeightBeforeLineNumber(e-(t?1:0));return i+n+this._paddingTop}getVerticalOffsetAfterLineNumber(e,t=!1){this._checkPendingChanges(),e=e|0;const i=this._lineHeight*e,n=this.getWhitespaceAccumulatedHeightBeforeLineNumber(e+(t?1:0));return i+n+this._paddingTop}getWhitespaceMinWidth(){if(this._checkPendingChanges(),this._minWidth===-1){let e=0;for(let t=0,i=this._arr.length;t<i;t++)e=Math.max(e,this._arr[t].minWidth);this._minWidth=e}return this._minWidth}isAfterLines(e){this._checkPendingChanges();const t=this.getLinesTotalHeight();return e>t}isInTopPadding(e){return this._paddingTop===0?!1:(this._checkPendingChanges(),e<this._paddingTop)}isInBottomPadding(e){if(this._paddingBottom===0)return!1;this._checkPendingChanges();const t=this.getLinesTotalHeight();return e>=t-this._paddingBottom}getLineNumberAtOrAfterVerticalOffset(e){if(this._checkPendingChanges(),e=e|0,e<0)return 1;const t=this._lineCount|0,i=this._lineHeight;let n=1,s=t;for(;n<s;){const r=(n+s)/2|0,a=this.getVerticalOffsetForLineNumber(r)|0;if(e>=a+i)n=r+1;else{if(e>=a)return r;s=r}}return n>t?t:n}getLinesViewportData(e,t){this._checkPendingChanges(),e=e|0,t=t|0;const i=this._lineHeight,n=this.getLineNumberAtOrAfterVerticalOffset(e)|0,s=this.getVerticalOffsetForLineNumber(n)|0;let r=this._lineCount|0,a=this.getFirstWhitespaceIndexAfterLineNumber(n)|0;const l=this.getWhitespacesCount()|0;let c,d;a===-1?(a=l,d=r+1,c=0):(d=this.getAfterLineNumberForWhitespaceIndex(a)|0,c=this.getHeightForWhitespaceIndex(a)|0);let h=s,u=h;const g=5e5;let f=0;s>=g&&(f=Math.floor(s/g)*g,f=Math.floor(f/i)*i,u-=f);const _=[],b=e+(t-e)/2;let v=-1;for(let k=n;k<=r;k++){if(v===-1){const x=h,y=h+i;(x<=b&&b<y||x>b)&&(v=k)}for(h+=i,_[k-n]=u,u+=i;d===k;)u+=c,h+=c,a++,a>=l?d=r+1:(d=this.getAfterLineNumberForWhitespaceIndex(a)|0,c=this.getHeightForWhitespaceIndex(a)|0);if(h>=t){r=k;break}}v===-1&&(v=r);const C=this.getVerticalOffsetForLineNumber(r)|0;let w=n,S=r;return w<S&&s<e&&w++,w<S&&C+i>t&&S--,{bigNumbersDelta:f,startLineNumber:n,endLineNumber:r,relativeVerticalOffset:_,centeredLineNumber:v,completelyVisibleStartLineNumber:w,completelyVisibleEndLineNumber:S}}getVerticalOffsetForWhitespaceIndex(e){this._checkPendingChanges(),e=e|0;const t=this.getAfterLineNumberForWhitespaceIndex(e);let i;t>=1?i=this._lineHeight*t:i=0;let n;return e>0?n=this.getWhitespacesAccumulatedHeight(e-1):n=0,i+n+this._paddingTop}getWhitespaceIndexAtOrAfterVerticallOffset(e){this._checkPendingChanges(),e=e|0;let t=0,i=this.getWhitespacesCount()-1;if(i<0)return-1;const n=this.getVerticalOffsetForWhitespaceIndex(i),s=this.getHeightForWhitespaceIndex(i);if(e>=n+s)return-1;for(;t<i;){const r=Math.floor((t+i)/2),a=this.getVerticalOffsetForWhitespaceIndex(r),l=this.getHeightForWhitespaceIndex(r);if(e>=a+l)t=r+1;else{if(e>=a)return r;i=r}}return t}getWhitespaceAtVerticalOffset(e){this._checkPendingChanges(),e=e|0;const t=this.getWhitespaceIndexAtOrAfterVerticallOffset(e);if(t<0||t>=this.getWhitespacesCount())return null;const i=this.getVerticalOffsetForWhitespaceIndex(t);if(i>e)return null;const n=this.getHeightForWhitespaceIndex(t),s=this.getIdForWhitespaceIndex(t),r=this.getAfterLineNumberForWhitespaceIndex(t);return{id:s,afterLineNumber:r,verticalOffset:i,height:n}}getWhitespaceViewportData(e,t){this._checkPendingChanges(),e=e|0,t=t|0;const i=this.getWhitespaceIndexAtOrAfterVerticallOffset(e),n=this.getWhitespacesCount()-1;if(i<0)return[];const s=[];for(let r=i;r<=n;r++){const a=this.getVerticalOffsetForWhitespaceIndex(r),l=this.getHeightForWhitespaceIndex(r);if(a>=t)break;s.push({id:this.getIdForWhitespaceIndex(r),afterLineNumber:this.getAfterLineNumberForWhitespaceIndex(r),verticalOffset:a,height:l})}return s}getWhitespaces(){return this._checkPendingChanges(),this._arr.slice(0)}getWhitespacesCount(){return this._checkPendingChanges(),this._arr.length}getIdForWhitespaceIndex(e){return this._checkPendingChanges(),e=e|0,this._arr[e].id}getAfterLineNumberForWhitespaceIndex(e){return this._checkPendingChanges(),e=e|0,this._arr[e].afterLineNumber}getHeightForWhitespaceIndex(e){return this._checkPendingChanges(),e=e|0,this._arr[e].height}}em.INSTANCE_COUNT=0;const vq=125;class Uf{constructor(e,t,i,n){e=e|0,t=t|0,i=i|0,n=n|0,e<0&&(e=0),t<0&&(t=0),i<0&&(i=0),n<0&&(n=0),this.width=e,this.contentWidth=t,this.scrollWidth=Math.max(e,t),this.height=i,this.contentHeight=n,this.scrollHeight=Math.max(i,n)}equals(e){return this.width===e.width&&this.contentWidth===e.contentWidth&&this.height===e.height&&this.contentHeight===e.contentHeight}}class Cq extends z{constructor(e,t){super(),this._onDidContentSizeChange=this._register(new O),this.onDidContentSizeChange=this._onDidContentSizeChange.event,this._dimensions=new Uf(0,0,0,0),this._scrollable=this._register(new Jm({forceIntegerValues:!0,smoothScrollDuration:e,scheduleAtNextAnimationFrame:t})),this.onDidScroll=this._scrollable.onScroll}getScrollable(){return this._scrollable}setSmoothScrollDuration(e){this._scrollable.setSmoothScrollDuration(e)}validateScrollPosition(e){return this._scrollable.validateScrollPosition(e)}getScrollDimensions(){return this._dimensions}setScrollDimensions(e){if(this._dimensions.equals(e))return;const t=this._dimensions;this._dimensions=e,this._scrollable.setScrollDimensions({width:e.width,scrollWidth:e.scrollWidth,height:e.height,scrollHeight:e.scrollHeight},!0);const i=t.contentWidth!==e.contentWidth,n=t.contentHeight!==e.contentHeight;(i||n)&&this._onDidContentSizeChange.fire(new TI(t.contentWidth,t.contentHeight,e.contentWidth,e.contentHeight))}getFutureScrollPosition(){return this._scrollable.getFutureScrollPosition()}getCurrentScrollPosition(){return this._scrollable.getCurrentScrollPosition()}setScrollPositionNow(e){this._scrollable.setScrollPositionNow(e)}setScrollPositionSmooth(e){this._scrollable.setScrollPositionSmooth(e)}}class wq extends z{constructor(e,t,i){super(),this._configuration=e;const n=this._configuration.options,s=n.get(133),r=n.get(77);this._linesLayout=new em(t,n.get(61),r.top,r.bottom),this._scrollable=this._register(new Cq(0,i)),this._configureSmoothScrollDuration(),this._scrollable.setScrollDimensions(new Uf(s.contentWidth,0,s.height,0)),this.onDidScroll=this._scrollable.onDidScroll,this.onDidContentSizeChange=this._scrollable.onDidContentSizeChange,this._updateHeight()}dispose(){super.dispose()}getScrollable(){return this._scrollable.getScrollable()}onHeightMaybeChanged(){this._updateHeight()}_configureSmoothScrollDuration(){this._scrollable.setSmoothScrollDuration(this._configuration.options.get(105)?vq:0)}onConfigurationChanged(e){const t=this._configuration.options;if(e.hasChanged(61)&&this._linesLayout.setLineHeight(t.get(61)),e.hasChanged(77)){const i=t.get(77);this._linesLayout.setPadding(i.top,i.bottom)}if(e.hasChanged(133)){const i=t.get(133),n=i.contentWidth,s=i.height,r=this._scrollable.getScrollDimensions(),a=r.contentWidth;this._scrollable.setScrollDimensions(new Uf(n,r.contentWidth,s,this._getContentHeight(n,s,a)))}else this._updateHeight();e.hasChanged(105)&&this._configureSmoothScrollDuration()}onFlushed(e){this._linesLayout.onFlushed(e)}onLinesDeleted(e,t){this._linesLayout.onLinesDeleted(e,t)}onLinesInserted(e,t){this._linesLayout.onLinesInserted(e,t)}_getHorizontalScrollbarHeight(e,t){const n=this._configuration.options.get(94);return n.horizontal===2||e>=t?0:n.horizontalScrollbarSize}_getContentHeight(e,t,i){const n=this._configuration.options;let s=this._linesLayout.getLinesTotalHeight();return n.get(96)?s+=Math.max(0,t-n.get(61)-n.get(77).bottom):s+=this._getHorizontalScrollbarHeight(e,i),s}_updateHeight(){const e=this._scrollable.getScrollDimensions(),t=e.width,i=e.height,n=e.contentWidth;this._scrollable.setScrollDimensions(new Uf(t,e.contentWidth,i,this._getContentHeight(t,i,n)))}getCurrentViewport(){const e=this._scrollable.getScrollDimensions(),t=this._scrollable.getCurrentScrollPosition();return new o2(t.scrollTop,t.scrollLeft,e.width,e.height)}getFutureViewport(){const e=this._scrollable.getScrollDimensions(),t=this._scrollable.getFutureScrollPosition();return new o2(t.scrollTop,t.scrollLeft,e.width,e.height)}_computeContentWidth(e){const t=this._configuration.options,i=t.get(134),n=t.get(46),s=t.get(133);if(i.isViewportWrapping){const r=t.get(67);return e>s.contentWidth+n.typicalHalfwidthCharacterWidth&&r.enabled&&r.side===\"right\"?e+s.verticalScrollbarWidth:e}else{const r=t.get(95)*n.typicalHalfwidthCharacterWidth,a=this._linesLayout.getWhitespaceMinWidth();return Math.max(e+r+s.verticalScrollbarWidth,a)}}setMaxLineWidth(e){const t=this._scrollable.getScrollDimensions();this._scrollable.setScrollDimensions(new Uf(t.width,this._computeContentWidth(e),t.height,t.contentHeight)),this._updateHeight()}saveState(){const e=this._scrollable.getFutureScrollPosition(),t=e.scrollTop,i=this._linesLayout.getLineNumberAtOrAfterVerticalOffset(t),n=this._linesLayout.getWhitespaceAccumulatedHeightBeforeLineNumber(i);return{scrollTop:t,scrollTopWithoutViewZones:t-n,scrollLeft:e.scrollLeft}}changeWhitespace(e){const t=this._linesLayout.changeWhitespace(e);return t&&this.onHeightMaybeChanged(),t}getVerticalOffsetForLineNumber(e,t=!1){return this._linesLayout.getVerticalOffsetForLineNumber(e,t)}getVerticalOffsetAfterLineNumber(e,t=!1){return this._linesLayout.getVerticalOffsetAfterLineNumber(e,t)}isAfterLines(e){return this._linesLayout.isAfterLines(e)}isInTopPadding(e){return this._linesLayout.isInTopPadding(e)}isInBottomPadding(e){return this._linesLayout.isInBottomPadding(e)}getLineNumberAtVerticalOffset(e){return this._linesLayout.getLineNumberAtOrAfterVerticalOffset(e)}getWhitespaceAtVerticalOffset(e){return this._linesLayout.getWhitespaceAtVerticalOffset(e)}getLinesViewportData(){const e=this.getCurrentViewport();return this._linesLayout.getLinesViewportData(e.top,e.top+e.height)}getLinesViewportDataAtScrollTop(e){const t=this._scrollable.getScrollDimensions();return e+t.height>t.scrollHeight&&(e=t.scrollHeight-t.height),e<0&&(e=0),this._linesLayout.getLinesViewportData(e,e+t.height)}getWhitespaceViewportData(){const e=this.getCurrentViewport();return this._linesLayout.getWhitespaceViewportData(e.top,e.top+e.height)}getWhitespaces(){return this._linesLayout.getWhitespaces()}getContentWidth(){return this._scrollable.getScrollDimensions().contentWidth}getScrollWidth(){return this._scrollable.getScrollDimensions().scrollWidth}getContentHeight(){return this._scrollable.getScrollDimensions().contentHeight}getScrollHeight(){return this._scrollable.getScrollDimensions().scrollHeight}getCurrentScrollLeft(){return this._scrollable.getCurrentScrollPosition().scrollLeft}getCurrentScrollTop(){return this._scrollable.getCurrentScrollPosition().scrollTop}validateScrollPosition(e){return this._scrollable.validateScrollPosition(e)}setScrollPosition(e,t){t===1?this._scrollable.setScrollPositionNow(e):this._scrollable.setScrollPositionSmooth(e)}deltaScrollNow(e,t){const i=this._scrollable.getCurrentScrollPosition();this._scrollable.setScrollPositionNow({scrollLeft:i.scrollLeft+e,scrollTop:i.scrollTop+t})}}class Sq{constructor(e,t,i,n,s){this.editorId=e,this.model=t,this.configuration=i,this._linesCollection=n,this._coordinatesConverter=s,this._decorationsCache=Object.create(null),this._cachedModelDecorationsResolver=null,this._cachedModelDecorationsResolverViewRange=null}_clearCachedModelDecorationsResolver(){this._cachedModelDecorationsResolver=null,this._cachedModelDecorationsResolverViewRange=null}dispose(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}reset(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}onModelDecorationsChanged(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}onLineMappingChanged(){this._decorationsCache=Object.create(null),this._clearCachedModelDecorationsResolver()}_getOrCreateViewModelDecoration(e){const t=e.id;let i=this._decorationsCache[t];if(!i){const n=e.range,s=e.options;let r;if(s.isWholeLine){const a=this._coordinatesConverter.convertModelPositionToViewPosition(new B(n.startLineNumber,1),0),l=this._coordinatesConverter.convertModelPositionToViewPosition(new B(n.endLineNumber,this.model.getLineMaxColumn(n.endLineNumber)),1);r=new L(a.lineNumber,a.column,l.lineNumber,l.column)}else r=this._coordinatesConverter.convertModelRangeToViewRange(n,1);i=new I4(r,s),this._decorationsCache[t]=i}return i}getDecorationsViewportData(e){let t=this._cachedModelDecorationsResolver!==null;return t=t&&e.equalsRange(this._cachedModelDecorationsResolverViewRange),t||(this._cachedModelDecorationsResolver=this._getDecorationsInRange(e),this._cachedModelDecorationsResolverViewRange=e),this._cachedModelDecorationsResolver}getInlineDecorationsOnLine(e){const t=new L(e,this._linesCollection.getViewLineMinColumn(e),e,this._linesCollection.getViewLineMaxColumn(e));return this._getDecorationsInRange(t).inlineDecorations[0]}_getDecorationsInRange(e){const t=this._linesCollection.getDecorationsInRange(e,this.editorId,G0(this.configuration.options)),i=e.startLineNumber,n=e.endLineNumber,s=[];let r=0;const a=[];for(let l=i;l<=n;l++)a[l-i]=[];for(let l=0,c=t.length;l<c;l++){const d=t[l],h=d.options;if(!qI(this.model,d))continue;const u=this._getOrCreateViewModelDecoration(d),g=u.range;if(s[r++]=u,h.inlineClassName){const f=new tp(g,h.inlineClassName,h.inlineClassNameAffectsLetterSpacing?3:0),_=Math.max(i,g.startLineNumber),b=Math.min(n,g.endLineNumber);for(let v=_;v<=b;v++)a[v-i].push(f)}if(h.beforeContentClassName&&i<=g.startLineNumber&&g.startLineNumber<=n){const f=new tp(new L(g.startLineNumber,g.startColumn,g.startLineNumber,g.startColumn),h.beforeContentClassName,1);a[g.startLineNumber-i].push(f)}if(h.afterContentClassName&&i<=g.endLineNumber&&g.endLineNumber<=n){const f=new tp(new L(g.endLineNumber,g.endColumn,g.endLineNumber,g.endColumn),h.afterContentClassName,2);a[g.endLineNumber-i].push(f)}}return{decorations:s,inlineDecorations:a}}}function qI(o,e){return!(e.options.hideInCommentTokens&&GI(o,e)||e.options.hideInStringTokens&&ZI(o,e))}function GI(o,e){return J4(o,e.range,t=>t===1)}function ZI(o,e){return J4(o,e.range,t=>t===2)}function J4(o,e,t){for(let i=e.startLineNumber;i<=e.endLineNumber;i++){const n=o.tokenization.getLineTokens(i),s=i===e.startLineNumber,r=i===e.endLineNumber;let a=s?n.findTokenIndexAtOffset(e.startColumn-1):0;for(;a<n.getCount()&&!(r&&n.getStartOffset(a)>e.endColumn-1);){if(!t(n.getStandardTokenType(a)))return!1;a++}}return!0}function Xw(o,e){return o===null?e?gv.INSTANCE:fv.INSTANCE:new yq(o,e)}class yq{constructor(e,t){this._projectionData=e,this._isVisible=t}isVisible(){return this._isVisible}setVisible(e){return this._isVisible=e,this}getProjectionData(){return this._projectionData}getViewLineCount(){return this._isVisible?this._projectionData.getOutputLineCount():0}getViewLineContent(e,t,i){this._assertVisible();const n=i>0?this._projectionData.breakOffsets[i-1]:0,s=this._projectionData.breakOffsets[i];let r;if(this._projectionData.injectionOffsets!==null){const a=this._projectionData.injectionOffsets.map((c,d)=>new Yo(0,0,c+1,this._projectionData.injectionOptions[d],0));r=Yo.applyInjectedText(e.getLineContent(t),a).substring(n,s)}else r=e.getValueInRange({startLineNumber:t,startColumn:n+1,endLineNumber:t,endColumn:s+1});return i>0&&(r=H2(this._projectionData.wrappedTextIndentLength)+r),r}getViewLineLength(e,t,i){return this._assertVisible(),this._projectionData.getLineLength(i)}getViewLineMinColumn(e,t,i){return this._assertVisible(),this._projectionData.getMinOutputOffset(i)+1}getViewLineMaxColumn(e,t,i){return this._assertVisible(),this._projectionData.getMaxOutputOffset(i)+1}getViewLineData(e,t,i){const n=new Array;return this.getViewLinesData(e,t,i,1,0,[!0],n),n[0]}getViewLinesData(e,t,i,n,s,r,a){this._assertVisible();const l=this._projectionData,c=l.injectionOffsets,d=l.injectionOptions;let h=null;if(c){h=[];let g=0,f=0;for(let _=0;_<l.getOutputLineCount();_++){const b=new Array;h[_]=b;const v=_>0?l.breakOffsets[_-1]:0,C=l.breakOffsets[_];for(;f<c.length;){const w=d[f].content.length,S=c[f]+g,k=S+w;if(S>C)break;if(v<k){const x=d[f];if(x.inlineClassName){const y=_>0?l.wrappedTextIndentLength:0,D=y+Math.max(S-v,0),I=y+Math.min(k-v,C);D!==I&&b.push(new j$(D,I,x.inlineClassName,x.inlineClassNameAffectsLetterSpacing))}}if(k<=C)g+=w,f++;else break}}}let u;c?u=e.tokenization.getLineTokens(t).withInserted(c.map((g,f)=>({offset:g,text:d[f].content,tokenMetadata:Si.defaultTokenMetadata}))):u=e.tokenization.getLineTokens(t);for(let g=i;g<i+n;g++){const f=s+g-i;if(!r[f]){a[f]=null;continue}a[f]=this._getViewLineData(u,h?h[g]:null,g)}}_getViewLineData(e,t,i){this._assertVisible();const n=this._projectionData,s=i>0?n.wrappedTextIndentLength:0,r=i>0?n.breakOffsets[i-1]:0,a=n.breakOffsets[i],l=e.sliceAndInflate(r,a,s);let c=l.getLineContent();i>0&&(c=H2(n.wrappedTextIndentLength)+c);const d=this._projectionData.getMinOutputOffset(i)+1,h=c.length+1,u=i+1<this.getViewLineCount(),g=i===0?0:n.breakOffsetsVisibleColumn[i-1];return new EI(c,u,d,h,g,l,t)}getModelColumnOfViewPosition(e,t){return this._assertVisible(),this._projectionData.translateToInputOffset(e,t-1)+1}getViewPositionOfModelPosition(e,t,i=2){return this._assertVisible(),this._projectionData.translateToOutputPosition(t-1,i).toPosition(e)}getViewLineNumberOfModelPosition(e,t){this._assertVisible();const i=this._projectionData.translateToOutputPosition(t-1);return e+i.outputLineIndex}normalizePosition(e,t,i){const n=t.lineNumber-e;return this._projectionData.normalizeOutputPosition(e,t.column-1,i).toPosition(n)}getInjectedTextAt(e,t){return this._projectionData.getInjectedText(e,t-1)}_assertVisible(){if(!this._isVisible)throw new Error(\"Not supported\")}}class gv{constructor(){}isVisible(){return!0}setVisible(e){return e?this:fv.INSTANCE}getProjectionData(){return null}getViewLineCount(){return 1}getViewLineContent(e,t,i){return e.getLineContent(t)}getViewLineLength(e,t,i){return e.getLineLength(t)}getViewLineMinColumn(e,t,i){return e.getLineMinColumn(t)}getViewLineMaxColumn(e,t,i){return e.getLineMaxColumn(t)}getViewLineData(e,t,i){const n=e.tokenization.getLineTokens(t),s=n.getLineContent();return new EI(s,!1,1,s.length+1,0,n.inflate(),null)}getViewLinesData(e,t,i,n,s,r,a){if(!r[s]){a[s]=null;return}a[s]=this.getViewLineData(e,t,0)}getModelColumnOfViewPosition(e,t){return t}getViewPositionOfModelPosition(e,t){return new B(e,t)}getViewLineNumberOfModelPosition(e,t){return e}normalizePosition(e,t,i){return t}getInjectedTextAt(e,t){return null}}gv.INSTANCE=new gv;class fv{constructor(){}isVisible(){return!1}setVisible(e){return e?gv.INSTANCE:this}getProjectionData(){return null}getViewLineCount(){return 0}getViewLineContent(e,t,i){throw new Error(\"Not supported\")}getViewLineLength(e,t,i){throw new Error(\"Not supported\")}getViewLineMinColumn(e,t,i){throw new Error(\"Not supported\")}getViewLineMaxColumn(e,t,i){throw new Error(\"Not supported\")}getViewLineData(e,t,i){throw new Error(\"Not supported\")}getViewLinesData(e,t,i,n,s,r,a){throw new Error(\"Not supported\")}getModelColumnOfViewPosition(e,t){throw new Error(\"Not supported\")}getViewPositionOfModelPosition(e,t){throw new Error(\"Not supported\")}getViewLineNumberOfModelPosition(e,t){throw new Error(\"Not supported\")}normalizePosition(e,t,i){throw new Error(\"Not supported\")}getInjectedTextAt(e,t){throw new Error(\"Not supported\")}}fv.INSTANCE=new fv;const Qw=[\"\"];function H2(o){if(o>=Qw.length)for(let e=1;e<=o;e++)Qw[e]=Lq(e);return Qw[o]}function Lq(o){return new Array(o+1).join(\" \")}class Dq{constructor(e){this.values=e,this.prefixSum=new Uint32Array(e.length),this.prefixSumValidIndex=new Int32Array(1),this.prefixSumValidIndex[0]=-1}insertValues(e,t){e=Mh(e);const i=this.values,n=this.prefixSum,s=t.length;return s===0?!1:(this.values=new Uint32Array(i.length+s),this.values.set(i.subarray(0,e),0),this.values.set(i.subarray(e),e+s),this.values.set(t,e),e-1<this.prefixSumValidIndex[0]&&(this.prefixSumValidIndex[0]=e-1),this.prefixSum=new Uint32Array(this.values.length),this.prefixSumValidIndex[0]>=0&&this.prefixSum.set(n.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}setValue(e,t){return e=Mh(e),t=Mh(t),this.values[e]===t?!1:(this.values[e]=t,e-1<this.prefixSumValidIndex[0]&&(this.prefixSumValidIndex[0]=e-1),!0)}removeValues(e,t){e=Mh(e),t=Mh(t);const i=this.values,n=this.prefixSum;if(e>=i.length)return!1;const s=i.length-e;return t>=s&&(t=s),t===0?!1:(this.values=new Uint32Array(i.length-t),this.values.set(i.subarray(0,e),0),this.values.set(i.subarray(e+t),e),this.prefixSum=new Uint32Array(this.values.length),e-1<this.prefixSumValidIndex[0]&&(this.prefixSumValidIndex[0]=e-1),this.prefixSumValidIndex[0]>=0&&this.prefixSum.set(n.subarray(0,this.prefixSumValidIndex[0]+1)),!0)}getTotalSum(){return this.values.length===0?0:this._getPrefixSum(this.values.length-1)}getPrefixSum(e){return e<0?0:(e=Mh(e),this._getPrefixSum(e))}_getPrefixSum(e){if(e<=this.prefixSumValidIndex[0])return this.prefixSum[e];let t=this.prefixSumValidIndex[0]+1;t===0&&(this.prefixSum[0]=this.values[0],t++),e>=this.values.length&&(e=this.values.length-1);for(let i=t;i<=e;i++)this.prefixSum[i]=this.prefixSum[i-1]+this.values[i];return this.prefixSumValidIndex[0]=Math.max(this.prefixSumValidIndex[0],e),this.prefixSum[e]}getIndexOf(e){e=Math.floor(e),this.getTotalSum();let t=0,i=this.values.length-1,n=0,s=0,r=0;for(;t<=i;)if(n=t+(i-t)/2|0,s=this.prefixSum[n],r=s-this.values[n],e<r)i=n-1;else if(e>=s)t=n+1;else break;return new e5(n,e-r)}}class kq{constructor(e){this._values=e,this._isValid=!1,this._validEndIndex=-1,this._prefixSum=[],this._indexBySum=[]}getTotalSum(){return this._ensureValid(),this._indexBySum.length}getPrefixSum(e){return this._ensureValid(),e===0?0:this._prefixSum[e-1]}getIndexOf(e){this._ensureValid();const t=this._indexBySum[e],i=t>0?this._prefixSum[t-1]:0;return new e5(t,e-i)}removeValues(e,t){this._values.splice(e,t),this._invalidate(e)}insertValues(e,t){this._values=WC(this._values,e,t),this._invalidate(e)}_invalidate(e){this._isValid=!1,this._validEndIndex=Math.min(this._validEndIndex,e-1)}_ensureValid(){if(!this._isValid){for(let e=this._validEndIndex+1,t=this._values.length;e<t;e++){const i=this._values[e],n=e>0?this._prefixSum[e-1]:0;this._prefixSum[e]=n+i;for(let s=0;s<i;s++)this._indexBySum[n+s]=e}this._prefixSum.length=this._values.length,this._indexBySum.length=this._prefixSum[this._prefixSum.length-1],this._isValid=!0,this._validEndIndex=this._values.length-1}}setValue(e,t){this._values[e]!==t&&(this._values[e]=t,this._invalidate(e))}}class e5{constructor(e,t){this.index=e,this.remainder=t,this._prefixSumIndexOfResultBrand=void 0,this.index=e,this.remainder=t}}class xq{constructor(e,t,i,n,s,r,a,l,c){this._editorId=e,this.model=t,this._validModelVersionId=-1,this._domLineBreaksComputerFactory=i,this._monospaceLineBreaksComputerFactory=n,this.fontInfo=s,this.tabSize=r,this.wrappingStrategy=a,this.wrappingColumn=l,this.wrappingIndent=c,this._constructLines(!0,null)}dispose(){this.hiddenAreasDecorationIds=this.model.deltaDecorations(this.hiddenAreasDecorationIds,[])}createCoordinatesConverter(){return new Eq(this)}_constructLines(e,t){this.modelLineProjections=[],e&&(this.hiddenAreasDecorationIds=this.model.deltaDecorations(this.hiddenAreasDecorationIds,[]));const i=this.model.getLinesContent(),n=this.model.getInjectedTextDecorations(this._editorId),s=i.length,r=this.createLineBreaksComputer(),a=new Ap(Yo.fromDecorations(n));for(let _=0;_<s;_++){const b=a.takeWhile(v=>v.lineNumber===_+1);r.addRequest(i[_],b,t?t[_]:null)}const l=r.finalize(),c=[],d=this.hiddenAreasDecorationIds.map(_=>this.model.getDecorationRange(_)).sort(L.compareRangesUsingStarts);let h=1,u=0,g=-1,f=g+1<d.length?u+1:s+2;for(let _=0;_<s;_++){const b=_+1;b===f&&(g++,h=d[g].startLineNumber,u=d[g].endLineNumber,f=g+1<d.length?u+1:s+2);const v=b>=h&&b<=u,C=Xw(l[_],!v);c[_]=C.getViewLineCount(),this.modelLineProjections[_]=C}this._validModelVersionId=this.model.getVersionId(),this.projectedModelLineLineCounts=new kq(c)}getHiddenAreas(){return this.hiddenAreasDecorationIds.map(e=>this.model.getDecorationRange(e))}setHiddenAreas(e){const t=e.map(u=>this.model.validateRange(u)),i=Iq(t),n=this.hiddenAreasDecorationIds.map(u=>this.model.getDecorationRange(u)).sort(L.compareRangesUsingStarts);if(i.length===n.length){let u=!1;for(let g=0;g<i.length;g++)if(!i[g].equalsRange(n[g])){u=!0;break}if(!u)return!1}const s=i.map(u=>({range:u,options:Ie.EMPTY}));this.hiddenAreasDecorationIds=this.model.deltaDecorations(this.hiddenAreasDecorationIds,s);const r=i;let a=1,l=0,c=-1,d=c+1<r.length?l+1:this.modelLineProjections.length+2,h=!1;for(let u=0;u<this.modelLineProjections.length;u++){const g=u+1;g===d&&(c++,a=r[c].startLineNumber,l=r[c].endLineNumber,d=c+1<r.length?l+1:this.modelLineProjections.length+2);let f=!1;if(g>=a&&g<=l?this.modelLineProjections[u].isVisible()&&(this.modelLineProjections[u]=this.modelLineProjections[u].setVisible(!1),f=!0):(h=!0,this.modelLineProjections[u].isVisible()||(this.modelLineProjections[u]=this.modelLineProjections[u].setVisible(!0),f=!0)),f){const _=this.modelLineProjections[u].getViewLineCount();this.projectedModelLineLineCounts.setValue(u,_)}}return h||this.setHiddenAreas([]),!0}modelPositionIsVisible(e,t){return e<1||e>this.modelLineProjections.length?!1:this.modelLineProjections[e-1].isVisible()}getModelLineViewLineCount(e){return e<1||e>this.modelLineProjections.length?1:this.modelLineProjections[e-1].getViewLineCount()}setTabSize(e){return this.tabSize===e?!1:(this.tabSize=e,this._constructLines(!1,null),!0)}setWrappingSettings(e,t,i,n){const s=this.fontInfo.equals(e),r=this.wrappingStrategy===t,a=this.wrappingColumn===i,l=this.wrappingIndent===n;if(s&&r&&a&&l)return!1;const c=s&&r&&!a&&l;this.fontInfo=e,this.wrappingStrategy=t,this.wrappingColumn=i,this.wrappingIndent=n;let d=null;if(c){d=[];for(let h=0,u=this.modelLineProjections.length;h<u;h++)d[h]=this.modelLineProjections[h].getProjectionData()}return this._constructLines(!1,d),!0}createLineBreaksComputer(){return(this.wrappingStrategy===\"advanced\"?this._domLineBreaksComputerFactory:this._monospaceLineBreaksComputerFactory).createLineBreaksComputer(this.fontInfo,this.tabSize,this.wrappingColumn,this.wrappingIndent)}onModelFlushed(){this._constructLines(!0,null)}onModelLinesDeleted(e,t,i){if(!e||e<=this._validModelVersionId)return null;const n=t===1?1:this.projectedModelLineLineCounts.getPrefixSum(t-1)+1,s=this.projectedModelLineLineCounts.getPrefixSum(i);return this.modelLineProjections.splice(t-1,i-t+1),this.projectedModelLineLineCounts.removeValues(t-1,i-t+1),new Qy(n,s)}onModelLinesInserted(e,t,i,n){if(!e||e<=this._validModelVersionId)return null;const s=t>2&&!this.modelLineProjections[t-2].isVisible(),r=t===1?1:this.projectedModelLineLineCounts.getPrefixSum(t-1)+1;let a=0;const l=[],c=[];for(let d=0,h=n.length;d<h;d++){const u=Xw(n[d],!s);l.push(u);const g=u.getViewLineCount();a+=g,c[d]=g}return this.modelLineProjections=this.modelLineProjections.slice(0,t-1).concat(l).concat(this.modelLineProjections.slice(t-1)),this.projectedModelLineLineCounts.insertValues(t-1,c),new Jy(r,r+a-1)}onModelLineChanged(e,t,i){if(e!==null&&e<=this._validModelVersionId)return[!1,null,null,null];const n=t-1,s=this.modelLineProjections[n].getViewLineCount(),r=this.modelLineProjections[n].isVisible(),a=Xw(i,r);this.modelLineProjections[n]=a;const l=this.modelLineProjections[n].getViewLineCount();let c=!1,d=0,h=-1,u=0,g=-1,f=0,_=-1;s>l?(d=this.projectedModelLineLineCounts.getPrefixSum(t-1)+1,h=d+l-1,f=h+1,_=f+(s-l)-1,c=!0):s<l?(d=this.projectedModelLineLineCounts.getPrefixSum(t-1)+1,h=d+s-1,u=h+1,g=u+(l-s)-1,c=!0):(d=this.projectedModelLineLineCounts.getPrefixSum(t-1)+1,h=d+l-1),this.projectedModelLineLineCounts.setValue(n,l);const b=d<=h?new T4(d,h-d+1):null,v=u<=g?new Jy(u,g):null,C=f<=_?new Qy(f,_):null;return[c,b,v,C]}acceptVersionId(e){this._validModelVersionId=e,this.modelLineProjections.length===1&&!this.modelLineProjections[0].isVisible()&&this.setHiddenAreas([])}getViewLineCount(){return this.projectedModelLineLineCounts.getTotalSum()}_toValidViewLineNumber(e){if(e<1)return 1;const t=this.getViewLineCount();return e>t?t:e|0}getActiveIndentGuide(e,t,i){e=this._toValidViewLineNumber(e),t=this._toValidViewLineNumber(t),i=this._toValidViewLineNumber(i);const n=this.convertViewPositionToModelPosition(e,this.getViewLineMinColumn(e)),s=this.convertViewPositionToModelPosition(t,this.getViewLineMinColumn(t)),r=this.convertViewPositionToModelPosition(i,this.getViewLineMinColumn(i)),a=this.model.guides.getActiveIndentGuide(n.lineNumber,s.lineNumber,r.lineNumber),l=this.convertModelPositionToViewPosition(a.startLineNumber,1),c=this.convertModelPositionToViewPosition(a.endLineNumber,this.model.getLineMaxColumn(a.endLineNumber));return{startLineNumber:l.lineNumber,endLineNumber:c.lineNumber,indent:a.indent}}getViewLineInfo(e){e=this._toValidViewLineNumber(e);const t=this.projectedModelLineLineCounts.getIndexOf(e-1),i=t.index,n=t.remainder;return new z2(i+1,n)}getMinColumnOfViewLine(e){return this.modelLineProjections[e.modelLineNumber-1].getViewLineMinColumn(this.model,e.modelLineNumber,e.modelLineWrappedLineIdx)}getMaxColumnOfViewLine(e){return this.modelLineProjections[e.modelLineNumber-1].getViewLineMaxColumn(this.model,e.modelLineNumber,e.modelLineWrappedLineIdx)}getModelStartPositionOfViewLine(e){const t=this.modelLineProjections[e.modelLineNumber-1],i=t.getViewLineMinColumn(this.model,e.modelLineNumber,e.modelLineWrappedLineIdx),n=t.getModelColumnOfViewPosition(e.modelLineWrappedLineIdx,i);return new B(e.modelLineNumber,n)}getModelEndPositionOfViewLine(e){const t=this.modelLineProjections[e.modelLineNumber-1],i=t.getViewLineMaxColumn(this.model,e.modelLineNumber,e.modelLineWrappedLineIdx),n=t.getModelColumnOfViewPosition(e.modelLineWrappedLineIdx,i);return new B(e.modelLineNumber,n)}getViewLineInfosGroupedByModelRanges(e,t){const i=this.getViewLineInfo(e),n=this.getViewLineInfo(t),s=new Array;let r=this.getModelStartPositionOfViewLine(i),a=new Array;for(let l=i.modelLineNumber;l<=n.modelLineNumber;l++){const c=this.modelLineProjections[l-1];if(c.isVisible()){const d=l===i.modelLineNumber?i.modelLineWrappedLineIdx:0,h=l===n.modelLineNumber?n.modelLineWrappedLineIdx+1:c.getViewLineCount();for(let u=d;u<h;u++)a.push(new z2(l,u))}if(!c.isVisible()&&r){const d=new B(l-1,this.model.getLineMaxColumn(l-1)+1),h=L.fromPositions(r,d);s.push(new U2(h,a)),a=[],r=null}else c.isVisible()&&!r&&(r=new B(l,1))}if(r){const l=L.fromPositions(r,this.getModelEndPositionOfViewLine(n));s.push(new U2(l,a))}return s}getViewLinesBracketGuides(e,t,i,n){const s=i?this.convertViewPositionToModelPosition(i.lineNumber,i.column):null,r=[];for(const a of this.getViewLineInfosGroupedByModelRanges(e,t)){const l=a.modelRange.startLineNumber,c=this.model.guides.getLinesBracketGuides(l,a.modelRange.endLineNumber,s,n);for(const d of a.viewLines){const u=c[d.modelLineNumber-l].map(g=>{if(g.forWrappedLinesAfterColumn!==-1&&this.modelLineProjections[d.modelLineNumber-1].getViewPositionOfModelPosition(0,g.forWrappedLinesAfterColumn).lineNumber>=d.modelLineWrappedLineIdx||g.forWrappedLinesBeforeOrAtColumn!==-1&&this.modelLineProjections[d.modelLineNumber-1].getViewPositionOfModelPosition(0,g.forWrappedLinesBeforeOrAtColumn).lineNumber<d.modelLineWrappedLineIdx)return;if(!g.horizontalLine)return g;let f=-1;if(g.column!==-1){const v=this.modelLineProjections[d.modelLineNumber-1].getViewPositionOfModelPosition(0,g.column);if(v.lineNumber===d.modelLineWrappedLineIdx)f=v.column;else if(v.lineNumber<d.modelLineWrappedLineIdx)f=this.getMinColumnOfViewLine(d);else if(v.lineNumber>d.modelLineWrappedLineIdx)return}const _=this.convertModelPositionToViewPosition(d.modelLineNumber,g.horizontalLine.endColumn),b=this.modelLineProjections[d.modelLineNumber-1].getViewPositionOfModelPosition(0,g.horizontalLine.endColumn);return b.lineNumber===d.modelLineWrappedLineIdx?new hd(g.visibleColumn,f,g.className,new ep(g.horizontalLine.top,_.column),-1,-1):b.lineNumber<d.modelLineWrappedLineIdx||g.visibleColumn!==-1?void 0:new hd(g.visibleColumn,f,g.className,new ep(g.horizontalLine.top,this.getMaxColumnOfViewLine(d)),-1,-1)});r.push(u.filter(g=>!!g))}}return r}getViewLinesIndentGuides(e,t){e=this._toValidViewLineNumber(e),t=this._toValidViewLineNumber(t);const i=this.convertViewPositionToModelPosition(e,this.getViewLineMinColumn(e)),n=this.convertViewPositionToModelPosition(t,this.getViewLineMaxColumn(t));let s=[];const r=[],a=[],l=i.lineNumber-1,c=n.lineNumber-1;let d=null;for(let f=l;f<=c;f++){const _=this.modelLineProjections[f];if(_.isVisible()){const b=_.getViewLineNumberOfModelPosition(0,f===l?i.column:1),v=_.getViewLineNumberOfModelPosition(0,this.model.getLineMaxColumn(f+1)),C=v-b+1;let w=0;C>1&&_.getViewLineMinColumn(this.model,f+1,v)===1&&(w=b===0?1:2),r.push(C),a.push(w),d===null&&(d=new B(f+1,0))}else d!==null&&(s=s.concat(this.model.guides.getLinesIndentGuides(d.lineNumber,f)),d=null)}d!==null&&(s=s.concat(this.model.guides.getLinesIndentGuides(d.lineNumber,n.lineNumber)),d=null);const h=t-e+1,u=new Array(h);let g=0;for(let f=0,_=s.length;f<_;f++){let b=s[f];const v=Math.min(h-g,r[f]),C=a[f];let w;C===2?w=0:C===1?w=1:w=v;for(let S=0;S<v;S++)S===w&&(b=0),u[g++]=b}return u}getViewLineContent(e){const t=this.getViewLineInfo(e);return this.modelLineProjections[t.modelLineNumber-1].getViewLineContent(this.model,t.modelLineNumber,t.modelLineWrappedLineIdx)}getViewLineLength(e){const t=this.getViewLineInfo(e);return this.modelLineProjections[t.modelLineNumber-1].getViewLineLength(this.model,t.modelLineNumber,t.modelLineWrappedLineIdx)}getViewLineMinColumn(e){const t=this.getViewLineInfo(e);return this.modelLineProjections[t.modelLineNumber-1].getViewLineMinColumn(this.model,t.modelLineNumber,t.modelLineWrappedLineIdx)}getViewLineMaxColumn(e){const t=this.getViewLineInfo(e);return this.modelLineProjections[t.modelLineNumber-1].getViewLineMaxColumn(this.model,t.modelLineNumber,t.modelLineWrappedLineIdx)}getViewLineData(e){const t=this.getViewLineInfo(e);return this.modelLineProjections[t.modelLineNumber-1].getViewLineData(this.model,t.modelLineNumber,t.modelLineWrappedLineIdx)}getViewLinesData(e,t,i){e=this._toValidViewLineNumber(e),t=this._toValidViewLineNumber(t);const n=this.projectedModelLineLineCounts.getIndexOf(e-1);let s=e;const r=n.index,a=n.remainder,l=[];for(let c=r,d=this.model.getLineCount();c<d;c++){const h=this.modelLineProjections[c];if(!h.isVisible())continue;const u=c===r?a:0;let g=h.getViewLineCount()-u,f=!1;if(s+g>t&&(f=!0,g=t-s+1),h.getViewLinesData(this.model,c+1,u,g,s-e,i,l),s+=g,f)break}return l}validateViewPosition(e,t,i){e=this._toValidViewLineNumber(e);const n=this.projectedModelLineLineCounts.getIndexOf(e-1),s=n.index,r=n.remainder,a=this.modelLineProjections[s],l=a.getViewLineMinColumn(this.model,s+1,r),c=a.getViewLineMaxColumn(this.model,s+1,r);t<l&&(t=l),t>c&&(t=c);const d=a.getModelColumnOfViewPosition(r,t);return this.model.validatePosition(new B(s+1,d)).equals(i)?new B(e,t):this.convertModelPositionToViewPosition(i.lineNumber,i.column)}validateViewRange(e,t){const i=this.validateViewPosition(e.startLineNumber,e.startColumn,t.getStartPosition()),n=this.validateViewPosition(e.endLineNumber,e.endColumn,t.getEndPosition());return new L(i.lineNumber,i.column,n.lineNumber,n.column)}convertViewPositionToModelPosition(e,t){const i=this.getViewLineInfo(e),n=this.modelLineProjections[i.modelLineNumber-1].getModelColumnOfViewPosition(i.modelLineWrappedLineIdx,t);return this.model.validatePosition(new B(i.modelLineNumber,n))}convertViewRangeToModelRange(e){const t=this.convertViewPositionToModelPosition(e.startLineNumber,e.startColumn),i=this.convertViewPositionToModelPosition(e.endLineNumber,e.endColumn);return new L(t.lineNumber,t.column,i.lineNumber,i.column)}convertModelPositionToViewPosition(e,t,i=2){const n=this.model.validatePosition(new B(e,t)),s=n.lineNumber,r=n.column;let a=s-1,l=!1;for(;a>0&&!this.modelLineProjections[a].isVisible();)a--,l=!0;if(a===0&&!this.modelLineProjections[a].isVisible())return new B(1,1);const c=1+this.projectedModelLineLineCounts.getPrefixSum(a);let d;return l?d=this.modelLineProjections[a].getViewPositionOfModelPosition(c,this.model.getLineMaxColumn(a+1),i):d=this.modelLineProjections[s-1].getViewPositionOfModelPosition(c,r,i),d}convertModelRangeToViewRange(e,t=0){if(e.isEmpty()){const i=this.convertModelPositionToViewPosition(e.startLineNumber,e.startColumn,t);return L.fromPositions(i)}else{const i=this.convertModelPositionToViewPosition(e.startLineNumber,e.startColumn,1),n=this.convertModelPositionToViewPosition(e.endLineNumber,e.endColumn,0);return new L(i.lineNumber,i.column,n.lineNumber,n.column)}}getViewLineNumberOfModelPosition(e,t){let i=e-1;if(this.modelLineProjections[i].isVisible()){const s=1+this.projectedModelLineLineCounts.getPrefixSum(i);return this.modelLineProjections[i].getViewLineNumberOfModelPosition(s,t)}for(;i>0&&!this.modelLineProjections[i].isVisible();)i--;if(i===0&&!this.modelLineProjections[i].isVisible())return 1;const n=1+this.projectedModelLineLineCounts.getPrefixSum(i);return this.modelLineProjections[i].getViewLineNumberOfModelPosition(n,this.model.getLineMaxColumn(i+1))}getDecorationsInRange(e,t,i){const n=this.convertViewPositionToModelPosition(e.startLineNumber,e.startColumn),s=this.convertViewPositionToModelPosition(e.endLineNumber,e.endColumn);if(s.lineNumber-n.lineNumber<=e.endLineNumber-e.startLineNumber)return this.model.getDecorationsInRange(new L(n.lineNumber,1,s.lineNumber,s.column),t,i);let r=[];const a=n.lineNumber-1,l=s.lineNumber-1;let c=null;for(let g=a;g<=l;g++)if(this.modelLineProjections[g].isVisible())c===null&&(c=new B(g+1,g===a?n.column:1));else if(c!==null){const _=this.model.getLineMaxColumn(g);r=r.concat(this.model.getDecorationsInRange(new L(c.lineNumber,c.column,g,_),t,i)),c=null}c!==null&&(r=r.concat(this.model.getDecorationsInRange(new L(c.lineNumber,c.column,s.lineNumber,s.column),t,i)),c=null),r.sort((g,f)=>{const _=L.compareRangesUsingStarts(g.range,f.range);return _===0?g.id<f.id?-1:g.id>f.id?1:0:_});const d=[];let h=0,u=null;for(const g of r){const f=g.id;u!==f&&(u=f,d[h++]=g)}return d}getInjectedTextAt(e){const t=this.getViewLineInfo(e.lineNumber);return this.modelLineProjections[t.modelLineNumber-1].getInjectedTextAt(t.modelLineWrappedLineIdx,e.column)}normalizePosition(e,t){const i=this.getViewLineInfo(e.lineNumber);return this.modelLineProjections[i.modelLineNumber-1].normalizePosition(i.modelLineWrappedLineIdx,e,t)}getLineIndentColumn(e){const t=this.getViewLineInfo(e);return t.modelLineWrappedLineIdx===0?this.model.getLineIndentColumn(t.modelLineNumber):0}}function Iq(o){if(o.length===0)return[];const e=o.slice();e.sort(L.compareRangesUsingStarts);const t=[];let i=e[0].startLineNumber,n=e[0].endLineNumber;for(let s=1,r=e.length;s<r;s++){const a=e[s];a.startLineNumber>n+1?(t.push(new L(i,1,n,1)),i=a.startLineNumber,n=a.endLineNumber):a.endLineNumber>n&&(n=a.endLineNumber)}return t.push(new L(i,1,n,1)),t}class z2{constructor(e,t){this.modelLineNumber=e,this.modelLineWrappedLineIdx=t}}class U2{constructor(e,t){this.modelRange=e,this.viewLines=t}}class Eq{constructor(e){this._lines=e}convertViewPositionToModelPosition(e){return this._lines.convertViewPositionToModelPosition(e.lineNumber,e.column)}convertViewRangeToModelRange(e){return this._lines.convertViewRangeToModelRange(e)}validateViewPosition(e,t){return this._lines.validateViewPosition(e.lineNumber,e.column,t)}validateViewRange(e,t){return this._lines.validateViewRange(e,t)}convertModelPositionToViewPosition(e,t){return this._lines.convertModelPositionToViewPosition(e.lineNumber,e.column,t)}convertModelRangeToViewRange(e,t){return this._lines.convertModelRangeToViewRange(e,t)}modelPositionIsVisible(e){return this._lines.modelPositionIsVisible(e.lineNumber,e.column)}getModelLineViewLineCount(e){return this._lines.getModelLineViewLineCount(e)}getViewLineNumberOfModelPosition(e,t){return this._lines.getViewLineNumberOfModelPosition(e,t)}}class Nq{constructor(e){this.model=e}dispose(){}createCoordinatesConverter(){return new Tq(this)}getHiddenAreas(){return[]}setHiddenAreas(e){return!1}setTabSize(e){return!1}setWrappingSettings(e,t,i,n){return!1}createLineBreaksComputer(){const e=[];return{addRequest:(t,i,n)=>{e.push(null)},finalize:()=>e}}onModelFlushed(){}onModelLinesDeleted(e,t,i){return new Qy(t,i)}onModelLinesInserted(e,t,i,n){return new Jy(t,i)}onModelLineChanged(e,t,i){return[!1,new T4(t,1),null,null]}acceptVersionId(e){}getViewLineCount(){return this.model.getLineCount()}getActiveIndentGuide(e,t,i){return{startLineNumber:e,endLineNumber:e,indent:0}}getViewLinesBracketGuides(e,t,i){return new Array(t-e+1).fill([])}getViewLinesIndentGuides(e,t){const i=t-e+1,n=new Array(i);for(let s=0;s<i;s++)n[s]=0;return n}getViewLineContent(e){return this.model.getLineContent(e)}getViewLineLength(e){return this.model.getLineLength(e)}getViewLineMinColumn(e){return this.model.getLineMinColumn(e)}getViewLineMaxColumn(e){return this.model.getLineMaxColumn(e)}getViewLineData(e){const t=this.model.tokenization.getLineTokens(e),i=t.getLineContent();return new EI(i,!1,1,i.length+1,0,t.inflate(),null)}getViewLinesData(e,t,i){const n=this.model.getLineCount();e=Math.min(Math.max(1,e),n),t=Math.min(Math.max(1,t),n);const s=[];for(let r=e;r<=t;r++){const a=r-e;s[a]=i[a]?this.getViewLineData(r):null}return s}getDecorationsInRange(e,t,i){return this.model.getDecorationsInRange(e,t,i)}normalizePosition(e,t){return this.model.normalizePosition(e,t)}getLineIndentColumn(e){return this.model.getLineIndentColumn(e)}getInjectedTextAt(e){return null}}class Tq{constructor(e){this._lines=e}_validPosition(e){return this._lines.model.validatePosition(e)}_validRange(e){return this._lines.model.validateRange(e)}convertViewPositionToModelPosition(e){return this._validPosition(e)}convertViewRangeToModelRange(e){return this._validRange(e)}validateViewPosition(e,t){return this._validPosition(t)}validateViewRange(e,t){return this._validRange(t)}convertModelPositionToViewPosition(e){return this._validPosition(e)}convertModelRangeToViewRange(e){return this._validRange(e)}modelPositionIsVisible(e){const t=this._lines.model.getLineCount();return!(e.lineNumber<1||e.lineNumber>t)}getModelLineViewLineCount(e){return 1}getViewLineNumberOfModelPosition(e,t){return e}}class Mq extends z{constructor(e,t,i,n,s,r,a,l){if(super(),this.languageConfigurationService=a,this._themeService=l,this._editorId=e,this._configuration=t,this.model=i,this._eventDispatcher=new Oj,this.onEvent=this._eventDispatcher.onEvent,this.cursorConfig=new Th(this.model.getLanguageId(),this.model.getOptions(),this._configuration,this.languageConfigurationService),this._tokenizeViewportSoon=this._register(new ft(()=>this.tokenizeViewport(),50)),this._updateConfigurationViewLineCount=this._register(new ft(()=>this._updateConfigurationViewLineCountNow(),0)),this._hasFocus=!1,this._viewportStart=YI.create(this.model),this.model.isTooLargeForTokenization())this._lines=new Nq(this.model);else{const c=this._configuration.options,d=c.get(46),h=c.get(127),u=c.get(134),g=c.get(126);this._lines=new xq(this._editorId,this.model,n,s,d,this.model.getOptions().tabSize,h,u.wrappingColumn,g)}this.coordinatesConverter=this._lines.createCoordinatesConverter(),this._cursor=this._register(new ug(i,this,this.coordinatesConverter,this.cursorConfig)),this.viewLayout=this._register(new wq(this._configuration,this.getLineCount(),r)),this._register(this.viewLayout.onDidScroll(c=>{c.scrollTopChanged&&this._tokenizeViewportSoon.schedule(),c.scrollTopChanged&&this._viewportStart.invalidate(),this._eventDispatcher.emitSingleViewEvent(new Nj(c)),this._eventDispatcher.emitOutgoingEvent(new AI(c.oldScrollWidth,c.oldScrollLeft,c.oldScrollHeight,c.oldScrollTop,c.scrollWidth,c.scrollLeft,c.scrollHeight,c.scrollTop))})),this._register(this.viewLayout.onDidContentSizeChange(c=>{this._eventDispatcher.emitOutgoingEvent(c)})),this._decorations=new Sq(this._editorId,this.model,this._configuration,this._lines,this.coordinatesConverter),this._registerModelEvents(),this._register(this._configuration.onDidChangeFast(c=>{try{const d=this._eventDispatcher.beginEmitViewEvents();this._onConfigurationChanged(d,c)}finally{this._eventDispatcher.endEmitViewEvents()}})),this._register(t_.getInstance().onDidChange(()=>{this._eventDispatcher.emitSingleViewEvent(new Aj)})),this._register(this._themeService.onDidColorThemeChange(c=>{this._invalidateDecorationsColorCache(),this._eventDispatcher.emitSingleViewEvent(new Tj(c))})),this._updateConfigurationViewLineCountNow()}dispose(){super.dispose(),this._decorations.dispose(),this._lines.dispose(),this._viewportStart.dispose(),this._eventDispatcher.dispose()}createLineBreaksComputer(){return this._lines.createLineBreaksComputer()}addViewEventHandler(e){this._eventDispatcher.addViewEventHandler(e)}removeViewEventHandler(e){this._eventDispatcher.removeViewEventHandler(e)}_updateConfigurationViewLineCountNow(){this._configuration.setViewLineCount(this._lines.getViewLineCount())}tokenizeViewport(){const e=this.viewLayout.getLinesViewportData(),t=new L(e.startLineNumber,this.getLineMinColumn(e.startLineNumber),e.endLineNumber,this.getLineMaxColumn(e.endLineNumber)),i=this._toModelVisibleRanges(t);for(const n of i)this.model.tokenization.tokenizeViewport(n.startLineNumber,n.endLineNumber)}setHasFocus(e){this._hasFocus=e,this._cursor.setHasFocus(e),this._eventDispatcher.emitSingleViewEvent(new Ij(e)),this._eventDispatcher.emitOutgoingEvent(new MI(!e,e))}onCompositionStart(){this._eventDispatcher.emitSingleViewEvent(new Lj)}onCompositionEnd(){this._eventDispatcher.emitSingleViewEvent(new Dj)}_onConfigurationChanged(e,t){let i=null;if(this._viewportStart.isValid){const d=new B(this._viewportStart.viewLineNumber,this.getLineMinColumn(this._viewportStart.viewLineNumber));i=this.coordinatesConverter.convertViewPositionToModelPosition(d)}let n=!1;const s=this._configuration.options,r=s.get(46),a=s.get(127),l=s.get(134),c=s.get(126);if(this._lines.setWrappingSettings(r,a,l.wrappingColumn,c)&&(e.emitViewEvent(new Y_),e.emitViewEvent(new X_),e.emitViewEvent(new Ah(null)),this._cursor.onLineMappingChanged(e),this._decorations.onLineMappingChanged(),this.viewLayout.onFlushed(this.getLineCount()),this.viewLayout.getCurrentScrollTop()!==0&&(n=!0),this._updateConfigurationViewLineCount.schedule()),t.hasChanged(83)&&(this._decorations.reset(),e.emitViewEvent(new Ah(null))),e.emitViewEvent(new kj(t)),this.viewLayout.onConfigurationChanged(t),n&&i){const d=this.coordinatesConverter.convertModelPositionToViewPosition(i),h=this.viewLayout.getVerticalOffsetForLineNumber(d.lineNumber);this.viewLayout.setScrollPosition({scrollTop:h+this._viewportStart.startLineDelta},1)}Th.shouldRecreate(t)&&(this.cursorConfig=new Th(this.model.getLanguageId(),this.model.getOptions(),this._configuration,this.languageConfigurationService),this._cursor.updateConfiguration(this.cursorConfig))}_registerModelEvents(){this._register(this.model.onDidChangeContentOrInjectedText(e=>{try{const i=this._eventDispatcher.beginEmitViewEvents();let n=!1,s=!1;const r=e instanceof wd?e.rawContentChangedEvent.changes:e.changes,a=e instanceof wd?e.rawContentChangedEvent.versionId:null,l=this._lines.createLineBreaksComputer();for(const h of r)switch(h.changeType){case 4:{for(let u=0;u<h.detail.length;u++){const g=h.detail[u];let f=h.injectedTexts[u];f&&(f=f.filter(_=>!_.ownerId||_.ownerId===this._editorId)),l.addRequest(g,f,null)}break}case 2:{let u=null;h.injectedText&&(u=h.injectedText.filter(g=>!g.ownerId||g.ownerId===this._editorId)),l.addRequest(h.detail,u,null);break}}const c=l.finalize(),d=new Ap(c);for(const h of r)switch(h.changeType){case 1:{this._lines.onModelFlushed(),i.emitViewEvent(new Y_),this._decorations.reset(),this.viewLayout.onFlushed(this.getLineCount()),n=!0;break}case 3:{const u=this._lines.onModelLinesDeleted(a,h.fromLineNumber,h.toLineNumber);u!==null&&(i.emitViewEvent(u),this.viewLayout.onLinesDeleted(u.fromLineNumber,u.toLineNumber)),n=!0;break}case 4:{const u=d.takeCount(h.detail.length),g=this._lines.onModelLinesInserted(a,h.fromLineNumber,h.toLineNumber,u);g!==null&&(i.emitViewEvent(g),this.viewLayout.onLinesInserted(g.fromLineNumber,g.toLineNumber)),n=!0;break}case 2:{const u=d.dequeue(),[g,f,_,b]=this._lines.onModelLineChanged(a,h.lineNumber,u);s=g,f&&i.emitViewEvent(f),_&&(i.emitViewEvent(_),this.viewLayout.onLinesInserted(_.fromLineNumber,_.toLineNumber)),b&&(i.emitViewEvent(b),this.viewLayout.onLinesDeleted(b.fromLineNumber,b.toLineNumber));break}case 5:break}a!==null&&this._lines.acceptVersionId(a),this.viewLayout.onHeightMaybeChanged(),!n&&s&&(i.emitViewEvent(new X_),i.emitViewEvent(new Ah(null)),this._cursor.onLineMappingChanged(i),this._decorations.onLineMappingChanged())}finally{this._eventDispatcher.endEmitViewEvents()}const t=this._viewportStart.isValid;if(this._viewportStart.invalidate(),this._configuration.setModelLineCount(this.model.getLineCount()),this._updateConfigurationViewLineCountNow(),!this._hasFocus&&this.model.getAttachedEditorCount()>=2&&t){const i=this.model._getTrackedRange(this._viewportStart.modelTrackedRange);if(i){const n=this.coordinatesConverter.convertModelPositionToViewPosition(i.getStartPosition()),s=this.viewLayout.getVerticalOffsetForLineNumber(n.lineNumber);this.viewLayout.setScrollPosition({scrollTop:s+this._viewportStart.startLineDelta},1)}}try{const i=this._eventDispatcher.beginEmitViewEvents();e instanceof wd&&i.emitOutgoingEvent(new Uj(e.contentChangedEvent)),this._cursor.onModelContentChanged(i,e)}finally{this._eventDispatcher.endEmitViewEvents()}this._tokenizeViewportSoon.schedule()})),this._register(this.model.onDidChangeTokens(e=>{const t=[];for(let i=0,n=e.ranges.length;i<n;i++){const s=e.ranges[i],r=this.coordinatesConverter.convertModelPositionToViewPosition(new B(s.fromLineNumber,1)).lineNumber,a=this.coordinatesConverter.convertModelPositionToViewPosition(new B(s.toLineNumber,this.model.getLineMaxColumn(s.toLineNumber))).lineNumber;t[i]={fromLineNumber:r,toLineNumber:a}}this._eventDispatcher.emitSingleViewEvent(new Mj(t)),e.tokenizationSupportChanged&&this._tokenizeViewportSoon.schedule(),this._eventDispatcher.emitOutgoingEvent(new jj(e))})),this._register(this.model.onDidChangeLanguageConfiguration(e=>{this._eventDispatcher.emitSingleViewEvent(new Ej),this.cursorConfig=new Th(this.model.getLanguageId(),this.model.getOptions(),this._configuration,this.languageConfigurationService),this._cursor.updateConfiguration(this.cursorConfig),this._eventDispatcher.emitOutgoingEvent(new zj(e))})),this._register(this.model.onDidChangeLanguage(e=>{this.cursorConfig=new Th(this.model.getLanguageId(),this.model.getOptions(),this._configuration,this.languageConfigurationService),this._cursor.updateConfiguration(this.cursorConfig),this._eventDispatcher.emitOutgoingEvent(new Hj(e))})),this._register(this.model.onDidChangeOptions(e=>{if(this._lines.setTabSize(this.model.getOptions().tabSize)){try{const t=this._eventDispatcher.beginEmitViewEvents();t.emitViewEvent(new Y_),t.emitViewEvent(new X_),t.emitViewEvent(new Ah(null)),this._cursor.onLineMappingChanged(t),this._decorations.onLineMappingChanged(),this.viewLayout.onFlushed(this.getLineCount())}finally{this._eventDispatcher.endEmitViewEvents()}this._updateConfigurationViewLineCount.schedule()}this.cursorConfig=new Th(this.model.getLanguageId(),this.model.getOptions(),this._configuration,this.languageConfigurationService),this._cursor.updateConfiguration(this.cursorConfig),this._eventDispatcher.emitOutgoingEvent(new $j(e))})),this._register(this.model.onDidChangeDecorations(e=>{this._decorations.onModelDecorationsChanged(),this._eventDispatcher.emitSingleViewEvent(new Ah(e)),this._eventDispatcher.emitOutgoingEvent(new Vj(e))}))}setHiddenAreas(e){let t=!1;try{const i=this._eventDispatcher.beginEmitViewEvents();t=this._lines.setHiddenAreas(e),t&&(i.emitViewEvent(new Y_),i.emitViewEvent(new X_),i.emitViewEvent(new Ah(null)),this._cursor.onLineMappingChanged(i),this._decorations.onLineMappingChanged(),this.viewLayout.onFlushed(this.getLineCount()),this.viewLayout.onHeightMaybeChanged())}finally{this._eventDispatcher.endEmitViewEvents()}this._updateConfigurationViewLineCount.schedule(),t&&this._eventDispatcher.emitOutgoingEvent(new Bj)}getVisibleRangesPlusViewportAboveBelow(){const e=this._configuration.options.get(133),t=this._configuration.options.get(61),i=Math.max(20,Math.round(e.height/t)),n=this.viewLayout.getLinesViewportData(),s=Math.max(1,n.completelyVisibleStartLineNumber-i),r=Math.min(this.getLineCount(),n.completelyVisibleEndLineNumber+i);return this._toModelVisibleRanges(new L(s,this.getLineMinColumn(s),r,this.getLineMaxColumn(r)))}getVisibleRanges(){const e=this.getCompletelyVisibleViewRange();return this._toModelVisibleRanges(e)}getHiddenAreas(){return this._lines.getHiddenAreas()}_toModelVisibleRanges(e){const t=this.coordinatesConverter.convertViewRangeToModelRange(e),i=this._lines.getHiddenAreas();if(i.length===0)return[t];const n=[];let s=0,r=t.startLineNumber,a=t.startColumn;const l=t.endLineNumber,c=t.endColumn;for(let d=0,h=i.length;d<h;d++){const u=i[d].startLineNumber,g=i[d].endLineNumber;g<r||u>l||(r<u&&(n[s++]=new L(r,a,u-1,this.model.getLineMaxColumn(u-1))),r=g+1,a=1)}return(r<l||r===l&&a<c)&&(n[s++]=new L(r,a,l,c)),n}getCompletelyVisibleViewRange(){const e=this.viewLayout.getLinesViewportData(),t=e.completelyVisibleStartLineNumber,i=e.completelyVisibleEndLineNumber;return new L(t,this.getLineMinColumn(t),i,this.getLineMaxColumn(i))}getCompletelyVisibleViewRangeAtScrollTop(e){const t=this.viewLayout.getLinesViewportDataAtScrollTop(e),i=t.completelyVisibleStartLineNumber,n=t.completelyVisibleEndLineNumber;return new L(i,this.getLineMinColumn(i),n,this.getLineMaxColumn(n))}saveState(){const e=this.viewLayout.saveState(),t=e.scrollTop,i=this.viewLayout.getLineNumberAtVerticalOffset(t),n=this.coordinatesConverter.convertViewPositionToModelPosition(new B(i,this.getLineMinColumn(i))),s=this.viewLayout.getVerticalOffsetForLineNumber(i)-t;return{scrollLeft:e.scrollLeft,firstPosition:n,firstPositionDeltaTop:s}}reduceRestoreState(e){if(typeof e.firstPosition==\"undefined\")return this._reduceRestoreStateCompatibility(e);const t=this.model.validatePosition(e.firstPosition),i=this.coordinatesConverter.convertModelPositionToViewPosition(t),n=this.viewLayout.getVerticalOffsetForLineNumber(i.lineNumber)-e.firstPositionDeltaTop;return{scrollLeft:e.scrollLeft,scrollTop:n}}_reduceRestoreStateCompatibility(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTopWithoutViewZones}}getTabSize(){return this.model.getOptions().tabSize}getLineCount(){return this._lines.getViewLineCount()}setViewport(e,t,i){this._viewportStart.update(this,e)}getActiveIndentGuide(e,t,i){return this._lines.getActiveIndentGuide(e,t,i)}getLinesIndentGuides(e,t){return this._lines.getViewLinesIndentGuides(e,t)}getBracketGuidesInRangeByLine(e,t,i,n){return this._lines.getViewLinesBracketGuides(e,t,i,n)}getLineContent(e){return this._lines.getViewLineContent(e)}getLineLength(e){return this._lines.getViewLineLength(e)}getLineMinColumn(e){return this._lines.getViewLineMinColumn(e)}getLineMaxColumn(e){return this._lines.getViewLineMaxColumn(e)}getLineFirstNonWhitespaceColumn(e){const t=Sn(this.getLineContent(e));return t===-1?0:t+1}getLineLastNonWhitespaceColumn(e){const t=Fr(this.getLineContent(e));return t===-1?0:t+2}getDecorationsInViewport(e){return this._decorations.getDecorationsViewportData(e).decorations}getInjectedTextAt(e){return this._lines.getInjectedTextAt(e)}getViewportViewLineRenderingData(e,t){const n=this._decorations.getDecorationsViewportData(e).inlineDecorations[t-e.startLineNumber];return this._getViewLineRenderingData(t,n)}getViewLineRenderingData(e){const t=this._decorations.getInlineDecorationsOnLine(e);return this._getViewLineRenderingData(e,t)}_getViewLineRenderingData(e,t){const i=this.model.mightContainRTL(),n=this.model.mightContainNonBasicASCII(),s=this.getTabSize(),r=this._lines.getViewLineData(e);return r.inlineDecorations&&(t=[...t,...r.inlineDecorations.map(a=>a.toInlineDecoration(e))]),new xs(r.minColumn,r.maxColumn,r.content,r.continuesWithWrappedLine,i,n,r.tokens,t,s,r.startVisibleColumn)}getViewLineData(e){return this._lines.getViewLineData(e)}getMinimapLinesRenderingData(e,t,i){const n=this._lines.getViewLinesData(e,t,i);return new $$(this.getTabSize(),n)}getAllOverviewRulerDecorations(e){const t=this.model.getOverviewRulerDecorations(this._editorId,G0(this._configuration.options)),i=new Aq;for(const n of t){const s=n.options,r=s.overviewRuler;if(!r)continue;const a=r.position;if(a===0)continue;const l=r.getColor(e.value),c=this.coordinatesConverter.getViewLineNumberOfModelPosition(n.range.startLineNumber,n.range.startColumn),d=this.coordinatesConverter.getViewLineNumberOfModelPosition(n.range.endLineNumber,n.range.endColumn);i.accept(l,s.zIndex,c,d,a)}return i.asArray}_invalidateDecorationsColorCache(){const e=this.model.getOverviewRulerDecorations();for(const t of e){const i=t.options.overviewRuler;i&&i.invalidateCachedColor();const n=t.options.minimap;n&&n.invalidateCachedColor()}}getValueInRange(e,t){const i=this.coordinatesConverter.convertViewRangeToModelRange(e);return this.model.getValueInRange(i,t)}deduceModelPositionRelativeToViewPosition(e,t,i){const n=this.coordinatesConverter.convertViewPositionToModelPosition(e);this.model.getEOL().length===2&&(t<0?t-=i:t+=i);const r=this.model.getOffsetAt(n)+t;return this.model.getPositionAt(r)}getPlainTextToCopy(e,t,i){const n=i?`\\r\n`:this.model.getEOL();e=e.slice(0),e.sort(L.compareRangesUsingStarts);let s=!1,r=!1;for(const l of e)l.isEmpty()?s=!0:r=!0;if(!r){if(!t)return\"\";const l=e.map(d=>d.startLineNumber);let c=\"\";for(let d=0;d<l.length;d++)d>0&&l[d-1]===l[d]||(c+=this.model.getLineContent(l[d])+n);return c}if(s&&t){const l=[];let c=0;for(const d of e){const h=d.startLineNumber;d.isEmpty()?h!==c&&l.push(this.model.getLineContent(h)):l.push(this.model.getValueInRange(d,i?2:0)),c=h}return l.length===1?l[0]:l}const a=[];for(const l of e)l.isEmpty()||a.push(this.model.getValueInRange(l,i?2:0));return a.length===1?a[0]:a}getRichTextToCopy(e,t){const i=this.model.getLanguageId();if(i===Us||e.length!==1)return null;let n=e[0];if(n.isEmpty()){if(!t)return null;const d=n.startLineNumber;n=new L(d,this.model.getLineMinColumn(d),d,this.model.getLineMaxColumn(d))}const s=this._configuration.options.get(46),r=this._getColorMap(),l=/[:;\\\\\\/<>]/.test(s.fontFamily)||s.fontFamily===ns.fontFamily;let c;return l?c=ns.fontFamily:(c=s.fontFamily,c=c.replace(/\"/g,\"'\"),/[,']/.test(c)||/[+ ]/.test(c)&&(c=`'${c}'`),c=`${c}, ${ns.fontFamily}`),{mode:i,html:`<div style=\"color: ${r[1]};background-color: ${r[2]};font-family: ${c};font-weight: ${s.fontWeight};font-size: ${s.fontSize}px;line-height: ${s.lineHeight}px;white-space: pre;\">`+this._getHTMLToCopy(n,r)+\"</div>\"}}_getHTMLToCopy(e,t){const i=e.startLineNumber,n=e.startColumn,s=e.endLineNumber,r=e.endColumn,a=this.getTabSize();let l=\"\";for(let c=i;c<=s;c++){const d=this.model.tokenization.getLineTokens(c),h=d.getLineContent(),u=c===i?n-1:0,g=c===s?r-1:h.length;h===\"\"?l+=\"<br>\":l+=mq(h,d.inflate(),t,u,g,a,nn)}return l}_getColorMap(){const e=Jt.getColorMap(),t=[\"#000000\"];if(e)for(let i=1,n=e.length;i<n;i++)t[i]=W.Format.CSS.formatHex(e[i]);return t}getPrimaryCursorState(){return this._cursor.getPrimaryCursorState()}getLastAddedCursorIndex(){return this._cursor.getLastAddedCursorIndex()}getCursorStates(){return this._cursor.getCursorStates()}setCursorStates(e,t,i){return this._withViewEventsCollector(n=>this._cursor.setStates(n,e,t,i))}getCursorColumnSelectData(){return this._cursor.getCursorColumnSelectData()}getCursorAutoClosedCharacters(){return this._cursor.getAutoClosedCharacters()}setCursorColumnSelectData(e){this._cursor.setCursorColumnSelectData(e)}getPrevEditOperationType(){return this._cursor.getPrevEditOperationType()}setPrevEditOperationType(e){this._cursor.setPrevEditOperationType(e)}getSelection(){return this._cursor.getSelection()}getSelections(){return this._cursor.getSelections()}getPosition(){return this._cursor.getPrimaryCursorState().modelState.position}setSelections(e,t,i=0){this._withViewEventsCollector(n=>this._cursor.setSelections(n,e,t,i))}saveCursorState(){return this._cursor.saveState()}restoreCursorState(e){this._withViewEventsCollector(t=>this._cursor.restoreState(t,e))}_executeCursorEdit(e){if(this._cursor.context.cursorConfig.readOnly){this._eventDispatcher.emitOutgoingEvent(new Wj);return}this._withViewEventsCollector(e)}executeEdits(e,t,i){this._executeCursorEdit(n=>this._cursor.executeEdits(n,e,t,i))}startComposition(){this._executeCursorEdit(e=>this._cursor.startComposition(e))}endComposition(e){this._executeCursorEdit(t=>this._cursor.endComposition(t,e))}type(e,t){this._executeCursorEdit(i=>this._cursor.type(i,e,t))}compositionType(e,t,i,n,s){this._executeCursorEdit(r=>this._cursor.compositionType(r,e,t,i,n,s))}paste(e,t,i,n){this._executeCursorEdit(s=>this._cursor.paste(s,e,t,i,n))}cut(e){this._executeCursorEdit(t=>this._cursor.cut(t,e))}executeCommand(e,t){this._executeCursorEdit(i=>this._cursor.executeCommand(i,e,t))}executeCommands(e,t){this._executeCursorEdit(i=>this._cursor.executeCommands(i,e,t))}revealPrimaryCursor(e,t,i=!1){this._withViewEventsCollector(n=>this._cursor.revealPrimary(n,e,i,0,t,0))}revealTopMostCursor(e){const t=this._cursor.getTopMostViewPosition(),i=new L(t.lineNumber,t.column,t.lineNumber,t.column);this._withViewEventsCollector(n=>n.emitViewEvent(new s0(e,!1,i,null,0,!0,0)))}revealBottomMostCursor(e){const t=this._cursor.getBottomMostViewPosition(),i=new L(t.lineNumber,t.column,t.lineNumber,t.column);this._withViewEventsCollector(n=>n.emitViewEvent(new s0(e,!1,i,null,0,!0,0)))}revealRange(e,t,i,n,s){this._withViewEventsCollector(r=>r.emitViewEvent(new s0(e,!1,i,null,n,t,s)))}changeWhitespace(e){this.viewLayout.changeWhitespace(e)&&(this._eventDispatcher.emitSingleViewEvent(new Rj),this._eventDispatcher.emitOutgoingEvent(new Fj))}_withViewEventsCollector(e){try{const t=this._eventDispatcher.beginEmitViewEvents();return e(t)}finally{this._eventDispatcher.endEmitViewEvents()}}normalizePosition(e,t){return this._lines.normalizePosition(e,t)}getLineIndentColumn(e){return this._lines.getLineIndentColumn(e)}}class YI{constructor(e,t,i,n,s){this._model=e,this._viewLineNumber=t,this._isValid=i,this._modelTrackedRange=n,this._startLineDelta=s}static create(e){const t=e._setTrackedRange(null,new L(1,1,1,1),1);return new YI(e,1,!1,t,0)}get viewLineNumber(){return this._viewLineNumber}get isValid(){return this._isValid}get modelTrackedRange(){return this._modelTrackedRange}get startLineDelta(){return this._startLineDelta}dispose(){this._model._setTrackedRange(this._modelTrackedRange,null,1)}update(e,t){const i=e.coordinatesConverter.convertViewPositionToModelPosition(new B(t,e.getLineMinColumn(t))),n=e.model._setTrackedRange(this._modelTrackedRange,new L(i.lineNumber,i.column,i.lineNumber,i.column),1),s=e.viewLayout.getVerticalOffsetForLineNumber(t),r=e.viewLayout.getCurrentScrollTop();this._viewLineNumber=t,this._isValid=!0,this._modelTrackedRange=n,this._startLineDelta=r-s}invalidate(){this._isValid=!1}}class Aq{constructor(){this._asMap=Object.create(null),this.asArray=[]}accept(e,t,i,n,s){const r=this._asMap[e];if(r){const a=r.data,l=a[a.length-3],c=a[a.length-1];if(l===s&&c+1>=i){n>c&&(a[a.length-1]=n);return}a.push(s,i,n)}else{const a=new E4(e,t,[s,i,n]);this._asMap[e]=a,this.asArray.push(a)}}}class c1{constructor(...e){this._entries=new Map;for(const[t,i]of e)this.set(t,i)}set(e,t){const i=this._entries.get(e);return this._entries.set(e,t),i}get(e){return this._entries.get(e)}}var tm;(function(o){o[o.Ignore=0]=\"Ignore\",o[o.Info=1]=\"Info\",o[o.Warning=2]=\"Warning\",o[o.Error=3]=\"Error\"})(tm||(tm={}));(function(o){const e=\"error\",t=\"warning\",i=\"warn\",n=\"info\",s=\"ignore\";function r(l){return l?su(e,l)?o.Error:su(t,l)||su(i,l)?o.Warning:su(n,l)?o.Info:o.Ignore:o.Ignore}o.fromValue=r;function a(l){switch(l){case o.Error:return e;case o.Warning:return t;case o.Info:return n;default:return s}}o.toString=a})(tm||(tm={}));const Vt=tm;var t5=Vt;const gi=qe(\"notificationService\");class Rq{}class dp{constructor(e,t,i,n,s){this.injectionOffsets=e,this.injectionOptions=t,this.breakOffsets=i,this.breakOffsetsVisibleColumn=n,this.wrappedTextIndentLength=s}getOutputLineCount(){return this.breakOffsets.length}getMinOutputOffset(e){return e>0?this.wrappedTextIndentLength:0}getLineLength(e){const t=e>0?this.breakOffsets[e-1]:0;let n=this.breakOffsets[e]-t;return e>0&&(n+=this.wrappedTextIndentLength),n}getMaxOutputOffset(e){return this.getLineLength(e)}translateToInputOffset(e,t){e>0&&(t=Math.max(0,t-this.wrappedTextIndentLength));let n=e===0?t:this.breakOffsets[e-1]+t;if(this.injectionOffsets!==null)for(let s=0;s<this.injectionOffsets.length&&n>this.injectionOffsets[s];s++)n<this.injectionOffsets[s]+this.injectionOptions[s].content.length?n=this.injectionOffsets[s]:n-=this.injectionOptions[s].content.length;return n}translateToOutputPosition(e,t=2){let i=e;if(this.injectionOffsets!==null)for(let n=0;n<this.injectionOffsets.length&&!(e<this.injectionOffsets[n]||t!==1&&e===this.injectionOffsets[n]);n++)i+=this.injectionOptions[n].content.length;return this.offsetInInputWithInjectionsToOutputPosition(i,t)}offsetInInputWithInjectionsToOutputPosition(e,t=2){let i=0,n=this.breakOffsets.length-1,s=0,r=0;for(;i<=n;){s=i+(n-i)/2|0;const l=this.breakOffsets[s];if(r=s>0?this.breakOffsets[s-1]:0,t===0)if(e<=r)n=s-1;else if(e>l)i=s+1;else break;else if(e<r)n=s-1;else if(e>=l)i=s+1;else break}let a=e-r;return s>0&&(a+=this.wrappedTextIndentLength),new sb(s,a)}normalizeOutputPosition(e,t,i){if(this.injectionOffsets!==null){const n=this.outputPositionToOffsetInInputWithInjections(e,t),s=this.normalizeOffsetInInputWithInjectionsAroundInjections(n,i);if(s!==n)return this.offsetInInputWithInjectionsToOutputPosition(s,i)}if(i===0){if(e>0&&t===this.getMinOutputOffset(e))return new sb(e-1,this.getMaxOutputOffset(e-1))}else if(i===1){const n=this.getOutputLineCount()-1;if(e<n&&t===this.getMaxOutputOffset(e))return new sb(e+1,this.getMinOutputOffset(e+1))}return new sb(e,t)}outputPositionToOffsetInInputWithInjections(e,t){return e>0&&(t=Math.max(0,t-this.wrappedTextIndentLength)),(e>0?this.breakOffsets[e-1]:0)+t}normalizeOffsetInInputWithInjectionsAroundInjections(e,t){const i=this.getInjectedTextAtOffset(e);if(!i)return e;if(t===2){if(e===i.offsetInInputWithInjections+i.length&&$2(this.injectionOptions[i.injectedTextIndex].cursorStops))return i.offsetInInputWithInjections+i.length;{let n=i.offsetInInputWithInjections;if(j2(this.injectionOptions[i.injectedTextIndex].cursorStops))return n;let s=i.injectedTextIndex-1;for(;s>=0&&this.injectionOffsets[s]===this.injectionOffsets[i.injectedTextIndex]&&!($2(this.injectionOptions[s].cursorStops)||(n-=this.injectionOptions[s].content.length,j2(this.injectionOptions[s].cursorStops)));)s--;return n}}else if(t===1||t===4){let n=i.offsetInInputWithInjections+i.length,s=i.injectedTextIndex;for(;s+1<this.injectionOffsets.length&&this.injectionOffsets[s+1]===this.injectionOffsets[s];)n+=this.injectionOptions[s+1].content.length,s++;return n}else if(t===0||t===3){let n=i.offsetInInputWithInjections,s=i.injectedTextIndex;for(;s-1>=0&&this.injectionOffsets[s-1]===this.injectionOffsets[s];)n-=this.injectionOptions[s-1].content.length,s--;return n}wC()}getInjectedText(e,t){const i=this.outputPositionToOffsetInInputWithInjections(e,t),n=this.getInjectedTextAtOffset(i);return n?{options:this.injectionOptions[n.injectedTextIndex]}:null}getInjectedTextAtOffset(e){const t=this.injectionOffsets,i=this.injectionOptions;if(t!==null){let n=0;for(let s=0;s<t.length;s++){const r=i[s].content.length,a=t[s]+n,l=t[s]+n+r;if(a>e)break;if(e<=l)return{injectedTextIndex:s,offsetInInputWithInjections:a,length:r};n+=r}}}}function $2(o){return o==null?!0:o===Bo.Right||o===Bo.Both}function j2(o){return o==null?!0:o===Bo.Left||o===Bo.Both}class sb{constructor(e,t){this.outputLineIndex=e,this.outputOffset=t}toString(){return`${this.outputLineIndex}:${this.outputOffset}`}toPosition(e){return new B(e+this.outputLineIndex,this.outputOffset+1)}}class XI{constructor(e,t){this.classifier=new Oq(e,t)}static create(e){return new XI(e.get(122),e.get(121))}createLineBreaksComputer(e,t,i,n){const s=[],r=[],a=[];return{addRequest:(l,c,d)=>{s.push(l),r.push(c),a.push(d)},finalize:()=>{const l=e.typicalFullwidthCharacterWidth/e.typicalHalfwidthCharacterWidth,c=[];for(let d=0,h=s.length;d<h;d++){const u=r[d],g=a[d];g&&!g.injectionOptions&&!u?c[d]=Pq(this.classifier,g,s[d],t,i,l,n):c[d]=Fq(this.classifier,s[d],u,t,i,l,n)}return aL.length=0,lL.length=0,c}}}}class Oq extends Pg{constructor(e,t){super(0);for(let i=0;i<e.length;i++)this.set(e.charCodeAt(i),1);for(let i=0;i<t.length;i++)this.set(t.charCodeAt(i),2)}get(e){return e>=0&&e<256?this._asciiMap[e]:e>=12352&&e<=12543||e>=13312&&e<=19903||e>=19968&&e<=40959?3:this._map.get(e)||this._defaultValue}}let aL=[],lL=[];function Pq(o,e,t,i,n,s,r){if(n===-1)return null;const a=t.length;if(a<=1)return null;const l=e.breakOffsets,c=e.breakOffsetsVisibleColumn,d=i5(t,i,n,s,r),h=n-d,u=aL,g=lL;let f=0,_=0,b=0,v=n;const C=l.length;let w=0;if(w>=0){let S=Math.abs(c[w]-v);for(;w+1<C;){const k=Math.abs(c[w+1]-v);if(k>=S)break;S=k,w++}}for(;w<C;){let S=w<0?0:l[w],k=w<0?0:c[w];_>S&&(S=_,k=b);let x=0,y=0,D=0,I=0;if(k<=v){let P=k,H=S===0?0:t.charCodeAt(S-1),$=S===0?0:o.get(H),ne=!0;for(let ae=S;ae<a;ae++){const de=ae,we=t.charCodeAt(ae);let Se,Me;if(wi(we)?(ae++,Se=0,Me=2):(Se=o.get(we),Me=hp(we,P,i,s)),de>_&&cL(H,$,we,Se)&&(x=de,y=P),P+=Me,P>v){de>_?(D=de,I=P-Me):(D=ae+1,I=P),P-y>h&&(x=0),ne=!1;break}H=we,$=Se}if(ne){f>0&&(u[f]=l[l.length-1],g[f]=c[l.length-1],f++);break}}if(x===0){let P=k,H=t.charCodeAt(S),$=o.get(H),ne=!1;for(let ae=S-1;ae>=_;ae--){const de=ae+1,we=t.charCodeAt(ae);if(we===9){ne=!0;break}let Se,Me;if(Fd(we)?(ae--,Se=0,Me=2):(Se=o.get(we),Me=oc(we)?s:1),P<=v){if(D===0&&(D=de,I=P),P<=v-h)break;if(cL(we,Se,H,$)){x=de,y=P;break}}P-=Me,H=we,$=Se}if(x!==0){const ae=h-(I-y);if(ae<=i){const de=t.charCodeAt(D);let we;wi(de)?we=2:we=hp(de,I,i,s),ae-we<0&&(x=0)}}if(ne){w--;continue}}if(x===0&&(x=D,y=I),x<=_){const P=t.charCodeAt(_);wi(P)?(x=_+2,y=b+2):(x=_+1,y=b+hp(P,b,i,s))}for(_=x,u[f]=x,b=y,g[f]=y,f++,v=y+h;w<0||w<C&&c[w]<y;)w++;let R=Math.abs(c[w]-v);for(;w+1<C;){const P=Math.abs(c[w+1]-v);if(P>=R)break;R=P,w++}}return f===0?null:(u.length=f,g.length=f,aL=e.breakOffsets,lL=e.breakOffsetsVisibleColumn,e.breakOffsets=u,e.breakOffsetsVisibleColumn=g,e.wrappedTextIndentLength=d,e)}function Fq(o,e,t,i,n,s,r){const a=Yo.applyInjectedText(e,t);let l,c;if(t&&t.length>0?(l=t.map(y=>y.options),c=t.map(y=>y.column-1)):(l=null,c=null),n===-1)return l?new dp(c,l,[a.length],[],0):null;const d=a.length;if(d<=1)return l?new dp(c,l,[a.length],[],0):null;const h=i5(a,i,n,s,r),u=n-h,g=[],f=[];let _=0,b=0,v=0,C=n,w=a.charCodeAt(0),S=o.get(w),k=hp(w,0,i,s),x=1;wi(w)&&(k+=1,w=a.charCodeAt(1),S=o.get(w),x++);for(let y=x;y<d;y++){const D=y,I=a.charCodeAt(y);let R,P;wi(I)?(y++,R=0,P=2):(R=o.get(I),P=hp(I,k,i,s)),cL(w,S,I,R)&&(b=D,v=k),k+=P,k>C&&((b===0||k-v>u)&&(b=D,v=k-P),g[_]=b,f[_]=v,_++,C=v+u,b=0),w=I,S=R}return _===0&&(!t||t.length===0)?null:(g[_]=d,f[_]=k,new dp(c,l,g,f,h))}function hp(o,e,t,i){return o===9?t-e%t:oc(o)||o<32?i:1}function K2(o,e){return e-o%e}function cL(o,e,t,i){return t!==32&&(e===2&&i!==2||e!==1&&i===1||e===3&&i!==2||i===3&&e!==1)}function i5(o,e,t,i,n){let s=0;if(n!==0){const r=Sn(o);if(r!==-1){for(let l=0;l<r;l++)s+=o.charCodeAt(l)===9?K2(s,e):1;const a=n===3?2:n===2?1:0;for(let l=0;l<a;l++)s+=K2(s,e);s+i>t&&(s=0)}}return s}var Jw;const eS=(Jw=window.trustedTypes)===null||Jw===void 0?void 0:Jw.createPolicy(\"domLineBreaksComputer\",{createHTML:o=>o});class QI{static create(){return new QI}constructor(){}createLineBreaksComputer(e,t,i,n){const s=[],r=[];return{addRequest:(a,l,c)=>{s.push(a),r.push(l)},finalize:()=>Bq(s,e,t,i,n,r)}}}function Bq(o,e,t,i,n,s){var r;function a(D){const I=s[D];if(I){const R=Yo.applyInjectedText(o[D],I),P=I.map($=>$.options),H=I.map($=>$.column-1);return new dp(H,P,[R.length],[],0)}else return null}if(i===-1){const D=[];for(let I=0,R=o.length;I<R;I++)D[I]=a(I);return D}const l=Math.round(i*e.typicalHalfwidthCharacterWidth),d=Math.round(t*(n===3?2:n===2?1:0)),h=Math.ceil(e.spaceWidth*d),u=document.createElement(\"div\");tn(u,e);const g=lc(1e4),f=[],_=[],b=[],v=[],C=[];for(let D=0;D<o.length;D++){const I=Yo.applyInjectedText(o[D],s[D]);let R=0,P=0,H=l;if(n!==0)if(R=Sn(I),R===-1)R=0;else{for(let de=0;de<R;de++)P+=I.charCodeAt(de)===9?t-P%t:1;const ae=Math.ceil(e.spaceWidth*P);ae+e.typicalFullwidthCharacterWidth>l?(R=0,P=0):H=l-ae}const $=I.substr(R),ne=Wq($,P,t,H,g,h);f[D]=R,_[D]=P,b[D]=$,v[D]=ne[0],C[D]=ne[1]}const w=g.build(),S=(r=eS==null?void 0:eS.createHTML(w))!==null&&r!==void 0?r:w;u.innerHTML=S,u.style.position=\"absolute\",u.style.top=\"10000\",u.style.wordWrap=\"break-word\",document.body.appendChild(u);const k=document.createRange(),x=Array.prototype.slice.call(u.children,0),y=[];for(let D=0;D<o.length;D++){const I=x[D],R=Vq(k,I,b[D],v[D]);if(R===null){y[D]=a(D);continue}const P=f[D],H=_[D]+d,$=C[D],ne=[];for(let Se=0,Me=R.length;Se<Me;Se++)ne[Se]=$[R[Se]];if(P!==0)for(let Se=0,Me=R.length;Se<Me;Se++)R[Se]+=P;let ae,de;const we=s[D];we?(ae=we.map(Se=>Se.options),de=we.map(Se=>Se.column-1)):(ae=null,de=null),y[D]=new dp(de,ae,R,ne,H)}return document.body.removeChild(u),y}function Wq(o,e,t,i,n,s){if(s!==0){const u=String(s);n.appendASCIIString('<div style=\"text-indent: -'),n.appendASCIIString(u),n.appendASCIIString(\"px; padding-left: \"),n.appendASCIIString(u),n.appendASCIIString(\"px; box-sizing: border-box; width:\")}else n.appendASCIIString('<div style=\"width:');n.appendASCIIString(String(i)),n.appendASCIIString('px;\">');const r=o.length;let a=e,l=0;const c=[],d=[];let h=0<r?o.charCodeAt(0):0;n.appendASCIIString(\"<span>\");for(let u=0;u<r;u++){u!==0&&u%16384===0&&n.appendASCIIString(\"</span><span>\"),c[u]=l,d[u]=a;const g=h;h=u+1<r?o.charCodeAt(u+1):0;let f=1,_=1;switch(g){case 9:f=t-a%t,_=f;for(let b=1;b<=f;b++)b<f?n.write1(160):n.appendASCII(32);break;case 32:h===32?n.write1(160):n.appendASCII(32);break;case 60:n.appendASCIIString(\"&lt;\");break;case 62:n.appendASCIIString(\"&gt;\");break;case 38:n.appendASCIIString(\"&amp;\");break;case 0:n.appendASCIIString(\"&#00;\");break;case 65279:case 8232:case 8233:case 133:n.write1(65533);break;default:oc(g)&&_++,g<32?n.write1(9216+g):n.write1(g)}l+=f,a+=_}return n.appendASCIIString(\"</span>\"),c[o.length]=l,d[o.length]=a,n.appendASCIIString(\"</div>\"),[c,d]}function Vq(o,e,t,i){if(t.length<=1)return null;const n=Array.prototype.slice.call(e.children,0),s=[];try{dL(o,n,i,0,null,t.length-1,null,s)}catch(r){return console.log(r),null}return s.length===0?null:(s.push(t.length),s)}function dL(o,e,t,i,n,s,r,a){if(i===s||(n=n||tS(o,e,t[i],t[i+1]),r=r||tS(o,e,t[s],t[s+1]),Math.abs(n[0].top-r[0].top)<=.1))return;if(i+1===s){a.push(s);return}const l=i+(s-i)/2|0,c=tS(o,e,t[l],t[l+1]);dL(o,e,t,i,n,l,c,a),dL(o,e,t,l,c,s,r,a)}function tS(o,e,t,i){return o.setStart(e[t/16384|0].firstChild,t%16384),o.setEnd(e[i/16384|0].firstChild,i%16384),o.getClientRects()}const ue=qe(\"ILanguageFeaturesService\");var Hq=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},da=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},zq=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};let Uq=0;class $q{constructor(e,t,i,n,s){this.model=e,this.viewModel=t,this.view=i,this.hasRealView=n,this.listenersToRemove=s}dispose(){et(this.listenersToRemove),this.model.onBeforeDetached(),this.hasRealView&&this.view.dispose(),this.viewModel.dispose()}}let fg=class Qh extends z{constructor(e,t,i,n,s,r,a,l,c,d,h,u){super(),this.languageConfigurationService=h,this._deliveryQueue=new mO,this._onDidDispose=this._register(new O),this.onDidDispose=this._onDidDispose.event,this._onDidChangeModelContent=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidChangeModelContent=this._onDidChangeModelContent.event,this._onDidChangeModelLanguage=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidChangeModelLanguage=this._onDidChangeModelLanguage.event,this._onDidChangeModelLanguageConfiguration=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidChangeModelLanguageConfiguration=this._onDidChangeModelLanguageConfiguration.event,this._onDidChangeModelOptions=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidChangeModelOptions=this._onDidChangeModelOptions.event,this._onDidChangeModelDecorations=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidChangeModelDecorations=this._onDidChangeModelDecorations.event,this._onDidChangeModelTokens=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidChangeModelTokens=this._onDidChangeModelTokens.event,this._onDidChangeConfiguration=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidChangeConfiguration=this._onDidChangeConfiguration.event,this._onDidChangeModel=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidChangeModel=this._onDidChangeModel.event,this._onDidChangeCursorPosition=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidChangeCursorPosition=this._onDidChangeCursorPosition.event,this._onDidChangeCursorSelection=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidChangeCursorSelection=this._onDidChangeCursorSelection.event,this._onDidAttemptReadOnlyEdit=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidAttemptReadOnlyEdit=this._onDidAttemptReadOnlyEdit.event,this._onDidLayoutChange=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidLayoutChange=this._onDidLayoutChange.event,this._editorTextFocus=this._register(new q2({deliveryQueue:this._deliveryQueue})),this.onDidFocusEditorText=this._editorTextFocus.onDidChangeToTrue,this.onDidBlurEditorText=this._editorTextFocus.onDidChangeToFalse,this._editorWidgetFocus=this._register(new q2({deliveryQueue:this._deliveryQueue})),this.onDidFocusEditorWidget=this._editorWidgetFocus.onDidChangeToTrue,this.onDidBlurEditorWidget=this._editorWidgetFocus.onDidChangeToFalse,this._onWillType=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onWillType=this._onWillType.event,this._onDidType=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidType=this._onDidType.event,this._onDidCompositionStart=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidCompositionStart=this._onDidCompositionStart.event,this._onDidCompositionEnd=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidCompositionEnd=this._onDidCompositionEnd.event,this._onDidPaste=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidPaste=this._onDidPaste.event,this._onMouseUp=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onMouseUp=this._onMouseUp.event,this._onMouseDown=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onMouseDown=this._onMouseDown.event,this._onMouseDrag=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onMouseDrag=this._onMouseDrag.event,this._onMouseDrop=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onMouseDrop=this._onMouseDrop.event,this._onMouseDropCanceled=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onMouseDropCanceled=this._onMouseDropCanceled.event,this._onDropIntoEditor=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDropIntoEditor=this._onDropIntoEditor.event,this._onContextMenu=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onContextMenu=this._onContextMenu.event,this._onMouseMove=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onMouseMove=this._onMouseMove.event,this._onMouseLeave=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onMouseLeave=this._onMouseLeave.event,this._onMouseWheel=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onMouseWheel=this._onMouseWheel.event,this._onKeyUp=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onKeyUp=this._onKeyUp.event,this._onKeyDown=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onKeyDown=this._onKeyDown.event,this._onDidContentSizeChange=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidContentSizeChange=this._onDidContentSizeChange.event,this._onDidScrollChange=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidScrollChange=this._onDidScrollChange.event,this._onDidChangeViewZones=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidChangeViewZones=this._onDidChangeViewZones.event,this._onDidChangeHiddenAreas=this._register(new O({deliveryQueue:this._deliveryQueue})),this.onDidChangeHiddenAreas=this._onDidChangeHiddenAreas.event,this._bannerDomNode=null,this._dropIntoEditorDecorations=this.createDecorationsCollection();const g=Object.assign({},t);this._domElement=e,this._overflowWidgetsDomNode=g.overflowWidgetsDomNode,delete g.overflowWidgetsDomNode,this._id=++Uq,this._decorationTypeKeysToIds={},this._decorationTypeSubtypes={},this._telemetryData=i.telemetryData,this._configuration=this._register(this._createConfiguration(i.isSimpleWidget||!1,g,d)),this._register(this._configuration.onDidChange(b=>{this._onDidChangeConfiguration.fire(b);const v=this._configuration.options;if(b.hasChanged(133)){const C=v.get(133);this._onDidLayoutChange.fire(C)}})),this._contextKeyService=this._register(a.createScoped(this._domElement)),this._notificationService=c,this._codeEditorService=s,this._commandService=r,this._themeService=l,this._register(new jq(this,this._contextKeyService)),this._register(new Kq(this,this._contextKeyService,u)),this._instantiationService=n.createChild(new c1([xe,this._contextKeyService])),this._modelData=null,this._contributions={},this._actions={},this._focusTracker=new qq(e),this._register(this._focusTracker.onChange(()=>{this._editorWidgetFocus.setValue(this._focusTracker.hasFocus())})),this._contentWidgets={},this._overlayWidgets={};let f;Array.isArray(i.contributions)?f=i.contributions:f=_d.getEditorContributions();for(const b of f){if(this._contributions[b.id]){Ee(new Error(`Cannot have two contributions with the same id ${b.id}`));continue}try{const v=this._instantiationService.createInstance(b.ctor,this);this._contributions[b.id]=v}catch(v){Ee(v)}}_d.getEditorActions().forEach(b=>{if(this._actions[b.id]){Ee(new Error(`Cannot have two actions with the same id ${b.id}`));return}const v=new M4(b.id,b.label,b.alias,Na(b.precondition),()=>this._instantiationService.invokeFunction(C=>Promise.resolve(b.runEditorCommand(C,this,null))),this._contextKeyService);this._actions[v.id]=v});const _=()=>!this._configuration.options.get(83)&&this._configuration.options.get(32).enabled;this._register(new wB(this._domElement,{onDragEnter:()=>{},onDragOver:b=>{if(!_())return;const v=this.getTargetAtClientPoint(b.clientX,b.clientY);v!=null&&v.position&&this.showDropIndicatorAt(v.position)},onDrop:b=>zq(this,void 0,void 0,function*(){if(!_()||(this.removeDropIndicator(),!b.dataTransfer))return;const v=this.getTargetAtClientPoint(b.clientX,b.clientY);v!=null&&v.position&&this._onDropIntoEditor.fire({position:v.position,event:b})}),onDragLeave:()=>{this.removeDropIndicator()},onDragEnd:()=>{this.removeDropIndicator()}})),this._codeEditorService.addCodeEditor(this)}get isSimpleWidget(){return this._configuration.isSimpleWidget}_createConfiguration(e,t,i){return new Wy(e,t,this._domElement,i)}getId(){return this.getEditorType()+\":\"+this._id}getEditorType(){return r1.ICodeEditor}dispose(){this._codeEditorService.removeCodeEditor(this),this._focusTracker.dispose();const e=Object.keys(this._contributions);for(let t=0,i=e.length;t<i;t++){const n=e[t];this._contributions[n].dispose()}this._contributions={},this._actions={},this._contentWidgets={},this._overlayWidgets={},this._removeDecorationTypes(),this._postDetachModelCleanup(this._detachModel()),this._onDidDispose.fire(),super.dispose()}invokeWithinContext(e){return this._instantiationService.invokeFunction(e)}updateOptions(e){this._configuration.updateOptions(e||{})}getOptions(){return this._configuration.options}getOption(e){return this._configuration.options.get(e)}getRawOptions(){return this._configuration.getRawOptions()}getOverflowWidgetsDomNode(){return this._overflowWidgetsDomNode}getConfiguredWordAtPosition(e){return this._modelData?Qe.getWordAtPosition(this._modelData.model,this._configuration.options.get(119),e):null}getValue(e=null){if(!this._modelData)return\"\";const t=!!(e&&e.preserveBOM);let i=0;return e&&e.lineEnding&&e.lineEnding===`\n`?i=1:e&&e.lineEnding&&e.lineEnding===`\\r\n`&&(i=2),this._modelData.model.getValue(i,t)}setValue(e){!this._modelData||this._modelData.model.setValue(e)}getModel(){return this._modelData?this._modelData.model:null}setModel(e=null){const t=e;if(this._modelData===null&&t===null||this._modelData&&this._modelData.model===t)return;const i=this.hasTextFocus(),n=this._detachModel();this._attachModel(t),i&&this.hasModel()&&this.focus();const s={oldModelUrl:n?n.uri:null,newModelUrl:t?t.uri:null};this._removeDecorationTypes(),this._onDidChangeModel.fire(s),this._postDetachModelCleanup(n)}_removeDecorationTypes(){if(this._decorationTypeKeysToIds={},this._decorationTypeSubtypes){for(const e in this._decorationTypeSubtypes){const t=this._decorationTypeSubtypes[e];for(const i in t)this._removeDecorationType(e+\"-\"+i)}this._decorationTypeSubtypes={}}}getVisibleRanges(){return this._modelData?this._modelData.viewModel.getVisibleRanges():[]}getVisibleRangesPlusViewportAboveBelow(){return this._modelData?this._modelData.viewModel.getVisibleRangesPlusViewportAboveBelow():[]}getWhitespaces(){return this._modelData?this._modelData.viewModel.viewLayout.getWhitespaces():[]}static _getVerticalOffsetAfterPosition(e,t,i,n){const s=e.model.validatePosition({lineNumber:t,column:i}),r=e.viewModel.coordinatesConverter.convertModelPositionToViewPosition(s);return e.viewModel.viewLayout.getVerticalOffsetAfterLineNumber(r.lineNumber,n)}getTopForLineNumber(e,t=!1){return this._modelData?Qh._getVerticalOffsetForPosition(this._modelData,e,1,t):-1}getTopForPosition(e,t){return this._modelData?Qh._getVerticalOffsetForPosition(this._modelData,e,t,!1):-1}static _getVerticalOffsetForPosition(e,t,i,n=!1){const s=e.model.validatePosition({lineNumber:t,column:i}),r=e.viewModel.coordinatesConverter.convertModelPositionToViewPosition(s);return e.viewModel.viewLayout.getVerticalOffsetForLineNumber(r.lineNumber,n)}getBottomForLineNumber(e,t=!1){return this._modelData?Qh._getVerticalOffsetAfterPosition(this._modelData,e,1,t):-1}setHiddenAreas(e){var t;(t=this._modelData)===null||t===void 0||t.viewModel.setHiddenAreas(e.map(i=>L.lift(i)))}getVisibleColumnFromPosition(e){if(!this._modelData)return e.column;const t=this._modelData.model.validatePosition(e),i=this._modelData.model.getOptions().tabSize;return _i.visibleColumnFromColumn(this._modelData.model.getLineContent(t.lineNumber),t.column,i)+1}getPosition(){return this._modelData?this._modelData.viewModel.getPosition():null}setPosition(e,t=\"api\"){if(!!this._modelData){if(!B.isIPosition(e))throw new Error(\"Invalid arguments\");this._modelData.viewModel.setSelections(t,[{selectionStartLineNumber:e.lineNumber,selectionStartColumn:e.column,positionLineNumber:e.lineNumber,positionColumn:e.column}])}}_sendRevealRange(e,t,i,n){if(!this._modelData)return;if(!L.isIRange(e))throw new Error(\"Invalid arguments\");const s=this._modelData.model.validateRange(e),r=this._modelData.viewModel.coordinatesConverter.convertModelRangeToViewRange(s);this._modelData.viewModel.revealRange(\"api\",i,r,t,n)}revealLine(e,t=0){this._revealLine(e,0,t)}revealLineInCenter(e,t=0){this._revealLine(e,1,t)}revealLineInCenterIfOutsideViewport(e,t=0){this._revealLine(e,2,t)}revealLineNearTop(e,t=0){this._revealLine(e,5,t)}_revealLine(e,t,i){if(typeof e!=\"number\")throw new Error(\"Invalid arguments\");this._sendRevealRange(new L(e,1,e,1),t,!1,i)}revealPosition(e,t=0){this._revealPosition(e,0,!0,t)}revealPositionInCenter(e,t=0){this._revealPosition(e,1,!0,t)}revealPositionInCenterIfOutsideViewport(e,t=0){this._revealPosition(e,2,!0,t)}revealPositionNearTop(e,t=0){this._revealPosition(e,5,!0,t)}_revealPosition(e,t,i,n){if(!B.isIPosition(e))throw new Error(\"Invalid arguments\");this._sendRevealRange(new L(e.lineNumber,e.column,e.lineNumber,e.column),t,i,n)}getSelection(){return this._modelData?this._modelData.viewModel.getSelection():null}getSelections(){return this._modelData?this._modelData.viewModel.getSelections():null}setSelection(e,t=\"api\"){const i=oe.isISelection(e),n=L.isIRange(e);if(!i&&!n)throw new Error(\"Invalid arguments\");if(i)this._setSelectionImpl(e,t);else if(n){const s={selectionStartLineNumber:e.startLineNumber,selectionStartColumn:e.startColumn,positionLineNumber:e.endLineNumber,positionColumn:e.endColumn};this._setSelectionImpl(s,t)}}_setSelectionImpl(e,t){if(!this._modelData)return;const i=new oe(e.selectionStartLineNumber,e.selectionStartColumn,e.positionLineNumber,e.positionColumn);this._modelData.viewModel.setSelections(t,[i])}revealLines(e,t,i=0){this._revealLines(e,t,0,i)}revealLinesInCenter(e,t,i=0){this._revealLines(e,t,1,i)}revealLinesInCenterIfOutsideViewport(e,t,i=0){this._revealLines(e,t,2,i)}revealLinesNearTop(e,t,i=0){this._revealLines(e,t,5,i)}_revealLines(e,t,i,n){if(typeof e!=\"number\"||typeof t!=\"number\")throw new Error(\"Invalid arguments\");this._sendRevealRange(new L(e,1,t,1),i,!1,n)}revealRange(e,t=0,i=!1,n=!0){this._revealRange(e,i?1:0,n,t)}revealRangeInCenter(e,t=0){this._revealRange(e,1,!0,t)}revealRangeInCenterIfOutsideViewport(e,t=0){this._revealRange(e,2,!0,t)}revealRangeNearTop(e,t=0){this._revealRange(e,5,!0,t)}revealRangeNearTopIfOutsideViewport(e,t=0){this._revealRange(e,6,!0,t)}revealRangeAtTop(e,t=0){this._revealRange(e,3,!0,t)}_revealRange(e,t,i,n){if(!L.isIRange(e))throw new Error(\"Invalid arguments\");this._sendRevealRange(L.lift(e),t,i,n)}setSelections(e,t=\"api\",i=0){if(!!this._modelData){if(!e||e.length===0)throw new Error(\"Invalid arguments\");for(let n=0,s=e.length;n<s;n++)if(!oe.isISelection(e[n]))throw new Error(\"Invalid arguments\");this._modelData.viewModel.setSelections(t,e,i)}}getContentWidth(){return this._modelData?this._modelData.viewModel.viewLayout.getContentWidth():-1}getScrollWidth(){return this._modelData?this._modelData.viewModel.viewLayout.getScrollWidth():-1}getScrollLeft(){return this._modelData?this._modelData.viewModel.viewLayout.getCurrentScrollLeft():-1}getContentHeight(){return this._modelData?this._modelData.viewModel.viewLayout.getContentHeight():-1}getScrollHeight(){return this._modelData?this._modelData.viewModel.viewLayout.getScrollHeight():-1}getScrollTop(){return this._modelData?this._modelData.viewModel.viewLayout.getCurrentScrollTop():-1}setScrollLeft(e,t=1){if(!!this._modelData){if(typeof e!=\"number\")throw new Error(\"Invalid arguments\");this._modelData.viewModel.viewLayout.setScrollPosition({scrollLeft:e},t)}}setScrollTop(e,t=1){if(!!this._modelData){if(typeof e!=\"number\")throw new Error(\"Invalid arguments\");this._modelData.viewModel.viewLayout.setScrollPosition({scrollTop:e},t)}}setScrollPosition(e,t=1){!this._modelData||this._modelData.viewModel.viewLayout.setScrollPosition(e,t)}saveViewState(){if(!this._modelData)return null;const e={},t=Object.keys(this._contributions);for(const s of t){const r=this._contributions[s];typeof r.saveViewState==\"function\"&&(e[s]=r.saveViewState())}const i=this._modelData.viewModel.saveCursorState(),n=this._modelData.viewModel.saveState();return{cursorState:i,viewState:n,contributionsState:e}}restoreViewState(e){if(!this._modelData||!this._modelData.hasRealView)return;const t=e;if(t&&t.cursorState&&t.viewState){const i=t.cursorState;Array.isArray(i)?i.length>0&&this._modelData.viewModel.restoreCursorState(i):this._modelData.viewModel.restoreCursorState([i]);const n=t.contributionsState||{},s=Object.keys(this._contributions);for(let a=0,l=s.length;a<l;a++){const c=s[a],d=this._contributions[c];typeof d.restoreViewState==\"function\"&&d.restoreViewState(n[c])}const r=this._modelData.viewModel.reduceRestoreState(t.viewState);this._modelData.view.restoreState(r)}}getContribution(e){return this._contributions[e]||null}getActions(){const e=[],t=Object.keys(this._actions);for(let i=0,n=t.length;i<n;i++){const s=t[i];e.push(this._actions[s])}return e}getSupportedActions(){let e=this.getActions();return e=e.filter(t=>t.isSupported()),e}getAction(e){return this._actions[e]||null}trigger(e,t,i){switch(i=i||{},t){case\"compositionStart\":this._startComposition();return;case\"compositionEnd\":this._endComposition(e);return;case\"type\":{const s=i;this._type(e,s.text||\"\");return}case\"replacePreviousChar\":{const s=i;this._compositionType(e,s.text||\"\",s.replaceCharCnt||0,0,0);return}case\"compositionType\":{const s=i;this._compositionType(e,s.text||\"\",s.replacePrevCharCnt||0,s.replaceNextCharCnt||0,s.positionDelta||0);return}case\"paste\":{const s=i;this._paste(e,s.text||\"\",s.pasteOnNewLine||!1,s.multicursorText||null,s.mode||null);return}case\"cut\":this._cut(e);return}const n=this.getAction(t);if(n){Promise.resolve(n.run()).then(void 0,Ee);return}!this._modelData||this._triggerEditorCommand(e,t,i)||this._triggerCommand(t,i)}_triggerCommand(e,t){this._commandService.executeCommand(e,t)}_startComposition(){!this._modelData||(this._modelData.viewModel.startComposition(),this._onDidCompositionStart.fire())}_endComposition(e){!this._modelData||(this._modelData.viewModel.endComposition(e),this._onDidCompositionEnd.fire())}_type(e,t){!this._modelData||t.length===0||(e===\"keyboard\"&&this._onWillType.fire(t),this._modelData.viewModel.type(t,e),e===\"keyboard\"&&this._onDidType.fire(t))}_compositionType(e,t,i,n,s){!this._modelData||this._modelData.viewModel.compositionType(t,i,n,s,e)}_paste(e,t,i,n,s){if(!this._modelData||t.length===0)return;const r=this._modelData.viewModel,a=r.getSelection().getStartPosition();r.paste(t,i,n,e);const l=r.getSelection().getStartPosition();e===\"keyboard\"&&this._onDidPaste.fire({range:new L(a.lineNumber,a.column,l.lineNumber,l.column),languageId:s})}_cut(e){!this._modelData||this._modelData.viewModel.cut(e)}_triggerEditorCommand(e,t,i){const n=_d.getEditorCommand(t);return n?(i=i||{},i.source=e,this._instantiationService.invokeFunction(s=>{Promise.resolve(n.runEditorCommand(s,this,i)).then(void 0,Ee)}),!0):!1}_getViewModel(){return this._modelData?this._modelData.viewModel:null}pushUndoStop(){return!this._modelData||this._configuration.options.get(83)?!1:(this._modelData.model.pushStackElement(),!0)}popUndoStop(){return!this._modelData||this._configuration.options.get(83)?!1:(this._modelData.model.popStackElement(),!0)}executeEdits(e,t,i){if(!this._modelData||this._configuration.options.get(83))return!1;let n;return i?Array.isArray(i)?n=()=>i:n=i:n=()=>null,this._modelData.viewModel.executeEdits(e,t,n),!0}executeCommand(e,t){!this._modelData||this._modelData.viewModel.executeCommand(t,e)}executeCommands(e,t){!this._modelData||this._modelData.viewModel.executeCommands(t,e)}createDecorationsCollection(e){return new Gq(this,e)}changeDecorations(e){return this._modelData?this._modelData.model.changeDecorations(e,this._id):null}getLineDecorations(e){return this._modelData?this._modelData.model.getLineDecorations(e,this._id,G0(this._configuration.options)):null}getDecorationsInRange(e){return this._modelData?this._modelData.model.getDecorationsInRange(e,this._id,G0(this._configuration.options)):null}deltaDecorations(e,t){return this._modelData?e.length===0&&t.length===0?e:this._modelData.model.deltaDecorations(e,t,this._id):[]}removeDecorations(e){!this._modelData||e.length===0||this._modelData.model.changeDecorations(t=>{t.deltaDecorations(e,[])})}removeDecorationsByType(e){const t=this._decorationTypeKeysToIds[e];t&&this.deltaDecorations(t,[]),this._decorationTypeKeysToIds.hasOwnProperty(e)&&delete this._decorationTypeKeysToIds[e],this._decorationTypeSubtypes.hasOwnProperty(e)&&delete this._decorationTypeSubtypes[e]}getLayoutInfo(){return this._configuration.options.get(133)}createOverviewRuler(e){return!this._modelData||!this._modelData.hasRealView?null:this._modelData.view.createOverviewRuler(e)}getContainerDomNode(){return this._domElement}getDomNode(){return!this._modelData||!this._modelData.hasRealView?null:this._modelData.view.domNode.domNode}delegateVerticalScrollbarPointerDown(e){!this._modelData||!this._modelData.hasRealView||this._modelData.view.delegateVerticalScrollbarPointerDown(e)}layout(e){this._configuration.observeContainer(e),this.render()}focus(){!this._modelData||!this._modelData.hasRealView||this._modelData.view.focus()}hasTextFocus(){return!this._modelData||!this._modelData.hasRealView?!1:this._modelData.view.isFocused()}hasWidgetFocus(){return this._focusTracker&&this._focusTracker.hasFocus()}addContentWidget(e){const t={widget:e,position:e.getPosition()};this._contentWidgets.hasOwnProperty(e.getId())&&console.warn(\"Overwriting a content widget with the same id.\"),this._contentWidgets[e.getId()]=t,this._modelData&&this._modelData.hasRealView&&this._modelData.view.addContentWidget(t)}layoutContentWidget(e){const t=e.getId();if(this._contentWidgets.hasOwnProperty(t)){const i=this._contentWidgets[t];i.position=e.getPosition(),this._modelData&&this._modelData.hasRealView&&this._modelData.view.layoutContentWidget(i)}}removeContentWidget(e){const t=e.getId();if(this._contentWidgets.hasOwnProperty(t)){const i=this._contentWidgets[t];delete this._contentWidgets[t],this._modelData&&this._modelData.hasRealView&&this._modelData.view.removeContentWidget(i)}}addOverlayWidget(e){const t={widget:e,position:e.getPosition()};this._overlayWidgets.hasOwnProperty(e.getId())&&console.warn(\"Overwriting an overlay widget with the same id.\"),this._overlayWidgets[e.getId()]=t,this._modelData&&this._modelData.hasRealView&&this._modelData.view.addOverlayWidget(t)}layoutOverlayWidget(e){const t=e.getId();if(this._overlayWidgets.hasOwnProperty(t)){const i=this._overlayWidgets[t];i.position=e.getPosition(),this._modelData&&this._modelData.hasRealView&&this._modelData.view.layoutOverlayWidget(i)}}removeOverlayWidget(e){const t=e.getId();if(this._overlayWidgets.hasOwnProperty(t)){const i=this._overlayWidgets[t];delete this._overlayWidgets[t],this._modelData&&this._modelData.hasRealView&&this._modelData.view.removeOverlayWidget(i)}}changeViewZones(e){!this._modelData||!this._modelData.hasRealView||this._modelData.view.change(e)}getTargetAtClientPoint(e,t){return!this._modelData||!this._modelData.hasRealView?null:this._modelData.view.getTargetAtClientPoint(e,t)}getScrolledVisiblePosition(e){if(!this._modelData||!this._modelData.hasRealView)return null;const t=this._modelData.model.validatePosition(e),i=this._configuration.options,n=i.get(133),s=Qh._getVerticalOffsetForPosition(this._modelData,t.lineNumber,t.column)-this.getScrollTop(),r=this._modelData.view.getOffsetForColumn(t.lineNumber,t.column)+n.glyphMarginWidth+n.lineNumbersWidth+n.decorationsWidth-this.getScrollLeft();return{top:s,left:r,height:i.get(61)}}getOffsetForColumn(e,t){return!this._modelData||!this._modelData.hasRealView?-1:this._modelData.view.getOffsetForColumn(e,t)}render(e=!1){!this._modelData||!this._modelData.hasRealView||this._modelData.view.render(!0,e)}setAriaOptions(e){!this._modelData||!this._modelData.hasRealView||this._modelData.view.setAriaOptions(e)}applyFontInfo(e){tn(e,this._configuration.options.get(46))}setBanner(e,t){this._bannerDomNode&&this._domElement.contains(this._bannerDomNode)&&this._domElement.removeChild(this._bannerDomNode),this._bannerDomNode=e,this._configuration.setReservedHeight(e?t:0),this._bannerDomNode&&this._domElement.prepend(this._bannerDomNode)}_attachModel(e){if(!e){this._modelData=null;return}const t=[];this._domElement.setAttribute(\"data-mode-id\",e.getLanguageId()),this._configuration.setIsDominatedByLongLines(e.isDominatedByLongLines()),this._configuration.setModelLineCount(e.getLineCount()),e.onBeforeAttached();const i=new Mq(this._id,this._configuration,e,QI.create(),XI.create(this._configuration.options),r=>Go(r),this.languageConfigurationService,this._themeService);t.push(e.onWillDispose(()=>this.setModel(null))),t.push(i.onEvent(r=>{switch(r.kind){case 0:this._onDidContentSizeChange.fire(r);break;case 1:this._editorTextFocus.setValue(r.hasFocus);break;case 2:this._onDidScrollChange.fire(r);break;case 3:this._onDidChangeViewZones.fire();break;case 4:this._onDidChangeHiddenAreas.fire();break;case 5:this._onDidAttemptReadOnlyEdit.fire();break;case 6:{r.reachedMaxCursorCount&&this._notificationService.warn(p(\"cursors.maximum\",\"The number of cursors has been limited to {0}.\",ug.MAX_CURSOR_COUNT));const a=[];for(let d=0,h=r.selections.length;d<h;d++)a[d]=r.selections[d].getPosition();const l={position:a[0],secondaryPositions:a.slice(1),reason:r.reason,source:r.source};this._onDidChangeCursorPosition.fire(l);const c={selection:r.selections[0],secondarySelections:r.selections.slice(1),modelVersionId:r.modelVersionId,oldSelections:r.oldSelections,oldModelVersionId:r.oldModelVersionId,source:r.source,reason:r.reason};this._onDidChangeCursorSelection.fire(c);break}case 7:this._onDidChangeModelDecorations.fire(r.event);break;case 8:this._domElement.setAttribute(\"data-mode-id\",e.getLanguageId()),this._onDidChangeModelLanguage.fire(r.event);break;case 9:this._onDidChangeModelLanguageConfiguration.fire(r.event);break;case 10:this._onDidChangeModelContent.fire(r.event);break;case 11:this._onDidChangeModelOptions.fire(r.event);break;case 12:this._onDidChangeModelTokens.fire(r.event);break}}));const[n,s]=this._createView(i);if(s){this._domElement.appendChild(n.domNode.domNode);let r=Object.keys(this._contentWidgets);for(let a=0,l=r.length;a<l;a++){const c=r[a];n.addContentWidget(this._contentWidgets[c])}r=Object.keys(this._overlayWidgets);for(let a=0,l=r.length;a<l;a++){const c=r[a];n.addOverlayWidget(this._overlayWidgets[c])}n.render(!1,!0),n.domNode.domNode.setAttribute(\"data-uri\",e.uri.toString())}this._modelData=new $q(e,i,n,s,t)}_createView(e){let t;this.isSimpleWidget?t={paste:(s,r,a,l)=>{this._paste(\"keyboard\",s,r,a,l)},type:s=>{this._type(\"keyboard\",s)},compositionType:(s,r,a,l)=>{this._compositionType(\"keyboard\",s,r,a,l)},startComposition:()=>{this._startComposition()},endComposition:()=>{this._endComposition(\"keyboard\")},cut:()=>{this._cut(\"keyboard\")}}:t={paste:(s,r,a,l)=>{const c={text:s,pasteOnNewLine:r,multicursorText:a,mode:l};this._commandService.executeCommand(\"paste\",c)},type:s=>{const r={text:s};this._commandService.executeCommand(\"type\",r)},compositionType:(s,r,a,l)=>{if(a||l){const c={text:s,replacePrevCharCnt:r,replaceNextCharCnt:a,positionDelta:l};this._commandService.executeCommand(\"compositionType\",c)}else{const c={text:s,replaceCharCnt:r};this._commandService.executeCommand(\"replacePreviousChar\",c)}},startComposition:()=>{this._commandService.executeCommand(\"compositionStart\",{})},endComposition:()=>{this._commandService.executeCommand(\"compositionEnd\",{})},cut:()=>{this._commandService.executeCommand(\"cut\",{})}};const i=new n1(e.coordinatesConverter);return i.onKeyDown=s=>this._onKeyDown.fire(s),i.onKeyUp=s=>this._onKeyUp.fire(s),i.onContextMenu=s=>this._onContextMenu.fire(s),i.onMouseMove=s=>this._onMouseMove.fire(s),i.onMouseLeave=s=>this._onMouseLeave.fire(s),i.onMouseDown=s=>this._onMouseDown.fire(s),i.onMouseUp=s=>this._onMouseUp.fire(s),i.onMouseDrag=s=>this._onMouseDrag.fire(s),i.onMouseDrop=s=>this._onMouseDrop.fire(s),i.onMouseDropCanceled=s=>this._onMouseDropCanceled.fire(s),i.onMouseWheel=s=>this._onMouseWheel.fire(s),[new bj(t,this._configuration,this._themeService.getColorTheme(),e,i,this._overflowWidgetsDomNode),!0]}_postDetachModelCleanup(e){e==null||e.removeAllDecorationsWithOwnerId(this._id)}_detachModel(){if(!this._modelData)return null;const e=this._modelData.model,t=this._modelData.hasRealView?this._modelData.view.domNode.domNode:null;return this._modelData.dispose(),this._modelData=null,this._domElement.removeAttribute(\"data-mode-id\"),t&&this._domElement.contains(t)&&this._domElement.removeChild(t),this._bannerDomNode&&this._domElement.contains(this._bannerDomNode)&&this._domElement.removeChild(this._bannerDomNode),e}_removeDecorationType(e){this._codeEditorService.removeDecorationType(e)}hasModel(){return this._modelData!==null}showDropIndicatorAt(e){const t=[{range:new L(e.lineNumber,e.column,e.lineNumber,e.column),options:Qh.dropIntoEditorDecorationOptions}];this._dropIntoEditorDecorations.set(t),this.revealPosition(e,1)}removeDropIndicator(){this._dropIntoEditorDecorations.clear()}};fg.dropIntoEditorDecorationOptions=Ie.register({description:\"workbench-dnd-target\",className:\"dnd-target\"});fg=Hq([da(3,Re),da(4,dt),da(5,Ci),da(6,xe),da(7,vt),da(8,gi),da(9,ll),da(10,ti),da(11,ue)],fg);class q2 extends z{constructor(e){super(),this._emitterOptions=e,this._onDidChangeToTrue=this._register(new O(this._emitterOptions)),this.onDidChangeToTrue=this._onDidChangeToTrue.event,this._onDidChangeToFalse=this._register(new O(this._emitterOptions)),this.onDidChangeToFalse=this._onDidChangeToFalse.event,this._value=0}setValue(e){const t=e?2:1;this._value!==t&&(this._value=t,this._value===2?this._onDidChangeToTrue.fire():this._value===1&&this._onDidChangeToFalse.fire())}}class jq extends z{constructor(e,t){super(),this._editor=e,t.createKey(\"editorId\",e.getId()),this._editorSimpleInput=T.editorSimpleInput.bindTo(t),this._editorFocus=T.focus.bindTo(t),this._textInputFocus=T.textInputFocus.bindTo(t),this._editorTextFocus=T.editorTextFocus.bindTo(t),this._editorTabMovesFocus=T.tabMovesFocus.bindTo(t),this._editorReadonly=T.readOnly.bindTo(t),this._inDiffEditor=T.inDiffEditor.bindTo(t),this._editorColumnSelection=T.columnSelection.bindTo(t),this._hasMultipleSelections=T.hasMultipleSelections.bindTo(t),this._hasNonEmptySelection=T.hasNonEmptySelection.bindTo(t),this._canUndo=T.canUndo.bindTo(t),this._canRedo=T.canRedo.bindTo(t),this._register(this._editor.onDidChangeConfiguration(()=>this._updateFromConfig())),this._register(this._editor.onDidChangeCursorSelection(()=>this._updateFromSelection())),this._register(this._editor.onDidFocusEditorWidget(()=>this._updateFromFocus())),this._register(this._editor.onDidBlurEditorWidget(()=>this._updateFromFocus())),this._register(this._editor.onDidFocusEditorText(()=>this._updateFromFocus())),this._register(this._editor.onDidBlurEditorText(()=>this._updateFromFocus())),this._register(this._editor.onDidChangeModel(()=>this._updateFromModel())),this._register(this._editor.onDidChangeConfiguration(()=>this._updateFromModel())),this._updateFromConfig(),this._updateFromSelection(),this._updateFromFocus(),this._updateFromModel(),this._editorSimpleInput.set(this._editor.isSimpleWidget)}_updateFromConfig(){const e=this._editor.getOptions();this._editorTabMovesFocus.set(e.get(132)),this._editorReadonly.set(e.get(83)),this._inDiffEditor.set(e.get(56)),this._editorColumnSelection.set(e.get(18))}_updateFromSelection(){const e=this._editor.getSelections();e?(this._hasMultipleSelections.set(e.length>1),this._hasNonEmptySelection.set(e.some(t=>!t.isEmpty()))):(this._hasMultipleSelections.reset(),this._hasNonEmptySelection.reset())}_updateFromFocus(){this._editorFocus.set(this._editor.hasWidgetFocus()&&!this._editor.isSimpleWidget),this._editorTextFocus.set(this._editor.hasTextFocus()&&!this._editor.isSimpleWidget),this._textInputFocus.set(this._editor.hasTextFocus())}_updateFromModel(){const e=this._editor.getModel();this._canUndo.set(Boolean(e&&e.canUndo())),this._canRedo.set(Boolean(e&&e.canRedo()))}}class Kq extends z{constructor(e,t,i){super(),this._editor=e,this._contextKeyService=t,this._languageFeaturesService=i,this._langId=T.languageId.bindTo(t),this._hasCompletionItemProvider=T.hasCompletionItemProvider.bindTo(t),this._hasCodeActionsProvider=T.hasCodeActionsProvider.bindTo(t),this._hasCodeLensProvider=T.hasCodeLensProvider.bindTo(t),this._hasDefinitionProvider=T.hasDefinitionProvider.bindTo(t),this._hasDeclarationProvider=T.hasDeclarationProvider.bindTo(t),this._hasImplementationProvider=T.hasImplementationProvider.bindTo(t),this._hasTypeDefinitionProvider=T.hasTypeDefinitionProvider.bindTo(t),this._hasHoverProvider=T.hasHoverProvider.bindTo(t),this._hasDocumentHighlightProvider=T.hasDocumentHighlightProvider.bindTo(t),this._hasDocumentSymbolProvider=T.hasDocumentSymbolProvider.bindTo(t),this._hasReferenceProvider=T.hasReferenceProvider.bindTo(t),this._hasRenameProvider=T.hasRenameProvider.bindTo(t),this._hasSignatureHelpProvider=T.hasSignatureHelpProvider.bindTo(t),this._hasInlayHintsProvider=T.hasInlayHintsProvider.bindTo(t),this._hasDocumentFormattingProvider=T.hasDocumentFormattingProvider.bindTo(t),this._hasDocumentSelectionFormattingProvider=T.hasDocumentSelectionFormattingProvider.bindTo(t),this._hasMultipleDocumentFormattingProvider=T.hasMultipleDocumentFormattingProvider.bindTo(t),this._hasMultipleDocumentSelectionFormattingProvider=T.hasMultipleDocumentSelectionFormattingProvider.bindTo(t),this._isInWalkThrough=T.isInWalkThroughSnippet.bindTo(t);const n=()=>this._update();this._register(e.onDidChangeModel(n)),this._register(e.onDidChangeModelLanguage(n)),this._register(i.completionProvider.onDidChange(n)),this._register(i.codeActionProvider.onDidChange(n)),this._register(i.codeLensProvider.onDidChange(n)),this._register(i.definitionProvider.onDidChange(n)),this._register(i.declarationProvider.onDidChange(n)),this._register(i.implementationProvider.onDidChange(n)),this._register(i.typeDefinitionProvider.onDidChange(n)),this._register(i.hoverProvider.onDidChange(n)),this._register(i.documentHighlightProvider.onDidChange(n)),this._register(i.documentSymbolProvider.onDidChange(n)),this._register(i.referenceProvider.onDidChange(n)),this._register(i.renameProvider.onDidChange(n)),this._register(i.documentFormattingEditProvider.onDidChange(n)),this._register(i.documentRangeFormattingEditProvider.onDidChange(n)),this._register(i.signatureHelpProvider.onDidChange(n)),this._register(i.inlayHintsProvider.onDidChange(n)),n()}dispose(){super.dispose()}reset(){this._contextKeyService.bufferChangeEvents(()=>{this._langId.reset(),this._hasCompletionItemProvider.reset(),this._hasCodeActionsProvider.reset(),this._hasCodeLensProvider.reset(),this._hasDefinitionProvider.reset(),this._hasDeclarationProvider.reset(),this._hasImplementationProvider.reset(),this._hasTypeDefinitionProvider.reset(),this._hasHoverProvider.reset(),this._hasDocumentHighlightProvider.reset(),this._hasDocumentSymbolProvider.reset(),this._hasReferenceProvider.reset(),this._hasRenameProvider.reset(),this._hasDocumentFormattingProvider.reset(),this._hasDocumentSelectionFormattingProvider.reset(),this._hasSignatureHelpProvider.reset(),this._isInWalkThrough.reset()})}_update(){const e=this._editor.getModel();if(!e){this.reset();return}this._contextKeyService.bufferChangeEvents(()=>{this._langId.set(e.getLanguageId()),this._hasCompletionItemProvider.set(this._languageFeaturesService.completionProvider.has(e)),this._hasCodeActionsProvider.set(this._languageFeaturesService.codeActionProvider.has(e)),this._hasCodeLensProvider.set(this._languageFeaturesService.codeLensProvider.has(e)),this._hasDefinitionProvider.set(this._languageFeaturesService.definitionProvider.has(e)),this._hasDeclarationProvider.set(this._languageFeaturesService.declarationProvider.has(e)),this._hasImplementationProvider.set(this._languageFeaturesService.implementationProvider.has(e)),this._hasTypeDefinitionProvider.set(this._languageFeaturesService.typeDefinitionProvider.has(e)),this._hasHoverProvider.set(this._languageFeaturesService.hoverProvider.has(e)),this._hasDocumentHighlightProvider.set(this._languageFeaturesService.documentHighlightProvider.has(e)),this._hasDocumentSymbolProvider.set(this._languageFeaturesService.documentSymbolProvider.has(e)),this._hasReferenceProvider.set(this._languageFeaturesService.referenceProvider.has(e)),this._hasRenameProvider.set(this._languageFeaturesService.renameProvider.has(e)),this._hasSignatureHelpProvider.set(this._languageFeaturesService.signatureHelpProvider.has(e)),this._hasInlayHintsProvider.set(this._languageFeaturesService.inlayHintsProvider.has(e)),this._hasDocumentFormattingProvider.set(this._languageFeaturesService.documentFormattingEditProvider.has(e)||this._languageFeaturesService.documentRangeFormattingEditProvider.has(e)),this._hasDocumentSelectionFormattingProvider.set(this._languageFeaturesService.documentRangeFormattingEditProvider.has(e)),this._hasMultipleDocumentFormattingProvider.set(this._languageFeaturesService.documentFormattingEditProvider.all(e).length+this._languageFeaturesService.documentRangeFormattingEditProvider.all(e).length>1),this._hasMultipleDocumentSelectionFormattingProvider.set(this._languageFeaturesService.documentRangeFormattingEditProvider.all(e).length>1),this._isInWalkThrough.set(e.uri.scheme===Ne.walkThroughSnippet)})}}class qq extends z{constructor(e){super(),this._onChange=this._register(new O),this.onChange=this._onChange.event,this._hasFocus=!1,this._domFocusTracker=this._register(Ad(e)),this._register(this._domFocusTracker.onDidFocus(()=>{this._hasFocus=!0,this._onChange.fire(void 0)})),this._register(this._domFocusTracker.onDidBlur(()=>{this._hasFocus=!1,this._onChange.fire(void 0)}))}hasFocus(){return this._hasFocus}}class Gq{constructor(e,t){this._editor=e,this._decorationIds=[],this._isChangingDecorations=!1,Array.isArray(t)&&t.length>0&&this.set(t)}get length(){return this._decorationIds.length}onDidChange(e,t,i){return this._editor.onDidChangeModelDecorations(n=>{this._isChangingDecorations||e.call(t,n)},i)}getRange(e){return!this._editor.hasModel()||e>=this._decorationIds.length?null:this._editor.getModel().getDecorationRange(this._decorationIds[e])}getRanges(){if(!this._editor.hasModel())return[];const e=this._editor.getModel(),t=[];for(const i of this._decorationIds){const n=e.getDecorationRange(i);n&&t.push(n)}return t}has(e){return this._decorationIds.includes(e.id)}clear(){this._decorationIds.length!==0&&this.set([])}set(e){try{this._isChangingDecorations=!0,this._editor.changeDecorations(t=>{this._decorationIds=t.deltaDecorations(this._decorationIds,e)})}finally{this._isChangingDecorations=!1}}}const Zq=encodeURIComponent(\"<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 6 3' enable-background='new 0 0 6 3' height='3' width='6'><g fill='\"),Yq=encodeURIComponent(\"'><polygon points='5.5,0 2.5,3 1.1,3 4.1,0'/><polygon points='4,0 6,2 6,0.6 5.4,0'/><polygon points='0,2 1,3 2.4,3 0,0.6'/></g></svg>\");function iS(o){return Zq+encodeURIComponent(o.toString())+Yq}const Xq=encodeURIComponent('<svg xmlns=\"http://www.w3.org/2000/svg\" height=\"3\" width=\"12\"><g fill=\"'),Qq=encodeURIComponent('\"><circle cx=\"1\" cy=\"1\" r=\"1\"/><circle cx=\"5\" cy=\"1\" r=\"1\"/><circle cx=\"9\" cy=\"1\" r=\"1\"/></g></svg>');function Jq(o){return Xq+encodeURIComponent(o.toString())+Qq}Rt((o,e)=>{const t=o.getColor(ZP);t&&e.addRule(`.monaco-editor .squiggly-error { border-bottom: 4px double ${t}; }`);const i=o.getColor(Mr);i&&e.addRule(`.monaco-editor .squiggly-error { background: url(\"data:image/svg+xml,${iS(i)}\") repeat-x bottom left; }`);const n=o.getColor(LH);n&&e.addRule(`.monaco-editor .squiggly-error::before { display: block; content: ''; width: 100%; height: 100%; background: ${n}; }`);const s=o.getColor(og);s&&e.addRule(`.monaco-editor .squiggly-warning { border-bottom: 4px double ${s}; }`);const r=o.getColor(Cs);r&&e.addRule(`.monaco-editor .squiggly-warning { background: url(\"data:image/svg+xml,${iS(r)}\") repeat-x bottom left; }`);const a=o.getColor(DH);a&&e.addRule(`.monaco-editor .squiggly-warning::before { display: block; content: ''; width: 100%; height: 100%; background: ${a}; }`);const l=o.getColor(J0);l&&e.addRule(`.monaco-editor .squiggly-info { border-bottom: 4px double ${l}; }`);const c=o.getColor(Bn);c&&e.addRule(`.monaco-editor .squiggly-info { background: url(\"data:image/svg+xml,${iS(c)}\") repeat-x bottom left; }`);const d=o.getColor(kH);d&&e.addRule(`.monaco-editor .squiggly-info::before { display: block; content: ''; width: 100%; height: 100%; background: ${d}; }`);const h=o.getColor(IH);h&&e.addRule(`.monaco-editor .squiggly-hint { border-bottom: 2px dotted ${h}; }`);const u=o.getColor(xH);u&&e.addRule(`.monaco-editor .squiggly-hint { background: url(\"data:image/svg+xml,${Jq(u)}\") no-repeat bottom left; }`);const g=o.getColor(zU);g&&e.addRule(`.monaco-editor.showUnused .squiggly-inline-unnecessary { opacity: ${g.rgba.a}; }`);const f=o.getColor(HU);f&&e.addRule(`.monaco-editor.showUnused .squiggly-unnecessary { border-bottom: 2px dashed ${f}; }`);const _=o.getColor(ws)||\"inherit\";e.addRule(`.monaco-editor.showDeprecated .squiggly-inline-deprecated { text-decoration: line-through; text-decoration-color: ${_}}`)});class _t{constructor(e,t,i){const n=s=>this.emitter.fire(s);this.emitter=new O({onFirstListenerAdd:()=>e.addEventListener(t,n,i),onLastListenerRemove:()=>e.removeEventListener(t,n,i)})}get event(){return this.emitter.event}dispose(){this.emitter.dispose()}}function hL(o){return o.preventDefault(),o.stopPropagation(),o}var Ug=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s};const eG=!1;var pv;(function(o){o.North=\"north\",o.South=\"south\",o.East=\"east\",o.West=\"west\"})(pv||(pv={}));let tG=4;const iG=new O;let nG=300;const sG=new O;class JI{constructor(){this.disposables=new ee}get onPointerMove(){return this.disposables.add(new _t(window,\"mousemove\")).event}get onPointerUp(){return this.disposables.add(new _t(window,\"mouseup\")).event}dispose(){this.disposables.dispose()}}Ug([ui],JI.prototype,\"onPointerMove\",null);Ug([ui],JI.prototype,\"onPointerUp\",null);class eE{constructor(e){this.el=e,this.disposables=new ee}get onPointerMove(){return this.disposables.add(new _t(this.el,kt.Change)).event}get onPointerUp(){return this.disposables.add(new _t(this.el,kt.End)).event}dispose(){this.disposables.dispose()}}Ug([ui],eE.prototype,\"onPointerMove\",null);Ug([ui],eE.prototype,\"onPointerUp\",null);class mv{constructor(e){this.factory=e}get onPointerMove(){return this.factory.onPointerMove}get onPointerUp(){return this.factory.onPointerUp}dispose(){}}Ug([ui],mv.prototype,\"onPointerMove\",null);Ug([ui],mv.prototype,\"onPointerUp\",null);const G2=\"pointer-events-disabled\";class Zi extends z{constructor(e,t,i){super(),this.hoverDelay=nG,this.hoverDelayer=this._register(new $r(this.hoverDelay)),this._state=3,this.onDidEnablementChange=this._register(new O),this._onDidStart=this._register(new O),this._onDidChange=this._register(new O),this._onDidReset=this._register(new O),this._onDidEnd=this._register(new O),this.orthogonalStartSashDisposables=this._register(new ee),this.orthogonalStartDragHandleDisposables=this._register(new ee),this.orthogonalEndSashDisposables=this._register(new ee),this.orthogonalEndDragHandleDisposables=this._register(new ee),this.onDidStart=this._onDidStart.event,this.onDidChange=this._onDidChange.event,this.onDidReset=this._onDidReset.event,this.onDidEnd=this._onDidEnd.event,this.linkedSash=void 0,this.el=G(e,se(\".monaco-sash\")),i.orthogonalEdge&&this.el.classList.add(`orthogonal-edge-${i.orthogonalEdge}`),Ze&&this.el.classList.add(\"mac\");const n=this._register(new _t(this.el,\"mousedown\")).event;this._register(n(h=>this.onPointerStart(h,new JI),this));const s=this._register(new _t(this.el,\"dblclick\")).event;this._register(s(this.onPointerDoublePress,this));const r=this._register(new _t(this.el,\"mouseenter\")).event;this._register(r(()=>Zi.onMouseEnter(this)));const a=this._register(new _t(this.el,\"mouseleave\")).event;this._register(a(()=>Zi.onMouseLeave(this))),this._register(ut.addTarget(this.el));const l=pe.map(this._register(new _t(this.el,kt.Start)).event,h=>{var u;return Object.assign(Object.assign({},h),{target:(u=h.initialTarget)!==null&&u!==void 0?u:null})});this._register(l(h=>this.onPointerStart(h,new eE(this.el)),this));const c=this._register(new _t(this.el,kt.Tap)).event,d=pe.map(pe.filter(pe.debounce(c,(h,u)=>{var g;return{event:u,count:((g=h==null?void 0:h.count)!==null&&g!==void 0?g:0)+1}},250),({count:h})=>h===2),({event:h})=>{var u;return Object.assign(Object.assign({},h),{target:(u=h.initialTarget)!==null&&u!==void 0?u:null})});this._register(d(this.onPointerDoublePress,this)),typeof i.size==\"number\"?(this.size=i.size,i.orientation===0?this.el.style.width=`${this.size}px`:this.el.style.height=`${this.size}px`):(this.size=tG,this._register(iG.event(h=>{this.size=h,this.layout()}))),this._register(sG.event(h=>this.hoverDelay=h)),this.layoutProvider=t,this.orthogonalStartSash=i.orthogonalStartSash,this.orthogonalEndSash=i.orthogonalEndSash,this.orientation=i.orientation||0,this.orientation===1?(this.el.classList.add(\"horizontal\"),this.el.classList.remove(\"vertical\")):(this.el.classList.remove(\"horizontal\"),this.el.classList.add(\"vertical\")),this.el.classList.toggle(\"debug\",eG),this.layout()}get state(){return this._state}get orthogonalStartSash(){return this._orthogonalStartSash}get orthogonalEndSash(){return this._orthogonalEndSash}set state(e){this._state!==e&&(this.el.classList.toggle(\"disabled\",e===0),this.el.classList.toggle(\"minimum\",e===1),this.el.classList.toggle(\"maximum\",e===2),this._state=e,this.onDidEnablementChange.fire(e))}set orthogonalStartSash(e){if(this.orthogonalStartDragHandleDisposables.clear(),this.orthogonalStartSashDisposables.clear(),e){const t=i=>{this.orthogonalStartDragHandleDisposables.clear(),i!==0&&(this._orthogonalStartDragHandle=G(this.el,se(\".orthogonal-drag-handle.start\")),this.orthogonalStartDragHandleDisposables.add(ze(()=>this._orthogonalStartDragHandle.remove())),this.orthogonalStartDragHandleDisposables.add(new _t(this._orthogonalStartDragHandle,\"mouseenter\")).event(()=>Zi.onMouseEnter(e),void 0,this.orthogonalStartDragHandleDisposables),this.orthogonalStartDragHandleDisposables.add(new _t(this._orthogonalStartDragHandle,\"mouseleave\")).event(()=>Zi.onMouseLeave(e),void 0,this.orthogonalStartDragHandleDisposables))};this.orthogonalStartSashDisposables.add(e.onDidEnablementChange.event(t,this)),t(e.state)}this._orthogonalStartSash=e}set orthogonalEndSash(e){if(this.orthogonalEndDragHandleDisposables.clear(),this.orthogonalEndSashDisposables.clear(),e){const t=i=>{this.orthogonalEndDragHandleDisposables.clear(),i!==0&&(this._orthogonalEndDragHandle=G(this.el,se(\".orthogonal-drag-handle.end\")),this.orthogonalEndDragHandleDisposables.add(ze(()=>this._orthogonalEndDragHandle.remove())),this.orthogonalEndDragHandleDisposables.add(new _t(this._orthogonalEndDragHandle,\"mouseenter\")).event(()=>Zi.onMouseEnter(e),void 0,this.orthogonalEndDragHandleDisposables),this.orthogonalEndDragHandleDisposables.add(new _t(this._orthogonalEndDragHandle,\"mouseleave\")).event(()=>Zi.onMouseLeave(e),void 0,this.orthogonalEndDragHandleDisposables))};this.orthogonalEndSashDisposables.add(e.onDidEnablementChange.event(t,this)),t(e.state)}this._orthogonalEndSash=e}onPointerStart(e,t){ct.stop(e);let i=!1;if(!e.__orthogonalSashEvent){const f=this.getOrthogonalSash(e);f&&(i=!0,e.__orthogonalSashEvent=!0,f.onPointerStart(e,new mv(t)))}if(this.linkedSash&&!e.__linkedSashEvent&&(e.__linkedSashEvent=!0,this.linkedSash.onPointerStart(e,new mv(t))),!this.state)return;const n=bB(\"iframe\");for(const f of n)f.classList.add(G2);const s=e.pageX,r=e.pageY,a=e.altKey,l={startX:s,currentX:s,startY:r,currentY:r,altKey:a};this.el.classList.add(\"active\"),this._onDidStart.fire(l);const c=qs(this.el),d=()=>{let f=\"\";i?f=\"all-scroll\":this.orientation===1?this.state===1?f=\"s-resize\":this.state===2?f=\"n-resize\":f=Ze?\"row-resize\":\"ns-resize\":this.state===1?f=\"e-resize\":this.state===2?f=\"w-resize\":f=Ze?\"col-resize\":\"ew-resize\",c.textContent=`* { cursor: ${f} !important; }`},h=new ee;d(),i||this.onDidEnablementChange.event(d,null,h);const u=f=>{ct.stop(f,!1);const _={startX:s,currentX:f.pageX,startY:r,currentY:f.pageY,altKey:a};this._onDidChange.fire(_)},g=f=>{ct.stop(f,!1),this.el.removeChild(c),this.el.classList.remove(\"active\"),this._onDidEnd.fire(),h.dispose();for(const _ of n)_.classList.remove(G2)};t.onPointerMove(u,null,h),t.onPointerUp(g,null,h),h.add(t)}onPointerDoublePress(e){const t=this.getOrthogonalSash(e);t&&t._onDidReset.fire(),this.linkedSash&&this.linkedSash._onDidReset.fire(),this._onDidReset.fire()}static onMouseEnter(e,t=!1){e.el.classList.contains(\"active\")?(e.hoverDelayer.cancel(),e.el.classList.add(\"hover\")):e.hoverDelayer.trigger(()=>e.el.classList.add(\"hover\"),e.hoverDelay).then(void 0,()=>{}),!t&&e.linkedSash&&Zi.onMouseEnter(e.linkedSash,!0)}static onMouseLeave(e,t=!1){e.hoverDelayer.cancel(),e.el.classList.remove(\"hover\"),!t&&e.linkedSash&&Zi.onMouseLeave(e.linkedSash,!0)}clearSashHoverState(){Zi.onMouseLeave(this)}layout(){if(this.orientation===0){const e=this.layoutProvider;this.el.style.left=e.getVerticalSashLeft(this)-this.size/2+\"px\",e.getVerticalSashTop&&(this.el.style.top=e.getVerticalSashTop(this)+\"px\"),e.getVerticalSashHeight&&(this.el.style.height=e.getVerticalSashHeight(this)+\"px\")}else{const e=this.layoutProvider;this.el.style.top=e.getHorizontalSashTop(this)-this.size/2+\"px\",e.getHorizontalSashLeft&&(this.el.style.left=e.getHorizontalSashLeft(this)+\"px\"),e.getHorizontalSashWidth&&(this.el.style.width=e.getHorizontalSashWidth(this)+\"px\")}}getOrthogonalSash(e){if(!(!e.target||!(e.target instanceof HTMLElement))&&e.target.classList.contains(\"orthogonal-drag-handle\"))return e.target.classList.contains(\"start\")?this.orthogonalStartSash:this.orthogonalEndSash}dispose(){super.dispose(),this.el.remove()}}class uc{constructor(e,t,i){this._visiblePosition=e,this._visiblePositionScrollDelta=t,this._cursorPosition=i}static capture(e){let t=null,i=0;if(e.getScrollTop()!==0){const n=e.getVisibleRanges();if(n.length>0){t=n[0].getStartPosition();const s=e.getTopForPosition(t.lineNumber,t.column);i=e.getScrollTop()-s}}return new uc(t,i,e.getPosition())}restore(e){if(this._visiblePosition){const t=e.getTopForPosition(this._visiblePosition.lineNumber,this._visiblePosition.column);e.setScrollTop(t+this._visiblePositionScrollDelta)}}restoreRelativeVerticalPositionOfCursor(e){const t=e.getPosition();if(!this._cursorPosition||!t)return;const i=e.getTopForLineNumber(t.lineNumber)-e.getTopForLineNumber(this._cursorPosition.lineNumber);e.setScrollTop(e.getScrollTop()+i)}}const i_={RESOURCES:\"ResourceURLs\",DOWNLOAD_URL:\"DownloadURL\",FILES:\"Files\",TEXT:Pn.text},Wc={CurrentDragAndDropData:void 0};var Z2,Y2;class oG{constructor(){this._value=\"\",this._pos=0}reset(e){return this._value=e,this._pos=0,this}next(){return this._pos+=1,this}hasNext(){return this._pos<this._value.length-1}cmp(e){const t=e.charCodeAt(0),i=this._value.charCodeAt(this._pos);return t-i}value(){return this._value[this._pos]}}class rG{constructor(e=!0){this._caseSensitive=e}reset(e){return this._value=e,this._from=0,this._to=0,this.next()}hasNext(){return this._to<this._value.length}next(){this._from=this._to;let e=!0;for(;this._to<this._value.length;this._to++)if(this._value.charCodeAt(this._to)===46)if(e)this._from++;else break;else e=!1;return this}cmp(e){return this._caseSensitive?Ux(e,this._value,0,e.length,this._from,this._to):$m(e,this._value,0,e.length,this._from,this._to)}value(){return this._value.substring(this._from,this._to)}}class aG{constructor(e=!0,t=!0){this._splitOnBackslash=e,this._caseSensitive=t}reset(e){this._from=0,this._to=0,this._value=e,this._valueLen=e.length;for(let t=e.length-1;t>=0;t--,this._valueLen--){const i=this._value.charCodeAt(t);if(!(i===47||this._splitOnBackslash&&i===92))break}return this.next()}hasNext(){return this._to<this._valueLen}next(){this._from=this._to;let e=!0;for(;this._to<this._valueLen;this._to++){const t=this._value.charCodeAt(this._to);if(t===47||this._splitOnBackslash&&t===92)if(e)this._from++;else break;else e=!1}return this}cmp(e){return this._caseSensitive?Ux(e,this._value,0,e.length,this._from,this._to):$m(e,this._value,0,e.length,this._from,this._to)}value(){return this._value.substring(this._from,this._to)}}class lG{constructor(e,t){this._ignorePathCasing=e,this._ignoreQueryAndFragment=t,this._states=[],this._stateIdx=0}reset(e){return this._value=e,this._states=[],this._value.scheme&&this._states.push(1),this._value.authority&&this._states.push(2),this._value.path&&(this._pathIterator=new aG(!1,!this._ignorePathCasing(e)),this._pathIterator.reset(e.path),this._pathIterator.value()&&this._states.push(3)),this._ignoreQueryAndFragment(e)||(this._value.query&&this._states.push(4),this._value.fragment&&this._states.push(5)),this._stateIdx=0,this}next(){return this._states[this._stateIdx]===3&&this._pathIterator.hasNext()?this._pathIterator.next():this._stateIdx+=1,this}hasNext(){return this._states[this._stateIdx]===3&&this._pathIterator.hasNext()||this._stateIdx<this._states.length-1}cmp(e){if(this._states[this._stateIdx]===1)return ky(e,this._value.scheme);if(this._states[this._stateIdx]===2)return ky(e,this._value.authority);if(this._states[this._stateIdx]===3)return this._pathIterator.cmp(e);if(this._states[this._stateIdx]===4)return Ep(e,this._value.query);if(this._states[this._stateIdx]===5)return Ep(e,this._value.fragment);throw new Error}value(){if(this._states[this._stateIdx]===1)return this._value.scheme;if(this._states[this._stateIdx]===2)return this._value.authority;if(this._states[this._stateIdx]===3)return this._pathIterator.value();if(this._states[this._stateIdx]===4)return this._value.query;if(this._states[this._stateIdx]===5)return this._value.fragment;throw new Error}}class ob{constructor(){this.height=1}rotateLeft(){const e=this.right;return this.right=e.left,e.left=this,this.updateHeight(),e.updateHeight(),e}rotateRight(){const e=this.left;return this.left=e.right,e.right=this,this.updateHeight(),e.updateHeight(),e}updateHeight(){this.height=1+Math.max(this.heightLeft,this.heightRight)}balanceFactor(){return this.heightRight-this.heightLeft}get heightLeft(){var e,t;return(t=(e=this.left)===null||e===void 0?void 0:e.height)!==null&&t!==void 0?t:0}get heightRight(){var e,t;return(t=(e=this.right)===null||e===void 0?void 0:e.height)!==null&&t!==void 0?t:0}}class Wu{constructor(e){this._iter=e}static forUris(e=()=>!1,t=()=>!1){return new Wu(new lG(e,t))}static forStrings(){return new Wu(new oG)}static forConfigKeys(){return new Wu(new rG)}clear(){this._root=void 0}set(e,t){const i=this._iter.reset(e);let n;this._root||(this._root=new ob,this._root.segment=i.value());const s=[];for(n=this._root;;){const a=i.cmp(n.segment);if(a>0)n.left||(n.left=new ob,n.left.segment=i.value()),s.push([-1,n]),n=n.left;else if(a<0)n.right||(n.right=new ob,n.right.segment=i.value()),s.push([1,n]),n=n.right;else if(i.hasNext())i.next(),n.mid||(n.mid=new ob,n.mid.segment=i.value()),s.push([0,n]),n=n.mid;else break}const r=n.value;n.value=t,n.key=e;for(let a=s.length-1;a>=0;a--){const l=s[a][1];l.updateHeight();const c=l.balanceFactor();if(c<-1||c>1){const d=s[a][0],h=s[a+1][0];if(d===1&&h===1)s[a][1]=l.rotateLeft();else if(d===-1&&h===-1)s[a][1]=l.rotateRight();else if(d===1&&h===-1)l.right=s[a+1][1]=s[a+1][1].rotateRight(),s[a][1]=l.rotateLeft();else if(d===-1&&h===1)l.left=s[a+1][1]=s[a+1][1].rotateLeft(),s[a][1]=l.rotateRight();else throw new Error;if(a>0)switch(s[a-1][0]){case-1:s[a-1][1].left=s[a][1];break;case 1:s[a-1][1].right=s[a][1];break;case 0:s[a-1][1].mid=s[a][1];break}else this._root=s[0][1]}}return r}get(e){var t;return(t=this._getNode(e))===null||t===void 0?void 0:t.value}_getNode(e){const t=this._iter.reset(e);let i=this._root;for(;i;){const n=t.cmp(i.segment);if(n>0)i=i.left;else if(n<0)i=i.right;else if(t.hasNext())t.next(),i=i.mid;else break}return i}has(e){const t=this._getNode(e);return!((t==null?void 0:t.value)===void 0&&(t==null?void 0:t.mid)===void 0)}delete(e){return this._delete(e,!1)}deleteSuperstr(e){return this._delete(e,!0)}_delete(e,t){var i;const n=this._iter.reset(e),s=[];let r=this._root;for(;r;){const a=n.cmp(r.segment);if(a>0)s.push([-1,r]),r=r.left;else if(a<0)s.push([1,r]),r=r.right;else if(n.hasNext())n.next(),s.push([0,r]),r=r.mid;else break}if(!!r){if(t?(r.left=void 0,r.mid=void 0,r.right=void 0,r.height=1):(r.key=void 0,r.value=void 0),!r.mid&&!r.value)if(r.left&&r.right){const a=this._min(r.right),{key:l,value:c,segment:d}=a;this._delete(a.key,!1),r.key=l,r.value=c,r.segment=d}else{const a=(i=r.left)!==null&&i!==void 0?i:r.right;if(s.length>0){const[l,c]=s[s.length-1];switch(l){case-1:c.left=a;break;case 0:c.mid=a;break;case 1:c.right=a;break}}else this._root=a}for(let a=s.length-1;a>=0;a--){const l=s[a][1];l.updateHeight();const c=l.balanceFactor();if(c>1?(l.right.balanceFactor()>=0||(l.right=l.right.rotateRight()),s[a][1]=l.rotateLeft()):c<-1&&(l.left.balanceFactor()<=0||(l.left=l.left.rotateLeft()),s[a][1]=l.rotateRight()),a>0)switch(s[a-1][0]){case-1:s[a-1][1].left=s[a][1];break;case 1:s[a-1][1].right=s[a][1];break;case 0:s[a-1][1].mid=s[a][1];break}else this._root=s[0][1]}}}_min(e){for(;e.left;)e=e.left;return e}findSubstr(e){const t=this._iter.reset(e);let i=this._root,n;for(;i;){const s=t.cmp(i.segment);if(s>0)i=i.left;else if(s<0)i=i.right;else if(t.hasNext())t.next(),n=i.value||n,i=i.mid;else break}return i&&i.value||n}findSuperstr(e){const t=this._iter.reset(e);let i=this._root;for(;i;){const n=t.cmp(i.segment);if(n>0)i=i.left;else if(n<0)i=i.right;else if(t.hasNext())t.next(),i=i.mid;else return i.mid?this._entries(i.mid):void 0}}forEach(e){for(const[t,i]of this)e(i,t)}*[Symbol.iterator](){yield*this._entries(this._root)}_entries(e){const t=[];return this._dfsEntries(e,t),t[Symbol.iterator]()}_dfsEntries(e,t){!e||(e.left&&this._dfsEntries(e.left,t),e.value&&t.push([e.key,e.value]),e.mid&&this._dfsEntries(e.mid,t),e.right&&this._dfsEntries(e.right,t))}}class cG{constructor(e,t){this.uri=e,this.value=t}}class hn{constructor(e,t){this[Z2]=\"ResourceMap\",e instanceof hn?(this.map=new Map(e.map),this.toKey=t!=null?t:hn.defaultToKey):(this.map=new Map,this.toKey=e!=null?e:hn.defaultToKey)}set(e,t){return this.map.set(this.toKey(e),new cG(e,t)),this}get(e){var t;return(t=this.map.get(this.toKey(e)))===null||t===void 0?void 0:t.value}has(e){return this.map.has(this.toKey(e))}get size(){return this.map.size}clear(){this.map.clear()}delete(e){return this.map.delete(this.toKey(e))}forEach(e,t){typeof t!=\"undefined\"&&(e=e.bind(t));for(const[i,n]of this.map)e(n.value,n.uri,this)}*values(){for(const e of this.map.values())yield e.value}*keys(){for(const e of this.map.values())yield e.uri}*entries(){for(const e of this.map.values())yield[e.uri,e.value]}*[(Z2=Symbol.toStringTag,Symbol.iterator)](){for(const[,e]of this.map)yield[e.uri,e.value]}}hn.defaultToKey=o=>o.toString();class dG{constructor(){this[Y2]=\"LinkedMap\",this._map=new Map,this._head=void 0,this._tail=void 0,this._size=0,this._state=0}clear(){this._map.clear(),this._head=void 0,this._tail=void 0,this._size=0,this._state++}isEmpty(){return!this._head&&!this._tail}get size(){return this._size}get first(){var e;return(e=this._head)===null||e===void 0?void 0:e.value}get last(){var e;return(e=this._tail)===null||e===void 0?void 0:e.value}has(e){return this._map.has(e)}get(e,t=0){const i=this._map.get(e);if(!!i)return t!==0&&this.touch(i,t),i.value}set(e,t,i=0){let n=this._map.get(e);if(n)n.value=t,i!==0&&this.touch(n,i);else{switch(n={key:e,value:t,next:void 0,previous:void 0},i){case 0:this.addItemLast(n);break;case 1:this.addItemFirst(n);break;case 2:this.addItemLast(n);break;default:this.addItemLast(n);break}this._map.set(e,n),this._size++}return this}delete(e){return!!this.remove(e)}remove(e){const t=this._map.get(e);if(!!t)return this._map.delete(e),this.removeItem(t),this._size--,t.value}shift(){if(!this._head&&!this._tail)return;if(!this._head||!this._tail)throw new Error(\"Invalid list\");const e=this._head;return this._map.delete(e.key),this.removeItem(e),this._size--,e.value}forEach(e,t){const i=this._state;let n=this._head;for(;n;){if(t?e.bind(t)(n.value,n.key,this):e(n.value,n.key,this),this._state!==i)throw new Error(\"LinkedMap got modified during iteration.\");n=n.next}}keys(){const e=this,t=this._state;let i=this._head;const n={[Symbol.iterator](){return n},next(){if(e._state!==t)throw new Error(\"LinkedMap got modified during iteration.\");if(i){const s={value:i.key,done:!1};return i=i.next,s}else return{value:void 0,done:!0}}};return n}values(){const e=this,t=this._state;let i=this._head;const n={[Symbol.iterator](){return n},next(){if(e._state!==t)throw new Error(\"LinkedMap got modified during iteration.\");if(i){const s={value:i.value,done:!1};return i=i.next,s}else return{value:void 0,done:!0}}};return n}entries(){const e=this,t=this._state;let i=this._head;const n={[Symbol.iterator](){return n},next(){if(e._state!==t)throw new Error(\"LinkedMap got modified during iteration.\");if(i){const s={value:[i.key,i.value],done:!1};return i=i.next,s}else return{value:void 0,done:!0}}};return n}[(Y2=Symbol.toStringTag,Symbol.iterator)](){return this.entries()}trimOld(e){if(e>=this.size)return;if(e===0){this.clear();return}let t=this._head,i=this.size;for(;t&&i>e;)this._map.delete(t.key),t=t.next,i--;this._head=t,this._size=i,t&&(t.previous=void 0),this._state++}addItemFirst(e){if(!this._head&&!this._tail)this._tail=e;else if(this._head)e.next=this._head,this._head.previous=e;else throw new Error(\"Invalid list\");this._head=e,this._state++}addItemLast(e){if(!this._head&&!this._tail)this._head=e;else if(this._tail)e.previous=this._tail,this._tail.next=e;else throw new Error(\"Invalid list\");this._tail=e,this._state++}removeItem(e){if(e===this._head&&e===this._tail)this._head=void 0,this._tail=void 0;else if(e===this._head){if(!e.next)throw new Error(\"Invalid list\");e.next.previous=void 0,this._head=e.next}else if(e===this._tail){if(!e.previous)throw new Error(\"Invalid list\");e.previous.next=void 0,this._tail=e.previous}else{const t=e.next,i=e.previous;if(!t||!i)throw new Error(\"Invalid list\");t.previous=i,i.next=t}e.next=void 0,e.previous=void 0,this._state++}touch(e,t){if(!this._head||!this._tail)throw new Error(\"Invalid list\");if(!(t!==1&&t!==2)){if(t===1){if(e===this._head)return;const i=e.next,n=e.previous;e===this._tail?(n.next=void 0,this._tail=n):(i.previous=n,n.next=i),e.previous=void 0,e.next=this._head,this._head.previous=e,this._head=e,this._state++}else if(t===2){if(e===this._tail)return;const i=e.next,n=e.previous;e===this._head?(i.previous=void 0,this._head=i):(i.previous=n,n.next=i),e.next=void 0,e.previous=this._tail,this._tail.next=e,this._tail=e,this._state++}}}toJSON(){const e=[];return this.forEach((t,i)=>{e.push([i,t])}),e}fromJSON(e){this.clear();for(const[t,i]of e)this.set(t,i)}}class bh extends dG{constructor(e,t=1){super(),this._limit=e,this._ratio=Math.min(Math.max(0,t),1)}get limit(){return this._limit}set limit(e){this._limit=e,this.checkTrim()}get(e,t=2){return super.get(e,t)}peek(e){return super.get(e,0)}set(e,t){return super.set(e,t,2),this.checkTrim(),this}checkTrim(){this.size>this._limit&&this.trimOld(Math.round(this._limit*this._ratio))}}function n5(...o){return function(e,t){for(let i=0,n=o.length;i<n;i++){const s=o[i](e,t);if(s)return s}return null}}s5.bind(void 0,!1);const tE=s5.bind(void 0,!0);function s5(o,e,t){if(!t||t.length<e.length)return null;let i;return o?i=$x(t,e):i=t.indexOf(e)===0,i?e.length>0?[{start:0,end:e.length}]:[]:null}function hG(o,e){const t=e.toLowerCase().indexOf(o.toLowerCase());return t===-1?null:[{start:t,end:t+o.length}]}function o5(o,e){return uL(o.toLowerCase(),e.toLowerCase(),0,0)}function uL(o,e,t,i){if(t===o.length)return[];if(i===e.length)return null;if(o[t]===e[i]){let n=null;return(n=uL(o,e,t+1,i+1))?a5({start:i,end:i+1},n):null}return uL(o,e,t,i+1)}function iE(o){return 97<=o&&o<=122}function d1(o){return 65<=o&&o<=90}function nE(o){return 48<=o&&o<=57}function uG(o){return o===32||o===9||o===10||o===13}const gG=new Set;\"()[]{}<>`'\\\"-/;:,.?!\".split(\"\").forEach(o=>gG.add(o.charCodeAt(0)));function r5(o){return iE(o)||d1(o)||nE(o)}function a5(o,e){return e.length===0?e=[o]:o.end===e[0].start?e[0].start=o.start:e.unshift(o),e}function l5(o,e){for(let t=e;t<o.length;t++){const i=o.charCodeAt(t);if(d1(i)||nE(i)||t>0&&!r5(o.charCodeAt(t-1)))return t}return o.length}function gL(o,e,t,i){if(t===o.length)return[];if(i===e.length)return null;if(o[t]!==e[i].toLowerCase())return null;{let n=null,s=i+1;for(n=gL(o,e,t+1,i+1);!n&&(s=l5(e,s))<e.length;)n=gL(o,e,t+1,s),s++;return n===null?null:a5({start:i,end:i+1},n)}}function fG(o){let e=0,t=0,i=0,n=0,s=0;for(let d=0;d<o.length;d++)s=o.charCodeAt(d),d1(s)&&e++,iE(s)&&t++,r5(s)&&i++,nE(s)&&n++;const r=e/o.length,a=t/o.length,l=i/o.length,c=n/o.length;return{upperPercent:r,lowerPercent:a,alphaPercent:l,numericPercent:c}}function pG(o){const{upperPercent:e,lowerPercent:t}=o;return t===0&&e>.6}function mG(o){const{upperPercent:e,lowerPercent:t,alphaPercent:i,numericPercent:n}=o;return t>.2&&e<.8&&i>.6&&n<.2}function _G(o){let e=0,t=0,i=0,n=0;for(let s=0;s<o.length;s++)i=o.charCodeAt(s),d1(i)&&e++,iE(i)&&t++,uG(i)&&n++;return(e===0||t===0)&&n===0?o.length<=30:e<=5}function c5(o,e){if(!e||(e=e.trim(),e.length===0)||!_G(o)||e.length>60)return null;const t=fG(e);if(!mG(t)){if(!pG(t))return null;e=e.toLowerCase()}let i=null,n=0;for(o=o.toLowerCase();n<e.length&&(i=gL(o,e,0,n))===null;)n=l5(e,n+1);return i}const bG=n5(tE,c5,hG),vG=n5(tE,c5,o5),X2=new bh(1e4);function Q2(o,e,t=!1){if(typeof o!=\"string\"||typeof e!=\"string\")return null;let i=X2.get(o);i||(i=new RegExp(IB(o),\"i\"),X2.set(o,i));const n=i.exec(e);return n?[{start:n.index,end:n.index+n[0].length}]:t?vG(o,e):bG(o,e)}function CG(o,e,t,i,n,s){const r=Math.min(13,o.length);for(;t<r;t++){const a=im(o,e,t,i,n,s,{firstMatchCanBeWeak:!1,boostFullMatch:!0});if(a)return a}return[0,s]}function sE(o){if(typeof o==\"undefined\")return[];const e=[],t=o[1];for(let i=o.length-1;i>1;i--){const n=o[i]+t,s=e[e.length-1];s&&s.end===n?s.end=n+1:e.push({start:n,end:n+1})}return e}const Wl=128;function oE(){const o=[],e=[];for(let t=0;t<=Wl;t++)e[t]=0;for(let t=0;t<=Wl;t++)o.push(e.slice(0));return o}function d5(o){const e=[];for(let t=0;t<=o;t++)e[t]=0;return e}const h5=d5(2*Wl),fL=d5(2*Wl),ha=oE(),Vc=oE(),rb=oE();function ab(o,e){if(e<0||e>=o.length)return!1;const t=o.codePointAt(e);switch(t){case 95:case 45:case 46:case 32:case 47:case 92:case 39:case 34:case 58:case 36:case 60:case 62:case 40:case 41:case 91:case 93:case 123:case 125:return!0;case void 0:return!1;default:return!!Gx(t)}}function J2(o,e){if(e<0||e>=o.length)return!1;switch(o.charCodeAt(e)){case 32:case 9:return!0;default:return!1}}function r0(o,e,t){return e[o]!==t[o]}function wG(o,e,t,i,n,s,r=!1){for(;e<t&&n<s;)o[e]===i[n]&&(r&&(h5[e]=n),e+=1),n+=1;return e===t}var jo;(function(o){o.Default=[-100,0];function e(t){return!t||t.length===2&&t[0]===-100&&t[1]===0}o.isDefault=e})(jo||(jo={}));class rE{constructor(e,t){this.firstMatchCanBeWeak=e,this.boostFullMatch=t}}rE.default={boostFullMatch:!0,firstMatchCanBeWeak:!1};function im(o,e,t,i,n,s,r=rE.default){const a=o.length>Wl?Wl:o.length,l=i.length>Wl?Wl:i.length;if(t>=a||s>=l||a-t>l-s||!wG(e,t,a,n,s,l,!0))return;SG(a,l,t,s,e,n);let c=1,d=1,h=t,u=s;const g=[!1];for(c=1,h=t;h<a;c++,h++){const C=h5[h],w=fL[h],S=h+1<a?fL[h+1]:l;for(d=C-s+1,u=C;u<S;d++,u++){let k=Number.MIN_SAFE_INTEGER,x=!1;u<=w&&(k=yG(o,e,h,t,i,n,u,l,s,ha[c-1][d-1]===0,g));let y=0;k!==Number.MAX_SAFE_INTEGER&&(x=!0,y=k+Vc[c-1][d-1]);const D=u>C,I=D?Vc[c][d-1]+(ha[c][d-1]>0?-5:0):0,R=u>C+1&&ha[c][d-1]>0,P=R?Vc[c][d-2]+(ha[c][d-2]>0?-5:0):0;if(R&&(!D||P>=I)&&(!x||P>=y))Vc[c][d]=P,rb[c][d]=3,ha[c][d]=0;else if(D&&(!x||I>=y))Vc[c][d]=I,rb[c][d]=2,ha[c][d]=0;else if(x)Vc[c][d]=y,rb[c][d]=1,ha[c][d]=ha[c-1][d-1]+1;else throw new Error(\"not possible\")}}if(!g[0]&&!r.firstMatchCanBeWeak)return;c--,d--;const f=[Vc[c][d],s];let _=0,b=0;for(;c>=1;){let C=d;do{const w=rb[c][C];if(w===3)C=C-2;else if(w===2)C=C-1;else break}while(C>=1);_>1&&e[t+c-1]===n[s+d-1]&&!r0(C+s-1,i,n)&&_+1>ha[c][C]&&(C=d),C===d?_++:_=1,b||(b=C),c--,d=C-1,f.push(d)}l===a&&r.boostFullMatch&&(f[0]+=2);const v=b-a;return f[0]-=v,f}function SG(o,e,t,i,n,s){let r=o-1,a=e-1;for(;r>=t&&a>=i;)n[r]===s[a]&&(fL[r]=a,r--),a--}function yG(o,e,t,i,n,s,r,a,l,c,d){if(e[t]!==s[r])return Number.MIN_SAFE_INTEGER;let h=1,u=!1;return r===t-i?h=o[t]===n[r]?7:5:r0(r,n,s)&&(r===0||!r0(r-1,n,s))?(h=o[t]===n[r]?7:5,u=!0):ab(s,r)&&(r===0||!ab(s,r-1))?h=5:(ab(s,r-1)||J2(s,r-1))&&(h=5,u=!0),h>1&&t===i&&(d[0]=!0),u||(u=r0(r,n,s)||ab(s,r-1)||J2(s,r-1)),t===i?r>l&&(h-=u?3:5):c?h+=u?2:0:h+=u?0:1,r+1===a&&(h-=u?3:5),h}function LG(o,e,t,i,n,s,r){return DG(o,e,t,i,n,s,!0,r)}function DG(o,e,t,i,n,s,r,a){let l=im(o,e,t,i,n,s,a);if(l&&!r)return l;if(o.length>=3){const c=Math.min(7,o.length-1);for(let d=t+1;d<c;d++){const h=kG(o,d);if(h){const u=im(h,h.toLowerCase(),t,i,n,s,a);u&&(u[0]-=3,(!l||u[0]>l[0])&&(l=u))}}}return l}function kG(o,e){if(e+1>=o.length)return;const t=o[e],i=o[e+1];if(t!==i)return o.slice(0,e)+i+t+o.slice(e+2)}const up=\"$(\",aE=new RegExp(`\\\\$\\\\(${Cn.iconNameExpression}(?:${Cn.iconModifierExpression})?\\\\)`,\"g\"),xG=new RegExp(Cn.iconNameCharacter),IG=new RegExp(`(\\\\\\\\)?${aE.source}`,\"g\");function EG(o){return o.replace(IG,(e,t)=>t?e:`\\\\${e}`)}const NG=new RegExp(`\\\\\\\\${aE.source}`,\"g\");function TG(o){return o.replace(NG,e=>`\\\\${e}`)}const MG=new RegExp(`(\\\\s)?(\\\\\\\\)?${aE.source}(\\\\s)?`,\"g\");function u5(o){return o.indexOf(up)===-1?o:o.replace(MG,(e,t,i,n)=>i?e:t||n||\"\")}function Fh(o){const e=o.indexOf(up);return e===-1?{text:o}:AG(o,e)}function AG(o,e){const t=[];let i=\"\";function n(u){if(u){i+=u;for(const g of u)t.push(a)}}let s=-1,r=\"\",a=0,l,c,d=e;const h=o.length;for(n(o.substr(0,e));d<h;)l=o[d],c=o[d+1],l===up[0]&&c===up[1]?(s=d,n(r),r=up,d++):l===\")\"&&s!==-1?(a+=d-s+1,s=-1,r=\"\"):s!==-1?xG.test(l)?r+=l:(n(r),s=-1,r=\"\"):n(l),d++;return n(r),{text:i,iconOffsets:t}}function lb(o,e,t=!1){const{text:i,iconOffsets:n}=e;if(!n||n.length===0)return Q2(o,i,t);const s=zx(i,\" \"),r=i.length-s.length,a=Q2(o,s,t);if(a)for(const l of a){const c=n[l.start+r]+r;l.start+=c,l.end+=c}return a}class Rn{constructor(e=\"\",t=!1){var i,n,s;if(this.value=e,typeof this.value!=\"string\")throw zo(\"value\");typeof t==\"boolean\"?(this.isTrusted=t,this.supportThemeIcons=!1,this.supportHtml=!1):(this.isTrusted=(i=t.isTrusted)!==null&&i!==void 0?i:void 0,this.supportThemeIcons=(n=t.supportThemeIcons)!==null&&n!==void 0?n:!1,this.supportHtml=(s=t.supportHtml)!==null&&s!==void 0?s:!1)}appendText(e,t=0){return this.value+=RG(this.supportThemeIcons?EG(e):e).replace(/([ \\t]+)/g,(i,n)=>\"&nbsp;\".repeat(n.length)).replace(/\\>/gm,\"\\\\>\").replace(/\\n/g,t===1?`\\\\\n`:`\n\n`),this}appendMarkdown(e){return this.value+=e,this}appendCodeblock(e,t){return this.value+=\"\\n```\",this.value+=e,this.value+=`\n`,this.value+=t,this.value+=\"\\n```\\n\",this}appendLink(e,t,i){return this.value+=\"[\",this.value+=this._escape(t,\"]\"),this.value+=\"](\",this.value+=this._escape(String(e),\")\"),i&&(this.value+=` \"${this._escape(this._escape(i,'\"'),\")\")}\"`),this.value+=\")\",this}_escape(e,t){const i=new RegExp(Ds(t),\"g\");return e.replace(i,(n,s)=>e.charAt(s-1)!==\"\\\\\"?`\\\\${n}`:n)}}function pg(o){return g5(o)?!o.value:Array.isArray(o)?o.every(pg):!0}function g5(o){return o instanceof Rn?!0:o&&typeof o==\"object\"?typeof o.value==\"string\"&&(typeof o.isTrusted==\"boolean\"||o.isTrusted===void 0)&&(typeof o.supportThemeIcons==\"boolean\"||o.supportThemeIcons===void 0):!1}function RG(o){return o.replace(/[\\\\`*_{}[\\]()#+\\-!]/g,\"\\\\$&\")}function cb(o){return o.replace(/\"/g,\"&quot;\")}function nS(o){return o&&o.replace(/\\\\([\\\\`*_{}[\\]()#+\\-.!])/g,\"$1\")}function OG(o){const e=[],t=o.split(\"|\").map(n=>n.trim());o=t[0];const i=t[1];if(i){const n=/height=(\\d+)/.exec(i),s=/width=(\\d+)/.exec(i),r=n?n[1]:\"\",a=s?s[1]:\"\",l=isFinite(parseInt(a)),c=isFinite(parseInt(r));l&&e.push(`width=\"${a}\"`),c&&e.push(`height=\"${r}\"`)}return{href:o,dimensions:e}}var pL=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};function PG(o,e){ts(e)?o.title=u5(e):e!=null&&e.markdownNotSupportedFallback?o.title=e.markdownNotSupportedFallback:o.removeAttribute(\"title\")}class FG{constructor(e,t,i){this.hoverDelegate=e,this.target=t,this.fadeInAnimation=i}update(e,t,i){var n;return pL(this,void 0,void 0,function*(){if(this._cancellationTokenSource&&(this._cancellationTokenSource.dispose(!0),this._cancellationTokenSource=void 0),this.isDisposed)return;let s;if(e===void 0||ts(e)||e instanceof HTMLElement)s=e;else if(!E0(e.markdown))s=(n=e.markdown)!==null&&n!==void 0?n:e.markdownNotSupportedFallback;else{this._hoverWidget||this.show(p(\"iconLabel.loading\",\"Loading...\"),t),this._cancellationTokenSource=new gn;const r=this._cancellationTokenSource.token;if(s=yield e.markdown(r),s===void 0&&(s=e.markdownNotSupportedFallback),this.isDisposed||r.isCancellationRequested)return}this.show(s,t,i)})}show(e,t,i){const n=this._hoverWidget;if(this.hasContent(e)){const s=Object.assign({content:e,target:this.target,showPointer:this.hoverDelegate.placement===\"element\",hoverPosition:2,skipFadeInAnimation:!this.fadeInAnimation||!!n},i);this._hoverWidget=this.hoverDelegate.showHover(s,t)}n==null||n.dispose()}hasContent(e){return e?g5(e)?!!e.value:!0:!1}get isDisposed(){var e;return(e=this._hoverWidget)===null||e===void 0?void 0:e.isDisposed}dispose(){var e,t;(e=this._hoverWidget)===null||e===void 0||e.dispose(),(t=this._cancellationTokenSource)===null||t===void 0||t.dispose(!0),this._cancellationTokenSource=void 0}}function f5(o,e,t,i){let n,s;const r=(h,u)=>{var g;h&&(s==null||s.dispose(),s=void 0),u&&(n==null||n.dispose(),n=void 0),(g=o.onDidHideHover)===null||g===void 0||g.call(o)},a=(h,u,g)=>new Is(()=>pL(this,void 0,void 0,function*(){(!s||s.isDisposed)&&(s=new FG(o,g||e,h>0),yield s.update(t,u,i))}),h),l=()=>{if(n)return;const h=new ee,u=_=>r(!1,_.fromElement===e);h.add(q(e,le.MOUSE_LEAVE,u,!0));const g=()=>r(!0,!0);h.add(q(e,le.MOUSE_DOWN,g,!0));const f={targetElements:[e],dispose:()=>{}};if(o.placement===void 0||o.placement===\"mouse\"){const _=b=>{f.x=b.x+10,b.target instanceof HTMLElement&&b.target.classList.contains(\"action-label\")&&r(!0,!0)};h.add(q(e,le.MOUSE_MOVE,_,!0))}h.add(a(o.delay,!1,f)),n=h},c=q(e,le.MOUSE_OVER,l,!0);return{show:h=>{r(!1,!0),a(0,h)},hide:()=>{r(!0,!0)},update:(h,u)=>pL(this,void 0,void 0,function*(){t=h,yield s==null?void 0:s.update(t,void 0,u)}),dispose:()=>{c.dispose(),r(!0,!0)}}}class wr extends z{constructor(e,t,i={}){super(),this.options=i,this._context=e||this,this._action=t,t instanceof is&&this._register(t.onDidChange(n=>{!this.element||this.handleActionChangeEvent(n)}))}get action(){return this._action}handleActionChangeEvent(e){e.enabled!==void 0&&this.updateEnabled(),e.checked!==void 0&&this.updateChecked(),e.class!==void 0&&this.updateClass(),e.label!==void 0&&(this.updateLabel(),this.updateTooltip()),e.tooltip!==void 0&&this.updateTooltip()}get actionRunner(){return this._actionRunner||(this._actionRunner=this._register(new Ju)),this._actionRunner}set actionRunner(e){this._actionRunner=e}getAction(){return this._action}isEnabled(){return this._action.enabled}setActionContext(e){this._context=e}render(e){const t=this.element=e;this._register(ut.addTarget(e));const i=this.options&&this.options.draggable;i&&(e.draggable=!0,Ls&&this._register(q(e,le.DRAG_START,n=>{var s;return(s=n.dataTransfer)===null||s===void 0?void 0:s.setData(i_.TEXT,this._action.label)}))),this._register(q(t,kt.Tap,n=>this.onClick(n,!0))),this._register(q(t,le.MOUSE_DOWN,n=>{i||ct.stop(n,!0),this._action.enabled&&n.button===0&&t.classList.add(\"active\")})),Ze&&this._register(q(t,le.CONTEXT_MENU,n=>{n.button===0&&n.ctrlKey===!0&&this.onClick(n)})),this._register(q(t,le.CLICK,n=>{ct.stop(n,!0),this.options&&this.options.isMenu||this.onClick(n)})),this._register(q(t,le.DBLCLICK,n=>{ct.stop(n,!0)})),[le.MOUSE_UP,le.MOUSE_OUT].forEach(n=>{this._register(q(t,n,s=>{ct.stop(s),t.classList.remove(\"active\")}))})}onClick(e,t=!1){var i;ct.stop(e,!0);const n=_s(this._context)?!((i=this.options)===null||i===void 0)&&i.useEventAsContext?e:{preserveFocus:t}:this._context;this.actionRunner.run(this._action,n)}focus(){this.element&&(this.element.tabIndex=0,this.element.focus(),this.element.classList.add(\"focused\"))}blur(){this.element&&(this.element.blur(),this.element.tabIndex=-1,this.element.classList.remove(\"focused\"))}setFocusable(e){this.element&&(this.element.tabIndex=e?0:-1)}get trapsArrowNavigation(){return!1}updateEnabled(){}updateLabel(){}getTooltip(){return this.getAction().tooltip}updateTooltip(){var e;if(!this.element)return;const t=(e=this.getTooltip())!==null&&e!==void 0?e:\"\";this.element.setAttribute(\"aria-label\",t),this.options.hoverDelegate?(this.element.title=\"\",this.customHover?this.customHover.update(t):(this.customHover=f5(this.options.hoverDelegate,this.element,t),this._store.add(this.customHover))):this.element.title=t}updateClass(){}updateChecked(){}dispose(){this.element&&(this.element.remove(),this.element=void 0),super.dispose()}}class nm extends wr{constructor(e,t,i={}){super(e,t,i),this.options=i,this.options.icon=i.icon!==void 0?i.icon:!1,this.options.label=i.label!==void 0?i.label:!0,this.cssClass=\"\"}render(e){super.render(e),this.element&&(this.label=G(this.element,se(\"a.action-label\"))),this.label&&(this._action.id===Ji.ID?this.label.setAttribute(\"role\",\"presentation\"):this.options.isMenu?this.label.setAttribute(\"role\",\"menuitem\"):this.label.setAttribute(\"role\",\"button\")),this.options.label&&this.options.keybinding&&this.element&&(G(this.element,se(\"span.keybinding\")).textContent=this.options.keybinding),this.updateClass(),this.updateLabel(),this.updateTooltip(),this.updateEnabled(),this.updateChecked()}focus(){this.label&&(this.label.tabIndex=0,this.label.focus())}blur(){this.label&&(this.label.tabIndex=-1)}setFocusable(e){this.label&&(this.label.tabIndex=e?0:-1)}updateLabel(){this.options.label&&this.label&&(this.label.textContent=this.getAction().label)}getTooltip(){let e=null;return this.getAction().tooltip?e=this.getAction().tooltip:!this.options.label&&this.getAction().label&&this.options.icon&&(e=this.getAction().label,this.options.keybinding&&(e=p({key:\"titleLabel\",comment:[\"action title\",\"action keybinding\"]},\"{0} ({1})\",e,this.options.keybinding))),e!=null?e:void 0}updateClass(){var e;this.cssClass&&this.label&&this.label.classList.remove(...this.cssClass.split(\" \")),this.options.icon?(this.cssClass=this.getAction().class,this.label&&(this.label.classList.add(\"codicon\"),this.cssClass&&this.label.classList.add(...this.cssClass.split(\" \"))),this.updateEnabled()):(e=this.label)===null||e===void 0||e.classList.remove(\"codicon\")}updateEnabled(){var e,t;this.getAction().enabled?(this.label&&(this.label.removeAttribute(\"aria-disabled\"),this.label.classList.remove(\"disabled\")),(e=this.element)===null||e===void 0||e.classList.remove(\"disabled\")):(this.label&&(this.label.setAttribute(\"aria-disabled\",\"true\"),this.label.classList.add(\"disabled\")),(t=this.element)===null||t===void 0||t.classList.add(\"disabled\"))}updateChecked(){this.label&&(this.getAction().checked?this.label.classList.add(\"checked\"):this.label.classList.remove(\"checked\"))}}var BG=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class qr extends z{constructor(e,t={}){var i,n,s,r,a,l;super(),this.triggerKeyDown=!1,this.focusable=!0,this._onDidBlur=this._register(new O),this.onDidBlur=this._onDidBlur.event,this._onDidCancel=this._register(new O({onFirstListenerAdd:()=>this.cancelHasListener=!0})),this.onDidCancel=this._onDidCancel.event,this.cancelHasListener=!1,this._onDidRun=this._register(new O),this.onDidRun=this._onDidRun.event,this._onBeforeRun=this._register(new O),this.onBeforeRun=this._onBeforeRun.event,this.options=t,this._context=(i=t.context)!==null&&i!==void 0?i:null,this._orientation=(n=this.options.orientation)!==null&&n!==void 0?n:0,this._triggerKeys={keyDown:(r=(s=this.options.triggerKeys)===null||s===void 0?void 0:s.keyDown)!==null&&r!==void 0?r:!1,keys:(l=(a=this.options.triggerKeys)===null||a===void 0?void 0:a.keys)!==null&&l!==void 0?l:[3,10]},this.options.actionRunner?this._actionRunner=this.options.actionRunner:(this._actionRunner=new Ju,this._register(this._actionRunner)),this._register(this._actionRunner.onDidRun(h=>this._onDidRun.fire(h))),this._register(this._actionRunner.onBeforeRun(h=>this._onBeforeRun.fire(h))),this._actionIds=[],this.viewItems=[],this.viewItemDisposables=new Map,this.focusedItem=void 0,this.domNode=document.createElement(\"div\"),this.domNode.className=\"monaco-action-bar\",t.animated!==!1&&this.domNode.classList.add(\"animated\");let c,d;switch(this._orientation){case 0:c=[15],d=[17];break;case 1:c=[16],d=[18],this.domNode.className+=\" vertical\";break}this._register(q(this.domNode,le.KEY_DOWN,h=>{const u=new Mt(h);let g=!0;const f=typeof this.focusedItem==\"number\"?this.viewItems[this.focusedItem]:void 0;c&&(u.equals(c[0])||u.equals(c[1]))?g=this.focusPrevious():d&&(u.equals(d[0])||u.equals(d[1]))?g=this.focusNext():u.equals(9)&&this.cancelHasListener?this._onDidCancel.fire():u.equals(14)?g=this.focusFirst():u.equals(13)?g=this.focusLast():u.equals(2)&&f instanceof wr&&f.trapsArrowNavigation?g=this.focusNext():this.isTriggerKeyEvent(u)?this._triggerKeys.keyDown?this.doTrigger(u):this.triggerKeyDown=!0:g=!1,g&&(u.preventDefault(),u.stopPropagation())})),this._register(q(this.domNode,le.KEY_UP,h=>{const u=new Mt(h);this.isTriggerKeyEvent(u)?(!this._triggerKeys.keyDown&&this.triggerKeyDown&&(this.triggerKeyDown=!1,this.doTrigger(u)),u.preventDefault(),u.stopPropagation()):(u.equals(2)||u.equals(1026))&&this.updateFocusedItem()})),this.focusTracker=this._register(Ad(this.domNode)),this._register(this.focusTracker.onDidBlur(()=>{(xu()===this.domNode||!Ga(xu(),this.domNode))&&(this._onDidBlur.fire(),this.focusedItem=void 0,this.previouslyFocusedItem=void 0,this.triggerKeyDown=!1)})),this._register(this.focusTracker.onDidFocus(()=>this.updateFocusedItem())),this.actionsList=document.createElement(\"ul\"),this.actionsList.className=\"actions-container\",this.actionsList.setAttribute(\"role\",this.options.ariaRole||\"toolbar\"),this.options.ariaLabel&&this.actionsList.setAttribute(\"aria-label\",this.options.ariaLabel),this.domNode.appendChild(this.actionsList),e.appendChild(this.domNode)}refreshRole(){this.length()>=2?this.actionsList.setAttribute(\"role\",this.options.ariaRole||\"toolbar\"):this.actionsList.setAttribute(\"role\",\"presentation\")}setFocusable(e){if(this.focusable=e,this.focusable){const t=this.viewItems.find(i=>i instanceof wr&&i.isEnabled());t instanceof wr&&t.setFocusable(!0)}else this.viewItems.forEach(t=>{t instanceof wr&&t.setFocusable(!1)})}isTriggerKeyEvent(e){let t=!1;return this._triggerKeys.keys.forEach(i=>{t=t||e.equals(i)}),t}updateFocusedItem(){for(let e=0;e<this.actionsList.children.length;e++){const t=this.actionsList.children[e];if(Ga(xu(),t)){this.focusedItem=e;break}}}get context(){return this._context}set context(e){this._context=e,this.viewItems.forEach(t=>t.setActionContext(e))}get actionRunner(){return this._actionRunner}set actionRunner(e){e&&(this._actionRunner=e,this.viewItems.forEach(t=>t.actionRunner=e))}getContainer(){return this.domNode}push(e,t={}){const i=Array.isArray(e)?e:[e];let n=sc(t.index)?t.index:null;i.forEach(s=>{const r=document.createElement(\"li\");r.className=\"action-item\",r.setAttribute(\"role\",\"presentation\");let a;this.options.actionViewItemProvider&&(a=this.options.actionViewItemProvider(s)),a||(a=new nm(this.context,s,Object.assign({hoverDelegate:this.options.hoverDelegate},t))),this.options.allowContextMenu||this.viewItemDisposables.set(a,q(r,le.CONTEXT_MENU,l=>{ct.stop(l,!0)})),a.actionRunner=this._actionRunner,a.setActionContext(this.context),a.render(r),this.focusable&&a instanceof wr&&this.viewItems.length===0&&a.setFocusable(!0),n===null||n<0||n>=this.actionsList.children.length?(this.actionsList.appendChild(r),this.viewItems.push(a),this._actionIds.push(s.id)):(this.actionsList.insertBefore(r,this.actionsList.children[n]),this.viewItems.splice(n,0,a),this._actionIds.splice(n,0,s.id),n++)}),typeof this.focusedItem==\"number\"&&this.focus(this.focusedItem),this.refreshRole()}clear(){et(this.viewItems),this.viewItemDisposables.forEach(e=>e.dispose()),this.viewItemDisposables.clear(),this.viewItems=[],this._actionIds=[],Ii(this.actionsList),this.refreshRole()}length(){return this.viewItems.length}focus(e){let t=!1,i;if(e===void 0?t=!0:typeof e==\"number\"?i=e:typeof e==\"boolean\"&&(t=e),t&&typeof this.focusedItem==\"undefined\"){const n=this.viewItems.findIndex(s=>s.isEnabled());this.focusedItem=n===-1?void 0:n,this.updateFocus(void 0,void 0,!0)}else i!==void 0&&(this.focusedItem=i),this.updateFocus(void 0,void 0,!0)}focusFirst(){return this.focusedItem=this.length()-1,this.focusNext(!0)}focusLast(){return this.focusedItem=0,this.focusPrevious(!0)}focusNext(e){if(typeof this.focusedItem==\"undefined\")this.focusedItem=this.viewItems.length-1;else if(this.viewItems.length<=1)return!1;const t=this.focusedItem;let i;do{if(!e&&this.options.preventLoopNavigation&&this.focusedItem+1>=this.viewItems.length)return this.focusedItem=t,!1;this.focusedItem=(this.focusedItem+1)%this.viewItems.length,i=this.viewItems[this.focusedItem]}while(this.focusedItem!==t&&(this.options.focusOnlyEnabledItems&&!i.isEnabled()||i.action.id===Ji.ID));return this.updateFocus(),!0}focusPrevious(e){if(typeof this.focusedItem==\"undefined\")this.focusedItem=0;else if(this.viewItems.length<=1)return!1;const t=this.focusedItem;let i;do{if(this.focusedItem=this.focusedItem-1,this.focusedItem<0){if(!e&&this.options.preventLoopNavigation)return this.focusedItem=t,!1;this.focusedItem=this.viewItems.length-1}i=this.viewItems[this.focusedItem]}while(this.focusedItem!==t&&(this.options.focusOnlyEnabledItems&&!i.isEnabled()||i.action.id===Ji.ID));return this.updateFocus(!0),!0}updateFocus(e,t,i=!1){var n;typeof this.focusedItem==\"undefined\"&&this.actionsList.focus({preventScroll:t}),this.previouslyFocusedItem!==void 0&&this.previouslyFocusedItem!==this.focusedItem&&((n=this.viewItems[this.previouslyFocusedItem])===null||n===void 0||n.blur());const s=this.focusedItem!==void 0&&this.viewItems[this.focusedItem];if(s){let r=!0;E0(s.focus)||(r=!1),this.options.focusOnlyEnabledItems&&E0(s.isEnabled)&&!s.isEnabled()&&(r=!1),s.action.id===Ji.ID&&(r=!1),r?(i||this.previouslyFocusedItem!==this.focusedItem)&&(s.focus(e),this.previouslyFocusedItem=this.focusedItem):(this.actionsList.focus({preventScroll:t}),this.previouslyFocusedItem=void 0)}}doTrigger(e){if(typeof this.focusedItem==\"undefined\")return;const t=this.viewItems[this.focusedItem];if(t instanceof wr){const i=t._context===null||t._context===void 0?e:t._context;this.run(t._action,i)}}run(e,t){return BG(this,void 0,void 0,function*(){yield this._actionRunner.run(e,t)})}dispose(){et(this.viewItems),this.viewItems=[],this._actionIds=[],this.getContainer().remove(),super.dispose()}}const WG={IconContribution:\"base.contributions.icons\"};var eM;(function(o){function e(t,i){let n=t.defaults;for(;nt.isThemeIcon(n);){const s=vh.getIcon(n.id);if(!s)return;n=s.defaults}return n}o.getDefinition=e})(eM||(eM={}));var tM;(function(o){function e(i){return{weight:i.weight,style:i.style,src:i.src.map(n=>({format:n.format,location:n.location.toString()}))}}o.toJSONObject=e;function t(i){const n=s=>ts(s)?s:void 0;if(i&&Array.isArray(i.src)&&i.src.every(s=>ts(s.format)&&ts(s.location)))return{weight:n(i.weight),style:n(i.style),src:i.src.map(s=>({format:s.format,location:me.parse(s.location)}))}}o.fromJSONObject=t})(tM||(tM={}));class VG{constructor(){this._onDidChange=new O,this.onDidChange=this._onDidChange.event,this.iconSchema={definitions:{icons:{type:\"object\",properties:{fontId:{type:\"string\",description:p(\"iconDefinition.fontId\",\"The id of the font to use. If not set, the font that is defined first is used.\")},fontCharacter:{type:\"string\",description:p(\"iconDefinition.fontCharacter\",\"The font character associated with the icon definition.\")}},additionalProperties:!1,defaultSnippets:[{body:{fontCharacter:\"\\\\\\\\e030\"}}]}},type:\"object\",properties:{}},this.iconReferenceSchema={type:\"string\",pattern:`^${Cn.iconNameExpression}$`,enum:[],enumDescriptions:[]},this.iconsById={},this.iconFontsById={}}registerIcon(e,t,i,n){const s=this.iconsById[e];if(s){if(i&&!s.description){s.description=i,this.iconSchema.properties[e].markdownDescription=`${i} $(${e})`;const l=this.iconReferenceSchema.enum.indexOf(e);l!==-1&&(this.iconReferenceSchema.enumDescriptions[l]=i),this._onDidChange.fire()}return s}const r={id:e,description:i,defaults:t,deprecationMessage:n};this.iconsById[e]=r;const a={$ref:\"#/definitions/icons\"};return n&&(a.deprecationMessage=n),i&&(a.markdownDescription=`${i}: $(${e})`),this.iconSchema.properties[e]=a,this.iconReferenceSchema.enum.push(e),this.iconReferenceSchema.enumDescriptions.push(i||\"\"),this._onDidChange.fire(),{id:e}}getIcons(){return Object.keys(this.iconsById).map(e=>this.iconsById[e])}getIcon(e){return this.iconsById[e]}getIconSchema(){return this.iconSchema}toString(){const e=(s,r)=>s.id.localeCompare(r.id),t=s=>{for(;nt.isThemeIcon(s.defaults);)s=this.iconsById[s.defaults.id];return`codicon codicon-${s?s.id:\"\"}`},i=[];i.push(\"| preview     | identifier                        | default codicon ID                | description\"),i.push(\"| ----------- | --------------------------------- | --------------------------------- | --------------------------------- |\");const n=Object.keys(this.iconsById).map(s=>this.iconsById[s]);for(const s of n.filter(r=>!!r.description).sort(e))i.push(`|<i class=\"${t(s)}\"></i>|${s.id}|${nt.isThemeIcon(s.defaults)?s.defaults.id:s.id}|${s.description||\"\"}|`);i.push(\"| preview     | identifier                        \"),i.push(\"| ----------- | --------------------------------- |\");for(const s of n.filter(r=>!nt.isThemeIcon(r.defaults)).sort(e))i.push(`|<i class=\"${t(s)}\"></i>|${s.id}|`);return i.join(`\n`)}}const vh=new VG;di.add(WG.IconContribution,vh);function fi(o,e,t,i){return vh.registerIcon(o,e,t,i)}function p5(){return vh}function HG(){for(const o of m.getAll())vh.registerIcon(o.id,o.definition,o.description)}HG();const m5=\"vscode://schemas/icons\",_5=di.as(UC.JSONContribution);_5.registerSchema(m5,vh.getIconSchema());const iM=new ft(()=>_5.notifySchemaChanged(m5),200);vh.onDidChange(()=>{iM.isScheduled()||iM.schedule()});const b5=fi(\"widget-close\",m.close,p(\"widgetClose\",\"Icon for the close action in widgets.\"));fi(\"goto-previous-location\",m.arrowUp,p(\"previousChangeIcon\",\"Icon for goto previous editor location.\"));fi(\"goto-next-location\",m.arrowDown,p(\"nextChangeIcon\",\"Icon for goto next editor location.\"));nt.modify(m.sync,\"spin\");nt.modify(m.loading,\"spin\");var zG=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},UG=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},$G=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})},sS;const db=3;class _f{constructor(e,t,i,n){this.originalLineStart=e,this.originalLineEnd=t,this.modifiedLineStart=i,this.modifiedLineEnd=n}getType(){return this.originalLineStart===0?1:this.modifiedLineStart===0?2:0}}class oS{constructor(e){this.entries=e}}const jG=fi(\"diff-review-insert\",m.add,p(\"diffReviewInsertIcon\",\"Icon for 'Insert' in diff review.\")),KG=fi(\"diff-review-remove\",m.remove,p(\"diffReviewRemoveIcon\",\"Icon for 'Remove' in diff review.\")),qG=fi(\"diff-review-close\",m.close,p(\"diffReviewCloseIcon\",\"Icon for 'Close' in diff review.\"));let _v=class Kc extends z{constructor(e,t){super(),this._languageService=t,this._width=0,this._diffEditor=e,this._isVisible=!1,this.shadow=Je(document.createElement(\"div\")),this.shadow.setClassName(\"diff-review-shadow\"),this.actionBarContainer=Je(document.createElement(\"div\")),this.actionBarContainer.setClassName(\"diff-review-actions\"),this._actionBar=this._register(new qr(this.actionBarContainer.domNode)),this._actionBar.push(new is(\"diffreview.close\",p(\"label.close\",\"Close\"),\"close-diff-review \"+nt.asClassName(qG),!0,()=>$G(this,void 0,void 0,function*(){return this.hide()})),{label:!1,icon:!0}),this.domNode=Je(document.createElement(\"div\")),this.domNode.setClassName(\"diff-review monaco-editor-background\"),this._content=Je(document.createElement(\"div\")),this._content.setClassName(\"diff-review-content\"),this._content.setAttribute(\"role\",\"code\"),this.scrollbar=this._register(new e_(this._content.domNode,{})),this.domNode.domNode.appendChild(this.scrollbar.getDomNode()),this._register(e.onDidUpdateDiff(()=>{!this._isVisible||(this._diffs=this._compute(),this._render())})),this._register(e.getModifiedEditor().onDidChangeCursorPosition(()=>{!this._isVisible||this._render()})),this._register(Ei(this.domNode.domNode,\"click\",i=>{i.preventDefault();const n=WO(i.target,\"diff-review-row\");n&&this._goToRow(n)})),this._register(Ei(this.domNode.domNode,\"keydown\",i=>{(i.equals(18)||i.equals(2066)||i.equals(530))&&(i.preventDefault(),this._goToRow(this._getNextRow())),(i.equals(16)||i.equals(2064)||i.equals(528))&&(i.preventDefault(),this._goToRow(this._getPrevRow())),(i.equals(9)||i.equals(2057)||i.equals(521)||i.equals(1033))&&(i.preventDefault(),this.hide()),(i.equals(10)||i.equals(3))&&(i.preventDefault(),this.accept())})),this._diffs=[],this._currentDiff=null}prev(){let e=0;if(this._isVisible||(this._diffs=this._compute()),this._isVisible){let i=-1;for(let n=0,s=this._diffs.length;n<s;n++)if(this._diffs[n]===this._currentDiff){i=n;break}e=this._diffs.length+i-1}else e=this._findDiffIndex(this._diffEditor.getPosition());if(this._diffs.length===0)return;e=e%this._diffs.length;const t=this._diffs[e].entries;this._diffEditor.setPosition(new B(t[0].modifiedLineStart,1)),this._diffEditor.setSelection({startColumn:1,startLineNumber:t[0].modifiedLineStart,endColumn:1073741824,endLineNumber:t[t.length-1].modifiedLineEnd}),this._isVisible=!0,this._diffEditor.doLayout(),this._render(),this._goToRow(this._getNextRow())}next(){let e=0;if(this._isVisible||(this._diffs=this._compute()),this._isVisible){let i=-1;for(let n=0,s=this._diffs.length;n<s;n++)if(this._diffs[n]===this._currentDiff){i=n;break}e=i+1}else e=this._findDiffIndex(this._diffEditor.getPosition());if(this._diffs.length===0)return;e=e%this._diffs.length;const t=this._diffs[e].entries;this._diffEditor.setPosition(new B(t[0].modifiedLineStart,1)),this._diffEditor.setSelection({startColumn:1,startLineNumber:t[0].modifiedLineStart,endColumn:1073741824,endLineNumber:t[t.length-1].modifiedLineEnd}),this._isVisible=!0,this._diffEditor.doLayout(),this._render(),this._goToRow(this._getNextRow())}accept(){let e=-1;const t=this._getCurrentFocusedRow();if(t){const i=parseInt(t.getAttribute(\"data-line\"),10);isNaN(i)||(e=i)}this.hide(),e!==-1&&(this._diffEditor.setPosition(new B(e,1)),this._diffEditor.revealPosition(new B(e,1),1))}hide(){this._isVisible=!1,this._diffEditor.updateOptions({readOnly:!1}),this._diffEditor.focus(),this._diffEditor.doLayout(),this._render()}_getPrevRow(){const e=this._getCurrentFocusedRow();return e?e.previousElementSibling?e.previousElementSibling:e:this._getFirstRow()}_getNextRow(){const e=this._getCurrentFocusedRow();return e?e.nextElementSibling?e.nextElementSibling:e:this._getFirstRow()}_getFirstRow(){return this.domNode.domNode.querySelector(\".diff-review-row\")}_getCurrentFocusedRow(){const e=document.activeElement;return e&&/diff-review-row/.test(e.className)?e:null}_goToRow(e){const t=this._getCurrentFocusedRow();e.tabIndex=0,e.focus(),t&&t!==e&&(t.tabIndex=-1),this.scrollbar.scanDomNode()}isVisible(){return this._isVisible}layout(e,t,i){this._width=t,this.shadow.setTop(e-6),this.shadow.setWidth(t),this.shadow.setHeight(this._isVisible?6:0),this.domNode.setTop(e),this.domNode.setWidth(t),this.domNode.setHeight(i),this._content.setHeight(i),this._content.setWidth(t),this._isVisible?(this.actionBarContainer.setAttribute(\"aria-hidden\",\"false\"),this.actionBarContainer.setDisplay(\"block\")):(this.actionBarContainer.setAttribute(\"aria-hidden\",\"true\"),this.actionBarContainer.setDisplay(\"none\"))}_compute(){const e=this._diffEditor.getLineChanges();if(!e||e.length===0)return[];const t=this._diffEditor.getOriginalEditor().getModel(),i=this._diffEditor.getModifiedEditor().getModel();return!t||!i?[]:Kc._mergeAdjacent(e,t.getLineCount(),i.getLineCount())}static _mergeAdjacent(e,t,i){if(!e||e.length===0)return[];const n=[];let s=0;for(let c=0,d=e.length;c<d;c++){const h=e[c],u=h.originalStartLineNumber,g=h.originalEndLineNumber,f=h.modifiedStartLineNumber,_=h.modifiedEndLineNumber,b=[];let v=0;{const C=g===0?u:u-1,w=_===0?f:f-1;let S=1,k=1;if(c>0){const D=e[c-1];D.originalEndLineNumber===0?S=D.originalStartLineNumber+1:S=D.originalEndLineNumber+1,D.modifiedEndLineNumber===0?k=D.modifiedStartLineNumber+1:k=D.modifiedEndLineNumber+1}let x=C-db+1,y=w-db+1;if(x<S){const D=S-x;x=x+D,y=y+D}if(y<k){const D=k-y;x=x+D,y=y+D}b[v++]=new _f(x,C,y,w)}g!==0&&(b[v++]=new _f(u,g,0,0)),_!==0&&(b[v++]=new _f(0,0,f,_));{const C=g===0?u+1:g+1,w=_===0?f+1:_+1;let S=t,k=i;if(c+1<d){const D=e[c+1];D.originalEndLineNumber===0?S=D.originalStartLineNumber:S=D.originalStartLineNumber-1,D.modifiedEndLineNumber===0?k=D.modifiedStartLineNumber:k=D.modifiedStartLineNumber-1}let x=C+db-1,y=w+db-1;if(x>S){const D=S-x;x=x+D,y=y+D}if(y>k){const D=k-y;x=x+D,y=y+D}b[v++]=new _f(C,x,w,y)}n[s++]=new oS(b)}let r=n[0].entries;const a=[];let l=0;for(let c=1,d=n.length;c<d;c++){const h=n[c].entries,u=r[r.length-1],g=h[0];if(u.getType()===0&&g.getType()===0&&g.originalLineStart<=u.originalLineEnd){r[r.length-1]=new _f(u.originalLineStart,g.originalLineEnd,u.modifiedLineStart,g.modifiedLineEnd),r=r.concat(h.slice(1));continue}a[l++]=new oS(r),r=h}return a[l++]=new oS(r),a}_findDiffIndex(e){const t=e.lineNumber;for(let i=0,n=this._diffs.length;i<n;i++){const s=this._diffs[i].entries,r=s[s.length-1].modifiedLineEnd;if(t<=r)return i}return 0}_render(){const e=this._diffEditor.getOriginalEditor().getOptions(),t=this._diffEditor.getModifiedEditor().getOptions(),i=this._diffEditor.getOriginalEditor().getModel(),n=this._diffEditor.getModifiedEditor().getModel(),s=i.getOptions(),r=n.getOptions();if(!this._isVisible||!i||!n){Ii(this._content.domNode),this._currentDiff=null,this.scrollbar.scanDomNode();return}this._diffEditor.updateOptions({readOnly:!0});const a=this._findDiffIndex(this._diffEditor.getPosition());if(this._diffs[a]===this._currentDiff)return;this._currentDiff=this._diffs[a];const l=this._diffs[a].entries,c=document.createElement(\"div\");c.className=\"diff-review-table\",c.setAttribute(\"role\",\"list\"),c.setAttribute(\"aria-label\",'Difference review. Use \"Stage | Unstage | Revert Selected Ranges\" commands'),tn(c,t.get(46));let d=0,h=0,u=0,g=0;for(let y=0,D=l.length;y<D;y++){const I=l[y],R=I.originalLineStart,P=I.originalLineEnd,H=I.modifiedLineStart,$=I.modifiedLineEnd;R!==0&&(d===0||R<d)&&(d=R),P!==0&&(h===0||P>h)&&(h=P),H!==0&&(u===0||H<u)&&(u=H),$!==0&&(g===0||$>g)&&(g=$)}const f=document.createElement(\"div\");f.className=\"diff-review-row\";const _=document.createElement(\"div\");_.className=\"diff-review-cell diff-review-summary\";const b=h-d+1,v=g-u+1;_.appendChild(document.createTextNode(`${a+1}/${this._diffs.length}: @@ -${d},${b} +${u},${v} @@`)),f.setAttribute(\"data-line\",String(u));const C=y=>y===0?p(\"no_lines_changed\",\"no lines changed\"):y===1?p(\"one_line_changed\",\"1 line changed\"):p(\"more_lines_changed\",\"{0} lines changed\",y),w=C(b),S=C(v);f.setAttribute(\"aria-label\",p({key:\"header\",comment:[\"This is the ARIA label for a git diff header.\",\"A git diff header looks like this: @@ -154,12 +159,39 @@.\",\"That encodes that at original line 154 (which is now line 159), 12 lines were removed/changed with 39 lines.\",\"Variables 0 and 1 refer to the diff index out of total number of diffs.\",\"Variables 2 and 4 will be numbers (a line number).\",'Variables 3 and 5 will be \"no lines changed\", \"1 line changed\" or \"X lines changed\", localized separately.']},\"Difference {0} of {1}: original line {2}, {3}, modified line {4}, {5}\",a+1,this._diffs.length,d,w,u,S)),f.appendChild(_),f.setAttribute(\"role\",\"listitem\"),c.appendChild(f);const k=t.get(61);let x=u;for(let y=0,D=l.length;y<D;y++){const I=l[y];Kc._renderSection(c,I,x,k,this._width,e,i,s,t,n,r,this._languageService.languageIdCodec),I.modifiedLineStart!==0&&(x=I.modifiedLineEnd)}Ii(this._content.domNode),this._content.domNode.appendChild(c),this.scrollbar.scanDomNode()}static _renderSection(e,t,i,n,s,r,a,l,c,d,h,u){const g=t.getType();let f=\"diff-review-row\",_=\"\";const b=\"diff-review-spacer\";let v=null;switch(g){case 1:f=\"diff-review-row line-insert\",_=\" char-insert\",v=jG;break;case 2:f=\"diff-review-row line-delete\",_=\" char-delete\",v=KG;break}const C=t.originalLineStart,w=t.originalLineEnd,S=t.modifiedLineStart,k=t.modifiedLineEnd,x=Math.max(k-S,w-C),y=r.get(133),D=y.glyphMarginWidth+y.lineNumbersWidth,I=c.get(133),R=10+I.glyphMarginWidth+I.lineNumbersWidth;for(let P=0;P<=x;P++){const H=C===0?0:C+P,$=S===0?0:S+P,ne=document.createElement(\"div\");ne.style.minWidth=s+\"px\",ne.className=f,ne.setAttribute(\"role\",\"listitem\"),$!==0&&(i=$),ne.setAttribute(\"data-line\",String(i));const ae=document.createElement(\"div\");ae.className=\"diff-review-cell\",ae.style.height=`${n}px`,ne.appendChild(ae);const de=document.createElement(\"span\");de.style.width=D+\"px\",de.style.minWidth=D+\"px\",de.className=\"diff-review-line-number\"+_,H!==0?de.appendChild(document.createTextNode(String(H))):de.innerText=\"\\xA0\",ae.appendChild(de);const we=document.createElement(\"span\");we.style.width=R+\"px\",we.style.minWidth=R+\"px\",we.style.paddingRight=\"10px\",we.className=\"diff-review-line-number\"+_,$!==0?we.appendChild(document.createTextNode(String($))):we.innerText=\"\\xA0\",ae.appendChild(we);const Se=document.createElement(\"span\");if(Se.className=b,v){const mt=document.createElement(\"span\");mt.className=nt.asClassName(v),mt.innerText=\"\\xA0\\xA0\",Se.appendChild(mt)}else Se.innerText=\"\\xA0\\xA0\";ae.appendChild(Se);let Me;if($!==0){let mt=this._renderLine(d,c,h.tabSize,$,u);Kc._ttPolicy&&(mt=Kc._ttPolicy.createHTML(mt)),ae.insertAdjacentHTML(\"beforeend\",mt),Me=d.getLineContent($)}else{let mt=this._renderLine(a,r,l.tabSize,H,u);Kc._ttPolicy&&(mt=Kc._ttPolicy.createHTML(mt)),ae.insertAdjacentHTML(\"beforeend\",mt),Me=a.getLineContent(H)}Me.length===0&&(Me=p(\"blankLine\",\"blank\"));let St=\"\";switch(g){case 0:H===$?St=p({key:\"unchangedLine\",comment:[\"The placeholders are contents of the line and should not be translated.\"]},\"{0} unchanged line {1}\",Me,H):St=p(\"equalLine\",\"{0} original line {1} modified line {2}\",Me,H,$);break;case 1:St=p(\"insertLine\",\"+ {0} modified line {1}\",Me,$);break;case 2:St=p(\"deleteLine\",\"- {0} original line {1}\",Me,H);break}ne.setAttribute(\"aria-label\",St),e.appendChild(ne)}}static _renderLine(e,t,i,n,s){const r=e.getLineContent(n),a=t.get(46),l=Si.createEmpty(r,s),c=xs.isBasicASCII(r,e.mightContainNonBasicASCII()),d=xs.containsRTL(r,c,e.mightContainRTL());return e1(new Dc(a.isMonospace&&!t.get(29),a.canUseHalfwidthRightwardsArrow,r,!1,c,d,0,l,[],i,0,a.spaceWidth,a.middotWidth,a.wsmiddotWidth,t.get(107),t.get(90),t.get(85),t.get(47)!==vs.OFF,null)).html}};_v._ttPolicy=(sS=window.trustedTypes)===null||sS===void 0?void 0:sS.createPolicy(\"diffReview\",{createHTML:o=>o});_v=zG([UG(1,Ht)],_v);Rt((o,e)=>{const t=o.getColor(u4);t&&e.addRule(`.monaco-diff-editor .diff-review-line-number { color: ${t}; }`);const i=o.getColor(Hg);i&&e.addRule(`.monaco-diff-editor .diff-review-shadow { box-shadow: ${i} 0 -6px 6px -6px inset; }`)});class GG extends he{constructor(){super({id:\"editor.action.diffReview.next\",label:p(\"editor.action.diffReview.next\",\"Go to Next Difference\"),alias:\"Go to Next Difference\",precondition:re.has(\"isInDiffEditor\"),kbOpts:{kbExpr:null,primary:65,weight:100}})}run(e,t){const i=v5(e);i&&i.diffReviewNext()}}class ZG extends he{constructor(){super({id:\"editor.action.diffReview.prev\",label:p(\"editor.action.diffReview.prev\",\"Go to Previous Difference\"),alias:\"Go to Previous Difference\",precondition:re.has(\"isInDiffEditor\"),kbOpts:{kbExpr:null,primary:1089,weight:100}})}run(e,t){const i=v5(e);i&&i.diffReviewPrev()}}function v5(o){const e=o.get(dt),t=e.listDiffEditors(),i=e.getActiveCodeEditor();if(!i)return null;for(let n=0,s=t.length;n<s;n++){const r=t[n];if(r.getModifiedEditor().getId()===i.getId()||r.getOriginalEditor().getId()===i.getId())return r}return null}te(GG);te(ZG);const YG=\"editorWorkerService\",Qs=qe(YG),Ch=qe(\"contextViewService\"),cl=qe(\"contextMenuService\");var rS=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class XG extends z{constructor(e,t,i,n,s,r){super(),this._viewZoneId=e,this._marginDomNode=t,this.editor=i,this.diff=n,this._contextMenuService=s,this._clipboardService=r,this._visibility=!1,this._marginDomNode.style.zIndex=\"10\",this._diffActions=document.createElement(\"div\"),this._diffActions.className=m.lightBulb.classNames+\" lightbulb-glyph\",this._diffActions.style.position=\"absolute\";const a=i.getOption(61),l=i.getModel().getEOL();this._diffActions.style.right=\"0px\",this._diffActions.style.visibility=\"hidden\",this._diffActions.style.height=`${a}px`,this._diffActions.style.lineHeight=`${a}px`,this._marginDomNode.appendChild(this._diffActions);const c=[],d=n.modifiedEndLineNumber===0;c.push(new is(\"diff.clipboard.copyDeletedContent\",d?n.originalEndLineNumber>n.modifiedStartLineNumber?p(\"diff.clipboard.copyDeletedLinesContent.label\",\"Copy deleted lines\"):p(\"diff.clipboard.copyDeletedLinesContent.single.label\",\"Copy deleted line\"):n.originalEndLineNumber>n.modifiedStartLineNumber?p(\"diff.clipboard.copyChangedLinesContent.label\",\"Copy changed lines\"):p(\"diff.clipboard.copyChangedLinesContent.single.label\",\"Copy changed line\"),void 0,!0,()=>rS(this,void 0,void 0,function*(){const _=new L(n.originalStartLineNumber,1,n.originalEndLineNumber+1,1),b=n.originalModel.getValueInRange(_);yield this._clipboardService.writeText(b)})));let h=0,u;n.originalEndLineNumber>n.modifiedStartLineNumber&&(u=new is(\"diff.clipboard.copyDeletedLineContent\",d?p(\"diff.clipboard.copyDeletedLineContent.label\",\"Copy deleted line ({0})\",n.originalStartLineNumber):p(\"diff.clipboard.copyChangedLineContent.label\",\"Copy changed line ({0})\",n.originalStartLineNumber),void 0,!0,()=>rS(this,void 0,void 0,function*(){const _=n.originalModel.getLineContent(n.originalStartLineNumber+h);if(_===\"\"){const b=n.originalModel.getEndOfLineSequence();yield this._clipboardService.writeText(b===0?`\n`:`\\r\n`)}else yield this._clipboardService.writeText(_)})),c.push(u)),i.getOption(83)||c.push(new is(\"diff.inline.revertChange\",p(\"diff.inline.revertChange.label\",\"Revert this change\"),void 0,!0,()=>rS(this,void 0,void 0,function*(){const _=new L(n.originalStartLineNumber,1,n.originalEndLineNumber,n.originalModel.getLineMaxColumn(n.originalEndLineNumber)),b=n.originalModel.getValueInRange(_);if(n.modifiedEndLineNumber===0){const v=i.getModel().getLineMaxColumn(n.modifiedStartLineNumber);i.executeEdits(\"diffEditor\",[{range:new L(n.modifiedStartLineNumber,v,n.modifiedStartLineNumber,v),text:l+b}])}else{const v=i.getModel().getLineMaxColumn(n.modifiedEndLineNumber);i.executeEdits(\"diffEditor\",[{range:new L(n.modifiedStartLineNumber,1,n.modifiedEndLineNumber,v),text:b}])}})));const f=(_,b)=>{this._contextMenuService.showContextMenu({getAnchor:()=>({x:_,y:b}),getActions:()=>(u&&(u.label=d?p(\"diff.clipboard.copyDeletedLineContent.label\",\"Copy deleted line ({0})\",n.originalStartLineNumber+h):p(\"diff.clipboard.copyChangedLineContent.label\",\"Copy changed line ({0})\",n.originalStartLineNumber+h)),c),autoSelectFirstItem:!0})};this._register(Ei(this._diffActions,\"mousedown\",_=>{const{top:b,height:v}=Qi(this._diffActions),C=Math.floor(a/3);_.preventDefault(),f(_.posx,b+v+C)})),this._register(i.onMouseMove(_=>{_.target.type===8||_.target.type===5?_.target.detail.viewZoneId===this._viewZoneId?(this.visibility=!0,h=this._updateLightBulbPosition(this._marginDomNode,_.event.browserEvent.y,a)):this.visibility=!1:this.visibility=!1})),this._register(i.onMouseDown(_=>{!_.event.rightButton||(_.target.type===8||_.target.type===5)&&_.target.detail.viewZoneId===this._viewZoneId&&(_.event.preventDefault(),h=this._updateLightBulbPosition(this._marginDomNode,_.event.browserEvent.y,a),f(_.event.posx,_.event.posy+a))}))}get visibility(){return this._visibility}set visibility(e){this._visibility!==e&&(this._visibility=e,e?this._diffActions.style.visibility=\"visible\":this._diffActions.style.visibility=\"hidden\")}_updateLightBulbPosition(e,t,i){const{top:n}=Qi(e),s=t-n,r=Math.floor(s/i),a=r*i;if(this._diffActions.style.top=`${a}px`,this.diff.viewLineCounts){let l=0;for(let c=0;c<this.diff.viewLineCounts.length;c++)if(l+=this.diff.viewLineCounts[c],r<l)return c}return r}}const dl=qe(\"clipboardService\"),C5=qe(\"progressService\");Object.freeze({total(){},worked(){},done(){}});class wh{constructor(e){this.callback=e}report(e){this._value=e,this.callback(this._value)}}wh.None=Object.freeze({report(){}});const kc=qe(\"editorProgressService\");var QG=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},ua=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},aS;class nM{constructor(e,t){this._contextMenuService=e,this._clipboardService=t,this._zones=[],this._inlineDiffMargins=[],this._zonesMap={},this._decorations=[]}getForeignViewZones(e){return e.filter(t=>!this._zonesMap[String(t.id)])}clean(e){this._zones.length>0&&e.changeViewZones(t=>{for(const i of this._zones)t.removeZone(i)}),this._zones=[],this._zonesMap={},e.changeDecorations(t=>{this._decorations=t.deltaDecorations(this._decorations,[])})}apply(e,t,i,n){const s=n?uc.capture(e):null;e.changeViewZones(r=>{var a;for(const l of this._zones)r.removeZone(l);for(const l of this._inlineDiffMargins)l.dispose();this._zones=[],this._zonesMap={},this._inlineDiffMargins=[];for(let l=0,c=i.zones.length;l<c;l++){const d=i.zones[l];d.suppressMouseDown=!0;const h=r.addZone(d);this._zones.push(h),this._zonesMap[String(h)]=!0,i.zones[l].diff&&d.marginDomNode&&(d.suppressMouseDown=!1,((a=i.zones[l].diff)===null||a===void 0?void 0:a.originalModel.getValueLength())!==0&&this._inlineDiffMargins.push(new XG(h,d.marginDomNode,e,i.zones[l].diff,this._contextMenuService,this._clipboardService)))}}),s==null||s.restore(e),e.changeDecorations(r=>{this._decorations=r.deltaDecorations(this._decorations,i.decorations)}),t==null||t.setZones(i.overviewZones)}}let JG=0;const eZ=fi(\"diff-insert\",m.add,p(\"diffInsertIcon\",\"Line decoration for inserts in the diff editor.\")),w5=fi(\"diff-remove\",m.remove,p(\"diffRemoveIcon\",\"Line decoration for removals in the diff editor.\")),sM=(aS=window.trustedTypes)===null||aS===void 0?void 0:aS.createPolicy(\"diffEditorWidget\",{createHTML:o=>o});let gc=class Ki extends z{constructor(e,t,i,n,s,r,a,l,c,d,h,u){super(),this._editorProgressService=u,this._onDidDispose=this._register(new O),this.onDidDispose=this._onDidDispose.event,this._onDidUpdateDiff=this._register(new O),this.onDidUpdateDiff=this._onDidUpdateDiff.event,this._onDidContentSizeChange=this._register(new O),this._lastOriginalWarning=null,this._lastModifiedWarning=null,this._editorWorkerService=s,this._codeEditorService=l,this._contextKeyService=this._register(r.createScoped(e)),this._instantiationService=a.createChild(new c1([xe,this._contextKeyService])),this._contextKeyService.createKey(\"isInDiffEditor\",!0),this._themeService=c,this._notificationService=d,this._id=++JG,this._state=0,this._updatingDiffProgress=null,this._domElement=e,t=t||{},this._options=aM(t,{enableSplitViewResizing:!0,renderSideBySide:!0,renderMarginRevertIcon:!0,maxComputationTime:5e3,maxFileSize:50,ignoreTrimWhitespace:!0,renderIndicators:!0,originalEditable:!1,diffCodeLens:!1,renderOverviewRuler:!0,diffWordWrap:\"inherit\"}),typeof t.isInEmbeddedEditor!=\"undefined\"?this._contextKeyService.createKey(\"isInEmbeddedDiffEditor\",t.isInEmbeddedEditor):this._contextKeyService.createKey(\"isInEmbeddedDiffEditor\",!1),this._updateDecorationsRunner=this._register(new ft(()=>this._updateDecorations(),0)),this._containerDomElement=document.createElement(\"div\"),this._containerDomElement.className=Ki._getClassName(this._themeService.getColorTheme(),this._options.renderSideBySide),this._containerDomElement.style.position=\"relative\",this._containerDomElement.style.height=\"100%\",this._domElement.appendChild(this._containerDomElement),this._overviewViewportDomElement=Je(document.createElement(\"div\")),this._overviewViewportDomElement.setClassName(\"diffViewport\"),this._overviewViewportDomElement.setPosition(\"absolute\"),this._overviewDomElement=document.createElement(\"div\"),this._overviewDomElement.className=\"diffOverview\",this._overviewDomElement.style.position=\"absolute\",this._overviewDomElement.appendChild(this._overviewViewportDomElement.domNode),this._register(Ei(this._overviewDomElement,le.POINTER_DOWN,f=>{this._modifiedEditor.delegateVerticalScrollbarPointerDown(f)})),this._options.renderOverviewRuler&&this._containerDomElement.appendChild(this._overviewDomElement),this._originalDomNode=document.createElement(\"div\"),this._originalDomNode.className=\"editor original\",this._originalDomNode.style.position=\"absolute\",this._originalDomNode.style.height=\"100%\",this._containerDomElement.appendChild(this._originalDomNode),this._modifiedDomNode=document.createElement(\"div\"),this._modifiedDomNode.className=\"editor modified\",this._modifiedDomNode.style.position=\"absolute\",this._modifiedDomNode.style.height=\"100%\",this._containerDomElement.appendChild(this._modifiedDomNode),this._beginUpdateDecorationsTimeout=-1,this._currentlyChangingViewZones=!1,this._diffComputationToken=0,this._originalEditorState=new nM(h,n),this._modifiedEditorState=new nM(h,n),this._isVisible=!0,this._isHandlingScrollEvent=!1,this._elementSizeObserver=this._register(new BP(this._containerDomElement,t.dimension)),this._register(this._elementSizeObserver.onDidChange(()=>this._onDidContainerSizeChanged())),t.automaticLayout&&this._elementSizeObserver.startObserving(),this._diffComputationResult=null,this._originalEditor=this._createLeftHandSideEditor(t,i.originalEditor||{}),this._modifiedEditor=this._createRightHandSideEditor(t,i.modifiedEditor||{}),this._originalOverviewRuler=null,this._modifiedOverviewRuler=null,this._reviewPane=a.createInstance(_v,this),this._containerDomElement.appendChild(this._reviewPane.domNode.domNode),this._containerDomElement.appendChild(this._reviewPane.shadow.domNode),this._containerDomElement.appendChild(this._reviewPane.actionBarContainer.domNode),this._options.renderSideBySide?this._setStrategy(new Aa(this._createDataSource(),this._options.enableSplitViewResizing)):this._setStrategy(new rM(this._createDataSource(),this._options.enableSplitViewResizing)),this._register(c.onDidColorThemeChange(f=>{this._strategy&&this._strategy.applyColors(f)&&this._updateDecorationsRunner.schedule(),this._containerDomElement.className=Ki._getClassName(this._themeService.getColorTheme(),this._options.renderSideBySide)}));const g=_d.getDiffEditorContributions();for(const f of g)try{this._register(a.createInstance(f.ctor,this))}catch(_){Ee(_)}this._codeEditorService.addDiffEditor(this)}_setState(e){this._state!==e&&(this._state=e,this._updatingDiffProgress&&(this._updatingDiffProgress.done(),this._updatingDiffProgress=null),this._state===1&&(this._updatingDiffProgress=this._editorProgressService.show(!0,1e3)))}diffReviewNext(){this._reviewPane.next()}diffReviewPrev(){this._reviewPane.prev()}static _getClassName(e,t){let i=\"monaco-diff-editor monaco-editor-background \";return t&&(i+=\"side-by-side \"),i+=H0(e.type),i}_disposeOverviewRulers(){this._originalOverviewRuler&&(this._overviewDomElement.removeChild(this._originalOverviewRuler.getDomNode()),this._originalOverviewRuler.dispose(),this._originalOverviewRuler=null),this._modifiedOverviewRuler&&(this._overviewDomElement.removeChild(this._modifiedOverviewRuler.getDomNode()),this._modifiedOverviewRuler.dispose(),this._modifiedOverviewRuler=null)}_createOverviewRulers(){!this._options.renderOverviewRuler||(Yf(!this._originalOverviewRuler&&!this._modifiedOverviewRuler),this._originalEditor.hasModel()&&(this._originalOverviewRuler=this._originalEditor.createOverviewRuler(\"original diffOverviewRuler\"),this._overviewDomElement.appendChild(this._originalOverviewRuler.getDomNode())),this._modifiedEditor.hasModel()&&(this._modifiedOverviewRuler=this._modifiedEditor.createOverviewRuler(\"modified diffOverviewRuler\"),this._overviewDomElement.appendChild(this._modifiedOverviewRuler.getDomNode())),this._layoutOverviewRulers())}_createLeftHandSideEditor(e,t){const i=this._createInnerEditor(this._instantiationService,this._originalDomNode,this._adjustOptionsForLeftHandSide(e),t);this._register(i.onDidScrollChange(s=>{this._isHandlingScrollEvent||!s.scrollTopChanged&&!s.scrollLeftChanged&&!s.scrollHeightChanged||(this._isHandlingScrollEvent=!0,this._modifiedEditor.setScrollPosition({scrollLeft:s.scrollLeft,scrollTop:s.scrollTop}),this._isHandlingScrollEvent=!1,this._layoutOverviewViewport())})),this._register(i.onDidChangeViewZones(()=>{this._onViewZonesChanged()})),this._register(i.onDidChangeConfiguration(s=>{!i.getModel()||(s.hasChanged(46)&&this._updateDecorationsRunner.schedule(),s.hasChanged(134)&&(this._updateDecorationsRunner.cancel(),this._updateDecorations()))})),this._register(i.onDidChangeHiddenAreas(()=>{this._updateDecorationsRunner.cancel(),this._updateDecorations()})),this._register(i.onDidChangeModelContent(()=>{this._isVisible&&this._beginUpdateDecorationsSoon()}));const n=this._contextKeyService.createKey(\"isInDiffLeftEditor\",i.hasWidgetFocus());return this._register(i.onDidFocusEditorWidget(()=>n.set(!0))),this._register(i.onDidBlurEditorWidget(()=>n.set(!1))),this._register(i.onDidContentSizeChange(s=>{const r=this._originalEditor.getContentWidth()+this._modifiedEditor.getContentWidth()+Ki.ONE_OVERVIEW_WIDTH,a=Math.max(this._modifiedEditor.getContentHeight(),this._originalEditor.getContentHeight());this._onDidContentSizeChange.fire({contentHeight:a,contentWidth:r,contentHeightChanged:s.contentHeightChanged,contentWidthChanged:s.contentWidthChanged})})),i}_createRightHandSideEditor(e,t){const i=this._createInnerEditor(this._instantiationService,this._modifiedDomNode,this._adjustOptionsForRightHandSide(e),t);this._register(i.onDidScrollChange(s=>{this._isHandlingScrollEvent||!s.scrollTopChanged&&!s.scrollLeftChanged&&!s.scrollHeightChanged||(this._isHandlingScrollEvent=!0,this._originalEditor.setScrollPosition({scrollLeft:s.scrollLeft,scrollTop:s.scrollTop}),this._isHandlingScrollEvent=!1,this._layoutOverviewViewport())})),this._register(i.onDidChangeViewZones(()=>{this._onViewZonesChanged()})),this._register(i.onDidChangeConfiguration(s=>{!i.getModel()||(s.hasChanged(46)&&this._updateDecorationsRunner.schedule(),s.hasChanged(134)&&(this._updateDecorationsRunner.cancel(),this._updateDecorations()))})),this._register(i.onDidChangeHiddenAreas(()=>{this._updateDecorationsRunner.cancel(),this._updateDecorations()})),this._register(i.onDidChangeModelContent(()=>{this._isVisible&&this._beginUpdateDecorationsSoon()})),this._register(i.onDidChangeModelOptions(s=>{s.tabSize&&this._updateDecorationsRunner.schedule()}));const n=this._contextKeyService.createKey(\"isInDiffRightEditor\",i.hasWidgetFocus());return this._register(i.onDidFocusEditorWidget(()=>n.set(!0))),this._register(i.onDidBlurEditorWidget(()=>n.set(!1))),this._register(i.onDidContentSizeChange(s=>{const r=this._originalEditor.getContentWidth()+this._modifiedEditor.getContentWidth()+Ki.ONE_OVERVIEW_WIDTH,a=Math.max(this._modifiedEditor.getContentHeight(),this._originalEditor.getContentHeight());this._onDidContentSizeChange.fire({contentHeight:a,contentWidth:r,contentHeightChanged:s.contentHeightChanged,contentWidthChanged:s.contentWidthChanged})})),this._register(i.onMouseDown(s=>{var r,a;if(!s.event.rightButton&&s.target.position&&((r=s.target.element)===null||r===void 0?void 0:r.className.includes(\"arrow-revert-change\"))){const l=s.target.position.lineNumber,c=(a=this._diffComputationResult)===null||a===void 0?void 0:a.changes.find(d=>d.modifiedStartLineNumber===l-1||d.modifiedStartLineNumber===l);c&&this.revertChange(c),s.event.stopPropagation(),this._updateDecorations();return}})),i}revertChange(e){const t=this._modifiedEditor,i=this._originalEditor.getModel(),n=this._modifiedEditor.getModel();if(!i||!n||!t)return;const s=e.originalEndLineNumber>0?new L(e.originalStartLineNumber,1,e.originalEndLineNumber,i.getLineMaxColumn(e.originalEndLineNumber)):null,r=s?i.getValueInRange(s):null,a=e.modifiedEndLineNumber>0?new L(e.modifiedStartLineNumber,1,e.modifiedEndLineNumber,n.getLineMaxColumn(e.modifiedEndLineNumber)):null,l=n.getEOL();if(e.originalEndLineNumber===0&&a){let c=a;e.modifiedStartLineNumber>1?c=a.setStartPosition(e.modifiedStartLineNumber-1,n.getLineMaxColumn(e.modifiedStartLineNumber-1)):e.modifiedEndLineNumber<n.getLineCount()&&(c=a.setEndPosition(e.modifiedEndLineNumber+1,1)),t.executeEdits(\"diffEditor\",[{range:c,text:\"\"}])}else if(e.modifiedEndLineNumber===0&&r!==null){const c=e.modifiedStartLineNumber<n.getLineCount()?new B(e.modifiedStartLineNumber+1,1):new B(e.modifiedStartLineNumber,n.getLineMaxColumn(e.modifiedStartLineNumber));t.executeEdits(\"diffEditor\",[{range:L.fromPositions(c,c),text:e.modifiedStartLineNumber<n.getLineCount()?r+l:l+r}])}else a&&r!==null&&t.executeEdits(\"diffEditor\",[{range:a,text:r}])}_createInnerEditor(e,t,i,n){return e.createInstance(fg,t,i,n)}dispose(){this._codeEditorService.removeDiffEditor(this),this._beginUpdateDecorationsTimeout!==-1&&(window.clearTimeout(this._beginUpdateDecorationsTimeout),this._beginUpdateDecorationsTimeout=-1),this._cleanViewZonesAndDecorations(),this._originalOverviewRuler&&(this._overviewDomElement.removeChild(this._originalOverviewRuler.getDomNode()),this._originalOverviewRuler.dispose()),this._modifiedOverviewRuler&&(this._overviewDomElement.removeChild(this._modifiedOverviewRuler.getDomNode()),this._modifiedOverviewRuler.dispose()),this._overviewDomElement.removeChild(this._overviewViewportDomElement.domNode),this._options.renderOverviewRuler&&this._containerDomElement.removeChild(this._overviewDomElement),this._containerDomElement.removeChild(this._originalDomNode),this._originalEditor.dispose(),this._containerDomElement.removeChild(this._modifiedDomNode),this._modifiedEditor.dispose(),this._strategy.dispose(),this._containerDomElement.removeChild(this._reviewPane.domNode.domNode),this._containerDomElement.removeChild(this._reviewPane.shadow.domNode),this._containerDomElement.removeChild(this._reviewPane.actionBarContainer.domNode),this._reviewPane.dispose(),this._domElement.removeChild(this._containerDomElement),this._onDidDispose.fire(),super.dispose()}getId(){return this.getEditorType()+\":\"+this._id}getEditorType(){return r1.IDiffEditor}getLineChanges(){return this._diffComputationResult?this._diffComputationResult.changes:null}getOriginalEditor(){return this._originalEditor}getModifiedEditor(){return this._modifiedEditor}updateOptions(e){const t=aM(e,this._options),i=oZ(this._options,t);this._options=t;const n=i.ignoreTrimWhitespace||i.renderIndicators||i.renderMarginRevertIcon,s=this._isVisible&&(i.maxComputationTime||i.maxFileSize);n?this._beginUpdateDecorations():s&&this._beginUpdateDecorationsSoon(),this._modifiedEditor.updateOptions(this._adjustOptionsForRightHandSide(e)),this._originalEditor.updateOptions(this._adjustOptionsForLeftHandSide(e)),this._strategy.setEnableSplitViewResizing(this._options.enableSplitViewResizing),i.renderSideBySide&&(this._options.renderSideBySide?this._setStrategy(new Aa(this._createDataSource(),this._options.enableSplitViewResizing)):this._setStrategy(new rM(this._createDataSource(),this._options.enableSplitViewResizing)),this._containerDomElement.className=Ki._getClassName(this._themeService.getColorTheme(),this._options.renderSideBySide)),i.renderOverviewRuler&&(this._options.renderOverviewRuler?this._containerDomElement.appendChild(this._overviewDomElement):this._containerDomElement.removeChild(this._overviewDomElement))}getModel(){return{original:this._originalEditor.getModel(),modified:this._modifiedEditor.getModel()}}setModel(e){if(e&&(!e.original||!e.modified))throw new Error(e.original?\"DiffEditorWidget.setModel: Modified model is null\":\"DiffEditorWidget.setModel: Original model is null\");this._cleanViewZonesAndDecorations(),this._disposeOverviewRulers(),this._originalEditor.setModel(e?e.original:null),this._modifiedEditor.setModel(e?e.modified:null),this._updateDecorationsRunner.cancel(),e&&(this._originalEditor.setScrollTop(0),this._modifiedEditor.setScrollTop(0)),this._diffComputationResult=null,this._diffComputationToken++,this._setState(0),e&&(this._createOverviewRulers(),this._beginUpdateDecorations()),this._layoutOverviewViewport()}getContainerDomNode(){return this._domElement}getVisibleColumnFromPosition(e){return this._modifiedEditor.getVisibleColumnFromPosition(e)}getPosition(){return this._modifiedEditor.getPosition()}setPosition(e,t=\"api\"){this._modifiedEditor.setPosition(e,t)}revealLine(e,t=0){this._modifiedEditor.revealLine(e,t)}revealLineInCenter(e,t=0){this._modifiedEditor.revealLineInCenter(e,t)}revealLineInCenterIfOutsideViewport(e,t=0){this._modifiedEditor.revealLineInCenterIfOutsideViewport(e,t)}revealLineNearTop(e,t=0){this._modifiedEditor.revealLineNearTop(e,t)}revealPosition(e,t=0){this._modifiedEditor.revealPosition(e,t)}revealPositionInCenter(e,t=0){this._modifiedEditor.revealPositionInCenter(e,t)}revealPositionInCenterIfOutsideViewport(e,t=0){this._modifiedEditor.revealPositionInCenterIfOutsideViewport(e,t)}revealPositionNearTop(e,t=0){this._modifiedEditor.revealPositionNearTop(e,t)}getSelection(){return this._modifiedEditor.getSelection()}getSelections(){return this._modifiedEditor.getSelections()}setSelection(e,t=\"api\"){this._modifiedEditor.setSelection(e,t)}setSelections(e,t=\"api\"){this._modifiedEditor.setSelections(e,t)}revealLines(e,t,i=0){this._modifiedEditor.revealLines(e,t,i)}revealLinesInCenter(e,t,i=0){this._modifiedEditor.revealLinesInCenter(e,t,i)}revealLinesInCenterIfOutsideViewport(e,t,i=0){this._modifiedEditor.revealLinesInCenterIfOutsideViewport(e,t,i)}revealLinesNearTop(e,t,i=0){this._modifiedEditor.revealLinesNearTop(e,t,i)}revealRange(e,t=0,i=!1,n=!0){this._modifiedEditor.revealRange(e,t,i,n)}revealRangeInCenter(e,t=0){this._modifiedEditor.revealRangeInCenter(e,t)}revealRangeInCenterIfOutsideViewport(e,t=0){this._modifiedEditor.revealRangeInCenterIfOutsideViewport(e,t)}revealRangeNearTop(e,t=0){this._modifiedEditor.revealRangeNearTop(e,t)}revealRangeNearTopIfOutsideViewport(e,t=0){this._modifiedEditor.revealRangeNearTopIfOutsideViewport(e,t)}revealRangeAtTop(e,t=0){this._modifiedEditor.revealRangeAtTop(e,t)}getSupportedActions(){return this._modifiedEditor.getSupportedActions()}saveViewState(){const e=this._originalEditor.saveViewState(),t=this._modifiedEditor.saveViewState();return{original:e,modified:t}}restoreViewState(e){if(e&&e.original&&e.modified){const t=e;this._originalEditor.restoreViewState(t.original),this._modifiedEditor.restoreViewState(t.modified)}}layout(e){this._elementSizeObserver.observe(e)}focus(){this._modifiedEditor.focus()}hasTextFocus(){return this._originalEditor.hasTextFocus()||this._modifiedEditor.hasTextFocus()}trigger(e,t,i){this._modifiedEditor.trigger(e,t,i)}createDecorationsCollection(e){return this._modifiedEditor.createDecorationsCollection(e)}changeDecorations(e){return this._modifiedEditor.changeDecorations(e)}_onDidContainerSizeChanged(){this._doLayout()}_getReviewHeight(){return this._reviewPane.isVisible()?this._elementSizeObserver.getHeight():0}_layoutOverviewRulers(){if(!this._options.renderOverviewRuler||!this._originalOverviewRuler||!this._modifiedOverviewRuler)return;const e=this._elementSizeObserver.getHeight(),t=this._getReviewHeight(),i=Ki.ENTIRE_DIFF_OVERVIEW_WIDTH-2*Ki.ONE_OVERVIEW_WIDTH;this._modifiedEditor.getLayoutInfo()&&(this._originalOverviewRuler.setLayout({top:0,width:Ki.ONE_OVERVIEW_WIDTH,right:i+Ki.ONE_OVERVIEW_WIDTH,height:e-t}),this._modifiedOverviewRuler.setLayout({top:0,right:0,width:Ki.ONE_OVERVIEW_WIDTH,height:e-t}))}_onViewZonesChanged(){this._currentlyChangingViewZones||this._updateDecorationsRunner.schedule()}_beginUpdateDecorationsSoon(){this._beginUpdateDecorationsTimeout!==-1&&(window.clearTimeout(this._beginUpdateDecorationsTimeout),this._beginUpdateDecorationsTimeout=-1),this._beginUpdateDecorationsTimeout=window.setTimeout(()=>this._beginUpdateDecorations(),Ki.UPDATE_DIFF_DECORATIONS_DELAY)}static _equals(e,t){return!e&&!t?!0:!e||!t?!1:e.toString()===t.toString()}_beginUpdateDecorations(){this._beginUpdateDecorationsTimeout=-1;const e=this._originalEditor.getModel(),t=this._modifiedEditor.getModel();if(!e||!t)return;this._diffComputationToken++;const i=this._diffComputationToken,n=this._options.maxFileSize*1024*1024,s=r=>{const a=r.getValueLength();return n===0||a<=n};if(!s(e)||!s(t)){(!Ki._equals(e.uri,this._lastOriginalWarning)||!Ki._equals(t.uri,this._lastModifiedWarning))&&(this._lastOriginalWarning=e.uri,this._lastModifiedWarning=t.uri,this._notificationService.warn(p(\"diff.tooLarge\",\"Cannot compare files because one file is too large.\")));return}this._setState(1),this._editorWorkerService.computeDiff(e.uri,t.uri,this._options.ignoreTrimWhitespace,this._options.maxComputationTime).then(r=>{i===this._diffComputationToken&&e===this._originalEditor.getModel()&&t===this._modifiedEditor.getModel()&&(this._setState(2),this._diffComputationResult=r,this._updateDecorationsRunner.schedule(),this._onDidUpdateDiff.fire())},r=>{i===this._diffComputationToken&&e===this._originalEditor.getModel()&&t===this._modifiedEditor.getModel()&&(this._setState(2),this._diffComputationResult=null,this._updateDecorationsRunner.schedule())})}_cleanViewZonesAndDecorations(){this._originalEditorState.clean(this._originalEditor),this._modifiedEditorState.clean(this._modifiedEditor)}_updateDecorations(){if(!this._originalEditor.getModel()||!this._modifiedEditor.getModel())return;const e=this._diffComputationResult?this._diffComputationResult.changes:[],t=this._originalEditorState.getForeignViewZones(this._originalEditor.getWhitespaces()),i=this._modifiedEditorState.getForeignViewZones(this._modifiedEditor.getWhitespaces()),n=this._strategy.getEditorsDiffDecorations(e,this._options.ignoreTrimWhitespace,this._options.renderIndicators,this._options.renderMarginRevertIcon,t,i);try{this._currentlyChangingViewZones=!0,this._originalEditorState.apply(this._originalEditor,this._originalOverviewRuler,n.original,!1),this._modifiedEditorState.apply(this._modifiedEditor,this._modifiedOverviewRuler,n.modified,!0)}finally{this._currentlyChangingViewZones=!1}}_adjustOptionsForSubEditor(e){const t=Object.assign({},e);return t.inDiffEditor=!0,t.automaticLayout=!1,t.scrollbar=Object.assign({},t.scrollbar||{}),t.scrollbar.vertical=\"visible\",t.folding=!1,t.codeLens=this._options.diffCodeLens,t.fixedOverflowWidgets=!0,t.minimap=Object.assign({},t.minimap||{}),t.minimap.enabled=!1,t}_adjustOptionsForLeftHandSide(e){const t=this._adjustOptionsForSubEditor(e);return this._options.renderSideBySide?t.wordWrapOverride1=this._options.diffWordWrap:(t.wordWrapOverride1=\"off\",t.wordWrapOverride2=\"off\"),e.originalAriaLabel&&(t.ariaLabel=e.originalAriaLabel),t.readOnly=!this._options.originalEditable,t.dropIntoEditor={enabled:!t.readOnly},t.extraEditorClassName=\"original-in-monaco-diff-editor\",Object.assign(Object.assign({},t),{dimension:{height:0,width:0}})}_adjustOptionsForRightHandSide(e){const t=this._adjustOptionsForSubEditor(e);return e.modifiedAriaLabel&&(t.ariaLabel=e.modifiedAriaLabel),t.wordWrapOverride1=this._options.diffWordWrap,t.revealHorizontalRightPadding=Jo.revealHorizontalRightPadding.defaultValue+Ki.ENTIRE_DIFF_OVERVIEW_WIDTH,t.scrollbar.verticalHasArrows=!1,t.extraEditorClassName=\"modified-in-monaco-diff-editor\",Object.assign(Object.assign({},t),{dimension:{height:0,width:0}})}doLayout(){this._elementSizeObserver.observe(),this._doLayout()}_doLayout(){const e=this._elementSizeObserver.getWidth(),t=this._elementSizeObserver.getHeight(),i=this._getReviewHeight(),n=this._strategy.layout();this._originalDomNode.style.width=n+\"px\",this._originalDomNode.style.left=\"0px\",this._modifiedDomNode.style.width=e-n+\"px\",this._modifiedDomNode.style.left=n+\"px\",this._overviewDomElement.style.top=\"0px\",this._overviewDomElement.style.height=t-i+\"px\",this._overviewDomElement.style.width=Ki.ENTIRE_DIFF_OVERVIEW_WIDTH+\"px\",this._overviewDomElement.style.left=e-Ki.ENTIRE_DIFF_OVERVIEW_WIDTH+\"px\",this._overviewViewportDomElement.setWidth(Ki.ENTIRE_DIFF_OVERVIEW_WIDTH),this._overviewViewportDomElement.setHeight(30),this._originalEditor.layout({width:n,height:t-i}),this._modifiedEditor.layout({width:e-n-(this._options.renderOverviewRuler?Ki.ENTIRE_DIFF_OVERVIEW_WIDTH:0),height:t-i}),(this._originalOverviewRuler||this._modifiedOverviewRuler)&&this._layoutOverviewRulers(),this._reviewPane.layout(t-i,e,i),this._layoutOverviewViewport()}_layoutOverviewViewport(){const e=this._computeOverviewViewport();e?(this._overviewViewportDomElement.setTop(e.top),this._overviewViewportDomElement.setHeight(e.height)):(this._overviewViewportDomElement.setTop(0),this._overviewViewportDomElement.setHeight(0))}_computeOverviewViewport(){const e=this._modifiedEditor.getLayoutInfo();if(!e)return null;const t=this._modifiedEditor.getScrollTop(),i=this._modifiedEditor.getScrollHeight(),n=Math.max(0,e.height),s=Math.max(0,n-2*0),r=i>0?s/i:0,a=Math.max(0,Math.floor(e.height*r)),l=Math.floor(t*r);return{height:a,top:l}}_createDataSource(){return{getWidth:()=>this._elementSizeObserver.getWidth(),getHeight:()=>this._elementSizeObserver.getHeight()-this._getReviewHeight(),getOptions:()=>({renderOverviewRuler:this._options.renderOverviewRuler}),getContainerDomNode:()=>this._containerDomElement,relayoutEditors:()=>{this._doLayout()},getOriginalEditor:()=>this._originalEditor,getModifiedEditor:()=>this._modifiedEditor}}_setStrategy(e){this._strategy&&this._strategy.dispose(),this._strategy=e,e.applyColors(this._themeService.getColorTheme()),this._diffComputationResult&&this._updateDecorations(),this._doLayout()}_getLineChangeAtOrBeforeLineNumber(e,t){const i=this._diffComputationResult?this._diffComputationResult.changes:[];if(i.length===0||e<t(i[0]))return null;let n=0,s=i.length-1;for(;n<s;){const r=Math.floor((n+s)/2),a=t(i[r]),l=r+1<=s?t(i[r+1]):1073741824;e<a?s=r-1:e>=l?n=r+1:(n=r,s=r)}return i[n]}_getEquivalentLineForOriginalLineNumber(e){const t=this._getLineChangeAtOrBeforeLineNumber(e,l=>l.originalStartLineNumber);if(!t)return e;const i=t.originalStartLineNumber+(t.originalEndLineNumber>0?-1:0),n=t.modifiedStartLineNumber+(t.modifiedEndLineNumber>0?-1:0),s=t.originalEndLineNumber>0?t.originalEndLineNumber-t.originalStartLineNumber+1:0,r=t.modifiedEndLineNumber>0?t.modifiedEndLineNumber-t.modifiedStartLineNumber+1:0,a=e-i;return a<=s?n+Math.min(a,r):n+r-s+a}_getEquivalentLineForModifiedLineNumber(e){const t=this._getLineChangeAtOrBeforeLineNumber(e,l=>l.modifiedStartLineNumber);if(!t)return e;const i=t.originalStartLineNumber+(t.originalEndLineNumber>0?-1:0),n=t.modifiedStartLineNumber+(t.modifiedEndLineNumber>0?-1:0),s=t.originalEndLineNumber>0?t.originalEndLineNumber-t.originalStartLineNumber+1:0,r=t.modifiedEndLineNumber>0?t.modifiedEndLineNumber-t.modifiedStartLineNumber+1:0,a=e-n;return a<=r?i+Math.min(a,s):i+s-r+a}getDiffLineInformationForOriginal(e){return this._diffComputationResult?{equivalentLineNumber:this._getEquivalentLineForOriginalLineNumber(e)}:null}getDiffLineInformationForModified(e){return this._diffComputationResult?{equivalentLineNumber:this._getEquivalentLineForModifiedLineNumber(e)}:null}};gc.ONE_OVERVIEW_WIDTH=15;gc.ENTIRE_DIFF_OVERVIEW_WIDTH=30;gc.UPDATE_DIFF_DECORATIONS_DELAY=200;gc=QG([ua(3,dl),ua(4,Qs),ua(5,xe),ua(6,Re),ua(7,dt),ua(8,vt),ua(9,gi),ua(10,cl),ua(11,kc)],gc);class S5 extends z{constructor(e){super(),this._dataSource=e,this._insertColor=null,this._removeColor=null}applyColors(e){const t=e.getColor(iz)||(e.getColor(QP)||Uy).transparent(2),i=e.getColor(nz)||(e.getColor(JP)||$y).transparent(2),n=!t.equals(this._insertColor)||!i.equals(this._removeColor);return this._insertColor=t,this._removeColor=i,n}getEditorsDiffDecorations(e,t,i,n,s,r){r=r.sort((d,h)=>d.afterLineNumber-h.afterLineNumber),s=s.sort((d,h)=>d.afterLineNumber-h.afterLineNumber);const a=this._getViewZones(e,s,r,i),l=this._getOriginalEditorDecorations(a,e,t,i),c=this._getModifiedEditorDecorations(a,e,t,i,n);return{original:{decorations:l.decorations,overviewZones:l.overviewZones,zones:a.original},modified:{decorations:c.decorations,overviewZones:c.overviewZones,zones:a.modified}}}}class oM{constructor(e){this._source=e,this._index=-1,this.current=null,this.advance()}advance(){this._index++,this._index<this._source.length?this.current=this._source[this._index]:this.current=null}}class ud{constructor(e,t,i,n,s){this._lineChanges=e,this._originalForeignVZ=t,this._modifiedForeignVZ=i,this._originalEditor=n,this._modifiedEditor=s}static _getViewLineCount(e,t,i){const n=e.getModel(),s=e._getViewModel();if(n&&s){const r=sm(n,s,t,i);return r.endLineNumber-r.startLineNumber+1}return i-t+1}getViewZones(){const e=this._originalEditor.getOption(61),t=this._modifiedEditor.getOption(61),i=this._originalEditor.getOption(134).wrappingColumn!==-1,n=this._modifiedEditor.getOption(134).wrappingColumn!==-1,s=i||n,r=this._originalEditor.getModel(),a=this._originalEditor._getViewModel().coordinatesConverter,l=this._modifiedEditor._getViewModel().coordinatesConverter,c={original:[],modified:[]};let d=0,h=0,u=0,g=0,f=0,_=0;const b=(x,y)=>x.afterLineNumber-y.afterLineNumber,v=(x,y)=>{if(y.domNode===null&&x.length>0){const D=x[x.length-1];if(D.afterLineNumber===y.afterLineNumber&&D.domNode===null){D.heightInLines+=y.heightInLines;return}}x.push(y)},C=new oM(this._modifiedForeignVZ),w=new oM(this._originalForeignVZ);let S=1,k=1;for(let x=0,y=this._lineChanges.length;x<=y;x++){const D=x<y?this._lineChanges[x]:null;D!==null?(u=D.originalStartLineNumber+(D.originalEndLineNumber>0?-1:0),g=D.modifiedStartLineNumber+(D.modifiedEndLineNumber>0?-1:0),h=D.originalEndLineNumber>0?ud._getViewLineCount(this._originalEditor,D.originalStartLineNumber,D.originalEndLineNumber):0,d=D.modifiedEndLineNumber>0?ud._getViewLineCount(this._modifiedEditor,D.modifiedStartLineNumber,D.modifiedEndLineNumber):0,f=Math.max(D.originalStartLineNumber,D.originalEndLineNumber),_=Math.max(D.modifiedStartLineNumber,D.modifiedEndLineNumber)):(u+=1e7+h,g+=1e7+d,f=u,_=g);let I=[],R=[];if(s){let $;D?D.originalEndLineNumber>0?$=D.originalStartLineNumber-S:$=D.modifiedStartLineNumber-k:$=r.getLineCount()-S+1;for(let ne=0;ne<$;ne++){const ae=S+ne,de=k+ne,we=a.getModelLineViewLineCount(ae),Se=l.getModelLineViewLineCount(de);we<Se?I.push({afterLineNumber:ae,heightInLines:Se-we,domNode:null,marginDomNode:null}):we>Se&&R.push({afterLineNumber:de,heightInLines:we-Se,domNode:null,marginDomNode:null})}D&&(S=(D.originalEndLineNumber>0?D.originalEndLineNumber:D.originalStartLineNumber)+1,k=(D.modifiedEndLineNumber>0?D.modifiedEndLineNumber:D.modifiedStartLineNumber)+1)}for(;C.current&&C.current.afterLineNumber<=_;){let $;C.current.afterLineNumber<=g?$=u-g+C.current.afterLineNumber:$=f;let ne=null;D&&D.modifiedStartLineNumber<=C.current.afterLineNumber&&C.current.afterLineNumber<=D.modifiedEndLineNumber&&(ne=this._createOriginalMarginDomNodeForModifiedForeignViewZoneInAddedRegion()),I.push({afterLineNumber:$,heightInLines:C.current.height/t,domNode:null,marginDomNode:ne}),C.advance()}for(;w.current&&w.current.afterLineNumber<=f;){let $;w.current.afterLineNumber<=u?$=g-u+w.current.afterLineNumber:$=_,R.push({afterLineNumber:$,heightInLines:w.current.height/e,domNode:null}),w.advance()}if(D!==null&&bv(D)){const $=this._produceOriginalFromDiff(D,h,d);$&&I.push($)}if(D!==null&&vv(D)){const $=this._produceModifiedFromDiff(D,h,d);$&&R.push($)}let P=0,H=0;for(I=I.sort(b),R=R.sort(b);P<I.length&&H<R.length;){const $=I[P],ne=R[H],ae=$.afterLineNumber-u,de=ne.afterLineNumber-g;ae<de?(v(c.original,$),P++):de<ae?(v(c.modified,ne),H++):$.shouldNotShrink?(v(c.original,$),P++):ne.shouldNotShrink?(v(c.modified,ne),H++):$.heightInLines>=ne.heightInLines?($.heightInLines-=ne.heightInLines,H++):(ne.heightInLines-=$.heightInLines,P++)}for(;P<I.length;)v(c.original,I[P]),P++;for(;H<R.length;)v(c.modified,R[H]),H++}return{original:ud._ensureDomNodes(c.original),modified:ud._ensureDomNodes(c.modified)}}static _ensureDomNodes(e){return e.map(t=>(t.domNode||(t.domNode=D5()),t))}}function ka(o,e,t,i,n){return{range:new L(o,e,t,i),options:n}}const _n={arrowRevertChange:Ie.register({description:\"diff-editor-arrow-revert-change\",glyphMarginClassName:\"arrow-revert-change \"+nt.asClassName(m.arrowRight)}),charDelete:Ie.register({description:\"diff-editor-char-delete\",className:\"char-delete\"}),charDeleteWholeLine:Ie.register({description:\"diff-editor-char-delete-whole-line\",className:\"char-delete\",isWholeLine:!0}),charInsert:Ie.register({description:\"diff-editor-char-insert\",className:\"char-insert\"}),charInsertWholeLine:Ie.register({description:\"diff-editor-char-insert-whole-line\",className:\"char-insert\",isWholeLine:!0}),lineInsert:Ie.register({description:\"diff-editor-line-insert\",className:\"line-insert\",marginClassName:\"gutter-insert\",isWholeLine:!0}),lineInsertWithSign:Ie.register({description:\"diff-editor-line-insert-with-sign\",className:\"line-insert\",linesDecorationsClassName:\"insert-sign \"+nt.asClassName(eZ),marginClassName:\"gutter-insert\",isWholeLine:!0}),lineDelete:Ie.register({description:\"diff-editor-line-delete\",className:\"line-delete\",marginClassName:\"gutter-delete\",isWholeLine:!0}),lineDeleteWithSign:Ie.register({description:\"diff-editor-line-delete-with-sign\",className:\"line-delete\",linesDecorationsClassName:\"delete-sign \"+nt.asClassName(w5),marginClassName:\"gutter-delete\",isWholeLine:!0}),lineDeleteMargin:Ie.register({description:\"diff-editor-line-delete-margin\",marginClassName:\"gutter-delete\"})};class Aa extends S5{constructor(e,t){super(e),this._disableSash=t===!1,this._sashRatio=null,this._sashPosition=null,this._startSashPosition=null,this._sash=this._register(new Zi(this._dataSource.getContainerDomNode(),this,{orientation:0})),this._disableSash&&(this._sash.state=0),this._sash.onDidStart(()=>this._onSashDragStart()),this._sash.onDidChange(i=>this._onSashDrag(i)),this._sash.onDidEnd(()=>this._onSashDragEnd()),this._sash.onDidReset(()=>this._onSashReset())}setEnableSplitViewResizing(e){const t=e===!1;this._disableSash!==t&&(this._disableSash=t,this._sash.state=this._disableSash?0:3)}layout(e=this._sashRatio){const i=this._dataSource.getWidth()-(this._dataSource.getOptions().renderOverviewRuler?gc.ENTIRE_DIFF_OVERVIEW_WIDTH:0);let n=Math.floor((e||.5)*i);const s=Math.floor(.5*i);return n=this._disableSash?s:n||s,i>Aa.MINIMUM_EDITOR_WIDTH*2?(n<Aa.MINIMUM_EDITOR_WIDTH&&(n=Aa.MINIMUM_EDITOR_WIDTH),n>i-Aa.MINIMUM_EDITOR_WIDTH&&(n=i-Aa.MINIMUM_EDITOR_WIDTH)):n=s,this._sashPosition!==n&&(this._sashPosition=n),this._sash.layout(),this._sashPosition}_onSashDragStart(){this._startSashPosition=this._sashPosition}_onSashDrag(e){const i=this._dataSource.getWidth()-(this._dataSource.getOptions().renderOverviewRuler?gc.ENTIRE_DIFF_OVERVIEW_WIDTH:0),n=this.layout((this._startSashPosition+(e.currentX-e.startX))/i);this._sashRatio=n/i,this._dataSource.relayoutEditors()}_onSashDragEnd(){this._sash.layout()}_onSashReset(){this._sashRatio=.5,this._dataSource.relayoutEditors(),this._sash.layout()}getVerticalSashTop(e){return 0}getVerticalSashLeft(e){return this._sashPosition}getVerticalSashHeight(e){return this._dataSource.getHeight()}_getViewZones(e,t,i){const n=this._dataSource.getOriginalEditor(),s=this._dataSource.getModifiedEditor();return new tZ(e,t,i,n,s).getViewZones()}_getOriginalEditorDecorations(e,t,i,n){const s=this._dataSource.getOriginalEditor(),r=String(this._removeColor),a={decorations:[],overviewZones:[]},l=s.getModel(),c=s._getViewModel();for(const d of t)if(vv(d)){a.decorations.push({range:new L(d.originalStartLineNumber,1,d.originalEndLineNumber,1073741824),options:n?_n.lineDeleteWithSign:_n.lineDelete}),(!bv(d)||!d.charChanges)&&a.decorations.push(ka(d.originalStartLineNumber,1,d.originalEndLineNumber,1073741824,_n.charDeleteWholeLine));const h=sm(l,c,d.originalStartLineNumber,d.originalEndLineNumber);if(a.overviewZones.push(new Zp(h.startLineNumber,h.endLineNumber,0,r)),d.charChanges){for(const u of d.charChanges)if(L5(u))if(i)for(let g=u.originalStartLineNumber;g<=u.originalEndLineNumber;g++){let f,_;g===u.originalStartLineNumber?f=u.originalStartColumn:f=l.getLineFirstNonWhitespaceColumn(g),g===u.originalEndLineNumber?_=u.originalEndColumn:_=l.getLineLastNonWhitespaceColumn(g),a.decorations.push(ka(g,f,g,_,_n.charDelete))}else a.decorations.push(ka(u.originalStartLineNumber,u.originalStartColumn,u.originalEndLineNumber,u.originalEndColumn,_n.charDelete))}}return a}_getModifiedEditorDecorations(e,t,i,n,s){const r=this._dataSource.getModifiedEditor(),a=String(this._insertColor),l={decorations:[],overviewZones:[]},c=r.getModel(),d=r._getViewModel();for(const h of t){if(s)if(h.modifiedEndLineNumber>0)l.decorations.push({range:new L(h.modifiedStartLineNumber,1,h.modifiedStartLineNumber,1),options:_n.arrowRevertChange});else{const u=e.modified.find(g=>g.afterLineNumber===h.modifiedStartLineNumber);u&&(u.marginDomNode=sZ())}if(bv(h)){l.decorations.push({range:new L(h.modifiedStartLineNumber,1,h.modifiedEndLineNumber,1073741824),options:n?_n.lineInsertWithSign:_n.lineInsert}),(!vv(h)||!h.charChanges)&&l.decorations.push(ka(h.modifiedStartLineNumber,1,h.modifiedEndLineNumber,1073741824,_n.charInsertWholeLine));const u=sm(c,d,h.modifiedStartLineNumber,h.modifiedEndLineNumber);if(l.overviewZones.push(new Zp(u.startLineNumber,u.endLineNumber,0,a)),h.charChanges){for(const g of h.charChanges)if(y5(g))if(i)for(let f=g.modifiedStartLineNumber;f<=g.modifiedEndLineNumber;f++){let _,b;f===g.modifiedStartLineNumber?_=g.modifiedStartColumn:_=c.getLineFirstNonWhitespaceColumn(f),f===g.modifiedEndLineNumber?b=g.modifiedEndColumn:b=c.getLineLastNonWhitespaceColumn(f),l.decorations.push(ka(f,_,f,b,_n.charInsert))}else l.decorations.push(ka(g.modifiedStartLineNumber,g.modifiedStartColumn,g.modifiedEndLineNumber,g.modifiedEndColumn,_n.charInsert))}}}return l}}Aa.MINIMUM_EDITOR_WIDTH=100;class tZ extends ud{constructor(e,t,i,n,s){super(e,t,i,n,s)}_createOriginalMarginDomNodeForModifiedForeignViewZoneInAddedRegion(){return null}_produceOriginalFromDiff(e,t,i){return i>t?{afterLineNumber:Math.max(e.originalStartLineNumber,e.originalEndLineNumber),heightInLines:i-t,domNode:null}:null}_produceModifiedFromDiff(e,t,i){return t>i?{afterLineNumber:Math.max(e.modifiedStartLineNumber,e.modifiedEndLineNumber),heightInLines:t-i,domNode:null}:null}}class rM extends S5{constructor(e,t){super(e),this._decorationsLeft=e.getOriginalEditor().getLayoutInfo().decorationsLeft,this._register(e.getOriginalEditor().onDidLayoutChange(i=>{this._decorationsLeft!==i.decorationsLeft&&(this._decorationsLeft=i.decorationsLeft,e.relayoutEditors())}))}setEnableSplitViewResizing(e){}_getViewZones(e,t,i,n){const s=this._dataSource.getOriginalEditor(),r=this._dataSource.getModifiedEditor();return new iZ(e,t,i,s,r,n).getViewZones()}_getOriginalEditorDecorations(e,t,i,n){const s=String(this._removeColor),r={decorations:[],overviewZones:[]},a=this._dataSource.getOriginalEditor(),l=a.getModel(),c=a._getViewModel();let d=0;for(const h of t)if(vv(h)){for(r.decorations.push({range:new L(h.originalStartLineNumber,1,h.originalEndLineNumber,1073741824),options:_n.lineDeleteMargin});d<e.modified.length;){const f=e.modified[d];if(f.diff&&f.diff.originalStartLineNumber>=h.originalStartLineNumber)break;d++}let u=0;if(d<e.modified.length){const f=e.modified[d];f.diff&&f.diff.originalStartLineNumber===h.originalStartLineNumber&&f.diff.originalEndLineNumber===h.originalEndLineNumber&&f.diff.modifiedStartLineNumber===h.modifiedStartLineNumber&&f.diff.modifiedEndLineNumber===h.modifiedEndLineNumber&&(u=f.heightInLines)}const g=sm(l,c,h.originalStartLineNumber,h.originalEndLineNumber);r.overviewZones.push(new Zp(g.startLineNumber,g.endLineNumber,u,s))}return r}_getModifiedEditorDecorations(e,t,i,n,s){const r=this._dataSource.getModifiedEditor(),a=String(this._insertColor),l={decorations:[],overviewZones:[]},c=r.getModel(),d=r._getViewModel();for(const h of t)if(bv(h)){l.decorations.push({range:new L(h.modifiedStartLineNumber,1,h.modifiedEndLineNumber,1073741824),options:n?_n.lineInsertWithSign:_n.lineInsert});const u=sm(c,d,h.modifiedStartLineNumber,h.modifiedEndLineNumber);if(l.overviewZones.push(new Zp(u.startLineNumber,u.endLineNumber,0,a)),h.charChanges){for(const g of h.charChanges)if(y5(g))if(i)for(let f=g.modifiedStartLineNumber;f<=g.modifiedEndLineNumber;f++){let _,b;f===g.modifiedStartLineNumber?_=g.modifiedStartColumn:_=c.getLineFirstNonWhitespaceColumn(f),f===g.modifiedEndLineNumber?b=g.modifiedEndColumn:b=c.getLineLastNonWhitespaceColumn(f),l.decorations.push(ka(f,_,f,b,_n.charInsert))}else l.decorations.push(ka(g.modifiedStartLineNumber,g.modifiedStartColumn,g.modifiedEndLineNumber,g.modifiedEndColumn,_n.charInsert))}else l.decorations.push(ka(h.modifiedStartLineNumber,1,h.modifiedEndLineNumber,1073741824,_n.charInsertWholeLine))}return l}layout(){return Math.max(5,this._decorationsLeft)}}class iZ extends ud{constructor(e,t,i,n,s,r){super(e,t,i,n,s),this._originalModel=n.getModel(),this._renderIndicators=r,this._pendingLineChange=[],this._pendingViewZones=[],this._lineBreaksComputer=this._modifiedEditor._getViewModel().createLineBreaksComputer()}getViewZones(){const e=super.getViewZones();return this._finalize(e),e}_createOriginalMarginDomNodeForModifiedForeignViewZoneInAddedRegion(){const e=document.createElement(\"div\");return e.className=\"inline-added-margin-view-zone\",e}_produceOriginalFromDiff(e,t,i){const n=document.createElement(\"div\");return n.className=\"inline-added-margin-view-zone\",{afterLineNumber:Math.max(e.originalStartLineNumber,e.originalEndLineNumber),heightInLines:i,domNode:document.createElement(\"div\"),marginDomNode:n}}_produceModifiedFromDiff(e,t,i){const n=document.createElement(\"div\");n.className=`view-lines line-delete ${vd}`;const s=document.createElement(\"div\");s.className=\"inline-deleted-margin-view-zone\";const r={shouldNotShrink:!0,afterLineNumber:e.modifiedEndLineNumber===0?e.modifiedStartLineNumber:e.modifiedStartLineNumber-1,heightInLines:t,minWidthInPx:0,domNode:n,marginDomNode:s,diff:{originalStartLineNumber:e.originalStartLineNumber,originalEndLineNumber:e.originalEndLineNumber,modifiedStartLineNumber:e.modifiedStartLineNumber,modifiedEndLineNumber:e.modifiedEndLineNumber,originalModel:this._originalModel,viewLineCounts:null}};for(let a=e.originalStartLineNumber;a<=e.originalEndLineNumber;a++)this._lineBreaksComputer.addRequest(this._originalModel.getLineContent(a),null,null);return this._pendingLineChange.push(e),this._pendingViewZones.push(r),r}_finalize(e){const t=this._modifiedEditor.getOptions(),i=this._modifiedEditor.getModel().getOptions().tabSize,n=t.get(46),s=t.get(29),r=n.typicalHalfwidthCharacterWidth,a=t.get(95),l=this._originalModel.mightContainNonBasicASCII(),c=this._originalModel.mightContainRTL(),d=t.get(61),u=t.get(133).decorationsWidth,g=t.get(107),f=t.get(90),_=t.get(85),b=t.get(47),v=this._lineBreaksComputer.finalize();let C=0;for(let w=0;w<this._pendingLineChange.length;w++){const S=this._pendingLineChange[w],k=this._pendingViewZones[w],x=k.domNode;tn(x,n);const y=k.marginDomNode;tn(y,n);const D=[];if(S.charChanges)for(const de of S.charChanges)L5(de)&&D.push(new tp(new L(de.originalStartLineNumber,de.originalStartColumn,de.originalEndLineNumber,de.originalEndColumn),\"char-delete\",0));const I=D.length>0,R=lc(1e4);let P=0,H=0,$=null;for(let de=S.originalStartLineNumber;de<=S.originalEndLineNumber;de++){const we=de-S.originalStartLineNumber,Se=this._originalModel.tokenization.getLineTokens(de),Me=Se.getLineContent(),St=v[C++],mt=es.filter(D,de,1,Me.length+1);if(St){let _e=0;for(const It of St.breakOffsets){const Ri=Se.sliceAndInflate(_e,It,0),Dn=Me.substring(_e,It);P=Math.max(P,this._renderOriginalLine(H++,Dn,Ri,es.extractWrapped(mt,_e,It),I,l,c,n,s,d,u,g,f,_,b,i,R,y)),_e=It}for($||($=[]);$.length<we;)$[$.length]=1;$[we]=St.breakOffsets.length,k.heightInLines+=St.breakOffsets.length-1;const ge=document.createElement(\"div\");ge.className=\"gutter-delete\",e.original.push({afterLineNumber:de,afterColumn:0,heightInLines:St.breakOffsets.length-1,domNode:D5(),marginDomNode:ge})}else P=Math.max(P,this._renderOriginalLine(H++,Me,Se,mt,I,l,c,n,s,d,u,g,f,_,b,i,R,y))}P+=a;const ne=R.build(),ae=sM?sM.createHTML(ne):ne;if(x.innerHTML=ae,k.minWidthInPx=P*r,$){const de=S.originalEndLineNumber-S.originalStartLineNumber;for(;$.length<=de;)$[$.length]=1}k.diff.viewLineCounts=$}e.original.sort((w,S)=>w.afterLineNumber-S.afterLineNumber)}_renderOriginalLine(e,t,i,n,s,r,a,l,c,d,h,u,g,f,_,b,v,C){v.appendASCIIString('<div class=\"view-line'),s||v.appendASCIIString(\" char-delete\"),v.appendASCIIString('\" style=\"top:'),v.appendASCIIString(String(e*d)),v.appendASCIIString('px;width:1000000px;\">');const w=xs.isBasicASCII(t,r),S=xs.containsRTL(t,w,a),k=Ym(new Dc(l.isMonospace&&!c,l.canUseHalfwidthRightwardsArrow,t,!1,w,S,0,i,n,b,0,l.spaceWidth,l.middotWidth,l.wsmiddotWidth,u,g,f,_!==vs.OFF,null),v);if(v.appendASCIIString(\"</div>\"),this._renderIndicators){const x=document.createElement(\"div\");x.className=`delete-sign ${nt.asClassName(w5)}`,x.setAttribute(\"style\",`position:absolute;top:${e*d}px;width:${h}px;height:${d}px;right:0;`),C.appendChild(x)}return k.characterMapping.getHorizontalOffset(k.characterMapping.length)}}function nZ(o,e){return Ui(o,e,[\"off\",\"on\",\"inherit\"])}function bv(o){return o.modifiedEndLineNumber>0}function vv(o){return o.originalEndLineNumber>0}function y5(o){return o.modifiedStartLineNumber===o.modifiedEndLineNumber?o.modifiedEndColumn-o.modifiedStartColumn>0:o.modifiedEndLineNumber-o.modifiedStartLineNumber>0}function L5(o){return o.originalStartLineNumber===o.originalEndLineNumber?o.originalEndColumn-o.originalStartColumn>0:o.originalEndLineNumber-o.originalStartLineNumber>0}function D5(){const o=document.createElement(\"div\");return o.className=\"diagonal-fill\",o}function sZ(){const o=document.createElement(\"div\");return o.className=\"arrow-revert-change \"+nt.asClassName(m.arrowRight),se(\"div\",{},o)}function sm(o,e,t,i){const n=o.getLineCount();return t=Math.min(n,Math.max(1,t)),i=Math.min(n,Math.max(1,i)),e.coordinatesConverter.convertModelRangeToViewRange(new L(t,o.getLineMinColumn(t),i,o.getLineMaxColumn(i)))}function aM(o,e){return{enableSplitViewResizing:Ce(o.enableSplitViewResizing,e.enableSplitViewResizing),renderSideBySide:Ce(o.renderSideBySide,e.renderSideBySide),renderMarginRevertIcon:Ce(o.renderMarginRevertIcon,e.renderMarginRevertIcon),maxComputationTime:Py(o.maxComputationTime,e.maxComputationTime,0,1073741824),maxFileSize:Py(o.maxFileSize,e.maxFileSize,0,1073741824),ignoreTrimWhitespace:Ce(o.ignoreTrimWhitespace,e.ignoreTrimWhitespace),renderIndicators:Ce(o.renderIndicators,e.renderIndicators),originalEditable:Ce(o.originalEditable,e.originalEditable),diffCodeLens:Ce(o.diffCodeLens,e.diffCodeLens),renderOverviewRuler:Ce(o.renderOverviewRuler,e.renderOverviewRuler),diffWordWrap:nZ(o.diffWordWrap,e.diffWordWrap)}}function oZ(o,e){return{enableSplitViewResizing:o.enableSplitViewResizing!==e.enableSplitViewResizing,renderSideBySide:o.renderSideBySide!==e.renderSideBySide,renderMarginRevertIcon:o.renderMarginRevertIcon!==e.renderMarginRevertIcon,maxComputationTime:o.maxComputationTime!==e.maxComputationTime,maxFileSize:o.maxFileSize!==e.maxFileSize,ignoreTrimWhitespace:o.ignoreTrimWhitespace!==e.ignoreTrimWhitespace,renderIndicators:o.renderIndicators!==e.renderIndicators,originalEditable:o.originalEditable!==e.originalEditable,diffCodeLens:o.diffCodeLens!==e.diffCodeLens,renderOverviewRuler:o.renderOverviewRuler!==e.renderOverviewRuler,diffWordWrap:o.diffWordWrap!==e.diffWordWrap}}Rt((o,e)=>{const t=o.getColor(QP);t&&e.addRule(`.monaco-editor .char-insert, .monaco-diff-editor .char-insert { background-color: ${t}; }`);const i=o.getColor(QH)||t;i&&e.addRule(`.monaco-editor .line-insert, .monaco-diff-editor .line-insert { background-color: ${i}; }`);const n=o.getColor(ez)||i;n&&(e.addRule(`.monaco-editor .inline-added-margin-view-zone { background-color: ${n}; }`),e.addRule(`.monaco-editor .gutter-insert, .monaco-diff-editor .gutter-insert { background-color: ${n}; }`));const s=o.getColor(JP);s&&e.addRule(`.monaco-editor .char-delete, .monaco-diff-editor .char-delete { background-color: ${s}; }`);const r=o.getColor(JH)||s;r&&e.addRule(`.monaco-editor .line-delete, .monaco-diff-editor .line-delete { background-color: ${r}; }`);const a=o.getColor(tz)||r;a&&(e.addRule(`.monaco-editor .inline-deleted-margin-view-zone { background-color: ${a}; }`),e.addRule(`.monaco-editor .gutter-delete, .monaco-diff-editor .gutter-delete { background-color: ${a}; }`));const l=o.getColor(sz);l&&e.addRule(`.monaco-editor .line-insert, .monaco-editor .char-insert { border: 1px ${yn(o.type)?\"dashed\":\"solid\"} ${l}; }`);const c=o.getColor(oz);c&&e.addRule(`.monaco-editor .line-delete, .monaco-editor .char-delete { border: 1px ${yn(o.type)?\"dashed\":\"solid\"} ${c}; }`);const d=o.getColor(Hg);d&&e.addRule(`.monaco-diff-editor.side-by-side .editor.modified { box-shadow: -6px 0 5px -5px ${d}; }`);const h=o.getColor(rz);h&&e.addRule(`.monaco-diff-editor.side-by-side .editor.modified { border-left: 1px solid ${h}; }`);const u=o.getColor(rd);u&&e.addRule(`\n\t\t\t.monaco-diff-editor .diffViewport {\n\t\t\t\tbackground: ${u};\n\t\t\t}\n\t\t`);const g=o.getColor(ad);g&&e.addRule(`\n\t\t\t.monaco-diff-editor .diffViewport:hover {\n\t\t\t\tbackground: ${g};\n\t\t\t}\n\t\t`);const f=o.getColor(ld);f&&e.addRule(`\n\t\t\t.monaco-diff-editor .diffViewport:active {\n\t\t\t\tbackground: ${f};\n\t\t\t}\n\t\t`);const _=o.getColor(az);e.addRule(`\n\t.monaco-editor .diagonal-fill {\n\t\tbackground-image: linear-gradient(\n\t\t\t-45deg,\n\t\t\t${_} 12.5%,\n\t\t\t#0000 12.5%, #0000 50%,\n\t\t\t${_} 50%, ${_} 62.5%,\n\t\t\t#0000 62.5%, #0000 100%\n\t\t);\n\t\tbackground-size: 8px 8px;\n\t}\n\t`)});const rZ={followsCaret:!0,ignoreCharChanges:!0,alwaysRevealFirst:!0};class aZ extends z{constructor(e,t={}){super(),this._onDidUpdate=this._register(new O),this._editor=e,this._options=ea(t,rZ,!1),this.disposed=!1,this.nextIdx=-1,this.ranges=[],this.ignoreSelectionChange=!1,this.revealFirst=Boolean(this._options.alwaysRevealFirst),this._register(this._editor.onDidDispose(()=>this.dispose())),this._register(this._editor.onDidUpdateDiff(()=>this._onDiffUpdated())),this._options.followsCaret&&this._register(this._editor.getModifiedEditor().onDidChangeCursorPosition(i=>{this.ignoreSelectionChange||(this.nextIdx=-1)})),this._options.alwaysRevealFirst&&this._register(this._editor.getModifiedEditor().onDidChangeModel(i=>{this.revealFirst=!0})),this._init()}_init(){this._editor.getLineChanges()}_onDiffUpdated(){this._init(),this._compute(this._editor.getLineChanges()),this.revealFirst&&this._editor.getLineChanges()!==null&&(this.revealFirst=!1,this.nextIdx=-1,this.next(1))}_compute(e){this.ranges=[],e&&e.forEach(t=>{!this._options.ignoreCharChanges&&t.charChanges?t.charChanges.forEach(i=>{this.ranges.push({rhs:!0,range:new L(i.modifiedStartLineNumber,i.modifiedStartColumn,i.modifiedEndLineNumber,i.modifiedEndColumn)})}):t.modifiedEndLineNumber===0?this.ranges.push({rhs:!0,range:new L(t.modifiedStartLineNumber,1,t.modifiedStartLineNumber+1,1)}):this.ranges.push({rhs:!0,range:new L(t.modifiedStartLineNumber,1,t.modifiedEndLineNumber+1,1)})}),this.ranges.sort((t,i)=>L.compareRangesUsingStarts(t.range,i.range)),this._onDidUpdate.fire(this)}_initIdx(e){let t=!1;const i=this._editor.getPosition();if(!i){this.nextIdx=0;return}for(let n=0,s=this.ranges.length;n<s&&!t;n++){const r=this.ranges[n].range;i.isBeforeOrEqual(r.getStartPosition())&&(this.nextIdx=n+(e?0:-1),t=!0)}t||(this.nextIdx=e?0:this.ranges.length-1),this.nextIdx<0&&(this.nextIdx=this.ranges.length-1)}_move(e,t){if(Yf(!this.disposed,\"Illegal State - diff navigator has been disposed\"),!this.canNavigate())return;this.nextIdx===-1?this._initIdx(e):e?(this.nextIdx+=1,this.nextIdx>=this.ranges.length&&(this.nextIdx=0)):(this.nextIdx-=1,this.nextIdx<0&&(this.nextIdx=this.ranges.length-1));const i=this.ranges[this.nextIdx];this.ignoreSelectionChange=!0;try{const n=i.range.getStartPosition();this._editor.setPosition(n),this._editor.revealRangeInCenter(i.range,t)}finally{this.ignoreSelectionChange=!1}}canNavigate(){return this.ranges&&this.ranges.length>0}next(e=0){this._move(!0,e)}previous(e=0){this._move(!1,e)}dispose(){super.dispose(),this.ranges=[],this.disposed=!0}}var lZ=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},cZ=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},h1=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const u1=new ce(\"selectionAnchorSet\",!1);let nl=class k5{constructor(e,t){this.editor=e,this.selectionAnchorSetContextKey=u1.bindTo(t),this.modelChangeListener=e.onDidChangeModel(()=>this.selectionAnchorSetContextKey.reset())}static get(e){return e.getContribution(k5.ID)}setSelectionAnchor(){if(this.editor.hasModel()){const e=this.editor.getPosition();this.editor.changeDecorations(t=>{this.decorationId&&t.removeDecoration(this.decorationId),this.decorationId=t.addDecoration(oe.fromPositions(e,e),{description:\"selection-anchor\",stickiness:1,hoverMessage:new Rn().appendText(p(\"selectionAnchor\",\"Selection Anchor\")),className:\"selection-anchor\"})}),this.selectionAnchorSetContextKey.set(!!this.decorationId),un(p(\"anchorSet\",\"Anchor set at {0}:{1}\",e.lineNumber,e.column))}}goToSelectionAnchor(){if(this.editor.hasModel()&&this.decorationId){const e=this.editor.getModel().getDecorationRange(this.decorationId);e&&this.editor.setPosition(e.getStartPosition())}}selectFromAnchorToCursor(){if(this.editor.hasModel()&&this.decorationId){const e=this.editor.getModel().getDecorationRange(this.decorationId);if(e){const t=this.editor.getPosition();this.editor.setSelection(oe.fromPositions(e.getStartPosition(),t)),this.cancelSelectionAnchor()}}}cancelSelectionAnchor(){if(this.decorationId){const e=this.decorationId;this.editor.changeDecorations(t=>{t.removeDecoration(e),this.decorationId=void 0}),this.selectionAnchorSetContextKey.set(!1)}}dispose(){this.cancelSelectionAnchor(),this.modelChangeListener.dispose()}};nl.ID=\"editor.contrib.selectionAnchorController\";nl=lZ([cZ(1,xe)],nl);class dZ extends he{constructor(){super({id:\"editor.action.setSelectionAnchor\",label:p(\"setSelectionAnchor\",\"Set Selection Anchor\"),alias:\"Set Selection Anchor\",precondition:void 0,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2080),weight:100}})}run(e,t){var i;return h1(this,void 0,void 0,function*(){(i=nl.get(t))===null||i===void 0||i.setSelectionAnchor()})}}class hZ extends he{constructor(){super({id:\"editor.action.goToSelectionAnchor\",label:p(\"goToSelectionAnchor\",\"Go to Selection Anchor\"),alias:\"Go to Selection Anchor\",precondition:u1})}run(e,t){var i;return h1(this,void 0,void 0,function*(){(i=nl.get(t))===null||i===void 0||i.goToSelectionAnchor()})}}class uZ extends he{constructor(){super({id:\"editor.action.selectFromAnchorToCursor\",label:p(\"selectFromAnchorToCursor\",\"Select from Anchor to Cursor\"),alias:\"Select from Anchor to Cursor\",precondition:u1,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2089),weight:100}})}run(e,t){var i;return h1(this,void 0,void 0,function*(){(i=nl.get(t))===null||i===void 0||i.selectFromAnchorToCursor()})}}class gZ extends he{constructor(){super({id:\"editor.action.cancelSelectionAnchor\",label:p(\"cancelSelectionAnchor\",\"Cancel Selection Anchor\"),alias:\"Cancel Selection Anchor\",precondition:u1,kbOpts:{kbExpr:T.editorTextFocus,primary:9,weight:100}})}run(e,t){var i;return h1(this,void 0,void 0,function*(){(i=nl.get(t))===null||i===void 0||i.cancelSelectionAnchor()})}}rt(nl.ID,nl);te(dZ);te(hZ);te(uZ);te(gZ);const fZ=N(\"editorOverviewRuler.bracketMatchForeground\",{dark:\"#A0A0A0\",light:\"#A0A0A0\",hcDark:\"#A0A0A0\",hcLight:\"#A0A0A0\"},p(\"overviewRulerBracketMatchForeground\",\"Overview ruler marker color for matching brackets.\"));class pZ extends he{constructor(){super({id:\"editor.action.jumpToBracket\",label:p(\"smartSelect.jumpBracket\",\"Go to Bracket\"),alias:\"Go to Bracket\",precondition:void 0,kbOpts:{kbExpr:T.editorTextFocus,primary:3160,weight:100}})}run(e,t){var i;(i=Ko.get(t))===null||i===void 0||i.jumpToBracket()}}class mZ extends he{constructor(){super({id:\"editor.action.selectToBracket\",label:p(\"smartSelect.selectToBracket\",\"Select to Bracket\"),alias:\"Select to Bracket\",precondition:void 0,description:{description:\"Select to Bracket\",args:[{name:\"args\",schema:{type:\"object\",properties:{selectBrackets:{type:\"boolean\",default:!0}}}}]}})}run(e,t,i){var n;let s=!0;i&&i.selectBrackets===!1&&(s=!1),(n=Ko.get(t))===null||n===void 0||n.selectToBracket(s)}}class _Z{constructor(e,t,i){this.position=e,this.brackets=t,this.options=i}}class Ko extends z{constructor(e){super(),this._editor=e,this._lastBracketsData=[],this._lastVersionId=0,this._decorations=this._editor.createDecorationsCollection(),this._updateBracketsSoon=this._register(new ft(()=>this._updateBrackets(),50)),this._matchBrackets=this._editor.getOption(66),this._updateBracketsSoon.schedule(),this._register(e.onDidChangeCursorPosition(t=>{this._matchBrackets!==\"never\"&&this._updateBracketsSoon.schedule()})),this._register(e.onDidChangeModelContent(t=>{this._updateBracketsSoon.schedule()})),this._register(e.onDidChangeModel(t=>{this._lastBracketsData=[],this._updateBracketsSoon.schedule()})),this._register(e.onDidChangeModelLanguageConfiguration(t=>{this._lastBracketsData=[],this._updateBracketsSoon.schedule()})),this._register(e.onDidChangeConfiguration(t=>{t.hasChanged(66)&&(this._matchBrackets=this._editor.getOption(66),this._decorations.clear(),this._lastBracketsData=[],this._lastVersionId=0,this._updateBracketsSoon.schedule())})),this._register(e.onDidBlurEditorWidget(()=>{this._updateBracketsSoon.schedule()})),this._register(e.onDidFocusEditorWidget(()=>{this._updateBracketsSoon.schedule()}))}static get(e){return e.getContribution(Ko.ID)}jumpToBracket(){if(!this._editor.hasModel())return;const e=this._editor.getModel(),t=this._editor.getSelections().map(i=>{const n=i.getStartPosition(),s=e.bracketPairs.matchBracket(n);let r=null;if(s)s[0].containsPosition(n)&&!s[1].containsPosition(n)?r=s[1].getStartPosition():s[1].containsPosition(n)&&(r=s[0].getStartPosition());else{const a=e.bracketPairs.findEnclosingBrackets(n);if(a)r=a[1].getStartPosition();else{const l=e.bracketPairs.findNextBracket(n);l&&l.range&&(r=l.range.getStartPosition())}}return r?new oe(r.lineNumber,r.column,r.lineNumber,r.column):new oe(n.lineNumber,n.column,n.lineNumber,n.column)});this._editor.setSelections(t),this._editor.revealRange(t[0])}selectToBracket(e){if(!this._editor.hasModel())return;const t=this._editor.getModel(),i=[];this._editor.getSelections().forEach(n=>{const s=n.getStartPosition();let r=t.bracketPairs.matchBracket(s);if(!r&&(r=t.bracketPairs.findEnclosingBrackets(s),!r)){const c=t.bracketPairs.findNextBracket(s);c&&c.range&&(r=t.bracketPairs.matchBracket(c.range.getStartPosition()))}let a=null,l=null;if(r){r.sort(L.compareRangesUsingStarts);const[c,d]=r;if(a=e?c.getStartPosition():c.getEndPosition(),l=e?d.getEndPosition():d.getStartPosition(),d.containsPosition(s)){const h=a;a=l,l=h}}a&&l&&i.push(new oe(a.lineNumber,a.column,l.lineNumber,l.column))}),i.length>0&&(this._editor.setSelections(i),this._editor.revealRange(i[0]))}_updateBrackets(){if(this._matchBrackets===\"never\")return;this._recomputeBrackets();const e=[];let t=0;for(const i of this._lastBracketsData){const n=i.brackets;n&&(e[t++]={range:n[0],options:i.options},e[t++]={range:n[1],options:i.options})}this._decorations.set(e)}_recomputeBrackets(){if(!this._editor.hasModel()||!this._editor.hasWidgetFocus()){this._lastBracketsData=[],this._lastVersionId=0;return}const e=this._editor.getSelections();if(e.length>100){this._lastBracketsData=[],this._lastVersionId=0;return}const t=this._editor.getModel(),i=t.getVersionId();let n=[];this._lastVersionId===i&&(n=this._lastBracketsData);const s=[];let r=0;for(let h=0,u=e.length;h<u;h++){const g=e[h];g.isEmpty()&&(s[r++]=g.getStartPosition())}s.length>1&&s.sort(B.compare);const a=[];let l=0,c=0;const d=n.length;for(let h=0,u=s.length;h<u;h++){const g=s[h];for(;c<d&&n[c].position.isBefore(g);)c++;if(c<d&&n[c].position.equals(g))a[l++]=n[c];else{let f=t.bracketPairs.matchBracket(g,20),_=Ko._DECORATION_OPTIONS_WITH_OVERVIEW_RULER;!f&&this._matchBrackets===\"always\"&&(f=t.bracketPairs.findEnclosingBrackets(g,20),_=Ko._DECORATION_OPTIONS_WITHOUT_OVERVIEW_RULER),a[l++]=new _Z(g,f,_)}}this._lastBracketsData=a,this._lastVersionId=i}}Ko.ID=\"editor.contrib.bracketMatchingController\";Ko._DECORATION_OPTIONS_WITH_OVERVIEW_RULER=Ie.register({description:\"bracket-match-overview\",stickiness:1,className:\"bracket-match\",overviewRuler:{color:Qt(fZ),position:vo.Center}});Ko._DECORATION_OPTIONS_WITHOUT_OVERVIEW_RULER=Ie.register({description:\"bracket-match-no-overview\",stickiness:1,className:\"bracket-match\"});rt(Ko.ID,Ko);te(mZ);te(pZ);Rt((o,e)=>{const t=o.getColor(FU);t&&e.addRule(`.monaco-editor .bracket-match { background-color: ${t}; }`);const i=o.getColor(g4);i&&e.addRule(`.monaco-editor .bracket-match { border: 1px solid ${i}; }`)});po.appendMenuItem(A.MenubarGoMenu,{group:\"5_infile_nav\",command:{id:\"editor.action.jumpToBracket\",title:p({key:\"miGoToBracket\",comment:[\"&& denotes a mnemonic\"]},\"Go to &&Bracket\")},order:2});class bZ{constructor(e,t){this._selection=e,this._isMovingLeft=t}getEditOperations(e,t){if(this._selection.startLineNumber!==this._selection.endLineNumber||this._selection.isEmpty())return;const i=this._selection.startLineNumber,n=this._selection.startColumn,s=this._selection.endColumn;if(!(this._isMovingLeft&&n===1)&&!(!this._isMovingLeft&&s===e.getLineMaxColumn(i)))if(this._isMovingLeft){const r=new L(i,n-1,i,n),a=e.getValueInRange(r);t.addEditOperation(r,null),t.addEditOperation(new L(i,s,i,s),a)}else{const r=new L(i,s,i,s+1),a=e.getValueInRange(r);t.addEditOperation(r,null),t.addEditOperation(new L(i,n,i,n),a)}}computeCursorState(e,t){return this._isMovingLeft?new oe(this._selection.startLineNumber,this._selection.startColumn-1,this._selection.endLineNumber,this._selection.endColumn-1):new oe(this._selection.startLineNumber,this._selection.startColumn+1,this._selection.endLineNumber,this._selection.endColumn+1)}}class x5 extends he{constructor(e,t){super(t),this.left=e}run(e,t){if(!t.hasModel())return;const i=[],n=t.getSelections();for(const s of n)i.push(new bZ(s,this.left));t.pushUndoStop(),t.executeCommands(this.id,i),t.pushUndoStop()}}class vZ extends x5{constructor(){super(!0,{id:\"editor.action.moveCarretLeftAction\",label:p(\"caret.moveLeft\",\"Move Selected Text Left\"),alias:\"Move Selected Text Left\",precondition:T.writable})}}class CZ extends x5{constructor(){super(!1,{id:\"editor.action.moveCarretRightAction\",label:p(\"caret.moveRight\",\"Move Selected Text Right\"),alias:\"Move Selected Text Right\",precondition:T.writable})}}te(vZ);te(CZ);class wZ extends he{constructor(){super({id:\"editor.action.transposeLetters\",label:p(\"transposeLetters.label\",\"Transpose Letters\"),alias:\"Transpose Letters\",precondition:T.writable,kbOpts:{kbExpr:T.textInputFocus,primary:0,mac:{primary:306},weight:100}})}run(e,t){if(!t.hasModel())return;const i=t.getModel(),n=[],s=t.getSelections();for(const r of s){if(!r.isEmpty())continue;const a=r.startLineNumber,l=r.startColumn,c=i.getLineMaxColumn(a);if(a===1&&(l===1||l===2&&c===2))continue;const d=l===c?r.getPosition():st.rightPosition(i,r.getPosition().lineNumber,r.getPosition().column),h=st.leftPosition(i,d),u=st.leftPosition(i,h),g=i.getValueInRange(L.fromPositions(u,h)),f=i.getValueInRange(L.fromPositions(h,d)),_=L.fromPositions(u,d);n.push(new Wi(_,f+g))}n.length>0&&(t.pushUndoStop(),t.executeCommands(this.id,n),t.pushUndoStop())}}te(wZ);var SZ=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const jd=\"9_cutcopypaste\",yZ=Uo||document.queryCommandSupported(\"cut\"),I5=Uo||document.queryCommandSupported(\"copy\"),LZ=typeof navigator.clipboard==\"undefined\"||Ls?document.queryCommandSupported(\"paste\"):!0;function lE(o){return o.register(),o}const DZ=yZ?lE(new Og({id:\"editor.action.clipboardCutAction\",precondition:void 0,kbOpts:Uo?{primary:2102,win:{primary:2102,secondary:[1044]},weight:100}:void 0,menuOpts:[{menuId:A.MenubarEditMenu,group:\"2_ccp\",title:p({key:\"miCut\",comment:[\"&& denotes a mnemonic\"]},\"Cu&&t\"),order:1},{menuId:A.EditorContext,group:jd,title:p(\"actions.clipboard.cutLabel\",\"Cut\"),when:T.writable,order:1},{menuId:A.CommandPalette,group:\"\",title:p(\"actions.clipboard.cutLabel\",\"Cut\"),order:1},{menuId:A.SimpleEditorContext,group:jd,title:p(\"actions.clipboard.cutLabel\",\"Cut\"),when:T.writable,order:1}]})):void 0,kZ=I5?lE(new Og({id:\"editor.action.clipboardCopyAction\",precondition:void 0,kbOpts:Uo?{primary:2081,win:{primary:2081,secondary:[2067]},weight:100}:void 0,menuOpts:[{menuId:A.MenubarEditMenu,group:\"2_ccp\",title:p({key:\"miCopy\",comment:[\"&& denotes a mnemonic\"]},\"&&Copy\"),order:2},{menuId:A.EditorContext,group:jd,title:p(\"actions.clipboard.copyLabel\",\"Copy\"),order:2},{menuId:A.CommandPalette,group:\"\",title:p(\"actions.clipboard.copyLabel\",\"Copy\"),order:1},{menuId:A.SimpleEditorContext,group:jd,title:p(\"actions.clipboard.copyLabel\",\"Copy\"),order:2}]})):void 0;po.appendMenuItem(A.MenubarEditMenu,{submenu:A.MenubarCopy,title:{value:p(\"copy as\",\"Copy As\"),original:\"Copy As\"},group:\"2_ccp\",order:3});po.appendMenuItem(A.EditorContext,{submenu:A.EditorContextCopy,title:{value:p(\"copy as\",\"Copy As\"),original:\"Copy As\"},group:jd,order:3});po.appendMenuItem(A.EditorContext,{submenu:A.EditorContextShare,title:{value:p(\"share\",\"Share\"),original:\"Share\"},group:\"11_share\",order:-1});const lS=LZ?lE(new Og({id:\"editor.action.clipboardPasteAction\",precondition:void 0,kbOpts:Uo?{primary:2100,win:{primary:2100,secondary:[1043]},linux:{primary:2100,secondary:[1043]},weight:100}:void 0,menuOpts:[{menuId:A.MenubarEditMenu,group:\"2_ccp\",title:p({key:\"miPaste\",comment:[\"&& denotes a mnemonic\"]},\"&&Paste\"),order:4},{menuId:A.EditorContext,group:jd,title:p(\"actions.clipboard.pasteLabel\",\"Paste\"),when:T.writable,order:4},{menuId:A.CommandPalette,group:\"\",title:p(\"actions.clipboard.pasteLabel\",\"Paste\"),order:1},{menuId:A.SimpleEditorContext,group:jd,title:p(\"actions.clipboard.pasteLabel\",\"Paste\"),when:T.writable,order:4}]})):void 0;class xZ extends he{constructor(){super({id:\"editor.action.clipboardCopyWithSyntaxHighlightingAction\",label:p(\"actions.clipboard.copyWithSyntaxHighlightingLabel\",\"Copy With Syntax Highlighting\"),alias:\"Copy With Syntax Highlighting\",precondition:void 0,kbOpts:{kbExpr:T.textInputFocus,primary:0,weight:100}})}run(e,t){!t.hasModel()||!t.getOption(33)&&t.getSelection().isEmpty()||(Gy.forceCopyWithSyntaxHighlighting=!0,t.focus(),document.execCommand(\"copy\"),Gy.forceCopyWithSyntaxHighlighting=!1)}}function E5(o,e){!o||(o.addImplementation(1e4,\"code-editor\",(t,i)=>{const n=t.get(dt).getFocusedCodeEditor();if(n&&n.hasTextFocus()){const s=n.getOption(33),r=n.getSelection();return r&&r.isEmpty()&&!s||document.execCommand(e),!0}return!1}),o.addImplementation(0,\"generic-dom\",(t,i)=>(document.execCommand(e),!0)))}E5(DZ,\"cut\");E5(kZ,\"copy\");lS&&(lS.addImplementation(1e4,\"code-editor\",(o,e)=>{const t=o.get(dt),i=o.get(dl),n=t.getFocusedCodeEditor();return n&&n.hasTextFocus()?!document.execCommand(\"paste\")&&Lc?(()=>SZ(void 0,void 0,void 0,function*(){const r=yield i.readText();if(r!==\"\"){const a=Wp.INSTANCE.get(r);let l=!1,c=null,d=null;a&&(l=n.getOption(33)&&!!a.isFromEmptySelection,c=typeof a.multicursorText!=\"undefined\"?a.multicursorText:null,d=a.mode),n.trigger(\"keyboard\",\"paste\",{text:r,pasteOnNewLine:l,multicursorText:c,mode:d})}}))():!0:!1}),lS.addImplementation(0,\"generic-dom\",(o,e)=>(document.execCommand(\"paste\"),!0)));I5&&te(xZ);const n_=qe(\"IWorkspaceEditService\");class $g{constructor(e){this.metadata=e}static convert(e){return e.edits.map(t=>{if(Sd.is(t))return Sd.lift(t);if(Vu.is(t))return Vu.lift(t);throw new Error(\"Unsupported edit\")})}}class Sd extends $g{constructor(e,t,i=void 0,n){super(n),this.resource=e,this.textEdit=t,this.versionId=i}static is(e){return e instanceof Sd?!0:Fn(e)&&me.isUri(e.resource)&&Fn(e.textEdit)}static lift(e){return e instanceof Sd?e:new Sd(e.resource,e.textEdit,e.versionId,e.metadata)}}class Vu extends $g{constructor(e,t,i={},n){super(n),this.oldResource=e,this.newResource=t,this.options=i}static is(e){return e instanceof Vu?!0:Fn(e)&&(Boolean(e.newResource)||Boolean(e.oldResource))}static lift(e){return e instanceof Vu?e:new Vu(e.oldResource,e.newResource,e.options,e.metadata)}}const cE=qe(\"IEditorCancelService\"),N5=new ce(\"cancellableOperation\",!1,p(\"cancellableOperation\",\"Whether the editor runs a cancellable operation, e.g. like 'Peek References'\"));Xe(cE,class{constructor(){this._tokens=new WeakMap}add(o,e){let t=this._tokens.get(o);t||(t=o.invokeWithinContext(n=>{const s=N5.bindTo(n.get(xe)),r=new wn;return{key:s,tokens:r}}),this._tokens.set(o,t));let i;return t.key.set(!0),i=t.tokens.push(e),()=>{i&&(i(),t.key.set(!t.tokens.isEmpty()),i=void 0)}}cancel(o){const e=this._tokens.get(o);if(!e)return;const t=e.tokens.pop();t&&(t.cancel(),e.key.set(!e.tokens.isEmpty()))}},!0);class IZ extends gn{constructor(e,t){super(t),this.editor=e,this._unregister=e.invokeWithinContext(i=>i.get(cE).add(e,this))}dispose(){this._unregister(),super.dispose()}}Q(new class extends ji{constructor(){super({id:\"editor.cancelOperation\",kbOpts:{weight:100,primary:9},precondition:N5})}runEditorCommand(o,e){o.get(cE).cancel(e)}});class om{constructor(e,t){if(this.flags=t,(this.flags&1)!==0){const i=e.getModel();this.modelVersionId=i?tg(\"{0}#{1}\",i.uri.toString(),i.getVersionId()):null}else this.modelVersionId=null;(this.flags&4)!==0?this.position=e.getPosition():this.position=null,(this.flags&2)!==0?this.selection=e.getSelection():this.selection=null,(this.flags&8)!==0?(this.scrollLeft=e.getScrollLeft(),this.scrollTop=e.getScrollTop()):(this.scrollLeft=-1,this.scrollTop=-1)}_equals(e){if(!(e instanceof om))return!1;const t=e;return!(this.modelVersionId!==t.modelVersionId||this.scrollLeft!==t.scrollLeft||this.scrollTop!==t.scrollTop||!this.position&&t.position||this.position&&!t.position||this.position&&t.position&&!this.position.equals(t.position)||!this.selection&&t.selection||this.selection&&!t.selection||this.selection&&t.selection&&!this.selection.equalsRange(t.selection))}validate(e){return this._equals(new om(e,this.flags))}}class Kd extends IZ{constructor(e,t,i,n){super(e,n),this._listener=new ee,t&4&&this._listener.add(e.onDidChangeCursorPosition(s=>{(!i||!L.containsPosition(i,s.position))&&this.cancel()})),t&2&&this._listener.add(e.onDidChangeCursorSelection(s=>{(!i||!L.containsRange(i,s.selection))&&this.cancel()})),t&8&&this._listener.add(e.onDidScrollChange(s=>this.cancel())),t&1&&(this._listener.add(e.onDidChangeModel(s=>this.cancel())),this._listener.add(e.onDidChangeModelContent(s=>this.cancel())))}dispose(){this._listener.dispose(),super.dispose()}}class dE extends gn{constructor(e,t){super(t),this._listener=e.onDidChangeContent(()=>this.cancel())}dispose(){this._listener.dispose(),super.dispose()}}class Ke{constructor(e){this.value=e}equals(e){return this.value===e.value}contains(e){return this.equals(e)||this.value===\"\"||e.value.startsWith(this.value+Ke.sep)}intersects(e){return this.contains(e)||e.contains(this)}append(e){return new Ke(this.value+Ke.sep+e)}}Ke.sep=\".\";Ke.None=new Ke(\"@@none@@\");Ke.Empty=new Ke(\"\");Ke.QuickFix=new Ke(\"quickfix\");Ke.Refactor=new Ke(\"refactor\");Ke.Source=new Ke(\"source\");Ke.SourceOrganizeImports=Ke.Source.append(\"organizeImports\");Ke.SourceFixAll=Ke.Source.append(\"fixAll\");var fn;(function(o){o.Refactor=\"refactor\",o.RefactorPreview=\"refactor preview\",o.Lightbulb=\"lightbulb\",o.Default=\"other (default)\",o.SourceAction=\"source action\",o.QuickFix=\"quick fix action\",o.FixAll=\"fix all\",o.OrganizeImports=\"organize imports\",o.AutoFix=\"auto fix\",o.QuickFixHover=\"quick fix hover window\",o.OnSave=\"save participants\",o.ProblemsView=\"problems view\"})(fn||(fn={}));function EZ(o,e){return!(o.include&&!o.include.intersects(e)||o.excludes&&o.excludes.some(t=>T5(e,t,o.include))||!o.includeSourceActions&&Ke.Source.contains(e))}function NZ(o,e){const t=e.kind?new Ke(e.kind):void 0;return!(o.include&&(!t||!o.include.contains(t))||o.excludes&&t&&o.excludes.some(i=>T5(t,i,o.include))||!o.includeSourceActions&&t&&Ke.Source.contains(t)||o.onlyIncludePreferredActions&&!e.isPreferred)}function T5(o,e,t){return!(!e.contains(o)||t&&e.contains(t))}class Dr{constructor(e,t,i){this.kind=e,this.apply=t,this.preferred=i}static fromUser(e,t){return!e||typeof e!=\"object\"?new Dr(t.kind,t.apply,!1):new Dr(Dr.getKindFromUser(e,t.kind),Dr.getApplyFromUser(e,t.apply),Dr.getPreferredUser(e))}static getApplyFromUser(e,t){switch(typeof e.apply==\"string\"?e.apply.toLowerCase():\"\"){case\"first\":return\"first\";case\"never\":return\"never\";case\"ifsingle\":return\"ifSingle\";default:return t}}static getKindFromUser(e,t){return typeof e.kind==\"string\"?new Ke(e.kind):t}static getPreferredUser(e){return typeof e.preferred==\"boolean\"?e.preferred:!1}}var hE=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const M5=\"editor.action.codeAction\",A5=\"editor.action.refactor\",TZ=\"editor.action.refactor.preview\",R5=\"editor.action.sourceAction\",uE=\"editor.action.organizeImports\",gE=\"editor.action.fixAll\";class O5{constructor(e,t){this.action=e,this.provider=t}resolve(e){var t;return hE(this,void 0,void 0,function*(){if(((t=this.provider)===null||t===void 0?void 0:t.resolveCodeAction)&&!this.action.edit){let i;try{i=yield this.provider.resolveCodeAction(this.action,e)}catch(n){Ai(n)}i&&(this.action.edit=i.edit)}return this})}}class fE extends z{constructor(e,t,i){super(),this.documentation=t,this._register(i),this.allActions=[...e].sort(fE.codeActionsComparator),this.validActions=this.allActions.filter(({action:n})=>!n.disabled)}static codeActionsComparator({action:e},{action:t}){return e.isPreferred&&!t.isPreferred?-1:!e.isPreferred&&t.isPreferred?1:en(e.diagnostics)?en(t.diagnostics)?e.diagnostics[0].message.localeCompare(t.diagnostics[0].message):-1:en(t.diagnostics)?1:0}get hasAutoFix(){return this.validActions.some(({action:e})=>!!e.kind&&Ke.QuickFix.contains(new Ke(e.kind))&&!!e.isPreferred)}}const lM={actions:[],documentation:void 0};function pE(o,e,t,i,n,s){var r;const a=i.filter||{},l={only:(r=a.include)===null||r===void 0?void 0:r.value,trigger:i.type},c=new dE(e,s),d=MZ(o,e,a),h=new ee,u=d.map(f=>hE(this,void 0,void 0,function*(){try{n.report(f);const _=yield f.provideCodeActions(e,t,l,c.token);if(_&&h.add(_),c.token.isCancellationRequested)return lM;const b=((_==null?void 0:_.actions)||[]).filter(C=>C&&NZ(a,C)),v=AZ(f,b,a.include);return{actions:b.map(C=>new O5(C,f)),documentation:v}}catch(_){if(ol(_))throw _;return Ai(_),lM}})),g=o.onDidChange(()=>{const f=o.all(e);ys(f,d)||c.cancel()});return Promise.all(u).then(f=>{const _=f.map(v=>v.actions).flat(),b=BC(f.map(v=>v.documentation));return new fE(_,b,h)}).finally(()=>{g.dispose(),c.dispose()})}function MZ(o,e,t){return o.all(e).filter(i=>i.providedCodeActionKinds?i.providedCodeActionKinds.some(n=>EZ(t,new Ke(n))):!0)}function AZ(o,e,t){if(!o.documentation)return;const i=o.documentation.map(n=>({kind:new Ke(n.kind),command:n.command}));if(t){let n;for(const s of i)s.kind.contains(t)&&(n?n.kind.contains(s.kind)&&(n=s):n=s);if(n)return n==null?void 0:n.command}for(const n of e)if(!!n.kind){for(const s of i)if(s.kind.contains(new Ke(n.kind)))return s.command}}Ye.registerCommand(\"_executeCodeActionProvider\",function(o,e,t,i,n){return hE(this,void 0,void 0,function*(){if(!(e instanceof me))throw zo();const{codeActionProvider:s}=o.get(ue),r=o.get(Bt).getModel(e);if(!r)throw zo();const a=oe.isISelection(t)?oe.liftSelection(t):L.isIRange(t)?r.validateRange(t):void 0;if(!a)throw zo();const l=typeof i==\"string\"?new Ke(i):void 0,c=yield pE(s,r,a,{type:1,triggerAction:fn.Default,filter:{includeSourceActions:!0,include:l}},wh.None,We.None),d=[],h=Math.min(c.validActions.length,typeof n==\"number\"?n:0);for(let u=0;u<h;u++)d.push(c.validActions[u].resolve(We.None));try{return yield Promise.all(d),c.validActions.map(u=>u.action)}finally{setTimeout(()=>c.dispose(),100)}})});var RZ=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},OZ=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let rs=class mL{constructor(e,t){this._messageWidget=new Vn,this._messageListeners=new ee,this._editor=e,this._visible=mL.MESSAGE_VISIBLE.bindTo(t)}static get(e){return e.getContribution(mL.ID)}dispose(){this._messageListeners.dispose(),this._messageWidget.dispose(),this._visible.reset()}showMessage(e,t){un(e),this._visible.set(!0),this._messageWidget.clear(),this._messageListeners.clear(),this._messageWidget.value=new cM(this._editor,t,e),this._messageListeners.add(this._editor.onDidBlurEditorText(()=>this.closeMessage())),this._messageListeners.add(this._editor.onDidChangeCursorPosition(()=>this.closeMessage())),this._messageListeners.add(this._editor.onDidDispose(()=>this.closeMessage())),this._messageListeners.add(this._editor.onDidChangeModel(()=>this.closeMessage())),this._messageListeners.add(new Is(()=>this.closeMessage(),3e3));let i;this._messageListeners.add(this._editor.onMouseMove(n=>{!n.target.position||(i?i.containsPosition(n.target.position)||this.closeMessage():i=new L(t.lineNumber-3,1,n.target.position.lineNumber+3,1))}))}closeMessage(){this._visible.reset(),this._messageListeners.clear(),this._messageWidget.value&&this._messageListeners.add(cM.fadeOut(this._messageWidget.value))}};rs.ID=\"editor.contrib.messageController\";rs.MESSAGE_VISIBLE=new ce(\"messageVisible\",!1,p(\"messageVisible\",\"Whether the editor is currently showing an inline message\"));rs=RZ([OZ(1,xe)],rs);const PZ=ji.bindToContribution(rs.get);Q(new PZ({id:\"leaveEditorMessage\",precondition:rs.MESSAGE_VISIBLE,handler:o=>o.closeMessage(),kbOpts:{weight:100+30,primary:9}}));class cM{constructor(e,{lineNumber:t,column:i},n){this.allowEditorOverflow=!0,this.suppressMouseDown=!1,this._editor=e,this._editor.revealLinesInCenterIfOutsideViewport(t,t,0),this._position={lineNumber:t,column:i},this._domNode=document.createElement(\"div\"),this._domNode.classList.add(\"monaco-editor-overlaymessage\"),this._domNode.style.marginLeft=\"-6px\";const s=document.createElement(\"div\");s.classList.add(\"anchor\",\"top\"),this._domNode.appendChild(s);const r=document.createElement(\"div\");r.classList.add(\"message\"),r.textContent=n,this._domNode.appendChild(r);const a=document.createElement(\"div\");a.classList.add(\"anchor\",\"below\"),this._domNode.appendChild(a),this._editor.addContentWidget(this),this._domNode.classList.add(\"fadeIn\")}static fadeOut(e){const t=()=>{e.dispose(),clearTimeout(i),e.getDomNode().removeEventListener(\"animationend\",t)},i=setTimeout(t,110);return e.getDomNode().addEventListener(\"animationend\",t),e.getDomNode().classList.add(\"fadeOut\"),{dispose:t}}dispose(){this._editor.removeContentWidget(this)}getId(){return\"messageoverlay\"}getDomNode(){return this._domNode}getPosition(){return{position:this._position,preference:[1,2],positionAffinity:1}}afterRender(e){this._domNode.classList.toggle(\"below\",e===2)}}rt(rs.ID,rs);class FZ{constructor(e){this.spliceables=e}splice(e,t,i){this.spliceables.forEach(n=>n.splice(e,t,i))}}function qn(o,e,t){return Math.min(Math.max(o,e),t)}class P5{constructor(){this._n=1,this._val=0}update(e){return this._val=this._val+(e-this._val)/this._n,this._n+=1,this._val}get value(){return this._val}}class BZ{constructor(e){this._n=0,this._val=0,this._values=[],this._index=0,this._sum=0,this._values=new Array(e),this._values.fill(0,0,e)}update(e){const t=this._values[this._index];return this._values[this._index]=e,this._index=(this._index+1)%this._values.length,this._sum-=t,this._sum+=e,this._n<this._values.length&&(this._n+=1),this._val=this._sum/this._n,this._val}get value(){return this._val}}class Bh extends Error{constructor(e,t){super(`ListError [${e}] ${t}`)}}var Gi;(function(o){function e(s,r){if(s.start>=r.end||r.start>=s.end)return{start:0,end:0};const a=Math.max(s.start,r.start),l=Math.min(s.end,r.end);return l-a<=0?{start:0,end:0}:{start:a,end:l}}o.intersect=e;function t(s){return s.end-s.start<=0}o.isEmpty=t;function i(s,r){return!t(e(s,r))}o.intersects=i;function n(s,r){const a=[],l={start:s.start,end:Math.min(r.start,s.end)},c={start:Math.max(r.end,s.start),end:s.end};return t(l)||a.push(l),t(c)||a.push(c),a}o.relativeComplement=n})(Gi||(Gi={}));function dM(o,e){const t=[];for(const i of e){if(o.start>=i.range.end)continue;if(o.end<i.range.start)break;const n=Gi.intersect(o,i.range);Gi.isEmpty(n)||t.push({range:n,size:i.size})}return t}function _L({start:o,end:e},t){return{start:o+t,end:e+t}}function WZ(o){const e=[];let t=null;for(const i of o){const n=i.range.start,s=i.range.end,r=i.size;if(t&&r===t.size){t.range.end=s;continue}t={range:{start:n,end:s},size:r},e.push(t)}return e}function VZ(...o){return WZ(o.reduce((e,t)=>e.concat(t),[]))}class hM{constructor(){this.groups=[],this._size=0}splice(e,t,i=[]){const n=i.length-t,s=dM({start:0,end:e},this.groups),r=dM({start:e+t,end:Number.POSITIVE_INFINITY},this.groups).map(l=>({range:_L(l.range,n),size:l.size})),a=i.map((l,c)=>({range:{start:e+c,end:e+c+1},size:l.size}));this.groups=VZ(s,a,r),this._size=this.groups.reduce((l,c)=>l+c.size*(c.range.end-c.range.start),0)}get count(){const e=this.groups.length;return e?this.groups[e-1].range.end:0}get size(){return this._size}indexAt(e){if(e<0)return-1;let t=0,i=0;for(const n of this.groups){const s=n.range.end-n.range.start,r=i+s*n.size;if(e<r)return t+Math.floor((e-i)/n.size);t+=s,i=r}return t}indexAfter(e){return Math.min(this.indexAt(e)+1,this.count)}positionAt(e){if(e<0)return-1;let t=0,i=0;for(const n of this.groups){const s=n.range.end-n.range.start,r=i+s;if(e<r)return t+(e-i)*n.size;t+=s*n.size,i=r}return-1}}function HZ(o){var e;try{(e=o.parentElement)===null||e===void 0||e.removeChild(o)}catch(t){}}class zZ{constructor(e){this.renderers=e,this.cache=new Map}alloc(e){let t=this.getTemplateCache(e).pop();if(!t){const i=se(\".monaco-list-row\"),s=this.getRenderer(e).renderTemplate(i);t={domNode:i,templateId:e,templateData:s}}return t}release(e){!e||this.releaseRow(e)}releaseRow(e){const{domNode:t,templateId:i}=e;t&&(t.classList.remove(\"scrolling\"),HZ(t)),this.getTemplateCache(i).push(e)}getTemplateCache(e){let t=this.cache.get(e);return t||(t=[],this.cache.set(e,t)),t}dispose(){this.cache.forEach((e,t)=>{for(const i of e)this.getRenderer(t).disposeTemplate(i.templateData),i.templateData=null}),this.cache.clear()}getRenderer(e){const t=this.renderers.get(e);if(!t)throw new Error(`No renderer found for ${e}`);return t}}var xc=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s};const cr={useShadows:!0,verticalScrollMode:1,setRowLineHeight:!0,setRowHeight:!0,supportDynamicHeights:!1,dnd:{getDragElements(o){return[o]},getDragURI(){return null},onDragStart(){},onDragOver(){return!1},drop(){}},horizontalScrolling:!1,transformOptimization:!0,alwaysConsumeMouseWheel:!0};class s_{constructor(e){this.elements=e}update(){}getData(){return this.elements}}class UZ{constructor(e){this.elements=e}update(){}getData(){return this.elements}}class $Z{constructor(){this.types=[],this.files=[]}update(e){if(e.types&&this.types.splice(0,this.types.length,...e.types),e.files){this.files.splice(0,this.files.length);for(let t=0;t<e.files.length;t++){const i=e.files.item(t);i&&(i.size||i.type)&&this.files.push(i)}}}getData(){return{types:this.types,files:this.files}}}function jZ(o,e){return Array.isArray(o)&&Array.isArray(e)?ys(o,e):o===e}class KZ{constructor(e){e!=null&&e.getSetSize?this.getSetSize=e.getSetSize.bind(e):this.getSetSize=(t,i,n)=>n,e!=null&&e.getPosInSet?this.getPosInSet=e.getPosInSet.bind(e):this.getPosInSet=(t,i)=>i+1,e!=null&&e.getRole?this.getRole=e.getRole.bind(e):this.getRole=t=>\"listitem\",e!=null&&e.isChecked?this.isChecked=e.isChecked.bind(e):this.isChecked=t=>{}}}class wo{constructor(e,t,i,n=cr){var s,r,a,l,c,d,h,u,g,f;if(this.virtualDelegate=t,this.domId=`list_id_${++wo.InstanceCount}`,this.renderers=new Map,this.renderWidth=0,this._scrollHeight=0,this.scrollableElementUpdateDisposable=null,this.scrollableElementWidthDelayer=new $r(50),this.splicing=!1,this.dragOverAnimationStopDisposable=z.None,this.dragOverMouseY=0,this.canDrop=!1,this.currentDragFeedbackDisposable=z.None,this.onDragLeaveTimeout=z.None,this.disposables=new ee,this._onDidChangeContentHeight=new O,this._horizontalScrolling=!1,n.horizontalScrolling&&n.supportDynamicHeights)throw new Error(\"Horizontal scrolling and dynamic heights not supported simultaneously\");this.items=[],this.itemId=0,this.rangeMap=new hM;for(const b of i)this.renderers.set(b.templateId,b);this.cache=this.disposables.add(new zZ(this.renderers)),this.lastRenderTop=0,this.lastRenderHeight=0,this.domNode=document.createElement(\"div\"),this.domNode.className=\"monaco-list\",this.domNode.classList.add(this.domId),this.domNode.tabIndex=0,this.domNode.classList.toggle(\"mouse-support\",typeof n.mouseSupport==\"boolean\"?n.mouseSupport:!0),this._horizontalScrolling=(s=n.horizontalScrolling)!==null&&s!==void 0?s:cr.horizontalScrolling,this.domNode.classList.toggle(\"horizontal-scrolling\",this._horizontalScrolling),this.additionalScrollHeight=typeof n.additionalScrollHeight==\"undefined\"?0:n.additionalScrollHeight,this.accessibilityProvider=new KZ(n.accessibilityProvider),this.rowsContainer=document.createElement(\"div\"),this.rowsContainer.className=\"monaco-list-rows\",((r=n.transformOptimization)!==null&&r!==void 0?r:cr.transformOptimization)&&(this.rowsContainer.style.transform=\"translate3d(0px, 0px, 0px)\"),this.disposables.add(ut.addTarget(this.rowsContainer)),this.scrollable=new Jm({forceIntegerValues:!0,smoothScrollDuration:(a=n.smoothScrolling)!==null&&a!==void 0&&a?125:0,scheduleAtNextAnimationFrame:b=>Go(b)}),this.scrollableElement=this.disposables.add(new xI(this.rowsContainer,{alwaysConsumeMouseWheel:(l=n.alwaysConsumeMouseWheel)!==null&&l!==void 0?l:cr.alwaysConsumeMouseWheel,horizontal:1,vertical:(c=n.verticalScrollMode)!==null&&c!==void 0?c:cr.verticalScrollMode,useShadows:(d=n.useShadows)!==null&&d!==void 0?d:cr.useShadows,mouseWheelScrollSensitivity:n.mouseWheelScrollSensitivity,fastScrollSensitivity:n.fastScrollSensitivity},this.scrollable)),this.domNode.appendChild(this.scrollableElement.getDomNode()),e.appendChild(this.domNode),this.scrollableElement.onScroll(this.onScroll,this,this.disposables),this.disposables.add(q(this.rowsContainer,kt.Change,b=>this.onTouchChange(b))),this.disposables.add(q(this.scrollableElement.getDomNode(),\"scroll\",b=>b.target.scrollTop=0)),this.disposables.add(q(this.domNode,\"dragover\",b=>this.onDragOver(this.toDragEvent(b)))),this.disposables.add(q(this.domNode,\"drop\",b=>this.onDrop(this.toDragEvent(b)))),this.disposables.add(q(this.domNode,\"dragleave\",b=>this.onDragLeave(this.toDragEvent(b)))),this.disposables.add(q(this.domNode,\"dragend\",b=>this.onDragEnd(b))),this.setRowLineHeight=(h=n.setRowLineHeight)!==null&&h!==void 0?h:cr.setRowLineHeight,this.setRowHeight=(u=n.setRowHeight)!==null&&u!==void 0?u:cr.setRowHeight,this.supportDynamicHeights=(g=n.supportDynamicHeights)!==null&&g!==void 0?g:cr.supportDynamicHeights,this.dnd=(f=n.dnd)!==null&&f!==void 0?f:cr.dnd,this.layout()}get contentHeight(){return this.rangeMap.size}get horizontalScrolling(){return this._horizontalScrolling}set horizontalScrolling(e){if(e!==this._horizontalScrolling){if(e&&this.supportDynamicHeights)throw new Error(\"Horizontal scrolling and dynamic heights not supported simultaneously\");if(this._horizontalScrolling=e,this.domNode.classList.toggle(\"horizontal-scrolling\",this._horizontalScrolling),this._horizontalScrolling){for(const t of this.items)this.measureItemWidth(t);this.updateScrollWidth(),this.scrollableElement.setScrollDimensions({width:vw(this.domNode)}),this.rowsContainer.style.width=`${Math.max(this.scrollWidth||0,this.renderWidth)}px`}else this.scrollableElementWidthDelayer.cancel(),this.scrollableElement.setScrollDimensions({width:this.renderWidth,scrollWidth:this.renderWidth}),this.rowsContainer.style.width=\"\"}}updateOptions(e){e.additionalScrollHeight!==void 0&&(this.additionalScrollHeight=e.additionalScrollHeight,this.scrollableElement.setScrollDimensions({scrollHeight:this.scrollHeight})),e.smoothScrolling!==void 0&&this.scrollable.setSmoothScrollDuration(e.smoothScrolling?125:0),e.horizontalScrolling!==void 0&&(this.horizontalScrolling=e.horizontalScrolling),e.mouseWheelScrollSensitivity!==void 0&&this.scrollableElement.updateOptions({mouseWheelScrollSensitivity:e.mouseWheelScrollSensitivity}),e.fastScrollSensitivity!==void 0&&this.scrollableElement.updateOptions({fastScrollSensitivity:e.fastScrollSensitivity})}splice(e,t,i=[]){if(this.splicing)throw new Error(\"Can't run recursive splices.\");this.splicing=!0;try{return this._splice(e,t,i)}finally{this.splicing=!1,this._onDidChangeContentHeight.fire(this.contentHeight)}}_splice(e,t,i=[]){const n=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight),s={start:e,end:e+t},r=Gi.intersect(n,s),a=new Map;for(let x=r.end-1;x>=r.start;x--){const y=this.items[x];if(y.dragStartDisposable.dispose(),y.checkedDisposable.dispose(),y.row){let D=a.get(y.templateId);D||(D=[],a.set(y.templateId,D));const I=this.renderers.get(y.templateId);I&&I.disposeElement&&I.disposeElement(y.element,x,y.row.templateData,y.size),D.push(y.row)}y.row=null}const l={start:e+t,end:this.items.length},c=Gi.intersect(l,n),d=Gi.relativeComplement(l,n),h=i.map(x=>({id:String(this.itemId++),element:x,templateId:this.virtualDelegate.getTemplateId(x),size:this.virtualDelegate.getHeight(x),width:void 0,hasDynamicHeight:!!this.virtualDelegate.hasDynamicHeight&&this.virtualDelegate.hasDynamicHeight(x),lastDynamicHeightWidth:void 0,row:null,uri:void 0,dropTarget:!1,dragStartDisposable:z.None,checkedDisposable:z.None}));let u;e===0&&t>=this.items.length?(this.rangeMap=new hM,this.rangeMap.splice(0,0,h),u=this.items,this.items=h):(this.rangeMap.splice(e,t,h),u=this.items.splice(e,t,...h));const g=i.length-t,f=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight),_=_L(c,g),b=Gi.intersect(f,_);for(let x=b.start;x<b.end;x++)this.updateItemInDOM(this.items[x],x);const v=Gi.relativeComplement(_,f);for(const x of v)for(let y=x.start;y<x.end;y++)this.removeItemFromDOM(y);const C=d.map(x=>_L(x,g)),S=[{start:e,end:e+i.length},...C].map(x=>Gi.intersect(f,x)),k=this.getNextToLastElement(S);for(const x of S)for(let y=x.start;y<x.end;y++){const D=this.items[y],I=a.get(D.templateId),R=I==null?void 0:I.pop();this.insertItemInDOM(y,k,R)}for(const x of a.values())for(const y of x)this.cache.release(y);return this.eventuallyUpdateScrollDimensions(),this.supportDynamicHeights&&this._rerender(this.scrollTop,this.renderHeight),u.map(x=>x.element)}eventuallyUpdateScrollDimensions(){this._scrollHeight=this.contentHeight,this.rowsContainer.style.height=`${this._scrollHeight}px`,this.scrollableElementUpdateDisposable||(this.scrollableElementUpdateDisposable=Go(()=>{this.scrollableElement.setScrollDimensions({scrollHeight:this.scrollHeight}),this.updateScrollWidth(),this.scrollableElementUpdateDisposable=null}))}eventuallyUpdateScrollWidth(){if(!this.horizontalScrolling){this.scrollableElementWidthDelayer.cancel();return}this.scrollableElementWidthDelayer.trigger(()=>this.updateScrollWidth())}updateScrollWidth(){if(!this.horizontalScrolling)return;let e=0;for(const t of this.items)typeof t.width!=\"undefined\"&&(e=Math.max(e,t.width));this.scrollWidth=e,this.scrollableElement.setScrollDimensions({scrollWidth:e===0?0:e+10})}rerender(){if(!!this.supportDynamicHeights){for(const e of this.items)e.lastDynamicHeightWidth=void 0;this._rerender(this.lastRenderTop,this.lastRenderHeight)}}get length(){return this.items.length}get renderHeight(){return this.scrollableElement.getScrollDimensions().height}element(e){return this.items[e].element}domElement(e){const t=this.items[e].row;return t&&t.domNode}elementHeight(e){return this.items[e].size}elementTop(e){return this.rangeMap.positionAt(e)}indexAt(e){return this.rangeMap.indexAt(e)}indexAfter(e){return this.rangeMap.indexAfter(e)}layout(e,t){const i={height:typeof e==\"number\"?e:uB(this.domNode)};this.scrollableElementUpdateDisposable&&(this.scrollableElementUpdateDisposable.dispose(),this.scrollableElementUpdateDisposable=null,i.scrollHeight=this.scrollHeight),this.scrollableElement.setScrollDimensions(i),typeof t!=\"undefined\"&&(this.renderWidth=t,this.supportDynamicHeights&&this._rerender(this.scrollTop,this.renderHeight)),this.horizontalScrolling&&this.scrollableElement.setScrollDimensions({width:typeof t==\"number\"?t:vw(this.domNode)})}render(e,t,i,n,s,r=!1){const a=this.getRenderRange(t,i),l=Gi.relativeComplement(a,e),c=Gi.relativeComplement(e,a),d=this.getNextToLastElement(l);if(r){const h=Gi.intersect(e,a);for(let u=h.start;u<h.end;u++)this.updateItemInDOM(this.items[u],u)}for(const h of l)for(let u=h.start;u<h.end;u++)this.insertItemInDOM(u,d);for(const h of c)for(let u=h.start;u<h.end;u++)this.removeItemFromDOM(u);n!==void 0&&(this.rowsContainer.style.left=`-${n}px`),this.rowsContainer.style.top=`-${t}px`,this.horizontalScrolling&&s!==void 0&&(this.rowsContainer.style.width=`${Math.max(s,this.renderWidth)}px`),this.lastRenderTop=t,this.lastRenderHeight=i}insertItemInDOM(e,t,i){const n=this.items[e];n.row||(n.row=i!=null?i:this.cache.alloc(n.templateId));const s=this.accessibilityProvider.getRole(n.element)||\"listitem\";n.row.domNode.setAttribute(\"role\",s);const r=this.accessibilityProvider.isChecked(n.element);if(typeof r==\"boolean\")n.row.domNode.setAttribute(\"aria-checked\",String(!!r));else if(r){const c=d=>n.row.domNode.setAttribute(\"aria-checked\",String(!!d));c(r.value),n.checkedDisposable=r.onDidChange(c)}n.row.domNode.parentElement||(t?this.rowsContainer.insertBefore(n.row.domNode,t):this.rowsContainer.appendChild(n.row.domNode)),this.updateItemInDOM(n,e);const a=this.renderers.get(n.templateId);if(!a)throw new Error(`No renderer found for template id ${n.templateId}`);a==null||a.renderElement(n.element,e,n.row.templateData,n.size);const l=this.dnd.getDragURI(n.element);n.dragStartDisposable.dispose(),n.row.domNode.draggable=!!l,l&&(n.dragStartDisposable=q(n.row.domNode,\"dragstart\",c=>this.onDragStart(n.element,l,c))),this.horizontalScrolling&&(this.measureItemWidth(n),this.eventuallyUpdateScrollWidth())}measureItemWidth(e){if(!e.row||!e.row.domNode)return;e.row.domNode.style.width=Ls?\"-moz-fit-content\":\"fit-content\",e.width=vw(e.row.domNode);const t=window.getComputedStyle(e.row.domNode);t.paddingLeft&&(e.width+=parseFloat(t.paddingLeft)),t.paddingRight&&(e.width+=parseFloat(t.paddingRight)),e.row.domNode.style.width=\"\"}updateItemInDOM(e,t){e.row.domNode.style.top=`${this.elementTop(t)}px`,this.setRowHeight&&(e.row.domNode.style.height=`${e.size}px`),this.setRowLineHeight&&(e.row.domNode.style.lineHeight=`${e.size}px`),e.row.domNode.setAttribute(\"data-index\",`${t}`),e.row.domNode.setAttribute(\"data-last-element\",t===this.length-1?\"true\":\"false\"),e.row.domNode.setAttribute(\"data-parity\",t%2===0?\"even\":\"odd\"),e.row.domNode.setAttribute(\"aria-setsize\",String(this.accessibilityProvider.getSetSize(e.element,t,this.length))),e.row.domNode.setAttribute(\"aria-posinset\",String(this.accessibilityProvider.getPosInSet(e.element,t))),e.row.domNode.setAttribute(\"id\",this.getElementDomId(t)),e.row.domNode.classList.toggle(\"drop-target\",e.dropTarget)}removeItemFromDOM(e){const t=this.items[e];if(t.dragStartDisposable.dispose(),t.checkedDisposable.dispose(),t.row){const i=this.renderers.get(t.templateId);i&&i.disposeElement&&i.disposeElement(t.element,e,t.row.templateData,t.size),this.cache.release(t.row),t.row=null}this.horizontalScrolling&&this.eventuallyUpdateScrollWidth()}getScrollTop(){return this.scrollableElement.getScrollPosition().scrollTop}setScrollTop(e,t){this.scrollableElementUpdateDisposable&&(this.scrollableElementUpdateDisposable.dispose(),this.scrollableElementUpdateDisposable=null,this.scrollableElement.setScrollDimensions({scrollHeight:this.scrollHeight})),this.scrollableElement.setScrollPosition({scrollTop:e,reuseAnimation:t})}get scrollTop(){return this.getScrollTop()}set scrollTop(e){this.setScrollTop(e)}get scrollHeight(){return this._scrollHeight+(this.horizontalScrolling?10:0)+this.additionalScrollHeight}get onMouseClick(){return pe.map(this.disposables.add(new _t(this.domNode,\"click\")).event,e=>this.toMouseEvent(e),this.disposables)}get onMouseDblClick(){return pe.map(this.disposables.add(new _t(this.domNode,\"dblclick\")).event,e=>this.toMouseEvent(e),this.disposables)}get onMouseMiddleClick(){return pe.filter(pe.map(this.disposables.add(new _t(this.domNode,\"auxclick\")).event,e=>this.toMouseEvent(e),this.disposables),e=>e.browserEvent.button===1,this.disposables)}get onMouseDown(){return pe.map(this.disposables.add(new _t(this.domNode,\"mousedown\")).event,e=>this.toMouseEvent(e),this.disposables)}get onMouseOver(){return pe.map(this.disposables.add(new _t(this.domNode,\"mouseover\")).event,e=>this.toMouseEvent(e),this.disposables)}get onContextMenu(){return pe.any(pe.map(this.disposables.add(new _t(this.domNode,\"contextmenu\")).event,e=>this.toMouseEvent(e),this.disposables),pe.map(this.disposables.add(new _t(this.domNode,kt.Contextmenu)).event,e=>this.toGestureEvent(e),this.disposables))}get onTouchStart(){return pe.map(this.disposables.add(new _t(this.domNode,\"touchstart\")).event,e=>this.toTouchEvent(e),this.disposables)}get onTap(){return pe.map(this.disposables.add(new _t(this.rowsContainer,kt.Tap)).event,e=>this.toGestureEvent(e),this.disposables)}toMouseEvent(e){const t=this.getItemIndexFromEventTarget(e.target||null),i=typeof t==\"undefined\"?void 0:this.items[t],n=i&&i.element;return{browserEvent:e,index:t,element:n}}toTouchEvent(e){const t=this.getItemIndexFromEventTarget(e.target||null),i=typeof t==\"undefined\"?void 0:this.items[t],n=i&&i.element;return{browserEvent:e,index:t,element:n}}toGestureEvent(e){const t=this.getItemIndexFromEventTarget(e.initialTarget||null),i=typeof t==\"undefined\"?void 0:this.items[t],n=i&&i.element;return{browserEvent:e,index:t,element:n}}toDragEvent(e){const t=this.getItemIndexFromEventTarget(e.target||null),i=typeof t==\"undefined\"?void 0:this.items[t],n=i&&i.element;return{browserEvent:e,index:t,element:n}}onScroll(e){try{const t=this.getRenderRange(this.lastRenderTop,this.lastRenderHeight);this.render(t,e.scrollTop,e.height,e.scrollLeft,e.scrollWidth),this.supportDynamicHeights&&this._rerender(e.scrollTop,e.height,e.inSmoothScrolling)}catch(t){throw console.error(\"Got bad scroll event:\",e),t}}onTouchChange(e){e.preventDefault(),e.stopPropagation(),this.scrollTop-=e.translationY}onDragStart(e,t,i){var n,s;if(!i.dataTransfer)return;const r=this.dnd.getDragElements(e);if(i.dataTransfer.effectAllowed=\"copyMove\",i.dataTransfer.setData(i_.TEXT,t),i.dataTransfer.setDragImage){let a;this.dnd.getDragLabel&&(a=this.dnd.getDragLabel(r,i)),typeof a==\"undefined\"&&(a=String(r.length));const l=se(\".monaco-drag-image\");l.textContent=a,document.body.appendChild(l),i.dataTransfer.setDragImage(l,-10,-10),setTimeout(()=>document.body.removeChild(l),0)}this.currentDragData=new s_(r),Wc.CurrentDragAndDropData=new UZ(r),(s=(n=this.dnd).onDragStart)===null||s===void 0||s.call(n,this.currentDragData,i)}onDragOver(e){var t;if(e.browserEvent.preventDefault(),this.onDragLeaveTimeout.dispose(),Wc.CurrentDragAndDropData&&Wc.CurrentDragAndDropData.getData()===\"vscode-ui\"||(this.setupDragAndDropScrollTopAnimation(e.browserEvent),!e.browserEvent.dataTransfer))return!1;if(!this.currentDragData)if(Wc.CurrentDragAndDropData)this.currentDragData=Wc.CurrentDragAndDropData;else{if(!e.browserEvent.dataTransfer.types)return!1;this.currentDragData=new $Z}const i=this.dnd.onDragOver(this.currentDragData,e.element,e.index,e.browserEvent);if(this.canDrop=typeof i==\"boolean\"?i:i.accept,!this.canDrop)return this.currentDragFeedback=void 0,this.currentDragFeedbackDisposable.dispose(),!1;e.browserEvent.dataTransfer.dropEffect=typeof i!=\"boolean\"&&i.effect===0?\"copy\":\"move\";let n;if(typeof i!=\"boolean\"&&i.feedback?n=i.feedback:typeof e.index==\"undefined\"?n=[-1]:n=[e.index],n=el(n).filter(s=>s>=-1&&s<this.length).sort((s,r)=>s-r),n=n[0]===-1?[-1]:n,jZ(this.currentDragFeedback,n))return!0;if(this.currentDragFeedback=n,this.currentDragFeedbackDisposable.dispose(),n[0]===-1)this.domNode.classList.add(\"drop-target\"),this.rowsContainer.classList.add(\"drop-target\"),this.currentDragFeedbackDisposable=ze(()=>{this.domNode.classList.remove(\"drop-target\"),this.rowsContainer.classList.remove(\"drop-target\")});else{for(const s of n){const r=this.items[s];r.dropTarget=!0,(t=r.row)===null||t===void 0||t.domNode.classList.add(\"drop-target\")}this.currentDragFeedbackDisposable=ze(()=>{var s;for(const r of n){const a=this.items[r];a.dropTarget=!1,(s=a.row)===null||s===void 0||s.domNode.classList.remove(\"drop-target\")}})}return!0}onDragLeave(e){var t,i;this.onDragLeaveTimeout.dispose(),this.onDragLeaveTimeout=Hd(()=>this.clearDragOverFeedback(),100),this.currentDragData&&((i=(t=this.dnd).onDragLeave)===null||i===void 0||i.call(t,this.currentDragData,e.element,e.index,e.browserEvent))}onDrop(e){if(!this.canDrop)return;const t=this.currentDragData;this.teardownDragAndDropScrollTopAnimation(),this.clearDragOverFeedback(),this.currentDragData=void 0,Wc.CurrentDragAndDropData=void 0,!(!t||!e.browserEvent.dataTransfer)&&(e.browserEvent.preventDefault(),t.update(e.browserEvent.dataTransfer),this.dnd.drop(t,e.element,e.index,e.browserEvent))}onDragEnd(e){var t,i;this.canDrop=!1,this.teardownDragAndDropScrollTopAnimation(),this.clearDragOverFeedback(),this.currentDragData=void 0,Wc.CurrentDragAndDropData=void 0,(i=(t=this.dnd).onDragEnd)===null||i===void 0||i.call(t,e)}clearDragOverFeedback(){this.currentDragFeedback=void 0,this.currentDragFeedbackDisposable.dispose(),this.currentDragFeedbackDisposable=z.None}setupDragAndDropScrollTopAnimation(e){if(!this.dragOverAnimationDisposable){const t=BO(this.domNode).top;this.dragOverAnimationDisposable=vB(this.animateDragAndDropScrollTop.bind(this,t))}this.dragOverAnimationStopDisposable.dispose(),this.dragOverAnimationStopDisposable=Hd(()=>{this.dragOverAnimationDisposable&&(this.dragOverAnimationDisposable.dispose(),this.dragOverAnimationDisposable=void 0)},1e3),this.dragOverMouseY=e.pageY}animateDragAndDropScrollTop(e){if(this.dragOverMouseY===void 0)return;const t=this.dragOverMouseY-e,i=this.renderHeight-35;t<35?this.scrollTop+=Math.max(-14,Math.floor(.3*(t-35))):t>i&&(this.scrollTop+=Math.min(14,Math.floor(.3*(t-i))))}teardownDragAndDropScrollTopAnimation(){this.dragOverAnimationStopDisposable.dispose(),this.dragOverAnimationDisposable&&(this.dragOverAnimationDisposable.dispose(),this.dragOverAnimationDisposable=void 0)}getItemIndexFromEventTarget(e){const t=this.scrollableElement.getDomNode();let i=e;for(;i instanceof HTMLElement&&i!==this.rowsContainer&&t.contains(i);){const n=i.getAttribute(\"data-index\");if(n){const s=Number(n);if(!isNaN(s))return s}i=i.parentElement}}getRenderRange(e,t){return{start:this.rangeMap.indexAt(e),end:this.rangeMap.indexAfter(e+t-1)}}_rerender(e,t,i){const n=this.getRenderRange(e,t);let s,r;e===this.elementTop(n.start)?(s=n.start,r=0):n.end-n.start>1&&(s=n.start+1,r=this.elementTop(s)-e);let a=0;for(;;){const l=this.getRenderRange(e,t);let c=!1;for(let d=l.start;d<l.end;d++){const h=this.probeDynamicHeight(d);h!==0&&this.rangeMap.splice(d,1,[this.items[d]]),a+=h,c=c||h!==0}if(!c){a!==0&&this.eventuallyUpdateScrollDimensions();const d=Gi.relativeComplement(n,l);for(const u of d)for(let g=u.start;g<u.end;g++)this.items[g].row&&this.removeItemFromDOM(g);const h=Gi.relativeComplement(l,n);for(const u of h)for(let g=u.start;g<u.end;g++){const f=g+1,_=f<this.items.length?this.items[f].row:null,b=_?_.domNode:null;this.insertItemInDOM(g,b)}for(let u=l.start;u<l.end;u++)this.items[u].row&&this.updateItemInDOM(this.items[u],u);if(typeof s==\"number\"){const u=this.scrollable.getFutureScrollPosition().scrollTop-e,g=this.elementTop(s)-r+u;this.setScrollTop(g,i)}this._onDidChangeContentHeight.fire(this.contentHeight);return}}}probeDynamicHeight(e){var t,i,n;const s=this.items[e];if(this.virtualDelegate.getDynamicHeight){const c=this.virtualDelegate.getDynamicHeight(s.element);if(c!==null){const d=s.size;return s.size=c,s.lastDynamicHeightWidth=this.renderWidth,c-d}}if(!s.hasDynamicHeight||s.lastDynamicHeightWidth===this.renderWidth||!!this.virtualDelegate.hasDynamicHeight&&!this.virtualDelegate.hasDynamicHeight(s.element))return 0;const r=s.size;if(!this.setRowHeight&&s.row){const c=s.row.domNode.offsetHeight;return s.size=c,s.lastDynamicHeightWidth=this.renderWidth,c-r}const a=this.cache.alloc(s.templateId);a.domNode.style.height=\"\",this.rowsContainer.appendChild(a.domNode);const l=this.renderers.get(s.templateId);return l&&(l.renderElement(s.element,e,a.templateData,void 0),(t=l.disposeElement)===null||t===void 0||t.call(l,s.element,e,a.templateData,void 0)),s.size=a.domNode.offsetHeight,(n=(i=this.virtualDelegate).setDynamicHeight)===null||n===void 0||n.call(i,s.element,s.size),s.lastDynamicHeightWidth=this.renderWidth,this.rowsContainer.removeChild(a.domNode),this.cache.release(a),s.size-r}getNextToLastElement(e){const t=e[e.length-1];if(!t)return null;const i=this.items[t.end];return!i||!i.row?null:i.row.domNode}getElementDomId(e){return`${this.domId}_${e}`}dispose(){var e;if(this.items){for(const t of this.items)if(t.row){const i=this.renderers.get(t.row.templateId);i&&((e=i.disposeElement)===null||e===void 0||e.call(i,t.element,-1,t.row.templateData,void 0),i.disposeTemplate(t.row.templateData))}this.items=[]}this.domNode&&this.domNode.parentNode&&this.domNode.parentNode.removeChild(this.domNode),et(this.disposables)}}wo.InstanceCount=0;xc([ui],wo.prototype,\"onMouseClick\",null);xc([ui],wo.prototype,\"onMouseDblClick\",null);xc([ui],wo.prototype,\"onMouseMiddleClick\",null);xc([ui],wo.prototype,\"onMouseDown\",null);xc([ui],wo.prototype,\"onMouseOver\",null);xc([ui],wo.prototype,\"onContextMenu\",null);xc([ui],wo.prototype,\"onTouchStart\",null);xc([ui],wo.prototype,\"onTap\",null);var Sh=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},uM=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class qZ{constructor(e){this.trait=e,this.renderedElements=[]}get templateId(){return`template:${this.trait.name}`}renderTemplate(e){return e}renderElement(e,t,i){const n=this.renderedElements.findIndex(s=>s.templateData===i);if(n>=0){const s=this.renderedElements[n];this.trait.unrender(i),s.index=t}else{const s={index:t,templateData:i};this.renderedElements.push(s)}this.trait.renderIndex(t,i)}splice(e,t,i){const n=[];for(const s of this.renderedElements)s.index<e?n.push(s):s.index>=e+t&&n.push({index:s.index+i-t,templateData:s.templateData});this.renderedElements=n}renderIndexes(e){for(const{index:t,templateData:i}of this.renderedElements)e.indexOf(t)>-1&&this.trait.renderIndex(t,i)}disposeTemplate(e){const t=this.renderedElements.findIndex(i=>i.templateData===e);t<0||this.renderedElements.splice(t,1)}}class Cv{constructor(e){this._trait=e,this.length=0,this.indexes=[],this.sortedIndexes=[],this._onChange=new O,this.onChange=this._onChange.event}get name(){return this._trait}get renderer(){return new qZ(this)}splice(e,t,i){var n;t=Math.max(0,Math.min(t,this.length-e));const s=i.length-t,r=e+t,a=[...this.sortedIndexes.filter(c=>c<e),...i.map((c,d)=>c?d+e:-1).filter(c=>c!==-1),...this.sortedIndexes.filter(c=>c>=r).map(c=>c+s)],l=this.length+s;if(this.sortedIndexes.length>0&&a.length===0&&l>0){const c=(n=this.sortedIndexes.find(d=>d>=e))!==null&&n!==void 0?n:l-1;a.push(Math.min(c,l-1))}this.renderer.splice(e,t,i.length),this._set(a,a),this.length=l}renderIndex(e,t){t.classList.toggle(this._trait,this.contains(e))}unrender(e){e.classList.remove(this._trait)}set(e,t){return this._set(e,[...e].sort(fM),t)}_set(e,t,i){const n=this.indexes,s=this.sortedIndexes;this.indexes=e,this.sortedIndexes=t;const r=bL(s,e);return this.renderer.renderIndexes(r),this._onChange.fire({indexes:e,browserEvent:i}),n}get(){return this.indexes}contains(e){return tI(this.sortedIndexes,e,fM)>=0}dispose(){et(this._onChange)}}Sh([ui],Cv.prototype,\"renderer\",null);class GZ extends Cv{constructor(e){super(\"selected\"),this.setAriaSelected=e}renderIndex(e,t){super.renderIndex(e,t),this.setAriaSelected&&(this.contains(e)?t.setAttribute(\"aria-selected\",\"true\"):t.setAttribute(\"aria-selected\",\"false\"))}}class cS{constructor(e,t,i){this.trait=e,this.view=t,this.identityProvider=i}splice(e,t,i){if(!this.identityProvider)return this.trait.splice(e,t,i.map(()=>!1));const n=this.trait.get().map(r=>this.identityProvider.getId(this.view.element(r)).toString()),s=i.map(r=>n.indexOf(this.identityProvider.getId(r).toString())>-1);this.trait.splice(e,t,s)}}function qd(o){return o.tagName===\"INPUT\"||o.tagName===\"TEXTAREA\"}function bu(o){return o.classList.contains(\"monaco-editor\")?!0:o.classList.contains(\"monaco-list\")||!o.parentElement?!1:bu(o.parentElement)}function F5(o){return o.tagName===\"A\"&&o.classList.contains(\"monaco-button\")||o.tagName===\"DIV\"&&o.classList.contains(\"monaco-button-dropdown\")?!0:o.classList.contains(\"monaco-list\")||!o.parentElement?!1:F5(o.parentElement)}class B5{constructor(e,t,i){this.list=e,this.view=t,this.disposables=new ee,this.multipleSelectionDisposables=new ee,this.onKeyDown.filter(n=>n.keyCode===3).on(this.onEnter,this,this.disposables),this.onKeyDown.filter(n=>n.keyCode===16).on(this.onUpArrow,this,this.disposables),this.onKeyDown.filter(n=>n.keyCode===18).on(this.onDownArrow,this,this.disposables),this.onKeyDown.filter(n=>n.keyCode===11).on(this.onPageUpArrow,this,this.disposables),this.onKeyDown.filter(n=>n.keyCode===12).on(this.onPageDownArrow,this,this.disposables),this.onKeyDown.filter(n=>n.keyCode===9).on(this.onEscape,this,this.disposables),i.multipleSelectionSupport!==!1&&this.onKeyDown.filter(n=>(Ze?n.metaKey:n.ctrlKey)&&n.keyCode===31).on(this.onCtrlA,this,this.multipleSelectionDisposables)}get onKeyDown(){return this.disposables.add(pe.chain(this.disposables.add(new _t(this.view.domNode,\"keydown\")).event).filter(e=>!qd(e.target)).map(e=>new Mt(e)))}updateOptions(e){e.multipleSelectionSupport!==void 0&&(this.multipleSelectionDisposables.clear(),e.multipleSelectionSupport&&this.onKeyDown.filter(t=>(Ze?t.metaKey:t.ctrlKey)&&t.keyCode===31).on(this.onCtrlA,this,this.multipleSelectionDisposables))}onEnter(e){e.preventDefault(),e.stopPropagation(),this.list.setSelection(this.list.getFocus(),e.browserEvent)}onUpArrow(e){e.preventDefault(),e.stopPropagation(),this.list.focusPrevious(1,!1,e.browserEvent);const t=this.list.getFocus()[0];this.list.setAnchor(t),this.list.reveal(t),this.view.domNode.focus()}onDownArrow(e){e.preventDefault(),e.stopPropagation(),this.list.focusNext(1,!1,e.browserEvent);const t=this.list.getFocus()[0];this.list.setAnchor(t),this.list.reveal(t),this.view.domNode.focus()}onPageUpArrow(e){e.preventDefault(),e.stopPropagation(),this.list.focusPreviousPage(e.browserEvent);const t=this.list.getFocus()[0];this.list.setAnchor(t),this.list.reveal(t),this.view.domNode.focus()}onPageDownArrow(e){e.preventDefault(),e.stopPropagation(),this.list.focusNextPage(e.browserEvent);const t=this.list.getFocus()[0];this.list.setAnchor(t),this.list.reveal(t),this.view.domNode.focus()}onCtrlA(e){e.preventDefault(),e.stopPropagation(),this.list.setSelection(mn(this.list.length),e.browserEvent),this.list.setAnchor(void 0),this.view.domNode.focus()}onEscape(e){this.list.getSelection().length&&(e.preventDefault(),e.stopPropagation(),this.list.setSelection([],e.browserEvent),this.list.setAnchor(void 0),this.view.domNode.focus())}dispose(){this.disposables.dispose(),this.multipleSelectionDisposables.dispose()}}Sh([ui],B5.prototype,\"onKeyDown\",null);var Yl;(function(o){o[o.Automatic=0]=\"Automatic\",o[o.Trigger=1]=\"Trigger\"})(Yl||(Yl={}));var vu;(function(o){o[o.Idle=0]=\"Idle\",o[o.Typing=1]=\"Typing\"})(vu||(vu={}));const ZZ=new class{mightProducePrintableCharacter(o){return o.ctrlKey||o.metaKey||o.altKey?!1:o.keyCode>=31&&o.keyCode<=56||o.keyCode>=21&&o.keyCode<=30||o.keyCode>=93&&o.keyCode<=102||o.keyCode>=80&&o.keyCode<=90}};class YZ{constructor(e,t,i,n,s){this.list=e,this.view=t,this.keyboardNavigationLabelProvider=i,this.keyboardNavigationEventFilter=n,this.delegate=s,this.enabled=!1,this.state=vu.Idle,this.mode=Yl.Automatic,this.triggered=!1,this.previouslyFocused=-1,this.enabledDisposables=new ee,this.disposables=new ee,this.updateOptions(e.options)}updateOptions(e){var t,i;!((t=e.typeNavigationEnabled)!==null&&t!==void 0)||t?this.enable():this.disable(),this.mode=(i=e.typeNavigationMode)!==null&&i!==void 0?i:Yl.Automatic}enable(){if(this.enabled)return;let e=!1;const t=this.enabledDisposables.add(pe.chain(this.enabledDisposables.add(new _t(this.view.domNode,\"keydown\")).event)).filter(s=>!qd(s.target)).filter(()=>this.mode===Yl.Automatic||this.triggered).map(s=>new Mt(s)).filter(s=>e||this.keyboardNavigationEventFilter(s)).filter(s=>this.delegate.mightProducePrintableCharacter(s)).forEach(hL).map(s=>s.browserEvent.key).event,i=pe.debounce(t,()=>null,800,void 0,void 0,this.enabledDisposables);pe.reduce(pe.any(t,i),(s,r)=>r===null?null:(s||\"\")+r,void 0,this.enabledDisposables)(this.onInput,this,this.enabledDisposables),i(this.onClear,this,this.enabledDisposables),t(()=>e=!0,void 0,this.enabledDisposables),i(()=>e=!1,void 0,this.enabledDisposables),this.enabled=!0,this.triggered=!1}disable(){!this.enabled||(this.enabledDisposables.clear(),this.enabled=!1,this.triggered=!1)}onClear(){var e;const t=this.list.getFocus();if(t.length>0&&t[0]===this.previouslyFocused){const i=(e=this.list.options.accessibilityProvider)===null||e===void 0?void 0:e.getAriaLabel(this.list.element(t[0]));i&&un(i)}this.previouslyFocused=-1}onInput(e){if(!e){this.state=vu.Idle,this.triggered=!1;return}const t=this.list.getFocus(),i=t.length>0?t[0]:0,n=this.state===vu.Idle?1:0;this.state=vu.Typing;for(let s=0;s<this.list.length;s++){const r=(i+s+n)%this.list.length,a=this.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(this.view.element(r)),l=a&&a.toString();if(typeof l==\"undefined\"||tE(e,l)){this.previouslyFocused=i,this.list.setFocus([r]),this.list.reveal(r);return}}}dispose(){this.disable(),this.enabledDisposables.dispose(),this.disposables.dispose()}}class XZ{constructor(e,t){this.list=e,this.view=t,this.disposables=new ee,this.disposables.add(pe.chain(this.disposables.add(new _t(t.domNode,\"keydown\")).event)).filter(n=>!qd(n.target)).map(n=>new Mt(n)).filter(n=>n.keyCode===2&&!n.ctrlKey&&!n.metaKey&&!n.shiftKey&&!n.altKey).on(this.onTab,this,this.disposables)}onTab(e){if(e.target!==this.view.domNode)return;const t=this.list.getFocus();if(t.length===0)return;const i=this.view.domElement(t[0]);if(!i)return;const n=i.querySelector(\"[tabIndex]\");if(!n||!(n instanceof HTMLElement)||n.tabIndex===-1)return;const s=window.getComputedStyle(n);s.visibility===\"hidden\"||s.display===\"none\"||(e.preventDefault(),e.stopPropagation(),n.focus())}dispose(){this.disposables.dispose()}}function W5(o){return Ze?o.browserEvent.metaKey:o.browserEvent.ctrlKey}function V5(o){return o.browserEvent.shiftKey}function QZ(o){return o instanceof MouseEvent&&o.button===2}const gM={isSelectionSingleChangeEvent:W5,isSelectionRangeChangeEvent:V5};class H5{constructor(e){this.list=e,this.disposables=new ee,this._onPointer=new O,this.onPointer=this._onPointer.event,e.options.multipleSelectionSupport!==!1&&(this.multipleSelectionController=this.list.options.multipleSelectionController||gM),this.mouseSupport=typeof e.options.mouseSupport==\"undefined\"||!!e.options.mouseSupport,this.mouseSupport&&(e.onMouseDown(this.onMouseDown,this,this.disposables),e.onContextMenu(this.onContextMenu,this,this.disposables),e.onMouseDblClick(this.onDoubleClick,this,this.disposables),e.onTouchStart(this.onMouseDown,this,this.disposables),this.disposables.add(ut.addTarget(e.getHTMLElement()))),pe.any(e.onMouseClick,e.onMouseMiddleClick,e.onTap)(this.onViewPointer,this,this.disposables)}updateOptions(e){e.multipleSelectionSupport!==void 0&&(this.multipleSelectionController=void 0,e.multipleSelectionSupport&&(this.multipleSelectionController=this.list.options.multipleSelectionController||gM))}isSelectionSingleChangeEvent(e){return this.multipleSelectionController?this.multipleSelectionController.isSelectionSingleChangeEvent(e):!1}isSelectionRangeChangeEvent(e){return this.multipleSelectionController?this.multipleSelectionController.isSelectionRangeChangeEvent(e):!1}isSelectionChangeEvent(e){return this.isSelectionSingleChangeEvent(e)||this.isSelectionRangeChangeEvent(e)}onMouseDown(e){bu(e.browserEvent.target)||document.activeElement!==e.browserEvent.target&&this.list.domFocus()}onContextMenu(e){if(bu(e.browserEvent.target))return;const t=typeof e.index==\"undefined\"?[]:[e.index];this.list.setFocus(t,e.browserEvent)}onViewPointer(e){if(!this.mouseSupport||qd(e.browserEvent.target)||bu(e.browserEvent.target))return;const t=e.index;if(typeof t==\"undefined\"){this.list.setFocus([],e.browserEvent),this.list.setSelection([],e.browserEvent),this.list.setAnchor(void 0);return}if(this.isSelectionRangeChangeEvent(e))return this.changeSelection(e);if(this.isSelectionChangeEvent(e))return this.changeSelection(e);this.list.setFocus([t],e.browserEvent),this.list.setAnchor(t),QZ(e.browserEvent)||this.list.setSelection([t],e.browserEvent),this._onPointer.fire(e)}onDoubleClick(e){if(qd(e.browserEvent.target)||bu(e.browserEvent.target)||this.isSelectionChangeEvent(e))return;const t=this.list.getFocus();this.list.setSelection(t,e.browserEvent)}changeSelection(e){const t=e.index;let i=this.list.getAnchor();if(this.isSelectionRangeChangeEvent(e)){if(typeof i==\"undefined\"){const d=this.list.getFocus()[0];i=d!=null?d:t,this.list.setAnchor(i)}const n=Math.min(i,t),s=Math.max(i,t),r=mn(n,s+1),a=this.list.getSelection(),l=tY(bL(a,[i]),i);if(l.length===0)return;const c=bL(r,iY(a,l));this.list.setSelection(c,e.browserEvent),this.list.setFocus([t],e.browserEvent)}else if(this.isSelectionSingleChangeEvent(e)){const n=this.list.getSelection(),s=n.filter(r=>r!==t);this.list.setFocus([t]),this.list.setAnchor(t),n.length===s.length?this.list.setSelection([...s,t],e.browserEvent):this.list.setSelection(s,e.browserEvent)}}dispose(){this.disposables.dispose()}}class z5{constructor(e,t){this.styleElement=e,this.selectorSuffix=t}style(e){const t=this.selectorSuffix&&`.${this.selectorSuffix}`,i=[];e.listBackground&&(e.listBackground.isOpaque()?i.push(`.monaco-list${t} .monaco-list-rows { background: ${e.listBackground}; }`):Ze||console.warn(`List with id '${this.selectorSuffix}' was styled with a non-opaque background color. This will break sub-pixel antialiasing.`)),e.listFocusBackground&&(i.push(`.monaco-list${t}:focus .monaco-list-row.focused { background-color: ${e.listFocusBackground}; }`),i.push(`.monaco-list${t}:focus .monaco-list-row.focused:hover { background-color: ${e.listFocusBackground}; }`)),e.listFocusForeground&&i.push(`.monaco-list${t}:focus .monaco-list-row.focused { color: ${e.listFocusForeground}; }`),e.listActiveSelectionBackground&&(i.push(`.monaco-list${t}:focus .monaco-list-row.selected { background-color: ${e.listActiveSelectionBackground}; }`),i.push(`.monaco-list${t}:focus .monaco-list-row.selected:hover { background-color: ${e.listActiveSelectionBackground}; }`)),e.listActiveSelectionForeground&&i.push(`.monaco-list${t}:focus .monaco-list-row.selected { color: ${e.listActiveSelectionForeground}; }`),e.listActiveSelectionIconForeground&&i.push(`.monaco-list${t}:focus .monaco-list-row.selected .codicon { color: ${e.listActiveSelectionIconForeground}; }`),e.listFocusAndSelectionOutline&&i.push(`.monaco-list${t}:focus .monaco-list-row.selected { outline-color: ${e.listFocusAndSelectionOutline} !important; }`),e.listFocusAndSelectionBackground&&i.push(`\n\t\t\t\t.monaco-drag-image,\n\t\t\t\t.monaco-list${t}:focus .monaco-list-row.selected.focused { background-color: ${e.listFocusAndSelectionBackground}; }\n\t\t\t`),e.listFocusAndSelectionForeground&&i.push(`\n\t\t\t\t.monaco-drag-image,\n\t\t\t\t.monaco-list${t}:focus .monaco-list-row.selected.focused { color: ${e.listFocusAndSelectionForeground}; }\n\t\t\t`),e.listInactiveFocusForeground&&(i.push(`.monaco-list${t} .monaco-list-row.focused { color:  ${e.listInactiveFocusForeground}; }`),i.push(`.monaco-list${t} .monaco-list-row.focused:hover { color:  ${e.listInactiveFocusForeground}; }`)),e.listInactiveSelectionIconForeground&&i.push(`.monaco-list${t} .monaco-list-row.focused .codicon { color:  ${e.listInactiveSelectionIconForeground}; }`),e.listInactiveFocusBackground&&(i.push(`.monaco-list${t} .monaco-list-row.focused { background-color:  ${e.listInactiveFocusBackground}; }`),i.push(`.monaco-list${t} .monaco-list-row.focused:hover { background-color:  ${e.listInactiveFocusBackground}; }`)),e.listInactiveSelectionBackground&&(i.push(`.monaco-list${t} .monaco-list-row.selected { background-color:  ${e.listInactiveSelectionBackground}; }`),i.push(`.monaco-list${t} .monaco-list-row.selected:hover { background-color:  ${e.listInactiveSelectionBackground}; }`)),e.listInactiveSelectionForeground&&i.push(`.monaco-list${t} .monaco-list-row.selected { color: ${e.listInactiveSelectionForeground}; }`),e.listHoverBackground&&i.push(`.monaco-list${t}:not(.drop-target) .monaco-list-row:hover:not(.selected):not(.focused) { background-color: ${e.listHoverBackground}; }`),e.listHoverForeground&&i.push(`.monaco-list${t} .monaco-list-row:hover:not(.selected):not(.focused) { color:  ${e.listHoverForeground}; }`),e.listSelectionOutline&&i.push(`.monaco-list${t} .monaco-list-row.selected { outline: 1px dotted ${e.listSelectionOutline}; outline-offset: -1px; }`),e.listFocusOutline&&i.push(`\n\t\t\t\t.monaco-drag-image,\n\t\t\t\t.monaco-list${t}:focus .monaco-list-row.focused { outline: 1px solid ${e.listFocusOutline}; outline-offset: -1px; }\n\t\t\t\t.monaco-workbench.context-menu-visible .monaco-list${t}.last-focused .monaco-list-row.focused { outline: 1px solid ${e.listFocusOutline}; outline-offset: -1px; }\n\t\t\t`),e.listInactiveFocusOutline&&i.push(`.monaco-list${t} .monaco-list-row.focused { outline: 1px dotted ${e.listInactiveFocusOutline}; outline-offset: -1px; }`),e.listHoverOutline&&i.push(`.monaco-list${t} .monaco-list-row:hover { outline: 1px dashed ${e.listHoverOutline}; outline-offset: -1px; }`),e.listDropBackground&&i.push(`\n\t\t\t\t.monaco-list${t}.drop-target,\n\t\t\t\t.monaco-list${t} .monaco-list-rows.drop-target,\n\t\t\t\t.monaco-list${t} .monaco-list-row.drop-target { background-color: ${e.listDropBackground} !important; color: inherit !important; }\n\t\t\t`),e.tableColumnsBorder&&i.push(`\n\t\t\t\t.monaco-table:hover > .monaco-split-view2,\n\t\t\t\t.monaco-table:hover > .monaco-split-view2 .monaco-sash.vertical::before {\n\t\t\t\t\tborder-color: ${e.tableColumnsBorder};\n\t\t\t}`),e.tableOddRowsBackgroundColor&&i.push(`\n\t\t\t\t.monaco-table .monaco-list-row[data-parity=odd]:not(.focused):not(.selected):not(:hover) .monaco-table-tr,\n\t\t\t\t.monaco-table .monaco-list:not(:focus) .monaco-list-row[data-parity=odd].focused:not(.selected):not(:hover) .monaco-table-tr,\n\t\t\t\t.monaco-table .monaco-list:not(.focused) .monaco-list-row[data-parity=odd].focused:not(.selected):not(:hover) .monaco-table-tr {\n\t\t\t\t\tbackground-color: ${e.tableOddRowsBackgroundColor};\n\t\t\t\t}\n\t\t\t`),this.styleElement.textContent=i.join(`\n`)}}const JZ={listFocusBackground:W.fromHex(\"#7FB0D0\"),listActiveSelectionBackground:W.fromHex(\"#0E639C\"),listActiveSelectionForeground:W.fromHex(\"#FFFFFF\"),listActiveSelectionIconForeground:W.fromHex(\"#FFFFFF\"),listFocusAndSelectionOutline:W.fromHex(\"#90C2F9\"),listFocusAndSelectionBackground:W.fromHex(\"#094771\"),listFocusAndSelectionForeground:W.fromHex(\"#FFFFFF\"),listInactiveSelectionBackground:W.fromHex(\"#3F3F46\"),listInactiveSelectionIconForeground:W.fromHex(\"#FFFFFF\"),listHoverBackground:W.fromHex(\"#2A2D2E\"),listDropBackground:W.fromHex(\"#383B3D\"),treeIndentGuidesStroke:W.fromHex(\"#a9a9a9\"),tableColumnsBorder:W.fromHex(\"#cccccc\").transparent(.2),tableOddRowsBackgroundColor:W.fromHex(\"#cccccc\").transparent(.04)},eY={keyboardSupport:!0,mouseSupport:!0,multipleSelectionSupport:!0,dnd:{getDragURI(){return null},onDragStart(){},onDragOver(){return!1},drop(){}}};function tY(o,e){const t=o.indexOf(e);if(t===-1)return[];const i=[];let n=t-1;for(;n>=0&&o[n]===e-(t-n);)i.push(o[n--]);for(i.reverse(),n=t;n<o.length&&o[n]===e+(n-t);)i.push(o[n++]);return i}function bL(o,e){const t=[];let i=0,n=0;for(;i<o.length||n<e.length;)if(i>=o.length)t.push(e[n++]);else if(n>=e.length)t.push(o[i++]);else if(o[i]===e[n]){t.push(o[i]),i++,n++;continue}else o[i]<e[n]?t.push(o[i++]):t.push(e[n++]);return t}function iY(o,e){const t=[];let i=0,n=0;for(;i<o.length||n<e.length;)if(i>=o.length)t.push(e[n++]);else if(n>=e.length)t.push(o[i++]);else if(o[i]===e[n]){i++,n++;continue}else o[i]<e[n]?t.push(o[i++]):n++;return t}const fM=(o,e)=>o-e;class nY{constructor(e,t){this._templateId=e,this.renderers=t}get templateId(){return this._templateId}renderTemplate(e){return this.renderers.map(t=>t.renderTemplate(e))}renderElement(e,t,i,n){let s=0;for(const r of this.renderers)r.renderElement(e,t,i[s++],n)}disposeElement(e,t,i,n){var s;let r=0;for(const a of this.renderers)(s=a.disposeElement)===null||s===void 0||s.call(a,e,t,i[r],n),r+=1}disposeTemplate(e){let t=0;for(const i of this.renderers)i.disposeTemplate(e[t++])}}class sY{constructor(e){this.accessibilityProvider=e,this.templateId=\"a18n\"}renderTemplate(e){return e}renderElement(e,t,i){const n=this.accessibilityProvider.getAriaLabel(e);n?i.setAttribute(\"aria-label\",n):i.removeAttribute(\"aria-label\");const s=this.accessibilityProvider.getAriaLevel&&this.accessibilityProvider.getAriaLevel(e);typeof s==\"number\"?i.setAttribute(\"aria-level\",`${s}`):i.removeAttribute(\"aria-level\")}disposeTemplate(e){}}class oY{constructor(e,t){this.list=e,this.dnd=t}getDragElements(e){const t=this.list.getSelectedElements();return t.indexOf(e)>-1?t:[e]}getDragURI(e){return this.dnd.getDragURI(e)}getDragLabel(e,t){if(this.dnd.getDragLabel)return this.dnd.getDragLabel(e,t)}onDragStart(e,t){var i,n;(n=(i=this.dnd).onDragStart)===null||n===void 0||n.call(i,e,t)}onDragOver(e,t,i,n){return this.dnd.onDragOver(e,t,i,n)}onDragLeave(e,t,i,n){var s,r;(r=(s=this.dnd).onDragLeave)===null||r===void 0||r.call(s,e,t,i,n)}onDragEnd(e){var t,i;(i=(t=this.dnd).onDragEnd)===null||i===void 0||i.call(t,e)}drop(e,t,i,n){this.dnd.drop(e,t,i,n)}}class ir{constructor(e,t,i,n,s=eY){var r,a,l,c;this.user=e,this._options=s,this.focus=new Cv(\"focused\"),this.anchor=new Cv(\"anchor\"),this.eventBufferer=new Tx,this._ariaLabel=\"\",this.disposables=new ee,this._onDidDispose=new O,this.onDidDispose=this._onDidDispose.event;const d=this._options.accessibilityProvider&&this._options.accessibilityProvider.getWidgetRole?(r=this._options.accessibilityProvider)===null||r===void 0?void 0:r.getWidgetRole():\"list\";this.selection=new GZ(d!==\"listbox\"),ea(s,JZ,!1);const h=[this.focus.renderer,this.selection.renderer];this.accessibilityProvider=s.accessibilityProvider,this.accessibilityProvider&&(h.push(new sY(this.accessibilityProvider)),(l=(a=this.accessibilityProvider).onDidChangeActiveDescendant)===null||l===void 0||l.call(a,this.onDidChangeActiveDescendant,this,this.disposables)),n=n.map(g=>new nY(g.templateId,[...h,g]));const u=Object.assign(Object.assign({},s),{dnd:s.dnd&&new oY(this,s.dnd)});if(this.view=new wo(t,i,n,u),this.view.domNode.setAttribute(\"role\",d),s.styleController)this.styleController=s.styleController(this.view.domId);else{const g=qs(this.view.domNode);this.styleController=new z5(g,this.view.domId)}if(this.spliceable=new FZ([new cS(this.focus,this.view,s.identityProvider),new cS(this.selection,this.view,s.identityProvider),new cS(this.anchor,this.view,s.identityProvider),this.view]),this.disposables.add(this.focus),this.disposables.add(this.selection),this.disposables.add(this.anchor),this.disposables.add(this.view),this.disposables.add(this._onDidDispose),this.disposables.add(new XZ(this,this.view)),(typeof s.keyboardSupport!=\"boolean\"||s.keyboardSupport)&&(this.keyboardController=new B5(this,this.view,s),this.disposables.add(this.keyboardController)),s.keyboardNavigationLabelProvider){const g=s.keyboardNavigationDelegate||ZZ;this.typeNavigationController=new YZ(this,this.view,s.keyboardNavigationLabelProvider,(c=s.keyboardNavigationEventFilter)!==null&&c!==void 0?c:()=>!0,g),this.disposables.add(this.typeNavigationController)}this.mouseController=this.createMouseController(s),this.disposables.add(this.mouseController),this.onDidChangeFocus(this._onFocusChange,this,this.disposables),this.onDidChangeSelection(this._onSelectionChange,this,this.disposables),this.accessibilityProvider&&(this.ariaLabel=this.accessibilityProvider.getWidgetAriaLabel()),this._options.multipleSelectionSupport!==!1&&this.view.domNode.setAttribute(\"aria-multiselectable\",\"true\")}get onDidChangeFocus(){return pe.map(this.eventBufferer.wrapEvent(this.focus.onChange),e=>this.toListEvent(e),this.disposables)}get onDidChangeSelection(){return pe.map(this.eventBufferer.wrapEvent(this.selection.onChange),e=>this.toListEvent(e),this.disposables)}get domId(){return this.view.domId}get onMouseClick(){return this.view.onMouseClick}get onMouseDblClick(){return this.view.onMouseDblClick}get onMouseMiddleClick(){return this.view.onMouseMiddleClick}get onPointer(){return this.mouseController.onPointer}get onMouseDown(){return this.view.onMouseDown}get onMouseOver(){return this.view.onMouseOver}get onTouchStart(){return this.view.onTouchStart}get onTap(){return this.view.onTap}get onContextMenu(){let e=!1;const t=this.disposables.add(pe.chain(this.disposables.add(new _t(this.view.domNode,\"keydown\")).event)).map(s=>new Mt(s)).filter(s=>e=s.keyCode===58||s.shiftKey&&s.keyCode===68).map(hL).filter(()=>!1).event,i=this.disposables.add(pe.chain(this.disposables.add(new _t(this.view.domNode,\"keyup\")).event)).forEach(()=>e=!1).map(s=>new Mt(s)).filter(s=>s.keyCode===58||s.shiftKey&&s.keyCode===68).map(hL).map(({browserEvent:s})=>{const r=this.getFocus(),a=r.length?r[0]:void 0,l=typeof a!=\"undefined\"?this.view.element(a):void 0,c=typeof a!=\"undefined\"?this.view.domElement(a):this.view.domNode;return{index:a,element:l,anchor:c,browserEvent:s}}).event,n=this.disposables.add(pe.chain(this.view.onContextMenu)).filter(s=>!e).map(({element:s,index:r,browserEvent:a})=>({element:s,index:r,anchor:{x:a.pageX+1,y:a.pageY},browserEvent:a})).event;return pe.any(t,i,n)}get onKeyDown(){return this.disposables.add(new _t(this.view.domNode,\"keydown\")).event}get onDidFocus(){return pe.signal(this.disposables.add(new _t(this.view.domNode,\"focus\",!0)).event)}createMouseController(e){return new H5(this)}updateOptions(e={}){var t,i;this._options=Object.assign(Object.assign({},this._options),e),(t=this.typeNavigationController)===null||t===void 0||t.updateOptions(this._options),this._options.multipleSelectionController!==void 0&&(this._options.multipleSelectionSupport?this.view.domNode.setAttribute(\"aria-multiselectable\",\"true\"):this.view.domNode.removeAttribute(\"aria-multiselectable\")),this.mouseController.updateOptions(e),(i=this.keyboardController)===null||i===void 0||i.updateOptions(e),this.view.updateOptions(e)}get options(){return this._options}splice(e,t,i=[]){if(e<0||e>this.view.length)throw new Bh(this.user,`Invalid start index: ${e}`);if(t<0)throw new Bh(this.user,`Invalid delete count: ${t}`);t===0&&i.length===0||this.eventBufferer.bufferEvents(()=>this.spliceable.splice(e,t,i))}rerender(){this.view.rerender()}element(e){return this.view.element(e)}get length(){return this.view.length}get contentHeight(){return this.view.contentHeight}get scrollTop(){return this.view.getScrollTop()}set scrollTop(e){this.view.setScrollTop(e)}get ariaLabel(){return this._ariaLabel}set ariaLabel(e){this._ariaLabel=e,this.view.domNode.setAttribute(\"aria-label\",e)}domFocus(){this.view.domNode.focus({preventScroll:!0})}layout(e,t){this.view.layout(e,t)}setSelection(e,t){for(const i of e)if(i<0||i>=this.length)throw new Bh(this.user,`Invalid index ${i}`);this.selection.set(e,t)}getSelection(){return this.selection.get()}getSelectedElements(){return this.getSelection().map(e=>this.view.element(e))}setAnchor(e){if(typeof e==\"undefined\"){this.anchor.set([]);return}if(e<0||e>=this.length)throw new Bh(this.user,`Invalid index ${e}`);this.anchor.set([e])}getAnchor(){return mP(this.anchor.get(),void 0)}getAnchorElement(){const e=this.getAnchor();return typeof e==\"undefined\"?void 0:this.element(e)}setFocus(e,t){for(const i of e)if(i<0||i>=this.length)throw new Bh(this.user,`Invalid index ${i}`);this.focus.set(e,t)}focusNext(e=1,t=!1,i,n){if(this.length===0)return;const s=this.focus.get(),r=this.findNextIndex(s.length>0?s[0]+e:0,t,n);r>-1&&this.setFocus([r],i)}focusPrevious(e=1,t=!1,i,n){if(this.length===0)return;const s=this.focus.get(),r=this.findPreviousIndex(s.length>0?s[0]-e:0,t,n);r>-1&&this.setFocus([r],i)}focusNextPage(e,t){return uM(this,void 0,void 0,function*(){let i=this.view.indexAt(this.view.getScrollTop()+this.view.renderHeight);i=i===0?0:i-1;const n=this.getFocus()[0];if(n!==i&&(n===void 0||i>n)){const s=this.findPreviousIndex(i,!1,t);s>-1&&n!==s?this.setFocus([s],e):this.setFocus([i],e)}else{const s=this.view.getScrollTop();let r=s+this.view.renderHeight;i>n&&(r-=this.view.elementHeight(i)),this.view.setScrollTop(r),this.view.getScrollTop()!==s&&(this.setFocus([]),yield Vd(0),yield this.focusNextPage(e,t))}})}focusPreviousPage(e,t){return uM(this,void 0,void 0,function*(){let i;const n=this.view.getScrollTop();n===0?i=this.view.indexAt(n):i=this.view.indexAfter(n-1);const s=this.getFocus()[0];if(s!==i&&(s===void 0||s>=i)){const r=this.findNextIndex(i,!1,t);r>-1&&s!==r?this.setFocus([r],e):this.setFocus([i],e)}else{const r=n;this.view.setScrollTop(n-this.view.renderHeight),this.view.getScrollTop()!==r&&(this.setFocus([]),yield Vd(0),yield this.focusPreviousPage(e,t))}})}focusLast(e,t){if(this.length===0)return;const i=this.findPreviousIndex(this.length-1,!1,t);i>-1&&this.setFocus([i],e)}focusFirst(e,t){this.focusNth(0,e,t)}focusNth(e,t,i){if(this.length===0)return;const n=this.findNextIndex(e,!1,i);n>-1&&this.setFocus([n],t)}findNextIndex(e,t=!1,i){for(let n=0;n<this.length;n++){if(e>=this.length&&!t)return-1;if(e=e%this.length,!i||i(this.element(e)))return e;e++}return-1}findPreviousIndex(e,t=!1,i){for(let n=0;n<this.length;n++){if(e<0&&!t)return-1;if(e=(this.length+e%this.length)%this.length,!i||i(this.element(e)))return e;e--}return-1}getFocus(){return this.focus.get()}getFocusedElements(){return this.getFocus().map(e=>this.view.element(e))}reveal(e,t){if(e<0||e>=this.length)throw new Bh(this.user,`Invalid index ${e}`);const i=this.view.getScrollTop(),n=this.view.elementTop(e),s=this.view.elementHeight(e);if(sc(t)){const r=s-this.view.renderHeight;this.view.setScrollTop(r*qn(t,0,1)+n)}else{const r=n+s,a=i+this.view.renderHeight;n<i&&r>=a||(n<i||r>=a&&s>=this.view.renderHeight?this.view.setScrollTop(n):r>=a&&this.view.setScrollTop(r-this.view.renderHeight))}}getHTMLElement(){return this.view.domNode}getElementID(e){return this.view.getElementDomId(e)}style(e){this.styleController.style(e)}toListEvent({indexes:e,browserEvent:t}){return{indexes:e,elements:e.map(i=>this.view.element(i)),browserEvent:t}}_onFocusChange(){const e=this.focus.get();this.view.domNode.classList.toggle(\"element-focused\",e.length>0),this.onDidChangeActiveDescendant()}onDidChangeActiveDescendant(){var e;const t=this.focus.get();if(t.length>0){let i;!((e=this.accessibilityProvider)===null||e===void 0)&&e.getActiveDescendantId&&(i=this.accessibilityProvider.getActiveDescendantId(this.view.element(t[0]))),this.view.domNode.setAttribute(\"aria-activedescendant\",i||this.view.getElementDomId(t[0]))}else this.view.domNode.removeAttribute(\"aria-activedescendant\")}_onSelectionChange(){const e=this.selection.get();this.view.domNode.classList.toggle(\"selection-none\",e.length===0),this.view.domNode.classList.toggle(\"selection-single\",e.length===1),this.view.domNode.classList.toggle(\"selection-multiple\",e.length>1)}dispose(){this._onDidDispose.fire(),this.disposables.dispose(),this._onDidDispose.dispose()}}Sh([ui],ir.prototype,\"onDidChangeFocus\",null);Sh([ui],ir.prototype,\"onDidChangeSelection\",null);Sh([ui],ir.prototype,\"onContextMenu\",null);Sh([ui],ir.prototype,\"onKeyDown\",null);Sh([ui],ir.prototype,\"onDidFocus\",null);const rn=qe(\"keybindingService\");var U5=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},ma=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},rY=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const jg={Visible:new ce(\"CodeActionMenuVisible\",!1,p(\"CodeActionMenuVisible\",\"Whether the code action list widget is visible\"))};class dS extends is{constructor(e,t){super(e.command?e.command.id:e.title,aY(e.title),void 0,!e.disabled,t),this.action=e}}function aY(o){return o.replace(/\\r\\n|\\r|\\n/g,\" \")}const lY=\"codeActionWidget\",hS=26;let vL=class{constructor(e,t){this.acceptKeybindings=e,this.keybindingService=t}get templateId(){return lY}renderTemplate(e){const t=Object.create(null);return t.disposables=[],t.root=e,t.text=document.createElement(\"span\"),e.append(t.text),t}renderElement(e,t,i){const n=i,s=e.title,r=e.isEnabled,a=e.isSeparator,l=e.isDocumentation;n.text.textContent=s,r?n.root.classList.remove(\"option-disabled\"):(n.root.classList.add(\"option-disabled\"),n.root.style.backgroundColor=\"transparent !important\"),a&&(n.root.classList.add(\"separator\"),n.root.style.height=\"10px\"),l||(()=>{var d,h;const[u,g]=this.acceptKeybindings;n.root.title=p({key:\"label\",comment:['placeholders are keybindings, e.g \"F2 to Refactor, Shift+F2 to Preview\"']},\"{0} to Refactor, {1} to Preview\",(d=this.keybindingService.lookupKeybinding(u))===null||d===void 0?void 0:d.getLabel(),(h=this.keybindingService.lookupKeybinding(g))===null||h===void 0?void 0:h.getLabel())})()}disposeTemplate(e){e.disposables=et(e.disposables)}};vL=U5([ma(1,rn)],vL);let wv=class CL extends z{constructor(e,t,i,n,s,r,a,l,c,d){super(),this._editor=e,this._delegate=t,this._contextMenuService=i,this._languageFeaturesService=s,this._telemetryService=r,this._configurationService=l,this._contextViewService=c,this._contextKeyService=d,this._showingActions=this._register(new Vn),this.codeActionList=this._register(new Vn),this.options=[],this._visible=!1,this.viewItems=[],this.hasSeperator=!1,this._keybindingResolver=new g1({getKeybindings:()=>n.getKeybindings()}),this._ctxMenuWidgetVisible=jg.Visible.bindTo(this._contextKeyService),this.listRenderer=new vL([\"onEnterSelectCodeAction\",\"onEnterSelectCodeActionWithPreview\"],n)}get isVisible(){return this._visible}isCodeActionWidgetEnabled(e){return this._configurationService.getValue(\"editor.experimental.useCustomCodeActionMenu\",{resource:e.uri})}_onListSelection(e){e.elements.length&&e.elements.forEach(t=>{t.isEnabled&&(t.action.run(),this.hideCodeActionWidget())})}_onListHover(e){var t,i,n,s;e.element?!((i=e.element)===null||i===void 0)&&i.isEnabled?((n=this.codeActionList.value)===null||n===void 0||n.setFocus([e.element.index]),this.focusedEnabledItem=this.viewItems.indexOf(e.element),this.currSelectedItem=e.element.index):(this.currSelectedItem=void 0,(s=this.codeActionList.value)===null||s===void 0||s.setFocus([e.element.index])):(this.currSelectedItem=void 0,(t=this.codeActionList.value)===null||t===void 0||t.setFocus([]))}renderCodeActionMenuList(e,t){var i;const n=new ee,s=document.createElement(\"div\"),r=document.createElement(\"div\");this.block=e.appendChild(r),this.block.classList.add(\"context-view-block\"),this.block.style.position=\"fixed\",this.block.style.cursor=\"initial\",this.block.style.left=\"0\",this.block.style.top=\"0\",this.block.style.width=\"100%\",this.block.style.height=\"100%\",this.block.style.zIndex=\"-1\",n.add(q(this.block,le.MOUSE_DOWN,u=>u.stopPropagation())),s.id=\"codeActionMenuWidget\",s.classList.add(\"codeActionMenuWidget\"),e.appendChild(s),this.codeActionList.value=new ir(\"codeActionWidget\",s,{getHeight(u){return u.isSeparator?10:hS},getTemplateId(u){return\"codeActionWidget\"}},[this.listRenderer],{keyboardSupport:!1}),n.add(this.codeActionList.value.onMouseOver(u=>this._onListHover(u))),n.add(this.codeActionList.value.onDidChangeFocus(u=>{var g;return(g=this.codeActionList.value)===null||g===void 0?void 0:g.domFocus()})),n.add(this.codeActionList.value.onDidChangeSelection(u=>this._onListSelection(u))),n.add(this._editor.onDidLayoutChange(u=>this.hideCodeActionWidget())),t.forEach((u,g)=>{const f=u.class===\"separator\";let _=!1;u instanceof dS&&(_=u.action.kind===CL.documentationID),f&&(this.hasSeperator=!0);const b={title:u.label,detail:u.tooltip,action:t[g],isEnabled:u.enabled,isSeparator:f,index:g,isDocumentation:_};u.enabled&&this.viewItems.push(b),this.options.push(b)}),this.codeActionList.value.splice(0,this.codeActionList.value.length,this.options);const a=this.hasSeperator?(t.length-1)*hS+10:t.length*hS;s.style.height=String(a)+\"px\",this.codeActionList.value.layout(a);const l=[];this.options.forEach((u,g)=>{var f,_;if(!this.codeActionList.value)return;const b=(_=document.getElementById((f=this.codeActionList.value)===null||f===void 0?void 0:f.getElementID(g)))===null||_===void 0?void 0:_.getElementsByTagName(\"span\")[0].offsetWidth;l.push(Number(b))});const c=Math.max(...l);s.style.width=c+52+\"px\",(i=this.codeActionList.value)===null||i===void 0||i.layout(a,c),this.viewItems.length<1||this.viewItems.every(u=>u.isDocumentation)?this.currSelectedItem=void 0:(this.focusedEnabledItem=0,this.currSelectedItem=this.viewItems[0].index,this.codeActionList.value.setFocus([this.currSelectedItem])),this.codeActionList.value.domFocus();const d=Ad(e),h=d.onDidBlur(()=>{this.hideCodeActionWidget()});return n.add(h),n.add(d),this._ctxMenuWidgetVisible.set(!0),n}focusPrevious(){var e;if(typeof this.focusedEnabledItem==\"undefined\")this.focusedEnabledItem=this.viewItems[0].index;else if(this.viewItems.length<1)return!1;const t=this.focusedEnabledItem;let i;do this.focusedEnabledItem=this.focusedEnabledItem-1,this.focusedEnabledItem<0&&(this.focusedEnabledItem=this.viewItems.length-1),i=this.viewItems[this.focusedEnabledItem],(e=this.codeActionList.value)===null||e===void 0||e.setFocus([i.index]),this.currSelectedItem=i.index;while(this.focusedEnabledItem!==t&&(!i.isEnabled||i.action.id===Ji.ID));return!0}focusNext(){var e;if(typeof this.focusedEnabledItem==\"undefined\")this.focusedEnabledItem=this.viewItems.length-1;else if(this.viewItems.length<1)return!1;const t=this.focusedEnabledItem;let i;do this.focusedEnabledItem=(this.focusedEnabledItem+1)%this.viewItems.length,i=this.viewItems[this.focusedEnabledItem],(e=this.codeActionList.value)===null||e===void 0||e.setFocus([i.index]),this.currSelectedItem=i.index;while(this.focusedEnabledItem!==t&&(!i.isEnabled||i.action.id===Ji.ID));return!0}navigateListWithKeysUp(){this.focusPrevious()}navigateListWithKeysDown(){this.focusNext()}onEnterSet(){var e;typeof this.currSelectedItem==\"number\"&&((e=this.codeActionList.value)===null||e===void 0||e.setSelection([this.currSelectedItem]))}dispose(){super.dispose()}hideCodeActionWidget(){this._ctxMenuWidgetVisible.reset(),this.options=[],this.viewItems=[],this.focusedEnabledItem=0,this.currSelectedItem=void 0,this.hasSeperator=!1,this._contextViewService.hideContextView({source:this})}codeActionTelemetry(e,t,i){this._telemetryService.publicLog2(\"codeAction.applyCodeAction\",{codeActionFrom:e,validCodeActions:i.validActions.length,cancelled:t})}show(e,t,i,n){return rY(this,void 0,void 0,function*(){const s=this._editor.getModel();if(!s)return;const r=n.includeDisabledActions?t.allActions:t.validActions;if(!r.length){this._visible=!1;return}if(!this._editor.getDomNode())throw this._visible=!1,hO();this._visible=!0,this._showingActions.value=t;const a=this.getMenuActions(e,r,t.documentation),l=B.isIPosition(i)?this._toCoords(i):i||{x:0,y:0},c=this._keybindingResolver.getResolver(),d=this._editor.getOption(117);this.isCodeActionWidgetEnabled(s)?this._contextViewService.showContextView({getAnchor:()=>l,render:h=>this.renderCodeActionMenuList(h,a),onHide:h=>{const u=n.fromLightbulb?fn.Lightbulb:e.triggerAction;this.codeActionTelemetry(u,h,t),this._visible=!1,this._editor.focus()}},this._editor.getDomNode(),!1):this._contextMenuService.showContextMenu({domForShadowRoot:d?this._editor.getDomNode():void 0,getAnchor:()=>l,getActions:()=>a,onHide:h=>{const u=n.fromLightbulb?fn.Lightbulb:e.triggerAction;this.codeActionTelemetry(u,h,t),this._visible=!1,this._editor.focus()},autoSelectFirstItem:!0,getKeyBinding:h=>h instanceof dS?c(h.action):void 0})})}getMenuActions(e,t,i){var n,s;const r=d=>new dS(d.action,()=>this._delegate.onSelectCodeAction(d,e)),a=t.map(r),l=[...i],c=this._editor.getModel();if(c&&a.length)for(const d of this._languageFeaturesService.codeActionProvider.all(c))d._getAdditionalMenuItems&&l.push(...d._getAdditionalMenuItems({trigger:e.type,only:(s=(n=e.filter)===null||n===void 0?void 0:n.include)===null||s===void 0?void 0:s.value},t.map(h=>h.action)));return l.length&&a.push(new Ji,...l.map(d=>r(new O5({title:d.title,command:d,kind:CL.documentationID},void 0)))),a}_toCoords(e){if(!this._editor.hasModel())return{x:0,y:0};this._editor.revealPosition(e,1),this._editor.render();const t=this._editor.getScrolledVisiblePosition(e),i=Qi(this._editor.getDomNode()),n=i.left+t.left,s=i.top+t.top+t.height;return{x:n,y:s}}};wv.documentationID=\"_documentation\";wv=U5([ma(2,cl),ma(3,rn),ma(4,ue),ma(5,rl),ma(6,vt),ma(7,ot),ma(8,Ch),ma(9,xe)],wv);class g1{constructor(e){this._keybindingProvider=e}getResolver(){const e=new eg(()=>this._keybindingProvider.getKeybindings().filter(t=>g1.codeActionCommands.indexOf(t.command)>=0).filter(t=>t.resolvedKeybinding).map(t=>{let i=t.commandArgs;return t.command===uE?i={kind:Ke.SourceOrganizeImports.value}:t.command===gE&&(i={kind:Ke.SourceFixAll.value}),Object.assign({resolvedKeybinding:t.resolvedKeybinding},Dr.fromUser(i,{kind:Ke.None,apply:\"never\"}))}));return t=>{if(t.kind){const i=this.bestKeybindingForCodeAction(t,e.getValue());return i==null?void 0:i.resolvedKeybinding}}}bestKeybindingForCodeAction(e,t){if(!e.kind)return;const i=new Ke(e.kind);return t.filter(n=>n.kind.contains(i)).filter(n=>n.preferred?e.isPreferred:!0).reduceRight((n,s)=>n?n.kind.contains(s.kind)?s:n:s,void 0)}}g1.codeActionCommands=[A5,M5,R5,uE,gE];var cY=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},dY=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},gp;(function(o){o.Hidden={type:0};class e{constructor(i,n,s,r){this.actions=i,this.trigger=n,this.editorPosition=s,this.widgetPosition=r,this.type=1}}o.Showing=e})(gp||(gp={}));let Sv=class $5 extends z{constructor(e,t,i,n){super(),this._editor=e,this._quickFixActionId=t,this._preferredFixActionId=i,this._keybindingService=n,this._onClick=this._register(new O),this.onClick=this._onClick.event,this._state=gp.Hidden,this._domNode=document.createElement(\"div\"),this._domNode.className=m.lightBulb.classNames,this._editor.addContentWidget(this),this._register(this._editor.onDidChangeModelContent(s=>{const r=this._editor.getModel();(this.state.type!==1||!r||this.state.editorPosition.lineNumber>=r.getLineCount())&&this.hide()})),ut.ignoreTarget(this._domNode),this._register(aB(this._domNode,s=>{if(this.state.type!==1)return;this._editor.focus(),s.preventDefault();const{top:r,height:a}=Qi(this._domNode),l=this._editor.getOption(61);let c=Math.floor(l/3);this.state.widgetPosition.position!==null&&this.state.widgetPosition.position.lineNumber<this.state.editorPosition.lineNumber&&(c+=l),this._onClick.fire({x:s.posx,y:r+a+c,actions:this.state.actions,trigger:this.state.trigger})})),this._register(q(this._domNode,\"mouseenter\",s=>{(s.buttons&1)===1&&this.hide()})),this._register(this._editor.onDidChangeConfiguration(s=>{s.hasChanged(59)&&!this._editor.getOption(59).enabled&&this.hide()})),this._updateLightBulbTitleAndIcon(),this._register(this._keybindingService.onDidUpdateKeybindings(this._updateLightBulbTitleAndIcon,this))}dispose(){super.dispose(),this._editor.removeContentWidget(this)}getId(){return\"LightBulbWidget\"}getDomNode(){return this._domNode}getPosition(){return this._state.type===1?this._state.widgetPosition:null}update(e,t,i){if(e.validActions.length<=0)return this.hide();const n=this._editor.getOptions();if(!n.get(59).enabled)return this.hide();const s=this._editor.getModel();if(!s)return this.hide();const{lineNumber:r,column:a}=s.validatePosition(i),l=s.getOptions().tabSize,c=n.get(46),d=s.getLineContent(r),h=s1(d,l),u=c.spaceWidth*h>22,g=_=>_>2&&this._editor.getTopForLineNumber(_)===this._editor.getTopForLineNumber(_-1);let f=r;if(!u){if(r>1&&!g(r-1))f-=1;else if(!g(r+1))f+=1;else if(a*c.spaceWidth<22)return this.hide()}this.state=new gp.Showing(e,t,i,{position:{lineNumber:f,column:1},preference:$5._posPref}),this._editor.layoutContentWidget(this)}hide(){this.state=gp.Hidden,this._editor.layoutContentWidget(this)}get state(){return this._state}set state(e){this._state=e,this._updateLightBulbTitleAndIcon()}_updateLightBulbTitleAndIcon(){if(this.state.type===1&&this.state.actions.hasAutoFix){this._domNode.classList.remove(...m.lightBulb.classNamesArray),this._domNode.classList.add(...m.lightbulbAutofix.classNamesArray);const t=this._keybindingService.lookupKeybinding(this._preferredFixActionId);if(t){this.title=p(\"preferredcodeActionWithKb\",\"Show Code Actions. Preferred Quick Fix Available ({0})\",t.getLabel());return}}this._domNode.classList.remove(...m.lightbulbAutofix.classNamesArray),this._domNode.classList.add(...m.lightBulb.classNamesArray);const e=this._keybindingService.lookupKeybinding(this._quickFixActionId);e?this.title=p(\"codeActionWithKb\",\"Show Code Actions ({0})\",e.getLabel()):this.title=p(\"codeAction\",\"Show Code Actions\")}set title(e){this._domNode.title=e}};Sv._posPref=[0];Sv=cY([dY(3,rn)],Sv);Rt((o,e)=>{var t;const i=(t=o.getColor(bi))===null||t===void 0?void 0:t.transparent(.7),n=o.getColor(YH);n&&e.addRule(`\n\t\t.monaco-editor .contentWidgets ${m.lightBulb.cssSelector} {\n\t\t\tcolor: ${n};\n\t\t\tbackground-color: ${i};\n\t\t}`);const s=o.getColor(XH);s&&e.addRule(`\n\t\t.monaco-editor .contentWidgets ${m.lightbulbAutofix.cssSelector} {\n\t\t\tcolor: ${s};\n\t\t\tbackground-color: ${i};\n\t\t}`)});var hY=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},uY=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},uS=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})},gY=globalThis&&globalThis.__classPrivateFieldSet||function(o,e,t,i,n){if(i===\"m\")throw new TypeError(\"Private method is not writable\");if(i===\"a\"&&!n)throw new TypeError(\"Private accessor was defined without a setter\");if(typeof e==\"function\"?o!==e||!n:!e.has(o))throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");return i===\"a\"?n.call(o,t):n?n.value=t:e.set(o,t),t},fY=globalThis&&globalThis.__classPrivateFieldGet||function(o,e,t,i){if(t===\"a\"&&!i)throw new TypeError(\"Private accessor was defined without a getter\");if(typeof e==\"function\"?o!==e||!i:!e.has(o))throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");return t===\"m\"?i:t===\"a\"?i.call(o):i?i.value:e.get(o)},a0;let wL=class extends z{constructor(e,t,i,n,s){super(),this._editor=e,this.delegate=n,this._activeCodeActions=this._register(new Vn),this.previewOn=!1,a0.set(this,!1),this._codeActionWidget=new eg(()=>this._register(s.createInstance(wv,this._editor,{onSelectCodeAction:(r,a)=>uS(this,void 0,void 0,function*(){this.previewOn?this.delegate.applyCodeAction(r,!0,Boolean(this.previewOn)):this.delegate.applyCodeAction(r,!0,Boolean(a.preview)),this.previewOn=!1})}))),this._lightBulbWidget=new eg(()=>{const r=this._register(s.createInstance(Sv,this._editor,t,i));return this._register(r.onClick(a=>this.showCodeActionList(a.trigger,a.actions,a,{includeDisabledActions:!1,fromLightbulb:!0}))),r})}dispose(){gY(this,a0,!0,\"f\"),super.dispose()}hideCodeActionWidget(){this._codeActionWidget.hasValue()&&this._codeActionWidget.getValue().hideCodeActionWidget()}onEnter(){this._codeActionWidget.hasValue()&&this._codeActionWidget.getValue().onEnterSet()}onPreviewEnter(){this.previewOn=!0,this.onEnter()}navigateList(e){this._codeActionWidget.hasValue()&&(e?this._codeActionWidget.getValue().navigateListWithKeysUp():this._codeActionWidget.getValue().navigateListWithKeysDown())}update(e){var t,i,n,s,r;return uS(this,void 0,void 0,function*(){if(e.type!==1){(t=this._lightBulbWidget.rawValue)===null||t===void 0||t.hide();return}let a;try{a=yield e.actions}catch(l){Ee(l);return}if(!fY(this,a0,\"f\"))if(this._lightBulbWidget.getValue().update(a,e.trigger,e.position),e.trigger.type===1){if(!((i=e.trigger.filter)===null||i===void 0)&&i.include){const c=this.tryGetValidActionToApply(e.trigger,a);if(c){try{this._lightBulbWidget.getValue().hide(),yield this.delegate.applyCodeAction(c,!1,!1)}finally{a.dispose()}return}if(e.trigger.context){const d=this.getInvalidActionThatWouldHaveBeenApplied(e.trigger,a);if(d&&d.action.disabled){(n=rs.get(this._editor))===null||n===void 0||n.showMessage(d.action.disabled,e.trigger.context.position),a.dispose();return}}}const l=!!(!((s=e.trigger.filter)===null||s===void 0)&&s.include);if(e.trigger.context&&(!a.allActions.length||!l&&!a.validActions.length)){(r=rs.get(this._editor))===null||r===void 0||r.showMessage(e.trigger.context.notAvailableMessage,e.trigger.context.position),this._activeCodeActions.value=a,a.dispose();return}this._activeCodeActions.value=a,this._codeActionWidget.getValue().show(e.trigger,a,e.position,{includeDisabledActions:l,fromLightbulb:!1})}else this._codeActionWidget.getValue().isVisible?a.dispose():this._activeCodeActions.value=a})}getInvalidActionThatWouldHaveBeenApplied(e,t){if(!!t.allActions.length&&(e.autoApply===\"first\"&&t.validActions.length===0||e.autoApply===\"ifSingle\"&&t.allActions.length===1))return t.allActions.find(({action:i})=>i.disabled)}tryGetValidActionToApply(e,t){if(!!t.validActions.length&&(e.autoApply===\"first\"&&t.validActions.length>0||e.autoApply===\"ifSingle\"&&t.validActions.length===1))return t.validActions[0]}showCodeActionList(e,t,i,n){return uS(this,void 0,void 0,function*(){this._codeActionWidget.getValue().show(e,t,i,n)})}};a0=new WeakMap;wL=hY([uY(4,Re)],wL);var Ft;(function(o){o[o.Hint=1]=\"Hint\",o[o.Info=2]=\"Info\",o[o.Warning=4]=\"Warning\",o[o.Error=8]=\"Error\"})(Ft||(Ft={}));(function(o){function e(r,a){return a-r}o.compare=e;const t=Object.create(null);t[o.Error]=p(\"sev.error\",\"Error\"),t[o.Warning]=p(\"sev.warning\",\"Warning\"),t[o.Info]=p(\"sev.info\",\"Info\");function i(r){return t[r]||\"\"}o.toString=i;function n(r){switch(r){case Vt.Error:return o.Error;case Vt.Warning:return o.Warning;case Vt.Info:return o.Info;case Vt.Ignore:return o.Hint}}o.fromSeverity=n;function s(r){switch(r){case o.Error:return Vt.Error;case o.Warning:return Vt.Warning;case o.Info:return Vt.Info;case o.Hint:return Vt.Ignore}}o.toSeverity=s})(Ft||(Ft={}));var yv;(function(o){const e=\"\";function t(n){return i(n,!0)}o.makeKey=t;function i(n,s){const r=[e];return n.source?r.push(n.source.replace(\"\\xA6\",\"\\\\\\xA6\")):r.push(e),n.code?typeof n.code==\"string\"?r.push(n.code.replace(\"\\xA6\",\"\\\\\\xA6\")):r.push(n.code.value.replace(\"\\xA6\",\"\\\\\\xA6\")):r.push(e),n.severity!==void 0&&n.severity!==null?r.push(Ft.toString(n.severity)):r.push(e),n.message&&s?r.push(n.message.replace(\"\\xA6\",\"\\\\\\xA6\")):r.push(e),n.startLineNumber!==void 0&&n.startLineNumber!==null?r.push(n.startLineNumber.toString()):r.push(e),n.startColumn!==void 0&&n.startColumn!==null?r.push(n.startColumn.toString()):r.push(e),n.endLineNumber!==void 0&&n.endLineNumber!==null?r.push(n.endLineNumber.toString()):r.push(e),n.endColumn!==void 0&&n.endColumn!==null?r.push(n.endColumn.toString()):r.push(e),r.push(e),r.join(\"\\xA6\")}o.makeKeyOptionalMessage=i})(yv||(yv={}));const ta=qe(\"markerService\");var gS=globalThis&&globalThis.__classPrivateFieldGet||function(o,e,t,i){if(t===\"a\"&&!i)throw new TypeError(\"Private accessor was defined without a getter\");if(typeof e==\"function\"?o!==e||!i:!e.has(o))throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");return t===\"m\"?i:t===\"a\"?i.call(o):i?i.value:e.get(o)},pY=globalThis&&globalThis.__classPrivateFieldSet||function(o,e,t,i,n){if(i===\"m\")throw new TypeError(\"Private method is not writable\");if(i===\"a\"&&!n)throw new TypeError(\"Private accessor was defined without a setter\");if(typeof e==\"function\"?o!==e||!n:!e.has(o))throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");return i===\"a\"?n.call(o,t):n?n.value=t:e.set(o,t),t},Jh;const j5=new ce(\"supportedCodeAction\",\"\");class mY extends z{constructor(e,t,i,n=250){super(),this._editor=e,this._markerService=t,this._signalChange=i,this._delay=n,this._autoTriggerTimer=this._register(new Is),this._register(this._markerService.onMarkerChanged(s=>this._onMarkerChanges(s))),this._register(this._editor.onDidChangeCursorPosition(()=>this._onCursorChange()))}trigger(e){const t=this._getRangeOfSelectionUnlessWhitespaceEnclosed(e);return this._createEventAndSignalChange(e,t)}_onMarkerChanges(e){const t=this._editor.getModel();!t||e.some(i=>z4(i,t.uri))&&this._autoTriggerTimer.cancelAndSet(()=>{this.trigger({type:2,triggerAction:fn.Default})},this._delay)}_onCursorChange(){this._autoTriggerTimer.cancelAndSet(()=>{this.trigger({type:2,triggerAction:fn.Default})},this._delay)}_getRangeOfMarker(e){const t=this._editor.getModel();if(!!t)for(const i of this._markerService.read({resource:t.uri})){const n=t.validateRange(i);if(L.intersectRanges(n,e))return L.lift(n)}}_getRangeOfSelectionUnlessWhitespaceEnclosed(e){if(!this._editor.hasModel())return;const t=this._editor.getModel(),i=this._editor.getSelection();if(i.isEmpty()&&e.type===2){const{lineNumber:n,column:s}=i.getPosition(),r=t.getLineContent(n);if(r.length===0)return;if(s===1){if(/\\s/.test(r[0]))return}else if(s===t.getLineMaxColumn(n)){if(/\\s/.test(r[r.length-1]))return}else if(/\\s/.test(r[s-2])&&/\\s/.test(r[s-1]))return}return i}_createEventAndSignalChange(e,t){const i=this._editor.getModel();if(!t||!i){this._signalChange(void 0);return}const n=this._getRangeOfMarker(t),s=n?n.getStartPosition():t.getStartPosition(),r={trigger:e,selection:t,position:s};return this._signalChange(r),r}}var ed;(function(o){o.Empty={type:0};class e{constructor(i,n,s,r){this.trigger=i,this.rangeOrSelection=n,this.position=s,this._cancellablePromise=r,this.type=1,this.actions=r.catch(a=>{if(ol(a))return _Y;throw a})}cancel(){this._cancellablePromise.cancel()}}o.Triggered=e})(ed||(ed={}));const _Y={allActions:[],validActions:[],dispose:()=>{},documentation:[],hasAutoFix:!1};class bY extends z{constructor(e,t,i,n,s){super(),this._editor=e,this._registry=t,this._markerService=i,this._progressService=s,this._codeActionOracle=this._register(new Vn),this._state=ed.Empty,this._onDidChangeState=this._register(new O),this.onDidChangeState=this._onDidChangeState.event,Jh.set(this,!1),this._supportedCodeActions=j5.bindTo(n),this._register(this._editor.onDidChangeModel(()=>this._update())),this._register(this._editor.onDidChangeModelLanguage(()=>this._update())),this._register(this._registry.onDidChange(()=>this._update())),this._update()}dispose(){gS(this,Jh,\"f\")||(pY(this,Jh,!0,\"f\"),super.dispose(),this.setState(ed.Empty,!0))}_update(){if(gS(this,Jh,\"f\"))return;this._codeActionOracle.value=void 0,this.setState(ed.Empty);const e=this._editor.getModel();if(e&&this._registry.has(e)&&!this._editor.getOption(83)){const t=[];for(const i of this._registry.all(e))Array.isArray(i.providedCodeActionKinds)&&t.push(...i.providedCodeActionKinds);this._supportedCodeActions.set(t.join(\" \")),this._codeActionOracle.value=new mY(this._editor,this._markerService,i=>{var n;if(!i){this.setState(ed.Empty);return}const s=Ti(r=>pE(this._registry,e,i.selection,i.trigger,wh.None,r));i.trigger.type===1&&((n=this._progressService)===null||n===void 0||n.showWhile(s,250)),this.setState(new ed.Triggered(i.trigger,i.selection,i.position,s))},void 0),this._codeActionOracle.value.trigger({type:2,triggerAction:fn.Default})}else this._supportedCodeActions.reset()}trigger(e){var t;(t=this._codeActionOracle.value)===null||t===void 0||t.trigger(e)}setState(e,t){e!==this._state&&(this._state.type===1&&this._state.cancel(),this._state=e,!t&&!gS(this,Jh,\"f\")&&this._onDidChangeState.fire(e))}}Jh=new WeakMap;var vY=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},bf=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},K5=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};function o_(o){return re.regex(j5.keys()[0],new RegExp(\"(\\\\s|^)\"+Ds(o.value)+\"\\\\b\"))}function q5(o,e,t,i){const n=Dr.fromUser(e,{kind:Ke.Refactor,apply:\"never\"});return yh(o,typeof(e==null?void 0:e.kind)==\"string\"?n.preferred?p(\"editor.action.refactor.noneMessage.preferred.kind\",\"No preferred refactorings for '{0}' available\",e.kind):p(\"editor.action.refactor.noneMessage.kind\",\"No refactorings for '{0}' available\",e.kind):n.preferred?p(\"editor.action.refactor.noneMessage.preferred\",\"No preferred refactorings available\"):p(\"editor.action.refactor.noneMessage\",\"No refactorings available\"),{include:Ke.Refactor.contains(n.kind)?n.kind:Ke.None,onlyIncludePreferredActions:n.preferred},n.apply,t,i)}const f1={type:\"object\",defaultSnippets:[{body:{kind:\"\"}}],properties:{kind:{type:\"string\",description:p(\"args.schema.kind\",\"Kind of the code action to run.\")},apply:{type:\"string\",description:p(\"args.schema.apply\",\"Controls when the returned actions are applied.\"),default:\"ifSingle\",enum:[\"first\",\"ifSingle\",\"never\"],enumDescriptions:[p(\"args.schema.apply.first\",\"Always apply the first returned code action.\"),p(\"args.schema.apply.ifSingle\",\"Apply the first returned code action if it is the only one.\"),p(\"args.schema.apply.never\",\"Do not apply the returned code actions.\")]},preferred:{type:\"boolean\",default:!1,description:p(\"args.schema.preferred\",\"Controls if only preferred code actions should be returned.\")}}};let fc=class G5 extends z{constructor(e,t,i,n,s,r){super(),this._instantiationService=s,this._editor=e,this._model=this._register(new bY(this._editor,r.codeActionProvider,t,i,n)),this._register(this._model.onDidChangeState(a=>this.update(a))),this._ui=new eg(()=>this._register(new wL(e,Kg.Id,r_.Id,{applyCodeAction:(a,l,c)=>K5(this,void 0,void 0,function*(){try{yield this._applyCodeAction(a,c)}finally{l&&this._trigger({type:2,triggerAction:fn.QuickFix,filter:{}})}})},this._instantiationService)))}static get(e){return e.getContribution(G5.ID)}update(e){this._ui.getValue().update(e)}hideCodeActionMenu(){this._ui.hasValue()&&this._ui.getValue().hideCodeActionWidget()}navigateCodeActionList(e){this._ui.hasValue()&&this._ui.getValue().navigateList(e)}selectedOption(){this._ui.hasValue()&&this._ui.getValue().onEnter()}selectedOptionWithPreview(){this._ui.hasValue()&&this._ui.getValue().onPreviewEnter()}showCodeActions(e,t,i){return this._ui.getValue().showCodeActionList(e,t,i,{includeDisabledActions:!1,fromLightbulb:!1})}manualTriggerAtCurrentPosition(e,t,i,n,s){var r;if(!this._editor.hasModel())return;(r=rs.get(this._editor))===null||r===void 0||r.closeMessage();const a=this._editor.getPosition();this._trigger({type:1,triggerAction:t,filter:i,autoApply:n,context:{notAvailableMessage:e,position:a},preview:s})}_trigger(e){return this._model.trigger(e)}_applyCodeAction(e,t){return this._instantiationService.invokeFunction(CY,e,SL.FromCodeActions,{preview:t,editor:this._editor})}};fc.ID=\"editor.contrib.quickFixController\";fc=vY([bf(1,ta),bf(2,xe),bf(3,kc),bf(4,Re),bf(5,ue)],fc);var SL;(function(o){o.OnSave=\"onSave\",o.FromProblemsView=\"fromProblemsView\",o.FromCodeActions=\"fromCodeActions\"})(SL||(SL={}));function CY(o,e,t,i){return K5(this,void 0,void 0,function*(){const n=o.get(n_),s=o.get(Ci),r=o.get(rl),a=o.get(gi);if(r.publicLog2(\"codeAction.applyCodeAction\",{codeActionTitle:e.action.title,codeActionKind:e.action.kind,codeActionIsPreferred:!!e.action.isPreferred,reason:t}),yield e.resolve(We.None),e.action.edit&&(yield n.apply($g.convert(e.action.edit),{editor:i==null?void 0:i.editor,label:e.action.title,quotableLabel:e.action.title,code:\"undoredo.codeAction\",respectAutoSaveConfig:!0,showPreview:i==null?void 0:i.preview})),e.action.command)try{yield s.executeCommand(e.action.command.id,...e.action.command.arguments||[])}catch(l){const c=wY(l);a.error(typeof c==\"string\"?c:p(\"applyCodeActionFailed\",\"An unknown error occurred while applying the code action\"))}})}function wY(o){return typeof o==\"string\"?o:o instanceof Error&&typeof o.message==\"string\"?o.message:void 0}function yh(o,e,t,i,n=!1,s=fn.Default){if(o.hasModel()){const r=fc.get(o);r==null||r.manualTriggerAtCurrentPosition(e,s,t,i,n)}}class Kg extends he{constructor(){super({id:Kg.Id,label:p(\"quickfix.trigger.label\",\"Quick Fix...\"),alias:\"Quick Fix...\",precondition:re.and(T.writable,T.hasCodeActionsProvider),kbOpts:{kbExpr:T.editorTextFocus,primary:2132,weight:100}})}run(e,t){return yh(t,p(\"editor.action.quickFix.noneMessage\",\"No code actions available\"),void 0,void 0,!1,fn.QuickFix)}}Kg.Id=\"editor.action.quickFix\";class SY extends ji{constructor(){super({id:M5,precondition:re.and(T.writable,T.hasCodeActionsProvider),description:{description:\"Trigger a code action\",args:[{name:\"args\",schema:f1}]}})}runEditorCommand(e,t,i){const n=Dr.fromUser(i,{kind:Ke.Empty,apply:\"ifSingle\"});return yh(t,typeof(i==null?void 0:i.kind)==\"string\"?n.preferred?p(\"editor.action.codeAction.noneMessage.preferred.kind\",\"No preferred code actions for '{0}' available\",i.kind):p(\"editor.action.codeAction.noneMessage.kind\",\"No code actions for '{0}' available\",i.kind):n.preferred?p(\"editor.action.codeAction.noneMessage.preferred\",\"No preferred code actions available\"):p(\"editor.action.codeAction.noneMessage\",\"No code actions available\"),{include:n.kind,includeSourceActions:!0,onlyIncludePreferredActions:n.preferred},n.apply)}}class yY extends he{constructor(){super({id:A5,label:p(\"refactor.label\",\"Refactor...\"),alias:\"Refactor...\",precondition:re.and(T.writable,T.hasCodeActionsProvider),kbOpts:{kbExpr:T.editorTextFocus,primary:3120,mac:{primary:1328},weight:100},contextMenuOpts:{group:\"1_modification\",order:2,when:re.and(T.writable,o_(Ke.Refactor))},description:{description:\"Refactor...\",args:[{name:\"args\",schema:f1}]}})}run(e,t,i){return q5(t,i,!1,fn.Refactor)}}class LY extends he{constructor(){super({id:TZ,label:p(\"refactor.preview.label\",\"Refactor with Preview...\"),alias:\"Refactor Preview...\",precondition:re.and(T.writable,T.hasCodeActionsProvider),description:{description:\"Refactor Preview...\",args:[{name:\"args\",schema:f1}]}})}run(e,t,i){return q5(t,i,!0,fn.RefactorPreview)}}class DY extends he{constructor(){super({id:R5,label:p(\"source.label\",\"Source Action...\"),alias:\"Source Action...\",precondition:re.and(T.writable,T.hasCodeActionsProvider),contextMenuOpts:{group:\"1_modification\",order:2.1,when:re.and(T.writable,o_(Ke.Source))},description:{description:\"Source Action...\",args:[{name:\"args\",schema:f1}]}})}run(e,t,i){const n=Dr.fromUser(i,{kind:Ke.Source,apply:\"never\"});return yh(t,typeof(i==null?void 0:i.kind)==\"string\"?n.preferred?p(\"editor.action.source.noneMessage.preferred.kind\",\"No preferred source actions for '{0}' available\",i.kind):p(\"editor.action.source.noneMessage.kind\",\"No source actions for '{0}' available\",i.kind):n.preferred?p(\"editor.action.source.noneMessage.preferred\",\"No preferred source actions available\"):p(\"editor.action.source.noneMessage\",\"No source actions available\"),{include:Ke.Source.contains(n.kind)?n.kind:Ke.None,includeSourceActions:!0,onlyIncludePreferredActions:n.preferred},n.apply,void 0,fn.SourceAction)}}class kY extends he{constructor(){super({id:uE,label:p(\"organizeImports.label\",\"Organize Imports\"),alias:\"Organize Imports\",precondition:re.and(T.writable,o_(Ke.SourceOrganizeImports)),kbOpts:{kbExpr:T.editorTextFocus,primary:1581,weight:100}})}run(e,t){return yh(t,p(\"editor.action.organize.noneMessage\",\"No organize imports action available\"),{include:Ke.SourceOrganizeImports,includeSourceActions:!0},\"ifSingle\",void 0,fn.OrganizeImports)}}class xY extends he{constructor(){super({id:gE,label:p(\"fixAll.label\",\"Fix All\"),alias:\"Fix All\",precondition:re.and(T.writable,o_(Ke.SourceFixAll))})}run(e,t){return yh(t,p(\"fixAll.noneMessage\",\"No fix all action available\"),{include:Ke.SourceFixAll,includeSourceActions:!0},\"ifSingle\",void 0,fn.FixAll)}}class r_ extends he{constructor(){super({id:r_.Id,label:p(\"autoFix.label\",\"Auto Fix...\"),alias:\"Auto Fix...\",precondition:re.and(T.writable,o_(Ke.QuickFix)),kbOpts:{kbExpr:T.editorTextFocus,primary:1620,mac:{primary:2644},weight:100}})}run(e,t){return yh(t,p(\"editor.action.autoFix.noneMessage\",\"No auto fixes available\"),{include:Ke.QuickFix,onlyIncludePreferredActions:!0},\"ifSingle\",void 0,fn.AutoFix)}}r_.Id=\"editor.action.autoFix\";const a_=ji.bindToContribution(fc.get),l_=100+90;Q(new a_({id:\"hideCodeActionMenuWidget\",precondition:jg.Visible,handler(o){o.hideCodeActionMenu()},kbOpts:{weight:l_,primary:9,secondary:[1033]}}));Q(new a_({id:\"focusPreviousCodeAction\",precondition:jg.Visible,handler(o){o.navigateCodeActionList(!0)},kbOpts:{weight:l_+1e5,primary:16,secondary:[2064]}}));Q(new a_({id:\"focusNextCodeAction\",precondition:jg.Visible,handler(o){o.navigateCodeActionList(!1)},kbOpts:{weight:l_+1e5,primary:18,secondary:[2066]}}));Q(new a_({id:\"onEnterSelectCodeAction\",precondition:jg.Visible,handler(o){o.selectedOption()},kbOpts:{weight:l_+1e5,primary:3,secondary:[1026]}}));Q(new a_({id:\"onEnterSelectCodeActionWithPreview\",precondition:jg.Visible,handler(o){o.selectedOptionWithPreview()},kbOpts:{weight:l_+1e5,primary:2051}}));const mE=Object.freeze({id:\"editor\",order:5,type:\"object\",title:p(\"editorConfigurationTitle\",\"Editor\"),scope:5}),Lv=Object.assign(Object.assign({},mE),{properties:{\"editor.tabSize\":{type:\"number\",default:Xi.tabSize,minimum:1,markdownDescription:p(\"tabSize\",\"The number of spaces a tab is equal to. This setting is overridden based on the file contents when `#editor.detectIndentation#` is on.\")},\"editor.insertSpaces\":{type:\"boolean\",default:Xi.insertSpaces,markdownDescription:p(\"insertSpaces\",\"Insert spaces when pressing `Tab`. This setting is overridden based on the file contents when `#editor.detectIndentation#` is on.\")},\"editor.detectIndentation\":{type:\"boolean\",default:Xi.detectIndentation,markdownDescription:p(\"detectIndentation\",\"Controls whether `#editor.tabSize#` and `#editor.insertSpaces#` will be automatically detected when a file is opened based on the file contents.\")},\"editor.trimAutoWhitespace\":{type:\"boolean\",default:Xi.trimAutoWhitespace,description:p(\"trimAutoWhitespace\",\"Remove trailing auto inserted whitespace.\")},\"editor.largeFileOptimizations\":{type:\"boolean\",default:Xi.largeFileOptimizations,description:p(\"largeFileOptimizations\",\"Special handling for large files to disable certain memory intensive features.\")},\"editor.wordBasedSuggestions\":{type:\"boolean\",default:!0,description:p(\"wordBasedSuggestions\",\"Controls whether completions should be computed based on words in the document.\")},\"editor.wordBasedSuggestionsMode\":{enum:[\"currentDocument\",\"matchingDocuments\",\"allDocuments\"],default:\"matchingDocuments\",enumDescriptions:[p(\"wordBasedSuggestionsMode.currentDocument\",\"Only suggest words from the active document.\"),p(\"wordBasedSuggestionsMode.matchingDocuments\",\"Suggest words from all open documents of the same language.\"),p(\"wordBasedSuggestionsMode.allDocuments\",\"Suggest words from all open documents.\")],description:p(\"wordBasedSuggestionsMode\",\"Controls from which documents word based completions are computed.\")},\"editor.semanticHighlighting.enabled\":{enum:[!0,!1,\"configuredByTheme\"],enumDescriptions:[p(\"semanticHighlighting.true\",\"Semantic highlighting enabled for all color themes.\"),p(\"semanticHighlighting.false\",\"Semantic highlighting disabled for all color themes.\"),p(\"semanticHighlighting.configuredByTheme\",\"Semantic highlighting is configured by the current color theme's `semanticHighlighting` setting.\")],default:\"configuredByTheme\",description:p(\"semanticHighlighting.enabled\",\"Controls whether the semanticHighlighting is shown for the languages that support it.\")},\"editor.stablePeek\":{type:\"boolean\",default:!1,markdownDescription:p(\"stablePeek\",\"Keep peek editors open even when double clicking their content or when hitting `Escape`.\")},\"editor.maxTokenizationLineLength\":{type:\"integer\",default:2e4,description:p(\"maxTokenizationLineLength\",\"Lines above this length will not be tokenized for performance reasons\")},\"editor.language.brackets\":{type:[\"array\",\"null\"],default:null,description:p(\"schema.brackets\",\"Defines the bracket symbols that increase or decrease the indentation.\"),items:{type:\"array\",items:[{type:\"string\",description:p(\"schema.openBracket\",\"The opening bracket character or string sequence.\")},{type:\"string\",description:p(\"schema.closeBracket\",\"The closing bracket character or string sequence.\")}]}},\"editor.language.colorizedBracketPairs\":{type:[\"array\",\"null\"],default:null,description:p(\"schema.colorizedBracketPairs\",\"Defines the bracket pairs that are colorized by their nesting level if bracket pair colorization is enabled.\"),items:{type:\"array\",items:[{type:\"string\",description:p(\"schema.openBracket\",\"The opening bracket character or string sequence.\")},{type:\"string\",description:p(\"schema.closeBracket\",\"The closing bracket character or string sequence.\")}]}},\"diffEditor.maxComputationTime\":{type:\"number\",default:5e3,description:p(\"maxComputationTime\",\"Timeout in milliseconds after which diff computation is cancelled. Use 0 for no timeout.\")},\"diffEditor.maxFileSize\":{type:\"number\",default:50,description:p(\"maxFileSize\",\"Maximum file size in MB for which to compute diffs. Use 0 for no limit.\")},\"diffEditor.renderSideBySide\":{type:\"boolean\",default:!0,description:p(\"sideBySide\",\"Controls whether the diff editor shows the diff side by side or inline.\")},\"diffEditor.renderMarginRevertIcon\":{type:\"boolean\",default:!0,description:p(\"renderMarginRevertIcon\",\"When enabled, the diff editor shows arrows in its glyph margin to revert changes.\")},\"diffEditor.ignoreTrimWhitespace\":{type:\"boolean\",default:!0,description:p(\"ignoreTrimWhitespace\",\"When enabled, the diff editor ignores changes in leading or trailing whitespace.\")},\"diffEditor.renderIndicators\":{type:\"boolean\",default:!0,description:p(\"renderIndicators\",\"Controls whether the diff editor shows +/- indicators for added/removed changes.\")},\"diffEditor.codeLens\":{type:\"boolean\",default:!1,description:p(\"codeLens\",\"Controls whether the editor shows CodeLens.\")},\"diffEditor.wordWrap\":{type:\"string\",enum:[\"off\",\"on\",\"inherit\"],default:\"inherit\",markdownEnumDescriptions:[p(\"wordWrap.off\",\"Lines will never wrap.\"),p(\"wordWrap.on\",\"Lines will wrap at the viewport width.\"),p(\"wordWrap.inherit\",\"Lines will wrap according to the `#editor.wordWrap#` setting.\")]}}});function IY(o){return typeof o.type!=\"undefined\"||typeof o.anyOf!=\"undefined\"}for(const o of cu){const e=o.schema;if(typeof e!=\"undefined\")if(IY(e))Lv.properties[`editor.${o.name}`]=e;else for(const t in e)Object.hasOwnProperty.call(e,t)&&(Lv.properties[t]=e[t])}let hb=null;function Z5(){return hb===null&&(hb=Object.create(null),Object.keys(Lv.properties).forEach(o=>{hb[o]=!0})),hb}function EY(o){return Z5()[`editor.${o}`]||!1}function NY(o){return Z5()[`diffEditor.${o}`]||!1}const TY=di.as(al.Configuration);TY.registerConfiguration(Lv);di.as(al.Configuration).registerConfiguration(Object.assign(Object.assign({},mE),{properties:{\"editor.experimental.useCustomCodeActionMenu\":{type:\"boolean\",tags:[\"experimental\"],scope:5,description:p(\"codeActionWidget\",\"Enabling this adjusts how the code action menu is rendered.\"),default:!1}}}));rt(fc.ID,fc);te(Kg);te(yY);te(LY);te(DY);te(kY);te(r_);te(xY);Q(new SY);function _E(o){return p1(o,0)}function p1(o,e){switch(typeof o){case\"object\":return o===null?$a(349,e):Array.isArray(o)?AY(o,e):RY(o,e);case\"string\":return bE(o,e);case\"boolean\":return MY(o,e);case\"number\":return $a(o,e);case\"undefined\":return $a(937,e);default:return $a(617,e)}}function $a(o,e){return(e<<5)-e+o|0}function MY(o,e){return $a(o?433:863,e)}function bE(o,e){e=$a(149417,e);for(let t=0,i=o.length;t<i;t++)e=$a(o.charCodeAt(t),e);return e}function AY(o,e){return e=$a(104579,e),o.reduce((t,i)=>p1(i,t),e)}function RY(o,e){return e=$a(181387,e),Object.keys(o).sort().reduce((t,i)=>(t=bE(i,t),p1(o[i],t)),e)}function fS(o,e,t=32){const i=t-e,n=~((1<<i)-1);return(o<<e|(n&o)>>>i)>>>0}function pM(o,e=0,t=o.byteLength,i=0){for(let n=0;n<t;n++)o[e+n]=i}function OY(o,e,t=\"0\"){for(;o.length<e;)o=t+o;return o}function vf(o,e=32){return o instanceof ArrayBuffer?Array.from(new Uint8Array(o)).map(t=>t.toString(16).padStart(2,\"0\")).join(\"\"):OY((o>>>0).toString(16),e/4)}class m1{constructor(){this._h0=1732584193,this._h1=4023233417,this._h2=2562383102,this._h3=271733878,this._h4=3285377520,this._buff=new Uint8Array(64+3),this._buffDV=new DataView(this._buff.buffer),this._buffLen=0,this._totalLen=0,this._leftoverHighSurrogate=0,this._finished=!1}update(e){const t=e.length;if(t===0)return;const i=this._buff;let n=this._buffLen,s=this._leftoverHighSurrogate,r,a;for(s!==0?(r=s,a=-1,s=0):(r=e.charCodeAt(0),a=0);;){let l=r;if(wi(r))if(a+1<t){const c=e.charCodeAt(a+1);Fd(c)?(a++,l=jx(r,c)):l=65533}else{s=r;break}else Fd(r)&&(l=65533);if(n=this._push(i,n,l),a++,a<t)r=e.charCodeAt(a);else break}this._buffLen=n,this._leftoverHighSurrogate=s}_push(e,t,i){return i<128?e[t++]=i:i<2048?(e[t++]=192|(i&1984)>>>6,e[t++]=128|(i&63)>>>0):i<65536?(e[t++]=224|(i&61440)>>>12,e[t++]=128|(i&4032)>>>6,e[t++]=128|(i&63)>>>0):(e[t++]=240|(i&1835008)>>>18,e[t++]=128|(i&258048)>>>12,e[t++]=128|(i&4032)>>>6,e[t++]=128|(i&63)>>>0),t>=64&&(this._step(),t-=64,this._totalLen+=64,e[0]=e[64+0],e[1]=e[64+1],e[2]=e[64+2]),t}digest(){return this._finished||(this._finished=!0,this._leftoverHighSurrogate&&(this._leftoverHighSurrogate=0,this._buffLen=this._push(this._buff,this._buffLen,65533)),this._totalLen+=this._buffLen,this._wrapUp()),vf(this._h0)+vf(this._h1)+vf(this._h2)+vf(this._h3)+vf(this._h4)}_wrapUp(){this._buff[this._buffLen++]=128,pM(this._buff,this._buffLen),this._buffLen>56&&(this._step(),pM(this._buff));const e=8*this._totalLen;this._buffDV.setUint32(56,Math.floor(e/4294967296),!1),this._buffDV.setUint32(60,e%4294967296,!1),this._step()}_step(){const e=m1._bigBlock32,t=this._buffDV;for(let h=0;h<64;h+=4)e.setUint32(h,t.getUint32(h,!1),!1);for(let h=64;h<320;h+=4)e.setUint32(h,fS(e.getUint32(h-12,!1)^e.getUint32(h-32,!1)^e.getUint32(h-56,!1)^e.getUint32(h-64,!1),1),!1);let i=this._h0,n=this._h1,s=this._h2,r=this._h3,a=this._h4,l,c,d;for(let h=0;h<80;h++)h<20?(l=n&s|~n&r,c=1518500249):h<40?(l=n^s^r,c=1859775393):h<60?(l=n&s|n&r|s&r,c=2400959708):(l=n^s^r,c=3395469782),d=fS(i,5)+l+a+c+e.getUint32(h*4,!1)&4294967295,a=r,r=s,s=fS(n,30),n=i,i=d;this._h0=this._h0+i&4294967295,this._h1=this._h1+n&4294967295,this._h2=this._h2+s&4294967295,this._h3=this._h3+r&4294967295,this._h4=this._h4+a&4294967295}}m1._bigBlock32=new DataView(new ArrayBuffer(320));var mM=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class yL{constructor(){this.lenses=[],this._disposables=new ee}dispose(){this._disposables.dispose()}get isDisposed(){return this._disposables.isDisposed}add(e,t){this._disposables.add(e);for(const i of e.lenses)this.lenses.push({symbol:i,provider:t})}}function Y5(o,e,t){return mM(this,void 0,void 0,function*(){const i=o.ordered(e),n=new Map,s=new yL,r=i.map((a,l)=>mM(this,void 0,void 0,function*(){n.set(a,l);try{const c=yield Promise.resolve(a.provideCodeLenses(e,t));c&&s.add(c,a)}catch(c){Ai(c)}}));return yield Promise.all(r),s.lenses=s.lenses.sort((a,l)=>a.symbol.range.startLineNumber<l.symbol.range.startLineNumber?-1:a.symbol.range.startLineNumber>l.symbol.range.startLineNumber?1:n.get(a.provider)<n.get(l.provider)?-1:n.get(a.provider)>n.get(l.provider)?1:a.symbol.range.startColumn<l.symbol.range.startColumn?-1:a.symbol.range.startColumn>l.symbol.range.startColumn?1:0),s})}Ye.registerCommand(\"_executeCodeLensProvider\",function(o,...e){let[t,i]=e;gt(me.isUri(t)),gt(typeof i==\"number\"||!i);const{codeLensProvider:n}=o.get(ue),s=o.get(Bt).getModel(t);if(!s)throw zo();const r=[],a=new ee;return Y5(n,s,We.None).then(l=>{a.add(l);const c=[];for(const d of l.lenses)i==null||Boolean(d.symbol.command)?r.push(d.symbol):i-- >0&&d.provider.resolveCodeLens&&c.push(Promise.resolve(d.provider.resolveCodeLens(s,d.symbol,We.None)).then(h=>r.push(h||d.symbol)));return Promise.all(c)}).then(()=>r).finally(()=>{setTimeout(()=>a.dispose(),100)})});var $f=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})},Cu;(function(o){o[o.None=0]=\"None\",o[o.Initialized=1]=\"Initialized\",o[o.Closed=2]=\"Closed\"})(Cu||(Cu={}));class Hu extends z{constructor(e,t=Object.create(null)){super(),this.database=e,this.options=t,this._onDidChangeStorage=this._register(new O),this.onDidChangeStorage=this._onDidChangeStorage.event,this.state=Cu.None,this.cache=new Map,this.flushDelayer=new mH(Hu.DEFAULT_FLUSH_DELAY),this.pendingDeletes=new Set,this.pendingInserts=new Map,this.whenFlushedCallbacks=[],this.registerListeners()}registerListeners(){this._register(this.database.onDidChangeItemsExternal(e=>this.onDidChangeItemsExternal(e)))}onDidChangeItemsExternal(e){var t,i;(t=e.changed)===null||t===void 0||t.forEach((n,s)=>this.accept(s,n)),(i=e.deleted)===null||i===void 0||i.forEach(n=>this.accept(n,void 0))}accept(e,t){if(this.state===Cu.Closed)return;let i=!1;_s(t)?i=this.cache.delete(e):this.cache.get(e)!==t&&(this.cache.set(e,t),i=!0),i&&this._onDidChangeStorage.fire(e)}get(e,t){const i=this.cache.get(e);return _s(i)?t:i}getBoolean(e,t){const i=this.get(e);return _s(i)?t:i===\"true\"}getNumber(e,t){const i=this.get(e);return _s(i)?t:parseInt(i,10)}set(e,t){return $f(this,void 0,void 0,function*(){if(this.state===Cu.Closed)return;if(_s(t))return this.delete(e);const i=String(t);if(this.cache.get(e)!==i)return this.cache.set(e,i),this.pendingInserts.set(e,i),this.pendingDeletes.delete(e),this._onDidChangeStorage.fire(e),this.doFlush()})}delete(e){return $f(this,void 0,void 0,function*(){if(!(this.state===Cu.Closed||!this.cache.delete(e)))return this.pendingDeletes.has(e)||this.pendingDeletes.add(e),this.pendingInserts.delete(e),this._onDidChangeStorage.fire(e),this.doFlush()})}get hasPending(){return this.pendingInserts.size>0||this.pendingDeletes.size>0}flushPending(){return $f(this,void 0,void 0,function*(){if(!this.hasPending)return;const e={insert:this.pendingInserts,delete:this.pendingDeletes};return this.pendingDeletes=new Set,this.pendingInserts=new Map,this.database.updateItems(e).finally(()=>{var t;if(!this.hasPending)for(;this.whenFlushedCallbacks.length;)(t=this.whenFlushedCallbacks.pop())===null||t===void 0||t()})})}doFlush(e){return $f(this,void 0,void 0,function*(){return this.flushDelayer.trigger(()=>this.flushPending(),e)})}dispose(){this.flushDelayer.dispose(),super.dispose()}}Hu.DEFAULT_FLUSH_DELAY=100;class pS{constructor(){this.onDidChangeItemsExternal=pe.None,this.items=new Map}updateItems(e){var t,i;return $f(this,void 0,void 0,function*(){(t=e.insert)===null||t===void 0||t.forEach((n,s)=>this.items.set(s,n)),(i=e.delete)===null||i===void 0||i.forEach(n=>this.items.delete(n))})}}const ub=\"__$__targetStorageMarker\",ia=qe(\"storageService\");var Dv;(function(o){o[o.NONE=0]=\"NONE\",o[o.SHUTDOWN=1]=\"SHUTDOWN\"})(Dv||(Dv={}));class _1 extends z{constructor(e={flushInterval:_1.DEFAULT_FLUSH_INTERVAL}){super(),this.options=e,this._onDidChangeValue=this._register(new I0),this.onDidChangeValue=this._onDidChangeValue.event,this._onDidChangeTarget=this._register(new I0),this._onWillSaveState=this._register(new O),this.onWillSaveState=this._onWillSaveState.event,this._workspaceKeyTargets=void 0,this._profileKeyTargets=void 0,this._applicationKeyTargets=void 0}emitDidChangeValue(e,t){if(t===ub){switch(e){case-1:this._applicationKeyTargets=void 0;break;case 0:this._profileKeyTargets=void 0;break;case 1:this._workspaceKeyTargets=void 0;break}this._onDidChangeTarget.fire({scope:e})}else this._onDidChangeValue.fire({scope:e,key:t,target:this.getKeyTargets(e)[t]})}get(e,t,i){var n;return(n=this.getStorage(t))===null||n===void 0?void 0:n.get(e,i)}getBoolean(e,t,i){var n;return(n=this.getStorage(t))===null||n===void 0?void 0:n.getBoolean(e,i)}getNumber(e,t,i){var n;return(n=this.getStorage(t))===null||n===void 0?void 0:n.getNumber(e,i)}store(e,t,i,n){if(_s(t)){this.remove(e,i);return}this.withPausedEmitters(()=>{var s;this.updateKeyTarget(e,i,n),(s=this.getStorage(i))===null||s===void 0||s.set(e,t)})}remove(e,t){this.withPausedEmitters(()=>{var i;this.updateKeyTarget(e,t,void 0),(i=this.getStorage(t))===null||i===void 0||i.delete(e)})}withPausedEmitters(e){this._onDidChangeValue.pause(),this._onDidChangeTarget.pause();try{e()}finally{this._onDidChangeValue.resume(),this._onDidChangeTarget.resume()}}updateKeyTarget(e,t,i){var n,s;const r=this.getKeyTargets(t);typeof i==\"number\"?r[e]!==i&&(r[e]=i,(n=this.getStorage(t))===null||n===void 0||n.set(ub,JSON.stringify(r))):typeof r[e]==\"number\"&&(delete r[e],(s=this.getStorage(t))===null||s===void 0||s.set(ub,JSON.stringify(r)))}get workspaceKeyTargets(){return this._workspaceKeyTargets||(this._workspaceKeyTargets=this.loadKeyTargets(1)),this._workspaceKeyTargets}get profileKeyTargets(){return this._profileKeyTargets||(this._profileKeyTargets=this.loadKeyTargets(0)),this._profileKeyTargets}get applicationKeyTargets(){return this._applicationKeyTargets||(this._applicationKeyTargets=this.loadKeyTargets(-1)),this._applicationKeyTargets}getKeyTargets(e){switch(e){case-1:return this.applicationKeyTargets;case 0:return this.profileKeyTargets;default:return this.workspaceKeyTargets}}loadKeyTargets(e){const t=this.get(ub,e);if(t)try{return JSON.parse(t)}catch(i){}return Object.create(null)}}_1.DEFAULT_FLUSH_INTERVAL=60*1e3;class PY extends _1{constructor(){super(),this.applicationStorage=this._register(new Hu(new pS)),this.profileStorage=this._register(new Hu(new pS)),this.workspaceStorage=this._register(new Hu(new pS)),this._register(this.workspaceStorage.onDidChangeStorage(e=>this.emitDidChangeValue(1,e))),this._register(this.profileStorage.onDidChangeStorage(e=>this.emitDidChangeValue(0,e))),this._register(this.applicationStorage.onDidChangeStorage(e=>this.emitDidChangeValue(-1,e)))}getStorage(e){switch(e){case-1:return this.applicationStorage;case 0:return this.profileStorage;default:return this.workspaceStorage}}}var FY=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},BY=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const X5=qe(\"ICodeLensCache\");class _M{constructor(e,t){this.lineCount=e,this.data=t}}let LL=class{constructor(e){this._fakeProvider=new class{provideCodeLenses(){throw new Error(\"not supported\")}},this._cache=new bh(20,.75);const t=\"codelens/cache\";Fp(()=>e.remove(t,1));const i=\"codelens/cache2\",n=e.get(i,1,\"{}\");this._deserialize(n),nc(e.onWillSaveState)(s=>{s.reason===Dv.SHUTDOWN&&e.store(i,this._serialize(),1,1)})}put(e,t){const i=t.lenses.map(r=>{var a;return{range:r.symbol.range,command:r.symbol.command&&{id:\"\",title:(a=r.symbol.command)===null||a===void 0?void 0:a.title}}}),n=new yL;n.add({lenses:i,dispose:()=>{}},this._fakeProvider);const s=new _M(e.getLineCount(),n);this._cache.set(e.uri.toString(),s)}get(e){const t=this._cache.get(e.uri.toString());return t&&t.lineCount===e.getLineCount()?t.data:void 0}delete(e){this._cache.delete(e.uri.toString())}_serialize(){const e=Object.create(null);for(const[t,i]of this._cache){const n=new Set;for(const s of i.data.lenses)n.add(s.symbol.range.startLineNumber);e[t]={lineCount:i.lineCount,lines:[...n.values()]}}return JSON.stringify(e)}_deserialize(e){try{const t=JSON.parse(e);for(const i in t){const n=t[i],s=[];for(const a of n.lines)s.push({range:new L(a,1,a,11)});const r=new yL;r.add({lenses:s,dispose(){}},this._fakeProvider),this._cache.set(i,new _M(n.lineCount,r))}}catch(t){}}};LL=FY([BY(0,ia)],LL);Xe(X5,LL);const WY=new RegExp(`(\\\\\\\\)?\\\\$\\\\((${Cn.iconNameExpression}(?:${Cn.iconModifierExpression})?)\\\\)`,\"g\");function yd(o){const e=new Array;let t,i=0,n=0;for(;(t=WY.exec(o))!==null;){n=t.index||0,e.push(o.substring(i,n)),i=(t.index||0)+t[0].length;const[,s,r]=t;e.push(s?`$(${r})`:VY({id:r}))}return i<o.length&&e.push(o.substring(i)),e}function VY(o){const e=se(\"span\");return e.classList.add(...Cn.asClassNameArray(o)),e}class HY{constructor(e,t,i){this.afterColumn=1073741824,this.afterLineNumber=e,this.heightInPx=t,this._onHeight=i,this.suppressMouseDown=!0,this.domNode=document.createElement(\"div\")}onComputedHeight(e){this._lastHeight===void 0?this._lastHeight=e:this._lastHeight!==e&&(this._lastHeight=e,this._onHeight())}isVisible(){return this._lastHeight!==0&&this.domNode.hasAttribute(\"monaco-visible-view-zone\")}}class b1{constructor(e,t,i){this.allowEditorOverflow=!1,this.suppressMouseDown=!0,this._commands=new Map,this._isEmpty=!0,this._editor=e,this._id=`codelens.widget-${b1._idPool++}`,this.updatePosition(i),this._domNode=document.createElement(\"span\"),this._domNode.className=`codelens-decoration ${t}`}withCommands(e,t){this._commands.clear();const i=[];let n=!1;for(let s=0;s<e.length;s++){const r=e[s];if(!!r&&(n=!0,r.command)){const a=yd(r.command.title.trim());r.command.id?(i.push(se(\"a\",{id:String(s),title:r.command.tooltip,role:\"button\"},...a)),this._commands.set(String(s),r.command)):i.push(se(\"span\",{title:r.command.tooltip},...a)),s+1<e.length&&i.push(se(\"span\",void 0,\"\\xA0|\\xA0\"))}}n?(Rd(this._domNode,...i),this._isEmpty&&t&&this._domNode.classList.add(\"fadein\"),this._isEmpty=!1):Rd(this._domNode,se(\"span\",void 0,\"no commands\"))}getCommand(e){return e.parentElement===this._domNode?this._commands.get(e.id):void 0}getId(){return this._id}getDomNode(){return this._domNode}updatePosition(e){const t=this._editor.getModel().getLineFirstNonWhitespaceColumn(e);this._widgetPosition={position:{lineNumber:e,column:t},preference:[1]}}getPosition(){return this._widgetPosition||null}}b1._idPool=0;class mS{constructor(){this._removeDecorations=[],this._addDecorations=[],this._addDecorationsCallbacks=[]}addDecoration(e,t){this._addDecorations.push(e),this._addDecorationsCallbacks.push(t)}removeDecoration(e){this._removeDecorations.push(e)}commit(e){const t=e.deltaDecorations(this._removeDecorations,this._addDecorations);for(let i=0,n=t.length;i<n;i++)this._addDecorationsCallbacks[i](t[i])}}class bM{constructor(e,t,i,n,s,r,a){this._isDisposed=!1,this._editor=t,this._className=i,this._data=e,this._decorationIds=[];let l;const c=[];this._data.forEach((d,h)=>{d.symbol.command&&c.push(d.symbol),n.addDecoration({range:d.symbol.range,options:Ie.EMPTY},u=>this._decorationIds[h]=u),l?l=L.plusRange(l,d.symbol.range):l=L.lift(d.symbol.range)}),this._viewZone=new HY(l.startLineNumber-1,r,a),this._viewZoneId=s.addZone(this._viewZone),c.length>0&&(this._createContentWidgetIfNecessary(),this._contentWidget.withCommands(c,!1))}_createContentWidgetIfNecessary(){this._contentWidget?this._editor.layoutContentWidget(this._contentWidget):(this._contentWidget=new b1(this._editor,this._className,this._viewZone.afterLineNumber+1),this._editor.addContentWidget(this._contentWidget))}dispose(e,t){this._decorationIds.forEach(e.removeDecoration,e),this._decorationIds=[],t==null||t.removeZone(this._viewZoneId),this._contentWidget&&(this._editor.removeContentWidget(this._contentWidget),this._contentWidget=void 0),this._isDisposed=!0}isDisposed(){return this._isDisposed}isValid(){return this._decorationIds.some((e,t)=>{const i=this._editor.getModel().getDecorationRange(e),n=this._data[t].symbol;return!!(i&&L.isEmpty(n.range)===i.isEmpty())})}updateCodeLensSymbols(e,t){this._decorationIds.forEach(t.removeDecoration,t),this._decorationIds=[],this._data=e,this._data.forEach((i,n)=>{t.addDecoration({range:i.symbol.range,options:Ie.EMPTY},s=>this._decorationIds[n]=s)})}updateHeight(e,t){this._viewZone.heightInPx=e,t.layoutZone(this._viewZoneId),this._contentWidget&&this._editor.layoutContentWidget(this._contentWidget)}computeIfNecessary(e){if(!this._viewZone.isVisible())return null;for(let t=0;t<this._decorationIds.length;t++){const i=e.getDecorationRange(this._decorationIds[t]);i&&(this._data[t].symbol.range=i)}return this._data}updateCommands(e){this._createContentWidgetIfNecessary(),this._contentWidget.withCommands(e,!0);for(let t=0;t<this._data.length;t++){const i=e[t];if(i){const{symbol:n}=this._data[t];n.command=i.command||n.command}}}getCommand(e){var t;return(t=this._contentWidget)===null||t===void 0?void 0:t.getCommand(e)}getLineNumber(){const e=this._editor.getModel().getDecorationRange(this._decorationIds[0]);return e?e.startLineNumber:-1}update(e){if(this.isValid()){const t=this._editor.getModel().getDecorationRange(this._decorationIds[0]);t&&(this._viewZone.afterLineNumber=t.startLineNumber-1,e.layoutZone(this._viewZoneId),this._contentWidget&&(this._contentWidget.updatePosition(t.startLineNumber),this._editor.layoutContentWidget(this._contentWidget)))}}}const zY={ctrlCmd:!1,alt:!1};var rm;(function(o){o[o.Blur=1]=\"Blur\",o[o.Gesture=2]=\"Gesture\",o[o.Other=3]=\"Other\"})(rm||(rm={}));var Eo;(function(o){o[o.NONE=0]=\"NONE\",o[o.FIRST=1]=\"FIRST\",o[o.SECOND=2]=\"SECOND\",o[o.LAST=3]=\"LAST\"})(Eo||(Eo={}));const c_=qe(\"quickInputService\");var vM=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const So=qe(\"openerService\"),UY=Object.freeze({_serviceBrand:void 0,registerOpener(){return z.None},registerValidator(){return z.None},registerExternalUriResolver(){return z.None},setDefaultExternalOpener(){},registerExternalOpener(){return z.None},open(){return vM(this,void 0,void 0,function*(){return!1})},resolveExternalUri(o){return vM(this,void 0,void 0,function*(){return{resolved:o,dispose(){}}})}});function vE(o,e){return me.isUri(o)?su(o.scheme,e):$x(o,e+\":\")}function CM(o,...e){return e.some(t=>vE(o,t))}function Q5(o){let e;const t=/^L?(\\d+)(?:,(\\d+))?(-L?(\\d+)(?:,(\\d+))?)?/.exec(o.fragment);return t&&(e={startLineNumber:parseInt(t[1]),startColumn:t[2]?parseInt(t[2]):1,endLineNumber:t[4]?parseInt(t[4]):void 0,endColumn:t[4]?t[5]?parseInt(t[5]):1:void 0},o=o.with({fragment:\"\"})),{selection:e,uri:o}}var $Y=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},jY=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const Js=qe(\"ILanguageFeatureDebounceService\");var kv;(function(o){const e=new WeakMap;let t=0;function i(n){let s=e.get(n);return s===void 0&&(s=++t,e.set(n,s)),s}o.of=i})(kv||(kv={}));class KY{constructor(e,t,i,n,s,r){this._logService=e,this._name=t,this._registry=i,this._default=n,this._min=s,this._max=r,this._cache=new bh(50,.7)}_key(e){return e.id+this._registry.all(e).reduce((t,i)=>p1(kv.of(i),t),0)}get(e){const t=this._key(e),i=this._cache.get(t);return i?qn(i.value,this._min,this._max):this.default()}update(e,t){const i=this._key(e);let n=this._cache.get(i);n||(n=new BZ(6),this._cache.set(i,n));const s=qn(n.update(t),this._min,this._max);return vE(e.uri,\"output\")||this._logService.trace(`[DEBOUNCE: ${this._name}] for ${e.uri.toString()} is ${s}ms`),s}_overall(){const e=new P5;for(const[,t]of this._cache)e.update(t.value);return e.value}default(){const e=this._overall()|0||this._default;return qn(e,this._min,this._max)}}let DL=class{constructor(e){this._logService=e,this._data=new Map}for(e,t,i){var n,s,r;const a=(n=i==null?void 0:i.min)!==null&&n!==void 0?n:50,l=(s=i==null?void 0:i.max)!==null&&s!==void 0?s:Math.pow(a,2),c=(r=i==null?void 0:i.key)!==null&&r!==void 0?r:void 0,d=`${kv.of(e)},${a}${c?\",\"+c:\"\"}`;let h=this._data.get(d);return h||(h=new KY(this._logService,t,e,this._overallAverage()|0||a*1.5,a,l),this._data.set(d,h)),h}_overallAverage(){const e=new P5;for(const t of this._data.values())e.update(t.default());return e.value}};DL=$Y([jY(0,Co)],DL);Xe(Js,DL,!0);var qY=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Cf=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},GY=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};let mg=class{constructor(e,t,i,n,s,r){this._editor=e,this._languageFeaturesService=t,this._commandService=n,this._notificationService=s,this._codeLensCache=r,this._disposables=new ee,this._localToDispose=new ee,this._lenses=[],this._oldCodeLensModels=new ee,this._provideCodeLensDebounce=i.for(t.codeLensProvider,\"CodeLensProvide\",{min:250}),this._resolveCodeLensesDebounce=i.for(t.codeLensProvider,\"CodeLensResolve\",{min:250,salt:\"resolve\"}),this._resolveCodeLensesScheduler=new ft(()=>this._resolveCodeLensesInViewport(),this._resolveCodeLensesDebounce.default()),this._disposables.add(this._editor.onDidChangeModel(()=>this._onModelChange())),this._disposables.add(this._editor.onDidChangeModelLanguage(()=>this._onModelChange())),this._disposables.add(this._editor.onDidChangeConfiguration(a=>{(a.hasChanged(46)||a.hasChanged(16)||a.hasChanged(15))&&this._updateLensStyle(),a.hasChanged(14)&&this._onModelChange()})),this._disposables.add(t.codeLensProvider.onDidChange(this._onModelChange,this)),this._onModelChange(),this._styleClassName=\"_\"+_E(this._editor.getId()).toString(16),this._styleElement=qs(Dp(this._editor.getContainerDomNode())?this._editor.getContainerDomNode():void 0),this._updateLensStyle()}dispose(){var e;this._localDispose(),this._disposables.dispose(),this._oldCodeLensModels.dispose(),(e=this._currentCodeLensModel)===null||e===void 0||e.dispose(),this._styleElement.remove()}_getLayoutInfo(){const e=Math.max(1.3,this._editor.getOption(61)/this._editor.getOption(48));let t=this._editor.getOption(16);return(!t||t<5)&&(t=this._editor.getOption(48)*.9|0),{fontSize:t,codeLensHeight:t*e|0}}_updateLensStyle(){const{codeLensHeight:e,fontSize:t}=this._getLayoutInfo(),i=this._editor.getOption(15),n=this._editor.getOption(46),s=`--codelens-font-family${this._styleClassName}`,r=`--codelens-font-features${this._styleClassName}`;let a=`\n\t\t.monaco-editor .codelens-decoration.${this._styleClassName} { line-height: ${e}px; font-size: ${t}px; padding-right: ${Math.round(t*.5)}px; font-feature-settings: var(${r}) }\n\t\t.monaco-editor .codelens-decoration.${this._styleClassName} span.codicon { line-height: ${e}px; font-size: ${t}px; }\n\t\t`;i&&(a+=`.monaco-editor .codelens-decoration.${this._styleClassName} { font-family: var(${s}), ${ns.fontFamily}}`),this._styleElement.textContent=a,this._editor.getContainerDomNode().style.setProperty(s,i!=null?i:\"inherit\"),this._editor.getContainerDomNode().style.setProperty(r,n.fontFeatureSettings),this._editor.changeViewZones(l=>{for(const c of this._lenses)c.updateHeight(e,l)})}_localDispose(){var e,t,i;(e=this._getCodeLensModelPromise)===null||e===void 0||e.cancel(),this._getCodeLensModelPromise=void 0,(t=this._resolveCodeLensesPromise)===null||t===void 0||t.cancel(),this._resolveCodeLensesPromise=void 0,this._localToDispose.clear(),this._oldCodeLensModels.clear(),(i=this._currentCodeLensModel)===null||i===void 0||i.dispose()}_onModelChange(){this._localDispose();const e=this._editor.getModel();if(!e||!this._editor.getOption(14))return;const t=this._codeLensCache.get(e);if(t&&this._renderCodeLensSymbols(t),!this._languageFeaturesService.codeLensProvider.has(e)){t&&this._localToDispose.add(Hd(()=>{const n=this._codeLensCache.get(e);t===n&&(this._codeLensCache.delete(e),this._onModelChange())},30*1e3));return}for(const n of this._languageFeaturesService.codeLensProvider.all(e))if(typeof n.onDidChange==\"function\"){const s=n.onDidChange(()=>i.schedule());this._localToDispose.add(s)}const i=new ft(()=>{var n;const s=Date.now();(n=this._getCodeLensModelPromise)===null||n===void 0||n.cancel(),this._getCodeLensModelPromise=Ti(r=>Y5(this._languageFeaturesService.codeLensProvider,e,r)),this._getCodeLensModelPromise.then(r=>{this._currentCodeLensModel&&this._oldCodeLensModels.add(this._currentCodeLensModel),this._currentCodeLensModel=r,this._codeLensCache.put(e,r);const a=this._provideCodeLensDebounce.update(e,Date.now()-s);i.delay=a,this._renderCodeLensSymbols(r),this._resolveCodeLensesInViewportSoon()},Ee)},this._provideCodeLensDebounce.get(e));this._localToDispose.add(i),this._localToDispose.add(ze(()=>this._resolveCodeLensesScheduler.cancel())),this._localToDispose.add(this._editor.onDidChangeModelContent(()=>{this._editor.changeDecorations(n=>{this._editor.changeViewZones(s=>{const r=[];let a=-1;this._lenses.forEach(c=>{!c.isValid()||a===c.getLineNumber()?r.push(c):(c.update(s),a=c.getLineNumber())});const l=new mS;r.forEach(c=>{c.dispose(l,s),this._lenses.splice(this._lenses.indexOf(c),1)}),l.commit(n)})}),i.schedule()})),this._localToDispose.add(this._editor.onDidFocusEditorWidget(()=>{i.schedule()})),this._localToDispose.add(this._editor.onDidScrollChange(n=>{n.scrollTopChanged&&this._lenses.length>0&&this._resolveCodeLensesInViewportSoon()})),this._localToDispose.add(this._editor.onDidLayoutChange(()=>{this._resolveCodeLensesInViewportSoon()})),this._localToDispose.add(ze(()=>{if(this._editor.getModel()){const n=uc.capture(this._editor);this._editor.changeDecorations(s=>{this._editor.changeViewZones(r=>{this._disposeAllLenses(s,r)})}),n.restore(this._editor)}else this._disposeAllLenses(void 0,void 0)})),this._localToDispose.add(this._editor.onMouseDown(n=>{if(n.target.type!==9)return;let s=n.target.element;if((s==null?void 0:s.tagName)===\"SPAN\"&&(s=s.parentElement),(s==null?void 0:s.tagName)===\"A\")for(const r of this._lenses){const a=r.getCommand(s);if(a){this._commandService.executeCommand(a.id,...a.arguments||[]).catch(l=>this._notificationService.error(l));break}}})),i.schedule()}_disposeAllLenses(e,t){const i=new mS;for(const n of this._lenses)n.dispose(i,t);e&&i.commit(e),this._lenses.length=0}_renderCodeLensSymbols(e){if(!this._editor.hasModel())return;const t=this._editor.getModel().getLineCount(),i=[];let n;for(const a of e.lenses){const l=a.symbol.range.startLineNumber;l<1||l>t||(n&&n[n.length-1].symbol.range.startLineNumber===l?n.push(a):(n=[a],i.push(n)))}const s=uc.capture(this._editor),r=this._getLayoutInfo();this._editor.changeDecorations(a=>{this._editor.changeViewZones(l=>{const c=new mS;let d=0,h=0;for(;h<i.length&&d<this._lenses.length;){const u=i[h][0].symbol.range.startLineNumber,g=this._lenses[d].getLineNumber();g<u?(this._lenses[d].dispose(c,l),this._lenses.splice(d,1)):g===u?(this._lenses[d].updateCodeLensSymbols(i[h],c),h++,d++):(this._lenses.splice(d,0,new bM(i[h],this._editor,this._styleClassName,c,l,r.codeLensHeight,()=>this._resolveCodeLensesInViewportSoon())),d++,h++)}for(;d<this._lenses.length;)this._lenses[d].dispose(c,l),this._lenses.splice(d,1);for(;h<i.length;)this._lenses.push(new bM(i[h],this._editor,this._styleClassName,c,l,r.codeLensHeight,()=>this._resolveCodeLensesInViewportSoon())),h++;c.commit(a)})}),s.restore(this._editor)}_resolveCodeLensesInViewportSoon(){this._editor.getModel()&&this._resolveCodeLensesScheduler.schedule()}_resolveCodeLensesInViewport(){var e;(e=this._resolveCodeLensesPromise)===null||e===void 0||e.cancel(),this._resolveCodeLensesPromise=void 0;const t=this._editor.getModel();if(!t)return;const i=[],n=[];if(this._lenses.forEach(a=>{const l=a.computeIfNecessary(t);l&&(i.push(l),n.push(a))}),i.length===0)return;const s=Date.now(),r=Ti(a=>{const l=i.map((c,d)=>{const h=new Array(c.length),u=c.map((g,f)=>!g.symbol.command&&typeof g.provider.resolveCodeLens==\"function\"?Promise.resolve(g.provider.resolveCodeLens(t,g.symbol,a)).then(_=>{h[f]=_},Ai):(h[f]=g.symbol,Promise.resolve(void 0)));return Promise.all(u).then(()=>{!a.isCancellationRequested&&!n[d].isDisposed()&&n[d].updateCommands(h)})});return Promise.all(l)});this._resolveCodeLensesPromise=r,this._resolveCodeLensesPromise.then(()=>{const a=this._resolveCodeLensesDebounce.update(t,Date.now()-s);this._resolveCodeLensesScheduler.delay=a,this._currentCodeLensModel&&this._codeLensCache.put(t,this._currentCodeLensModel),this._oldCodeLensModels.clear(),r===this._resolveCodeLensesPromise&&(this._resolveCodeLensesPromise=void 0)},a=>{Ee(a),r===this._resolveCodeLensesPromise&&(this._resolveCodeLensesPromise=void 0)})}getModel(){return this._currentCodeLensModel}};mg.ID=\"css.editor.codeLens\";mg=qY([Cf(1,ue),Cf(2,Js),Cf(3,Ci),Cf(4,gi),Cf(5,X5)],mg);rt(mg.ID,mg);te(class extends he{constructor(){super({id:\"codelens.showLensesInCurrentLine\",precondition:T.hasCodeLensProvider,label:p(\"showLensOnLine\",\"Show CodeLens Commands For Current Line\"),alias:\"Show CodeLens Commands For Current Line\"})}run(e,t){return GY(this,void 0,void 0,function*(){if(!t.hasModel())return;const i=e.get(c_),n=e.get(Ci),s=e.get(gi),r=t.getSelection().positionLineNumber,a=t.getContribution(mg.ID);if(!a)return;const l=a.getModel();if(!l)return;const c=[];for(const h of l.lenses)h.symbol.command&&h.symbol.range.startLineNumber===r&&c.push({label:h.symbol.command.title,command:h.symbol.command});if(c.length===0)return;const d=yield i.pick(c,{canPickMany:!1});if(!!d){if(l.isDisposed)return yield n.executeCommand(this.id);try{yield n.executeCommand(d.command.id,...d.command.arguments||[])}catch(h){s.error(h)}}})}});function ZY(o,e,t){const i=[],s=o.ordered(e).reverse().map(r=>Promise.resolve(r.provideDocumentColors(e,t)).then(a=>{if(Array.isArray(a))for(const l of a)i.push({colorInfo:l,provider:r})}));return Promise.all(s).then(()=>i)}function wM(o,e,t,i){return Promise.resolve(t.provideColorPresentations(o,e,i))}Ye.registerCommand(\"_executeDocumentColorProvider\",function(o,...e){const[t]=e;if(!(t instanceof me))throw zo();const{colorProvider:i}=o.get(ue),n=o.get(Bt).getModel(t);if(!n)throw zo();const s=[],a=i.ordered(n).reverse().map(l=>Promise.resolve(l.provideDocumentColors(n,We.None)).then(c=>{if(Array.isArray(c))for(const d of c)s.push({range:d.range,color:[d.color.red,d.color.green,d.color.blue,d.color.alpha]})}));return Promise.all(a).then(()=>s)});Ye.registerCommand(\"_executeColorPresentationProvider\",function(o,...e){const[t,i]=e,{uri:n,range:s}=i;if(!(n instanceof me)||!Array.isArray(t)||t.length!==4||!L.isIRange(s))throw zo();const[r,a,l,c]=t,{colorProvider:d}=o.get(ue),h=o.get(Bt).getModel(n);if(!h)throw zo();const u={range:s,color:{red:r,green:a,blue:l,alpha:c}},g=[],_=d.ordered(h).reverse().map(b=>Promise.resolve(b.provideColorPresentations(h,u,We.None)).then(v=>{Array.isArray(v)&&g.push(...v)}));return Promise.all(_).then(()=>g)});var YY=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},_S=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},XY=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const J5=Object.create({}),QY=500;let Gd=class eF extends z{constructor(e,t,i,n){super(),this._editor=e,this._configurationService=t,this._languageFeaturesService=i,this._localToDispose=this._register(new ee),this._decorationsIds=[],this._colorDatas=new Map,this._colorDecoratorIds=this._editor.createDecorationsCollection(),this._ruleFactory=new Gm(this._editor),this._colorDecorationClassRefs=this._register(new ee),this._debounceInformation=n.for(i.colorProvider,\"Document Colors\",{min:eF.RECOMPUTE_TIME}),this._register(e.onDidChangeModel(()=>{this._isEnabled=this.isEnabled(),this.onModelChanged()})),this._register(e.onDidChangeModelLanguage(()=>this.onModelChanged())),this._register(i.colorProvider.onDidChange(()=>this.onModelChanged())),this._register(e.onDidChangeConfiguration(()=>{const s=this._isEnabled;this._isEnabled=this.isEnabled(),s!==this._isEnabled&&(this._isEnabled?this.onModelChanged():this.removeAllDecorations())})),this._timeoutTimer=null,this._computePromise=null,this._isEnabled=this.isEnabled(),this.onModelChanged()}isEnabled(){const e=this._editor.getModel();if(!e)return!1;const t=e.getLanguageId(),i=this._configurationService.getValue(t);if(i&&typeof i==\"object\"){const n=i.colorDecorators;if(n&&n.enable!==void 0&&!n.enable)return n.enable}return this._editor.getOption(17)}static get(e){return e.getContribution(this.ID)}dispose(){this.stop(),this.removeAllDecorations(),super.dispose()}onModelChanged(){if(this.stop(),!this._isEnabled)return;const e=this._editor.getModel();!e||!this._languageFeaturesService.colorProvider.has(e)||(this._localToDispose.add(this._editor.onDidChangeModelContent(()=>{this._timeoutTimer||(this._timeoutTimer=new Is,this._timeoutTimer.cancelAndSet(()=>{this._timeoutTimer=null,this.beginCompute()},this._debounceInformation.get(e)))})),this.beginCompute())}beginCompute(){this._computePromise=Ti(e=>XY(this,void 0,void 0,function*(){const t=this._editor.getModel();if(!t)return Promise.resolve([]);const i=new Hn(!1),n=yield ZY(this._languageFeaturesService.colorProvider,t,e);return this._debounceInformation.update(t,i.elapsed()),n})),this._computePromise.then(e=>{this.updateDecorations(e),this.updateColorDecorators(e),this._computePromise=null},Ee)}stop(){this._timeoutTimer&&(this._timeoutTimer.cancel(),this._timeoutTimer=null),this._computePromise&&(this._computePromise.cancel(),this._computePromise=null),this._localToDispose.clear()}updateDecorations(e){const t=e.map(i=>({range:{startLineNumber:i.colorInfo.range.startLineNumber,startColumn:i.colorInfo.range.startColumn,endLineNumber:i.colorInfo.range.endLineNumber,endColumn:i.colorInfo.range.endColumn},options:Ie.EMPTY}));this._editor.changeDecorations(i=>{this._decorationsIds=i.deltaDecorations(this._decorationsIds,t),this._colorDatas=new Map,this._decorationsIds.forEach((n,s)=>this._colorDatas.set(n,e[s]))})}updateColorDecorators(e){this._colorDecorationClassRefs.clear();const t=[];for(let i=0;i<e.length&&t.length<QY;i++){const{red:n,green:s,blue:r,alpha:a}=e[i].colorInfo.color,l=new je(Math.round(n*255),Math.round(s*255),Math.round(r*255),a),c=`rgba(${l.r}, ${l.g}, ${l.b}, ${l.a})`,d=this._colorDecorationClassRefs.add(this._ruleFactory.createClassNameRef({backgroundColor:c}));t.push({range:{startLineNumber:e[i].colorInfo.range.startLineNumber,startColumn:e[i].colorInfo.range.startColumn,endLineNumber:e[i].colorInfo.range.endLineNumber,endColumn:e[i].colorInfo.range.endColumn},options:{description:\"colorDetector\",before:{content:VB,inlineClassName:`${d.className} colorpicker-color-decoration`,inlineClassNameAffectsLetterSpacing:!0,attachedData:J5}}})}this._colorDecoratorIds.set(t)}removeAllDecorations(){this._editor.removeDecorations(this._decorationsIds),this._decorationsIds=[],this._colorDecoratorIds.clear(),this._colorDecorationClassRefs.clear()}getColorData(e){const t=this._editor.getModel();if(!t)return null;const i=t.getDecorationsInRange(L.fromPositions(e,e)).filter(n=>this._colorDatas.has(n.id));return i.length===0?null:this._colorDatas.get(i[0].id)}isColorDecoration(e){return this._colorDecoratorIds.has(e)}};Gd.ID=\"editor.contrib.colorDetector\";Gd.RECOMPUTE_TIME=1e3;Gd=YY([_S(1,ot),_S(2,ue),_S(3,Js)],Gd);rt(Gd.ID,Gd);class JY{constructor(e,t,i){this.presentationIndex=i,this._onColorFlushed=new O,this.onColorFlushed=this._onColorFlushed.event,this._onDidChangeColor=new O,this.onDidChangeColor=this._onDidChangeColor.event,this._onDidChangePresentation=new O,this.onDidChangePresentation=this._onDidChangePresentation.event,this.originalColor=e,this._color=e,this._colorPresentations=t}get color(){return this._color}set color(e){this._color.equals(e)||(this._color=e,this._onDidChangeColor.fire(e))}get presentation(){return this.colorPresentations[this.presentationIndex]}get colorPresentations(){return this._colorPresentations}set colorPresentations(e){this._colorPresentations=e,this.presentationIndex>e.length-1&&(this.presentationIndex=0),this._onDidChangePresentation.fire(this.presentation)}selectNextColorPresentation(){this.presentationIndex=(this.presentationIndex+1)%this.colorPresentations.length,this.flushColor(),this._onDidChangePresentation.fire(this.presentation)}guessColorPresentation(e,t){for(let i=0;i<this.colorPresentations.length;i++)if(t.toLowerCase()===this.colorPresentations[i].label){this.presentationIndex=i,this._onDidChangePresentation.fire(this.presentation);break}}flushColor(){this._onColorFlushed.fire(this._color)}}const Wo=se;class eX extends z{constructor(e,t,i){super(),this.model=t,this.domNode=Wo(\".colorpicker-header\"),G(e,this.domNode),this.pickedColorNode=G(this.domNode,Wo(\".picked-color\"));const n=p(\"clickToToggleColorOptions\",\"Click to toggle color options (rgb/hsl/hex)\");this.pickedColorNode.setAttribute(\"title\",n);const s=G(this.domNode,Wo(\".original-color\"));s.style.backgroundColor=W.Format.CSS.format(this.model.originalColor)||\"\",this.backgroundColor=i.getColorTheme().getColor(rg)||W.white,this._register(Rt((r,a)=>{this.backgroundColor=r.getColor(rg)||W.white})),this._register(q(this.pickedColorNode,le.CLICK,()=>this.model.selectNextColorPresentation())),this._register(q(s,le.CLICK,()=>{this.model.color=this.model.originalColor,this.model.flushColor()})),this._register(t.onDidChangeColor(this.onDidChangeColor,this)),this._register(t.onDidChangePresentation(this.onDidChangePresentation,this)),this.pickedColorNode.style.backgroundColor=W.Format.CSS.format(t.color)||\"\",this.pickedColorNode.classList.toggle(\"light\",t.color.rgba.a<.5?this.backgroundColor.isLighter():t.color.isLighter()),this.onDidChangeColor(this.model.color)}onDidChangeColor(e){this.pickedColorNode.style.backgroundColor=W.Format.CSS.format(e)||\"\",this.pickedColorNode.classList.toggle(\"light\",e.rgba.a<.5?this.backgroundColor.isLighter():e.isLighter()),this.onDidChangePresentation()}onDidChangePresentation(){this.pickedColorNode.textContent=this.model.presentation?this.model.presentation.label:\"\",this.pickedColorNode.prepend(Wo(\".codicon.codicon-color-mode\"))}}class tX extends z{constructor(e,t,i){super(),this.model=t,this.pixelRatio=i,this.domNode=Wo(\".colorpicker-body\"),G(e,this.domNode),this.saturationBox=new iX(this.domNode,this.model,this.pixelRatio),this._register(this.saturationBox),this._register(this.saturationBox.onDidChange(this.onDidSaturationValueChange,this)),this._register(this.saturationBox.onColorFlushed(this.flushColor,this)),this.opacityStrip=new nX(this.domNode,this.model),this._register(this.opacityStrip),this._register(this.opacityStrip.onDidChange(this.onDidOpacityChange,this)),this._register(this.opacityStrip.onColorFlushed(this.flushColor,this)),this.hueStrip=new sX(this.domNode,this.model),this._register(this.hueStrip),this._register(this.hueStrip.onDidChange(this.onDidHueChange,this)),this._register(this.hueStrip.onColorFlushed(this.flushColor,this))}flushColor(){this.model.flushColor()}onDidSaturationValueChange({s:e,v:t}){const i=this.model.color.hsva;this.model.color=new W(new Nr(i.h,e,t,i.a))}onDidOpacityChange(e){const t=this.model.color.hsva;this.model.color=new W(new Nr(t.h,t.s,t.v,e))}onDidHueChange(e){const t=this.model.color.hsva,i=(1-e)*360;this.model.color=new W(new Nr(i===360?0:i,t.s,t.v,t.a))}layout(){this.saturationBox.layout(),this.opacityStrip.layout(),this.hueStrip.layout()}}class iX extends z{constructor(e,t,i){super(),this.model=t,this.pixelRatio=i,this._onDidChange=new O,this.onDidChange=this._onDidChange.event,this._onColorFlushed=new O,this.onColorFlushed=this._onColorFlushed.event,this.domNode=Wo(\".saturation-wrap\"),G(e,this.domNode),this.canvas=document.createElement(\"canvas\"),this.canvas.className=\"saturation-box\",G(this.domNode,this.canvas),this.selection=Wo(\".saturation-selection\"),G(this.domNode,this.selection),this.layout(),this._register(q(this.domNode,le.POINTER_DOWN,n=>this.onPointerDown(n))),this._register(this.model.onDidChangeColor(this.onDidChangeColor,this)),this.monitor=null}onPointerDown(e){if(!e.target||!(e.target instanceof Element))return;this.monitor=this._register(new Vg);const t=Qi(this.domNode);e.target!==this.selection&&this.onDidChangePosition(e.offsetX,e.offsetY),this.monitor.startMonitoring(e.target,e.pointerId,e.buttons,n=>this.onDidChangePosition(n.pageX-t.left,n.pageY-t.top),()=>null);const i=q(document,le.POINTER_UP,()=>{this._onColorFlushed.fire(),i.dispose(),this.monitor&&(this.monitor.stopMonitoring(!0),this.monitor=null)},!0)}onDidChangePosition(e,t){const i=Math.max(0,Math.min(1,e/this.width)),n=Math.max(0,Math.min(1,1-t/this.height));this.paintSelection(i,n),this._onDidChange.fire({s:i,v:n})}layout(){this.width=this.domNode.offsetWidth,this.height=this.domNode.offsetHeight,this.canvas.width=this.width*this.pixelRatio,this.canvas.height=this.height*this.pixelRatio,this.paint();const e=this.model.color.hsva;this.paintSelection(e.s,e.v)}paint(){const e=this.model.color.hsva,t=new W(new Nr(e.h,1,1,1)),i=this.canvas.getContext(\"2d\"),n=i.createLinearGradient(0,0,this.canvas.width,0);n.addColorStop(0,\"rgba(255, 255, 255, 1)\"),n.addColorStop(.5,\"rgba(255, 255, 255, 0.5)\"),n.addColorStop(1,\"rgba(255, 255, 255, 0)\");const s=i.createLinearGradient(0,0,0,this.canvas.height);s.addColorStop(0,\"rgba(0, 0, 0, 0)\"),s.addColorStop(1,\"rgba(0, 0, 0, 1)\"),i.rect(0,0,this.canvas.width,this.canvas.height),i.fillStyle=W.Format.CSS.format(t),i.fill(),i.fillStyle=n,i.fill(),i.fillStyle=s,i.fill()}paintSelection(e,t){this.selection.style.left=`${e*this.width}px`,this.selection.style.top=`${this.height-t*this.height}px`}onDidChangeColor(){this.monitor&&this.monitor.isMonitoring()||this.paint()}}class tF extends z{constructor(e,t){super(),this.model=t,this._onDidChange=new O,this.onDidChange=this._onDidChange.event,this._onColorFlushed=new O,this.onColorFlushed=this._onColorFlushed.event,this.domNode=G(e,Wo(\".strip\")),this.overlay=G(this.domNode,Wo(\".overlay\")),this.slider=G(this.domNode,Wo(\".slider\")),this.slider.style.top=\"0px\",this._register(q(this.domNode,le.POINTER_DOWN,i=>this.onPointerDown(i))),this.layout()}layout(){this.height=this.domNode.offsetHeight-this.slider.offsetHeight;const e=this.getValue(this.model.color);this.updateSliderPosition(e)}onPointerDown(e){if(!e.target||!(e.target instanceof Element))return;const t=this._register(new Vg),i=Qi(this.domNode);this.domNode.classList.add(\"grabbing\"),e.target!==this.slider&&this.onDidChangeTop(e.offsetY),t.startMonitoring(e.target,e.pointerId,e.buttons,s=>this.onDidChangeTop(s.pageY-i.top),()=>null);const n=q(document,le.POINTER_UP,()=>{this._onColorFlushed.fire(),n.dispose(),t.stopMonitoring(!0),this.domNode.classList.remove(\"grabbing\")},!0)}onDidChangeTop(e){const t=Math.max(0,Math.min(1,1-e/this.height));this.updateSliderPosition(t),this._onDidChange.fire(t)}updateSliderPosition(e){this.slider.style.top=`${(1-e)*this.height}px`}}class nX extends tF{constructor(e,t){super(e,t),this.domNode.classList.add(\"opacity-strip\"),this._register(t.onDidChangeColor(this.onDidChangeColor,this)),this.onDidChangeColor(this.model.color)}onDidChangeColor(e){const{r:t,g:i,b:n}=e.rgba,s=new W(new je(t,i,n,1)),r=new W(new je(t,i,n,0));this.overlay.style.background=`linear-gradient(to bottom, ${s} 0%, ${r} 100%)`}getValue(e){return e.hsva.a}}class sX extends tF{constructor(e,t){super(e,t),this.domNode.classList.add(\"hue-strip\")}getValue(e){return 1-e.hsva.h/360}}class oX extends tr{constructor(e,t,i,n){super(),this.model=t,this.pixelRatio=i,this._register(Xu.onDidChange(()=>this.layout()));const s=Wo(\".colorpicker-widget\");e.appendChild(s);const r=new eX(s,this.model,n);this.body=new tX(s,this.model,this.pixelRatio),this._register(r),this._register(this.body)}layout(){this.body.layout()}}var rX=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},aX=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},SM=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class lX{constructor(e,t,i,n){this.owner=e,this.range=t,this.model=i,this.provider=n,this.forceShowAtRange=!0}isValidForHoverAnchor(e){return e.type===1&&this.range.startColumn<=e.range.startColumn&&this.range.endColumn>=e.range.endColumn}}let kL=class{constructor(e,t){this._editor=e,this._themeService=t,this.hoverOrdinal=1}computeSync(e,t){return[]}computeAsync(e,t,i){return ni.fromPromise(this._computeAsync(e,t,i))}_computeAsync(e,t,i){return SM(this,void 0,void 0,function*(){if(!this._editor.hasModel())return[];const n=Gd.get(this._editor);if(!n)return[];for(const s of t){if(!n.isColorDecoration(s))continue;const r=n.getColorData(s.range.getStartPosition());if(r)return[yield this._createColorHover(this._editor.getModel(),r.colorInfo,r.provider)]}return[]})}_createColorHover(e,t,i){return SM(this,void 0,void 0,function*(){const n=e.getValueInRange(t.range),{red:s,green:r,blue:a,alpha:l}=t.color,c=new je(Math.round(s*255),Math.round(r*255),Math.round(a*255),l),d=new W(c),h=yield wM(e,t,i,We.None),u=new JY(d,[],0);return u.colorPresentations=h||[],u.guessColorPresentation(d,n),new lX(this,L.lift(t.range),u,i)})}renderHoverParts(e,t){if(t.length===0||!this._editor.hasModel())return z.None;const i=new ee,n=t[0],s=this._editor.getModel(),r=n.model,a=i.add(new oX(e.fragment,r,this._editor.getOption(131),this._themeService));e.setColorPicker(a);let l=new L(n.range.startLineNumber,n.range.startColumn,n.range.endLineNumber,n.range.endColumn);const c=()=>{let h,u;if(r.presentation.textEdit){h=[r.presentation.textEdit],u=new L(r.presentation.textEdit.range.startLineNumber,r.presentation.textEdit.range.startColumn,r.presentation.textEdit.range.endLineNumber,r.presentation.textEdit.range.endColumn);const g=this._editor.getModel()._setTrackedRange(null,u,3);this._editor.pushUndoStop(),this._editor.executeEdits(\"colorpicker\",h),u=this._editor.getModel()._getTrackedRange(g)||u}else h=[{range:l,text:r.presentation.label,forceMoveMarkers:!1}],u=l.setEndPosition(l.endLineNumber,l.startColumn+r.presentation.label.length),this._editor.pushUndoStop(),this._editor.executeEdits(\"colorpicker\",h);r.presentation.additionalTextEdits&&(h=[...r.presentation.additionalTextEdits],this._editor.executeEdits(\"colorpicker\",h),e.hide()),this._editor.pushUndoStop(),l=u},d=h=>wM(s,{range:l,color:{red:h.rgba.r/255,green:h.rgba.g/255,blue:h.rgba.b/255,alpha:h.rgba.a}},n.provider,We.None).then(u=>{r.colorPresentations=u||[]});return i.add(r.onColorFlushed(h=>{d(h).then(c)})),i.add(r.onDidChangeColor(d)),i}};kL=rX([aX(1,vt)],kL);function xL(o,e){return!!o[e]}class bS{constructor(e,t){this.target=e.target,this.hasTriggerModifier=xL(e.event,t.triggerModifier),this.hasSideBySideModifier=xL(e.event,t.triggerSideBySideModifier),this.isNoneOrSingleMouseDown=e.event.detail<=1}}class yM{constructor(e,t){this.keyCodeIsTriggerKey=e.keyCode===t.triggerKey,this.keyCodeIsSideBySideKey=e.keyCode===t.triggerSideBySideKey,this.hasTriggerModifier=xL(e,t.triggerModifier)}}class gb{constructor(e,t,i,n){this.triggerKey=e,this.triggerModifier=t,this.triggerSideBySideKey=i,this.triggerSideBySideModifier=n}equals(e){return this.triggerKey===e.triggerKey&&this.triggerModifier===e.triggerModifier&&this.triggerSideBySideKey===e.triggerSideBySideKey&&this.triggerSideBySideModifier===e.triggerSideBySideModifier}}function LM(o){return o===\"altKey\"?Ze?new gb(57,\"metaKey\",6,\"altKey\"):new gb(5,\"ctrlKey\",6,\"altKey\"):Ze?new gb(6,\"altKey\",57,\"metaKey\"):new gb(6,\"altKey\",5,\"ctrlKey\")}class CE extends z{constructor(e){super(),this._onMouseMoveOrRelevantKeyDown=this._register(new O),this.onMouseMoveOrRelevantKeyDown=this._onMouseMoveOrRelevantKeyDown.event,this._onExecute=this._register(new O),this.onExecute=this._onExecute.event,this._onCancel=this._register(new O),this.onCancel=this._onCancel.event,this._editor=e,this._opts=LM(this._editor.getOption(72)),this._lastMouseMoveEvent=null,this._hasTriggerKeyOnMouseDown=!1,this._lineNumberOnMouseDown=0,this._register(this._editor.onDidChangeConfiguration(t=>{if(t.hasChanged(72)){const i=LM(this._editor.getOption(72));if(this._opts.equals(i))return;this._opts=i,this._lastMouseMoveEvent=null,this._hasTriggerKeyOnMouseDown=!1,this._lineNumberOnMouseDown=0,this._onCancel.fire()}})),this._register(this._editor.onMouseMove(t=>this._onEditorMouseMove(new bS(t,this._opts)))),this._register(this._editor.onMouseDown(t=>this._onEditorMouseDown(new bS(t,this._opts)))),this._register(this._editor.onMouseUp(t=>this._onEditorMouseUp(new bS(t,this._opts)))),this._register(this._editor.onKeyDown(t=>this._onEditorKeyDown(new yM(t,this._opts)))),this._register(this._editor.onKeyUp(t=>this._onEditorKeyUp(new yM(t,this._opts)))),this._register(this._editor.onMouseDrag(()=>this._resetHandler())),this._register(this._editor.onDidChangeCursorSelection(t=>this._onDidChangeCursorSelection(t))),this._register(this._editor.onDidChangeModel(t=>this._resetHandler())),this._register(this._editor.onDidChangeModelContent(()=>this._resetHandler())),this._register(this._editor.onDidScrollChange(t=>{(t.scrollTopChanged||t.scrollLeftChanged)&&this._resetHandler()}))}_onDidChangeCursorSelection(e){e.selection&&e.selection.startColumn!==e.selection.endColumn&&this._resetHandler()}_onEditorMouseMove(e){this._lastMouseMoveEvent=e,this._onMouseMoveOrRelevantKeyDown.fire([e,null])}_onEditorMouseDown(e){this._hasTriggerKeyOnMouseDown=e.hasTriggerModifier,this._lineNumberOnMouseDown=e.target.position?e.target.position.lineNumber:0}_onEditorMouseUp(e){const t=e.target.position?e.target.position.lineNumber:0;this._hasTriggerKeyOnMouseDown&&this._lineNumberOnMouseDown&&this._lineNumberOnMouseDown===t&&this._onExecute.fire(e)}_onEditorKeyDown(e){this._lastMouseMoveEvent&&(e.keyCodeIsTriggerKey||e.keyCodeIsSideBySideKey&&e.hasTriggerModifier)?this._onMouseMoveOrRelevantKeyDown.fire([this._lastMouseMoveEvent,e]):e.hasTriggerModifier&&this._onCancel.fire()}_onEditorKeyUp(e){e.keyCodeIsTriggerKey&&this._onCancel.fire()}_resetHandler(){this._lastMouseMoveEvent=null,this._hasTriggerKeyOnMouseDown=!1,this._onCancel.fire()}}var cX=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},ga=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let Zd=class extends fg{constructor(e,t,i,n,s,r,a,l,c,d,h,u){super(e,Object.assign(Object.assign({},i.getRawOptions()),{overflowWidgetsDomNode:i.getOverflowWidgetsDomNode()}),{},n,s,r,a,l,c,d,h,u),this._parentEditor=i,this._overwriteOptions=t,super.updateOptions(this._overwriteOptions),this._register(i.onDidChangeConfiguration(g=>this._onParentConfigurationChanged(g)))}getParentEditor(){return this._parentEditor}_onParentConfigurationChanged(e){super.updateOptions(this._parentEditor.getRawOptions()),super.updateOptions(this._overwriteOptions)}updateOptions(e){ea(this._overwriteOptions,e,!0),super.updateOptions(this._overwriteOptions)}};Zd=cX([ga(3,Re),ga(4,dt),ga(5,Ci),ga(6,xe),ga(7,vt),ga(8,gi),ga(9,ll),ga(10,ti),ga(11,ue)],Zd);class wE{constructor(e){this._prefix=e,this._lastId=0}nextId(){return this._prefix+ ++this._lastId}}const iF=new wE(\"id#\");const DM=new W(new je(0,122,204)),dX={showArrow:!0,showFrame:!0,className:\"\",frameColor:DM,arrowColor:DM,keepEditorSelection:!1},hX=\"vs.editor.contrib.zoneWidget\";class uX{constructor(e,t,i,n,s,r){this.id=\"\",this.domNode=e,this.afterLineNumber=t,this.afterColumn=i,this.heightInLines=n,this._onDomNodeTop=s,this._onComputedHeight=r}onDomNodeTop(e){this._onDomNodeTop(e)}onComputedHeight(e){this._onComputedHeight(e)}}class gX{constructor(e,t){this._id=e,this._domNode=t}getId(){return this._id}getDomNode(){return this._domNode}getPosition(){return null}}class v1{constructor(e){this._editor=e,this._ruleName=v1._IdGenerator.nextId(),this._decorations=this._editor.createDecorationsCollection(),this._color=null,this._height=-1}dispose(){this.hide(),dT(this._ruleName)}set color(e){this._color!==e&&(this._color=e,this._updateStyle())}set height(e){this._height!==e&&(this._height=e,this._updateStyle())}_updateStyle(){dT(this._ruleName),yy(`.monaco-editor ${this._ruleName}`,`border-style: solid; border-color: transparent; border-bottom-color: ${this._color}; border-width: ${this._height}px; bottom: -${this._height}px; margin-left: -${this._height}px; `)}show(e){e.column===1&&(e={lineNumber:e.lineNumber,column:2}),this._decorations.set([{range:L.fromPositions(e),options:{description:\"zone-widget-arrow\",className:this._ruleName,stickiness:1}}])}hide(){this._decorations.clear()}}v1._IdGenerator=new wE(\".arrow-decoration-\");class fX{constructor(e,t={}){this._arrow=null,this._overlayWidget=null,this._resizeSash=null,this._viewZone=null,this._disposables=new ee,this.container=null,this._isShowing=!1,this.editor=e,this._positionMarkerId=this.editor.createDecorationsCollection(),this.options=ya(t),ea(this.options,dX,!1),this.domNode=document.createElement(\"div\"),this.options.isAccessible||(this.domNode.setAttribute(\"aria-hidden\",\"true\"),this.domNode.setAttribute(\"role\",\"presentation\")),this._disposables.add(this.editor.onDidLayoutChange(i=>{const n=this._getWidth(i);this.domNode.style.width=n+\"px\",this.domNode.style.left=this._getLeft(i)+\"px\",this._onWidth(n)}))}dispose(){this._overlayWidget&&(this.editor.removeOverlayWidget(this._overlayWidget),this._overlayWidget=null),this._viewZone&&this.editor.changeViewZones(e=>{this._viewZone&&e.removeZone(this._viewZone.id),this._viewZone=null}),this._positionMarkerId.clear(),this._disposables.dispose()}create(){this.domNode.classList.add(\"zone-widget\"),this.options.className&&this.domNode.classList.add(this.options.className),this.container=document.createElement(\"div\"),this.container.classList.add(\"zone-widget-container\"),this.domNode.appendChild(this.container),this.options.showArrow&&(this._arrow=new v1(this.editor),this._disposables.add(this._arrow)),this._fillContainer(this.container),this._initSash(),this._applyStyles()}style(e){e.frameColor&&(this.options.frameColor=e.frameColor),e.arrowColor&&(this.options.arrowColor=e.arrowColor),this._applyStyles()}_applyStyles(){if(this.container&&this.options.frameColor){const e=this.options.frameColor.toString();this.container.style.borderTopColor=e,this.container.style.borderBottomColor=e}if(this._arrow&&this.options.arrowColor){const e=this.options.arrowColor.toString();this._arrow.color=e}}_getWidth(e){return e.width-e.minimap.minimapWidth-e.verticalScrollbarWidth}_getLeft(e){return e.minimap.minimapWidth>0&&e.minimap.minimapLeft===0?e.minimap.minimapWidth:0}_onViewZoneTop(e){this.domNode.style.top=e+\"px\"}_onViewZoneHeight(e){if(this.domNode.style.height=`${e}px`,this.container){const t=e-this._decoratingElementsHeight();this.container.style.height=`${t}px`;const i=this.editor.getLayoutInfo();this._doLayout(t,this._getWidth(i))}this._resizeSash&&this._resizeSash.layout()}get position(){const e=this._positionMarkerId.getRange(0);if(!!e)return e.getStartPosition()}show(e,t){const i=L.isIRange(e)?L.lift(e):L.fromPositions(e);this._isShowing=!0,this._showImpl(i,t),this._isShowing=!1,this._positionMarkerId.set([{range:i,options:Ie.EMPTY}])}hide(){this._viewZone&&(this.editor.changeViewZones(e=>{this._viewZone&&e.removeZone(this._viewZone.id)}),this._viewZone=null),this._overlayWidget&&(this.editor.removeOverlayWidget(this._overlayWidget),this._overlayWidget=null),this._arrow&&this._arrow.hide()}_decoratingElementsHeight(){const e=this.editor.getOption(61);let t=0;if(this.options.showArrow){const i=Math.round(e/3);t+=2*i}if(this.options.showFrame){const i=Math.round(e/9);t+=2*i}return t}_showImpl(e,t){const i=e.getStartPosition(),n=this.editor.getLayoutInfo(),s=this._getWidth(n);this.domNode.style.width=`${s}px`,this.domNode.style.left=this._getLeft(n)+\"px\";const r=document.createElement(\"div\");r.style.overflow=\"hidden\";const a=this.editor.getOption(61),l=Math.max(12,this.editor.getLayoutInfo().height/a*.8);t=Math.min(t,l);let c=0,d=0;if(this._arrow&&this.options.showArrow&&(c=Math.round(a/3),this._arrow.height=c,this._arrow.show(i)),this.options.showFrame&&(d=Math.round(a/9)),this.editor.changeViewZones(g=>{this._viewZone&&g.removeZone(this._viewZone.id),this._overlayWidget&&(this.editor.removeOverlayWidget(this._overlayWidget),this._overlayWidget=null),this.domNode.style.top=\"-1000px\",this._viewZone=new uX(r,i.lineNumber,i.column,t,f=>this._onViewZoneTop(f),f=>this._onViewZoneHeight(f)),this._viewZone.id=g.addZone(this._viewZone),this._overlayWidget=new gX(hX+this._viewZone.id,this.domNode),this.editor.addOverlayWidget(this._overlayWidget)}),this.container&&this.options.showFrame){const g=this.options.frameWidth?this.options.frameWidth:d;this.container.style.borderTopWidth=g+\"px\",this.container.style.borderBottomWidth=g+\"px\"}const h=t*a-this._decoratingElementsHeight();this.container&&(this.container.style.top=c+\"px\",this.container.style.height=h+\"px\",this.container.style.overflow=\"hidden\"),this._doLayout(h,s),this.options.keepEditorSelection||this.editor.setSelection(e);const u=this.editor.getModel();if(u){const g=e.endLineNumber+1;g<=u.getLineCount()?this.revealLine(g,!1):this.revealLine(u.getLineCount(),!0)}}revealLine(e,t){t?this.editor.revealLineInCenter(e,0):this.editor.revealLine(e,0)}setCssClass(e,t){!this.container||(t&&this.container.classList.remove(t),this.container.classList.add(e))}_onWidth(e){}_doLayout(e,t){}_relayout(e){this._viewZone&&this._viewZone.heightInLines!==e&&this.editor.changeViewZones(t=>{this._viewZone&&(this._viewZone.heightInLines=e,t.layoutZone(this._viewZone.id))})}_initSash(){if(this._resizeSash)return;this._resizeSash=this._disposables.add(new Zi(this.domNode,this,{orientation:1})),this.options.isResizeable||(this._resizeSash.state=0);let e;this._disposables.add(this._resizeSash.onDidStart(t=>{this._viewZone&&(e={startY:t.startY,heightInLines:this._viewZone.heightInLines})})),this._disposables.add(this._resizeSash.onDidEnd(()=>{e=void 0})),this._disposables.add(this._resizeSash.onDidChange(t=>{if(e){const i=(t.currentY-e.startY)/this.editor.getOption(61),n=i<0?Math.ceil(i):Math.floor(i),s=e.heightInLines+n;s>5&&s<35&&this._relayout(s)}}))}getHorizontalSashLeft(){return 0}getHorizontalSashTop(){return(this.domNode.style.height===null?0:parseInt(this.domNode.style.height))-this._decoratingElementsHeight()/2}getHorizontalSashWidth(){const e=this.editor.getLayoutInfo();return e.width-e.minimap.minimapWidth}}class pX extends Ju{constructor(e,t){super(),this._onDidChangeVisibility=this._register(new O),this.onDidChangeVisibility=this._onDidChangeVisibility.event,this._element=G(e,se(\".monaco-dropdown\")),this._label=G(this._element,se(\".dropdown-label\"));let i=t.labelRenderer;i||(i=s=>(s.textContent=t.label||\"\",null));for(const s of[le.CLICK,le.MOUSE_DOWN,kt.Tap])this._register(q(this.element,s,r=>ct.stop(r,!0)));for(const s of[le.MOUSE_DOWN,kt.Tap])this._register(q(this._label,s,r=>{r instanceof MouseEvent&&(r.detail>1||r.button!==0)||(this.visible?this.hide():this.show())}));this._register(q(this._label,le.KEY_UP,s=>{const r=new Mt(s);(r.equals(3)||r.equals(10))&&(ct.stop(s,!0),this.visible?this.hide():this.show())}));const n=i(this._label);n&&this._register(n),this._register(ut.addTarget(this._label))}get element(){return this._element}show(){this.visible||(this.visible=!0,this._onDidChangeVisibility.fire(!0))}hide(){this.visible&&(this.visible=!1,this._onDidChangeVisibility.fire(!1))}dispose(){super.dispose(),this.hide(),this.boxContainer&&(this.boxContainer.remove(),this.boxContainer=void 0),this.contents&&(this.contents.remove(),this.contents=void 0),this._label&&(this._label.remove(),this._label=void 0)}}class mX extends pX{constructor(e,t){super(e,t),this._actions=[],this._contextMenuProvider=t.contextMenuProvider,this.actions=t.actions||[],this.actionProvider=t.actionProvider,this.menuClassName=t.menuClassName||\"\",this.menuAsChild=!!t.menuAsChild}set menuOptions(e){this._menuOptions=e}get menuOptions(){return this._menuOptions}get actions(){return this.actionProvider?this.actionProvider.getActions():this._actions}set actions(e){this._actions=e}show(){super.show(),this.element.classList.add(\"active\"),this._contextMenuProvider.showContextMenu({getAnchor:()=>this.element,getActions:()=>this.actions,getActionsContext:()=>this.menuOptions?this.menuOptions.context:null,getActionViewItem:e=>this.menuOptions&&this.menuOptions.actionViewItemProvider?this.menuOptions.actionViewItemProvider(e):void 0,getKeyBinding:e=>this.menuOptions&&this.menuOptions.getKeyBinding?this.menuOptions.getKeyBinding(e):void 0,getMenuClassName:()=>this.menuClassName,onHide:()=>this.onHide(),actionRunner:this.menuOptions?this.menuOptions.actionRunner:void 0,anchorAlignment:this.menuOptions?this.menuOptions.anchorAlignment:0,domForShadowRoot:this.menuAsChild?this.element:void 0})}hide(){super.hide()}onHide(){this.hide(),this.element.classList.remove(\"active\")}}class nF extends wr{constructor(e,t,i,n=Object.create(null)){super(null,e,n),this.actionItem=null,this._onDidChangeVisibility=this._register(new O),this.menuActionsOrProvider=t,this.contextMenuProvider=i,this.options=n,this.options.actionRunner&&(this.actionRunner=this.options.actionRunner)}render(e){this.actionItem=e;const t=s=>{this.element=G(s,se(\"a.action-label\"));let r=[];return typeof this.options.classNames==\"string\"?r=this.options.classNames.split(/\\s+/g).filter(a=>!!a):this.options.classNames&&(r=this.options.classNames),r.find(a=>a===\"icon\")||r.push(\"codicon\"),this.element.classList.add(...r),this.element.setAttribute(\"role\",\"button\"),this.element.setAttribute(\"aria-haspopup\",\"true\"),this.element.setAttribute(\"aria-expanded\",\"false\"),this.element.title=this._action.label||\"\",this.element.ariaLabel=this._action.label||\"\",null},i=Array.isArray(this.menuActionsOrProvider),n={contextMenuProvider:this.contextMenuProvider,labelRenderer:t,menuAsChild:this.options.menuAsChild,actions:i?this.menuActionsOrProvider:void 0,actionProvider:i?void 0:this.menuActionsOrProvider};if(this.dropdownMenu=this._register(new mX(e,n)),this._register(this.dropdownMenu.onDidChangeVisibility(s=>{var r;(r=this.element)===null||r===void 0||r.setAttribute(\"aria-expanded\",`${s}`),this._onDidChangeVisibility.fire(s)})),this.dropdownMenu.menuOptions={actionViewItemProvider:this.options.actionViewItemProvider,actionRunner:this.actionRunner,getKeyBinding:this.options.keybindingProvider,context:this._context},this.options.anchorAlignmentProvider){const s=this;this.dropdownMenu.menuOptions=Object.assign(Object.assign({},this.dropdownMenu.menuOptions),{get anchorAlignment(){return s.options.anchorAlignmentProvider()}})}this.updateTooltip(),this.updateEnabled()}getTooltip(){let e=null;return this.getAction().tooltip?e=this.getAction().tooltip:this.getAction().label&&(e=this.getAction().label),e!=null?e:void 0}setActionContext(e){super.setActionContext(e),this.dropdownMenu&&(this.dropdownMenu.menuOptions?this.dropdownMenu.menuOptions.context=e:this.dropdownMenu.menuOptions={context:e})}updateEnabled(){var e,t;const i=!this.getAction().enabled;(e=this.actionItem)===null||e===void 0||e.classList.toggle(\"disabled\",i),(t=this.element)===null||t===void 0||t.classList.toggle(\"disabled\",i)}}class C1{constructor(e,t,i=t){this.modifierLabels=[null],this.modifierLabels[2]=e,this.modifierLabels[1]=t,this.modifierLabels[3]=i}toLabel(e,t,i){if(t.length===0)return null;const n=[];for(let s=0,r=t.length;s<r;s++){const a=t[s],l=i(a);if(l===null)return null;n[s]=vX(a,l,this.modifierLabels[e])}return n.join(\" \")}}const SE=new C1({ctrlKey:\"\\u2303\",shiftKey:\"\\u21E7\",altKey:\"\\u2325\",metaKey:\"\\u2318\",separator:\"\"},{ctrlKey:p({key:\"ctrlKey\",comment:[\"This is the short form for the Control key on the keyboard\"]},\"Ctrl\"),shiftKey:p({key:\"shiftKey\",comment:[\"This is the short form for the Shift key on the keyboard\"]},\"Shift\"),altKey:p({key:\"altKey\",comment:[\"This is the short form for the Alt key on the keyboard\"]},\"Alt\"),metaKey:p({key:\"windowsKey\",comment:[\"This is the short form for the Windows key on the keyboard\"]},\"Windows\"),separator:\"+\"},{ctrlKey:p({key:\"ctrlKey\",comment:[\"This is the short form for the Control key on the keyboard\"]},\"Ctrl\"),shiftKey:p({key:\"shiftKey\",comment:[\"This is the short form for the Shift key on the keyboard\"]},\"Shift\"),altKey:p({key:\"altKey\",comment:[\"This is the short form for the Alt key on the keyboard\"]},\"Alt\"),metaKey:p({key:\"superKey\",comment:[\"This is the short form for the Super key on the keyboard\"]},\"Super\"),separator:\"+\"}),_X=new C1({ctrlKey:p({key:\"ctrlKey.long\",comment:[\"This is the long form for the Control key on the keyboard\"]},\"Control\"),shiftKey:p({key:\"shiftKey.long\",comment:[\"This is the long form for the Shift key on the keyboard\"]},\"Shift\"),altKey:p({key:\"optKey.long\",comment:[\"This is the long form for the Alt/Option key on the keyboard\"]},\"Option\"),metaKey:p({key:\"cmdKey.long\",comment:[\"This is the long form for the Command key on the keyboard\"]},\"Command\"),separator:\"+\"},{ctrlKey:p({key:\"ctrlKey.long\",comment:[\"This is the long form for the Control key on the keyboard\"]},\"Control\"),shiftKey:p({key:\"shiftKey.long\",comment:[\"This is the long form for the Shift key on the keyboard\"]},\"Shift\"),altKey:p({key:\"altKey.long\",comment:[\"This is the long form for the Alt key on the keyboard\"]},\"Alt\"),metaKey:p({key:\"windowsKey.long\",comment:[\"This is the long form for the Windows key on the keyboard\"]},\"Windows\"),separator:\"+\"},{ctrlKey:p({key:\"ctrlKey.long\",comment:[\"This is the long form for the Control key on the keyboard\"]},\"Control\"),shiftKey:p({key:\"shiftKey.long\",comment:[\"This is the long form for the Shift key on the keyboard\"]},\"Shift\"),altKey:p({key:\"altKey.long\",comment:[\"This is the long form for the Alt key on the keyboard\"]},\"Alt\"),metaKey:p({key:\"superKey.long\",comment:[\"This is the long form for the Super key on the keyboard\"]},\"Super\"),separator:\"+\"}),bX=new C1({ctrlKey:\"Ctrl\",shiftKey:\"Shift\",altKey:\"Alt\",metaKey:\"Cmd\",separator:\"+\"},{ctrlKey:\"Ctrl\",shiftKey:\"Shift\",altKey:\"Alt\",metaKey:\"Super\",separator:\"+\"});new C1({ctrlKey:\"ctrl\",shiftKey:\"shift\",altKey:\"alt\",metaKey:\"cmd\",separator:\"+\"},{ctrlKey:\"ctrl\",shiftKey:\"shift\",altKey:\"alt\",metaKey:\"win\",separator:\"+\"},{ctrlKey:\"ctrl\",shiftKey:\"shift\",altKey:\"alt\",metaKey:\"meta\",separator:\"+\"});function vX(o,e,t){if(e===null)return\"\";const i=[];return o.ctrlKey&&i.push(t.ctrlKey),o.shiftKey&&i.push(t.shiftKey),o.altKey&&i.push(t.altKey),o.metaKey&&i.push(t.metaKey),e!==\"\"&&i.push(e),i.join(t.separator)}var yE=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Rs=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},sF=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};function CX(o,e,t,i,n,s,r){const a=o.getActions(e);return SX(a,t,!1,typeof i==\"string\"?c=>c===i:i,n,s,r),wX(a)}function wX(o){const e=new ee;for(const[,t]of o)for(const i of t)e.add(i);return e}function SX(o,e,t,i=a=>a===\"navigation\",n=Number.MAX_SAFE_INTEGER,s=()=>!1,r=!1){let a,l;Array.isArray(e)?(a=e,l=e):(a=e.primary,l=e.secondary);const c=new Set;for(const[d,h]of o){let u;i(d)?(u=a,u.length>0&&r&&u.push(new Ji)):(u=l,u.length>0&&u.push(new Ji));for(let g of h){t&&(g=g instanceof ac&&g.alt?g.alt:g);const f=u.push(g);g instanceof Ip&&c.add({group:d,action:g,index:f-1})}}for(const{group:d,action:h,index:u}of c){const g=i(d)?a:l,f=h.actions;(f.length<=1||g.length+f.length-2<=n)&&s(h,d,g.length)&&g.splice(u,1,...f)}if(a!==l&&a.length>n){const d=a.splice(n,a.length-n);l.unshift(...d,new Ji)}}let _g=class extends nm{constructor(e,t,i,n,s,r,a){super(void 0,e,{icon:!!(e.class||e.item.icon),label:!e.class&&!e.item.icon,draggable:t==null?void 0:t.draggable,keybinding:t==null?void 0:t.keybinding,hoverDelegate:t==null?void 0:t.hoverDelegate}),this._keybindingService=i,this._notificationService=n,this._contextKeyService=s,this._themeService=r,this._contextMenuService=a,this._wantsAltCommand=!1,this._itemClassDispose=this._register(new Vn),this._altKey=Rl.getInstance()}get _menuItemAction(){return this._action}get _commandAction(){return this._wantsAltCommand&&this._menuItemAction.alt||this._menuItemAction}onClick(e){return sF(this,void 0,void 0,function*(){e.preventDefault(),e.stopPropagation();try{yield this.actionRunner.run(this._commandAction,this._context)}catch(t){this._notificationService.error(t)}})}render(e){super.render(e),e.classList.add(\"menu-entry\"),this._updateItemClass(this._menuItemAction.item);let t=!1,i=this._altKey.keyStatus.altKey||(nn||sn)&&this._altKey.keyStatus.shiftKey;const n=()=>{var s;const r=t&&i&&!!(!((s=this._commandAction.alt)===null||s===void 0)&&s.enabled);r!==this._wantsAltCommand&&(this._wantsAltCommand=r,this.updateLabel(),this.updateTooltip(),this.updateClass())};this._menuItemAction.alt&&this._register(this._altKey.event(s=>{i=s.altKey||(nn||sn)&&s.shiftKey,n()})),this._register(q(e,\"mouseleave\",s=>{t=!1,n()})),this._register(q(e,\"mouseenter\",s=>{t=!0,n()}))}updateLabel(){this.options.label&&this.label&&(this.label.textContent=this._commandAction.label)}getTooltip(){var e;const t=this._keybindingService.lookupKeybinding(this._commandAction.id,this._contextKeyService),i=t&&t.getLabel(),n=this._commandAction.tooltip||this._commandAction.label;let s=i?p(\"titleAndKb\",\"{0} ({1})\",n,i):n;if(!this._wantsAltCommand&&((e=this._menuItemAction.alt)===null||e===void 0?void 0:e.enabled)){const r=this._menuItemAction.alt.tooltip||this._menuItemAction.alt.label,a=this._keybindingService.lookupKeybinding(this._menuItemAction.alt.id,this._contextKeyService),l=a&&a.getLabel(),c=l?p(\"titleAndKb\",\"{0} ({1})\",r,l):r;s=p(\"titleAndKbAndAlt\",`{0}\n[{1}] {2}`,s,SE.modifierLabels[Os].altKey,c)}return s}updateClass(){this.options.icon&&(this._commandAction!==this._menuItemAction?this._menuItemAction.alt&&this._updateItemClass(this._menuItemAction.alt.item):this._updateItemClass(this._menuItemAction.item))}_updateItemClass(e){var t;this._itemClassDispose.value=void 0;const{element:i,label:n}=this;if(!i||!n)return;const s=this._commandAction.checked&&((t=e.toggled)===null||t===void 0?void 0:t.icon)?e.toggled.icon:e.icon;if(!!s)if(nt.isThemeIcon(s)){const r=nt.asClassNameArray(s);n.classList.add(...r),this._itemClassDispose.value=ze(()=>{n.classList.remove(...r)})}else n.style.backgroundImage=Xx(this._themeService.getColorTheme().type)?Od(s.dark):Od(s.light),n.classList.add(\"icon\"),this._itemClassDispose.value=Pr(ze(()=>{n.style.backgroundImage=\"\",n.classList.remove(\"icon\")}),this._themeService.onDidColorThemeChange(()=>{this.updateClass()}))}};_g=yE([Rs(2,rn),Rs(3,gi),Rs(4,xe),Rs(5,vt),Rs(6,cl)],_g);let IL=class extends nF{constructor(e,t,i,n){var s,r;const a=Object.assign({},t!=null?t:Object.create(null),{menuAsChild:(s=t==null?void 0:t.menuAsChild)!==null&&s!==void 0?s:!1,classNames:(r=t==null?void 0:t.classNames)!==null&&r!==void 0?r:nt.isThemeIcon(e.item.icon)?nt.asClassName(e.item.icon):void 0});super(e,{getActions:()=>e.actions},i,a),this._contextMenuService=i,this._themeService=n}render(e){super.render(e),gt(this.element),e.classList.add(\"menu-entry\");const t=this._action,{icon:i}=t.item;if(i&&!nt.isThemeIcon(i)){this.element.classList.add(\"icon\");const n=()=>{this.element&&(this.element.style.backgroundImage=Xx(this._themeService.getColorTheme().type)?Od(i.dark):Od(i.light))};n(),this._register(this._themeService.onDidColorThemeChange(()=>{n()}))}}};IL=yE([Rs(2,cl),Rs(3,vt)],IL);let EL=class extends wr{constructor(e,t,i,n,s,r,a,l){var c,d,h;super(null,e),this._keybindingService=i,this._notificationService=n,this._contextMenuService=s,this._menuService=r,this._instaService=a,this._storageService=l,this._container=null,this._options=t,this._storageKey=`${e.item.submenu.id}_lastActionId`;let u;const g=l.get(this._storageKey,1);g&&(u=e.actions.find(_=>g===_.id)),u||(u=e.actions[0]),this._defaultAction=this._instaService.createInstance(_g,u,{keybinding:this._getDefaultActionKeybindingLabel(u)});const f=Object.assign({},t!=null?t:Object.create(null),{menuAsChild:(c=t==null?void 0:t.menuAsChild)!==null&&c!==void 0?c:!0,classNames:(d=t==null?void 0:t.classNames)!==null&&d!==void 0?d:[\"codicon\",\"codicon-chevron-down\"],actionRunner:(h=t==null?void 0:t.actionRunner)!==null&&h!==void 0?h:new Ju});this._dropdown=new nF(e,e.actions,this._contextMenuService,f),this._dropdown.actionRunner.onDidRun(_=>{_.action instanceof ac&&this.update(_.action)})}update(e){this._storageService.store(this._storageKey,e.id,1,0),this._defaultAction.dispose(),this._defaultAction=this._instaService.createInstance(_g,e,{keybinding:this._getDefaultActionKeybindingLabel(e)}),this._defaultAction.actionRunner=new class extends Ju{runAction(t,i){return sF(this,void 0,void 0,function*(){yield t.run(void 0)})}},this._container&&this._defaultAction.render(mB(this._container,se(\".action-container\")))}_getDefaultActionKeybindingLabel(e){var t;let i;if(!((t=this._options)===null||t===void 0)&&t.renderKeybindingWithDefaultActionLabel){const n=this._keybindingService.lookupKeybinding(e.id);n&&(i=`(${n.getLabel()})`)}return i}setActionContext(e){super.setActionContext(e),this._defaultAction.setActionContext(e),this._dropdown.setActionContext(e)}render(e){this._container=e,super.render(this._container),this._container.classList.add(\"monaco-dropdown-with-default\");const t=se(\".action-container\");this._defaultAction.render(G(this._container,t)),this._register(q(t,le.KEY_DOWN,n=>{const s=new Mt(n);s.equals(17)&&(this._defaultAction.element.tabIndex=-1,this._dropdown.focus(),s.stopPropagation())}));const i=se(\".dropdown-action-container\");this._dropdown.render(G(this._container,i)),this._register(q(i,le.KEY_DOWN,n=>{var s;const r=new Mt(n);r.equals(15)&&(this._defaultAction.element.tabIndex=0,this._dropdown.setFocusable(!1),(s=this._defaultAction.element)===null||s===void 0||s.focus(),r.stopPropagation())}))}focus(e){e?this._dropdown.focus():(this._defaultAction.element.tabIndex=0,this._defaultAction.element.focus())}blur(){this._defaultAction.element.tabIndex=-1,this._dropdown.blur(),this._container.blur()}setFocusable(e){e?this._defaultAction.element.tabIndex=0:(this._defaultAction.element.tabIndex=-1,this._dropdown.setFocusable(!1))}dispose(){this._defaultAction.dispose(),this._dropdown.dispose(),super.dispose()}};EL=yE([Rs(2,rn),Rs(3,gi),Rs(4,cl),Rs(5,fh),Rs(6,Re),Rs(7,ia)],EL);function yX(o,e,t){return e instanceof ac?o.createInstance(_g,e,t):e instanceof Qx?e.item.rememberDefaultAction?o.createInstance(EL,e,t):o.createInstance(IL,e,t):void 0}var oF=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},rF=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const aF=qe(\"IPeekViewService\");Xe(aF,class{constructor(){this._widgets=new Map}addExclusiveWidget(o,e){const t=this._widgets.get(o);t&&(t.listener.dispose(),t.widget.dispose());const i=()=>{const n=this._widgets.get(o);n&&n.widget===e&&(n.listener.dispose(),this._widgets.delete(o))};this._widgets.set(o,{widget:e,listener:e.onDidClose(i)})}});var zn;(function(o){o.inPeekEditor=new ce(\"inReferenceSearchEditor\",!0,p(\"inReferenceSearchEditor\",\"Whether the current code editor is embedded inside peek\")),o.notInPeekEditor=o.inPeekEditor.toNegated()})(zn||(zn={}));let am=class{constructor(e,t){e instanceof Zd&&zn.inPeekEditor.bindTo(t)}dispose(){}};am.ID=\"editor.contrib.referenceController\";am=oF([rF(1,xe)],am);rt(am.ID,am);function LX(o){const e=o.get(dt).getFocusedCodeEditor();return e instanceof Zd?e.getParentEditor():e}const DX={headerBackgroundColor:W.white,primaryHeadingColor:W.fromHex(\"#333333\"),secondaryHeadingColor:W.fromHex(\"#6c6c6cb3\")};let xv=class extends fX{constructor(e,t,i){super(e,t),this.instantiationService=i,this._onDidClose=new O,this.onDidClose=this._onDidClose.event,ea(this.options,DX,!1)}dispose(){this.disposed||(this.disposed=!0,super.dispose(),this._onDidClose.fire(this))}style(e){const t=this.options;e.headerBackgroundColor&&(t.headerBackgroundColor=e.headerBackgroundColor),e.primaryHeadingColor&&(t.primaryHeadingColor=e.primaryHeadingColor),e.secondaryHeadingColor&&(t.secondaryHeadingColor=e.secondaryHeadingColor),super.style(e)}_applyStyles(){super._applyStyles();const e=this.options;this._headElement&&e.headerBackgroundColor&&(this._headElement.style.backgroundColor=e.headerBackgroundColor.toString()),this._primaryHeading&&e.primaryHeadingColor&&(this._primaryHeading.style.color=e.primaryHeadingColor.toString()),this._secondaryHeading&&e.secondaryHeadingColor&&(this._secondaryHeading.style.color=e.secondaryHeadingColor.toString()),this._bodyElement&&e.frameColor&&(this._bodyElement.style.borderColor=e.frameColor.toString())}_fillContainer(e){this.setCssClass(\"peekview-widget\"),this._headElement=se(\".head\"),this._bodyElement=se(\".body\"),this._fillHead(this._headElement),this._fillBody(this._bodyElement),e.appendChild(this._headElement),e.appendChild(this._bodyElement)}_fillHead(e,t){const i=se(\".peekview-title\");this.options.supportOnTitleClick&&(i.classList.add(\"clickable\"),Ei(i,\"click\",r=>this._onTitleClick(r))),G(this._headElement,i),this._fillTitleIcon(i),this._primaryHeading=se(\"span.filename\"),this._secondaryHeading=se(\"span.dirname\"),this._metaHeading=se(\"span.meta\"),G(i,this._primaryHeading,this._secondaryHeading,this._metaHeading);const n=se(\".peekview-actions\");G(this._headElement,n);const s=this._getActionBarOptions();this._actionbarWidget=new qr(n,s),this._disposables.add(this._actionbarWidget),t||this._actionbarWidget.push(new is(\"peekview.close\",p(\"label.close\",\"Close\"),m.close.classNames,!0,()=>(this.dispose(),Promise.resolve())),{label:!1,icon:!0})}_fillTitleIcon(e){}_getActionBarOptions(){return{actionViewItemProvider:yX.bind(void 0,this.instantiationService),orientation:0}}_onTitleClick(e){}setTitle(e,t){this._primaryHeading&&this._secondaryHeading&&(this._primaryHeading.innerText=e,this._primaryHeading.setAttribute(\"title\",e),t?this._secondaryHeading.innerText=t:Ii(this._secondaryHeading))}setMetaTitle(e){this._metaHeading&&(e?(this._metaHeading.innerText=e,bs(this._metaHeading)):An(this._metaHeading))}_doLayout(e,t){if(!this._isShowing&&e<0){this.dispose();return}const i=Math.ceil(this.editor.getOption(61)*1.2),n=Math.round(e-(i+2));this._doLayoutHead(i,t),this._doLayoutBody(n,t)}_doLayoutHead(e,t){this._headElement&&(this._headElement.style.height=`${e}px`,this._headElement.style.lineHeight=this._headElement.style.height)}_doLayoutBody(e,t){this._bodyElement&&(this._bodyElement.style.height=`${e}px`)}};xv=oF([rF(2,Re)],xv);const kX=N(\"peekViewTitle.background\",{dark:fe(Bn,.1),light:fe(Bn,.1),hcDark:null,hcLight:null},p(\"peekViewTitleBackground\",\"Background color of the peek view title area.\")),lF=N(\"peekViewTitleLabel.foreground\",{dark:W.white,light:W.black,hcDark:W.white,hcLight:ws},p(\"peekViewTitleForeground\",\"Color of the peek view title.\")),cF=N(\"peekViewTitleDescription.foreground\",{dark:\"#ccccccb3\",light:\"#616161\",hcDark:\"#FFFFFF99\",hcLight:\"#292929\"},p(\"peekViewTitleInfoForeground\",\"Color of the peek view title info.\")),xX=N(\"peekView.border\",{dark:Bn,light:Bn,hcDark:Be,hcLight:Be},p(\"peekViewBorder\",\"Color of the peek view borders and arrow.\")),IX=N(\"peekViewResult.background\",{dark:\"#252526\",light:\"#F3F3F3\",hcDark:W.black,hcLight:W.white},p(\"peekViewResultsBackground\",\"Background color of the peek view result list.\"));N(\"peekViewResult.lineForeground\",{dark:\"#bbbbbb\",light:\"#646465\",hcDark:W.white,hcLight:ws},p(\"peekViewResultsMatchForeground\",\"Foreground color for line nodes in the peek view result list.\"));N(\"peekViewResult.fileForeground\",{dark:W.white,light:\"#1E1E1E\",hcDark:W.white,hcLight:ws},p(\"peekViewResultsFileForeground\",\"Foreground color for file nodes in the peek view result list.\"));N(\"peekViewResult.selectionBackground\",{dark:\"#3399ff33\",light:\"#3399ff33\",hcDark:null,hcLight:null},p(\"peekViewResultsSelectionBackground\",\"Background color of the selected entry in the peek view result list.\"));N(\"peekViewResult.selectionForeground\",{dark:W.white,light:\"#6C6C6C\",hcDark:W.white,hcLight:ws},p(\"peekViewResultsSelectionForeground\",\"Foreground color of the selected entry in the peek view result list.\"));const fb=N(\"peekViewEditor.background\",{dark:\"#001F33\",light:\"#F2F8FC\",hcDark:W.black,hcLight:W.white},p(\"peekViewEditorBackground\",\"Background color of the peek view editor.\"));N(\"peekViewEditorGutter.background\",{dark:fb,light:fb,hcDark:fb,hcLight:fb},p(\"peekViewEditorGutterBackground\",\"Background color of the gutter in the peek view editor.\"));N(\"peekViewResult.matchHighlightBackground\",{dark:\"#ea5c004d\",light:\"#ea5c004d\",hcDark:null,hcLight:null},p(\"peekViewResultsMatchHighlight\",\"Match highlight color in the peek view result list.\"));N(\"peekViewEditor.matchHighlightBackground\",{dark:\"#ff8f0099\",light:\"#f5d802de\",hcDark:null,hcLight:null},p(\"peekViewEditorMatchHighlight\",\"Match highlight color in the peek view editor.\"));N(\"peekViewEditor.matchHighlightBorder\",{dark:null,light:null,hcDark:At,hcLight:At},p(\"peekViewEditorMatchHighlightBorder\",\"Match highlight border in the peek view editor.\"));function pc(o){return o&&typeof o.getEditorType==\"function\"?o.getEditorType()===r1.ICodeEditor:!1}class EX{constructor(e,t){this.renderer=e,this.modelProvider=t}get templateId(){return this.renderer.templateId}renderTemplate(e){return{data:this.renderer.renderTemplate(e),disposable:z.None}}renderElement(e,t,i,n){if(i.disposable&&i.disposable.dispose(),!i.data)return;const s=this.modelProvider();if(s.isResolved(e))return this.renderer.renderElement(s.get(e),e,i.data,n);const r=new gn,a=s.resolve(e,r.token);i.disposable={dispose:()=>r.cancel()},this.renderer.renderPlaceholder(e,i.data),a.then(l=>this.renderer.renderElement(l,e,i.data,n))}disposeTemplate(e){e.disposable&&(e.disposable.dispose(),e.disposable=void 0),e.data&&(this.renderer.disposeTemplate(e.data),e.data=void 0)}}class NX{constructor(e,t){this.modelProvider=e,this.accessibilityProvider=t}getWidgetAriaLabel(){return this.accessibilityProvider.getWidgetAriaLabel()}getAriaLabel(e){const t=this.modelProvider();return t.isResolved(e)?this.accessibilityProvider.getAriaLabel(t.get(e)):null}}function TX(o,e){return Object.assign(Object.assign({},e),{accessibilityProvider:e.accessibilityProvider&&new NX(o,e.accessibilityProvider)})}class MX{constructor(e,t,i,n,s={}){const r=()=>this.model,a=n.map(l=>new EX(l,r));this.list=new ir(e,t,i,a,TX(r,s))}updateOptions(e){this.list.updateOptions(e)}getHTMLElement(){return this.list.getHTMLElement()}get onDidFocus(){return this.list.onDidFocus}get onDidDispose(){return this.list.onDidDispose}get onMouseDblClick(){return pe.map(this.list.onMouseDblClick,({element:e,index:t,browserEvent:i})=>({element:e===void 0?void 0:this._model.get(e),index:t,browserEvent:i}))}get onPointer(){return pe.map(this.list.onPointer,({element:e,index:t,browserEvent:i})=>({element:e===void 0?void 0:this._model.get(e),index:t,browserEvent:i}))}get onDidChangeSelection(){return pe.map(this.list.onDidChangeSelection,({elements:e,indexes:t,browserEvent:i})=>({elements:e.map(n=>this._model.get(n)),indexes:t,browserEvent:i}))}get model(){return this._model}set model(e){this._model=e,this.list.splice(0,this.list.length,mn(e.length))}getFocus(){return this.list.getFocus()}getSelection(){return this.list.getSelection()}getSelectedElements(){return this.getSelection().map(e=>this.model.get(e))}style(e){this.list.style(e)}dispose(){this.list.dispose()}}const AX={separatorBorder:W.transparent};class dF{constructor(e,t,i,n){this.container=e,this.view=t,this.disposable=n,this._cachedVisibleSize=void 0,typeof i==\"number\"?(this._size=i,this._cachedVisibleSize=void 0,e.classList.add(\"visible\")):(this._size=0,this._cachedVisibleSize=i.cachedVisibleSize)}set size(e){this._size=e}get size(){return this._size}get visible(){return typeof this._cachedVisibleSize==\"undefined\"}setVisible(e,t){var i,n;e!==this.visible&&(e?(this.size=qn(this._cachedVisibleSize,this.viewMinimumSize,this.viewMaximumSize),this._cachedVisibleSize=void 0):(this._cachedVisibleSize=typeof t==\"number\"?t:this.size,this.size=0),this.container.classList.toggle(\"visible\",e),(n=(i=this.view).setVisible)===null||n===void 0||n.call(i,e))}get minimumSize(){return this.visible?this.view.minimumSize:0}get viewMinimumSize(){return this.view.minimumSize}get maximumSize(){return this.visible?this.view.maximumSize:0}get viewMaximumSize(){return this.view.maximumSize}get priority(){return this.view.priority}get snap(){return!!this.view.snap}set enabled(e){this.container.style.pointerEvents=e?\"\":\"none\"}layout(e,t){this.layoutContainer(e),this.view.layout(this.size,e,t)}dispose(){return this.disposable.dispose(),this.view}}class RX extends dF{layoutContainer(e){this.container.style.top=`${e}px`,this.container.style.height=`${this.size}px`}}class OX extends dF{layoutContainer(e){this.container.style.left=`${e}px`,this.container.style.width=`${this.size}px`}}var wa;(function(o){o[o.Idle=0]=\"Idle\",o[o.Busy=1]=\"Busy\"})(wa||(wa={}));var Iv;(function(o){o.Distribute={type:\"distribute\"};function e(i){return{type:\"split\",index:i}}o.Split=e;function t(i){return{type:\"invisible\",cachedVisibleSize:i}}o.Invisible=t})(Iv||(Iv={}));class hF extends z{constructor(e,t={}){var i,n,s,r,a;super(),this.size=0,this.contentSize=0,this.proportions=void 0,this.viewItems=[],this.sashItems=[],this.state=wa.Idle,this._onDidSashChange=this._register(new O),this._onDidSashReset=this._register(new O),this._startSnappingEnabled=!0,this._endSnappingEnabled=!0,this.onDidSashChange=this._onDidSashChange.event,this.onDidSashReset=this._onDidSashReset.event,this.orientation=(i=t.orientation)!==null&&i!==void 0?i:0,this.inverseAltBehavior=(n=t.inverseAltBehavior)!==null&&n!==void 0?n:!1,this.proportionalLayout=(s=t.proportionalLayout)!==null&&s!==void 0?s:!0,this.getSashOrthogonalSize=t.getSashOrthogonalSize,this.el=document.createElement(\"div\"),this.el.classList.add(\"monaco-split-view2\"),this.el.classList.add(this.orientation===0?\"vertical\":\"horizontal\"),e.appendChild(this.el),this.sashContainer=G(this.el,se(\".sash-container\")),this.viewContainer=se(\".split-view-container\"),this.scrollable=new Jm({forceIntegerValues:!0,smoothScrollDuration:125,scheduleAtNextAnimationFrame:Go}),this.scrollableElement=this._register(new xI(this.viewContainer,{vertical:this.orientation===0?(r=t.scrollbarVisibility)!==null&&r!==void 0?r:1:2,horizontal:this.orientation===1?(a=t.scrollbarVisibility)!==null&&a!==void 0?a:1:2},this.scrollable)),this.onDidScroll=this.scrollableElement.onScroll,this._register(this.onDidScroll(l=>{this.viewContainer.scrollTop=l.scrollTop,this.viewContainer.scrollLeft=l.scrollLeft})),G(this.el,this.scrollableElement.getDomNode()),this.style(t.styles||AX),t.descriptor&&(this.size=t.descriptor.size,t.descriptor.views.forEach((l,c)=>{const d=Qn(l.visible)||l.visible?l.size:{type:\"invisible\",cachedVisibleSize:l.size},h=l.view;this.doAddView(h,d,c,!0)}),this.contentSize=this.viewItems.reduce((l,c)=>l+c.size,0),this.saveProportions())}get orthogonalStartSash(){return this._orthogonalStartSash}get orthogonalEndSash(){return this._orthogonalEndSash}get startSnappingEnabled(){return this._startSnappingEnabled}get endSnappingEnabled(){return this._endSnappingEnabled}set orthogonalStartSash(e){for(const t of this.sashItems)t.sash.orthogonalStartSash=e;this._orthogonalStartSash=e}set orthogonalEndSash(e){for(const t of this.sashItems)t.sash.orthogonalEndSash=e;this._orthogonalEndSash=e}set startSnappingEnabled(e){this._startSnappingEnabled!==e&&(this._startSnappingEnabled=e,this.updateSashEnablement())}set endSnappingEnabled(e){this._endSnappingEnabled!==e&&(this._endSnappingEnabled=e,this.updateSashEnablement())}style(e){e.separatorBorder.isTransparent()?(this.el.classList.remove(\"separator-border\"),this.el.style.removeProperty(\"--separator-border\")):(this.el.classList.add(\"separator-border\"),this.el.style.setProperty(\"--separator-border\",e.separatorBorder.toString()))}addView(e,t,i=this.viewItems.length,n){this.doAddView(e,t,i,n)}layout(e,t){const i=Math.max(this.size,this.contentSize);if(this.size=e,this.layoutContext=t,this.proportions)for(let n=0;n<this.viewItems.length;n++){const s=this.viewItems[n];s.size=qn(Math.round(this.proportions[n]*e),s.minimumSize,s.maximumSize)}else{const n=mn(this.viewItems.length),s=n.filter(a=>this.viewItems[a].priority===1),r=n.filter(a=>this.viewItems[a].priority===2);this.resize(this.viewItems.length-1,e-i,void 0,s,r)}this.distributeEmptySpace(),this.layoutViews()}saveProportions(){this.proportionalLayout&&this.contentSize>0&&(this.proportions=this.viewItems.map(e=>e.size/this.contentSize))}onSashStart({sash:e,start:t,alt:i}){for(const a of this.viewItems)a.enabled=!1;const n=this.sashItems.findIndex(a=>a.sash===e),s=Pr(q(document.body,\"keydown\",a=>r(this.sashDragState.current,a.altKey)),q(document.body,\"keyup\",()=>r(this.sashDragState.current,!1))),r=(a,l)=>{const c=this.viewItems.map(f=>f.size);let d=Number.NEGATIVE_INFINITY,h=Number.POSITIVE_INFINITY;if(this.inverseAltBehavior&&(l=!l),l)if(n===this.sashItems.length-1){const _=this.viewItems[n];d=(_.minimumSize-_.size)/2,h=(_.maximumSize-_.size)/2}else{const _=this.viewItems[n+1];d=(_.size-_.maximumSize)/2,h=(_.size-_.minimumSize)/2}let u,g;if(!l){const f=mn(n,-1),_=mn(n+1,this.viewItems.length),b=f.reduce((D,I)=>D+(this.viewItems[I].minimumSize-c[I]),0),v=f.reduce((D,I)=>D+(this.viewItems[I].viewMaximumSize-c[I]),0),C=_.length===0?Number.POSITIVE_INFINITY:_.reduce((D,I)=>D+(c[I]-this.viewItems[I].minimumSize),0),w=_.length===0?Number.NEGATIVE_INFINITY:_.reduce((D,I)=>D+(c[I]-this.viewItems[I].viewMaximumSize),0),S=Math.max(b,w),k=Math.min(C,v),x=this.findFirstSnapIndex(f),y=this.findFirstSnapIndex(_);if(typeof x==\"number\"){const D=this.viewItems[x],I=Math.floor(D.viewMinimumSize/2);u={index:x,limitDelta:D.visible?S-I:S+I,size:D.size}}if(typeof y==\"number\"){const D=this.viewItems[y],I=Math.floor(D.viewMinimumSize/2);g={index:y,limitDelta:D.visible?k+I:k-I,size:D.size}}}this.sashDragState={start:a,current:a,index:n,sizes:c,minDelta:d,maxDelta:h,alt:l,snapBefore:u,snapAfter:g,disposable:s}};r(t,i)}onSashChange({current:e}){const{index:t,start:i,sizes:n,alt:s,minDelta:r,maxDelta:a,snapBefore:l,snapAfter:c}=this.sashDragState;this.sashDragState.current=e;const d=e-i,h=this.resize(t,d,n,void 0,void 0,r,a,l,c);if(s){const u=t===this.sashItems.length-1,g=this.viewItems.map(w=>w.size),f=u?t:t+1,_=this.viewItems[f],b=_.size-_.maximumSize,v=_.size-_.minimumSize,C=u?t-1:t+1;this.resize(C,-h,g,void 0,void 0,b,v)}this.distributeEmptySpace(),this.layoutViews()}onSashEnd(e){this._onDidSashChange.fire(e),this.sashDragState.disposable.dispose(),this.saveProportions();for(const t of this.viewItems)t.enabled=!0}onViewChange(e,t){const i=this.viewItems.indexOf(e);i<0||i>=this.viewItems.length||(t=typeof t==\"number\"?t:e.size,t=qn(t,e.minimumSize,e.maximumSize),this.inverseAltBehavior&&i>0?(this.resize(i-1,Math.floor((e.size-t)/2)),this.distributeEmptySpace(),this.layoutViews()):(e.size=t,this.relayout([i],void 0)))}resizeView(e,t){if(this.state!==wa.Idle)throw new Error(\"Cant modify splitview\");if(this.state=wa.Busy,e<0||e>=this.viewItems.length)return;const i=mn(this.viewItems.length).filter(a=>a!==e),n=[...i.filter(a=>this.viewItems[a].priority===1),e],s=i.filter(a=>this.viewItems[a].priority===2),r=this.viewItems[e];t=Math.round(t),t=qn(t,r.minimumSize,Math.min(r.maximumSize,this.size)),r.size=t,this.relayout(n,s),this.state=wa.Idle}distributeViewSizes(){const e=[];let t=0;for(const a of this.viewItems)a.maximumSize-a.minimumSize>0&&(e.push(a),t+=a.size);const i=Math.floor(t/e.length);for(const a of e)a.size=qn(i,a.minimumSize,a.maximumSize);const n=mn(this.viewItems.length),s=n.filter(a=>this.viewItems[a].priority===1),r=n.filter(a=>this.viewItems[a].priority===2);this.relayout(s,r)}getViewSize(e){return e<0||e>=this.viewItems.length?-1:this.viewItems[e].size}doAddView(e,t,i=this.viewItems.length,n){if(this.state!==wa.Idle)throw new Error(\"Cant modify splitview\");this.state=wa.Busy;const s=se(\".split-view-view\");i===this.viewItems.length?this.viewContainer.appendChild(s):this.viewContainer.insertBefore(s,this.viewContainer.children.item(i));const r=e.onDidChange(u=>this.onViewChange(d,u)),a=ze(()=>this.viewContainer.removeChild(s)),l=Pr(r,a);let c;typeof t==\"number\"?c=t:t.type===\"split\"?c=this.getViewSize(t.index)/2:t.type===\"invisible\"?c={cachedVisibleSize:t.cachedVisibleSize}:c=e.minimumSize;const d=this.orientation===0?new RX(s,e,c,l):new OX(s,e,c,l);if(this.viewItems.splice(i,0,d),this.viewItems.length>1){const u={orthogonalStartSash:this.orthogonalStartSash,orthogonalEndSash:this.orthogonalEndSash},g=this.orientation===0?new Zi(this.sashContainer,{getHorizontalSashTop:D=>this.getSashPosition(D),getHorizontalSashWidth:this.getSashOrthogonalSize},Object.assign(Object.assign({},u),{orientation:1})):new Zi(this.sashContainer,{getVerticalSashLeft:D=>this.getSashPosition(D),getVerticalSashHeight:this.getSashOrthogonalSize},Object.assign(Object.assign({},u),{orientation:0})),f=this.orientation===0?D=>({sash:g,start:D.startY,current:D.currentY,alt:D.altKey}):D=>({sash:g,start:D.startX,current:D.currentX,alt:D.altKey}),b=pe.map(g.onDidStart,f)(this.onSashStart,this),C=pe.map(g.onDidChange,f)(this.onSashChange,this),S=pe.map(g.onDidEnd,()=>this.sashItems.findIndex(D=>D.sash===g))(this.onSashEnd,this),k=g.onDidReset(()=>{const D=this.sashItems.findIndex($=>$.sash===g),I=mn(D,-1),R=mn(D+1,this.viewItems.length),P=this.findFirstSnapIndex(I),H=this.findFirstSnapIndex(R);typeof P==\"number\"&&!this.viewItems[P].visible||typeof H==\"number\"&&!this.viewItems[H].visible||this._onDidSashReset.fire(D)}),x=Pr(b,C,S,k,g),y={sash:g,disposable:x};this.sashItems.splice(i-1,0,y)}s.appendChild(e.element);let h;typeof t!=\"number\"&&t.type===\"split\"&&(h=[t.index]),n||this.relayout([i],h),this.state=wa.Idle,!n&&typeof t!=\"number\"&&t.type===\"distribute\"&&this.distributeViewSizes()}relayout(e,t){const i=this.viewItems.reduce((n,s)=>n+s.size,0);this.resize(this.viewItems.length-1,this.size-i,void 0,e,t),this.distributeEmptySpace(),this.layoutViews(),this.saveProportions()}resize(e,t,i=this.viewItems.map(d=>d.size),n,s,r=Number.NEGATIVE_INFINITY,a=Number.POSITIVE_INFINITY,l,c){if(e<0||e>=this.viewItems.length)return 0;const d=mn(e,-1),h=mn(e+1,this.viewItems.length);if(s)for(const y of s)Dw(d,y),Dw(h,y);if(n)for(const y of n)W_(d,y),W_(h,y);const u=d.map(y=>this.viewItems[y]),g=d.map(y=>i[y]),f=h.map(y=>this.viewItems[y]),_=h.map(y=>i[y]),b=d.reduce((y,D)=>y+(this.viewItems[D].minimumSize-i[D]),0),v=d.reduce((y,D)=>y+(this.viewItems[D].maximumSize-i[D]),0),C=h.length===0?Number.POSITIVE_INFINITY:h.reduce((y,D)=>y+(i[D]-this.viewItems[D].minimumSize),0),w=h.length===0?Number.NEGATIVE_INFINITY:h.reduce((y,D)=>y+(i[D]-this.viewItems[D].maximumSize),0),S=Math.max(b,w,r),k=Math.min(C,v,a);let x=!1;if(l){const y=this.viewItems[l.index],D=t>=l.limitDelta;x=D!==y.visible,y.setVisible(D,l.size)}if(!x&&c){const y=this.viewItems[c.index],D=t<c.limitDelta;x=D!==y.visible,y.setVisible(D,c.size)}if(x)return this.resize(e,t,i,n,s,r,a);t=qn(t,S,k);for(let y=0,D=t;y<u.length;y++){const I=u[y],R=qn(g[y]+D,I.minimumSize,I.maximumSize);D-=R-g[y],I.size=R}for(let y=0,D=t;y<f.length;y++){const I=f[y],R=qn(_[y]-D,I.minimumSize,I.maximumSize);D+=R-_[y],I.size=R}return t}distributeEmptySpace(e){const t=this.viewItems.reduce((a,l)=>a+l.size,0);let i=this.size-t;const n=mn(this.viewItems.length-1,-1),s=n.filter(a=>this.viewItems[a].priority===1),r=n.filter(a=>this.viewItems[a].priority===2);for(const a of r)Dw(n,a);for(const a of s)W_(n,a);typeof e==\"number\"&&W_(n,e);for(let a=0;i!==0&&a<n.length;a++){const l=this.viewItems[n[a]],c=qn(l.size+i,l.minimumSize,l.maximumSize);i-=c-l.size,l.size=c}}layoutViews(){this.contentSize=this.viewItems.reduce((t,i)=>t+i.size,0);let e=0;for(const t of this.viewItems)t.layout(e,this.layoutContext),e+=t.size;this.sashItems.forEach(t=>t.sash.layout()),this.updateSashEnablement(),this.updateScrollableElement()}updateScrollableElement(){this.orientation===0?this.scrollableElement.setScrollDimensions({height:this.size,scrollHeight:this.contentSize}):this.scrollableElement.setScrollDimensions({width:this.size,scrollWidth:this.contentSize})}updateSashEnablement(){let e=!1;const t=this.viewItems.map(l=>e=l.size-l.minimumSize>0||e);e=!1;const i=this.viewItems.map(l=>e=l.maximumSize-l.size>0||e),n=[...this.viewItems].reverse();e=!1;const s=n.map(l=>e=l.size-l.minimumSize>0||e).reverse();e=!1;const r=n.map(l=>e=l.maximumSize-l.size>0||e).reverse();let a=0;for(let l=0;l<this.sashItems.length;l++){const{sash:c}=this.sashItems[l];a+=this.viewItems[l].size;const h=!(t[l]&&r[l+1]),u=!(i[l]&&s[l+1]);if(h&&u){const g=mn(l,-1),f=mn(l+1,this.viewItems.length),_=this.findFirstSnapIndex(g),b=this.findFirstSnapIndex(f),v=typeof _==\"number\"&&!this.viewItems[_].visible,C=typeof b==\"number\"&&!this.viewItems[b].visible;v&&s[l]&&(a>0||this.startSnappingEnabled)?c.state=1:C&&t[l]&&(a<this.contentSize||this.endSnappingEnabled)?c.state=2:c.state=0}else h&&!u?c.state=1:!h&&u?c.state=2:c.state=3}}getSashPosition(e){let t=0;for(let i=0;i<this.sashItems.length;i++)if(t+=this.viewItems[i].size,this.sashItems[i].sash===e)return t;return 0}findFirstSnapIndex(e){for(const t of e){const i=this.viewItems[t];if(!!i.visible&&i.snap)return t}for(const t of e){const i=this.viewItems[t];if(i.visible&&i.maximumSize-i.minimumSize>0)return;if(!i.visible&&i.snap)return t}}dispose(){super.dispose(),et(this.viewItems),this.viewItems=[],this.sashItems.forEach(e=>e.disposable.dispose()),this.sashItems=[]}}class d_{constructor(e,t,i){this.columns=e,this.getColumnSize=i,this.templateId=d_.TemplateId,this.renderedTemplates=new Set;const n=new Map(t.map(s=>[s.templateId,s]));this.renderers=[];for(const s of e){const r=n.get(s.templateId);if(!r)throw new Error(`Table cell renderer for template id ${s.templateId} not found.`);this.renderers.push(r)}}renderTemplate(e){const t=G(e,se(\".monaco-table-tr\")),i=[],n=[];for(let r=0;r<this.columns.length;r++){const a=this.renderers[r],l=G(t,se(\".monaco-table-td\",{\"data-col-index\":r}));l.style.width=`${this.getColumnSize(r)}px`,i.push(l),n.push(a.renderTemplate(l))}const s={container:e,cellContainers:i,cellTemplateData:n};return this.renderedTemplates.add(s),s}renderElement(e,t,i,n){for(let s=0;s<this.columns.length;s++){const a=this.columns[s].project(e);this.renderers[s].renderElement(a,t,i.cellTemplateData[s],n)}}disposeElement(e,t,i,n){for(let s=0;s<this.columns.length;s++){const r=this.renderers[s];if(r.disposeElement){const l=this.columns[s].project(e);r.disposeElement(l,t,i.cellTemplateData[s],n)}}}disposeTemplate(e){for(let t=0;t<this.columns.length;t++)this.renderers[t].disposeTemplate(e.cellTemplateData[t]);Ii(e.container),this.renderedTemplates.delete(e)}layoutColumn(e,t){for(const{cellContainers:i}of this.renderedTemplates)i[e].style.width=`${t}px`}}d_.TemplateId=\"row\";function PX(o){return{getHeight(e){return o.getHeight(e)},getTemplateId(){return d_.TemplateId}}}class FX{constructor(e,t){this.column=e,this.index=t,this._onDidLayout=new O,this.onDidLayout=this._onDidLayout.event,this.element=se(\".monaco-table-th\",{\"data-col-index\":t,title:e.tooltip},e.label)}get minimumSize(){var e;return(e=this.column.minimumWidth)!==null&&e!==void 0?e:120}get maximumSize(){var e;return(e=this.column.maximumWidth)!==null&&e!==void 0?e:Number.POSITIVE_INFINITY}get onDidChange(){var e;return(e=this.column.onDidChangeWidthConstraints)!==null&&e!==void 0?e:pe.None}layout(e){this._onDidLayout.fire([this.index,e])}}class w1{constructor(e,t,i,n,s,r){this.virtualDelegate=i,this.domId=`table_id_${++w1.InstanceCount}`,this.disposables=new ee,this.cachedWidth=0,this.cachedHeight=0,this.domNode=G(t,se(`.monaco-table.${this.domId}`));const a=n.map((d,h)=>new FX(d,h)),l={size:a.reduce((d,h)=>d+h.column.weight,0),views:a.map(d=>({size:d.column.weight,view:d}))};this.splitview=this.disposables.add(new hF(this.domNode,{orientation:1,scrollbarVisibility:2,getSashOrthogonalSize:()=>this.cachedHeight,descriptor:l})),this.splitview.el.style.height=`${i.headerRowHeight}px`,this.splitview.el.style.lineHeight=`${i.headerRowHeight}px`;const c=new d_(n,s,d=>this.splitview.getViewSize(d));this.list=this.disposables.add(new ir(e,this.domNode,PX(i),[c],r)),pe.any(...a.map(d=>d.onDidLayout))(([d,h])=>c.layoutColumn(d,h),null,this.disposables),this.splitview.onDidSashReset(d=>{const h=n.reduce((g,f)=>g+f.weight,0),u=n[d].weight/h*this.cachedWidth;this.splitview.resizeView(d,u)},null,this.disposables),this.styleElement=qs(this.domNode),this.style({})}get onDidChangeFocus(){return this.list.onDidChangeFocus}get onDidChangeSelection(){return this.list.onDidChangeSelection}get onMouseDblClick(){return this.list.onMouseDblClick}get onPointer(){return this.list.onPointer}get onDidFocus(){return this.list.onDidFocus}get onDidDispose(){return this.list.onDidDispose}updateOptions(e){this.list.updateOptions(e)}splice(e,t,i=[]){this.list.splice(e,t,i)}getHTMLElement(){return this.domNode}style(e){const t=[];t.push(`.monaco-table.${this.domId} > .monaco-split-view2 .monaco-sash.vertical::before {\n\t\t\ttop: ${this.virtualDelegate.headerRowHeight+1}px;\n\t\t\theight: calc(100% - ${this.virtualDelegate.headerRowHeight}px);\n\t\t}`),this.styleElement.textContent=t.join(`\n`),this.list.style(e)}getSelectedElements(){return this.list.getSelectedElements()}getSelection(){return this.list.getSelection()}getFocus(){return this.list.getFocus()}dispose(){this.disposables.dispose()}}w1.InstanceCount=0;const BX={inputActiveOptionBorder:W.fromHex(\"#007ACC00\"),inputActiveOptionForeground:W.fromHex(\"#FFFFFF\"),inputActiveOptionBackground:W.fromHex(\"#0E639C50\")};class h_ extends tr{constructor(e){super(),this._onChange=this._register(new O),this.onChange=this._onChange.event,this._onKeyDown=this._register(new O),this.onKeyDown=this._onKeyDown.event,this._opts=Object.assign(Object.assign({},BX),e),this._checked=this._opts.isChecked;const t=[\"monaco-custom-toggle\"];this._opts.icon&&(this._icon=this._opts.icon,t.push(...Cn.asClassNameArray(this._icon))),this._opts.actionClassName&&t.push(...this._opts.actionClassName.split(\" \")),this._checked&&t.push(\"checked\"),this.domNode=document.createElement(\"div\"),this.domNode.title=this._opts.title,this.domNode.classList.add(...t),this._opts.notFocusable||(this.domNode.tabIndex=0),this.domNode.setAttribute(\"role\",\"checkbox\"),this.domNode.setAttribute(\"aria-checked\",String(this._checked)),this.domNode.setAttribute(\"aria-label\",this._opts.title),this.applyStyles(),this.onclick(this.domNode,i=>{this.enabled&&(this.checked=!this._checked,this._onChange.fire(!1),i.preventDefault())}),this.ignoreGesture(this.domNode),this.onkeydown(this.domNode,i=>{if(i.keyCode===10||i.keyCode===3){this.checked=!this._checked,this._onChange.fire(!0),i.preventDefault(),i.stopPropagation();return}this._onKeyDown.fire(i)})}get enabled(){return this.domNode.getAttribute(\"aria-disabled\")!==\"true\"}focus(){this.domNode.focus()}get checked(){return this._checked}set checked(e){this._checked=e,this.domNode.setAttribute(\"aria-checked\",String(this._checked)),this.domNode.classList.toggle(\"checked\",this._checked),this.applyStyles()}width(){return 2+2+2+16}style(e){e.inputActiveOptionBorder&&(this._opts.inputActiveOptionBorder=e.inputActiveOptionBorder),e.inputActiveOptionForeground&&(this._opts.inputActiveOptionForeground=e.inputActiveOptionForeground),e.inputActiveOptionBackground&&(this._opts.inputActiveOptionBackground=e.inputActiveOptionBackground),this.applyStyles()}applyStyles(){this.domNode&&(this.domNode.style.borderColor=this._checked&&this._opts.inputActiveOptionBorder?this._opts.inputActiveOptionBorder.toString():\"\",this.domNode.style.color=this._checked&&this._opts.inputActiveOptionForeground?this._opts.inputActiveOptionForeground.toString():\"inherit\",this.domNode.style.backgroundColor=this._checked&&this._opts.inputActiveOptionBackground?this._opts.inputActiveOptionBackground.toString():\"\")}enable(){this.domNode.setAttribute(\"aria-disabled\",String(!1))}disable(){this.domNode.setAttribute(\"aria-disabled\",String(!0))}}const WX=p(\"caseDescription\",\"Match Case\"),VX=p(\"wordsDescription\",\"Match Whole Word\"),HX=p(\"regexDescription\",\"Use Regular Expression\");class uF extends h_{constructor(e){super({icon:m.caseSensitive,title:WX+e.appendTitle,isChecked:e.isChecked,inputActiveOptionBorder:e.inputActiveOptionBorder,inputActiveOptionForeground:e.inputActiveOptionForeground,inputActiveOptionBackground:e.inputActiveOptionBackground})}}class gF extends h_{constructor(e){super({icon:m.wholeWord,title:VX+e.appendTitle,isChecked:e.isChecked,inputActiveOptionBorder:e.inputActiveOptionBorder,inputActiveOptionForeground:e.inputActiveOptionForeground,inputActiveOptionBackground:e.inputActiveOptionBackground})}}class fF extends h_{constructor(e){super({icon:m.regex,title:HX+e.appendTitle,isChecked:e.isChecked,inputActiveOptionBorder:e.inputActiveOptionBorder,inputActiveOptionForeground:e.inputActiveOptionForeground,inputActiveOptionBackground:e.inputActiveOptionBackground})}}function zX(o,e={}){const t=LE(e);return t.textContent=o,t}function UX(o,e={}){const t=LE(e);return pF(t,jX(o,!!e.renderCodeSegments),e.actionHandler,e.renderCodeSegments),t}function LE(o){const e=o.inline?\"span\":\"div\",t=document.createElement(e);return o.className&&(t.className=o.className),t}class $X{constructor(e){this.source=e,this.index=0}eos(){return this.index>=this.source.length}next(){const e=this.peek();return this.advance(),e}peek(){return this.source[this.index]}advance(){this.index++}}function pF(o,e,t,i){let n;if(e.type===2)n=document.createTextNode(e.content||\"\");else if(e.type===3)n=document.createElement(\"b\");else if(e.type===4)n=document.createElement(\"i\");else if(e.type===7&&i)n=document.createElement(\"code\");else if(e.type===5&&t){const s=document.createElement(\"a\");t.disposables.add(Ei(s,\"click\",r=>{t.callback(String(e.index),r)})),n=s}else e.type===8?n=document.createElement(\"br\"):e.type===1&&(n=o);n&&o!==n&&o.appendChild(n),n&&Array.isArray(e.children)&&e.children.forEach(s=>{pF(n,s,t,i)})}function jX(o,e){const t={type:1,children:[]};let i=0,n=t;const s=[],r=new $X(o);for(;!r.eos();){let a=r.next();const l=a===\"\\\\\"&&NL(r.peek(),e)!==0;if(l&&(a=r.next()),!l&&KX(a,e)&&a===r.peek()){r.advance(),n.type===2&&(n=s.pop());const c=NL(a,e);if(n.type===c||n.type===5&&c===6)n=s.pop();else{const d={type:c,children:[]};c===5&&(d.index=i,i++),n.children.push(d),s.push(n),n=d}}else if(a===`\n`)n.type===2&&(n=s.pop()),n.children.push({type:8});else if(n.type!==2){const c={type:2,content:a};n.children.push(c),s.push(n),n=c}else n.content+=a}return n.type===2&&(n=s.pop()),t}function KX(o,e){return NL(o,e)!==0}function NL(o,e){switch(o){case\"*\":return 3;case\"_\":return 4;case\"[\":return 5;case\"]\":return 6;case\"`\":return e?7:0;default:return 0}}class qX{constructor(e,t=0,i=e.length,n=t-1){this.items=e,this.start=t,this.end=i,this.index=n}current(){return this.index===this.start-1||this.index===this.end?null:this.items[this.index]}next(){return this.index=Math.min(this.index+1,this.end),this.current()}previous(){return this.index=Math.max(this.index-1,this.start-1),this.current()}first(){return this.index=this.start,this.current()}last(){return this.index=this.end-1,this.current()}}class GX{constructor(e=[],t=10){this._initialize(e),this._limit=t,this._onChange()}getHistory(){return this._elements}add(e){this._history.delete(e),this._history.add(e),this._onChange()}next(){return this._currentPosition()!==this._elements.length-1?this._navigator.next():null}previous(){return this._currentPosition()!==0?this._navigator.previous():null}current(){return this._navigator.current()}first(){return this._navigator.first()}last(){return this._navigator.last()}has(e){return this._history.has(e)}_onChange(){this._reduceToLimit();const e=this._elements;this._navigator=new qX(e,0,e.length,e.length)}_reduceToLimit(){const e=this._elements;e.length>this._limit&&this._initialize(e.slice(e.length-this._limit))}_currentPosition(){const e=this._navigator.current();return e?this._elements.indexOf(e):-1}_initialize(e){this._history=new Set;for(const t of e)this._history.add(t)}get _elements(){const e=[];return this._history.forEach(t=>e.push(t)),e}}const wf=se,ZX={inputBackground:W.fromHex(\"#3C3C3C\"),inputForeground:W.fromHex(\"#CCCCCC\"),inputValidationInfoBorder:W.fromHex(\"#55AAFF\"),inputValidationInfoBackground:W.fromHex(\"#063B49\"),inputValidationWarningBorder:W.fromHex(\"#B89500\"),inputValidationWarningBackground:W.fromHex(\"#352A05\"),inputValidationErrorBorder:W.fromHex(\"#BE1100\"),inputValidationErrorBackground:W.fromHex(\"#5A1D1D\")};class mF extends tr{constructor(e,t,i){var n;super(),this.state=\"idle\",this.maxHeight=Number.POSITIVE_INFINITY,this._onDidChange=this._register(new O),this.onDidChange=this._onDidChange.event,this._onDidHeightChange=this._register(new O),this.onDidHeightChange=this._onDidHeightChange.event,this.contextViewProvider=t,this.options=i||Object.create(null),ea(this.options,ZX,!1),this.message=null,this.placeholder=this.options.placeholder||\"\",this.tooltip=(n=this.options.tooltip)!==null&&n!==void 0?n:this.placeholder||\"\",this.ariaLabel=this.options.ariaLabel||\"\",this.inputBackground=this.options.inputBackground,this.inputForeground=this.options.inputForeground,this.inputBorder=this.options.inputBorder,this.inputValidationInfoBorder=this.options.inputValidationInfoBorder,this.inputValidationInfoBackground=this.options.inputValidationInfoBackground,this.inputValidationInfoForeground=this.options.inputValidationInfoForeground,this.inputValidationWarningBorder=this.options.inputValidationWarningBorder,this.inputValidationWarningBackground=this.options.inputValidationWarningBackground,this.inputValidationWarningForeground=this.options.inputValidationWarningForeground,this.inputValidationErrorBorder=this.options.inputValidationErrorBorder,this.inputValidationErrorBackground=this.options.inputValidationErrorBackground,this.inputValidationErrorForeground=this.options.inputValidationErrorForeground,this.options.validationOptions&&(this.validation=this.options.validationOptions.validation),this.element=G(e,wf(\".monaco-inputbox.idle\"));const s=this.options.flexibleHeight?\"textarea\":\"input\",r=G(this.element,wf(\".ibwrapper\"));if(this.input=G(r,wf(s+\".input.empty\")),this.input.setAttribute(\"autocorrect\",\"off\"),this.input.setAttribute(\"autocapitalize\",\"off\"),this.input.setAttribute(\"spellcheck\",\"false\"),this.onfocus(this.input,()=>this.element.classList.add(\"synthetic-focus\")),this.onblur(this.input,()=>this.element.classList.remove(\"synthetic-focus\")),this.options.flexibleHeight){this.maxHeight=typeof this.options.flexibleMaxHeight==\"number\"?this.options.flexibleMaxHeight:Number.POSITIVE_INFINITY,this.mirror=G(r,wf(\"div.mirror\")),this.mirror.innerText=\"\\xA0\",this.scrollableElement=new D4(this.element,{vertical:1}),this.options.flexibleWidth&&(this.input.setAttribute(\"wrap\",\"off\"),this.mirror.style.whiteSpace=\"pre\",this.mirror.style.wordWrap=\"initial\"),G(e,this.scrollableElement.getDomNode()),this._register(this.scrollableElement),this._register(this.scrollableElement.onScroll(c=>this.input.scrollTop=c.scrollTop));const a=this._register(new _t(document,\"selectionchange\")),l=pe.filter(a.event,()=>{const c=document.getSelection();return(c==null?void 0:c.anchorNode)===r});this._register(l(this.updateScrollDimensions,this)),this._register(this.onDidHeightChange(this.updateScrollDimensions,this))}else this.input.type=this.options.type||\"text\",this.input.setAttribute(\"wrap\",\"off\");this.ariaLabel&&this.input.setAttribute(\"aria-label\",this.ariaLabel),this.placeholder&&!this.options.showPlaceholderOnFocus&&this.setPlaceHolder(this.placeholder),this.tooltip&&this.setTooltip(this.tooltip),this.oninput(this.input,()=>this.onValueChange()),this.onblur(this.input,()=>this.onBlur()),this.onfocus(this.input,()=>this.onFocus()),this.ignoreGesture(this.input),setTimeout(()=>this.updateMirror(),0),this.options.actions&&(this.actionbar=this._register(new qr(this.element)),this.actionbar.push(this.options.actions,{icon:!0,label:!1})),this.applyStyles()}onBlur(){this._hideMessage(),this.options.showPlaceholderOnFocus&&this.input.setAttribute(\"placeholder\",\"\")}onFocus(){this._showMessage(),this.options.showPlaceholderOnFocus&&this.input.setAttribute(\"placeholder\",this.placeholder||\"\")}setPlaceHolder(e){this.placeholder=e,this.input.setAttribute(\"placeholder\",e)}setTooltip(e){this.tooltip=e,this.input.title=e}setAriaLabel(e){this.ariaLabel=e,e?this.input.setAttribute(\"aria-label\",this.ariaLabel):this.input.removeAttribute(\"aria-label\")}getAriaLabel(){return this.ariaLabel}get inputElement(){return this.input}get value(){return this.input.value}set value(e){this.input.value!==e&&(this.input.value=e,this.onValueChange())}get height(){return typeof this.cachedHeight==\"number\"?this.cachedHeight:Sy(this.element)}focus(){this.input.focus()}blur(){this.input.blur()}hasFocus(){return document.activeElement===this.input}select(e=null){this.input.select(),e&&(this.input.setSelectionRange(e.start,e.end),e.end===this.input.value.length&&(this.input.scrollLeft=this.input.scrollWidth))}isSelectionAtEnd(){return this.input.selectionEnd===this.input.value.length&&this.input.selectionStart===this.input.selectionEnd}enable(){this.input.removeAttribute(\"disabled\")}disable(){this.blur(),this.input.disabled=!0,this._hideMessage()}get width(){return ro(this.input)}set width(e){if(this.options.flexibleHeight&&this.options.flexibleWidth){let t=0;if(this.mirror){const i=parseFloat(this.mirror.style.paddingLeft||\"\")||0,n=parseFloat(this.mirror.style.paddingRight||\"\")||0;t=i+n}this.input.style.width=e-t+\"px\"}else this.input.style.width=e+\"px\";this.mirror&&(this.mirror.style.width=e+\"px\")}set paddingRight(e){this.input.style.width=`calc(100% - ${e}px)`,this.mirror&&(this.mirror.style.paddingRight=e+\"px\")}updateScrollDimensions(){if(typeof this.cachedContentHeight!=\"number\"||typeof this.cachedHeight!=\"number\"||!this.scrollableElement)return;const e=this.cachedContentHeight,t=this.cachedHeight,i=this.input.scrollTop;this.scrollableElement.setScrollDimensions({scrollHeight:e,height:t}),this.scrollableElement.setScrollPosition({scrollTop:i})}showMessage(e,t){this.message=e,this.element.classList.remove(\"idle\"),this.element.classList.remove(\"info\"),this.element.classList.remove(\"warning\"),this.element.classList.remove(\"error\"),this.element.classList.add(this.classForType(e.type));const i=this.stylesForType(this.message.type);this.element.style.border=i.border?`1px solid ${i.border}`:\"\",(this.hasFocus()||t)&&this._showMessage()}hideMessage(){this.message=null,this.element.classList.remove(\"info\"),this.element.classList.remove(\"warning\"),this.element.classList.remove(\"error\"),this.element.classList.add(\"idle\"),this._hideMessage(),this.applyStyles()}validate(){let e=null;return this.validation&&(e=this.validation(this.value),e?(this.inputElement.setAttribute(\"aria-invalid\",\"true\"),this.showMessage(e)):this.inputElement.hasAttribute(\"aria-invalid\")&&(this.inputElement.removeAttribute(\"aria-invalid\"),this.hideMessage())),e==null?void 0:e.type}stylesForType(e){switch(e){case 1:return{border:this.inputValidationInfoBorder,background:this.inputValidationInfoBackground,foreground:this.inputValidationInfoForeground};case 2:return{border:this.inputValidationWarningBorder,background:this.inputValidationWarningBackground,foreground:this.inputValidationWarningForeground};default:return{border:this.inputValidationErrorBorder,background:this.inputValidationErrorBackground,foreground:this.inputValidationErrorForeground}}}classForType(e){switch(e){case 1:return\"info\";case 2:return\"warning\";default:return\"error\"}}_showMessage(){if(!this.contextViewProvider||!this.message)return;let e;const t=()=>e.style.width=ro(this.element)+\"px\";this.contextViewProvider.showContextView({getAnchor:()=>this.element,anchorAlignment:1,render:n=>{if(!this.message)return null;e=G(n,wf(\".monaco-inputbox-container\")),t();const s={inline:!0,className:\"monaco-inputbox-message\"},r=this.message.formatContent?UX(this.message.content,s):zX(this.message.content,s);r.classList.add(this.classForType(this.message.type));const a=this.stylesForType(this.message.type);return r.style.backgroundColor=a.background?a.background.toString():\"\",r.style.color=a.foreground?a.foreground.toString():\"\",r.style.border=a.border?`1px solid ${a.border}`:\"\",G(e,r),null},onHide:()=>{this.state=\"closed\"},layout:t});let i;this.message.type===3?i=p(\"alertErrorMessage\",\"Error: {0}\",this.message.content):this.message.type===2?i=p(\"alertWarningMessage\",\"Warning: {0}\",this.message.content):i=p(\"alertInfoMessage\",\"Info: {0}\",this.message.content),un(i),this.state=\"open\"}_hideMessage(){!this.contextViewProvider||(this.state===\"open\"&&this.contextViewProvider.hideContextView(),this.state=\"idle\")}onValueChange(){this._onDidChange.fire(this.value),this.validate(),this.updateMirror(),this.input.classList.toggle(\"empty\",!this.value),this.state===\"open\"&&this.contextViewProvider&&this.contextViewProvider.layout()}updateMirror(){if(!this.mirror)return;const e=this.value,i=e.charCodeAt(e.length-1)===10?\" \":\"\";(e+i).replace(/\\u000c/g,\"\")?this.mirror.textContent=e+i:this.mirror.innerText=\"\\xA0\",this.layout()}style(e){this.inputBackground=e.inputBackground,this.inputForeground=e.inputForeground,this.inputBorder=e.inputBorder,this.inputValidationInfoBackground=e.inputValidationInfoBackground,this.inputValidationInfoForeground=e.inputValidationInfoForeground,this.inputValidationInfoBorder=e.inputValidationInfoBorder,this.inputValidationWarningBackground=e.inputValidationWarningBackground,this.inputValidationWarningForeground=e.inputValidationWarningForeground,this.inputValidationWarningBorder=e.inputValidationWarningBorder,this.inputValidationErrorBackground=e.inputValidationErrorBackground,this.inputValidationErrorForeground=e.inputValidationErrorForeground,this.inputValidationErrorBorder=e.inputValidationErrorBorder,this.applyStyles()}applyStyles(){const e=this.inputBackground?this.inputBackground.toString():\"\",t=this.inputForeground?this.inputForeground.toString():\"\",i=this.inputBorder?this.inputBorder.toString():\"\";this.element.style.backgroundColor=e,this.element.style.color=t,this.input.style.backgroundColor=\"inherit\",this.input.style.color=t,this.element.style.borderWidth=i?\"1px\":\"\",this.element.style.borderStyle=i?\"solid\":\"\",this.element.style.borderColor=i}layout(){if(!this.mirror)return;const e=this.cachedContentHeight;this.cachedContentHeight=Sy(this.mirror),e!==this.cachedContentHeight&&(this.cachedHeight=Math.min(this.cachedContentHeight,this.maxHeight),this.input.style.height=this.cachedHeight+\"px\",this._onDidHeightChange.fire(this.cachedContentHeight))}insertAtCursor(e){const t=this.inputElement,i=t.selectionStart,n=t.selectionEnd,s=t.value;i!==null&&n!==null&&(this.value=s.substr(0,i)+e+s.substr(n),t.setSelectionRange(i+1,i+1),this.layout())}dispose(){this._hideMessage(),this.message=null,this.actionbar&&this.actionbar.dispose(),super.dispose()}}class _F extends mF{constructor(e,t,i){const n=p({key:\"history.inputbox.hint\",comment:[\"Text will be prefixed with \\u21C5 plus a single space, then used as a hint where input field keeps history\"]},\"for history\"),s=` or \\u21C5 ${n}`,r=` (\\u21C5 ${n})`;super(e,t,i),this._onDidFocus=this._register(new O),this.onDidFocus=this._onDidFocus.event,this._onDidBlur=this._register(new O),this.onDidBlur=this._onDidBlur.event,this.history=new GX(i.history,100);const a=()=>{if(i.showHistoryHint&&i.showHistoryHint()&&!this.placeholder.endsWith(s)&&!this.placeholder.endsWith(r)&&this.history.getHistory().length){const l=this.placeholder.endsWith(\")\")?s:r,c=this.placeholder+l;i.showPlaceholderOnFocus&&document.activeElement!==this.input?this.placeholder=c:this.setPlaceHolder(c)}};this.observer=new MutationObserver((l,c)=>{l.forEach(d=>{d.target.textContent||a()})}),this.observer.observe(this.input,{attributeFilter:[\"class\"]}),this.onfocus(this.input,()=>a()),this.onblur(this.input,()=>{const l=c=>{if(this.placeholder.endsWith(c)){const d=this.placeholder.slice(0,this.placeholder.length-c.length);return i.showPlaceholderOnFocus?this.placeholder=d:this.setPlaceHolder(d),!0}else return!1};l(r)||l(s)})}dispose(){super.dispose(),this.observer&&(this.observer.disconnect(),this.observer=void 0)}addToHistory(){this.value&&this.value!==this.getCurrentValue()&&this.history.add(this.value)}showNextValue(){this.history.has(this.value)||this.addToHistory();let e=this.getNextValue();e&&(e=e===this.value?this.getNextValue():e),e&&(this.value=e,O0(this.value))}showPreviousValue(){this.history.has(this.value)||this.addToHistory();let e=this.getPreviousValue();e&&(e=e===this.value?this.getPreviousValue():e),e&&(this.value=e,O0(this.value))}onBlur(){super.onBlur(),this._onDidBlur.fire()}onFocus(){super.onFocus(),this._onDidFocus.fire()}getCurrentValue(){let e=this.history.current();return e||(e=this.history.last(),this.history.next()),e}getPreviousValue(){return this.history.previous()||this.history.first()}getNextValue(){return this.history.next()||this.history.last()}}const YX=p(\"defaultLabel\",\"input\");class XX extends tr{constructor(e,t,i,n){var s;super(),this._showOptionButtons=i,this.fixFocusOnOptionClickEnabled=!0,this.imeSessionInProgress=!1,this.additionalToggles=[],this._onDidOptionChange=this._register(new O),this.onDidOptionChange=this._onDidOptionChange.event,this._onKeyDown=this._register(new O),this.onKeyDown=this._onKeyDown.event,this._onMouseDown=this._register(new O),this.onMouseDown=this._onMouseDown.event,this._onInput=this._register(new O),this._onKeyUp=this._register(new O),this._onCaseSensitiveKeyDown=this._register(new O),this.onCaseSensitiveKeyDown=this._onCaseSensitiveKeyDown.event,this._onRegexKeyDown=this._register(new O),this.onRegexKeyDown=this._onRegexKeyDown.event,this._lastHighlightFindOptions=0,this.contextViewProvider=t,this.placeholder=n.placeholder||\"\",this.validation=n.validation,this.label=n.label||YX,this.inputActiveOptionBorder=n.inputActiveOptionBorder,this.inputActiveOptionForeground=n.inputActiveOptionForeground,this.inputActiveOptionBackground=n.inputActiveOptionBackground,this.inputBackground=n.inputBackground,this.inputForeground=n.inputForeground,this.inputBorder=n.inputBorder,this.inputValidationInfoBorder=n.inputValidationInfoBorder,this.inputValidationInfoBackground=n.inputValidationInfoBackground,this.inputValidationInfoForeground=n.inputValidationInfoForeground,this.inputValidationWarningBorder=n.inputValidationWarningBorder,this.inputValidationWarningBackground=n.inputValidationWarningBackground,this.inputValidationWarningForeground=n.inputValidationWarningForeground,this.inputValidationErrorBorder=n.inputValidationErrorBorder,this.inputValidationErrorBackground=n.inputValidationErrorBackground,this.inputValidationErrorForeground=n.inputValidationErrorForeground;const r=n.appendCaseSensitiveLabel||\"\",a=n.appendWholeWordsLabel||\"\",l=n.appendRegexLabel||\"\",c=n.history||[],d=!!n.flexibleHeight,h=!!n.flexibleWidth,u=n.flexibleMaxHeight;this.domNode=document.createElement(\"div\"),this.domNode.classList.add(\"monaco-findInput\"),this.inputBox=this._register(new _F(this.domNode,this.contextViewProvider,{placeholder:this.placeholder||\"\",ariaLabel:this.label||\"\",validationOptions:{validation:this.validation},inputBackground:this.inputBackground,inputForeground:this.inputForeground,inputBorder:this.inputBorder,inputValidationInfoBackground:this.inputValidationInfoBackground,inputValidationInfoForeground:this.inputValidationInfoForeground,inputValidationInfoBorder:this.inputValidationInfoBorder,inputValidationWarningBackground:this.inputValidationWarningBackground,inputValidationWarningForeground:this.inputValidationWarningForeground,inputValidationWarningBorder:this.inputValidationWarningBorder,inputValidationErrorBackground:this.inputValidationErrorBackground,inputValidationErrorForeground:this.inputValidationErrorForeground,inputValidationErrorBorder:this.inputValidationErrorBorder,history:c,showHistoryHint:n.showHistoryHint,flexibleHeight:d,flexibleWidth:h,flexibleMaxHeight:u})),this.regex=this._register(new fF({appendTitle:l,isChecked:!1,inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground})),this._register(this.regex.onChange(f=>{this._onDidOptionChange.fire(f),!f&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this._register(this.regex.onKeyDown(f=>{this._onRegexKeyDown.fire(f)})),this.wholeWords=this._register(new gF({appendTitle:a,isChecked:!1,inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground})),this._register(this.wholeWords.onChange(f=>{this._onDidOptionChange.fire(f),!f&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this.caseSensitive=this._register(new uF({appendTitle:r,isChecked:!1,inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground})),this._register(this.caseSensitive.onChange(f=>{this._onDidOptionChange.fire(f),!f&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this._register(this.caseSensitive.onKeyDown(f=>{this._onCaseSensitiveKeyDown.fire(f)}));const g=[this.caseSensitive.domNode,this.wholeWords.domNode,this.regex.domNode];this.onkeydown(this.domNode,f=>{if(f.equals(15)||f.equals(17)||f.equals(9)){const _=g.indexOf(document.activeElement);if(_>=0){let b=-1;f.equals(17)?b=(_+1)%g.length:f.equals(15)&&(_===0?b=g.length-1:b=_-1),f.equals(9)?(g[_].blur(),this.inputBox.focus()):b>=0&&g[b].focus(),ct.stop(f,!0)}}}),this.controls=document.createElement(\"div\"),this.controls.className=\"controls\",this.controls.style.display=this._showOptionButtons?\"block\":\"none\",this.controls.appendChild(this.caseSensitive.domNode),this.controls.appendChild(this.wholeWords.domNode),this.controls.appendChild(this.regex.domNode),this._showOptionButtons||(this.caseSensitive.domNode.style.display=\"none\",this.wholeWords.domNode.style.display=\"none\",this.regex.domNode.style.display=\"none\");for(const f of(s=n==null?void 0:n.additionalToggles)!==null&&s!==void 0?s:[])this._register(f),this.controls.appendChild(f.domNode),this._register(f.onChange(_=>{this._onDidOptionChange.fire(_),!_&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus()})),this.additionalToggles.push(f);this.additionalToggles.length>0&&(this.controls.style.display=\"block\"),this.inputBox.paddingRight=(this._showOptionButtons?this.caseSensitive.width()+this.wholeWords.width()+this.regex.width():0)+this.additionalToggles.reduce((f,_)=>f+_.width(),0),this.domNode.appendChild(this.controls),e==null||e.appendChild(this.domNode),this._register(q(this.inputBox.inputElement,\"compositionstart\",f=>{this.imeSessionInProgress=!0})),this._register(q(this.inputBox.inputElement,\"compositionend\",f=>{this.imeSessionInProgress=!1,this._onInput.fire()})),this.onkeydown(this.inputBox.inputElement,f=>this._onKeyDown.fire(f)),this.onkeyup(this.inputBox.inputElement,f=>this._onKeyUp.fire(f)),this.oninput(this.inputBox.inputElement,f=>this._onInput.fire()),this.onmousedown(this.inputBox.inputElement,f=>this._onMouseDown.fire(f))}get onDidChange(){return this.inputBox.onDidChange}enable(){this.domNode.classList.remove(\"disabled\"),this.inputBox.enable(),this.regex.enable(),this.wholeWords.enable(),this.caseSensitive.enable();for(const e of this.additionalToggles)e.enable()}disable(){this.domNode.classList.add(\"disabled\"),this.inputBox.disable(),this.regex.disable(),this.wholeWords.disable(),this.caseSensitive.disable();for(const e of this.additionalToggles)e.disable()}setFocusInputOnOptionClick(e){this.fixFocusOnOptionClickEnabled=e}setEnabled(e){e?this.enable():this.disable()}getValue(){return this.inputBox.value}setValue(e){this.inputBox.value!==e&&(this.inputBox.value=e)}style(e){this.inputActiveOptionBorder=e.inputActiveOptionBorder,this.inputActiveOptionForeground=e.inputActiveOptionForeground,this.inputActiveOptionBackground=e.inputActiveOptionBackground,this.inputBackground=e.inputBackground,this.inputForeground=e.inputForeground,this.inputBorder=e.inputBorder,this.inputValidationInfoBackground=e.inputValidationInfoBackground,this.inputValidationInfoForeground=e.inputValidationInfoForeground,this.inputValidationInfoBorder=e.inputValidationInfoBorder,this.inputValidationWarningBackground=e.inputValidationWarningBackground,this.inputValidationWarningForeground=e.inputValidationWarningForeground,this.inputValidationWarningBorder=e.inputValidationWarningBorder,this.inputValidationErrorBackground=e.inputValidationErrorBackground,this.inputValidationErrorForeground=e.inputValidationErrorForeground,this.inputValidationErrorBorder=e.inputValidationErrorBorder,this.applyStyles()}applyStyles(){if(this.domNode){const e={inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground};this.regex.style(e),this.wholeWords.style(e),this.caseSensitive.style(e);for(const i of this.additionalToggles)i.style(e);const t={inputBackground:this.inputBackground,inputForeground:this.inputForeground,inputBorder:this.inputBorder,inputValidationInfoBackground:this.inputValidationInfoBackground,inputValidationInfoForeground:this.inputValidationInfoForeground,inputValidationInfoBorder:this.inputValidationInfoBorder,inputValidationWarningBackground:this.inputValidationWarningBackground,inputValidationWarningForeground:this.inputValidationWarningForeground,inputValidationWarningBorder:this.inputValidationWarningBorder,inputValidationErrorBackground:this.inputValidationErrorBackground,inputValidationErrorForeground:this.inputValidationErrorForeground,inputValidationErrorBorder:this.inputValidationErrorBorder};this.inputBox.style(t)}}select(){this.inputBox.select()}focus(){this.inputBox.focus()}getCaseSensitive(){return this.caseSensitive.checked}setCaseSensitive(e){this.caseSensitive.checked=e}getWholeWords(){return this.wholeWords.checked}setWholeWords(e){this.wholeWords.checked=e}getRegex(){return this.regex.checked}setRegex(e){this.regex.checked=e,this.validate()}focusOnCaseSensitive(){this.caseSensitive.focus()}highlightFindOptions(){this.domNode.classList.remove(\"highlight-\"+this._lastHighlightFindOptions),this._lastHighlightFindOptions=1-this._lastHighlightFindOptions,this.domNode.classList.add(\"highlight-\"+this._lastHighlightFindOptions)}validate(){this.inputBox.validate()}showMessage(e){this.inputBox.showMessage(e)}clearMessage(){this.inputBox.hideMessage()}}var gd;(function(o){o[o.Unknown=0]=\"Unknown\",o[o.Twistie=1]=\"Twistie\",o[o.Element=2]=\"Element\",o[o.Filter=3]=\"Filter\"})(gd||(gd={}));class Ws extends Error{constructor(e,t){super(`TreeError [${e}] ${t}`)}}class DE{constructor(e){this.fn=e,this._map=new WeakMap}map(e){let t=this._map.get(e);return t||(t=this.fn(e),this._map.set(e,t)),t}}class Dl{constructor(e,t,i,n){this.originalStart=e,this.originalLength=t,this.modifiedStart=i,this.modifiedLength=n}getOriginalEnd(){return this.originalStart+this.originalLength}getModifiedEnd(){return this.modifiedStart+this.modifiedLength}}class kM{constructor(e){this.source=e}getElements(){const e=this.source,t=new Int32Array(e.length);for(let i=0,n=e.length;i<n;i++)t[i]=e.charCodeAt(i);return t}}function QX(o,e,t){return new kr(new kM(o),new kM(e)).ComputeDiff(t).changes}class Wh{static Assert(e,t){if(!e)throw new Error(t)}}class Vh{static Copy(e,t,i,n,s){for(let r=0;r<s;r++)i[n+r]=e[t+r]}static Copy2(e,t,i,n,s){for(let r=0;r<s;r++)i[n+r]=e[t+r]}}class xM{constructor(){this.m_changes=[],this.m_originalStart=1073741824,this.m_modifiedStart=1073741824,this.m_originalCount=0,this.m_modifiedCount=0}MarkNextChange(){(this.m_originalCount>0||this.m_modifiedCount>0)&&this.m_changes.push(new Dl(this.m_originalStart,this.m_originalCount,this.m_modifiedStart,this.m_modifiedCount)),this.m_originalCount=0,this.m_modifiedCount=0,this.m_originalStart=1073741824,this.m_modifiedStart=1073741824}AddOriginalElement(e,t){this.m_originalStart=Math.min(this.m_originalStart,e),this.m_modifiedStart=Math.min(this.m_modifiedStart,t),this.m_originalCount++}AddModifiedElement(e,t){this.m_originalStart=Math.min(this.m_originalStart,e),this.m_modifiedStart=Math.min(this.m_modifiedStart,t),this.m_modifiedCount++}getChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes}getReverseChanges(){return(this.m_originalCount>0||this.m_modifiedCount>0)&&this.MarkNextChange(),this.m_changes.reverse(),this.m_changes}}class kr{constructor(e,t,i=null){this.ContinueProcessingPredicate=i,this._originalSequence=e,this._modifiedSequence=t;const[n,s,r]=kr._getElements(e),[a,l,c]=kr._getElements(t);this._hasStrings=r&&c,this._originalStringElements=n,this._originalElementsOrHash=s,this._modifiedStringElements=a,this._modifiedElementsOrHash=l,this.m_forwardHistory=[],this.m_reverseHistory=[]}static _isStringArray(e){return e.length>0&&typeof e[0]==\"string\"}static _getElements(e){const t=e.getElements();if(kr._isStringArray(t)){const i=new Int32Array(t.length);for(let n=0,s=t.length;n<s;n++)i[n]=bE(t[n],0);return[t,i,!0]}return t instanceof Int32Array?[[],t,!1]:[[],new Int32Array(t),!1]}ElementsAreEqual(e,t){return this._originalElementsOrHash[e]!==this._modifiedElementsOrHash[t]?!1:this._hasStrings?this._originalStringElements[e]===this._modifiedStringElements[t]:!0}ElementsAreStrictEqual(e,t){if(!this.ElementsAreEqual(e,t))return!1;const i=kr._getStrictElement(this._originalSequence,e),n=kr._getStrictElement(this._modifiedSequence,t);return i===n}static _getStrictElement(e,t){return typeof e.getStrictElement==\"function\"?e.getStrictElement(t):null}OriginalElementsAreEqual(e,t){return this._originalElementsOrHash[e]!==this._originalElementsOrHash[t]?!1:this._hasStrings?this._originalStringElements[e]===this._originalStringElements[t]:!0}ModifiedElementsAreEqual(e,t){return this._modifiedElementsOrHash[e]!==this._modifiedElementsOrHash[t]?!1:this._hasStrings?this._modifiedStringElements[e]===this._modifiedStringElements[t]:!0}ComputeDiff(e){return this._ComputeDiff(0,this._originalElementsOrHash.length-1,0,this._modifiedElementsOrHash.length-1,e)}_ComputeDiff(e,t,i,n,s){const r=[!1];let a=this.ComputeDiffRecursive(e,t,i,n,r);return s&&(a=this.PrettifyChanges(a)),{quitEarly:r[0],changes:a}}ComputeDiffRecursive(e,t,i,n,s){for(s[0]=!1;e<=t&&i<=n&&this.ElementsAreEqual(e,i);)e++,i++;for(;t>=e&&n>=i&&this.ElementsAreEqual(t,n);)t--,n--;if(e>t||i>n){let h;return i<=n?(Wh.Assert(e===t+1,\"originalStart should only be one more than originalEnd\"),h=[new Dl(e,0,i,n-i+1)]):e<=t?(Wh.Assert(i===n+1,\"modifiedStart should only be one more than modifiedEnd\"),h=[new Dl(e,t-e+1,i,0)]):(Wh.Assert(e===t+1,\"originalStart should only be one more than originalEnd\"),Wh.Assert(i===n+1,\"modifiedStart should only be one more than modifiedEnd\"),h=[]),h}const r=[0],a=[0],l=this.ComputeRecursionPoint(e,t,i,n,r,a,s),c=r[0],d=a[0];if(l!==null)return l;if(!s[0]){const h=this.ComputeDiffRecursive(e,c,i,d,s);let u=[];return s[0]?u=[new Dl(c+1,t-(c+1)+1,d+1,n-(d+1)+1)]:u=this.ComputeDiffRecursive(c+1,t,d+1,n,s),this.ConcatenateChanges(h,u)}return[new Dl(e,t-e+1,i,n-i+1)]}WALKTRACE(e,t,i,n,s,r,a,l,c,d,h,u,g,f,_,b,v,C){let w=null,S=null,k=new xM,x=t,y=i,D=g[0]-b[0]-n,I=-1073741824,R=this.m_forwardHistory.length-1;do{const P=D+e;P===x||P<y&&c[P-1]<c[P+1]?(h=c[P+1],f=h-D-n,h<I&&k.MarkNextChange(),I=h,k.AddModifiedElement(h+1,f),D=P+1-e):(h=c[P-1]+1,f=h-D-n,h<I&&k.MarkNextChange(),I=h-1,k.AddOriginalElement(h,f+1),D=P-1-e),R>=0&&(c=this.m_forwardHistory[R],e=c[0],x=1,y=c.length-1)}while(--R>=-1);if(w=k.getReverseChanges(),C[0]){let P=g[0]+1,H=b[0]+1;if(w!==null&&w.length>0){const $=w[w.length-1];P=Math.max(P,$.getOriginalEnd()),H=Math.max(H,$.getModifiedEnd())}S=[new Dl(P,u-P+1,H,_-H+1)]}else{k=new xM,x=r,y=a,D=g[0]-b[0]-l,I=1073741824,R=v?this.m_reverseHistory.length-1:this.m_reverseHistory.length-2;do{const P=D+s;P===x||P<y&&d[P-1]>=d[P+1]?(h=d[P+1]-1,f=h-D-l,h>I&&k.MarkNextChange(),I=h+1,k.AddOriginalElement(h+1,f+1),D=P+1-s):(h=d[P-1],f=h-D-l,h>I&&k.MarkNextChange(),I=h,k.AddModifiedElement(h+1,f+1),D=P-1-s),R>=0&&(d=this.m_reverseHistory[R],s=d[0],x=1,y=d.length-1)}while(--R>=-1);S=k.getChanges()}return this.ConcatenateChanges(w,S)}ComputeRecursionPoint(e,t,i,n,s,r,a){let l=0,c=0,d=0,h=0,u=0,g=0;e--,i--,s[0]=0,r[0]=0,this.m_forwardHistory=[],this.m_reverseHistory=[];const f=t-e+(n-i),_=f+1,b=new Int32Array(_),v=new Int32Array(_),C=n-i,w=t-e,S=e-i,k=t-n,y=(w-C)%2===0;b[C]=e,v[w]=t,a[0]=!1;for(let D=1;D<=f/2+1;D++){let I=0,R=0;d=this.ClipDiagonalBound(C-D,D,C,_),h=this.ClipDiagonalBound(C+D,D,C,_);for(let H=d;H<=h;H+=2){H===d||H<h&&b[H-1]<b[H+1]?l=b[H+1]:l=b[H-1]+1,c=l-(H-C)-S;const $=l;for(;l<t&&c<n&&this.ElementsAreEqual(l+1,c+1);)l++,c++;if(b[H]=l,l+c>I+R&&(I=l,R=c),!y&&Math.abs(H-w)<=D-1&&l>=v[H])return s[0]=l,r[0]=c,$<=v[H]&&1447>0&&D<=1447+1?this.WALKTRACE(C,d,h,S,w,u,g,k,b,v,l,t,s,c,n,r,y,a):null}const P=(I-e+(R-i)-D)/2;if(this.ContinueProcessingPredicate!==null&&!this.ContinueProcessingPredicate(I,P))return a[0]=!0,s[0]=I,r[0]=R,P>0&&1447>0&&D<=1447+1?this.WALKTRACE(C,d,h,S,w,u,g,k,b,v,l,t,s,c,n,r,y,a):(e++,i++,[new Dl(e,t-e+1,i,n-i+1)]);u=this.ClipDiagonalBound(w-D,D,w,_),g=this.ClipDiagonalBound(w+D,D,w,_);for(let H=u;H<=g;H+=2){H===u||H<g&&v[H-1]>=v[H+1]?l=v[H+1]-1:l=v[H-1],c=l-(H-w)-k;const $=l;for(;l>e&&c>i&&this.ElementsAreEqual(l,c);)l--,c--;if(v[H]=l,y&&Math.abs(H-C)<=D&&l<=b[H])return s[0]=l,r[0]=c,$>=b[H]&&1447>0&&D<=1447+1?this.WALKTRACE(C,d,h,S,w,u,g,k,b,v,l,t,s,c,n,r,y,a):null}if(D<=1447){let H=new Int32Array(h-d+2);H[0]=C-d+1,Vh.Copy2(b,d,H,1,h-d+1),this.m_forwardHistory.push(H),H=new Int32Array(g-u+2),H[0]=w-u+1,Vh.Copy2(v,u,H,1,g-u+1),this.m_reverseHistory.push(H)}}return this.WALKTRACE(C,d,h,S,w,u,g,k,b,v,l,t,s,c,n,r,y,a)}PrettifyChanges(e){for(let t=0;t<e.length;t++){const i=e[t],n=t<e.length-1?e[t+1].originalStart:this._originalElementsOrHash.length,s=t<e.length-1?e[t+1].modifiedStart:this._modifiedElementsOrHash.length,r=i.originalLength>0,a=i.modifiedLength>0;for(;i.originalStart+i.originalLength<n&&i.modifiedStart+i.modifiedLength<s&&(!r||this.OriginalElementsAreEqual(i.originalStart,i.originalStart+i.originalLength))&&(!a||this.ModifiedElementsAreEqual(i.modifiedStart,i.modifiedStart+i.modifiedLength));){const c=this.ElementsAreStrictEqual(i.originalStart,i.modifiedStart);if(this.ElementsAreStrictEqual(i.originalStart+i.originalLength,i.modifiedStart+i.modifiedLength)&&!c)break;i.originalStart++,i.modifiedStart++}const l=[null];if(t<e.length-1&&this.ChangesOverlap(e[t],e[t+1],l)){e[t]=l[0],e.splice(t+1,1),t--;continue}}for(let t=e.length-1;t>=0;t--){const i=e[t];let n=0,s=0;if(t>0){const h=e[t-1];n=h.originalStart+h.originalLength,s=h.modifiedStart+h.modifiedLength}const r=i.originalLength>0,a=i.modifiedLength>0;let l=0,c=this._boundaryScore(i.originalStart,i.originalLength,i.modifiedStart,i.modifiedLength);for(let h=1;;h++){const u=i.originalStart-h,g=i.modifiedStart-h;if(u<n||g<s||r&&!this.OriginalElementsAreEqual(u,u+i.originalLength)||a&&!this.ModifiedElementsAreEqual(g,g+i.modifiedLength))break;const _=(u===n&&g===s?5:0)+this._boundaryScore(u,i.originalLength,g,i.modifiedLength);_>c&&(c=_,l=h)}i.originalStart-=l,i.modifiedStart-=l;const d=[null];if(t>0&&this.ChangesOverlap(e[t-1],e[t],d)){e[t-1]=d[0],e.splice(t,1),t++;continue}}if(this._hasStrings)for(let t=1,i=e.length;t<i;t++){const n=e[t-1],s=e[t],r=s.originalStart-n.originalStart-n.originalLength,a=n.originalStart,l=s.originalStart+s.originalLength,c=l-a,d=n.modifiedStart,h=s.modifiedStart+s.modifiedLength,u=h-d;if(r<5&&c<20&&u<20){const g=this._findBetterContiguousSequence(a,c,d,u,r);if(g){const[f,_]=g;(f!==n.originalStart+n.originalLength||_!==n.modifiedStart+n.modifiedLength)&&(n.originalLength=f-n.originalStart,n.modifiedLength=_-n.modifiedStart,s.originalStart=f+r,s.modifiedStart=_+r,s.originalLength=l-s.originalStart,s.modifiedLength=h-s.modifiedStart)}}}return e}_findBetterContiguousSequence(e,t,i,n,s){if(t<s||n<s)return null;const r=e+t-s+1,a=i+n-s+1;let l=0,c=0,d=0;for(let h=e;h<r;h++)for(let u=i;u<a;u++){const g=this._contiguousSequenceScore(h,u,s);g>0&&g>l&&(l=g,c=h,d=u)}return l>0?[c,d]:null}_contiguousSequenceScore(e,t,i){let n=0;for(let s=0;s<i;s++){if(!this.ElementsAreEqual(e+s,t+s))return 0;n+=this._originalStringElements[e+s].length}return n}_OriginalIsBoundary(e){return e<=0||e>=this._originalElementsOrHash.length-1?!0:this._hasStrings&&/^\\s*$/.test(this._originalStringElements[e])}_OriginalRegionIsBoundary(e,t){if(this._OriginalIsBoundary(e)||this._OriginalIsBoundary(e-1))return!0;if(t>0){const i=e+t;if(this._OriginalIsBoundary(i-1)||this._OriginalIsBoundary(i))return!0}return!1}_ModifiedIsBoundary(e){return e<=0||e>=this._modifiedElementsOrHash.length-1?!0:this._hasStrings&&/^\\s*$/.test(this._modifiedStringElements[e])}_ModifiedRegionIsBoundary(e,t){if(this._ModifiedIsBoundary(e)||this._ModifiedIsBoundary(e-1))return!0;if(t>0){const i=e+t;if(this._ModifiedIsBoundary(i-1)||this._ModifiedIsBoundary(i))return!0}return!1}_boundaryScore(e,t,i,n){const s=this._OriginalRegionIsBoundary(e,t)?1:0,r=this._ModifiedRegionIsBoundary(i,n)?1:0;return s+r}ConcatenateChanges(e,t){const i=[];if(e.length===0||t.length===0)return t.length>0?t:e;if(this.ChangesOverlap(e[e.length-1],t[0],i)){const n=new Array(e.length+t.length-1);return Vh.Copy(e,0,n,0,e.length-1),n[e.length-1]=i[0],Vh.Copy(t,1,n,e.length,t.length-1),n}else{const n=new Array(e.length+t.length);return Vh.Copy(e,0,n,0,e.length),Vh.Copy(t,0,n,e.length,t.length),n}}ChangesOverlap(e,t,i){if(Wh.Assert(e.originalStart<=t.originalStart,\"Left change is not less than or equal to right change\"),Wh.Assert(e.modifiedStart<=t.modifiedStart,\"Left change is not less than or equal to right change\"),e.originalStart+e.originalLength>=t.originalStart||e.modifiedStart+e.modifiedLength>=t.modifiedStart){const n=e.originalStart;let s=e.originalLength;const r=e.modifiedStart;let a=e.modifiedLength;return e.originalStart+e.originalLength>=t.originalStart&&(s=t.originalStart+t.originalLength-e.originalStart),e.modifiedStart+e.modifiedLength>=t.modifiedStart&&(a=t.modifiedStart+t.modifiedLength-e.modifiedStart),i[0]=new Dl(n,s,r,a),!0}else return i[0]=null,!1}ClipDiagonalBound(e,t,i,n){if(e>=0&&e<n)return e;const s=i,r=n-i-1,a=t%2===0;if(e<0){const l=s%2===0;return a===l?0:1}else{const l=r%2===0;return a===l?n-1:n-2}}}function kE(o){return typeof o==\"object\"&&\"visibility\"in o&&\"data\"in o}function lm(o){switch(o){case!0:return 1;case!1:return 0;default:return o}}function vS(o){return typeof o.collapsible==\"boolean\"}class JX{constructor(e,t,i,n={}){this.user=e,this.list=t,this.rootRef=[],this.eventBufferer=new Tx,this._onDidChangeCollapseState=new O,this.onDidChangeCollapseState=this.eventBufferer.wrapEvent(this._onDidChangeCollapseState.event),this._onDidChangeRenderNodeCount=new O,this.onDidChangeRenderNodeCount=this.eventBufferer.wrapEvent(this._onDidChangeRenderNodeCount.event),this._onDidSplice=new O,this.onDidSplice=this._onDidSplice.event,this.refilterDelayer=new $r(UP),this.collapseByDefault=typeof n.collapseByDefault==\"undefined\"?!1:n.collapseByDefault,this.filter=n.filter,this.autoExpandSingleChildren=typeof n.autoExpandSingleChildren==\"undefined\"?!1:n.autoExpandSingleChildren,this.root={parent:void 0,element:i,children:[],depth:0,visibleChildrenCount:0,visibleChildIndex:-1,collapsible:!1,collapsed:!1,renderNodeCount:0,visibility:1,visible:!0,filterData:void 0}}splice(e,t,i=Ue.empty(),n={}){if(e.length===0)throw new Ws(this.user,\"Invalid tree location\");n.diffIdentityProvider?this.spliceSmart(n.diffIdentityProvider,e,t,i,n):this.spliceSimple(e,t,i,n)}spliceSmart(e,t,i,n,s,r){var a;n===void 0&&(n=Ue.empty()),r===void 0&&(r=(a=s.diffDepth)!==null&&a!==void 0?a:0);const{parentNode:l}=this.getParentNodeWithListIndex(t);if(!l.lastDiffIds)return this.spliceSimple(t,i,n,s);const c=[...n],d=t[t.length-1],h=new kr({getElements:()=>l.lastDiffIds},{getElements:()=>[...l.children.slice(0,d),...c,...l.children.slice(d+i)].map(b=>e.getId(b.element).toString())}).ComputeDiff(!1);if(h.quitEarly)return l.lastDiffIds=void 0,this.spliceSimple(t,i,c,s);const u=t.slice(0,-1),g=(b,v,C)=>{if(r>0)for(let w=0;w<C;w++)b--,v--,this.spliceSmart(e,[...u,b,0],Number.MAX_SAFE_INTEGER,c[v].children,s,r-1)};let f=Math.min(l.children.length,d+i),_=c.length;for(const b of h.changes.sort((v,C)=>C.originalStart-v.originalStart))g(f,_,f-(b.originalStart+b.originalLength)),f=b.originalStart,_=b.modifiedStart-d,this.spliceSimple([...u,f],b.originalLength,Ue.slice(c,_,_+b.modifiedLength),s);g(f,_,f)}spliceSimple(e,t,i=Ue.empty(),{onDidCreateNode:n,onDidDeleteNode:s,diffIdentityProvider:r}){const{parentNode:a,listIndex:l,revealed:c,visible:d}=this.getParentNodeWithListIndex(e),h=[],u=Ue.map(i,y=>this.createTreeNode(y,a,a.visible?1:0,c,h,n)),g=e[e.length-1],f=a.children.length>0;let _=0;for(let y=g;y>=0&&y<a.children.length;y--){const D=a.children[y];if(D.visible){_=D.visibleChildIndex;break}}const b=[];let v=0,C=0;for(const y of u)b.push(y),C+=y.renderNodeCount,y.visible&&(y.visibleChildIndex=_+v++);const w=CT(a.children,g,t,b);r?a.lastDiffIds?CT(a.lastDiffIds,g,t,b.map(y=>r.getId(y.element).toString())):a.lastDiffIds=a.children.map(y=>r.getId(y.element).toString()):a.lastDiffIds=void 0;let S=0;for(const y of w)y.visible&&S++;if(S!==0)for(let y=g+b.length;y<a.children.length;y++){const D=a.children[y];D.visible&&(D.visibleChildIndex-=S)}if(a.visibleChildrenCount+=v-S,c&&d){const y=w.reduce((D,I)=>D+(I.visible?I.renderNodeCount:0),0);this._updateAncestorsRenderNodeCount(a,C-y),this.list.splice(l,y,h)}if(w.length>0&&s){const y=D=>{s(D),D.children.forEach(y)};w.forEach(y)}this._onDidSplice.fire({insertedNodes:b,deletedNodes:w});const k=a.children.length>0;f!==k&&this.setCollapsible(e.slice(0,-1),k);let x=a;for(;x;){if(x.visibility===2){this.refilterDelayer.trigger(()=>this.refilter());break}x=x.parent}}rerender(e){if(e.length===0)throw new Ws(this.user,\"Invalid tree location\");const{node:t,listIndex:i,revealed:n}=this.getTreeNodeWithListIndex(e);t.visible&&n&&this.list.splice(i,1,[t])}has(e){return this.hasTreeNode(e)}getListIndex(e){const{listIndex:t,visible:i,revealed:n}=this.getTreeNodeWithListIndex(e);return i&&n?t:-1}getListRenderCount(e){return this.getTreeNode(e).renderNodeCount}isCollapsible(e){return this.getTreeNode(e).collapsible}setCollapsible(e,t){const i=this.getTreeNode(e);typeof t==\"undefined\"&&(t=!i.collapsible);const n={collapsible:t};return this.eventBufferer.bufferEvents(()=>this._setCollapseState(e,n))}isCollapsed(e){return this.getTreeNode(e).collapsed}setCollapsed(e,t,i){const n=this.getTreeNode(e);typeof t==\"undefined\"&&(t=!n.collapsed);const s={collapsed:t,recursive:i||!1};return this.eventBufferer.bufferEvents(()=>this._setCollapseState(e,s))}_setCollapseState(e,t){const{node:i,listIndex:n,revealed:s}=this.getTreeNodeWithListIndex(e),r=this._setListNodeCollapseState(i,n,s,t);if(i!==this.root&&this.autoExpandSingleChildren&&r&&!vS(t)&&i.collapsible&&!i.collapsed&&!t.recursive){let a=-1;for(let l=0;l<i.children.length;l++)if(i.children[l].visible)if(a>-1){a=-1;break}else a=l;a>-1&&this._setCollapseState([...e,a],t)}return r}_setListNodeCollapseState(e,t,i,n){const s=this._setNodeCollapseState(e,n,!1);if(!i||!e.visible||!s)return s;const r=e.renderNodeCount,a=this.updateNodeAfterCollapseChange(e),l=r-(t===-1?0:1);return this.list.splice(t+1,l,a.slice(1)),s}_setNodeCollapseState(e,t,i){let n;if(e===this.root?n=!1:(vS(t)?(n=e.collapsible!==t.collapsible,e.collapsible=t.collapsible):e.collapsible?(n=e.collapsed!==t.collapsed,e.collapsed=t.collapsed):n=!1,n&&this._onDidChangeCollapseState.fire({node:e,deep:i})),!vS(t)&&t.recursive)for(const s of e.children)n=this._setNodeCollapseState(s,t,!0)||n;return n}expandTo(e){this.eventBufferer.bufferEvents(()=>{let t=this.getTreeNode(e);for(;t.parent;)t=t.parent,e=e.slice(0,e.length-1),t.collapsed&&this._setCollapseState(e,{collapsed:!1,recursive:!1})})}refilter(){const e=this.root.renderNodeCount,t=this.updateNodeAfterFilterChange(this.root);this.list.splice(0,e,t),this.refilterDelayer.cancel()}createTreeNode(e,t,i,n,s,r){const a={parent:t,element:e.element,children:[],depth:t.depth+1,visibleChildrenCount:0,visibleChildIndex:-1,collapsible:typeof e.collapsible==\"boolean\"?e.collapsible:typeof e.collapsed!=\"undefined\",collapsed:typeof e.collapsed==\"undefined\"?this.collapseByDefault:e.collapsed,renderNodeCount:1,visibility:1,visible:!0,filterData:void 0},l=this._filterNode(a,i);a.visibility=l,n&&s.push(a);const c=e.children||Ue.empty(),d=n&&l!==0&&!a.collapsed,h=Ue.map(c,f=>this.createTreeNode(f,a,l,d,s,r));let u=0,g=1;for(const f of h)a.children.push(f),g+=f.renderNodeCount,f.visible&&(f.visibleChildIndex=u++);return a.collapsible=a.collapsible||a.children.length>0,a.visibleChildrenCount=u,a.visible=l===2?u>0:l===1,a.visible?a.collapsed||(a.renderNodeCount=g):(a.renderNodeCount=0,n&&s.pop()),r==null||r(a),a}updateNodeAfterCollapseChange(e){const t=e.renderNodeCount,i=[];return this._updateNodeAfterCollapseChange(e,i),this._updateAncestorsRenderNodeCount(e.parent,i.length-t),i}_updateNodeAfterCollapseChange(e,t){if(e.visible===!1)return 0;if(t.push(e),e.renderNodeCount=1,!e.collapsed)for(const i of e.children)e.renderNodeCount+=this._updateNodeAfterCollapseChange(i,t);return this._onDidChangeRenderNodeCount.fire(e),e.renderNodeCount}updateNodeAfterFilterChange(e){const t=e.renderNodeCount,i=[];return this._updateNodeAfterFilterChange(e,e.visible?1:0,i),this._updateAncestorsRenderNodeCount(e.parent,i.length-t),i}_updateNodeAfterFilterChange(e,t,i,n=!0){let s;if(e!==this.root){if(s=this._filterNode(e,t),s===0)return e.visible=!1,e.renderNodeCount=0,!1;n&&i.push(e)}const r=i.length;e.renderNodeCount=e===this.root?0:1;let a=!1;if(!e.collapsed||s!==0){let l=0;for(const c of e.children)a=this._updateNodeAfterFilterChange(c,s,i,n&&!e.collapsed)||a,c.visible&&(c.visibleChildIndex=l++);e.visibleChildrenCount=l}else e.visibleChildrenCount=0;return e!==this.root&&(e.visible=s===2?a:s===1,e.visibility=s),e.visible?e.collapsed||(e.renderNodeCount+=i.length-r):(e.renderNodeCount=0,n&&i.pop()),this._onDidChangeRenderNodeCount.fire(e),e.visible}_updateAncestorsRenderNodeCount(e,t){if(t!==0)for(;e;)e.renderNodeCount+=t,this._onDidChangeRenderNodeCount.fire(e),e=e.parent}_filterNode(e,t){const i=this.filter?this.filter.filter(e.element,t):1;return typeof i==\"boolean\"?(e.filterData=void 0,i?1:0):kE(i)?(e.filterData=i.data,lm(i.visibility)):(e.filterData=void 0,lm(i))}hasTreeNode(e,t=this.root){if(!e||e.length===0)return!0;const[i,...n]=e;return i<0||i>t.children.length?!1:this.hasTreeNode(n,t.children[i])}getTreeNode(e,t=this.root){if(!e||e.length===0)return t;const[i,...n]=e;if(i<0||i>t.children.length)throw new Ws(this.user,\"Invalid tree location\");return this.getTreeNode(n,t.children[i])}getTreeNodeWithListIndex(e){if(e.length===0)return{node:this.root,listIndex:-1,revealed:!0,visible:!1};const{parentNode:t,listIndex:i,revealed:n,visible:s}=this.getParentNodeWithListIndex(e),r=e[e.length-1];if(r<0||r>t.children.length)throw new Ws(this.user,\"Invalid tree location\");const a=t.children[r];return{node:a,listIndex:i,revealed:n,visible:s&&a.visible}}getParentNodeWithListIndex(e,t=this.root,i=0,n=!0,s=!0){const[r,...a]=e;if(r<0||r>t.children.length)throw new Ws(this.user,\"Invalid tree location\");for(let l=0;l<r;l++)i+=t.children[l].renderNodeCount;return n=n&&!t.collapsed,s=s&&t.visible,a.length===0?{parentNode:t,listIndex:i,revealed:n,visible:s}:this.getParentNodeWithListIndex(a,t.children[r],i+1,n,s)}getNode(e=[]){return this.getTreeNode(e)}getNodeLocation(e){const t=[];let i=e;for(;i.parent;)t.push(i.parent.children.indexOf(i)),i=i.parent;return t.reverse()}getParentNodeLocation(e){if(e.length!==0)return e.length===1?[]:fW(e)[0]}getFirstElementChild(e){const t=this.getTreeNode(e);if(t.children.length!==0)return t.children[0].element}}class eQ{constructor(){this.map=new Map}add(e,t){let i=this.map.get(e);i||(i=new Set,this.map.set(e,i)),i.add(t)}delete(e,t){const i=this.map.get(e);!i||(i.delete(t),i.size===0&&this.map.delete(e))}forEach(e,t){const i=this.map.get(e);!i||i.forEach(t)}}globalThis&&globalThis.__awaiter;class tQ extends s_{constructor(e){super(e.elements.map(t=>t.element)),this.data=e}}function CS(o){return o instanceof s_?new tQ(o):o}class iQ{constructor(e,t){this.modelProvider=e,this.dnd=t,this.autoExpandDisposable=z.None}getDragURI(e){return this.dnd.getDragURI(e.element)}getDragLabel(e,t){if(this.dnd.getDragLabel)return this.dnd.getDragLabel(e.map(i=>i.element),t)}onDragStart(e,t){var i,n;(n=(i=this.dnd).onDragStart)===null||n===void 0||n.call(i,CS(e),t)}onDragOver(e,t,i,n,s=!0){const r=this.dnd.onDragOver(CS(e),t&&t.element,i,n),a=this.autoExpandNode!==t;if(a&&(this.autoExpandDisposable.dispose(),this.autoExpandNode=t),typeof t==\"undefined\")return r;if(a&&typeof r!=\"boolean\"&&r.autoExpand&&(this.autoExpandDisposable=Hd(()=>{const u=this.modelProvider(),g=u.getNodeLocation(t);u.isCollapsed(g)&&u.setCollapsed(g,!1),this.autoExpandNode=void 0},500)),typeof r==\"boolean\"||!r.accept||typeof r.bubble==\"undefined\"||r.feedback){if(!s){const u=typeof r==\"boolean\"?r:r.accept,g=typeof r==\"boolean\"?void 0:r.effect;return{accept:u,effect:g,feedback:[i]}}return r}if(r.bubble===1){const u=this.modelProvider(),g=u.getNodeLocation(t),f=u.getParentNodeLocation(g),_=u.getNode(f),b=f&&u.getListIndex(f);return this.onDragOver(e,_,b,n,!1)}const l=this.modelProvider(),c=l.getNodeLocation(t),d=l.getListIndex(c),h=l.getListRenderCount(c);return Object.assign(Object.assign({},r),{feedback:mn(d,d+h)})}drop(e,t,i,n){this.autoExpandDisposable.dispose(),this.autoExpandNode=void 0,this.dnd.drop(CS(e),t&&t.element,i,n)}onDragEnd(e){var t,i;(i=(t=this.dnd).onDragEnd)===null||i===void 0||i.call(t,e)}}function nQ(o,e){return e&&Object.assign(Object.assign({},e),{identityProvider:e.identityProvider&&{getId(t){return e.identityProvider.getId(t.element)}},dnd:e.dnd&&new iQ(o,e.dnd),multipleSelectionController:e.multipleSelectionController&&{isSelectionSingleChangeEvent(t){return e.multipleSelectionController.isSelectionSingleChangeEvent(Object.assign(Object.assign({},t),{element:t.element}))},isSelectionRangeChangeEvent(t){return e.multipleSelectionController.isSelectionRangeChangeEvent(Object.assign(Object.assign({},t),{element:t.element}))}},accessibilityProvider:e.accessibilityProvider&&Object.assign(Object.assign({},e.accessibilityProvider),{getSetSize(t){const i=o(),n=i.getNodeLocation(t),s=i.getParentNodeLocation(n);return i.getNode(s).visibleChildrenCount},getPosInSet(t){return t.visibleChildIndex+1},isChecked:e.accessibilityProvider&&e.accessibilityProvider.isChecked?t=>e.accessibilityProvider.isChecked(t.element):void 0,getRole:e.accessibilityProvider&&e.accessibilityProvider.getRole?t=>e.accessibilityProvider.getRole(t.element):()=>\"treeitem\",getAriaLabel(t){return e.accessibilityProvider.getAriaLabel(t.element)},getWidgetAriaLabel(){return e.accessibilityProvider.getWidgetAriaLabel()},getWidgetRole:e.accessibilityProvider&&e.accessibilityProvider.getWidgetRole?()=>e.accessibilityProvider.getWidgetRole():()=>\"tree\",getAriaLevel:e.accessibilityProvider&&e.accessibilityProvider.getAriaLevel?t=>e.accessibilityProvider.getAriaLevel(t.element):t=>t.depth,getActiveDescendantId:e.accessibilityProvider.getActiveDescendantId&&(t=>e.accessibilityProvider.getActiveDescendantId(t.element))}),keyboardNavigationLabelProvider:e.keyboardNavigationLabelProvider&&Object.assign(Object.assign({},e.keyboardNavigationLabelProvider),{getKeyboardNavigationLabel(t){return e.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(t.element)}})})}class xE{constructor(e){this.delegate=e}getHeight(e){return this.delegate.getHeight(e.element)}getTemplateId(e){return this.delegate.getTemplateId(e.element)}hasDynamicHeight(e){return!!this.delegate.hasDynamicHeight&&this.delegate.hasDynamicHeight(e.element)}setDynamicHeight(e,t){var i,n;(n=(i=this.delegate).setDynamicHeight)===null||n===void 0||n.call(i,e.element,t)}}var cm;(function(o){o.None=\"none\",o.OnHover=\"onHover\",o.Always=\"always\"})(cm||(cm={}));class sQ{constructor(e,t=[]){this._elements=t,this.disposables=new ee,this.onDidChange=pe.forEach(e,i=>this._elements=i,this.disposables)}get elements(){return this._elements}dispose(){this.disposables.dispose()}}class dm{constructor(e,t,i,n,s={}){var r;this.renderer=e,this.modelProvider=t,this.activeNodes=n,this.renderedElements=new Map,this.renderedNodes=new Map,this.indent=dm.DefaultIndent,this.hideTwistiesOfChildlessElements=!1,this.shouldRenderIndentGuides=!1,this.renderedIndentGuides=new eQ,this.activeIndentNodes=new Set,this.indentGuidesDisposable=z.None,this.disposables=new ee,this.templateId=e.templateId,this.updateOptions(s),pe.map(i,a=>a.node)(this.onDidChangeNodeTwistieState,this,this.disposables),(r=e.onDidChangeTwistieState)===null||r===void 0||r.call(e,this.onDidChangeTwistieState,this,this.disposables)}updateOptions(e={}){if(typeof e.indent!=\"undefined\"&&(this.indent=qn(e.indent,0,40)),typeof e.renderIndentGuides!=\"undefined\"){const t=e.renderIndentGuides!==cm.None;if(t!==this.shouldRenderIndentGuides&&(this.shouldRenderIndentGuides=t,this.indentGuidesDisposable.dispose(),t)){const i=new ee;this.activeNodes.onDidChange(this._onDidChangeActiveNodes,this,i),this.indentGuidesDisposable=i,this._onDidChangeActiveNodes(this.activeNodes.elements)}}typeof e.hideTwistiesOfChildlessElements!=\"undefined\"&&(this.hideTwistiesOfChildlessElements=e.hideTwistiesOfChildlessElements)}renderTemplate(e){const t=G(e,se(\".monaco-tl-row\")),i=G(t,se(\".monaco-tl-indent\")),n=G(t,se(\".monaco-tl-twistie\")),s=G(t,se(\".monaco-tl-contents\")),r=this.renderer.renderTemplate(s);return{container:e,indent:i,twistie:n,indentGuidesDisposable:z.None,templateData:r}}renderElement(e,t,i,n){typeof n==\"number\"&&(this.renderedNodes.set(e,{templateData:i,height:n}),this.renderedElements.set(e.element,e));const s=dm.DefaultIndent+(e.depth-1)*this.indent;i.twistie.style.paddingLeft=`${s}px`,i.indent.style.width=`${s+this.indent-16}px`,this.renderTwistie(e,i),typeof n==\"number\"&&this.renderIndentGuides(e,i),this.renderer.renderElement(e,t,i.templateData,n)}disposeElement(e,t,i,n){var s,r;i.indentGuidesDisposable.dispose(),(r=(s=this.renderer).disposeElement)===null||r===void 0||r.call(s,e,t,i.templateData,n),typeof n==\"number\"&&(this.renderedNodes.delete(e),this.renderedElements.delete(e.element))}disposeTemplate(e){this.renderer.disposeTemplate(e.templateData)}onDidChangeTwistieState(e){const t=this.renderedElements.get(e);!t||this.onDidChangeNodeTwistieState(t)}onDidChangeNodeTwistieState(e){const t=this.renderedNodes.get(e);!t||(this.renderTwistie(e,t.templateData),this._onDidChangeActiveNodes(this.activeNodes.elements),this.renderIndentGuides(e,t.templateData))}renderTwistie(e,t){t.twistie.classList.remove(...m.treeItemExpanded.classNamesArray);let i=!1;this.renderer.renderTwistie&&(i=this.renderer.renderTwistie(e.element,t.twistie)),e.collapsible&&(!this.hideTwistiesOfChildlessElements||e.visibleChildrenCount>0)?(i||t.twistie.classList.add(...m.treeItemExpanded.classNamesArray),t.twistie.classList.add(\"collapsible\"),t.twistie.classList.toggle(\"collapsed\",e.collapsed)):t.twistie.classList.remove(\"collapsible\",\"collapsed\"),e.collapsible?t.container.setAttribute(\"aria-expanded\",String(!e.collapsed)):t.container.removeAttribute(\"aria-expanded\")}renderIndentGuides(e,t){if(Ii(t.indent),t.indentGuidesDisposable.dispose(),!this.shouldRenderIndentGuides)return;const i=new ee,n=this.modelProvider();let s=e;for(;;){const r=n.getNodeLocation(s),a=n.getParentNodeLocation(r);if(!a)break;const l=n.getNode(a),c=se(\".indent-guide\",{style:`width: ${this.indent}px`});this.activeIndentNodes.has(l)&&c.classList.add(\"active\"),t.indent.childElementCount===0?t.indent.appendChild(c):t.indent.insertBefore(c,t.indent.firstElementChild),this.renderedIndentGuides.add(l,c),i.add(ze(()=>this.renderedIndentGuides.delete(l,c))),s=l}t.indentGuidesDisposable=i}_onDidChangeActiveNodes(e){if(!this.shouldRenderIndentGuides)return;const t=new Set,i=this.modelProvider();e.forEach(n=>{const s=i.getNodeLocation(n);try{const r=i.getParentNodeLocation(s);n.collapsible&&n.children.length>0&&!n.collapsed?t.add(n):r&&t.add(i.getNode(r))}catch(r){}}),this.activeIndentNodes.forEach(n=>{t.has(n)||this.renderedIndentGuides.forEach(n,s=>s.classList.remove(\"active\"))}),t.forEach(n=>{this.activeIndentNodes.has(n)||this.renderedIndentGuides.forEach(n,s=>s.classList.add(\"active\"))}),this.activeIndentNodes=t}dispose(){this.renderedNodes.clear(),this.renderedElements.clear(),this.indentGuidesDisposable.dispose(),et(this.disposables)}}dm.DefaultIndent=8;class oQ{constructor(e,t,i){this.tree=e,this.keyboardNavigationLabelProvider=t,this._filter=i,this._totalCount=0,this._matchCount=0,this._pattern=\"\",this._lowercasePattern=\"\",this.disposables=new ee,e.onWillRefilter(this.reset,this,this.disposables)}get totalCount(){return this._totalCount}get matchCount(){return this._matchCount}filter(e,t){let i=1;if(this._filter){const r=this._filter.filter(e,t);if(typeof r==\"boolean\"?i=r?1:0:kE(r)?i=lm(r.visibility):i=r,i===0)return!1}if(this._totalCount++,!this._pattern)return this._matchCount++,{data:jo.Default,visibility:i};const n=this.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(e),s=Array.isArray(n)?n:[n];for(const r of s){const a=r&&r.toString();if(typeof a==\"undefined\")return{data:jo.Default,visibility:i};const l=im(this._pattern,this._lowercasePattern,0,a,a.toLowerCase(),0,{firstMatchCanBeWeak:!0,boostFullMatch:!0});if(l)return this._matchCount++,s.length===1?{data:l,visibility:i}:{data:{label:a,score:l},visibility:i}}return this.tree.findMode===Or.Filter?2:{data:jo.Default,visibility:i}}reset(){this._totalCount=0,this._matchCount=0}dispose(){et(this.disposables)}}var Or;(function(o){o[o.Highlight=0]=\"Highlight\",o[o.Filter=1]=\"Filter\"})(Or||(Or={}));class rQ{constructor(e,t,i,n,s){var r;this.tree=e,this.view=i,this.filter=n,this.contextViewProvider=s,this._pattern=\"\",this.width=0,this._onDidChangeMode=new O,this.onDidChangeMode=this._onDidChangeMode.event,this._onDidChangePattern=new O,this._onDidChangeOpenState=new O,this.onDidChangeOpenState=this._onDidChangeOpenState.event,this.enabledDisposables=new ee,this.disposables=new ee,this._mode=(r=e.options.defaultFindMode)!==null&&r!==void 0?r:Or.Highlight,t.onDidSplice(this.onDidSpliceModel,this,this.disposables)}get pattern(){return this._pattern}get mode(){return this._mode}set mode(e){e!==this._mode&&(this._mode=e,this.widget&&(this.widget.mode=this._mode),this.tree.refilter(),this.render(),this._onDidChangeMode.fire(e))}onDidSpliceModel(){!this.widget||this.pattern.length===0||(this.tree.refilter(),this.render())}render(){var e,t;const i=this.filter.totalCount>0&&this.filter.matchCount===0;this.pattern&&i?(e=this.widget)===null||e===void 0||e.showMessage({type:2,content:p(\"not found\",\"No elements found.\")}):(t=this.widget)===null||t===void 0||t.clearMessage()}shouldAllowFocus(e){return!this.widget||!this.pattern||this._mode===Or.Filter||this.filter.totalCount>0&&this.filter.matchCount<=1?!0:!jo.isDefault(e.filterData)}style(e){var t;this.styles=e,(t=this.widget)===null||t===void 0||t.style(e)}layout(e){var t;this.width=e,(t=this.widget)===null||t===void 0||t.layout(e)}dispose(){this._onDidChangePattern.dispose(),this.enabledDisposables.dispose(),this.disposables.dispose()}}function IM(o){let e=gd.Unknown;return Cw(o.browserEvent.target,\"monaco-tl-twistie\",\"monaco-tl-row\")?e=gd.Twistie:Cw(o.browserEvent.target,\"monaco-tl-contents\",\"monaco-tl-row\")?e=gd.Element:Cw(o.browserEvent.target,\"monaco-tree-type-filter\",\"monaco-list\")&&(e=gd.Filter),{browserEvent:o.browserEvent,element:o.element?o.element.element:null,target:e}}function l0(o,e){e(o),o.children.forEach(t=>l0(t,e))}class wS{constructor(e,t){this.getFirstViewElementWithTrait=e,this.identityProvider=t,this.nodes=[],this._onDidChange=new O,this.onDidChange=this._onDidChange.event}get nodeSet(){return this._nodeSet||(this._nodeSet=this.createNodeSet()),this._nodeSet}set(e,t){!(t!=null&&t.__forceEvent)&&ys(this.nodes,e)||this._set(e,!1,t)}_set(e,t,i){if(this.nodes=[...e],this.elements=void 0,this._nodeSet=void 0,!t){const n=this;this._onDidChange.fire({get elements(){return n.get()},browserEvent:i})}}get(){return this.elements||(this.elements=this.nodes.map(e=>e.element)),[...this.elements]}getNodes(){return this.nodes}has(e){return this.nodeSet.has(e)}onDidModelSplice({insertedNodes:e,deletedNodes:t}){if(!this.identityProvider){const l=this.createNodeSet(),c=d=>l.delete(d);t.forEach(d=>l0(d,c)),this.set([...l.values()]);return}const i=new Set,n=l=>i.add(this.identityProvider.getId(l.element).toString());t.forEach(l=>l0(l,n));const s=new Map,r=l=>s.set(this.identityProvider.getId(l.element).toString(),l);e.forEach(l=>l0(l,r));const a=[];for(const l of this.nodes){const c=this.identityProvider.getId(l.element).toString();if(!i.has(c))a.push(l);else{const h=s.get(c);h&&a.push(h)}}if(this.nodes.length>0&&a.length===0){const l=this.getFirstViewElementWithTrait();l&&a.push(l)}this._set(a,!0)}createNodeSet(){const e=new Set;for(const t of this.nodes)e.add(t);return e}}class aQ extends H5{constructor(e,t){super(e),this.tree=t}onViewPointer(e){if(F5(e.browserEvent.target)||qd(e.browserEvent.target)||bu(e.browserEvent.target))return;const t=e.element;if(!t)return super.onViewPointer(e);if(this.isSelectionRangeChangeEvent(e)||this.isSelectionSingleChangeEvent(e))return super.onViewPointer(e);const i=e.browserEvent.target,n=i.classList.contains(\"monaco-tl-twistie\")||i.classList.contains(\"monaco-icon-label\")&&i.classList.contains(\"folder-icon\")&&e.browserEvent.offsetX<16;let s=!1;if(typeof this.tree.expandOnlyOnTwistieClick==\"function\"?s=this.tree.expandOnlyOnTwistieClick(t.element):s=!!this.tree.expandOnlyOnTwistieClick,s&&!n&&e.browserEvent.detail!==2)return super.onViewPointer(e);if(!this.tree.expandOnDoubleClick&&e.browserEvent.detail===2)return super.onViewPointer(e);if(t.collapsible){const r=this.tree.model,a=r.getNodeLocation(t),l=e.browserEvent.altKey;if(this.tree.setFocus([a]),r.setCollapsed(a,void 0,l),s&&n)return}super.onViewPointer(e)}onDoubleClick(e){e.browserEvent.target.classList.contains(\"monaco-tl-twistie\")||!this.tree.expandOnDoubleClick||super.onDoubleClick(e)}}class lQ extends ir{constructor(e,t,i,n,s,r,a,l){super(e,t,i,n,l),this.focusTrait=s,this.selectionTrait=r,this.anchorTrait=a}createMouseController(e){return new aQ(this,e.tree)}splice(e,t,i=[]){if(super.splice(e,t,i),i.length===0)return;const n=[],s=[];let r;i.forEach((a,l)=>{this.focusTrait.has(a)&&n.push(e+l),this.selectionTrait.has(a)&&s.push(e+l),this.anchorTrait.has(a)&&(r=e+l)}),n.length>0&&super.setFocus(el([...super.getFocus(),...n])),s.length>0&&super.setSelection(el([...super.getSelection(),...s])),typeof r==\"number\"&&super.setAnchor(r)}setFocus(e,t,i=!1){super.setFocus(e,t),i||this.focusTrait.set(e.map(n=>this.element(n)),t)}setSelection(e,t,i=!1){super.setSelection(e,t),i||this.selectionTrait.set(e.map(n=>this.element(n)),t)}setAnchor(e,t=!1){super.setAnchor(e),t||(typeof e==\"undefined\"?this.anchorTrait.set([]):this.anchorTrait.set([this.element(e)]))}}class bF{constructor(e,t,i,n,s={}){var r;this._user=e,this._options=s,this.eventBufferer=new Tx,this.onDidChangeFindOpenState=pe.None,this.disposables=new ee,this._onWillRefilter=new O,this.onWillRefilter=this._onWillRefilter.event,this._onDidUpdateOptions=new O;const a=new xE(i),l=new YN,c=new YN,d=this.disposables.add(new sQ(c.event));this.renderers=n.map(g=>new dm(g,()=>this.model,l.event,d,s));for(const g of this.renderers)this.disposables.add(g);let h;s.keyboardNavigationLabelProvider&&(h=new oQ(this,s.keyboardNavigationLabelProvider,s.filter),s=Object.assign(Object.assign({},s),{filter:h}),this.disposables.add(h)),this.focus=new wS(()=>this.view.getFocusedElements()[0],s.identityProvider),this.selection=new wS(()=>this.view.getSelectedElements()[0],s.identityProvider),this.anchor=new wS(()=>this.view.getAnchorElement(),s.identityProvider),this.view=new lQ(e,t,a,this.renderers,this.focus,this.selection,this.anchor,Object.assign(Object.assign({},nQ(()=>this.model,s)),{tree:this})),this.model=this.createModel(e,this.view,s),l.input=this.model.onDidChangeCollapseState;const u=pe.forEach(this.model.onDidSplice,g=>{this.eventBufferer.bufferEvents(()=>{this.focus.onDidModelSplice(g),this.selection.onDidModelSplice(g)})},this.disposables);if(u(()=>null,null,this.disposables),c.input=pe.chain(pe.any(u,this.focus.onDidChange,this.selection.onDidChange)).debounce(()=>null,0).map(()=>{const g=new Set;for(const f of this.focus.getNodes())g.add(f);for(const f of this.selection.getNodes())g.add(f);return[...g.values()]}).event,s.keyboardSupport!==!1){const g=pe.chain(this.view.onKeyDown).filter(f=>!qd(f.target)).map(f=>new Mt(f));g.filter(f=>f.keyCode===15).on(this.onLeftArrow,this,this.disposables),g.filter(f=>f.keyCode===17).on(this.onRightArrow,this,this.disposables),g.filter(f=>f.keyCode===10).on(this.onSpace,this,this.disposables)}((r=s.findWidgetEnabled)!==null&&r!==void 0?r:!0)&&s.keyboardNavigationLabelProvider&&s.contextViewProvider?(this.findController=new rQ(this,this.model,this.view,h,s.contextViewProvider),this.focusNavigationFilter=g=>this.findController.shouldAllowFocus(g),this.onDidChangeFindOpenState=this.findController.onDidChangeOpenState,this.disposables.add(this.findController),this.onDidChangeFindMode=this.findController.onDidChangeMode):this.onDidChangeFindMode=pe.None,this.styleElement=qs(this.view.getHTMLElement()),this.getHTMLElement().classList.toggle(\"always\",this._options.renderIndentGuides===cm.Always)}get onDidChangeFocus(){return this.eventBufferer.wrapEvent(this.focus.onDidChange)}get onDidChangeSelection(){return this.eventBufferer.wrapEvent(this.selection.onDidChange)}get onMouseDblClick(){return pe.filter(pe.map(this.view.onMouseDblClick,IM),e=>e.target!==gd.Filter)}get onPointer(){return pe.map(this.view.onPointer,IM)}get onDidFocus(){return this.view.onDidFocus}get onDidChangeModel(){return pe.signal(this.model.onDidSplice)}get onDidChangeCollapseState(){return this.model.onDidChangeCollapseState}get findMode(){var e,t;return(t=(e=this.findController)===null||e===void 0?void 0:e.mode)!==null&&t!==void 0?t:Or.Highlight}set findMode(e){this.findController&&(this.findController.mode=e)}get expandOnDoubleClick(){return typeof this._options.expandOnDoubleClick==\"undefined\"?!0:this._options.expandOnDoubleClick}get expandOnlyOnTwistieClick(){return typeof this._options.expandOnlyOnTwistieClick==\"undefined\"?!0:this._options.expandOnlyOnTwistieClick}get onDidDispose(){return this.view.onDidDispose}updateOptions(e={}){this._options=Object.assign(Object.assign({},this._options),e);for(const t of this.renderers)t.updateOptions(e);this.view.updateOptions(this._options),this._onDidUpdateOptions.fire(this._options),this.getHTMLElement().classList.toggle(\"always\",this._options.renderIndentGuides===cm.Always)}get options(){return this._options}getHTMLElement(){return this.view.getHTMLElement()}get scrollTop(){return this.view.scrollTop}set scrollTop(e){this.view.scrollTop=e}domFocus(){this.view.domFocus()}layout(e,t){var i;this.view.layout(e,t),sc(t)&&((i=this.findController)===null||i===void 0||i.layout(t))}style(e){var t;const i=`.${this.view.domId}`,n=[];e.treeIndentGuidesStroke&&(n.push(`.monaco-list${i}:hover .monaco-tl-indent > .indent-guide, .monaco-list${i}.always .monaco-tl-indent > .indent-guide  { border-color: ${e.treeIndentGuidesStroke.transparent(.4)}; }`),n.push(`.monaco-list${i} .monaco-tl-indent > .indent-guide.active { border-color: ${e.treeIndentGuidesStroke}; }`)),this.styleElement.textContent=n.join(`\n`),(t=this.findController)===null||t===void 0||t.style(e),this.view.style(e)}getParentElement(e){const t=this.model.getParentNodeLocation(e);return this.model.getNode(t).element}getFirstElementChild(e){return this.model.getFirstElementChild(e)}getNode(e){return this.model.getNode(e)}collapse(e,t=!1){return this.model.setCollapsed(e,!0,t)}expand(e,t=!1){return this.model.setCollapsed(e,!1,t)}isCollapsible(e){return this.model.isCollapsible(e)}setCollapsible(e,t){return this.model.setCollapsible(e,t)}isCollapsed(e){return this.model.isCollapsed(e)}refilter(){this._onWillRefilter.fire(void 0),this.model.refilter()}setSelection(e,t){const i=e.map(s=>this.model.getNode(s));this.selection.set(i,t);const n=e.map(s=>this.model.getListIndex(s)).filter(s=>s>-1);this.view.setSelection(n,t,!0)}getSelection(){return this.selection.get()}setFocus(e,t){const i=e.map(s=>this.model.getNode(s));this.focus.set(i,t);const n=e.map(s=>this.model.getListIndex(s)).filter(s=>s>-1);this.view.setFocus(n,t,!0)}getFocus(){return this.focus.get()}reveal(e,t){this.model.expandTo(e);const i=this.model.getListIndex(e);i!==-1&&this.view.reveal(i,t)}onLeftArrow(e){e.preventDefault(),e.stopPropagation();const t=this.view.getFocusedElements();if(t.length===0)return;const i=t[0],n=this.model.getNodeLocation(i);if(!this.model.setCollapsed(n,!0)){const r=this.model.getParentNodeLocation(n);if(!r)return;const a=this.model.getListIndex(r);this.view.reveal(a),this.view.setFocus([a])}}onRightArrow(e){e.preventDefault(),e.stopPropagation();const t=this.view.getFocusedElements();if(t.length===0)return;const i=t[0],n=this.model.getNodeLocation(i);if(!this.model.setCollapsed(n,!1)){if(!i.children.some(l=>l.visible))return;const[r]=this.view.getFocus(),a=r+1;this.view.reveal(a),this.view.setFocus([a])}}onSpace(e){e.preventDefault(),e.stopPropagation();const t=this.view.getFocusedElements();if(t.length===0)return;const i=t[0],n=this.model.getNodeLocation(i),s=e.browserEvent.altKey;this.model.setCollapsed(n,void 0,s)}dispose(){et(this.disposables),this.view.dispose()}}class IE{constructor(e,t,i={}){this.user=e,this.rootRef=null,this.nodes=new Map,this.nodesByIdentity=new Map,this.model=new JX(e,t,null,i),this.onDidSplice=this.model.onDidSplice,this.onDidChangeCollapseState=this.model.onDidChangeCollapseState,this.onDidChangeRenderNodeCount=this.model.onDidChangeRenderNodeCount,i.sorter&&(this.sorter={compare(n,s){return i.sorter.compare(n.element,s.element)}}),this.identityProvider=i.identityProvider}setChildren(e,t=Ue.empty(),i={}){const n=this.getElementLocation(e);this._setChildren(n,this.preserveCollapseState(t),i)}_setChildren(e,t=Ue.empty(),i){const n=new Set,s=new Set,r=l=>{var c;if(l.element===null)return;const d=l;if(n.add(d.element),this.nodes.set(d.element,d),this.identityProvider){const h=this.identityProvider.getId(d.element).toString();s.add(h),this.nodesByIdentity.set(h,d)}(c=i.onDidCreateNode)===null||c===void 0||c.call(i,d)},a=l=>{var c;if(l.element===null)return;const d=l;if(n.has(d.element)||this.nodes.delete(d.element),this.identityProvider){const h=this.identityProvider.getId(d.element).toString();s.has(h)||this.nodesByIdentity.delete(h)}(c=i.onDidDeleteNode)===null||c===void 0||c.call(i,d)};this.model.splice([...e,0],Number.MAX_VALUE,t,Object.assign(Object.assign({},i),{onDidCreateNode:r,onDidDeleteNode:a}))}preserveCollapseState(e=Ue.empty()){return this.sorter&&(e=[...e].sort(this.sorter.compare.bind(this.sorter))),Ue.map(e,t=>{let i=this.nodes.get(t.element);if(!i&&this.identityProvider){const r=this.identityProvider.getId(t.element).toString();i=this.nodesByIdentity.get(r)}if(!i)return Object.assign(Object.assign({},t),{children:this.preserveCollapseState(t.children)});const n=typeof t.collapsible==\"boolean\"?t.collapsible:i.collapsible,s=typeof t.collapsed!=\"undefined\"?t.collapsed:i.collapsed;return Object.assign(Object.assign({},t),{collapsible:n,collapsed:s,children:this.preserveCollapseState(t.children)})})}rerender(e){const t=this.getElementLocation(e);this.model.rerender(t)}getFirstElementChild(e=null){const t=this.getElementLocation(e);return this.model.getFirstElementChild(t)}has(e){return this.nodes.has(e)}getListIndex(e){const t=this.getElementLocation(e);return this.model.getListIndex(t)}getListRenderCount(e){const t=this.getElementLocation(e);return this.model.getListRenderCount(t)}isCollapsible(e){const t=this.getElementLocation(e);return this.model.isCollapsible(t)}setCollapsible(e,t){const i=this.getElementLocation(e);return this.model.setCollapsible(i,t)}isCollapsed(e){const t=this.getElementLocation(e);return this.model.isCollapsed(t)}setCollapsed(e,t,i){const n=this.getElementLocation(e);return this.model.setCollapsed(n,t,i)}expandTo(e){const t=this.getElementLocation(e);this.model.expandTo(t)}refilter(){this.model.refilter()}getNode(e=null){if(e===null)return this.model.getNode(this.model.rootRef);const t=this.nodes.get(e);if(!t)throw new Ws(this.user,`Tree element not found: ${e}`);return t}getNodeLocation(e){return e.element}getParentNodeLocation(e){if(e===null)throw new Ws(this.user,\"Invalid getParentNodeLocation call\");const t=this.nodes.get(e);if(!t)throw new Ws(this.user,`Tree element not found: ${e}`);const i=this.model.getNodeLocation(t),n=this.model.getParentNodeLocation(i);return this.model.getNode(n).element}getElementLocation(e){if(e===null)return[];const t=this.nodes.get(e);if(!t)throw new Ws(this.user,`Tree element not found: ${e}`);return this.model.getNodeLocation(t)}}function c0(o){const e=[o.element],t=o.incompressible||!1;return{element:{elements:e,incompressible:t},children:Ue.map(Ue.from(o.children),c0),collapsible:o.collapsible,collapsed:o.collapsed}}function d0(o){const e=[o.element],t=o.incompressible||!1;let i,n;for(;[n,i]=Ue.consume(Ue.from(o.children),2),!(n.length!==1||n[0].incompressible);)o=n[0],e.push(o.element);return{element:{elements:e,incompressible:t},children:Ue.map(Ue.concat(n,i),d0),collapsible:o.collapsible,collapsed:o.collapsed}}function TL(o,e=0){let t;return e<o.element.elements.length-1?t=[TL(o,e+1)]:t=Ue.map(Ue.from(o.children),i=>TL(i,0)),e===0&&o.element.incompressible?{element:o.element.elements[e],children:t,incompressible:!0,collapsible:o.collapsible,collapsed:o.collapsed}:{element:o.element.elements[e],children:t,collapsible:o.collapsible,collapsed:o.collapsed}}function EM(o){return TL(o,0)}function vF(o,e,t){return o.element===e?Object.assign(Object.assign({},o),{children:t}):Object.assign(Object.assign({},o),{children:Ue.map(Ue.from(o.children),i=>vF(i,e,t))})}const cQ=o=>({getId(e){return e.elements.map(t=>o.getId(t).toString()).join(\"\\0\")}});class dQ{constructor(e,t,i={}){this.user=e,this.rootRef=null,this.nodes=new Map,this.model=new IE(e,t,i),this.enabled=typeof i.compressionEnabled==\"undefined\"?!0:i.compressionEnabled,this.identityProvider=i.identityProvider}get onDidSplice(){return this.model.onDidSplice}get onDidChangeCollapseState(){return this.model.onDidChangeCollapseState}get onDidChangeRenderNodeCount(){return this.model.onDidChangeRenderNodeCount}setChildren(e,t=Ue.empty(),i){const n=i.diffIdentityProvider&&cQ(i.diffIdentityProvider);if(e===null){const g=Ue.map(t,this.enabled?d0:c0);this._setChildren(null,g,{diffIdentityProvider:n,diffDepth:1/0});return}const s=this.nodes.get(e);if(!s)throw new Error(\"Unknown compressed tree node\");const r=this.model.getNode(s),a=this.model.getParentNodeLocation(s),l=this.model.getNode(a),c=EM(r),d=vF(c,e,t),h=(this.enabled?d0:c0)(d),u=l.children.map(g=>g===r?h:g);this._setChildren(l.element,u,{diffIdentityProvider:n,diffDepth:r.depth-l.depth})}setCompressionEnabled(e){if(e===this.enabled)return;this.enabled=e;const i=this.model.getNode().children,n=Ue.map(i,EM),s=Ue.map(n,e?d0:c0);this._setChildren(null,s,{diffIdentityProvider:this.identityProvider,diffDepth:1/0})}_setChildren(e,t,i){const n=new Set,s=a=>{for(const l of a.element.elements)n.add(l),this.nodes.set(l,a.element)},r=a=>{for(const l of a.element.elements)n.has(l)||this.nodes.delete(l)};this.model.setChildren(e,t,Object.assign(Object.assign({},i),{onDidCreateNode:s,onDidDeleteNode:r}))}has(e){return this.nodes.has(e)}getListIndex(e){const t=this.getCompressedNode(e);return this.model.getListIndex(t)}getListRenderCount(e){const t=this.getCompressedNode(e);return this.model.getListRenderCount(t)}getNode(e){if(typeof e==\"undefined\")return this.model.getNode();const t=this.getCompressedNode(e);return this.model.getNode(t)}getNodeLocation(e){const t=this.model.getNodeLocation(e);return t===null?null:t.elements[t.elements.length-1]}getParentNodeLocation(e){const t=this.getCompressedNode(e),i=this.model.getParentNodeLocation(t);return i===null?null:i.elements[i.elements.length-1]}getFirstElementChild(e){const t=this.getCompressedNode(e);return this.model.getFirstElementChild(t)}isCollapsible(e){const t=this.getCompressedNode(e);return this.model.isCollapsible(t)}setCollapsible(e,t){const i=this.getCompressedNode(e);return this.model.setCollapsible(i,t)}isCollapsed(e){const t=this.getCompressedNode(e);return this.model.isCollapsed(t)}setCollapsed(e,t,i){const n=this.getCompressedNode(e);return this.model.setCollapsed(n,t,i)}expandTo(e){const t=this.getCompressedNode(e);this.model.expandTo(t)}rerender(e){const t=this.getCompressedNode(e);this.model.rerender(t)}refilter(){this.model.refilter()}getCompressedNode(e){if(e===null)return null;const t=this.nodes.get(e);if(!t)throw new Ws(this.user,`Tree element not found: ${e}`);return t}}const hQ=o=>o[o.length-1];class EE{constructor(e,t){this.unwrapper=e,this.node=t}get element(){return this.node.element===null?null:this.unwrapper(this.node.element)}get children(){return this.node.children.map(e=>new EE(this.unwrapper,e))}get depth(){return this.node.depth}get visibleChildrenCount(){return this.node.visibleChildrenCount}get visibleChildIndex(){return this.node.visibleChildIndex}get collapsible(){return this.node.collapsible}get collapsed(){return this.node.collapsed}get visible(){return this.node.visible}get filterData(){return this.node.filterData}}function uQ(o,e){return{splice(t,i,n){e.splice(t,i,n.map(s=>o.map(s)))},updateElementHeight(t,i){e.updateElementHeight(t,i)}}}function gQ(o,e){return Object.assign(Object.assign({},e),{identityProvider:e.identityProvider&&{getId(t){return e.identityProvider.getId(o(t))}},sorter:e.sorter&&{compare(t,i){return e.sorter.compare(t.elements[0],i.elements[0])}},filter:e.filter&&{filter(t,i){return e.filter.filter(o(t),i)}}})}class fQ{constructor(e,t,i={}){this.rootRef=null,this.elementMapper=i.elementMapper||hQ;const n=s=>this.elementMapper(s.elements);this.nodeMapper=new DE(s=>new EE(n,s)),this.model=new dQ(e,uQ(this.nodeMapper,t),gQ(n,i))}get onDidSplice(){return pe.map(this.model.onDidSplice,({insertedNodes:e,deletedNodes:t})=>({insertedNodes:e.map(i=>this.nodeMapper.map(i)),deletedNodes:t.map(i=>this.nodeMapper.map(i))}))}get onDidChangeCollapseState(){return pe.map(this.model.onDidChangeCollapseState,({node:e,deep:t})=>({node:this.nodeMapper.map(e),deep:t}))}get onDidChangeRenderNodeCount(){return pe.map(this.model.onDidChangeRenderNodeCount,e=>this.nodeMapper.map(e))}setChildren(e,t=Ue.empty(),i={}){this.model.setChildren(e,t,i)}setCompressionEnabled(e){this.model.setCompressionEnabled(e)}has(e){return this.model.has(e)}getListIndex(e){return this.model.getListIndex(e)}getListRenderCount(e){return this.model.getListRenderCount(e)}getNode(e){return this.nodeMapper.map(this.model.getNode(e))}getNodeLocation(e){return e.element}getParentNodeLocation(e){return this.model.getParentNodeLocation(e)}getFirstElementChild(e){const t=this.model.getFirstElementChild(e);return t===null||typeof t==\"undefined\"?t:this.elementMapper(t.elements)}isCollapsible(e){return this.model.isCollapsible(e)}setCollapsible(e,t){return this.model.setCollapsible(e,t)}isCollapsed(e){return this.model.isCollapsed(e)}setCollapsed(e,t,i){return this.model.setCollapsed(e,t,i)}expandTo(e){return this.model.expandTo(e)}rerender(e){return this.model.rerender(e)}refilter(){return this.model.refilter()}getCompressedTreeNode(e=null){return this.model.getNode(e)}}var pQ=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s};class NE extends bF{constructor(e,t,i,n,s={}){super(e,t,i,n,s),this.user=e}get onDidChangeCollapseState(){return this.model.onDidChangeCollapseState}setChildren(e,t=Ue.empty(),i){this.model.setChildren(e,t,i)}rerender(e){if(e===void 0){this.view.rerender();return}this.model.rerender(e)}hasElement(e){return this.model.has(e)}createModel(e,t,i){return new IE(e,t,i)}}class CF{constructor(e,t){this._compressedTreeNodeProvider=e,this.renderer=t,this.templateId=t.templateId,t.onDidChangeTwistieState&&(this.onDidChangeTwistieState=t.onDidChangeTwistieState)}get compressedTreeNodeProvider(){return this._compressedTreeNodeProvider()}renderTemplate(e){const t=this.renderer.renderTemplate(e);return{compressedTreeNode:void 0,data:t}}renderElement(e,t,i,n){const s=this.compressedTreeNodeProvider.getCompressedTreeNode(e.element);s.element.elements.length===1?(i.compressedTreeNode=void 0,this.renderer.renderElement(e,t,i.data,n)):(i.compressedTreeNode=s,this.renderer.renderCompressedElements(s,t,i.data,n))}disposeElement(e,t,i,n){var s,r,a,l;i.compressedTreeNode?(r=(s=this.renderer).disposeCompressedElements)===null||r===void 0||r.call(s,i.compressedTreeNode,t,i.data,n):(l=(a=this.renderer).disposeElement)===null||l===void 0||l.call(a,e,t,i.data,n)}disposeTemplate(e){this.renderer.disposeTemplate(e.data)}renderTwistie(e,t){return this.renderer.renderTwistie?this.renderer.renderTwistie(e,t):!1}}pQ([ui],CF.prototype,\"compressedTreeNodeProvider\",null);function mQ(o,e){return e&&Object.assign(Object.assign({},e),{keyboardNavigationLabelProvider:e.keyboardNavigationLabelProvider&&{getKeyboardNavigationLabel(t){let i;try{i=o().getCompressedTreeNode(t)}catch(n){return e.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(t)}return i.element.elements.length===1?e.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(t):e.keyboardNavigationLabelProvider.getCompressedNodeKeyboardNavigationLabel(i.element.elements)}}})}class wF extends NE{constructor(e,t,i,n,s={}){const r=()=>this,a=n.map(l=>new CF(r,l));super(e,t,i,a,mQ(r,s))}setChildren(e,t=Ue.empty(),i){this.model.setChildren(e,t,i)}createModel(e,t,i){return new fQ(e,t,i)}updateOptions(e={}){super.updateOptions(e),typeof e.compressionEnabled!=\"undefined\"&&this.model.setCompressionEnabled(e.compressionEnabled)}getCompressedTreeNode(e=null){return this.model.getCompressedTreeNode(e)}}var bl=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};function SS(o){return Object.assign(Object.assign({},o),{children:[],refreshPromise:void 0,stale:!0,slow:!1,collapsedByDefault:void 0})}function ML(o,e){return e.parent?e.parent===o?!0:ML(o,e.parent):!1}function _Q(o,e){return o===e||ML(o,e)||ML(e,o)}class TE{constructor(e){this.node=e}get element(){return this.node.element.element}get children(){return this.node.children.map(e=>new TE(e))}get depth(){return this.node.depth}get visibleChildrenCount(){return this.node.visibleChildrenCount}get visibleChildIndex(){return this.node.visibleChildIndex}get collapsible(){return this.node.collapsible}get collapsed(){return this.node.collapsed}get visible(){return this.node.visible}get filterData(){return this.node.filterData}}class bQ{constructor(e,t,i){this.renderer=e,this.nodeMapper=t,this.onDidChangeTwistieState=i,this.renderedNodes=new Map,this.templateId=e.templateId}renderTemplate(e){return{templateData:this.renderer.renderTemplate(e)}}renderElement(e,t,i,n){this.renderer.renderElement(this.nodeMapper.map(e),t,i.templateData,n)}renderTwistie(e,t){return e.slow?(t.classList.add(...m.treeItemLoading.classNamesArray),!0):(t.classList.remove(...m.treeItemLoading.classNamesArray),!1)}disposeElement(e,t,i,n){var s,r;(r=(s=this.renderer).disposeElement)===null||r===void 0||r.call(s,this.nodeMapper.map(e),t,i.templateData,n)}disposeTemplate(e){this.renderer.disposeTemplate(e.templateData)}dispose(){this.renderedNodes.clear()}}function NM(o){return{browserEvent:o.browserEvent,elements:o.elements.map(e=>e.element)}}function TM(o){return{browserEvent:o.browserEvent,element:o.element&&o.element.element,target:o.target}}class vQ extends s_{constructor(e){super(e.elements.map(t=>t.element)),this.data=e}}function yS(o){return o instanceof s_?new vQ(o):o}class CQ{constructor(e){this.dnd=e}getDragURI(e){return this.dnd.getDragURI(e.element)}getDragLabel(e,t){if(this.dnd.getDragLabel)return this.dnd.getDragLabel(e.map(i=>i.element),t)}onDragStart(e,t){var i,n;(n=(i=this.dnd).onDragStart)===null||n===void 0||n.call(i,yS(e),t)}onDragOver(e,t,i,n,s=!0){return this.dnd.onDragOver(yS(e),t&&t.element,i,n)}drop(e,t,i,n){this.dnd.drop(yS(e),t&&t.element,i,n)}onDragEnd(e){var t,i;(i=(t=this.dnd).onDragEnd)===null||i===void 0||i.call(t,e)}}function SF(o){return o&&Object.assign(Object.assign({},o),{collapseByDefault:!0,identityProvider:o.identityProvider&&{getId(e){return o.identityProvider.getId(e.element)}},dnd:o.dnd&&new CQ(o.dnd),multipleSelectionController:o.multipleSelectionController&&{isSelectionSingleChangeEvent(e){return o.multipleSelectionController.isSelectionSingleChangeEvent(Object.assign(Object.assign({},e),{element:e.element}))},isSelectionRangeChangeEvent(e){return o.multipleSelectionController.isSelectionRangeChangeEvent(Object.assign(Object.assign({},e),{element:e.element}))}},accessibilityProvider:o.accessibilityProvider&&Object.assign(Object.assign({},o.accessibilityProvider),{getPosInSet:void 0,getSetSize:void 0,getRole:o.accessibilityProvider.getRole?e=>o.accessibilityProvider.getRole(e.element):()=>\"treeitem\",isChecked:o.accessibilityProvider.isChecked?e=>{var t;return!!(!((t=o.accessibilityProvider)===null||t===void 0)&&t.isChecked(e.element))}:void 0,getAriaLabel(e){return o.accessibilityProvider.getAriaLabel(e.element)},getWidgetAriaLabel(){return o.accessibilityProvider.getWidgetAriaLabel()},getWidgetRole:o.accessibilityProvider.getWidgetRole?()=>o.accessibilityProvider.getWidgetRole():()=>\"tree\",getAriaLevel:o.accessibilityProvider.getAriaLevel&&(e=>o.accessibilityProvider.getAriaLevel(e.element)),getActiveDescendantId:o.accessibilityProvider.getActiveDescendantId&&(e=>o.accessibilityProvider.getActiveDescendantId(e.element))}),filter:o.filter&&{filter(e,t){return o.filter.filter(e.element,t)}},keyboardNavigationLabelProvider:o.keyboardNavigationLabelProvider&&Object.assign(Object.assign({},o.keyboardNavigationLabelProvider),{getKeyboardNavigationLabel(e){return o.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(e.element)}}),sorter:void 0,expandOnlyOnTwistieClick:typeof o.expandOnlyOnTwistieClick==\"undefined\"?void 0:typeof o.expandOnlyOnTwistieClick!=\"function\"?o.expandOnlyOnTwistieClick:e=>o.expandOnlyOnTwistieClick(e.element),additionalScrollHeight:o.additionalScrollHeight})}function AL(o,e){e(o),o.children.forEach(t=>AL(t,e))}class yF{constructor(e,t,i,n,s,r={}){this.user=e,this.dataSource=s,this.nodes=new Map,this.subTreeRefreshPromises=new Map,this.refreshPromises=new Map,this._onDidRender=new O,this._onDidChangeNodeSlowState=new O,this.nodeMapper=new DE(a=>new TE(a)),this.disposables=new ee,this.identityProvider=r.identityProvider,this.autoExpandSingleChildren=typeof r.autoExpandSingleChildren==\"undefined\"?!1:r.autoExpandSingleChildren,this.sorter=r.sorter,this.collapseByDefault=r.collapseByDefault,this.tree=this.createTree(e,t,i,n,r),this.onDidChangeFindMode=this.tree.onDidChangeFindMode,this.root=SS({element:void 0,parent:null,hasChildren:!0}),this.identityProvider&&(this.root=Object.assign(Object.assign({},this.root),{id:null})),this.nodes.set(null,this.root),this.tree.onDidChangeCollapseState(this._onDidChangeCollapseState,this,this.disposables)}get onDidChangeFocus(){return pe.map(this.tree.onDidChangeFocus,NM)}get onDidChangeSelection(){return pe.map(this.tree.onDidChangeSelection,NM)}get onMouseDblClick(){return pe.map(this.tree.onMouseDblClick,TM)}get onPointer(){return pe.map(this.tree.onPointer,TM)}get onDidFocus(){return this.tree.onDidFocus}get onDidChangeModel(){return this.tree.onDidChangeModel}get onDidChangeCollapseState(){return this.tree.onDidChangeCollapseState}get onDidChangeFindOpenState(){return this.tree.onDidChangeFindOpenState}get onDidDispose(){return this.tree.onDidDispose}createTree(e,t,i,n,s){const r=new xE(i),a=n.map(c=>new bQ(c,this.nodeMapper,this._onDidChangeNodeSlowState.event)),l=SF(s)||{};return new NE(e,t,r,a,l)}updateOptions(e={}){this.tree.updateOptions(e)}getHTMLElement(){return this.tree.getHTMLElement()}get scrollTop(){return this.tree.scrollTop}set scrollTop(e){this.tree.scrollTop=e}domFocus(){this.tree.domFocus()}layout(e,t){this.tree.layout(e,t)}style(e){this.tree.style(e)}getInput(){return this.root.element}setInput(e,t){return bl(this,void 0,void 0,function*(){this.refreshPromises.forEach(n=>n.cancel()),this.refreshPromises.clear(),this.root.element=e;const i=t&&{viewState:t,focus:[],selection:[]};yield this._updateChildren(e,!0,!1,i),i&&(this.tree.setFocus(i.focus),this.tree.setSelection(i.selection)),t&&typeof t.scrollTop==\"number\"&&(this.scrollTop=t.scrollTop)})}_updateChildren(e=this.root.element,t=!0,i=!1,n,s){return bl(this,void 0,void 0,function*(){if(typeof this.root.element==\"undefined\")throw new Ws(this.user,\"Tree input not set\");this.root.refreshPromise&&(yield this.root.refreshPromise,yield pe.toPromise(this._onDidRender.event));const r=this.getDataNode(e);if(yield this.refreshAndRenderNode(r,t,n,s),i)try{this.tree.rerender(r)}catch(a){}})}rerender(e){if(e===void 0||e===this.root.element){this.tree.rerender();return}const t=this.getDataNode(e);this.tree.rerender(t)}getNode(e=this.root.element){const t=this.getDataNode(e),i=this.tree.getNode(t===this.root?null:t);return this.nodeMapper.map(i)}collapse(e,t=!1){const i=this.getDataNode(e);return this.tree.collapse(i===this.root?null:i,t)}expand(e,t=!1){return bl(this,void 0,void 0,function*(){if(typeof this.root.element==\"undefined\")throw new Ws(this.user,\"Tree input not set\");this.root.refreshPromise&&(yield this.root.refreshPromise,yield pe.toPromise(this._onDidRender.event));const i=this.getDataNode(e);if(this.tree.hasElement(i)&&!this.tree.isCollapsible(i)||(i.refreshPromise&&(yield this.root.refreshPromise,yield pe.toPromise(this._onDidRender.event)),i!==this.root&&!i.refreshPromise&&!this.tree.isCollapsed(i)))return!1;const n=this.tree.expand(i===this.root?null:i,t);return i.refreshPromise&&(yield this.root.refreshPromise,yield pe.toPromise(this._onDidRender.event)),n})}setSelection(e,t){const i=e.map(n=>this.getDataNode(n));this.tree.setSelection(i,t)}getSelection(){return this.tree.getSelection().map(t=>t.element)}setFocus(e,t){const i=e.map(n=>this.getDataNode(n));this.tree.setFocus(i,t)}getFocus(){return this.tree.getFocus().map(t=>t.element)}reveal(e,t){this.tree.reveal(this.getDataNode(e),t)}getParentElement(e){const t=this.tree.getParentElement(this.getDataNode(e));return t&&t.element}getFirstElementChild(e=this.root.element){const t=this.getDataNode(e),i=this.tree.getFirstElementChild(t===this.root?null:t);return i&&i.element}getDataNode(e){const t=this.nodes.get(e===this.root.element?null:e);if(!t)throw new Ws(this.user,`Data tree node not found: ${e}`);return t}refreshAndRenderNode(e,t,i,n){return bl(this,void 0,void 0,function*(){yield this.refreshNode(e,t,i),this.render(e,i,n)})}refreshNode(e,t,i){return bl(this,void 0,void 0,function*(){let n;if(this.subTreeRefreshPromises.forEach((s,r)=>{!n&&_Q(r,e)&&(n=s.then(()=>this.refreshNode(e,t,i)))}),n)return n;if(e!==this.root&&this.tree.getNode(e).collapsed){e.hasChildren=!!this.dataSource.hasChildren(e.element),e.stale=!0;return}return this.doRefreshSubTree(e,t,i)})}doRefreshSubTree(e,t,i){return bl(this,void 0,void 0,function*(){let n;e.refreshPromise=new Promise(s=>n=s),this.subTreeRefreshPromises.set(e,e.refreshPromise),e.refreshPromise.finally(()=>{e.refreshPromise=void 0,this.subTreeRefreshPromises.delete(e)});try{const s=yield this.doRefreshNode(e,t,i);e.stale=!1,yield Hy.settled(s.map(r=>this.doRefreshSubTree(r,t,i)))}finally{n()}})}doRefreshNode(e,t,i){return bl(this,void 0,void 0,function*(){e.hasChildren=!!this.dataSource.hasChildren(e.element);let n;if(!e.hasChildren)n=Promise.resolve(Ue.empty());else{const s=this.doGetChildren(e);if(XN(s))n=Promise.resolve(s);else{const r=Vd(800);r.then(()=>{e.slow=!0,this._onDidChangeNodeSlowState.fire(e)},a=>null),n=s.finally(()=>r.cancel())}}try{const s=yield n;return this.setChildren(e,s,t,i)}catch(s){if(e!==this.root&&this.tree.hasElement(e)&&this.tree.collapse(e),ol(s))return[];throw s}finally{e.slow&&(e.slow=!1,this._onDidChangeNodeSlowState.fire(e))}})}doGetChildren(e){let t=this.refreshPromises.get(e);if(t)return t;const i=this.dataSource.getChildren(e.element);return XN(i)?this.processChildren(i):(t=Ti(()=>bl(this,void 0,void 0,function*(){return this.processChildren(yield i)})),this.refreshPromises.set(e,t),t.finally(()=>{this.refreshPromises.delete(e)}))}_onDidChangeCollapseState({node:e,deep:t}){e.element!==null&&!e.collapsed&&e.element.stale&&(t?this.collapse(e.element.element):this.refreshAndRenderNode(e.element,!1).catch(Ee))}setChildren(e,t,i,n){const s=[...t];if(e.children.length===0&&s.length===0)return[];const r=new Map,a=new Map;for(const d of e.children)if(r.set(d.element,d),this.identityProvider){const h=this.tree.isCollapsed(d);a.set(d.id,{node:d,collapsed:h})}const l=[],c=s.map(d=>{const h=!!this.dataSource.hasChildren(d);if(!this.identityProvider){const _=SS({element:d,parent:e,hasChildren:h});return h&&this.collapseByDefault&&!this.collapseByDefault(d)&&(_.collapsedByDefault=!1,l.push(_)),_}const u=this.identityProvider.getId(d).toString(),g=a.get(u);if(g){const _=g.node;return r.delete(_.element),this.nodes.delete(_.element),this.nodes.set(d,_),_.element=d,_.hasChildren=h,i?g.collapsed?(_.children.forEach(b=>AL(b,v=>this.nodes.delete(v.element))),_.children.splice(0,_.children.length),_.stale=!0):l.push(_):h&&this.collapseByDefault&&!this.collapseByDefault(d)&&(_.collapsedByDefault=!1,l.push(_)),_}const f=SS({element:d,parent:e,id:u,hasChildren:h});return n&&n.viewState.focus&&n.viewState.focus.indexOf(u)>-1&&n.focus.push(f),n&&n.viewState.selection&&n.viewState.selection.indexOf(u)>-1&&n.selection.push(f),n&&n.viewState.expanded&&n.viewState.expanded.indexOf(u)>-1?l.push(f):h&&this.collapseByDefault&&!this.collapseByDefault(d)&&(f.collapsedByDefault=!1,l.push(f)),f});for(const d of r.values())AL(d,h=>this.nodes.delete(h.element));for(const d of c)this.nodes.set(d.element,d);return e.children.splice(0,e.children.length,...c),e!==this.root&&this.autoExpandSingleChildren&&c.length===1&&l.length===0&&(c[0].collapsedByDefault=!1,l.push(c[0])),l}render(e,t,i){const n=e.children.map(r=>this.asTreeElement(r,t)),s=i&&Object.assign(Object.assign({},i),{diffIdentityProvider:i.diffIdentityProvider&&{getId(r){return i.diffIdentityProvider.getId(r.element)}}});this.tree.setChildren(e===this.root?null:e,n,s),e!==this.root&&this.tree.setCollapsible(e,e.hasChildren),this._onDidRender.fire()}asTreeElement(e,t){if(e.stale)return{element:e,collapsible:e.hasChildren,collapsed:!0};let i;return t&&t.viewState.expanded&&e.id&&t.viewState.expanded.indexOf(e.id)>-1?i=!1:i=e.collapsedByDefault,e.collapsedByDefault=void 0,{element:e,children:e.hasChildren?Ue.map(e.children,n=>this.asTreeElement(n,t)):[],collapsible:e.hasChildren,collapsed:i}}processChildren(e){return this.sorter&&(e=[...e].sort(this.sorter.compare.bind(this.sorter))),e}dispose(){this.disposables.dispose()}}class ME{constructor(e){this.node=e}get element(){return{elements:this.node.element.elements.map(e=>e.element),incompressible:this.node.element.incompressible}}get children(){return this.node.children.map(e=>new ME(e))}get depth(){return this.node.depth}get visibleChildrenCount(){return this.node.visibleChildrenCount}get visibleChildIndex(){return this.node.visibleChildIndex}get collapsible(){return this.node.collapsible}get collapsed(){return this.node.collapsed}get visible(){return this.node.visible}get filterData(){return this.node.filterData}}class wQ{constructor(e,t,i,n){this.renderer=e,this.nodeMapper=t,this.compressibleNodeMapperProvider=i,this.onDidChangeTwistieState=n,this.renderedNodes=new Map,this.disposables=[],this.templateId=e.templateId}renderTemplate(e){return{templateData:this.renderer.renderTemplate(e)}}renderElement(e,t,i,n){this.renderer.renderElement(this.nodeMapper.map(e),t,i.templateData,n)}renderCompressedElements(e,t,i,n){this.renderer.renderCompressedElements(this.compressibleNodeMapperProvider().map(e),t,i.templateData,n)}renderTwistie(e,t){return e.slow?(t.classList.add(...m.treeItemLoading.classNamesArray),!0):(t.classList.remove(...m.treeItemLoading.classNamesArray),!1)}disposeElement(e,t,i,n){var s,r;(r=(s=this.renderer).disposeElement)===null||r===void 0||r.call(s,this.nodeMapper.map(e),t,i.templateData,n)}disposeCompressedElements(e,t,i,n){var s,r;(r=(s=this.renderer).disposeCompressedElements)===null||r===void 0||r.call(s,this.compressibleNodeMapperProvider().map(e),t,i.templateData,n)}disposeTemplate(e){this.renderer.disposeTemplate(e.templateData)}dispose(){this.renderedNodes.clear(),this.disposables=et(this.disposables)}}function SQ(o){const e=o&&SF(o);return e&&Object.assign(Object.assign({},e),{keyboardNavigationLabelProvider:e.keyboardNavigationLabelProvider&&Object.assign(Object.assign({},e.keyboardNavigationLabelProvider),{getCompressedNodeKeyboardNavigationLabel(t){return o.keyboardNavigationLabelProvider.getCompressedNodeKeyboardNavigationLabel(t.map(i=>i.element))}})})}class yQ extends yF{constructor(e,t,i,n,s,r,a={}){super(e,t,i,s,r,a),this.compressionDelegate=n,this.compressibleNodeMapper=new DE(l=>new ME(l)),this.filter=a.filter}createTree(e,t,i,n,s){const r=new xE(i),a=n.map(c=>new wQ(c,this.nodeMapper,()=>this.compressibleNodeMapper,this._onDidChangeNodeSlowState.event)),l=SQ(s)||{};return new wF(e,t,r,a,l)}asTreeElement(e,t){return Object.assign({incompressible:this.compressionDelegate.isIncompressible(e.element)},super.asTreeElement(e,t))}updateOptions(e={}){this.tree.updateOptions(e)}render(e,t){if(!this.identityProvider)return super.render(e,t);const i=u=>this.identityProvider.getId(u).toString(),n=u=>{const g=new Set;for(const f of u){const _=this.tree.getCompressedTreeNode(f===this.root?null:f);if(!!_.element)for(const b of _.element.elements)g.add(i(b.element))}return g},s=n(this.tree.getSelection()),r=n(this.tree.getFocus());super.render(e,t);const a=this.getSelection();let l=!1;const c=this.getFocus();let d=!1;const h=u=>{const g=u.element;if(g)for(let f=0;f<g.elements.length;f++){const _=i(g.elements[f].element),b=g.elements[g.elements.length-1].element;s.has(_)&&a.indexOf(b)===-1&&(a.push(b),l=!0),r.has(_)&&c.indexOf(b)===-1&&(c.push(b),d=!0)}u.children.forEach(h)};h(this.tree.getCompressedTreeNode(e===this.root?null:e)),l&&this.setSelection(a),d&&this.setFocus(c)}processChildren(e){return this.filter&&(e=Ue.filter(e,t=>{const i=this.filter.filter(t,1),n=LQ(i);if(n===2)throw new Error(\"Recursive tree visibility not supported in async data compressed trees\");return n===1})),super.processChildren(e)}}function LQ(o){return typeof o==\"boolean\"?o?1:0:kE(o)?lm(o.visibility):lm(o)}class DQ extends bF{constructor(e,t,i,n,s,r={}){super(e,t,i,n,r),this.user=e,this.dataSource=s,this.identityProvider=r.identityProvider}createModel(e,t,i){return new IE(e,t,i)}}new ce(\"isMac\",Ze,p(\"isMac\",\"Whether the operating system is macOS\"));new ce(\"isLinux\",sn,p(\"isLinux\",\"Whether the operating system is Linux\"));const S1=new ce(\"isWindows\",nn,p(\"isWindows\",\"Whether the operating system is Windows\"));new ce(\"isWeb\",Lc,p(\"isWeb\",\"Whether the platform is a web browser\"));new ce(\"isMacNative\",Ze&&!Lc,p(\"isMacNative\",\"Whether the operating system is macOS on a non-browser platform\"));new ce(\"isIOS\",Xa,p(\"isIOS\",\"Whether the operating system is iOS\"));new ce(\"isDevelopment\",!1,!0);new ce(\"productQualityType\",\"\",p(\"productQualityType\",\"Quality type of VS Code\"));const LF=\"inputFocus\";new ce(LF,!1,p(\"inputFocus\",\"Whether keyboard focus is inside an input box\"));function No(o,e){const t=Object.create(null);for(const i in e){const n=e[i];n&&(t[i]=ba(n,o))}return t}function AE(o,e,t){function i(){const n=No(o.getColorTheme(),e);typeof t==\"function\"?t(n):t.style(n)}return i(),o.onDidColorThemeChange(i)}function kQ(o,e,t){return AE(e,{badgeBackground:(t==null?void 0:t.badgeBackground)||du,badgeForeground:(t==null?void 0:t.badgeForeground)||hu,badgeBorder:Be},o)}function Yd(o,e,t){return AE(e,Object.assign(Object.assign({},y1),t||{}),o)}const y1={listFocusBackground:lz,listFocusForeground:cz,listFocusOutline:dz,listActiveSelectionBackground:Ha,listActiveSelectionForeground:Rr,listActiveSelectionIconForeground:Pf,listFocusAndSelectionOutline:hz,listFocusAndSelectionBackground:Ha,listFocusAndSelectionForeground:Rr,listInactiveSelectionBackground:uz,listInactiveSelectionIconForeground:fz,listInactiveSelectionForeground:gz,listInactiveFocusBackground:pz,listInactiveFocusOutline:mz,listHoverBackground:_z,listHoverForeground:bz,listDropBackground:vz,listSelectionOutline:At,listHoverOutline:At,listFilterWidgetBackground:Cz,listFilterWidgetOutline:wz,listFilterWidgetNoMatchesOutline:Sz,listFilterWidgetShadow:yz,treeIndentGuidesStroke:Lz,tableColumnsBorder:Dz,tableOddRowsBackgroundColor:kz,inputActiveOptionBorder:Y0,inputActiveOptionForeground:Q0,inputActiveOptionBackground:X0,inputBackground:ZC,inputForeground:YC,inputBorder:XC,inputValidationInfoBackground:lI,inputValidationInfoForeground:cI,inputValidationInfoBorder:dI,inputValidationWarningBackground:hI,inputValidationWarningForeground:uI,inputValidationWarningBorder:gI,inputValidationErrorBackground:fI,inputValidationErrorForeground:pI,inputValidationErrorBorder:mI},xQ={shadowColor:Tr,borderColor:xz,foregroundColor:Iz,backgroundColor:Ez,selectionForegroundColor:Nz,selectionBackgroundColor:Tz,selectionBorderColor:Mz,separatorColor:Az,scrollbarShadow:Hg,scrollbarSliderBackground:rd,scrollbarSliderHoverBackground:ad,scrollbarSliderActiveBackground:ld};function IQ(o,e,t){return AE(e,Object.assign(Object.assign({},xQ),t),o)}var na=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},tt=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const eo=qe(\"listService\");let RL=class{constructor(e){this._themeService=e,this.disposables=new ee,this.lists=[],this._lastFocusedWidget=void 0,this._hasCreatedStyleController=!1}get lastFocusedList(){return this._lastFocusedWidget}setLastFocusedList(e){var t,i;e!==this._lastFocusedWidget&&((t=this._lastFocusedWidget)===null||t===void 0||t.getHTMLElement().classList.remove(\"last-focused\"),this._lastFocusedWidget=e,(i=this._lastFocusedWidget)===null||i===void 0||i.getHTMLElement().classList.add(\"last-focused\"))}register(e,t){if(!this._hasCreatedStyleController){this._hasCreatedStyleController=!0;const n=new z5(qs(),\"\");this.disposables.add(Yd(n,this._themeService))}if(this.lists.some(n=>n.widget===e))throw new Error(\"Cannot register the same widget multiple times\");const i={widget:e,extraContextKeys:t};return this.lists.push(i),e.getHTMLElement()===document.activeElement&&this.setLastFocusedList(e),Pr(e.onDidFocus(()=>this.setLastFocusedList(e)),ze(()=>this.lists.splice(this.lists.indexOf(i),1)),e.onDidDispose(()=>{this.lists=this.lists.filter(n=>n!==i),this._lastFocusedWidget===e&&this.setLastFocusedList(void 0)}))}dispose(){this.disposables.dispose()}};RL=na([tt(0,vt)],RL);const DF=new ce(\"listFocus\",!0),L1=new ce(\"listSupportsMultiselect\",!0),kF=re.and(DF,re.not(LF)),RE=new ce(\"listHasSelectionOrFocus\",!1),OE=new ce(\"listDoubleSelection\",!1),PE=new ce(\"listMultiSelection\",!1),D1=new ce(\"listSelectionNavigation\",!1),EQ=new ce(\"listSupportsFind\",!0),FE=new ce(\"treeElementCanCollapse\",!1),NQ=new ce(\"treeElementHasParent\",!1),BE=new ce(\"treeElementCanExpand\",!1),TQ=new ce(\"treeElementHasChild\",!1),MQ=new ce(\"treeFindOpen\",!1),xF=\"listTypeNavigationMode\",IF=\"listAutomaticKeyboardNavigation\";function k1(o,e){const t=o.createScoped(e.getHTMLElement());return DF.bindTo(t),t}const Lh=\"workbench.list.multiSelectModifier\",OL=\"workbench.list.openMode\",Ks=\"workbench.list.horizontalScrolling\",WE=\"workbench.list.defaultFindMode\",VE=\"workbench.list.keyboardNavigation\",hm=\"workbench.tree.indent\",Ev=\"workbench.tree.renderIndentGuides\",Xo=\"workbench.list.smoothScrolling\",Gr=\"workbench.list.mouseWheelScrollSensitivity\",Zr=\"workbench.list.fastScrollSensitivity\",Nv=\"workbench.tree.expandMode\";function Yr(o){return o.getValue(Lh)===\"alt\"}class AQ extends z{constructor(e){super(),this.configurationService=e,this.useAltAsMultipleSelectionModifier=Yr(e),this.registerListeners()}registerListeners(){this._register(this.configurationService.onDidChangeConfiguration(e=>{e.affectsConfiguration(Lh)&&(this.useAltAsMultipleSelectionModifier=Yr(this.configurationService))}))}isSelectionSingleChangeEvent(e){return this.useAltAsMultipleSelectionModifier?e.browserEvent.altKey:W5(e)}isSelectionRangeChangeEvent(e){return V5(e)}}function x1(o,e){var t;const i=o.get(ot),n=o.get(rn),s=new ee;return[Object.assign(Object.assign({},e),{keyboardNavigationDelegate:{mightProducePrintableCharacter(a){return n.mightProducePrintableCharacter(a)}},smoothScrolling:Boolean(i.getValue(Xo)),mouseWheelScrollSensitivity:i.getValue(Gr),fastScrollSensitivity:i.getValue(Zr),multipleSelectionController:(t=e.multipleSelectionController)!==null&&t!==void 0?t:s.add(new AQ(i)),keyboardNavigationEventFilter:PQ(n)}),s]}let PL=class extends ir{constructor(e,t,i,n,s,r,a,l,c,d){const h=typeof s.horizontalScrolling!=\"undefined\"?s.horizontalScrolling:Boolean(c.getValue(Ks)),[u,g]=d.invokeFunction(x1,s);super(e,t,i,n,Object.assign(Object.assign(Object.assign({keyboardSupport:!1},No(l.getColorTheme(),y1)),u),{horizontalScrolling:h})),this.disposables.add(g),this.contextKeyService=k1(r,this),this.themeService=l,this.listSupportsMultiSelect=L1.bindTo(this.contextKeyService),this.listSupportsMultiSelect.set(s.multipleSelectionSupport!==!1),D1.bindTo(this.contextKeyService).set(Boolean(s.selectionNavigation)),this.listHasSelectionOrFocus=RE.bindTo(this.contextKeyService),this.listDoubleSelection=OE.bindTo(this.contextKeyService),this.listMultiSelection=PE.bindTo(this.contextKeyService),this.horizontalScrolling=s.horizontalScrolling,this._useAltAsMultipleSelectionModifier=Yr(c),this.disposables.add(this.contextKeyService),this.disposables.add(a.register(this)),s.overrideStyles&&this.updateStyles(s.overrideStyles),this.disposables.add(this.onDidChangeSelection(()=>{const _=this.getSelection(),b=this.getFocus();this.contextKeyService.bufferChangeEvents(()=>{this.listHasSelectionOrFocus.set(_.length>0||b.length>0),this.listMultiSelection.set(_.length>1),this.listDoubleSelection.set(_.length===2)})})),this.disposables.add(this.onDidChangeFocus(()=>{const _=this.getSelection(),b=this.getFocus();this.listHasSelectionOrFocus.set(_.length>0||b.length>0)})),this.disposables.add(c.onDidChangeConfiguration(_=>{_.affectsConfiguration(Lh)&&(this._useAltAsMultipleSelectionModifier=Yr(c));let b={};if(_.affectsConfiguration(Ks)&&this.horizontalScrolling===void 0){const v=Boolean(c.getValue(Ks));b=Object.assign(Object.assign({},b),{horizontalScrolling:v})}if(_.affectsConfiguration(Xo)){const v=Boolean(c.getValue(Xo));b=Object.assign(Object.assign({},b),{smoothScrolling:v})}if(_.affectsConfiguration(Gr)){const v=c.getValue(Gr);b=Object.assign(Object.assign({},b),{mouseWheelScrollSensitivity:v})}if(_.affectsConfiguration(Zr)){const v=c.getValue(Zr);b=Object.assign(Object.assign({},b),{fastScrollSensitivity:v})}Object.keys(b).length>0&&this.updateOptions(b)})),this.navigator=new EF(this,Object.assign({configurationService:c},s)),this.disposables.add(this.navigator)}updateOptions(e){super.updateOptions(e),e.overrideStyles&&this.updateStyles(e.overrideStyles),e.multipleSelectionSupport!==void 0&&this.listSupportsMultiSelect.set(!!e.multipleSelectionSupport)}updateStyles(e){var t;(t=this._styler)===null||t===void 0||t.dispose(),this._styler=Yd(this,this.themeService,e)}dispose(){var e;(e=this._styler)===null||e===void 0||e.dispose(),super.dispose()}};PL=na([tt(5,xe),tt(6,eo),tt(7,vt),tt(8,ot),tt(9,Re)],PL);let MM=class extends MX{constructor(e,t,i,n,s,r,a,l,c,d){const h=typeof s.horizontalScrolling!=\"undefined\"?s.horizontalScrolling:Boolean(c.getValue(Ks)),[u,g]=d.invokeFunction(x1,s);super(e,t,i,n,Object.assign(Object.assign(Object.assign({keyboardSupport:!1},No(l.getColorTheme(),y1)),u),{horizontalScrolling:h})),this.disposables=new ee,this.disposables.add(g),this.contextKeyService=k1(r,this),this.themeService=l,this.horizontalScrolling=s.horizontalScrolling,this.listSupportsMultiSelect=L1.bindTo(this.contextKeyService),this.listSupportsMultiSelect.set(s.multipleSelectionSupport!==!1),D1.bindTo(this.contextKeyService).set(Boolean(s.selectionNavigation)),this._useAltAsMultipleSelectionModifier=Yr(c),this.disposables.add(this.contextKeyService),this.disposables.add(a.register(this)),s.overrideStyles&&this.updateStyles(s.overrideStyles),s.overrideStyles&&this.disposables.add(Yd(this,l,s.overrideStyles)),this.disposables.add(c.onDidChangeConfiguration(_=>{_.affectsConfiguration(Lh)&&(this._useAltAsMultipleSelectionModifier=Yr(c));let b={};if(_.affectsConfiguration(Ks)&&this.horizontalScrolling===void 0){const v=Boolean(c.getValue(Ks));b=Object.assign(Object.assign({},b),{horizontalScrolling:v})}if(_.affectsConfiguration(Xo)){const v=Boolean(c.getValue(Xo));b=Object.assign(Object.assign({},b),{smoothScrolling:v})}if(_.affectsConfiguration(Gr)){const v=c.getValue(Gr);b=Object.assign(Object.assign({},b),{mouseWheelScrollSensitivity:v})}if(_.affectsConfiguration(Zr)){const v=c.getValue(Zr);b=Object.assign(Object.assign({},b),{fastScrollSensitivity:v})}Object.keys(b).length>0&&this.updateOptions(b)})),this.navigator=new EF(this,Object.assign({configurationService:c},s)),this.disposables.add(this.navigator)}updateOptions(e){super.updateOptions(e),e.overrideStyles&&this.updateStyles(e.overrideStyles),e.multipleSelectionSupport!==void 0&&this.listSupportsMultiSelect.set(!!e.multipleSelectionSupport)}updateStyles(e){var t;(t=this._styler)===null||t===void 0||t.dispose(),this._styler=Yd(this,this.themeService,e)}dispose(){var e;(e=this._styler)===null||e===void 0||e.dispose(),this.disposables.dispose(),super.dispose()}};MM=na([tt(5,xe),tt(6,eo),tt(7,vt),tt(8,ot),tt(9,Re)],MM);let AM=class extends w1{constructor(e,t,i,n,s,r,a,l,c,d,h){const u=typeof r.horizontalScrolling!=\"undefined\"?r.horizontalScrolling:Boolean(d.getValue(Ks)),[g,f]=h.invokeFunction(x1,r);super(e,t,i,n,s,Object.assign(Object.assign(Object.assign({keyboardSupport:!1},No(c.getColorTheme(),y1)),g),{horizontalScrolling:u})),this.disposables.add(f),this.contextKeyService=k1(a,this),this.themeService=c,this.listSupportsMultiSelect=L1.bindTo(this.contextKeyService),this.listSupportsMultiSelect.set(r.multipleSelectionSupport!==!1),D1.bindTo(this.contextKeyService).set(Boolean(r.selectionNavigation)),this.listHasSelectionOrFocus=RE.bindTo(this.contextKeyService),this.listDoubleSelection=OE.bindTo(this.contextKeyService),this.listMultiSelection=PE.bindTo(this.contextKeyService),this.horizontalScrolling=r.horizontalScrolling,this._useAltAsMultipleSelectionModifier=Yr(d),this.disposables.add(this.contextKeyService),this.disposables.add(l.register(this)),r.overrideStyles&&this.updateStyles(r.overrideStyles),this.disposables.add(this.onDidChangeSelection(()=>{const b=this.getSelection(),v=this.getFocus();this.contextKeyService.bufferChangeEvents(()=>{this.listHasSelectionOrFocus.set(b.length>0||v.length>0),this.listMultiSelection.set(b.length>1),this.listDoubleSelection.set(b.length===2)})})),this.disposables.add(this.onDidChangeFocus(()=>{const b=this.getSelection(),v=this.getFocus();this.listHasSelectionOrFocus.set(b.length>0||v.length>0)})),this.disposables.add(d.onDidChangeConfiguration(b=>{b.affectsConfiguration(Lh)&&(this._useAltAsMultipleSelectionModifier=Yr(d));let v={};if(b.affectsConfiguration(Ks)&&this.horizontalScrolling===void 0){const C=Boolean(d.getValue(Ks));v=Object.assign(Object.assign({},v),{horizontalScrolling:C})}if(b.affectsConfiguration(Xo)){const C=Boolean(d.getValue(Xo));v=Object.assign(Object.assign({},v),{smoothScrolling:C})}if(b.affectsConfiguration(Gr)){const C=d.getValue(Gr);v=Object.assign(Object.assign({},v),{mouseWheelScrollSensitivity:C})}if(b.affectsConfiguration(Zr)){const C=d.getValue(Zr);v=Object.assign(Object.assign({},v),{fastScrollSensitivity:C})}Object.keys(v).length>0&&this.updateOptions(v)})),this.navigator=new RQ(this,Object.assign({configurationService:d},r)),this.disposables.add(this.navigator)}updateOptions(e){super.updateOptions(e),e.overrideStyles&&this.updateStyles(e.overrideStyles),e.multipleSelectionSupport!==void 0&&this.listSupportsMultiSelect.set(!!e.multipleSelectionSupport)}updateStyles(e){var t;(t=this._styler)===null||t===void 0||t.dispose(),this._styler=Yd(this,this.themeService,e)}dispose(){var e;(e=this._styler)===null||e===void 0||e.dispose(),this.disposables.dispose(),super.dispose()}};AM=na([tt(6,xe),tt(7,eo),tt(8,vt),tt(9,ot),tt(10,Re)],AM);class HE extends z{constructor(e,t){var i;super(),this.widget=e,this._onDidOpen=this._register(new O),this.onDidOpen=this._onDidOpen.event,this._register(pe.filter(this.widget.onDidChangeSelection,n=>n.browserEvent instanceof KeyboardEvent)(n=>this.onSelectionFromKeyboard(n))),this._register(this.widget.onPointer(n=>this.onPointer(n.element,n.browserEvent))),this._register(this.widget.onMouseDblClick(n=>this.onMouseDblClick(n.element,n.browserEvent))),typeof(t==null?void 0:t.openOnSingleClick)!=\"boolean\"&&(t==null?void 0:t.configurationService)?(this.openOnSingleClick=(t==null?void 0:t.configurationService.getValue(OL))!==\"doubleClick\",this._register(t==null?void 0:t.configurationService.onDidChangeConfiguration(()=>{this.openOnSingleClick=(t==null?void 0:t.configurationService.getValue(OL))!==\"doubleClick\"}))):this.openOnSingleClick=(i=t==null?void 0:t.openOnSingleClick)!==null&&i!==void 0?i:!0}onSelectionFromKeyboard(e){if(e.elements.length!==1)return;const t=e.browserEvent,i=typeof t.preserveFocus==\"boolean\"?t.preserveFocus:!0,n=typeof t.pinned==\"boolean\"?t.pinned:!i,s=!1;this._open(this.getSelectedElement(),i,n,s,e.browserEvent)}onPointer(e,t){if(!this.openOnSingleClick||t.detail===2)return;const n=t.button===1,s=!0,r=n,a=t.ctrlKey||t.metaKey||t.altKey;this._open(e,s,r,a,t)}onMouseDblClick(e,t){if(!t)return;const i=t.target;if(i.classList.contains(\"monaco-tl-twistie\")||i.classList.contains(\"monaco-icon-label\")&&i.classList.contains(\"folder-icon\")&&t.offsetX<16)return;const s=!1,r=!0,a=t.ctrlKey||t.metaKey||t.altKey;this._open(e,s,r,a,t)}_open(e,t,i,n,s){!e||this._onDidOpen.fire({editorOptions:{preserveFocus:t,pinned:i,revealIfVisible:!0},sideBySide:n,element:e,browserEvent:s})}}class EF extends HE{constructor(e,t){super(e,t),this.widget=e}getSelectedElement(){return this.widget.getSelectedElements()[0]}}class RQ extends HE{constructor(e,t){super(e,t)}getSelectedElement(){return this.widget.getSelectedElements()[0]}}class OQ extends HE{constructor(e,t){super(e,t)}getSelectedElement(){var e;return(e=this.widget.getSelection()[0])!==null&&e!==void 0?e:void 0}}function PQ(o){let e=!1;return t=>{if(t.toKeybinding().isModifierKey())return!1;if(e)return e=!1,!1;const i=o.softDispatch(t,t.target);return i!=null&&i.enterChord?(e=!0,!1):(e=!1,!i)}}let RM=class extends NE{constructor(e,t,i,n,s,r,a,l,c,d){const{options:h,getTypeNavigationMode:u,disposable:g}=r.invokeFunction(u_,s);super(e,t,i,n,h),this.disposables.add(g),this.internals=new Xd(this,s,u,s.overrideStyles,a,l,c,d),this.disposables.add(this.internals)}updateOptions(e){super.updateOptions(e),this.internals.updateOptions(e)}};RM=na([tt(5,Re),tt(6,xe),tt(7,eo),tt(8,vt),tt(9,ot)],RM);let OM=class extends wF{constructor(e,t,i,n,s,r,a,l,c,d){const{options:h,getTypeNavigationMode:u,disposable:g}=r.invokeFunction(u_,s);super(e,t,i,n,h),this.disposables.add(g),this.internals=new Xd(this,s,u,s.overrideStyles,a,l,c,d),this.disposables.add(this.internals)}updateOptions(e={}){super.updateOptions(e),e.overrideStyles&&this.internals.updateStyleOverrides(e.overrideStyles),this.internals.updateOptions(e)}};OM=na([tt(5,Re),tt(6,xe),tt(7,eo),tt(8,vt),tt(9,ot)],OM);let PM=class extends DQ{constructor(e,t,i,n,s,r,a,l,c,d,h){const{options:u,getTypeNavigationMode:g,disposable:f}=a.invokeFunction(u_,r);super(e,t,i,n,s,u),this.disposables.add(f),this.internals=new Xd(this,r,g,r.overrideStyles,l,c,d,h),this.disposables.add(this.internals)}updateOptions(e={}){super.updateOptions(e),e.overrideStyles&&this.internals.updateStyleOverrides(e.overrideStyles),this.internals.updateOptions(e)}};PM=na([tt(6,Re),tt(7,xe),tt(8,eo),tt(9,vt),tt(10,ot)],PM);let FL=class extends yF{constructor(e,t,i,n,s,r,a,l,c,d,h){const{options:u,getTypeNavigationMode:g,disposable:f}=a.invokeFunction(u_,r);super(e,t,i,n,s,u),this.disposables.add(f),this.internals=new Xd(this,r,g,r.overrideStyles,l,c,d,h),this.disposables.add(this.internals)}get onDidOpen(){return this.internals.onDidOpen}updateOptions(e={}){super.updateOptions(e),e.overrideStyles&&this.internals.updateStyleOverrides(e.overrideStyles),this.internals.updateOptions(e)}};FL=na([tt(6,Re),tt(7,xe),tt(8,eo),tt(9,vt),tt(10,ot)],FL);let FM=class extends yQ{constructor(e,t,i,n,s,r,a,l,c,d,h,u){const{options:g,getTypeNavigationMode:f,disposable:_}=l.invokeFunction(u_,a);super(e,t,i,n,s,r,g),this.disposables.add(_),this.internals=new Xd(this,a,f,a.overrideStyles,c,d,h,u),this.disposables.add(this.internals)}updateOptions(e){super.updateOptions(e),this.internals.updateOptions(e)}};FM=na([tt(7,Re),tt(8,xe),tt(9,eo),tt(10,vt),tt(11,ot)],FM);function NF(o){const e=o.getValue(WE);if(e===\"highlight\")return Or.Highlight;if(e===\"filter\")return Or.Filter;const t=o.getValue(VE);if(t===\"simple\"||t===\"highlight\")return Or.Highlight;if(t===\"filter\")return Or.Filter}function u_(o,e){var t;const i=o.get(ot),n=o.get(Ch),s=o.get(xe),r=o.get(Re),a=()=>{const u=s.getContextKeyValue(xF);if(u===\"automatic\")return Yl.Automatic;if(u===\"trigger\"||s.getContextKeyValue(IF)===!1)return Yl.Trigger},l=e.horizontalScrolling!==void 0?e.horizontalScrolling:Boolean(i.getValue(Ks)),[c,d]=r.invokeFunction(x1,e),h=e.additionalScrollHeight;return{getTypeNavigationMode:a,disposable:d,options:Object.assign(Object.assign({keyboardSupport:!1},c),{indent:typeof i.getValue(hm)==\"number\"?i.getValue(hm):void 0,renderIndentGuides:i.getValue(Ev),smoothScrolling:Boolean(i.getValue(Xo)),defaultFindMode:NF(i),horizontalScrolling:l,additionalScrollHeight:h,hideTwistiesOfChildlessElements:e.hideTwistiesOfChildlessElements,expandOnlyOnTwistieClick:(t=e.expandOnlyOnTwistieClick)!==null&&t!==void 0?t:i.getValue(Nv)===\"doubleClick\",contextViewProvider:n})}}let Xd=class{constructor(e,t,i,n,s,r,a,l){var c;this.tree=e,this.themeService=a,this.disposables=[],this.contextKeyService=k1(s,e),this.listSupportsMultiSelect=L1.bindTo(this.contextKeyService),this.listSupportsMultiSelect.set(t.multipleSelectionSupport!==!1),D1.bindTo(this.contextKeyService).set(Boolean(t.selectionNavigation)),this.listSupportFindWidget=EQ.bindTo(this.contextKeyService),this.listSupportFindWidget.set((c=t.findWidgetEnabled)!==null&&c!==void 0?c:!0),this.hasSelectionOrFocus=RE.bindTo(this.contextKeyService),this.hasDoubleSelection=OE.bindTo(this.contextKeyService),this.hasMultiSelection=PE.bindTo(this.contextKeyService),this.treeElementCanCollapse=FE.bindTo(this.contextKeyService),this.treeElementHasParent=NQ.bindTo(this.contextKeyService),this.treeElementCanExpand=BE.bindTo(this.contextKeyService),this.treeElementHasChild=TQ.bindTo(this.contextKeyService),this.treeFindOpen=MQ.bindTo(this.contextKeyService),this._useAltAsMultipleSelectionModifier=Yr(l),this.updateStyleOverrides(n);const h=()=>{const g=e.getFocus()[0];if(!g)return;const f=e.getNode(g);this.treeElementCanCollapse.set(f.collapsible&&!f.collapsed),this.treeElementHasParent.set(!!e.getParentElement(g)),this.treeElementCanExpand.set(f.collapsible&&f.collapsed),this.treeElementHasChild.set(!!e.getFirstElementChild(g))},u=new Set;u.add(xF),u.add(IF),this.disposables.push(this.contextKeyService,r.register(e),e.onDidChangeSelection(()=>{const g=e.getSelection(),f=e.getFocus();this.contextKeyService.bufferChangeEvents(()=>{this.hasSelectionOrFocus.set(g.length>0||f.length>0),this.hasMultiSelection.set(g.length>1),this.hasDoubleSelection.set(g.length===2)})}),e.onDidChangeFocus(()=>{const g=e.getSelection(),f=e.getFocus();this.hasSelectionOrFocus.set(g.length>0||f.length>0),h()}),e.onDidChangeCollapseState(h),e.onDidChangeModel(h),e.onDidChangeFindOpenState(g=>this.treeFindOpen.set(g)),l.onDidChangeConfiguration(g=>{let f={};if(g.affectsConfiguration(Lh)&&(this._useAltAsMultipleSelectionModifier=Yr(l)),g.affectsConfiguration(hm)){const _=l.getValue(hm);f=Object.assign(Object.assign({},f),{indent:_})}if(g.affectsConfiguration(Ev)){const _=l.getValue(Ev);f=Object.assign(Object.assign({},f),{renderIndentGuides:_})}if(g.affectsConfiguration(Xo)){const _=Boolean(l.getValue(Xo));f=Object.assign(Object.assign({},f),{smoothScrolling:_})}if((g.affectsConfiguration(WE)||g.affectsConfiguration(VE))&&e.updateOptions({defaultFindMode:NF(l)}),g.affectsConfiguration(Ks)&&t.horizontalScrolling===void 0){const _=Boolean(l.getValue(Ks));f=Object.assign(Object.assign({},f),{horizontalScrolling:_})}if(g.affectsConfiguration(Nv)&&t.expandOnlyOnTwistieClick===void 0&&(f=Object.assign(Object.assign({},f),{expandOnlyOnTwistieClick:l.getValue(Nv)===\"doubleClick\"})),g.affectsConfiguration(Gr)){const _=l.getValue(Gr);f=Object.assign(Object.assign({},f),{mouseWheelScrollSensitivity:_})}if(g.affectsConfiguration(Zr)){const _=l.getValue(Zr);f=Object.assign(Object.assign({},f),{fastScrollSensitivity:_})}Object.keys(f).length>0&&e.updateOptions(f)}),this.contextKeyService.onDidChangeContext(g=>{g.affectsSome(u)&&e.updateOptions({typeNavigationMode:i()})})),this.navigator=new OQ(e,Object.assign({configurationService:l},t)),this.disposables.push(this.navigator)}get onDidOpen(){return this.navigator.onDidOpen}updateOptions(e){e.multipleSelectionSupport!==void 0&&this.listSupportsMultiSelect.set(!!e.multipleSelectionSupport)}updateStyleOverrides(e){et(this.styler),this.styler=e?Yd(this.tree,this.themeService,e):z.None}dispose(){this.disposables=et(this.disposables),et(this.styler),this.styler=void 0}};Xd=na([tt(4,xe),tt(5,eo),tt(6,vt),tt(7,ot)],Xd);const FQ=di.as(al.Configuration);FQ.registerConfiguration({id:\"workbench\",order:7,title:p(\"workbenchConfigurationTitle\",\"Workbench\"),type:\"object\",properties:{[Lh]:{type:\"string\",enum:[\"ctrlCmd\",\"alt\"],markdownEnumDescriptions:[p(\"multiSelectModifier.ctrlCmd\",\"Maps to `Control` on Windows and Linux and to `Command` on macOS.\"),p(\"multiSelectModifier.alt\",\"Maps to `Alt` on Windows and Linux and to `Option` on macOS.\")],default:\"ctrlCmd\",description:p({key:\"multiSelectModifier\",comment:[\"- `ctrlCmd` refers to a value the setting can take and should not be localized.\",\"- `Control` and `Command` refer to the modifier keys Ctrl or Cmd on the keyboard and can be localized.\"]},\"The modifier to be used to add an item in trees and lists to a multi-selection with the mouse (for example in the explorer, open editors and scm view). The 'Open to Side' mouse gestures - if supported - will adapt such that they do not conflict with the multiselect modifier.\")},[OL]:{type:\"string\",enum:[\"singleClick\",\"doubleClick\"],default:\"singleClick\",description:p({key:\"openModeModifier\",comment:[\"`singleClick` and `doubleClick` refers to a value the setting can take and should not be localized.\"]},\"Controls how to open items in trees and lists using the mouse (if supported). Note that some trees and lists might choose to ignore this setting if it is not applicable.\")},[Ks]:{type:\"boolean\",default:!1,description:p(\"horizontalScrolling setting\",\"Controls whether lists and trees support horizontal scrolling in the workbench. Warning: turning on this setting has a performance implication.\")},[hm]:{type:\"number\",default:8,minimum:4,maximum:40,description:p(\"tree indent setting\",\"Controls tree indentation in pixels.\")},[Ev]:{type:\"string\",enum:[\"none\",\"onHover\",\"always\"],default:\"onHover\",description:p(\"render tree indent guides\",\"Controls whether the tree should render indent guides.\")},[Xo]:{type:\"boolean\",default:!1,description:p(\"list smoothScrolling setting\",\"Controls whether lists and trees have smooth scrolling.\")},[Gr]:{type:\"number\",default:1,markdownDescription:p(\"Mouse Wheel Scroll Sensitivity\",\"A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.\")},[Zr]:{type:\"number\",default:5,description:p(\"Fast Scroll Sensitivity\",\"Scrolling speed multiplier when pressing `Alt`.\")},[WE]:{type:\"string\",enum:[\"highlight\",\"filter\"],enumDescriptions:[p(\"defaultFindModeSettingKey.highlight\",\"Highlight elements when searching. Further up and down navigation will traverse only the highlighted elements.\"),p(\"defaultFindModeSettingKey.filter\",\"Filter elements when searching.\")],default:\"highlight\",description:p(\"defaultFindModeSettingKey\",\"Controls the default find mode for lists and trees in the workbench.\")},[VE]:{type:\"string\",enum:[\"simple\",\"highlight\",\"filter\"],enumDescriptions:[p(\"keyboardNavigationSettingKey.simple\",\"Simple keyboard navigation focuses elements which match the keyboard input. Matching is done only on prefixes.\"),p(\"keyboardNavigationSettingKey.highlight\",\"Highlight keyboard navigation highlights elements which match the keyboard input. Further up and down navigation will traverse only the highlighted elements.\"),p(\"keyboardNavigationSettingKey.filter\",\"Filter keyboard navigation will filter out and hide all the elements which do not match the keyboard input.\")],default:\"highlight\",description:p(\"keyboardNavigationSettingKey\",\"Controls the keyboard navigation style for lists and trees in the workbench. Can be simple, highlight and filter.\"),deprecated:!0,deprecationMessage:p(\"keyboardNavigationSettingKeyDeprecated\",\"Please use 'workbench.list.defaultFindMode' instead.\")},[Nv]:{type:\"string\",enum:[\"singleClick\",\"doubleClick\"],default:\"singleClick\",description:p(\"expand mode\",\"Controls how tree folders are expanded when clicking the folder names. Note that some trees and lists might choose to ignore this setting if it is not applicable.\")}}});var BQ=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class mc{constructor(e,t,i,n){this.isProviderFirst=e,this.parent=t,this.link=i,this._rangeCallback=n,this.id=iF.nextId()}get uri(){return this.link.uri}get range(){var e,t;return(t=(e=this._range)!==null&&e!==void 0?e:this.link.targetSelectionRange)!==null&&t!==void 0?t:this.link.range}set range(e){this._range=e,this._rangeCallback(this)}get ariaMessage(){var e;const t=(e=this.parent.getPreview(this))===null||e===void 0?void 0:e.preview(this.range);return t?p({key:\"aria.oneReference.preview\",comment:[\"Placeholders are: 0: filename, 1:line number, 2: column number, 3: preview snippet of source code\"]},\"symbol in {0} on line {1} at column {2}, {3}\",Ys(this.uri),this.range.startLineNumber,this.range.startColumn,t.value):p(\"aria.oneReference\",\"symbol in {0} on line {1} at column {2}\",Ys(this.uri),this.range.startLineNumber,this.range.startColumn)}}class WQ{constructor(e){this._modelReference=e}dispose(){this._modelReference.dispose()}preview(e,t=8){const i=this._modelReference.object.textEditorModel;if(!i)return;const{startLineNumber:n,startColumn:s,endLineNumber:r,endColumn:a}=e,l=i.getWordUntilPosition({lineNumber:n,column:s-t}),c=new L(n,l.startColumn,n,s),d=new L(r,a,r,1073741824),h=i.getValueInRange(c).replace(/^\\s+/,\"\"),u=i.getValueInRange(e),g=i.getValueInRange(d).replace(/\\s+$/,\"\");return{value:h+u+g,highlight:{start:h.length,end:h.length+u.length}}}}class um{constructor(e,t){this.parent=e,this.uri=t,this.children=[],this._previews=new hn}dispose(){et(this._previews.values()),this._previews.clear()}getPreview(e){return this._previews.get(e.uri)}get ariaMessage(){const e=this.children.length;return e===1?p(\"aria.fileReferences.1\",\"1 symbol in {0}, full path {1}\",Ys(this.uri),this.uri.fsPath):p(\"aria.fileReferences.N\",\"{0} symbols in {1}, full path {2}\",e,Ys(this.uri),this.uri.fsPath)}resolve(e){return BQ(this,void 0,void 0,function*(){if(this._previews.size!==0)return this;for(const t of this.children)if(!this._previews.has(t.uri))try{const i=yield e.createModelReference(t.uri);this._previews.set(t.uri,new WQ(i))}catch(i){Ee(i)}return this})}}class ss{constructor(e,t){this.groups=[],this.references=[],this._onDidChangeReferenceRange=new O,this.onDidChangeReferenceRange=this._onDidChangeReferenceRange.event,this._links=e,this._title=t;const[i]=e;e.sort(ss._compareReferences);let n;for(const s of e)if((!n||!xt.isEqual(n.uri,s.uri,!0))&&(n=new um(this,s.uri),this.groups.push(n)),n.children.length===0||ss._compareReferences(s,n.children[n.children.length-1])!==0){const r=new mc(i===s,n,s,a=>this._onDidChangeReferenceRange.fire(a));this.references.push(r),n.children.push(r)}}dispose(){et(this.groups),this._onDidChangeReferenceRange.dispose(),this.groups.length=0}clone(){return new ss(this._links,this._title)}get title(){return this._title}get isEmpty(){return this.groups.length===0}get ariaMessage(){return this.isEmpty?p(\"aria.result.0\",\"No results found\"):this.references.length===1?p(\"aria.result.1\",\"Found 1 symbol in {0}\",this.references[0].uri.fsPath):this.groups.length===1?p(\"aria.result.n1\",\"Found {0} symbols in {1}\",this.references.length,this.groups[0].uri.fsPath):p(\"aria.result.nm\",\"Found {0} symbols in {1} files\",this.references.length,this.groups.length)}nextOrPreviousReference(e,t){const{parent:i}=e;let n=i.children.indexOf(e);const s=i.children.length,r=i.parent.groups.length;return r===1||t&&n+1<s||!t&&n>0?(t?n=(n+1)%s:n=(n+s-1)%s,i.children[n]):(n=i.parent.groups.indexOf(i),t?(n=(n+1)%r,i.parent.groups[n].children[0]):(n=(n+r-1)%r,i.parent.groups[n].children[i.parent.groups[n].children.length-1]))}nearestReference(e,t){const i=this.references.map((n,s)=>({idx:s,prefixLen:Pd(n.uri.toString(),e.toString()),offsetDist:Math.abs(n.range.startLineNumber-t.lineNumber)*100+Math.abs(n.range.startColumn-t.column)})).sort((n,s)=>n.prefixLen>s.prefixLen?-1:n.prefixLen<s.prefixLen?1:n.offsetDist<s.offsetDist?-1:n.offsetDist>s.offsetDist?1:0)[0];if(i)return this.references[i.idx]}referenceAt(e,t){for(const i of this.references)if(i.uri.toString()===e.toString()&&L.containsPosition(i.range,t))return i}firstReference(){for(const e of this.references)if(e.isProviderFirst)return e;return this.references[0]}static _compareReferences(e,t){return xt.compare(e.uri,t.uri)||L.compareRangesUsingStarts(e.range,t.range)}}const VQ={badgeBackground:W.fromHex(\"#4D4D4D\"),badgeForeground:W.fromHex(\"#FFFFFF\")};class BL{constructor(e,t){this.count=0,this.options=t||Object.create(null),ea(this.options,VQ,!1),this.badgeBackground=this.options.badgeBackground,this.badgeForeground=this.options.badgeForeground,this.badgeBorder=this.options.badgeBorder,this.element=G(e,se(\".monaco-count-badge\")),this.countFormat=this.options.countFormat||\"{0}\",this.titleFormat=this.options.titleFormat||\"\",this.setCount(this.options.count||0)}setCount(e){this.count=e,this.render()}setTitleFormat(e){this.titleFormat=e,this.render()}render(){this.element.textContent=tg(this.countFormat,this.count),this.element.title=tg(this.titleFormat,this.count),this.applyStyles()}style(e){this.badgeBackground=e.badgeBackground,this.badgeForeground=e.badgeForeground,this.badgeBorder=e.badgeBorder,this.applyStyles()}applyStyles(){if(this.element){const e=this.badgeBackground?this.badgeBackground.toString():\"\",t=this.badgeForeground?this.badgeForeground.toString():\"\",i=this.badgeBorder?this.badgeBorder.toString():\"\";this.element.style.backgroundColor=e,this.element.style.color=t,this.element.style.borderWidth=i?\"1px\":\"\",this.element.style.borderStyle=i?\"solid\":\"\",this.element.style.borderColor=i}}}class Qd{constructor(e,t){var i;this.text=\"\",this.title=\"\",this.highlights=[],this.didEverRender=!1,this.supportIcons=(i=t==null?void 0:t.supportIcons)!==null&&i!==void 0?i:!1,this.domNode=G(e,se(\"span.monaco-highlighted-label\"))}get element(){return this.domNode}set(e,t=[],i=\"\",n){e||(e=\"\"),n&&(e=Qd.escapeNewLines(e,t)),!(this.didEverRender&&this.text===e&&this.title===i&&$s(this.highlights,t))&&(this.text=e,this.title=i,this.highlights=t,this.render())}render(){const e=[];let t=0;for(const i of this.highlights){if(i.end===i.start)continue;if(t<i.start){const r=this.text.substring(t,i.start);e.push(se(\"span\",void 0,...this.supportIcons?yd(r):[r])),t=i.end}const n=this.text.substring(i.start,i.end),s=se(\"span.highlight\",void 0,...this.supportIcons?yd(n):[n]);i.extraClasses&&s.classList.add(...i.extraClasses),e.push(s),t=i.end}if(t<this.text.length){const i=this.text.substring(t);e.push(se(\"span\",void 0,...this.supportIcons?yd(i):[i]))}Rd(this.domNode,...e),this.title?this.domNode.title=this.title:this.domNode.removeAttribute(\"title\"),this.didEverRender=!0}static escapeNewLines(e,t){let i=0,n=0;return e.replace(/\\r\\n|\\r|\\n/g,(s,r)=>{n=s===`\\r\n`?-1:0,r+=i;for(const a of t)a.end<=r||(a.start>=r&&(a.start+=n),a.end>=r&&(a.end+=n));return i+=n,\"\\u23CE\"})}}class LS{constructor(e){this._element=e}get element(){return this._element}set textContent(e){this.disposed||e===this._textContent||(this._textContent=e,this._element.textContent=e)}set className(e){this.disposed||e===this._className||(this._className=e,this._element.className=e)}set empty(e){this.disposed||e===this._empty||(this._empty=e,this._element.style.marginLeft=e?\"0\":\"\")}dispose(){this.disposed=!0}}class Tv extends z{constructor(e,t){super(),this.customHovers=new Map,this.domNode=this._register(new LS(G(e,se(\".monaco-icon-label\")))),this.labelContainer=G(this.domNode.element,se(\".monaco-icon-label-container\"));const i=G(this.labelContainer,se(\"span.monaco-icon-name-container\"));this.descriptionContainer=this._register(new LS(G(this.labelContainer,se(\"span.monaco-icon-description-container\")))),(t==null?void 0:t.supportHighlights)||(t==null?void 0:t.supportIcons)?this.nameNode=new UQ(i,!!t.supportIcons):this.nameNode=new HQ(i),t!=null&&t.supportDescriptionHighlights?this.descriptionNodeFactory=()=>new Qd(G(this.descriptionContainer.element,se(\"span.label-description\")),{supportIcons:!!t.supportIcons}):this.descriptionNodeFactory=()=>this._register(new LS(G(this.descriptionContainer.element,se(\"span.label-description\")))),this.hoverDelegate=t==null?void 0:t.hoverDelegate}get element(){return this.domNode.element}setLabel(e,t,i){const n=[\"monaco-icon-label\"];i&&(i.extraClasses&&n.push(...i.extraClasses),i.italic&&n.push(\"italic\"),i.strikethrough&&n.push(\"strikethrough\")),this.domNode.className=n.join(\" \"),this.setupHover(i!=null&&i.descriptionTitle?this.labelContainer:this.element,i==null?void 0:i.title),this.nameNode.setLabel(e,i),(t||this.descriptionNode)&&(this.descriptionNode||(this.descriptionNode=this.descriptionNodeFactory()),this.descriptionNode instanceof Qd?(this.descriptionNode.set(t||\"\",i?i.descriptionMatches:void 0),this.setupHover(this.descriptionNode.element,i==null?void 0:i.descriptionTitle)):(this.descriptionNode.textContent=t||\"\",this.setupHover(this.descriptionNode.element,(i==null?void 0:i.descriptionTitle)||\"\"),this.descriptionNode.empty=!t))}setupHover(e,t){const i=this.customHovers.get(e);if(i&&(i.dispose(),this.customHovers.delete(e)),!t){e.removeAttribute(\"title\");return}if(!this.hoverDelegate)PG(e,t);else{const n=f5(this.hoverDelegate,e,t);n&&this.customHovers.set(e,n)}}dispose(){super.dispose();for(const e of this.customHovers.values())e.dispose();this.customHovers.clear()}}class HQ{constructor(e){this.container=e,this.label=void 0,this.singleLabel=void 0}setLabel(e,t){if(!(this.label===e&&$s(this.options,t)))if(this.label=e,this.options=t,typeof e==\"string\")this.singleLabel||(this.container.innerText=\"\",this.container.classList.remove(\"multiple\"),this.singleLabel=G(this.container,se(\"a.label-name\",{id:t==null?void 0:t.domId}))),this.singleLabel.textContent=e;else{this.container.innerText=\"\",this.container.classList.add(\"multiple\"),this.singleLabel=void 0;for(let i=0;i<e.length;i++){const n=e[i],s=(t==null?void 0:t.domId)&&`${t==null?void 0:t.domId}_${i}`;G(this.container,se(\"a.label-name\",{id:s,\"data-icon-label-count\":e.length,\"data-icon-label-index\":i,role:\"treeitem\"},n)),i<e.length-1&&G(this.container,se(\"span.label-separator\",void 0,(t==null?void 0:t.separator)||\"/\"))}}}}function zQ(o,e,t){if(!t)return;let i=0;return o.map(n=>{const s={start:i,end:i+n.length},r=t.map(a=>Gi.intersect(s,a)).filter(a=>!Gi.isEmpty(a)).map(({start:a,end:l})=>({start:a-i,end:l-i}));return i=s.end+e.length,r})}class UQ{constructor(e,t){this.container=e,this.supportIcons=t,this.label=void 0,this.singleLabel=void 0}setLabel(e,t){if(!(this.label===e&&$s(this.options,t)))if(this.label=e,this.options=t,typeof e==\"string\")this.singleLabel||(this.container.innerText=\"\",this.container.classList.remove(\"multiple\"),this.singleLabel=new Qd(G(this.container,se(\"a.label-name\",{id:t==null?void 0:t.domId})),{supportIcons:this.supportIcons})),this.singleLabel.set(e,t==null?void 0:t.matches,void 0,t==null?void 0:t.labelEscapeNewLines);else{this.container.innerText=\"\",this.container.classList.add(\"multiple\"),this.singleLabel=void 0;const i=(t==null?void 0:t.separator)||\"/\",n=zQ(e,i,t==null?void 0:t.matches);for(let s=0;s<e.length;s++){const r=e[s],a=n?n[s]:void 0,l=(t==null?void 0:t.domId)&&`${t==null?void 0:t.domId}_${s}`,c=se(\"a.label-name\",{id:l,\"data-icon-label-count\":e.length,\"data-icon-label-index\":s,role:\"treeitem\"});new Qd(G(this.container,c),{supportIcons:this.supportIcons}).set(r,a,void 0,t==null?void 0:t.labelEscapeNewLines),s<e.length-1&&G(c,se(\"span.label-separator\",void 0,i))}}}}const bg=qe(\"labelService\");var I1=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},gm=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let WL=class{constructor(e){this._resolverService=e}hasChildren(e){return e instanceof ss||e instanceof um}getChildren(e){if(e instanceof ss)return e.groups;if(e instanceof um)return e.resolve(this._resolverService).then(t=>t.children);throw new Error(\"bad tree\")}};WL=I1([gm(0,$n)],WL);class $Q{getHeight(){return 23}getTemplateId(e){return e instanceof um?fm.id:g_.id}}let VL=class{constructor(e){this._keybindingService=e}getKeyboardNavigationLabel(e){var t;if(e instanceof mc){const i=(t=e.parent.getPreview(e))===null||t===void 0?void 0:t.preview(e.range);if(i)return i.value}return Ys(e.uri)}};VL=I1([gm(0,rn)],VL);class jQ{getId(e){return e instanceof mc?e.id:e.uri}}let HL=class extends z{constructor(e,t,i){super(),this._labelService=t;const n=document.createElement(\"div\");n.classList.add(\"reference-file\"),this.file=this._register(new Tv(n,{supportHighlights:!0})),this.badge=new BL(G(n,se(\".count\"))),this._register(kQ(this.badge,i)),e.appendChild(n)}set(e,t){const i=a1(e.uri);this.file.setLabel(this._labelService.getUriBasenameLabel(e.uri),this._labelService.getUriLabel(i,{relative:!0}),{title:this._labelService.getUriLabel(e.uri),matches:t});const n=e.children.length;this.badge.setCount(n),n>1?this.badge.setTitleFormat(p(\"referencesCount\",\"{0} references\",n)):this.badge.setTitleFormat(p(\"referenceCount\",\"{0} reference\",n))}};HL=I1([gm(1,bg),gm(2,vt)],HL);let fm=class TF{constructor(e){this._instantiationService=e,this.templateId=TF.id}renderTemplate(e){return this._instantiationService.createInstance(HL,e)}renderElement(e,t,i){i.set(e.element,sE(e.filterData))}disposeTemplate(e){e.dispose()}};fm.id=\"FileReferencesRenderer\";fm=I1([gm(0,Re)],fm);class KQ{constructor(e){this.label=new Qd(e)}set(e,t){var i;const n=(i=e.parent.getPreview(e))===null||i===void 0?void 0:i.preview(e.range);if(!n||!n.value)this.label.set(`${Ys(e.uri)}:${e.range.startLineNumber+1}:${e.range.startColumn+1}`);else{const{value:s,highlight:r}=n;t&&!jo.isDefault(t)?(this.label.element.classList.toggle(\"referenceMatch\",!1),this.label.set(s,sE(t))):(this.label.element.classList.toggle(\"referenceMatch\",!0),this.label.set(s,[r]))}}}class g_{constructor(){this.templateId=g_.id}renderTemplate(e){return new KQ(e)}renderElement(e,t,i){i.set(e.element,e.filterData)}disposeTemplate(){}}g_.id=\"OneReferenceRenderer\";class qQ{getWidgetAriaLabel(){return p(\"treeAriaLabel\",\"References\")}getAriaLabel(e){return e.ariaMessage}}var GQ=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},fa=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},BM=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class E1{constructor(e,t){this._editor=e,this._model=t,this._decorations=new Map,this._decorationIgnoreSet=new Set,this._callOnDispose=new ee,this._callOnModelChange=new ee,this._callOnDispose.add(this._editor.onDidChangeModel(()=>this._onModelChanged())),this._onModelChanged()}dispose(){this._callOnModelChange.dispose(),this._callOnDispose.dispose(),this.removeDecorations()}_onModelChanged(){this._callOnModelChange.clear();const e=this._editor.getModel();if(!!e){for(const t of this._model.references)if(t.uri.toString()===e.uri.toString()){this._addDecorations(t.parent);return}}}_addDecorations(e){if(!this._editor.hasModel())return;this._callOnModelChange.add(this._editor.getModel().onDidChangeDecorations(()=>this._onDecorationChanged()));const t=[],i=[];for(let n=0,s=e.children.length;n<s;n++){const r=e.children[n];this._decorationIgnoreSet.has(r.id)||r.uri.toString()===this._editor.getModel().uri.toString()&&(t.push({range:r.range,options:E1.DecorationOptions}),i.push(n))}this._editor.changeDecorations(n=>{const s=n.deltaDecorations([],t);for(let r=0;r<s.length;r++)this._decorations.set(s[r],e.children[i[r]])})}_onDecorationChanged(){const e=[],t=this._editor.getModel();if(!!t){for(const[i,n]of this._decorations){const s=t.getDecorationRange(i);if(!s)continue;let r=!1;if(!L.equalsRange(s,n.range)){if(L.spansMultipleLines(s))r=!0;else{const a=n.range.endColumn-n.range.startColumn,l=s.endColumn-s.startColumn;a!==l&&(r=!0)}r?(this._decorationIgnoreSet.add(n.id),e.push(i)):n.range=s}}for(let i=0,n=e.length;i<n;i++)this._decorations.delete(e[i]);this._editor.removeDecorations(e)}}removeDecorations(){this._editor.removeDecorations([...this._decorations.keys()]),this._decorations.clear()}}E1.DecorationOptions=Ie.register({description:\"reference-decoration\",stickiness:1,className:\"reference-decoration\"});class ZQ{constructor(){this.ratio=.7,this.heightInLines=18}static fromJSON(e){let t,i;try{const n=JSON.parse(e);t=n.ratio,i=n.heightInLines}catch(n){}return{ratio:t||.7,heightInLines:i||18}}}class YQ extends FL{}let zL=class extends xv{constructor(e,t,i,n,s,r,a,l,c,d,h,u){super(e,{showFrame:!1,showArrow:!0,isResizeable:!0,isAccessible:!0,supportOnTitleClick:!0},r),this._defaultTreeKeyboardSupport=t,this.layoutData=i,this._textModelResolverService=s,this._instantiationService=r,this._peekViewService=a,this._uriLabel=l,this._undoRedoService=c,this._keybindingService=d,this._languageService=h,this._languageConfigurationService=u,this._disposeOnNewModel=new ee,this._callOnDispose=new ee,this._onDidSelectReference=new O,this.onDidSelectReference=this._onDidSelectReference.event,this._dim=new bt(0,0),this._applyTheme(n.getColorTheme()),this._callOnDispose.add(n.onDidColorThemeChange(this._applyTheme.bind(this))),this._peekViewService.addExclusiveWidget(e,this),this.create()}dispose(){this.setModel(void 0),this._callOnDispose.dispose(),this._disposeOnNewModel.dispose(),et(this._preview),et(this._previewNotAvailableMessage),et(this._tree),et(this._previewModelReference),this._splitView.dispose(),super.dispose()}_applyTheme(e){const t=e.getColor(xX)||W.transparent;this.style({arrowColor:t,frameColor:t,headerBackgroundColor:e.getColor(kX)||W.transparent,primaryHeadingColor:e.getColor(lF),secondaryHeadingColor:e.getColor(cF)})}show(e){super.show(e,this.layoutData.heightInLines||18)}focusOnReferenceTree(){this._tree.domFocus()}focusOnPreviewEditor(){this._preview.focus()}isPreviewEditorFocused(){return this._preview.hasTextFocus()}_onTitleClick(e){this._preview&&this._preview.getModel()&&this._onDidSelectReference.fire({element:this._getFocusedReference(),kind:e.ctrlKey||e.metaKey||e.altKey?\"side\":\"open\",source:\"title\"})}_fillBody(e){this.setCssClass(\"reference-zone-widget\"),this._messageContainer=G(e,se(\"div.messages\")),An(this._messageContainer),this._splitView=new hF(e,{orientation:1}),this._previewContainer=G(e,se(\"div.preview.inline\"));const t={scrollBeyondLastLine:!1,scrollbar:{verticalScrollbarSize:14,horizontal:\"auto\",useShadows:!0,verticalHasArrows:!1,horizontalHasArrows:!1,alwaysConsumeMouseWheel:!1},overviewRulerLanes:2,fixedOverflowWidgets:!0,minimap:{enabled:!1}};this._preview=this._instantiationService.createInstance(Zd,this._previewContainer,t,this.editor),An(this._previewContainer),this._previewNotAvailableMessage=new il(p(\"missingPreviewMessage\",\"no preview available\"),Us,il.DEFAULT_CREATION_OPTIONS,null,this._undoRedoService,this._languageService,this._languageConfigurationService),this._treeContainer=G(e,se(\"div.ref-tree.inline\"));const i={keyboardSupport:this._defaultTreeKeyboardSupport,accessibilityProvider:new qQ,keyboardNavigationLabelProvider:this._instantiationService.createInstance(VL),identityProvider:new jQ,openOnSingleClick:!0,selectionNavigation:!0,overrideStyles:{listBackground:IX}};this._defaultTreeKeyboardSupport&&this._callOnDispose.add(Ei(this._treeContainer,\"keydown\",s=>{s.equals(9)&&(this._keybindingService.dispatchEvent(s,s.target),s.stopPropagation())},!0)),this._tree=this._instantiationService.createInstance(YQ,\"ReferencesWidget\",this._treeContainer,new $Q,[this._instantiationService.createInstance(fm),this._instantiationService.createInstance(g_)],this._instantiationService.createInstance(WL),i),this._splitView.addView({onDidChange:pe.None,element:this._previewContainer,minimumSize:200,maximumSize:Number.MAX_VALUE,layout:s=>{this._preview.layout({height:this._dim.height,width:s})}},Iv.Distribute),this._splitView.addView({onDidChange:pe.None,element:this._treeContainer,minimumSize:100,maximumSize:Number.MAX_VALUE,layout:s=>{this._treeContainer.style.height=`${this._dim.height}px`,this._treeContainer.style.width=`${s}px`,this._tree.layout(this._dim.height,s)}},Iv.Distribute),this._disposables.add(this._splitView.onDidSashChange(()=>{this._dim.width&&(this.layoutData.ratio=this._splitView.getViewSize(0)/this._dim.width)},void 0));const n=(s,r)=>{s instanceof mc&&(r===\"show\"&&this._revealReference(s,!1),this._onDidSelectReference.fire({element:s,kind:r,source:\"tree\"}))};this._tree.onDidOpen(s=>{s.sideBySide?n(s.element,\"side\"):s.editorOptions.pinned?n(s.element,\"goto\"):n(s.element,\"show\")}),An(this._treeContainer)}_onWidth(e){this._dim&&this._doLayoutBody(this._dim.height,e)}_doLayoutBody(e,t){super._doLayoutBody(e,t),this._dim=new bt(t,e),this.layoutData.heightInLines=this._viewZone?this._viewZone.heightInLines:this.layoutData.heightInLines,this._splitView.layout(t),this._splitView.resizeView(0,t*this.layoutData.ratio)}setSelection(e){return this._revealReference(e,!0).then(()=>{!this._model||(this._tree.setSelection([e]),this._tree.setFocus([e]))})}setModel(e){return this._disposeOnNewModel.clear(),this._model=e,this._model?this._onNewModel():Promise.resolve()}_onNewModel(){return this._model?this._model.isEmpty?(this.setTitle(\"\"),this._messageContainer.innerText=p(\"noResults\",\"No results\"),bs(this._messageContainer),Promise.resolve(void 0)):(An(this._messageContainer),this._decorationsManager=new E1(this._preview,this._model),this._disposeOnNewModel.add(this._decorationsManager),this._disposeOnNewModel.add(this._model.onDidChangeReferenceRange(e=>this._tree.rerender(e))),this._disposeOnNewModel.add(this._preview.onMouseDown(e=>{const{event:t,target:i}=e;if(t.detail!==2)return;const n=this._getFocusedReference();!n||this._onDidSelectReference.fire({element:{uri:n.uri,range:i.range},kind:t.ctrlKey||t.metaKey||t.altKey?\"side\":\"open\",source:\"editor\"})})),this.container.classList.add(\"results-loaded\"),bs(this._treeContainer),bs(this._previewContainer),this._splitView.layout(this._dim.width),this.focusOnReferenceTree(),this._tree.setInput(this._model.groups.length===1?this._model.groups[0]:this._model)):Promise.resolve(void 0)}_getFocusedReference(){const[e]=this._tree.getFocus();if(e instanceof mc)return e;if(e instanceof um&&e.children.length>0)return e.children[0]}revealReference(e){return BM(this,void 0,void 0,function*(){yield this._revealReference(e,!1),this._onDidSelectReference.fire({element:e,kind:\"goto\",source:\"tree\"})})}_revealReference(e,t){return BM(this,void 0,void 0,function*(){if(this._revealedReference===e)return;this._revealedReference=e,e.uri.scheme!==Ne.inMemory?this.setTitle(SK(e.uri),this._uriLabel.getUriLabel(a1(e.uri))):this.setTitle(p(\"peekView.alternateTitle\",\"References\"));const i=this._textModelResolverService.createModelReference(e.uri);this._tree.getInput()===e.parent?this._tree.reveal(e):(t&&this._tree.reveal(e.parent),yield this._tree.expand(e.parent),this._tree.reveal(e));const n=yield i;if(!this._model){n.dispose();return}et(this._previewModelReference);const s=n.object;if(s){const r=this._preview.getModel()===s.textEditorModel?0:1,a=L.lift(e.range).collapseToStart();this._previewModelReference=n,this._preview.setModel(s.textEditorModel),this._preview.setSelection(a),this._preview.revealRangeInCenter(a,r)}else this._preview.setModel(this._previewNotAvailableMessage),n.dispose()})}};zL=GQ([fa(3,vt),fa(4,$n),fa(5,Re),fa(6,aF),fa(7,bg),fa(8,l1),fa(9,rn),fa(10,Ht),fa(11,ti)],zL);var XQ=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Hh=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},WM=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const Dh=new ce(\"referenceSearchVisible\",!1,p(\"referenceSearchVisible\",\"Whether reference peek is visible, like 'Peek References' or 'Peek Definition'\"));let vg=class UL{constructor(e,t,i,n,s,r,a,l){this._defaultTreeKeyboardSupport=e,this._editor=t,this._editorService=n,this._notificationService=s,this._instantiationService=r,this._storageService=a,this._configurationService=l,this._disposables=new ee,this._requestIdPool=0,this._ignoreModelChangeEvent=!1,this._referenceSearchVisible=Dh.bindTo(i)}static get(e){return e.getContribution(UL.ID)}dispose(){var e,t;this._referenceSearchVisible.reset(),this._disposables.dispose(),(e=this._widget)===null||e===void 0||e.dispose(),(t=this._model)===null||t===void 0||t.dispose(),this._widget=void 0,this._model=void 0}toggleWidget(e,t,i){let n;if(this._widget&&(n=this._widget.position),this.closeWidget(),!!n&&e.containsPosition(n))return;this._peekMode=i,this._referenceSearchVisible.set(!0),this._disposables.add(this._editor.onDidChangeModelLanguage(()=>{this.closeWidget()})),this._disposables.add(this._editor.onDidChangeModel(()=>{this._ignoreModelChangeEvent||this.closeWidget()}));const s=\"peekViewLayout\",r=ZQ.fromJSON(this._storageService.get(s,0,\"{}\"));this._widget=this._instantiationService.createInstance(zL,this._editor,this._defaultTreeKeyboardSupport,r),this._widget.setTitle(p(\"labelLoading\",\"Loading...\")),this._widget.show(e),this._disposables.add(this._widget.onDidClose(()=>{t.cancel(),this._widget&&(this._storageService.store(s,JSON.stringify(this._widget.layoutData),0,1),this._widget=void 0),this.closeWidget()})),this._disposables.add(this._widget.onDidSelectReference(l=>{const{element:c,kind:d}=l;if(!!c)switch(d){case\"open\":(l.source!==\"editor\"||!this._configurationService.getValue(\"editor.stablePeek\"))&&this.openReference(c,!1,!1);break;case\"side\":this.openReference(c,!0,!1);break;case\"goto\":i?this._gotoReference(c):this.openReference(c,!1,!0);break}}));const a=++this._requestIdPool;t.then(l=>{var c;if(a!==this._requestIdPool||!this._widget){l.dispose();return}return(c=this._model)===null||c===void 0||c.dispose(),this._model=l,this._widget.setModel(this._model).then(()=>{if(this._widget&&this._model&&this._editor.hasModel()){this._model.isEmpty?this._widget.setMetaTitle(\"\"):this._widget.setMetaTitle(p(\"metaTitle.N\",\"{0} ({1})\",this._model.title,this._model.references.length));const d=this._editor.getModel().uri,h=new B(e.startLineNumber,e.startColumn),u=this._model.nearestReference(d,h);if(u)return this._widget.setSelection(u).then(()=>{this._widget&&this._editor.getOption(79)===\"editor\"&&this._widget.focusOnPreviewEditor()})}})},l=>{this._notificationService.error(l)})}changeFocusBetweenPreviewAndReferences(){!this._widget||(this._widget.isPreviewEditorFocused()?this._widget.focusOnReferenceTree():this._widget.focusOnPreviewEditor())}goToNextOrPreviousReference(e){return WM(this,void 0,void 0,function*(){if(!this._editor.hasModel()||!this._model||!this._widget)return;const t=this._widget.position;if(!t)return;const i=this._model.nearestReference(this._editor.getModel().uri,t);if(!i)return;const n=this._model.nextOrPreviousReference(i,e),s=this._editor.hasTextFocus(),r=this._widget.isPreviewEditorFocused();yield this._widget.setSelection(n),yield this._gotoReference(n),s?this._editor.focus():this._widget&&r&&this._widget.focusOnPreviewEditor()})}revealReference(e){return WM(this,void 0,void 0,function*(){!this._editor.hasModel()||!this._model||!this._widget||(yield this._widget.revealReference(e))})}closeWidget(e=!0){var t,i;(t=this._widget)===null||t===void 0||t.dispose(),(i=this._model)===null||i===void 0||i.dispose(),this._referenceSearchVisible.reset(),this._disposables.clear(),this._widget=void 0,this._model=void 0,e&&this._editor.focus(),this._requestIdPool+=1}_gotoReference(e){this._widget&&this._widget.hide(),this._ignoreModelChangeEvent=!0;const t=L.lift(e.range).collapseToStart();return this._editorService.openCodeEditor({resource:e.uri,options:{selection:t,selectionSource:\"code.jump\"}},this._editor).then(i=>{var n;if(this._ignoreModelChangeEvent=!1,!i||!this._widget){this.closeWidget();return}if(this._editor===i)this._widget.show(t),this._widget.focusOnReferenceTree();else{const s=UL.get(i),r=this._model.clone();this.closeWidget(),i.focus(),s==null||s.toggleWidget(t,Ti(a=>Promise.resolve(r)),(n=this._peekMode)!==null&&n!==void 0?n:!1)}},i=>{this._ignoreModelChangeEvent=!1,Ee(i)})}openReference(e,t,i){t||this.closeWidget();const{uri:n,range:s}=e;this._editorService.openCodeEditor({resource:n,options:{selection:s,selectionSource:\"code.jump\",pinned:i}},this._editor,t)}};vg.ID=\"editor.contrib.referencesController\";vg=XQ([Hh(2,xe),Hh(3,dt),Hh(4,gi),Hh(5,Re),Hh(6,ia),Hh(7,ot)],vg);function kh(o,e){const t=LX(o);if(!t)return;const i=vg.get(t);i&&e(i)}ls.registerCommandAndKeybindingRule({id:\"togglePeekWidgetFocus\",weight:100,primary:vi(2089,60),when:re.or(Dh,zn.inPeekEditor),handler(o){kh(o,e=>{e.changeFocusBetweenPreviewAndReferences()})}});ls.registerCommandAndKeybindingRule({id:\"goToNextReference\",weight:100-10,primary:62,secondary:[70],when:re.or(Dh,zn.inPeekEditor),handler(o){kh(o,e=>{e.goToNextOrPreviousReference(!0)})}});ls.registerCommandAndKeybindingRule({id:\"goToPreviousReference\",weight:100-10,primary:1086,secondary:[1094],when:re.or(Dh,zn.inPeekEditor),handler(o){kh(o,e=>{e.goToNextOrPreviousReference(!1)})}});Ye.registerCommandAlias(\"goToNextReferenceFromEmbeddedEditor\",\"goToNextReference\");Ye.registerCommandAlias(\"goToPreviousReferenceFromEmbeddedEditor\",\"goToPreviousReference\");Ye.registerCommandAlias(\"closeReferenceSearchEditor\",\"closeReferenceSearch\");Ye.registerCommand(\"closeReferenceSearch\",o=>kh(o,e=>e.closeWidget()));ls.registerKeybindingRule({id:\"closeReferenceSearch\",weight:100-101,primary:9,secondary:[1033],when:re.and(zn.inPeekEditor,re.not(\"config.editor.stablePeek\"))});ls.registerKeybindingRule({id:\"closeReferenceSearch\",weight:200+50,primary:9,secondary:[1033],when:re.and(Dh,re.not(\"config.editor.stablePeek\"))});ls.registerCommandAndKeybindingRule({id:\"revealReference\",weight:200,primary:3,mac:{primary:3,secondary:[2066]},when:re.and(Dh,kF,FE.negate(),BE.negate()),handler(o){var e;const i=(e=o.get(eo).lastFocusedList)===null||e===void 0?void 0:e.getFocus();Array.isArray(i)&&i[0]instanceof mc&&kh(o,n=>n.revealReference(i[0]))}});ls.registerCommandAndKeybindingRule({id:\"openReferenceToSide\",weight:100,primary:2051,mac:{primary:259},when:re.and(Dh,kF,FE.negate(),BE.negate()),handler(o){var e;const i=(e=o.get(eo).lastFocusedList)===null||e===void 0?void 0:e.getFocus();Array.isArray(i)&&i[0]instanceof mc&&kh(o,n=>n.openReference(i[0],!0,!0))}});Ye.registerCommand(\"openReference\",o=>{var e;const i=(e=o.get(eo).lastFocusedList)===null||e===void 0?void 0:e.getFocus();Array.isArray(i)&&i[0]instanceof mc&&kh(o,n=>n.openReference(i[0],!1,!0))});var MF=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},jf=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const zE=new ce(\"hasSymbols\",!1,p(\"hasSymbols\",\"Whether there are symbol locations that can be navigated via keyboard-only.\")),N1=qe(\"ISymbolNavigationService\");let $L=class{constructor(e,t,i,n){this._editorService=t,this._notificationService=i,this._keybindingService=n,this._currentModel=void 0,this._currentIdx=-1,this._ignoreEditorChange=!1,this._ctxHasSymbols=zE.bindTo(e)}reset(){var e,t;this._ctxHasSymbols.reset(),(e=this._currentState)===null||e===void 0||e.dispose(),(t=this._currentMessage)===null||t===void 0||t.dispose(),this._currentModel=void 0,this._currentIdx=-1}put(e){const t=e.parent.parent;if(t.references.length<=1){this.reset();return}this._currentModel=t,this._currentIdx=t.references.indexOf(e),this._ctxHasSymbols.set(!0),this._showMessage();const i=new jL(this._editorService),n=i.onDidChange(s=>{if(this._ignoreEditorChange)return;const r=this._editorService.getActiveCodeEditor();if(!r)return;const a=r.getModel(),l=r.getPosition();if(!a||!l)return;let c=!1,d=!1;for(const h of t.references)if(z4(h.uri,a.uri))c=!0,d=d||L.containsPosition(h.range,l);else if(c)break;(!c||!d)&&this.reset()});this._currentState=Pr(i,n)}revealNext(e){if(!this._currentModel)return Promise.resolve();this._currentIdx+=1,this._currentIdx%=this._currentModel.references.length;const t=this._currentModel.references[this._currentIdx];return this._showMessage(),this._ignoreEditorChange=!0,this._editorService.openCodeEditor({resource:t.uri,options:{selection:L.collapseToStart(t.range),selectionRevealType:3}},e).finally(()=>{this._ignoreEditorChange=!1})}_showMessage(){var e;(e=this._currentMessage)===null||e===void 0||e.dispose();const t=this._keybindingService.lookupKeybinding(\"editor.gotoNextSymbolFromResult\"),i=t?p(\"location.kb\",\"Symbol {0} of {1}, {2} for next\",this._currentIdx+1,this._currentModel.references.length,t.getLabel()):p(\"location\",\"Symbol {0} of {1}\",this._currentIdx+1,this._currentModel.references.length);this._currentMessage=this._notificationService.status(i)}};$L=MF([jf(0,xe),jf(1,dt),jf(2,gi),jf(3,rn)],$L);Xe(N1,$L,!0);Q(new class extends ji{constructor(){super({id:\"editor.gotoNextSymbolFromResult\",precondition:zE,kbOpts:{weight:100,primary:70}})}runEditorCommand(o,e){return o.get(N1).revealNext(e)}});ls.registerCommandAndKeybindingRule({id:\"editor.gotoNextSymbolFromResult.cancel\",weight:100,when:zE,primary:9,handler(o){o.get(N1).reset()}});let jL=class{constructor(e){this._listener=new Map,this._disposables=new ee,this._onDidChange=new O,this.onDidChange=this._onDidChange.event,this._disposables.add(e.onCodeEditorRemove(this._onDidRemoveEditor,this)),this._disposables.add(e.onCodeEditorAdd(this._onDidAddEditor,this)),e.listCodeEditors().forEach(this._onDidAddEditor,this)}dispose(){this._disposables.dispose(),this._onDidChange.dispose(),et(this._listener.values())}_onDidAddEditor(e){this._listener.set(e,Pr(e.onDidChangeCursorPosition(t=>this._onDidChange.fire({editor:e})),e.onDidChangeModelContent(t=>this._onDidChange.fire({editor:e}))))}_onDidRemoveEditor(e){var t;(t=this._listener.get(e))===null||t===void 0||t.dispose(),this._listener.delete(e)}};jL=MF([jf(0,dt)],jL);var AF=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};function f_(o,e,t,i){const s=t.ordered(o).map(r=>Promise.resolve(i(r,o,e)).then(void 0,a=>{Ai(a)}));return Promise.all(s).then(r=>{const a=[];for(const l of r)Array.isArray(l)?a.push(...l):l&&a.push(l);return a})}function UE(o,e,t,i){return f_(e,t,o,(n,s,r)=>n.provideDefinition(s,r,i))}function RF(o,e,t,i){return f_(e,t,o,(n,s,r)=>n.provideDeclaration(s,r,i))}function OF(o,e,t,i){return f_(e,t,o,(n,s,r)=>n.provideImplementation(s,r,i))}function PF(o,e,t,i){return f_(e,t,o,(n,s,r)=>n.provideTypeDefinition(s,r,i))}function T1(o,e,t,i,n){return f_(e,t,o,(s,r,a)=>AF(this,void 0,void 0,function*(){const l=yield s.provideReferences(r,a,{includeDeclaration:!0},n);if(!i||!l||l.length!==2)return l;const c=yield s.provideReferences(r,a,{includeDeclaration:!1},n);return c&&c.length===1?c:l}))}function p_(o){return AF(this,void 0,void 0,function*(){const e=yield o(),t=new ss(e,\"\"),i=t.references.map(n=>n.link);return t.dispose(),i})}Jr(\"_executeDefinitionProvider\",(o,e,t)=>{const i=o.get(ue),n=UE(i.definitionProvider,e,t,We.None);return p_(()=>n)});Jr(\"_executeTypeDefinitionProvider\",(o,e,t)=>{const i=o.get(ue),n=PF(i.typeDefinitionProvider,e,t,We.None);return p_(()=>n)});Jr(\"_executeDeclarationProvider\",(o,e,t)=>{const i=o.get(ue),n=RF(i.declarationProvider,e,t,We.None);return p_(()=>n)});Jr(\"_executeReferenceProvider\",(o,e,t)=>{const i=o.get(ue),n=T1(i.referenceProvider,e,t,!1,We.None);return p_(()=>n)});Jr(\"_executeImplementationProvider\",(o,e,t)=>{const i=o.get(ue),n=OF(i.implementationProvider,e,t,We.None);return p_(()=>n)});var mo=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})},DS,kS,xS,IS,ES,NS,TS,MS;po.appendMenuItem(A.EditorContext,{submenu:A.EditorContextPeek,title:p(\"peek.submenu\",\"Peek\"),group:\"navigation\",order:100});const FF=new Set;function nr(o){const e=new o;return lP(e),FF.add(e.id),e}class pm{constructor(e,t){this.model=e,this.position=t}static is(e){return!e||typeof e!=\"object\"?!1:!!(e instanceof pm||B.isIPosition(e.position)&&e.model)}}class _o extends he{constructor(e,t){super(t),this.configuration=e}run(e,t,i){if(!t.hasModel())return Promise.resolve(void 0);const n=e.get(gi),s=e.get(dt),r=e.get(kc),a=e.get(N1),l=e.get(ue),c=t.getModel(),d=t.getPosition(),h=pm.is(i)?i:new pm(c,d),u=new Kd(t,5),g=aI(this._getLocationModel(l,h.model,h.position,u.token),u.token).then(f=>mo(this,void 0,void 0,function*(){var _;if(!f||u.token.isCancellationRequested)return;un(f.ariaMessage);let b;if(f.referenceAt(c.uri,d)){const C=this._getAlternativeCommand(t);!_o._activeAlternativeCommands.has(C)&&FF.has(C)&&(b=t.getAction(C))}const v=f.references.length;if(v===0){if(!this.configuration.muteMessage){const C=c.getWordAtPosition(d);(_=rs.get(t))===null||_===void 0||_.showMessage(this._getNoResultFoundMessage(C),d)}}else if(v===1&&b)_o._activeAlternativeCommands.add(this.id),b.run().finally(()=>{_o._activeAlternativeCommands.delete(this.id)});else return this._onResult(s,a,t,f)}),f=>{n.error(f)}).finally(()=>{u.dispose()});return r.showWhile(g,250),g}_onResult(e,t,i,n){return mo(this,void 0,void 0,function*(){const s=this._getGoToPreference(i);if(!(i instanceof Zd)&&(this.configuration.openInPeek||s===\"peek\"&&n.references.length>1))this._openInPeek(i,n);else{const r=n.firstReference(),a=n.references.length>1&&s===\"gotoAndPeek\",l=yield this._openReference(i,e,r,this.configuration.openToSide,!a);a&&l?this._openInPeek(l,n):n.dispose(),s===\"goto\"&&t.put(r)}})}_openReference(e,t,i,n,s){return mo(this,void 0,void 0,function*(){let r;if(d$(i)&&(r=i.targetSelectionRange),r||(r=i.range),!r)return;const a=yield t.openCodeEditor({resource:i.uri,options:{selection:L.collapseToStart(r),selectionRevealType:3,selectionSource:\"code.jump\"}},e,n);if(!!a){if(s){const l=a.getModel(),c=a.createDecorationsCollection([{range:r,options:{description:\"symbol-navigate-action-highlight\",className:\"symbolHighlight\"}}]);setTimeout(()=>{a.getModel()===l&&c.clear()},350)}return a}})}_openInPeek(e,t){const i=vg.get(e);i&&e.hasModel()?i.toggleWidget(e.getSelection(),Ti(n=>Promise.resolve(t)),this.configuration.openInPeek):t.dispose()}}_o._activeAlternativeCommands=new Set;class m_ extends _o{_getLocationModel(e,t,i,n){return mo(this,void 0,void 0,function*(){return new ss(yield UE(e.definitionProvider,t,i,n),p(\"def.title\",\"Definitions\"))})}_getNoResultFoundMessage(e){return e&&e.word?p(\"noResultWord\",\"No definition found for '{0}'\",e.word):p(\"generic.noResults\",\"No definition found\")}_getAlternativeCommand(e){return e.getOption(53).alternativeDefinitionCommand}_getGoToPreference(e){return e.getOption(53).multipleDefinitions}}const BF=Lc&&!Ox()?2118:70;nr((DS=class KL extends m_{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:KL.id,label:p(\"actions.goToDecl.label\",\"Go to Definition\"),alias:\"Go to Definition\",precondition:re.and(T.hasDefinitionProvider,T.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:T.editorTextFocus,primary:BF,weight:100},contextMenuOpts:{group:\"navigation\",order:1.1}}),Ye.registerCommandAlias(\"editor.action.goToDeclaration\",KL.id)}},DS.id=\"editor.action.revealDefinition\",DS));nr((kS=class qL extends m_{constructor(){super({openToSide:!0,openInPeek:!1,muteMessage:!1},{id:qL.id,label:p(\"actions.goToDeclToSide.label\",\"Open Definition to the Side\"),alias:\"Open Definition to the Side\",precondition:re.and(T.hasDefinitionProvider,T.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,BF),weight:100}}),Ye.registerCommandAlias(\"editor.action.openDeclarationToTheSide\",qL.id)}},kS.id=\"editor.action.revealDefinitionAside\",kS));nr((xS=class GL extends m_{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:GL.id,label:p(\"actions.previewDecl.label\",\"Peek Definition\"),alias:\"Peek Definition\",precondition:re.and(T.hasDefinitionProvider,zn.notInPeekEditor,T.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:T.editorTextFocus,primary:582,linux:{primary:3140},weight:100},contextMenuOpts:{menuId:A.EditorContextPeek,group:\"peek\",order:2}}),Ye.registerCommandAlias(\"editor.action.previewDeclaration\",GL.id)}},xS.id=\"editor.action.peekDefinition\",xS));class WF extends _o{_getLocationModel(e,t,i,n){return mo(this,void 0,void 0,function*(){return new ss(yield RF(e.declarationProvider,t,i,n),p(\"decl.title\",\"Declarations\"))})}_getNoResultFoundMessage(e){return e&&e.word?p(\"decl.noResultWord\",\"No declaration found for '{0}'\",e.word):p(\"decl.generic.noResults\",\"No declaration found\")}_getAlternativeCommand(e){return e.getOption(53).alternativeDeclarationCommand}_getGoToPreference(e){return e.getOption(53).multipleDeclarations}}nr((IS=class VF extends WF{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:VF.id,label:p(\"actions.goToDeclaration.label\",\"Go to Declaration\"),alias:\"Go to Declaration\",precondition:re.and(T.hasDeclarationProvider,T.isInWalkThroughSnippet.toNegated()),contextMenuOpts:{group:\"navigation\",order:1.3}})}_getNoResultFoundMessage(e){return e&&e.word?p(\"decl.noResultWord\",\"No declaration found for '{0}'\",e.word):p(\"decl.generic.noResults\",\"No declaration found\")}},IS.id=\"editor.action.revealDeclaration\",IS));nr(class extends WF{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:\"editor.action.peekDeclaration\",label:p(\"actions.peekDecl.label\",\"Peek Declaration\"),alias:\"Peek Declaration\",precondition:re.and(T.hasDeclarationProvider,zn.notInPeekEditor,T.isInWalkThroughSnippet.toNegated()),contextMenuOpts:{menuId:A.EditorContextPeek,group:\"peek\",order:3}})}});class HF extends _o{_getLocationModel(e,t,i,n){return mo(this,void 0,void 0,function*(){return new ss(yield PF(e.typeDefinitionProvider,t,i,n),p(\"typedef.title\",\"Type Definitions\"))})}_getNoResultFoundMessage(e){return e&&e.word?p(\"goToTypeDefinition.noResultWord\",\"No type definition found for '{0}'\",e.word):p(\"goToTypeDefinition.generic.noResults\",\"No type definition found\")}_getAlternativeCommand(e){return e.getOption(53).alternativeTypeDefinitionCommand}_getGoToPreference(e){return e.getOption(53).multipleTypeDefinitions}}nr((ES=class zF extends HF{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:zF.ID,label:p(\"actions.goToTypeDefinition.label\",\"Go to Type Definition\"),alias:\"Go to Type Definition\",precondition:re.and(T.hasTypeDefinitionProvider,T.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:T.editorTextFocus,primary:0,weight:100},contextMenuOpts:{group:\"navigation\",order:1.4}})}},ES.ID=\"editor.action.goToTypeDefinition\",ES));nr((NS=class UF extends HF{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:UF.ID,label:p(\"actions.peekTypeDefinition.label\",\"Peek Type Definition\"),alias:\"Peek Type Definition\",precondition:re.and(T.hasTypeDefinitionProvider,zn.notInPeekEditor,T.isInWalkThroughSnippet.toNegated()),contextMenuOpts:{menuId:A.EditorContextPeek,group:\"peek\",order:4}})}},NS.ID=\"editor.action.peekTypeDefinition\",NS));class $F extends _o{_getLocationModel(e,t,i,n){return mo(this,void 0,void 0,function*(){return new ss(yield OF(e.implementationProvider,t,i,n),p(\"impl.title\",\"Implementations\"))})}_getNoResultFoundMessage(e){return e&&e.word?p(\"goToImplementation.noResultWord\",\"No implementation found for '{0}'\",e.word):p(\"goToImplementation.generic.noResults\",\"No implementation found\")}_getAlternativeCommand(e){return e.getOption(53).alternativeImplementationCommand}_getGoToPreference(e){return e.getOption(53).multipleImplementations}}nr((TS=class jF extends $F{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:jF.ID,label:p(\"actions.goToImplementation.label\",\"Go to Implementations\"),alias:\"Go to Implementations\",precondition:re.and(T.hasImplementationProvider,T.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:T.editorTextFocus,primary:2118,weight:100},contextMenuOpts:{group:\"navigation\",order:1.45}})}},TS.ID=\"editor.action.goToImplementation\",TS));nr((MS=class KF extends $F{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:KF.ID,label:p(\"actions.peekImplementation.label\",\"Peek Implementations\"),alias:\"Peek Implementations\",precondition:re.and(T.hasImplementationProvider,zn.notInPeekEditor,T.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:T.editorTextFocus,primary:3142,weight:100},contextMenuOpts:{menuId:A.EditorContextPeek,group:\"peek\",order:5}})}},MS.ID=\"editor.action.peekImplementation\",MS));class qF extends _o{_getNoResultFoundMessage(e){return e?p(\"references.no\",\"No references found for '{0}'\",e.word):p(\"references.noGeneric\",\"No references found\")}_getAlternativeCommand(e){return e.getOption(53).alternativeReferenceCommand}_getGoToPreference(e){return e.getOption(53).multipleReferences}}nr(class extends qF{constructor(){super({openToSide:!1,openInPeek:!1,muteMessage:!1},{id:\"editor.action.goToReferences\",label:p(\"goToReferences.label\",\"Go to References\"),alias:\"Go to References\",precondition:re.and(T.hasReferenceProvider,zn.notInPeekEditor,T.isInWalkThroughSnippet.toNegated()),kbOpts:{kbExpr:T.editorTextFocus,primary:1094,weight:100},contextMenuOpts:{group:\"navigation\",order:1.45}})}_getLocationModel(e,t,i,n){return mo(this,void 0,void 0,function*(){return new ss(yield T1(e.referenceProvider,t,i,!0,n),p(\"ref.title\",\"References\"))})}});nr(class extends qF{constructor(){super({openToSide:!1,openInPeek:!0,muteMessage:!1},{id:\"editor.action.referenceSearch.trigger\",label:p(\"references.action.label\",\"Peek References\"),alias:\"Peek References\",precondition:re.and(T.hasReferenceProvider,zn.notInPeekEditor,T.isInWalkThroughSnippet.toNegated()),contextMenuOpts:{menuId:A.EditorContextPeek,group:\"peek\",order:6}})}_getLocationModel(e,t,i,n){return mo(this,void 0,void 0,function*(){return new ss(yield T1(e.referenceProvider,t,i,!1,n),p(\"ref.title\",\"References\"))})}});class QQ extends _o{constructor(e,t,i){super(e,{id:\"editor.action.goToLocation\",label:p(\"label.generic\",\"Go to Any Symbol\"),alias:\"Go to Any Symbol\",precondition:re.and(zn.notInPeekEditor,T.isInWalkThroughSnippet.toNegated())}),this._references=t,this._gotoMultipleBehaviour=i}_getLocationModel(e,t,i,n){return mo(this,void 0,void 0,function*(){return new ss(this._references,p(\"generic.title\",\"Locations\"))})}_getNoResultFoundMessage(e){return e&&p(\"generic.noResult\",\"No results for '{0}'\",e.word)||\"\"}_getGoToPreference(e){var t;return(t=this._gotoMultipleBehaviour)!==null&&t!==void 0?t:e.getOption(53).multipleReferences}_getAlternativeCommand(){return\"\"}}Ye.registerCommand({id:\"editor.action.goToLocations\",description:{description:\"Go to locations from a position in a file\",args:[{name:\"uri\",description:\"The text document in which to start\",constraint:me},{name:\"position\",description:\"The position at which to start\",constraint:B.isIPosition},{name:\"locations\",description:\"An array of locations.\",constraint:Array},{name:\"multiple\",description:\"Define what to do when having multiple results, either `peek`, `gotoAndPeek`, or `goto\"},{name:\"noResultsMessage\",description:\"Human readable message that shows when locations is empty.\"}]},handler:(o,e,t,i,n,s,r)=>mo(void 0,void 0,void 0,function*(){gt(me.isUri(e)),gt(B.isIPosition(t)),gt(Array.isArray(i)),gt(typeof n==\"undefined\"||typeof n==\"string\"),gt(typeof r==\"undefined\"||typeof r==\"boolean\");const a=o.get(dt),l=yield a.openCodeEditor({resource:e},a.getFocusedCodeEditor());if(pc(l))return l.setPosition(t),l.revealPositionInCenterIfOutsideViewport(t,0),l.invokeWithinContext(c=>{const d=new class extends QQ{_getNoResultFoundMessage(h){return s||super._getNoResultFoundMessage(h)}}({muteMessage:!Boolean(s),openInPeek:Boolean(r),openToSide:!1},i,n);c.get(Re).invokeFunction(d.run.bind(d),l)})})});Ye.registerCommand({id:\"editor.action.peekLocations\",description:{description:\"Peek locations from a position in a file\",args:[{name:\"uri\",description:\"The text document in which to start\",constraint:me},{name:\"position\",description:\"The position at which to start\",constraint:B.isIPosition},{name:\"locations\",description:\"An array of locations.\",constraint:Array},{name:\"multiple\",description:\"Define what to do when having multiple results, either `peek`, `gotoAndPeek`, or `goto\"}]},handler:(o,e,t,i,n)=>mo(void 0,void 0,void 0,function*(){o.get(Ci).executeCommand(\"editor.action.goToLocations\",e,t,i,n,void 0,!0)})});Ye.registerCommand({id:\"editor.action.findReferences\",handler:(o,e,t)=>{gt(me.isUri(e)),gt(B.isIPosition(t));const i=o.get(ue),n=o.get(dt);return n.openCodeEditor({resource:e},n.getFocusedCodeEditor()).then(s=>{if(!pc(s)||!s.hasModel())return;const r=vg.get(s);if(!r)return;const a=Ti(c=>T1(i.referenceProvider,s.getModel(),B.lift(t),!1,c).then(d=>new ss(d,p(\"ref.title\",\"References\")))),l=new L(t.lineNumber,t.column,t.lineNumber,t.column);return Promise.resolve(r.toggleWidget(l,a,!1))})}});Ye.registerCommandAlias(\"editor.action.showReferences\",\"editor.action.peekLocations\");po.appendMenuItems([{id:A.MenubarGoMenu,item:{command:{id:\"editor.action.revealDefinition\",title:p({key:\"miGotoDefinition\",comment:[\"&& denotes a mnemonic\"]},\"Go to &&Definition\")},group:\"4_symbol_nav\",order:2}},{id:A.MenubarGoMenu,item:{command:{id:\"editor.action.revealDeclaration\",title:p({key:\"miGotoDeclaration\",comment:[\"&& denotes a mnemonic\"]},\"Go to &&Declaration\")},group:\"4_symbol_nav\",order:3}},{id:A.MenubarGoMenu,item:{command:{id:\"editor.action.goToTypeDefinition\",title:p({key:\"miGotoTypeDefinition\",comment:[\"&& denotes a mnemonic\"]},\"Go to &&Type Definition\")},group:\"4_symbol_nav\",order:3}},{id:A.MenubarGoMenu,item:{command:{id:\"editor.action.goToImplementation\",title:p({key:\"miGotoImplementation\",comment:[\"&& denotes a mnemonic\"]},\"Go to &&Implementations\")},group:\"4_symbol_nav\",order:4}},{id:A.MenubarGoMenu,item:{command:{id:\"editor.action.goToReferences\",title:p({key:\"miGotoReference\",comment:[\"&& denotes a mnemonic\"]},\"Go to &&References\")},group:\"4_symbol_nav\",order:5}}]);var JQ=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},AS=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let Jd=class h0{constructor(e,t,i,n){this.textModelResolverService=t,this.languageService=i,this.languageFeaturesService=n,this.toUnhook=new ee,this.toUnhookForKeyboard=new ee,this.currentWordAtPosition=null,this.previousPromise=null,this.editor=e,this.linkDecorations=this.editor.createDecorationsCollection();const s=new CE(e);this.toUnhook.add(s),this.toUnhook.add(s.onMouseMoveOrRelevantKeyDown(([r,a])=>{this.startFindDefinitionFromMouse(r,Na(a))})),this.toUnhook.add(s.onExecute(r=>{this.isEnabled(r)&&this.gotoDefinition(r.target.position,r.hasSideBySideModifier).then(()=>{this.removeLinkDecorations()},a=>{this.removeLinkDecorations(),Ee(a)})})),this.toUnhook.add(s.onCancel(()=>{this.removeLinkDecorations(),this.currentWordAtPosition=null}))}static get(e){return e.getContribution(h0.ID)}startFindDefinitionFromCursor(e){return this.startFindDefinition(e).then(()=>{this.toUnhookForKeyboard.add(this.editor.onDidChangeCursorPosition(()=>{this.currentWordAtPosition=null,this.removeLinkDecorations(),this.toUnhookForKeyboard.clear()})),this.toUnhookForKeyboard.add(this.editor.onKeyDown(t=>{t&&(this.currentWordAtPosition=null,this.removeLinkDecorations(),this.toUnhookForKeyboard.clear())}))})}startFindDefinitionFromMouse(e,t){if(e.target.type===9&&this.linkDecorations.length>0)return;if(!this.editor.hasModel()||!this.isEnabled(e,t)){this.currentWordAtPosition=null,this.removeLinkDecorations();return}const i=e.target.position;this.startFindDefinition(i)}startFindDefinition(e){var t;this.toUnhookForKeyboard.clear();const i=e?(t=this.editor.getModel())===null||t===void 0?void 0:t.getWordAtPosition(e):null;if(!i)return this.currentWordAtPosition=null,this.removeLinkDecorations(),Promise.resolve(0);if(this.currentWordAtPosition&&this.currentWordAtPosition.startColumn===i.startColumn&&this.currentWordAtPosition.endColumn===i.endColumn&&this.currentWordAtPosition.word===i.word)return Promise.resolve(0);this.currentWordAtPosition=i;const n=new om(this.editor,15);return this.previousPromise&&(this.previousPromise.cancel(),this.previousPromise=null),this.previousPromise=Ti(s=>this.findDefinition(e,s)),this.previousPromise.then(s=>{if(!s||!s.length||!n.validate(this.editor)){this.removeLinkDecorations();return}if(s.length>1)this.addDecoration(new L(e.lineNumber,i.startColumn,e.lineNumber,i.endColumn),new Rn().appendText(p(\"multipleResults\",\"Click to show {0} definitions.\",s.length)));else{const r=s[0];if(!r.uri)return;this.textModelResolverService.createModelReference(r.uri).then(a=>{if(!a.object||!a.object.textEditorModel){a.dispose();return}const{object:{textEditorModel:l}}=a,{startLineNumber:c}=r.range;if(c<1||c>l.getLineCount()){a.dispose();return}const d=this.getPreviewValue(l,c,r);let h;r.originSelectionRange?h=L.lift(r.originSelectionRange):h=new L(e.lineNumber,i.startColumn,e.lineNumber,i.endColumn);const u=this.languageService.guessLanguageIdByFilepathOrFirstLine(l.uri);this.addDecoration(h,new Rn().appendCodeblock(u||\"\",d)),a.dispose()})}}).then(void 0,Ee)}getPreviewValue(e,t,i){let n=i.range;return n.endLineNumber-n.startLineNumber>=h0.MAX_SOURCE_PREVIEW_LINES&&(n=this.getPreviewRangeBasedOnIndentation(e,t)),this.stripIndentationFromPreviewRange(e,t,n)}stripIndentationFromPreviewRange(e,t,i){let s=e.getLineFirstNonWhitespaceColumn(t);for(let a=t+1;a<i.endLineNumber;a++){const l=e.getLineFirstNonWhitespaceColumn(a);s=Math.min(s,l)}return e.getValueInRange(i).replace(new RegExp(`^\\\\s{${s-1}}`,\"gm\"),\"\").trim()}getPreviewRangeBasedOnIndentation(e,t){const i=e.getLineFirstNonWhitespaceColumn(t),n=Math.min(e.getLineCount(),t+h0.MAX_SOURCE_PREVIEW_LINES);let s=t+1;for(;s<n;s++){const r=e.getLineFirstNonWhitespaceColumn(s);if(i===r)break}return new L(t,1,s+1,1)}addDecoration(e,t){const i={range:e,options:{description:\"goto-definition-link\",inlineClassName:\"goto-definition-link\",hoverMessage:t}};this.linkDecorations.set([i])}removeLinkDecorations(){this.linkDecorations.clear()}isEnabled(e,t){return this.editor.hasModel()&&e.isNoneOrSingleMouseDown&&e.target.type===6&&(e.hasTriggerModifier||(t?t.keyCodeIsTriggerKey:!1))&&this.languageFeaturesService.definitionProvider.has(this.editor.getModel())}findDefinition(e,t){const i=this.editor.getModel();return i?UE(this.languageFeaturesService.definitionProvider,i,e,t):Promise.resolve(null)}gotoDefinition(e,t){return this.editor.setPosition(e),this.editor.invokeWithinContext(i=>{const n=!t&&this.editor.getOption(80)&&!this.isInPeekEditor(i);return new m_({openToSide:t,openInPeek:n,muteMessage:!0},{alias:\"\",label:\"\",id:\"\",precondition:void 0}).run(i,this.editor)})}isInPeekEditor(e){const t=e.get(xe);return zn.inPeekEditor.getValue(t)}dispose(){this.toUnhook.dispose()}};Jd.ID=\"editor.contrib.gotodefinitionatposition\";Jd.MAX_SOURCE_PREVIEW_LINES=8;Jd=JQ([AS(1,$n),AS(2,Ht),AS(3,ue)],Jd);rt(Jd.ID,Jd);Rt((o,e)=>{const t=o.getColor(vI);t&&e.addRule(`.monaco-editor .goto-definition-link { color: ${t} !important; }`)});const pb=se;class GF extends z{constructor(){super(),this.containerDomNode=document.createElement(\"div\"),this.containerDomNode.className=\"monaco-hover\",this.containerDomNode.tabIndex=0,this.containerDomNode.setAttribute(\"role\",\"tooltip\"),this.contentsDomNode=document.createElement(\"div\"),this.contentsDomNode.className=\"monaco-hover-content\",this.scrollbar=this._register(new e_(this.contentsDomNode,{consumeMouseWheelIfScrollbarIsNeeded:!0})),this.containerDomNode.appendChild(this.scrollbar.getDomNode())}onContentsChanged(){this.scrollbar.scanDomNode()}}class $E extends z{constructor(e,t,i){super(),this.actionContainer=G(e,pb(\"div.action-container\")),this.actionContainer.setAttribute(\"tabindex\",\"0\"),this.action=G(this.actionContainer,pb(\"a.action\")),this.action.setAttribute(\"role\",\"button\"),t.iconClass&&G(this.action,pb(`span.icon.${t.iconClass}`));const n=G(this.action,pb(\"span\"));n.textContent=i?`${t.label} (${i})`:t.label,this._register(q(this.actionContainer,le.CLICK,s=>{s.stopPropagation(),s.preventDefault(),t.run(this.actionContainer)})),this._register(q(this.actionContainer,le.KEY_UP,s=>{new Mt(s).equals(3)&&(s.stopPropagation(),s.preventDefault(),t.run(this.actionContainer))})),this.setEnabled(!0)}static render(e,t,i){return new $E(e,t,i)}setEnabled(e){e?(this.actionContainer.classList.remove(\"disabled\"),this.actionContainer.removeAttribute(\"aria-disabled\")):(this.actionContainer.classList.add(\"disabled\"),this.actionContainer.setAttribute(\"aria-disabled\",\"true\"))}}var eJ=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})},tJ=globalThis&&globalThis.__asyncValues||function(o){if(!Symbol.asyncIterator)throw new TypeError(\"Symbol.asyncIterator is not defined.\");var e=o[Symbol.asyncIterator],t;return e?e.call(o):(o=typeof __values==\"function\"?__values(o):o[Symbol.iterator](),t={},i(\"next\"),i(\"throw\"),i(\"return\"),t[Symbol.asyncIterator]=function(){return this},t);function i(s){t[s]=o[s]&&function(r){return new Promise(function(a,l){r=o[s](r),n(a,l,r.done,r.value)})}}function n(s,r,a,l){Promise.resolve(l).then(function(c){s({value:c,done:a})},r)}};class iJ{constructor(e,t,i){this.value=e,this.isComplete=t,this.hasLoadingMessage=i}}class ZF extends z{constructor(e,t){super(),this._editor=e,this._computer=t,this._onResult=this._register(new O),this.onResult=this._onResult.event,this._firstWaitScheduler=this._register(new ft(()=>this._triggerAsyncComputation(),0)),this._secondWaitScheduler=this._register(new ft(()=>this._triggerSyncComputation(),0)),this._loadingMessageScheduler=this._register(new ft(()=>this._triggerLoadingMessage(),0)),this._state=0,this._asyncIterable=null,this._asyncIterableDone=!1,this._result=[]}dispose(){this._asyncIterable&&(this._asyncIterable.cancel(),this._asyncIterable=null),super.dispose()}get _hoverTime(){return this._editor.getOption(55).delay}get _firstWaitTime(){return this._hoverTime/2}get _secondWaitTime(){return this._hoverTime-this._firstWaitTime}get _loadingMessageTime(){return 3*this._hoverTime}_setState(e,t=!0){this._state=e,t&&this._fireResult()}_triggerAsyncComputation(){this._setState(2),this._secondWaitScheduler.schedule(this._secondWaitTime),this._computer.computeAsync?(this._asyncIterableDone=!1,this._asyncIterable=bH(e=>this._computer.computeAsync(e)),eJ(this,void 0,void 0,function*(){var e,t;try{try{for(var i=tJ(this._asyncIterable),n;n=yield i.next(),!n.done;){const s=n.value;s&&(this._result.push(s),this._fireResult())}}catch(s){e={error:s}}finally{try{n&&!n.done&&(t=i.return)&&(yield t.call(i))}finally{if(e)throw e.error}}this._asyncIterableDone=!0,(this._state===3||this._state===4)&&this._setState(0)}catch(s){Ee(s)}})):this._asyncIterableDone=!0}_triggerSyncComputation(){this._computer.computeSync&&(this._result=this._result.concat(this._computer.computeSync())),this._setState(this._asyncIterableDone?0:3)}_triggerLoadingMessage(){this._state===3&&this._setState(4)}_fireResult(){if(this._state===1||this._state===2)return;const e=this._state===0,t=this._state===4;this._onResult.fire(new iJ(this._result.slice(0),e,t))}start(e){if(e===0)this._state===0&&(this._setState(1),this._firstWaitScheduler.schedule(this._firstWaitTime),this._loadingMessageScheduler.schedule(this._loadingMessageTime));else switch(this._state){case 0:this._triggerAsyncComputation(),this._secondWaitScheduler.cancel(),this._triggerSyncComputation();break;case 2:this._secondWaitScheduler.cancel(),this._triggerSyncComputation();break}}cancel(){this._firstWaitScheduler.cancel(),this._secondWaitScheduler.cancel(),this._loadingMessageScheduler.cancel(),this._asyncIterable&&(this._asyncIterable.cancel(),this._asyncIterable=null),this._result=[],this._setState(0,!1)}}class RS{constructor(e,t){this.priority=e,this.range=t,this.type=1}equals(e){return e.type===1&&this.range.equalsRange(e.range)}canAdoptVisibleHover(e,t){return e.type===1&&t.lineNumber===this.range.startLineNumber}}class u0{constructor(e,t,i){this.priority=e,this.owner=t,this.range=i,this.type=2}equals(e){return e.type===2&&this.owner===e.owner}canAdoptVisibleHover(e,t){return e.type===2&&this.owner===e.owner}}const xh=new class{constructor(){this._participants=[]}register(e){this._participants.push(e)}getAll(){return this._participants}};class ao{constructor(){this.value=\"\",this.pos=0}static isDigitCharacter(e){return e>=48&&e<=57}static isVariableCharacter(e){return e===95||e>=97&&e<=122||e>=65&&e<=90}text(e){this.value=e,this.pos=0}tokenText(e){return this.value.substr(e.pos,e.len)}next(){if(this.pos>=this.value.length)return{type:14,pos:this.pos,len:0};const e=this.pos;let t=0,i=this.value.charCodeAt(e),n;if(n=ao._table[i],typeof n==\"number\")return this.pos+=1,{type:n,pos:e,len:1};if(ao.isDigitCharacter(i)){n=8;do t+=1,i=this.value.charCodeAt(e+t);while(ao.isDigitCharacter(i));return this.pos+=t,{type:n,pos:e,len:t}}if(ao.isVariableCharacter(i)){n=9;do i=this.value.charCodeAt(e+ ++t);while(ao.isVariableCharacter(i)||ao.isDigitCharacter(i));return this.pos+=t,{type:n,pos:e,len:t}}n=10;do t+=1,i=this.value.charCodeAt(e+t);while(!isNaN(i)&&typeof ao._table[i]==\"undefined\"&&!ao.isDigitCharacter(i)&&!ao.isVariableCharacter(i));return this.pos+=t,{type:n,pos:e,len:t}}}ao._table={[36]:0,[58]:1,[44]:2,[123]:3,[125]:4,[92]:5,[47]:6,[124]:7,[43]:11,[45]:12,[63]:13};class qg{constructor(){this._children=[]}appendChild(e){return e instanceof On&&this._children[this._children.length-1]instanceof On?this._children[this._children.length-1].value+=e.value:(e.parent=this,this._children.push(e)),this}replace(e,t){const{parent:i}=e,n=i.children.indexOf(e),s=i.children.slice(0);s.splice(n,1,...t),i._children=s,function r(a,l){for(const c of a)c.parent=l,r(c.children,c)}(t,i)}get children(){return this._children}get snippet(){let e=this;for(;;){if(!e)return;if(e instanceof __)return e;e=e.parent}}toString(){return this.children.reduce((e,t)=>e+t.toString(),\"\")}len(){return 0}}class On extends qg{constructor(e){super(),this.value=e}toString(){return this.value}len(){return this.value.length}clone(){return new On(this.value)}}class YF extends qg{}class lo extends YF{constructor(e){super(),this.index=e}static compareByIndex(e,t){return e.index===t.index?0:e.isFinalTabstop?1:t.isFinalTabstop||e.index<t.index?-1:e.index>t.index?1:0}get isFinalTabstop(){return this.index===0}get choice(){return this._children.length===1&&this._children[0]instanceof Gg?this._children[0]:void 0}clone(){const e=new lo(this.index);return this.transform&&(e.transform=this.transform.clone()),e._children=this.children.map(t=>t.clone()),e}}class Gg extends qg{constructor(){super(...arguments),this.options=[]}appendChild(e){return e instanceof On&&(e.parent=this,this.options.push(e)),this}toString(){return this.options[0].value}len(){return this.options[0].len()}clone(){const e=new Gg;return this.options.forEach(e.appendChild,e),e}}class jE extends qg{constructor(){super(...arguments),this.regexp=new RegExp(\"\")}resolve(e){const t=this;let i=!1,n=e.replace(this.regexp,function(){return i=!0,t._replace(Array.prototype.slice.call(arguments,0,-2))});return!i&&this._children.some(s=>s instanceof To&&Boolean(s.elseValue))&&(n=this._replace([])),n}_replace(e){let t=\"\";for(const i of this._children)if(i instanceof To){let n=e[i.index]||\"\";n=i.resolve(n),t+=n}else t+=i.toString();return t}toString(){return\"\"}clone(){const e=new jE;return e.regexp=new RegExp(this.regexp.source,(this.regexp.ignoreCase?\"i\":\"\")+(this.regexp.global?\"g\":\"\")),e._children=this.children.map(t=>t.clone()),e}}class To extends qg{constructor(e,t,i,n){super(),this.index=e,this.shorthandName=t,this.ifValue=i,this.elseValue=n}resolve(e){return this.shorthandName===\"upcase\"?e?e.toLocaleUpperCase():\"\":this.shorthandName===\"downcase\"?e?e.toLocaleLowerCase():\"\":this.shorthandName===\"capitalize\"?e?e[0].toLocaleUpperCase()+e.substr(1):\"\":this.shorthandName===\"pascalcase\"?e?this._toPascalCase(e):\"\":this.shorthandName===\"camelcase\"?e?this._toCamelCase(e):\"\":Boolean(e)&&typeof this.ifValue==\"string\"?this.ifValue:!Boolean(e)&&typeof this.elseValue==\"string\"?this.elseValue:e||\"\"}_toPascalCase(e){const t=e.match(/[a-z0-9]+/gi);return t?t.map(i=>i.charAt(0).toUpperCase()+i.substr(1)).join(\"\"):e}_toCamelCase(e){const t=e.match(/[a-z0-9]+/gi);return t?t.map((i,n)=>n===0?i.charAt(0).toLowerCase()+i.substr(1):i.charAt(0).toUpperCase()+i.substr(1)).join(\"\"):e}clone(){return new To(this.index,this.shorthandName,this.ifValue,this.elseValue)}}class mm extends YF{constructor(e){super(),this.name=e}resolve(e){let t=e.resolve(this);return this.transform&&(t=this.transform.resolve(t||\"\")),t!==void 0?(this._children=[new On(t)],!0):!1}clone(){const e=new mm(this.name);return this.transform&&(e.transform=this.transform.clone()),e._children=this.children.map(t=>t.clone()),e}}function VM(o,e){const t=[...o];for(;t.length>0;){const i=t.shift();if(!e(i))break;t.unshift(...i.children)}}class __ extends qg{get placeholderInfo(){if(!this._placeholders){const e=[];let t;this.walk(function(i){return i instanceof lo&&(e.push(i),t=!t||t.index<i.index?i:t),!0}),this._placeholders={all:e,last:t}}return this._placeholders}get placeholders(){const{all:e}=this.placeholderInfo;return e}offset(e){let t=0,i=!1;return this.walk(n=>n===e?(i=!0,!1):(t+=n.len(),!0)),i?t:-1}fullLen(e){let t=0;return VM([e],i=>(t+=i.len(),!0)),t}enclosingPlaceholders(e){const t=[];let{parent:i}=e;for(;i;)i instanceof lo&&t.push(i),i=i.parent;return t}resolveVariables(e){return this.walk(t=>(t instanceof mm&&t.resolve(e)&&(this._placeholders=void 0),!0)),this}appendChild(e){return this._placeholders=void 0,super.appendChild(e)}replace(e,t){return this._placeholders=void 0,super.replace(e,t)}clone(){const e=new __;return this._children=this.children.map(t=>t.clone()),e}walk(e){VM(this.children,e)}}class _c{constructor(){this._scanner=new ao,this._token={type:14,pos:0,len:0}}static escape(e){return e.replace(/\\$|}|\\\\/g,\"\\\\$&\")}static guessNeedsClipboard(e){return/\\${?CLIPBOARD/.test(e)}parse(e,t,i){const n=new __;return this.parseFragment(e,n),this.ensureFinalTabstop(n,i!=null?i:!1,t!=null?t:!1),n}parseFragment(e,t){const i=t.children.length;for(this._scanner.text(e),this._token=this._scanner.next();this._parse(t););const n=new Map,s=[];t.walk(r=>(r instanceof lo&&(r.isFinalTabstop?n.set(0,void 0):!n.has(r.index)&&r.children.length>0?n.set(r.index,r.children):s.push(r)),!0));for(const r of s){const a=n.get(r.index);if(a){const l=new lo(r.index);l.transform=r.transform;for(const c of a)l.appendChild(c.clone());t.replace(r,[l])}}return t.children.slice(i)}ensureFinalTabstop(e,t,i){(t||i&&e.placeholders.length>0)&&(e.placeholders.find(s=>s.index===0)||e.appendChild(new lo(0)))}_accept(e,t){if(e===void 0||this._token.type===e){const i=t?this._scanner.tokenText(this._token):!0;return this._token=this._scanner.next(),i}return!1}_backTo(e){return this._scanner.pos=e.pos+e.len,this._token=e,!1}_until(e){const t=this._token;for(;this._token.type!==e;){if(this._token.type===14)return!1;if(this._token.type===5){const n=this._scanner.next();if(n.type!==0&&n.type!==4&&n.type!==5)return!1}this._token=this._scanner.next()}const i=this._scanner.value.substring(t.pos,this._token.pos).replace(/\\\\(\\$|}|\\\\)/g,\"$1\");return this._token=this._scanner.next(),i}_parse(e){return this._parseEscaped(e)||this._parseTabstopOrVariableName(e)||this._parseComplexPlaceholder(e)||this._parseComplexVariable(e)||this._parseAnything(e)}_parseEscaped(e){let t;return(t=this._accept(5,!0))?(t=this._accept(0,!0)||this._accept(4,!0)||this._accept(5,!0)||t,e.appendChild(new On(t)),!0):!1}_parseTabstopOrVariableName(e){let t;const i=this._token;return this._accept(0)&&(t=this._accept(9,!0)||this._accept(8,!0))?(e.appendChild(/^\\d+$/.test(t)?new lo(Number(t)):new mm(t)),!0):this._backTo(i)}_parseComplexPlaceholder(e){let t;const i=this._token;if(!(this._accept(0)&&this._accept(3)&&(t=this._accept(8,!0))))return this._backTo(i);const s=new lo(Number(t));if(this._accept(1))for(;;){if(this._accept(4))return e.appendChild(s),!0;if(!this._parse(s))return e.appendChild(new On(\"${\"+t+\":\")),s.children.forEach(e.appendChild,e),!0}else if(s.index>0&&this._accept(7)){const r=new Gg;for(;;){if(this._parseChoiceElement(r)){if(this._accept(2))continue;if(this._accept(7)&&(s.appendChild(r),this._accept(4)))return e.appendChild(s),!0}return this._backTo(i),!1}}else return this._accept(6)?this._parseTransform(s)?(e.appendChild(s),!0):(this._backTo(i),!1):this._accept(4)?(e.appendChild(s),!0):this._backTo(i)}_parseChoiceElement(e){const t=this._token,i=[];for(;!(this._token.type===2||this._token.type===7);){let n;if((n=this._accept(5,!0))?n=this._accept(2,!0)||this._accept(7,!0)||this._accept(5,!0)||n:n=this._accept(void 0,!0),!n)return this._backTo(t),!1;i.push(n)}return i.length===0?(this._backTo(t),!1):(e.appendChild(new On(i.join(\"\"))),!0)}_parseComplexVariable(e){let t;const i=this._token;if(!(this._accept(0)&&this._accept(3)&&(t=this._accept(9,!0))))return this._backTo(i);const s=new mm(t);if(this._accept(1))for(;;){if(this._accept(4))return e.appendChild(s),!0;if(!this._parse(s))return e.appendChild(new On(\"${\"+t+\":\")),s.children.forEach(e.appendChild,e),!0}else return this._accept(6)?this._parseTransform(s)?(e.appendChild(s),!0):(this._backTo(i),!1):this._accept(4)?(e.appendChild(s),!0):this._backTo(i)}_parseTransform(e){const t=new jE;let i=\"\",n=\"\";for(;!this._accept(6);){let s;if(s=this._accept(5,!0)){s=this._accept(6,!0)||s,i+=s;continue}if(this._token.type!==14){i+=this._accept(void 0,!0);continue}return!1}for(;!this._accept(6);){let s;if(s=this._accept(5,!0)){s=this._accept(5,!0)||this._accept(6,!0)||s,t.appendChild(new On(s));continue}if(!(this._parseFormatString(t)||this._parseAnything(t)))return!1}for(;!this._accept(4);){if(this._token.type!==14){n+=this._accept(void 0,!0);continue}return!1}try{t.regexp=new RegExp(i,n)}catch(s){return!1}return e.transform=t,!0}_parseFormatString(e){const t=this._token;if(!this._accept(0))return!1;let i=!1;this._accept(3)&&(i=!0);const n=this._accept(8,!0);if(n)if(i){if(this._accept(4))return e.appendChild(new To(Number(n))),!0;if(!this._accept(1))return this._backTo(t),!1}else return e.appendChild(new To(Number(n))),!0;else return this._backTo(t),!1;if(this._accept(6)){const s=this._accept(9,!0);return!s||!this._accept(4)?(this._backTo(t),!1):(e.appendChild(new To(Number(n),s)),!0)}else if(this._accept(11)){const s=this._until(4);if(s)return e.appendChild(new To(Number(n),void 0,s,void 0)),!0}else if(this._accept(12)){const s=this._until(4);if(s)return e.appendChild(new To(Number(n),void 0,void 0,s)),!0}else if(this._accept(13)){const s=this._until(1);if(s){const r=this._until(4);if(r)return e.appendChild(new To(Number(n),void 0,s,r)),!0}}else{const s=this._until(4);if(s)return e.appendChild(new To(Number(n),void 0,void 0,s)),!0}return this._backTo(t),!1}_parseAnything(e){return this._token.type!==14?(e.appendChild(new On(this._scanner.tokenText(this._token))),this._accept(void 0),!0):!1}}const nJ=p(\"defaultLabel\",\"input\"),sJ=p(\"label.preserveCaseToggle\",\"Preserve Case\");class oJ extends h_{constructor(e){super({icon:m.preserveCase,title:sJ+e.appendTitle,isChecked:e.isChecked,inputActiveOptionBorder:e.inputActiveOptionBorder,inputActiveOptionForeground:e.inputActiveOptionForeground,inputActiveOptionBackground:e.inputActiveOptionBackground})}}class rJ extends tr{constructor(e,t,i,n){super(),this._showOptionButtons=i,this.fixFocusOnOptionClickEnabled=!0,this.cachedOptionsWidth=0,this._onDidOptionChange=this._register(new O),this.onDidOptionChange=this._onDidOptionChange.event,this._onKeyDown=this._register(new O),this.onKeyDown=this._onKeyDown.event,this._onMouseDown=this._register(new O),this._onInput=this._register(new O),this._onKeyUp=this._register(new O),this._onPreserveCaseKeyDown=this._register(new O),this.onPreserveCaseKeyDown=this._onPreserveCaseKeyDown.event,this.contextViewProvider=t,this.placeholder=n.placeholder||\"\",this.validation=n.validation,this.label=n.label||nJ,this.inputActiveOptionBorder=n.inputActiveOptionBorder,this.inputActiveOptionForeground=n.inputActiveOptionForeground,this.inputActiveOptionBackground=n.inputActiveOptionBackground,this.inputBackground=n.inputBackground,this.inputForeground=n.inputForeground,this.inputBorder=n.inputBorder,this.inputValidationInfoBorder=n.inputValidationInfoBorder,this.inputValidationInfoBackground=n.inputValidationInfoBackground,this.inputValidationInfoForeground=n.inputValidationInfoForeground,this.inputValidationWarningBorder=n.inputValidationWarningBorder,this.inputValidationWarningBackground=n.inputValidationWarningBackground,this.inputValidationWarningForeground=n.inputValidationWarningForeground,this.inputValidationErrorBorder=n.inputValidationErrorBorder,this.inputValidationErrorBackground=n.inputValidationErrorBackground,this.inputValidationErrorForeground=n.inputValidationErrorForeground;const s=n.appendPreserveCaseLabel||\"\",r=n.history||[],a=!!n.flexibleHeight,l=!!n.flexibleWidth,c=n.flexibleMaxHeight;this.domNode=document.createElement(\"div\"),this.domNode.classList.add(\"monaco-findInput\"),this.inputBox=this._register(new _F(this.domNode,this.contextViewProvider,{ariaLabel:this.label||\"\",placeholder:this.placeholder||\"\",validationOptions:{validation:this.validation},inputBackground:this.inputBackground,inputForeground:this.inputForeground,inputBorder:this.inputBorder,inputValidationInfoBackground:this.inputValidationInfoBackground,inputValidationInfoForeground:this.inputValidationInfoForeground,inputValidationInfoBorder:this.inputValidationInfoBorder,inputValidationWarningBackground:this.inputValidationWarningBackground,inputValidationWarningForeground:this.inputValidationWarningForeground,inputValidationWarningBorder:this.inputValidationWarningBorder,inputValidationErrorBackground:this.inputValidationErrorBackground,inputValidationErrorForeground:this.inputValidationErrorForeground,inputValidationErrorBorder:this.inputValidationErrorBorder,history:r,showHistoryHint:n.showHistoryHint,flexibleHeight:a,flexibleWidth:l,flexibleMaxHeight:c})),this.preserveCase=this._register(new oJ({appendTitle:s,isChecked:!1,inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground})),this._register(this.preserveCase.onChange(u=>{this._onDidOptionChange.fire(u),!u&&this.fixFocusOnOptionClickEnabled&&this.inputBox.focus(),this.validate()})),this._register(this.preserveCase.onKeyDown(u=>{this._onPreserveCaseKeyDown.fire(u)})),this._showOptionButtons?this.cachedOptionsWidth=this.preserveCase.width():this.cachedOptionsWidth=0;const d=[this.preserveCase.domNode];this.onkeydown(this.domNode,u=>{if(u.equals(15)||u.equals(17)||u.equals(9)){const g=d.indexOf(document.activeElement);if(g>=0){let f=-1;u.equals(17)?f=(g+1)%d.length:u.equals(15)&&(g===0?f=d.length-1:f=g-1),u.equals(9)?(d[g].blur(),this.inputBox.focus()):f>=0&&d[f].focus(),ct.stop(u,!0)}}});const h=document.createElement(\"div\");h.className=\"controls\",h.style.display=this._showOptionButtons?\"block\":\"none\",h.appendChild(this.preserveCase.domNode),this.domNode.appendChild(h),e==null||e.appendChild(this.domNode),this.onkeydown(this.inputBox.inputElement,u=>this._onKeyDown.fire(u)),this.onkeyup(this.inputBox.inputElement,u=>this._onKeyUp.fire(u)),this.oninput(this.inputBox.inputElement,u=>this._onInput.fire()),this.onmousedown(this.inputBox.inputElement,u=>this._onMouseDown.fire(u))}enable(){this.domNode.classList.remove(\"disabled\"),this.inputBox.enable(),this.preserveCase.enable()}disable(){this.domNode.classList.add(\"disabled\"),this.inputBox.disable(),this.preserveCase.disable()}setEnabled(e){e?this.enable():this.disable()}style(e){this.inputActiveOptionBorder=e.inputActiveOptionBorder,this.inputActiveOptionForeground=e.inputActiveOptionForeground,this.inputActiveOptionBackground=e.inputActiveOptionBackground,this.inputBackground=e.inputBackground,this.inputForeground=e.inputForeground,this.inputBorder=e.inputBorder,this.inputValidationInfoBackground=e.inputValidationInfoBackground,this.inputValidationInfoForeground=e.inputValidationInfoForeground,this.inputValidationInfoBorder=e.inputValidationInfoBorder,this.inputValidationWarningBackground=e.inputValidationWarningBackground,this.inputValidationWarningForeground=e.inputValidationWarningForeground,this.inputValidationWarningBorder=e.inputValidationWarningBorder,this.inputValidationErrorBackground=e.inputValidationErrorBackground,this.inputValidationErrorForeground=e.inputValidationErrorForeground,this.inputValidationErrorBorder=e.inputValidationErrorBorder,this.applyStyles()}applyStyles(){if(this.domNode){const e={inputActiveOptionBorder:this.inputActiveOptionBorder,inputActiveOptionForeground:this.inputActiveOptionForeground,inputActiveOptionBackground:this.inputActiveOptionBackground};this.preserveCase.style(e);const t={inputBackground:this.inputBackground,inputForeground:this.inputForeground,inputBorder:this.inputBorder,inputValidationInfoBackground:this.inputValidationInfoBackground,inputValidationInfoForeground:this.inputValidationInfoForeground,inputValidationInfoBorder:this.inputValidationInfoBorder,inputValidationWarningBackground:this.inputValidationWarningBackground,inputValidationWarningForeground:this.inputValidationWarningForeground,inputValidationWarningBorder:this.inputValidationWarningBorder,inputValidationErrorBackground:this.inputValidationErrorBackground,inputValidationErrorForeground:this.inputValidationErrorForeground,inputValidationErrorBorder:this.inputValidationErrorBorder};this.inputBox.style(t)}}select(){this.inputBox.select()}focus(){this.inputBox.focus()}getPreserveCase(){return this.preserveCase.checked}setPreserveCase(e){this.preserveCase.checked=e}focusOnPreserve(){this.preserveCase.focus()}validate(){this.inputBox&&this.inputBox.validate()}set width(e){this.inputBox.paddingRight=this.cachedOptionsWidth,this.inputBox.width=e,this.domNode.style.width=e+\"px\"}dispose(){super.dispose()}}var XF=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},QF=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const KE=new ce(\"suggestWidgetVisible\",!1,p(\"suggestWidgetVisible\",\"Whether suggestion are visible\")),qE=\"historyNavigationWidgetFocus\",JF=\"historyNavigationForwardsEnabled\",e3=\"historyNavigationBackwardsEnabled\";let Ld;const mb=[];function t3(o,e){if(mb.includes(e))throw new Error(\"Cannot register the same widget multiple times\");mb.push(e);const t=new ee,i=t.add(o.createScoped(e.element)),n=new ce(qE,!1).bindTo(i),s=new ce(JF,!0).bindTo(i),r=new ce(e3,!0).bindTo(i),a=()=>{n.set(!0),Ld=e},l=()=>{n.set(!1),Ld===e&&(Ld=void 0)};return e.element===document.activeElement&&a(),t.add(e.onDidFocus(()=>a())),t.add(e.onDidBlur(()=>l())),t.add(ze(()=>{mb.splice(mb.indexOf(e),1),l()})),{scopedContextKeyService:i,historyNavigationForwardsEnablement:s,historyNavigationBackwardsEnablement:r,dispose(){t.dispose()}}}let ZL=class extends XX{constructor(e,t,i,n,s=!1){super(e,t,s,i),this._register(t3(n,this.inputBox))}};ZL=XF([QF(3,xe)],ZL);let YL=class extends rJ{constructor(e,t,i,n,s=!1){super(e,t,s,i),this._register(t3(n,this.inputBox))}};YL=XF([QF(3,xe)],YL);ls.registerCommandAndKeybindingRule({id:\"history.showPrevious\",weight:200,when:re.and(re.has(qE),re.equals(e3,!0),KE.isEqualTo(!1)),primary:16,secondary:[528],handler:o=>{Ld&&Ld.showPreviousValue()}});ls.registerCommandAndKeybindingRule({id:\"history.showNext\",weight:200,when:re.and(re.has(qE),re.equals(JF,!0),KE.isEqualTo(!1)),primary:18,secondary:[530],handler:o=>{Ld&&Ld.showNextValue()}});var fp=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const $e={Visible:KE,HasFocusedSuggestion:new ce(\"suggestWidgetHasFocusedSuggestion\",!1,p(\"suggestWidgetHasSelection\",\"Whether any suggestion is focused\")),DetailsVisible:new ce(\"suggestWidgetDetailsVisible\",!1,p(\"suggestWidgetDetailsVisible\",\"Whether suggestion details are visible\")),MultipleSuggestions:new ce(\"suggestWidgetMultipleSuggestions\",!1,p(\"suggestWidgetMultipleSuggestions\",\"Whether there are multiple suggestions to pick from\")),MakesTextEdit:new ce(\"suggestionMakesTextEdit\",!0,p(\"suggestionMakesTextEdit\",\"Whether inserting the current suggestion yields in a change or has everything already been typed\")),AcceptSuggestionsOnEnter:new ce(\"acceptSuggestionOnEnter\",!0,p(\"acceptSuggestionOnEnter\",\"Whether suggestions are inserted when pressing Enter\")),HasInsertAndReplaceRange:new ce(\"suggestionHasInsertAndReplaceRange\",!1,p(\"suggestionHasInsertAndReplaceRange\",\"Whether the current suggestion has insert and replace behaviour\")),InsertMode:new ce(\"suggestionInsertMode\",void 0,{type:\"string\",description:p(\"suggestionInsertMode\",\"Whether the default behaviour is to insert or replace\")}),CanResolve:new ce(\"suggestionCanResolve\",!1,p(\"suggestionCanResolve\",\"Whether the current suggestion supports to resolve further details\"))},Xl=new A(\"suggestWidgetStatusBar\");class aJ{constructor(e,t,i,n){this.position=e,this.completion=t,this.container=i,this.provider=n,this.isInvalid=!1,this.score=jo.Default,this.distance=0,this.textLabel=typeof t.label==\"string\"?t.label:t.label.label,this.labelLow=this.textLabel.toLowerCase(),this.isInvalid=!this.textLabel,this.sortTextLow=t.sortText&&t.sortText.toLowerCase(),this.filterTextLow=t.filterText&&t.filterText.toLowerCase(),this.extensionId=t.extensionId,L.isIRange(t.range)?(this.editStart=new B(t.range.startLineNumber,t.range.startColumn),this.editInsertEnd=new B(t.range.endLineNumber,t.range.endColumn),this.editReplaceEnd=new B(t.range.endLineNumber,t.range.endColumn),this.isInvalid=this.isInvalid||L.spansMultipleLines(t.range)||t.range.startLineNumber!==e.lineNumber):(this.editStart=new B(t.range.insert.startLineNumber,t.range.insert.startColumn),this.editInsertEnd=new B(t.range.insert.endLineNumber,t.range.insert.endColumn),this.editReplaceEnd=new B(t.range.replace.endLineNumber,t.range.replace.endColumn),this.isInvalid=this.isInvalid||L.spansMultipleLines(t.range.insert)||L.spansMultipleLines(t.range.replace)||t.range.insert.startLineNumber!==e.lineNumber||t.range.replace.startLineNumber!==e.lineNumber||t.range.insert.startColumn!==t.range.replace.startColumn),typeof n.resolveCompletionItem!=\"function\"&&(this._resolveCache=Promise.resolve(),this._isResolved=!0)}get isResolved(){return!!this._isResolved}resolve(e){return fp(this,void 0,void 0,function*(){if(!this._resolveCache){const t=e.onCancellationRequested(()=>{this._resolveCache=void 0,this._isResolved=!1});this._resolveCache=Promise.resolve(this.provider.resolveCompletionItem(this.completion,e)).then(i=>{Object.assign(this.completion,i),this._isResolved=!0,t.dispose()},i=>{ol(i)&&(this._resolveCache=void 0,this._isResolved=!1)})}return this._resolveCache})}}class _m{constructor(e=2,t=new Set,i=new Set,n=!0){this.snippetSortOrder=e,this.kindFilter=t,this.providerFilter=i,this.showDeprecated=n}}_m.default=new _m;let lJ;function cJ(){return lJ}class dJ{constructor(e,t,i,n){this.items=e,this.needsClipboard=t,this.durations=i,this.disposable=n}}function GE(o,e,t,i=_m.default,n={triggerKind:0},s=We.None){return fp(this,void 0,void 0,function*(){const r=new Hn(!0);t=t.clone();const a=e.getWordAtPosition(t),l=a?new L(t.lineNumber,a.startColumn,t.lineNumber,a.endColumn):L.fromPositions(t),c={replace:l,insert:l.setEndPosition(t.lineNumber,t.column)},d=[],h=new ee,u=[];let g=!1;const f=(b,v,C)=>{var w,S,k;let x=!1;if(!v)return x;for(const y of v.suggestions)if(!i.kindFilter.has(y.kind)){if(!i.showDeprecated&&((w=y==null?void 0:y.tags)===null||w===void 0?void 0:w.includes(1)))continue;y.range||(y.range=c),y.sortText||(y.sortText=typeof y.label==\"string\"?y.label:y.label.label),!g&&y.insertTextRules&&y.insertTextRules&4&&(g=_c.guessNeedsClipboard(y.insertText)),d.push(new aJ(t,y,v,b)),x=!0}return xx(v)&&h.add(v),u.push({providerName:(S=b._debugDisplayName)!==null&&S!==void 0?S:\"unknown_provider\",elapsedProvider:(k=v.duration)!==null&&k!==void 0?k:-1,elapsedOverall:C.elapsed()}),x},_=(()=>fp(this,void 0,void 0,function*(){}))();for(const b of o.orderedGroups(e)){let v=!1;if(yield Promise.all(b.map(C=>fp(this,void 0,void 0,function*(){if(!(i.providerFilter.size>0&&!i.providerFilter.has(C)))try{const w=new Hn(!0),S=yield C.provideCompletionItems(e,t,n,s);v=f(C,S,w)||v}catch(w){Ai(w)}}))),v||s.isCancellationRequested)break}return yield _,s.isCancellationRequested?(h.dispose(),Promise.reject(new yc)):new dJ(d.sort(i3(i.snippetSortOrder)),g,{entries:u,elapsed:r.elapsed()},h)})}function ZE(o,e){if(o.sortTextLow&&e.sortTextLow){if(o.sortTextLow<e.sortTextLow)return-1;if(o.sortTextLow>e.sortTextLow)return 1}return o.textLabel<e.textLabel?-1:o.textLabel>e.textLabel?1:o.completion.kind-e.completion.kind}function hJ(o,e){if(o.completion.kind!==e.completion.kind){if(o.completion.kind===27)return-1;if(e.completion.kind===27)return 1}return ZE(o,e)}function uJ(o,e){if(o.completion.kind!==e.completion.kind){if(o.completion.kind===27)return 1;if(e.completion.kind===27)return-1}return ZE(o,e)}const M1=new Map;M1.set(0,hJ);M1.set(2,uJ);M1.set(1,ZE);function i3(o){return M1.get(o)}Ye.registerCommand(\"_executeCompletionItemProvider\",(o,...e)=>fp(void 0,void 0,void 0,function*(){const[t,i,n,s]=e;gt(me.isUri(t)),gt(B.isIPosition(i)),gt(typeof n==\"string\"||!n),gt(typeof s==\"number\"||!s);const{completionProvider:r}=o.get(ue),a=yield o.get($n).createModelReference(t);try{const l={incomplete:!1,suggestions:[]},c=[],d=yield GE(r,a.object.textEditorModel,B.lift(i),void 0,{triggerCharacter:n,triggerKind:n?1:0});for(const h of d.items)c.length<(s!=null?s:0)&&c.push(h.resolve(We.None)),l.incomplete=l.incomplete||h.container.incomplete,l.suggestions.push(h.completion);try{return yield Promise.all(c),l}finally{setTimeout(()=>d.disposable.dispose(),100)}}finally{a.dispose()}}));function gJ(o,e){var t;(t=o.getContribution(\"editor.contrib.suggestController\"))===null||t===void 0||t.triggerSuggest(new Set().add(e),void 0,!0)}class wu{static isAllOff(e){return e.other===\"off\"&&e.comments===\"off\"&&e.strings===\"off\"}static isAllOn(e){return e.other===\"on\"&&e.comments===\"on\"&&e.strings===\"on\"}static valueFor(e,t){switch(t){case 1:return e.comments;case 2:return e.strings;default:return e.other}}}var YE=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Mv=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const HM=se;let Av=class XL extends z{constructor(e,t,i){super(),this._editor=e,this._instantiationService=t,this._keybindingService=i,this._widget=this._register(this._instantiationService.createInstance(Dd,this._editor)),this._isChangingDecorations=!1,this._messages=[],this._messagesAreComplete=!1,this._participants=[];for(const n of xh.getAll())this._participants.push(this._instantiationService.createInstance(n,this._editor));this._participants.sort((n,s)=>n.hoverOrdinal-s.hoverOrdinal),this._computer=new Rv(this._editor,this._participants),this._hoverOperation=this._register(new ZF(this._editor,this._computer)),this._register(this._hoverOperation.onResult(n=>{this._withResult(n.value,n.isComplete,n.hasLoadingMessage)})),this._register(this._editor.onDidChangeModelDecorations(()=>{this._isChangingDecorations||this._onModelDecorationsChanged()})),this._register(Ei(this._widget.getDomNode(),\"keydown\",n=>{n.equals(9)&&this.hide()})),this._register(Jt.onDidChange(()=>{this._widget.position&&this._computer.anchor&&this._messages.length>0&&(this._widget.clear(),this._renderMessages(this._computer.anchor,this._messages))}))}_onModelDecorationsChanged(){this._widget.position&&(this._hoverOperation.cancel(),this._widget.isColorPickerVisible||this._hoverOperation.start(0))}maybeShowAt(e){const t=[];for(const n of this._participants)if(n.suggestHoverAnchor){const s=n.suggestHoverAnchor(e);s&&t.push(s)}const i=e.target;if(i.type===6&&t.push(new RS(0,i.range)),i.type===7){const n=this._editor.getOption(46).typicalHalfwidthCharacterWidth/2;!i.detail.isAfterLines&&typeof i.detail.horizontalDistanceToText==\"number\"&&i.detail.horizontalDistanceToText<n&&t.push(new RS(0,i.range))}return t.length===0?!1:(t.sort((n,s)=>s.priority-n.priority),this._startShowingAt(t[0],0,!1),!0)}startShowingAtRange(e,t,i){this._startShowingAt(new RS(0,e),t,i)}_startShowingAt(e,t,i){if(!(this._computer.anchor&&this._computer.anchor.equals(e))){if(this._hoverOperation.cancel(),this._widget.position)if(!this._computer.anchor||!e.canAdoptVisibleHover(this._computer.anchor,this._widget.position))this.hide();else{const n=this._messages.filter(s=>s.isValidForHoverAnchor(e));if(n.length===0)this.hide();else{if(n.length===this._messages.length&&this._messagesAreComplete)return;this._renderMessages(e,n)}}this._computer.anchor=e,this._computer.shouldFocus=i,this._hoverOperation.start(t)}}hide(){this._computer.anchor=null,this._hoverOperation.cancel(),this._widget.hide()}isColorPickerVisible(){return this._widget.isColorPickerVisible}containsNode(e){return this._widget.getDomNode().contains(e)}_addLoadingMessage(e){if(this._computer.anchor){for(const t of this._participants)if(t.createLoadingMessage){const i=t.createLoadingMessage(this._computer.anchor);if(i)return e.slice(0).concat([i])}}return e}_withResult(e,t,i){this._messages=i?this._addLoadingMessage(e):e,this._messagesAreComplete=t,this._computer.anchor&&this._messages.length>0?this._renderMessages(this._computer.anchor,this._messages):t&&this.hide()}_renderMessages(e,t){const{showAtPosition:i,showAtRange:n,highlightRange:s}=XL.computeHoverRanges(e.range,t),r=new ee,a=r.add(new QL(this._keybindingService)),l=document.createDocumentFragment();let c=null;const d={fragment:l,statusBar:a,setColorPicker:h=>c=h,onContentsChanged:()=>this._widget.onContentsChanged(),hide:()=>this.hide()};for(const h of this._participants){const u=t.filter(g=>g.owner===h);u.length>0&&r.add(h.renderHoverParts(d,u))}if(a.hasContent&&l.appendChild(a.hoverElement),l.hasChildNodes()){if(s){const h=this._editor.createDecorationsCollection();try{this._isChangingDecorations=!0,h.set([{range:s,options:XL._DECORATION_OPTIONS}])}finally{this._isChangingDecorations=!1}r.add(ze(()=>{try{this._isChangingDecorations=!0,h.clear()}finally{this._isChangingDecorations=!1}}))}this._widget.showAt(l,new fJ(c,i,n,this._editor.getOption(55).above,this._computer.shouldFocus,r))}else r.dispose()}static computeHoverRanges(e,t){const i=e.startLineNumber;let n=e.startColumn,s=e.endColumn,r=t[0].range,a=null;for(const l of t)r=L.plusRange(r,l.range),l.range.startLineNumber===i&&l.range.endLineNumber===i&&(n=Math.min(n,l.range.startColumn),s=Math.max(s,l.range.endColumn)),l.forceShowAtRange&&(a=l.range);return{showAtPosition:a?a.getStartPosition():new B(e.startLineNumber,n),showAtRange:a||new L(i,n,i,s),highlightRange:r}}};Av._DECORATION_OPTIONS=Ie.register({description:\"content-hover-highlight\",className:\"hoverHighlight\"});Av=YE([Mv(1,Re),Mv(2,rn)],Av);class fJ{constructor(e,t,i,n,s,r){this.colorPicker=e,this.showAtPosition=t,this.showAtRange=i,this.preferAbove=n,this.stoleFocus=s,this.disposables=r}}let Dd=class n3 extends z{constructor(e,t){super(),this._editor=e,this._contextKeyService=t,this.allowEditorOverflow=!0,this._hoverVisibleKey=T.hoverVisible.bindTo(this._contextKeyService),this._hover=this._register(new GF),this._visibleData=null,this._register(this._editor.onDidLayoutChange(()=>this._layout())),this._register(this._editor.onDidChangeConfiguration(i=>{i.hasChanged(46)&&this._updateFont()})),this._setVisibleData(null),this._layout(),this._editor.addContentWidget(this)}get position(){var e,t;return(t=(e=this._visibleData)===null||e===void 0?void 0:e.showAtPosition)!==null&&t!==void 0?t:null}get isColorPickerVisible(){var e;return Boolean((e=this._visibleData)===null||e===void 0?void 0:e.colorPicker)}dispose(){this._editor.removeContentWidget(this),this._visibleData&&this._visibleData.disposables.dispose(),super.dispose()}getId(){return n3.ID}getDomNode(){return this._hover.containerDomNode}getPosition(){if(!this._visibleData)return null;let e=this._visibleData.preferAbove;return!e&&this._contextKeyService.getContextKeyValue($e.Visible.key)&&(e=!0),{position:this._visibleData.showAtPosition,range:this._visibleData.showAtRange,preference:e?[1,2]:[2,1]}}_setVisibleData(e){this._visibleData&&this._visibleData.disposables.dispose(),this._visibleData=e,this._hoverVisibleKey.set(!!this._visibleData),this._hover.containerDomNode.classList.toggle(\"hidden\",!this._visibleData)}_layout(){const e=Math.max(this._editor.getLayoutInfo().height/4,250),{fontSize:t,lineHeight:i}=this._editor.getOption(46);this._hover.contentsDomNode.style.fontSize=`${t}px`,this._hover.contentsDomNode.style.lineHeight=`${i/t}`,this._hover.contentsDomNode.style.maxHeight=`${e}px`,this._hover.contentsDomNode.style.maxWidth=`${Math.max(this._editor.getLayoutInfo().width*.66,500)}px`}_updateFont(){Array.prototype.slice.call(this._hover.contentsDomNode.getElementsByClassName(\"code\")).forEach(t=>this._editor.applyFontInfo(t))}showAt(e,t){this._setVisibleData(t),this._hover.contentsDomNode.textContent=\"\",this._hover.contentsDomNode.appendChild(e),this._hover.contentsDomNode.style.paddingBottom=\"\",this._updateFont(),this.onContentsChanged(),this._editor.render(),this.onContentsChanged(),t.stoleFocus&&this._hover.containerDomNode.focus(),t.colorPicker&&t.colorPicker.layout()}hide(){if(this._visibleData){const e=this._visibleData.stoleFocus;this._setVisibleData(null),this._editor.layoutContentWidget(this),e&&this._editor.focus()}}onContentsChanged(){this._editor.layoutContentWidget(this),this._hover.onContentsChanged();const e=this._hover.scrollbar.getScrollDimensions();if(e.scrollWidth>e.width){const i=`${this._hover.scrollbar.options.horizontalScrollbarSize}px`;this._hover.contentsDomNode.style.paddingBottom!==i&&(this._hover.contentsDomNode.style.paddingBottom=i,this._editor.layoutContentWidget(this),this._hover.onContentsChanged())}}clear(){this._hover.contentsDomNode.textContent=\"\"}};Dd.ID=\"editor.contrib.contentHoverWidget\";Dd=YE([Mv(1,xe)],Dd);let QL=class extends z{constructor(e){super(),this._keybindingService=e,this._hasContent=!1,this.hoverElement=HM(\"div.hover-row.status-bar\"),this.actionsElement=G(this.hoverElement,HM(\"div.actions\"))}get hasContent(){return this._hasContent}addAction(e){const t=this._keybindingService.lookupKeybinding(e.commandId),i=t?t.getLabel():null;return this._hasContent=!0,this._register($E.render(this.actionsElement,e,i))}append(e){const t=G(this.actionsElement,e);return this._hasContent=!0,t}};QL=YE([Mv(0,rn)],QL);class Rv{constructor(e,t){this._editor=e,this._participants=t,this._anchor=null,this._shouldFocus=!1}get anchor(){return this._anchor}set anchor(e){this._anchor=e}get shouldFocus(){return this._shouldFocus}set shouldFocus(e){this._shouldFocus=e}static _getLineDecorations(e,t){if(t.type!==1)return[];const i=e.getModel(),n=t.range.startLineNumber;if(n>i.getLineCount())return[];const s=i.getLineMaxColumn(n);return e.getLineDecorations(n).filter(r=>{if(r.options.isWholeLine)return!0;const a=r.range.startLineNumber===n?r.range.startColumn:1,l=r.range.endLineNumber===n?r.range.endColumn:s;if(r.options.showIfCollapsed){if(a>t.range.startColumn+1||t.range.endColumn-1>l)return!1}else if(a>t.range.startColumn||t.range.endColumn>l)return!1;return!0})}computeAsync(e){const t=this._anchor;if(!this._editor.hasModel()||!t)return ni.EMPTY;const i=Rv._getLineDecorations(this._editor,t);return ni.merge(this._participants.map(n=>n.computeAsync?n.computeAsync(t,i,e):ni.EMPTY))}computeSync(){if(!this._editor.hasModel()||!this._anchor)return[];const e=Rv._getLineDecorations(this._editor,this._anchor);let t=[];for(const i of this._participants)t=t.concat(i.computeSync(this._anchor,e));return BC(t)}}let s3={};(function(){function o(e,t){t(s3)}o.amd=!0,function(e,t){typeof exports==\"object\"&&typeof module!=\"undefined\"?t(exports):typeof o==\"function\"&&o.amd?o([\"exports\"],t):(e=typeof globalThis!=\"undefined\"?globalThis:e||self,t(e.marked={}))}(this,function(e){function t(Z,U){for(var j=0;j<U.length;j++){var E=U[j];E.enumerable=E.enumerable||!1,E.configurable=!0,\"value\"in E&&(E.writable=!0),Object.defineProperty(Z,E.key,E)}}function i(Z,U,j){return U&&t(Z.prototype,U),j&&t(Z,j),Object.defineProperty(Z,\"prototype\",{writable:!1}),Z}function n(Z,U){if(!!Z){if(typeof Z==\"string\")return s(Z,U);var j=Object.prototype.toString.call(Z).slice(8,-1);if(j===\"Object\"&&Z.constructor&&(j=Z.constructor.name),j===\"Map\"||j===\"Set\")return Array.from(Z);if(j===\"Arguments\"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(j))return s(Z,U)}}function s(Z,U){(U==null||U>Z.length)&&(U=Z.length);for(var j=0,E=new Array(U);j<U;j++)E[j]=Z[j];return E}function r(Z,U){var j=typeof Symbol!=\"undefined\"&&Z[Symbol.iterator]||Z[\"@@iterator\"];if(j)return(j=j.call(Z)).next.bind(j);if(Array.isArray(Z)||(j=n(Z))||U&&Z&&typeof Z.length==\"number\"){j&&(Z=j);var E=0;return function(){return E>=Z.length?{done:!0}:{done:!1,value:Z[E++]}}}throw new TypeError(`Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function a(){return{baseUrl:null,breaks:!1,extensions:null,gfm:!0,headerIds:!0,headerPrefix:\"\",highlight:null,langPrefix:\"language-\",mangle:!0,pedantic:!1,renderer:null,sanitize:!1,sanitizer:null,silent:!1,smartLists:!1,smartypants:!1,tokenizer:null,walkTokens:null,xhtml:!1}}e.defaults=a();function l(Z){e.defaults=Z}var c=/[&<>\"']/,d=/[&<>\"']/g,h=/[<>\"']|&(?!#?\\w+;)/,u=/[<>\"']|&(?!#?\\w+;)/g,g={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"},f=function(U){return g[U]};function _(Z,U){if(U){if(c.test(Z))return Z.replace(d,f)}else if(h.test(Z))return Z.replace(u,f);return Z}var b=/&(#(?:\\d+)|(?:#x[0-9A-Fa-f]+)|(?:\\w+));?/ig;function v(Z){return Z.replace(b,function(U,j){return j=j.toLowerCase(),j===\"colon\"?\":\":j.charAt(0)===\"#\"?j.charAt(1)===\"x\"?String.fromCharCode(parseInt(j.substring(2),16)):String.fromCharCode(+j.substring(1)):\"\"})}var C=/(^|[^\\[])\\^/g;function w(Z,U){Z=typeof Z==\"string\"?Z:Z.source,U=U||\"\";var j={replace:function(M,V){return V=V.source||V,V=V.replace(C,\"$1\"),Z=Z.replace(M,V),j},getRegex:function(){return new RegExp(Z,U)}};return j}var S=/[^\\w:]/g,k=/^$|^[a-z][a-z0-9+.-]*:|^[?#]/i;function x(Z,U,j){if(Z){var E;try{E=decodeURIComponent(v(j)).replace(S,\"\").toLowerCase()}catch(M){return null}if(E.indexOf(\"javascript:\")===0||E.indexOf(\"vbscript:\")===0||E.indexOf(\"data:\")===0)return null}U&&!k.test(j)&&(j=P(U,j));try{j=encodeURI(j).replace(/%25/g,\"%\")}catch(M){return null}return j}var y={},D=/^[^:]+:\\/*[^/]*$/,I=/^([^:]+:)[\\s\\S]*$/,R=/^([^:]+:\\/*[^/]*)[\\s\\S]*$/;function P(Z,U){y[\" \"+Z]||(D.test(Z)?y[\" \"+Z]=Z+\"/\":y[\" \"+Z]=ae(Z,\"/\",!0)),Z=y[\" \"+Z];var j=Z.indexOf(\":\")===-1;return U.substring(0,2)===\"//\"?j?U:Z.replace(I,\"$1\")+U:U.charAt(0)===\"/\"?j?U:Z.replace(R,\"$1\")+U:Z+U}var H={exec:function(){}};function $(Z){for(var U=1,j,E;U<arguments.length;U++){j=arguments[U];for(E in j)Object.prototype.hasOwnProperty.call(j,E)&&(Z[E]=j[E])}return Z}function ne(Z,U){var j=Z.replace(/\\|/g,function(V,F,Y){for(var ie=!1,ye=F;--ye>=0&&Y[ye]===\"\\\\\";)ie=!ie;return ie?\"|\":\" |\"}),E=j.split(/ \\|/),M=0;if(E[0].trim()||E.shift(),E.length>0&&!E[E.length-1].trim()&&E.pop(),E.length>U)E.splice(U);else for(;E.length<U;)E.push(\"\");for(;M<E.length;M++)E[M]=E[M].trim().replace(/\\\\\\|/g,\"|\");return E}function ae(Z,U,j){var E=Z.length;if(E===0)return\"\";for(var M=0;M<E;){var V=Z.charAt(E-M-1);if(V===U&&!j)M++;else if(V!==U&&j)M++;else break}return Z.slice(0,E-M)}function de(Z,U){if(Z.indexOf(U[1])===-1)return-1;for(var j=Z.length,E=0,M=0;M<j;M++)if(Z[M]===\"\\\\\")M++;else if(Z[M]===U[0])E++;else if(Z[M]===U[1]&&(E--,E<0))return M;return-1}function we(Z){Z&&Z.sanitize&&!Z.silent&&console.warn(\"marked(): sanitize and sanitizer parameters are deprecated since version 0.7.0, should not be used and will be removed in the future. Read more here: https://marked.js.org/#/USING_ADVANCED.md#options\")}function Se(Z,U){if(U<1)return\"\";for(var j=\"\";U>1;)U&1&&(j+=Z),U>>=1,Z+=Z;return j+Z}function Me(Z,U,j,E){var M=U.href,V=U.title?_(U.title):null,F=Z[1].replace(/\\\\([\\[\\]])/g,\"$1\");if(Z[0].charAt(0)!==\"!\"){E.state.inLink=!0;var Y={type:\"link\",raw:j,href:M,title:V,text:F,tokens:E.inlineTokens(F,[])};return E.state.inLink=!1,Y}return{type:\"image\",raw:j,href:M,title:V,text:_(F)}}function St(Z,U){var j=Z.match(/^(\\s+)(?:```)/);if(j===null)return U;var E=j[1];return U.split(`\n`).map(function(M){var V=M.match(/^\\s+/);if(V===null)return M;var F=V[0];return F.length>=E.length?M.slice(E.length):M}).join(`\n`)}var mt=function(){function Z(j){this.options=j||e.defaults}var U=Z.prototype;return U.space=function(E){var M=this.rules.block.newline.exec(E);if(M&&M[0].length>0)return{type:\"space\",raw:M[0]}},U.code=function(E){var M=this.rules.block.code.exec(E);if(M){var V=M[0].replace(/^ {1,4}/gm,\"\");return{type:\"code\",raw:M[0],codeBlockStyle:\"indented\",text:this.options.pedantic?V:ae(V,`\n`)}}},U.fences=function(E){var M=this.rules.block.fences.exec(E);if(M){var V=M[0],F=St(V,M[3]||\"\");return{type:\"code\",raw:V,lang:M[2]?M[2].trim():M[2],text:F}}},U.heading=function(E){var M=this.rules.block.heading.exec(E);if(M){var V=M[2].trim();if(/#$/.test(V)){var F=ae(V,\"#\");(this.options.pedantic||!F||/ $/.test(F))&&(V=F.trim())}var Y={type:\"heading\",raw:M[0],depth:M[1].length,text:V,tokens:[]};return this.lexer.inline(Y.text,Y.tokens),Y}},U.hr=function(E){var M=this.rules.block.hr.exec(E);if(M)return{type:\"hr\",raw:M[0]}},U.blockquote=function(E){var M=this.rules.block.blockquote.exec(E);if(M){var V=M[0].replace(/^ *>[ \\t]?/gm,\"\");return{type:\"blockquote\",raw:M[0],tokens:this.lexer.blockTokens(V,[]),text:V}}},U.list=function(E){var M=this.rules.block.list.exec(E);if(M){var V,F,Y,ie,ye,ve,Fe,Pe,Ct,at,De,pi,Gt=M[1].trim(),Ns=Gt.length>1,zt={type:\"list\",raw:\"\",ordered:Ns,start:Ns?+Gt.slice(0,-1):\"\",loose:!1,items:[]};Gt=Ns?\"\\\\d{1,9}\\\\\"+Gt.slice(-1):\"\\\\\"+Gt,this.options.pedantic&&(Gt=Ns?Gt:\"[*+-]\");for(var Oi=new RegExp(\"^( {0,3}\"+Gt+\")((?:[\t ][^\\\\n]*)?(?:\\\\n|$))\");E&&(pi=!1,!(!(M=Oi.exec(E))||this.rules.block.hr.test(E)));){if(V=M[0],E=E.substring(V.length),Pe=M[2].split(`\n`,1)[0],Ct=E.split(`\n`,1)[0],this.options.pedantic?(ie=2,De=Pe.trimLeft()):(ie=M[2].search(/[^ ]/),ie=ie>4?1:ie,De=Pe.slice(ie),ie+=M[1].length),ve=!1,!Pe&&/^ *$/.test(Ct)&&(V+=Ct+`\n`,E=E.substring(Ct.length+1),pi=!0),!pi)for(var Rc=new RegExp(\"^ {0,\"+Math.min(3,ie-1)+\"}(?:[*+-]|\\\\d{1,9}[.)])((?: [^\\\\n]*)?(?:\\\\n|$))\"),ds=new RegExp(\"^ {0,\"+Math.min(3,ie-1)+\"}((?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$)\");E&&(at=E.split(`\n`,1)[0],Pe=at,this.options.pedantic&&(Pe=Pe.replace(/^ {1,4}(?=( {4})*[^ ])/g,\"  \")),!(Rc.test(Pe)||ds.test(E)));){if(Pe.search(/[^ ]/)>=ie||!Pe.trim())De+=`\n`+Pe.slice(ie);else if(!ve)De+=`\n`+Pe;else break;!ve&&!Pe.trim()&&(ve=!0),V+=at+`\n`,E=E.substring(at.length+1)}zt.loose||(Fe?zt.loose=!0:/\\n *\\n *$/.test(V)&&(Fe=!0)),this.options.gfm&&(F=/^\\[[ xX]\\] /.exec(De),F&&(Y=F[0]!==\"[ ] \",De=De.replace(/^\\[[ xX]\\] +/,\"\"))),zt.items.push({type:\"list_item\",raw:V,task:!!F,checked:Y,loose:!1,text:De}),zt.raw+=V}zt.items[zt.items.length-1].raw=V.trimRight(),zt.items[zt.items.length-1].text=De.trimRight(),zt.raw=zt.raw.trimRight();var rr=zt.items.length;for(ye=0;ye<rr;ye++){this.lexer.state.top=!1,zt.items[ye].tokens=this.lexer.blockTokens(zt.items[ye].text,[]);var oa=zt.items[ye].tokens.filter(function(gl){return gl.type===\"space\"}),Oc=oa.every(function(gl){for(var Pc=gl.raw.split(\"\"),to=0,k_=r(Pc),of;!(of=k_()).done;){var x_=of.value;if(x_===`\n`&&(to+=1),to>1)return!0}return!1});!zt.loose&&oa.length&&Oc&&(zt.loose=!0,zt.items[ye].loose=!0)}return zt}},U.html=function(E){var M=this.rules.block.html.exec(E);if(M){var V={type:\"html\",raw:M[0],pre:!this.options.sanitizer&&(M[1]===\"pre\"||M[1]===\"script\"||M[1]===\"style\"),text:M[0]};return this.options.sanitize&&(V.type=\"paragraph\",V.text=this.options.sanitizer?this.options.sanitizer(M[0]):_(M[0]),V.tokens=[],this.lexer.inline(V.text,V.tokens)),V}},U.def=function(E){var M=this.rules.block.def.exec(E);if(M){M[3]&&(M[3]=M[3].substring(1,M[3].length-1));var V=M[1].toLowerCase().replace(/\\s+/g,\" \");return{type:\"def\",tag:V,raw:M[0],href:M[2],title:M[3]}}},U.table=function(E){var M=this.rules.block.table.exec(E);if(M){var V={type:\"table\",header:ne(M[1]).map(function(Fe){return{text:Fe}}),align:M[2].replace(/^ *|\\| *$/g,\"\").split(/ *\\| */),rows:M[3]&&M[3].trim()?M[3].replace(/\\n[ \\t]*$/,\"\").split(`\n`):[]};if(V.header.length===V.align.length){V.raw=M[0];var F=V.align.length,Y,ie,ye,ve;for(Y=0;Y<F;Y++)/^ *-+: *$/.test(V.align[Y])?V.align[Y]=\"right\":/^ *:-+: *$/.test(V.align[Y])?V.align[Y]=\"center\":/^ *:-+ *$/.test(V.align[Y])?V.align[Y]=\"left\":V.align[Y]=null;for(F=V.rows.length,Y=0;Y<F;Y++)V.rows[Y]=ne(V.rows[Y],V.header.length).map(function(Fe){return{text:Fe}});for(F=V.header.length,ie=0;ie<F;ie++)V.header[ie].tokens=[],this.lexer.inline(V.header[ie].text,V.header[ie].tokens);for(F=V.rows.length,ie=0;ie<F;ie++)for(ve=V.rows[ie],ye=0;ye<ve.length;ye++)ve[ye].tokens=[],this.lexer.inline(ve[ye].text,ve[ye].tokens);return V}}},U.lheading=function(E){var M=this.rules.block.lheading.exec(E);if(M){var V={type:\"heading\",raw:M[0],depth:M[2].charAt(0)===\"=\"?1:2,text:M[1],tokens:[]};return this.lexer.inline(V.text,V.tokens),V}},U.paragraph=function(E){var M=this.rules.block.paragraph.exec(E);if(M){var V={type:\"paragraph\",raw:M[0],text:M[1].charAt(M[1].length-1)===`\n`?M[1].slice(0,-1):M[1],tokens:[]};return this.lexer.inline(V.text,V.tokens),V}},U.text=function(E){var M=this.rules.block.text.exec(E);if(M){var V={type:\"text\",raw:M[0],text:M[0],tokens:[]};return this.lexer.inline(V.text,V.tokens),V}},U.escape=function(E){var M=this.rules.inline.escape.exec(E);if(M)return{type:\"escape\",raw:M[0],text:_(M[1])}},U.tag=function(E){var M=this.rules.inline.tag.exec(E);if(M)return!this.lexer.state.inLink&&/^<a /i.test(M[0])?this.lexer.state.inLink=!0:this.lexer.state.inLink&&/^<\\/a>/i.test(M[0])&&(this.lexer.state.inLink=!1),!this.lexer.state.inRawBlock&&/^<(pre|code|kbd|script)(\\s|>)/i.test(M[0])?this.lexer.state.inRawBlock=!0:this.lexer.state.inRawBlock&&/^<\\/(pre|code|kbd|script)(\\s|>)/i.test(M[0])&&(this.lexer.state.inRawBlock=!1),{type:this.options.sanitize?\"text\":\"html\",raw:M[0],inLink:this.lexer.state.inLink,inRawBlock:this.lexer.state.inRawBlock,text:this.options.sanitize?this.options.sanitizer?this.options.sanitizer(M[0]):_(M[0]):M[0]}},U.link=function(E){var M=this.rules.inline.link.exec(E);if(M){var V=M[2].trim();if(!this.options.pedantic&&/^</.test(V)){if(!/>$/.test(V))return;var F=ae(V.slice(0,-1),\"\\\\\");if((V.length-F.length)%2===0)return}else{var Y=de(M[2],\"()\");if(Y>-1){var ie=M[0].indexOf(\"!\")===0?5:4,ye=ie+M[1].length+Y;M[2]=M[2].substring(0,Y),M[0]=M[0].substring(0,ye).trim(),M[3]=\"\"}}var ve=M[2],Fe=\"\";if(this.options.pedantic){var Pe=/^([^'\"]*[^\\s])\\s+(['\"])(.*)\\2/.exec(ve);Pe&&(ve=Pe[1],Fe=Pe[3])}else Fe=M[3]?M[3].slice(1,-1):\"\";return ve=ve.trim(),/^</.test(ve)&&(this.options.pedantic&&!/>$/.test(V)?ve=ve.slice(1):ve=ve.slice(1,-1)),Me(M,{href:ve&&ve.replace(this.rules.inline._escapes,\"$1\"),title:Fe&&Fe.replace(this.rules.inline._escapes,\"$1\")},M[0],this.lexer)}},U.reflink=function(E,M){var V;if((V=this.rules.inline.reflink.exec(E))||(V=this.rules.inline.nolink.exec(E))){var F=(V[2]||V[1]).replace(/\\s+/g,\" \");if(F=M[F.toLowerCase()],!F||!F.href){var Y=V[0].charAt(0);return{type:\"text\",raw:Y,text:Y}}return Me(V,F,V[0],this.lexer)}},U.emStrong=function(E,M,V){V===void 0&&(V=\"\");var F=this.rules.inline.emStrong.lDelim.exec(E);if(!!F&&!(F[3]&&V.match(/(?:[0-9A-Za-z\\xAA\\xB2\\xB3\\xB5\\xB9\\xBA\\xBC-\\xBE\\xC0-\\xD6\\xD8-\\xF6\\xF8-\\u02C1\\u02C6-\\u02D1\\u02E0-\\u02E4\\u02EC\\u02EE\\u0370-\\u0374\\u0376\\u0377\\u037A-\\u037D\\u037F\\u0386\\u0388-\\u038A\\u038C\\u038E-\\u03A1\\u03A3-\\u03F5\\u03F7-\\u0481\\u048A-\\u052F\\u0531-\\u0556\\u0559\\u0560-\\u0588\\u05D0-\\u05EA\\u05EF-\\u05F2\\u0620-\\u064A\\u0660-\\u0669\\u066E\\u066F\\u0671-\\u06D3\\u06D5\\u06E5\\u06E6\\u06EE-\\u06FC\\u06FF\\u0710\\u0712-\\u072F\\u074D-\\u07A5\\u07B1\\u07C0-\\u07EA\\u07F4\\u07F5\\u07FA\\u0800-\\u0815\\u081A\\u0824\\u0828\\u0840-\\u0858\\u0860-\\u086A\\u0870-\\u0887\\u0889-\\u088E\\u08A0-\\u08C9\\u0904-\\u0939\\u093D\\u0950\\u0958-\\u0961\\u0966-\\u096F\\u0971-\\u0980\\u0985-\\u098C\\u098F\\u0990\\u0993-\\u09A8\\u09AA-\\u09B0\\u09B2\\u09B6-\\u09B9\\u09BD\\u09CE\\u09DC\\u09DD\\u09DF-\\u09E1\\u09E6-\\u09F1\\u09F4-\\u09F9\\u09FC\\u0A05-\\u0A0A\\u0A0F\\u0A10\\u0A13-\\u0A28\\u0A2A-\\u0A30\\u0A32\\u0A33\\u0A35\\u0A36\\u0A38\\u0A39\\u0A59-\\u0A5C\\u0A5E\\u0A66-\\u0A6F\\u0A72-\\u0A74\\u0A85-\\u0A8D\\u0A8F-\\u0A91\\u0A93-\\u0AA8\\u0AAA-\\u0AB0\\u0AB2\\u0AB3\\u0AB5-\\u0AB9\\u0ABD\\u0AD0\\u0AE0\\u0AE1\\u0AE6-\\u0AEF\\u0AF9\\u0B05-\\u0B0C\\u0B0F\\u0B10\\u0B13-\\u0B28\\u0B2A-\\u0B30\\u0B32\\u0B33\\u0B35-\\u0B39\\u0B3D\\u0B5C\\u0B5D\\u0B5F-\\u0B61\\u0B66-\\u0B6F\\u0B71-\\u0B77\\u0B83\\u0B85-\\u0B8A\\u0B8E-\\u0B90\\u0B92-\\u0B95\\u0B99\\u0B9A\\u0B9C\\u0B9E\\u0B9F\\u0BA3\\u0BA4\\u0BA8-\\u0BAA\\u0BAE-\\u0BB9\\u0BD0\\u0BE6-\\u0BF2\\u0C05-\\u0C0C\\u0C0E-\\u0C10\\u0C12-\\u0C28\\u0C2A-\\u0C39\\u0C3D\\u0C58-\\u0C5A\\u0C5D\\u0C60\\u0C61\\u0C66-\\u0C6F\\u0C78-\\u0C7E\\u0C80\\u0C85-\\u0C8C\\u0C8E-\\u0C90\\u0C92-\\u0CA8\\u0CAA-\\u0CB3\\u0CB5-\\u0CB9\\u0CBD\\u0CDD\\u0CDE\\u0CE0\\u0CE1\\u0CE6-\\u0CEF\\u0CF1\\u0CF2\\u0D04-\\u0D0C\\u0D0E-\\u0D10\\u0D12-\\u0D3A\\u0D3D\\u0D4E\\u0D54-\\u0D56\\u0D58-\\u0D61\\u0D66-\\u0D78\\u0D7A-\\u0D7F\\u0D85-\\u0D96\\u0D9A-\\u0DB1\\u0DB3-\\u0DBB\\u0DBD\\u0DC0-\\u0DC6\\u0DE6-\\u0DEF\\u0E01-\\u0E30\\u0E32\\u0E33\\u0E40-\\u0E46\\u0E50-\\u0E59\\u0E81\\u0E82\\u0E84\\u0E86-\\u0E8A\\u0E8C-\\u0EA3\\u0EA5\\u0EA7-\\u0EB0\\u0EB2\\u0EB3\\u0EBD\\u0EC0-\\u0EC4\\u0EC6\\u0ED0-\\u0ED9\\u0EDC-\\u0EDF\\u0F00\\u0F20-\\u0F33\\u0F40-\\u0F47\\u0F49-\\u0F6C\\u0F88-\\u0F8C\\u1000-\\u102A\\u103F-\\u1049\\u1050-\\u1055\\u105A-\\u105D\\u1061\\u1065\\u1066\\u106E-\\u1070\\u1075-\\u1081\\u108E\\u1090-\\u1099\\u10A0-\\u10C5\\u10C7\\u10CD\\u10D0-\\u10FA\\u10FC-\\u1248\\u124A-\\u124D\\u1250-\\u1256\\u1258\\u125A-\\u125D\\u1260-\\u1288\\u128A-\\u128D\\u1290-\\u12B0\\u12B2-\\u12B5\\u12B8-\\u12BE\\u12C0\\u12C2-\\u12C5\\u12C8-\\u12D6\\u12D8-\\u1310\\u1312-\\u1315\\u1318-\\u135A\\u1369-\\u137C\\u1380-\\u138F\\u13A0-\\u13F5\\u13F8-\\u13FD\\u1401-\\u166C\\u166F-\\u167F\\u1681-\\u169A\\u16A0-\\u16EA\\u16EE-\\u16F8\\u1700-\\u1711\\u171F-\\u1731\\u1740-\\u1751\\u1760-\\u176C\\u176E-\\u1770\\u1780-\\u17B3\\u17D7\\u17DC\\u17E0-\\u17E9\\u17F0-\\u17F9\\u1810-\\u1819\\u1820-\\u1878\\u1880-\\u1884\\u1887-\\u18A8\\u18AA\\u18B0-\\u18F5\\u1900-\\u191E\\u1946-\\u196D\\u1970-\\u1974\\u1980-\\u19AB\\u19B0-\\u19C9\\u19D0-\\u19DA\\u1A00-\\u1A16\\u1A20-\\u1A54\\u1A80-\\u1A89\\u1A90-\\u1A99\\u1AA7\\u1B05-\\u1B33\\u1B45-\\u1B4C\\u1B50-\\u1B59\\u1B83-\\u1BA0\\u1BAE-\\u1BE5\\u1C00-\\u1C23\\u1C40-\\u1C49\\u1C4D-\\u1C7D\\u1C80-\\u1C88\\u1C90-\\u1CBA\\u1CBD-\\u1CBF\\u1CE9-\\u1CEC\\u1CEE-\\u1CF3\\u1CF5\\u1CF6\\u1CFA\\u1D00-\\u1DBF\\u1E00-\\u1F15\\u1F18-\\u1F1D\\u1F20-\\u1F45\\u1F48-\\u1F4D\\u1F50-\\u1F57\\u1F59\\u1F5B\\u1F5D\\u1F5F-\\u1F7D\\u1F80-\\u1FB4\\u1FB6-\\u1FBC\\u1FBE\\u1FC2-\\u1FC4\\u1FC6-\\u1FCC\\u1FD0-\\u1FD3\\u1FD6-\\u1FDB\\u1FE0-\\u1FEC\\u1FF2-\\u1FF4\\u1FF6-\\u1FFC\\u2070\\u2071\\u2074-\\u2079\\u207F-\\u2089\\u2090-\\u209C\\u2102\\u2107\\u210A-\\u2113\\u2115\\u2119-\\u211D\\u2124\\u2126\\u2128\\u212A-\\u212D\\u212F-\\u2139\\u213C-\\u213F\\u2145-\\u2149\\u214E\\u2150-\\u2189\\u2460-\\u249B\\u24EA-\\u24FF\\u2776-\\u2793\\u2C00-\\u2CE4\\u2CEB-\\u2CEE\\u2CF2\\u2CF3\\u2CFD\\u2D00-\\u2D25\\u2D27\\u2D2D\\u2D30-\\u2D67\\u2D6F\\u2D80-\\u2D96\\u2DA0-\\u2DA6\\u2DA8-\\u2DAE\\u2DB0-\\u2DB6\\u2DB8-\\u2DBE\\u2DC0-\\u2DC6\\u2DC8-\\u2DCE\\u2DD0-\\u2DD6\\u2DD8-\\u2DDE\\u2E2F\\u3005-\\u3007\\u3021-\\u3029\\u3031-\\u3035\\u3038-\\u303C\\u3041-\\u3096\\u309D-\\u309F\\u30A1-\\u30FA\\u30FC-\\u30FF\\u3105-\\u312F\\u3131-\\u318E\\u3192-\\u3195\\u31A0-\\u31BF\\u31F0-\\u31FF\\u3220-\\u3229\\u3248-\\u324F\\u3251-\\u325F\\u3280-\\u3289\\u32B1-\\u32BF\\u3400-\\u4DBF\\u4E00-\\uA48C\\uA4D0-\\uA4FD\\uA500-\\uA60C\\uA610-\\uA62B\\uA640-\\uA66E\\uA67F-\\uA69D\\uA6A0-\\uA6EF\\uA717-\\uA71F\\uA722-\\uA788\\uA78B-\\uA7CA\\uA7D0\\uA7D1\\uA7D3\\uA7D5-\\uA7D9\\uA7F2-\\uA801\\uA803-\\uA805\\uA807-\\uA80A\\uA80C-\\uA822\\uA830-\\uA835\\uA840-\\uA873\\uA882-\\uA8B3\\uA8D0-\\uA8D9\\uA8F2-\\uA8F7\\uA8FB\\uA8FD\\uA8FE\\uA900-\\uA925\\uA930-\\uA946\\uA960-\\uA97C\\uA984-\\uA9B2\\uA9CF-\\uA9D9\\uA9E0-\\uA9E4\\uA9E6-\\uA9FE\\uAA00-\\uAA28\\uAA40-\\uAA42\\uAA44-\\uAA4B\\uAA50-\\uAA59\\uAA60-\\uAA76\\uAA7A\\uAA7E-\\uAAAF\\uAAB1\\uAAB5\\uAAB6\\uAAB9-\\uAABD\\uAAC0\\uAAC2\\uAADB-\\uAADD\\uAAE0-\\uAAEA\\uAAF2-\\uAAF4\\uAB01-\\uAB06\\uAB09-\\uAB0E\\uAB11-\\uAB16\\uAB20-\\uAB26\\uAB28-\\uAB2E\\uAB30-\\uAB5A\\uAB5C-\\uAB69\\uAB70-\\uABE2\\uABF0-\\uABF9\\uAC00-\\uD7A3\\uD7B0-\\uD7C6\\uD7CB-\\uD7FB\\uF900-\\uFA6D\\uFA70-\\uFAD9\\uFB00-\\uFB06\\uFB13-\\uFB17\\uFB1D\\uFB1F-\\uFB28\\uFB2A-\\uFB36\\uFB38-\\uFB3C\\uFB3E\\uFB40\\uFB41\\uFB43\\uFB44\\uFB46-\\uFBB1\\uFBD3-\\uFD3D\\uFD50-\\uFD8F\\uFD92-\\uFDC7\\uFDF0-\\uFDFB\\uFE70-\\uFE74\\uFE76-\\uFEFC\\uFF10-\\uFF19\\uFF21-\\uFF3A\\uFF41-\\uFF5A\\uFF66-\\uFFBE\\uFFC2-\\uFFC7\\uFFCA-\\uFFCF\\uFFD2-\\uFFD7\\uFFDA-\\uFFDC]|\\uD800[\\uDC00-\\uDC0B\\uDC0D-\\uDC26\\uDC28-\\uDC3A\\uDC3C\\uDC3D\\uDC3F-\\uDC4D\\uDC50-\\uDC5D\\uDC80-\\uDCFA\\uDD07-\\uDD33\\uDD40-\\uDD78\\uDD8A\\uDD8B\\uDE80-\\uDE9C\\uDEA0-\\uDED0\\uDEE1-\\uDEFB\\uDF00-\\uDF23\\uDF2D-\\uDF4A\\uDF50-\\uDF75\\uDF80-\\uDF9D\\uDFA0-\\uDFC3\\uDFC8-\\uDFCF\\uDFD1-\\uDFD5]|\\uD801[\\uDC00-\\uDC9D\\uDCA0-\\uDCA9\\uDCB0-\\uDCD3\\uDCD8-\\uDCFB\\uDD00-\\uDD27\\uDD30-\\uDD63\\uDD70-\\uDD7A\\uDD7C-\\uDD8A\\uDD8C-\\uDD92\\uDD94\\uDD95\\uDD97-\\uDDA1\\uDDA3-\\uDDB1\\uDDB3-\\uDDB9\\uDDBB\\uDDBC\\uDE00-\\uDF36\\uDF40-\\uDF55\\uDF60-\\uDF67\\uDF80-\\uDF85\\uDF87-\\uDFB0\\uDFB2-\\uDFBA]|\\uD802[\\uDC00-\\uDC05\\uDC08\\uDC0A-\\uDC35\\uDC37\\uDC38\\uDC3C\\uDC3F-\\uDC55\\uDC58-\\uDC76\\uDC79-\\uDC9E\\uDCA7-\\uDCAF\\uDCE0-\\uDCF2\\uDCF4\\uDCF5\\uDCFB-\\uDD1B\\uDD20-\\uDD39\\uDD80-\\uDDB7\\uDDBC-\\uDDCF\\uDDD2-\\uDE00\\uDE10-\\uDE13\\uDE15-\\uDE17\\uDE19-\\uDE35\\uDE40-\\uDE48\\uDE60-\\uDE7E\\uDE80-\\uDE9F\\uDEC0-\\uDEC7\\uDEC9-\\uDEE4\\uDEEB-\\uDEEF\\uDF00-\\uDF35\\uDF40-\\uDF55\\uDF58-\\uDF72\\uDF78-\\uDF91\\uDFA9-\\uDFAF]|\\uD803[\\uDC00-\\uDC48\\uDC80-\\uDCB2\\uDCC0-\\uDCF2\\uDCFA-\\uDD23\\uDD30-\\uDD39\\uDE60-\\uDE7E\\uDE80-\\uDEA9\\uDEB0\\uDEB1\\uDF00-\\uDF27\\uDF30-\\uDF45\\uDF51-\\uDF54\\uDF70-\\uDF81\\uDFB0-\\uDFCB\\uDFE0-\\uDFF6]|\\uD804[\\uDC03-\\uDC37\\uDC52-\\uDC6F\\uDC71\\uDC72\\uDC75\\uDC83-\\uDCAF\\uDCD0-\\uDCE8\\uDCF0-\\uDCF9\\uDD03-\\uDD26\\uDD36-\\uDD3F\\uDD44\\uDD47\\uDD50-\\uDD72\\uDD76\\uDD83-\\uDDB2\\uDDC1-\\uDDC4\\uDDD0-\\uDDDA\\uDDDC\\uDDE1-\\uDDF4\\uDE00-\\uDE11\\uDE13-\\uDE2B\\uDE80-\\uDE86\\uDE88\\uDE8A-\\uDE8D\\uDE8F-\\uDE9D\\uDE9F-\\uDEA8\\uDEB0-\\uDEDE\\uDEF0-\\uDEF9\\uDF05-\\uDF0C\\uDF0F\\uDF10\\uDF13-\\uDF28\\uDF2A-\\uDF30\\uDF32\\uDF33\\uDF35-\\uDF39\\uDF3D\\uDF50\\uDF5D-\\uDF61]|\\uD805[\\uDC00-\\uDC34\\uDC47-\\uDC4A\\uDC50-\\uDC59\\uDC5F-\\uDC61\\uDC80-\\uDCAF\\uDCC4\\uDCC5\\uDCC7\\uDCD0-\\uDCD9\\uDD80-\\uDDAE\\uDDD8-\\uDDDB\\uDE00-\\uDE2F\\uDE44\\uDE50-\\uDE59\\uDE80-\\uDEAA\\uDEB8\\uDEC0-\\uDEC9\\uDF00-\\uDF1A\\uDF30-\\uDF3B\\uDF40-\\uDF46]|\\uD806[\\uDC00-\\uDC2B\\uDCA0-\\uDCF2\\uDCFF-\\uDD06\\uDD09\\uDD0C-\\uDD13\\uDD15\\uDD16\\uDD18-\\uDD2F\\uDD3F\\uDD41\\uDD50-\\uDD59\\uDDA0-\\uDDA7\\uDDAA-\\uDDD0\\uDDE1\\uDDE3\\uDE00\\uDE0B-\\uDE32\\uDE3A\\uDE50\\uDE5C-\\uDE89\\uDE9D\\uDEB0-\\uDEF8]|\\uD807[\\uDC00-\\uDC08\\uDC0A-\\uDC2E\\uDC40\\uDC50-\\uDC6C\\uDC72-\\uDC8F\\uDD00-\\uDD06\\uDD08\\uDD09\\uDD0B-\\uDD30\\uDD46\\uDD50-\\uDD59\\uDD60-\\uDD65\\uDD67\\uDD68\\uDD6A-\\uDD89\\uDD98\\uDDA0-\\uDDA9\\uDEE0-\\uDEF2\\uDFB0\\uDFC0-\\uDFD4]|\\uD808[\\uDC00-\\uDF99]|\\uD809[\\uDC00-\\uDC6E\\uDC80-\\uDD43]|\\uD80B[\\uDF90-\\uDFF0]|[\\uD80C\\uD81C-\\uD820\\uD822\\uD840-\\uD868\\uD86A-\\uD86C\\uD86F-\\uD872\\uD874-\\uD879\\uD880-\\uD883][\\uDC00-\\uDFFF]|\\uD80D[\\uDC00-\\uDC2E]|\\uD811[\\uDC00-\\uDE46]|\\uD81A[\\uDC00-\\uDE38\\uDE40-\\uDE5E\\uDE60-\\uDE69\\uDE70-\\uDEBE\\uDEC0-\\uDEC9\\uDED0-\\uDEED\\uDF00-\\uDF2F\\uDF40-\\uDF43\\uDF50-\\uDF59\\uDF5B-\\uDF61\\uDF63-\\uDF77\\uDF7D-\\uDF8F]|\\uD81B[\\uDE40-\\uDE96\\uDF00-\\uDF4A\\uDF50\\uDF93-\\uDF9F\\uDFE0\\uDFE1\\uDFE3]|\\uD821[\\uDC00-\\uDFF7]|\\uD823[\\uDC00-\\uDCD5\\uDD00-\\uDD08]|\\uD82B[\\uDFF0-\\uDFF3\\uDFF5-\\uDFFB\\uDFFD\\uDFFE]|\\uD82C[\\uDC00-\\uDD22\\uDD50-\\uDD52\\uDD64-\\uDD67\\uDD70-\\uDEFB]|\\uD82F[\\uDC00-\\uDC6A\\uDC70-\\uDC7C\\uDC80-\\uDC88\\uDC90-\\uDC99]|\\uD834[\\uDEE0-\\uDEF3\\uDF60-\\uDF78]|\\uD835[\\uDC00-\\uDC54\\uDC56-\\uDC9C\\uDC9E\\uDC9F\\uDCA2\\uDCA5\\uDCA6\\uDCA9-\\uDCAC\\uDCAE-\\uDCB9\\uDCBB\\uDCBD-\\uDCC3\\uDCC5-\\uDD05\\uDD07-\\uDD0A\\uDD0D-\\uDD14\\uDD16-\\uDD1C\\uDD1E-\\uDD39\\uDD3B-\\uDD3E\\uDD40-\\uDD44\\uDD46\\uDD4A-\\uDD50\\uDD52-\\uDEA5\\uDEA8-\\uDEC0\\uDEC2-\\uDEDA\\uDEDC-\\uDEFA\\uDEFC-\\uDF14\\uDF16-\\uDF34\\uDF36-\\uDF4E\\uDF50-\\uDF6E\\uDF70-\\uDF88\\uDF8A-\\uDFA8\\uDFAA-\\uDFC2\\uDFC4-\\uDFCB\\uDFCE-\\uDFFF]|\\uD837[\\uDF00-\\uDF1E]|\\uD838[\\uDD00-\\uDD2C\\uDD37-\\uDD3D\\uDD40-\\uDD49\\uDD4E\\uDE90-\\uDEAD\\uDEC0-\\uDEEB\\uDEF0-\\uDEF9]|\\uD839[\\uDFE0-\\uDFE6\\uDFE8-\\uDFEB\\uDFED\\uDFEE\\uDFF0-\\uDFFE]|\\uD83A[\\uDC00-\\uDCC4\\uDCC7-\\uDCCF\\uDD00-\\uDD43\\uDD4B\\uDD50-\\uDD59]|\\uD83B[\\uDC71-\\uDCAB\\uDCAD-\\uDCAF\\uDCB1-\\uDCB4\\uDD01-\\uDD2D\\uDD2F-\\uDD3D\\uDE00-\\uDE03\\uDE05-\\uDE1F\\uDE21\\uDE22\\uDE24\\uDE27\\uDE29-\\uDE32\\uDE34-\\uDE37\\uDE39\\uDE3B\\uDE42\\uDE47\\uDE49\\uDE4B\\uDE4D-\\uDE4F\\uDE51\\uDE52\\uDE54\\uDE57\\uDE59\\uDE5B\\uDE5D\\uDE5F\\uDE61\\uDE62\\uDE64\\uDE67-\\uDE6A\\uDE6C-\\uDE72\\uDE74-\\uDE77\\uDE79-\\uDE7C\\uDE7E\\uDE80-\\uDE89\\uDE8B-\\uDE9B\\uDEA1-\\uDEA3\\uDEA5-\\uDEA9\\uDEAB-\\uDEBB]|\\uD83C[\\uDD00-\\uDD0C]|\\uD83E[\\uDFF0-\\uDFF9]|\\uD869[\\uDC00-\\uDEDF\\uDF00-\\uDFFF]|\\uD86D[\\uDC00-\\uDF38\\uDF40-\\uDFFF]|\\uD86E[\\uDC00-\\uDC1D\\uDC20-\\uDFFF]|\\uD873[\\uDC00-\\uDEA1\\uDEB0-\\uDFFF]|\\uD87A[\\uDC00-\\uDFE0]|\\uD87E[\\uDC00-\\uDE1D]|\\uD884[\\uDC00-\\uDF4A])/))){var Y=F[1]||F[2]||\"\";if(!Y||Y&&(V===\"\"||this.rules.inline.punctuation.exec(V))){var ie=F[0].length-1,ye,ve,Fe=ie,Pe=0,Ct=F[0][0]===\"*\"?this.rules.inline.emStrong.rDelimAst:this.rules.inline.emStrong.rDelimUnd;for(Ct.lastIndex=0,M=M.slice(-1*E.length+ie);(F=Ct.exec(M))!=null;)if(ye=F[1]||F[2]||F[3]||F[4]||F[5]||F[6],!!ye){if(ve=ye.length,F[3]||F[4]){Fe+=ve;continue}else if((F[5]||F[6])&&ie%3&&!((ie+ve)%3)){Pe+=ve;continue}if(Fe-=ve,!(Fe>0)){if(ve=Math.min(ve,ve+Fe+Pe),Math.min(ie,ve)%2){var at=E.slice(1,ie+F.index+ve);return{type:\"em\",raw:E.slice(0,ie+F.index+ve+1),text:at,tokens:this.lexer.inlineTokens(at,[])}}var De=E.slice(2,ie+F.index+ve-1);return{type:\"strong\",raw:E.slice(0,ie+F.index+ve+1),text:De,tokens:this.lexer.inlineTokens(De,[])}}}}}},U.codespan=function(E){var M=this.rules.inline.code.exec(E);if(M){var V=M[2].replace(/\\n/g,\" \"),F=/[^ ]/.test(V),Y=/^ /.test(V)&&/ $/.test(V);return F&&Y&&(V=V.substring(1,V.length-1)),V=_(V,!0),{type:\"codespan\",raw:M[0],text:V}}},U.br=function(E){var M=this.rules.inline.br.exec(E);if(M)return{type:\"br\",raw:M[0]}},U.del=function(E){var M=this.rules.inline.del.exec(E);if(M)return{type:\"del\",raw:M[0],text:M[2],tokens:this.lexer.inlineTokens(M[2],[])}},U.autolink=function(E,M){var V=this.rules.inline.autolink.exec(E);if(V){var F,Y;return V[2]===\"@\"?(F=_(this.options.mangle?M(V[1]):V[1]),Y=\"mailto:\"+F):(F=_(V[1]),Y=F),{type:\"link\",raw:V[0],text:F,href:Y,tokens:[{type:\"text\",raw:F,text:F}]}}},U.url=function(E,M){var V;if(V=this.rules.inline.url.exec(E)){var F,Y;if(V[2]===\"@\")F=_(this.options.mangle?M(V[0]):V[0]),Y=\"mailto:\"+F;else{var ie;do ie=V[0],V[0]=this.rules.inline._backpedal.exec(V[0])[0];while(ie!==V[0]);F=_(V[0]),V[1]===\"www.\"?Y=\"http://\"+F:Y=F}return{type:\"link\",raw:V[0],text:F,href:Y,tokens:[{type:\"text\",raw:F,text:F}]}}},U.inlineText=function(E,M){var V=this.rules.inline.text.exec(E);if(V){var F;return this.lexer.state.inRawBlock?F=this.options.sanitize?this.options.sanitizer?this.options.sanitizer(V[0]):_(V[0]):V[0]:F=_(this.options.smartypants?M(V[0]):V[0]),{type:\"text\",raw:V[0],text:F}}},Z}(),_e={newline:/^(?: *(?:\\n|$))+/,code:/^( {4}[^\\n]+(?:\\n(?: *(?:\\n|$))*)?)+/,fences:/^ {0,3}(`{3,}(?=[^`\\n]*\\n)|~{3,})([^\\n]*)\\n(?:|([\\s\\S]*?)\\n)(?: {0,3}\\1[~`]* *(?=\\n|$)|$)/,hr:/^ {0,3}((?:-[\\t ]*){3,}|(?:_[ \\t]*){3,}|(?:\\*[ \\t]*){3,})(?:\\n+|$)/,heading:/^ {0,3}(#{1,6})(?=\\s|$)(.*)(?:\\n+|$)/,blockquote:/^( {0,3}> ?(paragraph|[^\\n]*)(?:\\n|$))+/,list:/^( {0,3}bull)([ \\t][^\\n]+?)?(?:\\n|$)/,html:\"^ {0,3}(?:<(script|pre|style|textarea)[\\\\s>][\\\\s\\\\S]*?(?:</\\\\1>[^\\\\n]*\\\\n+|$)|comment[^\\\\n]*(\\\\n+|$)|<\\\\?[\\\\s\\\\S]*?(?:\\\\?>\\\\n*|$)|<![A-Z][\\\\s\\\\S]*?(?:>\\\\n*|$)|<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?(?:\\\\]\\\\]>\\\\n*|$)|</?(tag)(?: +|\\\\n|/?>)[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)|<(?!script|pre|style|textarea)([a-z][\\\\w-]*)(?:attribute)*? */?>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$)|</(?!script|pre|style|textarea)[a-z][\\\\w-]*\\\\s*>(?=[ \\\\t]*(?:\\\\n|$))[\\\\s\\\\S]*?(?:(?:\\\\n *)+\\\\n|$))\",def:/^ {0,3}\\[(label)\\]: *(?:\\n *)?<?([^\\s>]+)>?(?:(?: +(?:\\n *)?| *\\n *)(title))? *(?:\\n+|$)/,table:H,lheading:/^([^\\n]+)\\n {0,3}(=+|-+) *(?:\\n+|$)/,_paragraph:/^([^\\n]+(?:\\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\\n)[^\\n]+)*)/,text:/^[^\\n]+/};_e._label=/(?!\\s*\\])(?:\\\\.|[^\\[\\]\\\\])+/,_e._title=/(?:\"(?:\\\\\"?|[^\"\\\\])*\"|'[^'\\n]*(?:\\n[^'\\n]+)*\\n?'|\\([^()]*\\))/,_e.def=w(_e.def).replace(\"label\",_e._label).replace(\"title\",_e._title).getRegex(),_e.bullet=/(?:[*+-]|\\d{1,9}[.)])/,_e.listItemStart=w(/^( *)(bull) */).replace(\"bull\",_e.bullet).getRegex(),_e.list=w(_e.list).replace(/bull/g,_e.bullet).replace(\"hr\",\"\\\\n+(?=\\\\1?(?:(?:- *){3,}|(?:_ *){3,}|(?:\\\\* *){3,})(?:\\\\n+|$))\").replace(\"def\",\"\\\\n+(?=\"+_e.def.source+\")\").getRegex(),_e._tag=\"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|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|section|source|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul\",_e._comment=/<!--(?!-?>)[\\s\\S]*?(?:-->|$)/,_e.html=w(_e.html,\"i\").replace(\"comment\",_e._comment).replace(\"tag\",_e._tag).replace(\"attribute\",/ +[a-zA-Z:_][\\w.:-]*(?: *= *\"[^\"\\n]*\"| *= *'[^'\\n]*'| *= *[^\\s\"'=<>`]+)?/).getRegex(),_e.paragraph=w(_e._paragraph).replace(\"hr\",_e.hr).replace(\"heading\",\" {0,3}#{1,6} \").replace(\"|lheading\",\"\").replace(\"|table\",\"\").replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",_e._tag).getRegex(),_e.blockquote=w(_e.blockquote).replace(\"paragraph\",_e.paragraph).getRegex(),_e.normal=$({},_e),_e.gfm=$({},_e.normal,{table:\"^ *([^\\\\n ].*\\\\|.*)\\\\n {0,3}(?:\\\\| *)?(:?-+:? *(?:\\\\| *:?-+:? *)*)(?:\\\\| *)?(?:\\\\n((?:(?! *\\\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\\\n|$))*)\\\\n*|$)\"}),_e.gfm.table=w(_e.gfm.table).replace(\"hr\",_e.hr).replace(\"heading\",\" {0,3}#{1,6} \").replace(\"blockquote\",\" {0,3}>\").replace(\"code\",\" {4}[^\\\\n]\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",_e._tag).getRegex(),_e.gfm.paragraph=w(_e._paragraph).replace(\"hr\",_e.hr).replace(\"heading\",\" {0,3}#{1,6} \").replace(\"|lheading\",\"\").replace(\"table\",_e.gfm.table).replace(\"blockquote\",\" {0,3}>\").replace(\"fences\",\" {0,3}(?:`{3,}(?=[^`\\\\n]*\\\\n)|~{3,})[^\\\\n]*\\\\n\").replace(\"list\",\" {0,3}(?:[*+-]|1[.)]) \").replace(\"html\",\"</?(?:tag)(?: +|\\\\n|/?>)|<(?:script|pre|style|textarea|!--)\").replace(\"tag\",_e._tag).getRegex(),_e.pedantic=$({},_e.normal,{html:w(`^ *(?:comment *(?:\\\\n|\\\\s*$)|<(tag)[\\\\s\\\\S]+?</\\\\1> *(?:\\\\n{2,}|\\\\s*$)|<tag(?:\"[^\"]*\"|'[^']*'|\\\\s[^'\"/>\\\\s]*)*?/?> *(?:\\\\n{2,}|\\\\s*$))`).replace(\"comment\",_e._comment).replace(/tag/g,\"(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\\\b)\\\\w+(?!:|[^\\\\w\\\\s@]*@)\\\\b\").getRegex(),def:/^ *\\[([^\\]]+)\\]: *<?([^\\s>]+)>?(?: +([\"(][^\\n]+[\")]))? *(?:\\n+|$)/,heading:/^(#{1,6})(.*)(?:\\n+|$)/,fences:H,paragraph:w(_e.normal._paragraph).replace(\"hr\",_e.hr).replace(\"heading\",` *#{1,6} *[^\n]`).replace(\"lheading\",_e.lheading).replace(\"blockquote\",\" {0,3}>\").replace(\"|fences\",\"\").replace(\"|list\",\"\").replace(\"|html\",\"\").getRegex()});var ge={escape:/^\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/,autolink:/^<(scheme:[^\\s\\x00-\\x1f<>]*|email)>/,url:H,tag:\"^comment|^</[a-zA-Z][\\\\w:-]*\\\\s*>|^<[a-zA-Z][\\\\w-]*(?:attribute)*?\\\\s*/?>|^<\\\\?[\\\\s\\\\S]*?\\\\?>|^<![a-zA-Z]+\\\\s[\\\\s\\\\S]*?>|^<!\\\\[CDATA\\\\[[\\\\s\\\\S]*?\\\\]\\\\]>\",link:/^!?\\[(label)\\]\\(\\s*(href)(?:\\s+(title))?\\s*\\)/,reflink:/^!?\\[(label)\\]\\[(ref)\\]/,nolink:/^!?\\[(ref)\\](?:\\[\\])?/,reflinkSearch:\"reflink|nolink(?!\\\\()\",emStrong:{lDelim:/^(?:\\*+(?:([punct_])|[^\\s*]))|^_+(?:([punct*])|([^\\s_]))/,rDelimAst:/^[^_*]*?\\_\\_[^_*]*?\\*[^_*]*?(?=\\_\\_)|[^*]+(?=[^*])|[punct_](\\*+)(?=[\\s]|$)|[^punct*_\\s](\\*+)(?=[punct_\\s]|$)|[punct_\\s](\\*+)(?=[^punct*_\\s])|[\\s](\\*+)(?=[punct_])|[punct_](\\*+)(?=[punct_])|[^punct*_\\s](\\*+)(?=[^punct*_\\s])/,rDelimUnd:/^[^_*]*?\\*\\*[^_*]*?\\_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|[punct*](\\_+)(?=[\\s]|$)|[^punct*_\\s](\\_+)(?=[punct*\\s]|$)|[punct*\\s](\\_+)(?=[^punct*_\\s])|[\\s](\\_+)(?=[punct*])|[punct*](\\_+)(?=[punct*])/},code:/^(`+)([^`]|[^`][\\s\\S]*?[^`])\\1(?!`)/,br:/^( {2,}|\\\\)\\n(?!\\s*$)/,del:H,text:/^(`+|[^`])(?:(?= {2,}\\n)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*_]|\\b_|$)|[^ ](?= {2,}\\n)))/,punctuation:/^([\\spunctuation])/};ge._punctuation=\"!\\\"#$%&'()+\\\\-.,/:;<=>?@\\\\[\\\\]`^{|}~\",ge.punctuation=w(ge.punctuation).replace(/punctuation/g,ge._punctuation).getRegex(),ge.blockSkip=/\\[[^\\]]*?\\]\\([^\\)]*?\\)|`[^`]*?`|<[^>]*?>/g,ge.escapedEmSt=/\\\\\\*|\\\\_/g,ge._comment=w(_e._comment).replace(\"(?:-->|$)\",\"-->\").getRegex(),ge.emStrong.lDelim=w(ge.emStrong.lDelim).replace(/punct/g,ge._punctuation).getRegex(),ge.emStrong.rDelimAst=w(ge.emStrong.rDelimAst,\"g\").replace(/punct/g,ge._punctuation).getRegex(),ge.emStrong.rDelimUnd=w(ge.emStrong.rDelimUnd,\"g\").replace(/punct/g,ge._punctuation).getRegex(),ge._escapes=/\\\\([!\"#$%&'()*+,\\-./:;<=>?@\\[\\]\\\\^_`{|}~])/g,ge._scheme=/[a-zA-Z][a-zA-Z0-9+.-]{1,31}/,ge._email=/[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/,ge.autolink=w(ge.autolink).replace(\"scheme\",ge._scheme).replace(\"email\",ge._email).getRegex(),ge._attribute=/\\s+[a-zA-Z:_][\\w.:-]*(?:\\s*=\\s*\"[^\"]*\"|\\s*=\\s*'[^']*'|\\s*=\\s*[^\\s\"'=<>`]+)?/,ge.tag=w(ge.tag).replace(\"comment\",ge._comment).replace(\"attribute\",ge._attribute).getRegex(),ge._label=/(?:\\[(?:\\\\.|[^\\[\\]\\\\])*\\]|\\\\.|`[^`]*`|[^\\[\\]\\\\`])*?/,ge._href=/<(?:\\\\.|[^\\n<>\\\\])+>|[^\\s\\x00-\\x1f]*/,ge._title=/\"(?:\\\\\"?|[^\"\\\\])*\"|'(?:\\\\'?|[^'\\\\])*'|\\((?:\\\\\\)?|[^)\\\\])*\\)/,ge.link=w(ge.link).replace(\"label\",ge._label).replace(\"href\",ge._href).replace(\"title\",ge._title).getRegex(),ge.reflink=w(ge.reflink).replace(\"label\",ge._label).replace(\"ref\",_e._label).getRegex(),ge.nolink=w(ge.nolink).replace(\"ref\",_e._label).getRegex(),ge.reflinkSearch=w(ge.reflinkSearch,\"g\").replace(\"reflink\",ge.reflink).replace(\"nolink\",ge.nolink).getRegex(),ge.normal=$({},ge),ge.pedantic=$({},ge.normal,{strong:{start:/^__|\\*\\*/,middle:/^__(?=\\S)([\\s\\S]*?\\S)__(?!_)|^\\*\\*(?=\\S)([\\s\\S]*?\\S)\\*\\*(?!\\*)/,endAst:/\\*\\*(?!\\*)/g,endUnd:/__(?!_)/g},em:{start:/^_|\\*/,middle:/^()\\*(?=\\S)([\\s\\S]*?\\S)\\*(?!\\*)|^_(?=\\S)([\\s\\S]*?\\S)_(?!_)/,endAst:/\\*(?!\\*)/g,endUnd:/_(?!_)/g},link:w(/^!?\\[(label)\\]\\((.*?)\\)/).replace(\"label\",ge._label).getRegex(),reflink:w(/^!?\\[(label)\\]\\s*\\[([^\\]]*)\\]/).replace(\"label\",ge._label).getRegex()}),ge.gfm=$({},ge.normal,{escape:w(ge.escape).replace(\"])\",\"~|])\").getRegex(),_extended_email:/[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/,url:/^((?:ftp|https?):\\/\\/|www\\.)(?:[a-zA-Z0-9\\-]+\\.?)+[^\\s<]*|^email/,_backpedal:/(?:[^?!.,:;*_~()&]+|\\([^)]*\\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_~)]+(?!$))+/,del:/^(~~?)(?=[^\\s~])([\\s\\S]*?[^\\s~])\\1(?=[^~]|$)/,text:/^([`~]+|[^`~])(?:(?= {2,}\\n)|(?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)|[\\s\\S]*?(?:(?=[\\\\<!\\[`*~_]|\\b_|https?:\\/\\/|ftp:\\/\\/|www\\.|$)|[^ ](?= {2,}\\n)|[^a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-](?=[a-zA-Z0-9.!#$%&'*+\\/=?_`{\\|}~-]+@)))/}),ge.gfm.url=w(ge.gfm.url,\"i\").replace(\"email\",ge.gfm._extended_email).getRegex(),ge.breaks=$({},ge.gfm,{br:w(ge.br).replace(\"{2,}\",\"*\").getRegex(),text:w(ge.gfm.text).replace(\"\\\\b_\",\"\\\\b_| {2,}\\\\n\").replace(/\\{2,\\}/g,\"*\").getRegex()});function It(Z){return Z.replace(/---/g,\"\\u2014\").replace(/--/g,\"\\u2013\").replace(/(^|[-\\u2014/(\\[{\"\\s])'/g,\"$1\\u2018\").replace(/'/g,\"\\u2019\").replace(/(^|[-\\u2014/(\\[{\\u2018\\s])\"/g,\"$1\\u201C\").replace(/\"/g,\"\\u201D\").replace(/\\.{3}/g,\"\\u2026\")}function Ri(Z){var U=\"\",j,E,M=Z.length;for(j=0;j<M;j++)E=Z.charCodeAt(j),Math.random()>.5&&(E=\"x\"+E.toString(16)),U+=\"&#\"+E+\";\";return U}var Dn=function(){function Z(j){this.tokens=[],this.tokens.links=Object.create(null),this.options=j||e.defaults,this.options.tokenizer=this.options.tokenizer||new mt,this.tokenizer=this.options.tokenizer,this.tokenizer.options=this.options,this.tokenizer.lexer=this,this.inlineQueue=[],this.state={inLink:!1,inRawBlock:!1,top:!0};var E={block:_e.normal,inline:ge.normal};this.options.pedantic?(E.block=_e.pedantic,E.inline=ge.pedantic):this.options.gfm&&(E.block=_e.gfm,this.options.breaks?E.inline=ge.breaks:E.inline=ge.gfm),this.tokenizer.rules=E}Z.lex=function(E,M){var V=new Z(M);return V.lex(E)},Z.lexInline=function(E,M){var V=new Z(M);return V.inlineTokens(E)};var U=Z.prototype;return U.lex=function(E){E=E.replace(/\\r\\n|\\r/g,`\n`),this.blockTokens(E,this.tokens);for(var M;M=this.inlineQueue.shift();)this.inlineTokens(M.src,M.tokens);return this.tokens},U.blockTokens=function(E,M){var V=this;M===void 0&&(M=[]),this.options.pedantic?E=E.replace(/\\t/g,\"    \").replace(/^ +$/gm,\"\"):E=E.replace(/^( *)(\\t+)/gm,function(Fe,Pe,Ct){return Pe+\"    \".repeat(Ct.length)});for(var F,Y,ie,ye;E;)if(!(this.options.extensions&&this.options.extensions.block&&this.options.extensions.block.some(function(Fe){return(F=Fe.call({lexer:V},E,M))?(E=E.substring(F.raw.length),M.push(F),!0):!1}))){if(F=this.tokenizer.space(E)){E=E.substring(F.raw.length),F.raw.length===1&&M.length>0?M[M.length-1].raw+=`\n`:M.push(F);continue}if(F=this.tokenizer.code(E)){E=E.substring(F.raw.length),Y=M[M.length-1],Y&&(Y.type===\"paragraph\"||Y.type===\"text\")?(Y.raw+=`\n`+F.raw,Y.text+=`\n`+F.text,this.inlineQueue[this.inlineQueue.length-1].src=Y.text):M.push(F);continue}if(F=this.tokenizer.fences(E)){E=E.substring(F.raw.length),M.push(F);continue}if(F=this.tokenizer.heading(E)){E=E.substring(F.raw.length),M.push(F);continue}if(F=this.tokenizer.hr(E)){E=E.substring(F.raw.length),M.push(F);continue}if(F=this.tokenizer.blockquote(E)){E=E.substring(F.raw.length),M.push(F);continue}if(F=this.tokenizer.list(E)){E=E.substring(F.raw.length),M.push(F);continue}if(F=this.tokenizer.html(E)){E=E.substring(F.raw.length),M.push(F);continue}if(F=this.tokenizer.def(E)){E=E.substring(F.raw.length),Y=M[M.length-1],Y&&(Y.type===\"paragraph\"||Y.type===\"text\")?(Y.raw+=`\n`+F.raw,Y.text+=`\n`+F.raw,this.inlineQueue[this.inlineQueue.length-1].src=Y.text):this.tokens.links[F.tag]||(this.tokens.links[F.tag]={href:F.href,title:F.title});continue}if(F=this.tokenizer.table(E)){E=E.substring(F.raw.length),M.push(F);continue}if(F=this.tokenizer.lheading(E)){E=E.substring(F.raw.length),M.push(F);continue}if(ie=E,this.options.extensions&&this.options.extensions.startBlock&&function(){var Fe=1/0,Pe=E.slice(1),Ct=void 0;V.options.extensions.startBlock.forEach(function(at){Ct=at.call({lexer:this},Pe),typeof Ct==\"number\"&&Ct>=0&&(Fe=Math.min(Fe,Ct))}),Fe<1/0&&Fe>=0&&(ie=E.substring(0,Fe+1))}(),this.state.top&&(F=this.tokenizer.paragraph(ie))){Y=M[M.length-1],ye&&Y.type===\"paragraph\"?(Y.raw+=`\n`+F.raw,Y.text+=`\n`+F.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=Y.text):M.push(F),ye=ie.length!==E.length,E=E.substring(F.raw.length);continue}if(F=this.tokenizer.text(E)){E=E.substring(F.raw.length),Y=M[M.length-1],Y&&Y.type===\"text\"?(Y.raw+=`\n`+F.raw,Y.text+=`\n`+F.text,this.inlineQueue.pop(),this.inlineQueue[this.inlineQueue.length-1].src=Y.text):M.push(F);continue}if(E){var ve=\"Infinite loop on byte: \"+E.charCodeAt(0);if(this.options.silent){console.error(ve);break}else throw new Error(ve)}}return this.state.top=!0,M},U.inline=function(E,M){this.inlineQueue.push({src:E,tokens:M})},U.inlineTokens=function(E,M){var V=this;M===void 0&&(M=[]);var F,Y,ie,ye=E,ve,Fe,Pe;if(this.tokens.links){var Ct=Object.keys(this.tokens.links);if(Ct.length>0)for(;(ve=this.tokenizer.rules.inline.reflinkSearch.exec(ye))!=null;)Ct.includes(ve[0].slice(ve[0].lastIndexOf(\"[\")+1,-1))&&(ye=ye.slice(0,ve.index)+\"[\"+Se(\"a\",ve[0].length-2)+\"]\"+ye.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex))}for(;(ve=this.tokenizer.rules.inline.blockSkip.exec(ye))!=null;)ye=ye.slice(0,ve.index)+\"[\"+Se(\"a\",ve[0].length-2)+\"]\"+ye.slice(this.tokenizer.rules.inline.blockSkip.lastIndex);for(;(ve=this.tokenizer.rules.inline.escapedEmSt.exec(ye))!=null;)ye=ye.slice(0,ve.index)+\"++\"+ye.slice(this.tokenizer.rules.inline.escapedEmSt.lastIndex);for(;E;)if(Fe||(Pe=\"\"),Fe=!1,!(this.options.extensions&&this.options.extensions.inline&&this.options.extensions.inline.some(function(De){return(F=De.call({lexer:V},E,M))?(E=E.substring(F.raw.length),M.push(F),!0):!1}))){if(F=this.tokenizer.escape(E)){E=E.substring(F.raw.length),M.push(F);continue}if(F=this.tokenizer.tag(E)){E=E.substring(F.raw.length),Y=M[M.length-1],Y&&F.type===\"text\"&&Y.type===\"text\"?(Y.raw+=F.raw,Y.text+=F.text):M.push(F);continue}if(F=this.tokenizer.link(E)){E=E.substring(F.raw.length),M.push(F);continue}if(F=this.tokenizer.reflink(E,this.tokens.links)){E=E.substring(F.raw.length),Y=M[M.length-1],Y&&F.type===\"text\"&&Y.type===\"text\"?(Y.raw+=F.raw,Y.text+=F.text):M.push(F);continue}if(F=this.tokenizer.emStrong(E,ye,Pe)){E=E.substring(F.raw.length),M.push(F);continue}if(F=this.tokenizer.codespan(E)){E=E.substring(F.raw.length),M.push(F);continue}if(F=this.tokenizer.br(E)){E=E.substring(F.raw.length),M.push(F);continue}if(F=this.tokenizer.del(E)){E=E.substring(F.raw.length),M.push(F);continue}if(F=this.tokenizer.autolink(E,Ri)){E=E.substring(F.raw.length),M.push(F);continue}if(!this.state.inLink&&(F=this.tokenizer.url(E,Ri))){E=E.substring(F.raw.length),M.push(F);continue}if(ie=E,this.options.extensions&&this.options.extensions.startInline&&function(){var De=1/0,pi=E.slice(1),Gt=void 0;V.options.extensions.startInline.forEach(function(Ns){Gt=Ns.call({lexer:this},pi),typeof Gt==\"number\"&&Gt>=0&&(De=Math.min(De,Gt))}),De<1/0&&De>=0&&(ie=E.substring(0,De+1))}(),F=this.tokenizer.inlineText(ie,It)){E=E.substring(F.raw.length),F.raw.slice(-1)!==\"_\"&&(Pe=F.raw.slice(-1)),Fe=!0,Y=M[M.length-1],Y&&Y.type===\"text\"?(Y.raw+=F.raw,Y.text+=F.text):M.push(F);continue}if(E){var at=\"Infinite loop on byte: \"+E.charCodeAt(0);if(this.options.silent){console.error(at);break}else throw new Error(at)}}return M},i(Z,null,[{key:\"rules\",get:function(){return{block:_e,inline:ge}}}]),Z}(),Lo=function(){function Z(j){this.options=j||e.defaults}var U=Z.prototype;return U.code=function(E,M,V){var F=(M||\"\").match(/\\S*/)[0];if(this.options.highlight){var Y=this.options.highlight(E,F);Y!=null&&Y!==E&&(V=!0,E=Y)}return E=E.replace(/\\n$/,\"\")+`\n`,F?'<pre><code class=\"'+this.options.langPrefix+_(F,!0)+'\">'+(V?E:_(E,!0))+`</code></pre>\n`:\"<pre><code>\"+(V?E:_(E,!0))+`</code></pre>\n`},U.blockquote=function(E){return`<blockquote>\n`+E+`</blockquote>\n`},U.html=function(E){return E},U.heading=function(E,M,V,F){if(this.options.headerIds){var Y=this.options.headerPrefix+F.slug(V);return\"<h\"+M+' id=\"'+Y+'\">'+E+\"</h\"+M+`>\n`}return\"<h\"+M+\">\"+E+\"</h\"+M+`>\n`},U.hr=function(){return this.options.xhtml?`<hr/>\n`:`<hr>\n`},U.list=function(E,M,V){var F=M?\"ol\":\"ul\",Y=M&&V!==1?' start=\"'+V+'\"':\"\";return\"<\"+F+Y+`>\n`+E+\"</\"+F+`>\n`},U.listitem=function(E){return\"<li>\"+E+`</li>\n`},U.checkbox=function(E){return\"<input \"+(E?'checked=\"\" ':\"\")+'disabled=\"\" type=\"checkbox\"'+(this.options.xhtml?\" /\":\"\")+\"> \"},U.paragraph=function(E){return\"<p>\"+E+`</p>\n`},U.table=function(E,M){return M&&(M=\"<tbody>\"+M+\"</tbody>\"),`<table>\n<thead>\n`+E+`</thead>\n`+M+`</table>\n`},U.tablerow=function(E){return`<tr>\n`+E+`</tr>\n`},U.tablecell=function(E,M){var V=M.header?\"th\":\"td\",F=M.align?\"<\"+V+' align=\"'+M.align+'\">':\"<\"+V+\">\";return F+E+(\"</\"+V+`>\n`)},U.strong=function(E){return\"<strong>\"+E+\"</strong>\"},U.em=function(E){return\"<em>\"+E+\"</em>\"},U.codespan=function(E){return\"<code>\"+E+\"</code>\"},U.br=function(){return this.options.xhtml?\"<br/>\":\"<br>\"},U.del=function(E){return\"<del>\"+E+\"</del>\"},U.link=function(E,M,V){if(E=x(this.options.sanitize,this.options.baseUrl,E),E===null)return V;var F='<a href=\"'+_(E)+'\"';return M&&(F+=' title=\"'+M+'\"'),F+=\">\"+V+\"</a>\",F},U.image=function(E,M,V){if(E=x(this.options.sanitize,this.options.baseUrl,E),E===null)return V;var F='<img src=\"'+E+'\" alt=\"'+V+'\"';return M&&(F+=' title=\"'+M+'\"'),F+=this.options.xhtml?\"/>\":\">\",F},U.text=function(E){return E},Z}(),sa=function(){function Z(){}var U=Z.prototype;return U.strong=function(E){return E},U.em=function(E){return E},U.codespan=function(E){return E},U.del=function(E){return E},U.html=function(E){return E},U.text=function(E){return E},U.link=function(E,M,V){return\"\"+V},U.image=function(E,M,V){return\"\"+V},U.br=function(){return\"\"},Z}(),Do=function(){function Z(){this.seen={}}var U=Z.prototype;return U.serialize=function(E){return E.toLowerCase().trim().replace(/<[!\\/a-z].*?>/ig,\"\").replace(/[\\u2000-\\u206F\\u2E00-\\u2E7F\\\\'!\"#$%&()*+,./:;<=>?@[\\]^`{|}~]/g,\"\").replace(/\\s/g,\"-\")},U.getNextSafeSlug=function(E,M){var V=E,F=0;if(this.seen.hasOwnProperty(V)){F=this.seen[E];do F++,V=E+\"-\"+F;while(this.seen.hasOwnProperty(V))}return M||(this.seen[E]=F,this.seen[V]=0),V},U.slug=function(E,M){M===void 0&&(M={});var V=this.serialize(E);return this.getNextSafeSlug(V,M.dryrun)},Z}(),or=function(){function Z(j){this.options=j||e.defaults,this.options.renderer=this.options.renderer||new Lo,this.renderer=this.options.renderer,this.renderer.options=this.options,this.textRenderer=new sa,this.slugger=new Do}Z.parse=function(E,M){var V=new Z(M);return V.parse(E)},Z.parseInline=function(E,M){var V=new Z(M);return V.parseInline(E)};var U=Z.prototype;return U.parse=function(E,M){M===void 0&&(M=!0);var V=\"\",F,Y,ie,ye,ve,Fe,Pe,Ct,at,De,pi,Gt,Ns,zt,Oi,Rc,ds,rr,oa,Oc=E.length;for(F=0;F<Oc;F++){if(De=E[F],this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[De.type]&&(oa=this.options.extensions.renderers[De.type].call({parser:this},De),oa!==!1||![\"space\",\"hr\",\"heading\",\"code\",\"table\",\"blockquote\",\"list\",\"html\",\"paragraph\",\"text\"].includes(De.type))){V+=oa||\"\";continue}switch(De.type){case\"space\":continue;case\"hr\":{V+=this.renderer.hr();continue}case\"heading\":{V+=this.renderer.heading(this.parseInline(De.tokens),De.depth,v(this.parseInline(De.tokens,this.textRenderer)),this.slugger);continue}case\"code\":{V+=this.renderer.code(De.text,De.lang,De.escaped);continue}case\"table\":{for(Ct=\"\",Pe=\"\",ye=De.header.length,Y=0;Y<ye;Y++)Pe+=this.renderer.tablecell(this.parseInline(De.header[Y].tokens),{header:!0,align:De.align[Y]});for(Ct+=this.renderer.tablerow(Pe),at=\"\",ye=De.rows.length,Y=0;Y<ye;Y++){for(Fe=De.rows[Y],Pe=\"\",ve=Fe.length,ie=0;ie<ve;ie++)Pe+=this.renderer.tablecell(this.parseInline(Fe[ie].tokens),{header:!1,align:De.align[ie]});at+=this.renderer.tablerow(Pe)}V+=this.renderer.table(Ct,at);continue}case\"blockquote\":{at=this.parse(De.tokens),V+=this.renderer.blockquote(at);continue}case\"list\":{for(pi=De.ordered,Gt=De.start,Ns=De.loose,ye=De.items.length,at=\"\",Y=0;Y<ye;Y++)Oi=De.items[Y],Rc=Oi.checked,ds=Oi.task,zt=\"\",Oi.task&&(rr=this.renderer.checkbox(Rc),Ns?Oi.tokens.length>0&&Oi.tokens[0].type===\"paragraph\"?(Oi.tokens[0].text=rr+\" \"+Oi.tokens[0].text,Oi.tokens[0].tokens&&Oi.tokens[0].tokens.length>0&&Oi.tokens[0].tokens[0].type===\"text\"&&(Oi.tokens[0].tokens[0].text=rr+\" \"+Oi.tokens[0].tokens[0].text)):Oi.tokens.unshift({type:\"text\",text:rr}):zt+=rr),zt+=this.parse(Oi.tokens,Ns),at+=this.renderer.listitem(zt,ds,Rc);V+=this.renderer.list(at,pi,Gt);continue}case\"html\":{V+=this.renderer.html(De.text);continue}case\"paragraph\":{V+=this.renderer.paragraph(this.parseInline(De.tokens));continue}case\"text\":{for(at=De.tokens?this.parseInline(De.tokens):De.text;F+1<Oc&&E[F+1].type===\"text\";)De=E[++F],at+=`\n`+(De.tokens?this.parseInline(De.tokens):De.text);V+=M?this.renderer.paragraph(at):at;continue}default:{var gl='Token with \"'+De.type+'\" type was not found.';if(this.options.silent){console.error(gl);return}else throw new Error(gl)}}}return V},U.parseInline=function(E,M){M=M||this.renderer;var V=\"\",F,Y,ie,ye=E.length;for(F=0;F<ye;F++){if(Y=E[F],this.options.extensions&&this.options.extensions.renderers&&this.options.extensions.renderers[Y.type]&&(ie=this.options.extensions.renderers[Y.type].call({parser:this},Y),ie!==!1||![\"escape\",\"html\",\"link\",\"image\",\"strong\",\"em\",\"codespan\",\"br\",\"del\",\"text\"].includes(Y.type))){V+=ie||\"\";continue}switch(Y.type){case\"escape\":{V+=M.text(Y.text);break}case\"html\":{V+=M.html(Y.text);break}case\"link\":{V+=M.link(Y.href,Y.title,this.parseInline(Y.tokens,M));break}case\"image\":{V+=M.image(Y.href,Y.title,Y.text);break}case\"strong\":{V+=M.strong(this.parseInline(Y.tokens,M));break}case\"em\":{V+=M.em(this.parseInline(Y.tokens,M));break}case\"codespan\":{V+=M.codespan(Y.text);break}case\"br\":{V+=M.br();break}case\"del\":{V+=M.del(this.parseInline(Y.tokens,M));break}case\"text\":{V+=M.text(Y.text);break}default:{var ve='Token with \"'+Y.type+'\" type was not found.';if(this.options.silent){console.error(ve);return}else throw new Error(ve)}}}return V},Z}();function Oe(Z,U,j){if(typeof Z==\"undefined\"||Z===null)throw new Error(\"marked(): input parameter is undefined or null\");if(typeof Z!=\"string\")throw new Error(\"marked(): input parameter is of type \"+Object.prototype.toString.call(Z)+\", string expected\");if(typeof U==\"function\"&&(j=U,U=null),U=$({},Oe.defaults,U||{}),we(U),j){var E=U.highlight,M;try{M=Dn.lex(Z,U)}catch(ie){return j(ie)}var V=function(ye){var ve;if(!ye)try{U.walkTokens&&Oe.walkTokens(M,U.walkTokens),ve=or.parse(M,U)}catch(Fe){ye=Fe}return U.highlight=E,ye?j(ye):j(null,ve)};if(!E||E.length<3||(delete U.highlight,!M.length))return V();var F=0;Oe.walkTokens(M,function(ie){ie.type===\"code\"&&(F++,setTimeout(function(){E(ie.text,ie.lang,function(ye,ve){if(ye)return V(ye);ve!=null&&ve!==ie.text&&(ie.text=ve,ie.escaped=!0),F--,F===0&&V()})},0))}),F===0&&V();return}try{var Y=Dn.lex(Z,U);return U.walkTokens&&Oe.walkTokens(Y,U.walkTokens),or.parse(Y,U)}catch(ie){if(ie.message+=`\nPlease report this to https://github.com/markedjs/marked.`,U.silent)return\"<p>An error occurred:</p><pre>\"+_(ie.message+\"\",!0)+\"</pre>\";throw ie}}Oe.options=Oe.setOptions=function(Z){return $(Oe.defaults,Z),l(Oe.defaults),Oe},Oe.getDefaults=a,Oe.defaults=e.defaults,Oe.use=function(){for(var Z=arguments.length,U=new Array(Z),j=0;j<Z;j++)U[j]=arguments[j];var E=$.apply(void 0,[{}].concat(U)),M=Oe.defaults.extensions||{renderers:{},childTokens:{}},V;U.forEach(function(F){if(F.extensions&&(V=!0,F.extensions.forEach(function(ie){if(!ie.name)throw new Error(\"extension name required\");if(ie.renderer){var ye=M.renderers?M.renderers[ie.name]:null;ye?M.renderers[ie.name]=function(){for(var ve=arguments.length,Fe=new Array(ve),Pe=0;Pe<ve;Pe++)Fe[Pe]=arguments[Pe];var Ct=ie.renderer.apply(this,Fe);return Ct===!1&&(Ct=ye.apply(this,Fe)),Ct}:M.renderers[ie.name]=ie.renderer}if(ie.tokenizer){if(!ie.level||ie.level!==\"block\"&&ie.level!==\"inline\")throw new Error(\"extension level must be 'block' or 'inline'\");M[ie.level]?M[ie.level].unshift(ie.tokenizer):M[ie.level]=[ie.tokenizer],ie.start&&(ie.level===\"block\"?M.startBlock?M.startBlock.push(ie.start):M.startBlock=[ie.start]:ie.level===\"inline\"&&(M.startInline?M.startInline.push(ie.start):M.startInline=[ie.start]))}ie.childTokens&&(M.childTokens[ie.name]=ie.childTokens)})),F.renderer&&function(){var ie=Oe.defaults.renderer||new Lo,ye=function(Pe){var Ct=ie[Pe];ie[Pe]=function(){for(var at=arguments.length,De=new Array(at),pi=0;pi<at;pi++)De[pi]=arguments[pi];var Gt=F.renderer[Pe].apply(ie,De);return Gt===!1&&(Gt=Ct.apply(ie,De)),Gt}};for(var ve in F.renderer)ye(ve);E.renderer=ie}(),F.tokenizer&&function(){var ie=Oe.defaults.tokenizer||new mt,ye=function(Pe){var Ct=ie[Pe];ie[Pe]=function(){for(var at=arguments.length,De=new Array(at),pi=0;pi<at;pi++)De[pi]=arguments[pi];var Gt=F.tokenizer[Pe].apply(ie,De);return Gt===!1&&(Gt=Ct.apply(ie,De)),Gt}};for(var ve in F.tokenizer)ye(ve);E.tokenizer=ie}(),F.walkTokens){var Y=Oe.defaults.walkTokens;E.walkTokens=function(ie){F.walkTokens.call(this,ie),Y&&Y.call(this,ie)}}V&&(E.extensions=M),Oe.setOptions(E)})},Oe.walkTokens=function(Z,U){for(var j=function(){var F=M.value;switch(U.call(Oe,F),F.type){case\"table\":{for(var Y=r(F.header),ie;!(ie=Y()).done;){var ye=ie.value;Oe.walkTokens(ye.tokens,U)}for(var ve=r(F.rows),Fe;!(Fe=ve()).done;)for(var Pe=Fe.value,Ct=r(Pe),at;!(at=Ct()).done;){var De=at.value;Oe.walkTokens(De.tokens,U)}break}case\"list\":{Oe.walkTokens(F.items,U);break}default:Oe.defaults.extensions&&Oe.defaults.extensions.childTokens&&Oe.defaults.extensions.childTokens[F.type]?Oe.defaults.extensions.childTokens[F.type].forEach(function(pi){Oe.walkTokens(F[pi],U)}):F.tokens&&Oe.walkTokens(F.tokens,U)}},E=r(Z),M;!(M=E()).done;)j()},Oe.parseInline=function(Z,U){if(typeof Z==\"undefined\"||Z===null)throw new Error(\"marked.parseInline(): input parameter is undefined or null\");if(typeof Z!=\"string\")throw new Error(\"marked.parseInline(): input parameter is of type \"+Object.prototype.toString.call(Z)+\", string expected\");U=$({},Oe.defaults,U||{}),we(U);try{var j=Dn.lexInline(Z,U);return U.walkTokens&&Oe.walkTokens(j,U.walkTokens),or.parseInline(j,U)}catch(E){if(E.message+=`\nPlease report this to https://github.com/markedjs/marked.`,U.silent)return\"<p>An error occurred:</p><pre>\"+_(E.message+\"\",!0)+\"</pre>\";throw E}},Oe.Parser=or,Oe.parser=or.parse,Oe.Renderer=Lo,Oe.TextRenderer=sa,Oe.Lexer=Dn,Oe.lexer=Dn.lex,Oe.Tokenizer=mt,Oe.Slugger=Do,Oe.parse=Oe;var hl=Oe.options,nf=Oe.setOptions,sf=Oe.use,ul=Oe.walkTokens,Ih=Oe.parseInline,L_=Oe,Eh=or.parse,D_=Dn.lex;e.Lexer=Dn,e.Parser=or,e.Renderer=Lo,e.Slugger=Do,e.TextRenderer=sa,e.Tokenizer=mt,e.getDefaults=a,e.lexer=D_,e.marked=Oe,e.options=hl,e.parse=L_,e.parseInline=Ih,e.parser=Eh,e.setOptions=nf,e.use=sf,e.walkTokens=ul,Object.defineProperty(e,\"__esModule\",{value:!0})})})();var zM=s3||exports;function Ov(o){let e=JSON.parse(o);return e=JL(e),e}function JL(o,e=0){if(!o||e>200)return o;if(typeof o==\"object\"){switch(o.$mid){case 1:return me.revive(o);case 2:return new RegExp(o.source,o.flags);case 14:return new Date(o.source)}if(o instanceof VC||o instanceof Uint8Array)return o;if(Array.isArray(o))for(let t=0;t<o.length;++t)o[t]=JL(o[t],e+1);else for(const t in o)Object.hasOwnProperty.call(o,t)&&(o[t]=JL(o[t],e+1))}return o}function pJ(o,e={},t={}){var i;const n=new ee;let s=!1;const r=LE(e),a=function(_){let b;try{b=Ov(decodeURIComponent(_))}catch(v){}return b?(b=FP(b,v=>{if(o.uris&&o.uris[v])return me.revive(o.uris[v])}),encodeURIComponent(JSON.stringify(b))):_},l=function(_,b){const v=o.uris&&o.uris[_];let C=me.revive(v);return b?_.startsWith(Ne.data+\":\")?_:(C||(C=me.parse(_)),RO.asBrowserUri(C).toString(!0)):!C||me.parse(_).toString()===C.toString()?_:(C.query&&(C=C.with({query:a(C.query)})),C.toString())},c=new zM.Renderer;c.image=(_,b,v)=>{let C=[],w=[];return _&&({href:_,dimensions:C}=OG(_),w.push(`src=\"${cb(_)}\"`)),v&&w.push(`alt=\"${cb(v)}\"`),b&&w.push(`title=\"${cb(b)}\"`),C.length&&(w=w.concat(C)),\"<img \"+w.join(\" \")+\">\"},c.link=(_,b,v)=>typeof _!=\"string\"?\"\":(_===v&&(v=nS(v)),b=typeof b==\"string\"?cb(nS(b)):\"\",_=nS(_),_=_.replace(/&/g,\"&amp;\").replace(/</g,\"&lt;\").replace(/>/g,\"&gt;\").replace(/\"/g,\"&quot;\").replace(/'/g,\"&#39;\"),`<a href=\"${_}\" title=\"${b||_}\">${v}</a>`),c.paragraph=_=>`<p>${_}</p>`;const d=[];if(e.codeBlockRenderer&&(c.code=(_,b)=>{const v=iF.nextId(),C=e.codeBlockRenderer(b!=null?b:\"\",_);return d.push(C.then(w=>[v,w])),`<div class=\"code\" data-code=\"${v}\">${Hx(_)}</div>`}),e.actionHandler){const _=e.actionHandler.disposables.add(new _t(r,\"click\")),b=e.actionHandler.disposables.add(new _t(r,\"auxclick\"));e.actionHandler.disposables.add(pe.any(_.event,b.event)(v=>{const C=new Ir(v);if(!C.leftButton&&!C.middleButton)return;let w=C.target;if(!(w.tagName!==\"A\"&&(w=w.parentElement,!w||w.tagName!==\"A\")))try{let S=w.dataset.href;S&&(o.baseUri&&(S=OS(me.from(o.baseUri),S)),e.actionHandler.callback(S,C))}catch(S){Ee(S)}finally{C.preventDefault()}}))}o.supportHtml||(t.sanitizer=_=>(o.isTrusted?_.match(/^(<span[^>]+>)|(<\\/\\s*span>)$/):void 0)?_:\"\",t.sanitize=!0,t.silent=!0),t.renderer=c;let h=(i=o.value)!==null&&i!==void 0?i:\"\";h.length>1e5&&(h=`${h.substr(0,1e5)}\\u2026`),o.supportThemeIcons&&(h=TG(h));let u=zM.parse(h,t);o.supportThemeIcons&&(u=yd(u).map(b=>typeof b==\"string\"?b:b.outerHTML).join(\"\"));const f=new DOMParser().parseFromString(UM(o,u),\"text/html\");if(f.body.querySelectorAll(\"img\").forEach(_=>{const b=_.getAttribute(\"src\");if(b){let v=b;try{o.baseUri&&(v=OS(me.from(o.baseUri),v))}catch(C){}_.src=l(v,!0)}}),f.body.querySelectorAll(\"a\").forEach(_=>{const b=_.getAttribute(\"href\");if(_.setAttribute(\"href\",\"\"),!b||/^data:|javascript:/i.test(b)||/^command:/i.test(b)&&!o.isTrusted||/^command:(\\/\\/\\/)?_workbench\\.downloadResource/i.test(b))_.replaceWith(..._.childNodes);else{let v=l(b,!1);o.baseUri&&(v=OS(me.from(o.baseUri),b)),_.dataset.href=v}}),r.innerHTML=UM(o,f.body.innerHTML),d.length>0&&Promise.all(d).then(_=>{var b,v;if(s)return;const C=new Map(_),w=r.querySelectorAll(\"div[data-code]\");for(const S of w){const k=C.get((b=S.dataset.code)!==null&&b!==void 0?b:\"\");k&&Rd(S,k)}(v=e.asyncRenderCallback)===null||v===void 0||v.call(e)}),e.asyncRenderCallback)for(const _ of r.getElementsByTagName(\"img\")){const b=n.add(q(_,\"load\",()=>{b.dispose(),e.asyncRenderCallback()}))}return{element:r,dispose:()=>{s=!0,n.dispose()}}}function OS(o,e){return/^\\w[\\w\\d+.-]*:/.test(e)?e:o.path.endsWith(\"/\")?S2(o,e).toString():S2(a1(o),e).toString()}function UM(o,e){const{config:t,allowedSchemes:i}=mJ(o);LO(\"uponSanitizeAttribute\",(s,r)=>{if(r.attrName===\"style\"||r.attrName===\"class\"){if(s.tagName===\"SPAN\"){if(r.attrName===\"style\"){r.keepAttr=/^(color\\:#[0-9a-fA-F]+;)?(background-color\\:#[0-9a-fA-F]+;)?$/.test(r.attrValue);return}else if(r.attrName===\"class\"){r.keepAttr=/^codicon codicon-[a-z\\-]+( codicon-modifier-[a-z\\-]+)?$/.test(r.attrValue);return}}r.keepAttr=!1;return}});const n=CB(i);try{return H6(e,Object.assign(Object.assign({},t),{RETURN_TRUSTED_TYPE:!0}))}finally{DO(\"uponSanitizeAttribute\"),n.dispose()}}function mJ(o){const e=[Ne.http,Ne.https,Ne.mailto,Ne.data,Ne.file,Ne.vscodeFileResource,Ne.vscodeRemote,Ne.vscodeRemoteResource];return o.isTrusted&&e.push(Ne.command),{config:{ALLOWED_TAGS:[\"ul\",\"li\",\"p\",\"b\",\"i\",\"code\",\"blockquote\",\"ol\",\"h1\",\"h2\",\"h3\",\"h4\",\"h5\",\"h6\",\"hr\",\"em\",\"pre\",\"table\",\"thead\",\"tbody\",\"tr\",\"th\",\"td\",\"div\",\"del\",\"a\",\"strong\",\"br\",\"img\",\"span\"],ALLOWED_ATTR:[\"href\",\"data-href\",\"target\",\"title\",\"src\",\"alt\",\"class\",\"style\",\"data-code\",\"width\",\"height\",\"align\"],ALLOW_UNKNOWN_PROTOCOLS:!0},allowedSchemes:e}}var _J=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},$M=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},bJ=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})},PS;let sl=class o3{constructor(e,t,i){this._options=e,this._languageService=t,this._openerService=i,this._onDidRenderAsync=new O,this.onDidRenderAsync=this._onDidRenderAsync.event}dispose(){this._onDidRenderAsync.dispose()}render(e,t,i){if(!e)return{element:document.createElement(\"span\"),dispose:()=>{}};const n=new ee;return{element:n.add(pJ(e,Object.assign(Object.assign({},this._getRenderOptions(e,n)),t),i)).element,dispose:()=>n.dispose()}}_getRenderOptions(e,t){return{codeBlockRenderer:(i,n)=>bJ(this,void 0,void 0,function*(){var s,r,a;let l;i?l=this._languageService.getLanguageIdByLanguageName(i):this._options.editor&&(l=(s=this._options.editor.getModel())===null||s===void 0?void 0:s.getLanguageId()),l||(l=Us);const c=yield pq(this._languageService,n,l),d=document.createElement(\"span\");if(d.innerHTML=(a=(r=o3._ttpTokenizer)===null||r===void 0?void 0:r.createHTML(c))!==null&&a!==void 0?a:c,this._options.editor){const h=this._options.editor.getOption(46);tn(d,h)}else this._options.codeBlockFontFamily&&(d.style.fontFamily=this._options.codeBlockFontFamily);return this._options.codeBlockFontSize!==void 0&&(d.style.fontSize=this._options.codeBlockFontSize),d}),asyncRenderCallback:()=>this._onDidRenderAsync.fire(),actionHandler:{callback:i=>this._openerService.open(i,{fromUserGesture:!0,allowContributedOpeners:!0,allowCommands:e.isTrusted}).catch(Ee),disposables:t}}}};sl._ttpTokenizer=(PS=window.trustedTypes)===null||PS===void 0?void 0:PS.createPolicy(\"tokenizeToString\",{createHTML(o){return o}});sl=_J([$M(1,Ht),$M(2,So)],sl);const jM=se;class zu extends z{constructor(e,t,i=UY){super(),this._renderDisposeables=this._register(new ee),this._editor=e,this._isVisible=!1,this._messages=[],this._hover=this._register(new GF),this._hover.containerDomNode.classList.toggle(\"hidden\",!this._isVisible),this._markdownRenderer=this._register(new sl({editor:this._editor},t,i)),this._computer=new vJ(this._editor),this._hoverOperation=this._register(new ZF(this._editor,this._computer)),this._register(this._hoverOperation.onResult(n=>{this._withResult(n.value)})),this._register(this._editor.onDidChangeModelDecorations(()=>this._onModelDecorationsChanged())),this._register(this._editor.onDidChangeConfiguration(n=>{n.hasChanged(46)&&this._updateFont()})),this._editor.addOverlayWidget(this)}dispose(){this._editor.removeOverlayWidget(this),super.dispose()}getId(){return zu.ID}getDomNode(){return this._hover.containerDomNode}getPosition(){return null}_updateFont(){Array.prototype.slice.call(this._hover.contentsDomNode.getElementsByClassName(\"code\")).forEach(t=>this._editor.applyFontInfo(t))}_onModelDecorationsChanged(){this._isVisible&&(this._hoverOperation.cancel(),this._hoverOperation.start(0))}startShowingAt(e){this._computer.lineNumber!==e&&(this._hoverOperation.cancel(),this.hide(),this._computer.lineNumber=e,this._hoverOperation.start(0))}hide(){this._computer.lineNumber=-1,this._hoverOperation.cancel(),this._isVisible&&(this._isVisible=!1,this._hover.containerDomNode.classList.toggle(\"hidden\",!this._isVisible))}_withResult(e){this._messages=e,this._messages.length>0?this._renderMessages(this._computer.lineNumber,this._messages):this.hide()}_renderMessages(e,t){this._renderDisposeables.clear();const i=document.createDocumentFragment();for(const n of t){const s=jM(\"div.hover-row.markdown-hover\"),r=G(s,jM(\"div.hover-contents\")),a=this._renderDisposeables.add(this._markdownRenderer.render(n.value));r.appendChild(a.element),i.appendChild(s)}this._updateContents(i),this._showAt(e)}_updateContents(e){this._hover.contentsDomNode.textContent=\"\",this._hover.contentsDomNode.appendChild(e),this._updateFont()}_showAt(e){this._isVisible||(this._isVisible=!0,this._hover.containerDomNode.classList.toggle(\"hidden\",!this._isVisible));const t=this._editor.getLayoutInfo(),i=this._editor.getTopForLineNumber(e),n=this._editor.getScrollTop(),s=this._editor.getOption(61),r=this._hover.containerDomNode.clientHeight,a=i-n-(r-s)/2;this._hover.containerDomNode.style.left=`${t.glyphMarginLeft+t.glyphMarginWidth}px`,this._hover.containerDomNode.style.top=`${Math.max(Math.round(a),0)}px`}}zu.ID=\"editor.contrib.modesGlyphHoverWidget\";class vJ{constructor(e){this._editor=e,this._lineNumber=-1}get lineNumber(){return this._lineNumber}set lineNumber(e){this._lineNumber=e}computeSync(){const e=n=>({value:n}),t=this._editor.getLineDecorations(this._lineNumber),i=[];if(!t)return i;for(const n of t){if(!n.options.glyphMarginClassName)continue;const s=n.options.glyphMarginHoverMessage;!s||pg(s)||i.push(...iI(s).map(e))}return i}}var CJ=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class wJ{constructor(e,t,i){this.provider=e,this.hover=t,this.ordinal=i}}function SJ(o,e,t,i,n){return CJ(this,void 0,void 0,function*(){try{const s=yield Promise.resolve(o.provideHover(t,i,n));if(s&&LJ(s))return new wJ(o,s,e)}catch(s){Ai(s)}})}function XE(o,e,t,i){const s=o.ordered(e).map((r,a)=>SJ(r,a,e,t,i));return ni.fromPromises(s).coalesce()}function yJ(o,e,t,i){return XE(o,e,t,i).map(n=>n.hover).toPromise()}Jr(\"_executeHoverProvider\",(o,e,t)=>{const i=o.get(ue);return yJ(i.hoverProvider,e,t,We.None)});function LJ(o){const e=typeof o.range!=\"undefined\",t=typeof o.contents!=\"undefined\"&&o.contents&&o.contents.length>0;return e&&t}var DJ=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},_b=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const KM=se;class xr{constructor(e,t,i,n){this.owner=e,this.range=t,this.contents=i,this.ordinal=n}isValidForHoverAnchor(e){return e.type===1&&this.range.startColumn<=e.range.startColumn&&this.range.endColumn>=e.range.endColumn}}let Pv=class{constructor(e,t,i,n,s){this._editor=e,this._languageService=t,this._openerService=i,this._configurationService=n,this._languageFeaturesService=s,this.hoverOrdinal=2}createLoadingMessage(e){return new xr(this,e.range,[new Rn().appendText(p(\"modesContentHover.loading\",\"Loading...\"))],2e3)}computeSync(e,t){if(!this._editor.hasModel()||e.type!==1)return[];const i=this._editor.getModel(),n=e.range.startLineNumber,s=i.getLineMaxColumn(n),r=[];let a=1e3;const l=i.getLineLength(n),c=i.getLanguageIdAtPosition(e.range.startLineNumber,e.range.startColumn),d=this._configurationService.getValue(\"editor.maxTokenizationLineLength\",{overrideIdentifier:c});typeof d==\"number\"&&l>=d&&r.push(new xr(this,e.range,[{value:p(\"too many characters\",\"Tokenization is skipped for long lines for performance reasons. This can be configured via `editor.maxTokenizationLineLength`.\")}],a++));for(const h of t){const u=h.range.startLineNumber===n?h.range.startColumn:1,g=h.range.endLineNumber===n?h.range.endColumn:s,f=h.options.hoverMessage;if(!f||pg(f))continue;const _=new L(e.range.startLineNumber,u,e.range.startLineNumber,g);r.push(new xr(this,_,iI(f),a++))}return r}computeAsync(e,t,i){if(!this._editor.hasModel()||e.type!==1)return ni.EMPTY;const n=this._editor.getModel();if(!this._languageFeaturesService.hoverProvider.has(n))return ni.EMPTY;const s=new B(e.range.startLineNumber,e.range.startColumn);return XE(this._languageFeaturesService.hoverProvider,n,s,i).filter(r=>!pg(r.hover.contents)).map(r=>{const a=r.hover.range?L.lift(r.hover.range):e.range;return new xr(this,a,r.hover.contents,r.ordinal)})}renderHoverParts(e,t){return r3(e,t,this._editor,this._languageService,this._openerService)}};Pv=DJ([_b(1,Ht),_b(2,So),_b(3,ot),_b(4,ue)],Pv);function r3(o,e,t,i,n){e.sort((r,a)=>r.ordinal-a.ordinal);const s=new ee;for(const r of e)for(const a of r.contents){if(pg(a))continue;const l=KM(\"div.hover-row.markdown-hover\"),c=G(l,KM(\"div.hover-contents\")),d=s.add(new sl({editor:t},i,n));s.add(d.onDidRenderAsync(()=>{c.className=\"hover-contents code-hover-contents\",o.onContentsChanged()}));const h=s.add(d.render(a));c.appendChild(h.element),o.fragment.appendChild(l)}return s}var a3=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Fv=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};class qM{constructor(e,t,i){this.marker=e,this.index=t,this.total=i}}let eD=class{constructor(e,t,i){this._markerService=t,this._configService=i,this._onDidChange=new O,this.onDidChange=this._onDidChange.event,this._dispoables=new ee,this._markers=[],this._nextIdx=-1,me.isUri(e)?this._resourceFilter=a=>a.toString()===e.toString():e&&(this._resourceFilter=e);const n=this._configService.getValue(\"problems.sortOrder\"),s=(a,l)=>{let c=Ep(a.resource.toString(),l.resource.toString());return c===0&&(n===\"position\"?c=L.compareRangesUsingStarts(a,l)||Ft.compare(a.severity,l.severity):c=Ft.compare(a.severity,l.severity)||L.compareRangesUsingStarts(a,l)),c},r=()=>{this._markers=this._markerService.read({resource:me.isUri(e)?e:void 0,severities:Ft.Error|Ft.Warning|Ft.Info}),typeof e==\"function\"&&(this._markers=this._markers.filter(a=>this._resourceFilter(a.resource))),this._markers.sort(s)};r(),this._dispoables.add(t.onMarkerChanged(a=>{(!this._resourceFilter||a.some(l=>this._resourceFilter(l)))&&(r(),this._nextIdx=-1,this._onDidChange.fire())}))}dispose(){this._dispoables.dispose(),this._onDidChange.dispose()}matches(e){return!this._resourceFilter&&!e?!0:!this._resourceFilter||!e?!1:this._resourceFilter(e)}get selected(){const e=this._markers[this._nextIdx];return e&&new qM(e,this._nextIdx+1,this._markers.length)}_initIdx(e,t,i){let n=!1,s=this._markers.findIndex(r=>r.resource.toString()===e.uri.toString());s<0&&(s=tI(this._markers,{resource:e.uri},(r,a)=>Ep(r.resource.toString(),a.resource.toString())),s<0&&(s=~s));for(let r=s;r<this._markers.length;r++){let a=L.lift(this._markers[r]);if(a.isEmpty()){const l=e.getWordAtPosition(a.getStartPosition());l&&(a=new L(a.startLineNumber,l.startColumn,a.startLineNumber,l.endColumn))}if(t&&(a.containsPosition(t)||t.isBeforeOrEqual(a.getStartPosition()))){this._nextIdx=r,n=!0;break}if(this._markers[r].resource.toString()!==e.uri.toString())break}n||(this._nextIdx=i?0:this._markers.length-1),this._nextIdx<0&&(this._nextIdx=this._markers.length-1)}resetIndex(){this._nextIdx=-1}move(e,t,i){if(this._markers.length===0)return!1;const n=this._nextIdx;return this._nextIdx===-1?this._initIdx(t,i,e):e?this._nextIdx=(this._nextIdx+1)%this._markers.length:e||(this._nextIdx=(this._nextIdx-1+this._markers.length)%this._markers.length),n!==this._nextIdx}find(e,t){let i=this._markers.findIndex(n=>n.resource.toString()===e.toString());if(!(i<0)){for(;i<this._markers.length;i++)if(L.containsPosition(this._markers[i],t))return new qM(this._markers[i],i+1,this._markers.length)}}};eD=a3([Fv(1,ta),Fv(2,ot)],eD);const l3=qe(\"IMarkerNavigationService\");let tD=class{constructor(e,t){this._markerService=e,this._configService=t,this._provider=new wn}getMarkerList(e){for(const t of this._provider){const i=t.getMarkerList(e);if(i)return i}return new eD(e,this._markerService,this._configService)}};tD=a3([Fv(0,ta),Fv(1,ot)],tD);Xe(l3,tD,!0);var iD;(function(o){function e(t){switch(t){case Vt.Ignore:return\"severity-ignore \"+m.info.classNames;case Vt.Info:return m.info.classNames;case Vt.Warning:return m.warning.classNames;case Vt.Error:return m.error.classNames;default:return\"\"}}o.className=e})(iD||(iD={}));Rt((o,e)=>{const t=o.getColor(Hz);if(t){const s=m.error.cssSelector;e.addRule(`\n\t\t\t.monaco-editor .zone-widget ${s},\n\t\t\t.markers-panel .marker-icon${s},\n\t\t\t.text-search-provider-messages .providerMessage ${s},\n\t\t\t.extensions-viewlet > .extensions ${s} {\n\t\t\t\tcolor: ${t};\n\t\t\t}\n\t\t`)}const i=o.getColor(zz);if(i){const s=m.warning.cssSelector;e.addRule(`\n\t\t\t.monaco-editor .zone-widget ${s},\n\t\t\t.markers-panel .marker-icon${s},\n\t\t\t.extensions-viewlet > .extensions ${s},\n\t\t\t.extension-editor ${s},\n\t\t\t.text-search-provider-messages .providerMessage ${s},\n\t\t\t.preferences-editor ${s} {\n\t\t\t\tcolor: ${i};\n\t\t\t}\n\t\t`)}const n=o.getColor(Uz);if(n){const s=m.info.cssSelector;e.addRule(`\n\t\t\t.monaco-editor .zone-widget ${s},\n\t\t\t.markers-panel .marker-icon${s},\n\t\t\t.extensions-viewlet > .extensions ${s},\n\t\t\t.text-search-provider-messages .providerMessage ${s},\n\t\t\t.extension-editor ${s} {\n\t\t\t\tcolor: ${n};\n\t\t\t}\n\t\t`)}});var kJ=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},zh=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};class xJ{constructor(e,t,i,n,s){this._openerService=n,this._labelService=s,this._lines=0,this._longestLineLength=0,this._relatedDiagnostics=new WeakMap,this._disposables=new ee,this._editor=t;const r=document.createElement(\"div\");r.className=\"descriptioncontainer\",this._messageBlock=document.createElement(\"div\"),this._messageBlock.classList.add(\"message\"),this._messageBlock.setAttribute(\"aria-live\",\"assertive\"),this._messageBlock.setAttribute(\"role\",\"alert\"),r.appendChild(this._messageBlock),this._relatedBlock=document.createElement(\"div\"),r.appendChild(this._relatedBlock),this._disposables.add(Ei(this._relatedBlock,\"click\",a=>{a.preventDefault();const l=this._relatedDiagnostics.get(a.target);l&&i(l)})),this._scrollable=new D4(r,{horizontal:1,vertical:1,useShadows:!1,horizontalScrollbarSize:6,verticalScrollbarSize:6}),e.appendChild(this._scrollable.getDomNode()),this._disposables.add(this._scrollable.onScroll(a=>{r.style.left=`-${a.scrollLeft}px`,r.style.top=`-${a.scrollTop}px`})),this._disposables.add(this._scrollable)}dispose(){et(this._disposables)}update(e){const{source:t,message:i,relatedInformation:n,code:s}=e;let r=((t==null?void 0:t.length)||0)+2;s&&(typeof s==\"string\"?r+=s.length:r+=s.value.length);const a=Ur(i);this._lines=a.length,this._longestLineLength=0;for(const u of a)this._longestLineLength=Math.max(u.length+r,this._longestLineLength);Ii(this._messageBlock),this._messageBlock.setAttribute(\"aria-label\",this.getAriaLabel(e)),this._editor.applyFontInfo(this._messageBlock);let l=this._messageBlock;for(const u of a)l=document.createElement(\"div\"),l.innerText=u,u===\"\"&&(l.style.height=this._messageBlock.style.lineHeight),this._messageBlock.appendChild(l);if(t||s){const u=document.createElement(\"span\");if(u.classList.add(\"details\"),l.appendChild(u),t){const g=document.createElement(\"span\");g.innerText=t,g.classList.add(\"source\"),u.appendChild(g)}if(s)if(typeof s==\"string\"){const g=document.createElement(\"span\");g.innerText=`(${s})`,g.classList.add(\"code\"),u.appendChild(g)}else{this._codeLink=se(\"a.code-link\"),this._codeLink.setAttribute(\"href\",`${s.target.toString()}`),this._codeLink.onclick=f=>{this._openerService.open(s.target,{allowCommands:!0}),f.preventDefault(),f.stopPropagation()};const g=G(this._codeLink,se(\"span\"));g.innerText=s.value,u.appendChild(this._codeLink)}}if(Ii(this._relatedBlock),this._editor.applyFontInfo(this._relatedBlock),en(n)){const u=this._relatedBlock.appendChild(document.createElement(\"div\"));u.style.paddingTop=`${Math.floor(this._editor.getOption(61)*.66)}px`,this._lines+=1;for(const g of n){const f=document.createElement(\"div\"),_=document.createElement(\"a\");_.classList.add(\"filename\"),_.innerText=`${this._labelService.getUriBasenameLabel(g.resource)}(${g.startLineNumber}, ${g.startColumn}): `,_.title=this._labelService.getUriLabel(g.resource),this._relatedDiagnostics.set(_,g);const b=document.createElement(\"span\");b.innerText=g.message,f.appendChild(_),f.appendChild(b),this._lines+=1,u.appendChild(f)}}const c=this._editor.getOption(46),d=Math.ceil(c.typicalFullwidthCharacterWidth*this._longestLineLength*.75),h=c.lineHeight*this._lines;this._scrollable.setScrollDimensions({scrollWidth:d,scrollHeight:h})}layout(e,t){this._scrollable.getDomNode().style.height=`${e}px`,this._scrollable.getDomNode().style.width=`${t}px`,this._scrollable.setScrollDimensions({width:t,height:e})}getHeightInLines(){return Math.min(17,this._lines)}getAriaLabel(e){let t=\"\";switch(e.severity){case Ft.Error:t=p(\"Error\",\"Error\");break;case Ft.Warning:t=p(\"Warning\",\"Warning\");break;case Ft.Info:t=p(\"Info\",\"Info\");break;case Ft.Hint:t=p(\"Hint\",\"Hint\");break}let i=p(\"marker aria\",\"{0} at {1}. \",t,e.startLineNumber+\":\"+e.startColumn);const n=this._editor.getModel();return n&&e.startLineNumber<=n.getLineCount()&&e.startLineNumber>=1&&(i=`${n.getLineContent(e.startLineNumber)}, ${i}`),i}}let Cg=class c3 extends xv{constructor(e,t,i,n,s,r,a){super(e,{showArrow:!0,showFrame:!0,isAccessible:!0,frameWidth:1},s),this._themeService=t,this._openerService=i,this._menuService=n,this._contextKeyService=r,this._labelService=a,this._callOnDispose=new ee,this._onDidSelectRelatedInformation=new O,this.onDidSelectRelatedInformation=this._onDidSelectRelatedInformation.event,this._severity=Ft.Warning,this._backgroundColor=W.white,this._applyTheme(t.getColorTheme()),this._callOnDispose.add(t.onDidColorThemeChange(this._applyTheme.bind(this))),this.create()}_applyTheme(e){this._backgroundColor=e.getColor(TJ);let t=nD,i=IJ;this._severity===Ft.Warning?(t=g0,i=EJ):this._severity===Ft.Info&&(t=sD,i=NJ);const n=e.getColor(t),s=e.getColor(i);this.style({arrowColor:n,frameColor:n,headerBackgroundColor:s,primaryHeadingColor:e.getColor(lF),secondaryHeadingColor:e.getColor(cF)})}_applyStyles(){this._parentContainer&&(this._parentContainer.style.backgroundColor=this._backgroundColor?this._backgroundColor.toString():\"\"),super._applyStyles()}dispose(){this._callOnDispose.dispose(),super.dispose()}_fillHead(e){super._fillHead(e),this._disposables.add(this._actionbarWidget.actionRunner.onBeforeRun(n=>this.editor.focus()));const t=[],i=this._menuService.createMenu(c3.TitleMenu,this._contextKeyService);CX(i,void 0,t),this._actionbarWidget.push(t,{label:!1,icon:!0,index:0}),i.dispose()}_fillTitleIcon(e){this._icon=G(e,se(\"\"))}_fillBody(e){this._parentContainer=e,e.classList.add(\"marker-widget\"),this._parentContainer.tabIndex=0,this._parentContainer.setAttribute(\"role\",\"tooltip\"),this._container=document.createElement(\"div\"),e.appendChild(this._container),this._message=new xJ(this._container,this.editor,t=>this._onDidSelectRelatedInformation.fire(t),this._openerService,this._labelService),this._disposables.add(this._message)}show(){throw new Error(\"call showAtMarker\")}showAtMarker(e,t,i){this._container.classList.remove(\"stale\"),this._message.update(e),this._severity=e.severity,this._applyTheme(this._themeService.getColorTheme());const n=L.lift(e),s=this.editor.getPosition(),r=s&&n.containsPosition(s)?s:n.getStartPosition();super.show(r,this.computeRequiredHeight());const a=this.editor.getModel();if(a){const l=i>1?p(\"problems\",\"{0} of {1} problems\",t,i):p(\"change\",\"{0} of {1} problem\",t,i);this.setTitle(Ys(a.uri),l)}this._icon.className=`codicon ${iD.className(Ft.toSeverity(this._severity))}`,this.editor.revealPositionNearTop(r,0),this.editor.focus()}updateMarker(e){this._container.classList.remove(\"stale\"),this._message.update(e)}showStale(){this._container.classList.add(\"stale\"),this._relayout()}_doLayoutBody(e,t){super._doLayoutBody(e,t),this._heightInPixel=e,this._message.layout(e,t),this._container.style.height=`${e}px`}_onWidth(e){this._message.layout(this._heightInPixel,e)}_relayout(){super._relayout(this.computeRequiredHeight())}computeRequiredHeight(){return 3+this._message.getHeightInLines()}};Cg.TitleMenu=new A(\"gotoErrorTitleMenu\");Cg=kJ([zh(1,vt),zh(2,So),zh(3,fh),zh(4,Re),zh(5,xe),zh(6,bg)],Cg);const GM=Bp(Mr,ZP),ZM=Bp(Cs,og),YM=Bp(Bn,J0),nD=N(\"editorMarkerNavigationError.background\",{dark:GM,light:GM,hcDark:Be,hcLight:Be},p(\"editorMarkerNavigationError\",\"Editor marker navigation widget error color.\")),IJ=N(\"editorMarkerNavigationError.headerBackground\",{dark:fe(nD,.1),light:fe(nD,.1),hcDark:null,hcLight:null},p(\"editorMarkerNavigationErrorHeaderBackground\",\"Editor marker navigation widget error heading background.\")),g0=N(\"editorMarkerNavigationWarning.background\",{dark:ZM,light:ZM,hcDark:Be,hcLight:Be},p(\"editorMarkerNavigationWarning\",\"Editor marker navigation widget warning color.\")),EJ=N(\"editorMarkerNavigationWarning.headerBackground\",{dark:fe(g0,.1),light:fe(g0,.1),hcDark:\"#0C141F\",hcLight:fe(g0,.2)},p(\"editorMarkerNavigationWarningBackground\",\"Editor marker navigation widget warning heading background.\")),sD=N(\"editorMarkerNavigationInfo.background\",{dark:YM,light:YM,hcDark:Be,hcLight:Be},p(\"editorMarkerNavigationInfo\",\"Editor marker navigation widget info color.\")),NJ=N(\"editorMarkerNavigationInfo.headerBackground\",{dark:fe(sD,.1),light:fe(sD,.1),hcDark:null,hcLight:null},p(\"editorMarkerNavigationInfoHeaderBackground\",\"Editor marker navigation widget info heading background.\")),TJ=N(\"editorMarkerNavigation.background\",{dark:bi,light:bi,hcDark:bi,hcLight:bi},p(\"editorMarkerNavigationBackground\",\"Editor marker navigation widget background.\"));var MJ=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},bb=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},d3=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};let bc=class f0{constructor(e,t,i,n,s){this._markerNavigationService=t,this._contextKeyService=i,this._editorService=n,this._instantiationService=s,this._sessionDispoables=new ee,this._editor=e,this._widgetVisible=h3.bindTo(this._contextKeyService)}static get(e){return e.getContribution(f0.ID)}dispose(){this._cleanUp(),this._sessionDispoables.dispose()}_cleanUp(){this._widgetVisible.reset(),this._sessionDispoables.clear(),this._widget=void 0,this._model=void 0}_getOrCreateModel(e){if(this._model&&this._model.matches(e))return this._model;let t=!1;return this._model&&(t=!0,this._cleanUp()),this._model=this._markerNavigationService.getMarkerList(e),t&&this._model.move(!0,this._editor.getModel(),this._editor.getPosition()),this._widget=this._instantiationService.createInstance(Cg,this._editor),this._widget.onDidClose(()=>this.close(),this,this._sessionDispoables),this._widgetVisible.set(!0),this._sessionDispoables.add(this._model),this._sessionDispoables.add(this._widget),this._sessionDispoables.add(this._editor.onDidChangeCursorPosition(i=>{var n,s,r;(!(!((n=this._model)===null||n===void 0)&&n.selected)||!L.containsPosition((s=this._model)===null||s===void 0?void 0:s.selected.marker,i.position))&&((r=this._model)===null||r===void 0||r.resetIndex())})),this._sessionDispoables.add(this._model.onDidChange(()=>{if(!this._widget||!this._widget.position||!this._model)return;const i=this._model.find(this._editor.getModel().uri,this._widget.position);i?this._widget.updateMarker(i.marker):this._widget.showStale()})),this._sessionDispoables.add(this._widget.onDidSelectRelatedInformation(i=>{this._editorService.openCodeEditor({resource:i.resource,options:{pinned:!0,revealIfOpened:!0,selection:L.lift(i).collapseToStart()}},this._editor),this.close(!1)})),this._sessionDispoables.add(this._editor.onDidChangeModel(()=>this._cleanUp())),this._model}close(e=!0){this._cleanUp(),e&&this._editor.focus()}showAtMarker(e){if(this._editor.hasModel()){const t=this._getOrCreateModel(this._editor.getModel().uri);t.resetIndex(),t.move(!0,this._editor.getModel(),new B(e.startLineNumber,e.startColumn)),t.selected&&this._widget.showAtMarker(t.selected.marker,t.selected.index,t.selected.total)}}nagivate(e,t){var i,n;return d3(this,void 0,void 0,function*(){if(this._editor.hasModel()){const s=this._getOrCreateModel(t?void 0:this._editor.getModel().uri);if(s.move(e,this._editor.getModel(),this._editor.getPosition()),!s.selected)return;if(s.selected.marker.resource.toString()!==this._editor.getModel().uri.toString()){this._cleanUp();const r=yield this._editorService.openCodeEditor({resource:s.selected.marker.resource,options:{pinned:!1,revealIfOpened:!0,selectionRevealType:2,selection:s.selected.marker}},this._editor);r&&((i=f0.get(r))===null||i===void 0||i.close(),(n=f0.get(r))===null||n===void 0||n.nagivate(e,t))}else this._widget.showAtMarker(s.selected.marker,s.selected.index,s.selected.total)}})}};bc.ID=\"editor.contrib.markerController\";bc=MJ([bb(1,l3),bb(2,xe),bb(3,dt),bb(4,Re)],bc);class A1 extends he{constructor(e,t,i){super(i),this._next=e,this._multiFile=t}run(e,t){var i;return d3(this,void 0,void 0,function*(){t.hasModel()&&((i=bc.get(t))===null||i===void 0||i.nagivate(this._next,this._multiFile))})}}class Ql extends A1{constructor(){super(!0,!1,{id:Ql.ID,label:Ql.LABEL,alias:\"Go to Next Problem (Error, Warning, Info)\",precondition:void 0,kbOpts:{kbExpr:T.focus,primary:578,weight:100},menuOpts:{menuId:Cg.TitleMenu,title:Ql.LABEL,icon:fi(\"marker-navigation-next\",m.arrowDown,p(\"nextMarkerIcon\",\"Icon for goto next marker.\")),group:\"navigation\",order:1}})}}Ql.ID=\"editor.action.marker.next\";Ql.LABEL=p(\"markerAction.next.label\",\"Go to Next Problem (Error, Warning, Info)\");class kd extends A1{constructor(){super(!1,!1,{id:kd.ID,label:kd.LABEL,alias:\"Go to Previous Problem (Error, Warning, Info)\",precondition:void 0,kbOpts:{kbExpr:T.focus,primary:1602,weight:100},menuOpts:{menuId:Cg.TitleMenu,title:kd.LABEL,icon:fi(\"marker-navigation-previous\",m.arrowUp,p(\"previousMarkerIcon\",\"Icon for goto previous marker.\")),group:\"navigation\",order:2}})}}kd.ID=\"editor.action.marker.prev\";kd.LABEL=p(\"markerAction.previous.label\",\"Go to Previous Problem (Error, Warning, Info)\");class AJ extends A1{constructor(){super(!0,!0,{id:\"editor.action.marker.nextInFiles\",label:p(\"markerAction.nextInFiles.label\",\"Go to Next Problem in Files (Error, Warning, Info)\"),alias:\"Go to Next Problem in Files (Error, Warning, Info)\",precondition:void 0,kbOpts:{kbExpr:T.focus,primary:66,weight:100},menuOpts:{menuId:A.MenubarGoMenu,title:p({key:\"miGotoNextProblem\",comment:[\"&& denotes a mnemonic\"]},\"Next &&Problem\"),group:\"6_problem_nav\",order:1}})}}class RJ extends A1{constructor(){super(!1,!0,{id:\"editor.action.marker.prevInFiles\",label:p(\"markerAction.previousInFiles.label\",\"Go to Previous Problem in Files (Error, Warning, Info)\"),alias:\"Go to Previous Problem in Files (Error, Warning, Info)\",precondition:void 0,kbOpts:{kbExpr:T.focus,primary:1090,weight:100},menuOpts:{menuId:A.MenubarGoMenu,title:p({key:\"miGotoPreviousProblem\",comment:[\"&& denotes a mnemonic\"]},\"Previous &&Problem\"),group:\"6_problem_nav\",order:2}})}}rt(bc.ID,bc);te(Ql);te(kd);te(AJ);te(RJ);const h3=new ce(\"markersNavigationVisible\",!1),OJ=ji.bindToContribution(bc.get);Q(new OJ({id:\"closeMarkersNavigation\",precondition:h3,handler:o=>o.close(),kbOpts:{weight:100+50,kbExpr:T.focus,primary:9,secondary:[1033]}}));var PJ=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},FS=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const so=se;class FJ{constructor(e,t,i){this.owner=e,this.range=t,this.marker=i}isValidForHoverAnchor(e){return e.type===1&&this.range.startColumn<=e.range.startColumn&&this.range.endColumn>=e.range.endColumn}}const XM={type:1,filter:{include:Ke.QuickFix},triggerAction:fn.QuickFixHover};let oD=class{constructor(e,t,i,n){this._editor=e,this._markerDecorationsService=t,this._openerService=i,this._languageFeaturesService=n,this.hoverOrdinal=5,this.recentMarkerCodeActionsInfo=void 0}computeSync(e,t){if(!this._editor.hasModel()||e.type!==1)return[];const i=this._editor.getModel(),n=e.range.startLineNumber,s=i.getLineMaxColumn(n),r=[];for(const a of t){const l=a.range.startLineNumber===n?a.range.startColumn:1,c=a.range.endLineNumber===n?a.range.endColumn:s,d=this._markerDecorationsService.getMarker(i.uri,a);if(!d)continue;const h=new L(e.range.startLineNumber,l,e.range.startLineNumber,c);r.push(new FJ(this,h,d))}return r}renderHoverParts(e,t){if(!t.length)return z.None;const i=new ee;t.forEach(s=>e.fragment.appendChild(this.renderMarkerHover(s,i)));const n=t.length===1?t[0]:t.sort((s,r)=>Ft.compare(s.marker.severity,r.marker.severity))[0];return this.renderMarkerStatusbar(e,n,i),i}renderMarkerHover(e,t){const i=so(\"div.hover-row\"),n=G(i,so(\"div.marker.hover-contents\")),{source:s,message:r,code:a,relatedInformation:l}=e.marker;this._editor.applyFontInfo(n);const c=G(n,so(\"span\"));if(c.style.whiteSpace=\"pre-wrap\",c.innerText=r,s||a)if(a&&typeof a!=\"string\"){const d=so(\"span\");if(s){const f=G(d,so(\"span\"));f.innerText=s}const h=G(d,so(\"a.code-link\"));h.setAttribute(\"href\",a.target.toString()),t.add(q(h,\"click\",f=>{this._openerService.open(a.target,{allowCommands:!0}),f.preventDefault(),f.stopPropagation()}));const u=G(h,so(\"span\"));u.innerText=a.value;const g=G(n,d);g.style.opacity=\"0.6\",g.style.paddingLeft=\"6px\"}else{const d=G(n,so(\"span\"));d.style.opacity=\"0.6\",d.style.paddingLeft=\"6px\",d.innerText=s&&a?`${s}(${a})`:s||`(${a})`}if(en(l))for(const{message:d,resource:h,startLineNumber:u,startColumn:g}of l){const f=G(n,so(\"div\"));f.style.marginTop=\"8px\";const _=G(f,so(\"a\"));_.innerText=`${Ys(h)}(${u}, ${g}): `,_.style.cursor=\"pointer\",t.add(q(_,\"click\",v=>{v.stopPropagation(),v.preventDefault(),this._openerService&&this._openerService.open(h,{fromUserGesture:!0,editorOptions:{selection:{startLineNumber:u,startColumn:g}}}).catch(Ee)}));const b=G(f,so(\"span\"));b.innerText=d,this._editor.applyFontInfo(b)}return i}renderMarkerStatusbar(e,t,i){if((t.marker.severity===Ft.Error||t.marker.severity===Ft.Warning||t.marker.severity===Ft.Info)&&e.statusBar.addAction({label:p(\"view problem\",\"View Problem\"),commandId:Ql.ID,run:()=>{var n;e.hide(),(n=bc.get(this._editor))===null||n===void 0||n.showAtMarker(t.marker),this._editor.focus()}}),!this._editor.getOption(83)){const n=e.statusBar.append(so(\"div\"));this.recentMarkerCodeActionsInfo&&(yv.makeKey(this.recentMarkerCodeActionsInfo.marker)===yv.makeKey(t.marker)?this.recentMarkerCodeActionsInfo.hasCodeActions||(n.textContent=p(\"noQuickFixes\",\"No quick fixes available\")):this.recentMarkerCodeActionsInfo=void 0);const s=this.recentMarkerCodeActionsInfo&&!this.recentMarkerCodeActionsInfo.hasCodeActions?z.None:i.add(Hd(()=>n.textContent=p(\"checkingForQuickFixes\",\"Checking for quick fixes...\"),200));n.textContent||(n.textContent=String.fromCharCode(160));const r=this.getCodeActions(t.marker);i.add(ze(()=>r.cancel())),r.then(a=>{if(s.dispose(),this.recentMarkerCodeActionsInfo={marker:t.marker,hasCodeActions:a.validActions.length>0},!this.recentMarkerCodeActionsInfo.hasCodeActions){a.dispose(),n.textContent=p(\"noQuickFixes\",\"No quick fixes available\");return}n.style.display=\"none\";let l=!1;i.add(ze(()=>{l||a.dispose()})),e.statusBar.addAction({label:p(\"quick fixes\",\"Quick Fix...\"),commandId:Kg.Id,run:c=>{l=!0;const d=fc.get(this._editor),h=Qi(c);e.hide(),d==null||d.showCodeActions(XM,a,{x:h.left+6,y:h.top+h.height+6,width:h.width,height:h.height})}})},Ee)}}getCodeActions(e){return Ti(t=>pE(this._languageFeaturesService.codeActionProvider,this._editor.getModel(),new L(e.startLineNumber,e.startColumn,e.endLineNumber,e.endColumn),XM,wh.None,t))}};oD=PJ([FS(1,oI),FS(2,So),FS(3,ue)],oD);Rt((o,e)=>{const t=o.getColor(qC);t&&e.addRule(`.monaco-hover .hover-contents a.code-link span { color: ${t}; }`);const i=o.getColor(GC);i&&e.addRule(`.monaco-hover .hover-contents a.code-link span:hover { color: ${i}; }`)});var BJ=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},vb=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let vc=class u3{constructor(e,t,i,n,s){this._editor=e,this._instantiationService=t,this._openerService=i,this._languageService=n,this._toUnhook=new ee,this._isMouseDown=!1,this._hoverClicked=!1,this._contentWidget=null,this._glyphWidget=null,this._hookEvents(),this._didChangeConfigurationHandler=this._editor.onDidChangeConfiguration(r=>{r.hasChanged(55)&&(this._unhookEvents(),this._hookEvents())})}static get(e){return e.getContribution(u3.ID)}_hookEvents(){const e=()=>this._hideWidgets(),t=this._editor.getOption(55);this._isHoverEnabled=t.enabled,this._isHoverSticky=t.sticky,this._isHoverEnabled?(this._toUnhook.add(this._editor.onMouseDown(i=>this._onEditorMouseDown(i))),this._toUnhook.add(this._editor.onMouseUp(i=>this._onEditorMouseUp(i))),this._toUnhook.add(this._editor.onMouseMove(i=>this._onEditorMouseMove(i))),this._toUnhook.add(this._editor.onKeyDown(i=>this._onKeyDown(i)))):(this._toUnhook.add(this._editor.onMouseMove(i=>this._onEditorMouseMove(i))),this._toUnhook.add(this._editor.onKeyDown(i=>this._onKeyDown(i)))),this._toUnhook.add(this._editor.onMouseLeave(i=>this._onEditorMouseLeave(i))),this._toUnhook.add(this._editor.onDidChangeModel(e)),this._toUnhook.add(this._editor.onDidScrollChange(i=>this._onEditorScrollChanged(i)))}_unhookEvents(){this._toUnhook.clear()}_onEditorScrollChanged(e){(e.scrollTopChanged||e.scrollLeftChanged)&&this._hideWidgets()}_onEditorMouseDown(e){this._isMouseDown=!0;const t=e.target;if(t.type===9&&t.detail===Dd.ID){this._hoverClicked=!0;return}t.type===12&&t.detail===zu.ID||(t.type!==12&&(this._hoverClicked=!1),this._hideWidgets())}_onEditorMouseUp(e){this._isMouseDown=!1}_onEditorMouseLeave(e){var t;const i=e.event.browserEvent.relatedTarget;!((t=this._contentWidget)===null||t===void 0)&&t.containsNode(i)||this._hideWidgets()}_onEditorMouseMove(e){var t,i,n,s,r;const a=e.target;if(this._isMouseDown&&this._hoverClicked||this._isHoverSticky&&a.type===9&&a.detail===Dd.ID||this._isHoverSticky&&!(!((i=(t=e.event.browserEvent.view)===null||t===void 0?void 0:t.getSelection())===null||i===void 0)&&i.isCollapsed)||!this._isHoverSticky&&a.type===9&&a.detail===Dd.ID&&((n=this._contentWidget)===null||n===void 0?void 0:n.isColorPickerVisible())||this._isHoverSticky&&a.type===12&&a.detail===zu.ID)return;if(!this._isHoverEnabled){this._hideWidgets();return}if(this._getOrCreateContentWidget().maybeShowAt(e)){(s=this._glyphWidget)===null||s===void 0||s.hide();return}if(a.type===2&&a.position){(r=this._contentWidget)===null||r===void 0||r.hide(),this._glyphWidget||(this._glyphWidget=new zu(this._editor,this._languageService,this._openerService)),this._glyphWidget.startShowingAt(a.position.lineNumber);return}this._hideWidgets()}_onKeyDown(e){e.keyCode!==5&&e.keyCode!==6&&e.keyCode!==57&&e.keyCode!==4&&this._hideWidgets()}_hideWidgets(){var e,t,i;this._isMouseDown&&this._hoverClicked&&((e=this._contentWidget)===null||e===void 0?void 0:e.isColorPickerVisible())||(this._hoverClicked=!1,(t=this._glyphWidget)===null||t===void 0||t.hide(),(i=this._contentWidget)===null||i===void 0||i.hide())}_getOrCreateContentWidget(){return this._contentWidget||(this._contentWidget=this._instantiationService.createInstance(Av,this._editor)),this._contentWidget}isColorPickerVisible(){var e;return((e=this._contentWidget)===null||e===void 0?void 0:e.isColorPickerVisible())||!1}showContentHover(e,t,i){this._getOrCreateContentWidget().startShowingAtRange(e,t,i)}dispose(){var e,t;this._unhookEvents(),this._toUnhook.dispose(),this._didChangeConfigurationHandler.dispose(),(e=this._glyphWidget)===null||e===void 0||e.dispose(),(t=this._contentWidget)===null||t===void 0||t.dispose()}};vc.ID=\"editor.contrib.hover\";vc=BJ([vb(1,Re),vb(2,So),vb(3,Ht),vb(4,xe)],vc);class WJ extends he{constructor(){super({id:\"editor.action.showHover\",label:p({key:\"showHover\",comment:[\"Label for action that will trigger the showing of a hover in the editor.\",\"This allows for users to show the hover without using the mouse.\"]},\"Show Hover\"),alias:\"Show Hover\",precondition:void 0,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2087),weight:100}})}run(e,t){if(!t.hasModel())return;const i=vc.get(t);if(!i)return;const n=t.getPosition(),s=new L(n.lineNumber,n.column,n.lineNumber,n.column),r=t.getOption(2)===2;i.showContentHover(s,1,r)}}class VJ extends he{constructor(){super({id:\"editor.action.showDefinitionPreviewHover\",label:p({key:\"showDefinitionPreviewHover\",comment:[\"Label for action that will trigger the showing of definition preview hover in the editor.\",\"This allows for users to show the definition preview hover without using the mouse.\"]},\"Show Definition Preview Hover\"),alias:\"Show Definition Preview Hover\",precondition:void 0})}run(e,t){const i=vc.get(t);if(!i)return;const n=t.getPosition();if(!n)return;const s=new L(n.lineNumber,n.column,n.lineNumber,n.column),r=Jd.get(t);if(!r)return;r.startFindDefinitionFromCursor(n).then(()=>{i.showContentHover(s,1,!0)})}}rt(vc.ID,vc);te(WJ);te(VJ);xh.register(Pv);xh.register(oD);Rt((o,e)=>{const t=o.getColor($H);t&&e.addRule(`.monaco-editor .hoverHighlight { background-color: ${t}; }`);const i=o.getColor(rg);i&&e.addRule(`.monaco-editor .monaco-hover { background-color: ${i}; }`);const n=o.getColor(XP);n&&(e.addRule(`.monaco-editor .monaco-hover { border: 1px solid ${n}; }`),e.addRule(`.monaco-editor .monaco-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${n.transparent(.5)}; }`),e.addRule(`.monaco-editor .monaco-hover hr { border-top: 1px solid ${n.transparent(.5)}; }`),e.addRule(`.monaco-editor .monaco-hover hr { border-bottom: 0px solid ${n.transparent(.5)}; }`));const s=o.getColor(qC);s&&e.addRule(`.monaco-editor .monaco-hover a { color: ${s}; }`);const r=o.getColor(GC);r&&e.addRule(`.monaco-editor .monaco-hover a:hover { color: ${r}; }`);const a=o.getColor(YP);a&&e.addRule(`.monaco-editor .monaco-hover { color: ${a}; }`);const l=o.getColor(jH);l&&e.addRule(`.monaco-editor .monaco-hover .hover-row .actions { background-color: ${l}; }`);const c=o.getColor(GP);c&&e.addRule(`.monaco-editor .monaco-hover code { background-color: ${c}; }`)});class rD extends z{constructor(e){super(),this._editor=e,this._register(e.onMouseDown(t=>this.onMouseDown(t)))}dispose(){super.dispose()}onMouseDown(e){const t=e.target;if(t.type!==6||!t.detail.injectedText||t.detail.injectedText.options.attachedData!==J5||!t.range)return;const i=this._editor.getContribution(vc.ID);if(!!i&&!i.isColorPickerVisible()){const n=new L(t.range.startLineNumber,t.range.startColumn+1,t.range.endLineNumber,t.range.endColumn+1);i.showContentHover(n,1,!1)}}}rD.ID=\"editor.contrib.colorContribution\";rt(rD.ID,rD);xh.register(kL);var g3=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};function QE(o){return{asString:()=>g3(this,void 0,void 0,function*(){return o}),asFile:()=>{},value:typeof o==\"string\"?o:void 0}}function HJ(o,e,t){return{asString:()=>g3(this,void 0,void 0,function*(){return\"\"}),asFile:()=>({name:o,uri:e,data:t}),value:void 0}}class f3{constructor(){this._entries=new Map}get size(){return this._entries.size}has(e){return this._entries.has(this.toKey(e))}get(e){var t;return(t=this._entries.get(this.toKey(e)))===null||t===void 0?void 0:t[0]}append(e,t){const i=this._entries.get(e);i?i.push(t):this._entries.set(this.toKey(e),[t])}replace(e,t){this._entries.set(this.toKey(e),[t])}delete(e){this._entries.delete(this.toKey(e))}*entries(){for(const[e,t]of this._entries.entries())for(const i of t)yield[e,i]}values(){return Array.from(this._entries.values()).flat()}forEach(e){for(const[t,i]of this.entries())e(i,t)}toKey(e){return e.toLowerCase()}}const p3=function(){if(typeof crypto==\"object\"&&typeof crypto.randomUUID==\"function\")return crypto.randomUUID.bind(crypto);let o;typeof crypto==\"object\"&&typeof crypto.getRandomValues==\"function\"?o=crypto.getRandomValues.bind(crypto):o=function(i){for(let n=0;n<i.length;n++)i[n]=Math.floor(Math.random()*256);return i};const e=new Uint8Array(16),t=[];for(let i=0;i<256;i++)t.push(i.toString(16).padStart(2,\"0\"));return function(){o(e),e[6]=e[6]&15|64,e[8]=e[8]&63|128;let n=0,s=\"\";return s+=t[e[n++]],s+=t[e[n++]],s+=t[e[n++]],s+=t[e[n++]],s+=\"-\",s+=t[e[n++]],s+=t[e[n++]],s+=\"-\",s+=t[e[n++]],s+=t[e[n++]],s+=\"-\",s+=t[e[n++]],s+=t[e[n++]],s+=\"-\",s+=t[e[n++]],s+=t[e[n++]],s+=t[e[n++]],s+=t[e[n++]],s+=t[e[n++]],s+=t[e[n++]],s}}(),Bv={EDITORS:\"CodeEditors\",FILES:\"CodeFiles\"};function zJ(o){var e;const t=[];if(o.dataTransfer&&o.dataTransfer.types.length>0){const i=o.dataTransfer.getData(Bv.EDITORS);if(i)try{t.push(...Ov(i))}catch(r){}else try{const r=o.dataTransfer.getData(i_.RESOURCES);t.push(...UJ(r))}catch(r){}if(!((e=o.dataTransfer)===null||e===void 0)&&e.files)for(let r=0;r<o.dataTransfer.files.length;r++){const a=o.dataTransfer.files[r];if(a&&a.path)try{t.push({resource:me.file(a.path),isExternal:!0,allowWorkspaceOpen:!0})}catch(l){}}const n=o.dataTransfer.getData(Bv.FILES);if(n)try{const r=JSON.parse(n);for(const a of r)t.push({resource:me.file(a),isExternal:!0,allowWorkspaceOpen:!0})}catch(r){}const s=di.as(m3.DragAndDropContribution).getAll();for(const r of s){const a=o.dataTransfer.getData(r.dataFormatKey);if(a)try{t.push(...r.getEditorInputs(a))}catch(l){}}}return t}function UJ(o){const e=[];if(o){const t=JSON.parse(o);for(const i of t)if(i.indexOf(\":\")>0){const{selection:n,uri:s}=Q5(me.parse(i));e.push({resource:s,options:{selection:n}})}}return e}class $J{constructor(){this._contributions=new Map}getAll(){return this._contributions.values()}}const m3={DragAndDropContribution:\"workbench.contributions.dragAndDrop\"};di.add(m3.DragAndDropContribution,new $J);var jJ=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};function aD(o){const e=new f3;for(const t of o.items){const i=t.type;if(t.kind===\"string\"){const n=new Promise(s=>t.getAsString(s));e.append(i,QE(n))}else if(t.kind===\"file\"){const n=t.getAsFile();n&&e.append(i,KJ(n))}}return e}function KJ(o){const e=o.path?me.parse(o.path):void 0;return HJ(o.name,e,()=>jJ(this,void 0,void 0,function*(){return new Uint8Array(yield o.arrayBuffer())}))}const qJ=Object.freeze([Bv.EDITORS,Bv.FILES,i_.RESOURCES]);function GJ(o,e,t=!1){var i;if(e.dataTransfer&&(t||!o.has(Pn.uriList))){const n=zJ(e).filter(s=>s.resource).map(s=>s.resource.toString());for(const s of(i=e.dataTransfer)===null||i===void 0?void 0:i.items){const r=s.getAsFile();r&&n.push(r.path?me.file(r.path).toString():r.name)}n.length&&o.replace(Pn.uriList,QE(JE.create(n)))}for(const n of qJ)o.delete(n)}const JE=Object.freeze({create:o=>el(o.map(e=>e.toString())).join(`\\r\n`),parse:o=>o.split(`\\r\n`).filter(e=>!e.startsWith(\"#\"))});class Pt{static insert(e,t){return{range:new L(e.lineNumber,e.column,e.lineNumber,e.column),text:t,forceMoveMarkers:!0}}static delete(e){return{range:e,text:null}}static replace(e,t){return{range:e,text:t}}static replaceMove(e,t){return{range:e,text:t,forceMoveMarkers:!0}}}const bm=qe(\"contextService\");function QM(o){const e=o;return typeof(e==null?void 0:e.id)==\"string\"&&me.isUri(e.uri)}function ZJ(o){if(o.configuration)return{id:o.id,configPath:o.configuration};if(o.folders.length===1)return{id:o.id,uri:o.folders[0].uri}}class YJ{constructor(e,t){this.raw=t,this.uri=e.uri,this.index=e.index,this.name=e.name}toJSON(){return{uri:this.uri,name:this.name,index:this.index}}}const lD=\"code-workspace\";p(\"codeWorkspace\",\"Code Workspace\");function JM(o,e=nn){return wK(o,e)?o.charAt(0).toUpperCase()+o.slice(1):o}var XJ=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},QJ=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};Object.freeze({CURRENT_YEAR:!0,CURRENT_YEAR_SHORT:!0,CURRENT_MONTH:!0,CURRENT_DATE:!0,CURRENT_HOUR:!0,CURRENT_MINUTE:!0,CURRENT_SECOND:!0,CURRENT_DAY_NAME:!0,CURRENT_DAY_NAME_SHORT:!0,CURRENT_MONTH_NAME:!0,CURRENT_MONTH_NAME_SHORT:!0,CURRENT_SECONDS_UNIX:!0,SELECTION:!0,CLIPBOARD:!0,TM_SELECTED_TEXT:!0,TM_CURRENT_LINE:!0,TM_CURRENT_WORD:!0,TM_LINE_INDEX:!0,TM_LINE_NUMBER:!0,TM_FILENAME:!0,TM_FILENAME_BASE:!0,TM_DIRECTORY:!0,TM_FILEPATH:!0,CURSOR_INDEX:!0,CURSOR_NUMBER:!0,RELATIVE_FILEPATH:!0,BLOCK_COMMENT_START:!0,BLOCK_COMMENT_END:!0,LINE_COMMENT:!0,WORKSPACE_NAME:!0,WORKSPACE_FOLDER:!0,RANDOM:!0,RANDOM_HEX:!0,UUID:!0});class eA{constructor(e){this._delegates=e}resolve(e){for(const t of this._delegates){const i=t.resolve(e);if(i!==void 0)return i}}}class tA{constructor(e,t,i,n){this._model=e,this._selection=t,this._selectionIdx=i,this._overtypingCapturer=n}resolve(e){const{name:t}=e;if(t===\"SELECTION\"||t===\"TM_SELECTED_TEXT\"){let i=this._model.getValueInRange(this._selection)||void 0,n=this._selection.startLineNumber!==this._selection.endLineNumber;if(!i&&this._overtypingCapturer){const s=this._overtypingCapturer.getLastOvertypedInfo(this._selectionIdx);s&&(i=s.value,n=s.multiline)}if(i&&n&&e.snippet){const s=this._model.getLineContent(this._selection.startLineNumber),r=pt(s,0,this._selection.startColumn-1);let a=r;e.snippet.walk(c=>c===e?!1:(c instanceof On&&(a=pt(Ur(c.value).pop())),!0));const l=Pd(a,r);i=i.replace(/(\\r\\n|\\r|\\n)(.*)/g,(c,d,h)=>`${d}${a.substr(l)}${h}`)}return i}else{if(t===\"TM_CURRENT_LINE\")return this._model.getLineContent(this._selection.positionLineNumber);if(t===\"TM_CURRENT_WORD\"){const i=this._model.getWordAtPosition({lineNumber:this._selection.positionLineNumber,column:this._selection.positionColumn});return i&&i.word||void 0}else{if(t===\"TM_LINE_INDEX\")return String(this._selection.positionLineNumber-1);if(t===\"TM_LINE_NUMBER\")return String(this._selection.positionLineNumber);if(t===\"CURSOR_INDEX\")return String(this._selectionIdx);if(t===\"CURSOR_NUMBER\")return String(this._selectionIdx+1)}}}}class iA{constructor(e,t){this._labelService=e,this._model=t}resolve(e){const{name:t}=e;if(t===\"TM_FILENAME\")return pd(this._model.uri.fsPath);if(t===\"TM_FILENAME_BASE\"){const i=pd(this._model.uri.fsPath),n=i.lastIndexOf(\".\");return n<=0?i:i.slice(0,n)}else{if(t===\"TM_DIRECTORY\")return EO(this._model.uri.fsPath)===\".\"?\"\":this._labelService.getUriLabel(a1(this._model.uri));if(t===\"TM_FILEPATH\")return this._labelService.getUriLabel(this._model.uri);if(t===\"RELATIVE_FILEPATH\")return this._labelService.getUriLabel(this._model.uri,{relative:!0,noPrefix:!0})}}}class nA{constructor(e,t,i,n){this._readClipboardText=e,this._selectionIdx=t,this._selectionCount=i,this._spread=n}resolve(e){if(e.name!==\"CLIPBOARD\")return;const t=this._readClipboardText();if(!!t){if(this._spread){const i=t.split(/\\r\\n|\\n|\\r/).filter(n=>!KO(n));if(i.length===this._selectionCount)return i[this._selectionIdx]}return t}}}let Wv=class{constructor(e,t,i){this._model=e,this._selection=t,this._languageConfigurationService=i}resolve(e){const{name:t}=e,i=this._model.getLanguageIdAtPosition(this._selection.selectionStartLineNumber,this._selection.selectionStartColumn),n=this._languageConfigurationService.getLanguageConfiguration(i).comments;if(!!n){if(t===\"LINE_COMMENT\")return n.lineCommentToken||void 0;if(t===\"BLOCK_COMMENT_START\")return n.blockCommentStartToken||void 0;if(t===\"BLOCK_COMMENT_END\")return n.blockCommentEndToken||void 0}}};Wv=XJ([QJ(2,ti)],Wv);class Vo{constructor(){this._date=new Date}resolve(e){const{name:t}=e;if(t===\"CURRENT_YEAR\")return String(this._date.getFullYear());if(t===\"CURRENT_YEAR_SHORT\")return String(this._date.getFullYear()).slice(-2);if(t===\"CURRENT_MONTH\")return String(this._date.getMonth().valueOf()+1).padStart(2,\"0\");if(t===\"CURRENT_DATE\")return String(this._date.getDate().valueOf()).padStart(2,\"0\");if(t===\"CURRENT_HOUR\")return String(this._date.getHours().valueOf()).padStart(2,\"0\");if(t===\"CURRENT_MINUTE\")return String(this._date.getMinutes().valueOf()).padStart(2,\"0\");if(t===\"CURRENT_SECOND\")return String(this._date.getSeconds().valueOf()).padStart(2,\"0\");if(t===\"CURRENT_DAY_NAME\")return Vo.dayNames[this._date.getDay()];if(t===\"CURRENT_DAY_NAME_SHORT\")return Vo.dayNamesShort[this._date.getDay()];if(t===\"CURRENT_MONTH_NAME\")return Vo.monthNames[this._date.getMonth()];if(t===\"CURRENT_MONTH_NAME_SHORT\")return Vo.monthNamesShort[this._date.getMonth()];if(t===\"CURRENT_SECONDS_UNIX\")return String(Math.floor(this._date.getTime()/1e3))}}Vo.dayNames=[p(\"Sunday\",\"Sunday\"),p(\"Monday\",\"Monday\"),p(\"Tuesday\",\"Tuesday\"),p(\"Wednesday\",\"Wednesday\"),p(\"Thursday\",\"Thursday\"),p(\"Friday\",\"Friday\"),p(\"Saturday\",\"Saturday\")];Vo.dayNamesShort=[p(\"SundayShort\",\"Sun\"),p(\"MondayShort\",\"Mon\"),p(\"TuesdayShort\",\"Tue\"),p(\"WednesdayShort\",\"Wed\"),p(\"ThursdayShort\",\"Thu\"),p(\"FridayShort\",\"Fri\"),p(\"SaturdayShort\",\"Sat\")];Vo.monthNames=[p(\"January\",\"January\"),p(\"February\",\"February\"),p(\"March\",\"March\"),p(\"April\",\"April\"),p(\"May\",\"May\"),p(\"June\",\"June\"),p(\"July\",\"July\"),p(\"August\",\"August\"),p(\"September\",\"September\"),p(\"October\",\"October\"),p(\"November\",\"November\"),p(\"December\",\"December\")];Vo.monthNamesShort=[p(\"JanuaryShort\",\"Jan\"),p(\"FebruaryShort\",\"Feb\"),p(\"MarchShort\",\"Mar\"),p(\"AprilShort\",\"Apr\"),p(\"MayShort\",\"May\"),p(\"JuneShort\",\"Jun\"),p(\"JulyShort\",\"Jul\"),p(\"AugustShort\",\"Aug\"),p(\"SeptemberShort\",\"Sep\"),p(\"OctoberShort\",\"Oct\"),p(\"NovemberShort\",\"Nov\"),p(\"DecemberShort\",\"Dec\")];class sA{constructor(e){this._workspaceService=e}resolve(e){if(!this._workspaceService)return;const t=ZJ(this._workspaceService.getWorkspace());if(!!t){if(e.name===\"WORKSPACE_NAME\")return this._resolveWorkspaceName(t);if(e.name===\"WORKSPACE_FOLDER\")return this._resoveWorkspacePath(t)}}_resolveWorkspaceName(e){if(QM(e))return pd(e.uri.path);let t=pd(e.configPath.path);return t.endsWith(lD)&&(t=t.substr(0,t.length-lD.length-1)),t}_resoveWorkspacePath(e){if(QM(e))return JM(e.uri.fsPath);const t=pd(e.configPath.path);let i=e.configPath.fsPath;return i.endsWith(t)&&(i=i.substr(0,i.length-t.length-1)),i?JM(i):\"/\"}}class oA{resolve(e){const{name:t}=e;if(t===\"RANDOM\")return Math.random().toString().slice(-6);if(t===\"RANDOM_HEX\")return Math.random().toString(16).slice(-6);if(t===\"UUID\")return p3()}}var JJ=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},eee=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};class As{constructor(e,t,i){this._editor=e,this._snippet=t,this._snippetLineLeadingWhitespace=i,this._offset=-1,this._nestingLevel=1,this._placeholderGroups=bT(t.placeholders,lo.compareByIndex),this._placeholderGroupsIdx=-1}initialize(e){this._offset=e.newPosition}dispose(){this._placeholderDecorations&&this._editor.removeDecorations([...this._placeholderDecorations.values()]),this._placeholderGroups.length=0}_initDecorations(){if(this._offset===-1)throw new Error(\"Snippet not initialized!\");if(this._placeholderDecorations)return;this._placeholderDecorations=new Map;const e=this._editor.getModel();this._editor.changeDecorations(t=>{for(const i of this._snippet.placeholders){const n=this._snippet.offset(i),s=this._snippet.fullLen(i),r=L.fromPositions(e.getPositionAt(this._offset+n),e.getPositionAt(this._offset+n+s)),a=i.isFinalTabstop?As._decor.inactiveFinal:As._decor.inactive,l=t.addDecoration(r,a);this._placeholderDecorations.set(i,l)}})}move(e){if(!this._editor.hasModel())return[];if(this._initDecorations(),this._placeholderGroupsIdx>=0){const n=[];for(const s of this._placeholderGroups[this._placeholderGroupsIdx])if(s.transform){const r=this._placeholderDecorations.get(s),a=this._editor.getModel().getDecorationRange(r),l=this._editor.getModel().getValueInRange(a),c=s.transform.resolve(l).split(/\\r\\n|\\r|\\n/);for(let d=1;d<c.length;d++)c[d]=this._editor.getModel().normalizeIndentation(this._snippetLineLeadingWhitespace+c[d]);n.push(Pt.replace(a,c.join(this._editor.getModel().getEOL())))}n.length>0&&this._editor.executeEdits(\"snippet.placeholderTransform\",n)}let t=!1;e===!0&&this._placeholderGroupsIdx<this._placeholderGroups.length-1?(this._placeholderGroupsIdx+=1,t=!0):e===!1&&this._placeholderGroupsIdx>0&&(this._placeholderGroupsIdx-=1,t=!0);const i=this._editor.getModel().changeDecorations(n=>{const s=new Set,r=[];for(const a of this._placeholderGroups[this._placeholderGroupsIdx]){const l=this._placeholderDecorations.get(a),c=this._editor.getModel().getDecorationRange(l);r.push(new oe(c.startLineNumber,c.startColumn,c.endLineNumber,c.endColumn)),t=t&&this._hasPlaceholderBeenCollapsed(a),n.changeDecorationOptions(l,a.isFinalTabstop?As._decor.activeFinal:As._decor.active),s.add(a);for(const d of this._snippet.enclosingPlaceholders(a)){const h=this._placeholderDecorations.get(d);n.changeDecorationOptions(h,d.isFinalTabstop?As._decor.activeFinal:As._decor.active),s.add(d)}}for(const[a,l]of this._placeholderDecorations)s.has(a)||n.changeDecorationOptions(l,a.isFinalTabstop?As._decor.inactiveFinal:As._decor.inactive);return r});return t?this.move(e):i!=null?i:[]}_hasPlaceholderBeenCollapsed(e){let t=e;for(;t;){if(t instanceof lo){const i=this._placeholderDecorations.get(t);if(this._editor.getModel().getDecorationRange(i).isEmpty()&&t.toString().length>0)return!0}t=t.parent}return!1}get isAtFirstPlaceholder(){return this._placeholderGroupsIdx<=0||this._placeholderGroups.length===0}get isAtLastPlaceholder(){return this._placeholderGroupsIdx===this._placeholderGroups.length-1}get hasPlaceholder(){return this._snippet.placeholders.length>0}get isTrivialSnippet(){return this._snippet.placeholders.length===0||this._snippet.placeholders.length===1&&this._snippet.placeholders[0].isFinalTabstop}computePossibleSelections(){const e=new Map;for(const t of this._placeholderGroups){let i;for(const n of t){if(n.isFinalTabstop)break;i||(i=[],e.set(n.index,i));const s=this._placeholderDecorations.get(n),r=this._editor.getModel().getDecorationRange(s);if(!r){e.delete(n.index);break}i.push(r)}}return e}get activeChoice(){if(!this._placeholderDecorations)return;const e=this._placeholderGroups[this._placeholderGroupsIdx][0];if(!(e!=null&&e.choice))return;const t=this._placeholderDecorations.get(e);if(!t)return;const i=this._editor.getModel().getDecorationRange(t);if(!!i)return{range:i,choice:e.choice}}get hasChoice(){let e=!1;return this._snippet.walk(t=>(e=t instanceof Gg,!e)),e}merge(e){const t=this._editor.getModel();this._nestingLevel*=10,this._editor.changeDecorations(i=>{for(const n of this._placeholderGroups[this._placeholderGroupsIdx]){const s=e.shift();console.assert(s._offset!==-1),console.assert(!s._placeholderDecorations);const r=s._snippet.placeholderInfo.last.index;for(const l of s._snippet.placeholderInfo.all)l.isFinalTabstop?l.index=n.index+(r+1)/this._nestingLevel:l.index=n.index+l.index/this._nestingLevel;this._snippet.replace(n,s._snippet.children);const a=this._placeholderDecorations.get(n);i.removeDecoration(a),this._placeholderDecorations.delete(n);for(const l of s._snippet.placeholders){const c=s._snippet.offset(l),d=s._snippet.fullLen(l),h=L.fromPositions(t.getPositionAt(s._offset+c),t.getPositionAt(s._offset+c+d)),u=i.addDecoration(h,As._decor.inactive);this._placeholderDecorations.set(l,u)}}this._placeholderGroups=bT(this._snippet.placeholders,lo.compareByIndex)})}}As._decor={active:Ie.register({description:\"snippet-placeholder-1\",stickiness:0,className:\"snippet-placeholder\"}),inactive:Ie.register({description:\"snippet-placeholder-2\",stickiness:1,className:\"snippet-placeholder\"}),activeFinal:Ie.register({description:\"snippet-placeholder-3\",stickiness:1,className:\"finish-snippet-placeholder\"}),inactiveFinal:Ie.register({description:\"snippet-placeholder-4\",stickiness:1,className:\"finish-snippet-placeholder\"})};const rA={overwriteBefore:0,overwriteAfter:0,adjustWhitespace:!0,clipboardText:void 0,overtypingCapturer:void 0};let Vv=class _a{constructor(e,t,i=rA,n){this._editor=e,this._template=t,this._options=i,this._languageConfigurationService=n,this._templateMerges=[],this._snippets=[]}static adjustWhitespace(e,t,i,n,s){const r=e.getLineContent(t.lineNumber),a=pt(r,0,t.column-1);let l;return i.walk(c=>{if(!(c instanceof On)||c.parent instanceof Gg)return!0;const d=c.value.split(/\\r\\n|\\r|\\n/);if(n){const u=i.offset(c);if(u===0)d[0]=e.normalizeIndentation(d[0]);else{l=l!=null?l:i.toString();const g=l.charCodeAt(u-1);(g===10||g===13)&&(d[0]=e.normalizeIndentation(a+d[0]))}for(let g=1;g<d.length;g++)d[g]=e.normalizeIndentation(a+d[g])}const h=d.join(e.getEOL());return h!==c.value&&(c.parent.replace(c,[new On(h)]),l=void 0),!0}),a}static adjustSelection(e,t,i,n){if(i!==0||n!==0){const{positionLineNumber:s,positionColumn:r}=t,a=r-i,l=r+n,c=e.validateRange({startLineNumber:s,startColumn:a,endLineNumber:s,endColumn:l});t=oe.createWithDirection(c.startLineNumber,c.startColumn,c.endLineNumber,c.endColumn,t.getDirection())}return t}static createEditsAndSnippetsFromSelections(e,t,i,n,s,r,a,l,c){const d=[],h=[];if(!e.hasModel())return{edits:d,snippets:h};const u=e.getModel(),g=e.invokeWithinContext(S=>S.get(bm)),f=e.invokeWithinContext(S=>new iA(S.get(bg),u)),_=()=>a,b=u.getValueInRange(_a.adjustSelection(u,e.getSelection(),i,0)),v=u.getValueInRange(_a.adjustSelection(u,e.getSelection(),0,n)),C=u.getLineFirstNonWhitespaceColumn(e.getSelection().positionLineNumber),w=e.getSelections().map((S,k)=>({selection:S,idx:k})).sort((S,k)=>L.compareRangesUsingStarts(S.selection,k.selection));for(const{selection:S,idx:k}of w){let x=_a.adjustSelection(u,S,i,0),y=_a.adjustSelection(u,S,0,n);b!==u.getValueInRange(x)&&(x=S),v!==u.getValueInRange(y)&&(y=S);const D=S.setStartPosition(x.startLineNumber,x.startColumn).setEndPosition(y.endLineNumber,y.endColumn),I=new _c().parse(t,!0,s),R=D.getStartPosition(),P=_a.adjustWhitespace(u,R,I,r||k>0&&C!==u.getLineFirstNonWhitespaceColumn(S.positionLineNumber),!0);I.resolveVariables(new eA([f,new nA(_,k,w.length,e.getOption(73)===\"spread\"),new tA(u,S,k,l),new Wv(u,S,c),new Vo,new sA(g),new oA])),d[k]=Pt.replace(D,I.toString()),d[k].identifier={major:k,minor:0},d[k]._isTracked=!0,h[k]=new As(e,I,P)}return{edits:d,snippets:h}}static createEditsAndSnippetsFromEdits(e,t,i,n,s,r,a){if(!e.hasModel()||t.length===0)return{edits:[],snippets:[]};const l=[],c=e.getModel(),d=new _c,h=new __,u=new eA([e.invokeWithinContext(f=>new iA(f.get(bg),c)),new nA(()=>s,0,e.getSelections().length,e.getOption(73)===\"spread\"),new tA(c,e.getSelection(),0,r),new Wv(c,e.getSelection(),a),new Vo,new sA(e.invokeWithinContext(f=>f.get(bm))),new oA]);t=t.sort((f,_)=>L.compareRangesUsingStarts(f.range,_.range));let g=0;for(let f=0;f<t.length;f++){const{range:_,template:b}=t[f];if(f>0){const S=t[f-1].range,k=L.fromPositions(S.getEndPosition(),_.getStartPosition()),x=new On(c.getValueInRange(k));h.appendChild(x),g+=x.value.length}d.parseFragment(b,h),h.resolveVariables(u);const v=h.toString(),C=v.slice(g);g=v.length;const w=Pt.replace(_,C);w.identifier={major:f,minor:0},w._isTracked=!0,l.push(w)}return d.ensureFinalTabstop(h,i,!0),{edits:l,snippets:[new As(e,h,\"\")]}}dispose(){et(this._snippets)}_logInfo(){return`template=\"${this._template}\", merged_templates=\"${this._templateMerges.join(\" -> \")}\"`}insert(){if(!this._editor.hasModel())return;const{edits:e,snippets:t}=typeof this._template==\"string\"?_a.createEditsAndSnippetsFromSelections(this._editor,this._template,this._options.overwriteBefore,this._options.overwriteAfter,!1,this._options.adjustWhitespace,this._options.clipboardText,this._options.overtypingCapturer,this._languageConfigurationService):_a.createEditsAndSnippetsFromEdits(this._editor,this._template,!1,this._options.adjustWhitespace,this._options.clipboardText,this._options.overtypingCapturer,this._languageConfigurationService);this._snippets=t,this._editor.executeEdits(\"snippet\",e,i=>{const n=i.filter(s=>!!s.identifier);for(let s=0;s<t.length;s++)t[s].initialize(n[s].textChange);return this._snippets[0].hasPlaceholder?this._move(!0):n.map(s=>oe.fromPositions(s.range.getEndPosition()))}),this._editor.revealRange(this._editor.getSelections()[0])}merge(e,t=rA){if(!this._editor.hasModel())return;this._templateMerges.push([this._snippets[0]._nestingLevel,this._snippets[0]._placeholderGroupsIdx,e]);const{edits:i,snippets:n}=_a.createEditsAndSnippetsFromSelections(this._editor,e,t.overwriteBefore,t.overwriteAfter,!0,t.adjustWhitespace,t.clipboardText,t.overtypingCapturer,this._languageConfigurationService);this._editor.executeEdits(\"snippet\",i,s=>{const r=s.filter(l=>!!l.identifier);for(let l=0;l<n.length;l++)n[l].initialize(r[l].textChange);const a=n[0].isTrivialSnippet;if(!a){for(const l of this._snippets)l.merge(n);console.assert(n.length===0)}return this._snippets[0].hasPlaceholder&&!a?this._move(void 0):r.map(l=>oe.fromPositions(l.range.getEndPosition()))})}next(){const e=this._move(!0);this._editor.setSelections(e),this._editor.revealPositionInCenterIfOutsideViewport(e[0].getPosition())}prev(){const e=this._move(!1);this._editor.setSelections(e),this._editor.revealPositionInCenterIfOutsideViewport(e[0].getPosition())}_move(e){const t=[];for(const i of this._snippets){const n=i.move(e);t.push(...n)}return t}get isAtFirstPlaceholder(){return this._snippets[0].isAtFirstPlaceholder}get isAtLastPlaceholder(){return this._snippets[0].isAtLastPlaceholder}get hasPlaceholder(){return this._snippets[0].hasPlaceholder}get hasChoice(){return this._snippets[0].hasChoice}get activeChoice(){return this._snippets[0].activeChoice}isSelectionWithinPlaceholders(){if(!this.hasPlaceholder)return!1;const e=this._editor.getSelections();if(e.length<this._snippets.length)return!1;const t=new Map;for(const i of this._snippets){const n=i.computePossibleSelections();if(t.size===0)for(const[s,r]of n){r.sort(L.compareRangesUsingStarts);for(const a of e)if(r[0].containsRange(a)){t.set(s,[]);break}}if(t.size===0)return!1;t.forEach((s,r)=>{s.push(...n.get(r))})}e.sort(L.compareRangesUsingStarts);for(const[i,n]of t){if(n.length!==e.length){t.delete(i);continue}n.sort(L.compareRangesUsingStarts);for(let s=0;s<n.length;s++)if(!n[s].containsRange(e[s])){t.delete(i);continue}}return t.size>0}};Vv=JJ([eee(3,ti)],Vv);var tee=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Cb=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const wb={overwriteBefore:0,overwriteAfter:0,undoStopBefore:!0,undoStopAfter:!0,adjustWhitespace:!0,clipboardText:void 0,overtypingCapturer:void 0};let Mi=class Kf{constructor(e,t,i,n,s){this._editor=e,this._logService=t,this._languageFeaturesService=i,this._languageConfigurationService=s,this._snippetListener=new ee,this._modelVersionId=-1,this._inSnippet=Kf.InSnippetMode.bindTo(n),this._hasNextTabstop=Kf.HasNextTabstop.bindTo(n),this._hasPrevTabstop=Kf.HasPrevTabstop.bindTo(n)}static get(e){return e.getContribution(Kf.ID)}dispose(){var e;this._inSnippet.reset(),this._hasPrevTabstop.reset(),this._hasNextTabstop.reset(),(e=this._session)===null||e===void 0||e.dispose(),this._snippetListener.dispose()}apply(e,t){try{this._doInsert(e,typeof t==\"undefined\"?wb:Object.assign(Object.assign({},wb),t))}catch(i){this.cancel(),this._logService.error(i),this._logService.error(\"snippet_error\"),this._logService.error(\"insert_edits=\",e),this._logService.error(\"existing_template=\",this._session?this._session._logInfo():\"<no_session>\")}}insert(e,t){try{this._doInsert(e,typeof t==\"undefined\"?wb:Object.assign(Object.assign({},wb),t))}catch(i){this.cancel(),this._logService.error(i),this._logService.error(\"snippet_error\"),this._logService.error(\"insert_template=\",e),this._logService.error(\"existing_template=\",this._session?this._session._logInfo():\"<no_session>\")}}_doInsert(e,t){var i;if(!!this._editor.hasModel()){if(this._snippetListener.clear(),t.undoStopBefore&&this._editor.getModel().pushStackElement(),this._session&&typeof e!=\"string\"&&this.cancel(),this._session?(gt(typeof e==\"string\"),this._session.merge(e,t)):(this._modelVersionId=this._editor.getModel().getAlternativeVersionId(),this._session=new Vv(this._editor,e,t,this._languageConfigurationService),this._session.insert()),t.undoStopAfter&&this._editor.getModel().pushStackElement(),!((i=this._session)===null||i===void 0)&&i.hasChoice){this._choiceCompletionItemProvider={provideCompletionItems:(s,r)=>{if(!this._session||s!==this._editor.getModel()||!B.equals(this._editor.getPosition(),r))return;const{activeChoice:a}=this._session;if(!a||a.choice.options.length===0)return;const l=s.getValueInRange(a.range),c=Boolean(a.choice.options.find(h=>h.value===l)),d=[];for(let h=0;h<a.choice.options.length;h++){const u=a.choice.options[h];d.push({kind:13,label:u.value,insertText:u.value,sortText:\"a\".repeat(h+1),range:a.range,filterText:c?`${l}_${u.value}`:void 0,command:{id:\"jumpToNextSnippetPlaceholder\",title:p(\"next\",\"Go to next placeholder...\")}})}return{suggestions:d}}};const n=this._languageFeaturesService.completionProvider.register({language:this._editor.getModel().getLanguageId(),pattern:this._editor.getModel().uri.fsPath,scheme:this._editor.getModel().uri.scheme},this._choiceCompletionItemProvider);this._snippetListener.add(n)}this._updateState(),this._snippetListener.add(this._editor.onDidChangeModelContent(n=>n.isFlush&&this.cancel())),this._snippetListener.add(this._editor.onDidChangeModel(()=>this.cancel())),this._snippetListener.add(this._editor.onDidChangeCursorSelection(()=>this._updateState()))}}_updateState(){if(!(!this._session||!this._editor.hasModel())){if(this._modelVersionId===this._editor.getModel().getAlternativeVersionId())return this.cancel();if(!this._session.hasPlaceholder)return this.cancel();if(this._session.isAtLastPlaceholder||!this._session.isSelectionWithinPlaceholders())return this._editor.getModel().pushStackElement(),this.cancel();this._inSnippet.set(!0),this._hasPrevTabstop.set(!this._session.isAtFirstPlaceholder),this._hasNextTabstop.set(!this._session.isAtLastPlaceholder),this._handleChoice()}}_handleChoice(){if(!this._session||!this._editor.hasModel()){this._currentChoice=void 0;return}const{activeChoice:e}=this._session;if(!e||!this._choiceCompletionItemProvider){this._currentChoice=void 0;return}this._currentChoice!==e.choice&&(this._currentChoice=e.choice,queueMicrotask(()=>{gJ(this._editor,this._choiceCompletionItemProvider)}))}finish(){for(;this._inSnippet.get();)this.next()}cancel(e=!1){var t;this._inSnippet.reset(),this._hasPrevTabstop.reset(),this._hasNextTabstop.reset(),this._snippetListener.clear(),this._currentChoice=void 0,(t=this._session)===null||t===void 0||t.dispose(),this._session=void 0,this._modelVersionId=-1,e&&this._editor.setSelections([this._editor.getSelection()])}prev(){this._session&&this._session.prev(),this._updateState()}next(){this._session&&this._session.next(),this._updateState()}isInSnippet(){return Boolean(this._inSnippet.get())}};Mi.ID=\"snippetController2\";Mi.InSnippetMode=new ce(\"inSnippetMode\",!1,p(\"inSnippetMode\",\"Whether the editor in current in snippet mode\"));Mi.HasNextTabstop=new ce(\"hasNextTabstop\",!1,p(\"hasNextTabstop\",\"Whether there is a next tab stop when in snippet mode\"));Mi.HasPrevTabstop=new ce(\"hasPrevTabstop\",!1,p(\"hasPrevTabstop\",\"Whether there is a previous tab stop when in snippet mode\"));Mi=tee([Cb(1,Co),Cb(2,ue),Cb(3,xe),Cb(4,ti)],Mi);rt(Mi.ID,Mi);const R1=ji.bindToContribution(Mi.get);Q(new R1({id:\"jumpToNextSnippetPlaceholder\",precondition:re.and(Mi.InSnippetMode,Mi.HasNextTabstop),handler:o=>o.next(),kbOpts:{weight:100+30,kbExpr:T.editorTextFocus,primary:2}}));Q(new R1({id:\"jumpToPrevSnippetPlaceholder\",precondition:re.and(Mi.InSnippetMode,Mi.HasPrevTabstop),handler:o=>o.prev(),kbOpts:{weight:100+30,kbExpr:T.editorTextFocus,primary:1026}}));Q(new R1({id:\"leaveSnippet\",precondition:Mi.InSnippetMode,handler:o=>o.cancel(!0),kbOpts:{weight:100+30,kbExpr:T.editorTextFocus,primary:9,secondary:[1033]}}));Q(new R1({id:\"acceptSnippet\",precondition:Mi.InSnippetMode,handler:o=>o.finish()}));function _3(o,e,t){const i=Mi.get(o);return i?(o.focus(),i.apply(t.map(n=>({range:oe.liftSelection(n),template:e}))),i.isInSnippet()):!1}var iee=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Sb=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},aA=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const BS=\"application/vnd.code.copyMetadata\";let vm=class extends z{constructor(e,t,i,n,s){super(),this._bulkEditService=t,this._clipboardService=i,this._configurationService=n,this._languageFeaturesService=s,this._editor=e;const r=e.getContainerDomNode();this._register(q(r,\"copy\",a=>this.handleCopy(a))),this._register(q(r,\"cut\",a=>this.handleCopy(a))),this._register(q(r,\"paste\",a=>this.handlePaste(a),!0))}arePasteActionsEnabled(e){return this._configurationService.getValue(\"editor.experimental.pasteActions.enabled\",{resource:e.uri})}handleCopy(e){var t;if(!e.clipboardData||!this._editor.hasTextFocus())return;const i=this._editor.getModel(),n=this._editor.getSelections();if(!i||!(n!=null&&n.length)||!this.arePasteActionsEnabled(i))return;const s=[...n],r=n[0],a=r.isEmpty();if(a){if(!this._editor.getOption(33))return;s[0]=new L(r.startLineNumber,0,r.startLineNumber,i.getLineLength(r.startLineNumber))}const l=this._languageFeaturesService.documentPasteEditProvider.ordered(i).filter(u=>!!u.prepareDocumentPaste);if(!l.length){this.setCopyMetadata(e.clipboardData,{wasFromEmptySelection:a});return}const c=aD(e.clipboardData),d=p3();this.setCopyMetadata(e.clipboardData,{id:d,wasFromEmptySelection:a});const h=Ti(u=>aA(this,void 0,void 0,function*(){const g=yield Promise.all(l.map(f=>f.prepareDocumentPaste(i,s,c,u)));for(const f of g)f==null||f.forEach((_,b)=>{c.replace(b,_)});return c}));(t=this._currentClipboardItem)===null||t===void 0||t.dataTransferPromise.cancel(),this._currentClipboardItem={handle:d,dataTransferPromise:h}}setCopyMetadata(e,t){e.setData(BS,JSON.stringify(t))}handlePaste(e){var t,i,n;return aA(this,void 0,void 0,function*(){if(!e.clipboardData||!this._editor.hasTextFocus())return;const s=this._editor.getSelections();if(!(s!=null&&s.length)||!this._editor.hasModel())return;const r=this._editor.getModel();if(!this.arePasteActionsEnabled(r))return;let a;const l=(t=e.clipboardData)===null||t===void 0?void 0:t.getData(BS);l&&typeof l==\"string\"&&(a=JSON.parse(l));const c=this._languageFeaturesService.documentPasteEditProvider.ordered(r);if(!c.length)return;e.preventDefault(),e.stopImmediatePropagation();const d=r.getVersionId(),h=new Kd(this._editor,3);try{const u=aD(e.clipboardData);if((a==null?void 0:a.id)&&((i=this._currentClipboardItem)===null||i===void 0?void 0:i.handle)===a.id&&(yield this._currentClipboardItem.dataTransferPromise).forEach((b,v)=>{u.replace(v,b)}),!u.has(Pn.uriList)){const _=yield this._clipboardService.readResources();_.length&&u.append(Pn.uriList,QE(JE.create(_)))}u.delete(BS);for(const _ of c){if(!_.pasteMimeTypes.some(v=>v.toLowerCase()===i_.FILES.toLowerCase()?[...u.values()].some(C=>C.asFile()):u.has(v)))continue;const b=yield _.provideDocumentPasteEdits(r,s,u,h.token);if(d!==r.getVersionId())return;if(b){_3(this._editor,typeof b.insertText==\"string\"?_c.escape(b.insertText):b.insertText.snippet,s),b.additionalEdit&&(yield this._bulkEditService.apply($g.convert(b.additionalEdit),{editor:this._editor}));return}}const g=(n=u.get(Pn.text))!==null&&n!==void 0?n:u.get(\"text\");if(!g)return;const f=yield g.asString();if(d!==r.getVersionId())return;this._editor.trigger(\"keyboard\",\"paste\",{text:f,pasteOnNewLine:a==null?void 0:a.wasFromEmptySelection,multicursorText:null})}finally{h.dispose()}})}};vm.ID=\"editor.contrib.copyPasteActionController\";vm=iee([Sb(1,n_),Sb(2,dl),Sb(3,ot),Sb(4,ue)],vm);rt(vm.ID,vm);di.as(al.Configuration).registerConfiguration(Object.assign(Object.assign({},mE),{properties:{\"editor.experimental.pasteActions.enabled\":{type:\"boolean\",scope:5,description:p(\"pasteActions\",\"Enable/disable running edits from extensions on paste.\"),default:!1}}}));class Vl{constructor(e,t,i){this.languageConfigurationService=i,this._selection=e,this._insertSpace=t,this._usedEndToken=null}static _haystackHasNeedleAtOffset(e,t,i){if(i<0)return!1;const n=t.length,s=e.length;if(i+n>s)return!1;for(let r=0;r<n;r++){const a=e.charCodeAt(i+r),l=t.charCodeAt(r);if(a!==l&&!(a>=65&&a<=90&&a+32===l)&&!(l>=65&&l<=90&&l+32===a))return!1}return!0}_createOperationsForBlockComment(e,t,i,n,s,r){const a=e.startLineNumber,l=e.startColumn,c=e.endLineNumber,d=e.endColumn,h=s.getLineContent(a),u=s.getLineContent(c);let g=h.lastIndexOf(t,l-1+t.length),f=u.indexOf(i,d-1-i.length);if(g!==-1&&f!==-1)if(a===c)h.substring(g+t.length,f).indexOf(i)>=0&&(g=-1,f=-1);else{const b=h.substring(g+t.length),v=u.substring(0,f);(b.indexOf(i)>=0||v.indexOf(i)>=0)&&(g=-1,f=-1)}let _;g!==-1&&f!==-1?(n&&g+t.length<h.length&&h.charCodeAt(g+t.length)===32&&(t=t+\" \"),n&&f>0&&u.charCodeAt(f-1)===32&&(i=\" \"+i,f-=1),_=Vl._createRemoveBlockCommentOperations(new L(a,g+t.length+1,c,f+1),t,i)):(_=Vl._createAddBlockCommentOperations(e,t,i,this._insertSpace),this._usedEndToken=_.length===1?i:null);for(const b of _)r.addTrackedEditOperation(b.range,b.text)}static _createRemoveBlockCommentOperations(e,t,i){const n=[];return L.isEmpty(e)?n.push(Pt.delete(new L(e.startLineNumber,e.startColumn-t.length,e.endLineNumber,e.endColumn+i.length))):(n.push(Pt.delete(new L(e.startLineNumber,e.startColumn-t.length,e.startLineNumber,e.startColumn))),n.push(Pt.delete(new L(e.endLineNumber,e.endColumn,e.endLineNumber,e.endColumn+i.length)))),n}static _createAddBlockCommentOperations(e,t,i,n){const s=[];return L.isEmpty(e)?s.push(Pt.replace(new L(e.startLineNumber,e.startColumn,e.endLineNumber,e.endColumn),t+\"  \"+i)):(s.push(Pt.insert(new B(e.startLineNumber,e.startColumn),t+(n?\" \":\"\"))),s.push(Pt.insert(new B(e.endLineNumber,e.endColumn),(n?\" \":\"\")+i))),s}getEditOperations(e,t){const i=this._selection.startLineNumber,n=this._selection.startColumn;e.tokenization.tokenizeIfCheap(i);const s=e.getLanguageIdAtPosition(i,n),r=this.languageConfigurationService.getLanguageConfiguration(s).comments;!r||!r.blockCommentStartToken||!r.blockCommentEndToken||this._createOperationsForBlockComment(this._selection,r.blockCommentStartToken,r.blockCommentEndToken,this._insertSpace,e,t)}computeCursorState(e,t){const i=t.getInverseEditOperations();if(i.length===2){const n=i[0],s=i[1];return new oe(n.range.endLineNumber,n.range.endColumn,s.range.startLineNumber,s.range.startColumn)}else{const n=i[0].range,s=this._usedEndToken?-this._usedEndToken.length-1:0;return new oe(n.endLineNumber,n.endColumn+s,n.endLineNumber,n.endColumn+s)}}}class Sa{constructor(e,t,i,n,s,r,a){this.languageConfigurationService=e,this._selection=t,this._tabSize=i,this._type=n,this._insertSpace=s,this._selectionId=null,this._deltaColumn=0,this._moveEndPositionDown=!1,this._ignoreEmptyLines=r,this._ignoreFirstLine=a||!1}static _gatherPreflightCommentStrings(e,t,i,n){e.tokenization.tokenizeIfCheap(t);const s=e.getLanguageIdAtPosition(t,1),r=n.getLanguageConfiguration(s).comments,a=r?r.lineCommentToken:null;if(!a)return null;const l=[];for(let c=0,d=i-t+1;c<d;c++)l[c]={ignore:!1,commentStr:a,commentStrOffset:0,commentStrLength:a.length};return l}static _analyzeLines(e,t,i,n,s,r,a,l){let c=!0,d;e===0?d=!0:e===1?d=!1:d=!0;for(let h=0,u=n.length;h<u;h++){const g=n[h],f=s+h;if(f===s&&a){g.ignore=!0;continue}const _=i.getLineContent(f),b=Sn(_);if(b===-1){g.ignore=r,g.commentStrOffset=_.length;continue}if(c=!1,g.ignore=!1,g.commentStrOffset=b,d&&!Vl._haystackHasNeedleAtOffset(_,g.commentStr,b)&&(e===0?d=!1:e===1||(g.ignore=!0)),d&&t){const v=b+g.commentStrLength;v<_.length&&_.charCodeAt(v)===32&&(g.commentStrLength+=1)}}if(e===0&&c){d=!1;for(let h=0,u=n.length;h<u;h++)n[h].ignore=!1}return{supported:!0,shouldRemoveComments:d,lines:n}}static _gatherPreflightData(e,t,i,n,s,r,a,l){const c=Sa._gatherPreflightCommentStrings(i,n,s,l);return c===null?{supported:!1}:Sa._analyzeLines(e,t,i,c,n,r,a,l)}_executeLineComments(e,t,i,n){let s;i.shouldRemoveComments?s=Sa._createRemoveLineCommentsOperations(i.lines,n.startLineNumber):(Sa._normalizeInsertionPoint(e,i.lines,n.startLineNumber,this._tabSize),s=this._createAddLineCommentsOperations(i.lines,n.startLineNumber));const r=new B(n.positionLineNumber,n.positionColumn);for(let a=0,l=s.length;a<l;a++)t.addEditOperation(s[a].range,s[a].text),L.isEmpty(s[a].range)&&L.getStartPosition(s[a].range).equals(r)&&e.getLineContent(r.lineNumber).length+1===r.column&&(this._deltaColumn=(s[a].text||\"\").length);this._selectionId=t.trackSelection(n)}_attemptRemoveBlockComment(e,t,i,n){let s=t.startLineNumber,r=t.endLineNumber;const a=n.length+Math.max(e.getLineFirstNonWhitespaceColumn(t.startLineNumber),t.startColumn);let l=e.getLineContent(s).lastIndexOf(i,a-1),c=e.getLineContent(r).indexOf(n,t.endColumn-1-i.length);return l!==-1&&c===-1&&(c=e.getLineContent(s).indexOf(n,l+i.length),r=s),l===-1&&c!==-1&&(l=e.getLineContent(r).lastIndexOf(i,c),s=r),t.isEmpty()&&(l===-1||c===-1)&&(l=e.getLineContent(s).indexOf(i),l!==-1&&(c=e.getLineContent(s).indexOf(n,l+i.length))),l!==-1&&e.getLineContent(s).charCodeAt(l+i.length)===32&&(i+=\" \"),c!==-1&&e.getLineContent(r).charCodeAt(c-1)===32&&(n=\" \"+n,c-=1),l!==-1&&c!==-1?Vl._createRemoveBlockCommentOperations(new L(s,l+i.length+1,r,c+1),i,n):null}_executeBlockComment(e,t,i){e.tokenization.tokenizeIfCheap(i.startLineNumber);const n=e.getLanguageIdAtPosition(i.startLineNumber,1),s=this.languageConfigurationService.getLanguageConfiguration(n).comments;if(!s||!s.blockCommentStartToken||!s.blockCommentEndToken)return;const r=s.blockCommentStartToken,a=s.blockCommentEndToken;let l=this._attemptRemoveBlockComment(e,i,r,a);if(!l){if(i.isEmpty()){const c=e.getLineContent(i.startLineNumber);let d=Sn(c);d===-1&&(d=c.length),l=Vl._createAddBlockCommentOperations(new L(i.startLineNumber,d+1,i.startLineNumber,c.length+1),r,a,this._insertSpace)}else l=Vl._createAddBlockCommentOperations(new L(i.startLineNumber,e.getLineFirstNonWhitespaceColumn(i.startLineNumber),i.endLineNumber,e.getLineMaxColumn(i.endLineNumber)),r,a,this._insertSpace);l.length===1&&(this._deltaColumn=r.length+1)}this._selectionId=t.trackSelection(i);for(const c of l)t.addEditOperation(c.range,c.text)}getEditOperations(e,t){let i=this._selection;if(this._moveEndPositionDown=!1,i.startLineNumber===i.endLineNumber&&this._ignoreFirstLine){t.addEditOperation(new L(i.startLineNumber,e.getLineMaxColumn(i.startLineNumber),i.startLineNumber+1,1),i.startLineNumber===e.getLineCount()?\"\":`\n`),this._selectionId=t.trackSelection(i);return}i.startLineNumber<i.endLineNumber&&i.endColumn===1&&(this._moveEndPositionDown=!0,i=i.setEndPosition(i.endLineNumber-1,e.getLineMaxColumn(i.endLineNumber-1)));const n=Sa._gatherPreflightData(this._type,this._insertSpace,e,i.startLineNumber,i.endLineNumber,this._ignoreEmptyLines,this._ignoreFirstLine,this.languageConfigurationService);return n.supported?this._executeLineComments(e,t,n,i):this._executeBlockComment(e,t,i)}computeCursorState(e,t){let i=t.getTrackedSelection(this._selectionId);return this._moveEndPositionDown&&(i=i.setEndPosition(i.endLineNumber+1,1)),new oe(i.selectionStartLineNumber,i.selectionStartColumn+this._deltaColumn,i.positionLineNumber,i.positionColumn+this._deltaColumn)}static _createRemoveLineCommentsOperations(e,t){const i=[];for(let n=0,s=e.length;n<s;n++){const r=e[n];r.ignore||i.push(Pt.delete(new L(t+n,r.commentStrOffset+1,t+n,r.commentStrOffset+r.commentStrLength+1)))}return i}_createAddLineCommentsOperations(e,t){const i=[],n=this._insertSpace?\" \":\"\";for(let s=0,r=e.length;s<r;s++){const a=e[s];a.ignore||i.push(Pt.insert(new B(t+s,a.commentStrOffset+1),a.commentStr+n))}return i}static nextVisibleColumn(e,t,i,n){return i?e+(t-e%t):e+n}static _normalizeInsertionPoint(e,t,i,n){let s=1073741824,r,a;for(let l=0,c=t.length;l<c;l++){if(t[l].ignore)continue;const d=e.getLineContent(i+l);let h=0;for(let u=0,g=t[l].commentStrOffset;h<s&&u<g;u++)h=Sa.nextVisibleColumn(h,n,d.charCodeAt(u)===9,1);h<s&&(s=h)}s=Math.floor(s/n)*n;for(let l=0,c=t.length;l<c;l++){if(t[l].ignore)continue;const d=e.getLineContent(i+l);let h=0;for(r=0,a=t[l].commentStrOffset;h<s&&r<a;r++)h=Sa.nextVisibleColumn(h,n,d.charCodeAt(r)===9,1);h>s?t[l].commentStrOffset=r-1:t[l].commentStrOffset=r}}}class eN extends he{constructor(e,t){super(t),this._type=e}run(e,t){const i=e.get(ti);if(!t.hasModel())return;const n=t.getModel(),s=[],r=n.getOptions(),a=t.getOption(19),l=t.getSelections().map((d,h)=>({selection:d,index:h,ignoreFirstLine:!1}));l.sort((d,h)=>L.compareRangesUsingStarts(d.selection,h.selection));let c=l[0];for(let d=1;d<l.length;d++){const h=l[d];c.selection.endLineNumber===h.selection.startLineNumber&&(c.index<h.index?h.ignoreFirstLine=!0:(c.ignoreFirstLine=!0,c=h))}for(const d of l)s.push(new Sa(i,d.selection,r.tabSize,this._type,a.insertSpace,a.ignoreEmptyLines,d.ignoreFirstLine));t.pushUndoStop(),t.executeCommands(this.id,s),t.pushUndoStop()}}class nee extends eN{constructor(){super(0,{id:\"editor.action.commentLine\",label:p(\"comment.line\",\"Toggle Line Comment\"),alias:\"Toggle Line Comment\",precondition:T.writable,kbOpts:{kbExpr:T.editorTextFocus,primary:2133,weight:100},menuOpts:{menuId:A.MenubarEditMenu,group:\"5_insert\",title:p({key:\"miToggleLineComment\",comment:[\"&& denotes a mnemonic\"]},\"&&Toggle Line Comment\"),order:1}})}}class see extends eN{constructor(){super(1,{id:\"editor.action.addCommentLine\",label:p(\"comment.line.add\",\"Add Line Comment\"),alias:\"Add Line Comment\",precondition:T.writable,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2081),weight:100}})}}class oee extends eN{constructor(){super(2,{id:\"editor.action.removeCommentLine\",label:p(\"comment.line.remove\",\"Remove Line Comment\"),alias:\"Remove Line Comment\",precondition:T.writable,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2099),weight:100}})}}class ree extends he{constructor(){super({id:\"editor.action.blockComment\",label:p(\"comment.block\",\"Toggle Block Comment\"),alias:\"Toggle Block Comment\",precondition:T.writable,kbOpts:{kbExpr:T.editorTextFocus,primary:1567,linux:{primary:3103},weight:100},menuOpts:{menuId:A.MenubarEditMenu,group:\"5_insert\",title:p({key:\"miToggleBlockComment\",comment:[\"&& denotes a mnemonic\"]},\"Toggle &&Block Comment\"),order:2}})}run(e,t){const i=e.get(ti);if(!t.hasModel())return;const n=t.getOption(19),s=[],r=t.getSelections();for(const a of r)s.push(new Vl(a,n.insertSpace,i));t.pushUndoStop(),t.executeCommands(this.id,s),t.pushUndoStop()}}te(nee);te(see);te(oee);te(ree);var aee=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Uh=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let wg=class b3{constructor(e,t,i,n,s,r,a){this._contextMenuService=t,this._contextViewService=i,this._contextKeyService=n,this._keybindingService=s,this._menuService=r,this._configurationService=a,this._toDispose=new ee,this._contextMenuIsBeingShownCount=0,this._editor=e,this._toDispose.add(this._editor.onContextMenu(l=>this._onContextMenu(l))),this._toDispose.add(this._editor.onMouseWheel(l=>{if(this._contextMenuIsBeingShownCount>0){const c=this._contextViewService.getContextViewElement(),d=l.srcElement;d.shadowRoot&&Md(c)===d.shadowRoot||this._contextViewService.hideContextView()}})),this._toDispose.add(this._editor.onKeyDown(l=>{!this._editor.getOption(20)||l.keyCode===58&&(l.preventDefault(),l.stopPropagation(),this.showContextMenu())}))}static get(e){return e.getContribution(b3.ID)}_onContextMenu(e){if(!this._editor.hasModel())return;if(!this._editor.getOption(20)){this._editor.focus(),e.target.position&&!this._editor.getSelection().containsPosition(e.target.position)&&this._editor.setPosition(e.target.position);return}if(e.target.type===12||e.target.type===6&&e.target.detail.injectedText)return;if(e.event.preventDefault(),e.event.stopPropagation(),e.target.type===11)return this._showScrollbarContextMenu({x:e.event.posx-1,width:2,y:e.event.posy-1,height:2});if(e.target.type!==6&&e.target.type!==7&&e.target.type!==1)return;if(this._editor.focus(),e.target.position){let i=!1;for(const n of this._editor.getSelections())if(n.containsPosition(e.target.position)){i=!0;break}i||this._editor.setPosition(e.target.position)}let t=null;e.target.type!==1&&(t={x:e.event.posx-1,width:2,y:e.event.posy-1,height:2}),this.showContextMenu(t)}showContextMenu(e){if(!this._editor.getOption(20)||!this._editor.hasModel())return;const t=this._getMenuActions(this._editor.getModel(),this._editor.isSimpleWidget?A.SimpleEditorContext:A.EditorContext);t.length>0&&this._doShowContextMenu(t,e)}_getMenuActions(e,t){const i=[],n=this._menuService.createMenu(t,this._contextKeyService),s=n.getActions({arg:e.uri});n.dispose();for(const r of s){const[,a]=r;let l=0;for(const c of a)if(c instanceof Qx){const d=this._getMenuActions(e,c.item.submenu);d.length>0&&(i.push(new Ip(c.id,c.label,d)),l++)}else i.push(c),l++;l&&i.push(new Ji)}return i.length&&i.pop(),i}_doShowContextMenu(e,t=null){if(!this._editor.hasModel())return;const i=this._editor.getOption(55);if(this._editor.updateOptions({hover:{enabled:!1}}),!t){this._editor.revealPosition(this._editor.getPosition(),1),this._editor.render();const s=this._editor.getScrolledVisiblePosition(this._editor.getPosition()),r=Qi(this._editor.getDomNode()),a=r.left+s.left,l=r.top+s.top+s.height;t={x:a,y:l}}const n=this._editor.getOption(117)&&!Xa;this._contextMenuIsBeingShownCount++,this._contextMenuService.showContextMenu({domForShadowRoot:n?this._editor.getDomNode():void 0,getAnchor:()=>t,getActions:()=>e,getActionViewItem:s=>{const r=this._keybindingFor(s);if(r)return new nm(s,s,{label:!0,keybinding:r.getLabel(),isMenu:!0});const a=s;return typeof a.getActionViewItem==\"function\"?a.getActionViewItem():new nm(s,s,{icon:!0,label:!0,isMenu:!0})},getKeyBinding:s=>this._keybindingFor(s),onHide:s=>{this._contextMenuIsBeingShownCount--,this._editor.focus(),this._editor.updateOptions({hover:i})}})}_showScrollbarContextMenu(e){if(!this._editor.hasModel())return;const t=this._editor.getOption(67);let i=0;const n=c=>({id:`menu-action-${++i}`,label:c.label,tooltip:\"\",class:void 0,enabled:typeof c.enabled==\"undefined\"?!0:c.enabled,checked:c.checked,run:c.run,dispose:()=>null}),s=(c,d)=>new Ip(`menu-action-${++i}`,c,d,void 0),r=(c,d,h,u,g)=>{if(!d)return n({label:c,enabled:d,run:()=>{}});const f=b=>()=>{this._configurationService.updateValue(h,b)},_=[];for(const b of g)_.push(n({label:b.label,checked:u===b.value,run:f(b.value)}));return s(c,_)},a=[];a.push(n({label:p(\"context.minimap.minimap\",\"Minimap\"),checked:t.enabled,run:()=>{this._configurationService.updateValue(\"editor.minimap.enabled\",!t.enabled)}})),a.push(new Ji),a.push(n({label:p(\"context.minimap.renderCharacters\",\"Render Characters\"),enabled:t.enabled,checked:t.renderCharacters,run:()=>{this._configurationService.updateValue(\"editor.minimap.renderCharacters\",!t.renderCharacters)}})),a.push(r(p(\"context.minimap.size\",\"Vertical size\"),t.enabled,\"editor.minimap.size\",t.size,[{label:p(\"context.minimap.size.proportional\",\"Proportional\"),value:\"proportional\"},{label:p(\"context.minimap.size.fill\",\"Fill\"),value:\"fill\"},{label:p(\"context.minimap.size.fit\",\"Fit\"),value:\"fit\"}])),a.push(r(p(\"context.minimap.slider\",\"Slider\"),t.enabled,\"editor.minimap.showSlider\",t.showSlider,[{label:p(\"context.minimap.slider.mouseover\",\"Mouse Over\"),value:\"mouseover\"},{label:p(\"context.minimap.slider.always\",\"Always\"),value:\"always\"}]));const l=this._editor.getOption(117)&&!Xa;this._contextMenuIsBeingShownCount++,this._contextMenuService.showContextMenu({domForShadowRoot:l?this._editor.getDomNode():void 0,getAnchor:()=>e,getActions:()=>a,onHide:c=>{this._contextMenuIsBeingShownCount--,this._editor.focus()}})}_keybindingFor(e){return this._keybindingService.lookupKeybinding(e.id)}dispose(){this._contextMenuIsBeingShownCount>0&&this._contextViewService.hideContextView(),this._toDispose.dispose()}};wg.ID=\"editor.contrib.contextmenu\";wg=aee([Uh(1,cl),Uh(2,Ch),Uh(3,xe),Uh(4,rn),Uh(5,fh),Uh(6,ot)],wg);class lee extends he{constructor(){super({id:\"editor.action.showContextMenu\",label:p(\"action.showContextMenu.label\",\"Show Editor Context Menu\"),alias:\"Show Editor Context Menu\",precondition:void 0,kbOpts:{kbExpr:T.textInputFocus,primary:1092,weight:100}})}run(e,t){var i;(i=wg.get(t))===null||i===void 0||i.showContextMenu()}}rt(wg.ID,wg);te(lee);class WS{constructor(e){this.selections=e}equals(e){const t=this.selections.length,i=e.selections.length;if(t!==i)return!1;for(let n=0;n<t;n++)if(!this.selections[n].equalsSelection(e.selections[n]))return!1;return!0}}class VS{constructor(e,t,i){this.cursorState=e,this.scrollTop=t,this.scrollLeft=i}}class eh extends z{constructor(e){super(),this._editor=e,this._isCursorUndoRedo=!1,this._undoStack=[],this._redoStack=[],this._register(e.onDidChangeModel(t=>{this._undoStack=[],this._redoStack=[]})),this._register(e.onDidChangeModelContent(t=>{this._undoStack=[],this._redoStack=[]})),this._register(e.onDidChangeCursorSelection(t=>{if(this._isCursorUndoRedo||!t.oldSelections||t.oldModelVersionId!==t.modelVersionId)return;const i=new WS(t.oldSelections);this._undoStack.length>0&&this._undoStack[this._undoStack.length-1].cursorState.equals(i)||(this._undoStack.push(new VS(i,e.getScrollTop(),e.getScrollLeft())),this._redoStack=[],this._undoStack.length>50&&this._undoStack.shift())}))}static get(e){return e.getContribution(eh.ID)}cursorUndo(){!this._editor.hasModel()||this._undoStack.length===0||(this._redoStack.push(new VS(new WS(this._editor.getSelections()),this._editor.getScrollTop(),this._editor.getScrollLeft())),this._applyState(this._undoStack.pop()))}cursorRedo(){!this._editor.hasModel()||this._redoStack.length===0||(this._undoStack.push(new VS(new WS(this._editor.getSelections()),this._editor.getScrollTop(),this._editor.getScrollLeft())),this._applyState(this._redoStack.pop()))}_applyState(e){this._isCursorUndoRedo=!0,this._editor.setSelections(e.cursorState.selections),this._editor.setScrollPosition({scrollTop:e.scrollTop,scrollLeft:e.scrollLeft}),this._isCursorUndoRedo=!1}}eh.ID=\"editor.contrib.cursorUndoRedoController\";class cee extends he{constructor(){super({id:\"cursorUndo\",label:p(\"cursor.undo\",\"Cursor Undo\"),alias:\"Cursor Undo\",precondition:void 0,kbOpts:{kbExpr:T.textInputFocus,primary:2099,weight:100}})}run(e,t,i){var n;(n=eh.get(t))===null||n===void 0||n.cursorUndo()}}class dee extends he{constructor(){super({id:\"cursorRedo\",label:p(\"cursor.redo\",\"Cursor Redo\"),alias:\"Cursor Redo\",precondition:void 0})}run(e,t,i){var n;(n=eh.get(t))===null||n===void 0||n.cursorRedo()}}rt(eh.ID,eh);te(cee);te(dee);class hee{constructor(e,t,i){this.selection=e,this.targetPosition=t,this.copy=i,this.targetSelection=null}getEditOperations(e,t){const i=e.getValueInRange(this.selection);if(this.copy||t.addEditOperation(this.selection,null),t.addEditOperation(new L(this.targetPosition.lineNumber,this.targetPosition.column,this.targetPosition.lineNumber,this.targetPosition.column),i),this.selection.containsPosition(this.targetPosition)&&!(this.copy&&(this.selection.getEndPosition().equals(this.targetPosition)||this.selection.getStartPosition().equals(this.targetPosition)))){this.targetSelection=this.selection;return}if(this.copy){this.targetSelection=new oe(this.targetPosition.lineNumber,this.targetPosition.column,this.selection.endLineNumber-this.selection.startLineNumber+this.targetPosition.lineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column+this.selection.endColumn-this.selection.startColumn:this.selection.endColumn);return}if(this.targetPosition.lineNumber>this.selection.endLineNumber){this.targetSelection=new oe(this.targetPosition.lineNumber-this.selection.endLineNumber+this.selection.startLineNumber,this.targetPosition.column,this.targetPosition.lineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column+this.selection.endColumn-this.selection.startColumn:this.selection.endColumn);return}if(this.targetPosition.lineNumber<this.selection.endLineNumber){this.targetSelection=new oe(this.targetPosition.lineNumber,this.targetPosition.column,this.targetPosition.lineNumber+this.selection.endLineNumber-this.selection.startLineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column+this.selection.endColumn-this.selection.startColumn:this.selection.endColumn);return}this.selection.endColumn<=this.targetPosition.column?this.targetSelection=new oe(this.targetPosition.lineNumber-this.selection.endLineNumber+this.selection.startLineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column-this.selection.endColumn+this.selection.startColumn:this.targetPosition.column-this.selection.endColumn+this.selection.startColumn,this.targetPosition.lineNumber,this.selection.startLineNumber===this.selection.endLineNumber?this.targetPosition.column:this.selection.endColumn):this.targetSelection=new oe(this.targetPosition.lineNumber-this.selection.endLineNumber+this.selection.startLineNumber,this.targetPosition.column,this.targetPosition.lineNumber,this.targetPosition.column+this.selection.endColumn-this.selection.startColumn)}computeCursorState(e,t){return this.targetSelection}}function $h(o){return Ze?o.altKey:o.ctrlKey}class Za extends z{constructor(e){super(),this._editor=e,this._dndDecorationIds=this._editor.createDecorationsCollection(),this._register(this._editor.onMouseDown(t=>this._onEditorMouseDown(t))),this._register(this._editor.onMouseUp(t=>this._onEditorMouseUp(t))),this._register(this._editor.onMouseDrag(t=>this._onEditorMouseDrag(t))),this._register(this._editor.onMouseDrop(t=>this._onEditorMouseDrop(t))),this._register(this._editor.onMouseDropCanceled(()=>this._onEditorMouseDropCanceled())),this._register(this._editor.onKeyDown(t=>this.onEditorKeyDown(t))),this._register(this._editor.onKeyUp(t=>this.onEditorKeyUp(t))),this._register(this._editor.onDidBlurEditorWidget(()=>this.onEditorBlur())),this._register(this._editor.onDidBlurEditorText(()=>this.onEditorBlur())),this._mouseDown=!1,this._modifierPressed=!1,this._dragSelection=null}onEditorBlur(){this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1,this._modifierPressed=!1}onEditorKeyDown(e){!this._editor.getOption(31)||this._editor.getOption(18)||($h(e)&&(this._modifierPressed=!0),this._mouseDown&&$h(e)&&this._editor.updateOptions({mouseStyle:\"copy\"}))}onEditorKeyUp(e){!this._editor.getOption(31)||this._editor.getOption(18)||($h(e)&&(this._modifierPressed=!1),this._mouseDown&&e.keyCode===Za.TRIGGER_KEY_VALUE&&this._editor.updateOptions({mouseStyle:\"default\"}))}_onEditorMouseDown(e){this._mouseDown=!0}_onEditorMouseUp(e){this._mouseDown=!1,this._editor.updateOptions({mouseStyle:\"text\"})}_onEditorMouseDrag(e){const t=e.target;if(this._dragSelection===null){const n=(this._editor.getSelections()||[]).filter(s=>t.position&&s.containsPosition(t.position));if(n.length===1)this._dragSelection=n[0];else return}$h(e.event)?this._editor.updateOptions({mouseStyle:\"copy\"}):this._editor.updateOptions({mouseStyle:\"default\"}),t.position&&(this._dragSelection.containsPosition(t.position)?this._removeDecoration():this.showAt(t.position))}_onEditorMouseDropCanceled(){this._editor.updateOptions({mouseStyle:\"text\"}),this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1}_onEditorMouseDrop(e){if(e.target&&(this._hitContent(e.target)||this._hitMargin(e.target))&&e.target.position){const t=new B(e.target.position.lineNumber,e.target.position.column);if(this._dragSelection===null){let i=null;if(e.event.shiftKey){const n=this._editor.getSelection();if(n){const{selectionStartLineNumber:s,selectionStartColumn:r}=n;i=[new oe(s,r,t.lineNumber,t.column)]}}else i=(this._editor.getSelections()||[]).map(n=>n.containsPosition(t)?new oe(t.lineNumber,t.column,t.lineNumber,t.column):n);this._editor.setSelections(i||[],\"mouse\",3)}else(!this._dragSelection.containsPosition(t)||($h(e.event)||this._modifierPressed)&&(this._dragSelection.getEndPosition().equals(t)||this._dragSelection.getStartPosition().equals(t)))&&(this._editor.pushUndoStop(),this._editor.executeCommand(Za.ID,new hee(this._dragSelection,t,$h(e.event)||this._modifierPressed)),this._editor.pushUndoStop())}this._editor.updateOptions({mouseStyle:\"text\"}),this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1}showAt(e){this._dndDecorationIds.set([{range:new L(e.lineNumber,e.column,e.lineNumber,e.column),options:Za._DECORATION_OPTIONS}]),this._editor.revealPosition(e,1)}_removeDecoration(){this._dndDecorationIds.clear()}_hitContent(e){return e.type===6||e.type===7}_hitMargin(e){return e.type===2||e.type===3||e.type===4}dispose(){this._removeDecoration(),this._dragSelection=null,this._mouseDown=!1,this._modifierPressed=!1,super.dispose()}}Za.ID=\"editor.contrib.dragAndDrop\";Za.TRIGGER_KEY_VALUE=Ze?6:5;Za._DECORATION_OPTIONS=Ie.register({description:\"dnd-target\",className:\"dnd-target\"});rt(Za.ID,Za);var v3=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},qf=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},p0=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};let Cm=class extends z{constructor(e,t,i,n,s){super(),this._bulkEditService=t,this._languageFeaturesService=i,this._progressService=n,this._register(e.onDropIntoEditor(r=>this.onDropIntoEditor(e,r.position,r.event))),this._languageFeaturesService.documentOnDropEditProvider.register(\"*\",new cD(s))}onDropIntoEditor(e,t,i){return p0(this,void 0,void 0,function*(){if(!i.dataTransfer||!e.hasModel())return;const n=e.getModel(),s=n.getVersionId(),r=yield this.extractDataTransferData(i);if(r.size===0||e.getModel().getVersionId()!==s)return;const a=new Kd(e,1);try{const l=this._languageFeaturesService.documentOnDropEditProvider.ordered(n),c=yield this._progressService.withProgress({location:15,delay:750,title:p(\"dropProgressTitle\",\"Running drop handlers...\"),cancellable:!0},()=>aI((()=>p0(this,void 0,void 0,function*(){for(const d of l){const h=yield d.provideDocumentOnDropEdits(n,t,r,a.token);if(a.token.isCancellationRequested)return;if(h)return h}}))(),a.token),()=>{a.cancel()});if(a.token.isCancellationRequested||e.getModel().getVersionId()!==s)return;if(c){const d=new L(t.lineNumber,t.column,t.lineNumber,t.column);_3(e,typeof c.insertText==\"string\"?_c.escape(c.insertText):c.insertText.snippet,[oe.fromRange(d,0)]),c.additionalEdit&&(yield this._bulkEditService.apply($g.convert(c.additionalEdit),{editor:e}));return}}finally{a.dispose()}})}extractDataTransferData(e){return p0(this,void 0,void 0,function*(){if(!e.dataTransfer)return new f3;const t=aD(e.dataTransfer);return GJ(t,e),t})}};Cm.ID=\"editor.contrib.dropIntoEditorController\";Cm=v3([qf(1,n_),qf(2,ue),qf(3,C5),qf(4,bm)],Cm);let cD=class{constructor(e){this._workspaceContextService=e}provideDocumentOnDropEdits(e,t,i,n){var s;return p0(this,void 0,void 0,function*(){const r=i.get(Pn.uriList);if(r){const l=yield r.asString(),c=this.getUriListInsertText(l);if(c)return{insertText:c}}const a=(s=i.get(\"text\"))!==null&&s!==void 0?s:i.get(Pn.text);if(a)return{insertText:yield a.asString()}})}getUriListInsertText(e){const t=[];for(const i of JE.parse(e))try{t.push(me.parse(i))}catch(n){}if(!!t.length)return t.map(i=>{const n=this._workspaceContextService.getWorkspaceFolder(i);if(n){const s=kK(n.uri,i);if(s)return s}return i.fsPath}).join(\" \")}};cD=v3([qf(0,bm)],cD);rt(Cm.ID,Cm);class cn{constructor(e){this._editor=e,this._decorations=[],this._overviewRulerApproximateDecorations=[],this._findScopeDecorationIds=[],this._rangeHighlightDecorationId=null,this._highlightedDecorationId=null,this._startPosition=this._editor.getPosition()}dispose(){this._editor.removeDecorations(this._allDecorations()),this._decorations=[],this._overviewRulerApproximateDecorations=[],this._findScopeDecorationIds=[],this._rangeHighlightDecorationId=null,this._highlightedDecorationId=null}reset(){this._decorations=[],this._overviewRulerApproximateDecorations=[],this._findScopeDecorationIds=[],this._rangeHighlightDecorationId=null,this._highlightedDecorationId=null}getCount(){return this._decorations.length}getFindScope(){return this._findScopeDecorationIds[0]?this._editor.getModel().getDecorationRange(this._findScopeDecorationIds[0]):null}getFindScopes(){if(this._findScopeDecorationIds.length){const e=this._findScopeDecorationIds.map(t=>this._editor.getModel().getDecorationRange(t)).filter(t=>!!t);if(e.length)return e}return null}getStartPosition(){return this._startPosition}setStartPosition(e){this._startPosition=e,this.setCurrentFindMatch(null)}_getDecorationIndex(e){const t=this._decorations.indexOf(e);return t>=0?t+1:1}getCurrentMatchesPosition(e){const t=this._editor.getModel().getDecorationsInRange(e);for(const i of t){const n=i.options;if(n===cn._FIND_MATCH_DECORATION||n===cn._CURRENT_FIND_MATCH_DECORATION)return this._getDecorationIndex(i.id)}return 0}setCurrentFindMatch(e){let t=null,i=0;if(e)for(let n=0,s=this._decorations.length;n<s;n++){const r=this._editor.getModel().getDecorationRange(this._decorations[n]);if(e.equalsRange(r)){t=this._decorations[n],i=n+1;break}}return(this._highlightedDecorationId!==null||t!==null)&&this._editor.changeDecorations(n=>{if(this._highlightedDecorationId!==null&&(n.changeDecorationOptions(this._highlightedDecorationId,cn._FIND_MATCH_DECORATION),this._highlightedDecorationId=null),t!==null&&(this._highlightedDecorationId=t,n.changeDecorationOptions(this._highlightedDecorationId,cn._CURRENT_FIND_MATCH_DECORATION)),this._rangeHighlightDecorationId!==null&&(n.removeDecoration(this._rangeHighlightDecorationId),this._rangeHighlightDecorationId=null),t!==null){let s=this._editor.getModel().getDecorationRange(t);if(s.startLineNumber!==s.endLineNumber&&s.endColumn===1){const r=s.endLineNumber-1,a=this._editor.getModel().getLineMaxColumn(r);s=new L(s.startLineNumber,s.startColumn,r,a)}this._rangeHighlightDecorationId=n.addDecoration(s,cn._RANGE_HIGHLIGHT_DECORATION)}}),i}set(e,t){this._editor.changeDecorations(i=>{let n=cn._FIND_MATCH_DECORATION;const s=[];if(e.length>1e3){n=cn._FIND_MATCH_NO_OVERVIEW_DECORATION;const a=this._editor.getModel().getLineCount(),c=this._editor.getLayoutInfo().height/a,d=Math.max(2,Math.ceil(3/c));let h=e[0].range.startLineNumber,u=e[0].range.endLineNumber;for(let g=1,f=e.length;g<f;g++){const _=e[g].range;u+d>=_.startLineNumber?_.endLineNumber>u&&(u=_.endLineNumber):(s.push({range:new L(h,1,u,1),options:cn._FIND_MATCH_ONLY_OVERVIEW_DECORATION}),h=_.startLineNumber,u=_.endLineNumber)}s.push({range:new L(h,1,u,1),options:cn._FIND_MATCH_ONLY_OVERVIEW_DECORATION})}const r=new Array(e.length);for(let a=0,l=e.length;a<l;a++)r[a]={range:e[a].range,options:n};this._decorations=i.deltaDecorations(this._decorations,r),this._overviewRulerApproximateDecorations=i.deltaDecorations(this._overviewRulerApproximateDecorations,s),this._rangeHighlightDecorationId&&(i.removeDecoration(this._rangeHighlightDecorationId),this._rangeHighlightDecorationId=null),this._findScopeDecorationIds.length&&(this._findScopeDecorationIds.forEach(a=>i.removeDecoration(a)),this._findScopeDecorationIds=[]),t!=null&&t.length&&(this._findScopeDecorationIds=t.map(a=>i.addDecoration(a,cn._FIND_SCOPE_DECORATION)))})}matchBeforePosition(e){if(this._decorations.length===0)return null;for(let t=this._decorations.length-1;t>=0;t--){const i=this._decorations[t],n=this._editor.getModel().getDecorationRange(i);if(!(!n||n.endLineNumber>e.lineNumber)){if(n.endLineNumber<e.lineNumber)return n;if(!(n.endColumn>e.column))return n}}return this._editor.getModel().getDecorationRange(this._decorations[this._decorations.length-1])}matchAfterPosition(e){if(this._decorations.length===0)return null;for(let t=0,i=this._decorations.length;t<i;t++){const n=this._decorations[t],s=this._editor.getModel().getDecorationRange(n);if(!(!s||s.startLineNumber<e.lineNumber)){if(s.startLineNumber>e.lineNumber)return s;if(!(s.startColumn<e.column))return s}}return this._editor.getModel().getDecorationRange(this._decorations[0])}_allDecorations(){let e=[];return e=e.concat(this._decorations),e=e.concat(this._overviewRulerApproximateDecorations),this._findScopeDecorationIds.length&&e.push(...this._findScopeDecorationIds),this._rangeHighlightDecorationId&&e.push(this._rangeHighlightDecorationId),e}}cn._CURRENT_FIND_MATCH_DECORATION=Ie.register({description:\"current-find-match\",stickiness:1,zIndex:13,className:\"currentFindMatch\",showIfCollapsed:!0,overviewRuler:{color:Qt(CI),position:vo.Center},minimap:{color:Qt(pu),position:js.Inline}});cn._FIND_MATCH_DECORATION=Ie.register({description:\"find-match\",stickiness:1,zIndex:10,className:\"findMatch\",showIfCollapsed:!0,overviewRuler:{color:Qt(CI),position:vo.Center},minimap:{color:Qt(pu),position:js.Inline}});cn._FIND_MATCH_NO_OVERVIEW_DECORATION=Ie.register({description:\"find-match-no-overview\",stickiness:1,className:\"findMatch\",showIfCollapsed:!0});cn._FIND_MATCH_ONLY_OVERVIEW_DECORATION=Ie.register({description:\"find-match-only-overview\",stickiness:1,overviewRuler:{color:Qt(CI),position:vo.Center}});cn._RANGE_HIGHLIGHT_DECORATION=Ie.register({description:\"find-range-highlight\",stickiness:1,className:\"rangeHighlight\",isWholeLine:!0});cn._FIND_SCOPE_DECORATION=Ie.register({description:\"find-scope\",className:\"findScope\",isWholeLine:!0});class uee{constructor(e,t,i){this._editorSelection=e,this._ranges=t,this._replaceStrings=i,this._trackedEditorSelectionId=null}getEditOperations(e,t){if(this._ranges.length>0){const i=[];for(let r=0;r<this._ranges.length;r++)i.push({range:this._ranges[r],text:this._replaceStrings[r]});i.sort((r,a)=>L.compareRangesUsingStarts(r.range,a.range));const n=[];let s=i[0];for(let r=1;r<i.length;r++)s.range.endLineNumber===i[r].range.startLineNumber&&s.range.endColumn===i[r].range.startColumn?(s.range=s.range.plusRange(i[r].range),s.text=s.text+i[r].text):(n.push(s),s=i[r]);n.push(s);for(const r of n)t.addEditOperation(r.range,r.text)}this._trackedEditorSelectionId=t.trackSelection(this._editorSelection)}computeCursorState(e,t){return t.getTrackedSelection(this._trackedEditorSelectionId)}}function C3(o,e){if(o&&o[0]!==\"\"){const t=lA(o,e,\"-\"),i=lA(o,e,\"_\");return t&&!i?cA(o,e,\"-\"):!t&&i?cA(o,e,\"_\"):o[0].toUpperCase()===o[0]?e.toUpperCase():o[0].toLowerCase()===o[0]?e.toLowerCase():OB(o[0][0])&&e.length>0?e[0].toUpperCase()+e.substr(1):o[0][0].toUpperCase()!==o[0][0]&&e.length>0?e[0].toLowerCase()+e.substr(1):e}else return e}function lA(o,e,t){return o[0].indexOf(t)!==-1&&e.indexOf(t)!==-1&&o[0].split(t).length===e.split(t).length}function cA(o,e,t){const i=e.split(t),n=o[0].split(t);let s=\"\";return i.forEach((r,a)=>{s+=C3([n[a]],r)+t}),s.slice(0,-1)}class dA{constructor(e){this.staticValue=e,this.kind=0}}class gee{constructor(e){this.pieces=e,this.kind=1}}class Sg{constructor(e){!e||e.length===0?this._state=new dA(\"\"):e.length===1&&e[0].staticValue!==null?this._state=new dA(e[0].staticValue):this._state=new gee(e)}static fromStaticValue(e){return new Sg([xd.staticValue(e)])}get hasReplacementPatterns(){return this._state.kind===1}buildReplaceString(e,t){if(this._state.kind===0)return t?C3(e,this._state.staticValue):this._state.staticValue;let i=\"\";for(let n=0,s=this._state.pieces.length;n<s;n++){const r=this._state.pieces[n];if(r.staticValue!==null){i+=r.staticValue;continue}let a=Sg._substitute(r.matchIndex,e);if(r.caseOps!==null&&r.caseOps.length>0){const l=[],c=r.caseOps.length;let d=0;for(let h=0,u=a.length;h<u;h++){if(d>=c){l.push(a.slice(h));break}switch(r.caseOps[d]){case\"U\":l.push(a[h].toUpperCase());break;case\"u\":l.push(a[h].toUpperCase()),d++;break;case\"L\":l.push(a[h].toLowerCase());break;case\"l\":l.push(a[h].toLowerCase()),d++;break;default:l.push(a[h])}}a=l.join(\"\")}i+=a}return i}static _substitute(e,t){if(t===null)return\"\";if(e===0)return t[0];let i=\"\";for(;e>0;){if(e<t.length)return(t[e]||\"\")+i;i=String(e%10)+i,e=Math.floor(e/10)}return\"$\"+i}}class xd{constructor(e,t,i){this.staticValue=e,this.matchIndex=t,!i||i.length===0?this.caseOps=null:this.caseOps=i.slice(0)}static staticValue(e){return new xd(e,-1,null)}static caseOps(e,t){return new xd(null,e,t)}}class fee{constructor(e){this._source=e,this._lastCharIndex=0,this._result=[],this._resultLen=0,this._currentStaticPiece=\"\"}emitUnchanged(e){this._emitStatic(this._source.substring(this._lastCharIndex,e)),this._lastCharIndex=e}emitStatic(e,t){this._emitStatic(e),this._lastCharIndex=t}_emitStatic(e){e.length!==0&&(this._currentStaticPiece+=e)}emitMatchIndex(e,t,i){this._currentStaticPiece.length!==0&&(this._result[this._resultLen++]=xd.staticValue(this._currentStaticPiece),this._currentStaticPiece=\"\"),this._result[this._resultLen++]=xd.caseOps(e,i),this._lastCharIndex=t}finalize(){return this.emitUnchanged(this._source.length),this._currentStaticPiece.length!==0&&(this._result[this._resultLen++]=xd.staticValue(this._currentStaticPiece),this._currentStaticPiece=\"\"),new Sg(this._result)}}function pee(o){if(!o||o.length===0)return new Sg(null);const e=[],t=new fee(o);for(let i=0,n=o.length;i<n;i++){const s=o.charCodeAt(i);if(s===92){if(i++,i>=n)break;const r=o.charCodeAt(i);switch(r){case 92:t.emitUnchanged(i-1),t.emitStatic(\"\\\\\",i+1);break;case 110:t.emitUnchanged(i-1),t.emitStatic(`\n`,i+1);break;case 116:t.emitUnchanged(i-1),t.emitStatic(\"\t\",i+1);break;case 117:case 85:case 108:case 76:t.emitUnchanged(i-1),t.emitStatic(\"\",i+1),e.push(String.fromCharCode(r));break}continue}if(s===36){if(i++,i>=n)break;const r=o.charCodeAt(i);if(r===36){t.emitUnchanged(i-1),t.emitStatic(\"$\",i+1);continue}if(r===48||r===38){t.emitUnchanged(i-1),t.emitMatchIndex(0,i+1,e),e.length=0;continue}if(49<=r&&r<=57){let a=r-48;if(i+1<n){const l=o.charCodeAt(i+1);if(48<=l&&l<=57){i++,a=a*10+(l-48),t.emitUnchanged(i-2),t.emitMatchIndex(a,i+1,e),e.length=0;continue}}t.emitUnchanged(i-1),t.emitMatchIndex(a,i+1,e),e.length=0;continue}}}return t.finalize()}const Ic=new ce(\"findWidgetVisible\",!1);Ic.toNegated();const O1=new ce(\"findInputFocussed\",!1),tN=new ce(\"replaceInputFocussed\",!1),yb={primary:545,mac:{primary:2593}},Lb={primary:565,mac:{primary:2613}},Db={primary:560,mac:{primary:2608}},kb={primary:554,mac:{primary:2602}},xb={primary:558,mac:{primary:2606}},Dt={StartFindAction:\"actions.find\",StartFindWithSelection:\"actions.findWithSelection\",StartFindWithArgs:\"editor.actions.findWithArgs\",NextMatchFindAction:\"editor.action.nextMatchFindAction\",PreviousMatchFindAction:\"editor.action.previousMatchFindAction\",NextSelectionMatchFindAction:\"editor.action.nextSelectionMatchFindAction\",PreviousSelectionMatchFindAction:\"editor.action.previousSelectionMatchFindAction\",StartFindReplaceAction:\"editor.action.startFindReplaceAction\",CloseFindWidgetCommand:\"closeFindWidget\",ToggleCaseSensitiveCommand:\"toggleFindCaseSensitive\",ToggleWholeWordCommand:\"toggleFindWholeWord\",ToggleRegexCommand:\"toggleFindRegex\",ToggleSearchScopeCommand:\"toggleFindInSelection\",TogglePreserveCaseCommand:\"togglePreserveCase\",ReplaceOneAction:\"editor.action.replaceOne\",ReplaceAllAction:\"editor.action.replaceAll\",SelectAllMatchesAction:\"editor.action.selectAllMatches\"},Hl=19999,mee=240;class pp{constructor(e,t){this._toDispose=new ee,this._editor=e,this._state=t,this._isDisposed=!1,this._startSearchingTimer=new Is,this._decorations=new cn(e),this._toDispose.add(this._decorations),this._updateDecorationsScheduler=new ft(()=>this.research(!1),100),this._toDispose.add(this._updateDecorationsScheduler),this._toDispose.add(this._editor.onDidChangeCursorPosition(i=>{(i.reason===3||i.reason===5||i.reason===6)&&this._decorations.setStartPosition(this._editor.getPosition())})),this._ignoreModelContentChanged=!1,this._toDispose.add(this._editor.onDidChangeModelContent(i=>{this._ignoreModelContentChanged||(i.isFlush&&this._decorations.reset(),this._decorations.setStartPosition(this._editor.getPosition()),this._updateDecorationsScheduler.schedule())})),this._toDispose.add(this._state.onFindReplaceStateChange(i=>this._onStateChanged(i))),this.research(!1,this._state.searchScope)}dispose(){this._isDisposed=!0,et(this._startSearchingTimer),this._toDispose.dispose()}_onStateChanged(e){this._isDisposed||!this._editor.hasModel()||(e.searchString||e.isReplaceRevealed||e.isRegex||e.wholeWord||e.matchCase||e.searchScope)&&(this._editor.getModel().isTooLargeForSyncing()?(this._startSearchingTimer.cancel(),this._startSearchingTimer.setIfNotSet(()=>{e.searchScope?this.research(e.moveCursor,this._state.searchScope):this.research(e.moveCursor)},mee)):e.searchScope?this.research(e.moveCursor,this._state.searchScope):this.research(e.moveCursor))}static _getSearchRange(e,t){return t||e.getFullModelRange()}research(e,t){let i=null;typeof t!=\"undefined\"?t!==null&&(Array.isArray(t)?i=t:i=[t]):i=this._decorations.getFindScopes(),i!==null&&(i=i.map(a=>{if(a.startLineNumber!==a.endLineNumber){let l=a.endLineNumber;return a.endColumn===1&&(l=l-1),new L(a.startLineNumber,1,l,this._editor.getModel().getLineMaxColumn(l))}return a}));const n=this._findMatches(i,!1,Hl);this._decorations.set(n,i);const s=this._editor.getSelection();let r=this._decorations.getCurrentMatchesPosition(s);if(r===0&&n.length>0){const a=fP(n.map(l=>l.range),l=>L.compareRangesUsingStarts(l,s)>=0);r=a>0?a-1+1:r}this._state.changeMatchInfo(r,this._decorations.getCount(),void 0),e&&this._editor.getOption(37).cursorMoveOnType&&this._moveToNextMatch(this._decorations.getStartPosition())}_hasMatches(){return this._state.matchesCount>0}_cannotFind(){if(!this._hasMatches()){const e=this._decorations.getFindScope();return e&&this._editor.revealRangeInCenterIfOutsideViewport(e,0),!0}return!1}_setCurrentFindMatch(e){const t=this._decorations.setCurrentFindMatch(e);this._state.changeMatchInfo(t,this._decorations.getCount(),e),this._editor.setSelection(e),this._editor.revealRangeInCenterIfOutsideViewport(e,0)}_prevSearchPosition(e){const t=this._state.isRegex&&(this._state.searchString.indexOf(\"^\")>=0||this._state.searchString.indexOf(\"$\")>=0);let{lineNumber:i,column:n}=e;const s=this._editor.getModel();return t||n===1?(i===1?i=s.getLineCount():i--,n=s.getLineMaxColumn(i)):n--,new B(i,n)}_moveToPrevMatch(e,t=!1){if(!this._state.canNavigateBack()){const d=this._decorations.matchAfterPosition(e);d&&this._setCurrentFindMatch(d);return}if(this._decorations.getCount()<Hl){let d=this._decorations.matchBeforePosition(e);d&&d.isEmpty()&&d.getStartPosition().equals(e)&&(e=this._prevSearchPosition(e),d=this._decorations.matchBeforePosition(e)),d&&this._setCurrentFindMatch(d);return}if(this._cannotFind())return;const i=this._decorations.getFindScope(),n=pp._getSearchRange(this._editor.getModel(),i);n.getEndPosition().isBefore(e)&&(e=n.getEndPosition()),e.isBefore(n.getStartPosition())&&(e=n.getEndPosition());const{lineNumber:s,column:r}=e,a=this._editor.getModel();let l=new B(s,r),c=a.findPreviousMatch(this._state.searchString,l,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(119):null,!1);if(c&&c.range.isEmpty()&&c.range.getStartPosition().equals(l)&&(l=this._prevSearchPosition(l),c=a.findPreviousMatch(this._state.searchString,l,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(119):null,!1)),!!c){if(!t&&!n.containsRange(c.range))return this._moveToPrevMatch(c.range.getStartPosition(),!0);this._setCurrentFindMatch(c.range)}}moveToPrevMatch(){this._moveToPrevMatch(this._editor.getSelection().getStartPosition())}_nextSearchPosition(e){const t=this._state.isRegex&&(this._state.searchString.indexOf(\"^\")>=0||this._state.searchString.indexOf(\"$\")>=0);let{lineNumber:i,column:n}=e;const s=this._editor.getModel();return t||n===s.getLineMaxColumn(i)?(i===s.getLineCount()?i=1:i++,n=1):n++,new B(i,n)}_moveToNextMatch(e){if(!this._state.canNavigateForward()){const i=this._decorations.matchBeforePosition(e);i&&this._setCurrentFindMatch(i);return}if(this._decorations.getCount()<Hl){let i=this._decorations.matchAfterPosition(e);i&&i.isEmpty()&&i.getStartPosition().equals(e)&&(e=this._nextSearchPosition(e),i=this._decorations.matchAfterPosition(e)),i&&this._setCurrentFindMatch(i);return}const t=this._getNextMatch(e,!1,!0);t&&this._setCurrentFindMatch(t.range)}_getNextMatch(e,t,i,n=!1){if(this._cannotFind())return null;const s=this._decorations.getFindScope(),r=pp._getSearchRange(this._editor.getModel(),s);r.getEndPosition().isBefore(e)&&(e=r.getStartPosition()),e.isBefore(r.getStartPosition())&&(e=r.getStartPosition());const{lineNumber:a,column:l}=e,c=this._editor.getModel();let d=new B(a,l),h=c.findNextMatch(this._state.searchString,d,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(119):null,t);return i&&h&&h.range.isEmpty()&&h.range.getStartPosition().equals(d)&&(d=this._nextSearchPosition(d),h=c.findNextMatch(this._state.searchString,d,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(119):null,t)),h?!n&&!r.containsRange(h.range)?this._getNextMatch(h.range.getEndPosition(),t,i,!0):h:null}moveToNextMatch(){this._moveToNextMatch(this._editor.getSelection().getEndPosition())}_getReplacePattern(){return this._state.isRegex?pee(this._state.replaceString):Sg.fromStaticValue(this._state.replaceString)}replace(){if(!this._hasMatches())return;const e=this._getReplacePattern(),t=this._editor.getSelection(),i=this._getNextMatch(t.getStartPosition(),!0,!1);if(i)if(t.equalsRange(i.range)){const n=e.buildReplaceString(i.matches,this._state.preserveCase),s=new Wi(t,n);this._executeEditorCommand(\"replace\",s),this._decorations.setStartPosition(new B(t.startLineNumber,t.startColumn+n.length)),this.research(!0)}else this._decorations.setStartPosition(this._editor.getPosition()),this._setCurrentFindMatch(i.range)}_findMatches(e,t,i){const n=(e||[null]).map(s=>pp._getSearchRange(this._editor.getModel(),s));return this._editor.getModel().findMatches(this._state.searchString,n,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(119):null,t,i)}replaceAll(){if(!this._hasMatches())return;const e=this._decorations.getFindScopes();e===null&&this._state.matchesCount>=Hl?this._largeReplaceAll():this._regularReplaceAll(e),this.research(!1)}_largeReplaceAll(){const t=new jc(this._state.searchString,this._state.isRegex,this._state.matchCase,this._state.wholeWord?this._editor.getOption(119):null).parseSearchRequest();if(!t)return;let i=t.regex;if(!i.multiline){let h=\"mu\";i.ignoreCase&&(h+=\"i\"),i.global&&(h+=\"g\"),i=new RegExp(i.source,h)}const n=this._editor.getModel(),s=n.getValue(1),r=n.getFullModelRange(),a=this._getReplacePattern();let l;const c=this._state.preserveCase;a.hasReplacementPatterns||c?l=s.replace(i,function(){return a.buildReplaceString(arguments,c)}):l=s.replace(i,a.buildReplaceString(null,c));const d=new Jx(r,l,this._editor.getSelection());this._executeEditorCommand(\"replaceAll\",d)}_regularReplaceAll(e){const t=this._getReplacePattern(),i=this._findMatches(e,t.hasReplacementPatterns||this._state.preserveCase,1073741824),n=[];for(let r=0,a=i.length;r<a;r++)n[r]=t.buildReplaceString(i[r].matches,this._state.preserveCase);const s=new uee(this._editor.getSelection(),i.map(r=>r.range),n);this._executeEditorCommand(\"replaceAll\",s)}selectAllMatches(){if(!this._hasMatches())return;const e=this._decorations.getFindScopes();let i=this._findMatches(e,!1,1073741824).map(s=>new oe(s.range.startLineNumber,s.range.startColumn,s.range.endLineNumber,s.range.endColumn));const n=this._editor.getSelection();for(let s=0,r=i.length;s<r;s++)if(i[s].equalsRange(n)){i=[n].concat(i.slice(0,s)).concat(i.slice(s+1));break}this._editor.setSelections(i)}_executeEditorCommand(e,t){try{this._ignoreModelContentChanged=!0,this._editor.pushUndoStop(),this._editor.executeCommand(e,t),this._editor.pushUndoStop()}finally{this._ignoreModelContentChanged=!1}}}class P1 extends tr{constructor(e,t,i,n){super(),this._hideSoon=this._register(new ft(()=>this._hide(),2e3)),this._isVisible=!1,this._editor=e,this._state=t,this._keybindingService=i,this._domNode=document.createElement(\"div\"),this._domNode.className=\"findOptionsWidget\",this._domNode.style.display=\"none\",this._domNode.style.top=\"10px\",this._domNode.setAttribute(\"role\",\"presentation\"),this._domNode.setAttribute(\"aria-hidden\",\"true\");const s=n.getColorTheme().getColor(Y0),r=n.getColorTheme().getColor(Q0),a=n.getColorTheme().getColor(X0);this.caseSensitive=this._register(new uF({appendTitle:this._keybindingLabelFor(Dt.ToggleCaseSensitiveCommand),isChecked:this._state.matchCase,inputActiveOptionBorder:s,inputActiveOptionForeground:r,inputActiveOptionBackground:a})),this._domNode.appendChild(this.caseSensitive.domNode),this._register(this.caseSensitive.onChange(()=>{this._state.change({matchCase:this.caseSensitive.checked},!1)})),this.wholeWords=this._register(new gF({appendTitle:this._keybindingLabelFor(Dt.ToggleWholeWordCommand),isChecked:this._state.wholeWord,inputActiveOptionBorder:s,inputActiveOptionForeground:r,inputActiveOptionBackground:a})),this._domNode.appendChild(this.wholeWords.domNode),this._register(this.wholeWords.onChange(()=>{this._state.change({wholeWord:this.wholeWords.checked},!1)})),this.regex=this._register(new fF({appendTitle:this._keybindingLabelFor(Dt.ToggleRegexCommand),isChecked:this._state.isRegex,inputActiveOptionBorder:s,inputActiveOptionForeground:r,inputActiveOptionBackground:a})),this._domNode.appendChild(this.regex.domNode),this._register(this.regex.onChange(()=>{this._state.change({isRegex:this.regex.checked},!1)})),this._editor.addOverlayWidget(this),this._register(this._state.onFindReplaceStateChange(l=>{let c=!1;l.isRegex&&(this.regex.checked=this._state.isRegex,c=!0),l.wholeWord&&(this.wholeWords.checked=this._state.wholeWord,c=!0),l.matchCase&&(this.caseSensitive.checked=this._state.matchCase,c=!0),!this._state.isRevealed&&c&&this._revealTemporarily()})),this._register(q(this._domNode,le.MOUSE_LEAVE,l=>this._onMouseLeave())),this._register(q(this._domNode,\"mouseover\",l=>this._onMouseOver())),this._applyTheme(n.getColorTheme()),this._register(n.onDidColorThemeChange(this._applyTheme.bind(this)))}_keybindingLabelFor(e){const t=this._keybindingService.lookupKeybinding(e);return t?` (${t.getLabel()})`:\"\"}dispose(){this._editor.removeOverlayWidget(this),super.dispose()}getId(){return P1.ID}getDomNode(){return this._domNode}getPosition(){return{preference:0}}highlightFindOptions(){this._revealTemporarily()}_revealTemporarily(){this._show(),this._hideSoon.schedule()}_onMouseLeave(){this._hideSoon.schedule()}_onMouseOver(){this._hideSoon.cancel()}_show(){this._isVisible||(this._isVisible=!0,this._domNode.style.display=\"block\")}_hide(){!this._isVisible||(this._isVisible=!1,this._domNode.style.display=\"none\")}_applyTheme(e){const t={inputActiveOptionBorder:e.getColor(Y0),inputActiveOptionForeground:e.getColor(Q0),inputActiveOptionBackground:e.getColor(X0)};this.caseSensitive.style(t),this.wholeWords.style(t),this.regex.style(t)}}P1.ID=\"editor.contrib.findOptionsWidget\";Rt((o,e)=>{const t=o.getColor(ci);t&&e.addRule(`.monaco-editor .findOptionsWidget { background-color: ${t}; }`);const i=o.getColor(Ar);i&&e.addRule(`.monaco-editor .findOptionsWidget { color: ${i}; }`);const n=o.getColor(Tr);n&&e.addRule(`.monaco-editor .findOptionsWidget { box-shadow: 0 0 8px 2px ${n}; }`);const s=o.getColor(Be);s&&e.addRule(`.monaco-editor .findOptionsWidget { border: 2px solid ${s}; }`)});function Ib(o,e){return o===1?!0:o===2?!1:e}class _ee extends z{constructor(){super(),this._onFindReplaceStateChange=this._register(new O),this.onFindReplaceStateChange=this._onFindReplaceStateChange.event,this._searchString=\"\",this._replaceString=\"\",this._isRevealed=!1,this._isReplaceRevealed=!1,this._isRegex=!1,this._isRegexOverride=0,this._wholeWord=!1,this._wholeWordOverride=0,this._matchCase=!1,this._matchCaseOverride=0,this._preserveCase=!1,this._preserveCaseOverride=0,this._searchScope=null,this._matchesPosition=0,this._matchesCount=0,this._currentMatch=null,this._loop=!0,this._isSearching=!1,this._filters=null}get searchString(){return this._searchString}get replaceString(){return this._replaceString}get isRevealed(){return this._isRevealed}get isReplaceRevealed(){return this._isReplaceRevealed}get isRegex(){return Ib(this._isRegexOverride,this._isRegex)}get wholeWord(){return Ib(this._wholeWordOverride,this._wholeWord)}get matchCase(){return Ib(this._matchCaseOverride,this._matchCase)}get preserveCase(){return Ib(this._preserveCaseOverride,this._preserveCase)}get actualIsRegex(){return this._isRegex}get actualWholeWord(){return this._wholeWord}get actualMatchCase(){return this._matchCase}get actualPreserveCase(){return this._preserveCase}get searchScope(){return this._searchScope}get matchesPosition(){return this._matchesPosition}get matchesCount(){return this._matchesCount}get currentMatch(){return this._currentMatch}changeMatchInfo(e,t,i){const n={moveCursor:!1,updateHistory:!1,searchString:!1,replaceString:!1,isRevealed:!1,isReplaceRevealed:!1,isRegex:!1,wholeWord:!1,matchCase:!1,preserveCase:!1,searchScope:!1,matchesPosition:!1,matchesCount:!1,currentMatch:!1,loop:!1,isSearching:!1,filters:!1};let s=!1;t===0&&(e=0),e>t&&(e=t),this._matchesPosition!==e&&(this._matchesPosition=e,n.matchesPosition=!0,s=!0),this._matchesCount!==t&&(this._matchesCount=t,n.matchesCount=!0,s=!0),typeof i!=\"undefined\"&&(L.equalsRange(this._currentMatch,i)||(this._currentMatch=i,n.currentMatch=!0,s=!0)),s&&this._onFindReplaceStateChange.fire(n)}change(e,t,i=!0){var n;const s={moveCursor:t,updateHistory:i,searchString:!1,replaceString:!1,isRevealed:!1,isReplaceRevealed:!1,isRegex:!1,wholeWord:!1,matchCase:!1,preserveCase:!1,searchScope:!1,matchesPosition:!1,matchesCount:!1,currentMatch:!1,loop:!1,isSearching:!1,filters:!1};let r=!1;const a=this.isRegex,l=this.wholeWord,c=this.matchCase,d=this.preserveCase;typeof e.searchString!=\"undefined\"&&this._searchString!==e.searchString&&(this._searchString=e.searchString,s.searchString=!0,r=!0),typeof e.replaceString!=\"undefined\"&&this._replaceString!==e.replaceString&&(this._replaceString=e.replaceString,s.replaceString=!0,r=!0),typeof e.isRevealed!=\"undefined\"&&this._isRevealed!==e.isRevealed&&(this._isRevealed=e.isRevealed,s.isRevealed=!0,r=!0),typeof e.isReplaceRevealed!=\"undefined\"&&this._isReplaceRevealed!==e.isReplaceRevealed&&(this._isReplaceRevealed=e.isReplaceRevealed,s.isReplaceRevealed=!0,r=!0),typeof e.isRegex!=\"undefined\"&&(this._isRegex=e.isRegex),typeof e.wholeWord!=\"undefined\"&&(this._wholeWord=e.wholeWord),typeof e.matchCase!=\"undefined\"&&(this._matchCase=e.matchCase),typeof e.preserveCase!=\"undefined\"&&(this._preserveCase=e.preserveCase),typeof e.searchScope!=\"undefined\"&&(!((n=e.searchScope)===null||n===void 0)&&n.every(h=>{var u;return(u=this._searchScope)===null||u===void 0?void 0:u.some(g=>!L.equalsRange(g,h))})||(this._searchScope=e.searchScope,s.searchScope=!0,r=!0)),typeof e.loop!=\"undefined\"&&this._loop!==e.loop&&(this._loop=e.loop,s.loop=!0,r=!0),typeof e.isSearching!=\"undefined\"&&this._isSearching!==e.isSearching&&(this._isSearching=e.isSearching,s.isSearching=!0,r=!0),typeof e.filters!=\"undefined\"&&(this._filters?this._filters.update(e.filters):this._filters=e.filters,s.filters=!0,r=!0),this._isRegexOverride=typeof e.isRegexOverride!=\"undefined\"?e.isRegexOverride:0,this._wholeWordOverride=typeof e.wholeWordOverride!=\"undefined\"?e.wholeWordOverride:0,this._matchCaseOverride=typeof e.matchCaseOverride!=\"undefined\"?e.matchCaseOverride:0,this._preserveCaseOverride=typeof e.preserveCaseOverride!=\"undefined\"?e.preserveCaseOverride:0,a!==this.isRegex&&(r=!0,s.isRegex=!0),l!==this.wholeWord&&(r=!0,s.wholeWord=!0),c!==this.matchCase&&(r=!0,s.matchCase=!0),d!==this.preserveCase&&(r=!0,s.preserveCase=!0),r&&this._onFindReplaceStateChange.fire(s)}canNavigateBack(){return this.canNavigateInLoop()||this.matchesPosition!==1}canNavigateForward(){return this.canNavigateInLoop()||this.matchesPosition<this.matchesCount}canNavigateInLoop(){return this._loop||this.matchesCount>=Hl}}function hA(o){var e,t;return((e=o.lookupKeybinding(\"history.showPrevious\"))===null||e===void 0?void 0:e.getElectronAccelerator())===\"Up\"&&((t=o.lookupKeybinding(\"history.showNext\"))===null||t===void 0?void 0:t.getElectronAccelerator())===\"Down\"}var bee=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const vee=fi(\"find-selection\",m.selection,p(\"findSelectionIcon\",\"Icon for 'Find in Selection' in the editor find widget.\")),uA=fi(\"find-collapsed\",m.chevronRight,p(\"findCollapsedIcon\",\"Icon to indicate that the editor find widget is collapsed.\")),gA=fi(\"find-expanded\",m.chevronDown,p(\"findExpandedIcon\",\"Icon to indicate that the editor find widget is expanded.\")),Cee=fi(\"find-replace\",m.replace,p(\"findReplaceIcon\",\"Icon for 'Replace' in the editor find widget.\")),wee=fi(\"find-replace-all\",m.replaceAll,p(\"findReplaceAllIcon\",\"Icon for 'Replace All' in the editor find widget.\")),See=fi(\"find-previous-match\",m.arrowUp,p(\"findPreviousMatchIcon\",\"Icon for 'Find Previous' in the editor find widget.\")),yee=fi(\"find-next-match\",m.arrowDown,p(\"findNextMatchIcon\",\"Icon for 'Find Next' in the editor find widget.\")),Lee=p(\"label.find\",\"Find\"),Dee=p(\"placeholder.find\",\"Find\"),kee=p(\"label.previousMatchButton\",\"Previous Match\"),xee=p(\"label.nextMatchButton\",\"Next Match\"),Iee=p(\"label.toggleSelectionFind\",\"Find in Selection\"),Eee=p(\"label.closeButton\",\"Close\"),Nee=p(\"label.replace\",\"Replace\"),Tee=p(\"placeholder.replace\",\"Replace\"),Mee=p(\"label.replaceButton\",\"Replace\"),Aee=p(\"label.replaceAllButton\",\"Replace All\"),Ree=p(\"label.toggleReplaceButton\",\"Toggle Replace\"),Oee=p(\"title.matchesCountLimit\",\"Only the first {0} results are highlighted, but all find operations work on the entire text.\",Hl),Pee=p(\"label.matchesLocation\",\"{0} of {1}\"),fA=p(\"label.noResults\",\"No results\"),dr=419,Fee=275,Bee=Fee-54;let Sf=69;const Wee=33,pA=\"ctrlEnterReplaceAll.windows.donotask\",mA=Ze?256:2048;class HS{constructor(e){this.afterLineNumber=e,this.heightInPx=Wee,this.suppressMouseDown=!1,this.domNode=document.createElement(\"div\"),this.domNode.className=\"dock-find-viewzone\"}}function _A(o,e,t){const i=!!e.match(/\\n/);if(t&&i&&t.selectionStart>0){o.stopPropagation();return}}function bA(o,e,t){const i=!!e.match(/\\n/);if(t&&i&&t.selectionEnd<t.value.length){o.stopPropagation();return}}class F1 extends tr{constructor(e,t,i,n,s,r,a,l,c){super(),this._cachedHeight=null,this._revealTimeouts=[],this._codeEditor=e,this._controller=t,this._state=i,this._contextViewProvider=n,this._keybindingService=s,this._contextKeyService=r,this._storageService=l,this._notificationService=c,this._ctrlEnterReplaceAllWarningPrompted=!!l.getBoolean(pA,0),this._isVisible=!1,this._isReplaceVisible=!1,this._ignoreChangeEvent=!1,this._updateHistoryDelayer=new $r(500),this._register(ze(()=>this._updateHistoryDelayer.cancel())),this._register(this._state.onFindReplaceStateChange(d=>this._onStateChanged(d))),this._buildDomNode(),this._updateButtons(),this._tryUpdateWidgetWidth(),this._findInput.inputBox.layout(),this._register(this._codeEditor.onDidChangeConfiguration(d=>{if(d.hasChanged(83)&&(this._codeEditor.getOption(83)&&this._state.change({isReplaceRevealed:!1},!1),this._updateButtons()),d.hasChanged(133)&&this._tryUpdateWidgetWidth(),d.hasChanged(2)&&this.updateAccessibilitySupport(),d.hasChanged(37)){const h=this._codeEditor.getOption(37).addExtraSpaceOnTop;h&&!this._viewZone&&(this._viewZone=new HS(0),this._showViewZone()),!h&&this._viewZone&&this._removeViewZone()}})),this.updateAccessibilitySupport(),this._register(this._codeEditor.onDidChangeCursorSelection(()=>{this._isVisible&&this._updateToggleSelectionFindButton()})),this._register(this._codeEditor.onDidFocusEditorWidget(()=>bee(this,void 0,void 0,function*(){if(this._isVisible){const d=yield this._controller.getGlobalBufferTerm();d&&d!==this._state.searchString&&(this._state.change({searchString:d},!1),this._findInput.select())}}))),this._findInputFocused=O1.bindTo(r),this._findFocusTracker=this._register(Ad(this._findInput.inputBox.inputElement)),this._register(this._findFocusTracker.onDidFocus(()=>{this._findInputFocused.set(!0),this._updateSearchScope()})),this._register(this._findFocusTracker.onDidBlur(()=>{this._findInputFocused.set(!1)})),this._replaceInputFocused=tN.bindTo(r),this._replaceFocusTracker=this._register(Ad(this._replaceInput.inputBox.inputElement)),this._register(this._replaceFocusTracker.onDidFocus(()=>{this._replaceInputFocused.set(!0),this._updateSearchScope()})),this._register(this._replaceFocusTracker.onDidBlur(()=>{this._replaceInputFocused.set(!1)})),this._codeEditor.addOverlayWidget(this),this._codeEditor.getOption(37).addExtraSpaceOnTop&&(this._viewZone=new HS(0)),this._applyTheme(a.getColorTheme()),this._register(a.onDidColorThemeChange(this._applyTheme.bind(this))),this._register(this._codeEditor.onDidChangeModel(()=>{!this._isVisible||(this._viewZoneId=void 0)})),this._register(this._codeEditor.onDidScrollChange(d=>{if(d.scrollTopChanged){this._layoutViewZone();return}setTimeout(()=>{this._layoutViewZone()},0)}))}getId(){return F1.ID}getDomNode(){return this._domNode}getPosition(){return this._isVisible?{preference:0}:null}_onStateChanged(e){if(e.searchString){try{this._ignoreChangeEvent=!0,this._findInput.setValue(this._state.searchString)}finally{this._ignoreChangeEvent=!1}this._updateButtons()}if(e.replaceString&&(this._replaceInput.inputBox.value=this._state.replaceString),e.isRevealed&&(this._state.isRevealed?this._reveal():this._hide(!0)),e.isReplaceRevealed&&(this._state.isReplaceRevealed?!this._codeEditor.getOption(83)&&!this._isReplaceVisible&&(this._isReplaceVisible=!0,this._replaceInput.width=ro(this._findInput.domNode),this._updateButtons(),this._replaceInput.inputBox.layout()):this._isReplaceVisible&&(this._isReplaceVisible=!1,this._updateButtons())),(e.isRevealed||e.isReplaceRevealed)&&(this._state.isRevealed||this._state.isReplaceRevealed)&&this._tryUpdateHeight()&&this._showViewZone(),e.isRegex&&this._findInput.setRegex(this._state.isRegex),e.wholeWord&&this._findInput.setWholeWords(this._state.wholeWord),e.matchCase&&this._findInput.setCaseSensitive(this._state.matchCase),e.preserveCase&&this._replaceInput.setPreserveCase(this._state.preserveCase),e.searchScope&&(this._state.searchScope?this._toggleSelectionFind.checked=!0:this._toggleSelectionFind.checked=!1,this._updateToggleSelectionFindButton()),e.searchString||e.matchesCount||e.matchesPosition){const t=this._state.searchString.length>0&&this._state.matchesCount===0;this._domNode.classList.toggle(\"no-results\",t),this._updateMatchesCount(),this._updateButtons()}(e.searchString||e.currentMatch)&&this._layoutViewZone(),e.updateHistory&&this._delayedUpdateHistory(),e.loop&&this._updateButtons()}_delayedUpdateHistory(){this._updateHistoryDelayer.trigger(this._updateHistory.bind(this)).then(void 0,Ee)}_updateHistory(){this._state.searchString&&this._findInput.inputBox.addToHistory(),this._state.replaceString&&this._replaceInput.inputBox.addToHistory()}_updateMatchesCount(){this._matchesCount.style.minWidth=Sf+\"px\",this._state.matchesCount>=Hl?this._matchesCount.title=Oee:this._matchesCount.title=\"\",this._matchesCount.firstChild&&this._matchesCount.removeChild(this._matchesCount.firstChild);let e;if(this._state.matchesCount>0){let t=String(this._state.matchesCount);this._state.matchesCount>=Hl&&(t+=\"+\");let i=String(this._state.matchesPosition);i===\"0\"&&(i=\"?\"),e=tg(Pee,i,t)}else e=fA;this._matchesCount.appendChild(document.createTextNode(e)),un(this._getAriaLabel(e,this._state.currentMatch,this._state.searchString)),Sf=Math.max(Sf,this._matchesCount.clientWidth)}_getAriaLabel(e,t,i){if(e===fA)return i===\"\"?p(\"ariaSearchNoResultEmpty\",\"{0} found\",e):p(\"ariaSearchNoResult\",\"{0} found for '{1}'\",e,i);if(t){const n=p(\"ariaSearchNoResultWithLineNum\",\"{0} found for '{1}', at {2}\",e,i,t.startLineNumber+\":\"+t.startColumn),s=this._codeEditor.getModel();return s&&t.startLineNumber<=s.getLineCount()&&t.startLineNumber>=1?`${s.getLineContent(t.startLineNumber)}, ${n}`:n}return p(\"ariaSearchNoResultWithLineNumNoCurrentMatch\",\"{0} found for '{1}'\",e,i)}_updateToggleSelectionFindButton(){const e=this._codeEditor.getSelection(),t=e?e.startLineNumber!==e.endLineNumber||e.startColumn!==e.endColumn:!1,i=this._toggleSelectionFind.checked;this._isVisible&&(i||t)?this._toggleSelectionFind.enable():this._toggleSelectionFind.disable()}_updateButtons(){this._findInput.setEnabled(this._isVisible),this._replaceInput.setEnabled(this._isVisible&&this._isReplaceVisible),this._updateToggleSelectionFindButton(),this._closeBtn.setEnabled(this._isVisible);const e=this._state.searchString.length>0,t=!!this._state.matchesCount;this._prevBtn.setEnabled(this._isVisible&&e&&t&&this._state.canNavigateBack()),this._nextBtn.setEnabled(this._isVisible&&e&&t&&this._state.canNavigateForward()),this._replaceBtn.setEnabled(this._isVisible&&this._isReplaceVisible&&e),this._replaceAllBtn.setEnabled(this._isVisible&&this._isReplaceVisible&&e),this._domNode.classList.toggle(\"replaceToggled\",this._isReplaceVisible),this._toggleReplaceBtn.setExpanded(this._isReplaceVisible);const i=!this._codeEditor.getOption(83);this._toggleReplaceBtn.setEnabled(this._isVisible&&i)}_reveal(){if(this._revealTimeouts.forEach(e=>{clearTimeout(e)}),this._revealTimeouts=[],!this._isVisible){this._isVisible=!0;const e=this._codeEditor.getSelection();switch(this._codeEditor.getOption(37).autoFindInSelection){case\"always\":this._toggleSelectionFind.checked=!0;break;case\"never\":this._toggleSelectionFind.checked=!1;break;case\"multiline\":{const i=!!e&&e.startLineNumber!==e.endLineNumber;this._toggleSelectionFind.checked=i;break}}this._tryUpdateWidgetWidth(),this._updateButtons(),this._revealTimeouts.push(setTimeout(()=>{this._domNode.classList.add(\"visible\"),this._domNode.setAttribute(\"aria-hidden\",\"false\")},0)),this._revealTimeouts.push(setTimeout(()=>{this._findInput.validate()},200)),this._codeEditor.layoutOverlayWidget(this);let t=!0;if(this._codeEditor.getOption(37).seedSearchStringFromSelection&&e){const i=this._codeEditor.getDomNode();if(i){const n=Qi(i),s=this._codeEditor.getScrolledVisiblePosition(e.getStartPosition()),r=n.left+(s?s.left:0),a=s?s.top:0;if(this._viewZone&&a<this._viewZone.heightInPx){e.endLineNumber>e.startLineNumber&&(t=!1);const l=BO(this._domNode).left;r>l&&(t=!1);const c=this._codeEditor.getScrolledVisiblePosition(e.getEndPosition());n.left+(c?c.left:0)>l&&(t=!1)}}}this._showViewZone(t)}}_hide(e){this._revealTimeouts.forEach(t=>{clearTimeout(t)}),this._revealTimeouts=[],this._isVisible&&(this._isVisible=!1,this._updateButtons(),this._domNode.classList.remove(\"visible\"),this._domNode.setAttribute(\"aria-hidden\",\"true\"),this._findInput.clearMessage(),e&&this._codeEditor.focus(),this._codeEditor.layoutOverlayWidget(this),this._removeViewZone())}_layoutViewZone(e){if(!this._codeEditor.getOption(37).addExtraSpaceOnTop){this._removeViewZone();return}if(!this._isVisible)return;const i=this._viewZone;this._viewZoneId!==void 0||!i||this._codeEditor.changeViewZones(n=>{i.heightInPx=this._getHeight(),this._viewZoneId=n.addZone(i),this._codeEditor.setScrollTop(e||this._codeEditor.getScrollTop()+i.heightInPx)})}_showViewZone(e=!0){if(!this._isVisible||!this._codeEditor.getOption(37).addExtraSpaceOnTop)return;this._viewZone===void 0&&(this._viewZone=new HS(0));const i=this._viewZone;this._codeEditor.changeViewZones(n=>{if(this._viewZoneId!==void 0){const s=this._getHeight();if(s===i.heightInPx)return;const r=s-i.heightInPx;i.heightInPx=s,n.layoutZone(this._viewZoneId),e&&this._codeEditor.setScrollTop(this._codeEditor.getScrollTop()+r);return}else{let s=this._getHeight();if(s-=this._codeEditor.getOption(77).top,s<=0)return;i.heightInPx=s,this._viewZoneId=n.addZone(i),e&&this._codeEditor.setScrollTop(this._codeEditor.getScrollTop()+s)}})}_removeViewZone(){this._codeEditor.changeViewZones(e=>{this._viewZoneId!==void 0&&(e.removeZone(this._viewZoneId),this._viewZoneId=void 0,this._viewZone&&(this._codeEditor.setScrollTop(this._codeEditor.getScrollTop()-this._viewZone.heightInPx),this._viewZone=void 0))})}_applyTheme(e){const t={inputActiveOptionBorder:e.getColor(Y0),inputActiveOptionBackground:e.getColor(X0),inputActiveOptionForeground:e.getColor(Q0),inputBackground:e.getColor(ZC),inputForeground:e.getColor(YC),inputBorder:e.getColor(XC),inputValidationInfoBackground:e.getColor(lI),inputValidationInfoForeground:e.getColor(cI),inputValidationInfoBorder:e.getColor(dI),inputValidationWarningBackground:e.getColor(hI),inputValidationWarningForeground:e.getColor(uI),inputValidationWarningBorder:e.getColor(gI),inputValidationErrorBackground:e.getColor(fI),inputValidationErrorForeground:e.getColor(pI),inputValidationErrorBorder:e.getColor(mI)};this._findInput.style(t),this._replaceInput.style(t),this._toggleSelectionFind.style(t)}_tryUpdateWidgetWidth(){if(!this._isVisible||!Vx(this._domNode))return;const e=this._codeEditor.getLayoutInfo();if(e.contentWidth<=0){this._domNode.classList.add(\"hiddenEditor\");return}else this._domNode.classList.contains(\"hiddenEditor\")&&this._domNode.classList.remove(\"hiddenEditor\");const i=e.width,n=e.minimap.minimapWidth;let s=!1,r=!1,a=!1;if(this._resized&&ro(this._domNode)>dr){this._domNode.style.maxWidth=`${i-28-n-15}px`,this._replaceInput.width=ro(this._findInput.domNode);return}if(dr+28+n>=i&&(r=!0),dr+28+n-Sf>=i&&(a=!0),dr+28+n-Sf>=i+50&&(s=!0),this._domNode.classList.toggle(\"collapsed-find-widget\",s),this._domNode.classList.toggle(\"narrow-find-widget\",a),this._domNode.classList.toggle(\"reduced-find-widget\",r),!a&&!s&&(this._domNode.style.maxWidth=`${i-28-n-15}px`),this._resized){this._findInput.inputBox.layout();const l=this._findInput.inputBox.element.clientWidth;l>0&&(this._replaceInput.width=l)}else this._isReplaceVisible&&(this._replaceInput.width=ro(this._findInput.domNode))}_getHeight(){let e=0;return e+=4,e+=this._findInput.inputBox.height+2,this._isReplaceVisible&&(e+=4,e+=this._replaceInput.inputBox.height+2),e+=4,e}_tryUpdateHeight(){const e=this._getHeight();return this._cachedHeight!==null&&this._cachedHeight===e?!1:(this._cachedHeight=e,this._domNode.style.height=`${e}px`,!0)}focusFindInput(){this._findInput.select(),this._findInput.focus()}focusReplaceInput(){this._replaceInput.select(),this._replaceInput.focus()}highlightFindOptions(){this._findInput.highlightFindOptions()}_updateSearchScope(){if(!!this._codeEditor.hasModel()&&this._toggleSelectionFind.checked){const e=this._codeEditor.getSelections();e.map(t=>{t.endColumn===1&&t.endLineNumber>t.startLineNumber&&(t=t.setEndPosition(t.endLineNumber-1,this._codeEditor.getModel().getLineMaxColumn(t.endLineNumber-1)));const i=this._state.currentMatch;return t.startLineNumber!==t.endLineNumber&&!L.equalsRange(t,i)?t:null}).filter(t=>!!t),e.length&&this._state.change({searchScope:e},!0)}}_onFindInputMouseDown(e){e.middleButton&&e.stopPropagation()}_onFindInputKeyDown(e){if(e.equals(mA|3))if(this._keybindingService.dispatchEvent(e,e.target)){e.preventDefault();return}else{this._findInput.inputBox.insertAtCursor(`\n`),e.preventDefault();return}if(e.equals(2)){this._isReplaceVisible?this._replaceInput.focus():this._findInput.focusOnCaseSensitive(),e.preventDefault();return}if(e.equals(2066)){this._codeEditor.focus(),e.preventDefault();return}if(e.equals(16))return _A(e,this._findInput.getValue(),this._findInput.domNode.querySelector(\"textarea\"));if(e.equals(18))return bA(e,this._findInput.getValue(),this._findInput.domNode.querySelector(\"textarea\"))}_onReplaceInputKeyDown(e){if(e.equals(mA|3))if(this._keybindingService.dispatchEvent(e,e.target)){e.preventDefault();return}else{nn&&Uo&&!this._ctrlEnterReplaceAllWarningPrompted&&(this._notificationService.info(p(\"ctrlEnter.keybindingChanged\",\"Ctrl+Enter now inserts line break instead of replacing all. You can modify the keybinding for editor.action.replaceAll to override this behavior.\")),this._ctrlEnterReplaceAllWarningPrompted=!0,this._storageService.store(pA,!0,0,0)),this._replaceInput.inputBox.insertAtCursor(`\n`),e.preventDefault();return}if(e.equals(2)){this._findInput.focusOnCaseSensitive(),e.preventDefault();return}if(e.equals(1026)){this._findInput.focus(),e.preventDefault();return}if(e.equals(2066)){this._codeEditor.focus(),e.preventDefault();return}if(e.equals(16))return _A(e,this._replaceInput.inputBox.value,this._replaceInput.inputBox.element.querySelector(\"textarea\"));if(e.equals(18))return bA(e,this._replaceInput.inputBox.value,this._replaceInput.inputBox.element.querySelector(\"textarea\"))}getVerticalSashLeft(e){return 0}_keybindingLabelFor(e){const t=this._keybindingService.lookupKeybinding(e);return t?` (${t.getLabel()})`:\"\"}_buildDomNode(){this._findInput=this._register(new ZL(null,this._contextViewProvider,{width:Bee,label:Lee,placeholder:Dee,appendCaseSensitiveLabel:this._keybindingLabelFor(Dt.ToggleCaseSensitiveCommand),appendWholeWordsLabel:this._keybindingLabelFor(Dt.ToggleWholeWordCommand),appendRegexLabel:this._keybindingLabelFor(Dt.ToggleRegexCommand),validation:l=>{if(l.length===0||!this._findInput.getRegex())return null;try{return new RegExp(l,\"gu\"),null}catch(c){return{content:c.message}}},flexibleHeight:!0,flexibleWidth:!0,flexibleMaxHeight:118,showHistoryHint:()=>hA(this._keybindingService)},this._contextKeyService,!0)),this._findInput.setRegex(!!this._state.isRegex),this._findInput.setCaseSensitive(!!this._state.matchCase),this._findInput.setWholeWords(!!this._state.wholeWord),this._register(this._findInput.onKeyDown(l=>this._onFindInputKeyDown(l))),this._register(this._findInput.inputBox.onDidChange(()=>{this._ignoreChangeEvent||this._state.change({searchString:this._findInput.getValue()},!0)})),this._register(this._findInput.onDidOptionChange(()=>{this._state.change({isRegex:this._findInput.getRegex(),wholeWord:this._findInput.getWholeWords(),matchCase:this._findInput.getCaseSensitive()},!0)})),this._register(this._findInput.onCaseSensitiveKeyDown(l=>{l.equals(1026)&&this._isReplaceVisible&&(this._replaceInput.focus(),l.preventDefault())})),this._register(this._findInput.onRegexKeyDown(l=>{l.equals(2)&&this._isReplaceVisible&&(this._replaceInput.focusOnPreserve(),l.preventDefault())})),this._register(this._findInput.inputBox.onDidHeightChange(l=>{this._tryUpdateHeight()&&this._showViewZone()})),sn&&this._register(this._findInput.onMouseDown(l=>this._onFindInputMouseDown(l))),this._matchesCount=document.createElement(\"div\"),this._matchesCount.className=\"matchesCount\",this._updateMatchesCount(),this._prevBtn=this._register(new jh({label:kee+this._keybindingLabelFor(Dt.PreviousMatchFindAction),icon:See,onTrigger:()=>{this._codeEditor.getAction(Dt.PreviousMatchFindAction).run().then(void 0,Ee)}})),this._nextBtn=this._register(new jh({label:xee+this._keybindingLabelFor(Dt.NextMatchFindAction),icon:yee,onTrigger:()=>{this._codeEditor.getAction(Dt.NextMatchFindAction).run().then(void 0,Ee)}}));const i=document.createElement(\"div\");i.className=\"find-part\",i.appendChild(this._findInput.domNode);const n=document.createElement(\"div\");n.className=\"find-actions\",i.appendChild(n),n.appendChild(this._matchesCount),n.appendChild(this._prevBtn.domNode),n.appendChild(this._nextBtn.domNode),this._toggleSelectionFind=this._register(new h_({icon:vee,title:Iee+this._keybindingLabelFor(Dt.ToggleSearchScopeCommand),isChecked:!1})),this._register(this._toggleSelectionFind.onChange(()=>{if(this._toggleSelectionFind.checked){if(this._codeEditor.hasModel()){const l=this._codeEditor.getSelections();l.map(c=>(c.endColumn===1&&c.endLineNumber>c.startLineNumber&&(c=c.setEndPosition(c.endLineNumber-1,this._codeEditor.getModel().getLineMaxColumn(c.endLineNumber-1))),c.isEmpty()?null:c)).filter(c=>!!c),l.length&&this._state.change({searchScope:l},!0)}}else this._state.change({searchScope:null},!0)})),n.appendChild(this._toggleSelectionFind.domNode),this._closeBtn=this._register(new jh({label:Eee+this._keybindingLabelFor(Dt.CloseFindWidgetCommand),icon:b5,onTrigger:()=>{this._state.change({isRevealed:!1,searchScope:null},!1)},onKeyDown:l=>{l.equals(2)&&this._isReplaceVisible&&(this._replaceBtn.isEnabled()?this._replaceBtn.focus():this._codeEditor.focus(),l.preventDefault())}})),n.appendChild(this._closeBtn.domNode),this._replaceInput=this._register(new YL(null,void 0,{label:Nee,placeholder:Tee,appendPreserveCaseLabel:this._keybindingLabelFor(Dt.TogglePreserveCaseCommand),history:[],flexibleHeight:!0,flexibleWidth:!0,flexibleMaxHeight:118,showHistoryHint:()=>hA(this._keybindingService)},this._contextKeyService,!0)),this._replaceInput.setPreserveCase(!!this._state.preserveCase),this._register(this._replaceInput.onKeyDown(l=>this._onReplaceInputKeyDown(l))),this._register(this._replaceInput.inputBox.onDidChange(()=>{this._state.change({replaceString:this._replaceInput.inputBox.value},!1)})),this._register(this._replaceInput.inputBox.onDidHeightChange(l=>{this._isReplaceVisible&&this._tryUpdateHeight()&&this._showViewZone()})),this._register(this._replaceInput.onDidOptionChange(()=>{this._state.change({preserveCase:this._replaceInput.getPreserveCase()},!0)})),this._register(this._replaceInput.onPreserveCaseKeyDown(l=>{l.equals(2)&&(this._prevBtn.isEnabled()?this._prevBtn.focus():this._nextBtn.isEnabled()?this._nextBtn.focus():this._toggleSelectionFind.enabled?this._toggleSelectionFind.focus():this._closeBtn.isEnabled()&&this._closeBtn.focus(),l.preventDefault())})),this._replaceBtn=this._register(new jh({label:Mee+this._keybindingLabelFor(Dt.ReplaceOneAction),icon:Cee,onTrigger:()=>{this._controller.replace()},onKeyDown:l=>{l.equals(1026)&&(this._closeBtn.focus(),l.preventDefault())}})),this._replaceAllBtn=this._register(new jh({label:Aee+this._keybindingLabelFor(Dt.ReplaceAllAction),icon:wee,onTrigger:()=>{this._controller.replaceAll()}}));const s=document.createElement(\"div\");s.className=\"replace-part\",s.appendChild(this._replaceInput.domNode);const r=document.createElement(\"div\");r.className=\"replace-actions\",s.appendChild(r),r.appendChild(this._replaceBtn.domNode),r.appendChild(this._replaceAllBtn.domNode),this._toggleReplaceBtn=this._register(new jh({label:Ree,className:\"codicon toggle left\",onTrigger:()=>{this._state.change({isReplaceRevealed:!this._isReplaceVisible},!1),this._isReplaceVisible&&(this._replaceInput.width=ro(this._findInput.domNode),this._replaceInput.inputBox.layout()),this._showViewZone()}})),this._toggleReplaceBtn.setExpanded(this._isReplaceVisible),this._domNode=document.createElement(\"div\"),this._domNode.className=\"editor-widget find-widget\",this._domNode.setAttribute(\"aria-hidden\",\"true\"),this._domNode.style.width=`${dr}px`,this._domNode.appendChild(this._toggleReplaceBtn.domNode),this._domNode.appendChild(i),this._domNode.appendChild(s),this._resizeSash=new Zi(this._domNode,this,{orientation:0,size:2}),this._resized=!1;let a=dr;this._register(this._resizeSash.onDidStart(()=>{a=ro(this._domNode)})),this._register(this._resizeSash.onDidChange(l=>{this._resized=!0;const c=a+l.startX-l.currentX;if(c<dr)return;const d=parseFloat(SC(this._domNode).maxWidth)||0;c>d||(this._domNode.style.width=`${c}px`,this._isReplaceVisible&&(this._replaceInput.width=ro(this._findInput.domNode)),this._findInput.inputBox.layout(),this._tryUpdateHeight())})),this._register(this._resizeSash.onDidReset(()=>{const l=ro(this._domNode);if(l<dr)return;let c=dr;if(!this._resized||l===dr){const d=this._codeEditor.getLayoutInfo();c=d.width-28-d.minimap.minimapWidth-15,this._resized=!0}this._domNode.style.width=`${c}px`,this._isReplaceVisible&&(this._replaceInput.width=ro(this._findInput.domNode)),this._findInput.inputBox.layout()}))}updateAccessibilitySupport(){const e=this._codeEditor.getOption(2);this._findInput.setFocusInputOnOptionClick(e!==2)}}F1.ID=\"editor.contrib.findWidget\";class jh extends tr{constructor(e){super(),this._opts=e;let t=\"button\";this._opts.className&&(t=t+\" \"+this._opts.className),this._opts.icon&&(t=t+\" \"+nt.asClassName(this._opts.icon)),this._domNode=document.createElement(\"div\"),this._domNode.title=this._opts.label,this._domNode.tabIndex=0,this._domNode.className=t,this._domNode.setAttribute(\"role\",\"button\"),this._domNode.setAttribute(\"aria-label\",this._opts.label),this.onclick(this._domNode,i=>{this._opts.onTrigger(),i.preventDefault()}),this.onkeydown(this._domNode,i=>{var n,s;if(i.equals(10)||i.equals(3)){this._opts.onTrigger(),i.preventDefault();return}(s=(n=this._opts).onKeyDown)===null||s===void 0||s.call(n,i)})}get domNode(){return this._domNode}isEnabled(){return this._domNode.tabIndex>=0}focus(){this._domNode.focus()}setEnabled(e){this._domNode.classList.toggle(\"disabled\",!e),this._domNode.setAttribute(\"aria-disabled\",String(!e)),this._domNode.tabIndex=e?0:-1}setExpanded(e){this._domNode.setAttribute(\"aria-expanded\",String(!!e)),e?(this._domNode.classList.remove(...nt.asClassNameArray(uA)),this._domNode.classList.add(...nt.asClassNameArray(gA))):(this._domNode.classList.remove(...nt.asClassNameArray(gA)),this._domNode.classList.add(...nt.asClassNameArray(uA)))}}Rt((o,e)=>{const t=(f,_)=>{_&&e.addRule(`.monaco-editor ${f} { background-color: ${_}; }`)};t(\".findMatch\",o.getColor(Ba)),t(\".currentFindMatch\",o.getColor(VH)),t(\".findScope\",o.getColor(HH));const i=o.getColor(ci);t(\".find-widget\",i);const n=o.getColor(Tr);n&&e.addRule(`.monaco-editor .find-widget { box-shadow: 0 0 8px 2px ${n}; }`);const s=o.getColor(cd);s&&e.addRule(`.monaco-editor .findMatch { border: 1px ${yn(o.type)?\"dotted\":\"solid\"} ${s}; box-sizing: border-box; }`);const r=o.getColor(zH);r&&e.addRule(`.monaco-editor .currentFindMatch { border: 2px solid ${r}; padding: 1px; box-sizing: border-box; }`);const a=o.getColor(UH);a&&e.addRule(`.monaco-editor .findScope { border: 1px ${yn(o.type)?\"dashed\":\"solid\"} ${a}; }`);const l=o.getColor(Be);l&&e.addRule(`.monaco-editor .find-widget { border: 1px solid ${l}; }`);const c=o.getColor(Ar);c&&e.addRule(`.monaco-editor .find-widget { color: ${c}; }`);const d=o.getColor(wH);d&&e.addRule(`.monaco-editor .find-widget.no-results .matchesCount { color: ${d}; }`);const h=o.getColor(EH);if(h)e.addRule(`.monaco-editor .find-widget .monaco-sash { background-color: ${h}; }`);else{const f=o.getColor(Pa);f&&e.addRule(`.monaco-editor .find-widget .monaco-sash { background-color: ${f}; }`)}const u=o.getColor(jy);u&&e.addRule(`\n\t\t.monaco-editor .find-widget .button:not(.disabled):hover,\n\t\t.monaco-editor .find-widget .codicon-find-selection:hover {\n\t\t\tbackground-color: ${u} !important;\n\t\t}\n\t`);const g=o.getColor(Hs);g&&e.addRule(`.monaco-editor .find-widget .monaco-inputbox.synthetic-focus { outline-color: ${g}; }`)});var w3=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},_r=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},th=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const Vee=524288;function dD(o,e=\"single\",t=!1){if(!o.hasModel())return null;const i=o.getSelection();if(e===\"single\"&&i.startLineNumber===i.endLineNumber||e===\"multiple\"){if(i.isEmpty()){const n=o.getConfiguredWordAtPosition(i.getStartPosition());if(n&&t===!1)return n.word}else if(o.getModel().getValueLengthInRange(i)<Vee)return o.getModel().getValueInRange(i)}return null}let as=class S3 extends z{constructor(e,t,i,n){super(),this._editor=e,this._findWidgetVisible=Ic.bindTo(t),this._contextKeyService=t,this._storageService=i,this._clipboardService=n,this._updateHistoryDelayer=new $r(500),this._state=this._register(new _ee),this.loadQueryState(),this._register(this._state.onFindReplaceStateChange(s=>this._onStateChanged(s))),this._model=null,this._register(this._editor.onDidChangeModel(()=>{const s=this._editor.getModel()&&this._state.isRevealed;this.disposeModel(),this._state.change({searchScope:null,matchCase:this._storageService.getBoolean(\"editor.matchCase\",1,!1),wholeWord:this._storageService.getBoolean(\"editor.wholeWord\",1,!1),isRegex:this._storageService.getBoolean(\"editor.isRegex\",1,!1),preserveCase:this._storageService.getBoolean(\"editor.preserveCase\",1,!1)},!1),s&&this._start({forceRevealReplace:!1,seedSearchStringFromSelection:\"none\",seedSearchStringFromNonEmptySelection:!1,seedSearchStringFromGlobalClipboard:!1,shouldFocus:0,shouldAnimate:!1,updateSearchScope:!1,loop:this._editor.getOption(37).loop})}))}get editor(){return this._editor}static get(e){return e.getContribution(S3.ID)}dispose(){this.disposeModel(),super.dispose()}disposeModel(){this._model&&(this._model.dispose(),this._model=null)}_onStateChanged(e){this.saveQueryState(e),e.isRevealed&&(this._state.isRevealed?this._findWidgetVisible.set(!0):(this._findWidgetVisible.reset(),this.disposeModel())),e.searchString&&this.setGlobalBufferTerm(this._state.searchString)}saveQueryState(e){e.isRegex&&this._storageService.store(\"editor.isRegex\",this._state.actualIsRegex,1,0),e.wholeWord&&this._storageService.store(\"editor.wholeWord\",this._state.actualWholeWord,1,0),e.matchCase&&this._storageService.store(\"editor.matchCase\",this._state.actualMatchCase,1,0),e.preserveCase&&this._storageService.store(\"editor.preserveCase\",this._state.actualPreserveCase,1,0)}loadQueryState(){this._state.change({matchCase:this._storageService.getBoolean(\"editor.matchCase\",1,this._state.matchCase),wholeWord:this._storageService.getBoolean(\"editor.wholeWord\",1,this._state.wholeWord),isRegex:this._storageService.getBoolean(\"editor.isRegex\",1,this._state.isRegex),preserveCase:this._storageService.getBoolean(\"editor.preserveCase\",1,this._state.preserveCase)},!1)}isFindInputFocused(){return!!O1.getValue(this._contextKeyService)}getState(){return this._state}closeFindWidget(){this._state.change({isRevealed:!1,searchScope:null},!1),this._editor.focus()}toggleCaseSensitive(){this._state.change({matchCase:!this._state.matchCase},!1),this._state.isRevealed||this.highlightFindOptions()}toggleWholeWords(){this._state.change({wholeWord:!this._state.wholeWord},!1),this._state.isRevealed||this.highlightFindOptions()}toggleRegex(){this._state.change({isRegex:!this._state.isRegex},!1),this._state.isRevealed||this.highlightFindOptions()}togglePreserveCase(){this._state.change({preserveCase:!this._state.preserveCase},!1),this._state.isRevealed||this.highlightFindOptions()}toggleSearchScope(){if(this._state.searchScope)this._state.change({searchScope:null},!0);else if(this._editor.hasModel()){const e=this._editor.getSelections();e.map(t=>(t.endColumn===1&&t.endLineNumber>t.startLineNumber&&(t=t.setEndPosition(t.endLineNumber-1,this._editor.getModel().getLineMaxColumn(t.endLineNumber-1))),t.isEmpty()?null:t)).filter(t=>!!t),e.length&&this._state.change({searchScope:e},!0)}}setSearchString(e){this._state.isRegex&&(e=Ds(e)),this._state.change({searchString:e},!1)}highlightFindOptions(e=!1){}_start(e,t){return th(this,void 0,void 0,function*(){if(this.disposeModel(),!this._editor.hasModel())return;const i=Object.assign(Object.assign({},t),{isRevealed:!0});if(e.seedSearchStringFromSelection===\"single\"){const n=dD(this._editor,e.seedSearchStringFromSelection,e.seedSearchStringFromNonEmptySelection);n&&(this._state.isRegex?i.searchString=Ds(n):i.searchString=n)}else if(e.seedSearchStringFromSelection===\"multiple\"&&!e.updateSearchScope){const n=dD(this._editor,e.seedSearchStringFromSelection);n&&(i.searchString=n)}if(!i.searchString&&e.seedSearchStringFromGlobalClipboard){const n=yield this.getGlobalBufferTerm();if(!this._editor.hasModel())return;n&&(i.searchString=n)}if(e.forceRevealReplace||i.isReplaceRevealed?i.isReplaceRevealed=!0:this._findWidgetVisible.get()||(i.isReplaceRevealed=!1),e.updateSearchScope){const n=this._editor.getSelections();n.some(s=>!s.isEmpty())&&(i.searchScope=n)}i.loop=e.loop,this._state.change(i,!1),this._model||(this._model=new pp(this._editor,this._state))})}start(e,t){return this._start(e,t)}moveToNextMatch(){return this._model?(this._model.moveToNextMatch(),!0):!1}moveToPrevMatch(){return this._model?(this._model.moveToPrevMatch(),!0):!1}replace(){return this._model?(this._model.replace(),!0):!1}replaceAll(){return this._model?(this._model.replaceAll(),!0):!1}selectAllMatches(){return this._model?(this._model.selectAllMatches(),this._editor.focus(),!0):!1}getGlobalBufferTerm(){return th(this,void 0,void 0,function*(){return this._editor.getOption(37).globalFindClipboard&&this._editor.hasModel()&&!this._editor.getModel().isTooLargeForSyncing()?this._clipboardService.readFindText():\"\"})}setGlobalBufferTerm(e){this._editor.getOption(37).globalFindClipboard&&this._editor.hasModel()&&!this._editor.getModel().isTooLargeForSyncing()&&this._clipboardService.writeFindText(e)}};as.ID=\"editor.contrib.findController\";as=w3([_r(1,xe),_r(2,ia),_r(3,dl)],as);let hD=class extends as{constructor(e,t,i,n,s,r,a,l){super(e,i,a,l),this._contextViewService=t,this._keybindingService=n,this._themeService=s,this._notificationService=r,this._widget=null,this._findOptionsWidget=null}_start(e,t){const i=Object.create(null,{_start:{get:()=>super._start}});return th(this,void 0,void 0,function*(){this._widget||this._createFindWidget();const n=this._editor.getSelection();let s=!1;switch(this._editor.getOption(37).autoFindInSelection){case\"always\":s=!0;break;case\"never\":s=!1;break;case\"multiline\":{s=!!n&&n.startLineNumber!==n.endLineNumber;break}}e.updateSearchScope=e.updateSearchScope||s,yield i._start.call(this,e,t),this._widget&&(e.shouldFocus===2?this._widget.focusReplaceInput():e.shouldFocus===1&&this._widget.focusFindInput())})}highlightFindOptions(e=!1){this._widget||this._createFindWidget(),this._state.isRevealed&&!e?this._widget.highlightFindOptions():this._findOptionsWidget.highlightFindOptions()}_createFindWidget(){this._widget=this._register(new F1(this._editor,this,this._state,this._contextViewService,this._keybindingService,this._contextKeyService,this._themeService,this._storageService,this._notificationService)),this._findOptionsWidget=this._register(new P1(this._editor,this._state,this._keybindingService,this._themeService))}};hD=w3([_r(1,Ch),_r(2,xe),_r(3,rn),_r(4,vt),_r(5,gi),_r(6,ia),_r(7,dl)],hD);const Hee=aP(new rP({id:Dt.StartFindAction,label:p(\"startFindAction\",\"Find\"),alias:\"Find\",precondition:re.or(T.focus,re.has(\"editorIsOpen\")),kbOpts:{kbExpr:null,primary:2084,weight:100},menuOpts:{menuId:A.MenubarEditMenu,group:\"3_find\",title:p({key:\"miFind\",comment:[\"&& denotes a mnemonic\"]},\"&&Find\"),order:1}}));Hee.addImplementation(0,(o,e,t)=>{const i=as.get(e);return i?i.start({forceRevealReplace:!1,seedSearchStringFromSelection:e.getOption(37).seedSearchStringFromSelection!==\"never\"?\"single\":\"none\",seedSearchStringFromNonEmptySelection:e.getOption(37).seedSearchStringFromSelection===\"selection\",seedSearchStringFromGlobalClipboard:e.getOption(37).globalFindClipboard,shouldFocus:1,shouldAnimate:!0,updateSearchScope:!1,loop:e.getOption(37).loop}):!1});const zee={description:\"Open a new In-Editor Find Widget.\",args:[{name:\"Open a new In-Editor Find Widget args\",schema:{properties:{searchString:{type:\"string\"},replaceString:{type:\"string\"},regex:{type:\"boolean\"},regexOverride:{type:\"number\",description:p(\"actions.find.isRegexOverride\",`Overrides \"Use Regular Expression\" flag.\nThe flag will not be saved for the future.\n0: Do Nothing\n1: True\n2: False`)},wholeWord:{type:\"boolean\"},wholeWordOverride:{type:\"number\",description:p(\"actions.find.wholeWordOverride\",`Overrides \"Match Whole Word\" flag.\nThe flag will not be saved for the future.\n0: Do Nothing\n1: True\n2: False`)},matchCase:{type:\"boolean\"},matchCaseOverride:{type:\"number\",description:p(\"actions.find.matchCaseOverride\",`Overrides \"Math Case\" flag.\nThe flag will not be saved for the future.\n0: Do Nothing\n1: True\n2: False`)},preserveCase:{type:\"boolean\"},preserveCaseOverride:{type:\"number\",description:p(\"actions.find.preserveCaseOverride\",`Overrides \"Preserve Case\" flag.\nThe flag will not be saved for the future.\n0: Do Nothing\n1: True\n2: False`)},findInSelection:{type:\"boolean\"}}}}]};class Uee extends he{constructor(){super({id:Dt.StartFindWithArgs,label:p(\"startFindWithArgsAction\",\"Find With Arguments\"),alias:\"Find With Arguments\",precondition:void 0,kbOpts:{kbExpr:null,primary:0,weight:100},description:zee})}run(e,t,i){return th(this,void 0,void 0,function*(){const n=as.get(t);if(n){const s=i?{searchString:i.searchString,replaceString:i.replaceString,isReplaceRevealed:i.replaceString!==void 0,isRegex:i.isRegex,wholeWord:i.matchWholeWord,matchCase:i.isCaseSensitive,preserveCase:i.preserveCase}:{};yield n.start({forceRevealReplace:!1,seedSearchStringFromSelection:n.getState().searchString.length===0&&t.getOption(37).seedSearchStringFromSelection!==\"never\"?\"single\":\"none\",seedSearchStringFromNonEmptySelection:t.getOption(37).seedSearchStringFromSelection===\"selection\",seedSearchStringFromGlobalClipboard:!0,shouldFocus:1,shouldAnimate:!0,updateSearchScope:(i==null?void 0:i.findInSelection)||!1,loop:t.getOption(37).loop},s),n.setGlobalBufferTerm(n.getState().searchString)}})}}class $ee extends he{constructor(){super({id:Dt.StartFindWithSelection,label:p(\"startFindWithSelectionAction\",\"Find With Selection\"),alias:\"Find With Selection\",precondition:void 0,kbOpts:{kbExpr:null,primary:0,mac:{primary:2083},weight:100}})}run(e,t){return th(this,void 0,void 0,function*(){const i=as.get(t);i&&(yield i.start({forceRevealReplace:!1,seedSearchStringFromSelection:\"multiple\",seedSearchStringFromNonEmptySelection:!1,seedSearchStringFromGlobalClipboard:!1,shouldFocus:0,shouldAnimate:!0,updateSearchScope:!1,loop:t.getOption(37).loop}),i.setGlobalBufferTerm(i.getState().searchString))})}}class y3 extends he{run(e,t){return th(this,void 0,void 0,function*(){const i=as.get(t);i&&!this._run(i)&&(yield i.start({forceRevealReplace:!1,seedSearchStringFromSelection:i.getState().searchString.length===0&&t.getOption(37).seedSearchStringFromSelection!==\"never\"?\"single\":\"none\",seedSearchStringFromNonEmptySelection:t.getOption(37).seedSearchStringFromSelection===\"selection\",seedSearchStringFromGlobalClipboard:!0,shouldFocus:0,shouldAnimate:!0,updateSearchScope:!1,loop:t.getOption(37).loop}),this._run(i))})}}class jee extends y3{constructor(){super({id:Dt.NextMatchFindAction,label:p(\"findNextMatchAction\",\"Find Next\"),alias:\"Find Next\",precondition:void 0,kbOpts:[{kbExpr:T.focus,primary:61,mac:{primary:2085,secondary:[61]},weight:100},{kbExpr:re.and(T.focus,O1),primary:3,weight:100}]})}_run(e){return e.moveToNextMatch()?(e.editor.pushUndoStop(),!0):!1}}class Kee extends y3{constructor(){super({id:Dt.PreviousMatchFindAction,label:p(\"findPreviousMatchAction\",\"Find Previous\"),alias:\"Find Previous\",precondition:void 0,kbOpts:[{kbExpr:T.focus,primary:1085,mac:{primary:3109,secondary:[1085]},weight:100},{kbExpr:re.and(T.focus,O1),primary:1027,weight:100}]})}_run(e){return e.moveToPrevMatch()}}class L3 extends he{run(e,t){return th(this,void 0,void 0,function*(){const i=as.get(t);if(!i)return;const n=t.getOption(37).seedSearchStringFromSelection===\"selection\";let s=null;t.getOption(37).seedSearchStringFromSelection!==\"never\"&&(s=dD(t,\"single\",n)),s&&i.setSearchString(s),this._run(i)||(yield i.start({forceRevealReplace:!1,seedSearchStringFromSelection:t.getOption(37).seedSearchStringFromSelection!==\"never\"?\"single\":\"none\",seedSearchStringFromNonEmptySelection:n,seedSearchStringFromGlobalClipboard:!1,shouldFocus:0,shouldAnimate:!0,updateSearchScope:!1,loop:t.getOption(37).loop}),this._run(i))})}}class qee extends L3{constructor(){super({id:Dt.NextSelectionMatchFindAction,label:p(\"nextSelectionMatchFindAction\",\"Find Next Selection\"),alias:\"Find Next Selection\",precondition:void 0,kbOpts:{kbExpr:T.focus,primary:2109,weight:100}})}_run(e){return e.moveToNextMatch()}}class Gee extends L3{constructor(){super({id:Dt.PreviousSelectionMatchFindAction,label:p(\"previousSelectionMatchFindAction\",\"Find Previous Selection\"),alias:\"Find Previous Selection\",precondition:void 0,kbOpts:{kbExpr:T.focus,primary:3133,weight:100}})}_run(e){return e.moveToPrevMatch()}}const Zee=aP(new rP({id:Dt.StartFindReplaceAction,label:p(\"startReplace\",\"Replace\"),alias:\"Replace\",precondition:re.or(T.focus,re.has(\"editorIsOpen\")),kbOpts:{kbExpr:null,primary:2086,mac:{primary:2596},weight:100},menuOpts:{menuId:A.MenubarEditMenu,group:\"3_find\",title:p({key:\"miReplace\",comment:[\"&& denotes a mnemonic\"]},\"&&Replace\"),order:2}}));Zee.addImplementation(0,(o,e,t)=>{if(!e.hasModel()||e.getOption(83))return!1;const i=as.get(e);if(!i)return!1;const n=e.getSelection(),s=i.isFindInputFocused(),r=!n.isEmpty()&&n.startLineNumber===n.endLineNumber&&e.getOption(37).seedSearchStringFromSelection!==\"never\"&&!s,a=s||r?2:1;return i.start({forceRevealReplace:!0,seedSearchStringFromSelection:r?\"single\":\"none\",seedSearchStringFromNonEmptySelection:e.getOption(37).seedSearchStringFromSelection===\"selection\",seedSearchStringFromGlobalClipboard:e.getOption(37).seedSearchStringFromSelection!==\"never\",shouldFocus:a,shouldAnimate:!0,updateSearchScope:!1,loop:e.getOption(37).loop})});rt(as.ID,hD);te(Uee);te($ee);te(jee);te(Kee);te(qee);te(Gee);const sr=ji.bindToContribution(as.get);Q(new sr({id:Dt.CloseFindWidgetCommand,precondition:Ic,handler:o=>o.closeFindWidget(),kbOpts:{weight:100+5,kbExpr:re.and(T.focus,re.not(\"isComposing\")),primary:9,secondary:[1033]}}));Q(new sr({id:Dt.ToggleCaseSensitiveCommand,precondition:void 0,handler:o=>o.toggleCaseSensitive(),kbOpts:{weight:100+5,kbExpr:T.focus,primary:yb.primary,mac:yb.mac,win:yb.win,linux:yb.linux}}));Q(new sr({id:Dt.ToggleWholeWordCommand,precondition:void 0,handler:o=>o.toggleWholeWords(),kbOpts:{weight:100+5,kbExpr:T.focus,primary:Lb.primary,mac:Lb.mac,win:Lb.win,linux:Lb.linux}}));Q(new sr({id:Dt.ToggleRegexCommand,precondition:void 0,handler:o=>o.toggleRegex(),kbOpts:{weight:100+5,kbExpr:T.focus,primary:Db.primary,mac:Db.mac,win:Db.win,linux:Db.linux}}));Q(new sr({id:Dt.ToggleSearchScopeCommand,precondition:void 0,handler:o=>o.toggleSearchScope(),kbOpts:{weight:100+5,kbExpr:T.focus,primary:kb.primary,mac:kb.mac,win:kb.win,linux:kb.linux}}));Q(new sr({id:Dt.TogglePreserveCaseCommand,precondition:void 0,handler:o=>o.togglePreserveCase(),kbOpts:{weight:100+5,kbExpr:T.focus,primary:xb.primary,mac:xb.mac,win:xb.win,linux:xb.linux}}));Q(new sr({id:Dt.ReplaceOneAction,precondition:Ic,handler:o=>o.replace(),kbOpts:{weight:100+5,kbExpr:T.focus,primary:3094}}));Q(new sr({id:Dt.ReplaceOneAction,precondition:Ic,handler:o=>o.replace(),kbOpts:{weight:100+5,kbExpr:re.and(T.focus,tN),primary:3}}));Q(new sr({id:Dt.ReplaceAllAction,precondition:Ic,handler:o=>o.replaceAll(),kbOpts:{weight:100+5,kbExpr:T.focus,primary:2563}}));Q(new sr({id:Dt.ReplaceAllAction,precondition:Ic,handler:o=>o.replaceAll(),kbOpts:{weight:100+5,kbExpr:re.and(T.focus,tN),primary:void 0,mac:{primary:2051}}}));Q(new sr({id:Dt.SelectAllMatchesAction,precondition:Ic,handler:o=>o.selectAllMatches(),kbOpts:{weight:100+5,kbExpr:T.focus,primary:515}}));const vA=65535,Mo=16777215,CA=4278190080;class zS{constructor(e){const t=Math.ceil(e/32);this._states=new Uint32Array(t)}get(e){const t=e/32|0,i=e%32;return(this._states[t]&1<<i)!==0}set(e,t){const i=e/32|0,n=e%32,s=this._states[i];t?this._states[i]=s|1<<n:this._states[i]=s&~(1<<n)}}class ms{constructor(e,t,i){if(this.sourceAbbr={[0]:\" \",[1]:\"u\",[2]:\"r\"},e.length!==t.length||e.length>vA)throw new Error(\"invalid startIndexes or endIndexes size\");this._startIndexes=e,this._endIndexes=t,this._collapseStates=new zS(e.length),this._userDefinedStates=new zS(e.length),this._recoveredStates=new zS(e.length),this._types=i,this._parentsComputed=!1}ensureParentIndices(){if(!this._parentsComputed){this._parentsComputed=!0;const e=[],t=(i,n)=>{const s=e[e.length-1];return this.getStartLineNumber(s)<=i&&this.getEndLineNumber(s)>=n};for(let i=0,n=this._startIndexes.length;i<n;i++){const s=this._startIndexes[i],r=this._endIndexes[i];if(s>Mo||r>Mo)throw new Error(\"startLineNumber or endLineNumber must not exceed \"+Mo);for(;e.length>0&&!t(s,r);)e.pop();const a=e.length>0?e[e.length-1]:-1;e.push(i),this._startIndexes[i]=s+((a&255)<<24),this._endIndexes[i]=r+((a&65280)<<16)}}}get length(){return this._startIndexes.length}getStartLineNumber(e){return this._startIndexes[e]&Mo}getEndLineNumber(e){return this._endIndexes[e]&Mo}getType(e){return this._types?this._types[e]:void 0}hasTypes(){return!!this._types}isCollapsed(e){return this._collapseStates.get(e)}setCollapsed(e,t){this._collapseStates.set(e,t)}isUserDefined(e){return this._userDefinedStates.get(e)}setUserDefined(e,t){return this._userDefinedStates.set(e,t)}isRecovered(e){return this._recoveredStates.get(e)}setRecovered(e,t){return this._recoveredStates.set(e,t)}getSource(e){return this.isUserDefined(e)?1:this.isRecovered(e)?2:0}setSource(e,t){t===1?(this.setUserDefined(e,!0),this.setRecovered(e,!1)):t===2?(this.setUserDefined(e,!1),this.setRecovered(e,!0)):(this.setUserDefined(e,!1),this.setRecovered(e,!1))}setCollapsedAllOfType(e,t){let i=!1;if(this._types)for(let n=0;n<this._types.length;n++)this._types[n]===e&&(this.setCollapsed(n,t),i=!0);return i}toRegion(e){return new Yee(this,e)}getParentIndex(e){this.ensureParentIndices();const t=((this._startIndexes[e]&CA)>>>24)+((this._endIndexes[e]&CA)>>>16);return t===vA?-1:t}contains(e,t){return this.getStartLineNumber(e)<=t&&this.getEndLineNumber(e)>=t}findIndex(e){let t=0,i=this._startIndexes.length;if(i===0)return-1;for(;t<i;){const n=Math.floor((t+i)/2);e<this.getStartLineNumber(n)?i=n:t=n+1}return t-1}findRange(e){let t=this.findIndex(e);if(t>=0){if(this.getEndLineNumber(t)>=e)return t;for(t=this.getParentIndex(t);t!==-1;){if(this.contains(t,e))return t;t=this.getParentIndex(t)}}return-1}toString(){const e=[];for(let t=0;t<this.length;t++)e[t]=`[${this.sourceAbbr[this.getSource(t)]}${this.isCollapsed(t)?\"+\":\"-\"}] ${this.getStartLineNumber(t)}/${this.getEndLineNumber(t)}`;return e.join(\", \")}toFoldRange(e){return{startLineNumber:this._startIndexes[e]&Mo,endLineNumber:this._endIndexes[e]&Mo,type:this._types?this._types[e]:void 0,isCollapsed:this.isCollapsed(e),source:this.getSource(e)}}static fromFoldRanges(e){const t=e.length,i=new Uint32Array(t),n=new Uint32Array(t);let s=[],r=!1;for(let l=0;l<t;l++){const c=e[l];i[l]=c.startLineNumber,n[l]=c.endLineNumber,s.push(c.type),c.type&&(r=!0)}r||(s=void 0);const a=new ms(i,n,s);for(let l=0;l<t;l++)e[l].isCollapsed&&a.setCollapsed(l,!0),a.setSource(l,e[l].source);return a}static sanitizeAndMerge(e,t,i){i=i!=null?i:Number.MAX_VALUE;const n=(_,b)=>Array.isArray(_)?v=>v<b?_[v]:void 0:v=>v<b?_.toFoldRange(v):void 0,s=n(e,e.length),r=n(t,t.length);let a=0,l=0,c=s(0),d=r(0);const h=[];let u,g=0;const f=[];for(;c||d;){let _;if(d&&(!c||c.startLineNumber>=d.startLineNumber))c&&c.startLineNumber===d.startLineNumber?(d.source===1?_=d:(_=c,_.isCollapsed=d.isCollapsed&&c.endLineNumber===d.endLineNumber,_.source=0),c=s(++a)):(_=d,d.isCollapsed&&d.source===0&&(_.source=2)),d=r(++l);else{let b=l,v=d;for(;;){if(!v||v.startLineNumber>c.endLineNumber){_=c;break}if(v.source===1&&v.endLineNumber>c.endLineNumber)break;v=r(++b)}c=s(++a)}if(_){for(;u&&u.endLineNumber<_.startLineNumber;)u=h.pop();_.endLineNumber>_.startLineNumber&&_.startLineNumber>g&&_.endLineNumber<=i&&(!u||u.endLineNumber>=_.endLineNumber)&&(f.push(_),g=_.startLineNumber,u&&h.push(u),u=_)}}return f}}class Yee{constructor(e,t){this.ranges=e,this.index=t}get startLineNumber(){return this.ranges.getStartLineNumber(this.index)}get endLineNumber(){return this.ranges.getEndLineNumber(this.index)}get regionIndex(){return this.index}get parentIndex(){return this.ranges.getParentIndex(this.index)}get isCollapsed(){return this.ranges.isCollapsed(this.index)}containedBy(e){return e.startLineNumber<=this.startLineNumber&&e.endLineNumber>=this.endLineNumber}containsLine(e){return this.startLineNumber<=e&&e<=this.endLineNumber}}class Xee{constructor(e,t){this._updateEventEmitter=new O,this.onDidChange=this._updateEventEmitter.event,this._textModel=e,this._decorationProvider=t,this._regions=new ms(new Uint32Array(0),new Uint32Array(0)),this._editorDecorationIds=[]}get regions(){return this._regions}get textModel(){return this._textModel}toggleCollapseState(e){if(!e.length)return;e=e.sort((i,n)=>i.regionIndex-n.regionIndex);const t={};this._decorationProvider.changeDecorations(i=>{let n=0,s=-1,r=-1;const a=l=>{for(;n<l;){const c=this._regions.getEndLineNumber(n),d=this._regions.isCollapsed(n);if(c<=s){const h=this.regions.getSource(n)!==0;i.changeDecorationOptions(this._editorDecorationIds[n],this._decorationProvider.getDecorationOption(d,c<=r,h))}d&&c>r&&(r=c),n++}};for(const l of e){const c=l.regionIndex,d=this._editorDecorationIds[c];if(d&&!t[d]){t[d]=!0,a(c);const h=!this._regions.isCollapsed(c);this._regions.setCollapsed(c,h),s=Math.max(s,this._regions.getEndLineNumber(c))}}a(this._regions.length)}),this._updateEventEmitter.fire({model:this,collapseStateChanged:e})}removeManualRanges(e){const t=new Array,i=n=>{for(const s of e)if(!(s.startLineNumber>n.endLineNumber||n.startLineNumber>s.endLineNumber))return!0;return!1};for(let n=0;n<this._regions.length;n++){const s=this._regions.toFoldRange(n);(s.source===0||!i(s))&&t.push(s)}this.updatePost(ms.fromFoldRanges(t))}update(e,t=[]){const i=this._currentFoldedOrManualRanges(t),n=ms.sanitizeAndMerge(e,i,this._textModel.getLineCount());this.updatePost(ms.fromFoldRanges(n))}updatePost(e){const t=[];let i=-1;for(let n=0,s=e.length;n<s;n++){const r=e.getStartLineNumber(n),a=e.getEndLineNumber(n),l=e.isCollapsed(n),c=e.getSource(n)!==0,d={startLineNumber:r,startColumn:this._textModel.getLineMaxColumn(r),endLineNumber:a,endColumn:this._textModel.getLineMaxColumn(a)+1};t.push({range:d,options:this._decorationProvider.getDecorationOption(l,a<=i,c)}),l&&a>i&&(i=a)}this._decorationProvider.changeDecorations(n=>this._editorDecorationIds=n.deltaDecorations(this._editorDecorationIds,t)),this._regions=e,this._updateEventEmitter.fire({model:this})}_currentFoldedOrManualRanges(e=[]){const t=(n,s)=>{for(const r of e)if(n<r&&r<=s)return!0;return!1},i=[];for(let n=0,s=this._regions.length;n<s;n++){let r=this.regions.isCollapsed(n);const a=this.regions.getSource(n);if(r||a!==0){const l=this._regions.toFoldRange(n),c=this._textModel.getDecorationRange(this._editorDecorationIds[n]);c&&(r&&(t(c.startLineNumber,c.endLineNumber)||c.endLineNumber-c.startLineNumber!==l.endLineNumber-l.startLineNumber)&&(r=!1),i.push({startLineNumber:c.startLineNumber,endLineNumber:c.endLineNumber,type:l.type,isCollapsed:r,source:a}))}}return i}getMemento(){const e=this._currentFoldedOrManualRanges(),t=[];for(let i=0,n=e.length;i<n;i++){const s=e[i],r=this._getLinesChecksum(s.startLineNumber+1,s.endLineNumber);t.push({startLineNumber:s.startLineNumber,endLineNumber:s.endLineNumber,isCollapsed:s.isCollapsed,source:s.source,checksum:r})}return t.length>0?t:void 0}applyMemento(e){var t,i;if(!Array.isArray(e))return;const n=[],s=this._textModel.getLineCount();for(const a of e){if(a.startLineNumber>=a.endLineNumber||a.startLineNumber<1||a.endLineNumber>s)continue;const l=this._getLinesChecksum(a.startLineNumber+1,a.endLineNumber);(!a.checksum||l===a.checksum)&&n.push({startLineNumber:a.startLineNumber,endLineNumber:a.endLineNumber,type:void 0,isCollapsed:(t=a.isCollapsed)!==null&&t!==void 0?t:!0,source:(i=a.source)!==null&&i!==void 0?i:0})}const r=ms.sanitizeAndMerge(this._regions,n,s);this.updatePost(ms.fromFoldRanges(r))}_getLinesChecksum(e,t){return _E(this._textModel.getLineContent(e)+this._textModel.getLineContent(t))%1e6}dispose(){this._decorationProvider.removeDecorations(this._editorDecorationIds)}getAllRegionsAtLine(e,t){const i=[];if(this._regions){let n=this._regions.findRange(e),s=1;for(;n>=0;){const r=this._regions.toRegion(n);(!t||t(r,s))&&i.push(r),s++,n=r.parentIndex}}return i}getRegionAtLine(e){if(this._regions){const t=this._regions.findRange(e);if(t>=0)return this._regions.toRegion(t)}return null}getRegionsInside(e,t){const i=[],n=e?e.regionIndex+1:0,s=e?e.endLineNumber:Number.MAX_VALUE;if(t&&t.length===2){const r=[];for(let a=n,l=this._regions.length;a<l;a++){const c=this._regions.toRegion(a);if(this._regions.getStartLineNumber(a)<s){for(;r.length>0&&!c.containedBy(r[r.length-1]);)r.pop();r.push(c),t(c,r.length)&&i.push(c)}else break}}else for(let r=n,a=this._regions.length;r<a;r++){const l=this._regions.toRegion(r);if(this._regions.getStartLineNumber(r)<s)(!t||t(l))&&i.push(l);else break}return i}}function Qee(o,e,t){const i=[];for(const n of t){const s=o.getRegionAtLine(n);if(s){const r=!s.isCollapsed;if(i.push(s),e>1){const a=o.getRegionsInside(s,(l,c)=>l.isCollapsed!==r&&c<e);i.push(...a)}}}o.toggleCollapseState(i)}function Zg(o,e,t=Number.MAX_VALUE,i){const n=[];if(i&&i.length>0)for(const s of i){const r=o.getRegionAtLine(s);if(r&&(r.isCollapsed!==e&&n.push(r),t>1)){const a=o.getRegionsInside(r,(l,c)=>l.isCollapsed!==e&&c<t);n.push(...a)}}else{const s=o.getRegionsInside(null,(r,a)=>r.isCollapsed!==e&&a<t);n.push(...s)}o.toggleCollapseState(n)}function D3(o,e,t,i){const n=[];for(const s of i){const r=o.getAllRegionsAtLine(s,(a,l)=>a.isCollapsed!==e&&l<=t);n.push(...r)}o.toggleCollapseState(n)}function Jee(o,e,t){const i=[];for(const n of t){const s=o.getAllRegionsAtLine(n,r=>r.isCollapsed!==e);s.length>0&&i.push(s[0])}o.toggleCollapseState(i)}function ete(o,e,t,i){const n=(r,a)=>a===e&&r.isCollapsed!==t&&!i.some(l=>r.containsLine(l)),s=o.getRegionsInside(null,n);o.toggleCollapseState(s)}function k3(o,e,t){const i=[];for(const r of t){const a=o.getAllRegionsAtLine(r,void 0);a.length>0&&i.push(a[0])}const n=r=>i.every(a=>!a.containedBy(r)&&!r.containedBy(a))&&r.isCollapsed!==e,s=o.getRegionsInside(null,n);o.toggleCollapseState(s)}function iN(o,e,t){const i=o.textModel,n=o.regions,s=[];for(let r=n.length-1;r>=0;r--)if(t!==n.isCollapsed(r)){const a=n.getStartLineNumber(r);e.test(i.getLineContent(a))&&s.push(n.toRegion(r))}o.toggleCollapseState(s)}function nN(o,e,t){const i=o.regions,n=[];for(let s=i.length-1;s>=0;s--)t!==i.isCollapsed(s)&&e===i.getType(s)&&n.push(i.toRegion(s));o.toggleCollapseState(n)}function tte(o,e){let t=null;const i=e.getRegionAtLine(o);if(i!==null&&(t=i.startLineNumber,o===t)){const n=i.parentIndex;n!==-1?t=e.regions.getStartLineNumber(n):t=null}return t}function ite(o,e){let t=e.getRegionAtLine(o);if(t!==null&&t.startLineNumber===o){if(o!==t.startLineNumber)return t.startLineNumber;{const i=t.parentIndex;let n=0;for(i!==-1&&(n=e.regions.getStartLineNumber(t.parentIndex));t!==null;)if(t.regionIndex>0){if(t=e.regions.toRegion(t.regionIndex-1),t.startLineNumber<=n)return null;if(t.parentIndex===i)return t.startLineNumber}else return null}}else if(e.regions.length>0)for(t=e.regions.toRegion(e.regions.length-1);t!==null;){if(t.startLineNumber<o)return t.startLineNumber;t.regionIndex>0?t=e.regions.toRegion(t.regionIndex-1):t=null}return null}function nte(o,e){let t=e.getRegionAtLine(o);if(t!==null&&t.startLineNumber===o){const i=t.parentIndex;let n=0;if(i!==-1)n=e.regions.getEndLineNumber(t.parentIndex);else{if(e.regions.length===0)return null;n=e.regions.getEndLineNumber(e.regions.length-1)}for(;t!==null;)if(t.regionIndex<e.regions.length){if(t=e.regions.toRegion(t.regionIndex+1),t.startLineNumber>=n)return null;if(t.parentIndex===i)return t.startLineNumber}else return null}else if(e.regions.length>0)for(t=e.regions.toRegion(0);t!==null;){if(t.startLineNumber>o)return t.startLineNumber;t.regionIndex<e.regions.length?t=e.regions.toRegion(t.regionIndex+1):t=null}return null}class ste{constructor(e){this._updateEventEmitter=new O,this._hasLineChanges=!1,this._foldingModel=e,this._foldingModelListener=e.onDidChange(t=>this.updateHiddenRanges()),this._hiddenRanges=[],e.regions.length&&this.updateHiddenRanges()}get onDidChange(){return this._updateEventEmitter.event}get hiddenRanges(){return this._hiddenRanges}notifyChangeModelContent(e){this._hiddenRanges.length&&!this._hasLineChanges&&(this._hasLineChanges=e.changes.some(t=>t.range.endLineNumber!==t.range.startLineNumber||Ud(t.text)[0]!==0))}updateHiddenRanges(){let e=!1;const t=[];let i=0,n=0,s=Number.MAX_VALUE,r=-1;const a=this._foldingModel.regions;for(;i<a.length;i++){if(!a.isCollapsed(i))continue;const l=a.getStartLineNumber(i)+1,c=a.getEndLineNumber(i);s<=l&&c<=r||(!e&&n<this._hiddenRanges.length&&this._hiddenRanges[n].startLineNumber===l&&this._hiddenRanges[n].endLineNumber===c?(t.push(this._hiddenRanges[n]),n++):(e=!0,t.push(new L(l,1,c,1))),s=l,r=c)}(this._hasLineChanges||e||n<this._hiddenRanges.length)&&this.applyHiddenRanges(t)}applyHiddenRanges(e){this._hiddenRanges=e,this._hasLineChanges=!1,this._updateEventEmitter.fire(e)}hasRanges(){return this._hiddenRanges.length>0}isHidden(e){return wA(this._hiddenRanges,e)!==null}adjustSelections(e){let t=!1;const i=this._foldingModel.textModel;let n=null;const s=r=>((!n||!ote(r,n))&&(n=wA(this._hiddenRanges,r)),n?n.startLineNumber-1:null);for(let r=0,a=e.length;r<a;r++){let l=e[r];const c=s(l.startLineNumber);c&&(l=l.setStartPosition(c,i.getLineMaxColumn(c)),t=!0);const d=s(l.endLineNumber);d&&(l=l.setEndPosition(d,i.getLineMaxColumn(d)),t=!0),e[r]=l}return t}dispose(){this.hiddenRanges.length>0&&(this._hiddenRanges=[],this._updateEventEmitter.fire(this._hiddenRanges)),this._foldingModelListener&&(this._foldingModelListener.dispose(),this._foldingModelListener=null)}}function ote(o,e){return o>=e.startLineNumber&&o<=e.endLineNumber}function wA(o,e){const t=fP(o,i=>e<i.startLineNumber)-1;return t>=0&&o[t].endLineNumber>=e?o[t]:null}const rte=5e3,ate=\"indent\";class lte{constructor(e,t,i){this.editorModel=e,this.languageConfigurationService=t,this.maxFoldingRegions=i,this.id=ate}dispose(){}compute(e,t){const i=this.languageConfigurationService.getLanguageConfiguration(this.editorModel.getLanguageId()).foldingRules,n=i&&!!i.offSide,s=i&&i.markers;return Promise.resolve(dte(this.editorModel,n,s,this.maxFoldingRegions,t))}}class cte{constructor(e,t){this._notifyTooManyRegions=t,this._startIndexes=[],this._endIndexes=[],this._indentOccurrences=[],this._length=0,this._foldingRangesLimit=e}insertFirst(e,t,i){if(e>Mo||t>Mo)return;const n=this._length;this._startIndexes[n]=e,this._endIndexes[n]=t,this._length++,i<1e3&&(this._indentOccurrences[i]=(this._indentOccurrences[i]||0)+1)}toIndentRanges(e){var t;if(this._length<=this._foldingRangesLimit){const i=new Uint32Array(this._length),n=new Uint32Array(this._length);for(let s=this._length-1,r=0;s>=0;s--,r++)i[r]=this._startIndexes[s],n[r]=this._endIndexes[s];return new ms(i,n)}else{(t=this._notifyTooManyRegions)===null||t===void 0||t.call(this,this._foldingRangesLimit);let i=0,n=this._indentOccurrences.length;for(let l=0;l<this._indentOccurrences.length;l++){const c=this._indentOccurrences[l];if(c){if(c+i>this._foldingRangesLimit){n=l;break}i+=c}}const s=e.getOptions().tabSize,r=new Uint32Array(this._foldingRangesLimit),a=new Uint32Array(this._foldingRangesLimit);for(let l=this._length-1,c=0;l>=0;l--){const d=this._startIndexes[l],h=e.getLineContent(d),u=s1(h,s);(u<n||u===n&&i++<this._foldingRangesLimit)&&(r[c]=d,a[c]=this._endIndexes[l],c++)}return new ms(r,a)}}}function dte(o,e,t,i,n){const s=o.getOptions().tabSize;i=i!=null?i:rte;const r=new cte(i,n);let a;t&&(a=new RegExp(`(${t.start.source})|(?:${t.end.source})`));const l=[],c=o.getLineCount()+1;l.push({indent:-1,endAbove:c,line:c});for(let d=o.getLineCount();d>0;d--){const h=o.getLineContent(d),u=s1(h,s);let g=l[l.length-1];if(u===-1){e&&(g.endAbove=d);continue}let f;if(a&&(f=h.match(a)))if(f[1]){let _=l.length-1;for(;_>0&&l[_].indent!==-2;)_--;if(_>0){l.length=_+1,g=l[_],r.insertFirst(d,g.line,u),g.line=d,g.indent=u,g.endAbove=d;continue}}else{l.push({indent:-2,endAbove:d,line:d});continue}if(g.indent>u){do l.pop(),g=l[l.length-1];while(g.indent>u);const _=g.endAbove-1;_-d>=1&&r.insertFirst(d,_,u)}g.indent===u?g.endAbove=d:l.push({indent:u,endAbove:d,line:d})}return r.toIndentRanges(o)}const b_=fi(\"folding-expanded\",m.chevronDown,p(\"foldingExpandedIcon\",\"Icon for expanded ranges in the editor glyph margin.\")),B1=fi(\"folding-collapsed\",m.chevronRight,p(\"foldingCollapsedIcon\",\"Icon for collapsed ranges in the editor glyph margin.\")),x3=fi(\"folding-manual-collapsed\",B1,p(\"foldingManualCollapedIcon\",\"Icon for manually collapsed ranges in the editor glyph margin.\")),sN=fi(\"folding-manual-expanded\",b_,p(\"foldingManualExpandedIcon\",\"Icon for manually expanded ranges in the editor glyph margin.\"));class zi{constructor(e){this.editor=e,this.showFoldingControls=\"mouseover\",this.showFoldingHighlights=!0}getDecorationOption(e,t,i){return t||this.showFoldingControls===\"never\"?zi.HIDDEN_RANGE_DECORATION:e?i?this.showFoldingHighlights?zi.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION:zi.MANUALLY_COLLAPSED_VISUAL_DECORATION:this.showFoldingHighlights?zi.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION:zi.COLLAPSED_VISUAL_DECORATION:this.showFoldingControls===\"mouseover\"?i?zi.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION:zi.EXPANDED_AUTO_HIDE_VISUAL_DECORATION:i?zi.MANUALLY_EXPANDED_VISUAL_DECORATION:zi.EXPANDED_VISUAL_DECORATION}changeDecorations(e){return this.editor.changeDecorations(e)}removeDecorations(e){this.editor.removeDecorations(e)}}zi.COLLAPSED_VISUAL_DECORATION=Ie.register({description:\"folding-collapsed-visual-decoration\",stickiness:0,afterContentClassName:\"inline-folded\",isWholeLine:!0,firstLineDecorationClassName:nt.asClassName(B1)});zi.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION=Ie.register({description:\"folding-collapsed-highlighted-visual-decoration\",stickiness:0,afterContentClassName:\"inline-folded\",className:\"folded-background\",isWholeLine:!0,firstLineDecorationClassName:nt.asClassName(B1)});zi.MANUALLY_COLLAPSED_VISUAL_DECORATION=Ie.register({description:\"folding-manually-collapsed-visual-decoration\",stickiness:0,afterContentClassName:\"inline-folded\",isWholeLine:!0,firstLineDecorationClassName:\"alwaysShowFoldIcons \"+nt.asClassName(b_)});zi.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION=Ie.register({description:\"folding-manually-collapsed-highlighted-visual-decoration\",stickiness:0,afterContentClassName:\"inline-folded\",className:\"folded-background\",isWholeLine:!0,firstLineDecorationClassName:nt.asClassName(x3)});zi.EXPANDED_AUTO_HIDE_VISUAL_DECORATION=Ie.register({description:\"folding-expanded-auto-hide-visual-decoration\",stickiness:1,isWholeLine:!0,firstLineDecorationClassName:nt.asClassName(b_)});zi.EXPANDED_VISUAL_DECORATION=Ie.register({description:\"folding-expanded-visual-decoration\",stickiness:1,isWholeLine:!0,firstLineDecorationClassName:\"alwaysShowFoldIcons \"+nt.asClassName(b_)});zi.MANUALLY_EXPANDED_VISUAL_DECORATION=Ie.register({description:\"folding-manually-expanded-visual-decoration\",stickiness:0,isWholeLine:!0,firstLineDecorationClassName:\"alwaysShowFoldIcons \"+nt.asClassName(sN)});zi.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION=Ie.register({description:\"folding-manually-expanded-visual-decoration\",stickiness:0,isWholeLine:!0,firstLineDecorationClassName:nt.asClassName(sN)});zi.HIDDEN_RANGE_DECORATION=Ie.register({description:\"folding-hidden-range-decoration\",stickiness:1});const hte={},ute=\"syntax\";class gte{constructor(e,t,i,n){this.editorModel=e,this.providers=t,this.limit=n,this.id=ute;for(const s of t)typeof s.onDidChange==\"function\"&&(this.disposables||(this.disposables=new ee),this.disposables.add(s.onDidChange(i)))}compute(e,t){return fte(this.providers,this.editorModel,e).then(i=>i?mte(i,this.limit,t):null)}dispose(){var e;(e=this.disposables)===null||e===void 0||e.dispose()}}function fte(o,e,t){let i=null;const n=o.map((s,r)=>Promise.resolve(s.provideFoldingRanges(e,hte,t)).then(a=>{if(!t.isCancellationRequested&&Array.isArray(a)){Array.isArray(i)||(i=[]);const l=e.getLineCount();for(const c of a)c.start>0&&c.end>c.start&&c.end<=l&&i.push({start:c.start,end:c.end,rank:r,kind:c.kind})}},Ai));return Promise.all(n).then(s=>i)}class pte{constructor(e,t){this._notifyTooManyRegions=t,this._startIndexes=[],this._endIndexes=[],this._nestingLevels=[],this._nestingLevelCounts=[],this._types=[],this._length=0,this._foldingRangesLimit=e}add(e,t,i,n){if(e>Mo||t>Mo)return;const s=this._length;this._startIndexes[s]=e,this._endIndexes[s]=t,this._nestingLevels[s]=n,this._types[s]=i,this._length++,n<30&&(this._nestingLevelCounts[n]=(this._nestingLevelCounts[n]||0)+1)}toIndentRanges(){var e;if(this._length<=this._foldingRangesLimit){const t=new Uint32Array(this._length),i=new Uint32Array(this._length);for(let n=0;n<this._length;n++)t[n]=this._startIndexes[n],i[n]=this._endIndexes[n];return new ms(t,i,this._types)}else{(e=this._notifyTooManyRegions)===null||e===void 0||e.call(this,this._foldingRangesLimit);let t=0,i=this._nestingLevelCounts.length;for(let a=0;a<this._nestingLevelCounts.length;a++){const l=this._nestingLevelCounts[a];if(l){if(l+t>this._foldingRangesLimit){i=a;break}t+=l}}const n=new Uint32Array(this._foldingRangesLimit),s=new Uint32Array(this._foldingRangesLimit),r=[];for(let a=0,l=0;a<this._length;a++){const c=this._nestingLevels[a];(c<i||c===i&&t++<this._foldingRangesLimit)&&(n[l]=this._startIndexes[a],s[l]=this._endIndexes[a],r[l]=this._types[a],l++)}return new ms(n,s,r)}}}function mte(o,e,t){const i=o.sort((a,l)=>{let c=a.start-l.start;return c===0&&(c=a.rank-l.rank),c}),n=new pte(e,t);let s;const r=[];for(const a of i)if(!s)s=a,n.add(a.start,a.end,a.kind&&a.kind.value,r.length);else if(a.start>s.start)if(a.end<=s.end)r.push(s),s=a,n.add(a.start,a.end,a.kind&&a.kind.value,r.length);else{if(a.start>s.end){do s=r.pop();while(s&&a.start>s.end);s&&r.push(s),s=a}n.add(a.start,a.end,a.kind&&a.kind.value,r.length)}return n.toIndentRanges()}var _te=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},yf=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const an=new ce(\"foldingEnabled\",!1);let yg=class I3 extends z{constructor(e,t,i,n,s,r){super(),this.contextKeyService=t,this.languageConfigurationService=i,this.languageFeaturesService=r,this._tooManyRegionsNotified=!1,this.localToDispose=this._register(new ee),this.editor=e;const a=this.editor.getOptions();this._isEnabled=a.get(39),this._useFoldingProviders=a.get(40)!==\"indentation\",this._unfoldOnClickAfterEndOfLine=a.get(44),this._restoringViewState=!1,this._currentModelHasFoldedImports=!1,this._foldingImportsByDefault=a.get(42),this._maxFoldingRegions=a.get(43),this.updateDebounceInfo=s.for(r.foldingRangeProvider,\"Folding\",{min:200}),this.foldingModel=null,this.hiddenRangeModel=null,this.rangeProvider=null,this.foldingRegionPromise=null,this.foldingModelPromise=null,this.updateScheduler=null,this.cursorChangedScheduler=null,this.mouseDownInfo=null,this.foldingDecorationProvider=new zi(e),this.foldingDecorationProvider.showFoldingControls=a.get(101),this.foldingDecorationProvider.showFoldingHighlights=a.get(41),this.foldingEnabled=an.bindTo(this.contextKeyService),this.foldingEnabled.set(this._isEnabled),this._notifyTooManyRegions=l=>{this._tooManyRegionsNotified||(n.notify({severity:Vt.Warning,sticky:!0,message:p(\"maximum fold ranges\",`The number of foldable regions is limited to a maximum of {0}. Increase configuration option ['Folding Maximum Regions'](command:workbench.action.openSettings?[\"editor.foldingMaximumRegions\"]) to enable more.`,l)}),this._tooManyRegionsNotified=!0)},this._register(this.editor.onDidChangeModel(()=>this.onModelChanged())),this._register(this.editor.onDidChangeConfiguration(l=>{if(l.hasChanged(39)&&(this._isEnabled=this.editor.getOptions().get(39),this.foldingEnabled.set(this._isEnabled),this.onModelChanged()),l.hasChanged(43)&&(this._maxFoldingRegions=this.editor.getOptions().get(43),this._tooManyRegionsNotified=!1,this.onModelChanged()),l.hasChanged(101)||l.hasChanged(41)){const c=this.editor.getOptions();this.foldingDecorationProvider.showFoldingControls=c.get(101),this.foldingDecorationProvider.showFoldingHighlights=c.get(41),this.triggerFoldingModelChanged()}l.hasChanged(40)&&(this._useFoldingProviders=this.editor.getOptions().get(40)!==\"indentation\",this.onFoldingStrategyChanged()),l.hasChanged(44)&&(this._unfoldOnClickAfterEndOfLine=this.editor.getOptions().get(44)),l.hasChanged(42)&&(this._foldingImportsByDefault=this.editor.getOptions().get(42))})),this.onModelChanged()}static get(e){return e.getContribution(I3.ID)}saveViewState(){const e=this.editor.getModel();if(!e||!this._isEnabled||e.isTooLargeForTokenization())return{};if(this.foldingModel){const t=this.foldingModel.getMemento(),i=this.rangeProvider?this.rangeProvider.id:void 0;return{collapsedRegions:t,lineCount:e.getLineCount(),provider:i,foldedImports:this._currentModelHasFoldedImports}}}restoreViewState(e){const t=this.editor.getModel();if(!(!t||!this._isEnabled||t.isTooLargeForTokenization()||!this.hiddenRangeModel)&&!(!e||e.lineCount!==t.getLineCount())&&(this._currentModelHasFoldedImports=!!e.foldedImports,e.collapsedRegions&&e.collapsedRegions.length>0&&this.foldingModel)){this._restoringViewState=!0;try{this.foldingModel.applyMemento(e.collapsedRegions)}finally{this._restoringViewState=!1}}}onModelChanged(){this.localToDispose.clear();const e=this.editor.getModel();!this._isEnabled||!e||e.isTooLargeForTokenization()||(this._currentModelHasFoldedImports=!1,this.foldingModel=new Xee(e,this.foldingDecorationProvider),this.localToDispose.add(this.foldingModel),this.hiddenRangeModel=new ste(this.foldingModel),this.localToDispose.add(this.hiddenRangeModel),this.localToDispose.add(this.hiddenRangeModel.onDidChange(t=>this.onHiddenRangesChanges(t))),this.updateScheduler=new $r(this.updateDebounceInfo.get(e)),this.cursorChangedScheduler=new ft(()=>this.revealCursor(),200),this.localToDispose.add(this.cursorChangedScheduler),this.localToDispose.add(this.languageFeaturesService.foldingRangeProvider.onDidChange(()=>this.onFoldingStrategyChanged())),this.localToDispose.add(this.editor.onDidChangeModelLanguageConfiguration(()=>this.onFoldingStrategyChanged())),this.localToDispose.add(this.editor.onDidChangeModelContent(t=>this.onDidChangeModelContent(t))),this.localToDispose.add(this.editor.onDidChangeCursorPosition(()=>this.onCursorPositionChanged())),this.localToDispose.add(this.editor.onMouseDown(t=>this.onEditorMouseDown(t))),this.localToDispose.add(this.editor.onMouseUp(t=>this.onEditorMouseUp(t))),this.localToDispose.add({dispose:()=>{this.foldingRegionPromise&&(this.foldingRegionPromise.cancel(),this.foldingRegionPromise=null),this.updateScheduler&&this.updateScheduler.cancel(),this.updateScheduler=null,this.foldingModel=null,this.foldingModelPromise=null,this.hiddenRangeModel=null,this.cursorChangedScheduler=null,this.rangeProvider&&this.rangeProvider.dispose(),this.rangeProvider=null}}),this.triggerFoldingModelChanged())}onFoldingStrategyChanged(){this.rangeProvider&&this.rangeProvider.dispose(),this.rangeProvider=null,this.triggerFoldingModelChanged()}getRangeProvider(e){if(this.rangeProvider)return this.rangeProvider;if(this.rangeProvider=new lte(e,this.languageConfigurationService,this._maxFoldingRegions),this._useFoldingProviders&&this.foldingModel){const t=this.languageFeaturesService.foldingRangeProvider.ordered(this.foldingModel.textModel);t.length>0&&(this.rangeProvider=new gte(e,t,()=>this.triggerFoldingModelChanged(),this._maxFoldingRegions))}return this.rangeProvider}getFoldingModel(){return this.foldingModelPromise}onDidChangeModelContent(e){var t;(t=this.hiddenRangeModel)===null||t===void 0||t.notifyChangeModelContent(e),this.triggerFoldingModelChanged()}triggerFoldingModelChanged(){this.updateScheduler&&(this.foldingRegionPromise&&(this.foldingRegionPromise.cancel(),this.foldingRegionPromise=null),this.foldingModelPromise=this.updateScheduler.trigger(()=>{const e=this.foldingModel;if(!e)return null;const t=new Hn(!0),i=this.getRangeProvider(e.textModel),n=this.foldingRegionPromise=Ti(s=>i.compute(s,this._notifyTooManyRegions));return n.then(s=>{if(s&&n===this.foldingRegionPromise){let r;if(this._foldingImportsByDefault&&!this._currentModelHasFoldedImports){const d=s.setCollapsedAllOfType(Zo.Imports.value,!0);d&&(r=uc.capture(this.editor),this._currentModelHasFoldedImports=d)}const a=this.editor.getSelections(),l=a?a.map(d=>d.startLineNumber):[];e.update(s,l),r==null||r.restore(this.editor);const c=this.updateDebounceInfo.update(e.textModel,t.elapsed());this.updateScheduler&&(this.updateScheduler.defaultDelay=c)}return e})}).then(void 0,e=>(Ee(e),null)))}onHiddenRangesChanges(e){if(this.hiddenRangeModel&&e.length&&!this._restoringViewState){const t=this.editor.getSelections();t&&this.hiddenRangeModel.adjustSelections(t)&&this.editor.setSelections(t)}this.editor.setHiddenAreas(e)}onCursorPositionChanged(){this.hiddenRangeModel&&this.hiddenRangeModel.hasRanges()&&this.cursorChangedScheduler.schedule()}revealCursor(){const e=this.getFoldingModel();!e||e.then(t=>{if(t){const i=this.editor.getSelections();if(i&&i.length>0){const n=[];for(const s of i){const r=s.selectionStartLineNumber;this.hiddenRangeModel&&this.hiddenRangeModel.isHidden(r)&&n.push(...t.getAllRegionsAtLine(r,a=>a.isCollapsed&&r>a.startLineNumber))}n.length&&(t.toggleCollapseState(n),this.reveal(i[0].getPosition()))}}}).then(void 0,Ee)}onEditorMouseDown(e){if(this.mouseDownInfo=null,!this.hiddenRangeModel||!e.target||!e.target.range||!e.event.leftButton&&!e.event.middleButton)return;const t=e.target.range;let i=!1;switch(e.target.type){case 4:{const n=e.target.detail,s=e.target.element.offsetLeft;if(n.offsetX-s<5)return;i=!0;break}case 7:{if(this._unfoldOnClickAfterEndOfLine&&this.hiddenRangeModel.hasRanges()&&!e.target.detail.isAfterLines)break;return}case 6:{if(this.hiddenRangeModel.hasRanges()){const n=this.editor.getModel();if(n&&t.startColumn===n.getLineMaxColumn(t.startLineNumber))break}return}default:return}this.mouseDownInfo={lineNumber:t.startLineNumber,iconClicked:i}}onEditorMouseUp(e){const t=this.foldingModel;if(!t||!this.mouseDownInfo||!e.target)return;const i=this.mouseDownInfo.lineNumber,n=this.mouseDownInfo.iconClicked,s=e.target.range;if(!s||s.startLineNumber!==i)return;if(n){if(e.target.type!==4)return}else{const a=this.editor.getModel();if(!a||s.startColumn!==a.getLineMaxColumn(i))return}const r=t.getRegionAtLine(i);if(r&&r.startLineNumber===i){const a=r.isCollapsed;if(n||a){const l=e.event.altKey;let c=[];if(l){const d=u=>!u.containedBy(r)&&!r.containedBy(u),h=t.getRegionsInside(null,d);for(const u of h)u.isCollapsed&&c.push(u);c.length===0&&(c=h)}else{const d=e.event.middleButton||e.event.shiftKey;if(d)for(const h of t.getRegionsInside(r))h.isCollapsed===a&&c.push(h);(a||!d||c.length===0)&&c.push(r)}t.toggleCollapseState(c),this.reveal({lineNumber:i,column:1})}}}reveal(e){this.editor.revealPositionInCenterIfOutsideViewport(e,0)}};yg.ID=\"editor.contrib.folding\";yg=_te([yf(1,xe),yf(2,ti),yf(3,gi),yf(4,Js),yf(5,ue)],yg);class pn extends he{runEditorCommand(e,t,i){const n=e.get(ti),s=yg.get(t);if(!s)return;const r=s.getFoldingModel();if(r)return this.reportTelemetry(e,t),r.then(a=>{if(a){this.invoke(s,a,t,i,n);const l=t.getSelection();l&&s.reveal(l.getStartPosition())}})}getSelectedLines(e){const t=e.getSelections();return t?t.map(i=>i.startLineNumber):[]}getLineNumbers(e,t){return e&&e.selectionLines?e.selectionLines.map(i=>i+1):this.getSelectedLines(t)}run(e,t){}}function E3(o){if(!Qn(o)){if(!Fn(o))return!1;const e=o;if(!Qn(e.levels)&&!sc(e.levels)||!Qn(e.direction)&&!ts(e.direction)||!Qn(e.selectionLines)&&(!vO(e.selectionLines)||!e.selectionLines.every(sc)))return!1}return!0}class bte extends pn{constructor(){super({id:\"editor.unfold\",label:p(\"unfoldAction.label\",\"Unfold\"),alias:\"Unfold\",precondition:an,kbOpts:{kbExpr:T.editorTextFocus,primary:3161,mac:{primary:2649},weight:100},description:{description:\"Unfold the content in the editor\",args:[{name:\"Unfold editor argument\",description:`Property-value pairs that can be passed through this argument:\n\t\t\t\t\t\t* 'levels': Number of levels to unfold. If not set, defaults to 1.\n\t\t\t\t\t\t* 'direction': If 'up', unfold given number of levels up otherwise unfolds down.\n\t\t\t\t\t\t* 'selectionLines': Array of the start lines (0-based) of the editor selections to apply the unfold action to. If not set, the active selection(s) will be used.\n\t\t\t\t\t\t`,constraint:E3,schema:{type:\"object\",properties:{levels:{type:\"number\",default:1},direction:{type:\"string\",enum:[\"up\",\"down\"],default:\"down\"},selectionLines:{type:\"array\",items:{type:\"number\"}}}}}]}})}invoke(e,t,i,n){const s=n&&n.levels||1,r=this.getLineNumbers(n,i);n&&n.direction===\"up\"?D3(t,!1,s,r):Zg(t,!1,s,r)}}class vte extends pn{constructor(){super({id:\"editor.unfoldRecursively\",label:p(\"unFoldRecursivelyAction.label\",\"Unfold Recursively\"),alias:\"Unfold Recursively\",precondition:an,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2137),weight:100}})}invoke(e,t,i,n){Zg(t,!1,Number.MAX_VALUE,this.getSelectedLines(i))}}class Cte extends pn{constructor(){super({id:\"editor.fold\",label:p(\"foldAction.label\",\"Fold\"),alias:\"Fold\",precondition:an,kbOpts:{kbExpr:T.editorTextFocus,primary:3159,mac:{primary:2647},weight:100},description:{description:\"Fold the content in the editor\",args:[{name:\"Fold editor argument\",description:`Property-value pairs that can be passed through this argument:\n\t\t\t\t\t\t\t* 'levels': Number of levels to fold.\n\t\t\t\t\t\t\t* 'direction': If 'up', folds given number of levels up otherwise folds down.\n\t\t\t\t\t\t\t* 'selectionLines': Array of the start lines (0-based) of the editor selections to apply the fold action to. If not set, the active selection(s) will be used.\n\t\t\t\t\t\t\tIf no levels or direction is set, folds the region at the locations or if already collapsed, the first uncollapsed parent instead.\n\t\t\t\t\t\t`,constraint:E3,schema:{type:\"object\",properties:{levels:{type:\"number\"},direction:{type:\"string\",enum:[\"up\",\"down\"]},selectionLines:{type:\"array\",items:{type:\"number\"}}}}}]}})}invoke(e,t,i,n){const s=this.getLineNumbers(n,i),r=n&&n.levels,a=n&&n.direction;typeof r!=\"number\"&&typeof a!=\"string\"?Jee(t,!0,s):a===\"up\"?D3(t,!0,r||1,s):Zg(t,!0,r||1,s)}}class wte extends pn{constructor(){super({id:\"editor.toggleFold\",label:p(\"toggleFoldAction.label\",\"Toggle Fold\"),alias:\"Toggle Fold\",precondition:an,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2090),weight:100}})}invoke(e,t,i){const n=this.getSelectedLines(i);Qee(t,1,n)}}class Ste extends pn{constructor(){super({id:\"editor.foldRecursively\",label:p(\"foldRecursivelyAction.label\",\"Fold Recursively\"),alias:\"Fold Recursively\",precondition:an,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2135),weight:100}})}invoke(e,t,i){const n=this.getSelectedLines(i);Zg(t,!0,Number.MAX_VALUE,n)}}class yte extends pn{constructor(){super({id:\"editor.foldAllBlockComments\",label:p(\"foldAllBlockComments.label\",\"Fold All Block Comments\"),alias:\"Fold All Block Comments\",precondition:an,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2133),weight:100}})}invoke(e,t,i,n,s){if(t.regions.hasTypes())nN(t,Zo.Comment.value,!0);else{const r=i.getModel();if(!r)return;const a=s.getLanguageConfiguration(r.getLanguageId()).comments;if(a&&a.blockCommentStartToken){const l=new RegExp(\"^\\\\s*\"+Ds(a.blockCommentStartToken));iN(t,l,!0)}}}}class Lte extends pn{constructor(){super({id:\"editor.foldAllMarkerRegions\",label:p(\"foldAllMarkerRegions.label\",\"Fold All Regions\"),alias:\"Fold All Regions\",precondition:an,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2077),weight:100}})}invoke(e,t,i,n,s){if(t.regions.hasTypes())nN(t,Zo.Region.value,!0);else{const r=i.getModel();if(!r)return;const a=s.getLanguageConfiguration(r.getLanguageId()).foldingRules;if(a&&a.markers&&a.markers.start){const l=new RegExp(a.markers.start);iN(t,l,!0)}}}}class Dte extends pn{constructor(){super({id:\"editor.unfoldAllMarkerRegions\",label:p(\"unfoldAllMarkerRegions.label\",\"Unfold All Regions\"),alias:\"Unfold All Regions\",precondition:an,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2078),weight:100}})}invoke(e,t,i,n,s){if(t.regions.hasTypes())nN(t,Zo.Region.value,!1);else{const r=i.getModel();if(!r)return;const a=s.getLanguageConfiguration(r.getLanguageId()).foldingRules;if(a&&a.markers&&a.markers.start){const l=new RegExp(a.markers.start);iN(t,l,!1)}}}}class kte extends pn{constructor(){super({id:\"editor.foldAllExcept\",label:p(\"foldAllExcept.label\",\"Fold All Regions Except Selected\"),alias:\"Fold All Regions Except Selected\",precondition:an,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2131),weight:100}})}invoke(e,t,i){const n=this.getSelectedLines(i);k3(t,!0,n)}}class xte extends pn{constructor(){super({id:\"editor.unfoldAllExcept\",label:p(\"unfoldAllExcept.label\",\"Unfold All Regions Except Selected\"),alias:\"Unfold All Regions Except Selected\",precondition:an,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2129),weight:100}})}invoke(e,t,i){const n=this.getSelectedLines(i);k3(t,!1,n)}}class Ite extends pn{constructor(){super({id:\"editor.foldAll\",label:p(\"foldAllAction.label\",\"Fold All\"),alias:\"Fold All\",precondition:an,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2069),weight:100}})}invoke(e,t,i){Zg(t,!0)}}class Ete extends pn{constructor(){super({id:\"editor.unfoldAll\",label:p(\"unfoldAllAction.label\",\"Unfold All\"),alias:\"Unfold All\",precondition:an,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2088),weight:100}})}invoke(e,t,i){Zg(t,!1)}}class ih extends pn{getFoldingLevel(){return parseInt(this.id.substr(ih.ID_PREFIX.length))}invoke(e,t,i){ete(t,this.getFoldingLevel(),!0,this.getSelectedLines(i))}}ih.ID_PREFIX=\"editor.foldLevel\";ih.ID=o=>ih.ID_PREFIX+o;class Nte extends pn{constructor(){super({id:\"editor.gotoParentFold\",label:p(\"gotoParentFold.label\",\"Go to Parent Fold\"),alias:\"Go to Parent Fold\",precondition:an,kbOpts:{kbExpr:T.editorTextFocus,weight:100}})}invoke(e,t,i){const n=this.getSelectedLines(i);if(n.length>0){const s=tte(n[0],t);s!==null&&i.setSelection({startLineNumber:s,startColumn:1,endLineNumber:s,endColumn:1})}}}class Tte extends pn{constructor(){super({id:\"editor.gotoPreviousFold\",label:p(\"gotoPreviousFold.label\",\"Go to Previous Folding Range\"),alias:\"Go to Previous Folding Range\",precondition:an,kbOpts:{kbExpr:T.editorTextFocus,weight:100}})}invoke(e,t,i){const n=this.getSelectedLines(i);if(n.length>0){const s=ite(n[0],t);s!==null&&i.setSelection({startLineNumber:s,startColumn:1,endLineNumber:s,endColumn:1})}}}class Mte extends pn{constructor(){super({id:\"editor.gotoNextFold\",label:p(\"gotoNextFold.label\",\"Go to Next Folding Range\"),alias:\"Go to Next Folding Range\",precondition:an,kbOpts:{kbExpr:T.editorTextFocus,weight:100}})}invoke(e,t,i){const n=this.getSelectedLines(i);if(n.length>0){const s=nte(n[0],t);s!==null&&i.setSelection({startLineNumber:s,startColumn:1,endLineNumber:s,endColumn:1})}}}class Ate extends pn{constructor(){super({id:\"editor.createFoldingRangeFromSelection\",label:p(\"createManualFoldRange.label\",\"Create Manual Folding Range from Selection\"),alias:\"Create Folding Range from Selection\",precondition:an,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2130),weight:100}})}invoke(e,t,i){var n;const s=[],r=i.getSelections();if(r){for(const a of r){let l=a.endLineNumber;a.endColumn===1&&--l,l>a.startLineNumber&&(s.push({startLineNumber:a.startLineNumber,endLineNumber:l,type:void 0,isCollapsed:!0,source:1}),i.setSelection({startLineNumber:a.startLineNumber,startColumn:1,endLineNumber:a.startLineNumber,endColumn:1}))}if(s.length>0){s.sort((l,c)=>l.startLineNumber-c.startLineNumber);const a=ms.sanitizeAndMerge(t.regions,s,(n=i.getModel())===null||n===void 0?void 0:n.getLineCount());t.updatePost(ms.fromFoldRanges(a))}}}}class Rte extends pn{constructor(){super({id:\"editor.removeManualFoldingRanges\",label:p(\"removeManualFoldingRanges.label\",\"Remove Manual Folding Ranges\"),alias:\"Remove Manual Folding Ranges\",precondition:an,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2132),weight:100}})}invoke(e,t,i){const n=i.getSelections();if(n){const s=[];for(const r of n){const{startLineNumber:a,endLineNumber:l}=r;s.push(l>=a?{startLineNumber:a,endLineNumber:l}:{endLineNumber:l,startLineNumber:a})}t.removeManualRanges(s),e.triggerFoldingModelChanged()}}}rt(yg.ID,yg);te(bte);te(vte);te(Cte);te(Ste);te(Ite);te(Ete);te(yte);te(Lte);te(Dte);te(kte);te(xte);te(wte);te(Nte);te(Tte);te(Mte);te(Ate);te(Rte);for(let o=1;o<=7;o++)lP(new ih({id:ih.ID(o),label:p(\"foldLevelAction.label\",\"Fold Level {0}\",o),alias:`Fold Level ${o}`,precondition:an,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2048|21+o),weight:100}}));const Ote=N(\"editor.foldBackground\",{light:fe(Fa,.3),dark:fe(Fa,.3),hcDark:null,hcLight:null},p(\"foldBackgroundBackground\",\"Background color behind folded ranges. The color must not be opaque so as not to hide underlying decorations.\"),!0),Pte=N(\"editorGutter.foldingControlForeground\",{dark:z_,light:z_,hcDark:z_,hcLight:z_},p(\"editorGutter.foldingControlForeground\",\"Color of the folding control in the editor gutter.\"));Rt((o,e)=>{const t=o.getColor(Ote);t&&e.addRule(`.monaco-editor .folded-background { background-color: ${t}; }`);const i=o.getColor(Pte);i&&e.addRule(`\n\t\t.monaco-editor .cldr${nt.asCSSSelector(b_)},\n\t\t.monaco-editor .cldr${nt.asCSSSelector(B1)},\n\t\t.monaco-editor .cldr${nt.asCSSSelector(sN)},\n\t\t.monaco-editor .cldr${nt.asCSSSelector(x3)} {\n\t\t\tcolor: ${i} !important;\n\t\t}\n\t\t`)});class Fte extends he{constructor(){super({id:\"editor.action.fontZoomIn\",label:p(\"EditorFontZoomIn.label\",\"Editor Font Zoom In\"),alias:\"Editor Font Zoom In\",precondition:void 0})}run(e,t){tl.setZoomLevel(tl.getZoomLevel()+1)}}class Bte extends he{constructor(){super({id:\"editor.action.fontZoomOut\",label:p(\"EditorFontZoomOut.label\",\"Editor Font Zoom Out\"),alias:\"Editor Font Zoom Out\",precondition:void 0})}run(e,t){tl.setZoomLevel(tl.getZoomLevel()-1)}}class Wte extends he{constructor(){super({id:\"editor.action.fontZoomReset\",label:p(\"EditorFontZoomReset.label\",\"Editor Font Zoom Reset\"),alias:\"Editor Font Zoom Reset\",precondition:void 0})}run(e,t){tl.setZoomLevel(0)}}te(Fte);te(Bte);te(Wte);class Lg{static _handleEolEdits(e,t){let i;const n=[];for(const s of t)typeof s.eol==\"number\"&&(i=s.eol),s.range&&typeof s.text==\"string\"&&n.push(s);return typeof i==\"number\"&&e.hasModel()&&e.getModel().pushEOL(i),n}static _isFullModelReplaceEdit(e,t){if(!e.hasModel())return!1;const i=e.getModel(),n=i.validateRange(t.range);return i.getFullModelRange().equalsRange(n)}static execute(e,t,i){i&&e.pushUndoStop();const n=Lg._handleEolEdits(e,t);n.length===1&&Lg._isFullModelReplaceEdit(e,n[0])?e.executeEdits(\"formatEditsCommand\",n.map(s=>Pt.replace(L.lift(s.range),s.text))):e.executeEdits(\"formatEditsCommand\",n.map(s=>Pt.replaceMove(L.lift(s.range),s.text))),i&&e.pushUndoStop()}}class US{constructor(e){this.value=e,this._lower=e.toLowerCase()}static toKey(e){return typeof e==\"string\"?e.toLowerCase():e._lower}}var Qo=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};function oN(o){if(o=o.filter(n=>n.range),!o.length)return;let{range:e}=o[0];for(let n=1;n<o.length;n++)e=L.plusRange(e,o[n].range);const{startLineNumber:t,endLineNumber:i}=e;t===i?o.length===1?un(p(\"hint11\",\"Made 1 formatting edit on line {0}\",t)):un(p(\"hintn1\",\"Made {0} formatting edits on line {1}\",o.length,t)):o.length===1?un(p(\"hint1n\",\"Made 1 formatting edit between lines {0} and {1}\",t,i)):un(p(\"hintnn\",\"Made {0} formatting edits between lines {1} and {2}\",o.length,t,i))}function N3(o,e,t){const i=[],n=new Set,s=o.ordered(t);for(const a of s)i.push(a),a.extensionId&&n.add(US.toKey(a.extensionId));const r=e.ordered(t);for(const a of r){if(a.extensionId){if(n.has(US.toKey(a.extensionId)))continue;n.add(US.toKey(a.extensionId))}i.push({displayName:a.displayName,extensionId:a.extensionId,provideDocumentFormattingEdits(l,c,d){return a.provideDocumentRangeFormattingEdits(l,l.getFullModelRange(),c,d)}})}return i}class nh{static setFormatterSelector(e){return{dispose:nh._selectors.unshift(e)}}static select(e,t,i){return Qo(this,void 0,void 0,function*(){if(e.length===0)return;const n=Ue.first(nh._selectors);if(n)return yield n(e,t,i)})}}nh._selectors=new wn;function T3(o,e,t,i,n,s){return Qo(this,void 0,void 0,function*(){const r=o.get(Re),{documentRangeFormattingEditProvider:a}=o.get(ue),l=pc(e)?e.getModel():e,c=a.ordered(l),d=yield nh.select(c,l,i);d&&(n.report(d),yield r.invokeFunction(Vte,d,e,t,s))})}function Vte(o,e,t,i,n){return Qo(this,void 0,void 0,function*(){const s=o.get(Qs);let r,a;pc(t)?(r=t.getModel(),a=new Kd(t,5,void 0,n)):(r=t,a=new dE(t,n));const l=[];let c=0;for(const f of iI(i).sort(L.compareRangesUsingStarts))c>0&&L.areIntersectingOrTouching(l[c-1],f)?l[c-1]=L.fromPositions(l[c-1].getStartPosition(),f.getEndPosition()):c=l.push(f);const d=f=>Qo(this,void 0,void 0,function*(){return(yield e.provideDocumentRangeFormattingEdits(r,f,r.getFormattingOptions(),a.token))||[]}),h=(f,_)=>{if(!f.length||!_.length)return!1;const b=f.reduce((v,C)=>L.plusRange(v,C.range),f[0].range);if(!_.some(v=>L.intersectRanges(b,v.range)))return!1;for(const v of f)for(const C of _)if(L.intersectRanges(v.range,C.range))return!0;return!1},u=[],g=[];try{for(const f of l){if(a.token.isCancellationRequested)return!0;g.push(yield d(f))}for(let f=0;f<l.length;++f)for(let _=f+1;_<l.length;++_){if(a.token.isCancellationRequested)return!0;if(h(g[f],g[_])){const b=L.plusRange(l[f],l[_]),v=yield d(b);l.splice(_,1),l.splice(f,1),l.push(b),g.splice(_,1),g.splice(f,1),g.push(v),f=0,_=0}}for(const f of g){if(a.token.isCancellationRequested)return!0;const _=yield s.computeMoreMinimalEdits(r.uri,f);_&&u.push(..._)}}finally{a.dispose()}if(u.length===0)return!1;if(pc(t))Lg.execute(t,u,!0),oN(u),t.revealPositionInCenterIfOutsideViewport(t.getPosition(),1);else{const[{range:f}]=u,_=new oe(f.startLineNumber,f.startColumn,f.endLineNumber,f.endColumn);r.pushEditOperations([_],u.map(b=>({text:b.text,range:L.lift(b.range),forceMoveMarkers:!0})),b=>{for(const{range:v}of b)if(L.areIntersectingOrTouching(v,_))return[new oe(v.startLineNumber,v.startColumn,v.endLineNumber,v.endColumn)];return null})}return!0})}function Hte(o,e,t,i,n){return Qo(this,void 0,void 0,function*(){const s=o.get(Re),r=o.get(ue),a=pc(e)?e.getModel():e,l=N3(r.documentFormattingEditProvider,r.documentRangeFormattingEditProvider,a),c=yield nh.select(l,a,t);c&&(i.report(c),yield s.invokeFunction(zte,c,e,t,n))})}function zte(o,e,t,i,n){return Qo(this,void 0,void 0,function*(){const s=o.get(Qs);let r,a;pc(t)?(r=t.getModel(),a=new Kd(t,5,void 0,n)):(r=t,a=new dE(t,n));let l;try{const c=yield e.provideDocumentFormattingEdits(r,r.getFormattingOptions(),a.token);if(l=yield s.computeMoreMinimalEdits(r.uri,c),a.token.isCancellationRequested)return!0}finally{a.dispose()}if(!l||l.length===0)return!1;if(pc(t))Lg.execute(t,l,i!==2),i!==2&&(oN(l),t.revealPositionInCenterIfOutsideViewport(t.getPosition(),1));else{const[{range:c}]=l,d=new oe(c.startLineNumber,c.startColumn,c.endLineNumber,c.endColumn);r.pushEditOperations([d],l.map(h=>({text:h.text,range:L.lift(h.range),forceMoveMarkers:!0})),h=>{for(const{range:u}of h)if(L.areIntersectingOrTouching(u,d))return[new oe(u.startLineNumber,u.startColumn,u.endLineNumber,u.endColumn)];return null})}return!0})}function Ute(o,e,t,i,n,s){return Qo(this,void 0,void 0,function*(){const r=e.documentRangeFormattingEditProvider.ordered(t);for(const a of r){const l=yield Promise.resolve(a.provideDocumentRangeFormattingEdits(t,i,n,s)).catch(Ai);if(en(l))return yield o.computeMoreMinimalEdits(t.uri,l)}})}function $te(o,e,t,i,n){return Qo(this,void 0,void 0,function*(){const s=N3(e.documentFormattingEditProvider,e.documentRangeFormattingEditProvider,t);for(const r of s){const a=yield Promise.resolve(r.provideDocumentFormattingEdits(t,i,n)).catch(Ai);if(en(a))return yield o.computeMoreMinimalEdits(t.uri,a)}})}function M3(o,e,t,i,n,s,r){const a=e.onTypeFormattingEditProvider.ordered(t);return a.length===0||a[0].autoFormatTriggerCharacters.indexOf(n)<0?Promise.resolve(void 0):Promise.resolve(a[0].provideOnTypeFormattingEdits(t,i,n,s,r)).catch(Ai).then(l=>o.computeMoreMinimalEdits(t.uri,l))}Ye.registerCommand(\"_executeFormatRangeProvider\",function(o,...e){return Qo(this,void 0,void 0,function*(){const[t,i,n]=e;gt(me.isUri(t)),gt(L.isIRange(i));const s=o.get($n),r=o.get(Qs),a=o.get(ue),l=yield s.createModelReference(t);try{return Ute(r,a,l.object.textEditorModel,L.lift(i),n,We.None)}finally{l.dispose()}})});Ye.registerCommand(\"_executeFormatDocumentProvider\",function(o,...e){return Qo(this,void 0,void 0,function*(){const[t,i]=e;gt(me.isUri(t));const n=o.get($n),s=o.get(Qs),r=o.get(ue),a=yield n.createModelReference(t);try{return $te(s,r,a.object.textEditorModel,i,We.None)}finally{a.dispose()}})});Ye.registerCommand(\"_executeFormatOnTypeProvider\",function(o,...e){return Qo(this,void 0,void 0,function*(){const[t,i,n,s]=e;gt(me.isUri(t)),gt(B.isIPosition(i)),gt(typeof n==\"string\");const r=o.get($n),a=o.get(Qs),l=o.get(ue),c=yield r.createModelReference(t);try{return M3(a,l,c.object.textEditorModel,B.lift(i),n,s,We.None)}finally{c.dispose()}})});var A3=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Hv=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},rN=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};let wm=class{constructor(e,t,i){this._editor=e,this._languageFeaturesService=t,this._workerService=i,this._disposables=new ee,this._sessionDisposables=new ee,this._disposables.add(t.onTypeFormattingEditProvider.onDidChange(this._update,this)),this._disposables.add(e.onDidChangeModel(()=>this._update())),this._disposables.add(e.onDidChangeModelLanguage(()=>this._update())),this._disposables.add(e.onDidChangeConfiguration(n=>{n.hasChanged(51)&&this._update()}))}dispose(){this._disposables.dispose(),this._sessionDisposables.dispose()}_update(){if(this._sessionDisposables.clear(),!this._editor.getOption(51)||!this._editor.hasModel())return;const e=this._editor.getModel(),[t]=this._languageFeaturesService.onTypeFormattingEditProvider.ordered(e);if(!t||!t.autoFormatTriggerCharacters)return;const i=new ru;for(const n of t.autoFormatTriggerCharacters)i.add(n.charCodeAt(0));this._sessionDisposables.add(this._editor.onDidType(n=>{const s=n.charCodeAt(n.length-1);i.has(s)&&this._trigger(String.fromCharCode(s))}))}_trigger(e){if(!this._editor.hasModel()||this._editor.getSelections().length>1||!this._editor.getSelection().isEmpty())return;const t=this._editor.getModel(),i=this._editor.getPosition(),n=new gn,s=this._editor.onDidChangeModelContent(r=>{if(r.isFlush){n.cancel(),s.dispose();return}for(let a=0,l=r.changes.length;a<l;a++)if(r.changes[a].range.endLineNumber<=i.lineNumber){n.cancel(),s.dispose();return}});M3(this._workerService,this._languageFeaturesService,t,i,e,t.getFormattingOptions(),n.token).then(r=>{n.token.isCancellationRequested||en(r)&&(Lg.execute(this._editor,r,!0),oN(r))}).finally(()=>{s.dispose()})}};wm.ID=\"editor.contrib.autoFormat\";wm=A3([Hv(1,ue),Hv(2,Qs)],wm);let Sm=class{constructor(e,t,i){this.editor=e,this._languageFeaturesService=t,this._instantiationService=i,this._callOnDispose=new ee,this._callOnModel=new ee,this._callOnDispose.add(e.onDidChangeConfiguration(()=>this._update())),this._callOnDispose.add(e.onDidChangeModel(()=>this._update())),this._callOnDispose.add(e.onDidChangeModelLanguage(()=>this._update())),this._callOnDispose.add(t.documentRangeFormattingEditProvider.onDidChange(this._update,this))}dispose(){this._callOnDispose.dispose(),this._callOnModel.dispose()}_update(){this._callOnModel.clear(),this.editor.getOption(50)&&(!this.editor.hasModel()||!this._languageFeaturesService.documentRangeFormattingEditProvider.has(this.editor.getModel())||this._callOnModel.add(this.editor.onDidPaste(({range:e})=>this._trigger(e))))}_trigger(e){!this.editor.hasModel()||this.editor.getSelections().length>1||this._instantiationService.invokeFunction(T3,this.editor,e,2,wh.None,We.None).catch(Ee)}};Sm.ID=\"editor.contrib.formatOnPaste\";Sm=A3([Hv(1,ue),Hv(2,Re)],Sm);class jte extends he{constructor(){super({id:\"editor.action.formatDocument\",label:p(\"formatDocument.label\",\"Format Document\"),alias:\"Format Document\",precondition:re.and(T.notInCompositeEditor,T.writable,T.hasDocumentFormattingProvider),kbOpts:{kbExpr:T.editorTextFocus,primary:1572,linux:{primary:3111},weight:100},contextMenuOpts:{group:\"1_modification\",order:1.3}})}run(e,t){return rN(this,void 0,void 0,function*(){if(t.hasModel()){const i=e.get(Re);yield e.get(kc).showWhile(i.invokeFunction(Hte,t,1,wh.None,We.None),250)}})}}class Kte extends he{constructor(){super({id:\"editor.action.formatSelection\",label:p(\"formatSelection.label\",\"Format Selection\"),alias:\"Format Selection\",precondition:re.and(T.writable,T.hasDocumentSelectionFormattingProvider),kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2084),weight:100},contextMenuOpts:{when:T.hasNonEmptySelection,group:\"1_modification\",order:1.31}})}run(e,t){return rN(this,void 0,void 0,function*(){if(!t.hasModel())return;const i=e.get(Re),n=t.getModel(),s=t.getSelections().map(a=>a.isEmpty()?new L(a.startLineNumber,1,a.startLineNumber,n.getLineMaxColumn(a.startLineNumber)):a);yield e.get(kc).showWhile(i.invokeFunction(T3,t,s,1,wh.None,We.None),250)})}}rt(wm.ID,wm);rt(Sm.ID,Sm);te(jte);te(Kte);Ye.registerCommand(\"editor.action.format\",o=>rN(void 0,void 0,void 0,function*(){const e=o.get(dt).getFocusedCodeEditor();if(!e||!e.hasModel())return;const t=o.get(Ci);e.getSelection().isEmpty()?yield t.executeCommand(\"editor.action.formatDocument\"):yield t.executeCommand(\"editor.action.formatSelection\")}));var qte=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},$S=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},Gte=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class Su{remove(){var e;(e=this.parent)===null||e===void 0||e.children.delete(this.id)}static findId(e,t){let i;typeof e==\"string\"?i=`${t.id}/${e}`:(i=`${t.id}/${e.name}`,t.children.get(i)!==void 0&&(i=`${t.id}/${e.name}_${e.range.startLineNumber}_${e.range.startColumn}`));let n=i;for(let s=0;t.children.get(n)!==void 0;s++)n=`${i}_${s}`;return n}static empty(e){return e.children.size===0}}class zv extends Su{constructor(e,t,i){super(),this.id=e,this.parent=t,this.symbol=i,this.children=new Map}}class Zte extends Su{constructor(e,t,i,n){super(),this.id=e,this.parent=t,this.label=i,this.order=n,this.children=new Map}}class xa extends Su{constructor(e){super(),this.uri=e,this.id=\"root\",this.parent=void 0,this._groups=new Map,this.children=new Map,this.id=\"root\",this.parent=void 0}static create(e,t,i){const n=new gn(i),s=new xa(t.uri),r=e.ordered(t),a=r.map((c,d)=>{var h;const u=Su.findId(`provider_${d}`,s),g=new Zte(u,s,(h=c.displayName)!==null&&h!==void 0?h:\"Unknown Outline Provider\",d);return Promise.resolve(c.provideDocumentSymbols(t,n.token)).then(f=>{for(const _ of f||[])xa._makeOutlineElement(_,g);return g},f=>(Ai(f),g)).then(f=>{Su.empty(f)?f.remove():s._groups.set(u,f)})}),l=e.onDidChange(()=>{const c=e.ordered(t);ys(c,r)||n.cancel()});return Promise.all(a).then(()=>n.token.isCancellationRequested&&!i.isCancellationRequested?xa.create(e,t,i):s._compact()).finally(()=>{l.dispose()})}static _makeOutlineElement(e,t){const i=Su.findId(e,t),n=new zv(i,t,e);if(e.children)for(const s of e.children)xa._makeOutlineElement(s,n);t.children.set(n.id,n)}_compact(){let e=0;for(const[t,i]of this._groups)i.children.size===0?this._groups.delete(t):e+=1;if(e!==1)this.children=this._groups;else{const t=Ue.first(this._groups.values());for(const[,i]of t.children)i.parent=this,this.children.set(i.id,i)}return this}getTopLevelSymbols(){const e=[];for(const t of this.children.values())t instanceof zv?e.push(t.symbol):e.push(...Ue.map(t.children.values(),i=>i.symbol));return e.sort((t,i)=>L.compareRangesUsingStarts(t.range,i.range))}asListOfDocumentSymbols(){const e=this.getTopLevelSymbols(),t=[];return xa._flattenDocumentSymbols(t,e,\"\"),t.sort((i,n)=>B.compare(L.getStartPosition(i.range),L.getStartPosition(n.range))||B.compare(L.getEndPosition(n.range),L.getEndPosition(i.range)))}static _flattenDocumentSymbols(e,t,i){for(const n of t)e.push({kind:n.kind,tags:n.tags,name:n.name,detail:n.detail,containerName:n.containerName||i,range:n.range,selectionRange:n.selectionRange,children:void 0}),n.children&&xa._flattenDocumentSymbols(e,n.children,n.name)}}const R3=qe(\"IOutlineModelService\");let uD=class{constructor(e,t,i){this._languageFeaturesService=e,this._disposables=new ee,this._cache=new bh(10,.7),this._debounceInformation=t.for(e.documentSymbolProvider,\"DocumentSymbols\",{min:350}),this._disposables.add(i.onModelRemoved(n=>{this._cache.delete(n.id)}))}dispose(){this._disposables.dispose()}getOrCreate(e,t){return Gte(this,void 0,void 0,function*(){const i=this._languageFeaturesService.documentSymbolProvider,n=i.ordered(e);let s=this._cache.get(e.id);if(!s||s.versionId!==e.getVersionId()||!ys(s.provider,n)){const a=new gn;s={versionId:e.getVersionId(),provider:n,promiseCnt:0,source:a,promise:xa.create(i,e,a.token),model:void 0},this._cache.set(e.id,s);const l=Date.now();s.promise.then(c=>{s.model=c,this._debounceInformation.update(e,Date.now()-l)}).catch(c=>{this._cache.delete(e.id)})}if(s.model)return s.model;s.promiseCnt+=1;const r=t.onCancellationRequested(()=>{--s.promiseCnt===0&&(s.source.cancel(),this._cache.delete(e.id))});try{return yield s.promise}finally{r.dispose()}})}};uD=qte([$S(0,ue),$S(1,Js),$S(2,Bt)],uD);Xe(R3,uD,!0);var Yte=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};Ye.registerCommand(\"_executeDocumentSymbolProvider\",function(o,...e){return Yte(this,void 0,void 0,function*(){const[t]=e;gt(me.isUri(t));const i=o.get(R3),s=yield o.get($n).createModelReference(t);try{return(yield i.getOrCreate(s.object.textEditorModel,We.None)).getTopLevelSymbols()}finally{s.dispose()}})});const Uv=\"editor.action.inlineSuggest.commit\";function Xte(o,e){return{object:o,dispose:()=>e==null?void 0:e.dispose()}}function Qte(o,e){const t=new Jte(o),i=e.map(n=>{const s=L.lift(n.range);return{startOffset:t.getOffset(s.getStartPosition()),endOffset:t.getOffset(s.getEndPosition()),text:n.text}});i.sort((n,s)=>s.startOffset-n.startOffset);for(const n of i)o=o.substring(0,n.startOffset)+n.text+o.substring(n.endOffset);return o}class Jte{constructor(e){this.lineStartOffsetByLineIdx=[],this.lineStartOffsetByLineIdx.push(0);for(let t=0;t<e.length;t++)e.charAt(t)===`\n`&&this.lineStartOffsetByLineIdx.push(t+1)}getOffset(e){return this.lineStartOffsetByLineIdx[e.lineNumber-1]+e.column-1}}const eie=[];function tie(){return eie}class O3{constructor(e,t,i=0){this.lineNumber=e,this.parts=t,this.additionalReservedLineCount=i}renderForScreenReader(e){if(this.parts.length===0)return\"\";const t=this.parts[this.parts.length-1],i=e.substr(0,t.column-1);return Qte(i,this.parts.map(s=>({range:{startLineNumber:1,endLineNumber:1,startColumn:s.column,endColumn:s.column},text:s.lines.join(`\n`)}))).substring(this.parts[0].column-1)}isEmpty(){return this.parts.every(e=>e.lines.length===0)}}class gD{constructor(e,t,i){this.column=e,this.lines=t,this.preview=i}}class P3{constructor(e,t,i,n,s=0){this.lineNumber=e,this.columnStart=t,this.length=i,this.newLines=n,this.additionalReservedLineCount=s,this.parts=[new gD(this.columnStart+this.length,this.newLines,!1)]}renderForScreenReader(e){return this.newLines.join(`\n`)}}class F3 extends z{constructor(e){super(),this.editor=e,this._expanded=void 0,this.onDidChangeEmitter=new O,this.onDidChange=this.onDidChangeEmitter.event,this._register(e.onDidChangeConfiguration(t=>{t.hasChanged(108)&&this._expanded===void 0&&this.onDidChangeEmitter.fire()}))}setExpanded(e){this._expanded=!0,this.onDidChangeEmitter.fire()}}function $v(o,e){if(!e)return e;const t=o.getValueInRange(e.range),i=Pd(t,e.insertText),n=o.getOffsetAt(e.range.getStartPosition())+i,s=o.getPositionAt(n),r=t.substr(i),a=Np(r,e.insertText),l=o.getPositionAt(Math.max(n,o.getOffsetAt(e.range.getEndPosition())-a));return{range:L.fromPositions(s,l),insertText:e.insertText.substr(i,e.insertText.length-i-a),snippetInfo:e.snippetInfo,filterText:e.filterText,additionalTextEdits:e.additionalTextEdits}}function iie(o,e){return o===e?!0:!o||!e?!1:o.range.equalsRange(e.range)&&o.insertText===e.insertText&&o.command===e.command}function B3(o,e,t,i,n=0){if(o.range.startLineNumber!==o.range.endLineNumber)return;const s=e.getLineContent(o.range.startLineNumber),r=pt(s).length;if(o.range.startColumn-1<=r){const g=pt(o.insertText).length,f=s.substring(o.range.startColumn-1,r),_=L.fromPositions(o.range.getStartPosition().delta(0,f.length),o.range.getEndPosition()),b=o.insertText.startsWith(f)?o.insertText.substring(f.length):o.insertText.substring(g);o={range:_,insertText:b,command:o.command,snippetInfo:void 0,filterText:o.filterText,additionalTextEdits:o.additionalTextEdits}}const l=e.getValueInRange(o.range),c=nie(l,o.insertText);if(!c)return;const d=o.range.startLineNumber,h=new Array;if(t===\"prefix\"){const g=c.filter(f=>f.originalLength===0);if(g.length>1||g.length===1&&g[0].originalStart!==l.length)return}const u=o.insertText.length-n;for(const g of c){const f=o.range.startColumn+g.originalStart+g.originalLength;if(t===\"subwordSmart\"&&i&&i.lineNumber===o.range.startLineNumber&&f<i.column||g.originalLength>0)return;if(g.modifiedLength===0)continue;const _=g.modifiedStart+g.modifiedLength,b=Math.max(g.modifiedStart,Math.min(_,u)),v=o.insertText.substring(g.modifiedStart,b),C=o.insertText.substring(b,Math.max(g.modifiedStart,_));if(v.length>0){const w=Ur(v);h.push(new gD(f,w,!1))}if(C.length>0){const w=Ur(C);h.push(new gD(f,w,!0))}}return new O3(d,h,0)}let hr;function nie(o,e){if((hr==null?void 0:hr.originalValue)===o&&(hr==null?void 0:hr.newValue)===e)return hr==null?void 0:hr.changes;{let t=yA(o,e,!0);if(t){const i=SA(t);if(i>0){const n=yA(o,e,!1);n&&SA(n)<i&&(t=n)}}return hr={originalValue:o,newValue:e,changes:t},t}}function SA(o){let e=0;for(const t of o)e+=Math.max(t.originalLength-t.modifiedLength,0);return e}function yA(o,e,t){if(o.length>5e3||e.length>5e3)return;function i(c){let d=0;for(let h=0,u=c.length;h<u;h++){const g=c.charCodeAt(h);g>d&&(d=g)}return d}const n=Math.max(i(o),i(e));function s(c){if(c<0)throw new Error(\"unexpected\");return n+c+1}function r(c){let d=0,h=0;const u=new Int32Array(c.length);for(let g=0,f=c.length;g<f;g++)if(t&&c[g]===\"(\"){const _=h*100+d;u[g]=s(2*_),d++}else if(t&&c[g]===\")\"){d=Math.max(d-1,0);const _=h*100+d;u[g]=s(2*_+1),d===0&&h++}else u[g]=c.charCodeAt(g);return u}const a=r(o),l=r(e);return new kr({getElements:()=>a},{getElements:()=>l}).ComputeDiff(!1).changes}function sie(o,e){const t=new A4,i=new O4(t,c=>e.getLanguageConfiguration(c)),n=new R4(new oie([o]),i),s=tL(n,[],void 0,!0);let r=\"\";const a=o.getLineContent();function l(c,d){if(c.kind===2)l(c.openingBracket,d),d=qt(d,c.openingBracket.length),c.child&&(l(c.child,d),d=qt(d,c.child.length)),c.closingBracket?(l(c.closingBracket,d),d=qt(d,c.closingBracket.length)):r+=i.getSingleLanguageBracketTokens(c.openingBracket.languageId).findClosingTokenText(c.openingBracket.bracketIds);else if(c.kind!==3){if(c.kind===0||c.kind===1)r+=a.substring(d,qt(d,c.length));else if(c.kind===4)for(const h of c.children)l(h,d),d=qt(d,h.length)}}return l(s,go),r}class oie{constructor(e){this.lines=e,this.tokenization={getLineTokens:t=>this.lines[t-1]}}getLineCount(){return this.lines.length}getLineLength(e){return this.lines[e-1].getLineContent().length}}var rie=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Lf=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},Ia=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};let fD=class extends z{constructor(e,t,i,n,s,r,a){super(),this.editor=e,this.cache=t,this.commandService=i,this.languageConfigurationService=n,this.languageFeaturesService=s,this.debounceService=r,this.onDidChangeEmitter=new O,this.onDidChange=this.onDidChangeEmitter.event,this.completionSession=this._register(new Vn),this.active=!1,this.disposed=!1,this.debounceValue=this.debounceService.for(this.languageFeaturesService.inlineCompletionsProvider,\"InlineCompletionsDebounce\",{min:50,max:50}),this._register(i.onDidExecuteCommand(l=>{new Set([Tu.Tab.id,Tu.DeleteLeft.id,Tu.DeleteRight.id,Uv,\"acceptSelectedSuggestion\"]).has(l.commandId)&&e.hasTextFocus()&&this.handleUserInput()})),this._register(this.editor.onDidType(l=>{this.handleUserInput()})),this._register(this.editor.onDidChangeCursorPosition(l=>{(l.reason===3||this.session&&!this.session.isValid)&&this.hide()})),this._register(ze(()=>{this.disposed=!0})),this._register(this.editor.onDidBlurEditorWidget(()=>{a.getValue(\"editor.inlineSuggest.hideOnBlur\")||this.hide()}))}handleUserInput(){this.session&&!this.session.isValid&&this.hide(),setTimeout(()=>{this.disposed||this.startSessionIfTriggered()},0)}get session(){return this.completionSession.value}get ghostText(){var e;return(e=this.session)===null||e===void 0?void 0:e.ghostText}get minReservedLineCount(){return this.session?this.session.minReservedLineCount:0}setExpanded(e){var t;(t=this.session)===null||t===void 0||t.setExpanded(e)}setActive(e){var t;this.active=e,e&&((t=this.session)===null||t===void 0||t.scheduleAutomaticUpdate())}startSessionIfTriggered(){!this.editor.getOption(57).enabled||this.session&&this.session.isValid||this.trigger(Bs.Automatic)}trigger(e){if(this.completionSession.value){e===Bs.Explicit&&this.completionSession.value.ensureUpdateWithExplicitContext();return}this.completionSession.value=new aie(this.editor,this.editor.getPosition(),()=>this.active,this.commandService,this.cache,e,this.languageConfigurationService,this.languageFeaturesService.inlineCompletionsProvider,this.debounceValue),this.completionSession.value.takeOwnership(this.completionSession.value.onDidChange(()=>{this.onDidChangeEmitter.fire()}))}hide(){this.completionSession.clear(),this.onDidChangeEmitter.fire()}commitCurrentSuggestion(){var e;(e=this.session)===null||e===void 0||e.commitCurrentCompletion()}showNext(){var e;(e=this.session)===null||e===void 0||e.showNextInlineCompletion()}showPrevious(){var e;(e=this.session)===null||e===void 0||e.showPreviousInlineCompletion()}hasMultipleInlineCompletions(){var e;return Ia(this,void 0,void 0,function*(){const t=yield(e=this.session)===null||e===void 0?void 0:e.hasMultipleInlineCompletions();return t!==void 0?t:!1})}};fD=rie([Lf(2,Ci),Lf(3,ti),Lf(4,ue),Lf(5,Js),Lf(6,ot)],fD);class aie extends F3{constructor(e,t,i,n,s,r,a,l,c){super(e),this.triggerPosition=t,this.shouldUpdate=i,this.commandService=n,this.cache=s,this.initialTriggerKind=r,this.languageConfigurationService=a,this.registry=l,this.debounce=c,this.minReservedLineCount=0,this.updateOperation=this._register(new Vn),this.updateSoon=this._register(new ft(()=>{const h=this.initialTriggerKind;return this.initialTriggerKind=Bs.Automatic,this.update(h)},50)),this.filteredCompletions=[],this.currentlySelectedCompletionId=void 0;let d;this._register(this.onDidChange(()=>{var h;const u=this.currentCompletion;if(u&&u.sourceInlineCompletion!==d){d=u.sourceInlineCompletion;const g=u.sourceProvider;(h=g.handleItemDidShow)===null||h===void 0||h.call(g,u.sourceInlineCompletions,d)}})),this._register(ze(()=>{this.cache.clear()})),this._register(this.editor.onDidChangeCursorPosition(h=>{var u;h.reason!==3&&((u=this.cache.value)===null||u===void 0||u.updateRanges(),this.cache.value&&(this.updateFilteredInlineCompletions(),this.onDidChangeEmitter.fire()))})),this._register(this.editor.onDidChangeModelContent(h=>{var u;(u=this.cache.value)===null||u===void 0||u.updateRanges(),this.updateFilteredInlineCompletions(),this.scheduleAutomaticUpdate()})),this._register(this.registry.onDidChange(()=>{this.updateSoon.schedule(this.debounce.get(this.editor.getModel()))})),this.scheduleAutomaticUpdate()}updateFilteredInlineCompletions(){if(!this.cache.value){this.filteredCompletions=[];return}const e=this.editor.getModel(),t=e.validatePosition(this.editor.getPosition());this.filteredCompletions=this.cache.value.completions.filter(i=>{const n=e.getValueInRange(i.synchronizedRange).toLowerCase(),s=i.inlineCompletion.filterText.toLowerCase(),r=e.getLineIndentColumn(i.synchronizedRange.startLineNumber),a=Math.max(0,t.column-i.synchronizedRange.startColumn);let l=s.substring(0,a),c=s.substring(a),d=n.substring(0,a),h=n.substring(a);return i.synchronizedRange.startColumn<=r&&(d=d.trimStart(),d.length===0&&(h=h.trimStart()),l=l.trimStart(),l.length===0&&(c=c.trimStart())),l.startsWith(d)&&o5(h,c)})}fixAndGetIndexOfCurrentSelection(){if(!this.currentlySelectedCompletionId||!this.cache.value||this.cache.value.completions.length===0)return 0;const e=this.filteredCompletions.findIndex(t=>t.semanticId===this.currentlySelectedCompletionId);return e===-1?(this.currentlySelectedCompletionId=void 0,0):e}get currentCachedCompletion(){if(!!this.cache.value)return this.filteredCompletions[this.fixAndGetIndexOfCurrentSelection()]}showNextInlineCompletion(){return Ia(this,void 0,void 0,function*(){yield this.ensureUpdateWithExplicitContext();const e=this.filteredCompletions||[];if(e.length>0){const t=(this.fixAndGetIndexOfCurrentSelection()+1)%e.length;this.currentlySelectedCompletionId=e[t].semanticId}else this.currentlySelectedCompletionId=void 0;this.onDidChangeEmitter.fire()})}showPreviousInlineCompletion(){return Ia(this,void 0,void 0,function*(){yield this.ensureUpdateWithExplicitContext();const e=this.filteredCompletions||[];if(e.length>0){const t=(this.fixAndGetIndexOfCurrentSelection()+e.length-1)%e.length;this.currentlySelectedCompletionId=e[t].semanticId}else this.currentlySelectedCompletionId=void 0;this.onDidChangeEmitter.fire()})}ensureUpdateWithExplicitContext(){var e;return Ia(this,void 0,void 0,function*(){this.updateOperation.value?this.updateOperation.value.triggerKind===Bs.Explicit?yield this.updateOperation.value.promise:yield this.update(Bs.Explicit):((e=this.cache.value)===null||e===void 0?void 0:e.triggerKind)!==Bs.Explicit&&(yield this.update(Bs.Explicit))})}hasMultipleInlineCompletions(){var e;return Ia(this,void 0,void 0,function*(){return yield this.ensureUpdateWithExplicitContext(),(((e=this.cache.value)===null||e===void 0?void 0:e.completions.length)||0)>1})}get ghostText(){const e=this.currentCompletion;if(!e)return;const t=this.editor.getPosition();if(e.range.getEndPosition().isBefore(t))return;const i=this.editor.getOptions().get(57).mode,n=B3(e,this.editor.getModel(),i,t);return n?n.isEmpty()?void 0:n:new P3(e.range.startLineNumber,e.range.startColumn,e.range.endColumn-e.range.startColumn,e.insertText.split(`\n`),0)}get currentCompletion(){const e=this.currentCachedCompletion;if(!!e)return e.toLiveInlineCompletion()}get isValid(){return this.editor.getPosition().lineNumber===this.triggerPosition.lineNumber}scheduleAutomaticUpdate(){this.updateOperation.clear(),this.updateSoon.schedule(this.debounce.get(this.editor.getModel()))}update(e){return Ia(this,void 0,void 0,function*(){if(!this.shouldUpdate())return;const t=this.editor.getPosition(),i=new Date,n=Ti(r=>Ia(this,void 0,void 0,function*(){let a;try{a=yield V3(this.registry,t,this.editor.getModel(),{triggerKind:e,selectedSuggestionInfo:void 0},r,this.languageConfigurationService);const l=new Date;this.debounce.update(this.editor.getModel(),l.getTime()-i.getTime())}catch(l){Ee(l);return}r.isCancellationRequested||(this.cache.setValue(this.editor,a,e),this.updateFilteredInlineCompletions(),this.onDidChangeEmitter.fire())})),s=new W3(n,e);this.updateOperation.value=s,yield n,this.updateOperation.value===s&&this.updateOperation.clear()})}takeOwnership(e){this._register(e)}commitCurrentCompletion(){if(!this.ghostText)return;const t=this.currentCompletion;t&&this.commit(t)}commit(e){var t;const i=this.cache.clearAndLeak();e.snippetInfo?(this.editor.executeEdits(\"inlineSuggestion.accept\",[Pt.replaceMove(e.range,\"\"),...e.additionalTextEdits]),this.editor.setPosition(e.snippetInfo.range.getStartPosition()),(t=Mi.get(this.editor))===null||t===void 0||t.insert(e.snippetInfo.snippet)):this.editor.executeEdits(\"inlineSuggestion.accept\",[Pt.replaceMove(e.range,e.insertText),...e.additionalTextEdits]),e.command?this.commandService.executeCommand(e.command.id,...e.command.arguments||[]).finally(()=>{i==null||i.dispose()}).then(void 0,Ai):i==null||i.dispose(),this.onDidChangeEmitter.fire()}get commands(){var e;return[...new Set(((e=this.cache.value)===null||e===void 0?void 0:e.completions.map(i=>i.inlineCompletion.sourceInlineCompletions))||[])].flatMap(i=>i.commands||[])}}class W3{constructor(e,t){this.promise=e,this.triggerKind=t}dispose(){this.promise.cancel()}}class lie extends z{constructor(e,t,i,n){super(),this.editor=t,this.onChange=i,this.triggerKind=n,this.isDisposing=!1;const s=t.changeDecorations(r=>r.deltaDecorations([],e.items.map(a=>({range:a.range,options:{description:\"inline-completion-tracking-range\"}}))));this._register(ze(()=>{this.isDisposing=!0,t.removeDecorations(s)})),this.completions=e.items.map((r,a)=>new cie(r,s[a])),this._register(t.onDidChangeModelContent(()=>{this.updateRanges()})),this._register(e)}updateRanges(){if(this.isDisposing)return;let e=!1;const t=this.editor.getModel();for(const i of this.completions){const n=t.getDecorationRange(i.decorationId);if(!n){Ee(new Error(\"Decoration has no range\"));continue}i.synchronizedRange.equalsRange(n)||(e=!0,i.synchronizedRange=n)}e&&this.onChange()}}class cie{constructor(e,t){this.inlineCompletion=e,this.decorationId=t,this.semanticId=JSON.stringify({text:this.inlineCompletion.insertText,abbreviation:this.inlineCompletion.filterText,startLine:this.inlineCompletion.range.startLineNumber,startColumn:this.inlineCompletion.range.startColumn,command:this.inlineCompletion.command}),this.synchronizedRange=e.range}toLiveInlineCompletion(){return{insertText:this.inlineCompletion.insertText,range:this.synchronizedRange,command:this.inlineCompletion.command,sourceProvider:this.inlineCompletion.sourceProvider,sourceInlineCompletions:this.inlineCompletion.sourceInlineCompletions,sourceInlineCompletion:this.inlineCompletion.sourceInlineCompletion,snippetInfo:this.inlineCompletion.snippetInfo,filterText:this.inlineCompletion.filterText,additionalTextEdits:this.inlineCompletion.additionalTextEdits}}}function V3(o,e,t,i,n=We.None,s){return Ia(this,void 0,void 0,function*(){const r=die(e,t),a=o.all(t),l=yield Promise.all(a.map(d=>Ia(this,void 0,void 0,function*(){const h=yield Promise.resolve(d.provideInlineCompletions(t,e,i,n)).catch(Ai);return{completions:h,provider:d,dispose:()=>{h&&d.freeInlineCompletions(h)}}}))),c=new Map;for(const d of l){const h=d.completions;if(!!h)for(const u of h.items){let g=u.range?L.lift(u.range):r;if(g.startLineNumber!==g.endLineNumber)continue;let f,_;if(typeof u.insertText==\"string\"){if(f=u.insertText,s&&u.completeBracketPairs){f=hie(f,g.getStartPosition(),t,s);const v=f.length-u.insertText.length;v!==0&&(g=new L(g.startLineNumber,g.startColumn,g.endLineNumber,g.endColumn+v))}_=void 0}else\"snippet\"in u.insertText?(f=new _c().parse(u.insertText.snippet).toString(),_={snippet:u.insertText.snippet,range:g}):wC(u.insertText);const b={insertText:f,snippetInfo:_,range:g,command:u.command,sourceProvider:d.provider,sourceInlineCompletions:h,sourceInlineCompletion:u,filterText:u.filterText||f,additionalTextEdits:u.additionalTextEdits||tie()};c.set(JSON.stringify({insertText:f,range:u.range}),b)}}return{items:[...c.values()],dispose:()=>{for(const d of l)d.dispose()}}})}function die(o,e){const t=e.getWordAtPosition(o),i=e.getLineMaxColumn(o.lineNumber);return t?new L(o.lineNumber,t.startColumn,o.lineNumber,i):L.fromPositions(o,o.with(void 0,i))}function hie(o,e,t,i){const s=t.getLineContent(e.lineNumber).substring(0,e.column-1)+o,r=t.tokenization.tokenizeLineWithEdit(e,s.length-(e.column-1),o),a=r==null?void 0:r.sliceAndInflate(e.column-1,s.length,0);return a?sie(a,i):o}var uie=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},LA=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};class aN{constructor(e){this.name=e}select(e,t,i){if(i.length===0)return 0;const n=i[0].score[0];for(let s=0;s<i.length;s++){const{score:r,completion:a}=i[s];if(r[0]!==n)break;if(a.preselect)return s}return 0}}class H3 extends aN{constructor(){super(\"first\")}memorize(e,t,i){}toJSON(){}fromJSON(){}}class gie extends aN{constructor(){super(\"recentlyUsed\"),this._cache=new bh(300,.66),this._seq=0}memorize(e,t,i){const n=`${e.getLanguageId()}/${i.textLabel}`;this._cache.set(n,{touch:this._seq++,type:i.completion.kind,insertText:i.completion.insertText})}select(e,t,i){if(i.length===0)return 0;const n=e.getLineContent(t.lineNumber).substr(t.column-10,t.column-1);if(/\\s$/.test(n))return super.select(e,t,i);const s=i[0].score[0];let r=-1,a=-1,l=-1;for(let c=0;c<i.length&&i[c].score[0]===s;c++){const d=`${e.getLanguageId()}/${i[c].textLabel}`,h=this._cache.peek(d);if(h&&h.touch>l&&h.type===i[c].completion.kind&&h.insertText===i[c].completion.insertText&&(l=h.touch,a=c),i[c].completion.preselect&&r===-1)return r=c}return a!==-1?a:r!==-1?r:0}toJSON(){return this._cache.toJSON()}fromJSON(e){this._cache.clear();const t=0;for(const[i,n]of e)n.touch=t,n.type=typeof n.type==\"number\"?n.type:Hp.fromString(n.type),this._cache.set(i,n);this._seq=this._cache.size}}class fie extends aN{constructor(){super(\"recentlyUsedByPrefix\"),this._trie=Wu.forStrings(),this._seq=0}memorize(e,t,i){const{word:n}=e.getWordUntilPosition(t),s=`${e.getLanguageId()}/${n}`;this._trie.set(s,{type:i.completion.kind,insertText:i.completion.insertText,touch:this._seq++})}select(e,t,i){const{word:n}=e.getWordUntilPosition(t);if(!n)return super.select(e,t,i);const s=`${e.getLanguageId()}/${n}`;let r=this._trie.get(s);if(r||(r=this._trie.findSubstr(s)),r)for(let a=0;a<i.length;a++){const{kind:l,insertText:c}=i[a].completion;if(l===r.type&&c===r.insertText)return a}return super.select(e,t,i)}toJSON(){const e=[];return this._trie.forEach((t,i)=>e.push([i,t])),e.sort((t,i)=>-(t[1].touch-i[1].touch)).forEach((t,i)=>t[1].touch=i),e.slice(0,200)}fromJSON(e){if(this._trie.clear(),e.length>0){this._seq=e[0][1].touch+1;for(const[t,i]of e)i.type=typeof i.type==\"number\"?i.type:Hp.fromString(i.type),this._trie.set(t,i)}}}let ym=class m0{constructor(e,t){this._storageService=e,this._configService=t,this._disposables=new ee,this._persistSoon=new ft(()=>this._saveState(),500),this._disposables.add(e.onWillSaveState(i=>{i.reason===Dv.SHUTDOWN&&this._saveState()}))}dispose(){this._disposables.dispose(),this._persistSoon.dispose()}memorize(e,t,i){this._withStrategy(e,t).memorize(e,t,i),this._persistSoon.schedule()}select(e,t,i){return this._withStrategy(e,t).select(e,t,i)}_withStrategy(e,t){var i;const n=this._configService.getValue(\"editor.suggestSelection\",{overrideIdentifier:e.getLanguageIdAtPosition(t.lineNumber,t.column),resource:e.uri});if(((i=this._strategy)===null||i===void 0?void 0:i.name)!==n){this._saveState();const s=m0._strategyCtors.get(n)||H3;this._strategy=new s;try{const a=this._configService.getValue(\"editor.suggest.shareSuggestSelections\")?0:1,l=this._storageService.get(`${m0._storagePrefix}/${n}`,a);l&&this._strategy.fromJSON(JSON.parse(l))}catch(r){}}return this._strategy}_saveState(){if(this._strategy){const t=this._configService.getValue(\"editor.suggest.shareSuggestSelections\")?0:1,i=JSON.stringify(this._strategy);this._storageService.store(`${m0._storagePrefix}/${this._strategy.name}`,i,t,1)}}};ym._strategyCtors=new Map([[\"recentlyUsedByPrefix\",fie],[\"recentlyUsed\",gie],[\"first\",H3]]);ym._storagePrefix=\"suggest/memories\";ym=uie([LA(0,ia),LA(1,ot)],ym);const W1=qe(\"ISuggestMemories\");Xe(W1,ym,!0);var pie=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},mie=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let Lm=class z3{constructor(e,t){this._editor=e,this._enabled=!1,this._ckAtEnd=z3.AtEnd.bindTo(t),this._configListener=this._editor.onDidChangeConfiguration(i=>i.hasChanged(113)&&this._update()),this._update()}dispose(){var e;this._configListener.dispose(),(e=this._selectionListener)===null||e===void 0||e.dispose(),this._ckAtEnd.reset()}_update(){const e=this._editor.getOption(113)===\"on\";if(this._enabled!==e)if(this._enabled=e,this._enabled){const t=()=>{if(!this._editor.hasModel()){this._ckAtEnd.set(!1);return}const i=this._editor.getModel(),n=this._editor.getSelection(),s=i.getWordAtPosition(n.getStartPosition());if(!s){this._ckAtEnd.set(!1);return}this._ckAtEnd.set(s.endColumn===n.getStartPosition().column)};this._selectionListener=this._editor.onDidChangeCursorSelection(t),t()}else this._selectionListener&&(this._ckAtEnd.reset(),this._selectionListener.dispose(),this._selectionListener=void 0)}};Lm.AtEnd=new ce(\"atEndOfWord\",!1);Lm=pie([mie(1,xe)],Lm);var _ie=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},bie=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let sh=class _0{constructor(e,t){this._editor=e,this._index=0,this._ckOtherSuggestions=_0.OtherSuggestions.bindTo(t)}dispose(){this.reset()}reset(){var e;this._ckOtherSuggestions.reset(),(e=this._listener)===null||e===void 0||e.dispose(),this._model=void 0,this._acceptNext=void 0,this._ignore=!1}set({model:e,index:t},i){if(e.items.length===0){this.reset();return}if(_0._moveIndex(!0,e,t)===t){this.reset();return}this._acceptNext=i,this._model=e,this._index=t,this._listener=this._editor.onDidChangeCursorPosition(()=>{this._ignore||this.reset()}),this._ckOtherSuggestions.set(!0)}static _moveIndex(e,t,i){let n=i;for(;n=(n+t.items.length+(e?1:-1))%t.items.length,!(n===i||!t.items[n].completion.additionalTextEdits););return n}next(){this._move(!0)}prev(){this._move(!1)}_move(e){if(!!this._model)try{this._ignore=!0,this._index=_0._moveIndex(e,this._model,this._index),this._acceptNext({index:this._index,item:this._model.items[this._index],model:this._model})}finally{this._ignore=!1}}};sh.OtherSuggestions=new ce(\"hasOtherSuggestions\",!1);sh=_ie([bie(1,xe)],sh);class vie{constructor(e,t,i){this._disposables=new ee,this._disposables.add(t.onDidShow(()=>this._onItem(t.getFocusedItem()))),this._disposables.add(t.onDidFocus(this._onItem,this)),this._disposables.add(t.onDidHide(this.reset,this)),this._disposables.add(e.onWillType(n=>{if(this._active&&!t.isFrozen()){const s=n.charCodeAt(n.length-1);this._active.acceptCharacters.has(s)&&e.getOption(0)&&i(this._active.item)}}))}_onItem(e){if(!e||!en(e.item.completion.commitCharacters)){this.reset();return}if(this._active&&this._active.item.item===e.item)return;const t=new ru;for(const i of e.item.completion.commitCharacters)i.length>0&&t.add(i.charCodeAt(0));this._active={acceptCharacters:t,item:e}}reset(){this._active=void 0}dispose(){this._disposables.dispose()}}var Cie=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class ps{provideSelectionRanges(e,t){return Cie(this,void 0,void 0,function*(){const i=[];for(const n of t){const s=[];i.push(s);const r=new Map;yield new Promise(a=>ps._bracketsRightYield(a,0,e,n,r)),yield new Promise(a=>ps._bracketsLeftYield(a,0,e,n,r,s))}return i})}static _bracketsRightYield(e,t,i,n,s){const r=new Map,a=Date.now();for(;;){if(t>=ps._maxRounds){e();break}if(!n){e();break}const l=i.bracketPairs.findNextBracket(n);if(!l){e();break}if(Date.now()-a>ps._maxDuration){setTimeout(()=>ps._bracketsRightYield(e,t+1,i,n,s));break}if(l.bracketInfo.isOpeningBracket){const d=l.bracketInfo.bracketText,h=r.has(d)?r.get(d):0;r.set(d,h+1)}else{const d=l.bracketInfo.getClosedBrackets()[0].bracketText;let h=r.has(d)?r.get(d):0;if(h-=1,r.set(d,Math.max(0,h)),h<0){let u=s.get(d);u||(u=new wn,s.set(d,u)),u.push(l.range)}}n=l.range.getEndPosition()}}static _bracketsLeftYield(e,t,i,n,s,r){const a=new Map,l=Date.now();for(;;){if(t>=ps._maxRounds&&s.size===0){e();break}if(!n){e();break}const c=i.bracketPairs.findPrevBracket(n);if(!c){e();break}if(Date.now()-l>ps._maxDuration){setTimeout(()=>ps._bracketsLeftYield(e,t+1,i,n,s,r));break}if(c.bracketInfo.isOpeningBracket){const h=c.bracketInfo.bracketText;let u=a.has(h)?a.get(h):0;if(u-=1,a.set(h,Math.max(0,u)),u<0){const g=s.get(h);if(g){const f=g.shift();g.size===0&&s.delete(h);const _=L.fromPositions(c.range.getEndPosition(),f.getStartPosition()),b=L.fromPositions(c.range.getStartPosition(),f.getEndPosition());r.push({range:_}),r.push({range:b}),ps._addBracketLeading(i,b,r)}}}else{const h=c.bracketInfo.getClosedBrackets()[0].bracketText,u=a.has(h)?a.get(h):0;a.set(h,u+1)}n=c.range.getStartPosition()}}static _addBracketLeading(e,t,i){if(t.startLineNumber===t.endLineNumber)return;const n=t.startLineNumber,s=e.getLineFirstNonWhitespaceColumn(n);s!==0&&s!==t.startColumn&&(i.push({range:L.fromPositions(new B(n,s),t.getEndPosition())}),i.push({range:L.fromPositions(new B(n,1),t.getEndPosition())}));const r=n-1;if(r>0){const a=e.getLineFirstNonWhitespaceColumn(r);a===t.startColumn&&a!==e.getLineLastNonWhitespaceColumn(r)&&(i.push({range:L.fromPositions(new B(r,a),t.getEndPosition())}),i.push({range:L.fromPositions(new B(r,1),t.getEndPosition())}))}}}ps._maxDuration=30;ps._maxRounds=2;var wie=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class Oo{static create(e,t){return wie(this,void 0,void 0,function*(){if(!t.getOption(108).localityBonus||!t.hasModel())return Oo.None;const i=t.getModel(),n=t.getPosition();if(!e.canComputeWordRanges(i.uri))return Oo.None;const[s]=yield new ps().provideSelectionRanges(i,[n]);if(s.length===0)return Oo.None;const r=yield e.computeWordRanges(i.uri,s[0].range);if(!r)return Oo.None;const a=i.getWordUntilPosition(n);return delete r[a.word],new class extends Oo{distance(l,c){if(!n.equals(t.getPosition()))return 0;if(c.kind===17)return 2<<20;const d=typeof c.label==\"string\"?c.label:c.label.label,h=r[d];if(pP(h))return 2<<20;const u=tI(h,L.fromPositions(l),L.compareRangesUsingStarts),g=u>=0?h[u]:h[Math.max(0,~u-1)];let f=s.length;for(const _ of s){if(!L.containsRange(_.range,g))break;f-=1}return f}}})}}Oo.None=new class extends Oo{distance(){return 0}};class DA{constructor(e,t){this.leadingLineContent=e,this.characterCountDelta=t}}class Nl{constructor(e,t,i,n,s,r,a=rE.default,l=void 0){this.clipboardText=l,this._snippetCompareFn=Nl._compareCompletionItems,this._items=e,this._column=t,this._wordDistance=n,this._options=s,this._refilterKind=1,this._lineContext=i,this._fuzzyScoreOptions=a,r===\"top\"?this._snippetCompareFn=Nl._compareCompletionItemsSnippetsUp:r===\"bottom\"&&(this._snippetCompareFn=Nl._compareCompletionItemsSnippetsDown)}get lineContext(){return this._lineContext}set lineContext(e){(this._lineContext.leadingLineContent!==e.leadingLineContent||this._lineContext.characterCountDelta!==e.characterCountDelta)&&(this._refilterKind=this._lineContext.characterCountDelta<e.characterCountDelta&&this._filteredItems?2:1,this._lineContext=e)}get items(){return this._ensureCachedState(),this._filteredItems}get allProvider(){return this._ensureCachedState(),this._providerInfo.keys()}get incomplete(){this._ensureCachedState();const e=new Set;for(const[t,i]of this._providerInfo)i&&e.add(t);return e}adopt(e){const t=[];for(let i=0;i<this._items.length;)e.has(this._items[i].provider)?i++:(t.push(this._items[i]),this._items[i]=this._items[this._items.length-1],this._items.pop());return this._refilterKind=1,t}get stats(){return this._ensureCachedState(),this._stats}_ensureCachedState(){this._refilterKind!==0&&this._createCachedState()}_createCachedState(){this._providerInfo=new Map;const e=[],{leadingLineContent:t,characterCountDelta:i}=this._lineContext;let n=\"\",s=\"\";const r=this._refilterKind===1?this._items:this._filteredItems,a=[],l=!this._options.filterGraceful||r.length>2e3?im:LG;for(let c=0;c<r.length;c++){const d=r[c];if(d.isInvalid)continue;this._providerInfo.set(d.provider,Boolean(d.container.incomplete));const h=d.position.column-d.editStart.column,u=h+i-(d.position.column-this._column);if(n.length!==u&&(n=u===0?\"\":t.slice(-u),s=n.toLowerCase()),d.word=n,u===0)d.score=jo.Default;else{let g=0;for(;g<h;){const f=n.charCodeAt(g);if(f===32||f===9)g+=1;else break}if(g>=u)d.score=jo.Default;else if(typeof d.completion.filterText==\"string\"){const f=l(n,s,g,d.completion.filterText,d.filterTextLow,0,this._fuzzyScoreOptions);if(!f)continue;ky(d.completion.filterText,d.textLabel)===0?d.score=f:(d.score=CG(n,s,g,d.textLabel,d.labelLow,0),d.score[0]=f[0])}else{const f=l(n,s,g,d.textLabel,d.labelLow,0,this._fuzzyScoreOptions);if(!f)continue;d.score=f}}d.idx=c,d.distance=this._wordDistance.distance(d.position,d.completion),a.push(d),e.push(d.textLabel.length)}this._filteredItems=a.sort(this._snippetCompareFn),this._refilterKind=0,this._stats={pLabelLen:e.length?Iy(e.length-.85,e,(c,d)=>c-d):0}}static _compareCompletionItems(e,t){return e.score[0]>t.score[0]?-1:e.score[0]<t.score[0]?1:e.distance<t.distance?-1:e.distance>t.distance?1:e.idx<t.idx?-1:e.idx>t.idx?1:0}static _compareCompletionItemsSnippetsDown(e,t){if(e.completion.kind!==t.completion.kind){if(e.completion.kind===27)return 1;if(t.completion.kind===27)return-1}return Nl._compareCompletionItems(e,t)}static _compareCompletionItemsSnippetsUp(e,t){if(e.completion.kind!==t.completion.kind){if(e.completion.kind===27)return-1;if(t.completion.kind===27)return 1}return Nl._compareCompletionItems(e,t)}}var Sie=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Hc=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},yie=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class Kh{constructor(e,t,i,n,s){this.leadingLineContent=e.getLineContent(t.lineNumber).substr(0,t.column-1),this.leadingWord=e.getWordUntilPosition(t),this.lineNumber=t.lineNumber,this.column=t.column,this.auto=i,this.shy=n,this.noSelect=s}static shouldAutoTrigger(e){if(!e.hasModel())return!1;const t=e.getModel(),i=e.getPosition();t.tokenization.tokenizeIfCheap(i.lineNumber);const n=t.getWordAtPosition(i);return!(!n||n.endColumn!==i.column||!isNaN(Number(n.word)))}}function Lie(o,e,t){if(!Boolean(e.getContextKeyValue(\"inlineSuggestionVisible\")))return!0;const i=t.getValue(\"editor.inlineSuggest.allowQuickSuggestions\");return i!==void 0?Boolean(i):!1}function Die(o,e,t){if(!Boolean(e.getContextKeyValue(\"inlineSuggestionVisible\")))return!0;const i=t.getValue(\"editor.inlineSuggest.allowSuggestOnTriggerCharacters\");return i!==void 0?Boolean(i):!1}let pD=class U3{constructor(e,t,i,n,s,r,a,l){this._editor=e,this._editorWorkerService=t,this._clipboardService=i,this._telemetryService=n,this._logService=s,this._contextKeyService=r,this._configurationService=a,this._languageFeaturesService=l,this._toDispose=new ee,this._triggerCharacterListener=new ee,this._triggerQuickSuggest=new Is,this._state=0,this._completionDisposables=new ee,this._onDidCancel=new O,this._onDidTrigger=new O,this._onDidSuggest=new O,this.onDidCancel=this._onDidCancel.event,this.onDidTrigger=this._onDidTrigger.event,this.onDidSuggest=this._onDidSuggest.event,this._telemetryGate=0,this._currentSelection=this._editor.getSelection()||new oe(1,1,1,1),this._toDispose.add(this._editor.onDidChangeModel(()=>{this._updateTriggerCharacters(),this.cancel()})),this._toDispose.add(this._editor.onDidChangeModelLanguage(()=>{this._updateTriggerCharacters(),this.cancel()})),this._toDispose.add(this._editor.onDidChangeConfiguration(()=>{this._updateTriggerCharacters()})),this._toDispose.add(this._languageFeaturesService.completionProvider.onDidChange(()=>{this._updateTriggerCharacters(),this._updateActiveSuggestSession()}));let c=!1;this._toDispose.add(this._editor.onDidCompositionStart(()=>{c=!0})),this._toDispose.add(this._editor.onDidCompositionEnd(()=>{c=!1,this._onCompositionEnd()})),this._toDispose.add(this._editor.onDidChangeCursorSelection(d=>{c||this._onCursorChange(d)})),this._toDispose.add(this._editor.onDidChangeModelContent(()=>{c||this._refilterCompletionItems()})),this._updateTriggerCharacters()}dispose(){et(this._triggerCharacterListener),et([this._onDidCancel,this._onDidSuggest,this._onDidTrigger,this._triggerQuickSuggest]),this._toDispose.dispose(),this._completionDisposables.dispose(),this.cancel()}_updateTriggerCharacters(){if(this._triggerCharacterListener.clear(),this._editor.getOption(83)||!this._editor.hasModel()||!this._editor.getOption(111))return;const e=new Map;for(const i of this._languageFeaturesService.completionProvider.all(this._editor.getModel()))for(const n of i.triggerCharacters||[]){let s=e.get(n);s||(s=new Set,s.add(cJ()),e.set(n,s)),s.add(i)}const t=i=>{if(!Die(this._editor,this._contextKeyService,this._configurationService)||Kh.shouldAutoTrigger(this._editor))return;if(!i){const r=this._editor.getPosition();i=this._editor.getModel().getLineContent(r.lineNumber).substr(0,r.column-1)}let n=\"\";Fd(i.charCodeAt(i.length-1))?wi(i.charCodeAt(i.length-2))&&(n=i.substr(i.length-2)):n=i.charAt(i.length-1);const s=e.get(n);if(s){const r=this._completionModel?{items:this._completionModel.adopt(s),clipboardText:this._completionModel.clipboardText}:void 0;this.trigger({auto:!0,shy:!1,noSelect:!1,triggerCharacter:n},Boolean(this._completionModel),s,r)}};this._triggerCharacterListener.add(this._editor.onDidType(t)),this._triggerCharacterListener.add(this._editor.onDidCompositionEnd(()=>t()))}get state(){return this._state}cancel(e=!1){var t;this._state!==0&&(this._triggerQuickSuggest.cancel(),(t=this._requestToken)===null||t===void 0||t.cancel(),this._requestToken=void 0,this._state=0,this._completionModel=void 0,this._context=void 0,this._onDidCancel.fire({retrigger:e}))}clear(){this._completionDisposables.clear()}_updateActiveSuggestSession(){this._state!==0&&(!this._editor.hasModel()||!this._languageFeaturesService.completionProvider.has(this._editor.getModel())?this.cancel():this.trigger({auto:this._state===2,shy:!1,noSelect:!1},!0))}_onCursorChange(e){if(!this._editor.hasModel())return;const t=this._currentSelection;if(this._currentSelection=this._editor.getSelection(),!e.selection.isEmpty()||e.reason!==0&&e.reason!==3||e.source!==\"keyboard\"&&e.source!==\"deleteLeft\"){this.cancel();return}this._state===0&&e.reason===0?(t.containsRange(this._currentSelection)||t.getEndPosition().isBeforeOrEqual(this._currentSelection.getPosition()))&&this._doTriggerQuickSuggest():this._state!==0&&e.reason===3&&this._refilterCompletionItems()}_onCompositionEnd(){this._state===0?this._doTriggerQuickSuggest():this._refilterCompletionItems()}_doTriggerQuickSuggest(){var e;wu.isAllOff(this._editor.getOption(81))||this._editor.getOption(108).snippetsPreventQuickSuggestions&&((e=Mi.get(this._editor))===null||e===void 0?void 0:e.isInSnippet())||(this.cancel(),this._triggerQuickSuggest.cancelAndSet(()=>{if(this._state!==0||!Kh.shouldAutoTrigger(this._editor)||!this._editor.hasModel()||!this._editor.hasWidgetFocus())return;const t=this._editor.getModel(),i=this._editor.getPosition(),n=this._editor.getOption(81);if(!wu.isAllOff(n)){if(!wu.isAllOn(n)){t.tokenization.tokenizeIfCheap(i.lineNumber);const s=t.tokenization.getLineTokens(i.lineNumber),r=s.getStandardTokenType(s.findTokenIndexAtOffset(Math.max(i.column-1-1,0)));if(wu.valueFor(n,r)!==\"on\")return}!Lie(this._editor,this._contextKeyService,this._configurationService)||!this._languageFeaturesService.completionProvider.has(t)||this.trigger({auto:!0,shy:!1,noSelect:!1})}},this._editor.getOption(82)))}_refilterCompletionItems(){Promise.resolve().then(()=>{if(this._state===0||!this._editor.hasModel())return;const e=this._editor.getModel(),t=this._editor.getPosition(),i=new Kh(e,t,this._state===2,!1,!1);this._onNewContext(i)})}trigger(e,t=!1,i,n,s){var r;if(!this._editor.hasModel())return;const a=this._editor.getModel(),l=e.auto,c=new Kh(a,this._editor.getPosition(),l,e.shy,e.noSelect);this.cancel(t),this._state=l?2:1,this._onDidTrigger.fire({auto:l,shy:e.shy,position:this._editor.getPosition()}),this._context=c;let d={triggerKind:(r=e.triggerKind)!==null&&r!==void 0?r:0};e.triggerCharacter&&(d={triggerKind:1,triggerCharacter:e.triggerCharacter}),this._requestToken=new gn;const h=this._editor.getOption(103);let u=1;switch(h){case\"top\":u=0;break;case\"bottom\":u=2;break}const{itemKind:g,showDeprecated:f}=U3._createSuggestFilter(this._editor),_=new _m(u,s?new Set:g,i,f),b=Oo.create(this._editorWorkerService,this._editor),v=GE(this._languageFeaturesService.completionProvider,a,this._editor.getPosition(),_,d,this._requestToken.token);Promise.all([v,b]).then(([C,w])=>yie(this,void 0,void 0,function*(){var S;if((S=this._requestToken)===null||S===void 0||S.dispose(),!this._editor.hasModel())return;let k=n==null?void 0:n.clipboardText;if(!k&&C.needsClipboard&&(k=yield this._clipboardService.readText()),this._state===0)return;const x=this._editor.getModel();let y=C.items;if(n){const I=i3(u);y=y.concat(n.items).sort(I)}const D=new Kh(x,this._editor.getPosition(),l,e.shy,e.noSelect);this._completionModel=new Nl(y,this._context.column,{leadingLineContent:D.leadingLineContent,characterCountDelta:D.column-this._context.column},w,this._editor.getOption(108),this._editor.getOption(103),void 0,k),this._completionDisposables.add(C.disposable),this._onNewContext(D),this._reportDurationsTelemetry(C.durations)})).catch(Ee)}_reportDurationsTelemetry(e){this._telemetryGate++%230===0&&setTimeout(()=>{this._telemetryService.publicLog2(\"suggest.durations.json\",{data:JSON.stringify(e)}),this._logService.debug(\"suggest.durations.json\",e)})}static _createSuggestFilter(e){const t=new Set;e.getOption(103)===\"none\"&&t.add(27);const n=e.getOption(108);return n.showMethods||t.add(0),n.showFunctions||t.add(1),n.showConstructors||t.add(2),n.showFields||t.add(3),n.showVariables||t.add(4),n.showClasses||t.add(5),n.showStructs||t.add(6),n.showInterfaces||t.add(7),n.showModules||t.add(8),n.showProperties||t.add(9),n.showEvents||t.add(10),n.showOperators||t.add(11),n.showUnits||t.add(12),n.showValues||t.add(13),n.showConstants||t.add(14),n.showEnums||t.add(15),n.showEnumMembers||t.add(16),n.showKeywords||t.add(17),n.showWords||t.add(18),n.showColors||t.add(19),n.showFiles||t.add(20),n.showReferences||t.add(21),n.showColors||t.add(22),n.showFolders||t.add(23),n.showTypeParameters||t.add(24),n.showSnippets||t.add(27),n.showUsers||t.add(25),n.showIssues||t.add(26),{itemKind:t,showDeprecated:n.showDeprecated}}_onNewContext(e){if(!!this._context){if(e.lineNumber!==this._context.lineNumber){this.cancel();return}if(pt(e.leadingLineContent)!==pt(this._context.leadingLineContent)){this.cancel();return}if(e.column<this._context.column){e.leadingWord.word?this.trigger({auto:this._context.auto,shy:!1,noSelect:!1},!0):this.cancel();return}if(!!this._completionModel){if(e.leadingWord.word.length!==0&&e.leadingWord.startColumn>this._context.leadingWord.startColumn){const t=new Set(this._languageFeaturesService.completionProvider.all(this._editor.getModel()));for(const n of this._completionModel.allProvider)t.delete(n);const i=this._completionModel.adopt(new Set);this.trigger({auto:this._context.auto,shy:!1,noSelect:!1},!0,t,{items:i,clipboardText:this._completionModel.clipboardText});return}if(e.column>this._context.column&&this._completionModel.incomplete.size>0&&e.leadingWord.word.length!==0){const{incomplete:t}=this._completionModel,i=this._completionModel.adopt(t);this.trigger({auto:this._state===2,shy:!1,noSelect:!1,triggerKind:2},!0,t,{items:i,clipboardText:this._completionModel.clipboardText})}else{const t=this._completionModel.lineContext;let i=!1;if(this._completionModel.lineContext={leadingLineContent:e.leadingLineContent,characterCountDelta:e.column-this._context.column},this._completionModel.items.length===0){if(Kh.shouldAutoTrigger(this._editor)&&this._context.leadingWord.endColumn<e.leadingWord.startColumn){this.trigger({auto:this._context.auto,shy:!1,noSelect:!1},!0);return}if(this._context.auto){this.cancel();return}else if(this._completionModel.lineContext=t,i=this._completionModel.items.length>0,i&&e.leadingWord.word.length===0){this.cancel();return}}this._onDidSuggest.fire({completionModel:this._completionModel,auto:this._context.auto,shy:this._context.shy,noSelect:this._context.noSelect,isFrozen:i})}}}}};pD=Sie([Hc(1,Qs),Hc(2,dl),Hc(3,rl),Hc(4,Co),Hc(5,xe),Hc(6,ot),Hc(7,ue)],pD);class V1{constructor(e,t){this._disposables=new ee,this._lastOvertyped=[],this._empty=!0,this._disposables.add(e.onWillType(()=>{if(!this._empty||!e.hasModel())return;const i=e.getSelections(),n=i.length;let s=!1;for(let a=0;a<n;a++)if(!i[a].isEmpty()){s=!0;break}if(!s)return;this._lastOvertyped=[];const r=e.getModel();for(let a=0;a<n;a++){const l=i[a];if(r.getValueLengthInRange(l)>V1._maxSelectionLength)return;this._lastOvertyped[a]={value:r.getValueInRange(l),multiline:l.startLineNumber!==l.endLineNumber}}this._empty=!1})),this._disposables.add(t.onDidCancel(i=>{!this._empty&&!i.retrigger&&(this._empty=!0)}))}getLastOvertypedInfo(e){if(!this._empty&&e>=0&&e<this._lastOvertyped.length)return this._lastOvertyped[e]}dispose(){this._disposables.dispose()}}V1._maxSelectionLength=51200;function kA(o){let e=o.definition;for(;e instanceof m;)e=e.definition;return`.codicon-${o.id}:before { content: '${e.fontCharacter}'; }`}var kie=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},jS=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};class lN extends _g{updateLabel(){const e=this._keybindingService.lookupKeybinding(this._action.id,this._contextKeyService);if(!e)return super.updateLabel();this.label&&(this.label.textContent=p(\"ddd\",\"{0} ({1})\",this._action.label,lN.symbolPrintEnter(e)))}static symbolPrintEnter(e){var t;return(t=e.getLabel())===null||t===void 0?void 0:t.replace(/\\benter\\b/gi,\"\\u23CE\")}}let mD=class{constructor(e,t,i,n){this._menuService=i,this._contextKeyService=n,this._menuDisposables=new ee,this.element=G(e,se(\".suggest-status-bar\"));const s=r=>r instanceof ac?t.createInstance(lN,r,void 0):void 0;this._leftActions=new qr(this.element,{actionViewItemProvider:s}),this._rightActions=new qr(this.element,{actionViewItemProvider:s}),this._leftActions.domNode.classList.add(\"left\"),this._rightActions.domNode.classList.add(\"right\")}dispose(){this._menuDisposables.dispose(),this.element.remove()}show(){const e=this._menuService.createMenu(Xl,this._contextKeyService),t=()=>{const i=[],n=[];for(const[s,r]of e.getActions())s===\"left\"?i.push(...r):n.push(...r);this._leftActions.clear(),this._leftActions.push(i),this._rightActions.clear(),this._rightActions.push(n)};this._menuDisposables.add(e.onDidChange(()=>t())),this._menuDisposables.add(e)}hide(){this._menuDisposables.clear()}};mD=kie([jS(1,Re),jS(2,fh),jS(3,xe)],mD);const xie=N(\"symbolIcon.arrayForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.arrayForeground\",\"The foreground color for array symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Iie=N(\"symbolIcon.booleanForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.booleanForeground\",\"The foreground color for boolean symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Eie=N(\"symbolIcon.classForeground\",{dark:\"#EE9D28\",light:\"#D67E00\",hcDark:\"#EE9D28\",hcLight:\"#D67E00\"},p(\"symbolIcon.classForeground\",\"The foreground color for class symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Nie=N(\"symbolIcon.colorForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.colorForeground\",\"The foreground color for color symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Tie=N(\"symbolIcon.constantForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.constantForeground\",\"The foreground color for constant symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Mie=N(\"symbolIcon.constructorForeground\",{dark:\"#B180D7\",light:\"#652D90\",hcDark:\"#B180D7\",hcLight:\"#652D90\"},p(\"symbolIcon.constructorForeground\",\"The foreground color for constructor symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Aie=N(\"symbolIcon.enumeratorForeground\",{dark:\"#EE9D28\",light:\"#D67E00\",hcDark:\"#EE9D28\",hcLight:\"#D67E00\"},p(\"symbolIcon.enumeratorForeground\",\"The foreground color for enumerator symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Rie=N(\"symbolIcon.enumeratorMemberForeground\",{dark:\"#75BEFF\",light:\"#007ACC\",hcDark:\"#75BEFF\",hcLight:\"#007ACC\"},p(\"symbolIcon.enumeratorMemberForeground\",\"The foreground color for enumerator member symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Oie=N(\"symbolIcon.eventForeground\",{dark:\"#EE9D28\",light:\"#D67E00\",hcDark:\"#EE9D28\",hcLight:\"#D67E00\"},p(\"symbolIcon.eventForeground\",\"The foreground color for event symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Pie=N(\"symbolIcon.fieldForeground\",{dark:\"#75BEFF\",light:\"#007ACC\",hcDark:\"#75BEFF\",hcLight:\"#007ACC\"},p(\"symbolIcon.fieldForeground\",\"The foreground color for field symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Fie=N(\"symbolIcon.fileForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.fileForeground\",\"The foreground color for file symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Bie=N(\"symbolIcon.folderForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.folderForeground\",\"The foreground color for folder symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Wie=N(\"symbolIcon.functionForeground\",{dark:\"#B180D7\",light:\"#652D90\",hcDark:\"#B180D7\",hcLight:\"#652D90\"},p(\"symbolIcon.functionForeground\",\"The foreground color for function symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Vie=N(\"symbolIcon.interfaceForeground\",{dark:\"#75BEFF\",light:\"#007ACC\",hcDark:\"#75BEFF\",hcLight:\"#007ACC\"},p(\"symbolIcon.interfaceForeground\",\"The foreground color for interface symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Hie=N(\"symbolIcon.keyForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.keyForeground\",\"The foreground color for key symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),zie=N(\"symbolIcon.keywordForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.keywordForeground\",\"The foreground color for keyword symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Uie=N(\"symbolIcon.methodForeground\",{dark:\"#B180D7\",light:\"#652D90\",hcDark:\"#B180D7\",hcLight:\"#652D90\"},p(\"symbolIcon.methodForeground\",\"The foreground color for method symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),$ie=N(\"symbolIcon.moduleForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.moduleForeground\",\"The foreground color for module symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),jie=N(\"symbolIcon.namespaceForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.namespaceForeground\",\"The foreground color for namespace symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Kie=N(\"symbolIcon.nullForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.nullForeground\",\"The foreground color for null symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),qie=N(\"symbolIcon.numberForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.numberForeground\",\"The foreground color for number symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Gie=N(\"symbolIcon.objectForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.objectForeground\",\"The foreground color for object symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Zie=N(\"symbolIcon.operatorForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.operatorForeground\",\"The foreground color for operator symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Yie=N(\"symbolIcon.packageForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.packageForeground\",\"The foreground color for package symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Xie=N(\"symbolIcon.propertyForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.propertyForeground\",\"The foreground color for property symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Qie=N(\"symbolIcon.referenceForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.referenceForeground\",\"The foreground color for reference symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),Jie=N(\"symbolIcon.snippetForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.snippetForeground\",\"The foreground color for snippet symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),ene=N(\"symbolIcon.stringForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.stringForeground\",\"The foreground color for string symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),tne=N(\"symbolIcon.structForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.structForeground\",\"The foreground color for struct symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),ine=N(\"symbolIcon.textForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.textForeground\",\"The foreground color for text symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),nne=N(\"symbolIcon.typeParameterForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.typeParameterForeground\",\"The foreground color for type parameter symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),sne=N(\"symbolIcon.unitForeground\",{dark:X,light:X,hcDark:X,hcLight:X},p(\"symbolIcon.unitForeground\",\"The foreground color for unit symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\")),one=N(\"symbolIcon.variableForeground\",{dark:\"#75BEFF\",light:\"#007ACC\",hcDark:\"#75BEFF\",hcLight:\"#007ACC\"},p(\"symbolIcon.variableForeground\",\"The foreground color for variable symbols. These symbols appear in the outline, breadcrumb, and suggest widget.\"));Rt((o,e)=>{const t=o.getColor(xie);t&&e.addRule(`${m.symbolArray.cssSelector} { color: ${t}; }`);const i=o.getColor(Iie);i&&e.addRule(`${m.symbolBoolean.cssSelector} { color: ${i}; }`);const n=o.getColor(Eie);n&&e.addRule(`${m.symbolClass.cssSelector} { color: ${n}; }`);const s=o.getColor(Uie);s&&e.addRule(`${m.symbolMethod.cssSelector} { color: ${s}; }`);const r=o.getColor(Nie);r&&e.addRule(`${m.symbolColor.cssSelector} { color: ${r}; }`);const a=o.getColor(Tie);a&&e.addRule(`${m.symbolConstant.cssSelector} { color: ${a}; }`);const l=o.getColor(Mie);l&&e.addRule(`${m.symbolConstructor.cssSelector} { color: ${l}; }`);const c=o.getColor(Aie);c&&e.addRule(`\n\t\t\t${m.symbolValue.cssSelector},${m.symbolEnum.cssSelector} { color: ${c}; }`);const d=o.getColor(Rie);d&&e.addRule(`${m.symbolEnumMember.cssSelector} { color: ${d}; }`);const h=o.getColor(Oie);h&&e.addRule(`${m.symbolEvent.cssSelector} { color: ${h}; }`);const u=o.getColor(Pie);u&&e.addRule(`${m.symbolField.cssSelector} { color: ${u}; }`);const g=o.getColor(Fie);g&&e.addRule(`${m.symbolFile.cssSelector} { color: ${g}; }`);const f=o.getColor(Bie);f&&e.addRule(`${m.symbolFolder.cssSelector} { color: ${f}; }`);const _=o.getColor(Wie);_&&e.addRule(`${m.symbolFunction.cssSelector} { color: ${_}; }`);const b=o.getColor(Vie);b&&e.addRule(`${m.symbolInterface.cssSelector} { color: ${b}; }`);const v=o.getColor(Hie);v&&e.addRule(`${m.symbolKey.cssSelector} { color: ${v}; }`);const C=o.getColor(zie);C&&e.addRule(`${m.symbolKeyword.cssSelector} { color: ${C}; }`);const w=o.getColor($ie);w&&e.addRule(`${m.symbolModule.cssSelector} { color: ${w}; }`);const S=o.getColor(jie);S&&e.addRule(`${m.symbolNamespace.cssSelector} { color: ${S}; }`);const k=o.getColor(Kie);k&&e.addRule(`${m.symbolNull.cssSelector} { color: ${k}; }`);const x=o.getColor(qie);x&&e.addRule(`${m.symbolNumber.cssSelector} { color: ${x}; }`);const y=o.getColor(Gie);y&&e.addRule(`${m.symbolObject.cssSelector} { color: ${y}; }`);const D=o.getColor(Zie);D&&e.addRule(`${m.symbolOperator.cssSelector} { color: ${D}; }`);const I=o.getColor(Yie);I&&e.addRule(`${m.symbolPackage.cssSelector} { color: ${I}; }`);const R=o.getColor(Xie);R&&e.addRule(`${m.symbolProperty.cssSelector} { color: ${R}; }`);const P=o.getColor(Qie);P&&e.addRule(`${m.symbolReference.cssSelector} { color: ${P}; }`);const H=o.getColor(Jie);H&&e.addRule(`${m.symbolSnippet.cssSelector} { color: ${H}; }`);const $=o.getColor(ene);$&&e.addRule(`${m.symbolString.cssSelector} { color: ${$}; }`);const ne=o.getColor(tne);ne&&e.addRule(`${m.symbolStruct.cssSelector} { color: ${ne}; }`);const ae=o.getColor(ine);ae&&e.addRule(`${m.symbolText.cssSelector} { color: ${ae}; }`);const de=o.getColor(nne);de&&e.addRule(`${m.symbolTypeParameter.cssSelector} { color: ${de}; }`);const we=o.getColor(sne);we&&e.addRule(`${m.symbolUnit.cssSelector} { color: ${we}; }`);const Se=o.getColor(one);Se&&e.addRule(`${m.symbolVariable.cssSelector} { color: ${Se}; }`)});class $3{constructor(){this._onDidWillResize=new O,this.onDidWillResize=this._onDidWillResize.event,this._onDidResize=new O,this.onDidResize=this._onDidResize.event,this._sashListener=new ee,this._size=new bt(0,0),this._minSize=new bt(0,0),this._maxSize=new bt(Number.MAX_SAFE_INTEGER,Number.MAX_SAFE_INTEGER),this.domNode=document.createElement(\"div\"),this._eastSash=new Zi(this.domNode,{getVerticalSashLeft:()=>this._size.width},{orientation:0}),this._westSash=new Zi(this.domNode,{getVerticalSashLeft:()=>0},{orientation:0}),this._northSash=new Zi(this.domNode,{getHorizontalSashTop:()=>0},{orientation:1,orthogonalEdge:pv.North}),this._southSash=new Zi(this.domNode,{getHorizontalSashTop:()=>this._size.height},{orientation:1,orthogonalEdge:pv.South}),this._northSash.orthogonalStartSash=this._westSash,this._northSash.orthogonalEndSash=this._eastSash,this._southSash.orthogonalStartSash=this._westSash,this._southSash.orthogonalEndSash=this._eastSash;let e,t=0,i=0;this._sashListener.add(pe.any(this._northSash.onDidStart,this._eastSash.onDidStart,this._southSash.onDidStart,this._westSash.onDidStart)(()=>{e===void 0&&(this._onDidWillResize.fire(),e=this._size,t=0,i=0)})),this._sashListener.add(pe.any(this._northSash.onDidEnd,this._eastSash.onDidEnd,this._southSash.onDidEnd,this._westSash.onDidEnd)(()=>{e!==void 0&&(e=void 0,t=0,i=0,this._onDidResize.fire({dimension:this._size,done:!0}))})),this._sashListener.add(this._eastSash.onDidChange(n=>{e&&(i=n.currentX-n.startX,this.layout(e.height+t,e.width+i),this._onDidResize.fire({dimension:this._size,done:!1,east:!0}))})),this._sashListener.add(this._westSash.onDidChange(n=>{e&&(i=-(n.currentX-n.startX),this.layout(e.height+t,e.width+i),this._onDidResize.fire({dimension:this._size,done:!1,west:!0}))})),this._sashListener.add(this._northSash.onDidChange(n=>{e&&(t=-(n.currentY-n.startY),this.layout(e.height+t,e.width+i),this._onDidResize.fire({dimension:this._size,done:!1,north:!0}))})),this._sashListener.add(this._southSash.onDidChange(n=>{e&&(t=n.currentY-n.startY,this.layout(e.height+t,e.width+i),this._onDidResize.fire({dimension:this._size,done:!1,south:!0}))})),this._sashListener.add(pe.any(this._eastSash.onDidReset,this._westSash.onDidReset)(n=>{this._preferredSize&&(this.layout(this._size.height,this._preferredSize.width),this._onDidResize.fire({dimension:this._size,done:!0}))})),this._sashListener.add(pe.any(this._northSash.onDidReset,this._southSash.onDidReset)(n=>{this._preferredSize&&(this.layout(this._preferredSize.height,this._size.width),this._onDidResize.fire({dimension:this._size,done:!0}))}))}dispose(){this._northSash.dispose(),this._southSash.dispose(),this._eastSash.dispose(),this._westSash.dispose(),this._sashListener.dispose(),this._onDidResize.dispose(),this._onDidWillResize.dispose(),this.domNode.remove()}enableSashes(e,t,i,n){this._northSash.state=e?3:0,this._eastSash.state=t?3:0,this._southSash.state=i?3:0,this._westSash.state=n?3:0}layout(e=this.size.height,t=this.size.width){const{height:i,width:n}=this._minSize,{height:s,width:r}=this._maxSize;e=Math.max(i,Math.min(s,e)),t=Math.max(n,Math.min(r,t));const a=new bt(t,e);bt.equals(a,this._size)||(this.domNode.style.height=e+\"px\",this.domNode.style.width=t+\"px\",this._size=a,this._northSash.layout(),this._eastSash.layout(),this._southSash.layout(),this._westSash.layout())}clearSashHoverState(){this._eastSash.clearSashHoverState(),this._westSash.clearSashHoverState(),this._northSash.clearSashHoverState(),this._southSash.clearSashHoverState()}get size(){return this._size}set maxSize(e){this._maxSize=e}get maxSize(){return this._maxSize}set minSize(e){this._minSize=e}get minSize(){return this._minSize}set preferredSize(e){this._preferredSize=e}get preferredSize(){return this._preferredSize}}var rne=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},ane=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};function cN(o){return!!o&&Boolean(o.completion.documentation||o.completion.detail&&o.completion.detail!==o.completion.label)}let _D=class{constructor(e,t){this._editor=e,this._onDidClose=new O,this.onDidClose=this._onDidClose.event,this._onDidChangeContents=new O,this.onDidChangeContents=this._onDidChangeContents.event,this._disposables=new ee,this._renderDisposeable=new ee,this._borderWidth=1,this._size=new bt(330,0),this.domNode=se(\".suggest-details\"),this.domNode.classList.add(\"no-docs\"),this._markdownRenderer=t.createInstance(sl,{editor:e}),this._body=se(\".body\"),this._scrollbar=new e_(this._body,{alwaysConsumeMouseWheel:!0}),G(this.domNode,this._scrollbar.getDomNode()),this._disposables.add(this._scrollbar),this._header=G(this._body,se(\".header\")),this._close=G(this._header,se(\"span\"+m.close.cssSelector)),this._close.title=p(\"details.close\",\"Close\"),this._type=G(this._header,se(\"p.type\")),this._docs=G(this._body,se(\"p.docs\")),this._configureFont(),this._disposables.add(this._editor.onDidChangeConfiguration(i=>{i.hasChanged(46)&&this._configureFont()}))}dispose(){this._disposables.dispose(),this._renderDisposeable.dispose()}_configureFont(){const e=this._editor.getOptions(),t=e.get(46),i=t.getMassagedFontFamily(),n=e.get(109)||t.fontSize,s=e.get(110)||t.lineHeight,r=t.fontWeight,a=`${n}px`,l=`${s}px`;this.domNode.style.fontSize=a,this.domNode.style.lineHeight=`${s/n}`,this.domNode.style.fontWeight=r,this.domNode.style.fontFeatureSettings=t.fontFeatureSettings,this._type.style.fontFamily=i,this._close.style.height=l,this._close.style.width=l}getLayoutInfo(){const e=this._editor.getOption(110)||this._editor.getOption(46).lineHeight,t=this._borderWidth,i=t*2;return{lineHeight:e,borderWidth:t,borderHeight:i,verticalPadding:22,horizontalPadding:14}}renderLoading(){this._type.textContent=p(\"loading\",\"Loading...\"),this._docs.textContent=\"\",this.domNode.classList.remove(\"no-docs\",\"no-type\"),this.layout(this.size.width,this.getLayoutInfo().lineHeight*2),this._onDidChangeContents.fire(this)}renderItem(e,t){var i,n;this._renderDisposeable.clear();let{detail:s,documentation:r}=e.completion;if(t){let a=\"\";a+=`score: ${e.score[0]}\n`,a+=`prefix: ${(i=e.word)!==null&&i!==void 0?i:\"(no prefix)\"}\n`,a+=`word: ${e.completion.filterText?e.completion.filterText+\" (filterText)\":e.textLabel}\n`,a+=`distance: ${e.distance} (localityBonus-setting)\n`,a+=`index: ${e.idx}, based on ${e.completion.sortText&&`sortText: \"${e.completion.sortText}\"`||\"label\"}\n`,a+=`commit_chars: ${(n=e.completion.commitCharacters)===null||n===void 0?void 0:n.join(\"\")}\n`,r=new Rn().appendCodeblock(\"empty\",a),s=`Provider: ${e.provider._debugDisplayName}`}if(!t&&!cN(e)){this.clearContents();return}if(this.domNode.classList.remove(\"no-docs\",\"no-type\"),s){const a=s.length>1e5?`${s.substr(0,1e5)}\\u2026`:s;this._type.textContent=a,this._type.title=a,bs(this._type),this._type.classList.toggle(\"auto-wrap\",!/\\r?\\n^\\s+/gmi.test(a))}else Ii(this._type),this._type.title=\"\",An(this._type),this.domNode.classList.add(\"no-type\");if(Ii(this._docs),typeof r==\"string\")this._docs.classList.remove(\"markdown-docs\"),this._docs.textContent=r;else if(r){this._docs.classList.add(\"markdown-docs\"),Ii(this._docs);const a=this._markdownRenderer.render(r);this._docs.appendChild(a.element),this._renderDisposeable.add(a),this._renderDisposeable.add(this._markdownRenderer.onDidRenderAsync(()=>{this.layout(this._size.width,this._type.clientHeight+this._docs.clientHeight),this._onDidChangeContents.fire(this)}))}this.domNode.style.userSelect=\"text\",this.domNode.tabIndex=-1,this._close.onmousedown=a=>{a.preventDefault(),a.stopPropagation()},this._close.onclick=a=>{a.preventDefault(),a.stopPropagation(),this._onDidClose.fire()},this._body.scrollTop=0,this.layout(this._size.width,this._type.clientHeight+this._docs.clientHeight),this._onDidChangeContents.fire(this)}clearContents(){this.domNode.classList.add(\"no-docs\"),this._type.textContent=\"\",this._docs.textContent=\"\"}get size(){return this._size}layout(e,t){const i=new bt(e,t);bt.equals(i,this._size)||(this._size=i,dB(this.domNode,e,t)),this._scrollbar.scanDomNode()}scrollDown(e=8){this._body.scrollTop+=e}scrollUp(e=8){this._body.scrollTop-=e}scrollTop(){this._body.scrollTop=0}scrollBottom(){this._body.scrollTop=this._body.scrollHeight}pageDown(){this.scrollDown(80)}pageUp(){this.scrollUp(80)}set borderWidth(e){this._borderWidth=e}get borderWidth(){return this._borderWidth}};_D=rne([ane(1,Re)],_D);class lne{constructor(e,t){this.widget=e,this._editor=t,this._disposables=new ee,this._added=!1,this._preferAlignAtTop=!0,this._resizable=new $3,this._resizable.domNode.classList.add(\"suggest-details-container\"),this._resizable.domNode.appendChild(e.domNode),this._resizable.enableSashes(!1,!0,!0,!1);let i,n,s=0,r=0;this._disposables.add(this._resizable.onDidWillResize(()=>{i=this._topLeft,n=this._resizable.size})),this._disposables.add(this._resizable.onDidResize(a=>{if(i&&n){this.widget.layout(a.dimension.width,a.dimension.height);let l=!1;a.west&&(r=n.width-a.dimension.width,l=!0),a.north&&(s=n.height-a.dimension.height,l=!0),l&&this._applyTopLeft({top:i.top+s,left:i.left+r})}a.done&&(i=void 0,n=void 0,s=0,r=0,this._userSize=a.dimension)})),this._disposables.add(this.widget.onDidChangeContents(()=>{var a;this._anchorBox&&this._placeAtAnchor(this._anchorBox,(a=this._userSize)!==null&&a!==void 0?a:this.widget.size,this._preferAlignAtTop)}))}dispose(){this._resizable.dispose(),this._disposables.dispose(),this.hide()}getId(){return\"suggest.details\"}getDomNode(){return this._resizable.domNode}getPosition(){return null}show(){this._added||(this._editor.addOverlayWidget(this),this.getDomNode().style.position=\"fixed\",this._added=!0)}hide(e=!1){this._resizable.clearSashHoverState(),this._added&&(this._editor.removeOverlayWidget(this),this._added=!1,this._anchorBox=void 0,this._topLeft=void 0),e&&(this._userSize=void 0,this.widget.clearContents())}placeAtAnchor(e,t){var i;const n=e.getBoundingClientRect();this._anchorBox=n,this._preferAlignAtTop=t,this._placeAtAnchor(this._anchorBox,(i=this._userSize)!==null&&i!==void 0?i:this.widget.size,t)}_placeAtAnchor(e,t,i){var n;const s=yC(document.body),r=this.widget.getLayoutInfo(),a=new bt(220,2*r.lineHeight),l=e.top,c=function(){const w=s.width-(e.left+e.width+r.borderWidth+r.horizontalPadding),S=-r.borderWidth+e.left+e.width,k=new bt(w,s.height-e.top-r.borderHeight-r.verticalPadding),x=k.with(void 0,e.top+e.height-r.borderHeight-r.verticalPadding);return{top:l,left:S,fit:w-t.width,maxSizeTop:k,maxSizeBottom:x,minSize:a.with(Math.min(w,a.width))}}(),d=function(){const w=e.left-r.borderWidth-r.horizontalPadding,S=Math.max(r.horizontalPadding,e.left-t.width-r.borderWidth),k=new bt(w,s.height-e.top-r.borderHeight-r.verticalPadding),x=k.with(void 0,e.top+e.height-r.borderHeight-r.verticalPadding);return{top:l,left:S,fit:w-t.width,maxSizeTop:k,maxSizeBottom:x,minSize:a.with(Math.min(w,a.width))}}(),h=function(){const w=e.left,S=-r.borderWidth+e.top+e.height,k=new bt(e.width-r.borderHeight,s.height-e.top-e.height-r.verticalPadding);return{top:S,left:w,fit:k.height-t.height,maxSizeBottom:k,maxSizeTop:k,minSize:a.with(k.width)}}(),u=[c,d,h],g=(n=u.find(w=>w.fit>=0))!==null&&n!==void 0?n:u.sort((w,S)=>S.fit-w.fit)[0],f=e.top+e.height-r.borderHeight;let _,b=t.height;const v=Math.max(g.maxSizeTop.height,g.maxSizeBottom.height);b>v&&(b=v);let C;i?b<=g.maxSizeTop.height?(_=!0,C=g.maxSizeTop):(_=!1,C=g.maxSizeBottom):b<=g.maxSizeBottom.height?(_=!1,C=g.maxSizeBottom):(_=!0,C=g.maxSizeTop),this._applyTopLeft({left:g.left,top:_?g.top:f-b}),this.getDomNode().style.position=\"fixed\",this._resizable.enableSashes(!_,g===c,_,g!==c),this._resizable.minSize=g.minSize,this._resizable.maxSize=C,this._resizable.layout(b,Math.min(C.width,t.width)),this.widget.layout(this._resizable.size.width,this._resizable.size.height)}_applyTopLeft(e){this._topLeft=e,this.getDomNode().style.left=`${this._topLeft.left}px`,this.getDomNode().style.top=`${this._topLeft.top}px`}}var ja;(function(o){o[o.FILE=0]=\"FILE\",o[o.FOLDER=1]=\"FOLDER\",o[o.ROOT_FOLDER=2]=\"ROOT_FOLDER\"})(ja||(ja={}));const cne=/(?:\\/|^)(?:([^\\/]+)\\/)?([^\\/]+)$/;function Eb(o,e,t,i){const n=i===ja.ROOT_FOLDER?[\"rootfolder-icon\"]:i===ja.FOLDER?[\"folder-icon\"]:[\"file-icon\"];if(t){let s;if(t.scheme===Ne.data)s=dc.parseMetaData(t).get(dc.META_DATA_LABEL);else{const r=t.path.match(cne);r?(s=Nb(r[2].toLowerCase()),r[1]&&n.push(`${Nb(r[1].toLowerCase())}-name-dir-icon`)):s=Nb(t.authority.toLowerCase())}if(i===ja.FOLDER)n.push(`${s}-name-folder-icon`);else{if(s){if(n.push(`${s}-name-file-icon`),n.push(\"name-file-icon\"),s.length<=255){const a=s.split(\".\");for(let l=1;l<a.length;l++)n.push(`${a.slice(l).join(\".\")}-ext-file-icon`)}n.push(\"ext-file-icon\")}const r=dne(o,e,t);r&&n.push(`${Nb(r)}-lang-file-icon`)}}return n}function dne(o,e,t){if(!t)return null;let i=null;if(t.scheme===Ne.data){const s=dc.parseMetaData(t).get(dc.META_DATA_MIME);s&&(i=e.getLanguageIdByMimeType(s))}else{const n=o.getModel(t);n&&(i=n.getLanguageId())}return i&&i!==Us?i:e.guessLanguageIdByFilepathOrFirstLine(t)}function Nb(o){return o.replace(/[\\11\\12\\14\\15\\40]/g,\"/\")}var hne=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},KS=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},Df;function j3(o){return`suggest-aria-id:${o}`}const une=fi(\"suggest-more-info\",m.chevronRight,p(\"suggestMoreInfoIcon\",\"Icon for more information in the suggest widget.\")),gne=new(Df=class b0{extract(e,t){if(e.textLabel.match(b0._regexStrict))return t[0]=e.textLabel,!0;if(e.completion.detail&&e.completion.detail.match(b0._regexStrict))return t[0]=e.completion.detail,!0;if(typeof e.completion.documentation==\"string\"){const i=b0._regexRelaxed.exec(e.completion.documentation);if(i&&(i.index===0||i.index+i[0].length===e.completion.documentation.length))return t[0]=i[0],!0}return!1}},Df._regexRelaxed=/(#([\\da-fA-F]{3}){1,2}|(rgb|hsl)a\\(\\s*(\\d{1,3}%?\\s*,\\s*){3}(1|0?\\.\\d+)\\)|(rgb|hsl)\\(\\s*\\d{1,3}%?(\\s*,\\s*\\d{1,3}%?){2}\\s*\\))/,Df._regexStrict=new RegExp(`^${Df._regexRelaxed.source}$`,\"i\"),Df);let bD=class{constructor(e,t,i,n){this._editor=e,this._modelService=t,this._languageService=i,this._themeService=n,this._onDidToggleDetails=new O,this.onDidToggleDetails=this._onDidToggleDetails.event,this.templateId=\"suggestion\"}dispose(){this._onDidToggleDetails.dispose()}renderTemplate(e){const t=Object.create(null);t.disposables=new ee,t.root=e,t.root.classList.add(\"show-file-icons\"),t.icon=G(e,se(\".icon\")),t.colorspan=G(t.icon,se(\"span.colorspan\"));const i=G(e,se(\".contents\")),n=G(i,se(\".main\"));t.iconContainer=G(n,se(\".icon-label.codicon\")),t.left=G(n,se(\"span.left\")),t.right=G(n,se(\"span.right\")),t.iconLabel=new Tv(t.left,{supportHighlights:!0,supportIcons:!0}),t.disposables.add(t.iconLabel),t.parametersLabel=G(t.left,se(\"span.signature-label\")),t.qualifierLabel=G(t.left,se(\"span.qualifier-label\")),t.detailsLabel=G(t.right,se(\"span.details-label\")),t.readMore=G(t.right,se(\"span.readMore\"+nt.asCSSSelector(une))),t.readMore.title=p(\"readMore\",\"Read More\");const s=()=>{const r=this._editor.getOptions(),a=r.get(46),l=a.getMassagedFontFamily(),c=a.fontFeatureSettings,d=r.get(109)||a.fontSize,h=r.get(110)||a.lineHeight,u=a.fontWeight,g=a.letterSpacing,f=`${d}px`,_=`${h}px`,b=`${g}px`;t.root.style.fontSize=f,t.root.style.fontWeight=u,t.root.style.letterSpacing=b,n.style.fontFamily=l,n.style.fontFeatureSettings=c,n.style.lineHeight=_,t.icon.style.height=_,t.icon.style.width=_,t.readMore.style.height=_,t.readMore.style.width=_};return s(),t.disposables.add(this._editor.onDidChangeConfiguration(r=>{(r.hasChanged(46)||r.hasChanged(109)||r.hasChanged(110))&&s()})),t}renderElement(e,t,i){const{completion:n}=e;i.root.id=j3(t),i.colorspan.style.backgroundColor=\"\";const s={labelEscapeNewLines:!0,matches:sE(e.score)},r=[];if(n.kind===19&&gne.extract(e,r))i.icon.className=\"icon customcolor\",i.iconContainer.className=\"icon hide\",i.colorspan.style.backgroundColor=r[0];else if(n.kind===20&&this._themeService.getFileIconTheme().hasFileIcons){i.icon.className=\"icon hide\",i.iconContainer.className=\"icon hide\";const a=Eb(this._modelService,this._languageService,me.from({scheme:\"fake\",path:e.textLabel}),ja.FILE),l=Eb(this._modelService,this._languageService,me.from({scheme:\"fake\",path:n.detail}),ja.FILE);s.extraClasses=a.length>l.length?a:l}else n.kind===23&&this._themeService.getFileIconTheme().hasFolderIcons?(i.icon.className=\"icon hide\",i.iconContainer.className=\"icon hide\",s.extraClasses=[Eb(this._modelService,this._languageService,me.from({scheme:\"fake\",path:e.textLabel}),ja.FOLDER),Eb(this._modelService,this._languageService,me.from({scheme:\"fake\",path:n.detail}),ja.FOLDER)].flat()):(i.icon.className=\"icon hide\",i.iconContainer.className=\"\",i.iconContainer.classList.add(\"suggest-icon\",...Cn.asClassNameArray(Hp.toIcon(n.kind))));n.tags&&n.tags.indexOf(1)>=0&&(s.extraClasses=(s.extraClasses||[]).concat([\"deprecated\"]),s.matches=[]),i.iconLabel.setLabel(e.textLabel,void 0,s),typeof n.label==\"string\"?(i.parametersLabel.textContent=\"\",i.detailsLabel.textContent=qS(n.detail||\"\"),i.root.classList.add(\"string-label\")):(i.parametersLabel.textContent=qS(n.label.detail||\"\"),i.detailsLabel.textContent=qS(n.label.description||\"\"),i.root.classList.remove(\"string-label\")),this._editor.getOption(108).showInlineDetails?bs(i.detailsLabel):An(i.detailsLabel),cN(e)?(i.right.classList.add(\"can-expand-details\"),bs(i.readMore),i.readMore.onmousedown=a=>{a.stopPropagation(),a.preventDefault()},i.readMore.onclick=a=>{a.stopPropagation(),a.preventDefault(),this._onDidToggleDetails.fire()}):(i.right.classList.remove(\"can-expand-details\"),An(i.readMore),i.readMore.onmousedown=null,i.readMore.onclick=null)}disposeTemplate(e){e.disposables.dispose()}};bD=hne([KS(1,Bt),KS(2,Ht),KS(3,vt)],bD);function qS(o){return o.replace(/\\r\\n|\\r|\\n/g,\"\")}var fne=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Tb=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},pne=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};N(\"editorSuggestWidget.background\",{dark:ci,light:ci,hcDark:ci,hcLight:ci},p(\"editorSuggestWidgetBackground\",\"Background color of the suggest widget.\"));N(\"editorSuggestWidget.border\",{dark:Pa,light:Pa,hcDark:Pa,hcLight:Pa},p(\"editorSuggestWidgetBorder\",\"Border color of the suggest widget.\"));const Mb=N(\"editorSuggestWidget.foreground\",{dark:ws,light:ws,hcDark:ws,hcLight:ws},p(\"editorSuggestWidgetForeground\",\"Foreground color of the suggest widget.\"));N(\"editorSuggestWidget.selectedForeground\",{dark:Ff,light:Ff,hcDark:Ff,hcLight:Ff},p(\"editorSuggestWidgetSelectedForeground\",\"Foreground color of the selected entry in the suggest widget.\"));N(\"editorSuggestWidget.selectedIconForeground\",{dark:Bf,light:Bf,hcDark:Bf,hcLight:Bf},p(\"editorSuggestWidgetSelectedIconForeground\",\"Icon foreground color of the selected entry in the suggest widget.\"));const mne=N(\"editorSuggestWidget.selectedBackground\",{dark:Wf,light:Wf,hcDark:Wf,hcLight:Wf},p(\"editorSuggestWidgetSelectedBackground\",\"Background color of the selected entry in the suggest widget.\"));N(\"editorSuggestWidget.highlightForeground\",{dark:ho,light:ho,hcDark:ho,hcLight:ho},p(\"editorSuggestWidgetHighlightForeground\",\"Color of the match highlights in the suggest widget.\"));N(\"editorSuggestWidget.focusHighlightForeground\",{dark:$_,light:$_,hcDark:$_,hcLight:$_},p(\"editorSuggestWidgetFocusHighlightForeground\",\"Color of the match highlights in the suggest widget when an item is focused.\"));N(\"editorSuggestWidgetStatus.foreground\",{dark:fe(Mb,.5),light:fe(Mb,.5),hcDark:fe(Mb,.5),hcLight:fe(Mb,.5)},p(\"editorSuggestWidgetStatusForeground\",\"Foreground color of the suggest widget status.\"));class _ne{constructor(e,t){this._service=e,this._key=`suggestWidget.size/${t.getEditorType()}/${t instanceof Zd}`}restore(){var e;const t=(e=this._service.get(this._key,0))!==null&&e!==void 0?e:\"\";try{const i=JSON.parse(t);if(bt.is(i))return bt.lift(i)}catch(i){}}store(e){this._service.store(this._key,JSON.stringify(e),0,1)}reset(){this._service.remove(this._key,0)}}let Dm=class vD{constructor(e,t,i,n,s){this.editor=e,this._storageService=t,this._state=0,this._isAuto=!1,this._ignoreFocusEvents=!1,this._forceRenderingAbove=!1,this._explainMode=!1,this._showTimeout=new Is,this._disposables=new ee,this._onDidSelect=new O,this._onDidFocus=new O,this._onDidHide=new O,this._onDidShow=new O,this.onDidSelect=this._onDidSelect.event,this.onDidFocus=this._onDidFocus.event,this.onDidHide=this._onDidHide.event,this.onDidShow=this._onDidShow.event,this._onDetailsKeydown=new O,this.onDetailsKeyDown=this._onDetailsKeydown.event,this.element=new $3,this.element.domNode.classList.add(\"editor-widget\",\"suggest-widget\"),this._contentWidget=new bne(this,e),this._persistedSize=new _ne(t,e);class r{constructor(g,f,_=!1,b=!1){this.persistedSize=g,this.currentSize=f,this.persistHeight=_,this.persistWidth=b}}let a;this._disposables.add(this.element.onDidWillResize(()=>{this._contentWidget.lockPreference(),a=new r(this._persistedSize.restore(),this.element.size)})),this._disposables.add(this.element.onDidResize(u=>{var g,f,_,b;if(this._resize(u.dimension.width,u.dimension.height),a&&(a.persistHeight=a.persistHeight||!!u.north||!!u.south,a.persistWidth=a.persistWidth||!!u.east||!!u.west),!!u.done){if(a){const{itemHeight:v,defaultSize:C}=this.getLayoutInfo(),w=Math.round(v/2);let{width:S,height:k}=this.element.size;(!a.persistHeight||Math.abs(a.currentSize.height-k)<=w)&&(k=(f=(g=a.persistedSize)===null||g===void 0?void 0:g.height)!==null&&f!==void 0?f:C.height),(!a.persistWidth||Math.abs(a.currentSize.width-S)<=w)&&(S=(b=(_=a.persistedSize)===null||_===void 0?void 0:_.width)!==null&&b!==void 0?b:C.width),this._persistedSize.store(new bt(S,k))}this._contentWidget.unlockPreference(),a=void 0}})),this._messageElement=G(this.element.domNode,se(\".message\")),this._listElement=G(this.element.domNode,se(\".tree\"));const l=s.createInstance(_D,this.editor);l.onDidClose(this.toggleDetails,this,this._disposables),this._details=new lne(l,this.editor);const c=()=>this.element.domNode.classList.toggle(\"no-icons\",!this.editor.getOption(108).showIcons);c();const d=s.createInstance(bD,this.editor);this._disposables.add(d),this._disposables.add(d.onDidToggleDetails(()=>this.toggleDetails())),this._list=new ir(\"SuggestWidget\",this._listElement,{getHeight:u=>this.getLayoutInfo().itemHeight,getTemplateId:u=>\"suggestion\"},[d],{alwaysConsumeMouseWheel:!0,useShadows:!1,mouseSupport:!1,multipleSelectionSupport:!1,accessibilityProvider:{getRole:()=>\"option\",getWidgetAriaLabel:()=>p(\"suggest\",\"Suggest\"),getWidgetRole:()=>\"listbox\",getAriaLabel:u=>{let g=u.textLabel;if(typeof u.completion.label!=\"string\"){const{detail:v,description:C}=u.completion.label;v&&C?g=p(\"label.full\",\"{0}{1}, {2}\",g,v,C):v?g=p(\"label.detail\",\"{0}{1}\",g,v):C&&(g=p(\"label.desc\",\"{0}, {1}\",g,C))}if(!u.isResolved||!this._isDetailsVisible())return g;const{documentation:f,detail:_}=u.completion,b=tg(\"{0}{1}\",_||\"\",f?typeof f==\"string\"?f:f.value:\"\");return p(\"ariaCurrenttSuggestionReadDetails\",\"{0}, docs: {1}\",g,b)}}}),this._status=s.createInstance(mD,this.element.domNode);const h=()=>this.element.domNode.classList.toggle(\"with-status-bar\",this.editor.getOption(108).showStatusBar);h(),this._disposables.add(Yd(this._list,n,{listInactiveFocusBackground:mne,listInactiveFocusOutline:At})),this._disposables.add(n.onDidColorThemeChange(u=>this._onThemeChange(u))),this._onThemeChange(n.getColorTheme()),this._disposables.add(this._list.onMouseDown(u=>this._onListMouseDownOrTap(u))),this._disposables.add(this._list.onTap(u=>this._onListMouseDownOrTap(u))),this._disposables.add(this._list.onDidChangeSelection(u=>this._onListSelection(u))),this._disposables.add(this._list.onDidChangeFocus(u=>this._onListFocus(u))),this._disposables.add(this.editor.onDidChangeCursorSelection(()=>this._onCursorSelectionChanged())),this._disposables.add(this.editor.onDidChangeConfiguration(u=>{u.hasChanged(108)&&(h(),c())})),this._ctxSuggestWidgetVisible=$e.Visible.bindTo(i),this._ctxSuggestWidgetDetailsVisible=$e.DetailsVisible.bindTo(i),this._ctxSuggestWidgetMultipleSuggestions=$e.MultipleSuggestions.bindTo(i),this._ctxSuggestWidgetHasFocusedSuggestion=$e.HasFocusedSuggestion.bindTo(i),this._disposables.add(Ei(this._details.widget.domNode,\"keydown\",u=>{this._onDetailsKeydown.fire(u)})),this._disposables.add(this.editor.onMouseDown(u=>this._onEditorMouseDown(u)))}dispose(){var e;this._details.widget.dispose(),this._details.dispose(),this._list.dispose(),this._status.dispose(),this._disposables.dispose(),(e=this._loadingTimeout)===null||e===void 0||e.dispose(),this._showTimeout.dispose(),this._contentWidget.dispose(),this.element.dispose()}_onEditorMouseDown(e){this._details.widget.domNode.contains(e.target.element)?this._details.widget.domNode.focus():this.element.domNode.contains(e.target.element)&&this.editor.focus()}_onCursorSelectionChanged(){this._state!==0&&this._contentWidget.layout()}_onListMouseDownOrTap(e){typeof e.element==\"undefined\"||typeof e.index==\"undefined\"||(e.browserEvent.preventDefault(),e.browserEvent.stopPropagation(),this._select(e.element,e.index))}_onListSelection(e){e.elements.length&&this._select(e.elements[0],e.indexes[0])}_select(e,t){const i=this._completionModel;i&&(this._onDidSelect.fire({item:e,index:t,model:i}),this.editor.focus())}_onThemeChange(e){this._details.widget.borderWidth=yn(e.type)?2:1}_onListFocus(e){var t;if(this._ignoreFocusEvents)return;if(!e.elements.length){this._currentSuggestionDetails&&(this._currentSuggestionDetails.cancel(),this._currentSuggestionDetails=void 0,this._focusedItem=void 0),this.editor.setAriaOptions({activeDescendant:void 0}),this._ctxSuggestWidgetHasFocusedSuggestion.set(!1);return}if(!this._completionModel)return;this._ctxSuggestWidgetHasFocusedSuggestion.set(!0);const i=e.elements[0],n=e.indexes[0];i!==this._focusedItem&&((t=this._currentSuggestionDetails)===null||t===void 0||t.cancel(),this._currentSuggestionDetails=void 0,this._focusedItem=i,this._list.reveal(n),this._currentSuggestionDetails=Ti(s=>pne(this,void 0,void 0,function*(){const r=Hd(()=>{this._isDetailsVisible()&&this.showDetails(!0)},250),a=s.onCancellationRequested(()=>r.dispose()),l=yield i.resolve(s);return r.dispose(),a.dispose(),l})),this._currentSuggestionDetails.then(()=>{n>=this._list.length||i!==this._list.element(n)||(this._ignoreFocusEvents=!0,this._list.splice(n,1,[i]),this._list.setFocus([n]),this._ignoreFocusEvents=!1,this._isDetailsVisible()?this.showDetails(!1):this.element.domNode.classList.remove(\"docs-side\"),this.editor.setAriaOptions({activeDescendant:j3(n)}))}).catch(Ee)),this._onDidFocus.fire({item:i,index:n,model:this._completionModel})}_setState(e){if(this._state!==e)switch(this._state=e,this.element.domNode.classList.toggle(\"frozen\",e===4),this.element.domNode.classList.remove(\"message\"),e){case 0:An(this._messageElement,this._listElement,this._status.element),this._details.hide(!0),this._status.hide(),this._contentWidget.hide(),this._ctxSuggestWidgetVisible.reset(),this._ctxSuggestWidgetMultipleSuggestions.reset(),this._ctxSuggestWidgetHasFocusedSuggestion.reset(),this._showTimeout.cancel(),this.element.domNode.classList.remove(\"visible\"),this._list.splice(0,this._list.length),this._focusedItem=void 0,this._cappedHeight=void 0,this._explainMode=!1;break;case 1:this.element.domNode.classList.add(\"message\"),this._messageElement.textContent=vD.LOADING_MESSAGE,An(this._listElement,this._status.element),bs(this._messageElement),this._details.hide(),this._show(),this._focusedItem=void 0;break;case 2:this.element.domNode.classList.add(\"message\"),this._messageElement.textContent=vD.NO_SUGGESTIONS_MESSAGE,An(this._listElement,this._status.element),bs(this._messageElement),this._details.hide(),this._show(),this._focusedItem=void 0;break;case 3:An(this._messageElement),bs(this._listElement,this._status.element),this._show();break;case 4:An(this._messageElement),bs(this._listElement,this._status.element),this._show();break;case 5:An(this._messageElement),bs(this._listElement,this._status.element),this._details.show(),this._show();break}}_show(){this._status.show(),this._contentWidget.show(),this._layout(this._persistedSize.restore()),this._ctxSuggestWidgetVisible.set(!0),this._showTimeout.cancelAndSet(()=>{this.element.domNode.classList.add(\"visible\"),this._onDidShow.fire(this)},100)}showTriggered(e,t){this._state===0&&(this._contentWidget.setPosition(this.editor.getPosition()),this._isAuto=!!e,this._isAuto||(this._loadingTimeout=Hd(()=>this._setState(1),t)))}showSuggestions(e,t,i,n){var s,r;if(this._contentWidget.setPosition(this.editor.getPosition()),(s=this._loadingTimeout)===null||s===void 0||s.dispose(),(r=this._currentSuggestionDetails)===null||r===void 0||r.cancel(),this._currentSuggestionDetails=void 0,this._completionModel!==e&&(this._completionModel=e),i&&this._state!==2&&this._state!==0){this._setState(4);return}const a=this._completionModel.items.length,l=a===0;if(this._ctxSuggestWidgetMultipleSuggestions.set(a>1),l){this._setState(n?0:2),this._completionModel=void 0;return}this._focusedItem=void 0,this._list.splice(0,this._list.length,this._completionModel.items),this._setState(i?4:3),t>=0&&(this._list.reveal(t,0),this._list.setFocus([t])),this._layout(this.element.size),this._details.widget.domNode.classList.remove(\"focused\")}selectNextPage(){switch(this._state){case 0:return!1;case 5:return this._details.widget.pageDown(),!0;case 1:return!this._isAuto;default:return this._list.focusNextPage(),!0}}selectNext(){switch(this._state){case 0:return!1;case 1:return!this._isAuto;default:return this._list.focusNext(1,!0),!0}}selectLast(){switch(this._state){case 0:return!1;case 5:return this._details.widget.scrollBottom(),!0;case 1:return!this._isAuto;default:return this._list.focusLast(),!0}}selectPreviousPage(){switch(this._state){case 0:return!1;case 5:return this._details.widget.pageUp(),!0;case 1:return!this._isAuto;default:return this._list.focusPreviousPage(),!0}}selectPrevious(){switch(this._state){case 0:return!1;case 1:return!this._isAuto;default:return this._list.focusPrevious(1,!0),!1}}selectFirst(){switch(this._state){case 0:return!1;case 5:return this._details.widget.scrollTop(),!0;case 1:return!this._isAuto;default:return this._list.focusFirst(),!0}}getFocusedItem(){if(this._state!==0&&this._state!==2&&this._state!==1&&this._completionModel)return{item:this._list.getFocusedElements()[0],index:this._list.getFocus()[0],model:this._completionModel}}toggleDetailsFocus(){this._state===5?(this._setState(3),this._details.widget.domNode.classList.remove(\"focused\")):this._state===3&&this._isDetailsVisible()&&(this._setState(5),this._details.widget.domNode.classList.add(\"focused\"))}toggleDetails(){this._isDetailsVisible()?(this._ctxSuggestWidgetDetailsVisible.set(!1),this._setDetailsVisible(!1),this._details.hide(),this.element.domNode.classList.remove(\"shows-details\")):(cN(this._list.getFocusedElements()[0])||this._explainMode)&&(this._state===3||this._state===5||this._state===4)&&(this._ctxSuggestWidgetDetailsVisible.set(!0),this._setDetailsVisible(!0),this.showDetails(!1))}showDetails(e){this._details.show(),e?this._details.widget.renderLoading():this._details.widget.renderItem(this._list.getFocusedElements()[0],this._explainMode),this._positionDetails(),this.editor.focus(),this.element.domNode.classList.add(\"shows-details\")}toggleExplainMode(){this._list.getFocusedElements()[0]&&(this._explainMode=!this._explainMode,this._isDetailsVisible()?this.showDetails(!1):this.toggleDetails())}resetPersistedSize(){this._persistedSize.reset()}hideWidget(){var e;(e=this._loadingTimeout)===null||e===void 0||e.dispose(),this._setState(0),this._onDidHide.fire(this),this.element.clearSashHoverState();const t=this._persistedSize.restore(),i=Math.ceil(this.getLayoutInfo().itemHeight*4.3);t&&t.height<i&&this._persistedSize.store(t.with(void 0,i))}isFrozen(){return this._state===4}_afterRender(e){if(e===null){this._isDetailsVisible()&&this._details.hide();return}this._state===2||this._state===1||(this._isDetailsVisible()&&this._details.show(),this._positionDetails())}_layout(e){var t,i,n;if(!this.editor.hasModel()||!this.editor.getDomNode())return;const s=yC(document.body),r=this.getLayoutInfo();e||(e=r.defaultSize);let a=e.height,l=e.width;if(this._status.element.style.lineHeight=`${r.itemHeight}px`,this._state===2||this._state===1)a=r.itemHeight+r.borderHeight,l=r.defaultSize.width/2,this.element.enableSashes(!1,!1,!1,!1),this.element.minSize=this.element.maxSize=new bt(l,a),this._contentWidget.setPreference(2);else{const c=s.width-r.borderHeight-2*r.horizontalPadding;l>c&&(l=c);const d=this._completionModel?this._completionModel.stats.pLabelLen*r.typicalHalfwidthCharacterWidth:l,h=r.statusBarHeight+this._list.contentHeight+r.borderHeight,u=r.itemHeight+r.statusBarHeight,g=Qi(this.editor.getDomNode()),f=this.editor.getScrolledVisiblePosition(this.editor.getPosition()),_=g.top+f.top+f.height,b=Math.min(s.height-_-r.verticalPadding,h),v=g.top+f.top-r.verticalPadding,C=Math.min(v,h);let w=Math.min(Math.max(C,b)+r.borderHeight,h);a===((t=this._cappedHeight)===null||t===void 0?void 0:t.capped)&&(a=this._cappedHeight.wanted),a<u&&(a=u),a>w&&(a=w);const S=150;a>b||this._forceRenderingAbove&&v>S?(this._contentWidget.setPreference(1),this.element.enableSashes(!0,!0,!1,!1),w=C):(this._contentWidget.setPreference(2),this.element.enableSashes(!1,!0,!0,!1),w=b),this.element.preferredSize=new bt(d,r.defaultSize.height),this.element.maxSize=new bt(c,w),this.element.minSize=new bt(220,u),this._cappedHeight=a===h?{wanted:(n=(i=this._cappedHeight)===null||i===void 0?void 0:i.wanted)!==null&&n!==void 0?n:e.height,capped:a}:void 0}this._resize(l,a)}_resize(e,t){const{width:i,height:n}=this.element.maxSize;e=Math.min(i,e),t=Math.min(n,t);const{statusBarHeight:s}=this.getLayoutInfo();this._list.layout(t-s,e),this._listElement.style.height=`${t-s}px`,this.element.layout(t,e),this._contentWidget.layout(),this._positionDetails()}_positionDetails(){var e;this._isDetailsVisible()&&this._details.placeAtAnchor(this.element.domNode,((e=this._contentWidget.getPosition())===null||e===void 0?void 0:e.preference[0])===2)}getLayoutInfo(){const e=this.editor.getOption(46),t=qn(this.editor.getOption(110)||e.lineHeight,8,1e3),i=!this.editor.getOption(108).showStatusBar||this._state===2||this._state===1?0:t,n=this._details.widget.borderWidth,s=2*n;return{itemHeight:t,statusBarHeight:i,borderWidth:n,borderHeight:s,typicalHalfwidthCharacterWidth:e.typicalHalfwidthCharacterWidth,verticalPadding:22,horizontalPadding:14,defaultSize:new bt(430,i+12*t+s)}}_isDetailsVisible(){return this._storageService.getBoolean(\"expandSuggestionDocs\",0,!1)}_setDetailsVisible(e){this._storageService.store(\"expandSuggestionDocs\",e,0,0)}forceRenderingAbove(){this._forceRenderingAbove||(this._forceRenderingAbove=!0,this._layout(this._persistedSize.restore()))}stopForceRenderingAbove(){this._forceRenderingAbove=!1}};Dm.LOADING_MESSAGE=p(\"suggestWidget.loading\",\"Loading...\");Dm.NO_SUGGESTIONS_MESSAGE=p(\"suggestWidget.noSuggestions\",\"No suggestions.\");Dm=fne([Tb(1,ia),Tb(2,xe),Tb(3,vt),Tb(4,Re)],Dm);class bne{constructor(e,t){this._widget=e,this._editor=t,this.allowEditorOverflow=!0,this.suppressMouseDown=!1,this._preferenceLocked=!1,this._added=!1,this._hidden=!1}dispose(){this._added&&(this._added=!1,this._editor.removeContentWidget(this))}getId(){return\"editor.widget.suggestWidget\"}getDomNode(){return this._widget.element.domNode}show(){this._hidden=!1,this._added||(this._added=!0,this._editor.addContentWidget(this))}hide(){this._hidden||(this._hidden=!0,this.layout())}layout(){this._editor.layoutContentWidget(this)}getPosition(){return this._hidden||!this._position||!this._preference?null:{position:this._position,preference:[this._preference]}}beforeRender(){const{height:e,width:t}=this._widget.element.size,{borderWidth:i,horizontalPadding:n}=this._widget.getLayoutInfo();return new bt(t+2*i+n,e+2*i)}afterRender(e){this._widget._afterRender(e)}setPreference(e){this._preferenceLocked||(this._preference=e)}lockPreference(){this._preferenceLocked=!0}unlockPreference(){this._preferenceLocked=!1}setPosition(e){this._position=e}}var vne=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},qh=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};class Cne{constructor(e,t){if(this._model=e,this._position=t,e.getLineMaxColumn(t.lineNumber)!==t.column){const n=e.getOffsetAt(t),s=e.getPositionAt(n+1);this._marker=e.deltaDecorations([],[{range:L.fromPositions(t,s),options:{description:\"suggest-line-suffix\",stickiness:1}}])}}dispose(){this._marker&&!this._model.isDisposed()&&this._model.deltaDecorations(this._marker,[])}delta(e){if(this._model.isDisposed()||this._position.lineNumber!==e.lineNumber)return 0;if(this._marker){const t=this._model.getDecorationRange(this._marker[0]);return this._model.getOffsetAt(t.getStartPosition())-this._model.getOffsetAt(e)}else return this._model.getLineMaxColumn(e.lineNumber)-e.column}}let fo=class K3{constructor(e,t,i,n,s,r,a){this._memoryService=t,this._commandService=i,this._contextKeyService=n,this._instantiationService=s,this._logService=r,this._telemetryService=a,this._lineSuffix=new Vn,this._toDispose=new ee,this._selectors=new wne(h=>h.priority),this._telemetryGate=0,this.editor=e,this.model=s.createInstance(pD,this.editor);const l=$e.InsertMode.bindTo(n);l.set(e.getOption(108).insertMode),this.model.onDidTrigger(()=>l.set(e.getOption(108).insertMode)),this.widget=this._toDispose.add(new ql(()=>{const h=this._instantiationService.createInstance(Dm,this.editor);this._toDispose.add(h),this._toDispose.add(h.onDidSelect(b=>this._insertSuggestion(b,0),this));const u=new vie(this.editor,h,b=>this._insertSuggestion(b,2));this._toDispose.add(u),this._toDispose.add(this.model.onDidSuggest(b=>{b.completionModel.items.length===0&&u.reset()}));const g=$e.MakesTextEdit.bindTo(this._contextKeyService),f=$e.HasInsertAndReplaceRange.bindTo(this._contextKeyService),_=$e.CanResolve.bindTo(this._contextKeyService);return this._toDispose.add(ze(()=>{g.reset(),f.reset(),_.reset()})),this._toDispose.add(h.onDidFocus(({item:b})=>{const v=this.editor.getPosition(),C=b.editStart.column,w=v.column;let S=!0;this.editor.getOption(1)===\"smart\"&&this.model.state===2&&!b.completion.additionalTextEdits&&!(b.completion.insertTextRules&4)&&w-C===b.completion.insertText.length&&(S=this.editor.getModel().getValueInRange({startLineNumber:v.lineNumber,startColumn:C,endLineNumber:v.lineNumber,endColumn:w})!==b.completion.insertText),g.set(S),f.set(!B.equals(b.editInsertEnd,b.editReplaceEnd)),_.set(Boolean(b.provider.resolveCompletionItem)||Boolean(b.completion.documentation)||b.completion.detail!==b.completion.label)})),this._toDispose.add(h.onDetailsKeyDown(b=>{if(b.toKeybinding().equals(new Td(!0,!1,!1,!1,33))||Ze&&b.toKeybinding().equals(new Td(!1,!1,!1,!0,33))){b.stopPropagation();return}b.toKeybinding().isModifierKey()||this.editor.focus()})),h})),this._overtypingCapturer=this._toDispose.add(new ql(()=>this._toDispose.add(new V1(this.editor,this.model)))),this._alternatives=this._toDispose.add(new ql(()=>this._toDispose.add(new sh(this.editor,this._contextKeyService)))),this._toDispose.add(s.createInstance(Lm,e)),this._toDispose.add(this.model.onDidTrigger(h=>{this.widget.value.showTriggered(h.auto,h.shy?250:50),this._lineSuffix.value=new Cne(this.editor.getModel(),h.position)})),this._toDispose.add(this.model.onDidSuggest(h=>{if(h.shy)return;let u=-1;if(!h.noSelect){for(const g of this._selectors.itemsOrderedByPriorityDesc)if(u=g.select(this.editor.getModel(),this.editor.getPosition(),h.completionModel.items),u!==-1)break;u===-1&&(u=this._memoryService.select(this.editor.getModel(),this.editor.getPosition(),h.completionModel.items))}this.widget.value.showSuggestions(h.completionModel,u,h.isFrozen,h.auto)})),this._toDispose.add(this.model.onDidCancel(h=>{h.retrigger||this.widget.value.hideWidget()})),this._toDispose.add(this.editor.onDidBlurEditorWidget(()=>{this.model.cancel(),this.model.clear()}));const c=$e.AcceptSuggestionsOnEnter.bindTo(n),d=()=>{const h=this.editor.getOption(1);c.set(h===\"on\"||h===\"smart\")};this._toDispose.add(this.editor.onDidChangeConfiguration(()=>d())),d()}static get(e){return e.getContribution(K3.ID)}dispose(){this._alternatives.dispose(),this._toDispose.dispose(),this.widget.dispose(),this.model.dispose(),this._lineSuffix.dispose()}_insertSuggestion(e,t){if(!e||!e.item){this._alternatives.value.reset(),this.model.cancel(),this.model.clear();return}if(!this.editor.hasModel())return;const i=Mi.get(this.editor);if(!i)return;const n=this.editor.getModel(),s=n.getAlternativeVersionId(),{item:r}=e,a=[],l=new gn;t&1||this.editor.pushUndoStop();const c=this.getOverwriteInfo(r,Boolean(t&8));if(this._memoryService.memorize(n,this.editor.getPosition(),r),Array.isArray(r.completion.additionalTextEdits)){const h=uc.capture(this.editor);this.editor.executeEdits(\"suggestController.additionalTextEdits.sync\",r.completion.additionalTextEdits.map(u=>Pt.replaceMove(L.lift(u.range),u.text))),h.restoreRelativeVerticalPositionOfCursor(this.editor)}else if(!r.isResolved){const h=new Hn(!0);let u;const g=n.onDidChangeContent(v=>{if(v.isFlush){l.cancel(),g.dispose();return}for(const C of v.changes){const w=L.getEndPosition(C.range);(!u||B.isBefore(w,u))&&(u=w)}}),f=t;t|=2;let _=!1;const b=this.editor.onWillType(()=>{b.dispose(),_=!0,f&2||this.editor.pushUndoStop()});a.push(r.resolve(l.token).then(()=>{if(!r.completion.additionalTextEdits||l.token.isCancellationRequested||u&&r.completion.additionalTextEdits.some(C=>B.isBefore(u,L.getStartPosition(C.range))))return!1;_&&this.editor.pushUndoStop();const v=uc.capture(this.editor);return this.editor.executeEdits(\"suggestController.additionalTextEdits.async\",r.completion.additionalTextEdits.map(C=>Pt.replaceMove(L.lift(C.range),C.text))),v.restoreRelativeVerticalPositionOfCursor(this.editor),(_||!(f&2))&&this.editor.pushUndoStop(),!0}).then(v=>{this._logService.trace(\"[suggest] async resolving of edits DONE (ms, applied?)\",h.elapsed(),v),g.dispose(),b.dispose()}))}let{insertText:d}=r.completion;r.completion.insertTextRules&4||(d=_c.escape(d)),i.insert(d,{overwriteBefore:c.overwriteBefore,overwriteAfter:c.overwriteAfter,undoStopBefore:!1,undoStopAfter:!1,adjustWhitespace:!(r.completion.insertTextRules&1),clipboardText:e.model.clipboardText,overtypingCapturer:this._overtypingCapturer.value}),t&2||this.editor.pushUndoStop(),r.completion.command?r.completion.command.id===v_.id?this.model.trigger({auto:!0,shy:!1,noSelect:!1},!0):(a.push(this._commandService.executeCommand(r.completion.command.id,...r.completion.command.arguments?[...r.completion.command.arguments]:[]).catch(Ee)),this.model.cancel()):this.model.cancel(),t&4&&this._alternatives.value.set(e,h=>{for(l.cancel();n.canUndo();){s!==n.getAlternativeVersionId()&&n.undo(),this._insertSuggestion(h,3|(t&8?8:0));break}}),this._alertCompletionItem(r),Promise.all(a).finally(()=>{this._reportSuggestionAcceptedTelemetry(r,n,e),this.model.clear(),l.dispose()})}_reportSuggestionAcceptedTelemetry(e,t,i){var n;if(this._telemetryGate++%100!==0)return;const s=e.extensionId?e.extensionId.value:((n=i.item.provider._debugDisplayName)!==null&&n!==void 0?n:\"unknown\").split(\"(\",1)[0].toLowerCase();this._telemetryService.publicLog2(\"suggest.acceptedSuggestion\",{providerId:s,kind:e.completion.kind,basenameHash:_E(Ys(t.uri)).toString(16),languageId:t.getLanguageId(),fileExtension:yK(t.uri)})}getOverwriteInfo(e,t){gt(this.editor.hasModel());let i=this.editor.getOption(108).insertMode===\"replace\";t&&(i=!i);const n=e.position.column-e.editStart.column,s=(i?e.editReplaceEnd.column:e.editInsertEnd.column)-e.position.column,r=this.editor.getPosition().column-e.position.column,a=this._lineSuffix.value?this._lineSuffix.value.delta(this.editor.getPosition()):0;return{overwriteBefore:n+r,overwriteAfter:s+a}}_alertCompletionItem(e){if(en(e.completion.additionalTextEdits)){const t=p(\"aria.alert.snippet\",\"Accepting '{0}' made {1} additional edits\",e.textLabel,e.completion.additionalTextEdits.length);un(t)}}triggerSuggest(e,t,i,n){this.editor.hasModel()&&(this.model.trigger({auto:t!=null?t:!1,shy:!1,noSelect:n!=null?n:!1},!1,e,void 0,i),this.editor.revealPosition(this.editor.getPosition(),0),this.editor.focus())}triggerSuggestAndAcceptBest(e){if(!this.editor.hasModel())return;const t=this.editor.getPosition(),i=()=>{t.equals(this.editor.getPosition())&&this._commandService.executeCommand(e.fallback)},n=s=>{if(s.completion.insertTextRules&4||s.completion.additionalTextEdits)return!0;const r=this.editor.getPosition(),a=s.editStart.column,l=r.column;return l-a!==s.completion.insertText.length?!0:this.editor.getModel().getValueInRange({startLineNumber:r.lineNumber,startColumn:a,endLineNumber:r.lineNumber,endColumn:l})!==s.completion.insertText};pe.once(this.model.onDidTrigger)(s=>{const r=[];pe.any(this.model.onDidTrigger,this.model.onDidCancel)(()=>{et(r),i()},void 0,r),this.model.onDidSuggest(({completionModel:a})=>{if(et(r),a.items.length===0){i();return}const l=this._memoryService.select(this.editor.getModel(),this.editor.getPosition(),a.items),c=a.items[l];if(!n(c)){i();return}this.editor.pushUndoStop(),this._insertSuggestion({index:l,item:c,model:a},7)},void 0,r)}),this.model.trigger({auto:!1,shy:!0,noSelect:!1}),this.editor.revealPosition(t,0),this.editor.focus()}acceptSelectedSuggestion(e,t){const i=this.widget.value.getFocusedItem();let n=0;e&&(n|=4),t&&(n|=8),this._insertSuggestion(i,n)}acceptNextSuggestion(){this._alternatives.value.next()}acceptPrevSuggestion(){this._alternatives.value.prev()}cancelSuggestWidget(){this.model.cancel(),this.model.clear(),this.widget.value.hideWidget()}selectNextSuggestion(){this.widget.value.selectNext()}selectNextPageSuggestion(){this.widget.value.selectNextPage()}selectLastSuggestion(){this.widget.value.selectLast()}selectPrevSuggestion(){this.widget.value.selectPrevious()}selectPrevPageSuggestion(){this.widget.value.selectPreviousPage()}selectFirstSuggestion(){this.widget.value.selectFirst()}toggleSuggestionDetails(){this.widget.value.toggleDetails()}toggleExplainMode(){this.widget.value.toggleExplainMode()}toggleSuggestionFocus(){this.widget.value.toggleDetailsFocus()}resetWidgetSize(){this.widget.value.resetPersistedSize()}forceRenderingAbove(){this.widget.value.forceRenderingAbove()}stopForceRenderingAbove(){!this.widget.isInitialized||this.widget.value.stopForceRenderingAbove()}registerSelector(e){return this._selectors.register(e)}};fo.ID=\"editor.contrib.suggestController\";fo=vne([qh(1,W1),qh(2,Ci),qh(3,xe),qh(4,Re),qh(5,Co),qh(6,rl)],fo);class wne{constructor(e){this.prioritySelector=e,this._items=new Array}register(e){if(this._items.indexOf(e)!==-1)throw new Error(\"Value is already registered\");return this._items.push(e),this._items.sort((t,i)=>this.prioritySelector(i)-this.prioritySelector(t)),{dispose:()=>{const t=this._items.indexOf(e);t>=0&&this._items.splice(t,1)}}}get itemsOrderedByPriorityDesc(){return this._items}}class v_ extends he{constructor(){super({id:v_.id,label:p(\"suggest.trigger.label\",\"Trigger Suggest\"),alias:\"Trigger Suggest\",precondition:re.and(T.writable,T.hasCompletionItemProvider),kbOpts:{kbExpr:T.textInputFocus,primary:2058,secondary:[2087],mac:{primary:266,secondary:[521,2087]},weight:100}})}run(e,t,i){const n=fo.get(t);if(!n)return;let s,r;i&&typeof i==\"object\"&&(i.auto===!0&&(s=!0),i.noSelection===!0&&(r=!0)),n.triggerSuggest(void 0,s,void 0,r)}}v_.id=\"editor.action.triggerSuggest\";rt(fo.ID,fo);te(v_);const Xs=100+90,cs=ji.bindToContribution(fo.get);Q(new cs({id:\"acceptSelectedSuggestion\",precondition:re.and($e.Visible,$e.HasFocusedSuggestion),handler(o){o.acceptSelectedSuggestion(!0,!1)},kbOpts:[{primary:2,kbExpr:re.and($e.Visible,T.textInputFocus),weight:Xs},{primary:3,kbExpr:re.and($e.Visible,T.textInputFocus,$e.AcceptSuggestionsOnEnter,$e.MakesTextEdit),weight:Xs}],menuOpts:[{menuId:Xl,title:p(\"accept.insert\",\"Insert\"),group:\"left\",order:1,when:$e.HasInsertAndReplaceRange.toNegated()},{menuId:Xl,title:p(\"accept.insert\",\"Insert\"),group:\"left\",order:1,when:re.and($e.HasInsertAndReplaceRange,$e.InsertMode.isEqualTo(\"insert\"))},{menuId:Xl,title:p(\"accept.replace\",\"Replace\"),group:\"left\",order:1,when:re.and($e.HasInsertAndReplaceRange,$e.InsertMode.isEqualTo(\"replace\"))}]}));Q(new cs({id:\"acceptAlternativeSelectedSuggestion\",precondition:re.and($e.Visible,T.textInputFocus,$e.HasFocusedSuggestion),kbOpts:{weight:Xs,kbExpr:T.textInputFocus,primary:1027,secondary:[1026]},handler(o){o.acceptSelectedSuggestion(!1,!0)},menuOpts:[{menuId:Xl,group:\"left\",order:2,when:re.and($e.HasInsertAndReplaceRange,$e.InsertMode.isEqualTo(\"insert\")),title:p(\"accept.replace\",\"Replace\")},{menuId:Xl,group:\"left\",order:2,when:re.and($e.HasInsertAndReplaceRange,$e.InsertMode.isEqualTo(\"replace\")),title:p(\"accept.insert\",\"Insert\")}]}));Ye.registerCommandAlias(\"acceptSelectedSuggestionOnEnter\",\"acceptSelectedSuggestion\");Q(new cs({id:\"hideSuggestWidget\",precondition:$e.Visible,handler:o=>o.cancelSuggestWidget(),kbOpts:{weight:Xs,kbExpr:T.textInputFocus,primary:9,secondary:[1033]}}));Q(new cs({id:\"selectNextSuggestion\",precondition:re.and($e.Visible,$e.MultipleSuggestions),handler:o=>o.selectNextSuggestion(),kbOpts:{weight:Xs,kbExpr:T.textInputFocus,primary:18,secondary:[2066],mac:{primary:18,secondary:[2066,300]}}}));Q(new cs({id:\"selectNextPageSuggestion\",precondition:re.and($e.Visible,$e.MultipleSuggestions),handler:o=>o.selectNextPageSuggestion(),kbOpts:{weight:Xs,kbExpr:T.textInputFocus,primary:12,secondary:[2060]}}));Q(new cs({id:\"selectLastSuggestion\",precondition:re.and($e.Visible,$e.MultipleSuggestions),handler:o=>o.selectLastSuggestion()}));Q(new cs({id:\"selectPrevSuggestion\",precondition:re.and($e.Visible,$e.MultipleSuggestions),handler:o=>o.selectPrevSuggestion(),kbOpts:{weight:Xs,kbExpr:T.textInputFocus,primary:16,secondary:[2064],mac:{primary:16,secondary:[2064,302]}}}));Q(new cs({id:\"selectPrevPageSuggestion\",precondition:re.and($e.Visible,$e.MultipleSuggestions),handler:o=>o.selectPrevPageSuggestion(),kbOpts:{weight:Xs,kbExpr:T.textInputFocus,primary:11,secondary:[2059]}}));Q(new cs({id:\"selectFirstSuggestion\",precondition:re.and($e.Visible,$e.MultipleSuggestions),handler:o=>o.selectFirstSuggestion()}));Q(new cs({id:\"toggleSuggestionDetails\",precondition:$e.Visible,handler:o=>o.toggleSuggestionDetails(),kbOpts:{weight:Xs,kbExpr:T.textInputFocus,primary:2058,secondary:[2087],mac:{primary:266,secondary:[2087]}},menuOpts:[{menuId:Xl,group:\"right\",order:1,when:re.and($e.DetailsVisible,$e.CanResolve),title:p(\"detail.more\",\"show less\")},{menuId:Xl,group:\"right\",order:1,when:re.and($e.DetailsVisible.toNegated(),$e.CanResolve),title:p(\"detail.less\",\"show more\")}]}));Q(new cs({id:\"toggleExplainMode\",precondition:$e.Visible,handler:o=>o.toggleExplainMode(),kbOpts:{weight:100,primary:2133}}));Q(new cs({id:\"toggleSuggestionFocus\",precondition:$e.Visible,handler:o=>o.toggleSuggestionFocus(),kbOpts:{weight:Xs,kbExpr:T.textInputFocus,primary:2570,mac:{primary:778}}}));Q(new cs({id:\"insertBestCompletion\",precondition:re.and(T.textInputFocus,re.equals(\"config.editor.tabCompletion\",\"on\"),Lm.AtEnd,$e.Visible.toNegated(),sh.OtherSuggestions.toNegated(),Mi.InSnippetMode.toNegated()),handler:(o,e)=>{o.triggerSuggestAndAcceptBest(Fn(e)?Object.assign({fallback:\"tab\"},e):{fallback:\"tab\"})},kbOpts:{weight:Xs,primary:2}}));Q(new cs({id:\"insertNextSuggestion\",precondition:re.and(T.textInputFocus,re.equals(\"config.editor.tabCompletion\",\"on\"),sh.OtherSuggestions,$e.Visible.toNegated(),Mi.InSnippetMode.toNegated()),handler:o=>o.acceptNextSuggestion(),kbOpts:{weight:Xs,kbExpr:T.textInputFocus,primary:2}}));Q(new cs({id:\"insertPrevSuggestion\",precondition:re.and(T.textInputFocus,re.equals(\"config.editor.tabCompletion\",\"on\"),sh.OtherSuggestions,$e.Visible.toNegated(),Mi.InSnippetMode.toNegated()),handler:o=>o.acceptPrevSuggestion(),kbOpts:{weight:Xs,kbExpr:T.textInputFocus,primary:1026}}));te(class extends he{constructor(){super({id:\"editor.action.resetSuggestSize\",label:p(\"suggest.reset.label\",\"Reset Suggest Widget Size\"),alias:\"Reset Suggest Widget Size\",precondition:void 0})}run(o,e){var t;(t=fo.get(e))===null||t===void 0||t.resetWidgetSize()}});class Sne extends z{constructor(e,t){super(),this.editor=e,this.suggestControllerPreselector=t,this.isSuggestWidgetVisible=!1,this.isShiftKeyPressed=!1,this._isActive=!1,this._currentSuggestItemInfo=void 0,this.onDidChangeEmitter=new O,this.onDidChange=this.onDidChangeEmitter.event,this.setInactiveDelayed=this._register(new ft(()=>{this.isSuggestWidgetVisible||this._isActive&&(this._isActive=!1,this.onDidChangeEmitter.fire())},100)),this._register(e.onKeyDown(n=>{n.shiftKey&&!this.isShiftKeyPressed&&(this.isShiftKeyPressed=!0,this.update(this._isActive))})),this._register(e.onKeyUp(n=>{n.shiftKey&&this.isShiftKeyPressed&&(this.isShiftKeyPressed=!1,this.update(this._isActive))}));const i=fo.get(this.editor);if(i){this._register(i.registerSelector({priority:100,select:(r,a,l)=>{const c=this.editor.getModel(),d=$v(c,this.suggestControllerPreselector());if(!d)return-1;const h=B.lift(a),u=l.map((f,_)=>{const b=xA(i,h,f,this.isShiftKeyPressed),v=$v(c,b==null?void 0:b.normalizedInlineCompletion);if(!v)return;const C=yne(d.range,v.range)&&d.insertText.startsWith(v.insertText);return{index:_,valid:C,prefixLength:v.insertText.length,suggestItem:f}}).filter(f=>f&&f.valid),g=bP(u,Xf(f=>f.prefixLength,vW));return g?g.index:-1}}));let n=!1;const s=()=>{n||(n=!0,this._register(i.widget.value.onDidShow(()=>{this.isSuggestWidgetVisible=!0,this.update(!0)})),this._register(i.widget.value.onDidHide(()=>{this.isSuggestWidgetVisible=!1,this.setInactiveDelayed.schedule(),this.update(this._isActive)})),this._register(i.widget.value.onDidFocus(()=>{this.isSuggestWidgetVisible=!0,this.update(!0)})))};this._register(pe.once(i.model.onDidTrigger)(r=>{s()}))}this.update(this._isActive)}get state(){if(!!this._isActive)return{selectedItem:this._currentSuggestItemInfo}}update(e){const t=this.getSuggestItemInfo();let i=!1;Lne(this._currentSuggestItemInfo,t)||(this._currentSuggestItemInfo=t,i=!0),this._isActive!==e&&(this._isActive=e,i=!0),i&&this.onDidChangeEmitter.fire()}getSuggestItemInfo(){const e=fo.get(this.editor);if(!e||!this.isSuggestWidgetVisible)return;const t=e.widget.value.getFocusedItem();if(!!t)return xA(e,this.editor.getPosition(),t.item,this.isShiftKeyPressed)}stopForceRenderingAbove(){const e=fo.get(this.editor);e&&e.stopForceRenderingAbove()}forceRenderingAbove(){const e=fo.get(this.editor);e&&e.forceRenderingAbove()}}function yne(o,e){return e.startLineNumber===o.startLineNumber&&e.startColumn===o.startColumn&&(e.endLineNumber<o.endLineNumber||e.endLineNumber===o.endLineNumber&&e.endColumn<=o.endColumn)}function Lne(o,e){return o===e?!0:!o||!e?!1:o.completionItemKind===e.completionItemKind&&o.isSnippetText===e.isSnippetText&&iie(o.normalizedInlineCompletion,e.normalizedInlineCompletion)}function xA(o,e,t,i){if(Array.isArray(t.completion.additionalTextEdits)&&t.completion.additionalTextEdits.length>0)return{completionItemKind:t.completion.kind,isSnippetText:!1,normalizedInlineCompletion:{range:L.fromPositions(e,e),insertText:\"\",filterText:\"\",snippetInfo:void 0,additionalTextEdits:[]}};let{insertText:n}=t.completion,s=!1;if(t.completion.insertTextRules&4){const a=new _c().parse(n),l=o.editor.getModel();if(a.children.length>100)return;Vv.adjustWhitespace(l,e,a,!0,!0),n=a.toString(),s=!0}const r=o.getOverwriteInfo(t,i);return{isSnippetText:s,completionItemKind:t.completion.kind,normalizedInlineCompletion:{insertText:n,filterText:n,range:L.fromPositions(e.delta(0,-r.overwriteBefore),e.delta(0,Math.max(r.overwriteAfter,0))),snippetInfo:void 0,additionalTextEdits:[]}}}var Dne=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},kne=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},IA=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};let CD=class extends F3{constructor(e,t,i){super(e),this.cache=t,this.languageFeaturesService=i,this.suggestionInlineCompletionSource=this._register(new Sne(this.editor,()=>{var n,s;return(s=(n=this.cache.value)===null||n===void 0?void 0:n.completions[0])===null||s===void 0?void 0:s.toLiveInlineCompletion()})),this.updateOperation=this._register(new Vn),this.updateCacheSoon=this._register(new ft(()=>this.updateCache(),50)),this.minReservedLineCount=0,this._register(this.suggestionInlineCompletionSource.onDidChange(()=>{if(!this.editor.hasModel())return;this.updateCacheSoon.schedule(),this.suggestionInlineCompletionSource.state||(this.minReservedLineCount=0);const s=this.ghostText;s&&(this.minReservedLineCount=Math.max(this.minReservedLineCount,xne(s.parts.map(r=>r.lines.length-1)))),this.minReservedLineCount>=1?this.suggestionInlineCompletionSource.forceRenderingAbove():this.suggestionInlineCompletionSource.stopForceRenderingAbove(),this.onDidChangeEmitter.fire()})),this._register(this.cache.onDidChange(()=>{this.onDidChangeEmitter.fire()})),this._register(this.editor.onDidChangeCursorPosition(n=>{this.minReservedLineCount=0,this.updateCacheSoon.schedule(),this.onDidChangeEmitter.fire()})),this._register(ze(()=>this.suggestionInlineCompletionSource.stopForceRenderingAbove()))}get isActive(){return this.suggestionInlineCompletionSource.state!==void 0}isSuggestionPreviewEnabled(){return this.editor.getOption(108).preview}updateCache(){return IA(this,void 0,void 0,function*(){const e=this.suggestionInlineCompletionSource.state;if(!e||!e.selectedItem)return;const t={text:e.selectedItem.normalizedInlineCompletion.insertText,range:e.selectedItem.normalizedInlineCompletion.range,isSnippetText:e.selectedItem.isSnippetText,completionKind:e.selectedItem.completionItemKind},i=this.editor.getPosition();if(e.selectedItem.isSnippetText||e.selectedItem.completionItemKind===27||e.selectedItem.completionItemKind===20||e.selectedItem.completionItemKind===23){this.cache.clear();return}const n=Ti(r=>IA(this,void 0,void 0,function*(){let a;try{a=yield V3(this.languageFeaturesService.inlineCompletionsProvider,i,this.editor.getModel(),{triggerKind:Bs.Automatic,selectedSuggestionInfo:t},r)}catch(l){Ee(l);return}if(r.isCancellationRequested){a.dispose();return}this.cache.setValue(this.editor,a,Bs.Automatic),this.onDidChangeEmitter.fire()})),s=new W3(n,Bs.Automatic);this.updateOperation.value=s,yield n,this.updateOperation.value===s&&this.updateOperation.clear()})}get ghostText(){var e,t,i;const n=this.isSuggestionPreviewEnabled(),s=this.editor.getModel(),r=$v(s,(t=(e=this.cache.value)===null||e===void 0?void 0:e.completions[0])===null||t===void 0?void 0:t.toLiveInlineCompletion()),a=this.suggestionInlineCompletionSource.state,l=$v(s,(i=a==null?void 0:a.selectedItem)===null||i===void 0?void 0:i.normalizedInlineCompletion),c=r&&l&&r.insertText.startsWith(l.insertText)&&r.range.equalsRange(l.range);if(!n&&!c)return;const d=c?r:l||r,h=c?d.insertText.length-l.insertText.length:0;return this.toGhostText(d,h)}toGhostText(e,t){const i=this.editor.getOptions().get(108).previewMode;return e?B3(e,this.editor.getModel(),i,this.editor.getPosition(),t)||new O3(e.range.endLineNumber,[],this.minReservedLineCount):void 0}};CD=Dne([kne(2,ue)],CD);function xne(o){return o.reduce((e,t)=>e+t,0)}var Ine=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Ene=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},Nne=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class Tne extends z{constructor(){super(...arguments),this.onDidChangeEmitter=new O,this.onDidChange=this.onDidChangeEmitter.event,this.hasCachedGhostText=!1,this.currentModelRef=this._register(new Vn)}get targetModel(){var e;return(e=this.currentModelRef.value)===null||e===void 0?void 0:e.object}setTargetModel(e){var t;((t=this.currentModelRef.value)===null||t===void 0?void 0:t.object)!==e&&(this.currentModelRef.clear(),this.currentModelRef.value=e?Xte(e,e.onDidChange(()=>{this.hasCachedGhostText=!1,this.onDidChangeEmitter.fire()})):void 0,this.hasCachedGhostText=!1,this.onDidChangeEmitter.fire())}get ghostText(){var e,t;return this.hasCachedGhostText||(this.cachedGhostText=(t=(e=this.currentModelRef.value)===null||e===void 0?void 0:e.object)===null||t===void 0?void 0:t.ghostText,this.hasCachedGhostText=!0),this.cachedGhostText}setExpanded(e){var t;(t=this.targetModel)===null||t===void 0||t.setExpanded(e)}get minReservedLineCount(){return this.targetModel?this.targetModel.minReservedLineCount:0}}let wD=class extends Tne{constructor(e,t){super(),this.editor=e,this.instantiationService=t,this.sharedCache=this._register(new Mne),this.suggestWidgetAdapterModel=this._register(this.instantiationService.createInstance(CD,this.editor,this.sharedCache)),this.inlineCompletionsModel=this._register(this.instantiationService.createInstance(fD,this.editor,this.sharedCache)),this._register(this.suggestWidgetAdapterModel.onDidChange(()=>{this.updateModel()})),this.updateModel()}get activeInlineCompletionsModel(){if(this.targetModel===this.inlineCompletionsModel)return this.inlineCompletionsModel}updateModel(){this.setTargetModel(this.suggestWidgetAdapterModel.isActive?this.suggestWidgetAdapterModel:this.inlineCompletionsModel),this.inlineCompletionsModel.setActive(this.targetModel===this.inlineCompletionsModel)}shouldShowHoverAt(e){var t;const i=(t=this.activeInlineCompletionsModel)===null||t===void 0?void 0:t.ghostText;return i?i.parts.some(n=>e.containsPosition(new B(i.lineNumber,n.column))):!1}triggerInlineCompletion(){var e;(e=this.activeInlineCompletionsModel)===null||e===void 0||e.trigger(Bs.Explicit)}commitInlineCompletion(){var e;(e=this.activeInlineCompletionsModel)===null||e===void 0||e.commitCurrentSuggestion()}hideInlineCompletion(){var e;(e=this.activeInlineCompletionsModel)===null||e===void 0||e.hide()}showNextInlineCompletion(){var e;(e=this.activeInlineCompletionsModel)===null||e===void 0||e.showNext()}showPreviousInlineCompletion(){var e;(e=this.activeInlineCompletionsModel)===null||e===void 0||e.showPrevious()}hasMultipleInlineCompletions(){var e;return Nne(this,void 0,void 0,function*(){const t=yield(e=this.activeInlineCompletionsModel)===null||e===void 0?void 0:e.hasMultipleInlineCompletions();return t!==void 0?t:!1})}};wD=Ine([Ene(1,Re)],wD);class Mne extends z{constructor(){super(...arguments),this.onDidChangeEmitter=new O,this.onDidChange=this.onDidChangeEmitter.event,this.cache=this._register(new Vn)}get value(){return this.cache.value}setValue(e,t,i){this.cache.value=new lie(t,e,()=>this.onDidChangeEmitter.fire(),i)}clearAndLeak(){return this.cache.clearAndLeak()}clear(){this.cache.clear()}}var Ane=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},EA=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},GS;const NA=(GS=window.trustedTypes)===null||GS===void 0?void 0:GS.createPolicy(\"editorGhostText\",{createHTML:o=>o});let SD=class extends z{constructor(e,t,i,n){super(),this.editor=e,this.model=t,this.instantiationService=i,this.languageService=n,this.disposed=!1,this.partsWidget=this._register(this.instantiationService.createInstance(One,this.editor)),this.additionalLinesWidget=this._register(new Pne(this.editor,this.languageService.languageIdCodec)),this.viewMoreContentWidget=void 0,this.replacementDecoration=this._register(new Rne(this.editor)),this._register(this.editor.onDidChangeConfiguration(s=>{(s.hasChanged(29)||s.hasChanged(107)||s.hasChanged(90)||s.hasChanged(85)||s.hasChanged(47)||s.hasChanged(46)||s.hasChanged(61))&&this.update()})),this._register(ze(()=>{var s;this.disposed=!0,this.update(),(s=this.viewMoreContentWidget)===null||s===void 0||s.dispose(),this.viewMoreContentWidget=void 0})),this._register(t.onDidChange(()=>{this.update()})),this.update()}shouldShowHoverAtViewZone(e){return this.additionalLinesWidget.viewZoneId===e}update(){var e;const t=this.model.ghostText;if(!this.editor.hasModel()||!t||this.disposed){this.partsWidget.clear(),this.additionalLinesWidget.clear(),this.replacementDecoration.clear();return}const i=new Array,n=new Array;function s(c,d){if(n.length>0){const h=n[n.length-1];d&&h.decorations.push(new es(h.content.length+1,h.content.length+1+c[0].length,d,0)),h.content+=c[0],c=c.slice(1)}for(const h of c)n.push({content:h,decorations:d?[new es(1,h.length+1,d,0)]:[]})}t instanceof P3?this.replacementDecoration.setDecorations([{range:new L(t.lineNumber,t.columnStart,t.lineNumber,t.columnStart+t.length),options:{inlineClassName:\"inline-completion-text-to-replace\",description:\"GhostTextReplacement\"}}]):this.replacementDecoration.setDecorations([]);const r=this.editor.getModel().getLineContent(t.lineNumber);let a,l=0;for(const c of t.parts){let d=c.lines;a===void 0?(i.push({column:c.column,text:d[0],preview:c.preview}),d=d.slice(1)):s([r.substring(l,c.column-1)],void 0),d.length>0&&(s(d,\"ghost-text\"),a===void 0&&c.column<=r.length&&(a=c.column)),l=c.column-1}a!==void 0&&s([r.substring(l)],void 0),this.partsWidget.setParts(t.lineNumber,i,a!==void 0?{column:a,length:r.length+1-a}:void 0),this.additionalLinesWidget.updateLines(t.lineNumber,n,t.additionalReservedLineCount),(e=this.viewMoreContentWidget)===null||e===void 0||e.dispose(),this.viewMoreContentWidget=void 0}renderViewMoreLines(e,t,i){const n=this.editor.getOption(46),s=document.createElement(\"div\");s.className=\"suggest-preview-additional-widget\",tn(s,n);const r=document.createElement(\"span\");r.className=\"content-spacer\",r.append(t),s.append(r);const a=document.createElement(\"span\");a.className=\"content-newline suggest-preview-text\",a.append(\"\\u23CE  \"),s.append(a);const l=new ee,c=document.createElement(\"div\");return c.className=\"button suggest-preview-text\",c.append(`+${i} lines\\u2026`),l.add(Ei(c,\"mousedown\",d=>{var h;(h=this.model)===null||h===void 0||h.setExpanded(!0),d.preventDefault(),this.editor.focus()})),s.append(c),new Bne(this.editor,e,s,l)}};SD=Ane([EA(2,Re),EA(3,Ht)],SD);class Rne{constructor(e){this.editor=e,this.decorationIds=[]}setDecorations(e){this.editor.changeDecorations(t=>{this.decorationIds=t.deltaDecorations(this.decorationIds,e)})}clear(){this.setDecorations([])}dispose(){this.clear()}}class One{constructor(e){this.editor=e,this.decorationIds=[]}dispose(){this.clear()}clear(){this.editor.changeDecorations(e=>{this.decorationIds=e.deltaDecorations(this.decorationIds,[])})}setParts(e,t,i){if(!this.editor.getModel())return;const s=new Array;i&&s.push({range:L.fromPositions(new B(e,i.column),new B(e,i.column+i.length)),options:{inlineClassName:\"ghost-text-hidden\",description:\"ghost-text-hidden\"}}),this.editor.changeDecorations(r=>{this.decorationIds=r.deltaDecorations(this.decorationIds,t.map(a=>({range:L.fromPositions(new B(e,a.column)),options:{description:\"ghost-text\",after:{content:a.text,inlineClassName:a.preview?\"ghost-text-decoration-preview\":\"ghost-text-decoration\",cursorStops:Bo.Left},showIfCollapsed:!0}})).concat(s))})}}class Pne{constructor(e,t){this.editor=e,this.languageIdCodec=t,this._viewZoneId=void 0}get viewZoneId(){return this._viewZoneId}dispose(){this.clear()}clear(){this.editor.changeViewZones(e=>{this._viewZoneId&&(e.removeZone(this._viewZoneId),this._viewZoneId=void 0)})}updateLines(e,t,i){const n=this.editor.getModel();if(!n)return;const{tabSize:s}=n.getOptions();this.editor.changeViewZones(r=>{this._viewZoneId&&(r.removeZone(this._viewZoneId),this._viewZoneId=void 0);const a=Math.max(t.length,i);if(a>0){const l=document.createElement(\"div\");Fne(l,s,t,this.editor.getOptions(),this.languageIdCodec),this._viewZoneId=r.addZone({afterLineNumber:e,heightInLines:a,domNode:l,afterColumnAffinity:1})}})}}function Fne(o,e,t,i,n){const s=i.get(29),r=i.get(107),a=\"none\",l=i.get(85),c=i.get(47),d=i.get(46),h=i.get(61),u=lc(1e4);u.appendASCIIString('<div class=\"suggest-preview-text\">');for(let _=0,b=t.length;_<b;_++){const v=t[_],C=v.content;u.appendASCIIString('<div class=\"view-line'),u.appendASCIIString('\" style=\"top:'),u.appendASCIIString(String(_*h)),u.appendASCIIString('px;width:1000000px;\">');const w=DC(C),S=ig(C),k=Si.createEmpty(C,n);Ym(new Dc(d.isMonospace&&!s,d.canUseHalfwidthRightwardsArrow,C,!1,w,S,0,k,v.decorations,e,0,d.spaceWidth,d.middotWidth,d.wsmiddotWidth,r,a,l,c!==vs.OFF,null),u),u.appendASCIIString(\"</div>\")}u.appendASCIIString(\"</div>\"),tn(o,d);const g=u.build(),f=NA?NA.createHTML(g):g;o.innerHTML=f}class Bne extends z{constructor(e,t,i,n){super(),this.editor=e,this.position=t,this.domNode=i,this.allowEditorOverflow=!1,this.suppressMouseDown=!1,this._register(n),this._register(ze(()=>{this.editor.removeContentWidget(this)})),this.editor.addContentWidget(this)}getId(){return\"editor.widget.viewMoreLinesWidget\"}getDomNode(){return this.domNode}getPosition(){return{position:this.position,preference:[0]}}}Rt((o,e)=>{const t=o.getColor($U);t&&(e.addRule(`.monaco-editor .ghost-text-decoration { color: ${t.toString()} !important; }`),e.addRule(`.monaco-editor .ghost-text-decoration-preview { color: ${t.toString()} !important; }`),e.addRule(`.monaco-editor .suggest-preview-text .ghost-text { color: ${t.toString()} !important; }`));const i=o.getColor(jU);i&&(e.addRule(`.monaco-editor .ghost-text-decoration { background-color: ${i.toString()}; }`),e.addRule(`.monaco-editor .ghost-text-decoration-preview { background-color: ${i.toString()}; }`),e.addRule(`.monaco-editor .suggest-preview-text .ghost-text { background-color: ${i.toString()}; }`));const n=o.getColor(UU);n&&(e.addRule(`.monaco-editor .suggest-preview-text .ghost-text { border: 1px solid ${n}; }`),e.addRule(`.monaco-editor .ghost-text-decoration { border: 1px solid ${n}; }`),e.addRule(`.monaco-editor .ghost-text-decoration-preview { border: 1px solid ${n}; }`))});var q3=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},yD=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},H1=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};let Ni=class G3 extends z{constructor(e,t){super(),this.editor=e,this.instantiationService=t,this.triggeredExplicitly=!1,this.activeController=this._register(new Vn),this.activeModelDidChangeEmitter=this._register(new O),this._register(this.editor.onDidChangeModel(()=>{this.updateModelController()})),this._register(this.editor.onDidChangeConfiguration(i=>{i.hasChanged(108)&&this.updateModelController(),i.hasChanged(57)&&this.updateModelController()})),this.updateModelController()}static get(e){return e.getContribution(G3.ID)}get activeModel(){var e;return(e=this.activeController.value)===null||e===void 0?void 0:e.model}updateModelController(){const e=this.editor.getOption(108),t=this.editor.getOption(57);this.activeController.value=void 0,this.activeController.value=this.editor.hasModel()&&(e.preview||t.enabled||this.triggeredExplicitly)?this.instantiationService.createInstance(LD,this.editor):void 0,this.activeModelDidChangeEmitter.fire()}shouldShowHoverAt(e){var t;return((t=this.activeModel)===null||t===void 0?void 0:t.shouldShowHoverAt(e))||!1}shouldShowHoverAtViewZone(e){var t,i;return((i=(t=this.activeController.value)===null||t===void 0?void 0:t.widget)===null||i===void 0?void 0:i.shouldShowHoverAtViewZone(e))||!1}trigger(){var e;this.triggeredExplicitly=!0,this.activeController.value||this.updateModelController(),(e=this.activeModel)===null||e===void 0||e.triggerInlineCompletion()}commit(){var e;(e=this.activeModel)===null||e===void 0||e.commitInlineCompletion()}hide(){var e;(e=this.activeModel)===null||e===void 0||e.hideInlineCompletion()}showNextInlineCompletion(){var e;(e=this.activeModel)===null||e===void 0||e.showNextInlineCompletion()}showPreviousInlineCompletion(){var e;(e=this.activeModel)===null||e===void 0||e.showPreviousInlineCompletion()}hasMultipleInlineCompletions(){var e;return H1(this,void 0,void 0,function*(){const t=yield(e=this.activeModel)===null||e===void 0?void 0:e.hasMultipleInlineCompletions();return t!==void 0?t:!1})}};Ni.inlineSuggestionVisible=new ce(\"inlineSuggestionVisible\",!1,p(\"inlineSuggestionVisible\",\"Whether an inline suggestion is visible\"));Ni.inlineSuggestionHasIndentation=new ce(\"inlineSuggestionHasIndentation\",!1,p(\"inlineSuggestionHasIndentation\",\"Whether the inline suggestion starts with whitespace\"));Ni.inlineSuggestionHasIndentationLessThanTabSize=new ce(\"inlineSuggestionHasIndentationLessThanTabSize\",!0,p(\"inlineSuggestionHasIndentationLessThanTabSize\",\"Whether the inline suggestion starts with whitespace that is less than what would be inserted by tab\"));Ni.ID=\"editor.contrib.ghostTextController\";Ni=q3([yD(1,Re)],Ni);class Wne{constructor(e){this.contextKeyService=e,this.inlineCompletionVisible=Ni.inlineSuggestionVisible.bindTo(this.contextKeyService),this.inlineCompletionSuggestsIndentation=Ni.inlineSuggestionHasIndentation.bindTo(this.contextKeyService),this.inlineCompletionSuggestsIndentationLessThanTabSize=Ni.inlineSuggestionHasIndentationLessThanTabSize.bindTo(this.contextKeyService)}}let LD=class extends z{constructor(e,t,i){super(),this.editor=e,this.instantiationService=t,this.contextKeyService=i,this.contextKeys=new Wne(this.contextKeyService),this.model=this._register(this.instantiationService.createInstance(wD,this.editor)),this.widget=this._register(this.instantiationService.createInstance(SD,this.editor,this.model)),this._register(ze(()=>{this.contextKeys.inlineCompletionVisible.set(!1),this.contextKeys.inlineCompletionSuggestsIndentation.set(!1),this.contextKeys.inlineCompletionSuggestsIndentationLessThanTabSize.set(!0)})),this._register(this.model.onDidChange(()=>{this.updateContextKeys()})),this.updateContextKeys()}updateContextKeys(){var e;this.contextKeys.inlineCompletionVisible.set(((e=this.model.activeInlineCompletionsModel)===null||e===void 0?void 0:e.ghostText)!==void 0);let t=!1,i=!0;const n=this.model.inlineCompletionsModel.ghostText;if(!!this.model.activeInlineCompletionsModel&&n&&n.parts.length>0){const{column:s,lines:r}=n.parts[0],a=r[0],l=this.editor.getModel().getLineIndentColumn(n.lineNumber);if(s<=l){let d=Sn(a);d===-1&&(d=a.length-1),t=d>0;const h=this.editor.getModel().getOptions().tabSize;i=_i.visibleColumnFromColumn(a,d+1,h)<h}}this.contextKeys.inlineCompletionSuggestsIndentation.set(t),this.contextKeys.inlineCompletionSuggestsIndentationLessThanTabSize.set(i)}};LD=q3([yD(1,Re),yD(2,xe)],LD);class Dg extends he{constructor(){super({id:Dg.ID,label:p(\"action.inlineSuggest.showNext\",\"Show Next Inline Suggestion\"),alias:\"Show Next Inline Suggestion\",precondition:re.and(T.writable,Ni.inlineSuggestionVisible),kbOpts:{weight:100,primary:601}})}run(e,t){return H1(this,void 0,void 0,function*(){const i=Ni.get(t);i&&(i.showNextInlineCompletion(),t.focus())})}}Dg.ID=\"editor.action.inlineSuggest.showNext\";class kg extends he{constructor(){super({id:kg.ID,label:p(\"action.inlineSuggest.showPrevious\",\"Show Previous Inline Suggestion\"),alias:\"Show Previous Inline Suggestion\",precondition:re.and(T.writable,Ni.inlineSuggestionVisible),kbOpts:{weight:100,primary:599}})}run(e,t){return H1(this,void 0,void 0,function*(){const i=Ni.get(t);i&&(i.showPreviousInlineCompletion(),t.focus())})}}kg.ID=\"editor.action.inlineSuggest.showPrevious\";class Vne extends he{constructor(){super({id:\"editor.action.inlineSuggest.trigger\",label:p(\"action.inlineSuggest.trigger\",\"Trigger Inline Suggestion\"),alias:\"Trigger Inline Suggestion\",precondition:T.writable})}run(e,t){return H1(this,void 0,void 0,function*(){const i=Ni.get(t);i&&i.trigger()})}}var Hne=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Gh=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};class zne{constructor(e,t,i){this.owner=e,this.range=t,this.controller=i}isValidForHoverAnchor(e){return e.type===1&&this.range.startColumn<=e.range.startColumn&&this.range.endColumn>=e.range.endColumn}hasMultipleSuggestions(){return this.controller.hasMultipleInlineCompletions()}get commands(){var e,t,i;return((i=(t=(e=this.controller.activeModel)===null||e===void 0?void 0:e.activeInlineCompletionsModel)===null||t===void 0?void 0:t.completionSession.value)===null||i===void 0?void 0:i.commands)||[]}}let DD=class{constructor(e,t,i,n,s,r,a){this._editor=e,this._commandService=t,this._menuService=i,this._contextKeyService=n,this._languageService=s,this._openerService=r,this.accessibilityService=a,this.hoverOrdinal=3}suggestHoverAnchor(e){const t=Ni.get(this._editor);if(!t)return null;const i=e.target;if(i.type===8){const n=i.detail;if(t.shouldShowHoverAtViewZone(n.viewZoneId))return new u0(1e3,this,L.fromPositions(n.positionBefore||n.position,n.positionBefore||n.position))}return i.type===7&&t.shouldShowHoverAt(i.range)?new u0(1e3,this,i.range):i.type===6&&i.detail.mightBeForeignElement&&t.shouldShowHoverAt(i.range)?new u0(1e3,this,i.range):null}computeSync(e,t){const i=Ni.get(this._editor);return i&&i.shouldShowHoverAt(e.range)?[new zne(this,e.range,i)]:[]}renderHoverParts(e,t){const i=new ee,n=t[0];this.accessibilityService.isScreenReaderOptimized()&&this.renderScreenReaderText(e,n,i);const s=i.add(this._menuService.createMenu(A.InlineCompletionsActions,this._contextKeyService)),r=e.statusBar.addAction({label:p(\"showNextInlineSuggestion\",\"Next\"),commandId:Dg.ID,run:()=>this._commandService.executeCommand(Dg.ID)}),a=e.statusBar.addAction({label:p(\"showPreviousInlineSuggestion\",\"Previous\"),commandId:kg.ID,run:()=>this._commandService.executeCommand(kg.ID)});e.statusBar.addAction({label:p(\"acceptInlineSuggestion\",\"Accept\"),commandId:Uv,run:()=>this._commandService.executeCommand(Uv)});const l=[r,a];for(const c of l)c.setEnabled(!1);n.hasMultipleSuggestions().then(c=>{for(const d of l)d.setEnabled(c)});for(const c of n.commands)e.statusBar.addAction({label:c.title,commandId:c.id,run:()=>this._commandService.executeCommand(c.id,...c.arguments||[])});for(const[c,d]of s.getActions())for(const h of d)h instanceof ac&&e.statusBar.addAction({label:h.label,commandId:h.item.id,run:()=>this._commandService.executeCommand(h.item.id)});return i}renderScreenReaderText(e,t,i){var n,s;const r=se,a=r(\"div.hover-row.markdown-hover\"),l=G(a,r(\"div.hover-contents\")),c=i.add(new sl({editor:this._editor},this._languageService,this._openerService)),d=u=>{i.add(c.onDidRenderAsync(()=>{l.className=\"hover-contents code-hover-contents\",e.onContentsChanged()}));const g=p(\"inlineSuggestionFollows\",\"Suggestion:\"),f=i.add(c.render(new Rn().appendText(g).appendCodeblock(\"text\",u)));l.replaceChildren(f.element)},h=(s=(n=t.controller.activeModel)===null||n===void 0?void 0:n.inlineCompletionsModel)===null||s===void 0?void 0:s.ghostText;if(h){const u=this._editor.getModel().getLineContent(h.lineNumber);d(h.renderForScreenReader(u))}e.fragment.appendChild(a)}};DD=Hne([Gh(1,Ci),Gh(2,fh),Gh(3,xe),Gh(4,Ht),Gh(5,So),Gh(6,ll)],DD);rt(Ni.ID,Ni);te(Vne);te(Dg);te(kg);xh.register(DD);const Z3=ji.bindToContribution(Ni.get),kD=new Z3({id:Uv,precondition:Ni.inlineSuggestionVisible,handler(o){o.commit(),o.editor.focus()}});Q(kD);ls.registerKeybindingRule({primary:2,weight:200,id:kD.id,when:re.and(kD.precondition,T.tabMovesFocus.toNegated(),Ni.inlineSuggestionHasIndentationLessThanTabSize)});Q(new Z3({id:\"editor.action.inlineSuggest.hide\",precondition:Ni.inlineSuggestionVisible,kbOpts:{weight:100,primary:9},handler(o){o.hide()}}));function Kn(o,e){let t=0;for(let i=0;i<o.length;i++)o.charAt(i)===\"\t\"?t+=e:t++;return t}function mp(o,e,t){o=o<0?0:o;let i=\"\";if(!t){const n=Math.floor(o/e);o=o%e;for(let s=0;s<n;s++)i+=\"\t\"}for(let n=0;n<o;n++)i+=\" \";return i}var Une=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},$ne=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};function Y3(o,e,t,i,n){if(o.getLineCount()===1&&o.getLineMaxColumn(1)===1)return[];const s=e.getLanguageConfiguration(o.getLanguageId()).indentationRules;if(!s)return[];for(i=Math.min(i,o.getLineCount());t<=i&&s.unIndentedLinePattern;){const b=o.getLineContent(t);if(!s.unIndentedLinePattern.test(b))break;t++}if(t>i-1)return[];const{tabSize:r,indentSize:a,insertSpaces:l}=o.getOptions(),c=(b,v)=>(v=v||1,Fs.shiftIndent(b,b.length+v,r,a,l)),d=(b,v)=>(v=v||1,Fs.unshiftIndent(b,b.length+v,r,a,l)),h=[];let u;const g=o.getLineContent(t);let f=g;if(n!=null){u=n;const b=pt(g);f=u+g.substring(b.length),s.decreaseIndentPattern&&s.decreaseIndentPattern.test(f)&&(u=d(u),f=u+g.substring(b.length)),g!==f&&h.push(Pt.replaceMove(new oe(t,1,t,b.length+1),U0(u,a,l)))}else u=pt(g);let _=u;s.increaseIndentPattern&&s.increaseIndentPattern.test(f)?(_=c(_),u=c(u)):s.indentNextLinePattern&&s.indentNextLinePattern.test(f)&&(_=c(_)),t++;for(let b=t;b<=i;b++){const v=o.getLineContent(b),C=pt(v),w=_+v.substring(C.length);s.decreaseIndentPattern&&s.decreaseIndentPattern.test(w)&&(_=d(_),u=d(u)),C!==_&&h.push(Pt.replaceMove(new oe(b,1,b,C.length+1),U0(_,a,l))),!(s.unIndentedLinePattern&&s.unIndentedLinePattern.test(v))&&(s.increaseIndentPattern&&s.increaseIndentPattern.test(w)?(u=c(u),_=u):s.indentNextLinePattern&&s.indentNextLinePattern.test(w)?_=c(_):_=u)}return h}class z1 extends he{constructor(){super({id:z1.ID,label:p(\"indentationToSpaces\",\"Convert Indentation to Spaces\"),alias:\"Convert Indentation to Spaces\",precondition:T.writable})}run(e,t){const i=t.getModel();if(!i)return;const n=i.getOptions(),s=t.getSelection();if(!s)return;const r=new Gne(s,n.tabSize);t.pushUndoStop(),t.executeCommands(this.id,[r]),t.pushUndoStop(),i.updateOptions({insertSpaces:!0})}}z1.ID=\"editor.action.indentationToSpaces\";class U1 extends he{constructor(){super({id:U1.ID,label:p(\"indentationToTabs\",\"Convert Indentation to Tabs\"),alias:\"Convert Indentation to Tabs\",precondition:T.writable})}run(e,t){const i=t.getModel();if(!i)return;const n=i.getOptions(),s=t.getSelection();if(!s)return;const r=new Zne(s,n.tabSize);t.pushUndoStop(),t.executeCommands(this.id,[r]),t.pushUndoStop(),i.updateOptions({insertSpaces:!1})}}U1.ID=\"editor.action.indentationToTabs\";class X3 extends he{constructor(e,t){super(t),this.insertSpaces=e}run(e,t){const i=e.get(c_),n=e.get(Bt),s=t.getModel();if(!s)return;const r=n.getCreationOptions(s.getLanguageId(),s.uri,s.isForSimpleWidget),a=[1,2,3,4,5,6,7,8].map(c=>({id:c.toString(),label:c.toString(),description:c===r.tabSize?p(\"configuredTabSize\",\"Configured Tab Size\"):void 0})),l=Math.min(s.getOptions().tabSize-1,7);setTimeout(()=>{i.pick(a,{placeHolder:p({key:\"selectTabWidth\",comment:[\"Tab corresponds to the tab key\"]},\"Select Tab Size for Current File\"),activeItem:a[l]}).then(c=>{c&&s&&!s.isDisposed()&&s.updateOptions({tabSize:parseInt(c.label,10),insertSpaces:this.insertSpaces})})},50)}}class $1 extends X3{constructor(){super(!1,{id:$1.ID,label:p(\"indentUsingTabs\",\"Indent Using Tabs\"),alias:\"Indent Using Tabs\",precondition:void 0})}}$1.ID=\"editor.action.indentUsingTabs\";class j1 extends X3{constructor(){super(!0,{id:j1.ID,label:p(\"indentUsingSpaces\",\"Indent Using Spaces\"),alias:\"Indent Using Spaces\",precondition:void 0})}}j1.ID=\"editor.action.indentUsingSpaces\";class K1 extends he{constructor(){super({id:K1.ID,label:p(\"detectIndentation\",\"Detect Indentation from Content\"),alias:\"Detect Indentation from Content\",precondition:void 0})}run(e,t){const i=e.get(Bt),n=t.getModel();if(!n)return;const s=i.getCreationOptions(n.getLanguageId(),n.uri,n.isForSimpleWidget);n.detectIndentation(s.insertSpaces,s.tabSize)}}K1.ID=\"editor.action.detectIndentation\";class jne extends he{constructor(){super({id:\"editor.action.reindentlines\",label:p(\"editor.reindentlines\",\"Reindent Lines\"),alias:\"Reindent Lines\",precondition:T.writable})}run(e,t){const i=e.get(ti),n=t.getModel();if(!n)return;const s=Y3(n,i,1,n.getLineCount());s.length>0&&(t.pushUndoStop(),t.executeEdits(this.id,s),t.pushUndoStop())}}class Kne extends he{constructor(){super({id:\"editor.action.reindentselectedlines\",label:p(\"editor.reindentselectedlines\",\"Reindent Selected Lines\"),alias:\"Reindent Selected Lines\",precondition:T.writable})}run(e,t){const i=e.get(ti),n=t.getModel();if(!n)return;const s=t.getSelections();if(s===null)return;const r=[];for(const a of s){let l=a.startLineNumber,c=a.endLineNumber;if(l!==c&&a.endColumn===1&&c--,l===1){if(l===c)continue}else l--;const d=Y3(n,i,l,c);r.push(...d)}r.length>0&&(t.pushUndoStop(),t.executeEdits(this.id,r),t.pushUndoStop())}}class qne{constructor(e,t){this._initialSelection=t,this._edits=[],this._selectionId=null;for(const i of e)i.range&&typeof i.text==\"string\"&&this._edits.push(i)}getEditOperations(e,t){for(const n of this._edits)t.addEditOperation(L.lift(n.range),n.text);let i=!1;Array.isArray(this._edits)&&this._edits.length===1&&this._initialSelection.isEmpty()&&(this._edits[0].range.startColumn===this._initialSelection.endColumn&&this._edits[0].range.startLineNumber===this._initialSelection.endLineNumber?(i=!0,this._selectionId=t.trackSelection(this._initialSelection,!0)):this._edits[0].range.endColumn===this._initialSelection.startColumn&&this._edits[0].range.endLineNumber===this._initialSelection.startLineNumber&&(i=!0,this._selectionId=t.trackSelection(this._initialSelection,!1))),i||(this._selectionId=t.trackSelection(this._initialSelection))}computeCursorState(e,t){return t.getTrackedSelection(this._selectionId)}}let km=class{constructor(e,t){this.editor=e,this._languageConfigurationService=t,this.callOnDispose=new ee,this.callOnModel=new ee,this.callOnDispose.add(e.onDidChangeConfiguration(()=>this.update())),this.callOnDispose.add(e.onDidChangeModel(()=>this.update())),this.callOnDispose.add(e.onDidChangeModelLanguage(()=>this.update()))}update(){this.callOnModel.clear(),!(this.editor.getOption(9)<4||this.editor.getOption(50))&&(!this.editor.hasModel()||this.callOnModel.add(this.editor.onDidPaste(({range:e})=>{this.trigger(e)})))}trigger(e){const t=this.editor.getSelections();if(t===null||t.length>1)return;const i=this.editor.getModel();if(!i||!i.tokenization.isCheapToTokenize(e.getStartPosition().lineNumber))return;const n=this.editor.getOption(9),{tabSize:s,indentSize:r,insertSpaces:a}=i.getOptions(),l=[],c={shiftIndent:g=>Fs.shiftIndent(g,g.length+1,s,r,a),unshiftIndent:g=>Fs.unshiftIndent(g,g.length+1,s,r,a)};let d=e.startLineNumber;for(;d<=e.endLineNumber;){if(this.shouldIgnoreLine(i,d)){d++;continue}break}if(d>e.endLineNumber)return;let h=i.getLineContent(d);if(!/\\S/.test(h.substring(0,e.startColumn-1))){const g=Qf(n,i,i.getLanguageId(),d,c,this._languageConfigurationService);if(g!==null){const f=pt(h),_=Kn(g,s),b=Kn(f,s);if(_!==b){const v=mp(_,s,a);l.push({range:new L(d,1,d,f.length+1),text:v}),h=v+h.substr(f.length)}else{const v=RP(i,d,this._languageConfigurationService);if(v===0||v===8)return}}}const u=d;for(;d<e.endLineNumber;){if(!/\\S/.test(i.getLineContent(d+1))){d++;continue}break}if(d!==e.endLineNumber){const f=Qf(n,{tokenization:{getLineTokens:_=>i.tokenization.getLineTokens(_),getLanguageId:()=>i.getLanguageId(),getLanguageIdAtPosition:(_,b)=>i.getLanguageIdAtPosition(_,b)},getLineContent:_=>_===u?h:i.getLineContent(_)},i.getLanguageId(),d+1,c,this._languageConfigurationService);if(f!==null){const _=Kn(f,s),b=Kn(pt(i.getLineContent(d+1)),s);if(_!==b){const v=_-b;for(let C=d+1;C<=e.endLineNumber;C++){const w=i.getLineContent(C),S=pt(w),x=Kn(S,s)+v,y=mp(x,s,a);y!==S&&l.push({range:new L(C,1,C,S.length+1),text:y})}}}}if(l.length>0){this.editor.pushUndoStop();const g=new qne(l,this.editor.getSelection());this.editor.executeCommand(\"autoIndentOnPaste\",g),this.editor.pushUndoStop()}}shouldIgnoreLine(e,t){e.tokenization.forceTokenization(t);const i=e.getLineFirstNonWhitespaceColumn(t);if(i===0)return!0;const n=e.tokenization.getLineTokens(t);if(n.getCount()>0){const s=n.findTokenIndexAtOffset(i);if(s>=0&&n.getStandardTokenType(s)===1)return!0}return!1}dispose(){this.callOnDispose.dispose(),this.callOnModel.dispose()}};km.ID=\"editor.contrib.autoIndentOnPaste\";km=Une([$ne(1,ti)],km);function Q3(o,e,t,i){if(o.getLineCount()===1&&o.getLineMaxColumn(1)===1)return;let n=\"\";for(let r=0;r<t;r++)n+=\" \";const s=new RegExp(n,\"gi\");for(let r=1,a=o.getLineCount();r<=a;r++){let l=o.getLineFirstNonWhitespaceColumn(r);if(l===0&&(l=o.getLineMaxColumn(r)),l===1)continue;const c=new L(r,1,r,l),d=o.getValueInRange(c),h=i?d.replace(/\\t/ig,n):d.replace(s,\"\t\");e.addEditOperation(c,h)}}class Gne{constructor(e,t){this.selection=e,this.tabSize=t,this.selectionId=null}getEditOperations(e,t){this.selectionId=t.trackSelection(this.selection),Q3(e,t,this.tabSize,!0)}computeCursorState(e,t){return t.getTrackedSelection(this.selectionId)}}class Zne{constructor(e,t){this.selection=e,this.tabSize=t,this.selectionId=null}getEditOperations(e,t){this.selectionId=t.trackSelection(this.selection),Q3(e,t,this.tabSize,!1)}computeCursorState(e,t){return t.getTrackedSelection(this.selectionId)}}rt(km.ID,km);te(z1);te(U1);te($1);te(j1);te(K1);te(jne);te(Kne);var jv=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class J3{constructor(e,t){this.range=e,this.direction=t}}class dN{constructor(e,t,i){this.hint=e,this.anchor=t,this.provider=i,this._isResolved=!1}with(e){const t=new dN(this.hint,e.anchor,this.provider);return t._isResolved=this._isResolved,t._currentResolve=this._currentResolve,t}resolve(e){return jv(this,void 0,void 0,function*(){if(typeof this.provider.resolveInlayHint==\"function\"){if(this._currentResolve)return yield this._currentResolve,e.isCancellationRequested?void 0:this.resolve(e);this._isResolved||(this._currentResolve=this._doResolve(e).finally(()=>this._currentResolve=void 0)),yield this._currentResolve}})}_doResolve(e){var t,i;return jv(this,void 0,void 0,function*(){try{const n=yield Promise.resolve(this.provider.resolveInlayHint(this.hint,e));this.hint.tooltip=(t=n==null?void 0:n.tooltip)!==null&&t!==void 0?t:this.hint.tooltip,this.hint.label=(i=n==null?void 0:n.label)!==null&&i!==void 0?i:this.hint.label,this._isResolved=!0}catch(n){Ai(n),this._isResolved=!1}})}}class xm{constructor(e,t,i){this._disposables=new ee,this.ranges=e,this.provider=new Set;const n=[];for(const[s,r]of t){this._disposables.add(s),this.provider.add(r);for(const a of s.hints){const l=i.validatePosition(a.position);let c=\"before\";const d=xm._getRangeAtPosition(i,l);let h;d.getStartPosition().isBefore(l)?(h=L.fromPositions(d.getStartPosition(),l),c=\"after\"):(h=L.fromPositions(l,d.getEndPosition()),c=\"before\"),n.push(new dN(a,new J3(h,c),r))}}this.items=n.sort((s,r)=>B.compare(s.hint.position,r.hint.position))}static create(e,t,i,n){return jv(this,void 0,void 0,function*(){const s=[],r=e.ordered(t).reverse().map(a=>i.map(l=>jv(this,void 0,void 0,function*(){try{const c=yield a.provideInlayHints(t,l,n);c!=null&&c.hints.length&&s.push([c,a])}catch(c){Ai(c)}})));if(yield Promise.all(r.flat()),n.isCancellationRequested||t.isDisposed())throw new yc;return new xm(i,s,t)})}dispose(){this._disposables.dispose()}static _getRangeAtPosition(e,t){const i=t.lineNumber,n=e.getWordAtPosition(t);if(n)return new L(i,n.startColumn,i,n.endColumn);e.tokenization.tokenizeIfCheap(i);const s=e.tokenization.getLineTokens(i),r=t.column-1,a=s.findTokenIndexAtOffset(r);let l=s.getStartOffset(a),c=s.getEndOffset(a);return c-l===1&&(l===r&&a>1?(l=s.getStartOffset(a-1),c=s.getEndOffset(a-1)):c===r&&a<s.getCount()-1&&(l=s.getStartOffset(a+1),c=s.getEndOffset(a+1))),new L(i,l+1,i,c+1)}}function Yne(o){return me.from({scheme:Ne.command,path:o.id,query:o.arguments&&encodeURIComponent(JSON.stringify(o.arguments))}).toString()}var _p=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};function Xne(o,e,t,i){var n;return _p(this,void 0,void 0,function*(){const s=o.get($n),r=o.get(cl),a=o.get(Ci),l=o.get(Re),c=o.get(gi);if(yield i.item.resolve(We.None),!i.part.location)return;const d=i.part.location,h=[],u=new Set(po.getMenuItems(A.EditorContext).map(f=>ou(f)?f.command.id:\"\"));for(const f of _d.getEditorActions())f instanceof _o&&u.has(f.id)&&h.push(new is(f.id,f.label,void 0,!0,()=>_p(this,void 0,void 0,function*(){const _=yield s.createModelReference(d.uri);try{yield l.invokeFunction(f.run.bind(f),e,new pm(_.object.textEditorModel,L.getStartPosition(d.range)))}finally{_.dispose()}})));if(i.part.command){const{command:f}=i.part;h.push(new Ji),h.push(new is(f.id,f.title,void 0,!0,()=>_p(this,void 0,void 0,function*(){var _;try{yield a.executeCommand(f.id,...(_=f.arguments)!==null&&_!==void 0?_:[])}catch(b){c.notify({severity:t5.Error,source:i.item.provider.displayName,message:b})}})))}const g=e.getOption(117);r.showContextMenu({domForShadowRoot:g&&(n=e.getDomNode())!==null&&n!==void 0?n:void 0,getAnchor:()=>{const f=Qi(t);return{x:f.left,y:f.top+f.height+8}},getActions:()=>h,onHide:()=>{e.focus()},autoSelectFirstItem:!0})})}function Qne(o,e,t,i){return _p(this,void 0,void 0,function*(){const s=yield o.get($n).createModelReference(i.uri);yield t.invokeWithinContext(r=>_p(this,void 0,void 0,function*(){const a=e.hasSideBySideModifier,l=r.get(xe),c=zn.inPeekEditor.getValue(l),d=!a&&t.getOption(80)&&!c;return new m_({openToSide:a,openInPeek:d,muteMessage:!0},{alias:\"\",label:\"\",id:\"\",precondition:void 0}).run(r,t,{model:s.object.textEditorModel,position:L.getStartPosition(i.range)})})),s.dispose()})}var Jne=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Zh=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},eu=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class Kv{constructor(){this._entries=new bh(50)}get(e){const t=Kv._key(e);return this._entries.get(t)}set(e,t){const i=Kv._key(e);this._entries.set(i,t)}static _key(e){return`${e.uri.toString()}/${e.getVersionId()}`}}const e7=qe(\"IInlayHintsCache\");Xe(e7,Kv,!0);class xD{constructor(e,t){this.item=e,this.index=t}get part(){const e=this.item.hint.label;return typeof e==\"string\"?{label:e}:e[this.index]}}class ese{constructor(e,t){this.part=e,this.hasTriggerModifier=t}}let oh=class ID{constructor(e,t,i,n,s,r,a){this._editor=e,this._languageFeaturesService=t,this._inlayHintsCache=n,this._commandService=s,this._notificationService=r,this._instaService=a,this._disposables=new ee,this._sessionDisposables=new ee,this._decorationsMetadata=new Map,this._ruleFactory=new Gm(this._editor),this._activeRenderMode=0,this._debounceInfo=i.for(t.inlayHintsProvider,\"InlayHint\",{min:25}),this._disposables.add(t.inlayHintsProvider.onDidChange(()=>this._update())),this._disposables.add(e.onDidChangeModel(()=>this._update())),this._disposables.add(e.onDidChangeModelLanguage(()=>this._update())),this._disposables.add(e.onDidChangeConfiguration(l=>{l.hasChanged(129)&&this._update()})),this._update()}static get(e){var t;return(t=e.getContribution(ID.ID))!==null&&t!==void 0?t:void 0}dispose(){this._sessionDisposables.dispose(),this._removeAllDecorations(),this._disposables.dispose()}_update(){this._sessionDisposables.clear(),this._removeAllDecorations();const e=this._editor.getOption(129);if(e.enabled===\"off\")return;const t=this._editor.getModel();if(!t||!this._languageFeaturesService.inlayHintsProvider.has(t))return;const i=this._inlayHintsCache.get(t);i&&this._updateHintsDecorators([t.getFullModelRange()],i),this._sessionDisposables.add(ze(()=>{t.isDisposed()||this._cacheHintsForFastRestore(t)}));let n;const s=new Set,r=new ft(()=>eu(this,void 0,void 0,function*(){const a=Date.now();n==null||n.dispose(!0),n=new gn;const l=t.onWillDispose(()=>n==null?void 0:n.cancel());try{const c=n.token,d=yield xm.create(this._languageFeaturesService.inlayHintsProvider,t,this._getHintsRanges(),c);if(r.delay=this._debounceInfo.update(t,Date.now()-a),c.isCancellationRequested){d.dispose();return}for(const h of d.provider)typeof h.onDidChangeInlayHints==\"function\"&&!s.has(h)&&(s.add(h),this._sessionDisposables.add(h.onDidChangeInlayHints(()=>{r.isScheduled()||r.schedule()})));this._sessionDisposables.add(d),this._updateHintsDecorators(d.ranges,d.items),this._cacheHintsForFastRestore(t)}catch(c){Ee(c)}finally{n.dispose(),l.dispose()}}),this._debounceInfo.get(t));if(this._sessionDisposables.add(r),this._sessionDisposables.add(ze(()=>n==null?void 0:n.dispose(!0))),r.schedule(0),this._sessionDisposables.add(this._editor.onDidScrollChange(a=>{(a.scrollTopChanged||!r.isScheduled())&&r.schedule()})),this._sessionDisposables.add(this._editor.onDidChangeModelContent(a=>{const l=Math.max(r.delay,1250);r.schedule(l)})),e.enabled===\"on\")this._activeRenderMode=0;else{let a,l;e.enabled===\"onUnlessPressed\"?(a=0,l=1):(a=1,l=0),this._activeRenderMode=a,this._sessionDisposables.add(Rl.getInstance().event(c=>{if(!this._editor.hasModel())return;const d=c.altKey&&c.ctrlKey?l:a;if(d!==this._activeRenderMode){this._activeRenderMode=d;const h=this._editor.getModel(),u=this._copyInlayHintsWithCurrentAnchor(h);this._updateHintsDecorators([h.getFullModelRange()],u),r.schedule(0)}}))}this._sessionDisposables.add(this._installDblClickGesture(()=>r.schedule(0))),this._sessionDisposables.add(this._installLinkGesture()),this._sessionDisposables.add(this._installContextMenu())}_installLinkGesture(){const e=new ee,t=e.add(new CE(this._editor)),i=new ee;return e.add(i),e.add(t.onMouseMoveOrRelevantKeyDown(n=>{const[s]=n,r=this._getInlayHintLabelPart(s),a=this._editor.getModel();if(!r||!a){i.clear();return}const l=new gn;i.add(ze(()=>l.dispose(!0))),r.item.resolve(l.token),this._activeInlayHintPart=r.part.command||r.part.location?new ese(r,s.hasTriggerModifier):void 0;const c=r.item.hint.position.lineNumber,d=new L(c,1,c,a.getLineMaxColumn(c)),h=this._getInlineHintsForRange(d);this._updateHintsDecorators([d],h),i.add(ze(()=>{this._activeInlayHintPart=void 0,this._updateHintsDecorators([d],h)}))})),e.add(t.onCancel(()=>i.clear())),e.add(t.onExecute(n=>eu(this,void 0,void 0,function*(){const s=this._getInlayHintLabelPart(n);if(s){const r=s.part;r.location?this._instaService.invokeFunction(Qne,n,this._editor,r.location):Yy.is(r.command)&&(yield this._invokeCommand(r.command,s.item))}}))),e}_getInlineHintsForRange(e){const t=new Set;for(const i of this._decorationsMetadata.values())e.containsRange(i.item.anchor.range)&&t.add(i.item);return Array.from(t)}_installDblClickGesture(e){return this._editor.onMouseUp(t=>eu(this,void 0,void 0,function*(){if(t.event.detail!==2)return;const i=this._getInlayHintLabelPart(t);if(!!i&&(t.event.preventDefault(),yield i.item.resolve(We.None),en(i.item.hint.textEdits))){const n=i.item.hint.textEdits.map(s=>Pt.replace(L.lift(s.range),s.text));this._editor.executeEdits(\"inlayHint.default\",n),e()}}))}_installContextMenu(){return this._editor.onContextMenu(e=>eu(this,void 0,void 0,function*(){if(!(e.event.target instanceof HTMLElement))return;const t=this._getInlayHintLabelPart(e);t&&(yield this._instaService.invokeFunction(Xne,this._editor,e.event.target,t))}))}_getInlayHintLabelPart(e){var t;if(e.target.type!==6)return;const i=(t=e.target.detail.injectedText)===null||t===void 0?void 0:t.options;if(i instanceof $d&&(i==null?void 0:i.attachedData)instanceof xD)return i.attachedData}_invokeCommand(e,t){var i;return eu(this,void 0,void 0,function*(){try{yield this._commandService.executeCommand(e.id,...(i=e.arguments)!==null&&i!==void 0?i:[])}catch(n){this._notificationService.notify({severity:t5.Error,source:t.provider.displayName,message:n})}})}_cacheHintsForFastRestore(e){const t=this._copyInlayHintsWithCurrentAnchor(e);this._inlayHintsCache.set(e,t)}_copyInlayHintsWithCurrentAnchor(e){const t=new Map;for(const[i,n]of this._decorationsMetadata){if(t.has(n.item))continue;const s=e.getDecorationRange(i);if(s){const r=new J3(s,n.item.anchor.direction),a=n.item.with({anchor:r});t.set(n.item,a)}}return Array.from(t.values())}_getHintsRanges(){const t=this._editor.getModel(),i=this._editor.getVisibleRangesPlusViewportAboveBelow(),n=[];for(const s of i.sort(L.compareRangesUsingStarts)){const r=t.validateRange(new L(s.startLineNumber-30,s.startColumn,s.endLineNumber+30,s.endColumn));n.length===0||!L.areIntersectingOrTouching(n[n.length-1],r)?n.push(r):n[n.length-1]=L.plusRange(n[n.length-1],r)}return n}_updateHintsDecorators(e,t){var i,n;const s=[],r=(f,_,b,v,C)=>{const w={content:b,inlineClassNameAffectsLetterSpacing:!0,inlineClassName:_.className,cursorStops:v,attachedData:C};s.push({item:f,classNameRef:_,decoration:{range:f.anchor.range,options:{description:\"InlayHint\",showIfCollapsed:f.anchor.range.isEmpty(),collapseOnReplaceEdit:!f.anchor.range.isEmpty(),stickiness:0,[f.anchor.direction]:this._activeRenderMode===0?w:void 0}}})},a=(f,_)=>{const b=this._ruleFactory.createClassNameRef({width:`${l/3|0}px`,display:\"inline-block\"});r(f,b,\"\\u200A\",_?Bo.Right:Bo.None)},{fontSize:l,fontFamily:c,padding:d,isUniform:h}=this._getLayoutInfo(),u=\"--code-editorInlayHintsFontFamily\";this._editor.getContainerDomNode().style.setProperty(u,c);for(const f of t){f.hint.paddingLeft&&a(f,!1);const _=typeof f.hint.label==\"string\"?[{label:f.hint.label}]:f.hint.label;for(let b=0;b<_.length;b++){const v=_[b],C=b===0,w=b===_.length-1,S={fontSize:`${l}px`,fontFamily:`var(${u}), ${ns.fontFamily}`,verticalAlign:h?\"baseline\":\"middle\"};en(f.hint.textEdits)&&(S.cursor=\"default\"),this._fillInColors(S,f.hint),(v.command||v.location)&&((i=this._activeInlayHintPart)===null||i===void 0?void 0:i.part.item)===f&&this._activeInlayHintPart.part.index===b&&(S.textDecoration=\"underline\",this._activeInlayHintPart.hasTriggerModifier&&(S.color=Qt(vI),S.cursor=\"pointer\")),d&&(C&&w?(S.padding=`1px ${Math.max(1,l/4)|0}px`,S.borderRadius=`${l/4|0}px`):C?(S.padding=`1px 0 1px ${Math.max(1,l/4)|0}px`,S.borderRadius=`${l/4|0}px 0 0 ${l/4|0}px`):w?(S.padding=`1px ${Math.max(1,l/4)|0}px 1px 0`,S.borderRadius=`0 ${l/4|0}px ${l/4|0}px 0`):S.padding=\"1px 0 1px 0\"),r(f,this._ruleFactory.createClassNameRef(S),tse(v.label),w&&!f.hint.paddingRight?Bo.Right:Bo.None,new xD(f,b))}if(f.hint.paddingRight&&a(f,!0),s.length>ID._MAX_DECORATORS)break}const g=[];for(const f of e)for(const{id:_}of(n=this._editor.getDecorationsInRange(f))!==null&&n!==void 0?n:[]){const b=this._decorationsMetadata.get(_);b&&(g.push(_),b.classNameRef.dispose(),this._decorationsMetadata.delete(_))}this._editor.changeDecorations(f=>{const _=f.deltaDecorations(g,s.map(b=>b.decoration));for(let b=0;b<_.length;b++){const v=s[b];this._decorationsMetadata.set(_[b],v)}})}_fillInColors(e,t){t.kind===iv.Parameter?(e.backgroundColor=Qt(ZH),e.color=Qt(GH)):t.kind===iv.Type?(e.backgroundColor=Qt(qH),e.color=Qt(KH)):(e.backgroundColor=Qt(Va),e.color=Qt(Wa))}_getLayoutInfo(){const e=this._editor.getOption(129),t=e.padding,i=this._editor.getOption(48),n=this._editor.getOption(45);let s=e.fontSize;(!s||s<5||s>i)&&(s=i);const r=e.fontFamily||n;return{fontSize:s,fontFamily:r,padding:t,isUniform:!t&&r===n&&s===i}}_removeAllDecorations(){this._editor.removeDecorations(Array.from(this._decorationsMetadata.keys()));for(const e of this._decorationsMetadata.values())e.classNameRef.dispose();this._decorationsMetadata.clear()}};oh.ID=\"editor.contrib.InlayHints\";oh._MAX_DECORATORS=1500;oh=Jne([Zh(1,ue),Zh(2,Js),Zh(3,e7),Zh(4,Ci),Zh(5,gi),Zh(6,Re)],oh);function tse(o){const e=\"\\xA0\";return o.replace(/[ \\t]/g,e)}Ye.registerCommand(\"_executeInlayHintProvider\",(o,...e)=>eu(void 0,void 0,void 0,function*(){const[t,i]=e;gt(me.isUri(t)),gt(L.isIRange(i));const{inlayHintsProvider:n}=o.get(ue),s=yield o.get($n).createModelReference(t);try{const r=yield xm.create(n,s.object.textEditorModel,[L.lift(i)],We.None),a=r.items.map(l=>l.hint);return setTimeout(()=>r.dispose(),0),a}finally{s.dispose()}}));var ise=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},kf=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},TA=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})},nse=globalThis&&globalThis.__asyncValues||function(o){if(!Symbol.asyncIterator)throw new TypeError(\"Symbol.asyncIterator is not defined.\");var e=o[Symbol.asyncIterator],t;return e?e.call(o):(o=typeof __values==\"function\"?__values(o):o[Symbol.iterator](),t={},i(\"next\"),i(\"throw\"),i(\"return\"),t[Symbol.asyncIterator]=function(){return this},t);function i(s){t[s]=o[s]&&function(r){return new Promise(function(a,l){r=o[s](r),n(a,l,r.done,r.value)})}}function n(s,r,a,l){Promise.resolve(l).then(function(c){s({value:c,done:a})},r)}};class MA extends u0{constructor(e,t){super(10,t,e.item.anchor.range),this.part=e}}let ED=class extends Pv{constructor(e,t,i,n,s,r){super(e,t,i,n,r),this._resolverService=s,this.hoverOrdinal=6}suggestHoverAnchor(e){var t;if(!oh.get(this._editor)||e.target.type!==6)return null;const n=(t=e.target.detail.injectedText)===null||t===void 0?void 0:t.options;return n instanceof $d&&n.attachedData instanceof xD?new MA(n.attachedData,this):null}computeSync(){return[]}computeAsync(e,t,i){return e instanceof MA?new ni(n=>TA(this,void 0,void 0,function*(){var s,r;const{part:a}=e;if(yield a.item.resolve(i),i.isCancellationRequested)return;let l;typeof a.item.hint.tooltip==\"string\"?l=new Rn().appendText(a.item.hint.tooltip):a.item.hint.tooltip&&(l=a.item.hint.tooltip),l&&n.emitOne(new xr(this,e.range,[l],0)),en(a.item.hint.textEdits)&&n.emitOne(new xr(this,e.range,[new Rn().appendText(p(\"hint.dbl\",\"Double click to insert\"))],10001));let c;if(typeof a.part.tooltip==\"string\"?c=new Rn().appendText(a.part.tooltip):a.part.tooltip&&(c=a.part.tooltip),c&&n.emitOne(new xr(this,e.range,[c],1)),a.part.location||a.part.command){let g;const _=this._editor.getOption(72)===\"altKey\"?Ze?p(\"links.navigate.kb.meta.mac\",\"cmd + click\"):p(\"links.navigate.kb.meta\",\"ctrl + click\"):Ze?p(\"links.navigate.kb.alt.mac\",\"option + click\"):p(\"links.navigate.kb.alt\",\"alt + click\");a.part.location&&a.part.command?g=new Rn().appendText(p(\"hint.defAndCommand\",\"Go to Definition ({0}), right click for more\",_)):a.part.location?g=new Rn().appendText(p(\"hint.def\",\"Go to Definition ({0})\",_)):a.part.command&&(g=new Rn(`[${p(\"hint.cmd\",\"Execute Command\")}](${Yne(a.part.command)} \"${a.part.command.title}\") (${_})`,{isTrusted:!0})),g&&n.emitOne(new xr(this,e.range,[g],1e4))}const d=yield this._resolveInlayHintLabelPartHover(a,i);try{for(var h=nse(d),u;u=yield h.next(),!u.done;){const g=u.value;n.emitOne(g)}}catch(g){s={error:g}}finally{try{u&&!u.done&&(r=h.return)&&(yield r.call(h))}finally{if(s)throw s.error}}})):ni.EMPTY}_resolveInlayHintLabelPartHover(e,t){return TA(this,void 0,void 0,function*(){if(!e.part.location)return ni.EMPTY;const{uri:i,range:n}=e.part.location,s=yield this._resolverService.createModelReference(i);try{const r=s.object.textEditorModel;return this._languageFeaturesService.hoverProvider.has(r)?XE(this._languageFeaturesService.hoverProvider,r,new B(n.startLineNumber,n.startColumn),t).filter(a=>!pg(a.hover.contents)).map(a=>new xr(this,e.item.anchor.range,a.hover.contents,2+a.ordinal)):ni.EMPTY}finally{s.dispose()}})}};ED=ise([kf(1,Ht),kf(2,So),kf(3,ot),kf(4,$n),kf(5,ue)],ED);rt(oh.ID,oh);xh.register(ED);class sse{constructor(e,t,i){this._editRange=e,this._originalSelection=t,this._text=i}getEditOperations(e,t){t.addTrackedEditOperation(this._editRange,this._text)}computeCursorState(e,t){const n=t.getInverseEditOperations()[0].range;return this._originalSelection.isEmpty()?new oe(n.endLineNumber,Math.min(this._originalSelection.positionColumn,n.endColumn),n.endLineNumber,Math.min(this._originalSelection.positionColumn,n.endColumn)):new oe(n.endLineNumber,n.endColumn-this._text.length,n.endLineNumber,n.endColumn)}}var ose=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},rse=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let Cc=class ND{constructor(e,t){this.editor=e,this.editorWorkerService=t,this.decorations=this.editor.createDecorationsCollection()}static get(e){return e.getContribution(ND.ID)}dispose(){}run(e,t){this.currentRequest&&this.currentRequest.cancel();const i=this.editor.getSelection(),n=this.editor.getModel();if(!n||!i)return;let s=i;if(s.startLineNumber!==s.endLineNumber)return;const r=new om(this.editor,5),a=n.uri;return this.editorWorkerService.canNavigateValueSet(a)?(this.currentRequest=Ti(l=>this.editorWorkerService.navigateValueSet(a,s,t)),this.currentRequest.then(l=>{if(!l||!l.range||!l.value||!r.validate(this.editor))return;const c=L.lift(l.range);let d=l.range;const h=l.value.length-(s.endColumn-s.startColumn);d={startLineNumber:d.startLineNumber,startColumn:d.startColumn,endLineNumber:d.endLineNumber,endColumn:d.startColumn+l.value.length},h>1&&(s=new oe(s.startLineNumber,s.startColumn,s.endLineNumber,s.endColumn+h-1));const u=new sse(c,s,l.value);this.editor.pushUndoStop(),this.editor.executeCommand(e,u),this.editor.pushUndoStop(),this.decorations.set([{range:d,options:ND.DECORATION}]),this.decorationRemover&&this.decorationRemover.cancel(),this.decorationRemover=Vd(350),this.decorationRemover.then(()=>this.decorations.clear()).catch(Ee)}).catch(Ee)):Promise.resolve(void 0)}};Cc.ID=\"editor.contrib.inPlaceReplaceController\";Cc.DECORATION=Ie.register({description:\"in-place-replace\",className:\"valueSetReplacement\"});Cc=ose([rse(1,Qs)],Cc);class ase extends he{constructor(){super({id:\"editor.action.inPlaceReplace.up\",label:p(\"InPlaceReplaceAction.previous.label\",\"Replace with Previous Value\"),alias:\"Replace with Previous Value\",precondition:T.writable,kbOpts:{kbExpr:T.editorTextFocus,primary:3154,weight:100}})}run(e,t){const i=Cc.get(t);return i?i.run(this.id,!0):Promise.resolve(void 0)}}class lse extends he{constructor(){super({id:\"editor.action.inPlaceReplace.down\",label:p(\"InPlaceReplaceAction.next.label\",\"Replace with Next Value\"),alias:\"Replace with Next Value\",precondition:T.writable,kbOpts:{kbExpr:T.editorTextFocus,primary:3156,weight:100}})}run(e,t){const i=Cc.get(t);return i?i.run(this.id,!1):Promise.resolve(void 0)}}rt(Cc.ID,Cc);te(ase);te(lse);Rt((o,e)=>{const t=o.getColor(g4);t&&e.addRule(`.monaco-editor.vs .valueSetReplacement { outline: solid 2px ${t}; }`)});class cse extends he{constructor(){super({id:\"expandLineSelection\",label:p(\"expandLineSelection\",\"Expand Line Selection\"),alias:\"Expand Line Selection\",precondition:void 0,kbOpts:{weight:0,kbExpr:T.textInputFocus,primary:2090}})}run(e,t,i){if(i=i||{},!t.hasModel())return;const n=t._getViewModel();n.model.pushStackElement(),n.setCursorStates(i.source,3,Pi.expandLineSelection(n,n.getCursorStates())),n.revealPrimaryCursor(i.source,!0)}}te(cse);class dse{constructor(e,t){this._selection=e,this._cursors=t,this._selectionId=null}getEditOperations(e,t){const i=hse(e,this._cursors);for(let n=0,s=i.length;n<s;n++){const r=i[n];t.addEditOperation(r.range,r.text)}this._selectionId=t.trackSelection(this._selection)}computeCursorState(e,t){return t.getTrackedSelection(this._selectionId)}}function hse(o,e){e.sort((r,a)=>r.lineNumber===a.lineNumber?r.column-a.column:r.lineNumber-a.lineNumber);for(let r=e.length-2;r>=0;r--)e[r].lineNumber===e[r+1].lineNumber&&e.splice(r,1);const t=[];let i=0,n=0;const s=e.length;for(let r=1,a=o.getLineCount();r<=a;r++){const l=o.getLineContent(r),c=l.length+1;let d=0;if(n<s&&e[n].lineNumber===r&&(d=e[n].column,n++,d===c)||l.length===0)continue;const h=Fr(l);let u=0;if(h===-1)u=1;else if(h!==l.length-1)u=h+2;else continue;u=Math.max(d,u),t[i++]=Pt.delete(new L(r,u,r,c))}return t}class t7{constructor(e,t,i){this._selection=e,this._isCopyingDown=t,this._noop=i||!1,this._selectionDirection=0,this._selectionId=null,this._startLineNumberDelta=0,this._endLineNumberDelta=0}getEditOperations(e,t){let i=this._selection;this._startLineNumberDelta=0,this._endLineNumberDelta=0,i.startLineNumber<i.endLineNumber&&i.endColumn===1&&(this._endLineNumberDelta=1,i=i.setEndPosition(i.endLineNumber-1,e.getLineMaxColumn(i.endLineNumber-1)));const n=[];for(let r=i.startLineNumber;r<=i.endLineNumber;r++)n.push(e.getLineContent(r));const s=n.join(`\n`);s===\"\"&&this._isCopyingDown&&(this._startLineNumberDelta++,this._endLineNumberDelta++),this._noop?t.addEditOperation(new L(i.endLineNumber,e.getLineMaxColumn(i.endLineNumber),i.endLineNumber+1,1),i.endLineNumber===e.getLineCount()?\"\":`\n`):this._isCopyingDown?t.addEditOperation(new L(i.startLineNumber,1,i.startLineNumber,1),s+`\n`):t.addEditOperation(new L(i.endLineNumber,e.getLineMaxColumn(i.endLineNumber),i.endLineNumber,e.getLineMaxColumn(i.endLineNumber)),`\n`+s),this._selectionId=t.trackSelection(i),this._selectionDirection=this._selection.getDirection()}computeCursorState(e,t){let i=t.getTrackedSelection(this._selectionId);if(this._startLineNumberDelta!==0||this._endLineNumberDelta!==0){let n=i.startLineNumber,s=i.startColumn,r=i.endLineNumber,a=i.endColumn;this._startLineNumberDelta!==0&&(n=n+this._startLineNumberDelta,s=1),this._endLineNumberDelta!==0&&(r=r+this._endLineNumberDelta,a=1),i=oe.createWithDirection(n,s,r,a,this._selectionDirection)}return i}}var use=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},gse=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let TD=class{constructor(e,t,i,n){this._languageConfigurationService=n,this._selection=e,this._isMovingDown=t,this._autoIndent=i,this._selectionId=null,this._moveEndLineSelectionShrink=!1}getEditOperations(e,t){const i=e.getLineCount();if(this._isMovingDown&&this._selection.endLineNumber===i){this._selectionId=t.trackSelection(this._selection);return}if(!this._isMovingDown&&this._selection.startLineNumber===1){this._selectionId=t.trackSelection(this._selection);return}this._moveEndPositionDown=!1;let n=this._selection;n.startLineNumber<n.endLineNumber&&n.endColumn===1&&(this._moveEndPositionDown=!0,n=n.setEndPosition(n.endLineNumber-1,e.getLineMaxColumn(n.endLineNumber-1)));const{tabSize:s,indentSize:r,insertSpaces:a}=e.getOptions(),l=this.buildIndentConverter(s,r,a),c={tokenization:{getLineTokens:d=>e.tokenization.getLineTokens(d),getLanguageId:()=>e.getLanguageId(),getLanguageIdAtPosition:(d,h)=>e.getLanguageIdAtPosition(d,h)},getLineContent:null};if(n.startLineNumber===n.endLineNumber&&e.getLineMaxColumn(n.startLineNumber)===1){const d=n.startLineNumber,h=this._isMovingDown?d+1:d-1;e.getLineMaxColumn(h)===1?t.addEditOperation(new L(1,1,1,1),null):(t.addEditOperation(new L(d,1,d,1),e.getLineContent(h)),t.addEditOperation(new L(h,1,h,e.getLineMaxColumn(h)),null)),n=new oe(h,1,h,1)}else{let d,h;if(this._isMovingDown){d=n.endLineNumber+1,h=e.getLineContent(d),t.addEditOperation(new L(d-1,e.getLineMaxColumn(d-1),d,e.getLineMaxColumn(d)),null);let u=h;if(this.shouldAutoIndent(e,n)){const g=this.matchEnterRule(e,l,s,d,n.startLineNumber-1);if(g!==null){const _=pt(e.getLineContent(d)),b=g+Kn(_,s);u=mp(b,s,a)+this.trimLeft(h)}else{c.getLineContent=b=>b===n.startLineNumber?e.getLineContent(d):e.getLineContent(b);const _=Qf(this._autoIndent,c,e.getLanguageIdAtPosition(d,1),n.startLineNumber,l,this._languageConfigurationService);if(_!==null){const b=pt(e.getLineContent(d)),v=Kn(_,s),C=Kn(b,s);v!==C&&(u=mp(v,s,a)+this.trimLeft(h))}}t.addEditOperation(new L(n.startLineNumber,1,n.startLineNumber,1),u+`\n`);const f=this.matchEnterRuleMovingDown(e,l,s,n.startLineNumber,d,u);if(f!==null)f!==0&&this.getIndentEditsOfMovingBlock(e,t,n,s,a,f);else{c.getLineContent=b=>b===n.startLineNumber?u:b>=n.startLineNumber+1&&b<=n.endLineNumber+1?e.getLineContent(b-1):e.getLineContent(b);const _=Qf(this._autoIndent,c,e.getLanguageIdAtPosition(d,1),n.startLineNumber+1,l,this._languageConfigurationService);if(_!==null){const b=pt(e.getLineContent(n.startLineNumber)),v=Kn(_,s),C=Kn(b,s);if(v!==C){const w=v-C;this.getIndentEditsOfMovingBlock(e,t,n,s,a,w)}}}}else t.addEditOperation(new L(n.startLineNumber,1,n.startLineNumber,1),u+`\n`)}else if(d=n.startLineNumber-1,h=e.getLineContent(d),t.addEditOperation(new L(d,1,d+1,1),null),t.addEditOperation(new L(n.endLineNumber,e.getLineMaxColumn(n.endLineNumber),n.endLineNumber,e.getLineMaxColumn(n.endLineNumber)),`\n`+h),this.shouldAutoIndent(e,n)){c.getLineContent=g=>g===d?e.getLineContent(n.startLineNumber):e.getLineContent(g);const u=this.matchEnterRule(e,l,s,n.startLineNumber,n.startLineNumber-2);if(u!==null)u!==0&&this.getIndentEditsOfMovingBlock(e,t,n,s,a,u);else{const g=Qf(this._autoIndent,c,e.getLanguageIdAtPosition(n.startLineNumber,1),d,l,this._languageConfigurationService);if(g!==null){const f=pt(e.getLineContent(n.startLineNumber)),_=Kn(g,s),b=Kn(f,s);if(_!==b){const v=_-b;this.getIndentEditsOfMovingBlock(e,t,n,s,a,v)}}}}}this._selectionId=t.trackSelection(n)}buildIndentConverter(e,t,i){return{shiftIndent:n=>Fs.shiftIndent(n,n.length+1,e,t,i),unshiftIndent:n=>Fs.unshiftIndent(n,n.length+1,e,t,i)}}parseEnterResult(e,t,i,n,s){if(s){let r=s.indentation;s.indentAction===oi.None||s.indentAction===oi.Indent?r=s.indentation+s.appendText:s.indentAction===oi.IndentOutdent?r=s.indentation:s.indentAction===oi.Outdent&&(r=t.unshiftIndent(s.indentation)+s.appendText);const a=e.getLineContent(n);if(this.trimLeft(a).indexOf(this.trimLeft(r))>=0){const l=pt(e.getLineContent(n));let c=pt(r);const d=RP(e,n,this._languageConfigurationService);d!==null&&d&2&&(c=t.unshiftIndent(c));const h=Kn(c,i),u=Kn(l,i);return h-u}}return null}matchEnterRuleMovingDown(e,t,i,n,s,r){if(Fr(r)>=0){const a=e.getLineMaxColumn(s),l=Nu(this._autoIndent,e,new L(s,a,s,a),this._languageConfigurationService);return this.parseEnterResult(e,t,i,n,l)}else{let a=n-1;for(;a>=1;){const d=e.getLineContent(a);if(Fr(d)>=0)break;a--}if(a<1||n>e.getLineCount())return null;const l=e.getLineMaxColumn(a),c=Nu(this._autoIndent,e,new L(a,l,a,l),this._languageConfigurationService);return this.parseEnterResult(e,t,i,n,c)}}matchEnterRule(e,t,i,n,s,r){let a=s;for(;a>=1;){let d;if(a===s&&r!==void 0?d=r:d=e.getLineContent(a),Fr(d)>=0)break;a--}if(a<1||n>e.getLineCount())return null;const l=e.getLineMaxColumn(a),c=Nu(this._autoIndent,e,new L(a,l,a,l),this._languageConfigurationService);return this.parseEnterResult(e,t,i,n,c)}trimLeft(e){return e.replace(/^\\s+/,\"\")}shouldAutoIndent(e,t){if(this._autoIndent<4||!e.tokenization.isCheapToTokenize(t.startLineNumber))return!1;const i=e.getLanguageIdAtPosition(t.startLineNumber,1),n=e.getLanguageIdAtPosition(t.endLineNumber,1);return!(i!==n||this._languageConfigurationService.getLanguageConfiguration(i).indentRulesSupport===null)}getIndentEditsOfMovingBlock(e,t,i,n,s,r){for(let a=i.startLineNumber;a<=i.endLineNumber;a++){const l=e.getLineContent(a),c=pt(l),h=Kn(c,n)+r,u=mp(h,n,s);u!==c&&(t.addEditOperation(new L(a,1,a,c.length+1),u),a===i.endLineNumber&&i.endColumn<=c.length+1&&u===\"\"&&(this._moveEndLineSelectionShrink=!0))}}computeCursorState(e,t){let i=t.getTrackedSelection(this._selectionId);return this._moveEndPositionDown&&(i=i.setEndPosition(i.endLineNumber+1,1)),this._moveEndLineSelectionShrink&&i.startLineNumber<i.endLineNumber&&(i=i.setEndPosition(i.endLineNumber,2)),i}};TD=use([gse(3,ti)],TD);class Jl{constructor(e,t){this.selection=e,this.descending=t,this.selectionId=null}static getCollator(){return Jl._COLLATOR||(Jl._COLLATOR=new Intl.Collator),Jl._COLLATOR}getEditOperations(e,t){const i=fse(e,this.selection,this.descending);i&&t.addEditOperation(i.range,i.text),this.selectionId=t.trackSelection(this.selection)}computeCursorState(e,t){return t.getTrackedSelection(this.selectionId)}static canRun(e,t,i){if(e===null)return!1;const n=i7(e,t,i);if(!n)return!1;for(let s=0,r=n.before.length;s<r;s++)if(n.before[s]!==n.after[s])return!0;return!1}}Jl._COLLATOR=null;function i7(o,e,t){const i=e.startLineNumber;let n=e.endLineNumber;if(e.endColumn===1&&n--,i>=n)return null;const s=[];for(let a=i;a<=n;a++)s.push(o.getLineContent(a));let r=s.slice(0);return r.sort(Jl.getCollator().compare),t===!0&&(r=r.reverse()),{startLineNumber:i,endLineNumber:n,before:s,after:r}}function fse(o,e,t){const i=i7(o,e,t);return i?Pt.replace(new L(i.startLineNumber,1,i.endLineNumber,o.getLineMaxColumn(i.endLineNumber)),i.after.join(`\n`)):null}class n7 extends he{constructor(e,t){super(t),this.down=e}run(e,t){if(!t.hasModel())return;const i=t.getSelections().map((r,a)=>({selection:r,index:a,ignore:!1}));i.sort((r,a)=>L.compareRangesUsingStarts(r.selection,a.selection));let n=i[0];for(let r=1;r<i.length;r++){const a=i[r];n.selection.endLineNumber===a.selection.startLineNumber&&(n.index<a.index?a.ignore=!0:(n.ignore=!0,n=a))}const s=[];for(const r of i)s.push(new t7(r.selection,this.down,r.ignore));t.pushUndoStop(),t.executeCommands(this.id,s),t.pushUndoStop()}}class pse extends n7{constructor(){super(!1,{id:\"editor.action.copyLinesUpAction\",label:p(\"lines.copyUp\",\"Copy Line Up\"),alias:\"Copy Line Up\",precondition:T.writable,kbOpts:{kbExpr:T.editorTextFocus,primary:1552,linux:{primary:3600},weight:100},menuOpts:{menuId:A.MenubarSelectionMenu,group:\"2_line\",title:p({key:\"miCopyLinesUp\",comment:[\"&& denotes a mnemonic\"]},\"&&Copy Line Up\"),order:1}})}}class mse extends n7{constructor(){super(!0,{id:\"editor.action.copyLinesDownAction\",label:p(\"lines.copyDown\",\"Copy Line Down\"),alias:\"Copy Line Down\",precondition:T.writable,kbOpts:{kbExpr:T.editorTextFocus,primary:1554,linux:{primary:3602},weight:100},menuOpts:{menuId:A.MenubarSelectionMenu,group:\"2_line\",title:p({key:\"miCopyLinesDown\",comment:[\"&& denotes a mnemonic\"]},\"Co&&py Line Down\"),order:2}})}}class _se extends he{constructor(){super({id:\"editor.action.duplicateSelection\",label:p(\"duplicateSelection\",\"Duplicate Selection\"),alias:\"Duplicate Selection\",precondition:T.writable,menuOpts:{menuId:A.MenubarSelectionMenu,group:\"2_line\",title:p({key:\"miDuplicateSelection\",comment:[\"&& denotes a mnemonic\"]},\"&&Duplicate Selection\"),order:5}})}run(e,t,i){if(!t.hasModel())return;const n=[],s=t.getSelections(),r=t.getModel();for(const a of s)if(a.isEmpty())n.push(new t7(a,!0));else{const l=new oe(a.endLineNumber,a.endColumn,a.endLineNumber,a.endColumn);n.push(new lW(l,r.getValueInRange(a)))}t.pushUndoStop(),t.executeCommands(this.id,n),t.pushUndoStop()}}class s7 extends he{constructor(e,t){super(t),this.down=e}run(e,t){const i=e.get(ti),n=[],s=t.getSelections()||[],r=t.getOption(9);for(const a of s)n.push(new TD(a,this.down,r,i));t.pushUndoStop(),t.executeCommands(this.id,n),t.pushUndoStop()}}class bse extends s7{constructor(){super(!1,{id:\"editor.action.moveLinesUpAction\",label:p(\"lines.moveUp\",\"Move Line Up\"),alias:\"Move Line Up\",precondition:T.writable,kbOpts:{kbExpr:T.editorTextFocus,primary:528,linux:{primary:528},weight:100},menuOpts:{menuId:A.MenubarSelectionMenu,group:\"2_line\",title:p({key:\"miMoveLinesUp\",comment:[\"&& denotes a mnemonic\"]},\"Mo&&ve Line Up\"),order:3}})}}class vse extends s7{constructor(){super(!0,{id:\"editor.action.moveLinesDownAction\",label:p(\"lines.moveDown\",\"Move Line Down\"),alias:\"Move Line Down\",precondition:T.writable,kbOpts:{kbExpr:T.editorTextFocus,primary:530,linux:{primary:530},weight:100},menuOpts:{menuId:A.MenubarSelectionMenu,group:\"2_line\",title:p({key:\"miMoveLinesDown\",comment:[\"&& denotes a mnemonic\"]},\"Move &&Line Down\"),order:4}})}}class o7 extends he{constructor(e,t){super(t),this.descending=e}run(e,t){const i=t.getSelections()||[];for(const s of i)if(!Jl.canRun(t.getModel(),s,this.descending))return;const n=[];for(let s=0,r=i.length;s<r;s++)n[s]=new Jl(i[s],this.descending);t.pushUndoStop(),t.executeCommands(this.id,n),t.pushUndoStop()}}class Cse extends o7{constructor(){super(!1,{id:\"editor.action.sortLinesAscending\",label:p(\"lines.sortAscending\",\"Sort Lines Ascending\"),alias:\"Sort Lines Ascending\",precondition:T.writable})}}class wse extends o7{constructor(){super(!0,{id:\"editor.action.sortLinesDescending\",label:p(\"lines.sortDescending\",\"Sort Lines Descending\"),alias:\"Sort Lines Descending\",precondition:T.writable})}}class Sse extends he{constructor(){super({id:\"editor.action.removeDuplicateLines\",label:p(\"lines.deleteDuplicates\",\"Delete Duplicate Lines\"),alias:\"Delete Duplicate Lines\",precondition:T.writable})}run(e,t){if(!t.hasModel())return;const i=t.getModel();if(i.getLineCount()===1&&i.getLineMaxColumn(1)===1)return;const n=[],s=[];let r=0;for(const a of t.getSelections()){const l=new Set,c=[];for(let g=a.startLineNumber;g<=a.endLineNumber;g++){const f=i.getLineContent(g);l.has(f)||(c.push(f),l.add(f))}const d=new oe(a.startLineNumber,1,a.endLineNumber,i.getLineMaxColumn(a.endLineNumber)),h=a.startLineNumber-r,u=new oe(h,1,h+c.length-1,c[c.length-1].length);n.push(Pt.replace(d,c.join(`\n`))),s.push(u),r+=a.endLineNumber-a.startLineNumber+1-c.length}t.pushUndoStop(),t.executeEdits(this.id,n,s),t.pushUndoStop()}}class q1 extends he{constructor(){super({id:q1.ID,label:p(\"lines.trimTrailingWhitespace\",\"Trim Trailing Whitespace\"),alias:\"Trim Trailing Whitespace\",precondition:T.writable,kbOpts:{kbExpr:T.editorTextFocus,primary:vi(2089,2102),weight:100}})}run(e,t,i){let n=[];i.reason===\"auto-save\"&&(n=(t.getSelections()||[]).map(a=>new B(a.positionLineNumber,a.positionColumn)));const s=t.getSelection();if(s===null)return;const r=new dse(s,n);t.pushUndoStop(),t.executeCommands(this.id,[r]),t.pushUndoStop()}}q1.ID=\"editor.action.trimTrailingWhitespace\";class yse extends he{constructor(){super({id:\"editor.action.deleteLines\",label:p(\"lines.delete\",\"Delete Line\"),alias:\"Delete Line\",precondition:T.writable,kbOpts:{kbExpr:T.textInputFocus,primary:3113,weight:100}})}run(e,t){if(!t.hasModel())return;const i=this._getLinesToRemove(t),n=t.getModel();if(n.getLineCount()===1&&n.getLineMaxColumn(1)===1)return;let s=0;const r=[],a=[];for(let l=0,c=i.length;l<c;l++){const d=i[l];let h=d.startLineNumber,u=d.endLineNumber,g=1,f=n.getLineMaxColumn(u);u<n.getLineCount()?(u+=1,f=1):h>1&&(h-=1,g=n.getLineMaxColumn(h)),r.push(Pt.replace(new oe(h,g,u,f),\"\")),a.push(new oe(h-s,d.positionColumn,h-s,d.positionColumn)),s+=d.endLineNumber-d.startLineNumber+1}t.pushUndoStop(),t.executeEdits(this.id,r,a),t.pushUndoStop()}_getLinesToRemove(e){const t=e.getSelections().map(s=>{let r=s.endLineNumber;return s.startLineNumber<s.endLineNumber&&s.endColumn===1&&(r-=1),{startLineNumber:s.startLineNumber,selectionStartColumn:s.selectionStartColumn,endLineNumber:r,positionColumn:s.positionColumn}});t.sort((s,r)=>s.startLineNumber===r.startLineNumber?s.endLineNumber-r.endLineNumber:s.startLineNumber-r.startLineNumber);const i=[];let n=t[0];for(let s=1;s<t.length;s++)n.endLineNumber+1>=t[s].startLineNumber?n.endLineNumber=t[s].endLineNumber:(i.push(n),n=t[s]);return i.push(n),i}}class Lse extends he{constructor(){super({id:\"editor.action.indentLines\",label:p(\"lines.indent\",\"Indent Line\"),alias:\"Indent Line\",precondition:T.writable,kbOpts:{kbExpr:T.editorTextFocus,primary:2137,weight:100}})}run(e,t){const i=t._getViewModel();!i||(t.pushUndoStop(),t.executeCommands(this.id,Ot.indent(i.cursorConfig,t.getModel(),t.getSelections())),t.pushUndoStop())}}class Dse extends he{constructor(){super({id:\"editor.action.outdentLines\",label:p(\"lines.outdent\",\"Outdent Line\"),alias:\"Outdent Line\",precondition:T.writable,kbOpts:{kbExpr:T.editorTextFocus,primary:2135,weight:100}})}run(e,t){Tu.Outdent.runEditorCommand(e,t,null)}}class kse extends he{constructor(){super({id:\"editor.action.insertLineBefore\",label:p(\"lines.insertBefore\",\"Insert Line Above\"),alias:\"Insert Line Above\",precondition:T.writable,kbOpts:{kbExpr:T.editorTextFocus,primary:3075,weight:100}})}run(e,t){const i=t._getViewModel();!i||(t.pushUndoStop(),t.executeCommands(this.id,Ot.lineInsertBefore(i.cursorConfig,t.getModel(),t.getSelections())))}}class xse extends he{constructor(){super({id:\"editor.action.insertLineAfter\",label:p(\"lines.insertAfter\",\"Insert Line Below\"),alias:\"Insert Line Below\",precondition:T.writable,kbOpts:{kbExpr:T.editorTextFocus,primary:2051,weight:100}})}run(e,t){const i=t._getViewModel();!i||(t.pushUndoStop(),t.executeCommands(this.id,Ot.lineInsertAfter(i.cursorConfig,t.getModel(),t.getSelections())))}}class r7 extends he{run(e,t){if(!t.hasModel())return;const i=t.getSelection(),n=this._getRangesToDelete(t),s=[];for(let l=0,c=n.length-1;l<c;l++){const d=n[l],h=n[l+1];L.intersectRanges(d,h)===null?s.push(d):n[l+1]=L.plusRange(d,h)}s.push(n[n.length-1]);const r=this._getEndCursorState(i,s),a=s.map(l=>Pt.replace(l,\"\"));t.pushUndoStop(),t.executeEdits(this.id,a,r),t.pushUndoStop()}}class Ise extends r7{constructor(){super({id:\"deleteAllLeft\",label:p(\"lines.deleteAllLeft\",\"Delete All Left\"),alias:\"Delete All Left\",precondition:T.writable,kbOpts:{kbExpr:T.textInputFocus,primary:0,mac:{primary:2049},weight:100}})}_getEndCursorState(e,t){let i=null;const n=[];let s=0;return t.forEach(r=>{let a;if(r.endColumn===1&&s>0){const l=r.startLineNumber-s;a=new oe(l,r.startColumn,l,r.startColumn)}else a=new oe(r.startLineNumber,r.startColumn,r.startLineNumber,r.startColumn);s+=r.endLineNumber-r.startLineNumber,r.intersectRanges(e)?i=a:n.push(a)}),i&&n.unshift(i),n}_getRangesToDelete(e){const t=e.getSelections();if(t===null)return[];let i=t;const n=e.getModel();return n===null?[]:(i.sort(L.compareRangesUsingStarts),i=i.map(s=>{if(s.isEmpty())if(s.startColumn===1){const r=Math.max(1,s.startLineNumber-1),a=s.startLineNumber===1?1:n.getLineContent(r).length+1;return new L(r,a,s.startLineNumber,1)}else return new L(s.startLineNumber,1,s.startLineNumber,s.startColumn);else return new L(s.startLineNumber,1,s.endLineNumber,s.endColumn)}),i)}}class Ese extends r7{constructor(){super({id:\"deleteAllRight\",label:p(\"lines.deleteAllRight\",\"Delete All Right\"),alias:\"Delete All Right\",precondition:T.writable,kbOpts:{kbExpr:T.textInputFocus,primary:0,mac:{primary:297,secondary:[2068]},weight:100}})}_getEndCursorState(e,t){let i=null;const n=[];for(let s=0,r=t.length,a=0;s<r;s++){const l=t[s],c=new oe(l.startLineNumber-a,l.startColumn,l.startLineNumber-a,l.startColumn);l.intersectRanges(e)?i=c:n.push(c)}return i&&n.unshift(i),n}_getRangesToDelete(e){const t=e.getModel();if(t===null)return[];const i=e.getSelections();if(i===null)return[];const n=i.map(s=>{if(s.isEmpty()){const r=t.getLineMaxColumn(s.startLineNumber);return s.startColumn===r?new L(s.startLineNumber,s.startColumn,s.startLineNumber+1,1):new L(s.startLineNumber,s.startColumn,s.startLineNumber,r)}return s});return n.sort(L.compareRangesUsingStarts),n}}class Nse extends he{constructor(){super({id:\"editor.action.joinLines\",label:p(\"lines.joinLines\",\"Join Lines\"),alias:\"Join Lines\",precondition:T.writable,kbOpts:{kbExpr:T.editorTextFocus,primary:0,mac:{primary:296},weight:100}})}run(e,t){const i=t.getSelections();if(i===null)return;let n=t.getSelection();if(n===null)return;i.sort(L.compareRangesUsingStarts);const s=[],r=i.reduce((u,g)=>u.isEmpty()?u.endLineNumber===g.startLineNumber?(n.equalsSelection(u)&&(n=g),g):g.startLineNumber>u.endLineNumber+1?(s.push(u),g):new oe(u.startLineNumber,u.startColumn,g.endLineNumber,g.endColumn):g.startLineNumber>u.endLineNumber?(s.push(u),g):new oe(u.startLineNumber,u.startColumn,g.endLineNumber,g.endColumn));s.push(r);const a=t.getModel();if(a===null)return;const l=[],c=[];let d=n,h=0;for(let u=0,g=s.length;u<g;u++){const f=s[u],_=f.startLineNumber,b=1;let v=0,C,w;const S=a.getLineContent(f.endLineNumber).length-f.endColumn;if(f.isEmpty()||f.startLineNumber===f.endLineNumber){const y=f.getStartPosition();y.lineNumber<a.getLineCount()?(C=_+1,w=a.getLineMaxColumn(C)):(C=y.lineNumber,w=a.getLineMaxColumn(y.lineNumber))}else C=f.endLineNumber,w=a.getLineMaxColumn(C);let k=a.getLineContent(_);for(let y=_+1;y<=C;y++){const D=a.getLineContent(y),I=a.getLineFirstNonWhitespaceColumn(y);if(I>=1){let R=!0;k===\"\"&&(R=!1),R&&(k.charAt(k.length-1)===\" \"||k.charAt(k.length-1)===\"\t\")&&(R=!1,k=k.replace(/[\\s\\uFEFF\\xA0]+$/g,\" \"));const P=D.substr(I-1);k+=(R?\" \":\"\")+P,R?v=P.length+1:v=P.length}else v=0}const x=new L(_,b,C,w);if(!x.isEmpty()){let y;f.isEmpty()?(l.push(Pt.replace(x,k)),y=new oe(x.startLineNumber-h,k.length-v+1,_-h,k.length-v+1)):f.startLineNumber===f.endLineNumber?(l.push(Pt.replace(x,k)),y=new oe(f.startLineNumber-h,f.startColumn,f.endLineNumber-h,f.endColumn)):(l.push(Pt.replace(x,k)),y=new oe(f.startLineNumber-h,f.startColumn,f.startLineNumber-h,k.length-S)),L.intersectRanges(x,n)!==null?d=y:c.push(y)}h+=x.endLineNumber-x.startLineNumber}c.unshift(d),t.pushUndoStop(),t.executeEdits(this.id,l,c),t.pushUndoStop()}}class Tse extends he{constructor(){super({id:\"editor.action.transpose\",label:p(\"editor.transpose\",\"Transpose characters around the cursor\"),alias:\"Transpose characters around the cursor\",precondition:T.writable})}run(e,t){const i=t.getSelections();if(i===null)return;const n=t.getModel();if(n===null)return;const s=[];for(let r=0,a=i.length;r<a;r++){const l=i[r];if(!l.isEmpty())continue;const c=l.getStartPosition(),d=n.getLineMaxColumn(c.lineNumber);if(c.column>=d){if(c.lineNumber===n.getLineCount())continue;const h=new L(c.lineNumber,Math.max(1,c.column-1),c.lineNumber+1,1),u=n.getValueInRange(h).split(\"\").reverse().join(\"\");s.push(new Wi(new oe(c.lineNumber,Math.max(1,c.column-1),c.lineNumber+1,1),u))}else{const h=new L(c.lineNumber,Math.max(1,c.column-1),c.lineNumber,c.column+1),u=n.getValueInRange(h).split(\"\").reverse().join(\"\");s.push(new Jx(h,u,new oe(c.lineNumber,c.column+1,c.lineNumber,c.column+1)))}}t.pushUndoStop(),t.executeCommands(this.id,s),t.pushUndoStop()}}class C_ extends he{run(e,t){const i=t.getSelections();if(i===null)return;const n=t.getModel();if(n===null)return;const s=t.getOption(119),r=[];for(const a of i)if(a.isEmpty()){const l=a.getStartPosition(),c=t.getConfiguredWordAtPosition(l);if(!c)continue;const d=new L(l.lineNumber,c.startColumn,l.lineNumber,c.endColumn),h=n.getValueInRange(d);r.push(Pt.replace(d,this._modifyText(h,s)))}else{const l=n.getValueInRange(a);r.push(Pt.replace(a,this._modifyText(l,s)))}t.pushUndoStop(),t.executeEdits(this.id,r),t.pushUndoStop()}}class Mse extends C_{constructor(){super({id:\"editor.action.transformToUppercase\",label:p(\"editor.transformToUppercase\",\"Transform to Uppercase\"),alias:\"Transform to Uppercase\",precondition:T.writable})}_modifyText(e,t){return e.toLocaleUpperCase()}}class Ase extends C_{constructor(){super({id:\"editor.action.transformToLowercase\",label:p(\"editor.transformToLowercase\",\"Transform to Lowercase\"),alias:\"Transform to Lowercase\",precondition:T.writable})}_modifyText(e,t){return e.toLocaleLowerCase()}}class Yg{constructor(e,t){this._pattern=e,this._flags=t,this._actual=null,this._evaluated=!1}get(){if(!this._evaluated){this._evaluated=!0;try{this._actual=new RegExp(this._pattern,this._flags)}catch(e){}}return this._actual}isSupported(){return this.get()!==null}}class Im extends C_{constructor(){super({id:\"editor.action.transformToTitlecase\",label:p(\"editor.transformToTitlecase\",\"Transform to Title Case\"),alias:\"Transform to Title Case\",precondition:T.writable})}_modifyText(e,t){const i=Im.titleBoundary.get();return i?e.toLocaleLowerCase().replace(i,n=>n.toLocaleUpperCase()):e}}Im.titleBoundary=new Yg(\"(^|[^\\\\p{L}\\\\p{N}']|((^|\\\\P{L})'))\\\\p{L}\",\"gmu\");class ec extends C_{constructor(){super({id:\"editor.action.transformToSnakecase\",label:p(\"editor.transformToSnakecase\",\"Transform to Snake Case\"),alias:\"Transform to Snake Case\",precondition:T.writable})}_modifyText(e,t){const i=ec.caseBoundary.get(),n=ec.singleLetters.get();return!i||!n?e:e.replace(i,\"$1_$2\").replace(n,\"$1_$2$3\").toLocaleLowerCase()}}ec.caseBoundary=new Yg(\"(\\\\p{Ll})(\\\\p{Lu})\",\"gmu\");ec.singleLetters=new Yg(\"(\\\\p{Lu}|\\\\p{N})(\\\\p{Lu})(\\\\p{Ll})\",\"gmu\");class Ya extends C_{constructor(){super({id:\"editor.action.transformToKebabcase\",label:p(\"editor.transformToKebabcase\",\"Transform to Kebab Case\"),alias:\"Transform to Kebab Case\",precondition:T.writable})}static isSupported(){return[this.caseBoundary,this.singleLetters,this.underscoreBoundary].every(t=>t.isSupported())}_modifyText(e,t){const i=Ya.caseBoundary.get(),n=Ya.singleLetters.get(),s=Ya.underscoreBoundary.get();return!i||!n||!s?e:e.replace(s,\"$1-$3\").replace(i,\"$1-$2\").replace(n,\"$1-$2\").toLocaleLowerCase()}}Ya.caseBoundary=new Yg(\"(\\\\p{Ll})(\\\\p{Lu})\",\"gmu\");Ya.singleLetters=new Yg(\"(\\\\p{Lu}|\\\\p{N})(\\\\p{Lu}\\\\p{Ll})\",\"gmu\");Ya.underscoreBoundary=new Yg(\"(\\\\S)(_)(\\\\S)\",\"gm\");te(pse);te(mse);te(_se);te(bse);te(vse);te(Cse);te(wse);te(Sse);te(q1);te(yse);te(Lse);te(Dse);te(kse);te(xse);te(Ise);te(Ese);te(Nse);te(Tse);te(Mse);te(Ase);ec.caseBoundary.isSupported()&&ec.singleLetters.isSupported()&&te(ec);Im.titleBoundary.isSupported()&&te(Im);Ya.isSupported()&&te(Ya);var Rse=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Ab=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},MD=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const a7=new ce(\"LinkedEditingInputVisible\",!1),l7=\"linked-editing-decoration\";let wc=class AD extends z{constructor(e,t,i,n,s){super(),this.languageConfigurationService=n,this._syncRangesToken=0,this._localToDispose=this._register(new ee),this._editor=e,this._providers=i.linkedEditingRangeProvider,this._enabled=!1,this._visibleContextKey=a7.bindTo(t),this._debounceInformation=s.for(this._providers,\"Linked Editing\",{min:200}),this._currentDecorations=this._editor.createDecorationsCollection(),this._languageWordPattern=null,this._currentWordPattern=null,this._ignoreChangeEvent=!1,this._localToDispose=this._register(new ee),this._rangeUpdateTriggerPromise=null,this._rangeSyncTriggerPromise=null,this._currentRequest=null,this._currentRequestPosition=null,this._currentRequestModelVersion=null,this._register(this._editor.onDidChangeModel(()=>this.reinitialize(!0))),this._register(this._editor.onDidChangeConfiguration(r=>{(r.hasChanged(64)||r.hasChanged(84))&&this.reinitialize(!1)})),this._register(this._providers.onDidChange(()=>this.reinitialize(!1))),this._register(this._editor.onDidChangeModelLanguage(()=>this.reinitialize(!0))),this.reinitialize(!0)}static get(e){return e.getContribution(AD.ID)}reinitialize(e){const t=this._editor.getModel(),i=t!==null&&(this._editor.getOption(64)||this._editor.getOption(84))&&this._providers.has(t);if(i===this._enabled&&!e||(this._enabled=i,this.clearRanges(),this._localToDispose.clear(),!i||t===null))return;this._localToDispose.add(pe.runAndSubscribe(t.onDidChangeLanguageConfiguration,()=>{this._languageWordPattern=this.languageConfigurationService.getLanguageConfiguration(t.getLanguageId()).getWordDefinition()}));const n=new $r(this._debounceInformation.get(t)),s=()=>{var l;this._rangeUpdateTriggerPromise=n.trigger(()=>this.updateRanges(),(l=this._debounceDuration)!==null&&l!==void 0?l:this._debounceInformation.get(t))},r=new $r(0),a=l=>{this._rangeSyncTriggerPromise=r.trigger(()=>this._syncRanges(l))};this._localToDispose.add(this._editor.onDidChangeCursorPosition(()=>{s()})),this._localToDispose.add(this._editor.onDidChangeModelContent(l=>{if(!this._ignoreChangeEvent&&this._currentDecorations.length>0){const c=this._currentDecorations.getRange(0);if(c&&l.changes.every(d=>c.intersectRanges(d.range))){a(this._syncRangesToken);return}}s()})),this._localToDispose.add({dispose:()=>{n.dispose(),r.dispose()}}),this.updateRanges()}_syncRanges(e){if(!this._editor.hasModel()||e!==this._syncRangesToken||this._currentDecorations.length===0)return;const t=this._editor.getModel(),i=this._currentDecorations.getRange(0);if(!i||i.startLineNumber!==i.endLineNumber)return this.clearRanges();const n=t.getValueInRange(i);if(this._currentWordPattern){const r=n.match(this._currentWordPattern);if((r?r[0].length:0)!==n.length)return this.clearRanges()}const s=[];for(let r=1,a=this._currentDecorations.length;r<a;r++){const l=this._currentDecorations.getRange(r);if(!!l)if(l.startLineNumber!==l.endLineNumber)s.push({range:l,text:n});else{let c=t.getValueInRange(l),d=n,h=l.startColumn,u=l.endColumn;const g=Pd(c,d);h+=g,c=c.substr(g),d=d.substr(g);const f=Np(c,d);u-=f,c=c.substr(0,c.length-f),d=d.substr(0,d.length-f),(h!==u||d.length!==0)&&s.push({range:new L(l.startLineNumber,h,l.endLineNumber,u),text:d})}}if(s.length!==0)try{this._editor.popUndoStop(),this._ignoreChangeEvent=!0;const r=this._editor._getViewModel().getPrevEditOperationType();this._editor.executeEdits(\"linkedEditing\",s),this._editor._getViewModel().setPrevEditOperationType(r)}finally{this._ignoreChangeEvent=!1}}dispose(){this.clearRanges(),super.dispose()}clearRanges(){this._visibleContextKey.set(!1),this._currentDecorations.clear(),this._currentRequest&&(this._currentRequest.cancel(),this._currentRequest=null,this._currentRequestPosition=null)}updateRanges(e=!1){return MD(this,void 0,void 0,function*(){if(!this._editor.hasModel()){this.clearRanges();return}const t=this._editor.getPosition();if(!this._enabled&&!e||this._editor.getSelections().length>1){this.clearRanges();return}const i=this._editor.getModel(),n=i.getVersionId();if(this._currentRequestPosition&&this._currentRequestModelVersion===n){if(t.equals(this._currentRequestPosition))return;if(this._currentDecorations.length>0){const r=this._currentDecorations.getRange(0);if(r&&r.containsPosition(t))return}}this._currentRequestPosition=t,this._currentRequestModelVersion=n;const s=Ti(r=>MD(this,void 0,void 0,function*(){try{const a=new Hn(!1),l=yield c7(this._providers,i,t,r);if(this._debounceInformation.update(i,a.elapsed()),s!==this._currentRequest||(this._currentRequest=null,n!==i.getVersionId()))return;let c=[];l!=null&&l.ranges&&(c=l.ranges),this._currentWordPattern=(l==null?void 0:l.wordPattern)||this._languageWordPattern;let d=!1;for(let u=0,g=c.length;u<g;u++)if(L.containsPosition(c[u],t)){if(d=!0,u!==0){const f=c[u];c.splice(u,1),c.unshift(f)}break}if(!d){this.clearRanges();return}const h=c.map(u=>({range:u,options:AD.DECORATION}));this._visibleContextKey.set(!0),this._currentDecorations.set(h),this._syncRangesToken++}catch(a){ol(a)||Ee(a),(this._currentRequest===s||!this._currentRequest)&&this.clearRanges()}}));return this._currentRequest=s,s})}};wc.ID=\"editor.contrib.linkedEditing\";wc.DECORATION=Ie.register({description:\"linked-editing\",stickiness:0,className:l7});wc=Rse([Ab(1,xe),Ab(2,ue),Ab(3,ti),Ab(4,Js)],wc);class Ose extends he{constructor(){super({id:\"editor.action.linkedEditing\",label:p(\"linkedEditing.label\",\"Start Linked Editing\"),alias:\"Start Linked Editing\",precondition:re.and(T.writable,T.hasRenameProvider),kbOpts:{kbExpr:T.editorTextFocus,primary:3132,weight:100}})}runCommand(e,t){const i=e.get(dt),[n,s]=Array.isArray(t)&&t||[void 0,void 0];return me.isUri(n)&&B.isIPosition(s)?i.openCodeEditor({resource:n},i.getActiveCodeEditor()).then(r=>{!r||(r.setPosition(s),r.invokeWithinContext(a=>(this.reportTelemetry(a,r),this.run(a,r))))},Ee):super.runCommand(e,t)}run(e,t){const i=wc.get(t);return i?Promise.resolve(i.updateRanges(!0)):Promise.resolve()}}const Pse=ji.bindToContribution(wc.get);Q(new Pse({id:\"cancelLinkedEditingInput\",precondition:a7,handler:o=>o.clearRanges(),kbOpts:{kbExpr:T.editorTextFocus,weight:100+99,primary:9,secondary:[1033]}}));function c7(o,e,t,i){const n=o.ordered(e);return $P(n.map(s=>()=>MD(this,void 0,void 0,function*(){try{return yield s.provideLinkedEditingRanges(e,t,i)}catch(r){Ai(r);return}})),s=>!!s&&en(s==null?void 0:s.ranges))}const Fse=N(\"editor.linkedEditingBackground\",{dark:W.fromHex(\"#f00\").transparent(.3),light:W.fromHex(\"#f00\").transparent(.3),hcDark:W.fromHex(\"#f00\").transparent(.3),hcLight:W.white},p(\"editorLinkedEditingBackground\",\"Background color when the editor auto renames on type.\"));Rt((o,e)=>{const t=o.getColor(Fse);t&&e.addRule(`.monaco-editor .${l7} { background: ${t}; border-left-color: ${t}; }`)});Jr(\"_executeLinkedEditingProvider\",(o,e,t)=>{const{linkedEditingRangeProvider:i}=o.get(ue);return c7(i,e,t,We.None)});rt(wc.ID,wc);te(Ose);var d7=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class Bse{constructor(e,t){this._link=e,this._provider=t}toJSON(){return{range:this.range,url:this.url,tooltip:this.tooltip}}get range(){return this._link.range}get url(){return this._link.url}get tooltip(){return this._link.tooltip}resolve(e){return d7(this,void 0,void 0,function*(){return this._link.url?this._link.url:typeof this._provider.resolveLink==\"function\"?Promise.resolve(this._provider.resolveLink(this._link,e)).then(t=>(this._link=t||this._link,this._link.url?this.resolve(e):Promise.reject(new Error(\"missing\")))):Promise.reject(new Error(\"missing\"))})}}class qv{constructor(e){this._disposables=new ee;let t=[];for(const[i,n]of e){const s=i.links.map(r=>new Bse(r,n));t=qv._union(t,s),xx(i)&&this._disposables.add(i)}this.links=t}dispose(){this._disposables.dispose(),this.links.length=0}static _union(e,t){const i=[];let n,s,r,a;for(n=0,r=0,s=e.length,a=t.length;n<s&&r<a;){const l=e[n],c=t[r];if(L.areIntersectingOrTouching(l.range,c.range)){n++;continue}L.compareRangesUsingStarts(l.range,c.range)<0?(i.push(l),n++):(i.push(c),r++)}for(;n<s;n++)i.push(e[n]);for(;r<a;r++)i.push(t[r]);return i}}function h7(o,e,t){const i=[],n=o.ordered(e).reverse().map((s,r)=>Promise.resolve(s.provideLinks(e,t)).then(a=>{a&&(i[r]=[a,s])},Ai));return Promise.all(n).then(()=>{const s=new qv(BC(i));return t.isCancellationRequested?(s.dispose(),new qv([])):s})}Ye.registerCommand(\"_executeLinkProvider\",(o,...e)=>d7(void 0,void 0,void 0,function*(){let[t,i]=e;gt(t instanceof me),typeof i!=\"number\"&&(i=0);const{linkProvider:n}=o.get(ue),s=o.get(Bt).getModel(t);if(!s)return[];const r=yield h7(n,s,We.None);if(!r)return[];for(let l=0;l<Math.min(i,r.links.length);l++)yield r.links[l].resolve(We.None);const a=r.links.slice(0);return r.dispose(),a}));var Wse=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Rb=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},Vse=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};let xg=class u7 extends z{constructor(e,t,i,n,s){super(),this.editor=e,this.openerService=t,this.notificationService=i,this.languageFeaturesService=n,this.providers=this.languageFeaturesService.linkProvider,this.debounceInformation=s.for(this.providers,\"Links\",{min:1e3,max:4e3}),this.computeLinks=this._register(new ft(()=>this.computeLinksNow(),1e3)),this.computePromise=null,this.activeLinksList=null,this.currentOccurrences={},this.activeLinkDecorationId=null;const r=this._register(new CE(e));this._register(r.onMouseMoveOrRelevantKeyDown(([a,l])=>{this._onEditorMouseMove(a,l)})),this._register(r.onExecute(a=>{this.onEditorMouseUp(a)})),this._register(r.onCancel(a=>{this.cleanUpActiveLinkDecoration()})),this._register(e.onDidChangeConfiguration(a=>{!a.hasChanged(65)||(this.updateDecorations([]),this.stop(),this.computeLinks.schedule(0))})),this._register(e.onDidChangeModelContent(a=>{!this.editor.hasModel()||this.computeLinks.schedule(this.debounceInformation.get(this.editor.getModel()))})),this._register(e.onDidChangeModel(a=>{this.currentOccurrences={},this.activeLinkDecorationId=null,this.stop(),this.computeLinks.schedule(0)})),this._register(e.onDidChangeModelLanguage(a=>{this.stop(),this.computeLinks.schedule(0)})),this._register(this.providers.onDidChange(a=>{this.stop(),this.computeLinks.schedule(0)})),this.computeLinks.schedule(0)}static get(e){return e.getContribution(u7.ID)}computeLinksNow(){return Vse(this,void 0,void 0,function*(){if(!this.editor.hasModel()||!this.editor.getOption(65))return;const e=this.editor.getModel();if(!!this.providers.has(e)){this.activeLinksList&&(this.activeLinksList.dispose(),this.activeLinksList=null),this.computePromise=Ti(t=>h7(this.providers,e,t));try{const t=new Hn(!1);if(this.activeLinksList=yield this.computePromise,this.debounceInformation.update(e,t.elapsed()),e.isDisposed())return;this.updateDecorations(this.activeLinksList.links)}catch(t){Ee(t)}finally{this.computePromise=null}}})}updateDecorations(e){const t=this.editor.getOption(72)===\"altKey\",i=[],n=Object.keys(this.currentOccurrences);for(const r of n){const a=this.currentOccurrences[r];i.push(a.decorationId)}const s=[];if(e)for(const r of e)s.push(Uu.decoration(r,t));this.editor.changeDecorations(r=>{const a=r.deltaDecorations(i,s);this.currentOccurrences={},this.activeLinkDecorationId=null;for(let l=0,c=a.length;l<c;l++){const d=new Uu(e[l],a[l]);this.currentOccurrences[d.decorationId]=d}})}_onEditorMouseMove(e,t){const i=this.editor.getOption(72)===\"altKey\";if(this.isEnabled(e,t)){this.cleanUpActiveLinkDecoration();const n=this.getLinkOccurrence(e.target.position);n&&this.editor.changeDecorations(s=>{n.activate(s,i),this.activeLinkDecorationId=n.decorationId})}else this.cleanUpActiveLinkDecoration()}cleanUpActiveLinkDecoration(){const e=this.editor.getOption(72)===\"altKey\";if(this.activeLinkDecorationId){const t=this.currentOccurrences[this.activeLinkDecorationId];t&&this.editor.changeDecorations(i=>{t.deactivate(i,e)}),this.activeLinkDecorationId=null}}onEditorMouseUp(e){if(!this.isEnabled(e))return;const t=this.getLinkOccurrence(e.target.position);!t||this.openLinkOccurrence(t,e.hasSideBySideModifier,!0)}openLinkOccurrence(e,t,i=!1){if(!this.openerService)return;const{link:n}=e;n.resolve(We.None).then(s=>{if(typeof s==\"string\"&&this.editor.hasModel()){const r=this.editor.getModel().uri;if(r.scheme===Ne.file&&s.startsWith(`${Ne.file}:`)){const a=me.parse(s);if(a.scheme===Ne.file){const l=gr(a);let c=null;l.startsWith(\"/./\")?c=`.${l.substr(1)}`:l.startsWith(\"//./\")&&(c=`.${l.substr(2)}`),c&&(s=LK(r,c))}}}return this.openerService.open(s,{openToSide:t,fromUserGesture:i,allowContributedOpeners:!0,allowCommands:!0,fromWorkspace:!0})},s=>{const r=s instanceof Error?s.message:s;r===\"invalid\"?this.notificationService.warn(p(\"invalid.url\",\"Failed to open this link because it is not well-formed: {0}\",n.url.toString())):r===\"missing\"?this.notificationService.warn(p(\"missing.url\",\"Failed to open this link because its target is missing.\")):Ee(s)})}getLinkOccurrence(e){if(!this.editor.hasModel()||!e)return null;const t=this.editor.getModel().getDecorationsInRange({startLineNumber:e.lineNumber,startColumn:e.column,endLineNumber:e.lineNumber,endColumn:e.column},0,!0);for(const i of t){const n=this.currentOccurrences[i.id];if(n)return n}return null}isEnabled(e,t){return Boolean(e.target.type===6&&(e.hasTriggerModifier||t&&t.keyCodeIsTriggerKey))}stop(){var e;this.computeLinks.cancel(),this.activeLinksList&&((e=this.activeLinksList)===null||e===void 0||e.dispose(),this.activeLinksList=null),this.computePromise&&(this.computePromise.cancel(),this.computePromise=null)}dispose(){super.dispose(),this.stop()}};xg.ID=\"editor.linkDetector\";xg=Wse([Rb(1,So),Rb(2,gi),Rb(3,ue),Rb(4,Js)],xg);const AA={general:Ie.register({description:\"detected-link\",stickiness:1,collapseOnReplaceEdit:!0,inlineClassName:\"detected-link\"}),active:Ie.register({description:\"detected-link-active\",stickiness:1,collapseOnReplaceEdit:!0,inlineClassName:\"detected-link-active\"})};class Uu{constructor(e,t){this.link=e,this.decorationId=t}static decoration(e,t){return{range:e.range,options:Uu._getOptions(e,t,!1)}}static _getOptions(e,t,i){const n=Object.assign({},i?AA.active:AA.general);return n.hoverMessage=Hse(e,t),n}activate(e,t){e.changeDecorationOptions(this.decorationId,Uu._getOptions(this.link,t,!0))}deactivate(e,t){e.changeDecorationOptions(this.decorationId,Uu._getOptions(this.link,t,!1))}}function Hse(o,e){const t=o.url&&/^command:/i.test(o.url.toString()),i=o.tooltip?o.tooltip:t?p(\"links.navigate.executeCmd\",\"Execute command\"):p(\"links.navigate.follow\",\"Follow link\"),n=e?Ze?p(\"links.navigate.kb.meta.mac\",\"cmd + click\"):p(\"links.navigate.kb.meta\",\"ctrl + click\"):Ze?p(\"links.navigate.kb.alt.mac\",\"option + click\"):p(\"links.navigate.kb.alt\",\"alt + click\");if(o.url){let s=\"\";if(/^command:/i.test(o.url.toString())){const a=o.url.toString().match(/^command:([^?#]+)/);if(a){const l=a[1];s=p(\"tooltip.explanation\",\"Execute command {0}\",l)}}return new Rn(\"\",!0).appendLink(o.url.toString(!0).replace(/ /g,\"%20\"),i,s).appendMarkdown(` (${n})`)}else return new Rn().appendText(`${i} (${n})`)}class zse extends he{constructor(){super({id:\"editor.action.openLink\",label:p(\"label\",\"Open Link\"),alias:\"Open Link\",precondition:void 0})}run(e,t){const i=xg.get(t);if(!i||!t.hasModel())return;const n=t.getSelections();for(const s of n){const r=i.getLinkOccurrence(s.getEndPosition());r&&i.openLinkOccurrence(r,!1)}}}rt(xg.ID,xg);te(zse);Rt((o,e)=>{const t=o.getColor(vI);t&&e.addRule(`.monaco-editor .detected-link-active { color: ${t} !important; }`)});var Use=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},$se=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};function Ec(o,e){const t=e.filter(i=>!o.find(n=>n.equals(i)));if(t.length>=1){const i=t.map(s=>`line ${s.viewState.position.lineNumber} column ${s.viewState.position.column}`).join(\", \"),n=t.length===1?p(\"cursorAdded\",\"Cursor added: {0}\",i):p(\"cursorsAdded\",\"Cursors added: {0}\",i);O0(n)}}class jse extends he{constructor(){super({id:\"editor.action.insertCursorAbove\",label:p(\"mutlicursor.insertAbove\",\"Add Cursor Above\"),alias:\"Add Cursor Above\",precondition:void 0,kbOpts:{kbExpr:T.editorTextFocus,primary:2576,linux:{primary:1552,secondary:[3088]},weight:100},menuOpts:{menuId:A.MenubarSelectionMenu,group:\"3_multi\",title:p({key:\"miInsertCursorAbove\",comment:[\"&& denotes a mnemonic\"]},\"&&Add Cursor Above\"),order:2}})}run(e,t,i){if(!t.hasModel())return;let n=!0;i&&i.logicalLine===!1&&(n=!1);const s=t._getViewModel();if(s.cursorConfig.readOnly)return;s.model.pushStackElement();const r=s.getCursorStates();s.setCursorStates(i.source,3,Pi.addCursorUp(s,r,n)),s.revealTopMostCursor(i.source),Ec(r,s.getCursorStates())}}class Kse extends he{constructor(){super({id:\"editor.action.insertCursorBelow\",label:p(\"mutlicursor.insertBelow\",\"Add Cursor Below\"),alias:\"Add Cursor Below\",precondition:void 0,kbOpts:{kbExpr:T.editorTextFocus,primary:2578,linux:{primary:1554,secondary:[3090]},weight:100},menuOpts:{menuId:A.MenubarSelectionMenu,group:\"3_multi\",title:p({key:\"miInsertCursorBelow\",comment:[\"&& denotes a mnemonic\"]},\"A&&dd Cursor Below\"),order:3}})}run(e,t,i){if(!t.hasModel())return;let n=!0;i&&i.logicalLine===!1&&(n=!1);const s=t._getViewModel();if(s.cursorConfig.readOnly)return;s.model.pushStackElement();const r=s.getCursorStates();s.setCursorStates(i.source,3,Pi.addCursorDown(s,r,n)),s.revealBottomMostCursor(i.source),Ec(r,s.getCursorStates())}}class qse extends he{constructor(){super({id:\"editor.action.insertCursorAtEndOfEachLineSelected\",label:p(\"mutlicursor.insertAtEndOfEachLineSelected\",\"Add Cursors to Line Ends\"),alias:\"Add Cursors to Line Ends\",precondition:void 0,kbOpts:{kbExpr:T.editorTextFocus,primary:1575,weight:100},menuOpts:{menuId:A.MenubarSelectionMenu,group:\"3_multi\",title:p({key:\"miInsertCursorAtEndOfEachLineSelected\",comment:[\"&& denotes a mnemonic\"]},\"Add C&&ursors to Line Ends\"),order:4}})}getCursorsForSelection(e,t,i){if(!e.isEmpty()){for(let n=e.startLineNumber;n<e.endLineNumber;n++){const s=t.getLineMaxColumn(n);i.push(new oe(n,s,n,s))}e.endColumn>1&&i.push(new oe(e.endLineNumber,e.endColumn,e.endLineNumber,e.endColumn))}}run(e,t){if(!t.hasModel())return;const i=t.getModel(),n=t.getSelections(),s=t._getViewModel(),r=s.getCursorStates(),a=[];n.forEach(l=>this.getCursorsForSelection(l,i,a)),a.length>0&&t.setSelections(a),Ec(r,s.getCursorStates())}}class Gse extends he{constructor(){super({id:\"editor.action.addCursorsToBottom\",label:p(\"mutlicursor.addCursorsToBottom\",\"Add Cursors To Bottom\"),alias:\"Add Cursors To Bottom\",precondition:void 0})}run(e,t){if(!t.hasModel())return;const i=t.getSelections(),n=t.getModel().getLineCount(),s=[];for(let l=i[0].startLineNumber;l<=n;l++)s.push(new oe(l,i[0].startColumn,l,i[0].endColumn));const r=t._getViewModel(),a=r.getCursorStates();s.length>0&&t.setSelections(s),Ec(a,r.getCursorStates())}}class Zse extends he{constructor(){super({id:\"editor.action.addCursorsToTop\",label:p(\"mutlicursor.addCursorsToTop\",\"Add Cursors To Top\"),alias:\"Add Cursors To Top\",precondition:void 0})}run(e,t){if(!t.hasModel())return;const i=t.getSelections(),n=[];for(let a=i[0].startLineNumber;a>=1;a--)n.push(new oe(a,i[0].startColumn,a,i[0].endColumn));const s=t._getViewModel(),r=s.getCursorStates();n.length>0&&t.setSelections(n),Ec(r,s.getCursorStates())}}class Ob{constructor(e,t,i){this.selections=e,this.revealRange=t,this.revealScrollType=i}}class Em{constructor(e,t,i,n,s,r,a){this._editor=e,this.findController=t,this.isDisconnectedFromFindController=i,this.searchText=n,this.wholeWord=s,this.matchCase=r,this.currentMatch=a}static create(e,t){if(!e.hasModel())return null;const i=t.getState();if(!e.hasTextFocus()&&i.isRevealed&&i.searchString.length>0)return new Em(e,t,!1,i.searchString,i.wholeWord,i.matchCase,null);let n=!1,s,r;const a=e.getSelections();a.length===1&&a[0].isEmpty()?(n=!0,s=!0,r=!0):(s=i.wholeWord,r=i.matchCase);const l=e.getSelection();let c,d=null;if(l.isEmpty()){const h=e.getConfiguredWordAtPosition(l.getStartPosition());if(!h)return null;c=h.word,d=new oe(l.startLineNumber,h.startColumn,l.startLineNumber,h.endColumn)}else c=e.getModel().getValueInRange(l).replace(/\\r\\n/g,`\n`);return new Em(e,t,n,c,s,r,d)}addSelectionToNextFindMatch(){if(!this._editor.hasModel())return null;const e=this._getNextMatch();if(!e)return null;const t=this._editor.getSelections();return new Ob(t.concat(e),e,0)}moveSelectionToNextFindMatch(){if(!this._editor.hasModel())return null;const e=this._getNextMatch();if(!e)return null;const t=this._editor.getSelections();return new Ob(t.slice(0,t.length-1).concat(e),e,0)}_getNextMatch(){if(!this._editor.hasModel())return null;if(this.currentMatch){const n=this.currentMatch;return this.currentMatch=null,n}this.findController.highlightFindOptions();const e=this._editor.getSelections(),t=e[e.length-1],i=this._editor.getModel().findNextMatch(this.searchText,t.getEndPosition(),!1,this.matchCase,this.wholeWord?this._editor.getOption(119):null,!1);return i?new oe(i.range.startLineNumber,i.range.startColumn,i.range.endLineNumber,i.range.endColumn):null}addSelectionToPreviousFindMatch(){if(!this._editor.hasModel())return null;const e=this._getPreviousMatch();if(!e)return null;const t=this._editor.getSelections();return new Ob(t.concat(e),e,0)}moveSelectionToPreviousFindMatch(){if(!this._editor.hasModel())return null;const e=this._getPreviousMatch();if(!e)return null;const t=this._editor.getSelections();return new Ob(t.slice(0,t.length-1).concat(e),e,0)}_getPreviousMatch(){if(!this._editor.hasModel())return null;if(this.currentMatch){const n=this.currentMatch;return this.currentMatch=null,n}this.findController.highlightFindOptions();const e=this._editor.getSelections(),t=e[e.length-1],i=this._editor.getModel().findPreviousMatch(this.searchText,t.getStartPosition(),!1,this.matchCase,this.wholeWord?this._editor.getOption(119):null,!1);return i?new oe(i.range.startLineNumber,i.range.startColumn,i.range.endLineNumber,i.range.endColumn):null}selectAll(e){if(!this._editor.hasModel())return[];this.findController.highlightFindOptions();const t=this._editor.getModel();return e?t.findMatches(this.searchText,e,!1,this.matchCase,this.wholeWord?this._editor.getOption(119):null,!1,1073741824):t.findMatches(this.searchText,!0,!1,this.matchCase,this.wholeWord?this._editor.getOption(119):null,!1,1073741824)}}class rh extends z{constructor(e){super(),this._sessionDispose=this._register(new ee),this._editor=e,this._ignoreSelectionChange=!1,this._session=null}static get(e){return e.getContribution(rh.ID)}dispose(){this._endSession(),super.dispose()}_beginSessionIfNeeded(e){if(!this._session){const t=Em.create(this._editor,e);if(!t)return;this._session=t;const i={searchString:this._session.searchText};this._session.isDisconnectedFromFindController&&(i.wholeWordOverride=1,i.matchCaseOverride=1,i.isRegexOverride=2),e.getState().change(i,!1),this._sessionDispose.add(this._editor.onDidChangeCursorSelection(n=>{this._ignoreSelectionChange||this._endSession()})),this._sessionDispose.add(this._editor.onDidBlurEditorText(()=>{this._endSession()})),this._sessionDispose.add(e.getState().onFindReplaceStateChange(n=>{(n.matchCase||n.wholeWord)&&this._endSession()}))}}_endSession(){if(this._sessionDispose.clear(),this._session&&this._session.isDisconnectedFromFindController){const e={wholeWordOverride:0,matchCaseOverride:0,isRegexOverride:0};this._session.findController.getState().change(e,!1)}this._session=null}_setSelections(e){this._ignoreSelectionChange=!0,this._editor.setSelections(e),this._ignoreSelectionChange=!1}_expandEmptyToWord(e,t){if(!t.isEmpty())return t;const i=this._editor.getConfiguredWordAtPosition(t.getStartPosition());return i?new oe(t.startLineNumber,i.startColumn,t.startLineNumber,i.endColumn):t}_applySessionResult(e){!e||(this._setSelections(e.selections),e.revealRange&&this._editor.revealRangeInCenterIfOutsideViewport(e.revealRange,e.revealScrollType))}getSession(e){return this._session}addSelectionToNextFindMatch(e){if(!!this._editor.hasModel()){if(!this._session){const t=this._editor.getSelections();if(t.length>1){const n=e.getState().matchCase;if(!g7(this._editor.getModel(),t,n)){const r=this._editor.getModel(),a=[];for(let l=0,c=t.length;l<c;l++)a[l]=this._expandEmptyToWord(r,t[l]);this._editor.setSelections(a);return}}}this._beginSessionIfNeeded(e),this._session&&this._applySessionResult(this._session.addSelectionToNextFindMatch())}}addSelectionToPreviousFindMatch(e){this._beginSessionIfNeeded(e),this._session&&this._applySessionResult(this._session.addSelectionToPreviousFindMatch())}moveSelectionToNextFindMatch(e){this._beginSessionIfNeeded(e),this._session&&this._applySessionResult(this._session.moveSelectionToNextFindMatch())}moveSelectionToPreviousFindMatch(e){this._beginSessionIfNeeded(e),this._session&&this._applySessionResult(this._session.moveSelectionToPreviousFindMatch())}selectAll(e){if(!this._editor.hasModel())return;let t=null;const i=e.getState();if(i.isRevealed&&i.searchString.length>0&&i.isRegex){const n=this._editor.getModel();i.searchScope?t=n.findMatches(i.searchString,i.searchScope,i.isRegex,i.matchCase,i.wholeWord?this._editor.getOption(119):null,!1,1073741824):t=n.findMatches(i.searchString,!0,i.isRegex,i.matchCase,i.wholeWord?this._editor.getOption(119):null,!1,1073741824)}else{if(this._beginSessionIfNeeded(e),!this._session)return;t=this._session.selectAll(i.searchScope)}if(t.length>0){const n=this._editor.getSelection();for(let s=0,r=t.length;s<r;s++){const a=t[s];if(a.range.intersectRanges(n)){t[s]=t[0],t[0]=a;break}}this._setSelections(t.map(s=>new oe(s.range.startLineNumber,s.range.startColumn,s.range.endLineNumber,s.range.endColumn)))}}}rh.ID=\"editor.contrib.multiCursorController\";class Xg extends he{run(e,t){const i=rh.get(t);if(!i)return;const n=as.get(t);if(!n)return;const s=t._getViewModel();if(s){const r=s.getCursorStates();this._run(i,n),Ec(r,s.getCursorStates())}}}class Yse extends Xg{constructor(){super({id:\"editor.action.addSelectionToNextFindMatch\",label:p(\"addSelectionToNextFindMatch\",\"Add Selection To Next Find Match\"),alias:\"Add Selection To Next Find Match\",precondition:void 0,kbOpts:{kbExpr:T.focus,primary:2082,weight:100},menuOpts:{menuId:A.MenubarSelectionMenu,group:\"3_multi\",title:p({key:\"miAddSelectionToNextFindMatch\",comment:[\"&& denotes a mnemonic\"]},\"Add &&Next Occurrence\"),order:5}})}_run(e,t){e.addSelectionToNextFindMatch(t)}}class Xse extends Xg{constructor(){super({id:\"editor.action.addSelectionToPreviousFindMatch\",label:p(\"addSelectionToPreviousFindMatch\",\"Add Selection To Previous Find Match\"),alias:\"Add Selection To Previous Find Match\",precondition:void 0,menuOpts:{menuId:A.MenubarSelectionMenu,group:\"3_multi\",title:p({key:\"miAddSelectionToPreviousFindMatch\",comment:[\"&& denotes a mnemonic\"]},\"Add P&&revious Occurrence\"),order:6}})}_run(e,t){e.addSelectionToPreviousFindMatch(t)}}class Qse extends Xg{constructor(){super({id:\"editor.action.moveSelectionToNextFindMatch\",label:p(\"moveSelectionToNextFindMatch\",\"Move Last Selection To Next Find Match\"),alias:\"Move Last Selection To Next Find Match\",precondition:void 0,kbOpts:{kbExpr:T.focus,primary:vi(2089,2082),weight:100}})}_run(e,t){e.moveSelectionToNextFindMatch(t)}}class Jse extends Xg{constructor(){super({id:\"editor.action.moveSelectionToPreviousFindMatch\",label:p(\"moveSelectionToPreviousFindMatch\",\"Move Last Selection To Previous Find Match\"),alias:\"Move Last Selection To Previous Find Match\",precondition:void 0})}_run(e,t){e.moveSelectionToPreviousFindMatch(t)}}class eoe extends Xg{constructor(){super({id:\"editor.action.selectHighlights\",label:p(\"selectAllOccurrencesOfFindMatch\",\"Select All Occurrences of Find Match\"),alias:\"Select All Occurrences of Find Match\",precondition:void 0,kbOpts:{kbExpr:T.focus,primary:3114,weight:100},menuOpts:{menuId:A.MenubarSelectionMenu,group:\"3_multi\",title:p({key:\"miSelectHighlights\",comment:[\"&& denotes a mnemonic\"]},\"Select All &&Occurrences\"),order:7}})}_run(e,t){e.selectAll(t)}}class toe extends Xg{constructor(){super({id:\"editor.action.changeAll\",label:p(\"changeAll.label\",\"Change All Occurrences\"),alias:\"Change All Occurrences\",precondition:re.and(T.writable,T.editorTextFocus),kbOpts:{kbExpr:T.editorTextFocus,primary:2108,weight:100},contextMenuOpts:{group:\"1_modification\",order:1.2}})}_run(e,t){e.selectAll(t)}}class ioe{constructor(e,t,i,n,s){this._model=e,this._searchText=t,this._matchCase=i,this._wordSeparators=n,this._modelVersionId=this._model.getVersionId(),this._cachedFindMatches=null,s&&this._model===s._model&&this._searchText===s._searchText&&this._matchCase===s._matchCase&&this._wordSeparators===s._wordSeparators&&this._modelVersionId===s._modelVersionId&&(this._cachedFindMatches=s._cachedFindMatches)}findMatches(){return this._cachedFindMatches===null&&(this._cachedFindMatches=this._model.findMatches(this._searchText,!0,!1,this._matchCase,this._wordSeparators,!1).map(e=>e.range),this._cachedFindMatches.sort(L.compareRangesUsingStarts)),this._cachedFindMatches}}let ah=class v0 extends z{constructor(e,t){super(),this._languageFeaturesService=t,this.editor=e,this._isEnabled=e.getOption(99),this._decorations=e.createDecorationsCollection(),this.updateSoon=this._register(new ft(()=>this._update(),300)),this.state=null,this._register(e.onDidChangeConfiguration(n=>{this._isEnabled=e.getOption(99)})),this._register(e.onDidChangeCursorSelection(n=>{!this._isEnabled||(n.selection.isEmpty()?n.reason===3?(this.state&&this._setState(null),this.updateSoon.schedule()):this._setState(null):this._update())})),this._register(e.onDidChangeModel(n=>{this._setState(null)})),this._register(e.onDidChangeModelContent(n=>{this._isEnabled&&this.updateSoon.schedule()}));const i=as.get(e);i&&this._register(i.getState().onFindReplaceStateChange(n=>{this._update()}))}_update(){this._setState(v0._createState(this.state,this._isEnabled,this.editor))}static _createState(e,t,i){if(!t||!i.hasModel())return null;const n=i.getSelection();if(n.startLineNumber!==n.endLineNumber)return null;const s=rh.get(i);if(!s)return null;const r=as.get(i);if(!r)return null;let a=s.getSession(r);if(!a){const d=i.getSelections();if(d.length>1){const u=r.getState().matchCase;if(!g7(i.getModel(),d,u))return null}a=Em.create(i,r)}if(!a||a.currentMatch||/^[ \\t]+$/.test(a.searchText)||a.searchText.length>200)return null;const l=r.getState(),c=l.matchCase;if(l.isRevealed){let d=l.searchString;c||(d=d.toLowerCase());let h=a.searchText;if(c||(h=h.toLowerCase()),d===h&&a.matchCase===l.matchCase&&a.wholeWord===l.wholeWord&&!l.isRegex)return null}return new ioe(i.getModel(),a.searchText,a.matchCase,a.wholeWord?i.getOption(119):null,e)}_setState(e){if(this.state=e,!this.state){this._decorations.clear();return}if(!this.editor.hasModel())return;const t=this.editor.getModel();if(t.isTooLargeForTokenization())return;const i=this.state.findMatches(),n=this.editor.getSelections();n.sort(L.compareRangesUsingStarts);const s=[];for(let l=0,c=0,d=i.length,h=n.length;l<d;){const u=i[l];if(c>=h)s.push(u),l++;else{const g=L.compareRangesUsingStarts(u,n[c]);g<0?((n[c].isEmpty()||!L.areIntersecting(u,n[c]))&&s.push(u),l++):(g>0||l++,c++)}}const r=this._languageFeaturesService.documentHighlightProvider.has(t)&&this.editor.getOption(74),a=s.map(l=>({range:l,options:r?v0._SELECTION_HIGHLIGHT:v0._SELECTION_HIGHLIGHT_OVERVIEW}));this._decorations.set(a)}dispose(){this._setState(null),super.dispose()}};ah.ID=\"editor.contrib.selectionHighlighter\";ah._SELECTION_HIGHLIGHT_OVERVIEW=Ie.register({description:\"selection-highlight-overview\",stickiness:1,className:\"selectionHighlight\",minimap:{color:Qt(QC),position:js.Inline},overviewRuler:{color:Qt(t4),position:vo.Center}});ah._SELECTION_HIGHLIGHT=Ie.register({description:\"selection-highlight\",stickiness:1,className:\"selectionHighlight\"});ah=Use([$se(1,ue)],ah);function g7(o,e,t){const i=RA(o,e[0],!t);for(let n=1,s=e.length;n<s;n++){const r=e[n];if(r.isEmpty())return!1;const a=RA(o,r,!t);if(i!==a)return!1}return!0}function RA(o,e,t){const i=o.getValueInRange(e);return t?i.toLowerCase():i}class noe extends he{constructor(){super({id:\"editor.action.focusNextCursor\",label:p(\"mutlicursor.focusNextCursor\",\"Focus Next Cursor\"),description:{description:p(\"mutlicursor.focusNextCursor.description\",\"Focuses the next cursor\"),args:[]},alias:\"Focus Next Cursor\",precondition:void 0})}run(e,t,i){if(!t.hasModel())return;const n=t._getViewModel();if(n.cursorConfig.readOnly)return;n.model.pushStackElement();const s=Array.from(n.getCursorStates()),r=s.shift();!r||(s.push(r),n.setCursorStates(i.source,3,s),n.revealPrimaryCursor(i.source,!0),Ec(s,n.getCursorStates()))}}class soe extends he{constructor(){super({id:\"editor.action.focusPreviousCursor\",label:p(\"mutlicursor.focusPreviousCursor\",\"Focus Previous Cursor\"),description:{description:p(\"mutlicursor.focusPreviousCursor.description\",\"Focuses the previous cursor\"),args:[]},alias:\"Focus Previous Cursor\",precondition:void 0})}run(e,t,i){if(!t.hasModel())return;const n=t._getViewModel();if(n.cursorConfig.readOnly)return;n.model.pushStackElement();const s=Array.from(n.getCursorStates()),r=s.pop();!r||(s.unshift(r),n.setCursorStates(i.source,3,s),n.revealPrimaryCursor(i.source,!0),Ec(s,n.getCursorStates()))}}rt(rh.ID,rh);rt(ah.ID,ah);te(jse);te(Kse);te(qse);te(Yse);te(Xse);te(Qse);te(Jse);te(eoe);te(toe);te(Gse);te(Zse);te(noe);te(soe);var f7=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const lh={Visible:new ce(\"parameterHintsVisible\",!1),MultipleSignatures:new ce(\"parameterHintsMultipleSignatures\",!1)};function p7(o,e,t,i,n){return f7(this,void 0,void 0,function*(){const s=o.ordered(e);for(const r of s)try{const a=yield r.provideSignatureHelp(e,t,n,i);if(a)return a}catch(a){Ai(a)}})}Ye.registerCommand(\"_executeSignatureHelpProvider\",(o,...e)=>f7(void 0,void 0,void 0,function*(){const[t,i,n]=e;gt(me.isUri(t)),gt(B.isIPosition(i)),gt(typeof n==\"string\"||!n);const s=o.get(ue),r=yield o.get($n).createModelReference(t);try{const a=yield p7(s.signatureHelpProvider,r.object.textEditorModel,B.lift(i),{triggerKind:Wr.Invoke,isRetrigger:!1,triggerCharacter:n},We.None);return a?(setTimeout(()=>a.dispose(),0),a.value):void 0}finally{r.dispose()}}));var ooe=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})},kl;(function(o){o.Default={type:0};class e{constructor(n,s){this.request=n,this.previouslyActiveHints=s,this.type=2}}o.Pending=e;class t{constructor(n){this.hints=n,this.type=1}}o.Active=t})(kl||(kl={}));class G1 extends z{constructor(e,t,i=G1.DEFAULT_DELAY){super(),this._onChangedHints=this._register(new O),this.onChangedHints=this._onChangedHints.event,this.triggerOnType=!1,this._state=kl.Default,this._pendingTriggers=[],this._lastSignatureHelpResult=this._register(new Vn),this.triggerChars=new ru,this.retriggerChars=new ru,this.triggerId=0,this.editor=e,this.providers=t,this.throttledDelayer=new $r(i),this._register(this.editor.onDidBlurEditorWidget(()=>this.cancel())),this._register(this.editor.onDidChangeConfiguration(()=>this.onEditorConfigurationChange())),this._register(this.editor.onDidChangeModel(n=>this.onModelChanged())),this._register(this.editor.onDidChangeModelLanguage(n=>this.onModelChanged())),this._register(this.editor.onDidChangeCursorSelection(n=>this.onCursorChange(n))),this._register(this.editor.onDidChangeModelContent(n=>this.onModelContentChange())),this._register(this.providers.onDidChange(this.onModelChanged,this)),this._register(this.editor.onDidType(n=>this.onDidType(n))),this.onEditorConfigurationChange(),this.onModelChanged()}get state(){return this._state}set state(e){this._state.type===2&&this._state.request.cancel(),this._state=e}cancel(e=!1){this.state=kl.Default,this.throttledDelayer.cancel(),e||this._onChangedHints.fire(void 0)}trigger(e,t){const i=this.editor.getModel();if(!i||!this.providers.has(i))return;const n=++this.triggerId;this._pendingTriggers.push(e),this.throttledDelayer.trigger(()=>this.doTrigger(n),t).catch(Ee)}next(){if(this.state.type!==1)return;const e=this.state.hints.signatures.length,t=this.state.hints.activeSignature,i=t%e===e-1,n=this.editor.getOption(78).cycle;if((e<2||i)&&!n){this.cancel();return}this.updateActiveSignature(i&&n?0:t+1)}previous(){if(this.state.type!==1)return;const e=this.state.hints.signatures.length,t=this.state.hints.activeSignature,i=t===0,n=this.editor.getOption(78).cycle;if((e<2||i)&&!n){this.cancel();return}this.updateActiveSignature(i&&n?e-1:t-1)}updateActiveSignature(e){this.state.type===1&&(this.state=new kl.Active(Object.assign(Object.assign({},this.state.hints),{activeSignature:e})),this._onChangedHints.fire(this.state.hints))}doTrigger(e){return ooe(this,void 0,void 0,function*(){const t=this.state.type===1||this.state.type===2,i=this.getLastActiveHints();if(this.cancel(!0),this._pendingTriggers.length===0)return!1;const n=this._pendingTriggers.reduce(roe);this._pendingTriggers=[];const s={triggerKind:n.triggerKind,triggerCharacter:n.triggerCharacter,isRetrigger:t,activeSignatureHelp:i};if(!this.editor.hasModel())return!1;const r=this.editor.getModel(),a=this.editor.getPosition();this.state=new kl.Pending(Ti(l=>p7(this.providers,r,a,s,l)),i);try{const l=yield this.state.request;return e!==this.triggerId?(l==null||l.dispose(),!1):!l||!l.value.signatures||l.value.signatures.length===0?(l==null||l.dispose(),this._lastSignatureHelpResult.clear(),this.cancel(),!1):(this.state=new kl.Active(l.value),this._lastSignatureHelpResult.value=l,this._onChangedHints.fire(this.state.hints),!0)}catch(l){return e===this.triggerId&&(this.state=kl.Default),Ee(l),!1}})}getLastActiveHints(){switch(this.state.type){case 1:return this.state.hints;case 2:return this.state.previouslyActiveHints;default:return}}get isTriggered(){return this.state.type===1||this.state.type===2||this.throttledDelayer.isTriggered()}onModelChanged(){this.cancel(),this.triggerChars=new ru,this.retriggerChars=new ru;const e=this.editor.getModel();if(!!e)for(const t of this.providers.ordered(e)){for(const i of t.signatureHelpTriggerCharacters||[])this.triggerChars.add(i.charCodeAt(0)),this.retriggerChars.add(i.charCodeAt(0));for(const i of t.signatureHelpRetriggerCharacters||[])this.retriggerChars.add(i.charCodeAt(0))}}onDidType(e){if(!this.triggerOnType)return;const t=e.length-1,i=e.charCodeAt(t);(this.triggerChars.has(i)||this.isTriggered&&this.retriggerChars.has(i))&&this.trigger({triggerKind:Wr.TriggerCharacter,triggerCharacter:e.charAt(t)})}onCursorChange(e){e.source===\"mouse\"?this.cancel():this.isTriggered&&this.trigger({triggerKind:Wr.ContentChange})}onModelContentChange(){this.isTriggered&&this.trigger({triggerKind:Wr.ContentChange})}onEditorConfigurationChange(){this.triggerOnType=this.editor.getOption(78).enabled,this.triggerOnType||this.cancel()}dispose(){this.cancel(!0),super.dispose()}}G1.DEFAULT_DELAY=120;function roe(o,e){switch(e.triggerKind){case Wr.Invoke:return e;case Wr.ContentChange:return o;case Wr.TriggerCharacter:default:return e}}var aoe=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Pb=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const hs=se,loe=fi(\"parameter-hints-next\",m.chevronDown,p(\"parameterHintsNextIcon\",\"Icon for show next parameter hint.\")),coe=fi(\"parameter-hints-previous\",m.chevronUp,p(\"parameterHintsPreviousIcon\",\"Icon for show previous parameter hint.\"));let Gv=class m7 extends z{constructor(e,t,i,n,s){super(),this.editor=e,this.renderDisposeables=this._register(new ee),this.visible=!1,this.announcedLabel=null,this.allowEditorOverflow=!0,this.markdownRenderer=this._register(new sl({editor:e},n,i)),this.model=this._register(new G1(e,s.signatureHelpProvider)),this.keyVisible=lh.Visible.bindTo(t),this.keyMultipleSignatures=lh.MultipleSignatures.bindTo(t),this._register(this.model.onChangedHints(r=>{r?(this.show(),this.render(r)):this.hide()}))}createParameterHintDOMNodes(){const e=hs(\".editor-widget.parameter-hints-widget\"),t=G(e,hs(\".phwrapper\"));t.tabIndex=-1;const i=G(t,hs(\".controls\")),n=G(i,hs(\".button\"+nt.asCSSSelector(coe))),s=G(i,hs(\".overloads\")),r=G(i,hs(\".button\"+nt.asCSSSelector(loe)));this._register(q(n,\"click\",u=>{ct.stop(u),this.previous()})),this._register(q(r,\"click\",u=>{ct.stop(u),this.next()}));const a=hs(\".body\"),l=new e_(a,{alwaysConsumeMouseWheel:!0});this._register(l),t.appendChild(l.getDomNode());const c=G(a,hs(\".signature\")),d=G(a,hs(\".docs\"));e.style.userSelect=\"text\",this.domNodes={element:e,signature:c,overloads:s,docs:d,scrollbar:l},this.editor.addContentWidget(this),this.hide(),this._register(this.editor.onDidChangeCursorSelection(u=>{this.visible&&this.editor.layoutContentWidget(this)}));const h=()=>{if(!this.domNodes)return;const u=this.editor.getOption(46);this.domNodes.element.style.fontSize=`${u.fontSize}px`,this.domNodes.element.style.lineHeight=`${u.lineHeight/u.fontSize}`};h(),this._register(pe.chain(this.editor.onDidChangeConfiguration.bind(this.editor)).filter(u=>u.hasChanged(46)).on(h,null)),this._register(this.editor.onDidLayoutChange(u=>this.updateMaxHeight())),this.updateMaxHeight()}show(){this.visible||(this.domNodes||this.createParameterHintDOMNodes(),this.keyVisible.set(!0),this.visible=!0,setTimeout(()=>{var e;(e=this.domNodes)===null||e===void 0||e.element.classList.add(\"visible\")},100),this.editor.layoutContentWidget(this))}hide(){var e;this.renderDisposeables.clear(),this.visible&&(this.keyVisible.reset(),this.visible=!1,this.announcedLabel=null,(e=this.domNodes)===null||e===void 0||e.element.classList.remove(\"visible\"),this.editor.layoutContentWidget(this))}getPosition(){return this.visible?{position:this.editor.getPosition(),preference:[1,2]}:null}render(e){var t;if(this.renderDisposeables.clear(),!this.domNodes)return;const i=e.signatures.length>1;this.domNodes.element.classList.toggle(\"multiple\",i),this.keyMultipleSignatures.set(i),this.domNodes.signature.innerText=\"\",this.domNodes.docs.innerText=\"\";const n=e.signatures[e.activeSignature];if(!n)return;const s=G(this.domNodes.signature,hs(\".code\")),r=this.editor.getOption(46);s.style.fontSize=`${r.fontSize}px`,s.style.fontFamily=r.fontFamily;const a=n.parameters.length>0,l=(t=n.activeParameter)!==null&&t!==void 0?t:e.activeParameter;if(a)this.renderParameters(s,n,l);else{const h=G(s,hs(\"span\"));h.textContent=n.label}const c=n.parameters[l];if(c!=null&&c.documentation){const h=hs(\"span.documentation\");if(typeof c.documentation==\"string\")h.textContent=c.documentation;else{const u=this.renderMarkdownDocs(c.documentation);h.appendChild(u.element)}G(this.domNodes.docs,hs(\"p\",{},h))}if(n.documentation!==void 0)if(typeof n.documentation==\"string\")G(this.domNodes.docs,hs(\"p\",{},n.documentation));else{const h=this.renderMarkdownDocs(n.documentation);G(this.domNodes.docs,h.element)}const d=this.hasDocs(n,c);if(this.domNodes.signature.classList.toggle(\"has-docs\",d),this.domNodes.docs.classList.toggle(\"empty\",!d),this.domNodes.overloads.textContent=String(e.activeSignature+1).padStart(e.signatures.length.toString().length,\"0\")+\"/\"+e.signatures.length,c){let h=\"\";const u=n.parameters[l];Array.isArray(u.label)?h=n.label.substring(u.label[0],u.label[1]):h=u.label,u.documentation&&(h+=typeof u.documentation==\"string\"?`, ${u.documentation}`:`, ${u.documentation.value}`),n.documentation&&(h+=typeof n.documentation==\"string\"?`, ${n.documentation}`:`, ${n.documentation.value}`),this.announcedLabel!==h&&(un(p(\"hint\",\"{0}, hint\",h)),this.announcedLabel=h)}this.editor.layoutContentWidget(this),this.domNodes.scrollbar.scanDomNode()}renderMarkdownDocs(e){const t=this.renderDisposeables.add(this.markdownRenderer.render(e,{asyncRenderCallback:()=>{var i;(i=this.domNodes)===null||i===void 0||i.scrollbar.scanDomNode()}}));return t.element.classList.add(\"markdown-docs\"),t}hasDocs(e,t){return!!(t&&typeof t.documentation==\"string\"&&M_(t.documentation).length>0||t&&typeof t.documentation==\"object\"&&M_(t.documentation).value.length>0||e.documentation&&typeof e.documentation==\"string\"&&M_(e.documentation).length>0||e.documentation&&typeof e.documentation==\"object\"&&M_(e.documentation.value).length>0)}renderParameters(e,t,i){const[n,s]=this.getParameterLabelOffsets(t,i),r=document.createElement(\"span\");r.textContent=t.label.substring(0,n);const a=document.createElement(\"span\");a.textContent=t.label.substring(n,s),a.className=\"parameter active\";const l=document.createElement(\"span\");l.textContent=t.label.substring(s),G(e,r,a,l)}getParameterLabelOffsets(e,t){const i=e.parameters[t];if(i){if(Array.isArray(i.label))return i.label;if(i.label.length){const n=new RegExp(`(\\\\W|^)${Ds(i.label)}(?=\\\\W|$)`,\"g\");n.test(e.label);const s=n.lastIndex-i.label.length;return s>=0?[s,n.lastIndex]:[0,0]}else return[0,0]}else return[0,0]}next(){this.editor.focus(),this.model.next()}previous(){this.editor.focus(),this.model.previous()}cancel(){this.model.cancel()}getDomNode(){return this.domNodes||this.createParameterHintDOMNodes(),this.domNodes.element}getId(){return m7.ID}trigger(e){this.model.trigger(e,0)}updateMaxHeight(){if(!this.domNodes)return;const t=`${Math.max(this.editor.getLayoutInfo().height/4,250)}px`;this.domNodes.element.style.maxHeight=t;const i=this.domNodes.element.getElementsByClassName(\"phwrapper\");i.length&&(i[0].style.maxHeight=t)}};Gv.ID=\"editor.widget.parameterHintsWidget\";Gv=aoe([Pb(1,xe),Pb(2,So),Pb(3,Ht),Pb(4,ue)],Gv);const doe=N(\"editorHoverWidget.highlightForeground\",{dark:ho,light:ho,hcDark:ho,hcLight:ho},p(\"editorHoverWidgetHighlightForeground\",\"Foreground color of the active item in the parameter hint.\"));Rt((o,e)=>{const t=o.getColor(XP);if(t){const c=yn(o.type)?2:1;e.addRule(`.monaco-editor .parameter-hints-widget { border: ${c}px solid ${t}; }`),e.addRule(`.monaco-editor .parameter-hints-widget.multiple .body { border-left: 1px solid ${t.transparent(.5)}; }`),e.addRule(`.monaco-editor .parameter-hints-widget .signature.has-docs { border-bottom: 1px solid ${t.transparent(.5)}; }`)}const i=o.getColor(rg);i&&e.addRule(`.monaco-editor .parameter-hints-widget { background-color: ${i}; }`);const n=o.getColor(qC);n&&e.addRule(`.monaco-editor .parameter-hints-widget a { color: ${n}; }`);const s=o.getColor(GC);s&&e.addRule(`.monaco-editor .parameter-hints-widget a:hover { color: ${s}; }`);const r=o.getColor(YP);r&&e.addRule(`.monaco-editor .parameter-hints-widget { color: ${r}; }`);const a=o.getColor(GP);a&&e.addRule(`.monaco-editor .parameter-hints-widget code { background-color: ${a}; }`);const l=o.getColor(doe);l&&e.addRule(`.monaco-editor .parameter-hints-widget .parameter.active { color: ${l}}`)});var hoe=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},uoe=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let ch=class _7 extends z{constructor(e,t){super(),this.editor=e,this.widget=this._register(t.createInstance(Gv,this.editor))}static get(e){return e.getContribution(_7.ID)}cancel(){this.widget.cancel()}previous(){this.widget.previous()}next(){this.widget.next()}trigger(e){this.widget.trigger(e)}};ch.ID=\"editor.controller.parameterHints\";ch=hoe([uoe(1,Re)],ch);class goe extends he{constructor(){super({id:\"editor.action.triggerParameterHints\",label:p(\"parameterHints.trigger.label\",\"Trigger Parameter Hints\"),alias:\"Trigger Parameter Hints\",precondition:T.hasSignatureHelpProvider,kbOpts:{kbExpr:T.editorTextFocus,primary:3082,weight:100}})}run(e,t){const i=ch.get(t);i&&i.trigger({triggerKind:Wr.Invoke})}}rt(ch.ID,ch);te(goe);const hN=100+75,uN=ji.bindToContribution(ch.get);Q(new uN({id:\"closeParameterHints\",precondition:lh.Visible,handler:o=>o.cancel(),kbOpts:{weight:hN,kbExpr:T.focus,primary:9,secondary:[1033]}}));Q(new uN({id:\"showPrevParameterHint\",precondition:re.and(lh.Visible,lh.MultipleSignatures),handler:o=>o.previous(),kbOpts:{weight:hN,kbExpr:T.focus,primary:16,secondary:[528],mac:{primary:16,secondary:[528,302]}}}));Q(new uN({id:\"showNextParameterHint\",precondition:re.and(lh.Visible,lh.MultipleSignatures),handler:o=>o.next(),kbOpts:{weight:hN,kbExpr:T.focus,primary:18,secondary:[530],mac:{primary:18,secondary:[530,300]}}}));const gN=qe(\"textResourceConfigurationService\"),b7=qe(\"textResourcePropertiesService\");var foe=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},ZS=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const Z1=new ce(\"renameInputVisible\",!1,p(\"renameInputVisible\",\"Whether the rename input widget is visible\"));let RD=class{constructor(e,t,i,n,s){this._editor=e,this._acceptKeybindings=t,this._themeService=i,this._keybindingService=n,this._disposables=new ee,this.allowEditorOverflow=!0,this._visibleContextKey=Z1.bindTo(s),this._editor.addContentWidget(this),this._disposables.add(this._editor.onDidChangeConfiguration(r=>{r.hasChanged(46)&&this._updateFont()})),this._disposables.add(i.onDidColorThemeChange(this._updateStyles,this))}dispose(){this._disposables.dispose(),this._editor.removeContentWidget(this)}getId(){return\"__renameInputWidget\"}getDomNode(){if(!this._domNode){this._domNode=document.createElement(\"div\"),this._domNode.className=\"monaco-editor rename-box\",this._input=document.createElement(\"input\"),this._input.className=\"rename-input\",this._input.type=\"text\",this._input.setAttribute(\"aria-label\",p(\"renameAriaLabel\",\"Rename input. Type new name and press Enter to commit.\")),this._domNode.appendChild(this._input),this._label=document.createElement(\"div\"),this._label.className=\"rename-label\",this._domNode.appendChild(this._label);const e=()=>{var t,i;const[n,s]=this._acceptKeybindings;this._keybindingService.lookupKeybinding(n),this._label.innerText=p({key:\"label\",comment:['placeholders are keybindings, e.g \"F2 to Rename, Shift+F2 to Preview\"']},\"{0} to Rename, {1} to Preview\",(t=this._keybindingService.lookupKeybinding(n))===null||t===void 0?void 0:t.getLabel(),(i=this._keybindingService.lookupKeybinding(s))===null||i===void 0?void 0:i.getLabel())};e(),this._disposables.add(this._keybindingService.onDidUpdateKeybindings(e)),this._updateFont(),this._updateStyles(this._themeService.getColorTheme())}return this._domNode}_updateStyles(e){var t,i,n,s;if(!this._input||!this._domNode)return;const r=e.getColor(Tr);this._domNode.style.backgroundColor=String((t=e.getColor(ci))!==null&&t!==void 0?t:\"\"),this._domNode.style.boxShadow=r?` 0 0 8px 2px ${r}`:\"\",this._domNode.style.color=String((i=e.getColor(YC))!==null&&i!==void 0?i:\"\"),this._input.style.backgroundColor=String((n=e.getColor(ZC))!==null&&n!==void 0?n:\"\");const a=e.getColor(XC);this._input.style.borderWidth=a?\"1px\":\"0px\",this._input.style.borderStyle=a?\"solid\":\"none\",this._input.style.borderColor=(s=a==null?void 0:a.toString())!==null&&s!==void 0?s:\"none\"}_updateFont(){if(!this._input||!this._label)return;const e=this._editor.getOption(46);this._input.style.fontFamily=e.fontFamily,this._input.style.fontWeight=e.fontWeight,this._input.style.fontSize=`${e.fontSize}px`,this._label.style.fontSize=`${e.fontSize*.8}px`}getPosition(){return this._visible?{position:this._position,preference:[2,1]}:null}afterRender(e){e||this.cancelInput(!0)}acceptInput(e){var t;(t=this._currentAcceptInput)===null||t===void 0||t.call(this,e)}cancelInput(e){var t;(t=this._currentCancelInput)===null||t===void 0||t.call(this,e)}getInput(e,t,i,n,s,r){this._domNode.classList.toggle(\"preview\",s),this._position=new B(e.startLineNumber,e.startColumn),this._input.value=t,this._input.setAttribute(\"selectionStart\",i.toString()),this._input.setAttribute(\"selectionEnd\",n.toString()),this._input.size=Math.max((e.endColumn-e.startColumn)*1.1,20);const a=new ee;return new Promise(l=>{this._currentCancelInput=c=>(this._currentAcceptInput=void 0,this._currentCancelInput=void 0,l(c),!0),this._currentAcceptInput=c=>{if(this._input.value.trim().length===0||this._input.value===t){this.cancelInput(!0);return}this._currentAcceptInput=void 0,this._currentCancelInput=void 0,l({newName:this._input.value,wantsPreview:s&&c})},a.add(r.onCancellationRequested(()=>this.cancelInput(!0))),a.add(this._editor.onDidBlurEditorWidget(()=>this.cancelInput(!1))),this._show()}).finally(()=>{a.dispose(),this._hide()})}_show(){this._editor.revealLineInCenterIfOutsideViewport(this._position.lineNumber,0),this._visible=!0,this._visibleContextKey.set(!0),this._editor.layoutContentWidget(this),setTimeout(()=>{this._input.focus(),this._input.setSelectionRange(parseInt(this._input.getAttribute(\"selectionStart\")),parseInt(this._input.getAttribute(\"selectionEnd\")))},100)}_hide(){this._visible=!1,this._visibleContextKey.reset(),this._editor.layoutContentWidget(this)}};RD=foe([ZS(2,vt),ZS(3,rn),ZS(4,xe)],RD);var poe=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},zc=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},Id=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class fN{constructor(e,t,i){this.model=e,this.position=t,this._providerRenameIdx=0,this._providers=i.ordered(e)}hasProvider(){return this._providers.length>0}resolveRenameLocation(e){return Id(this,void 0,void 0,function*(){const t=[];for(this._providerRenameIdx=0;this._providerRenameIdx<this._providers.length;this._providerRenameIdx++){const n=this._providers[this._providerRenameIdx];if(!n.resolveRenameLocation)break;const s=yield n.resolveRenameLocation(this.model,this.position,e);if(!!s){if(s.rejectReason){t.push(s.rejectReason);continue}return s}}const i=this.model.getWordAtPosition(this.position);return i?{range:new L(this.position.lineNumber,i.startColumn,this.position.lineNumber,i.endColumn),text:i.word,rejectReason:t.length>0?t.join(`\n`):void 0}:{range:L.fromPositions(this.position),text:\"\",rejectReason:t.length>0?t.join(`\n`):void 0}})}provideRenameEdits(e,t){return Id(this,void 0,void 0,function*(){return this._provideRenameEdits(e,this._providerRenameIdx,[],t)})}_provideRenameEdits(e,t,i,n){return Id(this,void 0,void 0,function*(){const s=this._providers[t];if(!s)return{edits:[],rejectReason:i.join(`\n`)};const r=yield s.provideRenameEdits(this.model,this.position,e,n);if(r){if(r.rejectReason)return this._provideRenameEdits(e,t+1,i.concat(r.rejectReason),n)}else return this._provideRenameEdits(e,t+1,i.concat(p(\"no result\",\"No result.\")),n);return r})}}function moe(o,e,t,i){return Id(this,void 0,void 0,function*(){const n=new fN(e,t,o),s=yield n.resolveRenameLocation(We.None);return s!=null&&s.rejectReason?{edits:[],rejectReason:s.rejectReason}:n.provideRenameEdits(i,We.None)})}let dh=class v7{constructor(e,t,i,n,s,r,a,l){this.editor=e,this._instaService=t,this._notificationService=i,this._bulkEditService=n,this._progressService=s,this._logService=r,this._configService=a,this._languageFeaturesService=l,this._disposableStore=new ee,this._cts=new gn,this._renameInputField=this._disposableStore.add(new ql(()=>this._disposableStore.add(this._instaService.createInstance(RD,this.editor,[\"acceptRenameInput\",\"acceptRenameInputWithPreview\"]))))}static get(e){return e.getContribution(v7.ID)}dispose(){this._disposableStore.dispose(),this._cts.dispose(!0)}run(){var e,t;return Id(this,void 0,void 0,function*(){if(this._cts.dispose(!0),!this.editor.hasModel())return;const i=this.editor.getPosition(),n=new fN(this.editor.getModel(),i,this._languageFeaturesService.renameProvider);if(!n.hasProvider())return;this._cts=new Kd(this.editor,5);let s;try{const u=n.resolveRenameLocation(this._cts.token);this._progressService.showWhile(u,250),s=yield u}catch(u){(e=rs.get(this.editor))===null||e===void 0||e.showMessage(u||p(\"resolveRenameLocationFailed\",\"An unknown error occurred while resolving rename location\"),i);return}if(!s)return;if(s.rejectReason){(t=rs.get(this.editor))===null||t===void 0||t.showMessage(s.rejectReason,i);return}if(this._cts.token.isCancellationRequested)return;this._cts.dispose(),this._cts=new Kd(this.editor,5,s.range);const r=this.editor.getSelection();let a=0,l=s.text.length;!L.isEmpty(r)&&!L.spansMultipleLines(r)&&L.containsRange(s.range,r)&&(a=Math.max(0,r.startColumn-s.range.startColumn),l=Math.min(s.range.endColumn,r.endColumn)-s.range.startColumn);const c=this._bulkEditService.hasPreviewHandler()&&this._configService.getValue(this.editor.getModel().uri,\"editor.rename.enablePreview\"),d=yield this._renameInputField.value.getInput(s.range,s.text,a,l,c,this._cts.token);if(typeof d==\"boolean\"){d&&this.editor.focus();return}this.editor.focus();const h=aI(n.provideRenameEdits(d.newName,this._cts.token),this._cts.token).then(u=>Id(this,void 0,void 0,function*(){if(!(!u||!this.editor.hasModel())){if(u.rejectReason){this._notificationService.info(u.rejectReason);return}this.editor.setSelection(L.fromPositions(this.editor.getSelection().getPosition())),this._bulkEditService.apply($g.convert(u),{editor:this.editor,showPreview:d.wantsPreview,label:p(\"label\",\"Renaming '{0}' to '{1}'\",s==null?void 0:s.text,d.newName),code:\"undoredo.rename\",quotableLabel:p(\"quotableLabel\",\"Renaming {0} to {1}\",s==null?void 0:s.text,d.newName),respectAutoSaveConfig:!0}).then(g=>{g.ariaSummary&&un(p(\"aria\",\"Successfully renamed '{0}' to '{1}'. Summary: {2}\",s.text,d.newName,g.ariaSummary))}).catch(g=>{this._notificationService.error(p(\"rename.failedApply\",\"Rename failed to apply edits\")),this._logService.error(g)})}}),u=>{this._notificationService.error(p(\"rename.failed\",\"Rename failed to compute edits\")),this._logService.error(u)});return this._progressService.showWhile(h,250),h})}acceptRenameInput(e){this._renameInputField.value.acceptInput(e)}cancelRenameInput(){this._renameInputField.value.cancelInput(!0)}};dh.ID=\"editor.contrib.renameController\";dh=poe([zc(1,Re),zc(2,gi),zc(3,n_),zc(4,kc),zc(5,Co),zc(6,gN),zc(7,ue)],dh);class _oe extends he{constructor(){super({id:\"editor.action.rename\",label:p(\"rename.label\",\"Rename Symbol\"),alias:\"Rename Symbol\",precondition:re.and(T.writable,T.hasRenameProvider),kbOpts:{kbExpr:T.editorTextFocus,primary:60,weight:100},contextMenuOpts:{group:\"1_modification\",order:1.1}})}runCommand(e,t){const i=e.get(dt),[n,s]=Array.isArray(t)&&t||[void 0,void 0];return me.isUri(n)&&B.isIPosition(s)?i.openCodeEditor({resource:n},i.getActiveCodeEditor()).then(r=>{!r||(r.setPosition(s),r.invokeWithinContext(a=>(this.reportTelemetry(a,r),this.run(a,r))))},Ee):super.runCommand(e,t)}run(e,t){const i=dh.get(t);return i?i.run():Promise.resolve()}}rt(dh.ID,dh);te(_oe);const pN=ji.bindToContribution(dh.get);Q(new pN({id:\"acceptRenameInput\",precondition:Z1,handler:o=>o.acceptRenameInput(!1),kbOpts:{weight:100+99,kbExpr:T.focus,primary:3}}));Q(new pN({id:\"acceptRenameInputWithPreview\",precondition:re.and(Z1,re.has(\"config.editor.rename.enablePreview\")),handler:o=>o.acceptRenameInput(!0),kbOpts:{weight:100+99,kbExpr:T.focus,primary:1024+3}}));Q(new pN({id:\"cancelRenameInput\",precondition:Z1,handler:o=>o.cancelRenameInput(),kbOpts:{weight:100+99,kbExpr:T.focus,primary:9,secondary:[1033]}}));Jr(\"_executeDocumentRenameProvider\",function(o,e,t,...i){const[n]=i;gt(typeof n==\"string\");const{renameProvider:s}=o.get(ue);return moe(s,e,t,n)});Jr(\"_executePrepareRename\",function(o,e,t){return Id(this,void 0,void 0,function*(){const{renameProvider:i}=o.get(ue),s=yield new fN(e,t,i).resolveRenameLocation(We.None);if(s!=null&&s.rejectReason)throw new Error(s.rejectReason);return s})});di.as(al.Configuration).registerConfiguration({id:\"editor\",properties:{\"editor.rename.enablePreview\":{scope:5,description:p(\"enablePreview\",\"Enable/disable the ability to preview changes before renaming\"),default:!0,type:\"boolean\"}}});var boe=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},voe=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},OA=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})},YS;let Nm=class extends z{constructor(e,t){super(),this._sessionStore=new ee,this._ranges=[],this._rangesVersionId=0,this._editor=e,this._languageFeaturesService=t,this.stickyScrollWidget=new Coe(this._editor),this._register(this._editor.onDidChangeConfiguration(i=>{i.hasChanged(34)&&this.onConfigurationChange()})),this._updateSoon=this._register(new ft(()=>this._update(!0),50)),this.onConfigurationChange()}onConfigurationChange(){if(this._editor.getOption(34).stickyScroll.enabled===!1){this.stickyScrollWidget.emptyRootNode(),this._editor.removeOverlayWidget(this.stickyScrollWidget),this._sessionStore.clear();return}else this._editor.addOverlayWidget(this.stickyScrollWidget),this._sessionStore.add(this._editor.onDidChangeModel(()=>this._update(!0))),this._sessionStore.add(this._editor.onDidScrollChange(()=>this._update(!1))),this._sessionStore.add(this._editor.onDidChangeHiddenAreas(()=>this._update(!0))),this._sessionStore.add(this._editor.onDidChangeModelTokens(t=>this._onTokensChange(t))),this._sessionStore.add(this._editor.onDidChangeModelContent(()=>this._updateSoon.schedule())),this._sessionStore.add(this._languageFeaturesService.documentSymbolProvider.onDidChange(()=>this._update(!0))),this._update(!0)}_needsUpdate(e){const t=this.stickyScrollWidget.getCurrentLines();for(const i of t)for(const n of e.ranges)if(i>=n.fromLineNumber&&i<=n.toLineNumber)return!0;return!1}_onTokensChange(e){this._needsUpdate(e)&&this._update(!1)}_update(e=!1){var t,i;return OA(this,void 0,void 0,function*(){e&&((t=this._cts)===null||t===void 0||t.dispose(!0),this._cts=new gn,yield this._updateOutlineModel(this._cts.token));const n=(i=this._editor._getViewModel())===null||i===void 0?void 0:i.getHiddenAreas();if(n)for(const s of n)this._ranges=this._ranges.filter(r=>!(r[0]>=s.startLineNumber&&r[1]<=s.endLineNumber+1));this._renderStickyScroll()})}_findLineRanges(e,t){if(e!=null&&e.children.size){let i=!1;for(const n of e==null?void 0:e.children.values()){const s=n.symbol.kind;(s===4||s===8||s===11||s===10||s===5||s===1)&&(i=!0,this._findLineRanges(n,t+1))}i||this._addOutlineRanges(e,t)}else this._addOutlineRanges(e,t)}_addOutlineRanges(e,t){let i=0,n=0;for(;e;){const s=e.symbol.kind;if((s===4||s===8||s===11||s===10||s===5||s===1)&&(i=e==null?void 0:e.symbol.range.startLineNumber,n=e==null?void 0:e.symbol.range.endLineNumber,this._ranges.push([i,n,t]),t--),e.parent instanceof zv)e=e.parent;else break}}_updateOutlineModel(e){return OA(this,void 0,void 0,function*(){if(this._editor.hasModel()){const t=this._editor.getModel(),i=t.getVersionId(),n=yield xa.create(this._languageFeaturesService.documentSymbolProvider,t,e);if(e.isCancellationRequested)return;this._ranges=[],this._rangesVersionId=i;for(const s of n.children.values()){if(s instanceof zv){const a=s.symbol.kind;a===4||a===8||a===11||a===10||a===5||a===1?this._findLineRanges(s,1):this._findLineRanges(s,0)}this._ranges=this._ranges.sort(function(a,l){return a[0]!==l[0]?a[0]-l[0]:a[1]!==l[1]?l[1]-a[1]:a[2]-l[2]});let r=[];for(const[a,l]of this._ranges.entries()){const[c,d,h]=l;r[0]===c&&r[1]===d?this._ranges.splice(a,1):r=l}}}})}_renderStickyScroll(){if(!this._editor.hasModel())return;const e=this._editor.getOption(61),t=this._editor.getModel();if(this._rangesVersionId!==t.getVersionId())return;const i=this._editor.getScrollTop();this.stickyScrollWidget.emptyRootNode();const n=new Set;for(const[s,r]of this._ranges.entries()){const[a,l,c]=r;if(l-a>0&&t.getLineContent(a)!==\"\"){const d=(c-1)*e,h=c*e,u=this._editor.getBottomForLineNumber(a)-i,g=this._editor.getTopForLineNumber(l)-i,f=this._editor.getBottomForLineNumber(l)-i;if(n.has(a))this._ranges.splice(s,1);else if(d>=g-1&&d<f-2){n.add(a),this.stickyScrollWidget.pushCodeLine(new FA(a,c,this._editor,-1,f-h));break}else h>u&&h<f-1&&(n.add(a),this.stickyScrollWidget.pushCodeLine(new FA(a,c,this._editor,0,0)))}}this.stickyScrollWidget.updateRootNode()}dispose(){super.dispose(),this._sessionStore.dispose()}};Nm.ID=\"store.contrib.stickyScrollController\";Nm=boe([voe(1,ue)],Nm);const PA=(YS=window.trustedTypes)===null||YS===void 0?void 0:YS.createPolicy(\"stickyScrollViewLayer\",{createHTML:o=>o});class FA{constructor(e,t,i,n,s){this._lineNumber=e,this._depth=t,this._editor=i,this._zIndex=n,this._relativePosition=s,this.effectiveLineHeight=0,this.effectiveLineHeight=this._editor.getOption(61)+this._relativePosition}get lineNumber(){return this._lineNumber}getDomNode(){const e=document.createElement(\"div\"),t=this._editor._getViewModel(),i=t.coordinatesConverter.convertModelPositionToViewPosition(new B(this._lineNumber,1)).lineNumber,n=t.getViewLineRenderingData(i);let s;try{s=es.filter(n.inlineDecorations,i,n.minColumn,n.maxColumn)}catch(u){s=[]}const r=new Dc(!0,!0,n.content,n.continuesWithWrappedLine,n.isBasicASCII,n.containsRTL,0,n.tokens,s,n.tabSize,n.startVisibleColumn,1,1,1,100,\"none\",!0,!0,null),a=lc(400);Ym(r,a);let l;PA?l=PA.createHTML(a.build()):l=a.build();const c=document.createElement(\"span\");c.style.backgroundColor=\"var(--vscode-editorStickyScroll-background)\",c.style.overflow=\"hidden\",c.style.whiteSpace=\"nowrap\",c.style.display=\"inline-block\",c.style.lineHeight=this._editor.getOption(61).toString()+\"px\",c.innerHTML=l;const d=document.createElement(\"span\");d.style.width=this._editor.getLayoutInfo().contentLeft.toString()+\"px\",d.style.backgroundColor=\"var(--vscode-editorStickyScroll-background)\",d.style.color=\"var(--vscode-editorLineNumber-foreground)\",d.style.display=\"inline-block\",d.style.lineHeight=this._editor.getOption(61).toString()+\"px\";const h=document.createElement(\"span\");return h.innerText=this._lineNumber.toString(),h.style.paddingLeft=this._editor.getLayoutInfo().lineNumbersLeft.toString()+\"px\",h.style.width=this._editor.getLayoutInfo().lineNumbersWidth.toString()+\"px\",h.style.backgroundColor=\"var(--vscode-editorStickyScroll-background)\",h.style.textAlign=\"right\",h.style.float=\"left\",h.style.lineHeight=this._editor.getOption(61).toString()+\"px\",d.appendChild(h),e.onclick=u=>{u.stopPropagation(),u.preventDefault(),this._editor.revealPosition({lineNumber:this._lineNumber-this._depth+1,column:1})},e.onmouseover=u=>{h.style.background=\"var(--vscode-editorStickyScrollHover-background)\",c.style.backgroundColor=\"var(--vscode-editorStickyScrollHover-background)\",d.style.backgroundColor=\"var(--vscode-editorStickyScrollHover-background)\",e.style.backgroundColor=\"var(--vscode-editorStickyScrollHover-background)\",h.style.cursor=\"pointer\",c.style.cursor=\"pointer\",e.style.cursor=\"pointer\",d.style.cursor=\"pointer\"},e.onmouseleave=u=>{h.style.background=\"var(--vscode-editorStickyScroll-background)\",c.style.backgroundColor=\"var(--vscode-editorStickyScroll-background)\",d.style.backgroundColor=\"var(--vscode-editorStickyScroll-background)\",e.style.backgroundColor=\"var(--vscode-editorStickyScroll-background)\"},this._editor.applyFontInfo(c),this._editor.applyFontInfo(h),e.appendChild(d),e.appendChild(c),e.style.zIndex=this._zIndex.toString(),e.style.backgroundColor=\"var(--vscode-editorStickyScroll-background)\",e.style.overflow=\"hidden\",e.style.whiteSpace=\"nowrap\",e.style.width=\"100%\",e.style.lineHeight=this._editor.getOption(61).toString()+\"px\",e.style.height=this._editor.getOption(61).toString()+\"px\",this._relativePosition&&(e.style.position=\"relative\",e.style.top=this._relativePosition+\"px\",e.style.width=\"100%\"),e}}class Coe{constructor(e){this._editor=e,this.arrayOfCodeLines=[],this.rootDomNode=document.createElement(\"div\"),this.rootDomNode=document.createElement(\"div\"),this.rootDomNode.style.width=\"100%\",this.rootDomNode.style.boxShadow=\"var(--vscode-scrollbar-shadow) 0 6px 6px -6px\"}getCurrentLines(){const e=[];for(const t of this.arrayOfCodeLines)e.push(t.lineNumber);return e}pushCodeLine(e){this.arrayOfCodeLines.push(e)}updateRootNode(){let e=0;for(const t of this.arrayOfCodeLines)e+=t.effectiveLineHeight,this.rootDomNode.appendChild(t.getDomNode());this.rootDomNode.style.height=e.toString()+\"px\"}emptyRootNode(){this.arrayOfCodeLines.length=0,Ii(this.rootDomNode)}getId(){return\"editor.contrib.stickyScrollWidget\"}getDomNode(){return this.rootDomNode.style.zIndex=\"2\",this.rootDomNode.style.backgroundColor=\"var(--vscode-editorStickyScroll-background)\",this.rootDomNode}getPosition(){return{preference:null}}}rt(Nm.ID,Nm);class woe{provideSelectionRanges(e,t){const i=[];for(const n of t){const s=[];i.push(s),this._addInWordRanges(s,e,n),this._addWordRanges(s,e,n),this._addWhitespaceLine(s,e,n),s.push({range:e.getFullModelRange()})}return i}_addInWordRanges(e,t,i){const n=t.getWordAtPosition(i);if(!n)return;const{word:s,startColumn:r}=n,a=i.column-r;let l=a,c=a,d=0;for(;l>=0;l--){const h=s.charCodeAt(l);if(l!==a&&(h===95||h===45))break;if(Ol(h)&&br(d))break;d=h}for(l+=1;c<s.length;c++){const h=s.charCodeAt(c);if(br(h)&&Ol(d))break;if(h===95||h===45)break;d=h}l<c&&e.push({range:new L(i.lineNumber,r+l,i.lineNumber,r+c)})}_addWordRanges(e,t,i){const n=t.getWordAtPosition(i);n&&e.push({range:new L(i.lineNumber,n.startColumn,i.lineNumber,n.endColumn)})}_addWhitespaceLine(e,t,i){t.getLineLength(i.lineNumber)>0&&t.getLineFirstNonWhitespaceColumn(i.lineNumber)===0&&t.getLineLastNonWhitespaceColumn(i.lineNumber)===0&&e.push({range:new L(i.lineNumber,1,i.lineNumber,t.getLineMaxColumn(i.lineNumber))})}}var Soe=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},yoe=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},Y1=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class mN{constructor(e,t){this.index=e,this.ranges=t}mov(e){const t=this.index+(e?1:-1);if(t<0||t>=this.ranges.length)return this;const i=new mN(t,this.ranges);return i.ranges[t].equalsRange(this.ranges[this.index])?i.mov(e):i}}let Ig=class C7{constructor(e,t){this._editor=e,this._languageFeaturesService=t,this._ignoreSelection=!1}static get(e){return e.getContribution(C7.ID)}dispose(){var e;(e=this._selectionListener)===null||e===void 0||e.dispose()}run(e){return Y1(this,void 0,void 0,function*(){if(!this._editor.hasModel())return;const t=this._editor.getSelections(),i=this._editor.getModel();if(this._state||(yield S7(this._languageFeaturesService.selectionRangeProvider,i,t.map(s=>s.getPosition()),this._editor.getOption(104),We.None).then(s=>{var r;if(!(!en(s)||s.length!==t.length)&&!(!this._editor.hasModel()||!ys(this._editor.getSelections(),t,(a,l)=>a.equalsSelection(l)))){for(let a=0;a<s.length;a++)s[a]=s[a].filter(l=>l.containsPosition(t[a].getStartPosition())&&l.containsPosition(t[a].getEndPosition())),s[a].unshift(t[a]);this._state=s.map(a=>new mN(0,a)),(r=this._selectionListener)===null||r===void 0||r.dispose(),this._selectionListener=this._editor.onDidChangeCursorPosition(()=>{var a;this._ignoreSelection||((a=this._selectionListener)===null||a===void 0||a.dispose(),this._state=void 0)})}})),!this._state)return;this._state=this._state.map(s=>s.mov(e));const n=this._state.map(s=>oe.fromPositions(s.ranges[s.index].getStartPosition(),s.ranges[s.index].getEndPosition()));this._ignoreSelection=!0;try{this._editor.setSelections(n)}finally{this._ignoreSelection=!1}})}};Ig.ID=\"editor.contrib.smartSelectController\";Ig=Soe([yoe(1,ue)],Ig);class w7 extends he{constructor(e,t){super(t),this._forward=e}run(e,t){return Y1(this,void 0,void 0,function*(){const i=Ig.get(t);i&&(yield i.run(this._forward))})}}class Loe extends w7{constructor(){super(!0,{id:\"editor.action.smartSelect.expand\",label:p(\"smartSelect.expand\",\"Expand Selection\"),alias:\"Expand Selection\",precondition:void 0,kbOpts:{kbExpr:T.editorTextFocus,primary:1553,mac:{primary:3345,secondary:[1297]},weight:100},menuOpts:{menuId:A.MenubarSelectionMenu,group:\"1_basic\",title:p({key:\"miSmartSelectGrow\",comment:[\"&& denotes a mnemonic\"]},\"&&Expand Selection\"),order:2}})}}Ye.registerCommandAlias(\"editor.action.smartSelect.grow\",\"editor.action.smartSelect.expand\");class Doe extends w7{constructor(){super(!1,{id:\"editor.action.smartSelect.shrink\",label:p(\"smartSelect.shrink\",\"Shrink Selection\"),alias:\"Shrink Selection\",precondition:void 0,kbOpts:{kbExpr:T.editorTextFocus,primary:1551,mac:{primary:3343,secondary:[1295]},weight:100},menuOpts:{menuId:A.MenubarSelectionMenu,group:\"1_basic\",title:p({key:\"miSmartSelectShrink\",comment:[\"&& denotes a mnemonic\"]},\"&&Shrink Selection\"),order:3}})}}rt(Ig.ID,Ig);te(Loe);te(Doe);function S7(o,e,t,i,n){return Y1(this,void 0,void 0,function*(){const s=o.all(e).concat(new woe);s.length===1&&s.unshift(new ps);const r=[],a=[];for(const l of s)r.push(Promise.resolve(l.provideSelectionRanges(e,t,n)).then(c=>{if(en(c)&&c.length===t.length)for(let d=0;d<t.length;d++){a[d]||(a[d]=[]);for(const h of c[d])L.isIRange(h.range)&&L.containsPosition(h.range,t[d])&&a[d].push(L.lift(h.range))}},Ai));return yield Promise.all(r),a.map(l=>{if(l.length===0)return[];l.sort((u,g)=>B.isBefore(u.getStartPosition(),g.getStartPosition())?1:B.isBefore(g.getStartPosition(),u.getStartPosition())||B.isBefore(u.getEndPosition(),g.getEndPosition())?-1:B.isBefore(g.getEndPosition(),u.getEndPosition())?1:0);const c=[];let d;for(const u of l)(!d||L.containsRange(u,d)&&!L.equalsRange(u,d))&&(c.push(u),d=u);if(!i.selectLeadingAndTrailingWhitespace)return c;const h=[c[0]];for(let u=1;u<c.length;u++){const g=c[u-1],f=c[u];if(f.startLineNumber!==g.startLineNumber||f.endLineNumber!==g.endLineNumber){const _=new L(g.startLineNumber,e.getLineFirstNonWhitespaceColumn(g.startLineNumber),g.endLineNumber,e.getLineLastNonWhitespaceColumn(g.endLineNumber));_.containsRange(g)&&!_.equalsRange(g)&&f.containsRange(_)&&!f.equalsRange(_)&&h.push(_);const b=new L(g.startLineNumber,1,g.endLineNumber,e.getLineMaxColumn(g.endLineNumber));b.containsRange(g)&&!b.equalsRange(_)&&f.containsRange(b)&&!f.equalsRange(b)&&h.push(b)}h.push(f)}return h})})}Ye.registerCommand(\"_executeSelectionRangeProvider\",function(o,...e){return Y1(this,void 0,void 0,function*(){const[t,i]=e;gt(me.isUri(t));const n=o.get(ue).selectionRangeProvider,s=yield o.get($n).createModelReference(t);try{return S7(n,s.object.textEditorModel,i,{selectLeadingAndTrailingWhitespace:!0},We.None)}finally{s.dispose()}})});var OD;(function(o){o[o.Unknown=0]=\"Unknown\",o[o.Disabled=1]=\"Disabled\",o[o.Enabled=2]=\"Enabled\"})(OD||(OD={}));var PD;(function(o){o[o.Invoke=1]=\"Invoke\",o[o.Auto=2]=\"Auto\"})(PD||(PD={}));var Zv;(function(o){o[o.KeepWhitespace=1]=\"KeepWhitespace\",o[o.InsertAsSnippet=4]=\"InsertAsSnippet\"})(Zv||(Zv={}));var FD;(function(o){o[o.Method=0]=\"Method\",o[o.Function=1]=\"Function\",o[o.Constructor=2]=\"Constructor\",o[o.Field=3]=\"Field\",o[o.Variable=4]=\"Variable\",o[o.Class=5]=\"Class\",o[o.Struct=6]=\"Struct\",o[o.Interface=7]=\"Interface\",o[o.Module=8]=\"Module\",o[o.Property=9]=\"Property\",o[o.Event=10]=\"Event\",o[o.Operator=11]=\"Operator\",o[o.Unit=12]=\"Unit\",o[o.Value=13]=\"Value\",o[o.Constant=14]=\"Constant\",o[o.Enum=15]=\"Enum\",o[o.EnumMember=16]=\"EnumMember\",o[o.Keyword=17]=\"Keyword\",o[o.Text=18]=\"Text\",o[o.Color=19]=\"Color\",o[o.File=20]=\"File\",o[o.Reference=21]=\"Reference\",o[o.Customcolor=22]=\"Customcolor\",o[o.Folder=23]=\"Folder\",o[o.TypeParameter=24]=\"TypeParameter\",o[o.User=25]=\"User\",o[o.Issue=26]=\"Issue\",o[o.Snippet=27]=\"Snippet\"})(FD||(FD={}));var BD;(function(o){o[o.Deprecated=1]=\"Deprecated\"})(BD||(BD={}));var WD;(function(o){o[o.Invoke=0]=\"Invoke\",o[o.TriggerCharacter=1]=\"TriggerCharacter\",o[o.TriggerForIncompleteCompletions=2]=\"TriggerForIncompleteCompletions\"})(WD||(WD={}));var VD;(function(o){o[o.EXACT=0]=\"EXACT\",o[o.ABOVE=1]=\"ABOVE\",o[o.BELOW=2]=\"BELOW\"})(VD||(VD={}));var HD;(function(o){o[o.NotSet=0]=\"NotSet\",o[o.ContentFlush=1]=\"ContentFlush\",o[o.RecoverFromMarkers=2]=\"RecoverFromMarkers\",o[o.Explicit=3]=\"Explicit\",o[o.Paste=4]=\"Paste\",o[o.Undo=5]=\"Undo\",o[o.Redo=6]=\"Redo\"})(HD||(HD={}));var zD;(function(o){o[o.LF=1]=\"LF\",o[o.CRLF=2]=\"CRLF\"})(zD||(zD={}));var UD;(function(o){o[o.Text=0]=\"Text\",o[o.Read=1]=\"Read\",o[o.Write=2]=\"Write\"})(UD||(UD={}));var $D;(function(o){o[o.None=0]=\"None\",o[o.Keep=1]=\"Keep\",o[o.Brackets=2]=\"Brackets\",o[o.Advanced=3]=\"Advanced\",o[o.Full=4]=\"Full\"})($D||($D={}));var jD;(function(o){o[o.acceptSuggestionOnCommitCharacter=0]=\"acceptSuggestionOnCommitCharacter\",o[o.acceptSuggestionOnEnter=1]=\"acceptSuggestionOnEnter\",o[o.accessibilitySupport=2]=\"accessibilitySupport\",o[o.accessibilityPageSize=3]=\"accessibilityPageSize\",o[o.ariaLabel=4]=\"ariaLabel\",o[o.autoClosingBrackets=5]=\"autoClosingBrackets\",o[o.autoClosingDelete=6]=\"autoClosingDelete\",o[o.autoClosingOvertype=7]=\"autoClosingOvertype\",o[o.autoClosingQuotes=8]=\"autoClosingQuotes\",o[o.autoIndent=9]=\"autoIndent\",o[o.automaticLayout=10]=\"automaticLayout\",o[o.autoSurround=11]=\"autoSurround\",o[o.bracketPairColorization=12]=\"bracketPairColorization\",o[o.guides=13]=\"guides\",o[o.codeLens=14]=\"codeLens\",o[o.codeLensFontFamily=15]=\"codeLensFontFamily\",o[o.codeLensFontSize=16]=\"codeLensFontSize\",o[o.colorDecorators=17]=\"colorDecorators\",o[o.columnSelection=18]=\"columnSelection\",o[o.comments=19]=\"comments\",o[o.contextmenu=20]=\"contextmenu\",o[o.copyWithSyntaxHighlighting=21]=\"copyWithSyntaxHighlighting\",o[o.cursorBlinking=22]=\"cursorBlinking\",o[o.cursorSmoothCaretAnimation=23]=\"cursorSmoothCaretAnimation\",o[o.cursorStyle=24]=\"cursorStyle\",o[o.cursorSurroundingLines=25]=\"cursorSurroundingLines\",o[o.cursorSurroundingLinesStyle=26]=\"cursorSurroundingLinesStyle\",o[o.cursorWidth=27]=\"cursorWidth\",o[o.disableLayerHinting=28]=\"disableLayerHinting\",o[o.disableMonospaceOptimizations=29]=\"disableMonospaceOptimizations\",o[o.domReadOnly=30]=\"domReadOnly\",o[o.dragAndDrop=31]=\"dragAndDrop\",o[o.dropIntoEditor=32]=\"dropIntoEditor\",o[o.emptySelectionClipboard=33]=\"emptySelectionClipboard\",o[o.experimental=34]=\"experimental\",o[o.extraEditorClassName=35]=\"extraEditorClassName\",o[o.fastScrollSensitivity=36]=\"fastScrollSensitivity\",o[o.find=37]=\"find\",o[o.fixedOverflowWidgets=38]=\"fixedOverflowWidgets\",o[o.folding=39]=\"folding\",o[o.foldingStrategy=40]=\"foldingStrategy\",o[o.foldingHighlight=41]=\"foldingHighlight\",o[o.foldingImportsByDefault=42]=\"foldingImportsByDefault\",o[o.foldingMaximumRegions=43]=\"foldingMaximumRegions\",o[o.unfoldOnClickAfterEndOfLine=44]=\"unfoldOnClickAfterEndOfLine\",o[o.fontFamily=45]=\"fontFamily\",o[o.fontInfo=46]=\"fontInfo\",o[o.fontLigatures=47]=\"fontLigatures\",o[o.fontSize=48]=\"fontSize\",o[o.fontWeight=49]=\"fontWeight\",o[o.formatOnPaste=50]=\"formatOnPaste\",o[o.formatOnType=51]=\"formatOnType\",o[o.glyphMargin=52]=\"glyphMargin\",o[o.gotoLocation=53]=\"gotoLocation\",o[o.hideCursorInOverviewRuler=54]=\"hideCursorInOverviewRuler\",o[o.hover=55]=\"hover\",o[o.inDiffEditor=56]=\"inDiffEditor\",o[o.inlineSuggest=57]=\"inlineSuggest\",o[o.letterSpacing=58]=\"letterSpacing\",o[o.lightbulb=59]=\"lightbulb\",o[o.lineDecorationsWidth=60]=\"lineDecorationsWidth\",o[o.lineHeight=61]=\"lineHeight\",o[o.lineNumbers=62]=\"lineNumbers\",o[o.lineNumbersMinChars=63]=\"lineNumbersMinChars\",o[o.linkedEditing=64]=\"linkedEditing\",o[o.links=65]=\"links\",o[o.matchBrackets=66]=\"matchBrackets\",o[o.minimap=67]=\"minimap\",o[o.mouseStyle=68]=\"mouseStyle\",o[o.mouseWheelScrollSensitivity=69]=\"mouseWheelScrollSensitivity\",o[o.mouseWheelZoom=70]=\"mouseWheelZoom\",o[o.multiCursorMergeOverlapping=71]=\"multiCursorMergeOverlapping\",o[o.multiCursorModifier=72]=\"multiCursorModifier\",o[o.multiCursorPaste=73]=\"multiCursorPaste\",o[o.occurrencesHighlight=74]=\"occurrencesHighlight\",o[o.overviewRulerBorder=75]=\"overviewRulerBorder\",o[o.overviewRulerLanes=76]=\"overviewRulerLanes\",o[o.padding=77]=\"padding\",o[o.parameterHints=78]=\"parameterHints\",o[o.peekWidgetDefaultFocus=79]=\"peekWidgetDefaultFocus\",o[o.definitionLinkOpensInPeek=80]=\"definitionLinkOpensInPeek\",o[o.quickSuggestions=81]=\"quickSuggestions\",o[o.quickSuggestionsDelay=82]=\"quickSuggestionsDelay\",o[o.readOnly=83]=\"readOnly\",o[o.renameOnType=84]=\"renameOnType\",o[o.renderControlCharacters=85]=\"renderControlCharacters\",o[o.renderFinalNewline=86]=\"renderFinalNewline\",o[o.renderLineHighlight=87]=\"renderLineHighlight\",o[o.renderLineHighlightOnlyWhenFocus=88]=\"renderLineHighlightOnlyWhenFocus\",o[o.renderValidationDecorations=89]=\"renderValidationDecorations\",o[o.renderWhitespace=90]=\"renderWhitespace\",o[o.revealHorizontalRightPadding=91]=\"revealHorizontalRightPadding\",o[o.roundedSelection=92]=\"roundedSelection\",o[o.rulers=93]=\"rulers\",o[o.scrollbar=94]=\"scrollbar\",o[o.scrollBeyondLastColumn=95]=\"scrollBeyondLastColumn\",o[o.scrollBeyondLastLine=96]=\"scrollBeyondLastLine\",o[o.scrollPredominantAxis=97]=\"scrollPredominantAxis\",o[o.selectionClipboard=98]=\"selectionClipboard\",o[o.selectionHighlight=99]=\"selectionHighlight\",o[o.selectOnLineNumbers=100]=\"selectOnLineNumbers\",o[o.showFoldingControls=101]=\"showFoldingControls\",o[o.showUnused=102]=\"showUnused\",o[o.snippetSuggestions=103]=\"snippetSuggestions\",o[o.smartSelect=104]=\"smartSelect\",o[o.smoothScrolling=105]=\"smoothScrolling\",o[o.stickyTabStops=106]=\"stickyTabStops\",o[o.stopRenderingLineAfter=107]=\"stopRenderingLineAfter\",o[o.suggest=108]=\"suggest\",o[o.suggestFontSize=109]=\"suggestFontSize\",o[o.suggestLineHeight=110]=\"suggestLineHeight\",o[o.suggestOnTriggerCharacters=111]=\"suggestOnTriggerCharacters\",o[o.suggestSelection=112]=\"suggestSelection\",o[o.tabCompletion=113]=\"tabCompletion\",o[o.tabIndex=114]=\"tabIndex\",o[o.unicodeHighlighting=115]=\"unicodeHighlighting\",o[o.unusualLineTerminators=116]=\"unusualLineTerminators\",o[o.useShadowDOM=117]=\"useShadowDOM\",o[o.useTabStops=118]=\"useTabStops\",o[o.wordSeparators=119]=\"wordSeparators\",o[o.wordWrap=120]=\"wordWrap\",o[o.wordWrapBreakAfterCharacters=121]=\"wordWrapBreakAfterCharacters\",o[o.wordWrapBreakBeforeCharacters=122]=\"wordWrapBreakBeforeCharacters\",o[o.wordWrapColumn=123]=\"wordWrapColumn\",o[o.wordWrapOverride1=124]=\"wordWrapOverride1\",o[o.wordWrapOverride2=125]=\"wordWrapOverride2\",o[o.wrappingIndent=126]=\"wrappingIndent\",o[o.wrappingStrategy=127]=\"wrappingStrategy\",o[o.showDeprecated=128]=\"showDeprecated\",o[o.inlayHints=129]=\"inlayHints\",o[o.editorClassName=130]=\"editorClassName\",o[o.pixelRatio=131]=\"pixelRatio\",o[o.tabFocusMode=132]=\"tabFocusMode\",o[o.layoutInfo=133]=\"layoutInfo\",o[o.wrappingInfo=134]=\"wrappingInfo\"})(jD||(jD={}));var KD;(function(o){o[o.TextDefined=0]=\"TextDefined\",o[o.LF=1]=\"LF\",o[o.CRLF=2]=\"CRLF\"})(KD||(KD={}));var qD;(function(o){o[o.LF=0]=\"LF\",o[o.CRLF=1]=\"CRLF\"})(qD||(qD={}));var GD;(function(o){o[o.None=0]=\"None\",o[o.Indent=1]=\"Indent\",o[o.IndentOutdent=2]=\"IndentOutdent\",o[o.Outdent=3]=\"Outdent\"})(GD||(GD={}));var ZD;(function(o){o[o.Both=0]=\"Both\",o[o.Right=1]=\"Right\",o[o.Left=2]=\"Left\",o[o.None=3]=\"None\"})(ZD||(ZD={}));var YD;(function(o){o[o.Type=1]=\"Type\",o[o.Parameter=2]=\"Parameter\"})(YD||(YD={}));var XD;(function(o){o[o.Automatic=0]=\"Automatic\",o[o.Explicit=1]=\"Explicit\"})(XD||(XD={}));var QD;(function(o){o[o.DependsOnKbLayout=-1]=\"DependsOnKbLayout\",o[o.Unknown=0]=\"Unknown\",o[o.Backspace=1]=\"Backspace\",o[o.Tab=2]=\"Tab\",o[o.Enter=3]=\"Enter\",o[o.Shift=4]=\"Shift\",o[o.Ctrl=5]=\"Ctrl\",o[o.Alt=6]=\"Alt\",o[o.PauseBreak=7]=\"PauseBreak\",o[o.CapsLock=8]=\"CapsLock\",o[o.Escape=9]=\"Escape\",o[o.Space=10]=\"Space\",o[o.PageUp=11]=\"PageUp\",o[o.PageDown=12]=\"PageDown\",o[o.End=13]=\"End\",o[o.Home=14]=\"Home\",o[o.LeftArrow=15]=\"LeftArrow\",o[o.UpArrow=16]=\"UpArrow\",o[o.RightArrow=17]=\"RightArrow\",o[o.DownArrow=18]=\"DownArrow\",o[o.Insert=19]=\"Insert\",o[o.Delete=20]=\"Delete\",o[o.Digit0=21]=\"Digit0\",o[o.Digit1=22]=\"Digit1\",o[o.Digit2=23]=\"Digit2\",o[o.Digit3=24]=\"Digit3\",o[o.Digit4=25]=\"Digit4\",o[o.Digit5=26]=\"Digit5\",o[o.Digit6=27]=\"Digit6\",o[o.Digit7=28]=\"Digit7\",o[o.Digit8=29]=\"Digit8\",o[o.Digit9=30]=\"Digit9\",o[o.KeyA=31]=\"KeyA\",o[o.KeyB=32]=\"KeyB\",o[o.KeyC=33]=\"KeyC\",o[o.KeyD=34]=\"KeyD\",o[o.KeyE=35]=\"KeyE\",o[o.KeyF=36]=\"KeyF\",o[o.KeyG=37]=\"KeyG\",o[o.KeyH=38]=\"KeyH\",o[o.KeyI=39]=\"KeyI\",o[o.KeyJ=40]=\"KeyJ\",o[o.KeyK=41]=\"KeyK\",o[o.KeyL=42]=\"KeyL\",o[o.KeyM=43]=\"KeyM\",o[o.KeyN=44]=\"KeyN\",o[o.KeyO=45]=\"KeyO\",o[o.KeyP=46]=\"KeyP\",o[o.KeyQ=47]=\"KeyQ\",o[o.KeyR=48]=\"KeyR\",o[o.KeyS=49]=\"KeyS\",o[o.KeyT=50]=\"KeyT\",o[o.KeyU=51]=\"KeyU\",o[o.KeyV=52]=\"KeyV\",o[o.KeyW=53]=\"KeyW\",o[o.KeyX=54]=\"KeyX\",o[o.KeyY=55]=\"KeyY\",o[o.KeyZ=56]=\"KeyZ\",o[o.Meta=57]=\"Meta\",o[o.ContextMenu=58]=\"ContextMenu\",o[o.F1=59]=\"F1\",o[o.F2=60]=\"F2\",o[o.F3=61]=\"F3\",o[o.F4=62]=\"F4\",o[o.F5=63]=\"F5\",o[o.F6=64]=\"F6\",o[o.F7=65]=\"F7\",o[o.F8=66]=\"F8\",o[o.F9=67]=\"F9\",o[o.F10=68]=\"F10\",o[o.F11=69]=\"F11\",o[o.F12=70]=\"F12\",o[o.F13=71]=\"F13\",o[o.F14=72]=\"F14\",o[o.F15=73]=\"F15\",o[o.F16=74]=\"F16\",o[o.F17=75]=\"F17\",o[o.F18=76]=\"F18\",o[o.F19=77]=\"F19\",o[o.NumLock=78]=\"NumLock\",o[o.ScrollLock=79]=\"ScrollLock\",o[o.Semicolon=80]=\"Semicolon\",o[o.Equal=81]=\"Equal\",o[o.Comma=82]=\"Comma\",o[o.Minus=83]=\"Minus\",o[o.Period=84]=\"Period\",o[o.Slash=85]=\"Slash\",o[o.Backquote=86]=\"Backquote\",o[o.BracketLeft=87]=\"BracketLeft\",o[o.Backslash=88]=\"Backslash\",o[o.BracketRight=89]=\"BracketRight\",o[o.Quote=90]=\"Quote\",o[o.OEM_8=91]=\"OEM_8\",o[o.IntlBackslash=92]=\"IntlBackslash\",o[o.Numpad0=93]=\"Numpad0\",o[o.Numpad1=94]=\"Numpad1\",o[o.Numpad2=95]=\"Numpad2\",o[o.Numpad3=96]=\"Numpad3\",o[o.Numpad4=97]=\"Numpad4\",o[o.Numpad5=98]=\"Numpad5\",o[o.Numpad6=99]=\"Numpad6\",o[o.Numpad7=100]=\"Numpad7\",o[o.Numpad8=101]=\"Numpad8\",o[o.Numpad9=102]=\"Numpad9\",o[o.NumpadMultiply=103]=\"NumpadMultiply\",o[o.NumpadAdd=104]=\"NumpadAdd\",o[o.NUMPAD_SEPARATOR=105]=\"NUMPAD_SEPARATOR\",o[o.NumpadSubtract=106]=\"NumpadSubtract\",o[o.NumpadDecimal=107]=\"NumpadDecimal\",o[o.NumpadDivide=108]=\"NumpadDivide\",o[o.KEY_IN_COMPOSITION=109]=\"KEY_IN_COMPOSITION\",o[o.ABNT_C1=110]=\"ABNT_C1\",o[o.ABNT_C2=111]=\"ABNT_C2\",o[o.AudioVolumeMute=112]=\"AudioVolumeMute\",o[o.AudioVolumeUp=113]=\"AudioVolumeUp\",o[o.AudioVolumeDown=114]=\"AudioVolumeDown\",o[o.BrowserSearch=115]=\"BrowserSearch\",o[o.BrowserHome=116]=\"BrowserHome\",o[o.BrowserBack=117]=\"BrowserBack\",o[o.BrowserForward=118]=\"BrowserForward\",o[o.MediaTrackNext=119]=\"MediaTrackNext\",o[o.MediaTrackPrevious=120]=\"MediaTrackPrevious\",o[o.MediaStop=121]=\"MediaStop\",o[o.MediaPlayPause=122]=\"MediaPlayPause\",o[o.LaunchMediaPlayer=123]=\"LaunchMediaPlayer\",o[o.LaunchMail=124]=\"LaunchMail\",o[o.LaunchApp2=125]=\"LaunchApp2\",o[o.Clear=126]=\"Clear\",o[o.MAX_VALUE=127]=\"MAX_VALUE\"})(QD||(QD={}));var JD;(function(o){o[o.Hint=1]=\"Hint\",o[o.Info=2]=\"Info\",o[o.Warning=4]=\"Warning\",o[o.Error=8]=\"Error\"})(JD||(JD={}));var ek;(function(o){o[o.Unnecessary=1]=\"Unnecessary\",o[o.Deprecated=2]=\"Deprecated\"})(ek||(ek={}));var tk;(function(o){o[o.Inline=1]=\"Inline\",o[o.Gutter=2]=\"Gutter\"})(tk||(tk={}));var ik;(function(o){o[o.UNKNOWN=0]=\"UNKNOWN\",o[o.TEXTAREA=1]=\"TEXTAREA\",o[o.GUTTER_GLYPH_MARGIN=2]=\"GUTTER_GLYPH_MARGIN\",o[o.GUTTER_LINE_NUMBERS=3]=\"GUTTER_LINE_NUMBERS\",o[o.GUTTER_LINE_DECORATIONS=4]=\"GUTTER_LINE_DECORATIONS\",o[o.GUTTER_VIEW_ZONE=5]=\"GUTTER_VIEW_ZONE\",o[o.CONTENT_TEXT=6]=\"CONTENT_TEXT\",o[o.CONTENT_EMPTY=7]=\"CONTENT_EMPTY\",o[o.CONTENT_VIEW_ZONE=8]=\"CONTENT_VIEW_ZONE\",o[o.CONTENT_WIDGET=9]=\"CONTENT_WIDGET\",o[o.OVERVIEW_RULER=10]=\"OVERVIEW_RULER\",o[o.SCROLLBAR=11]=\"SCROLLBAR\",o[o.OVERLAY_WIDGET=12]=\"OVERLAY_WIDGET\",o[o.OUTSIDE_EDITOR=13]=\"OUTSIDE_EDITOR\"})(ik||(ik={}));var nk;(function(o){o[o.TOP_RIGHT_CORNER=0]=\"TOP_RIGHT_CORNER\",o[o.BOTTOM_RIGHT_CORNER=1]=\"BOTTOM_RIGHT_CORNER\",o[o.TOP_CENTER=2]=\"TOP_CENTER\"})(nk||(nk={}));var sk;(function(o){o[o.Left=1]=\"Left\",o[o.Center=2]=\"Center\",o[o.Right=4]=\"Right\",o[o.Full=7]=\"Full\"})(sk||(sk={}));var ok;(function(o){o[o.Left=0]=\"Left\",o[o.Right=1]=\"Right\",o[o.None=2]=\"None\",o[o.LeftOfInjectedText=3]=\"LeftOfInjectedText\",o[o.RightOfInjectedText=4]=\"RightOfInjectedText\"})(ok||(ok={}));var rk;(function(o){o[o.Off=0]=\"Off\",o[o.On=1]=\"On\",o[o.Relative=2]=\"Relative\",o[o.Interval=3]=\"Interval\",o[o.Custom=4]=\"Custom\"})(rk||(rk={}));var ak;(function(o){o[o.None=0]=\"None\",o[o.Text=1]=\"Text\",o[o.Blocks=2]=\"Blocks\"})(ak||(ak={}));var lk;(function(o){o[o.Smooth=0]=\"Smooth\",o[o.Immediate=1]=\"Immediate\"})(lk||(lk={}));var ck;(function(o){o[o.Auto=1]=\"Auto\",o[o.Hidden=2]=\"Hidden\",o[o.Visible=3]=\"Visible\"})(ck||(ck={}));var dk;(function(o){o[o.LTR=0]=\"LTR\",o[o.RTL=1]=\"RTL\"})(dk||(dk={}));var hk;(function(o){o[o.Invoke=1]=\"Invoke\",o[o.TriggerCharacter=2]=\"TriggerCharacter\",o[o.ContentChange=3]=\"ContentChange\"})(hk||(hk={}));var uk;(function(o){o[o.File=0]=\"File\",o[o.Module=1]=\"Module\",o[o.Namespace=2]=\"Namespace\",o[o.Package=3]=\"Package\",o[o.Class=4]=\"Class\",o[o.Method=5]=\"Method\",o[o.Property=6]=\"Property\",o[o.Field=7]=\"Field\",o[o.Constructor=8]=\"Constructor\",o[o.Enum=9]=\"Enum\",o[o.Interface=10]=\"Interface\",o[o.Function=11]=\"Function\",o[o.Variable=12]=\"Variable\",o[o.Constant=13]=\"Constant\",o[o.String=14]=\"String\",o[o.Number=15]=\"Number\",o[o.Boolean=16]=\"Boolean\",o[o.Array=17]=\"Array\",o[o.Object=18]=\"Object\",o[o.Key=19]=\"Key\",o[o.Null=20]=\"Null\",o[o.EnumMember=21]=\"EnumMember\",o[o.Struct=22]=\"Struct\",o[o.Event=23]=\"Event\",o[o.Operator=24]=\"Operator\",o[o.TypeParameter=25]=\"TypeParameter\"})(uk||(uk={}));var gk;(function(o){o[o.Deprecated=1]=\"Deprecated\"})(gk||(gk={}));var fk;(function(o){o[o.Hidden=0]=\"Hidden\",o[o.Blink=1]=\"Blink\",o[o.Smooth=2]=\"Smooth\",o[o.Phase=3]=\"Phase\",o[o.Expand=4]=\"Expand\",o[o.Solid=5]=\"Solid\"})(fk||(fk={}));var pk;(function(o){o[o.Line=1]=\"Line\",o[o.Block=2]=\"Block\",o[o.Underline=3]=\"Underline\",o[o.LineThin=4]=\"LineThin\",o[o.BlockOutline=5]=\"BlockOutline\",o[o.UnderlineThin=6]=\"UnderlineThin\"})(pk||(pk={}));var mk;(function(o){o[o.AlwaysGrowsWhenTypingAtEdges=0]=\"AlwaysGrowsWhenTypingAtEdges\",o[o.NeverGrowsWhenTypingAtEdges=1]=\"NeverGrowsWhenTypingAtEdges\",o[o.GrowsOnlyWhenTypingBefore=2]=\"GrowsOnlyWhenTypingBefore\",o[o.GrowsOnlyWhenTypingAfter=3]=\"GrowsOnlyWhenTypingAfter\"})(mk||(mk={}));var _k;(function(o){o[o.None=0]=\"None\",o[o.Same=1]=\"Same\",o[o.Indent=2]=\"Indent\",o[o.DeepIndent=3]=\"DeepIndent\"})(_k||(_k={}));var _N=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Ed=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},koe=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class xoe{constructor(e,t,i,n,s,r){this.range=e,this.insertText=t,this.filterText=i,this.additionalTextEdits=n,this.command=s,this.completion=r}}let bk=class extends O8{constructor(e,t,i,n,s,r){super(s.disposable),this.model=e,this.line=t,this.word=i,this.completionModel=n,this._suggestMemoryService=r}canBeReused(e,t,i){return this.model===e&&this.line===t&&this.word.word.length>0&&this.word.startColumn===i.startColumn&&this.word.endColumn<i.endColumn&&this.completionModel.incomplete.size===0}get items(){var e;const t=[],{items:i}=this.completionModel,n=this._suggestMemoryService.select(this.model,{lineNumber:this.line,column:this.word.endColumn+this.completionModel.lineContext.characterCountDelta},i),s=Ue.slice(i,n),r=Ue.slice(i,0,n);let a=5;for(const l of Ue.concat(s,r)){if(l.score===jo.Default)continue;const c=new L(l.editStart.lineNumber,l.editStart.column,l.editInsertEnd.lineNumber,l.editInsertEnd.column+this.completionModel.lineContext.characterCountDelta),d=l.completion.insertTextRules&&l.completion.insertTextRules&Zv.InsertAsSnippet?{snippet:l.completion.insertText}:l.completion.insertText;t.push(new xoe(c,d,(e=l.filterTextLow)!==null&&e!==void 0?e:l.labelLow,l.completion.additionalTextEdits,l.completion.command,l)),a-->=0&&l.resolve(We.None)}return t}};bk=_N([Ed(5,W1)],bk);let vk=class{constructor(e,t,i,n){this._getEditorOption=e,this._languageFeatureService=t,this._clipboardService=i,this._suggestMemoryService=n}provideInlineCompletions(e,t,i,n){var s;return koe(this,void 0,void 0,function*(){if(i.selectedSuggestionInfo)return;const r=this._getEditorOption(81,e);if(wu.isAllOff(r))return;e.tokenization.tokenizeIfCheap(t.lineNumber);const a=e.tokenization.getLineTokens(t.lineNumber),l=a.getStandardTokenType(a.findTokenIndexAtOffset(Math.max(t.column-1-1,0)));if(wu.valueFor(r,l)!==\"inline\")return;let c=e.getWordAtPosition(t),d;if(c!=null&&c.word||(d=this._getTriggerCharacterInfo(e,t)),!(c!=null&&c.word)&&!d||(c||(c=e.getWordUntilPosition(t)),c.endColumn!==t.column))return;let h;const u=e.getValueInRange(new L(t.lineNumber,1,t.lineNumber,t.column));if(!d&&((s=this._lastResult)===null||s===void 0?void 0:s.canBeReused(e,t.lineNumber,c))){const g=new DA(u,t.column-this._lastResult.word.endColumn);this._lastResult.completionModel.lineContext=g,this._lastResult.acquire(),h=this._lastResult}else{const g=yield GE(this._languageFeatureService.completionProvider,e,t,new _m(void 0,void 0,d==null?void 0:d.providers),d&&{triggerKind:1,triggerCharacter:d.ch},n);let f;g.needsClipboard&&(f=yield this._clipboardService.readText());const _=new Nl(g.items,t.column,new DA(u,0),Oo.None,this._getEditorOption(108,e),this._getEditorOption(103,e),{boostFullMatch:!1,firstMatchCanBeWeak:!1},f);h=new bk(e,t.lineNumber,c,_,g,this._suggestMemoryService)}return this._lastResult=h,h})}handleItemDidShow(e,t){t.completion.resolve(We.None)}freeInlineCompletions(e){e.release()}_getTriggerCharacterInfo(e,t){var i;const n=e.getValueInRange(L.fromPositions({lineNumber:t.lineNumber,column:t.column-1},t)),s=new Set;for(const r of this._languageFeatureService.completionProvider.all(e))!((i=r.triggerCharacters)===null||i===void 0)&&i.includes(n)&&s.add(r);if(s.size!==0)return{providers:s,ch:n}}};vk=_N([Ed(1,ue),Ed(2,dl),Ed(3,W1)],vk);let Yv=class tu{constructor(e,t,i,n){if(++tu._counter===1){const s=n.createInstance(vk,(r,a)=>{var l;return((l=i.listCodeEditors().find(d=>d.getModel()===a))!==null&&l!==void 0?l:e).getOption(r)});tu._disposable=t.inlineCompletionsProvider.register(\"*\",s)}}dispose(){var e;--tu._counter===0&&((e=tu._disposable)===null||e===void 0||e.dispose(),tu._disposable=void 0)}};Yv._counter=0;Yv=_N([Ed(1,ue),Ed(2,dt),Ed(3,Re)],Yv);rt(\"suggest.inlineCompletionsProvider\",Yv);class Ioe extends he{constructor(){super({id:\"editor.action.forceRetokenize\",label:p(\"forceRetokenize\",\"Developer: Force Retokenize\"),alias:\"Developer: Force Retokenize\",precondition:void 0})}run(e,t){if(!t.hasModel())return;const i=t.getModel();i.tokenization.resetTokenization();const n=new Hn(!0);i.tokenization.forceTokenization(i.getLineCount()),n.stop(),console.log(`tokenization took ${n.elapsed()}`)}}te(Ioe);class X1 extends he{constructor(){super({id:X1.ID,label:p({key:\"toggle.tabMovesFocus\",comment:[\"Turn on/off use of tab key for moving focus around VS Code\"]},\"Toggle Tab Key Moves Focus\"),alias:\"Toggle Tab Key Moves Focus\",precondition:void 0,kbOpts:{kbExpr:null,primary:2091,mac:{primary:1323},weight:100}})}run(e,t){const n=!Z0.getTabFocusMode();Z0.setTabFocusMode(n),un(n?p(\"toggle.tabMovesFocus.on\",\"Pressing Tab will now move focus to the next focusable element\"):p(\"toggle.tabMovesFocus.off\",\"Pressing Tab will now insert the tab character\"))}}X1.ID=\"editor.action.toggleTabFocusMode\";te(X1);class bN{static computeUnicodeHighlights(e,t,i){const n=i?i.startLineNumber:1,s=i?i.endLineNumber:e.getLineCount(),r=new BA(t),a=r.getCandidateCodePoints();let l;a===\"allNonBasicAscii\"?l=new RegExp(\"[^\\\\t\\\\n\\\\r\\\\x20-\\\\x7E]\",\"g\"):l=new RegExp(`${Eoe(Array.from(a))}`,\"g\");const c=new _u(null,l),d=[];let h=!1,u,g=0,f=0,_=0;e:for(let b=n,v=s;b<=v;b++){const C=e.getLineContent(b),w=C.length;c.reset(0);do if(u=c.next(C),u){let S=u.index,k=u.index+u[0].length;if(S>0){const I=C.charCodeAt(S-1);wi(I)&&S--}if(k+1<w){const I=C.charCodeAt(k-1);wi(I)&&k++}const x=C.substring(S,k),y=Mp(S+1,eI,C,0),D=r.shouldHighlightNonBasicASCII(x,y?y.word:null);if(D!==0){D===3?g++:D===2?f++:D===1?_++:wC();const I=1e3;if(d.length>=I){h=!0;break e}d.push(new L(b,S+1,b,k+1))}}while(u)}return{ranges:d,hasMore:h,ambiguousCharacterCount:g,invisibleCharacterCount:f,nonBasicAsciiCharacterCount:_}}static computeUnicodeHighlightReason(e,t){const i=new BA(t);switch(i.shouldHighlightNonBasicASCII(e,null)){case 0:return null;case 2:return{kind:1};case 3:{const s=e.codePointAt(0),r=i.ambiguousCharacters.getPrimaryConfusable(s),a=bo.getLocales().filter(l=>!bo.getInstance(new Set([...t.allowedLocales,l])).isAmbiguous(s));return{kind:0,confusableWith:String.fromCodePoint(r),notAmbiguousInLocales:a}}case 1:return{kind:2}}}}function Eoe(o,e){return`[${Ds(o.map(i=>String.fromCodePoint(i)).join(\"\"))}]`}class BA{constructor(e){this.options=e,this.allowedCodePoints=new Set(e.allowedCodePoints),this.ambiguousCharacters=bo.getInstance(new Set(e.allowedLocales))}getCandidateCodePoints(){if(this.options.nonBasicASCII)return\"allNonBasicAscii\";const e=new Set;if(this.options.invisibleCharacters)for(const t of Br.codePoints)WA(String.fromCodePoint(t))||e.add(t);if(this.options.ambiguousCharacters)for(const t of this.ambiguousCharacters.getConfusableCodePoints())e.add(t);for(const t of this.allowedCodePoints)e.delete(t);return e}shouldHighlightNonBasicASCII(e,t){const i=e.codePointAt(0);if(this.allowedCodePoints.has(i))return 0;if(this.options.nonBasicASCII)return 1;let n=!1,s=!1;if(t)for(const r of t){const a=r.codePointAt(0),l=DC(r);n=n||l,!l&&!this.ambiguousCharacters.isAmbiguous(a)&&!Br.isInvisibleCharacter(a)&&(s=!0)}return!n&&s?0:this.options.invisibleCharacters&&!WA(e)&&Br.isInvisibleCharacter(i)?2:this.options.ambiguousCharacters&&this.ambiguousCharacters.isAmbiguous(i)?3:0}}function WA(o){return o===\" \"||o===`\n`||o===\"\t\"}var Noe=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Toe=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let Ck=class extends z{constructor(e,t,i={},n){var s;super(),this._link=t,this._enabled=!0,this.el=G(e,se(\"a.monaco-link\",{tabIndex:(s=t.tabIndex)!==null&&s!==void 0?s:0,href:t.href,title:t.title},t.label)),this.el.setAttribute(\"role\",\"button\");const r=this._register(new _t(this.el,\"click\")),a=this._register(new _t(this.el,\"keypress\")),l=pe.chain(a.event).map(h=>new Mt(h)).filter(h=>h.keyCode===3).event,c=this._register(new _t(this.el,kt.Tap)).event;this._register(ut.addTarget(this.el));const d=pe.any(r.event,l,c);this._register(d(h=>{!this.enabled||(ct.stop(h,!0),i!=null&&i.opener?i.opener(this._link.href):n.open(this._link.href,{allowCommands:!0}))})),this.enabled=!0}get enabled(){return this._enabled}set enabled(e){e?(this.el.setAttribute(\"aria-disabled\",\"false\"),this.el.tabIndex=0,this.el.style.pointerEvents=\"auto\",this.el.style.opacity=\"1\",this.el.style.cursor=\"pointer\",this._enabled=!1):(this.el.setAttribute(\"aria-disabled\",\"true\"),this.el.tabIndex=-1,this.el.style.pointerEvents=\"none\",this.el.style.opacity=\"0.4\",this.el.style.cursor=\"default\",this._enabled=!0),this._enabled=e}};Ck=Noe([Toe(3,So)],Ck);Rt((o,e)=>{const t=o.getColor(qC);t&&e.addRule(`.monaco-link { color: ${t}; }`);const i=o.getColor(GC);i&&e.addRule(`.monaco-link:hover { color: ${i}; }`)});var y7=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},L7=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const Moe=26;let wk=class extends z{constructor(e,t){super(),this._editor=e,this.instantiationService=t,this.banner=this._register(this.instantiationService.createInstance(Sk))}hide(){this._editor.setBanner(null,0),this.banner.clear()}show(e){this.banner.show(Object.assign(Object.assign({},e),{onClose:()=>{var t;this.hide(),(t=e.onClose)===null||t===void 0||t.call(e)}})),this._editor.setBanner(this.banner.element,Moe)}};wk=y7([L7(1,Re)],wk);let Sk=class extends z{constructor(e){super(),this.instantiationService=e,this.markdownRenderer=this.instantiationService.createInstance(sl,{}),this.element=se(\"div.editor-banner\"),this.element.tabIndex=0}getAriaLabel(e){if(e.ariaLabel)return e.ariaLabel;if(typeof e.message==\"string\")return e.message}getBannerMessage(e){if(typeof e==\"string\"){const t=se(\"span\");return t.innerText=e,t}return this.markdownRenderer.render(e).element}clear(){Ii(this.element)}show(e){Ii(this.element);const t=this.getAriaLabel(e);t&&this.element.setAttribute(\"aria-label\",t);const i=G(this.element,se(\"div.icon-container\"));i.setAttribute(\"aria-hidden\",\"true\"),e.icon&&i.appendChild(se(`div${nt.asCSSSelector(e.icon)}`));const n=G(this.element,se(\"div.message-container\"));if(n.setAttribute(\"aria-hidden\",\"true\"),n.appendChild(this.getBannerMessage(e.message)),this.messageActionsContainer=G(this.element,se(\"div.message-actions-container\")),e.actions)for(const r of e.actions)this._register(this.instantiationService.createInstance(Ck,this.messageActionsContainer,Object.assign(Object.assign({},r),{tabIndex:-1}),{}));const s=G(this.element,se(\"div.action-container\"));this.actionBar=this._register(new qr(s)),this.actionBar.push(this._register(new is(\"banner.close\",\"Close Banner\",nt.asClassName(b5),!0,()=>{typeof e.onClose==\"function\"&&e.onClose()})),{icon:!0,label:!1}),this.actionBar.setFocusable(!1)}};Sk=y7([L7(0,Re)],Sk);const D7=qe(\"workspaceTrustManagementService\");var vN=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},$u=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},Yi=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const Aoe=fi(\"extensions-warning-message\",m.warning,p(\"warningIcon\",\"Icon shown with a warning message in the extensions editor.\"));let Eg=class extends z{constructor(e,t,i,n){super(),this._editor=e,this._editorWorkerService=t,this._workspaceTrustService=i,this._highlighter=null,this._bannerClosed=!1,this._updateState=s=>{if(s&&s.hasMore){if(this._bannerClosed)return;const r=Math.max(s.ambiguousCharacterCount,s.nonBasicAsciiCharacterCount,s.invisibleCharacterCount);let a;if(s.nonBasicAsciiCharacterCount>=r)a={message:p(\"unicodeHighlighting.thisDocumentHasManyNonBasicAsciiUnicodeCharacters\",\"This document contains many non-basic ASCII unicode characters\"),command:new Jg};else if(s.ambiguousCharacterCount>=r)a={message:p(\"unicodeHighlighting.thisDocumentHasManyAmbiguousUnicodeCharacters\",\"This document contains many ambiguous unicode characters\"),command:new Nc};else if(s.invisibleCharacterCount>=r)a={message:p(\"unicodeHighlighting.thisDocumentHasManyInvisibleUnicodeCharacters\",\"This document contains many invisible unicode characters\"),command:new Qg};else throw new Error(\"Unreachable\");this._bannerController.show({id:\"unicodeHighlightBanner\",message:a.message,icon:Aoe,actions:[{label:a.command.shortLabel,href:`command:${a.command.id}`}],onClose:()=>{this._bannerClosed=!0}})}else this._bannerController.hide()},this._bannerController=this._register(n.createInstance(wk,e)),this._register(this._editor.onDidChangeModel(()=>{this._bannerClosed=!1,this._updateHighlighter()})),this._options=e.getOption(115),this._register(i.onDidChangeTrust(s=>{this._updateHighlighter()})),this._register(e.onDidChangeConfiguration(s=>{s.hasChanged(115)&&(this._options=e.getOption(115),this._updateHighlighter())})),this._updateHighlighter()}dispose(){this._highlighter&&(this._highlighter.dispose(),this._highlighter=null),super.dispose()}_updateHighlighter(){if(this._updateState(null),this._highlighter&&(this._highlighter.dispose(),this._highlighter=null),!this._editor.hasModel())return;const e=Roe(this._workspaceTrustService.isWorkspaceTrusted(),this._options);if([e.nonBasicASCII,e.ambiguousCharacters,e.invisibleCharacters].every(i=>i===!1))return;const t={nonBasicASCII:e.nonBasicASCII,ambiguousCharacters:e.ambiguousCharacters,invisibleCharacters:e.invisibleCharacters,includeComments:e.includeComments,includeStrings:e.includeStrings,allowedCodePoints:Object.keys(e.allowedCharacters).map(i=>i.codePointAt(0)),allowedLocales:Object.keys(e.allowedLocales).map(i=>i===\"_os\"?new Intl.NumberFormat().resolvedOptions().locale:i===\"_vscode\"?z8:i)};this._editorWorkerService.canComputeUnicodeHighlights(this._editor.getModel().uri)?this._highlighter=new yk(this._editor,t,this._updateState,this._editorWorkerService):this._highlighter=new Ooe(this._editor,t,this._updateState)}getDecorationInfo(e){return this._highlighter?this._highlighter.getDecorationInfo(e):null}};Eg.ID=\"editor.contrib.unicodeHighlighter\";Eg=vN([$u(1,Qs),$u(2,D7),$u(3,Re)],Eg);function Roe(o,e){return{nonBasicASCII:e.nonBasicASCII===fs?!o:e.nonBasicASCII,ambiguousCharacters:e.ambiguousCharacters,invisibleCharacters:e.invisibleCharacters,includeComments:e.includeComments===fs?!o:e.includeComments,includeStrings:e.includeStrings===fs?!o:e.includeStrings,allowedCharacters:e.allowedCharacters,allowedLocales:e.allowedLocales}}let yk=class extends z{constructor(e,t,i,n){super(),this._editor=e,this._options=t,this._updateState=i,this._editorWorkerService=n,this._model=this._editor.getModel(),this._decorations=this._editor.createDecorationsCollection(),this._updateSoon=this._register(new ft(()=>this._update(),250)),this._register(this._editor.onDidChangeModelContent(()=>{this._updateSoon.schedule()})),this._updateSoon.schedule()}dispose(){this._decorations.clear(),super.dispose()}_update(){if(this._model.isDisposed())return;if(!this._model.mightContainNonBasicASCII()){this._decorations.clear();return}const e=this._model.getVersionId();this._editorWorkerService.computedUnicodeHighlights(this._model.uri,this._options).then(t=>{if(this._model.isDisposed()||this._model.getVersionId()!==e)return;this._updateState(t);const i=[];if(!t.hasMore)for(const n of t.ranges)i.push({range:n,options:Xv.instance.getDecorationFromOptions(this._options)});this._decorations.set(i)})}getDecorationInfo(e){if(!this._decorations.has(e))return null;const t=this._editor.getModel();if(!qI(t,e))return null;const i=t.getValueInRange(e.range);return{reason:k7(i,this._options),inComment:GI(t,e),inString:ZI(t,e)}}};yk=vN([$u(3,Qs)],yk);class Ooe extends z{constructor(e,t,i){super(),this._editor=e,this._options=t,this._updateState=i,this._model=this._editor.getModel(),this._decorations=this._editor.createDecorationsCollection(),this._updateSoon=this._register(new ft(()=>this._update(),250)),this._register(this._editor.onDidLayoutChange(()=>{this._updateSoon.schedule()})),this._register(this._editor.onDidScrollChange(()=>{this._updateSoon.schedule()})),this._register(this._editor.onDidChangeHiddenAreas(()=>{this._updateSoon.schedule()})),this._register(this._editor.onDidChangeModelContent(()=>{this._updateSoon.schedule()})),this._updateSoon.schedule()}dispose(){this._decorations.clear(),super.dispose()}_update(){if(this._model.isDisposed())return;if(!this._model.mightContainNonBasicASCII()){this._decorations.clear();return}const e=this._editor.getVisibleRanges(),t=[],i={ranges:[],ambiguousCharacterCount:0,invisibleCharacterCount:0,nonBasicAsciiCharacterCount:0,hasMore:!1};for(const n of e){const s=bN.computeUnicodeHighlights(this._model,this._options,n);for(const r of s.ranges)i.ranges.push(r);i.ambiguousCharacterCount+=i.ambiguousCharacterCount,i.invisibleCharacterCount+=i.invisibleCharacterCount,i.nonBasicAsciiCharacterCount+=i.nonBasicAsciiCharacterCount,i.hasMore=i.hasMore||s.hasMore}if(!i.hasMore)for(const n of i.ranges)t.push({range:n,options:Xv.instance.getDecorationFromOptions(this._options)});this._updateState(i),this._decorations.set(t)}getDecorationInfo(e){if(!this._decorations.has(e))return null;const t=this._editor.getModel(),i=t.getValueInRange(e.range);return qI(t,e)?{reason:k7(i,this._options),inComment:GI(t,e),inString:ZI(t,e)}:null}}let Lk=class{constructor(e,t,i){this._editor=e,this._languageService=t,this._openerService=i,this.hoverOrdinal=4}computeSync(e,t){if(!this._editor.hasModel()||e.type!==1)return[];const i=this._editor.getModel(),n=this._editor.getContribution(Eg.ID);if(!n)return[];const s=[];let r=300;for(const a of t){const l=n.getDecorationInfo(a);if(!l)continue;const d=i.getValueInRange(a.range).codePointAt(0),h=VA(d);let u;switch(l.reason.kind){case 0:u=p(\"unicodeHighlight.characterIsAmbiguous\",\"The character {0} could be confused with the character {1}, which is more common in source code.\",h,VA(l.reason.confusableWith.codePointAt(0)));break;case 1:u=p(\"unicodeHighlight.characterIsInvisible\",\"The character {0} is invisible.\",h);break;case 2:u=p(\"unicodeHighlight.characterIsNonBasicAscii\",\"The character {0} is not a basic ASCII character.\",h);break}const g={codePoint:d,reason:l.reason,inComment:l.inComment,inString:l.inString},f=p(\"unicodeHighlight.adjustSettings\",\"Adjust settings\"),_=`command:${w_.ID}?${encodeURIComponent(JSON.stringify(g))}`,b=new Rn(\"\",!0).appendMarkdown(u).appendText(\" \").appendLink(_,f);s.push(new xr(this,a.range,[b],r++))}return s}renderHoverParts(e,t){return r3(e,t,this._editor,this._languageService,this._openerService)}};Lk=vN([$u(1,Ht),$u(2,So)],Lk);function Dk(o){return`U+${o.toString(16).padStart(4,\"0\")}`}function VA(o){let e=`\\`${Dk(o)}\\``;return Br.isInvisibleCharacter(o)||(e+=` \"${`${Poe(o)}`}\"`),e}function Poe(o){return o===96?\"`` ` ``\":\"`\"+String.fromCodePoint(o)+\"`\"}function k7(o,e){return bN.computeUnicodeHighlightReason(o,e)}class Xv{constructor(){this.map=new Map}getDecorationFromOptions(e){return this.getDecoration(!e.includeComments,!e.includeStrings)}getDecoration(e,t){const i=`${e}${t}`;let n=this.map.get(i);return n||(n=Ie.createDynamic({description:\"unicode-highlight\",stickiness:1,className:\"unicode-highlight\",showIfCollapsed:!0,overviewRuler:null,minimap:null,hideInCommentTokens:e,hideInStringTokens:t}),this.map.set(i,n)),n}}Xv.instance=new Xv;class Foe extends he{constructor(){super({id:Nc.ID,label:p(\"action.unicodeHighlight.disableHighlightingInComments\",\"Disable highlighting of characters in comments\"),alias:\"Disable highlighting of characters in comments\",precondition:void 0}),this.shortLabel=p(\"unicodeHighlight.disableHighlightingInComments.shortLabel\",\"Disable Highlight In Comments\")}run(e,t,i){return Yi(this,void 0,void 0,function*(){const n=e==null?void 0:e.get(ot);n&&this.runAction(n)})}runAction(e){return Yi(this,void 0,void 0,function*(){yield e.updateValue(Mn.includeComments,!1,2)})}}class Boe extends he{constructor(){super({id:Nc.ID,label:p(\"action.unicodeHighlight.disableHighlightingInStrings\",\"Disable highlighting of characters in strings\"),alias:\"Disable highlighting of characters in strings\",precondition:void 0}),this.shortLabel=p(\"unicodeHighlight.disableHighlightingInStrings.shortLabel\",\"Disable Highlight In Strings\")}run(e,t,i){return Yi(this,void 0,void 0,function*(){const n=e==null?void 0:e.get(ot);n&&this.runAction(n)})}runAction(e){return Yi(this,void 0,void 0,function*(){yield e.updateValue(Mn.includeStrings,!1,2)})}}class Nc extends he{constructor(){super({id:Nc.ID,label:p(\"action.unicodeHighlight.disableHighlightingOfAmbiguousCharacters\",\"Disable highlighting of ambiguous characters\"),alias:\"Disable highlighting of ambiguous characters\",precondition:void 0}),this.shortLabel=p(\"unicodeHighlight.disableHighlightingOfAmbiguousCharacters.shortLabel\",\"Disable Ambiguous Highlight\")}run(e,t,i){return Yi(this,void 0,void 0,function*(){const n=e==null?void 0:e.get(ot);n&&this.runAction(n)})}runAction(e){return Yi(this,void 0,void 0,function*(){yield e.updateValue(Mn.ambiguousCharacters,!1,2)})}}Nc.ID=\"editor.action.unicodeHighlight.disableHighlightingOfAmbiguousCharacters\";class Qg extends he{constructor(){super({id:Qg.ID,label:p(\"action.unicodeHighlight.disableHighlightingOfInvisibleCharacters\",\"Disable highlighting of invisible characters\"),alias:\"Disable highlighting of invisible characters\",precondition:void 0}),this.shortLabel=p(\"unicodeHighlight.disableHighlightingOfInvisibleCharacters.shortLabel\",\"Disable Invisible Highlight\")}run(e,t,i){return Yi(this,void 0,void 0,function*(){const n=e==null?void 0:e.get(ot);n&&this.runAction(n)})}runAction(e){return Yi(this,void 0,void 0,function*(){yield e.updateValue(Mn.invisibleCharacters,!1,2)})}}Qg.ID=\"editor.action.unicodeHighlight.disableHighlightingOfInvisibleCharacters\";class Jg extends he{constructor(){super({id:Jg.ID,label:p(\"action.unicodeHighlight.disableHighlightingOfNonBasicAsciiCharacters\",\"Disable highlighting of non basic ASCII characters\"),alias:\"Disable highlighting of non basic ASCII characters\",precondition:void 0}),this.shortLabel=p(\"unicodeHighlight.disableHighlightingOfNonBasicAsciiCharacters.shortLabel\",\"Disable Non ASCII Highlight\")}run(e,t,i){return Yi(this,void 0,void 0,function*(){const n=e==null?void 0:e.get(ot);n&&this.runAction(n)})}runAction(e){return Yi(this,void 0,void 0,function*(){yield e.updateValue(Mn.nonBasicASCII,!1,2)})}}Jg.ID=\"editor.action.unicodeHighlight.disableHighlightingOfNonBasicAsciiCharacters\";class w_ extends he{constructor(){super({id:w_.ID,label:p(\"action.unicodeHighlight.showExcludeOptions\",\"Show Exclude Options\"),alias:\"Show Exclude Options\",precondition:void 0})}run(e,t,i){return Yi(this,void 0,void 0,function*(){const{codePoint:n,reason:s,inString:r,inComment:a}=i,l=String.fromCodePoint(n),c=e.get(c_),d=e.get(ot);function h(f){return Br.isInvisibleCharacter(f)?p(\"unicodeHighlight.excludeInvisibleCharFromBeingHighlighted\",\"Exclude {0} (invisible character) from being highlighted\",Dk(f)):p(\"unicodeHighlight.excludeCharFromBeingHighlighted\",\"Exclude {0} from being highlighted\",`${Dk(f)} \"${l}\"`)}const u=[];if(s.kind===0)for(const f of s.notAmbiguousInLocales)u.push({label:p(\"unicodeHighlight.allowCommonCharactersInLanguage\",'Allow unicode characters that are more common in the language \"{0}\".',f),run:()=>Yi(this,void 0,void 0,function*(){Voe(d,[f])})});if(u.push({label:h(n),run:()=>Woe(d,[n])}),a){const f=new Foe;u.push({label:f.label,run:()=>Yi(this,void 0,void 0,function*(){return f.runAction(d)})})}else if(r){const f=new Boe;u.push({label:f.label,run:()=>Yi(this,void 0,void 0,function*(){return f.runAction(d)})})}if(s.kind===0){const f=new Nc;u.push({label:f.label,run:()=>Yi(this,void 0,void 0,function*(){return f.runAction(d)})})}else if(s.kind===1){const f=new Qg;u.push({label:f.label,run:()=>Yi(this,void 0,void 0,function*(){return f.runAction(d)})})}else if(s.kind===2){const f=new Jg;u.push({label:f.label,run:()=>Yi(this,void 0,void 0,function*(){return f.runAction(d)})})}else Hoe(s);const g=yield c.pick(u,{title:p(\"unicodeHighlight.configureUnicodeHighlightOptions\",\"Configure Unicode Highlight Options\")});g&&(yield g.run())})}}w_.ID=\"editor.action.unicodeHighlight.showExcludeOptions\";function Woe(o,e){return Yi(this,void 0,void 0,function*(){const t=o.getValue(Mn.allowedCharacters);let i;typeof t==\"object\"&&t?i=t:i={};for(const n of e)i[String.fromCodePoint(n)]=!0;yield o.updateValue(Mn.allowedCharacters,i,2)})}function Voe(o,e){var t;return Yi(this,void 0,void 0,function*(){const i=(t=o.inspect(Mn.allowedLocales).user)===null||t===void 0?void 0:t.value;let n;typeof i==\"object\"&&i?n=Object.assign({},i):n={};for(const s of e)n[s]=!0;yield o.updateValue(Mn.allowedLocales,n,2)})}function Hoe(o){throw new Error(`Unexpected value: ${o}`)}te(Nc);te(Qg);te(Jg);te(w_);rt(Eg.ID,Eg);xh.register(Lk);const CN=qe(\"dialogService\");var zoe=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},HA=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},Uoe=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const x7=\"ignoreUnusualLineTerminators\";function $oe(o,e,t){o.setModelProperty(e.uri,x7,t)}function joe(o,e){return o.getModelProperty(e.uri,x7)}let Tm=class extends z{constructor(e,t,i){super(),this._editor=e,this._dialogService=t,this._codeEditorService=i,this._config=this._editor.getOption(116),this._register(this._editor.onDidChangeConfiguration(n=>{n.hasChanged(116)&&(this._config=this._editor.getOption(116),this._checkForUnusualLineTerminators())})),this._register(this._editor.onDidChangeModel(()=>{this._checkForUnusualLineTerminators()})),this._register(this._editor.onDidChangeModelContent(n=>{n.isUndoing||this._checkForUnusualLineTerminators()}))}_checkForUnusualLineTerminators(){return Uoe(this,void 0,void 0,function*(){if(this._config===\"off\"||!this._editor.hasModel())return;const e=this._editor.getModel();if(!e.mightContainUnusualLineTerminators()||joe(this._codeEditorService,e)===!0||this._editor.getOption(83))return;if(this._config===\"auto\"){e.removeUnusualLineTerminators(this._editor.getSelections());return}if(!(yield this._dialogService.confirm({title:p(\"unusualLineTerminators.title\",\"Unusual Line Terminators\"),message:p(\"unusualLineTerminators.message\",\"Detected unusual line terminators\"),detail:p(\"unusualLineTerminators.detail\",\"The file '{0}' contains one or more unusual line terminator characters, like Line Separator (LS) or Paragraph Separator (PS).\\n\\nIt is recommended to remove them from the file. This can be configured via `editor.unusualLineTerminators`.\",Ys(e.uri)),primaryButton:p(\"unusualLineTerminators.fix\",\"Remove Unusual Line Terminators\"),secondaryButton:p(\"unusualLineTerminators.ignore\",\"Ignore\")})).confirmed){$oe(this._codeEditorService,e,!0);return}e.removeUnusualLineTerminators(this._editor.getSelections())})}};Tm.ID=\"editor.contrib.unusualLineTerminatorsDetector\";Tm=zoe([HA(1,CN),HA(2,dt)],Tm);rt(Tm.ID,Tm);function Koe(o){for(let e=0,t=o.length;e<t;e+=4){const i=o[e+0],n=o[e+1],s=o[e+2],r=o[e+3];o[e+0]=r,o[e+1]=s,o[e+2]=n,o[e+3]=i}}function qoe(o){const e=new Uint8Array(o.buffer,o.byteOffset,o.length*4);return fO()||Koe(e),VC.wrap(e)}function I7(o){const e=new Uint32Array(Goe(o));let t=0;if(e[t++]=o.id,o.type===\"full\")e[t++]=1,e[t++]=o.data.length,e.set(o.data,t),t+=o.data.length;else{e[t++]=2,e[t++]=o.deltas.length;for(const i of o.deltas)e[t++]=i.start,e[t++]=i.deleteCount,i.data?(e[t++]=i.data.length,e.set(i.data,t),t+=i.data.length):e[t++]=0}return qoe(e)}function Goe(o){let e=0;if(e+=1+1,o.type===\"full\")e+=1+o.data.length;else{e+=1,e+=(1+1+1)*o.deltas.length;for(const t of o.deltas)t.data&&(e+=t.data.length)}return e}var Sc=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};function Q1(o){return o&&!!o.data}function E7(o){return o&&Array.isArray(o.edits)}class Zoe{constructor(e,t,i){this.provider=e,this.tokens=t,this.error=i}}function N7(o,e){return o.has(e)}function Yoe(o,e){const t=o.orderedGroups(e);return t.length>0?t[0]:[]}function T7(o,e,t,i,n){return Sc(this,void 0,void 0,function*(){const s=Yoe(o,e),r=yield Promise.all(s.map(a=>Sc(this,void 0,void 0,function*(){let l,c=null;try{l=yield a.provideDocumentSemanticTokens(e,a===t?i:null,n)}catch(d){c=d,l=null}return(!l||!Q1(l)&&!E7(l))&&(l=null),new Zoe(a,l,c)})));for(const a of r){if(a.error)throw a.error;if(a.tokens)return a}return r.length>0?r[0]:null})}function Xoe(o,e){const t=o.orderedGroups(e);return t.length>0?t[0]:null}class Qoe{constructor(e,t){this.provider=e,this.tokens=t}}function Joe(o,e){return o.has(e)}function M7(o,e){const t=o.orderedGroups(e);return t.length>0?t[0]:[]}function wN(o,e,t,i){return Sc(this,void 0,void 0,function*(){const n=M7(o,e),s=yield Promise.all(n.map(r=>Sc(this,void 0,void 0,function*(){let a;try{a=yield r.provideDocumentRangeSemanticTokens(e,t,i)}catch(l){Ai(l),a=null}return(!a||!Q1(a))&&(a=null),new Qoe(r,a)})));for(const r of s)if(r.tokens)return r;return s.length>0?s[0]:null})}Ye.registerCommand(\"_provideDocumentSemanticTokensLegend\",(o,...e)=>Sc(void 0,void 0,void 0,function*(){const[t]=e;gt(t instanceof me);const i=o.get(Bt).getModel(t);if(!i)return;const{documentSemanticTokensProvider:n}=o.get(ue),s=Xoe(n,i);return s?s[0].getLegend():o.get(Ci).executeCommand(\"_provideDocumentRangeSemanticTokensLegend\",t)}));Ye.registerCommand(\"_provideDocumentSemanticTokens\",(o,...e)=>Sc(void 0,void 0,void 0,function*(){const[t]=e;gt(t instanceof me);const i=o.get(Bt).getModel(t);if(!i)return;const{documentSemanticTokensProvider:n}=o.get(ue);if(!N7(n,i))return o.get(Ci).executeCommand(\"_provideDocumentRangeSemanticTokens\",t,i.getFullModelRange());const s=yield T7(n,i,null,null,We.None);if(!s)return;const{provider:r,tokens:a}=s;if(!a||!Q1(a))return;const l=I7({id:0,type:\"full\",data:a.data});return a.resultId&&r.releaseDocumentSemanticTokens(a.resultId),l}));Ye.registerCommand(\"_provideDocumentRangeSemanticTokensLegend\",(o,...e)=>Sc(void 0,void 0,void 0,function*(){const[t,i]=e;gt(t instanceof me);const n=o.get(Bt).getModel(t);if(!n)return;const{documentRangeSemanticTokensProvider:s}=o.get(ue),r=M7(s,n);if(r.length===0)return;if(r.length===1)return r[0].getLegend();if(!i||!L.isIRange(i))return console.warn(\"provideDocumentRangeSemanticTokensLegend might be out-of-sync with provideDocumentRangeSemanticTokens unless a range argument is passed in\"),r[0].getLegend();const a=yield wN(s,n,L.lift(i),We.None);if(!!a)return a.provider.getLegend()}));Ye.registerCommand(\"_provideDocumentRangeSemanticTokens\",(o,...e)=>Sc(void 0,void 0,void 0,function*(){const[t,i]=e;gt(t instanceof me),gt(L.isIRange(i));const n=o.get(Bt).getModel(t);if(!n)return;const{documentRangeSemanticTokensProvider:s}=o.get(ue),r=yield wN(s,n,L.lift(i),We.None);if(!(!r||!r.tokens))return I7({id:0,type:\"full\",data:r.tokens.data})}));class bp{constructor(e,t){this._startLineNumber=e,this._tokens=t,this._endLineNumber=this._startLineNumber+this._tokens.getMaxDeltaLine()}static create(e,t){return new bp(e,new Qv(t))}get startLineNumber(){return this._startLineNumber}get endLineNumber(){return this._endLineNumber}toString(){return this._tokens.toString(this._startLineNumber)}_updateEndLineNumber(){this._endLineNumber=this._startLineNumber+this._tokens.getMaxDeltaLine()}isEmpty(){return this._tokens.isEmpty()}getLineTokens(e){return this._startLineNumber<=e&&e<=this._endLineNumber?this._tokens.getLineTokens(e-this._startLineNumber):null}getRange(){const e=this._tokens.getRange();return e&&new L(this._startLineNumber+e.startLineNumber,e.startColumn,this._startLineNumber+e.endLineNumber,e.endColumn)}removeTokens(e){const t=e.startLineNumber-this._startLineNumber,i=e.endLineNumber-this._startLineNumber;this._startLineNumber+=this._tokens.removeTokens(t,e.startColumn-1,i,e.endColumn-1),this._updateEndLineNumber()}split(e){const t=e.startLineNumber-this._startLineNumber,i=e.endLineNumber-this._startLineNumber,[n,s,r]=this._tokens.split(t,e.startColumn-1,i,e.endColumn-1);return[new bp(this._startLineNumber,n),new bp(this._startLineNumber+r,s)]}applyEdit(e,t){const[i,n,s]=Ud(t);this.acceptEdit(e,i,n,s,t.length>0?t.charCodeAt(0):0)}acceptEdit(e,t,i,n,s){this._acceptDeleteRange(e),this._acceptInsertText(new B(e.startLineNumber,e.startColumn),t,i,n,s),this._updateEndLineNumber()}_acceptDeleteRange(e){if(e.startLineNumber===e.endLineNumber&&e.startColumn===e.endColumn)return;const t=e.startLineNumber-this._startLineNumber,i=e.endLineNumber-this._startLineNumber;if(i<0){const s=i-t;this._startLineNumber-=s;return}const n=this._tokens.getMaxDeltaLine();if(!(t>=n+1)){if(t<0&&i>=n+1){this._startLineNumber=0,this._tokens.clear();return}if(t<0){const s=-t;this._startLineNumber-=s,this._tokens.acceptDeleteRange(e.startColumn-1,0,0,i,e.endColumn-1)}else this._tokens.acceptDeleteRange(0,t,e.startColumn-1,i,e.endColumn-1)}}_acceptInsertText(e,t,i,n,s){if(t===0&&i===0)return;const r=e.lineNumber-this._startLineNumber;if(r<0){this._startLineNumber+=t;return}const a=this._tokens.getMaxDeltaLine();r>=a+1||this._tokens.acceptInsertText(r,e.column-1,t,i,n,s)}}class Qv{constructor(e){this._tokens=e,this._tokenCount=e.length/4}toString(e){const t=[];for(let i=0;i<this._tokenCount;i++)t.push(`(${this._getDeltaLine(i)+e},${this._getStartCharacter(i)}-${this._getEndCharacter(i)})`);return`[${t.join(\",\")}]`}getMaxDeltaLine(){const e=this._getTokenCount();return e===0?-1:this._getDeltaLine(e-1)}getRange(){const e=this._getTokenCount();if(e===0)return null;const t=this._getStartCharacter(0),i=this._getDeltaLine(e-1),n=this._getEndCharacter(e-1);return new L(0,t+1,i,n+1)}_getTokenCount(){return this._tokenCount}_getDeltaLine(e){return this._tokens[4*e]}_getStartCharacter(e){return this._tokens[4*e+1]}_getEndCharacter(e){return this._tokens[4*e+2]}isEmpty(){return this._getTokenCount()===0}getLineTokens(e){let t=0,i=this._getTokenCount()-1;for(;t<i;){const n=t+Math.floor((i-t)/2),s=this._getDeltaLine(n);if(s<e)t=n+1;else if(s>e)i=n-1;else{let r=n;for(;r>t&&this._getDeltaLine(r-1)===e;)r--;let a=n;for(;a<i&&this._getDeltaLine(a+1)===e;)a++;return new zA(this._tokens.subarray(4*r,4*a+4))}}return this._getDeltaLine(t)===e?new zA(this._tokens.subarray(4*t,4*t+4)):null}clear(){this._tokenCount=0}removeTokens(e,t,i,n){const s=this._tokens,r=this._tokenCount;let a=0,l=!1,c=0;for(let d=0;d<r;d++){const h=4*d,u=s[h],g=s[h+1],f=s[h+2],_=s[h+3];if((u>e||u===e&&f>=t)&&(u<i||u===i&&g<=n))l=!0;else{if(a===0&&(c=u),l){const b=4*a;s[b]=u-c,s[b+1]=g,s[b+2]=f,s[b+3]=_}a++}}return this._tokenCount=a,c}split(e,t,i,n){const s=this._tokens,r=this._tokenCount,a=[],l=[];let c=a,d=0,h=0;for(let u=0;u<r;u++){const g=4*u,f=s[g],_=s[g+1],b=s[g+2],v=s[g+3];if(f>e||f===e&&b>=t){if(f<i||f===i&&_<=n)continue;c!==l&&(c=l,d=0,h=f)}c[d++]=f-h,c[d++]=_,c[d++]=b,c[d++]=v}return[new Qv(new Uint32Array(a)),new Qv(new Uint32Array(l)),h]}acceptDeleteRange(e,t,i,n,s){const r=this._tokens,a=this._tokenCount,l=n-t;let c=0,d=!1;for(let h=0;h<a;h++){const u=4*h;let g=r[u],f=r[u+1],_=r[u+2];const b=r[u+3];if(g<t||g===t&&_<=i){c++;continue}else if(g===t&&f<i)g===n&&_>s?_-=s-i:_=i;else if(g===t&&f===i)if(g===n&&_>s)_-=s-i;else{d=!0;continue}else if(g<n||g===n&&f<s)if(g===n&&_>s)g===t?(f=i,_=f+(_-s)):(f=0,_=f+(_-s));else{d=!0;continue}else if(g>n){if(l===0&&!d){c=a;break}g-=l}else if(g===n&&f>=s)e&&g===0&&(f+=e,_+=e),g-=l,f-=s-i,_-=s-i;else throw new Error(\"Not possible!\");const v=4*c;r[v]=g,r[v+1]=f,r[v+2]=_,r[v+3]=b,c++}this._tokenCount=c}acceptInsertText(e,t,i,n,s,r){const a=i===0&&n===1&&(r>=48&&r<=57||r>=65&&r<=90||r>=97&&r<=122),l=this._tokens,c=this._tokenCount;for(let d=0;d<c;d++){const h=4*d;let u=l[h],g=l[h+1],f=l[h+2];if(!(u<e||u===e&&f<t)){if(u===e&&f===t)if(a)f+=1;else continue;else if(u===e&&g<t&&t<f)i===0?f+=n:f=t;else{if(u===e&&g===t&&a)continue;if(u===e)if(u+=i,i===0)g+=n,f+=n;else{const _=f-g;g=s+(g-t),f=g+_}else u+=i}l[h]=u,l[h+1]=g,l[h+2]=f}}}}class zA{constructor(e){this._tokens=e}getCount(){return this._tokens.length/4}getStartCharacter(e){return this._tokens[4*e+1]}getEndCharacter(e){return this._tokens[4*e+2]}getMetadata(e){return this._tokens[4*e+3]}}var ere=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},XS=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let kk=class{constructor(e,t,i,n){this._legend=e,this._themeService=t,this._languageService=i,this._logService=n,this._hasWarnedOverlappingTokens=!1,this._hasWarnedInvalidLengthTokens=!1,this._hasWarnedInvalidEditStart=!1,this._hashTable=new Ea}getMetadata(e,t,i){const n=this._languageService.languageIdCodec.encodeLanguageId(i),s=this._hashTable.get(e,t,n);let r;if(s)r=s.metadata,this._logService.getLevel()===Fo.Trace&&this._logService.trace(`SemanticTokensProviderStyling [CACHED] ${e} / ${t}: foreground ${Yn.getForeground(r)}, fontStyle ${Yn.getFontStyle(r).toString(2)}`);else{let a=this._legend.tokenTypes[e];const l=[];if(a){let c=t;for(let h=0;c>0&&h<this._legend.tokenModifiers.length;h++)c&1&&l.push(this._legend.tokenModifiers[h]),c=c>>1;c>0&&this._logService.getLevel()===Fo.Trace&&(this._logService.trace(`SemanticTokensProviderStyling: unknown token modifier index: ${t.toString(2)} for legend: ${JSON.stringify(this._legend.tokenModifiers)}`),l.push(\"not-in-legend\"));const d=this._themeService.getColorTheme().getTokenStyleMetadata(a,l,i);typeof d==\"undefined\"?r=2147483647:(r=0,typeof d.italic!=\"undefined\"&&(r|=(d.italic?1:0)<<11|1),typeof d.bold!=\"undefined\"&&(r|=(d.bold?2:0)<<11|2),typeof d.underline!=\"undefined\"&&(r|=(d.underline?4:0)<<11|4),typeof d.strikethrough!=\"undefined\"&&(r|=(d.strikethrough?8:0)<<11|8),d.foreground&&(r|=d.foreground<<15|16),r===0&&(r=2147483647))}else this._logService.getLevel()===Fo.Trace&&this._logService.trace(`SemanticTokensProviderStyling: unknown token type index: ${e} for legend: ${JSON.stringify(this._legend.tokenTypes)}`),r=2147483647,a=\"not-in-legend\";this._hashTable.add(e,t,n,r),this._logService.getLevel()===Fo.Trace&&this._logService.trace(`SemanticTokensProviderStyling ${e} (${a}) / ${t} (${l.join(\" \")}): foreground ${Yn.getForeground(r)}, fontStyle ${Yn.getFontStyle(r).toString(2)}`)}return r}warnOverlappingSemanticTokens(e,t){this._hasWarnedOverlappingTokens||(this._hasWarnedOverlappingTokens=!0,console.warn(`Overlapping semantic tokens detected at lineNumber ${e}, column ${t}`))}warnInvalidLengthSemanticTokens(e,t){this._hasWarnedInvalidLengthTokens||(this._hasWarnedInvalidLengthTokens=!0,console.warn(`Semantic token with invalid length detected at lineNumber ${e}, column ${t}`))}warnInvalidEditStart(e,t,i,n,s){this._hasWarnedInvalidEditStart||(this._hasWarnedInvalidEditStart=!0,console.warn(`Invalid semantic tokens edit detected (previousResultId: ${e}, resultId: ${t}) at edit #${i}: The provided start offset ${n} is outside the previous data (length ${s}).`))}};kk=ere([XS(1,vt),XS(2,Ht),XS(3,Co)],kk);function A7(o,e,t){const i=o.data,n=o.data.length/5|0,s=Math.max(Math.ceil(n/1024),400),r=[];let a=0,l=1,c=0;for(;a<n;){const d=a;let h=Math.min(d+s,n);if(h<n){let C=h;for(;C-1>d&&i[5*C]===0;)C--;if(C-1===d){let w=h;for(;w+1<n&&i[5*w]===0;)w++;h=w}else h=C}let u=new Uint32Array((h-d)*4),g=0,f=0,_=0,b=0;for(;a<h;){const C=5*a,w=i[C],S=i[C+1],k=l+w|0,x=w===0?c+S|0:S,y=i[C+2],D=x+y|0,I=i[C+3],R=i[C+4];if(D<=x)e.warnInvalidLengthSemanticTokens(k,x+1);else if(_===k&&b>x)e.warnOverlappingSemanticTokens(k,x+1);else{const P=e.getMetadata(I,R,t);P!==2147483647&&(f===0&&(f=k),u[g]=k-f,u[g+1]=x,u[g+2]=D,u[g+3]=P,g+=4,_=k,b=D)}l=k,c=x,a++}g!==u.length&&(u=u.subarray(0,g));const v=bp.create(f,u);r.push(v)}return r}class tre{constructor(e,t,i,n){this.tokenTypeIndex=e,this.tokenModifierSet=t,this.languageId=i,this.metadata=n,this.next=null}}class Ea{constructor(){this._elementsCount=0,this._currentLengthIndex=0,this._currentLength=Ea._SIZES[this._currentLengthIndex],this._growCount=Math.round(this._currentLengthIndex+1<Ea._SIZES.length?2/3*this._currentLength:0),this._elements=[],Ea._nullOutEntries(this._elements,this._currentLength)}static _nullOutEntries(e,t){for(let i=0;i<t;i++)e[i]=null}_hash2(e,t){return(e<<5)-e+t|0}_hashFunc(e,t,i){return this._hash2(this._hash2(e,t),i)%this._currentLength}get(e,t,i){const n=this._hashFunc(e,t,i);let s=this._elements[n];for(;s;){if(s.tokenTypeIndex===e&&s.tokenModifierSet===t&&s.languageId===i)return s;s=s.next}return null}add(e,t,i,n){if(this._elementsCount++,this._growCount!==0&&this._elementsCount>=this._growCount){const s=this._elements;this._currentLengthIndex++,this._currentLength=Ea._SIZES[this._currentLengthIndex],this._growCount=Math.round(this._currentLengthIndex+1<Ea._SIZES.length?2/3*this._currentLength:0),this._elements=[],Ea._nullOutEntries(this._elements,this._currentLength);for(const r of s){let a=r;for(;a;){const l=a.next;a.next=null,this._add(a),a=l}}}this._add(new tre(e,t,i,n))}_add(e){const t=this._hashFunc(e.tokenTypeIndex,e.tokenModifierSet,e.languageId);e.next=this._elements[t],this._elements[t]=e}}Ea._SIZES=[3,7,13,31,61,127,251,509,1021,2039,4093,8191,16381,32749,65521,131071,262139,524287,1048573,2097143];var SN=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},vn=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};function vl(o){return o.toString()}function UA(o){const e=new m1,t=o.createSnapshot();let i;for(;i=t.read();)e.update(i);return e.digest()}class ire{constructor(e,t,i){this._modelEventListeners=new ee,this.model=e,this._languageSelection=null,this._languageSelectionListener=null,this._modelEventListeners.add(e.onWillDispose(()=>t(e))),this._modelEventListeners.add(e.onDidChangeLanguage(n=>i(e,n)))}_disposeLanguageSelection(){this._languageSelectionListener&&(this._languageSelectionListener.dispose(),this._languageSelectionListener=null)}dispose(){this._modelEventListeners.dispose(),this._disposeLanguageSelection()}setLanguage(e){this._disposeLanguageSelection(),this._languageSelection=e,this._languageSelectionListener=this._languageSelection.onDidChange(()=>this.model.setMode(e.languageId)),this.model.setMode(e.languageId)}}const nre=sn||Ze?1:2;class sre{constructor(e,t,i,n,s,r,a,l){this.uri=e,this.initialUndoRedoSnapshot=t,this.time=i,this.sharesUndoRedoStack=n,this.heapSize=s,this.sha1=r,this.versionId=a,this.alternativeVersionId=l}}let Jv=class Gf extends z{constructor(e,t,i,n,s,r,a,l,c){super(),this._configurationService=e,this._resourcePropertiesService=t,this._themeService=i,this._logService=n,this._undoRedoService=s,this._languageService=r,this._languageConfigurationService=a,this._languageFeatureDebounceService=l,this._onModelAdded=this._register(new O),this.onModelAdded=this._onModelAdded.event,this._onModelRemoved=this._register(new O),this.onModelRemoved=this._onModelRemoved.event,this._onModelModeChanged=this._register(new O),this.onModelLanguageChanged=this._onModelModeChanged.event,this._modelCreationOptionsByLanguageAndResource=Object.create(null),this._models={},this._disposedModels=new Map,this._disposedModelsHeapSize=0,this._semanticStyling=this._register(new ore(this._themeService,this._languageService,this._logService)),this._register(this._configurationService.onDidChangeConfiguration(()=>this._updateModelOptions())),this._updateModelOptions(),this._register(new Ik(this._semanticStyling,this,this._themeService,this._configurationService,this._languageFeatureDebounceService,c))}static _readModelOptions(e,t){var i;let n=Xi.tabSize;if(e.editor&&typeof e.editor.tabSize!=\"undefined\"){const g=parseInt(e.editor.tabSize,10);isNaN(g)||(n=g),n<1&&(n=1)}let s=n;if(e.editor&&typeof e.editor.indentSize!=\"undefined\"&&e.editor.indentSize!==\"tabSize\"){const g=parseInt(e.editor.indentSize,10);isNaN(g)||(s=g),s<1&&(s=1)}let r=Xi.insertSpaces;e.editor&&typeof e.editor.insertSpaces!=\"undefined\"&&(r=e.editor.insertSpaces===\"false\"?!1:Boolean(e.editor.insertSpaces));let a=nre;const l=e.eol;l===`\\r\n`?a=2:l===`\n`&&(a=1);let c=Xi.trimAutoWhitespace;e.editor&&typeof e.editor.trimAutoWhitespace!=\"undefined\"&&(c=e.editor.trimAutoWhitespace===\"false\"?!1:Boolean(e.editor.trimAutoWhitespace));let d=Xi.detectIndentation;e.editor&&typeof e.editor.detectIndentation!=\"undefined\"&&(d=e.editor.detectIndentation===\"false\"?!1:Boolean(e.editor.detectIndentation));let h=Xi.largeFileOptimizations;e.editor&&typeof e.editor.largeFileOptimizations!=\"undefined\"&&(h=e.editor.largeFileOptimizations===\"false\"?!1:Boolean(e.editor.largeFileOptimizations));let u=Xi.bracketPairColorizationOptions;return((i=e.editor)===null||i===void 0?void 0:i.bracketPairColorization)&&typeof e.editor.bracketPairColorization==\"object\"&&(u={enabled:!!e.editor.bracketPairColorization.enabled,independentColorPoolPerBracketType:!!e.editor.bracketPairColorization.independentColorPoolPerBracketType}),{isForSimpleWidget:t,tabSize:n,indentSize:s,insertSpaces:r,detectIndentation:d,defaultEOL:a,trimAutoWhitespace:c,largeFileOptimizations:h,bracketPairColorizationOptions:u}}_getEOL(e,t){if(e)return this._resourcePropertiesService.getEOL(e,t);const i=this._configurationService.getValue(\"files.eol\",{overrideIdentifier:t});return i&&typeof i==\"string\"&&i!==\"auto\"?i:Os===3||Os===2?`\n`:`\\r\n`}_shouldRestoreUndoStack(){const e=this._configurationService.getValue(\"files.restoreUndoStack\");return typeof e==\"boolean\"?e:!0}getCreationOptions(e,t,i){let n=this._modelCreationOptionsByLanguageAndResource[e+t];if(!n){const s=this._configurationService.getValue(\"editor\",{overrideIdentifier:e,resource:t}),r=this._getEOL(t,e);n=Gf._readModelOptions({editor:s,eol:r},i),this._modelCreationOptionsByLanguageAndResource[e+t]=n}return n}_updateModelOptions(){const e=this._modelCreationOptionsByLanguageAndResource;this._modelCreationOptionsByLanguageAndResource=Object.create(null);const t=Object.keys(this._models);for(let i=0,n=t.length;i<n;i++){const s=t[i],r=this._models[s],a=r.model.getLanguageId(),l=r.model.uri,c=e[a+l],d=this.getCreationOptions(a,l,r.model.isForSimpleWidget);Gf._setModelOptionsForModel(r.model,d,c)}}static _setModelOptionsForModel(e,t,i){i&&i.defaultEOL!==t.defaultEOL&&e.getLineCount()===1&&e.setEOL(t.defaultEOL===1?0:1),!(i&&i.detectIndentation===t.detectIndentation&&i.insertSpaces===t.insertSpaces&&i.tabSize===t.tabSize&&i.indentSize===t.indentSize&&i.trimAutoWhitespace===t.trimAutoWhitespace&&$s(i.bracketPairColorizationOptions,t.bracketPairColorizationOptions))&&(t.detectIndentation?(e.detectIndentation(t.insertSpaces,t.tabSize),e.updateOptions({trimAutoWhitespace:t.trimAutoWhitespace,bracketColorizationOptions:t.bracketPairColorizationOptions})):e.updateOptions({insertSpaces:t.insertSpaces,tabSize:t.tabSize,indentSize:t.indentSize,trimAutoWhitespace:t.trimAutoWhitespace,bracketColorizationOptions:t.bracketPairColorizationOptions}))}_insertDisposedModel(e){this._disposedModels.set(vl(e.uri),e),this._disposedModelsHeapSize+=e.heapSize}_removeDisposedModel(e){const t=this._disposedModels.get(vl(e));return t&&(this._disposedModelsHeapSize-=t.heapSize),this._disposedModels.delete(vl(e)),t}_ensureDisposedModelsHeapSize(e){if(this._disposedModelsHeapSize>e){const t=[];for(this._disposedModels.forEach(i=>{i.sharesUndoRedoStack||t.push(i)}),t.sort((i,n)=>i.time-n.time);t.length>0&&this._disposedModelsHeapSize>e;){const i=t.shift();this._removeDisposedModel(i.uri),i.initialUndoRedoSnapshot!==null&&this._undoRedoService.restoreSnapshot(i.initialUndoRedoSnapshot)}}}_createModelData(e,t,i,n){const s=this.getCreationOptions(t,i,n),r=new il(e,t,s,i,this._undoRedoService,this._languageService,this._languageConfigurationService);if(i&&this._disposedModels.has(vl(i))){const c=this._removeDisposedModel(i),d=this._undoRedoService.getElements(i),h=UA(r)===c.sha1;if(h||c.sharesUndoRedoStack){for(const u of d.past)Da(u)&&u.matchesResource(i)&&u.setModel(r);for(const u of d.future)Da(u)&&u.matchesResource(i)&&u.setModel(r);this._undoRedoService.setElementsValidFlag(i,!0,u=>Da(u)&&u.matchesResource(i)),h&&(r._overwriteVersionId(c.versionId),r._overwriteAlternativeVersionId(c.alternativeVersionId),r._overwriteInitialUndoRedoSnapshot(c.initialUndoRedoSnapshot))}else c.initialUndoRedoSnapshot!==null&&this._undoRedoService.restoreSnapshot(c.initialUndoRedoSnapshot)}const a=vl(r.uri);if(this._models[a])throw new Error(\"ModelService: Cannot add model because it already exists!\");const l=new ire(r,c=>this._onWillDispose(c),(c,d)=>this._onDidChangeLanguage(c,d));return this._models[a]=l,l}createModel(e,t,i,n=!1){let s;return t?(s=this._createModelData(e,t.languageId,i,n),this.setMode(s.model,t)):s=this._createModelData(e,Us,i,n),this._onModelAdded.fire(s.model),s.model}setMode(e,t){if(!t)return;const i=this._models[vl(e.uri)];!i||i.setLanguage(t)}getModels(){const e=[],t=Object.keys(this._models);for(let i=0,n=t.length;i<n;i++){const s=t[i];e.push(this._models[s].model)}return e}getModel(e){const t=vl(e),i=this._models[t];return i?i.model:null}getSemanticTokensProviderStyling(e){return this._semanticStyling.get(e)}_schemaShouldMaintainUndoRedoElements(e){return e.scheme===Ne.file||e.scheme===Ne.vscodeRemote||e.scheme===Ne.vscodeUserData||e.scheme===Ne.vscodeNotebookCell||e.scheme===\"fake-fs\"}_onWillDispose(e){const t=vl(e.uri),i=this._models[t],n=this._undoRedoService.getUriComparisonKey(e.uri)!==e.uri.toString();let s=!1,r=0;if(n||this._shouldRestoreUndoStack()&&this._schemaShouldMaintainUndoRedoElements(e.uri)){const l=this._undoRedoService.getElements(e.uri);if(l.past.length>0||l.future.length>0){for(const c of l.past)Da(c)&&c.matchesResource(e.uri)&&(s=!0,r+=c.heapSize(e.uri),c.setModel(e.uri));for(const c of l.future)Da(c)&&c.matchesResource(e.uri)&&(s=!0,r+=c.heapSize(e.uri),c.setModel(e.uri))}}const a=Gf.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK;if(s)if(!n&&r>a){const l=i.model.getInitialUndoRedoSnapshot();l!==null&&this._undoRedoService.restoreSnapshot(l)}else this._ensureDisposedModelsHeapSize(a-r),this._undoRedoService.setElementsValidFlag(e.uri,!1,l=>Da(l)&&l.matchesResource(e.uri)),this._insertDisposedModel(new sre(e.uri,i.model.getInitialUndoRedoSnapshot(),Date.now(),n,r,UA(e),e.getVersionId(),e.getAlternativeVersionId()));else if(!n){const l=i.model.getInitialUndoRedoSnapshot();l!==null&&this._undoRedoService.restoreSnapshot(l)}delete this._models[t],i.dispose(),delete this._modelCreationOptionsByLanguageAndResource[e.getLanguageId()+e.uri],this._onModelRemoved.fire(e)}_onDidChangeLanguage(e,t){const i=t.oldLanguage,n=e.getLanguageId(),s=this.getCreationOptions(i,e.uri,e.isForSimpleWidget),r=this.getCreationOptions(n,e.uri,e.isForSimpleWidget);Gf._setModelOptionsForModel(e,r,s),this._onModelModeChanged.fire({model:e,oldLanguageId:i})}};Jv.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK=20*1024*1024;Jv=SN([vn(0,ot),vn(1,b7),vn(2,vt),vn(3,Co),vn(4,l1),vn(5,Ht),vn(6,ti),vn(7,Js),vn(8,ue)],Jv);const yN=\"editor.semanticHighlighting\";function xk(o,e,t){var i;const n=(i=t.getValue(yN,{overrideIdentifier:o.getLanguageId(),resource:o.uri}))===null||i===void 0?void 0:i.enabled;return typeof n==\"boolean\"?n:e.getColorTheme().semanticHighlighting}let Ik=class extends z{constructor(e,t,i,n,s,r){super(),this._watchers=Object.create(null),this._semanticStyling=e;const a=d=>{this._watchers[d.uri.toString()]=new Mm(d,this._semanticStyling,i,s,r)},l=(d,h)=>{h.dispose(),delete this._watchers[d.uri.toString()]},c=()=>{for(const d of t.getModels()){const h=this._watchers[d.uri.toString()];xk(d,i,n)?h||a(d):h&&l(d,h)}};this._register(t.onModelAdded(d=>{xk(d,i,n)&&a(d)})),this._register(t.onModelRemoved(d=>{const h=this._watchers[d.uri.toString()];h&&l(d,h)})),this._register(n.onDidChangeConfiguration(d=>{d.affectsConfiguration(yN)&&c()})),this._register(i.onDidColorThemeChange(c))}dispose(){for(const e of Object.values(this._watchers))e.dispose();super.dispose()}};Ik=SN([vn(1,Bt),vn(2,vt),vn(3,ot),vn(4,Js),vn(5,ue)],Ik);class ore extends z{constructor(e,t,i){super(),this._themeService=e,this._languageService=t,this._logService=i,this._caches=new WeakMap,this._register(this._themeService.onDidColorThemeChange(()=>{this._caches=new WeakMap}))}get(e){return this._caches.has(e)||this._caches.set(e,new kk(e.getLegend(),this._themeService,this._languageService,this._logService)),this._caches.get(e)}}class rre{constructor(e,t,i){this.provider=e,this.resultId=t,this.data=i}dispose(){this.provider.releaseDocumentSemanticTokens(this.resultId)}}let Mm=class qc extends z{constructor(e,t,i,n,s){super(),this._isDisposed=!1,this._model=e,this._semanticStyling=t,this._provider=s.documentSemanticTokensProvider,this._debounceInformation=n.for(this._provider,\"DocumentSemanticTokens\",{min:qc.REQUEST_MIN_DELAY,max:qc.REQUEST_MAX_DELAY}),this._fetchDocumentSemanticTokens=this._register(new ft(()=>this._fetchDocumentSemanticTokensNow(),qc.REQUEST_MIN_DELAY)),this._currentDocumentResponse=null,this._currentDocumentRequestCancellationTokenSource=null,this._documentProvidersChangeListeners=[],this._register(this._model.onDidChangeContent(()=>{this._fetchDocumentSemanticTokens.isScheduled()||this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model))})),this._register(this._model.onDidChangeLanguage(()=>{this._currentDocumentResponse&&(this._currentDocumentResponse.dispose(),this._currentDocumentResponse=null),this._currentDocumentRequestCancellationTokenSource&&(this._currentDocumentRequestCancellationTokenSource.cancel(),this._currentDocumentRequestCancellationTokenSource=null),this._setDocumentSemanticTokens(null,null,null,[]),this._fetchDocumentSemanticTokens.schedule(0)}));const r=()=>{et(this._documentProvidersChangeListeners),this._documentProvidersChangeListeners=[];for(const a of this._provider.all(e))typeof a.onDidChange==\"function\"&&this._documentProvidersChangeListeners.push(a.onDidChange(()=>this._fetchDocumentSemanticTokens.schedule(0)))};r(),this._register(this._provider.onDidChange(()=>{r(),this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model))})),this._register(i.onDidColorThemeChange(a=>{this._setDocumentSemanticTokens(null,null,null,[]),this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model))})),this._fetchDocumentSemanticTokens.schedule(0)}dispose(){this._currentDocumentResponse&&(this._currentDocumentResponse.dispose(),this._currentDocumentResponse=null),this._currentDocumentRequestCancellationTokenSource&&(this._currentDocumentRequestCancellationTokenSource.cancel(),this._currentDocumentRequestCancellationTokenSource=null),this._setDocumentSemanticTokens(null,null,null,[]),this._isDisposed=!0,super.dispose()}_fetchDocumentSemanticTokensNow(){if(this._currentDocumentRequestCancellationTokenSource)return;if(!N7(this._provider,this._model)){this._currentDocumentResponse&&this._model.tokenization.setSemanticTokens(null,!1);return}const e=new gn,t=this._currentDocumentResponse?this._currentDocumentResponse.provider:null,i=this._currentDocumentResponse&&this._currentDocumentResponse.resultId||null,n=T7(this._provider,this._model,t,i,e.token);this._currentDocumentRequestCancellationTokenSource=e;const s=[],r=this._model.onDidChangeContent(l=>{s.push(l)}),a=new Hn(!1);n.then(l=>{if(this._debounceInformation.update(this._model,a.elapsed()),this._currentDocumentRequestCancellationTokenSource=null,r.dispose(),!l)this._setDocumentSemanticTokens(null,null,null,s);else{const{provider:c,tokens:d}=l,h=this._semanticStyling.get(c);this._setDocumentSemanticTokens(c,d||null,h,s)}},l=>{l&&(ol(l)||typeof l.message==\"string\"&&l.message.indexOf(\"busy\")!==-1)||Ee(l),this._currentDocumentRequestCancellationTokenSource=null,r.dispose(),s.length>0&&(this._fetchDocumentSemanticTokens.isScheduled()||this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model)))})}static _copy(e,t,i,n,s){s=Math.min(s,i.length-n,e.length-t);for(let r=0;r<s;r++)i[n+r]=e[t+r]}_setDocumentSemanticTokens(e,t,i,n){const s=this._currentDocumentResponse,r=()=>{n.length>0&&!this._fetchDocumentSemanticTokens.isScheduled()&&this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model))};if(this._currentDocumentResponse&&(this._currentDocumentResponse.dispose(),this._currentDocumentResponse=null),this._isDisposed){e&&t&&e.releaseDocumentSemanticTokens(t.resultId);return}if(!e||!i){this._model.tokenization.setSemanticTokens(null,!1);return}if(!t){this._model.tokenization.setSemanticTokens(null,!0),r();return}if(E7(t)){if(!s){this._model.tokenization.setSemanticTokens(null,!0);return}if(t.edits.length===0)t={resultId:t.resultId,data:s.data};else{let a=0;for(const u of t.edits)a+=(u.data?u.data.length:0)-u.deleteCount;const l=s.data,c=new Uint32Array(l.length+a);let d=l.length,h=c.length;for(let u=t.edits.length-1;u>=0;u--){const g=t.edits[u];if(g.start>l.length){i.warnInvalidEditStart(s.resultId,t.resultId,u,g.start,l.length),this._model.tokenization.setSemanticTokens(null,!0);return}const f=d-(g.start+g.deleteCount);f>0&&(qc._copy(l,d-f,c,h-f,f),h-=f),g.data&&(qc._copy(g.data,0,c,h-g.data.length,g.data.length),h-=g.data.length),d=g.start}d>0&&qc._copy(l,0,c,0,d),t={resultId:t.resultId,data:c}}}if(Q1(t)){this._currentDocumentResponse=new rre(e,t.resultId,t.data);const a=A7(t,i,this._model.getLanguageId());if(n.length>0)for(const l of n)for(const c of a)for(const d of l.changes)c.applyEdit(d.range,d.text);this._model.tokenization.setSemanticTokens(a,!0)}else this._model.tokenization.setSemanticTokens(null,!0);r()}};Mm.REQUEST_MIN_DELAY=300;Mm.REQUEST_MAX_DELAY=2e3;Mm=SN([vn(2,vt),vn(3,Js),vn(4,ue)],Mm);var are=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},xf=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let Am=class extends z{constructor(e,t,i,n,s,r){super(),this._modelService=t,this._themeService=i,this._configurationService=n,this._editor=e,this._provider=r.documentRangeSemanticTokensProvider,this._debounceInformation=s.for(this._provider,\"DocumentRangeSemanticTokens\",{min:100,max:500}),this._tokenizeViewport=this._register(new ft(()=>this._tokenizeViewportNow(),100)),this._outstandingRequests=[];const a=()=>{this._editor.hasModel()&&this._tokenizeViewport.schedule(this._debounceInformation.get(this._editor.getModel()))};this._register(this._editor.onDidScrollChange(()=>{a()})),this._register(this._editor.onDidChangeModel(()=>{this._cancelAll(),a()})),this._register(this._editor.onDidChangeModelContent(l=>{this._cancelAll(),a()})),this._register(this._provider.onDidChange(()=>{this._cancelAll(),a()})),this._register(this._configurationService.onDidChangeConfiguration(l=>{l.affectsConfiguration(yN)&&(this._cancelAll(),a())})),this._register(this._themeService.onDidColorThemeChange(()=>{this._cancelAll(),a()}))}_cancelAll(){for(const e of this._outstandingRequests)e.cancel();this._outstandingRequests=[]}_removeOutstandingRequest(e){for(let t=0,i=this._outstandingRequests.length;t<i;t++)if(this._outstandingRequests[t]===e){this._outstandingRequests.splice(t,1);return}}_tokenizeViewportNow(){if(!this._editor.hasModel())return;const e=this._editor.getModel();if(e.tokenization.hasCompleteSemanticTokens())return;if(!xk(e,this._themeService,this._configurationService)){e.tokenization.hasSomeSemanticTokens()&&e.tokenization.setSemanticTokens(null,!1);return}if(!Joe(this._provider,e)){e.tokenization.hasSomeSemanticTokens()&&e.tokenization.setSemanticTokens(null,!1);return}const t=this._editor.getVisibleRangesPlusViewportAboveBelow();this._outstandingRequests=this._outstandingRequests.concat(t.map(i=>this._requestRange(e,i)))}_requestRange(e,t){const i=e.getVersionId(),n=Ti(r=>Promise.resolve(wN(this._provider,e,t,r))),s=new Hn(!1);return n.then(r=>{if(this._debounceInformation.update(e,s.elapsed()),!r||!r.tokens||e.isDisposed()||e.getVersionId()!==i)return;const{provider:a,tokens:l}=r,c=this._modelService.getSemanticTokensProviderStyling(a);e.tokenization.setPartialSemanticTokens(t,A7(l,c,e.getLanguageId()))}).then(()=>this._removeOutstandingRequest(n),()=>this._removeOutstandingRequest(n)),n}};Am.ID=\"editor.contrib.viewportSemanticTokens\";Am=are([xf(1,Bt),xf(2,vt),xf(3,ot),xf(4,Js),xf(5,ue)],Am);rt(Am.ID,Am);var lre=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},$A=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const cre=N(\"editor.wordHighlightBackground\",{dark:\"#575757B8\",light:\"#57575740\",hcDark:null,hcLight:null},p(\"wordHighlight\",\"Background color of a symbol during read-access, like reading a variable. The color must not be opaque so as not to hide underlying decorations.\"),!0),dre=N(\"editor.wordHighlightStrongBackground\",{dark:\"#004972B8\",light:\"#0e639c40\",hcDark:null,hcLight:null},p(\"wordHighlightStrong\",\"Background color of a symbol during write-access, like writing to a variable. The color must not be opaque so as not to hide underlying decorations.\"),!0),hre=N(\"editor.wordHighlightBorder\",{light:null,dark:null,hcDark:At,hcLight:At},p(\"wordHighlightBorder\",\"Border color of a symbol during read-access, like reading a variable.\")),ure=N(\"editor.wordHighlightStrongBorder\",{light:null,dark:null,hcDark:At,hcLight:At},p(\"wordHighlightStrongBorder\",\"Border color of a symbol during write-access, like writing to a variable.\")),gre=N(\"editorOverviewRuler.wordHighlightForeground\",{dark:\"#A0A0A0CC\",light:\"#A0A0A0CC\",hcDark:\"#A0A0A0CC\",hcLight:\"#A0A0A0CC\"},p(\"overviewRulerWordHighlightForeground\",\"Overview ruler marker color for symbol highlights. The color must not be opaque so as not to hide underlying decorations.\"),!0),fre=N(\"editorOverviewRuler.wordHighlightStrongForeground\",{dark:\"#C0A0C0CC\",light:\"#C0A0C0CC\",hcDark:\"#C0A0C0CC\",hcLight:\"#C0A0C0CC\"},p(\"overviewRulerWordHighlightStrongForeground\",\"Overview ruler marker color for write-access symbol highlights. The color must not be opaque so as not to hide underlying decorations.\"),!0),J1=new ce(\"hasWordHighlights\",!1);function R7(o,e,t,i){const n=o.ordered(e);return $P(n.map(s=>()=>Promise.resolve(s.provideDocumentHighlights(e,t,i)).then(void 0,Ai)),en)}class O7{constructor(e,t,i){this._model=e,this._selection=t,this._wordSeparators=i,this._wordRange=this._getCurrentWordRange(e,t),this._result=null}get result(){return this._result||(this._result=Ti(e=>this._compute(this._model,this._selection,this._wordSeparators,e))),this._result}_getCurrentWordRange(e,t){const i=e.getWordAtPosition(t.getPosition());return i?new L(t.startLineNumber,i.startColumn,t.startLineNumber,i.endColumn):null}isValid(e,t,i){const n=t.startLineNumber,s=t.startColumn,r=t.endColumn,a=this._getCurrentWordRange(e,t);let l=Boolean(this._wordRange&&this._wordRange.equalsRange(a));for(let c=0,d=i.length;!l&&c<d;c++){const h=i.getRange(c);h&&h.startLineNumber===n&&h.startColumn<=s&&h.endColumn>=r&&(l=!0)}return l}cancel(){this.result.cancel()}}class pre extends O7{constructor(e,t,i,n){super(e,t,i),this._providers=n}_compute(e,t,i,n){return R7(this._providers,e,t.getPosition(),n).then(s=>s||[])}}class mre extends O7{constructor(e,t,i){super(e,t,i),this._selectionIsEmpty=t.isEmpty()}_compute(e,t,i,n){return Vd(250,n).then(()=>{if(!t.isEmpty())return[];const s=e.getWordAtPosition(t.getPosition());return!s||s.word.length>1e3?[]:e.findMatches(s.word,!0,!1,!0,i,!1).map(a=>({range:a.range,kind:zp.Text}))})}isValid(e,t,i){const n=t.isEmpty();return this._selectionIsEmpty!==n?!1:super.isValid(e,t,i)}}function _re(o,e,t,i){return o.has(e)?new pre(e,t,i,o):new mre(e,t,i)}Jr(\"_executeDocumentHighlights\",(o,e,t)=>{const i=o.get(ue);return R7(i.documentHighlightProvider,e,t,We.None)});class ef{constructor(e,t,i){this.toUnhook=new ee,this.workerRequestTokenId=0,this.workerRequestCompleted=!1,this.workerRequestValue=[],this.lastCursorPositionChangeTime=0,this.renderDecorationsTimer=-1,this.editor=e,this.providers=t,this._hasWordHighlights=J1.bindTo(i),this._ignorePositionChangeEvent=!1,this.occurrencesHighlight=this.editor.getOption(74),this.model=this.editor.getModel(),this.toUnhook.add(e.onDidChangeCursorPosition(n=>{this._ignorePositionChangeEvent||!this.occurrencesHighlight||this._onPositionChanged(n)})),this.toUnhook.add(e.onDidChangeModelContent(n=>{this._stopAll()})),this.toUnhook.add(e.onDidChangeConfiguration(n=>{const s=this.editor.getOption(74);this.occurrencesHighlight!==s&&(this.occurrencesHighlight=s,this._stopAll())})),this.decorations=this.editor.createDecorationsCollection(),this.workerRequestTokenId=0,this.workerRequest=null,this.workerRequestCompleted=!1,this.lastCursorPositionChangeTime=0,this.renderDecorationsTimer=-1}hasDecorations(){return this.decorations.length>0}restore(){!this.occurrencesHighlight||this._run()}_getSortedHighlights(){return this.decorations.getRanges().sort(L.compareRangesUsingStarts)}moveNext(){const e=this._getSortedHighlights(),i=(e.findIndex(s=>s.containsPosition(this.editor.getPosition()))+1)%e.length,n=e[i];try{this._ignorePositionChangeEvent=!0,this.editor.setPosition(n.getStartPosition()),this.editor.revealRangeInCenterIfOutsideViewport(n);const s=this._getWord();if(s){const r=this.editor.getModel().getLineContent(n.startLineNumber);un(`${r}, ${i+1} of ${e.length} for '${s.word}'`)}}finally{this._ignorePositionChangeEvent=!1}}moveBack(){const e=this._getSortedHighlights(),i=(e.findIndex(s=>s.containsPosition(this.editor.getPosition()))-1+e.length)%e.length,n=e[i];try{this._ignorePositionChangeEvent=!0,this.editor.setPosition(n.getStartPosition()),this.editor.revealRangeInCenterIfOutsideViewport(n);const s=this._getWord();if(s){const r=this.editor.getModel().getLineContent(n.startLineNumber);un(`${r}, ${i+1} of ${e.length} for '${s.word}'`)}}finally{this._ignorePositionChangeEvent=!1}}_removeDecorations(){this.decorations.length>0&&(this.decorations.clear(),this._hasWordHighlights.set(!1))}_stopAll(){this._removeDecorations(),this.renderDecorationsTimer!==-1&&(clearTimeout(this.renderDecorationsTimer),this.renderDecorationsTimer=-1),this.workerRequest!==null&&(this.workerRequest.cancel(),this.workerRequest=null),this.workerRequestCompleted||(this.workerRequestTokenId++,this.workerRequestCompleted=!0)}_onPositionChanged(e){if(!this.occurrencesHighlight){this._stopAll();return}if(e.reason!==3){this._stopAll();return}this._run()}_getWord(){const e=this.editor.getSelection(),t=e.startLineNumber,i=e.startColumn;return this.model.getWordAtPosition({lineNumber:t,column:i})}_run(){const e=this.editor.getSelection();if(e.startLineNumber!==e.endLineNumber){this._stopAll();return}const t=e.startColumn,i=e.endColumn,n=this._getWord();if(!n||n.startColumn>t||n.endColumn<i){this._stopAll();return}const s=this.workerRequest&&this.workerRequest.isValid(this.model,e,this.decorations);if(this.lastCursorPositionChangeTime=new Date().getTime(),s)this.workerRequestCompleted&&this.renderDecorationsTimer!==-1&&(clearTimeout(this.renderDecorationsTimer),this.renderDecorationsTimer=-1,this._beginRenderDecorations());else{this._stopAll();const r=++this.workerRequestTokenId;this.workerRequestCompleted=!1,this.workerRequest=_re(this.providers,this.model,this.editor.getSelection(),this.editor.getOption(119)),this.workerRequest.result.then(a=>{r===this.workerRequestTokenId&&(this.workerRequestCompleted=!0,this.workerRequestValue=a||[],this._beginRenderDecorations())},Ee)}}_beginRenderDecorations(){const e=new Date().getTime(),t=this.lastCursorPositionChangeTime+250;e>=t?(this.renderDecorationsTimer=-1,this.renderDecorations()):this.renderDecorationsTimer=setTimeout(()=>{this.renderDecorations()},t-e)}renderDecorations(){this.renderDecorationsTimer=-1;const e=[];for(const t of this.workerRequestValue)t.range&&e.push({range:t.range,options:ef._getDecorationOptions(t.kind)});this.decorations.set(e),this._hasWordHighlights.set(this.hasDecorations())}static _getDecorationOptions(e){return e===zp.Write?this._WRITE_OPTIONS:e===zp.Text?this._TEXT_OPTIONS:this._REGULAR_OPTIONS}dispose(){this._stopAll(),this.toUnhook.dispose()}}ef._WRITE_OPTIONS=Ie.register({description:\"word-highlight-strong\",stickiness:1,className:\"wordHighlightStrong\",overviewRuler:{color:Qt(fre),position:vo.Center},minimap:{color:Qt(QC),position:js.Inline}});ef._TEXT_OPTIONS=Ie.register({description:\"selection-highlight\",stickiness:1,className:\"selectionHighlight\",overviewRuler:{color:Qt(t4),position:vo.Center},minimap:{color:Qt(QC),position:js.Inline}});ef._REGULAR_OPTIONS=Ie.register({description:\"word-highlight\",stickiness:1,className:\"wordHighlight\",overviewRuler:{color:Qt(gre),position:vo.Center},minimap:{color:Qt(QC),position:js.Inline}});let hh=class P7 extends z{constructor(e,t,i){super(),this.wordHighlighter=null;const n=()=>{e.hasModel()&&(this.wordHighlighter=new ef(e,i.documentHighlightProvider,t))};this._register(e.onDidChangeModel(s=>{this.wordHighlighter&&(this.wordHighlighter.dispose(),this.wordHighlighter=null),n()})),n()}static get(e){return e.getContribution(P7.ID)}saveViewState(){return!!(this.wordHighlighter&&this.wordHighlighter.hasDecorations())}moveNext(){this.wordHighlighter&&this.wordHighlighter.moveNext()}moveBack(){this.wordHighlighter&&this.wordHighlighter.moveBack()}restoreViewState(e){this.wordHighlighter&&e&&this.wordHighlighter.restore()}dispose(){this.wordHighlighter&&(this.wordHighlighter.dispose(),this.wordHighlighter=null),super.dispose()}};hh.ID=\"editor.contrib.wordHighlighter\";hh=lre([$A(1,xe),$A(2,ue)],hh);class F7 extends he{constructor(e,t){super(t),this._isNext=e}run(e,t){const i=hh.get(t);!i||(this._isNext?i.moveNext():i.moveBack())}}class bre extends F7{constructor(){super(!0,{id:\"editor.action.wordHighlight.next\",label:p(\"wordHighlight.next.label\",\"Go to Next Symbol Highlight\"),alias:\"Go to Next Symbol Highlight\",precondition:J1,kbOpts:{kbExpr:T.editorTextFocus,primary:65,weight:100}})}}class vre extends F7{constructor(){super(!1,{id:\"editor.action.wordHighlight.prev\",label:p(\"wordHighlight.previous.label\",\"Go to Previous Symbol Highlight\"),alias:\"Go to Previous Symbol Highlight\",precondition:J1,kbOpts:{kbExpr:T.editorTextFocus,primary:1089,weight:100}})}}class Cre extends he{constructor(){super({id:\"editor.action.wordHighlight.trigger\",label:p(\"wordHighlight.trigger.label\",\"Trigger Symbol Highlight\"),alias:\"Trigger Symbol Highlight\",precondition:J1.toNegated(),kbOpts:{kbExpr:T.editorTextFocus,primary:0,weight:100}})}run(e,t,i){const n=hh.get(t);!n||n.restoreViewState(!0)}}rt(hh.ID,hh);te(bre);te(vre);te(Cre);Rt((o,e)=>{const t=o.getColor(bI);t&&(e.addRule(`.monaco-editor .focused .selectionHighlight { background-color: ${t}; }`),e.addRule(`.monaco-editor .selectionHighlight { background-color: ${t.transparent(.5)}; }`));const i=o.getColor(cre);i&&e.addRule(`.monaco-editor .wordHighlight { background-color: ${i}; }`);const n=o.getColor(dre);n&&e.addRule(`.monaco-editor .wordHighlightStrong { background-color: ${n}; }`);const s=o.getColor(WH);s&&e.addRule(`.monaco-editor .selectionHighlight { border: 1px ${yn(o.type)?\"dotted\":\"solid\"} ${s}; box-sizing: border-box; }`);const r=o.getColor(hre);r&&e.addRule(`.monaco-editor .wordHighlight { border: 1px ${yn(o.type)?\"dashed\":\"solid\"} ${r}; box-sizing: border-box; }`);const a=o.getColor(ure);a&&e.addRule(`.monaco-editor .wordHighlightStrong { border: 1px ${yn(o.type)?\"dashed\":\"solid\"} ${a}; box-sizing: border-box; }`)});class ew extends ji{constructor(e){super(e),this._inSelectionMode=e.inSelectionMode,this._wordNavigationType=e.wordNavigationType}runEditorCommand(e,t,i){if(!t.hasModel())return;const n=Zs(t.getOption(119)),s=t.getModel(),a=t.getSelections().map(l=>{const c=new B(l.positionLineNumber,l.positionColumn),d=this._move(n,s,c,this._wordNavigationType);return this._moveTo(l,d,this._inSelectionMode)});if(s.pushStackElement(),t._getViewModel().setCursorStates(\"moveWordCommand\",3,a.map(l=>He.fromModelSelection(l))),a.length===1){const l=new B(a[0].positionLineNumber,a[0].positionColumn);t.revealPosition(l,0)}}_moveTo(e,t,i){return i?new oe(e.selectionStartLineNumber,e.selectionStartColumn,t.lineNumber,t.column):new oe(t.lineNumber,t.column,t.lineNumber,t.column)}}class Tc extends ew{_move(e,t,i,n){return Qe.moveWordLeft(e,t,i,n)}}class Mc extends ew{_move(e,t,i,n){return Qe.moveWordRight(e,t,i,n)}}class wre extends Tc{constructor(){super({inSelectionMode:!1,wordNavigationType:0,id:\"cursorWordStartLeft\",precondition:void 0})}}class Sre extends Tc{constructor(){super({inSelectionMode:!1,wordNavigationType:2,id:\"cursorWordEndLeft\",precondition:void 0})}}class yre extends Tc{constructor(){var e;super({inSelectionMode:!1,wordNavigationType:1,id:\"cursorWordLeft\",precondition:void 0,kbOpts:{kbExpr:re.and(T.textInputFocus,(e=re.and(Km,S1))===null||e===void 0?void 0:e.negate()),primary:2063,mac:{primary:527},weight:100}})}}class Lre extends Tc{constructor(){super({inSelectionMode:!0,wordNavigationType:0,id:\"cursorWordStartLeftSelect\",precondition:void 0})}}class Dre extends Tc{constructor(){super({inSelectionMode:!0,wordNavigationType:2,id:\"cursorWordEndLeftSelect\",precondition:void 0})}}class kre extends Tc{constructor(){var e;super({inSelectionMode:!0,wordNavigationType:1,id:\"cursorWordLeftSelect\",precondition:void 0,kbOpts:{kbExpr:re.and(T.textInputFocus,(e=re.and(Km,S1))===null||e===void 0?void 0:e.negate()),primary:3087,mac:{primary:1551},weight:100}})}}class xre extends Tc{constructor(){super({inSelectionMode:!1,wordNavigationType:3,id:\"cursorWordAccessibilityLeft\",precondition:void 0})}_move(e,t,i,n){return super._move(Zs(Jo.wordSeparators.defaultValue),t,i,n)}}class Ire extends Tc{constructor(){super({inSelectionMode:!0,wordNavigationType:3,id:\"cursorWordAccessibilityLeftSelect\",precondition:void 0})}_move(e,t,i,n){return super._move(Zs(Jo.wordSeparators.defaultValue),t,i,n)}}class Ere extends Mc{constructor(){super({inSelectionMode:!1,wordNavigationType:0,id:\"cursorWordStartRight\",precondition:void 0})}}class Nre extends Mc{constructor(){var e;super({inSelectionMode:!1,wordNavigationType:2,id:\"cursorWordEndRight\",precondition:void 0,kbOpts:{kbExpr:re.and(T.textInputFocus,(e=re.and(Km,S1))===null||e===void 0?void 0:e.negate()),primary:2065,mac:{primary:529},weight:100}})}}class Tre extends Mc{constructor(){super({inSelectionMode:!1,wordNavigationType:2,id:\"cursorWordRight\",precondition:void 0})}}class Mre extends Mc{constructor(){super({inSelectionMode:!0,wordNavigationType:0,id:\"cursorWordStartRightSelect\",precondition:void 0})}}class Are extends Mc{constructor(){var e;super({inSelectionMode:!0,wordNavigationType:2,id:\"cursorWordEndRightSelect\",precondition:void 0,kbOpts:{kbExpr:re.and(T.textInputFocus,(e=re.and(Km,S1))===null||e===void 0?void 0:e.negate()),primary:3089,mac:{primary:1553},weight:100}})}}class Rre extends Mc{constructor(){super({inSelectionMode:!0,wordNavigationType:2,id:\"cursorWordRightSelect\",precondition:void 0})}}class Ore extends Mc{constructor(){super({inSelectionMode:!1,wordNavigationType:3,id:\"cursorWordAccessibilityRight\",precondition:void 0})}_move(e,t,i,n){return super._move(Zs(Jo.wordSeparators.defaultValue),t,i,n)}}class Pre extends Mc{constructor(){super({inSelectionMode:!0,wordNavigationType:3,id:\"cursorWordAccessibilityRightSelect\",precondition:void 0})}_move(e,t,i,n){return super._move(Zs(Jo.wordSeparators.defaultValue),t,i,n)}}class tw extends ji{constructor(e){super(e),this._whitespaceHeuristics=e.whitespaceHeuristics,this._wordNavigationType=e.wordNavigationType}runEditorCommand(e,t,i){const n=e.get(ti);if(!t.hasModel())return;const s=Zs(t.getOption(119)),r=t.getModel(),a=t.getSelections(),l=t.getOption(5),c=t.getOption(8),d=n.getLanguageConfiguration(r.getLanguageId()).getAutoClosingPairs(),h=t._getViewModel(),u=a.map(g=>{const f=this._delete({wordSeparators:s,model:r,selection:g,whitespaceHeuristics:this._whitespaceHeuristics,autoClosingDelete:t.getOption(6),autoClosingBrackets:l,autoClosingQuotes:c,autoClosingPairs:d,autoClosedCharacters:h.getCursorAutoClosedCharacters()},this._wordNavigationType);return new Wi(f,\"\")});t.pushUndoStop(),t.executeCommands(this.id,u),t.pushUndoStop()}}class LN extends tw{_delete(e,t){const i=Qe.deleteWordLeft(e,t);return i||new L(1,1,1,1)}}class DN extends tw{_delete(e,t){const i=Qe.deleteWordRight(e,t);if(i)return i;const n=e.model.getLineCount(),s=e.model.getLineMaxColumn(n);return new L(n,s,n,s)}}class Fre extends LN{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:0,id:\"deleteWordStartLeft\",precondition:T.writable})}}class Bre extends LN{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:2,id:\"deleteWordEndLeft\",precondition:T.writable})}}class Wre extends LN{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:0,id:\"deleteWordLeft\",precondition:T.writable,kbOpts:{kbExpr:T.textInputFocus,primary:2049,mac:{primary:513},weight:100}})}}class Vre extends DN{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:0,id:\"deleteWordStartRight\",precondition:T.writable})}}class Hre extends DN{constructor(){super({whitespaceHeuristics:!1,wordNavigationType:2,id:\"deleteWordEndRight\",precondition:T.writable})}}class zre extends DN{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:2,id:\"deleteWordRight\",precondition:T.writable,kbOpts:{kbExpr:T.textInputFocus,primary:2068,mac:{primary:532},weight:100}})}}class Ure extends he{constructor(){super({id:\"deleteInsideWord\",precondition:T.writable,label:p(\"deleteInsideWord\",\"Delete Word\"),alias:\"Delete Word\"})}run(e,t,i){if(!t.hasModel())return;const n=Zs(t.getOption(119)),s=t.getModel(),a=t.getSelections().map(l=>{const c=Qe.deleteInsideWord(n,s,l);return new Wi(c,\"\")});t.pushUndoStop(),t.executeCommands(this.id,a),t.pushUndoStop()}}Q(new wre);Q(new Sre);Q(new yre);Q(new Lre);Q(new Dre);Q(new kre);Q(new Ere);Q(new Nre);Q(new Tre);Q(new Mre);Q(new Are);Q(new Rre);Q(new xre);Q(new Ire);Q(new Ore);Q(new Pre);Q(new Fre);Q(new Bre);Q(new Wre);Q(new Vre);Q(new Hre);Q(new zre);te(Ure);class $re extends tw{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:0,id:\"deleteWordPartLeft\",precondition:T.writable,kbOpts:{kbExpr:T.textInputFocus,primary:0,mac:{primary:769},weight:100}})}_delete(e,t){const i=PC.deleteWordPartLeft(e);return i||new L(1,1,1,1)}}class jre extends tw{constructor(){super({whitespaceHeuristics:!0,wordNavigationType:2,id:\"deleteWordPartRight\",precondition:T.writable,kbOpts:{kbExpr:T.textInputFocus,primary:0,mac:{primary:788},weight:100}})}_delete(e,t){const i=PC.deleteWordPartRight(e);if(i)return i;const n=e.model.getLineCount(),s=e.model.getLineMaxColumn(n);return new L(n,s,n,s)}}class B7 extends ew{_move(e,t,i,n){return PC.moveWordPartLeft(e,t,i)}}class Kre extends B7{constructor(){super({inSelectionMode:!1,wordNavigationType:0,id:\"cursorWordPartLeft\",precondition:void 0,kbOpts:{kbExpr:T.textInputFocus,primary:0,mac:{primary:783},weight:100}})}}Ye.registerCommandAlias(\"cursorWordPartStartLeft\",\"cursorWordPartLeft\");class qre extends B7{constructor(){super({inSelectionMode:!0,wordNavigationType:0,id:\"cursorWordPartLeftSelect\",precondition:void 0,kbOpts:{kbExpr:T.textInputFocus,primary:0,mac:{primary:1807},weight:100}})}}Ye.registerCommandAlias(\"cursorWordPartStartLeftSelect\",\"cursorWordPartLeftSelect\");class W7 extends ew{_move(e,t,i,n){return PC.moveWordPartRight(e,t,i)}}class Gre extends W7{constructor(){super({inSelectionMode:!1,wordNavigationType:2,id:\"cursorWordPartRight\",precondition:void 0,kbOpts:{kbExpr:T.textInputFocus,primary:0,mac:{primary:785},weight:100}})}}class Zre extends W7{constructor(){super({inSelectionMode:!0,wordNavigationType:2,id:\"cursorWordPartRightSelect\",precondition:void 0,kbOpts:{kbExpr:T.textInputFocus,primary:0,mac:{primary:1809},weight:100}})}}Q(new $re);Q(new jre);Q(new Kre);Q(new qre);Q(new Gre);Q(new Zre);class Ek extends z{constructor(e){super(),this.editor=e,this._register(this.editor.onDidAttemptReadOnlyEdit(()=>this._onDidAttemptReadOnlyEdit()))}_onDidAttemptReadOnlyEdit(){const e=rs.get(this.editor);e&&this.editor.hasModel()&&(this.editor.isSimpleWidget?e.showMessage(p(\"editor.simple.readonly\",\"Cannot edit in read-only input\"),this.editor.getPosition()):e.showMessage(p(\"editor.readonly\",\"Cannot edit in read-only editor\"),this.editor.getPosition()))}}Ek.ID=\"editor.contrib.readOnlyMessageController\";rt(Ek.ID,Ek);var jA;(function(o){o.noSelection=p(\"noSelection\",\"No selection\"),o.singleSelectionRange=p(\"singleSelectionRange\",\"Line {0}, Column {1} ({2} selected)\"),o.singleSelection=p(\"singleSelection\",\"Line {0}, Column {1}\"),o.multiSelectionRange=p(\"multiSelectionRange\",\"{0} selections ({1} characters selected)\"),o.multiSelection=p(\"multiSelection\",\"{0} selections\"),o.emergencyConfOn=p(\"emergencyConfOn\",\"Now changing the setting `accessibilitySupport` to 'on'.\"),o.openingDocs=p(\"openingDocs\",\"Now opening the Editor Accessibility documentation page.\"),o.readonlyDiffEditor=p(\"readonlyDiffEditor\",\" in a read-only pane of a diff editor.\"),o.editableDiffEditor=p(\"editableDiffEditor\",\" in a pane of a diff editor.\"),o.readonlyEditor=p(\"readonlyEditor\",\" in a read-only code editor\"),o.editableEditor=p(\"editableEditor\",\" in a code editor\"),o.changeConfigToOnMac=p(\"changeConfigToOnMac\",\"To configure the editor to be optimized for usage with a Screen Reader press Command+E now.\"),o.changeConfigToOnWinLinux=p(\"changeConfigToOnWinLinux\",\"To configure the editor to be optimized for usage with a Screen Reader press Control+E now.\"),o.auto_on=p(\"auto_on\",\"The editor is configured to be optimized for usage with a Screen Reader.\"),o.auto_off=p(\"auto_off\",\"The editor is configured to never be optimized for usage with a Screen Reader, which is not the case at this time.\"),o.tabFocusModeOnMsg=p(\"tabFocusModeOnMsg\",\"Pressing Tab in the current editor will move focus to the next focusable element. Toggle this behavior by pressing {0}.\"),o.tabFocusModeOnMsgNoKb=p(\"tabFocusModeOnMsgNoKb\",\"Pressing Tab in the current editor will move focus to the next focusable element. The command {0} is currently not triggerable by a keybinding.\"),o.tabFocusModeOffMsg=p(\"tabFocusModeOffMsg\",\"Pressing Tab in the current editor will insert the tab character. Toggle this behavior by pressing {0}.\"),o.tabFocusModeOffMsgNoKb=p(\"tabFocusModeOffMsgNoKb\",\"Pressing Tab in the current editor will insert the tab character. The command {0} is currently not triggerable by a keybinding.\"),o.openDocMac=p(\"openDocMac\",\"Press Command+H now to open a browser window with more information related to editor accessibility.\"),o.openDocWinLinux=p(\"openDocWinLinux\",\"Press Control+H now to open a browser window with more information related to editor accessibility.\"),o.outroMsg=p(\"outroMsg\",\"You can dismiss this tooltip and return to the editor by pressing Escape or Shift+Escape.\"),o.showAccessibilityHelpAction=p(\"showAccessibilityHelpAction\",\"Show Accessibility Help\")})(jA||(jA={}));var KA;(function(o){o.inspectTokensAction=p(\"inspectTokens\",\"Developer: Inspect Tokens\")})(KA||(KA={}));var qA;(function(o){o.gotoLineActionLabel=p(\"gotoLineActionLabel\",\"Go to Line/Column...\")})(qA||(qA={}));var GA;(function(o){o.helpQuickAccessActionLabel=p(\"helpQuickAccess\",\"Show all Quick Access Providers\")})(GA||(GA={}));var ZA;(function(o){o.quickCommandActionLabel=p(\"quickCommandActionLabel\",\"Command Palette\"),o.quickCommandHelp=p(\"quickCommandActionHelp\",\"Show And Run Commands\")})(ZA||(ZA={}));var YA;(function(o){o.quickOutlineActionLabel=p(\"quickOutlineActionLabel\",\"Go to Symbol...\"),o.quickOutlineByCategoryActionLabel=p(\"quickOutlineByCategoryActionLabel\",\"Go to Symbol by Category...\")})(YA||(YA={}));var eC;(function(o){o.editorViewAccessibleLabel=p(\"editorViewAccessibleLabel\",\"Editor content\"),o.accessibilityHelpMessage=p(\"accessibilityHelpMessage\",\"Press Alt+F1 for Accessibility Options.\")})(eC||(eC={}));var XA;(function(o){o.toggleHighContrast=p(\"toggleHighContrast\",\"Toggle High Contrast Theme\")})(XA||(XA={}));var Nk;(function(o){o.bulkEditServiceSummary=p(\"bulkEditServiceSummary\",\"Made {0} edits in {1} files\")})(Nk||(Nk={}));class S_{static chord(e,t){return vi(e,t)}}S_.CtrlCmd=2048;S_.Shift=1024;S_.Alt=512;S_.WinCtrl=256;function V7(){return{editor:void 0,languages:void 0,CancellationTokenSource:gn,Emitter:O,KeyCode:QD,KeyMod:S_,Position:B,Range:L,Selection:oe,SelectionDirection:dk,MarkerSeverity:JD,MarkerTag:ek,Uri:me,Token:Vp}}const Yre=\"$initialize\";let QA=!1;function Tk(o){!Lc||(QA||(QA=!0,console.warn(\"Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/microsoft/monaco-editor#faq\")),console.warn(o.message))}class Xre{constructor(e,t,i,n){this.vsWorker=e,this.req=t,this.method=i,this.args=n,this.type=0}}class JA{constructor(e,t,i,n){this.vsWorker=e,this.seq=t,this.res=i,this.err=n,this.type=1}}class Qre{constructor(e,t,i,n){this.vsWorker=e,this.req=t,this.eventName=i,this.arg=n,this.type=2}}class Jre{constructor(e,t,i){this.vsWorker=e,this.req=t,this.event=i,this.type=3}}class eae{constructor(e,t){this.vsWorker=e,this.req=t,this.type=4}}class tae{constructor(e){this._workerId=-1,this._handler=e,this._lastSentReq=0,this._pendingReplies=Object.create(null),this._pendingEmitters=new Map,this._pendingEvents=new Map}setWorkerId(e){this._workerId=e}sendMessage(e,t){const i=String(++this._lastSentReq);return new Promise((n,s)=>{this._pendingReplies[i]={resolve:n,reject:s},this._send(new Xre(this._workerId,i,e,t))})}listen(e,t){let i=null;const n=new O({onFirstListenerAdd:()=>{i=String(++this._lastSentReq),this._pendingEmitters.set(i,n),this._send(new Qre(this._workerId,i,e,t))},onLastListenerRemove:()=>{this._pendingEmitters.delete(i),this._send(new eae(this._workerId,i)),i=null}});return n.event}handleMessage(e){!e||!e.vsWorker||this._workerId!==-1&&e.vsWorker!==this._workerId||this._handleMessage(e)}_handleMessage(e){switch(e.type){case 1:return this._handleReplyMessage(e);case 0:return this._handleRequestMessage(e);case 2:return this._handleSubscribeEventMessage(e);case 3:return this._handleEventMessage(e);case 4:return this._handleUnsubscribeEventMessage(e)}}_handleReplyMessage(e){if(!this._pendingReplies[e.seq]){console.warn(\"Got reply to unknown seq\");return}const t=this._pendingReplies[e.seq];if(delete this._pendingReplies[e.seq],e.err){let i=e.err;e.err.$isError&&(i=new Error,i.name=e.err.name,i.message=e.err.message,i.stack=e.err.stack),t.reject(i);return}t.resolve(e.res)}_handleRequestMessage(e){const t=e.req;this._handler.handleMessage(e.method,e.args).then(n=>{this._send(new JA(this._workerId,t,n,void 0))},n=>{n.detail instanceof Error&&(n.detail=qN(n.detail)),this._send(new JA(this._workerId,t,void 0,qN(n)))})}_handleSubscribeEventMessage(e){const t=e.req,i=this._handler.handleEvent(e.eventName,e.arg)(n=>{this._send(new Jre(this._workerId,t,n))});this._pendingEvents.set(t,i)}_handleEventMessage(e){if(!this._pendingEmitters.has(e.req)){console.warn(\"Got event for unknown req\");return}this._pendingEmitters.get(e.req).fire(e.event)}_handleUnsubscribeEventMessage(e){if(!this._pendingEvents.has(e.req)){console.warn(\"Got unsubscribe for unknown req\");return}this._pendingEvents.get(e.req).dispose(),this._pendingEvents.delete(e.req)}_send(e){const t=[];if(e.type===0)for(let i=0;i<e.args.length;i++)e.args[i]instanceof ArrayBuffer&&t.push(e.args[i]);else e.type===1&&e.res instanceof ArrayBuffer&&t.push(e.res);this._handler.sendMessage(e,t)}}class iae extends z{constructor(e,t,i){super();let n=null;this._worker=this._register(e.create(\"vs/base/common/worker/simpleWorker\",c=>{this._protocol.handleMessage(c)},c=>{n==null||n(c)})),this._protocol=new tae({sendMessage:(c,d)=>{this._worker.postMessage(c,d)},handleMessage:(c,d)=>{if(typeof i[c]!=\"function\")return Promise.reject(new Error(\"Missing method \"+c+\" on main thread host.\"));try{return Promise.resolve(i[c].apply(i,d))}catch(h){return Promise.reject(h)}},handleEvent:(c,d)=>{if(z7(c)){const h=i[c].call(i,d);if(typeof h!=\"function\")throw new Error(`Missing dynamic event ${c} on main thread host.`);return h}if(H7(c)){const h=i[c];if(typeof h!=\"function\")throw new Error(`Missing event ${c} on main thread host.`);return h}throw new Error(`Malformed event name ${c}`)}}),this._protocol.setWorkerId(this._worker.getId());let s=null;typeof ei.require!=\"undefined\"&&typeof ei.require.getConfig==\"function\"?s=ei.require.getConfig():typeof ei.requirejs!=\"undefined\"&&(s=ei.requirejs.s.contexts._.config);const r=Px(i);this._onModuleLoaded=this._protocol.sendMessage(Yre,[this._worker.getId(),JSON.parse(JSON.stringify(s)),t,r]);const a=(c,d)=>this._request(c,d),l=(c,d)=>this._protocol.listen(c,d);this._lazyProxy=new Promise((c,d)=>{n=d,this._onModuleLoaded.then(h=>{c(nae(h,a,l))},h=>{d(h),this._onError(\"Worker failed to load \"+t,h)})})}getProxyObject(){return this._lazyProxy}_request(e,t){return new Promise((i,n)=>{this._onModuleLoaded.then(()=>{this._protocol.sendMessage(e,t).then(i,n)},n)})}_onError(e,t){console.error(e),console.info(t)}}function H7(o){return o[0]===\"o\"&&o[1]===\"n\"&&br(o.charCodeAt(2))}function z7(o){return/^onDynamic/.test(o)&&br(o.charCodeAt(9))}function nae(o,e,t){const i=r=>function(){const a=Array.prototype.slice.call(arguments,0);return e(r,a)},n=r=>function(a){return t(r,a)},s={};for(const r of o){if(z7(r)){s[r]=n(r);continue}if(H7(r)){s[r]=t(r,void 0);continue}s[r]=i(r)}return s}var QS;const eR=(QS=window.trustedTypes)===null||QS===void 0?void 0:QS.createPolicy(\"defaultWorkerFactory\",{createScriptURL:o=>o});function sae(o){if(ei.MonacoEnvironment){if(typeof ei.MonacoEnvironment.getWorker==\"function\")return ei.MonacoEnvironment.getWorker(\"workerMain.js\",o);if(typeof ei.MonacoEnvironment.getWorkerUrl==\"function\"){const e=ei.MonacoEnvironment.getWorkerUrl(\"workerMain.js\",o);return new Worker(eR?eR.createScriptURL(e):e,{name:o})}}throw new Error(\"You must define a function MonacoEnvironment.getWorkerUrl or MonacoEnvironment.getWorker\")}function oae(o){return typeof o.then==\"function\"}class rae{constructor(e,t,i,n,s){this.id=t;const r=sae(i);oae(r)?this.worker=r:this.worker=Promise.resolve(r),this.postMessage(e,[]),this.worker.then(a=>{a.onmessage=function(l){n(l.data)},a.onmessageerror=s,typeof a.addEventListener==\"function\"&&a.addEventListener(\"error\",s)})}getId(){return this.id}postMessage(e,t){var i;(i=this.worker)===null||i===void 0||i.then(n=>n.postMessage(e,t))}dispose(){var e;(e=this.worker)===null||e===void 0||e.then(t=>t.terminate()),this.worker=null}}class iw{constructor(e){this._label=e,this._webWorkerFailedBeforeError=!1}create(e,t,i){const n=++iw.LAST_WORKER_ID;if(this._webWorkerFailedBeforeError)throw this._webWorkerFailedBeforeError;return new rae(e,n,this._label||\"anonymous\"+n,t,s=>{Tk(s),this._webWorkerFailedBeforeError=s,i(s)})}}iw.LAST_WORKER_ID=0;const aae=3;function U7(o,e,t,i){return new kr(o,e,t).ComputeDiff(i)}class tR{constructor(e){const t=[],i=[];for(let n=0,s=e.length;n<s;n++)t[n]=Mk(e[n],1),i[n]=Ak(e[n],1);this.lines=e,this._startColumns=t,this._endColumns=i}getElements(){const e=[];for(let t=0,i=this.lines.length;t<i;t++)e[t]=this.lines[t].substring(this._startColumns[t]-1,this._endColumns[t]-1);return e}getStrictElement(e){return this.lines[e]}getStartLineNumber(e){return e+1}getEndLineNumber(e){return e+1}createCharSequence(e,t,i){const n=[],s=[],r=[];let a=0;for(let l=t;l<=i;l++){const c=this.lines[l],d=e?this._startColumns[l]:1,h=e?this._endColumns[l]:c.length+1;for(let u=d;u<h;u++)n[a]=c.charCodeAt(u-1),s[a]=l+1,r[a]=u,a++;!e&&l<i&&(n[a]=10,s[a]=l+1,r[a]=c.length+1,a++)}return new lae(n,s,r)}}class lae{constructor(e,t,i){this._charCodes=e,this._lineNumbers=t,this._columns=i}toString(){return\"[\"+this._charCodes.map((e,t)=>(e===10?\"\\\\n\":String.fromCharCode(e))+`-(${this._lineNumbers[t]},${this._columns[t]})`).join(\", \")+\"]\"}_assertIndex(e,t){if(e<0||e>=t.length)throw new Error(\"Illegal index\")}getElements(){return this._charCodes}getStartLineNumber(e){return e>0&&e===this._lineNumbers.length?this.getEndLineNumber(e-1):(this._assertIndex(e,this._lineNumbers),this._lineNumbers[e])}getEndLineNumber(e){return e===-1?this.getStartLineNumber(e+1):(this._assertIndex(e,this._lineNumbers),this._charCodes[e]===10?this._lineNumbers[e]+1:this._lineNumbers[e])}getStartColumn(e){return e>0&&e===this._columns.length?this.getEndColumn(e-1):(this._assertIndex(e,this._columns),this._columns[e])}getEndColumn(e){return e===-1?this.getStartColumn(e+1):(this._assertIndex(e,this._columns),this._charCodes[e]===10?1:this._columns[e]+1)}}class Rm{constructor(e,t,i,n,s,r,a,l){this.originalStartLineNumber=e,this.originalStartColumn=t,this.originalEndLineNumber=i,this.originalEndColumn=n,this.modifiedStartLineNumber=s,this.modifiedStartColumn=r,this.modifiedEndLineNumber=a,this.modifiedEndColumn=l}static createFromDiffChange(e,t,i){const n=t.getStartLineNumber(e.originalStart),s=t.getStartColumn(e.originalStart),r=t.getEndLineNumber(e.originalStart+e.originalLength-1),a=t.getEndColumn(e.originalStart+e.originalLength-1),l=i.getStartLineNumber(e.modifiedStart),c=i.getStartColumn(e.modifiedStart),d=i.getEndLineNumber(e.modifiedStart+e.modifiedLength-1),h=i.getEndColumn(e.modifiedStart+e.modifiedLength-1);return new Rm(n,s,r,a,l,c,d,h)}}function cae(o){if(o.length<=1)return o;const e=[o[0]];let t=e[0];for(let i=1,n=o.length;i<n;i++){const s=o[i],r=s.originalStart-(t.originalStart+t.originalLength),a=s.modifiedStart-(t.modifiedStart+t.modifiedLength);Math.min(r,a)<aae?(t.originalLength=s.originalStart+s.originalLength-t.originalStart,t.modifiedLength=s.modifiedStart+s.modifiedLength-t.modifiedStart):(e.push(s),t=s)}return e}class vp{constructor(e,t,i,n,s){this.originalStartLineNumber=e,this.originalEndLineNumber=t,this.modifiedStartLineNumber=i,this.modifiedEndLineNumber=n,this.charChanges=s}static createFromDiffResult(e,t,i,n,s,r,a){let l,c,d,h,u;if(t.originalLength===0?(l=i.getStartLineNumber(t.originalStart)-1,c=0):(l=i.getStartLineNumber(t.originalStart),c=i.getEndLineNumber(t.originalStart+t.originalLength-1)),t.modifiedLength===0?(d=n.getStartLineNumber(t.modifiedStart)-1,h=0):(d=n.getStartLineNumber(t.modifiedStart),h=n.getEndLineNumber(t.modifiedStart+t.modifiedLength-1)),r&&t.originalLength>0&&t.originalLength<20&&t.modifiedLength>0&&t.modifiedLength<20&&s()){const g=i.createCharSequence(e,t.originalStart,t.originalStart+t.originalLength-1),f=n.createCharSequence(e,t.modifiedStart,t.modifiedStart+t.modifiedLength-1);if(g.getElements().length>0&&f.getElements().length>0){let _=U7(g,f,s,!0).changes;a&&(_=cae(_)),u=[];for(let b=0,v=_.length;b<v;b++)u.push(Rm.createFromDiffChange(_[b],g,f))}}return new vp(l,c,d,h,u)}}class dae{constructor(e,t,i){this.shouldComputeCharChanges=i.shouldComputeCharChanges,this.shouldPostProcessCharChanges=i.shouldPostProcessCharChanges,this.shouldIgnoreTrimWhitespace=i.shouldIgnoreTrimWhitespace,this.shouldMakePrettyDiff=i.shouldMakePrettyDiff,this.originalLines=e,this.modifiedLines=t,this.original=new tR(e),this.modified=new tR(t),this.continueLineDiff=iR(i.maxComputationTime),this.continueCharDiff=iR(i.maxComputationTime===0?0:Math.min(i.maxComputationTime,5e3))}computeDiff(){if(this.original.lines.length===1&&this.original.lines[0].length===0)return this.modified.lines.length===1&&this.modified.lines[0].length===0?{quitEarly:!1,changes:[]}:{quitEarly:!1,changes:[{originalStartLineNumber:1,originalEndLineNumber:1,modifiedStartLineNumber:1,modifiedEndLineNumber:this.modified.lines.length,charChanges:[{modifiedEndColumn:0,modifiedEndLineNumber:0,modifiedStartColumn:0,modifiedStartLineNumber:0,originalEndColumn:0,originalEndLineNumber:0,originalStartColumn:0,originalStartLineNumber:0}]}]};if(this.modified.lines.length===1&&this.modified.lines[0].length===0)return{quitEarly:!1,changes:[{originalStartLineNumber:1,originalEndLineNumber:this.original.lines.length,modifiedStartLineNumber:1,modifiedEndLineNumber:1,charChanges:[{modifiedEndColumn:0,modifiedEndLineNumber:0,modifiedStartColumn:0,modifiedStartLineNumber:0,originalEndColumn:0,originalEndLineNumber:0,originalStartColumn:0,originalStartLineNumber:0}]}]};const e=U7(this.original,this.modified,this.continueLineDiff,this.shouldMakePrettyDiff),t=e.changes,i=e.quitEarly;if(this.shouldIgnoreTrimWhitespace){const a=[];for(let l=0,c=t.length;l<c;l++)a.push(vp.createFromDiffResult(this.shouldIgnoreTrimWhitespace,t[l],this.original,this.modified,this.continueCharDiff,this.shouldComputeCharChanges,this.shouldPostProcessCharChanges));return{quitEarly:i,changes:a}}const n=[];let s=0,r=0;for(let a=-1,l=t.length;a<l;a++){const c=a+1<l?t[a+1]:null,d=c?c.originalStart:this.originalLines.length,h=c?c.modifiedStart:this.modifiedLines.length;for(;s<d&&r<h;){const u=this.originalLines[s],g=this.modifiedLines[r];if(u!==g){{let f=Mk(u,1),_=Mk(g,1);for(;f>1&&_>1;){const b=u.charCodeAt(f-2),v=g.charCodeAt(_-2);if(b!==v)break;f--,_--}(f>1||_>1)&&this._pushTrimWhitespaceCharChange(n,s+1,1,f,r+1,1,_)}{let f=Ak(u,1),_=Ak(g,1);const b=u.length+1,v=g.length+1;for(;f<b&&_<v;){const C=u.charCodeAt(f-1),w=u.charCodeAt(_-1);if(C!==w)break;f++,_++}(f<b||_<v)&&this._pushTrimWhitespaceCharChange(n,s+1,f,b,r+1,_,v)}}s++,r++}c&&(n.push(vp.createFromDiffResult(this.shouldIgnoreTrimWhitespace,c,this.original,this.modified,this.continueCharDiff,this.shouldComputeCharChanges,this.shouldPostProcessCharChanges)),s+=c.originalLength,r+=c.modifiedLength)}return{quitEarly:i,changes:n}}_pushTrimWhitespaceCharChange(e,t,i,n,s,r,a){if(this._mergeTrimWhitespaceCharChange(e,t,i,n,s,r,a))return;let l;this.shouldComputeCharChanges&&(l=[new Rm(t,i,t,n,s,r,s,a)]),e.push(new vp(t,t,s,s,l))}_mergeTrimWhitespaceCharChange(e,t,i,n,s,r,a){const l=e.length;if(l===0)return!1;const c=e[l-1];return c.originalEndLineNumber===0||c.modifiedEndLineNumber===0?!1:c.originalEndLineNumber+1===t&&c.modifiedEndLineNumber+1===s?(c.originalEndLineNumber=t,c.modifiedEndLineNumber=s,this.shouldComputeCharChanges&&c.charChanges&&c.charChanges.push(new Rm(t,i,t,n,s,r,s,a)),!0):!1}}function Mk(o,e){const t=Sn(o);return t===-1?e:t+1}function Ak(o,e){const t=Fr(o);return t===-1?e:t+2}function iR(o){if(o===0)return()=>!0;const e=Date.now();return()=>Date.now()-e<o}class hae{constructor(e,t,i,n){this._uri=e,this._lines=t,this._eol=i,this._versionId=n,this._lineStarts=null,this._cachedTextValue=null}dispose(){this._lines.length=0}get version(){return this._versionId}getText(){return this._cachedTextValue===null&&(this._cachedTextValue=this._lines.join(this._eol)),this._cachedTextValue}onEvents(e){e.eol&&e.eol!==this._eol&&(this._eol=e.eol,this._lineStarts=null);const t=e.changes;for(const i of t)this._acceptDeleteRange(i.range),this._acceptInsertText(new B(i.range.startLineNumber,i.range.startColumn),i.text);this._versionId=e.versionId,this._cachedTextValue=null}_ensureLineStarts(){if(!this._lineStarts){const e=this._eol.length,t=this._lines.length,i=new Uint32Array(t);for(let n=0;n<t;n++)i[n]=this._lines[n].length+e;this._lineStarts=new Dq(i)}}_setLineText(e,t){this._lines[e]=t,this._lineStarts&&this._lineStarts.setValue(e,this._lines[e].length+this._eol.length)}_acceptDeleteRange(e){if(e.startLineNumber===e.endLineNumber){if(e.startColumn===e.endColumn)return;this._setLineText(e.startLineNumber-1,this._lines[e.startLineNumber-1].substring(0,e.startColumn-1)+this._lines[e.startLineNumber-1].substring(e.endColumn-1));return}this._setLineText(e.startLineNumber-1,this._lines[e.startLineNumber-1].substring(0,e.startColumn-1)+this._lines[e.endLineNumber-1].substring(e.endColumn-1)),this._lines.splice(e.startLineNumber,e.endLineNumber-e.startLineNumber),this._lineStarts&&this._lineStarts.removeValues(e.startLineNumber,e.endLineNumber-e.startLineNumber)}_acceptInsertText(e,t){if(t.length===0)return;const i=Ur(t);if(i.length===1){this._setLineText(e.lineNumber-1,this._lines[e.lineNumber-1].substring(0,e.column-1)+i[0]+this._lines[e.lineNumber-1].substring(e.column-1));return}i[i.length-1]+=this._lines[e.lineNumber-1].substring(e.column-1),this._setLineText(e.lineNumber-1,this._lines[e.lineNumber-1].substring(0,e.column-1)+i[0]);const n=new Uint32Array(i.length-1);for(let s=1;s<i.length;s++)this._lines.splice(e.lineNumber+s-1,0,i[s]),n[s-1]=i[s].length+this._eol.length;this._lineStarts&&this._lineStarts.insertValues(e.lineNumber,n)}}class uae{constructor(e,t,i){const n=new Uint8Array(e*t);for(let s=0,r=e*t;s<r;s++)n[s]=i;this._data=n,this.rows=e,this.cols=t}get(e,t){return this._data[e*this.cols+t]}set(e,t,i){this._data[e*this.cols+t]=i}}class gae{constructor(e){let t=0,i=0;for(let s=0,r=e.length;s<r;s++){const[a,l,c]=e[s];l>t&&(t=l),a>i&&(i=a),c>i&&(i=c)}t++,i++;const n=new uae(i,t,0);for(let s=0,r=e.length;s<r;s++){const[a,l,c]=e[s];n.set(a,l,c)}this._states=n,this._maxCharCode=t}nextState(e,t){return t<0||t>=this._maxCharCode?0:this._states.get(e,t)}}let JS=null;function fae(){return JS===null&&(JS=new gae([[1,104,2],[1,72,2],[1,102,6],[1,70,6],[2,116,3],[2,84,3],[3,116,4],[3,84,4],[4,112,5],[4,80,5],[5,115,9],[5,83,9],[5,58,10],[6,105,7],[6,73,7],[7,108,8],[7,76,8],[8,101,9],[8,69,9],[9,58,10],[10,47,11],[11,47,12]])),JS}let If=null;function pae(){if(If===null){If=new Pg(0);const o=` \t<>'\"\\u3001\\u3002\\uFF61\\uFF64\\uFF0C\\uFF0E\\uFF1A\\uFF1B\\u2018\\u3008\\u300C\\u300E\\u3014\\uFF08\\uFF3B\\uFF5B\\uFF62\\uFF63\\uFF5D\\uFF3D\\uFF09\\u3015\\u300F\\u300D\\u3009\\u2019\\uFF40\\uFF5E\\u2026`;for(let t=0;t<o.length;t++)If.set(o.charCodeAt(t),1);const e=\".,;:\";for(let t=0;t<e.length;t++)If.set(e.charCodeAt(t),2)}return If}class tC{static _createLink(e,t,i,n,s){let r=s-1;do{const a=t.charCodeAt(r);if(e.get(a)!==2)break;r--}while(r>n);if(n>0){const a=t.charCodeAt(n-1),l=t.charCodeAt(r);(a===40&&l===41||a===91&&l===93||a===123&&l===125)&&r--}return{range:{startLineNumber:i,startColumn:n+1,endLineNumber:i,endColumn:r+2},url:t.substring(n,r+1)}}static computeLinks(e,t=fae()){const i=pae(),n=[];for(let s=1,r=e.getLineCount();s<=r;s++){const a=e.getLineContent(s),l=a.length;let c=0,d=0,h=0,u=1,g=!1,f=!1,_=!1,b=!1;for(;c<l;){let v=!1;const C=a.charCodeAt(c);if(u===13){let w;switch(C){case 40:g=!0,w=0;break;case 41:w=g?0:1;break;case 91:_=!0,f=!0,w=0;break;case 93:_=!1,w=f?0:1;break;case 123:b=!0,w=0;break;case 125:w=b?0:1;break;case 39:w=h===39?1:0;break;case 34:w=h===34?1:0;break;case 96:w=h===96?1:0;break;case 42:w=h===42?1:0;break;case 124:w=h===124?1:0;break;case 32:w=_?0:1;break;default:w=i.get(C)}w===1&&(n.push(tC._createLink(i,a,s,d,c)),v=!0)}else if(u===12){let w;C===91?(f=!0,w=0):w=i.get(C),w===1?v=!0:u=13}else u=t.nextState(u,C),u===0&&(v=!0);v&&(u=1,g=!1,f=!1,b=!1,d=c+1,h=C),c++}u===13&&n.push(tC._createLink(i,a,s,d,l))}return n}}function mae(o){return!o||typeof o.getLineCount!=\"function\"||typeof o.getLineContent!=\"function\"?[]:tC.computeLinks(o)}class Rk{constructor(){this._defaultValueSet=[[\"true\",\"false\"],[\"True\",\"False\"],[\"Private\",\"Public\",\"Friend\",\"ReadOnly\",\"Partial\",\"Protected\",\"WriteOnly\"],[\"public\",\"protected\",\"private\"]]}navigateValueSet(e,t,i,n,s){if(e&&t){const r=this.doNavigateValueSet(t,s);if(r)return{range:e,value:r}}if(i&&n){const r=this.doNavigateValueSet(n,s);if(r)return{range:i,value:r}}return null}doNavigateValueSet(e,t){const i=this.numberReplace(e,t);return i!==null?i:this.textReplace(e,t)}numberReplace(e,t){const i=Math.pow(10,e.length-(e.lastIndexOf(\".\")+1));let n=Number(e);const s=parseFloat(e);return!isNaN(n)&&!isNaN(s)&&n===s?n===0&&!t?null:(n=Math.floor(n*i),n+=t?i:-i,String(n/i)):null}textReplace(e,t){return this.valueSetsReplace(this._defaultValueSet,e,t)}valueSetsReplace(e,t,i){let n=null;for(let s=0,r=e.length;n===null&&s<r;s++)n=this.valueSetReplace(e[s],t,i);return n}valueSetReplace(e,t,i){let n=e.indexOf(t);return n>=0?(n+=i?1:-1,n<0?n=e.length-1:n%=e.length,e[n]):null}}Rk.INSTANCE=new Rk;var Uc=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class _ae extends hae{get uri(){return this._uri}get eol(){return this._eol}getValue(){return this.getText()}getLinesContent(){return this._lines.slice(0)}getLineCount(){return this._lines.length}getLineContent(e){return this._lines[e-1]}getWordAtPosition(e,t){const i=Mp(e.column,uP(t),this._lines[e.lineNumber-1],0);return i?new L(e.lineNumber,i.startColumn,e.lineNumber,i.endColumn):null}words(e){const t=this._lines,i=this._wordenize.bind(this);let n=0,s=\"\",r=0,a=[];return{*[Symbol.iterator](){for(;;)if(r<a.length){const l=s.substring(a[r].start,a[r].end);r+=1,yield l}else if(n<t.length)s=t[n],a=i(s,e),r=0,n+=1;else break}}}getLineWords(e,t){const i=this._lines[e-1],n=this._wordenize(i,t),s=[];for(const r of n)s.push({word:i.substring(r.start,r.end),startColumn:r.start+1,endColumn:r.end+1});return s}_wordenize(e,t){const i=[];let n;for(t.lastIndex=0;(n=t.exec(e))&&n[0].length!==0;)i.push({start:n.index,end:n.index+n[0].length});return i}getValueInRange(e){if(e=this._validateRange(e),e.startLineNumber===e.endLineNumber)return this._lines[e.startLineNumber-1].substring(e.startColumn-1,e.endColumn-1);const t=this._eol,i=e.startLineNumber-1,n=e.endLineNumber-1,s=[];s.push(this._lines[i].substring(e.startColumn-1));for(let r=i+1;r<n;r++)s.push(this._lines[r]);return s.push(this._lines[n].substring(0,e.endColumn-1)),s.join(t)}offsetAt(e){return e=this._validatePosition(e),this._ensureLineStarts(),this._lineStarts.getPrefixSum(e.lineNumber-2)+(e.column-1)}positionAt(e){e=Math.floor(e),e=Math.max(0,e),this._ensureLineStarts();const t=this._lineStarts.getIndexOf(e),i=this._lines[t.index].length;return{lineNumber:1+t.index,column:1+Math.min(t.remainder,i)}}_validateRange(e){const t=this._validatePosition({lineNumber:e.startLineNumber,column:e.startColumn}),i=this._validatePosition({lineNumber:e.endLineNumber,column:e.endColumn});return t.lineNumber!==e.startLineNumber||t.column!==e.startColumn||i.lineNumber!==e.endLineNumber||i.column!==e.endColumn?{startLineNumber:t.lineNumber,startColumn:t.column,endLineNumber:i.lineNumber,endColumn:i.column}:e}_validatePosition(e){if(!B.isIPosition(e))throw new Error(\"bad position\");let{lineNumber:t,column:i}=e,n=!1;if(t<1)t=1,i=1,n=!0;else if(t>this._lines.length)t=this._lines.length,i=this._lines[t-1].length+1,n=!0;else{const s=this._lines[t-1].length+1;i<1?(i=1,n=!0):i>s&&(i=s,n=!0)}return n?{lineNumber:t,column:i}:e}}class tc{constructor(e,t){this._host=e,this._models=Object.create(null),this._foreignModuleFactory=t,this._foreignModule=null}dispose(){this._models=Object.create(null)}_getModel(e){return this._models[e]}_getModels(){const e=[];return Object.keys(this._models).forEach(t=>e.push(this._models[t])),e}acceptNewModel(e){this._models[e.url]=new _ae(me.parse(e.url),e.lines,e.EOL,e.versionId)}acceptModelChanged(e,t){if(!this._models[e])return;this._models[e].onEvents(t)}acceptRemovedModel(e){!this._models[e]||delete this._models[e]}computeUnicodeHighlights(e,t,i){return Uc(this,void 0,void 0,function*(){const n=this._getModel(e);return n?bN.computeUnicodeHighlights(n,t,i):{ranges:[],hasMore:!1,ambiguousCharacterCount:0,invisibleCharacterCount:0,nonBasicAsciiCharacterCount:0}})}computeDiff(e,t,i,n){return Uc(this,void 0,void 0,function*(){const s=this._getModel(e),r=this._getModel(t);return!s||!r?null:tc.computeDiff(s,r,i,n)})}static computeDiff(e,t,i,n){const s=e.getLinesContent(),r=t.getLinesContent(),l=new dae(s,r,{shouldComputeCharChanges:!0,shouldPostProcessCharChanges:!0,shouldIgnoreTrimWhitespace:i,shouldMakePrettyDiff:!0,maxComputationTime:n}).computeDiff(),c=l.changes.length>0?!1:this._modelsAreIdentical(e,t);return{quitEarly:l.quitEarly,identical:c,changes:l.changes}}static _modelsAreIdentical(e,t){const i=e.getLineCount(),n=t.getLineCount();if(i!==n)return!1;for(let s=1;s<=i;s++){const r=e.getLineContent(s),a=t.getLineContent(s);if(r!==a)return!1}return!0}computeMoreMinimalEdits(e,t){return Uc(this,void 0,void 0,function*(){const i=this._getModel(e);if(!i)return t;const n=[];let s;t=t.slice(0).sort((r,a)=>{if(r.range&&a.range)return L.compareRangesUsingStarts(r.range,a.range);const l=r.range?0:1,c=a.range?0:1;return l-c});for(let{range:r,text:a,eol:l}of t){if(typeof l==\"number\"&&(s=l),L.isEmpty(r)&&!a)continue;const c=i.getValueInRange(r);if(a=a.replace(/\\r\\n|\\n|\\r/g,i.eol),c===a)continue;if(Math.max(a.length,c.length)>tc._diffLimit){n.push({range:r,text:a});continue}const d=QX(c,a,!1),h=i.offsetAt(L.lift(r).getStartPosition());for(const u of d){const g=i.positionAt(h+u.originalStart),f=i.positionAt(h+u.originalStart+u.originalLength),_={text:a.substr(u.modifiedStart,u.modifiedLength),range:{startLineNumber:g.lineNumber,startColumn:g.column,endLineNumber:f.lineNumber,endColumn:f.column}};i.getValueInRange(_.range)!==_.text&&n.push(_)}}return typeof s==\"number\"&&n.push({eol:s,text:\"\",range:{startLineNumber:0,startColumn:0,endLineNumber:0,endColumn:0}}),n})}computeLinks(e){return Uc(this,void 0,void 0,function*(){const t=this._getModel(e);return t?mae(t):null})}textualSuggest(e,t,i,n){return Uc(this,void 0,void 0,function*(){const s=new Hn(!0),r=new RegExp(i,n),a=new Set;e:for(const l of e){const c=this._getModel(l);if(!!c){for(const d of c.words(r))if(!(d===t||!isNaN(Number(d)))&&(a.add(d),a.size>tc._suggestionsLimit))break e}}return{words:Array.from(a),duration:s.elapsed()}})}computeWordRanges(e,t,i,n){return Uc(this,void 0,void 0,function*(){const s=this._getModel(e);if(!s)return Object.create(null);const r=new RegExp(i,n),a=Object.create(null);for(let l=t.startLineNumber;l<t.endLineNumber;l++){const c=s.getLineWords(l,r);for(const d of c){if(!isNaN(Number(d.word)))continue;let h=a[d.word];h||(h=[],a[d.word]=h),h.push({startLineNumber:l,startColumn:d.startColumn,endLineNumber:l,endColumn:d.endColumn})}}return a})}navigateValueSet(e,t,i,n,s){return Uc(this,void 0,void 0,function*(){const r=this._getModel(e);if(!r)return null;const a=new RegExp(n,s);t.startColumn===t.endColumn&&(t={startLineNumber:t.startLineNumber,startColumn:t.startColumn,endLineNumber:t.endLineNumber,endColumn:t.endColumn+1});const l=r.getValueInRange(t),c=r.getWordAtPosition({lineNumber:t.startLineNumber,column:t.startColumn},a);if(!c)return null;const d=r.getValueInRange(c);return Rk.INSTANCE.navigateValueSet(t,l,c,d,i)})}loadForeignModule(e,t,i){const r={host:l6(i,(a,l)=>this._host.fhr(a,l)),getMirrorModels:()=>this._getModels()};return this._foreignModuleFactory?(this._foreignModule=this._foreignModuleFactory(r,t),Promise.resolve(Px(this._foreignModule))):Promise.reject(new Error(\"Unexpected usage\"))}fmr(e,t){if(!this._foreignModule||typeof this._foreignModule[e]!=\"function\")return Promise.reject(new Error(\"Missing requestHandler or method: \"+e));try{return Promise.resolve(this._foreignModule[e].apply(this._foreignModule,t))}catch(i){return Promise.reject(i)}}}tc._diffLimit=1e5;tc._suggestionsLimit=1e4;typeof importScripts==\"function\"&&(ei.monaco=V7());var bae=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Ef=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},Ok=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const nR=60*1e3,sR=5*60*1e3;function td(o,e){const t=o.getModel(e);return!(!t||t.isTooLargeForSyncing())}let Pk=class extends z{constructor(e,t,i,n,s){super(),this._modelService=e,this._workerManager=this._register(new Cae(this._modelService,n)),this._logService=i,this._register(s.linkProvider.register({language:\"*\",hasAccessToAllModels:!0},{provideLinks:(r,a)=>td(this._modelService,r.uri)?this._workerManager.withWorker().then(l=>l.computeLinks(r.uri)).then(l=>l&&{links:l}):Promise.resolve({links:[]})})),this._register(s.completionProvider.register(\"*\",new vae(this._workerManager,t,this._modelService,n)))}dispose(){super.dispose()}canComputeUnicodeHighlights(e){return td(this._modelService,e)}computedUnicodeHighlights(e,t,i){return this._workerManager.withWorker().then(n=>n.computedUnicodeHighlights(e,t,i))}computeDiff(e,t,i,n){return this._workerManager.withWorker().then(s=>s.computeDiff(e,t,i,n))}computeMoreMinimalEdits(e,t){if(en(t)){if(!td(this._modelService,e))return Promise.resolve(t);const i=Hn.create(!0),n=this._workerManager.withWorker().then(s=>s.computeMoreMinimalEdits(e,t));return n.finally(()=>this._logService.trace(\"FORMAT#computeMoreMinimalEdits\",e.toString(!0),i.elapsed())),Promise.race([n,Vd(1e3).then(()=>t)])}else return Promise.resolve(void 0)}canNavigateValueSet(e){return td(this._modelService,e)}navigateValueSet(e,t,i){return this._workerManager.withWorker().then(n=>n.navigateValueSet(e,t,i))}canComputeWordRanges(e){return td(this._modelService,e)}computeWordRanges(e,t){return this._workerManager.withWorker().then(i=>i.computeWordRanges(e,t))}};Pk=bae([Ef(0,Bt),Ef(1,gN),Ef(2,Co),Ef(3,ti),Ef(4,ue)],Pk);class vae{constructor(e,t,i,n){this.languageConfigurationService=n,this._debugDisplayName=\"wordbasedCompletions\",this._workerManager=e,this._configurationService=t,this._modelService=i}provideCompletionItems(e,t){return Ok(this,void 0,void 0,function*(){const i=this._configurationService.getValue(e.uri,t,\"editor\");if(!i.wordBasedSuggestions)return;const n=[];if(i.wordBasedSuggestionsMode===\"currentDocument\")td(this._modelService,e.uri)&&n.push(e.uri);else for(const h of this._modelService.getModels())!td(this._modelService,h.uri)||(h===e?n.unshift(h.uri):(i.wordBasedSuggestionsMode===\"allDocuments\"||h.getLanguageId()===e.getLanguageId())&&n.push(h.uri));if(n.length===0)return;const s=this.languageConfigurationService.getLanguageConfiguration(e.getLanguageId()).getWordDefinition(),r=e.getWordAtPosition(t),a=r?new L(t.lineNumber,r.startColumn,t.lineNumber,r.endColumn):L.fromPositions(t),l=a.setEndPosition(t.lineNumber,t.column),d=yield(yield this._workerManager.withWorker()).textualSuggest(n,r==null?void 0:r.word,s);if(!!d)return{duration:d.duration,suggestions:d.words.map(h=>({kind:18,label:h,insertText:h,range:{insert:l,replace:a}}))}})}}class Cae extends z{constructor(e,t){super(),this.languageConfigurationService=t,this._modelService=e,this._editorWorkerClient=null,this._lastWorkerUsedTime=new Date().getTime(),this._register(new qm).cancelAndSet(()=>this._checkStopIdleWorker(),Math.round(sR/2)),this._register(this._modelService.onModelRemoved(n=>this._checkStopEmptyWorker()))}dispose(){this._editorWorkerClient&&(this._editorWorkerClient.dispose(),this._editorWorkerClient=null),super.dispose()}_checkStopEmptyWorker(){if(!this._editorWorkerClient)return;this._modelService.getModels().length===0&&(this._editorWorkerClient.dispose(),this._editorWorkerClient=null)}_checkStopIdleWorker(){if(!this._editorWorkerClient)return;new Date().getTime()-this._lastWorkerUsedTime>sR&&(this._editorWorkerClient.dispose(),this._editorWorkerClient=null)}withWorker(){return this._lastWorkerUsedTime=new Date().getTime(),this._editorWorkerClient||(this._editorWorkerClient=new $7(this._modelService,!1,\"editorWorkerService\",this.languageConfigurationService)),Promise.resolve(this._editorWorkerClient)}}class wae extends z{constructor(e,t,i){if(super(),this._syncedModels=Object.create(null),this._syncedModelsLastUsedTime=Object.create(null),this._proxy=e,this._modelService=t,!i){const n=new qm;n.cancelAndSet(()=>this._checkStopModelSync(),Math.round(nR/2)),this._register(n)}}dispose(){for(const e in this._syncedModels)et(this._syncedModels[e]);this._syncedModels=Object.create(null),this._syncedModelsLastUsedTime=Object.create(null),super.dispose()}ensureSyncedResources(e,t){for(const i of e){const n=i.toString();this._syncedModels[n]||this._beginModelSync(i,t),this._syncedModels[n]&&(this._syncedModelsLastUsedTime[n]=new Date().getTime())}}_checkStopModelSync(){const e=new Date().getTime(),t=[];for(const i in this._syncedModelsLastUsedTime)e-this._syncedModelsLastUsedTime[i]>nR&&t.push(i);for(const i of t)this._stopModelSync(i)}_beginModelSync(e,t){const i=this._modelService.getModel(e);if(!i||!t&&i.isTooLargeForSyncing())return;const n=e.toString();this._proxy.acceptNewModel({url:i.uri.toString(),lines:i.getLinesContent(),EOL:i.getEOL(),versionId:i.getVersionId()});const s=new ee;s.add(i.onDidChangeContent(r=>{this._proxy.acceptModelChanged(n.toString(),r)})),s.add(i.onWillDispose(()=>{this._stopModelSync(n)})),s.add(ze(()=>{this._proxy.acceptRemovedModel(n)})),this._syncedModels[n]=s}_stopModelSync(e){const t=this._syncedModels[e];delete this._syncedModels[e],delete this._syncedModelsLastUsedTime[e],et(t)}}class oR{constructor(e){this._instance=e,this._proxyObj=Promise.resolve(this._instance)}dispose(){this._instance.dispose()}getProxyObject(){return this._proxyObj}}class ey{constructor(e){this._workerClient=e}fhr(e,t){return this._workerClient.fhr(e,t)}}class $7 extends z{constructor(e,t,i,n){super(),this.languageConfigurationService=n,this._disposed=!1,this._modelService=e,this._keepIdleModels=t,this._workerFactory=new iw(i),this._worker=null,this._modelManager=null}fhr(e,t){throw new Error(\"Not implemented!\")}_getOrCreateWorker(){if(!this._worker)try{this._worker=this._register(new iae(this._workerFactory,\"vs/editor/common/services/editorSimpleWorker\",new ey(this)))}catch(e){Tk(e),this._worker=new oR(new tc(new ey(this),null))}return this._worker}_getProxy(){return this._getOrCreateWorker().getProxyObject().then(void 0,e=>(Tk(e),this._worker=new oR(new tc(new ey(this),null)),this._getOrCreateWorker().getProxyObject()))}_getOrCreateModelManager(e){return this._modelManager||(this._modelManager=this._register(new wae(e,this._modelService,this._keepIdleModels))),this._modelManager}_withSyncedResources(e,t=!1){return Ok(this,void 0,void 0,function*(){return this._disposed?Promise.reject(hO()):this._getProxy().then(i=>(this._getOrCreateModelManager(i).ensureSyncedResources(e,t),i))})}computedUnicodeHighlights(e,t,i){return this._withSyncedResources([e]).then(n=>n.computeUnicodeHighlights(e.toString(),t,i))}computeDiff(e,t,i,n){return this._withSyncedResources([e,t],!0).then(s=>s.computeDiff(e.toString(),t.toString(),i,n))}computeMoreMinimalEdits(e,t){return this._withSyncedResources([e]).then(i=>i.computeMoreMinimalEdits(e.toString(),t))}computeLinks(e){return this._withSyncedResources([e]).then(t=>t.computeLinks(e.toString()))}textualSuggest(e,t,i){return Ok(this,void 0,void 0,function*(){const n=yield this._withSyncedResources(e),s=i.source,r=Sw(i);return n.textualSuggest(e.map(a=>a.toString()),t,s,r)})}computeWordRanges(e,t){return this._withSyncedResources([e]).then(i=>{const n=this._modelService.getModel(e);if(!n)return Promise.resolve(null);const s=this.languageConfigurationService.getLanguageConfiguration(n.getLanguageId()).getWordDefinition(),r=s.source,a=Sw(s);return i.computeWordRanges(e.toString(),t,r,a)})}navigateValueSet(e,t,i){return this._withSyncedResources([e]).then(n=>{const s=this._modelService.getModel(e);if(!s)return null;const r=this.languageConfigurationService.getLanguageConfiguration(s.getLanguageId()).getWordDefinition(),a=r.source,l=Sw(r);return n.navigateValueSet(e.toString(),t,i,a,l)})}dispose(){super.dispose(),this._disposed=!0}}function Sae(o,e,t){return new yae(o,e,t)}class yae extends $7{constructor(e,t,i){super(e,i.keepIdleModels||!1,i.label,t),this._foreignModuleId=i.moduleId,this._foreignModuleCreateData=i.createData||null,this._foreignModuleHost=i.host||null,this._foreignProxy=null}fhr(e,t){if(!this._foreignModuleHost||typeof this._foreignModuleHost[e]!=\"function\")return Promise.reject(new Error(\"Missing method \"+e+\" or missing main thread foreign host.\"));try{return Promise.resolve(this._foreignModuleHost[e].apply(this._foreignModuleHost,t))}catch(i){return Promise.reject(i)}}_getForeignProxy(){return this._foreignProxy||(this._foreignProxy=this._getProxy().then(e=>{const t=this._foreignModuleHost?Px(this._foreignModuleHost):[];return e.loadForeignModule(this._foreignModuleId,this._foreignModuleCreateData,t).then(i=>{this._foreignModuleCreateData=null;const n=(a,l)=>e.fmr(a,l),s=(a,l)=>function(){const c=Array.prototype.slice.call(arguments,0);return l(a,c)},r={};for(const a of i)r[a]=s(a,n);return r})})),this._foreignProxy}getProxy(){return this._getForeignProxy()}withSyncedResources(e){return this._withSyncedResources(e).then(t=>this.getProxy())}}function Lae(o){return Array.isArray(o)}function Dae(o){return!Lae(o)}function j7(o){return typeof o==\"string\"}function rR(o){return!j7(o)}function iu(o){return!o}function ic(o,e){return o.ignoreCase&&e?e.toLowerCase():e}function aR(o){return o.replace(/[&<>'\"_]/g,\"-\")}function kae(o,e){console.log(`${o.languageId}: ${e}`)}function Lt(o,e){return new Error(`${o.languageId}: ${e}`)}function Tl(o,e,t,i,n){const s=/\\$((\\$)|(#)|(\\d\\d?)|[sS](\\d\\d?)|@(\\w+))/g;let r=null;return e.replace(s,function(a,l,c,d,h,u,g,f,_){return iu(c)?iu(d)?!iu(h)&&h<i.length?ic(o,i[h]):!iu(g)&&o&&typeof o[g]==\"string\"?o[g]:(r===null&&(r=n.split(\".\"),r.unshift(n)),!iu(u)&&u<r.length?ic(o,r[u]):\"\"):ic(o,t):\"$\"})}function Fb(o,e){let t=e;for(;t&&t.length>0;){const i=o.tokenizer[t];if(i)return i;const n=t.lastIndexOf(\".\");n<0?t=null:t=t.substr(0,n)}return null}function xae(o,e){let t=e;for(;t&&t.length>0;){if(o.stateNames[t])return!0;const n=t.lastIndexOf(\".\");n<0?t=null:t=t.substr(0,n)}return!1}var Iae=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Eae=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const K7=5;class Om{constructor(e){this._maxCacheDepth=e,this._entries=Object.create(null)}static create(e,t){return this._INSTANCE.create(e,t)}create(e,t){if(e!==null&&e.depth>=this._maxCacheDepth)return new ju(e,t);let i=ju.getStackElementId(e);i.length>0&&(i+=\"|\"),i+=t;let n=this._entries[i];return n||(n=new ju(e,t),this._entries[i]=n,n)}}Om._INSTANCE=new Om(K7);class ju{constructor(e,t){this.parent=e,this.state=t,this.depth=(this.parent?this.parent.depth:0)+1}static getStackElementId(e){let t=\"\";for(;e!==null;)t.length>0&&(t+=\"|\"),t+=e.state,e=e.parent;return t}static _equals(e,t){for(;e!==null&&t!==null;){if(e===t)return!0;if(e.state!==t.state)return!1;e=e.parent,t=t.parent}return e===null&&t===null}equals(e){return ju._equals(this,e)}push(e){return Om.create(this,e)}pop(){return this.parent}popall(){let e=this;for(;e.parent;)e=e.parent;return e}switchTo(e){return Om.create(this.parent,e)}}class yu{constructor(e,t){this.languageId=e,this.state=t}equals(e){return this.languageId===e.languageId&&this.state.equals(e.state)}clone(){return this.state.clone()===this.state?this:new yu(this.languageId,this.state)}}class Ml{constructor(e){this._maxCacheDepth=e,this._entries=Object.create(null)}static create(e,t){return this._INSTANCE.create(e,t)}create(e,t){if(t!==null)return new Cp(e,t);if(e!==null&&e.depth>=this._maxCacheDepth)return new Cp(e,t);const i=ju.getStackElementId(e);let n=this._entries[i];return n||(n=new Cp(e,null),this._entries[i]=n,n)}}Ml._INSTANCE=new Ml(K7);class Cp{constructor(e,t){this.stack=e,this.embeddedLanguageData=t}clone(){return(this.embeddedLanguageData?this.embeddedLanguageData.clone():null)===this.embeddedLanguageData?this:Ml.create(this.stack,this.embeddedLanguageData)}equals(e){return!(e instanceof Cp)||!this.stack.equals(e.stack)?!1:this.embeddedLanguageData===null&&e.embeddedLanguageData===null?!0:this.embeddedLanguageData===null||e.embeddedLanguageData===null?!1:this.embeddedLanguageData.equals(e.embeddedLanguageData)}}class Nae{constructor(){this._tokens=[],this._languageId=null,this._lastTokenType=null,this._lastTokenLanguage=null}enterLanguage(e){this._languageId=e}emit(e,t){this._lastTokenType===t&&this._lastTokenLanguage===this._languageId||(this._lastTokenType=t,this._lastTokenLanguage=this._languageId,this._tokens.push(new Vp(e,t,this._languageId)))}nestedLanguageTokenize(e,t,i,n){const s=i.languageId,r=i.state,a=Jt.get(s);if(!a)return this.enterLanguage(s),this.emit(n,\"\"),r;const l=a.tokenize(e,t,r);if(n!==0)for(const c of l.tokens)this._tokens.push(new Vp(c.offset+n,c.type,c.language));else this._tokens=this._tokens.concat(l.tokens);return this._lastTokenType=null,this._lastTokenLanguage=null,this._languageId=null,l.endState}finalize(e){return new DI(this._tokens,e)}}class iC{constructor(e,t){this._languageService=e,this._theme=t,this._prependTokens=null,this._tokens=[],this._currentLanguageId=0,this._lastTokenMetadata=0}enterLanguage(e){this._currentLanguageId=this._languageService.languageIdCodec.encodeLanguageId(e)}emit(e,t){const i=this._theme.match(this._currentLanguageId,t);this._lastTokenMetadata!==i&&(this._lastTokenMetadata=i,this._tokens.push(e),this._tokens.push(i))}static _merge(e,t,i){const n=e!==null?e.length:0,s=t.length,r=i!==null?i.length:0;if(n===0&&s===0&&r===0)return new Uint32Array(0);if(n===0&&s===0)return i;if(s===0&&r===0)return e;const a=new Uint32Array(n+s+r);e!==null&&a.set(e);for(let l=0;l<s;l++)a[n+l]=t[l];return i!==null&&a.set(i,n+s),a}nestedLanguageTokenize(e,t,i,n){const s=i.languageId,r=i.state,a=Jt.get(s);if(!a)return this.enterLanguage(s),this.emit(n,\"\"),r;const l=a.tokenizeEncoded(e,t,r);if(n!==0)for(let c=0,d=l.tokens.length;c<d;c+=2)l.tokens[c]+=n;return this._prependTokens=iC._merge(this._prependTokens,this._tokens,l.tokens),this._tokens=[],this._currentLanguageId=0,this._lastTokenMetadata=0,l.endState}finalize(e){return new i1(iC._merge(this._prependTokens,this._tokens,null),e)}}let Pm=class q7{constructor(e,t,i,n,s){this._configurationService=s,this._languageService=e,this._standaloneThemeService=t,this._languageId=i,this._lexer=n,this._embeddedLanguages=Object.create(null),this.embeddedLoaded=Promise.resolve(void 0);let r=!1;this._tokenizationRegistryListener=Jt.onDidChange(a=>{if(r)return;let l=!1;for(let c=0,d=a.changedLanguages.length;c<d;c++){const h=a.changedLanguages[c];if(this._embeddedLanguages[h]){l=!0;break}}l&&(r=!0,Jt.fire([this._languageId]),r=!1)}),this._maxTokenizationLineLength=this._configurationService.getValue(\"editor.maxTokenizationLineLength\",{overrideIdentifier:this._languageId}),this._configurationService.onDidChangeConfiguration(a=>{a.affectsConfiguration(\"editor.maxTokenizationLineLength\")&&(this._maxTokenizationLineLength=this._configurationService.getValue(\"editor.maxTokenizationLineLength\",{overrideIdentifier:this._languageId}))})}dispose(){this._tokenizationRegistryListener.dispose()}getLoadStatus(){const e=[];for(const t in this._embeddedLanguages){const i=Jt.get(t);if(i){if(i instanceof q7){const n=i.getLoadStatus();n.loaded===!1&&e.push(n.promise)}continue}Jt.isResolved(t)||e.push(Jt.getOrCreate(t))}return e.length===0?{loaded:!0}:{loaded:!1,promise:Promise.all(e).then(t=>{})}}getInitialState(){const e=Om.create(null,this._lexer.start);return Ml.create(e,null)}tokenize(e,t,i){if(e.length>=this._maxTokenizationLineLength)return Y4(this._languageId,i);const n=new Nae,s=this._tokenize(e,t,i,n);return n.finalize(s)}tokenizeEncoded(e,t,i){if(e.length>=this._maxTokenizationLineLength)return jI(this._languageService.languageIdCodec.encodeLanguageId(this._languageId),i);const n=new iC(this._languageService,this._standaloneThemeService.getColorTheme().tokenTheme),s=this._tokenize(e,t,i,n);return n.finalize(s)}_tokenize(e,t,i,n){return i.embeddedLanguageData?this._nestedTokenize(e,t,i,0,n):this._myTokenize(e,t,i,0,n)}_findLeavingNestedLanguageOffset(e,t){let i=this._lexer.tokenizer[t.stack.state];if(!i&&(i=Fb(this._lexer,t.stack.state),!i))throw Lt(this._lexer,\"tokenizer state is not defined: \"+t.stack.state);let n=-1,s=!1;for(const r of i){if(!rR(r.action)||r.action.nextEmbedded!==\"@pop\")continue;s=!0;let a=r.regex;const l=r.regex.source;if(l.substr(0,4)===\"^(?:\"&&l.substr(l.length-1,1)===\")\"){const d=(a.ignoreCase?\"i\":\"\")+(a.unicode?\"u\":\"\");a=new RegExp(l.substr(4,l.length-5),d)}const c=e.search(a);c===-1||c!==0&&r.matchOnlyAtLineStart||(n===-1||c<n)&&(n=c)}if(!s)throw Lt(this._lexer,'no rule containing nextEmbedded: \"@pop\" in tokenizer embedded state: '+t.stack.state);return n}_nestedTokenize(e,t,i,n,s){const r=this._findLeavingNestedLanguageOffset(e,i);if(r===-1){const c=s.nestedLanguageTokenize(e,t,i.embeddedLanguageData,n);return Ml.create(i.stack,new yu(i.embeddedLanguageData.languageId,c))}const a=e.substring(0,r);a.length>0&&s.nestedLanguageTokenize(a,!1,i.embeddedLanguageData,n);const l=e.substring(r);return this._myTokenize(l,t,i,n+r,s)}_safeRuleName(e){return e?e.name:\"(unknown)\"}_myTokenize(e,t,i,n,s){s.enterLanguage(this._languageId);const r=e.length,a=t&&this._lexer.includeLF?e+`\n`:e,l=a.length;let c=i.embeddedLanguageData,d=i.stack,h=0,u=null,g=!0;for(;g||h<l;){const f=h,_=d.depth,b=u?u.groups.length:0,v=d.state;let C=null,w=null,S=null,k=null,x=null;if(u){C=u.matches;const I=u.groups.shift();w=I.matched,S=I.action,k=u.rule,u.groups.length===0&&(u=null)}else{if(!g&&h>=l)break;g=!1;let I=this._lexer.tokenizer[v];if(!I&&(I=Fb(this._lexer,v),!I))throw Lt(this._lexer,\"tokenizer state is not defined: \"+v);const R=a.substr(h);for(const P of I)if((h===0||!P.matchOnlyAtLineStart)&&(C=R.match(P.regex),C)){w=C[0],S=P.action;break}}if(C||(C=[\"\"],w=\"\"),S||(h<l&&(C=[a.charAt(h)],w=C[0]),S=this._lexer.defaultToken),w===null)break;for(h+=w.length;Dae(S)&&rR(S)&&S.test;)S=S.test(w,C,v,h===l);let y=null;if(typeof S==\"string\"||Array.isArray(S))y=S;else if(S.group)y=S.group;else if(S.token!==null&&S.token!==void 0){if(S.tokenSubst?y=Tl(this._lexer,S.token,w,C,v):y=S.token,S.nextEmbedded)if(S.nextEmbedded===\"@pop\"){if(!c)throw Lt(this._lexer,\"cannot pop embedded language if not inside one\");c=null}else{if(c)throw Lt(this._lexer,\"cannot enter embedded language from within an embedded language\");x=Tl(this._lexer,S.nextEmbedded,w,C,v)}if(S.goBack&&(h=Math.max(0,h-S.goBack)),S.switchTo&&typeof S.switchTo==\"string\"){let I=Tl(this._lexer,S.switchTo,w,C,v);if(I[0]===\"@\"&&(I=I.substr(1)),Fb(this._lexer,I))d=d.switchTo(I);else throw Lt(this._lexer,\"trying to switch to a state '\"+I+\"' that is undefined in rule: \"+this._safeRuleName(k))}else{if(S.transform&&typeof S.transform==\"function\")throw Lt(this._lexer,\"action.transform not supported\");if(S.next)if(S.next===\"@push\"){if(d.depth>=this._lexer.maxStack)throw Lt(this._lexer,\"maximum tokenizer stack size reached: [\"+d.state+\",\"+d.parent.state+\",...]\");d=d.push(v)}else if(S.next===\"@pop\"){if(d.depth<=1)throw Lt(this._lexer,\"trying to pop an empty stack in rule: \"+this._safeRuleName(k));d=d.pop()}else if(S.next===\"@popall\")d=d.popall();else{let I=Tl(this._lexer,S.next,w,C,v);if(I[0]===\"@\"&&(I=I.substr(1)),Fb(this._lexer,I))d=d.push(I);else throw Lt(this._lexer,\"trying to set a next state '\"+I+\"' that is undefined in rule: \"+this._safeRuleName(k))}}S.log&&typeof S.log==\"string\"&&kae(this._lexer,this._lexer.languageId+\": \"+Tl(this._lexer,S.log,w,C,v))}if(y===null)throw Lt(this._lexer,\"lexer rule has no well-defined action in rule: \"+this._safeRuleName(k));const D=I=>{const R=this._languageService.getLanguageIdByLanguageName(I)||this._languageService.getLanguageIdByMimeType(I)||I,P=this._getNestedEmbeddedLanguageData(R);if(h<l){const H=e.substr(h);return this._nestedTokenize(H,t,Ml.create(d,P),n+h,s)}else return Ml.create(d,P)};if(Array.isArray(y)){if(u&&u.groups.length>0)throw Lt(this._lexer,\"groups cannot be nested: \"+this._safeRuleName(k));if(C.length!==y.length+1)throw Lt(this._lexer,\"matched number of groups does not match the number of actions in rule: \"+this._safeRuleName(k));let I=0;for(let R=1;R<C.length;R++)I+=C[R].length;if(I!==w.length)throw Lt(this._lexer,\"with groups, all characters should be matched in consecutive groups in rule: \"+this._safeRuleName(k));u={rule:k,matches:C,groups:[]};for(let R=0;R<y.length;R++)u.groups[R]={action:y[R],matched:C[R+1]};h-=w.length;continue}else{if(y===\"@rematch\"&&(h-=w.length,w=\"\",C=null,y=\"\",x!==null))return D(x);if(w.length===0){if(l===0||_!==d.depth||v!==d.state||(u?u.groups.length:0)!==b)continue;throw Lt(this._lexer,\"no progress in tokenizer in rule: \"+this._safeRuleName(k))}let I=null;if(j7(y)&&y.indexOf(\"@brackets\")===0){const R=y.substr(9),P=Tae(this._lexer,w);if(!P)throw Lt(this._lexer,\"@brackets token returned but no bracket defined as: \"+w);I=aR(P.token+R)}else{const R=y===\"\"?\"\":y+this._lexer.tokenPostfix;I=aR(R)}f<r&&s.emit(f+n,I)}if(x!==null)return D(x)}return Ml.create(d,c)}_getNestedEmbeddedLanguageData(e){if(!this._languageService.isRegisteredLanguageId(e))return new yu(e,Jp);e!==this._languageId&&(Jt.getOrCreate(e),this._embeddedLanguages[e]=!0);const t=Jt.get(e);return t?new yu(e,t.getInitialState()):new yu(e,Jp)}};Pm=Iae([Eae(4,ot)],Pm);function Tae(o,e){if(!e)return null;e=ic(o,e);const t=o.brackets;for(const i of t){if(i.open===e)return{token:i.token,bracketType:1};if(i.close===e)return{token:i.token,bracketType:-1}}return null}var Mae=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})},ty;const iy=(ty=window.trustedTypes)===null||ty===void 0?void 0:ty.createPolicy(\"standaloneColorizer\",{createHTML:o=>o});class kN{static colorizeElement(e,t,i,n){n=n||{};const s=n.theme||\"vs\",r=n.mimeType||i.getAttribute(\"lang\")||i.getAttribute(\"data-lang\");if(!r)return console.error(\"Mode not detected\"),Promise.resolve();const a=t.getLanguageIdByMimeType(r)||r;e.setTheme(s);const l=i.firstChild?i.firstChild.nodeValue:\"\";i.className+=\" \"+s;const c=d=>{var h;const u=(h=iy==null?void 0:iy.createHTML(d))!==null&&h!==void 0?h:d;i.innerHTML=u};return this.colorize(t,l||\"\",a,n).then(c,d=>console.error(d))}static colorize(e,t,i,n){return Mae(this,void 0,void 0,function*(){const s=e.languageIdCodec;let r=4;n&&typeof n.tabSize==\"number\"&&(r=n.tabSize),Zx(t)&&(t=t.substr(1));const a=Ur(t);if(!e.isRegisteredLanguageId(i))return lR(a,r,s);const l=yield Jt.getOrCreate(i);return l?Aae(a,r,l,s):lR(a,r,s)})}static colorizeLine(e,t,i,n,s=4){const r=xs.isBasicASCII(e,t),a=xs.containsRTL(e,r,i);return e1(new Dc(!1,!0,e,!1,r,a,0,n,[],s,0,0,0,0,-1,\"none\",!1,!1,null)).html}static colorizeModelLine(e,t,i=4){const n=e.getLineContent(t);e.tokenization.forceTokenization(t);const r=e.tokenization.getLineTokens(t).inflate();return this.colorizeLine(n,e.mightContainNonBasicASCII(),e.mightContainRTL(),r,i)}}function Aae(o,e,t,i){return new Promise((n,s)=>{const r=()=>{const a=Rae(o,e,t,i);if(t instanceof Pm){const l=t.getLoadStatus();if(l.loaded===!1){l.promise.then(r,s);return}}n(a)};r()})}function lR(o,e,t){let i=[];const s=new Uint32Array(2);s[0]=0,s[1]=33587200;for(let r=0,a=o.length;r<a;r++){const l=o[r];s[0]=l.length;const c=new Si(s,l,t),d=xs.isBasicASCII(l,!0),h=xs.containsRTL(l,d,!0),u=e1(new Dc(!1,!0,l,!1,d,h,0,c,[],e,0,0,0,0,-1,\"none\",!1,!1,null));i=i.concat(u.html),i.push(\"<br/>\")}return i.join(\"\")}function Rae(o,e,t,i){let n=[],s=t.getInitialState();for(let r=0,a=o.length;r<a;r++){const l=o[r],c=t.tokenizeEncoded(l,!0,s);Si.convertToEndOffset(c.tokens,l.length);const d=new Si(c.tokens,l,i),h=xs.isBasicASCII(l,!0),u=xs.containsRTL(l,h,!0),g=e1(new Dc(!1,!0,l,!1,h,u,0,d.inflate(),[],e,0,0,0,0,-1,\"none\",!1,!1,null));n=n.concat(g.html),n.push(\"<br/>\"),s=c.endState}return n.join(\"\")}var Oae=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Pae=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},Fae=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};let Fk=class extends z{constructor(e){super(),this._themeService=e,this._onCodeEditorAdd=this._register(new O),this.onCodeEditorAdd=this._onCodeEditorAdd.event,this._onCodeEditorRemove=this._register(new O),this.onCodeEditorRemove=this._onCodeEditorRemove.event,this._onDiffEditorAdd=this._register(new O),this.onDiffEditorAdd=this._onDiffEditorAdd.event,this._onDiffEditorRemove=this._register(new O),this.onDiffEditorRemove=this._onDiffEditorRemove.event,this._decorationOptionProviders=new Map,this._codeEditorOpenHandlers=new wn,this._modelProperties=new Map,this._codeEditors=Object.create(null),this._diffEditors=Object.create(null),this._globalStyleSheet=null}addCodeEditor(e){this._codeEditors[e.getId()]=e,this._onCodeEditorAdd.fire(e)}removeCodeEditor(e){delete this._codeEditors[e.getId()]&&this._onCodeEditorRemove.fire(e)}listCodeEditors(){return Object.keys(this._codeEditors).map(e=>this._codeEditors[e])}addDiffEditor(e){this._diffEditors[e.getId()]=e,this._onDiffEditorAdd.fire(e)}removeDiffEditor(e){delete this._diffEditors[e.getId()]&&this._onDiffEditorRemove.fire(e)}listDiffEditors(){return Object.keys(this._diffEditors).map(e=>this._diffEditors[e])}getFocusedCodeEditor(){let e=null;const t=this.listCodeEditors();for(const i of t){if(i.hasTextFocus())return i;i.hasWidgetFocus()&&(e=i)}return e}removeDecorationType(e){const t=this._decorationOptionProviders.get(e);t&&(t.refCount--,t.refCount<=0&&(this._decorationOptionProviders.delete(e),t.dispose(),this.listCodeEditors().forEach(i=>i.removeDecorationsByType(e))))}setModelProperty(e,t,i){const n=e.toString();let s;this._modelProperties.has(n)?s=this._modelProperties.get(n):(s=new Map,this._modelProperties.set(n,s)),s.set(t,i)}getModelProperty(e,t){const i=e.toString();if(this._modelProperties.has(i))return this._modelProperties.get(i).get(t)}openCodeEditor(e,t,i){return Fae(this,void 0,void 0,function*(){for(const n of this._codeEditorOpenHandlers){const s=yield n(e,t,i);if(s!==null)return s}return null})}registerCodeEditorOpenHandler(e){const t=this._codeEditorOpenHandlers.unshift(e);return ze(t)}};Fk=Oae([Pae(0,vt)],Fk);var Bae=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},cR=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},Wae=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};let nC=class extends Fk{constructor(e,t){super(t),this.onCodeEditorAdd(()=>this._checkContextKey()),this.onCodeEditorRemove(()=>this._checkContextKey()),this._editorIsOpen=e.createKey(\"editorIsOpen\",!1),this._activeCodeEditor=null,this.registerCodeEditorOpenHandler((i,n,s)=>Wae(this,void 0,void 0,function*(){return n?this.doOpenEditor(n,i):null}))}_checkContextKey(){let e=!1;for(const t of this.listCodeEditors())if(!t.isSimpleWidget){e=!0;break}this._editorIsOpen.set(e)}setActiveCodeEditor(e){this._activeCodeEditor=e}getActiveCodeEditor(){return this._activeCodeEditor}doOpenEditor(e,t){if(!this.findModel(e,t.resource)){if(t.resource){const s=t.resource.scheme;if(s===Ne.http||s===Ne.https)return $O(t.resource.toString()),e}return null}const n=t.options?t.options.selection:null;if(n)if(typeof n.endLineNumber==\"number\"&&typeof n.endColumn==\"number\")e.setSelection(n),e.revealRangeInCenter(n,1);else{const s={lineNumber:n.startLineNumber,column:n.startColumn};e.setPosition(s),e.revealPositionInCenter(s,1)}return e}findModel(e,t){const i=e.getModel();return i&&i.uri.toString()!==t.toString()?null:i}};nC=Bae([cR(0,xe),cR(1,vt)],nC);Xe(dt,nC);const tf=qe(\"layoutService\");var G7=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Z7=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let sC=class{constructor(e){this._codeEditorService=e,this.onDidLayout=pe.None,this.offset={top:0,quickPickTop:0}}get dimension(){return this._dimension||(this._dimension=yC(window.document.body)),this._dimension}get hasContainer(){return!1}get container(){throw new Error(\"ILayoutService.container is not available in the standalone editor!\")}focus(){var e;(e=this._codeEditorService.getFocusedCodeEditor())===null||e===void 0||e.focus()}};sC=G7([Z7(0,dt)],sC);let Bk=class extends sC{constructor(e,t){super(t),this._container=e}get hasContainer(){return!1}get container(){return this._container}};Bk=G7([Z7(1,dt)],Bk);Xe(tf,sC);var Vae=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},dR=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},Bb=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};function Wb(o){return o.scheme===Ne.file?o.fsPath:o.path}let Y7=0;class Vb{constructor(e,t,i,n,s,r,a){this.id=++Y7,this.type=0,this.actual=e,this.label=e.label,this.confirmBeforeUndo=e.confirmBeforeUndo||!1,this.resourceLabel=t,this.strResource=i,this.resourceLabels=[this.resourceLabel],this.strResources=[this.strResource],this.groupId=n,this.groupOrder=s,this.sourceId=r,this.sourceOrder=a,this.isValid=!0}setValid(e){this.isValid=e}toString(){return`[id:${this.id}] [group:${this.groupId}] [${this.isValid?\"  VALID\":\"INVALID\"}] ${this.actual.constructor.name} - ${this.actual}`}}class hR{constructor(e,t){this.resourceLabel=e,this.reason=t}}class uR{constructor(){this.elements=new Map}createMessage(){const e=[],t=[];for(const[,n]of this.elements)(n.reason===0?e:t).push(n.resourceLabel);const i=[];return e.length>0&&i.push(p({key:\"externalRemoval\",comment:[\"{0} is a list of filenames\"]},\"The following files have been closed and modified on disk: {0}.\",e.join(\", \"))),t.length>0&&i.push(p({key:\"noParallelUniverses\",comment:[\"{0} is a list of filenames\"]},\"The following files have been modified in an incompatible way: {0}.\",t.join(\", \"))),i.join(`\n`)}get size(){return this.elements.size}has(e){return this.elements.has(e)}set(e,t){this.elements.set(e,t)}delete(e){return this.elements.delete(e)}}class Hae{constructor(e,t,i,n,s,r,a){this.id=++Y7,this.type=1,this.actual=e,this.label=e.label,this.confirmBeforeUndo=e.confirmBeforeUndo||!1,this.resourceLabels=t,this.strResources=i,this.groupId=n,this.groupOrder=s,this.sourceId=r,this.sourceOrder=a,this.removedResources=null,this.invalidatedResources=null}canSplit(){return typeof this.actual.split==\"function\"}removeResource(e,t,i){this.removedResources||(this.removedResources=new uR),this.removedResources.has(t)||this.removedResources.set(t,new hR(e,i))}setValid(e,t,i){i?this.invalidatedResources&&(this.invalidatedResources.delete(t),this.invalidatedResources.size===0&&(this.invalidatedResources=null)):(this.invalidatedResources||(this.invalidatedResources=new uR),this.invalidatedResources.has(t)||this.invalidatedResources.set(t,new hR(e,0)))}toString(){return`[id:${this.id}] [group:${this.groupId}] [${this.invalidatedResources?\"INVALID\":\"  VALID\"}] ${this.actual.constructor.name} - ${this.actual}`}}class X7{constructor(e,t){this.resourceLabel=e,this.strResource=t,this._past=[],this._future=[],this.locked=!1,this.versionId=1}dispose(){for(const e of this._past)e.type===1&&e.removeResource(this.resourceLabel,this.strResource,0);for(const e of this._future)e.type===1&&e.removeResource(this.resourceLabel,this.strResource,0);this.versionId++}toString(){const e=[];e.push(`* ${this.strResource}:`);for(let t=0;t<this._past.length;t++)e.push(`   * [UNDO] ${this._past[t]}`);for(let t=this._future.length-1;t>=0;t--)e.push(`   * [REDO] ${this._future[t]}`);return e.join(`\n`)}flushAllElements(){this._past=[],this._future=[],this.versionId++}_setElementValidFlag(e,t){e.type===1?e.setValid(this.resourceLabel,this.strResource,t):e.setValid(t)}setElementsValidFlag(e,t){for(const i of this._past)t(i.actual)&&this._setElementValidFlag(i,e);for(const i of this._future)t(i.actual)&&this._setElementValidFlag(i,e)}pushElement(e){for(const t of this._future)t.type===1&&t.removeResource(this.resourceLabel,this.strResource,1);this._future=[],this._past.push(e),this.versionId++}createSnapshot(e){const t=[];for(let i=0,n=this._past.length;i<n;i++)t.push(this._past[i].id);for(let i=this._future.length-1;i>=0;i--)t.push(this._future[i].id);return new X4(e,t)}restoreSnapshot(e){const t=e.elements.length;let i=!0,n=0,s=-1;for(let a=0,l=this._past.length;a<l;a++,n++){const c=this._past[a];i&&(n>=t||c.id!==e.elements[n])&&(i=!1,s=0),!i&&c.type===1&&c.removeResource(this.resourceLabel,this.strResource,0)}let r=-1;for(let a=this._future.length-1;a>=0;a--,n++){const l=this._future[a];i&&(n>=t||l.id!==e.elements[n])&&(i=!1,r=a),!i&&l.type===1&&l.removeResource(this.resourceLabel,this.strResource,0)}s!==-1&&(this._past=this._past.slice(0,s)),r!==-1&&(this._future=this._future.slice(r+1)),this.versionId++}getElements(){const e=[],t=[];for(const i of this._past)e.push(i.actual);for(const i of this._future)t.push(i.actual);return{past:e,future:t}}getClosestPastElement(){return this._past.length===0?null:this._past[this._past.length-1]}getSecondClosestPastElement(){return this._past.length<2?null:this._past[this._past.length-2]}getClosestFutureElement(){return this._future.length===0?null:this._future[this._future.length-1]}hasPastElements(){return this._past.length>0}hasFutureElements(){return this._future.length>0}splitPastWorkspaceElement(e,t){for(let i=this._past.length-1;i>=0;i--)if(this._past[i]===e){t.has(this.strResource)?this._past[i]=t.get(this.strResource):this._past.splice(i,1);break}this.versionId++}splitFutureWorkspaceElement(e,t){for(let i=this._future.length-1;i>=0;i--)if(this._future[i]===e){t.has(this.strResource)?this._future[i]=t.get(this.strResource):this._future.splice(i,1);break}this.versionId++}moveBackward(e){this._past.pop(),this._future.push(e),this.versionId++}moveForward(e){this._future.pop(),this._past.push(e),this.versionId++}}class ny{constructor(e){this.editStacks=e,this._versionIds=[];for(let t=0,i=this.editStacks.length;t<i;t++)this._versionIds[t]=this.editStacks[t].versionId}isValid(){for(let e=0,t=this.editStacks.length;e<t;e++)if(this._versionIds[e]!==this.editStacks[e].versionId)return!1;return!0}}const Q7=new X7(\"\",\"\");Q7.locked=!0;let Wk=class{constructor(e,t){this._dialogService=e,this._notificationService=t,this._editStacks=new Map,this._uriComparisonKeyComputers=[]}getUriComparisonKey(e){for(const t of this._uriComparisonKeyComputers)if(t[0]===e.scheme)return t[1].getComparisonKey(e);return e.toString()}_print(e){console.log(\"------------------------------------\"),console.log(`AFTER ${e}: `);const t=[];for(const i of this._editStacks)t.push(i[1].toString());console.log(t.join(`\n`))}pushElement(e,t=gg.None,i=Lr.None){if(e.type===0){const n=Wb(e.resource),s=this.getUriComparisonKey(e.resource);this._pushElement(new Vb(e,n,s,t.id,t.nextOrder(),i.id,i.nextOrder()))}else{const n=new Set,s=[],r=[];for(const a of e.resources){const l=Wb(a),c=this.getUriComparisonKey(a);n.has(c)||(n.add(c),s.push(l),r.push(c))}s.length===1?this._pushElement(new Vb(e,s[0],r[0],t.id,t.nextOrder(),i.id,i.nextOrder())):this._pushElement(new Hae(e,s,r,t.id,t.nextOrder(),i.id,i.nextOrder()))}}_pushElement(e){for(let t=0,i=e.strResources.length;t<i;t++){const n=e.resourceLabels[t],s=e.strResources[t];let r;this._editStacks.has(s)?r=this._editStacks.get(s):(r=new X7(n,s),this._editStacks.set(s,r)),r.pushElement(e)}}getLastElement(e){const t=this.getUriComparisonKey(e);if(this._editStacks.has(t)){const i=this._editStacks.get(t);if(i.hasFutureElements())return null;const n=i.getClosestPastElement();return n?n.actual:null}return null}_splitPastWorkspaceElement(e,t){const i=e.actual.split(),n=new Map;for(const s of i){const r=Wb(s.resource),a=this.getUriComparisonKey(s.resource),l=new Vb(s,r,a,0,0,0,0);n.set(l.strResource,l)}for(const s of e.strResources){if(t&&t.has(s))continue;this._editStacks.get(s).splitPastWorkspaceElement(e,n)}}_splitFutureWorkspaceElement(e,t){const i=e.actual.split(),n=new Map;for(const s of i){const r=Wb(s.resource),a=this.getUriComparisonKey(s.resource),l=new Vb(s,r,a,0,0,0,0);n.set(l.strResource,l)}for(const s of e.strResources){if(t&&t.has(s))continue;this._editStacks.get(s).splitFutureWorkspaceElement(e,n)}}removeElements(e){const t=typeof e==\"string\"?e:this.getUriComparisonKey(e);this._editStacks.has(t)&&(this._editStacks.get(t).dispose(),this._editStacks.delete(t))}setElementsValidFlag(e,t,i){const n=this.getUriComparisonKey(e);this._editStacks.has(n)&&this._editStacks.get(n).setElementsValidFlag(t,i)}createSnapshot(e){const t=this.getUriComparisonKey(e);return this._editStacks.has(t)?this._editStacks.get(t).createSnapshot(e):new X4(e,[])}restoreSnapshot(e){const t=this.getUriComparisonKey(e.resource);if(this._editStacks.has(t)){const i=this._editStacks.get(t);i.restoreSnapshot(e),!i.hasPastElements()&&!i.hasFutureElements()&&(i.dispose(),this._editStacks.delete(t))}}getElements(e){const t=this.getUriComparisonKey(e);return this._editStacks.has(t)?this._editStacks.get(t).getElements():{past:[],future:[]}}_findClosestUndoElementWithSource(e){if(!e)return[null,null];let t=null,i=null;for(const[n,s]of this._editStacks){const r=s.getClosestPastElement();!r||r.sourceId===e&&(!t||r.sourceOrder>t.sourceOrder)&&(t=r,i=n)}return[t,i]}canUndo(e){if(e instanceof Lr){const[,i]=this._findClosestUndoElementWithSource(e.id);return!!i}const t=this.getUriComparisonKey(e);return this._editStacks.has(t)?this._editStacks.get(t).hasPastElements():!1}_onError(e,t){Ee(e);for(const i of t.strResources)this.removeElements(i);this._notificationService.error(e)}_acquireLocks(e){for(const t of e.editStacks)if(t.locked)throw new Error(\"Cannot acquire edit stack lock\");for(const t of e.editStacks)t.locked=!0;return()=>{for(const t of e.editStacks)t.locked=!1}}_safeInvokeWithLocks(e,t,i,n,s){const r=this._acquireLocks(i);let a;try{a=t()}catch(l){return r(),n.dispose(),this._onError(l,e)}return a?a.then(()=>(r(),n.dispose(),s()),l=>(r(),n.dispose(),this._onError(l,e))):(r(),n.dispose(),s())}_invokeWorkspacePrepare(e){return Bb(this,void 0,void 0,function*(){if(typeof e.actual.prepareUndoRedo==\"undefined\")return z.None;const t=e.actual.prepareUndoRedo();return typeof t==\"undefined\"?z.None:t})}_invokeResourcePrepare(e,t){if(e.actual.type!==1||typeof e.actual.prepareUndoRedo==\"undefined\")return t(z.None);const i=e.actual.prepareUndoRedo();return i?xx(i)?t(i):i.then(n=>t(n)):t(z.None)}_getAffectedEditStacks(e){const t=[];for(const i of e.strResources)t.push(this._editStacks.get(i)||Q7);return new ny(t)}_tryToSplitAndUndo(e,t,i,n){if(t.canSplit())return this._splitPastWorkspaceElement(t,i),this._notificationService.warn(n),new Hb(this._undo(e,0,!0));for(const s of t.strResources)this.removeElements(s);return this._notificationService.warn(n),new Hb}_checkWorkspaceUndo(e,t,i,n){if(t.removedResources)return this._tryToSplitAndUndo(e,t,t.removedResources,p({key:\"cannotWorkspaceUndo\",comment:[\"{0} is a label for an operation. {1} is another message.\"]},\"Could not undo '{0}' across all files. {1}\",t.label,t.removedResources.createMessage()));if(n&&t.invalidatedResources)return this._tryToSplitAndUndo(e,t,t.invalidatedResources,p({key:\"cannotWorkspaceUndo\",comment:[\"{0} is a label for an operation. {1} is another message.\"]},\"Could not undo '{0}' across all files. {1}\",t.label,t.invalidatedResources.createMessage()));const s=[];for(const a of i.editStacks)a.getClosestPastElement()!==t&&s.push(a.resourceLabel);if(s.length>0)return this._tryToSplitAndUndo(e,t,null,p({key:\"cannotWorkspaceUndoDueToChanges\",comment:[\"{0} is a label for an operation. {1} is a list of filenames.\"]},\"Could not undo '{0}' across all files because changes were made to {1}\",t.label,s.join(\", \")));const r=[];for(const a of i.editStacks)a.locked&&r.push(a.resourceLabel);return r.length>0?this._tryToSplitAndUndo(e,t,null,p({key:\"cannotWorkspaceUndoDueToInProgressUndoRedo\",comment:[\"{0} is a label for an operation. {1} is a list of filenames.\"]},\"Could not undo '{0}' across all files because there is already an undo or redo operation running on {1}\",t.label,r.join(\", \"))):i.isValid()?null:this._tryToSplitAndUndo(e,t,null,p({key:\"cannotWorkspaceUndoDueToInMeantimeUndoRedo\",comment:[\"{0} is a label for an operation. {1} is a list of filenames.\"]},\"Could not undo '{0}' across all files because an undo or redo operation occurred in the meantime\",t.label))}_workspaceUndo(e,t,i){const n=this._getAffectedEditStacks(t),s=this._checkWorkspaceUndo(e,t,n,!1);return s?s.returnValue:this._confirmAndExecuteWorkspaceUndo(e,t,n,i)}_isPartOfUndoGroup(e){if(!e.groupId)return!1;for(const[,t]of this._editStacks){const i=t.getClosestPastElement();if(!!i){if(i===e){const n=t.getSecondClosestPastElement();if(n&&n.groupId===e.groupId)return!0}if(i.groupId===e.groupId)return!0}}return!1}_confirmAndExecuteWorkspaceUndo(e,t,i,n){return Bb(this,void 0,void 0,function*(){if(t.canSplit()&&!this._isPartOfUndoGroup(t)){const a=yield this._dialogService.show(Vt.Info,p(\"confirmWorkspace\",\"Would you like to undo '{0}' across all files?\",t.label),[p({key:\"ok\",comment:[\"{0} denotes a number that is > 1\"]},\"Undo in {0} Files\",i.editStacks.length),p(\"nok\",\"Undo this File\"),p(\"cancel\",\"Cancel\")],{cancelId:2});if(a.choice===2)return;if(a.choice===1)return this._splitPastWorkspaceElement(t,null),this._undo(e,0,!0);const l=this._checkWorkspaceUndo(e,t,i,!1);if(l)return l.returnValue;n=!0}let s;try{s=yield this._invokeWorkspacePrepare(t)}catch(a){return this._onError(a,t)}const r=this._checkWorkspaceUndo(e,t,i,!0);if(r)return s.dispose(),r.returnValue;for(const a of i.editStacks)a.moveBackward(t);return this._safeInvokeWithLocks(t,()=>t.actual.undo(),i,s,()=>this._continueUndoInGroup(t.groupId,n))})}_resourceUndo(e,t,i){if(!t.isValid){e.flushAllElements();return}if(e.locked){const n=p({key:\"cannotResourceUndoDueToInProgressUndoRedo\",comment:[\"{0} is a label for an operation.\"]},\"Could not undo '{0}' because there is already an undo or redo operation running.\",t.label);this._notificationService.warn(n);return}return this._invokeResourcePrepare(t,n=>(e.moveBackward(t),this._safeInvokeWithLocks(t,()=>t.actual.undo(),new ny([e]),n,()=>this._continueUndoInGroup(t.groupId,i))))}_findClosestUndoElementInGroup(e){if(!e)return[null,null];let t=null,i=null;for(const[n,s]of this._editStacks){const r=s.getClosestPastElement();!r||r.groupId===e&&(!t||r.groupOrder>t.groupOrder)&&(t=r,i=n)}return[t,i]}_continueUndoInGroup(e,t){if(!e)return;const[,i]=this._findClosestUndoElementInGroup(e);if(i)return this._undo(i,0,t)}undo(e){if(e instanceof Lr){const[,t]=this._findClosestUndoElementWithSource(e.id);return t?this._undo(t,e.id,!1):void 0}return typeof e==\"string\"?this._undo(e,0,!1):this._undo(this.getUriComparisonKey(e),0,!1)}_undo(e,t=0,i){if(!this._editStacks.has(e))return;const n=this._editStacks.get(e),s=n.getClosestPastElement();if(!s)return;if(s.groupId){const[a,l]=this._findClosestUndoElementInGroup(s.groupId);if(s!==a&&l)return this._undo(l,t,i)}if((s.sourceId!==t||s.confirmBeforeUndo)&&!i)return this._confirmAndContinueUndo(e,t,s);try{return s.type===1?this._workspaceUndo(e,s,i):this._resourceUndo(n,s,i)}finally{}}_confirmAndContinueUndo(e,t,i){return Bb(this,void 0,void 0,function*(){if((yield this._dialogService.show(Vt.Info,p(\"confirmDifferentSource\",\"Would you like to undo '{0}'?\",i.label),[p(\"confirmDifferentSource.yes\",\"Yes\"),p(\"confirmDifferentSource.no\",\"No\")],{cancelId:1})).choice!==1)return this._undo(e,t,!0)})}_findClosestRedoElementWithSource(e){if(!e)return[null,null];let t=null,i=null;for(const[n,s]of this._editStacks){const r=s.getClosestFutureElement();!r||r.sourceId===e&&(!t||r.sourceOrder<t.sourceOrder)&&(t=r,i=n)}return[t,i]}canRedo(e){if(e instanceof Lr){const[,i]=this._findClosestRedoElementWithSource(e.id);return!!i}const t=this.getUriComparisonKey(e);return this._editStacks.has(t)?this._editStacks.get(t).hasFutureElements():!1}_tryToSplitAndRedo(e,t,i,n){if(t.canSplit())return this._splitFutureWorkspaceElement(t,i),this._notificationService.warn(n),new Hb(this._redo(e));for(const s of t.strResources)this.removeElements(s);return this._notificationService.warn(n),new Hb}_checkWorkspaceRedo(e,t,i,n){if(t.removedResources)return this._tryToSplitAndRedo(e,t,t.removedResources,p({key:\"cannotWorkspaceRedo\",comment:[\"{0} is a label for an operation. {1} is another message.\"]},\"Could not redo '{0}' across all files. {1}\",t.label,t.removedResources.createMessage()));if(n&&t.invalidatedResources)return this._tryToSplitAndRedo(e,t,t.invalidatedResources,p({key:\"cannotWorkspaceRedo\",comment:[\"{0} is a label for an operation. {1} is another message.\"]},\"Could not redo '{0}' across all files. {1}\",t.label,t.invalidatedResources.createMessage()));const s=[];for(const a of i.editStacks)a.getClosestFutureElement()!==t&&s.push(a.resourceLabel);if(s.length>0)return this._tryToSplitAndRedo(e,t,null,p({key:\"cannotWorkspaceRedoDueToChanges\",comment:[\"{0} is a label for an operation. {1} is a list of filenames.\"]},\"Could not redo '{0}' across all files because changes were made to {1}\",t.label,s.join(\", \")));const r=[];for(const a of i.editStacks)a.locked&&r.push(a.resourceLabel);return r.length>0?this._tryToSplitAndRedo(e,t,null,p({key:\"cannotWorkspaceRedoDueToInProgressUndoRedo\",comment:[\"{0} is a label for an operation. {1} is a list of filenames.\"]},\"Could not redo '{0}' across all files because there is already an undo or redo operation running on {1}\",t.label,r.join(\", \"))):i.isValid()?null:this._tryToSplitAndRedo(e,t,null,p({key:\"cannotWorkspaceRedoDueToInMeantimeUndoRedo\",comment:[\"{0} is a label for an operation. {1} is a list of filenames.\"]},\"Could not redo '{0}' across all files because an undo or redo operation occurred in the meantime\",t.label))}_workspaceRedo(e,t){const i=this._getAffectedEditStacks(t),n=this._checkWorkspaceRedo(e,t,i,!1);return n?n.returnValue:this._executeWorkspaceRedo(e,t,i)}_executeWorkspaceRedo(e,t,i){return Bb(this,void 0,void 0,function*(){let n;try{n=yield this._invokeWorkspacePrepare(t)}catch(r){return this._onError(r,t)}const s=this._checkWorkspaceRedo(e,t,i,!0);if(s)return n.dispose(),s.returnValue;for(const r of i.editStacks)r.moveForward(t);return this._safeInvokeWithLocks(t,()=>t.actual.redo(),i,n,()=>this._continueRedoInGroup(t.groupId))})}_resourceRedo(e,t){if(!t.isValid){e.flushAllElements();return}if(e.locked){const i=p({key:\"cannotResourceRedoDueToInProgressUndoRedo\",comment:[\"{0} is a label for an operation.\"]},\"Could not redo '{0}' because there is already an undo or redo operation running.\",t.label);this._notificationService.warn(i);return}return this._invokeResourcePrepare(t,i=>(e.moveForward(t),this._safeInvokeWithLocks(t,()=>t.actual.redo(),new ny([e]),i,()=>this._continueRedoInGroup(t.groupId))))}_findClosestRedoElementInGroup(e){if(!e)return[null,null];let t=null,i=null;for(const[n,s]of this._editStacks){const r=s.getClosestFutureElement();!r||r.groupId===e&&(!t||r.groupOrder<t.groupOrder)&&(t=r,i=n)}return[t,i]}_continueRedoInGroup(e){if(!e)return;const[,t]=this._findClosestRedoElementInGroup(e);if(t)return this._redo(t)}redo(e){if(e instanceof Lr){const[,t]=this._findClosestRedoElementWithSource(e.id);return t?this._redo(t):void 0}return typeof e==\"string\"?this._redo(e):this._redo(this.getUriComparisonKey(e))}_redo(e){if(!this._editStacks.has(e))return;const t=this._editStacks.get(e),i=t.getClosestFutureElement();if(!!i){if(i.groupId){const[n,s]=this._findClosestRedoElementInGroup(i.groupId);if(i!==n&&s)return this._redo(s)}try{return i.type===1?this._workspaceRedo(e,i):this._resourceRedo(t,i)}finally{}}}};Wk=Vae([dR(0,CN),dR(1,gi)],Wk);class Hb{constructor(e){this.returnValue=e}}Xe(l1,Wk);class Zn{constructor(e={},t=[],i=[]){this._contents=e,this._keys=t,this._overrides=i,this.frozen=!1,this.overrideConfigurations=new Map}get contents(){return this.checkAndFreeze(this._contents)}get overrides(){return this.checkAndFreeze(this._overrides)}get keys(){return this.checkAndFreeze(this._keys)}isEmpty(){return this._keys.length===0&&Object.keys(this._contents).length===0&&this._overrides.length===0}getValue(e){return e?DT(this.contents,e):this.contents}getOverrideValue(e,t){const i=this.getContentsForOverrideIdentifer(t);return i?e?DT(i,e):i:void 0}override(e){let t=this.overrideConfigurations.get(e);return t||(t=this.createOverrideConfigurationModel(e),this.overrideConfigurations.set(e,t)),t}merge(...e){const t=ya(this.contents),i=ya(this.overrides),n=[...this.keys];for(const s of e)if(!s.isEmpty()){this.mergeContents(t,s.contents);for(const r of s.overrides){const[a]=i.filter(l=>ys(l.identifiers,r.identifiers));a?(this.mergeContents(a.contents,r.contents),a.keys.push(...r.keys),a.keys=el(a.keys)):i.push(ya(r))}for(const r of s.keys)n.indexOf(r)===-1&&n.push(r)}return new Zn(t,n,i)}freeze(){return this.frozen=!0,this}createOverrideConfigurationModel(e){const t=this.getContentsForOverrideIdentifer(e);if(!t||typeof t!=\"object\"||!Object.keys(t).length)return this;const i={};for(const n of el([...Object.keys(this.contents),...Object.keys(t)])){let s=this.contents[n];const r=t[n];r&&(typeof s==\"object\"&&typeof r==\"object\"?(s=ya(s),this.mergeContents(s,r)):s=r),i[n]=s}return new Zn(i,this.keys,this.overrides)}mergeContents(e,t){for(const i of Object.keys(t)){if(i in e&&Fn(e[i])&&Fn(t[i])){this.mergeContents(e[i],t[i]);continue}e[i]=ya(t[i])}}checkAndFreeze(e){return this.frozen&&!Object.isFrozen(e)?gV(e):e}getContentsForOverrideIdentifer(e){let t=null,i=null;const n=s=>{s&&(i?this.mergeContents(i,s):i=ya(s))};for(const s of this.overrides)ys(s.identifiers,[e])?t=s.contents:s.identifiers.includes(e)&&n(s.contents);return n(t),i}toJSON(){return{contents:this.contents,overrides:this.overrides,keys:this.keys}}setValue(e,t){this.addKey(e),sI(this.contents,e,t,i=>{throw new Error(i)})}removeValue(e){this.removeKey(e)&&PW(this.contents,e)}addKey(e){let t=this.keys.length;for(let i=0;i<t;i++)e.indexOf(this.keys[i])===0&&(t=i);this.keys.splice(t,1,e)}removeKey(e){const t=this.keys.indexOf(e);return t!==-1?(this.keys.splice(t,1),!0):!1}}class nw{constructor(e,t,i,n,s=new Zn,r=new Zn,a=new hn,l=new Zn,c=new hn,d=!0){this._defaultConfiguration=e,this._policyConfiguration=t,this._applicationConfiguration=i,this._localUserConfiguration=n,this._remoteUserConfiguration=s,this._workspaceConfiguration=r,this._folderConfigurations=a,this._memoryConfiguration=l,this._memoryConfigurationByResource=c,this._freeze=d,this._workspaceConsolidatedConfiguration=null,this._foldersConsolidatedConfigurations=new hn,this._userConfiguration=null}getValue(e,t,i){return this.getConsolidatedConfigurationModel(e,t,i).getValue(e)}updateValue(e,t,i={}){let n;i.resource?(n=this._memoryConfigurationByResource.get(i.resource),n||(n=new Zn,this._memoryConfigurationByResource.set(i.resource,n))):n=this._memoryConfiguration,t===void 0?n.removeValue(e):n.setValue(e,t),i.resource||(this._workspaceConsolidatedConfiguration=null)}inspect(e,t,i){const n=this.getConsolidatedConfigurationModel(e,t,i),s=this.getFolderConfigurationModelForResource(t.resource,i),r=t.resource?this._memoryConfigurationByResource.get(t.resource)||this._memoryConfiguration:this._memoryConfiguration,a=t.overrideIdentifier?this._defaultConfiguration.freeze().override(t.overrideIdentifier).getValue(e):this._defaultConfiguration.freeze().getValue(e),l=this._policyConfiguration.isEmpty()?void 0:this._policyConfiguration.freeze().getValue(e),c=this.applicationConfiguration.isEmpty()?void 0:this.applicationConfiguration.freeze().getValue(e),d=t.overrideIdentifier?this.userConfiguration.freeze().override(t.overrideIdentifier).getValue(e):this.userConfiguration.freeze().getValue(e),h=t.overrideIdentifier?this.localUserConfiguration.freeze().override(t.overrideIdentifier).getValue(e):this.localUserConfiguration.freeze().getValue(e),u=t.overrideIdentifier?this.remoteUserConfiguration.freeze().override(t.overrideIdentifier).getValue(e):this.remoteUserConfiguration.freeze().getValue(e),g=i?t.overrideIdentifier?this._workspaceConfiguration.freeze().override(t.overrideIdentifier).getValue(e):this._workspaceConfiguration.freeze().getValue(e):void 0,f=s?t.overrideIdentifier?s.freeze().override(t.overrideIdentifier).getValue(e):s.freeze().getValue(e):void 0,_=t.overrideIdentifier?r.override(t.overrideIdentifier).getValue(e):r.getValue(e),b=n.getValue(e),v=el(n.overrides.map(C=>C.identifiers).flat()).filter(C=>n.getOverrideValue(e,C)!==void 0);return{defaultValue:a,policyValue:l,applicationValue:c,userValue:d,userLocalValue:h,userRemoteValue:u,workspaceValue:g,workspaceFolderValue:f,memoryValue:_,value:b,default:a!==void 0?{value:this._defaultConfiguration.freeze().getValue(e),override:t.overrideIdentifier?this._defaultConfiguration.freeze().getOverrideValue(e,t.overrideIdentifier):void 0}:void 0,policy:l!==void 0?{value:l}:void 0,application:c!==void 0?{value:c,override:t.overrideIdentifier?this.applicationConfiguration.freeze().getOverrideValue(e,t.overrideIdentifier):void 0}:void 0,user:d!==void 0?{value:this.userConfiguration.freeze().getValue(e),override:t.overrideIdentifier?this.userConfiguration.freeze().getOverrideValue(e,t.overrideIdentifier):void 0}:void 0,userLocal:h!==void 0?{value:this.localUserConfiguration.freeze().getValue(e),override:t.overrideIdentifier?this.localUserConfiguration.freeze().getOverrideValue(e,t.overrideIdentifier):void 0}:void 0,userRemote:u!==void 0?{value:this.remoteUserConfiguration.freeze().getValue(e),override:t.overrideIdentifier?this.remoteUserConfiguration.freeze().getOverrideValue(e,t.overrideIdentifier):void 0}:void 0,workspace:g!==void 0?{value:this._workspaceConfiguration.freeze().getValue(e),override:t.overrideIdentifier?this._workspaceConfiguration.freeze().getOverrideValue(e,t.overrideIdentifier):void 0}:void 0,workspaceFolder:f!==void 0?{value:s==null?void 0:s.freeze().getValue(e),override:t.overrideIdentifier?s==null?void 0:s.freeze().getOverrideValue(e,t.overrideIdentifier):void 0}:void 0,memory:_!==void 0?{value:r.getValue(e),override:t.overrideIdentifier?r.getOverrideValue(e,t.overrideIdentifier):void 0}:void 0,overrideIdentifiers:v.length?v:void 0}}get applicationConfiguration(){return this._applicationConfiguration}get userConfiguration(){return this._userConfiguration||(this._userConfiguration=this._remoteUserConfiguration.isEmpty()?this._localUserConfiguration:this._localUserConfiguration.merge(this._remoteUserConfiguration),this._freeze&&this._userConfiguration.freeze()),this._userConfiguration}get localUserConfiguration(){return this._localUserConfiguration}get remoteUserConfiguration(){return this._remoteUserConfiguration}getConsolidatedConfigurationModel(e,t,i){let n=this.getConsolidatedConfigurationModelForResource(t,i);return t.overrideIdentifier&&(n=n.override(t.overrideIdentifier)),!this._policyConfiguration.isEmpty()&&this._policyConfiguration.getValue(e)!==void 0&&(n=n.merge(this._policyConfiguration)),n}getConsolidatedConfigurationModelForResource({resource:e},t){let i=this.getWorkspaceConsolidatedConfiguration();if(t&&e){const n=t.getFolder(e);n&&(i=this.getFolderConsolidatedConfiguration(n.uri)||i);const s=this._memoryConfigurationByResource.get(e);s&&(i=i.merge(s))}return i}getWorkspaceConsolidatedConfiguration(){return this._workspaceConsolidatedConfiguration||(this._workspaceConsolidatedConfiguration=this._defaultConfiguration.merge(this.applicationConfiguration,this.userConfiguration,this._workspaceConfiguration,this._memoryConfiguration),this._freeze&&(this._workspaceConfiguration=this._workspaceConfiguration.freeze())),this._workspaceConsolidatedConfiguration}getFolderConsolidatedConfiguration(e){let t=this._foldersConsolidatedConfigurations.get(e);if(!t){const i=this.getWorkspaceConsolidatedConfiguration(),n=this._folderConfigurations.get(e);n?(t=i.merge(n),this._freeze&&(t=t.freeze()),this._foldersConsolidatedConfigurations.set(e,t)):t=i}return t}getFolderConfigurationModelForResource(e,t){if(t&&e){const i=t.getFolder(e);if(i)return this._folderConfigurations.get(i.uri)}}toData(){return{defaults:{contents:this._defaultConfiguration.contents,overrides:this._defaultConfiguration.overrides,keys:this._defaultConfiguration.keys},policy:{contents:this._policyConfiguration.contents,overrides:this._policyConfiguration.overrides,keys:this._policyConfiguration.keys},application:{contents:this.applicationConfiguration.contents,overrides:this.applicationConfiguration.overrides,keys:this.applicationConfiguration.keys},user:{contents:this.userConfiguration.contents,overrides:this.userConfiguration.overrides,keys:this.userConfiguration.keys},workspace:{contents:this._workspaceConfiguration.contents,overrides:this._workspaceConfiguration.overrides,keys:this._workspaceConfiguration.keys},folders:[...this._folderConfigurations.keys()].reduce((e,t)=>{const{contents:i,overrides:n,keys:s}=this._folderConfigurations.get(t);return e.push([t,{contents:i,overrides:n,keys:s}]),e},[])}}static parse(e){const t=this.parseConfigurationModel(e.defaults),i=this.parseConfigurationModel(e.policy),n=this.parseConfigurationModel(e.application),s=this.parseConfigurationModel(e.user),r=this.parseConfigurationModel(e.workspace),a=e.folders.reduce((l,c)=>(l.set(me.revive(c[0]),this.parseConfigurationModel(c[1])),l),new hn);return new nw(t,i,n,s,new Zn,r,a,new Zn,new hn,!1)}static parseConfigurationModel(e){return new Zn(e.contents,e.keys,e.overrides).freeze()}}class zae{constructor(e,t,i,n){this.change=e,this.previous=t,this.currentConfiguraiton=i,this.currentWorkspace=n,this._previousConfiguration=void 0;const s=new Set;e.keys.forEach(a=>s.add(a)),e.overrides.forEach(([,a])=>a.forEach(l=>s.add(l))),this.affectedKeys=[...s.values()];const r=new Zn;this.affectedKeys.forEach(a=>r.setValue(a,{})),this.affectedKeysTree=r.contents}get previousConfiguration(){return!this._previousConfiguration&&this.previous&&(this._previousConfiguration=nw.parse(this.previous.data)),this._previousConfiguration}affectsConfiguration(e,t){var i;if(this.doesAffectedKeysTreeContains(this.affectedKeysTree,e)){if(t){const n=this.previousConfiguration?this.previousConfiguration.getValue(e,t,(i=this.previous)===null||i===void 0?void 0:i.workspace):void 0,s=this.currentConfiguraiton.getValue(e,t,this.currentWorkspace);return!$s(n,s)}return!0}return!1}doesAffectedKeysTreeContains(e,t){let i=kP({[t]:!0},()=>{}),n;for(;typeof i==\"object\"&&(n=Object.keys(i)[0]);){if(e=e[n],!e)return!1;i=i[n]}return!0}}const Uae=/^(cursor|delete)/;class $ae extends z{constructor(e,t,i,n,s){super(),this._contextKeyService=e,this._commandService=t,this._telemetryService=i,this._notificationService=n,this._logService=s,this._onDidUpdateKeybindings=this._register(new O),this._currentChord=null,this._currentChordChecker=new qm,this._currentChordStatusMessage=null,this._ignoreSingleModifiers=Lu.EMPTY,this._currentSingleModifier=null,this._currentSingleModifierClearTimeout=new Is,this._logging=!1}get onDidUpdateKeybindings(){return this._onDidUpdateKeybindings?this._onDidUpdateKeybindings.event:pe.None}dispose(){super.dispose()}_log(e){this._logging&&this._logService.info(`[KeybindingService]: ${e}`)}getKeybindings(){return this._getResolver().getKeybindings()}lookupKeybinding(e,t){const i=this._getResolver().lookupPrimaryKeybinding(e,t||this._contextKeyService);if(!!i)return i.resolvedKeybinding}dispatchEvent(e,t){return this._dispatch(e,t)}softDispatch(e,t){this._log(\"/ Soft dispatching keyboard event\");const i=this.resolveKeyboardEvent(e);if(i.isChord())return console.warn(\"Unexpected keyboard event mapped to a chord\"),null;const[n]=i.getDispatchParts();if(n===null)return this._log(\"\\\\ Keyboard event cannot be dispatched\"),null;const s=this._contextKeyService.getContext(t),r=this._currentChord?this._currentChord.keypress:null;return this._getResolver().resolve(s,r,n)}_enterChordMode(e,t){this._currentChord={keypress:e,label:t},this._currentChordStatusMessage=this._notificationService.status(p(\"first.chord\",\"({0}) was pressed. Waiting for second key of chord...\",t));const i=Date.now();this._currentChordChecker.cancelAndSet(()=>{if(!this._documentHasFocus()){this._leaveChordMode();return}Date.now()-i>5e3&&this._leaveChordMode()},500)}_leaveChordMode(){this._currentChordStatusMessage&&(this._currentChordStatusMessage.dispose(),this._currentChordStatusMessage=null),this._currentChordChecker.cancel(),this._currentChord=null}_dispatch(e,t){return this._doDispatch(this.resolveKeyboardEvent(e),t,!1)}_singleModifierDispatch(e,t){const i=this.resolveKeyboardEvent(e),[n]=i.getSingleModifierDispatchParts();if(n)return this._ignoreSingleModifiers.has(n)?(this._log(`+ Ignoring single modifier ${n} due to it being pressed together with other keys.`),this._ignoreSingleModifiers=Lu.EMPTY,this._currentSingleModifierClearTimeout.cancel(),this._currentSingleModifier=null,!1):(this._ignoreSingleModifiers=Lu.EMPTY,this._currentSingleModifier===null?(this._log(`+ Storing single modifier for possible chord ${n}.`),this._currentSingleModifier=n,this._currentSingleModifierClearTimeout.cancelAndSet(()=>{this._log(\"+ Clearing single modifier due to 300ms elapsed.\"),this._currentSingleModifier=null},300),!1):n===this._currentSingleModifier?(this._log(`/ Dispatching single modifier chord ${n} ${n}`),this._currentSingleModifierClearTimeout.cancel(),this._currentSingleModifier=null,this._doDispatch(i,t,!0)):(this._log(`+ Clearing single modifier due to modifier mismatch: ${this._currentSingleModifier} ${n}`),this._currentSingleModifierClearTimeout.cancel(),this._currentSingleModifier=null,!1));const[s]=i.getParts();return this._ignoreSingleModifiers=new Lu(s),this._currentSingleModifier!==null&&this._log(\"+ Clearing single modifier due to other key up.\"),this._currentSingleModifierClearTimeout.cancel(),this._currentSingleModifier=null,!1}_doDispatch(e,t,i=!1){let n=!1;if(e.isChord())return console.warn(\"Unexpected keyboard event mapped to a chord\"),!1;let s=null,r=null;if(i){const[d]=e.getSingleModifierDispatchParts();s=d,r=d}else[s]=e.getDispatchParts(),r=this._currentChord?this._currentChord.keypress:null;if(s===null)return this._log(\"\\\\ Keyboard event cannot be dispatched in keydown phase.\"),n;const a=this._contextKeyService.getContext(t),l=e.getLabel(),c=this._getResolver().resolve(a,r,s);return this._logService.trace(\"KeybindingService#dispatch\",l,c==null?void 0:c.commandId),c&&c.enterChord?(n=!0,this._enterChordMode(s,l),this._log(\"+ Entering chord mode...\"),n):(this._currentChord&&(!c||!c.commandId)&&(this._log(`+ Leaving chord mode: Nothing bound to \"${this._currentChord.label} ${l}\".`),this._notificationService.status(p(\"missing.chord\",\"The key combination ({0}, {1}) is not a command.\",this._currentChord.label,l),{hideAfter:10*1e3}),n=!0),this._leaveChordMode(),c&&c.commandId&&(c.bubble||(n=!0),this._log(`+ Invoking command ${c.commandId}.`),typeof c.commandArgs==\"undefined\"?this._commandService.executeCommand(c.commandId).then(void 0,d=>this._notificationService.warn(d)):this._commandService.executeCommand(c.commandId,c.commandArgs).then(void 0,d=>this._notificationService.warn(d)),Uae.test(c.commandId)||this._telemetryService.publicLog2(\"workbenchActionExecuted\",{id:c.commandId,from:\"keybinding\"})),n)}mightProducePrintableCharacter(e){return e.ctrlKey||e.metaKey?!1:e.keyCode>=31&&e.keyCode<=56||e.keyCode>=21&&e.keyCode<=30}}class Lu{constructor(e){this._ctrlKey=e?e.ctrlKey:!1,this._shiftKey=e?e.shiftKey:!1,this._altKey=e?e.altKey:!1,this._metaKey=e?e.metaKey:!1}has(e){switch(e){case\"ctrl\":return this._ctrlKey;case\"shift\":return this._shiftKey;case\"alt\":return this._altKey;case\"meta\":return this._metaKey}}}Lu.EMPTY=new Lu(null);class wp{constructor(e,t,i){this._log=i,this._defaultKeybindings=e,this._defaultBoundCommands=new Map;for(const n of e){const s=n.command;s&&s.charAt(0)!==\"-\"&&this._defaultBoundCommands.set(s,!0)}this._map=new Map,this._lookupMap=new Map,this._keybindings=wp.handleRemovals([].concat(e).concat(t));for(let n=0,s=this._keybindings.length;n<s;n++){const r=this._keybindings[n];r.keypressParts.length!==0&&(r.when&&r.when.type===0||this._addKeyPress(r.keypressParts[0],r))}}static _isTargetedForRemoval(e,t,i,n){return!(t&&e.keypressParts[0]!==t||i&&e.keypressParts[1]!==i||n&&(!e.when||!zB(n,e.when)))}static handleRemovals(e){const t=new Map;for(let n=0,s=e.length;n<s;n++){const r=e[n];if(r.command&&r.command.charAt(0)===\"-\"){const a=r.command.substring(1);t.has(a)?t.get(a).push(r):t.set(a,[r])}}if(t.size===0)return e;const i=[];for(let n=0,s=e.length;n<s;n++){const r=e[n];if(!r.command||r.command.length===0){i.push(r);continue}if(r.command.charAt(0)===\"-\")continue;const a=t.get(r.command);if(!a||!r.isDefault){i.push(r);continue}let l=!1;for(const c of a){const d=c.keypressParts[0],h=c.keypressParts[1],u=c.when;if(this._isTargetedForRemoval(r,d,h,u)){l=!0;break}}if(!l){i.push(r);continue}}return i}_addKeyPress(e,t){const i=this._map.get(e);if(typeof i==\"undefined\"){this._map.set(e,[t]),this._addToLookupMap(t);return}for(let n=i.length-1;n>=0;n--){const s=i[n];if(s.command===t.command)continue;const r=s.keypressParts.length>1,a=t.keypressParts.length>1;r&&a&&s.keypressParts[1]!==t.keypressParts[1]||wp.whenIsEntirelyIncluded(s.when,t.when)&&this._removeFromLookupMap(s)}i.push(t),this._addToLookupMap(t)}_addToLookupMap(e){if(!e.command)return;let t=this._lookupMap.get(e.command);typeof t==\"undefined\"?(t=[e],this._lookupMap.set(e.command,t)):t.push(e)}_removeFromLookupMap(e){if(!e.command)return;const t=this._lookupMap.get(e.command);if(typeof t!=\"undefined\"){for(let i=0,n=t.length;i<n;i++)if(t[i]===e){t.splice(i,1);return}}}static whenIsEntirelyIncluded(e,t){return!t||t.type===1?!0:!e||e.type===1?!1:eP(e,t)}getKeybindings(){return this._keybindings}lookupPrimaryKeybinding(e,t){const i=this._lookupMap.get(e);if(typeof i==\"undefined\"||i.length===0)return null;if(i.length===1)return i[0];for(let n=i.length-1;n>=0;n--){const s=i[n];if(t.contextMatchesRules(s.when))return s}return i[i.length-1]}resolve(e,t,i){this._log(`| Resolving ${i}${t?` chorded from ${t}`:\"\"}`);let n=null;if(t!==null){const r=this._map.get(t);if(typeof r==\"undefined\")return this._log(\"\\\\ No keybinding entries.\"),null;n=[];for(let a=0,l=r.length;a<l;a++){const c=r[a];c.keypressParts[1]===i&&n.push(c)}}else{const r=this._map.get(i);if(typeof r==\"undefined\")return this._log(\"\\\\ No keybinding entries.\"),null;n=r}const s=this._findCommand(e,n);return s?t===null&&s.keypressParts.length>1&&s.keypressParts[1]!==null?(this._log(`\\\\ From ${n.length} keybinding entries, matched chord, when: ${gR(s.when)}, source: ${fR(s)}.`),{enterChord:!0,leaveChord:!1,commandId:null,commandArgs:null,bubble:!1}):(this._log(`\\\\ From ${n.length} keybinding entries, matched ${s.command}, when: ${gR(s.when)}, source: ${fR(s)}.`),{enterChord:!1,leaveChord:s.keypressParts.length>1,commandId:s.command,commandArgs:s.commandArgs,bubble:s.bubble}):(this._log(`\\\\ From ${n.length} keybinding entries, no when clauses matched the context.`),null)}_findCommand(e,t){for(let i=t.length-1;i>=0;i--){const n=t[i];if(!!wp._contextMatchesRules(e,n.when))return n}return null}static _contextMatchesRules(e,t){return t?t.evaluate(e):!0}}function gR(o){return o?`${o.serialize()}`:\"no when condition\"}function fR(o){return o.extensionId?o.isBuiltinExtension?`built-in extension ${o.extensionId}`:`user extension ${o.extensionId}`:o.isDefault?\"built-in\":\"user\"}class pR{constructor(e,t,i,n,s,r,a){this._resolvedKeybindingItemBrand=void 0,this.resolvedKeybinding=e,this.keypressParts=e?Vk(e.getDispatchParts()):[],e&&this.keypressParts.length===0&&(this.keypressParts=Vk(e.getSingleModifierDispatchParts())),this.bubble=t?t.charCodeAt(0)===94:!1,this.command=this.bubble?t.substr(1):t,this.commandArgs=i,this.when=n,this.isDefault=s,this.extensionId=r,this.isBuiltinExtension=a}}function Vk(o){const e=[];for(let t=0,i=o.length;t<i;t++){const n=o[t];if(!n)return e;e.push(n)}return e}class jae extends u6{constructor(e,t){if(super(),t.length===0)throw zo(\"parts\");this._os=e,this._parts=t}getLabel(){return SE.toLabel(this._os,this._parts,e=>this._getLabel(e))}getAriaLabel(){return _X.toLabel(this._os,this._parts,e=>this._getAriaLabel(e))}getElectronAccelerator(){return this._parts.length>1||this._parts[0].isDuplicateModifierCase()?null:bX.toLabel(this._os,this._parts,e=>this._getElectronAccelerator(e))}isChord(){return this._parts.length>1}getParts(){return this._parts.map(e=>this._getPart(e))}_getPart(e){return new h6(e.ctrlKey,e.shiftKey,e.altKey,e.metaKey,this._getLabel(e),this._getAriaLabel(e))}getDispatchParts(){return this._parts.map(e=>this._getDispatchPart(e))}getSingleModifierDispatchParts(){return this._parts.map(e=>this._getSingleModifierDispatchPart(e))}}class Fm extends jae{constructor(e,t){super(t,e.parts)}_keyCodeToUILabel(e){if(this._os===2)switch(e){case 15:return\"\\u2190\";case 16:return\"\\u2191\";case 17:return\"\\u2192\";case 18:return\"\\u2193\"}return sd.toString(e)}_getLabel(e){return e.isDuplicateModifierCase()?\"\":this._keyCodeToUILabel(e.keyCode)}_getAriaLabel(e){return e.isDuplicateModifierCase()?\"\":sd.toString(e.keyCode)}_getElectronAccelerator(e){return sd.toElectronAccelerator(e.keyCode)}_getDispatchPart(e){return Fm.getDispatchStr(e)}static getDispatchStr(e){if(e.isModifierKey())return null;let t=\"\";return e.ctrlKey&&(t+=\"ctrl+\"),e.shiftKey&&(t+=\"shift+\"),e.altKey&&(t+=\"alt+\"),e.metaKey&&(t+=\"meta+\"),t+=sd.toString(e.keyCode),t}_getSingleModifierDispatchPart(e){return e.keyCode===5&&!e.shiftKey&&!e.altKey&&!e.metaKey?\"ctrl\":e.keyCode===4&&!e.ctrlKey&&!e.altKey&&!e.metaKey?\"shift\":e.keyCode===6&&!e.ctrlKey&&!e.shiftKey&&!e.metaKey?\"alt\":e.keyCode===57&&!e.ctrlKey&&!e.shiftKey&&!e.altKey?\"meta\":null}static _scanCodeToKeyCode(e){const t=Wx[e];if(t!==-1)return t;switch(e){case 10:return 31;case 11:return 32;case 12:return 33;case 13:return 34;case 14:return 35;case 15:return 36;case 16:return 37;case 17:return 38;case 18:return 39;case 19:return 40;case 20:return 41;case 21:return 42;case 22:return 43;case 23:return 44;case 24:return 45;case 25:return 46;case 26:return 47;case 27:return 48;case 28:return 49;case 29:return 50;case 30:return 51;case 31:return 52;case 32:return 53;case 33:return 54;case 34:return 55;case 35:return 56;case 36:return 22;case 37:return 23;case 38:return 24;case 39:return 25;case 40:return 26;case 41:return 27;case 42:return 28;case 43:return 29;case 44:return 30;case 45:return 21;case 51:return 83;case 52:return 81;case 53:return 87;case 54:return 89;case 55:return 88;case 56:return 0;case 57:return 80;case 58:return 90;case 59:return 86;case 60:return 82;case 61:return 84;case 62:return 85;case 106:return 92}return 0}static _resolveSimpleUserBinding(e){if(!e)return null;if(e instanceof Td)return e;const t=this._scanCodeToKeyCode(e.scanCode);return t===0?null:new Td(e.ctrlKey,e.shiftKey,e.altKey,e.metaKey,t)}static resolveUserBinding(e,t){const i=Vk(e.map(n=>this._resolveSimpleUserBinding(n)));return i.length>0?[new Fm(new N0(i),t)]:[]}}var zl;(function(o){o[o.AVOID=0]=\"AVOID\",o[o.ALIGN=1]=\"ALIGN\"})(zl||(zl={}));function Du(o,e,t){const i=t.mode===zl.ALIGN?t.offset:t.offset+t.size,n=t.mode===zl.ALIGN?t.offset+t.size:t.offset;return t.position===0?e<=o-i?i:e<=n?n-e:Math.max(o-e,0):e<=n?n-e:e<=o-i?i:0}class Ng extends z{constructor(e,t){super(),this.container=null,this.delegate=null,this.toDisposeOnClean=z.None,this.toDisposeOnSetContainer=z.None,this.shadowRoot=null,this.shadowRootHostElement=null,this.view=se(\".context-view\"),this.useFixedPosition=!1,this.useShadowDOM=!1,An(this.view),this.setContainer(e,t),this._register(ze(()=>this.setContainer(null,1)))}setContainer(e,t){var i;if(this.container&&(this.toDisposeOnSetContainer.dispose(),this.shadowRoot?(this.shadowRoot.removeChild(this.view),this.shadowRoot=null,(i=this.shadowRootHostElement)===null||i===void 0||i.remove(),this.shadowRootHostElement=null):this.container.removeChild(this.view),this.container=null),e){if(this.container=e,this.useFixedPosition=t!==1,this.useShadowDOM=t===3,this.useShadowDOM){this.shadowRootHostElement=se(\".shadow-root-host\"),this.container.appendChild(this.shadowRootHostElement),this.shadowRoot=this.shadowRootHostElement.attachShadow({mode:\"open\"});const s=document.createElement(\"style\");s.textContent=Kae,this.shadowRoot.appendChild(s),this.shadowRoot.appendChild(this.view),this.shadowRoot.appendChild(se(\"slot\"))}else this.container.appendChild(this.view);const n=new ee;Ng.BUBBLE_UP_EVENTS.forEach(s=>{n.add(Ei(this.container,s,r=>{this.onDOMEvent(r,!1)}))}),Ng.BUBBLE_DOWN_EVENTS.forEach(s=>{n.add(Ei(this.container,s,r=>{this.onDOMEvent(r,!0)},!0))}),this.toDisposeOnSetContainer=n}}show(e){var t,i;this.isVisible()&&this.hide(),Ii(this.view),this.view.className=\"context-view\",this.view.style.top=\"0px\",this.view.style.left=\"0px\",this.view.style.zIndex=\"2575\",this.view.style.position=this.useFixedPosition?\"fixed\":\"absolute\",bs(this.view),this.toDisposeOnClean=e.render(this.view)||z.None,this.delegate=e,this.doLayout(),(i=(t=this.delegate).focus)===null||i===void 0||i.call(t)}getViewElement(){return this.view}layout(){if(!!this.isVisible()){if(this.delegate.canRelayout===!1&&!(Xa&&Fx.pointerEvents)){this.hide();return}this.delegate.layout&&this.delegate.layout(),this.doLayout()}}doLayout(){if(!this.isVisible())return;const e=this.delegate.getAnchor();let t;if(zO(e)){const h=Qi(e),u=hB(e);t={top:h.top*u,left:h.left*u,width:h.width*u,height:h.height*u}}else t={top:e.y,left:e.x,width:e.width||1,height:e.height||2};const i=ro(this.view),n=Sy(this.view),s=this.delegate.anchorPosition||0,r=this.delegate.anchorAlignment||0,a=this.delegate.anchorAxisAlignment||0;let l,c;if(a===0){const h={offset:t.top-window.pageYOffset,size:t.height,position:s===0?0:1},u={offset:t.left,size:t.width,position:r===0?0:1,mode:zl.ALIGN};l=Du(window.innerHeight,n,h)+window.pageYOffset,Gi.intersects({start:l,end:l+n},{start:h.offset,end:h.offset+h.size})&&(u.mode=zl.AVOID),c=Du(window.innerWidth,i,u)}else{const h={offset:t.left,size:t.width,position:r===0?0:1},u={offset:t.top,size:t.height,position:s===0?0:1,mode:zl.ALIGN};c=Du(window.innerWidth,i,h),Gi.intersects({start:c,end:c+i},{start:h.offset,end:h.offset+h.size})&&(u.mode=zl.AVOID),l=Du(window.innerHeight,n,u)+window.pageYOffset}this.view.classList.remove(\"top\",\"bottom\",\"left\",\"right\"),this.view.classList.add(s===0?\"bottom\":\"top\"),this.view.classList.add(r===0?\"left\":\"right\"),this.view.classList.toggle(\"fixed\",this.useFixedPosition);const d=Qi(this.container);this.view.style.top=`${l-(this.useFixedPosition?Qi(this.view).top:d.top)}px`,this.view.style.left=`${c-(this.useFixedPosition?Qi(this.view).left:d.left)}px`,this.view.style.width=\"initial\"}hide(e){const t=this.delegate;this.delegate=null,t!=null&&t.onHide&&t.onHide(e),this.toDisposeOnClean.dispose(),An(this.view)}isVisible(){return!!this.delegate}onDOMEvent(e,t){this.delegate&&(this.delegate.onDOMEvent?this.delegate.onDOMEvent(e,document.activeElement):t&&!Ga(e.target,this.container)&&this.hide())}dispose(){this.hide(),super.dispose()}}Ng.BUBBLE_UP_EVENTS=[\"click\",\"keydown\",\"focus\",\"blur\"];Ng.BUBBLE_DOWN_EVENTS=[\"click\"];const Kae=`\n\t:host {\n\t\tall: initial; /* 1st rule so subsequent properties are reset. */\n\t}\n\n\t@font-face {\n\t\tfont-family: \"codicon\";\n\t\tfont-display: block;\n\t\tsrc: url(\"./codicon.ttf?5d4d76ab2ce5108968ad644d591a16a6\") format(\"truetype\");\n\t}\n\n\t.codicon[class*='codicon-'] {\n\t\tfont: normal normal normal 16px/1 codicon;\n\t\tdisplay: inline-block;\n\t\ttext-decoration: none;\n\t\ttext-rendering: auto;\n\t\ttext-align: center;\n\t\t-webkit-font-smoothing: antialiased;\n\t\t-moz-osx-font-smoothing: grayscale;\n\t\tuser-select: none;\n\t\t-webkit-user-select: none;\n\t\t-ms-user-select: none;\n\t}\n\n\t:host {\n\t\tfont-family: -apple-system, BlinkMacSystemFont, \"Segoe WPC\", \"Segoe UI\", \"HelveticaNeue-Light\", system-ui, \"Ubuntu\", \"Droid Sans\", sans-serif;\n\t}\n\n\t:host-context(.mac) { font-family: -apple-system, BlinkMacSystemFont, sans-serif; }\n\t:host-context(.mac:lang(zh-Hans)) { font-family: -apple-system, BlinkMacSystemFont, \"PingFang SC\", \"Hiragino Sans GB\", sans-serif; }\n\t:host-context(.mac:lang(zh-Hant)) { font-family: -apple-system, BlinkMacSystemFont, \"PingFang TC\", sans-serif; }\n\t:host-context(.mac:lang(ja)) { font-family: -apple-system, BlinkMacSystemFont, \"Hiragino Kaku Gothic Pro\", sans-serif; }\n\t:host-context(.mac:lang(ko)) { font-family: -apple-system, BlinkMacSystemFont, \"Nanum Gothic\", \"Apple SD Gothic Neo\", \"AppleGothic\", sans-serif; }\n\n\t:host-context(.windows) { font-family: \"Segoe WPC\", \"Segoe UI\", sans-serif; }\n\t:host-context(.windows:lang(zh-Hans)) { font-family: \"Segoe WPC\", \"Segoe UI\", \"Microsoft YaHei\", sans-serif; }\n\t:host-context(.windows:lang(zh-Hant)) { font-family: \"Segoe WPC\", \"Segoe UI\", \"Microsoft Jhenghei\", sans-serif; }\n\t:host-context(.windows:lang(ja)) { font-family: \"Segoe WPC\", \"Segoe UI\", \"Yu Gothic UI\", \"Meiryo UI\", sans-serif; }\n\t:host-context(.windows:lang(ko)) { font-family: \"Segoe WPC\", \"Segoe UI\", \"Malgun Gothic\", \"Dotom\", sans-serif; }\n\n\t:host-context(.linux) { font-family: system-ui, \"Ubuntu\", \"Droid Sans\", sans-serif; }\n\t:host-context(.linux:lang(zh-Hans)) { font-family: system-ui, \"Ubuntu\", \"Droid Sans\", \"Source Han Sans SC\", \"Source Han Sans CN\", \"Source Han Sans\", sans-serif; }\n\t:host-context(.linux:lang(zh-Hant)) { font-family: system-ui, \"Ubuntu\", \"Droid Sans\", \"Source Han Sans TC\", \"Source Han Sans TW\", \"Source Han Sans\", sans-serif; }\n\t:host-context(.linux:lang(ja)) { font-family: system-ui, \"Ubuntu\", \"Droid Sans\", \"Source Han Sans J\", \"Source Han Sans JP\", \"Source Han Sans\", sans-serif; }\n\t:host-context(.linux:lang(ko)) { font-family: system-ui, \"Ubuntu\", \"Droid Sans\", \"Source Han Sans K\", \"Source Han Sans JR\", \"Source Han Sans\", \"UnDotum\", \"FBaekmuk Gulim\", sans-serif; }\n`;var qae=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Gae=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let Hk=class extends z{constructor(e){super(),this.layoutService=e,this.currentViewDisposable=z.None,this.container=e.hasContainer?e.container:null,this.contextView=this._register(new Ng(this.container,1)),this.layout(),this._register(e.onDidLayout(()=>this.layout()))}setContainer(e,t){this.contextView.setContainer(e,t||1)}showContextView(e,t,i){t?(t!==this.container||this.shadowRoot!==i)&&(this.container=t,this.setContainer(t,i?3:2)):this.layoutService.hasContainer&&this.container!==this.layoutService.container&&(this.container=this.layoutService.container,this.setContainer(this.container,1)),this.shadowRoot=i,this.contextView.show(e);const n=ze(()=>{this.currentViewDisposable===n&&this.hideContextView()});return this.currentViewDisposable=n,n}getContextViewElement(){return this.contextView.getViewElement()}layout(){this.contextView.layout()}hideContextView(e){this.contextView.hide(e)}};Hk=qae([Gae(0,tf)],Hk);var mR=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const zb=\"**\",_R=\"/\",C0=\"[/\\\\\\\\]\",w0=\"[^/\\\\\\\\]\",Zae=/\\//g;function bR(o,e){switch(o){case 0:return\"\";case 1:return`${w0}*?`;default:return`(?:${C0}|${w0}+${C0}${e?`|${C0}${w0}+`:\"\"})*?`}}function vR(o,e){if(!o)return[];const t=[];let i=!1,n=!1,s=\"\";for(const r of o){switch(r){case e:if(!i&&!n){t.push(s),s=\"\";continue}break;case\"{\":i=!0;break;case\"}\":i=!1;break;case\"[\":n=!0;break;case\"]\":n=!1;break}s+=r}return s&&t.push(s),t}function J7(o){if(!o)return\"\";let e=\"\";const t=vR(o,_R);if(t.every(i=>i===zb))e=\".*\";else{let i=!1;t.forEach((n,s)=>{if(n===zb){if(i)return;e+=bR(2,s===t.length-1)}else{let r=!1,a=\"\",l=!1,c=\"\";for(const d of n){if(d!==\"}\"&&r){a+=d;continue}if(l&&(d!==\"]\"||!c)){let h;d===\"-\"?h=d:(d===\"^\"||d===\"!\")&&!c?h=\"^\":d===_R?h=\"\":h=Ds(d),c+=h;continue}switch(d){case\"{\":r=!0;continue;case\"[\":l=!0;continue;case\"}\":{e+=`(?:${vR(a,\",\").map(g=>J7(g)).join(\"|\")})`,r=!1,a=\"\";break}case\"]\":{e+=\"[\"+c+\"]\",l=!1,c=\"\";break}case\"?\":e+=w0;continue;case\"*\":e+=bR(1);continue;default:e+=Ds(d)}}s<t.length-1&&(t[s+1]!==zb||s+2<t.length)&&(e+=C0)}i=n===zb})}return e}const Yae=/^\\*\\*\\/\\*\\.[\\w\\.-]+$/,Xae=/^\\*\\*\\/([\\w\\.-]+)\\/?$/,Qae=/^{\\*\\*\\/\\*?[\\w\\.-]+\\/?(,\\*\\*\\/\\*?[\\w\\.-]+\\/?)*}$/,Jae=/^{\\*\\*\\/\\*?[\\w\\.-]+(\\/(\\*\\*)?)?(,\\*\\*\\/\\*?[\\w\\.-]+(\\/(\\*\\*)?)?)*}$/,ele=/^\\*\\*((\\/[\\w\\.-]+)+)\\/?$/,tle=/^([\\w\\.-]+(\\/[\\w\\.-]+)*)\\/?$/,CR=new bh(1e4),wR=function(){return!1},Vr=function(){return null};function xN(o,e){if(!o)return Vr;let t;typeof o!=\"string\"?t=o.pattern:t=o,t=t.trim();const i=`${t}_${!!e.trimForExclusions}`;let n=CR.get(i);if(n)return SR(n,o);let s;return Yae.test(t)?n=ile(t.substr(4),t):(s=Xae.exec(sy(t,e)))?n=nle(s[1],t):(e.trimForExclusions?Jae:Qae).test(t)?n=sle(t,e):(s=ele.exec(sy(t,e)))?n=yR(s[1].substr(1),t,!0):(s=tle.exec(sy(t,e)))?n=yR(s[1],t,!1):n=ole(t),CR.set(i,n),SR(n,o)}function SR(o,e){if(typeof e==\"string\")return o;const t=function(i,n){return sL(i,e.base,!sn)?o(i.substr(e.base.length+1),n):null};return t.allBasenames=o.allBasenames,t.allPaths=o.allPaths,t.basenames=o.basenames,t.patterns=o.patterns,t}function sy(o,e){return e.trimForExclusions&&o.endsWith(\"/**\")?o.substr(0,o.length-2):o}function ile(o,e){return function(t,i){return typeof t==\"string\"&&t.endsWith(o)?e:null}}function nle(o,e){const t=`/${o}`,i=`\\\\${o}`,n=function(r,a){return typeof r!=\"string\"?null:a?a===o?e:null:r===o||r.endsWith(t)||r.endsWith(i)?e:null},s=[o];return n.basenames=s,n.patterns=[e],n.allBasenames=s,n}function sle(o,e){const t=t9(o.slice(1,-1).split(\",\").map(a=>xN(a,e)).filter(a=>a!==Vr),o),i=t.length;if(!i)return Vr;if(i===1)return t[0];const n=function(a,l){for(let c=0,d=t.length;c<d;c++)if(t[c](a,l))return o;return null},s=t.find(a=>!!a.allBasenames);s&&(n.allBasenames=s.allBasenames);const r=t.reduce((a,l)=>l.allPaths?a.concat(l.allPaths):a,[]);return r.length&&(n.allPaths=r),n}function yR(o,e,t){const i=md===ai.sep,n=i?o:o.replace(Zae,md),s=md+n,r=ai.sep+o;let a;return t?a=function(l,c){return typeof l==\"string\"&&(l===n||l.endsWith(s)||!i&&(l===o||l.endsWith(r)))?e:null}:a=function(l,c){return typeof l==\"string\"&&(l===n||!i&&l===o)?e:null},a.allPaths=[(t?\"*/\":\"./\")+o],a}function ole(o){try{const e=new RegExp(`^${J7(o)}$`);return function(t){return e.lastIndex=0,typeof t==\"string\"&&e.test(t)?o:null}}catch(e){return Vr}}function rle(o,e,t){return!o||typeof e!=\"string\"?!1:e9(o)(e,void 0,t)}function e9(o,e={}){if(!o)return wR;if(typeof o==\"string\"||ale(o)){const t=xN(o,e);if(t===Vr)return wR;const i=function(n,s){return!!t(n,s)};return t.allBasenames&&(i.allBasenames=t.allBasenames),t.allPaths&&(i.allPaths=t.allPaths),i}return lle(o,e)}function ale(o){const e=o;return e?typeof e.base==\"string\"&&typeof e.pattern==\"string\":!1}function lle(o,e){const t=t9(Object.getOwnPropertyNames(o).map(a=>cle(a,o[a],e)).filter(a=>a!==Vr)),i=t.length;if(!i)return Vr;if(!t.some(a=>!!a.requiresSiblings)){if(i===1)return t[0];const a=function(d,h){let u;for(let g=0,f=t.length;g<f;g++){const _=t[g](d,h);if(typeof _==\"string\")return _;Vy(_)&&(u||(u=[]),u.push(_))}return u?(()=>mR(this,void 0,void 0,function*(){for(const g of u){const f=yield g;if(typeof f==\"string\")return f}return null}))():null},l=t.find(d=>!!d.allBasenames);l&&(a.allBasenames=l.allBasenames);const c=t.reduce((d,h)=>h.allPaths?d.concat(h.allPaths):d,[]);return c.length&&(a.allPaths=c),a}const n=function(a,l,c){let d,h;for(let u=0,g=t.length;u<g;u++){const f=t[u];f.requiresSiblings&&c&&(l||(l=pd(a)),d||(d=l.substr(0,l.length-Y6(a).length)));const _=f(a,l,d,c);if(typeof _==\"string\")return _;Vy(_)&&(h||(h=[]),h.push(_))}return h?(()=>mR(this,void 0,void 0,function*(){for(const u of h){const g=yield u;if(typeof g==\"string\")return g}return null}))():null},s=t.find(a=>!!a.allBasenames);s&&(n.allBasenames=s.allBasenames);const r=t.reduce((a,l)=>l.allPaths?a.concat(l.allPaths):a,[]);return r.length&&(n.allPaths=r),n}function cle(o,e,t){if(e===!1)return Vr;const i=xN(o,t);if(i===Vr)return Vr;if(typeof e==\"boolean\")return i;if(e){const n=e.when;if(typeof n==\"string\"){const s=(r,a,l,c)=>{if(!c||!i(r,a))return null;const d=n.replace(\"$(basename)\",l),h=c(d);return Vy(h)?h.then(u=>u?o:null):h?o:null};return s.requiresSiblings=!0,s}}return i}function t9(o,e){const t=o.filter(a=>!!a.basenames);if(t.length<2)return o;const i=t.reduce((a,l)=>{const c=l.basenames;return c?a.concat(c):a},[]);let n;if(e){n=[];for(let a=0,l=i.length;a<l;a++)n.push(e)}else n=t.reduce((a,l)=>{const c=l.patterns;return c?a.concat(c):a},[]);const s=function(a,l){if(typeof a!=\"string\")return null;if(!l){let d;for(d=a.length;d>0;d--){const h=a.charCodeAt(d-1);if(h===47||h===92)break}l=a.substr(d)}const c=i.indexOf(l);return c!==-1?n[c]:null};s.basenames=i,s.patterns=n,s.allBasenames=i;const r=o.filter(a=>!a.basenames);return r.push(s),r}let Tg=[],IN=[],i9=[];function Ub(o,e=!1){dle(o,!1,e)}function dle(o,e,t){const i=hle(o,e);Tg.push(i),i.userConfigured?i9.push(i):IN.push(i),t&&!i.userConfigured&&Tg.forEach(n=>{n.mime===i.mime||n.userConfigured||(i.extension&&n.extension===i.extension&&console.warn(`Overwriting extension <<${i.extension}>> to now point to mime <<${i.mime}>>`),i.filename&&n.filename===i.filename&&console.warn(`Overwriting filename <<${i.filename}>> to now point to mime <<${i.mime}>>`),i.filepattern&&n.filepattern===i.filepattern&&console.warn(`Overwriting filepattern <<${i.filepattern}>> to now point to mime <<${i.mime}>>`),i.firstline&&n.firstline===i.firstline&&console.warn(`Overwriting firstline <<${i.firstline}>> to now point to mime <<${i.mime}>>`))})}function hle(o,e){return{id:o.id,mime:o.mime,filename:o.filename,extension:o.extension,filepattern:o.filepattern,firstline:o.firstline,userConfigured:e,filenameLowercase:o.filename?o.filename.toLowerCase():void 0,extensionLowercase:o.extension?o.extension.toLowerCase():void 0,filepatternLowercase:o.filepattern?e9(o.filepattern.toLowerCase()):void 0,filepatternOnPath:o.filepattern?o.filepattern.indexOf(ai.sep)>=0:!1}}function ule(){Tg=Tg.filter(o=>o.userConfigured),IN=[]}function gle(o,e){return fle(o,e).map(t=>t.id)}function fle(o,e){let t;if(o)switch(o.scheme){case Ne.file:t=o.fsPath;break;case Ne.data:{t=dc.parseMetaData(o).get(dc.META_DATA_LABEL);break}case Ne.vscodeNotebookCell:t=void 0;break;default:t=o.path}if(!t)return[{id:\"unknown\",mime:Pn.unknown}];t=t.toLowerCase();const i=pd(t),n=LR(t,i,i9);if(n)return[n,{id:Us,mime:Pn.text}];const s=LR(t,i,IN);if(s)return[s,{id:Us,mime:Pn.text}];if(e){const r=ple(e);if(r)return[r,{id:Us,mime:Pn.text}]}return[{id:\"unknown\",mime:Pn.unknown}]}function LR(o,e,t){var i;let n,s,r;for(let a=t.length-1;a>=0;a--){const l=t[a];if(e===l.filenameLowercase){n=l;break}if(l.filepattern&&(!s||l.filepattern.length>s.filepattern.length)){const c=l.filepatternOnPath?o:e;!((i=l.filepatternLowercase)===null||i===void 0)&&i.call(l,c)&&(s=l)}l.extension&&(!r||l.extension.length>r.extension.length)&&e.endsWith(l.extensionLowercase)&&(r=l)}if(n)return n;if(s)return s;if(r)return r}function ple(o){if(Zx(o)&&(o=o.substr(1)),o.length>0)for(let e=Tg.length-1;e>=0;e--){const t=Tg[e];if(!t.firstline)continue;const i=o.match(t.firstline);if(i&&i.length>0)return t}}const $b=Object.prototype.hasOwnProperty,DR=\"vs.editor.nullLanguage\";class mle{constructor(){this._languageIdToLanguage=[],this._languageToLanguageId=new Map,this._register(DR,0),this._register(Us,1),this._nextLanguageId=2}_register(e,t){this._languageIdToLanguage[t]=e,this._languageToLanguageId.set(e,t)}register(e){if(this._languageToLanguageId.has(e))return;const t=this._nextLanguageId++;this._register(e,t)}encodeLanguageId(e){return this._languageToLanguageId.get(e)||0}decodeLanguageId(e){return this._languageIdToLanguage[e]||DR}}class Bm extends z{constructor(e=!0,t=!1){super(),this._onDidChange=this._register(new O),this.onDidChange=this._onDidChange.event,Bm.instanceCount++,this._warnOnOverwrite=t,this.languageIdCodec=new mle,this._dynamicLanguages=[],this._languages={},this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={},e&&(this._initializeFromRegistry(),this._register(sg.onDidChangeLanguages(i=>{this._initializeFromRegistry()})))}dispose(){Bm.instanceCount--,super.dispose()}_initializeFromRegistry(){this._languages={},this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={},ule();const e=[].concat(sg.getLanguages()).concat(this._dynamicLanguages);this._registerLanguages(e)}_registerLanguages(e){for(const t of e)this._registerLanguage(t);this._mimeTypesMap={},this._nameMap={},this._lowercaseNameMap={},Object.keys(this._languages).forEach(t=>{const i=this._languages[t];i.name&&(this._nameMap[i.name]=i.identifier),i.aliases.forEach(n=>{this._lowercaseNameMap[n.toLowerCase()]=i.identifier}),i.mimetypes.forEach(n=>{this._mimeTypesMap[n]=i.identifier})}),di.as(al.Configuration).registerOverrideIdentifiers(this.getRegisteredLanguageIds()),this._onDidChange.fire()}_registerLanguage(e){const t=e.id;let i;$b.call(this._languages,t)?i=this._languages[t]:(this.languageIdCodec.register(t),i={identifier:t,name:null,mimetypes:[],aliases:[],extensions:[],filenames:[],configurationFiles:[],icons:[]},this._languages[t]=i),this._mergeLanguage(i,e)}_mergeLanguage(e,t){const i=t.id;let n=null;if(Array.isArray(t.mimetypes)&&t.mimetypes.length>0&&(e.mimetypes.push(...t.mimetypes),n=t.mimetypes[0]),n||(n=`text/x-${i}`,e.mimetypes.push(n)),Array.isArray(t.extensions)){t.configuration?e.extensions=t.extensions.concat(e.extensions):e.extensions=e.extensions.concat(t.extensions);for(const a of t.extensions)Ub({id:i,mime:n,extension:a},this._warnOnOverwrite)}if(Array.isArray(t.filenames))for(const a of t.filenames)Ub({id:i,mime:n,filename:a},this._warnOnOverwrite),e.filenames.push(a);if(Array.isArray(t.filenamePatterns))for(const a of t.filenamePatterns)Ub({id:i,mime:n,filepattern:a},this._warnOnOverwrite);if(typeof t.firstLine==\"string\"&&t.firstLine.length>0){let a=t.firstLine;a.charAt(0)!==\"^\"&&(a=\"^\"+a);try{const l=new RegExp(a);EB(l)||Ub({id:i,mime:n,firstline:l},this._warnOnOverwrite)}catch(l){Ee(l)}}e.aliases.push(i);let s=null;if(typeof t.aliases!=\"undefined\"&&Array.isArray(t.aliases)&&(t.aliases.length===0?s=[null]:s=t.aliases),s!==null)for(const a of s)!a||a.length===0||e.aliases.push(a);const r=s!==null&&s.length>0;if(!(r&&s[0]===null)){const a=(r?s[0]:null)||i;(r||!e.name)&&(e.name=a)}t.configuration&&e.configurationFiles.push(t.configuration),t.icon&&e.icons.push(t.icon)}isRegisteredLanguageId(e){return e?$b.call(this._languages,e):!1}getRegisteredLanguageIds(){return Object.keys(this._languages)}getLanguageIdByLanguageName(e){const t=e.toLowerCase();return $b.call(this._lowercaseNameMap,t)?this._lowercaseNameMap[t]:null}getLanguageIdByMimeType(e){return e&&$b.call(this._mimeTypesMap,e)?this._mimeTypesMap[e]:null}guessLanguageIdByFilepathOrFirstLine(e,t){return!e&&!t?[]:gle(e,t)}}Bm.instanceCount=0;class Wm extends z{constructor(e=!1){super(),this._onDidEncounterLanguage=this._register(new O),this.onDidEncounterLanguage=this._onDidEncounterLanguage.event,this._onDidChange=this._register(new O({leakWarningThreshold:200})),this.onDidChange=this._onDidChange.event,Wm.instanceCount++,this._encounteredLanguages=new Set,this._registry=this._register(new Bm(!0,e)),this.languageIdCodec=this._registry.languageIdCodec,this._register(this._registry.onDidChange(()=>this._onDidChange.fire()))}dispose(){Wm.instanceCount--,super.dispose()}isRegisteredLanguageId(e){return this._registry.isRegisteredLanguageId(e)}getLanguageIdByLanguageName(e){return this._registry.getLanguageIdByLanguageName(e)}getLanguageIdByMimeType(e){return this._registry.getLanguageIdByMimeType(e)}guessLanguageIdByFilepathOrFirstLine(e,t){const i=this._registry.guessLanguageIdByFilepathOrFirstLine(e,t);return mP(i,null)}createById(e){return new kR(this.onDidChange,()=>this._createAndGetLanguageIdentifier(e))}createByFilepathOrFirstLine(e,t){return new kR(this.onDidChange,()=>{const i=this.guessLanguageIdByFilepathOrFirstLine(e,t);return this._createAndGetLanguageIdentifier(i)})}_createAndGetLanguageIdentifier(e){return(!e||!this.isRegisteredLanguageId(e))&&(e=Us),this._encounteredLanguages.has(e)||(this._encounteredLanguages.add(e),Jt.getOrCreate(e),this._onDidEncounterLanguage.fire(e)),e}}Wm.instanceCount=0;class kR{constructor(e,t){this._onDidChangeLanguages=e,this._selector=t,this._listener=null,this._emitter=null,this.languageId=this._selector()}_dispose(){this._listener&&(this._listener.dispose(),this._listener=null),this._emitter&&(this._emitter.dispose(),this._emitter=null)}get onDidChange(){return this._listener||(this._listener=this._onDidChangeLanguages(()=>this._evaluate())),this._emitter||(this._emitter=new O({onLastListenerRemove:()=>{this._dispose()}})),this._emitter.event}_evaluate(){var e;const t=this._selector();t!==this.languageId&&(this.languageId=t,(e=this._emitter)===null||e===void 0||e.fire(this.languageId))}}const zk=/\\(&([^\\s&])\\)|(^|[^&])&([^\\s&])/,oy=/(&amp;)?(&amp;)([^\\s&])/g;var oC;(function(o){o[o.Right=0]=\"Right\",o[o.Left=1]=\"Left\"})(oC||(oC={}));class Ku extends qr{constructor(e,t,i={}){e.classList.add(\"monaco-menu-container\"),e.setAttribute(\"role\",\"presentation\");const n=document.createElement(\"div\");n.classList.add(\"monaco-menu\"),n.setAttribute(\"role\",\"presentation\"),super(n,{orientation:1,actionViewItemProvider:a=>this.doGetActionViewItem(a,i,s),context:i.context,actionRunner:i.actionRunner,ariaLabel:i.ariaLabel,ariaRole:\"menu\",focusOnlyEnabledItems:!0,triggerKeys:{keys:[3,...Ze||sn?[10]:[]],keyDown:!0}}),this.menuElement=n,this.actionsList.tabIndex=0,this.menuDisposables=this._register(new ee),this.initializeOrUpdateStyleSheet(e,{}),this._register(ut.addTarget(n)),q(n,le.KEY_DOWN,a=>{new Mt(a).equals(2)&&a.preventDefault()}),i.enableMnemonics&&this.menuDisposables.add(q(n,le.KEY_DOWN,a=>{const l=a.key.toLocaleLowerCase();if(this.mnemonics.has(l)){ct.stop(a,!0);const c=this.mnemonics.get(l);if(c.length===1&&(c[0]instanceof xR&&c[0].container&&this.focusItemByElement(c[0].container),c[0].onClick(a)),c.length>1){const d=c.shift();d&&d.container&&(this.focusItemByElement(d.container),c.push(d)),this.mnemonics.set(l,c)}}})),sn&&this._register(q(n,le.KEY_DOWN,a=>{const l=new Mt(a);l.equals(14)||l.equals(11)?(this.focusedItem=this.viewItems.length-1,this.focusNext(),ct.stop(a,!0)):(l.equals(13)||l.equals(12))&&(this.focusedItem=0,this.focusPrevious(),ct.stop(a,!0))})),this._register(q(this.domNode,le.MOUSE_OUT,a=>{const l=a.relatedTarget;Ga(l,this.domNode)||(this.focusedItem=void 0,this.updateFocus(),a.stopPropagation())})),this._register(q(this.actionsList,le.MOUSE_OVER,a=>{let l=a.target;if(!(!l||!Ga(l,this.actionsList)||l===this.actionsList)){for(;l.parentElement!==this.actionsList&&l.parentElement!==null;)l=l.parentElement;if(l.classList.contains(\"action-item\")){const c=this.focusedItem;this.setFocusedItem(l),c!==this.focusedItem&&this.updateFocus()}}})),this._register(ut.addTarget(this.actionsList)),this._register(q(this.actionsList,kt.Tap,a=>{let l=a.initialTarget;if(!(!l||!Ga(l,this.actionsList)||l===this.actionsList)){for(;l.parentElement!==this.actionsList&&l.parentElement!==null;)l=l.parentElement;if(l.classList.contains(\"action-item\")){const c=this.focusedItem;this.setFocusedItem(l),c!==this.focusedItem&&this.updateFocus()}}}));const s={parent:this};this.mnemonics=new Map,this.scrollableElement=this._register(new e_(n,{alwaysConsumeMouseWheel:!0,horizontal:2,vertical:3,verticalScrollbarSize:7,handleMouseWheel:!0,useShadows:!0}));const r=this.scrollableElement.getDomNode();r.style.position=\"\",this._register(q(n,kt.Change,a=>{ct.stop(a,!0);const l=this.scrollableElement.getScrollPosition().scrollTop;this.scrollableElement.setScrollPosition({scrollTop:l-a.translationY})})),this._register(q(r,le.MOUSE_UP,a=>{a.preventDefault()})),n.style.maxHeight=`${Math.max(10,window.innerHeight-e.getBoundingClientRect().top-35)}px`,t=t.filter(a=>{var l;return!((l=i.submenuIds)===null||l===void 0)&&l.has(a.id)?(console.warn(`Found submenu cycle: ${a.id}`),!1):!0}),this.push(t,{icon:!0,label:!0,isMenu:!0}),e.appendChild(this.scrollableElement.getDomNode()),this.scrollableElement.scanDomNode(),this.viewItems.filter(a=>!(a instanceof ry)).forEach((a,l,c)=>{a.updatePositionInSet(l+1,c.length)})}initializeOrUpdateStyleSheet(e,t){this.styleSheet||(Dp(e)?this.styleSheet=qs(e):(Ku.globalStyleSheet||(Ku.globalStyleSheet=qs()),this.styleSheet=Ku.globalStyleSheet)),this.styleSheet.textContent=ble(t,Dp(e))}style(e){const t=this.getContainer();this.initializeOrUpdateStyleSheet(t,e);const i=e.foregroundColor?`${e.foregroundColor}`:\"\",n=e.backgroundColor?`${e.backgroundColor}`:\"\",s=e.borderColor?`1px solid ${e.borderColor}`:\"\",r=\"5px\",a=e.shadowColor?`0 2px 8px ${e.shadowColor}`:\"\";t.style.outline=s,t.style.borderRadius=r,t.style.color=i,t.style.backgroundColor=n,t.style.boxShadow=a,this.viewItems&&this.viewItems.forEach(l=>{(l instanceof Uk||l instanceof ry)&&l.style(e)})}getContainer(){return this.scrollableElement.getDomNode()}get onScroll(){return this.scrollableElement.onScroll}focusItemByElement(e){const t=this.focusedItem;this.setFocusedItem(e),t!==this.focusedItem&&this.updateFocus()}setFocusedItem(e){for(let t=0;t<this.actionsList.children.length;t++){const i=this.actionsList.children[t];if(e===i){this.focusedItem=t;break}}}updateFocus(e){super.updateFocus(e,!0,!0),typeof this.focusedItem!=\"undefined\"&&this.scrollableElement.setScrollPosition({scrollTop:Math.round(this.menuElement.scrollTop)})}doGetActionViewItem(e,t,i){if(e instanceof Ji)return new ry(t.context,e,{icon:!0});if(e instanceof Ip){const n=new xR(e,e.actions,i,Object.assign(Object.assign({},t),{submenuIds:new Set([...t.submenuIds||[],e.id])}));if(t.enableMnemonics){const s=n.getMnemonic();if(s&&n.isEnabled()){let r=[];this.mnemonics.has(s)&&(r=this.mnemonics.get(s)),r.push(n),this.mnemonics.set(s,r)}}return n}else{const n={enableMnemonics:t.enableMnemonics,useEventAsContext:t.useEventAsContext};if(t.getKeyBinding){const r=t.getKeyBinding(e);if(r){const a=r.getLabel();a&&(n.keybinding=a)}}const s=new Uk(t.context,e,n);if(t.enableMnemonics){const r=s.getMnemonic();if(r&&s.isEnabled()){let a=[];this.mnemonics.has(r)&&(a=this.mnemonics.get(r)),a.push(s),this.mnemonics.set(r,a)}}return s}}}class Uk extends wr{constructor(e,t,i={}){if(i.isMenu=!0,super(t,t,i),this.options=i,this.options.icon=i.icon!==void 0?i.icon:!1,this.options.label=i.label!==void 0?i.label:!0,this.cssClass=\"\",this.options.label&&i.enableMnemonics){const n=this.getAction().label;if(n){const s=zk.exec(n);s&&(this.mnemonic=(s[1]?s[1]:s[3]).toLocaleLowerCase())}}this.runOnceToEnableMouseUp=new ft(()=>{!this.element||(this._register(q(this.element,le.MOUSE_UP,n=>{if(ct.stop(n,!0),Ls){if(new Ir(n).rightButton)return;this.onClick(n)}else setTimeout(()=>{this.onClick(n)},0)})),this._register(q(this.element,le.CONTEXT_MENU,n=>{ct.stop(n,!0)})))},100),this._register(this.runOnceToEnableMouseUp)}render(e){super.render(e),this.element&&(this.container=e,this.item=G(this.element,se(\"a.action-menu-item\")),this._action.id===Ji.ID?this.item.setAttribute(\"role\",\"presentation\"):(this.item.setAttribute(\"role\",\"menuitem\"),this.mnemonic&&this.item.setAttribute(\"aria-keyshortcuts\",`${this.mnemonic}`)),this.check=G(this.item,se(\"span.menu-item-check\"+m.menuSelection.cssSelector)),this.check.setAttribute(\"role\",\"none\"),this.label=G(this.item,se(\"span.action-label\")),this.options.label&&this.options.keybinding&&(G(this.item,se(\"span.keybinding\")).textContent=this.options.keybinding),this.runOnceToEnableMouseUp.schedule(),this.updateClass(),this.updateLabel(),this.updateTooltip(),this.updateEnabled(),this.updateChecked())}blur(){super.blur(),this.applyStyle()}focus(){super.focus(),this.item&&this.item.focus(),this.applyStyle()}updatePositionInSet(e,t){this.item&&(this.item.setAttribute(\"aria-posinset\",`${e}`),this.item.setAttribute(\"aria-setsize\",`${t}`))}updateLabel(){var e;if(!!this.label&&this.options.label){Ii(this.label);let t=u5(this.getAction().label);if(t){const i=_le(t);this.options.enableMnemonics||(t=i),this.label.setAttribute(\"aria-label\",i.replace(/&&/g,\"&\"));const n=zk.exec(t);if(n){t=Hx(t),oy.lastIndex=0;let s=oy.exec(t);for(;s&&s[1];)s=oy.exec(t);const r=a=>a.replace(/&amp;&amp;/g,\"&amp;\");s?this.label.append(zx(r(t.substr(0,s.index)),\" \"),se(\"u\",{\"aria-hidden\":\"true\"},s[3]),xB(r(t.substr(s.index+s[0].length)),\" \")):this.label.innerText=r(t).trim(),(e=this.item)===null||e===void 0||e.setAttribute(\"aria-keyshortcuts\",(n[1]?n[1]:n[3]).toLocaleLowerCase())}else this.label.innerText=t.replace(/&&/g,\"&\").trim()}}}updateTooltip(){}updateClass(){this.cssClass&&this.item&&this.item.classList.remove(...this.cssClass.split(\" \")),this.options.icon&&this.label?(this.cssClass=this.getAction().class||\"\",this.label.classList.add(\"icon\"),this.cssClass&&this.label.classList.add(...this.cssClass.split(\" \")),this.updateEnabled()):this.label&&this.label.classList.remove(\"icon\")}updateEnabled(){this.getAction().enabled?(this.element&&(this.element.classList.remove(\"disabled\"),this.element.removeAttribute(\"aria-disabled\")),this.item&&(this.item.classList.remove(\"disabled\"),this.item.removeAttribute(\"aria-disabled\"),this.item.tabIndex=0)):(this.element&&(this.element.classList.add(\"disabled\"),this.element.setAttribute(\"aria-disabled\",\"true\")),this.item&&(this.item.classList.add(\"disabled\"),this.item.setAttribute(\"aria-disabled\",\"true\")))}updateChecked(){if(!this.item)return;const e=this.getAction().checked;this.item.classList.toggle(\"checked\",!!e),e!==void 0?(this.item.setAttribute(\"role\",\"menuitemcheckbox\"),this.item.setAttribute(\"aria-checked\",e?\"true\":\"false\")):(this.item.setAttribute(\"role\",\"menuitem\"),this.item.setAttribute(\"aria-checked\",\"\"))}getMnemonic(){return this.mnemonic}applyStyle(){if(!this.menuStyle)return;const e=this.element&&this.element.classList.contains(\"focused\"),t=e&&this.menuStyle.selectionForegroundColor?this.menuStyle.selectionForegroundColor:this.menuStyle.foregroundColor,i=e&&this.menuStyle.selectionBackgroundColor?this.menuStyle.selectionBackgroundColor:void 0,n=e&&this.menuStyle.selectionBorderColor?`1px solid ${this.menuStyle.selectionBorderColor}`:\"\",s=e&&this.menuStyle.selectionBorderColor?\"-1px\":\"\";this.item&&(this.item.style.color=t?t.toString():\"\",this.item.style.backgroundColor=i?i.toString():\"\",this.item.style.outline=n,this.item.style.outlineOffset=s),this.check&&(this.check.style.color=t?t.toString():\"\")}style(e){this.menuStyle=e,this.applyStyle()}}class xR extends Uk{constructor(e,t,i,n){super(e,e,n),this.submenuActions=t,this.parentData=i,this.submenuOptions=n,this.mysubmenu=null,this.submenuDisposables=this._register(new ee),this.mouseOver=!1,this.expandDirection=n&&n.expandDirection!==void 0?n.expandDirection:oC.Right,this.showScheduler=new ft(()=>{this.mouseOver&&(this.cleanupExistingSubmenu(!1),this.createSubmenu(!1))},250),this.hideScheduler=new ft(()=>{this.element&&!Ga(xu(),this.element)&&this.parentData.submenu===this.mysubmenu&&(this.parentData.parent.focus(!1),this.cleanupExistingSubmenu(!0))},750)}render(e){super.render(e),this.element&&(this.item&&(this.item.classList.add(\"monaco-submenu-item\"),this.item.tabIndex=0,this.item.setAttribute(\"aria-haspopup\",\"true\"),this.updateAriaExpanded(\"false\"),this.submenuIndicator=G(this.item,se(\"span.submenu-indicator\"+m.menuSubmenu.cssSelector)),this.submenuIndicator.setAttribute(\"aria-hidden\",\"true\")),this._register(q(this.element,le.KEY_UP,t=>{const i=new Mt(t);(i.equals(17)||i.equals(3))&&(ct.stop(t,!0),this.createSubmenu(!0))})),this._register(q(this.element,le.KEY_DOWN,t=>{const i=new Mt(t);xu()===this.item&&(i.equals(17)||i.equals(3))&&ct.stop(t,!0)})),this._register(q(this.element,le.MOUSE_OVER,t=>{this.mouseOver||(this.mouseOver=!0,this.showScheduler.schedule())})),this._register(q(this.element,le.MOUSE_LEAVE,t=>{this.mouseOver=!1})),this._register(q(this.element,le.FOCUS_OUT,t=>{this.element&&!Ga(xu(),this.element)&&this.hideScheduler.schedule()})),this._register(this.parentData.parent.onScroll(()=>{this.parentData.submenu===this.mysubmenu&&(this.parentData.parent.focus(!1),this.cleanupExistingSubmenu(!0))})))}updateEnabled(){}onClick(e){ct.stop(e,!0),this.cleanupExistingSubmenu(!1),this.createSubmenu(!0)}cleanupExistingSubmenu(e){if(this.parentData.submenu&&(e||this.parentData.submenu!==this.mysubmenu)){try{this.parentData.submenu.dispose()}catch(t){}this.parentData.submenu=void 0,this.updateAriaExpanded(\"false\"),this.submenuContainer&&(this.submenuDisposables.clear(),this.submenuContainer=void 0)}}calculateSubmenuMenuLayout(e,t,i,n){const s={top:0,left:0};return s.left=Du(e.width,t.width,{position:n===oC.Right?0:1,offset:i.left,size:i.width}),s.left>=i.left&&s.left<i.left+i.width&&(i.left+10+t.width<=e.width&&(s.left=i.left+10),i.top+=10,i.height=0),s.top=Du(e.height,t.height,{position:0,offset:i.top,size:0}),s.top+t.height===i.top&&s.top+i.height+t.height<=e.height&&(s.top+=i.height),s}createSubmenu(e=!0){if(!!this.element)if(this.parentData.submenu)this.parentData.submenu.focus(!1);else{this.updateAriaExpanded(\"true\"),this.submenuContainer=G(this.element,se(\"div.monaco-submenu\")),this.submenuContainer.classList.add(\"menubar-menu-items-holder\",\"context-view\");const t=getComputedStyle(this.parentData.parent.domNode),i=parseFloat(t.paddingTop||\"0\")||0;this.submenuContainer.style.zIndex=\"1\",this.submenuContainer.style.position=\"fixed\",this.submenuContainer.style.top=\"0\",this.submenuContainer.style.left=\"0\",this.parentData.submenu=new Ku(this.submenuContainer,this.submenuActions.length?this.submenuActions:[new LC],this.submenuOptions),this.menuStyle&&this.parentData.submenu.style(this.menuStyle);const n=this.element.getBoundingClientRect(),s={top:n.top-i,left:n.left,height:n.height+2*i,width:n.width},r=this.submenuContainer.getBoundingClientRect(),{top:a,left:l}=this.calculateSubmenuMenuLayout(new bt(window.innerWidth,window.innerHeight),bt.lift(r),s,this.expandDirection);this.submenuContainer.style.left=`${l-r.left}px`,this.submenuContainer.style.top=`${a-r.top}px`,this.submenuDisposables.add(q(this.submenuContainer,le.KEY_UP,c=>{new Mt(c).equals(15)&&(ct.stop(c,!0),this.parentData.parent.focus(),this.cleanupExistingSubmenu(!0))})),this.submenuDisposables.add(q(this.submenuContainer,le.KEY_DOWN,c=>{new Mt(c).equals(15)&&ct.stop(c,!0)})),this.submenuDisposables.add(this.parentData.submenu.onDidCancel(()=>{this.parentData.parent.focus(),this.cleanupExistingSubmenu(!0)})),this.parentData.submenu.focus(e),this.mysubmenu=this.parentData.submenu}}updateAriaExpanded(e){var t;this.item&&((t=this.item)===null||t===void 0||t.setAttribute(\"aria-expanded\",e))}applyStyle(){var e;if(super.applyStyle(),!this.menuStyle)return;const i=this.element&&this.element.classList.contains(\"focused\")&&this.menuStyle.selectionForegroundColor?this.menuStyle.selectionForegroundColor:this.menuStyle.foregroundColor;this.submenuIndicator&&(this.submenuIndicator.style.color=i?`${i}`:\"\"),(e=this.parentData.submenu)===null||e===void 0||e.style(this.menuStyle)}dispose(){super.dispose(),this.hideScheduler.dispose(),this.mysubmenu&&(this.mysubmenu.dispose(),this.mysubmenu=null),this.submenuContainer&&(this.submenuContainer=void 0)}}class ry extends nm{style(e){this.label&&(this.label.style.borderBottomColor=e.separatorColor?`${e.separatorColor}`:\"\")}}function _le(o){const e=zk,t=e.exec(o);if(!t)return o;const i=!t[1];return o.replace(e,i?\"$2$3\":\"\").trim()}function ble(o,e){let t=`\n.monaco-menu {\n\tfont-size: 13px;\n\tborder-radius: 5px;\n\tmin-width: 160px;\n}\n\n${kA(m.menuSelection)}\n${kA(m.menuSubmenu)}\n\n.monaco-menu .monaco-action-bar {\n\ttext-align: right;\n\toverflow: hidden;\n\twhite-space: nowrap;\n}\n\n.monaco-menu .monaco-action-bar .actions-container {\n\tdisplay: flex;\n\tmargin: 0 auto;\n\tpadding: 0;\n\twidth: 100%;\n\tjustify-content: flex-end;\n}\n\n.monaco-menu .monaco-action-bar.vertical .actions-container {\n\tdisplay: inline-block;\n}\n\n.monaco-menu .monaco-action-bar.reverse .actions-container {\n\tflex-direction: row-reverse;\n}\n\n.monaco-menu .monaco-action-bar .action-item {\n\tcursor: pointer;\n\tdisplay: inline-block;\n\ttransition: transform 50ms ease;\n\tposition: relative;  /* DO NOT REMOVE - this is the key to preventing the ghosting icon bug in Chrome 42 */\n}\n\n.monaco-menu .monaco-action-bar .action-item.disabled {\n\tcursor: default;\n}\n\n.monaco-menu .monaco-action-bar.animated .action-item.active {\n\ttransform: scale(1.272019649, 1.272019649); /* 1.272019649 = \\u221A\\u03C6 */\n}\n\n.monaco-menu .monaco-action-bar .action-item .icon,\n.monaco-menu .monaco-action-bar .action-item .codicon {\n\tdisplay: inline-block;\n}\n\n.monaco-menu .monaco-action-bar .action-item .codicon {\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.monaco-menu .monaco-action-bar .action-label {\n\tfont-size: 11px;\n\tmargin-right: 4px;\n}\n\n.monaco-menu .monaco-action-bar .action-item.disabled .action-label,\n.monaco-menu .monaco-action-bar .action-item.disabled .action-label:hover {\n\tcolor: var(--vscode-disabledForeground);\n}\n\n/* Vertical actions */\n\n.monaco-menu .monaco-action-bar.vertical {\n\ttext-align: left;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-item {\n\tdisplay: block;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-label.separator {\n\tdisplay: block;\n\tborder-bottom: 1px solid var(--vscode-menu-separatorBackground);\n\tpadding-top: 1px;\n\tpadding: 30px;\n}\n\n.monaco-menu .secondary-actions .monaco-action-bar .action-label {\n\tmargin-left: 6px;\n}\n\n/* Action Items */\n.monaco-menu .monaco-action-bar .action-item.select-container {\n\toverflow: hidden; /* somehow the dropdown overflows its container, we prevent it here to not push */\n\tflex: 1;\n\tmax-width: 170px;\n\tmin-width: 60px;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n\tmargin-right: 10px;\n}\n\n.monaco-menu .monaco-action-bar.vertical {\n\tmargin-left: 0;\n\toverflow: visible;\n}\n\n.monaco-menu .monaco-action-bar.vertical .actions-container {\n\tdisplay: block;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-item {\n\tpadding: 0;\n\ttransform: none;\n\tdisplay: flex;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-item.active {\n\ttransform: none;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-menu-item {\n\tflex: 1 1 auto;\n\tdisplay: flex;\n\theight: 2em;\n\talign-items: center;\n\tposition: relative;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-menu-item:hover .keybinding,\n.monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .keybinding {\n\topacity: unset;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-label {\n\tflex: 1 1 auto;\n\ttext-decoration: none;\n\tpadding: 0 1em;\n\tbackground: none;\n\tfont-size: 12px;\n\tline-height: 1;\n}\n\n.monaco-menu .monaco-action-bar.vertical .keybinding,\n.monaco-menu .monaco-action-bar.vertical .submenu-indicator {\n\tdisplay: inline-block;\n\tflex: 2 1 auto;\n\tpadding: 0 1em;\n\ttext-align: right;\n\tfont-size: 12px;\n\tline-height: 1;\n}\n\n.monaco-menu .monaco-action-bar.vertical .submenu-indicator {\n\theight: 100%;\n}\n\n.monaco-menu .monaco-action-bar.vertical .submenu-indicator.codicon {\n\tfont-size: 16px !important;\n\tdisplay: flex;\n\talign-items: center;\n}\n\n.monaco-menu .monaco-action-bar.vertical .submenu-indicator.codicon::before {\n\tmargin-left: auto;\n\tmargin-right: -20px;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-item.disabled .keybinding,\n.monaco-menu .monaco-action-bar.vertical .action-item.disabled .submenu-indicator {\n\topacity: 0.4;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-label:not(.separator) {\n\tdisplay: inline-block;\n\tbox-sizing: border-box;\n\tmargin: 0;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-item {\n\tposition: static;\n\toverflow: visible;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-item .monaco-submenu {\n\tposition: absolute;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-label.separator {\n\twidth: 100%;\n\theight: 0px !important;\n\topacity: 1;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-label.separator.text {\n\tpadding: 0.7em 1em 0.1em 1em;\n\tfont-weight: bold;\n\topacity: 1;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-label:hover {\n\tcolor: inherit;\n}\n\n.monaco-menu .monaco-action-bar.vertical .menu-item-check {\n\tposition: absolute;\n\tvisibility: hidden;\n\twidth: 1em;\n\theight: 100%;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-menu-item.checked .menu-item-check {\n\tvisibility: visible;\n\tdisplay: flex;\n\talign-items: center;\n\tjustify-content: center;\n}\n\n/* Context Menu */\n\n.context-view.monaco-menu-container {\n\toutline: 0;\n\tborder: none;\n\tanimation: fadeIn 0.083s linear;\n\t-webkit-app-region: no-drag;\n}\n\n.context-view.monaco-menu-container :focus,\n.context-view.monaco-menu-container .monaco-action-bar.vertical:focus,\n.context-view.monaco-menu-container .monaco-action-bar.vertical :focus {\n\toutline: 0;\n}\n\n.hc-black .context-view.monaco-menu-container,\n.hc-light .context-view.monaco-menu-container,\n:host-context(.hc-black) .context-view.monaco-menu-container,\n:host-context(.hc-light) .context-view.monaco-menu-container {\n\tbox-shadow: none;\n}\n\n.hc-black .monaco-menu .monaco-action-bar.vertical .action-item.focused,\n.hc-light .monaco-menu .monaco-action-bar.vertical .action-item.focused,\n:host-context(.hc-black) .monaco-menu .monaco-action-bar.vertical .action-item.focused,\n:host-context(.hc-light) .monaco-menu .monaco-action-bar.vertical .action-item.focused {\n\tbackground: none;\n}\n\n/* Vertical Action Bar Styles */\n\n.monaco-menu .monaco-action-bar.vertical {\n\tpadding: .6em 0;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-menu-item {\n\theight: 2em;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-label:not(.separator),\n.monaco-menu .monaco-action-bar.vertical .keybinding {\n\tfont-size: inherit;\n\tpadding: 0 2em;\n}\n\n.monaco-menu .monaco-action-bar.vertical .menu-item-check {\n\tfont-size: inherit;\n\twidth: 2em;\n}\n\n.monaco-menu .monaco-action-bar.vertical .action-label.separator {\n\tfont-size: inherit;\n\tmargin: 5px 0 !important;\n\tpadding: 0;\n\tborder-radius: 0;\n}\n\n.linux .monaco-menu .monaco-action-bar.vertical .action-label.separator,\n:host-context(.linux) .monaco-menu .monaco-action-bar.vertical .action-label.separator {\n\tmargin-left: 0;\n\tmargin-right: 0;\n}\n\n.monaco-menu .monaco-action-bar.vertical .submenu-indicator {\n\tfont-size: 60%;\n\tpadding: 0 1.8em;\n}\n\n.linux .monaco-menu .monaco-action-bar.vertical .submenu-indicator {\n:host-context(.linux) .monaco-menu .monaco-action-bar.vertical .submenu-indicator {\n\theight: 100%;\n\tmask-size: 10px 10px;\n\t-webkit-mask-size: 10px 10px;\n}\n\n.monaco-menu .action-item {\n\tcursor: default;\n}`;if(e){t+=`\n\t\t\t/* Arrows */\n\t\t\t.monaco-scrollable-element > .scrollbar > .scra {\n\t\t\t\tcursor: pointer;\n\t\t\t\tfont-size: 11px !important;\n\t\t\t}\n\n\t\t\t.monaco-scrollable-element > .visible {\n\t\t\t\topacity: 1;\n\n\t\t\t\t/* Background rule added for IE9 - to allow clicks on dom node */\n\t\t\t\tbackground:rgba(0,0,0,0);\n\n\t\t\t\ttransition: opacity 100ms linear;\n\t\t\t}\n\t\t\t.monaco-scrollable-element > .invisible {\n\t\t\t\topacity: 0;\n\t\t\t\tpointer-events: none;\n\t\t\t}\n\t\t\t.monaco-scrollable-element > .invisible.fade {\n\t\t\t\ttransition: opacity 800ms linear;\n\t\t\t}\n\n\t\t\t/* Scrollable Content Inset Shadow */\n\t\t\t.monaco-scrollable-element > .shadow {\n\t\t\t\tposition: absolute;\n\t\t\t\tdisplay: none;\n\t\t\t}\n\t\t\t.monaco-scrollable-element > .shadow.top {\n\t\t\t\tdisplay: block;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 3px;\n\t\t\t\theight: 3px;\n\t\t\t\twidth: 100%;\n\t\t\t}\n\t\t\t.monaco-scrollable-element > .shadow.left {\n\t\t\t\tdisplay: block;\n\t\t\t\ttop: 3px;\n\t\t\t\tleft: 0;\n\t\t\t\theight: 100%;\n\t\t\t\twidth: 3px;\n\t\t\t}\n\t\t\t.monaco-scrollable-element > .shadow.top-left-corner {\n\t\t\t\tdisplay: block;\n\t\t\t\ttop: 0;\n\t\t\t\tleft: 0;\n\t\t\t\theight: 3px;\n\t\t\t\twidth: 3px;\n\t\t\t}\n\t\t`;const i=o.scrollbarShadow;i&&(t+=`\n\t\t\t\t.monaco-scrollable-element > .shadow.top {\n\t\t\t\t\tbox-shadow: ${i} 0 6px 6px -6px inset;\n\t\t\t\t}\n\n\t\t\t\t.monaco-scrollable-element > .shadow.left {\n\t\t\t\t\tbox-shadow: ${i} 6px 0 6px -6px inset;\n\t\t\t\t}\n\n\t\t\t\t.monaco-scrollable-element > .shadow.top.left {\n\t\t\t\t\tbox-shadow: ${i} 6px 6px 6px -6px inset;\n\t\t\t\t}\n\t\t\t`);const n=o.scrollbarSliderBackground;n&&(t+=`\n\t\t\t\t.monaco-scrollable-element > .scrollbar > .slider {\n\t\t\t\t\tbackground: ${n};\n\t\t\t\t}\n\t\t\t`);const s=o.scrollbarSliderHoverBackground;s&&(t+=`\n\t\t\t\t.monaco-scrollable-element > .scrollbar > .slider:hover {\n\t\t\t\t\tbackground: ${s};\n\t\t\t\t}\n\t\t\t`);const r=o.scrollbarSliderActiveBackground;r&&(t+=`\n\t\t\t\t.monaco-scrollable-element > .scrollbar > .slider.active {\n\t\t\t\t\tbackground: ${r};\n\t\t\t\t}\n\t\t\t`)}return t}class vle{constructor(e,t,i,n,s){this.contextViewService=e,this.telemetryService=t,this.notificationService=i,this.keybindingService=n,this.themeService=s,this.focusToReturn=null,this.block=null,this.options={blockMouse:!0}}configure(e){this.options=e}showContextMenu(e){const t=e.getActions();if(!t.length)return;this.focusToReturn=document.activeElement;let i;const n=zO(e.domForShadowRoot)?e.domForShadowRoot:void 0;this.contextViewService.showContextView({getAnchor:()=>e.getAnchor(),canRelayout:!1,anchorAlignment:e.anchorAlignment,anchorAxisAlignment:e.anchorAxisAlignment,render:s=>{const r=e.getMenuClassName?e.getMenuClassName():\"\";r&&(s.className+=\" \"+r),this.options.blockMouse&&(this.block=s.appendChild(se(\".context-view-block\")),this.block.style.position=\"fixed\",this.block.style.cursor=\"initial\",this.block.style.left=\"0\",this.block.style.top=\"0\",this.block.style.width=\"100%\",this.block.style.height=\"100%\",this.block.style.zIndex=\"-1\",q(this.block,le.MOUSE_DOWN,c=>c.stopPropagation()));const a=new ee,l=e.actionRunner||new Ju;return l.onBeforeRun(this.onActionRun,this,a),l.onDidRun(this.onDidActionRun,this,a),i=new Ku(s,t,{actionViewItemProvider:e.getActionViewItem,context:e.getActionsContext?e.getActionsContext():null,actionRunner:l,getKeyBinding:e.getKeyBinding?e.getKeyBinding:c=>this.keybindingService.lookupKeybinding(c.id)}),a.add(IQ(i,this.themeService)),i.onDidCancel(()=>this.contextViewService.hideContextView(!0),null,a),i.onDidBlur(()=>this.contextViewService.hideContextView(!0),null,a),a.add(q(window,le.BLUR,()=>this.contextViewService.hideContextView(!0))),a.add(q(window,le.MOUSE_DOWN,c=>{if(c.defaultPrevented)return;const d=new Ir(c);let h=d.target;if(!d.rightButton){for(;h;){if(h===s)return;h=h.parentElement}this.contextViewService.hideContextView(!0)}})),Pr(a,i)},focus:()=>{i==null||i.focus(!!e.autoSelectFirstItem)},onHide:s=>{var r;(r=e.onHide)===null||r===void 0||r.call(e,!!s),this.block&&(this.block.remove(),this.block=null),this.focusToReturn&&this.focusToReturn.focus()}},n,!!n)}onActionRun(e){this.telemetryService.publicLog2(\"workbenchActionExecuted\",{id:e.action.id,from:\"contextMenu\"}),this.contextViewService.hideContextView(!1),this.focusToReturn&&this.focusToReturn.focus()}onDidActionRun(e){e.error&&!ol(e.error)&&this.notificationService.error(e.error)}}var Cle=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Nf=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let $k=class extends z{constructor(e,t,i,n,s){super(),this._onDidShowContextMenu=new O,this._onDidHideContextMenu=new O,this.contextMenuHandler=new vle(i,e,t,n,s)}configure(e){this.contextMenuHandler.configure(e)}showContextMenu(e){this.contextMenuHandler.showContextMenu(Object.assign(Object.assign({},e),{onHide:t=>{var i;(i=e.onHide)===null||i===void 0||i.call(e,t),this._onDidHideContextMenu.fire()}})),Rl.getInstance().resetKeyStatus(),this._onDidShowContextMenu.fire()}};$k=Cle([Nf(0,rl),Nf(1,gi),Nf(2,Ch),Nf(3,rn),Nf(4,vt)],$k);var rC;(function(o){o[o.API=0]=\"API\",o[o.USER=1]=\"USER\"})(rC||(rC={}));var EN=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},aC=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},id=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};let jk=class{constructor(e){this._commandService=e}open(e,t){return id(this,void 0,void 0,function*(){if(!vE(e,Ne.command))return!1;if(!(t!=null&&t.allowCommands))return!0;typeof e==\"string\"&&(e=me.parse(e));let i=[];try{i=Ov(decodeURIComponent(e.query))}catch(n){try{i=Ov(e.query)}catch(s){}}return Array.isArray(i)||(i=[i]),yield this._commandService.executeCommand(e.path,...i),!0})}};jk=EN([aC(0,Ci)],jk);let Kk=class{constructor(e){this._editorService=e}open(e,t){return id(this,void 0,void 0,function*(){typeof e==\"string\"&&(e=me.parse(e));const{selection:i,uri:n}=Q5(e);return e=n,e.scheme===Ne.file&&(e=DK(e)),yield this._editorService.openCodeEditor({resource:e,options:Object.assign({selection:i,source:t!=null&&t.fromUserGesture?rC.USER:rC.API},t==null?void 0:t.editorOptions)},this._editorService.getFocusedCodeEditor(),t==null?void 0:t.openToSide),!0})}};Kk=EN([aC(0,dt)],Kk);let qk=class{constructor(e,t){this._openers=new wn,this._validators=new wn,this._resolvers=new wn,this._resolvedUriTargets=new hn(i=>i.with({path:null,fragment:null,query:null}).toString()),this._externalOpeners=new wn,this._defaultExternalOpener={openExternal:i=>id(this,void 0,void 0,function*(){return CM(i,Ne.http,Ne.https)?$O(i):window.location.href=i,!0})},this._openers.push({open:(i,n)=>id(this,void 0,void 0,function*(){return(n==null?void 0:n.openExternal)||CM(i,Ne.mailto,Ne.http,Ne.https,Ne.vsls)?(yield this._doOpenExternal(i,n),!0):!1})}),this._openers.push(new jk(t)),this._openers.push(new Kk(e))}registerOpener(e){return{dispose:this._openers.unshift(e)}}registerValidator(e){return{dispose:this._validators.push(e)}}registerExternalUriResolver(e){return{dispose:this._resolvers.push(e)}}setDefaultExternalOpener(e){this._defaultExternalOpener=e}registerExternalOpener(e){return{dispose:this._externalOpeners.push(e)}}open(e,t){var i;return id(this,void 0,void 0,function*(){const n=typeof e==\"string\"?me.parse(e):e,s=(i=this._resolvedUriTargets.get(n))!==null&&i!==void 0?i:e;for(const r of this._validators)if(!(yield r.shouldOpen(s,t)))return!1;for(const r of this._openers)if(yield r.open(e,t))return!0;return!1})}resolveExternalUri(e,t){return id(this,void 0,void 0,function*(){for(const i of this._resolvers)try{const n=yield i.resolveExternalUri(e,t);if(n)return this._resolvedUriTargets.has(n.resolved)||this._resolvedUriTargets.set(n.resolved,e),n}catch(n){}throw new Error(\"Could not resolve external URI: \"+e.toString())})}_doOpenExternal(e,t){return id(this,void 0,void 0,function*(){const i=typeof e==\"string\"?me.parse(e):e;let n;try{n=(yield this.resolveExternalUri(i,t)).resolved}catch(r){n=i}let s;if(typeof e==\"string\"&&i.toString()===n.toString()?s=e:s=encodeURI(n.toString(!0)),t!=null&&t.allowContributedOpeners){const r=typeof(t==null?void 0:t.allowContributedOpeners)==\"string\"?t==null?void 0:t.allowContributedOpeners:void 0;for(const a of this._externalOpeners)if(yield a.openExternal(s,{sourceUri:i,preferredOpenerId:r},We.None))return!0}return this._defaultExternalOpener.openExternal(s,{sourceUri:i},We.None)})}dispose(){this._validators.clear()}};qk=EN([aC(0,dt),aC(1,Ci)],qk);var wle=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},IR=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};class Sle extends z{constructor(e){super(),this.model=e,this._markersData=new Map,this._register(ze(()=>{this.model.deltaDecorations([...this._markersData.keys()],[]),this._markersData.clear()}))}update(e,t){const i=[...this._markersData.keys()];this._markersData.clear();const n=this.model.deltaDecorations(i,t);for(let s=0;s<n.length;s++)this._markersData.set(n[s],e[s]);return i.length!==0||n.length!==0}getMarker(e){return this._markersData.get(e.id)}}let Gk=class extends z{constructor(e,t){super(),this._markerService=t,this._onDidChangeMarker=this._register(new O),this._markerDecorations=new hn,e.getModels().forEach(i=>this._onModelAdded(i)),this._register(e.onModelAdded(this._onModelAdded,this)),this._register(e.onModelRemoved(this._onModelRemoved,this)),this._register(this._markerService.onMarkerChanged(this._handleMarkerChange,this))}dispose(){super.dispose(),this._markerDecorations.forEach(e=>e.dispose()),this._markerDecorations.clear()}getMarker(e,t){const i=this._markerDecorations.get(e);return i&&i.getMarker(t)||null}_handleMarkerChange(e){e.forEach(t=>{const i=this._markerDecorations.get(t);i&&this._updateDecorations(i)})}_onModelAdded(e){const t=new Sle(e);this._markerDecorations.set(e.uri,t),this._updateDecorations(t)}_onModelRemoved(e){var t;const i=this._markerDecorations.get(e.uri);i&&(i.dispose(),this._markerDecorations.delete(e.uri)),(e.uri.scheme===Ne.inMemory||e.uri.scheme===Ne.internal||e.uri.scheme===Ne.vscode)&&((t=this._markerService)===null||t===void 0||t.read({resource:e.uri}).map(n=>n.owner).forEach(n=>this._markerService.remove(n,[e.uri])))}_updateDecorations(e){const t=this._markerService.read({resource:e.model.uri,take:500}),i=t.map(n=>({range:this._createDecorationRange(e.model,n),options:this._createDecorationOption(n)}));e.update(t,i)&&this._onDidChangeMarker.fire(e.model)}_createDecorationRange(e,t){let i=L.lift(t);if(t.severity===Ft.Hint&&!this._hasMarkerTag(t,1)&&!this._hasMarkerTag(t,2)&&(i=i.setEndPosition(i.startLineNumber,i.startColumn+2)),i=e.validateRange(i),i.isEmpty()){const n=e.getLineLastNonWhitespaceColumn(i.startLineNumber)||e.getLineMaxColumn(i.startLineNumber);if(n===1||i.endColumn>=n)return i;const s=e.getWordAtPosition(i.getStartPosition());s&&(i=new L(i.startLineNumber,s.startColumn,i.endLineNumber,s.endColumn))}else if(t.endColumn===Number.MAX_VALUE&&t.startColumn===1&&i.startLineNumber===i.endLineNumber){const n=e.getLineFirstNonWhitespaceColumn(t.startLineNumber);n<i.endColumn&&(i=new L(i.startLineNumber,n,i.endLineNumber,i.endColumn),t.startColumn=n)}return i}_createDecorationOption(e){let t,i,n,s,r;switch(e.severity){case Ft.Hint:this._hasMarkerTag(e,2)?t=void 0:this._hasMarkerTag(e,1)?t=\"squiggly-unnecessary\":t=\"squiggly-hint\",n=0;break;case Ft.Warning:t=\"squiggly-warning\",i=Qt(qU),n=20,r={color:Qt(Oz),position:js.Inline};break;case Ft.Info:t=\"squiggly-info\",i=Qt(GU),n=10;break;case Ft.Error:default:t=\"squiggly-error\",i=Qt(KU),n=30,r={color:Qt(Rz),position:js.Inline};break}return e.tags&&(e.tags.indexOf(1)!==-1&&(s=\"squiggly-inline-unnecessary\"),e.tags.indexOf(2)!==-1&&(s=\"squiggly-inline-deprecated\")),{description:\"marker-decoration\",stickiness:1,className:t,showIfCollapsed:!0,overviewRuler:{color:i,position:vo.Right},minimap:r,zIndex:n,inlineClassName:s}}_hasMarkerTag(e,t){return e.tags?e.tags.indexOf(t)>=0:!1}};Gk=wle([IR(0,Bt),IR(1,ta)],Gk);const yle={buttonBackground:W.fromHex(\"#0E639C\"),buttonHoverBackground:W.fromHex(\"#006BB3\"),buttonSeparator:W.white,buttonForeground:W.white};class ER extends z{constructor(e,t){super(),this._onDidClick=this._register(new O),this.options=t||Object.create(null),ea(this.options,yle,!1),this.buttonForeground=this.options.buttonForeground,this.buttonBackground=this.options.buttonBackground,this.buttonHoverBackground=this.options.buttonHoverBackground,this.buttonSecondaryForeground=this.options.buttonSecondaryForeground,this.buttonSecondaryBackground=this.options.buttonSecondaryBackground,this.buttonSecondaryHoverBackground=this.options.buttonSecondaryHoverBackground,this.buttonBorder=this.options.buttonBorder,this._element=document.createElement(\"a\"),this._element.classList.add(\"monaco-button\"),this._element.tabIndex=0,this._element.setAttribute(\"role\",\"button\"),e.appendChild(this._element),this._register(ut.addTarget(this._element)),[le.CLICK,kt.Tap].forEach(i=>{this._register(q(this._element,i,n=>{if(!this.enabled){ct.stop(n);return}this._onDidClick.fire(n)}))}),this._register(q(this._element,le.KEY_DOWN,i=>{const n=new Mt(i);let s=!1;this.enabled&&(n.equals(3)||n.equals(10))?(this._onDidClick.fire(i),s=!0):n.equals(9)&&(this._element.blur(),s=!0),s&&ct.stop(n,!0)})),this._register(q(this._element,le.MOUSE_OVER,i=>{this._element.classList.contains(\"disabled\")||this.setHoverBackground()})),this._register(q(this._element,le.MOUSE_OUT,i=>{this.applyStyles()})),this.focusTracker=this._register(Ad(this._element)),this._register(this.focusTracker.onDidFocus(()=>{this.enabled&&this.setHoverBackground()})),this._register(this.focusTracker.onDidBlur(()=>{this.enabled&&this.applyStyles()})),this.applyStyles()}get onDidClick(){return this._onDidClick.event}setHoverBackground(){let e;this.options.secondary?e=this.buttonSecondaryHoverBackground?this.buttonSecondaryHoverBackground.toString():null:e=this.buttonHoverBackground?this.buttonHoverBackground.toString():null,e&&(this._element.style.backgroundColor=e)}style(e){this.buttonForeground=e.buttonForeground,this.buttonBackground=e.buttonBackground,this.buttonHoverBackground=e.buttonHoverBackground,this.buttonSecondaryForeground=e.buttonSecondaryForeground,this.buttonSecondaryBackground=e.buttonSecondaryBackground,this.buttonSecondaryHoverBackground=e.buttonSecondaryHoverBackground,this.buttonBorder=e.buttonBorder,this.applyStyles()}applyStyles(){if(this._element){let e,t;this.options.secondary?(t=this.buttonSecondaryForeground?this.buttonSecondaryForeground.toString():\"\",e=this.buttonSecondaryBackground?this.buttonSecondaryBackground.toString():\"\"):(t=this.buttonForeground?this.buttonForeground.toString():\"\",e=this.buttonBackground?this.buttonBackground.toString():\"\");const i=this.buttonBorder?this.buttonBorder.toString():\"\";this._element.style.color=t,this._element.style.backgroundColor=e,this._element.style.borderWidth=i?\"1px\":\"\",this._element.style.borderStyle=i?\"solid\":\"\",this._element.style.borderColor=i}}get element(){return this._element}set label(e){this._element.classList.add(\"monaco-text-button\"),this.options.supportIcons?Rd(this._element,...yd(e)):this._element.textContent=e,typeof this.options.title==\"string\"?this._element.title=this.options.title:this.options.title&&(this._element.title=e)}set enabled(e){e?(this._element.classList.remove(\"disabled\"),this._element.setAttribute(\"aria-disabled\",String(!1)),this._element.tabIndex=0):(this._element.classList.add(\"disabled\"),this._element.setAttribute(\"aria-disabled\",String(!0)))}get enabled(){return!this._element.classList.contains(\"disabled\")}}const NR=\"done\",TR=\"active\",ay=\"infinite\",ly=\"infinite-long-running\",MR=\"discrete\",Lle={progressBarBackground:W.fromHex(\"#0E70C0\")};class sw extends z{constructor(e,t){super(),this.options=t||Object.create(null),ea(this.options,Lle,!1),this.workedVal=0,this.progressBarBackground=this.options.progressBarBackground,this.showDelayedScheduler=this._register(new ft(()=>bs(this.element),0)),this.longRunningScheduler=this._register(new ft(()=>this.infiniteLongRunning(),sw.LONG_RUNNING_INFINITE_THRESHOLD)),this.create(e)}create(e){this.element=document.createElement(\"div\"),this.element.classList.add(\"monaco-progress-container\"),this.element.setAttribute(\"role\",\"progressbar\"),this.element.setAttribute(\"aria-valuemin\",\"0\"),e.appendChild(this.element),this.bit=document.createElement(\"div\"),this.bit.classList.add(\"progress-bit\"),this.element.appendChild(this.bit),this.applyStyles()}off(){this.bit.style.width=\"inherit\",this.bit.style.opacity=\"1\",this.element.classList.remove(TR,ay,ly,MR),this.workedVal=0,this.totalWork=void 0,this.longRunningScheduler.cancel()}stop(){return this.doDone(!1)}doDone(e){return this.element.classList.add(NR),this.element.classList.contains(ay)?(this.bit.style.opacity=\"0\",e?setTimeout(()=>this.off(),200):this.off()):(this.bit.style.width=\"inherit\",e?setTimeout(()=>this.off(),200):this.off()),this}infinite(){return this.bit.style.width=\"2%\",this.bit.style.opacity=\"1\",this.element.classList.remove(MR,NR,ly),this.element.classList.add(TR,ay),this.longRunningScheduler.schedule(),this}infiniteLongRunning(){this.element.classList.add(ly)}getContainer(){return this.element}style(e){this.progressBarBackground=e.progressBarBackground,this.applyStyles()}applyStyles(){if(this.bit){const e=this.progressBarBackground?this.progressBarBackground.toString():\"\";this.bit.style.backgroundColor=e}}}sw.LONG_RUNNING_INFINITE_THRESHOLD=1e4;const cy={},Dle=new wE(\"quick-input-button-icon-\");function Zk(o){if(!o)return;let e;const t=o.dark.toString();return cy[t]?e=cy[t]:(e=Dle.nextId(),yy(`.${e}, .hc-light .${e}`,`background-image: ${Od(o.light||o.dark)}`),yy(`.vs-dark .${e}, .hc-black .${e}`,`background-image: ${Od(o.dark)}`),cy[t]=e),e}const kle=se;class xle extends z{constructor(e){super(),this.parent=e,this.onKeyDown=t=>q(this.inputBox.inputElement,le.KEY_DOWN,i=>{t(new Mt(i))}),this.onMouseDown=t=>q(this.inputBox.inputElement,le.MOUSE_DOWN,i=>{t(new Ir(i))}),this.onDidChange=t=>this.inputBox.onDidChange(t),this.container=G(this.parent,kle(\".quick-input-box\")),this.inputBox=this._register(new mF(this.container,void 0))}get value(){return this.inputBox.value}set value(e){this.inputBox.value=e}select(e=null){this.inputBox.select(e)}isSelectionAtEnd(){return this.inputBox.isSelectionAtEnd()}get placeholder(){return this.inputBox.inputElement.getAttribute(\"placeholder\")||\"\"}set placeholder(e){this.inputBox.setPlaceHolder(e)}get ariaLabel(){return this.inputBox.getAriaLabel()}set ariaLabel(e){this.inputBox.setAriaLabel(e)}get password(){return this.inputBox.inputElement.type===\"password\"}set password(e){this.inputBox.inputElement.type=e?\"password\":\"text\"}setAttribute(e,t){this.inputBox.inputElement.setAttribute(e,t)}removeAttribute(e){this.inputBox.inputElement.removeAttribute(e)}showDecoration(e){e===Vt.Ignore?this.inputBox.hideMessage():this.inputBox.showMessage({type:e===Vt.Info?1:e===Vt.Warning?2:3,content:\"\"})}stylesForType(e){return this.inputBox.stylesForType(e===Vt.Info?1:e===Vt.Warning?2:3)}setFocus(){this.inputBox.focus()}layout(){this.inputBox.layout()}style(e){this.inputBox.style(e)}}const jb=se;class NN{constructor(e,t,i){this.os=t,this.keyElements=new Set,this.options=i||Object.create(null),this.labelBackground=this.options.keybindingLabelBackground,this.labelForeground=this.options.keybindingLabelForeground,this.labelBorder=this.options.keybindingLabelBorder,this.labelBottomBorder=this.options.keybindingLabelBottomBorder,this.labelShadow=this.options.keybindingLabelShadow,this.domNode=G(e,jb(\".monaco-keybinding\")),this.didEverRender=!1,e.appendChild(this.domNode)}get element(){return this.domNode}set(e,t){this.didEverRender&&this.keybinding===e&&NN.areSame(this.matches,t)||(this.keybinding=e,this.matches=t,this.render())}render(){if(this.clear(),this.keybinding){const[e,t]=this.keybinding.getParts();e&&this.renderPart(this.domNode,e,this.matches?this.matches.firstPart:null),t&&(G(this.domNode,jb(\"span.monaco-keybinding-key-chord-separator\",void 0,\" \")),this.renderPart(this.domNode,t,this.matches?this.matches.chordPart:null)),this.domNode.title=this.keybinding.getAriaLabel()||\"\"}else this.options&&this.options.renderUnboundKeybindings&&this.renderUnbound(this.domNode);this.applyStyles(),this.didEverRender=!0}clear(){Ii(this.domNode),this.keyElements.clear()}renderPart(e,t,i){const n=SE.modifierLabels[this.os];t.ctrlKey&&this.renderKey(e,n.ctrlKey,Boolean(i==null?void 0:i.ctrlKey),n.separator),t.shiftKey&&this.renderKey(e,n.shiftKey,Boolean(i==null?void 0:i.shiftKey),n.separator),t.altKey&&this.renderKey(e,n.altKey,Boolean(i==null?void 0:i.altKey),n.separator),t.metaKey&&this.renderKey(e,n.metaKey,Boolean(i==null?void 0:i.metaKey),n.separator);const s=t.keyLabel;s&&this.renderKey(e,s,Boolean(i==null?void 0:i.keyCode),\"\")}renderKey(e,t,i,n){G(e,this.createKeyElement(t,i?\".highlight\":\"\")),n&&G(e,jb(\"span.monaco-keybinding-key-separator\",void 0,n))}renderUnbound(e){G(e,this.createKeyElement(p(\"unbound\",\"Unbound\")))}createKeyElement(e,t=\"\"){const i=jb(\"span.monaco-keybinding-key\"+t,void 0,e);return this.keyElements.add(i),i}style(e){this.labelBackground=e.keybindingLabelBackground,this.labelForeground=e.keybindingLabelForeground,this.labelBorder=e.keybindingLabelBorder,this.labelBottomBorder=e.keybindingLabelBottomBorder,this.labelShadow=e.keybindingLabelShadow,this.applyStyles()}applyStyles(){var e;if(this.element){for(const t of this.keyElements)this.labelBackground&&(t.style.backgroundColor=(e=this.labelBackground)===null||e===void 0?void 0:e.toString()),this.labelBorder&&(t.style.borderColor=this.labelBorder.toString()),this.labelBottomBorder&&(t.style.borderBottomColor=this.labelBottomBorder.toString()),this.labelShadow&&(t.style.boxShadow=`inset 0 -1px 0 ${this.labelShadow}`);this.labelForeground&&(this.element.style.color=this.labelForeground.toString())}}static areSame(e,t){return e===t||!e&&!t?!0:!!e&&!!t&&$s(e.firstPart,t.firstPart)&&$s(e.chordPart,t.chordPart)}}const AR=new ql(()=>{const o=new Intl.Collator(void 0,{numeric:!0,sensitivity:\"base\"});return{collator:o,collatorIsNumeric:o.resolvedOptions().numeric}});new ql(()=>({collator:new Intl.Collator(void 0,{numeric:!0})}));new ql(()=>({collator:new Intl.Collator(void 0,{numeric:!0,sensitivity:\"accent\"})}));function Ile(o,e,t=!1){const i=o||\"\",n=e||\"\",s=AR.value.collator.compare(i,n);return AR.value.collatorIsNumeric&&s===0&&i!==n?i<n?-1:1:s}function Ele(o,e,t){const i=o.toLowerCase(),n=e.toLowerCase(),s=Nle(o,e,t);if(s)return s;const r=i.endsWith(t),a=n.endsWith(t);if(r!==a)return r?-1:1;const l=Ile(i,n);return l!==0?l:i.localeCompare(n)}function Nle(o,e,t){const i=o.toLowerCase(),n=e.toLowerCase(),s=i.startsWith(t),r=n.startsWith(t);if(s!==r)return s?-1:1;if(s&&r){if(i.length<n.length)return-1;if(i.length>n.length)return 1}return 0}var n9=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Tle=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const fr=se;class Mle{constructor(e){this.hidden=!1,this._onChecked=new O,this.onChecked=this._onChecked.event,Object.assign(this,e)}get checked(){return!!this._checked}set checked(e){e!==this._checked&&(this._checked=e,this._onChecked.fire(e))}dispose(){this._onChecked.dispose()}}class y_{get templateId(){return y_.ID}renderTemplate(e){const t=Object.create(null);t.toDisposeElement=[],t.toDisposeTemplate=[],t.entry=G(e,fr(\".quick-input-list-entry\"));const i=G(t.entry,fr(\"label.quick-input-list-label\"));t.toDisposeTemplate.push(Ei(i,le.CLICK,c=>{t.checkbox.offsetParent||c.preventDefault()})),t.checkbox=G(i,fr(\"input.quick-input-list-checkbox\")),t.checkbox.type=\"checkbox\",t.toDisposeTemplate.push(Ei(t.checkbox,le.CHANGE,c=>{t.element.checked=t.checkbox.checked}));const n=G(i,fr(\".quick-input-list-rows\")),s=G(n,fr(\".quick-input-list-row\")),r=G(n,fr(\".quick-input-list-row\"));t.label=new Tv(s,{supportHighlights:!0,supportDescriptionHighlights:!0,supportIcons:!0});const a=G(s,fr(\".quick-input-list-entry-keybinding\"));t.keybinding=new NN(a,Os);const l=G(r,fr(\".quick-input-list-label-meta\"));return t.detail=new Tv(l,{supportHighlights:!0,supportIcons:!0}),t.separator=G(t.entry,fr(\".quick-input-list-separator\")),t.actionBar=new qr(t.entry),t.actionBar.domNode.classList.add(\"quick-input-list-entry-action-bar\"),t.toDisposeTemplate.push(t.actionBar),t}renderElement(e,t,i){i.toDisposeElement=et(i.toDisposeElement),i.element=e,i.checkbox.checked=e.checked,i.toDisposeElement.push(e.onChecked(c=>i.checkbox.checked=c));const{labelHighlights:n,descriptionHighlights:s,detailHighlights:r}=e,a=Object.create(null);a.matches=n||[],a.descriptionTitle=e.saneDescription,a.descriptionMatches=s||[],a.extraClasses=e.item.iconClasses,a.italic=e.item.italic,a.strikethrough=e.item.strikethrough,i.label.setLabel(e.saneLabel,e.saneDescription,a),i.keybinding.set(e.item.keybinding),e.saneDetail&&i.detail.setLabel(e.saneDetail,void 0,{matches:r,title:e.saneDetail}),e.separator&&e.separator.label?(i.separator.textContent=e.separator.label,i.separator.style.display=\"\"):i.separator.style.display=\"none\",i.entry.classList.toggle(\"quick-input-list-separator-border\",!!e.separator),i.actionBar.clear();const l=e.item.buttons;l&&l.length?(i.actionBar.push(l.map((c,d)=>{let h=c.iconClass||(c.iconPath?Zk(c.iconPath):void 0);c.alwaysVisible&&(h=h?`${h} always-visible`:\"always-visible\");const u=new is(`id-${d}`,\"\",h,!0,()=>Tle(this,void 0,void 0,function*(){e.fireButtonTriggered({button:c,item:e.item})}));return u.tooltip=c.tooltip||\"\",u}),{icon:!0,label:!1}),i.entry.classList.add(\"has-actions\")):i.entry.classList.remove(\"has-actions\")}disposeElement(e,t,i){i.toDisposeElement=et(i.toDisposeElement)}disposeTemplate(e){e.toDisposeElement=et(e.toDisposeElement),e.toDisposeTemplate=et(e.toDisposeTemplate)}}y_.ID=\"listelement\";class Ale{getHeight(e){return e.saneDetail?44:22}getTemplateId(e){return y_.ID}}var ii;(function(o){o[o.First=1]=\"First\",o[o.Second=2]=\"Second\",o[o.Last=3]=\"Last\",o[o.Next=4]=\"Next\",o[o.Previous=5]=\"Previous\",o[o.NextPage=6]=\"NextPage\",o[o.PreviousPage=7]=\"PreviousPage\"})(ii||(ii={}));class TN{constructor(e,t,i){this.parent=e,this.inputElements=[],this.elements=[],this.elementsToIndexes=new Map,this.matchOnDescription=!1,this.matchOnDetail=!1,this.matchOnLabel=!0,this.matchOnLabelMode=\"fuzzy\",this.matchOnMeta=!0,this.sortByLabel=!0,this._onChangedAllVisibleChecked=new O,this.onChangedAllVisibleChecked=this._onChangedAllVisibleChecked.event,this._onChangedCheckedCount=new O,this.onChangedCheckedCount=this._onChangedCheckedCount.event,this._onChangedVisibleCount=new O,this.onChangedVisibleCount=this._onChangedVisibleCount.event,this._onChangedCheckedElements=new O,this.onChangedCheckedElements=this._onChangedCheckedElements.event,this._onButtonTriggered=new O,this.onButtonTriggered=this._onButtonTriggered.event,this._onKeyDown=new O,this.onKeyDown=this._onKeyDown.event,this._onLeave=new O,this.onLeave=this._onLeave.event,this._fireCheckedEvents=!0,this.elementDisposables=[],this.disposables=[],this.id=t,this.container=G(this.parent,fr(\".quick-input-list\"));const n=new Ale,s=new Ple;this.list=i.createList(\"QuickInput\",this.container,n,[new y_],{identityProvider:{getId:r=>r.saneLabel},setRowLineHeight:!1,multipleSelectionSupport:!1,horizontalScrolling:!1,accessibilityProvider:s}),this.list.getHTMLElement().id=t,this.disposables.push(this.list),this.disposables.push(this.list.onKeyDown(r=>{const a=new Mt(r);switch(a.keyCode){case 10:this.toggleCheckbox();break;case 31:(Ze?r.metaKey:r.ctrlKey)&&this.list.setFocus(mn(this.list.length));break;case 16:{const l=this.list.getFocus();l.length===1&&l[0]===0&&this._onLeave.fire();break}case 18:{const l=this.list.getFocus();l.length===1&&l[0]===this.list.length-1&&this._onLeave.fire();break}}this._onKeyDown.fire(a)})),this.disposables.push(this.list.onMouseDown(r=>{r.browserEvent.button!==2&&r.browserEvent.preventDefault()})),this.disposables.push(q(this.container,le.CLICK,r=>{(r.x||r.y)&&this._onLeave.fire()})),this.disposables.push(this.list.onMouseMiddleClick(r=>{this._onLeave.fire()})),this.disposables.push(this.list.onContextMenu(r=>{typeof r.index==\"number\"&&(r.browserEvent.preventDefault(),this.list.setSelection([r.index]))})),this.disposables.push(this._onChangedAllVisibleChecked,this._onChangedCheckedCount,this._onChangedVisibleCount,this._onChangedCheckedElements,this._onButtonTriggered,this._onLeave,this._onKeyDown)}get onDidChangeFocus(){return pe.map(this.list.onDidChangeFocus,e=>e.elements.map(t=>t.item))}get onDidChangeSelection(){return pe.map(this.list.onDidChangeSelection,e=>({items:e.elements.map(t=>t.item),event:e.browserEvent}))}get scrollTop(){return this.list.scrollTop}set scrollTop(e){this.list.scrollTop=e}getAllVisibleChecked(){return this.allVisibleChecked(this.elements,!1)}allVisibleChecked(e,t=!0){for(let i=0,n=e.length;i<n;i++){const s=e[i];if(!s.hidden)if(s.checked)t=!0;else return!1}return t}getCheckedCount(){let e=0;const t=this.elements;for(let i=0,n=t.length;i<n;i++)t[i].checked&&e++;return e}getVisibleCount(){let e=0;const t=this.elements;for(let i=0,n=t.length;i<n;i++)t[i].hidden||e++;return e}setAllVisibleChecked(e){try{this._fireCheckedEvents=!1,this.elements.forEach(t=>{t.hidden||(t.checked=e)})}finally{this._fireCheckedEvents=!0,this.fireCheckedEvents()}}setElements(e){this.elementDisposables=et(this.elementDisposables);const t=i=>this.fireButtonTriggered(i);this.inputElements=e,this.elements=e.reduce((i,n,s)=>{var r,a,l;if(n.type!==\"separator\"){const c=s&&e[s-1],d=n.label&&n.label.replace(/\\r?\\n/g,\" \"),h=Fh(d).text.trim(),u=n.meta&&n.meta.replace(/\\r?\\n/g,\" \"),g=n.description&&n.description.replace(/\\r?\\n/g,\" \"),f=n.detail&&n.detail.replace(/\\r?\\n/g,\" \"),_=n.ariaLabel||[d,g,f].map(v=>LB(v)).filter(v=>!!v).join(\", \"),b=this.parent.classList.contains(\"show-checkboxes\");i.push(new Mle({hasCheckbox:b,index:s,item:n,saneLabel:d,saneSortLabel:h,saneMeta:u,saneAriaLabel:_,saneDescription:g,saneDetail:f,labelHighlights:(r=n.highlights)===null||r===void 0?void 0:r.label,descriptionHighlights:(a=n.highlights)===null||a===void 0?void 0:a.description,detailHighlights:(l=n.highlights)===null||l===void 0?void 0:l.detail,checked:!1,separator:c&&c.type===\"separator\"?c:void 0,fireButtonTriggered:t}))}return i},[]),this.elementDisposables.push(...this.elements),this.elementDisposables.push(...this.elements.map(i=>i.onChecked(()=>this.fireCheckedEvents()))),this.elementsToIndexes=this.elements.reduce((i,n,s)=>(i.set(n.item,s),i),new Map),this.list.splice(0,this.list.length),this.list.splice(0,this.list.length,this.elements),this._onChangedVisibleCount.fire(this.elements.length)}getFocusedElements(){return this.list.getFocusedElements().map(e=>e.item)}setFocusedElements(e){if(this.list.setFocus(e.filter(t=>this.elementsToIndexes.has(t)).map(t=>this.elementsToIndexes.get(t))),e.length>0){const t=this.list.getFocus()[0];typeof t==\"number\"&&this.list.reveal(t)}}getActiveDescendant(){return this.list.getHTMLElement().getAttribute(\"aria-activedescendant\")}setSelectedElements(e){this.list.setSelection(e.filter(t=>this.elementsToIndexes.has(t)).map(t=>this.elementsToIndexes.get(t)))}getCheckedElements(){return this.elements.filter(e=>e.checked).map(e=>e.item)}setCheckedElements(e){try{this._fireCheckedEvents=!1;const t=new Set;for(const i of e)t.add(i);for(const i of this.elements)i.checked=t.has(i.item)}finally{this._fireCheckedEvents=!0,this.fireCheckedEvents()}}set enabled(e){this.list.getHTMLElement().style.pointerEvents=e?\"\":\"none\"}focus(e){if(!this.list.length)return;switch(e===ii.Next&&this.list.getFocus()[0]===this.list.length-1&&(e=ii.First),e===ii.Previous&&this.list.getFocus()[0]===0&&(e=ii.Last),e===ii.Second&&this.list.length<2&&(e=ii.First),e){case ii.First:this.list.focusFirst();break;case ii.Second:this.list.focusNth(1);break;case ii.Last:this.list.focusLast();break;case ii.Next:this.list.focusNext();break;case ii.Previous:this.list.focusPrevious();break;case ii.NextPage:this.list.focusNextPage();break;case ii.PreviousPage:this.list.focusPreviousPage();break}const t=this.list.getFocus()[0];typeof t==\"number\"&&this.list.reveal(t)}clearFocus(){this.list.setFocus([])}domFocus(){this.list.domFocus()}layout(e){this.list.getHTMLElement().style.maxHeight=e?`calc(${Math.floor(e/44)*44}px)`:\"\",this.list.layout()}filter(e){if(!(this.sortByLabel||this.matchOnLabel||this.matchOnDescription||this.matchOnDetail))return this.list.layout(),!1;const t=e;if(e=e.trim(),!e||!(this.matchOnLabel||this.matchOnDescription||this.matchOnDetail))this.elements.forEach(n=>{n.labelHighlights=void 0,n.descriptionHighlights=void 0,n.detailHighlights=void 0,n.hidden=!1;const s=n.index&&this.inputElements[n.index-1];n.separator=s&&s.type===\"separator\"?s:void 0});else{let n;this.elements.forEach(s=>{let r;this.matchOnLabelMode===\"fuzzy\"?r=this.matchOnLabel?Na(lb(e,Fh(s.saneLabel))):void 0:r=this.matchOnLabel?Na(Rle(t,Fh(s.saneLabel))):void 0;const a=this.matchOnDescription?Na(lb(e,Fh(s.saneDescription||\"\"))):void 0,l=this.matchOnDetail?Na(lb(e,Fh(s.saneDetail||\"\"))):void 0,c=this.matchOnMeta?Na(lb(e,Fh(s.saneMeta||\"\"))):void 0;if(r||a||l||c?(s.labelHighlights=r,s.descriptionHighlights=a,s.detailHighlights=l,s.hidden=!1):(s.labelHighlights=void 0,s.descriptionHighlights=void 0,s.detailHighlights=void 0,s.hidden=!s.item.alwaysShow),s.separator=void 0,!this.sortByLabel){const d=s.index&&this.inputElements[s.index-1];n=d&&d.type===\"separator\"?d:n,n&&!s.hidden&&(s.separator=n,n=void 0)}})}const i=this.elements.filter(n=>!n.hidden);if(this.sortByLabel&&e){const n=e.toLowerCase();i.sort((s,r)=>Ole(s,r,n))}return this.elementsToIndexes=i.reduce((n,s,r)=>(n.set(s.item,r),n),new Map),this.list.splice(0,this.list.length,i),this.list.setFocus([]),this.list.layout(),this._onChangedAllVisibleChecked.fire(this.getAllVisibleChecked()),this._onChangedVisibleCount.fire(i.length),!0}toggleCheckbox(){try{this._fireCheckedEvents=!1;const e=this.list.getFocusedElements(),t=this.allVisibleChecked(e);for(const i of e)i.checked=!t}finally{this._fireCheckedEvents=!0,this.fireCheckedEvents()}}display(e){this.container.style.display=e?\"\":\"none\"}isDisplayed(){return this.container.style.display!==\"none\"}dispose(){this.elementDisposables=et(this.elementDisposables),this.disposables=et(this.disposables)}fireCheckedEvents(){this._fireCheckedEvents&&(this._onChangedAllVisibleChecked.fire(this.getAllVisibleChecked()),this._onChangedCheckedCount.fire(this.getCheckedCount()),this._onChangedCheckedElements.fire(this.getCheckedElements()))}fireButtonTriggered(e){this._onButtonTriggered.fire(e)}style(e){this.list.style(e)}}n9([ui],TN.prototype,\"onDidChangeFocus\",null);n9([ui],TN.prototype,\"onDidChangeSelection\",null);function Rle(o,e){const{text:t,iconOffsets:i}=e;if(!i||i.length===0)return RR(o,t);const n=zx(t,\" \"),s=t.length-n.length,r=RR(o,n);if(r)for(const a of r){const l=i[a.start+s]+s;a.start+=l,a.end+=l}return r}function RR(o,e){const t=e.toLowerCase().indexOf(o.toLowerCase());return t!==-1?[{start:t,end:t+o.length}]:null}function Ole(o,e,t){const i=o.labelHighlights||[],n=e.labelHighlights||[];return i.length&&!n.length?-1:!i.length&&n.length?1:i.length===0&&n.length===0?0:Ele(o.saneSortLabel,e.saneSortLabel,t)}class Ple{getWidgetAriaLabel(){return p(\"quickInput\",\"Quick Input\")}getAriaLabel(e){var t;return!((t=e.separator)===null||t===void 0)&&t.label?`${e.saneAriaLabel}, ${e.separator.label}`:e.saneAriaLabel}getWidgetRole(){return\"listbox\"}getRole(e){return e.hasCheckbox?\"checkbox\":\"option\"}isChecked(e){if(!!e.hasCheckbox)return{value:e.checked,onDidChange:e.onChecked}}}var OR=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};const us=se,Yk={iconClass:m.quickInputBack.classNames,tooltip:p(\"quickInput.back\",\"Back\"),handle:-1};class ow extends z{constructor(e){super(),this.ui=e,this.visible=!1,this._enabled=!0,this._busy=!1,this._ignoreFocusOut=!1,this._buttons=[],this.noValidationMessage=ow.noPromptMessage,this._severity=Vt.Ignore,this.buttonsUpdated=!1,this.onDidTriggerButtonEmitter=this._register(new O),this.onDidHideEmitter=this._register(new O),this.onDisposeEmitter=this._register(new O),this.visibleDisposables=this._register(new ee),this.onDidHide=this.onDidHideEmitter.event}get title(){return this._title}set title(e){this._title=e,this.update()}get description(){return this._description}set description(e){this._description=e,this.update()}get step(){return this._steps}set step(e){this._steps=e,this.update()}get totalSteps(){return this._totalSteps}set totalSteps(e){this._totalSteps=e,this.update()}get enabled(){return this._enabled}set enabled(e){this._enabled=e,this.update()}get contextKey(){return this._contextKey}set contextKey(e){this._contextKey=e,this.update()}get busy(){return this._busy}set busy(e){this._busy=e,this.update()}get ignoreFocusOut(){return this._ignoreFocusOut}set ignoreFocusOut(e){const t=this._ignoreFocusOut!==e&&!Xa;this._ignoreFocusOut=e&&!Xa,t&&this.update()}get buttons(){return this._buttons}set buttons(e){this._buttons=e,this.buttonsUpdated=!0,this.update()}get validationMessage(){return this._validationMessage}set validationMessage(e){this._validationMessage=e,this.update()}get severity(){return this._severity}set severity(e){this._severity=e,this.update()}show(){this.visible||(this.visibleDisposables.add(this.ui.onDidTriggerButton(e=>{this.buttons.indexOf(e)!==-1&&this.onDidTriggerButtonEmitter.fire(e)})),this.ui.show(this),this.visible=!0,this._lastValidationMessage=void 0,this._lastSeverity=void 0,this.buttons.length&&(this.buttonsUpdated=!0),this.update())}hide(){!this.visible||this.ui.hide()}didHide(e=rm.Other){this.visible=!1,this.visibleDisposables.clear(),this.onDidHideEmitter.fire({reason:e})}update(){if(!this.visible)return;const e=this.getTitle();e&&this.ui.title.textContent!==e?this.ui.title.textContent=e:!e&&this.ui.title.innerHTML!==\"&nbsp;\"&&(this.ui.title.innerText=\"\\xA0\");const t=this.getDescription();if(this.ui.description1.textContent!==t&&(this.ui.description1.textContent=t),this.ui.description2.textContent!==t&&(this.ui.description2.textContent=t),this.busy&&!this.busyDelay&&(this.busyDelay=new Is,this.busyDelay.setIfNotSet(()=>{this.visible&&this.ui.progressBar.infinite()},800)),!this.busy&&this.busyDelay&&(this.ui.progressBar.stop(),this.busyDelay.cancel(),this.busyDelay=void 0),this.buttonsUpdated){this.buttonsUpdated=!1,this.ui.leftActionBar.clear();const n=this.buttons.filter(r=>r===Yk);this.ui.leftActionBar.push(n.map((r,a)=>{const l=new is(`id-${a}`,\"\",r.iconClass||Zk(r.iconPath),!0,()=>OR(this,void 0,void 0,function*(){this.onDidTriggerButtonEmitter.fire(r)}));return l.tooltip=r.tooltip||\"\",l}),{icon:!0,label:!1}),this.ui.rightActionBar.clear();const s=this.buttons.filter(r=>r!==Yk);this.ui.rightActionBar.push(s.map((r,a)=>{const l=new is(`id-${a}`,\"\",r.iconClass||Zk(r.iconPath),!0,()=>OR(this,void 0,void 0,function*(){this.onDidTriggerButtonEmitter.fire(r)}));return l.tooltip=r.tooltip||\"\",l}),{icon:!0,label:!1})}this.ui.ignoreFocusOut=this.ignoreFocusOut,this.ui.setEnabled(this.enabled),this.ui.setContextKey(this.contextKey);const i=this.validationMessage||this.noValidationMessage;this._lastValidationMessage!==i&&(this._lastValidationMessage=i,Rd(this.ui.message,...yd(i))),this._lastSeverity!==this.severity&&(this._lastSeverity=this.severity,this.showMessageDecoration(this.severity))}getTitle(){return this.title&&this.step?`${this.title} (${this.getSteps()})`:this.title?this.title:this.step?this.getSteps():\"\"}getDescription(){return this.description||\"\"}getSteps(){return this.step&&this.totalSteps?p(\"quickInput.steps\",\"{0}/{1}\",this.step,this.totalSteps):this.step?String(this.step):\"\"}showMessageDecoration(e){if(this.ui.inputBox.showDecoration(e),e!==Vt.Ignore){const t=this.ui.inputBox.stylesForType(e);this.ui.message.style.color=t.foreground?`${t.foreground}`:\"\",this.ui.message.style.backgroundColor=t.background?`${t.background}`:\"\",this.ui.message.style.border=t.border?`1px solid ${t.border}`:\"\",this.ui.message.style.marginBottom=\"-2px\"}else this.ui.message.style.color=\"\",this.ui.message.style.backgroundColor=\"\",this.ui.message.style.border=\"\",this.ui.message.style.marginBottom=\"\"}dispose(){this.hide(),this.onDisposeEmitter.fire(),super.dispose()}}ow.noPromptMessage=p(\"inputModeEntry\",\"Press 'Enter' to confirm your input or 'Escape' to cancel\");class Vm extends ow{constructor(){super(...arguments),this._value=\"\",this.onDidChangeValueEmitter=this._register(new O),this.onWillAcceptEmitter=this._register(new O),this.onDidAcceptEmitter=this._register(new O),this.onDidCustomEmitter=this._register(new O),this._items=[],this.itemsUpdated=!1,this._canSelectMany=!1,this._canAcceptInBackground=!1,this._matchOnDescription=!1,this._matchOnDetail=!1,this._matchOnLabel=!0,this._matchOnLabelMode=\"fuzzy\",this._sortByLabel=!0,this._autoFocusOnList=!0,this._keepScrollPosition=!1,this._itemActivation=this.ui.isScreenReaderOptimized()?Eo.NONE:Eo.FIRST,this._activeItems=[],this.activeItemsUpdated=!1,this.activeItemsToConfirm=[],this.onDidChangeActiveEmitter=this._register(new O),this._selectedItems=[],this.selectedItemsUpdated=!1,this.selectedItemsToConfirm=[],this.onDidChangeSelectionEmitter=this._register(new O),this.onDidTriggerItemButtonEmitter=this._register(new O),this.valueSelectionUpdated=!0,this._ok=\"default\",this._customButton=!1,this.filterValue=e=>e,this.onDidChangeValue=this.onDidChangeValueEmitter.event,this.onWillAccept=this.onWillAcceptEmitter.event,this.onDidAccept=this.onDidAcceptEmitter.event,this.onDidChangeActive=this.onDidChangeActiveEmitter.event,this.onDidChangeSelection=this.onDidChangeSelectionEmitter.event,this.onDidTriggerItemButton=this.onDidTriggerItemButtonEmitter.event}get quickNavigate(){return this._quickNavigate}set quickNavigate(e){this._quickNavigate=e,this.update()}get value(){return this._value}set value(e){this.doSetValue(e)}doSetValue(e,t){this._value!==e&&(this._value=e,t||this.update(),this.visible&&this.ui.list.filter(this.filterValue(this._value))&&this.trySelectFirst(),this.onDidChangeValueEmitter.fire(this._value))}set ariaLabel(e){this._ariaLabel=e,this.update()}get ariaLabel(){return this._ariaLabel}get placeholder(){return this._placeholder}set placeholder(e){this._placeholder=e,this.update()}get items(){return this._items}get scrollTop(){return this.ui.list.scrollTop}set scrollTop(e){this.ui.list.scrollTop=e}set items(e){this._items=e,this.itemsUpdated=!0,this.update()}get canSelectMany(){return this._canSelectMany}set canSelectMany(e){this._canSelectMany=e,this.update()}get canAcceptInBackground(){return this._canAcceptInBackground}set canAcceptInBackground(e){this._canAcceptInBackground=e}get matchOnDescription(){return this._matchOnDescription}set matchOnDescription(e){this._matchOnDescription=e,this.update()}get matchOnDetail(){return this._matchOnDetail}set matchOnDetail(e){this._matchOnDetail=e,this.update()}get matchOnLabel(){return this._matchOnLabel}set matchOnLabel(e){this._matchOnLabel=e,this.update()}get matchOnLabelMode(){return this._matchOnLabelMode}set matchOnLabelMode(e){this._matchOnLabelMode=e,this.update()}get sortByLabel(){return this._sortByLabel}set sortByLabel(e){this._sortByLabel=e,this.update()}get autoFocusOnList(){return this._autoFocusOnList}set autoFocusOnList(e){this._autoFocusOnList=e,this.update()}get keepScrollPosition(){return this._keepScrollPosition}set keepScrollPosition(e){this._keepScrollPosition=e}get itemActivation(){return this._itemActivation}set itemActivation(e){this._itemActivation=e}get activeItems(){return this._activeItems}set activeItems(e){this._activeItems=e,this.activeItemsUpdated=!0,this.update()}get selectedItems(){return this._selectedItems}set selectedItems(e){this._selectedItems=e,this.selectedItemsUpdated=!0,this.update()}get keyMods(){return this._quickNavigate?zY:this.ui.keyMods}set valueSelection(e){this._valueSelection=e,this.valueSelectionUpdated=!0,this.update()}get customButton(){return this._customButton}set customButton(e){this._customButton=e,this.update()}get customLabel(){return this._customButtonLabel}set customLabel(e){this._customButtonLabel=e,this.update()}get customHover(){return this._customButtonHover}set customHover(e){this._customButtonHover=e,this.update()}get ok(){return this._ok}set ok(e){this._ok=e,this.update()}get hideInput(){return!!this._hideInput}set hideInput(e){this._hideInput=e,this.update()}trySelectFirst(){this.autoFocusOnList&&(this.canSelectMany||this.ui.list.focus(ii.First))}show(){this.visible||(this.visibleDisposables.add(this.ui.inputBox.onDidChange(e=>{this.doSetValue(e,!0)})),this.visibleDisposables.add(this.ui.inputBox.onMouseDown(e=>{this.autoFocusOnList||this.ui.list.clearFocus()})),this.visibleDisposables.add((this._hideInput?this.ui.list:this.ui.inputBox).onKeyDown(e=>{switch(e.keyCode){case 18:this.ui.list.focus(ii.Next),this.canSelectMany&&this.ui.list.domFocus(),ct.stop(e,!0);break;case 16:this.ui.list.getFocusedElements().length?this.ui.list.focus(ii.Previous):this.ui.list.focus(ii.Last),this.canSelectMany&&this.ui.list.domFocus(),ct.stop(e,!0);break;case 12:this.ui.list.focus(ii.NextPage),this.canSelectMany&&this.ui.list.domFocus(),ct.stop(e,!0);break;case 11:this.ui.list.focus(ii.PreviousPage),this.canSelectMany&&this.ui.list.domFocus(),ct.stop(e,!0);break;case 17:if(!this._canAcceptInBackground||!this.ui.inputBox.isSelectionAtEnd())return;this.activeItems[0]&&(this._selectedItems=[this.activeItems[0]],this.onDidChangeSelectionEmitter.fire(this.selectedItems),this.handleAccept(!0));break;case 14:(e.ctrlKey||e.metaKey)&&!e.shiftKey&&!e.altKey&&(this.ui.list.focus(ii.First),ct.stop(e,!0));break;case 13:(e.ctrlKey||e.metaKey)&&!e.shiftKey&&!e.altKey&&(this.ui.list.focus(ii.Last),ct.stop(e,!0));break}})),this.visibleDisposables.add(this.ui.onDidAccept(()=>{this.canSelectMany?this.ui.list.getCheckedElements().length||(this._selectedItems=[],this.onDidChangeSelectionEmitter.fire(this.selectedItems)):this.activeItems[0]&&(this._selectedItems=[this.activeItems[0]],this.onDidChangeSelectionEmitter.fire(this.selectedItems)),this.handleAccept(!1)})),this.visibleDisposables.add(this.ui.onDidCustom(()=>{this.onDidCustomEmitter.fire()})),this.visibleDisposables.add(this.ui.list.onDidChangeFocus(e=>{this.activeItemsUpdated||this.activeItemsToConfirm!==this._activeItems&&ys(e,this._activeItems,(t,i)=>t===i)||(this._activeItems=e,this.onDidChangeActiveEmitter.fire(e))})),this.visibleDisposables.add(this.ui.list.onDidChangeSelection(({items:e,event:t})=>{if(this.canSelectMany){e.length&&this.ui.list.setSelectedElements([]);return}this.selectedItemsToConfirm!==this._selectedItems&&ys(e,this._selectedItems,(i,n)=>i===n)||(this._selectedItems=e,this.onDidChangeSelectionEmitter.fire(e),e.length&&this.handleAccept(t instanceof MouseEvent&&t.button===1))})),this.visibleDisposables.add(this.ui.list.onChangedCheckedElements(e=>{!this.canSelectMany||this.selectedItemsToConfirm!==this._selectedItems&&ys(e,this._selectedItems,(t,i)=>t===i)||(this._selectedItems=e,this.onDidChangeSelectionEmitter.fire(e))})),this.visibleDisposables.add(this.ui.list.onButtonTriggered(e=>this.onDidTriggerItemButtonEmitter.fire(e))),this.visibleDisposables.add(this.registerQuickNavigation()),this.valueSelectionUpdated=!0),super.show()}handleAccept(e){let t=!1;this.onWillAcceptEmitter.fire({veto:()=>t=!0}),t||this.onDidAcceptEmitter.fire({inBackground:e})}registerQuickNavigation(){return q(this.ui.container,le.KEY_UP,e=>{if(this.canSelectMany||!this._quickNavigate)return;const t=new Mt(e),i=t.keyCode;this._quickNavigate.keybindings.some(r=>{const[a,l]=r.getParts();return l?!1:a.shiftKey&&i===4?!(t.ctrlKey||t.altKey||t.metaKey):!!(a.altKey&&i===6||a.ctrlKey&&i===5||a.metaKey&&i===57)})&&(this.activeItems[0]&&(this._selectedItems=[this.activeItems[0]],this.onDidChangeSelectionEmitter.fire(this.selectedItems),this.handleAccept(!1)),this._quickNavigate=void 0)})}update(){if(!this.visible)return;const e=this.keepScrollPosition?this.scrollTop:0,t=!!this._hideInput&&this._items.length>0;this.ui.container.classList.toggle(\"hidden-input\",t&&!this.description);const i={title:!!this.title||!!this.step||!!this.buttons.length,description:!!this.description,checkAll:this.canSelectMany&&!this._hideCheckAll,checkBox:this.canSelectMany,inputBox:!t,progressBar:!t,visibleCount:!0,count:this.canSelectMany,ok:this.ok===\"default\"?this.canSelectMany:this.ok,list:!0,message:!!this.validationMessage,customButton:this.customButton};this.ui.setVisibilities(i),super.update(),this.ui.inputBox.value!==this.value&&(this.ui.inputBox.value=this.value),this.valueSelectionUpdated&&(this.valueSelectionUpdated=!1,this.ui.inputBox.select(this._valueSelection&&{start:this._valueSelection[0],end:this._valueSelection[1]})),this.ui.inputBox.placeholder!==(this.placeholder||\"\")&&(this.ui.inputBox.placeholder=this.placeholder||\"\");let n=this.ariaLabel;if(n||(n=this.placeholder||Vm.DEFAULT_ARIA_LABEL,this.title&&(n+=` - ${this.title}`)),this.ui.inputBox.ariaLabel!==n&&(this.ui.inputBox.ariaLabel=n),this.ui.list.matchOnDescription=this.matchOnDescription,this.ui.list.matchOnDetail=this.matchOnDetail,this.ui.list.matchOnLabel=this.matchOnLabel,this.ui.list.matchOnLabelMode=this.matchOnLabelMode,this.ui.list.sortByLabel=this.sortByLabel,this.itemsUpdated)switch(this.itemsUpdated=!1,this.ui.list.setElements(this.items),this.ui.list.filter(this.filterValue(this.ui.inputBox.value)),this.ui.checkAll.checked=this.ui.list.getAllVisibleChecked(),this.ui.visibleCount.setCount(this.ui.list.getVisibleCount()),this.ui.count.setCount(this.ui.list.getCheckedCount()),this._itemActivation){case Eo.NONE:this._itemActivation=Eo.FIRST;break;case Eo.SECOND:this.ui.list.focus(ii.Second),this._itemActivation=Eo.FIRST;break;case Eo.LAST:this.ui.list.focus(ii.Last),this._itemActivation=Eo.FIRST;break;default:this.trySelectFirst();break}this.ui.container.classList.contains(\"show-checkboxes\")!==!!this.canSelectMany&&(this.canSelectMany?this.ui.list.clearFocus():this.trySelectFirst()),this.activeItemsUpdated&&(this.activeItemsUpdated=!1,this.activeItemsToConfirm=this._activeItems,this.ui.list.setFocusedElements(this.activeItems),this.activeItemsToConfirm===this._activeItems&&(this.activeItemsToConfirm=null)),this.selectedItemsUpdated&&(this.selectedItemsUpdated=!1,this.selectedItemsToConfirm=this._selectedItems,this.canSelectMany?this.ui.list.setCheckedElements(this.selectedItems):this.ui.list.setSelectedElements(this.selectedItems),this.selectedItemsToConfirm===this._selectedItems&&(this.selectedItemsToConfirm=null)),this.ui.customButton.label=this.customLabel||\"\",this.ui.customButton.element.title=this.customHover||\"\",this.ui.setComboboxAccessibility(!0),i.inputBox||(this.ui.list.domFocus(),this.canSelectMany&&this.ui.list.focus(ii.First)),this.keepScrollPosition&&(this.scrollTop=e)}}Vm.DEFAULT_ARIA_LABEL=p(\"quickInputBox.ariaLabel\",\"Type to narrow down results.\");class rw extends z{constructor(e){super(),this.options=e,this.comboboxAccessibility=!1,this.enabled=!0,this.onDidAcceptEmitter=this._register(new O),this.onDidCustomEmitter=this._register(new O),this.onDidTriggerButtonEmitter=this._register(new O),this.keyMods={ctrlCmd:!1,alt:!1},this.controller=null,this.onShowEmitter=this._register(new O),this.onShow=this.onShowEmitter.event,this.onHideEmitter=this._register(new O),this.onHide=this.onHideEmitter.event,this.idPrefix=e.idPrefix,this.parentElement=e.container,this.styles=e.styles,this.registerKeyModsListeners()}registerKeyModsListeners(){const e=t=>{this.keyMods.ctrlCmd=t.ctrlKey||t.metaKey,this.keyMods.alt=t.altKey};this._register(q(window,le.KEY_DOWN,e,!0)),this._register(q(window,le.KEY_UP,e,!0)),this._register(q(window,le.MOUSE_DOWN,e,!0))}getUI(){if(this.ui)return this.ui;const e=G(this.parentElement,us(\".quick-input-widget.show-file-icons\"));e.tabIndex=-1,e.style.display=\"none\";const t=qs(e),i=G(e,us(\".quick-input-titlebar\")),n=this._register(new qr(i));n.domNode.classList.add(\"quick-input-left-action-bar\");const s=G(i,us(\".quick-input-title\")),r=this._register(new qr(i));r.domNode.classList.add(\"quick-input-right-action-bar\");const a=G(e,us(\".quick-input-description\")),l=G(e,us(\".quick-input-header\")),c=G(l,us(\"input.quick-input-check-all\"));c.type=\"checkbox\",c.setAttribute(\"aria-label\",p(\"quickInput.checkAll\",\"Toggle all checkboxes\")),this._register(Ei(c,le.CHANGE,R=>{const P=c.checked;y.setAllVisibleChecked(P)})),this._register(q(c,le.CLICK,R=>{(R.x||R.y)&&g.setFocus()}));const d=G(l,us(\".quick-input-description\")),h=G(l,us(\".quick-input-and-message\")),u=G(h,us(\".quick-input-filter\")),g=this._register(new xle(u));g.setAttribute(\"aria-describedby\",`${this.idPrefix}message`);const f=G(u,us(\".quick-input-visible-count\"));f.setAttribute(\"aria-live\",\"polite\"),f.setAttribute(\"aria-atomic\",\"true\");const _=new BL(f,{countFormat:p({key:\"quickInput.visibleCount\",comment:[\"This tells the user how many items are shown in a list of items to select from. The items can be anything. Currently not visible, but read by screen readers.\"]},\"{0} Results\")}),b=G(u,us(\".quick-input-count\"));b.setAttribute(\"aria-live\",\"polite\");const v=new BL(b,{countFormat:p({key:\"quickInput.countSelected\",comment:[\"This tells the user how many items are selected in a list of items to select from. The items can be anything.\"]},\"{0} Selected\")}),C=G(l,us(\".quick-input-action\")),w=new ER(C);w.label=p(\"ok\",\"OK\"),this._register(w.onDidClick(R=>{this.onDidAcceptEmitter.fire()}));const S=G(l,us(\".quick-input-action\")),k=new ER(S);k.label=p(\"custom\",\"Custom\"),this._register(k.onDidClick(R=>{this.onDidCustomEmitter.fire()}));const x=G(h,us(`#${this.idPrefix}message.quick-input-message`)),y=this._register(new TN(e,this.idPrefix+\"list\",this.options));this._register(y.onChangedAllVisibleChecked(R=>{c.checked=R})),this._register(y.onChangedVisibleCount(R=>{_.setCount(R)})),this._register(y.onChangedCheckedCount(R=>{v.setCount(R)})),this._register(y.onLeave(()=>{setTimeout(()=>{g.setFocus(),this.controller instanceof Vm&&this.controller.canSelectMany&&y.clearFocus()},0)})),this._register(y.onDidChangeFocus(()=>{this.comboboxAccessibility&&this.getUI().inputBox.setAttribute(\"aria-activedescendant\",this.getUI().list.getActiveDescendant()||\"\")}));const D=new sw(e);D.getContainer().classList.add(\"quick-input-progress\");const I=Ad(e);return this._register(I),this._register(q(e,le.FOCUS,R=>{this.previousFocusElement=R.relatedTarget instanceof HTMLElement?R.relatedTarget:void 0},!0)),this._register(I.onDidBlur(()=>{!this.getUI().ignoreFocusOut&&!this.options.ignoreFocusOut()&&this.hide(rm.Blur),this.previousFocusElement=void 0})),this._register(q(e,le.FOCUS,R=>{g.setFocus()})),this._register(q(e,le.KEY_DOWN,R=>{const P=new Mt(R);switch(P.keyCode){case 3:ct.stop(R,!0),this.onDidAcceptEmitter.fire();break;case 9:ct.stop(R,!0),this.hide(rm.Gesture);break;case 2:if(!P.altKey&&!P.ctrlKey&&!P.metaKey){const H=[\".action-label.codicon\"];e.classList.contains(\"show-checkboxes\")?H.push(\"input\"):H.push(\"input[type=text]\"),this.getUI().list.isDisplayed()&&H.push(\".monaco-list\");const $=e.querySelectorAll(H.join(\", \"));P.shiftKey&&P.target===$[0]?(ct.stop(R,!0),$[$.length-1].focus()):!P.shiftKey&&P.target===$[$.length-1]&&(ct.stop(R,!0),$[0].focus())}break}})),this.ui={container:e,styleSheet:t,leftActionBar:n,titleBar:i,title:s,description1:a,description2:d,rightActionBar:r,checkAll:c,filterContainer:u,inputBox:g,visibleCountContainer:f,visibleCount:_,countContainer:b,count:v,okContainer:C,ok:w,message:x,customButtonContainer:S,customButton:k,list:y,progressBar:D,onDidAccept:this.onDidAcceptEmitter.event,onDidCustom:this.onDidCustomEmitter.event,onDidTriggerButton:this.onDidTriggerButtonEmitter.event,ignoreFocusOut:!1,keyMods:this.keyMods,isScreenReaderOptimized:()=>this.options.isScreenReaderOptimized(),show:R=>this.show(R),hide:()=>this.hide(),setVisibilities:R=>this.setVisibilities(R),setComboboxAccessibility:R=>this.setComboboxAccessibility(R),setEnabled:R=>this.setEnabled(R),setContextKey:R=>this.options.setContextKey(R)},this.updateStyles(),this.ui}pick(e,t={},i=We.None){return new Promise((n,s)=>{let r=d=>{var h;r=n,(h=t.onKeyMods)===null||h===void 0||h.call(t,a.keyMods),n(d)};if(i.isCancellationRequested){r(void 0);return}const a=this.createQuickPick();let l;const c=[a,a.onDidAccept(()=>{if(a.canSelectMany)r(a.selectedItems.slice()),a.hide();else{const d=a.activeItems[0];d&&(r(d),a.hide())}}),a.onDidChangeActive(d=>{const h=d[0];h&&t.onDidFocus&&t.onDidFocus(h)}),a.onDidChangeSelection(d=>{if(!a.canSelectMany){const h=d[0];h&&(r(h),a.hide())}}),a.onDidTriggerItemButton(d=>t.onDidTriggerItemButton&&t.onDidTriggerItemButton(Object.assign(Object.assign({},d),{removeItem:()=>{const h=a.items.indexOf(d.item);if(h!==-1){const u=a.items.slice(),g=u.splice(h,1),f=a.activeItems.filter(b=>b!==g[0]),_=a.keepScrollPosition;a.keepScrollPosition=!0,a.items=u,f&&(a.activeItems=f),a.keepScrollPosition=_}}}))),a.onDidChangeValue(d=>{l&&!d&&(a.activeItems.length!==1||a.activeItems[0]!==l)&&(a.activeItems=[l])}),i.onCancellationRequested(()=>{a.hide()}),a.onDidHide(()=>{et(c),r(void 0)})];a.title=t.title,a.canSelectMany=!!t.canPickMany,a.placeholder=t.placeHolder,a.ignoreFocusOut=!!t.ignoreFocusLost,a.matchOnDescription=!!t.matchOnDescription,a.matchOnDetail=!!t.matchOnDetail,a.matchOnLabel=t.matchOnLabel===void 0||t.matchOnLabel,a.autoFocusOnList=t.autoFocusOnList===void 0||t.autoFocusOnList,a.quickNavigate=t.quickNavigate,a.hideInput=!!t.hideInput,a.contextKey=t.contextKey,a.busy=!0,Promise.all([e,t.activeItem]).then(([d,h])=>{l=h,a.busy=!1,a.items=d,a.canSelectMany&&(a.selectedItems=d.filter(u=>u.type!==\"separator\"&&u.picked)),l&&(a.activeItems=[l])}),a.show(),Promise.resolve(e).then(void 0,d=>{s(d),a.hide()})})}createQuickPick(){const e=this.getUI();return new Vm(e)}show(e){const t=this.getUI();this.onShowEmitter.fire();const i=this.controller;this.controller=e,i&&i.didHide(),this.setEnabled(!0),t.leftActionBar.clear(),t.title.textContent=\"\",t.description1.textContent=\"\",t.description2.textContent=\"\",t.rightActionBar.clear(),t.checkAll.checked=!1,t.inputBox.placeholder=\"\",t.inputBox.password=!1,t.inputBox.showDecoration(Vt.Ignore),t.visibleCount.setCount(0),t.count.setCount(0),Rd(t.message),t.progressBar.stop(),t.list.setElements([]),t.list.matchOnDescription=!1,t.list.matchOnDetail=!1,t.list.matchOnLabel=!0,t.list.sortByLabel=!0,t.ignoreFocusOut=!1,this.setComboboxAccessibility(!1),t.inputBox.ariaLabel=\"\";const n=this.options.backKeybindingLabel();Yk.tooltip=n?p(\"quickInput.backWithKeybinding\",\"Back ({0})\",n):p(\"quickInput.back\",\"Back\"),t.container.style.display=\"\",this.updateLayout(),t.inputBox.setFocus()}setVisibilities(e){const t=this.getUI();t.title.style.display=e.title?\"\":\"none\",t.description1.style.display=e.description&&(e.inputBox||e.checkAll)?\"\":\"none\",t.description2.style.display=e.description&&!(e.inputBox||e.checkAll)?\"\":\"none\",t.checkAll.style.display=e.checkAll?\"\":\"none\",t.filterContainer.style.display=e.inputBox?\"\":\"none\",t.visibleCountContainer.style.display=e.visibleCount?\"\":\"none\",t.countContainer.style.display=e.count?\"\":\"none\",t.okContainer.style.display=e.ok?\"\":\"none\",t.customButtonContainer.style.display=e.customButton?\"\":\"none\",t.message.style.display=e.message?\"\":\"none\",t.progressBar.getContainer().style.display=e.progressBar?\"\":\"none\",t.list.display(!!e.list),t.container.classList[e.checkBox?\"add\":\"remove\"](\"show-checkboxes\"),this.updateLayout()}setComboboxAccessibility(e){if(e!==this.comboboxAccessibility){const t=this.getUI();this.comboboxAccessibility=e,this.comboboxAccessibility?(t.inputBox.setAttribute(\"role\",\"combobox\"),t.inputBox.setAttribute(\"aria-haspopup\",\"true\"),t.inputBox.setAttribute(\"aria-autocomplete\",\"list\"),t.inputBox.setAttribute(\"aria-activedescendant\",t.list.getActiveDescendant()||\"\")):(t.inputBox.removeAttribute(\"role\"),t.inputBox.removeAttribute(\"aria-haspopup\"),t.inputBox.removeAttribute(\"aria-autocomplete\"),t.inputBox.removeAttribute(\"aria-activedescendant\"))}}setEnabled(e){if(e!==this.enabled){this.enabled=e;for(const t of this.getUI().leftActionBar.viewItems)t.getAction().enabled=e;for(const t of this.getUI().rightActionBar.viewItems)t.getAction().enabled=e;this.getUI().checkAll.disabled=!e,this.getUI().ok.enabled=e,this.getUI().list.enabled=e}}hide(e){var t;const i=this.controller;if(i){const n=!(!((t=this.ui)===null||t===void 0)&&t.container.contains(document.activeElement));if(this.controller=null,this.onHideEmitter.fire(),this.getUI().container.style.display=\"none\",!n){let s=this.previousFocusElement;for(;s&&!s.offsetParent;)s=Na(s.parentElement);s!=null&&s.offsetParent?(s.focus(),this.previousFocusElement=void 0):this.options.returnFocus()}i.didHide(e)}}layout(e,t){this.dimension=e,this.titleBarOffset=t,this.updateLayout()}updateLayout(){if(this.ui){this.ui.container.style.top=`${this.titleBarOffset}px`;const e=this.ui.container.style,t=Math.min(this.dimension.width*.62,rw.MAX_WIDTH);e.width=t+\"px\",e.marginLeft=\"-\"+t/2+\"px\",this.ui.inputBox.layout(),this.ui.list.layout(this.dimension&&this.dimension.height*.4)}}applyStyles(e){this.styles=e,this.updateStyles()}updateStyles(){if(this.ui){const{quickInputTitleBackground:e,quickInputBackground:t,quickInputForeground:i,contrastBorder:n,widgetShadow:s}=this.styles.widget;this.ui.titleBar.style.backgroundColor=e?e.toString():\"\",this.ui.container.style.backgroundColor=t?t.toString():\"\",this.ui.container.style.color=i?i.toString():\"\",this.ui.container.style.border=n?`1px solid ${n}`:\"\",this.ui.container.style.boxShadow=s?`0 0 8px 2px ${s}`:\"\",this.ui.inputBox.style(this.styles.inputBox),this.ui.count.style(this.styles.countBadge),this.ui.ok.style(this.styles.button),this.ui.customButton.style(this.styles.button),this.ui.progressBar.style(this.styles.progressBar),this.ui.list.style(this.styles.list);const r=[];this.styles.list.pickerGroupBorder&&r.push(`.quick-input-list .quick-input-list-entry { border-top-color:  ${this.styles.list.pickerGroupBorder}; }`),this.styles.list.pickerGroupForeground&&r.push(`.quick-input-list .quick-input-list-separator { color:  ${this.styles.list.pickerGroupForeground}; }`),(this.styles.keybindingLabel.keybindingLabelBackground||this.styles.keybindingLabel.keybindingLabelBorder||this.styles.keybindingLabel.keybindingLabelBottomBorder||this.styles.keybindingLabel.keybindingLabelShadow||this.styles.keybindingLabel.keybindingLabelForeground)&&(r.push(\".quick-input-list .monaco-keybinding > .monaco-keybinding-key {\"),this.styles.keybindingLabel.keybindingLabelBackground&&r.push(`background-color: ${this.styles.keybindingLabel.keybindingLabelBackground};`),this.styles.keybindingLabel.keybindingLabelBorder&&r.push(`border-color: ${this.styles.keybindingLabel.keybindingLabelBorder};`),this.styles.keybindingLabel.keybindingLabelBottomBorder&&r.push(`border-bottom-color: ${this.styles.keybindingLabel.keybindingLabelBottomBorder};`),this.styles.keybindingLabel.keybindingLabelShadow&&r.push(`box-shadow: inset 0 -1px 0 ${this.styles.keybindingLabel.keybindingLabelShadow};`),this.styles.keybindingLabel.keybindingLabelForeground&&r.push(`color: ${this.styles.keybindingLabel.keybindingLabelForeground};`),r.push(\"}\"));const a=r.join(`\n`);a!==this.ui.styleSheet.textContent&&(this.ui.styleSheet.textContent=a)}}}rw.MAX_WIDTH=600;var Xk;(function(o){o[o.PRESERVE=0]=\"PRESERVE\",o[o.LAST=1]=\"LAST\"})(Xk||(Xk={}));const s9={Quickaccess:\"workbench.contributions.quickaccess\"};class Fle{constructor(){this.providers=[],this.defaultProvider=void 0}registerQuickAccessProvider(e){return e.prefix.length===0?this.defaultProvider=e:this.providers.push(e),this.providers.sort((t,i)=>i.prefix.length-t.prefix.length),ze(()=>{this.providers.splice(this.providers.indexOf(e),1),this.defaultProvider===e&&(this.defaultProvider=void 0)})}getQuickAccessProviders(){return BC([this.defaultProvider,...this.providers])}getQuickAccessProvider(e){return e&&this.providers.find(i=>e.startsWith(i.prefix))||void 0||this.defaultProvider}}di.add(s9.Quickaccess,new Fle);var Ble=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},PR=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let Qk=class extends z{constructor(e,t){super(),this.quickInputService=e,this.instantiationService=t,this.registry=di.as(s9.Quickaccess),this.mapProviderToDescriptor=new Map,this.lastAcceptedPickerValues=new Map,this.visibleQuickAccess=void 0}show(e=\"\",t){this.doShowOrPick(e,!1,t)}doShowOrPick(e,t,i){var n;const[s,r]=this.getOrInstantiateProvider(e),a=this.visibleQuickAccess,l=a==null?void 0:a.descriptor;if(a&&r&&l===r){e!==r.prefix&&!(i!=null&&i.preserveValue)&&(a.picker.value=e),this.adjustValueSelection(a.picker,r,i);return}if(r&&!(i!=null&&i.preserveValue)){let g;if(a&&l&&l!==r){const f=a.value.substr(l.prefix.length);f&&(g=`${r.prefix}${f}`)}if(!g){const f=s==null?void 0:s.defaultFilterValue;f===Xk.LAST?g=this.lastAcceptedPickerValues.get(r):typeof f==\"string\"&&(g=`${r.prefix}${f}`)}typeof g==\"string\"&&(e=g)}const c=new ee,d=c.add(this.quickInputService.createQuickPick());d.value=e,this.adjustValueSelection(d,r,i),d.placeholder=r==null?void 0:r.placeholder,d.quickNavigate=i==null?void 0:i.quickNavigateConfiguration,d.hideInput=!!d.quickNavigate&&!a,(typeof(i==null?void 0:i.itemActivation)==\"number\"||(i==null?void 0:i.quickNavigateConfiguration))&&(d.itemActivation=(n=i==null?void 0:i.itemActivation)!==null&&n!==void 0?n:Eo.SECOND),d.contextKey=r==null?void 0:r.contextKey,d.filterValue=g=>g.substring(r?r.prefix.length:0),r!=null&&r.placeholder&&(d.ariaLabel=r==null?void 0:r.placeholder);let h;t&&(h=new jP,c.add(nc(d.onWillAccept)(g=>{g.veto(),d.hide()}))),c.add(this.registerPickerListeners(d,s,r,e));const u=c.add(new gn);if(s&&c.add(s.provide(d,u.token)),nc(d.onDidHide)(()=>{d.selectedItems.length===0&&u.cancel(),c.dispose(),h==null||h.complete(d.selectedItems.slice(0))}),d.show(),t)return h==null?void 0:h.p}adjustValueSelection(e,t,i){var n;let s;i!=null&&i.preserveValue?s=[e.value.length,e.value.length]:s=[(n=t==null?void 0:t.prefix.length)!==null&&n!==void 0?n:0,e.value.length],e.valueSelection=s}registerPickerListeners(e,t,i,n){const s=new ee,r=this.visibleQuickAccess={picker:e,descriptor:i,value:n};return s.add(ze(()=>{r===this.visibleQuickAccess&&(this.visibleQuickAccess=void 0)})),s.add(e.onDidChangeValue(a=>{const[l]=this.getOrInstantiateProvider(a);l!==t?this.show(a,{preserveValue:!0}):r.value=a})),i&&s.add(e.onDidAccept(()=>{this.lastAcceptedPickerValues.set(i,e.value)})),s}getOrInstantiateProvider(e){const t=this.registry.getQuickAccessProvider(e);if(!t)return[void 0,void 0];let i=this.mapProviderToDescriptor.get(t);return i||(i=this.instantiationService.createInstance(t.ctor),this.mapProviderToDescriptor.set(t,i)),[i,t]}};Qk=Ble([PR(0,c_),PR(1,Re)],Qk);var Wle=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Tf=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let Jk=class extends KB{constructor(e,t,i,n,s){super(i),this.instantiationService=e,this.contextKeyService=t,this.accessibilityService=n,this.layoutService=s,this.contexts=new Map}get controller(){return this._controller||(this._controller=this._register(this.createController())),this._controller}get quickAccess(){return this._quickAccess||(this._quickAccess=this._register(this.instantiationService.createInstance(Qk))),this._quickAccess}createController(e=this.layoutService,t){const i={idPrefix:\"quickInput_\",container:e.container,ignoreFocusOut:()=>!1,isScreenReaderOptimized:()=>this.accessibilityService.isScreenReaderOptimized(),backKeybindingLabel:()=>{},setContextKey:s=>this.setContextKey(s),returnFocus:()=>e.focus(),createList:(s,r,a,l,c)=>this.instantiationService.createInstance(PL,s,r,a,l,c),styles:this.computeStyles()},n=this._register(new rw(Object.assign(Object.assign({},i),t)));return n.layout(e.dimension,e.offset.quickPickTop),this._register(e.onDidLayout(s=>n.layout(s,e.offset.quickPickTop))),this._register(n.onShow(()=>this.resetContextKeys())),this._register(n.onHide(()=>this.resetContextKeys())),n}setContextKey(e){let t;e&&(t=this.contexts.get(e),t||(t=new ce(e,!1).bindTo(this.contextKeyService),this.contexts.set(e,t))),!(t&&t.get())&&(this.resetContextKeys(),t==null||t.set(!0))}resetContextKeys(){this.contexts.forEach(e=>{e.get()&&e.reset()})}pick(e,t={},i=We.None){return this.controller.pick(e,t,i)}createQuickPick(){return this.controller.createQuickPick()}updateStyles(){this.controller.applyStyles(this.computeStyles())}computeStyles(){return{widget:Object.assign({},No(this.theme,{quickInputBackground:zT,quickInputForeground:NH,quickInputTitleBackground:TH,contrastBorder:Be,widgetShadow:Tr})),inputBox:No(this.theme,{inputForeground:YC,inputBackground:ZC,inputBorder:XC,inputValidationInfoBackground:lI,inputValidationInfoForeground:cI,inputValidationInfoBorder:dI,inputValidationWarningBackground:hI,inputValidationWarningForeground:uI,inputValidationWarningBorder:gI,inputValidationErrorBackground:fI,inputValidationErrorForeground:pI,inputValidationErrorBorder:mI}),countBadge:No(this.theme,{badgeBackground:du,badgeForeground:hu,badgeBorder:Be}),button:No(this.theme,{buttonForeground:Of,buttonBackground:zy,buttonHoverBackground:SH,buttonBorder:Be}),progressBar:No(this.theme,{progressBarBackground:yH}),keybindingLabel:No(this.theme,{keybindingLabelBackground:RH,keybindingLabelForeground:OH,keybindingLabelBorder:PH,keybindingLabelBottomBorder:FH,keybindingLabelShadow:Tr}),list:No(this.theme,{listBackground:zT,listInactiveFocusForeground:Ff,listInactiveSelectionIconForeground:Bf,listInactiveFocusBackground:Wf,listFocusOutline:At,listInactiveFocusOutline:At,pickerGroupBorder:AH,pickerGroupForeground:MH})}}};Jk=Wle([Tf(0,Re),Tf(1,xe),Tf(2,vt),Tf(3,ll),Tf(4,tf)],Jk);var o9=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},nd=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let ex=class extends Jk{constructor(e,t,i,n,s,r){super(t,i,n,s,new Bk(e.getContainerDomNode(),r)),this.host=void 0;const a=Mg.get(e);if(a){const l=a.widget;this.host={_serviceBrand:void 0,get hasContainer(){return!0},get container(){return l.getDomNode()},get dimension(){return e.getLayoutInfo()},get onDidLayout(){return e.onDidLayoutChange},focus:()=>e.focus(),offset:{top:0,quickPickTop:0}}}else this.host=void 0}createController(){return super.createController(this.host)}};ex=o9([nd(1,Re),nd(2,xe),nd(3,vt),nd(4,ll),nd(5,dt)],ex);let tx=class{constructor(e,t){this.instantiationService=e,this.codeEditorService=t,this.mapEditorToService=new Map}get activeService(){const e=this.codeEditorService.getFocusedCodeEditor();if(!e)throw new Error(\"Quick input service needs a focused editor to work.\");let t=this.mapEditorToService.get(e);if(!t){const i=t=this.instantiationService.createInstance(ex,e);this.mapEditorToService.set(e,t),nc(e.onDidDispose)(()=>{i.dispose(),this.mapEditorToService.delete(e)})}return t}get quickAccess(){return this.activeService.quickAccess}pick(e,t={},i=We.None){return this.activeService.pick(e,t,i)}createQuickPick(){return this.activeService.createQuickPick()}};tx=o9([nd(0,Re),nd(1,dt)],tx);class Mg{constructor(e){this.editor=e,this.widget=new aw(this.editor)}static get(e){return e.getContribution(Mg.ID)}dispose(){this.widget.dispose()}}Mg.ID=\"editor.controller.quickInput\";class aw{constructor(e){this.codeEditor=e,this.domNode=document.createElement(\"div\"),this.codeEditor.addOverlayWidget(this)}getId(){return aw.ID}getDomNode(){return this.domNode}getPosition(){return{preference:2}}dispose(){this.codeEditor.removeOverlayWidget(this)}}aw.ID=\"editor.contrib.quickInputWidget\";rt(Mg.ID,Mg);class Vle{constructor(e,t,i,n,s){this._parsedThemeRuleBrand=void 0,this.token=e,this.index=t,this.fontStyle=i,this.foreground=n,this.background=s}}function Hle(o){if(!o||!Array.isArray(o))return[];const e=[];let t=0;for(let i=0,n=o.length;i<n;i++){const s=o[i];let r=-1;if(typeof s.fontStyle==\"string\"){r=0;const c=s.fontStyle.split(\" \");for(let d=0,h=c.length;d<h;d++)switch(c[d]){case\"italic\":r=r|1;break;case\"bold\":r=r|2;break;case\"underline\":r=r|4;break;case\"strikethrough\":r=r|8;break}}let a=null;typeof s.foreground==\"string\"&&(a=s.foreground);let l=null;typeof s.background==\"string\"&&(l=s.background),e[t++]=new Vle(s.token||\"\",i,r,a,l)}return e}function zle(o,e){o.sort((d,h)=>{const u=qle(d.token,h.token);return u!==0?u:d.index-h.index});let t=0,i=\"000000\",n=\"ffffff\";for(;o.length>=1&&o[0].token===\"\";){const d=o.shift();d.fontStyle!==-1&&(t=d.fontStyle),d.foreground!==null&&(i=d.foreground),d.background!==null&&(n=d.background)}const s=new $le;for(const d of e)s.getId(d);const r=s.getId(i),a=s.getId(n),l=new MN(t,r,a),c=new AN(l);for(let d=0,h=o.length;d<h;d++){const u=o[d];c.insert(u.token,u.fontStyle,s.getId(u.foreground),s.getId(u.background))}return new r9(s,c)}const Ule=/^#?([0-9A-Fa-f]{6})([0-9A-Fa-f]{2})?$/;class $le{constructor(){this._lastColorId=0,this._id2color=[],this._color2id=new Map}getId(e){if(e===null)return 0;const t=e.match(Ule);if(!t)throw new Error(\"Illegal value for token color: \"+e);e=t[1].toUpperCase();let i=this._color2id.get(e);return i||(i=++this._lastColorId,this._color2id.set(e,i),this._id2color[i]=W.fromHex(\"#\"+e),i)}getColorMap(){return this._id2color.slice(0)}}class r9{constructor(e,t){this._colorMap=e,this._root=t,this._cache=new Map}static createFromRawTokenTheme(e,t){return this.createFromParsedTokenTheme(Hle(e),t)}static createFromParsedTokenTheme(e,t){return zle(e,t)}getColorMap(){return this._colorMap.getColorMap()}_match(e){return this._root.match(e)}match(e,t){let i=this._cache.get(t);if(typeof i==\"undefined\"){const n=this._match(t),s=Kle(t);i=(n.metadata|s<<8)>>>0,this._cache.set(t,i)}return(i|e<<0)>>>0}}const jle=/\\b(comment|string|regex|regexp)\\b/;function Kle(o){const e=o.match(jle);if(!e)return 0;switch(e[1]){case\"comment\":return 1;case\"string\":return 2;case\"regex\":return 3;case\"regexp\":return 3}throw new Error(\"Unexpected match for standard token type!\")}function qle(o,e){return o<e?-1:o>e?1:0}class MN{constructor(e,t,i){this._themeTrieElementRuleBrand=void 0,this._fontStyle=e,this._foreground=t,this._background=i,this.metadata=(this._fontStyle<<11|this._foreground<<15|this._background<<24)>>>0}clone(){return new MN(this._fontStyle,this._foreground,this._background)}acceptOverwrite(e,t,i){e!==-1&&(this._fontStyle=e),t!==0&&(this._foreground=t),i!==0&&(this._background=i),this.metadata=(this._fontStyle<<11|this._foreground<<15|this._background<<24)>>>0}}class AN{constructor(e){this._themeTrieElementBrand=void 0,this._mainRule=e,this._children=new Map}match(e){if(e===\"\")return this._mainRule;const t=e.indexOf(\".\");let i,n;t===-1?(i=e,n=\"\"):(i=e.substring(0,t),n=e.substring(t+1));const s=this._children.get(i);return typeof s!=\"undefined\"?s.match(n):this._mainRule}insert(e,t,i,n){if(e===\"\"){this._mainRule.acceptOverwrite(t,i,n);return}const s=e.indexOf(\".\");let r,a;s===-1?(r=e,a=\"\"):(r=e.substring(0,s),a=e.substring(s+1));let l=this._children.get(r);typeof l==\"undefined\"&&(l=new AN(this._mainRule.clone()),this._children.set(r,l)),l.insert(a,t,i,n)}}function Gle(o){const e=[];for(let t=1,i=o.length;t<i;t++){const n=o[t];e[t]=`.mtk${t} { color: ${n}; }`}return e.push(\".mtki { font-style: italic; }\"),e.push(\".mtkb { font-weight: bold; }\"),e.push(\".mtku { text-decoration: underline; text-underline-position: under; }\"),e.push(\".mtks { text-decoration: line-through; }\"),e.push(\".mtks.mtku { text-decoration: underline line-through; text-underline-position: under; }\"),e.join(`\n`)}const Zle={base:\"vs\",inherit:!1,rules:[{token:\"\",foreground:\"000000\",background:\"fffffe\"},{token:\"invalid\",foreground:\"cd3131\"},{token:\"emphasis\",fontStyle:\"italic\"},{token:\"strong\",fontStyle:\"bold\"},{token:\"variable\",foreground:\"001188\"},{token:\"variable.predefined\",foreground:\"4864AA\"},{token:\"constant\",foreground:\"dd0000\"},{token:\"comment\",foreground:\"008000\"},{token:\"number\",foreground:\"098658\"},{token:\"number.hex\",foreground:\"3030c0\"},{token:\"regexp\",foreground:\"800000\"},{token:\"annotation\",foreground:\"808080\"},{token:\"type\",foreground:\"008080\"},{token:\"delimiter\",foreground:\"000000\"},{token:\"delimiter.html\",foreground:\"383838\"},{token:\"delimiter.xml\",foreground:\"0000FF\"},{token:\"tag\",foreground:\"800000\"},{token:\"tag.id.pug\",foreground:\"4F76AC\"},{token:\"tag.class.pug\",foreground:\"4F76AC\"},{token:\"meta.scss\",foreground:\"800000\"},{token:\"metatag\",foreground:\"e00000\"},{token:\"metatag.content.html\",foreground:\"FF0000\"},{token:\"metatag.html\",foreground:\"808080\"},{token:\"metatag.xml\",foreground:\"808080\"},{token:\"metatag.php\",fontStyle:\"bold\"},{token:\"key\",foreground:\"863B00\"},{token:\"string.key.json\",foreground:\"A31515\"},{token:\"string.value.json\",foreground:\"0451A5\"},{token:\"attribute.name\",foreground:\"FF0000\"},{token:\"attribute.value\",foreground:\"0451A5\"},{token:\"attribute.value.number\",foreground:\"098658\"},{token:\"attribute.value.unit\",foreground:\"098658\"},{token:\"attribute.value.html\",foreground:\"0000FF\"},{token:\"attribute.value.xml\",foreground:\"0000FF\"},{token:\"string\",foreground:\"A31515\"},{token:\"string.html\",foreground:\"0000FF\"},{token:\"string.sql\",foreground:\"FF0000\"},{token:\"string.yaml\",foreground:\"0451A5\"},{token:\"keyword\",foreground:\"0000FF\"},{token:\"keyword.json\",foreground:\"0451A5\"},{token:\"keyword.flow\",foreground:\"AF00DB\"},{token:\"keyword.flow.scss\",foreground:\"0000FF\"},{token:\"operator.scss\",foreground:\"666666\"},{token:\"operator.sql\",foreground:\"778899\"},{token:\"operator.swift\",foreground:\"666666\"},{token:\"predefined.sql\",foreground:\"C700C7\"}],colors:{[bi]:\"#FFFFFE\",[ws]:\"#000000\",[_I]:\"#E5EBF1\",[Xm]:\"#D3D3D3\",[Qm]:\"#939393\",[bI]:\"#ADD6FF4D\"}},Yle={base:\"vs-dark\",inherit:!1,rules:[{token:\"\",foreground:\"D4D4D4\",background:\"1E1E1E\"},{token:\"invalid\",foreground:\"f44747\"},{token:\"emphasis\",fontStyle:\"italic\"},{token:\"strong\",fontStyle:\"bold\"},{token:\"variable\",foreground:\"74B0DF\"},{token:\"variable.predefined\",foreground:\"4864AA\"},{token:\"variable.parameter\",foreground:\"9CDCFE\"},{token:\"constant\",foreground:\"569CD6\"},{token:\"comment\",foreground:\"608B4E\"},{token:\"number\",foreground:\"B5CEA8\"},{token:\"number.hex\",foreground:\"5BB498\"},{token:\"regexp\",foreground:\"B46695\"},{token:\"annotation\",foreground:\"cc6666\"},{token:\"type\",foreground:\"3DC9B0\"},{token:\"delimiter\",foreground:\"DCDCDC\"},{token:\"delimiter.html\",foreground:\"808080\"},{token:\"delimiter.xml\",foreground:\"808080\"},{token:\"tag\",foreground:\"569CD6\"},{token:\"tag.id.pug\",foreground:\"4F76AC\"},{token:\"tag.class.pug\",foreground:\"4F76AC\"},{token:\"meta.scss\",foreground:\"A79873\"},{token:\"meta.tag\",foreground:\"CE9178\"},{token:\"metatag\",foreground:\"DD6A6F\"},{token:\"metatag.content.html\",foreground:\"9CDCFE\"},{token:\"metatag.html\",foreground:\"569CD6\"},{token:\"metatag.xml\",foreground:\"569CD6\"},{token:\"metatag.php\",fontStyle:\"bold\"},{token:\"key\",foreground:\"9CDCFE\"},{token:\"string.key.json\",foreground:\"9CDCFE\"},{token:\"string.value.json\",foreground:\"CE9178\"},{token:\"attribute.name\",foreground:\"9CDCFE\"},{token:\"attribute.value\",foreground:\"CE9178\"},{token:\"attribute.value.number.css\",foreground:\"B5CEA8\"},{token:\"attribute.value.unit.css\",foreground:\"B5CEA8\"},{token:\"attribute.value.hex.css\",foreground:\"D4D4D4\"},{token:\"string\",foreground:\"CE9178\"},{token:\"string.sql\",foreground:\"FF0000\"},{token:\"keyword\",foreground:\"569CD6\"},{token:\"keyword.flow\",foreground:\"C586C0\"},{token:\"keyword.json\",foreground:\"CE9178\"},{token:\"keyword.flow.scss\",foreground:\"569CD6\"},{token:\"operator.scss\",foreground:\"909090\"},{token:\"operator.sql\",foreground:\"778899\"},{token:\"operator.swift\",foreground:\"909090\"},{token:\"predefined.sql\",foreground:\"FF00FF\"}],colors:{[bi]:\"#1E1E1E\",[ws]:\"#D4D4D4\",[_I]:\"#3A3D41\",[Xm]:\"#404040\",[Qm]:\"#707070\",[bI]:\"#ADD6FF26\"}},Xle={base:\"hc-black\",inherit:!1,rules:[{token:\"\",foreground:\"FFFFFF\",background:\"000000\"},{token:\"invalid\",foreground:\"f44747\"},{token:\"emphasis\",fontStyle:\"italic\"},{token:\"strong\",fontStyle:\"bold\"},{token:\"variable\",foreground:\"1AEBFF\"},{token:\"variable.parameter\",foreground:\"9CDCFE\"},{token:\"constant\",foreground:\"569CD6\"},{token:\"comment\",foreground:\"608B4E\"},{token:\"number\",foreground:\"FFFFFF\"},{token:\"regexp\",foreground:\"C0C0C0\"},{token:\"annotation\",foreground:\"569CD6\"},{token:\"type\",foreground:\"3DC9B0\"},{token:\"delimiter\",foreground:\"FFFF00\"},{token:\"delimiter.html\",foreground:\"FFFF00\"},{token:\"tag\",foreground:\"569CD6\"},{token:\"tag.id.pug\",foreground:\"4F76AC\"},{token:\"tag.class.pug\",foreground:\"4F76AC\"},{token:\"meta\",foreground:\"D4D4D4\"},{token:\"meta.tag\",foreground:\"CE9178\"},{token:\"metatag\",foreground:\"569CD6\"},{token:\"metatag.content.html\",foreground:\"1AEBFF\"},{token:\"metatag.html\",foreground:\"569CD6\"},{token:\"metatag.xml\",foreground:\"569CD6\"},{token:\"metatag.php\",fontStyle:\"bold\"},{token:\"key\",foreground:\"9CDCFE\"},{token:\"string.key\",foreground:\"9CDCFE\"},{token:\"string.value\",foreground:\"CE9178\"},{token:\"attribute.name\",foreground:\"569CD6\"},{token:\"attribute.value\",foreground:\"3FF23F\"},{token:\"string\",foreground:\"CE9178\"},{token:\"string.sql\",foreground:\"FF0000\"},{token:\"keyword\",foreground:\"569CD6\"},{token:\"keyword.flow\",foreground:\"C586C0\"},{token:\"operator.sql\",foreground:\"778899\"},{token:\"operator.swift\",foreground:\"909090\"},{token:\"predefined.sql\",foreground:\"FF00FF\"}],colors:{[bi]:\"#000000\",[ws]:\"#FFFFFF\",[Xm]:\"#FFFFFF\",[Qm]:\"#FFFFFF\"}},Qle={base:\"hc-light\",inherit:!1,rules:[{token:\"\",foreground:\"292929\",background:\"FFFFFF\"},{token:\"invalid\",foreground:\"B5200D\"},{token:\"emphasis\",fontStyle:\"italic\"},{token:\"strong\",fontStyle:\"bold\"},{token:\"variable\",foreground:\"264F70\"},{token:\"variable.predefined\",foreground:\"4864AA\"},{token:\"constant\",foreground:\"dd0000\"},{token:\"comment\",foreground:\"008000\"},{token:\"number\",foreground:\"098658\"},{token:\"number.hex\",foreground:\"3030c0\"},{token:\"regexp\",foreground:\"800000\"},{token:\"annotation\",foreground:\"808080\"},{token:\"type\",foreground:\"008080\"},{token:\"delimiter\",foreground:\"000000\"},{token:\"delimiter.html\",foreground:\"383838\"},{token:\"tag\",foreground:\"800000\"},{token:\"tag.id.pug\",foreground:\"4F76AC\"},{token:\"tag.class.pug\",foreground:\"4F76AC\"},{token:\"meta.scss\",foreground:\"800000\"},{token:\"metatag\",foreground:\"e00000\"},{token:\"metatag.content.html\",foreground:\"B5200D\"},{token:\"metatag.html\",foreground:\"808080\"},{token:\"metatag.xml\",foreground:\"808080\"},{token:\"metatag.php\",fontStyle:\"bold\"},{token:\"key\",foreground:\"863B00\"},{token:\"string.key.json\",foreground:\"A31515\"},{token:\"string.value.json\",foreground:\"0451A5\"},{token:\"attribute.name\",foreground:\"264F78\"},{token:\"attribute.value\",foreground:\"0451A5\"},{token:\"string\",foreground:\"A31515\"},{token:\"string.sql\",foreground:\"B5200D\"},{token:\"keyword\",foreground:\"0000FF\"},{token:\"keyword.flow\",foreground:\"AF00DB\"},{token:\"operator.sql\",foreground:\"778899\"},{token:\"operator.swift\",foreground:\"666666\"},{token:\"predefined.sql\",foreground:\"C700C7\"}],colors:{[bi]:\"#FFFFFF\",[ws]:\"#292929\",[Xm]:\"#292929\",[Qm]:\"#292929\"}};function Jle(o){const e=new O,t=p5();return t.onDidChange(()=>e.fire()),o==null||o.onDidProductIconThemeChange(()=>e.fire()),{onDidChange:e.event,getCSS(){const i=o?o.getProductIconTheme():new a9,n={},s=a=>{const l=i.getIcon(a);if(!l)return;const c=l.font;return c?(n[c.id]=c.definition,`.codicon-${a.id}:before { content: '${l.fontCharacter}'; font-family: ${uT(c.id)}; }`):`.codicon-${a.id}:before { content: '${l.fontCharacter}'; }`},r=[];for(const a of t.getIcons()){const l=s(a);l&&r.push(l)}for(const a in n){const l=n[a],c=l.weight?`font-weight: ${l.weight};`:\"\",d=l.style?`font-style: ${l.style};`:\"\",h=l.src.map(u=>`${Od(u.location)} format('${u.format}')`).join(\", \");r.push(`@font-face { src: ${h}; font-family: ${uT(a)};${c}${d} font-display: block; }`)}return r.join(`\n`)}}}class a9{getIcon(e){const t=p5();let i=e.defaults;for(;nt.isThemeIcon(i);){const n=t.getIcon(i.id);if(!n)return;i=n.defaults}return i}}const Al=\"vs\",Sp=\"vs-dark\",qu=\"hc-black\",Gu=\"hc-light\",l9=di.as(qP.ColorContribution),ece=di.as(tP.ThemingContribution);class c9{constructor(e,t){this.semanticHighlighting=!1,this.themeData=t;const i=t.base;e.length>0?(S0(e)?this.id=e:this.id=i+\" \"+e,this.themeName=e):(this.id=i,this.themeName=i),this.colors=null,this.defaultColors=Object.create(null),this._tokenTheme=null}get base(){return this.themeData.base}notifyBaseUpdated(){this.themeData.inherit&&(this.colors=null,this._tokenTheme=null)}getColors(){if(!this.colors){const e=new Map;for(const t in this.themeData.colors)e.set(t,W.fromHex(this.themeData.colors[t]));if(this.themeData.inherit){const t=ix(this.themeData.base);for(const i in t.colors)e.has(i)||e.set(i,W.fromHex(t.colors[i]))}this.colors=e}return this.colors}getColor(e,t){const i=this.getColors().get(e);if(i)return i;if(t!==!1)return this.getDefault(e)}getDefault(e){let t=this.defaultColors[e];return t||(t=l9.resolveDefaultColor(e,this),this.defaultColors[e]=t,t)}defines(e){return Object.prototype.hasOwnProperty.call(this.getColors(),e)}get type(){switch(this.base){case Al:return Vs.LIGHT;case qu:return Vs.HIGH_CONTRAST_DARK;case Gu:return Vs.HIGH_CONTRAST_LIGHT;default:return Vs.DARK}}get tokenTheme(){if(!this._tokenTheme){let e=[],t=[];if(this.themeData.inherit){const s=ix(this.themeData.base);e=s.rules,s.encodedTokensColors&&(t=s.encodedTokensColors)}const i=this.themeData.colors[\"editor.foreground\"],n=this.themeData.colors[\"editor.background\"];if(i||n){const s={token:\"\"};i&&(s.foreground=i),n&&(s.background=n),e.push(s)}e=e.concat(this.themeData.rules),this.themeData.encodedTokensColors&&(t=this.themeData.encodedTokensColors),this._tokenTheme=r9.createFromRawTokenTheme(e,t)}return this._tokenTheme}getTokenStyleMetadata(e,t,i){const s=this.tokenTheme._match([e].concat(t).join(\".\")).metadata,r=Yn.getForeground(s),a=Yn.getFontStyle(s);return{foreground:r,italic:Boolean(a&1),bold:Boolean(a&2),underline:Boolean(a&4),strikethrough:Boolean(a&8)}}}function S0(o){return o===Al||o===Sp||o===qu||o===Gu}function ix(o){switch(o){case Al:return Zle;case Sp:return Yle;case qu:return Xle;case Gu:return Qle}}function Kb(o){const e=ix(o);return new c9(o,e)}class tce extends z{constructor(){super(),this._onColorThemeChange=this._register(new O),this.onDidColorThemeChange=this._onColorThemeChange.event,this._onProductIconThemeChange=this._register(new O),this.onDidProductIconThemeChange=this._onProductIconThemeChange.event,this._environment=Object.create(null),this._builtInProductIconTheme=new a9,this._autoDetectHighContrast=!0,this._knownThemes=new Map,this._knownThemes.set(Al,Kb(Al)),this._knownThemes.set(Sp,Kb(Sp)),this._knownThemes.set(qu,Kb(qu)),this._knownThemes.set(Gu,Kb(Gu));const e=Jle(this);this._codiconCSS=e.getCSS(),this._themeCSS=\"\",this._allCSS=`${this._codiconCSS}\n${this._themeCSS}`,this._globalStyleElement=null,this._styleElements=[],this._colorMapOverride=null,this.setTheme(Al),this._onOSSchemeChanged(),e.onDidChange(()=>{this._codiconCSS=e.getCSS(),this._updateCSS()}),Mx(\"(forced-colors: active)\",()=>{this._onOSSchemeChanged()})}registerEditorContainer(e){return Dp(e)?this._registerShadowDomContainer(e):this._registerRegularEditorContainer()}_registerRegularEditorContainer(){return this._globalStyleElement||(this._globalStyleElement=qs(),this._globalStyleElement.className=\"monaco-colors\",this._globalStyleElement.textContent=this._allCSS,this._styleElements.push(this._globalStyleElement)),z.None}_registerShadowDomContainer(e){const t=qs(e);return t.className=\"monaco-colors\",t.textContent=this._allCSS,this._styleElements.push(t),{dispose:()=>{for(let i=0;i<this._styleElements.length;i++)if(this._styleElements[i]===t){this._styleElements.splice(i,1);return}}}}defineTheme(e,t){if(!/^[a-z0-9\\-]+$/i.test(e))throw new Error(\"Illegal theme name!\");if(!S0(t.base)&&!S0(e))throw new Error(\"Illegal theme base!\");this._knownThemes.set(e,new c9(e,t)),S0(e)&&this._knownThemes.forEach(i=>{i.base===e&&i.notifyBaseUpdated()}),this._theme.themeName===e&&this.setTheme(e)}getColorTheme(){return this._theme}setColorMapOverride(e){this._colorMapOverride=e,this._updateThemeOrColorMap()}setTheme(e){let t;this._knownThemes.has(e)?t=this._knownThemes.get(e):t=this._knownThemes.get(Al),this._updateActualTheme(t)}_updateActualTheme(e){!e||this._theme===e||(this._theme=e,this._updateThemeOrColorMap())}_onOSSchemeChanged(){if(this._autoDetectHighContrast){const e=window.matchMedia(\"(forced-colors: active)\").matches;if(e!==yn(this._theme.type)){let t;Xx(this._theme.type)?t=e?qu:Sp:t=e?Gu:Al,this._updateActualTheme(this._knownThemes.get(t))}}}setAutoDetectHighContrast(e){this._autoDetectHighContrast=e,this._onOSSchemeChanged()}_updateThemeOrColorMap(){const e=[],t={},i={addRule:r=>{t[r]||(e.push(r),t[r]=!0)}};ece.getThemingParticipants().forEach(r=>r(this._theme,i,this._environment));const n=[];for(const r of l9.getColors()){const a=this._theme.getColor(r.id,!0);a&&n.push(`${KP(r.id)}: ${a.toString()};`)}i.addRule(`.monaco-editor { ${n.join(`\n`)} }`);const s=this._colorMapOverride||this._theme.tokenTheme.getColorMap();i.addRule(Gle(s)),this._themeCSS=e.join(`\n`),this._updateCSS(),Jt.setColorMap(s),this._onColorThemeChange.fire(this._theme)}_updateCSS(){this._allCSS=`${this._codiconCSS}\n${this._themeCSS}`,this._styleElements.forEach(e=>e.textContent=this._allCSS)}getFileIconTheme(){return{hasFileIcons:!1,hasFolderIcons:!1,hidesExplorerArrows:!1}}getProductIconTheme(){return this._builtInProductIconTheme}}const yo=qe(\"themeService\");var ice=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},dy=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let nx=class extends z{constructor(e,t,i){super(),this._contextKeyService=e,this._layoutService=t,this._configurationService=i,this._accessibilitySupport=0,this._onDidChangeScreenReaderOptimized=new O,this._onDidChangeReducedMotion=new O,this._accessibilityModeEnabledContext=Km.bindTo(this._contextKeyService);const n=()=>this._accessibilityModeEnabledContext.set(this.isScreenReaderOptimized());this._register(this._configurationService.onDidChangeConfiguration(r=>{r.affectsConfiguration(\"editor.accessibilitySupport\")&&(n(),this._onDidChangeScreenReaderOptimized.fire()),r.affectsConfiguration(\"workbench.reduceMotion\")&&(this._configMotionReduced=this._configurationService.getValue(\"workbench.reduceMotion\"),this._onDidChangeReducedMotion.fire())})),n(),this._register(this.onDidChangeScreenReaderOptimized(()=>n()));const s=window.matchMedia(\"(prefers-reduced-motion: reduce)\");this._systemMotionReduced=s.matches,this._configMotionReduced=this._configurationService.getValue(\"workbench.reduceMotion\"),this.initReducedMotionListeners(s)}initReducedMotionListeners(e){if(!this._layoutService.hasContainer)return;this._register(q(e,\"change\",()=>{this._systemMotionReduced=e.matches,this._configMotionReduced===\"auto\"&&this._onDidChangeReducedMotion.fire()}));const t=()=>{const i=this.isMotionReduced();this._layoutService.container.classList.toggle(\"reduce-motion\",i),this._layoutService.container.classList.toggle(\"enable-motion\",!i)};t(),this._register(this.onDidChangeReducedMotion(()=>t()))}get onDidChangeScreenReaderOptimized(){return this._onDidChangeScreenReaderOptimized.event}isScreenReaderOptimized(){const e=this._configurationService.getValue(\"editor.accessibilitySupport\");return e===\"on\"||e===\"auto\"&&this._accessibilitySupport===2}get onDidChangeReducedMotion(){return this._onDidChangeReducedMotion.event}isMotionReduced(){const e=this._configMotionReduced;return e===\"on\"||e===\"auto\"&&this._systemMotionReduced}getAccessibilitySupport(){return this._accessibilitySupport}};nx=ice([dy(0,xe),dy(1,tf),dy(2,ot)],nx);var RN=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Zu=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let sx=class{constructor(e,t){this._commandService=e,this._hiddenStates=new lC(t)}createMenu(e,t,i){return new ox(e,this._hiddenStates,Object.assign({emitEventsForSubmenuChanges:!1,eventDebounceDelay:50},i),this._commandService,t,this)}};sx=RN([Zu(0,Ci),Zu(1,ia)],sx);let lC=class Zf{constructor(e){this._storageService=e,this._disposables=new ee,this._onDidChange=new O,this.onDidChange=this._onDidChange.event,this._ignoreChangeEvent=!1;try{const t=e.get(Zf._key,0,\"{}\");this._data=JSON.parse(t)}catch(t){this._data=Object.create(null)}this._disposables.add(e.onDidChangeValue(t=>{if(t.key===Zf._key){if(!this._ignoreChangeEvent)try{const i=e.get(Zf._key,0,\"{}\");this._data=JSON.parse(i)}catch(i){console.log(\"FAILED to read storage after UPDATE\",i)}this._onDidChange.fire()}}))}dispose(){this._onDidChange.dispose(),this._disposables.dispose()}isHidden(e,t){var i,n;return(n=(i=this._data[e.id])===null||i===void 0?void 0:i.includes(t))!==null&&n!==void 0?n:!1}updateHidden(e,t,i){const n=this._data[e.id];if(i)n?n.indexOf(t)<0&&n.push(t):this._data[e.id]=[t];else if(n){const s=n.indexOf(t);s>=0&&pW(n,s),n.length===0&&delete this._data[e.id]}this._persist()}_persist(){try{this._ignoreChangeEvent=!0;const e=JSON.stringify(this._data);this._storageService.store(Zf._key,e,0,0)}finally{this._ignoreChangeEvent=!1}}};lC._key=\"menu.hiddenCommands\";lC=RN([Zu(0,ia)],lC);let ox=class nu{constructor(e,t,i,n,s,r){this._id=e,this._hiddenStates=t,this._options=i,this._commandService=n,this._contextKeyService=s,this._menuService=r,this._disposables=new ee,this._menuGroups=[],this._contextKeys=new Set,this._build();const a=new ft(()=>{this._build(),this._onDidChange.fire(this)},i.eventDebounceDelay);this._disposables.add(a),this._disposables.add(po.onDidChangeMenu(d=>{d.has(e)&&a.schedule()}));const l=this._disposables.add(new ee),c=()=>{const d=new ft(()=>this._onDidChange.fire(this),i.eventDebounceDelay);l.add(d),l.add(s.onDidChangeContext(h=>{h.affectsSome(this._contextKeys)&&d.schedule()})),l.add(t.onDidChange(()=>{d.schedule()}))};this._onDidChange=new O({onFirstListenerAdd:c,onLastListenerRemove:l.clear.bind(l)}),this.onDidChange=this._onDidChange.event}dispose(){this._disposables.dispose(),this._onDidChange.dispose()}_build(){this._menuGroups.length=0,this._contextKeys.clear();const e=po.getMenuItems(this._id);let t;e.sort(nu._compareMenuItems);for(const i of e){const n=i.group||\"\";(!t||t[0]!==n)&&(t=[n,[]],this._menuGroups.push(t)),t[1].push(i),this._collectContextKeys(i)}}_collectContextKeys(e){if(nu._fillInKbExprKeys(e.when,this._contextKeys),ou(e)){if(e.command.precondition&&nu._fillInKbExprKeys(e.command.precondition,this._contextKeys),e.command.toggled){const t=e.command.toggled.condition||e.command.toggled;nu._fillInKbExprKeys(t,this._contextKeys)}}else this._options.emitEventsForSubmenuChanges&&po.getMenuItems(e.submenu).forEach(this._collectContextKeys,this)}getActions(e){const t=[];for(const i of this._menuGroups){const[n,s]=i,r=[],a=[];for(const l of s)if(this._contextKeyService.contextMatchesRules(l.when)){let c;if(ou(l)){const h=nce(this._id,l.command,this._hiddenStates);c=new ac(l.command,l.alt,e,h,this._contextKeyService,this._commandService)}else c=new Qx(l,this._menuService,this._contextKeyService,e),c.actions.length===0&&(c.dispose(),c=void 0);c&&a.push(c)}a.length>0&&t.push([n,a]),r.length>0}return t}static _fillInKbExprKeys(e,t){if(e)for(const i of e.keys())t.add(i)}static _compareMenuItems(e,t){const i=e.group,n=t.group;if(i!==n){if(i){if(!n)return-1}else return 1;if(i===\"navigation\")return-1;if(n===\"navigation\")return 1;const a=i.localeCompare(n);if(a!==0)return a}const s=e.order||0,r=t.order||0;return s<r?-1:s>r?1:nu._compareTitles(ou(e)?e.command.title:e.title,ou(t)?t.command.title:t.title)}static _compareTitles(e,t){const i=typeof e==\"string\"?e:e.original,n=typeof t==\"string\"?t:t.original;return i.localeCompare(n)}};ox=RN([Zu(3,Ci),Zu(4,xe),Zu(5,fh)],ox);function nce(o,e,t){const i=`${o.id}/${e.id}`,n=typeof e.title==\"string\"?e.title:e.title.value,s=fT({id:i,label:p(\"hide.label\",\"Hide '{0}'\",n),run(){t.updateHidden(o,e.id,!0)}}),r=fT({id:i,label:n,get checked(){return!t.isHidden(o,e.id)},run(){const a=!t.isHidden(o,e.id);t.updateHidden(o,e.id,a)}});return{hide:s,toggle:r,get isHidden(){return!r.checked}}}var sce=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},FR=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},Yh=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};let rx=class extends z{constructor(e,t){super(),this.layoutService=e,this.logService=t,this.mapTextToType=new Map,this.findText=\"\",this.resources=[],(Qa||Rx)&&this.installWebKitWriteTextWorkaround()}installWebKitWriteTextWorkaround(){const e=()=>{const t=new jP;this.webKitPendingClipboardWritePromise&&!this.webKitPendingClipboardWritePromise.isSettled&&this.webKitPendingClipboardWritePromise.cancel(),this.webKitPendingClipboardWritePromise=t,navigator.clipboard.write([new ClipboardItem({\"text/plain\":t.p})]).catch(i=>Yh(this,void 0,void 0,function*(){(!(i instanceof Error)||i.name!==\"NotAllowedError\"||!t.isRejected)&&this.logService.error(i)}))};this.layoutService.hasContainer&&(this._register(q(this.layoutService.container,\"click\",e)),this._register(q(this.layoutService.container,\"keydown\",e)))}writeText(e,t){return Yh(this,void 0,void 0,function*(){if(t){this.mapTextToType.set(t,e);return}if(this.webKitPendingClipboardWritePromise)return this.webKitPendingClipboardWritePromise.complete(e);try{return yield navigator.clipboard.writeText(e)}catch(s){console.error(s)}const i=document.activeElement,n=document.body.appendChild(se(\"textarea\",{\"aria-hidden\":!0}));n.style.height=\"1px\",n.style.width=\"1px\",n.style.position=\"absolute\",n.value=e,n.focus(),n.select(),document.execCommand(\"copy\"),i instanceof HTMLElement&&i.focus(),document.body.removeChild(n)})}readText(e){return Yh(this,void 0,void 0,function*(){if(e)return this.mapTextToType.get(e)||\"\";try{return yield navigator.clipboard.readText()}catch(t){return console.error(t),\"\"}})}readFindText(){return Yh(this,void 0,void 0,function*(){return this.findText})}writeFindText(e){return Yh(this,void 0,void 0,function*(){this.findText=e})}readResources(){return Yh(this,void 0,void 0,function*(){return this.resources})}};rx=sce([FR(0,tf),FR(1,Co)],rx);var oce=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},rce=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};const yp=\"data-keybinding-context\";class ON{constructor(e,t){this._id=e,this._parent=t,this._value=Object.create(null),this._value._contextId=e}get value(){return Object.assign({},this._value)}setValue(e,t){return this._value[e]!==t?(this._value[e]=t,!0):!1}removeValue(e){return e in this._value?(delete this._value[e],!0):!1}getValue(e){const t=this._value[e];return typeof t==\"undefined\"&&this._parent?this._parent.getValue(e):t}}class Ag extends ON{constructor(){super(-1,null)}setValue(e,t){return!1}removeValue(e){return!1}getValue(e){}}Ag.INSTANCE=new Ag;class Hm extends ON{constructor(e,t,i){super(e,null),this._configurationService=t,this._values=Wu.forConfigKeys(),this._listener=this._configurationService.onDidChangeConfiguration(n=>{if(n.source===7){const s=Array.from(Ue.map(this._values,([r])=>r));this._values.clear(),i.fire(new WR(s))}else{const s=[];for(const r of n.affectedKeys){const a=`config.${r}`,l=this._values.findSuperstr(a);l!==void 0&&(s.push(...Ue.map(l,([c])=>c)),this._values.deleteSuperstr(a)),this._values.has(a)&&(s.push(a),this._values.delete(a))}i.fire(new WR(s))}})}dispose(){this._listener.dispose()}getValue(e){if(e.indexOf(Hm._keyPrefix)!==0)return super.getValue(e);if(this._values.has(e))return this._values.get(e);const t=e.substr(Hm._keyPrefix.length),i=this._configurationService.getValue(t);let n;switch(typeof i){case\"number\":case\"boolean\":case\"string\":n=i;break;default:Array.isArray(i)?n=JSON.stringify(i):n=i}return this._values.set(e,n),n}setValue(e,t){return super.setValue(e,t)}removeValue(e){return super.removeValue(e)}}Hm._keyPrefix=\"config.\";class ace{constructor(e,t,i){this._service=e,this._key=t,this._defaultValue=i,this.reset()}set(e){this._service.setContext(this._key,e)}reset(){typeof this._defaultValue==\"undefined\"?this._service.removeContext(this._key):this._service.setContext(this._key,this._defaultValue)}get(){return this._service.getContextKeyValue(this._key)}}class BR{constructor(e){this.key=e}affectsSome(e){return e.has(this.key)}allKeysContainedIn(e){return this.affectsSome(e)}}class WR{constructor(e){this.keys=e}affectsSome(e){for(const t of this.keys)if(e.has(t))return!0;return!1}allKeysContainedIn(e){return this.keys.every(t=>e.has(t))}}class lce{constructor(e){this.events=e}affectsSome(e){for(const t of this.events)if(t.affectsSome(e))return!0;return!1}allKeysContainedIn(e){return this.events.every(t=>t.allKeysContainedIn(e))}}function cce(o,e){return o.allKeysContainedIn(new Set(Object.keys(e)))}class d9{constructor(e){this._onDidChangeContext=new I0({merge:t=>new lce(t)}),this.onDidChangeContext=this._onDidChangeContext.event,this._isDisposed=!1,this._myContextId=e}createKey(e,t){if(this._isDisposed)throw new Error(\"AbstractContextKeyService has been disposed\");return new ace(this,e,t)}bufferChangeEvents(e){this._onDidChangeContext.pause();try{e()}finally{this._onDidChangeContext.resume()}}createScoped(e){if(this._isDisposed)throw new Error(\"AbstractContextKeyService has been disposed\");return new dce(this,e)}contextMatchesRules(e){if(this._isDisposed)throw new Error(\"AbstractContextKeyService has been disposed\");const t=this.getContextValuesContainer(this._myContextId);return e?e.evaluate(t):!0}getContextKeyValue(e){if(!this._isDisposed)return this.getContextValuesContainer(this._myContextId).getValue(e)}setContext(e,t){if(this._isDisposed)return;const i=this.getContextValuesContainer(this._myContextId);!i||i.setValue(e,t)&&this._onDidChangeContext.fire(new BR(e))}removeContext(e){this._isDisposed||this.getContextValuesContainer(this._myContextId).removeValue(e)&&this._onDidChangeContext.fire(new BR(e))}getContext(e){return this._isDisposed?Ag.INSTANCE:this.getContextValuesContainer(hce(e))}}let ax=class extends d9{constructor(e){super(0),this._contexts=new Map,this._toDispose=new ee,this._lastContextId=0;const t=new Hm(this._myContextId,e,this._onDidChangeContext);this._contexts.set(this._myContextId,t),this._toDispose.add(t)}dispose(){this._onDidChangeContext.dispose(),this._isDisposed=!0,this._toDispose.dispose()}getContextValuesContainer(e){return this._isDisposed?Ag.INSTANCE:this._contexts.get(e)||Ag.INSTANCE}createChildContext(e=this._myContextId){if(this._isDisposed)throw new Error(\"ContextKeyService has been disposed\");const t=++this._lastContextId;return this._contexts.set(t,new ON(t,this.getContextValuesContainer(e))),t}disposeContext(e){this._isDisposed||this._contexts.delete(e)}};ax=oce([rce(0,ot)],ax);class dce extends d9{constructor(e,t){if(super(e.createChildContext()),this._parentChangeListener=new Vn,this._parent=e,this._updateParentChangeListener(),this._domNode=t,this._domNode.hasAttribute(yp)){let i=\"\";this._domNode.classList&&(i=Array.from(this._domNode.classList.values()).join(\", \")),console.error(`Element already has context attribute${i?\": \"+i:\"\"}`)}this._domNode.setAttribute(yp,String(this._myContextId))}_updateParentChangeListener(){this._parentChangeListener.value=this._parent.onDidChangeContext(e=>{const i=this._parent.getContextValuesContainer(this._myContextId).value;cce(e,i)||this._onDidChangeContext.fire(e)})}dispose(){this._isDisposed||(this._onDidChangeContext.dispose(),this._parent.disposeContext(this._myContextId),this._parentChangeListener.dispose(),this._domNode.removeAttribute(yp),this._isDisposed=!0)}getContextValuesContainer(e){return this._isDisposed?Ag.INSTANCE:this._parent.getContextValuesContainer(e)}createChildContext(e=this._myContextId){if(this._isDisposed)throw new Error(\"ScopedContextKeyService has been disposed\");return this._parent.createChildContext(e)}disposeContext(e){this._isDisposed||this._parent.disposeContext(e)}}function hce(o){for(;o;){if(o.hasAttribute(yp)){const e=o.getAttribute(yp);return e?parseInt(e,10):NaN}o=o.parentElement}return 0}function uce(o,e,t){o.get(xe).createKey(String(e),gce(t))}function gce(o){return FP(o,e=>{if(typeof e==\"object\"&&e.$mid===1)return me.revive(e).toString();if(e instanceof me)return e.toString()})}Ye.registerCommand(UB,uce);Ye.registerCommand({id:\"getContextKeyInfo\",handler(){return[...ce.all()].sort((o,e)=>o.key.localeCompare(e.key))},description:{description:p(\"getContextKeyInfo\",\"A command that returns information about context keys\"),args:[]}});Ye.registerCommand(\"_generateContextKeyInfo\",function(){const o=[],e=new Set;for(const t of ce.all())e.has(t.key)||(e.add(t.key),o.push(t));o.sort((t,i)=>t.key.localeCompare(i.key)),console.log(JSON.stringify(o,void 0,2))});class fce{constructor(e){this.incoming=new Map,this.outgoing=new Map,this.data=e}}class pce{constructor(e){this._hashFn=e,this._nodes=new Map}roots(){const e=[];for(const t of this._nodes.values())t.outgoing.size===0&&e.push(t);return e}insertEdge(e,t){const i=this.lookupOrInsertNode(e),n=this.lookupOrInsertNode(t);i.outgoing.set(this._hashFn(t),n),n.incoming.set(this._hashFn(e),i)}removeNode(e){const t=this._hashFn(e);this._nodes.delete(t);for(const i of this._nodes.values())i.outgoing.delete(t),i.incoming.delete(t)}lookupOrInsertNode(e){const t=this._hashFn(e);let i=this._nodes.get(t);return i||(i=new fce(e),this._nodes.set(t,i)),i}isEmpty(){return this._nodes.size===0}toString(){const e=[];for(const[t,i]of this._nodes)e.push(`${t}, (incoming)[${[...i.incoming.keys()].join(\", \")}], (outgoing)[${[...i.outgoing.keys()].join(\",\")}]`);return e.join(`\n`)}findCycleSlow(){for(const[e,t]of this._nodes){const i=new Set([e]),n=this._findCycle(t,i);if(n)return n}}_findCycle(e,t){for(const[i,n]of e.outgoing){if(t.has(i))return[...t,i].join(\" -> \");t.add(i);const s=this._findCycle(n,t);if(s)return s;t.delete(i)}}}class VR extends Error{constructor(e){var t;super(\"cyclic dependency between services\"),this.message=(t=e.findCycleSlow())!==null&&t!==void 0?t:`UNABLE to detect cycle, dumping graph: \n${e.toString()}`}}class PN{constructor(e=new c1,t=!1,i){this._activeInstantiations=new Set,this._services=e,this._strict=t,this._parent=i,this._services.set(Re,this)}createChild(e){return new PN(e,this._strict,this)}invokeFunction(e,...t){const i=co.traceInvocation(e);let n=!1;try{return e({get:r=>{if(n)throw M8(\"service accessor is only valid during the invocation of its target method\");const a=this._getOrCreateServiceInstance(r,i);if(!a)throw new Error(`[invokeFunction] unknown service '${r}'`);return a}},...t)}finally{n=!0,i.stop()}}createInstance(e,...t){let i,n;return e instanceof vr?(i=co.traceCreation(e.ctor),n=this._createInstance(e.ctor,e.staticArguments.concat(t),i)):(i=co.traceCreation(e),n=this._createInstance(e,t,i)),i.stop(),n}_createInstance(e,t=[],i){const n=Po.getServiceDependencies(e).sort((a,l)=>a.index-l.index),s=[];for(const a of n){const l=this._getOrCreateServiceInstance(a.id,i);l||this._throwIfStrict(`[createInstance] ${e.name} depends on UNKNOWN service ${a.id}.`,!1),s.push(l)}const r=n.length>0?n[0].index:t.length;if(t.length!==r){console.trace(`[createInstance] First service dependency of ${e.name} at position ${r+1} conflicts with ${t.length} static arguments`);const a=r-t.length;a>0?t=t.concat(new Array(a)):t=t.slice(0,r)}return new e(...t,...s)}_setServiceInstance(e,t){if(this._services.get(e)instanceof vr)this._services.set(e,t);else if(this._parent)this._parent._setServiceInstance(e,t);else throw new Error(\"illegalState - setting UNKNOWN service instance\")}_getServiceInstanceOrDescriptor(e){const t=this._services.get(e);return!t&&this._parent?this._parent._getServiceInstanceOrDescriptor(e):t}_getOrCreateServiceInstance(e,t){const i=this._getServiceInstanceOrDescriptor(e);return i instanceof vr?this._safeCreateAndCacheServiceInstance(e,i,t.branch(e,!0)):(t.branch(e,!1),i)}_safeCreateAndCacheServiceInstance(e,t,i){if(this._activeInstantiations.has(e))throw new Error(`illegal state - RECURSIVELY instantiating service '${e}'`);this._activeInstantiations.add(e);try{return this._createAndCacheServiceInstance(e,t,i)}finally{this._activeInstantiations.delete(e)}}_createAndCacheServiceInstance(e,t,i){const n=new pce(a=>a.id.toString());let s=0;const r=[{id:e,desc:t,_trace:i}];for(;r.length;){const a=r.pop();if(n.lookupOrInsertNode(a),s++>1e3)throw new VR(n);for(const l of Po.getServiceDependencies(a.desc.ctor)){const c=this._getServiceInstanceOrDescriptor(l.id);if(c||this._throwIfStrict(`[createInstance] ${e} depends on ${l.id} which is NOT registered.`,!0),c instanceof vr){const d={id:l.id,desc:c,_trace:a._trace.branch(l.id,!0)};n.insertEdge(a,d),r.push(d)}}}for(;;){const a=n.roots();if(a.length===0){if(!n.isEmpty())throw new VR(n);break}for(const{data:l}of a){if(this._getServiceInstanceOrDescriptor(l.id)instanceof vr){const d=this._createServiceInstanceWithOwner(l.id,l.desc.ctor,l.desc.staticArguments,l.desc.supportsDelayedInstantiation,l._trace);this._setServiceInstance(l.id,d)}n.removeNode(l)}}return this._getServiceInstanceOrDescriptor(e)}_createServiceInstanceWithOwner(e,t,i=[],n,s){if(this._services.get(e)instanceof vr)return this._createServiceInstance(t,i,n,s);if(this._parent)return this._parent._createServiceInstanceWithOwner(e,t,i,n,s);throw new Error(`illegalState - creating UNKNOWN service instance ${t.name}`)}_createServiceInstance(e,t=[],i,n){if(i){const s=new ql(()=>this._createInstance(e,t,n));return new Proxy(Object.create(null),{get(r,a){if(a in r)return r[a];const l=s.value;let c=l[a];return typeof c!=\"function\"||(c=c.bind(l),r[a]=c),c},set(r,a,l){return s.value[a]=l,!0}})}else return this._createInstance(e,t,n)}_throwIfStrict(e,t){if(t&&console.warn(e),this._strict)throw new Error(e)}}class co{constructor(e,t){this.type=e,this.name=t,this._start=Date.now(),this._dep=[]}static traceInvocation(e){return co._None}static traceCreation(e){return co._None}branch(e,t){const i=new co(2,e.toString());return this._dep.push([e,t,i]),i}stop(){const e=Date.now()-this._start;co._totals+=e;let t=!1;function i(s,r){const a=[],l=new Array(s+1).join(\"\t\");for(const[c,d,h]of r._dep)if(d&&h){t=!0,a.push(`${l}CREATES -> ${c}`);const u=i(s+1,h);u&&a.push(u)}else a.push(`${l}uses -> ${c}`);return a.join(`\n`)}const n=[`${this.type===0?\"CREATE\":\"CALL\"} ${this.name}`,`${i(1,this)}`,`DONE, took ${e.toFixed(2)}ms (grand total ${co._totals.toFixed(2)}ms)`];(e>2||t)&&console.log(n.join(`\n`))}}co._None=new class extends co{constructor(){super(-1,null)}stop(){}branch(){return this}};co._totals=0;class mce{constructor(){this._byResource=new hn,this._byOwner=new Map}set(e,t,i){let n=this._byResource.get(e);n||(n=new Map,this._byResource.set(e,n)),n.set(t,i);let s=this._byOwner.get(t);s||(s=new hn,this._byOwner.set(t,s)),s.set(e,i)}get(e,t){const i=this._byResource.get(e);return i==null?void 0:i.get(t)}delete(e,t){let i=!1,n=!1;const s=this._byResource.get(e);s&&(i=s.delete(t));const r=this._byOwner.get(t);if(r&&(n=r.delete(e)),i!==n)throw new Error(\"illegal state\");return i&&n}values(e){var t,i,n,s;return typeof e==\"string\"?(i=(t=this._byOwner.get(e))===null||t===void 0?void 0:t.values())!==null&&i!==void 0?i:Ue.empty():me.isUri(e)?(s=(n=this._byResource.get(e))===null||n===void 0?void 0:n.values())!==null&&s!==void 0?s:Ue.empty():Ue.map(Ue.concat(...this._byOwner.values()),r=>r[1])}}class _ce{constructor(e){this.errors=0,this.infos=0,this.warnings=0,this.unknowns=0,this._data=new hn,this._service=e,this._subscription=e.onMarkerChanged(this._update,this)}dispose(){this._subscription.dispose()}_update(e){for(const t of e){const i=this._data.get(t);i&&this._substract(i);const n=this._resourceStats(t);this._add(n),this._data.set(t,n)}}_resourceStats(e){const t={errors:0,warnings:0,infos:0,unknowns:0};if(e.scheme===Ne.inMemory||e.scheme===Ne.walkThrough||e.scheme===Ne.walkThroughSnippet||e.scheme===Ne.vscodeSourceControl)return t;for(const{severity:i}of this._service.read({resource:e}))i===Ft.Error?t.errors+=1:i===Ft.Warning?t.warnings+=1:i===Ft.Info?t.infos+=1:t.unknowns+=1;return t}_substract(e){this.errors-=e.errors,this.warnings-=e.warnings,this.infos-=e.infos,this.unknowns-=e.unknowns}_add(e){this.errors+=e.errors,this.warnings+=e.warnings,this.infos+=e.infos,this.unknowns+=e.unknowns}}class xl{constructor(){this._onMarkerChanged=new X8({delay:0,merge:xl._merge}),this.onMarkerChanged=this._onMarkerChanged.event,this._data=new mce,this._stats=new _ce(this)}dispose(){this._stats.dispose(),this._onMarkerChanged.dispose()}remove(e,t){for(const i of t||[])this.changeOne(e,i,[])}changeOne(e,t,i){if(pP(i))this._data.delete(t,e)&&this._onMarkerChanged.fire([t]);else{const n=[];for(const s of i){const r=xl._toMarker(e,t,s);r&&n.push(r)}this._data.set(t,e,n),this._onMarkerChanged.fire([t])}}static _toMarker(e,t,i){let{code:n,severity:s,message:r,source:a,startLineNumber:l,startColumn:c,endLineNumber:d,endColumn:h,relatedInformation:u,tags:g}=i;if(!!r)return l=l>0?l:1,c=c>0?c:1,d=d>=l?d:l,h=h>0?h:c,{resource:t,owner:e,code:n,severity:s,message:r,source:a,startLineNumber:l,startColumn:c,endLineNumber:d,endColumn:h,relatedInformation:u,tags:g}}changeAll(e,t){const i=[],n=this._data.values(e);if(n)for(const s of n){const r=Ue.first(s);r&&(i.push(r.resource),this._data.delete(r.resource,e))}if(en(t)){const s=new hn;for(const{resource:r,marker:a}of t){const l=xl._toMarker(e,r,a);if(!l)continue;const c=s.get(r);c?c.push(l):(s.set(r,[l]),i.push(r))}for(const[r,a]of s)this._data.set(r,e,a)}i.length>0&&this._onMarkerChanged.fire(i)}read(e=Object.create(null)){let{owner:t,resource:i,severities:n,take:s}=e;if((!s||s<0)&&(s=-1),t&&i){const r=this._data.get(i,t);if(r){const a=[];for(const l of r)if(xl._accept(l,n)){const c=a.push(l);if(s>0&&c===s)break}return a}else return[]}else if(!t&&!i){const r=[];for(const a of this._data.values())for(const l of a)if(xl._accept(l,n)){const c=r.push(l);if(s>0&&c===s)return r}return r}else{const r=this._data.values(i!=null?i:t),a=[];for(const l of r)for(const c of l)if(xl._accept(c,n)){const d=a.push(c);if(s>0&&d===s)return a}return a}}static _accept(e,t){return t===void 0||(t&e.severity)===e.severity}static _merge(e){const t=new hn;for(const i of e)for(const n of i)t.set(n,!0);return Array.from(t.keys())}}function h9(o,e,t,i,n,s){if(Array.isArray(o)){let r=0;for(const a of o){const l=h9(a,e,t,i,n,s);if(l===10)return l;l>r&&(r=l)}return r}else{if(typeof o==\"string\")return i?o===\"*\"?5:o===t?10:0:0;if(o){const{language:r,pattern:a,scheme:l,hasAccessToAllModels:c,notebookType:d}=o;if(!i&&!c)return 0;d&&n&&(e=n);let h=0;if(l)if(l===e.scheme)h=10;else if(l===\"*\")h=5;else return 0;if(r)if(r===t)h=10;else if(r===\"*\")h=Math.max(h,5);else return 0;if(d)if(d===s)h=10;else if(d===\"*\"&&s!==void 0)h=Math.max(h,5);else return 0;if(a){let u;if(typeof a==\"string\"?u=a:u=Object.assign(Object.assign({},a),{base:IO(a.base)}),u===e.fsPath||rle(u,e.fsPath))h=10;else return 0}return h}else return 0}}function u9(o){return typeof o==\"string\"?!1:Array.isArray(o)?o.every(u9):!!o.exclusive}class HR{constructor(e,t,i,n){this.uri=e,this.languageId=t,this.notebookUri=i,this.notebookType=n}equals(e){var t,i;return this.notebookType===e.notebookType&&this.languageId===e.languageId&&this.uri.toString()===e.uri.toString()&&((t=this.notebookUri)===null||t===void 0?void 0:t.toString())===((i=e.notebookUri)===null||i===void 0?void 0:i.toString())}}class Wt{constructor(e){this._notebookInfoResolver=e,this._clock=0,this._entries=[],this._onDidChange=new O,this.onDidChange=this._onDidChange.event}register(e,t){let i={selector:e,provider:t,_score:-1,_time:this._clock++};return this._entries.push(i),this._lastCandidate=void 0,this._onDidChange.fire(this._entries.length),ze(()=>{if(i){const n=this._entries.indexOf(i);n>=0&&(this._entries.splice(n,1),this._lastCandidate=void 0,this._onDidChange.fire(this._entries.length),i=void 0)}})}has(e){return this.all(e).length>0}all(e){if(!e)return[];this._updateScores(e);const t=[];for(const i of this._entries)i._score>0&&t.push(i.provider);return t}ordered(e){const t=[];return this._orderedForEach(e,i=>t.push(i.provider)),t}orderedGroups(e){const t=[];let i,n;return this._orderedForEach(e,s=>{i&&n===s._score?i.push(s.provider):(n=s._score,i=[s.provider],t.push(i))}),t}_orderedForEach(e,t){this._updateScores(e);for(const i of this._entries)i._score>0&&t(i)}_updateScores(e){var t,i;const n=(t=this._notebookInfoResolver)===null||t===void 0?void 0:t.call(this,e.uri),s=n?new HR(e.uri,e.getLanguageId(),n.uri,n.type):new HR(e.uri,e.getLanguageId(),void 0,void 0);if(!(!((i=this._lastCandidate)===null||i===void 0)&&i.equals(s))){this._lastCandidate=s;for(const r of this._entries)if(r._score=h9(r.selector,s.uri,s.languageId,X$(e),s.notebookUri,s.notebookType),u9(r.selector)&&r._score>0){for(const a of this._entries)a._score=0;r._score=1e3;break}this._entries.sort(Wt._compareByScoreAndTime)}}static _compareByScoreAndTime(e,t){return e._score<t._score?1:e._score>t._score?-1:e._time<t._time?1:e._time>t._time?-1:0}}class bce{constructor(){this.referenceProvider=new Wt(this._score.bind(this)),this.renameProvider=new Wt(this._score.bind(this)),this.codeActionProvider=new Wt(this._score.bind(this)),this.definitionProvider=new Wt(this._score.bind(this)),this.typeDefinitionProvider=new Wt(this._score.bind(this)),this.declarationProvider=new Wt(this._score.bind(this)),this.implementationProvider=new Wt(this._score.bind(this)),this.documentSymbolProvider=new Wt(this._score.bind(this)),this.inlayHintsProvider=new Wt(this._score.bind(this)),this.colorProvider=new Wt(this._score.bind(this)),this.codeLensProvider=new Wt(this._score.bind(this)),this.documentFormattingEditProvider=new Wt(this._score.bind(this)),this.documentRangeFormattingEditProvider=new Wt(this._score.bind(this)),this.onTypeFormattingEditProvider=new Wt(this._score.bind(this)),this.signatureHelpProvider=new Wt(this._score.bind(this)),this.hoverProvider=new Wt(this._score.bind(this)),this.documentHighlightProvider=new Wt(this._score.bind(this)),this.selectionRangeProvider=new Wt(this._score.bind(this)),this.foldingRangeProvider=new Wt(this._score.bind(this)),this.linkProvider=new Wt(this._score.bind(this)),this.inlineCompletionsProvider=new Wt(this._score.bind(this)),this.completionProvider=new Wt(this._score.bind(this)),this.linkedEditingRangeProvider=new Wt(this._score.bind(this)),this.documentRangeSemanticTokensProvider=new Wt(this._score.bind(this)),this.documentSemanticTokensProvider=new Wt(this._score.bind(this)),this.documentOnDropEditProvider=new Wt(this._score.bind(this)),this.documentPasteEditProvider=new Wt(this._score.bind(this))}_score(e){var t;return(t=this._notebookTypeResolver)===null||t===void 0?void 0:t.call(this,e)}}Xe(ue,bce,!0);class vce extends Zn{constructor(e={}){const t=di.as(al.Configuration).getConfigurationProperties(),i=Object.keys(t),n=Object.create(null),s=[];for(const r in t){const a=e[r],l=a!==void 0?a:t[r].default;sI(n,r,l,c=>console.error(`Conflict in default settings: ${c}`))}for(const r of Object.keys(n))Rp.test(r)&&s.push({identifiers:NP(r),keys:Object.keys(n[r]),contents:kP(n[r],a=>console.error(`Conflict in default settings file: ${a}`))});super(n,i,s)}}var Ac=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},dn=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}},g9=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};class Cce{constructor(e){this.disposed=!1,this.model=e,this._onWillDispose=new O}get textEditorModel(){return this.model}dispose(){this.disposed=!0,this._onWillDispose.fire()}}let lx=class{constructor(e){this.modelService=e}createModelReference(e){const t=this.modelService.getModel(e);return t?Promise.resolve(new F8(new Cce(t))):Promise.reject(new Error(\"Model not found\"))}};lx=Ac([dn(0,Bt)],lx);class lw{show(){return lw.NULL_PROGRESS_RUNNER}showWhile(e,t){return g9(this,void 0,void 0,function*(){yield e})}}lw.NULL_PROGRESS_RUNNER={done:()=>{},total:()=>{},worked:()=>{}};class wce{withProgress(e,t,i){return t({report:()=>{}})}}class Sce{confirm(e){return this.doConfirm(e).then(t=>({confirmed:t,checkboxChecked:!1}))}doConfirm(e){let t=e.message;return e.detail&&(t=t+`\n\n`+e.detail),Promise.resolve(window.confirm(t))}show(e,t,i,n){return Promise.resolve({choice:0})}}class cw{info(e){return this.notify({severity:Vt.Info,message:e})}warn(e){return this.notify({severity:Vt.Warning,message:e})}error(e){return this.notify({severity:Vt.Error,message:e})}notify(e){switch(e.severity){case Vt.Error:console.error(e.message);break;case Vt.Warning:console.warn(e.message);break;default:console.log(e.message);break}return cw.NO_OP}status(e,t){return z.None}}cw.NO_OP=new Rq;let cx=class{constructor(e){this._onWillExecuteCommand=new O,this._onDidExecuteCommand=new O,this.onWillExecuteCommand=this._onWillExecuteCommand.event,this.onDidExecuteCommand=this._onDidExecuteCommand.event,this._instantiationService=e}executeCommand(e,...t){const i=Ye.getCommand(e);if(!i)return Promise.reject(new Error(`command '${e}' not found`));try{this._onWillExecuteCommand.fire({commandId:e,args:t});const n=this._instantiationService.invokeFunction.apply(this._instantiationService,[i.handler,...t]);return this._onDidExecuteCommand.fire({commandId:e,args:t}),Promise.resolve(n)}catch(n){return Promise.reject(n)}}};cx=Ac([dn(0,Re)],cx);let cC=class extends $ae{constructor(e,t,i,n,s,r){super(e,t,i,n,s),this._cachedResolver=null,this._dynamicKeybindings=[],this._domNodeListeners=[];const a=g=>{const f=new ee;f.add(q(g,le.KEY_DOWN,_=>{const b=new Mt(_);this._dispatch(b,b.target)&&(b.preventDefault(),b.stopPropagation())})),f.add(q(g,le.KEY_UP,_=>{const b=new Mt(_);this._singleModifierDispatch(b,b.target)&&b.preventDefault()})),this._domNodeListeners.push(new yce(g,f))},l=g=>{for(let f=0;f<this._domNodeListeners.length;f++){const _=this._domNodeListeners[f];_.domNode===g&&(this._domNodeListeners.splice(f,1),_.dispose())}},c=g=>{g.getOption(56)||a(g.getContainerDomNode())},d=g=>{g.getOption(56)||l(g.getContainerDomNode())};this._register(r.onCodeEditorAdd(c)),this._register(r.onCodeEditorRemove(d)),r.listCodeEditors().forEach(c);const h=g=>{a(g.getContainerDomNode())},u=g=>{l(g.getContainerDomNode())};this._register(r.onDiffEditorAdd(h)),this._register(r.onDiffEditorRemove(u)),r.listDiffEditors().forEach(h)}addDynamicKeybinding(e,t,i,n){const s=_y(t,Os),r=new ee;return s&&(this._dynamicKeybindings.push({keybinding:s.parts,command:e,when:n,weight1:1e3,weight2:0,extensionId:null,isBuiltinExtension:!1}),r.add(ze(()=>{for(let a=0;a<this._dynamicKeybindings.length;a++)if(this._dynamicKeybindings[a].command===e){this._dynamicKeybindings.splice(a,1),this.updateResolver();return}}))),r.add(Ye.registerCommand(e,i)),this.updateResolver(),r}updateResolver(){this._cachedResolver=null,this._onDidUpdateKeybindings.fire()}_getResolver(){if(!this._cachedResolver){const e=this._toNormalizedKeybindingItems(ls.getDefaultKeybindings(),!0),t=this._toNormalizedKeybindingItems(this._dynamicKeybindings,!1);this._cachedResolver=new wp(e,t,i=>this._log(i))}return this._cachedResolver}_documentHasFocus(){return document.hasFocus()}_toNormalizedKeybindingItems(e,t){const i=[];let n=0;for(const s of e){const r=s.when||void 0,a=s.keybinding;if(!a)i[n++]=new pR(void 0,s.command,s.commandArgs,r,t,null,!1);else{const l=Fm.resolveUserBinding(a,Os);for(const c of l)i[n++]=new pR(c,s.command,s.commandArgs,r,t,null,!1)}}return i}resolveKeyboardEvent(e){const t=new Td(e.ctrlKey,e.shiftKey,e.altKey,e.metaKey,e.keyCode).toChord();return new Fm(t,Os)}};cC=Ac([dn(0,xe),dn(1,Ci),dn(2,rl),dn(3,gi),dn(4,Co),dn(5,dt)],cC);class yce extends z{constructor(e,t){super(),this.domNode=e,this._register(t)}}function zR(o){return o&&typeof o==\"object\"&&(!o.overrideIdentifier||typeof o.overrideIdentifier==\"string\")&&(!o.resource||o.resource instanceof me)}class f9{constructor(){this._onDidChangeConfiguration=new O,this.onDidChangeConfiguration=this._onDidChangeConfiguration.event,this._configuration=new nw(new vce,new Zn,new Zn,new Zn)}getValue(e,t){const i=typeof e==\"string\"?e:void 0,n=zR(e)?e:zR(t)?t:{};return this._configuration.getValue(i,n,void 0)}updateValues(e){const t={data:this._configuration.toData()},i=[];for(const n of e){const[s,r]=n;this.getValue(s)!==r&&(this._configuration.updateValue(s,r),i.push(s))}if(i.length>0){const n=new zae({keys:i,overrides:[]},t,this._configuration);n.source=8,n.sourceConfig=null,this._onDidChangeConfiguration.fire(n)}return Promise.resolve()}updateValue(e,t,i,n){return this.updateValues([[e,t]])}inspect(e,t={}){return this._configuration.inspect(e,t,void 0)}}let dx=class{constructor(e){this.configurationService=e,this._onDidChangeConfiguration=new O,this.configurationService.onDidChangeConfiguration(t=>{this._onDidChangeConfiguration.fire({affectedKeys:t.affectedKeys,affectsConfiguration:(i,n)=>t.affectsConfiguration(n)})})}getValue(e,t,i){const s=(B.isIPosition(t)?t:null)?typeof i==\"string\"?i:void 0:typeof t==\"string\"?t:void 0;return typeof s==\"undefined\"?this.configurationService.getValue():this.configurationService.getValue(s)}};dx=Ac([dn(0,ot)],dx);let hx=class{constructor(e){this.configurationService=e}getEOL(e,t){const i=this.configurationService.getValue(\"files.eol\",{overrideIdentifier:t,resource:e});return i&&typeof i==\"string\"&&i!==\"auto\"?i:sn||Ze?`\n`:`\\r\n`}};hx=Ac([dn(0,ot)],hx);class Lce{publicLog(e,t){return Promise.resolve(void 0)}publicLog2(e,t){return this.publicLog(e,t)}}class zm{constructor(){const e=me.from({scheme:zm.SCHEME,authority:\"model\",path:\"/\"});this.workspace={id:\"4064f6ec-cb38-4ad0-af64-ee6467e63c82\",folders:[new YJ({uri:e,name:\"\",index:0})]}}getWorkspace(){return this.workspace}getWorkspaceFolder(e){return e&&e.scheme===zm.SCHEME?this.workspace.folders[0]:null}}zm.SCHEME=\"inmemory\";function dC(o,e,t){if(!e||!(o instanceof f9))return;const i=[];Object.keys(e).forEach(n=>{EY(n)&&i.push([`editor.${n}`,e[n]]),t&&NY(n)&&i.push([`diffEditor.${n}`,e[n]])}),i.length>0&&o.updateValues(i)}let ux=class{constructor(e){this._modelService=e}hasPreviewHandler(){return!1}apply(e,t){return g9(this,void 0,void 0,function*(){const i=new Map;for(const r of e){if(!(r instanceof Sd))throw new Error(\"bad edit - only text edits are supported\");const a=this._modelService.getModel(r.resource);if(!a)throw new Error(\"bad edit - model not found\");if(typeof r.versionId==\"number\"&&a.getVersionId()!==r.versionId)throw new Error(\"bad state - model changed in the meantime\");let l=i.get(a);l||(l=[],i.set(a,l)),l.push(Pt.replaceMove(L.lift(r.textEdit.range),r.textEdit.text))}let n=0,s=0;for(const[r,a]of i)r.pushStackElement(),r.pushEditOperations([],a,()=>[]),r.pushStackElement(),s+=1,n+=a.length;return{ariaSummary:tg(Nk.bulkEditServiceSummary,n,s)}})}};ux=Ac([dn(0,Bt)],ux);class Dce{getUriLabel(e,t){return e.scheme===\"file\"?e.fsPath:e.path}getUriBasenameLabel(e){return Ys(e)}}let gx=class extends Hk{constructor(e,t){super(e),this._codeEditorService=t}showContextView(e,t,i){if(!t){const n=this._codeEditorService.getFocusedCodeEditor()||this._codeEditorService.getActiveCodeEditor();n&&(t=n.getContainerDomNode())}return super.showContextView(e,t,i)}};gx=Ac([dn(0,tf),dn(1,dt)],gx);class kce{constructor(){this._neverEmitter=new O,this.onDidChangeTrust=this._neverEmitter.event}isWorkspaceTrusted(){return!0}}class xce extends Wm{constructor(){super()}}class Ice extends QB{constructor(){super(new XB)}}let fx=class extends $k{constructor(e,t,i,n,s){super(e,t,i,n,s),this.configure({blockMouse:!1})}};fx=Ac([dn(0,rl),dn(1,gi),dn(2,Ch),dn(3,rn),dn(4,vt)],fx);Xe(ot,f9);Xe(gN,dx);Xe(b7,hx);Xe(bm,zm);Xe(bg,Dce);Xe(rl,Lce);Xe(CN,Sce);Xe(gi,cw);Xe(ta,xl);Xe(Ht,xce);Xe(yo,tce);Xe(Co,Ice);Xe(Bt,Jv);Xe(oI,Gk);Xe(xe,ax);Xe(C5,wce);Xe(kc,lw);Xe(ia,PY);Xe(Qs,Pk);Xe(n_,ux);Xe(D7,kce);Xe($n,lx);Xe(ll,nx);Xe(eo,RL);Xe(Ci,cx);Xe(rn,cC);Xe(c_,tx);Xe(Ch,gx);Xe(So,qk);Xe(dl,rx);Xe(cl,fx);Xe(fh,sx);var Le;(function(o){const e=new c1;for(const[r,a]of kT())e.set(r,a);const t=new PN(e,!0);e.set(Re,t);function i(r){const a=e.get(r);if(!a)throw new Error(\"Missing service \"+r);return a instanceof vr?t.invokeFunction(l=>l.get(r)):a}o.get=i;let n=!1;function s(r){if(n)return t;n=!0;for(const[a,l]of kT())e.get(a)||e.set(a,l);for(const a in r)if(r.hasOwnProperty(a)){const l=qe(a);e.get(l)instanceof vr&&e.set(l,r[a])}return t}o.initialize=s})(Le||(Le={}));var FN=globalThis&&globalThis.__decorate||function(o,e,t,i){var n=arguments.length,s=n<3?e:i===null?i=Object.getOwnPropertyDescriptor(e,t):i,r;if(typeof Reflect==\"object\"&&typeof Reflect.decorate==\"function\")s=Reflect.decorate(o,e,t,i);else for(var a=o.length-1;a>=0;a--)(r=o[a])&&(s=(n<3?r(s):n>3?r(e,t,s):r(e,t))||s);return n>3&&s&&Object.defineProperty(e,t,s),s},Tt=globalThis&&globalThis.__param||function(o,e){return function(t,i){e(t,i,o)}};let Ece=0,UR=!1;function Nce(o){if(!o){if(UR)return;UR=!0}SB(o||document.body)}let hC=class extends fg{constructor(e,t,i,n,s,r,a,l,c,d,h,u){const g=Object.assign({},t);g.ariaLabel=g.ariaLabel||eC.editorViewAccessibleLabel,g.ariaLabel=g.ariaLabel+\";\"+eC.accessibilityHelpMessage,super(e,g,{},i,n,s,r,l,c,d,h,u),a instanceof cC?this._standaloneKeybindingService=a:this._standaloneKeybindingService=null,Nce(g.ariaContainerElement)}addCommand(e,t,i){if(!this._standaloneKeybindingService)return console.warn(\"Cannot add command because the editor is configured with an unrecognized KeybindingService\"),null;const n=\"DYNAMIC_\"+ ++Ece,s=re.deserialize(i);return this._standaloneKeybindingService.addDynamicKeybinding(n,e,t,s),n}createContextKey(e,t){return this._contextKeyService.createKey(e,t)}addAction(e){if(typeof e.id!=\"string\"||typeof e.label!=\"string\"||typeof e.run!=\"function\")throw new Error(\"Invalid action descriptor, `id`, `label` and `run` are required properties!\");if(!this._standaloneKeybindingService)return console.warn(\"Cannot add keybinding because the editor is configured with an unrecognized KeybindingService\"),z.None;const t=e.id,i=e.label,n=re.and(re.equals(\"editorId\",this.getId()),re.deserialize(e.precondition)),s=e.keybindings,r=re.and(n,re.deserialize(e.keybindingContext)),a=e.contextMenuGroupId||null,l=e.contextMenuOrder||0,c=(g,...f)=>Promise.resolve(e.run(this,...f)),d=new ee,h=this.getId()+\":\"+t;if(d.add(Ye.registerCommand(h,c)),a){const g={command:{id:h,title:i},when:n,group:a,order:l};d.add(po.appendMenuItem(A.EditorContext,g))}if(Array.isArray(s))for(const g of s)d.add(this._standaloneKeybindingService.addDynamicKeybinding(h,g,c,r));const u=new M4(h,i,i,n,c,this._contextKeyService);return this._actions[t]=u,d.add(ze(()=>{delete this._actions[t]})),d}_triggerCommand(e,t){if(this._codeEditorService instanceof nC)try{this._codeEditorService.setActiveCodeEditor(this),super._triggerCommand(e,t)}finally{this._codeEditorService.setActiveCodeEditor(null)}else super._triggerCommand(e,t)}};hC=FN([Tt(2,Re),Tt(3,dt),Tt(4,Ci),Tt(5,xe),Tt(6,rn),Tt(7,vt),Tt(8,gi),Tt(9,ll),Tt(10,ti),Tt(11,ue)],hC);let px=class extends hC{constructor(e,t,i,n,s,r,a,l,c,d,h,u,g,f,_){const b=Object.assign({},t);dC(d,b,!1);const v=l.registerEditorContainer(e);typeof b.theme==\"string\"&&l.setTheme(b.theme),typeof b.autoDetectHighContrast!=\"undefined\"&&l.setAutoDetectHighContrast(Boolean(b.autoDetectHighContrast));const C=b.model;delete b.model,super(e,b,i,n,s,r,a,l,c,h,f,_),this._configurationService=d,this._standaloneThemeService=l,this._register(v);let w;if(typeof C==\"undefined\"){const S=g.getLanguageIdByMimeType(b.language)||b.language||Us;w=p9(u,g,b.value||\"\",S,void 0),this._ownsModel=!0}else w=C,this._ownsModel=!1;if(this._attachModel(w),w){const S={oldModelUrl:null,newModelUrl:w.uri};this._onDidChangeModel.fire(S)}}dispose(){super.dispose()}updateOptions(e){dC(this._configurationService,e,!1),typeof e.theme==\"string\"&&this._standaloneThemeService.setTheme(e.theme),typeof e.autoDetectHighContrast!=\"undefined\"&&this._standaloneThemeService.setAutoDetectHighContrast(Boolean(e.autoDetectHighContrast)),super.updateOptions(e)}_postDetachModelCleanup(e){super._postDetachModelCleanup(e),e&&this._ownsModel&&(e.dispose(),this._ownsModel=!1)}};px=FN([Tt(2,Re),Tt(3,dt),Tt(4,Ci),Tt(5,xe),Tt(6,rn),Tt(7,yo),Tt(8,gi),Tt(9,ot),Tt(10,ll),Tt(11,Bt),Tt(12,Ht),Tt(13,ti),Tt(14,ue)],px);let mx=class extends gc{constructor(e,t,i,n,s,r,a,l,c,d,h,u){const g=Object.assign({},t);dC(c,g,!0);const f=a.registerEditorContainer(e);typeof g.theme==\"string\"&&a.setTheme(g.theme),typeof g.autoDetectHighContrast!=\"undefined\"&&a.setAutoDetectHighContrast(Boolean(g.autoDetectHighContrast)),super(e,g,{},u,s,n,i,r,a,l,d,h),this._configurationService=c,this._standaloneThemeService=a,this._register(f)}dispose(){super.dispose()}updateOptions(e){dC(this._configurationService,e,!0),typeof e.theme==\"string\"&&this._standaloneThemeService.setTheme(e.theme),typeof e.autoDetectHighContrast!=\"undefined\"&&this._standaloneThemeService.setAutoDetectHighContrast(Boolean(e.autoDetectHighContrast)),super.updateOptions(e)}_createInnerEditor(e,t,i){return e.createInstance(hC,t,i)}getOriginalEditor(){return super.getOriginalEditor()}getModifiedEditor(){return super.getModifiedEditor()}addCommand(e,t,i){return this.getModifiedEditor().addCommand(e,t,i)}createContextKey(e,t){return this.getModifiedEditor().createContextKey(e,t)}addAction(e){return this.getModifiedEditor().addAction(e)}};mx=FN([Tt(2,Re),Tt(3,xe),Tt(4,Qs),Tt(5,dt),Tt(6,yo),Tt(7,gi),Tt(8,ot),Tt(9,cl),Tt(10,kc),Tt(11,dl)],mx);function p9(o,e,t,i,n){if(t=t||\"\",!i){const s=t.indexOf(`\n`);let r=t;return s!==-1&&(r=t.substring(0,s)),$R(o,t,e.createByFilepathOrFirstLine(n||null,r),n)}return $R(o,t,e.createById(i),n)}function $R(o,e,t,i){return o.createModel(e,t,i)}function Tce(o,e,t){return Le.initialize(t||{}).createInstance(px,o,e)}function Mce(o){return Le.get(dt).onCodeEditorAdd(t=>{o(t)})}function Ace(o){return Le.get(dt).onDiffEditorAdd(t=>{o(t)})}function Rce(){return Le.get(dt).listCodeEditors()}function Oce(){return Le.get(dt).listDiffEditors()}function Pce(o,e,t){return Le.initialize(t||{}).createInstance(mx,o,e)}function Fce(o,e){return new aZ(o,e)}function Bce(o,e,t){const i=Le.get(Ht),n=i.getLanguageIdByMimeType(e)||e;return p9(Le.get(Bt),i,o,n,t)}function Wce(o,e){const t=Le.get(Ht);Le.get(Bt).setMode(o,t.createById(e))}function Vce(o,e,t){o&&Le.get(ta).changeOne(e,o.uri,t)}function Hce(o){Le.get(ta).changeAll(o,[])}function zce(o){return Le.get(ta).read(o)}function Uce(o){return Le.get(ta).onMarkerChanged(o)}function $ce(o){return Le.get(Bt).getModel(o)}function jce(){return Le.get(Bt).getModels()}function Kce(o){return Le.get(Bt).onModelAdded(o)}function qce(o){return Le.get(Bt).onModelRemoved(o)}function Gce(o){return Le.get(Bt).onModelLanguageChanged(t=>{o({model:t.model,oldLanguage:t.oldLanguageId})})}function Zce(o){return Sae(Le.get(Bt),Le.get(ti),o)}function Yce(o,e){const t=Le.get(Ht),i=Le.get(yo);return i.registerEditorContainer(o),kN.colorizeElement(i,t,o,e)}function Xce(o,e,t){const i=Le.get(Ht);return Le.get(yo).registerEditorContainer(document.body),kN.colorize(i,o,e,t)}function Qce(o,e,t=4){return Le.get(yo).registerEditorContainer(document.body),kN.colorizeModelLine(o,e,t)}function Jce(o){const e=Jt.get(o);return e||{getInitialState:()=>Jp,tokenize:(t,i,n)=>Y4(o,n)}}function ede(o,e){Jt.getOrCreate(e);const t=Jce(e),i=Ur(o),n=[];let s=t.getInitialState();for(let r=0,a=i.length;r<a;r++){const l=i[r],c=t.tokenize(l,!0,s);n[r]=c.tokens,s=c.endState}return n}function tde(o,e){Le.get(yo).defineTheme(o,e)}function ide(o){Le.get(yo).setTheme(o)}function nde(){By.clearAllFontInfos()}function sde(o,e){return Ye.registerCommand({id:o,handler:e})}function ode(){return{create:Tce,getEditors:Rce,getDiffEditors:Oce,onDidCreateEditor:Mce,onDidCreateDiffEditor:Ace,createDiffEditor:Pce,createDiffNavigator:Fce,createModel:Bce,setModelLanguage:Wce,setModelMarkers:Vce,getModelMarkers:zce,removeAllMarkers:Hce,onDidChangeMarkers:Uce,getModels:jce,getModel:$ce,onDidCreateModel:Kce,onWillDisposeModel:qce,onDidChangeModelLanguage:Gce,createWebWorker:Zce,colorizeElement:Yce,colorize:Xce,colorizeModelLine:Qce,tokenize:ede,defineTheme:tde,setTheme:ide,remeasureFonts:nde,registerCommand:sde,AccessibilitySupport:OD,ContentWidgetPositionPreference:VD,CursorChangeReason:HD,DefaultEndOfLine:zD,EditorAutoIndentStrategy:$D,EditorOption:jD,EndOfLinePreference:KD,EndOfLineSequence:qD,MinimapPosition:tk,MouseTargetType:ik,OverlayWidgetPositionPreference:nk,OverviewRulerLane:sk,RenderLineNumbersType:rk,RenderMinimap:ak,ScrollbarVisibility:ck,ScrollType:lk,TextEditorCursorBlinkingStyle:fk,TextEditorCursorStyle:pk,TrackedRangeStickiness:mk,WrappingIndent:_k,InjectedTextCursorStops:ZD,PositionAffinity:ok,ConfigurationChangedEvent:VP,BareFontInfo:bd,FontInfo:Fy,TextModelResolvedOptions:n0,FindMatch:Kp,ApplyUpdateResult:Jf,EditorType:r1,EditorOptions:Jo}}function rde(o,e){if(!e||!Array.isArray(e))return!1;for(const t of e)if(!o(t))return!1;return!0}function qb(o,e){return typeof o==\"boolean\"?o:e}function jR(o,e){return typeof o==\"string\"?o:e}function ade(o){const e={};for(const t of o)e[t]=!0;return e}function KR(o,e=!1){e&&(o=o.map(function(i){return i.toLowerCase()}));const t=ade(o);return e?function(i){return t[i.toLowerCase()]!==void 0&&t.hasOwnProperty(i.toLowerCase())}:function(i){return t[i]!==void 0&&t.hasOwnProperty(i)}}function _x(o,e){e=e.replace(/@@/g,\"\u0001\");let t=0,i;do i=!1,e=e.replace(/@(\\w+)/g,function(s,r){i=!0;let a=\"\";if(typeof o[r]==\"string\")a=o[r];else if(o[r]&&o[r]instanceof RegExp)a=o[r].source;else throw o[r]===void 0?Lt(o,\"language definition does not contain attribute '\"+r+\"', used at: \"+e):Lt(o,\"attribute reference '\"+r+\"' must be a string, used at: \"+e);return iu(a)?\"\":\"(?:\"+a+\")\"}),t++;while(i&&t<5);e=e.replace(/\\x01/g,\"@\");const n=(o.ignoreCase?\"i\":\"\")+(o.unicode?\"u\":\"\");return new RegExp(e,n)}function lde(o,e,t,i){if(i<0)return o;if(i<e.length)return e[i];if(i>=100){i=i-100;const n=t.split(\".\");if(n.unshift(t),i<n.length)return n[i]}return null}function cde(o,e,t,i){let n=-1,s=t,r=t.match(/^\\$(([sS]?)(\\d\\d?)|#)(.*)$/);r&&(r[3]&&(n=parseInt(r[3]),r[2]&&(n=n+100)),s=r[4]);let a=\"~\",l=s;!s||s.length===0?(a=\"!=\",l=\"\"):/^\\w*$/.test(l)?a=\"==\":(r=s.match(/^(@|!@|~|!~|==|!=)(.*)$/),r&&(a=r[1],l=r[2]));let c;if((a===\"~\"||a===\"!~\")&&/^(\\w|\\|)*$/.test(l)){const d=KR(l.split(\"|\"),o.ignoreCase);c=function(h){return a===\"~\"?d(h):!d(h)}}else if(a===\"@\"||a===\"!@\"){const d=o[l];if(!d)throw Lt(o,\"the @ match target '\"+l+\"' is not defined, in rule: \"+e);if(!rde(function(u){return typeof u==\"string\"},d))throw Lt(o,\"the @ match target '\"+l+\"' must be an array of strings, in rule: \"+e);const h=KR(d,o.ignoreCase);c=function(u){return a===\"@\"?h(u):!h(u)}}else if(a===\"~\"||a===\"!~\")if(l.indexOf(\"$\")<0){const d=_x(o,\"^\"+l+\"$\");c=function(h){return a===\"~\"?d.test(h):!d.test(h)}}else c=function(d,h,u,g){return _x(o,\"^\"+Tl(o,l,h,u,g)+\"$\").test(d)};else if(l.indexOf(\"$\")<0){const d=ic(o,l);c=function(h){return a===\"==\"?h===d:h!==d}}else{const d=ic(o,l);c=function(h,u,g,f,_){const b=Tl(o,d,u,g,f);return a===\"==\"?h===b:h!==b}}return n===-1?{name:t,value:i,test:function(d,h,u,g){return c(d,d,h,u,g)}}:{name:t,value:i,test:function(d,h,u,g){const f=lde(d,h,u,n);return c(f||\"\",d,h,u,g)}}}function bx(o,e,t){if(t){if(typeof t==\"string\")return t;if(t.token||t.token===\"\"){if(typeof t.token!=\"string\")throw Lt(o,\"a 'token' attribute must be of type string, in rule: \"+e);{const i={token:t.token};if(t.token.indexOf(\"$\")>=0&&(i.tokenSubst=!0),typeof t.bracket==\"string\")if(t.bracket===\"@open\")i.bracket=1;else if(t.bracket===\"@close\")i.bracket=-1;else throw Lt(o,\"a 'bracket' attribute must be either '@open' or '@close', in rule: \"+e);if(t.next){if(typeof t.next!=\"string\")throw Lt(o,\"the next state must be a string value in rule: \"+e);{let n=t.next;if(!/^(@pop|@push|@popall)$/.test(n)&&(n[0]===\"@\"&&(n=n.substr(1)),n.indexOf(\"$\")<0&&!xae(o,Tl(o,n,\"\",[],\"\"))))throw Lt(o,\"the next state '\"+t.next+\"' is not defined in rule: \"+e);i.next=n}}return typeof t.goBack==\"number\"&&(i.goBack=t.goBack),typeof t.switchTo==\"string\"&&(i.switchTo=t.switchTo),typeof t.log==\"string\"&&(i.log=t.log),typeof t.nextEmbedded==\"string\"&&(i.nextEmbedded=t.nextEmbedded,o.usesEmbedded=!0),i}}else if(Array.isArray(t)){const i=[];for(let n=0,s=t.length;n<s;n++)i[n]=bx(o,e,t[n]);return{group:i}}else if(t.cases){const i=[];for(const s in t.cases)if(t.cases.hasOwnProperty(s)){const r=bx(o,e,t.cases[s]);s===\"@default\"||s===\"@\"||s===\"\"?i.push({test:void 0,value:r,name:s}):s===\"@eos\"?i.push({test:function(a,l,c,d){return d},value:r,name:s}):i.push(cde(o,e,s,r))}const n=o.defaultToken;return{test:function(s,r,a,l){for(const c of i)if(!c.test||c.test(s,r,a,l))return c.value;return n}}}else throw Lt(o,\"an action must be a string, an object with a 'token' or 'cases' attribute, or an array of actions; in rule: \"+e)}else return{token:\"\"}}class dde{constructor(e){this.regex=new RegExp(\"\"),this.action={token:\"\"},this.matchOnlyAtLineStart=!1,this.name=\"\",this.name=e}setRegex(e,t){let i;if(typeof t==\"string\")i=t;else if(t instanceof RegExp)i=t.source;else throw Lt(e,\"rules must start with a match string or regular expression: \"+this.name);this.matchOnlyAtLineStart=i.length>0&&i[0]===\"^\",this.name=this.name+\": \"+i,this.regex=_x(e,\"^(?:\"+(this.matchOnlyAtLineStart?i.substr(1):i)+\")\")}setAction(e,t){this.action=bx(e,this.name,t)}}function m9(o,e){if(!e||typeof e!=\"object\")throw new Error(\"Monarch: expecting a language definition object\");const t={};t.languageId=o,t.includeLF=qb(e.includeLF,!1),t.noThrow=!1,t.maxStack=100,t.start=typeof e.start==\"string\"?e.start:null,t.ignoreCase=qb(e.ignoreCase,!1),t.unicode=qb(e.unicode,!1),t.tokenPostfix=jR(e.tokenPostfix,\".\"+t.languageId),t.defaultToken=jR(e.defaultToken,\"source\"),t.usesEmbedded=!1;const i=e;i.languageId=o,i.includeLF=t.includeLF,i.ignoreCase=t.ignoreCase,i.unicode=t.unicode,i.noThrow=t.noThrow,i.usesEmbedded=t.usesEmbedded,i.stateNames=e.tokenizer,i.defaultToken=t.defaultToken;function n(r,a,l){for(const c of l){let d=c.include;if(d){if(typeof d!=\"string\")throw Lt(t,\"an 'include' attribute must be a string at: \"+r);if(d[0]===\"@\"&&(d=d.substr(1)),!e.tokenizer[d])throw Lt(t,\"include target '\"+d+\"' is not defined at: \"+r);n(r+\".\"+d,a,e.tokenizer[d])}else{const h=new dde(r);if(Array.isArray(c)&&c.length>=1&&c.length<=3)if(h.setRegex(i,c[0]),c.length>=3)if(typeof c[1]==\"string\")h.setAction(i,{token:c[1],next:c[2]});else if(typeof c[1]==\"object\"){const u=c[1];u.next=c[2],h.setAction(i,u)}else throw Lt(t,\"a next state as the last element of a rule can only be given if the action is either an object or a string, at: \"+r);else h.setAction(i,c[1]);else{if(!c.regex)throw Lt(t,\"a rule must either be an array, or an object with a 'regex' or 'include' field at: \"+r);c.name&&typeof c.name==\"string\"&&(h.name=c.name),c.matchOnlyAtStart&&(h.matchOnlyAtLineStart=qb(c.matchOnlyAtLineStart,!1)),h.setRegex(i,c.regex),h.setAction(i,c.action)}a.push(h)}}}if(!e.tokenizer||typeof e.tokenizer!=\"object\")throw Lt(t,\"a language definition must define the 'tokenizer' attribute as an object\");t.tokenizer=[];for(const r in e.tokenizer)if(e.tokenizer.hasOwnProperty(r)){t.start||(t.start=r);const a=e.tokenizer[r];t.tokenizer[r]=new Array,n(\"tokenizer.\"+r,t.tokenizer[r],a)}if(t.usesEmbedded=i.usesEmbedded,e.brackets){if(!Array.isArray(e.brackets))throw Lt(t,\"the 'brackets' attribute must be defined as an array\")}else e.brackets=[{open:\"{\",close:\"}\",token:\"delimiter.curly\"},{open:\"[\",close:\"]\",token:\"delimiter.square\"},{open:\"(\",close:\")\",token:\"delimiter.parenthesis\"},{open:\"<\",close:\">\",token:\"delimiter.angle\"}];const s=[];for(const r of e.brackets){let a=r;if(a&&Array.isArray(a)&&a.length===3&&(a={token:a[2],open:a[0],close:a[1]}),a.open===a.close)throw Lt(t,\"open and close brackets in a 'brackets' attribute must be different: \"+a.open+`\n hint: use the 'bracket' attribute if matching on equal brackets is required.`);if(typeof a.open==\"string\"&&typeof a.token==\"string\"&&typeof a.close==\"string\")s.push({token:a.token+t.tokenPostfix,open:ic(t,a.open),close:ic(t,a.close)});else throw Lt(t,\"every element in the 'brackets' array must be a '{open,close,token}' object or array\")}return t.brackets=s,t.noThrow=!0,t}var hde=globalThis&&globalThis.__awaiter||function(o,e,t,i){function n(s){return s instanceof t?s:new t(function(r){r(s)})}return new(t||(t=Promise))(function(s,r){function a(d){try{c(i.next(d))}catch(h){r(h)}}function l(d){try{c(i.throw(d))}catch(h){r(h)}}function c(d){d.done?s(d.value):n(d.value).then(a,l)}c((i=i.apply(o,e||[])).next())})};function ude(o){sg.registerLanguage(o)}function gde(){let o=[];return o=o.concat(sg.getLanguages()),o}function fde(o){return Le.get(Ht).languageIdCodec.encodeLanguageId(o)}function pde(o,e){const i=Le.get(Ht).onDidEncounterLanguage(n=>{n===o&&(i.dispose(),e())});return i}function mde(o,e){if(!Le.get(Ht).isRegisteredLanguageId(o))throw new Error(`Cannot set configuration for unknown language ${o}`);return Le.get(ti).register(o,e,100)}class _de{constructor(e,t){this._languageId=e,this._actual=t}getInitialState(){return this._actual.getInitialState()}tokenize(e,t,i){if(typeof this._actual.tokenize==\"function\")return Um.adaptTokenize(this._languageId,this._actual,e,i);throw new Error(\"Not supported!\")}tokenizeEncoded(e,t,i){const n=this._actual.tokenizeEncoded(e,i);return new i1(n.tokens,n.endState)}}class Um{constructor(e,t,i,n){this._languageId=e,this._actual=t,this._languageService=i,this._standaloneThemeService=n}getInitialState(){return this._actual.getInitialState()}static _toClassicTokens(e,t){const i=[];let n=0;for(let s=0,r=e.length;s<r;s++){const a=e[s];let l=a.startIndex;s===0?l=0:l<n&&(l=n),i[s]=new Vp(l,a.scopes,t),n=l}return i}static adaptTokenize(e,t,i,n){const s=t.tokenize(i,n),r=Um._toClassicTokens(s.tokens,e);let a;return s.endState.equals(n)?a=n:a=s.endState,new DI(r,a)}tokenize(e,t,i){return Um.adaptTokenize(this._languageId,this._actual,e,i)}_toBinaryTokens(e,t){const i=e.encodeLanguageId(this._languageId),n=this._standaloneThemeService.getColorTheme().tokenTheme,s=[];let r=0,a=0;for(let c=0,d=t.length;c<d;c++){const h=t[c],u=n.match(i,h.scopes);if(r>0&&s[r-1]===u)continue;let g=h.startIndex;c===0?g=0:g<a&&(g=a),s[r++]=g,s[r++]=u,a=g}const l=new Uint32Array(r);for(let c=0;c<r;c++)l[c]=s[c];return l}tokenizeEncoded(e,t,i){const n=this._actual.tokenize(e,i),s=this._toBinaryTokens(this._languageService.languageIdCodec,n.tokens);let r;return n.endState.equals(i)?r=i:r=n.endState,new i1(s,r)}}function bde(o){return typeof o.getInitialState==\"function\"}function vde(o){return\"tokenizeEncoded\"in o}function _9(o){return o&&typeof o.then==\"function\"}function Cde(o){const e=Le.get(yo);if(o){const t=[null];for(let i=1,n=o.length;i<n;i++)t[i]=W.fromHex(o[i]);e.setColorMapOverride(t)}else e.setColorMapOverride(null)}function b9(o,e){return vde(e)?new _de(o,e):new Um(o,e,Le.get(Ht),Le.get(yo))}function BN(o,e){const t={createTokenizationSupport:()=>hde(this,void 0,void 0,function*(){const i=yield Promise.resolve(e.create());return i?bde(i)?b9(o,i):new Pm(Le.get(Ht),Le.get(yo),o,m9(o,i),Le.get(ot)):null})};return Jt.registerFactory(o,t)}function wde(o,e){if(!Le.get(Ht).isRegisteredLanguageId(o))throw new Error(`Cannot set tokens provider for unknown language ${o}`);return _9(e)?BN(o,{create:()=>e}):Jt.register(o,b9(o,e))}function Sde(o,e){const t=i=>new Pm(Le.get(Ht),Le.get(yo),o,m9(o,i),Le.get(ot));return _9(e)?BN(o,{create:()=>e}):Jt.register(o,t(e))}function yde(o,e){return Le.get(ue).referenceProvider.register(o,e)}function Lde(o,e){return Le.get(ue).renameProvider.register(o,e)}function Dde(o,e){return Le.get(ue).signatureHelpProvider.register(o,e)}function kde(o,e){return Le.get(ue).hoverProvider.register(o,{provideHover:(i,n,s)=>{const r=i.getWordAtPosition(n);return Promise.resolve(e.provideHover(i,n,s)).then(a=>{if(!!a)return!a.range&&r&&(a.range=new L(n.lineNumber,r.startColumn,n.lineNumber,r.endColumn)),a.range||(a.range=new L(n.lineNumber,n.column,n.lineNumber,n.column)),a})}})}function xde(o,e){return Le.get(ue).documentSymbolProvider.register(o,e)}function Ide(o,e){return Le.get(ue).documentHighlightProvider.register(o,e)}function Ede(o,e){return Le.get(ue).linkedEditingRangeProvider.register(o,e)}function Nde(o,e){return Le.get(ue).definitionProvider.register(o,e)}function Tde(o,e){return Le.get(ue).implementationProvider.register(o,e)}function Mde(o,e){return Le.get(ue).typeDefinitionProvider.register(o,e)}function Ade(o,e){return Le.get(ue).codeLensProvider.register(o,e)}function Rde(o,e,t){return Le.get(ue).codeActionProvider.register(o,{providedCodeActionKinds:t==null?void 0:t.providedCodeActionKinds,documentation:t==null?void 0:t.documentation,provideCodeActions:(n,s,r,a)=>{const c=Le.get(ta).read({resource:n.uri}).filter(d=>L.areIntersectingOrTouching(d,s));return e.provideCodeActions(n,s,{markers:c,only:r.only,trigger:r.trigger},a)},resolveCodeAction:e.resolveCodeAction})}function Ode(o,e){return Le.get(ue).documentFormattingEditProvider.register(o,e)}function Pde(o,e){return Le.get(ue).documentRangeFormattingEditProvider.register(o,e)}function Fde(o,e){return Le.get(ue).onTypeFormattingEditProvider.register(o,e)}function Bde(o,e){return Le.get(ue).linkProvider.register(o,e)}function Wde(o,e){return Le.get(ue).completionProvider.register(o,e)}function Vde(o,e){return Le.get(ue).colorProvider.register(o,e)}function Hde(o,e){return Le.get(ue).foldingRangeProvider.register(o,e)}function zde(o,e){return Le.get(ue).declarationProvider.register(o,e)}function Ude(o,e){return Le.get(ue).selectionRangeProvider.register(o,e)}function $de(o,e){return Le.get(ue).documentSemanticTokensProvider.register(o,e)}function jde(o,e){return Le.get(ue).documentRangeSemanticTokensProvider.register(o,e)}function Kde(o,e){return Le.get(ue).inlineCompletionsProvider.register(o,e)}function qde(o,e){return Le.get(ue).inlayHintsProvider.register(o,e)}function Gde(){return{register:ude,getLanguages:gde,onLanguage:pde,getEncodedLanguageId:fde,setLanguageConfiguration:mde,setColorMap:Cde,registerTokensProviderFactory:BN,setTokensProvider:wde,setMonarchTokensProvider:Sde,registerReferenceProvider:yde,registerRenameProvider:Lde,registerCompletionItemProvider:Wde,registerSignatureHelpProvider:Dde,registerHoverProvider:kde,registerDocumentSymbolProvider:xde,registerDocumentHighlightProvider:Ide,registerLinkedEditingRangeProvider:Ede,registerDefinitionProvider:Nde,registerImplementationProvider:Tde,registerTypeDefinitionProvider:Mde,registerCodeLensProvider:Ade,registerCodeActionProvider:Rde,registerDocumentFormattingEditProvider:Ode,registerDocumentRangeFormattingEditProvider:Pde,registerOnTypeFormattingEditProvider:Fde,registerLinkProvider:Bde,registerColorProvider:Vde,registerFoldingRangeProvider:Hde,registerDeclarationProvider:zde,registerSelectionRangeProvider:Ude,registerDocumentSemanticTokensProvider:$de,registerDocumentRangeSemanticTokensProvider:jde,registerInlineCompletionsProvider:Kde,registerInlayHintsProvider:qde,DocumentHighlightKind:UD,CompletionItemKind:FD,CompletionItemTag:BD,CompletionItemInsertTextRule:Zv,SymbolKind:uk,SymbolTag:gk,IndentAction:GD,CompletionTriggerKind:WD,SignatureHelpTriggerKind:hk,InlayHintKind:YD,InlineCompletionTriggerKind:XD,CodeActionTriggerType:PD,FoldingRangeKind:Zo}}var hy;Jo.wrappingIndent.defaultValue=0;Jo.glyphMargin.defaultValue=!1;Jo.autoIndent.defaultValue=3;Jo.overviewRulerLanes.defaultValue=2;nh.setFormatterSelector((o,e,t)=>Promise.resolve(o[0]));const Ln=V7();Ln.editor=ode();Ln.languages=Gde();Ln.CancellationTokenSource;Ln.Emitter;Ln.KeyCode;Ln.KeyMod;Ln.Position;Ln.Range;Ln.Selection;Ln.SelectionDirection;Ln.MarkerSeverity;Ln.MarkerTag;Ln.Uri;Ln.Token;const Zde=Ln.editor;Ln.languages;(((hy=ei.MonacoEnvironment)===null||hy===void 0?void 0:hy.globalAPI)||typeof define==\"function\"&&define.amd)&&(self.monaco=Ln);typeof self.require!=\"undefined\"&&typeof self.require.config==\"function\"&&self.require.config({ignoreDuplicateModules:[\"vscode-languageserver-types\",\"vscode-languageserver-types/main\",\"vscode-languageserver-textdocument\",\"vscode-languageserver-textdocument/main\",\"vscode-nls\",\"vscode-nls/vscode-nls\",\"jsonc-parser\",\"jsonc-parser/main\",\"vscode-uri\",\"vscode-uri/index\",\"vs/basic-languages/typescript/typescript\"]});const Yde={id:\"editor\"},Xde={key:0,class:\"loading\"},Qde=Un({__name:\"editor\",props:{file:{type:Object,required:!0}},setup(o){const e=o,t=ki(\"\"),i=ki(!1),n=ki(null),s=ki(!0);let r=()=>{},a=null;const l=()=>io(this,null,function*(){try{const u=jN.CancelToken,g=yield j9({method:\"GET\",url:e.file.getDownloadUrl(),cancelToken:new u(f=>{a=f})});g!=null&&g.data&&(t.value=g==null?void 0:g.data)}catch(u){if(jN.isAxiosError(u)&&(u==null?void 0:u.code)==\"ERR_CANCELED\")return;N_.Error(`${u}`)}finally{s.value=!1}}),c=()=>{const u=e.file.getSuffixName();switch(u){case\"js\":return\"javascript\";case\"ts\":return\"typescript\"}return u},d=u=>{const g=Zde.create(u,{value:t.value,language:c(),theme:\"vs-dark\",fontSize:14,automaticLayout:!0});r=()=>{g&&g.dispose()},g.onDidChangeModelContent(()=>{t.value=g.getValue()})},h=()=>io(this,null,function*(){if(s.value||i.value)return;i.value=!0;const u=e.file,g=new File([t.value],u.name);try{const f=yield Dx.File.Basic.Upload.POST({destination:\"/local\"+u.getAbsPath(),files:[g]});if(f.data){const{success:_,error:b}=f.data;b&&N_.Warning(b),_===0&&N_.Success(\"\\u4FDD\\u5B58\\u6210\\u529F\")}}catch(f){N_.Error(`${f}`)}finally{i.value=!1}});return Sx(()=>io(this,null,function*(){yield l(),yield pC(()=>{n.value&&d(n.value)})})),QR(()=>{r(),a&&a()}),(u,g)=>{const f=iO(\"icon-loading\");return li(),Wn(\"div\",Yde,[s.value?(li(),Wn(\"div\",Xde,[Nt(f)])):L0(\"\",!0),Nt(I8,{onSave:h,disabled:i.value},{default:Hr(()=>[Xn(\"div\",{class:\"monaco\",ref_key:\"el\",ref:n},null,512)]),_:1},8,[\"disabled\"])])}}});const Jde=Xr(Qde,[[\"__scopeId\",\"data-v-1fc80c91\"]]),ehe={class:\"image\"},the=[\"src\"],ihe=Un({__name:\"image\",props:{file:{type:Object,required:!0}},setup(o){const e=o,t=Ho(()=>{const i=e.file.getDownloadUrl();return _C.isHeic(i)?`${i}?heic=yes`:i});return(i,n)=>(li(),Wn(\"div\",ehe,[Xn(\"img\",{src:si(t),alt:\"\"},null,8,the)]))}});const nhe=Xr(ihe,[[\"__scopeId\",\"data-v-0610fda2\"]]),she={class:\"video\"},ohe=[\"src\"],rhe=Un({__name:\"video\",props:{file:{type:Object,required:!0}},setup(o){const e=o,t=Ho(()=>{const i=e.file.getDownloadUrl();return _C.isHeic(i)?`${i}?heic=yes`:i});return(i,n)=>(li(),Wn(\"div\",she,[Xn(\"video\",{src:si(t),controls:\"\"},null,8,ohe)]))}});const ahe=Xr(rhe,[[\"__scopeId\",\"data-v-72349455\"]]),lhe=[\"src\"],che=Un({__name:\"iframe\",props:{file:{type:Object,required:!0}},setup(o){const e=o,t=Ho(()=>{var n;return(n=e.file)==null?void 0:n.getDownloadUrl()});return(i,n)=>(li(),Wn(\"iframe\",{src:si(t),frameborder:\"0\"},null,8,lhe))}});const dhe=Xr(che,[[\"__scopeId\",\"data-v-2d9ab994\"]]),hhe=Un({__name:\"pane\",props:{file:{type:Object,required:!0}},setup(o){const e=o,t=()=>{var i;switch(e.file.iconType){case\"image\":return nhe;case\"video\":return ahe}switch((i=e.file)==null?void 0:i.getSuffixName()){case\"pdf\":return dhe}return Jde};return(i,n)=>(li(),Ka(K9(t()),{file:o.file},null,8,[\"file\"]))}}),uhe=Un({__name:\"main\",setup(o){const e=uC(),t=rO(),i=bC(),n=Nd(\"path\"),s=Nd(\"absPath\"),r=a=>{e.removeTab(a),(a==n.value||e.editableTabs.length==0)&&i.push({query:E_(I_({},t.query),{path:s.value})})};return(a,l)=>(li(),Wn(\"main\",null,[Nt(si(l8),{modelValue:si(e).editableTabsValue,\"onUpdate:modelValue\":l[0]||(l[0]=c=>si(e).editableTabsValue=c),stretch:\"\",class:\"main-tabs\",closable:\"\",onTabRemove:r},{default:Hr(()=>[(li(!0),Wn(mC,null,Lx(si(e).editableTabs,c=>(li(),Ka(si(c8),{lazy:\"\",key:c.rootPath,label:c.name,name:c.rootPath,class:\"main-tab-pane\"},{default:Hr(()=>[Nt(hhe,{file:c},null,8,[\"file\"])]),_:2},1032,[\"label\",\"name\"]))),128))]),_:1},8,[\"modelValue\"])]))}});const ghe=Xr(uhe,[[\"__scopeId\",\"data-v-24207f97\"]]),fhe={id:\"page\"},phe=Un({__name:\"index\",setup(o){const e=rO();bC(),uC();const t=Ho(()=>e.query.path||\"/\"),i=Ho(()=>e.query.format||\"dir\"),n=Ho(()=>{const s=t.value.split(\"/\")||[];return i.value===\"dir\"?s.join(\"/\")||\"/\":s.splice(0,s.length-1).join(\"/\")||\"/\"});return uy(\"path\",t),uy(\"absPath\",n),window.onbeforeunload=function(s){return s=s||window.event,s&&(s.returnValue=\"\\u5173\\u95ED\\u63D0\\u793A\"),\"\\u5173\\u95ED\\u63D0\\u793A\"},(s,r)=>(li(),Wn(\"div\",fhe,[Nt(q9,null,{f:Hr(()=>[Nt(y8)]),r:Hr(()=>[Nt(ghe)]),_:1})]))}});const Sge=Xr(phe,[[\"__scopeId\",\"data-v-7c3f998c\"]]);export{Sge as default};\n"
  },
  {
    "path": "luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.4a114b4a.js",
    "content": "import{e as t,r as a,F as _,y as s,S as o,q as n,a7 as c}from\"./index.js\";const r={class:\"layout-conatiner\"},d={class:\"layout-f\"},l={class:\"layout-r\"},i=t({__name:\"index\",setup(u){return a(!0),(e,p)=>(n(),_(\"div\",r,[s(\"div\",d,[o(e.$slots,\"f\",{},void 0,!0)]),s(\"div\",l,[o(e.$slots,\"r\",{},void 0,!0)])]))}});const v=c(i,[[\"__scopeId\",\"data-v-cbf72d2b\"]]);export{v as l};\n"
  },
  {
    "path": "luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.4ea0593d.js",
    "content": "var be=Object.defineProperty,ye=Object.defineProperties;var xe=Object.getOwnPropertyDescriptors;var ce=Object.getOwnPropertySymbols;var Ie=Object.prototype.hasOwnProperty,Ee=Object.prototype.propertyIsEnumerable;var ue=(r,o,n)=>o in r?be(r,o,{enumerable:!0,configurable:!0,writable:!0,value:n}):r[o]=n,Y=(r,o)=>{for(var n in o||(o={}))Ie.call(o,n)&&ue(r,n,o[n]);if(ce)for(var n of ce(o))Ee.call(o,n)&&ue(r,n,o[n]);return r},U=(r,o)=>ye(r,xe(o));var de=(r,o,n)=>new Promise((c,_)=>{var L=k=>{try{u(n.next(k))}catch(w){_(w)}},R=k=>{try{u(n.throw(k))}catch(w){_(w)}},u=k=>k.done?c(k.value):Promise.resolve(k.value).then(L,R);u((n=n.apply(r,o)).next())});import{i as Ce,a as Ne,b as Te,d as Oe,m as ze,c as pe,e as Q,f as _e,g as Re,s as $e,u as Ae,h as De,j as Le,r as H,k as Fe,l as Se,n as v,w as fe,o as Be,p as Pe,q as m,t as D,v as l,x as f,y as t,z as p,A as e,B as Me,C as $,E as T,D as Ve,F as A,G as Xe,H as Ye,I as G,J as He,K as qe,L as ge,M as We,N as Ue,O as he,P as Ze,Q as je,R as me,S as Ge,T as Qe,U as Je,_ as Ke,V as Z,W as P,X as et,Y as tt,Z as st,$ as nt,a0 as at,a1 as O,a2 as ve,a3 as ot,a4 as j,a5 as lt,a6 as it,a7 as rt}from\"./index.js\";import{u as ke}from\"./chunk.6424c2fc.js\";import{d as ct}from\"./chunk.22632dc4.js\";import{l as ut}from\"./chunk.4a114b4a.js\";var dt=\"Expected a function\";function ae(r,o,n){var c=!0,_=!0;if(typeof r!=\"function\")throw new TypeError(dt);return Ce(n)&&(c=\"leading\"in n?!!n.leading:c,_=\"trailing\"in n?!!n.trailing:_),ct(r,o,{leading:c,maxWait:o,trailing:_})}const _t=()=>Ne&&/firefox/i.test(window.navigator.userAgent),ft=Te({urlList:{type:Oe(Array),default:()=>ze([])},zIndex:{type:Number},initialIndex:{type:Number,default:0},infinite:{type:Boolean,default:!0},hideOnClickModal:{type:Boolean,default:!1},teleported:{type:Boolean,default:!1},closeOnPressEscape:{type:Boolean,default:!0}}),mt={close:()=>!0,switch:r=>pe(r)},vt=[\"src\"],pt={name:\"ElImageViewer\"},gt=Q(U(Y({},pt),{props:ft,emits:mt,setup(r,{expose:o,emit:n}){const c=r,_={CONTAIN:{name:\"contain\",icon:_e(Re)},ORIGINAL:{name:\"original\",icon:_e($e)}},L=_t()?\"DOMMouseScroll\":\"mousewheel\",{t:R}=Ae(),u=De(\"image-viewer\"),{nextZIndex:k}=Le(),w=H(),F=H([]),q=Fe(),E=H(!0),b=H(c.initialIndex),S=Se(_.CONTAIN),a=H({scale:1,deg:0,offsetX:0,offsetY:0,enableTransition:!1}),C=v(()=>{const{urlList:s}=c;return s.length<=1}),M=v(()=>b.value===0),W=v(()=>b.value===c.urlList.length-1),J=v(()=>c.urlList[b.value]),K=v(()=>{const{scale:s,deg:i,offsetX:d,offsetY:g,enableTransition:x}=a.value;let h=d/s,I=g/s;switch(i%360){case 90:case-270:[h,I]=[I,-h];break;case 180:case-180:[h,I]=[-h,-I];break;case 270:case-90:[h,I]=[-I,h];break}const B={transform:`scale(${s}) rotate(${i}deg) translate(${h}px, ${I}px)`,transition:x?\"transform .3s\":\"\"};return S.value.name===_.CONTAIN.name&&(B.maxWidth=B.maxHeight=\"100%\"),B}),V=v(()=>pe(c.zIndex)?c.zIndex:k());function X(){te(),n(\"close\")}function ee(){const s=ae(d=>{switch(d.code){case P.esc:c.closeOnPressEscape&&X();break;case P.space:le();break;case P.left:ie();break;case P.up:N(\"zoomIn\");break;case P.right:re();break;case P.down:N(\"zoomOut\");break}}),i=ae(d=>{(d.wheelDelta?d.wheelDelta:-d.detail)>0?N(\"zoomIn\",{zoomRate:1.2,enableTransition:!1}):N(\"zoomOut\",{zoomRate:1.2,enableTransition:!1})});q.run(()=>{Z(document,\"keydown\",s),Z(document,L,i)})}function te(){q.stop()}function y(){E.value=!1}function se(s){E.value=!1,s.target.alt=R(\"el.image.error\")}function we(s){if(E.value||s.button!==0||!w.value)return;a.value.enableTransition=!1;const{offsetX:i,offsetY:d}=a.value,g=s.pageX,x=s.pageY,h=ae(B=>{a.value=U(Y({},a.value),{offsetX:i+B.pageX-g,offsetY:d+B.pageY-x})}),I=Z(document,\"mousemove\",h);Z(document,\"mouseup\",()=>{I()}),s.preventDefault()}function oe(){a.value={scale:1,deg:0,offsetX:0,offsetY:0,enableTransition:!1}}function le(){if(E.value)return;const s=et(_),i=Object.values(_),d=S.value.name,x=(i.findIndex(h=>h.name===d)+1)%s.length;S.value=_[s[x]],oe()}function ne(s){const i=c.urlList.length;b.value=(s+i)%i}function ie(){M.value&&!c.infinite||ne(b.value-1)}function re(){W.value&&!c.infinite||ne(b.value+1)}function N(s,i={}){if(E.value)return;const{zoomRate:d,rotateDeg:g,enableTransition:x}=Y({zoomRate:1.4,rotateDeg:90,enableTransition:!0},i);switch(s){case\"zoomOut\":a.value.scale>.2&&(a.value.scale=Number.parseFloat((a.value.scale/d).toFixed(3)));break;case\"zoomIn\":a.value.scale<7&&(a.value.scale=Number.parseFloat((a.value.scale*d).toFixed(3)));break;case\"clockwise\":a.value.deg+=g;break;case\"anticlockwise\":a.value.deg-=g;break}a.value.enableTransition=x}return fe(J,()=>{Be(()=>{const s=F.value[0];s!=null&&s.complete||(E.value=!0)})}),fe(b,s=>{oe(),n(\"switch\",s)}),Pe(()=>{var s,i;ee(),(i=(s=w.value)==null?void 0:s.focus)==null||i.call(s)}),o({setActiveItem:ne}),(s,i)=>(m(),D(Je,{to:\"body\",disabled:!s.teleported},[l(Qe,{name:\"viewer-fade\",appear:\"\"},{default:f(()=>[t(\"div\",{ref_key:\"wrapper\",ref:w,tabindex:-1,class:p(e(u).e(\"wrapper\")),style:me({zIndex:e(V)})},[t(\"div\",{class:p(e(u).e(\"mask\")),onClick:i[0]||(i[0]=Me(d=>s.hideOnClickModal&&X(),[\"self\"]))},null,2),$(\" CLOSE \"),t(\"span\",{class:p([e(u).e(\"btn\"),e(u).e(\"close\")]),onClick:X},[l(e(T),null,{default:f(()=>[l(e(Ve))]),_:1})],2),$(\" ARROW \"),e(C)?$(\"v-if\",!0):(m(),A(G,{key:0},[t(\"span\",{class:p([e(u).e(\"btn\"),e(u).e(\"prev\"),e(u).is(\"disabled\",!s.infinite&&e(M))]),onClick:ie},[l(e(T),null,{default:f(()=>[l(e(Xe))]),_:1})],2),t(\"span\",{class:p([e(u).e(\"btn\"),e(u).e(\"next\"),e(u).is(\"disabled\",!s.infinite&&e(W))]),onClick:re},[l(e(T),null,{default:f(()=>[l(e(Ye))]),_:1})],2)],64)),$(\" ACTIONS \"),t(\"div\",{class:p([e(u).e(\"btn\"),e(u).e(\"actions\")])},[t(\"div\",{class:p(e(u).e(\"actions__inner\"))},[l(e(T),{onClick:i[1]||(i[1]=d=>N(\"zoomOut\"))},{default:f(()=>[l(e(He))]),_:1}),l(e(T),{onClick:i[2]||(i[2]=d=>N(\"zoomIn\"))},{default:f(()=>[l(e(qe))]),_:1}),t(\"i\",{class:p(e(u).e(\"actions__divider\"))},null,2),l(e(T),{onClick:le},{default:f(()=>[(m(),D(ge(e(S).icon)))]),_:1}),t(\"i\",{class:p(e(u).e(\"actions__divider\"))},null,2),l(e(T),{onClick:i[3]||(i[3]=d=>N(\"anticlockwise\"))},{default:f(()=>[l(e(We))]),_:1}),l(e(T),{onClick:i[4]||(i[4]=d=>N(\"clockwise\"))},{default:f(()=>[l(e(Ue))]),_:1})],2)],2),$(\" CANVAS \"),t(\"div\",{class:p(e(u).e(\"canvas\"))},[(m(!0),A(G,null,he(s.urlList,(d,g)=>Ze((m(),A(\"img\",{ref_for:!0,ref:x=>F.value[g]=x,key:d,src:d,style:me(e(K)),class:p(e(u).e(\"img\")),onLoad:y,onError:se,onMousedown:we},null,46,vt)),[[je,g===b.value]])),128))],2),Ge(s.$slots,\"default\")],6)]),_:3})],8,[\"disabled\"]))}}));var ht=Ke(gt,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/image-viewer/src/image-viewer.vue\"]]);const kt=tt(ht),wt=Q({__name:\"image\",setup(r){const o=ke(),n=v(()=>o.previewImage.values),c=v(()=>o.previewImage.enable),_=()=>{o.previewImage.enable=!1,o.previewImage.values=[]};return(L,R)=>e(c)?(m(),D(e(kt),{key:0,\"url-list\":e(n),onClose:_},null,8,[\"url-list\"])):$(\"\",!0)}}),bt=Q({__name:\"index\",setup(r){return(o,n)=>(m(),D(wt))}}),z=r=>(lt(\"data-v-9840e643\"),r=r(),it(),r),yt=z(()=>t(\"div\",{class:\"logo\"},[t(\"span\",null,\"\\u6587\\u4EF6\\u7BA1\\u7406\")],-1)),xt={class:\"menus\"},It=[\"href\"],Et={class:\"icon\"},Ct=z(()=>t(\"div\",{class:\"info\"},[t(\"div\",{class:\"name\"},\" \\u5F00\\u542F\\u7F51\\u76D8 \"),t(\"div\",{class:\"desc\"})],-1)),Nt=[\"onClick\",\"title\"],Tt={class:\"icon\"},Ot={class:\"info\"},zt={class:\"name\"},Rt=z(()=>t(\"div\",{class:\"desc\"},null,-1)),$t={class:\"sidebar\"},At=z(()=>t(\"hr\",null,null,-1)),Dt={class:\"icon\"},Lt={class:\"info\"},Ft={class:\"name\"},St={key:0},Bt=z(()=>t(\"div\",{class:\"desc\"},null,-1)),Pt={class:\"icon\"},Mt=z(()=>t(\"div\",{class:\"info\"},[t(\"div\",{class:\"name\"},\" \\u56DE\\u6536\\u7AD9 \"),t(\"div\",{class:\"desc\"})],-1)),Vt={class:\"icon\"},Xt=z(()=>t(\"div\",{class:\"info\"},[t(\"div\",{class:\"name\"},\" \\u8BBE\\u7F6E \"),t(\"div\",{class:\"desc\"})],-1)),Yt={class:\"title\"},Ht=z(()=>t(\"div\",{class:\"auto\"},null,-1)),qt={class:\"body\"},Wt=Q({__name:\"index\",setup(r){const o=nt(),n=at(),c=ke(),_=v(()=>c.menus),L=v(()=>c.keys),R=v(()=>c.task),u=st.getLinkeaseWebUrl();(()=>de(this,null,function*(){yield c.getEntries(),!n.query.path&&_.value.length>0&&q(_.value[0])}))();const w=v(()=>n.query.path),F=v(()=>{var a;if(w.value){for(let C=0;C<((a=_.value)==null?void 0:a.length);C++)if(new RegExp(\"^/\"+_.value[C].name).test(w.value))return _.value[C]}}),q=a=>{n.name===\"PageIndexIndex\"&&o.push({path:n.path,query:U(Y({},n.query),{path:\"/\"+a.name})})},E=a=>!!(n.name===\"PageIndexIndex\"&&F.value&&F.value.name===a.name),b=v(()=>{var a;switch(n.name){case\"PageIndexTask\":return\"\\u4EFB\\u52A1\";case\"PageIndexRecycle\":return\"\\u56DE\\u6536\\u7AD9\";case\"PageIndexSetting\":return\"\\u8BBE\\u7F6E\";default:return((a=F.value)==null?void 0:a.name)||\"\"}}),S=a=>new RegExp(\"_#HOME$\").test(a.displayName||\"\");return(a,C)=>{const M=O(\"icon-disk\"),W=O(\"icon-home\"),J=O(\"icon-dir\"),K=O(\"icon-task\"),V=O(\"router-link\"),X=O(\"icon-recycle\"),ee=O(\"icon-setting\"),te=O(\"router-view\");return m(),A(G,null,[l(ut,null,{f:f(()=>[t(\"aside\",null,[yt,t(\"div\",xt,[l(e(ve),{class:\"scrollbar-container\"},{default:f(()=>[t(\"a\",{class:\"menu-item\",target:\"_blank\",href:e(u)},[t(\"div\",Et,[l(M)]),Ct],8,It),(m(!0),A(G,null,he(e(_),y=>(m(),A(\"li\",{class:p([\"menu-item\",{on:E(y)}]),onClick:()=>{e(o).push({path:\"/\",query:{path:`/${y.name}`}})},title:y.name},[t(\"div\",Tt,[y.name==\"root\"?(m(),D(W,{key:0})):(m(),D(J,{key:1}))]),t(\"div\",Ot,[t(\"div\",zt,j(y.name)+\" \"+j(S(y)?\"[\\u4E3B\\u76EE\\u5F55]\":\"\"),1),Rt])],10,Nt))),256))]),_:1})]),t(\"div\",$t,[l(e(ve),{class:\"scrollbar-container\"},{default:f(()=>[At,l(V,{class:\"menu-item\",to:\"/task\"},{default:f(()=>[t(\"div\",Dt,[l(K)]),t(\"div\",Lt,[t(\"div\",Ft,[ot(\" \\u4EFB\\u52A1 \"),e(R)>0?(m(),A(\"span\",St,j(e(R)),1)):$(\"\",!0)]),Bt])]),_:1}),l(V,{class:\"menu-item\",to:\"/recycle\"},{default:f(()=>[t(\"div\",Pt,[l(X)]),Mt]),_:1}),l(V,{class:\"menu-item\",to:\"/setting\"},{default:f(()=>[t(\"div\",Vt,[l(ee)]),Xt]),_:1})]),_:1})])])]),r:f(()=>[t(\"main\",null,[t(\"header\",null,[t(\"div\",Yt,j(e(b)),1),Ht]),t(\"div\",qt,[l(te,{name:\"default\"},{default:f(({Component:y,route:se})=>[(m(),D(ge(y),{key:`${se.path}-${e(L)}`}))]),_:1})])])]),_:1}),l(bt)],64)}}});const Jt=rt(Wt,[[\"__scopeId\",\"data-v-9840e643\"]]);export{Jt as default};\n"
  },
  {
    "path": "luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.6424c2fc.js",
    "content": "var g=(e,t,s)=>new Promise((a,l)=>{var c=i=>{try{n(s.next(i))}catch(d){l(d)}},u=i=>{try{n(s.throw(i))}catch(d){l(d)}},n=i=>i.done?a(i.value):Promise.resolve(i.value).then(c,u);n((s=s.apply(e,t)).next())});import{a8 as h,a9 as y,aa as f}from\"./index.js\";const o=e=>[\"linkease-file_web\",e].join(\"/\"),r={model:{get(){return localStorage.getItem(o(\"model\"))==\"true\"},set(e){localStorage.setItem(o(\"model\"),e)}},order:{get(){const e=localStorage.getItem(o(\"order\"));return e||\"date\"},set(e){localStorage.setItem(o(\"order\"),e)}},orderBy:{get(){return localStorage.getItem(o(\"orderBy\"))||\"asc\"},set(e){localStorage.setItem(o(\"orderBy\"),e)}},filter:{get(){return localStorage.getItem(o(\"filter\"))||\"default\"},set(e){localStorage.setItem(o(\"filter\"),e)}},copy:{get(){let e={type:\"copy\",values:[]};try{const t=localStorage.getItem(o(\"copy\"));t&&(e=JSON.parse(t))}catch(t){}return e},set(e){const t=JSON.stringify(e);localStorage.setItem(o(\"copy\"),t)}}},m=h(\"app\",{state:()=>({keys:0,config:{model:r.model.get(),order:r.order.get(),orderBy:r.orderBy.get(),filter:r.filter.get()},menus:[],entries:[],checknoxEntries:[],previewImage:{enable:!1,values:[]},copy:r.copy.get(),task:0}),getters:{isCopy(){var e,t;return((t=(e=this.copy)==null?void 0:e.values)==null?void 0:t.length)>0}},actions:{reload(){this.keys++},taskIncr(e){e===void 0?this.task=0:this.task+=e},getEntries(){return g(this,null,function*(){try{const e=yield y.File.Basic.List.POST({path:\"/local\"});if(e.data){const{success:t,result:s,error:a}=e.data;t==0&&(this.menus=s.entries||[]),a&&f.Warning(a)}}catch(e){console.log(e),f.Error(`${e}`)}})},setConfigModel(){this.config.model=!this.config.model,r.model.set(`${this.config.model}`)},setConfigOrder(e){this.config.order=e,r.order.set(e)},setConfigOrderBy(e){this.config.orderBy=e,r.orderBy.set(e)},setConfigFilter(e){this.config.filter=e,r.filter.set(e)},setCopy(e){this.copy.type=e.type,this.copy.values=e.values||[],r.copy.set(e)}}}),S=h(\"editor\",{state:()=>({entries:[],editableTabs:[],editableTabsValue:\"\"}),actions:{addTab(e){for(let t=0;t<this.editableTabs.length;t++)if(this.editableTabs[t].rootPath===e.rootPath){this.editableTabsValue=e.rootPath||\"\";return}this.editableTabs.push(e),this.editableTabsValue=e.rootPath||\"\"},removeTab(e){const t=this.editableTabs;let s=this.editableTabsValue;s===e&&t.forEach((a,l)=>{if(a.rootPath===e){const c=t[l+1]||t[l-1];c&&(s=c.rootPath||\"\")}}),this.editableTabsValue=s,this.editableTabs=t.filter(a=>a.rootPath!==e)}}});export{S as a,r as s,m as u};\n"
  },
  {
    "path": "luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.7191676b.js",
    "content": "var We=Object.defineProperty,Le=Object.defineProperties;var je=Object.getOwnPropertyDescriptors;var we=Object.getOwnPropertySymbols;var Ke=Object.prototype.hasOwnProperty,Ge=Object.prototype.propertyIsEnumerable;var xe=(s,e,n)=>e in s?We(s,e,{enumerable:!0,configurable:!0,writable:!0,value:n}):s[e]=n,K=(s,e)=>{for(var n in e||(e={}))Ke.call(e,n)&&xe(s,n,e[n]);if(we)for(var n of we(e))Ge.call(e,n)&&xe(s,n,e[n]);return s},le=(s,e)=>Le(s,je(e));var N=(s,e,n)=>new Promise((a,b)=>{var A=u=>{try{$(n.next(u))}catch(h){b(h)}},k=u=>{try{$(n.throw(u))}catch(h){b(h)}},$=u=>u.done?a(u.value):Promise.resolve(u.value).then(A,k);$((n=n.apply(s,e)).next())});import{b as He,ad as $e,d as Ye,ae as ye,af as ce,ag as he,c as pe,ah as ge,ai as Ee,e as j,aj as Ze,ak as Je,h as Qe,al as Xe,n as B,am as et,an as tt,r as Z,ao as at,w as me,ap as nt,p as ot,q as d,F as D,y as r,A as t,z as P,aq as st,t as x,x as _,L as ie,E as J,C as M,a4 as z,I as H,v as g,ar as ut,R as Se,B as Ie,_ as lt,as as De,o as it,at as Ae,au as ct,Y as rt,Z as ve,$ as re,a0 as ee,av as be,a9 as W,aa as v,aw as Pe,a1 as G,P as Ve,ax as Oe,ay as R,a5 as de,a6 as fe,a7 as te,az as dt,O as X,H as ft,a2 as Me,a3 as Ce,aA as ht,aB as pt}from\"./index.js\";import{u as ae,s as Te}from\"./chunk.6424c2fc.js\";import{c as Ne,d as mt,E as vt,a as _t,b as _e,e as Q,f as Fe,_ as Ft}from\"./chunk.a0a5dece.js\";import{i as yt,E as Y}from\"./chunk.a6a47e72.js\";const gt=He({modelValue:{type:[Boolean,String,Number],default:!1},value:{type:[Boolean,String,Number],default:!1},disabled:{type:Boolean,default:!1},width:{type:[String,Number],default:\"\"},inlinePrompt:{type:Boolean,default:!1},activeIcon:{type:$e},inactiveIcon:{type:$e},activeText:{type:String,default:\"\"},inactiveText:{type:String,default:\"\"},activeColor:{type:String,default:\"\"},inactiveColor:{type:String,default:\"\"},borderColor:{type:String,default:\"\"},activeValue:{type:[Boolean,String,Number],default:!0},inactiveValue:{type:[Boolean,String,Number],default:!1},name:{type:String,default:\"\"},validateEvent:{type:Boolean,default:!0},id:String,loading:{type:Boolean,default:!1},beforeChange:{type:Ye(Function)},size:{type:String,validator:yt},tabindex:{type:[String,Number]}}),Et={[ye]:s=>ce(s)||he(s)||pe(s),[ge]:s=>ce(s)||he(s)||pe(s),[Ee]:s=>ce(s)||he(s)||pe(s)},bt=[\"onClick\"],Ct=[\"id\",\"aria-checked\",\"aria-disabled\",\"name\",\"true-value\",\"false-value\",\"disabled\",\"tabindex\",\"onKeydown\"],Dt=[\"aria-hidden\"],Bt=[\"aria-hidden\"],kt=[\"aria-hidden\"],wt=[\"aria-hidden\"],xt={name:\"ElSwitch\"},$t=j(le(K({},xt),{props:gt,emits:Et,setup(s,{expose:e,emit:n}){const a=s,b=\"ElSwitch\",A=De(),{formItem:k}=Ze(),$=Je(),u=Qe(\"switch\");Xe({from:'\"value\"',replacement:'\"model-value\" or \"v-model\"',scope:b,version:\"2.3.0\",ref:\"https://element-plus.org/en-US/component/switch.html#attributes\",type:\"Attribute\"},B(()=>{var i;return!!((i=A.vnode.props)!=null&&i.value)}));const{inputId:h}=et(a,{formItemContext:k}),f=tt(B(()=>a.loading)),o=Z(a.modelValue!==!1),p=Z(),F=Z(),w=B(()=>[u.b(),u.m($.value),u.is(\"disabled\",f.value),u.is(\"checked\",E.value)]),C=B(()=>({width:at(a.width)}));me(()=>a.modelValue,()=>{o.value=!0}),me(()=>a.value,()=>{o.value=!1});const m=B(()=>o.value?a.modelValue:a.value),E=B(()=>m.value===a.activeValue);[a.activeValue,a.inactiveValue].includes(m.value)||(n(ye,a.inactiveValue),n(ge,a.inactiveValue),n(Ee,a.inactiveValue)),me(E,i=>{var T;p.value.checked=i,a.validateEvent&&((T=k==null?void 0:k.validate)==null||T.call(k,\"change\").catch(I=>nt()))});const V=()=>{const i=E.value?a.inactiveValue:a.activeValue;n(ye,i),n(ge,i),n(Ee,i),it(()=>{p.value.checked=E.value})},O=()=>{if(f.value)return;const{beforeChange:i}=a;if(!i){V();return}const T=i();[Ae(T),ce(T)].includes(!0)||ct(b,\"beforeChange must return type `Promise<boolean>` or `boolean`\"),Ae(T)?T.then(ne=>{ne&&V()}).catch(ne=>{}):T&&V()},q=B(()=>u.cssVarBlock(K(K(K({},a.activeColor?{\"on-color\":a.activeColor}:null),a.inactiveColor?{\"off-color\":a.inactiveColor}:null),a.borderColor?{\"border-color\":a.borderColor}:null))),L=()=>{var i,T;(T=(i=p.value)==null?void 0:i.focus)==null||T.call(i)};return ot(()=>{p.value.checked=E.value}),e({focus:L,checked:E}),(i,T)=>(d(),D(\"div\",{class:P(t(w)),style:Se(t(q)),onClick:Ie(O,[\"prevent\"])},[r(\"input\",{id:t(h),ref_key:\"input\",ref:p,class:P(t(u).e(\"input\")),type:\"checkbox\",role:\"switch\",\"aria-checked\":t(E),\"aria-disabled\":t(f),name:i.name,\"true-value\":i.activeValue,\"false-value\":i.inactiveValue,disabled:t(f),tabindex:i.tabindex,onChange:V,onKeydown:st(O,[\"enter\"])},null,42,Ct),!i.inlinePrompt&&(i.inactiveIcon||i.inactiveText)?(d(),D(\"span\",{key:0,class:P([t(u).e(\"label\"),t(u).em(\"label\",\"left\"),t(u).is(\"active\",!t(E))])},[i.inactiveIcon?(d(),x(t(J),{key:0},{default:_(()=>[(d(),x(ie(i.inactiveIcon)))]),_:1})):M(\"v-if\",!0),!i.inactiveIcon&&i.inactiveText?(d(),D(\"span\",{key:1,\"aria-hidden\":t(E)},z(i.inactiveText),9,Dt)):M(\"v-if\",!0)],2)):M(\"v-if\",!0),r(\"span\",{ref_key:\"core\",ref:F,class:P(t(u).e(\"core\")),style:Se(t(C))},[i.inlinePrompt?(d(),D(\"div\",{key:0,class:P(t(u).e(\"inner\"))},[i.activeIcon||i.inactiveIcon?(d(),D(H,{key:0},[i.activeIcon?(d(),x(t(J),{key:0,class:P([t(u).is(\"icon\"),t(E)?t(u).is(\"show\"):t(u).is(\"hide\")])},{default:_(()=>[(d(),x(ie(i.activeIcon)))]),_:1},8,[\"class\"])):M(\"v-if\",!0),i.inactiveIcon?(d(),x(t(J),{key:1,class:P([t(u).is(\"icon\"),t(E)?t(u).is(\"hide\"):t(u).is(\"show\")])},{default:_(()=>[(d(),x(ie(i.inactiveIcon)))]),_:1},8,[\"class\"])):M(\"v-if\",!0)],64)):i.activeText||i.inactiveIcon?(d(),D(H,{key:1},[i.activeText?(d(),D(\"span\",{key:0,class:P([t(u).is(\"text\"),t(E)?t(u).is(\"show\"):t(u).is(\"hide\")]),\"aria-hidden\":!t(E)},z(i.activeText.substring(0,3)),11,Bt)):M(\"v-if\",!0),i.inactiveText?(d(),D(\"span\",{key:1,class:P([t(u).is(\"text\"),t(E)?t(u).is(\"hide\"):t(u).is(\"show\")]),\"aria-hidden\":t(E)},z(i.inactiveText.substring(0,3)),11,kt)):M(\"v-if\",!0)],64)):M(\"v-if\",!0)],2)):M(\"v-if\",!0),r(\"div\",{class:P(t(u).e(\"action\"))},[i.loading?(d(),x(t(J),{key:0,class:P(t(u).is(\"loading\"))},{default:_(()=>[g(t(ut))]),_:1},8,[\"class\"])):M(\"v-if\",!0)],2)],6),!i.inlinePrompt&&(i.activeIcon||i.activeText)?(d(),D(\"span\",{key:1,class:P([t(u).e(\"label\"),t(u).em(\"label\",\"right\"),t(u).is(\"active\",t(E))])},[i.activeIcon?(d(),x(t(J),{key:0},{default:_(()=>[(d(),x(ie(i.activeIcon)))]),_:1})):M(\"v-if\",!0),!i.activeIcon&&i.activeText?(d(),D(\"span\",{key:1,\"aria-hidden\":!t(E)},z(i.activeText),9,wt)):M(\"v-if\",!0)],2)):M(\"v-if\",!0)],14,bt))}}));var St=lt($t,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/switch/src/switch.vue\"]]);const ze=rt(St),At={class:\"file-checkbox\"},Tt=[\"value\"],It=[\"title\"],Pt={class:\"thumbnail\"},Vt={class:\"file-name\"},Ot={class:\"file-date\"},Mt={class:\"file-type\"},Nt={class:\"file-size\"},zt=j({__name:\"file\",props:{file:{type:Object,required:!0},index:{type:Number,required:!0}},setup(s){const e=s,n=ve.ComputeSize,a=ae(),b=re(),A=ee(),k=B(()=>[{name:\"\\u6253\\u5F00\",f:O},{name:\"\\u7F16\\u8F91\",f:L},{name:\"\\u590D\\u5236\",f:E},{name:\"\\u526A\\u5207\",f:V},{name:\"\\u91CD\\u547D\\u540D\",f:F},{name:\"\\u4E0B\\u8F7D\",disabled:e.file.fileType===\"dir\",f:q},{name:\"\\u5220\\u9664\",f:C}]),$=B(()=>a.checknoxEntries.indexOf(e.file.rootPath)!=-1),u=B(()=>a.copy.type==\"move\"&&a.copy.values.indexOf(e.file.rootPath)!=-1),h=be.getFileType,f=l=>{l.target},o=l=>{const c=e.index;if(l!=c&&e.file.fileType===\"dir\"){const y=[];let U=\"\";if(a.entries[l]){const S=a.entries[l];y.push(`/local${S.rootPath}`)}a.entries[c]&&(U=`/local${a.entries[c].rootPath}`),p(y,U)}},p=(l,c)=>N(this,null,function*(){try{const y=yield W.File.Basic.Move.POST({paths:l,destination:c});if(y.data){const{success:U,error:S}=y.data;U===0&&(v.Success(\"\\u79FB\\u52A8\\u6210\\u529F\"),a.reload()),S&&v.Warning(S)}}catch(y){v.Error(`${y}`)}}),F=()=>{const l=e.file;Y.prompt(`\\u6B63\\u5728\\u4FEE\\u6539 ${l.name} ,\\u8BF7\\u8F93\\u5165\\u65B0\\u540D\\u79F0`,\"\\u63D0\\u793A\",{confirmButtonText:\"\\u786E\\u5B9A\",cancelButtonText:\"\\u53D6\\u6D88\",inputValue:l.name,inputValidator(c){return c==\"\"?\"\\u540D\\u79F0\\u4E0D\\u80FD\\u4E3A\\u7A7A\":!0}}).then(({value:c})=>{w(c)}).catch(()=>{})},w=l=>N(this,null,function*(){const c=e.file,y=[];let U=\"\";if(c.rootPath){y.push(\"/local\"+c.rootPath);const S=c.rootPath.split(\"/\");U=\"/local\"+S.splice(0,S.length-1).join(\"/\")}try{const S=yield W.File.Basic.Move.POST({paths:y,destination:U,singleFileName:l});if(S.data){const{success:se,error:ue}=S.data;se===0&&(v.Success(\"\\u91CD\\u547D\\u540D\\u6587\\u4EF6\\u4FEE\\u6539\\u6210\\u529F\"),a.reload()),ue&&v.Warning(ue)}}catch(S){v.Error(`${S}`)}}),C=()=>{const l=e.file,c=Z(!1);Y({title:\"\\u63D0\\u793A\",confirmButtonText:\"\\u786E\\u8BA4\",cancelButtonText:\"\\u53D6\\u6D88\",type:\"warning\",showCancelButton:!0,message:()=>R(\"div\",null,[R(\"p\",null,`\\u662F\\u5426\\u5220\\u9664 ${l.name} \\u8BE5\\u6587\\u4EF6?`),R(\"label\",{style:{display:\"flex\",alignItems:\"center\"}},[R(\"span\",{style:{marginRight:\"1rem\"}},\"\\u4E0D\\u7ECF\\u8FC7\\u56DE\\u6536\\u7AD9\\u5F3A\\u5236\\u5220\\u9664?\"),R(ze,{modelValue:c.value,\"onUpdate:modelValue\":y=>{c.value=y==!0}})])])}).then(()=>N(this,null,function*(){m(l,c.value)})).catch(()=>{})},m=(l,c)=>N(this,null,function*(){const y=[];if(l.rootPath!=null&&y.push(\"/local\"+l.rootPath),y.length==0)return;const U=Pe(\"\\u5220\\u9664\\u4E2D\");try{const S={paths:y};c&&(S.force=!0);const se=yield W.File.Basic.Remove.POST(S);if(se.data){const{success:ue,error:ke}=se.data;ke&&v.Warning(ke),ue===0&&(v.Success(\"\\u5220\\u9664\\u6210\\u529F\"),a.reload())}}catch(S){}finally{U.Close()}}),E=()=>{const l=e.file,c=[];l.rootPath&&c.push(l.rootPath),a.setCopy({type:\"copy\",values:c}),v.Success(\"\\u5DF2\\u590D\\u5236\")},V=()=>{const l=e.file,c=[];l.rootPath&&c.push(l.rootPath),a.setCopy({type:\"move\",values:c}),v.Success(\"\\u5DF2\\u526A\\u5207\")},O=()=>{const l=e.file;if(l.fileType===\"dir\"){i(l);return}switch(l.iconType){case\"image\":T();break;case\"doc\":I(l);break;case\"video\":qe(l);break;case\"music\":Re(l);break}},q=()=>{const l=e.file;window.open(l.getDownloadUrl()+\"?binary=true\",\"_blank\")},L=()=>{const l=e.file;ne(l)},i=l=>{let c=\"/\";l.rootPath===void 0?c=`/${l.name}`:c=l.rootPath,b.push({query:le(K({},A.query),{path:c})})},T=()=>{a.previewImage.values=be.getEntriesImages(a.entries,e.index),a.previewImage.enable=!0},I=l=>{const c=l.getSuffixName();let y=null;switch(c){case\"pdf\":y=l.getDownloadUrl();break;case\"txt\":case\"md\":case\"js\":case\"yaml\":case\"yam\":case\"css\":case\"ts\":case\"json\":case\"html\":y=ve.getLocationPathname(`editor?path=${l.rootPath}&format=text`);break}oe(y)},ne=l=>{let c=l.fileType===\"dir\"?\"dir\":\"text\";const y=ve.getLocationPathname(`editor?path=${l.rootPath}&format=${c}`);oe(y)},oe=l=>{if(l==null)return;const c=window.open(\"about:blank\");c&&(c.location.href=l)},qe=l=>{oe(l.getDownloadUrl())},Re=l=>{oe(l.getDownloadUrl())};return(l,c)=>{const y=G(\"thumbnail\");return d(),x(mt,{class:\"file\",draggable:\"true\",checkbox:t($),move:t(u),index:s.index,onChange:o},{default:_(()=>[g(Ne,{class:\"file-container\",list:t(k)},{default:_(()=>[r(\"div\",At,[Ve(r(\"input\",{type:\"checkbox\",value:s.file.rootPath,\"onUpdate:modelValue\":c[0]||(c[0]=U=>t(a).checknoxEntries=U),onChange:f},null,40,Tt),[[Oe,t(a).checknoxEntries]])]),r(\"div\",{class:\"file-info\",onClick:c[1]||(c[1]=Ie(U=>O(),[\"prevent\"])),title:s.file.name},[r(\"div\",Pt,[g(y,{file:s.file},null,8,[\"file\"])]),r(\"div\",Vt,z(s.file.name),1)],8,It),r(\"div\",Ot,z(s.file.modifiedTime),1),r(\"div\",Mt,z(t(h)(s.file.iconType)),1),r(\"div\",Nt,z(t(n)(s.file.size)),1)]),_:1},8,[\"list\"])]),_:1},8,[\"checkbox\",\"move\",\"index\"])}}}),Ut=s=>(de(\"data-v-412809e3\"),s=s(),fe(),s),qt={class:\"notfound\"},Rt=Ut(()=>r(\"p\",null,\"\\u5F53\\u524D\\u76EE\\u5F55\\u6CA1\\u6709\\u6587\\u4EF6\\u54E6\",-1)),Wt=j({__name:\"notfound\",setup(s){const e=\"/luci-static/linkeasefile/icons/notfound.png\";return(n,a)=>(d(),D(\"div\",qt,[r(\"img\",{src:e,alt:\"\"}),Rt]))}});const Lt=te(Wt,[[\"__scopeId\",\"data-v-412809e3\"]]),jt=j({__name:\"files\",setup(s){return N(this,null,function*(){let e,n;const a=ae(),b=ee();re();const{roots:A,path:k}=b.query,$=B(()=>a.config),u=()=>N(this,null,function*(){a.checknoxEntries=[];let h=[];try{const f={path:`/local${k||\"/\"}`,order:Te.order.get(),orderBy:Te.orderBy.get()};a.config.filter&&a.config.filter!=\"default\"&&(f.filter=a.config.filter);const o=yield W.File.Basic.List.POST(f);if(o.data){const{success:p,result:F,error:w}=o.data;p==0&&(h=F.entries||[]),w&&v.Warning(w)}}catch(f){v.Error(`${f}`),console.log(f)}finally{a.entries=be.FileBasicEntryArray(h),h=[]}});return[e,n]=dt(()=>u()),yield e,n(),(h,f)=>t(a).entries.length>0?(d(),D(\"div\",{key:0,class:P([\"files\",t($).model?\"list\":\"model\"])},[(d(!0),D(H,null,X(t(a).entries,(o,p)=>(d(),x(zt,{file:o,index:p},null,8,[\"file\",\"index\"]))),256))],2)):(d(),x(Lt,{key:1,entries:t(a).entries},null,8,[\"entries\"]))})}});const Kt=te(jt,[[\"__scopeId\",\"data-v-0147104b\"]]),Ue=s=>(de(\"data-v-894e5982\"),s=s(),fe(),s),Gt={class:\"f\"},Ht={key:0,class:\"setting\"},Yt=Ue(()=>r(\"em\",null,null,-1)),Zt=Ue(()=>r(\"em\",null,null,-1)),Jt=j({__name:\"checkbox\",setup(s){const e=Z(!1),n=ae(),a=B(()=>(e.value=n.checknoxEntries.length>0,n.checknoxEntries||[])),b=()=>{if(n.entries.length==0){e.value=!1;return}if(n.checknoxEntries.length>0)n.checknoxEntries=[];else{const h=[];let f=n.entries.length;for(let o=0;o<f;o++)h.push(n.entries[o].rootPath);n.checknoxEntries=h}e.value=n.checknoxEntries.length>0},A=()=>{const h=n.checknoxEntries;if(h.length==0)return;const f=Z(!1);Y({title:\"\\u63D0\\u793A\",confirmButtonText:\"\\u786E\\u8BA4\",cancelButtonText:\"\\u53D6\\u6D88\",type:\"warning\",showCancelButton:!0,message:()=>R(\"div\",null,[R(\"p\",null,`\\u662F\\u5426\\u5220\\u9664\\u9009\\u4E2D\\u7684 ${h.length} \\u4E2A\\u6587\\u4EF6/\\u6587\\u4EF6\\u5939?`),R(\"label\",{style:{display:\"flex\",alignItems:\"center\"}},[R(\"span\",{style:{marginRight:\"1rem\"}},\"\\u4E0D\\u7ECF\\u8FC7\\u56DE\\u6536\\u7AD9\\u5F3A\\u5236\\u5220\\u9664?\"),R(ze,{modelValue:f.value,\"onUpdate:modelValue\":o=>{f.value=o==!0}})])])}).then(()=>N(this,null,function*(){const o=[];h.forEach(p=>{p!==void 0&&o.push(\"/local\"+p)}),k(o,f.value)})).catch(()=>{})},k=(h,f)=>N(this,null,function*(){if(h.length==0)return;const o=Pe(\"\\u5220\\u9664\\u4E2D\");try{const p={paths:h};f&&(p.force=!0);const F=yield W.File.Basic.Remove.POST(p);if(F.data){const{success:w,error:C}=F.data;C&&v.Warning(C),w===0&&(v.Success(\"\\u5220\\u9664\\u6210\\u529F\"),n.reload())}}catch(p){}finally{o.Close()}}),$=()=>{n.setCopy({type:\"copy\",values:n.checknoxEntries}),v.Success(\"\\u5DF2\\u590D\\u5236\"),n.checknoxEntries=[]},u=()=>{n.setCopy({type:\"move\",values:n.checknoxEntries}),v.Success(\"\\u5DF2\\u526A\\u5207\"),n.checknoxEntries=[]};return(h,f)=>(d(),D(\"div\",Gt,[r(\"label\",null,[Ve(r(\"input\",{type:\"checkbox\",value:!1,\"onUpdate:modelValue\":f[0]||(f[0]=o=>e.value=o),onChange:b},null,544),[[Oe,e.value]]),r(\"span\",null,z(t(a).length>0?`\\u5DF2\\u9009\\u4E2D${t(a).length}\\u4E2A\\u6587\\u4EF6/\\u6587\\u4EF6\\u5939`:\"\\u5168\\u9009\"),1)]),t(a).length>0?(d(),D(\"div\",Ht,[r(\"button\",{onClick:f[1]||(f[1]=o=>A())},\"\\u5220\\u9664\"),Yt,r(\"button\",{onClick:f[2]||(f[2]=o=>$())},\"\\u590D\\u5236\"),Zt,r(\"button\",{onClick:f[3]||(f[3]=o=>u())},\"\\u526A\\u5207\")])):M(\"\",!0)]))}});const Qt=te(Jt,[[\"__scopeId\",\"data-v-894e5982\"]]),Xt=j({__name:\"nav\",setup(s){const e=ee(),n=re(),a=B(()=>e.query),b=B(()=>a.value.path||\"\"),A=B(()=>(b.value||\"\").split(\"/\")||[]),k=B(()=>{var u;return A.value&&A.value.length>0?(u=A.value)==null?void 0:u.splice(1):[]}),$=u=>{const h=k.value.slice(0,u+1);n.push({query:le(K({},e.query),{path:\"/\"+h.join(\"/\")})})};return(u,h)=>(d(),x(t(Me),{class:\"page-nav-container\"},{default:_(()=>[g(t(vt),{\"separator-icon\":t(ft),class:\"nav-breadcrumb\"},{default:_(()=>[(d(!0),D(H,null,X(t(k),(f,o)=>(d(),x(t(_t),{onClick:p=>$(o),class:\"nav-breadcrumb_item\"},{default:_(()=>[Ce(z(o==0?\"\\u6839\\u76EE\\u5F55\":f),1)]),_:2},1032,[\"onClick\"]))),256))]),_:1},8,[\"separator-icon\"])]),_:1}))}}),Be=s=>(de(\"data-v-3875e80d\"),s=s(),fe(),s),ea={class:\"tools\"},ta={class:\"tool-item\"},aa={class:\"tool-item\"},na={class:\"tool-item\"},oa=Be(()=>r(\"em\",null,null,-1)),sa=Be(()=>r(\"em\",null,null,-1)),ua={class:\"tool-item\"},la=Be(()=>r(\"em\",null,null,-1)),ia={class:\"tool-item\"},ca=j({__name:\"tools\",setup(s){const{proxy:e}=De(),n=ae(),a=ht(n.config),b=[{name:\"\\u540D\\u79F0\",label:\"filename\"},{name:\"\\u65F6\\u95F4\",label:\"date\"},{name:\"\\u5927\\u5C0F\",label:\"size\"},{name:\"\\u7C7B\\u578B\",label:\"filetype\"}],A=[{name:\"\\u9012\\u589E\",label:\"asc\"},{name:\"\\u9012\\u51CF\",label:\"desc\"}],k=[{name:\"\\u5168\\u90E8\",label:\"default\"},{name:\"\\u56FE\\u7247\",label:\"image\"},{name:\"\\u538B\\u7F29\\u6587\\u4EF6\",label:\"archive\"},{name:\"\\u89C6\\u9891\",label:\"video\"},{name:\"\\u97F3\\u4E50\",label:\"music\"},{name:\"\\u6587\\u6863\",label:\"doc\"},{name:\"\\u5176\\u5B83\",label:\"other\"}],$=ee(),u=B(()=>$.query.path),h=()=>{n.setConfigModel()},f=m=>{switch(m){case\"addFile\":o();break;case\"addDir\":p();break}},o=()=>{Y.prompt(\"\\u8BF7\\u8F93\\u5165\\u65B0\\u5EFA\\u6587\\u4EF6\\u540D\\u79F0\\uFF0C\\u8BF7\\u6CE8\\u610F\\u6587\\u4EF6\\u540D\\u79F0\\u907F\\u514D\\u8986\\u76D6\\u540C\\u540D\\u6587\\u4EF6\",\"\\u521B\\u5EFA\\u6587\\u4EF6\",{confirmButtonText:\"\\u786E\\u5B9A\",cancelButtonText:\"\\u53D6\\u6D88\",inputValidator(m){return m==\"\"?\"\\u540D\\u79F0\\u4E0D\\u80FD\\u4E3A\\u7A7A\":!0}}).then(E=>N(this,[E],function*({value:m}){const V=new File([],m);try{const O=yield W.File.Basic.Upload.POST({destination:\"/local\"+u.value,files:[V]});if(O.data){const{success:q,error:L}=O.data;L&&v.Warning(L),q===0&&(v.Success(\"\\u65B0\\u5EFA\\u6210\\u529F\"),n.reload())}}catch(O){v.Error(`${O}`)}})).catch(()=>{})},p=()=>{Y.prompt(\"\\u8BF7\\u8F93\\u5165\\u65B0\\u5EFA\\u6587\\u4EF6\\u5939\\u540D\\u79F0\\uFF0C\\u8BF7\\u6CE8\\u610F\\u6587\\u4EF6\\u540D\\u79F0\\u907F\\u514D\\u8986\\u76D6\\u540C\\u540D\\u6587\\u4EF6\",\"\\u521B\\u5EFA\\u6587\\u4EF6\\u5939\",{confirmButtonText:\"\\u786E\\u5B9A\",cancelButtonText:\"\\u53D6\\u6D88\",inputValidator(m){return m==\"\"?\"\\u540D\\u79F0\\u4E0D\\u80FD\\u4E3A\\u7A7A\":!0}}).then(E=>N(this,[E],function*({value:m}){try{const V=yield W.File.Basic.createFolder.POST({path:\"/local\"+u.value+\"/\"+m});if(V.data){const{success:O,error:q}=V.data;q&&v.Warning(q),O===0&&(v.Success(\"\\u65B0\\u5EFA\\u6210\\u529F\"),n.reload())}}catch(V){v.Error(`${V}`)}})).catch(()=>{})},F=m=>{switch(m){case\"date\":case\"size\":case\"filetype\":case\"filename\":n.setConfigOrder(m);break;case\"desc\":case\"asc\":n.setConfigOrderBy(m);break}n.reload()},w=m=>{n.setConfigFilter(m),n.reload()},C=()=>{e==null||e.$uploadFile({destination:u.value}).then(()=>{n.reload()}).catch(()=>{})};return(m,E)=>{const V=G(\"icon-add-file\"),O=G(\"icon-upload-file\"),q=G(\"icon-sort-file\"),L=G(\"icon-category\"),i=G(\"icon-model-file\"),T=G(\"icon-list-file\");return d(),D(\"div\",ea,[r(\"div\",ta,[g(t(Fe),{onCommand:f},{dropdown:_(()=>[g(t(_e),null,{default:_(()=>[g(t(Q),{command:\"addFile\"},{default:_(()=>[Ce(\"\\u65B0\\u5EFA\\u6587\\u4EF6\")]),_:1}),g(t(Q),{command:\"addDir\"},{default:_(()=>[Ce(\"\\u65B0\\u5EFA\\u6587\\u4EF6\\u5939\")]),_:1})]),_:1})]),default:_(()=>[r(\"button\",null,[g(V)])]),_:1})]),r(\"div\",aa,[r(\"button\",{onClick:C},[g(O)])]),r(\"div\",na,[g(t(Fe),{onCommand:F},{dropdown:_(()=>[g(t(_e),null,{default:_(()=>[(d(),D(H,null,X(b,I=>g(t(Q),{class:P([\"sort-item\",{on:I.label==a.order}]),command:I.label},{default:_(()=>[oa,r(\"span\",null,z(I.name),1)]),_:2},1032,[\"class\",\"command\"])),64)),(d(),D(H,null,X(A,I=>g(t(Q),{class:P([\"sort-item\",{on:I.label==a.orderBy}]),command:I.label},{default:_(()=>[sa,r(\"span\",null,z(I.name),1)]),_:2},1032,[\"class\",\"command\"])),64))]),_:1})]),default:_(()=>[r(\"button\",null,[g(q)])]),_:1})]),r(\"div\",ua,[g(t(Fe),{onCommand:w},{dropdown:_(()=>[g(t(_e),null,{default:_(()=>[(d(),D(H,null,X(k,I=>g(t(Q),{class:P([\"sort-item\",{on:I.label==a.filter}]),command:I.label},{default:_(()=>[la,r(\"span\",null,z(I.name),1)]),_:2},1032,[\"class\",\"command\"])),64))]),_:1})]),default:_(()=>[r(\"button\",null,[g(L)])]),_:1})]),r(\"div\",ia,[r(\"button\",{onClick:E[0]||(E[0]=I=>h())},[a.model?(d(),x(i,{key:0})):(d(),x(T,{key:1}))])])])}}});const ra=te(ca,[[\"__scopeId\",\"data-v-3875e80d\"]]),da=s=>(de(\"data-v-92a18536\"),s=s(),fe(),s),fa={class:\"page-tool-container\"},ha=da(()=>r(\"div\",{class:\"auto\"},null,-1)),pa=j({__name:\"index\",setup(s){const e=ae(),n=ee();re();const{proxy:a}=De(),b=B(()=>n.query.path||\"\"),A=B(()=>{const o=b.value;return e.isCopy&&o!=\"\"&&o!=\"/\"}),k=B(()=>{const o=e.config;return[{name:\"\\u67E5\\u770B\",children:[{name:\"\\u5217\\u8868\",active:o.model,f:e.setConfigModel},{name:\"\\u7565\\u7F29\\u56FE\",active:!o.model,f:e.setConfigModel}]},{name:\"\\u6392\\u5E8F\\u65B9\\u5F0F\",children:[{name:\"\\u540D\\u79F0\",active:o.order==\"filename\",f:()=>{e.setConfigOrder(\"filename\"),e.reload()}},{name:\"\\u65F6\\u95F4\",active:o.order==\"date\",f:()=>{e.setConfigOrder(\"date\"),e.reload()}},{name:\"\\u5927\\u5C0F\",active:o.order==\"size\",f:()=>{e.setConfigOrder(\"size\"),e.reload()}},{name:\"\\u7C7B\\u578B\",active:o.order==\"filetype\",f:()=>{e.setConfigOrder(\"filetype\"),e.reload()}},{name:\"\\u9012\\u589E\",active:o.orderBy==\"asc\",f:()=>{e.setConfigOrderBy(\"asc\"),e.reload()}},{name:\"\\u9012\\u51CF\",active:o.orderBy==\"desc\",f:()=>{e.setConfigOrderBy(\"desc\"),e.reload()}}]},{name:\"\\u6587\\u4EF6\\u8FC7\\u6EE4\",children:[{name:\"\\u5168\\u90E8\",active:o.filter==\"default\",f:()=>{e.setConfigFilter(\"default\"),e.reload()}},{name:\"\\u56FE\\u7247\",active:o.filter==\"image\",f:()=>{e.setConfigFilter(\"image\"),e.reload()}},{name:\"\\u538B\\u7F29\\u6587\\u4EF6\",active:o.filter==\"archive\",f:()=>{e.setConfigFilter(\"archive\"),e.reload()}},{name:\"\\u89C6\\u9891\",active:o.filter==\"video\",f:()=>{e.setConfigFilter(\"video\"),e.reload()}},{name:\"\\u97F3\\u4E50\",active:o.filter==\"music\",f:()=>{e.setConfigFilter(\"music\"),e.reload()}},{name:\"\\u6587\\u6863\",active:o.filter==\"doc\",f:()=>{e.setConfigFilter(\"doc\"),e.reload()}},{name:\"\\u5176\\u5B83\",active:o.filter==\"other\",f:()=>{e.setConfigFilter(\"other\"),e.reload()}}]},{name:\"\\u5237\\u65B0\",f:()=>{e.reload()}},{name:\"\\u7C98\\u8D34\",disabled:!A.value,f:$},{name:\"\\u91CD\\u65B0\\u52A0\\u8F7D\",f:()=>{location.reload()}}]}),$=()=>{const o=e.copy,p=o.values,F=p.length;if(F==0)return;const w=b.value;if(p.indexOf(w)!=-1){pt.Warning(\"\\u4E0D\\u652F\\u6301\\u5D4C\\u5957\\u64CD\\u4F5C\");return}switch(o.type){case\"copy\":Y.confirm(`\\u662F\\u5426\\u590D\\u5236\\u9009\\u4E2D\\u7684 ${F} \\u4E2A\\u6587\\u4EF6/\\u6587\\u4EF6\\u5939\\u5230\\u5F53\\u524D\\u76EE\\u5F55?`,\"\\u63D0\\u793A\",{confirmButtonText:\"\\u786E\\u8BA4\",cancelButtonText:\"\\u53D6\\u6D88\",type:\"warning\"}).then(()=>{const C=[];for(let m=0;m<F;m++)C.push(\"/local\"+p[m]);u(C,\"/local\"+w)}).catch(()=>{});break;case\"move\":Y.confirm(`\\u662F\\u5426\\u79FB\\u52A8\\u9009\\u4E2D\\u7684 ${F} \\u4E2A\\u6587\\u4EF6/\\u6587\\u4EF6\\u5939\\u5230\\u5F53\\u524D\\u76EE\\u5F55?`,\"\\u63D0\\u793A\",{confirmButtonText:\"\\u786E\\u8BA4\",cancelButtonText:\"\\u53D6\\u6D88\",type:\"warning\"}).then(()=>{const C=[];for(let m=0;m<F;m++)C.push(\"/local\"+p[m]);h(C,\"/local\"+w)}).catch(()=>{});break}e.setCopy({type:\"copy\",values:[]})},u=(o,p)=>N(this,null,function*(){try{const F=yield W.File.Basic.Copy.POST({paths:o,destination:p});if(F.data){const{success:w,error:C}=F.data;w===0&&(v.Success(\"\\u590D\\u5236\\u6210\\u529F\"),e.reload()),C&&v.Warning(C)}}catch(F){v.Error(`${F}`)}}),h=(o,p)=>N(this,null,function*(){try{const F=yield W.File.Basic.Move.POST({paths:o,destination:p});if(F.data){const{success:w,error:C}=F.data;w===0&&(v.Success(\"\\u79FB\\u52A8\\u6210\\u529F\"),e.reload()),C&&v.Warning(C)}}catch(F){v.Error(`${F}`)}}),f=o=>{a==null||a.$uploadFile({files:o,destination:b.value}).then(()=>{e.reload()}).catch(()=>{})};return(o,p)=>(d(),x(Ft,{id:\"page\",onChange:f},{default:_(()=>[g(Ne,{class:\"page-container\",list:t(k)},{default:_(()=>[g(Xt),r(\"div\",fa,[g(Qt),ha,g(ra)]),g(t(Me),{class:\"page-body-container\"},{default:_(()=>[(d(),x(Kt,{key:`${t(b)}`}))]),_:1})]),_:1},8,[\"list\"])]),_:1}))}});const ga=te(pa,[[\"__scopeId\",\"data-v-92a18536\"]]);export{ga as default};\n"
  },
  {
    "path": "luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.a0a5dece.js",
    "content": "var Ae=Object.defineProperty,Ge=Object.defineProperties;var Ye=Object.getOwnPropertyDescriptors;var me=Object.getOwnPropertySymbols;var ze=Object.prototype.hasOwnProperty,He=Object.prototype.propertyIsEnumerable;var ve=(e,n,s)=>n in e?Ae(e,n,{enumerable:!0,configurable:!0,writable:!0,value:s}):e[n]=s,P=(e,n)=>{for(var s in n||(n={}))ze.call(n,s)&&ve(e,s,n[s]);if(me)for(var s of me(n))He.call(n,s)&&ve(e,s,n[s]);return e},V=(e,n)=>Ge(e,Ye(n));import{b as W,ad as he,e as R,h as Z,r as h,aC as J,p as Ie,q as v,F as y,S as T,z as A,A as g,_ as L,d as K,aD as k,aE as Ue,y as ne,t as Y,x as E,L as Ee,E as le,a4 as se,as as ae,Y as Ce,aF as ie,aG as Je,W as _,n as S,aH as Ve,aI as X,w as je,V as We,a1 as $,v as N,aJ as qe,aK as Xe,aL as ye,o as Qe,aM as Te,a2 as Ze,aN as xe,u as en,ao as nn,ak as on,aO as tn,aP as Q,C as j,aQ as $e,I as ee,aR as rn,R as ke,a7 as Se,aA as sn,O as ge,B as re,a3 as ln,a5 as an,a6 as un}from\"./index.js\";import{c as M,u as cn,a as dn,b as pn,O as fn,w as be}from\"./chunk.a6a47e72.js\";const Oe=Symbol(\"breadcrumbKey\"),mn=W({separator:{type:String,default:\"/\"},separatorIcon:{type:he}}),vn={name:\"ElBreadcrumb\"},gn=R(V(P({},vn),{props:mn,setup(e){const n=e,s=Z(\"breadcrumb\"),r=h();return J(Oe,n),Ie(()=>{const l=r.value.querySelectorAll(`.${s.e(\"item\")}`);l.length&&l[l.length-1].setAttribute(\"aria-current\",\"page\")}),(l,p)=>(v(),y(\"div\",{ref_key:\"breadcrumb\",ref:r,class:A(g(s).b()),\"aria-label\":\"Breadcrumb\",role:\"navigation\"},[T(l.$slots,\"default\")],2))}}));var bn=L(gn,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/breadcrumb/src/breadcrumb.vue\"]]);const _n=W({to:{type:K([String,Object]),default:\"\"},replace:{type:Boolean,default:!1}}),wn={name:\"ElBreadcrumbItem\"},hn=R(V(P({},wn),{props:_n,setup(e){const n=e,s=ae(),r=k(Oe,void 0),l=Z(\"breadcrumb\"),{separator:p,separatorIcon:i}=Ue(r),t=s.appContext.config.globalProperties.$router,o=h(),d=()=>{!n.to||!t||(n.replace?t.replace(n.to):t.push(n.to))};return(u,c)=>(v(),y(\"span\",{class:A(g(l).e(\"item\"))},[ne(\"span\",{ref_key:\"link\",ref:o,class:A([g(l).e(\"inner\"),g(l).is(\"link\",!!u.to)]),role:\"link\",onClick:d},[T(u.$slots,\"default\")],2),g(i)?(v(),Y(g(le),{key:0,class:A(g(l).e(\"separator\"))},{default:E(()=>[(v(),Y(Ee(g(i))))]),_:1},8,[\"class\"])):(v(),y(\"span\",{key:1,class:A(g(l).e(\"separator\")),role:\"presentation\"},se(g(p)),3))],2))}}));var De=L(hn,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/breadcrumb/src/breadcrumb-item.vue\"]]);const ko=Ce(bn,{BreadcrumbItem:De}),So=ie(De),In={inheritAttrs:!1};function En(e,n,s,r,l,p){return T(e.$slots,\"default\")}var Cn=L(In,[[\"render\",En],[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/collection/src/collection.vue\"]]);const yn={name:\"ElCollectionItem\",inheritAttrs:!1};function Tn(e,n,s,r,l,p){return T(e.$slots,\"default\")}var $n=L(yn,[[\"render\",Tn],[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/collection/src/collection-item.vue\"]]);const Fe=\"data-el-collection-item\",Ne=e=>{const n=`El${e}Collection`,s=`${n}Item`,r=Symbol(n),l=Symbol(s),p=V(P({},Cn),{name:n,setup(){const t=h(null),o=new Map;J(r,{itemMap:o,getItems:()=>{const u=g(t);if(!u)return[];const c=Array.from(u.querySelectorAll(`[${Fe}]`));return[...o.values()].sort((a,m)=>c.indexOf(a.ref)-c.indexOf(m.ref))},collectionRef:t})}}),i=V(P({},$n),{name:s,setup(t,{attrs:o}){const d=h(null),u=k(r,void 0);J(l,{collectionItemRef:d}),Ie(()=>{const c=g(d);c&&u.itemMap.set(c,P({ref:c},o))}),Je(()=>{const c=g(d);u.itemMap.delete(c)})}});return{COLLECTION_INJECTION_KEY:r,COLLECTION_ITEM_INJECTION_KEY:l,ElCollection:p,ElCollectionItem:i}},kn=W({style:{type:K([String,Array,Object])},currentTabId:{type:K(String)},defaultCurrentTabId:String,loop:Boolean,dir:{type:String,values:[\"ltr\",\"rtl\"],default:\"ltr\"},orientation:{type:K(String)},onBlur:Function,onFocus:Function,onMousedown:Function}),{ElCollection:Sn,ElCollectionItem:On,COLLECTION_INJECTION_KEY:ue,COLLECTION_ITEM_INJECTION_KEY:Dn}=Ne(\"RovingFocusGroup\"),ce=Symbol(\"elRovingFocusGroup\"),Re=Symbol(\"elRovingFocusGroupItem\"),Fn={ArrowLeft:\"prev\",ArrowUp:\"prev\",ArrowRight:\"next\",ArrowDown:\"next\",PageUp:\"first\",Home:\"first\",PageDown:\"last\",End:\"last\"},Nn=(e,n)=>{if(n!==\"rtl\")return e;switch(e){case _.right:return _.left;case _.left:return _.right;default:return e}},Rn=(e,n,s)=>{const r=Nn(e.key,s);if(!(n===\"vertical\"&&[_.left,_.right].includes(r))&&!(n===\"horizontal\"&&[_.up,_.down].includes(r)))return Fn[r]},Bn=(e,n)=>e.map((s,r)=>e[(r+n)%e.length]),de=e=>{const{activeElement:n}=document;for(const s of e)if(s===n||(s.focus(),n!==document.activeElement))return},_e=\"currentTabIdChange\",we=\"rovingFocusGroup.entryFocus\",Pn={bubbles:!1,cancelable:!0},Kn=R({name:\"ElRovingFocusGroupImpl\",inheritAttrs:!1,props:kn,emits:[_e,\"entryFocus\"],setup(e,{emit:n}){var s;const r=h((s=e.currentTabId||e.defaultCurrentTabId)!=null?s:null),l=h(!1),p=h(!1),i=h(null),{getItems:t}=k(ue,void 0),o=S(()=>[{outline:\"none\"},e.style]),d=f=>{n(_e,f)},u=()=>{l.value=!0},c=M(f=>{var w;(w=e.onMousedown)==null||w.call(e,f)},()=>{p.value=!0}),I=M(f=>{var w;(w=e.onFocus)==null||w.call(e,f)},f=>{const w=!g(p),{target:G,currentTarget:O}=f;if(G===O&&w&&!g(l)){const z=new Event(we,Pn);if(O==null||O.dispatchEvent(z),!z.defaultPrevented){const C=t().filter(F=>F.focusable),B=C.find(F=>F.active),D=C.find(F=>F.id===g(r)),U=[B,D,...C].filter(Boolean).map(F=>F.ref);de(U)}}p.value=!1}),a=M(f=>{var w;(w=e.onBlur)==null||w.call(e,f)},()=>{l.value=!1}),m=(...f)=>{n(\"entryFocus\",...f)};J(ce,{currentTabbedId:Ve(r),loop:X(e,\"loop\"),tabIndex:S(()=>g(l)?-1:0),rovingFocusGroupRef:i,rovingFocusGroupRootStyle:o,orientation:X(e,\"orientation\"),dir:X(e,\"dir\"),onItemFocus:d,onItemShiftTab:u,onBlur:a,onFocus:I,onMousedown:c}),je(()=>e.currentTabId,f=>{r.value=f!=null?f:null}),We(i,we,m)}});function Mn(e,n,s,r,l,p){return T(e.$slots,\"default\")}var Ln=L(Kn,[[\"render\",Mn],[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/roving-focus-group/src/roving-focus-group-impl.vue\"]]);const An=R({name:\"ElRovingFocusGroup\",components:{ElFocusGroupCollection:Sn,ElRovingFocusGroupImpl:Ln}});function Gn(e,n,s,r,l,p){const i=$(\"el-roving-focus-group-impl\"),t=$(\"el-focus-group-collection\");return v(),Y(t,null,{default:E(()=>[N(i,qe(Xe(e.$attrs)),{default:E(()=>[T(e.$slots,\"default\")]),_:3},16)]),_:3})}var Yn=L(An,[[\"render\",Gn],[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/roving-focus-group/src/roving-focus-group.vue\"]]);const zn=R({components:{ElRovingFocusCollectionItem:On},props:{focusable:{type:Boolean,default:!0},active:{type:Boolean,default:!1}},emits:[\"mousedown\",\"focus\",\"keydown\"],setup(e,{emit:n}){const{currentTabbedId:s,loop:r,onItemFocus:l,onItemShiftTab:p}=k(ce,void 0),{getItems:i}=k(ue,void 0),t=ye(),o=h(null),d=M(a=>{n(\"mousedown\",a)},a=>{e.focusable?l(g(t)):a.preventDefault()}),u=M(a=>{n(\"focus\",a)},()=>{l(g(t))}),c=M(a=>{n(\"keydown\",a)},a=>{const{key:m,shiftKey:f,target:w,currentTarget:G}=a;if(m===_.tab&&f){p();return}if(w!==G)return;const O=Rn(a);if(O){a.preventDefault();let C=i().filter(B=>B.focusable).map(B=>B.ref);switch(O){case\"last\":{C.reverse();break}case\"prev\":case\"next\":{O===\"prev\"&&C.reverse();const B=C.indexOf(G);C=r.value?Bn(C,B+1):C.slice(B+1);break}}Qe(()=>{de(C)})}}),I=S(()=>s.value===g(t));return J(Re,{rovingFocusGroupItemRef:o,tabIndex:S(()=>g(I)?0:-1),handleMousedown:d,handleFocus:u,handleKeydown:c}),{id:t,handleKeydown:c,handleFocus:u,handleMousedown:d}}});function Hn(e,n,s,r,l,p){const i=$(\"el-roving-focus-collection-item\");return v(),Y(i,{id:e.id,focusable:e.focusable,active:e.active},{default:E(()=>[T(e.$slots,\"default\")]),_:3},8,[\"id\",\"focusable\",\"active\"])}var Un=L(zn,[[\"render\",Hn],[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/roving-focus-group/src/roving-focus-item.vue\"]]);const Jn=W({trigger:cn.trigger,effect:V(P({},dn.effect),{default:\"light\"}),type:{type:K(String)},placement:{type:K(String),default:\"bottom\"},popperOptions:{type:K(Object),default:()=>({})},id:String,size:{type:String,default:\"\"},splitButton:Boolean,hideOnClick:{type:Boolean,default:!0},loop:{type:Boolean,default:!0},showTimeout:{type:Number,default:150},hideTimeout:{type:Number,default:150},tabindex:{type:K([Number,String]),default:0},maxHeight:{type:K([Number,String]),default:\"\"},popperClass:{type:String,default:\"\"},disabled:{type:Boolean,default:!1},role:{type:String,default:\"menu\"},buttonProps:{type:K(Object)}}),Be=W({command:{type:[Object,String,Number],default:()=>({})},disabled:Boolean,divided:Boolean,textValue:String,icon:{type:he}}),Vn=W({onKeydown:{type:K(Function)}}),jn=[_.down,_.pageDown,_.home],Pe=[_.up,_.pageUp,_.end],Wn=[...jn,...Pe],{ElCollection:qn,ElCollectionItem:Xn,COLLECTION_INJECTION_KEY:Qn,COLLECTION_ITEM_INJECTION_KEY:Zn}=Ne(\"Dropdown\"),oe=Symbol(\"elDropdown\"),{ButtonGroup:xn}=Te,eo=R({name:\"ElDropdown\",components:{ElButton:Te,ElButtonGroup:xn,ElScrollbar:Ze,ElDropdownCollection:qn,ElTooltip:pn,ElRovingFocusGroup:Yn,ElOnlyChild:fn,ElIcon:le,ArrowDown:xe},props:Jn,emits:[\"visible-change\",\"click\",\"command\"],setup(e,{emit:n}){const s=ae(),r=Z(\"dropdown\"),{t:l}=en(),p=h(),i=h(),t=h(null),o=h(null),d=h(null),u=h(null),c=h(!1),I=[_.enter,_.space,_.down],a=S(()=>({maxHeight:nn(e.maxHeight)})),m=S(()=>[r.m(C.value)]),f=ye().value,w=S(()=>e.id||f);function G(){O()}function O(){var b;(b=t.value)==null||b.onClose()}function z(){var b;(b=t.value)==null||b.onOpen()}const C=on();function B(...b){n(\"command\",...b)}function D(){}function H(){const b=g(o);b==null||b.focus(),u.value=null}function U(b){u.value=b}function F(b){c.value||(b.preventDefault(),b.stopImmediatePropagation())}function pe(){n(\"visible-change\",!0)}function x(b){(b==null?void 0:b.type)===\"keydown\"&&o.value.focus()}function q(){n(\"visible-change\",!1)}return J(oe,{contentRef:o,role:S(()=>e.role),triggerId:w,isUsingKeyboard:c,onItemEnter:D,onItemLeave:H}),J(\"elDropdown\",{instance:s,dropdownSize:C,handleClick:G,commandHandler:B,trigger:X(e,\"trigger\"),hideOnClick:X(e,\"hideOnClick\")}),{t:l,ns:r,scrollbar:d,wrapStyle:a,dropdownTriggerKls:m,dropdownSize:C,triggerId:w,triggerKeys:I,currentTabId:u,handleCurrentTabIdChange:U,handlerMainButtonClick:b=>{n(\"click\",b)},handleEntryFocus:F,handleClose:O,handleOpen:z,handleBeforeShowTooltip:pe,handleShowTooltip:x,handleBeforeHideTooltip:q,onFocusAfterTrapped:b=>{var te,fe;b.preventDefault(),(fe=(te=o.value)==null?void 0:te.focus)==null||fe.call(te,{preventScroll:!0})},popperRef:t,contentRef:o,triggeringElementRef:p,referenceElementRef:i}}});function no(e,n,s,r,l,p){var i;const t=$(\"el-dropdown-collection\"),o=$(\"el-roving-focus-group\"),d=$(\"el-scrollbar\"),u=$(\"el-only-child\"),c=$(\"el-tooltip\"),I=$(\"el-button\"),a=$(\"arrow-down\"),m=$(\"el-icon\"),f=$(\"el-button-group\");return v(),y(\"div\",{class:A([e.ns.b(),e.ns.is(\"disabled\",e.disabled)])},[N(c,{ref:\"popperRef\",role:e.role,effect:e.effect,\"fallback-placements\":[\"bottom\",\"top\"],\"popper-options\":e.popperOptions,\"gpu-acceleration\":!1,\"hide-after\":e.trigger===\"hover\"?e.hideTimeout:0,\"manual-mode\":!0,placement:e.placement,\"popper-class\":[e.ns.e(\"popper\"),e.popperClass],\"reference-element\":(i=e.referenceElementRef)==null?void 0:i.$el,trigger:e.trigger,\"trigger-keys\":e.triggerKeys,\"trigger-target-el\":e.contentRef,\"show-after\":e.trigger===\"hover\"?e.showTimeout:0,\"stop-popper-mouse-event\":!1,\"virtual-ref\":e.triggeringElementRef,\"virtual-triggering\":e.splitButton,disabled:e.disabled,transition:`${e.ns.namespace.value}-zoom-in-top`,teleported:\"\",pure:\"\",persistent:\"\",onBeforeShow:e.handleBeforeShowTooltip,onShow:e.handleShowTooltip,onBeforeHide:e.handleBeforeHideTooltip},tn({content:E(()=>[N(d,{ref:\"scrollbar\",\"wrap-style\":e.wrapStyle,tag:\"div\",\"view-class\":e.ns.e(\"list\")},{default:E(()=>[N(o,{loop:e.loop,\"current-tab-id\":e.currentTabId,orientation:\"horizontal\",onCurrentTabIdChange:e.handleCurrentTabIdChange,onEntryFocus:e.handleEntryFocus},{default:E(()=>[N(t,null,{default:E(()=>[T(e.$slots,\"dropdown\")]),_:3})]),_:3},8,[\"loop\",\"current-tab-id\",\"onCurrentTabIdChange\",\"onEntryFocus\"])]),_:3},8,[\"wrap-style\",\"view-class\"])]),_:2},[e.splitButton?void 0:{name:\"default\",fn:E(()=>[N(u,{id:e.triggerId,role:\"button\",tabindex:e.tabindex},{default:E(()=>[T(e.$slots,\"default\")]),_:3},8,[\"id\",\"tabindex\"])])}]),1032,[\"role\",\"effect\",\"popper-options\",\"hide-after\",\"placement\",\"popper-class\",\"reference-element\",\"trigger\",\"trigger-keys\",\"trigger-target-el\",\"show-after\",\"virtual-ref\",\"virtual-triggering\",\"disabled\",\"transition\",\"onBeforeShow\",\"onShow\",\"onBeforeHide\"]),e.splitButton?(v(),Y(f,{key:0},{default:E(()=>[N(I,Q({ref:\"referenceElementRef\"},e.buttonProps,{size:e.dropdownSize,type:e.type,disabled:e.disabled,tabindex:e.tabindex,onClick:e.handlerMainButtonClick}),{default:E(()=>[T(e.$slots,\"default\")]),_:3},16,[\"size\",\"type\",\"disabled\",\"tabindex\",\"onClick\"]),N(I,Q({id:e.triggerId,ref:\"triggeringElementRef\"},e.buttonProps,{role:\"button\",size:e.dropdownSize,type:e.type,class:e.ns.e(\"caret-button\"),disabled:e.disabled,tabindex:e.tabindex,\"aria-label\":e.t(\"el.dropdown.toggleDropdown\")}),{default:E(()=>[N(m,{class:A(e.ns.e(\"icon\"))},{default:E(()=>[N(a)]),_:1},8,[\"class\"])]),_:1},16,[\"id\",\"size\",\"type\",\"class\",\"disabled\",\"tabindex\",\"aria-label\"])]),_:3})):j(\"v-if\",!0)],2)}var oo=L(eo,[[\"render\",no],[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/dropdown/src/dropdown.vue\"]]);const to=R({name:\"DropdownItemImpl\",components:{ElIcon:le},props:Be,emits:[\"pointermove\",\"pointerleave\",\"click\",\"clickimpl\"],setup(e,{emit:n}){const s=Z(\"dropdown\"),{role:r}=k(oe,void 0),{collectionItemRef:l}=k(Zn,void 0),{collectionItemRef:p}=k(Dn,void 0),{rovingFocusGroupItemRef:i,tabIndex:t,handleFocus:o,handleKeydown:d,handleMousedown:u}=k(Re,void 0),c=$e(l,p,i),I=S(()=>r.value===\"menu\"?\"menuitem\":r.value===\"navigation\"?\"link\":\"button\"),a=M(m=>{const{code:f}=m;if(f===_.enter||f===_.space)return m.preventDefault(),m.stopImmediatePropagation(),n(\"clickimpl\",m),!0},d);return{ns:s,itemRef:c,dataset:{[Fe]:\"\"},role:I,tabIndex:t,handleFocus:o,handleKeydown:a,handleMousedown:u}}}),ro=[\"aria-disabled\",\"tabindex\",\"role\"];function so(e,n,s,r,l,p){const i=$(\"el-icon\");return v(),y(ee,null,[e.divided?(v(),y(\"li\",Q({key:0,role:\"separator\",class:e.ns.bem(\"menu\",\"item\",\"divided\")},e.$attrs),null,16)):j(\"v-if\",!0),ne(\"li\",Q({ref:e.itemRef},P(P({},e.dataset),e.$attrs),{\"aria-disabled\":e.disabled,class:[e.ns.be(\"menu\",\"item\"),e.ns.is(\"disabled\",e.disabled)],tabindex:e.tabIndex,role:e.role,onClick:n[0]||(n[0]=t=>e.$emit(\"clickimpl\",t)),onFocus:n[1]||(n[1]=(...t)=>e.handleFocus&&e.handleFocus(...t)),onKeydown:n[2]||(n[2]=(...t)=>e.handleKeydown&&e.handleKeydown(...t)),onMousedown:n[3]||(n[3]=(...t)=>e.handleMousedown&&e.handleMousedown(...t)),onPointermove:n[4]||(n[4]=t=>e.$emit(\"pointermove\",t)),onPointerleave:n[5]||(n[5]=t=>e.$emit(\"pointerleave\",t))}),[e.icon?(v(),Y(i,{key:0},{default:E(()=>[(v(),Y(Ee(e.icon)))]),_:1})):j(\"v-if\",!0),T(e.$slots,\"default\")],16,ro)],64)}var lo=L(to,[[\"render\",so],[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/dropdown/src/dropdown-item-impl.vue\"]]);const Ke=()=>{const e=k(\"elDropdown\",{}),n=S(()=>e==null?void 0:e.dropdownSize);return{elDropdown:e,_elDropdownSize:n}},ao=R({name:\"ElDropdownItem\",components:{ElDropdownCollectionItem:Xn,ElRovingFocusItem:Un,ElDropdownItemImpl:lo},inheritAttrs:!1,props:Be,emits:[\"pointermove\",\"pointerleave\",\"click\"],setup(e,{emit:n,attrs:s}){const{elDropdown:r}=Ke(),l=ae(),p=h(null),i=S(()=>{var a,m;return(m=(a=g(p))==null?void 0:a.textContent)!=null?m:\"\"}),{onItemEnter:t,onItemLeave:o}=k(oe,void 0),d=M(a=>(n(\"pointermove\",a),a.defaultPrevented),be(a=>{var m;e.disabled?o(a):(t(a),a.defaultPrevented||(m=a.currentTarget)==null||m.focus())})),u=M(a=>(n(\"pointerleave\",a),a.defaultPrevented),be(a=>{o(a)})),c=M(a=>(n(\"click\",a),a.type!==\"keydown\"&&a.defaultPrevented),a=>{var m,f,w;if(e.disabled){a.stopImmediatePropagation();return}(m=r==null?void 0:r.hideOnClick)!=null&&m.value&&((f=r.handleClick)==null||f.call(r)),(w=r.commandHandler)==null||w.call(r,e.command,l,a)}),I=S(()=>P(P({},e),s));return{handleClick:c,handlePointerMove:d,handlePointerLeave:u,textContent:i,propsAndAttrs:I}}});function io(e,n,s,r,l,p){var i;const t=$(\"el-dropdown-item-impl\"),o=$(\"el-roving-focus-item\"),d=$(\"el-dropdown-collection-item\");return v(),Y(d,{disabled:e.disabled,\"text-value\":(i=e.textValue)!=null?i:e.textContent},{default:E(()=>[N(o,{focusable:!e.disabled},{default:E(()=>[N(t,Q(e.propsAndAttrs,{onPointerleave:e.handlePointerLeave,onPointermove:e.handlePointerMove,onClickimpl:e.handleClick}),{default:E(()=>[T(e.$slots,\"default\")]),_:3},16,[\"onPointerleave\",\"onPointermove\",\"onClickimpl\"])]),_:3},8,[\"focusable\"])]),_:3},8,[\"disabled\",\"text-value\"])}var Me=L(ao,[[\"render\",io],[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/dropdown/src/dropdown-item.vue\"]]);const uo=R({name:\"ElDropdownMenu\",props:Vn,setup(e){const n=Z(\"dropdown\"),{_elDropdownSize:s}=Ke(),r=s.value,{focusTrapRef:l,onKeydown:p}=k(rn,void 0),{contentRef:i,role:t,triggerId:o}=k(oe,void 0),{collectionRef:d,getItems:u}=k(Qn,void 0),{rovingFocusGroupRef:c,rovingFocusGroupRootStyle:I,tabIndex:a,onBlur:m,onFocus:f,onMousedown:w}=k(ce,void 0),{collectionRef:G}=k(ue,void 0),O=S(()=>[n.b(\"menu\"),n.bm(\"menu\",r==null?void 0:r.value)]),z=$e(i,d,l,c,G),C=M(D=>{var H;(H=e.onKeydown)==null||H.call(e,D)},D=>{const{currentTarget:H,code:U,target:F}=D;if(H.contains(F),_.tab===U&&D.stopImmediatePropagation(),D.preventDefault(),F!==g(i)||!Wn.includes(U))return;const x=u().filter(q=>!q.disabled).map(q=>q.ref);Pe.includes(U)&&x.reverse(),de(x)});return{size:r,rovingFocusGroupRootStyle:I,tabIndex:a,dropdownKls:O,role:t,triggerId:o,dropdownListWrapperRef:z,handleKeydown:D=>{C(D),p(D)},onBlur:m,onFocus:f,onMousedown:w}}}),co=[\"role\",\"aria-labelledby\"];function po(e,n,s,r,l,p){return v(),y(\"ul\",{ref:e.dropdownListWrapperRef,class:A(e.dropdownKls),style:ke(e.rovingFocusGroupRootStyle),tabindex:-1,role:e.role,\"aria-labelledby\":e.triggerId,onBlur:n[0]||(n[0]=(...i)=>e.onBlur&&e.onBlur(...i)),onFocus:n[1]||(n[1]=(...i)=>e.onFocus&&e.onFocus(...i)),onKeydown:n[2]||(n[2]=(...i)=>e.handleKeydown&&e.handleKeydown(...i)),onMousedown:n[3]||(n[3]=(...i)=>e.onMousedown&&e.onMousedown(...i))},[T(e.$slots,\"default\")],46,co)}var Le=L(uo,[[\"render\",po],[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/dropdown/src/dropdown-menu.vue\"]]);const Oo=Ce(oo,{DropdownItem:Me,DropdownMenu:Le}),Do=ie(Me),Fo=ie(Le),fo=[\"opacity\"],mo=R({__name:\"index\",props:{index:{type:Number,required:!0}},emits:[\"change\"],setup(e,{emit:n}){const s=e,r=h(!1),l=o=>{o.dataTransfer&&(o.dataTransfer.dropEffect=\"move\",o.dataTransfer.setData(\"text/plain\",`${s.index}`),r.value=!0)},p=o=>{r.value=!1},i=o=>{o.preventDefault(),o.dataTransfer&&(o.dataTransfer.dropEffect=\"move\")},t=o=>{if(o.preventDefault(),o!=null&&o.dataTransfer){const d=o.dataTransfer.getData(\"text/plain\");if(d!=null||d!=\"\"){const u=Number(d);n(\"change\",u)}o.dataTransfer.setData(\"text/plain\",\"\")}};return(o,d)=>(v(),y(\"li\",{draggable:\"true\",opacity:r.value,onDrop:t,onDragover:i,onDragstart:l,onDragend:p},[T(o.$slots,\"default\",{},void 0,!0)],40,fo))}});const No=Se(mo,[[\"__scopeId\",\"data-v-38a79597\"]]),vo=e=>(an(\"data-v-43b20733\"),e=e(),un(),e),go=[\"onContextmenu\"],bo=[\"onClick\",\"disabled\"],_o={key:0,class:\"contextmenu-item_children\"},wo=[\"onClick\",\"disabled\"],ho=vo(()=>ne(\"em\",null,null,-1)),Io=R({__name:\"index\",props:{list:{type:Array,default:[]}},setup(e){const n=e,s=h(null),r=h(!1),l=sn({x:0,y:0}),p=o=>{o.preventDefault(),document.body.offsetWidth<o.pageX+100?l.x=o.pageX-100:l.x=o.pageX,document.body.offsetHeight<o.pageY+250?l.y=o.pageY-n.list.length*30:l.y=o.pageY,r.value=!r.value},i=()=>{setTimeout(()=>{r.value=!1},100)},t=o=>{o.disabled||(i(),o.f&&o.f())};return(o,d)=>(v(),y(\"div\",{onContextmenu:re(p,[\"stop\",\"prevent\"]),class:\"contextmenus\"},[T(o.$slots,\"default\",{},void 0,!0),r.value?(v(),y(\"div\",{key:0,class:\"contextmenus-container\",ref_key:\"el\",ref:s,onClick:d[0]||(d[0]=u=>i()),style:ke({left:`${l.x}px`,top:`${l.y}px`})},[(v(!0),y(ee,null,ge(e.list,u=>(v(),y(ee,null,[u.hidden?j(\"\",!0):(v(),y(\"a\",{key:0,class:\"contextmenu-item\",onClick:re(c=>t(u),[\"prevent\"]),disabled:u.disabled},[ln(se(u.name)+\" \",1),u.children&&u.children.length>0?(v(),y(\"ul\",_o,[(v(!0),y(ee,null,ge(u.children,c=>(v(),y(\"a\",{class:A([\"contextmenu-item\",{on:c.active}]),onClick:re(I=>t(c),[\"prevent\"]),disabled:c.disabled},[ho,ne(\"span\",null,se(c.name),1)],10,wo))),256))])):j(\"\",!0)],8,bo))],64))),256)),T(o.$slots,\"menus\",{},void 0,!0)],4)):j(\"\",!0)],40,go))}});const Ro=Se(Io,[[\"__scopeId\",\"data-v-43b20733\"]]),Bo=R({__name:\"index\",emits:[\"change\"],setup(e,{emit:n}){const s=t=>{},r=t=>{t===null&&console.log(\"dragleave\")},l=t=>{t.preventDefault(),t.dataTransfer&&(t.dataTransfer.dropEffect=\"link\")},p=t=>{t.preventDefault(),i(t)},i=t=>{var d;const o=(d=t==null?void 0:t.dataTransfer)==null?void 0:d.files;if(o&&o.length>0){const u=[];for(let c=0;c<o.length;c++){const I=o.item(c);I&&u.push(I)}n(\"change\",u);return}};return(t,o)=>(v(),y(\"div\",{onDrop:p,onDragenter:s,onDragleave:r,onDragover:l},[T(t.$slots,\"default\")],32))}});export{ko as E,Bo as _,So as a,Fo as b,Ro as c,No as d,Do as e,Oo as f};\n"
  },
  {
    "path": "luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.a6a47e72.js",
    "content": "var so=Object.defineProperty,io=Object.defineProperties;var lo=Object.getOwnPropertyDescriptors;var rn=Object.getOwnPropertySymbols;var uo=Object.prototype.hasOwnProperty,po=Object.prototype.propertyIsEnumerable;var an=(e,t,n)=>t in e?so(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,F=(e,t)=>{for(var n in t||(t={}))uo.call(t,n)&&an(e,n,t[n]);if(rn)for(var n of rn(t))po.call(t,n)&&an(e,n,t[n]);return e},ee=(e,t)=>io(e,lo(t));var ke=(e,t,n)=>new Promise((o,r)=>{var s=i=>{try{l(n.next(i))}catch(u){r(u)}},a=i=>{try{l(n.throw(i))}catch(u){r(u)}},l=i=>i.done?o(i.value):Promise.resolve(i.value).then(s,a);l((n=n.apply(e,t)).next())});import{aS as co,n as S,aT as fo,as as Kt,aU as Pn,d as X,aV as Ve,w as U,p as ct,a as Ne,af as Dt,aW as vo,aX as mo,aY as go,aZ as ho,a_ as bo,b as ye,A as p,aC as it,r as x,c as sn,a$ as yo,ad as ln,m as wo,ae as jt,ag as Ot,e as we,b0 as Eo,b1 as Co,aj as Oo,am as So,ak as kn,an as To,h as Re,l as xt,b2 as Ao,b3 as Bo,b4 as Po,b5 as Ut,b6 as ko,o as ue,ap as un,b7 as Io,aI as At,P as We,Q as ot,q as I,F as Y,C as j,I as St,z as $,S as oe,y as Z,t as V,x as W,L as Me,E as He,aP as rt,v as te,b8 as Mo,B as nt,b9 as Bt,a4 as ge,R as Pt,_ as Ae,ba as kt,Y as qt,aD as je,aG as ft,bb as Ro,bc as $o,bd as Lo,be as In,bf as It,bg as pn,j as Mn,aE as Rn,bh as $n,W as zt,bi as xo,a1 as ne,T as Ln,U as No,bj as Do,bk as Ft,aL as Ht,aH as jo,bl as zo,aM as Fo,bm as Ho,bn as Vo,u as Wo,aA as Ko,bo as cn,bp as Uo,bq as qo,br as Xo,aq as Et,a3 as Nt,bs as xn,bt as Nn,bu as fn}from\"./index.js\";const Yo='a[href],button:not([disabled]),button:not([hidden]),:not([tabindex=\"-1\"]),input:not([disabled]),input:not([type=\"hidden\"]),select:not([disabled]),textarea:not([disabled])',Go=e=>getComputedStyle(e).position===\"fixed\"?!1:e.offsetParent!==null,dn=e=>Array.from(e.querySelectorAll(Yo)).filter(t=>Zo(t)&&Go(t)),Zo=e=>{if(e.tabIndex>0||e.tabIndex===0&&e.getAttribute(\"tabIndex\")!==null)return!0;if(e.disabled)return!1;switch(e.nodeName){case\"A\":return!!e.href&&e.rel!==\"ignore\";case\"INPUT\":return!(e.type===\"hidden\"||e.type===\"file\");case\"BUTTON\":case\"SELECT\":case\"TEXTAREA\":return!0;default:return!1}},Se=(e,t,{checkForDefaultPrevented:n=!0}={})=>r=>{const s=e==null?void 0:e(r);if(n===!1||!s)return t==null?void 0:t(r)},Ms=e=>t=>t.pointerType===\"mouse\"?e(t):void 0,Jo=e=>[\"\",...co].includes(e),Qo=e=>/([(\\uAC00-\\uD7AF)|(\\u3130-\\u318F)])+/gi.test(e),_o=()=>Math.floor(Math.random()*1e4),er=[\"class\",\"style\"],tr=/^on[A-Z]/,nr=(e={})=>{const{excludeListeners:t=!1,excludeKeys:n}=e,o=S(()=>((n==null?void 0:n.value)||[]).concat(er)),r=Kt();return r?S(()=>{var s;return fo(Object.entries((s=r.proxy)==null?void 0:s.$attrs).filter(([a])=>!o.value.includes(a)&&!(t&&tr.test(a))))}):S(()=>({}))},Xt=Symbol(\"popper\"),Dn=Symbol(\"popperContent\"),or=Pn({type:X(Boolean),default:null}),rr=Pn({type:X(Function)}),ar=e=>{const t=`update:${e}`,n=`onUpdate:${e}`,o=[t],r={[e]:or,[n]:rr};return{useModelToggle:({indicator:a,toggleReason:l,shouldHideWhenRouteChanges:i,shouldProceed:u,onShow:d,onHide:v})=>{const m=Kt(),{emit:h}=m,g=m.props,c=S(()=>Ve(g[n])),E=S(()=>g[e]===null),b=C=>{a.value!==!0&&(a.value=!0,l&&(l.value=C),Ve(d)&&d(C))},y=C=>{a.value!==!1&&(a.value=!1,l&&(l.value=C),Ve(v)&&v(C))},T=C=>{if(g.disabled===!0||Ve(u)&&!u())return;const M=c.value&&Ne;M&&h(t,!0),(E.value||!M)&&b(C)},O=C=>{if(g.disabled===!0||!Ne)return;const M=c.value&&Ne;M&&h(t,!1),(E.value||!M)&&y(C)},k=C=>{!Dt(C)||(g.disabled&&C?c.value&&h(t,!1):a.value!==C&&(C?b():y()))},R=()=>{a.value?O():T()};return U(()=>g[e],k),i&&m.appContext.config.globalProperties.$route!==void 0&&U(()=>F({},m.proxy.$route),()=>{i.value&&a.value&&O()}),ct(()=>{k(g[e])}),{hide:O,show:T,toggle:R,hasUpdateHandler:c}},useModelToggleProps:r,useModelToggleEmits:o}},sr=(e,t)=>{let n;U(()=>e.value,o=>{var r,s;o?(n=document.activeElement,vo(t)&&((s=(r=t.value).focus)==null||s.call(r))):n.focus()})};function ir(){let e;const t=(o,r)=>{n(),e=window.setTimeout(o,r)},n=()=>window.clearTimeout(e);return mo(()=>n()),{registerTimeout:t,cancelTimeout:n}}let vn;const lr=go(\"namespace\",ho),jn=`${lr.value}-popper-container-${_o()}`,zn=`#${jn}`,ur=()=>{const e=document.createElement(\"div\");return e.id=jn,document.body.appendChild(e),e},pr=()=>{bo(()=>{!Ne||(!vn||!document.body.querySelector(zn))&&(vn=ur())})},cr=ye({showAfter:{type:Number,default:0},hideAfter:{type:Number,default:200}}),fr=({showAfter:e,hideAfter:t,open:n,close:o})=>{const{registerTimeout:r}=ir();return{onOpen:l=>{r(()=>{n(l)},p(e))},onClose:l=>{r(()=>{o(l)},p(t))}}},Fn=Symbol(\"elForwardRef\"),dr=e=>{it(Fn,{setForwardRef:n=>{e.value=n}})},vr=e=>({mounted(t){e(t)},updated(t){e(t)},unmounted(){e(null)}});function mr(e){const t=x();function n(){if(e.value==null)return;const{selectionStart:r,selectionEnd:s,value:a}=e.value;if(r==null||s==null)return;const l=a.slice(0,Math.max(0,r)),i=a.slice(Math.max(0,s));t.value={selectionStart:r,selectionEnd:s,value:a,beforeTxt:l,afterTxt:i}}function o(){if(e.value==null||t.value==null)return;const{value:r}=e.value,{beforeTxt:s,afterTxt:a,selectionStart:l}=t.value;if(s==null||a==null||l==null)return;let i=r.length;if(r.endsWith(a))i=r.length-a.length;else if(r.startsWith(s))i=s.length;else{const u=s[l-1],d=r.indexOf(u,l-1);d!==-1&&(i=d+1)}e.value.setSelectionRange(i,i)}return[n,o]}let le;const gr=`\n  height:0 !important;\n  visibility:hidden !important;\n  overflow:hidden !important;\n  position:absolute !important;\n  z-index:-1000 !important;\n  top:0 !important;\n  right:0 !important;\n`,hr=[\"letter-spacing\",\"line-height\",\"padding-top\",\"padding-bottom\",\"font-family\",\"font-weight\",\"font-size\",\"text-rendering\",\"text-transform\",\"width\",\"text-indent\",\"padding-left\",\"padding-right\",\"border-width\",\"box-sizing\"];function br(e){const t=window.getComputedStyle(e),n=t.getPropertyValue(\"box-sizing\"),o=Number.parseFloat(t.getPropertyValue(\"padding-bottom\"))+Number.parseFloat(t.getPropertyValue(\"padding-top\")),r=Number.parseFloat(t.getPropertyValue(\"border-bottom-width\"))+Number.parseFloat(t.getPropertyValue(\"border-top-width\"));return{contextStyle:hr.map(a=>`${a}:${t.getPropertyValue(a)}`).join(\";\"),paddingSize:o,borderSize:r,boxSizing:n}}function mn(e,t=1,n){var o;le||(le=document.createElement(\"textarea\"),document.body.appendChild(le));const{paddingSize:r,borderSize:s,boxSizing:a,contextStyle:l}=br(e);le.setAttribute(\"style\",`${l};${gr}`),le.value=e.value||e.placeholder||\"\";let i=le.scrollHeight;const u={};a===\"border-box\"?i=i+s:a===\"content-box\"&&(i=i-r),le.value=\"\";const d=le.scrollHeight-r;if(sn(t)){let v=d*t;a===\"border-box\"&&(v=v+r+s),i=Math.max(v,i),u.minHeight=`${v}px`}if(sn(n)){let v=d*n;a===\"border-box\"&&(v=v+r+s),i=Math.min(v,i)}return u.height=`${i}px`,(o=le.parentNode)==null||o.removeChild(le),le=void 0,u}const yr=ye({id:{type:String,default:void 0},size:yo,disabled:Boolean,modelValue:{type:X([String,Number,Object]),default:\"\"},type:{type:String,default:\"text\"},resize:{type:String,values:[\"none\",\"both\",\"horizontal\",\"vertical\"]},autosize:{type:X([Boolean,Object]),default:!1},autocomplete:{type:String,default:\"off\"},formatter:{type:Function},parser:{type:Function},placeholder:{type:String},form:{type:String,default:\"\"},readonly:{type:Boolean,default:!1},clearable:{type:Boolean,default:!1},showPassword:{type:Boolean,default:!1},showWordLimit:{type:Boolean,default:!1},suffixIcon:{type:ln},prefixIcon:{type:ln},containerRole:{type:String,default:void 0},label:{type:String,default:void 0},tabindex:{type:[String,Number],default:0},validateEvent:{type:Boolean,default:!0},inputStyle:{type:X([Object,Array,String]),default:()=>wo({})}}),wr={[jt]:e=>Ot(e),input:e=>Ot(e),change:e=>Ot(e),focus:e=>e instanceof FocusEvent,blur:e=>e instanceof FocusEvent,clear:()=>!0,mouseleave:e=>e instanceof MouseEvent,mouseenter:e=>e instanceof MouseEvent,keydown:e=>e instanceof Event,compositionstart:e=>e instanceof CompositionEvent,compositionupdate:e=>e instanceof CompositionEvent,compositionend:e=>e instanceof CompositionEvent},Er=[\"role\"],Cr=[\"id\",\"type\",\"disabled\",\"formatter\",\"parser\",\"readonly\",\"autocomplete\",\"tabindex\",\"aria-label\",\"placeholder\"],Or=[\"id\",\"tabindex\",\"disabled\",\"readonly\",\"autocomplete\",\"aria-label\",\"placeholder\"],Sr={name:\"ElInput\",inheritAttrs:!1},Tr=we(ee(F({},Sr),{props:yr,emits:wr,setup(e,{expose:t,emit:n}){const o=e,r={suffix:\"append\",prefix:\"prepend\"},s=Kt(),a=Eo(),l=Co(),i=S(()=>{const f={};return o.containerRole===\"combobox\"&&(f[\"aria-haspopup\"]=a[\"aria-haspopup\"],f[\"aria-owns\"]=a[\"aria-owns\"],f[\"aria-expanded\"]=a[\"aria-expanded\"]),f}),u=nr({excludeKeys:S(()=>Object.keys(i.value))}),{form:d,formItem:v}=Oo(),{inputId:m}=So(o,{formItemContext:v}),h=kn(),g=To(),c=Re(\"input\"),E=Re(\"textarea\"),b=xt(),y=xt(),T=x(!1),O=x(!1),k=x(!1),R=x(!1),C=x(),M=xt(o.inputStyle),z=S(()=>b.value||y.value),H=S(()=>{var f;return(f=d==null?void 0:d.statusIcon)!=null?f:!1}),N=S(()=>(v==null?void 0:v.validateState)||\"\"),K=S(()=>N.value&&Ao[N.value]),A=S(()=>R.value?Bo:Po),w=S(()=>[a.style,o.inputStyle]),B=S(()=>[o.inputStyle,M.value,{resize:o.resize}]),P=S(()=>Ut(o.modelValue)?\"\":String(o.modelValue)),D=S(()=>o.clearable&&!g.value&&!o.readonly&&!!P.value&&(T.value||O.value)),G=S(()=>o.showPassword&&!g.value&&!o.readonly&&!!P.value&&(!!P.value||T.value)),q=S(()=>o.showWordLimit&&!!u.value.maxlength&&(o.type===\"text\"||o.type===\"textarea\")&&!g.value&&!o.readonly&&!o.showPassword),ce=S(()=>Array.from(P.value).length),Be=S(()=>!!q.value&&ce.value>Number(u.value.maxlength)),fe=S(()=>!!l.suffix||!!o.suffixIcon||D.value||o.showPassword||q.value||!!N.value&&H.value),[Ee,Ce]=mr(b);ko(y,f=>{if(!q.value||o.resize!==\"both\")return;const L=f[0],{width:ie}=L.contentRect;C.value={right:`calc(100% - ${ie+15+6}px)`}});const J=()=>{const{type:f,autosize:L}=o;if(!(!Ne||f!==\"textarea\"))if(L){const ie=kt(L)?L.minRows:void 0,me=kt(L)?L.maxRows:void 0;M.value=F({},mn(y.value,ie,me))}else M.value={minHeight:mn(y.value).minHeight}},de=()=>{const f=z.value;!f||f.value===P.value||(f.value=P.value)},Pe=f=>{const{el:L}=s.vnode;if(!L)return;const me=Array.from(L.querySelectorAll(`.${c.e(f)}`)).find(ao=>ao.parentNode===L);if(!me)return;const et=r[f];l[et]?me.style.transform=`translateX(${f===\"suffix\"?\"-\":\"\"}${L.querySelector(`.${c.be(\"group\",et)}`).offsetWidth}px)`:me.removeAttribute(\"style\")},ve=()=>{Pe(\"prefix\"),Pe(\"suffix\")},Ze=f=>ke(this,null,function*(){Ee();let{value:L}=f.target;if(o.formatter&&(L=o.parser?o.parser(L):L,L=o.formatter(L)),!k.value){if(L===P.value){de();return}n(jt,L),n(\"input\",L),yield ue(),de(),Ce()}}),mt=f=>{n(\"change\",f.target.value)},ze=f=>{n(\"compositionstart\",f),k.value=!0},gt=f=>{var L;n(\"compositionupdate\",f);const ie=(L=f.target)==null?void 0:L.value,me=ie[ie.length-1]||\"\";k.value=!Qo(me)},Je=f=>{n(\"compositionend\",f),k.value&&(k.value=!1,Ze(f))},$t=()=>{R.value=!R.value,ht()},ht=()=>ke(this,null,function*(){var f;yield ue(),(f=z.value)==null||f.focus()}),bt=()=>{var f;return(f=z.value)==null?void 0:f.blur()},Qe=f=>{T.value=!0,n(\"focus\",f)},yt=f=>{var L;T.value=!1,n(\"blur\",f),o.validateEvent&&((L=v==null?void 0:v.validate)==null||L.call(v,\"blur\").catch(ie=>un()))},Lt=f=>{O.value=!1,n(\"mouseleave\",f)},Oe=f=>{O.value=!0,n(\"mouseenter\",f)},Le=f=>{n(\"keydown\",f)},wt=()=>{var f;(f=z.value)==null||f.select()},_e=()=>{n(jt,\"\"),n(\"change\",\"\"),n(\"clear\"),n(\"input\",\"\")};return U(()=>o.modelValue,()=>{var f;ue(()=>J()),o.validateEvent&&((f=v==null?void 0:v.validate)==null||f.call(v,\"change\").catch(L=>un()))}),U(P,()=>de()),U(()=>o.type,()=>ke(this,null,function*(){yield ue(),de(),J(),ve()})),ct(()=>ke(this,null,function*(){!o.formatter&&o.parser,de(),ve(),yield ue(),J()})),Io(()=>ke(this,null,function*(){yield ue(),ve()})),t({input:b,textarea:y,ref:z,textareaStyle:B,autosize:At(o,\"autosize\"),focus:ht,blur:bt,select:wt,clear:_e,resizeTextarea:J}),(f,L)=>We((I(),Y(\"div\",rt(p(i),{class:[f.type===\"textarea\"?p(E).b():p(c).b(),p(c).m(p(h)),p(c).is(\"disabled\",p(g)),p(c).is(\"exceed\",p(Be)),{[p(c).b(\"group\")]:f.$slots.prepend||f.$slots.append,[p(c).bm(\"group\",\"append\")]:f.$slots.append,[p(c).bm(\"group\",\"prepend\")]:f.$slots.prepend,[p(c).m(\"prefix\")]:f.$slots.prefix||f.prefixIcon,[p(c).m(\"suffix\")]:f.$slots.suffix||f.suffixIcon||f.clearable||f.showPassword,[p(c).bm(\"suffix\",\"password-clear\")]:p(D)&&p(G)},f.$attrs.class],style:p(w),role:f.containerRole,onMouseenter:Oe,onMouseleave:Lt}),[j(\" input \"),f.type!==\"textarea\"?(I(),Y(St,{key:0},[j(\" prepend slot \"),f.$slots.prepend?(I(),Y(\"div\",{key:0,class:$(p(c).be(\"group\",\"prepend\"))},[oe(f.$slots,\"prepend\")],2)):j(\"v-if\",!0),Z(\"div\",{class:$([p(c).e(\"wrapper\"),p(c).is(\"focus\",T.value)])},[j(\" prefix slot \"),f.$slots.prefix||f.prefixIcon?(I(),Y(\"span\",{key:0,class:$(p(c).e(\"prefix\"))},[Z(\"span\",{class:$(p(c).e(\"prefix-inner\"))},[oe(f.$slots,\"prefix\"),f.prefixIcon?(I(),V(p(He),{key:0,class:$(p(c).e(\"icon\"))},{default:W(()=>[(I(),V(Me(f.prefixIcon)))]),_:1},8,[\"class\"])):j(\"v-if\",!0)],2)],2)):j(\"v-if\",!0),Z(\"input\",rt({id:p(m),ref_key:\"input\",ref:b,class:p(c).e(\"inner\")},p(u),{type:f.showPassword?R.value?\"text\":\"password\":f.type,disabled:p(g),formatter:f.formatter,parser:f.parser,readonly:f.readonly,autocomplete:f.autocomplete,tabindex:f.tabindex,\"aria-label\":f.label,placeholder:f.placeholder,style:f.inputStyle,onCompositionstart:ze,onCompositionupdate:gt,onCompositionend:Je,onInput:Ze,onFocus:Qe,onBlur:yt,onChange:mt,onKeydown:Le}),null,16,Cr),j(\" suffix slot \"),p(fe)?(I(),Y(\"span\",{key:1,class:$(p(c).e(\"suffix\"))},[Z(\"span\",{class:$(p(c).e(\"suffix-inner\"))},[!p(D)||!p(G)||!p(q)?(I(),Y(St,{key:0},[oe(f.$slots,\"suffix\"),f.suffixIcon?(I(),V(p(He),{key:0,class:$(p(c).e(\"icon\"))},{default:W(()=>[(I(),V(Me(f.suffixIcon)))]),_:1},8,[\"class\"])):j(\"v-if\",!0)],64)):j(\"v-if\",!0),p(D)?(I(),V(p(He),{key:1,class:$([p(c).e(\"icon\"),p(c).e(\"clear\")]),onMousedown:nt(p(Bt),[\"prevent\"]),onClick:_e},{default:W(()=>[te(p(Mo))]),_:1},8,[\"class\",\"onMousedown\"])):j(\"v-if\",!0),p(G)?(I(),V(p(He),{key:2,class:$([p(c).e(\"icon\"),p(c).e(\"password\")]),onClick:$t},{default:W(()=>[(I(),V(Me(p(A))))]),_:1},8,[\"class\"])):j(\"v-if\",!0),p(q)?(I(),Y(\"span\",{key:3,class:$(p(c).e(\"count\"))},[Z(\"span\",{class:$(p(c).e(\"count-inner\"))},ge(p(ce))+\" / \"+ge(p(u).maxlength),3)],2)):j(\"v-if\",!0),p(N)&&p(K)&&p(H)?(I(),V(p(He),{key:4,class:$([p(c).e(\"icon\"),p(c).e(\"validateIcon\"),p(c).is(\"loading\",p(N)===\"validating\")])},{default:W(()=>[(I(),V(Me(p(K))))]),_:1},8,[\"class\"])):j(\"v-if\",!0)],2)],2)):j(\"v-if\",!0)],2),j(\" append slot \"),f.$slots.append?(I(),Y(\"div\",{key:1,class:$(p(c).be(\"group\",\"append\"))},[oe(f.$slots,\"append\")],2)):j(\"v-if\",!0)],64)):(I(),Y(St,{key:1},[j(\" textarea \"),Z(\"textarea\",rt({id:p(m),ref_key:\"textarea\",ref:y,class:p(E).e(\"inner\")},p(u),{tabindex:f.tabindex,disabled:p(g),readonly:f.readonly,autocomplete:f.autocomplete,style:p(B),\"aria-label\":f.label,placeholder:f.placeholder,onCompositionstart:ze,onCompositionupdate:gt,onCompositionend:Je,onInput:Ze,onFocus:Qe,onBlur:yt,onChange:mt,onKeydown:Le}),null,16,Or),p(q)?(I(),Y(\"span\",{key:0,style:Pt(C.value),class:$(p(c).e(\"count\"))},ge(p(ce))+\" / \"+ge(p(u).maxlength),7)):j(\"v-if\",!0)],64))],16,Er)),[[ot,f.type!==\"hidden\"]])}}));var Ar=Ae(Tr,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/input/src/input.vue\"]]);const Br=qt(Ar),Pr=[\"dialog\",\"grid\",\"listbox\",\"menu\",\"tooltip\",\"tree\"],Hn=ye({role:{type:String,values:Pr,default:\"tooltip\"}}),kr={name:\"ElPopperRoot\",inheritAttrs:!1},Ir=we(ee(F({},kr),{props:Hn,setup(e,{expose:t}){const n=e,o=x(),r=x(),s=x(),a=x(),l=S(()=>n.role),i={triggerRef:o,popperInstanceRef:r,contentRef:s,referenceRef:a,role:l};return t(i),it(Xt,i),(u,d)=>oe(u.$slots,\"default\")}}));var Mr=Ae(Ir,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/popper/src/popper.vue\"]]);const Vn=ye({arrowOffset:{type:Number,default:5}}),Rr={name:\"ElPopperArrow\",inheritAttrs:!1},$r=we(ee(F({},Rr),{props:Vn,setup(e,{expose:t}){const n=e,o=Re(\"popper\"),{arrowOffset:r,arrowRef:s}=je(Dn,void 0);return U(()=>n.arrowOffset,a=>{r.value=a}),ft(()=>{s.value=void 0}),t({arrowRef:s}),(a,l)=>(I(),Y(\"span\",{ref_key:\"arrowRef\",ref:s,class:$(p(o).e(\"arrow\")),\"data-popper-arrow\":\"\"},null,2))}}));var Lr=Ae($r,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/popper/src/arrow.vue\"]]);const xr=\"ElOnlyChild\",Nr=we({name:xr,setup(e,{slots:t,attrs:n}){var o;const r=je(Fn),s=vr((o=r==null?void 0:r.setForwardRef)!=null?o:Bt);return()=>{var a;const l=(a=t.default)==null?void 0:a.call(t,n);if(!l||l.length>1)return null;const i=Wn(l);return i?We(Ro(i,n),[[s]]):null}}});function Wn(e){if(!e)return null;const t=e;for(const n of t){if(kt(n))switch(n.type){case Lo:continue;case $o:case\"svg\":return gn(n);case St:return Wn(n.children);default:return n}return gn(n)}return null}function gn(e){const t=Re(\"only-child\");return te(\"span\",{class:t.e(\"content\")},[e])}const Kn=ye({virtualRef:{type:X(Object)},virtualTriggering:Boolean,onMouseenter:Function,onMouseleave:Function,onClick:Function,onKeydown:Function,onFocus:Function,onBlur:Function,onContextmenu:Function,id:String,open:Boolean}),Dr={name:\"ElPopperTrigger\",inheritAttrs:!1},jr=we(ee(F({},Dr),{props:Kn,setup(e,{expose:t}){const n=e,{role:o,triggerRef:r}=je(Xt,void 0);dr(r);const s=S(()=>l.value?n.id:void 0),a=S(()=>{if(o&&o.value===\"tooltip\")return n.open&&n.id?n.id:void 0}),l=S(()=>{if(o&&o.value!==\"tooltip\")return o.value}),i=S(()=>l.value?`${n.open}`:void 0);let u;return ct(()=>{U(()=>n.virtualRef,d=>{d&&(r.value=In(d))},{immediate:!0}),U(()=>r.value,(d,v)=>{u==null||u(),u=void 0,It(d)&&([\"onMouseenter\",\"onMouseleave\",\"onClick\",\"onKeydown\",\"onFocus\",\"onBlur\",\"onContextmenu\"].forEach(m=>{var h;const g=n[m];g&&(d.addEventListener(m.slice(2).toLowerCase(),g),(h=v==null?void 0:v.removeEventListener)==null||h.call(v,m.slice(2).toLowerCase(),g))}),u=U([s,a,l,i],m=>{[\"aria-controls\",\"aria-describedby\",\"aria-haspopup\",\"aria-expanded\"].forEach((h,g)=>{Ut(m[g])?d.removeAttribute(h):d.setAttribute(h,m[g])})},{immediate:!0})),It(v)&&[\"aria-controls\",\"aria-describedby\",\"aria-haspopup\",\"aria-expanded\"].forEach(m=>v.removeAttribute(m))},{immediate:!0})}),ft(()=>{u==null||u(),u=void 0}),t({triggerRef:r}),(d,v)=>d.virtualTriggering?j(\"v-if\",!0):(I(),V(p(Nr),rt({key:0},d.$attrs,{\"aria-controls\":p(s),\"aria-describedby\":p(a),\"aria-expanded\":p(i),\"aria-haspopup\":p(l)}),{default:W(()=>[oe(d.$slots,\"default\")]),_:3},16,[\"aria-controls\",\"aria-describedby\",\"aria-expanded\",\"aria-haspopup\"]))}}));var zr=Ae(jr,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/popper/src/trigger.vue\"]]),Q=\"top\",ae=\"bottom\",se=\"right\",_=\"left\",Yt=\"auto\",dt=[Q,ae,se,_],Ke=\"start\",lt=\"end\",Fr=\"clippingParents\",Un=\"viewport\",tt=\"popper\",Hr=\"reference\",hn=dt.reduce(function(e,t){return e.concat([t+\"-\"+Ke,t+\"-\"+lt])},[]),Gt=[].concat(dt,[Yt]).reduce(function(e,t){return e.concat([t,t+\"-\"+Ke,t+\"-\"+lt])},[]),Vr=\"beforeRead\",Wr=\"read\",Kr=\"afterRead\",Ur=\"beforeMain\",qr=\"main\",Xr=\"afterMain\",Yr=\"beforeWrite\",Gr=\"write\",Zr=\"afterWrite\",Jr=[Vr,Wr,Kr,Ur,qr,Xr,Yr,Gr,Zr];function be(e){return e?(e.nodeName||\"\").toLowerCase():null}function pe(e){if(e==null)return window;if(e.toString()!==\"[object Window]\"){var t=e.ownerDocument;return t&&t.defaultView||window}return e}function Ue(e){var t=pe(e).Element;return e instanceof t||e instanceof Element}function re(e){var t=pe(e).HTMLElement;return e instanceof t||e instanceof HTMLElement}function Zt(e){if(typeof ShadowRoot==\"undefined\")return!1;var t=pe(e).ShadowRoot;return e instanceof t||e instanceof ShadowRoot}function Qr(e){var t=e.state;Object.keys(t.elements).forEach(function(n){var o=t.styles[n]||{},r=t.attributes[n]||{},s=t.elements[n];!re(s)||!be(s)||(Object.assign(s.style,o),Object.keys(r).forEach(function(a){var l=r[a];l===!1?s.removeAttribute(a):s.setAttribute(a,l===!0?\"\":l)}))})}function _r(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(o){var r=t.elements[o],s=t.attributes[o]||{},a=Object.keys(t.styles.hasOwnProperty(o)?t.styles[o]:n[o]),l=a.reduce(function(i,u){return i[u]=\"\",i},{});!re(r)||!be(r)||(Object.assign(r.style,l),Object.keys(s).forEach(function(i){r.removeAttribute(i)}))})}}var qn={name:\"applyStyles\",enabled:!0,phase:\"write\",fn:Qr,effect:_r,requires:[\"computeStyles\"]};function he(e){return e.split(\"-\")[0]}var De=Math.max,Mt=Math.min,qe=Math.round;function Xe(e,t){t===void 0&&(t=!1);var n=e.getBoundingClientRect(),o=1,r=1;if(re(e)&&t){var s=e.offsetHeight,a=e.offsetWidth;a>0&&(o=qe(n.width)/a||1),s>0&&(r=qe(n.height)/s||1)}return{width:n.width/o,height:n.height/r,top:n.top/r,right:n.right/o,bottom:n.bottom/r,left:n.left/o,x:n.left/o,y:n.top/r}}function Jt(e){var t=Xe(e),n=e.offsetWidth,o=e.offsetHeight;return Math.abs(t.width-n)<=1&&(n=t.width),Math.abs(t.height-o)<=1&&(o=t.height),{x:e.offsetLeft,y:e.offsetTop,width:n,height:o}}function Xn(e,t){var n=t.getRootNode&&t.getRootNode();if(e.contains(t))return!0;if(n&&Zt(n)){var o=t;do{if(o&&e.isSameNode(o))return!0;o=o.parentNode||o.host}while(o)}return!1}function Te(e){return pe(e).getComputedStyle(e)}function ea(e){return[\"table\",\"td\",\"th\"].indexOf(be(e))>=0}function $e(e){return((Ue(e)?e.ownerDocument:e.document)||window.document).documentElement}function Rt(e){return be(e)===\"html\"?e:e.assignedSlot||e.parentNode||(Zt(e)?e.host:null)||$e(e)}function bn(e){return!re(e)||Te(e).position===\"fixed\"?null:e.offsetParent}function ta(e){var t=navigator.userAgent.toLowerCase().indexOf(\"firefox\")!==-1,n=navigator.userAgent.indexOf(\"Trident\")!==-1;if(n&&re(e)){var o=Te(e);if(o.position===\"fixed\")return null}var r=Rt(e);for(Zt(r)&&(r=r.host);re(r)&&[\"html\",\"body\"].indexOf(be(r))<0;){var s=Te(r);if(s.transform!==\"none\"||s.perspective!==\"none\"||s.contain===\"paint\"||[\"transform\",\"perspective\"].indexOf(s.willChange)!==-1||t&&s.willChange===\"filter\"||t&&s.filter&&s.filter!==\"none\")return r;r=r.parentNode}return null}function vt(e){for(var t=pe(e),n=bn(e);n&&ea(n)&&Te(n).position===\"static\";)n=bn(n);return n&&(be(n)===\"html\"||be(n)===\"body\"&&Te(n).position===\"static\")?t:n||ta(e)||t}function Qt(e){return[\"top\",\"bottom\"].indexOf(e)>=0?\"x\":\"y\"}function at(e,t,n){return De(e,Mt(t,n))}function na(e,t,n){var o=at(e,t,n);return o>n?n:o}function Yn(){return{top:0,right:0,bottom:0,left:0}}function Gn(e){return Object.assign({},Yn(),e)}function Zn(e,t){return t.reduce(function(n,o){return n[o]=e,n},{})}var oa=function(e,t){return e=typeof e==\"function\"?e(Object.assign({},t.rects,{placement:t.placement})):e,Gn(typeof e!=\"number\"?e:Zn(e,dt))};function ra(e){var t,n=e.state,o=e.name,r=e.options,s=n.elements.arrow,a=n.modifiersData.popperOffsets,l=he(n.placement),i=Qt(l),u=[_,se].indexOf(l)>=0,d=u?\"height\":\"width\";if(!(!s||!a)){var v=oa(r.padding,n),m=Jt(s),h=i===\"y\"?Q:_,g=i===\"y\"?ae:se,c=n.rects.reference[d]+n.rects.reference[i]-a[i]-n.rects.popper[d],E=a[i]-n.rects.reference[i],b=vt(s),y=b?i===\"y\"?b.clientHeight||0:b.clientWidth||0:0,T=c/2-E/2,O=v[h],k=y-m[d]-v[g],R=y/2-m[d]/2+T,C=at(O,R,k),M=i;n.modifiersData[o]=(t={},t[M]=C,t.centerOffset=C-R,t)}}function aa(e){var t=e.state,n=e.options,o=n.element,r=o===void 0?\"[data-popper-arrow]\":o;r!=null&&(typeof r==\"string\"&&(r=t.elements.popper.querySelector(r),!r)||!Xn(t.elements.popper,r)||(t.elements.arrow=r))}var sa={name:\"arrow\",enabled:!0,phase:\"main\",fn:ra,effect:aa,requires:[\"popperOffsets\"],requiresIfExists:[\"preventOverflow\"]};function Ye(e){return e.split(\"-\")[1]}var ia={top:\"auto\",right:\"auto\",bottom:\"auto\",left:\"auto\"};function la(e){var t=e.x,n=e.y,o=window,r=o.devicePixelRatio||1;return{x:qe(t*r)/r||0,y:qe(n*r)/r||0}}function yn(e){var t,n=e.popper,o=e.popperRect,r=e.placement,s=e.variation,a=e.offsets,l=e.position,i=e.gpuAcceleration,u=e.adaptive,d=e.roundOffsets,v=e.isFixed,m=a.x,h=m===void 0?0:m,g=a.y,c=g===void 0?0:g,E=typeof d==\"function\"?d({x:h,y:c}):{x:h,y:c};h=E.x,c=E.y;var b=a.hasOwnProperty(\"x\"),y=a.hasOwnProperty(\"y\"),T=_,O=Q,k=window;if(u){var R=vt(n),C=\"clientHeight\",M=\"clientWidth\";if(R===pe(n)&&(R=$e(n),Te(R).position!==\"static\"&&l===\"absolute\"&&(C=\"scrollHeight\",M=\"scrollWidth\")),R=R,r===Q||(r===_||r===se)&&s===lt){O=ae;var z=v&&R===k&&k.visualViewport?k.visualViewport.height:R[C];c-=z-o.height,c*=i?1:-1}if(r===_||(r===Q||r===ae)&&s===lt){T=se;var H=v&&R===k&&k.visualViewport?k.visualViewport.width:R[M];h-=H-o.width,h*=i?1:-1}}var N=Object.assign({position:l},u&&ia),K=d===!0?la({x:h,y:c}):{x:h,y:c};if(h=K.x,c=K.y,i){var A;return Object.assign({},N,(A={},A[O]=y?\"0\":\"\",A[T]=b?\"0\":\"\",A.transform=(k.devicePixelRatio||1)<=1?\"translate(\"+h+\"px, \"+c+\"px)\":\"translate3d(\"+h+\"px, \"+c+\"px, 0)\",A))}return Object.assign({},N,(t={},t[O]=y?c+\"px\":\"\",t[T]=b?h+\"px\":\"\",t.transform=\"\",t))}function ua(e){var t=e.state,n=e.options,o=n.gpuAcceleration,r=o===void 0?!0:o,s=n.adaptive,a=s===void 0?!0:s,l=n.roundOffsets,i=l===void 0?!0:l,u={placement:he(t.placement),variation:Ye(t.placement),popper:t.elements.popper,popperRect:t.rects.popper,gpuAcceleration:r,isFixed:t.options.strategy===\"fixed\"};t.modifiersData.popperOffsets!=null&&(t.styles.popper=Object.assign({},t.styles.popper,yn(Object.assign({},u,{offsets:t.modifiersData.popperOffsets,position:t.options.strategy,adaptive:a,roundOffsets:i})))),t.modifiersData.arrow!=null&&(t.styles.arrow=Object.assign({},t.styles.arrow,yn(Object.assign({},u,{offsets:t.modifiersData.arrow,position:\"absolute\",adaptive:!1,roundOffsets:i})))),t.attributes.popper=Object.assign({},t.attributes.popper,{\"data-popper-placement\":t.placement})}var Jn={name:\"computeStyles\",enabled:!0,phase:\"beforeWrite\",fn:ua,data:{}},Ct={passive:!0};function pa(e){var t=e.state,n=e.instance,o=e.options,r=o.scroll,s=r===void 0?!0:r,a=o.resize,l=a===void 0?!0:a,i=pe(t.elements.popper),u=[].concat(t.scrollParents.reference,t.scrollParents.popper);return s&&u.forEach(function(d){d.addEventListener(\"scroll\",n.update,Ct)}),l&&i.addEventListener(\"resize\",n.update,Ct),function(){s&&u.forEach(function(d){d.removeEventListener(\"scroll\",n.update,Ct)}),l&&i.removeEventListener(\"resize\",n.update,Ct)}}var Qn={name:\"eventListeners\",enabled:!0,phase:\"write\",fn:function(){},effect:pa,data:{}},ca={left:\"right\",right:\"left\",bottom:\"top\",top:\"bottom\"};function Tt(e){return e.replace(/left|right|bottom|top/g,function(t){return ca[t]})}var fa={start:\"end\",end:\"start\"};function wn(e){return e.replace(/start|end/g,function(t){return fa[t]})}function _t(e){var t=pe(e),n=t.pageXOffset,o=t.pageYOffset;return{scrollLeft:n,scrollTop:o}}function en(e){return Xe($e(e)).left+_t(e).scrollLeft}function da(e){var t=pe(e),n=$e(e),o=t.visualViewport,r=n.clientWidth,s=n.clientHeight,a=0,l=0;return o&&(r=o.width,s=o.height,/^((?!chrome|android).)*safari/i.test(navigator.userAgent)||(a=o.offsetLeft,l=o.offsetTop)),{width:r,height:s,x:a+en(e),y:l}}function va(e){var t,n=$e(e),o=_t(e),r=(t=e.ownerDocument)==null?void 0:t.body,s=De(n.scrollWidth,n.clientWidth,r?r.scrollWidth:0,r?r.clientWidth:0),a=De(n.scrollHeight,n.clientHeight,r?r.scrollHeight:0,r?r.clientHeight:0),l=-o.scrollLeft+en(e),i=-o.scrollTop;return Te(r||n).direction===\"rtl\"&&(l+=De(n.clientWidth,r?r.clientWidth:0)-s),{width:s,height:a,x:l,y:i}}function tn(e){var t=Te(e),n=t.overflow,o=t.overflowX,r=t.overflowY;return/auto|scroll|overlay|hidden/.test(n+r+o)}function _n(e){return[\"html\",\"body\",\"#document\"].indexOf(be(e))>=0?e.ownerDocument.body:re(e)&&tn(e)?e:_n(Rt(e))}function st(e,t){var n;t===void 0&&(t=[]);var o=_n(e),r=o===((n=e.ownerDocument)==null?void 0:n.body),s=pe(o),a=r?[s].concat(s.visualViewport||[],tn(o)?o:[]):o,l=t.concat(a);return r?l:l.concat(st(Rt(a)))}function Vt(e){return Object.assign({},e,{left:e.x,top:e.y,right:e.x+e.width,bottom:e.y+e.height})}function ma(e){var t=Xe(e);return t.top=t.top+e.clientTop,t.left=t.left+e.clientLeft,t.bottom=t.top+e.clientHeight,t.right=t.left+e.clientWidth,t.width=e.clientWidth,t.height=e.clientHeight,t.x=t.left,t.y=t.top,t}function En(e,t){return t===Un?Vt(da(e)):Ue(t)?ma(t):Vt(va($e(e)))}function ga(e){var t=st(Rt(e)),n=[\"absolute\",\"fixed\"].indexOf(Te(e).position)>=0,o=n&&re(e)?vt(e):e;return Ue(o)?t.filter(function(r){return Ue(r)&&Xn(r,o)&&be(r)!==\"body\"}):[]}function ha(e,t,n){var o=t===\"clippingParents\"?ga(e):[].concat(t),r=[].concat(o,[n]),s=r[0],a=r.reduce(function(l,i){var u=En(e,i);return l.top=De(u.top,l.top),l.right=Mt(u.right,l.right),l.bottom=Mt(u.bottom,l.bottom),l.left=De(u.left,l.left),l},En(e,s));return a.width=a.right-a.left,a.height=a.bottom-a.top,a.x=a.left,a.y=a.top,a}function eo(e){var t=e.reference,n=e.element,o=e.placement,r=o?he(o):null,s=o?Ye(o):null,a=t.x+t.width/2-n.width/2,l=t.y+t.height/2-n.height/2,i;switch(r){case Q:i={x:a,y:t.y-n.height};break;case ae:i={x:a,y:t.y+t.height};break;case se:i={x:t.x+t.width,y:l};break;case _:i={x:t.x-n.width,y:l};break;default:i={x:t.x,y:t.y}}var u=r?Qt(r):null;if(u!=null){var d=u===\"y\"?\"height\":\"width\";switch(s){case Ke:i[u]=i[u]-(t[d]/2-n[d]/2);break;case lt:i[u]=i[u]+(t[d]/2-n[d]/2);break}}return i}function ut(e,t){t===void 0&&(t={});var n=t,o=n.placement,r=o===void 0?e.placement:o,s=n.boundary,a=s===void 0?Fr:s,l=n.rootBoundary,i=l===void 0?Un:l,u=n.elementContext,d=u===void 0?tt:u,v=n.altBoundary,m=v===void 0?!1:v,h=n.padding,g=h===void 0?0:h,c=Gn(typeof g!=\"number\"?g:Zn(g,dt)),E=d===tt?Hr:tt,b=e.rects.popper,y=e.elements[m?E:d],T=ha(Ue(y)?y:y.contextElement||$e(e.elements.popper),a,i),O=Xe(e.elements.reference),k=eo({reference:O,element:b,strategy:\"absolute\",placement:r}),R=Vt(Object.assign({},b,k)),C=d===tt?R:O,M={top:T.top-C.top+c.top,bottom:C.bottom-T.bottom+c.bottom,left:T.left-C.left+c.left,right:C.right-T.right+c.right},z=e.modifiersData.offset;if(d===tt&&z){var H=z[r];Object.keys(M).forEach(function(N){var K=[se,ae].indexOf(N)>=0?1:-1,A=[Q,ae].indexOf(N)>=0?\"y\":\"x\";M[N]+=H[A]*K})}return M}function ba(e,t){t===void 0&&(t={});var n=t,o=n.placement,r=n.boundary,s=n.rootBoundary,a=n.padding,l=n.flipVariations,i=n.allowedAutoPlacements,u=i===void 0?Gt:i,d=Ye(o),v=d?l?hn:hn.filter(function(g){return Ye(g)===d}):dt,m=v.filter(function(g){return u.indexOf(g)>=0});m.length===0&&(m=v);var h=m.reduce(function(g,c){return g[c]=ut(e,{placement:c,boundary:r,rootBoundary:s,padding:a})[he(c)],g},{});return Object.keys(h).sort(function(g,c){return h[g]-h[c]})}function ya(e){if(he(e)===Yt)return[];var t=Tt(e);return[wn(e),t,wn(t)]}function wa(e){var t=e.state,n=e.options,o=e.name;if(!t.modifiersData[o]._skip){for(var r=n.mainAxis,s=r===void 0?!0:r,a=n.altAxis,l=a===void 0?!0:a,i=n.fallbackPlacements,u=n.padding,d=n.boundary,v=n.rootBoundary,m=n.altBoundary,h=n.flipVariations,g=h===void 0?!0:h,c=n.allowedAutoPlacements,E=t.options.placement,b=he(E),y=b===E,T=i||(y||!g?[Tt(E)]:ya(E)),O=[E].concat(T).reduce(function(Ce,J){return Ce.concat(he(J)===Yt?ba(t,{placement:J,boundary:d,rootBoundary:v,padding:u,flipVariations:g,allowedAutoPlacements:c}):J)},[]),k=t.rects.reference,R=t.rects.popper,C=new Map,M=!0,z=O[0],H=0;H<O.length;H++){var N=O[H],K=he(N),A=Ye(N)===Ke,w=[Q,ae].indexOf(K)>=0,B=w?\"width\":\"height\",P=ut(t,{placement:N,boundary:d,rootBoundary:v,altBoundary:m,padding:u}),D=w?A?se:_:A?ae:Q;k[B]>R[B]&&(D=Tt(D));var G=Tt(D),q=[];if(s&&q.push(P[K]<=0),l&&q.push(P[D]<=0,P[G]<=0),q.every(function(Ce){return Ce})){z=N,M=!1;break}C.set(N,q)}if(M)for(var ce=g?3:1,Be=function(Ce){var J=O.find(function(de){var Pe=C.get(de);if(Pe)return Pe.slice(0,Ce).every(function(ve){return ve})});if(J)return z=J,\"break\"},fe=ce;fe>0;fe--){var Ee=Be(fe);if(Ee===\"break\")break}t.placement!==z&&(t.modifiersData[o]._skip=!0,t.placement=z,t.reset=!0)}}var Ea={name:\"flip\",enabled:!0,phase:\"main\",fn:wa,requiresIfExists:[\"offset\"],data:{_skip:!1}};function Cn(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 On(e){return[Q,se,ae,_].some(function(t){return e[t]>=0})}function Ca(e){var t=e.state,n=e.name,o=t.rects.reference,r=t.rects.popper,s=t.modifiersData.preventOverflow,a=ut(t,{elementContext:\"reference\"}),l=ut(t,{altBoundary:!0}),i=Cn(a,o),u=Cn(l,r,s),d=On(i),v=On(u);t.modifiersData[n]={referenceClippingOffsets:i,popperEscapeOffsets:u,isReferenceHidden:d,hasPopperEscaped:v},t.attributes.popper=Object.assign({},t.attributes.popper,{\"data-popper-reference-hidden\":d,\"data-popper-escaped\":v})}var Oa={name:\"hide\",enabled:!0,phase:\"main\",requiresIfExists:[\"preventOverflow\"],fn:Ca};function Sa(e,t,n){var o=he(e),r=[_,Q].indexOf(o)>=0?-1:1,s=typeof n==\"function\"?n(Object.assign({},t,{placement:e})):n,a=s[0],l=s[1];return a=a||0,l=(l||0)*r,[_,se].indexOf(o)>=0?{x:l,y:a}:{x:a,y:l}}function Ta(e){var t=e.state,n=e.options,o=e.name,r=n.offset,s=r===void 0?[0,0]:r,a=Gt.reduce(function(d,v){return d[v]=Sa(v,t.rects,s),d},{}),l=a[t.placement],i=l.x,u=l.y;t.modifiersData.popperOffsets!=null&&(t.modifiersData.popperOffsets.x+=i,t.modifiersData.popperOffsets.y+=u),t.modifiersData[o]=a}var Aa={name:\"offset\",enabled:!0,phase:\"main\",requires:[\"popperOffsets\"],fn:Ta};function Ba(e){var t=e.state,n=e.name;t.modifiersData[n]=eo({reference:t.rects.reference,element:t.rects.popper,strategy:\"absolute\",placement:t.placement})}var to={name:\"popperOffsets\",enabled:!0,phase:\"read\",fn:Ba,data:{}};function Pa(e){return e===\"x\"?\"y\":\"x\"}function ka(e){var t=e.state,n=e.options,o=e.name,r=n.mainAxis,s=r===void 0?!0:r,a=n.altAxis,l=a===void 0?!1:a,i=n.boundary,u=n.rootBoundary,d=n.altBoundary,v=n.padding,m=n.tether,h=m===void 0?!0:m,g=n.tetherOffset,c=g===void 0?0:g,E=ut(t,{boundary:i,rootBoundary:u,padding:v,altBoundary:d}),b=he(t.placement),y=Ye(t.placement),T=!y,O=Qt(b),k=Pa(O),R=t.modifiersData.popperOffsets,C=t.rects.reference,M=t.rects.popper,z=typeof c==\"function\"?c(Object.assign({},t.rects,{placement:t.placement})):c,H=typeof z==\"number\"?{mainAxis:z,altAxis:z}:Object.assign({mainAxis:0,altAxis:0},z),N=t.modifiersData.offset?t.modifiersData.offset[t.placement]:null,K={x:0,y:0};if(R){if(s){var A,w=O===\"y\"?Q:_,B=O===\"y\"?ae:se,P=O===\"y\"?\"height\":\"width\",D=R[O],G=D+E[w],q=D-E[B],ce=h?-M[P]/2:0,Be=y===Ke?C[P]:M[P],fe=y===Ke?-M[P]:-C[P],Ee=t.elements.arrow,Ce=h&&Ee?Jt(Ee):{width:0,height:0},J=t.modifiersData[\"arrow#persistent\"]?t.modifiersData[\"arrow#persistent\"].padding:Yn(),de=J[w],Pe=J[B],ve=at(0,C[P],Ce[P]),Ze=T?C[P]/2-ce-ve-de-H.mainAxis:Be-ve-de-H.mainAxis,mt=T?-C[P]/2+ce+ve+Pe+H.mainAxis:fe+ve+Pe+H.mainAxis,ze=t.elements.arrow&&vt(t.elements.arrow),gt=ze?O===\"y\"?ze.clientTop||0:ze.clientLeft||0:0,Je=(A=N==null?void 0:N[O])!=null?A:0,$t=D+Ze-Je-gt,ht=D+mt-Je,bt=at(h?Mt(G,$t):G,D,h?De(q,ht):q);R[O]=bt,K[O]=bt-D}if(l){var Qe,yt=O===\"x\"?Q:_,Lt=O===\"x\"?ae:se,Oe=R[k],Le=k===\"y\"?\"height\":\"width\",wt=Oe+E[yt],_e=Oe-E[Lt],f=[Q,_].indexOf(b)!==-1,L=(Qe=N==null?void 0:N[k])!=null?Qe:0,ie=f?wt:Oe-C[Le]-M[Le]-L+H.altAxis,me=f?Oe+C[Le]+M[Le]-L-H.altAxis:_e,et=h&&f?na(ie,Oe,me):at(h?ie:wt,Oe,h?me:_e);R[k]=et,K[k]=et-Oe}t.modifiersData[o]=K}}var Ia={name:\"preventOverflow\",enabled:!0,phase:\"main\",fn:ka,requiresIfExists:[\"offset\"]};function Ma(e){return{scrollLeft:e.scrollLeft,scrollTop:e.scrollTop}}function Ra(e){return e===pe(e)||!re(e)?_t(e):Ma(e)}function $a(e){var t=e.getBoundingClientRect(),n=qe(t.width)/e.offsetWidth||1,o=qe(t.height)/e.offsetHeight||1;return n!==1||o!==1}function La(e,t,n){n===void 0&&(n=!1);var o=re(t),r=re(t)&&$a(t),s=$e(t),a=Xe(e,r),l={scrollLeft:0,scrollTop:0},i={x:0,y:0};return(o||!o&&!n)&&((be(t)!==\"body\"||tn(s))&&(l=Ra(t)),re(t)?(i=Xe(t,!0),i.x+=t.clientLeft,i.y+=t.clientTop):s&&(i.x=en(s))),{x:a.left+l.scrollLeft-i.x,y:a.top+l.scrollTop-i.y,width:a.width,height:a.height}}function xa(e){var t=new Map,n=new Set,o=[];e.forEach(function(s){t.set(s.name,s)});function r(s){n.add(s.name);var a=[].concat(s.requires||[],s.requiresIfExists||[]);a.forEach(function(l){if(!n.has(l)){var i=t.get(l);i&&r(i)}}),o.push(s)}return e.forEach(function(s){n.has(s.name)||r(s)}),o}function Na(e){var t=xa(e);return Jr.reduce(function(n,o){return n.concat(t.filter(function(r){return r.phase===o}))},[])}function Da(e){var t;return function(){return t||(t=new Promise(function(n){Promise.resolve().then(function(){t=void 0,n(e())})})),t}}function ja(e){var t=e.reduce(function(n,o){var r=n[o.name];return n[o.name]=r?Object.assign({},r,o,{options:Object.assign({},r.options,o.options),data:Object.assign({},r.data,o.data)}):o,n},{});return Object.keys(t).map(function(n){return t[n]})}var Sn={placement:\"bottom\",modifiers:[],strategy:\"absolute\"};function Tn(){for(var e=arguments.length,t=new Array(e),n=0;n<e;n++)t[n]=arguments[n];return!t.some(function(o){return!(o&&typeof o.getBoundingClientRect==\"function\")})}function nn(e){e===void 0&&(e={});var t=e,n=t.defaultModifiers,o=n===void 0?[]:n,r=t.defaultOptions,s=r===void 0?Sn:r;return function(a,l,i){i===void 0&&(i=s);var u={placement:\"bottom\",orderedModifiers:[],options:Object.assign({},Sn,s),modifiersData:{},elements:{reference:a,popper:l},attributes:{},styles:{}},d=[],v=!1,m={state:u,setOptions:function(c){var E=typeof c==\"function\"?c(u.options):c;g(),u.options=Object.assign({},s,u.options,E),u.scrollParents={reference:Ue(a)?st(a):a.contextElement?st(a.contextElement):[],popper:st(l)};var b=Na(ja([].concat(o,u.options.modifiers)));return u.orderedModifiers=b.filter(function(y){return y.enabled}),h(),m.update()},forceUpdate:function(){if(!v){var c=u.elements,E=c.reference,b=c.popper;if(Tn(E,b)){u.rects={reference:La(E,vt(b),u.options.strategy===\"fixed\"),popper:Jt(b)},u.reset=!1,u.placement=u.options.placement,u.orderedModifiers.forEach(function(M){return u.modifiersData[M.name]=Object.assign({},M.data)});for(var y=0;y<u.orderedModifiers.length;y++){if(u.reset===!0){u.reset=!1,y=-1;continue}var T=u.orderedModifiers[y],O=T.fn,k=T.options,R=k===void 0?{}:k,C=T.name;typeof O==\"function\"&&(u=O({state:u,options:R,name:C,instance:m})||u)}}}},update:Da(function(){return new Promise(function(c){m.forceUpdate(),c(u)})}),destroy:function(){g(),v=!0}};if(!Tn(a,l))return m;m.setOptions(i).then(function(c){!v&&i.onFirstUpdate&&i.onFirstUpdate(c)});function h(){u.orderedModifiers.forEach(function(c){var E=c.name,b=c.options,y=b===void 0?{}:b,T=c.effect;if(typeof T==\"function\"){var O=T({state:u,name:E,instance:m,options:y}),k=function(){};d.push(O||k)}})}function g(){d.forEach(function(c){return c()}),d=[]}return m}}nn();var za=[Qn,to,Jn,qn];nn({defaultModifiers:za});var Fa=[Qn,to,Jn,qn,Aa,Ea,Ia,sa,Oa],Ha=nn({defaultModifiers:Fa});const Va=[\"fixed\",\"absolute\"],Wa=ye({boundariesPadding:{type:Number,default:0},fallbackPlacements:{type:X(Array),default:void 0},gpuAcceleration:{type:Boolean,default:!0},offset:{type:Number,default:12},placement:{type:String,values:Gt,default:\"bottom\"},popperOptions:{type:X(Object),default:()=>({})},strategy:{type:String,values:Va,default:\"absolute\"}}),no=ye(ee(F({},Wa),{id:String,style:{type:X([String,Array,Object])},className:{type:X([String,Array,Object])},effect:{type:String,default:\"dark\"},visible:Boolean,enterable:{type:Boolean,default:!0},pure:Boolean,focusOnShow:{type:Boolean,default:!1},trapping:{type:Boolean,default:!1},popperClass:{type:X([String,Array,Object])},popperStyle:{type:X([String,Array,Object])},referenceEl:{type:X(Object)},triggerTargetEl:{type:X(Object)},stopPopperMouseEvent:{type:Boolean,default:!0},ariaLabel:{type:String,default:void 0},virtualTriggering:Boolean,zIndex:Number})),Ka=[\"mouseenter\",\"mouseleave\",\"focus\",\"blur\",\"close\"],An=(e,t)=>{const{placement:n,strategy:o,popperOptions:r}=e,s=ee(F({placement:n,strategy:o},r),{modifiers:qa(e)});return Xa(s,t),Ya(s,r==null?void 0:r.modifiers),s},Ua=e=>{if(!!Ne)return In(e)};function qa(e){const{offset:t,gpuAcceleration:n,fallbackPlacements:o}=e;return[{name:\"offset\",options:{offset:[0,t!=null?t:12]}},{name:\"preventOverflow\",options:{padding:{top:2,bottom:2,left:5,right:5}}},{name:\"flip\",options:{padding:5,fallbackPlacements:o}},{name:\"computeStyles\",options:{gpuAcceleration:n,adaptive:n}}]}function Xa(e,{arrowEl:t,arrowOffset:n}){e.modifiers.push({name:\"arrow\",options:{element:t,padding:n!=null?n:5}})}function Ya(e,t){t&&(e.modifiers=[...e.modifiers,...t!=null?t:[]])}const Ga={name:\"ElPopperContent\"},Za=we(ee(F({},Ga),{props:no,emits:Ka,setup(e,{expose:t,emit:n}){const o=e,{popperInstanceRef:r,contentRef:s,triggerRef:a,role:l}=je(Xt,void 0),i=je(pn,void 0),{nextZIndex:u}=Mn(),d=Re(\"popper\"),v=x(),m=x(\"first\"),h=x(),g=x();it(Dn,{arrowRef:h,arrowOffset:g}),i&&(i.addInputId||i.removeInputId)&&it(pn,ee(F({},i),{addInputId:Bt,removeInputId:Bt}));const c=x(o.zIndex||u()),E=x(!1);let b;const y=S(()=>Ua(o.referenceEl)||p(a)),T=S(()=>[{zIndex:p(c)},o.popperStyle]),O=S(()=>[d.b(),d.is(\"pure\",o.pure),d.is(o.effect),o.popperClass]),k=S(()=>l&&l.value===\"dialog\"?\"false\":void 0),R=({referenceEl:w,popperContentEl:B,arrowEl:P})=>{const D=An(o,{arrowEl:P,arrowOffset:p(g)});return Ha(w,B,D)},C=(w=!0)=>{var B;(B=p(r))==null||B.update(),w&&(c.value=o.zIndex||u())},M=()=>{var w,B;const P={name:\"eventListeners\",enabled:o.visible};(B=(w=p(r))==null?void 0:w.setOptions)==null||B.call(w,D=>ee(F({},D),{modifiers:[...D.modifiers||[],P]})),C(!1),o.visible&&o.focusOnShow?E.value=!0:o.visible===!1&&(E.value=!1)},z=()=>{n(\"focus\")},H=()=>{m.value=\"first\",n(\"blur\")},N=w=>{var B;o.visible&&!E.value&&(w.target&&(m.value=w.target),E.value=!0,w.relatedTarget&&((B=w.relatedTarget)==null||B.focus()))},K=()=>{o.trapping||(E.value=!1)},A=()=>{E.value=!1,n(\"close\")};return ct(()=>{let w;U(y,B=>{var P;w==null||w();const D=p(r);if((P=D==null?void 0:D.destroy)==null||P.call(D),B){const G=p(v);s.value=G,r.value=R({referenceEl:B,popperContentEl:G,arrowEl:p(h)}),w=U(()=>B.getBoundingClientRect(),()=>C(),{immediate:!0})}else r.value=void 0},{immediate:!0}),U(()=>o.triggerTargetEl,(B,P)=>{b==null||b(),b=void 0;const D=p(B||v.value),G=p(P||v.value);if(It(D)){const{ariaLabel:q,id:ce}=Rn(o);b=U([l,q,k,ce],Be=>{[\"role\",\"aria-label\",\"aria-modal\",\"id\"].forEach((fe,Ee)=>{Ut(Be[Ee])?D.removeAttribute(fe):D.setAttribute(fe,Be[Ee])})},{immediate:!0})}G!==D&&It(G)&&[\"role\",\"aria-label\",\"aria-modal\",\"id\"].forEach(q=>{G.removeAttribute(q)})},{immediate:!0}),U(()=>o.visible,M,{immediate:!0}),U(()=>An(o,{arrowEl:p(h),arrowOffset:p(g)}),B=>{var P;return(P=r.value)==null?void 0:P.setOptions(B)})}),ft(()=>{b==null||b(),b=void 0}),t({popperContentRef:v,popperInstanceRef:r,updatePopper:C,contentStyle:T}),(w,B)=>(I(),Y(\"div\",{ref_key:\"popperContentRef\",ref:v,style:Pt(p(T)),class:$(p(O)),tabindex:\"-1\",onMouseenter:B[0]||(B[0]=P=>w.$emit(\"mouseenter\",P)),onMouseleave:B[1]||(B[1]=P=>w.$emit(\"mouseleave\",P))},[te(p($n),{trapped:E.value,\"trap-on-focus-in\":!0,\"focus-trap-el\":v.value,\"focus-start-el\":m.value,onFocusAfterTrapped:z,onFocusAfterReleased:H,onFocusin:N,onFocusoutPrevented:K,onReleaseRequested:A},{default:W(()=>[oe(w.$slots,\"default\")]),_:3},8,[\"trapped\",\"focus-trap-el\",\"focus-start-el\"])],38))}}));var Ja=Ae(Za,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/popper/src/content.vue\"]]);const Qa=qt(Mr),_a=Re(\"tooltip\"),oo=ye(ee(F(F({},cr),no),{appendTo:{type:X([String,Object]),default:zn},content:{type:String,default:\"\"},rawContent:{type:Boolean,default:!1},persistent:Boolean,ariaLabel:String,visible:{type:X(Boolean),default:null},transition:{type:String,default:`${_a.namespace.value}-fade-in-linear`},teleported:{type:Boolean,default:!0},disabled:{type:Boolean}})),ro=ye(ee(F({},Kn),{disabled:Boolean,trigger:{type:X([String,Array]),default:\"hover\"},triggerKeys:{type:X(Array),default:()=>[zt.enter,zt.space]}})),es=ye({openDelay:{type:Number},visibleArrow:{type:Boolean,default:void 0},hideAfter:{type:Number,default:200},showArrow:{type:Boolean,default:!0}}),on=Symbol(\"elTooltip\"),ts=we({name:\"ElTooltipContent\",components:{ElPopperContent:Ja},inheritAttrs:!1,props:oo,setup(e){const t=x(null),n=x(!1),o=x(!1),r=x(!1),s=x(!1),{controlled:a,id:l,open:i,trigger:u,onClose:d,onOpen:v,onShow:m,onHide:h,onBeforeShow:g,onBeforeHide:c}=je(on,void 0),E=S(()=>e.persistent);ft(()=>{s.value=!0});const b=S(()=>p(E)?!0:p(i)),y=S(()=>e.disabled?!1:p(i)),T=S(()=>{var w;return(w=e.style)!=null?w:{}}),O=S(()=>!p(i)),k=()=>{h()},R=()=>{if(p(a))return!0},C=Se(R,()=>{e.enterable&&p(u)===\"hover\"&&v()}),M=Se(R,()=>{p(u)===\"hover\"&&d()}),z=()=>{var w,B;(B=(w=t.value)==null?void 0:w.updatePopper)==null||B.call(w),g==null||g()},H=()=>{c==null||c()},N=()=>{m(),A=xo(S(()=>{var w;return(w=t.value)==null?void 0:w.popperContentRef}),()=>{if(p(a))return;p(u)!==\"hover\"&&d()})},K=()=>{e.virtualTriggering||d()};let A;return U(()=>p(i),w=>{w||A==null||A()},{flush:\"post\"}),{ariaHidden:O,entering:o,leaving:r,id:l,intermediateOpen:n,contentStyle:T,contentRef:t,destroyed:s,shouldRender:b,shouldShow:y,onClose:d,open:i,onAfterShow:N,onBeforeEnter:z,onBeforeLeave:H,onContentEnter:C,onContentLeave:M,onTransitionLeave:k,onBlur:K}}});function ns(e,t,n,o,r,s){const a=ne(\"el-popper-content\");return I(),V(No,{disabled:!e.teleported,to:e.appendTo},[te(Ln,{name:e.transition,onAfterLeave:e.onTransitionLeave,onBeforeEnter:e.onBeforeEnter,onAfterEnter:e.onAfterShow,onBeforeLeave:e.onBeforeLeave},{default:W(()=>[e.shouldRender?We((I(),V(a,rt({key:0,id:e.id,ref:\"contentRef\"},e.$attrs,{\"aria-label\":e.ariaLabel,\"aria-hidden\":e.ariaHidden,\"boundaries-padding\":e.boundariesPadding,\"fallback-placements\":e.fallbackPlacements,\"gpu-acceleration\":e.gpuAcceleration,offset:e.offset,placement:e.placement,\"popper-options\":e.popperOptions,strategy:e.strategy,effect:e.effect,enterable:e.enterable,pure:e.pure,\"popper-class\":e.popperClass,\"popper-style\":[e.popperStyle,e.contentStyle],\"reference-el\":e.referenceEl,\"trigger-target-el\":e.triggerTargetEl,visible:e.shouldShow,\"z-index\":e.zIndex,onMouseenter:e.onContentEnter,onMouseleave:e.onContentLeave,onBlur:e.onBlur,onClose:e.onClose}),{default:W(()=>[j(\" Workaround bug #6378 \"),e.destroyed?j(\"v-if\",!0):oe(e.$slots,\"default\",{key:0})]),_:3},16,[\"id\",\"aria-label\",\"aria-hidden\",\"boundaries-padding\",\"fallback-placements\",\"gpu-acceleration\",\"offset\",\"placement\",\"popper-options\",\"strategy\",\"effect\",\"enterable\",\"pure\",\"popper-class\",\"popper-style\",\"reference-el\",\"trigger-target-el\",\"visible\",\"z-index\",\"onMouseenter\",\"onMouseleave\",\"onBlur\",\"onClose\"])),[[ot,e.shouldShow]]):j(\"v-if\",!0)]),_:3},8,[\"name\",\"onAfterLeave\",\"onBeforeEnter\",\"onAfterEnter\",\"onBeforeLeave\"])],8,[\"disabled\",\"to\"])}var os=Ae(ts,[[\"render\",ns],[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/tooltip/src/content.vue\"]]);const rs=(e,t)=>Do(e)?e.includes(t):e===t,Fe=(e,t,n)=>o=>{rs(p(e),t)&&n(o)},as=we({name:\"ElTooltipTrigger\",components:{ElPopperTrigger:zr},props:ro,setup(e){const t=Re(\"tooltip\"),{controlled:n,id:o,open:r,onOpen:s,onClose:a,onToggle:l}=je(on,void 0),i=x(null),u=()=>{if(p(n)||e.disabled)return!0},d=At(e,\"trigger\"),v=Se(u,Fe(d,\"hover\",s)),m=Se(u,Fe(d,\"hover\",a)),h=Se(u,Fe(d,\"click\",y=>{y.button===0&&l(y)})),g=Se(u,Fe(d,\"focus\",s)),c=Se(u,Fe(d,\"focus\",a)),E=Se(u,Fe(d,\"contextmenu\",y=>{y.preventDefault(),l(y)})),b=Se(u,y=>{const{code:T}=y;e.triggerKeys.includes(T)&&(y.preventDefault(),l(y))});return{onBlur:c,onContextMenu:E,onFocus:g,onMouseenter:v,onMouseleave:m,onClick:h,onKeydown:b,open:r,id:o,triggerRef:i,ns:t}}});function ss(e,t,n,o,r,s){const a=ne(\"el-popper-trigger\");return I(),V(a,{id:e.id,\"virtual-ref\":e.virtualRef,open:e.open,\"virtual-triggering\":e.virtualTriggering,class:$(e.ns.e(\"trigger\")),onBlur:e.onBlur,onClick:e.onClick,onContextmenu:e.onContextMenu,onFocus:e.onFocus,onMouseenter:e.onMouseenter,onMouseleave:e.onMouseleave,onKeydown:e.onKeydown},{default:W(()=>[oe(e.$slots,\"default\")]),_:3},8,[\"id\",\"virtual-ref\",\"open\",\"virtual-triggering\",\"class\",\"onBlur\",\"onClick\",\"onContextmenu\",\"onFocus\",\"onMouseenter\",\"onMouseleave\",\"onKeydown\"])}var is=Ae(as,[[\"render\",ss],[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/tooltip/src/trigger.vue\"]]);const{useModelToggleProps:ls,useModelToggle:us,useModelToggleEmits:ps}=ar(\"visible\"),cs=we({name:\"ElTooltip\",components:{ElPopper:Qa,ElPopperArrow:Lr,ElTooltipContent:os,ElTooltipTrigger:is},props:F(F(F(F(F(F({},Hn),ls),oo),ro),Vn),es),emits:[...ps,\"before-show\",\"before-hide\",\"show\",\"hide\",\"open\",\"close\"],setup(e,{emit:t}){pr();const n=S(()=>(Ft(e.openDelay),e.openDelay||e.showAfter)),o=S(()=>(Ft(e.visibleArrow),Dt(e.visibleArrow)?e.visibleArrow:e.showArrow)),r=Ht(),s=x(null),a=x(null),l=()=>{var b;const y=p(s);y&&((b=y.popperInstanceRef)==null||b.update())},i=x(!1),u=x(void 0),{show:d,hide:v,hasUpdateHandler:m}=us({indicator:i,toggleReason:u}),{onOpen:h,onClose:g}=fr({showAfter:n,hideAfter:At(e,\"hideAfter\"),open:d,close:v}),c=S(()=>Dt(e.visible)&&!m.value);it(on,{controlled:c,id:r,open:jo(i),trigger:At(e,\"trigger\"),onOpen:b=>{h(b)},onClose:b=>{g(b)},onToggle:b=>{p(i)?g(b):h(b)},onShow:()=>{t(\"show\",u.value)},onHide:()=>{t(\"hide\",u.value)},onBeforeShow:()=>{t(\"before-show\",u.value)},onBeforeHide:()=>{t(\"before-hide\",u.value)},updatePopper:l}),U(()=>e.disabled,b=>{b&&i.value&&(i.value=!1)});const E=()=>{var b,y;const T=(y=(b=a.value)==null?void 0:b.contentRef)==null?void 0:y.popperContentRef;return T&&T.contains(document.activeElement)};return zo(()=>i.value&&v()),{compatShowAfter:n,compatShowArrow:o,popperRef:s,contentRef:a,open:i,hide:v,isFocusInsideContent:E,updatePopper:l,onOpen:h,onClose:g}}}),fs=[\"innerHTML\"],ds={key:1};function vs(e,t,n,o,r,s){const a=ne(\"el-tooltip-trigger\"),l=ne(\"el-popper-arrow\"),i=ne(\"el-tooltip-content\"),u=ne(\"el-popper\");return I(),V(u,{ref:\"popperRef\",role:e.role},{default:W(()=>[te(a,{disabled:e.disabled,trigger:e.trigger,\"trigger-keys\":e.triggerKeys,\"virtual-ref\":e.virtualRef,\"virtual-triggering\":e.virtualTriggering},{default:W(()=>[e.$slots.default?oe(e.$slots,\"default\",{key:0}):j(\"v-if\",!0)]),_:3},8,[\"disabled\",\"trigger\",\"trigger-keys\",\"virtual-ref\",\"virtual-triggering\"]),te(i,{ref:\"contentRef\",\"aria-label\":e.ariaLabel,\"boundaries-padding\":e.boundariesPadding,content:e.content,disabled:e.disabled,effect:e.effect,enterable:e.enterable,\"fallback-placements\":e.fallbackPlacements,\"hide-after\":e.hideAfter,\"gpu-acceleration\":e.gpuAcceleration,offset:e.offset,persistent:e.persistent,\"popper-class\":e.popperClass,\"popper-style\":e.popperStyle,placement:e.placement,\"popper-options\":e.popperOptions,pure:e.pure,\"raw-content\":e.rawContent,\"reference-el\":e.referenceEl,\"trigger-target-el\":e.triggerTargetEl,\"show-after\":e.compatShowAfter,strategy:e.strategy,teleported:e.teleported,transition:e.transition,\"virtual-triggering\":e.virtualTriggering,\"z-index\":e.zIndex,\"append-to\":e.appendTo},{default:W(()=>[oe(e.$slots,\"content\",{},()=>[e.rawContent?(I(),Y(\"span\",{key:0,innerHTML:e.content},null,8,fs)):(I(),Y(\"span\",ds,ge(e.content),1))]),e.compatShowArrow?(I(),V(l,{key:0,\"arrow-offset\":e.arrowOffset},null,8,[\"arrow-offset\"])):j(\"v-if\",!0)]),_:3},8,[\"aria-label\",\"boundaries-padding\",\"content\",\"disabled\",\"effect\",\"enterable\",\"fallback-placements\",\"hide-after\",\"gpu-acceleration\",\"offset\",\"persistent\",\"popper-class\",\"popper-style\",\"placement\",\"popper-options\",\"pure\",\"raw-content\",\"reference-el\",\"trigger-target-el\",\"show-after\",\"strategy\",\"teleported\",\"transition\",\"virtual-triggering\",\"z-index\",\"append-to\"])]),_:3},8,[\"role\"])}var ms=Ae(cs,[[\"render\",vs],[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/tooltip/src/tooltip.vue\"]]);const Rs=qt(ms),Wt=\"_trap-focus-children\",xe=[],Bn=e=>{if(xe.length===0)return;const t=xe[xe.length-1][Wt];if(t.length>0&&e.code===zt.tab){if(t.length===1){e.preventDefault(),document.activeElement!==t[0]&&t[0].focus();return}const n=e.shiftKey,o=e.target===t[0],r=e.target===t[t.length-1];o&&n&&(e.preventDefault(),t[t.length-1].focus()),r&&!n&&(e.preventDefault(),t[0].focus())}},gs={beforeMount(e){e[Wt]=dn(e),xe.push(e),xe.length<=1&&document.addEventListener(\"keydown\",Bn)},updated(e){ue(()=>{e[Wt]=dn(e)})},unmounted(){xe.shift(),xe.length===0&&document.removeEventListener(\"keydown\",Bn)}},hs=we({name:\"ElMessageBox\",directives:{TrapFocus:gs},components:F({ElButton:Fo,ElFocusTrap:$n,ElInput:Br,ElOverlay:Ho,ElIcon:He},Vo),inheritAttrs:!1,props:{buttonSize:{type:String,validator:Jo},modal:{type:Boolean,default:!0},lockScroll:{type:Boolean,default:!0},showClose:{type:Boolean,default:!0},closeOnClickModal:{type:Boolean,default:!0},closeOnPressEscape:{type:Boolean,default:!0},closeOnHashChange:{type:Boolean,default:!0},center:Boolean,draggable:Boolean,roundButton:{default:!1,type:Boolean},container:{type:String,default:\"body\"},boxType:{type:String,default:\"\"}},emits:[\"vanish\",\"action\"],setup(e,{emit:t}){const{t:n}=Wo(),o=Re(\"message-box\"),r=x(!1),{nextZIndex:s}=Mn(),a=Ko({autofocus:!0,beforeClose:null,callback:null,cancelButtonText:\"\",cancelButtonClass:\"\",confirmButtonText:\"\",confirmButtonClass:\"\",customClass:\"\",customStyle:{},dangerouslyUseHTMLString:!1,distinguishCancelAndClose:!1,icon:\"\",inputPattern:null,inputPlaceholder:\"\",inputType:\"text\",inputValue:null,inputValidator:null,inputErrorMessage:\"\",message:null,modalFade:!0,modalClass:\"\",showCancelButton:!1,showConfirmButton:!0,type:\"\",title:void 0,showInput:!1,action:\"\",confirmButtonLoading:!1,cancelButtonLoading:!1,confirmButtonDisabled:!1,editorErrorMessage:\"\",validateError:!1,zIndex:s()}),l=S(()=>{const A=a.type;return{[o.bm(\"icon\",A)]:A&&cn[A]}}),i=Ht(),u=Ht(),d=kn(S(()=>e.buttonSize),{prop:!0,form:!0,formItem:!0}),v=S(()=>a.icon||cn[a.type]||\"\"),m=S(()=>!!a.message),h=x(),g=x(),c=x(),E=x(),b=x(),y=S(()=>a.confirmButtonClass);U(()=>a.inputValue,A=>ke(this,null,function*(){yield ue(),e.boxType===\"prompt\"&&A!==null&&z()}),{immediate:!0}),U(()=>r.value,A=>{var w,B;A&&(e.boxType!==\"prompt\"&&(a.autofocus?c.value=(B=(w=b.value)==null?void 0:w.$el)!=null?B:h.value:c.value=h.value),a.zIndex=s()),e.boxType===\"prompt\"&&(A?ue().then(()=>{var P;E.value&&E.value.$el&&(a.autofocus?c.value=(P=H())!=null?P:h.value:c.value=h.value)}):(a.editorErrorMessage=\"\",a.validateError=!1))});const T=S(()=>e.draggable);Uo(h,g,T),ct(()=>ke(this,null,function*(){yield ue(),e.closeOnHashChange&&window.addEventListener(\"hashchange\",O)})),ft(()=>{e.closeOnHashChange&&window.removeEventListener(\"hashchange\",O)});function O(){!r.value||(r.value=!1,ue(()=>{a.action&&t(\"action\",a.action)}))}const k=()=>{e.closeOnClickModal&&M(a.distinguishCancelAndClose?\"close\":\"cancel\")},R=Xo(k),C=A=>{if(a.inputType!==\"textarea\")return A.preventDefault(),M(\"confirm\")},M=A=>{var w;e.boxType===\"prompt\"&&A===\"confirm\"&&!z()||(a.action=A,a.beforeClose?(w=a.beforeClose)==null||w.call(a,A,a,O):O())},z=()=>{if(e.boxType===\"prompt\"){const A=a.inputPattern;if(A&&!A.test(a.inputValue||\"\"))return a.editorErrorMessage=a.inputErrorMessage||n(\"el.messagebox.error\"),a.validateError=!0,!1;const w=a.inputValidator;if(typeof w==\"function\"){const B=w(a.inputValue);if(B===!1)return a.editorErrorMessage=a.inputErrorMessage||n(\"el.messagebox.error\"),a.validateError=!0,!1;if(typeof B==\"string\")return a.editorErrorMessage=B,a.validateError=!0,!1}}return a.editorErrorMessage=\"\",a.validateError=!1,!0},H=()=>{const A=E.value.$refs;return A.input||A.textarea},N=()=>{M(\"close\")},K=()=>{e.closeOnPressEscape&&N()};return e.lockScroll&&qo(r),sr(r),ee(F({},Rn(a)),{ns:o,overlayEvent:R,visible:r,hasMessage:m,typeClass:l,contentId:i,inputId:u,btnSize:d,iconComponent:v,confirmButtonClasses:y,rootRef:h,focusStartRef:c,headerRef:g,inputRef:E,confirmRef:b,doClose:O,handleClose:N,onCloseRequested:K,handleWrapperClick:k,handleInputEnter:C,handleAction:M,t:n})}}),bs=[\"aria-label\",\"aria-describedby\"],ys=[\"aria-label\"],ws=[\"id\"];function Es(e,t,n,o,r,s){const a=ne(\"el-icon\"),l=ne(\"close\"),i=ne(\"el-input\"),u=ne(\"el-button\"),d=ne(\"el-focus-trap\"),v=ne(\"el-overlay\");return I(),V(Ln,{name:\"fade-in-linear\",onAfterLeave:t[11]||(t[11]=m=>e.$emit(\"vanish\")),persisted:\"\"},{default:W(()=>[We(te(v,{\"z-index\":e.zIndex,\"overlay-class\":[e.ns.is(\"message-box\"),e.modalClass],mask:e.modal},{default:W(()=>[Z(\"div\",{role:\"dialog\",\"aria-label\":e.title,\"aria-modal\":\"true\",\"aria-describedby\":e.showInput?void 0:e.contentId,class:$(`${e.ns.namespace.value}-overlay-message-box`),onClick:t[8]||(t[8]=(...m)=>e.overlayEvent.onClick&&e.overlayEvent.onClick(...m)),onMousedown:t[9]||(t[9]=(...m)=>e.overlayEvent.onMousedown&&e.overlayEvent.onMousedown(...m)),onMouseup:t[10]||(t[10]=(...m)=>e.overlayEvent.onMouseup&&e.overlayEvent.onMouseup(...m))},[te(d,{loop:\"\",trapped:e.visible,\"focus-trap-el\":e.rootRef,\"focus-start-el\":e.focusStartRef,onReleaseRequested:e.onCloseRequested},{default:W(()=>[Z(\"div\",{ref:\"rootRef\",class:$([e.ns.b(),e.customClass,e.ns.is(\"draggable\",e.draggable),{[e.ns.m(\"center\")]:e.center}]),style:Pt(e.customStyle),tabindex:\"-1\",onClick:t[7]||(t[7]=nt(()=>{},[\"stop\"]))},[e.title!==null&&e.title!==void 0?(I(),Y(\"div\",{key:0,ref:\"headerRef\",class:$(e.ns.e(\"header\"))},[Z(\"div\",{class:$(e.ns.e(\"title\"))},[e.iconComponent&&e.center?(I(),V(a,{key:0,class:$([e.ns.e(\"status\"),e.typeClass])},{default:W(()=>[(I(),V(Me(e.iconComponent)))]),_:1},8,[\"class\"])):j(\"v-if\",!0),Z(\"span\",null,ge(e.title),1)],2),e.showClose?(I(),Y(\"button\",{key:0,type:\"button\",class:$(e.ns.e(\"headerbtn\")),\"aria-label\":e.t(\"el.messagebox.close\"),onClick:t[0]||(t[0]=m=>e.handleAction(e.distinguishCancelAndClose?\"close\":\"cancel\")),onKeydown:t[1]||(t[1]=Et(nt(m=>e.handleAction(e.distinguishCancelAndClose?\"close\":\"cancel\"),[\"prevent\"]),[\"enter\"]))},[te(a,{class:$(e.ns.e(\"close\"))},{default:W(()=>[te(l)]),_:1},8,[\"class\"])],42,ys)):j(\"v-if\",!0)],2)):j(\"v-if\",!0),Z(\"div\",{id:e.contentId,class:$(e.ns.e(\"content\"))},[Z(\"div\",{class:$(e.ns.e(\"container\"))},[e.iconComponent&&!e.center&&e.hasMessage?(I(),V(a,{key:0,class:$([e.ns.e(\"status\"),e.typeClass])},{default:W(()=>[(I(),V(Me(e.iconComponent)))]),_:1},8,[\"class\"])):j(\"v-if\",!0),e.hasMessage?(I(),Y(\"div\",{key:1,class:$(e.ns.e(\"message\"))},[oe(e.$slots,\"default\",{},()=>[e.dangerouslyUseHTMLString?(I(),V(Me(e.showInput?\"label\":\"p\"),{key:1,for:e.showInput?e.inputId:void 0,innerHTML:e.message},null,8,[\"for\",\"innerHTML\"])):(I(),V(Me(e.showInput?\"label\":\"p\"),{key:0,for:e.showInput?e.inputId:void 0},{default:W(()=>[Nt(ge(e.dangerouslyUseHTMLString?\"\":e.message),1)]),_:1},8,[\"for\"]))])],2)):j(\"v-if\",!0)],2),We(Z(\"div\",{class:$(e.ns.e(\"input\"))},[te(i,{id:e.inputId,ref:\"inputRef\",modelValue:e.inputValue,\"onUpdate:modelValue\":t[2]||(t[2]=m=>e.inputValue=m),type:e.inputType,placeholder:e.inputPlaceholder,\"aria-invalid\":e.validateError,class:$({invalid:e.validateError}),onKeydown:Et(e.handleInputEnter,[\"enter\"])},null,8,[\"id\",\"modelValue\",\"type\",\"placeholder\",\"aria-invalid\",\"class\",\"onKeydown\"]),Z(\"div\",{class:$(e.ns.e(\"errormsg\")),style:Pt({visibility:e.editorErrorMessage?\"visible\":\"hidden\"})},ge(e.editorErrorMessage),7)],2),[[ot,e.showInput]])],10,ws),Z(\"div\",{class:$(e.ns.e(\"btns\"))},[e.showCancelButton?(I(),V(u,{key:0,loading:e.cancelButtonLoading,class:$([e.cancelButtonClass]),round:e.roundButton,size:e.btnSize,onClick:t[3]||(t[3]=m=>e.handleAction(\"cancel\")),onKeydown:t[4]||(t[4]=Et(nt(m=>e.handleAction(\"cancel\"),[\"prevent\"]),[\"enter\"]))},{default:W(()=>[Nt(ge(e.cancelButtonText||e.t(\"el.messagebox.cancel\")),1)]),_:1},8,[\"loading\",\"class\",\"round\",\"size\"])):j(\"v-if\",!0),We(te(u,{ref:\"confirmRef\",type:\"primary\",loading:e.confirmButtonLoading,class:$([e.confirmButtonClasses]),round:e.roundButton,disabled:e.confirmButtonDisabled,size:e.btnSize,onClick:t[5]||(t[5]=m=>e.handleAction(\"confirm\")),onKeydown:t[6]||(t[6]=Et(nt(m=>e.handleAction(\"confirm\"),[\"prevent\"]),[\"enter\"]))},{default:W(()=>[Nt(ge(e.confirmButtonText||e.t(\"el.messagebox.confirm\")),1)]),_:1},8,[\"loading\",\"class\",\"round\",\"disabled\",\"size\"]),[[ot,e.showConfirmButton]])],2)],6)]),_:3},8,[\"trapped\",\"focus-trap-el\",\"focus-start-el\",\"onReleaseRequested\"])],42,bs)]),_:3},8,[\"z-index\",\"overlay-class\",\"mask\"]),[[ot,e.visible]])]),_:3})}var Cs=Ae(hs,[[\"render\",Es],[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/message-box/src/index.vue\"]]);const pt=new Map,Os=(e,t,n=null)=>{const o=te(Cs,e,Ve(e.message)||xn(e.message)?{default:Ve(e.message)?e.message:()=>e.message}:null);return o.appContext=n,Nn(o,t),document.body.appendChild(t.firstElementChild),o.component},Ss=()=>document.createElement(\"div\"),Ts=(e,t)=>{const n=Ss();e.onVanish=()=>{Nn(null,n),pt.delete(r)},e.onAction=s=>{const a=pt.get(r);let l;e.showInput?l={value:r.inputValue,action:s}:l=s,e.callback?e.callback(l,o.proxy):s===\"cancel\"||s===\"close\"?e.distinguishCancelAndClose&&s!==\"cancel\"?a.reject(\"close\"):a.reject(\"cancel\"):a.resolve(l)};const o=Os(e,n,t),r=o.proxy;for(const s in e)fn(e,s)&&!fn(r.$props,s)&&(r[s]=e[s]);return r.visible=!0,r};function Ge(e,t=null){if(!Ne)return Promise.reject();let n;return Ot(e)||xn(e)?e={message:e}:n=e.callback,new Promise((o,r)=>{const s=Ts(e,t!=null?t:Ge._context);pt.set(s,{options:e,callback:n,resolve:o,reject:r})})}const As=[\"alert\",\"confirm\",\"prompt\"],Bs={alert:{closeOnPressEscape:!1,closeOnClickModal:!1},confirm:{showCancelButton:!0},prompt:{showCancelButton:!0,showInput:!0}};As.forEach(e=>{Ge[e]=Ps(e)});function Ps(e){return(t,n,o,r)=>{let s=\"\";return kt(n)?(o=n,s=\"\"):Ft(n)?s=\"\":s=n,Ge(Object.assign(F({title:s,message:t,type:\"\"},Bs[e]),o,{boxType:e}),r)}}Ge.close=()=>{pt.forEach((e,t)=>{t.doClose()}),pt.clear()};Ge._context=null;const Ie=Ge;Ie.install=e=>{Ie._context=e._context,e.config.globalProperties.$msgbox=Ie,e.config.globalProperties.$messageBox=Ie,e.config.globalProperties.$alert=Ie.alert,e.config.globalProperties.$confirm=Ie.confirm,e.config.globalProperties.$prompt=Ie.prompt};const $s=Ie;export{$s as E,Nr as O,oo as a,Rs as b,Se as c,Jo as i,ro as u,Ms as w,Ha as y};\n"
  },
  {
    "path": "luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.c69499bb.js",
    "content": "var re=Object.defineProperty,ie=Object.defineProperties;var de=Object.getOwnPropertyDescriptors;var J=Object.getOwnPropertySymbols;var fe=Object.prototype.hasOwnProperty,_e=Object.prototype.propertyIsEnumerable;var K=(n,e,t)=>e in n?re(n,e,{enumerable:!0,configurable:!0,writable:!0,value:t}):n[e]=t,j=(n,e)=>{for(var t in e||(e={}))fe.call(e,t)&&K(n,t,e[t]);if(J)for(var t of J(e))_e.call(e,t)&&K(n,t,e[t]);return n},G=(n,e)=>ie(n,de(e));var B=(n,e,t)=>new Promise((s,F)=>{var u=r=>{try{x(t.next(r))}catch(d){F(d)}},g=r=>{try{x(t.throw(r))}catch(d){F(d)}},x=r=>r.done?s(r.value):Promise.resolve(r.value).then(u,g);x((t=t.apply(n,e)).next())});import{e as S,Z as me,$ as ne,a0 as z,n as C,av as oe,a9 as T,aa as v,a1 as I,q as _,t as k,x as p,v as E,y as o,P as ae,ax as se,A as a,a4 as w,B as he,F as $,a5 as L,a6 as U,a7 as V,az as pe,I as O,O as q,z as N,r as ve,C as Ee,a3 as Q,H as ye,a2 as ue,aA as ge}from\"./index.js\";import{u as W,s as X}from\"./chunk.6424c2fc.js\";import{c as ce,d as Fe,a as Y,E as xe,b as ee,f as te,e as H,_ as be}from\"./chunk.a0a5dece.js\";import{E as M}from\"./chunk.a6a47e72.js\";const De={class:\"file-checkbox\"},Be=[\"value\"],Ce=[\"title\"],$e={class:\"thumbnail\"},ke={class:\"file-name\"},Ae={class:\"file-date\"},we={class:\"file-type\"},Re={class:\"file-size\"},Se=S({__name:\"file\",props:{file:{type:Object,required:!0},index:{type:Number,required:!0}},setup(n){const e=n,t=me.ComputeSize,s=W(),F=ne(),u=z(),g=C(()=>[{name:\"\\u4E0B\\u8F7D\",disabled:e.file.fileType===\"dir\",f:A},{name:\"\\u79FB\\u9664\\u6587\\u4EF6\",f:m},{name:\"\\u6062\\u590D\\u6587\\u4EF6\",f:c}]),x=C(()=>s.checknoxEntries.indexOf(e.file.rootPath)!=-1),r=C(()=>s.copy.type==\"move\"&&s.copy.values.indexOf(e.file.rootPath)!=-1),d=oe.getFileType,m=()=>{const f=e.file;M.confirm(`\\u5220\\u9664\\u6240\\u9009\\u7684 ${f.name} \\u6587\\u4EF6, \\u662F\\u5426\\u7EE7\\u7EED?`,\"\\u63D0\\u793A\",{confirmButtonText:\"\\u786E\\u8BA4\",cancelButtonText:\"\\u53D6\\u6D88\",type:\"warning\"}).then(()=>B(this,null,function*(){yield l([f.rootPath])})).catch(()=>{})},l=f=>B(this,null,function*(){try{const y={paths:f.filter(D=>D!=null).map(D=>`/local${D}`),force:!0},R=yield T.File.Basic.Recycle.Remove.POST(y);if(R.data){const{success:D,error:P}=R.data;P&&v.Warning(P),D===0&&(v.Success(\"\\u5220\\u9664\\u6210\\u529F\"),s.reload())}}catch(y){v.Error(`${y}`)}}),c=()=>{const f=e.file;M.confirm(`\\u6062\\u590D\\u6240\\u9009\\u7684 ${f.name} \\u6587\\u4EF6/\\u6587\\u4EF6\\u5939, \\u662F\\u5426\\u7EE7\\u7EED?`,\"\\u63D0\\u793A\",{confirmButtonText:\"\\u786E\\u8BA4\",cancelButtonText:\"\\u53D6\\u6D88\"}).then(()=>B(this,null,function*(){yield i([f.rootPath])})).catch(()=>{})},i=f=>B(this,null,function*(){try{const y={paths:f.filter(D=>D!=null).map(D=>`/local${D}`),force:!0},R=yield T.File.Basic.Recycle.Restore.POST(y);if(R.data){const{success:D,error:P}=R.data;P&&v.Warning(P),D===0&&(v.Success(\"\\u6062\\u590D\\u6210\\u529F\"),s.reload())}}catch(y){v.Error(`${y}`)}}),h=()=>{const f=e.file;if(f.fileType===\"dir\"){b(f);return}},A=()=>{const f=e.file;window.open(f.getDownloadUrl()+\"?binary=true\",\"_blank\")},b=f=>{let y=\"/\";f.rootPath===void 0?y=`/${f.name}`:y=f.rootPath,F.push({query:G(j({},u.query),{path:y})})};return(f,y)=>{const R=I(\"thumbnail\");return _(),k(Fe,{class:\"file\",draggable:\"true\",checkbox:a(x),move:a(r),index:n.index},{default:p(()=>[E(ce,{class:\"file-container\",list:a(g)},{default:p(()=>[o(\"div\",De,[ae(o(\"input\",{type:\"checkbox\",value:n.file.rootPath,\"onUpdate:modelValue\":y[0]||(y[0]=D=>a(s).checknoxEntries=D)},null,8,Be),[[se,a(s).checknoxEntries]])]),o(\"div\",{class:\"file-info\",onClick:y[1]||(y[1]=he(D=>h(),[\"prevent\"])),title:n.file.name},[o(\"div\",$e,[E(R,{file:n.file},null,8,[\"file\"])]),o(\"div\",ke,w(n.file.name),1)],8,Ce),o(\"div\",Ae,w(n.file.modifiedTime),1),o(\"div\",we,w(a(d)(n.file.iconType)),1),o(\"div\",Re,w(a(t)(n.file.size)),1)]),_:1},8,[\"list\"])]),_:1},8,[\"checkbox\",\"move\",\"index\"])}}}),Te=n=>(L(\"data-v-582e2fad\"),n=n(),U(),n),Oe={class:\"notfound\"},Pe=Te(()=>o(\"p\",null,\"\\u5F53\\u524D\\u76EE\\u5F55\\u6CA1\\u6709\\u6587\\u4EF6\\u54E6\",-1)),Ie=S({__name:\"notfound\",setup(n){const e=\"/luci-static/linkeasefile/icons/notfound.png\";return(t,s)=>(_(),$(\"div\",Oe,[o(\"img\",{src:e,alt:\"\"}),Pe]))}});const qe=V(Ie,[[\"__scopeId\",\"data-v-582e2fad\"]]),Me=S({__name:\"files\",setup(n){return B(this,null,function*(){let e,t;const s=W(),F=z(),{path:u}=F.query,g=C(()=>s.config),x=()=>B(this,null,function*(){s.checknoxEntries=[];let r=[];try{const d={path:`/local${u||\"/\"}`,order:X.order.get(),orderBy:X.orderBy.get()};s.config.filter&&s.config.filter!=\"default\"&&(d.filter=s.config.filter);const m=yield T.File.Basic.Recycle.List.POST(d);if(m.data){const{success:l,result:c,error:i}=m.data;l==0&&(r=c.entries||[]),i&&v.Warning(i)}}catch(d){v.Error(`${d}`),console.log(d)}finally{s.entries=oe.FileBasicEntryArray(r),r=[]}});return[e,t]=pe(()=>x()),yield e,t(),(r,d)=>a(s).entries.length>0?(_(),$(\"div\",{key:0,class:N([\"files\",a(g).model?\"list\":\"model\"])},[(_(!0),$(O,null,q(a(s).entries,(m,l)=>(_(),k(Se,{file:m,index:l},null,8,[\"file\",\"index\"]))),256))],2)):(_(),k(qe,{key:1,entries:a(s).entries},null,8,[\"entries\"]))})}});const ze=V(Me,[[\"__scopeId\",\"data-v-41d38675\"]]),le=n=>(L(\"data-v-190fc61d\"),n=n(),U(),n),Ve={class:\"f\"},We={class:\"setting\"},Ne=le(()=>o(\"em\",null,null,-1)),Le=le(()=>o(\"em\",null,null,-1)),Ue=S({__name:\"checkbox\",setup(n){const e=ve(!1),t=W(),s=C(()=>(e.value=t.checknoxEntries.length>0,t.checknoxEntries||[])),F=()=>{if(t.entries.length==0){e.value=!1;return}if(t.checknoxEntries.length>0)t.checknoxEntries=[];else{const l=[];let c=t.entries.length;for(let i=0;i<c;i++)l.push(t.entries[i].rootPath);t.checknoxEntries=l}e.value=t.checknoxEntries.length>0},u=()=>{M.confirm(\"\\u6E05\\u7A7A\\u56DE\\u6536\\u7AD9\\u7684\\u6240\\u6709\\u6587\\u4EF6, \\u662F\\u5426\\u7EE7\\u7EED?\",\"\\u63D0\\u793A\",{confirmButtonText:\"\\u786E\\u8BA4\",cancelButtonText:\"\\u53D6\\u6D88\",type:\"error\"}).then(()=>B(this,null,function*(){yield g()})).catch(()=>{})},g=()=>B(this,null,function*(){try{const l={path:\"/local\"},c=yield T.File.Basic.Recycle.Clear.POST(l);if(c.data){const{success:i,error:h}=c.data;h&&v.Warning(h),i===0&&(v.Success(\"\\u6E05\\u7A7A\\u56DE\\u6536\\u7AD9\\u6210\\u529F\"),t.reload())}}catch(l){v.Error(`${l}`)}}),x=()=>{const l=t.checknoxEntries.length;M.confirm(`\\u6E05\\u7A7A\\u56DE\\u6536\\u7AD9\\u6240\\u9009\\u7684 ${l} \\u4E2A\\u6587\\u4EF6\\u6216\\u6587\\u4EF6\\u5939, \\u662F\\u5426\\u7EE7\\u7EED?`,\"\\u63D0\\u793A\",{confirmButtonText:\"\\u786E\\u8BA4\",cancelButtonText:\"\\u53D6\\u6D88\",type:\"error\"}).then(()=>B(this,null,function*(){yield r(t.checknoxEntries)})).catch(()=>{})},r=l=>B(this,null,function*(){try{const c={paths:l.filter(h=>h!=null).map(h=>`/local${h}`),force:!0},i=yield T.File.Basic.Recycle.Remove.POST(c);if(i.data){const{success:h,error:A}=i.data;A&&v.Warning(A),h===0&&(v.Success(\"\\u5220\\u9664\\u6210\\u529F\"),t.reload())}}catch(c){v.Error(`${c}`)}}),d=()=>{const l=t.checknoxEntries.length;M.confirm(`\\u6062\\u590D\\u56DE\\u6536\\u7AD9\\u6240\\u9009\\u7684 ${l} \\u4E2A\\u6587\\u4EF6\\u6216\\u6587\\u4EF6\\u5939, \\u662F\\u5426\\u7EE7\\u7EED?`,\"\\u63D0\\u793A\",{confirmButtonText:\"\\u786E\\u8BA4\",cancelButtonText:\"\\u53D6\\u6D88\"}).then(()=>B(this,null,function*(){yield m(t.checknoxEntries)})).catch(()=>{})},m=l=>B(this,null,function*(){try{const c={paths:l.filter(h=>h!=null).map(h=>`/local${h}`),force:!0},i=yield T.File.Basic.Recycle.Restore.POST(c);if(i.data){const{success:h,error:A}=i.data;A&&v.Warning(A),h===0&&(v.Success(\"\\u6062\\u590D\\u6210\\u529F\"),t.reload())}}catch(c){v.Error(`${c}`)}});return(l,c)=>(_(),$(\"div\",Ve,[o(\"label\",null,[ae(o(\"input\",{type:\"checkbox\",value:!1,\"onUpdate:modelValue\":c[0]||(c[0]=i=>e.value=i),onChange:F},null,544),[[se,e.value]]),o(\"span\",null,w(a(s).length>0?`\\u5DF2\\u9009\\u4E2D${a(s).length}\\u4E2A\\u6587\\u4EF6/\\u6587\\u4EF6\\u5939`:\"\\u5168\\u9009\"),1)]),o(\"div\",We,[o(\"button\",{onClick:c[1]||(c[1]=i=>u())},\"\\u6E05\\u7A7A\\u56DE\\u6536\\u7AD9\"),a(s).length>0?(_(),$(O,{key:0},[Ne,o(\"button\",{onClick:c[2]||(c[2]=i=>x())},\"\\u6E05\\u7A7A\\u9009\\u4E2D\"),Le,o(\"button\",{onClick:c[3]||(c[3]=i=>d())},\"\\u6062\\u590D\\u9009\\u4E2D\")],64)):Ee(\"\",!0)])]))}});const je=V(Ue,[[\"__scopeId\",\"data-v-190fc61d\"]]),Ge=S({__name:\"nav\",setup(n){const e=z(),t=ne(),s=C(()=>e.query),F=C(()=>s.value.path||\"\"),u=C(()=>(F.value||\"\").split(\"/\")||[]),g=C(()=>{var r;return u.value&&u.value.length>0?(r=u.value)==null?void 0:r.splice(1):[]}),x=r=>{const d=g.value.slice(0,r+1);t.push({query:G(j({},e.query),{path:\"/\"+d.join(\"/\")})})};return(r,d)=>(_(),k(a(ue),{class:\"page-nav-container\"},{default:p(()=>[E(a(xe),{\"separator-icon\":a(ye),class:\"nav-breadcrumb\"},{default:p(()=>[a(g)&&a(g).length>0?(_(!0),$(O,{key:0},q(a(g),(m,l)=>(_(),k(a(Y),{onClick:c=>x(l),class:\"nav-breadcrumb_item\"},{default:p(()=>[Q(w(l==0?\"\\u6839\\u76EE\\u5F55\":m),1)]),_:2},1032,[\"onClick\"]))),256)):(_(),k(a(Y),{key:1,onClick:d[0]||(d[0]=m=>x(0)),class:\"nav-breadcrumb_item\"},{default:p(()=>[Q(\" \\u6839\\u76EE\\u5F55 \")]),_:1}))]),_:1},8,[\"separator-icon\"])]),_:1}))}}),Z=n=>(L(\"data-v-cc8dcce8\"),n=n(),U(),n),He={class:\"tools\"},Ze={class:\"tool-item\"},Je=Z(()=>o(\"em\",null,null,-1)),Ke=Z(()=>o(\"em\",null,null,-1)),Qe={class:\"tool-item\"},Xe=Z(()=>o(\"em\",null,null,-1)),Ye={class:\"tool-item\"},et=S({__name:\"tools\",setup(n){const e=W(),t=ge(e.config),s=[{name:\"\\u540D\\u79F0\",label:\"filename\"},{name:\"\\u65F6\\u95F4\",label:\"date\"},{name:\"\\u5927\\u5C0F\",label:\"size\"},{name:\"\\u7C7B\\u578B\",label:\"filetype\"}],F=[{name:\"\\u9012\\u589E\",label:\"asc\"},{name:\"\\u9012\\u51CF\",label:\"desc\"}],u=[{name:\"\\u5168\\u90E8\",label:\"default\"},{name:\"\\u56FE\\u7247\",label:\"image\"},{name:\"\\u538B\\u7F29\\u6587\\u4EF6\",label:\"archive\"},{name:\"\\u89C6\\u9891\",label:\"video\"},{name:\"\\u97F3\\u4E50\",label:\"music\"},{name:\"\\u6587\\u6863\",label:\"doc\"},{name:\"\\u5176\\u5B83\",label:\"other\"}],g=z();C(()=>g.query.path);const x=()=>{e.setConfigModel()},r=m=>{switch(m){case\"date\":case\"size\":case\"filetype\":case\"filename\":e.setConfigOrder(m);break;case\"desc\":case\"asc\":e.setConfigOrderBy(m);break}e.reload()},d=m=>{e.setConfigFilter(m),e.reload()};return(m,l)=>{const c=I(\"icon-sort-file\"),i=I(\"icon-category\"),h=I(\"icon-model-file\"),A=I(\"icon-list-file\");return _(),$(\"div\",He,[o(\"div\",Ze,[E(a(te),{onCommand:r},{dropdown:p(()=>[E(a(ee),null,{default:p(()=>[(_(),$(O,null,q(s,b=>E(a(H),{class:N([\"sort-item\",{on:b.label==t.order}]),command:b.label},{default:p(()=>[Je,o(\"span\",null,w(b.name),1)]),_:2},1032,[\"class\",\"command\"])),64)),(_(),$(O,null,q(F,b=>E(a(H),{class:N([\"sort-item\",{on:b.label==t.orderBy}]),command:b.label},{default:p(()=>[Ke,o(\"span\",null,w(b.name),1)]),_:2},1032,[\"class\",\"command\"])),64))]),_:1})]),default:p(()=>[o(\"button\",null,[E(c)])]),_:1})]),o(\"div\",Qe,[E(a(te),{onCommand:d},{dropdown:p(()=>[E(a(ee),null,{default:p(()=>[(_(),$(O,null,q(u,b=>E(a(H),{class:N([\"sort-item\",{on:b.label==t.filter}]),command:b.label},{default:p(()=>[Xe,o(\"span\",null,w(b.name),1)]),_:2},1032,[\"class\",\"command\"])),64))]),_:1})]),default:p(()=>[o(\"button\",null,[E(i)])]),_:1})]),o(\"div\",Ye,[o(\"button\",{onClick:l[0]||(l[0]=b=>x())},[t.model?(_(),k(h,{key:0})):(_(),k(A,{key:1}))])])])}}});const tt=V(et,[[\"__scopeId\",\"data-v-cc8dcce8\"]]),nt=n=>(L(\"data-v-ac171980\"),n=n(),U(),n),ot={class:\"page-tool-container\"},at=nt(()=>o(\"div\",{class:\"auto\"},null,-1)),st=S({__name:\"index\",setup(n){const e=W(),t=z(),s=C(()=>t.query.path||\"\"),F=C(()=>{const u=e.config;return[{name:\"\\u67E5\\u770B\",children:[{name:\"\\u5217\\u8868\",active:u.model,f:e.setConfigModel},{name:\"\\u7565\\u7F29\\u56FE\",active:!u.model,f:e.setConfigModel}]},{name:\"\\u6392\\u5E8F\\u65B9\\u5F0F\",children:[{name:\"\\u540D\\u79F0\",active:u.order==\"filename\",f:()=>{e.setConfigOrder(\"filename\"),e.reload()}},{name:\"\\u65F6\\u95F4\",active:u.order==\"date\",f:()=>{e.setConfigOrder(\"date\"),e.reload()}},{name:\"\\u5927\\u5C0F\",active:u.order==\"size\",f:()=>{e.setConfigOrder(\"size\"),e.reload()}},{name:\"\\u7C7B\\u578B\",active:u.order==\"filetype\",f:()=>{e.setConfigOrder(\"filetype\"),e.reload()}},{name:\"\\u9012\\u589E\",active:u.orderBy==\"asc\",f:()=>{e.setConfigOrderBy(\"asc\"),e.reload()}},{name:\"\\u9012\\u51CF\",active:u.orderBy==\"desc\",f:()=>{e.setConfigOrderBy(\"desc\"),e.reload()}}]},{name:\"\\u6587\\u4EF6\\u8FC7\\u6EE4\",children:[{name:\"\\u5168\\u90E8\",active:u.filter==\"default\",f:()=>{e.setConfigFilter(\"default\"),e.reload()}},{name:\"\\u56FE\\u7247\",active:u.filter==\"image\",f:()=>{e.setConfigFilter(\"image\"),e.reload()}},{name:\"\\u538B\\u7F29\\u6587\\u4EF6\",active:u.filter==\"archive\",f:()=>{e.setConfigFilter(\"archive\"),e.reload()}},{name:\"\\u89C6\\u9891\",active:u.filter==\"video\",f:()=>{e.setConfigFilter(\"video\"),e.reload()}},{name:\"\\u97F3\\u4E50\",active:u.filter==\"music\",f:()=>{e.setConfigFilter(\"music\"),e.reload()}},{name:\"\\u6587\\u6863\",active:u.filter==\"doc\",f:()=>{e.setConfigFilter(\"doc\"),e.reload()}},{name:\"\\u5176\\u5B83\",active:u.filter==\"other\",f:()=>{e.setConfigFilter(\"other\"),e.reload()}}]},{name:\"\\u5237\\u65B0\",f:()=>{e.reload()}},{name:\"\\u91CD\\u65B0\\u52A0\\u8F7D\",f:()=>{location.reload()}}]});return(u,g)=>(_(),k(be,{id:\"page\"},{default:p(()=>[E(ce,{class:\"page-container\",list:a(F)},{default:p(()=>[E(Ge),o(\"div\",ot,[E(je),at,E(tt)]),E(a(ue),{class:\"page-body-container\"},{default:p(()=>[(_(),k(ze,{key:`${a(s)}`}))]),_:1})]),_:1},8,[\"list\"])]),_:1}))}});const dt=V(st,[[\"__scopeId\",\"data-v-ac171980\"]]);export{dt as default};\n"
  },
  {
    "path": "luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.d52f0fe8.js",
    "content": "var u=(c,d,n)=>new Promise((p,r)=>{var s=a=>{try{i(n.next(a))}catch(e){r(e)}},m=a=>{try{i(n.throw(a))}catch(e){r(e)}},i=a=>a.done?p(a.value):Promise.resolve(a.value).then(s,m);i((n=n.apply(c,d)).next())});import{e as S,r as x,aA as D,az as g,t as B,x as y,A as l,a2 as w,q as _,y as o,P as F,bH as I,F as f,O as C,I as b,v as V,a3 as k,bI as q,aM as A,B as N,a9 as P,a4 as T,C as L,a5 as M,a6 as O,aB as h,a7 as z}from\"./index.js\";import{u as G}from\"./chunk.6424c2fc.js\";const v=c=>(M(\"data-v-61900a83\"),c=c(),O(),c),H=[\"onSubmit\"],U={class:\"form-item\"},W=v(()=>o(\"div\",{class:\"form-item_label form-required\"},\" \\u6570\\u636E\\u76EE\\u5F55 \",-1)),$={class:\"form-item_content\"},j=v(()=>o(\"option\",{value:\"\",selected:\"\"},\"\\u9009\\u62E9\\u6570\\u636E\\u76EE\\u5F55\",-1)),J=[\"value\"],K={class:\"form-btns\"},Q=v(()=>o(\"div\",{class:\"auto\"},null,-1)),R=S({__name:\"index\",setup(c){return u(this,null,function*(){let d,n;const p=G(),r=x(!1),s=D({dataPath:\"\"}),m=()=>u(this,null,function*(){try{const a=yield P.LocalDevice.Data.GET();if(a.data){const{success:e,result:t}=a.data;t!=null&&t.dataPath&&(s.dataPath=t.dataPath)}}catch(a){}});[d,n]=g(()=>m()),yield d,n();const i=()=>u(this,null,function*(){if(!(s.dataPath==\"\"||s.dataPath==null)){r.value=!0;try{const a={dataPath:s.dataPath},e=yield P.LocalDevice.Data.POST(a);if(e.data){const{success:t,error:E}=e.data;E&&h.Warning(E),t===0&&h.Success(\"\\u4FDD\\u5B58\\u6210\\u529F\")}}catch(a){h.Error(`${a}`)}finally{r.value=!1}}});return(a,e)=>(_(),B(l(w),{id:\"page\"},{default:y(()=>[o(\"form\",{onSubmit:N(i,[\"prevent\"])},[o(\"div\",U,[W,o(\"div\",$,[F(o(\"select\",{placeholder:\"\\u9009\\u62E9\\u6570\\u636E\\u76EE\\u5F55\",\"onUpdate:modelValue\":e[0]||(e[0]=t=>s.dataPath=t),required:\"\"},[j,(_(!0),f(b,null,C(l(p).menus,t=>(_(),f(b,null,[t.name!=\"root\"?(_(),f(\"option\",{key:0,value:\"/local/\"+t.name},T(t.name),9,J)):L(\"\",!0)],64))),256))],512),[[I,s.dataPath,void 0,{trim:!0}]])])]),o(\"div\",K,[Q,V(l(A),{type:\"primary\",\"native-type\":\"submit\",icon:l(q),loading:r.value,disabled:r.value},{default:y(()=>[k(\" \\u4FDD\\u5B58 \")]),_:1},8,[\"icon\",\"loading\",\"disabled\"])])],40,H)]),_:1}))})}});const aa=z(R,[[\"__scopeId\",\"data-v-61900a83\"]]);export{aa as default};\n"
  },
  {
    "path": "luci-app-linkease/htdocs/luci-static/linkeasefile/chunk.dc0a1b58.js",
    "content": "var ql=Object.defineProperty,Xl=Object.defineProperties;var Ql=Object.getOwnPropertyDescriptors;var Ft=Object.getOwnPropertySymbols;var Zl=Object.prototype.hasOwnProperty,Jl=Object.prototype.propertyIsEnumerable;var Nt=(e,t,l)=>t in e?ql(e,t,{enumerable:!0,configurable:!0,writable:!0,value:l}):e[t]=l,ae=(e,t)=>{for(var l in t||(t={}))Zl.call(t,l)&&Nt(e,l,t[l]);if(Ft)for(var l of Ft(t))Jl.call(t,l)&&Nt(e,l,t[l]);return e},Re=(e,t)=>Xl(e,Ql(t));var xe=(e,t,l)=>new Promise((n,s)=>{var i=o=>{try{r(l.next(o))}catch(a){s(a)}},c=o=>{try{r(l.throw(o))}catch(a){s(a)}},r=o=>o.done?n(o.value):Promise.resolve(o.value).then(i,c);r((l=l.apply(e,t)).next())});import{a as Te,bf as en,a$ as Xt,aj as tn,aD as me,n as $,am as Qt,ae as lt,ag as rt,c as it,af as At,bj as Ht,r as x,ak as Je,bv as ln,bw as nn,w as ce,ap as Zt,as as le,o as Ae,e as pe,b1 as Jt,h as ie,q as z,t as Se,x as q,y as _,P as ke,ax as et,A as C,F as j,aW as Ke,z as P,S as Me,I as Oe,a3 as Be,a4 as oe,C as we,L as el,_ as je,R as Le,aC as tl,aE as ll,Y as nl,aF as yt,bu as _e,au as on,j as sn,bx as $t,a2 as Ct,E as wt,aN as an,by as rn,u as ol,a1 as he,bz as sl,v as X,O as Wt,a_ as al,p as nt,b7 as un,bA as St,bB as rl,bC as Ye,bD as ut,ay as T,bE as Mt,bF as Ie,V as Tt,b6 as Ot,Q as Bt,bG as cn,H as il,ar as dn,bd as fn,aG as hn,Z as vn,az as pn,a9 as Pt,aB as mn,aa as zt,a7 as ul,a0 as gn,$ as bn}from\"./index.js\";import{y as yn,b as Cn,E as wn}from\"./chunk.a6a47e72.js\";import{d as tt}from\"./chunk.22632dc4.js\";const Ee=new Map;let Dt;Te&&(document.addEventListener(\"mousedown\",e=>Dt=e),document.addEventListener(\"mouseup\",e=>{for(const t of Ee.values())for(const{documentHandler:l}of t)l(e,Dt)}));function It(e,t){let l=[];return Array.isArray(t.arg)?l=t.arg:en(t.arg)&&l.push(t.arg),function(n,s){const i=t.instance.popperRef,c=n.target,r=s==null?void 0:s.target,o=!t||!t.instance,a=!c||!r,u=e.contains(c)||e.contains(r),h=e===c,d=l.length&&l.some(f=>f==null?void 0:f.contains(c))||l.length&&l.includes(r),p=i&&(i.contains(c)||i.contains(r));o||a||u||h||d||p||t.value(n,s)}}const Sn={beforeMount(e,t){Ee.has(e)||Ee.set(e,[]),Ee.get(e).push({documentHandler:It(e,t),bindingFn:t.value})},updated(e,t){Ee.has(e)||Ee.set(e,[]);const l=Ee.get(e),n=l.findIndex(i=>i.bindingFn===t.oldValue),s={documentHandler:It(e,t),bindingFn:t.value};n>=0?l.splice(n,1,s):l.push(s)},unmounted(e){Ee.delete(e)}};var Vt=!1,Fe,ct,dt,Ue,qe,cl,Xe,ft,ht,vt,dl,pt,mt,fl,hl;function re(){if(!Vt){Vt=!0;var e=navigator.userAgent,t=/(?:MSIE.(\\d+\\.\\d+))|(?:(?:Firefox|GranParadiso|Iceweasel).(\\d+\\.\\d+))|(?:Opera(?:.+Version.|.)(\\d+\\.\\d+))|(?:AppleWebKit.(\\d+(?:\\.\\d+)?))|(?:Trident\\/\\d+\\.\\d+.*rv:(\\d+\\.\\d+))/.exec(e),l=/(Mac OS X)|(Windows)|(Linux)/.exec(e);if(pt=/\\b(iPhone|iP[ao]d)/.exec(e),mt=/\\b(iP[ao]d)/.exec(e),vt=/Android/i.exec(e),fl=/FBAN\\/\\w+;/i.exec(e),hl=/Mobile/i.exec(e),dl=!!/Win64/.exec(e),t){Fe=t[1]?parseFloat(t[1]):t[5]?parseFloat(t[5]):NaN,Fe&&document&&document.documentMode&&(Fe=document.documentMode);var n=/(?:Trident\\/(\\d+.\\d+))/.exec(e);cl=n?parseFloat(n[1])+4:Fe,ct=t[2]?parseFloat(t[2]):NaN,dt=t[3]?parseFloat(t[3]):NaN,Ue=t[4]?parseFloat(t[4]):NaN,Ue?(t=/(?:Chrome\\/(\\d+\\.\\d+))/.exec(e),qe=t&&t[1]?parseFloat(t[1]):NaN):qe=NaN}else Fe=ct=dt=qe=Ue=NaN;if(l){if(l[1]){var s=/(?:Mac OS X (\\d+(?:[._]\\d+)?))/.exec(e);Xe=s?parseFloat(s[1].replace(\"_\",\".\")):!0}else Xe=!1;ft=!!l[2],ht=!!l[3]}else Xe=ft=ht=!1}}var gt={ie:function(){return re()||Fe},ieCompatibilityMode:function(){return re()||cl>Fe},ie64:function(){return gt.ie()&&dl},firefox:function(){return re()||ct},opera:function(){return re()||dt},webkit:function(){return re()||Ue},safari:function(){return gt.webkit()},chrome:function(){return re()||qe},windows:function(){return re()||ft},osx:function(){return re()||Xe},linux:function(){return re()||ht},iphone:function(){return re()||pt},mobile:function(){return re()||pt||mt||vt||hl},nativeApp:function(){return re()||fl},android:function(){return re()||vt},ipad:function(){return re()||mt}},xn=gt,Ge=!!(typeof window<\"u\"&&window.document&&window.document.createElement),En={canUseDOM:Ge,canUseWorkers:typeof Worker<\"u\",canUseEventListeners:Ge&&!!(window.addEventListener||window.attachEvent),canUseViewport:Ge&&!!window.screen,isInWorker:!Ge},vl=En,pl;vl.canUseDOM&&(pl=document.implementation&&document.implementation.hasFeature&&document.implementation.hasFeature(\"\",\"\")!==!0);function kn(e,t){if(!vl.canUseDOM||t&&!(\"addEventListener\"in document))return!1;var l=\"on\"+e,n=l in document;if(!n){var s=document.createElement(\"div\");s.setAttribute(l,\"return;\"),n=typeof s[l]==\"function\"}return!n&&pl&&e===\"wheel\"&&(n=document.implementation.hasFeature(\"Events.wheel\",\"3.0\")),n}var Rn=kn,Kt=10,_t=40,jt=800;function ml(e){var t=0,l=0,n=0,s=0;return\"detail\"in e&&(l=e.detail),\"wheelDelta\"in e&&(l=-e.wheelDelta/120),\"wheelDeltaY\"in e&&(l=-e.wheelDeltaY/120),\"wheelDeltaX\"in e&&(t=-e.wheelDeltaX/120),\"axis\"in e&&e.axis===e.HORIZONTAL_AXIS&&(t=l,l=0),n=t*Kt,s=l*Kt,\"deltaY\"in e&&(s=e.deltaY),\"deltaX\"in e&&(n=e.deltaX),(n||s)&&e.deltaMode&&(e.deltaMode==1?(n*=_t,s*=_t):(n*=jt,s*=jt)),n&&!t&&(t=n<1?-1:1),s&&!l&&(l=s<1?-1:1),{spinX:t,spinY:l,pixelX:n,pixelY:s}}ml.getEventType=function(){return xn.firefox()?\"DOMMouseScroll\":Rn(\"wheel\")?\"wheel\":\"mousewheel\"};var Ln=ml;/**\n* Checks if an event is supported in the current execution environment.\n*\n* NOTE: This will not work correctly for non-generic events such as `change`,\n* `reset`, `load`, `error`, and `select`.\n*\n* Borrows from Modernizr.\n*\n* @param {string} eventNameSuffix Event name, e.g. \"click\".\n* @param {?boolean} capture Check if the capture phase is supported.\n* @return {boolean} True if the event is supported.\n* @internal\n* @license Modernizr 3.0.0pre (Custom Build) | MIT\n*/const Fn=function(e,t){if(e&&e.addEventListener){const l=function(n){const s=Ln(n);t&&Reflect.apply(t,this,[n,s])};e.addEventListener(\"wheel\",l,{passive:!0})}},Nn={beforeMount(e,t){Fn(e,t.value)}},An={modelValue:{type:Array,default:()=>[]},disabled:Boolean,min:{type:Number,default:void 0},max:{type:Number,default:void 0},size:Xt,id:{type:String,default:void 0},label:{type:String,default:void 0},fill:{type:String,default:void 0},textColor:{type:String,default:void 0},tag:{type:String,default:\"div\"},validateEvent:{type:Boolean,default:!0}},gl={modelValue:{type:[Number,String,Boolean],default:()=>{}},label:{type:[String,Boolean,Number,Object]},indeterminate:Boolean,disabled:Boolean,checked:Boolean,name:{type:String,default:void 0},trueLabel:{type:[String,Number],default:void 0},falseLabel:{type:[String,Number],default:void 0},id:{type:String,default:void 0},controls:{type:String,default:void 0},border:Boolean,size:Xt,tabindex:[String,Number],validateEvent:{type:Boolean,default:!0}},De=()=>{const{form:e,formItem:t}=tn(),l=me(\"CheckboxGroup\",{}),n=$(()=>l&&(l==null?void 0:l.name)===\"ElCheckboxGroup\"),s=$(()=>t==null?void 0:t.size);return{isGroup:n,checkboxGroup:l,elForm:e,elFormItemSize:s,elFormItem:t}},Hn=(e,{elFormItem:t})=>{const{inputId:l,isLabeledByFormItem:n}=Qt(e,{formItemContext:t});return{isLabeledByFormItem:n,groupId:l}},$n=e=>{const t=x(!1),{emit:l}=le(),{isGroup:n,checkboxGroup:s,elFormItem:i}=De(),c=x(!1);return{model:$({get(){var o,a;return n.value?(o=s.modelValue)==null?void 0:o.value:(a=e.modelValue)!=null?a:t.value},set(o){var a;n.value&&Array.isArray(o)?(c.value=s.max!==void 0&&o.length>s.max.value,c.value===!1&&((a=s==null?void 0:s.changeEvent)==null||a.call(s,o))):(l(lt,o),t.value=o)}}),isGroup:n,isLimitExceeded:c,elFormItem:i}},Wn=(e,t,{model:l})=>{const{isGroup:n,checkboxGroup:s}=De(),i=x(!1),c=Je(s==null?void 0:s.checkboxGroupSize,{prop:!0}),r=$(()=>{const u=l.value;return ln(u)===\"[object Boolean]\"?u:Array.isArray(u)?u.map(nn).includes(e.label):u!=null?u===e.trueLabel:!!u}),o=Je($(()=>{var u;return n.value?(u=s==null?void 0:s.checkboxGroupSize)==null?void 0:u.value:void 0})),a=$(()=>!!(t.default||e.label));return{isChecked:r,focus:i,size:c,checkboxSize:o,hasOwnLabel:a}},Mn=(e,{model:t,isChecked:l})=>{const{elForm:n,isGroup:s,checkboxGroup:i}=De(),c=$(()=>{var o,a;const u=(o=i.max)==null?void 0:o.value,h=(a=i.min)==null?void 0:a.value;return!!(u||h)&&t.value.length>=u&&!l.value||t.value.length<=h&&l.value});return{isDisabled:$(()=>{var o,a;const u=e.disabled||(n==null?void 0:n.disabled);return(a=s.value?((o=i.disabled)==null?void 0:o.value)||u||c.value:u)!=null?a:!1}),isLimitDisabled:c}},Tn=(e,{model:t})=>{function l(){Array.isArray(t.value)&&!t.value.includes(e.label)?t.value.push(e.label):t.value=e.trueLabel||!0}e.checked&&l()},On=(e,{model:t,isLimitExceeded:l,hasOwnLabel:n,isDisabled:s,isLabeledByFormItem:i})=>{const{elFormItem:c,checkboxGroup:r}=De(),{emit:o}=le();function a(f){var g,b;return f===e.trueLabel||f===!0?(g=e.trueLabel)!=null?g:!0:(b=e.falseLabel)!=null?b:!1}function u(f,g){o(\"change\",a(f),g)}function h(f){if(l.value)return;const g=f.target;o(\"change\",a(g.checked),f)}function d(f){return xe(this,null,function*(){l.value||!n.value&&!s.value&&i.value&&(t.value=a([!1,e.falseLabel].includes(t.value)),yield Ae(),u(t.value,f))})}const p=$(()=>{var f;return((f=r.validateEvent)==null?void 0:f.value)||e.validateEvent});return ce(()=>e.modelValue,()=>{p.value&&(c==null||c.validate(\"change\").catch(f=>Zt()))}),{handleChange:h,onClickRoot:d}},bl={[lt]:e=>rt(e)||it(e)||At(e),change:e=>rt(e)||it(e)||At(e)},Bn={[lt]:e=>Ht(e),change:e=>Ht(e)},yl=(e,t)=>{const{model:l,isGroup:n,isLimitExceeded:s,elFormItem:i}=$n(e),{focus:c,size:r,isChecked:o,checkboxSize:a,hasOwnLabel:u}=Wn(e,t,{model:l}),{isDisabled:h}=Mn(e,{model:l,isChecked:o}),{inputId:d,isLabeledByFormItem:p}=Qt(e,{formItemContext:i,disableIdGeneration:u,disableIdManagement:n}),{handleChange:f,onClickRoot:g}=On(e,{model:l,isLimitExceeded:s,hasOwnLabel:u,isDisabled:h,isLabeledByFormItem:p});return Tn(e,{model:l}),{elFormItem:i,inputId:d,isLabeledByFormItem:p,isChecked:o,isDisabled:h,isGroup:n,checkboxSize:a,hasOwnLabel:u,model:l,handleChange:f,onClickRoot:g,focus:c,size:r}},Pn=[\"tabindex\",\"role\",\"aria-checked\"],zn=[\"id\",\"aria-hidden\",\"name\",\"tabindex\",\"disabled\",\"true-value\",\"false-value\"],Dn=[\"id\",\"aria-hidden\",\"disabled\",\"value\",\"name\",\"tabindex\"],In={name:\"ElCheckbox\"},Vn=pe(Re(ae({},In),{props:gl,emits:bl,setup(e){const t=e,l=Jt(),{inputId:n,isLabeledByFormItem:s,isChecked:i,isDisabled:c,checkboxSize:r,hasOwnLabel:o,model:a,handleChange:u,onClickRoot:h,focus:d}=yl(t,l),p=ie(\"checkbox\");return(f,g)=>(z(),Se(el(!C(o)&&C(s)?\"span\":\"label\"),{class:P([C(p).b(),C(p).m(C(r)),C(p).is(\"disabled\",C(c)),C(p).is(\"bordered\",f.border),C(p).is(\"checked\",C(i))]),\"aria-controls\":f.indeterminate?f.controls:null,onClick:C(h)},{default:q(()=>[_(\"span\",{class:P([C(p).e(\"input\"),C(p).is(\"disabled\",C(c)),C(p).is(\"checked\",C(i)),C(p).is(\"indeterminate\",f.indeterminate),C(p).is(\"focus\",C(d))]),tabindex:f.indeterminate?0:void 0,role:f.indeterminate?\"checkbox\":void 0,\"aria-checked\":f.indeterminate?\"mixed\":void 0},[f.trueLabel||f.falseLabel?ke((z(),j(\"input\",{key:0,id:C(n),\"onUpdate:modelValue\":g[0]||(g[0]=b=>Ke(a)?a.value=b:null),class:P(C(p).e(\"original\")),type:\"checkbox\",\"aria-hidden\":f.indeterminate?\"true\":\"false\",name:f.name,tabindex:f.tabindex,disabled:C(c),\"true-value\":f.trueLabel,\"false-value\":f.falseLabel,onChange:g[1]||(g[1]=(...b)=>C(u)&&C(u)(...b)),onFocus:g[2]||(g[2]=b=>d.value=!0),onBlur:g[3]||(g[3]=b=>d.value=!1)},null,42,zn)),[[et,C(a)]]):ke((z(),j(\"input\",{key:1,id:C(n),\"onUpdate:modelValue\":g[4]||(g[4]=b=>Ke(a)?a.value=b:null),class:P(C(p).e(\"original\")),type:\"checkbox\",\"aria-hidden\":f.indeterminate?\"true\":\"false\",disabled:C(c),value:f.label,name:f.name,tabindex:f.tabindex,onChange:g[5]||(g[5]=(...b)=>C(u)&&C(u)(...b)),onFocus:g[6]||(g[6]=b=>d.value=!0),onBlur:g[7]||(g[7]=b=>d.value=!1)},null,42,Dn)),[[et,C(a)]]),_(\"span\",{class:P(C(p).e(\"inner\"))},null,2)],10,Pn),C(o)?(z(),j(\"span\",{key:0,class:P(C(p).e(\"label\"))},[Me(f.$slots,\"default\"),f.$slots.default?we(\"v-if\",!0):(z(),j(Oe,{key:0},[Be(oe(f.label),1)],64))],2)):we(\"v-if\",!0)]),_:3},8,[\"class\",\"aria-controls\",\"onClick\"]))}}));var Kn=je(Vn,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/checkbox/src/checkbox.vue\"]]);const _n=[\"name\",\"tabindex\",\"disabled\",\"true-value\",\"false-value\"],jn=[\"name\",\"tabindex\",\"disabled\",\"value\"],Gn={name:\"ElCheckboxButton\"},Yn=pe(Re(ae({},Gn),{props:gl,emits:bl,setup(e){const t=e,l=Jt(),{focus:n,isChecked:s,isDisabled:i,size:c,model:r,handleChange:o}=yl(t,l),{checkboxGroup:a}=De(),u=ie(\"checkbox\"),h=$(()=>{var d,p,f,g;const b=(p=(d=a==null?void 0:a.fill)==null?void 0:d.value)!=null?p:\"\";return{backgroundColor:b,borderColor:b,color:(g=(f=a==null?void 0:a.textColor)==null?void 0:f.value)!=null?g:\"\",boxShadow:b?`-1px 0 0 0 ${b}`:void 0}});return(d,p)=>(z(),j(\"label\",{class:P([C(u).b(\"button\"),C(u).bm(\"button\",C(c)),C(u).is(\"disabled\",C(i)),C(u).is(\"checked\",C(s)),C(u).is(\"focus\",C(n))])},[d.trueLabel||d.falseLabel?ke((z(),j(\"input\",{key:0,\"onUpdate:modelValue\":p[0]||(p[0]=f=>Ke(r)?r.value=f:null),class:P(C(u).be(\"button\",\"original\")),type:\"checkbox\",name:d.name,tabindex:d.tabindex,disabled:C(i),\"true-value\":d.trueLabel,\"false-value\":d.falseLabel,onChange:p[1]||(p[1]=(...f)=>C(o)&&C(o)(...f)),onFocus:p[2]||(p[2]=f=>n.value=!0),onBlur:p[3]||(p[3]=f=>n.value=!1)},null,42,_n)),[[et,C(r)]]):ke((z(),j(\"input\",{key:1,\"onUpdate:modelValue\":p[4]||(p[4]=f=>Ke(r)?r.value=f:null),class:P(C(u).be(\"button\",\"original\")),type:\"checkbox\",name:d.name,tabindex:d.tabindex,disabled:C(i),value:d.label,onChange:p[5]||(p[5]=(...f)=>C(o)&&C(o)(...f)),onFocus:p[6]||(p[6]=f=>n.value=!0),onBlur:p[7]||(p[7]=f=>n.value=!1)},null,42,jn)),[[et,C(r)]]),d.$slots.default||d.label?(z(),j(\"span\",{key:2,class:P(C(u).be(\"button\",\"inner\")),style:Le(C(s)?C(h):void 0)},[Me(d.$slots,\"default\",{},()=>[Be(oe(d.label),1)])],6)):we(\"v-if\",!0)],2))}}));var Cl=je(Yn,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/checkbox/src/checkbox-button.vue\"]]);const Un={name:\"ElCheckboxGroup\"},qn=pe(Re(ae({},Un),{props:An,emits:Bn,setup(e,{emit:t}){const l=e,{elFormItem:n}=De(),{groupId:s,isLabeledByFormItem:i}=Hn(l,{elFormItem:n}),c=Je(),r=ie(\"checkbox\"),o=u=>{t(lt,u),Ae(()=>{t(\"change\",u)})},a=$({get(){return l.modelValue},set(u){o(u)}});return tl(\"CheckboxGroup\",Re(ae({name:\"ElCheckboxGroup\"},ll(l)),{modelValue:a,checkboxGroupSize:c,changeEvent:o})),ce(()=>l.modelValue,()=>{l.validateEvent&&(n==null||n.validate(\"change\").catch(u=>Zt()))}),(u,h)=>{var d;return z(),Se(el(u.tag),{id:C(s),class:P(C(r).b(\"group\")),role:\"group\",\"aria-label\":C(i)?void 0:u.label||\"checkbox-group\",\"aria-labelledby\":C(i)?(d=C(n))==null?void 0:d.labelId:void 0},{default:q(()=>[Me(u.$slots,\"default\")]),_:3},8,[\"id\",\"class\",\"aria-label\",\"aria-labelledby\"])}}}));var wl=je(qn,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/checkbox/src/checkbox-group.vue\"]]);const Pe=nl(Kn,{CheckboxButton:Cl,CheckboxGroup:wl});yt(Cl);yt(wl);/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */var Xn=/[\"'&<>]/,Qn=Zn;function Zn(e){var t=\"\"+e,l=Xn.exec(t);if(!l)return t;var n,s=\"\",i=0,c=0;for(i=l.index;i<t.length;i++){switch(t.charCodeAt(i)){case 34:n=\"&quot;\";break;case 38:n=\"&amp;\";break;case 39:n=\"&#39;\";break;case 60:n=\"&lt;\";break;case 62:n=\"&gt;\";break;default:continue}c!==i&&(s+=t.substring(c,i)),c=i+1,s+=n}return c!==i?s+t.substring(c,i):s}const at=function(e){var t;return(t=e.target)==null?void 0:t.closest(\"td\")},Gt=function(e){return e!==null&&typeof e==\"object\"},Jn=function(e,t,l,n,s){if(!t&&!n&&(!s||Array.isArray(s)&&!s.length))return e;typeof l==\"string\"?l=l===\"descending\"?-1:1:l=l&&l<0?-1:1;const i=n?null:function(r,o){return s?(Array.isArray(s)||(s=[s]),s.map(a=>typeof a==\"string\"?$t(r,a):a(r,o,e))):(t!==\"$key\"&&Gt(r)&&\"$value\"in r&&(r=r.$value),[Gt(r)?$t(r,t):r])},c=function(r,o){if(n)return n(r.value,o.value);for(let a=0,u=r.key.length;a<u;a++){if(r.key[a]<o.key[a])return-1;if(r.key[a]>o.key[a])return 1}return 0};return e.map((r,o)=>({value:r,index:o,key:i?i(r,o):null})).sort((r,o)=>{let a=c(r,o);return a||(a=r.index-o.index),a*+l}).map(r=>r.value)},Sl=function(e,t){let l=null;return e.columns.forEach(n=>{n.id===t&&(l=n)}),l},eo=function(e,t){let l=null;for(let n=0;n<e.columns.length;n++){const s=e.columns[n];if(s.columnKey===t){l=s;break}}return l||on(\"ElTable\",`No column matching with column-key: ${t}`),l},Yt=function(e,t,l){const n=(t.className||\"\").match(new RegExp(`${l}-table_[^\\\\s]+`,\"gm\"));return n?Sl(e,n[0]):null},Z=(e,t)=>{if(!e)throw new Error(\"Row is required when get row identity\");if(typeof t==\"string\"){if(!t.includes(\".\"))return`${e[t]}`;const l=t.split(\".\");let n=e;for(const s of l)n=n[s];return`${n}`}else if(typeof t==\"function\")return t.call(null,e)},Ne=function(e,t){const l={};return(e||[]).forEach((n,s)=>{l[Z(n,t)]={row:n,index:s}}),l};function to(e,t){const l={};let n;for(n in e)l[n]=e[n];for(n in t)if(_e(t,n)){const s=t[n];typeof s!=\"undefined\"&&(l[n]=s)}return l}function xt(e){return e===\"\"||e!==void 0&&(e=Number.parseInt(e,10),Number.isNaN(e)&&(e=\"\")),e}function xl(e){return e===\"\"||e!==void 0&&(e=xt(e),Number.isNaN(e)&&(e=80)),e}function lo(e){return typeof e==\"number\"?e:typeof e==\"string\"?/^\\d+(?:px)?$/.test(e)?Number.parseInt(e,10):e:null}function no(...e){return e.length===0?t=>t:e.length===1?e[0]:e.reduce((t,l)=>(...n)=>t(l(...n)))}function Qe(e,t,l){let n=!1;const s=e.indexOf(t),i=s!==-1,c=()=>{e.push(t),n=!0},r=()=>{e.splice(s,1),n=!0};return typeof l==\"boolean\"?l&&!i?c():!l&&i&&r():i?r():c(),n}function oo(e,t,l=\"children\",n=\"hasChildren\"){const s=c=>!(Array.isArray(c)&&c.length);function i(c,r,o){t(c,r,o),r.forEach(a=>{if(a[n]){t(a,null,o+1);return}const u=a[l];s(u)||i(a,u,o+1)})}e.forEach(c=>{if(c[n]){t(c,null,0);return}const r=c[l];s(r)||i(c,r,0)})}let Ce;function so(e,t,l,n,s){const{nextZIndex:i}=sn(),c=e==null?void 0:e.dataset.prefix,r=e==null?void 0:e.querySelector(`.${c}-scrollbar__wrap`);function o(){const f=s===\"light\",g=document.createElement(\"div\");return g.className=`${c}-popper ${f?\"is-light\":\"is-dark\"}`,l=Qn(l),g.innerHTML=l,g.style.zIndex=String(i()),e==null||e.appendChild(g),g}function a(){const f=document.createElement(\"div\");return f.className=`${c}-popper__arrow`,f}function u(){h&&h.update()}Ce==null||Ce(),Ce=()=>{try{h&&h.destroy(),d&&(e==null||e.removeChild(d)),t.removeEventListener(\"mouseenter\",u),t.removeEventListener(\"mouseleave\",Ce),r==null||r.removeEventListener(\"scroll\",Ce),Ce=void 0}catch(f){}};let h=null;const d=o(),p=a();return d.appendChild(p),h=yn(t,d,ae({strategy:\"absolute\",modifiers:[{name:\"offset\",options:{offset:[0,8]}},{name:\"arrow\",options:{element:p,padding:10}}]},n)),t.addEventListener(\"mouseenter\",u),t.addEventListener(\"mouseleave\",Ce),r==null||r.addEventListener(\"scroll\",Ce),h}const El=(e,t,l,n)=>{let s=0,i=e;if(n){if(n[e].colSpan>1)return{};for(let o=0;o<e;o++)s+=n[o].colSpan;i=s+n[e].colSpan-1}else s=e;let c;const r=l.states.columns;switch(t){case\"left\":i<l.states.fixedLeafColumnsLength.value&&(c=\"left\");break;case\"right\":s>=r.value.length-l.states.rightFixedLeafColumnsLength.value&&(c=\"right\");break;default:i<l.states.fixedLeafColumnsLength.value?c=\"left\":s>=r.value.length-l.states.rightFixedLeafColumnsLength.value&&(c=\"right\")}return c?{direction:c,start:s,after:i}:{}},Et=(e,t,l,n,s)=>{const i=[],{direction:c,start:r}=El(t,l,n,s);if(c){const o=c===\"left\";i.push(`${e}-fixed-column--${c}`),o&&r===n.states.fixedLeafColumnsLength.value-1?i.push(\"is-last-column\"):!o&&r===n.states.columns.value.length-n.states.rightFixedLeafColumnsLength.value&&i.push(\"is-first-column\")}return i};function Ut(e,t){return e+(t.realWidth===null||Number.isNaN(t.realWidth)?Number(t.width):t.realWidth)}const kt=(e,t,l,n)=>{const{direction:s,start:i=0}=El(e,t,l,n);if(!s)return;const c={},r=s===\"left\",o=l.states.columns.value;return r?c.left=o.slice(0,e).reduce(Ut,0):c.right=o.slice(i+1).reverse().reduce(Ut,0),c},ze=(e,t)=>{!e||Number.isNaN(e[t])||(e[t]=`${e[t]}px`)};function ao(e){const t=le(),l=x(!1),n=x([]);return{updateExpandRows:()=>{const o=e.data.value||[],a=e.rowKey.value;if(l.value)n.value=o.slice();else if(a){const u=Ne(n.value,a);n.value=o.reduce((h,d)=>{const p=Z(d,a);return u[p]&&h.push(d),h},[])}else n.value=[]},toggleRowExpansion:(o,a)=>{Qe(n.value,o,a)&&t.emit(\"expand-change\",o,n.value.slice())},setExpandRowKeys:o=>{t.store.assertRowKey();const a=e.data.value||[],u=e.rowKey.value,h=Ne(a,u);n.value=o.reduce((d,p)=>{const f=h[p];return f&&d.push(f.row),d},[])},isRowExpanded:o=>{const a=e.rowKey.value;return a?!!Ne(n.value,a)[Z(o,a)]:n.value.includes(o)},states:{expandRows:n,defaultExpandAll:l}}}function ro(e){const t=le(),l=x(null),n=x(null),s=a=>{t.store.assertRowKey(),l.value=a,c(a)},i=()=>{l.value=null},c=a=>{const{data:u,rowKey:h}=e;let d=null;h.value&&(d=(C(u)||[]).find(p=>Z(p,h.value)===a)),n.value=d,t.emit(\"current-change\",n.value,null)};return{setCurrentRowKey:s,restoreCurrentRowKey:i,setCurrentRowByKey:c,updateCurrentRow:a=>{const u=n.value;if(a&&a!==u){n.value=a,t.emit(\"current-change\",n.value,u);return}!a&&u&&(n.value=null,t.emit(\"current-change\",null,u))},updateCurrentRowData:()=>{const a=e.rowKey.value,u=e.data.value||[],h=n.value;if(!u.includes(h)&&h){if(a){const d=Z(h,a);c(d)}else n.value=null;n.value===null&&t.emit(\"current-change\",null,h)}else l.value&&(c(l.value),i())},states:{_currentRowKey:l,currentRow:n}}}function io(e){const t=x([]),l=x({}),n=x(16),s=x(!1),i=x({}),c=x(\"hasChildren\"),r=x(\"children\"),o=le(),a=$(()=>{if(!e.rowKey.value)return{};const E=e.data.value||[];return h(E)}),u=$(()=>{const E=e.rowKey.value,y=Object.keys(i.value),v={};return y.length&&y.forEach(m=>{if(i.value[m].length){const S={children:[]};i.value[m].forEach(L=>{const k=Z(L,E);S.children.push(k),L[c.value]&&!v[k]&&(v[k]={children:[]})}),v[m]=S}}),v}),h=E=>{const y=e.rowKey.value,v={};return oo(E,(m,S,L)=>{const k=Z(m,y);Array.isArray(S)?v[k]={children:S.map(N=>Z(N,y)),level:L}:s.value&&(v[k]={children:[],lazy:!0,level:L})},r.value,c.value),v},d=(E=!1,y=(v=>(v=o.store)==null?void 0:v.states.defaultExpandAll.value)())=>{var v;const m=a.value,S=u.value,L=Object.keys(m),k={};if(L.length){const N=C(l),A=[],D=(O,Y)=>{if(E)return t.value?y||t.value.includes(Y):!!(y||(O==null?void 0:O.expanded));{const V=y||t.value&&t.value.includes(Y);return!!((O==null?void 0:O.expanded)||V)}};L.forEach(O=>{const Y=N[O],V=ae({},m[O]);if(V.expanded=D(Y,O),V.lazy){const{loaded:J=!1,loading:ne=!1}=Y||{};V.loaded=!!J,V.loading=!!ne,A.push(O)}k[O]=V});const G=Object.keys(S);s.value&&G.length&&A.length&&G.forEach(O=>{const Y=N[O],V=S[O].children;if(A.includes(O)){if(k[O].children.length!==0)throw new Error(\"[ElTable]children must be an empty array.\");k[O].children=V}else{const{loaded:J=!1,loading:ne=!1}=Y||{};k[O]={lazy:!0,loaded:!!J,loading:!!ne,expanded:D(Y,O),children:V,level:\"\"}}})}l.value=k,(v=o.store)==null||v.updateTableScrollY()};ce(()=>t.value,()=>{d(!0)}),ce(()=>a.value,()=>{d()}),ce(()=>u.value,()=>{d()});const p=E=>{t.value=E,d()},f=(E,y)=>{o.store.assertRowKey();const v=e.rowKey.value,m=Z(E,v),S=m&&l.value[m];if(m&&S&&\"expanded\"in S){const L=S.expanded;y=typeof y==\"undefined\"?!S.expanded:y,l.value[m].expanded=y,L!==y&&o.emit(\"expand-change\",E,y),o.store.updateTableScrollY()}},g=E=>{o.store.assertRowKey();const y=e.rowKey.value,v=Z(E,y),m=l.value[v];s.value&&m&&\"loaded\"in m&&!m.loaded?b(E,v,m):f(E,void 0)},b=(E,y,v)=>{const{load:m}=o.props;m&&!l.value[y].loaded&&(l.value[y].loading=!0,m(E,v,S=>{if(!Array.isArray(S))throw new TypeError(\"[ElTable] data must be an array\");l.value[y].loading=!1,l.value[y].loaded=!0,l.value[y].expanded=!0,S.length&&(i.value[y]=S),o.emit(\"expand-change\",E,!0)}))};return{loadData:b,loadOrToggle:g,toggleTreeExpansion:f,updateTreeExpandKeys:p,updateTreeData:d,normalize:h,states:{expandRowKeys:t,treeData:l,indent:n,lazy:s,lazyTreeNodeMap:i,lazyColumnIdentifier:c,childrenColumnName:r}}}const uo=(e,t)=>{const l=t.sortingColumn;return!l||typeof l.sortable==\"string\"?e:Jn(e,t.sortProp,t.sortOrder,l.sortMethod,l.sortBy)},Ze=e=>{const t=[];return e.forEach(l=>{l.children?t.push.apply(t,Ze(l.children)):t.push(l)}),t};function co(){var e;const t=le(),{size:l}=ll((e=t.proxy)==null?void 0:e.$props),n=x(null),s=x([]),i=x([]),c=x(!1),r=x([]),o=x([]),a=x([]),u=x([]),h=x([]),d=x([]),p=x([]),f=x([]),g=x(0),b=x(0),E=x(0),y=x(!1),v=x([]),m=x(!1),S=x(!1),L=x(null),k=x({}),N=x(null),A=x(null),D=x(null),G=x(null),O=x(null);ce(s,()=>t.state&&J(!1),{deep:!0});const Y=()=>{if(!n.value)throw new Error(\"[ElTable] prop row-key is required\")},V=()=>{u.value=r.value.filter(I=>I.fixed===!0||I.fixed===\"left\"),h.value=r.value.filter(I=>I.fixed===\"right\"),u.value.length>0&&r.value[0]&&r.value[0].type===\"selection\"&&!r.value[0].fixed&&(r.value[0].fixed=!0,u.value.unshift(r.value[0]));const F=r.value.filter(I=>!I.fixed);o.value=[].concat(u.value).concat(F).concat(h.value);const H=Ze(F),B=Ze(u.value),M=Ze(h.value);g.value=H.length,b.value=B.length,E.value=M.length,a.value=[].concat(B).concat(H).concat(M),c.value=u.value.length>0||h.value.length>0},J=(F,H=!1)=>{F&&V(),H?t.state.doLayout():t.state.debouncedUpdateLayout()},ne=F=>v.value.includes(F),He=()=>{y.value=!1,v.value.length&&(v.value=[],t.emit(\"selection-change\",[]))},R=()=>{let F;if(n.value){F=[];const H=Ne(v.value,n.value),B=Ne(s.value,n.value);for(const M in H)_e(H,M)&&!B[M]&&F.push(H[M].row)}else F=v.value.filter(H=>!s.value.includes(H));if(F.length){const H=v.value.filter(B=>!F.includes(B));v.value=H,t.emit(\"selection-change\",H.slice())}},w=()=>(v.value||[]).slice(),W=(F,H=void 0,B=!0)=>{if(Qe(v.value,F,H)){const I=(v.value||[]).slice();B&&t.emit(\"select\",I,F),t.emit(\"selection-change\",I)}},K=()=>{var F,H;const B=S.value?!y.value:!(y.value||v.value.length);y.value=B;let M=!1,I=0;const te=(H=(F=t==null?void 0:t.store)==null?void 0:F.states)==null?void 0:H.rowKey.value;s.value.forEach((fe,We)=>{const be=We+I;L.value?L.value.call(null,fe,be)&&Qe(v.value,fe,B)&&(M=!0):Qe(v.value,fe,B)&&(M=!0),I+=ue(Z(fe,te))}),M&&t.emit(\"selection-change\",v.value?v.value.slice():[]),t.emit(\"select-all\",v.value)},U=()=>{const F=Ne(v.value,n.value);s.value.forEach(H=>{const B=Z(H,n.value),M=F[B];M&&(v.value[M.index]=H)})},Q=()=>{var F,H,B;if(((F=s.value)==null?void 0:F.length)===0){y.value=!1;return}let M;n.value&&(M=Ne(v.value,n.value));const I=function(be){return M?!!M[Z(be,n.value)]:v.value.includes(be)};let te=!0,fe=0,We=0;for(let be=0,jl=(s.value||[]).length;be<jl;be++){const Gl=(B=(H=t==null?void 0:t.store)==null?void 0:H.states)==null?void 0:B.rowKey.value,Yl=be+We,st=s.value[be],Ul=L.value&&L.value.call(null,st,Yl);if(I(st))fe++;else if(!L.value||Ul){te=!1;break}We+=ue(Z(st,Gl))}fe===0&&(te=!1),y.value=te},ue=F=>{var H;if(!t||!t.store)return 0;const{treeData:B}=t.store.states;let M=0;const I=(H=B.value[F])==null?void 0:H.children;return I&&(M+=I.length,I.forEach(te=>{M+=ue(te)})),M},se=(F,H)=>{Array.isArray(F)||(F=[F]);const B={};return F.forEach(M=>{k.value[M.id]=H,B[M.columnKey||M.id]=H}),B},de=(F,H,B)=>{A.value&&A.value!==F&&(A.value.order=null),A.value=F,D.value=H,G.value=B},ve=()=>{let F=C(i);Object.keys(k.value).forEach(H=>{const B=k.value[H];if(!B||B.length===0)return;const M=Sl({columns:a.value},H);M&&M.filterMethod&&(F=F.filter(I=>B.some(te=>M.filterMethod.call(null,te,I,M))))}),N.value=F},ee=()=>{s.value=uo(N.value,{sortingColumn:A.value,sortProp:D.value,sortOrder:G.value})},$e=(F=void 0)=>{F&&F.filter||ve(),ee()},ot=F=>{const{tableHeaderRef:H}=t.refs;if(!H)return;const B=Object.assign({},H.filterPanels),M=Object.keys(B);if(!!M.length)if(typeof F==\"string\"&&(F=[F]),Array.isArray(F)){const I=F.map(te=>eo({columns:a.value},te));M.forEach(te=>{const fe=I.find(We=>We.id===te);fe&&(fe.filteredValue=[])}),t.store.commit(\"filterChange\",{column:I,values:[],silent:!0,multi:!0})}else M.forEach(I=>{const te=a.value.find(fe=>fe.id===I);te&&(te.filteredValue=[])}),k.value={},t.store.commit(\"filterChange\",{column:{},values:[],silent:!0})},Hl=()=>{!A.value||(de(null,null,null),t.store.commit(\"changeSortCondition\",{silent:!0}))},{setExpandRowKeys:$l,toggleRowExpansion:Lt,updateExpandRows:Wl,states:Ml,isRowExpanded:Tl}=ao({data:s,rowKey:n}),{updateTreeExpandKeys:Ol,toggleTreeExpansion:Bl,updateTreeData:Pl,loadOrToggle:zl,states:Dl}=io({data:s,rowKey:n}),{updateCurrentRowData:Il,updateCurrentRow:Vl,setCurrentRowKey:Kl,states:_l}=ro({data:s,rowKey:n});return{assertRowKey:Y,updateColumns:V,scheduleLayout:J,isSelected:ne,clearSelection:He,cleanSelection:R,getSelectionRows:w,toggleRowSelection:W,_toggleAllSelection:K,toggleAllSelection:null,updateSelectionByRowKey:U,updateAllSelected:Q,updateFilters:se,updateCurrentRow:Vl,updateSort:de,execFilter:ve,execSort:ee,execQuery:$e,clearFilter:ot,clearSort:Hl,toggleRowExpansion:Lt,setExpandRowKeysAdapter:F=>{$l(F),Ol(F)},setCurrentRowKey:Kl,toggleRowExpansionAdapter:(F,H)=>{a.value.some(({type:M})=>M===\"expand\")?Lt(F,H):Bl(F,H)},isRowExpanded:Tl,updateExpandRows:Wl,updateCurrentRowData:Il,loadOrToggle:zl,updateTreeData:Pl,states:ae(ae(ae({tableSize:l,rowKey:n,data:s,_data:i,isComplex:c,_columns:r,originColumns:o,columns:a,fixedColumns:u,rightFixedColumns:h,leafColumns:d,fixedLeafColumns:p,rightFixedLeafColumns:f,leafColumnsLength:g,fixedLeafColumnsLength:b,rightFixedLeafColumnsLength:E,isAllSelected:y,selection:v,reserveSelection:m,selectOnIndeterminate:S,selectable:L,filters:k,filteredData:N,sortingColumn:A,sortProp:D,sortOrder:G,hoverRow:O},Ml),Dl),_l)}}function bt(e,t){return e.map(l=>{var n;return l.id===t.id?t:((n=l.children)!=null&&n.length&&(l.children=bt(l.children,t)),l)})}function kl(e){e.forEach(t=>{var l,n;t.no=(l=t.getColumnIndex)==null?void 0:l.call(t),(n=t.children)!=null&&n.length&&kl(t.children)}),e.sort((t,l)=>t.no-l.no)}function fo(){const e=le(),t=co(),l=ie(\"table\"),n={setData(c,r){const o=C(c._data)!==r;c.data.value=r,c._data.value=r,e.store.execQuery(),e.store.updateCurrentRowData(),e.store.updateExpandRows(),e.store.updateTreeData(e.store.states.defaultExpandAll.value),C(c.reserveSelection)?(e.store.assertRowKey(),e.store.updateSelectionByRowKey()):o?e.store.clearSelection():e.store.cleanSelection(),e.store.updateAllSelected(),e.$ready&&e.store.scheduleLayout()},insertColumn(c,r,o){const a=C(c._columns);let u=[];o?(o&&!o.children&&(o.children=[]),o.children.push(r),u=bt(a,o)):(a.push(r),u=a),kl(u),c._columns.value=u,r.type===\"selection\"&&(c.selectable.value=r.selectable,c.reserveSelection.value=r.reserveSelection),e.$ready&&(e.store.updateColumns(),e.store.scheduleLayout())},removeColumn(c,r,o){const a=C(c._columns)||[];if(o)o.children.splice(o.children.findIndex(u=>u.id===r.id),1),o.children.length===0&&delete o.children,c._columns.value=bt(a,o);else{const u=a.indexOf(r);u>-1&&(a.splice(u,1),c._columns.value=a)}e.$ready&&(e.store.updateColumns(),e.store.scheduleLayout())},sort(c,r){const{prop:o,order:a,init:u}=r;if(o){const h=C(c.columns).find(d=>d.property===o);h&&(h.order=a,e.store.updateSort(h,o,a),e.store.commit(\"changeSortCondition\",{init:u}))}},changeSortCondition(c,r){const{sortingColumn:o,sortProp:a,sortOrder:u}=c,h=C(o),d=C(a),p=C(u);p===null&&(c.sortingColumn.value=null,c.sortProp.value=null);const f={filter:!0};e.store.execQuery(f),(!r||!(r.silent||r.init))&&e.emit(\"sort-change\",{column:h,prop:d,order:p}),e.store.updateTableScrollY()},filterChange(c,r){const{column:o,values:a,silent:u}=r,h=e.store.updateFilters(o,a);e.store.execQuery(),u||e.emit(\"filter-change\",h),e.store.updateTableScrollY()},toggleAllSelection(){e.store.toggleAllSelection()},rowSelectedChanged(c,r){e.store.toggleRowSelection(r),e.store.updateAllSelected()},setHoverRow(c,r){c.hoverRow.value=r},setCurrentRow(c,r){e.store.updateCurrentRow(r)}},s=function(c,...r){const o=e.store.mutations;if(o[c])o[c].apply(e,[e.store.states].concat(r));else throw new Error(`Action not found: ${c}`)},i=function(){Ae(()=>e.layout.updateScrollY.apply(e.layout))};return Re(ae({ns:l},t),{mutations:n,commit:s,updateTableScrollY:i})}const Ve={rowKey:\"rowKey\",defaultExpandAll:\"defaultExpandAll\",selectOnIndeterminate:\"selectOnIndeterminate\",indent:\"indent\",lazy:\"lazy\",data:\"data\",[\"treeProps.hasChildren\"]:{key:\"lazyColumnIdentifier\",default:\"hasChildren\"},[\"treeProps.children\"]:{key:\"childrenColumnName\",default:\"children\"}};function ho(e,t){if(!e)throw new Error(\"Table is required.\");const l=fo();return l.toggleAllSelection=tt(l._toggleAllSelection,10),Object.keys(Ve).forEach(n=>{Rl(Ll(t,n),n,l)}),vo(l,t),l}function vo(e,t){Object.keys(Ve).forEach(l=>{ce(()=>Ll(t,l),n=>{Rl(n,l,e)})})}function Rl(e,t,l){let n=e,s=Ve[t];typeof Ve[t]==\"object\"&&(s=s.key,n=n||Ve[t].default),l.states[s].value=n}function Ll(e,t){if(t.includes(\".\")){const l=t.split(\".\");let n=e;return l.forEach(s=>{n=n[s]}),n}else return e[t]}class po{constructor(t){this.observers=[],this.table=null,this.store=null,this.columns=[],this.fit=!0,this.showHeader=!0,this.height=x(null),this.scrollX=x(!1),this.scrollY=x(!1),this.bodyWidth=x(null),this.fixedWidth=x(null),this.rightFixedWidth=x(null),this.gutterWidth=0;for(const l in t)_e(t,l)&&(Ke(this[l])?this[l].value=t[l]:this[l]=t[l]);if(!this.table)throw new Error(\"Table is required for Table Layout\");if(!this.store)throw new Error(\"Store is required for Table Layout\")}updateScrollY(){if(this.height.value===null)return!1;const l=this.table.refs.scrollBarRef;if(this.table.vnode.el&&l){let n=!0;const s=this.scrollY.value;return n=l.wrap$.scrollHeight>l.wrap$.clientHeight,this.scrollY.value=n,s!==n}return!1}setHeight(t,l=\"height\"){if(!Te)return;const n=this.table.vnode.el;if(t=lo(t),this.height.value=Number(t),!n&&(t||t===0))return Ae(()=>this.setHeight(t,l));typeof t==\"number\"?(n.style[l]=`${t}px`,this.updateElsHeight()):typeof t==\"string\"&&(n.style[l]=t,this.updateElsHeight())}setMaxHeight(t){this.setHeight(t,\"max-height\")}getFlattenColumns(){const t=[];return this.table.store.states.columns.value.forEach(n=>{n.isColumnGroup?t.push.apply(t,n.columns):t.push(n)}),t}updateElsHeight(){this.updateScrollY(),this.notifyObservers(\"scrollable\")}headerDisplayNone(t){if(!t)return!0;let l=t;for(;l.tagName!==\"DIV\";){if(getComputedStyle(l).display===\"none\")return!0;l=l.parentElement}return!1}updateColumnsWidth(){if(!Te)return;const t=this.fit,l=this.table.vnode.el.clientWidth;let n=0;const s=this.getFlattenColumns(),i=s.filter(o=>typeof o.width!=\"number\");if(s.forEach(o=>{typeof o.width==\"number\"&&o.realWidth&&(o.realWidth=null)}),i.length>0&&t){if(s.forEach(o=>{n+=Number(o.width||o.minWidth||80)}),n<=l){this.scrollX.value=!1;const o=l-n;if(i.length===1)i[0].realWidth=Number(i[0].minWidth||80)+o;else{const a=i.reduce((d,p)=>d+Number(p.minWidth||80),0),u=o/a;let h=0;i.forEach((d,p)=>{if(p===0)return;const f=Math.floor(Number(d.minWidth||80)*u);h+=f,d.realWidth=Number(d.minWidth||80)+f}),i[0].realWidth=Number(i[0].minWidth||80)+o-h}}else this.scrollX.value=!0,i.forEach(o=>{o.realWidth=Number(o.minWidth)});this.bodyWidth.value=Math.max(n,l),this.table.state.resizeState.value.width=this.bodyWidth.value}else s.forEach(o=>{!o.width&&!o.minWidth?o.realWidth=80:o.realWidth=Number(o.width||o.minWidth),n+=o.realWidth}),this.scrollX.value=n>l,this.bodyWidth.value=n;const c=this.store.states.fixedColumns.value;if(c.length>0){let o=0;c.forEach(a=>{o+=Number(a.realWidth||a.width)}),this.fixedWidth.value=o}const r=this.store.states.rightFixedColumns.value;if(r.length>0){let o=0;r.forEach(a=>{o+=Number(a.realWidth||a.width)}),this.rightFixedWidth.value=o}this.notifyObservers(\"columns\")}addObserver(t){this.observers.push(t)}removeObserver(t){const l=this.observers.indexOf(t);l!==-1&&this.observers.splice(l,1)}notifyObservers(t){this.observers.forEach(n=>{var s,i;switch(t){case\"columns\":(s=n.state)==null||s.onColumnsChange(this);break;case\"scrollable\":(i=n.state)==null||i.onScrollableChange(this);break;default:throw new Error(`Table Layout don't have event ${t}.`)}})}}const{CheckboxGroup:mo}=Pe,go=pe({name:\"ElTableFilterPanel\",components:{ElCheckbox:Pe,ElCheckboxGroup:mo,ElScrollbar:Ct,ElTooltip:Cn,ElIcon:wt,ArrowDown:an,ArrowUp:rn},directives:{ClickOutside:Sn},props:{placement:{type:String,default:\"bottom-start\"},store:{type:Object},column:{type:Object},upDataColumn:{type:Function}},setup(e){const t=le(),{t:l}=ol(),n=ie(\"table-filter\"),s=t==null?void 0:t.parent;s.filterPanels.value[e.column.id]||(s.filterPanels.value[e.column.id]=t);const i=x(!1),c=x(null),r=$(()=>e.column&&e.column.filters),o=$({get:()=>{var m;return(((m=e.column)==null?void 0:m.filteredValue)||[])[0]},set:m=>{a.value&&(typeof m!=\"undefined\"&&m!==null?a.value.splice(0,1,m):a.value.splice(0,1))}}),a=$({get(){return e.column?e.column.filteredValue||[]:[]},set(m){e.column&&e.upDataColumn(\"filteredValue\",m)}}),u=$(()=>e.column?e.column.filterMultiple:!0),h=m=>m.value===o.value,d=()=>{i.value=!1},p=m=>{m.stopPropagation(),i.value=!i.value},f=()=>{i.value=!1},g=()=>{y(a.value),d()},b=()=>{a.value=[],y(a.value),d()},E=m=>{o.value=m,y(typeof m!=\"undefined\"&&m!==null?a.value:[]),d()},y=m=>{e.store.commit(\"filterChange\",{column:e.column,values:m}),e.store.updateAllSelected()};ce(i,m=>{e.column&&e.upDataColumn(\"filterOpened\",m)},{immediate:!0});const v=$(()=>{var m,S;return(S=(m=c.value)==null?void 0:m.popperRef)==null?void 0:S.contentRef});return{tooltipVisible:i,multiple:u,filteredValue:a,filterValue:o,filters:r,handleConfirm:g,handleReset:b,handleSelect:E,isActive:h,t:l,ns:n,showFilterPanel:p,hideFilterPanel:f,popperPaneRef:v,tooltip:c}}}),bo={key:0},yo=[\"disabled\"],Co=[\"label\",\"onClick\"];function wo(e,t,l,n,s,i){const c=he(\"el-checkbox\"),r=he(\"el-checkbox-group\"),o=he(\"el-scrollbar\"),a=he(\"arrow-up\"),u=he(\"arrow-down\"),h=he(\"el-icon\"),d=he(\"el-tooltip\"),p=sl(\"click-outside\");return z(),Se(d,{ref:\"tooltip\",visible:e.tooltipVisible,offset:0,placement:e.placement,\"show-arrow\":!1,\"stop-popper-mouse-event\":!1,teleported:\"\",effect:\"light\",pure:\"\",\"popper-class\":e.ns.b(),persistent:\"\"},{content:q(()=>[e.multiple?(z(),j(\"div\",bo,[_(\"div\",{class:P(e.ns.e(\"content\"))},[X(o,{\"wrap-class\":e.ns.e(\"wrap\")},{default:q(()=>[X(r,{modelValue:e.filteredValue,\"onUpdate:modelValue\":t[0]||(t[0]=f=>e.filteredValue=f),class:P(e.ns.e(\"checkbox-group\"))},{default:q(()=>[(z(!0),j(Oe,null,Wt(e.filters,f=>(z(),Se(c,{key:f.value,label:f.value},{default:q(()=>[Be(oe(f.text),1)]),_:2},1032,[\"label\"]))),128))]),_:1},8,[\"modelValue\",\"class\"])]),_:1},8,[\"wrap-class\"])],2),_(\"div\",{class:P(e.ns.e(\"bottom\"))},[_(\"button\",{class:P({[e.ns.is(\"disabled\")]:e.filteredValue.length===0}),disabled:e.filteredValue.length===0,type:\"button\",onClick:t[1]||(t[1]=(...f)=>e.handleConfirm&&e.handleConfirm(...f))},oe(e.t(\"el.table.confirmFilter\")),11,yo),_(\"button\",{type:\"button\",onClick:t[2]||(t[2]=(...f)=>e.handleReset&&e.handleReset(...f))},oe(e.t(\"el.table.resetFilter\")),1)],2)])):(z(),j(\"ul\",{key:1,class:P(e.ns.e(\"list\"))},[_(\"li\",{class:P([e.ns.e(\"list-item\"),{[e.ns.is(\"active\")]:e.filterValue===void 0||e.filterValue===null}]),onClick:t[3]||(t[3]=f=>e.handleSelect(null))},oe(e.t(\"el.table.clearFilter\")),3),(z(!0),j(Oe,null,Wt(e.filters,f=>(z(),j(\"li\",{key:f.value,class:P([e.ns.e(\"list-item\"),e.ns.is(\"active\",e.isActive(f))]),label:f.value,onClick:g=>e.handleSelect(f.value)},oe(f.text),11,Co))),128))],2))]),default:q(()=>[ke((z(),j(\"span\",{class:P([`${e.ns.namespace.value}-table__column-filter-trigger`,`${e.ns.namespace.value}-none-outline`]),onClick:t[4]||(t[4]=(...f)=>e.showFilterPanel&&e.showFilterPanel(...f))},[X(h,null,{default:q(()=>[e.column.filterOpened?(z(),Se(a,{key:0})):(z(),Se(u,{key:1}))]),_:1})],2)),[[p,e.hideFilterPanel,e.popperPaneRef]])]),_:1},8,[\"visible\",\"placement\",\"popper-class\"])}var So=je(go,[[\"render\",wo],[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/table/src/filter-panel.vue\"]]);function Fl(e){const t=le();al(()=>{l.value.addObserver(t)}),nt(()=>{n(l.value),s(l.value)}),un(()=>{n(l.value),s(l.value)}),St(()=>{l.value.removeObserver(t)});const l=$(()=>{const i=e.layout;if(!i)throw new Error(\"Can not find table layout.\");return i}),n=i=>{var c;const r=((c=e.vnode.el)==null?void 0:c.querySelectorAll(\"colgroup > col\"))||[];if(!r.length)return;const o=i.getFlattenColumns(),a={};o.forEach(u=>{a[u.id]=u});for(let u=0,h=r.length;u<h;u++){const d=r[u],p=d.getAttribute(\"name\"),f=a[p];f&&d.setAttribute(\"width\",f.realWidth||f.width)}},s=i=>{var c,r;const o=((c=e.vnode.el)==null?void 0:c.querySelectorAll(\"colgroup > col[name=gutter]\"))||[];for(let u=0,h=o.length;u<h;u++)o[u].setAttribute(\"width\",i.scrollY.value?i.gutterWidth:\"0\");const a=((r=e.vnode.el)==null?void 0:r.querySelectorAll(\"th.gutter\"))||[];for(let u=0,h=a.length;u<h;u++){const d=a[u];d.style.width=i.scrollY.value?`${i.gutterWidth}px`:\"0\",d.style.display=i.scrollY.value?\"\":\"none\"}};return{tableLayout:l.value,onColumnsChange:n,onScrollableChange:s}}const ge=Symbol(\"ElTable\");function xo(e,t){const l=le(),n=me(ge),s=g=>{g.stopPropagation()},i=(g,b)=>{!b.filters&&b.sortable?f(g,b,!1):b.filterable&&!b.sortable&&s(g),n==null||n.emit(\"header-click\",b,g)},c=(g,b)=>{n==null||n.emit(\"header-contextmenu\",b,g)},r=x(null),o=x(!1),a=x({}),u=(g,b)=>{if(!!Te&&!(b.children&&b.children.length>0)&&r.value&&e.border){o.value=!0;const E=n;t(\"set-drag-visible\",!0);const v=(E==null?void 0:E.vnode.el).getBoundingClientRect().left,m=l.vnode.el.querySelector(`th.${b.id}`),S=m.getBoundingClientRect(),L=S.left-v+30;rl(m,\"noclick\"),a.value={startMouseLeft:g.clientX,startLeft:S.right-v,startColumnLeft:S.left-v,tableLeft:v};const k=E==null?void 0:E.refs.resizeProxy;k.style.left=`${a.value.startLeft}px`,document.onselectstart=function(){return!1},document.ondragstart=function(){return!1};const N=D=>{const G=D.clientX-a.value.startMouseLeft,O=a.value.startLeft+G;k.style.left=`${Math.max(L,O)}px`},A=()=>{if(o.value){const{startColumnLeft:D,startLeft:G}=a.value,Y=Number.parseInt(k.style.left,10)-D;b.width=b.realWidth=Y,E==null||E.emit(\"header-dragend\",b.width,G-D,b,g),requestAnimationFrame(()=>{e.store.scheduleLayout(!1,!0)}),document.body.style.cursor=\"\",o.value=!1,r.value=null,a.value={},t(\"set-drag-visible\",!1)}document.removeEventListener(\"mousemove\",N),document.removeEventListener(\"mouseup\",A),document.onselectstart=null,document.ondragstart=null,setTimeout(()=>{ut(m,\"noclick\")},0)};document.addEventListener(\"mousemove\",N),document.addEventListener(\"mouseup\",A)}},h=(g,b)=>{var E;if(b.children&&b.children.length>0)return;const y=(E=g.target)==null?void 0:E.closest(\"th\");if(!(!b||!b.resizable)&&!o.value&&e.border){const v=y.getBoundingClientRect(),m=document.body.style;v.width>12&&v.right-g.pageX<8?(m.cursor=\"col-resize\",Ye(y,\"is-sortable\")&&(y.style.cursor=\"col-resize\"),r.value=b):o.value||(m.cursor=\"\",Ye(y,\"is-sortable\")&&(y.style.cursor=\"pointer\"),r.value=null)}},d=()=>{!Te||(document.body.style.cursor=\"\")},p=({order:g,sortOrders:b})=>{if(g===\"\")return b[0];const E=b.indexOf(g||null);return b[E>b.length-2?0:E+1]},f=(g,b,E)=>{var y;g.stopPropagation();const v=b.order===E?null:E||p(b),m=(y=g.target)==null?void 0:y.closest(\"th\");if(m&&Ye(m,\"noclick\")){ut(m,\"noclick\");return}if(!b.sortable)return;const S=e.store.states;let L=S.sortProp.value,k;const N=S.sortingColumn.value;(N!==b||N===b&&N.order===null)&&(N&&(N.order=null),S.sortingColumn.value=b,L=b.property),v?k=b.order=v:k=b.order=null,S.sortProp.value=L,S.sortOrder.value=k,n==null||n.store.commit(\"changeSortCondition\")};return{handleHeaderClick:i,handleHeaderContextMenu:c,handleMouseDown:u,handleMouseMove:h,handleMouseOut:d,handleSortClick:f,handleFilterClick:s}}function Eo(e){const t=me(ge),l=ie(\"table\");return{getHeaderRowStyle:r=>{const o=t==null?void 0:t.props.headerRowStyle;return typeof o==\"function\"?o.call(null,{rowIndex:r}):o},getHeaderRowClass:r=>{const o=[],a=t==null?void 0:t.props.headerRowClassName;return typeof a==\"string\"?o.push(a):typeof a==\"function\"&&o.push(a.call(null,{rowIndex:r})),o.join(\" \")},getHeaderCellStyle:(r,o,a,u)=>{var h;let d=(h=t==null?void 0:t.props.headerCellStyle)!=null?h:{};typeof d==\"function\"&&(d=d.call(null,{rowIndex:r,columnIndex:o,row:a,column:u}));const p=u.isSubColumn?null:kt(o,u.fixed,e.store,a);return ze(p,\"left\"),ze(p,\"right\"),Object.assign({},d,p)},getHeaderCellClass:(r,o,a,u)=>{const h=u.isSubColumn?[]:Et(l.b(),o,u.fixed,e.store,a),d=[u.id,u.order,u.headerAlign,u.className,u.labelClassName,...h];u.children||d.push(\"is-leaf\"),u.sortable&&d.push(\"is-sortable\");const p=t==null?void 0:t.props.headerCellClassName;return typeof p==\"string\"?d.push(p):typeof p==\"function\"&&d.push(p.call(null,{rowIndex:r,columnIndex:o,row:a,column:u})),d.push(l.e(\"cell\")),d.filter(f=>Boolean(f)).join(\" \")}}}const Nl=e=>{const t=[];return e.forEach(l=>{l.children?(t.push(l),t.push.apply(t,Nl(l.children))):t.push(l)}),t},ko=e=>{let t=1;const l=(i,c)=>{if(c&&(i.level=c.level+1,t<i.level&&(t=i.level)),i.children){let r=0;i.children.forEach(o=>{l(o,i),r+=o.colSpan}),i.colSpan=r}else i.colSpan=1};e.forEach(i=>{i.level=1,l(i,void 0)});const n=[];for(let i=0;i<t;i++)n.push([]);return Nl(e).forEach(i=>{i.children?(i.rowSpan=1,i.children.forEach(c=>c.isSubColumn=!0)):i.rowSpan=t-i.level+1,n[i.level-1].push(i)}),n};function Ro(e){const t=me(ge),l=$(()=>ko(e.store.states.originColumns.value));return{isGroup:$(()=>{const i=l.value.length>1;return i&&t&&(t.state.isGroup.value=!0),i}),toggleAllSelection:i=>{i.stopPropagation(),t==null||t.store.commit(\"toggleAllSelection\")},columnRows:l}}var Lo=pe({name:\"ElTableHeader\",components:{ElCheckbox:Pe},props:{fixed:{type:String,default:\"\"},store:{required:!0,type:Object},border:Boolean,defaultSort:{type:Object,default:()=>({prop:\"\",order:\"\"})}},setup(e,{emit:t}){const l=le(),n=me(ge),s=ie(\"table\"),i=x({}),{onColumnsChange:c,onScrollableChange:r}=Fl(n);nt(()=>xe(this,null,function*(){yield Ae(),yield Ae();const{prop:L,order:k}=e.defaultSort;n==null||n.store.commit(\"sort\",{prop:L,order:k,init:!0})}));const{handleHeaderClick:o,handleHeaderContextMenu:a,handleMouseDown:u,handleMouseMove:h,handleMouseOut:d,handleSortClick:p,handleFilterClick:f}=xo(e,t),{getHeaderRowStyle:g,getHeaderRowClass:b,getHeaderCellStyle:E,getHeaderCellClass:y}=Eo(e),{isGroup:v,toggleAllSelection:m,columnRows:S}=Ro(e);return l.state={onColumnsChange:c,onScrollableChange:r},l.filterPanels=i,{ns:s,filterPanels:i,onColumnsChange:c,onScrollableChange:r,columnRows:S,getHeaderRowClass:b,getHeaderRowStyle:g,getHeaderCellClass:y,getHeaderCellStyle:E,handleHeaderClick:o,handleHeaderContextMenu:a,handleMouseDown:u,handleMouseMove:h,handleMouseOut:d,handleSortClick:p,handleFilterClick:f,isGroup:v,toggleAllSelection:m}},render(){const{ns:e,isGroup:t,columnRows:l,getHeaderCellStyle:n,getHeaderCellClass:s,getHeaderRowClass:i,getHeaderRowStyle:c,handleHeaderClick:r,handleHeaderContextMenu:o,handleMouseDown:a,handleMouseMove:u,handleSortClick:h,handleMouseOut:d,store:p,$parent:f}=this;let g=1;return T(\"thead\",{class:{[e.is(\"group\")]:t}},l.map((b,E)=>T(\"tr\",{class:i(E),key:E,style:c(E)},b.map((y,v)=>(y.rowSpan>g&&(g=y.rowSpan),T(\"th\",{class:s(E,v,b,y),colspan:y.colSpan,key:`${y.id}-thead`,rowspan:y.rowSpan,style:n(E,v,b,y),onClick:m=>r(m,y),onContextmenu:m=>o(m,y),onMousedown:m=>a(m,y),onMousemove:m=>u(m,y),onMouseout:d},[T(\"div\",{class:[\"cell\",y.filteredValue&&y.filteredValue.length>0?\"highlight\":\"\"]},[y.renderHeader?y.renderHeader({column:y,$index:v,store:p,_self:f}):y.label,y.sortable&&T(\"span\",{onClick:m=>h(m,y),class:\"caret-wrapper\"},[T(\"i\",{onClick:m=>h(m,y,\"ascending\"),class:\"sort-caret ascending\"}),T(\"i\",{onClick:m=>h(m,y,\"descending\"),class:\"sort-caret descending\"})]),y.filterable&&T(So,{store:p,placement:y.filterPlacement||\"bottom-start\",column:y,upDataColumn:(m,S)=>{y[m]=S}})])]))))))}});function Fo(e){const t=me(ge),l=x(\"\"),n=x(T(\"div\")),s=(d,p,f)=>{var g;const b=t,E=at(d);let y;const v=(g=b==null?void 0:b.vnode.el)==null?void 0:g.dataset.prefix;E&&(y=Yt({columns:e.store.states.columns.value},E,v),y&&(b==null||b.emit(`cell-${f}`,p,y,E,d))),b==null||b.emit(`row-${f}`,p,y,d)},i=(d,p)=>{s(d,p,\"dblclick\")},c=(d,p)=>{e.store.commit(\"setCurrentRow\",p),s(d,p,\"click\")},r=(d,p)=>{s(d,p,\"contextmenu\")},o=tt(d=>{e.store.commit(\"setHoverRow\",d)},30),a=tt(()=>{e.store.commit(\"setHoverRow\",null)},30);return{handleDoubleClick:i,handleClick:c,handleContextMenu:r,handleMouseEnter:o,handleMouseLeave:a,handleCellMouseEnter:(d,p,f)=>{var g;const b=t,E=at(d),y=(g=b==null?void 0:b.vnode.el)==null?void 0:g.dataset.prefix;if(E){const k=Yt({columns:e.store.states.columns.value},E,y),N=b.hoverState={cell:E,column:k,row:p};b==null||b.emit(\"cell-mouse-enter\",N.row,N.column,N.cell,d)}const v=d.target.querySelector(\".cell\");if(!(Ye(v,`${y}-tooltip`)&&v.childNodes.length))return;const m=document.createRange();m.setStart(v,0),m.setEnd(v,v.childNodes.length);const S=m.getBoundingClientRect().width,L=(Number.parseInt(Mt(v,\"paddingLeft\"),10)||0)+(Number.parseInt(Mt(v,\"paddingRight\"),10)||0);(S+L>v.offsetWidth||v.scrollWidth>v.offsetWidth)&&so(t==null?void 0:t.refs.tableWrapper,E,E.innerText||E.textContent,{placement:\"top\",strategy:\"fixed\"},f)},handleCellMouseLeave:d=>{if(!at(d))return;const f=t==null?void 0:t.hoverState;t==null||t.emit(\"cell-mouse-leave\",f==null?void 0:f.row,f==null?void 0:f.column,f==null?void 0:f.cell,d)},tooltipContent:l,tooltipTrigger:n}}function No(e){const t=me(ge),l=ie(\"table\");return{getRowStyle:(a,u)=>{const h=t==null?void 0:t.props.rowStyle;return typeof h==\"function\"?h.call(null,{row:a,rowIndex:u}):h||null},getRowClass:(a,u)=>{const h=[l.e(\"row\")];(t==null?void 0:t.props.highlightCurrentRow)&&a===e.store.states.currentRow.value&&h.push(\"current-row\"),e.stripe&&u%2===1&&h.push(l.em(\"row\",\"striped\"));const d=t==null?void 0:t.props.rowClassName;return typeof d==\"string\"?h.push(d):typeof d==\"function\"&&h.push(d.call(null,{row:a,rowIndex:u})),h},getCellStyle:(a,u,h,d)=>{const p=t==null?void 0:t.props.cellStyle;let f=p!=null?p:{};typeof p==\"function\"&&(f=p.call(null,{rowIndex:a,columnIndex:u,row:h,column:d}));const g=d.isSubColumn?null:kt(u,e==null?void 0:e.fixed,e.store);return ze(g,\"left\"),ze(g,\"right\"),Object.assign({},f,g)},getCellClass:(a,u,h,d)=>{const p=d.isSubColumn?[]:Et(l.b(),u,e==null?void 0:e.fixed,e.store),f=[d.id,d.align,d.className,...p],g=t==null?void 0:t.props.cellClassName;return typeof g==\"string\"?f.push(g):typeof g==\"function\"&&f.push(g.call(null,{rowIndex:a,columnIndex:u,row:h,column:d})),f.push(l.e(\"cell\")),f.filter(b=>Boolean(b)).join(\" \")},getSpan:(a,u,h,d)=>{let p=1,f=1;const g=t==null?void 0:t.props.spanMethod;if(typeof g==\"function\"){const b=g({row:a,column:u,rowIndex:h,columnIndex:d});Array.isArray(b)?(p=b[0],f=b[1]):typeof b==\"object\"&&(p=b.rowspan,f=b.colspan)}return{rowspan:p,colspan:f}},getColspanRealWidth:(a,u,h)=>{if(u<1)return a[h].realWidth;const d=a.map(({realWidth:p,width:f})=>p||f).slice(h,h+u);return Number(d.reduce((p,f)=>Number(p)+Number(f),-1))}}}function Ao(e){const t=me(ge),l=ie(\"table\"),{handleDoubleClick:n,handleClick:s,handleContextMenu:i,handleMouseEnter:c,handleMouseLeave:r,handleCellMouseEnter:o,handleCellMouseLeave:a,tooltipContent:u,tooltipTrigger:h}=Fo(e),{getRowStyle:d,getRowClass:p,getCellStyle:f,getCellClass:g,getSpan:b,getColspanRealWidth:E}=No(e),y=$(()=>e.store.states.columns.value.findIndex(({type:k})=>k===\"default\")),v=(k,N)=>{const A=t.props.rowKey;return A?Z(k,A):N},m=(k,N,A,D=!1)=>{const{tooltipEffect:G,store:O}=e,{indent:Y,columns:V}=O.states,J=p(k,N);let ne=!0;return A&&(J.push(l.em(\"row\",`level-${A.level}`)),ne=A.display),T(\"tr\",{style:[ne?null:{display:\"none\"},d(k,N)],class:J,key:v(k,N),onDblclick:R=>n(R,k),onClick:R=>s(R,k),onContextmenu:R=>i(R,k),onMouseenter:()=>c(N),onMouseleave:r},V.value.map((R,w)=>{const{rowspan:W,colspan:K}=b(k,R,N,w);if(!W||!K)return null;const U=ae({},R);U.realWidth=E(V.value,K,w);const Q={store:e.store,_self:e.context||t,column:U,row:k,$index:N,cellIndex:w,expanded:D};w===y.value&&A&&(Q.treeNode={indent:A.level*Y.value,level:A.level},typeof A.expanded==\"boolean\"&&(Q.treeNode.expanded=A.expanded,\"loading\"in A&&(Q.treeNode.loading=A.loading),\"noLazyChildren\"in A&&(Q.treeNode.noLazyChildren=A.noLazyChildren)));const ue=`${N},${w}`,se=U.columnKey||U.rawColumnKey||\"\",de=S(w,R,Q);return T(\"td\",{style:f(N,w,k,R),class:g(N,w,k,R),key:`${se}${ue}`,rowspan:W,colspan:K,onMouseenter:ve=>o(ve,k,G),onMouseleave:a},[de])}))},S=(k,N,A)=>N.renderCell(A);return{wrappedRowRender:(k,N)=>{const A=e.store,{isRowExpanded:D,assertRowKey:G}=A,{treeData:O,lazyTreeNodeMap:Y,childrenColumnName:V,rowKey:J}=A.states,ne=A.states.columns.value;if(ne.some(({type:R})=>R===\"expand\")){const R=D(k),w=m(k,N,void 0,R),W=t.renderExpanded;return R?W?[[w,T(\"tr\",{key:`expanded-row__${w.key}`},[T(\"td\",{colspan:ne.length,class:`${l.e(\"cell\")} ${l.e(\"expanded-cell\")}`},[W({row:k,$index:N,store:A,expanded:R})])])]]:(console.error(\"[Element Error]renderExpanded is required.\"),w):[[w]]}else if(Object.keys(O.value).length){G();const R=Z(k,J.value);let w=O.value[R],W=null;w&&(W={expanded:w.expanded,level:w.level,display:!0},typeof w.lazy==\"boolean\"&&(typeof w.loaded==\"boolean\"&&w.loaded&&(W.noLazyChildren=!(w.children&&w.children.length)),W.loading=w.loading));const K=[m(k,N,W)];if(w){let U=0;const Q=(se,de)=>{!(se&&se.length&&de)||se.forEach(ve=>{const ee={display:de.display&&de.expanded,level:de.level+1,expanded:!1,noLazyChildren:!1,loading:!1},$e=Z(ve,J.value);if($e==null)throw new Error(\"For nested data item, row-key is required.\");if(w=ae({},O.value[$e]),w&&(ee.expanded=w.expanded,w.level=w.level||ee.level,w.display=!!(w.expanded&&ee.display),typeof w.lazy==\"boolean\"&&(typeof w.loaded==\"boolean\"&&w.loaded&&(ee.noLazyChildren=!(w.children&&w.children.length)),ee.loading=w.loading)),U++,K.push(m(ve,N+U,ee)),w){const ot=Y.value[$e]||ve[V.value];Q(ot,w)}})};w.display=!0;const ue=Y.value[R]||k[V.value];Q(ue,w)}return K}else return m(k,N,void 0)},tooltipContent:u,tooltipTrigger:h}}const Ho={store:{required:!0,type:Object},stripe:Boolean,tooltipEffect:String,context:{default:()=>({}),type:Object},rowClassName:[String,Function],rowStyle:[Object,Function],fixed:{type:String,default:\"\"},highlight:Boolean};var $o=pe({name:\"ElTableBody\",props:Ho,setup(e){const t=le(),l=me(ge),n=ie(\"table\"),{wrappedRowRender:s,tooltipContent:i,tooltipTrigger:c}=Ao(e),{onColumnsChange:r,onScrollableChange:o}=Fl(l);return ce(e.store.states.hoverRow,(a,u)=>{if(!e.store.states.isComplex.value||!Te)return;let h=window.requestAnimationFrame;h||(h=d=>window.setTimeout(d,16)),h(()=>{var d;const p=(d=t==null?void 0:t.vnode.el)==null?void 0:d.querySelectorAll(`.${n.e(\"row\")}`),f=p[u],g=p[a];f&&ut(f,\"hover-row\"),g&&rl(g,\"hover-row\")})}),St(()=>{var a;(a=Ce)==null||a()}),{ns:n,onColumnsChange:r,onScrollableChange:o,wrappedRowRender:s,tooltipContent:i,tooltipTrigger:c}},render(){const{wrappedRowRender:e,store:t}=this,l=t.states.data.value||[];return T(\"tbody\",{},[l.reduce((n,s)=>n.concat(e(s,n.length)),[])])}});function Rt(e){const t=e.tableLayout===\"auto\";let l=e.columns||[];t&&l.every(s=>s.width===void 0)&&(l=[]);const n=s=>{const i={key:`${e.tableLayout}_${s.id}`,style:{},name:void 0};return t?i.style={width:`${s.width}px`}:i.name=s.id,i};return T(\"colgroup\",{},l.map(s=>T(\"col\",n(s))))}Rt.props=[\"columns\",\"tableLayout\"];function Wo(){const e=me(ge),t=e==null?void 0:e.store,l=$(()=>t.states.fixedLeafColumnsLength.value),n=$(()=>t.states.rightFixedColumns.value.length),s=$(()=>t.states.columns.value.length),i=$(()=>t.states.fixedColumns.value.length),c=$(()=>t.states.rightFixedColumns.value.length);return{leftFixedLeafCount:l,rightFixedLeafCount:n,columnsCount:s,leftFixedCount:i,rightFixedCount:c,columns:t.states.columns}}function Mo(e){const{columns:t}=Wo(),l=ie(\"table\");return{getCellClasses:(i,c)=>{const r=i[c],o=[l.e(\"cell\"),r.id,r.align,r.labelClassName,...Et(l.b(),c,r.fixed,e.store)];return r.className&&o.push(r.className),r.children||o.push(l.is(\"leaf\")),o},getCellStyles:(i,c)=>{const r=kt(c,i.fixed,e.store);return ze(r,\"left\"),ze(r,\"right\"),r},columns:t}}var To=pe({name:\"ElTableFooter\",props:{fixed:{type:String,default:\"\"},store:{required:!0,type:Object},summaryMethod:Function,sumText:String,border:Boolean,defaultSort:{type:Object,default:()=>({prop:\"\",order:\"\"})}},setup(e){const{getCellClasses:t,getCellStyles:l,columns:n}=Mo(e);return{ns:ie(\"table\"),getCellClasses:t,getCellStyles:l,columns:n}},render(){const{columns:e,getCellStyles:t,getCellClasses:l,summaryMethod:n,sumText:s,ns:i}=this,c=this.store.states.data.value;let r=[];return n?r=n({columns:e,data:c}):e.forEach((o,a)=>{if(a===0){r[a]=s;return}const u=c.map(f=>Number(f[o.property])),h=[];let d=!0;u.forEach(f=>{if(!Number.isNaN(+f)){d=!1;const g=`${f}`.split(\".\")[1];h.push(g?g.length:0)}});const p=Math.max.apply(null,h);d?r[a]=\"\":r[a]=u.reduce((f,g)=>{const b=Number(g);return Number.isNaN(+b)?f:Number.parseFloat((f+g).toFixed(Math.min(p,20)))},0)}),T(\"table\",{class:i.e(\"footer\"),cellspacing:\"0\",cellpadding:\"0\",border:\"0\"},[Rt({columns:e}),T(\"tbody\",[T(\"tr\",{},[...e.map((o,a)=>T(\"td\",{key:a,colspan:o.colSpan,rowspan:o.rowSpan,class:l(e,a),style:t(o,a)},[T(\"div\",{class:[\"cell\",o.labelClassName]},[r[a]])]))])])])}});function Oo(e){return{setCurrentRow:u=>{e.commit(\"setCurrentRow\",u)},getSelectionRows:()=>e.getSelectionRows(),toggleRowSelection:(u,h)=>{e.toggleRowSelection(u,h,!1),e.updateAllSelected()},clearSelection:()=>{e.clearSelection()},clearFilter:u=>{e.clearFilter(u)},toggleAllSelection:()=>{e.commit(\"toggleAllSelection\")},toggleRowExpansion:(u,h)=>{e.toggleRowExpansionAdapter(u,h)},clearSort:()=>{e.clearSort()},sort:(u,h)=>{e.commit(\"sort\",{prop:u,order:h})}}}function Bo(e,t,l,n){const s=x(!1),i=x(null),c=x(!1),r=R=>{c.value=R},o=x({width:null,height:null,headerHeight:null}),a=x(!1),u={display:\"inline-block\",verticalAlign:\"middle\"},h=x(),d=x(0),p=x(0),f=x(0),g=x(0);Ie(()=>{t.setHeight(e.height)}),Ie(()=>{t.setMaxHeight(e.maxHeight)}),ce(()=>[e.currentRowKey,l.states.rowKey],([R,w])=>{!C(w)||l.setCurrentRowKey(`${R}`)},{immediate:!0}),ce(()=>e.data,R=>{n.store.commit(\"setData\",R)},{immediate:!0,deep:!0}),Ie(()=>{e.expandRowKeys&&l.setExpandRowKeysAdapter(e.expandRowKeys)});const b=()=>{n.store.commit(\"setHoverRow\",null),n.hoverState&&(n.hoverState=null)},E=(R,w)=>{const{pixelX:W,pixelY:K}=w;Math.abs(W)>=Math.abs(K)&&(n.refs.bodyWrapper.scrollLeft+=w.pixelX/5)},y=$(()=>e.height||e.maxHeight||l.states.fixedColumns.value.length>0||l.states.rightFixedColumns.value.length>0),v=$(()=>({width:t.bodyWidth.value?`${t.bodyWidth.value}px`:\"\"})),m=()=>{y.value&&t.updateElsHeight(),t.updateColumnsWidth(),requestAnimationFrame(N)};nt(()=>xe(this,null,function*(){yield Ae(),l.updateColumns(),A(),requestAnimationFrame(m);const R=n.vnode.el,w=n.refs.headerWrapper;e.flexible&&R&&R.parentElement&&(R.parentElement.style.minWidth=\"0\"),o.value={width:h.value=R.offsetWidth,height:R.offsetHeight,headerHeight:e.showHeader&&w?w.offsetHeight:null},l.states.columns.value.forEach(W=>{W.filteredValue&&W.filteredValue.length&&n.store.commit(\"filterChange\",{column:W,values:W.filteredValue,silent:!0})}),n.$ready=!0}));const S=(R,w)=>{if(!R)return;const W=Array.from(R.classList).filter(K=>!K.startsWith(\"is-scrolling-\"));W.push(t.scrollX.value?w:\"is-scrolling-none\"),R.className=W.join(\" \")},L=R=>{const{tableWrapper:w}=n.refs;S(w,R)},k=R=>{const{tableWrapper:w}=n.refs;return!!(w&&w.classList.contains(R))},N=function(){if(!n.refs.scrollBarRef)return;if(!t.scrollX.value){const se=\"is-scrolling-none\";k(se)||L(se);return}const R=n.refs.scrollBarRef.wrap$;if(!R)return;const{scrollLeft:w,offsetWidth:W,scrollWidth:K}=R,{headerWrapper:U,footerWrapper:Q}=n.refs;U&&(U.scrollLeft=w),Q&&(Q.scrollLeft=w);const ue=K-W-1;w>=ue?L(\"is-scrolling-right\"):L(w===0?\"is-scrolling-left\":\"is-scrolling-middle\")},A=()=>{!n.refs.scrollBarRef||(n.refs.scrollBarRef.wrap$&&Tt(n.refs.scrollBarRef.wrap$,\"scroll\",N,{passive:!0}),e.fit?Ot(n.vnode.el,D):Tt(window,\"resize\",D),Ot(n.refs.bodyWrapper,()=>{var R,w;D(),(w=(R=n.refs)==null?void 0:R.scrollBarRef)==null||w.update()}))},D=()=>{var R,w,W;const K=n.vnode.el;if(!n.$ready||!K)return;let U=!1;const{width:Q,height:ue,headerHeight:se}=o.value,de=h.value=K.offsetWidth;Q!==de&&(U=!0);const ve=K.offsetHeight;(e.height||y.value)&&ue!==ve&&(U=!0);const ee=e.tableLayout===\"fixed\"?n.refs.headerWrapper:(R=n.refs.tableHeaderRef)==null?void 0:R.$el;e.showHeader&&(ee==null?void 0:ee.offsetHeight)!==se&&(U=!0),d.value=((w=n.refs.tableWrapper)==null?void 0:w.scrollHeight)||0,f.value=(ee==null?void 0:ee.scrollHeight)||0,g.value=((W=n.refs.footerWrapper)==null?void 0:W.offsetHeight)||0,p.value=d.value-f.value-g.value,U&&(o.value={width:de,height:ve,headerHeight:e.showHeader&&(ee==null?void 0:ee.offsetHeight)||0},m())},G=Je(),O=$(()=>{const{bodyWidth:R,scrollY:w,gutterWidth:W}=t;return R.value?`${R.value-(w.value?W:0)}px`:\"\"}),Y=$(()=>e.maxHeight?\"fixed\":e.tableLayout),V=$(()=>{if(e.data&&e.data.length)return null;let R=\"100%\";e.height&&p.value&&(R=`${p.value}px`);const w=h.value;return{width:w?`${w}px`:\"\",height:R}}),J=$(()=>e.height?{height:Number.isNaN(Number(e.height))?e.height:`${e.height}px`}:e.maxHeight?{maxHeight:Number.isNaN(Number(e.maxHeight))?e.maxHeight:`${e.maxHeight}px`}:{}),ne=$(()=>{if(e.height)return{height:\"100%\"};if(e.maxHeight){if(Number.isNaN(Number(e.maxHeight)))return{maxHeight:`calc(${e.maxHeight} - ${f.value+g.value}px)`};{const R=e.maxHeight;if(d.value>=Number(R))return{maxHeight:`${d.value-f.value-g.value}px`}}}return{}});return{isHidden:s,renderExpanded:i,setDragVisible:r,isGroup:a,handleMouseLeave:b,handleHeaderFooterMousewheel:E,tableSize:G,emptyBlockStyle:V,handleFixedMousewheel:(R,w)=>{const W=n.refs.bodyWrapper;if(Math.abs(w.spinY)>0){const K=W.scrollTop;w.pixelY<0&&K!==0&&R.preventDefault(),w.pixelY>0&&W.scrollHeight-W.clientHeight>K&&R.preventDefault(),W.scrollTop+=Math.ceil(w.pixelY/5)}else W.scrollLeft+=Math.ceil(w.pixelX/5)},resizeProxyVisible:c,bodyWidth:O,resizeState:o,doLayout:m,tableBodyStyles:v,tableLayout:Y,scrollbarViewStyle:u,tableInnerStyle:J,scrollbarStyle:ne}}var Po={data:{type:Array,default:()=>[]},size:String,width:[String,Number],height:[String,Number],maxHeight:[String,Number],fit:{type:Boolean,default:!0},stripe:Boolean,border:Boolean,rowKey:[String,Function],showHeader:{type:Boolean,default:!0},showSummary:Boolean,sumText:String,summaryMethod:Function,rowClassName:[String,Function],rowStyle:[Object,Function],cellClassName:[String,Function],cellStyle:[Object,Function],headerRowClassName:[String,Function],headerRowStyle:[Object,Function],headerCellClassName:[String,Function],headerCellStyle:[Object,Function],highlightCurrentRow:Boolean,currentRowKey:[String,Number],emptyText:String,expandRowKeys:Array,defaultExpandAll:Boolean,defaultSort:Object,tooltipEffect:String,spanMethod:Function,selectOnIndeterminate:{type:Boolean,default:!0},indent:{type:Number,default:16},treeProps:{type:Object,default:()=>({hasChildren:\"hasChildren\",children:\"children\"})},lazy:Boolean,load:Function,style:{type:Object,default:()=>({})},className:{type:String,default:\"\"},tableLayout:{type:String,default:\"fixed\"},scrollbarAlwaysOn:{type:Boolean,default:!1},flexible:Boolean};const zo=()=>{const e=x(),t=(i,c)=>{const r=e.value;r&&r.scrollTo(i,c)},l=(i,c)=>{const r=e.value;r&&it(c)&&[\"Top\",\"Left\"].includes(i)&&r[`setScroll${i}`](c)};return{scrollBarRef:e,scrollTo:t,setScrollTop:i=>l(\"Top\",i),setScrollLeft:i=>l(\"Left\",i)}};let Do=1;const Io=pe({name:\"ElTable\",directives:{Mousewheel:Nn},components:{TableHeader:Lo,TableBody:$o,TableFooter:To,ElScrollbar:Ct,hColgroup:Rt},props:Po,emits:[\"select\",\"select-all\",\"selection-change\",\"cell-mouse-enter\",\"cell-mouse-leave\",\"cell-contextmenu\",\"cell-click\",\"cell-dblclick\",\"row-click\",\"row-contextmenu\",\"row-dblclick\",\"header-click\",\"header-contextmenu\",\"sort-change\",\"filter-change\",\"current-change\",\"header-dragend\",\"expand-change\"],setup(e){const{t}=ol(),l=ie(\"table\"),n=le();tl(ge,n);const s=ho(n,e);n.store=s;const i=new po({store:n.store,table:n,fit:e.fit,showHeader:e.showHeader});n.layout=i;const c=$(()=>(s.states.data.value||[]).length===0),{setCurrentRow:r,getSelectionRows:o,toggleRowSelection:a,clearSelection:u,clearFilter:h,toggleAllSelection:d,toggleRowExpansion:p,clearSort:f,sort:g}=Oo(s),{isHidden:b,renderExpanded:E,setDragVisible:y,isGroup:v,handleMouseLeave:m,handleHeaderFooterMousewheel:S,tableSize:L,emptyBlockStyle:k,handleFixedMousewheel:N,resizeProxyVisible:A,bodyWidth:D,resizeState:G,doLayout:O,tableBodyStyles:Y,tableLayout:V,scrollbarViewStyle:J,tableInnerStyle:ne,scrollbarStyle:He}=Bo(e,i,s,n),{scrollBarRef:R,scrollTo:w,setScrollLeft:W,setScrollTop:K}=zo(),U=tt(O,50),Q=`${l.namespace.value}-table_${Do++}`;n.tableId=Q,n.state={isGroup:v,resizeState:G,doLayout:O,debouncedUpdateLayout:U};const ue=$(()=>e.sumText||t(\"el.table.sumText\")),se=$(()=>e.emptyText||t(\"el.table.emptyText\"));return{ns:l,layout:i,store:s,handleHeaderFooterMousewheel:S,handleMouseLeave:m,tableId:Q,tableSize:L,isHidden:b,isEmpty:c,renderExpanded:E,resizeProxyVisible:A,resizeState:G,isGroup:v,bodyWidth:D,tableBodyStyles:Y,emptyBlockStyle:k,debouncedUpdateLayout:U,handleFixedMousewheel:N,setCurrentRow:r,getSelectionRows:o,toggleRowSelection:a,clearSelection:u,clearFilter:h,toggleAllSelection:d,toggleRowExpansion:p,clearSort:f,doLayout:O,sort:g,t,setDragVisible:y,context:n,computedSumText:ue,computedEmptyText:se,tableLayout:V,scrollbarViewStyle:J,tableInnerStyle:ne,scrollbarStyle:He,scrollBarRef:R,scrollTo:w,setScrollLeft:W,setScrollTop:K}}}),Vo=[\"data-prefix\"],Ko={ref:\"hiddenColumns\",class:\"hidden-columns\"};function _o(e,t,l,n,s,i){const c=he(\"hColgroup\"),r=he(\"table-header\"),o=he(\"table-body\"),a=he(\"el-scrollbar\"),u=he(\"table-footer\"),h=sl(\"mousewheel\");return z(),j(\"div\",{ref:\"tableWrapper\",class:P([{[e.ns.m(\"fit\")]:e.fit,[e.ns.m(\"striped\")]:e.stripe,[e.ns.m(\"border\")]:e.border||e.isGroup,[e.ns.m(\"hidden\")]:e.isHidden,[e.ns.m(\"group\")]:e.isGroup,[e.ns.m(\"fluid-height\")]:e.maxHeight,[e.ns.m(\"scrollable-x\")]:e.layout.scrollX.value,[e.ns.m(\"scrollable-y\")]:e.layout.scrollY.value,[e.ns.m(\"enable-row-hover\")]:!e.store.states.isComplex.value,[e.ns.m(\"enable-row-transition\")]:(e.store.states.data.value||[]).length!==0&&(e.store.states.data.value||[]).length<100,\"has-footer\":e.showSummary},e.ns.m(e.tableSize),e.className,e.ns.b(),e.ns.m(`layout-${e.tableLayout}`)]),style:Le(e.style),\"data-prefix\":e.ns.namespace.value,onMouseleave:t[0]||(t[0]=d=>e.handleMouseLeave())},[_(\"div\",{class:P(e.ns.e(\"inner-wrapper\")),style:Le(e.tableInnerStyle)},[_(\"div\",Ko,[Me(e.$slots,\"default\")],512),e.showHeader&&e.tableLayout===\"fixed\"?ke((z(),j(\"div\",{key:0,ref:\"headerWrapper\",class:P(e.ns.e(\"header-wrapper\"))},[_(\"table\",{ref:\"tableHeader\",class:P(e.ns.e(\"header\")),style:Le(e.tableBodyStyles),border:\"0\",cellpadding:\"0\",cellspacing:\"0\"},[X(c,{columns:e.store.states.columns.value,\"table-layout\":e.tableLayout},null,8,[\"columns\",\"table-layout\"]),X(r,{ref:\"tableHeaderRef\",border:e.border,\"default-sort\":e.defaultSort,store:e.store,onSetDragVisible:e.setDragVisible},null,8,[\"border\",\"default-sort\",\"store\",\"onSetDragVisible\"])],6)],2)),[[h,e.handleHeaderFooterMousewheel]]):we(\"v-if\",!0),_(\"div\",{ref:\"bodyWrapper\",class:P(e.ns.e(\"body-wrapper\"))},[X(a,{ref:\"scrollBarRef\",\"view-style\":e.scrollbarViewStyle,\"wrap-style\":e.scrollbarStyle,always:e.scrollbarAlwaysOn},{default:q(()=>[_(\"table\",{ref:\"tableBody\",class:P(e.ns.e(\"body\")),cellspacing:\"0\",cellpadding:\"0\",border:\"0\",style:Le({width:e.bodyWidth,tableLayout:e.tableLayout})},[X(c,{columns:e.store.states.columns.value,\"table-layout\":e.tableLayout},null,8,[\"columns\",\"table-layout\"]),e.showHeader&&e.tableLayout===\"auto\"?(z(),Se(r,{key:0,ref:\"tableHeaderRef\",border:e.border,\"default-sort\":e.defaultSort,store:e.store,onSetDragVisible:e.setDragVisible},null,8,[\"border\",\"default-sort\",\"store\",\"onSetDragVisible\"])):we(\"v-if\",!0),X(o,{context:e.context,highlight:e.highlightCurrentRow,\"row-class-name\":e.rowClassName,\"tooltip-effect\":e.tooltipEffect,\"row-style\":e.rowStyle,store:e.store,stripe:e.stripe},null,8,[\"context\",\"highlight\",\"row-class-name\",\"tooltip-effect\",\"row-style\",\"store\",\"stripe\"])],6),e.isEmpty?(z(),j(\"div\",{key:0,ref:\"emptyBlock\",style:Le(e.emptyBlockStyle),class:P(e.ns.e(\"empty-block\"))},[_(\"span\",{class:P(e.ns.e(\"empty-text\"))},[Me(e.$slots,\"empty\",{},()=>[Be(oe(e.computedEmptyText),1)])],2)],6)):we(\"v-if\",!0),e.$slots.append?(z(),j(\"div\",{key:1,ref:\"appendWrapper\",class:P(e.ns.e(\"append-wrapper\"))},[Me(e.$slots,\"append\")],2)):we(\"v-if\",!0)]),_:3},8,[\"view-style\",\"wrap-style\",\"always\"])],2),e.showSummary?ke((z(),j(\"div\",{key:1,ref:\"footerWrapper\",class:P(e.ns.e(\"footer-wrapper\"))},[X(u,{border:e.border,\"default-sort\":e.defaultSort,store:e.store,style:Le(e.tableBodyStyles),\"sum-text\":e.computedSumText,\"summary-method\":e.summaryMethod},null,8,[\"border\",\"default-sort\",\"store\",\"style\",\"sum-text\",\"summary-method\"])],2)),[[Bt,!e.isEmpty],[h,e.handleHeaderFooterMousewheel]]):we(\"v-if\",!0),e.border||e.isGroup?(z(),j(\"div\",{key:2,class:P(e.ns.e(\"border-left-patch\"))},null,2)):we(\"v-if\",!0)],6),ke(_(\"div\",{ref:\"resizeProxy\",class:P(e.ns.e(\"column-resize-proxy\"))},null,2),[[Bt,e.resizeProxyVisible]])],46,Vo)}var jo=je(Io,[[\"render\",_o],[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/table/src/table.vue\"]]);const Go={selection:\"table-column--selection\",expand:\"table__expand-column\"},Yo={default:{order:\"\"},selection:{width:48,minWidth:48,realWidth:48,order:\"\"},expand:{width:48,minWidth:48,realWidth:48,order:\"\"},index:{width:48,minWidth:48,realWidth:48,order:\"\"}},Uo=e=>Go[e]||\"\",qo={selection:{renderHeader({store:e}){function t(){return e.states.data.value&&e.states.data.value.length===0}return T(Pe,{disabled:t(),size:e.states.tableSize.value,indeterminate:e.states.selection.value.length>0&&!e.states.isAllSelected.value,\"onUpdate:modelValue\":e.toggleAllSelection,modelValue:e.states.isAllSelected.value})},renderCell({row:e,column:t,store:l,$index:n}){return T(Pe,{disabled:t.selectable?!t.selectable.call(null,e,n):!1,size:l.states.tableSize.value,onChange:()=>{l.commit(\"rowSelectedChanged\",e)},onClick:s=>s.stopPropagation(),modelValue:l.isSelected(e)})},sortable:!1,resizable:!1},index:{renderHeader({column:e}){return e.label||\"#\"},renderCell({column:e,$index:t}){let l=t+1;const n=e.index;return typeof n==\"number\"?l=t+n:typeof n==\"function\"&&(l=n(t)),T(\"div\",{},[l])},sortable:!1},expand:{renderHeader({column:e}){return e.label||\"\"},renderCell({row:e,store:t,expanded:l}){const{ns:n}=t,s=[n.e(\"expand-icon\")];return l&&s.push(n.em(\"expand-icon\",\"expanded\")),T(\"div\",{class:s,onClick:function(c){c.stopPropagation(),t.toggleRowExpansion(e)}},{default:()=>[T(wt,null,{default:()=>[T(il)]})]})},sortable:!1,resizable:!1}};function Xo({row:e,column:t,$index:l}){var n;const s=t.property,i=s&&cn(e,s).value;return t&&t.formatter?t.formatter(e,t,i,l):((n=i==null?void 0:i.toString)==null?void 0:n.call(i))||\"\"}function Qo({row:e,treeNode:t,store:l},n=!1){const{ns:s}=l;if(!t)return n?[T(\"span\",{class:s.e(\"placeholder\")})]:null;const i=[],c=function(r){r.stopPropagation(),!t.loading&&l.loadOrToggle(e)};if(t.indent&&i.push(T(\"span\",{class:s.e(\"indent\"),style:{\"padding-left\":`${t.indent}px`}})),typeof t.expanded==\"boolean\"&&!t.noLazyChildren){const r=[s.e(\"expand-icon\"),t.expanded?s.em(\"expand-icon\",\"expanded\"):\"\"];let o=il;t.loading&&(o=dn),i.push(T(\"div\",{class:r,onClick:c},{default:()=>[T(wt,{class:{[s.is(\"loading\")]:t.loading}},{default:()=>[T(o)]})]}))}else i.push(T(\"span\",{class:s.e(\"placeholder\")}));return i}function qt(e,t){return e.reduce((l,n)=>(l[n]=n,l),t)}function Zo(e,t){const l=le();return{registerComplexWatchers:()=>{const i=[\"fixed\"],c={realWidth:\"width\",realMinWidth:\"minWidth\"},r=qt(i,c);Object.keys(r).forEach(o=>{const a=c[o];_e(t,a)&&ce(()=>t[a],u=>{let h=u;a===\"width\"&&o===\"realWidth\"&&(h=xt(u)),a===\"minWidth\"&&o===\"realMinWidth\"&&(h=xl(u)),l.columnConfig.value[a]=h,l.columnConfig.value[o]=h;const d=a===\"fixed\";e.value.store.scheduleLayout(d)})})},registerNormalWatchers:()=>{const i=[\"label\",\"filters\",\"filterMultiple\",\"sortable\",\"index\",\"formatter\",\"className\",\"labelClassName\",\"showOverflowTooltip\"],c={property:\"prop\",align:\"realAlign\",headerAlign:\"realHeaderAlign\"},r=qt(i,c);Object.keys(r).forEach(o=>{const a=c[o];_e(t,a)&&ce(()=>t[a],u=>{l.columnConfig.value[o]=u})})}}}function Jo(e,t,l){const n=le(),s=x(\"\"),i=x(!1),c=x(),r=x(),o=ie(\"table\");Ie(()=>{c.value=e.align?`is-${e.align}`:null,c.value}),Ie(()=>{r.value=e.headerAlign?`is-${e.headerAlign}`:c.value,r.value});const a=$(()=>{let v=n.vnode.vParent||n.parent;for(;v&&!v.tableId&&!v.columnId;)v=v.vnode.vParent||v.parent;return v}),u=$(()=>{const{store:v}=n.parent;if(!v)return!1;const{treeData:m}=v.states,S=m.value;return S&&Object.keys(S).length>0}),h=x(xt(e.width)),d=x(xl(e.minWidth)),p=v=>(h.value&&(v.width=h.value),d.value&&(v.minWidth=d.value),!h.value&&d.value&&(v.width=void 0),v.minWidth||(v.minWidth=80),v.realWidth=Number(v.width===void 0?v.minWidth:v.width),v),f=v=>{const m=v.type,S=qo[m]||{};Object.keys(S).forEach(k=>{const N=S[k];k!==\"className\"&&N!==void 0&&(v[k]=N)});const L=Uo(m);if(L){const k=`${C(o.namespace)}-${L}`;v.className=v.className?`${v.className} ${k}`:k}return v},g=v=>{Array.isArray(v)?v.forEach(S=>m(S)):m(v);function m(S){var L;((L=S==null?void 0:S.type)==null?void 0:L.name)===\"ElTableColumn\"&&(S.vParent=n)}};return{columnId:s,realAlign:c,isSubColumn:i,realHeaderAlign:r,columnOrTableParent:a,setColumnWidth:p,setColumnForcedProps:f,setColumnRenders:v=>{e.renderHeader||v.type!==\"selection\"&&(v.renderHeader=S=>{n.columnConfig.value.label;const L=t.header;return L?L(S):v.label});let m=v.renderCell;return v.type===\"expand\"?(v.renderCell=S=>T(\"div\",{class:\"cell\"},[m(S)]),l.value.renderExpanded=S=>t.default?t.default(S):t.default):(m=m||Xo,v.renderCell=S=>{let L=null;if(t.default){const D=t.default(S);L=D.some(G=>G.type!==fn)?D:m(S)}else L=m(S);const k=u.value&&S.cellIndex===0&&S.column.type!==\"selection\",N=Qo(S,k),A={class:\"cell\",style:{}};return v.showOverflowTooltip&&(A.class=`${A.class} ${C(o.namespace)}-tooltip`,A.style={width:`${(S.column.realWidth||Number(S.column.width))-1}px`}),g(L),T(\"div\",A,[N,L])}),v},getPropsData:(...v)=>v.reduce((m,S)=>(Array.isArray(S)&&S.forEach(L=>{m[L]=e[L]}),m),{}),getColumnElIndex:(v,m)=>Array.prototype.indexOf.call(v,m)}}var es={type:{type:String,default:\"default\"},label:String,className:String,labelClassName:String,property:String,prop:String,width:{type:[String,Number],default:\"\"},minWidth:{type:[String,Number],default:\"\"},renderHeader:Function,sortable:{type:[Boolean,String],default:!1},sortMethod:Function,sortBy:[String,Function,Array],resizable:{type:Boolean,default:!0},columnKey:String,align:String,headerAlign:String,showTooltipWhenOverflow:Boolean,showOverflowTooltip:Boolean,fixed:[Boolean,String],formatter:Function,selectable:Function,reserveSelection:Boolean,filterMethod:Function,filteredValue:Array,filters:Array,filterPlacement:String,filterMultiple:{type:Boolean,default:!0},index:[Number,Function],sortOrders:{type:Array,default:()=>[\"ascending\",\"descending\",null],validator:e=>e.every(t=>[\"ascending\",\"descending\",null].includes(t))}};let ts=1;var Al=pe({name:\"ElTableColumn\",components:{ElCheckbox:Pe},props:es,setup(e,{slots:t}){const l=le(),n=x({}),s=$(()=>{let y=l.parent;for(;y&&!y.tableId;)y=y.parent;return y}),{registerNormalWatchers:i,registerComplexWatchers:c}=Zo(s,e),{columnId:r,isSubColumn:o,realHeaderAlign:a,columnOrTableParent:u,setColumnWidth:h,setColumnForcedProps:d,setColumnRenders:p,getPropsData:f,getColumnElIndex:g,realAlign:b}=Jo(e,t,s),E=u.value;r.value=`${E.tableId||E.columnId}_column_${ts++}`,al(()=>{o.value=s.value!==E;const y=e.type||\"default\",v=e.sortable===\"\"?!0:e.sortable,m=Re(ae({},Yo[y]),{id:r.value,type:y,property:e.prop||e.property,align:b,headerAlign:a,showOverflowTooltip:e.showOverflowTooltip||e.showTooltipWhenOverflow,filterable:e.filters||e.filterMethod,filteredValue:[],filterPlacement:\"\",isColumnGroup:!1,isSubColumn:!1,filterOpened:!1,sortable:v,index:e.index,rawColumnKey:l.vnode.key});let A=f([\"columnKey\",\"label\",\"className\",\"labelClassName\",\"type\",\"renderHeader\",\"formatter\",\"fixed\",\"resizable\"],[\"sortMethod\",\"sortBy\",\"sortOrders\"],[\"selectable\",\"reserveSelection\"],[\"filterMethod\",\"filters\",\"filterMultiple\",\"filterOpened\",\"filteredValue\",\"filterPlacement\"]);A=to(m,A),A=no(p,h,d)(A),n.value=A,i(),c()}),nt(()=>{var y;const v=u.value,m=o.value?v.vnode.el.children:(y=v.refs.hiddenColumns)==null?void 0:y.children,S=()=>g(m||[],l.vnode.el);n.value.getColumnIndex=S,S()>-1&&s.value.store.commit(\"insertColumn\",n.value,o.value?v.columnConfig.value:null)}),hn(()=>{s.value.store.commit(\"removeColumn\",n.value,o.value?E.columnConfig.value:null)}),l.columnId=r.value,l.columnConfig=n},render(){var e,t,l;try{const n=(t=(e=this.$slots).default)==null?void 0:t.call(e,{row:{},column:{},$index:-1}),s=[];if(Array.isArray(n))for(const c of n)((l=c.type)==null?void 0:l.name)===\"ElTableColumn\"||c.shapeFlag&2?s.push(c):c.type===Oe&&Array.isArray(c.children)&&c.children.forEach(r=>{(r==null?void 0:r.patchFlag)!==1024&&!rt(r==null?void 0:r.children)&&s.push(r)});return T(\"div\",s)}catch(n){return T(\"div\",[])}}});const ls=nl(jo,{TableColumn:Al}),ye=yt(Al),ns=[\"value\"],os=[\"onClick\"],ss=pe({__name:\"processing\",setup(e){return xe(this,null,function*(){let t,l;const n=u=>{switch(u){case 1:return\"\\u4E0B\\u8F7D\";case 2:return\"\\u4E0A\\u4F20\";case 3:return\"\\u8BBE\\u5907\\u4E92\\u4F20\"}return\"loading\"},s=vn.ComputeSize,i=x([]),c=()=>xe(this,null,function*(){try{const u=yield Pt.File.Task.All.GET();if(u.data){const{success:h,result:d}=u.data;d&&d.entries&&(i.value=d.entries||[])}}catch(u){}});[t,l]=pn(()=>c()),yield t,l();const r=u=>{wn.confirm(\"\\u662F\\u5426\\u53D6\\u6D88\\u8BE5\\u4EFB\\u52A1?\",\"\\u63D0\\u793A\",{confirmButtonText:\"\\u786E\\u8BA4\",cancelButtonText:\"\\u53D6\\u6D88\",type:\"warning\"}).then(()=>{o(u)}).catch(()=>{})},o=u=>xe(this,null,function*(){try{const h=yield Pt.File.Task.Cancel.POST({jobKey:u.key});if(h.data){const{success:d,error:p}=h.data;d===0&&(mn.Success(\"\\u53D6\\u6D88\\u6210\\u529F\"),yield c(),p&&zt.Warning(p))}}catch(h){zt.Error(`${h}`)}}),a=setInterval(()=>xe(this,null,function*(){yield c()}),3e3);return St(()=>{clearInterval(a)}),(u,h)=>(z(),Se(C(ls),{data:i.value,style:{width:\"100%\"},class:\"page-container\"},{default:q(()=>[X(C(ye),{label:\"\\u6587\\u4EF6\\u540D\\u79F0\",width:\"140\"},{default:q(({row:d})=>[_(\"span\",null,oe(d.fileName),1)]),_:1}),X(C(ye),{label:\"\\u6587\\u4EF6\\u8DEF\\u5F84\",width:\"180\"},{default:q(({row:d})=>[_(\"span\",null,oe(d.rootPath),1)]),_:1}),X(C(ye),{label:\"\\u5927\\u5C0F\",width:\"100\"},{default:q(({row:d})=>[_(\"span\",null,oe(C(s)(d.fileSize)),1)]),_:1}),X(C(ye),{label:\"\\u8FDB\\u5EA6\",width:\"200\"},{default:q(({row:d})=>[_(\"progress\",{value:d.progress||0,max:100},null,8,ns)]),_:1}),X(C(ye),{label:\"\\u901F\\u5EA6\",width:\"100\"},{default:q(({row:d})=>[_(\"span\",null,oe(C(s)(d.speed))+\"/S \",1)]),_:1}),X(C(ye),{label:\"\\u6570\\u91CF\",width:\"100\"},{default:q(({row:d})=>[_(\"span\",null,[d.isDir?(z(),j(Oe,{key:0},[Be(oe(d.dirTransfer||0)+\"/\"+oe(d.dirCount||0),1)],64)):(z(),j(Oe,{key:1},[Be(\" 1 \")],64))])]),_:1}),X(C(ye),{label:\"\\u72B6\\u6001\",width:\"100\"},{default:q(({row:d})=>[_(\"span\",null,oe(n(d.direction)),1)]),_:1}),X(C(ye)),X(C(ye),{width:\"80\"},{default:q(({row:d})=>[_(\"a\",{class:\"clear\",onClick:p=>r(d)},\"\\u53D6\\u6D88\",8,os)]),_:1})]),_:1},8,[\"data\"]))})}});const as=ul(ss,[[\"__scopeId\",\"data-v-01bdecfa\"]]),rs=pe({__name:\"index\",setup(e){const t=gn();bn();const l=t.query.type||\"processing\";x(l);const n=x(null);return(s,i)=>(z(),Se(C(Ct),{id:\"page\",ref_key:\"page\",ref:n},{default:q(()=>[X(as)]),_:1},512))}});const vs=ul(rs,[[\"__scopeId\",\"data-v-828b8c04\"]]);export{vs as default};\n"
  },
  {
    "path": "luci-app-linkease/htdocs/luci-static/linkeasefile/index.js",
    "content": "var Rp=Object.defineProperty,Ap=Object.defineProperties;var Lp=Object.getOwnPropertyDescriptors;var ro=Object.getOwnPropertySymbols;var Ha=Object.prototype.hasOwnProperty,ja=Object.prototype.propertyIsEnumerable;var oo=Math.pow,Da=(e,t,n)=>t in e?Rp(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ee=(e,t)=>{for(var n in t||(t={}))Ha.call(t,n)&&Da(e,n,t[n]);if(ro)for(var n of ro(t))ja.call(t,n)&&Da(e,n,t[n]);return e},Ue=(e,t)=>Ap(e,Lp(t));var za=(e,t)=>{var n={};for(var r in e)Ha.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&ro)for(var r of ro(e))t.indexOf(r)<0&&ja.call(e,r)&&(n[r]=e[r]);return n};var ft=(e,t,n)=>new Promise((r,o)=>{var s=l=>{try{a(n.next(l))}catch(u){o(u)}},i=l=>{try{a(n.throw(l))}catch(u){o(u)}},a=l=>l.done?r(l.value):Promise.resolve(l.value).then(s,i);a((n=n.apply(e,t)).next())});(function(){const t=document.createElement(\"link\").relList;if(t&&t.supports&&t.supports(\"modulepreload\"))return;for(const o of document.querySelectorAll('link[rel=\"modulepreload\"]'))r(o);new MutationObserver(o=>{for(const s of o)if(s.type===\"childList\")for(const i of s.addedNodes)i.tagName===\"LINK\"&&i.rel===\"modulepreload\"&&r(i)}).observe(document,{childList:!0,subtree:!0});function n(o){const s={};return o.integrity&&(s.integrity=o.integrity),o.referrerpolicy&&(s.referrerPolicy=o.referrerpolicy),o.crossorigin===\"use-credentials\"?s.credentials=\"include\":o.crossorigin===\"anonymous\"?s.credentials=\"omit\":s.credentials=\"same-origin\",s}function r(o){if(o.ep)return;o.ep=!0;const s=n(o);fetch(o.href,s)}})();function Ri(e,t){const n=Object.create(null),r=e.split(\",\");for(let o=0;o<r.length;o++)n[r[o]]=!0;return t?o=>!!n[o.toLowerCase()]:o=>!!n[o]}const Up=\"itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly\",Mp=Ri(Up);function Sc(e){return!!e||e===\"\"}function Ne(e){if(X(e)){const t={};for(let n=0;n<e.length;n++){const r=e[n],o=be(r)?Fp(r):Ne(r);if(o)for(const s in o)t[s]=o[s]}return t}else{if(be(e))return e;if(ve(e))return e}}const Ip=/;(?![^(]*\\))/g,Bp=/:(.+)/;function Fp(e){const t={};return e.split(Ip).forEach(n=>{if(n){const r=n.split(Bp);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function J(e){let t=\"\";if(be(e))t=e;else if(X(e))for(let n=0;n<e.length;n++){const r=J(e[n]);r&&(t+=r+\" \")}else if(ve(e))for(const n in e)e[n]&&(t+=n+\" \");return t.trim()}function Ww(e){if(!e)return null;let{class:t,style:n}=e;return t&&!be(t)&&(e.class=J(t)),n&&(e.style=Ne(n)),e}function Np(e,t){if(e.length!==t.length)return!1;let n=!0;for(let r=0;n&&r<e.length;r++)n=Yr(e[r],t[r]);return n}function Yr(e,t){if(e===t)return!0;let n=qa(e),r=qa(t);if(n||r)return n&&r?e.getTime()===t.getTime():!1;if(n=Ar(e),r=Ar(t),n||r)return e===t;if(n=X(e),r=X(t),n||r)return n&&r?Np(e,t):!1;if(n=ve(e),r=ve(t),n||r){if(!n||!r)return!1;const o=Object.keys(e).length,s=Object.keys(t).length;if(o!==s)return!1;for(const i in e){const a=e.hasOwnProperty(i),l=t.hasOwnProperty(i);if(a&&!l||!a&&l||!Yr(e[i],t[i]))return!1}}return String(e)===String(t)}function Ai(e,t){return e.findIndex(n=>Yr(n,t))}const tt=e=>be(e)?e:e==null?\"\":X(e)||ve(e)&&(e.toString===kc||!te(e.toString))?JSON.stringify(e,Cc,2):String(e),Cc=(e,t)=>t&&t.__v_isRef?Cc(e,t.value):Jn(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,o])=>(n[`${r} =>`]=o,n),{})}:cr(t)?{[`Set(${t.size})`]:[...t.values()]}:ve(t)&&!X(t)&&!$c(t)?String(t):t,Se={},Yn=[],me=()=>{},Dp=()=>!1,Hp=/^on[^a-z]/,jo=e=>Hp.test(e),Li=e=>e.startsWith(\"onUpdate:\"),He=Object.assign,Ui=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},jp=Object.prototype.hasOwnProperty,ce=(e,t)=>jp.call(e,t),X=Array.isArray,Jn=e=>Jr(e)===\"[object Map]\",cr=e=>Jr(e)===\"[object Set]\",qa=e=>Jr(e)===\"[object Date]\",te=e=>typeof e==\"function\",be=e=>typeof e==\"string\",Ar=e=>typeof e==\"symbol\",ve=e=>e!==null&&typeof e==\"object\",Mi=e=>ve(e)&&te(e.then)&&te(e.catch),kc=Object.prototype.toString,Jr=e=>kc.call(e),zp=e=>Jr(e).slice(8,-1),$c=e=>Jr(e)===\"[object Object]\",Ii=e=>be(e)&&e!==\"NaN\"&&e[0]!==\"-\"&&\"\"+parseInt(e,10)===e,go=Ri(\",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"),zo=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},qp=/-(\\w)/g,Ct=zo(e=>e.replace(qp,(t,n)=>n?n.toUpperCase():\"\")),Vp=/\\B([A-Z])/g,xn=zo(e=>e.replace(Vp,\"-$1\").toLowerCase()),qo=zo(e=>e.charAt(0).toUpperCase()+e.slice(1)),gs=zo(e=>e?`on${qo(e)}`:\"\"),Lr=(e,t)=>!Object.is(e,t),_o=(e,t)=>{for(let n=0;n<e.length;n++)e[n](t)},xo=(e,t,n)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Vo=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Va;const Kp=()=>Va||(Va=typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:typeof window!=\"undefined\"?window:typeof global!=\"undefined\"?global:{});let lt;class xc{constructor(t=!1){this.active=!0,this.effects=[],this.cleanups=[],!t&&lt&&(this.parent=lt,this.index=(lt.scopes||(lt.scopes=[])).push(this)-1)}run(t){if(this.active){const n=lt;try{return lt=this,t()}finally{lt=n}}}on(){lt=this}off(){lt=this.parent}stop(t){if(this.active){let n,r;for(n=0,r=this.effects.length;n<r;n++)this.effects[n].stop();for(n=0,r=this.cleanups.length;n<r;n++)this.cleanups[n]();if(this.scopes)for(n=0,r=this.scopes.length;n<r;n++)this.scopes[n].stop(!0);if(this.parent&&!t){const o=this.parent.scopes.pop();o&&o!==this&&(this.parent.scopes[this.index]=o,o.index=this.index)}this.active=!1}}}function Oc(e){return new xc(e)}function Wp(e,t=lt){t&&t.active&&t.effects.push(e)}function Yp(){return lt}function Pc(e){lt&&lt.cleanups.push(e)}const Bi=e=>{const t=new Set(e);return t.w=0,t.n=0,t},Tc=e=>(e.w&sn)>0,Rc=e=>(e.n&sn)>0,Jp=({deps:e})=>{if(e.length)for(let t=0;t<e.length;t++)e[t].w|=sn},Xp=e=>{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r<t.length;r++){const o=t[r];Tc(o)&&!Rc(o)?o.delete(e):t[n++]=o,o.w&=~sn,o.n&=~sn}t.length=n}},Ws=new WeakMap;let wr=0,sn=1;const Ys=30;let Et;const En=Symbol(\"\"),Js=Symbol(\"\");class Fi{constructor(t,n=null,r){this.fn=t,this.scheduler=n,this.active=!0,this.deps=[],this.parent=void 0,Wp(this,r)}run(){if(!this.active)return this.fn();let t=Et,n=tn;for(;t;){if(t===this)return;t=t.parent}try{return this.parent=Et,Et=this,tn=!0,sn=1<<++wr,wr<=Ys?Jp(this):Ka(this),this.fn()}finally{wr<=Ys&&Xp(this),sn=1<<--wr,Et=this.parent,tn=n,this.parent=void 0,this.deferStop&&this.stop()}}stop(){Et===this?this.deferStop=!0:this.active&&(Ka(this),this.onStop&&this.onStop(),this.active=!1)}}function Ka(e){const{deps:t}=e;if(t.length){for(let n=0;n<t.length;n++)t[n].delete(e);t.length=0}}let tn=!0;const Ac=[];function On(){Ac.push(tn),tn=!1}function Pn(){const e=Ac.pop();tn=e===void 0?!0:e}function ut(e,t,n){if(tn&&Et){let r=Ws.get(e);r||Ws.set(e,r=new Map);let o=r.get(n);o||r.set(n,o=Bi()),Lc(o)}}function Lc(e,t){let n=!1;wr<=Ys?Rc(e)||(e.n|=sn,n=!Tc(e)):n=!e.has(Et),n&&(e.add(Et),Et.deps.push(e))}function Ht(e,t,n,r,o,s){const i=Ws.get(e);if(!i)return;let a=[];if(t===\"clear\")a=[...i.values()];else if(n===\"length\"&&X(e))i.forEach((l,u)=>{(u===\"length\"||u>=r)&&a.push(l)});else switch(n!==void 0&&a.push(i.get(n)),t){case\"add\":X(e)?Ii(n)&&a.push(i.get(\"length\")):(a.push(i.get(En)),Jn(e)&&a.push(i.get(Js)));break;case\"delete\":X(e)||(a.push(i.get(En)),Jn(e)&&a.push(i.get(Js)));break;case\"set\":Jn(e)&&a.push(i.get(En));break}if(a.length===1)a[0]&&Xs(a[0]);else{const l=[];for(const u of a)u&&l.push(...u);Xs(Bi(l))}}function Xs(e,t){const n=X(e)?e:[...e];for(const r of n)r.computed&&Wa(r);for(const r of n)r.computed||Wa(r)}function Wa(e,t){(e!==Et||e.allowRecurse)&&(e.scheduler?e.scheduler():e.run())}const Zp=Ri(\"__proto__,__v_isRef,__isVue\"),Uc=new Set(Object.getOwnPropertyNames(Symbol).filter(e=>e!==\"arguments\"&&e!==\"caller\").map(e=>Symbol[e]).filter(Ar)),Gp=Ni(),Qp=Ni(!1,!0),eh=Ni(!0),Ya=th();function th(){const e={};return[\"includes\",\"indexOf\",\"lastIndexOf\"].forEach(t=>{e[t]=function(...n){const r=de(this);for(let s=0,i=this.length;s<i;s++)ut(r,\"get\",s+\"\");const o=r[t](...n);return o===-1||o===!1?r[t](...n.map(de)):o}}),[\"push\",\"pop\",\"shift\",\"unshift\",\"splice\"].forEach(t=>{e[t]=function(...n){On();const r=de(this)[t].apply(this,n);return Pn(),r}}),e}function Ni(e=!1,t=!1){return function(r,o,s){if(o===\"__v_isReactive\")return!e;if(o===\"__v_isReadonly\")return e;if(o===\"__v_isShallow\")return t;if(o===\"__v_raw\"&&s===(e?t?gh:Nc:t?Fc:Bc).get(r))return r;const i=X(r);if(!e&&i&&ce(Ya,o))return Reflect.get(Ya,o,s);const a=Reflect.get(r,o,s);return(Ar(o)?Uc.has(o):Zp(o))||(e||ut(r,\"get\",o),t)?a:Pe(a)?i&&Ii(o)?a:a.value:ve(a)?e?ji(a):un(a):a}}const nh=Mc(),rh=Mc(!0);function Mc(e=!1){return function(n,r,o,s){let i=n[r];if(Qn(i)&&Pe(i)&&!Pe(o))return!1;if(!e&&(!Oo(o)&&!Qn(o)&&(i=de(i),o=de(o)),!X(n)&&Pe(i)&&!Pe(o)))return i.value=o,!0;const a=X(n)&&Ii(r)?Number(r)<n.length:ce(n,r),l=Reflect.set(n,r,o,s);return n===de(s)&&(a?Lr(o,i)&&Ht(n,\"set\",r,o):Ht(n,\"add\",r,o)),l}}function oh(e,t){const n=ce(e,t);e[t];const r=Reflect.deleteProperty(e,t);return r&&n&&Ht(e,\"delete\",t,void 0),r}function sh(e,t){const n=Reflect.has(e,t);return(!Ar(t)||!Uc.has(t))&&ut(e,\"has\",t),n}function ih(e){return ut(e,\"iterate\",X(e)?\"length\":En),Reflect.ownKeys(e)}const Ic={get:Gp,set:nh,deleteProperty:oh,has:sh,ownKeys:ih},ah={get:eh,set(e,t){return!0},deleteProperty(e,t){return!0}},lh=He({},Ic,{get:Qp,set:rh}),Di=e=>e,Ko=e=>Reflect.getPrototypeOf(e);function so(e,t,n=!1,r=!1){e=e.__v_raw;const o=de(e),s=de(t);n||(t!==s&&ut(o,\"get\",t),ut(o,\"get\",s));const{has:i}=Ko(o),a=r?Di:n?qi:Ur;if(i.call(o,t))return a(e.get(t));if(i.call(o,s))return a(e.get(s));e!==o&&e.get(t)}function io(e,t=!1){const n=this.__v_raw,r=de(n),o=de(e);return t||(e!==o&&ut(r,\"has\",e),ut(r,\"has\",o)),e===o?n.has(e):n.has(e)||n.has(o)}function ao(e,t=!1){return e=e.__v_raw,!t&&ut(de(e),\"iterate\",En),Reflect.get(e,\"size\",e)}function Ja(e){e=de(e);const t=de(this);return Ko(t).has.call(t,e)||(t.add(e),Ht(t,\"add\",e,e)),this}function Xa(e,t){t=de(t);const n=de(this),{has:r,get:o}=Ko(n);let s=r.call(n,e);s||(e=de(e),s=r.call(n,e));const i=o.call(n,e);return n.set(e,t),s?Lr(t,i)&&Ht(n,\"set\",e,t):Ht(n,\"add\",e,t),this}function Za(e){const t=de(this),{has:n,get:r}=Ko(t);let o=n.call(t,e);o||(e=de(e),o=n.call(t,e)),r&&r.call(t,e);const s=t.delete(e);return o&&Ht(t,\"delete\",e,void 0),s}function Ga(){const e=de(this),t=e.size!==0,n=e.clear();return t&&Ht(e,\"clear\",void 0,void 0),n}function lo(e,t){return function(r,o){const s=this,i=s.__v_raw,a=de(i),l=t?Di:e?qi:Ur;return!e&&ut(a,\"iterate\",En),i.forEach((u,c)=>r.call(o,l(u),l(c),s))}}function uo(e,t,n){return function(...r){const o=this.__v_raw,s=de(o),i=Jn(s),a=e===\"entries\"||e===Symbol.iterator&&i,l=e===\"keys\"&&i,u=o[e](...r),c=n?Di:t?qi:Ur;return!t&&ut(s,\"iterate\",l?Js:En),{next(){const{value:d,done:f}=u.next();return f?{value:d,done:f}:{value:a?[c(d[0]),c(d[1])]:c(d),done:f}},[Symbol.iterator](){return this}}}}function qt(e){return function(...t){return e===\"delete\"?!1:this}}function uh(){const e={get(s){return so(this,s)},get size(){return ao(this)},has:io,add:Ja,set:Xa,delete:Za,clear:Ga,forEach:lo(!1,!1)},t={get(s){return so(this,s,!1,!0)},get size(){return ao(this)},has:io,add:Ja,set:Xa,delete:Za,clear:Ga,forEach:lo(!1,!0)},n={get(s){return so(this,s,!0)},get size(){return ao(this,!0)},has(s){return io.call(this,s,!0)},add:qt(\"add\"),set:qt(\"set\"),delete:qt(\"delete\"),clear:qt(\"clear\"),forEach:lo(!0,!1)},r={get(s){return so(this,s,!0,!0)},get size(){return ao(this,!0)},has(s){return io.call(this,s,!0)},add:qt(\"add\"),set:qt(\"set\"),delete:qt(\"delete\"),clear:qt(\"clear\"),forEach:lo(!0,!0)};return[\"keys\",\"values\",\"entries\",Symbol.iterator].forEach(s=>{e[s]=uo(s,!1,!1),n[s]=uo(s,!0,!1),t[s]=uo(s,!1,!0),r[s]=uo(s,!0,!0)}),[e,n,t,r]}const[ch,fh,dh,ph]=uh();function Hi(e,t){const n=t?e?ph:dh:e?fh:ch;return(r,o,s)=>o===\"__v_isReactive\"?!e:o===\"__v_isReadonly\"?e:o===\"__v_raw\"?r:Reflect.get(ce(n,o)&&o in r?n:r,o,s)}const hh={get:Hi(!1,!1)},mh={get:Hi(!1,!0)},vh={get:Hi(!0,!1)},Bc=new WeakMap,Fc=new WeakMap,Nc=new WeakMap,gh=new WeakMap;function _h(e){switch(e){case\"Object\":case\"Array\":return 1;case\"Map\":case\"Set\":case\"WeakMap\":case\"WeakSet\":return 2;default:return 0}}function yh(e){return e.__v_skip||!Object.isExtensible(e)?0:_h(zp(e))}function un(e){return Qn(e)?e:zi(e,!1,Ic,hh,Bc)}function Dc(e){return zi(e,!1,lh,mh,Fc)}function ji(e){return zi(e,!0,ah,vh,Nc)}function zi(e,t,n,r,o){if(!ve(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=o.get(e);if(s)return s;const i=yh(e);if(i===0)return e;const a=new Proxy(e,i===2?r:n);return o.set(e,a),a}function nn(e){return Qn(e)?nn(e.__v_raw):!!(e&&e.__v_isReactive)}function Qn(e){return!!(e&&e.__v_isReadonly)}function Oo(e){return!!(e&&e.__v_isShallow)}function Hc(e){return nn(e)||Qn(e)}function de(e){const t=e&&e.__v_raw;return t?de(t):e}function er(e){return xo(e,\"__v_skip\",!0),e}const Ur=e=>ve(e)?un(e):e,qi=e=>ve(e)?ji(e):e;function jc(e){tn&&Et&&(e=de(e),Lc(e.dep||(e.dep=Bi())))}function zc(e,t){e=de(e),e.dep&&Xs(e.dep)}function Pe(e){return!!(e&&e.__v_isRef===!0)}function W(e){return qc(e,!1)}function Mr(e){return qc(e,!0)}function qc(e,t){return Pe(e)?e:new bh(e,t)}class bh{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:de(t),this._value=n?t:Ur(t)}get value(){return jc(this),this._value}set value(t){const n=this.__v_isShallow||Oo(t)||Qn(t);t=n?t:de(t),Lr(t,this._rawValue)&&(this._rawValue=t,this._value=n?t:Ur(t),zc(this))}}function v(e){return Pe(e)?e.value:e}const wh={get:(e,t,n)=>v(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const o=e[t];return Pe(o)&&!Pe(n)?(o.value=n,!0):Reflect.set(e,t,n,r)}};function Vc(e){return nn(e)?e:new Proxy(e,wh)}function Eh(e){const t=X(e)?new Array(e.length):{};for(const n in e)t[n]=Sn(e,n);return t}class Sh{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}}function Sn(e,t,n){const r=e[t];return Pe(r)?r:new Sh(e,t,n)}var Kc;class Ch{constructor(t,n,r,o){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this[Kc]=!1,this._dirty=!0,this.effect=new Fi(t,()=>{this._dirty||(this._dirty=!0,zc(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=r}get value(){const t=de(this);return jc(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}Kc=\"__v_isReadonly\";function Wc(e,t,n=!1){let r,o;const s=te(e);return s?(r=e,o=me):(r=e.get,o=e.set),new Ch(r,o,s||!o,n)}const Sr=[];function kh(e,...t){On();const n=Sr.length?Sr[Sr.length-1].component:null,r=n&&n.appContext.config.warnHandler,o=$h();if(r)Nt(r,n,11,[e+t.join(\"\"),n&&n.proxy,o.map(({vnode:s})=>`at <${kf(n,s.type)}>`).join(`\n`),o]);else{const s=[`[Vue warn]: ${e}`,...t];o.length&&s.push(`\n`,...xh(o)),console.warn(...s)}Pn()}function $h(){let e=Sr[Sr.length-1];if(!e)return[];const t=[];for(;e;){const n=t[0];n&&n.vnode===e?n.recurseCount++:t.push({vnode:e,recurseCount:0});const r=e.component&&e.component.parent;e=r&&r.vnode}return t}function xh(e){const t=[];return e.forEach((n,r)=>{t.push(...r===0?[]:[`\n`],...Oh(n))}),t}function Oh({vnode:e,recurseCount:t}){const n=t>0?`... (${t} recursive calls)`:\"\",r=e.component?e.component.parent==null:!1,o=` at <${kf(e.component,e.type,r)}`,s=\">\"+n;return e.props?[o,...Ph(e.props),s]:[o+s]}function Ph(e){const t=[],n=Object.keys(e);return n.slice(0,3).forEach(r=>{t.push(...Yc(r,e[r]))}),n.length>3&&t.push(\" ...\"),t}function Yc(e,t,n){return be(t)?(t=JSON.stringify(t),n?t:[`${e}=${t}`]):typeof t==\"number\"||typeof t==\"boolean\"||t==null?n?t:[`${e}=${t}`]:Pe(t)?(t=Yc(e,de(t.value),!0),n?t:[`${e}=Ref<`,t,\">\"]):te(t)?[`${e}=fn${t.name?`<${t.name}>`:\"\"}`]:(t=de(t),n?t:[`${e}=`,t])}function Nt(e,t,n,r){let o;try{o=r?e(...r):e()}catch(s){Xr(s,t,n)}return o}function ht(e,t,n,r){if(te(e)){const s=Nt(e,t,n,r);return s&&Mi(s)&&s.catch(i=>{Xr(i,t,n)}),s}const o=[];for(let s=0;s<e.length;s++)o.push(ht(e[s],t,n,r));return o}function Xr(e,t,n,r=!0){const o=t?t.vnode:null;if(t){let s=t.parent;const i=t.proxy,a=n;for(;s;){const u=s.ec;if(u){for(let c=0;c<u.length;c++)if(u[c](e,i,a)===!1)return}s=s.parent}const l=t.appContext.config.errorHandler;if(l){Nt(l,null,10,[e,i,a]);return}}Th(e,n,o,r)}function Th(e,t,n,r=!0){console.error(e)}let Ir=!1,Zs=!1;const We=[];let Pt=0;const Xn=[];let Bt=null,_n=0;const Jc=Promise.resolve();let Vi=null;function jt(e){const t=Vi||Jc;return e?t.then(this?e.bind(this):e):t}function Rh(e){let t=Pt+1,n=We.length;for(;t<n;){const r=t+n>>>1;Br(We[r])<e?t=r+1:n=r}return t}function Ki(e){(!We.length||!We.includes(e,Ir&&e.allowRecurse?Pt+1:Pt))&&(e.id==null?We.push(e):We.splice(Rh(e.id),0,e),Xc())}function Xc(){!Ir&&!Zs&&(Zs=!0,Vi=Jc.then(Qc))}function Ah(e){const t=We.indexOf(e);t>Pt&&We.splice(t,1)}function Zc(e){X(e)?Xn.push(...e):(!Bt||!Bt.includes(e,e.allowRecurse?_n+1:_n))&&Xn.push(e),Xc()}function Qa(e,t=Ir?Pt+1:0){for(;t<We.length;t++){const n=We[t];n&&n.pre&&(We.splice(t,1),t--,n())}}function Gc(e){if(Xn.length){const t=[...new Set(Xn)];if(Xn.length=0,Bt){Bt.push(...t);return}for(Bt=t,Bt.sort((n,r)=>Br(n)-Br(r)),_n=0;_n<Bt.length;_n++)Bt[_n]();Bt=null,_n=0}}const Br=e=>e.id==null?1/0:e.id,Lh=(e,t)=>{const n=Br(e)-Br(t);if(n===0){if(e.pre&&!t.pre)return-1;if(t.pre&&!e.pre)return 1}return n};function Qc(e){Zs=!1,Ir=!0,We.sort(Lh);const t=me;try{for(Pt=0;Pt<We.length;Pt++){const n=We[Pt];n&&n.active!==!1&&Nt(n,null,14)}}finally{Pt=0,We.length=0,Gc(),Ir=!1,Vi=null,(We.length||Xn.length)&&Qc()}}function Uh(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||Se;let o=n;const s=t.startsWith(\"update:\"),i=s&&t.slice(7);if(i&&i in r){const c=`${i===\"modelValue\"?\"model\":i}Modifiers`,{number:d,trim:f}=r[c]||Se;f&&(o=n.map(p=>p.trim())),d&&(o=n.map(Vo))}let a,l=r[a=gs(t)]||r[a=gs(Ct(t))];!l&&s&&(l=r[a=gs(xn(t))]),l&&ht(l,e,6,o);const u=r[a+\"Once\"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,ht(u,e,6,o)}}function ef(e,t,n=!1){const r=t.emitsCache,o=r.get(e);if(o!==void 0)return o;const s=e.emits;let i={},a=!1;if(!te(e)){const l=u=>{const c=ef(u,t,!0);c&&(a=!0,He(i,c))};!n&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!s&&!a?(ve(e)&&r.set(e,null),null):(X(s)?s.forEach(l=>i[l]=null):He(i,s),ve(e)&&r.set(e,i),i)}function Wo(e,t){return!e||!jo(t)?!1:(t=t.slice(2).replace(/Once$/,\"\"),ce(e,t[0].toLowerCase()+t.slice(1))||ce(e,xn(t))||ce(e,t))}let Ye=null,Yo=null;function Po(e){const t=Ye;return Ye=e,Yo=e&&e.type.__scopeId||null,t}function Jo(e){Yo=e}function Xo(){Yo=null}function re(e,t=Ye,n){if(!t||e._n)return e;const r=(...o)=>{r._d&&dl(-1);const s=Po(t),i=e(...o);return Po(s),r._d&&dl(1),i};return r._n=!0,r._c=!0,r._d=!0,r}function _s(e){const{type:t,vnode:n,proxy:r,withProxy:o,props:s,propsOptions:[i],slots:a,attrs:l,emit:u,render:c,renderCache:d,data:f,setupState:p,ctx:m,inheritAttrs:_}=e;let S,y;const E=Po(e);try{if(n.shapeFlag&4){const x=o||r;S=wt(c.call(x,x,d,s,p,f,m)),y=l}else{const x=t;S=wt(x.length>1?x(s,{attrs:l,slots:a,emit:u}):x(s,null)),y=t.props?l:Ih(l)}}catch(x){$r.length=0,Xr(x,e,1),S=ee(rt)}let w=S;if(y&&_!==!1){const x=Object.keys(y),{shapeFlag:b}=w;x.length&&b&7&&(i&&x.some(Li)&&(y=Bh(y,i)),w=an(w,y))}return n.dirs&&(w=an(w),w.dirs=w.dirs?w.dirs.concat(n.dirs):n.dirs),n.transition&&(w.transition=n.transition),S=w,Po(E),S}function Mh(e){let t;for(let n=0;n<e.length;n++){const r=e[n];if(kn(r)){if(r.type!==rt||r.children===\"v-if\"){if(t)return;t=r}}else return}return t}const Ih=e=>{let t;for(const n in e)(n===\"class\"||n===\"style\"||jo(n))&&((t||(t={}))[n]=e[n]);return t},Bh=(e,t)=>{const n={};for(const r in e)(!Li(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function Fh(e,t,n){const{props:r,children:o,component:s}=e,{props:i,children:a,patchFlag:l}=t,u=s.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&l>=0){if(l&1024)return!0;if(l&16)return r?el(r,i,u):!!i;if(l&8){const c=t.dynamicProps;for(let d=0;d<c.length;d++){const f=c[d];if(i[f]!==r[f]&&!Wo(u,f))return!0}}}else return(o||a)&&(!a||!a.$stable)?!0:r===i?!1:r?i?el(r,i,u):!0:!!i;return!1}function el(e,t,n){const r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let o=0;o<r.length;o++){const s=r[o];if(t[s]!==e[s]&&!Wo(n,s))return!0}return!1}function Wi({vnode:e,parent:t},n){for(;t&&t.subTree===e;)(e=t.vnode).el=n,t=t.parent}const Nh=e=>e.__isSuspense,Dh={name:\"Suspense\",__isSuspense:!0,process(e,t,n,r,o,s,i,a,l,u){e==null?Hh(t,n,r,o,s,i,a,l,u):jh(e,t,n,r,o,i,a,l,u)},hydrate:zh,create:Yi,normalize:qh},tf=Dh;function Fr(e,t){const n=e.props&&e.props[t];te(n)&&n()}function Hh(e,t,n,r,o,s,i,a,l){const{p:u,o:{createElement:c}}=l,d=c(\"div\"),f=e.suspense=Yi(e,o,r,t,d,n,s,i,a,l);u(null,f.pendingBranch=e.ssContent,d,null,r,f,s,i),f.deps>0?(Fr(e,\"onPending\"),Fr(e,\"onFallback\"),u(null,e.ssFallback,t,n,r,null,s,i),Zn(f,e.ssFallback)):f.resolve()}function jh(e,t,n,r,o,s,i,a,{p:l,um:u,o:{createElement:c}}){const d=t.suspense=e.suspense;d.vnode=t,t.el=e.el;const f=t.ssContent,p=t.ssFallback,{activeBranch:m,pendingBranch:_,isInFallback:S,isHydrating:y}=d;if(_)d.pendingBranch=f,Tt(f,_)?(l(_,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0?d.resolve():S&&(l(m,p,n,r,o,null,s,i,a),Zn(d,p))):(d.pendingId++,y?(d.isHydrating=!1,d.activeBranch=_):u(_,o,d),d.deps=0,d.effects.length=0,d.hiddenContainer=c(\"div\"),S?(l(null,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0?d.resolve():(l(m,p,n,r,o,null,s,i,a),Zn(d,p))):m&&Tt(f,m)?(l(m,f,n,r,o,d,s,i,a),d.resolve(!0)):(l(null,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0&&d.resolve()));else if(m&&Tt(f,m))l(m,f,n,r,o,d,s,i,a),Zn(d,f);else if(Fr(t,\"onPending\"),d.pendingBranch=f,d.pendingId++,l(null,f,d.hiddenContainer,null,o,d,s,i,a),d.deps<=0)d.resolve();else{const{timeout:E,pendingId:w}=d;E>0?setTimeout(()=>{d.pendingId===w&&d.fallback(p)},E):E===0&&d.fallback(p)}}function Yi(e,t,n,r,o,s,i,a,l,u,c=!1){const{p:d,m:f,um:p,n:m,o:{parentNode:_,remove:S}}=u,y=Vo(e.props&&e.props.timeout),E={vnode:e,parent:t,parentComponent:n,isSVG:i,container:r,hiddenContainer:o,anchor:s,deps:0,pendingId:0,timeout:typeof y==\"number\"?y:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:c,isUnmounted:!1,effects:[],resolve(w=!1){const{vnode:x,activeBranch:b,pendingBranch:L,pendingId:P,effects:C,parentComponent:T,container:N}=E;if(E.isHydrating)E.isHydrating=!1;else if(!w){const ne=b&&L.transition&&L.transition.mode===\"out-in\";ne&&(b.transition.afterLeave=()=>{P===E.pendingId&&f(L,N,se,0)});let{anchor:se}=E;b&&(se=m(b),p(b,T,E,!0)),ne||f(L,N,se,0)}Zn(E,L),E.pendingBranch=null,E.isInFallback=!1;let q=E.parent,B=!1;for(;q;){if(q.pendingBranch){q.effects.push(...C),B=!0;break}q=q.parent}B||Zc(C),E.effects=[],Fr(x,\"onResolve\")},fallback(w){if(!E.pendingBranch)return;const{vnode:x,activeBranch:b,parentComponent:L,container:P,isSVG:C}=E;Fr(x,\"onFallback\");const T=m(b),N=()=>{!E.isInFallback||(d(null,w,P,T,L,null,C,a,l),Zn(E,w))},q=w.transition&&w.transition.mode===\"out-in\";q&&(b.transition.afterLeave=N),E.isInFallback=!0,p(b,L,null,!0),q||N()},move(w,x,b){E.activeBranch&&f(E.activeBranch,w,x,b),E.container=w},next(){return E.activeBranch&&m(E.activeBranch)},registerDep(w,x){const b=!!E.pendingBranch;b&&E.deps++;const L=w.vnode.el;w.asyncDep.catch(P=>{Xr(P,w,0)}).then(P=>{if(w.isUnmounted||E.isUnmounted||E.pendingId!==w.suspenseId)return;w.asyncResolved=!0;const{vnode:C}=w;si(w,P,!1),L&&(C.el=L);const T=!L&&w.subTree.el;x(w,C,_(L||w.subTree.el),L?null:m(w.subTree),E,i,l),T&&S(T),Wi(w,C.el),b&&--E.deps===0&&E.resolve()})},unmount(w,x){E.isUnmounted=!0,E.activeBranch&&p(E.activeBranch,n,w,x),E.pendingBranch&&p(E.pendingBranch,n,w,x)}};return E}function zh(e,t,n,r,o,s,i,a,l){const u=t.suspense=Yi(t,r,n,e.parentNode,document.createElement(\"div\"),null,o,s,i,a,!0),c=l(e,u.pendingBranch=t.ssContent,n,u,s,i);return u.deps===0&&u.resolve(),c}function qh(e){const{shapeFlag:t,children:n}=e,r=t&32;e.ssContent=tl(r?n.default:n),e.ssFallback=r?tl(n.fallback):ee(rt)}function tl(e){let t;if(te(e)){const n=tr&&e._c;n&&(e._d=!1,$()),e=e(),n&&(e._d=!0,t=pt,_f())}return X(e)&&(e=Mh(e)),e=wt(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(n=>n!==e)),e}function Vh(e,t){t&&t.pendingBranch?X(e)?t.effects.push(...e):t.effects.push(e):Zc(e)}function Zn(e,t){e.activeBranch=t;const{vnode:n,parentComponent:r}=e,o=n.el=t.el;r&&r.subTree===n&&(r.vnode.el=o,Wi(r,o))}function nt(e,t){if(De){let n=De.provides;const r=De.parent&&De.parent.provides;r===n&&(n=De.provides=Object.create(r)),n[e]=t}}function Oe(e,t,n=!1){const r=De||Ye;if(r){const o=r.parent==null?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides;if(o&&e in o)return o[e];if(arguments.length>1)return n&&te(t)?t.call(r.proxy):t}}function nf(e,t){return Ji(e,null,t)}const nl={};function Ae(e,t,n){return Ji(e,t,n)}function Ji(e,t,{immediate:n,deep:r,flush:o,onTrack:s,onTrigger:i}=Se){const a=De;let l,u=!1,c=!1;if(Pe(e)?(l=()=>e.value,u=Oo(e)):nn(e)?(l=()=>e,r=!0):X(e)?(c=!0,u=e.some(y=>nn(y)||Oo(y)),l=()=>e.map(y=>{if(Pe(y))return y.value;if(nn(y))return bn(y);if(te(y))return Nt(y,a,2)})):te(e)?t?l=()=>Nt(e,a,2):l=()=>{if(!(a&&a.isUnmounted))return d&&d(),ht(e,a,3,[f])}:l=me,t&&r){const y=l;l=()=>bn(y())}let d,f=y=>{d=S.onStop=()=>{Nt(y,a,4)}};if(jr)return f=me,t?n&&ht(t,a,3,[l(),c?[]:void 0,f]):l(),me;let p=c?[]:nl;const m=()=>{if(!!S.active)if(t){const y=S.run();(r||u||(c?y.some((E,w)=>Lr(E,p[w])):Lr(y,p)))&&(d&&d(),ht(t,a,3,[y,p===nl?void 0:p,f]),p=y)}else S.run()};m.allowRecurse=!!t;let _;o===\"sync\"?_=m:o===\"post\"?_=()=>Qe(m,a&&a.suspense):(m.pre=!0,a&&(m.id=a.uid),_=()=>Ki(m));const S=new Fi(l,_);return t?n?m():p=S.run():o===\"post\"?Qe(S.run.bind(S),a&&a.suspense):S.run(),()=>{S.stop(),a&&a.scope&&Ui(a.scope.effects,S)}}function Kh(e,t,n){const r=this.proxy,o=be(e)?e.includes(\".\")?rf(r,e):()=>r[e]:e.bind(r,r);let s;te(t)?s=t:(s=t.handler,n=t);const i=De;ln(this);const a=Ji(o,s.bind(r),n);return i?ln(i):on(),a}function rf(e,t){const n=t.split(\".\");return()=>{let r=e;for(let o=0;o<n.length&&r;o++)r=r[n[o]];return r}}function bn(e,t){if(!ve(e)||e.__v_skip||(t=t||new Set,t.has(e)))return e;if(t.add(e),Pe(e))bn(e.value,t);else if(X(e))for(let n=0;n<e.length;n++)bn(e[n],t);else if(cr(e)||Jn(e))e.forEach(n=>{bn(n,t)});else if($c(e))for(const n in e)bn(e[n],t);return e}function of(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return $t(()=>{e.isMounted=!0}),Tn(()=>{e.isUnmounting=!0}),e}const dt=[Function,Array],Wh={name:\"BaseTransition\",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:dt,onEnter:dt,onAfterEnter:dt,onEnterCancelled:dt,onBeforeLeave:dt,onLeave:dt,onAfterLeave:dt,onLeaveCancelled:dt,onBeforeAppear:dt,onAppear:dt,onAfterAppear:dt,onAppearCancelled:dt},setup(e,{slots:t}){const n=mt(),r=of();let o;return()=>{const s=t.default&&Xi(t.default(),!0);if(!s||!s.length)return;let i=s[0];if(s.length>1){for(const _ of s)if(_.type!==rt){i=_;break}}const a=de(e),{mode:l}=a;if(r.isLeaving)return ys(i);const u=rl(i);if(!u)return ys(i);const c=Nr(u,a,r,n);Dr(u,c);const d=n.subTree,f=d&&rl(d);let p=!1;const{getTransitionKey:m}=u.type;if(m){const _=m();o===void 0?o=_:_!==o&&(o=_,p=!0)}if(f&&f.type!==rt&&(!Tt(u,f)||p)){const _=Nr(f,a,r,n);if(Dr(f,_),l===\"out-in\")return r.isLeaving=!0,_.afterLeave=()=>{r.isLeaving=!1,n.update()},ys(i);l===\"in-out\"&&u.type!==rt&&(_.delayLeave=(S,y,E)=>{const w=af(r,f);w[String(f.key)]=f,S._leaveCb=()=>{y(),S._leaveCb=void 0,delete c.delayedLeave},c.delayedLeave=E})}return i}}},sf=Wh;function af(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Nr(e,t,n,r){const{appear:o,mode:s,persisted:i=!1,onBeforeEnter:a,onEnter:l,onAfterEnter:u,onEnterCancelled:c,onBeforeLeave:d,onLeave:f,onAfterLeave:p,onLeaveCancelled:m,onBeforeAppear:_,onAppear:S,onAfterAppear:y,onAppearCancelled:E}=t,w=String(e.key),x=af(n,e),b=(C,T)=>{C&&ht(C,r,9,T)},L=(C,T)=>{const N=T[1];b(C,T),X(C)?C.every(q=>q.length<=1)&&N():C.length<=1&&N()},P={mode:s,persisted:i,beforeEnter(C){let T=a;if(!n.isMounted)if(o)T=_||a;else return;C._leaveCb&&C._leaveCb(!0);const N=x[w];N&&Tt(e,N)&&N.el._leaveCb&&N.el._leaveCb(),b(T,[C])},enter(C){let T=l,N=u,q=c;if(!n.isMounted)if(o)T=S||l,N=y||u,q=E||c;else return;let B=!1;const ne=C._enterCb=se=>{B||(B=!0,se?b(q,[C]):b(N,[C]),P.delayedLeave&&P.delayedLeave(),C._enterCb=void 0)};T?L(T,[C,ne]):ne()},leave(C,T){const N=String(e.key);if(C._enterCb&&C._enterCb(!0),n.isUnmounting)return T();b(d,[C]);let q=!1;const B=C._leaveCb=ne=>{q||(q=!0,T(),ne?b(m,[C]):b(p,[C]),C._leaveCb=void 0,x[N]===e&&delete x[N])};x[N]=e,f?L(f,[C,B]):B()},clone(C){return Nr(C,t,n,r)}};return P}function ys(e){if(Zo(e))return e=an(e),e.children=null,e}function rl(e){return Zo(e)?e.children?e.children[0]:void 0:e}function Dr(e,t){e.shapeFlag&6&&e.component?Dr(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Xi(e,t=!1,n){let r=[],o=0;for(let s=0;s<e.length;s++){let i=e[s];const a=n==null?i.key:String(n)+String(i.key!=null?i.key:s);i.type===Ie?(i.patchFlag&128&&o++,r=r.concat(Xi(i.children,t,a))):(t||i.type!==rt)&&r.push(a!=null?an(i,{key:a}):i)}if(o>1)for(let s=0;s<r.length;s++)r[s].patchFlag=-2;return r}function $e(e){return te(e)?{setup:e,name:e.name}:e}const Cr=e=>!!e.type.__asyncLoader,Zo=e=>e.type.__isKeepAlive;function Yh(e,t){lf(e,\"a\",t)}function Jh(e,t){lf(e,\"da\",t)}function lf(e,t,n=De){const r=e.__wdc||(e.__wdc=()=>{let o=n;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Go(t,r,n),n){let o=n.parent;for(;o&&o.parent;)Zo(o.parent.vnode)&&Xh(r,t,n,o),o=o.parent}}function Xh(e,t,n,r){const o=Go(t,e,r,!0);Qo(()=>{Ui(r[t],o)},n)}function Go(e,t,n=De,r=!1){if(n){const o=n[e]||(n[e]=[]),s=t.__weh||(t.__weh=(...i)=>{if(n.isUnmounted)return;On(),ln(n);const a=ht(t,n,e,i);return on(),Pn(),a});return r?o.unshift(s):o.push(s),s}}const zt=e=>(t,n=De)=>(!jr||e===\"sp\")&&Go(e,(...r)=>t(...r),n),Zh=zt(\"bm\"),$t=zt(\"m\"),Gh=zt(\"bu\"),Zi=zt(\"u\"),Tn=zt(\"bum\"),Qo=zt(\"um\"),Qh=zt(\"sp\"),e0=zt(\"rtg\"),t0=zt(\"rtc\");function n0(e,t=De){Go(\"ec\",e,t)}function Zr(e,t){const n=Ye;if(n===null)return e;const r=rs(n)||n.proxy,o=e.dirs||(e.dirs=[]);for(let s=0;s<t.length;s++){let[i,a,l,u=Se]=t[s];te(i)&&(i={mounted:i,updated:i}),i.deep&&bn(a),o.push({dir:i,instance:r,value:a,oldValue:void 0,arg:l,modifiers:u})}return e}function pn(e,t,n,r){const o=e.dirs,s=t&&t.dirs;for(let i=0;i<o.length;i++){const a=o[i];s&&(a.oldValue=s[i].value);let l=a.dir[r];l&&(On(),ht(l,n,8,[e.el,a,e,t]),Pn())}}const Gi=\"components\",r0=\"directives\";function yo(e,t){return Qi(Gi,e,!0,t)||e}const uf=Symbol();function Cn(e){return be(e)?Qi(Gi,e,!1)||e:e||uf}function Yw(e){return Qi(r0,e)}function Qi(e,t,n=!0,r=!1){const o=Ye||De;if(o){const s=o.type;if(e===Gi){const a=Cf(s,!1);if(a&&(a===t||a===Ct(t)||a===qo(Ct(t))))return s}const i=ol(o[e]||s[e],t)||ol(o.appContext[e],t);return!i&&r?s:i}}function ol(e,t){return e&&(e[t]||e[Ct(t)]||e[qo(Ct(t))])}function ea(e,t,n,r){let o;const s=n&&n[r];if(X(e)||be(e)){o=new Array(e.length);for(let i=0,a=e.length;i<a;i++)o[i]=t(e[i],i,void 0,s&&s[i])}else if(typeof e==\"number\"){o=new Array(e);for(let i=0;i<e;i++)o[i]=t(i+1,i,void 0,s&&s[i])}else if(ve(e))if(e[Symbol.iterator])o=Array.from(e,(i,a)=>t(i,a,void 0,s&&s[a]));else{const i=Object.keys(e);o=new Array(i.length);for(let a=0,l=i.length;a<l;a++){const u=i[a];o[a]=t(e[u],u,a,s&&s[a])}}else o=[];return n&&(n[r]=o),o}function Gs(e,t){for(let n=0;n<t.length;n++){const r=t[n];if(X(r))for(let o=0;o<r.length;o++)e[r[o].name]=r[o].fn;else r&&(e[r.name]=r.key?(...o)=>{const s=r.fn(...o);return s&&(s.key=r.key),s}:r.fn)}return e}function pe(e,t,n={},r,o){if(Ye.isCE||Ye.parent&&Cr(Ye.parent)&&Ye.parent.isCE)return ee(\"slot\",t===\"default\"?null:{name:t},r&&r());let s=e[t];s&&s._c&&(s._d=!1),$();const i=s&&cf(s(n)),a=ie(Ie,{key:n.key||i&&i.key||`_${t}`},i||(r?r():[]),i&&e._===1?64:-2);return!o&&a.scopeId&&(a.slotScopeIds=[a.scopeId+\"-s\"]),s&&s._c&&(s._d=!0),a}function cf(e){return e.some(t=>kn(t)?!(t.type===rt||t.type===Ie&&!cf(t.children)):!0)?e:null}const Qs=e=>e?wf(e)?rs(e)||e.proxy:Qs(e.parent):null,To=He(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>Qs(e.parent),$root:e=>Qs(e.root),$emit:e=>e.emit,$options:e=>ta(e),$forceUpdate:e=>e.f||(e.f=()=>Ki(e.update)),$nextTick:e=>e.n||(e.n=jt.bind(e.proxy)),$watch:e=>Kh.bind(e)}),o0={get({_:e},t){const{ctx:n,setupState:r,data:o,props:s,accessCache:i,type:a,appContext:l}=e;let u;if(t[0]!==\"$\"){const p=i[t];if(p!==void 0)switch(p){case 1:return r[t];case 2:return o[t];case 4:return n[t];case 3:return s[t]}else{if(r!==Se&&ce(r,t))return i[t]=1,r[t];if(o!==Se&&ce(o,t))return i[t]=2,o[t];if((u=e.propsOptions[0])&&ce(u,t))return i[t]=3,s[t];if(n!==Se&&ce(n,t))return i[t]=4,n[t];ei&&(i[t]=0)}}const c=To[t];let d,f;if(c)return t===\"$attrs\"&&ut(e,\"get\",t),c(e);if((d=a.__cssModules)&&(d=d[t]))return d;if(n!==Se&&ce(n,t))return i[t]=4,n[t];if(f=l.config.globalProperties,ce(f,t))return f[t]},set({_:e},t,n){const{data:r,setupState:o,ctx:s}=e;return o!==Se&&ce(o,t)?(o[t]=n,!0):r!==Se&&ce(r,t)?(r[t]=n,!0):ce(e.props,t)||t[0]===\"$\"&&t.slice(1)in e?!1:(s[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:o,propsOptions:s}},i){let a;return!!n[i]||e!==Se&&ce(e,i)||t!==Se&&ce(t,i)||(a=s[0])&&ce(a,i)||ce(r,i)||ce(To,i)||ce(o.config.globalProperties,i)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:ce(n,\"value\")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}};let ei=!0;function s0(e){const t=ta(e),n=e.proxy,r=e.ctx;ei=!1,t.beforeCreate&&sl(t.beforeCreate,e,\"bc\");const{data:o,computed:s,methods:i,watch:a,provide:l,inject:u,created:c,beforeMount:d,mounted:f,beforeUpdate:p,updated:m,activated:_,deactivated:S,beforeDestroy:y,beforeUnmount:E,destroyed:w,unmounted:x,render:b,renderTracked:L,renderTriggered:P,errorCaptured:C,serverPrefetch:T,expose:N,inheritAttrs:q,components:B,directives:ne,filters:se}=t;if(u&&i0(u,r,null,e.appContext.config.unwrapInjectedRef),i)for(const Ce in i){const _e=i[Ce];te(_e)&&(r[Ce]=_e.bind(n))}if(o){const Ce=o.call(n,n);ve(Ce)&&(e.data=un(Ce))}if(ei=!0,s)for(const Ce in s){const _e=s[Ce],vt=te(_e)?_e.bind(n,n):te(_e.get)?_e.get.bind(n,n):me,dn=!te(_e)&&te(_e.set)?_e.set.bind(n):me,gt=K({get:vt,set:dn});Object.defineProperty(r,Ce,{enumerable:!0,configurable:!0,get:()=>gt.value,set:Ze=>gt.value=Ze})}if(a)for(const Ce in a)ff(a[Ce],r,n,Ce);if(l){const Ce=te(l)?l.call(n):l;Reflect.ownKeys(Ce).forEach(_e=>{nt(_e,Ce[_e])})}c&&sl(c,e,\"c\");function we(Ce,_e){X(_e)?_e.forEach(vt=>Ce(vt.bind(n))):_e&&Ce(_e.bind(n))}if(we(Zh,d),we($t,f),we(Gh,p),we(Zi,m),we(Yh,_),we(Jh,S),we(n0,C),we(t0,L),we(e0,P),we(Tn,E),we(Qo,x),we(Qh,T),X(N))if(N.length){const Ce=e.exposed||(e.exposed={});N.forEach(_e=>{Object.defineProperty(Ce,_e,{get:()=>n[_e],set:vt=>n[_e]=vt})})}else e.exposed||(e.exposed={});b&&e.render===me&&(e.render=b),q!=null&&(e.inheritAttrs=q),B&&(e.components=B),ne&&(e.directives=ne)}function i0(e,t,n=me,r=!1){X(e)&&(e=ti(e));for(const o in e){const s=e[o];let i;ve(s)?\"default\"in s?i=Oe(s.from||o,s.default,!0):i=Oe(s.from||o):i=Oe(s),Pe(i)&&r?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>i.value,set:a=>i.value=a}):t[o]=i}}function sl(e,t,n){ht(X(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function ff(e,t,n,r){const o=r.includes(\".\")?rf(n,r):()=>n[r];if(be(e)){const s=t[e];te(s)&&Ae(o,s)}else if(te(e))Ae(o,e.bind(n));else if(ve(e))if(X(e))e.forEach(s=>ff(s,t,n,r));else{const s=te(e.handler)?e.handler.bind(n):t[e.handler];te(s)&&Ae(o,s,e)}}function ta(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:i}}=e.appContext,a=s.get(t);let l;return a?l=a:!o.length&&!n&&!r?l=t:(l={},o.length&&o.forEach(u=>Ro(l,u,i,!0)),Ro(l,t,i)),ve(t)&&s.set(t,l),l}function Ro(e,t,n,r=!1){const{mixins:o,extends:s}=t;s&&Ro(e,s,n,!0),o&&o.forEach(i=>Ro(e,i,n,!0));for(const i in t)if(!(r&&i===\"expose\")){const a=a0[i]||n&&n[i];e[i]=a?a(e[i],t[i]):t[i]}return e}const a0={data:il,props:gn,emits:gn,methods:gn,computed:gn,beforeCreate:Xe,created:Xe,beforeMount:Xe,mounted:Xe,beforeUpdate:Xe,updated:Xe,beforeDestroy:Xe,beforeUnmount:Xe,destroyed:Xe,unmounted:Xe,activated:Xe,deactivated:Xe,errorCaptured:Xe,serverPrefetch:Xe,components:gn,directives:gn,watch:u0,provide:il,inject:l0};function il(e,t){return t?e?function(){return He(te(e)?e.call(this,this):e,te(t)?t.call(this,this):t)}:t:e}function l0(e,t){return gn(ti(e),ti(t))}function ti(e){if(X(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function Xe(e,t){return e?[...new Set([].concat(e,t))]:t}function gn(e,t){return e?He(He(Object.create(null),e),t):t}function u0(e,t){if(!e)return t;if(!t)return e;const n=He(Object.create(null),e);for(const r in t)n[r]=Xe(e[r],t[r]);return n}function c0(e,t,n,r=!1){const o={},s={};xo(s,ts,1),e.propsDefaults=Object.create(null),df(e,t,o,s);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);n?e.props=r?o:Dc(o):e.type.props?e.props=o:e.props=s,e.attrs=s}function f0(e,t,n,r){const{props:o,attrs:s,vnode:{patchFlag:i}}=e,a=de(o),[l]=e.propsOptions;let u=!1;if((r||i>0)&&!(i&16)){if(i&8){const c=e.vnode.dynamicProps;for(let d=0;d<c.length;d++){let f=c[d];if(Wo(e.emitsOptions,f))continue;const p=t[f];if(l)if(ce(s,f))p!==s[f]&&(s[f]=p,u=!0);else{const m=Ct(f);o[m]=ni(l,a,m,p,e,!1)}else p!==s[f]&&(s[f]=p,u=!0)}}}else{df(e,t,o,s)&&(u=!0);let c;for(const d in a)(!t||!ce(t,d)&&((c=xn(d))===d||!ce(t,c)))&&(l?n&&(n[d]!==void 0||n[c]!==void 0)&&(o[d]=ni(l,a,d,void 0,e,!0)):delete o[d]);if(s!==a)for(const d in s)(!t||!ce(t,d)&&!0)&&(delete s[d],u=!0)}u&&Ht(e,\"set\",\"$attrs\")}function df(e,t,n,r){const[o,s]=e.propsOptions;let i=!1,a;if(t)for(let l in t){if(go(l))continue;const u=t[l];let c;o&&ce(o,c=Ct(l))?!s||!s.includes(c)?n[c]=u:(a||(a={}))[c]=u:Wo(e.emitsOptions,l)||(!(l in r)||u!==r[l])&&(r[l]=u,i=!0)}if(s){const l=de(n),u=a||Se;for(let c=0;c<s.length;c++){const d=s[c];n[d]=ni(o,l,d,u[d],e,!ce(u,d))}}return i}function ni(e,t,n,r,o,s){const i=e[n];if(i!=null){const a=ce(i,\"default\");if(a&&r===void 0){const l=i.default;if(i.type!==Function&&te(l)){const{propsDefaults:u}=o;n in u?r=u[n]:(ln(o),r=u[n]=l.call(null,t),on())}else r=l}i[0]&&(s&&!a?r=!1:i[1]&&(r===\"\"||r===xn(n))&&(r=!0))}return r}function pf(e,t,n=!1){const r=t.propsCache,o=r.get(e);if(o)return o;const s=e.props,i={},a=[];let l=!1;if(!te(e)){const c=d=>{l=!0;const[f,p]=pf(d,t,!0);He(i,f),p&&a.push(...p)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!s&&!l)return ve(e)&&r.set(e,Yn),Yn;if(X(s))for(let c=0;c<s.length;c++){const d=Ct(s[c]);al(d)&&(i[d]=Se)}else if(s)for(const c in s){const d=Ct(c);if(al(d)){const f=s[c],p=i[d]=X(f)||te(f)?{type:f}:f;if(p){const m=cl(Boolean,p.type),_=cl(String,p.type);p[0]=m>-1,p[1]=_<0||m<_,(m>-1||ce(p,\"default\"))&&a.push(d)}}}const u=[i,a];return ve(e)&&r.set(e,u),u}function al(e){return e[0]!==\"$\"}function ll(e){const t=e&&e.toString().match(/^\\s*function (\\w+)/);return t?t[1]:e===null?\"null\":\"\"}function ul(e,t){return ll(e)===ll(t)}function cl(e,t){return X(t)?t.findIndex(n=>ul(n,e)):te(t)&&ul(t,e)?0:-1}const hf=e=>e[0]===\"_\"||e===\"$stable\",na=e=>X(e)?e.map(wt):[wt(e)],d0=(e,t,n)=>{if(t._n)return t;const r=re((...o)=>na(t(...o)),n);return r._c=!1,r},mf=(e,t,n)=>{const r=e._ctx;for(const o in e){if(hf(o))continue;const s=e[o];if(te(s))t[o]=d0(o,s,r);else if(s!=null){const i=na(s);t[o]=()=>i}}},vf=(e,t)=>{const n=na(t);e.slots.default=()=>n},p0=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=de(t),xo(t,\"_\",n)):mf(t,e.slots={})}else e.slots={},t&&vf(e,t);xo(e.slots,ts,1)},h0=(e,t,n)=>{const{vnode:r,slots:o}=e;let s=!0,i=Se;if(r.shapeFlag&32){const a=t._;a?n&&a===1?s=!1:(He(o,t),!n&&a===1&&delete o._):(s=!t.$stable,mf(t,o)),i=t}else t&&(vf(e,t),i={default:1});if(s)for(const a in o)!hf(a)&&!(a in i)&&delete o[a]};function gf(){return{app:null,config:{isNativeTag:Dp,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let m0=0;function v0(e,t){return function(r,o=null){te(r)||(r=Object.assign({},r)),o!=null&&!ve(o)&&(o=null);const s=gf(),i=new Set;let a=!1;const l=s.app={_uid:m0++,_component:r,_props:o,_container:null,_context:s,_instance:null,version:I0,get config(){return s.config},set config(u){},use(u,...c){return i.has(u)||(u&&te(u.install)?(i.add(u),u.install(l,...c)):te(u)&&(i.add(u),u(l,...c))),l},mixin(u){return s.mixins.includes(u)||s.mixins.push(u),l},component(u,c){return c?(s.components[u]=c,l):s.components[u]},directive(u,c){return c?(s.directives[u]=c,l):s.directives[u]},mount(u,c,d){if(!a){const f=ee(r,o);return f.appContext=s,c&&t?t(f,u):e(f,u,d),a=!0,l._container=u,u.__vue_app__=l,rs(f.component)||f.component.proxy}},unmount(){a&&(e(null,l._container),delete l._container.__vue_app__)},provide(u,c){return s.provides[u]=c,l}};return l}}function ri(e,t,n,r,o=!1){if(X(e)){e.forEach((f,p)=>ri(f,t&&(X(t)?t[p]:t),n,r,o));return}if(Cr(r)&&!o)return;const s=r.shapeFlag&4?rs(r.component)||r.component.proxy:r.el,i=o?null:s,{i:a,r:l}=e,u=t&&t.r,c=a.refs===Se?a.refs={}:a.refs,d=a.setupState;if(u!=null&&u!==l&&(be(u)?(c[u]=null,ce(d,u)&&(d[u]=null)):Pe(u)&&(u.value=null)),te(l))Nt(l,a,12,[i,c]);else{const f=be(l),p=Pe(l);if(f||p){const m=()=>{if(e.f){const _=f?c[l]:l.value;o?X(_)&&Ui(_,s):X(_)?_.includes(s)||_.push(s):f?(c[l]=[s],ce(d,l)&&(d[l]=c[l])):(l.value=[s],e.k&&(c[e.k]=l.value))}else f?(c[l]=i,ce(d,l)&&(d[l]=i)):p&&(l.value=i,e.k&&(c[e.k]=i))};i?(m.id=-1,Qe(m,n)):m()}}}const Qe=Vh;function g0(e){return _0(e)}function _0(e,t){const n=Kp();n.__VUE__=!0;const{insert:r,remove:o,patchProp:s,createElement:i,createText:a,createComment:l,setText:u,setElementText:c,parentNode:d,nextSibling:f,setScopeId:p=me,insertStaticContent:m}=e,_=(h,g,k,O=null,U=null,D=null,z=!1,F=null,H=!!g.dynamicChildren)=>{if(h===g)return;h&&!Tt(h,g)&&(O=j(h),Ze(h,U,D,!0),h=null),g.patchFlag===-2&&(H=!1,g.dynamicChildren=null);const{type:M,ref:G,shapeFlag:Y}=g;switch(M){case es:S(h,g,k,O);break;case rt:y(h,g,k,O);break;case bo:h==null&&E(g,k,O,z);break;case Ie:B(h,g,k,O,U,D,z,F,H);break;default:Y&1?b(h,g,k,O,U,D,z,F,H):Y&6?ne(h,g,k,O,U,D,z,F,H):(Y&64||Y&128)&&M.process(h,g,k,O,U,D,z,F,H,he)}G!=null&&U&&ri(G,h&&h.ref,D,g||h,!g)},S=(h,g,k,O)=>{if(h==null)r(g.el=a(g.children),k,O);else{const U=g.el=h.el;g.children!==h.children&&u(U,g.children)}},y=(h,g,k,O)=>{h==null?r(g.el=l(g.children||\"\"),k,O):g.el=h.el},E=(h,g,k,O)=>{[h.el,h.anchor]=m(h.children,g,k,O,h.el,h.anchor)},w=({el:h,anchor:g},k,O)=>{let U;for(;h&&h!==g;)U=f(h),r(h,k,O),h=U;r(g,k,O)},x=({el:h,anchor:g})=>{let k;for(;h&&h!==g;)k=f(h),o(h),h=k;o(g)},b=(h,g,k,O,U,D,z,F,H)=>{z=z||g.type===\"svg\",h==null?L(g,k,O,U,D,z,F,H):T(h,g,U,D,z,F,H)},L=(h,g,k,O,U,D,z,F)=>{let H,M;const{type:G,props:Y,shapeFlag:Q,transition:oe,dirs:ue}=h;if(H=h.el=i(h.type,D,Y&&Y.is,Y),Q&8?c(H,h.children):Q&16&&C(h.children,H,null,O,U,D&&G!==\"foreignObject\",z,F),ue&&pn(h,null,O,\"created\"),Y){for(const ye in Y)ye!==\"value\"&&!go(ye)&&s(H,ye,null,Y[ye],D,h.children,O,U,V);\"value\"in Y&&s(H,\"value\",null,Y.value),(M=Y.onVnodeBeforeMount)&&Ot(M,O,h)}P(H,h,h.scopeId,z,O),ue&&pn(h,null,O,\"beforeMount\");const ke=(!U||U&&!U.pendingBranch)&&oe&&!oe.persisted;ke&&oe.beforeEnter(H),r(H,g,k),((M=Y&&Y.onVnodeMounted)||ke||ue)&&Qe(()=>{M&&Ot(M,O,h),ke&&oe.enter(H),ue&&pn(h,null,O,\"mounted\")},U)},P=(h,g,k,O,U)=>{if(k&&p(h,k),O)for(let D=0;D<O.length;D++)p(h,O[D]);if(U){let D=U.subTree;if(g===D){const z=U.vnode;P(h,z,z.scopeId,z.slotScopeIds,U.parent)}}},C=(h,g,k,O,U,D,z,F,H=0)=>{for(let M=H;M<h.length;M++){const G=h[M]=F?Xt(h[M]):wt(h[M]);_(null,G,g,k,O,U,D,z,F)}},T=(h,g,k,O,U,D,z)=>{const F=g.el=h.el;let{patchFlag:H,dynamicChildren:M,dirs:G}=g;H|=h.patchFlag&16;const Y=h.props||Se,Q=g.props||Se;let oe;k&&hn(k,!1),(oe=Q.onVnodeBeforeUpdate)&&Ot(oe,k,g,h),G&&pn(g,h,k,\"beforeUpdate\"),k&&hn(k,!0);const ue=U&&g.type!==\"foreignObject\";if(M?N(h.dynamicChildren,M,F,k,O,ue,D):z||_e(h,g,F,null,k,O,ue,D,!1),H>0){if(H&16)q(F,g,Y,Q,k,O,U);else if(H&2&&Y.class!==Q.class&&s(F,\"class\",null,Q.class,U),H&4&&s(F,\"style\",Y.style,Q.style,U),H&8){const ke=g.dynamicProps;for(let ye=0;ye<ke.length;ye++){const Me=ke[ye],_t=Y[Me],Mn=Q[Me];(Mn!==_t||Me===\"value\")&&s(F,Me,_t,Mn,U,h.children,k,O,V)}}H&1&&h.children!==g.children&&c(F,g.children)}else!z&&M==null&&q(F,g,Y,Q,k,O,U);((oe=Q.onVnodeUpdated)||G)&&Qe(()=>{oe&&Ot(oe,k,g,h),G&&pn(g,h,k,\"updated\")},O)},N=(h,g,k,O,U,D,z)=>{for(let F=0;F<g.length;F++){const H=h[F],M=g[F],G=H.el&&(H.type===Ie||!Tt(H,M)||H.shapeFlag&70)?d(H.el):k;_(H,M,G,null,O,U,D,z,!0)}},q=(h,g,k,O,U,D,z)=>{if(k!==O){if(k!==Se)for(const F in k)!go(F)&&!(F in O)&&s(h,F,k[F],null,z,g.children,U,D,V);for(const F in O){if(go(F))continue;const H=O[F],M=k[F];H!==M&&F!==\"value\"&&s(h,F,M,H,z,g.children,U,D,V)}\"value\"in O&&s(h,\"value\",k.value,O.value)}},B=(h,g,k,O,U,D,z,F,H)=>{const M=g.el=h?h.el:a(\"\"),G=g.anchor=h?h.anchor:a(\"\");let{patchFlag:Y,dynamicChildren:Q,slotScopeIds:oe}=g;oe&&(F=F?F.concat(oe):oe),h==null?(r(M,k,O),r(G,k,O),C(g.children,k,G,U,D,z,F,H)):Y>0&&Y&64&&Q&&h.dynamicChildren?(N(h.dynamicChildren,Q,k,U,D,z,F),(g.key!=null||U&&g===U.subTree)&&ra(h,g,!0)):_e(h,g,k,G,U,D,z,F,H)},ne=(h,g,k,O,U,D,z,F,H)=>{g.slotScopeIds=F,h==null?g.shapeFlag&512?U.ctx.activate(g,k,O,z,H):se(g,k,O,U,D,z,H):Te(h,g,H)},se=(h,g,k,O,U,D,z)=>{const F=h.component=O0(h,O,U);if(Zo(h)&&(F.ctx.renderer=he),P0(F),F.asyncDep){if(U&&U.registerDep(F,we),!h.el){const H=F.subTree=ee(rt);y(null,H,g,k)}return}we(F,h,g,k,U,D,z)},Te=(h,g,k)=>{const O=g.component=h.component;if(Fh(h,g,k))if(O.asyncDep&&!O.asyncResolved){Ce(O,g,k);return}else O.next=g,Ah(O.update),O.update();else g.el=h.el,O.vnode=g},we=(h,g,k,O,U,D,z)=>{const F=()=>{if(h.isMounted){let{next:G,bu:Y,u:Q,parent:oe,vnode:ue}=h,ke=G,ye;hn(h,!1),G?(G.el=ue.el,Ce(h,G,z)):G=ue,Y&&_o(Y),(ye=G.props&&G.props.onVnodeBeforeUpdate)&&Ot(ye,oe,G,ue),hn(h,!0);const Me=_s(h),_t=h.subTree;h.subTree=Me,_(_t,Me,d(_t.el),j(_t),h,U,D),G.el=Me.el,ke===null&&Wi(h,Me.el),Q&&Qe(Q,U),(ye=G.props&&G.props.onVnodeUpdated)&&Qe(()=>Ot(ye,oe,G,ue),U)}else{let G;const{el:Y,props:Q}=g,{bm:oe,m:ue,parent:ke}=h,ye=Cr(g);if(hn(h,!1),oe&&_o(oe),!ye&&(G=Q&&Q.onVnodeBeforeMount)&&Ot(G,ke,g),hn(h,!0),Y&&ae){const Me=()=>{h.subTree=_s(h),ae(Y,h.subTree,h,U,null)};ye?g.type.__asyncLoader().then(()=>!h.isUnmounted&&Me()):Me()}else{const Me=h.subTree=_s(h);_(null,Me,k,O,h,U,D),g.el=Me.el}if(ue&&Qe(ue,U),!ye&&(G=Q&&Q.onVnodeMounted)){const Me=g;Qe(()=>Ot(G,ke,Me),U)}(g.shapeFlag&256||ke&&Cr(ke.vnode)&&ke.vnode.shapeFlag&256)&&h.a&&Qe(h.a,U),h.isMounted=!0,g=k=O=null}},H=h.effect=new Fi(F,()=>Ki(M),h.scope),M=h.update=()=>H.run();M.id=h.uid,hn(h,!0),M()},Ce=(h,g,k)=>{g.component=h;const O=h.vnode.props;h.vnode=g,h.next=null,f0(h,g.props,O,k),h0(h,g.children,k),On(),Qa(),Pn()},_e=(h,g,k,O,U,D,z,F,H=!1)=>{const M=h&&h.children,G=h?h.shapeFlag:0,Y=g.children,{patchFlag:Q,shapeFlag:oe}=g;if(Q>0){if(Q&128){dn(M,Y,k,O,U,D,z,F,H);return}else if(Q&256){vt(M,Y,k,O,U,D,z,F,H);return}}oe&8?(G&16&&V(M,U,D),Y!==M&&c(k,Y)):G&16?oe&16?dn(M,Y,k,O,U,D,z,F,H):V(M,U,D,!0):(G&8&&c(k,\"\"),oe&16&&C(Y,k,O,U,D,z,F,H))},vt=(h,g,k,O,U,D,z,F,H)=>{h=h||Yn,g=g||Yn;const M=h.length,G=g.length,Y=Math.min(M,G);let Q;for(Q=0;Q<Y;Q++){const oe=g[Q]=H?Xt(g[Q]):wt(g[Q]);_(h[Q],oe,k,null,U,D,z,F,H)}M>G?V(h,U,D,!0,!1,Y):C(g,k,O,U,D,z,F,H,Y)},dn=(h,g,k,O,U,D,z,F,H)=>{let M=0;const G=g.length;let Y=h.length-1,Q=G-1;for(;M<=Y&&M<=Q;){const oe=h[M],ue=g[M]=H?Xt(g[M]):wt(g[M]);if(Tt(oe,ue))_(oe,ue,k,null,U,D,z,F,H);else break;M++}for(;M<=Y&&M<=Q;){const oe=h[Y],ue=g[Q]=H?Xt(g[Q]):wt(g[Q]);if(Tt(oe,ue))_(oe,ue,k,null,U,D,z,F,H);else break;Y--,Q--}if(M>Y){if(M<=Q){const oe=Q+1,ue=oe<G?g[oe].el:O;for(;M<=Q;)_(null,g[M]=H?Xt(g[M]):wt(g[M]),k,ue,U,D,z,F,H),M++}}else if(M>Q)for(;M<=Y;)Ze(h[M],U,D,!0),M++;else{const oe=M,ue=M,ke=new Map;for(M=ue;M<=Q;M++){const st=g[M]=H?Xt(g[M]):wt(g[M]);st.key!=null&&ke.set(st.key,M)}let ye,Me=0;const _t=Q-ue+1;let Mn=!1,Ba=0;const vr=new Array(_t);for(M=0;M<_t;M++)vr[M]=0;for(M=oe;M<=Y;M++){const st=h[M];if(Me>=_t){Ze(st,U,D,!0);continue}let xt;if(st.key!=null)xt=ke.get(st.key);else for(ye=ue;ye<=Q;ye++)if(vr[ye-ue]===0&&Tt(st,g[ye])){xt=ye;break}xt===void 0?Ze(st,U,D,!0):(vr[xt-ue]=M+1,xt>=Ba?Ba=xt:Mn=!0,_(st,g[xt],k,null,U,D,z,F,H),Me++)}const Fa=Mn?y0(vr):Yn;for(ye=Fa.length-1,M=_t-1;M>=0;M--){const st=ue+M,xt=g[st],Na=st+1<G?g[st+1].el:O;vr[M]===0?_(null,xt,k,Na,U,D,z,F,H):Mn&&(ye<0||M!==Fa[ye]?gt(xt,k,Na,2):ye--)}}},gt=(h,g,k,O,U=null)=>{const{el:D,type:z,transition:F,children:H,shapeFlag:M}=h;if(M&6){gt(h.component.subTree,g,k,O);return}if(M&128){h.suspense.move(g,k,O);return}if(M&64){z.move(h,g,k,he);return}if(z===Ie){r(D,g,k);for(let Y=0;Y<H.length;Y++)gt(H[Y],g,k,O);r(h.anchor,g,k);return}if(z===bo){w(h,g,k);return}if(O!==2&&M&1&&F)if(O===0)F.beforeEnter(D),r(D,g,k),Qe(()=>F.enter(D),U);else{const{leave:Y,delayLeave:Q,afterLeave:oe}=F,ue=()=>r(D,g,k),ke=()=>{Y(D,()=>{ue(),oe&&oe()})};Q?Q(D,ue,ke):ke()}else r(D,g,k)},Ze=(h,g,k,O=!1,U=!1)=>{const{type:D,props:z,ref:F,children:H,dynamicChildren:M,shapeFlag:G,patchFlag:Y,dirs:Q}=h;if(F!=null&&ri(F,null,k,h,!0),G&256){g.ctx.deactivate(h);return}const oe=G&1&&Q,ue=!Cr(h);let ke;if(ue&&(ke=z&&z.onVnodeBeforeUnmount)&&Ot(ke,g,h),G&6)R(h.component,k,O);else{if(G&128){h.suspense.unmount(k,O);return}oe&&pn(h,null,g,\"beforeUnmount\"),G&64?h.type.remove(h,g,k,U,he,O):M&&(D!==Ie||Y>0&&Y&64)?V(M,g,k,!1,!0):(D===Ie&&Y&384||!U&&G&16)&&V(H,g,k),O&&Un(h)}(ue&&(ke=z&&z.onVnodeUnmounted)||oe)&&Qe(()=>{ke&&Ot(ke,g,h),oe&&pn(h,null,g,\"unmounted\")},k)},Un=h=>{const{type:g,el:k,anchor:O,transition:U}=h;if(g===Ie){no(k,O);return}if(g===bo){x(h);return}const D=()=>{o(k),U&&!U.persisted&&U.afterLeave&&U.afterLeave()};if(h.shapeFlag&1&&U&&!U.persisted){const{leave:z,delayLeave:F}=U,H=()=>z(k,D);F?F(h.el,D,H):H()}else D()},no=(h,g)=>{let k;for(;h!==g;)k=f(h),o(h),h=k;o(g)},R=(h,g,k)=>{const{bum:O,scope:U,update:D,subTree:z,um:F}=h;O&&_o(O),U.stop(),D&&(D.active=!1,Ze(z,h,g,k)),F&&Qe(F,g),Qe(()=>{h.isUnmounted=!0},g),g&&g.pendingBranch&&!g.isUnmounted&&h.asyncDep&&!h.asyncResolved&&h.suspenseId===g.pendingId&&(g.deps--,g.deps===0&&g.resolve())},V=(h,g,k,O=!1,U=!1,D=0)=>{for(let z=D;z<h.length;z++)Ze(h[z],g,k,O,U)},j=h=>h.shapeFlag&6?j(h.component.subTree):h.shapeFlag&128?h.suspense.next():f(h.anchor||h.el),Z=(h,g,k)=>{h==null?g._vnode&&Ze(g._vnode,null,null,!0):_(g._vnode||null,h,g,null,null,null,k),Qa(),Gc(),g._vnode=h},he={p:_,um:Ze,m:gt,r:Un,mt:se,mc:C,pc:_e,pbc:N,n:j,o:e};let Re,ae;return t&&([Re,ae]=t(he)),{render:Z,hydrate:Re,createApp:v0(Z,Re)}}function hn({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function ra(e,t,n=!1){const r=e.children,o=t.children;if(X(r)&&X(o))for(let s=0;s<r.length;s++){const i=r[s];let a=o[s];a.shapeFlag&1&&!a.dynamicChildren&&((a.patchFlag<=0||a.patchFlag===32)&&(a=o[s]=Xt(o[s]),a.el=i.el),n||ra(i,a))}}function y0(e){const t=e.slice(),n=[0];let r,o,s,i,a;const l=e.length;for(r=0;r<l;r++){const u=e[r];if(u!==0){if(o=n[n.length-1],e[o]<u){t[r]=o,n.push(r);continue}for(s=0,i=n.length-1;s<i;)a=s+i>>1,e[n[a]]<u?s=a+1:i=a;u<e[n[s]]&&(s>0&&(t[r]=n[s-1]),n[s]=r)}}for(s=n.length,i=n[s-1];s-- >0;)n[s]=i,i=t[i];return n}const b0=e=>e.__isTeleport,kr=e=>e&&(e.disabled||e.disabled===\"\"),fl=e=>typeof SVGElement!=\"undefined\"&&e instanceof SVGElement,oi=(e,t)=>{const n=e&&e.to;return be(n)?t?t(n):null:n},w0={__isTeleport:!0,process(e,t,n,r,o,s,i,a,l,u){const{mc:c,pc:d,pbc:f,o:{insert:p,querySelector:m,createText:_,createComment:S}}=u,y=kr(t.props);let{shapeFlag:E,children:w,dynamicChildren:x}=t;if(e==null){const b=t.el=_(\"\"),L=t.anchor=_(\"\");p(b,n,r),p(L,n,r);const P=t.target=oi(t.props,m),C=t.targetAnchor=_(\"\");P&&(p(C,P),i=i||fl(P));const T=(N,q)=>{E&16&&c(w,N,q,o,s,i,a,l)};y?T(n,L):P&&T(P,C)}else{t.el=e.el;const b=t.anchor=e.anchor,L=t.target=e.target,P=t.targetAnchor=e.targetAnchor,C=kr(e.props),T=C?n:L,N=C?b:P;if(i=i||fl(L),x?(f(e.dynamicChildren,x,T,o,s,i,a),ra(e,t,!0)):l||d(e,t,T,N,o,s,i,a,!1),y)C||co(t,n,b,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const q=t.target=oi(t.props,m);q&&co(t,q,null,u,0)}else C&&co(t,L,P,u,1)}},remove(e,t,n,r,{um:o,o:{remove:s}},i){const{shapeFlag:a,children:l,anchor:u,targetAnchor:c,target:d,props:f}=e;if(d&&s(c),(i||!kr(f))&&(s(u),a&16))for(let p=0;p<l.length;p++){const m=l[p];o(m,t,n,!0,!!m.dynamicChildren)}},move:co,hydrate:E0};function co(e,t,n,{o:{insert:r},m:o},s=2){s===0&&r(e.targetAnchor,t,n);const{el:i,anchor:a,shapeFlag:l,children:u,props:c}=e,d=s===2;if(d&&r(i,t,n),(!d||kr(c))&&l&16)for(let f=0;f<u.length;f++)o(u[f],t,n,2);d&&r(a,t,n)}function E0(e,t,n,r,o,s,{o:{nextSibling:i,parentNode:a,querySelector:l}},u){const c=t.target=oi(t.props,l);if(c){const d=c._lpa||c.firstChild;if(t.shapeFlag&16)if(kr(t.props))t.anchor=u(i(e),t,a(e),n,r,o,s),t.targetAnchor=d;else{t.anchor=i(e);let f=d;for(;f;)if(f=i(f),f&&f.nodeType===8&&f.data===\"teleport anchor\"){t.targetAnchor=f,c._lpa=t.targetAnchor&&i(t.targetAnchor);break}u(d,t,c,n,r,o,s)}}return t.anchor&&i(t.anchor)}const S0=w0,Ie=Symbol(void 0),es=Symbol(void 0),rt=Symbol(void 0),bo=Symbol(void 0),$r=[];let pt=null;function $(e=!1){$r.push(pt=e?null:[])}function _f(){$r.pop(),pt=$r[$r.length-1]||null}let tr=1;function dl(e){tr+=e}function yf(e){return e.dynamicChildren=tr>0?pt||Yn:null,_f(),tr>0&&pt&&pt.push(e),e}function I(e,t,n,r,o,s){return yf(A(e,t,n,r,o,s,!0))}function ie(e,t,n,r,o){return yf(ee(e,t,n,r,o,!0))}function kn(e){return e?e.__v_isVNode===!0:!1}function Tt(e,t){return e.type===t.type&&e.key===t.key}const ts=\"__vInternal\",bf=({key:e})=>e!=null?e:null,wo=({ref:e,ref_key:t,ref_for:n})=>e!=null?be(e)||Pe(e)||te(e)?{i:Ye,r:e,k:t,f:!!n}:e:null;function A(e,t=null,n=null,r=0,o=null,s=e===Ie?0:1,i=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&bf(t),ref:t&&wo(t),scopeId:Yo,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:r,dynamicProps:o,dynamicChildren:null,appContext:null};return a?(oa(l,n),s&128&&e.normalize(l)):n&&(l.shapeFlag|=be(n)?8:16),tr>0&&!i&&pt&&(l.patchFlag>0||s&6)&&l.patchFlag!==32&&pt.push(l),l}const ee=C0;function C0(e,t=null,n=null,r=0,o=null,s=!1){if((!e||e===uf)&&(e=rt),kn(e)){const a=an(e,t,!0);return n&&oa(a,n),tr>0&&!s&&pt&&(a.shapeFlag&6?pt[pt.indexOf(e)]=a:pt.push(a)),a.patchFlag|=-2,a}if(U0(e)&&(e=e.__vccOpts),t){t=k0(t);let{class:a,style:l}=t;a&&!be(a)&&(t.class=J(a)),ve(l)&&(Hc(l)&&!X(l)&&(l=He({},l)),t.style=Ne(l))}const i=be(e)?1:Nh(e)?128:b0(e)?64:ve(e)?4:te(e)?2:0;return A(e,t,n,r,o,i,s,!0)}function k0(e){return e?Hc(e)||ts in e?He({},e):e:null}function an(e,t,n=!1){const{props:r,ref:o,patchFlag:s,children:i}=e,a=t?Hr(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:a,key:a&&bf(a),ref:t&&t.ref?n&&o?X(o)?o.concat(wo(t)):[o,wo(t)]:wo(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ie?s===-1?16:s|16:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&an(e.ssContent),ssFallback:e.ssFallback&&an(e.ssFallback),el:e.el,anchor:e.anchor}}function rn(e=\" \",t=0){return ee(es,null,e,t)}function ns(e,t){const n=ee(bo,null,e);return n.staticCount=t,n}function le(e=\"\",t=!1){return t?($(),ie(rt,null,e)):ee(rt,null,e)}function wt(e){return e==null||typeof e==\"boolean\"?ee(rt):X(e)?ee(Ie,null,e.slice()):typeof e==\"object\"?Xt(e):ee(es,null,String(e))}function Xt(e){return e.el===null&&e.patchFlag!==-1||e.memo?e:an(e)}function oa(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(X(t))n=16;else if(typeof t==\"object\")if(r&65){const o=t.default;o&&(o._c&&(o._d=!1),oa(e,o()),o._c&&(o._d=!0));return}else{n=32;const o=t._;!o&&!(ts in t)?t._ctx=Ye:o===3&&Ye&&(Ye.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else te(t)?(t={default:t,_ctx:Ye},n=32):(t=String(t),r&64?(n=16,t=[rn(t)]):n=8);e.children=t,e.shapeFlag|=n}function Hr(...e){const t={};for(let n=0;n<e.length;n++){const r=e[n];for(const o in r)if(o===\"class\")t.class!==r.class&&(t.class=J([t.class,r.class]));else if(o===\"style\")t.style=Ne([t.style,r.style]);else if(jo(o)){const s=t[o],i=r[o];i&&s!==i&&!(X(s)&&s.includes(i))&&(t[o]=s?[].concat(s,i):i)}else o!==\"\"&&(t[o]=r[o])}return t}function Ot(e,t,n,r=null){ht(e,t,7,[n,r])}const $0=gf();let x0=0;function O0(e,t,n){const r=e.type,o=(t?t.appContext:e.appContext)||$0,s={uid:x0++,vnode:e,type:r,parent:t,appContext:o,root:null,next:null,subTree:null,effect:null,update:null,scope:new xc(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(o.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:pf(r,o),emitsOptions:ef(r,o),emit:null,emitted:null,propsDefaults:Se,inheritAttrs:r.inheritAttrs,ctx:Se,data:Se,props:Se,attrs:Se,slots:Se,refs:Se,setupState:Se,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return s.ctx={_:s},s.root=t?t.root:s,s.emit=Uh.bind(null,s),e.ce&&e.ce(s),s}let De=null;const mt=()=>De||Ye,ln=e=>{De=e,e.scope.on()},on=()=>{De&&De.scope.off(),De=null};function wf(e){return e.vnode.shapeFlag&4}let jr=!1;function P0(e,t=!1){jr=t;const{props:n,children:r}=e.vnode,o=wf(e);c0(e,n,o,t),p0(e,r);const s=o?T0(e,t):void 0;return jr=!1,s}function T0(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=er(new Proxy(e.ctx,o0));const{setup:r}=n;if(r){const o=e.setupContext=r.length>1?Sf(e):null;ln(e),On();const s=Nt(r,e,0,[e.props,o]);if(Pn(),on(),Mi(s)){if(s.then(on,on),t)return s.then(i=>{si(e,i,t)}).catch(i=>{Xr(i,e,0)});e.asyncDep=s}else si(e,s,t)}else Ef(e,t)}function si(e,t,n){te(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:ve(t)&&(e.setupState=Vc(t)),Ef(e,n)}let pl;function Ef(e,t,n){const r=e.type;if(!e.render){if(!t&&pl&&!r.render){const o=r.template||ta(e).template;if(o){const{isCustomElement:s,compilerOptions:i}=e.appContext.config,{delimiters:a,compilerOptions:l}=r,u=He(He({isCustomElement:s,delimiters:a},i),l);r.render=pl(o,u)}}e.render=r.render||me}ln(e),On(),s0(e),Pn(),on()}function R0(e){return new Proxy(e.attrs,{get(t,n){return ut(e,\"get\",\"$attrs\"),t[n]}})}function Sf(e){const t=r=>{e.exposed=r||{}};let n;return{get attrs(){return n||(n=R0(e))},slots:e.slots,emit:e.emit,expose:t}}function rs(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Vc(er(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in To)return To[n](e)}}))}const A0=/(?:^|[-_])(\\w)/g,L0=e=>e.replace(A0,t=>t.toUpperCase()).replace(/[-_]/g,\"\");function Cf(e,t=!0){return te(e)?e.displayName||e.name:e.name||t&&e.__name}function kf(e,t,n=!1){let r=Cf(t);if(!r&&t.__file){const o=t.__file.match(/([^/\\\\]+)\\.\\w+$/);o&&(r=o[1])}if(!r&&e&&e.parent){const o=s=>{for(const i in s)if(s[i]===t)return i};r=o(e.components||e.parent.type.components)||o(e.appContext.components)}return r?L0(r):n?\"App\":\"Anonymous\"}function U0(e){return te(e)&&\"__vccOpts\"in e}const K=(e,t)=>Wc(e,t,jr);function sa(){return $f().slots}function Jw(){return $f().attrs}function $f(){const e=mt();return e.setupContext||(e.setupContext=Sf(e))}function M0(e){const t=mt();let n=e();return on(),Mi(n)&&(n=n.catch(r=>{throw ln(t),r})),[n,()=>ln(t)]}function os(e,t,n){const r=arguments.length;return r===2?ve(t)&&!X(t)?kn(t)?ee(e,null,[t]):ee(e,t):ee(e,null,t):(r>3?n=Array.prototype.slice.call(arguments,2):r===3&&kn(n)&&(n=[n]),ee(e,t,n))}const I0=\"3.2.40\",B0=\"http://www.w3.org/2000/svg\",yn=typeof document!=\"undefined\"?document:null,hl=yn&&yn.createElement(\"template\"),F0={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const o=t?yn.createElementNS(B0,e):yn.createElement(e,n?{is:n}:void 0);return e===\"select\"&&r&&r.multiple!=null&&o.setAttribute(\"multiple\",r.multiple),o},createText:e=>yn.createTextNode(e),createComment:e=>yn.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>yn.querySelector(e),setScopeId(e,t){e.setAttribute(t,\"\")},insertStaticContent(e,t,n,r,o,s){const i=n?n.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),n),!(o===s||!(o=o.nextSibling)););else{hl.innerHTML=r?`<svg>${e}</svg>`:e;const a=hl.content;if(r){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,n)}return[i?i.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function N0(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(\" \")),t==null?e.removeAttribute(\"class\"):n?e.setAttribute(\"class\",t):e.className=t}function D0(e,t,n){const r=e.style,o=be(n);if(n&&!o){for(const s in n)ii(r,s,n[s]);if(t&&!be(t))for(const s in t)n[s]==null&&ii(r,s,\"\")}else{const s=r.display;o?t!==n&&(r.cssText=n):t&&e.removeAttribute(\"style\"),\"_vod\"in e&&(r.display=s)}}const ml=/\\s*!important$/;function ii(e,t,n){if(X(n))n.forEach(r=>ii(e,t,r));else if(n==null&&(n=\"\"),t.startsWith(\"--\"))e.setProperty(t,n);else{const r=H0(e,t);ml.test(n)?e.setProperty(xn(r),n.replace(ml,\"\"),\"important\"):e[r]=n}}const vl=[\"Webkit\",\"Moz\",\"ms\"],bs={};function H0(e,t){const n=bs[t];if(n)return n;let r=Ct(t);if(r!==\"filter\"&&r in e)return bs[t]=r;r=qo(r);for(let o=0;o<vl.length;o++){const s=vl[o]+r;if(s in e)return bs[t]=s}return t}const gl=\"http://www.w3.org/1999/xlink\";function j0(e,t,n,r,o){if(r&&t.startsWith(\"xlink:\"))n==null?e.removeAttributeNS(gl,t.slice(6,t.length)):e.setAttributeNS(gl,t,n);else{const s=Mp(t);n==null||s&&!Sc(n)?e.removeAttribute(t):e.setAttribute(t,s?\"\":n)}}function z0(e,t,n,r,o,s,i){if(t===\"innerHTML\"||t===\"textContent\"){r&&i(r,o,s),e[t]=n==null?\"\":n;return}if(t===\"value\"&&e.tagName!==\"PROGRESS\"&&!e.tagName.includes(\"-\")){e._value=n;const l=n==null?\"\":n;(e.value!==l||e.tagName===\"OPTION\")&&(e.value=l),n==null&&e.removeAttribute(t);return}let a=!1;if(n===\"\"||n==null){const l=typeof e[t];l===\"boolean\"?n=Sc(n):n==null&&l===\"string\"?(n=\"\",a=!0):l===\"number\"&&(n=0,a=!0)}try{e[t]=n}catch(l){}a&&e.removeAttribute(t)}const[xf,q0]=(()=>{let e=Date.now,t=!1;if(typeof window!=\"undefined\"){Date.now()>document.createEvent(\"Event\").timeStamp&&(e=performance.now.bind(performance));const n=navigator.userAgent.match(/firefox\\/(\\d+)/i);t=!!(n&&Number(n[1])<=53)}return[e,t]})();let ai=0;const V0=Promise.resolve(),K0=()=>{ai=0},W0=()=>ai||(V0.then(K0),ai=xf());function ia(e,t,n,r){e.addEventListener(t,n,r)}function Y0(e,t,n,r){e.removeEventListener(t,n,r)}function J0(e,t,n,r,o=null){const s=e._vei||(e._vei={}),i=s[t];if(r&&i)i.value=r;else{const[a,l]=X0(t);if(r){const u=s[t]=Z0(r,o);ia(e,a,u,l)}else i&&(Y0(e,a,i,l),s[t]=void 0)}}const _l=/(?:Once|Passive|Capture)$/;function X0(e){let t;if(_l.test(e)){t={};let r;for(;r=e.match(_l);)e=e.slice(0,e.length-r[0].length),t[r[0].toLowerCase()]=!0}return[e[2]===\":\"?e.slice(3):xn(e.slice(2)),t]}function Z0(e,t){const n=r=>{const o=r.timeStamp||xf();(q0||o>=n.attached-1)&&ht(G0(r,n.value),t,5,[r])};return n.value=e,n.attached=W0(),n}function G0(e,t){if(X(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>o=>!o._stopped&&r&&r(o))}else return t}const yl=/^on[a-z]/,Q0=(e,t,n,r,o=!1,s,i,a,l)=>{t===\"class\"?N0(e,r,o):t===\"style\"?D0(e,n,r):jo(t)?Li(t)||J0(e,t,n,r,i):(t[0]===\".\"?(t=t.slice(1),!0):t[0]===\"^\"?(t=t.slice(1),!1):e1(e,t,r,o))?z0(e,t,r,s,i,a,l):(t===\"true-value\"?e._trueValue=r:t===\"false-value\"&&(e._falseValue=r),j0(e,t,r,o))};function e1(e,t,n,r){return r?!!(t===\"innerHTML\"||t===\"textContent\"||t in e&&yl.test(t)&&te(n)):t===\"spellcheck\"||t===\"draggable\"||t===\"translate\"||t===\"form\"||t===\"list\"&&e.tagName===\"INPUT\"||t===\"type\"&&e.tagName===\"TEXTAREA\"||yl.test(t)&&be(n)?!1:t in e}const Vt=\"transition\",gr=\"animation\",fr=(e,{slots:t})=>os(sf,Pf(e),t);fr.displayName=\"Transition\";const Of={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},t1=fr.props=He({},sf.props,Of),mn=(e,t=[])=>{X(e)?e.forEach(n=>n(...t)):e&&e(...t)},bl=e=>e?X(e)?e.some(t=>t.length>1):e.length>1:!1;function Pf(e){const t={};for(const B in e)B in Of||(t[B]=e[B]);if(e.css===!1)return t;const{name:n=\"v\",type:r,duration:o,enterFromClass:s=`${n}-enter-from`,enterActiveClass:i=`${n}-enter-active`,enterToClass:a=`${n}-enter-to`,appearFromClass:l=s,appearActiveClass:u=i,appearToClass:c=a,leaveFromClass:d=`${n}-leave-from`,leaveActiveClass:f=`${n}-leave-active`,leaveToClass:p=`${n}-leave-to`}=e,m=n1(o),_=m&&m[0],S=m&&m[1],{onBeforeEnter:y,onEnter:E,onEnterCancelled:w,onLeave:x,onLeaveCancelled:b,onBeforeAppear:L=y,onAppear:P=E,onAppearCancelled:C=w}=t,T=(B,ne,se)=>{Yt(B,ne?c:a),Yt(B,ne?u:i),se&&se()},N=(B,ne)=>{B._isLeaving=!1,Yt(B,d),Yt(B,p),Yt(B,f),ne&&ne()},q=B=>(ne,se)=>{const Te=B?P:E,we=()=>T(ne,B,se);mn(Te,[ne,we]),wl(()=>{Yt(ne,B?l:s),It(ne,B?c:a),bl(Te)||El(ne,r,_,we)})};return He(t,{onBeforeEnter(B){mn(y,[B]),It(B,s),It(B,i)},onBeforeAppear(B){mn(L,[B]),It(B,l),It(B,u)},onEnter:q(!1),onAppear:q(!0),onLeave(B,ne){B._isLeaving=!0;const se=()=>N(B,ne);It(B,d),Rf(),It(B,f),wl(()=>{!B._isLeaving||(Yt(B,d),It(B,p),bl(x)||El(B,r,S,se))}),mn(x,[B,se])},onEnterCancelled(B){T(B,!1),mn(w,[B])},onAppearCancelled(B){T(B,!0),mn(C,[B])},onLeaveCancelled(B){N(B),mn(b,[B])}})}function n1(e){if(e==null)return null;if(ve(e))return[ws(e.enter),ws(e.leave)];{const t=ws(e);return[t,t]}}function ws(e){return Vo(e)}function It(e,t){t.split(/\\s+/).forEach(n=>n&&e.classList.add(n)),(e._vtc||(e._vtc=new Set)).add(t)}function Yt(e,t){t.split(/\\s+/).forEach(r=>r&&e.classList.remove(r));const{_vtc:n}=e;n&&(n.delete(t),n.size||(e._vtc=void 0))}function wl(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let r1=0;function El(e,t,n,r){const o=e._endId=++r1,s=()=>{o===e._endId&&r()};if(n)return setTimeout(s,n);const{type:i,timeout:a,propCount:l}=Tf(e,t);if(!i)return r();const u=i+\"end\";let c=0;const d=()=>{e.removeEventListener(u,f),s()},f=p=>{p.target===e&&++c>=l&&d()};setTimeout(()=>{c<l&&d()},a+1),e.addEventListener(u,f)}function Tf(e,t){const n=window.getComputedStyle(e),r=m=>(n[m]||\"\").split(\", \"),o=r(Vt+\"Delay\"),s=r(Vt+\"Duration\"),i=Sl(o,s),a=r(gr+\"Delay\"),l=r(gr+\"Duration\"),u=Sl(a,l);let c=null,d=0,f=0;t===Vt?i>0&&(c=Vt,d=i,f=s.length):t===gr?u>0&&(c=gr,d=u,f=l.length):(d=Math.max(i,u),c=d>0?i>u?Vt:gr:null,f=c?c===Vt?s.length:l.length:0);const p=c===Vt&&/\\b(transform|all)(,|$)/.test(n[Vt+\"Property\"]);return{type:c,timeout:d,propCount:f,hasTransform:p}}function Sl(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((n,r)=>Cl(n)+Cl(e[r])))}function Cl(e){return Number(e.slice(0,-1).replace(\",\",\".\"))*1e3}function Rf(){return document.body.offsetHeight}const Af=new WeakMap,Lf=new WeakMap,o1={name:\"TransitionGroup\",props:He({},t1,{tag:String,moveClass:String}),setup(e,{slots:t}){const n=mt(),r=of();let o,s;return Zi(()=>{if(!o.length)return;const i=e.moveClass||`${e.name||\"v\"}-move`;if(!u1(o[0].el,n.vnode.el,i))return;o.forEach(i1),o.forEach(a1);const a=o.filter(l1);Rf(),a.forEach(l=>{const u=l.el,c=u.style;It(u,i),c.transform=c.webkitTransform=c.transitionDuration=\"\";const d=u._moveCb=f=>{f&&f.target!==u||(!f||/transform$/.test(f.propertyName))&&(u.removeEventListener(\"transitionend\",d),u._moveCb=null,Yt(u,i))};u.addEventListener(\"transitionend\",d)})}),()=>{const i=de(e),a=Pf(i);let l=i.tag||Ie;o=s,s=t.default?Xi(t.default()):[];for(let u=0;u<s.length;u++){const c=s[u];c.key!=null&&Dr(c,Nr(c,a,r,n))}if(o)for(let u=0;u<o.length;u++){const c=o[u];Dr(c,Nr(c,a,r,n)),Af.set(c,c.el.getBoundingClientRect())}return ee(l,null,s)}}},s1=o1;function i1(e){const t=e.el;t._moveCb&&t._moveCb(),t._enterCb&&t._enterCb()}function a1(e){Lf.set(e,e.el.getBoundingClientRect())}function l1(e){const t=Af.get(e),n=Lf.get(e),r=t.left-n.left,o=t.top-n.top;if(r||o){const s=e.el.style;return s.transform=s.webkitTransform=`translate(${r}px,${o}px)`,s.transitionDuration=\"0s\",e}}function u1(e,t,n){const r=e.cloneNode();e._vtc&&e._vtc.forEach(i=>{i.split(/\\s+/).forEach(a=>a&&r.classList.remove(a))}),n.split(/\\s+/).forEach(i=>i&&r.classList.add(i)),r.style.display=\"none\";const o=t.nodeType===1?t:t.parentNode;o.appendChild(r);const{hasTransform:s}=Tf(r);return o.removeChild(r),s}const Ao=e=>{const t=e.props[\"onUpdate:modelValue\"]||!1;return X(t)?n=>_o(t,n):t},Xw={deep:!0,created(e,t,n){e._assign=Ao(n),ia(e,\"change\",()=>{const r=e._modelValue,o=zr(e),s=e.checked,i=e._assign;if(X(r)){const a=Ai(r,o),l=a!==-1;if(s&&!l)i(r.concat(o));else if(!s&&l){const u=[...r];u.splice(a,1),i(u)}}else if(cr(r)){const a=new Set(r);s?a.add(o):a.delete(o),i(a)}else i(Uf(e,s))})},mounted:kl,beforeUpdate(e,t,n){e._assign=Ao(n),kl(e,t,n)}};function kl(e,{value:t,oldValue:n},r){e._modelValue=t,X(t)?e.checked=Ai(t,r.props.value)>-1:cr(t)?e.checked=t.has(r.props.value):t!==n&&(e.checked=Yr(t,Uf(e,!0)))}const Zw={deep:!0,created(e,{value:t,modifiers:{number:n}},r){const o=cr(t);ia(e,\"change\",()=>{const s=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>n?Vo(zr(i)):zr(i));e._assign(e.multiple?o?new Set(s):s:s[0])}),e._assign=Ao(r)},mounted(e,{value:t}){$l(e,t)},beforeUpdate(e,t,n){e._assign=Ao(n)},updated(e,{value:t}){$l(e,t)}};function $l(e,t){const n=e.multiple;if(!(n&&!X(t)&&!cr(t))){for(let r=0,o=e.options.length;r<o;r++){const s=e.options[r],i=zr(s);if(n)X(t)?s.selected=Ai(t,i)>-1:s.selected=t.has(i);else if(Yr(zr(s),t)){e.selectedIndex!==r&&(e.selectedIndex=r);return}}!n&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function zr(e){return\"_value\"in e?e._value:e.value}function Uf(e,t){const n=t?\"_trueValue\":\"_falseValue\";return n in e?e[n]:t}const c1=[\"ctrl\",\"shift\",\"alt\",\"meta\"],f1={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>\"button\"in e&&e.button!==0,middle:e=>\"button\"in e&&e.button!==1,right:e=>\"button\"in e&&e.button!==2,exact:(e,t)=>c1.some(n=>e[`${n}Key`]&&!t.includes(n))},Dt=(e,t)=>(n,...r)=>{for(let o=0;o<t.length;o++){const s=f1[t[o]];if(s&&s(n,t))return}return e(n,...r)},d1={esc:\"escape\",space:\" \",up:\"arrow-up\",left:\"arrow-left\",right:\"arrow-right\",down:\"arrow-down\",delete:\"backspace\"},Mf=(e,t)=>n=>{if(!(\"key\"in n))return;const r=xn(n.key);if(t.some(o=>o===r||d1[o]===r))return e(n)},Gr={beforeMount(e,{value:t},{transition:n}){e._vod=e.style.display===\"none\"?\"\":e.style.display,n&&t?n.beforeEnter(e):_r(e,t)},mounted(e,{value:t},{transition:n}){n&&t&&n.enter(e)},updated(e,{value:t,oldValue:n},{transition:r}){!t!=!n&&(r?t?(r.beforeEnter(e),_r(e,!0),r.enter(e)):r.leave(e,()=>{_r(e,!1)}):_r(e,t))},beforeUnmount(e,{value:t}){_r(e,t)}};function _r(e,t){e.style.display=t?e._vod:\"none\"}const p1=He({patchProp:Q0},F0);let xl;function If(){return xl||(xl=g0(p1))}const nr=(...e)=>{If().render(...e)},Bf=(...e)=>{const t=If().createApp(...e),{mount:n}=t;return t.mount=r=>{const o=h1(r);if(!o)return;const s=t._component;!te(s)&&!s.render&&!s.template&&(s.template=o.innerHTML),o.innerHTML=\"\";const i=n(o,!1,o instanceof SVGElement);return o instanceof Element&&(o.removeAttribute(\"v-cloak\"),o.setAttribute(\"data-v-app\",\"\")),i},t};function h1(e){return be(e)?document.querySelector(e):e}const Le=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n},m1={},v1={id:\"main\"};function g1(e,t){const n=yo(\"router-view\");return $(),I(\"div\",v1,[ee(n,{name:\"default\"},{default:re(({Component:r,route:o})=>[($(),ie(tf,null,{default:re(()=>[($(),ie(Cn(r)))]),_:2},1024))]),_:1})])}const _1=Le(m1,[[\"render\",g1],[\"__scopeId\",\"data-v-56bb5d38\"]]),y1=\"modulepreload\",b1=function(e){return\"/\"+e},Ol={},In=function(t,n,r){return!n||n.length===0?t():Promise.all(n.map(o=>{if(o=b1(o),o in Ol)return;Ol[o]=!0;const s=o.endsWith(\".css\"),i=s?'[rel=\"stylesheet\"]':\"\";if(document.querySelector(`link[href=\"${o}\"]${i}`))return;const a=document.createElement(\"link\");if(a.rel=s?\"stylesheet\":y1,s||(a.as=\"script\",a.crossOrigin=\"\"),a.href=o,document.head.appendChild(a),s)return new Promise((l,u)=>{a.addEventListener(\"load\",l),a.addEventListener(\"error\",()=>u(new Error(`Unable to preload CSS for ${o}`)))})})).then(()=>t())};/*!\n  * vue-router v4.1.5\n  * (c) 2022 Eduardo San Martin Morote\n  * @license MIT\n  */const jn=typeof window!=\"undefined\";function w1(e){return e.__esModule||e[Symbol.toStringTag]===\"Module\"}const ge=Object.assign;function Es(e,t){const n={};for(const r in t){const o=t[r];n[r]=kt(o)?o.map(e):e(o)}return n}const xr=()=>{},kt=Array.isArray,E1=/\\/$/,S1=e=>e.replace(E1,\"\");function Ss(e,t,n=\"/\"){let r,o={},s=\"\",i=\"\";const a=t.indexOf(\"#\");let l=t.indexOf(\"?\");return a<l&&a>=0&&(l=-1),l>-1&&(r=t.slice(0,l),s=t.slice(l+1,a>-1?a:t.length),o=e(s)),a>-1&&(r=r||t.slice(0,a),i=t.slice(a,t.length)),r=x1(r!=null?r:t,n),{fullPath:r+(s&&\"?\")+s+i,path:r,query:o,hash:i}}function C1(e,t){const n=t.query?e(t.query):\"\";return t.path+(n&&\"?\")+n+(t.hash||\"\")}function Pl(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||\"/\"}function k1(e,t,n){const r=t.matched.length-1,o=n.matched.length-1;return r>-1&&r===o&&rr(t.matched[r],n.matched[o])&&Ff(t.params,n.params)&&e(t.query)===e(n.query)&&t.hash===n.hash}function rr(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function Ff(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const n in e)if(!$1(e[n],t[n]))return!1;return!0}function $1(e,t){return kt(e)?Tl(e,t):kt(t)?Tl(t,e):e===t}function Tl(e,t){return kt(t)?e.length===t.length&&e.every((n,r)=>n===t[r]):e.length===1&&e[0]===t}function x1(e,t){if(e.startsWith(\"/\"))return e;if(!e)return t;const n=t.split(\"/\"),r=e.split(\"/\");let o=n.length-1,s,i;for(s=0;s<r.length;s++)if(i=r[s],i!==\".\")if(i===\"..\")o>1&&o--;else break;return n.slice(0,o).join(\"/\")+\"/\"+r.slice(s-(s===r.length?1:0)).join(\"/\")}var qr;(function(e){e.pop=\"pop\",e.push=\"push\"})(qr||(qr={}));var Or;(function(e){e.back=\"back\",e.forward=\"forward\",e.unknown=\"\"})(Or||(Or={}));function O1(e){if(!e)if(jn){const t=document.querySelector(\"base\");e=t&&t.getAttribute(\"href\")||\"/\",e=e.replace(/^\\w+:\\/\\/[^\\/]+/,\"\")}else e=\"/\";return e[0]!==\"/\"&&e[0]!==\"#\"&&(e=\"/\"+e),S1(e)}const P1=/^[^#]+#/;function T1(e,t){return e.replace(P1,\"#\")+t}function R1(e,t){const n=document.documentElement.getBoundingClientRect(),r=e.getBoundingClientRect();return{behavior:t.behavior,left:r.left-n.left-(t.left||0),top:r.top-n.top-(t.top||0)}}const ss=()=>({left:window.pageXOffset,top:window.pageYOffset});function A1(e){let t;if(\"el\"in e){const n=e.el,r=typeof n==\"string\"&&n.startsWith(\"#\"),o=typeof n==\"string\"?r?document.getElementById(n.slice(1)):document.querySelector(n):n;if(!o)return;t=R1(o,e)}else t=e;\"scrollBehavior\"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function Rl(e,t){return(history.state?history.state.position-t:-1)+e}const li=new Map;function L1(e,t){li.set(e,t)}function U1(e){const t=li.get(e);return li.delete(e),t}let M1=()=>location.protocol+\"//\"+location.host;function Nf(e,t){const{pathname:n,search:r,hash:o}=t,s=e.indexOf(\"#\");if(s>-1){let a=o.includes(e.slice(s))?e.slice(s).length:1,l=o.slice(a);return l[0]!==\"/\"&&(l=\"/\"+l),Pl(l,\"\")}return Pl(n,e)+r+o}function I1(e,t,n,r){let o=[],s=[],i=null;const a=({state:f})=>{const p=Nf(e,location),m=n.value,_=t.value;let S=0;if(f){if(n.value=p,t.value=f,i&&i===m){i=null;return}S=_?f.position-_.position:0}else r(p);o.forEach(y=>{y(n.value,m,{delta:S,type:qr.pop,direction:S?S>0?Or.forward:Or.back:Or.unknown})})};function l(){i=n.value}function u(f){o.push(f);const p=()=>{const m=o.indexOf(f);m>-1&&o.splice(m,1)};return s.push(p),p}function c(){const{history:f}=window;!f.state||f.replaceState(ge({},f.state,{scroll:ss()}),\"\")}function d(){for(const f of s)f();s=[],window.removeEventListener(\"popstate\",a),window.removeEventListener(\"beforeunload\",c)}return window.addEventListener(\"popstate\",a),window.addEventListener(\"beforeunload\",c),{pauseListeners:l,listen:u,destroy:d}}function Al(e,t,n,r=!1,o=!1){return{back:e,current:t,forward:n,replaced:r,position:window.history.length,scroll:o?ss():null}}function B1(e){const{history:t,location:n}=window,r={value:Nf(e,n)},o={value:t.state};o.value||s(r.value,{back:null,current:r.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function s(l,u,c){const d=e.indexOf(\"#\"),f=d>-1?(n.host&&document.querySelector(\"base\")?e:e.slice(d))+l:M1()+e+l;try{t[c?\"replaceState\":\"pushState\"](u,\"\",f),o.value=u}catch(p){console.error(p),n[c?\"replace\":\"assign\"](f)}}function i(l,u){const c=ge({},t.state,Al(o.value.back,l,o.value.forward,!0),u,{position:o.value.position});s(l,c,!0),r.value=l}function a(l,u){const c=ge({},o.value,t.state,{forward:l,scroll:ss()});s(c.current,c,!0);const d=ge({},Al(r.value,l,null),{position:c.position+1},u);s(l,d,!1),r.value=l}return{location:r,state:o,push:a,replace:i}}function Df(e){e=O1(e);const t=B1(e),n=I1(e,t.state,t.location,t.replace);function r(s,i=!0){i||n.pauseListeners(),history.go(s)}const o=ge({location:\"\",base:e,go:r,createHref:T1.bind(null,e)},t,n);return Object.defineProperty(o,\"location\",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(o,\"state\",{enumerable:!0,get:()=>t.state.value}),o}function F1(e){return e=location.host?e||location.pathname+location.search:\"\",e.includes(\"#\")||(e+=\"#\"),Df(e)}function N1(e){return typeof e==\"string\"||e&&typeof e==\"object\"}function Hf(e){return typeof e==\"string\"||typeof e==\"symbol\"}const Kt={path:\"/\",name:void 0,params:{},query:{},hash:\"\",fullPath:\"/\",matched:[],meta:{},redirectedFrom:void 0},jf=Symbol(\"\");var Ll;(function(e){e[e.aborted=4]=\"aborted\",e[e.cancelled=8]=\"cancelled\",e[e.duplicated=16]=\"duplicated\"})(Ll||(Ll={}));function or(e,t){return ge(new Error,{type:e,[jf]:!0},t)}function Ut(e,t){return e instanceof Error&&jf in e&&(t==null||!!(e.type&t))}const Ul=\"[^/]+?\",D1={sensitive:!1,strict:!1,start:!0,end:!0},H1=/[.+*?^${}()[\\]/\\\\]/g;function j1(e,t){const n=ge({},D1,t),r=[];let o=n.start?\"^\":\"\";const s=[];for(const u of e){const c=u.length?[]:[90];n.strict&&!u.length&&(o+=\"/\");for(let d=0;d<u.length;d++){const f=u[d];let p=40+(n.sensitive?.25:0);if(f.type===0)d||(o+=\"/\"),o+=f.value.replace(H1,\"\\\\$&\"),p+=40;else if(f.type===1){const{value:m,repeatable:_,optional:S,regexp:y}=f;s.push({name:m,repeatable:_,optional:S});const E=y||Ul;if(E!==Ul){p+=10;try{new RegExp(`(${E})`)}catch(x){throw new Error(`Invalid custom RegExp for param \"${m}\" (${E}): `+x.message)}}let w=_?`((?:${E})(?:/(?:${E}))*)`:`(${E})`;d||(w=S&&u.length<2?`(?:/${w})`:\"/\"+w),S&&(w+=\"?\"),o+=w,p+=20,S&&(p+=-8),_&&(p+=-20),E===\".*\"&&(p+=-50)}c.push(p)}r.push(c)}if(n.strict&&n.end){const u=r.length-1;r[u][r[u].length-1]+=.7000000000000001}n.strict||(o+=\"/?\"),n.end?o+=\"$\":n.strict&&(o+=\"(?:/|$)\");const i=new RegExp(o,n.sensitive?\"\":\"i\");function a(u){const c=u.match(i),d={};if(!c)return null;for(let f=1;f<c.length;f++){const p=c[f]||\"\",m=s[f-1];d[m.name]=p&&m.repeatable?p.split(\"/\"):p}return d}function l(u){let c=\"\",d=!1;for(const f of e){(!d||!c.endsWith(\"/\"))&&(c+=\"/\"),d=!1;for(const p of f)if(p.type===0)c+=p.value;else if(p.type===1){const{value:m,repeatable:_,optional:S}=p,y=m in u?u[m]:\"\";if(kt(y)&&!_)throw new Error(`Provided param \"${m}\" is an array but it is not repeatable (* or + modifiers)`);const E=kt(y)?y.join(\"/\"):y;if(!E)if(S)f.length<2&&(c.endsWith(\"/\")?c=c.slice(0,-1):d=!0);else throw new Error(`Missing required param \"${m}\"`);c+=E}}return c||\"/\"}return{re:i,score:r,keys:s,parse:a,stringify:l}}function z1(e,t){let n=0;for(;n<e.length&&n<t.length;){const r=t[n]-e[n];if(r)return r;n++}return e.length<t.length?e.length===1&&e[0]===40+40?-1:1:e.length>t.length?t.length===1&&t[0]===40+40?1:-1:0}function q1(e,t){let n=0;const r=e.score,o=t.score;for(;n<r.length&&n<o.length;){const s=z1(r[n],o[n]);if(s)return s;n++}if(Math.abs(o.length-r.length)===1){if(Ml(r))return 1;if(Ml(o))return-1}return o.length-r.length}function Ml(e){const t=e[e.length-1];return e.length>0&&t[t.length-1]<0}const V1={type:0,value:\"\"},K1=/[a-zA-Z0-9_]/;function W1(e){if(!e)return[[]];if(e===\"/\")return[[V1]];if(!e.startsWith(\"/\"))throw new Error(`Invalid path \"${e}\"`);function t(p){throw new Error(`ERR (${n})/\"${u}\": ${p}`)}let n=0,r=n;const o=[];let s;function i(){s&&o.push(s),s=[]}let a=0,l,u=\"\",c=\"\";function d(){!u||(n===0?s.push({type:0,value:u}):n===1||n===2||n===3?(s.length>1&&(l===\"*\"||l===\"+\")&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),s.push({type:1,value:u,regexp:c,repeatable:l===\"*\"||l===\"+\",optional:l===\"*\"||l===\"?\"})):t(\"Invalid state to consume buffer\"),u=\"\")}function f(){u+=l}for(;a<e.length;){if(l=e[a++],l===\"\\\\\"&&n!==2){r=n,n=4;continue}switch(n){case 0:l===\"/\"?(u&&d(),i()):l===\":\"?(d(),n=1):f();break;case 4:f(),n=r;break;case 1:l===\"(\"?n=2:K1.test(l)?f():(d(),n=0,l!==\"*\"&&l!==\"?\"&&l!==\"+\"&&a--);break;case 2:l===\")\"?c[c.length-1]==\"\\\\\"?c=c.slice(0,-1)+l:n=3:c+=l;break;case 3:d(),n=0,l!==\"*\"&&l!==\"?\"&&l!==\"+\"&&a--,c=\"\";break;default:t(\"Unknown state\");break}}return n===2&&t(`Unfinished custom RegExp for param \"${u}\"`),d(),i(),o}function Y1(e,t,n){const r=j1(W1(e.path),n),o=ge(r,{record:e,parent:t,children:[],alias:[]});return t&&!o.record.aliasOf==!t.record.aliasOf&&t.children.push(o),o}function J1(e,t){const n=[],r=new Map;t=Fl({strict:!1,end:!0,sensitive:!1},t);function o(c){return r.get(c)}function s(c,d,f){const p=!f,m=X1(c);m.aliasOf=f&&f.record;const _=Fl(t,c),S=[m];if(\"alias\"in c){const w=typeof c.alias==\"string\"?[c.alias]:c.alias;for(const x of w)S.push(ge({},m,{components:f?f.record.components:m.components,path:x,aliasOf:f?f.record:m}))}let y,E;for(const w of S){const{path:x}=w;if(d&&x[0]!==\"/\"){const b=d.record.path,L=b[b.length-1]===\"/\"?\"\":\"/\";w.path=d.record.path+(x&&L+x)}if(y=Y1(w,d,_),f?f.alias.push(y):(E=E||y,E!==y&&E.alias.push(y),p&&c.name&&!Bl(y)&&i(c.name)),m.children){const b=m.children;for(let L=0;L<b.length;L++)s(b[L],y,f&&f.children[L])}f=f||y,l(y)}return E?()=>{i(E)}:xr}function i(c){if(Hf(c)){const d=r.get(c);d&&(r.delete(c),n.splice(n.indexOf(d),1),d.children.forEach(i),d.alias.forEach(i))}else{const d=n.indexOf(c);d>-1&&(n.splice(d,1),c.record.name&&r.delete(c.record.name),c.children.forEach(i),c.alias.forEach(i))}}function a(){return n}function l(c){let d=0;for(;d<n.length&&q1(c,n[d])>=0&&(c.record.path!==n[d].record.path||!zf(c,n[d]));)d++;n.splice(d,0,c),c.record.name&&!Bl(c)&&r.set(c.record.name,c)}function u(c,d){let f,p={},m,_;if(\"name\"in c&&c.name){if(f=r.get(c.name),!f)throw or(1,{location:c});_=f.record.name,p=ge(Il(d.params,f.keys.filter(E=>!E.optional).map(E=>E.name)),c.params&&Il(c.params,f.keys.map(E=>E.name))),m=f.stringify(p)}else if(\"path\"in c)m=c.path,f=n.find(E=>E.re.test(m)),f&&(p=f.parse(m),_=f.record.name);else{if(f=d.name?r.get(d.name):n.find(E=>E.re.test(d.path)),!f)throw or(1,{location:c,currentLocation:d});_=f.record.name,p=ge({},d.params,c.params),m=f.stringify(p)}const S=[];let y=f;for(;y;)S.unshift(y.record),y=y.parent;return{name:_,path:m,params:p,matched:S,meta:G1(S)}}return e.forEach(c=>s(c)),{addRoute:s,resolve:u,removeRoute:i,getRoutes:a,getRecordMatcher:o}}function Il(e,t){const n={};for(const r of t)r in e&&(n[r]=e[r]);return n}function X1(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:Z1(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:\"components\"in e?e.components||null:e.component&&{default:e.component}}}function Z1(e){const t={},n=e.props||!1;if(\"component\"in e)t.default=n;else for(const r in e.components)t[r]=typeof n==\"boolean\"?n:n[r];return t}function Bl(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function G1(e){return e.reduce((t,n)=>ge(t,n.meta),{})}function Fl(e,t){const n={};for(const r in e)n[r]=r in t?t[r]:e[r];return n}function zf(e,t){return t.children.some(n=>n===e||zf(e,n))}const qf=/#/g,Q1=/&/g,e2=/\\//g,t2=/=/g,n2=/\\?/g,Vf=/\\+/g,r2=/%5B/g,o2=/%5D/g,Kf=/%5E/g,s2=/%60/g,Wf=/%7B/g,i2=/%7C/g,Yf=/%7D/g,a2=/%20/g;function aa(e){return encodeURI(\"\"+e).replace(i2,\"|\").replace(r2,\"[\").replace(o2,\"]\")}function l2(e){return aa(e).replace(Wf,\"{\").replace(Yf,\"}\").replace(Kf,\"^\")}function ui(e){return aa(e).replace(Vf,\"%2B\").replace(a2,\"+\").replace(qf,\"%23\").replace(Q1,\"%26\").replace(s2,\"`\").replace(Wf,\"{\").replace(Yf,\"}\").replace(Kf,\"^\")}function u2(e){return ui(e).replace(t2,\"%3D\")}function c2(e){return aa(e).replace(qf,\"%23\").replace(n2,\"%3F\")}function f2(e){return e==null?\"\":c2(e).replace(e2,\"%2F\")}function Lo(e){try{return decodeURIComponent(\"\"+e)}catch(t){}return\"\"+e}function d2(e){const t={};if(e===\"\"||e===\"?\")return t;const r=(e[0]===\"?\"?e.slice(1):e).split(\"&\");for(let o=0;o<r.length;++o){const s=r[o].replace(Vf,\" \"),i=s.indexOf(\"=\"),a=Lo(i<0?s:s.slice(0,i)),l=i<0?null:Lo(s.slice(i+1));if(a in t){let u=t[a];kt(u)||(u=t[a]=[u]),u.push(l)}else t[a]=l}return t}function Nl(e){let t=\"\";for(let n in e){const r=e[n];if(n=u2(n),r==null){r!==void 0&&(t+=(t.length?\"&\":\"\")+n);continue}(kt(r)?r.map(s=>s&&ui(s)):[r&&ui(r)]).forEach(s=>{s!==void 0&&(t+=(t.length?\"&\":\"\")+n,s!=null&&(t+=\"=\"+s))})}return t}function p2(e){const t={};for(const n in e){const r=e[n];r!==void 0&&(t[n]=kt(r)?r.map(o=>o==null?null:\"\"+o):r==null?r:\"\"+r)}return t}const h2=Symbol(\"\"),Dl=Symbol(\"\"),is=Symbol(\"\"),la=Symbol(\"\"),ci=Symbol(\"\");function yr(){let e=[];function t(r){return e.push(r),()=>{const o=e.indexOf(r);o>-1&&e.splice(o,1)}}function n(){e=[]}return{add:t,list:()=>e,reset:n}}function Zt(e,t,n,r,o){const s=r&&(r.enterCallbacks[o]=r.enterCallbacks[o]||[]);return()=>new Promise((i,a)=>{const l=d=>{d===!1?a(or(4,{from:n,to:t})):d instanceof Error?a(d):N1(d)?a(or(2,{from:t,to:d})):(s&&r.enterCallbacks[o]===s&&typeof d==\"function\"&&s.push(d),i())},u=e.call(r&&r.instances[o],t,n,l);let c=Promise.resolve(u);e.length<3&&(c=c.then(l)),c.catch(d=>a(d))})}function Cs(e,t,n,r){const o=[];for(const s of e)for(const i in s.components){let a=s.components[i];if(!(t!==\"beforeRouteEnter\"&&!s.instances[i]))if(m2(a)){const u=(a.__vccOpts||a)[t];u&&o.push(Zt(u,n,r,s,i))}else{let l=a();o.push(()=>l.then(u=>{if(!u)return Promise.reject(new Error(`Couldn't resolve component \"${i}\" at \"${s.path}\"`));const c=w1(u)?u.default:u;s.components[i]=c;const f=(c.__vccOpts||c)[t];return f&&Zt(f,n,r,s,i)()}))}}return o}function m2(e){return typeof e==\"object\"||\"displayName\"in e||\"props\"in e||\"__vccOpts\"in e}function Hl(e){const t=Oe(is),n=Oe(la),r=K(()=>t.resolve(v(e.to))),o=K(()=>{const{matched:l}=r.value,{length:u}=l,c=l[u-1],d=n.matched;if(!c||!d.length)return-1;const f=d.findIndex(rr.bind(null,c));if(f>-1)return f;const p=jl(l[u-2]);return u>1&&jl(c)===p&&d[d.length-1].path!==p?d.findIndex(rr.bind(null,l[u-2])):f}),s=K(()=>o.value>-1&&y2(n.params,r.value.params)),i=K(()=>o.value>-1&&o.value===n.matched.length-1&&Ff(n.params,r.value.params));function a(l={}){return _2(l)?t[v(e.replace)?\"replace\":\"push\"](v(e.to)).catch(xr):Promise.resolve()}return{route:r,href:K(()=>r.value.href),isActive:s,isExactActive:i,navigate:a}}const v2=$e({name:\"RouterLink\",compatConfig:{MODE:3},props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:\"page\"}},useLink:Hl,setup(e,{slots:t}){const n=un(Hl(e)),{options:r}=Oe(is),o=K(()=>({[zl(e.activeClass,r.linkActiveClass,\"router-link-active\")]:n.isActive,[zl(e.exactActiveClass,r.linkExactActiveClass,\"router-link-exact-active\")]:n.isExactActive}));return()=>{const s=t.default&&t.default(n);return e.custom?s:os(\"a\",{\"aria-current\":n.isExactActive?e.ariaCurrentValue:null,href:n.href,onClick:n.navigate,class:o.value},s)}}}),g2=v2;function _2(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute(\"target\");if(/\\b_blank\\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function y2(e,t){for(const n in t){const r=t[n],o=e[n];if(typeof r==\"string\"){if(r!==o)return!1}else if(!kt(o)||o.length!==r.length||r.some((s,i)=>s!==o[i]))return!1}return!0}function jl(e){return e?e.aliasOf?e.aliasOf.path:e.path:\"\"}const zl=(e,t,n)=>e!=null?e:t!=null?t:n,b2=$e({name:\"RouterView\",inheritAttrs:!1,props:{name:{type:String,default:\"default\"},route:Object},compatConfig:{MODE:3},setup(e,{attrs:t,slots:n}){const r=Oe(ci),o=K(()=>e.route||r.value),s=Oe(Dl,0),i=K(()=>{let u=v(s);const{matched:c}=o.value;let d;for(;(d=c[u])&&!d.components;)u++;return u}),a=K(()=>o.value.matched[i.value]);nt(Dl,K(()=>i.value+1)),nt(h2,a),nt(ci,o);const l=W();return Ae(()=>[l.value,a.value,e.name],([u,c,d],[f,p,m])=>{c&&(c.instances[d]=u,p&&p!==c&&u&&u===f&&(c.leaveGuards.size||(c.leaveGuards=p.leaveGuards),c.updateGuards.size||(c.updateGuards=p.updateGuards))),u&&c&&(!p||!rr(c,p)||!f)&&(c.enterCallbacks[d]||[]).forEach(_=>_(u))},{flush:\"post\"}),()=>{const u=o.value,c=e.name,d=a.value,f=d&&d.components[c];if(!f)return ql(n.default,{Component:f,route:u});const p=d.props[c],m=p?p===!0?u.params:typeof p==\"function\"?p(u):p:null,S=os(f,ge({},m,t,{onVnodeUnmounted:y=>{y.component.isUnmounted&&(d.instances[c]=null)},ref:l}));return ql(n.default,{Component:S,route:u})||S}}});function ql(e,t){if(!e)return null;const n=e(t);return n.length===1?n[0]:n}const w2=b2;function E2(e){const t=J1(e.routes,e),n=e.parseQuery||d2,r=e.stringifyQuery||Nl,o=e.history,s=yr(),i=yr(),a=yr(),l=Mr(Kt);let u=Kt;jn&&e.scrollBehavior&&\"scrollRestoration\"in history&&(history.scrollRestoration=\"manual\");const c=Es.bind(null,R=>\"\"+R),d=Es.bind(null,f2),f=Es.bind(null,Lo);function p(R,V){let j,Z;return Hf(R)?(j=t.getRecordMatcher(R),Z=V):Z=R,t.addRoute(Z,j)}function m(R){const V=t.getRecordMatcher(R);V&&t.removeRoute(V)}function _(){return t.getRoutes().map(R=>R.record)}function S(R){return!!t.getRecordMatcher(R)}function y(R,V){if(V=ge({},V||l.value),typeof R==\"string\"){const h=Ss(n,R,V.path),g=t.resolve({path:h.path},V),k=o.createHref(h.fullPath);return ge(h,g,{params:f(g.params),hash:Lo(h.hash),redirectedFrom:void 0,href:k})}let j;if(\"path\"in R)j=ge({},R,{path:Ss(n,R.path,V.path).path});else{const h=ge({},R.params);for(const g in h)h[g]==null&&delete h[g];j=ge({},R,{params:d(R.params)}),V.params=d(V.params)}const Z=t.resolve(j,V),he=R.hash||\"\";Z.params=c(f(Z.params));const Re=C1(r,ge({},R,{hash:l2(he),path:Z.path})),ae=o.createHref(Re);return ge({fullPath:Re,hash:he,query:r===Nl?p2(R.query):R.query||{}},Z,{redirectedFrom:void 0,href:ae})}function E(R){return typeof R==\"string\"?Ss(n,R,l.value.path):ge({},R)}function w(R,V){if(u!==R)return or(8,{from:V,to:R})}function x(R){return P(R)}function b(R){return x(ge(E(R),{replace:!0}))}function L(R){const V=R.matched[R.matched.length-1];if(V&&V.redirect){const{redirect:j}=V;let Z=typeof j==\"function\"?j(R):j;return typeof Z==\"string\"&&(Z=Z.includes(\"?\")||Z.includes(\"#\")?Z=E(Z):{path:Z},Z.params={}),ge({query:R.query,hash:R.hash,params:\"path\"in Z?{}:R.params},Z)}}function P(R,V){const j=u=y(R),Z=l.value,he=R.state,Re=R.force,ae=R.replace===!0,h=L(j);if(h)return P(ge(E(h),{state:typeof h==\"object\"?ge({},he,h.state):he,force:Re,replace:ae}),V||j);const g=j;g.redirectedFrom=V;let k;return!Re&&k1(r,Z,j)&&(k=or(16,{to:g,from:Z}),dn(Z,Z,!0,!1)),(k?Promise.resolve(k):T(g,Z)).catch(O=>Ut(O)?Ut(O,2)?O:vt(O):Ce(O,g,Z)).then(O=>{if(O){if(Ut(O,2))return P(ge({replace:ae},E(O.to),{state:typeof O.to==\"object\"?ge({},he,O.to.state):he,force:Re}),V||g)}else O=q(g,Z,!0,ae,he);return N(g,Z,O),O})}function C(R,V){const j=w(R,V);return j?Promise.reject(j):Promise.resolve()}function T(R,V){let j;const[Z,he,Re]=S2(R,V);j=Cs(Z.reverse(),\"beforeRouteLeave\",R,V);for(const h of Z)h.leaveGuards.forEach(g=>{j.push(Zt(g,R,V))});const ae=C.bind(null,R,V);return j.push(ae),Bn(j).then(()=>{j=[];for(const h of s.list())j.push(Zt(h,R,V));return j.push(ae),Bn(j)}).then(()=>{j=Cs(he,\"beforeRouteUpdate\",R,V);for(const h of he)h.updateGuards.forEach(g=>{j.push(Zt(g,R,V))});return j.push(ae),Bn(j)}).then(()=>{j=[];for(const h of R.matched)if(h.beforeEnter&&!V.matched.includes(h))if(kt(h.beforeEnter))for(const g of h.beforeEnter)j.push(Zt(g,R,V));else j.push(Zt(h.beforeEnter,R,V));return j.push(ae),Bn(j)}).then(()=>(R.matched.forEach(h=>h.enterCallbacks={}),j=Cs(Re,\"beforeRouteEnter\",R,V),j.push(ae),Bn(j))).then(()=>{j=[];for(const h of i.list())j.push(Zt(h,R,V));return j.push(ae),Bn(j)}).catch(h=>Ut(h,8)?h:Promise.reject(h))}function N(R,V,j){for(const Z of a.list())Z(R,V,j)}function q(R,V,j,Z,he){const Re=w(R,V);if(Re)return Re;const ae=V===Kt,h=jn?history.state:{};j&&(Z||ae?o.replace(R.fullPath,ge({scroll:ae&&h&&h.scroll},he)):o.push(R.fullPath,he)),l.value=R,dn(R,V,j,ae),vt()}let B;function ne(){B||(B=o.listen((R,V,j)=>{if(!no.listening)return;const Z=y(R),he=L(Z);if(he){P(ge(he,{replace:!0}),Z).catch(xr);return}u=Z;const Re=l.value;jn&&L1(Rl(Re.fullPath,j.delta),ss()),T(Z,Re).catch(ae=>Ut(ae,12)?ae:Ut(ae,2)?(P(ae.to,Z).then(h=>{Ut(h,20)&&!j.delta&&j.type===qr.pop&&o.go(-1,!1)}).catch(xr),Promise.reject()):(j.delta&&o.go(-j.delta,!1),Ce(ae,Z,Re))).then(ae=>{ae=ae||q(Z,Re,!1),ae&&(j.delta&&!Ut(ae,8)?o.go(-j.delta,!1):j.type===qr.pop&&Ut(ae,20)&&o.go(-1,!1)),N(Z,Re,ae)}).catch(xr)}))}let se=yr(),Te=yr(),we;function Ce(R,V,j){vt(R);const Z=Te.list();return Z.length?Z.forEach(he=>he(R,V,j)):console.error(R),Promise.reject(R)}function _e(){return we&&l.value!==Kt?Promise.resolve():new Promise((R,V)=>{se.add([R,V])})}function vt(R){return we||(we=!R,ne(),se.list().forEach(([V,j])=>R?j(R):V()),se.reset()),R}function dn(R,V,j,Z){const{scrollBehavior:he}=e;if(!jn||!he)return Promise.resolve();const Re=!j&&U1(Rl(R.fullPath,0))||(Z||!j)&&history.state&&history.state.scroll||null;return jt().then(()=>he(R,V,Re)).then(ae=>ae&&A1(ae)).catch(ae=>Ce(ae,R,V))}const gt=R=>o.go(R);let Ze;const Un=new Set,no={currentRoute:l,listening:!0,addRoute:p,removeRoute:m,hasRoute:S,getRoutes:_,resolve:y,options:e,push:x,replace:b,go:gt,back:()=>gt(-1),forward:()=>gt(1),beforeEach:s.add,beforeResolve:i.add,afterEach:a.add,onError:Te.add,isReady:_e,install(R){const V=this;R.component(\"RouterLink\",g2),R.component(\"RouterView\",w2),R.config.globalProperties.$router=V,Object.defineProperty(R.config.globalProperties,\"$route\",{enumerable:!0,get:()=>v(l)}),jn&&!Ze&&l.value===Kt&&(Ze=!0,x(o.location).catch(he=>{}));const j={};for(const he in Kt)j[he]=K(()=>l.value[he]);R.provide(is,V),R.provide(la,un(j)),R.provide(ci,l);const Z=R.unmount;Un.add(R),R.unmount=function(){Un.delete(R),Un.size<1&&(u=Kt,B&&B(),B=null,l.value=Kt,Ze=!1,we=!1),Z()}}};return no}function Bn(e){return e.reduce((t,n)=>t.then(()=>n()),Promise.resolve())}function S2(e,t){const n=[],r=[],o=[],s=Math.max(t.matched.length,e.matched.length);for(let i=0;i<s;i++){const a=t.matched[i];a&&(e.matched.find(u=>rr(u,a))?r.push(a):n.push(a));const l=e.matched[i];l&&(t.matched.find(u=>rr(u,l))||o.push(l))}return[n,r,o]}function Gw(){return Oe(is)}function Qw(){return Oe(la)}const Jf=!!(window!=null&&window.path_base),C2=E2({history:Jf?Df(window.path_base):F1(),routes:[{path:\"/\",name:\"PageIndex\",component:()=>In(()=>import(\"./chunk.4ea0593d.js\"),[\"luci-static/linkeasefile/chunk.4ea0593d.js\",\"luci-static/linkeasefile/chunk.6424c2fc.js\",\"luci-static/linkeasefile/chunk.22632dc4.js\",\"luci-static/linkeasefile/chunk.4a114b4a.js\"]),children:[{path:\"\",name:\"PageIndexIndex\",component:()=>In(()=>import(\"./chunk.7191676b.js\"),[\"luci-static/linkeasefile/chunk.7191676b.js\",\"luci-static/linkeasefile/chunk.6424c2fc.js\",\"luci-static/linkeasefile/chunk.a0a5dece.js\",\"luci-static/linkeasefile/chunk.a6a47e72.js\"])},{path:\"task\",name:\"PageIndexTask\",component:()=>In(()=>import(\"./chunk.dc0a1b58.js\"),[\"luci-static/linkeasefile/chunk.dc0a1b58.js\",\"luci-static/linkeasefile/chunk.a6a47e72.js\",\"luci-static/linkeasefile/chunk.22632dc4.js\"])},{path:\"recycle\",name:\"PageIndexRecycle\",component:()=>In(()=>import(\"./chunk.c69499bb.js\"),[\"luci-static/linkeasefile/chunk.c69499bb.js\",\"luci-static/linkeasefile/chunk.6424c2fc.js\",\"luci-static/linkeasefile/chunk.a0a5dece.js\",\"luci-static/linkeasefile/chunk.a6a47e72.js\"])},{path:\"setting\",name:\"PageIndexSetting\",component:()=>In(()=>import(\"./chunk.d52f0fe8.js\"),[\"luci-static/linkeasefile/chunk.d52f0fe8.js\",\"luci-static/linkeasefile/chunk.6424c2fc.js\"])}],beforeEnter(e,t,n){return ft(this,null,function*(){n()})}},{path:\"/editor\",name:\"PageEditor\",component:()=>In(()=>import(\"./chunk.324cab41.js\"),[\"luci-static/linkeasefile/chunk.324cab41.js\",\"luci-static/linkeasefile/chunk.6424c2fc.js\",\"luci-static/linkeasefile/chunk.4a114b4a.js\"])},{path:\"/:pathMatch(.*)*\",name:\"notfound\",redirect:\"/router/index\"}]});window.getLocationPathname=e=>Jf?location.pathname+e:location.pathname+\"#/\"+e;var k2=!1;/*!\n  * pinia v2.0.23\n  * (c) 2022 Eduardo San Martin Morote\n  * @license MIT\n  */let Xf;const as=e=>Xf=e,Zf=Symbol();function fi(e){return e&&typeof e==\"object\"&&Object.prototype.toString.call(e)===\"[object Object]\"&&typeof e.toJSON!=\"function\"}var Pr;(function(e){e.direct=\"direct\",e.patchObject=\"patch object\",e.patchFunction=\"patch function\"})(Pr||(Pr={}));function $2(){const e=Oc(!0),t=e.run(()=>W({}));let n=[],r=[];const o=er({install(s){as(o),o._a=s,s.provide(Zf,o),s.config.globalProperties.$pinia=o,r.forEach(i=>n.push(i)),r=[]},use(s){return!this._a&&!k2?r.push(s):n.push(s),this},_p:n,_a:null,_e:e,_s:new Map,state:t});return o}const Gf=()=>{};function Vl(e,t,n,r=Gf){e.push(t);const o=()=>{const s=e.indexOf(t);s>-1&&(e.splice(s,1),r())};return!n&&mt()&&Qo(o),o}function Fn(e,...t){e.slice().forEach(n=>{n(...t)})}function di(e,t){e instanceof Map&&t instanceof Map&&t.forEach((n,r)=>e.set(r,n)),e instanceof Set&&t instanceof Set&&t.forEach(e.add,e);for(const n in t){if(!t.hasOwnProperty(n))continue;const r=t[n],o=e[n];fi(o)&&fi(r)&&e.hasOwnProperty(n)&&!Pe(r)&&!nn(r)?e[n]=di(o,r):e[n]=r}return e}const x2=Symbol();function O2(e){return!fi(e)||!e.hasOwnProperty(x2)}const{assign:Gt}=Object;function P2(e){return!!(Pe(e)&&e.effect)}function T2(e,t,n,r){const{state:o,actions:s,getters:i}=t,a=n.state.value[e];let l;function u(){a||(n.state.value[e]=o?o():{});const c=Eh(n.state.value[e]);return Gt(c,s,Object.keys(i||{}).reduce((d,f)=>(d[f]=er(K(()=>{as(n);const p=n._s.get(e);return i[f].call(p,p)})),d),{}))}return l=Qf(e,u,t,n,r,!0),l.$reset=function(){const d=o?o():{};this.$patch(f=>{Gt(f,d)})},l}function Qf(e,t,n={},r,o,s){let i;const a=Gt({actions:{}},n),l={deep:!0};let u,c,d=er([]),f=er([]),p;const m=r.state.value[e];!s&&!m&&(r.state.value[e]={}),W({});let _;function S(P){let C;u=c=!1,typeof P==\"function\"?(P(r.state.value[e]),C={type:Pr.patchFunction,storeId:e,events:p}):(di(r.state.value[e],P),C={type:Pr.patchObject,payload:P,storeId:e,events:p});const T=_=Symbol();jt().then(()=>{_===T&&(u=!0)}),c=!0,Fn(d,C,r.state.value[e])}const y=Gf;function E(){i.stop(),d=[],f=[],r._s.delete(e)}function w(P,C){return function(){as(r);const T=Array.from(arguments),N=[],q=[];function B(Te){N.push(Te)}function ne(Te){q.push(Te)}Fn(f,{args:T,name:P,store:b,after:B,onError:ne});let se;try{se=C.apply(this&&this.$id===e?this:b,T)}catch(Te){throw Fn(q,Te),Te}return se instanceof Promise?se.then(Te=>(Fn(N,Te),Te)).catch(Te=>(Fn(q,Te),Promise.reject(Te))):(Fn(N,se),se)}}const x={_p:r,$id:e,$onAction:Vl.bind(null,f),$patch:S,$reset:y,$subscribe(P,C={}){const T=Vl(d,P,C.detached,()=>N()),N=i.run(()=>Ae(()=>r.state.value[e],q=>{(C.flush===\"sync\"?c:u)&&P({storeId:e,type:Pr.direct,events:p},q)},Gt({},l,C)));return T},$dispose:E},b=un(x);r._s.set(e,b);const L=r._e.run(()=>(i=Oc(),i.run(()=>t())));for(const P in L){const C=L[P];if(Pe(C)&&!P2(C)||nn(C))s||(m&&O2(C)&&(Pe(C)?C.value=m[P]:di(C,m[P])),r.state.value[e][P]=C);else if(typeof C==\"function\"){const T=w(P,C);L[P]=T,a.actions[P]=C}}return Gt(b,L),Gt(de(b),L),Object.defineProperty(b,\"$state\",{get:()=>r.state.value[e],set:P=>{S(C=>{Gt(C,P)})}}),r._p.forEach(P=>{Gt(b,i.run(()=>P({store:b,app:r._a,pinia:r,options:a})))}),m&&s&&n.hydrate&&n.hydrate(b.$state,m),u=!0,c=!0,b}function e9(e,t,n){let r,o;const s=typeof t==\"function\";typeof e==\"string\"?(r=e,o=s?n:t):(o=e,r=e.id);function i(a,l){const u=mt();return a=a||u&&Oe(Zf),a&&as(a),a=Xf,a._s.has(r)||(s?Qf(r,t,o,a):T2(r,o,a)),a._s.get(r)}return i.$id=r,i}const R2={},A2={width:\"20\",height:\"20\",viewBox:\"0 0 48 48\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},L2=A(\"path\",{d:\"M44 44V20L24 4L4 20L4 44H16V26H32V44H44Z\",fill:\"none\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linejoin\":\"round\"},null,-1),U2=A(\"path\",{d:\"M24 44V34\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1),M2=[L2,U2];function I2(e,t){return $(),I(\"svg\",A2,M2)}const B2=Le(R2,[[\"render\",I2]]),F2={},N2={width:\"20\",height:\"20\",viewBox:\"0 0 48 48\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},D2=A(\"path\",{d:\"M4 9V41L9 21H39.5V15C39.5 13.8954 38.6046 13 37.5 13H24L19 7H6C4.89543 7 4 7.89543 4 9Z\",stroke:\"#333\",\"stroke-width\":\"3\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1),H2=A(\"path\",{d:\"M40 41L44 21H8.8125L4 41H40Z\",fill:\"none\",stroke:\"#333\",\"stroke-width\":\"3\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1),j2=[D2,H2];function z2(e,t){return $(),I(\"svg\",N2,j2)}const q2=Le(F2,[[\"render\",z2]]),V2={},K2={width:\"20\",height:\"20\",viewBox:\"0 0 48 48\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},W2=ns('<path d=\"M5 10L8 13L14 7\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path><path d=\"M5 24L8 27L14 21\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path><path d=\"M5 38L8 41L14 35\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path><path d=\"M21 24H43\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path><path d=\"M21 38H43\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path><path d=\"M21 10H43\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>',6),Y2=[W2];function J2(e,t){return $(),I(\"svg\",K2,Y2)}const X2=Le(V2,[[\"render\",J2]]),Z2={},G2={width:\"20\",height:\"20\",viewBox:\"0 0 48 48\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},Q2=ns('<path d=\"M9 10V44H39V10H9Z\" fill=\"none\" stroke=\"#333\" stroke-width=\"4\" stroke-linejoin=\"round\"></path><path d=\"M20 20V33\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path><path d=\"M28 20V33\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path><path d=\"M4 10H44\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path><path d=\"M16 10L19.289 4H28.7771L32 10H16Z\" fill=\"none\" stroke=\"#333\" stroke-width=\"4\" stroke-linejoin=\"round\"></path>',5),em=[Q2];function tm(e,t){return $(),I(\"svg\",G2,em)}const nm=Le(Z2,[[\"render\",tm]]),rm={},om={width:\"20\",height:\"20\",viewBox:\"0 0 48 48\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},sm=A(\"rect\",{x:\"6\",y:\"6\",width:\"36\",height:\"36\",rx:\"3\",fill:\"none\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linejoin\":\"round\"},null,-1),im=A(\"path\",{d:\"M24 16V32\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1),am=A(\"path\",{d:\"M16 24L32 24\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1),lm=[sm,im,am];function um(e,t){return $(),I(\"svg\",om,lm)}const cm=Le(rm,[[\"render\",um]]),fm={},dm={width:\"20\",height:\"20\",viewBox:\"0 0 48 48\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},pm=A(\"path\",{d:\"M5 8C5 6.89543 5.89543 6 7 6H19L24 12H41C42.1046 12 43 12.8954 43 14V40C43 41.1046 42.1046 42 41 42H7C5.89543 42 5 41.1046 5 40V8Z\",fill:\"none\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linejoin\":\"round\"},null,-1),hm=A(\"path\",{d:\"M30 25.9867L24 20L18 26\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1),mm=A(\"path\",{d:\"M24 20V34\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1),vm=[pm,hm,mm];function gm(e,t){return $(),I(\"svg\",dm,vm)}const _m=Le(fm,[[\"render\",gm]]),ym={},bm={width:\"20\",height:\"20\",viewBox:\"0 0 48 48\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},wm=A(\"path\",{d:\"M6 11.5H29\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1),Em=A(\"path\",{d:\"M6 24.5H29\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1),Sm=A(\"path\",{d:\"M36 11.5V37.5L42 30.5\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1),Cm=A(\"path\",{d:\"M6 37.5H29\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1),km=[wm,Em,Sm,Cm];function $m(e,t){return $(),I(\"svg\",bm,km)}const xm=Le(ym,[[\"render\",$m]]),Om={},Pm={width:\"20\",height:\"20\",viewBox:\"0 0 48 48\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},Tm=ns('<path d=\"M5 10L8 13L14 7\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path><path d=\"M5 24L8 27L14 21\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path><path d=\"M5 38L8 41L14 35\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path><path d=\"M21 24H43\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path><path d=\"M21 38H43\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path><path d=\"M21 10H43\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path>',6),Rm=[Tm];function Am(e,t){return $(),I(\"svg\",Pm,Rm)}const Lm=Le(Om,[[\"render\",Am]]),Um={},Mm={width:\"20\",height:\"20\",viewBox:\"0 0 48 48\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},Im=A(\"path\",{d:\"M20 6H6V17H20V6Z\",fill:\"none\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linejoin\":\"round\"},null,-1),Bm=A(\"path\",{d:\"M42 31H28V42H42V31Z\",fill:\"none\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linejoin\":\"round\"},null,-1),Fm=A(\"path\",{d:\"M42 6H28V23H42V6Z\",fill:\"none\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linejoin\":\"round\"},null,-1),Nm=A(\"path\",{d:\"M20 25H6V42H20V25Z\",fill:\"none\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linejoin\":\"round\"},null,-1),Dm=[Im,Bm,Fm,Nm];function Hm(e,t){return $(),I(\"svg\",Mm,Dm)}const jm=Le(Um,[[\"render\",Hm]]),zm={},qm={width:\"20\",height:\"20\",viewBox:\"0 0 48 48\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},Vm=A(\"rect\",{x:\"6\",y:\"28\",width:\"36\",height:\"14\",rx:\"4\",stroke:\"#333\",\"stroke-width\":\"4\"},null,-1),Km=A(\"path\",{d:\"M20 7H10C7.79086 7 6 8.79086 6 11V17C6 19.2091 7.79086 21 10 21H20\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linecap\":\"round\"},null,-1),Wm=A(\"circle\",{cx:\"34\",cy:\"14\",r:\"8\",fill:\"none\",stroke:\"#333\",\"stroke-width\":\"4\"},null,-1),Ym=A(\"circle\",{cx:\"34\",cy:\"14\",r:\"3\",fill:\"#333\"},null,-1),Jm=[Vm,Km,Wm,Ym];function Xm(e,t){return $(),I(\"svg\",qm,Jm)}const Zm=Le(zm,[[\"render\",Xm]]),Gm={},Qm={width:\"20\",height:\"20\",viewBox:\"0 0 48 48\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},ev=ns('<path d=\"M44 29H4V42H44V29Z\" fill=\"none\" stroke=\"#333\" stroke-width=\"4\" stroke-linejoin=\"round\"></path><path d=\"M35.5 38C36.8807 38 38 36.8807 38 35.5C38 34.1193 36.8807 33 35.5 33C34.1193 33 33 34.1193 33 35.5C33 36.8807 34.1193 38 35.5 38Z\" fill=\"#333\"></path><path d=\"M4 28.9998L9.03837 4.99902H39.0205L44 28.9998\" stroke=\"#333\" stroke-width=\"4\" stroke-linejoin=\"round\"></path><path d=\"M19.006 16.0259C16.8635 16.0259 15 17.5124 15 19.5128C15 21.9998 17.0947 22.9998 19.6973 22.9998C20.1437 22.9998 20.5567 22.9998 20.9768 22.9998\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path><path d=\"M29.007 16.0259C31.1039 16.0259 33 16.9994 33 19.5128C33 21.9998 30.8902 22.9998 28.2877 22.9998C27.8412 22.9998 27.4013 22.9998 26.9871 22.9998\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path><path d=\"M29.0069 16.0261C29.0069 13.0423 27.0231 11 23.9998 11C20.9766 11 19.0059 12.9927 19.0059 16.0261\" stroke=\"#333\" stroke-width=\"4\" stroke-linecap=\"round\" stroke-linejoin=\"round\"></path><path d=\"M20 23H28\" stroke=\"#333\" stroke-width=\"4\"></path>',7),tv=[ev];function nv(e,t){return $(),I(\"svg\",Qm,tv)}const rv=Le(Gm,[[\"render\",nv]]),ov={},sv={width:\"20\",height:\"20\",viewBox:\"0 0 48 48\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},iv=A(\"path\",{d:\"M36.686 15.171C37.9364 16.9643 38.8163 19.0352 39.2147 21.2727H44V26.7273H39.2147C38.8163 28.9648 37.9364 31.0357 36.686 32.829L40.0706 36.2137L36.2137 40.0706L32.829 36.686C31.0357 37.9364 28.9648 38.8163 26.7273 39.2147V44H21.2727V39.2147C19.0352 38.8163 16.9643 37.9364 15.171 36.686L11.7863 40.0706L7.92939 36.2137L11.314 32.829C10.0636 31.0357 9.18372 28.9648 8.78533 26.7273H4V21.2727H8.78533C9.18372 19.0352 10.0636 16.9643 11.314 15.171L7.92939 11.7863L11.7863 7.92939L15.171 11.314C16.9643 10.0636 19.0352 9.18372 21.2727 8.78533V4H26.7273V8.78533C28.9648 9.18372 31.0357 10.0636 32.829 11.314L36.2137 7.92939L40.0706 11.7863L36.686 15.171Z\",fill:\"none\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linejoin\":\"round\"},null,-1),av=A(\"path\",{d:\"M24 29C26.7614 29 29 26.7614 29 24C29 21.2386 26.7614 19 24 19C21.2386 19 19 21.2386 19 24C19 26.7614 21.2386 29 24 29Z\",fill:\"none\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linejoin\":\"round\"},null,-1),lv=[iv,av];function uv(e,t){return $(),I(\"svg\",sv,lv)}const cv=Le(ov,[[\"render\",uv]]),fv={},dv={width:\"20\",height:\"20\",viewBox:\"0 0 48 48\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},pv=A(\"path\",{d:\"M8 8L40 40\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1),hv=A(\"path\",{d:\"M8 40L40 8\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1),mv=[pv,hv];function vv(e,t){return $(),I(\"svg\",dv,mv)}const gv=Le(fv,[[\"render\",vv]]),_v={},yv={width:\"20\",height:\"20\",viewBox:\"0 0 48 48\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},bv=A(\"path\",{d:\"M13 30L25 18L37 30\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1),wv=[bv];function Ev(e,t){return $(),I(\"svg\",yv,wv)}const Sv=Le(_v,[[\"render\",Ev]]),Cv={},kv={width:\"20\",height:\"20\",viewBox:\"0 0 48 48\",fill:\"none\",xmlns:\"http://www.w3.org/2000/svg\"},$v=A(\"path\",{d:\"M36 18L24 30L12 18\",stroke:\"#333\",\"stroke-width\":\"4\",\"stroke-linecap\":\"round\",\"stroke-linejoin\":\"round\"},null,-1),xv=[$v];function Ov(e,t){return $(),I(\"svg\",kv,xv)}const Pv=Le(Cv,[[\"render\",Ov]]);const Tv={},Rv=e=>(Jo(\"data-v-1ba1d638\"),e=e(),Xo(),e),Av={t:\"1631799919469\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"3453\",width:\"128\",height:\"128\"},Lv=Rv(()=>A(\"path\",{d:\"M522.695111 1.991111c-26.339556 0.170667-47.416889 21.475556-47.672889 48.753778-0.284444 26.453333-0.056889 52.963556-0.056889 79.445333 0 27.249778-0.369778 54.528 0.113778 81.777778 0.483556 27.050667 22.016 47.132444 49.351111 46.904889a47.786667 47.786667 0 0 0 47.729778-47.445333c0.284444-53.76 0.284444-107.52-0.028444-161.251556-0.170667-27.676444-21.902222-48.355556-49.436445-48.184889m-195.896889 88.092445c-8.334222-14.222222-21.646222-21.276444-38.314666-21.333334-35.128889 0-56.576 36.949333-38.968889 68.152889a11616.995556 11616.995556 0 0 0 78.961777 137.614222 44.942222 44.942222 0 0 0 61.838223 16.896c21.304889-12.202667 29.667556-38.968889 17.379555-60.871111-26.453333-47.104-53.560889-93.866667-80.896-140.458666m-228.693333 234.524444c44.316444 25.799111 88.746667 51.342222 133.176889 76.970667 6.712889 3.896889 13.681778 6.912 21.703111 6.428444 20.138667 0.142222 35.953778-11.946667 41.301333-31.573333 5.006222-18.261333-2.673778-36.721778-20.224-46.990222-44.629333-26.026667-89.372444-51.882667-134.115555-77.710223-22.528-12.999111-47.815111-7.025778-59.818667 13.909334-12.231111 21.248-4.977778 45.624889 17.948444 58.965333m34.161778 235.975111c26.396444 0 52.821333 0.199111 79.217778-0.085333 23.409778-0.256 39.139556-16.412444 38.798222-39.139556-0.341333-21.617778-16.924444-37.347556-39.594666-37.376-51.655111-0.056889-103.310222-0.056889-154.965334 0.028445-24.177778 0.056889-40.704 15.985778-40.561778 38.684444 0.142222 22.186667 16.583111 37.745778 40.192 37.859556 25.656889 0.142222 51.285333 0.028444 76.913778 0m151.722667 100.238222a34.247111 34.247111 0 0 0-46.876445-12.942222 13764.778667 13764.778667 0 0 0-139.008 80.583111c-11.093333 6.485333-16.327111 16.867556-16.497777 25.372444 0.085333 30.549333 27.249778 47.957333 50.403555 35.072 47.160889-26.197333 93.724444-53.475556 140.145778-80.924444 17.180444-10.154667 21.504-30.378667 11.832889-47.160889m91.875555 101.660444c-14.250667-4.067556-27.619556 1.422222-35.84 15.644445a24375.466667 24375.466667 0 0 0-77.312 134.485333c-10.012444 17.550222-5.859556 35.669333 9.784889 45.027556 16.014222 9.557333 34.247111 4.039111 44.714667-13.994667 25.543111-44.088889 50.915556-88.263111 76.373333-132.352 3.299556-5.745778 5.688889-11.690667 5.745778-14.933333 0-17.834667-9.272889-29.866667-23.466667-33.877334m147.456 44.288c-16.384 0.085333-27.306667 11.918222-27.448888 30.151111-0.142222 25.372444-0.028444 50.716444-0.028445 76.060445h-0.085333c0 26.112-0.113778 52.252444 0.056889 78.364444 0.113778 18.261333 11.064889 30.065778 27.448889 30.208 16.952889 0.142222 28.046222-11.832889 28.103111-30.748444 0.113778-51.086222 0.142222-102.172444 0.056889-153.258667 0-18.773333-11.207111-30.862222-28.103112-30.776889m177.208889-26.112c-7.509333-12.8-21.902222-16.014222-33.792-8.874666a23.722667 23.722667 0 0 0-8.533333 32.995555c26.282667 46.279111 52.906667 92.330667 79.644444 138.353778 4.494222 7.765333 11.633778 11.946667 20.906667 11.804444 18.545778-0.142222 30.520889-19.342222 21.219556-35.868444-26.026667-46.392889-52.650667-92.444444-79.473778-138.410667m239.957333-41.187555c-45.283556-26.254222-90.595556-52.48-135.964444-78.648889-4.693333-2.702222-9.728-4.323556-15.36-2.958222-9.102222 2.247111-14.933333 8.049778-16.497778 17.095111-1.877333 10.894222 3.84 18.204444 12.885333 23.438222 29.809778 17.180444 59.562667 34.417778 89.344 51.598222 15.217778 8.789333 30.236444 17.976889 45.738667 26.225778 14.677333 7.793778 31.061333-2.048 31.061333-18.033778-0.056889-8.448-4.096-14.592-11.207111-18.716444m48.867556-234.638222c-24.888889-0.085333-49.749333 0-74.609778 0v-0.085334c-25.258667 0-50.517333-0.056889-75.776 0.028445-13.425778 0.056889-20.963556 6.343111-21.162667 17.294222-0.199111 11.150222 7.082667 17.521778 20.679111 17.550222 50.488889 0.113778 100.977778 0.142222 151.495112 0.085333 13.368889 0 21.191111-6.485333 21.390222-17.152 0.227556-10.808889-8.106667-17.664-22.016-17.720888m-187.960889-127.146667c45.084444-26.026667 90.140444-52.110222 135.168-78.222222 4.864-2.844444 8.248889-6.855111 8.135111-12.942223-0.142222-11.036444-11.207111-17.436444-21.504-11.548444-45.511111 26.055111-90.851556 52.394667-136.135111 78.819556-7.68 4.494222-10.524444 11.52-5.575111 19.569777 4.835556 7.850667 12.088889 8.817778 19.911111 4.323556m-122.311111-115.114667c5.205333-0.256 8.220444-3.413333 10.609778-7.651555 4.920889-8.647111 10.040889-17.208889 14.990222-25.827556 20.48-35.555556 40.931556-71.025778 61.297778-106.609778 5.091556-8.874667 3.015111-16.668444-4.778667-18.517333-7.68-1.848889-10.894222 3.697778-14.051556 9.159111l-68.778666 119.495111c-2.844444 4.977778-6.030222 9.870222-8.305778 15.104-3.128889 7.196444 1.678222 14.648889 9.045333 14.848\",\"p-id\":\"3454\"},null,-1)),Uv=[Lv];function Mv(e,t){return $(),I(\"svg\",Av,Uv)}const Iv=Le(Tv,[[\"render\",Mv],[\"__scopeId\",\"data-v-1ba1d638\"]]),Bv={install(e){e.component(\"icon-home\",B2),e.component(\"icon-dir\",q2),e.component(\"icon-task\",X2),e.component(\"icon-recycle\",nm),e.component(\"icon-add-file\",cm),e.component(\"icon-upload-file\",_m),e.component(\"icon-sort-file\",xm),e.component(\"icon-model-file\",Lm),e.component(\"icon-list-file\",jm),e.component(\"icon-category\",Zm),e.component(\"icon-disk\",rv),e.component(\"icon-setting\",cv),e.component(\"icon-close\",gv),e.component(\"icon-top\",Sv),e.component(\"icon-down\",Pv),e.component(\"icon-loading\",Iv)}},Fv=[\"src\"],Nv=$e({__name:\"index\",props:{file:{type:Object,required:!0}},setup(e){const t=e,n=()=>{let o=\"\";const s=t.file;if(s.fileType===\"dir\")o=\"dir\";else switch(s.iconType){case\"image\":return`/cgi-bin/luci/linkease/imageonline/small/local${s.rootPath}`;default:o=s.iconType||\"\"}return`/luci-static/linkeasefile/icons/${o}.png`},r=o=>{if(o.target){const s=o.target;t.file.iconType===\"image\"?s.src=\"/luci-static/linkeasefile/icons/image.png\":s.src=\"/luci-static/linkeasefile/icons/error.png\"}};return(o,s)=>($(),I(\"img\",{src:n(),onError:r,alt:\"\"},null,40,Fv))}});const Dv=Le(Nv,[[\"__scopeId\",\"data-v-dfb69c7b\"]]);/*! Element Plus Icons Vue v2.0.10 */var xe=(e,t)=>{let n=e.__vccOpts||e;for(let[r,o]of t)n[r]=o;return n},Hv={name:\"ArrowDown\"},jv={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},zv=A(\"path\",{fill:\"currentColor\",d:\"M831.872 340.864 512 652.672 192.128 340.864a30.592 30.592 0 0 0-42.752 0 29.12 29.12 0 0 0 0 41.6L489.664 714.24a32 32 0 0 0 44.672 0l340.288-331.712a29.12 29.12 0 0 0 0-41.728 30.592 30.592 0 0 0-42.752 0z\"},null,-1),qv=[zv];function Vv(e,t,n,r,o,s){return $(),I(\"svg\",jv,qv)}var t9=xe(Hv,[[\"render\",Vv],[\"__file\",\"arrow-down.vue\"]]),Kv={name:\"ArrowLeft\"},Wv={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},Yv=A(\"path\",{fill:\"currentColor\",d:\"M609.408 149.376 277.76 489.6a32 32 0 0 0 0 44.672l331.648 340.352a29.12 29.12 0 0 0 41.728 0 30.592 30.592 0 0 0 0-42.752L339.264 511.936l311.872-319.872a30.592 30.592 0 0 0 0-42.688 29.12 29.12 0 0 0-41.728 0z\"},null,-1),Jv=[Yv];function Xv(e,t,n,r,o,s){return $(),I(\"svg\",Wv,Jv)}var n9=xe(Kv,[[\"render\",Xv],[\"__file\",\"arrow-left.vue\"]]),Zv={name:\"ArrowRight\"},Gv={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},Qv=A(\"path\",{fill:\"currentColor\",d:\"M340.864 149.312a30.592 30.592 0 0 0 0 42.752L652.736 512 340.864 831.872a30.592 30.592 0 0 0 0 42.752 29.12 29.12 0 0 0 41.728 0L714.24 534.336a32 32 0 0 0 0-44.672L382.592 149.376a29.12 29.12 0 0 0-41.728 0z\"},null,-1),eg=[Qv];function tg(e,t,n,r,o,s){return $(),I(\"svg\",Gv,eg)}var r9=xe(Zv,[[\"render\",tg],[\"__file\",\"arrow-right.vue\"]]),ng={name:\"ArrowUp\"},rg={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},og=A(\"path\",{fill:\"currentColor\",d:\"m488.832 344.32-339.84 356.672a32 32 0 0 0 0 44.16l.384.384a29.44 29.44 0 0 0 42.688 0l320-335.872 319.872 335.872a29.44 29.44 0 0 0 42.688 0l.384-.384a32 32 0 0 0 0-44.16L535.168 344.32a32 32 0 0 0-46.336 0z\"},null,-1),sg=[og];function ig(e,t,n,r,o,s){return $(),I(\"svg\",rg,sg)}var o9=xe(ng,[[\"render\",ig],[\"__file\",\"arrow-up.vue\"]]),ag={name:\"Check\"},lg={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},ug=A(\"path\",{fill:\"currentColor\",d:\"M406.656 706.944 195.84 496.256a32 32 0 1 0-45.248 45.248l256 256 512-512a32 32 0 0 0-45.248-45.248L406.592 706.944z\"},null,-1),cg=[ug];function fg(e,t,n,r,o,s){return $(),I(\"svg\",lg,cg)}var ed=xe(ag,[[\"render\",fg],[\"__file\",\"check.vue\"]]),dg={name:\"CircleCheck\"},pg={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},hg=A(\"path\",{fill:\"currentColor\",d:\"M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768zm0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896z\"},null,-1),mg=A(\"path\",{fill:\"currentColor\",d:\"M745.344 361.344a32 32 0 0 1 45.312 45.312l-288 288a32 32 0 0 1-45.312 0l-160-160a32 32 0 1 1 45.312-45.312L480 626.752l265.344-265.408z\"},null,-1),vg=[hg,mg];function gg(e,t,n,r,o,s){return $(),I(\"svg\",pg,vg)}var ua=xe(dg,[[\"render\",gg],[\"__file\",\"circle-check.vue\"]]),_g={name:\"CircleCloseFilled\"},yg={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},bg=A(\"path\",{fill:\"currentColor\",d:\"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896zm0 393.664L407.936 353.6a38.4 38.4 0 1 0-54.336 54.336L457.664 512 353.6 616.064a38.4 38.4 0 1 0 54.336 54.336L512 566.336 616.064 670.4a38.4 38.4 0 1 0 54.336-54.336L566.336 512 670.4 407.936a38.4 38.4 0 1 0-54.336-54.336L512 457.664z\"},null,-1),wg=[bg];function Eg(e,t,n,r,o,s){return $(),I(\"svg\",yg,wg)}var td=xe(_g,[[\"render\",Eg],[\"__file\",\"circle-close-filled.vue\"]]),Sg={name:\"CircleClose\"},Cg={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},kg=A(\"path\",{fill:\"currentColor\",d:\"m466.752 512-90.496-90.496a32 32 0 0 1 45.248-45.248L512 466.752l90.496-90.496a32 32 0 1 1 45.248 45.248L557.248 512l90.496 90.496a32 32 0 1 1-45.248 45.248L512 557.248l-90.496 90.496a32 32 0 0 1-45.248-45.248L466.752 512z\"},null,-1),$g=A(\"path\",{fill:\"currentColor\",d:\"M512 896a384 384 0 1 0 0-768 384 384 0 0 0 0 768zm0 64a448 448 0 1 1 0-896 448 448 0 0 1 0 896z\"},null,-1),xg=[kg,$g];function Og(e,t,n,r,o,s){return $(),I(\"svg\",Cg,xg)}var nd=xe(Sg,[[\"render\",Og],[\"__file\",\"circle-close.vue\"]]),Pg={name:\"Close\"},Tg={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},Rg=A(\"path\",{fill:\"currentColor\",d:\"M764.288 214.592 512 466.88 259.712 214.592a31.936 31.936 0 0 0-45.12 45.12L466.752 512 214.528 764.224a31.936 31.936 0 1 0 45.12 45.184L512 557.184l252.288 252.288a31.936 31.936 0 0 0 45.12-45.12L557.12 512.064l252.288-252.352a31.936 31.936 0 1 0-45.12-45.184z\"},null,-1),Ag=[Rg];function Lg(e,t,n,r,o,s){return $(),I(\"svg\",Tg,Ag)}var Qr=xe(Pg,[[\"render\",Lg],[\"__file\",\"close.vue\"]]),Ug={name:\"Delete\"},Mg={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},Ig=A(\"path\",{fill:\"currentColor\",d:\"M160 256H96a32 32 0 0 1 0-64h256V95.936a32 32 0 0 1 32-32h256a32 32 0 0 1 32 32V192h256a32 32 0 1 1 0 64h-64v672a32 32 0 0 1-32 32H192a32 32 0 0 1-32-32V256zm448-64v-64H416v64h192zM224 896h576V256H224v640zm192-128a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32zm192 0a32 32 0 0 1-32-32V416a32 32 0 0 1 64 0v320a32 32 0 0 1-32 32z\"},null,-1),Bg=[Ig];function Fg(e,t,n,r,o,s){return $(),I(\"svg\",Mg,Bg)}var Ng=xe(Ug,[[\"render\",Fg],[\"__file\",\"delete.vue\"]]),Dg={name:\"Document\"},Hg={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},jg=A(\"path\",{fill:\"currentColor\",d:\"M832 384H576V128H192v768h640V384zm-26.496-64L640 154.496V320h165.504zM160 64h480l256 256v608a32 32 0 0 1-32 32H160a32 32 0 0 1-32-32V96a32 32 0 0 1 32-32zm160 448h384v64H320v-64zm0-192h160v64H320v-64zm0 384h384v64H320v-64z\"},null,-1),zg=[jg];function qg(e,t,n,r,o,s){return $(),I(\"svg\",Hg,zg)}var Vg=xe(Dg,[[\"render\",qg],[\"__file\",\"document.vue\"]]),Kg={name:\"FullScreen\"},Wg={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},Yg=A(\"path\",{fill:\"currentColor\",d:\"m160 96.064 192 .192a32 32 0 0 1 0 64l-192-.192V352a32 32 0 0 1-64 0V96h64v.064zm0 831.872V928H96V672a32 32 0 1 1 64 0v191.936l192-.192a32 32 0 1 1 0 64l-192 .192zM864 96.064V96h64v256a32 32 0 1 1-64 0V160.064l-192 .192a32 32 0 1 1 0-64l192-.192zm0 831.872-192-.192a32 32 0 0 1 0-64l192 .192V672a32 32 0 1 1 64 0v256h-64v-.064z\"},null,-1),Jg=[Yg];function Xg(e,t,n,r,o,s){return $(),I(\"svg\",Wg,Jg)}var s9=xe(Kg,[[\"render\",Xg],[\"__file\",\"full-screen.vue\"]]),Zg={name:\"Hide\"},Gg={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},Qg=A(\"path\",{d:\"M876.8 156.8c0-9.6-3.2-16-9.6-22.4-6.4-6.4-12.8-9.6-22.4-9.6-9.6 0-16 3.2-22.4 9.6L736 220.8c-64-32-137.6-51.2-224-60.8-160 16-288 73.6-377.6 176C44.8 438.4 0 496 0 512s48 73.6 134.4 176c22.4 25.6 44.8 48 73.6 67.2l-86.4 89.6c-6.4 6.4-9.6 12.8-9.6 22.4 0 9.6 3.2 16 9.6 22.4 6.4 6.4 12.8 9.6 22.4 9.6 9.6 0 16-3.2 22.4-9.6l704-710.4c3.2-6.4 6.4-12.8 6.4-22.4Zm-646.4 528c-76.8-70.4-128-128-153.6-172.8 28.8-48 80-105.6 153.6-172.8C304 272 400 230.4 512 224c64 3.2 124.8 19.2 176 44.8l-54.4 54.4C598.4 300.8 560 288 512 288c-64 0-115.2 22.4-160 64s-64 96-64 160c0 48 12.8 89.6 35.2 124.8L256 707.2c-9.6-6.4-19.2-16-25.6-22.4Zm140.8-96c-12.8-22.4-19.2-48-19.2-76.8 0-44.8 16-83.2 48-112 32-28.8 67.2-48 112-48 28.8 0 54.4 6.4 73.6 19.2L371.2 588.8ZM889.599 336c-12.8-16-28.8-28.8-41.6-41.6l-48 48c73.6 67.2 124.8 124.8 150.4 169.6-28.8 48-80 105.6-153.6 172.8-73.6 67.2-172.8 108.8-284.8 115.2-51.2-3.2-99.2-12.8-140.8-28.8l-48 48c57.6 22.4 118.4 38.4 188.8 44.8 160-16 288-73.6 377.6-176C979.199 585.6 1024 528 1024 512s-48.001-73.6-134.401-176Z\",fill:\"currentColor\"},null,-1),e4=A(\"path\",{d:\"M511.998 672c-12.8 0-25.6-3.2-38.4-6.4l-51.2 51.2c28.8 12.8 57.6 19.2 89.6 19.2 64 0 115.2-22.4 160-64 41.6-41.6 64-96 64-160 0-32-6.4-64-19.2-89.6l-51.2 51.2c3.2 12.8 6.4 25.6 6.4 38.4 0 44.8-16 83.2-48 112-32 28.8-67.2 48-112 48Z\",fill:\"currentColor\"},null,-1),t4=[Qg,e4];function n4(e,t,n,r,o,s){return $(),I(\"svg\",Gg,t4)}var i9=xe(Zg,[[\"render\",n4],[\"__file\",\"hide.vue\"]]),r4={name:\"InfoFilled\"},o4={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},s4=A(\"path\",{fill:\"currentColor\",d:\"M512 64a448 448 0 1 1 0 896.064A448 448 0 0 1 512 64zm67.2 275.072c33.28 0 60.288-23.104 60.288-57.344s-27.072-57.344-60.288-57.344c-33.28 0-60.16 23.104-60.16 57.344s26.88 57.344 60.16 57.344zM590.912 699.2c0-6.848 2.368-24.64 1.024-34.752l-52.608 60.544c-10.88 11.456-24.512 19.392-30.912 17.28a12.992 12.992 0 0 1-8.256-14.72l87.68-276.992c7.168-35.136-12.544-67.2-54.336-71.296-44.096 0-108.992 44.736-148.48 101.504 0 6.784-1.28 23.68.064 33.792l52.544-60.608c10.88-11.328 23.552-19.328 29.952-17.152a12.8 12.8 0 0 1 7.808 16.128L388.48 728.576c-10.048 32.256 8.96 63.872 55.04 71.04 67.84 0 107.904-43.648 147.456-100.416z\"},null,-1),i4=[s4];function a4(e,t,n,r,o,s){return $(),I(\"svg\",o4,i4)}var rd=xe(r4,[[\"render\",a4],[\"__file\",\"info-filled.vue\"]]),l4={name:\"Loading\"},u4={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},c4=A(\"path\",{fill:\"currentColor\",d:\"M512 64a32 32 0 0 1 32 32v192a32 32 0 0 1-64 0V96a32 32 0 0 1 32-32zm0 640a32 32 0 0 1 32 32v192a32 32 0 1 1-64 0V736a32 32 0 0 1 32-32zm448-192a32 32 0 0 1-32 32H736a32 32 0 1 1 0-64h192a32 32 0 0 1 32 32zm-640 0a32 32 0 0 1-32 32H96a32 32 0 0 1 0-64h192a32 32 0 0 1 32 32zM195.2 195.2a32 32 0 0 1 45.248 0L376.32 331.008a32 32 0 0 1-45.248 45.248L195.2 240.448a32 32 0 0 1 0-45.248zm452.544 452.544a32 32 0 0 1 45.248 0L828.8 783.552a32 32 0 0 1-45.248 45.248L647.744 692.992a32 32 0 0 1 0-45.248zM828.8 195.264a32 32 0 0 1 0 45.184L692.992 376.32a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0zm-452.544 452.48a32 32 0 0 1 0 45.248L240.448 828.8a32 32 0 0 1-45.248-45.248l135.808-135.808a32 32 0 0 1 45.248 0z\"},null,-1),f4=[c4];function d4(e,t,n,r,o,s){return $(),I(\"svg\",u4,f4)}var od=xe(l4,[[\"render\",d4],[\"__file\",\"loading.vue\"]]),p4={name:\"Plus\"},h4={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},m4=A(\"path\",{fill:\"currentColor\",d:\"M480 480V128a32 32 0 0 1 64 0v352h352a32 32 0 1 1 0 64H544v352a32 32 0 1 1-64 0V544H128a32 32 0 0 1 0-64h352z\"},null,-1),v4=[m4];function g4(e,t,n,r,o,s){return $(),I(\"svg\",h4,v4)}var a9=xe(p4,[[\"render\",g4],[\"__file\",\"plus.vue\"]]),_4={name:\"Position\"},y4={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},b4=A(\"path\",{fill:\"currentColor\",d:\"m249.6 417.088 319.744 43.072 39.168 310.272L845.12 178.88 249.6 417.088zm-129.024 47.168a32 32 0 0 1-7.68-61.44l777.792-311.04a32 32 0 0 1 41.6 41.6l-310.336 775.68a32 32 0 0 1-61.44-7.808L512 516.992l-391.424-52.736z\"},null,-1),w4=[b4];function E4(e,t,n,r,o,s){return $(),I(\"svg\",y4,w4)}var l9=xe(_4,[[\"render\",E4],[\"__file\",\"position.vue\"]]),S4={name:\"RefreshLeft\"},C4={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},k4=A(\"path\",{fill:\"currentColor\",d:\"M289.088 296.704h92.992a32 32 0 0 1 0 64H232.96a32 32 0 0 1-32-32V179.712a32 32 0 0 1 64 0v50.56a384 384 0 0 1 643.84 282.88 384 384 0 0 1-383.936 384 384 384 0 0 1-384-384h64a320 320 0 1 0 640 0 320 320 0 0 0-555.712-216.448z\"},null,-1),$4=[k4];function x4(e,t,n,r,o,s){return $(),I(\"svg\",C4,$4)}var u9=xe(S4,[[\"render\",x4],[\"__file\",\"refresh-left.vue\"]]),O4={name:\"RefreshRight\"},P4={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},T4=A(\"path\",{fill:\"currentColor\",d:\"M784.512 230.272v-50.56a32 32 0 1 1 64 0v149.056a32 32 0 0 1-32 32H667.52a32 32 0 1 1 0-64h92.992A320 320 0 1 0 524.8 833.152a320 320 0 0 0 320-320h64a384 384 0 0 1-384 384 384 384 0 0 1-384-384 384 384 0 0 1 643.712-282.88z\"},null,-1),R4=[T4];function A4(e,t,n,r,o,s){return $(),I(\"svg\",P4,R4)}var c9=xe(O4,[[\"render\",A4],[\"__file\",\"refresh-right.vue\"]]),L4={name:\"ScaleToOriginal\"},U4={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},M4=A(\"path\",{fill:\"currentColor\",d:\"M813.176 180.706a60.235 60.235 0 0 1 60.236 60.235v481.883a60.235 60.235 0 0 1-60.236 60.235H210.824a60.235 60.235 0 0 1-60.236-60.235V240.94a60.235 60.235 0 0 1 60.236-60.235h602.352zm0-60.235H210.824A120.47 120.47 0 0 0 90.353 240.94v481.883a120.47 120.47 0 0 0 120.47 120.47h602.353a120.47 120.47 0 0 0 120.471-120.47V240.94a120.47 120.47 0 0 0-120.47-120.47zm-120.47 180.705a30.118 30.118 0 0 0-30.118 30.118v301.177a30.118 30.118 0 0 0 60.236 0V331.294a30.118 30.118 0 0 0-30.118-30.118zm-361.412 0a30.118 30.118 0 0 0-30.118 30.118v301.177a30.118 30.118 0 1 0 60.236 0V331.294a30.118 30.118 0 0 0-30.118-30.118zM512 361.412a30.118 30.118 0 0 0-30.118 30.117v30.118a30.118 30.118 0 0 0 60.236 0V391.53A30.118 30.118 0 0 0 512 361.412zM512 512a30.118 30.118 0 0 0-30.118 30.118v30.117a30.118 30.118 0 0 0 60.236 0v-30.117A30.118 30.118 0 0 0 512 512z\"},null,-1),I4=[M4];function B4(e,t,n,r,o,s){return $(),I(\"svg\",U4,I4)}var f9=xe(L4,[[\"render\",B4],[\"__file\",\"scale-to-original.vue\"]]),F4={name:\"SuccessFilled\"},N4={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},D4=A(\"path\",{fill:\"currentColor\",d:\"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896zm-55.808 536.384-99.52-99.584a38.4 38.4 0 1 0-54.336 54.336l126.72 126.72a38.272 38.272 0 0 0 54.336 0l262.4-262.464a38.4 38.4 0 1 0-54.272-54.336L456.192 600.384z\"},null,-1),H4=[D4];function j4(e,t,n,r,o,s){return $(),I(\"svg\",N4,H4)}var sd=xe(F4,[[\"render\",j4],[\"__file\",\"success-filled.vue\"]]),z4={name:\"UploadFilled\"},q4={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},V4=A(\"path\",{fill:\"currentColor\",d:\"M544 864V672h128L512 480 352 672h128v192H320v-1.6c-5.376.32-10.496 1.6-16 1.6A240 240 0 0 1 64 624c0-123.136 93.12-223.488 212.608-237.248A239.808 239.808 0 0 1 512 192a239.872 239.872 0 0 1 235.456 194.752c119.488 13.76 212.48 114.112 212.48 237.248a240 240 0 0 1-240 240c-5.376 0-10.56-1.28-16-1.6v1.6H544z\"},null,-1),K4=[V4];function W4(e,t,n,r,o,s){return $(),I(\"svg\",q4,K4)}var Y4=xe(z4,[[\"render\",W4],[\"__file\",\"upload-filled.vue\"]]),J4={name:\"View\"},X4={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},Z4=A(\"path\",{fill:\"currentColor\",d:\"M512 160c320 0 512 352 512 352S832 864 512 864 0 512 0 512s192-352 512-352zm0 64c-225.28 0-384.128 208.064-436.8 288 52.608 79.872 211.456 288 436.8 288 225.28 0 384.128-208.064 436.8-288-52.608-79.872-211.456-288-436.8-288zm0 64a224 224 0 1 1 0 448 224 224 0 0 1 0-448zm0 64a160.192 160.192 0 0 0-160 160c0 88.192 71.744 160 160 160s160-71.808 160-160-71.744-160-160-160z\"},null,-1),G4=[Z4];function Q4(e,t,n,r,o,s){return $(),I(\"svg\",X4,G4)}var d9=xe(J4,[[\"render\",Q4],[\"__file\",\"view.vue\"]]),e3={name:\"WarningFilled\"},t3={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},n3=A(\"path\",{fill:\"currentColor\",d:\"M512 64a448 448 0 1 1 0 896 448 448 0 0 1 0-896zm0 192a58.432 58.432 0 0 0-58.24 63.744l23.36 256.384a35.072 35.072 0 0 0 69.76 0l23.296-256.384A58.432 58.432 0 0 0 512 256zm0 512a51.2 51.2 0 1 0 0-102.4 51.2 51.2 0 0 0 0 102.4z\"},null,-1),r3=[n3];function o3(e,t,n,r,o,s){return $(),I(\"svg\",t3,r3)}var ca=xe(e3,[[\"render\",o3],[\"__file\",\"warning-filled.vue\"]]),s3={name:\"ZoomIn\"},i3={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},a3=A(\"path\",{fill:\"currentColor\",d:\"m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704zm-32-384v-96a32 32 0 0 1 64 0v96h96a32 32 0 0 1 0 64h-96v96a32 32 0 0 1-64 0v-96h-96a32 32 0 0 1 0-64h96z\"},null,-1),l3=[a3];function u3(e,t,n,r,o,s){return $(),I(\"svg\",i3,l3)}var c3=xe(s3,[[\"render\",u3],[\"__file\",\"zoom-in.vue\"]]),f3={name:\"ZoomOut\"},d3={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\"},p3=A(\"path\",{fill:\"currentColor\",d:\"m795.904 750.72 124.992 124.928a32 32 0 0 1-45.248 45.248L750.656 795.904a416 416 0 1 1 45.248-45.248zM480 832a352 352 0 1 0 0-704 352 352 0 0 0 0 704zM352 448h256a32 32 0 0 1 0 64H352a32 32 0 0 1 0-64z\"},null,-1),h3=[p3];function m3(e,t,n,r,o,s){return $(),I(\"svg\",d3,h3)}var p9=xe(f3,[[\"render\",m3],[\"__file\",\"zoom-out.vue\"]]),v3=typeof global==\"object\"&&global&&global.Object===Object&&global;const g3=v3;var _3=typeof self==\"object\"&&self&&self.Object===Object&&self,y3=g3||_3||Function(\"return this\")();const fa=y3;var b3=fa.Symbol;const sr=b3;var id=Object.prototype,w3=id.hasOwnProperty,E3=id.toString,br=sr?sr.toStringTag:void 0;function S3(e){var t=w3.call(e,br),n=e[br];try{e[br]=void 0;var r=!0}catch(s){}var o=E3.call(e);return r&&(t?e[br]=n:delete e[br]),o}var C3=Object.prototype,k3=C3.toString;function $3(e){return k3.call(e)}var x3=\"[object Null]\",O3=\"[object Undefined]\",Kl=sr?sr.toStringTag:void 0;function ad(e){return e==null?e===void 0?O3:x3:Kl&&Kl in Object(e)?S3(e):$3(e)}function P3(e){return e!=null&&typeof e==\"object\"}var T3=\"[object Symbol]\";function da(e){return typeof e==\"symbol\"||P3(e)&&ad(e)==T3}function R3(e,t){for(var n=-1,r=e==null?0:e.length,o=Array(r);++n<r;)o[n]=t(e[n],n,e);return o}var A3=Array.isArray;const pa=A3;var L3=1/0,Wl=sr?sr.prototype:void 0,Yl=Wl?Wl.toString:void 0;function ld(e){if(typeof e==\"string\")return e;if(pa(e))return R3(e,ld)+\"\";if(da(e))return Yl?Yl.call(e):\"\";var t=e+\"\";return t==\"0\"&&1/e==-L3?\"-0\":t}function Uo(e){var t=typeof e;return e!=null&&(t==\"object\"||t==\"function\")}var U3=\"[object AsyncFunction]\",M3=\"[object Function]\",I3=\"[object GeneratorFunction]\",B3=\"[object Proxy]\";function F3(e){if(!Uo(e))return!1;var t=ad(e);return t==M3||t==I3||t==U3||t==B3}var N3=fa[\"__core-js_shared__\"];const ks=N3;var Jl=function(){var e=/[^.]+$/.exec(ks&&ks.keys&&ks.keys.IE_PROTO||\"\");return e?\"Symbol(src)_1.\"+e:\"\"}();function D3(e){return!!Jl&&Jl in e}var H3=Function.prototype,j3=H3.toString;function z3(e){if(e!=null){try{return j3.call(e)}catch(t){}try{return e+\"\"}catch(t){}}return\"\"}var q3=/[\\\\^$.*+?()[\\]{}|]/g,V3=/^\\[object .+?Constructor\\]$/,K3=Function.prototype,W3=Object.prototype,Y3=K3.toString,J3=W3.hasOwnProperty,X3=RegExp(\"^\"+Y3.call(J3).replace(q3,\"\\\\$&\").replace(/hasOwnProperty|(function).*?(?=\\\\\\()| for .+?(?=\\\\\\])/g,\"$1.*?\")+\"$\");function Z3(e){if(!Uo(e)||D3(e))return!1;var t=F3(e)?X3:V3;return t.test(z3(e))}function G3(e,t){return e==null?void 0:e[t]}function ha(e,t){var n=G3(e,t);return Z3(n)?n:void 0}var Q3=function(){try{var e=ha(Object,\"defineProperty\");return e({},\"\",{}),e}catch(t){}}();const Xl=Q3;var e_=9007199254740991,t_=/^(?:0|[1-9]\\d*)$/;function n_(e,t){var n=typeof e;return t=t==null?e_:t,!!t&&(n==\"number\"||n!=\"symbol\"&&t_.test(e))&&e>-1&&e%1==0&&e<t}function r_(e,t,n){t==\"__proto__\"&&Xl?Xl(e,t,{configurable:!0,enumerable:!0,value:n,writable:!0}):e[t]=n}function ud(e,t){return e===t||e!==e&&t!==t}var o_=Object.prototype,s_=o_.hasOwnProperty;function i_(e,t,n){var r=e[t];(!(s_.call(e,t)&&ud(r,n))||n===void 0&&!(t in e))&&r_(e,t,n)}var a_=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,l_=/^\\w*$/;function u_(e,t){if(pa(e))return!1;var n=typeof e;return n==\"number\"||n==\"symbol\"||n==\"boolean\"||e==null||da(e)?!0:l_.test(e)||!a_.test(e)||t!=null&&e in Object(t)}var c_=ha(Object,\"create\");const Vr=c_;function f_(){this.__data__=Vr?Vr(null):{},this.size=0}function d_(e){var t=this.has(e)&&delete this.__data__[e];return this.size-=t?1:0,t}var p_=\"__lodash_hash_undefined__\",h_=Object.prototype,m_=h_.hasOwnProperty;function v_(e){var t=this.__data__;if(Vr){var n=t[e];return n===p_?void 0:n}return m_.call(t,e)?t[e]:void 0}var g_=Object.prototype,__=g_.hasOwnProperty;function y_(e){var t=this.__data__;return Vr?t[e]!==void 0:__.call(t,e)}var b_=\"__lodash_hash_undefined__\";function w_(e,t){var n=this.__data__;return this.size+=this.has(e)?0:1,n[e]=Vr&&t===void 0?b_:t,this}function $n(e){var t=-1,n=e==null?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}$n.prototype.clear=f_;$n.prototype.delete=d_;$n.prototype.get=v_;$n.prototype.has=y_;$n.prototype.set=w_;function E_(){this.__data__=[],this.size=0}function ls(e,t){for(var n=e.length;n--;)if(ud(e[n][0],t))return n;return-1}var S_=Array.prototype,C_=S_.splice;function k_(e){var t=this.__data__,n=ls(t,e);if(n<0)return!1;var r=t.length-1;return n==r?t.pop():C_.call(t,n,1),--this.size,!0}function $_(e){var t=this.__data__,n=ls(t,e);return n<0?void 0:t[n][1]}function x_(e){return ls(this.__data__,e)>-1}function O_(e,t){var n=this.__data__,r=ls(n,e);return r<0?(++this.size,n.push([e,t])):n[r][1]=t,this}function dr(e){var t=-1,n=e==null?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}dr.prototype.clear=E_;dr.prototype.delete=k_;dr.prototype.get=$_;dr.prototype.has=x_;dr.prototype.set=O_;var P_=ha(fa,\"Map\");const T_=P_;function R_(){this.size=0,this.__data__={hash:new $n,map:new(T_||dr),string:new $n}}function A_(e){var t=typeof e;return t==\"string\"||t==\"number\"||t==\"symbol\"||t==\"boolean\"?e!==\"__proto__\":e===null}function us(e,t){var n=e.__data__;return A_(t)?n[typeof t==\"string\"?\"string\":\"hash\"]:n.map}function L_(e){var t=us(this,e).delete(e);return this.size-=t?1:0,t}function U_(e){return us(this,e).get(e)}function M_(e){return us(this,e).has(e)}function I_(e,t){var n=us(this,e),r=n.size;return n.set(e,t),this.size+=n.size==r?0:1,this}function Rn(e){var t=-1,n=e==null?0:e.length;for(this.clear();++t<n;){var r=e[t];this.set(r[0],r[1])}}Rn.prototype.clear=R_;Rn.prototype.delete=L_;Rn.prototype.get=U_;Rn.prototype.has=M_;Rn.prototype.set=I_;var B_=\"Expected a function\";function ma(e,t){if(typeof e!=\"function\"||t!=null&&typeof t!=\"function\")throw new TypeError(B_);var n=function(){var r=arguments,o=t?t.apply(this,r):r[0],s=n.cache;if(s.has(o))return s.get(o);var i=e.apply(this,r);return n.cache=s.set(o,i)||s,i};return n.cache=new(ma.Cache||Rn),n}ma.Cache=Rn;var F_=500;function N_(e){var t=ma(e,function(r){return n.size===F_&&n.clear(),r}),n=t.cache;return t}var D_=/[^.[\\]]+|\\[(?:(-?\\d+(?:\\.\\d+)?)|([\"'])((?:(?!\\2)[^\\\\]|\\\\.)*?)\\2)\\]|(?=(?:\\.|\\[\\])(?:\\.|\\[\\]|$))/g,H_=/\\\\(\\\\)?/g,j_=N_(function(e){var t=[];return e.charCodeAt(0)===46&&t.push(\"\"),e.replace(D_,function(n,r,o,s){t.push(o?s.replace(H_,\"$1\"):r||n)}),t});const z_=j_;function q_(e){return e==null?\"\":ld(e)}function cd(e,t){return pa(e)?e:u_(e,t)?[e]:z_(q_(e))}var V_=1/0;function fd(e){if(typeof e==\"string\"||da(e))return e;var t=e+\"\";return t==\"0\"&&1/e==-V_?\"-0\":t}function K_(e,t){t=cd(t,e);for(var n=0,r=t.length;e!=null&&n<r;)e=e[fd(t[n++])];return n&&n==r?e:void 0}function dd(e,t,n){var r=e==null?void 0:K_(e,t);return r===void 0?n:r}function W_(e){for(var t=-1,n=e==null?0:e.length,r={};++t<n;){var o=e[t];r[o[0]]=o[1]}return r}function pd(e){return e==null}function Y_(e,t,n,r){if(!Uo(e))return e;t=cd(t,e);for(var o=-1,s=t.length,i=s-1,a=e;a!=null&&++o<s;){var l=fd(t[o]),u=n;if(l===\"__proto__\"||l===\"constructor\"||l===\"prototype\")return e;if(o!=i){var c=a[l];u=r?r(c,l,a):void 0,u===void 0&&(u=Uo(c)?c:n_(t[o+1])?[]:{})}i_(a,l,u),a=a[l]}return e}function J_(e,t,n){return e==null?e:Y_(e,t,n)}var X_=Object.defineProperty,Z_=Object.defineProperties,G_=Object.getOwnPropertyDescriptors,Zl=Object.getOwnPropertySymbols,Q_=Object.prototype.hasOwnProperty,e8=Object.prototype.propertyIsEnumerable,Gl=(e,t,n)=>t in e?X_(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,t8=(e,t)=>{for(var n in t||(t={}))Q_.call(t,n)&&Gl(e,n,t[n]);if(Zl)for(var n of Zl(t))e8.call(t,n)&&Gl(e,n,t[n]);return e},n8=(e,t)=>Z_(e,G_(t));function h9(e,t){var n;const r=Mr();return nf(()=>{r.value=e()},n8(t8({},t),{flush:(n=t==null?void 0:t.flush)!=null?n:\"sync\"})),ji(r)}var Ql;const ct=typeof window!=\"undefined\",r8=e=>typeof e!=\"undefined\",o8=e=>typeof e==\"boolean\",s8=e=>typeof e==\"function\",Ft=e=>typeof e==\"number\",i8=e=>typeof e==\"string\",$s=()=>{};ct&&((Ql=window==null?void 0:window.navigator)==null?void 0:Ql.userAgent)&&/iP(ad|hone|od)/.test(window.navigator.userAgent);function hd(e){return typeof e==\"function\"?e():v(e)}function a8(e){return e}function va(e){return Yp()?(Pc(e),!0):!1}function l8(e,t=!0){mt()?$t(e):t?e():jt(e)}function pi(e,t,n={}){const{immediate:r=!0}=n,o=W(!1);let s=null;function i(){s&&(clearTimeout(s),s=null)}function a(){o.value=!1,i()}function l(...u){i(),o.value=!0,s=setTimeout(()=>{o.value=!1,s=null,e(...u)},hd(t))}return r&&(o.value=!0,ct&&l()),va(a),{isPending:o,start:l,stop:a}}function Vn(e){var t;const n=hd(e);return(t=n==null?void 0:n.$el)!=null?t:n}const cs=ct?window:void 0,u8=ct?window.document:void 0;function St(...e){let t,n,r,o;if(i8(e[0])?([n,r,o]=e,t=cs):[t,n,r,o]=e,!t)return $s;let s=$s;const i=Ae(()=>Vn(t),l=>{s(),l&&(l.addEventListener(n,r,o),s=()=>{l.removeEventListener(n,r,o),s=$s})},{immediate:!0,flush:\"post\"}),a=()=>{i(),s()};return va(a),a}function m9(e,t,n={}){const{window:r=cs,ignore:o,capture:s=!0,detectIframe:i=!1}=n;if(!r)return;const a=W(!0);let l;const u=p=>{r.clearTimeout(l);const m=Vn(e);!m||m===p.target||p.composedPath().includes(m)||!a.value||t(p)},c=p=>o&&o.some(m=>{const _=Vn(m);return _&&(p.target===_||p.composedPath().includes(_))}),d=[St(r,\"click\",u,{passive:!0,capture:s}),St(r,\"pointerdown\",p=>{const m=Vn(e);a.value=!!m&&!p.composedPath().includes(m)&&!c(p)},{passive:!0}),St(r,\"pointerup\",p=>{if(p.button===0){const m=p.composedPath();p.composedPath=()=>m,l=r.setTimeout(()=>u(p),50)}},{passive:!0}),i&&St(r,\"blur\",p=>{var m;const _=Vn(e);((m=document.activeElement)==null?void 0:m.tagName)===\"IFRAME\"&&!(_!=null&&_.contains(document.activeElement))&&t(p)})].filter(Boolean);return()=>d.forEach(p=>p())}function c8(e,t=!1){const n=W(),r=()=>n.value=Boolean(e());return r(),l8(r,t),n}function f8(e){return JSON.parse(JSON.stringify(e))}const hi=typeof globalThis!=\"undefined\"?globalThis:typeof window!=\"undefined\"?window:typeof global!=\"undefined\"?global:typeof self!=\"undefined\"?self:{},mi=\"__vueuse_ssr_handlers__\";hi[mi]=hi[mi]||{};hi[mi];function v9({document:e=u8}={}){if(!e)return W(\"visible\");const t=W(e.visibilityState);return St(e,\"visibilitychange\",()=>{t.value=e.visibilityState}),t}var eu=Object.getOwnPropertySymbols,d8=Object.prototype.hasOwnProperty,p8=Object.prototype.propertyIsEnumerable,h8=(e,t)=>{var n={};for(var r in e)d8.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&eu)for(var r of eu(e))t.indexOf(r)<0&&p8.call(e,r)&&(n[r]=e[r]);return n};function md(e,t,n={}){const r=n,{window:o=cs}=r,s=h8(r,[\"window\"]);let i;const a=c8(()=>o&&\"ResizeObserver\"in o),l=()=>{i&&(i.disconnect(),i=void 0)},u=Ae(()=>Vn(e),d=>{l(),a.value&&o&&d&&(i=new ResizeObserver(t),i.observe(d,s))},{immediate:!0,flush:\"post\"}),c=()=>{l(),u()};return va(c),{isSupported:a,stop:c}}var tu;(function(e){e.UP=\"UP\",e.RIGHT=\"RIGHT\",e.DOWN=\"DOWN\",e.LEFT=\"LEFT\",e.NONE=\"NONE\"})(tu||(tu={}));var m8=Object.defineProperty,nu=Object.getOwnPropertySymbols,v8=Object.prototype.hasOwnProperty,g8=Object.prototype.propertyIsEnumerable,ru=(e,t,n)=>t in e?m8(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,_8=(e,t)=>{for(var n in t||(t={}))v8.call(t,n)&&ru(e,n,t[n]);if(nu)for(var n of nu(t))g8.call(t,n)&&ru(e,n,t[n]);return e};const y8={easeInSine:[.12,0,.39,0],easeOutSine:[.61,1,.88,1],easeInOutSine:[.37,0,.63,1],easeInQuad:[.11,0,.5,0],easeOutQuad:[.5,1,.89,1],easeInOutQuad:[.45,0,.55,1],easeInCubic:[.32,0,.67,0],easeOutCubic:[.33,1,.68,1],easeInOutCubic:[.65,0,.35,1],easeInQuart:[.5,0,.75,0],easeOutQuart:[.25,1,.5,1],easeInOutQuart:[.76,0,.24,1],easeInQuint:[.64,0,.78,0],easeOutQuint:[.22,1,.36,1],easeInOutQuint:[.83,0,.17,1],easeInExpo:[.7,0,.84,0],easeOutExpo:[.16,1,.3,1],easeInOutExpo:[.87,0,.13,1],easeInCirc:[.55,0,1,.45],easeOutCirc:[0,.55,.45,1],easeInOutCirc:[.85,0,.15,1],easeInBack:[.36,0,.66,-.56],easeOutBack:[.34,1.56,.64,1],easeInOutBack:[.68,-.6,.32,1.6]};_8({linear:a8},y8);function b8(e,t,n,r={}){var o,s,i;const{clone:a=!1,passive:l=!1,eventName:u,deep:c=!1,defaultValue:d}=r,f=mt(),p=n||(f==null?void 0:f.emit)||((o=f==null?void 0:f.$emit)==null?void 0:o.bind(f))||((i=(s=f==null?void 0:f.proxy)==null?void 0:s.$emit)==null?void 0:i.bind(f==null?void 0:f.proxy));let m=u;t||(t=\"modelValue\"),m=u||m||`update:${t.toString()}`;const _=y=>a?s8(a)?a(y):f8(y):y,S=()=>r8(e[t])?_(e[t]):d;if(l){const y=S(),E=W(y);return Ae(()=>e[t],w=>E.value=_(w)),Ae(E,w=>{(w!==e[t]||c)&&p(m,w)},{deep:c}),E}else return K({get(){return S()},set(y){p(m,y)}})}function g9({window:e=cs}={}){if(!e)return W(!1);const t=W(e.document.hasFocus());return St(e,\"blur\",()=>{t.value=!1}),St(e,\"focus\",()=>{t.value=!0}),t}const w8=e=>e===void 0,E8=e=>typeof Element==\"undefined\"?!1:e instanceof Element,ou=e=>Object.keys(e),S8=e=>Object.entries(e),_9=(e,t,n)=>({get value(){return dd(e,t,n)},set value(r){J_(e,t,r)}});class C8 extends Error{constructor(t){super(t),this.name=\"ElementPlusError\"}}function eo(e,t){throw new C8(`[${e}] ${t}`)}function y9(e,t){}const vd=(e=\"\")=>e.split(\" \").filter(t=>!!t.trim()),su=(e,t)=>{if(!e||!t)return!1;if(t.includes(\" \"))throw new Error(\"className should not contain space.\");return e.classList.contains(t)},k8=(e,t)=>{!e||!t.trim()||e.classList.add(...vd(t))},$8=(e,t)=>{!e||!t.trim()||e.classList.remove(...vd(t))},x8=(e,t)=>{var n;if(!ct||!e||!t)return\"\";let r=Ct(t);r===\"float\"&&(r=\"cssFloat\");try{const o=e.style[r];if(o)return o;const s=(n=document.defaultView)==null?void 0:n.getComputedStyle(e,\"\");return s?s[r]:\"\"}catch(o){return e.style[r]}};function ir(e,t=\"px\"){if(!e)return\"\";if(be(e))return e;if(Ft(e))return`${e}${t}`}let fo;const O8=e=>{var t;if(!ct)return 0;if(fo!==void 0)return fo;const n=document.createElement(\"div\");n.className=`${e}-scrollbar__wrap`,n.style.visibility=\"hidden\",n.style.width=\"100px\",n.style.position=\"absolute\",n.style.top=\"-9999px\",document.body.appendChild(n);const r=n.offsetWidth;n.style.overflow=\"scroll\";const o=document.createElement(\"div\");o.style.width=\"100%\",n.appendChild(o);const s=o.offsetWidth;return(t=n.parentNode)==null||t.removeChild(n),fo=r-s,fo},gd=\"__epPropKey\",fe=e=>e,P8=e=>ve(e)&&!!e[gd],_d=(e,t)=>{if(!ve(e)||P8(e))return e;const{values:n,required:r,default:o,type:s,validator:i}=e,l={type:s,required:!!r,validator:n||i?u=>{let c=!1,d=[];if(n&&(d=Array.from(n),ce(e,\"default\")&&d.push(o),c||(c=d.includes(u))),i&&(c||(c=i(u))),!c&&d.length>0){const f=[...new Set(d)].map(p=>JSON.stringify(p)).join(\", \");kh(`Invalid prop: validation failed${t?` for prop \"${t}\"`:\"\"}. Expected one of [${f}], got value ${JSON.stringify(u)}.`)}return c}:void 0,[gd]:!0};return ce(e,\"default\")&&(l.default=o),l},Ve=e=>W_(Object.entries(e).map(([t,n])=>[t,_d(n,t)])),Mo=fe([String,Object,Function]),T8={Close:Qr},R8={Close:Qr,SuccessFilled:sd,InfoFilled:rd,WarningFilled:ca,CircleCloseFilled:td},iu={success:sd,warning:ca,error:td,info:rd},b9={validating:od,success:ua,error:nd},An=(e,t)=>{if(e.install=n=>{for(const r of[e,...Object.values(t!=null?t:{})])n.component(r.name,r)},t)for(const[n,r]of Object.entries(t))e[n]=r;return e},A8=(e,t)=>(e.install=n=>{e._context=n._context,n.config.globalProperties[t]=e},e),L8=e=>(e.install=me,e),U8=(...e)=>t=>{e.forEach(n=>{te(n)?n(t):n.value=t})},ga={tab:\"Tab\",enter:\"Enter\",space:\"Space\",left:\"ArrowLeft\",up:\"ArrowUp\",right:\"ArrowRight\",down:\"ArrowDown\",esc:\"Escape\",delete:\"Delete\",backspace:\"Backspace\",numpadEnter:\"NumpadEnter\",pageUp:\"PageUp\",pageDown:\"PageDown\",home:\"Home\",end:\"End\"},yd=\"update:modelValue\",w9=\"change\",E9=\"input\",M8=[\"\",\"default\",\"small\",\"large\"];var Eo=(e=>(e[e.TEXT=1]=\"TEXT\",e[e.CLASS=2]=\"CLASS\",e[e.STYLE=4]=\"STYLE\",e[e.PROPS=8]=\"PROPS\",e[e.FULL_PROPS=16]=\"FULL_PROPS\",e[e.HYDRATE_EVENTS=32]=\"HYDRATE_EVENTS\",e[e.STABLE_FRAGMENT=64]=\"STABLE_FRAGMENT\",e[e.KEYED_FRAGMENT=128]=\"KEYED_FRAGMENT\",e[e.UNKEYED_FRAGMENT=256]=\"UNKEYED_FRAGMENT\",e[e.NEED_PATCH=512]=\"NEED_PATCH\",e[e.DYNAMIC_SLOTS=1024]=\"DYNAMIC_SLOTS\",e[e.HOISTED=-1]=\"HOISTED\",e[e.BAIL=-2]=\"BAIL\",e))(Eo||{});const Io=e=>e,bd=Symbol(\"buttonGroupContextKey\"),wd=Symbol(),Ed=Symbol(\"dialogInjectionKey\"),_a=Symbol(\"formContextKey\"),Sd=Symbol(\"formItemContextKey\"),Cd=Symbol(\"scrollbarContextKey\"),kd=Symbol(\"uploadContextKey\"),$d=e=>{const t=mt();return K(()=>{var n,r;return(r=((n=t.proxy)==null?void 0:n.$props)[e])!=null?r:void 0})},Bo=W();function cn(e,t=void 0){const n=mt()?Oe(wd,Bo):Bo;return e?K(()=>{var r,o;return(o=(r=n.value)==null?void 0:r[e])!=null?o:t}):n}const I8=(e,t,n=!1)=>{var r;const o=!!mt(),s=o?cn():void 0,i=(r=t==null?void 0:t.provide)!=null?r:o?nt:void 0;if(!i)return;const a=K(()=>{const l=v(e);return s!=null&&s.value?B8(s.value,l):l});return i(wd,a),(n||!Bo.value)&&(Bo.value=a.value),a},B8=(e,t)=>{var n;const r=[...new Set([...ou(e),...ou(t)])],o={};for(const s of r)o[s]=(n=t[s])!=null?n:e[s];return o},xd=_d({type:String,values:M8,required:!1}),F8=(e,t={})=>{const n=W(void 0),r=t.prop?n:$d(\"size\"),o=t.global?n:cn(\"size\"),s=t.form?{size:void 0}:Oe(_a,void 0),i=t.formItem?{size:void 0}:Oe(Sd,void 0);return K(()=>r.value||v(e)||(i==null?void 0:i.size)||(s==null?void 0:s.size)||o.value||\"\")},ya=e=>{const t=$d(\"disabled\"),n=Oe(_a,void 0);return K(()=>t.value||v(e)||(n==null?void 0:n.disabled)||!1)},vi=({from:e,replacement:t,scope:n,version:r,ref:o,type:s=\"API\"},i)=>{Ae(()=>v(i),a=>{},{immediate:!0})},N8=(e,t,n)=>{let r={offsetX:0,offsetY:0};const o=a=>{const l=a.clientX,u=a.clientY,{offsetX:c,offsetY:d}=r,f=e.value.getBoundingClientRect(),p=f.left,m=f.top,_=f.width,S=f.height,y=document.documentElement.clientWidth,E=document.documentElement.clientHeight,w=-p+c,x=-m+d,b=y-p-_+c,L=E-m-S+d,P=T=>{const N=Math.min(Math.max(c+T.clientX-l,w),b),q=Math.min(Math.max(d+T.clientY-u,x),L);r={offsetX:N,offsetY:q},e.value.style.transform=`translate(${ir(N)}, ${ir(q)})`},C=()=>{document.removeEventListener(\"mousemove\",P),document.removeEventListener(\"mouseup\",C)};document.addEventListener(\"mousemove\",P),document.addEventListener(\"mouseup\",C)},s=()=>{t.value&&e.value&&t.value.addEventListener(\"mousedown\",o)},i=()=>{t.value&&e.value&&t.value.removeEventListener(\"mousedown\",o)};$t(()=>{nf(()=>{n.value?s():i()})}),Tn(()=>{i()})},ba=\"el\",D8=\"is-\",vn=(e,t,n,r,o)=>{let s=`${e}-${t}`;return n&&(s+=`-${n}`),r&&(s+=`__${r}`),o&&(s+=`--${o}`),s},ze=e=>{const t=cn(\"namespace\",ba);return{namespace:t,b:(m=\"\")=>vn(t.value,e,m,\"\",\"\"),e:m=>m?vn(t.value,e,\"\",m,\"\"):\"\",m:m=>m?vn(t.value,e,\"\",\"\",m):\"\",be:(m,_)=>m&&_?vn(t.value,e,m,_,\"\"):\"\",em:(m,_)=>m&&_?vn(t.value,e,\"\",m,_):\"\",bm:(m,_)=>m&&_?vn(t.value,e,m,\"\",_):\"\",bem:(m,_,S)=>m&&_&&S?vn(t.value,e,m,_,S):\"\",is:(m,..._)=>{const S=_.length>=1?_[0]:!0;return m&&S?`${D8}${m}`:\"\"},cssVar:m=>{const _={};for(const S in m)m[S]&&(_[`--${t.value}-${S}`]=m[S]);return _},cssVarName:m=>`--${t.value}-${m}`,cssVarBlock:m=>{const _={};for(const S in m)m[S]&&(_[`--${t.value}-${e}-${S}`]=m[S]);return _},cssVarBlockName:m=>`--${t.value}-${e}-${m}`}},H8={prefix:Math.floor(Math.random()*1e4),current:0},j8=Symbol(\"elIdInjection\"),gi=e=>{const t=Oe(j8,H8),n=cn(\"namespace\",ba);return K(()=>v(e)||`${n.value}-id-${t.prefix}-${t.current++}`)},z8=()=>{const e=Oe(_a,void 0),t=Oe(Sd,void 0);return{form:e,formItem:t}},S9=(e,{formItemContext:t,disableIdGeneration:n,disableIdManagement:r})=>{n||(n=W(!1)),r||(r=W(!1));const o=W();let s;const i=K(()=>{var a;return!!(!e.label&&t&&t.inputIds&&((a=t.inputIds)==null?void 0:a.length)<=1)});return $t(()=>{s=Ae([Sn(e,\"id\"),n],([a,l])=>{const u=a!=null?a:l?void 0:gi().value;u!==o.value&&(t!=null&&t.removeInputId&&(o.value&&t.removeInputId(o.value),!(r!=null&&r.value)&&!l&&u&&t.addInputId(u)),o.value=u)},{immediate:!0})}),Qo(()=>{s&&s(),t!=null&&t.removeInputId&&o.value&&t.removeInputId(o.value)}),{isLabeledByFormItem:i,inputId:o}};var q8={name:\"en\",el:{colorpicker:{confirm:\"OK\",clear:\"Clear\",defaultLabel:\"color picker\",description:\"current color is {color}. press enter to select a new color.\"},datepicker:{now:\"Now\",today:\"Today\",cancel:\"Cancel\",clear:\"Clear\",confirm:\"OK\",dateTablePrompt:\"Use the arrow keys and enter to select the day of the month\",monthTablePrompt:\"Use the arrow keys and enter to select the month\",yearTablePrompt:\"Use the arrow keys and enter to select the year\",selectedDate:\"Selected date\",selectDate:\"Select date\",selectTime:\"Select time\",startDate:\"Start Date\",startTime:\"Start Time\",endDate:\"End Date\",endTime:\"End Time\",prevYear:\"Previous Year\",nextYear:\"Next Year\",prevMonth:\"Previous Month\",nextMonth:\"Next Month\",year:\"\",month1:\"January\",month2:\"February\",month3:\"March\",month4:\"April\",month5:\"May\",month6:\"June\",month7:\"July\",month8:\"August\",month9:\"September\",month10:\"October\",month11:\"November\",month12:\"December\",week:\"week\",weeks:{sun:\"Sun\",mon:\"Mon\",tue:\"Tue\",wed:\"Wed\",thu:\"Thu\",fri:\"Fri\",sat:\"Sat\"},weeksFull:{sun:\"Sunday\",mon:\"Monday\",tue:\"Tuesday\",wed:\"Wednesday\",thu:\"Thursday\",fri:\"Friday\",sat:\"Saturday\"},months:{jan:\"Jan\",feb:\"Feb\",mar:\"Mar\",apr:\"Apr\",may:\"May\",jun:\"Jun\",jul:\"Jul\",aug:\"Aug\",sep:\"Sep\",oct:\"Oct\",nov:\"Nov\",dec:\"Dec\"}},inputNumber:{decrease:\"decrease number\",increase:\"increase number\"},select:{loading:\"Loading\",noMatch:\"No matching data\",noData:\"No data\",placeholder:\"Select\"},dropdown:{toggleDropdown:\"Toggle Dropdown\"},cascader:{noMatch:\"No matching data\",loading:\"Loading\",placeholder:\"Select\",noData:\"No data\"},pagination:{goto:\"Go to\",pagesize:\"/page\",total:\"Total {total}\",pageClassifier:\"\",deprecationWarning:\"Deprecated usages detected, please refer to the el-pagination documentation for more details\"},dialog:{close:\"Close this dialog\"},drawer:{close:\"Close this dialog\"},messagebox:{title:\"Message\",confirm:\"OK\",cancel:\"Cancel\",error:\"Illegal input\",close:\"Close this dialog\"},upload:{deleteTip:\"press delete to remove\",delete:\"Delete\",preview:\"Preview\",continue:\"Continue\"},slider:{defaultLabel:\"slider between {min} and {max}\",defaultRangeStartLabel:\"pick start value\",defaultRangeEndLabel:\"pick end value\"},table:{emptyText:\"No Data\",confirmFilter:\"Confirm\",resetFilter:\"Reset\",clearFilter:\"All\",sumText:\"Sum\"},tree:{emptyText:\"No Data\"},transfer:{noMatch:\"No matching data\",noData:\"No data\",titles:[\"List 1\",\"List 2\"],filterPlaceholder:\"Enter keyword\",noCheckedFormat:\"{total} items\",hasCheckedFormat:\"{checked}/{total} checked\"},image:{error:\"FAILED\"},pageHeader:{title:\"Back\"},popconfirm:{confirmButtonText:\"Yes\",cancelButtonText:\"No\"}}};const V8=e=>(t,n)=>K8(t,n,v(e)),K8=(e,t,n)=>dd(n,e,e).replace(/\\{(\\w+)\\}/g,(r,o)=>{var s;return`${(s=t==null?void 0:t[o])!=null?s:`{${o}}`}`}),W8=e=>{const t=K(()=>v(e).name),n=Pe(e)?e:W(e);return{lang:t,locale:n,t:V8(e)}},Od=()=>{const e=cn(\"locale\");return W8(K(()=>e.value||q8))},Y8=e=>{Pe(e)||eo(\"[useLockscreen]\",\"You need to pass a ref param to this function\");const t=ze(\"popup\"),n=Wc(()=>t.bm(\"parent\",\"hidden\"));if(!ct||su(document.body,n.value))return;let r=0,o=!1,s=\"0\";const i=()=>{setTimeout(()=>{$8(document.body,n.value),o&&(document.body.style.width=s)},200)};Ae(e,a=>{if(!a){i();return}o=!su(document.body,n.value),o&&(s=document.body.style.width),r=O8(t.namespace.value);const l=document.documentElement.clientHeight<document.body.scrollHeight,u=x8(document.body,\"overflowY\");r>0&&(l||u===\"scroll\")&&o&&(document.body.style.width=`calc(100% - ${r}px)`),k8(document.body,n.value)}),Pc(()=>i())},Pd=e=>{if(!e)return{onClick:me,onMousedown:me,onMouseup:me};let t=!1,n=!1;return{onClick:i=>{t&&n&&e(i),t=n=!1},onMousedown:i=>{t=i.target===i.currentTarget},onMouseup:i=>{n=i.target===i.currentTarget}}};let zn=[];const au=e=>{const t=e;t.key===ga.esc&&zn.forEach(n=>n(t))},J8=e=>{$t(()=>{zn.length===0&&document.addEventListener(\"keydown\",au),ct&&zn.push(e)}),Tn(()=>{zn=zn.filter(t=>t!==e),zn.length===0&&ct&&document.removeEventListener(\"keydown\",au)})},lu=W(0),Td=()=>{const e=cn(\"zIndex\",2e3),t=K(()=>e.value+lu.value);return{initialZIndex:e,currentZIndex:t,nextZIndex:()=>(lu.value++,t.value)}};var Je=(e,t)=>{const n=e.__vccOpts||e;for(const[r,o]of t)n[r]=o;return n};const X8=Ve({size:{type:fe([Number,String])},color:{type:String}}),Z8={name:\"ElIcon\",inheritAttrs:!1},G8=$e(Ue(Ee({},Z8),{props:X8,setup(e){const t=e,n=ze(\"icon\"),r=K(()=>{const{size:o,color:s}=t;return!o&&!s?{}:{fontSize:w8(o)?void 0:ir(o),\"--color\":s}});return(o,s)=>($(),I(\"i\",Hr({class:v(n).b(),style:v(r)},o.$attrs),[pe(o.$slots,\"default\")],16))}}));var Q8=Je(G8,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/icon/src/icon.vue\"]]);const et=An(Q8),Kn=4,ey={vertical:{offset:\"offsetHeight\",scroll:\"scrollTop\",scrollSize:\"scrollHeight\",size:\"height\",key:\"vertical\",axis:\"Y\",client:\"clientY\",direction:\"top\"},horizontal:{offset:\"offsetWidth\",scroll:\"scrollLeft\",scrollSize:\"scrollWidth\",size:\"width\",key:\"horizontal\",axis:\"X\",client:\"clientX\",direction:\"left\"}},ty=({move:e,size:t,bar:n})=>({[n.size]:t,transform:`translate${n.axis}(${e}%)`}),ny=Ve({vertical:Boolean,size:String,move:Number,ratio:{type:Number,required:!0},always:Boolean}),ry=$e({__name:\"thumb\",props:ny,setup(e){const t=e,n=\"Thumb\",r=Oe(Cd),o=ze(\"scrollbar\");r||eo(n,\"can not inject scrollbar context\");const s=W(),i=W(),a=W({}),l=W(!1);let u=!1,c=!1,d=ct?document.onselectstart:null;const f=K(()=>ey[t.vertical?\"vertical\":\"horizontal\"]),p=K(()=>ty({size:t.size,move:t.move,bar:f.value})),m=K(()=>oo(s.value[f.value.offset],2)/r.wrapElement[f.value.scrollSize]/t.ratio/i.value[f.value.offset]),_=P=>{var C;if(P.stopPropagation(),P.ctrlKey||[1,2].includes(P.button))return;(C=window.getSelection())==null||C.removeAllRanges(),y(P);const T=P.currentTarget;!T||(a.value[f.value.axis]=T[f.value.offset]-(P[f.value.client]-T.getBoundingClientRect()[f.value.direction]))},S=P=>{if(!i.value||!s.value||!r.wrapElement)return;const C=Math.abs(P.target.getBoundingClientRect()[f.value.direction]-P[f.value.client]),T=i.value[f.value.offset]/2,N=(C-T)*100*m.value/s.value[f.value.offset];r.wrapElement[f.value.scroll]=N*r.wrapElement[f.value.scrollSize]/100},y=P=>{P.stopImmediatePropagation(),u=!0,document.addEventListener(\"mousemove\",E),document.addEventListener(\"mouseup\",w),d=document.onselectstart,document.onselectstart=()=>!1},E=P=>{if(!s.value||!i.value||u===!1)return;const C=a.value[f.value.axis];if(!C)return;const T=(s.value.getBoundingClientRect()[f.value.direction]-P[f.value.client])*-1,N=i.value[f.value.offset]-C,q=(T-N)*100*m.value/s.value[f.value.offset];r.wrapElement[f.value.scroll]=q*r.wrapElement[f.value.scrollSize]/100},w=()=>{u=!1,a.value[f.value.axis]=0,document.removeEventListener(\"mousemove\",E),document.removeEventListener(\"mouseup\",w),L(),c&&(l.value=!1)},x=()=>{c=!1,l.value=!!t.size},b=()=>{c=!0,l.value=u};Tn(()=>{L(),document.removeEventListener(\"mouseup\",w)});const L=()=>{document.onselectstart!==d&&(document.onselectstart=d)};return St(Sn(r,\"scrollbarElement\"),\"mousemove\",x),St(Sn(r,\"scrollbarElement\"),\"mouseleave\",b),(P,C)=>($(),ie(fr,{name:v(o).b(\"fade\"),persisted:\"\"},{default:re(()=>[Zr(A(\"div\",{ref_key:\"instance\",ref:s,class:J([v(o).e(\"bar\"),v(o).is(v(f).key)]),onMousedown:S},[A(\"div\",{ref_key:\"thumb\",ref:i,class:J(v(o).e(\"thumb\")),style:Ne(v(p)),onMousedown:_},null,38)],34),[[Gr,P.always||l.value]])]),_:1},8,[\"name\"]))}});var uu=Je(ry,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/scrollbar/src/thumb.vue\"]]);const oy=Ve({always:{type:Boolean,default:!0},width:String,height:String,ratioX:{type:Number,default:1},ratioY:{type:Number,default:1}}),sy=$e({__name:\"bar\",props:oy,setup(e,{expose:t}){const n=e,r=W(0),o=W(0);return t({handleScroll:i=>{if(i){const a=i.offsetHeight-Kn,l=i.offsetWidth-Kn;o.value=i.scrollTop*100/a*n.ratioY,r.value=i.scrollLeft*100/l*n.ratioX}}}),(i,a)=>($(),I(Ie,null,[ee(uu,{move:r.value,ratio:i.ratioX,size:i.width,always:i.always},null,8,[\"move\",\"ratio\",\"size\",\"always\"]),ee(uu,{move:o.value,ratio:i.ratioY,size:i.height,vertical:\"\",always:i.always},null,8,[\"move\",\"ratio\",\"size\",\"always\"])],64))}});var iy=Je(sy,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/scrollbar/src/bar.vue\"]]);const ay=Ve({height:{type:[String,Number],default:\"\"},maxHeight:{type:[String,Number],default:\"\"},native:Boolean,wrapStyle:{type:fe([String,Object,Array]),default:\"\"},wrapClass:{type:[String,Array],default:\"\"},viewClass:{type:[String,Array],default:\"\"},viewStyle:{type:[String,Array,Object],default:\"\"},noresize:Boolean,tag:{type:String,default:\"div\"},always:Boolean,minSize:{type:Number,default:20}}),ly={scroll:({scrollTop:e,scrollLeft:t})=>[e,t].every(Ft)},uy={name:\"ElScrollbar\"},cy=$e(Ue(Ee({},uy),{props:ay,emits:ly,setup(e,{expose:t,emit:n}){const r=e,o=ze(\"scrollbar\");let s,i;const a=W(),l=W(),u=W(),c=W(\"0\"),d=W(\"0\"),f=W(),p=W(1),m=W(1),_=K(()=>{const b={};return r.height&&(b.height=ir(r.height)),r.maxHeight&&(b.maxHeight=ir(r.maxHeight)),[r.wrapStyle,b]}),S=()=>{var b;l.value&&((b=f.value)==null||b.handleScroll(l.value),n(\"scroll\",{scrollTop:l.value.scrollTop,scrollLeft:l.value.scrollLeft}))};function y(b,L){ve(b)?l.value.scrollTo(b):Ft(b)&&Ft(L)&&l.value.scrollTo(b,L)}const E=b=>{!Ft(b)||(l.value.scrollTop=b)},w=b=>{!Ft(b)||(l.value.scrollLeft=b)},x=()=>{if(!l.value)return;const b=l.value.offsetHeight-Kn,L=l.value.offsetWidth-Kn,P=oo(b,2)/l.value.scrollHeight,C=oo(L,2)/l.value.scrollWidth,T=Math.max(P,r.minSize),N=Math.max(C,r.minSize);p.value=P/(b-P)/(T/(b-T)),m.value=C/(L-C)/(N/(L-N)),d.value=T+Kn<b?`${T}px`:\"\",c.value=N+Kn<L?`${N}px`:\"\"};return Ae(()=>r.noresize,b=>{b?(s==null||s(),i==null||i()):({stop:s}=md(u,x),i=St(\"resize\",x))},{immediate:!0}),Ae(()=>[r.maxHeight,r.height],()=>{r.native||jt(()=>{var b;x(),l.value&&((b=f.value)==null||b.handleScroll(l.value))})}),nt(Cd,un({scrollbarElement:a,wrapElement:l})),$t(()=>{r.native||jt(()=>{x()})}),Zi(()=>x()),t({wrap$:l,update:x,scrollTo:y,setScrollTop:E,setScrollLeft:w,handleScroll:S}),(b,L)=>($(),I(\"div\",{ref_key:\"scrollbar$\",ref:a,class:J(v(o).b())},[A(\"div\",{ref_key:\"wrap$\",ref:l,class:J([b.wrapClass,v(o).e(\"wrap\"),{[v(o).em(\"wrap\",\"hidden-default\")]:!b.native}]),style:Ne(v(_)),onScroll:S},[($(),ie(Cn(b.tag),{ref_key:\"resize$\",ref:u,class:J([v(o).e(\"view\"),b.viewClass]),style:Ne(b.viewStyle)},{default:re(()=>[pe(b.$slots,\"default\")]),_:3},8,[\"class\",\"style\"]))],38),b.native?le(\"v-if\",!0):($(),ie(iy,{key:0,ref_key:\"barRef\",ref:f,height:d.value,width:c.value,always:b.always,\"ratio-x\":m.value,\"ratio-y\":p.value},null,8,[\"height\",\"width\",\"always\",\"ratio-x\",\"ratio-y\"]))],2))}}));var fy=Je(cy,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/scrollbar/src/scrollbar.vue\"]]);const Rd=An(fy),Ad=e=>{const t=[],n=document.createTreeWalker(e,NodeFilter.SHOW_ELEMENT,{acceptNode:r=>{const o=r.tagName===\"INPUT\"&&r.type===\"hidden\";return r.disabled||r.hidden||o?NodeFilter.FILTER_SKIP:r.tabIndex>=0||r===document.activeElement?NodeFilter.FILTER_ACCEPT:NodeFilter.FILTER_SKIP}});for(;n.nextNode();)t.push(n.currentNode);return t},cu=(e,t)=>{for(const n of e)if(!dy(n,t))return n},dy=(e,t)=>{if(getComputedStyle(e).visibility===\"hidden\")return!0;for(;e;){if(t&&e===t)return!1;if(getComputedStyle(e).display===\"none\")return!0;e=e.parentElement}return!1},py=e=>{const t=Ad(e),n=cu(t,e),r=cu(t.reverse(),e);return[n,r]},hy=e=>e instanceof HTMLInputElement&&\"select\"in e,Jt=(e,t)=>{if(e&&e.focus){const n=document.activeElement;e.focus({preventScroll:!0}),e!==n&&hy(e)&&t&&e.select()}};function fu(e,t){const n=[...e],r=e.indexOf(t);return r!==-1&&n.splice(r,1),n}const my=()=>{let e=[];return{push:r=>{const o=e[0];o&&r!==o&&o.pause(),e=fu(e,r),e.unshift(r)},remove:r=>{var o,s;e=fu(e,r),(s=(o=e[0])==null?void 0:o.resume)==null||s.call(o)}}},vy=(e,t=!1)=>{const n=document.activeElement;for(const r of e)if(Jt(r,t),document.activeElement!==n)return},du=my(),xs=\"focus-trap.focus-after-trapped\",Os=\"focus-trap.focus-after-released\",pu={cancelable:!0,bubbles:!1},hu=\"focusAfterTrapped\",mu=\"focusAfterReleased\",Ld=Symbol(\"elFocusTrap\"),gy=$e({name:\"ElFocusTrap\",inheritAttrs:!1,props:{loop:Boolean,trapped:Boolean,focusTrapEl:Object,focusStartEl:{type:[Object,String],default:\"first\"}},emits:[hu,mu,\"focusin\",\"focusout\",\"focusout-prevented\",\"release-requested\"],setup(e,{emit:t}){const n=W();let r,o;J8(p=>{e.trapped&&!s.paused&&t(\"release-requested\",p)});const s={paused:!1,pause(){this.paused=!0},resume(){this.paused=!1}},i=p=>{if(!e.loop&&!e.trapped||s.paused)return;const{key:m,altKey:_,ctrlKey:S,metaKey:y,currentTarget:E,shiftKey:w}=p,{loop:x}=e,b=m===ga.tab&&!_&&!S&&!y,L=document.activeElement;if(b&&L){const P=E,[C,T]=py(P);C&&T?!w&&L===T?(p.preventDefault(),x&&Jt(C,!0),t(\"focusout-prevented\")):w&&[C,P].includes(L)&&(p.preventDefault(),x&&Jt(T,!0),t(\"focusout-prevented\")):L===P&&(p.preventDefault(),t(\"focusout-prevented\"))}};nt(Ld,{focusTrapRef:n,onKeydown:i}),Ae(()=>e.focusTrapEl,p=>{p&&(n.value=p)},{immediate:!0}),Ae([n],([p],[m])=>{p&&(p.addEventListener(\"keydown\",i),p.addEventListener(\"focusin\",u),p.addEventListener(\"focusout\",c)),m&&(m.removeEventListener(\"keydown\",i),m.removeEventListener(\"focusin\",u),m.removeEventListener(\"focusout\",c))});const a=p=>{t(hu,p)},l=p=>t(mu,p),u=p=>{const m=v(n);if(!m)return;const _=p.target,S=_&&m.contains(_);S&&t(\"focusin\",p),!s.paused&&e.trapped&&(S?o=_:Jt(o,!0))},c=p=>{const m=v(n);if(!(s.paused||!m))if(e.trapped){const _=p.relatedTarget;!pd(_)&&!m.contains(_)&&setTimeout(()=>{!s.paused&&e.trapped&&Jt(o,!0)},0)}else{const _=p.target;_&&m.contains(_)||t(\"focusout\",p)}};function d(){return ft(this,null,function*(){yield jt();const p=v(n);if(p){du.push(s);const m=document.activeElement;if(r=m,!p.contains(m)){const S=new Event(xs,pu);p.addEventListener(xs,a),p.dispatchEvent(S),S.defaultPrevented||jt(()=>{let y=e.focusStartEl;be(y)||(Jt(y),document.activeElement!==y&&(y=\"first\")),y===\"first\"&&vy(Ad(p),!0),(document.activeElement===m||y===\"container\")&&Jt(p)})}}})}function f(){const p=v(n);if(p){p.removeEventListener(xs,a);const m=new Event(Os,pu);p.addEventListener(Os,l),p.dispatchEvent(m),m.defaultPrevented||Jt(r!=null?r:document.body,!0),p.removeEventListener(Os,a),du.remove(s)}}return $t(()=>{e.trapped&&d(),Ae(()=>e.trapped,p=>{p?d():f()})}),Tn(()=>{e.trapped&&f()}),{onKeydown:i}}});function _y(e,t,n,r,o,s){return pe(e.$slots,\"default\",{handleKeydown:e.onKeydown})}var yy=Je(gy,[[\"render\",_y],[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/focus-trap/src/focus-trap.vue\"]]);const by=Ve({value:{type:[String,Number],default:\"\"},max:{type:Number,default:99},isDot:Boolean,hidden:Boolean,type:{type:String,values:[\"primary\",\"success\",\"warning\",\"info\",\"danger\"],default:\"danger\"}}),wy=[\"textContent\"],Ey={name:\"ElBadge\"},Sy=$e(Ue(Ee({},Ey),{props:by,setup(e,{expose:t}){const n=e,r=ze(\"badge\"),o=K(()=>n.isDot?\"\":Ft(n.value)&&Ft(n.max)?n.max<n.value?`${n.max}+`:`${n.value}`:`${n.value}`);return t({content:o}),(s,i)=>($(),I(\"div\",{class:J(v(r).b())},[pe(s.$slots,\"default\"),ee(fr,{name:`${v(r).namespace.value}-zoom-in-center`,persisted:\"\"},{default:re(()=>[Zr(A(\"sup\",{class:J([v(r).e(\"content\"),v(r).em(\"content\",s.type),v(r).is(\"fixed\",!!s.$slots.default),v(r).is(\"dot\",s.isDot)]),textContent:tt(v(o))},null,10,wy),[[Gr,!s.hidden&&(v(o)||s.isDot)]])]),_:1},8,[\"name\"])],2))}}));var Cy=Je(Sy,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/badge/src/badge.vue\"]]);const ky=An(Cy),$y=[\"default\",\"primary\",\"success\",\"warning\",\"info\",\"danger\",\"text\",\"\"],xy=[\"button\",\"submit\",\"reset\"],_i=Ve({size:xd,disabled:Boolean,type:{type:String,values:$y,default:\"\"},icon:{type:Mo},nativeType:{type:String,values:xy,default:\"button\"},loading:Boolean,loadingIcon:{type:Mo,default:()=>od},plain:Boolean,text:Boolean,link:Boolean,bg:Boolean,autofocus:Boolean,round:Boolean,circle:Boolean,color:String,dark:Boolean,autoInsertSpace:{type:Boolean,default:void 0}}),Oy={click:e=>e instanceof MouseEvent};function qe(e,t){Py(e)&&(e=\"100%\");var n=Ty(e);return e=t===360?e:Math.min(t,Math.max(0,parseFloat(e))),n&&(e=parseInt(String(e*t),10)/100),Math.abs(e-t)<1e-6?1:(t===360?e=(e<0?e%t+t:e%t)/parseFloat(String(t)):e=e%t/parseFloat(String(t)),e)}function po(e){return Math.min(1,Math.max(0,e))}function Py(e){return typeof e==\"string\"&&e.indexOf(\".\")!==-1&&parseFloat(e)===1}function Ty(e){return typeof e==\"string\"&&e.indexOf(\"%\")!==-1}function Ud(e){return e=parseFloat(e),(isNaN(e)||e<0||e>1)&&(e=1),e}function ho(e){return e<=1?\"\".concat(Number(e)*100,\"%\"):e}function wn(e){return e.length===1?\"0\"+e:String(e)}function Ry(e,t,n){return{r:qe(e,255)*255,g:qe(t,255)*255,b:qe(n,255)*255}}function vu(e,t,n){e=qe(e,255),t=qe(t,255),n=qe(n,255);var r=Math.max(e,t,n),o=Math.min(e,t,n),s=0,i=0,a=(r+o)/2;if(r===o)i=0,s=0;else{var l=r-o;switch(i=a>.5?l/(2-r-o):l/(r+o),r){case e:s=(t-n)/l+(t<n?6:0);break;case t:s=(n-e)/l+2;break;case n:s=(e-t)/l+4;break}s/=6}return{h:s,s:i,l:a}}function Ps(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+(t-e)*(6*n):n<1/2?t:n<2/3?e+(t-e)*(2/3-n)*6:e}function Ay(e,t,n){var r,o,s;if(e=qe(e,360),t=qe(t,100),n=qe(n,100),t===0)o=n,s=n,r=n;else{var i=n<.5?n*(1+t):n+t-n*t,a=2*n-i;r=Ps(a,i,e+1/3),o=Ps(a,i,e),s=Ps(a,i,e-1/3)}return{r:r*255,g:o*255,b:s*255}}function gu(e,t,n){e=qe(e,255),t=qe(t,255),n=qe(n,255);var r=Math.max(e,t,n),o=Math.min(e,t,n),s=0,i=r,a=r-o,l=r===0?0:a/r;if(r===o)s=0;else{switch(r){case e:s=(t-n)/a+(t<n?6:0);break;case t:s=(n-e)/a+2;break;case n:s=(e-t)/a+4;break}s/=6}return{h:s,s:l,v:i}}function Ly(e,t,n){e=qe(e,360)*6,t=qe(t,100),n=qe(n,100);var r=Math.floor(e),o=e-r,s=n*(1-t),i=n*(1-o*t),a=n*(1-(1-o)*t),l=r%6,u=[n,i,s,s,a,n][l],c=[a,n,n,i,s,s][l],d=[s,s,a,n,n,i][l];return{r:u*255,g:c*255,b:d*255}}function _u(e,t,n,r){var o=[wn(Math.round(e).toString(16)),wn(Math.round(t).toString(16)),wn(Math.round(n).toString(16))];return r&&o[0].startsWith(o[0].charAt(1))&&o[1].startsWith(o[1].charAt(1))&&o[2].startsWith(o[2].charAt(1))?o[0].charAt(0)+o[1].charAt(0)+o[2].charAt(0):o.join(\"\")}function Uy(e,t,n,r,o){var s=[wn(Math.round(e).toString(16)),wn(Math.round(t).toString(16)),wn(Math.round(n).toString(16)),wn(My(r))];return o&&s[0].startsWith(s[0].charAt(1))&&s[1].startsWith(s[1].charAt(1))&&s[2].startsWith(s[2].charAt(1))&&s[3].startsWith(s[3].charAt(1))?s[0].charAt(0)+s[1].charAt(0)+s[2].charAt(0)+s[3].charAt(0):s.join(\"\")}function My(e){return Math.round(parseFloat(e)*255).toString(16)}function yu(e){return at(e)/255}function at(e){return parseInt(e,16)}function Iy(e){return{r:e>>16,g:(e&65280)>>8,b:e&255}}var yi={aliceblue:\"#f0f8ff\",antiquewhite:\"#faebd7\",aqua:\"#00ffff\",aquamarine:\"#7fffd4\",azure:\"#f0ffff\",beige:\"#f5f5dc\",bisque:\"#ffe4c4\",black:\"#000000\",blanchedalmond:\"#ffebcd\",blue:\"#0000ff\",blueviolet:\"#8a2be2\",brown:\"#a52a2a\",burlywood:\"#deb887\",cadetblue:\"#5f9ea0\",chartreuse:\"#7fff00\",chocolate:\"#d2691e\",coral:\"#ff7f50\",cornflowerblue:\"#6495ed\",cornsilk:\"#fff8dc\",crimson:\"#dc143c\",cyan:\"#00ffff\",darkblue:\"#00008b\",darkcyan:\"#008b8b\",darkgoldenrod:\"#b8860b\",darkgray:\"#a9a9a9\",darkgreen:\"#006400\",darkgrey:\"#a9a9a9\",darkkhaki:\"#bdb76b\",darkmagenta:\"#8b008b\",darkolivegreen:\"#556b2f\",darkorange:\"#ff8c00\",darkorchid:\"#9932cc\",darkred:\"#8b0000\",darksalmon:\"#e9967a\",darkseagreen:\"#8fbc8f\",darkslateblue:\"#483d8b\",darkslategray:\"#2f4f4f\",darkslategrey:\"#2f4f4f\",darkturquoise:\"#00ced1\",darkviolet:\"#9400d3\",deeppink:\"#ff1493\",deepskyblue:\"#00bfff\",dimgray:\"#696969\",dimgrey:\"#696969\",dodgerblue:\"#1e90ff\",firebrick:\"#b22222\",floralwhite:\"#fffaf0\",forestgreen:\"#228b22\",fuchsia:\"#ff00ff\",gainsboro:\"#dcdcdc\",ghostwhite:\"#f8f8ff\",goldenrod:\"#daa520\",gold:\"#ffd700\",gray:\"#808080\",green:\"#008000\",greenyellow:\"#adff2f\",grey:\"#808080\",honeydew:\"#f0fff0\",hotpink:\"#ff69b4\",indianred:\"#cd5c5c\",indigo:\"#4b0082\",ivory:\"#fffff0\",khaki:\"#f0e68c\",lavenderblush:\"#fff0f5\",lavender:\"#e6e6fa\",lawngreen:\"#7cfc00\",lemonchiffon:\"#fffacd\",lightblue:\"#add8e6\",lightcoral:\"#f08080\",lightcyan:\"#e0ffff\",lightgoldenrodyellow:\"#fafad2\",lightgray:\"#d3d3d3\",lightgreen:\"#90ee90\",lightgrey:\"#d3d3d3\",lightpink:\"#ffb6c1\",lightsalmon:\"#ffa07a\",lightseagreen:\"#20b2aa\",lightskyblue:\"#87cefa\",lightslategray:\"#778899\",lightslategrey:\"#778899\",lightsteelblue:\"#b0c4de\",lightyellow:\"#ffffe0\",lime:\"#00ff00\",limegreen:\"#32cd32\",linen:\"#faf0e6\",magenta:\"#ff00ff\",maroon:\"#800000\",mediumaquamarine:\"#66cdaa\",mediumblue:\"#0000cd\",mediumorchid:\"#ba55d3\",mediumpurple:\"#9370db\",mediumseagreen:\"#3cb371\",mediumslateblue:\"#7b68ee\",mediumspringgreen:\"#00fa9a\",mediumturquoise:\"#48d1cc\",mediumvioletred:\"#c71585\",midnightblue:\"#191970\",mintcream:\"#f5fffa\",mistyrose:\"#ffe4e1\",moccasin:\"#ffe4b5\",navajowhite:\"#ffdead\",navy:\"#000080\",oldlace:\"#fdf5e6\",olive:\"#808000\",olivedrab:\"#6b8e23\",orange:\"#ffa500\",orangered:\"#ff4500\",orchid:\"#da70d6\",palegoldenrod:\"#eee8aa\",palegreen:\"#98fb98\",paleturquoise:\"#afeeee\",palevioletred:\"#db7093\",papayawhip:\"#ffefd5\",peachpuff:\"#ffdab9\",peru:\"#cd853f\",pink:\"#ffc0cb\",plum:\"#dda0dd\",powderblue:\"#b0e0e6\",purple:\"#800080\",rebeccapurple:\"#663399\",red:\"#ff0000\",rosybrown:\"#bc8f8f\",royalblue:\"#4169e1\",saddlebrown:\"#8b4513\",salmon:\"#fa8072\",sandybrown:\"#f4a460\",seagreen:\"#2e8b57\",seashell:\"#fff5ee\",sienna:\"#a0522d\",silver:\"#c0c0c0\",skyblue:\"#87ceeb\",slateblue:\"#6a5acd\",slategray:\"#708090\",slategrey:\"#708090\",snow:\"#fffafa\",springgreen:\"#00ff7f\",steelblue:\"#4682b4\",tan:\"#d2b48c\",teal:\"#008080\",thistle:\"#d8bfd8\",tomato:\"#ff6347\",turquoise:\"#40e0d0\",violet:\"#ee82ee\",wheat:\"#f5deb3\",white:\"#ffffff\",whitesmoke:\"#f5f5f5\",yellow:\"#ffff00\",yellowgreen:\"#9acd32\"};function By(e){var t={r:0,g:0,b:0},n=1,r=null,o=null,s=null,i=!1,a=!1;return typeof e==\"string\"&&(e=Dy(e)),typeof e==\"object\"&&(Mt(e.r)&&Mt(e.g)&&Mt(e.b)?(t=Ry(e.r,e.g,e.b),i=!0,a=String(e.r).substr(-1)===\"%\"?\"prgb\":\"rgb\"):Mt(e.h)&&Mt(e.s)&&Mt(e.v)?(r=ho(e.s),o=ho(e.v),t=Ly(e.h,r,o),i=!0,a=\"hsv\"):Mt(e.h)&&Mt(e.s)&&Mt(e.l)&&(r=ho(e.s),s=ho(e.l),t=Ay(e.h,r,s),i=!0,a=\"hsl\"),Object.prototype.hasOwnProperty.call(e,\"a\")&&(n=e.a)),n=Ud(n),{ok:i,format:e.format||a,r:Math.min(255,Math.max(t.r,0)),g:Math.min(255,Math.max(t.g,0)),b:Math.min(255,Math.max(t.b,0)),a:n}}var Fy=\"[-\\\\+]?\\\\d+%?\",Ny=\"[-\\\\+]?\\\\d*\\\\.\\\\d+%?\",en=\"(?:\".concat(Ny,\")|(?:\").concat(Fy,\")\"),Ts=\"[\\\\s|\\\\(]+(\".concat(en,\")[,|\\\\s]+(\").concat(en,\")[,|\\\\s]+(\").concat(en,\")\\\\s*\\\\)?\"),Rs=\"[\\\\s|\\\\(]+(\".concat(en,\")[,|\\\\s]+(\").concat(en,\")[,|\\\\s]+(\").concat(en,\")[,|\\\\s]+(\").concat(en,\")\\\\s*\\\\)?\"),bt={CSS_UNIT:new RegExp(en),rgb:new RegExp(\"rgb\"+Ts),rgba:new RegExp(\"rgba\"+Rs),hsl:new RegExp(\"hsl\"+Ts),hsla:new RegExp(\"hsla\"+Rs),hsv:new RegExp(\"hsv\"+Ts),hsva:new RegExp(\"hsva\"+Rs),hex3:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex6:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,hex4:/^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,hex8:/^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/};function Dy(e){if(e=e.trim().toLowerCase(),e.length===0)return!1;var t=!1;if(yi[e])e=yi[e],t=!0;else if(e===\"transparent\")return{r:0,g:0,b:0,a:0,format:\"name\"};var n=bt.rgb.exec(e);return n?{r:n[1],g:n[2],b:n[3]}:(n=bt.rgba.exec(e),n?{r:n[1],g:n[2],b:n[3],a:n[4]}:(n=bt.hsl.exec(e),n?{h:n[1],s:n[2],l:n[3]}:(n=bt.hsla.exec(e),n?{h:n[1],s:n[2],l:n[3],a:n[4]}:(n=bt.hsv.exec(e),n?{h:n[1],s:n[2],v:n[3]}:(n=bt.hsva.exec(e),n?{h:n[1],s:n[2],v:n[3],a:n[4]}:(n=bt.hex8.exec(e),n?{r:at(n[1]),g:at(n[2]),b:at(n[3]),a:yu(n[4]),format:t?\"name\":\"hex8\"}:(n=bt.hex6.exec(e),n?{r:at(n[1]),g:at(n[2]),b:at(n[3]),format:t?\"name\":\"hex\"}:(n=bt.hex4.exec(e),n?{r:at(n[1]+n[1]),g:at(n[2]+n[2]),b:at(n[3]+n[3]),a:yu(n[4]+n[4]),format:t?\"name\":\"hex8\"}:(n=bt.hex3.exec(e),n?{r:at(n[1]+n[1]),g:at(n[2]+n[2]),b:at(n[3]+n[3]),format:t?\"name\":\"hex\"}:!1)))))))))}function Mt(e){return Boolean(bt.CSS_UNIT.exec(String(e)))}var Hy=function(){function e(t,n){t===void 0&&(t=\"\"),n===void 0&&(n={});var r;if(t instanceof e)return t;typeof t==\"number\"&&(t=Iy(t)),this.originalInput=t;var o=By(t);this.originalInput=t,this.r=o.r,this.g=o.g,this.b=o.b,this.a=o.a,this.roundA=Math.round(100*this.a)/100,this.format=(r=n.format)!==null&&r!==void 0?r:o.format,this.gradientType=n.gradientType,this.r<1&&(this.r=Math.round(this.r)),this.g<1&&(this.g=Math.round(this.g)),this.b<1&&(this.b=Math.round(this.b)),this.isValid=o.ok}return e.prototype.isDark=function(){return this.getBrightness()<128},e.prototype.isLight=function(){return!this.isDark()},e.prototype.getBrightness=function(){var t=this.toRgb();return(t.r*299+t.g*587+t.b*114)/1e3},e.prototype.getLuminance=function(){var t=this.toRgb(),n,r,o,s=t.r/255,i=t.g/255,a=t.b/255;return s<=.03928?n=s/12.92:n=Math.pow((s+.055)/1.055,2.4),i<=.03928?r=i/12.92:r=Math.pow((i+.055)/1.055,2.4),a<=.03928?o=a/12.92:o=Math.pow((a+.055)/1.055,2.4),.2126*n+.7152*r+.0722*o},e.prototype.getAlpha=function(){return this.a},e.prototype.setAlpha=function(t){return this.a=Ud(t),this.roundA=Math.round(100*this.a)/100,this},e.prototype.toHsv=function(){var t=gu(this.r,this.g,this.b);return{h:t.h*360,s:t.s,v:t.v,a:this.a}},e.prototype.toHsvString=function(){var t=gu(this.r,this.g,this.b),n=Math.round(t.h*360),r=Math.round(t.s*100),o=Math.round(t.v*100);return this.a===1?\"hsv(\".concat(n,\", \").concat(r,\"%, \").concat(o,\"%)\"):\"hsva(\".concat(n,\", \").concat(r,\"%, \").concat(o,\"%, \").concat(this.roundA,\")\")},e.prototype.toHsl=function(){var t=vu(this.r,this.g,this.b);return{h:t.h*360,s:t.s,l:t.l,a:this.a}},e.prototype.toHslString=function(){var t=vu(this.r,this.g,this.b),n=Math.round(t.h*360),r=Math.round(t.s*100),o=Math.round(t.l*100);return this.a===1?\"hsl(\".concat(n,\", \").concat(r,\"%, \").concat(o,\"%)\"):\"hsla(\".concat(n,\", \").concat(r,\"%, \").concat(o,\"%, \").concat(this.roundA,\")\")},e.prototype.toHex=function(t){return t===void 0&&(t=!1),_u(this.r,this.g,this.b,t)},e.prototype.toHexString=function(t){return t===void 0&&(t=!1),\"#\"+this.toHex(t)},e.prototype.toHex8=function(t){return t===void 0&&(t=!1),Uy(this.r,this.g,this.b,this.a,t)},e.prototype.toHex8String=function(t){return t===void 0&&(t=!1),\"#\"+this.toHex8(t)},e.prototype.toRgb=function(){return{r:Math.round(this.r),g:Math.round(this.g),b:Math.round(this.b),a:this.a}},e.prototype.toRgbString=function(){var t=Math.round(this.r),n=Math.round(this.g),r=Math.round(this.b);return this.a===1?\"rgb(\".concat(t,\", \").concat(n,\", \").concat(r,\")\"):\"rgba(\".concat(t,\", \").concat(n,\", \").concat(r,\", \").concat(this.roundA,\")\")},e.prototype.toPercentageRgb=function(){var t=function(n){return\"\".concat(Math.round(qe(n,255)*100),\"%\")};return{r:t(this.r),g:t(this.g),b:t(this.b),a:this.a}},e.prototype.toPercentageRgbString=function(){var t=function(n){return Math.round(qe(n,255)*100)};return this.a===1?\"rgb(\".concat(t(this.r),\"%, \").concat(t(this.g),\"%, \").concat(t(this.b),\"%)\"):\"rgba(\".concat(t(this.r),\"%, \").concat(t(this.g),\"%, \").concat(t(this.b),\"%, \").concat(this.roundA,\")\")},e.prototype.toName=function(){if(this.a===0)return\"transparent\";if(this.a<1)return!1;for(var t=\"#\"+_u(this.r,this.g,this.b,!1),n=0,r=Object.entries(yi);n<r.length;n++){var o=r[n],s=o[0],i=o[1];if(t===i)return s}return!1},e.prototype.toString=function(t){var n=Boolean(t);t=t!=null?t:this.format;var r=!1,o=this.a<1&&this.a>=0,s=!n&&o&&(t.startsWith(\"hex\")||t===\"name\");return s?t===\"name\"&&this.a===0?this.toName():this.toRgbString():(t===\"rgb\"&&(r=this.toRgbString()),t===\"prgb\"&&(r=this.toPercentageRgbString()),(t===\"hex\"||t===\"hex6\")&&(r=this.toHexString()),t===\"hex3\"&&(r=this.toHexString(!0)),t===\"hex4\"&&(r=this.toHex8String(!0)),t===\"hex8\"&&(r=this.toHex8String()),t===\"name\"&&(r=this.toName()),t===\"hsl\"&&(r=this.toHslString()),t===\"hsv\"&&(r=this.toHsvString()),r||this.toHexString())},e.prototype.toNumber=function(){return(Math.round(this.r)<<16)+(Math.round(this.g)<<8)+Math.round(this.b)},e.prototype.clone=function(){return new e(this.toString())},e.prototype.lighten=function(t){t===void 0&&(t=10);var n=this.toHsl();return n.l+=t/100,n.l=po(n.l),new e(n)},e.prototype.brighten=function(t){t===void 0&&(t=10);var n=this.toRgb();return n.r=Math.max(0,Math.min(255,n.r-Math.round(255*-(t/100)))),n.g=Math.max(0,Math.min(255,n.g-Math.round(255*-(t/100)))),n.b=Math.max(0,Math.min(255,n.b-Math.round(255*-(t/100)))),new e(n)},e.prototype.darken=function(t){t===void 0&&(t=10);var n=this.toHsl();return n.l-=t/100,n.l=po(n.l),new e(n)},e.prototype.tint=function(t){return t===void 0&&(t=10),this.mix(\"white\",t)},e.prototype.shade=function(t){return t===void 0&&(t=10),this.mix(\"black\",t)},e.prototype.desaturate=function(t){t===void 0&&(t=10);var n=this.toHsl();return n.s-=t/100,n.s=po(n.s),new e(n)},e.prototype.saturate=function(t){t===void 0&&(t=10);var n=this.toHsl();return n.s+=t/100,n.s=po(n.s),new e(n)},e.prototype.greyscale=function(){return this.desaturate(100)},e.prototype.spin=function(t){var n=this.toHsl(),r=(n.h+t)%360;return n.h=r<0?360+r:r,new e(n)},e.prototype.mix=function(t,n){n===void 0&&(n=50);var r=this.toRgb(),o=new e(t).toRgb(),s=n/100,i={r:(o.r-r.r)*s+r.r,g:(o.g-r.g)*s+r.g,b:(o.b-r.b)*s+r.b,a:(o.a-r.a)*s+r.a};return new e(i)},e.prototype.analogous=function(t,n){t===void 0&&(t=6),n===void 0&&(n=30);var r=this.toHsl(),o=360/n,s=[this];for(r.h=(r.h-(o*t>>1)+720)%360;--t;)r.h=(r.h+o)%360,s.push(new e(r));return s},e.prototype.complement=function(){var t=this.toHsl();return t.h=(t.h+180)%360,new e(t)},e.prototype.monochromatic=function(t){t===void 0&&(t=6);for(var n=this.toHsv(),r=n.h,o=n.s,s=n.v,i=[],a=1/t;t--;)i.push(new e({h:r,s:o,v:s})),s=(s+a)%1;return i},e.prototype.splitcomplement=function(){var t=this.toHsl(),n=t.h;return[this,new e({h:(n+72)%360,s:t.s,l:t.l}),new e({h:(n+216)%360,s:t.s,l:t.l})]},e.prototype.onBackground=function(t){var n=this.toRgb(),r=new e(t).toRgb();return new e({r:r.r+(n.r-r.r)*n.a,g:r.g+(n.g-r.g)*n.a,b:r.b+(n.b-r.b)*n.a})},e.prototype.triad=function(){return this.polyad(3)},e.prototype.tetrad=function(){return this.polyad(4)},e.prototype.polyad=function(t){for(var n=this.toHsl(),r=n.h,o=[this],s=360/t,i=1;i<t;i++)o.push(new e({h:(r+i*s)%360,s:n.s,l:n.l}));return o},e.prototype.equals=function(t){return this.toRgbString()===new e(t).toRgbString()},e}();function Wt(e,t=20){return e.mix(\"#141414\",t).toString()}function jy(e){const t=ya(),n=ze(\"button\");return K(()=>{let r={};const o=e.color;if(o){const s=new Hy(o),i=e.dark?s.tint(20).toString():Wt(s,20);if(e.plain)r=n.cssVarBlock({\"bg-color\":e.dark?Wt(s,90):s.tint(90).toString(),\"text-color\":o,\"border-color\":e.dark?Wt(s,50):s.tint(50).toString(),\"hover-text-color\":`var(${n.cssVarName(\"color-white\")})`,\"hover-bg-color\":o,\"hover-border-color\":o,\"active-bg-color\":i,\"active-text-color\":`var(${n.cssVarName(\"color-white\")})`,\"active-border-color\":i}),t.value&&(r[n.cssVarBlockName(\"disabled-bg-color\")]=e.dark?Wt(s,90):s.tint(90).toString(),r[n.cssVarBlockName(\"disabled-text-color\")]=e.dark?Wt(s,50):s.tint(50).toString(),r[n.cssVarBlockName(\"disabled-border-color\")]=e.dark?Wt(s,80):s.tint(80).toString());else{const a=e.dark?Wt(s,30):s.tint(30).toString(),l=s.isDark()?`var(${n.cssVarName(\"color-white\")})`:`var(${n.cssVarName(\"color-black\")})`;if(r=n.cssVarBlock({\"bg-color\":o,\"text-color\":l,\"border-color\":o,\"hover-bg-color\":a,\"hover-text-color\":l,\"hover-border-color\":a,\"active-bg-color\":i,\"active-border-color\":i}),t.value){const u=e.dark?Wt(s,50):s.tint(50).toString();r[n.cssVarBlockName(\"disabled-bg-color\")]=u,r[n.cssVarBlockName(\"disabled-text-color\")]=e.dark?\"rgba(255, 255, 255, 0.5)\":`var(${n.cssVarName(\"color-white\")})`,r[n.cssVarBlockName(\"disabled-border-color\")]=u}}}return r})}const zy=[\"aria-disabled\",\"disabled\",\"autofocus\",\"type\"],qy={name:\"ElButton\"},Vy=$e(Ue(Ee({},qy),{props:_i,emits:Oy,setup(e,{expose:t,emit:n}){const r=e,o=sa();vi({from:\"type.text\",replacement:\"link\",version:\"3.0.0\",scope:\"props\",ref:\"https://element-plus.org/en-US/component/button.html#button-attributes\"},K(()=>r.type===\"text\"));const s=Oe(bd,void 0),i=cn(\"button\"),a=ze(\"button\"),{form:l}=z8(),u=F8(K(()=>s==null?void 0:s.size)),c=ya(),d=W(),f=K(()=>r.type||(s==null?void 0:s.type)||\"\"),p=K(()=>{var y,E,w;return(w=(E=r.autoInsertSpace)!=null?E:(y=i.value)==null?void 0:y.autoInsertSpace)!=null?w:!1}),m=K(()=>{var y;const E=(y=o.default)==null?void 0:y.call(o);if(p.value&&(E==null?void 0:E.length)===1){const w=E[0];if((w==null?void 0:w.type)===es){const x=w.children;return new RegExp(\"^\\\\p{Unified_Ideograph}{2}$\",\"u\").test(x.trim())}}return!1}),_=jy(r),S=y=>{r.nativeType===\"reset\"&&(l==null||l.resetFields()),n(\"click\",y)};return t({ref:d,size:u,type:f,disabled:c,shouldAddSpace:m}),(y,E)=>($(),I(\"button\",{ref_key:\"_ref\",ref:d,class:J([v(a).b(),v(a).m(v(f)),v(a).m(v(u)),v(a).is(\"disabled\",v(c)),v(a).is(\"loading\",y.loading),v(a).is(\"plain\",y.plain),v(a).is(\"round\",y.round),v(a).is(\"circle\",y.circle),v(a).is(\"text\",y.text),v(a).is(\"link\",y.link),v(a).is(\"has-bg\",y.bg)]),\"aria-disabled\":v(c)||y.loading,disabled:v(c)||y.loading,autofocus:y.autofocus,type:y.nativeType,style:Ne(v(_)),onClick:S},[y.loading?($(),I(Ie,{key:0},[y.$slots.loading?pe(y.$slots,\"loading\",{key:0}):($(),ie(v(et),{key:1,class:J(v(a).is(\"loading\"))},{default:re(()=>[($(),ie(Cn(y.loadingIcon)))]),_:1},8,[\"class\"]))],64)):y.icon||y.$slots.icon?($(),ie(v(et),{key:1},{default:re(()=>[y.icon?($(),ie(Cn(y.icon),{key:0})):pe(y.$slots,\"icon\",{key:1})]),_:3})):le(\"v-if\",!0),y.$slots.default?($(),I(\"span\",{key:2,class:J({[v(a).em(\"text\",\"expand\")]:v(m)})},[pe(y.$slots,\"default\")],2)):le(\"v-if\",!0)],14,zy))}}));var Ky=Je(Vy,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/button/src/button.vue\"]]);const Wy={size:_i.size,type:_i.type},Yy={name:\"ElButtonGroup\"},Jy=$e(Ue(Ee({},Yy),{props:Wy,setup(e){const t=e;nt(bd,un({size:Sn(t,\"size\"),type:Sn(t,\"type\")}));const n=ze(\"button\");return(r,o)=>($(),I(\"div\",{class:J(`${v(n).b(\"group\")}`)},[pe(r.$slots,\"default\")],2))}}));var Md=Je(Jy,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/button/src/button-group.vue\"]]);const Tr=An(Ky,{ButtonGroup:Md});L8(Md);var bu=typeof globalThis!=\"undefined\"?globalThis:typeof window!=\"undefined\"?window:typeof global!=\"undefined\"?global:typeof self!=\"undefined\"?self:{};function Xy(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,\"default\")?e.default:e}const bi={},Zy=Ve({a11y:{type:Boolean,default:!0},locale:{type:fe(Object)},size:xd,button:{type:fe(Object)},experimentalFeatures:{type:fe(Object)},keyboardNavigation:{type:Boolean,default:!0},message:{type:fe(Object)},zIndex:Number,namespace:{type:String,default:\"el\"}});$e({name:\"ElConfigProvider\",props:Zy,setup(e,{slots:t}){Ae(()=>e.message,r=>{Object.assign(bi,r!=null?r:{})},{immediate:!0,deep:!0});const n=I8(e);return()=>pe(t,\"default\",{config:n==null?void 0:n.value})}});const Gy=Ve({mask:{type:Boolean,default:!0},customMaskEvent:{type:Boolean,default:!1},overlayClass:{type:fe([String,Array,Object])},zIndex:{type:fe([String,Number])}}),Qy={click:e=>e instanceof MouseEvent};var e6=$e({name:\"ElOverlay\",props:Gy,emits:Qy,setup(e,{slots:t,emit:n}){const r=ze(\"overlay\"),o=l=>{n(\"click\",l)},{onClick:s,onMousedown:i,onMouseup:a}=Pd(e.customMaskEvent?void 0:o);return()=>e.mask?ee(\"div\",{class:[r.b(),e.overlayClass],style:{zIndex:e.zIndex},onClick:s,onMousedown:i,onMouseup:a},[pe(t,\"default\")],Eo.STYLE|Eo.CLASS|Eo.PROPS,[\"onClick\",\"onMouseup\",\"onMousedown\"]):os(\"div\",{class:e.overlayClass,style:{zIndex:e.zIndex,position:\"fixed\",top:\"0px\",right:\"0px\",bottom:\"0px\",left:\"0px\"}},[pe(t,\"default\")])}});const t6=e6,Id=Ve({center:{type:Boolean,default:!1},alignCenter:{type:Boolean,default:!1},closeIcon:{type:Mo},customClass:{type:String,default:\"\"},draggable:{type:Boolean,default:!1},fullscreen:{type:Boolean,default:!1},showClose:{type:Boolean,default:!0},title:{type:String,default:\"\"}}),n6={close:()=>!0},r6=[\"aria-label\"],o6=[\"id\"],s6={name:\"ElDialogContent\"},i6=$e(Ue(Ee({},s6),{props:Id,emits:n6,setup(e){const t=e,{t:n}=Od(),{Close:r}=T8,{dialogRef:o,headerRef:s,bodyId:i,ns:a,style:l}=Oe(Ed),{focusTrapRef:u}=Oe(Ld),c=U8(u,o),d=K(()=>t.draggable);return N8(o,s,d),(f,p)=>($(),I(\"div\",{ref:v(c),class:J([v(a).b(),v(a).is(\"fullscreen\",f.fullscreen),v(a).is(\"draggable\",v(d)),v(a).is(\"align-center\",f.alignCenter),{[v(a).m(\"center\")]:f.center},f.customClass]),style:Ne(v(l)),tabindex:\"-1\",onClick:p[1]||(p[1]=Dt(()=>{},[\"stop\"]))},[A(\"header\",{ref_key:\"headerRef\",ref:s,class:J(v(a).e(\"header\"))},[pe(f.$slots,\"header\",{},()=>[A(\"span\",{role:\"heading\",class:J(v(a).e(\"title\"))},tt(f.title),3)]),f.showClose?($(),I(\"button\",{key:0,\"aria-label\":v(n)(\"el.dialog.close\"),class:J(v(a).e(\"headerbtn\")),type:\"button\",onClick:p[0]||(p[0]=m=>f.$emit(\"close\"))},[ee(v(et),{class:J(v(a).e(\"close\"))},{default:re(()=>[($(),ie(Cn(f.closeIcon||v(r))))]),_:1},8,[\"class\"])],10,r6)):le(\"v-if\",!0)],2),A(\"div\",{id:v(i),class:J(v(a).e(\"body\"))},[pe(f.$slots,\"default\")],10,o6),f.$slots.footer?($(),I(\"footer\",{key:0,class:J(v(a).e(\"footer\"))},[pe(f.$slots,\"footer\")],2)):le(\"v-if\",!0)],6))}}));var a6=Je(i6,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/dialog/src/dialog-content.vue\"]]);const l6=Ve(Ue(Ee({},Id),{appendToBody:{type:Boolean,default:!1},beforeClose:{type:fe(Function)},destroyOnClose:{type:Boolean,default:!1},closeOnClickModal:{type:Boolean,default:!0},closeOnPressEscape:{type:Boolean,default:!0},lockScroll:{type:Boolean,default:!0},modal:{type:Boolean,default:!0},openDelay:{type:Number,default:0},closeDelay:{type:Number,default:0},top:{type:String},modelValue:{type:Boolean,default:!1},modalClass:String,width:{type:[String,Number]},zIndex:{type:Number},trapFocus:{type:Boolean,default:!1}})),u6={open:()=>!0,opened:()=>!0,close:()=>!0,closed:()=>!0,[yd]:e=>o8(e),openAutoFocus:()=>!0,closeAutoFocus:()=>!0},c6=(e,t)=>{const r=mt().emit,{nextZIndex:o}=Td();let s=\"\";const i=gi(),a=gi(),l=W(!1),u=W(!1),c=W(!1),d=W(e.zIndex||o());let f,p;const m=cn(\"namespace\",ba),_=K(()=>{const ne={},se=`--${m.value}-dialog`;return e.fullscreen||(e.top&&(ne[`${se}-margin-top`]=e.top),e.width&&(ne[`${se}-width`]=ir(e.width))),ne}),S=K(()=>e.alignCenter?{display:\"flex\"}:{});function y(){r(\"opened\")}function E(){r(\"closed\"),r(yd,!1),e.destroyOnClose&&(c.value=!1)}function w(){r(\"close\")}function x(){p==null||p(),f==null||f(),e.openDelay&&e.openDelay>0?{stop:f}=pi(()=>C(),e.openDelay):C()}function b(){f==null||f(),p==null||p(),e.closeDelay&&e.closeDelay>0?{stop:p}=pi(()=>T(),e.closeDelay):T()}function L(){function ne(se){se||(u.value=!0,l.value=!1)}e.beforeClose?e.beforeClose(ne):b()}function P(){e.closeOnClickModal&&L()}function C(){!ct||(l.value=!0)}function T(){l.value=!1}function N(){r(\"openAutoFocus\")}function q(){r(\"closeAutoFocus\")}e.lockScroll&&Y8(l);function B(){e.closeOnPressEscape&&L()}return Ae(()=>e.modelValue,ne=>{ne?(u.value=!1,x(),c.value=!0,d.value=e.zIndex?d.value++:o(),jt(()=>{r(\"open\"),t.value&&(t.value.scrollTop=0)})):l.value&&b()}),Ae(()=>e.fullscreen,ne=>{!t.value||(ne?(s=t.value.style.transform,t.value.style.transform=\"\"):t.value.style.transform=s)}),$t(()=>{e.modelValue&&(l.value=!0,c.value=!0,x())}),{afterEnter:y,afterLeave:E,beforeLeave:w,handleClose:L,onModalClick:P,close:b,doClose:T,onOpenAutoFocus:N,onCloseAutoFocus:q,onCloseRequested:B,titleId:i,bodyId:a,closed:u,style:_,overlayDialogStyle:S,rendered:c,visible:l,zIndex:d}},f6=[\"aria-label\",\"aria-labelledby\",\"aria-describedby\"],d6={name:\"ElDialog\",inheritAttrs:!1},p6=$e(Ue(Ee({},d6),{props:l6,emits:u6,setup(e,{expose:t}){const n=e,r=sa();vi({scope:\"el-dialog\",from:\"the title slot\",replacement:\"the header slot\",version:\"3.0.0\",ref:\"https://element-plus.org/en-US/component/dialog.html#slots\"},K(()=>!!r.title)),vi({scope:\"el-dialog\",from:\"custom-class\",replacement:\"class\",version:\"2.3.0\",ref:\"https://element-plus.org/en-US/component/dialog.html#attributes\",type:\"Attribute\"},K(()=>!!n.customClass));const o=ze(\"dialog\"),s=W(),i=W(),a=W(),{visible:l,titleId:u,bodyId:c,style:d,overlayDialogStyle:f,rendered:p,zIndex:m,afterEnter:_,afterLeave:S,beforeLeave:y,handleClose:E,onModalClick:w,onOpenAutoFocus:x,onCloseAutoFocus:b,onCloseRequested:L}=c6(n,s);nt(Ed,{dialogRef:s,headerRef:i,bodyId:c,ns:o,rendered:p,style:d});const P=Pd(w),C=K(()=>n.draggable&&!n.fullscreen);return t({visible:l,dialogContentRef:a}),(T,N)=>($(),ie(S0,{to:\"body\",disabled:!T.appendToBody},[ee(fr,{name:\"dialog-fade\",onAfterEnter:v(_),onAfterLeave:v(S),onBeforeLeave:v(y),persisted:\"\"},{default:re(()=>[Zr(ee(v(t6),{\"custom-mask-event\":\"\",mask:T.modal,\"overlay-class\":T.modalClass,\"z-index\":v(m)},{default:re(()=>[A(\"div\",{role:\"dialog\",\"aria-modal\":\"true\",\"aria-label\":T.title||void 0,\"aria-labelledby\":T.title?void 0:v(u),\"aria-describedby\":v(c),class:J(`${v(o).namespace.value}-overlay-dialog`),style:Ne(v(f)),onClick:N[0]||(N[0]=(...q)=>v(P).onClick&&v(P).onClick(...q)),onMousedown:N[1]||(N[1]=(...q)=>v(P).onMousedown&&v(P).onMousedown(...q)),onMouseup:N[2]||(N[2]=(...q)=>v(P).onMouseup&&v(P).onMouseup(...q))},[ee(v(yy),{loop:\"\",trapped:v(l),\"focus-start-el\":\"container\",onFocusAfterTrapped:v(x),onFocusAfterReleased:v(b),onReleaseRequested:v(L)},{default:re(()=>[v(p)?($(),ie(a6,Hr({key:0,ref_key:\"dialogContentRef\",ref:a},T.$attrs,{\"custom-class\":T.customClass,center:T.center,\"align-center\":T.alignCenter,\"close-icon\":T.closeIcon,draggable:v(C),fullscreen:T.fullscreen,\"show-close\":T.showClose,title:T.title,onClose:v(E)}),Gs({header:re(()=>[T.$slots.title?pe(T.$slots,\"title\",{key:1}):pe(T.$slots,\"header\",{key:0,close:v(E),titleId:v(u),titleClass:v(o).e(\"title\")})]),default:re(()=>[pe(T.$slots,\"default\")]),_:2},[T.$slots.footer?{name:\"footer\",fn:re(()=>[pe(T.$slots,\"footer\")])}:void 0]),1040,[\"custom-class\",\"center\",\"align-center\",\"close-icon\",\"draggable\",\"fullscreen\",\"show-close\",\"title\",\"onClose\"])):le(\"v-if\",!0)]),_:3},8,[\"trapped\",\"onFocusAfterTrapped\",\"onFocusAfterReleased\",\"onReleaseRequested\"])],46,f6)]),_:3},8,[\"mask\",\"overlay-class\",\"z-index\"]),[[Gr,v(l)]])]),_:3},8,[\"onAfterEnter\",\"onAfterLeave\",\"onBeforeLeave\"])],8,[\"disabled\"]))}}));var h6=Je(p6,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/dialog/src/dialog.vue\"]]);const Bd=An(h6),m6=Ve({type:{type:String,default:\"line\",values:[\"line\",\"circle\",\"dashboard\"]},percentage:{type:Number,default:0,validator:e=>e>=0&&e<=100},status:{type:String,default:\"\",values:[\"\",\"success\",\"exception\",\"warning\"]},indeterminate:{type:Boolean,default:!1},duration:{type:Number,default:3},strokeWidth:{type:Number,default:6},strokeLinecap:{type:fe(String),default:\"round\"},textInside:{type:Boolean,default:!1},width:{type:Number,default:126},showText:{type:Boolean,default:!0},color:{type:fe([String,Array,Function]),default:\"\"},format:{type:fe(Function),default:e=>`${e}%`}}),v6=[\"aria-valuenow\"],g6={viewBox:\"0 0 100 100\"},_6=[\"d\",\"stroke\",\"stroke-width\"],y6=[\"d\",\"stroke\",\"opacity\",\"stroke-linecap\",\"stroke-width\"],b6={key:0},w6={name:\"ElProgress\"},E6=$e(Ue(Ee({},w6),{props:m6,setup(e){const t=e,n={success:\"#13ce66\",exception:\"#ff4949\",warning:\"#e6a23c\",default:\"#20a0ff\"},r=ze(\"progress\"),o=K(()=>({width:`${t.percentage}%`,animationDuration:`${t.duration}s`,backgroundColor:E(t.percentage)})),s=K(()=>(t.strokeWidth/t.width*100).toFixed(1)),i=K(()=>[\"circle\",\"dashboard\"].includes(t.type)?Number.parseInt(`${50-Number.parseFloat(s.value)/2}`,10):0),a=K(()=>{const w=i.value,x=t.type===\"dashboard\";return`\n          M 50 50\n          m 0 ${x?\"\":\"-\"}${w}\n          a ${w} ${w} 0 1 1 0 ${x?\"-\":\"\"}${w*2}\n          a ${w} ${w} 0 1 1 0 ${x?\"\":\"-\"}${w*2}\n          `}),l=K(()=>2*Math.PI*i.value),u=K(()=>t.type===\"dashboard\"?.75:1),c=K(()=>`${-1*l.value*(1-u.value)/2}px`),d=K(()=>({strokeDasharray:`${l.value*u.value}px, ${l.value}px`,strokeDashoffset:c.value})),f=K(()=>({strokeDasharray:`${l.value*u.value*(t.percentage/100)}px, ${l.value}px`,strokeDashoffset:c.value,transition:\"stroke-dasharray 0.6s ease 0s, stroke 0.6s ease, opacity ease 0.6s\"})),p=K(()=>{let w;return t.color?w=E(t.percentage):w=n[t.status]||n.default,w}),m=K(()=>t.status===\"warning\"?ca:t.type===\"line\"?t.status===\"success\"?ua:nd:t.status===\"success\"?ed:Qr),_=K(()=>t.type===\"line\"?12+t.strokeWidth*.4:t.width*.111111+2),S=K(()=>t.format(t.percentage));function y(w){const x=100/w.length;return w.map((L,P)=>be(L)?{color:L,percentage:(P+1)*x}:L).sort((L,P)=>L.percentage-P.percentage)}const E=w=>{var x;const{color:b}=t;if(te(b))return b(w);if(be(b))return b;{const L=y(b);for(const P of L)if(P.percentage>w)return P.color;return(x=L[L.length-1])==null?void 0:x.color}};return(w,x)=>($(),I(\"div\",{class:J([v(r).b(),v(r).m(w.type),v(r).is(w.status),{[v(r).m(\"without-text\")]:!w.showText,[v(r).m(\"text-inside\")]:w.textInside}]),role:\"progressbar\",\"aria-valuenow\":w.percentage,\"aria-valuemin\":\"0\",\"aria-valuemax\":\"100\"},[w.type===\"line\"?($(),I(\"div\",{key:0,class:J(v(r).b(\"bar\"))},[A(\"div\",{class:J(v(r).be(\"bar\",\"outer\")),style:Ne({height:`${w.strokeWidth}px`})},[A(\"div\",{class:J([v(r).be(\"bar\",\"inner\"),{[v(r).bem(\"bar\",\"inner\",\"indeterminate\")]:w.indeterminate}]),style:Ne(v(o))},[(w.showText||w.$slots.default)&&w.textInside?($(),I(\"div\",{key:0,class:J(v(r).be(\"bar\",\"innerText\"))},[pe(w.$slots,\"default\",{percentage:w.percentage},()=>[A(\"span\",null,tt(v(S)),1)])],2)):le(\"v-if\",!0)],6)],6)],2)):($(),I(\"div\",{key:1,class:J(v(r).b(\"circle\")),style:Ne({height:`${w.width}px`,width:`${w.width}px`})},[($(),I(\"svg\",g6,[A(\"path\",{class:J(v(r).be(\"circle\",\"track\")),d:v(a),stroke:`var(${v(r).cssVarName(\"fill-color-light\")}, #e5e9f2)`,\"stroke-width\":v(s),fill:\"none\",style:Ne(v(d))},null,14,_6),A(\"path\",{class:J(v(r).be(\"circle\",\"path\")),d:v(a),stroke:v(p),fill:\"none\",opacity:w.percentage?1:0,\"stroke-linecap\":w.strokeLinecap,\"stroke-width\":v(s),style:Ne(v(f))},null,14,y6)]))],6)),(w.showText||w.$slots.default)&&!w.textInside?($(),I(\"div\",{key:2,class:J(v(r).e(\"text\")),style:Ne({fontSize:`${v(_)}px`})},[pe(w.$slots,\"default\",{percentage:w.percentage},()=>[w.status?($(),ie(v(et),{key:1},{default:re(()=>[($(),ie(Cn(v(m))))]),_:1})):($(),I(\"span\",b6,tt(v(S)),1))])],6)):le(\"v-if\",!0)],10,v6))}}));var S6=Je(E6,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/progress/src/progress.vue\"]]);const Fd=An(S6),C6=\"ElUpload\";class k6 extends Error{constructor(t,n,r,o){super(t),this.name=\"UploadAjaxError\",this.status=n,this.method=r,this.url=o}}function wu(e,t,n){let r;return n.response?r=`${n.response.error||n.response}`:n.responseText?r=`${n.responseText}`:r=`fail to ${t.method} ${e} ${n.status}`,new k6(r,n.status,t.method,e)}function $6(e){const t=e.responseText||e.response;if(!t)return t;try{return JSON.parse(t)}catch(n){return t}}const x6=e=>{typeof XMLHttpRequest==\"undefined\"&&eo(C6,\"XMLHttpRequest is undefined\");const t=new XMLHttpRequest,n=e.action;t.upload&&t.upload.addEventListener(\"progress\",s=>{const i=s;i.percent=s.total>0?s.loaded/s.total*100:0,e.onProgress(i)});const r=new FormData;if(e.data)for(const[s,i]of Object.entries(e.data))Array.isArray(i)?r.append(s,...i):r.append(s,i);r.append(e.filename,e.file,e.file.name),t.addEventListener(\"error\",()=>{e.onError(wu(n,e,t))}),t.addEventListener(\"load\",()=>{if(t.status<200||t.status>=300)return e.onError(wu(n,e,t));e.onSuccess($6(t))}),t.open(e.method,n,!0),e.withCredentials&&\"withCredentials\"in t&&(t.withCredentials=!0);const o=e.headers||{};if(o instanceof Headers)o.forEach((s,i)=>t.setRequestHeader(i,s));else for(const[s,i]of Object.entries(o))pd(i)||t.setRequestHeader(s,String(i));return t.send(r),t},Nd=[\"text\",\"picture\",\"picture-card\"];let O6=1;const Dd=()=>Date.now()+O6++,Hd=Ve({action:{type:String,default:\"#\"},headers:{type:fe(Object)},method:{type:String,default:\"post\"},data:{type:Object,default:()=>Io({})},multiple:{type:Boolean,default:!1},name:{type:String,default:\"file\"},drag:{type:Boolean,default:!1},withCredentials:Boolean,showFileList:{type:Boolean,default:!0},accept:{type:String,default:\"\"},type:{type:String,default:\"select\"},fileList:{type:fe(Array),default:()=>Io([])},autoUpload:{type:Boolean,default:!0},listType:{type:String,values:Nd,default:\"text\"},httpRequest:{type:fe(Function),default:x6},disabled:Boolean,limit:Number}),P6=Ve(Ue(Ee({},Hd),{beforeUpload:{type:fe(Function),default:me},beforeRemove:{type:fe(Function)},onRemove:{type:fe(Function),default:me},onChange:{type:fe(Function),default:me},onPreview:{type:fe(Function),default:me},onSuccess:{type:fe(Function),default:me},onProgress:{type:fe(Function),default:me},onError:{type:fe(Function),default:me},onExceed:{type:fe(Function),default:me}})),T6=Ve({files:{type:fe(Array),default:()=>Io([])},disabled:{type:Boolean,default:!1},handlePreview:{type:fe(Function),default:me},listType:{type:String,values:Nd,default:\"text\"}}),R6={remove:e=>!!e},A6=[\"onKeydown\"],L6=[\"src\"],U6=[\"onClick\"],M6=[\"onClick\"],I6=[\"onClick\"],B6={name:\"ElUploadList\"},F6=$e(Ue(Ee({},B6),{props:T6,emits:R6,setup(e,{emit:t}){const{t:n}=Od(),r=ze(\"upload\"),o=ze(\"icon\"),s=ze(\"list\"),i=W(!1),a=l=>{t(\"remove\",l)};return(l,u)=>($(),ie(s1,{tag:\"ul\",class:J([v(r).b(\"list\"),v(r).bm(\"list\",l.listType),v(r).is(\"disabled\",l.disabled)]),name:v(s).b()},{default:re(()=>[($(!0),I(Ie,null,ea(l.files,c=>($(),I(\"li\",{key:c.uid||c.name,class:J([v(r).be(\"list\",\"item\"),v(r).is(c.status),{focusing:i.value}]),tabindex:\"0\",onKeydown:Mf(d=>!l.disabled&&a(c),[\"delete\"]),onFocus:u[0]||(u[0]=d=>i.value=!0),onBlur:u[1]||(u[1]=d=>i.value=!1),onClick:u[2]||(u[2]=d=>i.value=!1)},[pe(l.$slots,\"default\",{file:c},()=>[l.listType===\"picture\"||c.status!==\"uploading\"&&l.listType===\"picture-card\"?($(),I(\"img\",{key:0,class:J(v(r).be(\"list\",\"item-thumbnail\")),src:c.url,alt:\"\"},null,10,L6)):le(\"v-if\",!0),c.status===\"uploading\"||l.listType!==\"picture-card\"?($(),I(\"div\",{key:1,class:J(v(r).be(\"list\",\"item-info\"))},[A(\"a\",{class:J(v(r).be(\"list\",\"item-name\")),onClick:Dt(d=>l.handlePreview(c),[\"prevent\"])},[ee(v(et),{class:J(v(o).m(\"document\"))},{default:re(()=>[ee(v(Vg))]),_:1},8,[\"class\"]),A(\"span\",{class:J(v(r).be(\"list\",\"item-file-name\"))},tt(c.name),3)],10,U6),c.status===\"uploading\"?($(),ie(v(Fd),{key:0,type:l.listType===\"picture-card\"?\"circle\":\"line\",\"stroke-width\":l.listType===\"picture-card\"?6:2,percentage:Number(c.percentage),style:Ne(l.listType===\"picture-card\"?\"\":\"margin-top: 0.5rem\")},null,8,[\"type\",\"stroke-width\",\"percentage\",\"style\"])):le(\"v-if\",!0)],2)):le(\"v-if\",!0),A(\"label\",{class:J(v(r).be(\"list\",\"item-status-label\"))},[l.listType===\"text\"?($(),ie(v(et),{key:0,class:J([v(o).m(\"upload-success\"),v(o).m(\"circle-check\")])},{default:re(()=>[ee(v(ua))]),_:1},8,[\"class\"])):[\"picture-card\",\"picture\"].includes(l.listType)?($(),ie(v(et),{key:1,class:J([v(o).m(\"upload-success\"),v(o).m(\"check\")])},{default:re(()=>[ee(v(ed))]),_:1},8,[\"class\"])):le(\"v-if\",!0)],2),l.disabled?le(\"v-if\",!0):($(),ie(v(et),{key:2,class:J(v(o).m(\"close\")),onClick:d=>a(c)},{default:re(()=>[ee(v(Qr))]),_:2},1032,[\"class\",\"onClick\"])),le(\" Due to close btn only appears when li gets focused disappears after li gets blurred, thus keyboard navigation can never reach close btn\"),le(\" This is a bug which needs to be fixed \"),le(\" TODO: Fix the incorrect navigation interaction \"),l.disabled?le(\"v-if\",!0):($(),I(\"i\",{key:3,class:J(v(o).m(\"close-tip\"))},tt(v(n)(\"el.upload.deleteTip\")),3)),l.listType===\"picture-card\"?($(),I(\"span\",{key:4,class:J(v(r).be(\"list\",\"item-actions\"))},[A(\"span\",{class:J(v(r).be(\"list\",\"item-preview\")),onClick:d=>l.handlePreview(c)},[ee(v(et),{class:J(v(o).m(\"zoom-in\"))},{default:re(()=>[ee(v(c3))]),_:1},8,[\"class\"])],10,M6),l.disabled?le(\"v-if\",!0):($(),I(\"span\",{key:0,class:J(v(r).be(\"list\",\"item-delete\")),onClick:d=>a(c)},[ee(v(et),{class:J(v(o).m(\"delete\"))},{default:re(()=>[ee(v(Ng))]),_:1},8,[\"class\"])],10,I6))],2)):le(\"v-if\",!0)])],42,A6))),128)),pe(l.$slots,\"append\")]),_:3},8,[\"class\",\"name\"]))}}));var Eu=Je(F6,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/upload/src/upload-list.vue\"]]);const N6=Ve({disabled:{type:Boolean,default:!1}}),D6={file:e=>X(e)},H6=[\"onDrop\",\"onDragover\"],j6={name:\"ElUploadDrag\"},z6=$e(Ue(Ee({},j6),{props:N6,emits:D6,setup(e,{emit:t}){const n=e,r=\"ElUploadDrag\",o=Oe(kd);o||eo(r,\"usage: <el-upload><el-upload-dragger /></el-upload>\");const s=ze(\"upload\"),i=W(!1),a=u=>{if(n.disabled)return;i.value=!1;const c=Array.from(u.dataTransfer.files),d=o.accept.value;if(!d){t(\"file\",c);return}const f=c.filter(p=>{const{type:m,name:_}=p,S=_.includes(\".\")?`.${_.split(\".\").pop()}`:\"\",y=m.replace(/\\/.*$/,\"\");return d.split(\",\").map(E=>E.trim()).filter(E=>E).some(E=>E.startsWith(\".\")?S===E:/\\/\\*$/.test(E)?y===E.replace(/\\/\\*$/,\"\"):/^[^/]+\\/[^/]+$/.test(E)?m===E:!1)});t(\"file\",f)},l=()=>{n.disabled||(i.value=!0)};return(u,c)=>($(),I(\"div\",{class:J([v(s).b(\"dragger\"),v(s).is(\"dragover\",i.value)]),onDrop:Dt(a,[\"prevent\"]),onDragover:Dt(l,[\"prevent\"]),onDragleave:c[0]||(c[0]=Dt(d=>i.value=!1,[\"prevent\"]))},[pe(u.$slots,\"default\")],42,H6))}}));var q6=Je(z6,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/upload/src/upload-dragger.vue\"]]);const V6=Ve(Ue(Ee({},Hd),{beforeUpload:{type:fe(Function),default:me},onRemove:{type:fe(Function),default:me},onStart:{type:fe(Function),default:me},onSuccess:{type:fe(Function),default:me},onProgress:{type:fe(Function),default:me},onError:{type:fe(Function),default:me},onExceed:{type:fe(Function),default:me}})),K6=[\"onKeydown\"],W6=[\"name\",\"multiple\",\"accept\"],Y6={name:\"ElUploadContent\",inheritAttrs:!1},J6=$e(Ue(Ee({},Y6),{props:V6,setup(e,{expose:t}){const n=e,r=ze(\"upload\"),o=Mr({}),s=Mr(),i=p=>{if(p.length===0)return;const{autoUpload:m,limit:_,fileList:S,multiple:y,onStart:E,onExceed:w}=n;if(_&&S.length+p.length>_){w(p,S);return}y||(p=p.slice(0,1));for(const x of p){const b=x;b.uid=Dd(),E(b),m&&a(b)}},a=p=>ft(this,null,function*(){if(s.value.value=\"\",!n.beforeUpload)return l(p);let m;try{m=yield n.beforeUpload(p)}catch(S){m=!1}if(m===!1){n.onRemove(p);return}let _=p;m instanceof Blob&&(m instanceof File?_=m:_=new File([m],p.name,{type:p.type})),l(Object.assign(_,{uid:p.uid}))}),l=p=>{const{headers:m,data:_,method:S,withCredentials:y,name:E,action:w,onProgress:x,onSuccess:b,onError:L,httpRequest:P}=n,{uid:C}=p,T={headers:m||{},withCredentials:y,file:p,data:_,method:S,filename:E,action:w,onProgress:q=>{x(q,p)},onSuccess:q=>{b(q,p),delete o.value[C]},onError:q=>{L(q,p),delete o.value[C]}},N=P(T);o.value[C]=N,N instanceof Promise&&N.then(T.onSuccess,T.onError)},u=p=>{const m=p.target.files;!m||i(Array.from(m))},c=()=>{n.disabled||(s.value.value=\"\",s.value.click())},d=()=>{c()};return t({abort:p=>{S8(o.value).filter(p?([_])=>String(p.uid)===_:()=>!0).forEach(([_,S])=>{S instanceof XMLHttpRequest&&S.abort(),delete o.value[_]})},upload:a}),(p,m)=>($(),I(\"div\",{class:J([v(r).b(),v(r).m(p.listType),v(r).is(\"drag\",p.drag)]),tabindex:\"0\",onClick:c,onKeydown:Mf(Dt(d,[\"self\"]),[\"enter\",\"space\"])},[p.drag?($(),ie(q6,{key:0,disabled:p.disabled,onFile:i},{default:re(()=>[pe(p.$slots,\"default\")]),_:3},8,[\"disabled\"])):pe(p.$slots,\"default\",{key:1}),A(\"input\",{ref_key:\"inputRef\",ref:s,class:J(v(r).e(\"input\")),name:p.name,multiple:p.multiple,accept:p.accept,type:\"file\",onChange:u,onClick:m[0]||(m[0]=Dt(()=>{},[\"stop\"]))},null,42,W6)],42,K6))}}));var Su=Je(J6,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/upload/src/upload-content.vue\"]]);const Cu=\"ElUpload\",X6=e=>{var t;(t=e.url)!=null&&t.startsWith(\"blob:\")&&URL.revokeObjectURL(e.url)},Z6=(e,t)=>{const n=b8(e,\"fileList\",void 0,{passive:!0}),r=f=>n.value.find(p=>p.uid===f.uid);function o(f){var p;(p=t.value)==null||p.abort(f)}function s(f=[\"ready\",\"uploading\",\"success\",\"fail\"]){n.value=n.value.filter(p=>!f.includes(p.status))}const i=(f,p)=>{const m=r(p);!m||(console.error(f),m.status=\"fail\",n.value.splice(n.value.indexOf(m),1),e.onError(f,m,n.value),e.onChange(m,n.value))},a=(f,p)=>{const m=r(p);!m||(e.onProgress(f,m,n.value),m.status=\"uploading\",m.percentage=Math.round(f.percent))},l=(f,p)=>{const m=r(p);!m||(m.status=\"success\",m.response=f,e.onSuccess(f,m,n.value),e.onChange(m,n.value))},u=f=>{const p={name:f.name,percentage:0,status:\"ready\",size:f.size,raw:f,uid:f.uid};if(e.listType===\"picture-card\"||e.listType===\"picture\")try{p.url=URL.createObjectURL(f)}catch(m){m.message,e.onError(m,p,n.value)}n.value=[...n.value,p],e.onChange(p,n.value)},c=f=>ft(void 0,null,function*(){const p=f instanceof File?r(f):f;p||eo(Cu,\"file to be removed not found\");const m=_=>{o(_);const S=n.value;S.splice(S.indexOf(_),1),e.onRemove(_,S),X6(_)};e.beforeRemove?(yield e.beforeRemove(p,n.value))!==!1&&m(p):m(p)});function d(){n.value.filter(({status:f})=>f===\"ready\").forEach(({raw:f})=>{var p;return f&&((p=t.value)==null?void 0:p.upload(f))})}return Ae(()=>e.listType,f=>{f!==\"picture-card\"&&f!==\"picture\"||(n.value=n.value.map(p=>{const{raw:m,url:_}=p;if(!_&&m)try{p.url=URL.createObjectURL(m)}catch(S){e.onError(S,p,n.value)}return p}))}),Ae(n,f=>{for(const p of f)p.uid||(p.uid=Dd()),p.status||(p.status=\"success\")},{immediate:!0,deep:!0}),{uploadFiles:n,abort:o,clearFiles:s,handleError:i,handleProgress:a,handleStart:u,handleSuccess:l,handleRemove:c,submit:d}},G6={name:\"ElUpload\"},Q6=$e(Ue(Ee({},G6),{props:P6,setup(e,{expose:t}){const n=e,r=sa(),o=ya(),s=Mr(),{abort:i,submit:a,clearFiles:l,uploadFiles:u,handleStart:c,handleError:d,handleRemove:f,handleSuccess:p,handleProgress:m}=Z6(n,s),_=K(()=>n.listType===\"picture-card\"),S=K(()=>Ue(Ee({},n),{fileList:u.value,onStart:c,onProgress:m,onSuccess:p,onError:d,onRemove:f}));return Tn(()=>{u.value.forEach(({url:y})=>{y!=null&&y.startsWith(\"blob:\")&&URL.revokeObjectURL(y)})}),nt(kd,{accept:Sn(n,\"accept\")}),t({abort:i,submit:a,clearFiles:l,handleStart:c,handleRemove:f}),(y,E)=>($(),I(\"div\",null,[v(_)&&y.showFileList?($(),ie(Eu,{key:0,disabled:v(o),\"list-type\":y.listType,files:v(u),\"handle-preview\":y.onPreview,onRemove:v(f)},Gs({append:re(()=>[ee(Su,Hr({ref_key:\"uploadRef\",ref:s},v(S)),{default:re(()=>[v(r).trigger?pe(y.$slots,\"trigger\",{key:0}):le(\"v-if\",!0),!v(r).trigger&&v(r).default?pe(y.$slots,\"default\",{key:1}):le(\"v-if\",!0)]),_:3},16)]),_:2},[y.$slots.file?{name:\"default\",fn:re(({file:w})=>[pe(y.$slots,\"file\",{file:w})])}:void 0]),1032,[\"disabled\",\"list-type\",\"files\",\"handle-preview\",\"onRemove\"])):le(\"v-if\",!0),!v(_)||v(_)&&!y.showFileList?($(),ie(Su,Hr({key:1,ref_key:\"uploadRef\",ref:s},v(S)),{default:re(()=>[v(r).trigger?pe(y.$slots,\"trigger\",{key:0}):le(\"v-if\",!0),!v(r).trigger&&v(r).default?pe(y.$slots,\"default\",{key:1}):le(\"v-if\",!0)]),_:3},16)):le(\"v-if\",!0),y.$slots.trigger?pe(y.$slots,\"default\",{key:2}):le(\"v-if\",!0),pe(y.$slots,\"tip\"),!v(_)&&y.showFileList?($(),ie(Eu,{key:3,disabled:v(o),\"list-type\":y.listType,files:v(u),\"handle-preview\":y.onPreview,onRemove:v(f)},Gs({_:2},[y.$slots.file?{name:\"default\",fn:re(({file:w})=>[pe(y.$slots,\"file\",{file:w})])}:void 0]),1032,[\"disabled\",\"list-type\",\"files\",\"handle-preview\",\"onRemove\"])):le(\"v-if\",!0)]))}}));var eb=Je(Q6,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/upload/src/upload.vue\"]]);const tb=An(eb),jd=[\"success\",\"info\",\"warning\",\"error\"],Ge=Io({customClass:\"\",center:!1,dangerouslyUseHTMLString:!1,duration:3e3,icon:void 0,id:\"\",message:\"\",onClose:void 0,showClose:!1,type:\"info\",offset:16,zIndex:0,grouping:!1,repeatNum:1,appendTo:ct?document.body:void 0}),nb=Ve({customClass:{type:String,default:Ge.customClass},center:{type:Boolean,default:Ge.center},dangerouslyUseHTMLString:{type:Boolean,default:Ge.dangerouslyUseHTMLString},duration:{type:Number,default:Ge.duration},icon:{type:Mo,default:Ge.icon},id:{type:String,default:Ge.id},message:{type:fe([String,Object,Function]),default:Ge.message},onClose:{type:fe(Function),required:!1},showClose:{type:Boolean,default:Ge.showClose},type:{type:String,values:jd,default:Ge.type},offset:{type:Number,default:Ge.offset},zIndex:{type:Number,default:Ge.zIndex},grouping:{type:Boolean,default:Ge.grouping},repeatNum:{type:Number,default:Ge.repeatNum}}),rb={destroy:()=>!0},Rt=Dc([]),ob=e=>{const t=Rt.findIndex(o=>o.id===e),n=Rt[t];let r;return t>0&&(r=Rt[t-1]),{current:n,prev:r}},sb=e=>{const{prev:t}=ob(e);return t?t.vm.exposed.bottom.value:0},ib=[\"id\"],ab=[\"innerHTML\"],lb={name:\"ElMessage\"},ub=$e(Ue(Ee({},lb),{props:nb,emits:rb,setup(e,{expose:t}){const n=e,{Close:r}=R8,o=ze(\"message\"),s=W(),i=W(!1),a=W(0);let l;const u=K(()=>n.type?n.type===\"error\"?\"danger\":n.type:\"info\"),c=K(()=>{const x=n.type;return{[o.bm(\"icon\",x)]:x&&iu[x]}}),d=K(()=>n.icon||iu[n.type]||\"\"),f=K(()=>sb(n.id)),p=K(()=>n.offset+f.value),m=K(()=>a.value+p.value),_=K(()=>({top:`${p.value}px`,zIndex:n.zIndex}));function S(){n.duration!==0&&({stop:l}=pi(()=>{E()},n.duration))}function y(){l==null||l()}function E(){i.value=!1}function w({code:x}){x===ga.esc&&E()}return $t(()=>{S(),i.value=!0}),Ae(()=>n.repeatNum,()=>{y(),S()}),St(document,\"keydown\",w),md(s,()=>{a.value=s.value.getBoundingClientRect().height}),t({visible:i,bottom:m,close:E}),(x,b)=>($(),ie(fr,{name:v(o).b(\"fade\"),onBeforeLeave:x.onClose,onAfterLeave:b[0]||(b[0]=L=>x.$emit(\"destroy\")),persisted:\"\"},{default:re(()=>[Zr(A(\"div\",{id:x.id,ref_key:\"messageRef\",ref:s,class:J([v(o).b(),{[v(o).m(x.type)]:x.type&&!x.icon},v(o).is(\"center\",x.center),v(o).is(\"closable\",x.showClose),x.customClass]),style:Ne(v(_)),role:\"alert\",onMouseenter:y,onMouseleave:S},[x.repeatNum>1?($(),ie(v(ky),{key:0,value:x.repeatNum,type:v(u),class:J(v(o).e(\"badge\"))},null,8,[\"value\",\"type\",\"class\"])):le(\"v-if\",!0),v(d)?($(),ie(v(et),{key:1,class:J([v(o).e(\"icon\"),v(c)])},{default:re(()=>[($(),ie(Cn(v(d))))]),_:1},8,[\"class\"])):le(\"v-if\",!0),pe(x.$slots,\"default\",{},()=>[x.dangerouslyUseHTMLString?($(),I(Ie,{key:1},[le(\" Caution here, message could've been compromised, never use user's input as message \"),A(\"p\",{class:J(v(o).e(\"content\")),innerHTML:x.message},null,10,ab)],2112)):($(),I(\"p\",{key:0,class:J(v(o).e(\"content\"))},tt(x.message),3))]),x.showClose?($(),ie(v(et),{key:2,class:J(v(o).e(\"closeBtn\")),onClick:Dt(E,[\"stop\"])},{default:re(()=>[ee(v(r))]),_:1},8,[\"class\",\"onClick\"])):le(\"v-if\",!0)],46,ib),[[Gr,i.value]])]),_:3},8,[\"name\",\"onBeforeLeave\"]))}}));var cb=Je(ub,[[\"__file\",\"/home/runner/work/element-plus/element-plus/packages/components/message/src/message.vue\"]]);let fb=1;const zd=e=>{const t=!e||be(e)||kn(e)||te(e)?{message:e}:e,n=Ee(Ee({},Ge),t);if(!n.appendTo)n.appendTo=document.body;else if(be(n.appendTo)){let r=document.querySelector(n.appendTo);E8(r)||(r=document.body),n.appendTo=r}return n},db=e=>{const t=Rt.indexOf(e);if(t===-1)return;Rt.splice(t,1);const{handler:n}=e;n.close()},pb=(r,n)=>{var o=r,{appendTo:e}=o,t=za(o,[\"appendTo\"]);const{nextZIndex:s}=Td(),i=`message_${fb++}`,a=t.onClose,l=document.createElement(\"div\"),u=Ue(Ee({},t),{zIndex:s()+t.zIndex,id:i,onClose:()=>{a==null||a(),db(p)},onDestroy:()=>{nr(null,l)}}),c=ee(cb,u,te(u.message)||kn(u.message)?{default:te(u.message)?u.message:()=>u.message}:null);c.appContext=n||ar._context,nr(c,l),e.appendChild(l.firstElementChild);const d=c.component,p={id:i,vnode:c,vm:d,handler:{close:()=>{d.exposed.visible.value=!1}},props:c.component.props};return p},ar=(e={},t)=>{if(!ct)return{close:()=>{}};if(Ft(bi.max)&&Rt.length>=bi.max)return{close:()=>{}};const n=zd(e);if(n.grouping&&Rt.length){const o=Rt.find(({vnode:s})=>{var i;return((i=s.props)==null?void 0:i.message)===n.message});if(o)return o.props.repeatNum+=1,o.props.type=n.type,o.handler}const r=pb(n,t);return Rt.push(r),r.handler};jd.forEach(e=>{ar[e]=(t={},n)=>{const r=zd(t);return ar(Ue(Ee({},r),{type:e}),n)}});function hb(e){for(const t of Rt)(!e||e===t.props.type)&&t.handler.close()}ar.closeAll=hb;ar._context=null;const mb=A8(ar,\"$message\"),fs=e=>(Jo(\"data-v-67d6931b\"),e=e(),Xo(),e),vb={key:0,class:\"loading icon\"},gb=fs(()=>A(\"svg\",{t:\"1631799919469\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"3453\",width:\"128\",height:\"128\"},[A(\"path\",{d:\"M522.695111 1.991111c-26.339556 0.170667-47.416889 21.475556-47.672889 48.753778-0.284444 26.453333-0.056889 52.963556-0.056889 79.445333 0 27.249778-0.369778 54.528 0.113778 81.777778 0.483556 27.050667 22.016 47.132444 49.351111 46.904889a47.786667 47.786667 0 0 0 47.729778-47.445333c0.284444-53.76 0.284444-107.52-0.028444-161.251556-0.170667-27.676444-21.902222-48.355556-49.436445-48.184889m-195.896889 88.092445c-8.334222-14.222222-21.646222-21.276444-38.314666-21.333334-35.128889 0-56.576 36.949333-38.968889 68.152889a11616.995556 11616.995556 0 0 0 78.961777 137.614222 44.942222 44.942222 0 0 0 61.838223 16.896c21.304889-12.202667 29.667556-38.968889 17.379555-60.871111-26.453333-47.104-53.560889-93.866667-80.896-140.458666m-228.693333 234.524444c44.316444 25.799111 88.746667 51.342222 133.176889 76.970667 6.712889 3.896889 13.681778 6.912 21.703111 6.428444 20.138667 0.142222 35.953778-11.946667 41.301333-31.573333 5.006222-18.261333-2.673778-36.721778-20.224-46.990222-44.629333-26.026667-89.372444-51.882667-134.115555-77.710223-22.528-12.999111-47.815111-7.025778-59.818667 13.909334-12.231111 21.248-4.977778 45.624889 17.948444 58.965333m34.161778 235.975111c26.396444 0 52.821333 0.199111 79.217778-0.085333 23.409778-0.256 39.139556-16.412444 38.798222-39.139556-0.341333-21.617778-16.924444-37.347556-39.594666-37.376-51.655111-0.056889-103.310222-0.056889-154.965334 0.028445-24.177778 0.056889-40.704 15.985778-40.561778 38.684444 0.142222 22.186667 16.583111 37.745778 40.192 37.859556 25.656889 0.142222 51.285333 0.028444 76.913778 0m151.722667 100.238222a34.247111 34.247111 0 0 0-46.876445-12.942222 13764.778667 13764.778667 0 0 0-139.008 80.583111c-11.093333 6.485333-16.327111 16.867556-16.497777 25.372444 0.085333 30.549333 27.249778 47.957333 50.403555 35.072 47.160889-26.197333 93.724444-53.475556 140.145778-80.924444 17.180444-10.154667 21.504-30.378667 11.832889-47.160889m91.875555 101.660444c-14.250667-4.067556-27.619556 1.422222-35.84 15.644445a24375.466667 24375.466667 0 0 0-77.312 134.485333c-10.012444 17.550222-5.859556 35.669333 9.784889 45.027556 16.014222 9.557333 34.247111 4.039111 44.714667-13.994667 25.543111-44.088889 50.915556-88.263111 76.373333-132.352 3.299556-5.745778 5.688889-11.690667 5.745778-14.933333 0-17.834667-9.272889-29.866667-23.466667-33.877334m147.456 44.288c-16.384 0.085333-27.306667 11.918222-27.448888 30.151111-0.142222 25.372444-0.028444 50.716444-0.028445 76.060445h-0.085333c0 26.112-0.113778 52.252444 0.056889 78.364444 0.113778 18.261333 11.064889 30.065778 27.448889 30.208 16.952889 0.142222 28.046222-11.832889 28.103111-30.748444 0.113778-51.086222 0.142222-102.172444 0.056889-153.258667 0-18.773333-11.207111-30.862222-28.103112-30.776889m177.208889-26.112c-7.509333-12.8-21.902222-16.014222-33.792-8.874666a23.722667 23.722667 0 0 0-8.533333 32.995555c26.282667 46.279111 52.906667 92.330667 79.644444 138.353778 4.494222 7.765333 11.633778 11.946667 20.906667 11.804444 18.545778-0.142222 30.520889-19.342222 21.219556-35.868444-26.026667-46.392889-52.650667-92.444444-79.473778-138.410667m239.957333-41.187555c-45.283556-26.254222-90.595556-52.48-135.964444-78.648889-4.693333-2.702222-9.728-4.323556-15.36-2.958222-9.102222 2.247111-14.933333 8.049778-16.497778 17.095111-1.877333 10.894222 3.84 18.204444 12.885333 23.438222 29.809778 17.180444 59.562667 34.417778 89.344 51.598222 15.217778 8.789333 30.236444 17.976889 45.738667 26.225778 14.677333 7.793778 31.061333-2.048 31.061333-18.033778-0.056889-8.448-4.096-14.592-11.207111-18.716444m48.867556-234.638222c-24.888889-0.085333-49.749333 0-74.609778 0v-0.085334c-25.258667 0-50.517333-0.056889-75.776 0.028445-13.425778 0.056889-20.963556 6.343111-21.162667 17.294222-0.199111 11.150222 7.082667 17.521778 20.679111 17.550222 50.488889 0.113778 100.977778 0.142222 151.495112 0.085333 13.368889 0 21.191111-6.485333 21.390222-17.152 0.227556-10.808889-8.106667-17.664-22.016-17.720888m-187.960889-127.146667c45.084444-26.026667 90.140444-52.110222 135.168-78.222222 4.864-2.844444 8.248889-6.855111 8.135111-12.942223-0.142222-11.036444-11.207111-17.436444-21.504-11.548444-45.511111 26.055111-90.851556 52.394667-136.135111 78.819556-7.68 4.494222-10.524444 11.52-5.575111 19.569777 4.835556 7.850667 12.088889 8.817778 19.911111 4.323556m-122.311111-115.114667c5.205333-0.256 8.220444-3.413333 10.609778-7.651555 4.920889-8.647111 10.040889-17.208889 14.990222-25.827556 20.48-35.555556 40.931556-71.025778 61.297778-106.609778 5.091556-8.874667 3.015111-16.668444-4.778667-18.517333-7.68-1.848889-10.894222 3.697778-14.051556 9.159111l-68.778666 119.495111c-2.844444 4.977778-6.030222 9.870222-8.305778 15.104-3.128889 7.196444 1.678222 14.648889 9.045333 14.848\",\"p-id\":\"3454\"})],-1)),_b=[gb],yb={key:1,class:\"success icon\"},bb=fs(()=>A(\"svg\",{t:\"1632451272305\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2204\",width:\"128\",height:\"128\"},[A(\"path\",{d:\"M1001.305115 275.874141 431.461709 845.718571c-28.221762 28.221762-73.977875 28.221762-102.20066 0L22.661116 539.116591c-28.222785-28.221762-28.222785-73.979922 0-102.20066 28.221762-28.221762 73.977875-28.221762 102.20066 0l255.500115 255.502162 518.743588-518.743588c28.221762-28.221762 73.977875-28.221762 102.199637 0C1029.5279 201.89422 1029.5279 247.65238 1001.305115 275.874141z\",\"p-id\":\"2205\"})],-1)),wb=[bb],Eb={key:2,class:\"error icon\"},Sb=fs(()=>A(\"svg\",{t:\"1632451325789\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2204\",width:\"128\",height:\"128\"},[A(\"path\",{d:\"M823.04 840.32 524.16 540.16l296.32-294.4c12.8-12.8 12.8-33.28 0-45.44-12.8-12.8-33.28-12.8-46.08 0L478.08 494.08 184.96 200.32c-12.8-12.8-33.28-12.8-45.44 0s-12.8 33.28 0 45.44l292.48 293.76-302.72 300.8c-12.8 12.8-12.8 33.28 0 45.44 12.8 12.8 33.28 12.8 46.08 0l302.72-300.16 299.52 300.16c12.8 12.8 33.28 12.8 45.44 0C835.2 873.6 835.2 853.12 823.04 840.32z\",\"p-id\":\"2205\"})],-1)),Cb=[Sb],kb={key:3,class:\"warning icon\"},$b=fs(()=>A(\"svg\",{t:\"1632451401172\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"1638\",width:\"128\",height:\"128\"},[A(\"path\",{d:\"M512 1021.45211835a60.32985613 60.32985613 0 1 1 60.32985613-60.32985611 60.32985613 60.32985613 0 0 1-60.32985613 60.32985611z m86.85823451-924.97400238L572.32985613 719.80283775a60.32985613 60.32985613 0 0 1-120.65971226 0l-26.52837838-623.32472178c-0.16758294-2.22885301-0.28489098-4.49122263-0.284891-6.78710881a87.14312551 87.14312551 0 0 1 174.28625102 0c0 2.2958862-0.11730806 4.5582558-0.284891 6.78710881z\",\"p-id\":\"1639\"})],-1)),xb=[$b],Ob=$e({__name:\"app\",props:{type:String,message:String,Close:Function},setup(e){const t=e,n=W(!1);$t(()=>{n.value=!0});const r=()=>{(t==null?void 0:t.type)!=\"loading\"&&(n.value=!1,t.Close&&t.Close())};return(o,s)=>n.value?($(),I(\"div\",{key:0,class:\"toast\",onClick:s[1]||(s[1]=i=>r())},[e.type==\"loading\"?($(),I(\"div\",vb,_b)):e.type==\"success\"?($(),I(\"div\",yb,wb)):e.type==\"error\"?($(),I(\"div\",Eb,Cb)):e.type==\"warning\"?($(),I(\"div\",kb,xb)):le(\"\",!0),A(\"div\",{class:\"message\",onClick:s[0]||(s[0]=Dt(()=>{},[\"stop\"]))},tt(e.message),1)])):le(\"\",!0)}});const Pb=Le(Ob,[[\"__scopeId\",\"data-v-67d6931b\"]]),Rr=new Map,pr=e=>{const t=Bf(Pb,Ue(Ee({},e),{Close:()=>{r()}})),n=document.createElement(\"div\");document.body.append(n),t.mount(n);const r=()=>{n.remove(),Rr.get(t._uid)&&Rr.delete(t._uid)};return e.type==\"loading\"&&Rr.set(t._uid,{Close:r}),(e==null?void 0:e.duration)==0||((e==null?void 0:e.duration)>0?setTimeout(()=>{r()},e==null?void 0:e.duration):setTimeout(()=>{r()},3e3)),{Close:r}},fn=e=>pr(e);fn.Loading=e=>pr({type:\"loading\",message:e||\"\\u52A0\\u8F7D\\u4E2D...\",duration:0});fn.Success=e=>pr({type:\"success\",message:e});fn.Error=e=>pr({type:\"error\",message:e});fn.Warning=e=>pr({type:\"warning\",message:e});fn.Message=e=>pr({message:e});fn.Clear=()=>{Rr.forEach((e,t)=>{e.Close(),Rr.delete(t)})};const Fo={Success(e){return this.message(e,\"success\")},Error(e){return this.message(e,\"error\")},Warning(e){return this.message(e,\"warning\")},Message(e){return this.message(e)},message(e,t){return mb({showClose:!0,message:e,type:t})}},C9=fn.Loading;var qd={exports:{}},wa={exports:{}},Vd=function(t,n){return function(){for(var o=new Array(arguments.length),s=0;s<o.length;s++)o[s]=arguments[s];return t.apply(n,o)}},Tb=Vd,Ea=Object.prototype.toString,Sa=function(e){return function(t){var n=Ea.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())}}(Object.create(null));function Ln(e){return e=e.toLowerCase(),function(n){return Sa(n)===e}}function Ca(e){return Array.isArray(e)}function No(e){return typeof e==\"undefined\"}function Rb(e){return e!==null&&!No(e)&&e.constructor!==null&&!No(e.constructor)&&typeof e.constructor.isBuffer==\"function\"&&e.constructor.isBuffer(e)}var Kd=Ln(\"ArrayBuffer\");function Ab(e){var t;return typeof ArrayBuffer!=\"undefined\"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Kd(e.buffer),t}function Lb(e){return typeof e==\"string\"}function Ub(e){return typeof e==\"number\"}function Wd(e){return e!==null&&typeof e==\"object\"}function So(e){if(Sa(e)!==\"object\")return!1;var t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}var Mb=Ln(\"Date\"),Ib=Ln(\"File\"),Bb=Ln(\"Blob\"),Fb=Ln(\"FileList\");function ka(e){return Ea.call(e)===\"[object Function]\"}function Nb(e){return Wd(e)&&ka(e.pipe)}function Db(e){var t=\"[object FormData]\";return e&&(typeof FormData==\"function\"&&e instanceof FormData||Ea.call(e)===t||ka(e.toString)&&e.toString()===t)}var Hb=Ln(\"URLSearchParams\");function jb(e){return e.trim?e.trim():e.replace(/^\\s+|\\s+$/g,\"\")}function zb(){return typeof navigator!=\"undefined\"&&(navigator.product===\"ReactNative\"||navigator.product===\"NativeScript\"||navigator.product===\"NS\")?!1:typeof window!=\"undefined\"&&typeof document!=\"undefined\"}function $a(e,t){if(!(e===null||typeof e==\"undefined\"))if(typeof e!=\"object\"&&(e=[e]),Ca(e))for(var n=0,r=e.length;n<r;n++)t.call(null,e[n],n,e);else for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.call(null,e[o],o,e)}function wi(){var e={};function t(o,s){So(e[s])&&So(o)?e[s]=wi(e[s],o):So(o)?e[s]=wi({},o):Ca(o)?e[s]=o.slice():e[s]=o}for(var n=0,r=arguments.length;n<r;n++)$a(arguments[n],t);return e}function qb(e,t,n){return $a(t,function(o,s){n&&typeof o==\"function\"?e[s]=Tb(o,n):e[s]=o}),e}function Vb(e){return e.charCodeAt(0)===65279&&(e=e.slice(1)),e}function Kb(e,t,n,r){e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,n&&Object.assign(e.prototype,n)}function Wb(e,t,n){var r,o,s,i={};t=t||{};do{for(r=Object.getOwnPropertyNames(e),o=r.length;o-- >0;)s=r[o],i[s]||(t[s]=e[s],i[s]=!0);e=Object.getPrototypeOf(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t}function Yb(e,t,n){e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;var r=e.indexOf(t,n);return r!==-1&&r===n}function Jb(e){if(!e)return null;var t=e.length;if(No(t))return null;for(var n=new Array(t);t-- >0;)n[t]=e[t];return n}var Xb=function(e){return function(t){return e&&t instanceof e}}(typeof Uint8Array!=\"undefined\"&&Object.getPrototypeOf(Uint8Array)),Ke={isArray:Ca,isArrayBuffer:Kd,isBuffer:Rb,isFormData:Db,isArrayBufferView:Ab,isString:Lb,isNumber:Ub,isObject:Wd,isPlainObject:So,isUndefined:No,isDate:Mb,isFile:Ib,isBlob:Bb,isFunction:ka,isStream:Nb,isURLSearchParams:Hb,isStandardBrowserEnv:zb,forEach:$a,merge:wi,extend:qb,trim:jb,stripBOM:Vb,inherits:Kb,toFlatObject:Wb,kindOf:Sa,kindOfTest:Ln,endsWith:Yb,toArray:Jb,isTypedArray:Xb,isFileList:Fb},Nn=Ke;function ku(e){return encodeURIComponent(e).replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%20/g,\"+\").replace(/%5B/gi,\"[\").replace(/%5D/gi,\"]\")}var Yd=function(t,n,r){if(!n)return t;var o;if(r)o=r(n);else if(Nn.isURLSearchParams(n))o=n.toString();else{var s=[];Nn.forEach(n,function(l,u){l===null||typeof l==\"undefined\"||(Nn.isArray(l)?u=u+\"[]\":l=[l],Nn.forEach(l,function(d){Nn.isDate(d)?d=d.toISOString():Nn.isObject(d)&&(d=JSON.stringify(d)),s.push(ku(u)+\"=\"+ku(d))}))}),o=s.join(\"&\")}if(o){var i=t.indexOf(\"#\");i!==-1&&(t=t.slice(0,i)),t+=(t.indexOf(\"?\")===-1?\"?\":\"&\")+o}return t},Zb=Ke;function ds(){this.handlers=[]}ds.prototype.use=function(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1};ds.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)};ds.prototype.forEach=function(t){Zb.forEach(this.handlers,function(r){r!==null&&t(r)})};var Gb=ds,Qb=Ke,e5=function(t,n){Qb.forEach(t,function(o,s){s!==n&&s.toUpperCase()===n.toUpperCase()&&(t[n]=o,delete t[s])})},Jd=Ke;function lr(e,t,n,r,o){Error.call(this),this.message=e,this.name=\"AxiosError\",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),o&&(this.response=o)}Jd.inherits(lr,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var Xd=lr.prototype,Zd={};[\"ERR_BAD_OPTION_VALUE\",\"ERR_BAD_OPTION\",\"ECONNABORTED\",\"ETIMEDOUT\",\"ERR_NETWORK\",\"ERR_FR_TOO_MANY_REDIRECTS\",\"ERR_DEPRECATED\",\"ERR_BAD_RESPONSE\",\"ERR_BAD_REQUEST\",\"ERR_CANCELED\"].forEach(function(e){Zd[e]={value:e}});Object.defineProperties(lr,Zd);Object.defineProperty(Xd,\"isAxiosError\",{value:!0});lr.from=function(e,t,n,r,o,s){var i=Object.create(Xd);return Jd.toFlatObject(e,i,function(l){return l!==Error.prototype}),lr.call(i,e.message,t,n,r,o),i.name=e.name,s&&Object.assign(i,s),i};var hr=lr,Gd={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},yt=Ke;function t5(e,t){t=t||new FormData;var n=[];function r(s){return s===null?\"\":yt.isDate(s)?s.toISOString():yt.isArrayBuffer(s)||yt.isTypedArray(s)?typeof Blob==\"function\"?new Blob([s]):Buffer.from(s):s}function o(s,i){if(yt.isPlainObject(s)||yt.isArray(s)){if(n.indexOf(s)!==-1)throw Error(\"Circular reference detected in \"+i);n.push(s),yt.forEach(s,function(l,u){if(!yt.isUndefined(l)){var c=i?i+\".\"+u:u,d;if(l&&!i&&typeof l==\"object\"){if(yt.endsWith(u,\"{}\"))l=JSON.stringify(l);else if(yt.endsWith(u,\"[]\")&&(d=yt.toArray(l))){d.forEach(function(f){!yt.isUndefined(f)&&t.append(c,r(f))});return}}o(l,c)}}),n.pop()}else t.append(i,r(s))}return o(e),t}var Qd=t5,As,$u;function n5(){if($u)return As;$u=1;var e=hr;return As=function(n,r,o){var s=o.config.validateStatus;!o.status||!s||s(o.status)?n(o):r(new e(\"Request failed with status code \"+o.status,[e.ERR_BAD_REQUEST,e.ERR_BAD_RESPONSE][Math.floor(o.status/100)-4],o.config,o.request,o))},As}var Ls,xu;function r5(){if(xu)return Ls;xu=1;var e=Ke;return Ls=e.isStandardBrowserEnv()?function(){return{write:function(r,o,s,i,a,l){var u=[];u.push(r+\"=\"+encodeURIComponent(o)),e.isNumber(s)&&u.push(\"expires=\"+new Date(s).toGMTString()),e.isString(i)&&u.push(\"path=\"+i),e.isString(a)&&u.push(\"domain=\"+a),l===!0&&u.push(\"secure\"),document.cookie=u.join(\"; \")},read:function(r){var o=document.cookie.match(new RegExp(\"(^|;\\\\s*)(\"+r+\")=([^;]*)\"));return o?decodeURIComponent(o[3]):null},remove:function(r){this.write(r,\"\",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}(),Ls}var o5=function(t){return/^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(t)},s5=function(t,n){return n?t.replace(/\\/+$/,\"\")+\"/\"+n.replace(/^\\/+/,\"\"):t},i5=o5,a5=s5,ep=function(t,n){return t&&!i5(n)?a5(t,n):n},Us,Ou;function l5(){if(Ou)return Us;Ou=1;var e=Ke,t=[\"age\",\"authorization\",\"content-length\",\"content-type\",\"etag\",\"expires\",\"from\",\"host\",\"if-modified-since\",\"if-unmodified-since\",\"last-modified\",\"location\",\"max-forwards\",\"proxy-authorization\",\"referer\",\"retry-after\",\"user-agent\"];return Us=function(r){var o={},s,i,a;return r&&e.forEach(r.split(`\n`),function(u){if(a=u.indexOf(\":\"),s=e.trim(u.substr(0,a)).toLowerCase(),i=e.trim(u.substr(a+1)),s){if(o[s]&&t.indexOf(s)>=0)return;s===\"set-cookie\"?o[s]=(o[s]?o[s]:[]).concat([i]):o[s]=o[s]?o[s]+\", \"+i:i}}),o},Us}var Ms,Pu;function u5(){if(Pu)return Ms;Pu=1;var e=Ke;return Ms=e.isStandardBrowserEnv()?function(){var n=/(msie|trident)/i.test(navigator.userAgent),r=document.createElement(\"a\"),o;function s(i){var a=i;return n&&(r.setAttribute(\"href\",a),a=r.href),r.setAttribute(\"href\",a),{href:r.href,protocol:r.protocol?r.protocol.replace(/:$/,\"\"):\"\",host:r.host,search:r.search?r.search.replace(/^\\?/,\"\"):\"\",hash:r.hash?r.hash.replace(/^#/,\"\"):\"\",hostname:r.hostname,port:r.port,pathname:r.pathname.charAt(0)===\"/\"?r.pathname:\"/\"+r.pathname}}return o=s(window.location.href),function(a){var l=e.isString(a)?s(a):a;return l.protocol===o.protocol&&l.host===o.host}}():function(){return function(){return!0}}(),Ms}var Is,Tu;function ps(){if(Tu)return Is;Tu=1;var e=hr,t=Ke;function n(r){e.call(this,r==null?\"canceled\":r,e.ERR_CANCELED),this.name=\"CanceledError\"}return t.inherits(n,e,{__CANCEL__:!0}),Is=n,Is}var Bs,Ru;function c5(){return Ru||(Ru=1,Bs=function(t){var n=/^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(t);return n&&n[1]||\"\"}),Bs}var Fs,Au;function Lu(){if(Au)return Fs;Au=1;var e=Ke,t=n5(),n=r5(),r=Yd,o=ep,s=l5(),i=u5(),a=Gd,l=hr,u=ps(),c=c5();return Fs=function(f){return new Promise(function(m,_){var S=f.data,y=f.headers,E=f.responseType,w;function x(){f.cancelToken&&f.cancelToken.unsubscribe(w),f.signal&&f.signal.removeEventListener(\"abort\",w)}e.isFormData(S)&&e.isStandardBrowserEnv()&&delete y[\"Content-Type\"];var b=new XMLHttpRequest;if(f.auth){var L=f.auth.username||\"\",P=f.auth.password?unescape(encodeURIComponent(f.auth.password)):\"\";y.Authorization=\"Basic \"+btoa(L+\":\"+P)}var C=o(f.baseURL,f.url);b.open(f.method.toUpperCase(),r(C,f.params,f.paramsSerializer),!0),b.timeout=f.timeout;function T(){if(!!b){var B=\"getAllResponseHeaders\"in b?s(b.getAllResponseHeaders()):null,ne=!E||E===\"text\"||E===\"json\"?b.responseText:b.response,se={data:ne,status:b.status,statusText:b.statusText,headers:B,config:f,request:b};t(function(we){m(we),x()},function(we){_(we),x()},se),b=null}}if(\"onloadend\"in b?b.onloadend=T:b.onreadystatechange=function(){!b||b.readyState!==4||b.status===0&&!(b.responseURL&&b.responseURL.indexOf(\"file:\")===0)||setTimeout(T)},b.onabort=function(){!b||(_(new l(\"Request aborted\",l.ECONNABORTED,f,b)),b=null)},b.onerror=function(){_(new l(\"Network Error\",l.ERR_NETWORK,f,b,b)),b=null},b.ontimeout=function(){var ne=f.timeout?\"timeout of \"+f.timeout+\"ms exceeded\":\"timeout exceeded\",se=f.transitional||a;f.timeoutErrorMessage&&(ne=f.timeoutErrorMessage),_(new l(ne,se.clarifyTimeoutError?l.ETIMEDOUT:l.ECONNABORTED,f,b)),b=null},e.isStandardBrowserEnv()){var N=(f.withCredentials||i(C))&&f.xsrfCookieName?n.read(f.xsrfCookieName):void 0;N&&(y[f.xsrfHeaderName]=N)}\"setRequestHeader\"in b&&e.forEach(y,function(ne,se){typeof S==\"undefined\"&&se.toLowerCase()===\"content-type\"?delete y[se]:b.setRequestHeader(se,ne)}),e.isUndefined(f.withCredentials)||(b.withCredentials=!!f.withCredentials),E&&E!==\"json\"&&(b.responseType=f.responseType),typeof f.onDownloadProgress==\"function\"&&b.addEventListener(\"progress\",f.onDownloadProgress),typeof f.onUploadProgress==\"function\"&&b.upload&&b.upload.addEventListener(\"progress\",f.onUploadProgress),(f.cancelToken||f.signal)&&(w=function(B){!b||(_(!B||B&&B.type?new u:B),b.abort(),b=null)},f.cancelToken&&f.cancelToken.subscribe(w),f.signal&&(f.signal.aborted?w():f.signal.addEventListener(\"abort\",w))),S||(S=null);var q=c(C);if(q&&[\"http\",\"https\",\"file\"].indexOf(q)===-1){_(new l(\"Unsupported protocol \"+q+\":\",l.ERR_BAD_REQUEST,f));return}b.send(S)})},Fs}var Ns,Uu;function f5(){return Uu||(Uu=1,Ns=null),Ns}var Fe=Ke,Mu=e5,Iu=hr,d5=Gd,p5=Qd,h5={\"Content-Type\":\"application/x-www-form-urlencoded\"};function Bu(e,t){!Fe.isUndefined(e)&&Fe.isUndefined(e[\"Content-Type\"])&&(e[\"Content-Type\"]=t)}function m5(){var e;return(typeof XMLHttpRequest!=\"undefined\"||typeof process!=\"undefined\"&&Object.prototype.toString.call(process)===\"[object process]\")&&(e=Lu()),e}function v5(e,t,n){if(Fe.isString(e))try{return(t||JSON.parse)(e),Fe.trim(e)}catch(r){if(r.name!==\"SyntaxError\")throw r}return(n||JSON.stringify)(e)}var hs={transitional:d5,adapter:m5(),transformRequest:[function(t,n){if(Mu(n,\"Accept\"),Mu(n,\"Content-Type\"),Fe.isFormData(t)||Fe.isArrayBuffer(t)||Fe.isBuffer(t)||Fe.isStream(t)||Fe.isFile(t)||Fe.isBlob(t))return t;if(Fe.isArrayBufferView(t))return t.buffer;if(Fe.isURLSearchParams(t))return Bu(n,\"application/x-www-form-urlencoded;charset=utf-8\"),t.toString();var r=Fe.isObject(t),o=n&&n[\"Content-Type\"],s;if((s=Fe.isFileList(t))||r&&o===\"multipart/form-data\"){var i=this.env&&this.env.FormData;return p5(s?{\"files[]\":t}:t,i&&new i)}else if(r||o===\"application/json\")return Bu(n,\"application/json\"),v5(t);return t}],transformResponse:[function(t){var n=this.transitional||hs.transitional,r=n&&n.silentJSONParsing,o=n&&n.forcedJSONParsing,s=!r&&this.responseType===\"json\";if(s||o&&Fe.isString(t)&&t.length)try{return JSON.parse(t)}catch(i){if(s)throw i.name===\"SyntaxError\"?Iu.from(i,Iu.ERR_BAD_RESPONSE,this,null,this.response):i}return t}],timeout:0,xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",maxContentLength:-1,maxBodyLength:-1,env:{FormData:f5()},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:\"application/json, text/plain, */*\"}}};Fe.forEach([\"delete\",\"get\",\"head\"],function(t){hs.headers[t]={}});Fe.forEach([\"post\",\"put\",\"patch\"],function(t){hs.headers[t]=Fe.merge(h5)});var xa=hs,g5=Ke,_5=xa,y5=function(t,n,r){var o=this||_5;return g5.forEach(r,function(i){t=i.call(o,t,n)}),t},Ds,Fu;function tp(){return Fu||(Fu=1,Ds=function(t){return!!(t&&t.__CANCEL__)}),Ds}var Nu=Ke,Hs=y5,b5=tp(),w5=xa,E5=ps();function js(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new E5}var S5=function(t){js(t),t.headers=t.headers||{},t.data=Hs.call(t,t.data,t.headers,t.transformRequest),t.headers=Nu.merge(t.headers.common||{},t.headers[t.method]||{},t.headers),Nu.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\",\"common\"],function(o){delete t.headers[o]});var n=t.adapter||w5.adapter;return n(t).then(function(o){return js(t),o.data=Hs.call(t,o.data,o.headers,t.transformResponse),o},function(o){return b5(o)||(js(t),o&&o.response&&(o.response.data=Hs.call(t,o.response.data,o.response.headers,t.transformResponse))),Promise.reject(o)})},it=Ke,np=function(t,n){n=n||{};var r={};function o(c,d){return it.isPlainObject(c)&&it.isPlainObject(d)?it.merge(c,d):it.isPlainObject(d)?it.merge({},d):it.isArray(d)?d.slice():d}function s(c){if(it.isUndefined(n[c])){if(!it.isUndefined(t[c]))return o(void 0,t[c])}else return o(t[c],n[c])}function i(c){if(!it.isUndefined(n[c]))return o(void 0,n[c])}function a(c){if(it.isUndefined(n[c])){if(!it.isUndefined(t[c]))return o(void 0,t[c])}else return o(void 0,n[c])}function l(c){if(c in n)return o(t[c],n[c]);if(c in t)return o(void 0,t[c])}var u={url:i,method:i,data:i,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,beforeRedirect:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:l};return it.forEach(Object.keys(t).concat(Object.keys(n)),function(d){var f=u[d]||s,p=f(d);it.isUndefined(p)&&f!==l||(r[d]=p)}),r},zs,Du;function rp(){return Du||(Du=1,zs={version:\"0.27.2\"}),zs}var C5=rp().version,Qt=hr,Oa={};[\"object\",\"boolean\",\"number\",\"function\",\"string\",\"symbol\"].forEach(function(e,t){Oa[e]=function(r){return typeof r===e||\"a\"+(t<1?\"n \":\" \")+e}});var Hu={};Oa.transitional=function(t,n,r){function o(s,i){return\"[Axios v\"+C5+\"] Transitional option '\"+s+\"'\"+i+(r?\". \"+r:\"\")}return function(s,i,a){if(t===!1)throw new Qt(o(i,\" has been removed\"+(n?\" in \"+n:\"\")),Qt.ERR_DEPRECATED);return n&&!Hu[i]&&(Hu[i]=!0,console.warn(o(i,\" has been deprecated since v\"+n+\" and will be removed in the near future\"))),t?t(s,i,a):!0}};function k5(e,t,n){if(typeof e!=\"object\")throw new Qt(\"options must be an object\",Qt.ERR_BAD_OPTION_VALUE);for(var r=Object.keys(e),o=r.length;o-- >0;){var s=r[o],i=t[s];if(i){var a=e[s],l=a===void 0||i(a,s,e);if(l!==!0)throw new Qt(\"option \"+s+\" must be \"+l,Qt.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new Qt(\"Unknown option \"+s,Qt.ERR_BAD_OPTION)}}var $5={assertOptions:k5,validators:Oa},op=Ke,x5=Yd,ju=Gb,zu=S5,ms=np,O5=ep,sp=$5,Dn=sp.validators;function ur(e){this.defaults=e,this.interceptors={request:new ju,response:new ju}}ur.prototype.request=function(t,n){typeof t==\"string\"?(n=n||{},n.url=t):n=t||{},n=ms(this.defaults,n),n.method?n.method=n.method.toLowerCase():this.defaults.method?n.method=this.defaults.method.toLowerCase():n.method=\"get\";var r=n.transitional;r!==void 0&&sp.assertOptions(r,{silentJSONParsing:Dn.transitional(Dn.boolean),forcedJSONParsing:Dn.transitional(Dn.boolean),clarifyTimeoutError:Dn.transitional(Dn.boolean)},!1);var o=[],s=!0;this.interceptors.request.forEach(function(p){typeof p.runWhen==\"function\"&&p.runWhen(n)===!1||(s=s&&p.synchronous,o.unshift(p.fulfilled,p.rejected))});var i=[];this.interceptors.response.forEach(function(p){i.push(p.fulfilled,p.rejected)});var a;if(!s){var l=[zu,void 0];for(Array.prototype.unshift.apply(l,o),l=l.concat(i),a=Promise.resolve(n);l.length;)a=a.then(l.shift(),l.shift());return a}for(var u=n;o.length;){var c=o.shift(),d=o.shift();try{u=c(u)}catch(f){d(f);break}}try{a=zu(u)}catch(f){return Promise.reject(f)}for(;i.length;)a=a.then(i.shift(),i.shift());return a};ur.prototype.getUri=function(t){t=ms(this.defaults,t);var n=O5(t.baseURL,t.url);return x5(n,t.params,t.paramsSerializer)};op.forEach([\"delete\",\"get\",\"head\",\"options\"],function(t){ur.prototype[t]=function(n,r){return this.request(ms(r||{},{method:t,url:n,data:(r||{}).data}))}});op.forEach([\"post\",\"put\",\"patch\"],function(t){function n(r){return function(s,i,a){return this.request(ms(a||{},{method:t,headers:r?{\"Content-Type\":\"multipart/form-data\"}:{},url:s,data:i}))}}ur.prototype[t]=n(),ur.prototype[t+\"Form\"]=n(!0)});var P5=ur,qs,qu;function T5(){if(qu)return qs;qu=1;var e=ps();function t(n){if(typeof n!=\"function\")throw new TypeError(\"executor must be a function.\");var r;this.promise=new Promise(function(i){r=i});var o=this;this.promise.then(function(s){if(!!o._listeners){var i,a=o._listeners.length;for(i=0;i<a;i++)o._listeners[i](s);o._listeners=null}}),this.promise.then=function(s){var i,a=new Promise(function(l){o.subscribe(l),i=l}).then(s);return a.cancel=function(){o.unsubscribe(i)},a},n(function(i){o.reason||(o.reason=new e(i),r(o.reason))})}return t.prototype.throwIfRequested=function(){if(this.reason)throw this.reason},t.prototype.subscribe=function(r){if(this.reason){r(this.reason);return}this._listeners?this._listeners.push(r):this._listeners=[r]},t.prototype.unsubscribe=function(r){if(!!this._listeners){var o=this._listeners.indexOf(r);o!==-1&&this._listeners.splice(o,1)}},t.source=function(){var r,o=new t(function(i){r=i});return{token:o,cancel:r}},qs=t,qs}var Vs,Vu;function R5(){return Vu||(Vu=1,Vs=function(t){return function(r){return t.apply(null,r)}}),Vs}var Ks,Ku;function A5(){if(Ku)return Ks;Ku=1;var e=Ke;return Ks=function(n){return e.isObject(n)&&n.isAxiosError===!0},Ks}var Wu=Ke,L5=Vd,Co=P5,U5=np,M5=xa;function ip(e){var t=new Co(e),n=L5(Co.prototype.request,t);return Wu.extend(n,Co.prototype,t),Wu.extend(n,t),n.create=function(o){return ip(U5(e,o))},n}var ot=ip(M5);ot.Axios=Co;ot.CanceledError=ps();ot.CancelToken=T5();ot.isCancel=tp();ot.VERSION=rp().version;ot.toFormData=Qd;ot.AxiosError=hr;ot.Cancel=ot.CanceledError;ot.all=function(t){return Promise.all(t)};ot.spread=R5();ot.isAxiosError=A5();wa.exports=ot;wa.exports.default=ot;(function(e){e.exports=wa.exports})(qd);const Pa=Xy(qd.exports),Ta=Pa.create({baseURL:\"/cgi-bin/luci/linkease\"});Ta.interceptors.request.use(e=>e);Ta.interceptors.response.use(e=>{var t;return e.headers[\"content-type\"]==\"application/json\"&&typeof e.data==\"object\"&&!e.data.success&&(e.data.success=0),((t=e==null?void 0:e.data)==null?void 0:t.success)===-1e4&&Fo.Error(\"\\u767B\\u5F55\\u72B6\\u6001\\u4E22\\u5931\"),e},e=>{if(e!=null&&e.response)switch(e==null?void 0:e.response.status){case 403:Fo.Error(\"\\u767B\\u5F55\\u72B6\\u6001\\u4E22\\u5931\");break}return Promise.reject(e)});const ap=Pa.create({headers:{\"Content-Type\":\"text/plain\"},responseType:\"text\",transformResponse:[e=>e]});ap.interceptors.request.use(e=>(e.params==null&&(e.params={}),e.params._t=Date.parse(`${new Date}`),e));ap.interceptors.response.use(e=>{var t;return((t=e==null?void 0:e.data)==null?void 0:t.success)===-1e4&&Fo.Error(\"\\u767B\\u5F55\\u72B6\\u6001\\u4E22\\u5931\"),e},e=>{var t;if(e!=null&&e.response)switch((t=e==null?void 0:e.response)==null?void 0:t.status){case 403:Fo.Error(\"\\u767B\\u5F55\\u72B6\\u6001\\u4E22\\u5931\");break}return Promise.reject(e)});const Be=e=>Ta(e),I5={Basic:{List:{POST(e){return Be({url:\"/api/file/basic/list/\",method:\"POST\",data:e})}},Copy:{POST(e){return Be({url:\"/api/file/basic/copy/\",method:\"POST\",data:e})}},Move:{POST(e){return Be({url:\"/api/file/basic/move/\",method:\"POST\",data:e})}},Remove:{POST(e){return Be({url:\"/api/file/basic/remove/\",method:\"POST\",data:e})}},createFolder:{POST(e){return Be({url:\"/api/file/basic/createFolder/\",method:\"POST\",data:e})}},Upload:{POST(e){let t=new FormData;t.append(\"destination\",e.destination);for(let n=0;n<e.files.length;n++)t.append(`file_${n}`,e.files[n],e.files[n].name);return Be({url:\"/api/file/basic/upload/\",method:\"POST\",data:e,headers:{\"Content-Type\":\"multipart/form-data\"}})}},Recycle:{List:{POST(e){return Be({url:\"/api/file/basic/recycle/list/\",method:\"POST\",data:e})}},Restore:{POST(e){return Be({method:\"POST\",url:\"/api/file/basic/recycle/restore/\",data:e})}},Remove:{POST(e){return Be({method:\"POST\",url:\"/api/file/basic/recycle/remove/\",data:e})}},Clear:{POST(e){return Be({method:\"POST\",url:\"/api/file/basic/recycle/clear/\",data:e})}}}},Task:{All:{GET(){return Be({url:\"/api/task/list/all\",method:\"GET\"})}},Cancel:{POST(e){return Be({url:\"/api/task/cancel/\",method:\"POST\",data:e})}},History:{List:{POST(e){return Be({url:\"/api/task/history/list/\",method:\"POST\",data:e})}},Restart:{POST(e){return Be({url:\"/api/task/history/restart/\",method:\"POST\",data:e})}},Remove:{POST(e){return Be({url:\"/api/task/history/remove/\",method:\"POST\",data:e})}}}},Upload:{POST(e){const t=Pa.CancelToken,n=new FormData;n.append(\"destination\",e.destination),n.append(\"force\",`${e.force}`);for(let r=0;r<e.files.length;r++){const o=e.files[r];n.append(`file_${r}`,o,o.webkitRelativePath?o.webkitRelativePath:o.name)}return Be({method:\"POST\",url:\"/api/file/basic/upload/\",headers:{\"Content-Type\":\"multipart/form-data\"},data:n,onUploadProgress:r=>{e.onUploadProgress&&e.onUploadProgress(r.loaded,r.total)},cancelToken:new t(r=>{e.onClear&&e.onClear(r)})})}}},B5={Data:{GET(){return Be({url:\"/api/local-device/data/\",method:\"GET\"})},POST(e){return Be({url:\"/api/local-device/data/\",method:\"POST\",data:e})}}},F5=Object.freeze(Object.defineProperty({__proto__:null,File:I5,LocalDevice:B5},Symbol.toStringTag,{value:\"Module\"})),N5=Ee({},F5),D5=e=>{if(e==null||e==0)return\"0KB\";if(e==\"\")return\"-\";let t=Number(e)/1024,n=t/1024,r=n/1024;if(r>1)return`${r.toFixed(2)}GB`;if(n>1)return`${n.toFixed(2)}MB`;if(t>1){const o=`${t}`;return`${parseInt(o)}KB`}return`${e}B`},H5=Object.freeze(Object.defineProperty({__proto__:null,ComputeSize:D5},Symbol.toStringTag,{value:\"Module\"})),j5=(...e)=>{let t=[];return e.forEach(r=>{if(r!=\"\"){let o=r;r[0]==\"/\"&&(o=r.slice(1)),t.push(o)}}),t.join(\"/\")},z5=()=>`${location.protocol}//${location.host}:8897`,q5=e=>window.getLocationPathname!=null?window.getLocationPathname(e):location.pathname+e,V5=Object.freeze(Object.defineProperty({__proto__:null,join:j5,getLinkeaseWebUrl:z5,getLocationPathname:q5},Symbol.toStringTag,{value:\"Module\"})),K5=Ee(Ee({},H5),V5),lp=\"3.7.2\",W5=lp,Y5=typeof atob==\"function\",J5=typeof btoa==\"function\",mr=typeof Buffer==\"function\",Yu=typeof TextDecoder==\"function\"?new TextDecoder:void 0,Ju=typeof TextEncoder==\"function\"?new TextEncoder:void 0,X5=\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\",Er=Array.prototype.slice.call(X5),mo=(e=>{let t={};return e.forEach((n,r)=>t[n]=r),t})(Er),Z5=/^(?:[A-Za-z\\d+\\/]{4})*?(?:[A-Za-z\\d+\\/]{2}(?:==)?|[A-Za-z\\d+\\/]{3}=?)?$/,je=String.fromCharCode.bind(String),Xu=typeof Uint8Array.from==\"function\"?Uint8Array.from.bind(Uint8Array):(e,t=n=>n)=>new Uint8Array(Array.prototype.slice.call(e,0).map(t)),up=e=>e.replace(/=/g,\"\").replace(/[+\\/]/g,t=>t==\"+\"?\"-\":\"_\"),cp=e=>e.replace(/[^A-Za-z0-9\\+\\/]/g,\"\"),fp=e=>{let t,n,r,o,s=\"\";const i=e.length%3;for(let a=0;a<e.length;){if((n=e.charCodeAt(a++))>255||(r=e.charCodeAt(a++))>255||(o=e.charCodeAt(a++))>255)throw new TypeError(\"invalid character found\");t=n<<16|r<<8|o,s+=Er[t>>18&63]+Er[t>>12&63]+Er[t>>6&63]+Er[t&63]}return i?s.slice(0,i-3)+\"===\".substring(i):s},Ra=J5?e=>btoa(e):mr?e=>Buffer.from(e,\"binary\").toString(\"base64\"):fp,Ei=mr?e=>Buffer.from(e).toString(\"base64\"):e=>{let n=[];for(let r=0,o=e.length;r<o;r+=4096)n.push(je.apply(null,e.subarray(r,r+4096)));return Ra(n.join(\"\"))},ko=(e,t=!1)=>t?up(Ei(e)):Ei(e),G5=e=>{if(e.length<2){var t=e.charCodeAt(0);return t<128?e:t<2048?je(192|t>>>6)+je(128|t&63):je(224|t>>>12&15)+je(128|t>>>6&63)+je(128|t&63)}else{var t=65536+(e.charCodeAt(0)-55296)*1024+(e.charCodeAt(1)-56320);return je(240|t>>>18&7)+je(128|t>>>12&63)+je(128|t>>>6&63)+je(128|t&63)}},Q5=/[\\uD800-\\uDBFF][\\uDC00-\\uDFFFF]|[^\\x00-\\x7F]/g,dp=e=>e.replace(Q5,G5),Zu=mr?e=>Buffer.from(e,\"utf8\").toString(\"base64\"):Ju?e=>Ei(Ju.encode(e)):e=>Ra(dp(e)),Gn=(e,t=!1)=>t?up(Zu(e)):Zu(e),Gu=e=>Gn(e,!0),e7=/[\\xC0-\\xDF][\\x80-\\xBF]|[\\xE0-\\xEF][\\x80-\\xBF]{2}|[\\xF0-\\xF7][\\x80-\\xBF]{3}/g,t7=e=>{switch(e.length){case 4:var t=(7&e.charCodeAt(0))<<18|(63&e.charCodeAt(1))<<12|(63&e.charCodeAt(2))<<6|63&e.charCodeAt(3),n=t-65536;return je((n>>>10)+55296)+je((n&1023)+56320);case 3:return je((15&e.charCodeAt(0))<<12|(63&e.charCodeAt(1))<<6|63&e.charCodeAt(2));default:return je((31&e.charCodeAt(0))<<6|63&e.charCodeAt(1))}},pp=e=>e.replace(e7,t7),hp=e=>{if(e=e.replace(/\\s+/g,\"\"),!Z5.test(e))throw new TypeError(\"malformed base64.\");e+=\"==\".slice(2-(e.length&3));let t,n=\"\",r,o;for(let s=0;s<e.length;)t=mo[e.charAt(s++)]<<18|mo[e.charAt(s++)]<<12|(r=mo[e.charAt(s++)])<<6|(o=mo[e.charAt(s++)]),n+=r===64?je(t>>16&255):o===64?je(t>>16&255,t>>8&255):je(t>>16&255,t>>8&255,t&255);return n},Aa=Y5?e=>atob(cp(e)):mr?e=>Buffer.from(e,\"base64\").toString(\"binary\"):hp,mp=mr?e=>Xu(Buffer.from(e,\"base64\")):e=>Xu(Aa(e),t=>t.charCodeAt(0)),vp=e=>mp(gp(e)),n7=mr?e=>Buffer.from(e,\"base64\").toString(\"utf8\"):Yu?e=>Yu.decode(mp(e)):e=>pp(Aa(e)),gp=e=>cp(e.replace(/[-_]/g,t=>t==\"-\"?\"+\":\"/\")),Si=e=>n7(gp(e)),r7=e=>{if(typeof e!=\"string\")return!1;const t=e.replace(/\\s+/g,\"\").replace(/={0,2}$/,\"\");return!/[^\\s0-9a-zA-Z\\+/]/.test(t)||!/[^\\s0-9a-zA-Z\\-_]/.test(t)},_p=e=>({value:e,enumerable:!1,writable:!0,configurable:!0}),yp=function(){const e=(t,n)=>Object.defineProperty(String.prototype,t,_p(n));e(\"fromBase64\",function(){return Si(this)}),e(\"toBase64\",function(t){return Gn(this,t)}),e(\"toBase64URI\",function(){return Gn(this,!0)}),e(\"toBase64URL\",function(){return Gn(this,!0)}),e(\"toUint8Array\",function(){return vp(this)})},bp=function(){const e=(t,n)=>Object.defineProperty(Uint8Array.prototype,t,_p(n));e(\"toBase64\",function(t){return ko(this,t)}),e(\"toBase64URI\",function(){return ko(this,!0)}),e(\"toBase64URL\",function(){return ko(this,!0)})},o7=()=>{yp(),bp()},s7={version:lp,VERSION:W5,atob:Aa,atobPolyfill:hp,btoa:Ra,btoaPolyfill:fp,fromBase64:Si,toBase64:Gn,encode:Gn,encodeURI:Gu,encodeURL:Gu,utob:dp,btou:pp,decode:Si,isValid:r7,fromUint8Array:ko,toUint8Array:vp,extendString:yp,extendUint8Array:bp,extendBuiltins:o7};var i7=function(t,n){if(n=n.split(\":\")[0],t=+t,!t)return!1;switch(n){case\"http\":case\"ws\":return t!==80;case\"https\":case\"wss\":return t!==443;case\"ftp\":return t!==21;case\"gopher\":return t!==70;case\"file\":return!1}return t!==0},La={},a7=Object.prototype.hasOwnProperty,l7;function Qu(e){try{return decodeURIComponent(e.replace(/\\+/g,\" \"))}catch(t){return null}}function ec(e){try{return encodeURIComponent(e)}catch(t){return null}}function u7(e){for(var t=/([^=?#&]+)=?([^&]*)/g,n={},r;r=t.exec(e);){var o=Qu(r[1]),s=Qu(r[2]);o===null||s===null||o in n||(n[o]=s)}return n}function c7(e,t){t=t||\"\";var n=[],r,o;typeof t!=\"string\"&&(t=\"?\");for(o in e)if(a7.call(e,o)){if(r=e[o],!r&&(r===null||r===l7||isNaN(r))&&(r=\"\"),o=ec(o),r=ec(r),o===null||r===null)continue;n.push(o+\"=\"+r)}return n.length?t+n.join(\"&\"):\"\"}La.stringify=c7;La.parse=u7;var wp=i7,vs=La,f7=/^[\\x00-\\x20\\u00a0\\u1680\\u2000-\\u200a\\u2028\\u2029\\u202f\\u205f\\u3000\\ufeff]+/,Ep=/[\\n\\r\\t]/g,d7=/^[A-Za-z][A-Za-z0-9+-.]*:\\/\\//,Sp=/:\\d+$/,p7=/^([a-z][a-z0-9.+-]*:)?(\\/\\/)?([\\\\/]+)?([\\S\\s]*)/i,h7=/^[a-zA-Z]:/;function Ua(e){return(e||\"\").toString().replace(f7,\"\")}var Ci=[[\"#\",\"hash\"],[\"?\",\"query\"],function(t,n){return At(n.protocol)?t.replace(/\\\\/g,\"/\"):t},[\"/\",\"pathname\"],[\"@\",\"auth\",1],[NaN,\"host\",void 0,1,1],[/:(\\d*)$/,\"port\",void 0,1],[NaN,\"hostname\",void 0,1,1]],tc={hash:1,query:1};function Cp(e){var t;typeof window!=\"undefined\"?t=window:typeof bu!=\"undefined\"?t=bu:typeof self!=\"undefined\"?t=self:t={};var n=t.location||{};e=e||n;var r={},o=typeof e,s;if(e.protocol===\"blob:\")r=new Lt(unescape(e.pathname),{});else if(o===\"string\"){r=new Lt(e,{});for(s in tc)delete r[s]}else if(o===\"object\"){for(s in e)s in tc||(r[s]=e[s]);r.slashes===void 0&&(r.slashes=d7.test(e.href))}return r}function At(e){return e===\"file:\"||e===\"ftp:\"||e===\"http:\"||e===\"https:\"||e===\"ws:\"||e===\"wss:\"}function kp(e,t){e=Ua(e),e=e.replace(Ep,\"\"),t=t||{};var n=p7.exec(e),r=n[1]?n[1].toLowerCase():\"\",o=!!n[2],s=!!n[3],i=0,a;return o?s?(a=n[2]+n[3]+n[4],i=n[2].length+n[3].length):(a=n[2]+n[4],i=n[2].length):s?(a=n[3]+n[4],i=n[3].length):a=n[4],r===\"file:\"?i>=2&&(a=a.slice(2)):At(r)?a=n[4]:r?o&&(a=a.slice(2)):i>=2&&At(t.protocol)&&(a=n[4]),{protocol:r,slashes:o||At(r),slashesCount:i,rest:a}}function m7(e,t){if(e===\"\")return t;for(var n=(t||\"/\").split(\"/\").slice(0,-1).concat(e.split(\"/\")),r=n.length,o=n[r-1],s=!1,i=0;r--;)n[r]===\".\"?n.splice(r,1):n[r]===\"..\"?(n.splice(r,1),i++):i&&(r===0&&(s=!0),n.splice(r,1),i--);return s&&n.unshift(\"\"),(o===\".\"||o===\"..\")&&n.push(\"\"),n.join(\"/\")}function Lt(e,t,n){if(e=Ua(e),e=e.replace(Ep,\"\"),!(this instanceof Lt))return new Lt(e,t,n);var r,o,s,i,a,l,u=Ci.slice(),c=typeof t,d=this,f=0;for(c!==\"object\"&&c!==\"string\"&&(n=t,t=null),n&&typeof n!=\"function\"&&(n=vs.parse),t=Cp(t),o=kp(e||\"\",t),r=!o.protocol&&!o.slashes,d.slashes=o.slashes||r&&t.slashes,d.protocol=o.protocol||t.protocol||\"\",e=o.rest,(o.protocol===\"file:\"&&(o.slashesCount!==2||h7.test(e))||!o.slashes&&(o.protocol||o.slashesCount<2||!At(d.protocol)))&&(u[3]=[/(.*)/,\"pathname\"]);f<u.length;f++){if(i=u[f],typeof i==\"function\"){e=i(e,d);continue}s=i[0],l=i[1],s!==s?d[l]=e:typeof s==\"string\"?(a=s===\"@\"?e.lastIndexOf(s):e.indexOf(s),~a&&(typeof i[2]==\"number\"?(d[l]=e.slice(0,a),e=e.slice(a+i[2])):(d[l]=e.slice(a),e=e.slice(0,a)))):(a=s.exec(e))&&(d[l]=a[1],e=e.slice(0,a.index)),d[l]=d[l]||r&&i[3]&&t[l]||\"\",i[4]&&(d[l]=d[l].toLowerCase())}n&&(d.query=n(d.query)),r&&t.slashes&&d.pathname.charAt(0)!==\"/\"&&(d.pathname!==\"\"||t.pathname!==\"\")&&(d.pathname=m7(d.pathname,t.pathname)),d.pathname.charAt(0)!==\"/\"&&At(d.protocol)&&(d.pathname=\"/\"+d.pathname),wp(d.port,d.protocol)||(d.host=d.hostname,d.port=\"\"),d.username=d.password=\"\",d.auth&&(a=d.auth.indexOf(\":\"),~a?(d.username=d.auth.slice(0,a),d.username=encodeURIComponent(decodeURIComponent(d.username)),d.password=d.auth.slice(a+1),d.password=encodeURIComponent(decodeURIComponent(d.password))):d.username=encodeURIComponent(decodeURIComponent(d.auth)),d.auth=d.password?d.username+\":\"+d.password:d.username),d.origin=d.protocol!==\"file:\"&&At(d.protocol)&&d.host?d.protocol+\"//\"+d.host:\"null\",d.href=d.toString()}function v7(e,t,n){var r=this;switch(e){case\"query\":typeof t==\"string\"&&t.length&&(t=(n||vs.parse)(t)),r[e]=t;break;case\"port\":r[e]=t,wp(t,r.protocol)?t&&(r.host=r.hostname+\":\"+t):(r.host=r.hostname,r[e]=\"\");break;case\"hostname\":r[e]=t,r.port&&(t+=\":\"+r.port),r.host=t;break;case\"host\":r[e]=t,Sp.test(t)?(t=t.split(\":\"),r.port=t.pop(),r.hostname=t.join(\":\")):(r.hostname=t,r.port=\"\");break;case\"protocol\":r.protocol=t.toLowerCase(),r.slashes=!n;break;case\"pathname\":case\"hash\":if(t){var o=e===\"pathname\"?\"/\":\"#\";r[e]=t.charAt(0)!==o?o+t:t}else r[e]=t;break;case\"username\":case\"password\":r[e]=encodeURIComponent(t);break;case\"auth\":var s=t.indexOf(\":\");~s?(r.username=t.slice(0,s),r.username=encodeURIComponent(decodeURIComponent(r.username)),r.password=t.slice(s+1),r.password=encodeURIComponent(decodeURIComponent(r.password))):r.username=encodeURIComponent(decodeURIComponent(t))}for(var i=0;i<Ci.length;i++){var a=Ci[i];a[4]&&(r[a[1]]=r[a[1]].toLowerCase())}return r.auth=r.password?r.username+\":\"+r.password:r.username,r.origin=r.protocol!==\"file:\"&&At(r.protocol)&&r.host?r.protocol+\"//\"+r.host:\"null\",r.href=r.toString(),r}function g7(e){(!e||typeof e!=\"function\")&&(e=vs.stringify);var t,n=this,r=n.host,o=n.protocol;o&&o.charAt(o.length-1)!==\":\"&&(o+=\":\");var s=o+(n.protocol&&n.slashes||At(n.protocol)?\"//\":\"\");return n.username?(s+=n.username,n.password&&(s+=\":\"+n.password),s+=\"@\"):n.password?(s+=\":\"+n.password,s+=\"@\"):n.protocol!==\"file:\"&&At(n.protocol)&&!r&&n.pathname!==\"/\"&&(s+=\"@\"),(r[r.length-1]===\":\"||Sp.test(n.hostname)&&!n.port)&&(r+=\":\"),s+=r+n.pathname,t=typeof n.query==\"object\"?e(n.query):n.query,t&&(s+=t.charAt(0)!==\"?\"?\"?\"+t:t),n.hash&&(s+=n.hash),s}Lt.prototype={set:v7,toString:g7};Lt.extractProtocol=kp;Lt.location=Cp;Lt.trimLeft=Ua;Lt.qs=vs;var _7=Lt;function ki(e){return ki=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},ki(e)}function nc(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function y7(e,t,n){return t&&nc(e.prototype,t),n&&nc(e,n),Object.defineProperty(e,\"prototype\",{writable:!1}),e}function b7(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function w7(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&Kr(e,t)}function E7(e){var t=$p();return function(){var r=Wr(e),o;if(t){var s=Wr(this).constructor;o=Reflect.construct(r,arguments,s)}else o=r.apply(this,arguments);return S7(this,o)}}function S7(e,t){if(t&&(ki(t)===\"object\"||typeof t==\"function\"))return t;if(t!==void 0)throw new TypeError(\"Derived constructors may only return object or undefined\");return C7(e)}function C7(e){if(e===void 0)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function $i(e){var t=typeof Map==\"function\"?new Map:void 0;return $i=function(r){if(r===null||!k7(r))return r;if(typeof r!=\"function\")throw new TypeError(\"Super expression must either be null or a function\");if(typeof t!=\"undefined\"){if(t.has(r))return t.get(r);t.set(r,o)}function o(){return $o(r,arguments,Wr(this).constructor)}return o.prototype=Object.create(r.prototype,{constructor:{value:o,enumerable:!1,writable:!0,configurable:!0}}),Kr(o,r)},$i(e)}function $o(e,t,n){return $p()?$o=Reflect.construct.bind():$o=function(o,s,i){var a=[null];a.push.apply(a,s);var l=Function.bind.apply(o,a),u=new l;return i&&Kr(u,i.prototype),u},$o.apply(null,arguments)}function $p(){if(typeof Reflect==\"undefined\"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy==\"function\")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}function k7(e){return Function.toString.call(e).indexOf(\"[native code]\")!==-1}function Kr(e,t){return Kr=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(r,o){return r.__proto__=o,r},Kr(e,t)}function Wr(e){return Wr=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},Wr(e)}var vo=function(e){w7(n,e);var t=E7(n);function n(r){var o,s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null,i=arguments.length>2&&arguments[2]!==void 0?arguments[2]:null,a=arguments.length>3&&arguments[3]!==void 0?arguments[3]:null;if(b7(this,n),o=t.call(this,r),o.originalRequest=i,o.originalResponse=a,o.causingError=s,s!=null&&(r+=\", caused by \".concat(s.toString())),i!=null){var l=i.getHeader(\"X-Request-ID\")||\"n/a\",u=i.getMethod(),c=i.getURL(),d=a?a.getStatus():\"n/a\",f=a?a.getBody()||\"\":\"n/a\";r+=\", originated from request (method: \".concat(u,\", url: \").concat(c,\", response code: \").concat(d,\", response text: \").concat(f,\", request id: \").concat(l,\")\")}return o.message=r,o}return y7(n)}($i(Error));function $7(){return\"xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx\".replace(/[xy]/g,function(e){var t=Math.random()*16|0,n=e===\"x\"?t:t&3|8;return n.toString(16)})}function xp(e,t){return T7(e)||P7(e,t)||O7(e,t)||x7()}function x7(){throw new TypeError(`Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}function O7(e,t){if(!!e){if(typeof e==\"string\")return rc(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 rc(e,t)}}function rc(e,t){(t==null||t>e.length)&&(t=e.length);for(var n=0,r=new Array(t);n<t;n++)r[n]=e[n];return r}function P7(e,t){var n=e==null?null:typeof Symbol!=\"undefined\"&&e[Symbol.iterator]||e[\"@@iterator\"];if(n!=null){var r=[],o=!0,s=!1,i,a;try{for(n=n.call(e);!(o=(i=n.next()).done)&&(r.push(i.value),!(t&&r.length===t));o=!0);}catch(l){s=!0,a=l}finally{try{!o&&n.return!=null&&n.return()}finally{if(s)throw a}}return r}}function T7(e){if(Array.isArray(e))return e}function oc(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),n.push.apply(n,r)}return n}function Hn(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?oc(Object(n),!0).forEach(function(r){R7(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):oc(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}function R7(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function A7(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function sc(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function L7(e,t,n){return t&&sc(e.prototype,t),n&&sc(e,n),Object.defineProperty(e,\"prototype\",{writable:!1}),e}var U7={endpoint:null,uploadUrl:null,metadata:{},fingerprint:null,uploadSize:null,onProgress:null,onChunkComplete:null,onSuccess:null,onError:null,_onUploadUrlAvailable:null,overridePatchMethod:!1,headers:{},addRequestId:!1,onBeforeRequest:null,onAfterResponse:null,onShouldRetry:null,chunkSize:1/0,retryDelays:[0,1e3,3e3,5e3],parallelUploads:1,parallelUploadBoundaries:null,storeFingerprintForResuming:!0,removeFingerprintOnSuccess:!1,uploadLengthDeferred:!1,uploadDataDuringCreation:!1,urlStorage:null,fileReader:null,httpStack:null},Do=function(){function e(t,n){A7(this,e),\"resume\"in n&&console.log(\"tus: The `resume` option has been removed in tus-js-client v2. Please use the URL storage API instead.\"),this.options=n,this.options.chunkSize=Number(this.options.chunkSize),this._urlStorage=this.options.urlStorage,this.file=t,this.url=null,this._req=null,this._fingerprint=null,this._urlStorageKey=null,this._offset=null,this._aborted=!1,this._size=null,this._source=null,this._retryAttempt=0,this._retryTimeout=null,this._offsetBeforeRetry=0,this._parallelUploads=null,this._parallelUploadUrls=null}return L7(e,[{key:\"findPreviousUploads\",value:function(){var n=this;return this.options.fingerprint(this.file,this.options).then(function(r){return n._urlStorage.findUploadsByFingerprint(r)})}},{key:\"resumeFromPreviousUpload\",value:function(n){this.url=n.uploadUrl||null,this._parallelUploadUrls=n.parallelUploadUrls||null,this._urlStorageKey=n.urlStorageKey}},{key:\"start\",value:function(){var n=this,r=this.file;if(!r){this._emitError(new Error(\"tus: no file or stream to upload provided\"));return}if(!this.options.endpoint&&!this.options.uploadUrl&&!this.url){this._emitError(new Error(\"tus: neither an endpoint or an upload URL is provided\"));return}var o=this.options.retryDelays;if(o!=null&&Object.prototype.toString.call(o)!==\"[object Array]\"){this._emitError(new Error(\"tus: the `retryDelays` option must either be an array or null\"));return}if(this.options.parallelUploads>1)for(var s=0,i=[\"uploadUrl\",\"uploadSize\",\"uploadLengthDeferred\"];s<i.length;s++){var a=i[s];if(this.options[a]){this._emitError(new Error(\"tus: cannot use the \".concat(a,\" option when parallelUploads is enabled\")));return}}if(this.options.parallelUploadBoundaries){if(this.options.parallelUploads<=1){this._emitError(new Error(\"tus: cannot use the `parallelUploadBoundaries` option when `parallelUploads` is disabled\"));return}if(this.options.parallelUploads!==this.options.parallelUploadBoundaries.length){this._emitError(new Error(\"tus: the `parallelUploadBoundaries` must have the same length as the value of `parallelUploads`\"));return}}this.options.fingerprint(r,this.options).then(function(l){return n._fingerprint=l,n._source?n._source:n.options.fileReader.openFile(r,n.options.chunkSize)}).then(function(l){if(n._source=l,n.options.uploadLengthDeferred)n._size=null;else if(n.options.uploadSize!=null){if(n._size=Number(n.options.uploadSize),Number.isNaN(n._size)){n._emitError(new Error(\"tus: cannot convert `uploadSize` option into a number\"));return}}else if(n._size=n._source.size,n._size==null){n._emitError(new Error(\"tus: cannot automatically derive upload's size from input. Specify it manually using the `uploadSize` option or use the `uploadLengthDeferred` option\"));return}n.options.parallelUploads>1||n._parallelUploadUrls!=null?n._startParallelUpload():n._startSingleUpload()}).catch(function(l){n._emitError(l)})}},{key:\"_startParallelUpload\",value:function(){var n,r=this,o=this._size,s=0;this._parallelUploads=[];var i=this._parallelUploadUrls!=null?this._parallelUploadUrls.length:this.options.parallelUploads,a=(n=this.options.parallelUploadBoundaries)!==null&&n!==void 0?n:I7(this._source.size,i);this._parallelUploadUrls&&a.forEach(function(c,d){c.uploadUrl=r._parallelUploadUrls[d]||null}),this._parallelUploadUrls=new Array(a.length);var l=a.map(function(c,d){var f=0;return r._source.slice(c.start,c.end).then(function(p){var m=p.value;return new Promise(function(_,S){var y=Hn(Hn({},r.options),{},{uploadUrl:c.uploadUrl||null,storeFingerprintForResuming:!1,removeFingerprintOnSuccess:!1,parallelUploads:1,parallelUploadBoundaries:null,metadata:{},headers:Hn(Hn({},r.options.headers),{},{\"Upload-Concat\":\"partial\"}),onSuccess:_,onError:S,onProgress:function(x){s=s-f+x,f=x,r._emitProgress(s,o)},_onUploadUrlAvailable:function(){r._parallelUploadUrls[d]=E.url,r._parallelUploadUrls.filter(function(x){return Boolean(x)}).length===a.length&&r._saveUploadInUrlStorage()}}),E=new e(m,y);E.start(),r._parallelUploads.push(E)})})}),u;Promise.all(l).then(function(){u=r._openRequest(\"POST\",r.options.endpoint),u.setHeader(\"Upload-Concat\",\"final;\".concat(r._parallelUploadUrls.join(\" \")));var c=ic(r.options.metadata);return c!==\"\"&&u.setHeader(\"Upload-Metadata\",c),r._sendRequest(u,null)}).then(function(c){if(!qn(c.getStatus(),200)){r._emitHttpError(u,c,\"tus: unexpected response while creating upload\");return}var d=c.getHeader(\"Location\");if(d==null){r._emitHttpError(u,c,\"tus: invalid or missing Location header\");return}r.url=cc(r.options.endpoint,d),\"Created upload at \".concat(r.url),r._emitSuccess()}).catch(function(c){r._emitError(c)})}},{key:\"_startSingleUpload\",value:function(){if(this._aborted=!1,this.url!=null){\"Resuming upload from previous URL: \".concat(this.url),this._resumeUpload();return}if(this.options.uploadUrl!=null){\"Resuming upload from provided URL: \".concat(this.options.uploadUrl),this.url=this.options.uploadUrl,this._resumeUpload();return}this._createUpload()}},{key:\"abort\",value:function(n){var r=this;return this._parallelUploads!=null&&this._parallelUploads.forEach(function(o){o.abort(n)}),this._req!==null&&this._req.abort(),this._aborted=!0,this._retryTimeout!=null&&(clearTimeout(this._retryTimeout),this._retryTimeout=null),!n||this.url==null?Promise.resolve():e.terminate(this.url,this.options).then(function(){return r._removeFromUrlStorage()})}},{key:\"_emitHttpError\",value:function(n,r,o,s){this._emitError(new vo(o,s,n,r))}},{key:\"_emitError\",value:function(n){var r=this;if(!this._aborted){if(this.options.retryDelays!=null){var o=this._offset!=null&&this._offset>this._offsetBeforeRetry;if(o&&(this._retryAttempt=0),uc(n,this._retryAttempt,this.options)){var s=this.options.retryDelays[this._retryAttempt++];this._offsetBeforeRetry=this._offset,this._retryTimeout=setTimeout(function(){r.start()},s);return}}if(typeof this.options.onError==\"function\")this.options.onError(n);else throw n}}},{key:\"_emitSuccess\",value:function(){this.options.removeFingerprintOnSuccess&&this._removeFromUrlStorage(),typeof this.options.onSuccess==\"function\"&&this.options.onSuccess()}},{key:\"_emitProgress\",value:function(n,r){typeof this.options.onProgress==\"function\"&&this.options.onProgress(n,r)}},{key:\"_emitChunkComplete\",value:function(n,r,o){typeof this.options.onChunkComplete==\"function\"&&this.options.onChunkComplete(n,r,o)}},{key:\"_createUpload\",value:function(){var n=this;if(!this.options.endpoint){this._emitError(new Error(\"tus: unable to create upload because no endpoint is provided\"));return}var r=this._openRequest(\"POST\",this.options.endpoint);this.options.uploadLengthDeferred?r.setHeader(\"Upload-Defer-Length\",1):r.setHeader(\"Upload-Length\",this._size);var o=ic(this.options.metadata);o!==\"\"&&r.setHeader(\"Upload-Metadata\",o);var s;this.options.uploadDataDuringCreation&&!this.options.uploadLengthDeferred?(this._offset=0,s=this._addChunkToRequest(r)):s=this._sendRequest(r,null),s.then(function(i){if(!qn(i.getStatus(),200)){n._emitHttpError(r,i,\"tus: unexpected response while creating upload\");return}var a=i.getHeader(\"Location\");if(a==null){n._emitHttpError(r,i,\"tus: invalid or missing Location header\");return}if(n.url=cc(n.options.endpoint,a),\"Created upload at \".concat(n.url),typeof n.options._onUploadUrlAvailable==\"function\"&&n.options._onUploadUrlAvailable(),n._size===0){n._emitSuccess(),n._source.close();return}n._saveUploadInUrlStorage().then(function(){n.options.uploadDataDuringCreation?n._handleUploadResponse(r,i):(n._offset=0,n._performUpload())})}).catch(function(i){n._emitHttpError(r,null,\"tus: failed to create upload\",i)})}},{key:\"_resumeUpload\",value:function(){var n=this,r=this._openRequest(\"HEAD\",this.url),o=this._sendRequest(r,null);o.then(function(s){var i=s.getStatus();if(!qn(i,200)){if(i===423){n._emitHttpError(r,s,\"tus: upload is currently locked; retry later\");return}if(qn(i,400)&&n._removeFromUrlStorage(),!n.options.endpoint){n._emitHttpError(r,s,\"tus: unable to resume upload (new upload cannot be created without an endpoint)\");return}n.url=null,n._createUpload();return}var a=parseInt(s.getHeader(\"Upload-Offset\"),10);if(Number.isNaN(a)){n._emitHttpError(r,s,\"tus: invalid or missing offset value\");return}var l=parseInt(s.getHeader(\"Upload-Length\"),10);if(Number.isNaN(l)&&!n.options.uploadLengthDeferred){n._emitHttpError(r,s,\"tus: invalid or missing length value\");return}typeof n.options._onUploadUrlAvailable==\"function\"&&n.options._onUploadUrlAvailable(),n._saveUploadInUrlStorage().then(function(){if(a===l){n._emitProgress(l,l),n._emitSuccess();return}n._offset=a,n._performUpload()})}).catch(function(s){n._emitHttpError(r,null,\"tus: failed to resume upload\",s)})}},{key:\"_performUpload\",value:function(){var n=this;if(!this._aborted){var r;this.options.overridePatchMethod?(r=this._openRequest(\"POST\",this.url),r.setHeader(\"X-HTTP-Method-Override\",\"PATCH\")):r=this._openRequest(\"PATCH\",this.url),r.setHeader(\"Upload-Offset\",this._offset);var o=this._addChunkToRequest(r);o.then(function(s){if(!qn(s.getStatus(),200)){n._emitHttpError(r,s,\"tus: unexpected response while uploading chunk\");return}n._handleUploadResponse(r,s)}).catch(function(s){n._aborted||n._emitHttpError(r,null,\"tus: failed to upload chunk at offset \".concat(n._offset),s)})}}},{key:\"_addChunkToRequest\",value:function(n){var r=this,o=this._offset,s=this._offset+this.options.chunkSize;return n.setProgressHandler(function(i){r._emitProgress(o+i,r._size)}),n.setHeader(\"Content-Type\",\"application/offset+octet-stream\"),(s===1/0||s>this._size)&&!this.options.uploadLengthDeferred&&(s=this._size),this._source.slice(o,s).then(function(i){var a=i.value,l=i.done;return r.options.uploadLengthDeferred&&l&&(r._size=r._offset+(a&&a.size?a.size:0),n.setHeader(\"Upload-Length\",r._size)),a===null?r._sendRequest(n):(r._emitProgress(r._offset,r._size),r._sendRequest(n,a))})}},{key:\"_handleUploadResponse\",value:function(n,r){var o=parseInt(r.getHeader(\"Upload-Offset\"),10);if(Number.isNaN(o)){this._emitHttpError(n,r,\"tus: invalid or missing offset value\");return}if(this._emitProgress(o,this._size),this._emitChunkComplete(o-this._offset,o,this._size),this._offset=o,o===this._size){this._emitSuccess(),this._source.close();return}this._performUpload()}},{key:\"_openRequest\",value:function(n,r){var o=ac(n,r,this.options);return this._req=o,o}},{key:\"_removeFromUrlStorage\",value:function(){var n=this;!this._urlStorageKey||(this._urlStorage.removeUpload(this._urlStorageKey).catch(function(r){n._emitError(r)}),this._urlStorageKey=null)}},{key:\"_saveUploadInUrlStorage\",value:function(){var n=this;if(!this.options.storeFingerprintForResuming||!this._fingerprint||this._urlStorageKey!==null)return Promise.resolve();var r={size:this._size,metadata:this.options.metadata,creationTime:new Date().toString()};return this._parallelUploads?r.parallelUploadUrls=this._parallelUploadUrls:r.uploadUrl=this.url,this._urlStorage.addUpload(this._fingerprint,r).then(function(o){n._urlStorageKey=o})}},{key:\"_sendRequest\",value:function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:null;return lc(n,r,this.options)}}],[{key:\"terminate\",value:function(n){var r=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},o=ac(\"DELETE\",n,r);return lc(o,null,r).then(function(s){if(s.getStatus()!==204)throw new vo(\"tus: unexpected response while terminating upload\",null,o,s)}).catch(function(s){if(s instanceof vo||(s=new vo(\"tus: failed to terminate upload\",s,o,null)),!uc(s,0,r))throw s;var i=r.retryDelays[0],a=r.retryDelays.slice(1),l=Hn(Hn({},r),{},{retryDelays:a});return new Promise(function(u){return setTimeout(u,i)}).then(function(){return e.terminate(n,l)})})}}]),e}();function ic(e){return Object.entries(e).map(function(t){var n=xp(t,2),r=n[0],o=n[1];return\"\".concat(r,\" \").concat(s7.encode(String(o)))}).join(\",\")}function qn(e,t){return e>=t&&e<t+100}function ac(e,t,n){var r=n.httpStack.createRequest(e,t);r.setHeader(\"Tus-Resumable\",\"1.0.0\");var o=n.headers||{};if(Object.entries(o).forEach(function(i){var a=xp(i,2),l=a[0],u=a[1];r.setHeader(l,u)}),n.addRequestId){var s=$7();r.setHeader(\"X-Request-ID\",s)}return r}function lc(e,t,n){var r=typeof n.onBeforeRequest==\"function\"?Promise.resolve(n.onBeforeRequest(e)):Promise.resolve();return r.then(function(){return e.send(t).then(function(o){var s=typeof n.onAfterResponse==\"function\"?Promise.resolve(n.onAfterResponse(e,o)):Promise.resolve();return s.then(function(){return o})})})}function M7(){var e=!0;return typeof window!=\"undefined\"&&\"navigator\"in window&&window.navigator.onLine===!1&&(e=!1),e}function uc(e,t,n){if(n.retryDelays==null||t>=n.retryDelays.length||e.originalRequest==null)return!1;if(n&&typeof n.onShouldRetry==\"function\")return n.onShouldRetry(e,t,n);var r=e.originalResponse?e.originalResponse.getStatus():0;return(!qn(r,400)||r===409||r===423)&&M7()}function cc(e,t){return new _7(t,e).toString()}function I7(e,t){for(var n=Math.floor(e/t),r=[],o=0;o<t;o++)r.push({start:n*o,end:n*(o+1)});return r[t-1].end=e,r}Do.defaultOptions=U7;function B7(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function fc(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function F7(e,t,n){return t&&fc(e.prototype,t),n&&fc(e,n),Object.defineProperty(e,\"prototype\",{writable:!1}),e}var N7=function(){function e(){B7(this,e)}return F7(e,[{key:\"listAllUploads\",value:function(){return Promise.resolve([])}},{key:\"findUploadsByFingerprint\",value:function(n){return Promise.resolve([])}},{key:\"removeUpload\",value:function(n){return Promise.resolve()}},{key:\"addUpload\",value:function(n,r){return Promise.resolve(null)}}]),e}();function D7(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function dc(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function H7(e,t,n){return t&&dc(e.prototype,t),n&&dc(e,n),Object.defineProperty(e,\"prototype\",{writable:!1}),e}var xi=!1;try{xi=\"localStorage\"in window;var pc=\"tusSupport\";localStorage.setItem(pc,localStorage.getItem(pc))}catch(e){if(e.code===e.SECURITY_ERR||e.code===e.QUOTA_EXCEEDED_ERR)xi=!1;else throw e}var j7=xi,z7=function(){function e(){D7(this,e)}return H7(e,[{key:\"findAllUploads\",value:function(){var n=this._findEntries(\"tus::\");return Promise.resolve(n)}},{key:\"findUploadsByFingerprint\",value:function(n){var r=this._findEntries(\"tus::\".concat(n,\"::\"));return Promise.resolve(r)}},{key:\"removeUpload\",value:function(n){return localStorage.removeItem(n),Promise.resolve()}},{key:\"addUpload\",value:function(n,r){var o=Math.round(Math.random()*1e12),s=\"tus::\".concat(n,\"::\").concat(o);return localStorage.setItem(s,JSON.stringify(r)),Promise.resolve(s)}},{key:\"_findEntries\",value:function(n){for(var r=[],o=0;o<localStorage.length;o++){var s=localStorage.key(o);if(s.indexOf(n)===0)try{var i=JSON.parse(localStorage.getItem(s));i.urlStorageKey=s,r.push(i)}catch(a){}}return r}}]),e}();function Ma(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function hc(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function Ia(e,t,n){return t&&hc(e.prototype,t),n&&hc(e,n),Object.defineProperty(e,\"prototype\",{writable:!1}),e}var q7=function(){function e(){Ma(this,e)}return Ia(e,[{key:\"createRequest\",value:function(n,r){return new V7(n,r)}},{key:\"getName\",value:function(){return\"XHRHttpStack\"}}]),e}(),V7=function(){function e(t,n){Ma(this,e),this._xhr=new XMLHttpRequest,this._method=t,this._url=n,this._headers={}}return Ia(e,[{key:\"getMethod\",value:function(){return this._method}},{key:\"getURL\",value:function(){return this._url}},{key:\"setHeader\",value:function(n,r){this._headers[n]=r}},{key:\"getHeader\",value:function(n){return this._headers[n]}},{key:\"setProgressHandler\",value:function(n){\"upload\"in this._xhr&&(this._xhr.upload.onprogress=function(r){!r.lengthComputable||n(r.loaded)})}},{key:\"send\",value:function(){var n=this,r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:null;return new Promise(function(o,s){n._xhr.onload=function(){o(new K7(n._xhr))},n._xhr.onerror=function(p){s(p)};var i={},a=n._url.indexOf(\"?\");if(a>0){var l=new URLSearchParams(n._url.substring(a));i=Object.fromEntries(l.entries()),n._url=n._url.substring(0,a)}var u=n._headers;for(var c in u)u.hasOwnProperty(c)&&(i[\"Ov-\"+c]=u[c]);var d=new URLSearchParams(i),f=n._url+\"?\"+d.toString();n._xhr.open(n._method,f,!0),n._xhr.send(r)})}},{key:\"abort\",value:function(){return this._xhr.abort(),Promise.resolve()}},{key:\"getUnderlyingObject\",value:function(){return this._xhr}}]),e}(),K7=function(){function e(t){Ma(this,e),this._xhr=t}return Ia(e,[{key:\"getStatus\",value:function(){return this._xhr.status}},{key:\"getHeader\",value:function(n){return this._xhr.getResponseHeader(n)}},{key:\"getBody\",value:function(){return this._xhr.responseText}},{key:\"getUnderlyingObject\",value:function(){return this._xhr}}]),e}(),Op=function(){return typeof navigator!=\"undefined\"&&typeof navigator.product==\"string\"&&navigator.product.toLowerCase()===\"reactnative\"};function W7(e){return new Promise(function(t,n){var r=new XMLHttpRequest;r.responseType=\"blob\",r.onload=function(){var o=r.response;t(o)},r.onerror=function(o){n(o)},r.open(\"GET\",e),r.send()})}var Y7=function(){return typeof window!=\"undefined\"&&(typeof window.PhoneGap!=\"undefined\"||typeof window.Cordova!=\"undefined\"||typeof window.cordova!=\"undefined\")};function J7(e){return new Promise(function(t,n){var r=new FileReader;r.onload=function(){var o=new Uint8Array(r.result);t({value:o})},r.onerror=function(o){n(o)},r.readAsArrayBuffer(e)})}function X7(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function mc(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function Z7(e,t,n){return t&&mc(e.prototype,t),n&&mc(e,n),Object.defineProperty(e,\"prototype\",{writable:!1}),e}var vc=function(){function e(t){X7(this,e),this._file=t,this.size=t.size}return Z7(e,[{key:\"slice\",value:function(n,r){if(Y7())return J7(this._file.slice(n,r));var o=this._file.slice(n,r);return Promise.resolve({value:o})}},{key:\"close\",value:function(){}}]),e}();function G7(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function gc(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function Q7(e,t,n){return t&&gc(e.prototype,t),n&&gc(e,n),Object.defineProperty(e,\"prototype\",{writable:!1}),e}function _c(e){return e===void 0?0:e.size!==void 0?e.size:e.length}function ew(e,t){if(e.concat)return e.concat(t);if(e instanceof Blob)return new Blob([e,t],{type:e.type});if(e.set){var n=new e.constructor(e.length+t.length);return n.set(e),n.set(t,e.length),n}throw new Error(\"Unknown data type\")}var tw=function(){function e(t){G7(this,e),this._buffer=void 0,this._bufferOffset=0,this._reader=t,this._done=!1}return Q7(e,[{key:\"slice\",value:function(n,r){return n<this._bufferOffset?Promise.reject(new Error(\"Requested data is before the reader's current offset\")):this._readUntilEnoughDataOrDone(n,r)}},{key:\"_readUntilEnoughDataOrDone\",value:function(n,r){var o=this,s=r<=this._bufferOffset+_c(this._buffer);if(this._done||s){var i=this._getDataFromBuffer(n,r),a=i==null?this._done:!1;return Promise.resolve({value:i,done:a})}return this._reader.read().then(function(l){var u=l.value,c=l.done;return c?o._done=!0:o._buffer===void 0?o._buffer=u:o._buffer=ew(o._buffer,u),o._readUntilEnoughDataOrDone(n,r)})}},{key:\"_getDataFromBuffer\",value:function(n,r){n>this._bufferOffset&&(this._buffer=this._buffer.slice(n-this._bufferOffset),this._bufferOffset=n);var o=_c(this._buffer)===0;return this._done&&o?null:this._buffer.slice(0,r-n)}},{key:\"close\",value:function(){this._reader.cancel&&this._reader.cancel()}}]),e}();function nw(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function yc(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function rw(e,t,n){return t&&yc(e.prototype,t),n&&yc(e,n),Object.defineProperty(e,\"prototype\",{writable:!1}),e}var ow=function(){function e(){nw(this,e)}return rw(e,[{key:\"openFile\",value:function(n,r){return Op()&&n&&typeof n.uri!=\"undefined\"?W7(n.uri).then(function(o){return new vc(o)}).catch(function(o){throw new Error(\"tus: cannot fetch `file.uri` as Blob, make sure the uri is correct and accessible. \".concat(o))}):typeof n.slice==\"function\"&&typeof n.size!=\"undefined\"?Promise.resolve(new vc(n)):typeof n.read==\"function\"?(r=Number(r),Number.isFinite(r)?Promise.resolve(new tw(n,r)):Promise.reject(new Error(\"cannot create source for stream without a finite value for the `chunkSize` option\"))):Promise.reject(new Error(\"source object may only be an instance of File, Blob, or Reader in this environment\"))}}]),e}();function sw(e,t){return Op()?Promise.resolve(iw(e,t)):Promise.resolve([\"tus-br\",e.name,e.type,e.size,e.lastModified,t.endpoint].join(\"-\"))}function iw(e,t){var n=e.exif?aw(JSON.stringify(e.exif)):\"noexif\";return[\"tus-rn\",e.name||\"noname\",e.size||\"nosize\",n,t.endpoint].join(\"/\")}function aw(e){var t=0;if(e.length===0)return t;for(var n=0;n<e.length;n++){var r=e.charCodeAt(n);t=(t<<5)-t+r,t&=t}return t}function Oi(e){return Oi=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},Oi(e)}function lw(e,t){if(!(e instanceof t))throw new TypeError(\"Cannot call a class as a function\")}function bc(e,t){for(var n=0;n<t.length;n++){var r=t[n];r.enumerable=r.enumerable||!1,r.configurable=!0,\"value\"in r&&(r.writable=!0),Object.defineProperty(e,r.key,r)}}function uw(e,t,n){return t&&bc(e.prototype,t),n&&bc(e,n),Object.defineProperty(e,\"prototype\",{writable:!1}),e}function cw(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Super expression must either be null or a function\");e.prototype=Object.create(t&&t.prototype,{constructor:{value:e,writable:!0,configurable:!0}}),Object.defineProperty(e,\"prototype\",{writable:!1}),t&&Pi(e,t)}function Pi(e,t){return Pi=Object.setPrototypeOf?Object.setPrototypeOf.bind():function(r,o){return r.__proto__=o,r},Pi(e,t)}function fw(e){var t=hw();return function(){var r=Ho(e),o;if(t){var s=Ho(this).constructor;o=Reflect.construct(r,arguments,s)}else o=r.apply(this,arguments);return dw(this,o)}}function dw(e,t){if(t&&(Oi(t)===\"object\"||typeof t==\"function\"))return t;if(t!==void 0)throw new TypeError(\"Derived constructors may only return object or undefined\");return pw(e)}function pw(e){if(e===void 0)throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\");return e}function hw(){if(typeof Reflect==\"undefined\"||!Reflect.construct||Reflect.construct.sham)return!1;if(typeof Proxy==\"function\")return!0;try{return Boolean.prototype.valueOf.call(Reflect.construct(Boolean,[],function(){})),!0}catch(e){return!1}}function Ho(e){return Ho=Object.setPrototypeOf?Object.getPrototypeOf.bind():function(n){return n.__proto__||Object.getPrototypeOf(n)},Ho(e)}function wc(e,t){var n=Object.keys(e);if(Object.getOwnPropertySymbols){var r=Object.getOwnPropertySymbols(e);t&&(r=r.filter(function(o){return Object.getOwnPropertyDescriptor(e,o).enumerable})),n.push.apply(n,r)}return n}function Wn(e){for(var t=1;t<arguments.length;t++){var n=arguments[t]!=null?arguments[t]:{};t%2?wc(Object(n),!0).forEach(function(r){mw(e,r,n[r])}):Object.getOwnPropertyDescriptors?Object.defineProperties(e,Object.getOwnPropertyDescriptors(n)):wc(Object(n)).forEach(function(r){Object.defineProperty(e,r,Object.getOwnPropertyDescriptor(n,r))})}return e}function mw(e,t,n){return t in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}var Ec=Wn(Wn({},Do.defaultOptions),{},{httpStack:new q7,fileReader:new ow,urlStorage:j7?new z7:new N7,fingerprint:sw}),vw=function(e){cw(n,e);var t=fw(n);function n(){var r=arguments.length>0&&arguments[0]!==void 0?arguments[0]:null,o=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return lw(this,n),o=Wn(Wn({},Ec),o),t.call(this,r,o)}return uw(n,null,[{key:\"terminate\",value:function(o){var s=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{};return s=Wn(Wn({},Ec),s),Do.terminate(o,s)}}]),n}(Do);const gw=e=>(Jo(\"data-v-a70de484\"),e=e(),Xo(),e),_w=gw(()=>A(\"div\",{class:\"el-upload__text\"},[rn(\" \\u5C06\\u6587\\u4EF6\\u62D6\\u5230\\u6B64\\u5904\\u6216\"),A(\"em\",null,\"\\u70B9\\u51FB\\u4E0A\\u4F20\")],-1)),yw={key:0,class:\"progress-container\"},bw={class:\"file-list_item\"},ww={class:\"name\"},Ew=[\"onClick\",\"disabled\"],Sw={class:\"msg\"},Cw={class:\"btns\"},kw=$e({__name:\"index\",props:{success:{type:Function,required:!0},close:{type:Function,required:!0},files:{type:Array,default:[]},destination:{type:String,default:\"\"}},setup(e){const t=e,n=K5.ComputeSize,r=W(!0),o=W(!1),s=W(0),i=W(t.files);let a=!1;const l=W(\"\"),u=W(!1),c=()=>{r.value=!1,a?t.success():t.close()},d=(L,P)=>{for(let C=0;C<i.value.length;C++)if(i.value[C].name===L.name)return;L.raw&&i.value.push(L.raw)},f=L=>{i.value.splice(L,1)},p=()=>ft(this,null,function*(){S&&S.abort(),o.value=!1}),m=()=>ft(this,null,function*(){yield w()}),_=(L,P)=>{l.value=`${L}: ${P}`};let S=null;const y=W(!1),E=W(!1),w=()=>ft(this,null,function*(){if(o.value){fn.Warning(\"\\u8BF7\\u5148\\u7B49\\u5F85\\u4E0A\\u4F20\\u5B8C\\u6210\");return}o.value=!0,u.value=!0,a=!0;const L=[...i.value];let P=0;for(let C=0;C<L.length;C++){const T=L[C];_(T.name,\"\\u6B63\\u5728\\u4E0A\\u4F20\\u4E2D...\"),S=null,y.value=!0;try{(yield x(T,t.destination))&&(i.value.splice(0,1),P++)}catch(N){_(T.name,N);break}finally{y.value=!1}}l.value=`\\u4E0A\\u4F20\\u5B8C\\u6210,\\u6210\\u529F\\u4E0A\\u4F20 ${P}/${L.length} \\u4E2A\\u6587\\u4EF6`,u.value=!1,o.value=!1}),x=(L,P)=>ft(this,null,function*(){return new Promise((C,T)=>ft(this,null,function*(){const N=new vw(L,{endpoint:\"/cgi-bin/luci/linkease/api/file/transmit/\",chunkSize:20482048,retryDelays:[0,1e3,3e3,5e3],parallelUploads:1,metadata:{filename:L.name,filetype:L.type,dest:\"/local\"+P},onError(q){const B=q;if(B&&B.originalRequest&&window.confirm(`Failed because: ${q}\n\\u662F\\u5426\\u7EE7\\u7EED\\u91CD\\u8BD5?`)){N.start();return}T(q)},onProgress(q,B){s.value=Number((q/B*100).toFixed(2))},onSuccess(){C(!0)}});N.findPreviousUploads().then(q=>{N.start(),E.value=!1}),S=N}))}),b=()=>{!S||(E.value?S.start():S.abort(),E.value=!E.value)};return(L,P)=>($(),ie(v(Bd),{draggable:\"\",\"close-on-press-escape\":!1,\"close-on-click-modal\":!1,\"destroy-on-close\":\"\",modelValue:r.value,\"onUpdate:modelValue\":P[0]||(P[0]=C=>r.value=C),width:\"800px\",\"before-close\":c},{default:re(()=>[ee(v(tb),{drag:\"\",multiple:\"\",\"show-file-list\":!1,\"on-change\":d,\"auto-upload\":!1,disabled:o.value},{default:re(()=>[ee(v(et),{class:\"el-icon--upload\"},{default:re(()=>[ee(v(Y4))]),_:1}),_w]),_:1},8,[\"disabled\"]),u.value?($(),I(\"div\",yw,[ee(v(Fd),{\"text-inside\":!0,\"stroke-width\":16,percentage:s.value},null,8,[\"percentage\"])])):le(\"\",!0),ee(v(Rd),{\"max-height\":\"400px\",class:\"files-list\"},{default:re(()=>[($(!0),I(Ie,null,ea(i.value,(C,T)=>($(),I(\"li\",bw,[A(\"span\",ww,\" [\"+tt(v(n)(C.size))+\"] \"+tt(C.name),1),A(\"button\",{onClick:N=>f(T),disabled:o.value},[ee(v(et),null,{default:re(()=>[ee(v(Qr))]),_:1})],8,Ew)]))),256))]),_:1}),A(\"div\",Sw,tt(l.value),1),A(\"div\",Cw,[y.value?($(),ie(v(Tr),{key:0,type:\"warning\",onClick:b},{default:re(()=>[rn(tt(E.value?\"\\u6062\\u590D\":\"\\u6682\\u505C\"),1)]),_:1})):le(\"\",!0),o.value?($(),ie(v(Tr),{key:1,type:\"danger\",disabled:!o.value,onClick:p},{default:re(()=>[rn(\"\\u53D6\\u6D88\\u4E0A\\u4F20\")]),_:1},8,[\"disabled\"])):le(\"\",!0),i.value&&i.value.length>0?($(),ie(v(Tr),{key:2,type:\"primary\",disabled:o.value,onClick:m},{default:re(()=>[rn(\" \\u4E0A\\u4F20\")]),_:1},8,[\"disabled\"])):le(\"\",!0)])]),_:1},8,[\"modelValue\"]))}});const $w=Le(kw,[[\"__scopeId\",\"data-v-a70de484\"]]),xw={install(e){const t=n=>{const r=document.createElement(\"div\");document.body.appendChild(r);const o=()=>{nr(null,r),r.remove()},s=(n==null?void 0:n.files)||[],i=(n==null?void 0:n.destination)||\"\";return new Promise((a,l)=>{const u=ee($w,{files:s||[],destination:i,success:()=>{o(),a(!0)},close:()=>{o(),l()}});u.appContext=e._context,nr(u,r)})};e.config.globalProperties.$uploadFile=t}},Pp=e=>{let t=e.split(\"/\"),n=t.length;for(let r=0;r<n;r++)t[r]=encodeURIComponent(t[r]);return t.join(\"/\")},Ow=e=>{for(let t=0;t<e.length;t++)e[t].getDownloadUrl=()=>\"/cgi-bin/luci/linkease/fileserve/local\"+Pp(`${e[t].rootPath}`),e[t].getSuffixName=()=>e[t].name.split(\".\").splice(-1)[0],e[t].getAbsPath=()=>{var r;const n=((r=e[t].rootPath)==null?void 0:r.split(\"/\"))||[];return n.splice(0,n.length-1).join(\"/\")||\"/\"};return e},Ti=e=>{let t=e.split(\".\");return t.length>0?t[t.length-1]==\"heic\":!1},Pw=e=>{switch(e){case\"video\":return\"\\u89C6\\u9891\";case\"music\":return\"\\u97F3\\u9891\";case\"doc\":return\"\\u6587\\u6863\";case\"dir\":return\"\\u6587\\u4EF6\\u5939\";case\"image\":return\"\\u56FE\\u50CF\";case\"archive\":return\"\\u538B\\u7F29\\u6587\\u4EF6\";case\"other\":return\"\\u5176\\u4ED6\\u6587\\u4EF6\";default:return\"\"}},Tw=(e,t)=>{const n=[],r=e.length;for(let o=t;o<r;o++)if(e[o].iconType===\"image\"){let s=e[o].getDownloadUrl();Ti(e[o].name)&&(s+=\"?heic=yes\"),n.push(s)}for(let o=0;o<r;o++)if(e[o].iconType===\"image\"){let s=e[o].getDownloadUrl();Ti(e[o].name)&&(s+=\"?heic=yes\"),n.push(s)}return n},Rw=Object.freeze(Object.defineProperty({__proto__:null,EncodeURL:Pp,FileBasicEntryArray:Ow,isHeic:Ti,getFileType:Pw,getEntriesImages:Tw},Symbol.toStringTag,{value:\"Module\"})),Aw=Ee({},Rw),Lw={class:\"f\"},Uw={class:\"r\"},Mw={class:\"children\"},Iw=$e({__name:\"file\",props:{item:{type:Object,required:!0}},setup(e){const t=e,n=W(!1),r=W(!1),o=K(()=>t.item.rootPath||`/${t.item.name}`),s=Oe(\"select\"),i=Oe(\"path\"),a=l=>{n.value=!n.value,r.value=!0,s(l,o.value)};return(l,u)=>{const c=yo(\"thumbnail\"),d=yo(\"icon-top\"),f=yo(\"icon-down\");return $(),I(Ie,null,[A(\"li\",{class:J([\"entrie-item\",{on:v(i)==v(o)}]),onClick:u[0]||(u[0]=p=>a(e.item))},[A(\"div\",Lw,[ee(c,{file:e.item},null,8,[\"file\"]),A(\"span\",null,tt(e.item.name),1)]),A(\"div\",Uw,[n.value?($(),ie(d,{key:0})):($(),ie(f,{key:1}))])],2),Zr(A(\"div\",Mw,[r.value?($(),ie(Tp,{key:0,path:v(o)},null,8,[\"path\"])):le(\"\",!0)],512),[[Gr,n.value]])],64)}}});const Bw=Le(Iw,[[\"__scopeId\",\"data-v-f8376cdf\"]]),Tp=$e({__name:\"files\",props:{path:{type:String,default:\"/\"}},setup(e){return ft(this,null,function*(){let t,n;const r=e,o=W([]),s=()=>ft(this,null,function*(){try{const i={path:`/local${r.path}`,filter:\"dir\"},a=yield N5.File.Basic.List.POST(i);if(a.data){const{success:l,result:u,error:c}=a.data;l==0&&(o.value=Aw.FileBasicEntryArray(u.entries||[]))}}catch(i){console.log(i)}finally{}});return[t,n]=M0(()=>s()),yield t,n(),(i,a)=>($(!0),I(Ie,null,ea(o.value,l=>($(),I(\"ul\",{key:l.rootPath},[ee(Bw,{item:l},null,8,[\"item\"])]))),128))})}}),Fw=e=>(Jo(\"data-v-537135b0\"),e=e(),Xo(),e),Nw={class:\"select-container\"},Dw={class:\"select-header\"},Hw=Fw(()=>A(\"span\",null,\" \\u5DF2\\u9009\\u62E9:\",-1)),jw={class:\"select-footer\"},zw=$e({__name:\"app\",props:{success:{type:Function,required:!0},close:{type:Function,required:!0}},setup(e){const t=e,n=W(!0);nt(\"success\",t.success),nt(\"close\",t.close);const r=W(\"\"),o=W(null);nt(\"select\",(l,u)=>{o.value=l,r.value=u}),nt(\"path\",r);const i=()=>{n.value=!1,t.close()},a=()=>{!o.value||(n.value=!1,t.success(o.value,r.value))};return(l,u)=>($(),ie(v(Bd),{draggable:\"\",\"close-on-press-escape\":!1,\"before-close\":i,\"close-on-click-modal\":!1,\"destroy-on-close\":\"\",modelValue:n.value,\"onUpdate:modelValue\":u[0]||(u[0]=c=>n.value=c),top:\"5vh\"},{default:re(()=>[A(\"div\",Nw,[A(\"div\",Dw,[Hw,rn(\" \"+tt(r.value),1)]),ee(v(Rd),{class:\"select-body\"},{default:re(()=>[($(),ie(tf,null,{default:re(()=>[ee(Tp)]),_:1}))]),_:1}),A(\"div\",jw,[ee(v(Tr),{onClick:i},{default:re(()=>[rn(\"\\u53D6\\u6D88\")]),_:1}),ee(v(Tr),{type:\"primary\",onClick:a},{default:re(()=>[rn(\"\\u786E\\u5B9A\")]),_:1})])])]),_:1},8,[\"modelValue\"]))}});const qw=Le(zw,[[\"__scopeId\",\"data-v-537135b0\"]]),Vw={install(e){const t=()=>{const n=document.createElement(\"div\");document.body.appendChild(n);const r=()=>{nr(null,n),n.remove()};return new Promise((o,s)=>{const a=ee(qw,{success:(l,u)=>{r(),o({entry:l,path:u})},close:()=>{r(),s()}});a.appContext=e._context,nr(a,n)})};e.config.globalProperties.$selectPath=t}},to=Bf(_1);to.component(\"thumbnail\",Dv);to.use(Bv);to.use($2()).use(C2);to.use(xw).use(Vw);to.mount(\"#app\");export{Gw as $,v as A,Dt as B,le as C,Qr as D,et as E,I as F,n9 as G,r9 as H,Ie as I,p9 as J,c3 as K,Cn as L,u9 as M,c9 as N,ea as O,Zr as P,Gr as Q,Ne as R,pe as S,fr as T,S0 as U,St as V,ga as W,ou as X,An as Y,K5 as Z,Je as _,ct as a,xd as a$,Qw as a0,yo as a1,Rd as a2,rn as a3,tt as a4,Jo as a5,Xo as a6,Le as a7,e9 as a8,N5 as a9,un as aA,fn as aB,nt as aC,Oe as aD,Eh as aE,L8 as aF,Tn as aG,ji as aH,Sn as aI,Ww as aJ,k0 as aK,gi as aL,Tr as aM,t9 as aN,Gs as aO,Hr as aP,U8 as aQ,Ld as aR,M8 as aS,W_ as aT,_d as aU,te as aV,Pe as aW,va as aX,cn as aY,ba as aZ,Zh as a_,Fo as aa,da as ab,fa as ac,Mo as ad,yd as ae,o8 as af,be as ag,w9 as ah,E9 as ai,z8 as aj,F8 as ak,vi as al,S9 as am,ya as an,ir as ao,y9 as ap,Mf as aq,od as ar,mt as as,Mi as at,eo as au,Aw as av,C9 as aw,Xw as ax,os as ay,M0 as az,Ve as b,Jw as b0,sa as b1,b9 as b2,d9 as b3,i9 as b4,pd as b5,md as b6,Zi as b7,nd as b8,me as b9,Qo as bA,k8 as bB,su as bC,$8 as bD,x8 as bE,nf as bF,_9 as bG,Zw as bH,l9 as bI,qo as bJ,v9 as bK,g9 as bL,a9 as bM,h9 as bN,Pa as bO,ap as bP,ve as ba,an as bb,es as bc,rt as bd,Vn as be,E8 as bf,Sd as bg,yy as bh,m9 as bi,X as bj,w8 as bk,Jh as bl,t6 as bm,R8 as bn,iu as bo,N8 as bp,Y8 as bq,Pd as br,kn as bs,nr as bt,ce as bu,Jr as bv,de as bw,dd as bx,o9 as by,Yw as bz,Ft as c,fe as d,$e as e,er as f,s9 as g,ze as h,Uo as i,Td as j,Oc as k,Mr as l,Io as m,K as n,jt as o,$t as p,$ as q,W as r,f9 as s,ie as t,Od as u,ee as v,Ae as w,re as x,A as y,J as z};\n"
  },
  {
    "path": "luci-app-linkease/htdocs/luci-static/linkeasefile/style.css",
    "content": "@charset \"UTF-8\";#main[data-v-56bb5d38]{width:100%;height:100%;display:flex;flex-wrap:wrap}:root{--color: #fff;--text-color: #333;--desc-color: #999;--active-color: #409eff;--clear-color: #f89898}@media (prefers-color-scheme: light){:root{--color: #fff;--text-color: #333;--desc-color: #999;--active-color: #409eff;--clear-color: #f89898}}@media (prefers-color-scheme: dark){:root{--color: #fff;--text-color: #333;--desc-color: #999;--active-color: #409eff;--clear-color: #f89898}}@media (prefers-color-scheme: no-preference){:root{--color: #fff;--text-color: #333;--desc-color: #999;--active-color: #409eff;--clear-color: #f89898}}*{-webkit-box-sizing:border-box;-webkit-tap-highlight-color:transparent;box-sizing:border-box;word-wrap:break-word;outline:none;-webkit-font-smoothing:subpixel-antialiased}body{font-size:12px;font-weight:500;font-style:normal;-webkit-font-smoothing:antialiased;-webkit-text-stroke-width:0;-moz-osx-font-smoothing:grayscale}html,body,ul,p{margin:0;padding:0}html,body{width:100%;height:100%;position:relative;-webkit-overflow-scrolling:touch;overflow:hidden}a{color:#2271b1;cursor:pointer;text-decoration:none}i{font-style:normal}img{object-fit:cover}img:not([src]){opacity:0}li{list-style:none}input,button{outline:none;cursor:pointer;border:none}#app{width:100%;height:100%;position:relative}.auto{flex:auto}svg.icon{width:100%;height:100%}:root{--el-color-white:#ffffff;--el-color-black:#000000;--el-color-primary-rgb:64,158,255;--el-color-success-rgb:103,194,58;--el-color-warning-rgb:230,162,60;--el-color-danger-rgb:245,108,108;--el-color-error-rgb:245,108,108;--el-color-info-rgb:144,147,153;--el-font-size-extra-large:20px;--el-font-size-large:18px;--el-font-size-medium:16px;--el-font-size-base:14px;--el-font-size-small:13px;--el-font-size-extra-small:12px;--el-font-family:\"Helvetica Neue\",Helvetica,\"PingFang SC\",\"Hiragino Sans GB\",\"Microsoft YaHei\",\"\\5fae\\8f6f\\96c5\\9ed1\",Arial,sans-serif;--el-font-weight-primary:500;--el-font-line-height-primary:24px;--el-index-normal:1;--el-index-top:1000;--el-index-popper:2000;--el-border-radius-base:4px;--el-border-radius-small:2px;--el-border-radius-round:20px;--el-border-radius-circle:100%;--el-transition-duration:.3s;--el-transition-duration-fast:.2s;--el-transition-function-ease-in-out-bezier:cubic-bezier(.645, .045, .355, 1);--el-transition-function-fast-bezier:cubic-bezier(.23, 1, .32, 1);--el-transition-all:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);--el-transition-fade:opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-md-fade:transform var(--el-transition-duration) var(--el-transition-function-fast-bezier),opacity var(--el-transition-duration) var(--el-transition-function-fast-bezier);--el-transition-fade-linear:opacity var(--el-transition-duration-fast) linear;--el-transition-border:border-color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-box-shadow:box-shadow var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-transition-color:color var(--el-transition-duration-fast) var(--el-transition-function-ease-in-out-bezier);--el-component-size-large:40px;--el-component-size:32px;--el-component-size-small:24px}:root{color-scheme:light;--el-color-white:#ffffff;--el-color-black:#000000;--el-color-primary:#409eff;--el-color-primary-light-3:#79bbff;--el-color-primary-light-5:#a0cfff;--el-color-primary-light-7:#c6e2ff;--el-color-primary-light-8:#d9ecff;--el-color-primary-light-9:#ecf5ff;--el-color-primary-dark-2:#337ecc;--el-color-success:#67c23a;--el-color-success-light-3:#95d475;--el-color-success-light-5:#b3e19d;--el-color-success-light-7:#d1edc4;--el-color-success-light-8:#e1f3d8;--el-color-success-light-9:#f0f9eb;--el-color-success-dark-2:#529b2e;--el-color-warning:#e6a23c;--el-color-warning-light-3:#eebe77;--el-color-warning-light-5:#f3d19e;--el-color-warning-light-7:#f8e3c5;--el-color-warning-light-8:#faecd8;--el-color-warning-light-9:#fdf6ec;--el-color-warning-dark-2:#b88230;--el-color-danger:#f56c6c;--el-color-danger-light-3:#f89898;--el-color-danger-light-5:#fab6b6;--el-color-danger-light-7:#fcd3d3;--el-color-danger-light-8:#fde2e2;--el-color-danger-light-9:#fef0f0;--el-color-danger-dark-2:#c45656;--el-color-error:#f56c6c;--el-color-error-light-3:#f89898;--el-color-error-light-5:#fab6b6;--el-color-error-light-7:#fcd3d3;--el-color-error-light-8:#fde2e2;--el-color-error-light-9:#fef0f0;--el-color-error-dark-2:#c45656;--el-color-info:#909399;--el-color-info-light-3:#b1b3b8;--el-color-info-light-5:#c8c9cc;--el-color-info-light-7:#dedfe0;--el-color-info-light-8:#e9e9eb;--el-color-info-light-9:#f4f4f5;--el-color-info-dark-2:#73767a;--el-bg-color:#ffffff;--el-bg-color-page:#f2f3f5;--el-bg-color-overlay:#ffffff;--el-text-color-primary:#303133;--el-text-color-regular:#606266;--el-text-color-secondary:#909399;--el-text-color-placeholder:#a8abb2;--el-text-color-disabled:#c0c4cc;--el-border-color:#dcdfe6;--el-border-color-light:#e4e7ed;--el-border-color-lighter:#ebeef5;--el-border-color-extra-light:#f2f6fc;--el-border-color-dark:#d4d7de;--el-border-color-darker:#cdd0d6;--el-fill-color:#f0f2f5;--el-fill-color-light:#f5f7fa;--el-fill-color-lighter:#fafafa;--el-fill-color-extra-light:#fafcff;--el-fill-color-dark:#ebedf0;--el-fill-color-darker:#e6e8eb;--el-fill-color-blank:#ffffff;--el-box-shadow:0px 12px 32px 4px rgba(0, 0, 0, .04),0px 8px 20px rgba(0, 0, 0, .08);--el-box-shadow-light:0px 0px 12px rgba(0, 0, 0, .12);--el-box-shadow-lighter:0px 0px 6px rgba(0, 0, 0, .12);--el-box-shadow-dark:0px 16px 48px 16px rgba(0, 0, 0, .08),0px 12px 32px rgba(0, 0, 0, .12),0px 8px 16px -8px rgba(0, 0, 0, .16);--el-disabled-bg-color:var(--el-fill-color-light);--el-disabled-text-color:var(--el-text-color-placeholder);--el-disabled-border-color:var(--el-border-color-light);--el-overlay-color:rgba(0, 0, 0, .8);--el-overlay-color-light:rgba(0, 0, 0, .7);--el-overlay-color-lighter:rgba(0, 0, 0, .5);--el-mask-color:rgba(255, 255, 255, .9);--el-mask-color-extra-light:rgba(255, 255, 255, .3);--el-border-width:1px;--el-border-style:solid;--el-border-color-hover:var(--el-text-color-disabled);--el-border:var(--el-border-width) var(--el-border-style) var(--el-border-color);--el-svg-monochrome-grey:var(--el-border-color)}.fade-in-linear-enter-active,.fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.fade-in-linear-enter-from,.fade-in-linear-leave-to{opacity:0}.el-fade-in-linear-enter-active,.el-fade-in-linear-leave-active{transition:var(--el-transition-fade-linear)}.el-fade-in-linear-enter-from,.el-fade-in-linear-leave-to{opacity:0}.el-fade-in-enter-active,.el-fade-in-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-fade-in-enter-from,.el-fade-in-leave-active{opacity:0}.el-zoom-in-center-enter-active,.el-zoom-in-center-leave-active{transition:all var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-zoom-in-center-enter-from,.el-zoom-in-center-leave-active{opacity:0;transform:scaleX(0)}.el-zoom-in-top-enter-active,.el-zoom-in-top-leave-active{opacity:1;transform:scaleY(1);transition:var(--el-transition-md-fade);transform-origin:center top}.el-zoom-in-top-enter-active[data-popper-placement^=top],.el-zoom-in-top-leave-active[data-popper-placement^=top]{transform-origin:center bottom}.el-zoom-in-top-enter-from,.el-zoom-in-top-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-bottom-enter-active,.el-zoom-in-bottom-leave-active{opacity:1;transform:scaleY(1);transition:var(--el-transition-md-fade);transform-origin:center bottom}.el-zoom-in-bottom-enter-from,.el-zoom-in-bottom-leave-active{opacity:0;transform:scaleY(0)}.el-zoom-in-left-enter-active,.el-zoom-in-left-leave-active{opacity:1;transform:scale(1);transition:var(--el-transition-md-fade);transform-origin:top left}.el-zoom-in-left-enter-from,.el-zoom-in-left-leave-active{opacity:0;transform:scale(.45)}.collapse-transition{transition:var(--el-transition-duration) height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.el-collapse-transition-enter-active,.el-collapse-transition-leave-active{transition:var(--el-transition-duration) max-height ease-in-out,var(--el-transition-duration) padding-top ease-in-out,var(--el-transition-duration) padding-bottom ease-in-out}.horizontal-collapse-transition{transition:var(--el-transition-duration) width ease-in-out,var(--el-transition-duration) padding-left ease-in-out,var(--el-transition-duration) padding-right ease-in-out}.el-list-enter-active,.el-list-leave-active{transition:all 1s}.el-list-enter-from,.el-list-leave-to{opacity:0;transform:translateY(-30px)}.el-list-leave-active{position:absolute!important}.el-opacity-transition{transition:opacity var(--el-transition-duration) cubic-bezier(.55,0,.1,1)}.el-icon-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon--right{margin-left:5px}.el-icon--left{margin-right:5px}@-webkit-keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes rotating{0%{transform:rotate(0)}to{transform:rotate(360deg)}}.el-icon{--color:inherit;height:1em;width:1em;line-height:1em;display:inline-flex;justify-content:center;align-items:center;position:relative;fill:currentColor;color:var(--color);font-size:inherit}.el-icon.is-loading{-webkit-animation:rotating 2s linear infinite;animation:rotating 2s linear infinite}.el-icon svg{height:1em;width:1em}.el-affix--fixed{position:fixed}.el-alert{--el-alert-padding:8px 16px;--el-alert-border-radius-base:var(--el-border-radius-base);--el-alert-title-font-size:13px;--el-alert-description-font-size:12px;--el-alert-close-font-size:12px;--el-alert-close-customed-font-size:13px;--el-alert-icon-size:16px;--el-alert-icon-large-size:28px;width:100%;padding:var(--el-alert-padding);margin:0;box-sizing:border-box;border-radius:var(--el-alert-border-radius-base);position:relative;background-color:var(--el-color-white);overflow:hidden;opacity:1;display:flex;align-items:center;transition:opacity var(--el-transition-duration-fast)}.el-alert.is-light .el-alert__close-btn{color:var(--el-text-color-placeholder)}.el-alert.is-dark .el-alert__close-btn,.el-alert.is-dark .el-alert__description{color:var(--el-color-white)}.el-alert.is-center{justify-content:center}.el-alert--success{--el-alert-bg-color:var(--el-color-success-light-9)}.el-alert--success.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-success)}.el-alert--success.is-light .el-alert__description{color:var(--el-color-success)}.el-alert--success.is-dark{background-color:var(--el-color-success);color:var(--el-color-white)}.el-alert--info{--el-alert-bg-color:var(--el-color-info-light-9)}.el-alert--info.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-info)}.el-alert--info.is-light .el-alert__description{color:var(--el-color-info)}.el-alert--info.is-dark{background-color:var(--el-color-info);color:var(--el-color-white)}.el-alert--warning{--el-alert-bg-color:var(--el-color-warning-light-9)}.el-alert--warning.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-warning)}.el-alert--warning.is-light .el-alert__description{color:var(--el-color-warning)}.el-alert--warning.is-dark{background-color:var(--el-color-warning);color:var(--el-color-white)}.el-alert--error{--el-alert-bg-color:var(--el-color-error-light-9)}.el-alert--error.is-light{background-color:var(--el-alert-bg-color);color:var(--el-color-error)}.el-alert--error.is-light .el-alert__description{color:var(--el-color-error)}.el-alert--error.is-dark{background-color:var(--el-color-error);color:var(--el-color-white)}.el-alert__content{display:table-cell;padding:0 8px}.el-alert .el-alert__icon{font-size:var(--el-alert-icon-size);width:var(--el-alert-icon-size)}.el-alert .el-alert__icon.is-big{font-size:var(--el-alert-icon-large-size);width:var(--el-alert-icon-large-size)}.el-alert__title{font-size:var(--el-alert-title-font-size);line-height:18px;vertical-align:text-top}.el-alert__title.is-bold{font-weight:700}.el-alert .el-alert__description{font-size:var(--el-alert-description-font-size);margin:5px 0 0}.el-alert .el-alert__close-btn{font-size:var(--el-alert-close-font-size);opacity:1;position:absolute;top:12px;right:15px;cursor:pointer}.el-alert .el-alert__close-btn.is-customed{font-style:normal;font-size:var(--el-alert-close-customed-font-size);top:9px}.el-alert-fade-enter-from,.el-alert-fade-leave-active{opacity:0}.el-aside{overflow:auto;box-sizing:border-box;flex-shrink:0;width:var(--el-aside-width,300px)}.el-autocomplete{position:relative;display:inline-block}.el-autocomplete__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);box-shadow:var(--el-box-shadow-light)}.el-autocomplete__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-autocomplete__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:transparent;border-left-color:transparent}.el-autocomplete__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-autocomplete__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-left-color:transparent;border-bottom-color:transparent}.el-autocomplete__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-autocomplete-suggestion{border-radius:var(--el-border-radius-base);box-sizing:border-box}.el-autocomplete-suggestion__wrap{max-height:280px;padding:10px 0;box-sizing:border-box}.el-autocomplete-suggestion__list{margin:0;padding:0}.el-autocomplete-suggestion li{padding:0 20px;margin:0;line-height:34px;cursor:pointer;color:var(--el-text-color-regular);font-size:var(--el-font-size-base);list-style:none;text-align:left;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-autocomplete-suggestion li:hover,.el-autocomplete-suggestion li.highlighted{background-color:var(--el-fill-color-light)}.el-autocomplete-suggestion li.divider{margin-top:6px;border-top:1px solid var(--el-color-black)}.el-autocomplete-suggestion li.divider:last-child{margin-bottom:-6px}.el-autocomplete-suggestion.is-loading li{text-align:center;height:100px;line-height:100px;font-size:20px;color:var(--el-text-color-secondary)}.el-autocomplete-suggestion.is-loading li:after{display:inline-block;content:\"\";height:100%;vertical-align:middle}.el-autocomplete-suggestion.is-loading li:hover{background-color:var(--el-bg-color-overlay)}.el-autocomplete-suggestion.is-loading .el-icon-loading{vertical-align:middle}.el-avatar{--el-avatar-text-color:var(--el-color-white);--el-avatar-bg-color:var(--el-text-color-disabled);--el-avatar-text-size:14px;--el-avatar-icon-size:18px;--el-avatar-border-radius:var(--el-border-radius-base);--el-avatar-size-large:56px;--el-avatar-size-small:24px;--el-avatar-size:40px;display:inline-flex;justify-content:center;align-items:center;box-sizing:border-box;text-align:center;overflow:hidden;color:var(--el-avatar-text-color);background:var(--el-avatar-bg-color);width:var(--el-avatar-size);height:var(--el-avatar-size);font-size:var(--el-avatar-text-size)}.el-avatar>img{display:block;height:100%}.el-avatar--circle{border-radius:50%}.el-avatar--square{border-radius:var(--el-avatar-border-radius)}.el-avatar--icon{font-size:var(--el-avatar-icon-size)}.el-avatar--small{--el-avatar-size:24px}.el-avatar--large{--el-avatar-size:56px}.el-backtop{--el-backtop-bg-color:var(--el-bg-color-overlay);--el-backtop-text-color:var(--el-color-primary);--el-backtop-hover-bg-color:var(--el-border-color-extra-light);position:fixed;background-color:var(--el-backtop-bg-color);width:40px;height:40px;border-radius:50%;color:var(--el-backtop-text-color);display:flex;align-items:center;justify-content:center;font-size:20px;box-shadow:var(--el-box-shadow-lighter);cursor:pointer;z-index:5}.el-backtop:hover{background-color:var(--el-backtop-hover-bg-color)}.el-backtop__icon{font-size:20px}.el-badge{--el-badge-bg-color:var(--el-color-danger);--el-badge-radius:10px;--el-badge-font-size:12px;--el-badge-padding:6px;--el-badge-size:18px;position:relative;vertical-align:middle;display:inline-block}.el-badge__content{background-color:var(--el-badge-bg-color);border-radius:var(--el-badge-radius);color:var(--el-color-white);display:inline-flex;justify-content:center;align-items:center;font-size:var(--el-badge-font-size);height:var(--el-badge-size);padding:0 var(--el-badge-padding);white-space:nowrap;border:1px solid var(--el-bg-color)}.el-badge__content.is-fixed{position:absolute;top:0;right:calc(1px + var(--el-badge-size)/ 2);transform:translateY(-50%) translate(100%)}.el-badge__content.is-fixed.is-dot{right:5px}.el-badge__content.is-dot{height:8px;width:8px;padding:0;right:0;border-radius:50%}.el-badge__content--primary{background-color:var(--el-color-primary)}.el-badge__content--success{background-color:var(--el-color-success)}.el-badge__content--warning{background-color:var(--el-color-warning)}.el-badge__content--info{background-color:var(--el-color-info)}.el-badge__content--danger{background-color:var(--el-color-danger)}.el-breadcrumb{font-size:14px;line-height:1}.el-breadcrumb:after,.el-breadcrumb:before{display:table;content:\"\"}.el-breadcrumb:after{clear:both}.el-breadcrumb__separator{margin:0 9px;font-weight:700;color:var(--el-text-color-placeholder)}.el-breadcrumb__separator.el-icon{margin:0 6px;font-weight:400}.el-breadcrumb__separator.el-icon svg{vertical-align:middle}.el-breadcrumb__item{float:left;display:flex;align-items:center}.el-breadcrumb__inner{color:var(--el-text-color-regular)}.el-breadcrumb__inner a,.el-breadcrumb__inner.is-link{font-weight:700;text-decoration:none;transition:var(--el-transition-color);color:var(--el-text-color-primary)}.el-breadcrumb__inner a:hover,.el-breadcrumb__inner.is-link:hover{color:var(--el-color-primary);cursor:pointer}.el-breadcrumb__item:last-child .el-breadcrumb__inner,.el-breadcrumb__item:last-child .el-breadcrumb__inner a,.el-breadcrumb__item:last-child .el-breadcrumb__inner a:hover,.el-breadcrumb__item:last-child .el-breadcrumb__inner:hover{font-weight:400;color:var(--el-text-color-regular);cursor:text}.el-breadcrumb__item:last-child .el-breadcrumb__separator{display:none}.el-button-group{display:inline-block;vertical-align:middle}.el-button-group:after,.el-button-group:before{display:table;content:\"\"}.el-button-group:after{clear:both}.el-button-group>.el-button{float:left;position:relative}.el-button-group>.el-button+.el-button{margin-left:0}.el-button-group>.el-button:first-child{border-top-right-radius:0;border-bottom-right-radius:0}.el-button-group>.el-button:last-child{border-top-left-radius:0;border-bottom-left-radius:0}.el-button-group>.el-button:first-child:last-child{border-top-right-radius:var(--el-border-radius-base);border-bottom-right-radius:var(--el-border-radius-base);border-top-left-radius:var(--el-border-radius-base);border-bottom-left-radius:var(--el-border-radius-base)}.el-button-group>.el-button:first-child:last-child.is-round{border-radius:var(--el-border-radius-round)}.el-button-group>.el-button:first-child:last-child.is-circle{border-radius:50%}.el-button-group>.el-button:not(:first-child):not(:last-child){border-radius:0}.el-button-group>.el-button:not(:last-child){margin-right:-1px}.el-button-group>.el-button:active,.el-button-group>.el-button:focus,.el-button-group>.el-button:hover{z-index:1}.el-button-group>.el-button.is-active{z-index:1}.el-button-group>.el-dropdown>.el-button{border-top-left-radius:0;border-bottom-left-radius:0;border-left-color:var(--el-button-divide-border-color)}.el-button-group .el-button--primary:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--primary:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group .el-button--primary:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--success:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--success:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group .el-button--success:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--warning:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--warning:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group .el-button--warning:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--danger:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--danger:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group .el-button--danger:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--info:first-child{border-right-color:var(--el-button-divide-border-color)}.el-button-group .el-button--info:last-child{border-left-color:var(--el-button-divide-border-color)}.el-button-group .el-button--info:not(:first-child):not(:last-child){border-left-color:var(--el-button-divide-border-color);border-right-color:var(--el-button-divide-border-color)}.el-button{--el-button-font-weight:var(--el-font-weight-primary);--el-button-border-color:var(--el-border-color);--el-button-bg-color:var(--el-fill-color-blank);--el-button-text-color:var(--el-text-color-regular);--el-button-disabled-text-color:var(--el-disabled-text-color);--el-button-disabled-bg-color:var(--el-fill-color-blank);--el-button-disabled-border-color:var(--el-border-color-light);--el-button-divide-border-color:rgba(255, 255, 255, .5);--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-color-primary-light-9);--el-button-hover-border-color:var(--el-color-primary-light-7);--el-button-active-text-color:var(--el-button-hover-text-color);--el-button-active-border-color:var(--el-color-primary);--el-button-active-bg-color:var(--el-button-hover-bg-color);--el-button-outline-color:var(--el-color-primary-light-5);--el-button-hover-link-text-color:var(--el-color-info);--el-button-active-color:var(--el-text-color-primary)}.el-button{display:inline-flex;justify-content:center;align-items:center;line-height:1;height:32px;white-space:nowrap;cursor:pointer;color:var(--el-button-text-color);text-align:center;box-sizing:border-box;outline:0;transition:.1s;font-weight:var(--el-button-font-weight);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;vertical-align:middle;-webkit-appearance:none;background-color:var(--el-button-bg-color);border:var(--el-border);border-color:var(--el-button-border-color);padding:8px 15px;font-size:var(--el-font-size-base);border-radius:var(--el-border-radius-base)}.el-button:focus,.el-button:hover{color:var(--el-button-hover-text-color);border-color:var(--el-button-hover-border-color);background-color:var(--el-button-hover-bg-color);outline:0}.el-button:active{color:var(--el-button-active-text-color);border-color:var(--el-button-active-border-color);background-color:var(--el-button-active-bg-color);outline:0}.el-button:focus-visible{outline:2px solid var(--el-button-outline-color);outline-offset:1px}.el-button>span{display:inline-flex;align-items:center}.el-button+.el-button{margin-left:12px}.el-button.is-round{padding:8px 15px}.el-button::-moz-focus-inner{border:0}.el-button [class*=el-icon]+span{margin-left:6px}.el-button [class*=el-icon] svg{vertical-align:bottom}.el-button.is-plain{--el-button-hover-text-color:var(--el-color-primary);--el-button-hover-bg-color:var(--el-fill-color-blank);--el-button-hover-border-color:var(--el-color-primary)}.el-button.is-active{color:var(--el-button-active-text-color);border-color:var(--el-button-active-border-color);background-color:var(--el-button-active-bg-color);outline:0}.el-button.is-disabled,.el-button.is-disabled:focus,.el-button.is-disabled:hover{color:var(--el-button-disabled-text-color);cursor:not-allowed;background-image:none;background-color:var(--el-button-disabled-bg-color);border-color:var(--el-button-disabled-border-color)}.el-button.is-loading{position:relative;pointer-events:none}.el-button.is-loading:before{z-index:1;pointer-events:none;content:\"\";position:absolute;inset:-1px;border-radius:inherit;background-color:var(--el-mask-color-extra-light)}.el-button.is-round{border-radius:var(--el-border-radius-round)}.el-button.is-circle{border-radius:50%;padding:8px}.el-button.is-text{color:var(--el-button-text-color);border:0 solid transparent;background-color:transparent}.el-button.is-text.is-disabled{color:var(--el-button-disabled-text-color);background-color:transparent!important}.el-button.is-text:not(.is-disabled):focus,.el-button.is-text:not(.is-disabled):hover{background-color:var(--el-fill-color-light)}.el-button.is-text:not(.is-disabled):focus-visible{outline:2px solid var(--el-button-outline-color);outline-offset:1px}.el-button.is-text:not(.is-disabled):active{background-color:var(--el-fill-color)}.el-button.is-text:not(.is-disabled).is-has-bg{background-color:var(--el-fill-color-light)}.el-button.is-text:not(.is-disabled).is-has-bg:focus,.el-button.is-text:not(.is-disabled).is-has-bg:hover{background-color:var(--el-fill-color)}.el-button.is-text:not(.is-disabled).is-has-bg:active{background-color:var(--el-fill-color-dark)}.el-button__text--expand{letter-spacing:.3em;margin-right:-.3em}.el-button.is-link{border-color:transparent;color:var(--el-button-text-color);background:0 0;padding:2px;height:auto}.el-button.is-link:focus,.el-button.is-link:hover{color:var(--el-button-hover-link-text-color)}.el-button.is-link.is-disabled{color:var(--el-button-disabled-text-color);background-color:transparent!important;border-color:transparent!important}.el-button.is-link:not(.is-disabled):focus,.el-button.is-link:not(.is-disabled):hover{border-color:transparent;background-color:transparent}.el-button.is-link:not(.is-disabled):active{color:var(--el-button-active-color);border-color:transparent;background-color:transparent}.el-button--text{border-color:transparent;background:0 0;color:var(--el-color-primary);padding-left:0;padding-right:0}.el-button--text.is-disabled{color:var(--el-button-disabled-text-color);background-color:transparent!important;border-color:transparent!important}.el-button--text:not(.is-disabled):focus,.el-button--text:not(.is-disabled):hover{color:var(--el-color-primary-light-3);border-color:transparent;background-color:transparent}.el-button--text:not(.is-disabled):active{color:var(--el-color-primary-dark-2);border-color:transparent;background-color:transparent}.el-button__link--expand{letter-spacing:.3em;margin-right:-.3em}.el-button--primary{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-primary);--el-button-border-color:var(--el-color-primary);--el-button-outline-color:var(--el-color-primary-light-5);--el-button-active-color:var(--el-color-primary-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-primary-light-5);--el-button-hover-bg-color:var(--el-color-primary-light-3);--el-button-hover-border-color:var(--el-color-primary-light-3);--el-button-active-bg-color:var(--el-color-primary-dark-2);--el-button-active-border-color:var(--el-color-primary-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-primary-light-5);--el-button-disabled-border-color:var(--el-color-primary-light-5)}.el-button--primary.is-link,.el-button--primary.is-plain,.el-button--primary.is-text{--el-button-text-color:var(--el-color-primary);--el-button-bg-color:var(--el-color-primary-light-9);--el-button-border-color:var(--el-color-primary-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-primary);--el-button-hover-border-color:var(--el-color-primary);--el-button-active-text-color:var(--el-color-white)}.el-button--primary.is-link.is-disabled,.el-button--primary.is-link.is-disabled:active,.el-button--primary.is-link.is-disabled:focus,.el-button--primary.is-link.is-disabled:hover,.el-button--primary.is-plain.is-disabled,.el-button--primary.is-plain.is-disabled:active,.el-button--primary.is-plain.is-disabled:focus,.el-button--primary.is-plain.is-disabled:hover,.el-button--primary.is-text.is-disabled,.el-button--primary.is-text.is-disabled:active,.el-button--primary.is-text.is-disabled:focus,.el-button--primary.is-text.is-disabled:hover{color:var(--el-color-primary-light-5);background-color:var(--el-color-primary-light-9);border-color:var(--el-color-primary-light-8)}.el-button--success{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-success);--el-button-border-color:var(--el-color-success);--el-button-outline-color:var(--el-color-success-light-5);--el-button-active-color:var(--el-color-success-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-success-light-5);--el-button-hover-bg-color:var(--el-color-success-light-3);--el-button-hover-border-color:var(--el-color-success-light-3);--el-button-active-bg-color:var(--el-color-success-dark-2);--el-button-active-border-color:var(--el-color-success-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-success-light-5);--el-button-disabled-border-color:var(--el-color-success-light-5)}.el-button--success.is-link,.el-button--success.is-plain,.el-button--success.is-text{--el-button-text-color:var(--el-color-success);--el-button-bg-color:var(--el-color-success-light-9);--el-button-border-color:var(--el-color-success-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-success);--el-button-hover-border-color:var(--el-color-success);--el-button-active-text-color:var(--el-color-white)}.el-button--success.is-link.is-disabled,.el-button--success.is-link.is-disabled:active,.el-button--success.is-link.is-disabled:focus,.el-button--success.is-link.is-disabled:hover,.el-button--success.is-plain.is-disabled,.el-button--success.is-plain.is-disabled:active,.el-button--success.is-plain.is-disabled:focus,.el-button--success.is-plain.is-disabled:hover,.el-button--success.is-text.is-disabled,.el-button--success.is-text.is-disabled:active,.el-button--success.is-text.is-disabled:focus,.el-button--success.is-text.is-disabled:hover{color:var(--el-color-success-light-5);background-color:var(--el-color-success-light-9);border-color:var(--el-color-success-light-8)}.el-button--warning{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-warning);--el-button-border-color:var(--el-color-warning);--el-button-outline-color:var(--el-color-warning-light-5);--el-button-active-color:var(--el-color-warning-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-warning-light-5);--el-button-hover-bg-color:var(--el-color-warning-light-3);--el-button-hover-border-color:var(--el-color-warning-light-3);--el-button-active-bg-color:var(--el-color-warning-dark-2);--el-button-active-border-color:var(--el-color-warning-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-warning-light-5);--el-button-disabled-border-color:var(--el-color-warning-light-5)}.el-button--warning.is-link,.el-button--warning.is-plain,.el-button--warning.is-text{--el-button-text-color:var(--el-color-warning);--el-button-bg-color:var(--el-color-warning-light-9);--el-button-border-color:var(--el-color-warning-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-warning);--el-button-hover-border-color:var(--el-color-warning);--el-button-active-text-color:var(--el-color-white)}.el-button--warning.is-link.is-disabled,.el-button--warning.is-link.is-disabled:active,.el-button--warning.is-link.is-disabled:focus,.el-button--warning.is-link.is-disabled:hover,.el-button--warning.is-plain.is-disabled,.el-button--warning.is-plain.is-disabled:active,.el-button--warning.is-plain.is-disabled:focus,.el-button--warning.is-plain.is-disabled:hover,.el-button--warning.is-text.is-disabled,.el-button--warning.is-text.is-disabled:active,.el-button--warning.is-text.is-disabled:focus,.el-button--warning.is-text.is-disabled:hover{color:var(--el-color-warning-light-5);background-color:var(--el-color-warning-light-9);border-color:var(--el-color-warning-light-8)}.el-button--danger{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-danger);--el-button-border-color:var(--el-color-danger);--el-button-outline-color:var(--el-color-danger-light-5);--el-button-active-color:var(--el-color-danger-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-danger-light-5);--el-button-hover-bg-color:var(--el-color-danger-light-3);--el-button-hover-border-color:var(--el-color-danger-light-3);--el-button-active-bg-color:var(--el-color-danger-dark-2);--el-button-active-border-color:var(--el-color-danger-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-danger-light-5);--el-button-disabled-border-color:var(--el-color-danger-light-5)}.el-button--danger.is-link,.el-button--danger.is-plain,.el-button--danger.is-text{--el-button-text-color:var(--el-color-danger);--el-button-bg-color:var(--el-color-danger-light-9);--el-button-border-color:var(--el-color-danger-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-danger);--el-button-hover-border-color:var(--el-color-danger);--el-button-active-text-color:var(--el-color-white)}.el-button--danger.is-link.is-disabled,.el-button--danger.is-link.is-disabled:active,.el-button--danger.is-link.is-disabled:focus,.el-button--danger.is-link.is-disabled:hover,.el-button--danger.is-plain.is-disabled,.el-button--danger.is-plain.is-disabled:active,.el-button--danger.is-plain.is-disabled:focus,.el-button--danger.is-plain.is-disabled:hover,.el-button--danger.is-text.is-disabled,.el-button--danger.is-text.is-disabled:active,.el-button--danger.is-text.is-disabled:focus,.el-button--danger.is-text.is-disabled:hover{color:var(--el-color-danger-light-5);background-color:var(--el-color-danger-light-9);border-color:var(--el-color-danger-light-8)}.el-button--info{--el-button-text-color:var(--el-color-white);--el-button-bg-color:var(--el-color-info);--el-button-border-color:var(--el-color-info);--el-button-outline-color:var(--el-color-info-light-5);--el-button-active-color:var(--el-color-info-dark-2);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-link-text-color:var(--el-color-info-light-5);--el-button-hover-bg-color:var(--el-color-info-light-3);--el-button-hover-border-color:var(--el-color-info-light-3);--el-button-active-bg-color:var(--el-color-info-dark-2);--el-button-active-border-color:var(--el-color-info-dark-2);--el-button-disabled-text-color:var(--el-color-white);--el-button-disabled-bg-color:var(--el-color-info-light-5);--el-button-disabled-border-color:var(--el-color-info-light-5)}.el-button--info.is-link,.el-button--info.is-plain,.el-button--info.is-text{--el-button-text-color:var(--el-color-info);--el-button-bg-color:var(--el-color-info-light-9);--el-button-border-color:var(--el-color-info-light-5);--el-button-hover-text-color:var(--el-color-white);--el-button-hover-bg-color:var(--el-color-info);--el-button-hover-border-color:var(--el-color-info);--el-button-active-text-color:var(--el-color-white)}.el-button--info.is-link.is-disabled,.el-button--info.is-link.is-disabled:active,.el-button--info.is-link.is-disabled:focus,.el-button--info.is-link.is-disabled:hover,.el-button--info.is-plain.is-disabled,.el-button--info.is-plain.is-disabled:active,.el-button--info.is-plain.is-disabled:focus,.el-button--info.is-plain.is-disabled:hover,.el-button--info.is-text.is-disabled,.el-button--info.is-text.is-disabled:active,.el-button--info.is-text.is-disabled:focus,.el-button--info.is-text.is-disabled:hover{color:var(--el-color-info-light-5);background-color:var(--el-color-info-light-9);border-color:var(--el-color-info-light-8)}.el-button--large{--el-button-size:40px;height:var(--el-button-size);padding:12px 19px;font-size:var(--el-font-size-base);border-radius:var(--el-border-radius-base)}.el-button--large [class*=el-icon]+span{margin-left:8px}.el-button--large.is-round{padding:12px 19px}.el-button--large.is-circle{width:var(--el-button-size);padding:12px}.el-button--small{--el-button-size:24px;height:var(--el-button-size);padding:5px 11px;font-size:12px;border-radius:calc(var(--el-border-radius-base) - 1px)}.el-button--small [class*=el-icon]+span{margin-left:4px}.el-button--small.is-round{padding:5px 11px}.el-button--small.is-circle{width:var(--el-button-size);padding:5px}.el-calendar{--el-calendar-border:var(--el-table-border, 1px solid var(--el-border-color-lighter));--el-calendar-header-border-bottom:var(--el-calendar-border);--el-calendar-selected-bg-color:var(--el-color-primary-light-9);--el-calendar-cell-width:85px;background-color:var(--el-fill-color-blank)}.el-calendar__header{display:flex;justify-content:space-between;padding:12px 20px;border-bottom:var(--el-calendar-header-border-bottom)}.el-calendar__title{color:var(--el-text-color);align-self:center}.el-calendar__body{padding:12px 20px 35px}.el-calendar-table{table-layout:fixed;width:100%}.el-calendar-table thead th{padding:12px 0;color:var(--el-text-color-regular);font-weight:400}.el-calendar-table:not(.is-range) td.next,.el-calendar-table:not(.is-range) td.prev{color:var(--el-text-color-placeholder)}.el-calendar-table td{border-bottom:var(--el-calendar-border);border-right:var(--el-calendar-border);vertical-align:top;transition:background-color var(--el-transition-duration-fast) ease}.el-calendar-table td.is-selected{background-color:var(--el-calendar-selected-bg-color)}.el-calendar-table td.is-today{color:var(--el-color-primary)}.el-calendar-table tr:first-child td{border-top:var(--el-calendar-border)}.el-calendar-table tr td:first-child{border-left:var(--el-calendar-border)}.el-calendar-table tr.el-calendar-table__row--hide-border td{border-top:none}.el-calendar-table .el-calendar-day{box-sizing:border-box;padding:8px;height:var(--el-calendar-cell-width)}.el-calendar-table .el-calendar-day:hover{cursor:pointer;background-color:var(--el-calendar-selected-bg-color)}.el-card{--el-card-border-color:var(--el-border-color-light);--el-card-border-radius:4px;--el-card-padding:20px;--el-card-bg-color:var(--el-fill-color-blank)}.el-card{border-radius:var(--el-card-border-radius);border:1px solid var(--el-card-border-color);background-color:var(--el-card-bg-color);overflow:hidden;color:var(--el-text-color-primary);transition:var(--el-transition-duration)}.el-card.is-always-shadow{box-shadow:var(--el-box-shadow-light)}.el-card.is-hover-shadow:focus,.el-card.is-hover-shadow:hover{box-shadow:var(--el-box-shadow-light)}.el-card__header{padding:calc(var(--el-card-padding) - 2px) var(--el-card-padding);border-bottom:1px solid var(--el-card-border-color);box-sizing:border-box}.el-card__body{padding:var(--el-card-padding)}.el-carousel__item{position:absolute;top:0;left:0;width:100%;height:100%;display:inline-block;overflow:hidden;z-index:calc(var(--el-index-normal) - 1)}.el-carousel__item.is-active{z-index:calc(var(--el-index-normal) - 1)}.el-carousel__item.is-animating{transition:transform .4s ease-in-out}.el-carousel__item--card{width:50%;transition:transform .4s ease-in-out}.el-carousel__item--card.is-in-stage{cursor:pointer;z-index:var(--el-index-normal)}.el-carousel__item--card.is-in-stage.is-hover .el-carousel__mask,.el-carousel__item--card.is-in-stage:hover .el-carousel__mask{opacity:.12}.el-carousel__item--card.is-active{z-index:calc(var(--el-index-normal) + 1)}.el-carousel__mask{position:absolute;width:100%;height:100%;top:0;left:0;background-color:var(--el-color-white);opacity:.24;transition:var(--el-transition-duration-fast)}.el-carousel{--el-carousel-arrow-font-size:12px;--el-carousel-arrow-size:36px;--el-carousel-arrow-background:rgba(31, 45, 61, .11);--el-carousel-arrow-hover-background:rgba(31, 45, 61, .23);--el-carousel-indicator-width:30px;--el-carousel-indicator-height:2px;--el-carousel-indicator-padding-horizontal:4px;--el-carousel-indicator-padding-vertical:12px;--el-carousel-indicator-out-color:var(--el-border-color-hover);position:relative}.el-carousel--horizontal{overflow-x:hidden}.el-carousel--vertical{overflow-y:hidden}.el-carousel__container{position:relative;height:300px}.el-carousel__arrow{border:none;outline:0;padding:0;margin:0;height:var(--el-carousel-arrow-size);width:var(--el-carousel-arrow-size);cursor:pointer;transition:var(--el-transition-duration);border-radius:50%;background-color:var(--el-carousel-arrow-background);color:#fff;position:absolute;top:50%;z-index:10;transform:translateY(-50%);text-align:center;font-size:var(--el-carousel-arrow-font-size);display:inline-flex;justify-content:center;align-items:center}.el-carousel__arrow--left{left:16px}.el-carousel__arrow--right{right:16px}.el-carousel__arrow:hover{background-color:var(--el-carousel-arrow-hover-background)}.el-carousel__arrow i{cursor:pointer}.el-carousel__indicators{position:absolute;list-style:none;margin:0;padding:0;z-index:calc(var(--el-index-normal) + 1)}.el-carousel__indicators--horizontal{bottom:0;left:50%;transform:translate(-50%)}.el-carousel__indicators--vertical{right:0;top:50%;transform:translateY(-50%)}.el-carousel__indicators--outside{bottom:calc(var(--el-carousel-indicator-height) + var(--el-carousel-indicator-padding-vertical) * 2);text-align:center;position:static;transform:none}.el-carousel__indicators--outside .el-carousel__indicator:hover button{opacity:.64}.el-carousel__indicators--outside button{background-color:var(--el-carousel-indicator-out-color);opacity:.24}.el-carousel__indicators--labels{left:0;right:0;transform:none;text-align:center}.el-carousel__indicators--labels .el-carousel__button{height:auto;width:auto;padding:2px 18px;font-size:12px}.el-carousel__indicators--labels .el-carousel__indicator{padding:6px 4px}.el-carousel__indicator{background-color:transparent;cursor:pointer}.el-carousel__indicator:hover button{opacity:.72}.el-carousel__indicator--horizontal{display:inline-block;padding:var(--el-carousel-indicator-padding-vertical) var(--el-carousel-indicator-padding-horizontal)}.el-carousel__indicator--vertical{padding:var(--el-carousel-indicator-padding-horizontal) var(--el-carousel-indicator-padding-vertical)}.el-carousel__indicator--vertical .el-carousel__button{width:var(--el-carousel-indicator-height);height:calc(var(--el-carousel-indicator-width)/ 2)}.el-carousel__indicator.is-active button{opacity:1}.el-carousel__button{display:block;opacity:.48;width:var(--el-carousel-indicator-width);height:var(--el-carousel-indicator-height);background-color:#fff;border:none;outline:0;padding:0;margin:0;cursor:pointer;transition:var(--el-transition-duration)}.carousel-arrow-left-enter-from,.carousel-arrow-left-leave-active{transform:translateY(-50%) translate(-10px);opacity:0}.carousel-arrow-right-enter-from,.carousel-arrow-right-leave-active{transform:translateY(-50%) translate(10px);opacity:0}.el-cascader-panel{--el-cascader-menu-text-color:var(--el-text-color-regular);--el-cascader-menu-selected-text-color:var(--el-color-primary);--el-cascader-menu-fill:var(--el-bg-color-overlay);--el-cascader-menu-font-size:var(--el-font-size-base);--el-cascader-menu-radius:var(--el-border-radius-base);--el-cascader-menu-border:solid 1px var(--el-border-color-light);--el-cascader-menu-shadow:var(--el-box-shadow-light);--el-cascader-node-background-hover:var(--el-fill-color-light);--el-cascader-node-color-disabled:var(--el-text-color-placeholder);--el-cascader-color-empty:var(--el-text-color-placeholder);--el-cascader-tag-background:var(--el-fill-color)}.el-cascader-panel{display:flex;border-radius:var(--el-cascader-menu-radius);font-size:var(--el-cascader-menu-font-size)}.el-cascader-panel.is-bordered{border:var(--el-cascader-menu-border);border-radius:var(--el-cascader-menu-radius)}.el-cascader-menu{min-width:180px;box-sizing:border-box;color:var(--el-cascader-menu-text-color);border-right:var(--el-cascader-menu-border)}.el-cascader-menu:last-child{border-right:none}.el-cascader-menu:last-child .el-cascader-node{padding-right:20px}.el-cascader-menu__wrap.el-scrollbar__wrap{height:204px}.el-cascader-menu__list{position:relative;min-height:100%;margin:0;padding:6px 0;list-style:none;box-sizing:border-box}.el-cascader-menu__hover-zone{position:absolute;top:0;left:0;width:100%;height:100%;pointer-events:none}.el-cascader-menu__empty-text{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);display:flex;align-items:center;color:var(--el-cascader-color-empty)}.el-cascader-menu__empty-text .is-loading{margin-right:2px}.el-cascader-node{position:relative;display:flex;align-items:center;padding:0 30px 0 20px;height:34px;line-height:34px;outline:0}.el-cascader-node.is-selectable.in-active-path{color:var(--el-cascader-menu-text-color)}.el-cascader-node.in-active-path,.el-cascader-node.is-active,.el-cascader-node.is-selectable.in-checked-path{color:var(--el-cascader-menu-selected-text-color);font-weight:700}.el-cascader-node:not(.is-disabled){cursor:pointer}.el-cascader-node:not(.is-disabled):focus,.el-cascader-node:not(.is-disabled):hover{background:var(--el-cascader-node-background-hover)}.el-cascader-node.is-disabled{color:var(--el-cascader-node-color-disabled);cursor:not-allowed}.el-cascader-node__prefix{position:absolute;left:10px}.el-cascader-node__postfix{position:absolute;right:10px}.el-cascader-node__label{flex:1;text-align:left;padding:0 8px;white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.el-cascader-node>.el-checkbox{margin-right:0}.el-cascader-node>.el-radio{margin-right:0}.el-cascader-node>.el-radio .el-radio__label{padding-left:0}.el-cascader{--el-cascader-menu-text-color:var(--el-text-color-regular);--el-cascader-menu-selected-text-color:var(--el-color-primary);--el-cascader-menu-fill:var(--el-bg-color-overlay);--el-cascader-menu-font-size:var(--el-font-size-base);--el-cascader-menu-radius:var(--el-border-radius-base);--el-cascader-menu-border:solid 1px var(--el-border-color-light);--el-cascader-menu-shadow:var(--el-box-shadow-light);--el-cascader-node-background-hover:var(--el-fill-color-light);--el-cascader-node-color-disabled:var(--el-text-color-placeholder);--el-cascader-color-empty:var(--el-text-color-placeholder);--el-cascader-tag-background:var(--el-fill-color);display:inline-block;position:relative;font-size:var(--el-font-size-base);line-height:32px;outline:0}.el-cascader:not(.is-disabled):hover .el-input__wrapper{cursor:pointer;box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-cascader .el-input{cursor:pointer}.el-cascader .el-input .el-input__inner{text-overflow:ellipsis;cursor:pointer}.el-cascader .el-input .el-input__inner::-moz-selection{outline:0}.el-cascader .el-input .el-input__inner::selection{outline:0}.el-cascader .el-input .el-input__suffix-inner .el-icon{height:calc(100% - 2px)}.el-cascader .el-input .el-input__suffix-inner .el-icon svg{vertical-align:middle}.el-cascader .el-input .icon-arrow-down{transition:transform var(--el-transition-duration);font-size:14px}.el-cascader .el-input .icon-arrow-down.is-reverse{transform:rotate(180deg)}.el-cascader .el-input .icon-circle-close:hover{color:var(--el-input-clear-hover-color,var(--el-text-color-secondary))}.el-cascader .el-input.is-focus .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color,var(--el-color-primary)) inset}.el-cascader--large{font-size:14px;line-height:40px}.el-cascader--small{font-size:12px;line-height:24px}.el-cascader.is-disabled .el-cascader__label{z-index:calc(var(--el-index-normal) + 1);color:var(--el-disabled-text-color)}.el-cascader__dropdown{--el-cascader-menu-text-color:var(--el-text-color-regular);--el-cascader-menu-selected-text-color:var(--el-color-primary);--el-cascader-menu-fill:var(--el-bg-color-overlay);--el-cascader-menu-font-size:var(--el-font-size-base);--el-cascader-menu-radius:var(--el-border-radius-base);--el-cascader-menu-border:solid 1px var(--el-border-color-light);--el-cascader-menu-shadow:var(--el-box-shadow-light);--el-cascader-node-background-hover:var(--el-fill-color-light);--el-cascader-node-color-disabled:var(--el-text-color-placeholder);--el-cascader-color-empty:var(--el-text-color-placeholder);--el-cascader-tag-background:var(--el-fill-color)}.el-cascader__dropdown{font-size:var(--el-cascader-menu-font-size);border-radius:var(--el-cascader-menu-radius)}.el-cascader__dropdown.el-popper{background:var(--el-cascader-menu-fill);border:var(--el-cascader-menu-border);box-shadow:var(--el-cascader-menu-shadow)}.el-cascader__dropdown.el-popper .el-popper__arrow:before{border:var(--el-cascader-menu-border)}.el-cascader__dropdown.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:transparent;border-left-color:transparent}.el-cascader__dropdown.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-cascader__dropdown.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-left-color:transparent;border-bottom-color:transparent}.el-cascader__dropdown.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-cascader__dropdown.el-popper{box-shadow:var(--el-cascader-menu-shadow)}.el-cascader__tags{position:absolute;left:0;right:30px;top:50%;transform:translateY(-50%);display:flex;flex-wrap:wrap;line-height:normal;text-align:left;box-sizing:border-box}.el-cascader__tags .el-tag{display:inline-flex;align-items:center;max-width:100%;margin:2px 0 2px 6px;text-overflow:ellipsis;background:var(--el-cascader-tag-background)}.el-cascader__tags .el-tag:not(.is-hit){border-color:transparent}.el-cascader__tags .el-tag>span{flex:1;overflow:hidden;text-overflow:ellipsis}.el-cascader__tags .el-tag .el-icon-close{flex:none;background-color:var(--el-text-color-placeholder);color:var(--el-color-white)}.el-cascader__tags .el-tag .el-icon-close:hover{background-color:var(--el-text-color-secondary)}.el-cascader__collapse-tags{white-space:normal;z-index:var(--el-index-normal);display:flex;align-items:center;flex-wrap:wrap}.el-cascader__collapse-tag{line-height:inherit;height:inherit;display:flex}.el-cascader__suggestion-panel{border-radius:var(--el-cascader-menu-radius)}.el-cascader__suggestion-list{max-height:204px;margin:0;padding:6px 0;font-size:var(--el-font-size-base);color:var(--el-cascader-menu-text-color);text-align:center}.el-cascader__suggestion-item{display:flex;justify-content:space-between;align-items:center;height:34px;padding:0 15px;text-align:left;outline:0;cursor:pointer}.el-cascader__suggestion-item:focus,.el-cascader__suggestion-item:hover{background:var(--el-cascader-node-background-hover)}.el-cascader__suggestion-item.is-checked{color:var(--el-cascader-menu-selected-text-color);font-weight:700}.el-cascader__suggestion-item>span{margin-right:10px}.el-cascader__empty-text{margin:10px 0;color:var(--el-cascader-color-empty)}.el-cascader__search-input{flex:1;height:24px;min-width:60px;margin:2px 0 2px 11px;padding:0;color:var(--el-cascader-menu-text-color);border:none;outline:0;box-sizing:border-box;background:0 0}.el-cascader__search-input::-moz-placeholder{color:transparent}.el-cascader__search-input:-ms-input-placeholder{color:transparent}.el-cascader__search-input::placeholder{color:transparent}.el-check-tag{background-color:var(--el-color-info-light-9);border-radius:var(--el-border-radius-base);color:var(--el-color-info);cursor:pointer;display:inline-block;font-size:var(--el-font-size-base);line-height:var(--el-font-size-base);padding:7px 15px;transition:var(--el-transition-all);font-weight:700}.el-check-tag:hover{background-color:var(--el-color-info-light-7)}.el-check-tag.is-checked{background-color:var(--el-color-primary-light-8);color:var(--el-color-primary)}.el-check-tag.is-checked:hover{background-color:var(--el-color-primary-light-7)}.el-checkbox-button{--el-checkbox-button-checked-bg-color:var(--el-color-primary);--el-checkbox-button-checked-text-color:var(--el-color-white);--el-checkbox-button-checked-border-color:var(--el-color-primary)}.el-checkbox-button{position:relative;display:inline-block}.el-checkbox-button__inner{display:inline-block;line-height:1;font-weight:var(--el-checkbox-font-weight);white-space:nowrap;vertical-align:middle;cursor:pointer;background:var(--el-button-bg-color,var(--el-fill-color-blank));border:var(--el-border);border-left:0;color:var(--el-button-text-color,var(--el-text-color-regular));-webkit-appearance:none;text-align:center;box-sizing:border-box;outline:0;margin:0;position:relative;transition:var(--el-transition-all);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:8px 15px;font-size:var(--el-font-size-base);border-radius:0}.el-checkbox-button__inner.is-round{padding:8px 15px}.el-checkbox-button__inner:hover{color:var(--el-color-primary)}.el-checkbox-button__inner [class*=el-icon-]{line-height:.9}.el-checkbox-button__inner [class*=el-icon-]+span{margin-left:5px}.el-checkbox-button__original{opacity:0;outline:0;position:absolute;margin:0;z-index:-1}.el-checkbox-button.is-checked .el-checkbox-button__inner{color:var(--el-checkbox-button-checked-text-color);background-color:var(--el-checkbox-button-checked-bg-color);border-color:var(--el-checkbox-button-checked-border-color);box-shadow:-1px 0 0 0 var(--el-color-primary-light-7)}.el-checkbox-button.is-checked:first-child .el-checkbox-button__inner{border-left-color:var(--el-checkbox-button-checked-border-color)}.el-checkbox-button.is-disabled .el-checkbox-button__inner{color:var(--el-disabled-text-color);cursor:not-allowed;background-image:none;background-color:var(--el-button-disabled-bg-color,var(--el-fill-color-blank));border-color:var(--el-button-disabled-border-color,var(--el-border-color-light));box-shadow:none}.el-checkbox-button.is-disabled:first-child .el-checkbox-button__inner{border-left-color:var(--el-button-disabled-border-color,var(--el-border-color-light))}.el-checkbox-button:first-child .el-checkbox-button__inner{border-left:var(--el-border);border-top-left-radius:var(--el-border-radius-base);border-bottom-left-radius:var(--el-border-radius-base);box-shadow:none!important}.el-checkbox-button.is-focus .el-checkbox-button__inner{border-color:var(--el-checkbox-button-checked-border-color)}.el-checkbox-button:last-child .el-checkbox-button__inner{border-top-right-radius:var(--el-border-radius-base);border-bottom-right-radius:var(--el-border-radius-base)}.el-checkbox-button--large .el-checkbox-button__inner{padding:12px 19px;font-size:var(--el-font-size-base);border-radius:0}.el-checkbox-button--large .el-checkbox-button__inner.is-round{padding:12px 19px}.el-checkbox-button--small .el-checkbox-button__inner{padding:5px 11px;font-size:12px;border-radius:0}.el-checkbox-button--small .el-checkbox-button__inner.is-round{padding:5px 11px}.el-checkbox-group{font-size:0;line-height:0}.el-checkbox{--el-checkbox-font-size:14px;--el-checkbox-font-weight:var(--el-font-weight-primary);--el-checkbox-text-color:var(--el-text-color-regular);--el-checkbox-input-height:14px;--el-checkbox-input-width:14px;--el-checkbox-border-radius:var(--el-border-radius-small);--el-checkbox-bg-color:var(--el-fill-color-blank);--el-checkbox-input-border:var(--el-border);--el-checkbox-disabled-border-color:var(--el-border-color);--el-checkbox-disabled-input-fill:var(--el-fill-color-light);--el-checkbox-disabled-icon-color:var(--el-text-color-placeholder);--el-checkbox-disabled-checked-input-fill:var(--el-border-color-extra-light);--el-checkbox-disabled-checked-input-border-color:var(--el-border-color);--el-checkbox-disabled-checked-icon-color:var(--el-text-color-placeholder);--el-checkbox-checked-text-color:var(--el-color-primary);--el-checkbox-checked-input-border-color:var(--el-color-primary);--el-checkbox-checked-bg-color:var(--el-color-primary);--el-checkbox-checked-icon-color:var(--el-color-white);--el-checkbox-input-border-color-hover:var(--el-color-primary)}.el-checkbox{color:var(--el-checkbox-text-color);font-weight:var(--el-checkbox-font-weight);font-size:var(--el-font-size-base);position:relative;cursor:pointer;display:inline-flex;align-items:center;white-space:nowrap;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin-right:30px;height:32px}.el-checkbox.is-bordered{padding:0 15px 0 9px;border-radius:var(--el-border-radius-base);border:var(--el-border);box-sizing:border-box}.el-checkbox.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-checkbox.is-bordered.is-disabled{border-color:var(--el-border-color-lighter);cursor:not-allowed}.el-checkbox.is-bordered.el-checkbox--large{padding:0 19px 0 11px;border-radius:var(--el-border-radius-base)}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__label{font-size:var(--el-font-size-base)}.el-checkbox.is-bordered.el-checkbox--large .el-checkbox__inner{height:14px;width:14px}.el-checkbox.is-bordered.el-checkbox--small{padding:0 11px 0 7px;border-radius:calc(var(--el-border-radius-base) - 1px)}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner{height:12px;width:12px}.el-checkbox.is-bordered.el-checkbox--small .el-checkbox__inner:after{height:6px;width:2px}.el-checkbox input:focus-visible+.el-checkbox__inner{outline:2px solid var(--el-checkbox-input-border-color-hover);outline-offset:1px;border-radius:var(--el-checkbox-border-radius)}.el-checkbox__input{white-space:nowrap;cursor:pointer;outline:0;display:inline-flex;position:relative}.el-checkbox__input.is-disabled .el-checkbox__inner{background-color:var(--el-checkbox-disabled-input-fill);border-color:var(--el-checkbox-disabled-border-color);cursor:not-allowed}.el-checkbox__input.is-disabled .el-checkbox__inner:after{cursor:not-allowed;border-color:var(--el-checkbox-disabled-icon-color)}.el-checkbox__input.is-disabled .el-checkbox__inner+.el-checkbox__label{cursor:not-allowed}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-checked .el-checkbox__inner:after{border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-disabled-checked-input-fill);border-color:var(--el-checkbox-disabled-checked-input-border-color)}.el-checkbox__input.is-disabled.is-indeterminate .el-checkbox__inner:before{background-color:var(--el-checkbox-disabled-checked-icon-color);border-color:var(--el-checkbox-disabled-checked-icon-color)}.el-checkbox__input.is-disabled+span.el-checkbox__label{color:var(--el-disabled-text-color);cursor:not-allowed}.el-checkbox__input.is-checked .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-checked .el-checkbox__inner:after{transform:rotate(45deg) scaleY(1)}.el-checkbox__input.is-checked+.el-checkbox__label{color:var(--el-checkbox-checked-text-color)}.el-checkbox__input.is-focus:not(.is-checked) .el-checkbox__original:not(:focus-visible){border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__input.is-indeterminate .el-checkbox__inner{background-color:var(--el-checkbox-checked-bg-color);border-color:var(--el-checkbox-checked-input-border-color)}.el-checkbox__input.is-indeterminate .el-checkbox__inner:before{content:\"\";position:absolute;display:block;background-color:var(--el-checkbox-checked-icon-color);height:2px;transform:scale(.5);left:0;right:0;top:5px}.el-checkbox__input.is-indeterminate .el-checkbox__inner:after{display:none}.el-checkbox__inner{display:inline-block;position:relative;border:var(--el-checkbox-input-border);border-radius:var(--el-checkbox-border-radius);box-sizing:border-box;width:var(--el-checkbox-input-width);height:var(--el-checkbox-input-height);background-color:var(--el-checkbox-bg-color);z-index:var(--el-index-normal);transition:border-color .25s cubic-bezier(.71,-.46,.29,1.46),background-color .25s cubic-bezier(.71,-.46,.29,1.46),outline .25s cubic-bezier(.71,-.46,.29,1.46)}.el-checkbox__inner:hover{border-color:var(--el-checkbox-input-border-color-hover)}.el-checkbox__inner:after{box-sizing:content-box;content:\"\";border:1px solid var(--el-checkbox-checked-icon-color);border-left:0;border-top:0;height:7px;left:4px;position:absolute;top:1px;transform:rotate(45deg) scaleY(0);width:3px;transition:transform .15s ease-in 50ms;transform-origin:center}.el-checkbox__original{opacity:0;outline:0;position:absolute;margin:0;width:0;height:0;z-index:-1}.el-checkbox__label{display:inline-block;padding-left:8px;line-height:1;font-size:var(--el-checkbox-font-size)}.el-checkbox.el-checkbox--large{height:40px}.el-checkbox.el-checkbox--large .el-checkbox__label{font-size:14px}.el-checkbox.el-checkbox--large .el-checkbox__inner{width:14px;height:14px}.el-checkbox.el-checkbox--small{height:24px}.el-checkbox.el-checkbox--small .el-checkbox__label{font-size:12px}.el-checkbox.el-checkbox--small .el-checkbox__inner{width:12px;height:12px}.el-checkbox.el-checkbox--small .el-checkbox__input.is-indeterminate .el-checkbox__inner:before{top:4px}.el-checkbox.el-checkbox--small .el-checkbox__inner:after{width:2px;height:6px}.el-checkbox:last-of-type{margin-right:0}[class*=el-col-]{box-sizing:border-box}[class*=el-col-].is-guttered{display:block;min-height:1px}.el-col-0,.el-col-0.is-guttered{display:none}.el-col-0{max-width:0%;flex:0 0 0%}.el-col-offset-0{margin-left:0}.el-col-pull-0{position:relative;right:0}.el-col-push-0{position:relative;left:0}.el-col-1{max-width:4.1666666667%;flex:0 0 4.1666666667%}.el-col-offset-1{margin-left:4.1666666667%}.el-col-pull-1{position:relative;right:4.1666666667%}.el-col-push-1{position:relative;left:4.1666666667%}.el-col-2{max-width:8.3333333333%;flex:0 0 8.3333333333%}.el-col-offset-2{margin-left:8.3333333333%}.el-col-pull-2{position:relative;right:8.3333333333%}.el-col-push-2{position:relative;left:8.3333333333%}.el-col-3{max-width:12.5%;flex:0 0 12.5%}.el-col-offset-3{margin-left:12.5%}.el-col-pull-3{position:relative;right:12.5%}.el-col-push-3{position:relative;left:12.5%}.el-col-4{max-width:16.6666666667%;flex:0 0 16.6666666667%}.el-col-offset-4{margin-left:16.6666666667%}.el-col-pull-4{position:relative;right:16.6666666667%}.el-col-push-4{position:relative;left:16.6666666667%}.el-col-5{max-width:20.8333333333%;flex:0 0 20.8333333333%}.el-col-offset-5{margin-left:20.8333333333%}.el-col-pull-5{position:relative;right:20.8333333333%}.el-col-push-5{position:relative;left:20.8333333333%}.el-col-6{max-width:25%;flex:0 0 25%}.el-col-offset-6{margin-left:25%}.el-col-pull-6{position:relative;right:25%}.el-col-push-6{position:relative;left:25%}.el-col-7{max-width:29.1666666667%;flex:0 0 29.1666666667%}.el-col-offset-7{margin-left:29.1666666667%}.el-col-pull-7{position:relative;right:29.1666666667%}.el-col-push-7{position:relative;left:29.1666666667%}.el-col-8{max-width:33.3333333333%;flex:0 0 33.3333333333%}.el-col-offset-8{margin-left:33.3333333333%}.el-col-pull-8{position:relative;right:33.3333333333%}.el-col-push-8{position:relative;left:33.3333333333%}.el-col-9{max-width:37.5%;flex:0 0 37.5%}.el-col-offset-9{margin-left:37.5%}.el-col-pull-9{position:relative;right:37.5%}.el-col-push-9{position:relative;left:37.5%}.el-col-10{max-width:41.6666666667%;flex:0 0 41.6666666667%}.el-col-offset-10{margin-left:41.6666666667%}.el-col-pull-10{position:relative;right:41.6666666667%}.el-col-push-10{position:relative;left:41.6666666667%}.el-col-11{max-width:45.8333333333%;flex:0 0 45.8333333333%}.el-col-offset-11{margin-left:45.8333333333%}.el-col-pull-11{position:relative;right:45.8333333333%}.el-col-push-11{position:relative;left:45.8333333333%}.el-col-12{max-width:50%;flex:0 0 50%}.el-col-offset-12{margin-left:50%}.el-col-pull-12{position:relative;right:50%}.el-col-push-12{position:relative;left:50%}.el-col-13{max-width:54.1666666667%;flex:0 0 54.1666666667%}.el-col-offset-13{margin-left:54.1666666667%}.el-col-pull-13{position:relative;right:54.1666666667%}.el-col-push-13{position:relative;left:54.1666666667%}.el-col-14{max-width:58.3333333333%;flex:0 0 58.3333333333%}.el-col-offset-14{margin-left:58.3333333333%}.el-col-pull-14{position:relative;right:58.3333333333%}.el-col-push-14{position:relative;left:58.3333333333%}.el-col-15{max-width:62.5%;flex:0 0 62.5%}.el-col-offset-15{margin-left:62.5%}.el-col-pull-15{position:relative;right:62.5%}.el-col-push-15{position:relative;left:62.5%}.el-col-16{max-width:66.6666666667%;flex:0 0 66.6666666667%}.el-col-offset-16{margin-left:66.6666666667%}.el-col-pull-16{position:relative;right:66.6666666667%}.el-col-push-16{position:relative;left:66.6666666667%}.el-col-17{max-width:70.8333333333%;flex:0 0 70.8333333333%}.el-col-offset-17{margin-left:70.8333333333%}.el-col-pull-17{position:relative;right:70.8333333333%}.el-col-push-17{position:relative;left:70.8333333333%}.el-col-18{max-width:75%;flex:0 0 75%}.el-col-offset-18{margin-left:75%}.el-col-pull-18{position:relative;right:75%}.el-col-push-18{position:relative;left:75%}.el-col-19{max-width:79.1666666667%;flex:0 0 79.1666666667%}.el-col-offset-19{margin-left:79.1666666667%}.el-col-pull-19{position:relative;right:79.1666666667%}.el-col-push-19{position:relative;left:79.1666666667%}.el-col-20{max-width:83.3333333333%;flex:0 0 83.3333333333%}.el-col-offset-20{margin-left:83.3333333333%}.el-col-pull-20{position:relative;right:83.3333333333%}.el-col-push-20{position:relative;left:83.3333333333%}.el-col-21{max-width:87.5%;flex:0 0 87.5%}.el-col-offset-21{margin-left:87.5%}.el-col-pull-21{position:relative;right:87.5%}.el-col-push-21{position:relative;left:87.5%}.el-col-22{max-width:91.6666666667%;flex:0 0 91.6666666667%}.el-col-offset-22{margin-left:91.6666666667%}.el-col-pull-22{position:relative;right:91.6666666667%}.el-col-push-22{position:relative;left:91.6666666667%}.el-col-23{max-width:95.8333333333%;flex:0 0 95.8333333333%}.el-col-offset-23{margin-left:95.8333333333%}.el-col-pull-23{position:relative;right:95.8333333333%}.el-col-push-23{position:relative;left:95.8333333333%}.el-col-24{max-width:100%;flex:0 0 100%}.el-col-offset-24{margin-left:100%}.el-col-pull-24{position:relative;right:100%}.el-col-push-24{position:relative;left:100%}@media only screen and (max-width:768px){.el-col-xs-0,.el-col-xs-0.is-guttered{display:none}.el-col-xs-0{max-width:0%;flex:0 0 0%}.el-col-xs-offset-0{margin-left:0}.el-col-xs-pull-0{position:relative;right:0}.el-col-xs-push-0{position:relative;left:0}.el-col-xs-1{display:block;max-width:4.1666666667%;flex:0 0 4.1666666667%}.el-col-xs-offset-1{margin-left:4.1666666667%}.el-col-xs-pull-1{position:relative;right:4.1666666667%}.el-col-xs-push-1{position:relative;left:4.1666666667%}.el-col-xs-2{display:block;max-width:8.3333333333%;flex:0 0 8.3333333333%}.el-col-xs-offset-2{margin-left:8.3333333333%}.el-col-xs-pull-2{position:relative;right:8.3333333333%}.el-col-xs-push-2{position:relative;left:8.3333333333%}.el-col-xs-3{display:block;max-width:12.5%;flex:0 0 12.5%}.el-col-xs-offset-3{margin-left:12.5%}.el-col-xs-pull-3{position:relative;right:12.5%}.el-col-xs-push-3{position:relative;left:12.5%}.el-col-xs-4{display:block;max-width:16.6666666667%;flex:0 0 16.6666666667%}.el-col-xs-offset-4{margin-left:16.6666666667%}.el-col-xs-pull-4{position:relative;right:16.6666666667%}.el-col-xs-push-4{position:relative;left:16.6666666667%}.el-col-xs-5{display:block;max-width:20.8333333333%;flex:0 0 20.8333333333%}.el-col-xs-offset-5{margin-left:20.8333333333%}.el-col-xs-pull-5{position:relative;right:20.8333333333%}.el-col-xs-push-5{position:relative;left:20.8333333333%}.el-col-xs-6{display:block;max-width:25%;flex:0 0 25%}.el-col-xs-offset-6{margin-left:25%}.el-col-xs-pull-6{position:relative;right:25%}.el-col-xs-push-6{position:relative;left:25%}.el-col-xs-7{display:block;max-width:29.1666666667%;flex:0 0 29.1666666667%}.el-col-xs-offset-7{margin-left:29.1666666667%}.el-col-xs-pull-7{position:relative;right:29.1666666667%}.el-col-xs-push-7{position:relative;left:29.1666666667%}.el-col-xs-8{display:block;max-width:33.3333333333%;flex:0 0 33.3333333333%}.el-col-xs-offset-8{margin-left:33.3333333333%}.el-col-xs-pull-8{position:relative;right:33.3333333333%}.el-col-xs-push-8{position:relative;left:33.3333333333%}.el-col-xs-9{display:block;max-width:37.5%;flex:0 0 37.5%}.el-col-xs-offset-9{margin-left:37.5%}.el-col-xs-pull-9{position:relative;right:37.5%}.el-col-xs-push-9{position:relative;left:37.5%}.el-col-xs-10{display:block;max-width:41.6666666667%;flex:0 0 41.6666666667%}.el-col-xs-offset-10{margin-left:41.6666666667%}.el-col-xs-pull-10{position:relative;right:41.6666666667%}.el-col-xs-push-10{position:relative;left:41.6666666667%}.el-col-xs-11{display:block;max-width:45.8333333333%;flex:0 0 45.8333333333%}.el-col-xs-offset-11{margin-left:45.8333333333%}.el-col-xs-pull-11{position:relative;right:45.8333333333%}.el-col-xs-push-11{position:relative;left:45.8333333333%}.el-col-xs-12{display:block;max-width:50%;flex:0 0 50%}.el-col-xs-offset-12{margin-left:50%}.el-col-xs-pull-12{position:relative;right:50%}.el-col-xs-push-12{position:relative;left:50%}.el-col-xs-13{display:block;max-width:54.1666666667%;flex:0 0 54.1666666667%}.el-col-xs-offset-13{margin-left:54.1666666667%}.el-col-xs-pull-13{position:relative;right:54.1666666667%}.el-col-xs-push-13{position:relative;left:54.1666666667%}.el-col-xs-14{display:block;max-width:58.3333333333%;flex:0 0 58.3333333333%}.el-col-xs-offset-14{margin-left:58.3333333333%}.el-col-xs-pull-14{position:relative;right:58.3333333333%}.el-col-xs-push-14{position:relative;left:58.3333333333%}.el-col-xs-15{display:block;max-width:62.5%;flex:0 0 62.5%}.el-col-xs-offset-15{margin-left:62.5%}.el-col-xs-pull-15{position:relative;right:62.5%}.el-col-xs-push-15{position:relative;left:62.5%}.el-col-xs-16{display:block;max-width:66.6666666667%;flex:0 0 66.6666666667%}.el-col-xs-offset-16{margin-left:66.6666666667%}.el-col-xs-pull-16{position:relative;right:66.6666666667%}.el-col-xs-push-16{position:relative;left:66.6666666667%}.el-col-xs-17{display:block;max-width:70.8333333333%;flex:0 0 70.8333333333%}.el-col-xs-offset-17{margin-left:70.8333333333%}.el-col-xs-pull-17{position:relative;right:70.8333333333%}.el-col-xs-push-17{position:relative;left:70.8333333333%}.el-col-xs-18{display:block;max-width:75%;flex:0 0 75%}.el-col-xs-offset-18{margin-left:75%}.el-col-xs-pull-18{position:relative;right:75%}.el-col-xs-push-18{position:relative;left:75%}.el-col-xs-19{display:block;max-width:79.1666666667%;flex:0 0 79.1666666667%}.el-col-xs-offset-19{margin-left:79.1666666667%}.el-col-xs-pull-19{position:relative;right:79.1666666667%}.el-col-xs-push-19{position:relative;left:79.1666666667%}.el-col-xs-20{display:block;max-width:83.3333333333%;flex:0 0 83.3333333333%}.el-col-xs-offset-20{margin-left:83.3333333333%}.el-col-xs-pull-20{position:relative;right:83.3333333333%}.el-col-xs-push-20{position:relative;left:83.3333333333%}.el-col-xs-21{display:block;max-width:87.5%;flex:0 0 87.5%}.el-col-xs-offset-21{margin-left:87.5%}.el-col-xs-pull-21{position:relative;right:87.5%}.el-col-xs-push-21{position:relative;left:87.5%}.el-col-xs-22{display:block;max-width:91.6666666667%;flex:0 0 91.6666666667%}.el-col-xs-offset-22{margin-left:91.6666666667%}.el-col-xs-pull-22{position:relative;right:91.6666666667%}.el-col-xs-push-22{position:relative;left:91.6666666667%}.el-col-xs-23{display:block;max-width:95.8333333333%;flex:0 0 95.8333333333%}.el-col-xs-offset-23{margin-left:95.8333333333%}.el-col-xs-pull-23{position:relative;right:95.8333333333%}.el-col-xs-push-23{position:relative;left:95.8333333333%}.el-col-xs-24{display:block;max-width:100%;flex:0 0 100%}.el-col-xs-offset-24{margin-left:100%}.el-col-xs-pull-24{position:relative;right:100%}.el-col-xs-push-24{position:relative;left:100%}}@media only screen and (min-width:768px){.el-col-sm-0,.el-col-sm-0.is-guttered{display:none}.el-col-sm-0{max-width:0%;flex:0 0 0%}.el-col-sm-offset-0{margin-left:0}.el-col-sm-pull-0{position:relative;right:0}.el-col-sm-push-0{position:relative;left:0}.el-col-sm-1{display:block;max-width:4.1666666667%;flex:0 0 4.1666666667%}.el-col-sm-offset-1{margin-left:4.1666666667%}.el-col-sm-pull-1{position:relative;right:4.1666666667%}.el-col-sm-push-1{position:relative;left:4.1666666667%}.el-col-sm-2{display:block;max-width:8.3333333333%;flex:0 0 8.3333333333%}.el-col-sm-offset-2{margin-left:8.3333333333%}.el-col-sm-pull-2{position:relative;right:8.3333333333%}.el-col-sm-push-2{position:relative;left:8.3333333333%}.el-col-sm-3{display:block;max-width:12.5%;flex:0 0 12.5%}.el-col-sm-offset-3{margin-left:12.5%}.el-col-sm-pull-3{position:relative;right:12.5%}.el-col-sm-push-3{position:relative;left:12.5%}.el-col-sm-4{display:block;max-width:16.6666666667%;flex:0 0 16.6666666667%}.el-col-sm-offset-4{margin-left:16.6666666667%}.el-col-sm-pull-4{position:relative;right:16.6666666667%}.el-col-sm-push-4{position:relative;left:16.6666666667%}.el-col-sm-5{display:block;max-width:20.8333333333%;flex:0 0 20.8333333333%}.el-col-sm-offset-5{margin-left:20.8333333333%}.el-col-sm-pull-5{position:relative;right:20.8333333333%}.el-col-sm-push-5{position:relative;left:20.8333333333%}.el-col-sm-6{display:block;max-width:25%;flex:0 0 25%}.el-col-sm-offset-6{margin-left:25%}.el-col-sm-pull-6{position:relative;right:25%}.el-col-sm-push-6{position:relative;left:25%}.el-col-sm-7{display:block;max-width:29.1666666667%;flex:0 0 29.1666666667%}.el-col-sm-offset-7{margin-left:29.1666666667%}.el-col-sm-pull-7{position:relative;right:29.1666666667%}.el-col-sm-push-7{position:relative;left:29.1666666667%}.el-col-sm-8{display:block;max-width:33.3333333333%;flex:0 0 33.3333333333%}.el-col-sm-offset-8{margin-left:33.3333333333%}.el-col-sm-pull-8{position:relative;right:33.3333333333%}.el-col-sm-push-8{position:relative;left:33.3333333333%}.el-col-sm-9{display:block;max-width:37.5%;flex:0 0 37.5%}.el-col-sm-offset-9{margin-left:37.5%}.el-col-sm-pull-9{position:relative;right:37.5%}.el-col-sm-push-9{position:relative;left:37.5%}.el-col-sm-10{display:block;max-width:41.6666666667%;flex:0 0 41.6666666667%}.el-col-sm-offset-10{margin-left:41.6666666667%}.el-col-sm-pull-10{position:relative;right:41.6666666667%}.el-col-sm-push-10{position:relative;left:41.6666666667%}.el-col-sm-11{display:block;max-width:45.8333333333%;flex:0 0 45.8333333333%}.el-col-sm-offset-11{margin-left:45.8333333333%}.el-col-sm-pull-11{position:relative;right:45.8333333333%}.el-col-sm-push-11{position:relative;left:45.8333333333%}.el-col-sm-12{display:block;max-width:50%;flex:0 0 50%}.el-col-sm-offset-12{margin-left:50%}.el-col-sm-pull-12{position:relative;right:50%}.el-col-sm-push-12{position:relative;left:50%}.el-col-sm-13{display:block;max-width:54.1666666667%;flex:0 0 54.1666666667%}.el-col-sm-offset-13{margin-left:54.1666666667%}.el-col-sm-pull-13{position:relative;right:54.1666666667%}.el-col-sm-push-13{position:relative;left:54.1666666667%}.el-col-sm-14{display:block;max-width:58.3333333333%;flex:0 0 58.3333333333%}.el-col-sm-offset-14{margin-left:58.3333333333%}.el-col-sm-pull-14{position:relative;right:58.3333333333%}.el-col-sm-push-14{position:relative;left:58.3333333333%}.el-col-sm-15{display:block;max-width:62.5%;flex:0 0 62.5%}.el-col-sm-offset-15{margin-left:62.5%}.el-col-sm-pull-15{position:relative;right:62.5%}.el-col-sm-push-15{position:relative;left:62.5%}.el-col-sm-16{display:block;max-width:66.6666666667%;flex:0 0 66.6666666667%}.el-col-sm-offset-16{margin-left:66.6666666667%}.el-col-sm-pull-16{position:relative;right:66.6666666667%}.el-col-sm-push-16{position:relative;left:66.6666666667%}.el-col-sm-17{display:block;max-width:70.8333333333%;flex:0 0 70.8333333333%}.el-col-sm-offset-17{margin-left:70.8333333333%}.el-col-sm-pull-17{position:relative;right:70.8333333333%}.el-col-sm-push-17{position:relative;left:70.8333333333%}.el-col-sm-18{display:block;max-width:75%;flex:0 0 75%}.el-col-sm-offset-18{margin-left:75%}.el-col-sm-pull-18{position:relative;right:75%}.el-col-sm-push-18{position:relative;left:75%}.el-col-sm-19{display:block;max-width:79.1666666667%;flex:0 0 79.1666666667%}.el-col-sm-offset-19{margin-left:79.1666666667%}.el-col-sm-pull-19{position:relative;right:79.1666666667%}.el-col-sm-push-19{position:relative;left:79.1666666667%}.el-col-sm-20{display:block;max-width:83.3333333333%;flex:0 0 83.3333333333%}.el-col-sm-offset-20{margin-left:83.3333333333%}.el-col-sm-pull-20{position:relative;right:83.3333333333%}.el-col-sm-push-20{position:relative;left:83.3333333333%}.el-col-sm-21{display:block;max-width:87.5%;flex:0 0 87.5%}.el-col-sm-offset-21{margin-left:87.5%}.el-col-sm-pull-21{position:relative;right:87.5%}.el-col-sm-push-21{position:relative;left:87.5%}.el-col-sm-22{display:block;max-width:91.6666666667%;flex:0 0 91.6666666667%}.el-col-sm-offset-22{margin-left:91.6666666667%}.el-col-sm-pull-22{position:relative;right:91.6666666667%}.el-col-sm-push-22{position:relative;left:91.6666666667%}.el-col-sm-23{display:block;max-width:95.8333333333%;flex:0 0 95.8333333333%}.el-col-sm-offset-23{margin-left:95.8333333333%}.el-col-sm-pull-23{position:relative;right:95.8333333333%}.el-col-sm-push-23{position:relative;left:95.8333333333%}.el-col-sm-24{display:block;max-width:100%;flex:0 0 100%}.el-col-sm-offset-24{margin-left:100%}.el-col-sm-pull-24{position:relative;right:100%}.el-col-sm-push-24{position:relative;left:100%}}@media only screen and (min-width:992px){.el-col-md-0,.el-col-md-0.is-guttered{display:none}.el-col-md-0{max-width:0%;flex:0 0 0%}.el-col-md-offset-0{margin-left:0}.el-col-md-pull-0{position:relative;right:0}.el-col-md-push-0{position:relative;left:0}.el-col-md-1{display:block;max-width:4.1666666667%;flex:0 0 4.1666666667%}.el-col-md-offset-1{margin-left:4.1666666667%}.el-col-md-pull-1{position:relative;right:4.1666666667%}.el-col-md-push-1{position:relative;left:4.1666666667%}.el-col-md-2{display:block;max-width:8.3333333333%;flex:0 0 8.3333333333%}.el-col-md-offset-2{margin-left:8.3333333333%}.el-col-md-pull-2{position:relative;right:8.3333333333%}.el-col-md-push-2{position:relative;left:8.3333333333%}.el-col-md-3{display:block;max-width:12.5%;flex:0 0 12.5%}.el-col-md-offset-3{margin-left:12.5%}.el-col-md-pull-3{position:relative;right:12.5%}.el-col-md-push-3{position:relative;left:12.5%}.el-col-md-4{display:block;max-width:16.6666666667%;flex:0 0 16.6666666667%}.el-col-md-offset-4{margin-left:16.6666666667%}.el-col-md-pull-4{position:relative;right:16.6666666667%}.el-col-md-push-4{position:relative;left:16.6666666667%}.el-col-md-5{display:block;max-width:20.8333333333%;flex:0 0 20.8333333333%}.el-col-md-offset-5{margin-left:20.8333333333%}.el-col-md-pull-5{position:relative;right:20.8333333333%}.el-col-md-push-5{position:relative;left:20.8333333333%}.el-col-md-6{display:block;max-width:25%;flex:0 0 25%}.el-col-md-offset-6{margin-left:25%}.el-col-md-pull-6{position:relative;right:25%}.el-col-md-push-6{position:relative;left:25%}.el-col-md-7{display:block;max-width:29.1666666667%;flex:0 0 29.1666666667%}.el-col-md-offset-7{margin-left:29.1666666667%}.el-col-md-pull-7{position:relative;right:29.1666666667%}.el-col-md-push-7{position:relative;left:29.1666666667%}.el-col-md-8{display:block;max-width:33.3333333333%;flex:0 0 33.3333333333%}.el-col-md-offset-8{margin-left:33.3333333333%}.el-col-md-pull-8{position:relative;right:33.3333333333%}.el-col-md-push-8{position:relative;left:33.3333333333%}.el-col-md-9{display:block;max-width:37.5%;flex:0 0 37.5%}.el-col-md-offset-9{margin-left:37.5%}.el-col-md-pull-9{position:relative;right:37.5%}.el-col-md-push-9{position:relative;left:37.5%}.el-col-md-10{display:block;max-width:41.6666666667%;flex:0 0 41.6666666667%}.el-col-md-offset-10{margin-left:41.6666666667%}.el-col-md-pull-10{position:relative;right:41.6666666667%}.el-col-md-push-10{position:relative;left:41.6666666667%}.el-col-md-11{display:block;max-width:45.8333333333%;flex:0 0 45.8333333333%}.el-col-md-offset-11{margin-left:45.8333333333%}.el-col-md-pull-11{position:relative;right:45.8333333333%}.el-col-md-push-11{position:relative;left:45.8333333333%}.el-col-md-12{display:block;max-width:50%;flex:0 0 50%}.el-col-md-offset-12{margin-left:50%}.el-col-md-pull-12{position:relative;right:50%}.el-col-md-push-12{position:relative;left:50%}.el-col-md-13{display:block;max-width:54.1666666667%;flex:0 0 54.1666666667%}.el-col-md-offset-13{margin-left:54.1666666667%}.el-col-md-pull-13{position:relative;right:54.1666666667%}.el-col-md-push-13{position:relative;left:54.1666666667%}.el-col-md-14{display:block;max-width:58.3333333333%;flex:0 0 58.3333333333%}.el-col-md-offset-14{margin-left:58.3333333333%}.el-col-md-pull-14{position:relative;right:58.3333333333%}.el-col-md-push-14{position:relative;left:58.3333333333%}.el-col-md-15{display:block;max-width:62.5%;flex:0 0 62.5%}.el-col-md-offset-15{margin-left:62.5%}.el-col-md-pull-15{position:relative;right:62.5%}.el-col-md-push-15{position:relative;left:62.5%}.el-col-md-16{display:block;max-width:66.6666666667%;flex:0 0 66.6666666667%}.el-col-md-offset-16{margin-left:66.6666666667%}.el-col-md-pull-16{position:relative;right:66.6666666667%}.el-col-md-push-16{position:relative;left:66.6666666667%}.el-col-md-17{display:block;max-width:70.8333333333%;flex:0 0 70.8333333333%}.el-col-md-offset-17{margin-left:70.8333333333%}.el-col-md-pull-17{position:relative;right:70.8333333333%}.el-col-md-push-17{position:relative;left:70.8333333333%}.el-col-md-18{display:block;max-width:75%;flex:0 0 75%}.el-col-md-offset-18{margin-left:75%}.el-col-md-pull-18{position:relative;right:75%}.el-col-md-push-18{position:relative;left:75%}.el-col-md-19{display:block;max-width:79.1666666667%;flex:0 0 79.1666666667%}.el-col-md-offset-19{margin-left:79.1666666667%}.el-col-md-pull-19{position:relative;right:79.1666666667%}.el-col-md-push-19{position:relative;left:79.1666666667%}.el-col-md-20{display:block;max-width:83.3333333333%;flex:0 0 83.3333333333%}.el-col-md-offset-20{margin-left:83.3333333333%}.el-col-md-pull-20{position:relative;right:83.3333333333%}.el-col-md-push-20{position:relative;left:83.3333333333%}.el-col-md-21{display:block;max-width:87.5%;flex:0 0 87.5%}.el-col-md-offset-21{margin-left:87.5%}.el-col-md-pull-21{position:relative;right:87.5%}.el-col-md-push-21{position:relative;left:87.5%}.el-col-md-22{display:block;max-width:91.6666666667%;flex:0 0 91.6666666667%}.el-col-md-offset-22{margin-left:91.6666666667%}.el-col-md-pull-22{position:relative;right:91.6666666667%}.el-col-md-push-22{position:relative;left:91.6666666667%}.el-col-md-23{display:block;max-width:95.8333333333%;flex:0 0 95.8333333333%}.el-col-md-offset-23{margin-left:95.8333333333%}.el-col-md-pull-23{position:relative;right:95.8333333333%}.el-col-md-push-23{position:relative;left:95.8333333333%}.el-col-md-24{display:block;max-width:100%;flex:0 0 100%}.el-col-md-offset-24{margin-left:100%}.el-col-md-pull-24{position:relative;right:100%}.el-col-md-push-24{position:relative;left:100%}}@media only screen and (min-width:1200px){.el-col-lg-0,.el-col-lg-0.is-guttered{display:none}.el-col-lg-0{max-width:0%;flex:0 0 0%}.el-col-lg-offset-0{margin-left:0}.el-col-lg-pull-0{position:relative;right:0}.el-col-lg-push-0{position:relative;left:0}.el-col-lg-1{display:block;max-width:4.1666666667%;flex:0 0 4.1666666667%}.el-col-lg-offset-1{margin-left:4.1666666667%}.el-col-lg-pull-1{position:relative;right:4.1666666667%}.el-col-lg-push-1{position:relative;left:4.1666666667%}.el-col-lg-2{display:block;max-width:8.3333333333%;flex:0 0 8.3333333333%}.el-col-lg-offset-2{margin-left:8.3333333333%}.el-col-lg-pull-2{position:relative;right:8.3333333333%}.el-col-lg-push-2{position:relative;left:8.3333333333%}.el-col-lg-3{display:block;max-width:12.5%;flex:0 0 12.5%}.el-col-lg-offset-3{margin-left:12.5%}.el-col-lg-pull-3{position:relative;right:12.5%}.el-col-lg-push-3{position:relative;left:12.5%}.el-col-lg-4{display:block;max-width:16.6666666667%;flex:0 0 16.6666666667%}.el-col-lg-offset-4{margin-left:16.6666666667%}.el-col-lg-pull-4{position:relative;right:16.6666666667%}.el-col-lg-push-4{position:relative;left:16.6666666667%}.el-col-lg-5{display:block;max-width:20.8333333333%;flex:0 0 20.8333333333%}.el-col-lg-offset-5{margin-left:20.8333333333%}.el-col-lg-pull-5{position:relative;right:20.8333333333%}.el-col-lg-push-5{position:relative;left:20.8333333333%}.el-col-lg-6{display:block;max-width:25%;flex:0 0 25%}.el-col-lg-offset-6{margin-left:25%}.el-col-lg-pull-6{position:relative;right:25%}.el-col-lg-push-6{position:relative;left:25%}.el-col-lg-7{display:block;max-width:29.1666666667%;flex:0 0 29.1666666667%}.el-col-lg-offset-7{margin-left:29.1666666667%}.el-col-lg-pull-7{position:relative;right:29.1666666667%}.el-col-lg-push-7{position:relative;left:29.1666666667%}.el-col-lg-8{display:block;max-width:33.3333333333%;flex:0 0 33.3333333333%}.el-col-lg-offset-8{margin-left:33.3333333333%}.el-col-lg-pull-8{position:relative;right:33.3333333333%}.el-col-lg-push-8{position:relative;left:33.3333333333%}.el-col-lg-9{display:block;max-width:37.5%;flex:0 0 37.5%}.el-col-lg-offset-9{margin-left:37.5%}.el-col-lg-pull-9{position:relative;right:37.5%}.el-col-lg-push-9{position:relative;left:37.5%}.el-col-lg-10{display:block;max-width:41.6666666667%;flex:0 0 41.6666666667%}.el-col-lg-offset-10{margin-left:41.6666666667%}.el-col-lg-pull-10{position:relative;right:41.6666666667%}.el-col-lg-push-10{position:relative;left:41.6666666667%}.el-col-lg-11{display:block;max-width:45.8333333333%;flex:0 0 45.8333333333%}.el-col-lg-offset-11{margin-left:45.8333333333%}.el-col-lg-pull-11{position:relative;right:45.8333333333%}.el-col-lg-push-11{position:relative;left:45.8333333333%}.el-col-lg-12{display:block;max-width:50%;flex:0 0 50%}.el-col-lg-offset-12{margin-left:50%}.el-col-lg-pull-12{position:relative;right:50%}.el-col-lg-push-12{position:relative;left:50%}.el-col-lg-13{display:block;max-width:54.1666666667%;flex:0 0 54.1666666667%}.el-col-lg-offset-13{margin-left:54.1666666667%}.el-col-lg-pull-13{position:relative;right:54.1666666667%}.el-col-lg-push-13{position:relative;left:54.1666666667%}.el-col-lg-14{display:block;max-width:58.3333333333%;flex:0 0 58.3333333333%}.el-col-lg-offset-14{margin-left:58.3333333333%}.el-col-lg-pull-14{position:relative;right:58.3333333333%}.el-col-lg-push-14{position:relative;left:58.3333333333%}.el-col-lg-15{display:block;max-width:62.5%;flex:0 0 62.5%}.el-col-lg-offset-15{margin-left:62.5%}.el-col-lg-pull-15{position:relative;right:62.5%}.el-col-lg-push-15{position:relative;left:62.5%}.el-col-lg-16{display:block;max-width:66.6666666667%;flex:0 0 66.6666666667%}.el-col-lg-offset-16{margin-left:66.6666666667%}.el-col-lg-pull-16{position:relative;right:66.6666666667%}.el-col-lg-push-16{position:relative;left:66.6666666667%}.el-col-lg-17{display:block;max-width:70.8333333333%;flex:0 0 70.8333333333%}.el-col-lg-offset-17{margin-left:70.8333333333%}.el-col-lg-pull-17{position:relative;right:70.8333333333%}.el-col-lg-push-17{position:relative;left:70.8333333333%}.el-col-lg-18{display:block;max-width:75%;flex:0 0 75%}.el-col-lg-offset-18{margin-left:75%}.el-col-lg-pull-18{position:relative;right:75%}.el-col-lg-push-18{position:relative;left:75%}.el-col-lg-19{display:block;max-width:79.1666666667%;flex:0 0 79.1666666667%}.el-col-lg-offset-19{margin-left:79.1666666667%}.el-col-lg-pull-19{position:relative;right:79.1666666667%}.el-col-lg-push-19{position:relative;left:79.1666666667%}.el-col-lg-20{display:block;max-width:83.3333333333%;flex:0 0 83.3333333333%}.el-col-lg-offset-20{margin-left:83.3333333333%}.el-col-lg-pull-20{position:relative;right:83.3333333333%}.el-col-lg-push-20{position:relative;left:83.3333333333%}.el-col-lg-21{display:block;max-width:87.5%;flex:0 0 87.5%}.el-col-lg-offset-21{margin-left:87.5%}.el-col-lg-pull-21{position:relative;right:87.5%}.el-col-lg-push-21{position:relative;left:87.5%}.el-col-lg-22{display:block;max-width:91.6666666667%;flex:0 0 91.6666666667%}.el-col-lg-offset-22{margin-left:91.6666666667%}.el-col-lg-pull-22{position:relative;right:91.6666666667%}.el-col-lg-push-22{position:relative;left:91.6666666667%}.el-col-lg-23{display:block;max-width:95.8333333333%;flex:0 0 95.8333333333%}.el-col-lg-offset-23{margin-left:95.8333333333%}.el-col-lg-pull-23{position:relative;right:95.8333333333%}.el-col-lg-push-23{position:relative;left:95.8333333333%}.el-col-lg-24{display:block;max-width:100%;flex:0 0 100%}.el-col-lg-offset-24{margin-left:100%}.el-col-lg-pull-24{position:relative;right:100%}.el-col-lg-push-24{position:relative;left:100%}}@media only screen and (min-width:1920px){.el-col-xl-0,.el-col-xl-0.is-guttered{display:none}.el-col-xl-0{max-width:0%;flex:0 0 0%}.el-col-xl-offset-0{margin-left:0}.el-col-xl-pull-0{position:relative;right:0}.el-col-xl-push-0{position:relative;left:0}.el-col-xl-1{display:block;max-width:4.1666666667%;flex:0 0 4.1666666667%}.el-col-xl-offset-1{margin-left:4.1666666667%}.el-col-xl-pull-1{position:relative;right:4.1666666667%}.el-col-xl-push-1{position:relative;left:4.1666666667%}.el-col-xl-2{display:block;max-width:8.3333333333%;flex:0 0 8.3333333333%}.el-col-xl-offset-2{margin-left:8.3333333333%}.el-col-xl-pull-2{position:relative;right:8.3333333333%}.el-col-xl-push-2{position:relative;left:8.3333333333%}.el-col-xl-3{display:block;max-width:12.5%;flex:0 0 12.5%}.el-col-xl-offset-3{margin-left:12.5%}.el-col-xl-pull-3{position:relative;right:12.5%}.el-col-xl-push-3{position:relative;left:12.5%}.el-col-xl-4{display:block;max-width:16.6666666667%;flex:0 0 16.6666666667%}.el-col-xl-offset-4{margin-left:16.6666666667%}.el-col-xl-pull-4{position:relative;right:16.6666666667%}.el-col-xl-push-4{position:relative;left:16.6666666667%}.el-col-xl-5{display:block;max-width:20.8333333333%;flex:0 0 20.8333333333%}.el-col-xl-offset-5{margin-left:20.8333333333%}.el-col-xl-pull-5{position:relative;right:20.8333333333%}.el-col-xl-push-5{position:relative;left:20.8333333333%}.el-col-xl-6{display:block;max-width:25%;flex:0 0 25%}.el-col-xl-offset-6{margin-left:25%}.el-col-xl-pull-6{position:relative;right:25%}.el-col-xl-push-6{position:relative;left:25%}.el-col-xl-7{display:block;max-width:29.1666666667%;flex:0 0 29.1666666667%}.el-col-xl-offset-7{margin-left:29.1666666667%}.el-col-xl-pull-7{position:relative;right:29.1666666667%}.el-col-xl-push-7{position:relative;left:29.1666666667%}.el-col-xl-8{display:block;max-width:33.3333333333%;flex:0 0 33.3333333333%}.el-col-xl-offset-8{margin-left:33.3333333333%}.el-col-xl-pull-8{position:relative;right:33.3333333333%}.el-col-xl-push-8{position:relative;left:33.3333333333%}.el-col-xl-9{display:block;max-width:37.5%;flex:0 0 37.5%}.el-col-xl-offset-9{margin-left:37.5%}.el-col-xl-pull-9{position:relative;right:37.5%}.el-col-xl-push-9{position:relative;left:37.5%}.el-col-xl-10{display:block;max-width:41.6666666667%;flex:0 0 41.6666666667%}.el-col-xl-offset-10{margin-left:41.6666666667%}.el-col-xl-pull-10{position:relative;right:41.6666666667%}.el-col-xl-push-10{position:relative;left:41.6666666667%}.el-col-xl-11{display:block;max-width:45.8333333333%;flex:0 0 45.8333333333%}.el-col-xl-offset-11{margin-left:45.8333333333%}.el-col-xl-pull-11{position:relative;right:45.8333333333%}.el-col-xl-push-11{position:relative;left:45.8333333333%}.el-col-xl-12{display:block;max-width:50%;flex:0 0 50%}.el-col-xl-offset-12{margin-left:50%}.el-col-xl-pull-12{position:relative;right:50%}.el-col-xl-push-12{position:relative;left:50%}.el-col-xl-13{display:block;max-width:54.1666666667%;flex:0 0 54.1666666667%}.el-col-xl-offset-13{margin-left:54.1666666667%}.el-col-xl-pull-13{position:relative;right:54.1666666667%}.el-col-xl-push-13{position:relative;left:54.1666666667%}.el-col-xl-14{display:block;max-width:58.3333333333%;flex:0 0 58.3333333333%}.el-col-xl-offset-14{margin-left:58.3333333333%}.el-col-xl-pull-14{position:relative;right:58.3333333333%}.el-col-xl-push-14{position:relative;left:58.3333333333%}.el-col-xl-15{display:block;max-width:62.5%;flex:0 0 62.5%}.el-col-xl-offset-15{margin-left:62.5%}.el-col-xl-pull-15{position:relative;right:62.5%}.el-col-xl-push-15{position:relative;left:62.5%}.el-col-xl-16{display:block;max-width:66.6666666667%;flex:0 0 66.6666666667%}.el-col-xl-offset-16{margin-left:66.6666666667%}.el-col-xl-pull-16{position:relative;right:66.6666666667%}.el-col-xl-push-16{position:relative;left:66.6666666667%}.el-col-xl-17{display:block;max-width:70.8333333333%;flex:0 0 70.8333333333%}.el-col-xl-offset-17{margin-left:70.8333333333%}.el-col-xl-pull-17{position:relative;right:70.8333333333%}.el-col-xl-push-17{position:relative;left:70.8333333333%}.el-col-xl-18{display:block;max-width:75%;flex:0 0 75%}.el-col-xl-offset-18{margin-left:75%}.el-col-xl-pull-18{position:relative;right:75%}.el-col-xl-push-18{position:relative;left:75%}.el-col-xl-19{display:block;max-width:79.1666666667%;flex:0 0 79.1666666667%}.el-col-xl-offset-19{margin-left:79.1666666667%}.el-col-xl-pull-19{position:relative;right:79.1666666667%}.el-col-xl-push-19{position:relative;left:79.1666666667%}.el-col-xl-20{display:block;max-width:83.3333333333%;flex:0 0 83.3333333333%}.el-col-xl-offset-20{margin-left:83.3333333333%}.el-col-xl-pull-20{position:relative;right:83.3333333333%}.el-col-xl-push-20{position:relative;left:83.3333333333%}.el-col-xl-21{display:block;max-width:87.5%;flex:0 0 87.5%}.el-col-xl-offset-21{margin-left:87.5%}.el-col-xl-pull-21{position:relative;right:87.5%}.el-col-xl-push-21{position:relative;left:87.5%}.el-col-xl-22{display:block;max-width:91.6666666667%;flex:0 0 91.6666666667%}.el-col-xl-offset-22{margin-left:91.6666666667%}.el-col-xl-pull-22{position:relative;right:91.6666666667%}.el-col-xl-push-22{position:relative;left:91.6666666667%}.el-col-xl-23{display:block;max-width:95.8333333333%;flex:0 0 95.8333333333%}.el-col-xl-offset-23{margin-left:95.8333333333%}.el-col-xl-pull-23{position:relative;right:95.8333333333%}.el-col-xl-push-23{position:relative;left:95.8333333333%}.el-col-xl-24{display:block;max-width:100%;flex:0 0 100%}.el-col-xl-offset-24{margin-left:100%}.el-col-xl-pull-24{position:relative;right:100%}.el-col-xl-push-24{position:relative;left:100%}}.el-collapse{--el-collapse-border-color:var(--el-border-color-lighter);--el-collapse-header-height:48px;--el-collapse-header-bg-color:var(--el-fill-color-blank);--el-collapse-header-text-color:var(--el-text-color-primary);--el-collapse-header-font-size:13px;--el-collapse-content-bg-color:var(--el-fill-color-blank);--el-collapse-content-font-size:13px;--el-collapse-content-text-color:var(--el-text-color-primary);border-top:1px solid var(--el-collapse-border-color);border-bottom:1px solid var(--el-collapse-border-color)}.el-collapse-item.is-disabled .el-collapse-item__header{color:var(--el-text-color-disabled);cursor:not-allowed}.el-collapse-item__header{display:flex;align-items:center;height:var(--el-collapse-header-height);line-height:var(--el-collapse-header-height);background-color:var(--el-collapse-header-bg-color);color:var(--el-collapse-header-text-color);cursor:pointer;border-bottom:1px solid var(--el-collapse-border-color);font-size:var(--el-collapse-header-font-size);font-weight:500;transition:border-bottom-color var(--el-transition-duration);outline:0}.el-collapse-item__arrow{margin:0 8px 0 auto;transition:transform var(--el-transition-duration);font-weight:300}.el-collapse-item__arrow.is-active{transform:rotate(90deg)}.el-collapse-item__header.focusing:focus:not(:hover){color:var(--el-color-primary)}.el-collapse-item__header.is-active{border-bottom-color:transparent}.el-collapse-item__wrap{will-change:height;background-color:var(--el-collapse-content-bg-color);overflow:hidden;box-sizing:border-box;border-bottom:1px solid var(--el-collapse-border-color)}.el-collapse-item__content{padding-bottom:25px;font-size:var(--el-collapse-content-font-size);color:var(--el-collapse-content-text-color);line-height:1.7692307692}.el-collapse-item:last-child{margin-bottom:-1px}.el-color-predefine{display:flex;font-size:12px;margin-top:8px;width:280px}.el-color-predefine__colors{display:flex;flex:1;flex-wrap:wrap}.el-color-predefine__color-selector{margin:0 0 8px 8px;width:20px;height:20px;border-radius:4px;cursor:pointer}.el-color-predefine__color-selector:nth-child(10n+1){margin-left:0}.el-color-predefine__color-selector.selected{box-shadow:0 0 3px 2px var(--el-color-primary)}.el-color-predefine__color-selector>div{display:flex;height:100%;border-radius:3px}.el-color-predefine__color-selector.is-alpha{background-image:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAwAAAAMCAIAAADZF8uwAAAAGUlEQVQYV2M4gwH+YwCGIasIUwhT25BVBADtzYNYrHvv4gAAAABJRU5ErkJggg==)}.el-color-hue-slider{position:relative;box-sizing:border-box;width:280px;height:12px;background-color:red;padding:0 2px;float:right}.el-color-hue-slider__bar{position:relative;background:linear-gradient(to right,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%);height:100%}.el-color-hue-slider__thumb{position:absolute;cursor:pointer;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid var(--el-border-color-lighter);box-shadow:0 0 2px #0009;z-index:1}.el-color-hue-slider.is-vertical{width:12px;height:180px;padding:2px 0}.el-color-hue-slider.is-vertical .el-color-hue-slider__bar{background:linear-gradient(to bottom,red 0,#ff0 17%,#0f0 33%,#0ff 50%,#00f 67%,#f0f 83%,red 100%)}.el-color-hue-slider.is-vertical .el-color-hue-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-svpanel{position:relative;width:280px;height:180px}.el-color-svpanel__black,.el-color-svpanel__white{position:absolute;inset:0}.el-color-svpanel__white{background:linear-gradient(to right,#fff,rgba(255,255,255,0))}.el-color-svpanel__black{background:linear-gradient(to top,#000,rgba(0,0,0,0))}.el-color-svpanel__cursor{position:absolute}.el-color-svpanel__cursor>div{cursor:head;width:4px;height:4px;box-shadow:0 0 0 1.5px #fff,inset 0 0 1px 1px #0000004d,0 0 1px 2px #0006;border-radius:50%;transform:translate(-2px,-2px)}.el-color-alpha-slider{position:relative;box-sizing:border-box;width:280px;height:12px;background-image:linear-gradient(45deg,var(--el-color-picker-alpha-bg-a) 25%,var(--el-color-picker-alpha-bg-b) 25%),linear-gradient(135deg,var(--el-color-picker-alpha-bg-a) 25%,var(--el-color-picker-alpha-bg-b) 25%),linear-gradient(45deg,var(--el-color-picker-alpha-bg-b) 75%,var(--el-color-picker-alpha-bg-a) 75%),linear-gradient(135deg,var(--el-color-picker-alpha-bg-b) 75%,var(--el-color-picker-alpha-bg-a) 75%);background-size:12px 12px;background-position:0 0,6px 0,6px -6px,0 6px}.el-color-alpha-slider__bar{position:relative;background:linear-gradient(to right,rgba(255,255,255,0) 0,var(--el-bg-color) 100%);height:100%}.el-color-alpha-slider__thumb{position:absolute;cursor:pointer;box-sizing:border-box;left:0;top:0;width:4px;height:100%;border-radius:1px;background:#fff;border:1px solid var(--el-border-color-lighter);box-shadow:0 0 2px #0009;z-index:1}.el-color-alpha-slider.is-vertical{width:20px;height:180px}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__bar{background:linear-gradient(to bottom,rgba(255,255,255,0) 0,#fff 100%)}.el-color-alpha-slider.is-vertical .el-color-alpha-slider__thumb{left:0;top:0;width:100%;height:4px}.el-color-dropdown{width:300px}.el-color-dropdown__main-wrapper{margin-bottom:6px}.el-color-dropdown__main-wrapper:after{content:\"\";display:table;clear:both}.el-color-dropdown__btns{margin-top:12px;text-align:right}.el-color-dropdown__value{float:left;line-height:26px;font-size:12px;color:#000;width:160px}.el-color-picker{display:inline-block;position:relative;line-height:normal}.el-color-picker.is-disabled .el-color-picker__trigger{cursor:not-allowed}.el-color-picker--large{height:40px}.el-color-picker--large .el-color-picker__trigger{height:40px;width:40px}.el-color-picker--large .el-color-picker__mask{height:38px;width:38px}.el-color-picker--small{height:24px}.el-color-picker--small .el-color-picker__trigger{height:24px;width:24px}.el-color-picker--small .el-color-picker__mask{height:22px;width:22px}.el-color-picker--small .el-color-picker__empty,.el-color-picker--small .el-color-picker__icon{transform:scale(.8)}.el-color-picker__mask{height:38px;width:38px;border-radius:4px;position:absolute;top:1px;left:1px;z-index:1;cursor:not-allowed;background-color:#ffffffb3}.el-color-picker__trigger{display:inline-flex;justify-content:center;align-items:center;box-sizing:border-box;height:32px;width:32px;padding:4px;border:1px solid var(--el-border-color);border-radius:4px;font-size:0;position:relative;cursor:pointer}.el-color-picker__color{position:relative;display:block;box-sizing:border-box;border:1px solid var(--el-text-color-secondary);border-radius:var(--el-border-radius-small);width:100%;height:100%;text-align:center}.el-color-picker__color.is-alpha{background-image:linear-gradient(45deg,var(--el-color-picker-alpha-bg-a) 25%,var(--el-color-picker-alpha-bg-b) 25%),linear-gradient(135deg,var(--el-color-picker-alpha-bg-a) 25%,var(--el-color-picker-alpha-bg-b) 25%),linear-gradient(45deg,var(--el-color-picker-alpha-bg-b) 75%,var(--el-color-picker-alpha-bg-a) 75%),linear-gradient(135deg,var(--el-color-picker-alpha-bg-b) 75%,var(--el-color-picker-alpha-bg-a) 75%);background-size:12px 12px;background-position:0 0,6px 0,6px -6px,0 6px}.el-color-picker__color-inner{display:inline-flex;justify-content:center;align-items:center;width:100%;height:100%}.el-color-picker .el-color-picker__empty{font-size:12px;color:var(--el-text-color-secondary)}.el-color-picker .el-color-picker__icon{display:inline-flex;justify-content:center;align-items:center;color:#fff;font-size:12px}.el-color-picker__panel{position:absolute;z-index:10;padding:6px;box-sizing:content-box;background-color:#fff;border-radius:var(--el-border-radius-base);box-shadow:var(--el-box-shadow-light)}.el-color-picker__panel.el-popper{border:1px solid var(--el-border-color-lighter)}.el-color-picker,.el-color-picker__panel{--el-color-picker-alpha-bg-a:#ccc;--el-color-picker-alpha-bg-b:transparent}.dark .el-color-picker,.dark .el-color-picker__panel{--el-color-picker-alpha-bg-a:#333333}.el-container{display:flex;flex-direction:row;flex:1;flex-basis:auto;box-sizing:border-box;min-width:0}.el-container.is-vertical{flex-direction:column}.el-date-table{font-size:12px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-date-table.is-week-mode .el-date-table__row:hover .el-date-table-cell{background-color:var(--el-datepicker-inrange-bg-color)}.el-date-table.is-week-mode .el-date-table__row:hover td.available:hover{color:var(--el-datepicker-text-color)}.el-date-table.is-week-mode .el-date-table__row:hover td:first-child .el-date-table-cell{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table.is-week-mode .el-date-table__row:hover td:last-child .el-date-table-cell{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table.is-week-mode .el-date-table__row.current .el-date-table-cell{background-color:var(--el-datepicker-inrange-bg-color)}.el-date-table td{width:32px;height:30px;padding:4px 0;box-sizing:border-box;text-align:center;cursor:pointer;position:relative}.el-date-table td .el-date-table-cell{height:30px;padding:3px 0;box-sizing:border-box}.el-date-table td .el-date-table-cell .el-date-table-cell__text{width:24px;height:24px;display:block;margin:0 auto;line-height:24px;position:absolute;left:50%;transform:translate(-50%);border-radius:50%}.el-date-table td.next-month,.el-date-table td.prev-month{color:var(--el-datepicker-off-text-color)}.el-date-table td.today{position:relative}.el-date-table td.today .el-date-table-cell__text{color:var(--el-color-primary);font-weight:700}.el-date-table td.today.end-date .el-date-table-cell__text,.el-date-table td.today.start-date .el-date-table-cell__text{color:#fff}.el-date-table td.available:hover{color:var(--el-datepicker-hover-text-color)}.el-date-table td.in-range .el-date-table-cell{background-color:var(--el-datepicker-inrange-bg-color)}.el-date-table td.in-range .el-date-table-cell:hover{background-color:var(--el-datepicker-inrange-hover-bg-color)}.el-date-table td.current:not(.disabled) .el-date-table-cell__text{color:#fff;background-color:var(--el-datepicker-active-color)}.el-date-table td.current:not(.disabled):focus-visible .el-date-table-cell__text{outline:2px solid var(--el-datepicker-active-color);outline-offset:1px}.el-date-table td.end-date .el-date-table-cell,.el-date-table td.start-date .el-date-table-cell{color:#fff}.el-date-table td.end-date .el-date-table-cell__text,.el-date-table td.start-date .el-date-table-cell__text{background-color:var(--el-datepicker-active-color)}.el-date-table td.start-date .el-date-table-cell{margin-left:5px;border-top-left-radius:15px;border-bottom-left-radius:15px}.el-date-table td.end-date .el-date-table-cell{margin-right:5px;border-top-right-radius:15px;border-bottom-right-radius:15px}.el-date-table td.disabled .el-date-table-cell{background-color:var(--el-fill-color-light);opacity:1;cursor:not-allowed;color:var(--el-text-color-placeholder)}.el-date-table td.selected .el-date-table-cell{margin-left:5px;margin-right:5px;background-color:var(--el-datepicker-inrange-bg-color);border-radius:15px}.el-date-table td.selected .el-date-table-cell:hover{background-color:var(--el-datepicker-inrange-hover-bg-color)}.el-date-table td.selected .el-date-table-cell__text{background-color:var(--el-datepicker-active-color);color:#fff;border-radius:15px}.el-date-table td.week{font-size:80%;color:var(--el-datepicker-header-text-color)}.el-date-table td:focus{outline:0}.el-date-table th{padding:5px;color:var(--el-datepicker-header-text-color);font-weight:400;border-bottom:solid 1px var(--el-border-color-lighter)}.el-month-table{font-size:12px;margin:-1px;border-collapse:collapse}.el-month-table td{text-align:center;padding:8px 0;cursor:pointer}.el-month-table td div{height:48px;padding:6px 0;box-sizing:border-box}.el-month-table td.today .cell{color:var(--el-color-primary);font-weight:700}.el-month-table td.today.end-date .cell,.el-month-table td.today.start-date .cell{color:#fff}.el-month-table td.disabled .cell{background-color:var(--el-fill-color-light);cursor:not-allowed;color:var(--el-text-color-placeholder)}.el-month-table td.disabled .cell:hover{color:var(--el-text-color-placeholder)}.el-month-table td .cell{width:60px;height:36px;display:block;line-height:36px;color:var(--el-datepicker-text-color);margin:0 auto;border-radius:18px}.el-month-table td .cell:hover{color:var(--el-datepicker-hover-text-color)}.el-month-table td.in-range div{background-color:var(--el-datepicker-inrange-bg-color)}.el-month-table td.in-range div:hover{background-color:var(--el-datepicker-inrange-hover-bg-color)}.el-month-table td.end-date div,.el-month-table td.start-date div{color:#fff}.el-month-table td.end-date .cell,.el-month-table td.start-date .cell{color:#fff;background-color:var(--el-datepicker-active-color)}.el-month-table td.start-date div{border-top-left-radius:24px;border-bottom-left-radius:24px}.el-month-table td.end-date div{border-top-right-radius:24px;border-bottom-right-radius:24px}.el-month-table td.current:not(.disabled) .cell{color:var(--el-datepicker-active-color)}.el-month-table td:focus-visible{outline:0}.el-month-table td:focus-visible .cell{outline:2px solid var(--el-datepicker-active-color)}.el-year-table{font-size:12px;margin:-1px;border-collapse:collapse}.el-year-table .el-icon{color:var(--el-datepicker-icon-color)}.el-year-table td{text-align:center;padding:20px 3px;cursor:pointer}.el-year-table td.today .cell{color:var(--el-color-primary);font-weight:700}.el-year-table td.disabled .cell{background-color:var(--el-fill-color-light);cursor:not-allowed;color:var(--el-text-color-placeholder)}.el-year-table td.disabled .cell:hover{color:var(--el-text-color-placeholder)}.el-year-table td .cell{width:48px;height:36px;display:block;line-height:36px;color:var(--el-datepicker-text-color);border-radius:18px;margin:0 auto}.el-year-table td .cell:hover{color:var(--el-datepicker-hover-text-color)}.el-year-table td.current:not(.disabled) .cell{color:var(--el-datepicker-active-color)}.el-year-table td:focus-visible{outline:0}.el-year-table td:focus-visible .cell{outline:2px solid var(--el-datepicker-active-color)}.el-time-spinner.has-seconds .el-time-spinner__wrapper{width:33.3%}.el-time-spinner__wrapper{max-height:192px;overflow:auto;display:inline-block;width:50%;vertical-align:top;position:relative}.el-time-spinner__wrapper.el-scrollbar__wrap:not(.el-scrollbar__wrap--hidden-default){padding-bottom:15px}.el-time-spinner__wrapper.is-arrow{box-sizing:border-box;text-align:center;overflow:hidden}.el-time-spinner__wrapper.is-arrow .el-time-spinner__list{transform:translateY(-32px)}.el-time-spinner__wrapper.is-arrow .el-time-spinner__item:hover:not(.is-disabled):not(.is-active){background:var(--el-fill-color-light);cursor:default}.el-time-spinner__arrow{font-size:12px;color:var(--el-text-color-secondary);position:absolute;left:0;width:100%;z-index:var(--el-index-normal);text-align:center;height:30px;line-height:30px;cursor:pointer}.el-time-spinner__arrow:hover{color:var(--el-color-primary)}.el-time-spinner__arrow.arrow-up{top:10px}.el-time-spinner__arrow.arrow-down{bottom:10px}.el-time-spinner__input.el-input{width:70%}.el-time-spinner__input.el-input .el-input__inner{padding:0;text-align:center}.el-time-spinner__list{padding:0;margin:0;list-style:none;text-align:center}.el-time-spinner__list:after,.el-time-spinner__list:before{content:\"\";display:block;width:100%;height:80px}.el-time-spinner__item{height:32px;line-height:32px;font-size:12px;color:var(--el-text-color-regular)}.el-time-spinner__item:hover:not(.is-disabled):not(.is-active){background:var(--el-fill-color-light);cursor:pointer}.el-time-spinner__item.is-active:not(.is-disabled){color:var(--el-text-color-primary);font-weight:700}.el-time-spinner__item.is-disabled{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-picker__popper{--el-datepicker-border-color:var(--el-disabled-border-color)}.el-picker__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-datepicker-border-color);box-shadow:var(--el-box-shadow-light)}.el-picker__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-datepicker-border-color)}.el-picker__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:transparent;border-left-color:transparent}.el-picker__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-picker__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-left-color:transparent;border-bottom-color:transparent}.el-picker__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-date-editor{--el-date-editor-width:220px;--el-date-editor-monthrange-width:300px;--el-date-editor-daterange-width:350px;--el-date-editor-datetimerange-width:400px;--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary);position:relative;display:inline-block;text-align:left}.el-date-editor.el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset}.el-date-editor.el-input__wrapper:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-date-editor.el-input,.el-date-editor.el-input__wrapper{width:var(--el-date-editor-width);height:var(--el-input-height,var(--el-component-size))}.el-date-editor--monthrange{--el-date-editor-width:var(--el-date-editor-monthrange-width)}.el-date-editor--daterange,.el-date-editor--timerange{--el-date-editor-width:var(--el-date-editor-daterange-width)}.el-date-editor--datetimerange{--el-date-editor-width:var(--el-date-editor-datetimerange-width)}.el-date-editor--dates .el-input__wrapper{text-overflow:ellipsis;white-space:nowrap}.el-date-editor .close-icon,.el-date-editor .clear-icon{cursor:pointer}.el-date-editor .clear-icon:hover{color:var(--el-text-color-secondary)}.el-date-editor .el-range__icon{height:inherit;font-size:14px;color:var(--el-text-color-placeholder);float:left}.el-date-editor .el-range__icon svg{vertical-align:middle}.el-date-editor .el-range-input{-webkit-appearance:none;-moz-appearance:none;appearance:none;border:none;outline:0;display:inline-block;height:30px;line-height:30px;margin:0;padding:0;width:39%;text-align:center;font-size:var(--el-font-size-base);color:var(--el-text-color-regular);background-color:transparent}.el-date-editor .el-range-input::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-date-editor .el-range-input:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-date-editor .el-range-input::placeholder{color:var(--el-text-color-placeholder)}.el-date-editor .el-range-separator{flex:1;display:inline-flex;justify-content:center;align-items:center;height:100%;padding:0 5px;margin:0;font-size:14px;word-break:keep-all;color:var(--el-text-color-primary)}.el-date-editor .el-range__close-icon{font-size:14px;color:var(--el-text-color-placeholder);height:inherit;width:unset;cursor:pointer}.el-date-editor .el-range__close-icon:hover{color:var(--el-text-color-secondary)}.el-date-editor .el-range__close-icon svg{vertical-align:middle}.el-date-editor .el-range__close-icon--hidden{opacity:0;visibility:hidden}.el-range-editor.el-input__wrapper{display:inline-flex;align-items:center;padding:0 10px}.el-range-editor.is-active,.el-range-editor.is-active:hover{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-range-editor--large{line-height:var(--el-component-size-large)}.el-range-editor--large.el-input__wrapper{height:var(--el-component-size-large)}.el-range-editor--large .el-range-separator{line-height:40px;font-size:14px}.el-range-editor--large .el-range-input{height:38px;line-height:38px;font-size:14px}.el-range-editor--small{line-height:var(--el-component-size-small)}.el-range-editor--small.el-input__wrapper{height:var(--el-component-size-small)}.el-range-editor--small .el-range-separator{line-height:24px;font-size:12px}.el-range-editor--small .el-range-input{height:22px;line-height:22px;font-size:12px}.el-range-editor.is-disabled{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color);color:var(--el-disabled-text-color);cursor:not-allowed}.el-range-editor.is-disabled:focus,.el-range-editor.is-disabled:hover{border-color:var(--el-disabled-border-color)}.el-range-editor.is-disabled input{background-color:var(--el-disabled-bg-color);color:var(--el-disabled-text-color);cursor:not-allowed}.el-range-editor.is-disabled input::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-range-editor.is-disabled input:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-range-editor.is-disabled input::placeholder{color:var(--el-text-color-placeholder)}.el-range-editor.is-disabled .el-range-separator{color:var(--el-disabled-text-color)}.el-picker-panel{color:var(--el-text-color-regular);background:var(--el-bg-color-overlay);border-radius:var(--el-border-radius-base);line-height:30px}.el-picker-panel .el-time-panel{margin:5px 0;border:solid 1px var(--el-datepicker-border-color);background-color:var(--el-bg-color-overlay);box-shadow:var(--el-box-shadow-light)}.el-picker-panel__body-wrapper:after,.el-picker-panel__body:after{content:\"\";display:table;clear:both}.el-picker-panel__content{position:relative;margin:15px}.el-picker-panel__footer{border-top:1px solid var(--el-datepicker-inner-border-color);padding:4px 12px;text-align:right;background-color:var(--el-bg-color-overlay);position:relative;font-size:0}.el-picker-panel__shortcut{display:block;width:100%;border:0;background-color:transparent;line-height:28px;font-size:14px;color:var(--el-datepicker-text-color);padding-left:12px;text-align:left;outline:0;cursor:pointer}.el-picker-panel__shortcut:hover{color:var(--el-datepicker-hover-text-color)}.el-picker-panel__shortcut.active{background-color:#e6f1fe;color:var(--el-datepicker-active-color)}.el-picker-panel__btn{border:1px solid var(--el-fill-color-darker);color:var(--el-text-color-primary);line-height:24px;border-radius:2px;padding:0 20px;cursor:pointer;background-color:transparent;outline:0;font-size:12px}.el-picker-panel__btn[disabled]{color:var(--el-text-color-disabled);cursor:not-allowed}.el-picker-panel__icon-btn{font-size:12px;color:var(--el-datepicker-icon-color);border:0;background:0 0;cursor:pointer;outline:0;margin-top:8px}.el-picker-panel__icon-btn:hover{color:var(--el-datepicker-hover-text-color)}.el-picker-panel__icon-btn:focus-visible{color:var(--el-datepicker-hover-text-color)}.el-picker-panel__icon-btn.is-disabled{color:var(--el-text-color-disabled)}.el-picker-panel__icon-btn.is-disabled:hover{cursor:not-allowed}.el-picker-panel__icon-btn .el-icon{cursor:pointer;font-size:inherit}.el-picker-panel__link-btn{vertical-align:middle}.el-picker-panel [slot=sidebar],.el-picker-panel__sidebar{position:absolute;top:0;bottom:0;width:110px;border-right:1px solid var(--el-datepicker-inner-border-color);box-sizing:border-box;padding-top:6px;background-color:var(--el-bg-color-overlay);overflow:auto}.el-picker-panel [slot=sidebar]+.el-picker-panel__body,.el-picker-panel__sidebar+.el-picker-panel__body{margin-left:110px}.el-date-picker{--el-datepicker-text-color:var(--el-text-color-regular);--el-datepicker-off-text-color:var(--el-text-color-placeholder);--el-datepicker-header-text-color:var(--el-text-color-regular);--el-datepicker-icon-color:var(--el-text-color-primary);--el-datepicker-border-color:var(--el-disabled-border-color);--el-datepicker-inner-border-color:var(--el-border-color-light);--el-datepicker-inrange-bg-color:var(--el-border-color-extra-light);--el-datepicker-inrange-hover-bg-color:var(--el-border-color-extra-light);--el-datepicker-active-color:var(--el-color-primary);--el-datepicker-hover-text-color:var(--el-color-primary)}.el-date-picker{width:322px}.el-date-picker.has-sidebar.has-time{width:434px}.el-date-picker.has-sidebar{width:438px}.el-date-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-picker .el-picker-panel__content{width:292px}.el-date-picker table{table-layout:fixed;width:100%}.el-date-picker__editor-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-picker__time-header{position:relative;border-bottom:1px solid var(--el-datepicker-inner-border-color);font-size:12px;padding:8px 5px 5px;display:table;width:100%;box-sizing:border-box}.el-date-picker__header{margin:12px;text-align:center}.el-date-picker__header--bordered{margin-bottom:0;padding-bottom:12px;border-bottom:solid 1px var(--el-border-color-lighter)}.el-date-picker__header--bordered+.el-picker-panel__content{margin-top:0}.el-date-picker__header-label{font-size:16px;font-weight:500;padding:0 5px;line-height:22px;text-align:center;cursor:pointer;color:var(--el-text-color-regular)}.el-date-picker__header-label:hover{color:var(--el-datepicker-hover-text-color)}.el-date-picker__header-label:focus-visible{outline:0;color:var(--el-datepicker-hover-text-color)}.el-date-picker__header-label.active{color:var(--el-datepicker-active-color)}.el-date-picker__prev-btn{float:left}.el-date-picker__next-btn{float:right}.el-date-picker__time-wrap{padding:10px;text-align:center}.el-date-picker__time-label{float:left;cursor:pointer;line-height:30px;margin-left:10px}.el-date-picker .el-time-panel{position:absolute}.el-date-range-picker{--el-datepicker-text-color:var(--el-text-color-regular);--el-datepicker-off-text-color:var(--el-text-color-placeholder);--el-datepicker-header-text-color:var(--el-text-color-regular);--el-datepicker-icon-color:var(--el-text-color-primary);--el-datepicker-border-color:var(--el-disabled-border-color);--el-datepicker-inner-border-color:var(--el-border-color-light);--el-datepicker-inrange-bg-color:var(--el-border-color-extra-light);--el-datepicker-inrange-hover-bg-color:var(--el-border-color-extra-light);--el-datepicker-active-color:var(--el-color-primary);--el-datepicker-hover-text-color:var(--el-color-primary)}.el-date-range-picker{width:646px}.el-date-range-picker.has-sidebar{width:756px}.el-date-range-picker.has-time .el-picker-panel__body-wrapper{position:relative}.el-date-range-picker table{table-layout:fixed;width:100%}.el-date-range-picker .el-picker-panel__body{min-width:513px}.el-date-range-picker .el-picker-panel__content{margin:0}.el-date-range-picker__header{position:relative;text-align:center;height:28px}.el-date-range-picker__header [class*=arrow-left]{float:left}.el-date-range-picker__header [class*=arrow-right]{float:right}.el-date-range-picker__header div{font-size:16px;font-weight:500;margin-right:50px}.el-date-range-picker__content{float:left;width:50%;box-sizing:border-box;margin:0;padding:16px}.el-date-range-picker__content.is-left{border-right:1px solid var(--el-datepicker-inner-border-color)}.el-date-range-picker__content .el-date-range-picker__header div{margin-left:50px;margin-right:50px}.el-date-range-picker__editors-wrap{box-sizing:border-box;display:table-cell}.el-date-range-picker__editors-wrap.is-right{text-align:right}.el-date-range-picker__time-header{position:relative;border-bottom:1px solid var(--el-datepicker-inner-border-color);font-size:12px;padding:8px 5px 5px;display:table;width:100%;box-sizing:border-box}.el-date-range-picker__time-header>.el-icon-arrow-right{font-size:20px;vertical-align:middle;display:table-cell;color:var(--el-datepicker-icon-color)}.el-date-range-picker__time-picker-wrap{position:relative;display:table-cell;padding:0 5px}.el-date-range-picker__time-picker-wrap .el-picker-panel{position:absolute;top:13px;right:0;z-index:1;background:#fff}.el-date-range-picker__time-picker-wrap .el-time-panel{position:absolute}.el-time-range-picker{width:354px;overflow:visible}.el-time-range-picker__content{position:relative;text-align:center;padding:10px;z-index:1}.el-time-range-picker__cell{box-sizing:border-box;margin:0;padding:4px 7px 7px;width:50%;display:inline-block}.el-time-range-picker__header{margin-bottom:5px;text-align:center;font-size:14px}.el-time-range-picker__body{border-radius:2px;border:1px solid var(--el-datepicker-border-color)}.el-time-panel{border-radius:2px;position:relative;width:180px;left:0;z-index:var(--el-index-top);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;box-sizing:content-box}.el-time-panel__content{font-size:0;position:relative;overflow:hidden}.el-time-panel__content:after,.el-time-panel__content:before{content:\"\";top:50%;position:absolute;margin-top:-16px;height:32px;z-index:-1;left:0;right:0;box-sizing:border-box;padding-top:6px;text-align:left}.el-time-panel__content:after{left:50%;margin-left:12%;margin-right:12%}.el-time-panel__content:before{padding-left:50%;margin-right:12%;margin-left:12%;border-top:1px solid var(--el-border-color-light);border-bottom:1px solid var(--el-border-color-light)}.el-time-panel__content.has-seconds:after{left:66.6666666667%}.el-time-panel__content.has-seconds:before{padding-left:33.3333333333%}.el-time-panel__footer{border-top:1px solid var(--el-timepicker-inner-border-color,var(--el-border-color-light));padding:4px;height:36px;line-height:25px;text-align:right;box-sizing:border-box}.el-time-panel__btn{border:none;line-height:28px;padding:0 5px;margin:0 5px;cursor:pointer;background-color:transparent;outline:0;font-size:12px;color:var(--el-text-color-primary)}.el-time-panel__btn.confirm{font-weight:800;color:var(--el-timepicker-active-color,var(--el-color-primary))}.el-descriptions{--el-descriptions-table-border:1px solid var(--el-border-color-lighter);--el-descriptions-item-bordered-label-background:var(--el-fill-color-light);box-sizing:border-box;font-size:var(--el-font-size-base);color:var(--el-text-color-primary)}.el-descriptions__header{display:flex;justify-content:space-between;align-items:center;margin-bottom:16px}.el-descriptions__title{color:var(--el-text-color-primary);font-size:16px;font-weight:700}.el-descriptions__body{background-color:var(--el-fill-color-blank)}.el-descriptions__body .el-descriptions__table{border-collapse:collapse;width:100%}.el-descriptions__body .el-descriptions__table .el-descriptions__cell{box-sizing:border-box;text-align:left;font-weight:400;line-height:23px;font-size:14px}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-left{text-align:left}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-center{text-align:center}.el-descriptions__body .el-descriptions__table .el-descriptions__cell.is-right{text-align:right}.el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{border:var(--el-descriptions-table-border);padding:8px 11px}.el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:12px}.el-descriptions--large{font-size:14px}.el-descriptions--large .el-descriptions__header{margin-bottom:20px}.el-descriptions--large .el-descriptions__header .el-descriptions__title{font-size:16px}.el-descriptions--large .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:14px}.el-descriptions--large .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:12px 15px}.el-descriptions--large .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:16px}.el-descriptions--small{font-size:12px}.el-descriptions--small .el-descriptions__header{margin-bottom:12px}.el-descriptions--small .el-descriptions__header .el-descriptions__title{font-size:14px}.el-descriptions--small .el-descriptions__body .el-descriptions__table .el-descriptions__cell{font-size:12px}.el-descriptions--small .el-descriptions__body .el-descriptions__table.is-bordered .el-descriptions__cell{padding:4px 7px}.el-descriptions--small .el-descriptions__body .el-descriptions__table:not(.is-bordered) .el-descriptions__cell{padding-bottom:8px}.el-descriptions__label.el-descriptions__cell.is-bordered-label{font-weight:700;color:var(--el-text-color-regular);background:var(--el-descriptions-item-bordered-label-background)}.el-descriptions__label:not(.is-bordered-label){color:var(--el-text-color-primary);margin-right:16px}.el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:6px}.el-descriptions__content.el-descriptions__cell.is-bordered-content{color:var(--el-text-color-primary)}.el-descriptions__content:not(.is-bordered-label){color:var(--el-text-color-regular)}.el-descriptions--large .el-descriptions__label:not(.is-bordered-label){margin-right:16px}.el-descriptions--large .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:8px}.el-descriptions--small .el-descriptions__label:not(.is-bordered-label){margin-right:12px}.el-descriptions--small .el-descriptions__label.el-descriptions__cell:not(.is-bordered-label).is-vertical-label{padding-bottom:4px}:root{--el-popup-modal-bg-color:var(--el-color-black);--el-popup-modal-opacity:.5}.v-modal-enter{-webkit-animation:v-modal-in var(--el-transition-duration-fast) ease;animation:v-modal-in var(--el-transition-duration-fast) ease}.v-modal-leave{-webkit-animation:v-modal-out var(--el-transition-duration-fast) ease forwards;animation:v-modal-out var(--el-transition-duration-fast) ease forwards}@-webkit-keyframes v-modal-in{0%{opacity:0}}@keyframes v-modal-in{0%{opacity:0}}@-webkit-keyframes v-modal-out{to{opacity:0}}@keyframes v-modal-out{to{opacity:0}}.v-modal{position:fixed;left:0;top:0;width:100%;height:100%;opacity:var(--el-popup-modal-opacity);background:var(--el-popup-modal-bg-color)}.el-popup-parent--hidden{overflow:hidden}.el-dialog{--el-dialog-width:50%;--el-dialog-margin-top:15vh;--el-dialog-bg-color:var(--el-bg-color);--el-dialog-box-shadow:var(--el-box-shadow);--el-dialog-title-font-size:var(--el-font-size-large);--el-dialog-content-font-size:14px;--el-dialog-font-line-height:var(--el-font-line-height-primary);--el-dialog-padding-primary:20px;--el-dialog-border-radius:var(--el-border-radius-small);position:relative;margin:var(--el-dialog-margin-top,15vh) auto 50px;background:var(--el-dialog-bg-color);border-radius:var(--el-dialog-border-radius);box-shadow:var(--el-dialog-box-shadow);box-sizing:border-box;width:var(--el-dialog-width,50%)}.el-dialog:focus{outline:0!important}.el-dialog.is-align-center{margin:auto}.el-dialog.is-fullscreen{--el-dialog-width:100%;--el-dialog-margin-top:0;margin-bottom:0;height:100%;overflow:auto}.el-dialog__wrapper{position:fixed;inset:0;overflow:auto;margin:0}.el-dialog.is-draggable .el-dialog__header{cursor:move;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-dialog__header{padding:var(--el-dialog-padding-primary);padding-bottom:10px;margin-right:16px;word-break:break-all}.el-dialog__headerbtn{position:absolute;top:6px;right:0;padding:0;width:54px;height:54px;background:0 0;border:none;outline:0;cursor:pointer;font-size:var(--el-message-close-size,16px)}.el-dialog__headerbtn .el-dialog__close{color:var(--el-color-info);font-size:inherit}.el-dialog__headerbtn:focus .el-dialog__close,.el-dialog__headerbtn:hover .el-dialog__close{color:var(--el-color-primary)}.el-dialog__title{line-height:var(--el-dialog-font-line-height);font-size:var(--el-dialog-title-font-size);color:var(--el-text-color-primary)}.el-dialog__body{padding:calc(var(--el-dialog-padding-primary) + 10px) var(--el-dialog-padding-primary);color:var(--el-text-color-regular);font-size:var(--el-dialog-content-font-size);word-break:break-all}.el-dialog__footer{padding:var(--el-dialog-padding-primary);padding-top:10px;text-align:right;box-sizing:border-box}.el-dialog--center{text-align:center}.el-dialog--center .el-dialog__body{text-align:initial;padding:25px calc(var(--el-dialog-padding-primary) + 5px) 30px}.el-dialog--center .el-dialog__footer{text-align:inherit}.el-overlay-dialog{position:fixed;inset:0;overflow:auto}.dialog-fade-enter-active{-webkit-animation:modal-fade-in var(--el-transition-duration);animation:modal-fade-in var(--el-transition-duration)}.dialog-fade-enter-active .el-overlay-dialog{-webkit-animation:dialog-fade-in var(--el-transition-duration);animation:dialog-fade-in var(--el-transition-duration)}.dialog-fade-leave-active{-webkit-animation:modal-fade-out var(--el-transition-duration);animation:modal-fade-out var(--el-transition-duration)}.dialog-fade-leave-active .el-overlay-dialog{-webkit-animation:dialog-fade-out var(--el-transition-duration);animation:dialog-fade-out var(--el-transition-duration)}@-webkit-keyframes dialog-fade-in{0%{transform:translate3d(0,-20px,0);opacity:0}to{transform:translateZ(0);opacity:1}}@keyframes dialog-fade-in{0%{transform:translate3d(0,-20px,0);opacity:0}to{transform:translateZ(0);opacity:1}}@-webkit-keyframes dialog-fade-out{0%{transform:translateZ(0);opacity:1}to{transform:translate3d(0,-20px,0);opacity:0}}@keyframes dialog-fade-out{0%{transform:translateZ(0);opacity:1}to{transform:translate3d(0,-20px,0);opacity:0}}@-webkit-keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@keyframes modal-fade-in{0%{opacity:0}to{opacity:1}}@-webkit-keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}@keyframes modal-fade-out{0%{opacity:1}to{opacity:0}}.el-divider{position:relative}.el-divider--horizontal{display:block;height:1px;width:100%;margin:24px 0;border-top:1px var(--el-border-color) var(--el-border-style)}.el-divider--vertical{display:inline-block;width:1px;height:1em;margin:0 8px;vertical-align:middle;position:relative;border-left:1px var(--el-border-color) var(--el-border-style)}.el-divider__text{position:absolute;background-color:var(--el-bg-color);padding:0 20px;font-weight:500;color:var(--el-text-color-primary);font-size:14px}.el-divider__text.is-left{left:20px;transform:translateY(-50%)}.el-divider__text.is-center{left:50%;transform:translate(-50%) translateY(-50%)}.el-divider__text.is-right{right:20px;transform:translateY(-50%)}.el-drawer{--el-drawer-bg-color:var(--el-dialog-bg-color, var(--el-bg-color));--el-drawer-padding-primary:var(--el-dialog-padding-primary, 20px)}.el-drawer{position:absolute;box-sizing:border-box;background-color:var(--el-drawer-bg-color);display:flex;flex-direction:column;box-shadow:var(--el-box-shadow-dark);overflow:hidden;transition:all var(--el-transition-duration)}.el-drawer .rtl,.el-drawer .ltr,.el-drawer .ttb,.el-drawer .btt{transform:translate(0)}.el-drawer__sr-focus:focus{outline:0!important}.el-drawer__header{align-items:center;color:#72767b;display:flex;margin-bottom:32px;padding:var(--el-drawer-padding-primary);padding-bottom:0}.el-drawer__header>:first-child{flex:1}.el-drawer__title{margin:0;flex:1;line-height:inherit;font-size:1rem}.el-drawer__footer{padding:var(--el-drawer-padding-primary);padding-top:10px;text-align:right}.el-drawer__close-btn{border:none;cursor:pointer;font-size:var(--el-font-size-extra-large);color:inherit;background-color:transparent;outline:0}.el-drawer__close-btn:focus i,.el-drawer__close-btn:hover i{color:var(--el-color-primary)}.el-drawer__close-btn .el-icon{font-size:inherit;vertical-align:text-bottom}.el-drawer__body{flex:1;padding:var(--el-drawer-padding-primary);overflow:auto}.el-drawer__body>*{box-sizing:border-box}.el-drawer.ltr,.el-drawer.rtl{height:100%;top:0;bottom:0}.el-drawer.btt,.el-drawer.ttb{width:100%;left:0;right:0}.el-drawer.ltr{left:0}.el-drawer.rtl{right:0}.el-drawer.ttb{top:0}.el-drawer.btt{bottom:0}.el-drawer-fade-enter-active,.el-drawer-fade-leave-active{transition:all var(--el-transition-duration)}.el-drawer-fade-enter-active,.el-drawer-fade-enter-from,.el-drawer-fade-enter-to,.el-drawer-fade-leave-active,.el-drawer-fade-leave-from,.el-drawer-fade-leave-to{overflow:hidden!important}.el-drawer-fade-enter-from,.el-drawer-fade-leave-to{opacity:0}.el-drawer-fade-enter-to,.el-drawer-fade-leave-from{opacity:1}.el-drawer-fade-enter-from .rtl,.el-drawer-fade-leave-to .rtl{transform:translate(100%)}.el-drawer-fade-enter-from .ltr,.el-drawer-fade-leave-to .ltr{transform:translate(-100%)}.el-drawer-fade-enter-from .ttb,.el-drawer-fade-leave-to .ttb{transform:translateY(-100%)}.el-drawer-fade-enter-from .btt,.el-drawer-fade-leave-to .btt{transform:translateY(100%)}.el-dropdown{--el-dropdown-menu-box-shadow:var(--el-box-shadow-light);--el-dropdown-menuItem-hover-fill:var(--el-color-primary-light-9);--el-dropdown-menuItem-hover-color:var(--el-color-primary);--el-dropdown-menu-index:10;display:inline-flex;position:relative;color:var(--el-text-color-regular);font-size:var(--el-font-size-base);line-height:1;vertical-align:top}.el-dropdown.is-disabled{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-dropdown__popper{--el-dropdown-menu-box-shadow:var(--el-box-shadow-light);--el-dropdown-menuItem-hover-fill:var(--el-color-primary-light-9);--el-dropdown-menuItem-hover-color:var(--el-color-primary);--el-dropdown-menu-index:10}.el-dropdown__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);box-shadow:var(--el-dropdown-menu-box-shadow)}.el-dropdown__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-dropdown__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:transparent;border-left-color:transparent}.el-dropdown__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-dropdown__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-left-color:transparent;border-bottom-color:transparent}.el-dropdown__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-dropdown__popper .el-dropdown-menu{border:none}.el-dropdown__popper .el-dropdown__popper-selfdefine{outline:0}.el-dropdown__popper .el-scrollbar__bar{z-index:calc(var(--el-dropdown-menu-index) + 1)}.el-dropdown__popper .el-dropdown__list{list-style:none;padding:0;margin:0;box-sizing:border-box}.el-dropdown .el-dropdown__caret-button{padding-left:0;padding-right:0;display:inline-flex;justify-content:center;align-items:center;width:32px;border-left:none}.el-dropdown .el-dropdown__caret-button>span{display:inline-flex}.el-dropdown .el-dropdown__caret-button:before{content:\"\";position:absolute;display:block;width:1px;top:-1px;bottom:-1px;left:0;background:var(--el-overlay-color-lighter)}.el-dropdown .el-dropdown__caret-button.el-button:before{background:var(--el-border-color);opacity:.5}.el-dropdown .el-dropdown__caret-button .el-dropdown__icon{font-size:inherit;padding-left:0}.el-dropdown .el-dropdown-selfdefine{outline:0}.el-dropdown--large .el-dropdown__caret-button{width:40px}.el-dropdown--small .el-dropdown__caret-button{width:24px}.el-dropdown-menu{position:relative;top:0;left:0;z-index:var(--el-dropdown-menu-index);padding:5px 0;margin:0;background-color:var(--el-bg-color-overlay);border:none;border-radius:var(--el-border-radius-base);box-shadow:none;list-style:none}.el-dropdown-menu__item{display:flex;align-items:center;white-space:nowrap;list-style:none;line-height:22px;padding:5px 16px;margin:0;font-size:var(--el-font-size-base);color:var(--el-text-color-regular);cursor:pointer;outline:0}.el-dropdown-menu__item:not(.is-disabled):focus{background-color:var(--el-dropdown-menuItem-hover-fill);color:var(--el-dropdown-menuItem-hover-color)}.el-dropdown-menu__item i{margin-right:5px}.el-dropdown-menu__item--divided{margin:6px 0;border-top:1px solid var(--el-border-color-lighter)}.el-dropdown-menu__item.is-disabled{cursor:not-allowed;color:var(--el-text-color-disabled)}.el-dropdown-menu--large{padding:7px 0}.el-dropdown-menu--large .el-dropdown-menu__item{padding:7px 20px;line-height:22px;font-size:14px}.el-dropdown-menu--large .el-dropdown-menu__item--divided{margin:8px 0}.el-dropdown-menu--small{padding:3px 0}.el-dropdown-menu--small .el-dropdown-menu__item{padding:2px 12px;line-height:20px;font-size:12px}.el-dropdown-menu--small .el-dropdown-menu__item--divided{margin:4px 0}.el-empty{--el-empty-padding:40px 0;--el-empty-image-width:160px;--el-empty-description-margin-top:20px;--el-empty-bottom-margin-top:20px;--el-empty-fill-color-0:var(--el-color-white);--el-empty-fill-color-1:#fcfcfd;--el-empty-fill-color-2:#f8f9fb;--el-empty-fill-color-3:#f7f8fc;--el-empty-fill-color-4:#eeeff3;--el-empty-fill-color-5:#edeef2;--el-empty-fill-color-6:#e9ebef;--el-empty-fill-color-7:#e5e7e9;--el-empty-fill-color-8:#e0e3e9;--el-empty-fill-color-9:#d5d7de;display:flex;justify-content:center;align-items:center;flex-direction:column;text-align:center;box-sizing:border-box;padding:var(--el-empty-padding)}.el-empty__image{width:var(--el-empty-image-width)}.el-empty__image img{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;width:100%;height:100%;vertical-align:top;-o-object-fit:contain;object-fit:contain}.el-empty__image svg{color:var(--el-svg-monochrome-grey);fill:currentColor;width:100%;height:100%;vertical-align:top}.el-empty__description{margin-top:var(--el-empty-description-margin-top)}.el-empty__description p{margin:0;font-size:var(--el-font-size-base);color:var(--el-text-color-secondary)}.el-empty__bottom{margin-top:var(--el-empty-bottom-margin-top)}.el-footer{--el-footer-padding:0 20px;--el-footer-height:60px;padding:var(--el-footer-padding);box-sizing:border-box;flex-shrink:0;height:var(--el-footer-height)}.el-form{--el-form-label-font-size:var(--el-font-size-base)}.el-form--label-left .el-form-item__label{justify-content:flex-start}.el-form--label-top .el-form-item{display:block}.el-form--label-top .el-form-item .el-form-item__label{display:block;height:auto;text-align:left;margin-bottom:8px;line-height:22px}.el-form--inline .el-form-item{display:inline-flex;vertical-align:middle;margin-right:32px}.el-form--inline.el-form--label-top{display:flex;flex-wrap:wrap}.el-form--inline.el-form--label-top .el-form-item{display:block}.el-form--large.el-form--label-top .el-form-item .el-form-item__label{margin-bottom:12px;line-height:22px}.el-form--default.el-form--label-top .el-form-item .el-form-item__label{margin-bottom:8px;line-height:22px}.el-form--small.el-form--label-top .el-form-item .el-form-item__label{margin-bottom:4px;line-height:20px}.el-form-item{display:flex;--font-size:14px;margin-bottom:18px}.el-form-item .el-form-item{margin-bottom:0}.el-form-item .el-input__validateIcon{display:none}.el-form-item--large{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:22px}.el-form-item--large .el-form-item__label{height:40px;line-height:40px}.el-form-item--large .el-form-item__content{line-height:40px}.el-form-item--large .el-form-item__error{padding-top:4px}.el-form-item--default{--font-size:14px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--default .el-form-item__label{height:32px;line-height:32px}.el-form-item--default .el-form-item__content{line-height:32px}.el-form-item--default .el-form-item__error{padding-top:2px}.el-form-item--small{--font-size:12px;--el-form-label-font-size:var(--font-size);margin-bottom:18px}.el-form-item--small .el-form-item__label{height:24px;line-height:24px}.el-form-item--small .el-form-item__content{line-height:24px}.el-form-item--small .el-form-item__error{padding-top:2px}.el-form-item__label-wrap{display:flex}.el-form-item__label{display:inline-flex;justify-content:flex-end;align-items:flex-start;flex:0 0 auto;font-size:var(--el-form-label-font-size);color:var(--el-text-color-regular);height:32px;line-height:32px;padding:0 12px 0 0;box-sizing:border-box}.el-form-item__content{display:flex;flex-wrap:wrap;align-items:center;flex:1;line-height:32px;position:relative;font-size:var(--font-size);min-width:0}.el-form-item__content .el-input-group{vertical-align:top}.el-form-item__error{color:var(--el-color-danger);font-size:12px;line-height:1;padding-top:2px;position:absolute;top:100%;left:0}.el-form-item__error--inline{position:relative;top:auto;left:auto;display:inline-block;margin-left:10px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label-wrap>.el-form-item__label:before,.el-form-item.is-required:not(.is-no-asterisk).asterisk-left>.el-form-item__label:before{content:\"*\";color:var(--el-color-danger);margin-right:4px}.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label-wrap>.el-form-item__label:after,.el-form-item.is-required:not(.is-no-asterisk).asterisk-right>.el-form-item__label:after{content:\"*\";color:var(--el-color-danger);margin-left:4px}.el-form-item.is-error .el-select-v2__wrapper,.el-form-item.is-error .el-select-v2__wrapper:focus,.el-form-item.is-error .el-textarea__inner,.el-form-item.is-error .el-textarea__inner:focus{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-input__wrapper{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-form-item.is-error .el-input-group__append .el-input__wrapper,.el-form-item.is-error .el-input-group__prepend .el-input__wrapper{box-shadow:0 0 0 1px transparent inset}.el-form-item.is-error .el-input__validateIcon{color:var(--el-color-danger)}.el-form-item--feedback .el-input__validateIcon{display:inline-flex}.el-header{--el-header-padding:0 20px;--el-header-height:60px;padding:var(--el-header-padding);box-sizing:border-box;flex-shrink:0;height:var(--el-header-height)}.el-image-viewer__wrapper{position:fixed;inset:0}.el-image-viewer__btn{position:absolute;z-index:1;display:flex;align-items:center;justify-content:center;border-radius:50%;opacity:.8;cursor:pointer;box-sizing:border-box;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-image-viewer__btn .el-icon{font-size:inherit;cursor:pointer}.el-image-viewer__close{top:40px;right:40px;width:40px;height:40px;font-size:40px}.el-image-viewer__canvas{width:100%;height:100%;display:flex;justify-content:center;align-items:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-image-viewer__actions{left:50%;bottom:30px;transform:translate(-50%);width:282px;height:44px;padding:0 23px;background-color:var(--el-text-color-regular);border-color:#fff;border-radius:22px}.el-image-viewer__actions__inner{width:100%;height:100%;text-align:justify;cursor:default;font-size:23px;color:#fff;display:flex;align-items:center;justify-content:space-around}.el-image-viewer__prev{top:50%;transform:translateY(-50%);left:40px;width:44px;height:44px;font-size:24px;color:#fff;background-color:var(--el-text-color-regular);border-color:#fff}.el-image-viewer__next{top:50%;transform:translateY(-50%);right:40px;text-indent:2px;width:44px;height:44px;font-size:24px;color:#fff;background-color:var(--el-text-color-regular);border-color:#fff}.el-image-viewer__close{width:44px;height:44px;font-size:24px;color:#fff;background-color:var(--el-text-color-regular);border-color:#fff}.el-image-viewer__mask{position:absolute;width:100%;height:100%;top:0;left:0;opacity:.5;background:#000}.viewer-fade-enter-active{-webkit-animation:viewer-fade-in var(--el-transition-duration);animation:viewer-fade-in var(--el-transition-duration)}.viewer-fade-leave-active{-webkit-animation:viewer-fade-out var(--el-transition-duration);animation:viewer-fade-out var(--el-transition-duration)}@-webkit-keyframes viewer-fade-in{0%{transform:translate3d(0,-20px,0);opacity:0}to{transform:translateZ(0);opacity:1}}@keyframes viewer-fade-in{0%{transform:translate3d(0,-20px,0);opacity:0}to{transform:translateZ(0);opacity:1}}@-webkit-keyframes viewer-fade-out{0%{transform:translateZ(0);opacity:1}to{transform:translate3d(0,-20px,0);opacity:0}}@keyframes viewer-fade-out{0%{transform:translateZ(0);opacity:1}to{transform:translate3d(0,-20px,0);opacity:0}}.el-image__error,.el-image__inner,.el-image__placeholder,.el-image__wrapper{width:100%;height:100%}.el-image{position:relative;display:inline-block;overflow:hidden}.el-image__inner{vertical-align:top;opacity:1}.el-image__inner.is-loading{opacity:0}.el-image__wrapper{position:absolute;top:0;left:0}.el-image__placeholder{background:var(--el-fill-color-light)}.el-image__error{display:flex;justify-content:center;align-items:center;font-size:14px;background:var(--el-fill-color-light);color:var(--el-text-color-placeholder);vertical-align:middle}.el-image__preview{cursor:pointer}.el-input-number{position:relative;display:inline-block;width:150px;line-height:30px}.el-input-number .el-input__wrapper{padding-left:42px;padding-right:42px}.el-input-number .el-input__inner{-webkit-appearance:none;-moz-appearance:textfield;text-align:center;line-height:1}.el-input-number .el-input__inner::-webkit-inner-spin-button,.el-input-number .el-input__inner::-webkit-outer-spin-button{margin:0;-webkit-appearance:none}.el-input-number__decrease,.el-input-number__increase{display:flex;justify-content:center;align-items:center;height:auto;position:absolute;z-index:1;top:1px;bottom:1px;width:32px;background:var(--el-fill-color-light);color:var(--el-text-color-regular);cursor:pointer;font-size:13px;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-input-number__decrease:hover,.el-input-number__increase:hover{color:var(--el-color-primary)}.el-input-number__decrease:hover~.el-input:not(.is-disabled) .el-input_wrapper,.el-input-number__increase:hover~.el-input:not(.is-disabled) .el-input_wrapper{box-shadow:0 0 0 1px var(--el-input-focus-border-color,var(--el-color-primary)) inset}.el-input-number__decrease.is-disabled,.el-input-number__increase.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-input-number__increase{right:1px;border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0;border-left:var(--el-border)}.el-input-number__decrease{left:1px;border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);border-right:var(--el-border)}.el-input-number.is-disabled .el-input-number__decrease,.el-input-number.is-disabled .el-input-number__increase{border-color:var(--el-disabled-border-color);color:var(--el-disabled-border-color)}.el-input-number.is-disabled .el-input-number__decrease:hover,.el-input-number.is-disabled .el-input-number__increase:hover{color:var(--el-disabled-border-color);cursor:not-allowed}.el-input-number--large{width:180px;line-height:38px}.el-input-number--large .el-input-number__decrease,.el-input-number--large .el-input-number__increase{width:40px;font-size:14px}.el-input-number--large .el-input__wrapper{padding-left:47px;padding-right:47px}.el-input-number--small{width:120px;line-height:22px}.el-input-number--small .el-input-number__decrease,.el-input-number--small .el-input-number__increase{width:24px;font-size:12px}.el-input-number--small .el-input__wrapper{padding-left:31px;padding-right:31px}.el-input-number--small .el-input-number__decrease [class*=el-icon],.el-input-number--small .el-input-number__increase [class*=el-icon]{transform:scale(.9)}.el-input-number.is-without-controls .el-input__wrapper{padding-left:15px;padding-right:15px}.el-input-number.is-controls-right .el-input__wrapper{padding-left:15px;padding-right:42px}.el-input-number.is-controls-right .el-input-number__decrease,.el-input-number.is-controls-right .el-input-number__increase{--el-input-number-controls-height:15px;height:var(--el-input-number-controls-height);line-height:var(--el-input-number-controls-height)}.el-input-number.is-controls-right .el-input-number__decrease [class*=el-icon],.el-input-number.is-controls-right .el-input-number__increase [class*=el-icon]{transform:scale(.8)}.el-input-number.is-controls-right .el-input-number__increase{bottom:auto;left:auto;border-radius:0 var(--el-border-radius-base) 0 0;border-bottom:var(--el-border)}.el-input-number.is-controls-right .el-input-number__decrease{right:1px;top:auto;left:auto;border-right:none;border-left:var(--el-border);border-radius:0 0 var(--el-border-radius-base) 0}.el-input-number.is-controls-right[class*=large] [class*=decrease],.el-input-number.is-controls-right[class*=large] [class*=increase]{--el-input-number-controls-height:19px}.el-input-number.is-controls-right[class*=small] [class*=decrease],.el-input-number.is-controls-right[class*=small] [class*=increase]{--el-input-number-controls-height:11px}.el-textarea{--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary)}.el-textarea{position:relative;display:inline-block;width:100%;vertical-align:bottom;font-size:var(--el-font-size-base)}.el-textarea__inner{position:relative;display:block;resize:vertical;padding:5px 11px;line-height:1.5;box-sizing:border-box;width:100%;font-size:inherit;font-family:inherit;color:var(--el-input-text-color,var(--el-text-color-regular));background-color:var(--el-input-bg-color,var(--el-fill-color-blank));background-image:none;-webkit-appearance:none;box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset;border-radius:var(--el-input-border-radius,var(--el-border-radius-base));transition:var(--el-transition-box-shadow);border:none}.el-textarea__inner::-moz-placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-textarea__inner:-ms-input-placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-textarea__inner::placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-textarea__inner:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-textarea__inner:focus{outline:0;box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-textarea .el-input__count{color:var(--el-color-info);background:var(--el-fill-color-blank);position:absolute;font-size:12px;line-height:14px;bottom:5px;right:10px}.el-textarea.is-disabled .el-textarea__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color);color:var(--el-disabled-text-color);cursor:not-allowed}.el-textarea.is-disabled .el-textarea__inner::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-disabled .el-textarea__inner:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-disabled .el-textarea__inner::placeholder{color:var(--el-text-color-placeholder)}.el-textarea.is-exceed .el-textarea__inner{border-color:var(--el-color-danger)}.el-textarea.is-exceed .el-input__count{color:var(--el-color-danger)}.el-input{--el-input-text-color:var(--el-text-color-regular);--el-input-border:var(--el-border);--el-input-hover-border:var(--el-border-color-hover);--el-input-focus-border:var(--el-color-primary);--el-input-transparent-border:0 0 0 1px transparent inset;--el-input-border-color:var(--el-border-color);--el-input-border-radius:var(--el-border-radius-base);--el-input-bg-color:var(--el-fill-color-blank);--el-input-icon-color:var(--el-text-color-placeholder);--el-input-placeholder-color:var(--el-text-color-placeholder);--el-input-hover-border-color:var(--el-border-color-hover);--el-input-clear-hover-color:var(--el-text-color-secondary);--el-input-focus-border-color:var(--el-color-primary)}.el-input{--el-input-height:var(--el-component-size);position:relative;font-size:var(--el-font-size-base);display:inline-flex;width:100%;line-height:var(--el-input-height);box-sizing:border-box;vertical-align:middle}.el-input::-webkit-scrollbar{z-index:11;width:6px}.el-input::-webkit-scrollbar:horizontal{height:6px}.el-input::-webkit-scrollbar-thumb{border-radius:5px;width:6px;background:var(--el-text-color-disabled)}.el-input::-webkit-scrollbar-corner{background:var(--el-fill-color-blank)}.el-input::-webkit-scrollbar-track{background:var(--el-fill-color-blank)}.el-input::-webkit-scrollbar-track-piece{background:var(--el-fill-color-blank);width:6px}.el-input .el-input__clear,.el-input .el-input__password{color:var(--el-input-icon-color);font-size:14px;cursor:pointer}.el-input .el-input__clear:hover,.el-input .el-input__password:hover{color:var(--el-input-clear-hover-color)}.el-input .el-input__count{height:100%;display:inline-flex;align-items:center;color:var(--el-color-info);font-size:12px}.el-input .el-input__count .el-input__count-inner{background:var(--el-fill-color-blank);line-height:initial;display:inline-block;padding-left:8px}.el-input__wrapper{display:inline-flex;flex-grow:1;align-items:center;justify-content:center;padding:1px 11px;background-color:var(--el-input-bg-color,var(--el-fill-color-blank));background-image:none;border-radius:var(--el-input-border-radius,var(--el-border-radius-base));transition:var(--el-transition-box-shadow);box-shadow:0 0 0 1px var(--el-input-border-color,var(--el-border-color)) inset}.el-input__wrapper:hover{box-shadow:0 0 0 1px var(--el-input-hover-border-color) inset}.el-input__wrapper.is-focus{box-shadow:0 0 0 1px var(--el-input-focus-border-color) inset}.el-input__inner{--el-input-inner-height:calc(var(--el-input-height, 32px) - 2px);width:100%;flex-grow:1;-webkit-appearance:none;color:var(--el-input-text-color,var(--el-text-color-regular));font-size:inherit;height:var(--el-input-inner-height);line-height:var(--el-input-inner-height);padding:0;outline:0;border:none;background:0 0;box-sizing:border-box}.el-input__inner:focus{outline:0}.el-input__inner::-moz-placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-input__inner:-ms-input-placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-input__inner::placeholder{color:var(--el-input-placeholder-color,var(--el-text-color-placeholder))}.el-input__inner[type=password]::-ms-reveal{display:none}.el-input__prefix{display:inline-flex;white-space:nowrap;flex-shrink:0;flex-wrap:nowrap;height:100%;text-align:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));transition:all var(--el-transition-duration);pointer-events:none}.el-input__prefix-inner{pointer-events:all;display:inline-flex;align-items:center;justify-content:center}.el-input__prefix-inner>:last-child{margin-right:8px}.el-input__prefix-inner>:first-child,.el-input__prefix-inner>:first-child.el-input__icon{margin-left:0}.el-input__suffix{display:inline-flex;white-space:nowrap;flex-shrink:0;flex-wrap:nowrap;height:100%;text-align:center;color:var(--el-input-icon-color,var(--el-text-color-placeholder));transition:all var(--el-transition-duration);pointer-events:none}.el-input__suffix-inner{pointer-events:all;display:inline-flex;align-items:center;justify-content:center}.el-input__suffix-inner>:first-child{margin-left:8px}.el-input .el-input__icon{height:inherit;line-height:inherit;display:flex;justify-content:center;align-items:center;transition:all var(--el-transition-duration);margin-left:8px}.el-input__validateIcon{pointer-events:none}.el-input.is-active .el-input__wrapper{box-shadow:0 0 0 1px var(--el-input-focus-color,) inset}.el-input.is-disabled{cursor:not-allowed}.el-input.is-disabled .el-input__wrapper{background-color:var(--el-disabled-bg-color);box-shadow:0 0 0 1px var(--el-disabled-border-color) inset}.el-input.is-disabled .el-input__inner{color:var(--el-disabled-text-color);-webkit-text-fill-color:var(--el-disabled-text-color);cursor:not-allowed}.el-input.is-disabled .el-input__inner::-moz-placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__inner:-ms-input-placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__inner::placeholder{color:var(--el-text-color-placeholder)}.el-input.is-disabled .el-input__icon{cursor:not-allowed}.el-input.is-exceed .el-input__wrapper{box-shadow:0 0 0 1px var(--el-color-danger) inset}.el-input.is-exceed .el-input__suffix .el-input__count{color:var(--el-color-danger)}.el-input--large{--el-input-height:var(--el-component-size-large);font-size:14px}.el-input--large .el-input__wrapper{padding:1px 15px}.el-input--large .el-input__inner{--el-input-inner-height:calc(var(--el-input-height, 40px) - 2px)}.el-input--small{--el-input-height:var(--el-component-size-small);font-size:12px}.el-input--small .el-input__wrapper{padding:1px 7px}.el-input--small .el-input__inner{--el-input-inner-height:calc(var(--el-input-height, 24px) - 2px)}.el-input-group{display:inline-flex;width:100%;align-items:stretch}.el-input-group__append,.el-input-group__prepend{background-color:var(--el-fill-color-light);color:var(--el-color-info);position:relative;display:inline-flex;align-items:center;justify-content:center;min-height:100%;border-radius:var(--el-input-border-radius);padding:0 20px;white-space:nowrap}.el-input-group__append:focus,.el-input-group__prepend:focus{outline:0}.el-input-group__append .el-button,.el-input-group__append .el-select,.el-input-group__prepend .el-button,.el-input-group__prepend .el-select{display:inline-block;margin:0 -20px}.el-input-group__append button.el-button,.el-input-group__append button.el-button:hover,.el-input-group__append div.el-select .el-input__wrapper,.el-input-group__append div.el-select:hover .el-input__wrapper,.el-input-group__prepend button.el-button,.el-input-group__prepend button.el-button:hover,.el-input-group__prepend div.el-select .el-input__wrapper,.el-input-group__prepend div.el-select:hover .el-input__wrapper{border-color:transparent;background-color:transparent;color:inherit}.el-input-group__append .el-button,.el-input-group__append .el-input,.el-input-group__prepend .el-button,.el-input-group__prepend .el-input{font-size:inherit}.el-input-group__prepend{border-right:0;border-top-right-radius:0;border-bottom-right-radius:0;box-shadow:1px 0 0 0 var(--el-input-border-color) inset,0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset}.el-input-group__append{border-left:0;border-top-left-radius:0;border-bottom-left-radius:0;box-shadow:0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset,-1px 0 0 0 var(--el-input-border-color) inset}.el-input-group--prepend>.el-input__wrapper{border-top-left-radius:0;border-bottom-left-radius:0}.el-input-group--prepend .el-input-group__prepend .el-select .el-input .el-input__inner{box-shadow:none!important}.el-input-group--prepend .el-input-group__prepend .el-select .el-input .el-input__wrapper{border-top-right-radius:0;border-bottom-right-radius:0;box-shadow:1px 0 0 0 var(--el-input-border-color) inset,0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset}.el-input-group--prepend .el-input-group__prepend .el-select .el-input.is-focus .el-input__inner{box-shadow:none!important}.el-input-group--prepend .el-input-group__prepend .el-select .el-input.is-focus .el-input__wrapper{box-shadow:1px 0 0 0 var(--el-input-focus-border-color) inset,1px 0 0 0 var(--el-input-focus-border-color),0 1px 0 0 var(--el-input-focus-border-color) inset,0 -1px 0 0 var(--el-input-focus-border-color) inset!important;z-index:2}.el-input-group--prepend .el-input-group__prepend .el-select .el-input.is-focus .el-input__wrapper:focus{outline:0;z-index:2;box-shadow:1px 0 0 0 var(--el-input-focus-border-color) inset,1px 0 0 0 var(--el-input-focus-border-color),0 1px 0 0 var(--el-input-focus-border-color) inset,0 -1px 0 0 var(--el-input-focus-border-color) inset!important}.el-input-group--prepend .el-input-group__prepend .el-select:hover .el-input__inner{box-shadow:none!important}.el-input-group--prepend .el-input-group__prepend .el-select:hover .el-input__wrapper{z-index:1;box-shadow:1px 0 0 0 var(--el-input-hover-border-color) inset,1px 0 0 0 var(--el-input-hover-border-color),0 1px 0 0 var(--el-input-hover-border-color) inset,0 -1px 0 0 var(--el-input-hover-border-color) inset!important}.el-input-group--append>.el-input__wrapper{border-top-right-radius:0;border-bottom-right-radius:0}.el-input-group--append .el-input-group__append .el-select .el-input .el-input__inner{box-shadow:none!important}.el-input-group--append .el-input-group__append .el-select .el-input .el-input__wrapper{border-top-left-radius:0;border-bottom-left-radius:0;box-shadow:0 1px 0 0 var(--el-input-border-color) inset,0 -1px 0 0 var(--el-input-border-color) inset,-1px 0 0 0 var(--el-input-border-color) inset}.el-input-group--append .el-input-group__append .el-select .el-input.is-focus .el-input__inner{box-shadow:none!important}.el-input-group--append .el-input-group__append .el-select .el-input.is-focus .el-input__wrapper{z-index:2;box-shadow:-1px 0 0 0 var(--el-input-focus-border-color),-1px 0 0 0 var(--el-input-focus-border-color) inset,0 1px 0 0 var(--el-input-focus-border-color) inset,0 -1px 0 0 var(--el-input-focus-border-color) inset!important}.el-input-group--append .el-input-group__append .el-select:hover .el-input__inner{box-shadow:none!important}.el-input-group--append .el-input-group__append .el-select:hover .el-input__wrapper{z-index:1;box-shadow:-1px 0 0 0 var(--el-input-hover-border-color),-1px 0 0 0 var(--el-input-hover-border-color) inset,0 1px 0 0 var(--el-input-hover-border-color) inset,0 -1px 0 0 var(--el-input-hover-border-color) inset!important}.el-link{--el-link-font-size:var(--el-font-size-base);--el-link-font-weight:var(--el-font-weight-primary);--el-link-text-color:var(--el-text-color-regular);--el-link-hover-text-color:var(--el-color-primary);--el-link-disabled-text-color:var(--el-text-color-placeholder)}.el-link{display:inline-flex;flex-direction:row;align-items:center;justify-content:center;vertical-align:middle;position:relative;text-decoration:none;outline:0;cursor:pointer;padding:0;font-size:var(--el-link-font-size);font-weight:var(--el-link-font-weight);color:var(--el-link-text-color)}.el-link:hover{color:var(--el-link-hover-text-color)}.el-link.is-underline:hover:after{content:\"\";position:absolute;left:0;right:0;height:0;bottom:0;border-bottom:1px solid var(--el-link-hover-text-color)}.el-link.is-disabled{color:var(--el-link-disabled-text-color);cursor:not-allowed}.el-link [class*=el-icon-]+span{margin-left:5px}.el-link.el-link--default:after{border-color:var(--el-link-hover-text-color)}.el-link__inner{display:inline-flex;justify-content:center;align-items:center}.el-link.el-link--primary{--el-link-text-color:var(--el-color-primary);--el-link-hover-text-color:var(--el-color-primary-light-3);--el-link-disabled-text-color:var(--el-color-primary-light-5)}.el-link.el-link--primary:after{border-color:var(--el-link-text-color)}.el-link.el-link--primary.is-underline:hover:after{border-color:var(--el-link-text-color)}.el-link.el-link--success{--el-link-text-color:var(--el-color-success);--el-link-hover-text-color:var(--el-color-success-light-3);--el-link-disabled-text-color:var(--el-color-success-light-5)}.el-link.el-link--success:after{border-color:var(--el-link-text-color)}.el-link.el-link--success.is-underline:hover:after{border-color:var(--el-link-text-color)}.el-link.el-link--warning{--el-link-text-color:var(--el-color-warning);--el-link-hover-text-color:var(--el-color-warning-light-3);--el-link-disabled-text-color:var(--el-color-warning-light-5)}.el-link.el-link--warning:after{border-color:var(--el-link-text-color)}.el-link.el-link--warning.is-underline:hover:after{border-color:var(--el-link-text-color)}.el-link.el-link--danger{--el-link-text-color:var(--el-color-danger);--el-link-hover-text-color:var(--el-color-danger-light-3);--el-link-disabled-text-color:var(--el-color-danger-light-5)}.el-link.el-link--danger:after{border-color:var(--el-link-text-color)}.el-link.el-link--danger.is-underline:hover:after{border-color:var(--el-link-text-color)}.el-link.el-link--error{--el-link-text-color:var(--el-color-error);--el-link-hover-text-color:var(--el-color-error-light-3);--el-link-disabled-text-color:var(--el-color-error-light-5)}.el-link.el-link--error:after{border-color:var(--el-link-text-color)}.el-link.el-link--error.is-underline:hover:after{border-color:var(--el-link-text-color)}.el-link.el-link--info{--el-link-text-color:var(--el-color-info);--el-link-hover-text-color:var(--el-color-info-light-3);--el-link-disabled-text-color:var(--el-color-info-light-5)}.el-link.el-link--info:after{border-color:var(--el-link-text-color)}.el-link.el-link--info.is-underline:hover:after{border-color:var(--el-link-text-color)}:root{--el-loading-spinner-size:42px;--el-loading-fullscreen-spinner-size:50px}.el-loading-parent--relative{position:relative!important;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-loading-parent--hidden{overflow:hidden!important}.el-loading-mask{position:absolute;z-index:2000;background-color:var(--el-mask-color);margin:0;inset:0;transition:opacity var(--el-transition-duration)}.el-loading-mask.is-fullscreen{position:fixed}.el-loading-mask.is-fullscreen .el-loading-spinner{margin-top:calc((0px - var(--el-loading-fullscreen-spinner-size))/ 2)}.el-loading-mask.is-fullscreen .el-loading-spinner .circular{height:var(--el-loading-fullscreen-spinner-size);width:var(--el-loading-fullscreen-spinner-size)}.el-loading-spinner{top:50%;margin-top:calc((0px - var(--el-loading-spinner-size))/ 2);width:100%;text-align:center;position:absolute}.el-loading-spinner .el-loading-text{color:var(--el-color-primary);margin:3px 0;font-size:14px}.el-loading-spinner .circular{display:inline;height:var(--el-loading-spinner-size);width:var(--el-loading-spinner-size);-webkit-animation:loading-rotate 2s linear infinite;animation:loading-rotate 2s linear infinite}.el-loading-spinner .path{-webkit-animation:loading-dash 1.5s ease-in-out infinite;animation:loading-dash 1.5s ease-in-out infinite;stroke-dasharray:90,150;stroke-dashoffset:0;stroke-width:2;stroke:var(--el-color-primary);stroke-linecap:round}.el-loading-spinner i{color:var(--el-color-primary)}.el-loading-fade-enter-from,.el-loading-fade-leave-to{opacity:0}@-webkit-keyframes loading-rotate{to{transform:rotate(360deg)}}@keyframes loading-rotate{to{transform:rotate(360deg)}}@-webkit-keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}@keyframes loading-dash{0%{stroke-dasharray:1,200;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-40px}to{stroke-dasharray:90,150;stroke-dashoffset:-120px}}.el-main{--el-main-padding:20px;display:block;flex:1;flex-basis:auto;overflow:auto;box-sizing:border-box;padding:var(--el-main-padding)}:root{--el-menu-active-color:var(--el-color-primary);--el-menu-text-color:var(--el-text-color-primary);--el-menu-hover-text-color:var(--el-color-primary);--el-menu-bg-color:var(--el-fill-color-blank);--el-menu-hover-bg-color:var(--el-color-primary-light-9);--el-menu-item-height:56px;--el-menu-sub-item-height:calc(var(--el-menu-item-height) - 6px);--el-menu-horizontal-sub-item-height:36px;--el-menu-item-font-size:var(--el-font-size-base);--el-menu-item-hover-fill:var(--el-color-primary-light-9);--el-menu-border-color:var(--el-border-color);--el-menu-base-level-padding:20px;--el-menu-level-padding:20px;--el-menu-icon-width:24px}.el-menu{border-right:solid 1px var(--el-menu-border-color);list-style:none;position:relative;margin:0;padding-left:0;background-color:var(--el-menu-bg-color);box-sizing:border-box}.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-menu-item,.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-menu-item-group__title,.el-menu--vertical:not(.el-menu--collapse):not(.el-menu--popup-container) .el-sub-menu__title{white-space:nowrap;padding-left:calc(var(--el-menu-base-level-padding) + var(--el-menu-level) * var(--el-menu-level-padding))}.el-menu--horizontal{display:flex;flex-wrap:nowrap;border-bottom:solid 1px var(--el-menu-border-color);border-right:none}.el-menu--horizontal>.el-menu-item{display:inline-flex;justify-content:center;align-items:center;height:100%;margin:0;border-bottom:2px solid transparent;color:var(--el-menu-text-color)}.el-menu--horizontal>.el-menu-item a,.el-menu--horizontal>.el-menu-item a:hover{color:inherit}.el-menu--horizontal>.el-menu-item:not(.is-disabled):focus,.el-menu--horizontal>.el-menu-item:not(.is-disabled):hover{background-color:#fff}.el-menu--horizontal>.el-sub-menu:focus,.el-menu--horizontal>.el-sub-menu:hover{outline:0}.el-menu--horizontal>.el-sub-menu:hover .el-sub-menu__title{color:var(--el-menu-hover-text-color)}.el-menu--horizontal>.el-sub-menu.is-active .el-sub-menu__title{border-bottom:2px solid var(--el-menu-active-color);color:var(--el-menu-active-color)}.el-menu--horizontal>.el-sub-menu .el-sub-menu__title{height:100%;border-bottom:2px solid transparent;color:var(--el-menu-text-color)}.el-menu--horizontal>.el-sub-menu .el-sub-menu__title:hover{background-color:var(--el-bg-color-overlay)}.el-menu--horizontal>.el-sub-menu .el-sub-menu__icon-arrow{position:static;vertical-align:middle;margin-left:8px;margin-top:-3px}.el-menu--horizontal .el-menu .el-menu-item,.el-menu--horizontal .el-menu .el-sub-menu__title{background-color:var(--el-menu-bg-color);display:flex;align-items:center;height:var(--el-menu-horizontal-sub-item-height);padding:0 10px;color:var(--el-menu-text-color)}.el-menu--horizontal .el-menu .el-sub-menu__title{padding-right:40px}.el-menu--horizontal .el-menu .el-menu-item.is-active,.el-menu--horizontal .el-menu .el-sub-menu.is-active>.el-sub-menu__title{color:var(--el-menu-active-color)}.el-menu--horizontal .el-menu-item:not(.is-disabled):focus,.el-menu--horizontal .el-menu-item:not(.is-disabled):hover{outline:0;color:var(--el-menu-hover-text-color);background-color:var(--el-menu-hover-bg-color)}.el-menu--horizontal>.el-menu-item.is-active{border-bottom:2px solid var(--el-menu-active-color);color:var(--el-menu-active-color)!important}.el-menu--collapse{width:calc(var(--el-menu-icon-width) + var(--el-menu-base-level-padding) * 2)}.el-menu--collapse>.el-menu-item [class^=el-icon],.el-menu--collapse>.el-sub-menu>.el-sub-menu__title [class^=el-icon]{margin:0;vertical-align:middle;width:var(--el-menu-icon-width);text-align:center}.el-menu--collapse>.el-menu-item .el-sub-menu__icon-arrow,.el-menu--collapse>.el-sub-menu>.el-sub-menu__title .el-sub-menu__icon-arrow{display:none}.el-menu--collapse>.el-menu-item>span,.el-menu--collapse>.el-sub-menu>.el-sub-menu__title>span{height:0;width:0;overflow:hidden;visibility:hidden;display:inline-block}.el-menu--collapse>.el-menu-item.is-active i{color:inherit}.el-menu--collapse .el-menu .el-sub-menu{min-width:200px}.el-menu--collapse .el-sub-menu{position:relative}.el-menu--collapse .el-sub-menu .el-menu{position:absolute;margin-left:5px;top:0;left:100%;z-index:10;border:1px solid var(--el-border-color-light);border-radius:var(--el-border-radius-small);box-shadow:var(--el-box-shadow-light)}.el-menu--collapse .el-sub-menu.is-active .el-sub-menu__title{color:var(--el-menu-active-color)}.el-menu--popup{z-index:100;min-width:200px;border:none;padding:5px 0;border-radius:var(--el-border-radius-small);box-shadow:var(--el-box-shadow-light)}.el-menu .el-icon{flex-shrink:0}.el-menu-item{display:flex;align-items:center;height:var(--el-menu-item-height);line-height:var(--el-menu-item-height);font-size:var(--el-menu-item-font-size);color:var(--el-menu-text-color);padding:0 var(--el-menu-base-level-padding);list-style:none;cursor:pointer;position:relative;transition:border-color var(--el-transition-duration),background-color var(--el-transition-duration),color var(--el-transition-duration);box-sizing:border-box;white-space:nowrap}.el-menu-item *{vertical-align:bottom}.el-menu-item i{color:inherit}.el-menu-item:focus,.el-menu-item:hover{outline:0}.el-menu-item:hover{background-color:var(--el-menu-hover-bg-color)}.el-menu-item.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-menu-item [class^=el-icon]{margin-right:5px;width:var(--el-menu-icon-width);text-align:center;font-size:18px;vertical-align:middle}.el-menu-item.is-active{color:var(--el-menu-active-color)}.el-menu-item.is-active i{color:inherit}.el-menu-item .el-menu-tooltip__trigger{position:absolute;left:0;top:0;height:100%;width:100%;display:inline-flex;align-items:center;box-sizing:border-box;padding:0 var(--el-menu-base-level-padding)}.el-sub-menu{list-style:none;margin:0;padding-left:0}.el-sub-menu__title{display:flex;align-items:center;height:var(--el-menu-item-height);line-height:var(--el-menu-item-height);font-size:var(--el-menu-item-font-size);color:var(--el-menu-text-color);padding:0 var(--el-menu-base-level-padding);list-style:none;cursor:pointer;position:relative;transition:border-color var(--el-transition-duration),background-color var(--el-transition-duration),color var(--el-transition-duration);box-sizing:border-box;white-space:nowrap}.el-sub-menu__title *{vertical-align:bottom}.el-sub-menu__title i{color:inherit}.el-sub-menu__title:focus,.el-sub-menu__title:hover{outline:0}.el-sub-menu__title.is-disabled{opacity:.25;cursor:not-allowed;background:0 0!important}.el-sub-menu__title:hover{background-color:var(--el-menu-hover-bg-color)}.el-sub-menu .el-menu{border:none}.el-sub-menu .el-menu-item{height:var(--el-menu-sub-item-height);line-height:var(--el-menu-sub-item-height);min-width:200px}.el-sub-menu__hide-arrow .el-sub-menu__icon-arrow{display:none!important}.el-sub-menu.is-active .el-sub-menu__title{border-bottom-color:var(--el-menu-active-color)}.el-sub-menu.is-disabled .el-menu-item,.el-sub-menu.is-disabled .el-sub-menu__title{opacity:.25;cursor:not-allowed;background:0 0!important}.el-sub-menu .el-icon{vertical-align:middle;margin-right:5px;width:var(--el-menu-icon-width);text-align:center;font-size:18px}.el-sub-menu .el-icon.el-sub-menu__icon-more{margin-right:0!important}.el-sub-menu .el-sub-menu__icon-arrow{position:absolute;top:50%;right:var(--el-menu-base-level-padding);margin-top:-7px;transition:transform var(--el-transition-duration);font-size:12px;margin-right:0;width:inherit}.el-menu-item-group>ul{padding:0}.el-menu-item-group__title{padding:7px 0 7px var(--el-menu-base-level-padding);line-height:normal;font-size:12px;color:var(--el-text-color-secondary)}.horizontal-collapse-transition .el-sub-menu__title .el-sub-menu__icon-arrow{transition:var(--el-transition-duration-fast);opacity:0}.el-message-box{--el-messagebox-title-color:var(--el-text-color-primary);--el-messagebox-width:420px;--el-messagebox-border-radius:4px;--el-messagebox-font-size:var(--el-font-size-large);--el-messagebox-content-font-size:var(--el-font-size-base);--el-messagebox-content-color:var(--el-text-color-regular);--el-messagebox-error-font-size:12px;--el-messagebox-padding-primary:15px}.el-message-box{display:inline-block;max-width:var(--el-messagebox-width);width:100%;padding-bottom:10px;vertical-align:middle;background-color:var(--el-bg-color);border-radius:var(--el-messagebox-border-radius);border:1px solid var(--el-border-color-lighter);font-size:var(--el-messagebox-font-size);box-shadow:var(--el-box-shadow-light);text-align:left;overflow:hidden;-webkit-backface-visibility:hidden;backface-visibility:hidden}.el-message-box:focus{outline:0!important}.el-overlay.is-message-box .el-overlay-message-box{text-align:center;position:fixed;inset:0;padding:16px;overflow:auto}.el-overlay.is-message-box .el-overlay-message-box:after{content:\"\";display:inline-block;height:100%;width:0;vertical-align:middle}.el-message-box.is-draggable .el-message-box__header{cursor:move;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-message-box__header{position:relative;padding:var(--el-messagebox-padding-primary);padding-bottom:10px}.el-message-box__title{padding-left:0;margin-bottom:0;font-size:var(--el-messagebox-font-size);line-height:1;color:var(--el-messagebox-title-color)}.el-message-box__headerbtn{position:absolute;top:var(--el-messagebox-padding-primary);right:var(--el-messagebox-padding-primary);padding:0;border:none;outline:0;background:0 0;font-size:var(--el-message-close-size,16px);cursor:pointer}.el-message-box__headerbtn .el-message-box__close{color:var(--el-color-info);font-size:inherit}.el-message-box__headerbtn:focus .el-message-box__close,.el-message-box__headerbtn:hover .el-message-box__close{color:var(--el-color-primary)}.el-message-box__content{padding:10px var(--el-messagebox-padding-primary);color:var(--el-messagebox-content-color);font-size:var(--el-messagebox-content-font-size)}.el-message-box__container{position:relative}.el-message-box__input{padding-top:15px}.el-message-box__input div.invalid>input{border-color:var(--el-color-error)}.el-message-box__input div.invalid>input:focus{border-color:var(--el-color-error)}.el-message-box__status{position:absolute;top:50%;transform:translateY(-50%);font-size:24px!important}.el-message-box__status:before{padding-left:1px}.el-message-box__status.el-icon{position:absolute}.el-message-box__status+.el-message-box__message{padding-left:36px;padding-right:12px;word-break:break-word}.el-message-box__status.el-message-box-icon--success{--el-messagebox-color:var(--el-color-success);color:var(--el-messagebox-color)}.el-message-box__status.el-message-box-icon--info{--el-messagebox-color:var(--el-color-info);color:var(--el-messagebox-color)}.el-message-box__status.el-message-box-icon--warning{--el-messagebox-color:var(--el-color-warning);color:var(--el-messagebox-color)}.el-message-box__status.el-message-box-icon--error{--el-messagebox-color:var(--el-color-error);color:var(--el-messagebox-color)}.el-message-box__message{margin:0}.el-message-box__message p{margin:0;line-height:24px}.el-message-box__errormsg{color:var(--el-color-error);font-size:var(--el-messagebox-error-font-size);min-height:18px;margin-top:2px}.el-message-box__btns{padding:5px 15px 0;display:flex;flex-wrap:wrap;justify-content:flex-end;align-items:center}.el-message-box__btns button:nth-child(2){margin-left:10px}.el-message-box__btns-reverse{flex-direction:row-reverse}.el-message-box--center .el-message-box__title{position:relative;display:flex;align-items:center;justify-content:center}.el-message-box--center .el-message-box__status{position:relative;top:auto;padding-right:5px;text-align:center;transform:translateY(-1px)}.el-message-box--center .el-message-box__message{margin-left:0}.el-message-box--center .el-message-box__btns{justify-content:center}.el-message-box--center .el-message-box__content{padding-left:calc(var(--el-messagebox-padding-primary) + 12px);padding-right:calc(var(--el-messagebox-padding-primary) + 12px);text-align:center}.fade-in-linear-enter-active .el-overlay-message-box{-webkit-animation:msgbox-fade-in var(--el-transition-duration);animation:msgbox-fade-in var(--el-transition-duration)}.fade-in-linear-leave-active .el-overlay-message-box{animation:msgbox-fade-in var(--el-transition-duration) reverse}@-webkit-keyframes msgbox-fade-in{0%{transform:translate3d(0,-20px,0);opacity:0}to{transform:translateZ(0);opacity:1}}@keyframes msgbox-fade-in{0%{transform:translate3d(0,-20px,0);opacity:0}to{transform:translateZ(0);opacity:1}}@-webkit-keyframes msgbox-fade-out{0%{transform:translateZ(0);opacity:1}to{transform:translate3d(0,-20px,0);opacity:0}}@keyframes msgbox-fade-out{0%{transform:translateZ(0);opacity:1}to{transform:translate3d(0,-20px,0);opacity:0}}.el-message{--el-message-bg-color:var(--el-color-info-light-9);--el-message-border-color:var(--el-border-color-lighter);--el-message-padding:15px 19px;--el-message-close-size:16px;--el-message-close-icon-color:var(--el-text-color-placeholder);--el-message-close-hover-color:var(--el-text-color-secondary)}.el-message{width:-webkit-fit-content;width:-moz-fit-content;width:fit-content;max-width:calc(100% - 32px);box-sizing:border-box;border-radius:var(--el-border-radius-base);border-width:var(--el-border-width);border-style:var(--el-border-style);border-color:var(--el-message-border-color);position:fixed;left:50%;top:20px;transform:translate(-50%);background-color:var(--el-message-bg-color);transition:opacity var(--el-transition-duration),transform .4s,top .4s;padding:var(--el-message-padding);display:flex;align-items:center}.el-message.is-center{justify-content:center}.el-message.is-closable .el-message__content{padding-right:31px}.el-message p{margin:0}.el-message--success{--el-message-bg-color:var(--el-color-success-light-9);--el-message-border-color:var(--el-color-success-light-8);--el-message-text-color:var(--el-color-success)}.el-message--success .el-message__content{color:var(--el-message-text-color);overflow-wrap:anywhere}.el-message .el-message-icon--success{color:var(--el-message-text-color)}.el-message--info{--el-message-bg-color:var(--el-color-info-light-9);--el-message-border-color:var(--el-color-info-light-8);--el-message-text-color:var(--el-color-info)}.el-message--info .el-message__content{color:var(--el-message-text-color);overflow-wrap:anywhere}.el-message .el-message-icon--info{color:var(--el-message-text-color)}.el-message--warning{--el-message-bg-color:var(--el-color-warning-light-9);--el-message-border-color:var(--el-color-warning-light-8);--el-message-text-color:var(--el-color-warning)}.el-message--warning .el-message__content{color:var(--el-message-text-color);overflow-wrap:anywhere}.el-message .el-message-icon--warning{color:var(--el-message-text-color)}.el-message--error{--el-message-bg-color:var(--el-color-error-light-9);--el-message-border-color:var(--el-color-error-light-8);--el-message-text-color:var(--el-color-error)}.el-message--error .el-message__content{color:var(--el-message-text-color);overflow-wrap:anywhere}.el-message .el-message-icon--error{color:var(--el-message-text-color)}.el-message__icon{margin-right:10px}.el-message .el-message__badge{position:absolute;top:-8px;right:-8px}.el-message__content{padding:0;font-size:14px;line-height:1}.el-message__content:focus{outline-width:0}.el-message .el-message__closeBtn{position:absolute;top:50%;right:19px;transform:translateY(-50%);cursor:pointer;color:var(--el-message-close-icon-color);font-size:var(--el-message-close-size)}.el-message .el-message__closeBtn:focus{outline-width:0}.el-message .el-message__closeBtn:hover{color:var(--el-message-close-hover-color)}.el-message-fade-enter-from,.el-message-fade-leave-to{opacity:0;transform:translate(-50%,-100%)}.el-notification{--el-notification-width:330px;--el-notification-padding:14px 26px 14px 13px;--el-notification-radius:8px;--el-notification-shadow:var(--el-box-shadow-light);--el-notification-border-color:var(--el-border-color-lighter);--el-notification-icon-size:24px;--el-notification-close-font-size:var(--el-message-close-size, 16px);--el-notification-group-margin-left:13px;--el-notification-group-margin-right:8px;--el-notification-content-font-size:var(--el-font-size-base);--el-notification-content-color:var(--el-text-color-regular);--el-notification-title-font-size:16px;--el-notification-title-color:var(--el-text-color-primary);--el-notification-close-color:var(--el-text-color-secondary);--el-notification-close-hover-color:var(--el-text-color-regular)}.el-notification{display:flex;width:var(--el-notification-width);padding:var(--el-notification-padding);border-radius:var(--el-notification-radius);box-sizing:border-box;border:1px solid var(--el-notification-border-color);position:fixed;background-color:var(--el-bg-color-overlay);box-shadow:var(--el-notification-shadow);transition:opacity var(--el-transition-duration),transform var(--el-transition-duration),left var(--el-transition-duration),right var(--el-transition-duration),top .4s,bottom var(--el-transition-duration);overflow-wrap:anywhere;overflow:hidden;z-index:9999}.el-notification.right{right:16px}.el-notification.left{left:16px}.el-notification__group{margin-left:var(--el-notification-group-margin-left);margin-right:var(--el-notification-group-margin-right)}.el-notification__title{font-weight:700;font-size:var(--el-notification-title-font-size);line-height:var(--el-notification-icon-size);color:var(--el-notification-title-color);margin:0}.el-notification__content{font-size:var(--el-notification-content-font-size);line-height:24px;margin:6px 0 0;color:var(--el-notification-content-color);text-align:justify}.el-notification__content p{margin:0}.el-notification .el-notification__icon{height:var(--el-notification-icon-size);width:var(--el-notification-icon-size);font-size:var(--el-notification-icon-size)}.el-notification .el-notification__closeBtn{position:absolute;top:18px;right:15px;cursor:pointer;color:var(--el-notification-close-color);font-size:var(--el-notification-close-font-size)}.el-notification .el-notification__closeBtn:hover{color:var(--el-notification-close-hover-color)}.el-notification .el-notification--success{--el-notification-icon-color:var(--el-color-success);color:var(--el-notification-icon-color)}.el-notification .el-notification--info{--el-notification-icon-color:var(--el-color-info);color:var(--el-notification-icon-color)}.el-notification .el-notification--warning{--el-notification-icon-color:var(--el-color-warning);color:var(--el-notification-icon-color)}.el-notification .el-notification--error{--el-notification-icon-color:var(--el-color-error);color:var(--el-notification-icon-color)}.el-notification-fade-enter-from.right{right:0;transform:translate(100%)}.el-notification-fade-enter-from.left{left:0;transform:translate(-100%)}.el-notification-fade-leave-to{opacity:0}.el-overlay{position:fixed;inset:0;z-index:2000;height:100%;background-color:var(--el-overlay-color-lighter);overflow:auto}.el-overlay .el-overlay-root{height:0}.el-page-header.is-contentful .el-page-header__main{border-top:1px solid var(--el-border-color-light);margin-top:16px}.el-page-header__header{display:flex;align-items:center;justify-content:space-between;line-height:24px}.el-page-header__left{display:flex;align-items:center;margin-right:40px;position:relative}.el-page-header__back{display:flex;align-items:center;cursor:pointer}.el-page-header__left .el-divider--vertical{margin:0 16px}.el-page-header__icon{font-size:16px;margin-right:10px;display:flex;align-items:center}.el-page-header__icon .el-icon{font-size:inherit}.el-page-header__title{font-size:14px;font-weight:500}.el-page-header__content{font-size:18px;color:var(--el-text-color-primary)}.el-page-header__breadcrumb{margin-bottom:16px}.el-pagination{--el-pagination-font-size:14px;--el-pagination-bg-color:var(--el-fill-color-blank);--el-pagination-text-color:var(--el-text-color-primary);--el-pagination-border-radius:3px;--el-pagination-button-color:var(--el-text-color-primary);--el-pagination-button-width:32px;--el-pagination-button-height:32px;--el-pagination-button-disabled-color:var(--el-text-color-placeholder);--el-pagination-button-disabled-bg-color:var(--el-fill-color-blank);--el-pagination-button-bg-color:var(--el-fill-color);--el-pagination-hover-color:var(--el-color-primary);--el-pagination-height-extra-small:24px;--el-pagination-line-height-extra-small:var(--el-pagination-height-extra-small);white-space:nowrap;padding:2px 5px;color:var(--el-pagination-text-color);font-weight:400;display:flex;align-items:center}.el-pagination:after,.el-pagination:before{display:table;content:\"\"}.el-pagination:after{clear:both}.el-pagination button,.el-pagination span:not([class*=suffix]){display:flex;justify-content:center;align-items:center;font-size:var(--el-pagination-font-size);min-width:var(--el-pagination-button-width);height:var(--el-pagination-button-height);line-height:var(--el-pagination-button-height);box-sizing:border-box}.el-pagination .el-input__inner{text-align:center;-moz-appearance:textfield;line-height:normal}.el-pagination .el-select .el-input{width:128px}.el-pagination button{border:none;padding:0 6px;background:0 0}.el-pagination button:focus{outline:0}.el-pagination button:hover{color:var(--el-pagination-hover-color)}.el-pagination button:disabled{color:var(--el-pagination-button-disabled-color);background-color:var(--el-pagination-button-disabled-bg-color);cursor:not-allowed}.el-pagination .btn-next,.el-pagination .btn-prev{background:center center no-repeat;background-size:16px;background-color:var(--el-pagination-bg-color);cursor:pointer;margin:0;color:var(--el-pagination-button-color)}.el-pagination .btn-next .el-icon,.el-pagination .btn-prev .el-icon{display:block;font-size:12px;font-weight:700;width:inherit}.el-pagination .btn-next:focus-visible,.el-pagination .btn-prev:focus-visible{outline:1px solid var(--el-pagination-hover-color);color:var(--el-pagination-hover-color)}.el-pagination .el-pager li.is-disabled{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-pagination--small .btn-next,.el-pagination--small .btn-prev,.el-pagination--small .el-pager li,.el-pagination--small .el-pager li.btn-quicknext,.el-pagination--small .el-pager li.btn-quickprev,.el-pagination--small .el-pager li:last-child{border-color:transparent;font-size:var(--el-font-size-extra-small);line-height:var(--el-pagination-line-height-extra-small);height:var(--el-pagination-height-extra-small);min-width:24px}.el-pagination--small .arrow.is-disabled{visibility:hidden}.el-pagination--small .more:before,.el-pagination--small li.more:before{line-height:var(--el-pagination-line-height-extra-small)}.el-pagination--small button,.el-pagination--small span:not([class*=suffix]){height:var(--el-pagination-height-extra-small);line-height:var(--el-pagination-line-height-extra-small);font-size:var(--el-font-size-extra-small)}.el-pagination--small .el-pagination__editor{height:var(--el-pagination-line-height-extra-small)}.el-pagination--small .el-pagination__editor.el-input .el-input__inner{height:var(--el-pagination-height-extra-small)}.el-pagination--small .el-input--small,.el-pagination--small .el-input__inner{height:var(--el-pagination-height-extra-small)!important;line-height:var(--el-pagination-line-height-extra-small)}.el-pagination--small .el-input__suffix,.el-pagination--small .el-input__suffix .el-input__suffix-inner,.el-pagination--small .el-input__suffix .el-input__suffix-inner i.el-select__caret{line-height:var(--el-pagination-line-height-extra-small)}.el-pagination--small .el-select .el-input{width:100px}.el-pagination__sizes{margin:0 16px 0 0;font-weight:400;color:var(--el-text-color-regular)}.el-pagination__sizes+button.btn-prev[type=button]{margin-left:0}.el-pagination__sizes+.el-pager .number:first-child{margin-left:0}.el-pagination__sizes+.el-pager .number:last-child{margin-right:0}.el-pagination__total{margin-right:16px;font-weight:400;color:var(--el-text-color-regular)}.el-pagination__total+button.btn-prev[type=button]{margin-left:0}.el-pagination__total+.el-pager .number:first-child{margin-left:0}.el-pagination__total+.el-pager .number:last-child{margin-right:0}.el-pagination__total[disabled=true]{color:var(--el-text-color-placeholder)}.el-pagination__jump{margin-left:16px;font-weight:400;color:var(--el-text-color-regular)}.el-pagination__jump .el-input__inner{padding:0 3px}.el-pagination__jump[disabled=true]{color:var(--el-text-color-placeholder)}.el-pagination__rightwrapper{flex:1;display:flex;align-items:center;justify-content:flex-end}.el-pagination__editor{line-height:18px;margin:0 8px;height:var(--el-pagination-button-height);min-width:56px;text-align:center;box-sizing:border-box;border-radius:var(--el-pagination-border-radius)}.el-pagination__editor.el-input{width:50px}.el-pagination__editor.el-input .el-input__inner{height:var(--el-pagination-button-height)}.el-pagination__editor .el-input__inner::-webkit-inner-spin-button,.el-pagination__editor .el-input__inner::-webkit-outer-spin-button{-webkit-appearance:none;margin:0}.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev,.el-pagination.is-background .el-pager li{margin:0 4px;background-color:var(--el-pagination-button-bg-color);color:var(--el-text-color-regular);min-width:32px;border-radius:2px}.el-pagination.is-background .btn-next.is-disabled,.el-pagination.is-background .btn-prev.is-disabled,.el-pagination.is-background .el-pager li.is-disabled{color:var(--el-text-color-placeholder);background-color:var(--el-disabled-bg-color)}.el-pagination.is-background .btn-next.is-disabled.is-active,.el-pagination.is-background .btn-prev.is-disabled.is-active,.el-pagination.is-background .el-pager li.is-disabled.is-active{color:var(--el-text-color-secondary);background-color:var(--el-fill-color-dark)}.el-pagination.is-background .btn-next.is-first,.el-pagination.is-background .btn-prev.is-first,.el-pagination.is-background .el-pager li.is-first{margin-left:0}.el-pagination.is-background .btn-next.is-last,.el-pagination.is-background .btn-prev.is-last,.el-pagination.is-background .el-pager li.is-last{margin-right:0}.el-pagination.is-background .btn-next,.el-pagination.is-background .btn-prev{padding:0}.el-pagination.is-background .btn-next:disabled,.el-pagination.is-background .btn-prev:disabled{color:var(--el-text-color-placeholder);background-color:var(--el-disabled-bg-color)}.el-pagination.is-background .btn-next:hover:not([disabled]),.el-pagination.is-background .btn-prev:hover:not([disabled]){color:var(--el-pagination-hover-color)}.el-pagination.is-background .el-pager li:not(.is-disabled):hover{color:var(--el-pagination-hover-color)}.el-pagination.is-background .el-pager li:not(.is-disabled).is-active{background-color:var(--el-color-primary);color:var(--el-color-white);font-weight:700}.el-pagination.is-background.el-pagination--small .btn-next,.el-pagination.is-background.el-pagination--small .btn-prev,.el-pagination.is-background.el-pagination--small .el-pager li{min-width:24px}.el-pagination.is-background .el-pagination__sizes.is-last{margin-left:16px}.el-pager{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;list-style:none;font-size:0;padding:0;margin:0;display:flex;align-items:center}.el-pager li{padding:0 4px;background:var(--el-pagination-bg-color);display:flex;justify-content:center;align-items:center;font-size:var(--el-pagination-font-size);min-width:var(--el-pagination-button-width);height:var(--el-pagination-button-height);line-height:var(--el-pagination-button-height);box-sizing:border-box;cursor:pointer;text-align:center;margin:0 1px}.el-pager li.btn-quickprev:hover,.el-pager li.btn-quicknext:hover{cursor:pointer}.el-pager li.btn-quicknext,.el-pager li.btn-quickprev{line-height:32px;color:var(--el-pagination-button-color)}.el-pager li.btn-quicknext.is-disabled,.el-pager li.btn-quickprev.is-disabled{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-pager li.btn-quicknext svg,.el-pager li.btn-quickprev svg{pointer-events:none}.el-pager li.btn-quicknext:focus-visible,.el-pager li.btn-quickprev:focus-visible{outline:1px solid var(--el-pagination-hover-color);color:var(--el-pagination-hover-color)}.el-pager li.is-active+li{border-left:0}.el-pager li:focus-visible{outline:1px solid var(--el-pagination-hover-color)}.el-pager li:hover{color:var(--el-pagination-hover-color)}.el-pager li.is-active{color:var(--el-pagination-hover-color);cursor:default}.el-pager li.is-active.is-disabled{font-weight:700;color:var(--el-text-color-secondary)}.el-pager+button.btn-next[type=button]{margin-right:0}.el-popconfirm__main{display:flex;align-items:center}.el-popconfirm__icon{margin-right:5px}.el-popconfirm__action{text-align:right;margin-top:8px}.el-popover{--el-popover-bg-color:var(--el-bg-color-overlay);--el-popover-font-size:var(--el-font-size-base);--el-popover-border-color:var(--el-border-color-lighter);--el-popover-padding:12px;--el-popover-padding-large:18px 20px;--el-popover-title-font-size:16px;--el-popover-title-text-color:var(--el-text-color-primary);--el-popover-border-radius:4px}.el-popover.el-popper{background:var(--el-popover-bg-color);min-width:150px;border-radius:var(--el-popover-border-radius);border:1px solid var(--el-popover-border-color);padding:var(--el-popover-padding);z-index:var(--el-index-popper);color:var(--el-text-color-regular);line-height:1.4;text-align:justify;font-size:var(--el-popover-font-size);box-shadow:var(--el-box-shadow-light);word-break:break-all;box-sizing:border-box}.el-popover.el-popper--plain{padding:var(--el-popover-padding-large)}.el-popover__title{color:var(--el-popover-title-text-color);font-size:var(--el-popover-title-font-size);line-height:1;margin-bottom:12px}.el-popover__reference:focus:hover,.el-popover__reference:focus:not(.focusing){outline-width:0}.el-popover.el-popper.is-dark{--el-popover-title-text-color:var(--el-bg-color)}.el-popover.el-popper:focus,.el-popover.el-popper:focus:active{outline-width:0}.el-progress{position:relative;line-height:1;display:flex;align-items:center}.el-progress__text{font-size:14px;color:var(--el-text-color-regular);margin-left:5px;min-width:50px;line-height:1}.el-progress__text i{vertical-align:middle;display:block}.el-progress--circle,.el-progress--dashboard{display:inline-block}.el-progress--circle .el-progress__text,.el-progress--dashboard .el-progress__text{position:absolute;top:50%;left:0;width:100%;text-align:center;margin:0;transform:translateY(-50%)}.el-progress--circle .el-progress__text i,.el-progress--dashboard .el-progress__text i{vertical-align:middle;display:inline-block}.el-progress--without-text .el-progress__text{display:none}.el-progress--without-text .el-progress-bar{padding-right:0;margin-right:0;display:block}.el-progress--text-inside .el-progress-bar{padding-right:0;margin-right:0}.el-progress.is-success .el-progress-bar__inner{background-color:var(--el-color-success)}.el-progress.is-success .el-progress__text{color:var(--el-color-success)}.el-progress.is-warning .el-progress-bar__inner{background-color:var(--el-color-warning)}.el-progress.is-warning .el-progress__text{color:var(--el-color-warning)}.el-progress.is-exception .el-progress-bar__inner{background-color:var(--el-color-danger)}.el-progress.is-exception .el-progress__text{color:var(--el-color-danger)}.el-progress-bar{flex-grow:1;box-sizing:border-box}.el-progress-bar__outer{height:6px;border-radius:100px;background-color:var(--el-border-color-lighter);overflow:hidden;position:relative;vertical-align:middle}.el-progress-bar__inner{position:absolute;left:0;top:0;height:100%;background-color:var(--el-color-primary);text-align:right;border-radius:100px;line-height:1;white-space:nowrap;transition:width .6s ease}.el-progress-bar__inner:after{display:inline-block;content:\"\";height:100%;vertical-align:middle}.el-progress-bar__inner--indeterminate{transform:translateZ(0);-webkit-animation:indeterminate 3s infinite;animation:indeterminate 3s infinite}.el-progress-bar__innerText{display:inline-block;vertical-align:middle;color:#fff;font-size:12px;margin:0 5px}@-webkit-keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}@keyframes progress{0%{background-position:0 0}to{background-position:32px 0}}@-webkit-keyframes indeterminate{0%{left:-100%}to{left:100%}}@keyframes indeterminate{0%{left:-100%}to{left:100%}}.el-radio-button{--el-radio-button-checked-bg-color:var(--el-color-primary);--el-radio-button-checked-text-color:var(--el-color-white);--el-radio-button-checked-border-color:var(--el-color-primary);--el-radio-button-disabled-checked-fill:var(--el-border-color-extra-light)}.el-radio-button{position:relative;display:inline-block;outline:0}.el-radio-button__inner{display:inline-block;line-height:1;white-space:nowrap;vertical-align:middle;background:var(--el-button-bg-color,var(--el-fill-color-blank));border:var(--el-border);font-weight:var(--el-button-font-weight,var(--el-font-weight-primary));border-left:0;color:var(--el-button-text-color,var(--el-text-color-regular));-webkit-appearance:none;text-align:center;box-sizing:border-box;outline:0;margin:0;position:relative;cursor:pointer;transition:var(--el-transition-all);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;padding:8px 15px;font-size:var(--el-font-size-base);border-radius:0}.el-radio-button__inner.is-round{padding:8px 15px}.el-radio-button__inner:hover{color:var(--el-color-primary)}.el-radio-button__inner [class*=el-icon-]{line-height:.9}.el-radio-button__inner [class*=el-icon-]+span{margin-left:5px}.el-radio-button:first-child .el-radio-button__inner{border-left:var(--el-border);border-radius:var(--el-border-radius-base) 0 0 var(--el-border-radius-base);box-shadow:none!important}.el-radio-button__original-radio{opacity:0;outline:0;position:absolute;z-index:-1}.el-radio-button__original-radio:checked+.el-radio-button__inner{color:var(--el-radio-button-checked-text-color,var(--el-color-white));background-color:var(--el-radio-button-checked-bg-color,var(--el-color-primary));border-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));box-shadow:-1px 0 0 0 var(--el-radio-button-checked-border-color,var(--el-color-primary))}.el-radio-button__original-radio:focus-visible+.el-radio-button__inner{border-left:var(--el-border);border-left-color:var(--el-radio-button-checked-border-color,var(--el-color-primary));outline:2px solid var(--el-radio-button-checked-border-color);outline-offset:1px;z-index:2;border-radius:var(--el-border-radius-base);box-shadow:none}.el-radio-button__original-radio:disabled+.el-radio-button__inner{color:var(--el-disabled-text-color);cursor:not-allowed;background-image:none;background-color:var(--el-button-disabled-bg-color,var(--el-fill-color-blank));border-color:var(--el-button-disabled-border-color,var(--el-border-color-light));box-shadow:none}.el-radio-button__original-radio:disabled:checked+.el-radio-button__inner{background-color:var(--el-radio-button-disabled-checked-fill)}.el-radio-button:last-child .el-radio-button__inner{border-radius:0 var(--el-border-radius-base) var(--el-border-radius-base) 0}.el-radio-button:first-child:last-child .el-radio-button__inner{border-radius:var(--el-border-radius-base)}.el-radio-button--large .el-radio-button__inner{padding:12px 19px;font-size:var(--el-font-size-base);border-radius:0}.el-radio-button--large .el-radio-button__inner.is-round{padding:12px 19px}.el-radio-button--small .el-radio-button__inner{padding:5px 11px;font-size:12px;border-radius:0}.el-radio-button--small .el-radio-button__inner.is-round{padding:5px 11px}.el-radio-group{display:inline-flex;align-items:center;flex-wrap:wrap;font-size:0}.el-radio{--el-radio-font-size:var(--el-font-size-base);--el-radio-text-color:var(--el-text-color-regular);--el-radio-font-weight:var(--el-font-weight-primary);--el-radio-input-height:14px;--el-radio-input-width:14px;--el-radio-input-border-radius:var(--el-border-radius-circle);--el-radio-input-bg-color:var(--el-fill-color-blank);--el-radio-input-border:var(--el-border);--el-radio-input-border-color:var(--el-border-color);--el-radio-input-border-color-hover:var(--el-color-primary)}.el-radio{color:var(--el-radio-text-color);font-weight:var(--el-radio-font-weight);position:relative;cursor:pointer;display:inline-flex;align-items:center;white-space:nowrap;outline:0;font-size:var(--el-font-size-base);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;margin-right:32px;height:32px}.el-radio.el-radio--large{height:40px}.el-radio.el-radio--small{height:24px}.el-radio.is-bordered{padding:0 15px 0 9px;border-radius:var(--el-border-radius-base);border:var(--el-border);box-sizing:border-box}.el-radio.is-bordered.is-checked{border-color:var(--el-color-primary)}.el-radio.is-bordered.is-disabled{cursor:not-allowed;border-color:var(--el-border-color-lighter)}.el-radio.is-bordered.el-radio--large{padding:0 19px 0 11px;border-radius:var(--el-border-radius-base)}.el-radio.is-bordered.el-radio--large .el-radio__label{font-size:var(--el-font-size-base)}.el-radio.is-bordered.el-radio--large .el-radio__inner{height:14px;width:14px}.el-radio.is-bordered.el-radio--small{padding:0 11px 0 7px;border-radius:var(--el-border-radius-base)}.el-radio.is-bordered.el-radio--small .el-radio__label{font-size:12px}.el-radio.is-bordered.el-radio--small .el-radio__inner{height:12px;width:12px}.el-radio:last-child{margin-right:0}.el-radio__input{white-space:nowrap;cursor:pointer;outline:0;display:inline-flex;position:relative;vertical-align:middle}.el-radio__input.is-disabled .el-radio__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color);cursor:not-allowed}.el-radio__input.is-disabled .el-radio__inner:after{cursor:not-allowed;background-color:var(--el-disabled-bg-color)}.el-radio__input.is-disabled .el-radio__inner+.el-radio__label{cursor:not-allowed}.el-radio__input.is-disabled.is-checked .el-radio__inner{background-color:var(--el-disabled-bg-color);border-color:var(--el-disabled-border-color)}.el-radio__input.is-disabled.is-checked .el-radio__inner:after{background-color:var(--el-text-color-placeholder)}.el-radio__input.is-disabled+span.el-radio__label{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-radio__input.is-checked .el-radio__inner{border-color:var(--el-color-primary);background:var(--el-color-primary)}.el-radio__input.is-checked .el-radio__inner:after{transform:translate(-50%,-50%) scale(1)}.el-radio__input.is-checked+.el-radio__label{color:var(--el-color-primary)}.el-radio__input.is-focus .el-radio__inner{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner{border:var(--el-radio-input-border);border-radius:var(--el-radio-input-border-radius);width:var(--el-radio-input-width);height:var(--el-radio-input-height);background-color:var(--el-radio-input-bg-color);position:relative;cursor:pointer;display:inline-block;box-sizing:border-box}.el-radio__inner:hover{border-color:var(--el-radio-input-border-color-hover)}.el-radio__inner:after{width:4px;height:4px;border-radius:var(--el-radio-input-border-radius);background-color:var(--el-color-white);content:\"\";position:absolute;left:50%;top:50%;transform:translate(-50%,-50%) scale(0);transition:transform .15s ease-in}.el-radio__original{opacity:0;outline:0;position:absolute;z-index:-1;inset:0;margin:0}.el-radio__original:focus-visible+.el-radio__inner{outline:2px solid var(--el-radio-input-border-color-hover);outline-offset:1px;border-radius:var(--el-radio-input-border-radius)}.el-radio:focus:not(:focus-visible):not(.is-focus):not(:active):not(.is-disabled) .el-radio__inner{box-shadow:0 0 2px 2px var(--el-radio-input-border-color-hover)}.el-radio__label{font-size:var(--el-radio-font-size);padding-left:8px}.el-radio.el-radio--large .el-radio__label{font-size:14px}.el-radio.el-radio--large .el-radio__inner{width:14px;height:14px}.el-radio.el-radio--small .el-radio__label{font-size:12px}.el-radio.el-radio--small .el-radio__inner{width:12px;height:12px}.el-rate{--el-rate-height:20px;--el-rate-font-size:var(--el-font-size-base);--el-rate-icon-size:18px;--el-rate-icon-margin:6px;--el-rate-void-color:var(--el-border-color-darker);--el-rate-fill-color:#f7ba2a;--el-rate-disabled-void-color:var(--el-fill-color);--el-rate-text-color:var(--el-text-color-primary)}.el-rate{display:inline-flex;align-items:center;height:32px}.el-rate:active,.el-rate:focus{outline:0}.el-rate__item{cursor:pointer;display:inline-block;position:relative;font-size:0;vertical-align:middle;color:var(--el-rate-void-color);line-height:normal}.el-rate .el-rate__icon{position:relative;display:inline-block;font-size:var(--el-rate-icon-size);margin-right:var(--el-rate-icon-margin);transition:var(--el-transition-duration)}.el-rate .el-rate__icon.hover{transform:scale(1.15)}.el-rate .el-rate__icon .path2{position:absolute;left:0;top:0}.el-rate .el-rate__icon.is-active{color:var(--el-rate-fill-color)}.el-rate__decimal{position:absolute;top:0;left:0;display:inline-block;overflow:hidden;color:var(--el-rate-fill-color)}.el-rate__text{font-size:var(--el-rate-font-size);vertical-align:middle;color:var(--el-rate-text-color)}.el-rate--large{height:40px}.el-rate--small{height:24px}.el-rate.is-disabled .el-rate__item{cursor:auto;color:var(--el-rate-disabled-void-color)}.el-result{--el-result-padding:40px 30px;--el-result-icon-font-size:64px;--el-result-title-font-size:20px;--el-result-title-margin-top:20px;--el-result-subtitle-margin-top:10px;--el-result-extra-margin-top:30px}.el-result{display:flex;justify-content:center;align-items:center;flex-direction:column;text-align:center;box-sizing:border-box;padding:var(--el-result-padding)}.el-result__icon svg{width:var(--el-result-icon-font-size);height:var(--el-result-icon-font-size)}.el-result__title{margin-top:var(--el-result-title-margin-top)}.el-result__title p{margin:0;font-size:var(--el-result-title-font-size);color:var(--el-text-color-primary);line-height:1.3}.el-result__subtitle{margin-top:var(--el-result-subtitle-margin-top)}.el-result__subtitle p{margin:0;font-size:var(--el-font-size-base);color:var(--el-text-color-regular);line-height:1.3}.el-result__extra{margin-top:var(--el-result-extra-margin-top)}.el-result .icon-primary{--el-result-color:var(--el-color-primary);color:var(--el-result-color)}.el-result .icon-success{--el-result-color:var(--el-color-success);color:var(--el-result-color)}.el-result .icon-warning{--el-result-color:var(--el-color-warning);color:var(--el-result-color)}.el-result .icon-danger{--el-result-color:var(--el-color-danger);color:var(--el-result-color)}.el-result .icon-error{--el-result-color:var(--el-color-error);color:var(--el-result-color)}.el-result .icon-info{--el-result-color:var(--el-color-info);color:var(--el-result-color)}.el-row{display:flex;flex-wrap:wrap;position:relative;box-sizing:border-box}.el-row.is-justify-center{justify-content:center}.el-row.is-justify-end{justify-content:flex-end}.el-row.is-justify-space-between{justify-content:space-between}.el-row.is-justify-space-around{justify-content:space-around}.el-row.is-justify-space-evenly{justify-content:space-evenly}.el-row.is-align-middle{align-items:center}.el-row.is-align-bottom{align-items:flex-end}.el-scrollbar{--el-scrollbar-opacity:.3;--el-scrollbar-bg-color:var(--el-text-color-secondary);--el-scrollbar-hover-opacity:.5;--el-scrollbar-hover-bg-color:var(--el-text-color-secondary)}.el-scrollbar{overflow:hidden;position:relative;height:100%}.el-scrollbar__wrap{overflow:auto;height:100%}.el-scrollbar__wrap--hidden-default{scrollbar-width:none}.el-scrollbar__wrap--hidden-default::-webkit-scrollbar{display:none}.el-scrollbar__thumb{position:relative;display:block;width:0;height:0;cursor:pointer;border-radius:inherit;background-color:var(--el-scrollbar-bg-color,var(--el-text-color-secondary));transition:var(--el-transition-duration) background-color;opacity:var(--el-scrollbar-opacity,.3)}.el-scrollbar__thumb:hover{background-color:var(--el-scrollbar-hover-bg-color,var(--el-text-color-secondary));opacity:var(--el-scrollbar-hover-opacity,.5)}.el-scrollbar__bar{position:absolute;right:2px;bottom:2px;z-index:1;border-radius:4px}.el-scrollbar__bar.is-vertical{width:6px;top:2px}.el-scrollbar__bar.is-vertical>div{width:100%}.el-scrollbar__bar.is-horizontal{height:6px;left:2px}.el-scrollbar__bar.is-horizontal>div{height:100%}.el-scrollbar-fade-enter-active{transition:opacity .34s ease-out}.el-scrollbar-fade-leave-active{transition:opacity .12s ease-out}.el-scrollbar-fade-enter-from,.el-scrollbar-fade-leave-active{opacity:0}.el-select-dropdown{z-index:calc(var(--el-index-top) + 1);border-radius:var(--el-border-radius-base);box-sizing:border-box}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown__option-item.is-selected:not(.is-multiple).is-disabled{color:var(--el-text-color-disabled)}.el-select-dropdown__option-item.is-selected:not(.is-multiple).is-disabled:after{background-color:var(--el-text-color-disabled)}.el-select-dropdown__option-item:hover:not(.hover){background-color:transparent}.el-select-dropdown.is-multiple .el-select-dropdown__option-item.is-disabled.is-selected{color:var(--el-text-color-disabled)}.el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:var(--el-text-color-secondary);font-size:var(--el-select-font-size)}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{list-style:none;margin:6px 0!important;padding:0!important;box-sizing:border-box}.el-select-dropdown__option-item{font-size:var(--el-select-font-size);padding:0 32px 0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--el-text-color-regular);height:34px;line-height:34px;box-sizing:border-box;cursor:pointer}.el-select-dropdown__option-item.is-disabled{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-select-dropdown__option-item.is-disabled:hover{background-color:var(--el-bg-color)}.el-select-dropdown__option-item.is-selected{background-color:var(--el-fill-color-light);font-weight:700}.el-select-dropdown__option-item.is-selected:not(.is-multiple){color:var(--el-color-primary)}.el-select-dropdown__option-item.hover{background-color:var(--el-fill-color-light)!important}.el-select-dropdown__option-item:hover{background-color:var(--el-fill-color-light)}.el-select-dropdown.is-multiple .el-select-dropdown__option-item.is-selected{color:var(--el-color-primary);background-color:var(--el-bg-color-overlay)}.el-select-dropdown.is-multiple .el-select-dropdown__option-item.is-selected .el-icon{position:absolute;right:20px;top:0;height:inherit;font-size:12px}.el-select-dropdown.is-multiple .el-select-dropdown__option-item.is-selected .el-icon svg{height:inherit;vertical-align:middle}.el-select-group{margin:0;padding:0}.el-select-group__wrap{position:relative;list-style:none;margin:0;padding:0}.el-select-group__wrap:not(:last-of-type){padding-bottom:24px}.el-select-group__wrap:not(:last-of-type):after{content:\"\";position:absolute;display:block;left:20px;right:20px;bottom:12px;height:1px;background:var(--el-border-color-light)}.el-select-group__split-dash{position:absolute;left:20px;right:20px;height:1px;background:var(--el-border-color-light)}.el-select-group__title{padding-left:20px;font-size:12px;color:var(--el-color-info);line-height:30px}.el-select-group .el-select-dropdown__item{padding-left:20px}.el-select-v2{--el-select-border-color-hover:var(--el-border-color-hover);--el-select-disabled-border:var(--el-disabled-border-color);--el-select-font-size:var(--el-font-size-base);--el-select-close-hover-color:var(--el-text-color-secondary);--el-select-input-color:var(--el-text-color-placeholder);--el-select-multiple-input-color:var(--el-text-color-regular);--el-select-input-focus-border-color:var(--el-color-primary);--el-select-input-font-size:14px}.el-select-v2{display:inline-block;position:relative;vertical-align:middle;font-size:14px}.el-select-v2__wrapper{display:flex;align-items:center;flex-wrap:wrap;box-sizing:border-box;cursor:pointer;padding:1px 30px 1px 0;border:1px solid var(--el-border-color);border-radius:var(--el-border-radius-base);transition:border-color var(--el-transition-duration-fast) var(--el-ease-in-out-bezier-function)}.el-select-v2__wrapper:hover{border-color:var(--el-text-color-placeholder)}.el-select-v2__wrapper.is-filterable{cursor:text}.el-select-v2__wrapper.is-focused{border-color:var(--el-color-primary)}.el-select-v2__wrapper.is-hovering:not(.is-focused){border-color:var(--el-text-color-placeholder)}.el-select-v2__wrapper.is-disabled{cursor:not-allowed;background-color:var(--el-fill-color-light);color:var(--el-text-color-placeholder);border-color:var(--el-select-disabled-border)}.el-select-v2__wrapper.is-disabled:hover{border-color:var(--el-select-disabled-border)}.el-select-v2__wrapper.is-disabled.is-focus{border-color:var(--el-input-focus-border-color)}.el-select-v2__wrapper.is-disabled .is-transparent{opacity:1;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-select-v2__wrapper.is-disabled .el-select-v2__caret,.el-select-v2__wrapper.is-disabled .el-select-v2__combobox-input{cursor:not-allowed}.el-select-v2__wrapper .el-select-v2__input-wrapper{box-sizing:border-box;position:relative;-webkit-margin-start:12px;margin-inline-start:12px;max-width:100%;overflow:hidden}.el-select-v2__wrapper,.el-select-v2__wrapper .el-select-v2__input-wrapper{line-height:32px}.el-select-v2__wrapper .el-select-v2__input-wrapper input{--el-input-inner-height:calc(var(--el-component-size, 32px) - 8px);height:var(--el-input-inner-height);line-height:var(--el-input-inner-height);min-width:4px;width:100%;background-color:transparent;-webkit-appearance:none;-moz-appearance:none;appearance:none;background:0 0;border:none;margin:2px 0;outline:0;padding:0}.el-select-v2 .el-select-v2__tags-text{display:inline-block;line-height:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-select-v2__empty{padding:10px 0;margin:0;text-align:center;color:var(--el-text-color-secondary);font-size:14px}.el-select-v2__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);box-shadow:var(--el-box-shadow-light)}.el-select-v2__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-select-v2__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:transparent;border-left-color:transparent}.el-select-v2__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-select-v2__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-left-color:transparent;border-bottom-color:transparent}.el-select-v2__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-select-v2--large .el-select-v2__wrapper .el-select-v2__combobox-input{height:32px}.el-select-v2--large .el-select-v2__caret,.el-select-v2--large .el-select-v2__suffix{height:40px}.el-select-v2--large .el-select-v2__placeholder{font-size:14px;line-height:40px}.el-select-v2--small .el-select-v2__wrapper .el-select-v2__combobox-input{height:16px}.el-select-v2--small .el-select-v2__caret,.el-select-v2--small .el-select-v2__suffix{height:24px}.el-select-v2--small .el-select-v2__placeholder{font-size:12px;line-height:24px}.el-select-v2 .el-select-v2__selection>span{display:inline-block}.el-select-v2:hover .el-select-v2__combobox-input{border-color:var(--el-select-border-color-hover)}.el-select-v2 .el-select__selection-text{text-overflow:ellipsis;display:inline-block;overflow-x:hidden;vertical-align:bottom}.el-select-v2 .el-select-v2__combobox-input{padding-right:35px;display:block}.el-select-v2 .el-select-v2__combobox-input:focus{border-color:var(--el-select-input-focus-border-color)}.el-select-v2__input{border:none;outline:0;padding:0;margin-left:15px;color:var(--el-select-multiple-input-color);font-size:var(--el-select-font-size);-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px}.el-select-v2__input.is-small{height:14px}.el-select-v2__close{cursor:pointer;position:absolute;top:8px;z-index:var(--el-index-top);right:25px;color:var(--el-select-input-color);line-height:18px;font-size:var(--el-select-input-font-size)}.el-select-v2__close:hover{color:var(--el-select-close-hover-color)}.el-select-v2__suffix{display:inline-flex;position:absolute;right:12px;height:32px;top:50%;transform:translateY(-50%);color:var(--el-input-icon-color,var(--el-text-color-placeholder))}.el-select-v2__suffix .el-input__icon{height:inherit}.el-select-v2__caret{color:var(--el-select-input-color);font-size:var(--el-select-input-font-size);transition:transform var(--el-transition-duration);transform:rotate(180deg);cursor:pointer}.el-select-v2__caret.is-reverse{transform:rotate(0)}.el-select-v2__caret.is-show-close{font-size:var(--el-select-font-size);text-align:center;transform:rotate(180deg);border-radius:var(--el-border-radius-circle);color:var(--el-select-input-color);transition:var(--el-transition-color)}.el-select-v2__caret.is-show-close:hover{color:var(--el-select-close-hover-color)}.el-select-v2__caret.el-icon{height:inherit}.el-select-v2__caret.el-icon svg{vertical-align:middle}.el-select-v2__selection{white-space:normal;z-index:var(--el-index-normal);display:flex;align-items:center;flex-wrap:wrap}.el-select-v2__wrapper{background-color:var(--el-fill-color-blank);border:1px solid var(--el-border-color);border-radius:var(--el-border-radius-base);position:relative;transition:all var(--el-transition-duration) var(--el-ease-in-out-bezier-function)}.el-select-v2__input-calculator{left:0;position:absolute;top:0;visibility:hidden;white-space:pre;z-index:999}.el-select-v2__selected-item{line-height:inherit;height:inherit;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;display:flex;flex-wrap:wrap}.el-select-v2__placeholder{position:absolute;top:50%;transform:translateY(-50%);-webkit-margin-start:12px;margin-inline-start:12px;width:calc(100% - 52px);overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--el-input-text-color,var(--el-text-color-regular))}.el-select-v2__placeholder.is-transparent{color:var(--el-text-color-placeholder)}.el-select-v2 .el-select-v2__selection .el-tag{box-sizing:border-box;border-color:transparent;margin:2px 0 2px 6px;background-color:var(--el-fill-color)}.el-select-v2 .el-select-v2__selection .el-tag .el-icon-close{background-color:var(--el-text-color-placeholder);right:-7px;color:var(--el-color-white)}.el-select-v2 .el-select-v2__selection .el-tag .el-icon-close:hover{background-color:var(--el-text-color-secondary)}.el-select-v2 .el-select-v2__selection .el-tag .el-icon-close:before{display:block;transform:translateY(.5px)}.el-select-v2.el-select-v2--small .el-select-v2__selection .el-tag{margin:1px 0 1px 6px;height:18px}.el-select-dropdown{z-index:calc(var(--el-index-top) + 1);border-radius:var(--el-border-radius-base);box-sizing:border-box}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected{color:var(--el-color-primary);background-color:var(--el-bg-color-overlay)}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.hover{background-color:var(--el-fill-color-light)}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected:after{content:\"\";position:absolute;top:50%;right:20px;border-top:none;border-right:none;background-repeat:no-repeat;background-position:center;background-color:var(--el-color-primary);-webkit-mask:url(\"data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E\") no-repeat;mask:url(\"data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E\") no-repeat;mask-size:100% 100%;-webkit-mask:url(\"data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E\") no-repeat;-webkit-mask-size:100% 100%;transform:translateY(-50%);width:12px;height:12px}.el-select-dropdown.is-multiple .el-select-dropdown__item.selected.is-disabled:after{background-color:var(--el-text-color-disabled)}.el-select-dropdown .el-select-dropdown__option-item.is-selected:after{content:\"\";position:absolute;top:50%;right:20px;border-top:none;border-right:none;background-repeat:no-repeat;background-position:center;background-color:var(--el-color-primary);-webkit-mask:url(\"data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E\") no-repeat;mask:url(\"data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E\") no-repeat;mask-size:100% 100%;-webkit-mask:url(\"data:image/svg+xml;utf8,%3Csvg class='icon' width='200' height='200' viewBox='0 0 1024 1024' xmlns='http://www.w3.org/2000/svg'%3E%3Cpath fill='currentColor' d='M406.656 706.944L195.84 496.256a32 32 0 10-45.248 45.248l256 256 512-512a32 32 0 00-45.248-45.248L406.592 706.944z'%3E%3C/path%3E%3C/svg%3E\") no-repeat;-webkit-mask-size:100% 100%;transform:translateY(-50%);width:12px;height:12px}.el-select-dropdown .el-scrollbar.is-empty .el-select-dropdown__list{padding:0}.el-select-dropdown .el-select-dropdown__item.is-disabled:hover{background-color:unset}.el-select-dropdown .el-select-dropdown__item.is-disabled.selected{color:var(--el-text-color-disabled)}.el-select-dropdown__empty{padding:10px 0;margin:0;text-align:center;color:var(--el-text-color-secondary);font-size:var(--el-select-font-size)}.el-select-dropdown__wrap{max-height:274px}.el-select-dropdown__list{list-style:none;padding:6px 0;margin:0;box-sizing:border-box}.el-select{--el-select-border-color-hover:var(--el-border-color-hover);--el-select-disabled-border:var(--el-disabled-border-color);--el-select-font-size:var(--el-font-size-base);--el-select-close-hover-color:var(--el-text-color-secondary);--el-select-input-color:var(--el-text-color-placeholder);--el-select-multiple-input-color:var(--el-text-color-regular);--el-select-input-focus-border-color:var(--el-color-primary);--el-select-input-font-size:14px}.el-select{display:inline-block;position:relative;vertical-align:middle;line-height:32px}.el-select__popper.el-popper{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light);box-shadow:var(--el-box-shadow-light)}.el-select__popper.el-popper .el-popper__arrow:before{border:1px solid var(--el-border-color-light)}.el-select__popper.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:transparent;border-left-color:transparent}.el-select__popper.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent;border-right-color:transparent}.el-select__popper.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-left-color:transparent;border-bottom-color:transparent}.el-select__popper.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent;border-top-color:transparent}.el-select .el-select-tags-wrapper.has-prefix{margin-left:6px}.el-select--large{line-height:40px}.el-select--large .el-select-tags-wrapper.has-prefix{margin-left:8px}.el-select--small{line-height:24px}.el-select--small .el-select-tags-wrapper.has-prefix{margin-left:4px}.el-select .el-select__tags>span{display:inline-block}.el-select:hover:not(.el-select--disabled) .el-input__wrapper{box-shadow:0 0 0 1px var(--el-select-border-color-hover) inset}.el-select .el-select__tags-text{display:inline-block;line-height:normal;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-select .el-input__wrapper{cursor:pointer}.el-select .el-input__wrapper.is-focus{box-shadow:0 0 0 1px var(--el-select-input-focus-border-color) inset!important}.el-select .el-input__inner{cursor:pointer}.el-select .el-input{display:flex}.el-select .el-input .el-select__caret{color:var(--el-select-input-color);font-size:var(--el-select-input-font-size);transition:transform var(--el-transition-duration);transform:rotate(0);cursor:pointer}.el-select .el-input .el-select__caret.is-reverse{transform:rotate(-180deg)}.el-select .el-input .el-select__caret.is-show-close{font-size:var(--el-select-font-size);text-align:center;transform:rotate(0);border-radius:var(--el-border-radius-circle);color:var(--el-select-input-color);transition:var(--el-transition-color)}.el-select .el-input .el-select__caret.is-show-close:hover{color:var(--el-select-close-hover-color)}.el-select .el-input .el-select__caret.el-icon{position:relative;height:inherit;z-index:2}.el-select .el-input.is-disabled .el-input__wrapper{cursor:not-allowed}.el-select .el-input.is-disabled .el-input__wrapper:hover{box-shadow:0 0 0 1px var(--el-select-disabled-border) inset}.el-select .el-input.is-disabled .el-input__inner,.el-select .el-input.is-disabled .el-select__caret{cursor:not-allowed}.el-select .el-input.is-focus .el-input__wrapper{box-shadow:0 0 0 1px var(--el-select-input-focus-border-color) inset!important}.el-select__input{border:none;outline:0;padding:0;margin-left:15px;color:var(--el-select-multiple-input-color);font-size:var(--el-select-font-size);-webkit-appearance:none;-moz-appearance:none;appearance:none;height:28px;background-color:transparent}.el-select__input.is-small{height:14px}.el-select__close{cursor:pointer;position:absolute;top:8px;z-index:var(--el-index-top);right:25px;color:var(--el-select-input-color);line-height:18px;font-size:var(--el-select-input-font-size)}.el-select__close:hover{color:var(--el-select-close-hover-color)}.el-select__tags{position:absolute;line-height:normal;top:50%;transform:translateY(-50%);white-space:normal;z-index:var(--el-index-normal);display:flex;align-items:center;flex-wrap:wrap}.el-select__collapse-tags{white-space:normal;z-index:var(--el-index-normal);display:flex;align-items:center;flex-wrap:wrap}.el-select__collapse-tag{line-height:inherit;height:inherit;display:flex}.el-select .el-select__tags .el-tag{box-sizing:border-box;border-color:transparent;margin:2px 6px 2px 0}.el-select .el-select__tags .el-tag:last-child{margin-right:0}.el-select .el-select__tags .el-tag .el-icon-close{background-color:var(--el-text-color-placeholder);right:-7px;top:0;color:#fff}.el-select .el-select__tags .el-tag .el-icon-close:hover{background-color:var(--el-text-color-secondary)}.el-select .el-select__tags .el-tag .el-icon-close:before{display:block;transform:translateY(.5px)}.el-select .el-select__tags .el-tag--info{background-color:var(--el-fill-color)}.el-skeleton{--el-skeleton-circle-size:var(--el-avatar-size)}.el-skeleton__item{background:var(--el-skeleton-color);display:inline-block;height:16px;border-radius:var(--el-border-radius-base);width:100%}.el-skeleton__circle{border-radius:50%;width:var(--el-skeleton-circle-size);height:var(--el-skeleton-circle-size);line-height:var(--el-skeleton-circle-size)}.el-skeleton__button{height:40px;width:64px;border-radius:4px}.el-skeleton__p{width:100%}.el-skeleton__p.is-last{width:61%}.el-skeleton__p.is-first{width:33%}.el-skeleton__text{width:100%;height:var(--el-font-size-small)}.el-skeleton__caption{height:var(--el-font-size-extra-small)}.el-skeleton__h1{height:var(--el-font-size-extra-large)}.el-skeleton__h3{height:var(--el-font-size-large)}.el-skeleton__h5{height:var(--el-font-size-medium)}.el-skeleton__image{width:unset;display:flex;align-items:center;justify-content:center;border-radius:0}.el-skeleton__image svg{color:var(--el-svg-monochrome-grey);fill:currentColor;width:22%;height:22%}.el-skeleton{--el-skeleton-color:var(--el-fill-color);--el-skeleton-to-color:var(--el-fill-color-darker)}@-webkit-keyframes el-skeleton-loading{0%{background-position:100% 50%}to{background-position:0 50%}}@keyframes el-skeleton-loading{0%{background-position:100% 50%}to{background-position:0 50%}}.el-skeleton{width:100%}.el-skeleton__first-line,.el-skeleton__paragraph{height:16px;margin-top:16px;background:var(--el-skeleton-color)}.el-skeleton.is-animated .el-skeleton__item{background:linear-gradient(90deg,var(--el-skeleton-color) 25%,var(--el-skeleton-to-color) 37%,var(--el-skeleton-color) 63%);background-size:400% 100%;-webkit-animation:el-skeleton-loading 1.4s ease infinite;animation:el-skeleton-loading 1.4s ease infinite}.el-slider{--el-slider-main-bg-color:var(--el-color-primary);--el-slider-runway-bg-color:var(--el-border-color-light);--el-slider-stop-bg-color:var(--el-color-white);--el-slider-disabled-color:var(--el-text-color-placeholder);--el-slider-border-radius:3px;--el-slider-height:6px;--el-slider-button-size:20px;--el-slider-button-wrapper-size:36px;--el-slider-button-wrapper-offset:-15px}.el-slider{width:100%;height:32px;display:flex;align-items:center}.el-slider__runway{flex:1;height:var(--el-slider-height);background-color:var(--el-slider-runway-bg-color);border-radius:var(--el-slider-border-radius);position:relative;cursor:pointer}.el-slider__runway.show-input{margin-right:30px;width:auto}.el-slider__runway.is-disabled{cursor:default}.el-slider__runway.is-disabled .el-slider__bar{background-color:var(--el-slider-disabled-color)}.el-slider__runway.is-disabled .el-slider__button{border-color:var(--el-slider-disabled-color)}.el-slider__runway.is-disabled .el-slider__button-wrapper.hover,.el-slider__runway.is-disabled .el-slider__button-wrapper:hover,.el-slider__runway.is-disabled .el-slider__button-wrapper.dragging{cursor:not-allowed}.el-slider__runway.is-disabled .el-slider__button.dragging,.el-slider__runway.is-disabled .el-slider__button.hover,.el-slider__runway.is-disabled .el-slider__button:hover{transform:scale(1)}.el-slider__runway.is-disabled .el-slider__button.hover,.el-slider__runway.is-disabled .el-slider__button:hover,.el-slider__runway.is-disabled .el-slider__button.dragging{cursor:not-allowed}.el-slider__input{flex-shrink:0;width:130px}.el-slider__bar{height:var(--el-slider-height);background-color:var(--el-slider-main-bg-color);border-top-left-radius:var(--el-slider-border-radius);border-bottom-left-radius:var(--el-slider-border-radius);position:absolute}.el-slider__button-wrapper{height:var(--el-slider-button-wrapper-size);width:var(--el-slider-button-wrapper-size);position:absolute;z-index:1;top:var(--el-slider-button-wrapper-offset);transform:translate(-50%);background-color:transparent;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;line-height:normal;outline:0}.el-slider__button-wrapper:after{display:inline-block;content:\"\";height:100%;vertical-align:middle}.el-slider__button-wrapper.hover,.el-slider__button-wrapper:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button-wrapper.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__button{display:inline-block;width:var(--el-slider-button-size);height:var(--el-slider-button-size);vertical-align:middle;border:solid 2px var(--el-slider-main-bg-color);background-color:var(--el-color-white);border-radius:50%;box-sizing:border-box;transition:var(--el-transition-duration-fast);-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-slider__button.dragging,.el-slider__button.hover,.el-slider__button:hover{transform:scale(1.2)}.el-slider__button.hover,.el-slider__button:hover{cursor:-webkit-grab;cursor:grab}.el-slider__button.dragging{cursor:-webkit-grabbing;cursor:grabbing}.el-slider__stop{position:absolute;height:var(--el-slider-height);width:var(--el-slider-height);border-radius:var(--el-border-radius-circle);background-color:var(--el-slider-stop-bg-color);transform:translate(-50%)}.el-slider__marks{top:0;left:12px;width:18px;height:100%}.el-slider__marks-text{position:absolute;transform:translate(-50%);font-size:14px;color:var(--el-color-info);margin-top:15px}.el-slider.is-vertical{position:relative;display:inline-flex;width:auto;height:100%;flex:0}.el-slider.is-vertical .el-slider__runway{width:var(--el-slider-height);height:100%;margin:0 16px}.el-slider.is-vertical .el-slider__bar{width:var(--el-slider-height);height:auto;border-radius:0 0 3px 3px}.el-slider.is-vertical .el-slider__button-wrapper{top:auto;left:var(--el-slider-button-wrapper-offset);transform:translateY(50%)}.el-slider.is-vertical .el-slider__stop{transform:translateY(50%)}.el-slider.is-vertical .el-slider__marks-text{margin-top:0;left:15px;transform:translateY(50%)}.el-slider--large{height:40px}.el-slider--small{height:24px}.el-space{display:inline-flex;vertical-align:top}.el-space__item{display:flex;flex-wrap:wrap}.el-space__item>*{flex:1}.el-space--vertical{flex-direction:column}.el-time-spinner{width:100%;white-space:nowrap}.el-spinner{display:inline-block;vertical-align:middle}.el-spinner-inner{-webkit-animation:rotate 2s linear infinite;animation:rotate 2s linear infinite;width:50px;height:50px}.el-spinner-inner .path{stroke:var(--el-border-color-lighter);stroke-linecap:round;-webkit-animation:dash 1.5s ease-in-out infinite;animation:dash 1.5s ease-in-out infinite}@-webkit-keyframes rotate{to{transform:rotate(360deg)}}@keyframes rotate{to{transform:rotate(360deg)}}@-webkit-keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}@keyframes dash{0%{stroke-dasharray:1,150;stroke-dashoffset:0}50%{stroke-dasharray:90,150;stroke-dashoffset:-35}to{stroke-dasharray:90,150;stroke-dashoffset:-124}}.el-step{position:relative;flex-shrink:1}.el-step:last-of-type .el-step__line{display:none}.el-step:last-of-type.is-flex{flex-basis:auto!important;flex-shrink:0;flex-grow:0}.el-step:last-of-type .el-step__description,.el-step:last-of-type .el-step__main{padding-right:0}.el-step__head{position:relative;width:100%}.el-step__head.is-process{color:var(--el-text-color-primary);border-color:var(--el-text-color-primary)}.el-step__head.is-wait{color:var(--el-text-color-placeholder);border-color:var(--el-text-color-placeholder)}.el-step__head.is-success{color:var(--el-color-success);border-color:var(--el-color-success)}.el-step__head.is-error{color:var(--el-color-danger);border-color:var(--el-color-danger)}.el-step__head.is-finish{color:var(--el-color-primary);border-color:var(--el-color-primary)}.el-step__icon{position:relative;z-index:1;display:inline-flex;justify-content:center;align-items:center;width:24px;height:24px;font-size:14px;box-sizing:border-box;background:var(--el-bg-color);transition:.15s ease-out}.el-step__icon.is-text{border-radius:50%;border:2px solid;border-color:inherit}.el-step__icon.is-icon{width:40px}.el-step__icon-inner{display:inline-block;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;text-align:center;font-weight:700;line-height:1;color:inherit}.el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:25px;font-weight:400}.el-step__icon-inner.is-status{transform:translateY(1px)}.el-step__line{position:absolute;border-color:inherit;background-color:var(--el-text-color-placeholder)}.el-step__line-inner{display:block;border-width:1px;border-style:solid;border-color:inherit;transition:.15s ease-out;box-sizing:border-box;width:0;height:0}.el-step__main{white-space:normal;text-align:left}.el-step__title{font-size:16px;line-height:38px}.el-step__title.is-process{font-weight:700;color:var(--el-text-color-primary)}.el-step__title.is-wait{color:var(--el-text-color-placeholder)}.el-step__title.is-success{color:var(--el-color-success)}.el-step__title.is-error{color:var(--el-color-danger)}.el-step__title.is-finish{color:var(--el-color-primary)}.el-step__description{padding-right:10%;margin-top:-5px;font-size:12px;line-height:20px;font-weight:400}.el-step__description.is-process{color:var(--el-text-color-primary)}.el-step__description.is-wait{color:var(--el-text-color-placeholder)}.el-step__description.is-success{color:var(--el-color-success)}.el-step__description.is-error{color:var(--el-color-danger)}.el-step__description.is-finish{color:var(--el-color-primary)}.el-step.is-horizontal{display:inline-block}.el-step.is-horizontal .el-step__line{height:2px;top:11px;left:0;right:0}.el-step.is-vertical{display:flex}.el-step.is-vertical .el-step__head{flex-grow:0;width:24px}.el-step.is-vertical .el-step__main{padding-left:10px;flex-grow:1}.el-step.is-vertical .el-step__title{line-height:24px;padding-bottom:8px}.el-step.is-vertical .el-step__line{width:2px;top:0;bottom:0;left:11px}.el-step.is-vertical .el-step__icon.is-icon{width:24px}.el-step.is-center .el-step__head,.el-step.is-center .el-step__main{text-align:center}.el-step.is-center .el-step__description{padding-left:20%;padding-right:20%}.el-step.is-center .el-step__line{left:50%;right:-50%}.el-step.is-simple{display:flex;align-items:center}.el-step.is-simple .el-step__head{width:auto;font-size:0;padding-right:10px}.el-step.is-simple .el-step__icon{background:0 0;width:16px;height:16px;font-size:12px}.el-step.is-simple .el-step__icon-inner[class*=el-icon]:not(.is-status){font-size:18px}.el-step.is-simple .el-step__icon-inner.is-status{transform:scale(.8) translateY(1px)}.el-step.is-simple .el-step__main{position:relative;display:flex;align-items:stretch;flex-grow:1}.el-step.is-simple .el-step__title{font-size:16px;line-height:20px}.el-step.is-simple:not(:last-of-type) .el-step__title{max-width:50%;word-break:break-all}.el-step.is-simple .el-step__arrow{flex-grow:1;display:flex;align-items:center;justify-content:center}.el-step.is-simple .el-step__arrow:after,.el-step.is-simple .el-step__arrow:before{content:\"\";display:inline-block;position:absolute;height:15px;width:1px;background:var(--el-text-color-placeholder)}.el-step.is-simple .el-step__arrow:before{transform:rotate(-45deg) translateY(-4px);transform-origin:0 0}.el-step.is-simple .el-step__arrow:after{transform:rotate(45deg) translateY(4px);transform-origin:100% 100%}.el-step.is-simple:last-of-type .el-step__arrow{display:none}.el-steps{display:flex}.el-steps--simple{padding:13px 8%;border-radius:4px;background:var(--el-fill-color-light)}.el-steps--horizontal{white-space:nowrap}.el-steps--vertical{height:100%;flex-flow:column}.el-switch{--el-switch-on-color:var(--el-color-primary);--el-switch-off-color:var(--el-border-color)}.el-switch{display:inline-flex;align-items:center;position:relative;font-size:14px;line-height:20px;height:32px;vertical-align:middle}.el-switch.is-disabled .el-switch__core,.el-switch.is-disabled .el-switch__label{cursor:not-allowed}.el-switch__label{transition:var(--el-transition-duration-fast);height:20px;display:inline-block;font-size:14px;font-weight:500;cursor:pointer;vertical-align:middle;color:var(--el-text-color-primary)}.el-switch__label.is-active{color:var(--el-color-primary)}.el-switch__label--left{margin-right:10px}.el-switch__label--right{margin-left:10px}.el-switch__label *{line-height:1;font-size:14px;display:inline-block}.el-switch__label .el-icon{height:inherit}.el-switch__label .el-icon svg{vertical-align:middle}.el-switch__input{position:absolute;width:0;height:0;opacity:0;margin:0}.el-switch__input:focus-visible~.el-switch__core{outline:2px solid var(--el-switch-on-color);outline-offset:1px}.el-switch__core{margin:0;display:inline-block;position:relative;width:40px;height:20px;border:1px solid var(--el-switch-border-color,var(--el-switch-off-color));outline:0;border-radius:10px;box-sizing:border-box;background:var(--el-switch-off-color);cursor:pointer;transition:border-color var(--el-transition-duration),background-color var(--el-transition-duration);vertical-align:middle}.el-switch__core .el-switch__inner{position:absolute;top:1px;transition:all var(--el-transition-duration);width:16px;height:16px;display:flex;justify-content:center;align-items:center;left:50%;white-space:nowrap}.el-switch__core .el-switch__inner .is-icon,.el-switch__core .el-switch__inner .is-text{color:var(--el-color-white);transition:opacity var(--el-transition-duration);position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-switch__core .el-switch__action{position:absolute;top:1px;left:1px;border-radius:var(--el-border-radius-circle);transition:all var(--el-transition-duration);width:16px;height:16px;background-color:var(--el-color-white);display:flex;justify-content:center;align-items:center;color:var(--el-switch-off-color)}.el-switch__core .el-switch__action .is-icon,.el-switch__core .el-switch__action .is-text{transition:opacity var(--el-transition-duration);position:absolute;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-switch__core .is-text{font-size:12px}.el-switch__core .is-show{opacity:1}.el-switch__core .is-hide{opacity:0}.el-switch.is-checked .el-switch__core{border-color:var(--el-switch-border-color,var(--el-switch-on-color));background-color:var(--el-switch-on-color)}.el-switch.is-checked .el-switch__core .el-switch__action{left:100%;margin-left:-17px;color:var(--el-switch-on-color)}.el-switch.is-checked .el-switch__core .el-switch__inner{left:50%;white-space:nowrap;margin-left:-17px}.el-switch.is-disabled{opacity:.6}.el-switch--wide .el-switch__label.el-switch__label--left span{left:10px}.el-switch--wide .el-switch__label.el-switch__label--right span{right:10px}.el-switch .label-fade-enter-from,.el-switch .label-fade-leave-active{opacity:0}.el-switch--large{font-size:14px;line-height:24px;height:40px}.el-switch--large .el-switch__label{height:24px;font-size:14px}.el-switch--large .el-switch__label *{font-size:14px}.el-switch--large .el-switch__core{width:50px;height:24px;border-radius:12px}.el-switch--large .el-switch__core .el-switch__inner,.el-switch--large .el-switch__core .el-switch__action{width:20px;height:20px}.el-switch--large.is-checked .el-switch__core .el-switch__action,.el-switch--large.is-checked .el-switch__core .el-switch__inner{margin-left:-21px}.el-switch--small{font-size:12px;line-height:16px;height:24px}.el-switch--small .el-switch__label{height:16px;font-size:12px}.el-switch--small .el-switch__label *{font-size:12px}.el-switch--small .el-switch__core{width:30px;height:16px;border-radius:8px}.el-switch--small .el-switch__core .el-switch__inner,.el-switch--small .el-switch__core .el-switch__action{width:12px;height:12px}.el-switch--small.is-checked .el-switch__core .el-switch__action,.el-switch--small.is-checked .el-switch__core .el-switch__inner{margin-left:-13px}.el-table-column--selection .cell{padding-left:14px;padding-right:14px}.el-table-filter{border:solid 1px var(--el-border-color-lighter);border-radius:2px;background-color:#fff;box-shadow:var(--el-box-shadow-light);box-sizing:border-box}.el-table-filter__list{padding:5px 0;margin:0;list-style:none;min-width:100px}.el-table-filter__list-item{line-height:36px;padding:0 10px;cursor:pointer;font-size:var(--el-font-size-base)}.el-table-filter__list-item:hover{background-color:var(--el-color-primary-light-9);color:var(--el-color-primary)}.el-table-filter__list-item.is-active{background-color:var(--el-color-primary);color:#fff}.el-table-filter__content{min-width:100px}.el-table-filter__bottom{border-top:1px solid var(--el-border-color-lighter);padding:8px}.el-table-filter__bottom button{background:0 0;border:none;color:var(--el-text-color-regular);cursor:pointer;font-size:var(--el-font-size-small);padding:0 3px}.el-table-filter__bottom button:hover{color:var(--el-color-primary)}.el-table-filter__bottom button:focus{outline:0}.el-table-filter__bottom button.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-table-filter__wrap{max-height:280px}.el-table-filter__checkbox-group{padding:10px}.el-table-filter__checkbox-group label.el-checkbox{display:flex;align-items:center;margin-right:5px;margin-bottom:12px;margin-left:5px;height:unset}.el-table-filter__checkbox-group .el-checkbox:last-child{margin-bottom:0}.el-table{--el-table-border-color:var(--el-border-color-lighter);--el-table-border:1px solid var(--el-table-border-color);--el-table-text-color:var(--el-text-color-regular);--el-table-header-text-color:var(--el-text-color-secondary);--el-table-row-hover-bg-color:var(--el-fill-color-light);--el-table-current-row-bg-color:var(--el-color-primary-light-9);--el-table-header-bg-color:var(--el-bg-color);--el-table-fixed-box-shadow:var(--el-box-shadow-light);--el-table-bg-color:var(--el-fill-color-blank);--el-table-tr-bg-color:var(--el-fill-color-blank);--el-table-expanded-cell-bg-color:var(--el-fill-color-blank);--el-table-fixed-left-column:inset 10px 0 10px -10px rgba(0, 0, 0, .15);--el-table-fixed-right-column:inset -10px 0 10px -10px rgba(0, 0, 0, .15)}.el-table{position:relative;overflow:hidden;box-sizing:border-box;height:-webkit-fit-content;height:-moz-fit-content;height:fit-content;width:100%;max-width:100%;background-color:var(--el-table-bg-color);font-size:14px;color:var(--el-table-text-color)}.el-table__inner-wrapper{position:relative;display:flex;flex-direction:column;height:100%}.el-table__inner-wrapper:before{left:0;bottom:0;width:100%;height:1px;z-index:3}.el-table.has-footer.el-table--fluid-height tr:last-child td.el-table__cell,.el-table.has-footer.el-table--scrollable-y tr:last-child td.el-table__cell{border-bottom-color:transparent}.el-table__empty-block{position:-webkit-sticky;position:sticky;left:0;min-height:60px;text-align:center;width:100%;display:flex;justify-content:center;align-items:center}.el-table__empty-text{line-height:60px;width:50%;color:var(--el-text-color-secondary)}.el-table__expand-column .cell{padding:0;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-table__expand-icon{position:relative;cursor:pointer;color:var(--el-text-color-regular);font-size:12px;transition:transform var(--el-transition-duration-fast) ease-in-out;height:20px}.el-table__expand-icon--expanded{transform:rotate(90deg)}.el-table__expand-icon>.el-icon{font-size:12px}.el-table__expanded-cell{background-color:var(--el-table-expanded-cell-bg-color)}.el-table__expanded-cell[class*=cell]{padding:20px 50px}.el-table__expanded-cell:hover{background-color:transparent!important}.el-table__placeholder{display:inline-block;width:20px}.el-table__append-wrapper{overflow:hidden}.el-table--fit{border-right:0;border-bottom:0}.el-table--fit .el-table__cell.gutter{border-right-width:1px}.el-table thead{color:var(--el-table-header-text-color);font-weight:500}.el-table thead.is-group th.el-table__cell{background:var(--el-fill-color-light)}.el-table .el-table__cell{padding:8px 0;min-width:0;box-sizing:border-box;text-overflow:ellipsis;vertical-align:middle;position:relative;text-align:left;z-index:1}.el-table .el-table__cell.is-center{text-align:center}.el-table .el-table__cell.is-right{text-align:right}.el-table .el-table__cell.gutter{width:15px;border-right-width:0;border-bottom-width:0;padding:0}.el-table .el-table__cell.is-hidden>*{visibility:hidden}.el-table .cell{box-sizing:border-box;overflow:hidden;text-overflow:ellipsis;white-space:normal;word-break:break-all;line-height:23px;padding:0 12px}.el-table .cell.el-tooltip{white-space:nowrap;min-width:50px}.el-table--large{font-size:var(--el-font-size-base)}.el-table--large .el-table__cell{padding:12px 0}.el-table--large .cell{padding:0 16px}.el-table--small{font-size:12px}.el-table--small .el-table__cell{padding:4px 0}.el-table--small .cell{padding:0 8px}.el-table tr{background-color:var(--el-table-tr-bg-color)}.el-table tr input[type=checkbox]{margin:0}.el-table td.el-table__cell,.el-table th.el-table__cell.is-leaf{border-bottom:var(--el-table-border)}.el-table th.el-table__cell.is-sortable{cursor:pointer}.el-table th.el-table__cell{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;background-color:var(--el-table-header-bg-color)}.el-table th.el-table__cell>.cell.highlight{color:var(--el-color-primary)}.el-table th.el-table__cell.required>div:before{display:inline-block;content:\"\";width:8px;height:8px;border-radius:50%;background:#ff4d51;margin-right:5px;vertical-align:middle}.el-table td.el-table__cell div{box-sizing:border-box}.el-table td.el-table__cell.gutter{width:0}.el-table__footer-wrapper{border-top:var(--el-table-border)}.el-table--border .el-table__footer-wrapper tr:first-child td:first-child,.el-table--border .el-table__footer-wrapper tr:first-child th:first-child,.el-table--border .el-table__inner-wrapper tr:first-child td:first-child,.el-table--border .el-table__inner-wrapper tr:first-child th:first-child,.el-table--group .el-table__footer-wrapper tr:first-child td:first-child,.el-table--group .el-table__footer-wrapper tr:first-child th:first-child,.el-table--group .el-table__inner-wrapper tr:first-child td:first-child,.el-table--group .el-table__inner-wrapper tr:first-child th:first-child{border-left:var(--el-table-border)}.el-table--border .el-table__inner-wrapper:after,.el-table--border:after,.el-table--border:before,.el-table__inner-wrapper:before{content:\"\";position:absolute;background-color:var(--el-table-border-color);z-index:3}.el-table--border .el-table__inner-wrapper:after{left:0;top:0;width:100%;height:1px;z-index:3}.el-table--border:before{top:-1px;left:0;width:1px;height:100%;z-index:3}.el-table--border:after{top:-1px;right:0;width:1px;height:100%;z-index:3}.el-table--border .el-table__inner-wrapper{border-right:none;border-bottom:none}.el-table--border .el-table__footer-wrapper{position:relative;flex-shrink:0}.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table--border th.el-table__cell.gutter:last-of-type{border-bottom:var(--el-table-border);border-bottom-width:1px}.el-table--border th.el-table__cell{border-bottom:var(--el-table-border)}.el-table--hidden{visibility:hidden}.el-table__body-wrapper,.el-table__footer-wrapper,.el-table__header-wrapper{width:100%}.el-table__body-wrapper tr td.el-table-fixed-column--left,.el-table__body-wrapper tr td.el-table-fixed-column--right,.el-table__body-wrapper tr th.el-table-fixed-column--left,.el-table__body-wrapper tr th.el-table-fixed-column--right,.el-table__footer-wrapper tr td.el-table-fixed-column--left,.el-table__footer-wrapper tr td.el-table-fixed-column--right,.el-table__footer-wrapper tr th.el-table-fixed-column--left,.el-table__footer-wrapper tr th.el-table-fixed-column--right,.el-table__header-wrapper tr td.el-table-fixed-column--left,.el-table__header-wrapper tr td.el-table-fixed-column--right,.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{position:-webkit-sticky!important;position:sticky!important;z-index:2;background:var(--el-bg-color)}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before{content:\"\";position:absolute;top:0;width:10px;bottom:-1px;overflow-x:hidden;overflow-y:hidden;box-shadow:none;touch-action:none;pointer-events:none}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-first-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-first-column:before{left:-10px}.el-table__body-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__body-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__footer-wrapper tr th.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr td.el-table-fixed-column--right.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--left.is-last-column:before,.el-table__header-wrapper tr th.el-table-fixed-column--right.is-last-column:before{right:-10px;box-shadow:none}.el-table__body-wrapper tr td.el-table__fixed-right-patch,.el-table__body-wrapper tr th.el-table__fixed-right-patch,.el-table__footer-wrapper tr td.el-table__fixed-right-patch,.el-table__footer-wrapper tr th.el-table__fixed-right-patch,.el-table__header-wrapper tr td.el-table__fixed-right-patch,.el-table__header-wrapper tr th.el-table__fixed-right-patch{position:-webkit-sticky!important;position:sticky!important;z-index:2;background:#fff;right:0}.el-table__header-wrapper{flex-shrink:0}.el-table__header-wrapper tr th.el-table-fixed-column--left,.el-table__header-wrapper tr th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body,.el-table__footer,.el-table__header{table-layout:fixed;border-collapse:separate}.el-table__footer-wrapper,.el-table__header-wrapper{overflow:hidden}.el-table__footer-wrapper tbody td.el-table__cell,.el-table__header-wrapper tbody td.el-table__cell{background-color:var(--el-table-row-hover-bg-color);color:var(--el-table-text-color)}.el-table__body-wrapper .el-table-column--selection>.cell,.el-table__header-wrapper .el-table-column--selection>.cell{display:inline-flex;align-items:center;height:23px}.el-table__body-wrapper .el-table-column--selection .el-checkbox,.el-table__header-wrapper .el-table-column--selection .el-checkbox{height:unset}.el-table.is-scrolling-left .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-left.el-table--border .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:var(--el-table-border)}.el-table.is-scrolling-left th.el-table-fixed-column--left{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-right .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-right th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column.el-table__cell{border-right:none}.el-table.is-scrolling-middle .el-table-fixed-column--right.is-first-column:before{box-shadow:var(--el-table-fixed-right-column)}.el-table.is-scrolling-middle .el-table-fixed-column--left.is-last-column:before{box-shadow:var(--el-table-fixed-left-column)}.el-table.is-scrolling-none .el-table-fixed-column--left.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--left.is-last-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-first-column:before,.el-table.is-scrolling-none .el-table-fixed-column--right.is-last-column:before{box-shadow:none}.el-table.is-scrolling-none th.el-table-fixed-column--left,.el-table.is-scrolling-none th.el-table-fixed-column--right{background-color:var(--el-table-header-bg-color)}.el-table__body-wrapper{overflow:hidden;position:relative;flex:1}.el-table__body-wrapper .el-scrollbar__bar{z-index:2}.el-table .caret-wrapper{display:inline-flex;flex-direction:column;align-items:center;height:14px;width:24px;vertical-align:middle;cursor:pointer;overflow:initial;position:relative}.el-table .sort-caret{width:0;height:0;border:solid 5px transparent;position:absolute;left:7px}.el-table .sort-caret.ascending{border-bottom-color:var(--el-text-color-placeholder);top:-5px}.el-table .sort-caret.descending{border-top-color:var(--el-text-color-placeholder);bottom:-3px}.el-table .ascending .sort-caret.ascending{border-bottom-color:var(--el-color-primary)}.el-table .descending .sort-caret.descending{border-top-color:var(--el-color-primary)}.el-table .hidden-columns{visibility:hidden;position:absolute;z-index:-1}.el-table--striped .el-table__body tr.el-table__row--striped td.el-table__cell{background:var(--el-fill-color-lighter)}.el-table--striped .el-table__body tr.el-table__row--striped.current-row td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table__body tr.hover-row.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped.current-row>td.el-table__cell,.el-table__body tr.hover-row.el-table__row--striped>td.el-table__cell,.el-table__body tr.hover-row>td.el-table__cell{background-color:var(--el-table-row-hover-bg-color)}.el-table__body tr.current-row>td.el-table__cell{background-color:var(--el-table-current-row-bg-color)}.el-table__column-resize-proxy{position:absolute;left:200px;top:0;bottom:0;width:0;border-left:var(--el-table-border);z-index:10}.el-table__column-filter-trigger{display:inline-block;cursor:pointer}.el-table__column-filter-trigger i{color:var(--el-color-info);font-size:14px;vertical-align:middle}.el-table__border-left-patch{top:0;left:0;width:1px;height:100%;z-index:3;position:absolute;background-color:var(--el-table-border-color)}.el-table__border-bottom-patch{left:0;height:1px;z-index:3;position:absolute;background-color:var(--el-table-border-color)}.el-table__border-right-patch{top:0;height:100%;width:1px;z-index:3;position:absolute;background-color:var(--el-table-border-color)}.el-table--enable-row-transition .el-table__body td.el-table__cell{transition:background-color .25s ease}.el-table--enable-row-hover .el-table__body tr:hover>td.el-table__cell{background-color:var(--el-table-row-hover-bg-color)}.el-table [class*=el-table__row--level] .el-table__expand-icon{display:inline-block;width:12px;line-height:12px;height:12px;text-align:center;margin-right:8px}.el-table .el-table.el-table--border .el-table__cell{border-right:var(--el-table-border)}.el-table:not(.el-table--border) .el-table__cell{border-right:none}.el-table:not(.el-table--border)>.el-table__inner-wrapper:after{content:none}.el-table:not(.el-table--border) .el-table__footer-wrapper tr:first-child td:first-child,.el-table:not(.el-table--border) .el-table__footer-wrapper tr:first-child th:first-child,.el-table:not(.el-table--border) .el-table__inner-wrapper tr:first-child td:first-child,.el-table:not(.el-table--border) .el-table__inner-wrapper tr:first-child th:first-child{border-left:none}.el-table-v2{--el-table-border-color:var(--el-border-color-lighter);--el-table-border:1px solid var(--el-table-border-color);--el-table-text-color:var(--el-text-color-regular);--el-table-header-text-color:var(--el-text-color-secondary);--el-table-row-hover-bg-color:var(--el-fill-color-light);--el-table-current-row-bg-color:var(--el-color-primary-light-9);--el-table-header-bg-color:var(--el-bg-color);--el-table-fixed-box-shadow:var(--el-box-shadow-light);--el-table-bg-color:var(--el-fill-color-blank);--el-table-tr-bg-color:var(--el-fill-color-blank);--el-table-expanded-cell-bg-color:var(--el-fill-color-blank);--el-table-fixed-left-column:inset 10px 0 10px -10px rgba(0, 0, 0, .15);--el-table-fixed-right-column:inset -10px 0 10px -10px rgba(0, 0, 0, .15)}.el-table-v2{font-size:14px}.el-table-v2 *{box-sizing:border-box}.el-table-v2__root{position:relative}.el-table-v2__root:hover .el-table-v2__main .el-virtual-scrollbar{opacity:1}.el-table-v2__main{display:flex;flex-direction:column-reverse;position:absolute;overflow:hidden;top:0;background-color:var(--el-bg-color);left:0}.el-table-v2__main .el-vl__horizontal,.el-table-v2__main .el-vl__vertical{z-index:2}.el-table-v2__left{display:flex;flex-direction:column-reverse;position:absolute;overflow:hidden;top:0;background-color:var(--el-bg-color);left:0;box-shadow:2px 0 4px #0000000f}.el-table-v2__left .el-virtual-scrollbar{opacity:0}.el-table-v2__left .el-vl__horizontal,.el-table-v2__left .el-vl__vertical{z-index:-1}.el-table-v2__right{display:flex;flex-direction:column-reverse;position:absolute;overflow:hidden;top:0;background-color:var(--el-bg-color);right:0;box-shadow:-2px 0 4px #0000000f}.el-table-v2__right .el-virtual-scrollbar{opacity:0}.el-table-v2__right .el-vl__horizontal,.el-table-v2__right .el-vl__vertical{z-index:-1}.el-table-v2__header-row,.el-table-v2__row{-webkit-padding-end:var(--el-table-scrollbar-size);padding-inline-end:var(--el-table-scrollbar-size)}.el-table-v2__header-wrapper{overflow:hidden}.el-table-v2__header{position:relative;overflow:hidden}.el-table-v2__footer{position:absolute;left:0;right:0;bottom:0;overflow:hidden}.el-table-v2__empty{position:absolute;left:0}.el-table-v2__overlay{position:absolute;inset:0;z-index:9999}.el-table-v2__header-row{display:flex;border-bottom:var(--el-table-border)}.el-table-v2__header-cell{display:flex;align-items:center;padding:0 8px;height:100%;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:hidden;background-color:var(--el-table-header-bg-color);color:var(--el-table-header-text-color);font-weight:700}.el-table-v2__header-cell.is-align-center{justify-content:center;text-align:center}.el-table-v2__header-cell.is-align-right{justify-content:flex-end;text-align:right}.el-table-v2__header-cell.is-sortable{cursor:pointer}.el-table-v2__header-cell:hover .el-icon{display:block}.el-table-v2__sort-icon{transition:opacity,display var(--el-transition-duration);opacity:.6;display:none}.el-table-v2__sort-icon.is-sorting{display:block;opacity:1}.el-table-v2__row{border-bottom:var(--el-table-border);display:flex;align-items:center;transition:background-color var(--el-transition-duration)}.el-table-v2__row.is-hovered,.el-table-v2__row:hover{background-color:var(--el-table-row-hover-bg-color)}.el-table-v2__row-cell{height:100%;overflow:hidden;display:flex;align-items:center;padding:0 8px}.el-table-v2__row-cell.is-align-center{justify-content:center;text-align:center}.el-table-v2__row-cell.is-align-right{justify-content:flex-end;text-align:right}.el-table-v2__expand-icon{margin:0 4px;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.el-table-v2__expand-icon svg{transition:transform var(--el-transition-duration)}.el-table-v2__expand-icon.is-expanded svg{transform:rotate(90deg)}.el-table-v2:not(.is-dynamic) .el-table-v2__cell-text{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-table-v2.is-dynamic .el-table-v2__row{overflow:hidden;align-items:stretch}.el-table-v2.is-dynamic .el-table-v2__row .el-table-v2__row-cell{word-break:break-all}.el-tabs{--el-tabs-header-height:40px}.el-tabs__header{padding:0;position:relative;margin:0 0 15px}.el-tabs__active-bar{position:absolute;bottom:0;left:0;height:2px;background-color:var(--el-color-primary);z-index:1;transition:width var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier),transform var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);list-style:none}.el-tabs__new-tab{display:flex;align-items:center;justify-content:center;float:right;border:1px solid var(--el-border-color);height:20px;width:20px;line-height:20px;margin:10px 0 10px 10px;border-radius:3px;text-align:center;font-size:12px;color:var(--el-text-color-primary);cursor:pointer;transition:all .15s}.el-tabs__new-tab .is-icon-plus{height:inherit;width:inherit;transform:scale(.8)}.el-tabs__new-tab .is-icon-plus svg{vertical-align:middle}.el-tabs__new-tab:hover{color:var(--el-color-primary)}.el-tabs__nav-wrap{overflow:hidden;margin-bottom:-1px;position:relative}.el-tabs__nav-wrap:after{content:\"\";position:absolute;left:0;bottom:0;width:100%;height:2px;background-color:var(--el-border-color-light);z-index:var(--el-index-normal)}.el-tabs__nav-wrap.is-scrollable{padding:0 20px;box-sizing:border-box}.el-tabs__nav-scroll{overflow:hidden}.el-tabs__nav-next,.el-tabs__nav-prev{position:absolute;cursor:pointer;line-height:44px;font-size:12px;color:var(--el-text-color-secondary)}.el-tabs__nav-next{right:0}.el-tabs__nav-prev{left:0}.el-tabs__nav{white-space:nowrap;position:relative;transition:transform var(--el-transition-duration);float:left;z-index:calc(var(--el-index-normal) + 1)}.el-tabs__nav.is-stretch{min-width:100%;display:flex}.el-tabs__nav.is-stretch>*{flex:1;text-align:center}.el-tabs__item{padding:0 20px;height:var(--el-tabs-header-height);box-sizing:border-box;line-height:var(--el-tabs-header-height);display:inline-block;list-style:none;font-size:var(--el-font-size-base);font-weight:500;color:var(--el-text-color-primary);position:relative}.el-tabs__item:focus,.el-tabs__item:focus:active{outline:0}.el-tabs__item:focus-visible{box-shadow:0 0 2px 2px var(--el-color-primary) inset;border-radius:3px}.el-tabs__item .is-icon-close{border-radius:50%;text-align:center;transition:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);margin-left:5px}.el-tabs__item .is-icon-close:before{transform:scale(.9);display:inline-block}.el-tabs__item .is-icon-close:hover{background-color:var(--el-text-color-placeholder);color:#fff}.el-tabs__item .is-icon-close svg{margin-top:1px}.el-tabs__item.is-active{color:var(--el-color-primary)}.el-tabs__item:hover{color:var(--el-color-primary);cursor:pointer}.el-tabs__item.is-disabled{color:var(--el-disabled-text-color);cursor:not-allowed}.el-tabs__content{overflow:hidden;position:relative}.el-tabs--card>.el-tabs__header{border-bottom:1px solid var(--el-border-color-light);height:var(--el-tabs-header-height)}.el-tabs--card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--card>.el-tabs__header .el-tabs__nav{border:1px solid var(--el-border-color-light);border-bottom:none;border-radius:4px 4px 0 0;box-sizing:border-box}.el-tabs--card>.el-tabs__header .el-tabs__active-bar{display:none}.el-tabs--card>.el-tabs__header .el-tabs__item .is-icon-close{position:relative;font-size:12px;width:0;height:14px;vertical-align:middle;line-height:15px;overflow:hidden;top:-1px;right:-2px;transform-origin:100% 50%}.el-tabs--card>.el-tabs__header .el-tabs__item{border-bottom:1px solid transparent;border-left:1px solid var(--el-border-color-light);transition:color var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier),padding var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier)}.el-tabs--card>.el-tabs__header .el-tabs__item:first-child{border-left:none}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover{padding-left:13px;padding-right:13px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-closable:hover .is-icon-close{width:14px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active{border-bottom-color:var(--el-bg-color)}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable{padding-left:20px;padding-right:20px}.el-tabs--card>.el-tabs__header .el-tabs__item.is-active.is-closable .is-icon-close{width:14px}.el-tabs--border-card{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color)}.el-tabs--border-card>.el-tabs__content{padding:15px}.el-tabs--border-card>.el-tabs__header{background-color:var(--el-fill-color-light);border-bottom:1px solid var(--el-border-color-light);margin:0}.el-tabs--border-card>.el-tabs__header .el-tabs__nav-wrap:after{content:none}.el-tabs--border-card>.el-tabs__header .el-tabs__item{transition:all var(--el-transition-duration) var(--el-transition-function-ease-in-out-bezier);border:1px solid transparent;margin-top:-1px;color:var(--el-text-color-secondary)}.el-tabs--border-card>.el-tabs__header .el-tabs__item:first-child{margin-left:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item+.el-tabs__item{margin-left:-1px}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-active{color:var(--el-color-primary);background-color:var(--el-bg-color-overlay);border-right-color:var(--el-border-color);border-left-color:var(--el-border-color)}.el-tabs--border-card>.el-tabs__header .el-tabs__item:not(.is-disabled):hover{color:var(--el-color-primary)}.el-tabs--border-card>.el-tabs__header .el-tabs__item.is-disabled{color:var(--el-disabled-text-color)}.el-tabs--border-card>.el-tabs__header .is-scrollable .el-tabs__item:first-child{margin-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:nth-child(2),.el-tabs--bottom .el-tabs__item.is-top:nth-child(2),.el-tabs--top .el-tabs__item.is-bottom:nth-child(2),.el-tabs--top .el-tabs__item.is-top:nth-child(2){padding-left:0}.el-tabs--bottom .el-tabs__item.is-bottom:last-child,.el-tabs--bottom .el-tabs__item.is-top:last-child,.el-tabs--top .el-tabs__item.is-bottom:last-child,.el-tabs--top .el-tabs__item.is-top:last-child{padding-right:0}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:nth-child(2),.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:nth-child(2){padding-left:20px}.el-tabs--bottom .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--bottom.el-tabs--card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--left>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top .el-tabs--right>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--border-card>.el-tabs__header .el-tabs__item:last-child,.el-tabs--top.el-tabs--card>.el-tabs__header .el-tabs__item:last-child{padding-right:20px}.el-tabs--bottom .el-tabs__header.is-bottom{margin-bottom:0;margin-top:10px}.el-tabs--bottom.el-tabs--border-card .el-tabs__header.is-bottom{border-bottom:0;border-top:1px solid var(--el-border-color)}.el-tabs--bottom.el-tabs--border-card .el-tabs__nav-wrap.is-bottom{margin-top:-1px;margin-bottom:0}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom:not(.is-active){border:1px solid transparent}.el-tabs--bottom.el-tabs--border-card .el-tabs__item.is-bottom{margin:0 -1px -1px}.el-tabs--left,.el-tabs--right{overflow:hidden}.el-tabs--left .el-tabs__header.is-left,.el-tabs--left .el-tabs__header.is-right,.el-tabs--left .el-tabs__nav-scroll,.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__header.is-left,.el-tabs--right .el-tabs__header.is-right,.el-tabs--right .el-tabs__nav-scroll,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{height:100%}.el-tabs--left .el-tabs__active-bar.is-left,.el-tabs--left .el-tabs__active-bar.is-right,.el-tabs--right .el-tabs__active-bar.is-left,.el-tabs--right .el-tabs__active-bar.is-right{top:0;bottom:auto;width:2px;height:auto}.el-tabs--left .el-tabs__nav-wrap.is-left,.el-tabs--left .el-tabs__nav-wrap.is-right,.el-tabs--right .el-tabs__nav-wrap.is-left,.el-tabs--right .el-tabs__nav-wrap.is-right{margin-bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{height:30px;line-height:30px;width:100%;text-align:center;cursor:pointer}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next i,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev i{transform:rotate(90deg)}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-prev,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-prev{left:auto;top:0}.el-tabs--left .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--left .el-tabs__nav-wrap.is-right>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-left>.el-tabs__nav-next,.el-tabs--right .el-tabs__nav-wrap.is-right>.el-tabs__nav-next{right:auto;bottom:0}.el-tabs--left .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--left .el-tabs__nav-wrap.is-right.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-left.is-scrollable,.el-tabs--right .el-tabs__nav-wrap.is-right.is-scrollable{padding:30px 0}.el-tabs--left .el-tabs__nav-wrap.is-left:after,.el-tabs--left .el-tabs__nav-wrap.is-right:after,.el-tabs--right .el-tabs__nav-wrap.is-left:after,.el-tabs--right .el-tabs__nav-wrap.is-right:after{height:100%;width:2px;bottom:auto;top:0}.el-tabs--left .el-tabs__nav.is-left,.el-tabs--left .el-tabs__nav.is-right,.el-tabs--right .el-tabs__nav.is-left,.el-tabs--right .el-tabs__nav.is-right{float:none}.el-tabs--left .el-tabs__item.is-left,.el-tabs--left .el-tabs__item.is-right,.el-tabs--right .el-tabs__item.is-left,.el-tabs--right .el-tabs__item.is-right{display:block}.el-tabs--left .el-tabs__header.is-left{float:left;margin-bottom:0;margin-right:10px}.el-tabs--left .el-tabs__nav-wrap.is-left{margin-right:-1px}.el-tabs--left .el-tabs__nav-wrap.is-left:after{left:auto;right:0}.el-tabs--left .el-tabs__active-bar.is-left{right:0;left:auto}.el-tabs--left .el-tabs__item.is-left{text-align:right}.el-tabs--left.el-tabs--card .el-tabs__active-bar.is-left{display:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left{border-left:none;border-right:1px solid var(--el-border-color-light);border-bottom:none;border-top:1px solid var(--el-border-color-light);text-align:left}.el-tabs--left.el-tabs--card .el-tabs__item.is-left:first-child{border-right:1px solid var(--el-border-color-light);border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active{border:1px solid var(--el-border-color-light);border-right-color:#fff;border-left:none;border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:first-child{border-top:none}.el-tabs--left.el-tabs--card .el-tabs__item.is-left.is-active:last-child{border-bottom:none}.el-tabs--left.el-tabs--card .el-tabs__nav{border-radius:4px 0 0 4px;border-bottom:1px solid var(--el-border-color-light);border-right:none}.el-tabs--left.el-tabs--card .el-tabs__new-tab{float:none}.el-tabs--left.el-tabs--border-card .el-tabs__header.is-left{border-right:1px solid var(--el-border-color)}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left{border:1px solid transparent;margin:-1px 0 -1px -1px}.el-tabs--left.el-tabs--border-card .el-tabs__item.is-left.is-active{border-color:transparent;border-top-color:#d1dbe5;border-bottom-color:#d1dbe5}.el-tabs--right .el-tabs__header.is-right{float:right;margin-bottom:0;margin-left:10px}.el-tabs--right .el-tabs__nav-wrap.is-right{margin-left:-1px}.el-tabs--right .el-tabs__nav-wrap.is-right:after{left:0;right:auto}.el-tabs--right .el-tabs__active-bar.is-right{left:0}.el-tabs--right.el-tabs--card .el-tabs__active-bar.is-right{display:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right{border-bottom:none;border-top:1px solid var(--el-border-color-light)}.el-tabs--right.el-tabs--card .el-tabs__item.is-right:first-child{border-left:1px solid var(--el-border-color-light);border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active{border:1px solid var(--el-border-color-light);border-left-color:#fff;border-right:none;border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:first-child{border-top:none}.el-tabs--right.el-tabs--card .el-tabs__item.is-right.is-active:last-child{border-bottom:none}.el-tabs--right.el-tabs--card .el-tabs__nav{border-radius:0 4px 4px 0;border-bottom:1px solid var(--el-border-color-light);border-left:none}.el-tabs--right.el-tabs--border-card .el-tabs__header.is-right{border-left:1px solid var(--el-border-color)}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right{border:1px solid transparent;margin:-1px -1px -1px 0}.el-tabs--right.el-tabs--border-card .el-tabs__item.is-right.is-active{border-color:transparent;border-top-color:#d1dbe5;border-bottom-color:#d1dbe5}.slideInLeft-transition,.slideInRight-transition{display:inline-block}.slideInRight-enter{-webkit-animation:slideInRight-enter var(--el-transition-duration);animation:slideInRight-enter var(--el-transition-duration)}.slideInRight-leave{position:absolute;left:0;right:0;-webkit-animation:slideInRight-leave var(--el-transition-duration);animation:slideInRight-leave var(--el-transition-duration)}.slideInLeft-enter{-webkit-animation:slideInLeft-enter var(--el-transition-duration);animation:slideInLeft-enter var(--el-transition-duration)}.slideInLeft-leave{position:absolute;left:0;right:0;-webkit-animation:slideInLeft-leave var(--el-transition-duration);animation:slideInLeft-leave var(--el-transition-duration)}@-webkit-keyframes slideInRight-enter{0%{opacity:0;transform-origin:0 0;transform:translate(100%)}to{opacity:1;transform-origin:0 0;transform:translate(0)}}@keyframes slideInRight-enter{0%{opacity:0;transform-origin:0 0;transform:translate(100%)}to{opacity:1;transform-origin:0 0;transform:translate(0)}}@-webkit-keyframes slideInRight-leave{0%{transform-origin:0 0;transform:translate(0);opacity:1}to{transform-origin:0 0;transform:translate(100%);opacity:0}}@keyframes slideInRight-leave{0%{transform-origin:0 0;transform:translate(0);opacity:1}to{transform-origin:0 0;transform:translate(100%);opacity:0}}@-webkit-keyframes slideInLeft-enter{0%{opacity:0;transform-origin:0 0;transform:translate(-100%)}to{opacity:1;transform-origin:0 0;transform:translate(0)}}@keyframes slideInLeft-enter{0%{opacity:0;transform-origin:0 0;transform:translate(-100%)}to{opacity:1;transform-origin:0 0;transform:translate(0)}}@-webkit-keyframes slideInLeft-leave{0%{transform-origin:0 0;transform:translate(0);opacity:1}to{transform-origin:0 0;transform:translate(-100%);opacity:0}}@keyframes slideInLeft-leave{0%{transform-origin:0 0;transform:translate(0);opacity:1}to{transform-origin:0 0;transform:translate(-100%);opacity:0}}.el-tag{--el-tag-font-size:12px;--el-tag-border-radius:4px;--el-tag-border-radius-rounded:9999px}.el-tag{--el-tag-bg-color:var(--el-color-primary-light-9);--el-tag-border-color:var(--el-color-primary-light-8);--el-tag-hover-color:var(--el-color-primary);--el-tag-text-color:var(--el-color-primary);background-color:var(--el-tag-bg-color);border-color:var(--el-tag-border-color);color:var(--el-tag-text-color);display:inline-flex;justify-content:center;align-items:center;height:24px;padding:0 9px;font-size:var(--el-tag-font-size);line-height:1;border-width:1px;border-style:solid;border-radius:var(--el-tag-border-radius);box-sizing:border-box;white-space:nowrap;--el-icon-size:14px}.el-tag.el-tag--primary{--el-tag-bg-color:var(--el-color-primary-light-9);--el-tag-border-color:var(--el-color-primary-light-8);--el-tag-hover-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-bg-color:var(--el-color-success-light-9);--el-tag-border-color:var(--el-color-success-light-8);--el-tag-hover-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-bg-color:var(--el-color-warning-light-9);--el-tag-border-color:var(--el-color-warning-light-8);--el-tag-hover-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-bg-color:var(--el-color-danger-light-9);--el-tag-border-color:var(--el-color-danger-light-8);--el-tag-hover-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-bg-color:var(--el-color-error-light-9);--el-tag-border-color:var(--el-color-error-light-8);--el-tag-hover-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-bg-color:var(--el-color-info-light-9);--el-tag-border-color:var(--el-color-info-light-8);--el-tag-hover-color:var(--el-color-info)}.el-tag.el-tag--primary{--el-tag-text-color:var(--el-color-primary)}.el-tag.el-tag--success{--el-tag-text-color:var(--el-color-success)}.el-tag.el-tag--warning{--el-tag-text-color:var(--el-color-warning)}.el-tag.el-tag--danger{--el-tag-text-color:var(--el-color-danger)}.el-tag.el-tag--error{--el-tag-text-color:var(--el-color-error)}.el-tag.el-tag--info{--el-tag-text-color:var(--el-color-info)}.el-tag.is-hit{border-color:var(--el-color-primary)}.el-tag.is-round{border-radius:var(--el-tag-border-radius-rounded)}.el-tag .el-tag__close{color:var(--el-tag-text-color)}.el-tag .el-tag__close:hover{color:var(--el-color-white);background-color:var(--el-tag-hover-color)}.el-tag .el-icon{border-radius:50%;cursor:pointer;font-size:calc(var(--el-icon-size) - 2px);height:var(--el-icon-size);width:var(--el-icon-size)}.el-tag .el-tag__close{margin-left:6px}.el-tag--dark{--el-tag-bg-color:var(--el-color-primary);--el-tag-border-color:var(--el-color-primary);--el-tag-hover-color:var(--el-color-primary-light-3);--el-tag-text-color:var(--el-color-white)}.el-tag--dark.el-tag--primary{--el-tag-bg-color:var(--el-color-primary);--el-tag-border-color:var(--el-color-primary);--el-tag-hover-color:var(--el-color-primary-light-3)}.el-tag--dark.el-tag--success{--el-tag-bg-color:var(--el-color-success);--el-tag-border-color:var(--el-color-success);--el-tag-hover-color:var(--el-color-success-light-3)}.el-tag--dark.el-tag--warning{--el-tag-bg-color:var(--el-color-warning);--el-tag-border-color:var(--el-color-warning);--el-tag-hover-color:var(--el-color-warning-light-3)}.el-tag--dark.el-tag--danger{--el-tag-bg-color:var(--el-color-danger);--el-tag-border-color:var(--el-color-danger);--el-tag-hover-color:var(--el-color-danger-light-3)}.el-tag--dark.el-tag--error{--el-tag-bg-color:var(--el-color-error);--el-tag-border-color:var(--el-color-error);--el-tag-hover-color:var(--el-color-error-light-3)}.el-tag--dark.el-tag--info{--el-tag-bg-color:var(--el-color-info);--el-tag-border-color:var(--el-color-info);--el-tag-hover-color:var(--el-color-info-light-3)}.el-tag--dark.el-tag--primary,.el-tag--dark.el-tag--success,.el-tag--dark.el-tag--warning,.el-tag--dark.el-tag--danger,.el-tag--dark.el-tag--error,.el-tag--dark.el-tag--info{--el-tag-text-color:var(--el-color-white)}.el-tag--plain{--el-tag-border-color:var(--el-color-primary-light-5);--el-tag-hover-color:var(--el-color-primary);--el-tag-bg-color:var(--el-fill-color-blank)}.el-tag--plain.el-tag--primary{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-primary-light-5);--el-tag-hover-color:var(--el-color-primary)}.el-tag--plain.el-tag--success{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-success-light-5);--el-tag-hover-color:var(--el-color-success)}.el-tag--plain.el-tag--warning{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-warning-light-5);--el-tag-hover-color:var(--el-color-warning)}.el-tag--plain.el-tag--danger{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-danger-light-5);--el-tag-hover-color:var(--el-color-danger)}.el-tag--plain.el-tag--error{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-error-light-5);--el-tag-hover-color:var(--el-color-error)}.el-tag--plain.el-tag--info{--el-tag-bg-color:var(--el-fill-color-blank);--el-tag-border-color:var(--el-color-info-light-5);--el-tag-hover-color:var(--el-color-info)}.el-tag.is-closable{padding-right:5px}.el-tag--large{padding:0 11px;height:32px;--el-icon-size:16px}.el-tag--large .el-tag__close{margin-left:8px}.el-tag--large.is-closable{padding-right:7px}.el-tag--small{padding:0 7px;height:20px;--el-icon-size:12px}.el-tag--small .el-tag__close{margin-left:4px}.el-tag--small.is-closable{padding-right:3px}.el-tag--small .el-icon-close{transform:scale(.8)}.el-tag.el-tag--primary.is-hit{border-color:var(--el-color-primary)}.el-tag.el-tag--success.is-hit{border-color:var(--el-color-success)}.el-tag.el-tag--warning.is-hit{border-color:var(--el-color-warning)}.el-tag.el-tag--danger.is-hit{border-color:var(--el-color-danger)}.el-tag.el-tag--error.is-hit{border-color:var(--el-color-error)}.el-tag.el-tag--info.is-hit{border-color:var(--el-color-info)}.time-select{margin:5px 0;min-width:0}.time-select .el-picker-panel__content{max-height:200px;margin:0}.time-select-item{padding:8px 10px;font-size:14px;line-height:20px}.time-select-item.disabled{color:var(--el-datepicker-border-color);cursor:not-allowed}.time-select-item:hover{background-color:var(--el-fill-color-light);font-weight:700;cursor:pointer}.time-select .time-select-item.selected:not(.disabled){color:var(--el-color-primary);font-weight:700}.el-timeline-item{position:relative;padding-bottom:20px}.el-timeline-item__wrapper{position:relative;padding-left:28px;top:-3px}.el-timeline-item__tail{position:absolute;left:4px;height:100%;border-left:2px solid var(--el-timeline-node-color)}.el-timeline-item .el-timeline-item__icon{color:var(--el-color-white);font-size:var(--el-font-size-small)}.el-timeline-item__node{position:absolute;background-color:var(--el-timeline-node-color);border-color:var(--el-timeline-node-color);border-radius:50%;box-sizing:border-box;display:flex;justify-content:center;align-items:center}.el-timeline-item__node--normal{left:-1px;width:var(--el-timeline-node-size-normal);height:var(--el-timeline-node-size-normal)}.el-timeline-item__node--large{left:-2px;width:var(--el-timeline-node-size-large);height:var(--el-timeline-node-size-large)}.el-timeline-item__node.is-hollow{background:var(--el-color-white);border-style:solid;border-width:2px}.el-timeline-item__node--primary{background-color:var(--el-color-primary);border-color:var(--el-color-primary)}.el-timeline-item__node--success{background-color:var(--el-color-success);border-color:var(--el-color-success)}.el-timeline-item__node--warning{background-color:var(--el-color-warning);border-color:var(--el-color-warning)}.el-timeline-item__node--danger{background-color:var(--el-color-danger);border-color:var(--el-color-danger)}.el-timeline-item__node--info{background-color:var(--el-color-info);border-color:var(--el-color-info)}.el-timeline-item__dot{position:absolute;display:flex;justify-content:center;align-items:center}.el-timeline-item__content{color:var(--el-text-color-primary)}.el-timeline-item__timestamp{color:var(--el-text-color-secondary);line-height:1;font-size:var(--el-font-size-small)}.el-timeline-item__timestamp.is-top{margin-bottom:8px;padding-top:4px}.el-timeline-item__timestamp.is-bottom{margin-top:8px}.el-timeline{--el-timeline-node-size-normal:12px;--el-timeline-node-size-large:14px;--el-timeline-node-color:var(--el-border-color-light)}.el-timeline{margin:0;font-size:var(--el-font-size-base);list-style:none}.el-timeline .el-timeline-item:last-child .el-timeline-item__tail{display:none}.el-timeline .el-timeline-item__center{display:flex;align-items:center}.el-timeline .el-timeline-item__center .el-timeline-item__wrapper{width:100%}.el-timeline .el-timeline-item__center .el-timeline-item__tail{top:0}.el-timeline .el-timeline-item__center:first-child .el-timeline-item__tail{height:calc(50% + 10px);top:calc(50% - 10px)}.el-timeline .el-timeline-item__center:last-child .el-timeline-item__tail{display:block;height:calc(50% - 10px)}.el-tooltip-v2__content{--el-tooltip-v2-padding:5px 10px;--el-tooltip-v2-border-radius:4px;--el-tooltip-v2-border-color:var(--el-border-color);border-radius:var(--el-tooltip-v2-border-radius);color:var(--el-color-black);background-color:var(--el-color-white);padding:var(--el-tooltip-v2-padding);border:1px solid var(--el-border-color)}.el-tooltip-v2__arrow{position:absolute;color:var(--el-color-white);width:var(--el-tooltip-v2-arrow-width);height:var(--el-tooltip-v2-arrow-height);pointer-events:none;left:var(--el-tooltip-v2-arrow-x);top:var(--el-tooltip-v2-arrow-y)}.el-tooltip-v2__arrow:before{content:\"\";width:0;height:0;border:var(--el-tooltip-v2-arrow-border-width) solid transparent;position:absolute}.el-tooltip-v2__arrow:after{content:\"\";width:0;height:0;border:var(--el-tooltip-v2-arrow-border-width) solid transparent;position:absolute}.el-tooltip-v2__content[data-side^=top] .el-tooltip-v2__arrow{bottom:0}.el-tooltip-v2__content[data-side^=top] .el-tooltip-v2__arrow:before{border-top-color:var(--el-color-white);border-top-width:var(--el-tooltip-v2-arrow-border-width);border-bottom:0;top:calc(100% - 1px)}.el-tooltip-v2__content[data-side^=top] .el-tooltip-v2__arrow:after{border-top-color:var(--el-border-color);border-top-width:var(--el-tooltip-v2-arrow-border-width);border-bottom:0;top:100%;z-index:-1}.el-tooltip-v2__content[data-side^=bottom] .el-tooltip-v2__arrow{top:0}.el-tooltip-v2__content[data-side^=bottom] .el-tooltip-v2__arrow:before{border-bottom-color:var(--el-color-white);border-bottom-width:var(--el-tooltip-v2-arrow-border-width);border-top:0;bottom:calc(100% - 1px)}.el-tooltip-v2__content[data-side^=bottom] .el-tooltip-v2__arrow:after{border-bottom-color:var(--el-border-color);border-bottom-width:var(--el-tooltip-v2-arrow-border-width);border-top:0;bottom:100%;z-index:-1}.el-tooltip-v2__content[data-side^=left] .el-tooltip-v2__arrow{right:0}.el-tooltip-v2__content[data-side^=left] .el-tooltip-v2__arrow:before{border-left-color:var(--el-color-white);border-left-width:var(--el-tooltip-v2-arrow-border-width);border-right:0;left:calc(100% - 1px)}.el-tooltip-v2__content[data-side^=left] .el-tooltip-v2__arrow:after{border-left-color:var(--el-border-color);border-left-width:var(--el-tooltip-v2-arrow-border-width);border-right:0;left:100%;z-index:-1}.el-tooltip-v2__content[data-side^=right] .el-tooltip-v2__arrow{left:0}.el-tooltip-v2__content[data-side^=right] .el-tooltip-v2__arrow:before{border-right-color:var(--el-color-white);border-right-width:var(--el-tooltip-v2-arrow-border-width);border-left:0;right:calc(100% - 1px)}.el-tooltip-v2__content[data-side^=right] .el-tooltip-v2__arrow:after{border-right-color:var(--el-border-color);border-right-width:var(--el-tooltip-v2-arrow-border-width);border-left:0;right:100%;z-index:-1}.el-tooltip-v2__content.is-dark{--el-tooltip-v2-border-color:transparent;background-color:var(--el-color-black);color:var(--el-color-white);border-color:transparent}.el-tooltip-v2__content.is-dark .el-tooltip-v2__arrow{background-color:var(--el-color-black);border-color:transparent}.el-transfer{--el-transfer-border-color:var(--el-border-color-lighter);--el-transfer-border-radius:var(--el-border-radius-base);--el-transfer-panel-width:200px;--el-transfer-panel-header-height:40px;--el-transfer-panel-header-bg-color:var(--el-fill-color-light);--el-transfer-panel-footer-height:40px;--el-transfer-panel-body-height:278px;--el-transfer-item-height:30px;--el-transfer-filter-height:32px}.el-transfer{font-size:var(--el-font-size-base)}.el-transfer__buttons{display:inline-block;vertical-align:middle;padding:0 30px}.el-transfer__button{vertical-align:top}.el-transfer__button:nth-child(2){margin:0 0 0 10px}.el-transfer__button i,.el-transfer__button span{font-size:14px}.el-transfer__button .el-icon+span{margin-left:0}.el-transfer-panel{overflow:hidden;background:var(--el-bg-color-overlay);display:inline-block;text-align:left;vertical-align:middle;width:var(--el-transfer-panel-width);max-height:100%;box-sizing:border-box;position:relative}.el-transfer-panel__body{height:var(--el-transfer-panel-body-height);border-left:1px solid var(--el-transfer-border-color);border-right:1px solid var(--el-transfer-border-color);border-bottom:1px solid var(--el-transfer-border-color);border-bottom-left-radius:var(--el-transfer-border-radius);border-bottom-right-radius:var(--el-transfer-border-radius);overflow:hidden}.el-transfer-panel__body.is-with-footer{border-bottom:none;border-bottom-left-radius:0;border-bottom-right-radius:0}.el-transfer-panel__list{margin:0;padding:6px 0;list-style:none;height:var(--el-transfer-panel-body-height);overflow:auto;box-sizing:border-box}.el-transfer-panel__list.is-filterable{height:calc(100% - var(--el-transfer-filter-height) - 30px);padding-top:0}.el-transfer-panel__item{height:var(--el-transfer-item-height);line-height:var(--el-transfer-item-height);padding-left:15px;display:block!important}.el-transfer-panel__item+.el-transfer-panel__item{margin-left:0}.el-transfer-panel__item.el-checkbox{color:var(--el-text-color-regular)}.el-transfer-panel__item:hover{color:var(--el-color-primary)}.el-transfer-panel__item.el-checkbox .el-checkbox__label{width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;box-sizing:border-box;padding-left:22px;line-height:var(--el-transfer-item-height)}.el-transfer-panel__item .el-checkbox__input{position:absolute;top:8px}.el-transfer-panel__filter{text-align:center;margin:15px;box-sizing:border-box;width:auto}.el-transfer-panel__filter .el-input__inner{height:var(--el-transfer-filter-height);width:100%;font-size:12px;display:inline-block;box-sizing:border-box;border-radius:calc(var(--el-transfer-filter-height)/ 2)}.el-transfer-panel__filter .el-icon-circle-close{cursor:pointer}.el-transfer-panel .el-transfer-panel__header{display:flex;align-items:center;height:var(--el-transfer-panel-header-height);background:var(--el-transfer-panel-header-bg-color);margin:0;padding-left:15px;border:1px solid var(--el-transfer-border-color);border-top-left-radius:var(--el-transfer-border-radius);border-top-right-radius:var(--el-transfer-border-radius);box-sizing:border-box;color:var(--el-color-black)}.el-transfer-panel .el-transfer-panel__header .el-checkbox{position:relative;display:flex;width:100%;align-items:center}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label{font-size:16px;color:var(--el-text-color-primary);font-weight:400}.el-transfer-panel .el-transfer-panel__header .el-checkbox .el-checkbox__label span{position:absolute;right:15px;top:50%;transform:translate3d(0,-50%,0);color:var(--el-text-color-secondary);font-size:12px;font-weight:400}.el-transfer-panel .el-transfer-panel__footer{height:var(--el-transfer-panel-footer-height);background:var(--el-bg-color-overlay);margin:0;padding:0;border:1px solid var(--el-transfer-border-color);border-bottom-left-radius:var(--el-transfer-border-radius);border-bottom-right-radius:var(--el-transfer-border-radius)}.el-transfer-panel .el-transfer-panel__footer:after{display:inline-block;content:\"\";height:100%;vertical-align:middle}.el-transfer-panel .el-transfer-panel__footer .el-checkbox{padding-left:20px;color:var(--el-text-color-regular)}.el-transfer-panel .el-transfer-panel__empty{margin:0;height:var(--el-transfer-item-height);line-height:var(--el-transfer-item-height);padding:6px 15px 0;color:var(--el-text-color-secondary);text-align:center}.el-transfer-panel .el-checkbox__label{padding-left:8px}.el-transfer-panel .el-checkbox__inner{height:14px;width:14px;border-radius:3px}.el-transfer-panel .el-checkbox__inner:after{height:6px;width:3px;left:4px}.el-tree{--el-tree-node-hover-bg-color:var(--el-fill-color-light);--el-tree-text-color:var(--el-text-color-regular);--el-tree-expand-icon-color:var(--el-text-color-placeholder)}.el-tree{position:relative;cursor:default;background:var(--el-fill-color-blank);color:var(--el-tree-text-color)}.el-tree__empty-block{position:relative;min-height:60px;text-align:center;width:100%;height:100%}.el-tree__empty-text{position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);color:var(--el-text-color-secondary);font-size:var(--el-font-size-base)}.el-tree__drop-indicator{position:absolute;left:0;right:0;height:1px;background-color:var(--el-color-primary)}.el-tree-node{white-space:nowrap;outline:0}.el-tree-node:focus>.el-tree-node__content{background-color:var(--el-tree-node-hover-bg-color)}.el-tree-node.is-drop-inner>.el-tree-node__content .el-tree-node__label{background-color:var(--el-color-primary);color:#fff}.el-tree-node__content{display:flex;align-items:center;height:26px;cursor:pointer}.el-tree-node__content>.el-tree-node__expand-icon{padding:6px;box-sizing:content-box}.el-tree-node__content>label.el-checkbox{margin-right:8px}.el-tree-node__content:hover{background-color:var(--el-tree-node-hover-bg-color)}.el-tree.is-dragging .el-tree-node__content{cursor:move}.el-tree.is-dragging .el-tree-node__content *{pointer-events:none}.el-tree.is-dragging.is-drop-not-allow .el-tree-node__content{cursor:not-allowed}.el-tree-node__expand-icon{cursor:pointer;color:var(--el-tree-expand-icon-color);font-size:12px;transform:rotate(0);transition:transform var(--el-transition-duration) ease-in-out}.el-tree-node__expand-icon.expanded{transform:rotate(90deg)}.el-tree-node__expand-icon.is-leaf{color:transparent;cursor:default}.el-tree-node__expand-icon.is-hidden{visibility:hidden}.el-tree-node__label{font-size:var(--el-font-size-base)}.el-tree-node__loading-icon{margin-right:8px;font-size:var(--el-font-size-base);color:var(--el-tree-expand-icon-color)}.el-tree-node>.el-tree-node__children{overflow:hidden;background-color:transparent}.el-tree-node.is-expanded>.el-tree-node__children{display:block}.el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content{background-color:var(--el-color-primary-light-9)}.el-tree-select{--el-tree-node-hover-bg-color:var(--el-fill-color-light);--el-tree-text-color:var(--el-text-color-regular);--el-tree-expand-icon-color:var(--el-text-color-placeholder)}.el-tree-select__popper .el-tree-node__expand-icon{margin-left:8px}.el-tree-select__popper .el-tree-node.is-checked>.el-tree-node__content .el-select-dropdown__item.selected:after{content:none}.el-tree-select__popper .el-select-dropdown__item{flex:1;background:0 0!important;padding-left:0;height:20px;line-height:20px}.el-upload{--el-upload-dragger-padding-horizontal:40px;--el-upload-dragger-padding-vertical:10px}.el-upload{display:inline-flex;justify-content:center;align-items:center;cursor:pointer;outline:0}.el-upload__input{display:none}.el-upload__tip{font-size:12px;color:var(--el-text-color-regular);margin-top:7px}.el-upload iframe{position:absolute;z-index:-1;top:0;left:0;opacity:0}.el-upload--picture-card{--el-upload-picture-card-size:148px;background-color:var(--el-fill-color-lighter);border:1px dashed var(--el-border-color-darker);border-radius:6px;box-sizing:border-box;width:var(--el-upload-picture-card-size);height:var(--el-upload-picture-card-size);cursor:pointer;vertical-align:top;display:inline-flex;justify-content:center;align-items:center}.el-upload--picture-card i{font-size:28px;color:var(--el-text-color-secondary)}.el-upload--picture-card:hover{border-color:var(--el-color-primary);color:var(--el-color-primary)}.el-upload.is-drag{display:block}.el-upload:focus{border-color:var(--el-color-primary);color:var(--el-color-primary)}.el-upload:focus .el-upload-dragger{border-color:var(--el-color-primary)}.el-upload-dragger{padding:var(--el-upload-dragger-padding-horizontal) var(--el-upload-dragger-padding-vertical);background-color:var(--el-fill-color-blank);border:1px dashed var(--el-border-color);border-radius:6px;box-sizing:border-box;text-align:center;cursor:pointer;position:relative;overflow:hidden}.el-upload-dragger .el-icon--upload{font-size:67px;color:var(--el-text-color-placeholder);margin-bottom:16px;line-height:50px}.el-upload-dragger+.el-upload__tip{text-align:center}.el-upload-dragger~.el-upload__files{border-top:var(--el-border);margin-top:7px;padding-top:5px}.el-upload-dragger .el-upload__text{color:var(--el-text-color-regular);font-size:14px;text-align:center}.el-upload-dragger .el-upload__text em{color:var(--el-color-primary);font-style:normal}.el-upload-dragger:hover{border-color:var(--el-color-primary)}.el-upload-dragger.is-dragover{padding:calc(var(--el-upload-dragger-padding-horizontal) - 1px) calc(var(--el-upload-dragger-padding-vertical) - 1px);background-color:var(--el-color-primary-light-9);border:2px dashed var(--el-color-primary)}.el-upload-list{margin:10px 0 0;padding:0;list-style:none;position:relative}.el-upload-list__item{transition:all .5s cubic-bezier(.55,0,.1,1);font-size:14px;color:var(--el-text-color-regular);margin-bottom:5px;position:relative;box-sizing:border-box;border-radius:4px;width:100%}.el-upload-list__item .el-progress{position:absolute;top:20px;width:100%}.el-upload-list__item .el-progress__text{position:absolute;right:0;top:-13px}.el-upload-list__item .el-progress-bar{margin-right:0;padding-right:0}.el-upload-list__item .el-icon--upload-success{color:var(--el-color-success)}.el-upload-list__item .el-icon--close{display:none;position:absolute;right:5px;top:50%;cursor:pointer;opacity:.75;color:var(--el-text-color-regular);transition:opacity var(--el-transition-duration);transform:translateY(-50%)}.el-upload-list__item .el-icon--close:hover{opacity:1;color:var(--el-color-primary)}.el-upload-list__item .el-icon--close-tip{display:none;position:absolute;top:1px;right:5px;font-size:12px;cursor:pointer;opacity:1;color:var(--el-color-primary);font-style:normal}.el-upload-list__item:hover{background-color:var(--el-fill-color-light)}.el-upload-list__item:hover .el-icon--close{display:inline-flex}.el-upload-list__item:hover .el-progress__text{display:none}.el-upload-list__item .el-upload-list__item-info{display:inline-flex;justify-content:center;flex-direction:column;width:calc(100% - 30px);margin-left:4px}.el-upload-list__item.is-success .el-upload-list__item-status-label{display:inline-flex}.el-upload-list__item.is-success .el-upload-list__item-name:focus,.el-upload-list__item.is-success .el-upload-list__item-name:hover{color:var(--el-color-primary);cursor:pointer}.el-upload-list__item.is-success:focus:not(:hover) .el-icon--close-tip{display:inline-block}.el-upload-list__item.is-success:active,.el-upload-list__item.is-success:not(.focusing):focus{outline-width:0}.el-upload-list__item.is-success:active .el-icon--close-tip,.el-upload-list__item.is-success:not(.focusing):focus .el-icon--close-tip{display:none}.el-upload-list__item.is-success:focus .el-upload-list__item-status-label,.el-upload-list__item.is-success:hover .el-upload-list__item-status-label{display:none;opacity:0}.el-upload-list.is-disabled .el-upload-list__item-status-label,.el-upload-list.is-disabled .el-upload-list__item:hover{display:block}.el-upload-list__item-name{color:var(--el-text-color-regular);display:inline-flex;text-align:center;align-items:center;padding:0 4px;transition:color var(--el-transition-duration);font-size:var(--el-font-size-base)}.el-upload-list__item-name .el-icon{margin-right:6px;color:var(--el-text-color-secondary)}.el-upload-list__item-file-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.el-upload-list__item-status-label{position:absolute;right:5px;top:0;line-height:inherit;display:none;height:100%;justify-content:center;align-items:center;transition:opacity var(--el-transition-duration)}.el-upload-list__item-delete{position:absolute;right:10px;top:0;font-size:12px;color:var(--el-text-color-regular);display:none}.el-upload-list__item-delete:hover{color:var(--el-color-primary)}.el-upload-list--picture-card{--el-upload-list-picture-card-size:148px;display:inline-flex;flex-wrap:wrap;margin:0}.el-upload-list--picture-card .el-upload-list__item{overflow:hidden;background-color:var(--el-fill-color-blank);border:1px solid var(--el-border-color);border-radius:6px;box-sizing:border-box;width:var(--el-upload-list-picture-card-size);height:var(--el-upload-list-picture-card-size);margin:0 8px 8px 0;padding:0;display:inline-flex}.el-upload-list--picture-card .el-upload-list__item .el-icon--check,.el-upload-list--picture-card .el-upload-list__item .el-icon--circle-check{color:#fff}.el-upload-list--picture-card .el-upload-list__item .el-icon--close{display:none}.el-upload-list--picture-card .el-upload-list__item:hover .el-upload-list__item-status-label{opacity:0;display:block}.el-upload-list--picture-card .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture-card .el-upload-list__item .el-upload-list__item-name{display:none}.el-upload-list--picture-card .el-upload-list__item-thumbnail{width:100%;height:100%;-o-object-fit:contain;object-fit:contain}.el-upload-list--picture-card .el-upload-list__item-status-label{right:-15px;top:-6px;width:40px;height:24px;background:var(--el-color-success);text-align:center;transform:rotate(45deg)}.el-upload-list--picture-card .el-upload-list__item-status-label i{font-size:12px;margin-top:11px;transform:rotate(-45deg)}.el-upload-list--picture-card .el-upload-list__item-actions{position:absolute;width:100%;height:100%;left:0;top:0;cursor:default;display:inline-flex;justify-content:center;align-items:center;color:#fff;opacity:0;font-size:20px;background-color:var(--el-overlay-color-lighter);transition:opacity var(--el-transition-duration)}.el-upload-list--picture-card .el-upload-list__item-actions span{display:none;cursor:pointer}.el-upload-list--picture-card .el-upload-list__item-actions span+span{margin-left:1rem}.el-upload-list--picture-card .el-upload-list__item-actions .el-upload-list__item-delete{position:static;font-size:inherit;color:inherit}.el-upload-list--picture-card .el-upload-list__item-actions:hover{opacity:1}.el-upload-list--picture-card .el-upload-list__item-actions:hover span{display:inline-flex}.el-upload-list--picture-card .el-progress{top:50%;left:50%;transform:translate(-50%,-50%);bottom:auto;width:126px}.el-upload-list--picture-card .el-progress .el-progress__text{top:50%}.el-upload-list--picture .el-upload-list__item{overflow:hidden;z-index:0;background-color:var(--el-fill-color-blank);border:1px solid var(--el-border-color);border-radius:6px;box-sizing:border-box;margin-top:10px;padding:10px;display:flex;align-items:center}.el-upload-list--picture .el-upload-list__item .el-icon--check,.el-upload-list--picture .el-upload-list__item .el-icon--circle-check{color:#fff}.el-upload-list--picture .el-upload-list__item:hover .el-upload-list__item-status-label{opacity:0;display:block}.el-upload-list--picture .el-upload-list__item:hover .el-progress__text{display:block}.el-upload-list--picture .el-upload-list__item.is-success .el-upload-list__item-name i{display:none}.el-upload-list--picture .el-upload-list__item .el-icon--close{top:5px;transform:translateY(0)}.el-upload-list--picture .el-upload-list__item-thumbnail{display:inline-flex;justify-content:center;align-items:center;width:70px;height:70px;-o-object-fit:contain;object-fit:contain;position:relative;z-index:1;background-color:var(--el-color-white)}.el-upload-list--picture .el-upload-list__item-status-label{position:absolute;right:-17px;top:-7px;width:46px;height:26px;background:var(--el-color-success);text-align:center;transform:rotate(45deg)}.el-upload-list--picture .el-upload-list__item-status-label i{font-size:12px;margin-top:12px;transform:rotate(-45deg)}.el-upload-list--picture .el-progress{position:relative;top:-7px}.el-upload-cover{position:absolute;left:0;top:0;width:100%;height:100%;overflow:hidden;z-index:10;cursor:default}.el-upload-cover:after{display:inline-block;content:\"\";height:100%;vertical-align:middle}.el-upload-cover img{display:block;width:100%;height:100%}.el-upload-cover__label{right:-15px;top:-6px;width:40px;height:24px;background:var(--el-color-success);text-align:center;transform:rotate(45deg)}.el-upload-cover__label i{font-size:12px;margin-top:11px;transform:rotate(-45deg);color:#fff}.el-upload-cover__progress{display:inline-block;vertical-align:middle;position:static;width:243px}.el-upload-cover__progress+.el-upload__inner{opacity:0}.el-upload-cover__content{position:absolute;top:0;left:0;width:100%;height:100%}.el-upload-cover__interact{position:absolute;bottom:0;left:0;width:100%;height:100%;background-color:var(--el-overlay-color-light);text-align:center}.el-upload-cover__interact .btn{display:inline-block;color:#fff;font-size:14px;cursor:pointer;vertical-align:middle;transition:var(--el-transition-md-fade);margin-top:60px}.el-upload-cover__interact .btn i{margin-top:0}.el-upload-cover__interact .btn span{opacity:0;transition:opacity .15s linear}.el-upload-cover__interact .btn:not(:first-child){margin-left:35px}.el-upload-cover__interact .btn:hover{transform:translateY(-13px)}.el-upload-cover__interact .btn:hover span{opacity:1}.el-upload-cover__interact .btn i{color:#fff;display:block;font-size:24px;line-height:inherit;margin:0 auto 5px}.el-upload-cover__title{position:absolute;bottom:0;left:0;background-color:#fff;height:36px;width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;font-weight:400;text-align:left;padding:0 10px;margin:0;line-height:36px;font-size:14px;color:var(--el-text-color-primary)}.el-upload-cover+.el-upload__inner{opacity:0;position:relative;z-index:1}.el-vl__wrapper{position:relative}.el-vl__wrapper:hover .el-virtual-scrollbar,.el-vl__wrapper.always-on .el-virtual-scrollbar{opacity:1}.el-vl__window{scrollbar-width:none}.el-vl__window::-webkit-scrollbar{display:none}.el-virtual-scrollbar{opacity:0;transition:opacity .34s ease-out}.el-virtual-scrollbar.always-on{opacity:1}.el-vg__wrapper{position:relative}.el-popper{--el-popper-border-radius:var(--el-popover-border-radius, 4px)}.el-popper{position:absolute;border-radius:var(--el-popper-border-radius);padding:5px 11px;z-index:2000;font-size:12px;line-height:20px;min-width:10px;word-wrap:break-word;visibility:visible}.el-popper.is-dark{color:var(--el-bg-color);background:var(--el-text-color-primary);border:1px solid var(--el-text-color-primary)}.el-popper.is-dark .el-popper__arrow:before{border:1px solid var(--el-text-color-primary);background:var(--el-text-color-primary);right:0}.el-popper.is-light{background:var(--el-bg-color-overlay);border:1px solid var(--el-border-color-light)}.el-popper.is-light .el-popper__arrow:before{border:1px solid var(--el-border-color-light);background:var(--el-bg-color-overlay);right:0}.el-popper.is-pure{padding:0}.el-popper__arrow{position:absolute;width:10px;height:10px;z-index:-1}.el-popper__arrow:before{position:absolute;width:10px;height:10px;z-index:-1;content:\" \";transform:rotate(45deg);background:var(--el-text-color-primary);box-sizing:border-box}.el-popper[data-popper-placement^=top]>.el-popper__arrow{bottom:-5px}.el-popper[data-popper-placement^=top]>.el-popper__arrow:before{border-bottom-right-radius:2px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow{top:-5px}.el-popper[data-popper-placement^=bottom]>.el-popper__arrow:before{border-top-left-radius:2px}.el-popper[data-popper-placement^=left]>.el-popper__arrow{right:-5px}.el-popper[data-popper-placement^=left]>.el-popper__arrow:before{border-top-right-radius:2px}.el-popper[data-popper-placement^=right]>.el-popper__arrow{left:-5px}.el-popper[data-popper-placement^=right]>.el-popper__arrow:before{border-bottom-left-radius:2px}.el-popper[data-popper-placement^=top] .el-popper__arrow:before{border-top-color:transparent!important;border-left-color:transparent!important}.el-popper[data-popper-placement^=bottom] .el-popper__arrow:before{border-bottom-color:transparent!important;border-right-color:transparent!important}.el-popper[data-popper-placement^=left] .el-popper__arrow:before{border-left-color:transparent!important;border-bottom-color:transparent!important}.el-popper[data-popper-placement^=right] .el-popper__arrow:before{border-right-color:transparent!important;border-top-color:transparent!important}.el-select-dropdown__item{font-size:var(--el-font-size-base);padding:0 32px 0 20px;position:relative;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;color:var(--el-text-color-regular);height:34px;line-height:34px;box-sizing:border-box;cursor:pointer}.el-select-dropdown__item.is-disabled{color:var(--el-text-color-placeholder);cursor:not-allowed}.el-select-dropdown__item.hover,.el-select-dropdown__item:hover{background-color:var(--el-fill-color-light)}.el-select-dropdown__item.selected{color:var(--el-color-primary);font-weight:700}svg.icon[data-v-1ba1d638]{animation:turn-1ba1d638 5s linear infinite}@keyframes turn-1ba1d638{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}img[data-v-dfb69c7b]{width:100%;height:100%;-webkit-user-drag:none;-moz-user-drag:none;-ms-user-drag:none;-khtml-user-drag:none}@keyframes turn-67d6931b{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.toast[data-v-67d6931b]{position:fixed;top:50%;left:50%;display:flex;flex-direction:column;align-items:center;justify-content:space-around;box-sizing:content-box;width:100px;max-width:70%;padding:16px;color:#fff;font-size:14px;text-align:center;background-color:#000000b3;border-radius:8px;transform:translate3d(-50%,-50%,0);z-index:9999;transition:.3s;cursor:pointer}.toast div.icon[data-v-67d6931b]{width:50px;height:50px;margin:15px 0}.toast div.icon svg[data-v-67d6931b]{width:100%;height:100%}.toast div.icon svg path[data-v-67d6931b]{fill:#fff}.toast .loading[data-v-67d6931b]{animation:turn-67d6931b 5s linear infinite}form[data-v-a70de484]{padding:1rem;background-color:#fff;border:1px dashed #dcdfe6;border-radius:6px;box-sizing:border-box;text-align:center;cursor:pointer;position:relative;overflow:hidden}form[data-v-a70de484]:hover{border:1px dashed var(--active-color)}.progress-container[data-v-a70de484]{margin:.5rem 0;cursor:pointer}.files-list[data-v-a70de484]{margin:.5rem 0}.files-list li.file-list_item[data-v-a70de484]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:.3rem .5rem;cursor:pointer;border-radius:6px}.files-list li.file-list_item[data-v-a70de484]:hover{background:#deebfd}.files-list li.file-list_item span.name[data-v-a70de484]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:block;color:var(--text-color);max-width:500px}.files-list li.file-list_item span.name[data-v-a70de484]:hover{color:var(--desc-color)}.files-list li.file-list_item button[data-v-a70de484]{background:none;padding:0;display:flex}.files-list li.file-list_item button i[data-v-a70de484]{color:var(--text-color)}.files-list li.file-list_item button:hover i[data-v-a70de484]{color:var(--desc-color)}.msg[data-v-a70de484]{color:red;font-size:14px;width:100%;display:block}.btns[data-v-a70de484]{width:100%;display:flex;justify-content:flex-end;margin-top:1rem}li.entrie-item[data-v-f8376cdf]{width:100%;display:flex;align-items:center;height:40px;line-height:40px;padding:0 1rem;cursor:pointer;justify-content:space-between}li.entrie-item.on[data-v-f8376cdf],li.entrie-item[data-v-f8376cdf]:hover{background-color:#ecf5ff}li.entrie-item .f[data-v-f8376cdf]{display:flex;align-items:center;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}li.entrie-item .f img[data-v-f8376cdf]{width:24px;height:24px;margin-right:.3rem}li.entrie-item .f span[data-v-f8376cdf]{font-size:14px;color:var(--text-color);display:inline-block}li.entrie-item .r[data-v-f8376cdf]{display:flex;align-items:center}li.entrie-item .r svg[data-v-f8376cdf]{width:16px;height:16px}.children[data-v-f8376cdf]{padding-left:40px}.select-container[data-v-537135b0]{width:100%}.select-container .select-header[data-v-537135b0]{height:40px;line-height:40px;color:var(--text-color);font-size:12px;white-space:nowrap;overflow:auto;width:100%;padding:0 1rem;border-top:1px solid #dfe1e5;border-left:1px solid #dfe1e5;border-right:1px solid #dfe1e5}.select-container .select-header span[data-v-537135b0]{-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;-khtml-user-select:none;user-select:none}.select-container .select-body[data-v-537135b0]{border:1px solid #dfe1e5;text-align:left;width:100%;height:400px;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;-khtml-user-select:none;user-select:none}.select-container .select-footer[data-v-537135b0]{width:100%;height:50px;line-height:50px;display:flex;align-items:center;justify-content:flex-end}aside[data-v-9840e643]{width:100%;height:100%;background-color:#f8f8f8}aside .logo[data-v-9840e643]{width:100%;height:72px;color:#363636;font-size:1.25rem;font-weight:600;display:flex;flex-wrap:wrap;align-items:center;text-align:left;padding:0 1.5rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}aside .menus[data-v-9840e643]{width:100%;height:calc(100% - 212px)}aside .sidebar[data-v-9840e643]{height:140px;width:100%}aside .sidebar hr[data-v-9840e643]{display:block;margin:.5rem 0;width:100%;border:none;height:1px;border-top:1px solid #eee}main[data-v-9840e643]{width:100%;height:100%;background-color:#fff}main header[data-v-9840e643]{width:100%;height:72px;display:flex;align-items:center;padding:0 1.5rem}main header .title[data-v-9840e643]{color:#363636;font-size:1.25rem;font-weight:600;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}main .body[data-v-9840e643]{width:100%;height:calc(100% - 72px)}.scrollbar-container[data-v-9840e643]{padding:0 1rem;width:100%}.menu-item[data-v-9840e643]{width:100%;display:flex;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;align-items:center;border-radius:4px;cursor:pointer;transition:all .2s;height:40px;padding:0 .5rem}.menu-item[data-v-9840e643]:hover{background:#f3f3f3}.menu-item.router-link-active.router-link-exact-active[data-v-9840e643],.menu-item.on[data-v-9840e643]{background:#deebfd}.menu-item .icon[data-v-9840e643]{width:16px;height:16px;display:flex;align-items:center;justify-content:flex-start;margin-right:.5rem}.menu-item .icon svg[data-v-9840e643]{width:100%;height:100%;display:block}.menu-item .info .name[data-v-9840e643]{color:#2c3e50;font-size:.875rem;font-style:inherit;font-weight:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:left}.menu-item .info .name span[data-v-9840e643]{background-color:#3f9eff;color:#fff;padding:0 .3rem;border-radius:30%;font-size:10px;margin-left:.3rem}.layout-conatiner[data-v-cbf72d2b]{width:100%;height:100%;position:relative;display:flex;flex-wrap:wrap}.layout-f[data-v-cbf72d2b]{flex:0 0 100%;max-width:240px;transition:.3s;overflow:auto;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;-khtml-user-select:none;user-select:none;height:100%}.layout-r[data-v-cbf72d2b]{flex:0 0 100%;max-width:calc(100% - 240px);height:100%;position:relative}.layout-r button.layout-show[data-v-cbf72d2b]{position:absolute;top:0;left:0;width:24px;height:24px;background:none;display:flex;align-items:center;justify-content:center;padding:0;margin:0}.layout-r button.layout-show i[data-v-cbf72d2b]{color:var(--text-color);font-size:20px}@media screen and (max-width: 1000px){.layout-f[data-v-cbf72d2b]{max-width:160px}.layout-r[data-v-cbf72d2b]{max-width:calc(100% - 160px)}}@media screen and (max-width: 860px){.layout-f[data-v-cbf72d2b]{max-width:60px}.layout-r[data-v-cbf72d2b]{max-width:calc(100% - 60px)}[data-v-cbf72d2b] .menu-item .icon{margin-right:0!important}[data-v-cbf72d2b] .menu-item .info{display:none}}@media screen and (max-width: 480px){.layout-f[data-v-cbf72d2b]{max-width:0}.layout-r[data-v-cbf72d2b]{max-width:100%}}.notfound[data-v-412809e3]{position:absolute;inset:0;display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center;text-align:center}.notfound img[data-v-412809e3]{opacity:.5}.notfound p[data-v-412809e3]{width:100%;padding:1rem 0;font-size:1.2em;color:#333;font-weight:200;text-align:center}.files[data-v-0147104b]{width:100%;display:grid;grid-gap:15px 15px;grid-template-columns:repeat(auto-fill,minmax(120px,1fr))}.files.model[data-v-0147104b] .file{height:130px;text-align:center;border:none;position:relative;cursor:pointer}.files.model[data-v-0147104b] .file[checkbox=true] .file-checkbox,.files.model[data-v-0147104b] .file:hover .file-checkbox{display:block}.files.model[data-v-0147104b] .file .file-container{width:100%;height:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.files.model[data-v-0147104b] .file .file-checkbox{position:absolute;top:5px;left:5px;display:none}.files.model[data-v-0147104b] .file .file-date,.files.model[data-v-0147104b] .file .file-type,.files.model[data-v-0147104b] .file .file-size{display:none}.files.model[data-v-0147104b] .file .file-info{width:100%}.files.model[data-v-0147104b] .file .file-info .thumbnail{width:72px;height:72px;margin:0 auto}.files.model[data-v-0147104b] .file .file-info .file-name{width:100%;height:30px;line-height:30px;position:relative;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;text-align:center;padding:0 .5rem;color:var(--text-color);font-size:12px}.files.list[data-v-0147104b]{display:block}.files.list[data-v-0147104b] .file{position:relative;width:100%;height:44px;line-height:44px;padding:0;border-bottom:1px solid #f2f6fd;white-space:nowrap;text-overflow:ellipsis;display:flex;flex-wrap:wrap;align-items:center;margin:2px 0;cursor:pointer}.files.list[data-v-0147104b] .file .file-container{width:100%;height:100%;display:flex;flex-wrap:wrap;align-items:center}.files.list[data-v-0147104b] .file .file-checkbox{display:flex;align-items:center}.files.list[data-v-0147104b] .file .file-checkbox input[type=checkbox]{background:transparent;flex-shrink:0;height:1.25em;width:1.25em;border:2px solid #c9c9c9!important;border-radius:50%!important;transition:all .3s!important;margin:0}.files.list[data-v-0147104b] .file .file-info{max-width:60%;flex:0 0 100%;height:100%;display:flex;overflow:hidden;padding-left:10px;align-items:center}.files.list[data-v-0147104b] .file .file-info .thumbnail{flex:0 0 26px;height:26px;width:26px;display:flex;margin:0;margin-right:.5rem}.files.list[data-v-0147104b] .file .file-info .file-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-color);font-size:12px}.files.list[data-v-0147104b] .file .file-date{max-width:15%;flex:0 0 100%;height:100%;display:flex;overflow:hidden}.files.list[data-v-0147104b] .file .file-type,.files.list[data-v-0147104b] .file .file-size{max-width:10%;flex:0 0 100%;height:100%;display:flex;overflow:hidden}.files.list[data-v-0147104b] .file .file-date,.files.list[data-v-0147104b] .file .file-type,.files.list[data-v-0147104b] .file .file-size{display:block;font-size:14px;color:#4a4a4a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right}[data-v-0147104b] .file{color:var(--text-color)}[data-v-0147104b] .file[checkbox=true],[data-v-0147104b] .file.on,[data-v-0147104b] .file:hover{background-color:#deebfd;border-radius:5px}[data-v-0147104b] .file[move=true] .file-container .file-info{opacity:.5}.f[data-v-894e5982]{display:flex;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;-khtml-user-select:none;user-select:none}.f label[data-v-894e5982]{display:flex;align-items:center;cursor:pointer}.f label input[type=checkbox][data-v-894e5982]{margin:0;background:transparent;flex-shrink:0;height:1.25em;width:1.25em;border:2px solid #c9c9c9!important;border-radius:50%!important;transition:all .3s!important}.f label span[data-v-894e5982]{margin-left:.5rem;font-size:.75rem;color:#4a4a4a}.f .setting[data-v-894e5982]{margin:0 1rem;border:1px solid #c3eaff;border-radius:4px;color:#fff;height:30px;line-height:30px;display:flex}.f .setting button[data-v-894e5982]{position:relative;padding:0 1rem;margin:0;background:hsla(0deg,0%,100%,0);border:none;height:100%;color:#09aaff;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.f .setting button[data-v-894e5982]:hover{color:#fff;background-color:#64c4f6}.f .setting em[data-v-894e5982]{border-right:1px solid #c3eaff}.tools[data-v-3875e80d]{display:flex}.tools .tool-item[data-v-3875e80d]{margin-left:.5rem}.tools .tool-item button[data-v-3875e80d]{width:2em;height:2em;background:none;padding:0;margin:0}.tools .tool-item button:hover path[data-v-3875e80d]{stroke:#64c4f6}.tools .tool-item button:hover rect[data-v-3875e80d]{stroke:#64c4f6}[data-v-3875e80d] li.sort-item{min-width:100px;justify-content:center}[data-v-3875e80d] li.sort-item em{margin-right:.5rem;width:7px;height:7px;border-radius:50%}[data-v-3875e80d] li.sort-item.on em{background-color:#09aaff}#page[data-v-92a18536],#page .page-container[data-v-92a18536]{width:100%;height:100%}.page-nav-container[data-v-92a18536]{width:100%;height:40px;display:flex;align-items:center;padding:0 1.5rem}.page-nav-container[data-v-92a18536] .nav-breadcrumb{display:flex}.page-nav-container[data-v-92a18536] .nav-breadcrumb span.el-breadcrumb__item{flex:1;cursor:pointer}.page-nav-container[data-v-92a18536] .nav-breadcrumb span.el-breadcrumb__item span.el-breadcrumb__inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.page-tool-container[data-v-92a18536]{width:100%;height:40px;display:flex;align-items:center;padding:0 1.5rem}.page-body-container[data-v-92a18536]{width:100%;height:calc(100% - 80px);position:relative;padding:0 1.5rem}li[opacity=true][data-v-38a79597]{opacity:.5;transition:.3s}li[hover=true][data-v-38a79597]{background-color:#deebfd;border-radius:5px}.contextmenus[data-v-43b20733]{position:relative}.contextmenus .contextmenus-container[data-v-43b20733]{position:fixed;background-color:#00000094;min-width:100px;margin-bottom:5px;font-size:14px;z-index:100;padding:.5rem 0}.contextmenus .contextmenus-container[data-v-43b20733]:before{content:\"\";position:fixed;inset:0;z-index:99}.contextmenus .contextmenus-container[data-v-43b20733] a.contextmenu-item{display:block;width:100%;height:30px;line-height:30px;text-decoration:none;text-align:left;padding:0 20px;clear:both;font-weight:400;white-space:nowrap;color:#eee;font-size:13px;position:relative;z-index:100;display:flex;align-items:center}.contextmenus .contextmenus-container[data-v-43b20733] a.contextmenu-item[hidden=true]{display:none}.contextmenus .contextmenus-container[data-v-43b20733] a.contextmenu-item:hover{text-decoration:none;background-color:#0000001a}.contextmenus .contextmenus-container[data-v-43b20733] a.contextmenu-item:hover ul.contextmenu-item_children{visibility:visible;-webkit-transform:scaleX(1);transform:scaleX(1);opacity:1;transition:.4s;z-index:201}.contextmenus .contextmenus-container[data-v-43b20733] a.contextmenu-item ul.contextmenu-item_children{opacity:0;position:absolute;left:calc(100% - 10px);background-color:#00000094;z-index:-1;top:0;left:95%;min-width:23px;white-space:nowrap;padding:5px 0;visibility:hidden}.contextmenus .contextmenus-container[data-v-43b20733] a.contextmenu-item em{margin-right:.5rem;width:7px;height:7px;border-radius:50%;display:inline-block}.contextmenus .contextmenus-container[data-v-43b20733] a.contextmenu-item.on em{background-color:#09aaff}.contextmenus .contextmenus-container[data-v-43b20733] a.contextmenu-item[disabled=true]{opacity:.5;cursor:no-drop}.page-container[data-v-01bdecfa]{width:100%;height:100%}.page-container span[data-v-01bdecfa]{color:var(--desc-color);font-size:13px}.page-container a.clear[data-v-01bdecfa]{color:var(--active-color);font-size:13px}.page-container a.clear[data-v-01bdecfa]:hover{opacity:.8}#page[data-v-828b8c04]{width:100%;height:100%;padding-left:1.5rem}#page[data-v-828b8c04] .el-scrollbar__view,#page[data-v-828b8c04] .el-scrollbar__view .page-tabs{width:100%;height:100%}#page[data-v-828b8c04] .el-scrollbar__view .el-tabs__content{width:100%;height:calc(100% - 55px)}#page[data-v-828b8c04] .el-scrollbar__view .el-tabs__content .page-tab-pane{width:100%;height:100%}.notfound[data-v-582e2fad]{position:absolute;inset:0;display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center;text-align:center}.notfound img[data-v-582e2fad]{opacity:.5}.notfound p[data-v-582e2fad]{width:100%;padding:1rem 0;font-size:1.2em;color:#333;font-weight:200;text-align:center}.files[data-v-41d38675]{width:100%;display:grid;grid-gap:15px 15px;grid-template-columns:repeat(auto-fill,minmax(120px,1fr))}.files.model[data-v-41d38675] .file{height:130px;text-align:center;border:none;position:relative;cursor:pointer}.files.model[data-v-41d38675] .file[checkbox=true] .file-checkbox,.files.model[data-v-41d38675] .file:hover .file-checkbox{display:block}.files.model[data-v-41d38675] .file .file-container{width:100%;height:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.files.model[data-v-41d38675] .file .file-checkbox{position:absolute;top:5px;left:5px;display:none}.files.model[data-v-41d38675] .file .file-date,.files.model[data-v-41d38675] .file .file-type,.files.model[data-v-41d38675] .file .file-size{display:none}.files.model[data-v-41d38675] .file .file-info{width:100%}.files.model[data-v-41d38675] .file .file-info .thumbnail{width:72px;height:72px;margin:0 auto}.files.model[data-v-41d38675] .file .file-info .file-name{width:100%;height:30px;line-height:30px;position:relative;white-space:nowrap;text-overflow:ellipsis;overflow:hidden;text-align:center;padding:0 .5rem;color:var(--text-color);font-size:12px}.files.list[data-v-41d38675]{display:block}.files.list[data-v-41d38675] .file{position:relative;width:100%;height:44px;line-height:44px;padding:0;border-bottom:1px solid #f2f6fd;white-space:nowrap;text-overflow:ellipsis;display:flex;flex-wrap:wrap;align-items:center;margin:2px 0;cursor:pointer}.files.list[data-v-41d38675] .file .file-container{width:100%;height:100%;display:flex;flex-wrap:wrap;align-items:center}.files.list[data-v-41d38675] .file .file-checkbox{display:flex;align-items:center}.files.list[data-v-41d38675] .file .file-checkbox input[type=checkbox]{background:transparent;flex-shrink:0;height:1.25em;width:1.25em;border:2px solid #c9c9c9!important;border-radius:50%!important;transition:all .3s!important;margin:0}.files.list[data-v-41d38675] .file .file-info{max-width:60%;flex:0 0 100%;height:100%;display:flex;overflow:hidden;padding-left:10px;align-items:center}.files.list[data-v-41d38675] .file .file-info .thumbnail{flex:0 0 26px;height:26px;width:26px;display:flex;margin:0;margin-right:.5rem}.files.list[data-v-41d38675] .file .file-info .file-name{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--text-color);font-size:12px}.files.list[data-v-41d38675] .file .file-date{max-width:15%;flex:0 0 100%;height:100%;display:flex;overflow:hidden}.files.list[data-v-41d38675] .file .file-type,.files.list[data-v-41d38675] .file .file-size{max-width:10%;flex:0 0 100%;height:100%;display:flex;overflow:hidden}.files.list[data-v-41d38675] .file .file-date,.files.list[data-v-41d38675] .file .file-type,.files.list[data-v-41d38675] .file .file-size{display:block;font-size:14px;color:#4a4a4a;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;text-align:right}[data-v-41d38675] .file{color:var(--text-color)}[data-v-41d38675] .file[checkbox=true],[data-v-41d38675] .file.on,[data-v-41d38675] .file:hover{background-color:#deebfd;border-radius:5px}[data-v-41d38675] .file[move=true] .file-container .file-info{opacity:.5}.f[data-v-190fc61d]{display:flex;-moz-user-select:none;-webkit-user-select:none;-ms-user-select:none;-khtml-user-select:none;user-select:none}.f label[data-v-190fc61d]{display:flex;align-items:center;cursor:pointer}.f label input[type=checkbox][data-v-190fc61d]{margin:0;background:transparent;flex-shrink:0;height:1.25em;width:1.25em;border:2px solid #c9c9c9!important;border-radius:50%!important;transition:all .3s!important}.f label span[data-v-190fc61d]{margin-left:.5rem;font-size:.75rem;color:#4a4a4a}.f .setting[data-v-190fc61d]{margin:0 1rem;border:1px solid #c3eaff;border-radius:4px;color:#fff;height:30px;line-height:30px;display:flex}.f .setting button[data-v-190fc61d]{position:relative;padding:0 1rem;margin:0;background:hsla(0deg,0%,100%,0);border:none;height:100%;color:#09aaff;white-space:nowrap;text-overflow:ellipsis;overflow:hidden}.f .setting button[data-v-190fc61d]:hover{color:#fff;background-color:#64c4f6}.f .setting em[data-v-190fc61d]{border-right:1px solid #c3eaff}.tools[data-v-cc8dcce8]{display:flex}.tools .tool-item[data-v-cc8dcce8]{margin-left:.5rem}.tools .tool-item button[data-v-cc8dcce8]{width:2em;height:2em;background:none;padding:0;margin:0}.tools .tool-item button:hover path[data-v-cc8dcce8]{stroke:#64c4f6}.tools .tool-item button:hover rect[data-v-cc8dcce8]{stroke:#64c4f6}[data-v-cc8dcce8] li.sort-item{min-width:100px;justify-content:center}[data-v-cc8dcce8] li.sort-item em{margin-right:.5rem;width:7px;height:7px;border-radius:50%}[data-v-cc8dcce8] li.sort-item.on em{background-color:#09aaff}#page[data-v-ac171980],#page .page-container[data-v-ac171980]{width:100%;height:100%}.page-nav-container[data-v-ac171980]{width:100%;height:40px;display:flex;align-items:center;padding:0 1.5rem}.page-nav-container[data-v-ac171980] .nav-breadcrumb{display:flex}.page-nav-container[data-v-ac171980] .nav-breadcrumb span.el-breadcrumb__item{flex:1;cursor:pointer}.page-nav-container[data-v-ac171980] .nav-breadcrumb span.el-breadcrumb__item span.el-breadcrumb__inner{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.page-tool-container[data-v-ac171980]{width:100%;height:40px;display:flex;align-items:center;padding:0 1.5rem}.page-body-container[data-v-ac171980]{width:100%;height:calc(100% - 80px);position:relative;padding:0 1.5rem}#page[data-v-61900a83]{width:100%;height:100%;padding:0 1.5rem}#page form[data-v-61900a83]{display:block;width:100%}#page form .form-item[data-v-61900a83]{display:flex;margin:1rem 0}#page form .form-item_label[data-v-61900a83]{display:inline-flex;justify-content:flex-start;align-items:flex-start;flex:0 0 auto;font-size:14px;color:var(--text-color);line-height:32px;padding:0 12px 0 0;box-sizing:border-box;width:160px}#page form .form-item_label[data-v-61900a83]:before{content:\"\";margin-right:4px;width:10px;display:flex;align-items:center}#page form .form-required[data-v-61900a83]:before{content:\"*\";color:#f89e9e}#page form .form-item_content[data-v-61900a83]{display:flex;flex-wrap:wrap;align-items:center;flex:1;position:relative;font-size:14px;min-width:0}#page form .form-item_content>div[data-v-61900a83]{width:100%;cursor:pointer}#page form .form-item_content select[data-v-61900a83]{width:100%;height:32px;cursor:pointer;border-radius:2px;border:1px solid var(--active-color);padding:0 .5rem}#page form .form-btns[data-v-61900a83]{width:100%;display:flex}#page code[data-v-61900a83]{padding:10px;margin-bottom:8px;color:var(--text-color);background-color:#00000012;font-size:13px;width:100%;border-radius:2px}li.file-item[data-v-92de20f9]{width:100%;height:36px;display:flex;flex-wrap:nowrap;align-items:center;cursor:pointer;padding:0 1rem;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}li.file-item[data-v-92de20f9]:hover{background-color:#2a2d2e}li.file-item .file_cover[data-v-92de20f9]{flex:0 0 16px;width:15px;height:15px;margin-right:3px;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-start}li.file-item .file_cover img[data-v-92de20f9]{width:100%;height:100%;vertical-align:top}li.file-item .file_cover[data-v-92de20f9] svg{width:10px;height:10px;font-size:14px}li.file-item .file_cover[data-v-92de20f9] svg path{fill:#fff}li.file-item span.file_name[data-v-92de20f9]{color:#e3e2e2;cursor:pointer;font-size:12px;font-weight:400;letter-spacing:.25px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}li.file-item .file-icon[data-v-92de20f9]{width:20px;flex:0 0 20px;display:flex;align-items:center;justify-content:center}li.file-item.on[data-v-92de20f9]{background-color:#37373d}ul.children[data-v-92de20f9]{width:100%;display:block;padding-left:10px}aside .aside-header[data-v-0674120d]{line-height:35px;background-color:#0000;width:100%;height:50px;font-size:11px;font-weight:700;text-transform:uppercase;overflow:hidden;display:flex;cursor:pointer;align-items:center;box-sizing:border-box}aside .aside-header span[data-v-0674120d]{font-size:11px;cursor:default;font-weight:400;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#bbb;display:block;text-align:left;width:100%;padding:0 1rem;cursor:pointer}aside .aside-header button[data-v-0674120d]{width:28px;height:28px;background:none}aside .aside-header button[data-v-0674120d] svg.icon{width:100%;height:100%}aside .aside-header button[data-v-0674120d] svg.icon path{fill:#696969}aside .aside-container[data-v-0674120d]{width:100%;height:calc(100% - 50px)}aside .aside-header[data-v-0b8be308]{line-height:35px;background-color:#0000;width:100%;height:50px;font-size:11px;font-weight:700;text-transform:uppercase;overflow:hidden;display:flex;cursor:pointer;align-items:center;box-sizing:border-box}aside .aside-header span[data-v-0b8be308]{font-size:11px;cursor:default;font-weight:400;margin:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;color:#bbb;display:block;text-align:left;width:100%;padding:0 1rem;cursor:pointer}aside .aside-header button[data-v-0b8be308]{width:28px;height:28px;background:none}aside .aside-header button[data-v-0b8be308] svg.icon{width:100%;height:100%}aside .aside-header button[data-v-0b8be308] svg.icon path{fill:#696969}aside[data-v-0b8be308] .aside-container{width:100%;height:calc(100% - 50px)}.main-container[data-v-be306a98]{width:100%;height:100%}.main-container .main-eidtor[data-v-be306a98]{width:100%;height:calc(100% - 32px)}.main-container .main-eidtor textarea[data-v-be306a98]{width:100%;height:100%;background:none;border:none;resize:none;color:#d4d4d4;padding:1rem;font-size:14px}.main-container .main-footer[data-v-be306a98]{width:100%;height:32px;line-height:32px;z-index:201;background-color:#252525;border-top:1px solid #333;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:0 1rem}.main-container .main-footer button.save[data-v-be306a98]{width:100px;margin-left:15px;height:23px;line-height:23px;background:#5d5d5d;color:#fff;border:none;border-radius:3px}.main-container .main-footer button.save[data-v-be306a98]:hover{opacity:.9}.monaco-aria-container{position:absolute;left:-999em}::-ms-clear{display:none}.monaco-editor .editor-widget input{color:inherit}.monaco-editor{position:relative;overflow:visible;-webkit-text-size-adjust:100%}.monaco-editor .overflow-guard{position:relative;overflow:hidden}.monaco-editor .view-overlays{position:absolute;top:0}.monaco-editor .inputarea{min-width:0;min-height:0;margin:0;padding:0;position:absolute;outline:none!important;resize:none;border:none;overflow:hidden;color:transparent;background-color:transparent}.monaco-editor .inputarea.ime-input{z-index:10}.monaco-editor .margin-view-overlays .line-numbers{font-variant-numeric:tabular-nums;position:absolute;text-align:right;display:inline-block;vertical-align:middle;box-sizing:border-box;cursor:default;height:100%}.monaco-editor .relative-current-line-number{text-align:left;display:inline-block;width:100%}.monaco-editor .margin-view-overlays .line-numbers.lh-odd{margin-top:1px}.monaco-mouse-cursor-text{cursor:text}.monaco-editor .view-overlays .current-line,.monaco-editor .margin-view-overlays .current-line{display:block;position:absolute;left:0;top:0;box-sizing:border-box}.monaco-editor .margin-view-overlays .current-line.current-line-margin.current-line-margin-both{border-right:0}.monaco-editor .lines-content .cdr{position:absolute}.monaco-scrollable-element>.scrollbar>.scra{cursor:pointer;font-size:11px!important}.monaco-scrollable-element>.visible{opacity:1;background:rgba(0,0,0,0);transition:opacity .1s linear}.monaco-scrollable-element>.invisible{opacity:0;pointer-events:none}.monaco-scrollable-element>.invisible.fade{transition:opacity .8s linear}.monaco-scrollable-element>.shadow{position:absolute;display:none}.monaco-scrollable-element>.shadow.top{display:block;top:0;left:3px;height:3px;width:100%}.monaco-scrollable-element>.shadow.left{display:block;top:3px;left:0;height:100%;width:3px}.monaco-scrollable-element>.shadow.top-left-corner{display:block;top:0;left:0;height:3px;width:3px}.monaco-editor .glyph-margin{position:absolute;top:0}.monaco-editor .margin-view-overlays .cgmr{position:absolute;display:flex;align-items:center;justify-content:center}.monaco-editor .lines-content .core-guide{position:absolute;box-sizing:border-box}.mtkcontrol{color:#fff!important;background:rgb(150,0,0)!important}.monaco-editor.no-user-select .lines-content,.monaco-editor.no-user-select .view-line,.monaco-editor.no-user-select .view-lines{user-select:none;-webkit-user-select:none;-ms-user-select:none}.monaco-editor.enable-user-select{user-select:initial;-webkit-user-select:initial;-ms-user-select:initial}.monaco-editor .view-lines{white-space:nowrap}.monaco-editor .view-line{position:absolute;width:100%}.monaco-editor .mtkz{display:inline-block}.monaco-editor .lines-decorations{position:absolute;top:0;background:white}.monaco-editor .margin-view-overlays .cldr{position:absolute;height:100%}.monaco-editor .margin-view-overlays .cmdr{position:absolute;left:0;width:100%;height:100%}.monaco-editor .minimap.slider-mouseover .minimap-slider{opacity:0;transition:opacity .1s linear}.monaco-editor .minimap.slider-mouseover:hover .minimap-slider,.monaco-editor .minimap.slider-mouseover .minimap-slider.active{opacity:1}.monaco-editor .minimap-shadow-hidden{position:absolute;width:0}.monaco-editor .minimap-shadow-visible{position:absolute;left:-6px;width:6px}.monaco-editor.no-minimap-shadow .minimap-shadow-visible{position:absolute;left:-1px;width:1px}.minimap.autohide{opacity:0;transition:opacity .5s}.minimap.autohide:hover{opacity:1}.monaco-editor .overlayWidgets{position:absolute;top:0;left:0}.monaco-editor .view-ruler{position:absolute;top:0}.monaco-editor .scroll-decoration{position:absolute;top:0;left:0;height:6px}.monaco-editor .lines-content .cslr{position:absolute}.monaco-editor .top-left-radius{border-top-left-radius:3px}.monaco-editor .bottom-left-radius{border-bottom-left-radius:3px}.monaco-editor .top-right-radius{border-top-right-radius:3px}.monaco-editor .bottom-right-radius{border-bottom-right-radius:3px}.monaco-editor.hc-black .top-left-radius{border-top-left-radius:0}.monaco-editor.hc-black .bottom-left-radius{border-bottom-left-radius:0}.monaco-editor.hc-black .top-right-radius{border-top-right-radius:0}.monaco-editor.hc-black .bottom-right-radius{border-bottom-right-radius:0}.monaco-editor.hc-light .top-left-radius{border-top-left-radius:0}.monaco-editor.hc-light .bottom-left-radius{border-bottom-left-radius:0}.monaco-editor.hc-light .top-right-radius{border-top-right-radius:0}.monaco-editor.hc-light .bottom-right-radius{border-bottom-right-radius:0}.monaco-editor .cursors-layer{position:absolute;top:0}.monaco-editor .cursors-layer>.cursor{position:absolute;overflow:hidden}.monaco-editor .cursors-layer.cursor-smooth-caret-animation>.cursor{transition:all 80ms}.monaco-editor .cursors-layer.cursor-block-outline-style>.cursor{box-sizing:border-box;background:transparent!important;border-style:solid;border-width:1px}.monaco-editor .cursors-layer.cursor-underline-style>.cursor{border-bottom-width:2px;border-bottom-style:solid;background:transparent!important;box-sizing:border-box}.monaco-editor .cursors-layer.cursor-underline-thin-style>.cursor{border-bottom-width:1px;border-bottom-style:solid;background:transparent!important;box-sizing:border-box}@keyframes monaco-cursor-smooth{0%,20%{opacity:1}60%,to{opacity:0}}@keyframes monaco-cursor-phase{0%,20%{opacity:1}90%,to{opacity:0}}@keyframes monaco-cursor-expand{0%,20%{transform:scaleY(1)}80%,to{transform:scaleY(0)}}.cursor-smooth{animation:monaco-cursor-smooth .5s ease-in-out 0s 20 alternate}.cursor-phase{animation:monaco-cursor-phase .5s ease-in-out 0s 20 alternate}.cursor-expand>.cursor{animation:monaco-cursor-expand .5s ease-in-out 0s 20 alternate}.monaco-editor .blockDecorations-container{position:absolute;top:0}.monaco-editor .blockDecorations-block{position:absolute;box-sizing:border-box}.monaco-diff-editor .diffOverview{z-index:9}.monaco-diff-editor .diffOverview .diffViewport{z-index:10}.monaco-diff-editor.vs .diffOverview{background:rgba(0,0,0,.03)}.monaco-diff-editor.vs-dark .diffOverview{background:rgba(255,255,255,.01)}.monaco-scrollable-element.modified-in-monaco-diff-editor.vs .scrollbar,.monaco-scrollable-element.modified-in-monaco-diff-editor.vs-dark .scrollbar{background:rgba(0,0,0,0)}.monaco-scrollable-element.modified-in-monaco-diff-editor.hc-black .scrollbar,.monaco-scrollable-element.modified-in-monaco-diff-editor.hc-light .scrollbar{background:none}.monaco-scrollable-element.modified-in-monaco-diff-editor .slider{z-index:10}.modified-in-monaco-diff-editor .slider.active{background:rgba(171,171,171,.4)}.modified-in-monaco-diff-editor.hc-black .slider.active,.modified-in-monaco-diff-editor.hc-light .slider.active{background:none}.monaco-editor .insert-sign,.monaco-diff-editor .insert-sign,.monaco-editor .delete-sign,.monaco-diff-editor .delete-sign{font-size:11px!important;opacity:.7!important;display:flex!important;align-items:center}.monaco-editor.hc-black .insert-sign,.monaco-diff-editor.hc-black .insert-sign,.monaco-editor.hc-black .delete-sign,.monaco-diff-editor.hc-black .delete-sign,.monaco-editor.hc-light .insert-sign,.monaco-diff-editor.hc-light .insert-sign,.monaco-editor.hc-light .delete-sign,.monaco-diff-editor.hc-light .delete-sign{opacity:1}.monaco-editor .inline-deleted-margin-view-zone,.monaco-editor .inline-added-margin-view-zone{text-align:right}.monaco-editor .arrow-revert-change{z-index:10;position:absolute}.monaco-editor .arrow-revert-change:hover{cursor:pointer}.monaco-editor .view-zones .view-lines .view-line span{display:inline-block}.monaco-editor .margin-view-zones .lightbulb-glyph:hover{cursor:pointer}:root{--sash-size: 4px}.monaco-sash{position:absolute;z-index:35;touch-action:none}.monaco-sash.disabled{pointer-events:none}.monaco-sash.mac.vertical{cursor:col-resize}.monaco-sash.vertical.minimum{cursor:e-resize}.monaco-sash.vertical.maximum{cursor:w-resize}.monaco-sash.mac.horizontal{cursor:row-resize}.monaco-sash.horizontal.minimum{cursor:s-resize}.monaco-sash.horizontal.maximum{cursor:n-resize}.monaco-sash.disabled{cursor:default!important;pointer-events:none!important}.monaco-sash.vertical{cursor:ew-resize;top:0;width:var(--sash-size);height:100%}.monaco-sash.horizontal{cursor:ns-resize;left:0;width:100%;height:var(--sash-size)}.monaco-sash:not(.disabled)>.orthogonal-drag-handle{content:\" \";height:calc(var(--sash-size) * 2);width:calc(var(--sash-size) * 2);z-index:100;display:block;cursor:all-scroll;position:absolute}.monaco-sash.horizontal.orthogonal-edge-north:not(.disabled)>.orthogonal-drag-handle.start,.monaco-sash.horizontal.orthogonal-edge-south:not(.disabled)>.orthogonal-drag-handle.end{cursor:nwse-resize}.monaco-sash.horizontal.orthogonal-edge-north:not(.disabled)>.orthogonal-drag-handle.end,.monaco-sash.horizontal.orthogonal-edge-south:not(.disabled)>.orthogonal-drag-handle.start{cursor:nesw-resize}.monaco-sash.vertical>.orthogonal-drag-handle.start{left:calc(var(--sash-size) * -.5);top:calc(var(--sash-size) * -1)}.monaco-sash.vertical>.orthogonal-drag-handle.end{left:calc(var(--sash-size) * -.5);bottom:calc(var(--sash-size) * -1)}.monaco-sash.horizontal>.orthogonal-drag-handle.start{top:calc(var(--sash-size) * -.5);left:calc(var(--sash-size) * -1)}.monaco-sash.horizontal>.orthogonal-drag-handle.end{top:calc(var(--sash-size) * -.5);right:calc(var(--sash-size) * -1)}.monaco-sash:before{content:\"\";pointer-events:none;position:absolute;width:100%;height:100%;transition:background-color .1s ease-out;background:transparent}.monaco-sash.vertical:before{width:var(--sash-hover-size);left:calc(50% - (var(--sash-hover-size) / 2))}.monaco-sash.horizontal:before{height:var(--sash-hover-size);top:calc(50% - (var(--sash-hover-size) / 2))}.pointer-events-disabled{pointer-events:none!important}.monaco-sash.debug{background:cyan}.monaco-sash.debug.disabled{background:rgba(0,255,255,.2)}.monaco-sash.debug:not(.disabled)>.orthogonal-drag-handle{background:red}.monaco-diff-editor .diff-review-line-number{text-align:right;display:inline-block}.monaco-diff-editor .diff-review{position:absolute;user-select:none;-webkit-user-select:none;-ms-user-select:none}.monaco-diff-editor .diff-review-summary{padding-left:10px}.monaco-diff-editor .diff-review-shadow{position:absolute}.monaco-diff-editor .diff-review-row{white-space:pre}.monaco-diff-editor .diff-review-table{display:table;min-width:100%}.monaco-diff-editor .diff-review-row{display:table-row;width:100%}.monaco-diff-editor .diff-review-spacer{display:inline-block;width:10px;vertical-align:middle}.monaco-diff-editor .diff-review-spacer>.codicon{font-size:9px!important}.monaco-diff-editor .diff-review-actions{display:inline-block;position:absolute;right:10px;top:2px}.monaco-diff-editor .diff-review-actions .action-label{width:16px;height:16px;margin:2px 0}.monaco-action-bar{white-space:nowrap;height:100%}.monaco-action-bar .actions-container{display:flex;margin:0 auto;padding:0;height:100%;width:100%;align-items:center}.monaco-action-bar.vertical .actions-container{display:inline-block}.monaco-action-bar .action-item{display:block;align-items:center;justify-content:center;cursor:pointer;position:relative}.monaco-action-bar .action-item.disabled{cursor:default}.monaco-action-bar .action-item .icon,.monaco-action-bar .action-item .codicon{display:block}.monaco-action-bar .action-item .codicon{display:flex;align-items:center;width:16px;height:16px}.monaco-action-bar .action-label{font-size:11px;padding:3px;border-radius:5px}.monaco-action-bar .action-item.disabled .action-label,.monaco-action-bar .action-item.disabled .action-label:before,.monaco-action-bar .action-item.disabled .action-label:hover{opacity:.6}.monaco-action-bar.vertical{text-align:left}.monaco-action-bar.vertical .action-item{display:block}.monaco-action-bar.vertical .action-label.separator{display:block;border-bottom:1px solid #bbb;padding-top:1px;margin-left:.8em;margin-right:.8em}.monaco-action-bar .action-item .action-label.separator{width:1px;height:16px;margin:5px 4px!important;cursor:default;min-width:1px;padding:0;background-color:#bbb}.secondary-actions .monaco-action-bar .action-label{margin-left:6px}.monaco-action-bar .action-item.select-container{overflow:hidden;flex:1;max-width:170px;min-width:60px;display:flex;align-items:center;justify-content:center;margin-right:10px}.monaco-action-bar .action-item.action-dropdown-item{display:flex}.monaco-action-bar .action-item.action-dropdown-item>.action-label{margin-right:1px}.monaco-editor .selection-anchor{background-color:#007acc;width:2px!important}.monaco-editor .bracket-match{box-sizing:border-box}.monaco-editor .monaco-editor-overlaymessage{padding-bottom:8px;z-index:10000}.monaco-editor .monaco-editor-overlaymessage.below{padding-bottom:0;padding-top:8px;z-index:10000}@keyframes fadeIn{0%{opacity:0}to{opacity:1}}.monaco-editor .monaco-editor-overlaymessage.fadeIn{animation:fadeIn .15s ease-out}@keyframes fadeOut{0%{opacity:1}to{opacity:0}}.monaco-editor .monaco-editor-overlaymessage.fadeOut{animation:fadeOut .1s ease-out}.monaco-editor .monaco-editor-overlaymessage .message{padding:1px 4px;color:var(--vscode-inputValidation-infoForeground);background-color:var(--vscode-inputValidation-infoBackground);border:1px solid var(--vscode-inputValidation-infoBorder)}.monaco-editor.hc-black .monaco-editor-overlaymessage .message,.monaco-editor.hc-light .monaco-editor-overlaymessage .message{border-width:2px}.monaco-editor .monaco-editor-overlaymessage .anchor{width:0!important;height:0!important;border-color:transparent;border-style:solid;z-index:1000;border-width:8px;position:absolute}.monaco-editor .monaco-editor-overlaymessage .anchor.top{border-bottom-color:var(--vscode-inputValidation-infoBorder)}.monaco-editor .monaco-editor-overlaymessage .anchor.below{border-top-color:var(--vscode-inputValidation-infoBorder)}.monaco-editor .monaco-editor-overlaymessage:not(.below) .anchor.top,.monaco-editor .monaco-editor-overlaymessage.below .anchor.below{display:none}.monaco-editor .monaco-editor-overlaymessage.below .anchor.top{display:inherit;top:-8px}.monaco-list{position:relative;height:100%;width:100%;white-space:nowrap}.monaco-list.mouse-support{user-select:none;-webkit-user-select:none;-ms-user-select:none}.monaco-list>.monaco-scrollable-element{height:100%}.monaco-list-rows{position:relative;width:100%;height:100%}.monaco-list.horizontal-scrolling .monaco-list-rows{width:auto;min-width:100%}.monaco-list-row{position:absolute;box-sizing:border-box;overflow:hidden;width:100%}.monaco-list.mouse-support .monaco-list-row{cursor:pointer;touch-action:none}.monaco-list-row.scrolling{display:none!important}.monaco-list.element-focused,.monaco-list.selection-single,.monaco-list.selection-multiple{outline:0!important}.monaco-drag-image{display:inline-block;padding:1px 7px;border-radius:10px;font-size:12px;position:absolute;z-index:1000}.monaco-list-type-filter-message{position:absolute;box-sizing:border-box;width:100%;height:100%;top:0;left:0;padding:40px 1em 1em;text-align:center;white-space:normal;opacity:.7;pointer-events:none}.monaco-list-type-filter-message:empty{display:none}.codeActionMenuWidget{padding:8px 0;overflow:auto;font-size:13px;border-radius:5px;min-width:160px;z-index:40;display:block;width:100%;border-width:0px;border-color:none;background-color:var(--vscode-menu-background);color:var(--vscode-menu-foreground);box-shadow:#00000029 0 2px 8px}.codeActionMenuWidget .monaco-list:not(.element-focused):focus:before{position:absolute;top:0;left:0;width:100%;height:100%;z-index:5;content:\"\";pointer-events:none;outline:0px solid!important;outline-width:0px!important;outline-style:none!important;outline-offset:0px!important}.codeActionMenuWidget .monaco-list{user-select:none;-webkit-user-select:none;-ms-user-select:none;border:none!important;border-width:0px!important}.codeActionMenuWidget .monaco-list .monaco-scrollable-element .monaco-list-rows{height:100%!important}.codeActionMenuWidget .monaco-list .monaco-scrollable-element{overflow:visible}.codeActionMenuWidget .monaco-list .monaco-list-row:not(.separator){display:flex;-mox-box-sizing:border-box;box-sizing:border-box;padding:0 26px;background-repeat:no-repeat;background-position:2px 2px;white-space:nowrap;cursor:pointer;touch-action:none;width:100%}.codeActionMenuWidget .monaco-list .monaco-list-row:hover:not(.option-disabled),.codeActionMenuWidget .monaco-list .moncao-list-row.focused:not(.option-disabled){color:var(--vscode-menu-selectionForeground)!important;background-color:var(--vscode-menu-selectionBackground)!important}.codeActionMenuWidget .monaco-list .option-disabled,.codeActionMenuWidget .monaco-list .option-disabled .focused{pointer-events:none;-webkit-touch-callout:none;-webkit-user-select:none;-khtml-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;color:var(--vscode-disabledForeground)!important}.codeActionMenuWidget .monaco-list .separator{border-bottom:1px solid var(--vscode-menu-separatorBackground);padding-top:0!important;width:100%;height:0px!important;opacity:1;font-size:inherit;margin:5px 0!important;border-radius:0;display:flex;-mox-box-sizing:border-box;box-sizing:border-box;background-repeat:no-repeat;background-position:2px 2px;white-space:nowrap;cursor:pointer;touch-action:none}.monaco-editor .contentWidgets .codicon-light-bulb,.monaco-editor .contentWidgets .codicon-lightbulb-autofix{display:flex;align-items:center;justify-content:center}.monaco-editor .contentWidgets .codicon-light-bulb:hover,.monaco-editor .contentWidgets .codicon-lightbulb-autofix:hover{cursor:pointer}.monaco-editor .codelens-decoration{overflow:hidden;display:inline-block;text-overflow:ellipsis;white-space:nowrap;color:var(--vscode-editorCodeLens-foreground)}.monaco-editor .codelens-decoration>span,.monaco-editor .codelens-decoration>a{user-select:none;-webkit-user-select:none;-ms-user-select:none;white-space:nowrap;vertical-align:sub}.monaco-editor .codelens-decoration>a{text-decoration:none}.monaco-editor .codelens-decoration>a:hover{cursor:pointer;color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .codelens-decoration>a:hover .codicon{color:var(--vscode-editorLink-activeForeground)!important}.monaco-editor .codelens-decoration .codicon{vertical-align:middle;color:currentColor!important;color:var(--vscode-editorCodeLens-foreground)}.monaco-editor .codelens-decoration>a:hover .codicon:before{cursor:pointer}@keyframes fadein{0%{opacity:0;visibility:visible}to{opacity:1}}.monaco-editor .codelens-decoration.fadein{animation:fadein .1s linear}.colorpicker-widget{height:190px;user-select:none;-webkit-user-select:none;-ms-user-select:none}.colorpicker-color-decoration,.hc-light .colorpicker-color-decoration{border:solid .1em #000;box-sizing:border-box;margin:.1em .2em 0;width:.8em;height:.8em;line-height:.8em;display:inline-block;cursor:pointer}.hc-black .colorpicker-color-decoration,.vs-dark .colorpicker-color-decoration{border:solid .1em #eee}.colorpicker-header{display:flex;height:24px;position:relative;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAAAHUlEQVQYV2PYvXu3JAi7uLiAMaYAjAGTQBPYLQkAa/0Zef3qRswAAAAASUVORK5CYII=);background-size:9px 9px;image-rendering:pixelated}.colorpicker-header .picked-color{width:216px;display:flex;align-items:center;justify-content:center;line-height:24px;cursor:pointer;color:#fff;flex:1}.colorpicker-header .picked-color .codicon{color:inherit;font-size:14px;position:absolute;left:8px}.colorpicker-header .picked-color.light{color:#000}.colorpicker-header .original-color{width:74px;z-index:inherit;cursor:pointer}.colorpicker-body{display:flex;padding:8px;position:relative}.colorpicker-body .saturation-wrap{overflow:hidden;height:150px;position:relative;min-width:220px;flex:1}.colorpicker-body .saturation-box{height:150px;position:absolute}.colorpicker-body .saturation-selection{width:9px;height:9px;margin:-5px 0 0 -5px;border:1px solid rgb(255,255,255);border-radius:100%;box-shadow:0 0 2px #000c;position:absolute}.colorpicker-body .strip{width:25px;height:150px}.colorpicker-body .hue-strip{position:relative;margin-left:8px;cursor:grab;background:linear-gradient(to bottom,#ff0000 0%,#ffff00 17%,#00ff00 33%,#00ffff 50%,#0000ff 67%,#ff00ff 83%,#ff0000 100%)}.colorpicker-body .opacity-strip{position:relative;margin-left:8px;cursor:grab;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAQAAAAECAYAAACp8Z5+AAAAAXNSR0IArs4c6QAAAARnQU1BAACxjwv8YQUAAAAJcEhZcwAADsMAAA7DAcdvqGQAAAAZdEVYdFNvZnR3YXJlAHBhaW50Lm5ldCA0LjAuMTZEaa/1AAAAHUlEQVQYV2PYvXu3JAi7uLiAMaYAjAGTQBPYLQkAa/0Zef3qRswAAAAASUVORK5CYII=);background-size:9px 9px;image-rendering:pixelated}.colorpicker-body .strip.grabbing{cursor:grabbing}.colorpicker-body .slider{position:absolute;top:0;left:-2px;width:calc(100% + 4px);height:4px;box-sizing:border-box;border:1px solid rgba(255,255,255,.71);box-shadow:0 0 1px #000000d9}.colorpicker-body .strip .overlay{height:150px;pointer-events:none}.monaco-editor .goto-definition-link{text-decoration:underline;cursor:pointer}.monaco-editor .peekview-widget .head{box-sizing:border-box;display:flex;justify-content:space-between;flex-wrap:nowrap}.monaco-editor .peekview-widget .head .peekview-title{display:flex;align-items:center;font-size:13px;margin-left:20px;min-width:0;text-overflow:ellipsis;overflow:hidden}.monaco-editor .peekview-widget .head .peekview-title.clickable{cursor:pointer}.monaco-editor .peekview-widget .head .peekview-title .dirname:not(:empty){font-size:.9em;margin-left:.5em;text-overflow:ellipsis;overflow:hidden}.monaco-editor .peekview-widget .head .peekview-title .meta{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.monaco-editor .peekview-widget .head .peekview-title .dirname{white-space:nowrap}.monaco-editor .peekview-widget .head .peekview-title .filename{overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.monaco-editor .peekview-widget .head .peekview-title .meta:not(:empty):before{content:\"-\";padding:0 .3em}.monaco-editor .peekview-widget .head .peekview-actions{flex:1;text-align:right;padding-right:2px}.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar{display:inline-block}.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar,.monaco-editor .peekview-widget .head .peekview-actions>.monaco-action-bar>.actions-container{height:100%}.monaco-editor .peekview-widget>.body{border-top:1px solid;position:relative}.monaco-editor .peekview-widget .head .peekview-title .codicon{margin-right:4px}.monaco-editor .peekview-widget .monaco-list .monaco-list-row.focused .codicon{color:inherit!important}.monaco-editor .zone-widget{position:absolute;z-index:10}.monaco-editor .zone-widget .zone-widget-container{border-top-style:solid;border-bottom-style:solid;border-top-width:0;border-bottom-width:0;position:relative}.monaco-dropdown{height:100%;padding:0}.monaco-dropdown>.dropdown-label{cursor:pointer;height:100%;display:flex;align-items:center;justify-content:center}.monaco-dropdown>.dropdown-label>.action-label.disabled{cursor:default}.monaco-dropdown-with-primary{display:flex!important;flex-direction:row;border-radius:5px}.monaco-dropdown-with-primary>.action-container>.action-label{margin-right:0}.monaco-dropdown-with-primary>.dropdown-action-container>.monaco-dropdown>.dropdown-label .codicon[class*=codicon-]{font-size:12px;padding-left:0;padding-right:0;line-height:16px;margin-left:-3px}.monaco-dropdown-with-primary>.dropdown-action-container>.monaco-dropdown>.dropdown-label>.action-label{display:block;background-size:16px;background-position:center center;background-repeat:no-repeat}.monaco-action-bar .action-item.menu-entry .action-label.icon{width:16px;height:16px;background-repeat:no-repeat;background-position:50%;background-size:16px}.monaco-dropdown-with-default{display:flex!important;flex-direction:row;border-radius:5px}.monaco-dropdown-with-default>.action-container>.action-label{margin-right:0}.monaco-dropdown-with-default>.action-container.menu-entry>.action-label.icon{width:16px;height:16px;background-repeat:no-repeat;background-position:50%;background-size:16px}.monaco-dropdown-with-default>.dropdown-action-container>.monaco-dropdown>.dropdown-label .codicon[class*=codicon-]{font-size:12px;padding-left:0;padding-right:0;line-height:16px;margin-left:-3px}.monaco-dropdown-with-default>.dropdown-action-container>.monaco-dropdown>.dropdown-label>.action-label{display:block;background-size:16px;background-position:center center;background-repeat:no-repeat}.monaco-split-view2{position:relative;width:100%;height:100%}.monaco-split-view2>.sash-container{position:absolute;width:100%;height:100%;pointer-events:none}.monaco-split-view2>.sash-container>.monaco-sash{pointer-events:initial}.monaco-split-view2>.monaco-scrollable-element{width:100%;height:100%}.monaco-split-view2>.monaco-scrollable-element>.split-view-container{width:100%;height:100%;white-space:nowrap;position:relative}.monaco-split-view2>.monaco-scrollable-element>.split-view-container>.split-view-view{white-space:initial;position:absolute}.monaco-split-view2>.monaco-scrollable-element>.split-view-container>.split-view-view:not(.visible){display:none}.monaco-split-view2.vertical>.monaco-scrollable-element>.split-view-container>.split-view-view{width:100%}.monaco-split-view2.horizontal>.monaco-scrollable-element>.split-view-container>.split-view-view{height:100%}.monaco-split-view2.separator-border>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{content:\" \";position:absolute;top:0;left:0;z-index:5;pointer-events:none;background-color:var(--separator-border)}.monaco-split-view2.separator-border.horizontal>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{height:100%;width:1px}.monaco-split-view2.separator-border.vertical>.monaco-scrollable-element>.split-view-container>.split-view-view:not(:first-child):before{height:1px;width:100%}.monaco-table{display:flex;flex-direction:column;position:relative;height:100%;width:100%;white-space:nowrap}.monaco-table>.monaco-split-view2{border-bottom:1px solid transparent}.monaco-table>.monaco-list{flex:1}.monaco-table-tr{display:flex;height:100%}.monaco-table-th{width:100%;height:100%;font-weight:700;overflow:hidden;text-overflow:ellipsis}.monaco-table-th,.monaco-table-td{box-sizing:border-box;flex-shrink:0;overflow:hidden;white-space:nowrap;text-overflow:ellipsis}.monaco-table>.monaco-split-view2 .monaco-sash.vertical:before{content:\"\";position:absolute;left:calc(var(--sash-size) / 2);width:0;border-left:1px solid transparent}.monaco-table>.monaco-split-view2,.monaco-table>.monaco-split-view2 .monaco-sash.vertical:before{transition:border-color .2s ease-out}.monaco-custom-toggle{margin-left:2px;float:left;cursor:pointer;overflow:hidden;width:20px;height:20px;border-radius:3px;border:1px solid transparent;padding:1px;box-sizing:border-box;user-select:none;-webkit-user-select:none;-ms-user-select:none}.monaco-custom-toggle:hover{background-color:var(--vscode-inputOption-hoverBackground)}.hc-black .monaco-custom-toggle:hover,.hc-light .monaco-custom-toggle:hover{border:1px dashed var(--vscode-focusBorder)}.hc-black .monaco-custom-toggle,.hc-light .monaco-custom-toggle,.hc-black .monaco-custom-toggle:hover,.hc-light .monaco-custom-toggle:hover{background:none}.monaco-custom-toggle.monaco-checkbox{height:18px;width:18px;border:1px solid transparent;border-radius:3px;margin-right:9px;margin-left:0;padding:0;opacity:1;background-size:16px!important}.monaco-custom-toggle.monaco-checkbox:not(.checked):before{visibility:hidden}.monaco-inputbox{position:relative;display:block;padding:0;box-sizing:border-box;font-size:inherit}.monaco-inputbox.idle{border:1px solid transparent}.monaco-inputbox>.ibwrapper>.input,.monaco-inputbox>.ibwrapper>.mirror{padding:4px}.monaco-inputbox>.ibwrapper{position:relative;width:100%;height:100%}.monaco-inputbox>.ibwrapper>.input{display:inline-block;box-sizing:border-box;width:100%;height:100%;line-height:inherit;border:none;font-family:inherit;font-size:inherit;resize:none;color:inherit}.monaco-inputbox>.ibwrapper>input{text-overflow:ellipsis}.monaco-inputbox>.ibwrapper>textarea.input{display:block;-ms-overflow-style:none;scrollbar-width:none;outline:none}.monaco-inputbox>.ibwrapper>textarea.input::-webkit-scrollbar{display:none}.monaco-inputbox>.ibwrapper>textarea.input.empty{white-space:nowrap}.monaco-inputbox>.ibwrapper>.mirror{position:absolute;display:inline-block;width:100%;top:0;left:0;box-sizing:border-box;white-space:pre-wrap;visibility:hidden;word-wrap:break-word}.monaco-inputbox-container{text-align:right}.monaco-inputbox-container .monaco-inputbox-message{display:inline-block;overflow:hidden;text-align:left;width:100%;box-sizing:border-box;padding:.4em;font-size:12px;line-height:17px;margin-top:-1px;word-wrap:break-word}.monaco-inputbox .monaco-action-bar{position:absolute;right:2px;top:4px}.monaco-inputbox .monaco-action-bar .action-item{margin-left:2px}.monaco-inputbox .monaco-action-bar .action-item .codicon{background-repeat:no-repeat;width:16px;height:16px}.monaco-findInput{position:relative}.monaco-findInput .monaco-inputbox{font-size:13px;width:100%}.monaco-findInput>.controls{position:absolute;top:3px;right:2px}.vs .monaco-findInput.disabled{background-color:#e1e1e1}.vs-dark .monaco-findInput.disabled{background-color:#333}.monaco-findInput.highlight-0 .controls,.hc-light .monaco-findInput.highlight-0 .controls{animation:monaco-findInput-highlight-0 .1s linear 0s}.monaco-findInput.highlight-1 .controls,.hc-light .monaco-findInput.highlight-1 .controls{animation:monaco-findInput-highlight-1 .1s linear 0s}.hc-black .monaco-findInput.highlight-0 .controls,.vs-dark .monaco-findInput.highlight-0 .controls{animation:monaco-findInput-highlight-dark-0 .1s linear 0s}.hc-black .monaco-findInput.highlight-1 .controls,.vs-dark .monaco-findInput.highlight-1 .controls{animation:monaco-findInput-highlight-dark-1 .1s linear 0s}@keyframes monaco-findInput-highlight-0{0%{background:rgba(253,255,0,.8)}to{background:transparent}}@keyframes monaco-findInput-highlight-1{0%{background:rgba(253,255,0,.8)}99%{background:transparent}}@keyframes monaco-findInput-highlight-dark-0{0%{background:rgba(255,255,255,.44)}to{background:transparent}}@keyframes monaco-findInput-highlight-dark-1{0%{background:rgba(255,255,255,.44)}99%{background:transparent}}.monaco-tl-row{display:flex;height:100%;align-items:center;position:relative}.monaco-tl-indent{height:100%;position:absolute;top:0;left:16px;pointer-events:none}.hide-arrows .monaco-tl-indent{left:12px}.monaco-tl-indent>.indent-guide{display:inline-block;box-sizing:border-box;height:100%;border-left:1px solid transparent}.monaco-tl-indent>.indent-guide{transition:border-color .1s linear}.monaco-tl-twistie,.monaco-tl-contents{height:100%}.monaco-tl-twistie{font-size:10px;text-align:right;padding-right:6px;flex-shrink:0;width:16px;display:flex!important;align-items:center;justify-content:center;transform:translate(3px)}.monaco-tl-contents{flex:1;overflow:hidden}.monaco-tl-twistie:before{border-radius:20px}.monaco-tl-twistie.collapsed:before{transform:rotate(-90deg)}.monaco-tl-twistie.codicon-tree-item-loading:before{animation:codicon-spin 1.25s steps(30) infinite}.monaco-tree-type-filter{position:absolute;top:0;display:flex;padding:3px;transition:top .3s;max-width:200px;z-index:100;margin:0 6px}.monaco-tree-type-filter.disabled{top:-40px}.monaco-tree-type-filter-grab{display:flex!important;align-items:center;justify-content:center;cursor:grab;margin-right:2px}.monaco-tree-type-filter-grab.grabbing{cursor:grabbing}.monaco-tree-type-filter-input{flex:1}.monaco-tree-type-filter-input .monaco-inputbox{height:23px}.monaco-tree-type-filter-input .monaco-inputbox>.ibwrapper>.input,.monaco-tree-type-filter-input .monaco-inputbox>.ibwrapper>.mirror{padding:2px 4px}.monaco-tree-type-filter-input .monaco-findInput>.controls{top:2px}.monaco-tree-type-filter-actionbar{margin-left:4px}.monaco-tree-type-filter-actionbar .monaco-action-bar .action-label{padding:2px}.monaco-editor .zone-widget .zone-widget-container.reference-zone-widget{border-top-width:1px;border-bottom-width:1px}.monaco-editor .reference-zone-widget .inline{display:inline-block;vertical-align:top}.monaco-editor .reference-zone-widget .messages{height:100%;width:100%;text-align:center;padding:3em 0}.monaco-editor .reference-zone-widget .ref-tree{line-height:23px;background-color:var(--vscode-peekViewResult-background);color:var(--vscode-peekViewResult-lineForeground)}.monaco-editor .reference-zone-widget .ref-tree .reference{text-overflow:ellipsis;overflow:hidden}.monaco-editor .reference-zone-widget .ref-tree .reference-file{display:inline-flex;width:100%;height:100%;color:var(--vscode-peekViewResult-fileForeground)}.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .selected .reference-file{color:inherit!important}.monaco-editor .reference-zone-widget .ref-tree .monaco-list:focus .monaco-list-rows>.monaco-list-row.selected:not(.highlighted){background-color:var(--vscode-peekViewResult-selectionBackground);color:var(--vscode-peekViewResult-selectionForeground)!important}.monaco-editor .reference-zone-widget .ref-tree .reference-file .count{margin-right:12px;margin-left:auto}.monaco-editor .reference-zone-widget .ref-tree .referenceMatch .highlight{background-color:var(--vscode-peekViewResult-matchHighlightBackground)}.monaco-editor .reference-zone-widget .preview .reference-decoration{background-color:var(--vscode-peekViewEditor-matchHighlightBackground);border:2px solid var(--vscode-peekViewEditor-matchHighlightBorder);box-sizing:border-box}.monaco-editor .reference-zone-widget .preview .monaco-editor .monaco-editor-background,.monaco-editor .reference-zone-widget .preview .monaco-editor .inputarea.ime-input{background-color:var(--vscode-peekViewEditor-background)}.monaco-editor .reference-zone-widget .preview .monaco-editor .margin{background-color:var(--vscode-peekViewEditorGutter-background)}.monaco-editor.hc-black .reference-zone-widget .ref-tree .reference-file,.monaco-editor.hc-light .reference-zone-widget .ref-tree .reference-file{font-weight:700}.monaco-editor.hc-black .reference-zone-widget .ref-tree .referenceMatch .highlight,.monaco-editor.hc-light .reference-zone-widget .ref-tree .referenceMatch .highlight{border:1px dotted var(--vscode-contrastActiveBorder, transparent);box-sizing:border-box}.monaco-count-badge{padding:3px 6px;border-radius:11px;font-size:11px;min-width:18px;min-height:18px;line-height:11px;font-weight:400;text-align:center;display:inline-block;box-sizing:border-box}.monaco-count-badge.long{padding:2px 3px;border-radius:2px;min-height:auto;line-height:normal}.monaco-icon-label{display:flex;overflow:hidden;text-overflow:ellipsis}.monaco-icon-label:before{background-size:16px;background-position:left center;background-repeat:no-repeat;padding-right:6px;width:16px;height:22px;line-height:inherit!important;display:inline-block;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;vertical-align:top;flex-shrink:0}.monaco-icon-label>.monaco-icon-label-container{min-width:0;overflow:hidden;text-overflow:ellipsis;flex:1}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-name-container>.label-name{color:inherit;white-space:pre}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-name-container>.label-name>.label-separator{margin:0 2px;opacity:.5}.monaco-icon-label>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{opacity:.7;margin-left:.5em;font-size:.9em;white-space:pre}.monaco-icon-label.nowrap>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{white-space:nowrap}.vs .monaco-icon-label>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{opacity:.95}.monaco-icon-label.italic>.monaco-icon-label-container>.monaco-icon-name-container>.label-name,.monaco-icon-label.italic>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{font-style:italic}.monaco-icon-label.deprecated{text-decoration:line-through;opacity:.66}.monaco-icon-label.italic:after{font-style:italic}.monaco-icon-label.strikethrough>.monaco-icon-label-container>.monaco-icon-name-container>.label-name,.monaco-icon-label.strikethrough>.monaco-icon-label-container>.monaco-icon-description-container>.label-description{text-decoration:line-through}.monaco-icon-label:after{opacity:.75;font-size:90%;font-weight:600;margin:auto 16px 0 5px;text-align:center}.monaco-list:focus .selected .monaco-icon-label,.monaco-list:focus .selected .monaco-icon-label:after{color:inherit!important}.monaco-list-row.focused.selected .label-description,.monaco-list-row.selected .label-description{opacity:.8}.monaco-hover{cursor:default;position:absolute;overflow:hidden;z-index:50;user-select:text;-webkit-user-select:text;-ms-user-select:text;box-sizing:initial;animation:fadein .1s linear;line-height:1.5em}.monaco-hover.hidden{display:none}.monaco-hover a:hover{cursor:pointer}.monaco-hover .hover-contents:not(.html-hover-contents){padding:4px 8px}.monaco-hover .markdown-hover>.hover-contents:not(.code-hover-contents){max-width:500px;word-wrap:break-word}.monaco-hover .markdown-hover>.hover-contents:not(.code-hover-contents) hr{min-width:100%}.monaco-hover p,.monaco-hover .code,.monaco-hover ul{margin:8px 0}.monaco-hover code{font-family:var(--monaco-monospace-font)}.monaco-hover hr{box-sizing:border-box;border-left:0px;border-right:0px;margin:4px -8px -4px;height:1px}.monaco-hover p:first-child,.monaco-hover .code:first-child,.monaco-hover ul:first-child{margin-top:0}.monaco-hover p:last-child,.monaco-hover .code:last-child,.monaco-hover ul:last-child{margin-bottom:0}.monaco-hover ul,.monaco-hover ol{padding-left:20px}.monaco-hover li>p{margin-bottom:0}.monaco-hover li>ul{margin-top:0}.monaco-hover code{border-radius:3px;padding:0 .4em}.monaco-hover .monaco-tokenized-source{white-space:pre-wrap}.monaco-hover .hover-row.status-bar{font-size:12px;line-height:22px}.monaco-hover .hover-row.status-bar .actions{display:flex;padding:0 8px}.monaco-hover .hover-row.status-bar .actions .action-container{margin-right:16px;cursor:pointer}.monaco-hover .hover-row.status-bar .actions .action-container .action .icon{padding-right:4px}.monaco-hover .markdown-hover .hover-contents .codicon{color:inherit;font-size:inherit;vertical-align:middle}.monaco-hover .hover-contents a.code-link:hover,.monaco-hover .hover-contents a.code-link{color:inherit}.monaco-hover .hover-contents a.code-link:before{content:\"(\"}.monaco-hover .hover-contents a.code-link:after{content:\")\"}.monaco-hover .hover-contents a.code-link>span{text-decoration:underline;border-bottom:1px solid transparent;text-underline-position:under}.monaco-hover .markdown-hover .hover-contents:not(.code-hover-contents):not(.html-hover-contents) span{margin-bottom:4px;display:inline-block}.monaco-hover-content .action-container a{-webkit-user-select:none;user-select:none}.monaco-hover-content .action-container.disabled{pointer-events:none;opacity:.4;cursor:default}.monaco-editor .peekview-widget .head .peekview-title .severity-icon{display:inline-block;vertical-align:text-top;margin-right:4px}.monaco-editor .marker-widget{text-overflow:ellipsis;white-space:nowrap}.monaco-editor .marker-widget>.stale{opacity:.6;font-style:italic}.monaco-editor .marker-widget .title{display:inline-block;padding-right:5px}.monaco-editor .marker-widget .descriptioncontainer{position:absolute;white-space:pre;user-select:text;-webkit-user-select:text;-ms-user-select:text;padding:8px 12px 0 20px}.monaco-editor .marker-widget .descriptioncontainer .message{display:flex;flex-direction:column}.monaco-editor .marker-widget .descriptioncontainer .message .details{padding-left:6px}.monaco-editor .marker-widget .descriptioncontainer .message .source,.monaco-editor .marker-widget .descriptioncontainer .message span.code{opacity:.6}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link{opacity:.6;color:inherit}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link:before{content:\"(\"}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link:after{content:\")\"}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link>span{text-decoration:underline;border-bottom:1px solid transparent;text-underline-position:under;color:var(--vscode-textLink-foreground)}.monaco-editor .marker-widget .descriptioncontainer .message a.code-link>span{color:var(--vscode-textLink-activeForeground)}.monaco-editor .marker-widget .descriptioncontainer .filename{cursor:pointer}.monaco-editor .snippet-placeholder{min-width:2px;outline-style:solid;outline-width:1px;background-color:var(--vscode-editor-snippetTabstopHighlightBackground, transparent);outline-color:var(--vscode-editor-snippetTabstopHighlightBorder, transparent)}.monaco-editor .finish-snippet-placeholder{outline-style:solid;outline-width:1px;background-color:var(--vscode-editor-snippetFinalTabstopHighlightBackground, transparent);outline-color:var(--vscode-editor-snippetFinalTabstopHighlightBorder, transparent)}.monaco-editor.vs .dnd-target,.monaco-editor.hc-light .dnd-target{border-right:2px dotted black;color:#fff}.monaco-editor.vs-dark .dnd-target{border-right:2px dotted #AEAFAD;color:#51504f}.monaco-editor.hc-black .dnd-target{border-right:2px dotted #fff;color:#000}.monaco-editor.mouse-default .view-lines,.monaco-editor.vs-dark.mac.mouse-default .view-lines,.monaco-editor.hc-black.mac.mouse-default .view-lines,.monaco-editor.hc-light.mac.mouse-default .view-lines{cursor:default}.monaco-editor.mouse-copy .view-lines,.monaco-editor.vs-dark.mac.mouse-copy .view-lines,.monaco-editor.hc-black.mac.mouse-copy .view-lines,.monaco-editor.hc-light.mac.mouse-copy .view-lines{cursor:copy}.monaco-editor .find-widget{position:absolute;z-index:35;height:33px;overflow:hidden;line-height:19px;transition:transform .2s linear;padding:0 4px;box-sizing:border-box;transform:translateY(calc(-100% - 10px))}.monaco-workbench.reduce-motion .monaco-editor .find-widget{transition:transform 0ms linear}.monaco-editor .find-widget textarea{margin:0}.monaco-editor .find-widget.hiddenEditor{display:none}.monaco-editor .find-widget.replaceToggled>.replace-part{display:flex}.monaco-editor .find-widget.visible{transform:translateY(0)}.monaco-editor .find-widget .monaco-inputbox.synthetic-focus{outline:1px solid -webkit-focus-ring-color;outline-offset:-1px}.monaco-editor .find-widget .monaco-inputbox .input{background-color:transparent;min-height:0}.monaco-editor .find-widget .monaco-findInput .input{font-size:13px}.monaco-editor .find-widget>.find-part,.monaco-editor .find-widget>.replace-part{margin:4px 0 0 17px;font-size:12px;display:flex}.monaco-editor .find-widget>.find-part .monaco-inputbox,.monaco-editor .find-widget>.replace-part .monaco-inputbox{min-height:25px}.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.mirror{padding-right:22px}.monaco-editor .find-widget>.find-part .monaco-inputbox>.ibwrapper>.input,.monaco-editor .find-widget>.find-part .monaco-inputbox>.ibwrapper>.mirror,.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.input,.monaco-editor .find-widget>.replace-part .monaco-inputbox>.ibwrapper>.mirror{padding-top:2px;padding-bottom:2px}.monaco-editor .find-widget>.find-part .find-actions{height:25px;display:flex;align-items:center}.monaco-editor .find-widget>.replace-part .replace-actions{height:25px;display:flex;align-items:center}.monaco-editor .find-widget .monaco-findInput{vertical-align:middle;display:flex;flex:1}.monaco-editor .find-widget .monaco-findInput .monaco-scrollable-element{width:100%}.monaco-editor .find-widget .monaco-findInput .monaco-scrollable-element .scrollbar.vertical{opacity:0}.monaco-editor .find-widget .matchesCount{display:flex;flex:initial;margin:0 0 0 3px;padding:2px 0 0 2px;height:25px;vertical-align:middle;box-sizing:border-box;text-align:center;line-height:23px}.monaco-editor .find-widget .button{width:16px;height:16px;padding:3px;border-radius:5px;flex:initial;margin-left:3px;background-position:center center;background-repeat:no-repeat;cursor:pointer;display:flex;align-items:center;justify-content:center}.monaco-editor .find-widget .codicon-find-selection{width:22px;height:22px;padding:3px;border-radius:5px}.monaco-editor .find-widget .button.left{margin-left:0;margin-right:3px}.monaco-editor .find-widget .button.wide{width:auto;padding:1px 6px;top:-1px}.monaco-editor .find-widget .button.toggle{position:absolute;top:0;left:3px;width:18px;height:100%;border-radius:0;box-sizing:border-box}.monaco-editor .find-widget .button.toggle.disabled{display:none}.monaco-editor .find-widget .disabled{color:var(--vscode-disabledForeground);cursor:default}.monaco-editor .find-widget>.replace-part{display:none}.monaco-editor .find-widget>.replace-part>.monaco-findInput{position:relative;display:flex;vertical-align:middle;flex:auto;flex-grow:0;flex-shrink:0}.monaco-editor .find-widget>.replace-part>.monaco-findInput>.controls{position:absolute;top:3px;right:2px}.monaco-editor .find-widget.reduced-find-widget .matchesCount{display:none}.monaco-editor .find-widget.narrow-find-widget{max-width:257px!important}.monaco-editor .find-widget.collapsed-find-widget{max-width:170px!important}.monaco-editor .find-widget.collapsed-find-widget .button.previous,.monaco-editor .find-widget.collapsed-find-widget .button.next,.monaco-editor .find-widget.collapsed-find-widget .button.replace,.monaco-editor .find-widget.collapsed-find-widget .button.replace-all,.monaco-editor .find-widget.collapsed-find-widget>.find-part .monaco-findInput .controls{display:none}.monaco-editor .findMatch{animation-duration:0;animation-name:inherit!important}.monaco-editor .find-widget .monaco-sash{left:0!important}.monaco-editor.hc-black .find-widget .button:before{position:relative;top:1px;left:2px}.monaco-editor .margin-view-overlays .codicon-folding-manual-collapsed,.monaco-editor .margin-view-overlays .codicon-folding-manual-expanded,.monaco-editor .margin-view-overlays .codicon-folding-expanded,.monaco-editor .margin-view-overlays .codicon-folding-collapsed{cursor:pointer;opacity:0;transition:opacity .5s;display:flex;align-items:center;justify-content:center;font-size:140%;margin-left:2px}.monaco-editor .margin-view-overlays:hover .codicon,.monaco-editor .margin-view-overlays .codicon.codicon-folding-collapsed,.monaco-editor .margin-view-overlays .codicon.codicon-folding-manual-collapsed,.monaco-editor .margin-view-overlays .codicon.alwaysShowFoldIcons{opacity:1}.monaco-editor .inline-folded:after{color:gray;margin:.1em .2em 0;content:\"\\22ef\";display:inline;line-height:1em;cursor:pointer}@font-face{font-family:codicon;font-display:block;src:url(/luci-static/linkeasefile/codicon.ttf) format(\"truetype\")}.codicon[class*=codicon-]{font: 16px/1 codicon;display:inline-block;text-decoration:none;text-rendering:auto;text-align:center;text-transform:none;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale;user-select:none;-webkit-user-select:none;-ms-user-select:none}.codicon-wrench-subaction{opacity:.5}@keyframes codicon-spin{to{transform:rotate(360deg)}}.codicon-sync.codicon-modifier-spin,.codicon-loading.codicon-modifier-spin,.codicon-gear.codicon-modifier-spin,.codicon-notebook-state-executing.codicon-modifier-spin{animation:codicon-spin 1.5s steps(30) infinite}.codicon-modifier-disabled{opacity:.4}.codicon-loading,.codicon-tree-item-loading:before{animation-duration:1s!important;animation-timing-function:cubic-bezier(.53,.21,.29,.67)!important}.monaco-editor .suggest-widget{width:430px;z-index:40;display:flex;flex-direction:column}.monaco-editor .suggest-widget.message{flex-direction:row;align-items:center}.monaco-editor .suggest-widget,.monaco-editor .suggest-details{flex:0 1 auto;width:100%;border-style:solid;border-width:1px;border-color:var(--vscode-editorSuggestWidget-border);background-color:var(--vscode-editorSuggestWidget-background)}.monaco-editor.hc-black .suggest-widget,.monaco-editor.hc-black .suggest-details,.monaco-editor.hc-light .suggest-widget,.monaco-editor.hc-light .suggest-details{border-width:2px}.monaco-editor .suggest-widget .suggest-status-bar{box-sizing:border-box;display:none;flex-flow:row nowrap;justify-content:space-between;width:100%;font-size:80%;padding:0 4px;border-top:1px solid var(--vscode-editorSuggestWidget-border);overflow:hidden}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar{display:flex}.monaco-editor .suggest-widget .suggest-status-bar .left{padding-right:8px}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-label{color:var(--vscode-editorSuggestWidgetStatus-foreground)}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-item:not(:last-of-type) .action-label{margin-right:0}.monaco-editor .suggest-widget.with-status-bar .suggest-status-bar .action-item:not(:last-of-type) .action-label:after{content:\", \";margin-right:.3em}.monaco-editor .suggest-widget.with-status-bar .monaco-list .monaco-list-row>.contents>.main>.right>.readMore,.monaco-editor .suggest-widget.with-status-bar .monaco-list .monaco-list-row.focused.string-label>.contents>.main>.right>.readMore{display:none}.monaco-editor .suggest-widget.with-status-bar:not(.docs-side) .monaco-list .monaco-list-row:hover>.contents>.main>.right.can-expand-details>.details-label{width:100%}.monaco-editor .suggest-widget>.message{padding-left:22px}.monaco-editor .suggest-widget>.tree{height:100%;width:100%}.monaco-editor .suggest-widget .monaco-list{user-select:none;-webkit-user-select:none;-ms-user-select:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row{display:flex;-mox-box-sizing:border-box;box-sizing:border-box;padding-right:10px;background-repeat:no-repeat;background-position:2px 2px;white-space:nowrap;cursor:pointer;touch-action:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused{color:var(--vscode-editorSuggestWidget-selectedForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused .codicon{color:var(--vscode-editorSuggestWidget-selectedIconForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents{flex:1;height:100%;overflow:hidden;padding-left:2px}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main{display:flex;overflow:hidden;text-overflow:ellipsis;white-space:pre;justify-content:space-between}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right{display:flex}.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.focused)>.contents>.main .monaco-icon-label{color:var(--vscode-editorSuggestWidget-foreground)}.monaco-editor .suggest-widget:not(.frozen) .monaco-highlighted-label .highlight{font-weight:700}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main .monaco-highlighted-label .highlight{color:var(--vscode-editorSuggestWidget-highlightForeground)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused>.contents>.main .monaco-highlighted-label .highlight{color:var(--vscode-editorSuggestWidget-focusHighlightForeground)}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore:before{color:inherit;opacity:1;font-size:14px;cursor:pointer}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close{position:absolute;top:6px;right:2px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.codicon-close:hover,.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore:hover{opacity:1}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{opacity:.7}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.signature-label{overflow:hidden;text-overflow:ellipsis;opacity:.6}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.qualifier-label{margin-left:12px;opacity:.4;font-size:85%;line-height:initial;text-overflow:ellipsis;overflow:hidden;align-self:center}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{font-size:85%;margin-left:1.1em;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label>.monaco-tokenized-source{display:inline}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.details-label{display:none}.monaco-editor .suggest-widget:not(.shows-details) .monaco-list .monaco-list-row.focused>.contents>.main>.right>.details-label{display:inline}.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.string-label)>.contents>.main>.right>.details-label,.monaco-editor .suggest-widget.docs-side .monaco-list .monaco-list-row.focused:not(.string-label)>.contents>.main>.right>.details-label{display:inline}.monaco-editor .suggest-widget:not(.docs-side) .monaco-list .monaco-list-row.focused:hover>.contents>.main>.right.can-expand-details>.details-label{width:calc(100% - 26px)}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left{flex-shrink:1;flex-grow:1;overflow:hidden}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.left>.monaco-icon-label{flex-shrink:0}.monaco-editor .suggest-widget .monaco-list .monaco-list-row:not(.string-label)>.contents>.main>.left>.monaco-icon-label{max-width:100%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.string-label>.contents>.main>.left>.monaco-icon-label{flex-shrink:1}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right{overflow:hidden;flex-shrink:4;max-width:70%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{display:inline-block;position:absolute;right:10px;width:18px;height:18px;visibility:hidden}.monaco-editor .suggest-widget.docs-side .monaco-list .monaco-list-row>.contents>.main>.right>.readMore{display:none!important}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.string-label>.contents>.main>.right>.readMore{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused.string-label>.contents>.main>.right>.readMore{display:inline-block}.monaco-editor .suggest-widget .monaco-list .monaco-list-row.focused:hover>.contents>.main>.right>.readMore{visibility:visible}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label.deprecated{opacity:.66;text-decoration:unset}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label.deprecated>.monaco-icon-label-container>.monaco-icon-name-container{text-decoration:line-through}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .monaco-icon-label:before{height:100%}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon{display:block;height:16px;width:16px;margin-left:2px;background-repeat:no-repeat;background-size:80%;background-position:center}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.hide{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .suggest-icon{display:flex;align-items:center;margin-right:4px}.monaco-editor .suggest-widget.no-icons .monaco-list .monaco-list-row .icon,.monaco-editor .suggest-widget.no-icons .monaco-list .monaco-list-row .suggest-icon:before{display:none}.monaco-editor .suggest-widget .monaco-list .monaco-list-row .icon.customcolor .colorspan{margin:0 0 0 .3em;border:.1em solid #000;width:.7em;height:.7em;display:inline-block}.monaco-editor .suggest-details-container{z-index:41}.monaco-editor .suggest-details{display:flex;flex-direction:column;cursor:default;color:var(--vscode-editorSuggestWidget-foreground)}.monaco-editor .suggest-details.focused{border-color:var(--vscode-focusBorder)}.monaco-editor .suggest-details a{color:var(--vscode-textLink-foreground)}.monaco-editor .suggest-details a:hover{color:var(--vscode-textLink-activeForeground)}.monaco-editor .suggest-details code{background-color:var(--vscode-textCodeBlock-background)}.monaco-editor .suggest-details.no-docs{display:none}.monaco-editor .suggest-details>.monaco-scrollable-element{flex:1}.monaco-editor .suggest-details>.monaco-scrollable-element>.body{box-sizing:border-box;height:100%;width:100%}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.type{flex:2;overflow:hidden;text-overflow:ellipsis;opacity:.7;white-space:pre;margin:0 24px 0 0;padding:4px 0 12px 5px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.header>.type.auto-wrap{white-space:normal;word-break:break-all}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs{margin:0;padding:4px 5px;white-space:pre-wrap}.monaco-editor .suggest-details.no-type>.monaco-scrollable-element>.body>.docs{margin-right:24px;overflow:hidden}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs{padding:0;white-space:initial;min-height:calc(1rem + 8px)}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div,.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>span:not(:empty){padding:4px 5px}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div>p:first-child{margin-top:0}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs>div>p:last-child{margin-bottom:0}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs .monaco-tokenized-source{white-space:pre}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs .code{white-space:pre-wrap;word-wrap:break-word}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>.docs.markdown-docs .codicon{vertical-align:sub}.monaco-editor .suggest-details>.monaco-scrollable-element>.body>p:empty{display:none}.monaco-editor .suggest-details code{border-radius:3px;padding:0 .4em}.monaco-editor .suggest-details ul,.monaco-editor .suggest-details ol{padding-left:20px}.monaco-editor .suggest-details p code{font-family:var(--monaco-monospace-font)}.monaco-editor .suggest-preview-additional-widget{white-space:nowrap}.monaco-editor .suggest-preview-additional-widget .content-spacer{color:transparent;white-space:pre}.monaco-editor .suggest-preview-additional-widget .button{display:inline-block;cursor:pointer;text-decoration:underline;text-underline-position:under}.monaco-editor .ghost-text-hidden{opacity:0;font-size:0}.monaco-editor .ghost-text-decoration,.monaco-editor .suggest-preview-text{font-style:italic}.monaco-editor .inline-completion-text-to-replace,.monaco-editor .detected-link,.monaco-editor .detected-link-active{text-decoration:underline;text-underline-position:under}.monaco-editor .detected-link-active{cursor:pointer}.monaco-editor .parameter-hints-widget{z-index:39;display:flex;flex-direction:column;line-height:1.5em;cursor:default}.monaco-editor .parameter-hints-widget>.phwrapper{max-width:440px;display:flex;flex-direction:row}.monaco-editor .parameter-hints-widget.multiple{min-height:3.3em;padding:0}.monaco-editor .parameter-hints-widget.visible{transition:left .05s ease-in-out}.monaco-editor .parameter-hints-widget p,.monaco-editor .parameter-hints-widget ul{margin:8px 0}.monaco-editor .parameter-hints-widget .monaco-scrollable-element,.monaco-editor .parameter-hints-widget .body{display:flex;flex:1;flex-direction:column;min-height:100%}.monaco-editor .parameter-hints-widget .signature{padding:4px 5px}.monaco-editor .parameter-hints-widget .docs{padding:0 10px 0 5px;white-space:pre-wrap}.monaco-editor .parameter-hints-widget .docs.empty{display:none}.monaco-editor .parameter-hints-widget .docs .markdown-docs{white-space:initial}.monaco-editor .parameter-hints-widget .docs .markdown-docs a:hover{cursor:pointer}.monaco-editor .parameter-hints-widget .docs .markdown-docs code{font-family:var(--monaco-monospace-font)}.monaco-editor .parameter-hints-widget .docs .monaco-tokenized-source,.monaco-editor .parameter-hints-widget .docs .code{white-space:pre-wrap}.monaco-editor .parameter-hints-widget .docs code{border-radius:3px;padding:0 .4em}.monaco-editor .parameter-hints-widget .controls{display:none;flex-direction:column;align-items:center;min-width:22px;justify-content:flex-end}.monaco-editor .parameter-hints-widget.multiple .controls{display:flex;padding:0 2px}.monaco-editor .parameter-hints-widget.multiple .button{width:16px;height:16px;background-repeat:no-repeat;cursor:pointer}.monaco-editor .parameter-hints-widget .button.previous{bottom:24px}.monaco-editor .parameter-hints-widget .overloads{text-align:center;height:12px;line-height:12px;font-family:var(--monaco-monospace-font)}.monaco-editor .parameter-hints-widget .signature .parameter.active{font-weight:700}.monaco-editor .parameter-hints-widget .documentation-parameter>.parameter{font-weight:700;margin-right:.5em}.monaco-editor .rename-box{z-index:100;color:inherit}.monaco-editor .rename-box.preview{padding:3px 3px 0}.monaco-editor .rename-box .rename-input{padding:3px;width:calc(100% - 6px)}.monaco-editor .rename-box .rename-label{display:none;opacity:.8}.monaco-editor .rename-box.preview .rename-label{display:inherit}.monaco-editor .unicode-highlight{border:1px solid var(--vscode-editorUnicodeHighlight-border);background-color:var(--vscode-editorUnicodeHighlight-background);box-sizing:border-box}.editor-banner{box-sizing:border-box;cursor:default;width:100%;font-size:12px;display:flex;overflow:visible;height:26px;background:var(--vscode-banner-background)}.editor-banner .icon-container{display:flex;flex-shrink:0;align-items:center;padding:0 6px 0 10px}.editor-banner .icon-container.custom-icon{background-repeat:no-repeat;background-position:center center;background-size:16px;width:16px;padding:0;margin:0 6px 0 10px}.editor-banner .message-container{display:flex;align-items:center;line-height:26px;text-overflow:ellipsis;white-space:nowrap;overflow:hidden}.editor-banner .message-container p{margin-block-start:0;margin-block-end:0}.editor-banner .message-actions-container{flex-grow:1;flex-shrink:0;line-height:26px;margin:0 4px}.editor-banner .message-actions-container a.monaco-button{width:inherit;margin:2px 8px;padding:0 12px}.editor-banner .message-actions-container a{padding:3px;margin-left:12px;text-decoration:underline}.editor-banner .action-container{padding:0 10px 0 6px}.editor-banner{background-color:var(--vscode-banner-background)}.editor-banner,.editor-banner .action-container .codicon,.editor-banner .message-actions-container .monaco-link{color:var(--vscode-banner-foreground)}.editor-banner .icon-container .codicon{color:var(--vscode-banner-iconForeground)}.monaco-editor{font-family:-apple-system,BlinkMacSystemFont,Segoe WPC,Segoe UI,HelveticaNeue-Light,system-ui,Ubuntu,Droid Sans,sans-serif;--monaco-monospace-font: \"SF Mono\", Monaco, Menlo, Consolas, \"Ubuntu Mono\", \"Liberation Mono\", \"DejaVu Sans Mono\", \"Courier New\", monospace}.monaco-menu .monaco-action-bar.vertical .action-item .action-menu-item:focus .action-label{stroke-width:1.2px}.monaco-editor.vs-dark .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-editor.hc-black .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-editor.hc-light .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label{stroke-width:1.2px}.monaco-hover p{margin:0}.monaco-aria-container{position:absolute!important;top:0;height:1px;width:1px;margin:-1px;overflow:hidden;padding:0;clip:rect(1px,1px,1px,1px);clip-path:inset(50%)}.monaco-editor.hc-black,.monaco-editor.hc-light{-ms-high-contrast-adjust:none}@media screen and (-ms-high-contrast:active){.monaco-editor.vs .view-overlays .current-line,.monaco-editor.vs-dark .view-overlays .current-line{border-color:windowtext!important;border-left:0;border-right:0}.monaco-editor.vs .cursor,.monaco-editor.vs-dark .cursor{background-color:windowtext!important}.monaco-editor.vs .dnd-target,.monaco-editor.vs-dark .dnd-target{border-color:windowtext!important}.monaco-editor.vs .selected-text,.monaco-editor.vs-dark .selected-text{background-color:highlight!important}.monaco-editor.vs .view-line,.monaco-editor.vs-dark .view-line{-ms-high-contrast-adjust:none}.monaco-editor.vs .view-line span,.monaco-editor.vs-dark .view-line span{color:windowtext!important}.monaco-editor.vs .view-line span.inline-selected-text,.monaco-editor.vs-dark .view-line span.inline-selected-text{color:highlighttext!important}.monaco-editor.vs .view-overlays,.monaco-editor.vs-dark .view-overlays{-ms-high-contrast-adjust:none}.monaco-editor.vs .selectionHighlight,.monaco-editor.vs-dark .selectionHighlight,.monaco-editor.vs .wordHighlight,.monaco-editor.vs-dark .wordHighlight,.monaco-editor.vs .wordHighlightStrong,.monaco-editor.vs-dark .wordHighlightStrong,.monaco-editor.vs .reference-decoration,.monaco-editor.vs-dark .reference-decoration{border:2px dotted highlight!important;background:transparent!important;box-sizing:border-box}.monaco-editor.vs .rangeHighlight,.monaco-editor.vs-dark .rangeHighlight{background:transparent!important;border:1px dotted activeborder!important;box-sizing:border-box}.monaco-editor.vs .bracket-match,.monaco-editor.vs-dark .bracket-match{border-color:windowtext!important;background:transparent!important}.monaco-editor.vs .findMatch,.monaco-editor.vs-dark .findMatch,.monaco-editor.vs .currentFindMatch,.monaco-editor.vs-dark .currentFindMatch{border:2px dotted activeborder!important;background:transparent!important;box-sizing:border-box}.monaco-editor.vs .find-widget,.monaco-editor.vs-dark .find-widget{border:1px solid windowtext}.monaco-editor.vs .monaco-list .monaco-list-row,.monaco-editor.vs-dark .monaco-list .monaco-list-row{-ms-high-contrast-adjust:none;color:windowtext!important}.monaco-editor.vs .monaco-list .monaco-list-row.focused,.monaco-editor.vs-dark .monaco-list .monaco-list-row.focused{color:highlighttext!important;background-color:highlight!important}.monaco-editor.vs .monaco-list .monaco-list-row:hover,.monaco-editor.vs-dark .monaco-list .monaco-list-row:hover{background:transparent!important;border:1px solid highlight;box-sizing:border-box}.monaco-editor.vs .monaco-scrollable-element>.scrollbar,.monaco-editor.vs-dark .monaco-scrollable-element>.scrollbar{-ms-high-contrast-adjust:none;background:background!important;border:1px solid windowtext;box-sizing:border-box}.monaco-editor.vs .monaco-scrollable-element>.scrollbar>.slider,.monaco-editor.vs-dark .monaco-scrollable-element>.scrollbar>.slider{background:windowtext!important}.monaco-editor.vs .monaco-scrollable-element>.scrollbar>.slider:hover,.monaco-editor.vs-dark .monaco-scrollable-element>.scrollbar>.slider:hover{background:highlight!important}.monaco-editor.vs .monaco-scrollable-element>.scrollbar>.slider.active,.monaco-editor.vs-dark .monaco-scrollable-element>.scrollbar>.slider.active{background:highlight!important}.monaco-editor.vs .decorationsOverviewRuler,.monaco-editor.vs-dark .decorationsOverviewRuler{opacity:0}.monaco-editor.vs .minimap,.monaco-editor.vs-dark .minimap{display:none}.monaco-editor.vs .squiggly-d-error,.monaco-editor.vs-dark .squiggly-d-error{background:transparent!important;border-bottom:4px double #E47777}.monaco-editor.vs .squiggly-c-warning,.monaco-editor.vs-dark .squiggly-c-warning,.monaco-editor.vs .squiggly-b-info,.monaco-editor.vs-dark .squiggly-b-info{border-bottom:4px double #71B771}.monaco-editor.vs .squiggly-a-hint,.monaco-editor.vs-dark .squiggly-a-hint{border-bottom:4px double #6c6c6c}.monaco-editor.vs .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label,.monaco-editor.vs-dark .monaco-menu .monaco-action-bar.vertical .action-menu-item:focus .action-label{-ms-high-contrast-adjust:none;color:highlighttext!important;background-color:highlight!important}.monaco-editor.vs .monaco-menu .monaco-action-bar.vertical .action-menu-item:hover .action-label,.monaco-editor.vs-dark .monaco-menu .monaco-action-bar.vertical .action-menu-item:hover .action-label{-ms-high-contrast-adjust:none;background:transparent!important;border:1px solid highlight;box-sizing:border-box}.monaco-diff-editor.vs .diffOverviewRuler,.monaco-diff-editor.vs-dark .diffOverviewRuler{display:none}.monaco-editor.vs .line-insert,.monaco-editor.vs-dark .line-insert,.monaco-editor.vs .line-delete,.monaco-editor.vs-dark .line-delete{background:transparent!important;border:1px solid highlight!important;box-sizing:border-box}.monaco-editor.vs .char-insert,.monaco-editor.vs-dark .char-insert,.monaco-editor.vs .char-delete,.monaco-editor.vs-dark .char-delete{background:transparent!important}}.context-view{position:absolute}.context-view.fixed{all:initial;font-family:inherit;font-size:13px;position:fixed;color:inherit}.quick-input-widget{font-size:13px}.quick-input-widget .monaco-highlighted-label .highlight,.quick-input-widget .monaco-highlighted-label .highlight{color:#0066bf}.vs .quick-input-widget .monaco-list-row.focused .monaco-highlighted-label .highlight,.vs .quick-input-widget .monaco-list-row.focused .monaco-highlighted-label .highlight{color:#9dddff}.vs-dark .quick-input-widget .monaco-highlighted-label .highlight,.vs-dark .quick-input-widget .monaco-highlighted-label .highlight{color:#0097fb}.hc-black .quick-input-widget .monaco-highlighted-label .highlight,.hc-black .quick-input-widget .monaco-highlighted-label .highlight{color:#f38518}.hc-light .quick-input-widget .monaco-highlighted-label .highlight,.hc-light .quick-input-widget .monaco-highlighted-label .highlight{color:#0f4a85}.monaco-keybinding>.monaco-keybinding-key{background-color:#ddd6;border:solid 1px rgba(204,204,204,.4);border-bottom-color:#bbb6;box-shadow:inset 0 -1px #bbb6;color:#555}.hc-black .monaco-keybinding>.monaco-keybinding-key{background-color:transparent;border:solid 1px rgb(111,195,223);box-shadow:none;color:#fff}.hc-light .monaco-keybinding>.monaco-keybinding-key{background-color:transparent;border:solid 1px #0F4A85;box-shadow:none;color:#292929}.vs-dark .monaco-keybinding>.monaco-keybinding-key{background-color:#8080802b;border:solid 1px rgba(51,51,51,.6);border-bottom-color:#4449;box-shadow:inset 0 -1px #4449;color:#ccc}.monaco-text-button{box-sizing:border-box;display:flex;width:100%;padding:4px;text-align:center;cursor:pointer;justify-content:center;align-items:center}.monaco-text-button:focus{outline-offset:2px!important}.monaco-text-button:hover{text-decoration:none!important}.monaco-button.disabled:focus,.monaco-button.disabled{opacity:.4!important;cursor:default}.monaco-text-button>.codicon{margin:0 .2em;color:inherit!important}.monaco-button-dropdown{display:flex;cursor:pointer}.monaco-button-dropdown.disabled{cursor:default}.monaco-button-dropdown>.monaco-button:focus{outline-offset:-1px!important}.monaco-button-dropdown.disabled>.monaco-button.disabled,.monaco-button-dropdown.disabled>.monaco-button.disabled:focus,.monaco-button-dropdown.disabled>.monaco-button-dropdown-separator{opacity:.4!important}.monaco-button-dropdown>.monaco-button.monaco-text-button{border-right-width:0!important}.monaco-button-dropdown .monaco-button-dropdown-separator{padding:4px 0;cursor:default}.monaco-button-dropdown .monaco-button-dropdown-separator>div{height:100%;width:1px}.monaco-button-dropdown>.monaco-button.monaco-dropdown-button{border-left-width:0!important}.monaco-description-button{flex-direction:column}.monaco-description-button .monaco-button-label{font-weight:500}.monaco-description-button .monaco-button-description{font-style:italic}.monaco-description-button .monaco-button-label,.monaco-description-button .monaco-button-description{display:flex;justify-content:center;align-items:center}.monaco-description-button .monaco-button-label>.codicon,.monaco-description-button .monaco-button-description>.codicon{margin:0 .2em;color:inherit!important}.monaco-progress-container{width:100%;height:5px;overflow:hidden}.monaco-progress-container .progress-bit{width:2%;height:5px;position:absolute;left:0;display:none}.monaco-progress-container.active .progress-bit{display:inherit}.monaco-progress-container.discrete .progress-bit{left:0;transition:width .1s linear}.monaco-progress-container.discrete.done .progress-bit{width:100%}.monaco-progress-container.infinite .progress-bit{animation-name:progress;animation-duration:4s;animation-iteration-count:infinite;transform:translateZ(0);animation-timing-function:linear}.monaco-progress-container.infinite.infinite-long-running .progress-bit{animation-timing-function:steps(100)}@keyframes progress{0%{transform:translate(0) scaleX(1)}50%{transform:translate(2500%) scaleX(3)}to{transform:translate(4900%) scaleX(1)}}.quick-input-widget{position:absolute;width:600px;z-index:2550;left:50%;margin-left:-300px;-webkit-app-region:no-drag}.quick-input-titlebar{display:flex;align-items:center}.quick-input-left-action-bar{display:flex;margin-left:4px;flex:1}.quick-input-title{padding:3px 0;text-align:center;text-overflow:ellipsis;overflow:hidden}.quick-input-right-action-bar{display:flex;margin-right:4px;flex:1}.quick-input-right-action-bar>.actions-container{justify-content:flex-end}.quick-input-titlebar .monaco-action-bar .action-label.codicon{background-position:center;background-repeat:no-repeat;padding:2px}.quick-input-description{margin:6px}.quick-input-header .quick-input-description{margin:4px 2px}.quick-input-header{display:flex;padding:6px 6px 0;margin-bottom:-2px}.quick-input-widget.hidden-input .quick-input-header{padding:0;margin-bottom:0}.quick-input-and-message{display:flex;flex-direction:column;flex-grow:1;min-width:0;position:relative}.quick-input-check-all{align-self:center;margin:0}.quick-input-filter{flex-grow:1;display:flex;position:relative}.quick-input-box{flex-grow:1}.quick-input-widget.show-checkboxes .quick-input-box,.quick-input-widget.show-checkboxes .quick-input-message{margin-left:5px}.quick-input-visible-count{position:absolute;left:-10000px}.quick-input-count{align-self:center;position:absolute;right:4px;display:flex;align-items:center}.quick-input-count .monaco-count-badge{vertical-align:middle;padding:2px 4px;border-radius:2px;min-height:auto;line-height:normal}.quick-input-action{margin-left:6px}.quick-input-action .monaco-text-button{font-size:11px;padding:0 6px;display:flex;height:27.5px;align-items:center}.quick-input-message{margin-top:-1px;padding:5px;overflow-wrap:break-word}.quick-input-message>.codicon{margin:0 .2em;vertical-align:text-bottom}.quick-input-progress.monaco-progress-container{position:relative}.quick-input-progress.monaco-progress-container,.quick-input-progress.monaco-progress-container .progress-bit{height:2px}.quick-input-list{line-height:22px;margin-top:6px;padding:0 1px 1px}.quick-input-widget.hidden-input .quick-input-list{margin-top:0}.quick-input-list .monaco-list{overflow:hidden;max-height:440px}.quick-input-list .quick-input-list-entry{box-sizing:border-box;overflow:hidden;display:flex;height:100%;padding:0 6px}.quick-input-list .quick-input-list-entry.quick-input-list-separator-border{border-top-width:1px;border-top-style:solid}.quick-input-list .monaco-list-row[data-index=\"0\"] .quick-input-list-entry.quick-input-list-separator-border{border-top-style:none}.quick-input-list .quick-input-list-label{overflow:hidden;display:flex;height:100%;flex:1}.quick-input-list .quick-input-list-checkbox{align-self:center;margin:0}.quick-input-list .quick-input-list-rows{overflow:hidden;text-overflow:ellipsis;display:flex;flex-direction:column;height:100%;flex:1;margin-left:5px}.quick-input-widget.show-checkboxes .quick-input-list .quick-input-list-rows{margin-left:10px}.quick-input-widget .quick-input-list .quick-input-list-checkbox{display:none}.quick-input-widget.show-checkboxes .quick-input-list .quick-input-list-checkbox{display:inline}.quick-input-list .quick-input-list-rows>.quick-input-list-row{display:flex;align-items:center}.quick-input-list .quick-input-list-rows>.quick-input-list-row .monaco-icon-label,.quick-input-list .quick-input-list-rows>.quick-input-list-row .monaco-icon-label .monaco-icon-label-container>.monaco-icon-name-container{flex:1}.quick-input-list .quick-input-list-rows>.quick-input-list-row .codicon[class*=codicon-]{vertical-align:text-bottom}.quick-input-list .quick-input-list-rows .monaco-highlighted-label span{opacity:1}.quick-input-list .quick-input-list-entry .quick-input-list-entry-keybinding{margin-right:8px}.quick-input-list .quick-input-list-label-meta{opacity:.7;line-height:normal;text-overflow:ellipsis;overflow:hidden}.quick-input-list .monaco-highlighted-label .highlight{font-weight:700}.quick-input-list .quick-input-list-entry .quick-input-list-separator{margin-right:8px}.quick-input-list .quick-input-list-entry-action-bar{display:flex;flex:0;overflow:visible}.quick-input-list .quick-input-list-entry-action-bar .action-label{display:none}.quick-input-list .quick-input-list-entry-action-bar .action-label.codicon{margin-right:4px;padding:0 2px 2px}.quick-input-list .quick-input-list-entry-action-bar{margin-top:1px}.quick-input-list .quick-input-list-entry-action-bar{margin-right:4px}.quick-input-list .quick-input-list-entry .quick-input-list-entry-action-bar .action-label.always-visible,.quick-input-list .quick-input-list-entry:hover .quick-input-list-entry-action-bar .action-label,.quick-input-list .monaco-list-row.focused .quick-input-list-entry-action-bar .action-label{display:flex}.quick-input-list .monaco-list-row.focused .monaco-keybinding-key,.quick-input-list .monaco-list-row.focused .quick-input-list-entry .quick-input-list-separator{color:inherit}.quick-input-list .monaco-list-row.focused .monaco-keybinding-key{background:none}.monaco-keybinding{display:flex;align-items:center;line-height:10px}.monaco-keybinding>.monaco-keybinding-key{display:inline-block;border-style:solid;border-width:1px;border-radius:3px;vertical-align:middle;font-size:11px;padding:3px 5px;margin:0 2px}.monaco-keybinding>.monaco-keybinding-key:first-child{margin-left:0}.monaco-keybinding>.monaco-keybinding-key:last-child{margin-right:0}.monaco-keybinding>.monaco-keybinding-key-separator{display:inline-block}.monaco-keybinding>.monaco-keybinding-key-chord-separator{width:6px}#editor[data-v-1fc80c91]{width:100%;height:100%;position:relative}#editor .loading[data-v-1fc80c91]{position:absolute;inset:0;background-color:#08080861;z-index:1;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;cursor:pointer}#editor .loading[data-v-1fc80c91] svg{width:24px;height:24px}#editor .loading[data-v-1fc80c91] svg path{fill:#999}#editor .monaco[data-v-1fc80c91]{width:100%;height:100%}#editor .monaco[data-v-1fc80c91] .editor-banner{color:#d93737}.image[data-v-0610fda2]{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.image img[data-v-0610fda2]{max-width:80%;max-height:80%;cursor:pointer}.video[data-v-72349455]{width:100%;height:100%;display:flex;align-items:center;justify-content:center}.video video[data-v-72349455]{width:100%;height:100%;cursor:pointer;background-color:#252526}iframe[data-v-2d9ab994]{width:100%;height:100%;display:flex;align-items:center;justify-content:center;border:none;background:none;background-color:#252526}main .main-header[data-v-24207f97]{width:100%;height:35px;background-color:#252526;position:sticky;top:0;z-index:9;display:flex;flex-wrap:wrap;align-items:center}main .main-header button.menu[data-v-24207f97]{width:28px;height:28px;background:none;margin:0}main .main-header button.menu svg.icon[data-v-24207f97]{width:100%;height:100%}main .main-header button.menu svg.icon path[data-v-24207f97]{fill:#696969}main .main-header button.menu:hover svg.icon path[data-v-24207f97]{fill:#eee}main .main-header ul.tabs[data-v-24207f97]{flex:0 0 100%;max-width:calc(100% - 28px);width:100%;height:100%;display:flex;flex-wrap:nowrap;align-items:center;overflow-y:hidden;overflow-x:auto}main .main-header ul.tabs li.tab-item[data-v-24207f97]{flex:0 0 100%;max-width:161px;height:100%;border-right:1px solid #252526;background-color:#2d2d2d;color:#ffffff80;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;font-size:13px;font-weight:400;cursor:pointer;position:relative}main .main-header ul.tabs li.tab-item span[data-v-24207f97]{display:inline-block;max-width:130px;flex:0 0 100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-left:1rem}main .main-header ul.tabs li.tab-item button.close[data-v-24207f97]{display:inline-block;width:30px;height:100%;background:none;margin:0;padding:0;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}main .main-header ul.tabs li.tab-item button.close[data-v-24207f97]:hover{background-color:#5a5d5e4f}main .main-header ul.tabs li.tab-item button.close[data-v-24207f97] svg{width:12px;height:12px}main .main-header ul.tabs li.tab-item button.close[data-v-24207f97] svg path{fill:#ffffff80}main .main-header ul.tabs li.tab-item.on[data-v-24207f97]{border-right:1px solid rgb(37,37,38);background-color:#1e1e1e;color:#fff}main .main-body[data-v-24207f97]{width:100%;height:calc(100% - 35px);overflow:auto;z-index:10;background-color:#1e1e1e}main[data-v-24207f97] .el-tabs{width:100%;height:100%}main[data-v-24207f97] .el-tabs .el-tabs__header{width:100%;height:35px;background-color:#252526;position:sticky;top:0;z-index:9;display:flex;flex-wrap:wrap;align-items:center;border:none;margin:0}main[data-v-24207f97] .el-tabs .el-tabs__header .el-tabs__nav{border:none!important}main[data-v-24207f97] .el-tabs .el-tabs__header .el-tabs__item{border-right:1px solid #252526;background-color:#2d2d2d;color:#ffffff80;font-size:14px;font-weight:500;cursor:pointer;padding:0 1rem;display:flex;align-items:center}main[data-v-24207f97] .el-tabs .el-tabs__header .el-tabs__item.is-active{border-right:1px solid rgb(37,37,38);background-color:#1e1e1e;color:#fff}main[data-v-24207f97] .el-tabs .el-tabs__content{width:100%;height:calc(100% - 35px);overflow:auto;z-index:10;background-color:#1e1e1e}main[data-v-24207f97] .el-tabs .el-tabs__content .main-tab-pane{width:100%;height:100%;position:relative}#page[data-v-7c3f998c]{width:100%;height:100%;position:relative;display:flex;flex-wrap:wrap;background-color:#1e1e1e}#page[data-v-7c3f998c] aside{width:100%;height:100%;background-color:#252526;transition:.3s;position:relative}#page[data-v-7c3f998c] main{width:100%;height:100%;position:relative}#page[data-v-7c3f998c] main.on{max-width:100%}\n"
  },
  {
    "path": "luci-app-linkease/luasrc/controller/linkease.lua",
    "content": "module(\"luci.controller.linkease\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/linkease\") then\n\t\treturn\n\tend\n\n\tentry({\"admin\", \"services\", \"linkease\"}, cbi(\"linkease\"), _(\"LinkEase\"), 20).dependent = true\n\n\tentry({\"admin\", \"services\", \"linkease_status\"}, call(\"linkease_status\"))\n\n\tentry({\"admin\", \"services\", \"linkease\", \"file\"}, call(\"linkease_file_template\")).leaf = true\n\nend\n\nfunction linkease_status()\n\tlocal sys  = require \"luci.sys\"\n\tlocal uci  = require \"luci.model.uci\".cursor()\n\tlocal port = tonumber(uci:get_first(\"linkease\", \"linkease\", \"port\"))\n\n\tlocal status = {\n\t\trunning = (sys.call(\"pidof linkease >/dev/null\") == 0),\n\t\tport = (port or 8897)\n\t}\n\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(status)\nend\n\nfunction get_params(name)\n    local data = {\n        prefix=luci.dispatcher.build_url(unpack({\"admin\", \"services\", \"linkease\", name})),\n    }\n    return data\nend\n\nfunction linkease_file_template()\n    luci.template.render(\"linkease/file\", get_params(\"file\"))\nend\n"
  },
  {
    "path": "luci-app-linkease/luasrc/controller/linkease_backend.lua",
    "content": "-- Copyright 2022 xiaobao <xiaobao@linkease.com>\n-- Licensed to the public under the MIT License\n\nlocal http = require \"luci.http\"\nlocal nixio = require \"nixio\"\nlocal ltn12 = require \"luci.ltn12\"\nlocal table = require \"table\"\nlocal util = require \"luci.util\"\n\nmodule(\"luci.controller.linkease_backend\", package.seeall)\n\nlocal BLOCKSIZE = 2048\nlocal LINKEASE_UNIX = \"/var/run/linkease.sock\"\n\nfunction index()\n    entry({\"linkease\"}, call(\"linkease_backend\")).leaf=true\nend\n\nlocal function sink_socket(sock, io_err) \n  if sock then \n    return function(chunk, err) \n      if not chunk then \n        return 1 \n      else \n        return sock:send(chunk)\n      end \n    end \n  else \n    return ltn12.sink.error(io_err or \"unable to send socket\") \n  end\nend\n\nlocal function session_retrieve(sid, allowed_users)\n  local sdat = util.ubus(\"session\", \"get\", { ubus_rpc_session = sid })\n  if type(sdat) == \"table\" and\n      type(sdat.values) == \"table\" and\n      type(sdat.values.token) == \"string\" and\n      (not allowed_users or\n      util.contains(allowed_users, sdat.values.username))\n  then\n      return sid, sdat.values\n  end\n  return nil, nil\nend\n\nlocal function get_session()\n  local sid\n  local key\n  local sdat\n  for _, key in ipairs({\"sysauth_https\", \"sysauth_http\", \"sysauth\"}) do\n    sid = http.getcookie(key)\n    if sid then\n      sid, sdat = session_retrieve(sid, nil)\n      if sid and sdat then\n        return sid, sdat\n      end\n    end\n  end\n  return nil, nil\nend\n\nlocal function chunksource(sock, buffer)\n\tbuffer = buffer or \"\"\n\treturn function()\n\t\tlocal output\n\t\tlocal _, endp, count = buffer:find(\"^([0-9a-fA-F]+);?.-\\r\\n\")\n\t\twhile not count and #buffer <= 1024 do\n\t\t\tlocal newblock, code = sock:recv(1024 - #buffer)\n\t\t\tif not newblock then\n\t\t\t\treturn nil, code\n\t\t\tend\n\t\t\tbuffer = buffer .. newblock  \n\t\t\t_, endp, count = buffer:find(\"^([0-9a-fA-F]+);?.-\\r\\n\")\n\t\tend\n\t\tcount = tonumber(count, 16)\n\t\tif not count then\n\t\t\treturn nil, -1, \"invalid encoding\"\n\t\telseif count == 0 then\n\t\t\treturn nil\n\t\telseif count + 2 <= #buffer - endp then\n\t\t\toutput = buffer:sub(endp+1, endp+count)\n\t\t\tbuffer = buffer:sub(endp+count+3)\n\t\t\treturn output\n\t\telse\n\t\t\toutput = buffer:sub(endp+1, endp+count)\n\t\t\tbuffer = \"\"\n\t\t\tif count - #output > 0 then\n\t\t\t\tlocal remain, code = sock:recvall(count-#output)\n\t\t\t\tif not remain then\n\t\t\t\t\treturn nil, code\n\t\t\t\tend\n\t\t\t\toutput = output .. remain\n\t\t\t\tcount, code = sock:recvall(2)\n\t\t\telse\n\t\t\t\tcount, code = sock:recvall(count+2-#buffer+endp)\n\t\t\tend\n\t\t\tif not count then\n\t\t\t\treturn nil, code\n\t\t\tend\n\t\t\treturn output\n\t\tend\n\tend\nend\n\nfunction linkease_backend() \n  local sock = nixio.socket(\"unix\", \"stream\")\n  if sock:connect(LINKEASE_UNIX) ~= true then\n    http.status(500, \"connect failed\")\n    return\n  end\n  local input = {}\n  input[#input+1] = http.getenv(\"REQUEST_METHOD\") .. \" \" .. http.getenv(\"REQUEST_URI\") .. \" HTTP/1.1\"\n  local req = http.context.request\n  local start = \"HTTP_\"\n  local start_len = string.len(start)\n  local ctype = http.getenv(\"CONTENT_TYPE\")\n  if ctype then\n    input[#input+1] = \"Content-Type: \" .. ctype \n  end\n  for k, v in pairs(req.message.env) do\n    if string.sub(k, 1, start_len) == start and not string.find(k, \"FORWARDED\") then \n      input[#input+1] = string.sub(k, start_len+1, string.len(k)) .. \": \" .. v\n    end\n  end\n  local sid, sdat = get_session()\n  if sdat ~= nil then\n    input[#input+1] = \"X-Forwarded-Sid: \" .. sid\n    input[#input+1] = \"X-Forwarded-Token: \" .. sdat.token\n  end\n  -- input[#input+1] = \"X-Forwarded-For: \" .. http.getenv(\"REMOTE_HOST\") ..\":\".. http.getenv(\"REMOTE_PORT\")\n  local num = tonumber(http.getenv(\"CONTENT_LENGTH\")) or 0\n  input[#input+1] = \"Content-Length: \" .. tostring(num)\n  input[#input+1] = \"\\r\\n\"\n  local source = ltn12.source.cat(ltn12.source.string(table.concat(input, \"\\r\\n\")), http.source())\n  local ret = ltn12.pump.all(source, sink_socket(sock, \"write sock error\")) \n  if ret ~= 1 then\n    sock:close()\n    http.status(500, \"proxy error\")\n    return\n  end\n\n  local linesrc = sock:linesource()\n  local line, code, error = linesrc()\n  if not line then\n    sock:close()\n    http.status(500, \"response parse failed\")\n    return\n  end\n\n  local protocol, status, msg = line:match(\"^([%w./]+) ([0-9]+) (.*)\")\n  if not protocol then\n    sock:close()\n    http.status(500, \"response protocol error\")\n    return\n  end\n  num = tonumber(status) or 0\n  http.status(num, msg)\n\n  local allow_ranges = http.getenv(\"SERVER_SOFTWARE\") ~= \"uhttpd\"\n\n  local chunked = 0\n  line = linesrc()\n  while line and line ~= \"\" do\n    local key, val = line:match(\"^([%w-]+)%s?:%s?(.*)\")\n    if key and key ~= \"Status\" then\n      if key == \"Transfer-Encoding\" and val == \"chunked\" then\n        chunked = 1\n      end\n      if key ~= \"Connection\" and key ~= \"Transfer-Encoding\" and ( allow_ranges or (key ~= \"Content-Length\" and key ~= \"Accept-Ranges\") ) then\n        http.header(key, val)\n      end\n    end\n    line = linesrc()\n  end\n  if not line then\n    sock:close()\n    http.status(500, \"parse header failed\")\n    return\n  end\n\n  local body_buffer = linesrc(true)\n  if chunked == 1 then\n    ltn12.pump.all(chunksource(sock, body_buffer), http.write)\n  else\n    local body_source = ltn12.source.cat(ltn12.source.string(body_buffer), sock:blocksource())\n    ltn12.pump.all(body_source, http.write)\n  end\n\n  sock:close()\nend\n\n"
  },
  {
    "path": "luci-app-linkease/luasrc/model/cbi/linkease.lua",
    "content": "--wulishui <wulishui@gmail.com> ,20200911\n--jjm2473 <jjm2473@gmail.com> ,20210127\n\nlocal m, s\n\nm = Map(\"linkease\", translate(\"LinkEase\"), translate(\"LinkEase is an efficient data transfer tool.\"))\n\nm:section(SimpleSection).template  = \"linkease_status\"\n\ns=m:section(TypedSection, \"linkease\", translate(\"Global settings\"))\ns.addremove=false\ns.anonymous=true\n\ns:option(Flag, \"enabled\", translate(\"Enable\")).rmempty=false\n\ns:option(Value, \"port\", translate(\"Port\")).rmempty=false\n\ns:option(Flag, \"allowPublic\", translate(\"AllowPublic\"), translate(\"Allowing access via public IP addresses can lead to insufficient security.\")).rmempty=false\n\nreturn m\n\n\n"
  },
  {
    "path": "luci-app-linkease/luasrc/view/admin_status/index/linkease.htm",
    "content": "<%+linkease_status%>\n"
  },
  {
    "path": "luci-app-linkease/luasrc/view/linkease/file.htm",
    "content": "<!DOCTYPE html>\n<html lang=\"en\">\n\n<head>\n  <meta charset=\"UTF-8\" />\n  <!-- <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\" /> -->\n  <meta name=\"viewport\" content=\"width=1380\" />\n  <title>易有云文件管理</title>\n  <script>\n    (function () {\n      var pathe_prefix = \"<%=prefix%>\"\n      window.path_base = pathe_prefix\n      window.ver       = \"<%# PKG_VERSION %>\"\n    })();\n  </script>\n  <script type=\"module\" crossorigin src=\"/luci-static/linkeasefile/index.js<%# ?v=PKG_VERSION %>\"></script>\n  <link rel=\"stylesheet\" href=\"/luci-static/linkeasefile/style.css<%# ?v=PKG_VERSION %>\">\n</head>\n\n<body>\n  <div id=\"app\"></div>\n  \n</body>\n\n</html>"
  },
  {
    "path": "luci-app-linkease/luasrc/view/linkease_status.htm",
    "content": "<script type=\"text/javascript\">//<![CDATA[\n\tXHR.poll(5, '<%=url(\"admin/services/linkease_status\")%>', null,\n\t\tfunction(x, st)\n\t\t{\n\t\t\tvar tb = document.getElementById('linkease_status');\n\t\t\tif (st && tb)\n\t\t\t{\n\t\t\t\tif (st.running)\n\t\t\t\t{\n\t\t\t\t\ttb.innerHTML = '<br/><em style=\\\"color:green\\\"><%:The LinkEase service is running.%></em>'\n\t\t\t\t\t\t+ \"<br/><br/><input class=\\\"btn cbi-button cbi-button-apply\\\" type=\\\"button\\\" value=\\\" <%:Click to open LinkEase%> \\\" onclick=\\\"window.open('http://\" + window.location.hostname + \":\" + st.port + \"/')\\\"/>\"\n            + \"<br/><input class=\\\"btn cbi-button cbi-button-apply\\\" type=\\\"button\\\" value=\\\" <%:Click to open Files%> \\\" onclick=\\\"window.open('/cgi-bin/luci/admin/services/linkease/file/')\\\"/>\";\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\ttb.innerHTML = '<br/><em style=\\\"color:red\\\"><%:The LinkEase service is not running.%></em>';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t);\n//]]></script>\n\n<fieldset class=\"cbi-section\">\n\t<legend><%:LinkEase Status%></legend>\n\t<p id=\"linkease_status\">\n\t\t<em><%:Collecting data...%></em>\n\t</p>\n</fieldset>\n"
  },
  {
    "path": "luci-app-linkease/po/zh_Hans/linkease.po",
    "content": "msgid \"LinkEase\"\nmsgstr \"易有云文件管理器\"\n\nmsgid \"Running state\"\nmsgstr \"运行状态\"\n\nmsgid \"Click to open LinkEase\"\nmsgstr \"点击打开易有云\"\n\nmsgid \"Click to open Files\"\nmsgstr \"本地文件管理\"\n\nmsgid \"LinkEase is an efficient data transfer tool.\"\nmsgstr \"易有云是一个微型家庭数据服务中心，主要用于文件的集中存放、读取、备份及日常管理。释放用户终端设备空间，实现个人、家庭文件长久留存；支持家庭相册、视频文件随时随地多终端查看、播放，满足家庭文件的日常管理。\"\n\nmsgid \"Port\"\nmsgstr \"端口\"\n\nmsgid \"The LinkEase service is running.\"\nmsgstr \"易有云服务已启动\"\n\nmsgid \"The LinkEase service is not running.\"\nmsgstr \"易有云服务未启动\"\n\nmsgid \"LinkEase Status\"\nmsgstr \"易有云服务状态\"\n\nmsgid \"Collecting data...\"\nmsgstr \"收集数据...\"\n\nmsgid \"Allowing access via public IP addresses can lead to insufficient security.\"\nmsgstr \"允许公网IP访问，会导致不够安全。\"\n\nmsgid \"AllowPublic\"\nmsgstr \"公网访问\"\n\n"
  },
  {
    "path": "luci-app-linkease/root/etc/uci-defaults/50_luci-linkease",
    "content": "#!/bin/sh\n\nrm -f /tmp/luci-indexcache /tmp/luci-indexcache.*\nexit 0\n"
  },
  {
    "path": "luci-app-lucky/luci-app-lucky/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021-2026  sirpdboy  <herboy2008@gmail.com> https://github.com/sirpdboy/luci-app-lucky\n# \n# This is free software, licensed under the Apache License, Version 2.0 .\n#\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-lucky\nPKG_VERSION:=3.0.3\nPKG_RELEASE:=15\n\nLUCI_TITLE:=LuCI Support for Dynamic lucky Client\nLUCI_DEPENDS:=+lucky\nLUCI_PKGARCH:=all\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-lucky/luci-app-lucky/htdocs/luci-static/resources/view/lucky/config.js",
    "content": "//   Copyright (C) 2021-2026 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-lucky \n\n'use strict';\n'require form';\n'require poll';\n'require rpc';\n'require uci';\n'require ui';\n'require view';\n'require fs';\n\nasync function checkProcess() {\n    try {\n        const pidofRes = await fs.exec('/bin/pidof', ['lucky']);\n        if (pidofRes.code === 0) {\n            return {\n                running: true,\n                pid: pidofRes.stdout.trim()\n            };\n        }\n    } catch (err) {\n    }\n    try {\n        const psRes = await fs.exec('/bin/ps', ['-C', 'lucky', '-o', 'pid=']);\n        const pid = psRes.stdout.trim();\n        return {\n            running: pid !== '',\n            pid: pid || null\n        };\n    } catch (err) {\n        return { running: false, pid: null };\n    }\n}\n\nconst getLuckyConfig = rpc.declare({\n    object: 'luci.lucky',\n    method: 'get_Info',\n    expect: { 'Info': {} }\n});\n\nfunction getServiceStatus() {\n    return L.resolveDefault(checkProcess(), {}).then(function(res) {\n        let isRunning = false;\n        try {\n            if (res && res.running) {\n                isRunning = true;\n            }\n        } catch (e) { \n            console.error('Service status error:', e);\n        }\n        return isRunning;\n    }).catch(function(error) {\n        console.error('Service status check failed:', error);\n        return false;\n    });\n}\n\nfunction loadLuckyVer() {\n    return L.resolveDefault(getLuckyConfig(), {}).then(function(result) {\n        // console.debug('loadLuckyVer');\n        return result.Version || 'Unknown';\n    });\n}\n\nfunction renderStatus(isRunning, webport, safe_url, protocol, version) {\n    let statusText = isRunning ? _('RUNNING') : _('NOT RUNNING');\n    let color = isRunning ? 'green' : 'red';\n    let icon = isRunning ? '✓' : '✗';\n    let html = String.format(\n        '<em><span style=\"color:%s\">%s <strong>%s %s - %s</strong></span></em>',\n        color, icon, _('Lucky'), version, statusText\n    );\n\n    if (isRunning) {\n        let buttonUrl = String.format('%s//%s:%s/', protocol, window.location.hostname, webport);\n        \n        if (safe_url && safe_url.trim() !== '') {\n            buttonUrl = String.format('%s%s/', buttonUrl, safe_url);\n        }\n        \n        html += String.format(\n            '<input class=\"cbi-button cbi-button-reload\" type=\"button\" style=\"margin-left: 20px\" value=\"%s\" onclick=\"window.open(\\'%s\\')\">',\n            _('Open Web Interface'), \n            buttonUrl\n        );\n    }\n    \n    return html;\n}\n\nreturn view.extend({\n    load: function() {\n        return Promise.all([\n            uci.load('lucky')\n        ]);\n    },\n\n    handleResetUser: async function () {\n    try {\n        // 检查文件权限\n        const stat = await fs.stat('/usr/bin/lucky');\n        const result = await fs.exec('/usr/bin/lucky', ['-rResetUser', '-cd', '/etc/lucky']);\n        if (result.code === 0) {\n            alert(_('SUCCESS:') + '\\n' + _('Username and password reset successfully to 666'));\n        } \n    } catch (error) { }\n    },\n    render: function(data) {\n        let m, s, o;\n        let webport = uci.get('lucky', 'lucky', 'port') || '16601';\n        let safeurl = uci.get('lucky', 'lucky', 'safe') || '';\n        let uci_ssl = uci.get('lucky', 'lucky', 'ssl') || '0';\n        let protocol = uci_ssl === '1' ? 'https:' : 'http:';\n        \n        m = new form.Map('lucky', _('Lucky'),\n            _('ipv4/ipv6 portforward,ddns,reverseproxy proxy,wake on lan,IOT and more,Default username and password 666'));\n\n        // 状态显示部分\n        s = m.section(form.TypedSection);\n        s.anonymous = true;\n        s.addremove = false;\n\n        s.render = function() {\n            poll.add(function() {\n                return Promise.all([\n                    L.resolveDefault(getServiceStatus()),\n                    L.resolveDefault(loadLuckyVer())\n                ]).then(function(results) {\n                    const [isRunning, version] = results;\n                    var view = document.getElementById('service_status');\n                    if (view) {\n                        view.innerHTML = renderStatus(isRunning, webport, safeurl, protocol, version);\n                    }\n                }).catch(function(error) {\n                    console.error('Poll error:', error);\n                });\n            }, 5); // 添加轮询间隔5秒\n            \n            return E('div', { class: 'cbi-section', id: 'status_bar' }, [\n                E('div', { id: 'service_status' }, \n                    E('p', {}, _('Collecting data...'))\n                ),\n\t\tE('div', { 'style': 'text-align: right; font-style: italic;' }, [\n                    E('span', {}, [\n                        _('© github '),\n                        E('a', { \n                            'href': 'https://github.com/sirpdboy', \n                            'target': '_blank',\n                            'style': 'text-decoration: none;'\n                        }, 'by sirpdboy')\n                    ])\n                ])\n            ]);\n        };\n\n        s = m.section(form.NamedSection, 'lucky', 'lucky');\n\n        o = s.option(form.Flag, 'enabled', _('Enable'));\n        o.default = o.disabled;\n        o.rmempty = false;\n\n        o = s.option(form.Value, 'port', _('Set the Lucky access port'));\n        o.default = '16601';\n        o.rmempty = false;\n        o.datatype = 'port';\n        o.validate = function(section_id, value) {\n            if (value < 1 || value > 65535) {\n                return _('Port must be between 1 and 65535');\n            }\n            return true;\n        };\n\n        o = s.option(form.Value, 'safe', _('Safe entrance'),_('Set an installation access path, eg:sirpdboy'));\n        o.default = '';\n        o.datatype = 'string';\n\n        o = s.option(form.Flag, 'ssl', _('Enable SSL'),_('Encrypt access using HTTPS'));\n        o.default = '0';\n        o.rmempty = false;\n        \n        o = s.option(form.Value, 'delay', _('Delayed Start (seconds)'));\n        o.default = '60';\n\t\n\to = s.option(form.Button, '_newpassword', _('ResetUser'),\n\t\t\t_('Reset account and password to initial values'));\n\to.inputtitle = _('ResetUser');\n\to.inputstyle = 'apply';\n\to.onclick = L.bind(this.handleResetUser, this, data);\n\n        return m.render();\n    }\n});"
  },
  {
    "path": "luci-app-lucky/luci-app-lucky/htdocs/luci-static/resources/view/lucky/lucky.js",
    "content": "// 版权   Copyright (C) 2021-2026 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-lucky  \n\n'use strict';\n'require view';\n'require fs';\n'require ui';\n'require uci';\n'require form';\n'require poll';\n\nreturn view.extend({\n    load: function() {\n        return uci.load('lucky');\n    },\n\n    checkRunning: function() {\n        return fs.exec('/bin/pidof', ['lucky']).then(function(pidRes) {\n            if (pidRes.code === 0) return { isRunning: true };\n            return fs.exec('/bin/ash', ['-c', 'ps | grep -q \"[l]ucky\"']).then(function(grepRes) {\n                return { isRunning: grepRes.code === 0 };\n            });\n        });\n    },\n\n    render: function() {\n        var self = this;\n        \n        return this.checkRunning().then(function(checkResult) {\n           var isRunning = checkResult.isRunning;\n           let webport = uci.get('lucky', 'lucky', 'port') || '16601';\n           let safe_url = uci.get('lucky', 'lucky', 'safe') || '';\n           let uci_ssl = uci.get('lucky', 'lucky', 'ssl') || '0';\n           let protocol = uci_ssl === '1' ? 'https:' : 'http:';\n\t   let buttonUrl = String.format('%s//%s:%s/', protocol, window.location.hostname, webport);\n           if (safe_url && safe_url.trim() !== '') {\n                      buttonUrl = String.format('%s%s/', buttonUrl, safe_url);\n           }\n            var container = E('div');\n            if (!isRunning ) { \n                var message = _('Lucky Service Not Running');\n            \n\n                container.appendChild(E('div', { \n                    style: 'text-align: center; padding: 2em;' \n                }, [\n                    E('img', {\n                        src: 'data:image/svg+xml;base64,PHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgd2lkdGg9IjEwMjQiIGhlaWdodD0iMTAyNCIgdmlld0JveD0iMCAwIDEwMjQgMTAyNCI+PHBhdGggZmlsbD0iI2RmMDAwMCIgZD0iTTk0Mi40MjEgMjM0LjYyNGw4MC44MTEtODAuODExLTE1My4wNDUtMTUzLjA0NS04MC44MTEgODAuODExYy03OS45NTctNTEuNjI3LTE3NS4xNDctODEuNTc5LTI3Ny4zNzYtODEuNTc5LTI4Mi43NTIgMC01MTIgMjI5LjI0OC01MTIgNTEyIDAgMTAyLjIyOSAyOS45NTIgMTk3LjQxOSA4MS41NzkgMjc3LjM3NmwtODAuODExIDgwLjgxMSAxNTMuMDQ1IDE1My4wNDUgODAuODExLTgwLjgxMWM3OS45NTcgNTEuNjI3IDE3NS4xNDcgODEuNTc5IDI3Ny4zNzYgODEuNTc5IDI4Mi43NTIgMCA1MTItMjI5LjI0OCA1MTItNTEyIDAtMTAyLjIyOS0yOS45NTItMTk3LjQxOS04MS41NzktMjc3LjM3NnpNMTk0Ljk0NCA1MTJjMC0xNzUuMTA0IDE0MS45NTItMzE3LjA1NiAzMTcuMDU2LTMxNy4wNTYgNDggMCA5My40ODMgMTAuNjY3IDEzNC4yMjkgMjkuNzgxbC00MjEuNTQ3IDQyMS41NDdjLTE5LjA3Mi00MC43ODktMjkuNzM5LTg2LjI3Mi0yOS43MzktMTM0LjI3MnpNNTEyIDgyOS4wNTZjLTQ4IDAtOTMuNDgzLTEwLjY2Ny0xMzQuMjI5LTI5Ljc4MWw0MjEuNTQ3LTQyMS41NDdjMTkuMDcyIDQwLjc4OSAyOS43ODEgODYuMjcyIDI5Ljc4MSAxMzQuMjI5LTAuMDQzIDE3NS4xNDctMTQxLjk5NSAzMTcuMDk5LTMxNy4wOTkgMzE3LjA5OXoiLz48L3N2Zz4=',\n                        style: 'width: 100px; height: 100px; margin-bottom: 1em;'\n                    }),\n                    E('h2', {}, message)\n                ]));\n            } else {\n                var iframe = E('iframe', {\n                    src: buttonUrl,\n                    style: 'width: 100%; min-height: 100vh; border: none;'\n                });\n                container.appendChild(iframe);\n            }\n\n            poll.add(function() {\n                return self.checkRunning().then(function(checkResult) {\n                    var newStatus = checkResult.isRunning;\n                    if (newStatus !== isRunning) {\n                        window.location.reload();\n                    }\n                });\n            }, 5);\n            \n            poll.start();\n            \n            return container;\n        });\n    },\n\n    handleSaveApply: null,\n    handleSave: null,\n    handleReset: null\n});\n"
  },
  {
    "path": "luci-app-lucky/luci-app-lucky/po/zh_Hans/lucky.po",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\nmsgid \"Lucky\"\nmsgstr \"Lucky大吉\"\n\nmsgid \"Lucky Control panel\"\nmsgstr \"Lucky操作台\"\n\nmsgid \"ipv4/ipv6 portforward,ddns,reverseproxy proxy,wake on lan,IOT and more,Default username and password 666\"\nmsgstr \"IPv4/IPv6端口转发,动态域名服务,http/https反向代理，默认用户名密码666..\"\n\nmsgid \"Enable SSL\"\nmsgstr \"开启SSL\"\n\nmsgid \"Collecting data...\"\nmsgstr \"收集数据...\"\n\nmsgid \"Set the Lucky access port\"\nmsgstr \"设置访问端口\"\n\nmsgid \"Base Setting\"\nmsgstr \"基本设置\"\n\nmsgid \"Safe entrance\"\nmsgstr \"安全入口\"\n\nmsgid \"Port must be between 1 and 65535\"\nmsgstr \"端口范围1-65535之间\"\n\nmsgid \"Open Web Interface\"\nmsgstr \"打开WEB界面\"\n\nmsgid \"RUNNING\"\nmsgstr \"运行中\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\nmsgid \"Delayed Start (seconds)\"\nmsgstr \"开机延时启动（秒）\"\n\nmsgid \"Username and password reset successfully to 666\"\nmsgstr \"重置用户名和密码为666\"\n\nmsgid \"SUCCESS:\"\nmsgstr \"执行完成：\"\n\nmsgid \"ResetUser\"\nmsgstr \"重置用户密码\"\n\nmsgid \"Reset account and password to initial values\"\nmsgstr \"重置帐号和密码为初始值\"\n\nmsgid \"Encrypt access using HTTPS\"\nmsgstr \"使用https加密访问\"\n\nmsgid \"Set an installation access path, eg:sirpdboy\"\nmsgstr \"设置一个安装访问路径，如:sirpdboy\"\n\nmsgid \"Lucky Service Not Running\"\nmsgstr \"Lucky服务未启用\"\n\n"
  },
  {
    "path": "luci-app-lucky/luci-app-lucky/root/etc/uci-defaults/luci-app-lucky",
    "content": "#!/bin/sh\n\n[ -f \"/etc/config/ucitrack\" ] && {\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@lucky[-1]\n\tadd ucitrack lucky\n\tset ucitrack.@lucky[-1].init=lucky\n\tcommit ucitrack\nEOF\n}\n\nrm -rf /tmp/luci-*\nexit 0"
  },
  {
    "path": "luci-app-lucky/luci-app-lucky/root/usr/share/luci/menu.d/luci-app-lucky.json",
    "content": "{\n    \"admin/services/lucky\": {\n\t\t\"title\": \"Lucky\",\n\t\t\"order\": 59,\n\t\t\"action\": {\n\t\t     \"type\": \"firstchild\"\n\t\t},\n\t\t\"depends\": {\n\t\t\t\"acl\": [ \"luci-app-lucky\" ],\n\t\t\t\"uci\": { \"lucky\": true }\n\t\t}\n    },\n    \"admin/services/lucky/lucky\": {\n             \"title\": \"Lucky Control panel\",\n             \"order\": 10,\n             \"action\": {\n               \"type\": \"view\",\n               \"path\": \"lucky/lucky\"\n             }\n    },\n    \"admin/services/lucky/config\": {\n             \"title\": \"Base Setting\",\n             \"order\": 20,\n             \"action\": {\n               \"type\": \"view\",\n               \"path\": \"lucky/config\"\n             }\n    }\n\n}\n"
  },
  {
    "path": "luci-app-lucky/luci-app-lucky/root/usr/share/rpcd/acl.d/luci-app-lucky.json",
    "content": "{\n    \"luci-app-lucky\": {\n\t\"description\": \"Grant UCI access for luci-app-lucky\",\n        \"read\": {\n            \"uci\": [ \"lucky\" ],\n            \"file\": {\n                \"/etc/init.d/lucky\": [ \"exec\" ],\n                \"/usr/bin/lucky\": [ \"exec\" ],\n                \"/bin/pidof\": [ \"exec\" ],\n                \"/bin/ps\": [ \"exec\" ],\n                \"/bin/ash\": [ \"exec\" ]\n      \t    },\n            \"ubus\": {\n                \"rc\": [ \"*\" ],\n                \"service\": [\"list\"],\n                \"luci.lucky\": [ \"*\" ]\n            }\n        },\n        \"write\": {\n            \"ubus\": {\n                \"luci.lucky\": [ \"*\" ]\n            },\n            \"file\": {\n                \"/etc/lucky/*.lkcf\": [\"write\"]\n\t    },\n            \"uci\": [\"lucky\"]\n        }\n    }\n}\n"
  },
  {
    "path": "luci-app-lucky/luci-app-lucky/root/usr/share/rpcd/ucode/luci.lucky",
    "content": "#!/usr/bin/ucode\n/*\n * SPDX-License-Identifier: GPL-2.0-only\n *\n * Copyright (C) 2021-2026  sirpdboy  <herboy2008@gmail.com> https://github.com/sirpdboy/luci-app-lucky \n */\n\n'use strict';\n\nimport { access, error, lstat, popen, readfile, writefile } from 'fs';\n\n/* Kanged from ucode/luci */\nfunction shellquote(s) {\n\treturn `'${replace(s, \"'\", \"'\\\\''\")}'`;\n}\nconst methods = {\n\tset_ConfInfo: {\n\t\targs: { key: 'key', value: 'value' },\n\t\tcall: function(req) {\n\t\t\tif (!access('/usr/bin/lucky'))\n\t\t\t\treturn { status: 255, error: 'lucky not found' };\n\n\t\t\tif (!req.args?.key)\n\t\t\t\treturn { status: 255, error: 'missing key parameter' };\n\n\t\t\tconst key = shellquote(req.args.key);\n\t\t\tconst configPath = '/etc/lucky';\n\t\t\tlet exit_code = 255;\n\t\t\t\n\t\t\tif (req.args.value !== null && req.args.value !== undefined) {\n\t\t\t\tconst value = shellquote(req.args.value);\n\t\t\t\texit_code = system(`/usr/bin/lucky -setconf -key ${key} -value ${value} -cd ${configPath}`);\n\t\t\t} else {\n\t\t\t\t// ûṩvalueֻkey\n\t\t\t\texit_code = system(`/usr/bin/lucky -setconf -key ${key} -cd ${configPath}`);\n\t\t\t}\n\n\t\t\treturn { status: exit_code };\n\t\t}\n\t},\n\n\tget_baseInfo: {\n\t\tcall: function() {\n\t\t\tif (!access('/usr/bin/lucky'))\n\t\t\t\treturn { ConfInfo: {}, error: 'lucky not found' };\n\n\t\t\tconst configPath = '/etc/lucky';\n\t\t\tconst fd = popen('/usr/bin/lucky -baseConfInfo -cd /etc/lucky');\n\t\t\tif (fd) {\n\t\t\t\tlet config = fd.read('all');\n\t\t\t\tfd.close();\n\t\t\t\t\n\t\t\t\tif (!config || length(config) === 0)\n\t\t\t\t\treturn { ConfInfo: {}, error: 'empty response' };\n\t\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\tconfig = json(config);\n\t\t\t\t\treturn { ConfInfo: config };\n\t\t\t\t} catch(e) {\n\t\t\t\t\treturn { ConfInfo: {}, error: 'JSON parse error: ' + e };\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn { ConfInfo: {}, error: 'failed to execute lucky command' };\n\t\t\t}\n\t\t}\n\t},\n\n\tget_Info: {\n\t\tcall: function() {\n\t\t\tif (!access('/usr/bin/lucky'))\n\t\t\t\treturn { Info: {}, error: 'lucky not found' };\n\t\t\tconst configPath = '/etc/lucky';\n\t\t\tconst fd = popen('/usr/bin/lucky -info -cd /etc/lucky');\n\t\t\tif (fd) {\n\t\t\t\tlet config = fd.read('all');\n\t\t\t\tfd.close();\n\t\t\t\t\n\t\t\t\tif (!config || length(config) === 0)\n\t\t\t\t\treturn { Info: {}, error: 'empty response' };\n\t\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\tconfig = json(config);\n\t\t\t\t\treturn { Info: config };\n\t\t\t\t} catch(e) {\n\t\t\t\t\treturn { Info: {}, error: 'JSON parse error: ' + e };\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\treturn { Info: {}, error: 'failed to execute lucky command' };\n\t\t\t}\n\t\t}\n\t}\n};\n\nreturn { 'luci.lucky': methods };"
  },
  {
    "path": "luci-app-lucky/lucky/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021-2025  sirpdboy  <herboy2008@gmail.com>\n# \n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=lucky\nPKG_VERSION:=2.27.2\nPKG_RELEASE:=1\nPKGARCH:=all \n\nifeq ($(ARCH),mipsel)\n\tLUCKY_ARCH:=mipsle_softfloat\nendif\nifeq ($(ARCH),mips)\n\tLUCKY_ARCH:=mips_softfloat\nendif\nifeq ($(ARCH),i386)\n\tLUCKY_ARCH:=i386\nendif\nifeq ($(ARCH),x86_64)\n\tLUCKY_ARCH:=x86_64\nendif\nifeq ($(ARCH),arm)\n\tifeq ($(BOARD),bcm53xx)\n\t\tLUCKY_ARCH:=armv6\n\telse\n\tLUCKY_ARCH:=armv7\nendif\nendif\nifeq ($(BOARD),bcm53xx)\n\tLUCKY_ARCH:=armv6\nifeq ($(word 2,$(subst +,$(space),$(call qstrip,$(CONFIG_CPU_TYPE)))),)\n\tLUCKY_ARCH:=armv5\nendif\nendif\nifeq ($(BOARD),kirkwood)\n\tLUCKY_ARCH:=armv5\nendif\nifeq ($(ARCH),aarch64)\n\tLUCKY_ARCH:=arm64\nendif\n\nPKG_LICENSE:=GPL-3.0-only\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=GDY666 <gdy666@foxmail.com>\n\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)\nPKG_HASH:=skip\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n\tSECTION:=net\n\tCATEGORY:=Network\n\tTITLE:=Lucky gdy\n\tDEPENDS:=@(i386||x86_64||arm||aarch64||mipsel||mips)\n\tURL:=https://github.com/gdy666/lucky\nendef\n\ndefine Package/$(PKG_NAME)/description\n  Main functions of Lucky: ipv4/ipv6 portforward,ddns,IOT wake on lan ,reverse proxy and more...\nendef\n\ndefine Build/Prepare\n\t[ ! -f $(PKG_BUILD_DIR)/$(PKG_NAME)_$(PKG_VERSION)_Linux_$(LUCKY_ARCH).tar.gz ] && wget https://github.com/gdy666/lucky/releases/download/v$(PKG_VERSION)/$(PKG_NAME)_$(PKG_VERSION)_Linux_$(LUCKY_ARCH).tar.gz -O $(PKG_BUILD_DIR)/$(PKG_NAME)_$(PKG_VERSION)_Linux_$(LUCKY_ARCH).tar.gz\n\ttar -xzvf $(PKG_BUILD_DIR)/$(PKG_NAME)_$(PKG_VERSION)_Linux_$(LUCKY_ARCH).tar.gz -C $(PKG_BUILD_DIR) || exit 1\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/lucky\n/etc/lucky/*\nendef\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/usr/bin/\n\t$(INSTALL_DIR) $(1)/etc/init.d/\n\t$(INSTALL_DIR) $(1)/etc/config/\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/lucky $(1)/usr/bin/lucky\n\t$(INSTALL_BIN) $(CURDIR)/files/luckyarch.bin $(1)/usr/bin/luckyarch\n\t$(INSTALL_BIN) ./files/lucky.init $(1)/etc/init.d/lucky\n\t$(INSTALL_CONF) $(CURDIR)/files/lucky.config $(1)/etc/config/lucky\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "luci-app-lucky/lucky/files/lucky.config",
    "content": "config lucky 'lucky'\n\toption logger '1'\n\toption port '16601'\n\toption configdir '/etc/lucky'\n\toption enabled '0'\n"
  },
  {
    "path": "luci-app-lucky/lucky/files/lucky.init",
    "content": "#!/bin/sh /etc/rc.common\n#\n# Copyright (C) 2021-2025  sirpdboy  <herboy2008@gmail.com> https://github.com/sirpdboy/luci-app-lucky\n\n# This file is part of lucky .\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n\nSTART=99\nSTOP=15\nUSE_PROCD=1\n\nCONF=lucky\nPROG=/usr/bin/lucky\nCONFDIR=/etc/lucky\n\nget_config() {\n  config_get_bool enabled $1 enabled 0\n  config_get_bool logger $1 logger 1\n  config_get port $1 port 16601\n  config_get SafeURL $1 safe\n  config_get delay $1 delay 0\n\n}\n\ninit_config(){\n\tconfig_load \"$CONF\"\n\tconfig_foreach get_config \"$CONF\"\n}\n\ninit_confdir(){\n\t[ -d $CONFDIR ] || mkdir -p $CONFDIR 2>/dev/null\n}\n\nLOG(){\n   echo \"$1\"\n   logger -t lucky -p warn \"$1\"\n}\n\nstart_instance() {\n    enabled=$(uci -q get $CONF.$CONF.enabled ) || enabled=\"0\"\n    logger=$(uci -q get $CONF.$CONF.logger ) || logger=\"1\"\n    port=$(uci -q get $CONF.$CONF.port ) || port=\"16601\"\n    SafeURL=$(uci -q get $CONF.$CONF.safe ) || SafeURL=\" \"\n    delay=$(uci -q get $CONF.$CONF.delay ) || delay=\"5\"\n    SafeURL=\"${SafeURL##*( )}\"\n    SafeURL=\"${SafeURL%%*( )}\"\n    \n    init_confdir\n    [  x$enabled = x1 ] || return 1\n    [ $(awk -F. '{print $1}' /proc/uptime) -lt \"120\" ] && sleep $delay \n    $(which lucky) -setconf -key AdminWebListenPort -value $port -cd $CONFDIR\n    if [ -z \"$SafeURL\" ] ; then\n        $(which lucky) -rCancelSafeURL\n    else\n        $(which lucky) -setconf -key SafeURL -value \"$SafeURL\" -cd $CONFDIR\n    fi\n    \n    procd_open_instance\n    procd_set_param command $PROG \n    procd_append_param command -cd $CONFDIR\n    procd_set_param respawn\n    procd_set_param stderr 1\n    procd_close_instance\n    LOG \"lucky is start.\"\n\n}\n\nstart_service() {\n  pgrep -f $PROG | xargs kill -9 >/dev/null 2>&1\n  start_instance\n}\n\nstop_service() {\n  pgrep -f $PROG | xargs kill -9 >/dev/null 2>&1\n  LOG \"lucky is stop.\"\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger lucky\n}\n"
  },
  {
    "path": "luci-app-mentohust/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=MentoHUST 802.1X Client for LuCI\nLUCI_DEPENDS:=+mentohust\nLUCI_PKGARCH:=all\n\nPKG_NAME:=luci-app-mentohust\nPKG_VERSION:=1.1.1\nPKG_RELEASE:=4\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-mentohust/luasrc/controller/mentohust.lua",
    "content": "module(\"luci.controller.mentohust\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/mentohust\") then\n\t\treturn\n\tend\n\n\tif luci.sys.call(\"command -v mentohust >/dev/null\") ~= 0 then\n\t\treturn\n\tend\n\n\tlocal page = entry({\"admin\", \"services\", \"mentohust\"}, alias(\"admin\", \"services\", \"mentohust\", \"general\"), _(\"MentoHUST\"))\n\tpage.order = 10\n\tpage.dependent = true\n\tpage.acl_depends = { \"luci-app-mentohust\" }\n\n\tentry({\"admin\", \"services\", \"mentohust\", \"general\"}, cbi(\"mentohust/general\"), _(\"MentoHUST Settings\"), 10).leaf = true\n\tentry({\"admin\", \"services\", \"mentohust\", \"log\"}, cbi(\"mentohust/log\"), _(\"MentoHUST LOG\"), 20).leaf = true\nend\n"
  },
  {
    "path": "luci-app-mentohust/luasrc/model/cbi/mentohust/general.lua",
    "content": "local function is_running(name)\n\tif luci.sys.call(\"pidof %s >/dev/null\" %{name}) == 0 then\n\t\treturn translate(\"RUNNING\")\n\telse\n\t\treturn translate(\"NOT RUNNING\")\n\tend\nend\n\nlocal function is_online(ipaddr)\n\tif ipaddr == \"0.0.0.0\" then \n\t\treturn translate(\"Pinghost not set\")\n\tend\n\tif luci.sys.call(\"ping -c1 -w1 %s >/dev/null 2>&1\" %{ipaddr}) == 0 then\n\t\treturn translate(\"ONLINE\")\n\telse\n\t\treturn translate(\"NOT ONLINE\")\n\tend\nend\n\nrequire(\"luci.sys\")\n\nm = Map(\"mentohust\", translate(\"MentoHUST\"))\nm.description = translate(\"Configure MentoHUST 802.11x.\")\n\ns = m:section(TypedSection, \"mentohust\", translate(\"Status\"))\ns.anonymous = true\n\nstatus = s:option(DummyValue,\"_mentohust_status\", \"MentoHUST\")\nstatus.value = \"<span id=\\\"_mentohust_status\\\">%s</span>\" %{is_running(\"mentohust\")}\nstatus.rawhtml = true\nt = io.popen('uci get mentohust.@mentohust[0].pinghost')\nnetstat = is_online(tostring(t:read(\"*line\")))\nt:close()\nif netstat ~= \"\" then\nnetstatus = s:option(DummyValue,\"_network_status\", translate(\"Network Status\"))\nnetstatus.value = \"<span id=\\\"_network_status\\\">%s</span>\" %{netstat}\nnetstatus.rawhtml = true\nend\n\no = m:section(TypedSection, \"mentohust\", translate(\"Settings\"))\no.addremove = false\no.anonymous = true\n\no:tab(\"base\", translate(\"Normal Settings\"))\no:tab(\"advanced\", translate(\"Advanced Settings\"))\n\nenable = o:taboption(\"base\", Flag, \"enable\", translate(\"Enable\"))\n\nname = o:taboption(\"base\", Value, \"username\", translate(\"Username\"))\nname.description = translate(\"The username given to you by your network administrator\")\n\npass = o:taboption(\"base\", Value, \"password\", translate(\"Password\"))\npass.description = translate(\"The password you set or given to you by your network administrator\")\npass.password = true\n\nifname = o:taboption(\"base\", ListValue, \"ifname\", translate(\"Interfaces\"))\nifname.description = translate(\"Physical interface of WAN\")\nfor k, v in ipairs(luci.sys.net.devices()) do\n    if v ~= \"lo\" then\n        ifname:value(v)\n    end\nend\n\npinghost = o:taboption(\"base\", Value, \"pinghost\", translate(\"PingHost\"))\npinghost.description = translate(\"Ping host for drop detection, 0.0.0.0 to turn off this feature\")\npinghost.default = \"0.0.0.0\"\n\nipaddr = o:taboption(\"advanced\", Value, \"ipaddr\", translate(\"IP Address\"))\nipaddr.description = translate(\"Your IPv4 Address. (DHCP users can set to 0.0.0.0)\")\nipaddr.default = \"0.0.0.0\"\n\nmask = o:taboption(\"advanced\", Value, \"mask\", translate(\"NetMask\"))\nmask.description = translate(\"NetMask, it doesn't matter\")\nmask.default = \"0.0.0.0\"\n\ngateway = o:taboption(\"advanced\", Value, \"gateway\", translate(\"Gateway\"))\ngateway.description = translate(\"Gateway, if specified, will monitor gateway ARP information\")\ngateway.default = \"0.0.0.0\"\n\ndnsserver = o:taboption(\"advanced\", Value, \"dns\", translate(\"DNS server\"))\ndnsserver.description = translate(\"DNS server, it doesn't matter\")\ndnsserver.default = \"0.0.0.0\"\n\ntimeout = o:taboption(\"advanced\", Value, \"timeout\", translate(\"Timeout\"))\ntimeout.description = translate(\"Each timeout of the package (seconds)\")\ntimeout.default = \"8\"\n\nechointerval = o:taboption(\"advanced\", Value, \"echointerval\", translate(\"EchoInterval\"))\nechointerval.description = translate(\"Interval for sending Echo packets (seconds)\")\nechointerval.default = \"30\"\n\nrestartwait = o:taboption(\"advanced\", Value, \"restartwait\", translate(\"RestartWait\"))\nrestartwait.description = translate(\"Failed Wait (seconds) Wait for seconds after authentication failed or restart authentication after server request\")\nrestartwait.default = \"15\"\n\nstartmode = o:taboption(\"advanced\", ListValue, \"startmode\", translate(\"StartMode\"))\nstartmode.description = translate(\"Multicast address type when searching for servers\")\nstartmode:value(0, translate(\"Standard\"))\nstartmode:value(1, translate(\"Ruijie\"))\nstartmode:value(2, translate(\"Uses MentoHUST for Xaar certification\"))\nstartmode.default = \"0\"\n\ndhcpmode = o:taboption(\"advanced\", ListValue, \"dhcpmode\", translate(\"DhcpMode\"))\ndhcpmode.description = translate(\"DHCP method\")\ndhcpmode:value(0, translate(\"None\"))\ndhcpmode:value(1, translate(\"secondary authentication\"))\ndhcpmode:value(2, translate(\"after certification\"))\ndhcpmode:value(3, translate(\"before certification\"))\ndhcpmode.default = \"2\"\n\nshownotify = o:taboption(\"advanced\", Value, \"shownotify\", translate(\"ShowNotify\"))\nshownotify.description = translate(\"Whether to display notifications 0 (no) 1 to 20 (yes)\")\nshownotify.default = \"5\"\n\nversion = o:taboption(\"advanced\", Value, \"version\", translate(\"Client Version\"))\nversion.description = translate(\"Client version number. If client verification is not enabled but the version number is required, it can be specified here. The format is 3.30.\")\nversion.default = \"0.00\"\n\ndatafile = o:taboption(\"advanced\", Value, \"datafile\", translate(\"DataFile\"))\ndatafile.description = translate(\"Authentication data file, if you need to verify the client, you need to set correctly\")\ndatafile.default = \"/etc/mentohust/\"\n\ndhcpscript = o:taboption(\"advanced\", Value, \"dhcpscript\", translate(\"DhcpScript\"))\ndhcpscript.description = translate(\"DHCP script\")\ndhcpscript.default = \"udhcpc -i\"\n\nlocal apply = luci.http.formvalue(\"cbi.apply\")\nif apply then\n\tio.popen(\"/etc/init.d/mentohust restart\")\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-mentohust/luasrc/model/cbi/mentohust/log.lua",
    "content": "local fs = require \"nixio.fs\"\n\nlocal f = SimpleForm(\"mentohust\",\n\ttranslate(\"MentoHUST LOG\"),\n\ttranslate(\"Log file:/tmp/mentohust.log\"))\n\nlocal o = f:field(Value, \"mentohust_log\")\n\no.template = \"cbi/tvalue\"\no.rows = 32\n\nfunction o.cfgvalue(self, section)\n\treturn fs.readfile(\"/tmp/mentohust.log\")\nend\n\nfunction o.write(self, section, value)\n\trequire(\"luci.sys\").call('cat /dev/null > /tmp/mentohust.log 2>/dev/null')\nend\n\nf.submit = translate(\"Clear log\")\nf.reset = false\n\nreturn f\n"
  },
  {
    "path": "luci-app-mentohust/po/zh_Hans/mentohust.po",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\\n\"\n\nmsgid \"MentoHUST Settings\"\nmsgstr \"MentoHUST 设置\"\n\nmsgid \"MentoHUST LOG\"\nmsgstr \"MentoHUST 日志\"\n\nmsgid \"Log file:/tmp/mentohust.log\"\nmsgstr \"日志文件：/tmp/mentohust.log\"\n\nmsgid \"Configure MentoHUST 802.11x.\"\nmsgstr \"配置MentoHUST 802.11x验证。\"\n\nmsgid \"Normal Settings\"\nmsgstr \"常规设置\"\n\nmsgid \"The username given to you by your network administrator\"\nmsgstr \"您的用户名(或管理员分配的用户名)\"\n\nmsgid \"The password you set or given to you by your network administrator\"\nmsgstr \"您的密码(或管理员分配的密码)\"\n\nmsgid \"Physical interface of WAN\"\nmsgstr \"WAN口的物理接口\"\n\nmsgid \"PingHost\"\nmsgstr \"Ping主机\"\n\nmsgid \"Ping host for drop detection, 0.0.0.0 to turn off this feature\"\nmsgstr \"Ping主机，用于掉线检测，0.0.0.0表示关闭该功能\"\n\nmsgid \"IP Address\"\nmsgstr \"IP地址\"\n\nmsgid \"Your IPv4 Address. (DHCP users can set to 0.0.0.0)\"\nmsgstr \"你的IPV4地址，DHCP用户可设为0.0.0.0\"\n\nmsgid \"NetMask\"\nmsgstr \"子网掩码\"\n\nmsgid \"NetMask, it doesn't matter\"\nmsgstr \"掩码，无关紧要\"\n\nmsgid \"Gateway, if specified, will monitor gateway ARP information\"\nmsgstr \"网关，如果指定了就会监视网关ARP信息\"\n\nmsgid \"DNS server\"\nmsgstr \"DNS服务器\"\n\nmsgid \"DNS server, it doesn't matter\"\nmsgstr \"DNS服务器，无关紧要\"\n\nmsgid \"Timeout\"\nmsgstr \"验证超时\"\n\nmsgid \"Each timeout of the package (seconds)\"\nmsgstr \"每次发包超时时间（秒）\"\n\nmsgid \"EchoInterval\"\nmsgstr \"Echo包间隔\"\n\nmsgid \"Interval for sending Echo packets (seconds)\"\nmsgstr \"发送Echo包的间隔（秒）\"\n\nmsgid \"RestartWait\"\nmsgstr \"验证失败等待时间\"\n\nmsgid \"Failed Wait (seconds) Wait for seconds after authentication failed or restart authentication after server request\"\nmsgstr \"失败等待（秒）认证失败后等待多少秒或者服务器请求后重启认证\"\n\nmsgid \"StartMode\"\nmsgstr \"组播地址类型\"\n\nmsgid \"Multicast address type when searching for servers\"\nmsgstr \"寻找服务器时的组播地址类型(某些交换机可能会丢弃标准包)\"\n\nmsgid \"Standard\"\nmsgstr \"标准\"\n\nmsgid \"Ruijie\"\nmsgstr \"锐捷\"\n\nmsgid \"Uses MentoHUST for Xaar certification\"\nmsgstr \"将MentoHUST用于赛尔认证\"\n\nmsgid \"DhcpMode\"\nmsgstr \"DHCP设置\"\n\nmsgid \"DHCP method\"\nmsgstr \"DHCP方式\"\n\nmsgid \"None\"\nmsgstr \"无\"\n\nmsgid \"secondary authentication\"\nmsgstr \"二次认证\"\n\nmsgid \"after certification\"\nmsgstr \"认证后\"\n\nmsgid \"before certification\"\nmsgstr \"认证前\"\n\nmsgid \"ShowNotify\"\nmsgstr \"通知级别\"\n\nmsgid \"Whether to display notifications 0 (no) 1 to 20 (yes)\"\nmsgstr \"是否显示通知： 0(否) 1~20(是)\"\n\nmsgid \"Client Version\"\nmsgstr \"客户端版本号\"\n\nmsgid \"Client version number. If client verification is not enabled but the version number is required, it can be specified here. The format is 3.30.\"\nmsgstr \"客户端版本号，如果未开启客户端校验但对版本号有要求，可以在此指定，形如3.30\"\n\nmsgid \"DataFile\"\nmsgstr \"数据文件\"\n\nmsgid \"Authentication data file, if you need to verify the client, you need to set correctly\"\nmsgstr \"认证数据文件，如果需要校验客户端，就需要正确设置\"\n\nmsgid \"DhcpScript\"\nmsgstr \"DHCP的脚本\"\n\nmsgid \"DHCP script\"\nmsgstr \"进行DHCP的脚本\"\n\nmsgid \"RUNNING\"\nmsgstr \"运行中\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\nmsgid \"ONLINE\"\nmsgstr \"能访问互联网\"\n\nmsgid \"NOT ONLINE\"\nmsgstr \"不能访问互联网\"\n\nmsgid \"Settings\"\nmsgstr \"设置\"\n\nmsgid \"Network Status\"\nmsgstr \"网络状态\"\n\nmsgid \"Pinghost not set\"\nmsgstr \"没有设置Ping主机\"\n\nmsgid \"Clear log\"\nmsgstr \"清除日志\"\n"
  },
  {
    "path": "luci-app-mentohust/root/etc/config/mentohust",
    "content": "config mentohust\n"
  },
  {
    "path": "luci-app-mentohust/root/etc/init.d/mentohust",
    "content": "#!/bin/sh /etc/rc.common\nSTART=93\n\nrun_mentohust()\n{\n    local enable\n    local username\n    local password\n    local ifname\n    local cmd\n    config_get_bool enable $1 enable\n    config_get username $1 username\n    config_get password $1 password\n    config_get ifname $1 ifname\n\n    if [ $enable ] && [ $username ] && [ $password ] && [ $ifname ]; then\n        local pinghost\n        local startmode\n        local dhcpmode\n        local ipaddr\n        local mask\n        local gateway\n        local dns\n        local timeout\n        local echointerval\n        local restartwait\n        local shownotify\n        local version\n        local datafile\n        local dhcpscript\n\n        config_get pinghost $1 pinghost\n        config_get startmode $1 startmode\n        config_get dhcpmode $1 dhcpmode\n        config_get ipaddr $1 ipaddr\n        config_get mask $1 mask\n        config_get gateway $1 gateway\n        config_get dns $1 dns\n        config_get timeout $1 timeout\n        config_get echointerval $1 echointerval\n        config_get restartwait $1 restartwait\n        config_get shownotify $1 shownotify\n        config_get version $1 version\n        config_get datafile $1 datafile\n        config_get dhcpscript $1 dhcpscript\n\n        if [ \"$ipaddr\" != \"\" ]; then cmd=$cmd\" -i\"$ipaddr;fi\n        if [ \"$mask\" != \"\" ]; then cmd=$cmd\" -m\"$mask;fi\n        if [ \"$pinghost\" != \"0.0.0.0\" ] &&  [ \"$pinghost\" != \"\" ]; then cmd=$cmd\" -o\"$pinghost;fi\n        if [ \"$startmode\" != \"0\" ] &&  [ \"$startmode\" != \"\" ]; then cmd=$cmd\" -a\"$startmode;fi\n        if [ \"$dhcpmode\" != \"0\" ] &&  [ \"$dhcpmode\" != \"\" ]; then cmd=$cmd\" -d\"$dhcpmode;fi\n        if [ \"$gateway\" != \"0.0.0.0\" ] &&  [ \"$gateway\" != \"\" ]; then cmd=$cmd\" -g\"$gateway;fi\n        if [ \"$dns\" != \"0.0.0.0\" ] &&  [ \"$dns\" != \"\" ]; then cmd=$cmd\" -s\"$dns;fi\n        if [ \"$timeout\" != \"8\" ] &&  [ \"$timeout\" != \"\" ]; then cmd=$cmd\" -t\"$timeout;fi\n        if [ \"$echointerval\" != \"30\" ] &&  [ \"$echointerval\" != \"\" ]; then cmd=$cmd\" -e\"$echointerval;fi\n        if [ \"$restartwait\" != \"15\" ] &&  [ \"$restartwait\" != \"\" ]; then cmd=$cmd\" -r\"$restartwait;fi\n        if [ \"$shownotify\" != \"5\" ] &&  [ \"$shownotify\" != \"\" ]; then cmd=$cmd\" -y\"$shownotify;fi\n        if [ \"$version\" != \"0.00\" ] &&  [ \"$version\" != \"\" ]; then cmd=$cmd\" -v\"$version;fi\n        if [ \"$datafile\" != \"/etc/mentohust/\" ] &&  [ \"$datafile\" != \"\" ]; then cmd=$cmd\" -f\"$datafile;fi\n        if [ \"$dhcpscript\" != \"udhcpc -i\" ] &&  [ \"$dhcpscript\" != \"\" ]; then cmd=$cmd\" -c'\"$dhcpscript\"'\";fi\n\n        /bin/ash -c \"mentohust -u$username -p$password -n$ifname -b3 -w $cmd\"\n    else\n        /bin/ash -c \"mentohust -k\"\n    fi\n}\n\nstart()\n{\n    config_load mentohust\n    config_foreach run_mentohust mentohust\n}\n\nstop()\n{\n    killall mentohust\n}\n\nrestart()\n{\n    mentohust -k\n    sleep 1\n    config_load mentohust\n    config_foreach run_mentohust mentohust\n}\n"
  },
  {
    "path": "luci-app-mentohust/root/etc/uci-defaults/luci-mentohust",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@mentohust[-1]\n\tadd ucitrack mentohust\n\tset ucitrack.@mentohust[-1].init=mentohust\n\tcommit ucitrack\nEOF\n\nrm -rf /tmp/luci-*\nexit 0\n"
  },
  {
    "path": "luci-app-mentohust/root/usr/share/rpcd/acl.d/luci-app-mentohust.json",
    "content": "{\n\t\"luci-app-mentohust\": {\n\t\t\"description\": \"Grant UCI access for luci-app-mentohust\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"mentohust\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"mentohust\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-msd_lite/Makefile",
    "content": "#\n# Copyright (C) 2008-2022 The LuCI Team\n#\n# This is free software, licensed under the Apache License, Version 2.0.\n#\n# Converted by ximitech\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_VERSION:=20221214\nPKG_RELEASE:=1\n\nLUCI_TITLE:=LuCI support for Multi Stream Daemon Lite\nLUCI_DEPENDS:=+msd_lite +luci-compat\nLUCI_PKGARCH:=all\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature"
  },
  {
    "path": "luci-app-msd_lite/luasrc/controller/msd_lite.lua",
    "content": "\nmodule(\"luci.controller.msd_lite\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/msd_lite\") then\n\t\treturn\n\tend\n\n\tlocal page\n\tpage = entry({\"admin\", \"services\", \"msd_lite\"}, cbi(\"msd_lite\"), _(\"MultiSD_Lite\"), 60)\n\tpage.dependent = true\n\tpage = entry({\"admin\", \"services\", \"msd_lite\", \"status\"}, call(\"act_status\"))\n\tpage.leaf = true\nend\n\nlocal function is_running()\n\treturn luci.sys.call(\"pidof msd_lite >/dev/null\") == 0\nend\n\nfunction act_status()\n\tlocal e = {}\n\te.running = is_running()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n"
  },
  {
    "path": "luci-app-msd_lite/luasrc/model/cbi/msd_lite.lua",
    "content": "require (\"nixio.fs\")\nrequire (\"luci.sys\")\nrequire (\"luci.http\")\nrequire (\"luci.dispatcher\")\nrequire \"luci.model.uci\".cursor()\n\nm = Map(\"msd_lite\")\nm.title = translate(\"Multi Stream daemon Lite\")\nm.description = translate(\"The lightweight version of Multi Stream daemon (msd) Program for organizing IP TV streaming on the network via HTTP.\")\n\nm:section(SimpleSection).template  = \"msd_lite/msd_lite_status\"\n\ns = m:section(TypedSection, \"instance\")\ns.addremove = true\ns.anonymous = false\ns.addbtntitle = translate(\"Add instance\")\n\no = s:option(Flag, \"enabled\", translate(\"Enable\"))\no.default = o.disabled\no.rmempty = false\n\no = s:option(DynamicList, \"address\", translate(\"Bind address\"))\no.datatype = \"list(ipaddrport(1))\"\no.rmempty = false\n\no = s:option(ListValue, \"network\", translate(\"Source interface\"))\nlocal x = luci.model.uci.cursor()\nlocal net = x:get_all(\"network\")\nfor interface, config in pairs(net) do\n    if interface ~= \"loopback\" and config.proto ~= nil then\n        o:value(interface)\n    end\nend\no:value(\"\", translate(\"Disable\"))\no.default = \"\"\no.description = translate(\"For multicast receive.\")\n\no = s:option(Value, \"threads\", translate(\"Worker threads\"))\no.datatype = \"uinteger\"\no.default = \"0\"\no.description = translate(\"0 = auto.\")\n\no = s:option(Flag, \"bind_to_cpu\", translate(\"Bind threads to CPUs\"))\no.default = o.disabled\n\no = s:option(Flag, \"drop_slow_clients\", translate(\"Disconnect slow clients\"))\no.default = o.disabled\n\no = s:option(Value, \"precache_size\", translate(\"Pre cache size\"))\no.datatype = \"uinteger\"\no.default = \"4096\"\n\no = s:option(Value, \"ring_buffer_size\", translate(\"Ring buffer size\"))\no.datatype = \"uinteger\"\no.default = \"1024\"\no.description = translate(\"Stream receive ring buffer size.\")\n\no = s:option(Value, \"multicast_recv_buffer_size\", translate(\"Receive buffer size\"))\no.datatype = \"uinteger\"\no.default = \"512\"\no.description = translate(\"Multicast receive socket buffer size.\")\n\no = s:option(Value, \"multicast_recv_timeout\", translate(\"Receive timeout\"))\no.datatype = \"uinteger\"\no.default = \"2\"\no.description = translate(\"Multicast receive timeout.\")\n\no = s:option(Value, \"rejoin_time\", translate(\"IGMP/MLD rejoin time\"))\no.datatype = \"uinteger\"\no.default = \"0\"\no.description = translate(\"Do IGMP/MLD leave+join every X seconds. Leave <em>0</em> to disable.\")\n\nreturn m\n"
  },
  {
    "path": "luci-app-msd_lite/luasrc/view/msd_lite/msd_lite_status.htm",
    "content": "<script type=\"text/javascript\">//<![CDATA[\nXHR.poll(3, '<%=luci.dispatcher.build_url(\"admin\", \"services\", \"msd_lite\", \"status\")%>', null,\n\tfunction(x, data) {\n\t\tvar tb = document.getElementById('msd_lite_status');\n\t\tif (data && tb) {\n\t\t\tvar links = \"\";\n\t\t\tif (data.running) {\n\t\t\t\tlinks = '<b><font color=green>msd_lite - <%:RUNNING%></font></b></em>';\n\t\t\t} else {\n\t\t\t\tlinks = '<b><font color=red>msd_lite - <%:NOT RUNNING%></font></b>';\n\t\t\t}\n\n\t\t\ttb.innerHTML = links;\n\t\t}\n\t}\n);\n//]]>\n</script>\n<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>\n<fieldset class=\"cbi-section\">\n\t<p id=\"msd_lite_status\">\n\t\t<em><%:Collecting data...%></em>\n\t</p>\n</fieldset>"
  },
  {
    "path": "luci-app-msd_lite/po/zh_Hans/msd_lite.po",
    "content": "\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\nmsgid \"RUNNING\"\nmsgstr \"运行中\"\n\nmsgid \"MultiSD_Lite\"\nmsgstr \"MultiSD_Lite\"\n\nmsgid \"Multi Stream daemon Lite\"\nmsgstr \"组播转换 Lite\"\n\nmsgid \"The lightweight version of Multi Stream daemon (msd) Program for organizing IP TV streaming on the network via HTTP.\"\nmsgstr \"Multi Stream daemon (msd) 程序的轻量级版本，用于通过 HTTP 管理网络上的 IP TV 流。\"\n\nmsgid \"Add instance\"\nmsgstr \"添加实例\"\n\nmsgid \"Enable\"\nmsgstr \"启用\"\n\nmsgid \"Bind address\"\nmsgstr \"绑定地址\"\n\nmsgid \"Source interface\"\nmsgstr \"源接口\"\n\nmsgid \"For multicast receive.\"\nmsgstr \"用于接收组播流。\"\n\nmsgid \"Worker threads\"\nmsgstr \"工作线程\"\n\nmsgid \"0 = auto.\"\nmsgstr \"保留为 0 以自动检测。\"\n\nmsgid \"Bind threads to CPUs\"\nmsgstr \"绑定线程到 CPU\"\n\nmsgid \"Disconnect slow clients\"\nmsgstr \"断开慢速客户端\"\n\nmsgid \"Pre cache size\"\nmsgstr \"预缓存大小\"\n\nmsgid \"Ring buffer size\"\nmsgstr \"环形缓冲区大小\"\n\nmsgid \"Stream receive ring buffer size.\"\nmsgstr \"流接收环形缓冲区大小。\"\n\nmsgid \"Receive buffer size\"\nmsgstr \"接收缓冲区大小\"\n\nmsgid \"Multicast receive socket buffer size.\"\nmsgstr \"组播接收套接字缓冲区大小。\"\n\nmsgid \"Receive timeout\"\nmsgstr \"接收超时\"\n\nmsgid \"Multicast receive timeout.\"\nmsgstr \"组播接收超时。\"\n\nmsgid \"Do IGMP/MLD leave+join every X seconds. Leave <em>0</em> to disable.\"\nmsgstr \"每隔 X 秒执行 IGMP/MLD 退出重进。设置为 <em>0</em> 以禁用。\"\n\nmsgid \"IGMP/MLD rejoin time\"\nmsgstr \"IGMP/MLD 重新加入时间\"\n"
  },
  {
    "path": "luci-app-msd_lite/root/etc/uci-defaults/40_luci-msd_lite",
    "content": "#!/bin/sh\n\n# needed for \"Save and Apply\" to restart msd_lite\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@msd_lite[-1]\n\tadd ucitrack msd_lite\n\tset ucitrack.@msd_lite[-1].init=msd_lite\n\tcommit ucitrack\nEOF\n\nrm -f /tmp/luci-indexcache\nexit 0\n"
  },
  {
    "path": "luci-app-natter/Makefile",
    "content": "# Copyright (C) 2020-2024 Hyy2001X <https://github.com/Hyy2001X>\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-natter\nPKG_VERSION:=1.1\nPKG_RELEASE:=5\n\nLUCI_TITLE:=LuCI Support for Natter\nLUCI_PKGARCH:=all\nLUCI_DEPENDS:=+natter\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-natter/luasrc/controller/natter.lua",
    "content": "module(\"luci.controller.natter\",package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/natter\") then\n\t\treturn\n\tend\n\tentry({\"admin\", \"network\", \"natter\"}, alias(\"admin\", \"network\", \"natter\", \"base\"), _(\"Natter\"), 99).dependent = true\n\tentry({\"admin\", \"network\", \"natter\", \"base\"}, cbi(\"natter/base\"), _(\"Base Settings\"), 10).leaf = true\n\tentry({\"admin\", \"network\", \"natter\", \"ports\"}, cbi(\"natter/ports\")).leaf = true\n\tentry({\"admin\", \"network\", \"natter\", \"log\"}, form(\"natter/log\"), _(\"Log\"), 20).leaf = true\n\tentry({\"admin\", \"network\", \"natter\", \"print_log\"}, call(\"print_log\")).leaf = true\n\tentry({\"admin\", \"network\", \"natter\", \"del_log\"}, call(\"del_log\")).leaf = true\nend\n\nfunction print_log()\n\tluci.http.write(luci.sys.exec(\"sh /usr/share/luci-app-natter/log.sh print\"))\nend\n\nfunction del_log()\n\tluci.http.write(luci.sys.exec(\"sh /usr/share/luci-app-natter/log.sh del\"))\nend\n"
  },
  {
    "path": "luci-app-natter/luasrc/model/cbi/natter/base.lua",
    "content": "m = Map(\"natter\", translate(\"Natter\"), translate(\"Open Port under FullCone NAT (NAT 1)\"))\ns = m:section(TypedSection, \"base\")\n\ns.addremove = false\ns.anonymous = true\n\nlocal function check_file(e)\n\treturn luci.sys.exec('ls \"%s\" 2> /dev/null' % e) ~= \"\" and true or false\nend\n\nenable = s:option(Flag, \"enable\", translate(\"Enable\"))\nenable.default = 0\n\nif check_file(\"/tmp/natter_nat_type\") then\n\tnatter_nat_type_tcp = luci.sys.exec (\"grep TCP /tmp/natter_nat_type\")\n\tnatter_nat_type_udp = luci.sys.exec (\"grep UDP /tmp/natter_nat_type\")\n\tnat_check = s:option (Button, \"nat_check\", translate(\"Check NAT Status\"), translate(\"\") .. \"<br><br>\" .. natter_nat_type_tcp .. \"<br><br>\" .. natter_nat_type_udp)\nelse\n\tnat_check = s:option (Button, \"nat_check\", translate(\"Check NAT Status\"))\nend\n\nnat_check.inputtitle = translate(\"Exec\")\nnat_check.write = function()\n\tluci.sys.call (\"sh /usr/share/luci-app-natter/natcheck.sh > /tmp/natter_nat_type\")\n\tluci.http.redirect(luci.dispatcher.build_url(\"admin\", \"network\", \"natter\", \"base\"))\nend\n\nlocal_ip = s:option(Value, \"local_ip\", translate(\"Local IP Address\"), translate(\"Natter Listening Address\"))\nlocal_ip.default = \"0.0.0.0\"\nlocal_ip.placeholder = \"0.0.0.0\"\nlocal_ip.datatype = \"host\"\nlocal_ip.rmempty = false\n\nlog_path = s:option(Value, \"log_path\", translate(\"Log Path\"), translate(\"Directory to save natter logs\"))\nlog_path.default = \"/tmp/natter\"\nlog_path.placeholder = \"/tmp/natter\"\nlog_path.rmempty = false\n\nkeep_alive_server = s:option(Value, \"keep_alive_server\", translate(\"Keep Alive Server\"), translate(\"Please ensure that the address can be connected by Natter\"))\nkeep_alive_server.rmempty = false\n\ntcp_stun_server = s:option(DynamicList, \"tcp_stun_server\", translate(\"TCP STUN Server\"), translate(\"Please DO NOT handle the IP address/domain name/port of the TCP/UDP STUN server (3478) while running proxy\"))\nudp_stun_server = s:option(DynamicList, \"udp_stun_server\", translate(\"UDP STUN Server\"))\nudp_stun_server.rmempty = false\n\ns = m:section(TypedSection, \"ports\", translate(\"Port Settings\"))\ns.anonymous = true\ns.addremove = true\ns.template = \"cbi/tblsection\"\ns.extedit = luci.dispatcher.build_url(\"admin\", \"network\", \"natter\", \"ports\", \"%s\")\nfunction s.create(...)\n\tlocal sid = TypedSection.create(...)\n\tif sid then\n\t\tluci.http.redirect(s.extedit % sid)\n\t\treturn\n\tend\nend\n\nenable_port = s:option(Flag, \"enable_port\", translate(\"Enable\"))\nenable_port.default = 1\nenable_port.width = \"5%\"\n\nremarks = s:option(DummyValue, \"remarks\", translate(\"Remarks\"))\nremarks.width = \"8%\"\n\nexternal_port_tcp = s:option(DummyValue, \"external_port_tcp\", translate(\"External TCP Port\"))\nexternal_port_tcp.width = \"12%\"\n\nexternal_port_udp = s:option(DummyValue, \"external_port_udp\", translate(\"External UDP Port\"))\nexternal_port_udp.width = \"12%\"\n\nenable_forward = s:option(Flag, \"enable_forward\", translate(\"Forward\"))\nenable_forward.default = 0\n\ninternal_ip = s:option(DummyValue, \"internal_ip\", translate(\"Internal IP Address\"))\ninternal_ip.width = \"12%\"\n\ninternal_port = s:option(DummyValue, \"internal_port\", translate(\"Internal Port\"))\ninternal_port.width = \"12%\"\n\nreturn m\n"
  },
  {
    "path": "luci-app-natter/luasrc/model/cbi/natter/log.lua",
    "content": "log = SimpleForm(\"natter\")\nlog.reset = false\nlog.submit = false\nlog:append(Template(\"natter/natter_log\"))\n\nreturn log\n"
  },
  {
    "path": "luci-app-natter/luasrc/model/cbi/natter/ports.lua",
    "content": "m = Map(\"natter\", translate(\"Port Settings\"))\nm.redirect = luci.dispatcher.build_url(\"admin\", \"network\", \"natter\")\n\ns = m:section(NamedSection, arg[1], \"ports\", \"\")\ns.addremove = false\ns.dynamic = false\n\nenable_port = s:option(Flag, \"enable_port\", translate(\"Enable\"))\n\nlocal rand_id = luci.sys.exec(\"cut -d '-' -f1 /proc/sys/kernel/random/uuid 2> /dev/null\")\nid = s:option(Value, \"id\", translate(\"ID\"), translate(\"Just keep default, or ensure uniqueness\"))\nid.default = rand_id\n\nremarks = s:option(Value, \"remarks\", translate(\"Remarks\"))\nremarks.rmempty = false\n\nforward_mode = s:option(ListValue, \"forward_mode\", translate(\"Forward Mode\"))\nforward_mode:value('1', translate(\"1 - Natter\"))\nforward_mode:value('2', translate(\"2 - Firewall\"))\nforward_mode.default = 1\n\nexternal_port = s:option(Value, \"external_port\", translate(\"External Port\"), translate(\"Specify the port opened by Natter\"))\nexternal_port.datatype = \"port\"\nexternal_port:depends({forward_mode = \"2\"})\n\nport_type = s:option(ListValue, \"port_type\", translate(\"Port Type\"))\nport_type:value(\"udp\", translate(\"UDP\"))\nport_type:value(\"tcp\", translate(\"TCP\"))\nport_type:value(\"both\", translate(\"TCP + UDP\"))\nport_type.default = both\nport_type.rempty = false\n\nenable_forward = s:option(Flag, \"enable_forward\", translate(\"Enable Port Forward\"), translate(\"Forward opened port to internal host\"))\nenable_forward.default = 1\nenable_forward.rempty = false\n\ninternal_ip = s:option(Value, \"internal_ip\", translate(\"Internal IP address\"), translate(\"Internal Host IP address\"))\ninternal_ip.datatype = \"ipmask4\"\ninternal_ip:depends({enable_forward = \"1\"})\nluci.sys.net.ipv4_hints(\nfunction(ip, name)\n\tinternal_ip:value(ip, \"%s (%s)\" %{ ip, name })\nend)\n\ninternal_port = s:option(Value, \"internal_port\", translate(\"Internal Port\"), translate(\"Internal Host Port\"))\ninternal_port.datatype = \"port\"\ninternal_port:depends({enable_forward = \"1\"})\n\ndelay = s:option(Value, \"delay\", translate(\"Start delay (Seconds)\"))\ndelay.default = 0\ndelay.datatype = \"uinteger\"\ndelay.rmempty = false\n\nlog_level = s:option(ListValue, \"log_level\", translate(\"Log Level\"))\nlog_level:value('debug', translate(\"Debug\"))\nlog_level:value('info', translate(\"Info\"))\nlog_level:value('warning', translate(\"Warning\"))\nlog_level:value('error', translate(\"Error\"))\n\n--[[\nhook = s:option(Value, \"hook\", translate(\"Hook\"))\nhook.rmempty = true\n--]]\n\nreturn m\n"
  },
  {
    "path": "luci-app-natter/luasrc/view/natter/natter_log.htm",
    "content": "<script type=\"text/javascript\">\n\t//<![CDATA[\n\tfunction del_log(btn) {\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin/network/natter/del_log\")%>', null,\n\t\t\tfunction(x, data) {\n\t\t\t\tif(x && x.status == 200) {\n\t\t\t\t\tvar log_textarea = document.getElementById('log_textarea');\n\t\t\t\t\tlog_textarea.innerHTML = \"\";\n\t\t\t\t\tlog_textarea.scrollTop = log_textarea.scrollHeight;\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\tXHR.poll(5, '<%=luci.dispatcher.build_url(\"admin/network/natter/print_log\")%>', null,\n\t\tfunction(x, data) {\n\t\t\tif(x && x.status == 200) {\n\t\t\t\tvar log_textarea = document.getElementById('log_textarea');\n\t\t\t\tlog_textarea.innerHTML = x.responseText;\n\t\t\t\tlog_textarea.scrollTop = log_textarea.scrollHeight;\n\t\t\t}\n\t\t}\n\t);\n\t//]]>\n</script>\n\n<fieldset class=\"cbi-section\" id=\"_log_fieldset\" >\n\t<input class=\"cbi-button cbi-input-remove\" type=\"button\" onclick=\"del_log()\" value=\"<%:Delete Logs%>\" />\n\t<textarea id=\"log_textarea\" class=\"cbi-input-textarea\" style=\"width: 100%;margin-top: 10px;\" data-update=\"change\" rows=\"30\" wrap=\"off\" readonly=\"readonly\"></textarea>\n</fieldset>\n"
  },
  {
    "path": "luci-app-natter/po/zh_Hans/natter.po",
    "content": "msgid \"Natter\"\nmsgstr \"Natter\"\n\nmsgid \"Open Port under FullCone NAT (NAT 1)\"\nmsgstr \"帮助 Full cone NAT (NAT 1) 用户打开公网端口\"\n\nmsgid \"Log Path\"\nmsgstr \"日志路径\"\n\nmsgid \"Log Level\"\nmsgstr \"日志等级\"\n\nmsgid \"Base Settings\"\nmsgstr \"基础设置\"\n\nmsgid \"Log\"\nmsgstr \"日志\"\n\nmsgid \"IP Address\"\nmsgstr \"IP 地址\"\n\nmsgid \"Start delay (Seconds)\"\nmsgstr \"启动延迟 (秒)\"\n\nmsgid \"Start delay\"\nmsgstr \"启动延迟\"\n\nmsgid \"Port Settings\"\nmsgstr \"端口设置\"\n\nmsgid \"TCP STUN Server\"\nmsgstr \"TCP STUN 服务器\"\n\nmsgid \"UDP STUN Server\"\nmsgstr \"UDP STUN 服务器\"\n\nmsgid \"Keep Alive Server\"\nmsgstr \"Keep Alive 服务器\"\n\nmsgid \"Directory to save natter logs\"\nmsgstr \"Natter 运行日志保存路径\"\n\nmsgid \"ID\"\nmsgstr \"标识\"\n\nmsgid \"Just keep default, or ensure uniqueness\"\nmsgstr \"保持默认即可, 修改时请确保标识的唯一性\"\n\nmsgid \"Remarks\"\nmsgstr \"备注\"\n\nmsgid \"Internal Port\"\nmsgstr \"内部端口\"\n\nmsgid \"Internal Host IP address\"\nmsgstr \"内部主机 IP 地址\"\n\nmsgid \"Internal Host Port\"\nmsgstr \"内部主机端口\"\n\nmsgid \"External Port\"\nmsgstr \"外部端口\"\n\nmsgid \"External TCP Port\"\nmsgstr \"外部 TCP 端口\"\n\nmsgid \"External UDP Port\"\nmsgstr \"外部 UDP 端口\"\n\nmsgid \"Specify the port opened by Natter\"\nmsgstr \"指定 Natter 打开的端口\"\n\nmsgid \"Enable Port Forward\"\nmsgstr \"启用端口转发\"\n\nmsgid \"Forward opened port to internal host\"\nmsgstr \"将打开的端口转发至内部主机\"\n\nmsgid \"Port Type\"\nmsgstr \"端口类型\"\n\nmsgid \"FullCone NAT\"\nmsgstr \"完全圆锥型 NAT\"\n\nmsgid \"Please DO NOT handle the IP address/domain name/port of the TCP/UDP STUN server (3478) while running proxy\"\nmsgstr \"请不要使用任何代理软件代理 STUN 服务器地址\"\n\nmsgid \"Local IP Address\"\nmsgstr \"本地 IP 地址\"\n\nmsgid \"Natter Listening Address\"\nmsgstr \"Natter 监听地址\"\n\nmsgid \"Please ensure that the address can be connected by Natter\"\nmsgstr \"请确保 Keep Alive 服务器地址能被 Natter 连接\"\n\nmsgid \"Internal IP Address\"\nmsgstr \"内部 IP 地址\"\n\nmsgid \"Forward Mode\"\nmsgstr \"转发策略\"\n\nmsgid \"1 - Natter\"\nmsgstr \"Natter 内置\"\n\nmsgid \"2 - Firewall\"\nmsgstr \"防火墙\"\n\nmsgid \"Delete Logs\"\nmsgstr \"清除日志\"\n\nmsgid \"<%:Delete Logs%>\"\nmsgstr \"清除日志\"\n\nmsgid \"Check NAT Status\"\nmsgstr \"NAT 类型检测\"\n\nmsgid \"Exec\"\nmsgstr \"执行\"\n\n"
  },
  {
    "path": "luci-app-natter/root/etc/config/natter",
    "content": "config base\n\toption enable '0'\n\toption keep_alive_server \"www.baidu.com\"\n\tlist tcp_stun_server 'stun.nextcloud.com'\n\tlist tcp_stun_server 'fwa.lifesizecloud.com'\n\tlist tcp_stun_server 'stun.isp.net.au'\n\tlist tcp_stun_server 'stun.freeswitch.org'\n\tlist tcp_stun_server 'stun.voip.blackberry.com'\n\tlist tcp_stun_server 'stun.stunprotocol.org'\n\tlist tcp_stun_server 'stun.sipnet.com'\n\tlist tcp_stun_server 'stun.radiojar.com'\n\tlist tcp_stun_server 'stun.sonetel.com'\n\tlist tcp_stun_server 'stun.voipgate.com'\n\tlist udp_stun_server 'stun.miwifi.com'\n\tlist udp_stun_server 'stun.qq.com'\n"
  },
  {
    "path": "luci-app-natter/root/etc/init.d/natter",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=98\n\nstart_service() {\n\tlocal basic_list=\"enable log_path tcp_stun_server udp_stun_server keep_alive_url local_ip\"\n\tlocal port_list=\"enable_port id remarks port enable_forward \\\n\t\tforward_mode external_port port_type delay log_level \\\n\t\tinternal_ip internal_port hook\"\n\tfor i in $basic_list\n\tdo\n\t\tlocal eval $i=\"$(uci_get_by_type base 0 $i)\"\n\tdone ; unset i\n\tif [ \"$enable\" == 1 ]\n\tthen\n\t\tinclude_file=/var/etc/natter.include\n\t\techo \"\n#!/bin/sh\niptables -N natter 2> /dev/null\niptables -I INPUT -j natter 2> /dev/null\n\" \\\n\t\t> $include_file\t\t\t\n\t\tmkdir -p ${log_path}\n\t\tiptables_remove_rule\n\t\tmkdir -p /var/etc/natter\n\t\tfor u in $(seq 0 $(($(uci show natter 2> /dev/null | egrep '@ports\\[[0-9]\\]+=ports' | wc -l) - 1)))\n\t\tdo\n\t\t\tfor i in $port_list\n\t\t\tdo\n\t\t\t\tlocal eval $i=\"$(uci_get_by_type ports $u $i)\"\n\t\t\t\techo \"$i : $(uci_get_by_type ports $u $i)\"\n\t\t\tdone ; unset i\n\n\t\t\t[ \"$enable_port\" != 1 ] && continue\n\n\t\t\tcase $port_type in\n\t\t\ttcp | udp)\n\t\t\t\teval external_${port_type}=\"$local_ip:$external_port\"\n\t\t\t\teval internal_${port_type}=\"$internal_ip:$internal_port\"\n\t\t\t\tiptables_type=$port_type\n\t\t\t;;\n\t\t\tboth)\n\t\t\t\texternal_tcp=\"$local_ip:$external_port\"\n\t\t\t\texternal_udp=\"$local_ip:$external_port\"\n\t\t\t\tinternal_tcp=\"$internal_ip:$internal_port\"\n\t\t\t\tinternal_udp=\"$internal_ip:$internal_port\"\n\t\t\t\tiptables_type=\"tcp udp\"\n\t\t\t;;\n\t\t\tesac\n\t\t\t\n\t\t\tlog_file=${log_path}/natter-${id}-${remarks}.log\n\t\t\tjson_file=/var/etc/natter/natter-${id}-${remarks}.json\n\t\t\tstatus_file=${log_path}/natter-${id}-${remarks}.json\n\n\t\t\techo \"{\n\t\\\"logging\\\": {\n\t\t\\\"level\\\": \\\"$log_level\\\",\n\t\t\\\"log_file\\\": \\\"${log_file}\\\"\n\t},\n\t\\\"status_report\\\": {\n\t\t\\\"hook\\\": \\\"$hook\\\",\n\t\t\\\"status_file\\\": \\\"${status_file}\\\"\n\t},\n\t$(\n\tcase ${forward_mode} in\n\t1)\n\t\techo \"\n\t\\\"open_port\\\": {\n\t\t\\\"tcp\\\": [\n\n\t\t],\n\t\t\\\"udp\\\": [\n\n\t\t]\n\t},\"\n\t\techo \"\n\t\\\"forward_port\\\": {\n\t\t\\\"tcp\\\": [\n\t\t\t$([ \"$internal_tcp\" ] && echo \\\"${internal_tcp}\\\")\n\t\t],\n\t\t\\\"udp\\\": [\n\t\t\t$([ \"$internal_udp\" ] && echo \\\"${internal_udp}\\\")\n\t\t]\n\t},\"\n\t;;\n\t2)\n\t\techo \"\n\t\\\"open_port\\\": {\n\t\t\\\"tcp\\\": [\n\t\t\t$([ \"$external_tcp\" ] && echo \\\"${external_tcp}\\\")\n\t\t],\n\t\t\\\"udp\\\": [\n\t\t\t$([ \"$external_udp\" ] && echo \\\"${external_udp}\\\")\n\t\t]\n\t},\"\n\t\techo \"\n\t\\\"forward_port\\\": {\n\t\t\\\"tcp\\\": [\n\n\t\t],\n\t\t\\\"udp\\\": [\n\n\t\t]\n\t},\"\n\t;;\n\tesac\n\t)\n\t\\\"stun_server\\\": {\n\t\t\\\"tcp\\\": $(\n\tprintf \"[\"\n\tj=1 ; for i in $tcp_stun_server\n\tdo\n\t\t[[ \"$j\" == 1 ]] && unset j || printf \", \"\n\t\tprintf '\"%s\"' $i\n\tdone ; unset i j\n\tprintf \"],\")\n\t\t\\\"udp\\\": $(\n\tprintf \"[\"\n\tj=1 ; for i in $udp_stun_server\n\tdo\n\t\t[[ \"$j\" == 1 ]] && unset j || printf \", \"\n\t\tprintf '\"%s\"' $i\n\tdone ; unset i j\n\tprintf \"]\")\n\t},\n\t\\\"keep_alive\\\": \\\"$keep_alive_url\\\"\n}\" \\\n\t\t\t> $json_file\n\t\t\techo \"json File: $json_file\"\n\t\t\techo \"log File: $log_file\"\n\t\t\techo \"status File: $status_file\"\n\t\t\tsleep $delay\n\t\t\tfor i in $(ps -efww | egrep 'natter.py' | grep -v grep | grep -v $$ | grep \"$id\" | awk '{print $1}')\n\t\t\tdo\n\t\t\t\tkill -9 \"$i\" 2> /dev/null\n\t\t\tdone\n\t\t\t$(command -v python) /usr/share/natter/natter.py -c $json_file &\n\t\t\tif [ \"$enable_forward\" == 1 ]\n\t\t\tthen\n\t\t\t\tcase $forward_mode in\n\t\t\t\t1)\n\t\t\t\t\t:\n\t\t\t\t;;\n\t\t\t\t2)\n\t\t\t\t\tiptables -N natter 2> /dev/null\n\t\t\t\t\tiptables -I INPUT -j natter 2> /dev/null\n\t\t\t\t\tfor i in $iptables_type\n\t\t\t\t\tdo\n\t\t\t\t\t\t# iptables -A natter \\\n\t\t\t\t\t\t#\t-p $i -m $i --dport $external_port \\\n\t\t\t\t\t\t#\t-m comment --comment \"nt-op-$id-$remarks\" \\\n\t\t\t\t\t\t#\t-j ACCEPT\n\t\t\t\t\t\t# echo \"iptables -A natter -p $i -m $i --dport $external_port -m comment --comment \\\"nt-op-$id-$remarks\\\" -j ACCEPT\" >> ${include_file}\n\t\t\t\t\t\tiptables -t nat -A PREROUTING \\\n\t\t\t\t\t\t\t-p $i -m $i --dport $external_port \\\n\t\t\t\t\t\t\t-m comment --comment \"nt-dnat-$id-$remarks\" \\\n\t\t\t\t\t\t\t-j DNAT \\\n\t\t\t\t\t\t\t--to-destination $internal_ip:$internal_port\n\t\t\t\t\t\techo \"iptables -t nat -A PREROUTING -p $i -m $i --dport $external_port -m comment --comment \\\"nt-dnat-$id-$remarks\\\" -j DNAT --to-destination $internal_ip:$internal_port\" >> ${include_file}\n\t\t\t\t\tdone ; unset i\n\t\t\t\t;;\n\t\t\t\tesac\n\t\t\t\tuci set natter.@ports[$u].external_port_tcp=\"WAIT\"\n\t\t\t\tuci set natter.@ports[$u].external_port_udp=\"WAIT\"\n\t\t\t\tuci commit natter\n\t\t\t\t{\n\t\t\t\t\tsleep 10\n\t\t\t\t\texternal_port_tcp=$(grep \"[INFO]\" $log_file 2> /dev/null | grep TCP | egrep -o \"[0-9]+\" | awk 'END{print}')\n\t\t\t\t\texternal_port_udp=$(grep \"[INFO]\" $log_file 2> /dev/null | grep UDP | egrep -o \"[0-9]+\" | awk 'END{print}')\n\t\t\t\t\t[ \"${external_port_tcp}\" ] || external_port_tcp=\"none\"\n\t\t\t\t\t[ \"${external_port_udp}\" ] || external_port_udp=\"none\"\n\t\t\t\t\tuci set natter.@ports[$u].external_port_tcp=\"$external_port_tcp\"\n\t\t\t\t\tuci set natter.@ports[$u].external_port_udp=\"$external_port_udp\"\n\t\t\t\t\tuci commit natter\n\t\t\t\t} &\n\t\t\tfi\n\t\t\tfor i in $port_list\n\t\t\tdo\n\t\t\t\tunset $(echo $i)\n\t\t\tdone ; unset i\n\t\t\tunset iptables_type internal_tcp internal_udp external_tcp external_udp external_port_tcp external_port_udp\n\t\tdone ; unset u\n\telse\n\t\techo \"Natter is disabled ...\"\n\t\tstop_service\n\tfi\n}\n\nstop_service() {\n\techo \"Stopping Natter ...\"\n\tfor i in $(ps -efww | egrep 'natter.py' | grep -v grep | grep -v $$ | awk '{print $1}')\n\tdo\n\t\tkill -9 \"$i\" 2> /dev/null\n\tdone\n\tiptables_remove_rule\n\trm /var/etc/natter.include 2> /dev/null\n\trm -r /var/etc/natter 2> /dev/null\n\trm -r /tmp/natter 2> /dev/null\n}\n\niptables_remove_rule() {\n\techo \"Removing iptable rules ...\"\n\tiptables -D INPUT -j natter 2> /dev/null\n\tiptables -F natter 2> /dev/null\n\tiptables -X natter 2> /dev/null\n\tiptables-save | grep -v 'nt-dnat' | iptables-restore\n}\n\nstop() {\n\tstop_service\n}\n\nstart() {\n\tstart_service\n}\n\nrestart() {\n\tstop\n\tstart\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"natter\"\n}\n\nuci_get_by_type() {\n\tlocal ret=$(uci get natter.@$1[$2].$3 2>/dev/null)\n\techo ${ret:=$4}\n}\n"
  },
  {
    "path": "luci-app-natter/root/etc/uci-defaults/luci-natter",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@natter[-1]\n\tadd ucitrack natter\n\tset ucitrack.@natter[-1].init=natter\n\tcommit ucitrack\n\t\n\tdelete firewall.natter\n\tset firewall.natter=include\n\tset firewall.natter.type=script\n\tset firewall.natter.path=/var/etc/natter.include\n\tset firewall.natter.reload=1\n\tcommit firewall\nEOF\n\nexit 0"
  },
  {
    "path": "luci-app-natter/root/usr/share/luci-app-natter/log.sh",
    "content": "#!/bin/sh\n\nlog_path=$(uci get natter.@base[0].log_path 2> /dev/null)\n\nfor i in $(ls -1 ${log_path} | grep natter | grep .log)\ndo\n\tcase $1 in\n\tprint)\n\t\techo -e \"\\n======> $i <======\"\n\t\ttail -n 30 ${log_path}/$i 2> /dev/null\n\t\techo -e \"======> END of $i <======\"\n\t;;\n\tdel)\n\t\techo > ${log_path}/$i\n\t;;\n\tesac\ndone\n\nexit 0\n"
  },
  {
    "path": "luci-app-natter/root/usr/share/luci-app-natter/natcheck.sh",
    "content": "#!/bin/sh\n\n# Check=$(python3 /usr/share/natter/natter.py --check-nat 2>&1 | grep -v \"Checking\" | grep 'NAT Type for')\n\nscript_file='/usr/share/natter/natter.py'\ntmp_path=$(uci get natter.@base[0].log_path)\n[ ! \"$tmp_path\" ] && tmp_path=/tmp/natter\n\nmkdir -p $tmp_path\npython3 $script_file --check-nat 2>&1 | grep -v \"Checking\" | grep 'NAT Type for' > $tmp_path/natter_nat_type.tmp\nTCP=$(awk -F '[:]+' '/TCP/{print $2}' $tmp_path/natter_nat_type.tmp | sed 's/\\[//g;s/\\]//g')\nUDP=$(awk -F '[:]+' '/UDP/{print $2}' $tmp_path/natter_nat_type.tmp | sed 's/\\[//g;s/\\]//g')\nrm -f $tmp_path/natter_nat_type.tmp\n[ ! \"$TCP\" ] && TCP=\"未知\"\n[ ! \"$UDP\" ] && UDP=\"未知\"\n\necho \"TCP:$TCP\"\necho \"UDP:$UDP\"\n"
  },
  {
    "path": "luci-app-natter2/Makefile",
    "content": "# Copyright (C) 2020-2024 Hyy2001X <https://github.com/Hyy2001X>\r\n\r\ninclude $(TOPDIR)/rules.mk\r\n\r\nPKG_NAME:=luci-app-natter2\r\nPKG_VERSION:=1.0\r\nPKG_RELEASE:=5\r\n\r\nLUCI_TITLE:=LuCI Support for Natter v2.2.1\r\nLUCI_PKGARCH:=all\r\nLUCI_DEPENDS:=+natter2\r\n\r\ninclude $(TOPDIR)/feeds/luci/luci.mk\r\n\r\n# call BuildPackage - OpenWrt buildroot signature\r\n"
  },
  {
    "path": "luci-app-natter2/luasrc/controller/natter2.lua",
    "content": "module(\"luci.controller.natter2\",package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/natter2\")then\n\t\treturn\n\tend\n\tentry({\"admin\",\"network\",\"natter2\"},alias(\"admin\",\"network\",\"natter2\",\"base\"),_(\"Natter v2\"),99).dependent=true\n\tentry({\"admin\",\"network\",\"natter2\",\"base\"},cbi(\"natter2/base\"),_(\"Base Settings\"),10).leaf=true\n\tentry({\"admin\",\"network\",\"natter2\",\"instances\"},cbi(\"natter2/instances\")).leaf=true\n\tentry({\"admin\",\"network\",\"natter2\",\"log\"},form(\"natter2/log\"),_(\"Log\"),20).leaf=true\n\tentry({\"admin\",\"network\",\"natter2\",\"print_log\"},call(\"print_log\")).leaf=true\n\tentry({\"admin\",\"network\",\"natter2\",\"del_log\"},call(\"del_log\")).leaf=true\nend\n\nfunction print_log()\n\tluci.http.write(luci.sys.exec(\"sh /usr/share/luci-app-natter2/log.sh print\"))\nend\n\nfunction del_log()\n\tluci.http.write(luci.sys.exec(\"sh /usr/share/luci-app-natter2/log.sh del\"))\nend\n"
  },
  {
    "path": "luci-app-natter2/luasrc/model/cbi/natter2/base.lua",
    "content": "m = Map(\"natter2\", translate(\"Natter v2\"),\ntranslate(\"Expose your port behind full-cone NAT to the Internet\")\n.. [[<br /><br /><a href=\"https://github.com/MikeWang000000/Natter\">]]\n.. translate(\"Project\")\n.. [[</a>]]\n)\n\ns = m:section(TypedSection, \"base\")\ns.addremove = false\ns.anonymous = true\n\nlocal function check_file(e)\n\treturn luci.sys.exec('ls \"%s\" 2> /dev/null' % e) ~= \"\" and true or false\nend\n\nenable = s:option(Flag, \"enable\", translate(\"Enable\"))\nenable.default = 0\n\nif check_file(\"/tmp/natter2_nat_type\") then\n\tnatter_nat_type_tcp = luci.sys.exec (\"grep TCP /tmp/natter2_nat_type\")\n\tnatter_nat_type_udp = luci.sys.exec (\"grep UDP /tmp/natter2_nat_type\")\n\tnat_check = s:option (Button, \"nat_check\", translate(\"Check NAT Status\"), translate(\"\") .. \"<br><br>\" .. natter_nat_type_tcp .. \"<br><br>\" .. natter_nat_type_udp)\nelse\n\tnat_check = s:option (Button, \"nat_check\", translate(\"Check NAT Status\"), translate(\"Tips\")\n\t.. [[<br />]] .. translate(\"After clicking Exec button, please wait for the luci to refresh\"))\nend\n\nnat_check.inputtitle = translate(\"Exec\")\nnat_check.write = function()\n\tluci.sys.call (\"sh /usr/share/luci-app-natter2/nat-check.sh\")\n\tluci.http.redirect(luci.dispatcher.build_url(\"admin\", \"network\", \"natter2\", \"base\"))\nend\n\ntmp_path = s:option(Value, \"tmp_path\", translate(\"Tmp Path\"))\ntmp_path.default = \"/tmp/natter2\"\ntmp_path.placeholder = \"/tmp/natter2\"\ntmp_path.rmempty = false\n\ns = m:section(TypedSection, \"instances\", translate(\"Instances\"), translate(\"Setting up multiple instances\"))\ns.anonymous = true\ns.addremove = true\ns.template = \"cbi/tblsection\"\ns.extedit = luci.dispatcher.build_url(\"admin\", \"network\", \"natter2\", \"instances\", \"%s\")\nfunction s.create(...)\n\tlocal e=TypedSection.create(...)\n\tif e then\n\t\tluci.http.redirect(s.extedit%e)\n\t\treturn\n\tend\nend\n\nenable_instance = s:option(Flag, \"enable_instance\", translate(\"Enable\"))\nenable_instance.default = 1\nenable_instance.width = \"5%\"\n\nremark = s:option(DummyValue,\"remark\",translate(\"Remark\"))\nremark.width = \"5%\"\n\nprotocol = s:option(DummyValue,\"protocol\",translate(\"Protocol\"))\nremark.width = \"5%\"\n\ntmp_public_port = s:option(DummyValue, \"tmp_public_port\", translate(\"Public Port\"))\nremark.width = \"5%\"\n\ntarget_address = s:option(DummyValue, \"target_address\", translate(\"Target Address\"))\nremark.width = \"5%\"\n\ntarget_port = s:option(DummyValue, \"target_port\", translate(\"Target Port\"))\nremark.width = \"5%\"\n\nnotify_path = s:option(DummyValue, \"notify_path\", translate(\"Notify Script Path\"))\nremark.width = \"5%\"\n\nreturn m\n"
  },
  {
    "path": "luci-app-natter2/luasrc/model/cbi/natter2/instances.lua",
    "content": "m = Map(\"natter2\", translate(\"Instances Settings\"),\n\ttranslate(\"\")\n\t.. [[<a href=\"https://github.com/MikeWang000000/Natter/blob/master/docs/usage.md\">]]\n\t.. translate(\"Instructions\")\n\t.. [[</a>]])\nm.redirect = luci.dispatcher.build_url(\"admin\", \"network\", \"natter2\")\n\ns = m:section(NamedSection, arg[1], \"instances\", \"\")\ns.addremove = false\ns.dynamic = false\n\nlocal function check_binary(e)\n\treturn luci.sys.exec('which \"%s\" 2> /dev/null' % e) ~= \"\" and true or false\nend\n\nenable_instance = s:option(Flag, \"enable_instance\", translate(\"Enable\"))\n\nlocal e = luci.sys.exec(\"cut -d '-' -f1 /proc/sys/kernel/random/uuid 2> /dev/null\")\nid = s:option(Value, \"id\", translate(\"ID\"))\nid.default = e\n\nremark = s:option(Value, \"remark\", translate(\"Remark\"))\nremark.rmempty=false\n\nprotocol = s:option(ListValue, \"protocol\", translate(\"Protocol\"))\nprotocol:value('tcp', translate(\"TCP\"))\nprotocol:value('udp', translate(\"UDP\"))\nprotocol.default = 'tcp'\n\nenable_stun_server = s:option(Flag, \"enable_stun_server\", translate(\"Enable Stun Server\"), translate(\"Using customized STUN server\"))\nstun_server = s:option(DynamicList, \"stun_server\", translate(\"STUN Server\"))\nstun_server.rmempty = true\nstun_server:depends({enable_stun_server = \"1\"})\n\nenable_keepalive_server = s:option(Flag, \"enable_keepalive_server\", translate(\"Enable Keepalive Server\"), translate(\"Using customized Keepalive server\"))\nkeepalive_server = s:option(Value, \"keepalive_server\", translate(\"Keepalive Server\"))\nkeepalive_server.rmempty = true\nkeepalive_server:depends({enable_keepalive_server = \"1\"})\n\ninterval = s:option(Value, \"interval\", translate(\"Interval (Seconds)\"), translate(\"The number of seconds between keepalive\"))\ninterval.default = 15\ninterval.datatype = \"uinteger\"\nenable_upnp_service = s:option(Flag, \"enable_upnp_service\", translate(\"Enable UPnP Service\"),\n\ttranslate(\"Using UPnP to map ports on your device\"))\n\nenable_binding = s:option(Flag, \"enable_binding\", translate(\"Enable Binding Options\"), translate(\"Usually there is no need to enable binding\"))\nenable_binding.rmempty = true\nbinding_interface = s:option(Value, \"binding_interface\", translate(\"Binding Interface\"))\nbinding_interface.rmempty = true\nbinding_interface.default = '0.0.0.0'\nbinding_interface:depends({enable_binding = \"1\"})\n\nbinding_port = s:option(Value, \"binding_port\", translate(\"Binding Port\"))\nbinding_port.rmempty = true\nbinding_port.default = '0'\nbinding_port:depends({enable_binding = \"1\"})\n\nenable_forwarding = s:option(Flag, \"enable_forwarding\", translate(\"Enable Forwarding Options\"), translate(\"Forwarding to internal devices\"))\n\nforwarding_method = s:option(ListValue, \"forwarding_method\", translate(\"Forwarding Method\"),\n\ttranslate(\"\")\n\t.. [[<a href=\"https://github.com/MikeWang000000/Natter/blob/master/docs/forward.md\">]]\n\t.. translate(\"Instructions for forwarding method\")\n\t.. [[</a>]])\nforwarding_method:value('socket', translate(\"socket (Not Recommended)\"))\nif check_binary(\"iptables\") then\n\tforwarding_method:value('iptables', translate(\"iptables (Recommended)\"))\nend\nif check_binary(\"nft\") then\n\tforwarding_method:value('nftables', translate(\"nftables (Recommended)\"))\nend\nif check_binary(\"socat\") then\n\tforwarding_method:value('socat', translate(\"socat\"))\nend\nif check_binary(\"gost\") then\n\tforwarding_method:value('gost', translate(\"gost\"))\nend\nforwarding_method.default = 'socket'\nforwarding_method:depends({enable_forwarding = \"1\"})\n\ntarget_address = s:option(Value, \"target_address\", translate(\"Target Address\"))\ntarget_address.datatype = \"ipmask4\"\nluci.sys.net.ipv4_hints(\n\tfunction(ip, name)\n\ttarget_address:value(ip, \"%s (%s)\" %{ ip, name })\n\tend)\ntarget_address:depends({enable_forwarding = \"1\"})\n\ntarget_port = s:option(Value, \"target_port\", translate(\"Target Port\"))\ntarget_port.datatype = \"port\"\ntarget_port:depends({enable_forwarding = \"1\"})\n\nenable_forwarding_retry = s:option(Flag, \"enable_forwarding_retry\", translate(\"Enable Forwarding Retry\"), translate(\"Retry until the target port is open\"))\nenable_forwarding_retry:depends({enable_forwarding = \"1\"})\nenable_forwarding_retry.default = 1\nenable_forwarding_retry.rmempty = false\n\nenable_quit = s:option(Flag, \"enable_quit\", translate(\"Enable Quit\"), translate(\"Exit immediately when the mapping address changes\"))\nenable_quit.default = \"0\"\n\ndelay = s:option(Value,\"delay\", translate(\"Start delay (Seconds)\"), translate(\"Time to wait before starting this instance\"))\ndelay.default = 0\ndelay.datatype = \"uinteger\"\ndelay.rmempty = false\n\nlog_level = s:option(ListValue, \"log_level\", translate(\"Log Level\"))\nlog_level:value('normal', translate(\"Normal\"))\nlog_level:value('verbose', translate(\"Verbose\"))\n\nenable_notify = s:option(Flag,\"enable_notify\", translate(\"Enable Notify Script\"))\nenable_notify.rmempty = false\nnotify_path = s:option(Value, \"notify_path\", translate(\"Notify Script Path\"),\n\ttranslate(\"\")\n\t.. [[<a href=\"https://github.com/MikeWang000000/Natter/blob/master/docs/script.md\">]]\n\t.. translate(\"Instructions for using the notification script\")\n\t.. [[</a>]])\nnotify_path.rmempty = true\nnotify_path.default = \"/usr/share/luci-app-natter2/notify-example.sh\"\nnotify_path:depends({enable_notify = \"1\"})\n\nreturn m\n"
  },
  {
    "path": "luci-app-natter2/luasrc/model/cbi/natter2/log.lua",
    "content": "log = SimpleForm(\"natter2\")\nlog.reset = false\nlog.submit = false\nlog:append(Template(\"natter2/natter_log\"))\n\nreturn log\n"
  },
  {
    "path": "luci-app-natter2/luasrc/view/natter2/natter_log.htm",
    "content": "<script type=\"text/javascript\">\n\t//<![CDATA[\n\tfunction del_log(btn) {\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin/network/natter2/del_log\")%>', null,\n\t\t\tfunction(x, data) {\n\t\t\t\tif(x && x.status == 200) {\n\t\t\t\t\tvar log_textarea = document.getElementById('log_textarea');\n\t\t\t\t\tlog_textarea.innerHTML = \"\";\n\t\t\t\t\tlog_textarea.scrollTop = log_textarea.scrollHeight;\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\tXHR.poll(5, '<%=luci.dispatcher.build_url(\"admin/network/natter2/print_log\")%>', null,\n\t\tfunction(x, data) {\n\t\t\tif(x && x.status == 200) {\n\t\t\t\tvar log_textarea = document.getElementById('log_textarea');\n\t\t\t\tlog_textarea.innerHTML = x.responseText;\n\t\t\t\tlog_textarea.scrollTop = log_textarea.scrollHeight;\n\t\t\t}\n\t\t}\n\t);\n\t//]]>\n</script>\n\n<fieldset class=\"cbi-section\" id=\"_log_fieldset\" >\n\t<input class=\"cbi-button cbi-input-remove\" type=\"button\" onclick=\"del_log()\" value=\"<%:Delete Logs%>\" />\n\t<textarea id=\"log_textarea\" class=\"cbi-input-textarea\" style=\"width: 100%;margin-top: 10px;\" data-update=\"change\" rows=\"30\" wrap=\"off\" readonly=\"readonly\"></textarea>\n</fieldset>\n"
  },
  {
    "path": "luci-app-natter2/po/zh_Hans/natter2.po",
    "content": "msgid \"Natter v2\"\r\nmsgstr \"Natter v2 测试版\"\r\n\r\nmsgid \"Base Settings\"\r\nmsgstr \"基础设置\"\r\n\r\nmsgid \"Log\"\r\nmsgstr \"日志\"\r\n\r\nmsgid \"Expose your port behind full-cone NAT to the Internet\"\r\nmsgstr \"将 FullCone NAT (NAT 1) 后的端口，打洞暴露至互联网\"\r\n\r\nmsgid \"Project\"\r\nmsgstr \"项目地址\"\r\n\r\nmsgid \"Enable\"\r\nmsgstr \"启用\"\r\n\r\nmsgid \"Check NAT Status\"\r\nmsgstr \"NAT 类型检测\"\r\n\r\nmsgid \"Proxy programs may affect NAT types\"\r\nmsgstr \"代理程序可能会影响 NAT 类型\"\r\n\r\nmsgid \"Tmp Path\"\r\nmsgstr \"临时路径\"\r\n\r\nmsgid \"Instances\"\r\nmsgstr \"实例\"\r\n\r\nmsgid \"Setting up multiple instances\"\r\nmsgstr \"设置多个实例\"\r\n\r\nmsgid \"Remark\"\r\nmsgstr \"备注\"\r\n\r\nmsgid \"Public Port\"\r\nmsgstr \"公开端口\"\r\n\r\nmsgid \"Target Address\"\r\nmsgstr \"目标地址\"\r\n\r\nmsgid \"Target Port\"\r\nmsgstr \"目标端口\"\r\n\r\nmsgid \"Notify Script Path\"\r\nmsgstr \"通知脚本路径\"\r\n\r\nmsgid \"Enable Stun Server\"\r\nmsgstr \"自定义 STUN 服务器\"\r\n\r\nmsgid \"STUN Server\"\r\nmsgstr \"STUN 服务器\"\r\n\r\nmsgid \"Enable Keepalive Server\"\r\nmsgstr \"自定义保活服务器\"\r\n\r\nmsgid \"Keepalive Server\"\r\nmsgstr \"保活服务器\"\r\n\r\nmsgid \"Interval (Seconds)\"\r\nmsgstr \"保活间隔（秒）\"\r\n\r\nmsgid \"The number of seconds between keepalive\"\r\nmsgstr \"每次保活的间隔秒数\"\r\n\r\nmsgid \"Enable Binding Options\"\r\nmsgstr \"启用绑定\"\r\n\r\nmsgid \"Binding Interface\"\r\nmsgstr \"绑定接口\"\r\n\r\nmsgid \"Binding Port\"\r\nmsgstr \"绑定端口\"\r\n\r\nmsgid \"Enable Forwarding Options\"\r\nmsgstr \"启用转发\"\r\n\r\nmsgid \"Forwarding to internal devices\"\r\nmsgstr \"转发至内部设备\"\r\n\r\nmsgid \"Forwarding Method\"\r\nmsgstr \"转发方式\"\r\n\r\nmsgid \"Instructions for forwarding method\"\r\nmsgstr \"转发方式说明\"\r\n\r\nmsgid \"socket (Not Recommended)\"\r\nmsgstr \"Socket（内置, 不推荐）\"\r\n\r\nmsgid \"iptables (Recommended)\"\r\nmsgstr \"iptables（防火墙, 推荐）\"\r\n\r\nmsgid \"nftables (Recommended)\"\r\nmsgstr \"nftables（防火墙, 推荐）\"\r\n\r\nmsgid \"Target Address\"\r\nmsgstr \"目标地址\"\r\n\r\nmsgid \"Target Port\"\r\nmsgstr \"目标端口\"\r\n\r\nmsgid \"Enable Forwarding Retry\"\r\nmsgstr \"自动重试\"\r\n\r\nmsgid \"Retry until the target port is open\"\r\nmsgstr \"重试直至目标端口开放\"\r\n\r\nmsgid \"Enable Quit\"\r\nmsgstr \"自动退出\"\r\n\r\nmsgid \"Exit immediately when the mapping address changes\"\r\nmsgstr \"映射地址改变时立即退出\"\r\n\r\nmsgid \"Time to wait before starting this instance\"\r\nmsgstr \"启动该实例前等待的时间\"\r\n\r\nmsgid \"Enable Notify Script\"\r\nmsgstr \"启用通知脚本\"\r\n\r\nmsgid \"Instructions for using the notification script\"\r\nmsgstr \"通知脚本说明\"\r\n\r\nmsgid \"Start delay (Seconds)\"\r\nmsgstr \"启动延时（秒）\"\r\n\r\nmsgid \"Log Level\"\r\nmsgstr \"日志级别\"\r\n\r\nmsgid \"Normal\"\r\nmsgstr \"正常\"\r\n\r\nmsgid \"Verbose\"\r\nmsgstr \"详细\"\r\n\r\nmsgid \"Instructions\"\r\nmsgstr \"使用说明\"\r\n\r\nmsgid \"Using customized STUN server\"\r\nmsgstr \"使用自定义的 STUN 服务器\"\r\n\r\nmsgid \"Using customized Keepalive server\"\r\nmsgstr \"使用自定义的保活服务器\"\r\n\r\nmsgid \"Tips\"\r\nmsgstr \"提示\"\r\n\r\nmsgid \"After clicking Exec button, please wait for the luci to refresh\"\r\nmsgstr \"点击执行后，请耐心等待页面自动刷新\"\r\n\r\nmsgid \"Enable UPnP Service\"\r\nmsgstr \"启用 UPnP 服务\"\r\n\r\nmsgid \"Enable UPnP Service\"\r\nmsgstr \"使用 UPnP 映射设备上的端口\"\r\n"
  },
  {
    "path": "luci-app-natter2/root/etc/config/natter2",
    "content": "\nconfig base\n\toption tmp_path '/tmp/natter2'\n\toption enable '0'\n"
  },
  {
    "path": "luci-app-natter2/root/etc/init.d/natter2",
    "content": "#!/bin/sh /etc/rc.common\n\nUSE_PROCD=1\nSTART=98\nscript_path=\"/usr/share/natter2/natter.py\"\n\nstart_service() {\n\tlocal basic_list=\"enable tmp_path\"\n\tlocal instance_list=\"enable_instance id remark protocol enable_stun_server \\\n\t\tstun_server enable_keepalive_server keepalive_server \\\n\t\tinterval enable_bonding bonding_interface bonding_port \\\n\t\tenable_forwarding forwarding_method target_address target_port \\\n\t\tenable_forwarding_retry enable_quit delay log_level enable_notify \\\n\t\tnotify_path enable_upnp_service\"\n\t\n\tfor i in $basic_list; do\n\t\tlocal eval $i=\"$(uci_get_by_type base 0 $i)\"\n\tdone ; unset i\n\n\tif [ \"$enable\" == 1 ]; then\n\t\tmkdir -p ${tmp_path}\n\t\tmkdir -p /var/etc/natter2\n\n\t\tfor u in $(seq 0 $(($(uci show natter2 2> /dev/null | grep -E '@instances\\[[0-9]\\]+=instances' | wc -l) - 1)))\n\t\tdo\n\t\t\tfor i in $instance_list; do\n\t\t\t\tlocal eval $i=\"$(uci_get_by_type instances $u $i)\"\n\t\t\tdone ; unset i\n\n\t\t\t[ \"$enable_instance\" != 1 ] && continue\n\t\t\tscript_command=\"\"\n\t\t\t\n\t\t\t[ \"$protocol\" == udp ] && script_command=\"$script_command -u\"\n\t\t\t\n\t\t\tif [ \"$enable_stun_server\" == 1 ]; then\n\t\t\t\tfor i in $stun_server; do\n\t\t\t\t\tscript_command=\"$script_command -s $i\"\n\t\t\t\tdone ; unset i\n\t\t\tfi\n\t\t\t\n\t\t\t[ \"$enable_keepalive_server\" == 1 ] && script_command=\"$script_command -h $keepalive_server\"\n\t\t\t[ \"$interval\" ] && script_command=\"$script_command -k $interval\"\n\t\t\t[ \"$enable_upnp_service\" == 1 ] && script_command=\"$script_command -U\"\n\n\t\t\tif [ \"$enable_bonding\" == 1 ]; then\n\t\t\t\t[ \"$bonding_interface\" ] && script_command=\"$script_command -i $bonding_interface\"\n\t\t\t\t[ \"$bonding_port\" ] && script_command=\"$script_command -b $bonding_port\"\n\t\t\tfi\n\t\t\t\n\t\t\tif [ \"$enable_forwarding\" == 1 ]; then\n\t\t\t\t[ \"$forwarding_method\" ] && script_command=\"$script_command -m $forwarding_method\"\n\t\t\t\t[ \"$target_address\" ] && script_command=\"$script_command -t $target_address\"\n\t\t\t\t[ \"$target_port\" ] && script_command=\"$script_command -p $target_port\"\n\t\t\t\t[ \"$enable_forwarding_retry\" == 1 ] && script_command=\"$script_command -r\"\n\t\t\tfi\n\t\t\t\n\t\t\t[ \"$enable_quit\" == 1 ] && script_command=\"$script_command -q\"\n\t\t\t[ \"$log_level\" == \"verbose\" ] && script_command=\"$script_command -v\"\n\t\t\t\n\t\t\tif [ \"$enable_notify\" == 1 ]; then\n\t\t\t\techo \"$notify_path\" > /var/etc/natter2/${id}-notify\n\t\t\t\tvar_file=/var/etc/natter2/${id}-${u}-1\n\t\t\telse\n\t\t\t\tvar_file=/var/etc/natter2/${id}-${u}-0\n\t\t\tfi\n\t\t\t\n\t\t\tcp -a /usr/share/luci-app-natter2/notify-base.sh $var_file\n\t\t\tchmod +x $var_file\n\t\t\t\n\t\t\tprocd_open_instance \"natter2_${id}\"\n\t\t\tprocd_set_param command $(command -v python) \"$script_path\" $script_command -e $var_file\n\t\t\t\n\t\t\tprocd_set_param stdout 1\n\t\t\tprocd_set_param stderr 1\n\t\t\t\n\t\t\t[ -n \"$delay\" ] && procd_set_param delay \"$delay\"\n\t\t\tprocd_set_param respawn\n\t\t\t\n\t\t\tprocd_close_instance\n\n\t\t\tfor i in $instance_list; do\n\t\t\t\tunset $(echo $i)\n\t\t\tdone ; unset i\n\t\t\tunset script_command\n\t\tdone ; unset u\n\telse\n\t\tstop_service\n\tfi\n}\n\nstop_service() {\n\trm -rf \"/var/etc/natter2\" 2> /dev/null\n\tfor u in $(seq 0 $(($(uci show natter2 2> /dev/null | grep -E '@instances\\[[0-9]\\]+=instances' | wc -l) - 1)))\n\tdo\n\t\tuci set natter2.@instances[$u].tmp_public_port=\"\"\n\t\tuci commit natter2\n\tdone\n\trm -f /tmp/natter2_nat_type\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"natter2\"\n}\n\nuci_get_by_type() {\n\tlocal ret=$(uci get natter2.@$1[$2].$3 2>/dev/null)\n\techo ${ret:=$4}\n}"
  },
  {
    "path": "luci-app-natter2/root/etc/uci-defaults/luci-natter2",
    "content": "#!/bin/sh\r\n\r\nuci -q batch <<-EOF >/dev/null\r\n\tdelete ucitrack.@natter2[-1]\r\n\tadd ucitrack natter2\r\n\tset ucitrack.@natter2[-1].init=natter2\r\n\tcommit ucitrack\r\nEOF\r\n\r\nexit 0\r\n"
  },
  {
    "path": "luci-app-natter2/root/usr/share/luci-app-natter2/log.sh",
    "content": "#!/bin/sh\n\nlog_path=$(uci get natter2.@base[0].tmp_path 2> /dev/null)\n\nfor i in $(ls -1 ${log_path} | grep natter2 | grep .log)\ndo\n\tcase $1 in\n\tprint)\n\t\techo -e \"\\n======> $i <======\"\n\t\ttail -n 30 ${log_path}/$i 2> /dev/null\n\t\techo -e \"======> END of $i <======\"\n\t;;\n\tdel)\n\t\techo > ${log_path}/$i\n\t;;\n\tesac\ndone\n\nexit 0\n"
  },
  {
    "path": "luci-app-natter2/root/usr/share/luci-app-natter2/nat-check.sh",
    "content": "#!/bin/sh\n\nscript_file='/usr/share/natter2/natter-check/natter-check.py'\nnatter2_nat_type_file=\"/tmp/natter2_nat_type\"\ntmp_natter2_nat_type_file=\"/tmp/tmp_natter2_nat_type\"\n\nrm -f $natter2_nat_type_file\nrm -f $tmp_natter2_nat_type_file\n\n$(which python) $script_file | egrep 'Checking TCP|Checking UDP' > $tmp_natter2_nat_type_file\nTCP=$(awk -F '[:]+' '/TCP/{print $2}' $tmp_natter2_nat_type_file | sed 's/\\[//g;s/\\]//g')\nUDP=$(awk -F '[:]+' '/UDP/{print $2}' $tmp_natter2_nat_type_file | sed 's/\\[//g;s/\\]//g')\n\n[ ! \"$TCP\" ] && TCP=\"未知\"\n[ ! \"$UDP\" ] && UDP=\"未知\"\n\nfunction NAT_Type() {\n\tcase $1 in\n\t0)\n\t\techo \"Public Network\"\n\t;;\n\t1)\n\t\techo \"Full Cone\"\n\t;;\n\t2)\n\t\techo \"Restricted Cone\"\n\t;;\n\t3)\n\t\techo \"Port Restricted Cone\"\n\t;;\n\t4)\t\n\t\techo \"Symmetric\"\n\t;;\n\tesac\n}\necho \"TCP: NAT $TCP | $(NAT_Type $TCP)\" > $natter2_nat_type_file\necho \"UDP: NAT $UDP | $(NAT_Type $UDP)\" >> $natter2_nat_type_file\n\nrm -f $tmp_natter2_nat_type_file"
  },
  {
    "path": "luci-app-natter2/root/usr/share/luci-app-natter2/notify-base.sh",
    "content": "#!/bin/sh\n\nprotocol=\"$1\"; private_ip=\"$2\"; private_port=\"$3\"; public_ip=\"$4\"; public_port=\"$5\"\n\nscript_name=$(basename $0)\nscript_path=$(dirname $0)\ninstance_id=$(echo $script_name | cut -d '-' -f1)\ninstance_num=$(echo $script_name | cut -d '-' -f2)\ninstance_isnotify=$(echo $script_name | cut -d '-' -f3)\n\n# echo script_path:$script_path\n# echo script_name:$script_name\n# echo instance_id:$instance_id\n# echo instance_num:$instance_num\n# echo instance_isnotify:$instance_isnotify\n\nuci set natter2.@instances[$instance_num].tmp_public_port=\"$public_port\"\nuci commit natter2\n\nif [ \"$instance_isnotify\" == 1 ]\nthen\n\tnotify_path=$(cat $script_path/${instance_id}-notify)\n\tif [ -f \"${notify_path}\" ]\n\tthen\n\t\tchmod +x ${notify_path}\n\t\t${notify_path} $1 $2 $3 $4 $5\n\tfi\nfi\n"
  },
  {
    "path": "luci-app-natter2/root/usr/share/luci-app-natter2/notify-example.sh",
    "content": "#!/bin/sh\n\n# 参数序号\t\t参数说明\t\t参数格式\n#\t1\t\t传输层协议\t\ttcp, udp 二者之一\n#\t2\t\t内部 IP\t\t点分十进制 IPv4 地址\n#\t3\t\t内部端口\t\t1 - 65535 的整数\n#\t4\t\t外部 IP\t\t点分十进制 IPv4 地址\n#\t5\t\t外部端口\t\t1 - 65535 的整数\n\nprotocol=\"$1\"; private_ip=\"$2\"; private_port=\"$3\"; public_ip=\"$4\"; public_port=\"$5\"\n\necho $1 $2 $3 $4 $5\n"
  },
  {
    "path": "luci-app-nginx-manager/Makefile",
    "content": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for NginxManager From sundaqiang\nLUCI_DEPENDS:=+luci-nginx +luci-ssl-nginx +luci-ssl-openssl\nLUCI_PKGARCH:=all\nPKG_VERSION:=1.0\nPKG_RELEASE:=20211030\nPKG_MAINTAINER:=sundaqiang\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-nginx-manager/luasrc/controller/nginx-manager.lua",
    "content": "module(\"luci.controller.nginx-manager\", package.seeall)\n\nfunction index()\n    nixio.fs.rename (\"/etc/nginx/uci.conf\", \"/etc/nginx/ucibak.conf\")\n    if not nixio.fs.access(\"/etc/nginx/nginx.conf\") then\n        nixio.fs.copyr(\"/var/lib/nginx/uci.conf\", \"/etc/nginx/nginx.conf\")\n        luci.sys.call(\"/etc/init.d/nginx restart\")\n    end\n    file=nixio.fs.readfile(\"/etc/uwsgi/vassals/luci-webui.ini\")\n    if tonumber(file:match(\"limit%pas[%p%s]+(%d+)\")) < 5000 then\n    \tfile=file:gsub(\"limit%pas[%p%s]+(%d+)\",\"limit-as = 5000\")\n    \tnixio.fs.writefile(\"/etc/uwsgi/vassals/luci-webui.ini\", file)\n    \tluci.sys.call(\"/etc/init.d/uwsgi restart\")\n    end\n    nixio.fs.writefile(\"/etc/config/nginx-manager\", \"\")\n    x = luci.model.uci.cursor()\n    x:set(\"nginx-manager\", \"main\", \"nginx\")\n    x:set(\"nginx-manager\", \"main\", \"name\", \"main\")\n    x:set(\"nginx-manager\", \"main\", \"filepath\", \"/etc/nginx/nginx.conf\")\n    for path in nixio.fs.dir(\"/etc/nginx/conf.d\") do\n        if path:find(\".conf$\") ~= nil then\n            name = path:gsub(\".conf\", \"\")\n            x:set(\"nginx-manager\", name, \"nginx\")\n            x:set(\"nginx-manager\", name, \"name\", name)\n            x:set(\"nginx-manager\", name, \"filepath\", \"/etc/nginx/conf.d/\" .. path)\n    \tend\n    end\n    x:commit(\"nginx-manager\")\n    entry({\"admin\", \"services\", \"nginx-manager\"}, cbi(\"nginx-manager\"), _(\"Nginx Manager\"), 95).dependent = true\n    entry({\"admin\", \"services\", \"nginx-manager\", \"setstatus\"}, call(\"setstatus\")).leaf = true\nend\n\nfunction setstatus()\n\tlocal e = {}\n\tlocal mode = luci.http.formvalue('mode')\n\te.code=luci.sys.call(\"/etc/init.d/nginx \" .. mode)\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend"
  },
  {
    "path": "luci-app-nginx-manager/luasrc/model/cbi/nginx-manager.lua",
    "content": "local fs = require \"nixio.fs\"\nlocal m = Map(\"nginx-manager\",translate(\"Nginx Manager\"), translate(\"A simple Nginx manager\") .. [[<br /><br /><a href=\"https://github.com/sundaqiang/openwrt-packages\" target=\"_blank\"></a>]])\ns = m:section(TypedSection, \"nginx\", translate(\"Web site list\"))\ns.template = \"nginx-manager/index\"\ns.addremove = true\ns.anonymous = false\ns:tab(\"general\", translate(\"General Info\"))\ns:tab(\"server\", translate(\"Configuration File\"))\ns:taboption(\"general\", DummyValue, \"name\", translate(\"name\"))\ns:taboption(\"general\", DummyValue, \"filepath\", translate(\"File Path\"))\nfile=s:taboption(\"server\", TextValue, \"\")\nfile.template = \"cbi/tvalue\"\nfile.rows = 25\nfile.wrap = \"off\"\nfile.rmempty = true\n\nfunction s.create(self,section)\n    path=\"/etc/nginx/conf.d/\" .. section .. \".conf\"\n    fs.copyr(\"/etc/nginx/conf.d/templates\", path)\n    TypedSection.create(self,section)\n    self.map:set(section, \"name\", section)\n    self.map:set(section, \"filepath\", path)\n    return true\nend\nfunction s.remove(self,section)\n    path=\"/etc/nginx/conf.d/\" .. section .. \".conf\"\n    fs.remove(path)\n    TypedSection.remove(self,section)\nend\nfunction sync_value_to_file(value, file)\n\tvalue = value:gsub(\"\\r\\n?\", \"\\n\")\n\tlocal old_value = fs.readfile(file)\n\tif value ~= old_value then\n\t\tfs.writefile(file, value)\n\tend\nend\nfunction file.cfgvalue(self,section)\n\treturn fs.readfile(self.map:get(section, \"filepath\")) or \"\"\nend\nfunction file.write(self, section, value)\n\tsync_value_to_file(value, self.map:get(section, \"filepath\"))\nend\nreturn m\n"
  },
  {
    "path": "luci-app-nginx-manager/luasrc/view/nginx-manager/index.htm",
    "content": "<fieldset class=\"cbi-section\" id=\"cbi-<%=self.config%>-<%=self.sectiontype%>\">\n\t<% if self.title and #self.title > 0 then -%>\n\t\t<legend><%=self.title%></legend>\n\t<%- end %>\n\t<% if self.description and #self.description > 0 then -%>\n\t\t<div class=\"cbi-section-descr\"><%=self.description%></div>\n\t<%- end %>\n\t<div class=\"cbi-value\" style=\"border-bottom: 1px solid #ddd;border-radius: 0px\">\n        <label class=\"cbi-value-title\"><%= translate(\"Restart the nginx\") %></label>\n        <div class=\"cbi-value-field\" style=\"padding:unset\">\n            <input class=\"btn cbi-button cbi-button-reload\" id=\"restart\" type=\"button\" size=\"0\" onclick=\"check_status('restart')\" value=\"<%:Restart%>\" />\n        </div>\n        <label class=\"cbi-value-title\"><%= translate(\"Reload the nginx\") %></label>\n        <div class=\"cbi-value-field\" style=\"padding:unset\">\n            <input class=\"btn cbi-button cbi-button-reload\" id=\"reload\" type=\"button\" size=\"0\" onclick=\"check_status('reload')\" value=\"<%:Reload%>\" />\n        </div>\n\t</div>\n\t<% local isempty = true for i, k in ipairs(self:cfgsections()) do -%>\n\t\t<%- section = k; isempty = false -%>\n\n\t\t<% if not self.anonymous then -%>\n\t\t\t<div class=\"cbi-section-remove\" style=\"display: flex;flex-flow: row nowrap;justify-content: space-between\">\n\t\t\t    <span style=\"font-size:1.15rem;color:#32325d;font-weight:bold;letter-spacing:0.1rem;padding:1rem 1.5rem;\"><%=section:upper()%></span>\n\t\t\t\t<input type=\"submit\" name=\"cbi.rts.<%=self.config%>.<%=k%>\" onclick=\"this.form.cbi_state='del-section'; return true\" value=\"<%:Delete%>\" class=\"cbi-button\" />\n\t\t\t</div>\n\t\t<%- end %>\n\n\t\t<%+cbi/tabmenu%>\n\n\t\t<fieldset class=\"cbi-section-node<% if self.tabs then %> cbi-section-node-tabbed<% end %>\" id=\"cbi-<%=self.config%>-<%=section%>\" style=\"border-bottom: 1px solid #ddd;border-radius: 0px\">\n\t\t\t<%+cbi/ucisection%>\n\t\t</fieldset>\n\t<%- end %>\n\n\t<% if isempty then -%>\n\t\t<em><%:This section contains no values yet%><br /><br /></em>\n\t<%- end %>\n\n\t<% if self.addremove then -%>\n\t\t<% if self.template_addremove then include(self.template_addremove) else -%>\n\t\t<div class=\"cbi-section-create\">\n\t\t\t<% if self.anonymous then -%>\n\t\t\t\t<input type=\"submit\" class=\"cbi-button cbi-button-add\" name=\"cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>\" value=\"<%:Add%>\" />\n\t\t\t<%- else -%>\n\t\t\t\t<% if self.invalid_cts then -%><div class=\"cbi-section-error\"><% end %>\n\t\t\t\t<input type=\"text\" class=\"cbi-section-create-name\" id=\"cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>\" name=\"cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>\" data-type=\"uciname\" data-optional=\"true\" />\n\t\t\t\t<input type=\"submit\" class=\"cbi-button cbi-button-add\" onclick=\"this.form.cbi_state='add-section'; return true\" value=\"<%:Add%>\" />\n\t\t\t\t<% if self.invalid_cts then -%>\n\t\t\t\t\t<br /><%:Invalid%></div>\n\t\t\t\t<%- end %>\n\t\t\t<%- end %>\n\t\t</div>\n\t\t<%- end %>\n\t<%- end %>\n</fieldset>\n<style>.cbi-value-field {padding: 11.2px;}.cbi-tabmenu {border-bottom: unset !important;}</style>\n<script type=\"text/javascript\">\nfunction check_status(mode) {\n    const tb = document.getElementById(mode);\n    tb.disabled = true;\n    XHR.get('<%=url([[admin]], [[services]], [[nginx-manager]], [[setstatus]])%>', {mode: mode}, (x, r) => {\n        tb.disabled = false;\n    });\n}\n</script>"
  },
  {
    "path": "luci-app-nginx-manager/po/zh_Hans/nginx-manager.po",
    "content": "msgid \"Nginx Manager\"\nmsgstr \"Nginx管理器\"\n\nmsgid \"A simple Nginx manager\"\nmsgstr \"一个简易的Nginx管理器\"\n\nmsgid \"Web site list\"\nmsgstr \"网站列表\"\n\nmsgid \"Restart the nginx\"\nmsgstr \"重新启动Nginx\"\n\nmsgid \"Reload the nginx\"\nmsgstr \"重新加载Nginx\"\n\nmsgid \"Reload\"\nmsgstr \"重新加载\"\n\nmsgid \"Configuration File\"\nmsgstr \"配置文件\"\n\nmsgid \"General Info\"\nmsgstr \"基础信息\"\n\nmsgid \"File Path\"\nmsgstr \"文件路径\""
  },
  {
    "path": "luci-app-nginx-manager/root/etc/nginx/conf.d/templates",
    "content": "server {\n  listen 8080; #bind prot 绑定的端口\n  root /www; #directory 网站路径\n  ssl_session_timeout 5m;\n  gzip on;\n  gzip_types text/plain application/json application/javascript application/x-javascript text/css application/xml text/javascript;\n  gzip_proxied  any;\n  gzip_vary on;\n  gzip_comp_level 6;\n  gzip_buffers 16 8k;\n  gzip_http_version 1.0;  \n\n  location / {\n    index  index.html index.htm; #默认文件\n    try_files $uri $uri/ /index.html;\n  }\n}\n"
  },
  {
    "path": "luci-app-nginx-manager/root/etc/uci-defaults/luci-app-nginx-manager",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@nginx-manager[-1]\n\tadd ucitrack nginx-manager\n\tset ucitrack.@nginx-manage[-1].init=nginx\n\tcommit ucitrack\nEOF\n\nrm -f /tmp/luci-indexcache\nexit 0\n"
  },
  {
    "path": "luci-app-nginx-manager/root/usr/share/rpcd/acl.d/luci-app-nginx-manager.json",
    "content": "{\n\t\"luci-app-nginx-manager\": {\n\t\t\"description\": \"Grant UCI access for luci-app-nginx-manager\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"nginx-manager\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"nginx-manager\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/Makefile",
    "content": "# Copyright (C) 2020 Lienol <lawlienol@gmail.com>\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-nginx-pingos\nPKG_VERSION:=1.19.6\nPKG_RELEASE:=2\n\nPKG_SOURCE:=nginx-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://nginx.org/download/\nPKG_HASH:=b11195a02b1d3285ddf2987e02c6b6d28df41bb1b1dd25f33542848ef4fc33b5\n\nPKG_DIR:=$(BUILD_DIR)/$(PKG_NAME)\nPKG_BUILD_DIR:=$(PKG_DIR)/nginx-$(PKG_VERSION)\n\nPKG_FIXUP:=autoreconf\nPKG_BUILD_PARALLEL:=1\nPKG_INSTALL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n  CATEGORY:=LuCI\n  SUBMENU:=3. Applications\n  TITLE:=PingOS server\n  PKGARCH:=all\n  URL:=https://pingos.io/\n  DEPENDS:=+libpcre +libopenssl +zlib +libpthread\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\nendef\n\ndefine Build/Prepare\n\trm -r $(PKG_BUILD_DIR)\n\tmkdir -p $(PKG_BUILD_DIR)\n\ttar -zxvf $(DL_DIR)/$(PKG_SOURCE) -C $(PKG_DIR)\n\t$(CP) -pR ./modules $(PKG_BUILD_DIR)/modules\n\t$(call Build/Prepare/Default,)\nendef\n\nADDITIONAL_MODULES:= --with-http_ssl_module \\\n\t--add-module=./modules/nginx-rtmp-module \\\n\t--add-module=./modules/nginx-client-module \\\n\t--add-module=./modules/nginx-multiport-module \\\n\t--add-module=./modules/nginx-toolkit-module\n\nTARGET_CFLAGS += -fvisibility=hidden -ffunction-sections -fdata-sections -DNGX_LUA_NO_BY_LUA_BLOCK\nTARGET_LDFLAGS += -Wl,--gc-sections\n\nCONFIGURE_ARGS += \\\n\t\t\t--crossbuild=Linux::$(ARCH) \\\n\t\t\t--prefix=/usr \\\n\t\t\t--conf-path=/usr/share/pingos/conf/nginx.conf \\\n\t\t\t$(ADDITIONAL_MODULES) \\\n\t\t\t--error-log-path=/var/etc/pingos/error.log \\\n\t\t\t--pid-path=/var/etc/pingos/pingos.pid \\\n\t\t\t--lock-path=/var/etc/pingos/pingos.lock \\\n\t\t\t--http-log-path=/var/etc/pingos/access.log \\\n\t\t\t--http-client-body-temp-path=/var/etc/pingos/lib/body \\\n\t\t\t--http-proxy-temp-path=/var/etc/pingos/lib/proxy \\\n\t\t\t--with-cc=\"$(TARGET_CC)\" \\\n\t\t\t--with-cc-opt=\"$(TARGET_CPPFLAGS) $(TARGET_CFLAGS)\" \\\n\t\t\t--with-ld-opt=\"$(TARGET_LDFLAGS)\" \\\n\t\t\t--without-http_upstream_zone_module\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/etc\n\t$(INSTALL_CONF) ./root/etc/pingos.template $(1)/etc/pingos.template\n\t\n\t$(INSTALL_DIR) $(1)/etc/config\n\t$(INSTALL_CONF) ./root/etc/config/pingos $(1)/etc/config/pingos\n\t\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_BIN) ./root/etc/init.d/pingos $(1)/etc/init.d/pingos\n\t\n\t$(INSTALL_DIR) $(1)/etc/uci-defaults\n\t$(INSTALL_CONF) ./root/etc/uci-defaults/* $(1)/etc/uci-defaults\n\t\n\t$(INSTALL_DIR) $(1)/usr/share/rpcd/acl.d\n\tcp -pR ./root/usr/share/rpcd/acl.d/* $(1)/usr/share/rpcd/acl.d\n\n\t$(INSTALL_DIR) $(1)/usr/share/ucitrack\n\tcp -pR ./root/usr/share/ucitrack/* $(1)/usr/share/ucitrack\n\n\t$(INSTALL_DIR) $(1)/usr/share/pingos\n\tcp -pR $(PKG_INSTALL_DIR)/usr/share/pingos/conf $(1)/usr/share/pingos\n\t$(INSTALL_DATA) ./root/resource/conf-template/nginx.conf $(1)/usr/share/pingos/conf/nginx.conf\n\t\n\tcp -pR $(PKG_INSTALL_DIR)/usr/html $(1)/usr/share/pingos/html\n\t$(INSTALL_DATA) ./root/resource/crossdomain.xml $(1)/usr/share/pingos/html/crossdomain.xml\n\t$(INSTALL_DATA) ./root/resource/stat.xsl $(1)/usr/share/pingos/html/stat.xsl\n\t\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci\n\tcp -pR ./luasrc/* $(1)/usr/lib/lua/luci/\n\t\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n\n\tpo2lmo ./po/zh_Hans/pingos.po $(1)/usr/lib/lua/luci/i18n/pingos.zh-cn.lmo\n\t\n\t$(INSTALL_DIR) $(1)/usr/sbin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/nginx $(1)/usr/sbin/pingos\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "luci-app-nginx-pingos/luasrc/controller/pingos.lua",
    "content": "-- Copyright 2020 Lienol <lawlienol@gmail.com>\nmodule(\"luci.controller.pingos\", package.seeall)\n\nfunction index()\n    if not nixio.fs.access(\"/etc/config/pingos\") then return end\n\n    entry({\"admin\", \"nas\"}, firstchild(), \"NAS\", 44).dependent = false\n    entry({\"admin\", \"nas\", \"pingos\"}, cbi(\"pingos\"), _(\"PingOS\"), 3).dependent = true\n    entry({\"admin\", \"nas\", \"pingos\", \"status\"}, call(\"act_status\")).leaf = true\nend\n\nfunction act_status()\n    local e = {}\n    e.status = luci.sys.call(\"busybox ps -w | grep pingos | grep nginx | grep -v grep > /dev/null\") == 0\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json(e)\nend\n"
  },
  {
    "path": "luci-app-nginx-pingos/luasrc/model/cbi/pingos.lua",
    "content": "m = Map(\"pingos\", translate(\"PingOS\"))\nm:append(Template(\"pingos/status\"))\n\ns = m:section(TypedSection, \"global\")\ns.anonymous = true\ns.addremove = false\n\ns:tab(\"global\",  translate(\"Global Settings\"))\ns:tab(\"template\", translate(\"Edit Template\"))\n\nnginx = s:taboption(\"template\", Value, \"_nginx\", translatef(\"Edit the template that is used for generating the %s configuration.\", \"nginx\"),\n\ttranslatef(\"This is the content of the file '%s'\", \"/etc/pingos.template\") .. \"<br />\" ..\n\ttranslatef(\"Values enclosed by pipe symbols ('|') should not be changed. They get their values from the '%s' tab.\", translate(\"Global Settings\")))\nnginx.template = \"cbi/tvalue\"\nnginx.rows = 30\n\nfunction nginx.cfgvalue(self, section)\n\treturn nixio.fs.readfile(\"/etc/pingos.template\")\nend\n\nfunction nginx.write(self, section, value)\n\tvalue = value:gsub(\"\\r\\n?\", \"\\n\")\n\tnixio.fs.writefile(\"/etc/pingos.template\", value)\nend\n\no = s:taboption(\"global\", Flag, \"enable\", translate(\"Enable\"))\no.rmempty = false\n\no = s:taboption(\"global\", Flag, \"ipv6\", translate(\"Listen IPv6\"))\no.rmempty = false\n\no = s:taboption(\"global\", Value, \"http_port\", \"HTTP(S)\" ..translate(\"Port\"))\no.datatype = \"port\"\no.default = 8082\no.rmempty = false\n\no = s:taboption(\"global\", Flag, \"https\", translate(\"HTTPS\"))\no.rmempty = false\n\no = s:taboption(\"global\", FileUpload, \"certificate\", translate(\"certificate\"))\no:depends(\"https\", 1)\n\no = s:taboption(\"global\", FileUpload, \"key\", translate(\"key\"))\no:depends(\"https\", 1)\n\no = s:taboption(\"global\", Value, \"rtmp_port\", \"RTMP\" ..translate(\"Port\"))\no.datatype = \"port\"\no.default = 1935\no.rmempty = false\n\no = s:taboption(\"global\", Flag, \"hls\", translate(\"HLS\"))\no.rmempty = false\n\no = s:taboption(\"global\", Flag, \"hls2\", translate(\"HLS2\"))\no.rmempty = false\n\no = s:taboption(\"global\", Flag, \"ts_record\", \"TS \" .. translate(\"Record\"))\no.rmempty = false\n\no = s:taboption(\"global\", Flag, \"flv_record\", \"FLV \" .. translate(\"Record\"))\no.rmempty = false\n\no = s:taboption(\"global\", Value, \"record_path\", translate(\"Record\") .. translate(\"Path\"))\no.default = \"/tmp/record\"\no:depends(\"ts_record\", 1)\no:depends(\"flv_record\", 1)\n\nreturn m\n"
  },
  {
    "path": "luci-app-nginx-pingos/luasrc/view/pingos/status.htm",
    "content": "<fieldset class=\"cbi-section\">\n\t<legend><%:Running Status%></legend>\n\t<fieldset class=\"cbi-section\">\n\t\t<div class=\"cbi-value\">\n\t\t\t<label class=\"cbi-value-title\">Nginx <%:Status%></label>\n\t\t\t<div class=\"cbi-value-field\" id=\"_nginx_status\"><%:Collecting data...%></div>\n\t\t</div>\n\t\t<div class=\"cbi-value\">\n\t\t\t<label class=\"cbi-value-title\"></label>\n\t\t\t<div class=\"cbi-value-field\">\n\t\t\t\t<font color=\"red\" id=\"tips\"></font>\n\t\t\t\t<ul id=\"tips2\">\n\t\t\t\t\t<li>rtmp rtmp://ip/live/<%:Stream name%></li>\n\t\t\t\t\t<li>http(s)-flv http(s)://ip/flv/<%:Stream name%></li>\n\t\t\t\t\t<li>hls http(s)://ip/hls/<%:Stream name%>.m3u8</li>\n\t\t\t\t\t<li>hls+ http(s)://ip/hls2/<%:Stream name%>.m3u8</li>\n\t\t\t\t\t<li>http(s)-ts http(s)://ip/ts/<%:Stream name%></li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t</fieldset>\n</fieldset>\n\n<script type=\"text/javascript\">//<![CDATA[\n\tvar nginx_status = document.getElementById('_nginx_status');\n\tXHR.poll(3, '<%=url([[admin]], [[nas]], [[pingos]], [[status]])%>', null,\n\t\tfunction(x, json) {\n\t\t\tif (x && x.status == 200) {\n\t\t\t\tif (nginx_status) {\n\t\t\t\t\tvar str = \"\";\n\t\t\t\t\tif (json.status) {\n\t\t\t\t\t\tdocument.getElementById(\"tips\").innerHTML = '<%:If you need external network access, please open the port by yourself.%>';\n\t\t\t\t\t\tstr = '<font color=\"green\"><%:RUNNING%> ✓</font><input type=\"button\" class=\"cbi-button cbi-input-apply\" value=\"<%:Enter interface%>\" onclick=\"open_web()\" />'\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdocument.getElementById(\"tips\").innerHTML = '';\n\t\t\t\t\t\tstr = '<font color=\"red\"><%:NOT RUNNING%> X</font>';\n\t\t\t\t\t}\n\t\t\t\t\tnginx_status.innerHTML = str;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t);\n\tfunction open_web(){\n\t\tvar port = '<%=luci.sys.exec(\"uci -q get pingos.@global[0].http_port\"):gsub(\"^%s*(.-)%s*$\", \"%1\")%>';\n\t\tvar ishttps = '<%=luci.sys.exec(\"uci -q get pingos.@global[0].https\"):gsub(\"^%s*(.-)%s*$\", \"%1\")%>';\n\t\tvar protocol = (ishttps == \"1\") ? \"https://\" : \"http://\";\n\t\tvar hostname = location.hostname;\n\t\t\n\t\tvar url = protocol + hostname + \":\" + port;\n\t\twindow.open(url, 'target', '');\n\t}\n//]]></script>"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-client-module/COPYRIGHT",
    "content": "Copyright (C) 2016-2020, by Jie Wu \"AlexWoo\" <wj19840501@gmail.com>.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n1. Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\nOR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\nHOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\nLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\nOUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGE.\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-client-module/config",
    "content": "ngx_addon_name=ngx_client_module\n\n\nCORE_MODULES=\"$CORE_MODULES                                         \\\n             ngx_client_module                                      \\\n             ngx_http_client_module                                 \\\n             \"\n\nNGX_ADDON_SRCS=\"$NGX_ADDON_SRCS                                     \\\n               $ngx_addon_dir/ngx_client.c                          \\\n               $ngx_addon_dir/ngx_http_client.c                     \\\n               \"\n\nNGX_ADDON_DEPS=\"$NGX_ADDON_DEPS                                     \\\n               $ngx_addon_dir/ngx_client.h                          \\\n               $ngx_addon_dir/ngx_http_client.h                     \\\n               \"\n\nCFLAGS=\"$CFLAGS -I $ngx_addon_dir\"\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-client-module/ngx_client.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n * fixed by Ping cczjp89@gmail.com\n */\n\n\n#include <ngx_event_connect.h>\n#include \"ngx_client.h\"\n#include \"ngx_event_resolver.h\"\n#include \"ngx_dynamic_resolver.h\"\n#include \"ngx_poold.h\"\n#include \"ngx_map.h\"\n#include \"ngx_timerd.h\"\n\n\n#define NGX_CLIENT_DISCARD_BUFFER_SIZE  4096\n\n\nstatic void *ngx_client_module_create_conf(ngx_cycle_t *cycle);\nstatic char *ngx_client_module_init_conf(ngx_cycle_t *cycle, void *conf);\n\n\ntypedef struct ngx_client_pool_s  ngx_client_pool_t;\n\n\nstruct ngx_client_pool_s {\n    ngx_map_node_t              node;\n    ngx_queue_t                 cs_queue;  /* client session queue */\n    ngx_uint_t                  qsize;     /* client pool size */\n\n    u_char                      addr[NGX_SOCKADDR_STRLEN];\n    ngx_str_t                   paddr;\n\n    ngx_client_pool_t          *next;      /* free pool node */\n};\n\n\ntypedef struct {\n    ngx_map_t                   client_pools; /* key is ip:port */\n    /* max keepalive client session */\n    ngx_uint_t                  max_idle_client;\n    ngx_msec_t                  keepalive;\n    ngx_msec_t                  connect_timeout;\n    ngx_msec_t                  send_timeout;\n    size_t                      postpone_output;\n    ngx_flag_t                  dynamic_resolver;\n    ngx_flag_t                  tcp_nodelay;\n    ngx_flag_t                  tcp_nopush;\n\n    ngx_uint_t                  idle_connction; /* connection num in pools */\n    ngx_uint_t                  nalloc;\n    ngx_uint_t                  nfree;\n    ngx_client_pool_t          *free;         /* recycle free pool node */\n} ngx_client_conf_t;\n\n\nstatic ngx_command_t  ngx_client_commands[] = {\n\n    { ngx_string(\"max_idle_client\"),\n      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      0,\n      offsetof(ngx_client_conf_t, max_idle_client),\n      NULL },\n\n    { ngx_string(\"keepalive\"),\n      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      0,\n      offsetof(ngx_client_conf_t, keepalive),\n      NULL },\n\n    { ngx_string(\"connect_timeout\"),\n      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      0,\n      offsetof(ngx_client_conf_t, connect_timeout),\n      NULL },\n\n    { ngx_string(\"send_timeout\"),\n      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      0,\n      offsetof(ngx_client_conf_t, send_timeout),\n      NULL },\n\n    { ngx_string(\"postpone_output\"),\n      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_size_slot,\n      0,\n      offsetof(ngx_client_conf_t, postpone_output),\n      NULL },\n\n    { ngx_string(\"dynamic_resolver\"),\n      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,\n      ngx_conf_set_flag_slot,\n      0,\n      offsetof(ngx_client_conf_t, dynamic_resolver),\n      NULL },\n\n    { ngx_string(\"tcp_nodelay\"),\n      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,\n      ngx_conf_set_flag_slot,\n      0,\n      offsetof(ngx_client_conf_t, tcp_nodelay),\n      NULL },\n\n    { ngx_string(\"tcp_nopush\"),\n      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_FLAG,\n      ngx_conf_set_flag_slot,\n      0,\n      offsetof(ngx_client_conf_t, tcp_nopush),\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_core_module_t    ngx_client_module_ctx = {\n    ngx_string(\"client\"),\n    ngx_client_module_create_conf,\n    ngx_client_module_init_conf\n};\n\n\nngx_module_t  ngx_client_module = {\n    NGX_MODULE_V1,\n    &ngx_client_module_ctx,                 /* module context */\n    ngx_client_commands,                    /* module directives */\n    NGX_CORE_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_client_module_create_conf(ngx_cycle_t *cycle)\n{\n    ngx_client_conf_t          *ccf;\n\n    ccf = ngx_pcalloc(cycle->pool, sizeof(ngx_client_conf_t));\n    if (ccf == NULL) {\n        return NULL;\n    }\n\n    ngx_map_init(&ccf->client_pools, ngx_map_hash_str, ngx_cmp_str);\n\n    ccf->max_idle_client = NGX_CONF_UNSET_UINT;\n    ccf->keepalive = NGX_CONF_UNSET_MSEC;\n    ccf->connect_timeout = NGX_CONF_UNSET_MSEC;\n    ccf->send_timeout = NGX_CONF_UNSET_MSEC;\n    ccf->postpone_output = NGX_CONF_UNSET_SIZE;\n    ccf->dynamic_resolver = NGX_CONF_UNSET;\n    ccf->tcp_nodelay = NGX_CONF_UNSET;\n    ccf->tcp_nodelay = NGX_CONF_UNSET;\n\n    return ccf;\n}\n\n\nstatic char *\nngx_client_module_init_conf(ngx_cycle_t *cycle, void *conf)\n{\n    ngx_client_conf_t          *ccf = conf;\n\n    ngx_conf_init_uint_value(ccf->max_idle_client, 1024);\n    ngx_conf_init_msec_value(ccf->keepalive, 60000);\n\n    ngx_conf_init_msec_value(ccf->connect_timeout, 3000);\n    ngx_conf_init_msec_value(ccf->send_timeout, 10000);\n    ngx_conf_init_size_value(ccf->postpone_output, 1460);\n    ngx_conf_init_value(ccf->dynamic_resolver, 1);\n    ngx_conf_init_value(ccf->tcp_nodelay, 1);\n    ngx_conf_init_value(ccf->tcp_nopush, 0);\n\n    return NGX_CONF_OK;\n}\n\n\n/* client pool */\nstatic ngx_client_pool_t *\nngx_client_get_client_pool()\n{\n    ngx_client_conf_t          *ccf;\n    ngx_client_pool_t          *pool;\n\n    ccf = (ngx_client_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                             ngx_client_module);\n\n    pool = ccf->free;\n    if (pool == NULL) {\n        pool = ngx_pcalloc(ngx_cycle->pool, sizeof(ngx_client_pool_t));\n        if (pool == NULL) {\n            return NULL;\n        }\n\n        ++ccf->nalloc;\n    } else {\n        ccf->free = pool->next;\n        ngx_memzero(pool, sizeof(ngx_client_pool_t));\n\n        --ccf->nfree;\n    }\n\n    ngx_queue_init(&pool->cs_queue);\n\n    return pool;\n}\n\n\nstatic void\nngx_client_put_client_pool(ngx_client_pool_t *p)\n{\n    ngx_client_conf_t          *ccf;\n\n    ccf = (ngx_client_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                             ngx_client_module);\n\n    p->next = ccf->free;\n    ccf->free = p;\n\n    ++ccf->nfree;\n}\n\n\nstatic ngx_connection_t *\nngx_client_get_connection(struct sockaddr *sockaddr, socklen_t socklen)\n{\n    ngx_client_conf_t          *ccf;\n    ngx_client_pool_t          *pool;\n    ngx_map_node_t             *node;\n    ngx_queue_t                *cq;\n    ngx_str_t                   paddr;\n    u_char                      addr[NGX_SOCKADDR_STRLEN];\n    ngx_connection_t           *c;\n\n    ccf = (ngx_client_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                             ngx_client_module);\n\n#if (NGX_HAVE_UNIX_DOMAIN)\n    if (sockaddr->sa_family == AF_UNIX) { // Unix will not reuse\n        return NULL;\n    }\n#endif\n\n    // get client connection pool for sockaddr\n    paddr.data = addr;\n    paddr.len = NGX_SOCKADDR_STRLEN;\n    paddr.len = ngx_sock_ntop(sockaddr, socklen, paddr.data, paddr.len, 1);\n\n    node = ngx_map_find(&ccf->client_pools, (intptr_t) &paddr);\n\n    if (node == NULL) { // connection pool for addr is empty\n        return NULL;\n    }\n\n    // get a idle connection from client connection pool\n    pool = (ngx_client_pool_t *) node;\n    cq = ngx_queue_head(&pool->cs_queue);\n    ngx_queue_remove(cq);\n    c = (ngx_connection_t *) ((char *) cq - offsetof(ngx_connection_t, queue));\n    --ccf->idle_connction;\n    --pool->qsize;\n\n    // recycle empty pool\n    if (ngx_queue_empty(&pool->cs_queue)) {\n        ngx_map_delete(&ccf->client_pools, (intptr_t) &paddr);\n        ngx_client_put_client_pool(pool);\n    }\n\n    // init connection\n    if (c->read->timer_set) {\n        NGX_DEL_TIMER(c->read, c->number);\n    }\n\n    if (c->read->posted) {\n        ngx_delete_posted_event(c->read);\n    }\n\n    return c;\n}\n\n\nstatic void\nngx_client_keepalive_handler(ngx_event_t *rev)\n{\n    ngx_client_conf_t          *ccf;\n    ngx_client_pool_t          *pool;\n    ngx_connection_t           *c;\n    ngx_int_t                   n;\n    ngx_buf_t                   b;\n    u_char                      buffer[NGX_CLIENT_DISCARD_BUFFER_SIZE];\n\n    c = rev->data;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, c->log, 0, \"client keepalive handler\");\n\n    if (rev->timedout || c->close) {\n        goto close;\n    }\n\n    // read and discard data\n    b.start = buffer;\n    b.end = buffer + NGX_CLIENT_DISCARD_BUFFER_SIZE;\n\n    for (;;) {\n        b.pos = b.last = b.start;\n\n        n = c->recv(c, b.last, b.end - b.last);\n\n        if (n == 0 || n == NGX_ERROR) {\n            ngx_log_error(NGX_LOG_INFO, c->log, ngx_errno,\n                    \"server close while client keepalive\");\n            goto close;\n        }\n\n        ngx_log_error(NGX_LOG_INFO, c->log, 0,\n                \"server recv data while client keepalive %d\", n);\n\n        goto close;\n    }\n\nclose:\n    // remove connection from pool\n    ccf = (ngx_client_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                             ngx_client_module);\n\n    pool = c->data;\n\n    ngx_queue_remove(&c->queue);\n    --ccf->idle_connction;\n    --pool->qsize;\n\n    // recycle empty pool\n    if (ngx_queue_empty(&pool->cs_queue)) {\n        ngx_map_delete(&ccf->client_pools, (intptr_t) &pool->paddr);\n        ngx_client_put_client_pool(pool);\n    }\n\n    if (c->read->timer_set) {\n        NGX_DEL_TIMER(c->read, c->number);\n    }\n\n    if (c->write->timer_set) {\n        NGX_DEL_TIMER(c->write, c->number);\n    }\n\n    ngx_close_connection(c);\n}\n\n\nstatic void\nngx_client_reusable_connection(ngx_client_session_t *s)\n{\n    ngx_client_conf_t          *ccf;\n    ngx_client_pool_t          *pool;\n    ngx_map_node_t             *node;\n    ngx_connection_t           *c;\n    ngx_str_t                   paddr;\n    u_char                      addr[NGX_SOCKADDR_STRLEN];\n\n    ccf = (ngx_client_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                             ngx_client_module);\n\n    c = s->connection;\n\n#if (NGX_HAVE_UNIX_DOMAIN)\n    if (s->peer.sockaddr->sa_family == AF_UNIX) { // Unix will not reuse\n        return;\n    }\n#endif\n\n    if (ccf->idle_connction > ccf->keepalive) {\n        ngx_log_error(NGX_LOG_INFO, c->log, 0,\n                \"too many connections in pool\");\n        return;\n    }\n\n    ngx_log_error(NGX_LOG_INFO, &s->log, 0, \"client, put connection in pool\");\n\n    c->pool = NULL;\n\n    // get client connection pool for c->sockaddr\n    paddr.data = addr;\n    paddr.len = NGX_SOCKADDR_STRLEN;\n    paddr.len = ngx_sock_ntop(s->peer.sockaddr, s->peer.socklen,\n                              paddr.data, paddr.len, 1);\n\n    node = ngx_map_find(&ccf->client_pools, (intptr_t) &paddr);\n    pool = (ngx_client_pool_t *) node;\n\n    if (pool == NULL) { // connection pool for addr is empty\n        pool = ngx_client_get_client_pool();\n        if (pool == NULL) {\n            return;\n        }\n\n        ngx_memcpy(pool->addr, addr, NGX_SOCKADDR_STRLEN);\n        pool->paddr.data = pool->addr;\n        pool->paddr.len = paddr.len;\n\n        pool->node.raw_key = (intptr_t) &pool->paddr;\n        ngx_map_insert(&ccf->client_pools, &pool->node, 0);\n    }\n\n    // put connection in connection pool\n    ngx_queue_insert_head(&pool->cs_queue, &c->queue);\n    c->data = pool;\n    ++ccf->idle_connction;\n    ++pool->qsize;\n\n    c->log = ngx_cycle->log;\n    c->read->log = ngx_cycle->log;\n\n    // set timer for keepalive time\n    c->read->handler = ngx_client_keepalive_handler;\n    NGX_ADD_TIMER(c->read, ccf->keepalive, offsetof(ngx_connection_t, number));\n\n    if (c->write->timer_set) {\n        NGX_DEL_TIMER(c->write, c->number);\n    }\n\n    if (c->write->posted) {\n        ngx_delete_posted_event(c->write);\n    }\n\n    if (c->write->active && (ngx_event_flags & NGX_USE_LEVEL_EVENT)) {\n        if (ngx_del_event(c->write, NGX_WRITE_EVENT, 0) != NGX_OK) {\n            if (c->read->timer_set) {\n                NGX_DEL_TIMER(c->read, c->number);\n            }\n\n            ngx_close_connection(c);\n            return;\n        }\n    }\n}\n\n\n/* client */\n\nstatic u_char *\nngx_client_log_error(ngx_log_t *log, u_char *buf, size_t len)\n{\n    u_char                     *p;\n    ngx_client_session_t       *s;\n\n    p = buf;\n\n    if (log->action) {\n        p = ngx_snprintf(buf, len, \" while %s\", log->action);\n        len -= p - buf;\n        buf = p;\n    }\n\n    s = log->data;\n    if (s == NULL) {\n        return p;\n    }\n\n    if (s->connection) {\n        p = ngx_snprintf(buf, len, \", server ip: %V\",\n                &s->connection->addr_text);\n        len -= p - buf;\n        buf = p;\n    }\n\n    p = ngx_snprintf(buf, len, \", server: %V, csession: %p\", &s->server, s);\n    len -= p - buf;\n    buf = p;\n\n    return p;\n}\n\n\nstatic ngx_int_t\nngx_client_get_peer(ngx_peer_connection_t *pc, void *data)\n{\n    ngx_connection_t           *c;\n\n    c = ngx_client_get_connection(pc->sockaddr, pc->socklen);\n    if (c == NULL) { // cannot find reusable keepalive connection\n        return NGX_OK;\n    }\n\n    c->idle = 0;\n    c->sent = 0;\n    c->log = pc->log;\n    c->read->log = pc->log;\n    c->write->log = pc->log;\n\n    pc->connection = c;\n    pc->cached = 1;\n\n    return NGX_DONE;\n}\n\n\nstatic void\nngx_client_free_peer(ngx_peer_connection_t *pc, void *data,\n        ngx_uint_t state)\n{\n}\n\n\nstatic ngx_int_t\nngx_client_test_connect(ngx_connection_t *c)\n{\n    int        err;\n    socklen_t  len;\n\n#if (NGX_HAVE_KQUEUE)\n\n    if (ngx_event_flags & NGX_USE_KQUEUE_EVENT)  {\n        if (c->write->pending_eof || c->read->pending_eof) {\n            if (c->write->pending_eof) {\n                err = c->write->kq_errno;\n\n            } else {\n                err = c->read->kq_errno;\n            }\n\n            (void) ngx_connection_error(c, err,\n                    \"kevent() reported that connect() failed\");\n            return NGX_ERROR;\n        }\n\n    } else\n#endif\n    {\n        err = 0;\n        len = sizeof(int);\n\n        /*\n         * BSDs and Linux return 0 and set a pending error in err\n         * Solaris returns -1 and sets errno\n         */\n\n        if (getsockopt(c->fd, SOL_SOCKET, SO_ERROR, (void *) &err, &len)\n                == -1)\n        {\n            err = ngx_socket_errno;\n        }\n\n        if (err) {\n            (void) ngx_connection_error(c, err, \"connect() failed\");\n            return NGX_ERROR;\n        }\n    }\n\n    return NGX_OK;\n}\n\n\nstatic void\nngx_client_connected(ngx_client_session_t *s)\n{\n    ngx_event_t                *wev;\n\n    if (ngx_client_test_connect(s->connection) != NGX_OK) {\n        ngx_client_close(s);\n        return;\n    }\n\n    s->log.action = NULL;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, &s->log, 0,\n            \"nginx client connected\");\n\n    wev = s->connection->write;\n\n    if (wev->timedout) { /* rev or wev timedout */\n        ngx_log_error(NGX_LOG_ERR, &s->log, NGX_ETIMEDOUT,\n                \"server timed out\");\n        s->connection->timedout = 1;\n\n        ngx_client_close(s);\n\n        return;\n    }\n\n    if (wev->timer_set) {\n        NGX_DEL_TIMER(wev, s->connection->number);\n    }\n\n    s->connected = 1;\n    s->peer.tries = 0;\n\n    if (s->client_connected) {\n        s->client_connected(s);\n    }\n}\n\n\nstatic void\nngx_client_write_handler(ngx_event_t *ev)\n{\n    ngx_connection_t           *c;\n    ngx_client_session_t       *s;\n    ngx_int_t                   n;\n\n    c = ev->data;\n    s = c->data;\n\n    if (c->destroyed) {\n        return;\n    }\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, &s->log, 0,\n            \"nginx client write handler\");\n\n    if (!s->connected) {\n        ngx_client_connected(s);\n\n        return;\n    }\n\n    if (s->client_send) {\n        s->client_send(s);\n\n        return;\n    }\n\n    /* write data buffered in s->out */\n    if (s->out == NULL) {\n        return;\n    }\n\n    n = ngx_client_write(s, NULL);\n    if (n == NGX_ERROR) {\n        ngx_client_close(s);\n    }\n}\n\n\nstatic void\nngx_client_read_discarded(ngx_client_session_t *s)\n{\n    ngx_int_t                   n;\n    ngx_buf_t                   b;\n    u_char                      buffer[NGX_CLIENT_DISCARD_BUFFER_SIZE];\n\n    b.start = buffer;\n    b.end = buffer + NGX_CLIENT_DISCARD_BUFFER_SIZE;\n\n    for (;;) {\n        b.pos = b.last = b.start;\n\n        n = ngx_client_read(s, &b);\n\n        if (n == NGX_ERROR || n == 0) {\n            ngx_log_error(NGX_LOG_ERR, &s->log, ngx_errno,\n                    \"nginx client read discard error\");\n            ngx_client_close(s);\n\n            return;\n        }\n\n        if (n == NGX_AGAIN) {\n            return;\n        }\n    }\n}\n\n\nstatic void\nngx_client_read_handler(ngx_event_t *ev)\n{\n    ngx_connection_t           *c;\n    ngx_client_session_t       *s;\n\n    c = ev->data;\n    s = c->data;\n\n    if (c->destroyed) {\n        return;\n    }\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, &s->log, 0,\n            \"nginx client read handler\");\n\n    if (!s->connected) {\n        ngx_client_connected(s);\n\n        return;\n    }\n\n    if (s->client_recv) {\n        s->client_recv(s);\n    } else {\n        /* read and drop */\n        ngx_client_read_discarded(s);\n    }\n}\n\n\nstatic void\nngx_client_connect_server(void *data, struct sockaddr *sa, socklen_t socklen)\n{\n    ngx_client_session_t       *s;\n    ngx_connection_t           *c;\n    ngx_int_t                   rc;\n    int                         tcp_nodelay;\n\n    s = data;\n\n    if (sa == NULL) {\n        ngx_log_error(NGX_LOG_ERR, &s->log, 0,\n                \"nginx client resolver peer %v failed\", &s->server);\n        goto failed;\n    }\n\n    ngx_inet_set_port(sa, s->port);\n\n    s->peer.sockaddr = ngx_pcalloc(s->pool, sizeof(socklen));\n    ngx_memcpy(s->peer.sockaddr, sa, socklen);\n    s->peer.socklen = socklen;\n    s->peer.name = &s->server;\n\n    s->log.action = \"connecting to server\";\n\n    rc = ngx_event_connect_peer(&s->peer);\n    if (rc == NGX_ERROR) {\n        ngx_log_error(NGX_LOG_ERR, &s->log, ngx_errno,\n                \"nginx client connect peer failed\");\n        goto failed;\n    } else if (rc == NGX_DECLINED) {\n        ngx_log_error(NGX_LOG_ERR, &s->log, ngx_errno,\n                \"nginx client connect peer failed\");\n        goto failed;\n    }\n\n    if (rc == NGX_DONE) {\n        ngx_log_error(NGX_LOG_INFO, &s->log, 0, \"client, reuse connection\");\n    }\n\n    // NGX_AGAIN: send syn, wait for syn,ack\n    // NGX_OK:    connect to server\n    // NGX_DONE:  reuse keepalive connection\n\n    s->connection = s->peer.connection;\n    c = s->connection;\n    c->pool = s->pool;\n    c->pool->log = s->peer.log;\n\n    // set tcp_nodelay\n    if (c->type == SOCK_STREAM && s->tcp_nodelay\n            && c->tcp_nodelay == NGX_TCP_NODELAY_UNSET)\n    {\n        ngx_log_debug0(NGX_LOG_DEBUG_CORE, c->log, 0, \"tcp_nodelay\");\n\n        tcp_nodelay = 1;\n\n        if (setsockopt(c->fd, IPPROTO_TCP, TCP_NODELAY,\n                       (const void *) &tcp_nodelay, sizeof(int)) == -1)\n        {\n            ngx_connection_error(c, ngx_socket_errno,\n                                 \"setsockopt(TCP_NODELAY) failed\");\n            goto failed;\n        }\n\n        c->tcp_nodelay = NGX_TCP_NODELAY_SET;\n    }\n\n    // set tcp_nopush\n    if (!s->tcp_nopush) {\n        c->tcp_nopush = NGX_TCP_NOPUSH_DISABLED;\n    }\n\n    c->addr_text.data = ngx_pcalloc(s->pool, NGX_SOCKADDR_STRLEN);\n    if (c->addr_text.data == NULL) {\n        goto failed;\n    }\n    c->addr_text.len = ngx_sock_ntop(sa, socklen, c->addr_text.data,\n                                     NGX_SOCKADDR_STRLEN, 1);\n\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, &s->log, 0,\n            \"nginx client connect server, rc: %i\", rc);\n\n    c->log->connection = c->number;\n\n    c->data = s;\n\n    c->write->handler = ngx_client_write_handler;\n    c->read->handler = ngx_client_read_handler;\n\n    if (rc == NGX_AGAIN) {\n        NGX_ADD_TIMER(c->write, s->connect_timeout,\n                      offsetof(ngx_connection_t, number));\n        return;\n    }\n\n    /* NGX_OK */\n\n    ngx_client_connected(s);\n\n    return;\n\nfailed:\n    ngx_client_close(s);\n}\n\n\nstatic void\nngx_client_resolver_server(void *data, ngx_resolver_addr_t *addrs,\n        ngx_uint_t naddrs)\n{\n    ngx_client_session_t       *s;\n    ngx_uint_t                  n;\n\n    s = data;\n\n    if (naddrs == 0) {\n        ngx_log_error(NGX_LOG_ERR, &s->log, ngx_errno,\n                \"nginx client resolver failed\");\n        ngx_client_close(s);\n        return;\n    }\n\n    n = ngx_random() % naddrs;\n\n    ngx_client_connect_server(data, addrs[n].sockaddr, addrs[n].socklen);\n}\n\n\nstatic void\nngx_client_close_connection(ngx_client_session_t *s)\n{\n    ngx_connection_t           *c;\n\n    c = s->connection;\n\n    if (c == NULL || c->destroyed) {\n        return;\n    }\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, &s->log, 0,\n            \"nginx client close connection\");\n\n    s->connected = 0;\n    s->connection = NULL;\n    c->destroyed = 1;\n\n    if (c->write->timer_set) {\n        NGX_DEL_TIMER(c->write, c->number);\n    }\n\n    if (c->read->timer_set) {\n        NGX_DEL_TIMER(c->read, c->number);\n    }\n\n    ngx_close_connection(c);\n}\n\n\nngx_client_session_t *\nngx_client_create(ngx_str_t *peer, ngx_str_t *local, ngx_flag_t udp,\n        ngx_log_t *log)\n{\n    ngx_client_session_t       *s;\n    ngx_client_conf_t          *ccf;\n    ngx_pool_t                 *pool;\n    ngx_int_t                   rc, n;\n    u_char                     *p, *last;\n    size_t                      plen;\n\n    ccf = (ngx_client_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                             ngx_client_module);\n\n    if (peer == NULL || peer->len == 0) {\n        ngx_log_error(NGX_LOG_ERR, log, 0, \"client init, peer is NULL\");\n        return NULL;\n    }\n\n    pool = NGX_CREATE_POOL(4096, ngx_cycle->log);\n    if (pool == NULL) {\n        return NULL;\n    }\n\n    s = ngx_pcalloc(pool, sizeof(ngx_client_session_t));\n    if (s == NULL) {\n        goto clear;\n    }\n    s->pool = pool;\n\n    /* set log */\n    // ci->log.connection not set, should set when connection established\n    s->log = ngx_cycle->new_log;\n    s->log.handler = ngx_client_log_error;\n    s->log.data = s;\n    s->log.action = \"create client\";\n\n    s->log.log_level = NGX_LOG_INFO;\n\n    /* parse peer */\n    last = peer->data + peer->len;\n\n#if (NGX_HAVE_INET6)\n    if (peer->len && peer->data[0] == '[') {\n\n        p = ngx_strlchr(peer->data, last, ']');\n\n        if (p == NULL || p == last - 1) {\n            ngx_log_error(NGX_LOG_ERR, log, 0,\n                    \"client init, parse peer %V error\", peer);\n            goto clear;\n        }\n\n        ++p;\n    } else\n#endif\n    {\n        p = ngx_strlchr(peer->data, last, ':');\n        if (p == NULL) {\n            p = last;\n        }\n    }\n\n    s->server.len = p - peer->data;\n    s->server.data = ngx_pcalloc(s->pool, s->server.len);\n    if (s->server.data == NULL) {\n        goto clear;\n    }\n    ngx_memcpy(s->server.data, peer->data, peer->len);\n\n    if (p != last) { /* has port */\n        if (*p != ':') {\n            ngx_log_error(NGX_LOG_ERR, log, 0,\n                    \"client init, parse peer %V error\", peer);\n            goto clear;\n        }\n\n        ++p;\n        plen = last - p;\n\n        n = ngx_atoi(p, plen);\n        if (n < 1 || n > 65535) {\n            ngx_log_error(NGX_LOG_ERR, log, 0,\n                    \"client init, parse peer %V error\", peer);\n            goto clear;\n        }\n        s->port = n;\n    }\n\n    /* parse local */\n    if (local && local->len) {\n        s->peer.local = ngx_pcalloc(s->pool, sizeof(ngx_addr_t));\n        if (s->peer.local == NULL) {\n            goto clear;\n        }\n\n        rc = ngx_parse_addr_port(s->pool, s->peer.local, peer->data, peer->len);\n        if (rc != NGX_OK) {\n            ngx_log_error(NGX_LOG_ERR, log, 0, \"invalid local address \\\"%V\\\"\",\n                    local);\n            goto clear;\n        }\n\n        s->peer.local->name.data = ngx_pcalloc(s->pool, sizeof(local->len));\n        if (s->peer.local->name.data == NULL) {\n            goto clear;\n        }\n        ngx_memcpy(s->peer.local->name.data, local->data, local->len);\n        s->peer.local->name.len = local->len;\n    }\n\n    /* set default */\n    s->connect_timeout = ccf->connect_timeout;\n    s->send_timeout = ccf->send_timeout;\n    s->postpone_output = ccf->postpone_output;\n    s->dynamic_resolver = ccf->dynamic_resolver;\n    s->tcp_nodelay = ccf->tcp_nodelay;\n    s->tcp_nopush = ccf->tcp_nopush;\n\n    /* set peer */\n    s->peer.log = &s->log;\n    s->peer.get = ngx_client_get_peer;\n    s->peer.free = ngx_client_free_peer;\n    s->peer.type = udp ? SOCK_DGRAM : SOCK_STREAM;\n    s->peer.log_error = NGX_ERROR_INFO;\n\n    return s;\n\nclear:\n    NGX_DESTROY_POOL(pool);\n\n    return NULL;\n}\n\n\nvoid\nngx_client_connect(ngx_client_session_t *s)\n{\n    s->log.action = \"resolving\";\n\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, &s->log, 0, \"nginx client connect %V\",\n            &s->server);\n\n    /* start connect */\n    if (s->dynamic_resolver) {\n        ngx_dynamic_resolver_start_resolver(&s->server,\n                ngx_client_connect_server, s);\n    } else {\n        ngx_event_resolver_start_resolver(&s->server,\n                ngx_client_resolver_server, s);\n    }\n}\n\n\nngx_int_t\nngx_client_write(ngx_client_session_t *s, ngx_chain_t *out)\n{\n    off_t                       size;\n    ngx_uint_t                  last, flush, sync;\n    ngx_chain_t                *cl, *ln, **ll, *chain;\n    ngx_connection_t           *c;\n    ngx_event_t                *wev;\n\n    c = s->peer.connection;\n    wev = c->write;\n\n    if (c->error) {\n        return NGX_ERROR;\n    }\n\n    size = 0;\n    flush = 0;\n    sync = 0;\n    last = 0;\n    ll = &s->out;\n\n    /* find the size, the flush point and the last link of the saved chain */\n\n    for (cl = s->out; cl; cl = cl->next) {\n        ll = &cl->next;\n\n        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, &s->log, 0,\n                       \"nginx client write, write old buf t:%d f:%d %p, \"\n                       \"pos %p, size: %z file: %O, size: %O\",\n                       cl->buf->temporary, cl->buf->in_file,\n                       cl->buf->start, cl->buf->pos,\n                       cl->buf->last - cl->buf->pos,\n                       cl->buf->file_pos,\n                       cl->buf->file_last - cl->buf->file_pos);\n\n#if 1\n        if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) {\n            ngx_log_error(NGX_LOG_ALERT, &s->log, 0,\n                          \"nginx client write, zero size buf in writer \"\n                          \"t:%d r:%d f:%d %p %p-%p %p %O-%O\",\n                          cl->buf->temporary,\n                          cl->buf->recycled,\n                          cl->buf->in_file,\n                          cl->buf->start,\n                          cl->buf->pos,\n                          cl->buf->last,\n                          cl->buf->file,\n                          cl->buf->file_pos,\n                          cl->buf->file_last);\n\n            ngx_debug_point();\n            return NGX_ERROR;\n        }\n#endif\n\n        size += ngx_buf_size(cl->buf);\n\n        if (cl->buf->flush || cl->buf->recycled) {\n            flush = 1;\n        }\n\n        if (cl->buf->sync) {\n            sync = 1;\n        }\n\n        if (cl->buf->last_buf) {\n            last = 1;\n        }\n    }\n\n    /* add the new chain to the existent one */\n\n    for (ln = out; ln; ln = ln->next) {\n        cl = ngx_alloc_chain_link(s->pool);\n        if (cl == NULL) {\n            return NGX_ERROR;\n        }\n\n        cl->buf = ln->buf;\n        *ll = cl;\n        ll = &cl->next;\n\n        ngx_log_debug7(NGX_LOG_DEBUG_EVENT, &s->log, 0,\n                       \"nginx client write, write new buf t:%d f:%d %p, \"\n                       \"pos %p, size: %z file: %O, size: %O\",\n                       cl->buf->temporary, cl->buf->in_file,\n                       cl->buf->start, cl->buf->pos,\n                       cl->buf->last - cl->buf->pos,\n                       cl->buf->file_pos,\n                       cl->buf->file_last - cl->buf->file_pos);\n\n#if 1\n        if (ngx_buf_size(cl->buf) == 0 && !ngx_buf_special(cl->buf)) {\n            ngx_log_error(NGX_LOG_ALERT, &s->log, 0,\n                          \"nginx client write, zero size buf in writer \"\n                          \"t:%d r:%d f:%d %p %p-%p %p %O-%O\",\n                          cl->buf->temporary,\n                          cl->buf->recycled,\n                          cl->buf->in_file,\n                          cl->buf->start,\n                          cl->buf->pos,\n                          cl->buf->last,\n                          cl->buf->file,\n                          cl->buf->file_pos,\n                          cl->buf->file_last);\n\n            ngx_debug_point();\n            return NGX_ERROR;\n        }\n#endif\n\n        size += ngx_buf_size(cl->buf);\n\n        if (cl->buf->flush || cl->buf->recycled) {\n            flush = 1;\n        }\n\n        if (cl->buf->sync) {\n            sync = 1;\n        }\n\n        if (cl->buf->last_buf) {\n            last = 1;\n        }\n    }\n\n    *ll = NULL;\n\n    ngx_log_debug3(NGX_LOG_DEBUG_HTTP, &s->log, 0, \"nginx client write, \"\n                   \"http write filter: l:%ui f:%ui s:%O\", last, flush, size);\n\n    /*\n     * avoid the output if there are no last buf, no flush point,\n     * there are the incoming bufs and the size of all bufs\n     * is smaller than \"postpone_output\" directive\n     */\n\n    if (!last && !flush && out && size < (off_t) s->postpone_output) {\n        return NGX_OK;\n    }\n\n    if (size == 0 && !(last && c->need_last_buf)) {\n        if (last || flush || sync) {\n            for (cl = s->out; cl; /* void */) {\n                ln = cl;\n                cl = cl->next;\n                ngx_free_chain(s->pool, ln);\n            }\n\n            s->out = NULL;\n\n            return NGX_OK;\n        }\n\n        ngx_log_error(NGX_LOG_ALERT, &s->log, 0,\n                      \"nginx client write, the output chain is empty\");\n\n        ngx_debug_point();\n\n        return NGX_ERROR;\n    }\n\n    chain = c->send_chain(c, s->out, 0);\n\n    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, &s->log, 0,\n                   \"nginx client write %p\", chain);\n\n    if (chain == NGX_CHAIN_ERROR) {\n        c->error = 1;\n        ngx_log_error(NGX_LOG_ERR, &s->log, ngx_errno, \"write error\");\n        return NGX_ERROR;\n    }\n\n    for (cl = s->out; cl && cl != chain; /* void */) {\n        ln = cl;\n        cl = cl->next;\n        ngx_free_chain(s->pool, ln);\n    }\n\n    s->out = chain;\n\n    if (chain) {\n        NGX_ADD_TIMER(c->write, s->send_timeout,\n                      offsetof(ngx_connection_t, number));\n        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {\n            return NGX_ERROR;\n        }\n\n        return NGX_AGAIN;\n    }\n\n    if (wev->active) { /* if NGX_OK, del write notification */\n        if (ngx_del_event(wev, NGX_WRITE_EVENT, 0) != NGX_OK) {\n            return NGX_ERROR;\n        }\n    }\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_client_read(ngx_client_session_t *s, ngx_buf_t *b)\n{\n    ngx_connection_t           *c;\n    ngx_int_t                   n;\n\n    if (s == NULL || b == NULL) {\n        return NGX_ERROR;\n    }\n\n    if (b->last == b->end) {\n        return NGX_DECLINED;\n    }\n\n    c = s->peer.connection;\n\n    n = c->recv(c, b->last, b->end - b->last);\n\n    if (n == 0) {\n        ngx_log_error(NGX_LOG_ERR, &s->log, ngx_errno, \"server closed\");\n        return 0;\n    }\n\n    if (n == NGX_ERROR) {\n        ngx_log_error(NGX_LOG_ERR, &s->log, ngx_errno, \"read error\");\n        return NGX_ERROR;\n    }\n\n    if (n == NGX_AGAIN) {\n        if (ngx_handle_read_event(c->read, 0) != NGX_OK) {\n            return NGX_ERROR;\n        }\n\n        return NGX_AGAIN;\n    }\n\n    b->last += n;\n    s->recv += n;\n\n    return n;\n}\n\n\nvoid\nngx_client_set_keepalive(ngx_client_session_t *s)\n{\n    ngx_pool_t                 *pool;\n\n    if (s->closed) {\n        return;\n    }\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, &s->log, 0,\n            \"nginx client set keepalive\");\n\n    ngx_client_reusable_connection(s);\n\n    pool = s->pool;\n    NGX_DESTROY_POOL(pool);\n}\n\n\nstatic void\nngx_client_close_handler(ngx_event_t *ev)\n{\n    ngx_client_session_t       *s;\n    ngx_pool_t                 *pool;\n    ngx_client_closed_pt        closed;\n\n    s = ev->data;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, &s->log, 0, \"nginx client close\");\n\n    if (s->client_closed) {\n        closed = s->client_closed;\n        s->client_closed = NULL;\n\n        closed(s);\n    }\n\n    ngx_client_close_connection(s);\n\n    pool = s->pool;\n    NGX_DESTROY_POOL(pool); /* s alloc from pool */\n}\n\n\nvoid\nngx_client_close(ngx_client_session_t *s)\n{\n    ngx_event_t                *e;\n\n    if (s->closed) {\n        return;\n    }\n\n    s->log.action = \"close\";\n\n    s->closed = 1;\n\n    e = &s->close;\n    e->data = s;\n    e->handler = ngx_client_close_handler;\n    e->log = &s->log;\n\n    ngx_post_event(e, &ngx_posted_events);\n}\n\n\nngx_chain_t *\nngx_client_state(ngx_http_request_t *r, unsigned detail)\n{\n    ngx_client_conf_t          *ccf;\n    ngx_chain_t                *cl;\n    ngx_buf_t                  *b;\n    ngx_map_node_t             *node;\n    ngx_client_pool_t          *pool;\n    size_t                      len, len1;\n    ngx_uint_t                  n;\n\n    ccf = (ngx_client_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                             ngx_client_module);\n\n    len = sizeof(\"##########ngx client connection pool##########\\n\") - 1\n        + sizeof(\"ngx_client_pool nalloc node: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_client_pool nfree node: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_client_pool idle connection: \\n\") - 1 + NGX_OFF_T_LEN;\n\n    len1 = 0;\n\n    /* node for create pool */\n    if (detail) {\n        n = ccf->nalloc - ccf->nfree;\n        /* \"    addr:port: qsize\\n\" */\n        len1 = 4 + NGX_SOCKADDR_STRLEN + 2 + NGX_OFF_T_LEN + 1;\n        len += len1 * n;\n    }\n\n    cl = ngx_alloc_chain_link(r->pool);\n    if (cl == NULL) {\n        return NULL;\n    }\n    cl->next = NULL;\n\n    b = ngx_create_temp_buf(r->pool, len);\n    if (b == NULL) {\n        return NULL;\n    }\n    cl->buf = b;\n\n    b->last = ngx_snprintf(b->last, len,\n            \"##########ngx client connection pool##########\\n\"\n            \"ngx_client_pool nalloc node: %ui\\n\"\n            \"ngx_client_pool nfree node: %ui\\n\"\n            \"ngx_client_pool idle connection: %ui\\n\",\n            ccf->nalloc, ccf->nfree, ccf->idle_connction);\n\n    if (detail) {\n        for (node = ngx_map_begin(&ccf->client_pools); node;\n                node = ngx_map_next(node))\n        {\n            /* m is first element of ngx_poold_node_t */\n            pool = (ngx_client_pool_t *) node;\n            b->last = ngx_snprintf(b->last, len1, \"    %V: %ui\\n\",\n                    &pool->paddr, pool->qsize);\n        }\n    }\n\n    return cl;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-client-module/ngx_client.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_CLIENT_H_INCLUDED_\n#define _NGX_CLIENT_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_event.h>\n#include <ngx_http.h>\n\n\ntypedef struct ngx_client_session_s     ngx_client_session_t;\n\ntypedef void (* ngx_client_connect_pt)(ngx_client_session_t *s);\ntypedef void (* ngx_client_recv_pt)(ngx_client_session_t *s);\ntypedef void (* ngx_client_send_pt)(ngx_client_session_t *s);\ntypedef void (* ngx_client_closed_pt)(ngx_client_session_t *s);\n\n\nstruct ngx_client_session_s {\n    ngx_peer_connection_t       peer;\n    ngx_str_t                   server; /* server original address */\n    in_port_t                   port;   /* server port */\n\n    ngx_connection_t           *connection;\n\n    ngx_pool_t                 *pool;\n    ngx_log_t                   log;\n\n    void                       *data;   /* save ctx for callback */\n\n    ngx_chain_t                *out;    /* save data unsend */\n\n    /* configured part */\n\n    /* timer for connecting to server */\n    ngx_msec_t                  connect_timeout;\n\n    /* timer for sending buffer full */\n    ngx_msec_t                  send_timeout;\n\n    /*\n     * data will be postponed until nginx has at least\n     * postpone_output bytes of data to send\n     */\n    size_t                      postpone_output;\n\n    /* use dynamic resolver mechanism for resolving domain */\n    unsigned                    dynamic_resolver:1;\n\n    unsigned                    tcp_nodelay:1; /* TCP_NODELAY */\n    unsigned                    tcp_nopush:1;  /* TCP_CORK */\n\n    /* runtime part */\n\n    size_t                      recv;        /* client recv bytes */\n\n    unsigned                    connected:1; /* client connected to server */\n    unsigned                    closed:1;    /* client has been closed */\n\n    ngx_event_t                 close;       /* for async close */\n\n    /* callback */\n\n    ngx_client_connect_pt       client_connected; /* connect successd */\n    ngx_client_recv_pt          client_recv;      /* recv msg from peer */\n    ngx_client_send_pt          client_send;      /* send msg to peer */\n    ngx_client_closed_pt        client_closed;    /* finalize connection */\n};\n\n\n/*\n * create a client session\n *\n * return value:\n *      return client session for successd, return NULL for failed\n * paras:\n *      peer: server address and port, address could be domain or ip\n *      local: set if need to bind local address, or set NULL\n *      udp: set 1, use udp, set 0, use tcp\n *      log: for logging error when create client session failed\n */\nngx_client_session_t *ngx_client_create(ngx_str_t *peer, ngx_str_t *local,\n        ngx_flag_t udp, ngx_log_t *log);\n\n\n/*\n * connect to client server, should use client session created by\n *  ngx_client_create. before connect to server, user can set paras in\n *  configured part.\n *\n * return value:\n *      void\n * paras:\n *      s: client session created by ngx_client_create\n */\nvoid ngx_client_connect(ngx_client_session_t *s);\n\n\n/*\n * send data to server\n *\n * return value:\n *      NGX_ERROR: write error, client session will be closed\n *      NGX_AGAIN: data not sent completely, it will save in client session out\n *      NGX_OK:    data sent completely\n * paras:\n *      s: client session\n *      out: data for sending\n */\nngx_int_t ngx_client_write(ngx_client_session_t *s, ngx_chain_t *out);\n\n\n/*\n * read data from server\n *\n * return value:\n *      NGX_ERROR: read error, client session will be closed\n *      NGX_DECLINED: buf for receiving data is full\n *      NGX_AGAIN: no data for reading\n *      0: server closed\n *      >0: bytes read into buffer\n * paras:\n *      s: client session\n *      b: buffer for receiving data\n */\nngx_int_t ngx_client_read(ngx_client_session_t *s, ngx_buf_t *b);\n\n\n/*\n * keepalive client connection, and destroy session\n *  if use client connect the same ip:port,\n *  new client session will reuse the connection\n *\n * return value:\n *      void\n * paras:\n *      s: client session\n */\nvoid ngx_client_set_keepalive(ngx_client_session_t *s);\n\n\n/*\n * close client session\n *\n * return value:\n *      void\n * paras:\n *      s: client session\n */\nvoid ngx_client_close(ngx_client_session_t *s);\n\n\n/*\n * paras:\n *      r: http request to query status of client\n */\nngx_chain_t *ngx_client_state(ngx_http_request_t *r, unsigned detail);\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-client-module/ngx_http_client.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include \"ngx_http_client.h\"\n#include \"ngx_rbuf.h\"\n#include \"ngx_poold.h\"\n#include \"ngx_map.h\"\n#include \"ngx_timerd.h\"\n\n\nstatic void *ngx_http_client_module_create_conf(ngx_cycle_t *cycle);\nstatic char *ngx_http_client_module_init_conf(ngx_cycle_t *cycle, void *conf);\n\n/* headers in */\nstatic ngx_int_t ngx_http_client_process_header_line(ngx_http_request_t *r,\n       ngx_table_elt_t *h, ngx_uint_t offset);\nstatic ngx_int_t ngx_http_client_process_content_length(ngx_http_request_t *r,\n       ngx_table_elt_t *h, ngx_uint_t offset);\nstatic ngx_int_t ngx_http_client_process_connection(ngx_http_request_t *r,\n       ngx_table_elt_t *h, ngx_uint_t offset);\nstatic ngx_int_t\n       ngx_http_client_process_transfer_encoding(ngx_http_request_t *r,\n       ngx_table_elt_t *h, ngx_uint_t offset);\n\n/* headers out */\nstatic void ngx_http_client_host(ngx_http_request_t *r, ngx_str_t *value);\nstatic void ngx_http_client_user_agent(ngx_http_request_t *r,\n       ngx_str_t *value);\nstatic void ngx_http_client_connection(ngx_http_request_t *r, ngx_str_t *value);\nstatic void ngx_http_client_accept(ngx_http_request_t *r, ngx_str_t *value);\nstatic void ngx_http_client_date(ngx_http_request_t *r, ngx_str_t *value);\n\n\n/* for http response */\ntypedef struct {\n    ngx_list_t                      headers;\n\n    ngx_uint_t                      http_version;\n    ngx_uint_t                      status_n;\n    ngx_str_t                       status_line;\n\n    ngx_table_elt_t                *status;\n    ngx_table_elt_t                *date;\n    ngx_table_elt_t                *server;\n    ngx_table_elt_t                *connection;\n\n    ngx_table_elt_t                *expires;\n    ngx_table_elt_t                *etag;\n    ngx_table_elt_t                *x_accel_expires;\n    ngx_table_elt_t                *x_accel_redirect;\n    ngx_table_elt_t                *x_accel_limit_rate;\n\n    ngx_table_elt_t                *content_type;\n    ngx_table_elt_t                *content_length;\n\n    ngx_table_elt_t                *last_modified;\n    ngx_table_elt_t                *location;\n    ngx_table_elt_t                *accept_ranges;\n    ngx_table_elt_t                *www_authenticate;\n    ngx_table_elt_t                *transfer_encoding;\n\n#if (NGX_HTTP_GZIP)\n    ngx_table_elt_t                *content_encoding;\n#endif\n\n    off_t                           content_length_n;\n\n    unsigned                        connection_type:2;\n    unsigned                        chunked:1;\n} ngx_http_client_headers_in_t;\n\n\ntypedef struct {\n    ngx_map_node_t                  node;\n    ngx_str_t                       key;\n    ngx_str_t                       value;\n} ngx_http_client_header_out_t;\n\n\ntypedef struct {\n    ngx_array_t                     headers; /* ngx_http_client_header_out_t */\n    ngx_map_t                       hash;    /* find header by header */\n} ngx_http_client_headers_out_t;\n\n\ntypedef struct {\n    ngx_client_session_t           *session;\n    void                           *request;\n\n    /* Request */\n    ngx_request_url_t               url;\n\n    /* Response */\n    ngx_http_status_t               status;\n    ngx_http_chunked_t              chunked;\n    ngx_int_t                       length;\n\n    /* bufs */\n    ngx_chain_t                    *in;\n    ngx_buf_t                      *buffer;     /* status line buf */\n\n    /* config */\n    ngx_msec_t                      header_timeout;\n    size_t                          header_buffer_size;\n\n    /* runtime */\n    off_t                           rbytes;     /* read bytes */\n    off_t                           wbytes;     /* write bytes */\n\n    ngx_http_client_headers_in_t    headers_in;\n    ngx_http_client_headers_out_t   headers_out;\n\n    ngx_http_client_handler_pt      read_handler;\n    ngx_http_client_handler_pt      write_handler;\n} ngx_http_client_ctx_t;\n\n\nstatic ngx_str_t ngx_http_client_method[] = {\n    ngx_string(\"GET\"),\n    ngx_string(\"HEAD\"),\n    ngx_string(\"POST\"),\n    ngx_string(\"PUT\"),\n    ngx_string(\"DELETE\"),\n    ngx_string(\"MKCOL\"),\n    ngx_string(\"COPY\"),\n    ngx_string(\"MOVE\"),\n    ngx_string(\"OPTIONS\"),\n    ngx_string(\"PROPFIND\"),\n    ngx_string(\"PROPPATCH\"),\n    ngx_string(\"LOCK\"),\n    ngx_string(\"UNLOCK\"),\n    ngx_string(\"PATCH\"),\n    ngx_string(\"TRACE\")\n};\n\n\nstatic ngx_str_t ngx_http_client_version[] = {\n    ngx_string(\"HTTP/0.9\"), /* not support, will not use */\n    ngx_string(\"HTTP/1.0\"),\n    ngx_string(\"HTTP/1.1\"),\n    ngx_string(\"HTTP/2.0\")\n};\n\n\n#define NGX_HTTP_CLIENT_CONNECTION_CLOSE        1\n#define NGX_HTTP_CLIENT_CONNECTION_KEEP_ALIVE   2\n#define NGX_HTTP_CLIENT_CONNECTION_UPGRADE      3\n\n\ntypedef void (*ngx_http_client_fill_header_pt)(ngx_http_request_t *r,\n                                               ngx_str_t *value);\n\ntypedef struct {\n    ngx_str_t                       name;\n    ngx_http_client_fill_header_pt  handler;\n} ngx_http_client_fill_header_t;\n\n\ntypedef struct {\n    ngx_hash_t                      headers_in_hash;\n\n    /* wait for response header timeout */\n    ngx_msec_t                      header_timeout;\n    size_t                          header_buffer_size;\n    size_t                          body_buffer_size;\n} ngx_http_client_conf_t;\n\n\nngx_http_header_t  ngx_http_client_headers_in[] = {\n\n    { ngx_string(\"Status\"), offsetof(ngx_http_client_headers_in_t, status),\n                 ngx_http_client_process_header_line },\n\n    { ngx_string(\"Date\"), offsetof(ngx_http_client_headers_in_t, date),\n                 ngx_http_client_process_header_line },\n\n    { ngx_string(\"Server\"), offsetof(ngx_http_client_headers_in_t, server),\n                 ngx_http_client_process_header_line },\n\n    { ngx_string(\"Connection\"),\n                 offsetof(ngx_http_client_headers_in_t, connection),\n                 ngx_http_client_process_connection },\n\n    { ngx_string(\"Expires\"), offsetof(ngx_http_client_headers_in_t, expires),\n                 ngx_http_client_process_header_line },\n\n    { ngx_string(\"ETag\"), offsetof(ngx_http_client_headers_in_t, etag),\n                 ngx_http_client_process_header_line },\n\n    { ngx_string(\"X-Accel-Expires\"),\n                 offsetof(ngx_http_client_headers_in_t, x_accel_expires),\n                 ngx_http_client_process_header_line },\n\n    { ngx_string(\"X-Accel-Redirect\"),\n                 offsetof(ngx_http_client_headers_in_t, x_accel_redirect),\n                 ngx_http_client_process_header_line },\n\n    { ngx_string(\"X-Accel-Limit-Rate\"),\n                 offsetof(ngx_http_client_headers_in_t, x_accel_limit_rate),\n                 ngx_http_client_process_header_line },\n\n    { ngx_string(\"Content-Type\"),\n                 offsetof(ngx_http_client_headers_in_t, content_type),\n                 ngx_http_client_process_header_line },\n\n    { ngx_string(\"Content-Length\"),\n                 offsetof(ngx_http_client_headers_in_t, content_length),\n                 ngx_http_client_process_content_length },\n\n    { ngx_string(\"Last-Modified\"),\n                 offsetof(ngx_http_client_headers_in_t, last_modified),\n                 ngx_http_client_process_header_line },\n\n    { ngx_string(\"Location\"), offsetof(ngx_http_client_headers_in_t, location),\n                 ngx_http_client_process_header_line },\n\n    { ngx_string(\"Accept-Ranges\"),\n                 offsetof(ngx_http_client_headers_in_t, accept_ranges),\n                 ngx_http_client_process_header_line },\n\n    { ngx_string(\"WWW-Authenticate\"),\n                 offsetof(ngx_http_client_headers_in_t, www_authenticate),\n                 ngx_http_client_process_header_line },\n\n    { ngx_string(\"Transfer-Encoding\"),\n                 offsetof(ngx_http_client_headers_in_t, transfer_encoding),\n                 ngx_http_client_process_transfer_encoding },\n\n#if (NGX_HTTP_GZIP)\n    { ngx_string(\"Content-Encoding\"),\n                 offsetof(ngx_http_client_headers_in_t, content_encoding),\n                 ngx_http_client_process_header_line },\n#endif\n\n    { ngx_null_string, 0, NULL }\n};\n\n\nngx_http_client_fill_header_t ngx_http_client_default_header[] = {\n    { ngx_string(\"Host\"),       ngx_http_client_host       },\n    { ngx_string(\"User-Agent\"), ngx_http_client_user_agent },\n    { ngx_string(\"Connection\"), ngx_http_client_connection },\n    { ngx_string(\"Accept\"),     ngx_http_client_accept     },\n    { ngx_string(\"Date\"),       ngx_http_client_date       },\n    { ngx_null_string,          NULL }\n};\n\n\nstatic ngx_command_t    ngx_http_client_commands[] = {\n\n    { ngx_string(\"header_timeout\"),\n      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      0,\n      offsetof(ngx_http_client_conf_t, header_timeout),\n      NULL },\n\n    { ngx_string(\"header_buffer_size\"),\n      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_size_slot,\n      0,\n      offsetof(ngx_http_client_conf_t, header_buffer_size),\n      NULL },\n\n    { ngx_string(\"body_buffer_size\"),\n      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_size_slot,\n      0,\n      offsetof(ngx_http_client_conf_t, body_buffer_size),\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_core_module_t    ngx_http_client_module_ctx = {\n    ngx_string(\"http_client\"),\n    ngx_http_client_module_create_conf,\n    ngx_http_client_module_init_conf\n};\n\n\nngx_module_t  ngx_http_client_module = {\n    NGX_MODULE_V1,\n    &ngx_http_client_module_ctx,           /* module context */\n    ngx_http_client_commands,              /* module directives */\n    NGX_CORE_MODULE,                       /* module type */\n    NULL,                                  /* init master */\n    NULL,                                  /* init module */\n    NULL,                                  /* init process */\n    NULL,                                  /* init thread */\n    NULL,                                  /* exit thread */\n    NULL,                                  /* exit process */\n    NULL,                                  /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_http_client_module_create_conf(ngx_cycle_t *cycle)\n{\n    ngx_http_client_conf_t     *hccf;\n\n    hccf = ngx_pcalloc(cycle->pool, sizeof(ngx_http_client_conf_t));\n    if (hccf == NULL) {\n        return NULL;\n    }\n\n    hccf->header_timeout = NGX_CONF_UNSET_MSEC;\n    hccf->header_buffer_size = NGX_CONF_UNSET_SIZE;\n    hccf->body_buffer_size = NGX_CONF_UNSET_SIZE;\n\n    return hccf;\n}\n\n\nstatic char *\nngx_http_client_module_init_conf(ngx_cycle_t *cycle, void *conf)\n{\n    ngx_http_client_conf_t         *hccf = conf;\n\n    ngx_array_t                     headers_in;\n    ngx_hash_key_t                 *hk;\n    ngx_hash_init_t                 hash;\n    ngx_http_header_t              *header;\n\n    /* upstream_headers_in_hash */\n\n    if (ngx_array_init(&headers_in, cycle->pool, 32, sizeof(ngx_hash_key_t))\n        != NGX_OK)\n    {\n        return NGX_CONF_ERROR;\n    }\n\n    for (header = ngx_http_client_headers_in; header->name.len; header++) {\n        hk = ngx_array_push(&headers_in);\n        if (hk == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n        hk->key = header->name;\n        hk->key_hash = ngx_hash_key_lc(header->name.data, header->name.len);\n        hk->value = header;\n    }\n\n    hash.hash = &hccf->headers_in_hash;\n    hash.key = ngx_hash_key_lc;\n    hash.max_size = 512;\n    hash.bucket_size = ngx_align(64, ngx_cacheline_size);\n    hash.name = \"upstream_headers_in_hash\";\n    hash.pool = cycle->pool;\n    hash.temp_pool = NULL;\n\n    if (ngx_hash_init(&hash, headers_in.elts, headers_in.nelts) != NGX_OK) {\n        return NGX_CONF_ERROR;\n    }\n\n    ngx_conf_init_msec_value(hccf->header_timeout, 10000);\n    ngx_conf_init_size_value(hccf->header_buffer_size, ngx_pagesize);\n    ngx_conf_init_size_value(hccf->body_buffer_size, ngx_pagesize);\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_http_client_process_header_line(ngx_http_request_t *r, ngx_table_elt_t *h,\n       ngx_uint_t offset)\n{\n    ngx_table_elt_t           **ph;\n    ngx_http_client_ctx_t      *ctx;\n\n    ctx = r->ctx[0];\n\n    ph = (ngx_table_elt_t **) ((char *) &ctx->headers_in + offset);\n\n    if (*ph == NULL) {\n        *ph = h;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_http_client_process_content_length(ngx_http_request_t *r,\n       ngx_table_elt_t *h, ngx_uint_t offset)\n{\n    ngx_http_client_ctx_t      *ctx;\n\n    ctx = r->ctx[0];\n\n    if (ctx->headers_in.content_length != NULL) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                \"duplicate Content-Length header, %V: %V\", &h->key, &h->value);\n        return NGX_ERROR;\n    }\n\n    ctx->headers_in.content_length = h;\n    ctx->headers_in.content_length_n = ngx_atoof(h->value.data, h->value.len);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_http_client_process_connection(ngx_http_request_t *r, ngx_table_elt_t *h,\n       ngx_uint_t offset)\n{\n    ngx_http_client_ctx_t      *ctx;\n\n    ctx = r->ctx[0];\n\n    ctx->headers_in.connection = h;\n\n    if (ngx_strcasestrn(h->value.data, \"close\", 5)) {\n        ctx->headers_in.connection_type = NGX_HTTP_CLIENT_CONNECTION_CLOSE;\n    } else if (ngx_strcasestrn(h->value.data, \"keep-alive\", 10)) {\n        ctx->headers_in.connection_type = NGX_HTTP_CLIENT_CONNECTION_KEEP_ALIVE;\n    } else if (ngx_strcasestrn(h->value.data, \"upgrade\", 7)) {\n        ctx->headers_in.connection_type = NGX_HTTP_CLIENT_CONNECTION_UPGRADE;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_http_client_process_transfer_encoding(ngx_http_request_t *r,\n       ngx_table_elt_t *h, ngx_uint_t offset)\n{\n    ngx_http_client_ctx_t      *ctx;\n\n    ctx = r->ctx[0];\n\n    ctx->headers_in.transfer_encoding = h;\n\n    if (ngx_strlcasestrn(h->value.data, h->value.data + h->value.len,\n                         (u_char *) \"chunked\", 7 - 1)\n            != NULL)\n    {\n        ctx->headers_in.chunked = 1;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic void\nngx_http_client_host(ngx_http_request_t *r, ngx_str_t *value)\n{\n    ngx_http_client_ctx_t      *ctx;\n\n    ctx = r->ctx[0];\n\n    value->data = ctx->url.host.data;\n    value->len = ctx->url.host.len;\n}\n\n\nstatic void\nngx_http_client_user_agent(ngx_http_request_t *r, ngx_str_t *value)\n{\n    value->data = (u_char *) NGINX_VER;\n    value->len = sizeof(NGINX_VER) - 1;\n}\n\n\nstatic void\nngx_http_client_connection(ngx_http_request_t *r, ngx_str_t *value)\n{\n    if (r->http_version < NGX_HTTP_CLIENT_VERSION_11) {\n        value->data = (u_char *) \"close\";\n        value->len = sizeof(\"close\") - 1;\n    } else {\n        value->len = 0;\n    }\n}\n\n\nstatic void\nngx_http_client_accept(ngx_http_request_t *r, ngx_str_t *value)\n{\n    value->data = (u_char *) \"*/*\";\n    value->len = sizeof(\"*/*\") - 1;\n}\n\n\nstatic void\nngx_http_client_date(ngx_http_request_t *r, ngx_str_t *value)\n{\n    value->data = ngx_cached_http_time.data;\n    value->len = ngx_cached_http_time.len;\n}\n\n\nstatic void\nngx_http_client_free_request(ngx_http_request_t *hcr)\n{\n    ngx_http_client_ctx_t      *ctx;\n    ngx_client_session_t       *s;\n    ngx_pool_t                 *pool;\n    ngx_http_cleanup_t         *cln;\n\n    if (hcr->pool == NULL) {\n        return;\n    }\n\n    ctx = hcr->ctx[0];\n    s = ctx->session;\n\n    if (ctx->request) {\n        cln = hcr->cleanup;\n        hcr->cleanup = NULL;\n\n        while (cln) {\n            if (cln->handler) {\n                cln->handler(cln->data);\n            }\n\n            cln = cln->next;\n        }\n    }\n\n    if (ctx->in) {\n        ngx_put_chainbufs(ctx->in);\n        ctx->in = NULL;\n    }\n\n    if (s) {\n        s->client_recv = NULL;\n        s->client_send = NULL;\n        s->client_closed = NULL;\n        s->out = NULL;\n    }\n\n    pool = hcr->pool;\n    hcr->pool = NULL;\n\n    NGX_DESTROY_POOL(pool);\n}\n\n\nstatic void\nngx_http_client_close_handler(ngx_client_session_t *s)\n{\n    ngx_http_request_t         *r;\n\n    r = s->data;\n\n    ngx_http_client_free_request(r);\n}\n\n\nstatic void\nngx_http_client_discarded_body(ngx_http_request_t *r)\n{\n    ngx_http_client_ctx_t      *ctx;\n    ngx_chain_t                *cl;\n    ngx_int_t                   rc;\n\n    ctx = r->ctx[0];\n\n    rc = ngx_http_client_read_body(r, &cl);\n\n    if (rc == 0 || rc == NGX_ERROR) { // http client close\n        ngx_http_client_finalize_request(r, 1);\n        return;\n    }\n\n    // if detach, all http response receive, set keepalive\n    if (rc == NGX_DONE) {\n        ngx_http_client_finalize_request(r, 0);\n        return;\n    }\n\n    // NGX_AGAIN\n\n    if (ctx->in) { // make rbuf recycle immediately\n        ngx_put_chainbufs(ctx->in);\n        ctx->in = NULL;\n    }\n}\n\n\nstatic void\nngx_http_client_read_handler(ngx_client_session_t *s)\n{\n    ngx_http_request_t         *r;\n    ngx_http_client_ctx_t      *ctx;\n\n    r = s->data;\n    ctx = r->ctx[0];\n\n    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n            \"http client, read handler\");\n\n    if (ctx->request && ctx->read_handler) {\n        ctx->read_handler(ctx->request, r);\n    } else {\n        ngx_http_client_discarded_body(r);\n    }\n}\n\n\nstatic void\nngx_http_client_process_header(ngx_client_session_t *s)\n{\n    ngx_http_request_t         *r;\n    ngx_http_client_ctx_t      *ctx;\n    ngx_buf_t                  *b;\n    ngx_int_t                   n, rc;\n    ngx_table_elt_t            *h;\n    ngx_http_header_t          *hh;\n    ngx_http_client_conf_t     *hccf;\n    ngx_event_t                *rev;\n\n    hccf = (ngx_http_client_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                                   ngx_http_client_module);\n\n    r = s->data;\n    ctx = r->ctx[0];\n    rev = r->connection->read;\n\n    b = ctx->buffer;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n            \"http client, process header\");\n\n    for (;;) {\n\n        rc = ngx_http_parse_header_line(r, b, 1);\n\n        if (rc == NGX_OK) {\n\n            /* a header line has been parsed successfully */\n\n            h = ngx_list_push(&ctx->headers_in.headers);\n            if (h == NULL) {\n                goto error;\n            }\n\n            h->hash = r->header_hash;\n\n            h->key.len = r->header_name_end - r->header_name_start;\n            h->value.len = r->header_end - r->header_start;\n\n            h->key.data = ngx_pnalloc(r->pool,\n                               h->key.len + 1 + h->value.len + 1 + h->key.len);\n            if (h->key.data == NULL) {\n                goto error;\n            }\n\n            h->value.data = h->key.data + h->key.len + 1;\n            h->lowcase_key = h->key.data + h->key.len + 1 + h->value.len + 1;\n\n            ngx_memcpy(h->key.data, r->header_name_start, h->key.len);\n            h->key.data[h->key.len] = '\\0';\n            ngx_memcpy(h->value.data, r->header_start, h->value.len);\n            h->value.data[h->value.len] = '\\0';\n\n            if (h->key.len == r->lowcase_index) {\n                ngx_memcpy(h->lowcase_key, r->lowcase_header, h->key.len);\n\n            } else {\n                ngx_strlow(h->lowcase_key, h->key.data, h->key.len);\n            }\n\n            hh = ngx_hash_find(&hccf->headers_in_hash, h->hash,\n                               h->lowcase_key, h->key.len);\n\n            if (hh && hh->handler(r, h, hh->offset) != NGX_OK) {\n                goto error;\n            }\n\n            ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n                    \"http server header: \\\"%V: %V\\\"\", &h->key, &h->value);\n\n            continue;\n        }\n\n        if (rc == NGX_HTTP_PARSE_HEADER_DONE) {\n\n            /* a whole header has been parsed successfully */\n\n            ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n                    \"http server header done\");\n\n            /*\n             * if no \"Server\" and \"Date\" in header line,\n             * then add the special empty headers\n             */\n\n            if (ctx->headers_in.server == NULL) {\n                h = ngx_list_push(&ctx->headers_in.headers);\n                if (h == NULL) {\n                    goto error;\n                }\n\n                h->hash = ngx_hash(ngx_hash(ngx_hash(ngx_hash(\n                                    ngx_hash('s', 'e'), 'r'), 'v'), 'e'), 'r');\n\n                ngx_str_set(&h->key, \"Server\");\n                ngx_str_null(&h->value);\n                h->lowcase_key = (u_char *) \"server\";\n            }\n\n            if (ctx->headers_in.date == NULL) {\n                h = ngx_list_push(&ctx->headers_in.headers);\n                if (h == NULL) {\n                    goto error;\n                }\n\n                h->hash = ngx_hash(ngx_hash(ngx_hash('d', 'a'), 't'), 'e');\n\n                ngx_str_set(&h->key, \"Date\");\n                ngx_str_null(&h->value);\n                h->lowcase_key = (u_char *) \"date\";\n            }\n\n            /* clear content length if response is chunked */\n\n            if (ctx->headers_in.chunked) {\n                ctx->headers_in.content_length_n = -1;\n            }\n\n            ctx->length = ctx->headers_in.content_length_n;\n\n            break;\n        }\n\n        if (rc == NGX_AGAIN) {\n            n = ngx_client_read(s, b);\n\n            if (n == NGX_ERROR || n == 0) {\n                ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,\n                        \"http client, process header read error\");\n                ngx_http_client_finalize_request(r, 1);\n                return;\n            }\n\n            if (n == NGX_AGAIN) {\n                if (!rev->timer_set) {\n                    NGX_ADD_TIMER(rev, ctx->header_timeout,\n                                  offsetof(ngx_connection_t, number));\n                }\n\n                if (ngx_handle_read_event(rev, 0) != NGX_OK) {\n                    ngx_http_client_finalize_request(r, 1);\n                    return;\n                }\n\n                return;\n            }\n\n            /* NGX_OK */\n            ctx->rbytes += n;\n\n            continue;\n        }\n\n        /* there was error while a header line parsing */\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                \"http client, http server sent invalid header\");\n\n        goto error;\n    }\n\n    s->client_recv = ngx_http_client_read_handler;\n\n    if (rev->timer_set) {\n        NGX_DEL_TIMER(rev, r->connection->number);\n    }\n\n    return ngx_http_client_read_handler(s);\n\nerror:\n    ngx_http_client_finalize_request(r, 1);\n}\n\n\nstatic void\nngx_http_client_process_status_line(ngx_client_session_t *s)\n{\n    ngx_http_request_t         *r;\n    ngx_http_client_ctx_t      *ctx;\n    ngx_buf_t                  *b;\n    ngx_int_t                   n, rc;\n    ngx_event_t                *rev;\n\n    r = s->data;\n    ctx = r->ctx[0];\n    rev = r->connection->read;\n\n    b = ctx->buffer;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n            \"http client, process status line\");\n\n    for (;;) {\n        rc = ngx_http_parse_status_line(r, b, &ctx->status);\n\n        if (rc == NGX_AGAIN) {\n            n = ngx_client_read(s, b);\n\n            if (n == NGX_ERROR || n == 0) {\n                ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,\n                        \"http client, process status line read error\");\n                ngx_http_client_finalize_request(r, 1);\n                return;\n            }\n\n            if (n == NGX_AGAIN) {\n                if (!rev->timer_set) {\n                    NGX_ADD_TIMER(rev, ctx->header_timeout,\n                                  offsetof(ngx_connection_t, number));\n                }\n\n                if (ngx_handle_read_event(rev, 0) != NGX_OK) {\n                    ngx_http_client_finalize_request(r, 1);\n                    return;\n                }\n\n                return;\n            }\n\n            /* NGX_OK */\n            ctx->rbytes += n;\n\n            continue;\n        }\n\n        if (rc == NGX_ERROR) {\n\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                    \"http client, recv no valid HTTP/1.0 header\");\n\n            r->http_version = NGX_HTTP_VERSION_9;\n        }\n\n        /* NGX_OK */\n        break;\n    }\n\n    ctx->headers_in.http_version = ctx->status.http_version;\n    ctx->headers_in.status_n = ctx->status.code;\n\n    ctx->headers_in.status_line.len = ctx->status.end - ctx->status.start;\n    ctx->headers_in.status_line.data = ngx_pcalloc(r->connection->pool,\n                                       ctx->headers_in.status_line.len);\n    if (ctx->headers_in.status_line.data == NULL) {\n        ngx_http_client_finalize_request(r, 1);\n        return;\n    }\n    ngx_memcpy(ctx->headers_in.status_line.data, ctx->status.start,\n               ctx->headers_in.status_line.len);\n\n    s->client_recv = ngx_http_client_process_header;\n    return ngx_http_client_process_header(s);\n}\n\n\nstatic void\nngx_http_client_wait_response_handler(ngx_client_session_t *s)\n{\n    ngx_http_request_t         *r;\n    ngx_http_client_ctx_t      *ctx;\n    ngx_buf_t                  *b;\n    ngx_connection_t           *c;\n    size_t                      size;\n    ngx_int_t                   n;\n    ngx_event_t                *rev;\n\n    r = s->data;\n    c = r->connection;\n    ctx = r->ctx[0];\n    size = ctx->header_buffer_size;\n    rev = s->connection->read;\n\n    b = ctx->buffer;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n            \"http client, process response handler\");\n\n    if (b == NULL) {\n        b = ngx_create_temp_buf(c->pool, size);\n        if (b == NULL) {\n            ngx_http_client_finalize_request(r, 1);\n            return;\n        }\n\n        ctx->buffer = b;\n    } else if (b->start == NULL) {\n\n        b->start = ngx_pcalloc(c->pool, size);\n        if (b->start == NULL) {\n            ngx_http_client_finalize_request(r, 1);\n            return;\n        }\n\n        b->last = b->pos = b->start;\n        b->end = b->last + size;\n    }\n\n    n = ngx_client_read(s, b);\n    /*\n     * if NGX_ERROR or no bytes read\n     * if ngx_client_read return NGX_ERROR, s will reconnect\n     * if 0, ngx_http_client_wait_response_handler\n     *      will called next read event triggered\n     */\n    if (n == NGX_ERROR || n == 0) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,\n                \"http client, process response handler read error, rc :%i\", n);\n        ngx_http_client_finalize_request(r, 1);\n        return;\n    }\n\n    if (n == NGX_AGAIN) {\n        if (!rev->timer_set) {\n            NGX_ADD_TIMER(rev, ctx->header_timeout,\n                          offsetof(ngx_connection_t, number));\n        }\n\n        if (ngx_handle_read_event(rev, 0) != NGX_OK) {\n            ngx_http_client_finalize_request(r, 1);\n            return;\n        }\n\n        return;\n    }\n\n    ctx->rbytes += n;\n\n    s->client_recv = ngx_http_client_process_status_line;\n    return ngx_http_client_process_status_line(s);\n}\n\n\nstatic ngx_int_t\nngx_http_client_set_url(ngx_http_request_t *r, ngx_str_t *url, ngx_log_t *log)\n{\n    ngx_http_client_ctx_t      *ctx;\n    ngx_client_session_t       *cs;\n    ngx_int_t                   rc;\n\n    ctx = r->ctx[0];\n\n    if (ctx->session) {\n        ngx_log_error(NGX_LOG_INFO, log, 0, \"http client, url has been set\");\n        return NGX_OK;\n    }\n\n    r->request_line.data = ngx_pcalloc(r->pool, url->len);\n    if (r->request_line.data == NULL) {\n        return NGX_ERROR;\n    }\n    ngx_memcpy(r->request_line.data, url->data, url->len);\n    r->request_line.len = url->len;\n\n    rc = ngx_parse_request_url(&ctx->url, &r->request_line);\n    if (rc == NGX_ERROR) {\n        return NGX_ERROR;\n    }\n\n    /* create session */\n    cs = ngx_client_create(&ctx->url.host, NULL, 0, log);\n    if (cs == NULL) {\n        return NGX_ERROR;\n    }\n\n    cs->port = ngx_request_port(&ctx->url.scheme, &ctx->url.port);\n\n    ctx->session = cs;\n    cs->data = r;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_http_client_add_header(ngx_http_request_t *r, ngx_str_t *header,\n        ngx_str_t *value)\n{\n    ngx_http_client_ctx_t      *ctx;\n    ngx_http_client_header_out_t *h;\n    ngx_map_node_t             *node;\n\n    ctx = r->ctx[0];\n\n    node = ngx_map_find(&ctx->headers_out.hash, (intptr_t) header);\n    if (node) { // header exist\n        h = (ngx_http_client_header_out_t *) node;\n    } else { // header not exist\n        h = ngx_array_push(&ctx->headers_out.headers);\n        if (h == NULL) {\n            return NGX_ERROR;\n        }\n        ngx_memzero(h, sizeof(ngx_http_client_header_out_t));\n\n        h->key.data = ngx_pcalloc(r->pool, header->len);\n        if (h->key.data == NULL) {\n            return NGX_ERROR;\n        }\n        ngx_memcpy(h->key.data, header->data, header->len);\n        h->key.len = header->len;\n\n        h->node.raw_key = (intptr_t) &h->key;\n        ngx_map_insert(&ctx->headers_out.hash, &h->node, 1);\n    }\n\n    if (value->len == 0) { // delete header\n        h->value.len = 0;\n        return NGX_OK;\n    }\n\n    // add or modify header\n    h->value.data = ngx_pcalloc(r->pool, value->len);\n    if (h->value.data == NULL) {\n        return NGX_ERROR;\n    }\n    ngx_memcpy(h->value.data, value->data, value->len);\n    h->value.len = value->len;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_buf_t *\nngx_http_client_create_request_buf(ngx_client_session_t *s)\n{\n    ngx_http_request_t         *r;\n    ngx_http_client_ctx_t      *ctx;\n    ngx_buf_t                  *b;\n    size_t                      len;\n    ngx_http_client_header_out_t *h;\n    ngx_uint_t                  i;\n\n    r = s->data;\n    ctx = r->ctx[0];\n\n    /* Request Line */\n    /* method */\n    len = ngx_http_client_method[r->method].len + 1;  /* \"GET \" */\n\n    /* path + args */\n    ++len; /* \"/\" */\n    if (ctx->url.path.len) {\n        /* \"path\" */\n        len += ctx->url.path.len;\n    }\n\n    if (ctx->url.args.len) {\n        /* \"?args\" */\n        ++len;\n        len += ctx->url.args.len;\n    }\n    ++len; /* \" \" */\n\n    /* version */\n    len += sizeof(\"HTTP/1.x\") - 1 + sizeof(CRLF) - 1;\n\n    /* Request Headers */\n    /* User set headers */\n    h = ctx->headers_out.headers.elts;\n    for (i = 0; i < ctx->headers_out.headers.nelts; ++i, ++h) {\n        if (h->value.len == 0) {\n            continue;\n        }\n\n        len += h->key.len + sizeof(\": \") - 1 + h->value.len + sizeof(CRLF) - 1;\n    }\n\n    /* Request Headers end */\n    len += sizeof(CRLF) - 1;\n\n    /* start fill http request */\n    b = ngx_create_temp_buf(r->pool, len);\n    if (b == NULL) {\n        return NULL;\n    }\n\n    /* method */\n    b->last = ngx_cpymem(b->last, ngx_http_client_method[r->method].data,\n                         ngx_http_client_method[r->method].len);\n    *b->last++ = ' ';\n\n    /* path + args */\n    *b->last++ = '/';\n    if (ctx->url.path.len) {\n        b->last = ngx_cpymem(b->last, ctx->url.path.data, ctx->url.path.len);\n    }\n\n    if (ctx->url.args.len) {\n        *b->last++ = '?';\n        b->last = ngx_cpymem(b->last, ctx->url.args.data, ctx->url.args.len);\n    }\n    *b->last++ = ' ';\n\n    /* version */\n    b->last = ngx_cpymem(b->last,\n                          ngx_http_client_version[r->http_version].data,\n                          ngx_http_client_version[r->http_version].len);\n    *b->last++ = CR; *b->last++ = LF;\n\n    /* Request Headers */\n    h = ctx->headers_out.headers.elts;\n    for (i = 0; i < ctx->headers_out.headers.nelts; ++i, ++h) {\n        if (h->value.len == 0) {\n            continue;\n        }\n\n        b->last = ngx_cpymem(b->last, h->key.data, h->key.len);\n        *b->last++ = ':'; *b->last++ = ' ';\n        b->last = ngx_cpymem(b->last, h->value.data, h->value.len);\n        *b->last++ = CR; *b->last++ = LF;\n    }\n\n    /* Request Headers end */\n    *b->last++ = CR; *b->last++ = LF;\n\n    return b;\n}\n\n\nstatic void\nngx_http_client_send_header(ngx_client_session_t *s)\n{\n    ngx_http_request_t         *r;\n    ngx_http_client_ctx_t      *ctx;\n    ngx_buf_t                  *b;\n    ngx_chain_t                 out;\n    ngx_event_t                *rev;\n\n    r = s->data;\n    ctx = r->ctx[0];\n\n    r->connection = s->connection;\n    rev = r->connection->read;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n            \"http client, send header\");\n\n    r->connection = s->peer.connection;\n\n    b = ngx_http_client_create_request_buf(s);\n    if (b == NULL) {\n        goto destroy;\n    }\n    b->flush = 1;\n\n    out.buf = b;\n    out.next = NULL;\n\n    /* send http request header */\n    ngx_client_write(s, &out);\n\n    /* user defined, for send body function callback */\n    if (ctx->request && ctx->write_handler) {\n        ctx->write_handler(ctx->request, r);\n    }\n\n    NGX_ADD_TIMER(rev, ctx->header_timeout, offsetof(ngx_connection_t, number));\n\n    return;\n\ndestroy:\n    ngx_http_client_finalize_request(r, 1);\n}\n\n\nstatic ngx_int_t\nngx_http_client_body_length(ngx_http_request_t *r, ngx_chain_t *cl)\n{\n    ngx_http_client_ctx_t      *ctx;\n    ngx_buf_t                  *buf;\n    ngx_chain_t               **ll;\n    ngx_int_t                   len;\n\n    ctx = r->ctx[0];\n\n    for (ll = &ctx->in; *ll; ll = &(*ll)->next);\n\n    while (cl) {\n        *ll = cl;\n        cl = cl->next;\n        (*ll)->next = NULL;\n\n        if (ctx->length != -1) {\n            buf = (*ll)->buf;\n\n            len = ngx_min(buf->last - buf->pos, ctx->length);\n            ctx->length -= len;\n\n            if (ctx->length == 0) {\n                if (cl || buf->last - buf->pos > len) {\n                    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n                            \"http client, read unexpected data\");\n                    ngx_put_chainbufs(cl);\n                }\n                return NGX_DONE;\n            }\n        }\n\n        ll = &(*ll)->next;\n    }\n\n    return NGX_AGAIN;\n}\n\n\nstatic ngx_int_t\nngx_http_client_body_chunked(ngx_http_request_t *r, ngx_chain_t *cl)\n{\n    ngx_http_client_ctx_t      *ctx;\n    ngx_http_client_conf_t     *hccf;\n    ngx_buf_t                  *buf, *b;\n    ngx_chain_t               **ll, *ln;\n    ngx_int_t                   rc;\n    size_t                      len;\n\n    ctx = r->ctx[0];\n    hccf = (ngx_http_client_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                                   ngx_http_client_module);\n\n    for (ll = &ctx->in; *ll; ll = &(*ll)->next);\n\n    while (1) {\n\n        b = cl->buf;\n        rc = ngx_http_parse_chunked(r, b, &ctx->chunked);\n\n        ngx_log_debug7(NGX_LOG_DEBUG_CORE, r->connection->log, 0,\n                \"http client, parse chunked %p %p-%p %p, rc: %d, %O %O\",\n                b->start, b->pos, b->last, b->end,\n                rc, ctx->chunked.size, ctx->chunked.length);\n\n        if (rc == NGX_OK) {\n\n            /* a chunk has been parsed successfully */\n\n            while (1) {\n                if (*ll == NULL) {\n                    *ll = ngx_get_chainbuf(hccf->body_buffer_size, 1);\n                    if (*ll == NULL) {\n                        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                                \"http client, get chainbuf failed\");\n                        return NGX_ERROR;\n                    }\n                }\n\n                buf = (*ll)->buf;\n\n                if (b->last - b->pos >= ctx->chunked.size) {\n                    len = ngx_min(buf->end - buf->last, ctx->chunked.size);\n                } else {\n                    len = ngx_min(buf->end - buf->last, b->last - b->pos);\n                }\n\n                buf->last = ngx_cpymem(buf->last, b->pos, len);\n                b->pos += len;\n                ctx->chunked.size -= len;\n\n                if (buf->last == buf->end) {\n                    ll = &(*ll)->next;\n                }\n\n                if (b->pos == b->last) { // current cl read over\n                    ln = cl;\n                    cl = cl->next;\n                    ngx_put_chainbuf(ln);\n\n                    if (cl == NULL) {\n                        return NGX_AGAIN;\n                    }\n\n                    b = cl->buf;\n                }\n\n                if (ctx->chunked.size == 0) { // current chunk read over\n                    break;\n                }\n            }\n\n            ngx_log_debug7(NGX_LOG_DEBUG_CORE, r->connection->log, 0,\n                    \"http client, parse done %p %p-%p %p, rc: %d, %O %O\",\n                    b->start, b->pos, b->last, b->end,\n                    rc, ctx->chunked.size, ctx->chunked.length);\n\n            continue;\n        }\n\n        if (rc == NGX_AGAIN) {\n            ln = cl;\n            cl = cl->next;\n            ngx_put_chainbuf(ln);\n\n            if (cl == NULL) {\n                return NGX_AGAIN;\n            }\n\n            continue;\n        }\n\n        if (rc == NGX_DONE) {\n            if (b->pos != b->last || cl->next) {\n                ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n                        \"http client, read unexpected chunked data\");\n            }\n            ngx_put_chainbufs(cl);\n\n            return NGX_DONE;\n        }\n\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                \"http client, invalid chunked response\");\n\n        return NGX_ERROR;\n    }\n}\n\n\n/* create and set http request */\n\nngx_http_request_t *\nngx_http_client_create(ngx_log_t *log, ngx_uint_t method, ngx_str_t *url,\n    ngx_keyval_t *headers, ngx_http_client_handler_pt send_body, void *request)\n{\n    ngx_pool_t                 *pool;\n    ngx_http_request_t         *r;\n    ngx_http_client_ctx_t      *ctx;\n    ngx_http_client_conf_t     *hccf;\n    ngx_http_client_fill_header_t   *h;\n    ngx_str_t                   value;\n\n    hccf = (ngx_http_client_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                                   ngx_http_client_module);\n\n    if (url == NULL) {\n        ngx_log_error(NGX_LOG_ERR, log, 0,\n                \"url is NULL when create http client\");\n        return NULL;\n    }\n\n    pool = NGX_CREATE_POOL(4096, ngx_cycle->log);\n    if (pool == NULL) {\n        ngx_log_error(NGX_LOG_ERR, log, 0,\n                \"client create, create pool failed\");\n        return NULL;\n    }\n\n    r = ngx_pcalloc(pool, sizeof(ngx_http_request_t));\n    if (r == NULL) {\n        ngx_log_error(NGX_LOG_ERR, log, 0,\n                \"client create, create http request failed\");\n        goto destroy;\n    }\n    r->pool = pool;\n    r->main = r;\n\n    /* create http client ctx */\n    r->ctx = ngx_pcalloc(pool, sizeof(void *) * 1);\n    if (r->ctx == NULL) {\n        ngx_log_error(NGX_LOG_ERR, log, 0,\n                \"client create, create http request ctxs failed\");\n        goto destroy;\n    }\n\n    ctx = ngx_pcalloc(pool, sizeof(ngx_http_client_ctx_t));\n    if (ctx == NULL) {\n        ngx_log_error(NGX_LOG_ERR, log, 0,\n                \"client create, create http request ctx failed\");\n        goto destroy;\n    }\n    r->ctx[0] = ctx;\n\n    /* set paras for http client */\n    r->method = method;\n\n    /* default version HTTP/1.1 */\n    r->http_version = NGX_HTTP_CLIENT_VERSION_11;\n\n    /* for send body */\n    ctx->request = request;\n    ctx->write_handler = send_body;\n\n    ctx->header_timeout = hccf->header_timeout;\n    ctx->header_buffer_size = hccf->header_buffer_size;\n\n    if (ngx_http_client_set_url(r, url, log) == NGX_ERROR) {\n        ngx_log_error(NGX_LOG_ERR, log, 0,\n                \"client create, set url failed\");\n        goto destroy;\n    }\n\n    /* headers_out */\n    if (ngx_array_init(&ctx->headers_out.headers, pool, 64,\n            sizeof(ngx_http_client_header_out_t)) != NGX_OK)\n    {\n        ngx_log_error(NGX_LOG_ERR, log, 0,\n                \"client create, init headers out failed\");\n        goto destroy;\n    }\n\n    ngx_map_init(&ctx->headers_out.hash, ngx_map_hash_str, ngx_cmp_str);\n\n    h = ngx_http_client_default_header;\n    while(h->name.len) {\n        h->handler(r, &value);\n        if (ngx_http_client_add_header(r, &h->name, &value) != NGX_OK) {\n            ngx_log_error(NGX_LOG_ERR, log, 0,\n                    \"client create, set default header %V: %V failed\",\n                    &h->name, &value);\n            goto destroy;\n        }\n        ++h;\n    }\n\n    while (headers && headers->key.len) {\n        if (ngx_http_client_add_header(r, &headers->key, &headers->value)\n                != NGX_OK)\n        {\n            ngx_log_error(NGX_LOG_ERR, log, 0,\n                    \"client create, set user header %V: %V failed\",\n                    &h->name, &value);\n            goto destroy;\n        }\n        ++headers;\n    }\n\n    return r;\n\ndestroy:\n    NGX_DESTROY_POOL(pool);\n\n    return NULL;\n}\n\n\nngx_http_cleanup_t *\nngx_http_client_cleanup_add(ngx_http_request_t *r, size_t size)\n{\n    ngx_http_cleanup_t  *cln;\n\n    r = r->main;\n\n    cln = ngx_palloc(r->pool, sizeof(ngx_http_cleanup_t));\n    if (cln == NULL) {\n        return NULL;\n    }\n\n    if (size) {\n        cln->data = ngx_palloc(r->pool, size);\n        if (cln->data == NULL) {\n            return NULL;\n        }\n\n    } else {\n        cln->data = NULL;\n    }\n\n    cln->handler = NULL;\n    cln->next = r->cleanup;\n\n    r->cleanup = cln;\n\n    return cln;\n}\n\n\nvoid\nngx_http_client_set_read_handler(ngx_http_request_t *r,\n    ngx_http_client_handler_pt read_handler)\n{\n    ngx_http_client_ctx_t      *ctx;\n\n    ctx = r->ctx[0];\n\n    ctx->read_handler = read_handler;\n}\n\n\nngx_int_t\nngx_http_client_set_headers(ngx_http_request_t *r, ngx_keyval_t *headers)\n{\n    while (headers && headers->key.len) {\n        if (ngx_http_client_add_header(r, &headers->key, &headers->value)\n                != NGX_OK)\n        {\n            return NGX_ERROR;\n        }\n        ++headers;\n    }\n\n    return NGX_OK;\n}\n\n\nvoid\nngx_http_client_set_write_handler(ngx_http_request_t *r,\n    ngx_http_client_handler_pt write_handler)\n{\n    ngx_http_client_ctx_t      *ctx;\n\n    ctx = r->ctx[0];\n\n    ctx->write_handler = write_handler;\n}\n\n\nvoid\nngx_http_client_set_version(ngx_http_request_t *r, ngx_uint_t version)\n{\n    r->http_version = version;\n}\n\n\nvoid\nngx_http_client_setopt(ngx_http_request_t *r, unsigned opt, ngx_uint_t value)\n{\n    ngx_http_client_ctx_t      *ctx;\n    ngx_client_session_t       *s;\n\n    ctx = r->ctx[0];\n    s = ctx->session;\n\n    switch (opt) {\n    case NGX_HTTP_CLIENT_OPT_CONNECT_TIMEOUT:\n        s->connect_timeout = value;\n        break;\n    case NGX_HTTP_CLIENT_OPT_SEND_TIMEOUT:\n        s->send_timeout = value;\n        break;\n    case NGX_HTTP_CLIENT_OPT_POSTPONE_OUTPUT:\n        s->postpone_output = value;\n        break;\n    case NGX_HTTP_CLIENT_OPT_DYNAMIC_RESOLVER:\n        s->dynamic_resolver = value > 0;\n        break;\n    case NGX_HTTP_CLIENT_OPT_TCP_NODELAY:\n        s->tcp_nodelay = value > 0;\n        break;\n    case NGX_HTTP_CLIENT_OPT_TCP_NOPUSH:\n        s->tcp_nopush = value > 0;\n        break;\n    case NGX_HTTP_CLIENT_OPT_HEADER_TIMEOUT:\n        ctx->header_timeout = value;\n        break;\n    default:\n        ngx_log_error(NGX_LOG_ERR, &s->log, 0,\n                \"try to set unsupported opt %d\", opt);\n        break;\n    }\n}\n\n/* send http request */\n\nngx_int_t\nngx_http_client_send(ngx_http_request_t *r)\n{\n    ngx_client_session_t       *s;\n    ngx_http_client_ctx_t      *ctx;\n\n    ctx = r->ctx[0];\n    s = ctx->session;\n\n    /* init */\n    s->client_connected = ngx_http_client_send_header;\n    s->client_recv = ngx_http_client_wait_response_handler;\n    s->client_closed = ngx_http_client_close_handler;\n\n    /*\n     * init ctx->headers_in, headers_in use c->pool,\n     * reconnect will destroy and reinit ctx->headsers_in\n     */\n    if (ngx_list_init(&ctx->headers_in.headers, r->pool, 20,\n                      sizeof(ngx_table_elt_t))\n        != NGX_OK)\n    {\n        return NGX_ERROR;\n    }\n    ctx->headers_in.content_length_n = -1;\n\n    ngx_client_connect(s);\n\n    return NGX_OK;\n}\n\n\nngx_http_request_t *\nngx_http_client_get(ngx_log_t *log, ngx_str_t *url, ngx_keyval_t *headers,\n    void *request)\n{\n    ngx_http_request_t         *r;\n\n    r = ngx_http_client_create(log, NGX_HTTP_CLIENT_GET, url, headers,\n            NULL, request);\n    if (r == NULL) {\n        return NULL;\n    }\n\n    if (ngx_http_client_send(r) == NGX_ERROR) {\n        return NULL;\n    }\n\n    return r;\n}\n\n\nngx_http_request_t *\nngx_http_client_head(ngx_log_t *log, ngx_str_t *url, ngx_keyval_t *headers,\n    void *request)\n{\n    ngx_http_request_t         *r;\n\n    r = ngx_http_client_create(log, NGX_HTTP_CLIENT_HEAD, url, headers,\n            NULL, request);\n    if (r == NULL) {\n        return NULL;\n    }\n\n    if (ngx_http_client_send(r) == NGX_ERROR) {\n        return NULL;\n    }\n\n    return r;\n}\n\n\nngx_http_request_t *\nngx_http_client_post(ngx_log_t *log, ngx_str_t *url, ngx_keyval_t *headers,\n    ngx_http_client_handler_pt send_body, void *request)\n{\n    ngx_http_request_t         *r;\n\n    r = ngx_http_client_create(log, NGX_HTTP_CLIENT_POST, url, headers,\n            send_body, request);\n    if (r == NULL) {\n        return NULL;\n    }\n\n    if (ngx_http_client_send(r) == NGX_ERROR) {\n        return NULL;\n    }\n\n    return r;\n}\n\n\n/* get response */\n\nngx_uint_t\nngx_http_client_http_version(ngx_http_request_t *r)\n{\n    ngx_http_client_ctx_t      *ctx;\n\n    ctx = r->ctx[0];\n\n    return ctx->headers_in.http_version;\n}\n\n\nngx_uint_t\nngx_http_client_status_code(ngx_http_request_t *r)\n{\n    ngx_http_client_ctx_t      *ctx;\n\n    ctx = r->ctx[0];\n\n    return ctx->headers_in.status_n;\n}\n\n\nngx_str_t *\nngx_http_client_header_in(ngx_http_request_t *r, ngx_str_t *key)\n{\n    ngx_http_client_ctx_t      *ctx;\n    ngx_table_elt_t            *h;\n    ngx_list_part_t            *part;\n    ngx_uint_t                  i;\n\n    ctx = r->ctx[0];\n\n    part = &ctx->headers_in.headers.part;\n    h = part->elts;\n\n    for (i = 0; /* void */; ++i) {\n\n        if (i >= part->nelts) {\n            if (part->next == NULL) {\n                break;\n            }\n\n            part = part->next;\n            h = part->elts;\n            i = 0;\n        }\n\n        if (h[i].hash == 0) {\n            continue;\n        }\n\n        if (h[i].key.len == key->len\n            && ngx_strncasecmp(h[i].key.data, key->data, key->len) == 0)\n        {\n            return &h[i].value;\n        }\n    }\n\n    return NULL;\n}\n\n\nngx_int_t\nngx_http_client_read_body(ngx_http_request_t *r, ngx_chain_t **in)\n{\n    ngx_client_session_t       *s;\n    ngx_http_client_ctx_t      *ctx;\n    ngx_http_client_conf_t     *hccf;\n    ngx_buf_t                  *buf;\n    ngx_int_t                   n, rc;\n    ngx_event_t                *rev;\n    ngx_chain_t                *cl, **ll, *ln;\n\n    ctx = r->ctx[0];\n    s = ctx->session;\n    rev = r->connection->read;\n    hccf = (ngx_http_client_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                                   ngx_http_client_module);\n\n    // recycle bufs\n    while (ctx->in) {\n        cl = ctx->in;\n        ctx->in = cl->next;\n        if (cl->buf->pos != cl->buf->last) {\n            break;\n        }\n\n        ngx_put_chainbuf(cl);\n    }\n\n    cl = NULL;\n    ll = &cl;\n\n    // part of body will read with header\n    if (ctx->buffer->last != ctx->buffer->pos) {\n        ln = ngx_get_chainbuf(hccf->body_buffer_size, 0);\n        if (ln == NULL) {\n            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n                    \"http client, alloc chainbuf without buffer failed\");\n            return NGX_ERROR;\n        }\n        buf = ln->buf;\n        buf->pos = ctx->buffer->pos;\n        buf->last = ctx->buffer->last;\n        ctx->buffer->pos = ctx->buffer->last;\n\n        *ll = ln;\n        ll = &(*ll)->next;\n    }\n\n    // start read\n    while (1) {\n        ln = ngx_get_chainbuf(hccf->body_buffer_size, 1);\n        if (ln == NULL) {\n            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n                    \"http client, alloc chainbuf with buffer failed\");\n            return NGX_ERROR;\n        }\n        buf = ln->buf;\n\n        n = ngx_client_read(s, buf);\n\n        if (n == 0) {\n            ngx_put_chainbuf(ln);\n            ngx_put_chainbufs(cl);\n\n            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n                    \"http client, server close\");\n            return 0;\n        }\n\n        if (n == NGX_ERROR) {\n            ngx_put_chainbuf(ln);\n            ngx_put_chainbufs(cl);\n\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,\n                    \"http client, server error close\");\n            return NGX_ERROR;\n        }\n\n        if (n == NGX_AGAIN) { // all data in socket has been read\n            ngx_put_chainbuf(ln);\n\n            if (ngx_handle_read_event(rev, 0) != NGX_OK) {\n                ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,\n                        \"http client, handle read event error\");\n                return NGX_ERROR;\n            }\n\n            break;\n        }\n\n        *ll = ln;\n        ll = &(*ll)->next;\n        ctx->rbytes += n;\n    }\n\n    if (ctx->headers_in.chunked) {\n        rc = ngx_http_client_body_chunked(r, cl);\n    } else {\n        rc = ngx_http_client_body_length(r, cl);\n    }\n\n    if (rc == NGX_ERROR) { // parse chunked error\n        return NGX_ERROR;\n    }\n\n    *in = ctx->in;\n    if (rc == NGX_DONE) { // all body has been read\n        return NGX_DONE;\n    }\n\n    return NGX_AGAIN;\n}\n\n\noff_t\nngx_http_client_rbytes(ngx_http_request_t *r)\n{\n    ngx_http_client_ctx_t      *ctx;\n\n    ctx = r->ctx[0];\n\n    return ctx->rbytes;\n}\n\n\noff_t\nngx_http_client_wbytes(ngx_http_request_t *r)\n{\n    ngx_http_client_ctx_t      *ctx;\n\n    ctx = r->ctx[0];\n\n    return ctx->wbytes;\n}\n\n\n/* end request */\n\nvoid\nngx_http_client_detach(ngx_http_request_t *r)\n{\n    ngx_http_client_ctx_t      *ctx;\n\n    if (r == NULL) {\n        return;\n    }\n\n    ctx = r->ctx[0];\n\n    ctx->request = NULL;\n\n    if (r->connection) {\n        ngx_post_event(r->connection->read, &ngx_posted_events);\n    }\n}\n\n\nvoid\nngx_http_client_finalize_request(ngx_http_request_t *r, ngx_flag_t closed)\n{\n    ngx_http_client_ctx_t      *ctx;\n    ngx_client_session_t       *s;\n\n    ctx = r->ctx[0];\n    s = ctx->session;\n\n    ngx_http_client_free_request(r);\n\n    if (closed) {\n        ngx_client_close(s);\n    } else {\n        ngx_client_set_keepalive(s);\n    }\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-client-module/ngx_http_client.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_HTTP_CLIENT_H_INCLUDE_\n#define _NGX_HTTP_CLIENT_H_INCLUDE_\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_client.h\"\n#include \"ngx_toolkit_misc.h\"\n\n\n// http client method\n#define NGX_HTTP_CLIENT_GET         0\n#define NGX_HTTP_CLIENT_HEAD        1\n#define NGX_HTTP_CLIENT_POST        2\n#define NGX_HTTP_CLIENT_PUT         3\n#define NGX_HTTP_CLIENT_DELETE      4\n#define NGX_HTTP_CLIENT_MKCOL       5\n#define NGX_HTTP_CLIENT_COPY        6\n#define NGX_HTTP_CLIENT_MOVE        7\n#define NGX_HTTP_CLIENT_OPTIONS     8\n#define NGX_HTTP_CLIENT_PROPFIND    9\n#define NGX_HTTP_CLIENT_PROPPATCH   10\n#define NGX_HTTP_CLIENT_LOCK        11\n#define NGX_HTTP_CLIENT_UNLOCK      12\n#define NGX_HTTP_CLIENT_PATCH       13\n#define NGX_HTTP_CLIENT_TRACE       14\n\n// http client version\n#define NGX_HTTP_CLIENT_VERSION_9   0\n#define NGX_HTTP_CLIENT_VERSION_10  1\n#define NGX_HTTP_CLIENT_VERSION_11  2\n#define NGX_HTTP_CLIENT_VERSION_20  3\n\n// http client opt\n#define NGX_HTTP_CLIENT_OPT_CONNECT_TIMEOUT     0\n#define NGX_HTTP_CLIENT_OPT_SEND_TIMEOUT        1\n#define NGX_HTTP_CLIENT_OPT_POSTPONE_OUTPUT     2\n#define NGX_HTTP_CLIENT_OPT_DYNAMIC_RESOLVER    3\n#define NGX_HTTP_CLIENT_OPT_TCP_NODELAY         4\n#define NGX_HTTP_CLIENT_OPT_TCP_NOPUSH          5\n#define NGX_HTTP_CLIENT_OPT_HEADER_TIMEOUT      6\n\n\ntypedef void (* ngx_http_client_handler_pt)(void *r, ngx_http_request_t *hcr);\n\n\n/* create and set http request */\n\n/*\n * create a http request for sending to server\n *\n * return value:\n *      return http request for successd, return NULL for failed\n *\n * paras:\n *      log: error in create will use this log\n *      method: http client method\n *      url: full request url like \"http://test.com/index.html?hello=world\"\n *      headers: http request header for sending\n *      send_body: callback for sending body\n *      request: who send http request\n */\nngx_http_request_t *ngx_http_client_create(ngx_log_t *log,\n    ngx_uint_t method, ngx_str_t *url, ngx_keyval_t *headers,\n    ngx_http_client_handler_pt send_body, void *request);\n\n/*\n * add cleanup as ngx_http_cleanup_add\n */\nngx_http_cleanup_t *ngx_http_client_cleanup_add(ngx_http_request_t *r,\n    size_t size);\n\n/*\n * set read handler for http client, should set before send request,\n *  otherwise body from server will discard\n *\n * return value:\n *      void\n *\n * paras:\n *      r: http client request\n *      read_handler: handler for setting\n */\nvoid ngx_http_client_set_read_handler(ngx_http_request_t *r,\n    ngx_http_client_handler_pt read_handler);\n\n/*\n * set http headers\n *\n * return value:\n *      NGX_OK for successd, NGX_ERROR for failed\n *\n * paras:\n *      r: http client request\n *      headers: headers set into r\n *          if value is not null, will set or modify the header\n *          if value is null string, will delete the header\n */\nngx_int_t ngx_http_client_set_headers(ngx_http_request_t *r,\n        ngx_keyval_t *headers);\n\n/*\n * set write handler for http client, if set,\n *  will use this handler for sending body,\n *\n * return value:\n *      void\n *\n * paras:\n *      r: http client request\n *      write_handler: handler for setting\n */\nvoid ngx_http_client_set_write_handler(ngx_http_request_t *r,\n    ngx_http_client_handler_pt write_handler);\n\n/*\n * set write handler for http client, if set,\n *  will use this handler for sending body,\n *\n * return value:\n *      void\n *\n * paras:\n *      r: http client request\n *      write_handler: handler for setting\n */\nvoid ngx_http_client_set_version(ngx_http_request_t *r, ngx_uint_t version);\n\n/*\n * set http client option\n *\n * return value:\n *      void\n *\n * paras:\n *      r: http client request\n *      opt: http client opt\n *          NGX_HTTP_CLIENT_OPT_CONNECT_TIMEOUT:\n *              connect server timer\n *          NGX_HTTP_CLIENT_OPT_SEND_TIMEOUT:\n *              send data timer when buffer full\n *          NGX_HTTP_CLIENT_OPT_POSTPONE_OUTPUT:\n *              size threshold to send\n *          NGX_HTTP_CLIENT_OPT_DYNAMIC_RESOLVER:\n *              whether use dynamic resolver to resolv domain\n *          NGX_HTTP_CLIENT_OPT_TCP_NODELAY:\n *              whether set TCP_NODELAY\n *          NGX_HTTP_CLIENT_OPT_TCP_NOPUSH:\n *              whether set TCP_CORK\n *          NGX_HTTP_CLIENT_OPT_HEADER_TIMEOUT:\n *              timer for waiting response header from server\n *      value: http client opt value want to set\n */\nvoid ngx_http_client_setopt(ngx_http_request_t *r, unsigned opt,\n    ngx_uint_t value);\n\n/* send http request */\n\n/*\n * send http request\n *\n * return value:\n *      NGX_OK for successd, NGX_ERROR for failed\n *\n * paras:\n *      r: http request for seding, create by ngx_http_client_create\n */\nngx_int_t ngx_http_client_send(ngx_http_request_t *r);\n\n/*\n * create and send http GET request to server\n *\n * return value:\n *      return http request for successd, return NULL for failed\n *\n * paras:\n *      log: error in create will use this log\n *      url: full request url like \"http://test.com/index.html?hello=world\"\n *      headers: http request header for sending\n *      request: who send http request\n */\nngx_http_request_t *ngx_http_client_get(ngx_log_t *log, ngx_str_t *url,\n    ngx_keyval_t *headers, void *request);\n\n/*\n * create and send http HEAD request to server\n *\n * return value:\n *      return http request for successd, return NULL for failed\n *\n * paras:\n *      log: error in create will use this log\n *      url: full request url like \"http://test.com/index.html?hello=world\"\n *      headers: http request header for sending\n *      request: who send http request\n */\nngx_http_request_t *ngx_http_client_head(ngx_log_t *log, ngx_str_t *url,\n    ngx_keyval_t *headers, void *request);\n\n/*\n * create and send http POST request to server\n *\n * return value:\n *      return http request for successd, return NULL for failed\n *\n * paras:\n *      log: error in create will use this log\n *      url: full request url like \"http://test.com/index.html?hello=world\"\n *      headers: http request header for sending\n *      send_body: callback for sending body\n *      request: who send http request\n */\nngx_http_request_t *ngx_http_client_post(ngx_log_t *log, ngx_str_t *url,\n    ngx_keyval_t *headers, ngx_http_client_handler_pt send_body, void *request);\n\n\n/* get response */\n\n/*\n * get http response version\n *\n * return value:\n *      http response version\n *\n * paras:\n *      r: http client request\n */\nngx_uint_t ngx_http_client_http_version(ngx_http_request_t *r);\n\n/*\n * get http response status code\n *\n * return value:\n *      http response status code like 200, 500\n *\n * paras:\n *      r: http client request\n */\nngx_uint_t ngx_http_client_status_code(ngx_http_request_t *r);\n\n/*\n * get http response header's value\n *\n * return value:\n *      http response header's value\n *\n * paras:\n *      r: http client request\n *      key: http header like \"Host\", \"Content-Type\"\n */\nngx_str_t *ngx_http_client_header_in(ngx_http_request_t *r, ngx_str_t *key);\n\n/*\n * read http response body\n *\n * return value:\n *      NGX_AGAIN: read part of data\n *      0: tcp connection disconnect, need finalize request with 1\n *      NGX_ERROR: tcp connection error disconnect, need finalize request with 1\n *      NGX_DONE: response body has been read, could finalize request with 0\n *\n * paras:\n *      r: http client request\n *      in: where read data put\n */\nngx_int_t ngx_http_client_read_body(ngx_http_request_t *r, ngx_chain_t **in);\n\n/*\n * get receive bytes\n *\n * return value:\n *      bytes receive from server\n *\n * paras:\n *      r: http client request\n */\noff_t ngx_http_client_rbytes(ngx_http_request_t *r);\n\n/*\n * get send bytes\n *\n * return value:\n *      bytes send to server\n *\n * paras:\n *      r: http client request\n */\noff_t ngx_http_client_wbytes(ngx_http_request_t *r);\n\n\n/* end request */\n\n/*\n * detach http client request with it's creator,\n *  all read and write handler will not be triggered\n *\n * return value:\n *      bytes send to server\n *\n * paras:\n *      r: http client request\n */\nvoid ngx_http_client_detach(ngx_http_request_t *r);\n\n/*\n * finalize http client request\n *\n * return value:\n *      void\n *\n * paras:\n *      r: http client request\n *      closed: set to 1, will close connection to server\n *          set to 0, will keep connection to server alive\n */\nvoid ngx_http_client_finalize_request(ngx_http_request_t *r, ngx_flag_t closed);\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-client-module/t/config",
    "content": "ngx_addon_name=ngx_client_test_module\n\nHTTP_MODULES=\"$HTTP_MODULES                                         \\\n             ngx_client_test_module                                 \\\n             ngx_http_client_test_module                            \\\n             ngx_client_stat_module                                 \\\n             \"\n\nNGX_ADDON_SRCS=\"$NGX_ADDON_SRCS\n               $ngx_addon_dir/ngx_client_test_module.c              \\\n               $ngx_addon_dir/ngx_http_client_test_module.c         \\\n               $ngx_addon_dir/ngx_client_stat_module.c              \\\n               \"\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-client-module/t/nginx.conf",
    "content": "\nuser  root;\nworker_processes  4;\n\n#error_log  logs/error.log;\n#error_log  logs/error.log  notice;\nerror_log  logs/error.log  info;\n\n#pid        logs/nginx.pid;\n\nevents {\n    worker_connections  1024;\n    resolver  192.168.84.254;\n    dynamic_refresh_interval 5m;\n}\n\n\nhttp {\n    include       mime.types;\n    default_type  application/octet-stream;\n\n    #log_format  main  '$remote_addr - $remote_user [$time_local] \"$request\" '\n    #                  '$status $body_bytes_sent \"$http_referer\" '\n    #                  '\"$http_user_agent\" \"$http_x_forwarded_for\"';\n\n    #access_log  logs/access.log  main;\n\n    sendfile        on;\n    #tcp_nopush     on;\n\n    #keepalive_timeout  0;\n    keepalive_timeout  65;\n\n    #gzip  on;\n\n    server {\n        listen       80;\n        server_name  localhost;\n\n        location / {\n            root     html;\n            index    index.html index.htm;\n        }\n\n        location /client_test {\n            client_test;\n        }\n\n        location /http_client_test {\n            http_client_test;\n        }\n\n        location /client_stat {\n            client_stat;\n        }\n    }\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-client-module/t/ngx_client_stat_module.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_event.h>\n#include <ngx_http.h>\n#include \"ngx_client.h\"\n#include \"ngx_rbuf.h\"\n#include \"ngx_poold.h\"\n#include \"ngx_timerd.h\"\n#include \"ngx_event_timer_module.h\"\n#include \"ngx_event_resolver.h\"\n#include \"ngx_dynamic_resolver.h\"\n\n\nstatic char *ngx_client_stat(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\n\n\nstatic ngx_command_t  ngx_client_stat_commands[] = {\n\n    { ngx_string(\"client_stat\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,\n      ngx_client_stat,\n      NGX_HTTP_LOC_CONF_OFFSET,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_client_stat_module_ctx = {\n    NULL,                               /* preconfiguration */\n    NULL,                               /* postconfiguration */\n\n    NULL,                               /* create main configuration */\n    NULL,                               /* init main configuration */\n\n    NULL,                               /* create server configuration */\n    NULL,                               /* merge server configuration */\n\n    NULL,                               /* create location configuration */\n    NULL                                /* merge location configuration */\n};\n\n\nngx_module_t  ngx_client_stat_module = {\n    NGX_MODULE_V1,\n    &ngx_client_stat_module_ctx,        /* module context */\n    ngx_client_stat_commands,           /* module directives */\n    NGX_HTTP_MODULE,                    /* module type */\n    NULL,                               /* init master */\n    NULL,                               /* init module */\n    NULL,                               /* init process */\n    NULL,                               /* init thread */\n    NULL,                               /* exit thread */\n    NULL,                               /* exit process */\n    NULL,                               /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_int_t\nngx_client_stat_handler(ngx_http_request_t *r)\n{\n    ngx_chain_t                       **ll, *out;\n    ngx_buf_t                          *b;\n    size_t                              len;\n\n    r->headers_out.status = NGX_HTTP_OK;\n    ngx_http_send_header(r);\n\n    ll = &out;\n\n    len = sizeof(\"--------------------------------------------------\\n\") - 1\n        + sizeof(\"ngx_worker:   ngx_process_slot:   pid: \\n\") - 1\n        + 3 * NGX_OFF_T_LEN;\n\n    *ll = ngx_alloc_chain_link(r->pool);\n    if (*ll == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n    (*ll)->next = NULL;\n\n    b = ngx_create_temp_buf(r->pool, len);\n    if (b == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n    (*ll)->buf = b;\n\n    b->last = ngx_snprintf(b->last, len,\n            \"--------------------------------------------------\\n\"\n            \"ngx_worker: %i  ngx_process_slot: %i  pid: %i\\n\",\n            ngx_worker, ngx_process_slot, ngx_pid);\n\n    if (*ll) {\n        ll = &(*ll)->next;\n    }\n    *ll = ngx_rbuf_state(r, 1);\n\n    if (*ll) {\n        ll = &(*ll)->next;\n    }\n    *ll = ngx_event_timer_state(r);\n\n    if (*ll) {\n        ll = &(*ll)->next;\n    }\n    *ll = ngx_event_resolver_state(r);\n\n    if (*ll) {\n        ll = &(*ll)->next;\n    }\n    *ll = ngx_dynamic_resolver_state(r);\n\n    if (*ll) {\n        ll = &(*ll)->next;\n    }\n    *ll = ngx_poold_state(r, 1);\n\n    if (*ll) {\n        ll = &(*ll)->next;\n    }\n    *ll = ngx_timerd_state(r, 1);\n\n    if (*ll) {\n        ll = &(*ll)->next;\n    }\n    *ll = ngx_client_state(r, 1);\n\n    (*ll)->buf->last_buf = 1;\n\n    return ngx_http_output_filter(r, out);\n}\n\nstatic char *\nngx_client_stat(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t           *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_client_stat_handler;\n\n    return NGX_CONF_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-client-module/t/ngx_client_test_module.c",
    "content": "#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_client.h\"\n\n\nstatic char *ngx_client_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\n\n\nstatic ngx_command_t  ngx_client_test_commands[] = {\n\n    { ngx_string(\"client_test\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,\n      ngx_client_test,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_client_test_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    NULL,                                   /* postconfiguration */\n\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n\n    NULL,                                   /* create location configuration */\n    NULL                                    /* merge location configuration */\n};\n\n\nngx_module_t  ngx_client_test_module = {\n    NGX_MODULE_V1,\n    &ngx_client_test_module_ctx,            /* module context */\n    ngx_client_test_commands,               /* module directives */\n    NGX_HTTP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void\nngx_client_test_connected(ngx_client_session_t *s)\n{\n    ngx_buf_t                  *b;\n    size_t                      len;\n    ngx_chain_t                 out;\n    ngx_http_request_t         *r;\n    ngx_event_t                *wev;\n\n    ngx_log_error(NGX_LOG_ERR, &s->log, 0, \"client connected\");\n\n    r = s->data;\n    wev = s->peer.connection->write;\n\n    len = sizeof(\"nginx client test\\n\") - 1;\n    b = ngx_create_temp_buf(s->pool, len);\n\n    if (b == NULL) {\n        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);\n        return;\n    }\n\n    b->last = ngx_copy(b->last, \"nginx client test\\n\", len);\n    b->last_buf = 1;\n\n    out.buf = b;\n    out.next = NULL;\n\n    ngx_client_write(s, &out);\n\n    ngx_handle_write_event(wev, 0);\n}\n\nstatic void\nngx_client_test_recv(ngx_client_session_t *s)\n{\n    ngx_buf_t                  *b;\n    ngx_int_t                   n;\n    ngx_connection_t           *c;\n    ngx_str_t                   recv;\n    ngx_http_request_t         *r;\n\n    c = s->peer.connection;\n    r = s->data;\n\n    b = ngx_create_temp_buf(s->pool, 4096);\n    if (b == NULL) {\n        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);\n        return;\n    }\n\n    n = c->recv(c, b->pos, b->end - b->last);\n    if (n == NGX_AGAIN) {\n        ngx_log_error(NGX_LOG_ERR, &s->log, 0, \"client recv NGX_AGAIN\");\n        return;\n    }\n\n    if (n == NGX_ERROR || n == 0) {\n        ngx_log_error(NGX_LOG_ERR, &s->log, 0, \"client recv NGX_ERROR\");\n        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);\n        ngx_client_close(s);\n        return;\n    }\n\n    b->last += n;\n\n    recv.data = b->pos;\n    recv.len = b->last - b->pos;\n\n    ngx_log_error(NGX_LOG_ERR, &s->log, 0, \"client recv %d: %V, %z\",\n            n, &recv, recv.len);\n\n    ngx_http_finalize_request(r, NGX_HTTP_FORBIDDEN);\n    ngx_client_set_keepalive(s);\n    return;\n}\n\nstatic void\nngx_client_test_send(ngx_client_session_t *s)\n{\n    ngx_log_error(NGX_LOG_ERR, &s->log, 0, \"client send\");\n}\n\nstatic void\nngx_client_test_closed(ngx_client_session_t *s)\n{\n    ngx_log_error(NGX_LOG_ERR, &s->log, 0, \"client closed\");\n}\n\nstatic ngx_int_t\nngx_client_test_handler(ngx_http_request_t *r)\n{\n    ngx_client_session_t           *s;\n    ngx_str_t                       echo;\n\n    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, \"client test handler\");\n\n    if (ngx_http_arg(r, (u_char *) \"echo\", sizeof(\"echo\") - 1, &echo)\n            != NGX_OK)\n    {\n        return NGX_HTTP_BAD_REQUEST;\n    }\n\n    s = ngx_client_create(&echo, NULL, 0, r->connection->log);\n    if (s == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    //ci->dynamic_resolver = 0;\n    //ci->recvbuf = 4096;\n\n    s->client_connected = ngx_client_test_connected;\n    s->client_recv = ngx_client_test_recv;\n    s->client_send = ngx_client_test_send;\n    s->client_closed = ngx_client_test_closed;\n    s->data = r;\n\n    ngx_client_connect(s);\n\n    ++r->count;\n\n    return NGX_DONE;\n}\n\n\nstatic char *\nngx_client_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t  *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_client_test_handler;\n\n    return NGX_CONF_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-client-module/t/ngx_http_client_test_module.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include \"ngx_http_client.h\"\n#include \"ngx_rbuf.h\"\n\n\nstatic char *ngx_http_client_test(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\n\n\nstatic ngx_command_t  ngx_http_client_test_commands[] = {\n\n    { ngx_string(\"http_client_test\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,\n      ngx_http_client_test,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_http_client_test_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    NULL,                                   /* postconfiguration */\n\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n\n    NULL,                                   /* create location configuration */\n    NULL                                    /* merge location configuration */\n};\n\n\nngx_module_t  ngx_http_client_test_module = {\n    NGX_MODULE_V1,\n    &ngx_http_client_test_module_ctx,       /* module context */\n    ngx_http_client_test_commands,          /* module directives */\n    NGX_HTTP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void\nngx_http_client_test_recv_body(void *request, ngx_http_request_t *hcr)\n{\n    ngx_http_request_t             *r;\n    ngx_chain_t                    *cl = NULL;\n    ngx_chain_t                   **ll;\n    ngx_int_t                       rc;\n\n    r = request;\n\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n            \"http client test recv body\");\n\n    rc = ngx_http_client_read_body(hcr, &cl);\n\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n            \"http client test recv body, rc %i %i, %O\",\n            rc, ngx_errno, ngx_http_client_rbytes(hcr));\n\n    if (rc == 0) {\n        goto done;\n    }\n\n    if (rc == NGX_ERROR) {\n        goto done;\n    }\n\n    if (rc == NGX_DONE) {\n        for (ll = &cl; (*ll)->next; ll = &(*ll)->next);\n\n        (*ll)->buf->last_buf = 1;\n    }\n\n    ngx_http_output_filter(r, cl);\n\n    ngx_http_run_posted_requests(r->connection);\n\n    if (rc == NGX_AGAIN) {\n        return;\n    }\n\n    if (rc == NGX_DONE) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                \"all body has been read\");\n        ngx_http_client_finalize_request(hcr, 0);\n    }\n\ndone:\n    ngx_http_finalize_request(r, NGX_OK);\n}\n\nstatic void\nngx_http_client_test_recv(void *request, ngx_http_request_t *hcr)\n{\n    ngx_http_request_t             *r;\n    static ngx_str_t                content_type = ngx_string(\"Content-Type\");\n    static ngx_str_t                connection = ngx_string(\"Connection\");\n    static ngx_str_t                unknown = ngx_string(\"Unknown\");\n    ngx_str_t                      *ct, *con;\n\n    r = request;\n\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n            \"http client test recv, connection: %p\", hcr->connection);\n\n    r->headers_out.status = 200;\n\n    ngx_http_client_set_read_handler(hcr, ngx_http_client_test_recv_body);\n\n    ngx_http_send_header(r);\n\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n            \"status_code: %ui   http_version: %ui\",\n            ngx_http_client_status_code(hcr),\n            ngx_http_client_http_version(hcr));\n\n    ct = ngx_http_client_header_in(hcr, &content_type);\n    con = ngx_http_client_header_in(hcr, &connection);\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, \"Content-Type: %V\", ct);\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, \"Connection: %V\", con);\n\n    if (ngx_http_client_header_in(hcr, &unknown) == NULL) {\n        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, \"no header Unknown\");\n    }\n\n    ngx_http_client_test_recv_body(request, hcr);\n}\n\n\nstatic ngx_int_t\nngx_http_client_test_handler(ngx_http_request_t *r)\n{\n    ngx_http_request_t         *hcr;\n    static ngx_str_t   request_url = ngx_string(\"http://101.200.241.232/\");\n\n    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"http client test handler\");\n\n    // Default header Host, User-Agent, Connection(below HTTP/1.1), Accept, Date\n    hcr = ngx_http_client_create(r->connection->log, NGX_HTTP_CLIENT_GET,\n            &request_url, NULL, NULL, r);\n\n    // add Connection, delete Date, Modify Host, add new header\n    ngx_str_t                   value;\n\n    value.data = (u_char *) \"World\";\n    value.len = sizeof(\"World\") - 1;\n\n    ngx_keyval_t                headers[] = {\n        { ngx_string(\"Host\"),       ngx_string(\"www.test.com\") },\n        { ngx_string(\"Connection\"), ngx_string(\"upgrade\") },\n        { ngx_string(\"Date\"),       ngx_null_string },\n        { ngx_string(\"Hello\"),      value },\n        { ngx_null_string,          ngx_null_string } // must end with null str\n    };\n    ngx_http_client_set_headers(hcr, headers);\n\n    ngx_http_client_set_read_handler(hcr, ngx_http_client_test_recv);\n\n    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"http client test before send\");\n\n    ngx_http_client_send(hcr);\n\n    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"http client test after send\");\n\n//    ngx_http_client_detach(hcr);\n//    return NGX_HTTP_FORBIDDEN;\n\n    ++r->count;\n\n    return NGX_DONE;\n}\n\n\nstatic char *\nngx_http_client_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t   *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_http_client_test_handler;\n\n    return NGX_CONF_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-client-module/t/tcpserver.go",
    "content": "package main\n\nimport (\n\t\"fmt\"\n\t\"net\"\n)\n\nfunc handleConnection(c net.Conn) {\n\tb := make([]byte, 4096)\n\n\tfor {\n\t\tn, err := c.Read(b)\n\t\tif err != nil {\n\t\t\tfmt.Print(\"Read Error \", err)\n\t\t\tc.Close()\n\t\t\treturn\n\t\t}\n\n\t\tfmt.Print(\"recv \", n, \" data:\", string(b))\n\n\t\tc.Write(b[0:n])\n\t}\n}\n\nfunc main() {\n\tln, err := net.Listen(\"tcp\", \":10000\")\n\tif err != nil {\n\t\tfmt.Print(\"Listen Error \", err)\n\t\treturn\n\t}\n\n\tfor {\n\t\tconn, err := ln.Accept()\n\t\tif err != nil {\n\t\t\tfmt.Print(\"Accept Error \", err)\n\t\t\tcontinue\n\t\t}\n\n\t\tgo handleConnection(conn)\n\t}\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-multiport-module/COPYRIGHT",
    "content": "Copyright (C) 2016-2020, by Jie Wu \"AlexWoo\" <wj19840501@gmail.com>.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n1. Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\nOR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\nHOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\nLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\nOUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGE.\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-multiport-module/config",
    "content": "ngx_addon_name=ngx_multiport_module\n\nEVENT_MODULES=\"$EVENT_MODULES                                       \\\n              ngx_event_multiport_module                            \\\n              \"\n\nCORE_MODULES=\"$CORE_MODULES                                         \\\n             ngx_process_slot_module                                \\\n             ngx_stream_zone_module                                 \\\n             \"\n\nHTTP_FILTER_MODULES=\"$HTTP_FILTER_MODULES                           \\\n                    ngx_http_broadcast_module                       \\\n                    ngx_http_inner_proxy_module                     \\\n                    \"\n\nNGX_ADDON_SRCS=\"$NGX_ADDON_SRCS                                     \\\n               $ngx_addon_dir/ngx_multiport_misc.c                  \\\n               $ngx_addon_dir/ngx_event_multiport_module.c          \\\n               $ngx_addon_dir/ngx_process_slot_module.c             \\\n               $ngx_addon_dir/ngx_stream_zone_module.c              \\\n               $ngx_addon_dir/ngx_http_broadcast_module.c           \\\n               $ngx_addon_dir/ngx_http_inner_proxy_module.c         \\\n               \"\n\nNGX_ADDON_DEPS=\"$NGX_ADDON_DEPS                                     \\\n               $ngx_addon_dir/ngx_multiport.h                       \\\n               $ngx_addon_dir/ngx_stream_zone_module.h              \\\n               \"\n\nCFLAGS=\"$CFLAGS -I $ngx_addon_dir\"\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-multiport-module/ngx_event_multiport_module.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_event.h>\n#include \"ngx_multiport.h\"\n\n\nstatic ngx_int_t ngx_event_multiport_process_init(ngx_cycle_t *cycle);\nstatic void ngx_event_multiport_process_exit(ngx_cycle_t *cycle);\n\nstatic void *ngx_event_multiport_create_conf(ngx_cycle_t *cycle);\nstatic char *ngx_event_multiport_init_conf(ngx_cycle_t *cycle, void *conf);\n\nstatic char *ngx_event_multiport_listen(ngx_conf_t *cf, ngx_command_t *cmd,\n            void *conf);\n\n\n//multiport_listen listenparas relationport\ntypedef struct {\n    ngx_str_t               multiport;\n    ngx_str_t               relatedport;\n    ngx_listening_t         listening;\n} ngx_event_multiport_listen_t;\n\ntypedef struct {\n    ngx_array_t            *ports; /* array of ngx_event_multiport_listen_t */\n} ngx_event_multiport_conf_t;\n\n\nstatic ngx_str_t  event_multiport_name = ngx_string(\"event_multiport\");\n\n\nstatic ngx_command_t  ngx_event_multiport_commands[] = {\n\n    { ngx_string(\"multi_listen\"),\n      NGX_EVENT_CONF|NGX_CONF_TAKE2,\n      ngx_event_multiport_listen,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nngx_event_module_t  ngx_event_multiport_module_ctx = {\n    &event_multiport_name,\n    ngx_event_multiport_create_conf,        /* create configuration */\n    ngx_event_multiport_init_conf,          /* init configuration */\n\n    { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }\n};\n\n\n/* this module use ngx_cycle->log */\nngx_module_t  ngx_event_multiport_module = {\n    NGX_MODULE_V1,\n    &ngx_event_multiport_module_ctx,        /* module context */\n    ngx_event_multiport_commands,           /* module directives */\n    NGX_EVENT_MODULE,                       /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    ngx_event_multiport_process_init,       /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    ngx_event_multiport_process_exit,       /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_event_multiport_create_conf(ngx_cycle_t *cycle)\n{\n    ngx_event_multiport_conf_t     *conf;\n\n    conf = ngx_pcalloc(cycle->pool, sizeof(ngx_event_multiport_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    return conf;\n}\n\nstatic char *\nngx_event_multiport_init_conf(ngx_cycle_t *cycle, void *conf)\n{\n    return NGX_CONF_OK;\n}\n\nstatic char *\nngx_event_multiport_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_event_multiport_conf_t     *emcf = conf;\n\n    ngx_str_t                      *value;\n    ngx_event_multiport_listen_t   *mls;\n    ngx_url_t                       u;\n\n    value = cf->args->elts;\n\n    ngx_memzero(&u, sizeof(ngx_url_t));\n\n    /* check listen base port */\n    u.url = value[1];\n    u.listen = 1;\n    u.default_port = 0;\n\n    if (ngx_parse_url(cf->temp_pool, &u) != NGX_OK) {\n        if (u.err) {\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                    \"%s in \\\"%V\\\" of the \\\"multi_listen\"\n                    \" baseport\\\" directive\",\n                    u.err, &u.url);\n        }\n\n        return NGX_CONF_ERROR;\n    }\n\n    ngx_memzero(&u, sizeof(ngx_url_t));\n\n    /* check relation port */\n    u.url = value[2];\n    u.listen = 1;\n    u.default_port = 0;\n\n    if (ngx_parse_url(cf->temp_pool, &u) != NGX_OK) {\n        if (u.err) {\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                    \"%s in \\\"%V\\\" of the \\\"multi_listen\"\n                    \" relationport\\\" directive\",\n                    u.err, &u.url);\n        }\n\n        return NGX_CONF_ERROR;\n    }\n\n    if (emcf->ports == NULL) {\n        emcf->ports = ngx_array_create(cf->pool, 4,\n                                       sizeof(ngx_event_multiport_listen_t));\n        if (emcf->ports == NULL) {\n            return NGX_CONF_ERROR;\n        }\n    }\n\n    mls = ngx_array_push(emcf->ports);\n    if (mls == NULL) {\n        return NGX_CONF_ERROR;\n    }\n    mls->multiport = value[1];\n    mls->relatedport = value[2];\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_event_multiport_init_listening(ngx_cycle_t *cycle, ngx_listening_t *ls,\n        void *sockaddr, socklen_t socklen, ngx_listening_t *cls)\n{\n    size_t            len;\n    struct sockaddr  *sa;\n    u_char            text[NGX_SOCKADDR_STRLEN];\n\n    ngx_memzero(ls, sizeof(ngx_listening_t));\n\n    sa = ngx_palloc(cycle->pool, socklen);\n    if (sa == NULL) {\n        return NGX_ERROR;\n    }\n\n    ngx_memcpy(sa, sockaddr, socklen);\n\n    ls->sockaddr = sa;\n    ls->socklen = socklen;\n\n    len = ngx_sock_ntop(sa, socklen, text, NGX_SOCKADDR_STRLEN, 1);\n    ls->addr_text.len = len;\n\n    switch (ls->sockaddr->sa_family) {\n#if (NGX_HAVE_INET6)\n    case AF_INET6:\n        ls->addr_text_max_len = NGX_INET6_ADDRSTRLEN;\n        break;\n#endif\n#if (NGX_HAVE_UNIX_DOMAIN)\n    case AF_UNIX:\n        ls->addr_text_max_len = NGX_UNIX_ADDRSTRLEN;\n        len++;\n        break;\n#endif\n    case AF_INET:\n        ls->addr_text_max_len = NGX_INET_ADDRSTRLEN;\n        break;\n    default:\n        ls->addr_text_max_len = NGX_SOCKADDR_STRLEN;\n        break;\n    }\n\n    ls->addr_text.data = ngx_pnalloc(cycle->pool, len);\n    if (ls->addr_text.data == NULL) {\n        return NGX_ERROR;\n    }\n\n    ngx_memcpy(ls->addr_text.data, text, len);\n\n#if (NGX_HAVE_UNIX_DOMAIN)\n    if (ls->sockaddr->sa_family == AF_UNIX) {\n        u_char *name = ls->addr_text.data + sizeof(\"unix:\") - 1;\n        ngx_delete_file(name);\n    }\n#endif\n\n    ls->fd = (ngx_socket_t) -1;\n    ls->type = SOCK_STREAM;\n\n    ls->backlog = cls->backlog;\n    ls->rcvbuf = cls->rcvbuf;\n    ls->sndbuf = cls->sndbuf;\n\n#if (NGX_HAVE_KEEPALIVE_TUNABLE)\n    ls->keepidle = cls->keepidle;\n    ls->keepintvl = cls->keepintvl;\n    ls->keepcnt = cls->keepcnt;\n#endif\n\n    ls->addr_ntop = cls->addr_ntop;\n    ls->handler = cls->handler;\n    ls->servers = cls->servers;\n    ls->worker = ngx_worker;\n\n    ls->log= cls->log;\n    ls->logp = cls->logp;\n\n    ls->pool_size = cls->pool_size;\n    ls->post_accept_buffer_size = cls->post_accept_buffer_size;\n    ls->post_accept_timeout = cls->post_accept_timeout;\n\n#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)\n    ls->ipv6only = cls->ipv6only;\n#endif\n\n    ls->keepalive = cls->keepalive;\n\n#if (NGX_HAVE_DEFERRED_ACCEPT)\n    ls->deferred_accept = cls->deferred_accept;\n    ls->delete_deferred = cls->delete_deferred;\n    ls->add_deferred = cls->add_deferred;\n#endif\n\n#ifdef SO_ACCEPTFILTER\n    ls->accept_filter = cls->accept_filter;\n#endif\n\n#if (NGX_HAVE_SETFIB)\n    ls->setfib = cls->setfib;\n#endif\n\n#if (NGX_HAVE_TCP_FASTOPEN)\n    ls->fastopen = cls->fastopen;\n#endif\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_event_multiport_open_listening_sock(ngx_cycle_t *cycle, ngx_listening_t *ls)\n{\n    int               reuseaddr;\n    ngx_uint_t        tries, failed;\n    ngx_err_t         err;\n    ngx_log_t        *log;\n    ngx_socket_t      s;\n\n    reuseaddr = 1;\n#if (NGX_SUPPRESS_WARN)\n    failed = 0;\n#endif\n\n    log = cycle->log;\n\n    /* TODO: configurable try number */\n\n    for (tries = 5; tries; tries--) {\n        failed = 0;\n\n        if (ls->fd != (ngx_socket_t) -1) {\n            return NGX_OK;\n        }\n\n        s = ngx_socket(ls->sockaddr->sa_family, ls->type, 0);\n\n        if (s == (ngx_socket_t) -1) {\n            ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,\n                          \"multiport, \" ngx_socket_n \" %V failed\",\n                          &ls->addr_text);\n            return NGX_ERROR;\n        }\n\n        if (setsockopt(s, SOL_SOCKET, SO_REUSEADDR,\n                       (const void *) &reuseaddr, sizeof(int))\n            == -1)\n        {\n            ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,\n                          \"multiport, setsockopt(SO_REUSEADDR) %V failed\",\n                          &ls->addr_text);\n\n            if (ngx_close_socket(s) == -1) {\n                ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,\n                              \"multiport, \" ngx_close_socket_n \" %V failed\",\n                              &ls->addr_text);\n            }\n\n            return NGX_ERROR;\n        }\n\n#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)\n\n        if (ls->sockaddr->sa_family == AF_INET6) {\n            int  ipv6only;\n\n            ipv6only = ls->ipv6only;\n\n            if (setsockopt(s, IPPROTO_IPV6, IPV6_V6ONLY,\n                           (const void *) &ipv6only, sizeof(int))\n                == -1)\n            {\n                ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,\n                              \"multiport, setsockopt(IPV6_V6ONLY) %V failed,\"\n                              \" ignored\", &ls->addr_text);\n            }\n        }\n#endif\n        /* TODO: close on exit */\n\n        if (!(ngx_event_flags & NGX_USE_IOCP_EVENT)) {\n            if (ngx_nonblocking(s) == -1) {\n                ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,\n                              \"multiport, \" ngx_nonblocking_n \" %V failed\",\n                              &ls->addr_text);\n\n                if (ngx_close_socket(s) == -1) {\n                    ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,\n                                  \"multiport, \" ngx_close_socket_n \" %V failed\",\n                                  &ls->addr_text);\n                }\n\n                return NGX_ERROR;\n            }\n        }\n\n        ngx_log_debug2(NGX_LOG_DEBUG_CORE, log, 0,\n                       \"multiport, bind() %V #%d \", &ls->addr_text, s);\n\n        if (bind(s, ls->sockaddr, ls->socklen) == -1) {\n            ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,\n                          \"multiport, bind() to %V failed\", &ls->addr_text);\n\n            if (ngx_close_socket(s) == -1) {\n                ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,\n                              \"multiport, \" ngx_close_socket_n \" %V failed\",\n                              &ls->addr_text);\n            }\n\n            return NGX_ERROR;\n        }\n\n#if (NGX_HAVE_UNIX_DOMAIN)\n\n        if (ls->sockaddr->sa_family == AF_UNIX) {\n            mode_t   mode;\n            u_char  *name;\n\n            name = ls->addr_text.data + sizeof(\"unix:\") - 1;\n            mode = (S_IRUSR|S_IWUSR|S_IRGRP|S_IWGRP|S_IROTH|S_IWOTH);\n\n            if (chmod((char *) name, mode) == -1) {\n                ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_errno,\n                              \"multiport, chmod() \\\"%s\\\" failed\", name);\n            }\n        }\n#endif\n\n        if (ls->type != SOCK_STREAM) {\n            ls->fd = s;\n            continue;\n        }\n\n        if (listen(s, ls->backlog) == -1) {\n            err = ngx_socket_errno;\n\n            /*\n             * on OpenVZ after suspend/resume EADDRINUSE\n             * may be returned by listen() instead of bind(), see\n             * https://bugzilla.openvz.org/show_bug.cgi?id=2470\n             */\n\n            if (ngx_close_socket(s) == -1) {\n                ngx_log_error(NGX_LOG_EMERG, log, ngx_socket_errno,\n                              \"multiport, \" ngx_close_socket_n \" %V failed\",\n                              &ls->addr_text);\n            }\n\n            if (err != NGX_EADDRINUSE) {\n                ngx_log_error(NGX_LOG_EMERG, log, err,\n                              \"multiport, listen() to %V, backlog %d failed\",\n                              &ls->addr_text, ls->backlog);\n                return NGX_ERROR;\n            }\n\n            failed = 1;\n        }\n\n        ls->listen = 1;\n        ls->fd = s;\n\n        if (!failed) {\n            break;\n        }\n\n        /* TODO: delay configurable */\n\n        ngx_log_error(NGX_LOG_NOTICE, log, 0,\n                      \"multiport, try again to bind() after 500ms\");\n\n        ngx_msleep(500);\n    }\n\n    if (failed) {\n        ngx_log_error(NGX_LOG_EMERG, log, 0,\n                      \"multiport, still could not bind()\");\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_event_multiport_configure_listening_socket(ngx_cycle_t *cycle,\n        ngx_listening_t *ls)\n{\n    int                        value;\n\n#if (NGX_HAVE_DEFERRED_ACCEPT && defined SO_ACCEPTFILTER)\n    struct accept_filter_arg   af;\n#endif\n\n    ls->log = *ls->logp;\n\n    if (ls->rcvbuf != -1) {\n        if (setsockopt(ls->fd, SOL_SOCKET, SO_RCVBUF,\n                       (const void *) &ls->rcvbuf, sizeof(int))\n            == -1)\n        {\n            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,\n                          \"multiport, setsockopt(SO_RCVBUF, %d) %V failed,\"\n                          \" ignored\", ls->rcvbuf, &ls->addr_text);\n        }\n    }\n\n    if (ls->sndbuf != -1) {\n        if (setsockopt(ls->fd, SOL_SOCKET, SO_SNDBUF,\n                       (const void *) &ls->sndbuf, sizeof(int))\n            == -1)\n        {\n            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,\n                          \"multiport, setsockopt(SO_SNDBUF, %d) %V failed,\"\n                          \" ignored\", ls->sndbuf, &ls->addr_text);\n        }\n    }\n\n    if (ls->keepalive) {\n        value = (ls->keepalive == 1) ? 1 : 0;\n\n        if (setsockopt(ls->fd, SOL_SOCKET, SO_KEEPALIVE,\n                       (const void *) &value, sizeof(int))\n            == -1)\n        {\n            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,\n                          \"multiport, setsockopt(SO_KEEPALIVE, %d) %V failed,\"\n                          \" ignored\", value, &ls->addr_text);\n        }\n    }\n\n#if (NGX_HAVE_KEEPALIVE_TUNABLE)\n\n    if (ls->keepidle) {\n        value = ls->keepidle;\n\n#if (NGX_KEEPALIVE_FACTOR)\n        value *= NGX_KEEPALIVE_FACTOR;\n#endif\n\n        if (setsockopt(ls->fd, IPPROTO_TCP, TCP_KEEPIDLE,\n                       (const void *) &value, sizeof(int))\n            == -1)\n        {\n            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,\n                          \"multiport, setsockopt(TCP_KEEPIDLE, %d) %V failed,\"\n                          \" ignored\", value, &ls->addr_text);\n        }\n    }\n\n    if (ls->keepintvl) {\n        value = ls->keepintvl;\n\n#if (NGX_KEEPALIVE_FACTOR)\n        value *= NGX_KEEPALIVE_FACTOR;\n#endif\n\n        if (setsockopt(ls->fd, IPPROTO_TCP, TCP_KEEPINTVL,\n                       (const void *) &value, sizeof(int))\n            == -1)\n        {\n            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,\n                         \"multiport, setsockopt(TCP_KEEPINTVL, %d) %V failed,\"\n                         \" ignored\", value, &ls->addr_text);\n        }\n    }\n\n    if (ls->keepcnt) {\n        if (setsockopt(ls->fd, IPPROTO_TCP, TCP_KEEPCNT,\n                       (const void *) &ls->keepcnt, sizeof(int))\n            == -1)\n        {\n            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,\n                          \"multiport, setsockopt(TCP_KEEPCNT, %d) %V failed,\"\n                          \" ignored\", ls->keepcnt, &ls->addr_text);\n        }\n    }\n\n#endif\n\n#if (NGX_HAVE_SETFIB)\n    if (ls->setfib != -1) {\n        if (setsockopt(ls->fd, SOL_SOCKET, SO_SETFIB,\n                       (const void *) &ls->setfib, sizeof(int))\n            == -1)\n        {\n            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,\n                          \"multiport, setsockopt(SO_SETFIB, %d) %V failed,\"\n                          \" ignored\", ls->setfib, &ls->addr_text);\n        }\n    }\n#endif\n\n#if (NGX_HAVE_TCP_FASTOPEN)\n    if (ls->fastopen != -1) {\n        if (setsockopt(ls->fd, IPPROTO_TCP, TCP_FASTOPEN,\n                       (const void *) &ls->fastopen, sizeof(int))\n            == -1)\n        {\n            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,\n                          \"multiport, setsockopt(TCP_FASTOPEN, %d) %V failed,\"\n                          \" ignored\", ls->fastopen, &ls->addr_text);\n        }\n    }\n#endif\n\n    if (ls->listen) {\n\n        /* change backlog via listen() */\n\n        if (listen(ls->fd, ls->backlog) == -1) {\n            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,\n                          \"multiport, listen() to %V, backlog %d failed\",\n                          &ls->addr_text, ls->backlog);\n            return NGX_ERROR;\n        }\n    }\n\n    /*\n     * setting deferred mode should be last operation on socket,\n     * because code may prematurely continue cycle on failure\n     */\n\n#if (NGX_HAVE_DEFERRED_ACCEPT)\n\n#ifdef SO_ACCEPTFILTER\n\n    if (ls->delete_deferred) {\n        if (setsockopt(ls->fd, SOL_SOCKET, SO_ACCEPTFILTER, NULL, 0)\n            == -1)\n        {\n            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,\n                          \"multiport, setsockopt(SO_ACCEPTFILTER, NULL) \"\n                          \"for %V failed, ignored\", &ls->addr_text);\n\n            if (ls->accept_filter) {\n                ngx_log_error(NGX_LOG_ALERT, cycle->log, 0,\n                              \"multiport, could not change the accept filter \"\n                              \"to \\\"%s\\\" for %V, ignored\",\n                              ls->accept_filter, &ls->addr_text);\n            }\n\n            continue;\n        }\n\n        ls->deferred_accept = 0;\n    }\n\n    if (ls->add_deferred) {\n        ngx_memzero(&af, sizeof(struct accept_filter_arg));\n        (void) ngx_cpystrn((u_char *) af.af_name,\n                           (u_char *) ls->accept_filter, 16);\n\n        if (setsockopt(ls->fd, SOL_SOCKET, SO_ACCEPTFILTER,\n                       &af, sizeof(struct accept_filter_arg))\n            == -1)\n        {\n            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,\n                          \"multiport, setsockopt(SO_ACCEPTFILTER, \\\"%s\\\") \"\n                          \"for %V failed, ignored\",\n                          ls->accept_filter, &ls->addr_text);\n            continue;\n        }\n\n        ls->deferred_accept = 1;\n    }\n\n#endif\n\n#ifdef TCP_DEFER_ACCEPT\n\n    if (ls->add_deferred || ls->delete_deferred) {\n\n        if (ls->add_deferred) {\n            /*\n             * There is no way to find out how long a connection was\n             * in queue (and a connection may bypass deferred queue at all\n             * if syncookies were used), hence we use 1 second timeout\n             * here.\n             */\n            value = 1;\n\n        } else {\n            value = 0;\n        }\n\n        if (setsockopt(ls->fd, IPPROTO_TCP, TCP_DEFER_ACCEPT,\n                       &value, sizeof(int))\n            == -1)\n        {\n            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,\n                          \"multiport, setsockopt(TCP_DEFER_ACCEPT, %d)\"\n                          \" for %V failed, ignored\", value, &ls->addr_text);\n\n            return NGX_ERROR;\n        }\n    }\n\n    if (ls->add_deferred) {\n        ls->deferred_accept = 1;\n    }\n\n#endif\n\n#endif /* NGX_HAVE_DEFERRED_ACCEPT */\n\n#if (NGX_HAVE_IP_RECVDSTADDR)\n\n    if (ls->wildcard\n        && ls->type == SOCK_DGRAM\n        && ls->sockaddr->sa_family == AF_INET)\n    {\n        value = 1;\n\n        if (setsockopt(ls->fd, IPPROTO_IP, IP_RECVDSTADDR,\n                       (const void *) &value, sizeof(int))\n            == -1)\n        {\n            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,\n                          \"multiport, setsockopt(IP_RECVDSTADDR) \"\n                          \"for %V failed, ignored\", &ls->addr_text);\n        }\n    }\n\n#elif (NGX_HAVE_IP_PKTINFO)\n\n    if (ls->wildcard\n        && ls->type == SOCK_DGRAM\n        && ls->sockaddr->sa_family == AF_INET)\n    {\n        value = 1;\n\n        if (setsockopt(ls->fd, IPPROTO_IP, IP_PKTINFO,\n                       (const void *) &value, sizeof(int))\n            == -1)\n        {\n            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,\n                          \"multiport, setsockopt(IP_PKTINFO) \"\n                          \"for %V failed, ignored\", &ls->addr_text);\n        }\n    }\n\n#endif\n\n#if (NGX_HAVE_INET6 && NGX_HAVE_IPV6_RECVPKTINFO)\n\n    if (ls->wildcard\n        && ls->type == SOCK_DGRAM\n        && ls->sockaddr->sa_family == AF_INET6)\n    {\n        value = 1;\n\n        if (setsockopt(ls->fd, IPPROTO_IPV6, IPV6_RECVPKTINFO,\n                       (const void *) &value, sizeof(int))\n            == -1)\n        {\n            ngx_log_error(NGX_LOG_ALERT, cycle->log, ngx_socket_errno,\n                          \"multiport, setsockopt(IPV6_RECVPKTINFO) \"\n                          \"for %V failed, ignored\", &ls->addr_text);\n        }\n    }\n\n#endif\n\n    return NGX_OK;\n}\n\nstatic void\nngx_event_multiport_close_listening_sock(ngx_cycle_t *cycle,\n        ngx_listening_t *ls)\n{\n    ngx_connection_t               *c;\n\n    c = ls->connection;\n\n    if (c) {\n        if (c->read->active) {\n            if (ngx_event_flags & NGX_USE_EPOLL_EVENT) {\n\n                /*\n                 * it seems that Linux-2.6.x OpenVZ sends events\n                 * for closed shared listening sockets unless\n                 * the events was explicitly deleted\n                 */\n\n                ngx_del_event(c->read, NGX_READ_EVENT, 0);\n\n            } else {\n                ngx_del_event(c->read, NGX_READ_EVENT, NGX_CLOSE_EVENT);\n            }\n        }\n\n        ngx_free_connection(c);\n\n        c->fd = (ngx_socket_t) -1;\n    }\n\n    ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0,\n                   \"multiport, close listening %V #%d\", &ls->addr_text, ls->fd);\n\n    if (ngx_close_socket(ls->fd) == -1) {\n        ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,\n                      \"multiport, \", ngx_close_socket_n \" %V failed\",\n                      &ls->addr_text);\n    }\n\n#if (NGX_HAVE_UNIX_DOMAIN)\n\n    if (ls->sockaddr->sa_family == AF_UNIX\n        && ngx_process == NGX_PROCESS_WORKER)\n    {\n        u_char *name = ls->addr_text.data + sizeof(\"unix:\") - 1;\n\n        if (ngx_delete_file(name) == NGX_FILE_ERROR) {\n            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,\n                          \"multiport, \" ngx_delete_file_n \" %s failed\", name);\n        }\n    }\n\n#endif\n\n    ls->fd = (ngx_socket_t) -1;\n}\n\nstatic ngx_listening_t *\nngx_event_multiport_find_relation_port(ngx_cycle_t *cycle, ngx_str_t *str)\n{\n    ngx_url_t                       u;\n    ngx_listening_t                *ls;\n    ngx_uint_t                      i;\n\n    ngx_memzero(&u, sizeof(ngx_url_t));\n\n    u.url = *str;\n    u.listen = 1;\n    u.default_port = 0;\n\n    if (ngx_parse_url(cycle->pool, &u) != NGX_OK) {\n        if (u.err) {\n            ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,\n                          \"multiport, relation port err: %V\", str);\n        }\n\n        return NULL;\n    }\n\n    ls = cycle->listening.elts;\n\n    for (i = 0; i < cycle->listening.nelts; ++i) {\n\n        if (ls[i].socklen == u.socklen\n                && ngx_memcmp(ls[i].sockaddr, &u.sockaddr, u.socklen) == 0)\n        {\n            return &ls[i];\n        }\n    }\n\n    ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,\n                  \"multiport, can not find relation port: %V\", str);\n    return NULL;\n}\n\nstatic ngx_int_t\nngx_event_multiport_set_port(ngx_cycle_t *cycle,\n        ngx_event_multiport_listen_t *mls, ngx_listening_t *ls)\n{\n    ngx_str_t                   port;\n    ngx_int_t                   rc;\n    ngx_url_t                   u;\n\n    ngx_memzero(&port, sizeof(ngx_str_t));\n\n    rc = ngx_multiport_get_port(cycle->pool, &port, &mls->multiport,\n                                ngx_process_slot);\n    if (rc == NGX_ERROR) {\n        ngx_log_error(NGX_LOG_ERR, cycle->log, 0,\n                \"multiport, get multiport error\");\n        return NGX_ERROR;\n    }\n\n    ngx_memzero(&u, sizeof(ngx_url_t));\n    u.url = port;\n    u.listen = 1;\n    u.default_port = 0;\n\n    if (ngx_parse_url(cycle->pool, &u) != NGX_OK) {\n        if (u.err) {\n            ngx_log_error(NGX_LOG_ERR, cycle->log, 0,\n                    \"multiport, %s in \\\"%V\\\" when set port\", u.err, &u.url);\n        }\n\n        return NGX_ERROR;\n    }\n\n    /* init multiport listening */\n    if (ngx_event_multiport_init_listening(cycle, &mls->listening,\n            (struct sockaddr *) &u.sockaddr, u.socklen, ls) != NGX_OK)\n    {\n        ngx_log_error(NGX_LOG_ERR, cycle->log, 0,\n                      \"multiport, init listening error: %V\", &mls->multiport);\n        return NGX_ERROR;\n    }\n\n    /* open multiport listening */\n    if (ngx_event_multiport_open_listening_sock(cycle, &mls->listening)\n            != NGX_OK)\n    {\n        ngx_log_error(NGX_LOG_ERR, cycle->log, 0,\n                      \"multiport, open listening error: %V\", &mls->multiport);\n        return NGX_ERROR;\n    }\n\n    /* config multiport listening */\n    if (ngx_event_multiport_configure_listening_socket(cycle,\n            &mls->listening) != NGX_OK)\n    {\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_event_multiport_enable_accept_event(ngx_cycle_t *cycle, ngx_listening_t *ls)\n{\n    ngx_connection_t   *c;\n    ngx_event_t        *rev;\n\n    c = ngx_get_connection(ls->fd, ngx_cycle->log);\n\n    if (c == NULL) {\n        return NGX_ERROR;\n    }\n\n    c->type = ls->type;\n    c->log = &ls->log;\n\n    c->listening = ls;\n    ls->connection = c;\n\n    rev = c->read;\n\n    rev->log = c->log;\n    rev->accept = 1;\n\n#if (NGX_HAVE_DEFERRED_ACCEPT)\n    rev->deferred_accept = ls->deferred_accept;\n#endif\n\n#if (NGX_WIN32)\n\n    if (ngx_event_flags & NGX_USE_IOCP_EVENT) {\n        ngx_iocp_conf_t  *iocpcf;\n\n        rev->handler = ngx_event_acceptex;\n\n        if (ngx_add_event(rev, 0, NGX_IOCP_ACCEPT) == NGX_ERROR) {\n            return NGX_ERROR;\n        }\n\n        ls->log.handler = ngx_acceptex_log_error;\n\n        iocpcf = ngx_event_get_conf(cycle->conf_ctx, ngx_iocp_module);\n        if (ngx_event_post_acceptex(ls, iocpcf->post_acceptex)\n                == NGX_ERROR)\n        {\n            return NGX_ERROR;\n        }\n\n    } else {\n        rev->handler = ngx_event_accept;\n\n        if (ngx_use_accept_mutex) {\n            return NGX_OK;\n        }\n\n        if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {\n            return NGX_ERROR;\n        }\n    }\n\n#else\n\n    rev->handler = (c->type == SOCK_STREAM)? ngx_event_accept\n        : ngx_event_recvmsg;\n\n    if (ngx_add_event(rev, NGX_READ_EVENT, 0) == NGX_ERROR) {\n        return NGX_ERROR;\n    }\n\n#endif\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_event_multiport_process_init(ngx_cycle_t *cycle)\n{\n    ngx_event_multiport_conf_t     *emcf;\n    ngx_event_multiport_listen_t   *mls;\n    ngx_listening_t                *rls;\n    ngx_uint_t                      i;\n\n    if (ngx_process != NGX_PROCESS_WORKER) {\n        return NGX_OK;\n    }\n\n    emcf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_multiport_module);\n    if (emcf->ports == NULL) {\n        return NGX_OK;\n    }\n\n    mls = emcf->ports->elts;\n    for (i = 0; i < emcf->ports->nelts; ++i) {\n        /* find relation listening in cycle->listening */\n        rls = ngx_event_multiport_find_relation_port(cycle,\n                                                     &mls[i].relatedport);\n        if (rls == NULL) {\n            return NGX_ERROR;\n        }\n\n        /* set process port with relation port */\n        if (ngx_event_multiport_set_port(cycle, &mls[i], rls) != NGX_OK) {\n            return NGX_ERROR;\n        }\n\n        /* enable accept */\n        if (ngx_event_multiport_enable_accept_event(cycle, &mls[i].listening)\n                != NGX_OK)\n        {\n            ngx_log_error(NGX_LOG_EMERG, cycle->log, ngx_socket_errno,\n                          \"multiport, enable accept failed\");\n            return NGX_ERROR;\n        }\n    }\n\n    return NGX_OK;\n}\n\nstatic void\nngx_event_multiport_process_exit(ngx_cycle_t *cycle)\n{\n    ngx_event_multiport_conf_t     *emcf;\n    ngx_event_multiport_listen_t   *mls;\n    ngx_uint_t                      i;\n\n    if (ngx_process != NGX_PROCESS_WORKER) {\n        return;\n    }\n\n    emcf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_multiport_module);\n    if (emcf->ports == NULL) {\n        return;\n    }\n\n    mls = emcf->ports->elts;\n\n    for (i = 0; i < emcf->ports->nelts; ++i) {\n        ngx_event_multiport_close_listening_sock(cycle, &mls[i].listening);\n    }\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-multiport-module/ngx_http_broadcast_module.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_multiport.h\"\n\n\ntypedef struct {\n\tngx_str_t                           multiport;\n    ngx_str_t                           uri;\n} ngx_http_broadcast_conf_t;\n\ntypedef struct {\n    ngx_int_t                           workerid;\n    ngx_http_request_t                 *sr;\n} ngx_http_broadcast_ctx_t;\n\n\nstatic ngx_int_t ngx_http_broadcast_filter_init(ngx_conf_t *cf);\n\nstatic void *ngx_http_broadcast_create_conf(ngx_conf_t *cf);\nstatic char *ngx_http_broadcast_merge_conf(ngx_conf_t *cf,\n       void *parent, void *child);\nstatic char *ngx_http_broadcast(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\n\n\nstatic ngx_command_t  ngx_http_broadcast_commands[] = {\n\n    { ngx_string(\"broadcast\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,\n      ngx_http_broadcast,\n      NGX_HTTP_LOC_CONF_OFFSET,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_http_broadcast_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_http_broadcast_filter_init,         /* postconfiguration */\n\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n\n    ngx_http_broadcast_create_conf,         /* create location configuration */\n    ngx_http_broadcast_merge_conf           /* merge location configuration */\n};\n\n\nngx_module_t  ngx_http_broadcast_module = {\n    NGX_MODULE_V1,\n    &ngx_http_broadcast_module_ctx,         /* module context */\n    ngx_http_broadcast_commands,            /* module directives */\n    NGX_HTTP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_http_output_header_filter_pt  ngx_http_next_header_filter;\nstatic ngx_http_output_body_filter_pt    ngx_http_next_body_filter;\n\n\nstatic void *\nngx_http_broadcast_create_conf(ngx_conf_t *cf)\n{\n    ngx_http_broadcast_conf_t          *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_broadcast_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    return conf;\n}\n\nstatic char *\nngx_http_broadcast_merge_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_http_broadcast_conf_t          *prev = parent;\n    ngx_http_broadcast_conf_t          *conf = child;\n\n    ngx_conf_merge_str_value(conf->multiport, prev->multiport, \"\");\n    ngx_conf_merge_str_value(conf->uri, prev->uri, \"\");\n\n    return NGX_CONF_OK;\n}\n\nstatic char *\nngx_http_broadcast(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_broadcast_conf_t  *hbcf;\n    ngx_str_t                  *value;\n\n    hbcf = conf;\n\n    if (hbcf->multiport.data != NULL) {\n        return \"is duplicate\";\n    }\n\n    value = cf->args->elts;\n\n    hbcf->multiport = value[1];\n    hbcf->uri = value[2];\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_http_broadcast_header_filter(ngx_http_request_t *r)\n{\n    ngx_http_broadcast_conf_t  *hbcf;\n\n    hbcf = ngx_http_get_module_loc_conf(r, ngx_http_broadcast_module);\n\n    if (hbcf == NULL || hbcf->multiport.len == 0) { /* not configured */\n        goto next;\n    }\n\n    ngx_log_debug4(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n            \"broadcast header filter, r:%p r->main:%p, %ui, %O\",\n            r, r->main, r->headers_out.status, r->headers_out.content_length_n);\n\n    r->headers_out.status = NGX_HTTP_OK;\n    ngx_http_clear_content_length(r);\n    ngx_http_clear_accept_ranges(r);\n\nnext:\n    return ngx_http_next_header_filter(r);\n}\n\n\nstatic ngx_int_t\nngx_http_broadcast_send_subrequest(ngx_http_request_t *r, ngx_int_t pslot)\n{\n    ngx_http_broadcast_conf_t  *hbcf;\n    ngx_str_t                   uri;\n    ngx_str_t                   port;\n    ngx_http_request_t         *sr;\n    ngx_int_t                   rc;\n\n    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n            \"broadcast send subrequest to %i\", pslot);\n\n    hbcf = ngx_http_get_module_loc_conf(r, ngx_http_broadcast_module);\n\n    if (ngx_multiport_get_port(r->pool, &port, &hbcf->multiport, pslot)\n            == NGX_ERROR)\n    {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                \"broadcast get port error, %V %i\", &hbcf->multiport, pslot);\n        return NGX_ERROR;\n    }\n\n    uri.len = hbcf->uri.len + 1 + port.len;\n    uri.data = ngx_pcalloc(r->pool, uri.len);\n    ngx_snprintf(uri.data, uri.len, \"%V/%V\", &hbcf->uri, &port);\n\n    rc = ngx_http_subrequest(r, &uri, &r->args, &sr, NULL, 0);\n    sr->method = r->method;\n    sr->method_name = r->method_name;\n\n    return rc;\n}\n\nstatic ngx_int_t\nngx_http_broadcast_body_filter(ngx_http_request_t *r, ngx_chain_t *in)\n{\n    ngx_http_broadcast_conf_t  *hbcf;\n    ngx_http_broadcast_ctx_t   *ctx;\n    ngx_core_conf_t            *ccf;\n    ngx_int_t                   rc;\n    ngx_buf_t                  *b;\n    ngx_chain_t                 cl;\n\n    hbcf = ngx_http_get_module_loc_conf(r->main, ngx_http_broadcast_module);\n\n    if (hbcf == NULL || hbcf->multiport.len == 0) { /* not configured */\n        return ngx_http_next_body_filter(r, in);\n    }\n\n    ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n            \"broadcast body filter, r:%p r->main:%p\", r, r->main);\n\n    if (r != r->main) { /* send subrequest */\n        if (r->headers_out.status != NGX_HTTP_OK) {\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                    \"broadcast subrequest send non 200 response: %i\",\n                    r->headers_out.status);\n            return NGX_OK;\n        }\n\n        return ngx_http_next_body_filter(r, in);\n    }\n\n    ctx = ngx_http_get_module_ctx(r, ngx_http_broadcast_module);\n\n    if (ctx == NULL) {\n        ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_broadcast_ctx_t));\n        if (ctx == NULL) {\n            return NGX_ERROR;\n        }\n\n        ngx_http_set_ctx(r, ctx, ngx_http_broadcast_module);\n    }\n\n    /* send to all process */\n\n    ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                           ngx_core_module);\n\n    while (ctx->workerid < ccf->worker_processes) {\n\n        rc = ngx_http_broadcast_send_subrequest(r,\n                ngx_multiport_get_slot(ctx->workerid));\n        ++ctx->workerid;\n\n        return rc;\n    }\n\n    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));\n\n    if (b == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    b->last_buf = 1;\n\n    cl.buf = b;\n    cl.next = NULL;\n\n    return ngx_http_next_body_filter(r, &cl);\n}\n\n\nstatic ngx_int_t\nngx_http_broadcast_filter_init(ngx_conf_t *cf)\n{\n    ngx_http_next_header_filter = ngx_http_top_header_filter;\n    ngx_http_top_header_filter = ngx_http_broadcast_header_filter;\n\n    ngx_http_next_body_filter = ngx_http_top_body_filter;\n    ngx_http_top_body_filter = ngx_http_broadcast_body_filter;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-multiport-module/ngx_http_inner_proxy_module.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_multiport.h\"\n\n\ntypedef struct {\n    ngx_str_t                           multiport;\n    ngx_str_t                           uri;\n} ngx_http_inner_proxy_conf_t;\n\ntypedef struct {\n    ngx_str_t                           port;\n    ngx_flag_t                          last;\n} ngx_http_inner_proxy_ctx_t;\n\n\nstatic ngx_int_t ngx_http_inner_proxy_filter_init(ngx_conf_t *cf);\n\nstatic void *ngx_http_inner_proxy_create_conf(ngx_conf_t *cf);\nstatic char *ngx_http_inner_proxy_merge_conf(ngx_conf_t *cf,\n       void *parent, void *child);\nstatic char *ngx_http_inner_proxy(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\n\n\nstatic ngx_command_t  ngx_http_inner_proxy_commands[] = {\n\n    { ngx_string(\"inner_proxy\"),\n      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE2,\n      ngx_http_inner_proxy,\n      NGX_HTTP_LOC_CONF_OFFSET,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_http_inner_proxy_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_http_inner_proxy_filter_init,       /* postconfiguration */\n\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n\n    ngx_http_inner_proxy_create_conf,       /* create location configuration */\n    ngx_http_inner_proxy_merge_conf         /* merge location configuration */\n};\n\n\nngx_module_t  ngx_http_inner_proxy_module = {\n    NGX_MODULE_V1,\n    &ngx_http_inner_proxy_module_ctx,       /* module context */\n    ngx_http_inner_proxy_commands,          /* module directives */\n    NGX_HTTP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_http_output_header_filter_pt  ngx_http_next_header_filter;\nstatic ngx_http_output_body_filter_pt    ngx_http_next_body_filter;\n\n\nstatic void *\nngx_http_inner_proxy_create_conf(ngx_conf_t *cf)\n{\n    ngx_http_inner_proxy_conf_t    *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_inner_proxy_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    return conf;\n}\n\nstatic char *\nngx_http_inner_proxy_merge_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_http_inner_proxy_conf_t    *prev = parent;\n    ngx_http_inner_proxy_conf_t    *conf = child;\n\n    ngx_conf_merge_str_value(conf->multiport, prev->multiport, \"\");\n    ngx_conf_merge_str_value(conf->uri, prev->uri, \"\");\n\n    return NGX_CONF_OK;\n}\n\nstatic char *\nngx_http_inner_proxy(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_inner_proxy_conf_t    *hipcf;\n    ngx_str_t                      *value;\n\n    hipcf = conf;\n\n    if (hipcf->multiport.data != NULL) {\n        return \"is duplicate\";\n    }\n\n    value = cf->args->elts;\n\n    hipcf->multiport = value[1];\n    hipcf->uri = value[2];\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_http_inner_proxy_header_filter(ngx_http_request_t *r)\n{\n    ngx_http_inner_proxy_ctx_t     *ctx;\n\n    ctx = ngx_http_get_module_ctx(r->main, ngx_http_inner_proxy_module);\n\n    if (ctx == NULL) { /* not configured */\n        return ngx_http_next_header_filter(r);\n    }\n\n    if (r == r->main) {\n        return NGX_OK;\n    }\n\n    r->main->headers_out = r->headers_out;\n\n    return ngx_http_next_header_filter(r->main);\n}\n\n\nstatic ngx_int_t\nngx_http_inner_proxy_body_filter(ngx_http_request_t *r, ngx_chain_t *in)\n{\n    ngx_http_inner_proxy_ctx_t     *ctx;\n    ngx_chain_t                    *cl, l;\n    ngx_buf_t                      *b;\n\n    ctx = ngx_http_get_module_ctx(r->main, ngx_http_inner_proxy_module);\n\n    if (ctx == NULL) { /* not configured */\n        return ngx_http_next_body_filter(r, in);\n    }\n\n    if (r == r->main) {\n        if (ctx->last == 0) {\n            return NGX_OK;\n        }\n\n        b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));\n\n        if (b == NULL) {\n            return NGX_HTTP_INTERNAL_SERVER_ERROR;\n        }\n\n        b->last_buf = 1;\n\n        l.buf = b;\n        l.next = NULL;\n\n        return ngx_http_next_body_filter(r, &l);\n    }\n\n    for (cl = in; cl; cl = cl->next) {\n        if (cl->buf->last_in_chain) {\n            ctx->last = 1;\n        }\n    }\n\n    return ngx_http_next_body_filter(r, in);\n}\n\n\nstatic ngx_int_t\nngx_http_inner_proxy_filter_init(ngx_conf_t *cf)\n{\n    ngx_http_next_header_filter = ngx_http_top_header_filter;\n    ngx_http_top_header_filter = ngx_http_inner_proxy_header_filter;\n\n    ngx_http_next_body_filter = ngx_http_top_body_filter;\n    ngx_http_top_body_filter = ngx_http_inner_proxy_body_filter;\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_http_inner_proxy_request(ngx_http_request_t *r, ngx_int_t pslot)\n{\n    ngx_http_inner_proxy_conf_t    *hipcf;\n    ngx_http_inner_proxy_ctx_t     *ctx;\n    ngx_http_request_t             *sr;\n    ngx_str_t                       uri;\n    ngx_int_t                       rc;\n\n    hipcf = ngx_http_get_module_loc_conf(r, ngx_http_inner_proxy_module);\n\n    if (hipcf == NULL || hipcf->multiport.len == 0) { /* not configured */\n        return NGX_DECLINED;\n    }\n\n    if (pslot == ngx_process_slot) {\n        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n                \"inner proxy send request to self: %i\", ngx_process_slot);\n        return NGX_DECLINED;\n    }\n\n    ctx = ngx_http_get_module_ctx(r, ngx_http_inner_proxy_module);\n    if (ctx) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                \"inner proxy has been called in this request\");\n        return NGX_ERROR;\n    }\n\n    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_inner_proxy_ctx_t));\n    if (ctx == NULL) {\n        return NGX_ERROR;\n    }\n    ngx_http_set_ctx(r, ctx, ngx_http_inner_proxy_module);\n\n    if (ngx_multiport_get_port(r->pool, &ctx->port, &hipcf->multiport, pslot)\n            == NGX_ERROR)\n    {\n        return NGX_ERROR;\n    }\n\n    uri.len = hipcf->uri.len + 1 + ctx->port.len + 2 + r->uri.len;\n    uri.data = ngx_pcalloc(r->pool, uri.len);\n    ngx_snprintf(uri.data, uri.len, \"%V/%V:/%V\",\n            &hipcf->uri, &ctx->port, &r->uri);\n\n    ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n            \"inner proxy send request to %V\", &ctx->port);\n    rc = ngx_http_subrequest(r, &uri, &r->args, &sr, NULL, 0);\n    sr->method = r->method;\n    sr->method_name = r->method_name;\n\n    return rc;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-multiport-module/ngx_multiport.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_MULTIPORT_H_INCLUDED_\n#define _NGX_MULTIPORT_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n\n\n/*\n * return value:\n *      NGX_OK for success, NGX_ERROR for failed\n * paras:\n *      pool: pool for port memory alloc\n *      port: process real listen port while process_slot is pslot\n *      multiport: port configure for processes, format as below:\n *          port only: port\n *          IPv4: host:port     host must be ipaddr of IPv4 or *\n *          IPv6: [host]:port   host must be ipaddr of IPv6\n *          Unix: unix:/path\n *      pslot: process_slot\n */\nngx_int_t ngx_multiport_get_port(ngx_pool_t *pool, ngx_str_t *port,\n        ngx_str_t *multiport, ngx_int_t pslot);\n\n\n/*\n * return value:\n *      ngx_process_slot for successd, NGX_ERROR for failed\n * paras:\n *      wpid: worker process id, 0 to ccf->worker_processes - 1\n */\nngx_int_t ngx_multiport_get_slot(ngx_uint_t wpid);\n\n\n/*\n * return value:\n *      NGX_OK      : for successd\n *      NGX_ERROR   : for failed\n *      NGX_DECLINED: for not configured or send inner proxy to self\n * paras:\n *      r    : http request for send inner request to sibling worker\n *      pslot: sibling worker ngx_process_slot\n */\nngx_int_t ngx_http_inner_proxy_request(ngx_http_request_t *r, ngx_int_t pslot);\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-multiport-module/ngx_multiport_misc.c",
    "content": "#include <ngx_config.h>\n#include <ngx_core.h>\n\n\nstatic ngx_int_t\nngx_multiport_get_port_unix(ngx_pool_t *pool, ngx_str_t *port,\n        ngx_str_t *multiport, ngx_int_t pslot)\n{\n#if (NGX_HAVE_UNIX_DOMAIN)\n    u_char                         *p;\n    size_t                          len;\n\n    len = multiport->len + 5; /* unix:/path -> unix:/path.127\\0 */\n    port->data = ngx_pcalloc(pool, len);\n    if (port->data == NULL) {\n        return NGX_ERROR;\n    }\n\n    p = ngx_snprintf(port->data, len, \"%V.%i\", multiport, pslot);\n    *p = 0;\n    port->len = p - port->data;\n\n    return NGX_OK;\n#else\n    ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                  \"the unix domain sockets not support\");\n    return NGX_ERROR;\n#endif\n}\n\nstatic ngx_int_t\nngx_multiport_get_port_inet6(ngx_pool_t *pool, ngx_str_t *port,\n        ngx_str_t *multiport, ngx_int_t pslot)\n{\n#if (NGX_HAVE_INET6)\n    u_char                         *p, *last;\n    ngx_str_t                       addr;\n    size_t                          len;\n    ngx_int_t                       n;\n\n    last = multiport->data + multiport->len;\n    p = ngx_strlchr(multiport->data, last, ']');\n\n    if (p == NULL) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"invalid INET6 host\");\n        return NGX_ERROR;\n    }\n\n    ++p;\n    if (p == last || *p != ':') {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"no INET6 port\");\n        return NGX_ERROR;\n    }\n\n    ++p;\n    addr.data = multiport->data;\n    addr.len = p - multiport->data;\n\n    len = last - p;\n    n = ngx_atoi(p, len);\n\n    /* 65408 + 127 = 65535, pslot in [0, 127] */\n    if (n < 1 || n + pslot > 65408) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"invalid INET6 port\");\n        return NGX_ERROR;\n    }\n    n += pslot;\n\n    len = multiport->len + 3;   /* [::]:1 -> [::]:128\\0 */\n    port->data = ngx_pcalloc(pool, len);\n    if (port->data == NULL) {\n        return NGX_ERROR;\n    }\n\n    p = port->data;\n    p = ngx_snprintf(p, len, \"%V%i\", &addr, n);\n    port->len = p - port->data;\n\n    return NGX_OK;\n#else\n    ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n            \"the INET6 sockets not support\");\n    return NGX_ERROR;\n#endif\n}\n\nstatic ngx_int_t\nngx_multiport_get_port_inet(ngx_pool_t *pool, ngx_str_t *port,\n        ngx_str_t *multiport, ngx_int_t pslot)\n{\n    u_char                         *p, *last;\n    ngx_str_t                       addr;\n    size_t                          len;\n    ngx_int_t                       n;\n\n    last = multiport->data + multiport->len;\n    p = ngx_strlchr(multiport->data, last, ':');\n\n    if (p == NULL) { /* port */\n        p = multiport->data;\n        addr.len = 0;\n    } else { /* host:port */\n        ++p;\n        if (p == last) {\n            ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"no port\");\n            return NGX_ERROR;\n        }\n\n        addr.data = multiport->data;\n        addr.len = p - multiport->data;\n    }\n\n    len = last - p;\n    n = ngx_atoi(p, len);\n\n    /* 65408 + 127 = 65535, pslot in [0, 127] */\n    if (n < 1 || n + pslot > 65408) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"invalid port\");\n        return NGX_ERROR;\n    }\n    n += pslot;\n\n    len = multiport->len + 3;   /* 127.0.0.1:1 -> 127.0.0.1:128\\0 */\n    port->data = ngx_pcalloc(pool, len);\n    if (port->data == NULL) {\n        return NGX_ERROR;\n    }\n\n    p = port->data;\n    if (addr.len == 0) {\n        p = ngx_snprintf(p, len, \"%i\", n);\n    } else {\n        p = ngx_snprintf(p, len, \"%V%i\", &addr, n);\n    }\n    port->len = p - port->data;\n\n    return NGX_OK;\n}\n\nngx_int_t\nngx_multiport_get_port(ngx_pool_t *pool, ngx_str_t *port,\n        ngx_str_t *multiport, ngx_int_t pslot)\n{\n    u_char                         *p;\n    size_t                          len;\n\n    p = multiport->data;\n    len = multiport->len;\n\n    if (pslot < 0 || pslot > 127) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"invalid pslot: %i\",\n                pslot);\n        return NGX_ERROR;\n    }\n\n    if (len >= 5 && ngx_strncasecmp(p, (u_char *) \"unix:\", 5) == 0) {\n        return ngx_multiport_get_port_unix(pool, port, multiport, pslot);\n    }\n\n    if (len && p[0] == '[') {\n        return ngx_multiport_get_port_inet6(pool, port, multiport, pslot);\n    }\n\n    return ngx_multiport_get_port_inet(pool, port, multiport, pslot);\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-multiport-module/ngx_process_slot_module.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n\nstatic ngx_int_t ngx_process_slot_module_init(ngx_cycle_t *cycle);\nstatic ngx_int_t ngx_process_slot_process_init(ngx_cycle_t *cycle);\nstatic void ngx_process_slot_process_exit(ngx_cycle_t *cycle);\n\nstatic void *ngx_process_slot_module_create_conf(ngx_cycle_t *cycle);\nstatic char *ngx_process_slot_module_init_conf(ngx_cycle_t *cycle, void *conf);\n\n\n#define MAX_PROCESSES  128\n\ntypedef struct {\n    ngx_atomic_int_t            process_slot[MAX_PROCESSES];\n} ngx_process_slot_ctx_t;\n\ntypedef struct {\n    ngx_process_slot_ctx_t     *ctx;\n} ngx_process_slot_conf_t;\n\n\nstatic ngx_command_t  ngx_process_slot_commands[] = {\n\n      ngx_null_command\n};\n\n\nstatic ngx_core_module_t  ngx_process_slot_module_ctx = {\n    ngx_string(\"process_slot\"),\n    ngx_process_slot_module_create_conf,\n    ngx_process_slot_module_init_conf\n};\n\n\nngx_module_t  ngx_process_slot_module = {\n    NGX_MODULE_V1,\n    &ngx_process_slot_module_ctx,          /* module context */\n    ngx_process_slot_commands,             /* module directives */\n    NGX_CORE_MODULE,                       /* module type */\n    NULL,                                  /* init master */\n    ngx_process_slot_module_init,          /* init module */\n    ngx_process_slot_process_init,         /* init process */\n    NULL,                                  /* init thread */\n    NULL,                                  /* exit thread */\n    ngx_process_slot_process_exit,         /* exit process */\n    NULL,                                  /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_process_slot_module_create_conf(ngx_cycle_t *cycle)\n{\n    ngx_process_slot_conf_t    *pscf;\n\n    pscf = ngx_palloc(cycle->pool, sizeof(ngx_process_slot_conf_t));\n    if (pscf == NULL) {\n        return NULL;\n    }\n\n    return pscf;\n}\n\nstatic char *\nngx_process_slot_module_init_conf(ngx_cycle_t *cycle, void *conf)\n{\n    return NGX_CONF_OK;\n}\n\nstatic ngx_int_t\nngx_process_slot_module_init(ngx_cycle_t *cycle)\n{\n    ngx_process_slot_conf_t    *pscf;\n    ngx_shm_t                   shm;\n    ngx_uint_t                  i;\n\n    pscf = (ngx_process_slot_conf_t *) ngx_get_conf(cycle->conf_ctx,\n                                                    ngx_process_slot_module);\n\n    shm.size = sizeof(ngx_process_slot_ctx_t);\n    shm.name.len = sizeof(\"process_slot_zone\") - 1;\n    shm.name.data = (u_char *) \"process_slot_zone\";\n    shm.log = cycle->log;\n\n    if (ngx_shm_alloc(&shm) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    pscf->ctx = (ngx_process_slot_ctx_t *) shm.addr;\n\n    for (i = 0; i < MAX_PROCESSES; ++i) {\n        pscf->ctx->process_slot[i] = -1;\n    }\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_process_slot_process_init(ngx_cycle_t *cycle)\n{\n    ngx_process_slot_conf_t    *pscf;\n    ngx_process_slot_ctx_t     *ctx;\n\n    if (ngx_process != NGX_PROCESS_WORKER) {\n        return NGX_OK;\n    }\n\n    pscf = (ngx_process_slot_conf_t *) ngx_get_conf(cycle->conf_ctx,\n                                                    ngx_process_slot_module);\n    ctx = pscf->ctx;\n\n    for (;;) {\n        if (ngx_atomic_cmp_set((ngx_atomic_t *) &ctx->process_slot[ngx_worker],\n            (ngx_atomic_uint_t)ctx->process_slot[ngx_worker], ngx_process_slot))\n        {\n            break;\n        }\n    }\n\n    return NGX_OK;\n}\n\nstatic void\nngx_process_slot_process_exit(ngx_cycle_t *cycle)\n{\n    ngx_process_slot_conf_t    *pscf;\n    ngx_process_slot_ctx_t     *ctx;\n\n    if (ngx_process != NGX_PROCESS_WORKER) {\n        return;\n    }\n\n    pscf = (ngx_process_slot_conf_t *) ngx_get_conf(cycle->conf_ctx,\n                                                    ngx_process_slot_module);\n    ctx = pscf->ctx;\n\n    ngx_atomic_cmp_set((ngx_atomic_t *) &ctx->process_slot[ngx_worker],\n            (ngx_atomic_uint_t)ngx_process_slot, -1);\n}\n\nngx_int_t\nngx_multiport_get_slot(ngx_uint_t wpid)\n{\n    ngx_process_slot_conf_t    *pscf;\n    ngx_process_slot_ctx_t     *ctx;\n    ngx_core_conf_t            *ccf;\n\n    ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                           ngx_core_module);\n\n    if (wpid >= (ngx_uint_t)ccf->worker_processes) {\n        return -1;\n    }\n\n    pscf = (ngx_process_slot_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                                    ngx_process_slot_module);\n    ctx = pscf->ctx;\n\n    return ctx->process_slot[wpid];\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-multiport-module/ngx_stream_zone_module.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n\ntypedef struct ngx_stream_zone_hash_s ngx_stream_zone_hash_t;\ntypedef struct ngx_stream_zone_node_s ngx_stream_zone_node_t;\ntypedef struct ngx_stream_zone_conf_s ngx_stream_zone_conf_t;\n\nstatic ngx_int_t\nngx_stream_zone_init_process(ngx_cycle_t *cycle);\nstatic void\nngx_stream_zone_exit_process(ngx_cycle_t *cycle);\nstatic void *\nngx_stream_zone_create_conf(ngx_cycle_t *cf);\nstatic char *\nngx_stream_zone_init_conf(ngx_cycle_t *cycle, void *conf);\nstatic char *\nngx_stream_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\nstatic char *\nngx_stream_zone_shm_init(ngx_shm_t *shm, ngx_stream_zone_conf_t *szcf,\n    ngx_cycle_t *cycle);\n\n\n#define NAME_LEN    1024\n\nstatic ngx_str_t stream_zone_key = ngx_string(\"stream_zone\");\n\nstruct ngx_stream_zone_node_s {\n    u_char                              name[NAME_LEN];\n    ngx_int_t                           slot; /* process slot */\n    ngx_int_t                           idx;\n    ngx_int_t                           next; /* idx of stream node */\n};\n\nstruct ngx_stream_zone_hash_s {\n    ngx_shmtx_t                         mutex;\n    ngx_shmtx_sh_t                      lock;\n    ngx_int_t                           node; /* idx of stream node */\n};\n\nstruct ngx_stream_zone_conf_s {\n    ngx_int_t                           nbuckets;\n    ngx_int_t                           nstreams;\n\n    ngx_pool_t                         *pool;\n\n    ngx_shmtx_t                        *mutex;\n    ngx_shmtx_sh_t                     *lock;\n    ngx_stream_zone_hash_t             *hash;       /* hash in shm */\n    ngx_stream_zone_node_t             *stream_node;/* node in shm */\n    ngx_int_t                          *free_node;  /* free node chain */\n    ngx_int_t                          *alloc;      /* node number in use*/\n};\n\n\nstatic ngx_command_t  ngx_stream_zone_commands[] = {\n\n    { ngx_string(\"stream_zone\"),\n      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE2,\n      ngx_stream_zone,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_core_module_t  ngx_stream_zone_module_ctx = {\n    ngx_string(\"rtmp_stream_zone\"),\n    ngx_stream_zone_create_conf,            /* create conf */\n    ngx_stream_zone_init_conf               /* init conf */\n};\n\n\nngx_module_t  ngx_stream_zone_module = {\n    NGX_MODULE_V1,\n    &ngx_stream_zone_module_ctx,            /* module context */\n    ngx_stream_zone_commands,               /* module directives */\n    NGX_CORE_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    ngx_stream_zone_init_process,           /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    ngx_stream_zone_exit_process,           /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_stream_zone_node_t *\nngx_stream_zone_get_node(ngx_str_t *name, ngx_int_t pslot)\n{\n    ngx_stream_zone_conf_t             *szcf;\n    ngx_stream_zone_node_t             *node;\n\n    szcf = (ngx_stream_zone_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                      ngx_stream_zone_module);\n\n    ngx_shmtx_lock(szcf->mutex);\n\n    if (*szcf->free_node == -1) {\n        ngx_shmtx_unlock(szcf->mutex);\n        return NULL;\n    }\n\n    node = &szcf->stream_node[*szcf->free_node];\n    *szcf->free_node = node->next;\n\n    *ngx_copy(node->name, name->data, ngx_min(NAME_LEN - 1, name->len)) = '\\0';\n    node->slot = pslot;\n    node->next = -1;\n\n    ++*szcf->alloc;\n\n    ngx_shmtx_unlock(szcf->mutex);\n\n    return node;\n}\n\nstatic void\nngx_stream_zone_put_node(ngx_int_t idx)\n{\n    ngx_stream_zone_conf_t             *szcf;\n    ngx_stream_zone_node_t             *node;\n\n    szcf = (ngx_stream_zone_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                      ngx_stream_zone_module);\n\n    ngx_shmtx_lock(szcf->mutex);\n\n    node = &szcf->stream_node[idx];\n\n    node->next = *szcf->free_node;\n    *szcf->free_node = idx;\n\n    --*szcf->alloc;\n\n    ngx_shmtx_unlock(szcf->mutex);\n}\n\nstatic void *\nngx_stream_zone_create_conf(ngx_cycle_t *cf)\n{\n    ngx_stream_zone_conf_t             *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_zone_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->nbuckets = NGX_CONF_UNSET;\n    conf->nstreams = NGX_CONF_UNSET;\n    conf->pool = ngx_create_pool(4096, cf->log);\n\n    return conf;\n}\n\nstatic char *\nngx_stream_zone_init_conf(ngx_cycle_t *cycle, void *conf)\n{\n    size_t                              len;\n    ngx_shm_t                           shm;\n    ngx_stream_zone_conf_t             *szcf = conf;\n\n    ngx_conf_init_value(szcf->nbuckets, 512);\n    ngx_conf_init_value(szcf->nstreams, 40960);\n\n    /* create shm zone */\n    len = sizeof(ngx_shmtx_t) + sizeof(ngx_shmtx_sh_t)\n        + sizeof(ngx_stream_zone_hash_t) * szcf->nbuckets\n        + sizeof(ngx_stream_zone_node_t) * szcf->nstreams\n        + sizeof(ngx_int_t) + sizeof(ngx_int_t);\n\n    shm.size = len;\n    shm.name = stream_zone_key;\n    shm.log = cycle->log;\n\n    if (ngx_shm_alloc(&shm) != NGX_OK) {\n        return NGX_CONF_ERROR;\n    }\n\n    return ngx_stream_zone_shm_init(&shm, szcf, cycle);\n}\n\nstatic void\nngx_stream_zone_clear(ngx_cycle_t *cycle)\n{\n    ngx_stream_zone_conf_t             *szcf;\n    volatile ngx_int_t                  idx, cur, next;\n\n    szcf = (ngx_stream_zone_conf_t *) ngx_get_conf(cycle->conf_ctx,\n                                      ngx_stream_zone_module);\n\n    if (szcf->nbuckets <= 0 || szcf->nstreams <= 0) {\n        return;\n    }\n\n    for (idx = 0; idx < szcf->nbuckets; ++idx) {\n\n        ngx_shmtx_lock(&szcf->hash[idx].mutex);\n        cur = -1;\n\n        while (1) {\n            if (cur == -1) {\n                next = szcf->hash[idx].node;\n            } else {\n                next = szcf->stream_node[cur].next;\n            }\n\n            if (next == -1) {\n                break;\n            }\n\n            if (szcf->stream_node[next].slot == ngx_process_slot) {\n                if (cur == -1) {\n                    szcf->hash[idx].node = szcf->stream_node[next].next;\n                } else {\n                    szcf->stream_node[cur].next = szcf->stream_node[next].next;\n                }\n\n                ngx_stream_zone_put_node(next);\n                continue;\n            }\n\n            cur = next;\n        }\n        ngx_shmtx_unlock(&szcf->hash[idx].mutex);\n    }\n}\n\nstatic ngx_int_t\nngx_stream_zone_init_process(ngx_cycle_t *cycle)\n{\n    ngx_stream_zone_clear(cycle);\n\n    return NGX_OK;\n}\n\nstatic void\nngx_stream_zone_exit_process(ngx_cycle_t *cycle)\n{\n    ngx_stream_zone_clear(cycle);\n}\n\nstatic char *\nngx_stream_zone_shm_init(ngx_shm_t *shm, ngx_stream_zone_conf_t *szcf,\n    ngx_cycle_t *cycle)\n{\n    u_char                             *p;\n    ngx_int_t                           i, next;\n\n    p = shm->addr;\n\n    szcf->mutex = (ngx_shmtx_t *) p;\n    p += sizeof(ngx_shmtx_t);\n\n    szcf->lock = (ngx_shmtx_sh_t *) p;\n    p += sizeof(ngx_shmtx_sh_t);\n\n    szcf->hash = (ngx_stream_zone_hash_t *) p;\n    p += sizeof(ngx_stream_zone_hash_t) * szcf->nbuckets;\n\n    szcf->stream_node = (ngx_stream_zone_node_t *) p;\n    p += sizeof(ngx_stream_zone_node_t) * szcf->nstreams;\n\n    szcf->free_node = (ngx_int_t *) p;\n    p += sizeof(ngx_int_t);\n\n    szcf->alloc = (ngx_int_t *) p;\n\n    /* init shm zone */\n#if (NGX_HAVE_ATOMIC_OPS)\n\n    p = NULL;\n\n#else\n        p = ngx_pnalloc(szcf->pool, cycle->lock_file.len\n                + stream_zone_key.len);\n        if (p == NULL) {\n            return NGX_CONF_ERROR;\n        }\n        *ngx_sprintf(p, \"%V%V\", &cycle->lock_file, &stream_zone_key) = 0;\n\n#endif\n\n        if (ngx_shmtx_create(szcf->mutex, szcf->lock, p) != NGX_OK) {\n            return NGX_CONF_ERROR;\n        }\n\n    for (i = 0; i < szcf->nbuckets; ++i) {\n#if (NGX_HAVE_ATOMIC_OPS)\n\n        p = NULL;\n\n#else\n        p = ngx_pnalloc(szcf->pool, cycle->lock_file.len + stream_zone_key.len\n                + NGX_INT32_LEN);\n        if (p == NULL) {\n            return NGX_CONF_ERROR;\n        }\n        *ngx_sprintf(p, \"%V%V%d\", &cycle->lock_file,\n                           &stream_zone_key, i) = 0;\n\n#endif\n\n        if (ngx_shmtx_create(&szcf->hash[i].mutex, &szcf->hash[i].lock, p)\n                != NGX_OK)\n        {\n            return NGX_CONF_ERROR;\n        }\n\n        szcf->hash[i].node = -1;\n    }\n\n    next = -1;\n    i = szcf->nstreams;\n\n    do {\n        --i;\n\n        szcf->stream_node[i].slot = -1;\n        szcf->stream_node[i].idx = i;\n        szcf->stream_node[i].next = next;\n        next = i;\n    } while (i);\n\n    *szcf->free_node = i;\n    *szcf->alloc = 0;\n\n    return NGX_CONF_OK;\n}\n\nstatic char *\nngx_stream_zone(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_uint_t                          i;\n    ngx_str_t                          *value;\n    ngx_stream_zone_conf_t             *szcf = conf;\n\n    value = cf->args->elts;\n\n    for (i = 1; i < cf->args->nelts; ++i) {\n\n        if (ngx_strncmp(value[i].data, \"buckets=\", 8) == 0) {\n            szcf->nbuckets = ngx_atoi(value[i].data + 8, value[i].len - 8);\n\n            if (szcf->nbuckets <= 0) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                        \"invalid buckets \\\"%V\\\"\", &value[i]);\n                return NGX_CONF_ERROR;\n            }\n\n            continue;\n        }\n\n        if (ngx_strncmp(value[i].data, \"streams=\", 8) == 0) {\n            szcf->nstreams = ngx_atoi(value[i].data + 8, value[i].len - 8);\n\n            if (szcf->nstreams <= 0) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                        \"invalid streams \\\"%V\\\"\", &value[i]);\n                return NGX_CONF_ERROR;\n            }\n\n            continue;\n        }\n\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                \"invalid parameter \\\"%V\\\"\", &value[i]);\n        return NGX_CONF_ERROR;\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nngx_int_t\nngx_stream_zone_insert_stream(ngx_str_t *name)\n{\n    ngx_stream_zone_conf_t             *szcf;\n    volatile ngx_uint_t                 idx;\n    volatile ngx_int_t                  i, pslot;\n    ngx_stream_zone_node_t             *node;\n\n    szcf = (ngx_stream_zone_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                      ngx_stream_zone_module);\n\n    if (szcf->nbuckets <= 0 || szcf->nstreams <= 0) {\n        return NGX_ERROR;\n    }\n\n    if (name->len >= NAME_LEN) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"stream name(%V) too long\", name);\n        return NGX_ERROR;\n    }\n\n    idx = ngx_hash_key(name->data, name->len) % szcf->nbuckets;\n\n    ngx_shmtx_lock(&szcf->hash[idx].mutex);\n    i = szcf->hash[idx].node;\n    pslot = -1;\n    while (i != -1) {\n        if (ngx_strlen(szcf->stream_node[i].name) == name->len\n            && ngx_memcmp(szcf->stream_node[i].name, name->data, name->len)\n                == 0)\n        {\n            pslot = szcf->stream_node[i].slot;\n            break;\n        }\n\n        i = szcf->stream_node[i].next;\n    }\n\n    if (i == -1) { /* stream not in hash */\n        node = ngx_stream_zone_get_node(name, ngx_process_slot);\n        if (node == NULL) {\n            ngx_shmtx_unlock(&szcf->hash[idx].mutex);\n            ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                    \"stream zone get node failed\");\n            return NGX_ERROR;\n        }\n        node->slot = ngx_process_slot;\n\n        node->next = szcf->hash[idx].node;\n        szcf->hash[idx].node = node->idx;\n\n        pslot = ngx_process_slot;\n    }\n    ngx_shmtx_unlock(&szcf->hash[idx].mutex);\n\n    return pslot;\n}\n\nvoid\nngx_stream_zone_delete_stream(ngx_str_t *name)\n{\n    ngx_stream_zone_conf_t             *szcf;\n    volatile ngx_uint_t                 idx;\n    volatile ngx_int_t                  cur, next;\n\n    szcf = (ngx_stream_zone_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                      ngx_stream_zone_module);\n\n    if (szcf->nbuckets <= 0 || szcf->nstreams <= 0) {\n        return;\n    }\n\n    idx = ngx_hash_key(name->data, name->len) % szcf->nbuckets;\n\n    ngx_shmtx_lock(&szcf->hash[idx].mutex);\n    cur = -1;\n    next = szcf->hash[idx].node;\n    while (next != -1) {\n        if (ngx_strlen(szcf->stream_node[next].name) == name->len\n            && ngx_memcmp(szcf->stream_node[next].name, name->data, name->len)\n                == 0)\n        {\n            if (szcf->stream_node[next].slot != ngx_process_slot) {\n                break;\n            }\n\n            if (cur == -1) { /* link header */\n                szcf->hash[idx].node = szcf->stream_node[next].next;\n            } else {\n                szcf->stream_node[cur].next = szcf->stream_node[next].next;\n            }\n            ngx_stream_zone_put_node(next);\n            break;\n        }\n\n        cur = next;\n        next = szcf->stream_node[next].next;\n    }\n    ngx_shmtx_unlock(&szcf->hash[idx].mutex);\n}\n\nngx_chain_t *\nngx_stream_zone_state(ngx_http_request_t *r, ngx_flag_t detail)\n{\n    ngx_stream_zone_conf_t             *szcf;\n    ngx_chain_t                        *cl;\n    ngx_buf_t                          *b;\n    size_t                              len;\n    volatile ngx_int_t                  idx, next;\n\n    szcf = (ngx_stream_zone_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                      ngx_stream_zone_module);\n\n    if (szcf->nbuckets <= 0 || szcf->nstreams <= 0) {\n        return NULL;\n    }\n\n    len = sizeof(\"##########stream zone state##########\\n\") - 1\n        + sizeof(\"ngx_stream_zone buckets: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_stream_zone streams: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_stream_zone alloc: \\n\") - 1 + NGX_OFF_T_LEN;\n\n    cl = ngx_alloc_chain_link(r->pool);\n    if (cl == NULL) {\n        return NULL;\n    }\n    cl->next = NULL;\n\n    b = ngx_create_temp_buf(r->pool, len);\n    if (b == NULL) {\n        return NULL;\n    }\n    cl->buf = b;\n\n    b->last = ngx_snprintf(b->last, len,\n            \"##########stream zone state##########\\n\"\n            \"ngx_stream_zone buckets: %i\\nngx_stream_zone streams: %i\\n\"\n            \"ngx_stream_zone alloc: %i\\n\",\n            szcf->nbuckets, szcf->nstreams, *szcf->alloc);\n\n    if (detail) {\n        for (idx = 0; idx < szcf->nbuckets; ++idx) {\n            ngx_shmtx_lock(&szcf->hash[idx].mutex);\n\n            next = szcf->hash[idx].node;\n            if (next == -1) {\n                ngx_shmtx_unlock(&szcf->hash[idx].mutex);\n                continue;\n            }\n            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, \"slot: %i\", idx);\n\n            while (next != -1) {\n                ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n                        \"\\t\\tname:%s, slot:%i, idx:%i, next:%i\",\n                        szcf->stream_node[next].name,\n                        szcf->stream_node[next].slot,\n                        szcf->stream_node[next].idx,\n                        szcf->stream_node[next].next);\n\n                next = szcf->stream_node[next].next;\n            }\n\n            ngx_shmtx_unlock(&szcf->hash[idx].mutex);\n        }\n    }\n\n    return cl;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-multiport-module/ngx_stream_zone_module.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_STREAM_ZONE_MODULE_H_INCLUDED_\n#define _NGX_STREAM_ZONE_MODULE_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n\n\n/*\n * return value:\n *      process_slot for owner of stream, NGX_ERROR for error\n * name:\n *      stream name\n */\nngx_int_t ngx_stream_zone_insert_stream(ngx_str_t *name);\n\n/*\n * name:\n *      stream name\n */\nvoid ngx_stream_zone_delete_stream(ngx_str_t *name);\n\n/*\n * return value:\n *      chain of stream zone state for returning to http client\n * paras:\n *      r: http request to query status of rbuf\n *      detail: print stream detail in log\n */\nngx_chain_t *ngx_stream_zone_state(ngx_http_request_t *r, ngx_flag_t detail);\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-multiport-module/t/config",
    "content": "ngx_addon_name=ngx_multiport_test_module\n\nHTTP_MODULES=\"$HTTP_MODULES                                         \\\n             ngx_stream_zone_test_module                            \\\n             ngx_multiport_test_module                              \\\n             \"\n\nNGX_ADDON_SRCS=\"$NGX_ADDON_SRCS\n               $ngx_addon_dir/ngx_stream_zone_test_module.c         \\\n               $ngx_addon_dir/ngx_multiport_test_module.c           \\\n               \"\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-multiport-module/t/nginx.conf",
    "content": "\nuser  root;\nworker_processes  4;\n\n#error_log  logs/error.log;\n#error_log  logs/error.log  notice;\nerror_log  logs/error.log  info;\n\n#pid        logs/nginx.pid;\n\nstream_zone  buckets=10007 streams=10000;\n\nevents {\n    worker_connections  1024;\n    multi_listen 9000 80;\n    multi_listen unix:/tmp/http.sock.80 80;\n}\n\n\nhttp {\n    include       mime.types;\n    default_type  application/octet-stream;\n\n    #log_format  main  '$remote_addr - $remote_user [$time_local] \"$request\" '\n    #                  '$status $body_bytes_sent \"$http_referer\" '\n    #                  '\"$http_user_agent\" \"$http_x_forwarded_for\"';\n\n    #access_log  logs/access.log  main;\n\n    sendfile        on;\n    #tcp_nopush     on;\n\n    #keepalive_timeout  0;\n    keepalive_timeout  65;\n\n    #gzip  on;\n\n    server {\n        listen       80;\n        server_name  localhost;\n\n        location /stream_zone_test/ {\n            stream_zone_test;\n        }\n\n        location /multiport_test/ {\n            inner_proxy unix:/tmp/http.sock.80 /inner_proxy;\n            multiport_test;\n        }\n\n        location /inner_proxy/ {\n            rewrite ^/inner_proxy/(.*):/(.*) /$2 break;\n            proxy_pass http://$1:;\n        }\n\n        location / {\n            broadcast unix:/tmp/http.sock.80 /auth_proxy;\n        }\n\n        location /auth_proxy/ {\n            rewrite ^/auth_proxy/(.*) /auth break;\n            proxy_pass http://$1:;\n        }\n\n        location /auth {\n        #    return 403;\n            echo \"auth\";\n            echo $scheme://$host$uri?$args;\n        }\n    }\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-multiport-module/t/ngx_multiport_test_module.c",
    "content": "#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_multiport.h\"\n#include \"ngx_test_macro.h\"\n\n\nstatic char *ngx_multiport_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\n\n\nstatic ngx_command_t  ngx_multiport_test_commands[] = {\n\n    { ngx_string(\"multiport_test\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,\n      ngx_multiport_test,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_multiport_test_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    NULL,                                   /* postconfiguration */\n\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n\n    NULL,                                   /* create location configuration */\n    NULL                                    /* merge location configuration */\n};\n\n\nngx_module_t  ngx_multiport_test_module = {\n    NGX_MODULE_V1,\n    &ngx_multiport_test_module_ctx,         /* module context */\n    ngx_multiport_test_commands,            /* module directives */\n    NGX_HTTP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nngx_int_t\nngx_multiport_test_get_port(ngx_http_request_t *r, char *multiport,\n        ngx_int_t pslot, char *expect)\n{\n    ngx_str_t                   port;\n    ngx_int_t                   rc;\n    ngx_str_t                   mp;\n\n    mp.data = (u_char *) multiport;\n    mp.len = ngx_strlen(multiport);\n\n    ngx_memzero(&port, sizeof(ngx_str_t));\n    rc = ngx_multiport_get_port(r->pool, &port, &mp, pslot);\n    if (port.len) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, \"port: %V, %s, %d\",\n                &port, port.data, port.len);\n    }\n    if (expect == NULL && rc == NGX_ERROR) {\n        return 1;\n    } else {\n        return ngx_test_str(&port, expect);\n    }\n\n    return 0;\n}\n\nstatic ngx_int_t\nngx_multiport_test_handler(ngx_http_request_t *r)\n{\n    ngx_buf_t                  *b;\n    ngx_chain_t                 cl;\n    size_t                      len;\n    ngx_int_t                   rc;\n\n    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"multiport test handler\");\n\n    rc = ngx_http_inner_proxy_request(r, ngx_multiport_get_slot(0));\n    if (rc != NGX_DECLINED) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                \"inner proxy return %i\", rc);\n        return rc;\n    }\n\n    NGX_TEST_INIT\n\n    /* test ngx_multiport_get_port */\n    /* normal format */\n    NGX_TEST_ISOK(ngx_multiport_test_get_port(r, \"10\", 127, \"137\"));\n    NGX_TEST_ISOK(ngx_multiport_test_get_port(r, \"127.0.0.1:55635\", 4,\n                                              \"127.0.0.1:55639\"));\n    NGX_TEST_ISOK(ngx_multiport_test_get_port(r, \"[::127.0.0.1]:1024\", 0,\n                                              \"[::127.0.0.1]:1024\"));\n    NGX_TEST_ISOK(ngx_multiport_test_get_port(r, \"unix:/tmp.test\", 7,\n                                              \"unix:/tmp.test.7\"));\n\n    /* inet6 format error */\n    NGX_TEST_ISOK(ngx_multiport_test_get_port(r, \"[::127.0.0.1:1024\", 0, NULL));\n    NGX_TEST_ISOK(ngx_multiport_test_get_port(r, \"[::127.0.0.1]:abcd\",\n                                              0, NULL));\n    NGX_TEST_ISOK(ngx_multiport_test_get_port(r, \"[::127.0.0.1]:65409\",\n                                              0, NULL));\n    NGX_TEST_ISOK(ngx_multiport_test_get_port(r, \"[::127.0.0.1]:\", 0, NULL));\n    NGX_TEST_ISOK(ngx_multiport_test_get_port(r, \"[::127.0.0.1]\", 0, NULL));\n\n    /* inet format error */\n    NGX_TEST_ISOK(ngx_multiport_test_get_port(r, \"127.0.0.1:\", 4, NULL));\n    NGX_TEST_ISOK(ngx_multiport_test_get_port(r, \"abcd\", 4, NULL));\n    NGX_TEST_ISOK(ngx_multiport_test_get_port(r, \"65410\", 4, NULL));\n\n    /* pslot error */\n    NGX_TEST_ISOK(ngx_multiport_test_get_port(r, \"65410\", -1, NULL));\n    NGX_TEST_ISOK(ngx_multiport_test_get_port(r, \"65410\", 128, NULL));\n\n    /* test ngx_multiport_get_slot */\n    NGX_TEST_ISOK(ngx_multiport_get_slot(4) == -1);\n    NGX_TEST_ISOK(ngx_multiport_get_slot(0) == 0);\n    NGX_TEST_ISOK(ngx_multiport_get_slot(1) == 1);\n    NGX_TEST_ISOK(ngx_multiport_get_slot(2) == 2);\n    NGX_TEST_ISOK(ngx_multiport_get_slot(3) == 3);\n\n    r->headers_out.status = NGX_HTTP_OK;\n\n    ngx_http_send_header(r);\n\n    len = sizeof(\"pslot: %i TEST cases 4294967296, 4294967296 pass\\n\") - 1;\n    b = ngx_create_temp_buf(r->pool, len);\n\n    if (b == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    b->last = ngx_snprintf(b->last, len, \"pslot: %i TEST cases %d, %d pass\\n\",\n            ngx_process_slot, count, pass);\n    b->last_buf = 1;\n    b->last_in_chain = 1;\n\n    cl.buf = b;\n    cl.next = NULL;\n\n    return ngx_http_output_filter(r, &cl);\n}\n\n\nstatic char *\nngx_multiport_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t   *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_multiport_test_handler;\n\n    return NGX_CONF_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-multiport-module/t/ngx_stream_zone_test_module.c",
    "content": "#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_stream_zone_module.h\"\n\n\nstatic char *ngx_stream_zone_test(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\n\nstatic ngx_command_t  ngx_stream_zone_test_commands[] = {\n\n    { ngx_string(\"stream_zone_test\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,\n      ngx_stream_zone_test,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_stream_zone_test_module_ctx = {\n    NULL,                               /* preconfiguration */\n    NULL,                               /* postconfiguration */\n\n    NULL,                               /* create main configuration */\n    NULL,                               /* init main configuration */\n\n    NULL,                               /* create server configuration */\n    NULL,                               /* merge server configuration */\n\n    NULL,                               /* create location configuration */\n    NULL                                /* merge location configuration */\n};\n\n\nngx_module_t  ngx_stream_zone_test_module = {\n    NGX_MODULE_V1,\n    &ngx_stream_zone_test_module_ctx,   /* module context */\n    ngx_stream_zone_test_commands,      /* module directives */\n    NGX_HTTP_MODULE,                    /* module type */\n    NULL,                               /* init master */\n    NULL,                               /* init module */\n    NULL,                               /* init process */\n    NULL,                               /* init thread */\n    NULL,                               /* exit thread */\n    NULL,                               /* exit process */\n    NULL,                               /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_int_t\nngx_stream_zone_test_handler(ngx_http_request_t *r)\n{\n    ngx_chain_t                     cl, *out;\n    ngx_buf_t                      *b;\n    size_t                          len;\n    ngx_str_t                       stream;\n    ngx_int_t                       rc;\n\n    ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"stream zone test handler\");\n\n    rc = -1;\n    if (r->method == NGX_HTTP_GET) {\n        out = ngx_stream_zone_state(r, 1);\n        out->buf->last_buf = 1;\n        out->buf->last_in_chain = 1;\n\n        r->headers_out.status = NGX_HTTP_OK;\n        ngx_http_send_header(r);\n\n        return ngx_http_output_filter(r, out);\n    } else if (r->method == NGX_HTTP_DELETE) {\n\n        if (ngx_http_arg(r, (u_char *) \"stream\", 6, &stream) != NGX_OK) {\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                    \"stream zone test, no stream in http args\");\n            return NGX_HTTP_BAD_REQUEST;\n        }\n\n        len = sizeof(\"delete stream=\\n\") - 1 + stream.len;\n\n        ngx_stream_zone_delete_stream(&stream);\n    } else if (r->method == NGX_HTTP_POST) {\n\n        if (ngx_http_arg(r, (u_char *) \"stream\", 6, &stream) != NGX_OK) {\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                    \"stream zone test, no stream in http args\");\n            return NGX_HTTP_BAD_REQUEST;\n        }\n\n        len = sizeof(\"stream= in process:4294967296\\n\") - 1 + stream.len;\n\n        rc = ngx_stream_zone_insert_stream(&stream);\n    } else {\n        return NGX_HTTP_BAD_REQUEST;\n    }\n\n    r->headers_out.status = NGX_HTTP_OK;\n    ngx_http_send_header(r);\n\n    b = ngx_create_temp_buf(r->pool, len);\n\n    if (b == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    if (r->method == NGX_HTTP_DELETE) {\n        b->last = ngx_snprintf(b->last, len, \"delete stream=%V\\n\", &stream);\n    } else {\n        b->last = ngx_snprintf(b->last, len,\n                \"stream=%V in process:%i\\n\", &stream, rc);\n    }\n    b->last_buf = 1;\n    b->last_in_chain = 1;\n\n    cl.buf = b;\n    cl.next = NULL;\n\n    return ngx_http_output_filter(r, &cl);\n}\n\nstatic char *\nngx_stream_zone_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t  *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_stream_zone_test_handler;\n\n    return NGX_CONF_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-multiport-module/t/ngx_test_macro.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_TEST_MACRO_H_INCLUDE_\n#define _NGX_TEST_MACRO_H_INCLUDE_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n\nstatic ngx_int_t count  = 0;\nstatic ngx_int_t pass   = 0;\n\n#define NGX_TEST_INIT       count = 0, pass = 0;\n\n#define NGX_TEST_ISOK(testcase)                                             \\\n{                                                                           \\\n    ngx_int_t  __ret = testcase;                                            \\\n    ++count;                                                                \\\n    if (__ret) ++pass;                                                      \\\n    ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, \"    TEST \"#testcase\"%s\",\\\n            (__ret ? \" ...OK\" : \" ...ERROR\"));                              \\\n}\n\n#define NGX_TEST_INT(di, si)                                                \\\n    (di == si)\n\nstatic ngx_inline ngx_int_t\nngx_test_str(ngx_str_t *nstr, char *cstr)\n{\n    size_t                      len;\n\n    len = ngx_strlen(cstr);\n\n    return (nstr->len == len && ngx_memcmp(nstr->data, cstr, len) == 0);\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/AUTHORS",
    "content": "Project author:\n\n  Roman Arutyunyan\n    Moscow, Russia, Pingo\n\n  Contacts:\n    arut@qip.ru\n    arutyunyan.roman@gmail.com\n    cczjp89@gmail.com"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/config",
    "content": "ngx_addon_name=\"ngx_rtmp_module\"\n\nRTMP_CORE_MODULES=\"                                         \\\n                ngx_live_module                             \\\n                ngx_rtmp_module                             \\\n                ngx_rtmp_dynamic_module                     \\\n                ngx_rtmp_dynamic_core_module                \\\n                ngx_rtmp_core_module                        \\\n                ngx_rtmp_cmd_module                         \\\n                ngx_rtmp_codec_module                       \\\n                ngx_rtmp_access_module                      \\\n                ngx_rtmp_live_module                        \\\n                ngx_live_record_module                      \\\n                ngx_live_relay_module                       \\\n                ngx_live_relay_rtmp_module                  \\\n                ngx_live_relay_static_module                \\\n                ngx_live_relay_simple_module                \\\n                ngx_rtmp_exec_module                        \\\n                ngx_rtmp_notify_module                        \\\n                ngx_live_relay_inner_module                 \\\n                ngx_rtmp_log_module                         \\\n                ngx_rtmp_limit_module                       \\\n                ngx_rtmp_hls_module                         \\\n                ngx_rtmp_dash_module                        \\\n                ngx_rtmp_shared_module                      \\\n                ngx_rtmp_record_module                      \\\n                ngx_rtmp_gop_module                         \\\n                ngx_rtmp_monitor_module                     \\\n                ngx_mpegts_live_module                      \\\n                ngx_mpegts_gop_module                       \\\n                ngx_hls_live_module                         \\\n                \"\n\n\nRTMP_HTTP_MODULES=\"                                         \\\n                ngx_rtmp_stat_module                        \\\n                ngx_rtmp_sys_stat_module                    \\\n                ngx_rtmp_control_module                     \\\n                ngx_http_flv_live_module                    \\\n                ngx_hls_http_module                         \\\n                ngx_mpegts_http_module                      \\\n                \"\n\n\nRTMP_DEPS=\"                                                     \\\n                $ngx_addon_dir/ngx_netcall.h                    \\\n                $ngx_addon_dir/ngx_rtmp_amf.h                   \\\n                $ngx_addon_dir/ngx_rtmp_bandwidth.h             \\\n                $ngx_addon_dir/ngx_rtmp_cmd_module.h            \\\n                $ngx_addon_dir/ngx_rtmp_codec_module.h          \\\n                $ngx_addon_dir/ngx_rtmp_eval.h                  \\\n                $ngx_addon_dir/ngx_rtmp.h                       \\\n                $ngx_addon_dir/ngx_rtmp_version.h               \\\n                $ngx_addon_dir/ngx_rtmp_live_module.h           \\\n                $ngx_addon_dir/ngx_rtmp_notify_module.h           \\\n                $ngx_addon_dir/ngx_rtmp_streams.h               \\\n                $ngx_addon_dir/ngx_rtmp_bitop.h                 \\\n                $ngx_addon_dir/ngx_rtmp_proxy_protocol.h        \\\n                $ngx_addon_dir/ngx_rtmp_monitor_module.h        \\\n                $ngx_addon_dir/hls/ngx_rtmp_mpegts.h            \\\n                $ngx_addon_dir/dash/ngx_rtmp_mp4.h              \\\n                $ngx_addon_dir/http/ngx_http_set_header.h       \\\n                $ngx_addon_dir/ngx_live.h                       \\\n                $ngx_addon_dir/ngx_live_relay.h                 \\\n                $ngx_addon_dir/ngx_live_record.h                \\\n                $ngx_addon_dir/ngx_rtmp_dynamic.h               \\\n                $ngx_addon_dir/ngx_rtmp_variables.h             \\\n                $ngx_addon_dir/ngx_rtmp_record_module.h         \\\n                $ngx_addon_dir/mpegts/ngx_mpegts_live_module.h  \\\n                $ngx_addon_dir/mpegts/ngx_hls_live_module.h     \\\n                $ngx_addon_dir/mpegts/ngx_mpegts_gop_module.h   \\\n                \"\n\n\nRTMP_CORE_SRCS=\"                                                \\\n                $ngx_addon_dir/ngx_netcall.c                    \\\n                $ngx_addon_dir/ngx_rtmp.c                       \\\n                $ngx_addon_dir/ngx_rtmp_init.c                  \\\n                $ngx_addon_dir/ngx_rtmp_handshake.c             \\\n                $ngx_addon_dir/ngx_rtmp_handler.c               \\\n                $ngx_addon_dir/ngx_rtmp_amf.c                   \\\n                $ngx_addon_dir/ngx_rtmp_send.c                  \\\n                $ngx_addon_dir/ngx_rtmp_eval.c                  \\\n                $ngx_addon_dir/ngx_rtmp_receive.c               \\\n                $ngx_addon_dir/ngx_rtmp_core_module.c           \\\n                $ngx_addon_dir/ngx_rtmp_cmd_module.c            \\\n                $ngx_addon_dir/ngx_rtmp_codec_module.c          \\\n                $ngx_addon_dir/ngx_rtmp_access_module.c         \\\n                $ngx_addon_dir/ngx_rtmp_live_module.c           \\\n                $ngx_addon_dir/ngx_rtmp_bandwidth.c             \\\n                $ngx_addon_dir/ngx_rtmp_exec_module.c           \\\n                $ngx_addon_dir/ngx_rtmp_notify_module.c           \\\n                $ngx_addon_dir/ngx_rtmp_log_module.c            \\\n                $ngx_addon_dir/ngx_rtmp_limit_module.c          \\\n                $ngx_addon_dir/ngx_rtmp_bitop.c                 \\\n                $ngx_addon_dir/ngx_rtmp_proxy_protocol.c        \\\n                $ngx_addon_dir/hls/ngx_rtmp_hls_module.c        \\\n                $ngx_addon_dir/dash/ngx_rtmp_dash_module.c      \\\n                $ngx_addon_dir/hls/ngx_rtmp_mpegts.c            \\\n                $ngx_addon_dir/dash/ngx_rtmp_mp4.c              \\\n                $ngx_addon_dir/ngx_live.c                       \\\n                $ngx_addon_dir/ngx_live_relay.c                 \\\n                $ngx_addon_dir/ngx_live_relay_httpflv.c         \\\n                $ngx_addon_dir/ngx_live_relay_rtmp.c            \\\n                $ngx_addon_dir/ngx_live_relay_inner.c           \\\n                $ngx_addon_dir/ngx_live_relay_simple.c          \\\n                $ngx_addon_dir/ngx_live_relay_static.c          \\\n                $ngx_addon_dir/ngx_live_record.c                \\\n                $ngx_addon_dir/ngx_rtmp_shared_module.c         \\\n                $ngx_addon_dir/ngx_rtmp_gop_module.c            \\\n                $ngx_addon_dir/ngx_rtmp_monitor_module.c        \\\n                $ngx_addon_dir/ngx_rtmp_dynamic.c               \\\n                $ngx_addon_dir/ngx_rtmp_variables.c             \\\n                $ngx_addon_dir/ngx_rtmp_record_module.c         \\\n                $ngx_addon_dir/mpegts/ngx_mpegts_live_module.c  \\\n                $ngx_addon_dir/mpegts/ngx_hls_live_module.c     \\\n                $ngx_addon_dir/mpegts/ngx_mpegts_gop_module.c   \\\n                \"\n\n\nRTMP_HTTP_SRCS=\"                                                \\\n                $ngx_addon_dir/ngx_rtmp_sys_stat_module.c       \\\n                $ngx_addon_dir/ngx_rtmp_stat_module.c           \\\n                $ngx_addon_dir/ngx_rtmp_control_module.c        \\\n                $ngx_addon_dir/http/ngx_http_flv_live_module.c  \\\n                $ngx_addon_dir/http/ngx_http_set_header.c       \\\n                $ngx_addon_dir/mpegts/ngx_hls_http_module.c     \\\n                $ngx_addon_dir/mpegts/ngx_mpegts_http_module.c  \\\n                \"\n\nif [ -f auto/module ] ; then\n    ngx_module_incs=$ngx_addon_dir\n    ngx_module_deps=$RTMP_DEPS\n\n    if [ $ngx_module_link = DYNAMIC ] ; then\n        ngx_module_name=\"$RTMP_CORE_MODULES $RTMP_HTTP_MODULES\"\n        ngx_module_srcs=\"$RTMP_CORE_SRCS $RTMP_HTTP_SRCS\"\n\n        . auto/module\n\n    else\n        ngx_module_type=CORE\n        ngx_module_name=$RTMP_CORE_MODULES\n        ngx_module_srcs=$RTMP_CORE_SRCS\n\n        . auto/module\n\n\n        ngx_module_type=HTTP\n        ngx_module_name=$RTMP_HTTP_MODULES\n        ngx_module_incs=\"$ngx_addon_dir $ngx_addon_dir/http $ngx_addon_dir/hls $ngx_addon_dir/mpegts\"\n        ngx_module_deps=\n        ngx_module_srcs=$RTMP_HTTP_SRCS\n\n        . auto/module\n    fi\n\nelse\n    CORE_MODULES=\"$CORE_MODULES $RTMP_CORE_MODULES\"\n    HTTP_MODULES=\"$HTTP_MODULES $RTMP_HTTP_MODULES\"\n\n    NGX_ADDON_DEPS=\"$NGX_ADDON_DEPS $RTMP_DEPS\"\n    NGX_ADDON_SRCS=\"$NGX_ADDON_SRCS $RTMP_CORE_SRCS $RTMP_HTTP_SRCS\"\n\n    CFLAGS=\"$CFLAGS -I$ngx_addon_dir -I$ngx_addon_dir/http -I$ngx_addon_dir/hls -I$ngx_addon_dir/mpegts\"\nfi\n\nUSE_OPENSSL=YES\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/dash/ngx_rtmp_dash_module.c",
    "content": "\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_rtmp.h>\n#include <ngx_rtmp_codec_module.h>\n#include \"ngx_rtmp_live_module.h\"\n#include \"ngx_rtmp_mp4.h\"\n\n\nstatic ngx_rtmp_publish_pt              next_publish;\nstatic ngx_rtmp_close_stream_pt         next_close_stream;\nstatic ngx_rtmp_stream_begin_pt         next_stream_begin;\nstatic ngx_rtmp_stream_eof_pt           next_stream_eof;\n\n\nstatic ngx_int_t ngx_rtmp_dash_postconfiguration(ngx_conf_t *cf);\nstatic void * ngx_rtmp_dash_create_app_conf(ngx_conf_t *cf);\nstatic char * ngx_rtmp_dash_merge_app_conf(ngx_conf_t *cf,\n       void *parent, void *child);\nstatic ngx_int_t ngx_rtmp_dash_write_init_segments(ngx_rtmp_session_t *s);\n\n\n#define NGX_RTMP_DASH_BUFSIZE           (1024*1024)\n#define NGX_RTMP_DASH_MAX_MDAT          (10*1024*1024)\n#define NGX_RTMP_DASH_MAX_SAMPLES       1024\n#define NGX_RTMP_DASH_DIR_ACCESS        0744\n\n\ntypedef struct {\n    uint32_t                            timestamp;\n    uint32_t                            duration;\n} ngx_rtmp_dash_frag_t;\n\n\ntypedef struct {\n    ngx_uint_t                          id;\n    ngx_uint_t                          opened;\n    ngx_uint_t                          mdat_size;\n    ngx_uint_t                          sample_count;\n    ngx_uint_t                          sample_mask;\n    ngx_fd_t                            fd;\n    char                                type;\n    uint32_t                            earliest_pres_time;\n    uint32_t                            latest_pres_time;\n    ngx_rtmp_mp4_sample_t               samples[NGX_RTMP_DASH_MAX_SAMPLES];\n} ngx_rtmp_dash_track_t;\n\n\ntypedef struct {\n    ngx_str_t                           playlist;\n    ngx_str_t                           playlist_bak;\n    ngx_str_t                           name;\n    ngx_str_t                           stream;\n    time_t                              start_time;\n\n    ngx_uint_t                          nfrags;\n    ngx_uint_t                          frag;\n    ngx_rtmp_dash_frag_t               *frags; /* circular 2 * winfrags + 1 */\n\n    unsigned                            opened:1;\n    unsigned                            has_video:1;\n    unsigned                            has_audio:1;\n\n    ngx_file_t                          video_file;\n    ngx_file_t                          audio_file;\n\n    ngx_uint_t                          id;\n\n    ngx_rtmp_dash_track_t               audio;\n    ngx_rtmp_dash_track_t               video;\n} ngx_rtmp_dash_ctx_t;\n\n\ntypedef struct {\n    ngx_str_t                           path;\n    ngx_msec_t                          playlen;\n} ngx_rtmp_dash_cleanup_t;\n\n\ntypedef struct {\n    ngx_flag_t                          dash;\n    ngx_msec_t                          fraglen;\n    ngx_msec_t                          playlen;\n    ngx_flag_t                          nested;\n    ngx_str_t                           path;\n    ngx_uint_t                          winfrags;\n    ngx_flag_t                          cleanup;\n    ngx_path_t                         *slot;\n} ngx_rtmp_dash_app_conf_t;\n\n\nstatic ngx_command_t ngx_rtmp_dash_commands[] = {\n\n    { ngx_string(\"dash\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_dash_app_conf_t, dash),\n      NULL },\n\n    { ngx_string(\"dash_fragment\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_dash_app_conf_t, fraglen),\n      NULL },\n\n    { ngx_string(\"dash_path\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_str_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_dash_app_conf_t, path),\n      NULL },\n\n    { ngx_string(\"dash_playlist_length\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_dash_app_conf_t, playlen),\n      NULL },\n\n    { ngx_string(\"dash_cleanup\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_dash_app_conf_t, cleanup),\n      NULL },\n\n    { ngx_string(\"dash_nested\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_dash_app_conf_t, nested),\n      NULL },\n\n    ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_rtmp_dash_module_ctx = {\n    NULL,                               /* preconfiguration */\n    ngx_rtmp_dash_postconfiguration,    /* postconfiguration */\n\n    NULL,                               /* create main configuration */\n    NULL,                               /* init main configuration */\n\n    NULL,                               /* create server configuration */\n    NULL,                               /* merge server configuration */\n\n    ngx_rtmp_dash_create_app_conf,      /* create location configuration */\n    ngx_rtmp_dash_merge_app_conf,       /* merge location configuration */\n};\n\n\nngx_module_t  ngx_rtmp_dash_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_dash_module_ctx,          /* module context */\n    ngx_rtmp_dash_commands,             /* module directives */\n    NGX_RTMP_MODULE,                    /* module type */\n    NULL,                               /* init master */\n    NULL,                               /* init module */\n    NULL,                               /* init process */\n    NULL,                               /* init thread */\n    NULL,                               /* exit thread */\n    NULL,                               /* exit process */\n    NULL,                               /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_rtmp_dash_frag_t *\nngx_rtmp_dash_get_frag(ngx_rtmp_session_t *s, ngx_int_t n)\n{\n    ngx_rtmp_dash_ctx_t       *ctx;\n    ngx_rtmp_dash_app_conf_t  *dacf;\n\n    dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module);\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module);\n\n    return &ctx->frags[(ctx->frag + n) % (dacf->winfrags * 2 + 1)];\n}\n\n\nstatic void\nngx_rtmp_dash_next_frag(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_dash_ctx_t       *ctx;\n    ngx_rtmp_dash_app_conf_t  *dacf;\n\n    dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module);\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module);\n\n    if (ctx->nfrags == dacf->winfrags) {\n        ctx->frag++;\n    } else {\n        ctx->nfrags++;\n    }\n}\n\n\nstatic ngx_int_t\nngx_rtmp_dash_rename_file(u_char *src, u_char *dst)\n{\n    /* rename file with overwrite */\n\n#if (NGX_WIN32)\n    return MoveFileEx((LPCTSTR) src, (LPCTSTR) dst, MOVEFILE_REPLACE_EXISTING);\n#else\n    return ngx_rename_file(src, dst);\n#endif\n}\n\n\nstatic ngx_int_t\nngx_rtmp_dash_write_playlist(ngx_rtmp_session_t *s)\n{\n    char                      *sep;\n    u_char                    *p, *last;\n    ssize_t                    n;\n    ngx_fd_t                   fd;\n    struct tm                  tm;\n    ngx_str_t                  noname, *name;\n    ngx_uint_t                 i;\n    ngx_rtmp_dash_ctx_t       *ctx;\n    ngx_rtmp_codec_ctx_t      *codec_ctx;\n    ngx_rtmp_dash_frag_t      *f;\n    ngx_rtmp_dash_app_conf_t  *dacf;\n\n    static u_char              buffer[NGX_RTMP_DASH_BUFSIZE];\n    static u_char              start_time[sizeof(\"1970-09-28T12:00:00Z\")];\n    static u_char              pub_time[sizeof(\"1970-09-28T12:00:00Z\")];\n\n    dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module);\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module);\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    if (dacf == NULL || ctx == NULL || codec_ctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    if (ctx->id == 0) {\n        ngx_rtmp_dash_write_init_segments(s);\n    }\n\n    fd = ngx_open_file(ctx->playlist_bak.data, NGX_FILE_WRONLY,\n                       NGX_FILE_TRUNCATE, NGX_FILE_DEFAULT_ACCESS);\n\n    if (fd == NGX_INVALID_FILE) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"dash: open failed: '%V'\", &ctx->playlist_bak);\n        return NGX_ERROR;\n    }\n\n#define NGX_RTMP_DASH_MANIFEST_HEADER                                          \\\n    \"<?xml version=\\\"1.0\\\"?>\\n\"                                                \\\n    \"<MPD\\n\"                                                                   \\\n    \"    type=\\\"dynamic\\\"\\n\"                                                   \\\n    \"    xmlns=\\\"urn:mpeg:dash:schema:mpd:2011\\\"\\n\"                            \\\n    \"    availabilityStartTime=\\\"%s\\\"\\n\"                                       \\\n    \"    publishTime=\\\"%s\\\"\\n\"                                                 \\\n    \"    minimumUpdatePeriod=\\\"PT%uiS\\\"\\n\"                                     \\\n    \"    minBufferTime=\\\"PT%uiS\\\"\\n\"                                           \\\n    \"    timeShiftBufferDepth=\\\"PT%uiS\\\"\\n\"                                    \\\n    \"    profiles=\\\"urn:hbbtv:dash:profile:isoff-live:2012,\"                   \\\n                   \"urn:mpeg:dash:profile:isoff-live:2011\\\"\\n\"                 \\\n    \"    xmlns:xsi=\\\"http://www.w3.org/2011/XMLSchema-instance\\\"\\n\"            \\\n    \"    xsi:schemaLocation=\\\"urn:mpeg:DASH:schema:MPD:2011 DASH-MPD.xsd\\\">\\n\" \\\n    \"  <Period start=\\\"PT0S\\\" id=\\\"dash\\\">\\n\"\n\n\n#define NGX_RTMP_DASH_MANIFEST_VIDEO                                           \\\n    \"    <AdaptationSet\\n\"                                                     \\\n    \"        id=\\\"1\\\"\\n\"                                                       \\\n    \"        segmentAlignment=\\\"true\\\"\\n\"                                      \\\n    \"        maxWidth=\\\"%ui\\\"\\n\"                                               \\\n    \"        maxHeight=\\\"%ui\\\"\\n\"                                              \\\n    \"        maxFrameRate=\\\"%ui\\\">\\n\"                                          \\\n    \"      <Representation\\n\"                                                  \\\n    \"          id=\\\"%V_H264\\\"\\n\"                                               \\\n    \"          mimeType=\\\"video/mp4\\\"\\n\"                                       \\\n    \"          codecs=\\\"avc1.%02uxi%02uxi%02uxi\\\"\\n\"                           \\\n    \"          width=\\\"%ui\\\"\\n\"                                                \\\n    \"          height=\\\"%ui\\\"\\n\"                                               \\\n    \"          frameRate=\\\"%ui\\\"\\n\"                                            \\\n    \"          startWithSAP=\\\"1\\\"\\n\"                                           \\\n    \"          bandwidth=\\\"%ui\\\">\\n\"                                           \\\n    \"        <SegmentTemplate\\n\"                                               \\\n    \"            timescale=\\\"1000\\\"\\n\"                                         \\\n    \"            media=\\\"%V%s$Time$.m4v\\\"\\n\"                                   \\\n    \"            initialization=\\\"%V%sinit.m4v\\\">\\n\"                           \\\n    \"          <SegmentTimeline>\\n\"\n\n\n#define NGX_RTMP_DASH_MANIFEST_VIDEO_FOOTER                                    \\\n    \"          </SegmentTimeline>\\n\"                                           \\\n    \"        </SegmentTemplate>\\n\"                                             \\\n    \"      </Representation>\\n\"                                                \\\n    \"    </AdaptationSet>\\n\"\n\n\n#define NGX_RTMP_DASH_MANIFEST_TIME                                            \\\n    \"             <S t=\\\"%uD\\\" d=\\\"%uD\\\"/>\\n\"\n\n\n#define NGX_RTMP_DASH_MANIFEST_AUDIO                                           \\\n    \"    <AdaptationSet\\n\"                                                     \\\n    \"        id=\\\"2\\\"\\n\"                                                       \\\n    \"        segmentAlignment=\\\"true\\\">\\n\"                                     \\\n    \"      <AudioChannelConfiguration\\n\"                                       \\\n    \"          schemeIdUri=\\\"urn:mpeg:dash:\"                                   \\\n                                \"23003:3:audio_channel_configuration:2011\\\"\\n\" \\\n    \"          value=\\\"1\\\"/>\\n\"                                                \\\n    \"      <Representation\\n\"                                                  \\\n    \"          id=\\\"%V_AAC\\\"\\n\"                                                \\\n    \"          mimeType=\\\"audio/mp4\\\"\\n\"                                       \\\n    \"          codecs=\\\"mp4a.%s\\\"\\n\"                                           \\\n    \"          audioSamplingRate=\\\"%ui\\\"\\n\"                                    \\\n    \"          startWithSAP=\\\"1\\\"\\n\"                                           \\\n    \"          bandwidth=\\\"%ui\\\">\\n\"                                           \\\n    \"        <SegmentTemplate\\n\"                                               \\\n    \"            timescale=\\\"1000\\\"\\n\"                                         \\\n    \"            media=\\\"%V%s$Time$.m4a\\\"\\n\"                                   \\\n    \"            initialization=\\\"%V%sinit.m4a\\\">\\n\"                           \\\n    \"          <SegmentTimeline>\\n\"\n\n\n#define NGX_RTMP_DASH_MANIFEST_AUDIO_FOOTER                                    \\\n    \"          </SegmentTimeline>\\n\"                                           \\\n    \"        </SegmentTemplate>\\n\"                                             \\\n    \"      </Representation>\\n\"                                                \\\n    \"    </AdaptationSet>\\n\"\n\n\n#define NGX_RTMP_DASH_MANIFEST_FOOTER                                          \\\n    \"  </Period>\\n\"                                                            \\\n    \"</MPD>\\n\"\n\n    ngx_libc_gmtime(ctx->start_time, &tm);\n\n    ngx_sprintf(start_time, \"%4d-%02d-%02dT%02d:%02d:%02dZ%Z\",\n                tm.tm_year + 1900, tm.tm_mon + 1,\n                tm.tm_mday, tm.tm_hour,\n                tm.tm_min, tm.tm_sec);\n\n    ngx_libc_gmtime(ngx_time(), &tm);\n\n    ngx_sprintf(pub_time, \"%4d-%02d-%02dT%02d:%02d:%02dZ%Z\",\n                tm.tm_year + 1900, tm.tm_mon + 1,\n                tm.tm_mday, tm.tm_hour,\n                tm.tm_min, tm.tm_sec);\n\n    ngx_memset(buffer, 0, sizeof(buffer));\n    last = buffer + sizeof(buffer);\n\n    p = ngx_slprintf(buffer, last, NGX_RTMP_DASH_MANIFEST_HEADER,\n                     start_time,\n                     pub_time,\n                     (ngx_uint_t) (dacf->fraglen / 1000),\n                     (ngx_uint_t) (dacf->fraglen / 1000),\n                     (ngx_uint_t) (dacf->fraglen / 250 + 1));\n\n    /*\n     * timeShiftBufferDepth formula:\n     *     2 * minBufferTime + max_fragment_length + 1\n     */\n\n    n = ngx_write_fd(fd, buffer, p - buffer);\n\n    ngx_str_null(&noname);\n\n    name = (dacf->nested ? &noname : &ctx->name);\n    sep = (dacf->nested ? \"\" : \"-\");\n\n    if (ctx->has_video) {\n        p = ngx_slprintf(buffer, last, NGX_RTMP_DASH_MANIFEST_VIDEO,\n                         codec_ctx->width,\n                         codec_ctx->height,\n                         (ngx_uint_t) codec_ctx->frame_rate,\n                         &ctx->name,\n                         codec_ctx->avc_profile,\n                         codec_ctx->avc_compat,\n                         codec_ctx->avc_level,\n                         codec_ctx->width,\n                         codec_ctx->height,\n                         (ngx_uint_t) codec_ctx->frame_rate,\n                         (ngx_uint_t) (codec_ctx->video_data_rate * 1000),\n                         name, sep,\n                         name, sep);\n\n        for (i = 0; i < ctx->nfrags; i++) {\n            f = ngx_rtmp_dash_get_frag(s, i);\n            p = ngx_slprintf(p, last, NGX_RTMP_DASH_MANIFEST_TIME,\n                             f->timestamp, f->duration);\n        }\n\n        p = ngx_slprintf(p, last, NGX_RTMP_DASH_MANIFEST_VIDEO_FOOTER);\n\n        n = ngx_write_fd(fd, buffer, p - buffer);\n    }\n\n    if (ctx->has_audio) {\n        p = ngx_slprintf(buffer, last, NGX_RTMP_DASH_MANIFEST_AUDIO,\n                         &ctx->name,\n                         codec_ctx->audio_codec_id == NGX_RTMP_AUDIO_AAC ?\n                         (codec_ctx->aac_sbr ? \"40.5\" : \"40.2\") : \"6b\",\n                         codec_ctx->sample_rate,\n                         (ngx_uint_t) (codec_ctx->audio_data_rate * 1000),\n                         name, sep,\n                         name, sep);\n\n        for (i = 0; i < ctx->nfrags; i++) {\n            f = ngx_rtmp_dash_get_frag(s, i);\n            p = ngx_slprintf(p, last, NGX_RTMP_DASH_MANIFEST_TIME,\n                             f->timestamp, f->duration);\n        }\n\n        p = ngx_slprintf(p, last, NGX_RTMP_DASH_MANIFEST_AUDIO_FOOTER);\n\n        n = ngx_write_fd(fd, buffer, p - buffer);\n    }\n\n    p = ngx_slprintf(buffer, last, NGX_RTMP_DASH_MANIFEST_FOOTER);\n    n = ngx_write_fd(fd, buffer, p - buffer);\n\n    if (n < 0) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"dash: write failed: '%V'\", &ctx->playlist_bak);\n        ngx_close_file(fd);\n        return NGX_ERROR;\n    }\n\n    ngx_close_file(fd);\n\n    if (ngx_rtmp_dash_rename_file(ctx->playlist_bak.data, ctx->playlist.data)\n        == NGX_FILE_ERROR)\n    {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"dash: rename failed: '%V'->'%V'\",\n                      &ctx->playlist_bak, &ctx->playlist);\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_dash_write_init_segments(ngx_rtmp_session_t *s)\n{\n    ngx_fd_t               fd;\n    ngx_int_t              rc;\n    ngx_buf_t              b;\n    ngx_rtmp_dash_ctx_t   *ctx;\n    ngx_rtmp_codec_ctx_t  *codec_ctx;\n\n    static u_char          buffer[NGX_RTMP_DASH_BUFSIZE];\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module);\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    if (ctx == NULL || codec_ctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    /* init video */\n\n    *ngx_sprintf(ctx->stream.data + ctx->stream.len, \"init.m4v\") = 0;\n\n    fd = ngx_open_file(ctx->stream.data, NGX_FILE_RDWR, NGX_FILE_TRUNCATE,\n                       NGX_FILE_DEFAULT_ACCESS);\n\n    if (fd == NGX_INVALID_FILE) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"dash: error creating video init file\");\n        return NGX_ERROR;\n    }\n\n    b.start = buffer;\n    b.end = b.start + sizeof(buffer);\n    b.pos = b.last = b.start;\n\n    ngx_rtmp_mp4_write_ftyp(&b);\n    ngx_rtmp_mp4_write_moov(s, &b, NGX_RTMP_MP4_VIDEO_TRACK);\n\n    rc = ngx_write_fd(fd, b.start, (size_t) (b.last - b.start));\n    if (rc == NGX_ERROR) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"dash: writing video init failed\");\n    }\n\n    ngx_close_file(fd);\n\n    /* init audio */\n\n    *ngx_sprintf(ctx->stream.data + ctx->stream.len, \"init.m4a\") = 0;\n\n    fd = ngx_open_file(ctx->stream.data, NGX_FILE_RDWR, NGX_FILE_TRUNCATE,\n                       NGX_FILE_DEFAULT_ACCESS);\n\n    if (fd == NGX_INVALID_FILE) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"dash: error creating dash audio init file\");\n        return NGX_ERROR;\n    }\n\n    b.pos = b.last = b.start;\n\n    ngx_rtmp_mp4_write_ftyp(&b);\n    ngx_rtmp_mp4_write_moov(s, &b, NGX_RTMP_MP4_AUDIO_TRACK);\n\n    rc = ngx_write_fd(fd, b.start, (size_t) (b.last - b.start));\n    if (rc == NGX_ERROR) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"dash: writing audio init failed\");\n    }\n\n    ngx_close_file(fd);\n\n    return NGX_OK;\n}\n\n\nstatic void\nngx_rtmp_dash_close_fragment(ngx_rtmp_session_t *s, ngx_rtmp_dash_track_t *t)\n{\n    u_char                    *pos, *pos1;\n    size_t                     left;\n    ssize_t                    n;\n    ngx_fd_t                   fd;\n    ngx_buf_t                  b;\n    ngx_rtmp_dash_ctx_t       *ctx;\n    ngx_rtmp_dash_frag_t      *f;\n\n    static u_char              buffer[NGX_RTMP_DASH_BUFSIZE];\n\n    if (!t->opened) {\n        return;\n    }\n\n    ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"dash: close fragment id=%ui, type=%c, pts=%uD\",\n                   t->id, t->type, t->earliest_pres_time);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module);\n\n    b.start = buffer;\n    b.end = buffer + sizeof(buffer);\n    b.pos = b.last = b.start;\n\n    ngx_rtmp_mp4_write_styp(&b);\n\n    pos = b.last;\n    b.last += 44; /* leave room for sidx */\n\n    ngx_rtmp_mp4_write_moof(&b, t->earliest_pres_time, t->sample_count,\n                            t->samples, t->sample_mask, t->id);\n    pos1 = b.last;\n    b.last = pos;\n\n    ngx_rtmp_mp4_write_sidx(&b, t->mdat_size + 8 + (pos1 - (pos + 44)),\n                            t->earliest_pres_time, t->latest_pres_time);\n    b.last = pos1;\n    ngx_rtmp_mp4_write_mdat(&b, t->mdat_size + 8);\n\n    /* move the data down to make room for the headers */\n\n    f = ngx_rtmp_dash_get_frag(s, ctx->nfrags);\n\n    *ngx_sprintf(ctx->stream.data + ctx->stream.len, \"%uD.m4%c\",\n                 f->timestamp, t->type) = 0;\n\n    fd = ngx_open_file(ctx->stream.data, NGX_FILE_RDWR,\n                       NGX_FILE_TRUNCATE, NGX_FILE_DEFAULT_ACCESS);\n\n    if (fd == NGX_INVALID_FILE) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"dash: error creating dash temp video file\");\n        goto done;\n    }\n\n    if (ngx_write_fd(fd, b.pos, (size_t) (b.last - b.pos)) == NGX_ERROR) {\n        goto done;\n    }\n\n    left = (size_t) t->mdat_size;\n\n#if (NGX_WIN32)\n    if (SetFilePointer(t->fd, 0, 0, FILE_BEGIN) == INVALID_SET_FILE_POINTER) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"dash: SetFilePointer error\");\n        goto done;\n    }\n#else\n    if (lseek(t->fd, 0, SEEK_SET) == -1) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"dash: lseek error\");\n        goto done;\n    }\n#endif\n\n    while (left > 0) {\n\n        n = ngx_read_fd(t->fd, buffer, ngx_min(sizeof(buffer), left));\n        if (n == NGX_ERROR) {\n            break;\n        }\n\n        n = ngx_write_fd(fd, buffer, (size_t) n);\n        if (n == NGX_ERROR) {\n            break;\n        }\n\n        left -= n;\n    }\n\ndone:\n\n    if (fd != NGX_INVALID_FILE) {\n        ngx_close_file(fd);\n    }\n\n    ngx_close_file(t->fd);\n\n    t->fd = NGX_INVALID_FILE;\n    t->opened = 0;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_dash_close_fragments(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_dash_ctx_t  *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module);\n    if (ctx == NULL || !ctx->opened) {\n        return NGX_OK;\n    }\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"dash: close fragments\");\n\n    ngx_rtmp_dash_close_fragment(s, &ctx->video);\n    ngx_rtmp_dash_close_fragment(s, &ctx->audio);\n\n    ngx_rtmp_dash_next_frag(s);\n\n    ngx_rtmp_dash_write_playlist(s);\n\n    ctx->id++;\n    ctx->opened = 0;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_dash_open_fragment(ngx_rtmp_session_t *s, ngx_rtmp_dash_track_t *t,\n    ngx_uint_t id, char type)\n{\n    ngx_rtmp_dash_ctx_t   *ctx;\n\n    if (t->opened) {\n        return NGX_OK;\n    }\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"dash: open fragment id=%ui, type='%c'\", id, type);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module);\n\n    *ngx_sprintf(ctx->stream.data + ctx->stream.len, \"raw.m4%c\", type) = 0;\n\n    t->fd = ngx_open_file(ctx->stream.data, NGX_FILE_RDWR,\n                          NGX_FILE_TRUNCATE, NGX_FILE_DEFAULT_ACCESS);\n\n    if (t->fd == NGX_INVALID_FILE) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"dash: error creating fragment file\");\n        return NGX_ERROR;\n    }\n\n    t->id = id;\n    t->type = type;\n    t->sample_count = 0;\n    t->earliest_pres_time = 0;\n    t->latest_pres_time = 0;\n    t->mdat_size = 0;\n    t->opened = 1;\n\n    if (type == 'v') {\n        t->sample_mask = NGX_RTMP_MP4_SAMPLE_SIZE|\n                         NGX_RTMP_MP4_SAMPLE_DURATION|\n                         NGX_RTMP_MP4_SAMPLE_DELAY|\n                         NGX_RTMP_MP4_SAMPLE_KEY;\n    } else {\n        t->sample_mask = NGX_RTMP_MP4_SAMPLE_SIZE|\n                         NGX_RTMP_MP4_SAMPLE_DURATION;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_dash_open_fragments(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_dash_ctx_t  *ctx;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"dash: open fragments\");\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module);\n\n    if (ctx->opened) {\n        return NGX_OK;\n    }\n\n    ngx_rtmp_dash_open_fragment(s, &ctx->video, ctx->id, 'v');\n\n    ngx_rtmp_dash_open_fragment(s, &ctx->audio, ctx->id, 'a');\n\n    ctx->opened = 1;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_dash_ensure_directory(ngx_rtmp_session_t *s)\n{\n    size_t                     len;\n    ngx_file_info_t            fi;\n    ngx_rtmp_dash_ctx_t       *ctx;\n    ngx_rtmp_dash_app_conf_t  *dacf;\n\n    static u_char              path[NGX_MAX_PATH + 1];\n\n    dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module);\n\n    *ngx_snprintf(path, sizeof(path) - 1, \"%V\", &dacf->path) = 0;\n\n    if (ngx_file_info(path, &fi) == NGX_FILE_ERROR) {\n\n        if (ngx_errno != NGX_ENOENT) {\n            ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                          \"dash: \" ngx_file_info_n \" failed on '%V'\",\n                          &dacf->path);\n            return NGX_ERROR;\n        }\n\n        /* ENOENT */\n\n        if (ngx_create_dir(path, NGX_RTMP_DASH_DIR_ACCESS) == NGX_FILE_ERROR) {\n            ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                          \"dash: \" ngx_create_dir_n \" failed on '%V'\",\n                          &dacf->path);\n            return NGX_ERROR;\n        }\n\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"dash: directory '%V' created\", &dacf->path);\n\n    } else {\n\n        if (!ngx_is_dir(&fi)) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                          \"dash: '%V' exists and is not a directory\",\n                          &dacf->path);\n            return  NGX_ERROR;\n        }\n\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"dash: directory '%V' exists\", &dacf->path);\n    }\n\n    if (!dacf->nested) {\n        return NGX_OK;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module);\n\n    len = dacf->path.len;\n    if (dacf->path.data[len - 1] == '/') {\n        len--;\n    }\n\n    *ngx_snprintf(path, sizeof(path) - 1, \"%*s/%V\", len, dacf->path.data,\n                  &ctx->name) = 0;\n\n    if (ngx_file_info(path, &fi) != NGX_FILE_ERROR) {\n\n        if (ngx_is_dir(&fi)) {\n            ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                           \"dash: directory '%s' exists\", path);\n            return NGX_OK;\n        }\n\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"dash: '%s' exists and is not a directory\", path);\n\n        return  NGX_ERROR;\n    }\n\n    if (ngx_errno != NGX_ENOENT) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"dash: \" ngx_file_info_n \" failed on '%s'\", path);\n        return NGX_ERROR;\n    }\n\n    /* NGX_ENOENT */\n\n    if (ngx_create_dir(path, NGX_RTMP_DASH_DIR_ACCESS) == NGX_FILE_ERROR) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"dash: \" ngx_create_dir_n \" failed on '%s'\", path);\n        return NGX_ERROR;\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"dash: directory '%s' created\", path);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_dash_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v)\n{\n    u_char                    *p;\n    size_t                     len;\n    ngx_rtmp_dash_ctx_t       *ctx;\n    ngx_rtmp_dash_frag_t      *f;\n    ngx_rtmp_dash_app_conf_t  *dacf;\n\n    dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module);\n    if (dacf == NULL || !dacf->dash || dacf->path.len == 0) {\n        goto next;\n    }\n\n    if (s->interprocess) {\n        goto next;\n    }\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"dash: publish: name='%s' type='%s'\", v->name, v->type);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module);\n\n    if (ctx == NULL) {\n        ctx = ngx_pcalloc(s->pool, sizeof(ngx_rtmp_dash_ctx_t));\n        if (ctx == NULL) {\n            goto next;\n        }\n        ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_dash_module);\n\n    } else {\n        if (ctx->opened) {\n            goto next;\n        }\n\n        f = ctx->frags;\n        ngx_memzero(ctx, sizeof(ngx_rtmp_dash_ctx_t));\n        ctx->frags = f;\n    }\n\n    if (ctx->frags == NULL) {\n        ctx->frags = ngx_pcalloc(s->pool,\n                                 sizeof(ngx_rtmp_dash_frag_t) *\n                                 (dacf->winfrags * 2 + 1));\n        if (ctx->frags == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    ctx->id = 0;\n\n    if (ngx_strstr(v->name, \"..\")) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"dash: bad stream name: '%s'\", v->name);\n        return NGX_ERROR;\n    }\n\n    ctx->name.len = ngx_strlen(v->name);\n    ctx->name.data = ngx_palloc(s->pool, ctx->name.len + 1);\n\n    if (ctx->name.data == NULL) {\n        return NGX_ERROR;\n    }\n\n    *ngx_cpymem(ctx->name.data, v->name, ctx->name.len) = 0;\n\n    len = dacf->path.len + 1 + ctx->name.len + sizeof(\".mpd\");\n    if (dacf->nested) {\n        len += sizeof(\"/index\") - 1;\n    }\n\n    ctx->playlist.data = ngx_palloc(s->pool, len);\n    p = ngx_cpymem(ctx->playlist.data, dacf->path.data, dacf->path.len);\n\n    if (p[-1] != '/') {\n        *p++ = '/';\n    }\n\n    p = ngx_cpymem(p, ctx->name.data, ctx->name.len);\n\n    /*\n     * ctx->stream holds initial part of stream file path\n     * however the space for the whole stream path\n     * is allocated\n     */\n\n    ctx->stream.len = p - ctx->playlist.data + 1;\n    ctx->stream.data = ngx_palloc(s->pool,\n                                  ctx->stream.len + NGX_INT32_LEN +\n                                  sizeof(\".m4x\"));\n\n    ngx_memcpy(ctx->stream.data, ctx->playlist.data, ctx->stream.len - 1);\n    ctx->stream.data[ctx->stream.len - 1] = (dacf->nested ? '/' : '-');\n\n    if (dacf->nested) {\n        p = ngx_cpymem(p, \"/index.mpd\", sizeof(\"/index.mpd\") - 1);\n    } else {\n        p = ngx_cpymem(p, \".mpd\", sizeof(\".mpd\") - 1);\n    }\n\n    ctx->playlist.len = p - ctx->playlist.data;\n\n    *p = 0;\n\n    /* playlist bak (new playlist) path */\n\n    ctx->playlist_bak.data = ngx_palloc(s->pool,\n                                        ctx->playlist.len + sizeof(\".bak\"));\n    p = ngx_cpymem(ctx->playlist_bak.data, ctx->playlist.data,\n                   ctx->playlist.len);\n    p = ngx_cpymem(p, \".bak\", sizeof(\".bak\") - 1);\n\n    ctx->playlist_bak.len = p - ctx->playlist_bak.data;\n\n    *p = 0;\n\n    ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"dash: playlist='%V' playlist_bak='%V' stream_pattern='%V'\",\n                   &ctx->playlist, &ctx->playlist_bak, &ctx->stream);\n\n    ctx->start_time = ngx_time();\n\n    if (ngx_rtmp_dash_ensure_directory(s) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\nnext:\n    return next_publish(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_dash_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)\n{\n    ngx_rtmp_dash_ctx_t       *ctx;\n    ngx_rtmp_dash_app_conf_t  *dacf;\n\n    dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module);\n\n    if (dacf == NULL || !dacf->dash || ctx == NULL) {\n        goto next;\n    }\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"dash: delete stream\");\n\n    ngx_rtmp_dash_close_fragments(s);\n\nnext:\n    return next_close_stream(s, v);\n}\n\n\nstatic void\nngx_rtmp_dash_update_fragments(ngx_rtmp_session_t *s, ngx_int_t boundary,\n    uint32_t timestamp)\n{\n    int32_t                    d;\n    ngx_int_t                  hit;\n    ngx_rtmp_dash_ctx_t       *ctx;\n    ngx_rtmp_dash_frag_t      *f;\n    ngx_rtmp_dash_app_conf_t  *dacf;\n\n    dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module);\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module);\n    f = ngx_rtmp_dash_get_frag(s, ctx->nfrags);\n\n    d = (int32_t) (timestamp - f->timestamp);\n\n    if (d >= 0) {\n\n        f->duration = timestamp - f->timestamp;\n        hit = (f->duration >= dacf->fraglen);\n\n        /* keep fragment lengths within 2x factor for dash.js  */\n        if (f->duration >= dacf->fraglen * 2) {\n            boundary = 1;\n        }\n\n    } else {\n\n        /* sometimes clients generate slightly unordered frames */\n\n        hit = (-d > 1000);\n    }\n\n    if (ctx->has_video && !hit) {\n        boundary = 0;\n    }\n\n    if (!ctx->has_video && ctx->has_audio) {\n        boundary = hit;\n    }\n\n    if (ctx->audio.mdat_size >= NGX_RTMP_DASH_MAX_MDAT) {\n        boundary = 1;\n    }\n\n    if (ctx->video.mdat_size >= NGX_RTMP_DASH_MAX_MDAT) {\n        boundary = 1;\n    }\n\n    if (!ctx->opened) {\n        boundary = 1;\n    }\n\n    if (boundary) {\n        ngx_rtmp_dash_close_fragments(s);\n        ngx_rtmp_dash_open_fragments(s);\n\n        f = ngx_rtmp_dash_get_frag(s, ctx->nfrags);\n        f->timestamp = timestamp;\n    }\n}\n\n\nstatic ngx_int_t\nngx_rtmp_dash_append(ngx_rtmp_session_t *s, ngx_chain_t *in,\n    ngx_rtmp_dash_track_t *t, ngx_int_t key, uint32_t timestamp, uint32_t delay)\n{\n    u_char                 *p;\n    size_t                  size, bsize;\n    ngx_rtmp_mp4_sample_t  *smpl;\n\n    static u_char           buffer[NGX_RTMP_DASH_BUFSIZE];\n\n    p = buffer;\n    size = 0;\n\n    for (; in && size < sizeof(buffer); in = in->next) {\n\n        bsize = (size_t) (in->buf->last - in->buf->pos);\n        if (size + bsize > sizeof(buffer)) {\n            bsize = (size_t) (sizeof(buffer) - size);\n        }\n\n        p = ngx_cpymem(p, in->buf->pos, bsize);\n        size += bsize;\n    }\n\n    ngx_rtmp_dash_update_fragments(s, key, timestamp);\n\n    if (t->sample_count == 0) {\n        t->earliest_pres_time = timestamp;\n    }\n\n    t->latest_pres_time = timestamp;\n\n    if (t->sample_count < NGX_RTMP_DASH_MAX_SAMPLES) {\n\n        if (ngx_write_fd(t->fd, buffer, size) == NGX_ERROR) {\n            ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                          \"dash: \" ngx_write_fd_n \" failed\");\n            return NGX_ERROR;\n        }\n\n        smpl = &t->samples[t->sample_count];\n\n        smpl->delay = delay;\n        smpl->size = (uint32_t) size;\n        smpl->duration = 0;\n        smpl->timestamp = timestamp;\n        smpl->key = (key ? 1 : 0);\n\n        if (t->sample_count > 0) {\n            smpl = &t->samples[t->sample_count - 1];\n            smpl->duration = timestamp - smpl->timestamp;\n        }\n\n        t->sample_count++;\n        t->mdat_size += (ngx_uint_t) size;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_dash_audio(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n    ngx_chain_t *in)\n{\n    u_char                     htype;\n    ngx_rtmp_dash_ctx_t       *ctx;\n    ngx_rtmp_codec_ctx_t      *codec_ctx;\n    ngx_rtmp_dash_app_conf_t  *dacf;\n\n    dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module);\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module);\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    if (dacf == NULL || !dacf->dash || ctx == NULL ||\n        codec_ctx == NULL || h->mlen < 2)\n    {\n        return NGX_OK;\n    }\n\n    /* Only AAC is supported */\n\n    if (codec_ctx->audio_codec_id != NGX_RTMP_AUDIO_AAC ||\n        codec_ctx->aac_header == NULL)\n    {\n        return NGX_OK;\n    }\n\n    if (in->buf->last - in->buf->pos < 2) {\n        return NGX_ERROR;\n    }\n\n    /* skip AAC config */\n\n    htype = in->buf->pos[1];\n    if (htype != 1) {\n        return NGX_OK;\n    }\n\n    ctx->has_audio = 1;\n\n    /* skip RTMP & AAC headers */\n\n    in->buf->pos += 2;\n\n    return ngx_rtmp_dash_append(s, in, &ctx->audio, 0, h->timestamp, 0);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_dash_video(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n    ngx_chain_t *in)\n{\n    u_char                    *p;\n    uint8_t                    ftype, htype;\n    uint32_t                   delay;\n    ngx_rtmp_dash_ctx_t       *ctx;\n    ngx_rtmp_codec_ctx_t      *codec_ctx;\n    ngx_rtmp_dash_app_conf_t  *dacf;\n\n    dacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_dash_module);\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_dash_module);\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    if (dacf == NULL || !dacf->dash || ctx == NULL || codec_ctx == NULL ||\n        codec_ctx->avc_header == NULL || h->mlen < 5)\n    {\n        return NGX_OK;\n    }\n\n    /* Only H264 is supported */\n\n    if (codec_ctx->video_codec_id != NGX_RTMP_VIDEO_H264) {\n        return NGX_OK;\n    }\n\n    if (in->buf->last - in->buf->pos < 5) {\n        return NGX_ERROR;\n    }\n\n    ftype = (in->buf->pos[0] & 0xf0) >> 4;\n\n    /* skip AVC config */\n\n    htype = in->buf->pos[1];\n    if (htype != 1) {\n        return NGX_OK;\n    }\n\n    p = (u_char *) &delay;\n\n    p[0] = in->buf->pos[4];\n    p[1] = in->buf->pos[3];\n    p[2] = in->buf->pos[2];\n    p[3] = 0;\n\n    ctx->has_video = 1;\n\n    /* skip RTMP & H264 headers */\n\n    in->buf->pos += 5;\n\n    return ngx_rtmp_dash_append(s, in, &ctx->video, ftype == 1, h->timestamp,\n                                delay);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_dash_stream_begin(ngx_rtmp_session_t *s, ngx_rtmp_stream_begin_t *v)\n{\n    return next_stream_begin(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_dash_stream_eof(ngx_rtmp_session_t *s, ngx_rtmp_stream_eof_t *v)\n{\n    ngx_rtmp_dash_close_fragments(s);\n\n    return next_stream_eof(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_dash_cleanup_dir(ngx_str_t *ppath, ngx_msec_t playlen)\n{\n    time_t           mtime, max_age;\n    u_char          *p;\n    u_char           path[NGX_MAX_PATH + 1], mpd_path[NGX_MAX_PATH + 1];\n    ngx_dir_t        dir;\n    ngx_err_t        err;\n    ngx_str_t        name, spath, mpd;\n    ngx_int_t        nentries, nerased;\n    ngx_file_info_t  fi;\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0,\n                   \"dash: cleanup path='%V' playlen=%M\", ppath, playlen);\n\n    if (ngx_open_dir(ppath, &dir) != NGX_OK) {\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, ngx_errno,\n                       \"dash: cleanup open dir failed '%V'\", ppath);\n        return NGX_ERROR;\n    }\n\n    nentries = 0;\n    nerased = 0;\n\n    for ( ;; ) {\n        ngx_set_errno(0);\n\n        if (ngx_read_dir(&dir) == NGX_ERROR) {\n            err = ngx_errno;\n\n            if (ngx_close_dir(&dir) == NGX_ERROR) {\n                ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, ngx_errno,\n                              \"dash: cleanup \" ngx_close_dir_n \" \\\"%V\\\" failed\",\n                              ppath);\n            }\n\n            if (err == NGX_ENOMOREFILES) {\n                return nentries - nerased;\n            }\n\n            ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, err,\n                          \"dash: cleanup \" ngx_read_dir_n\n                          \" '%V' failed\", ppath);\n            return NGX_ERROR;\n        }\n\n        name.data = ngx_de_name(&dir);\n        if (name.data[0] == '.') {\n            continue;\n        }\n\n        name.len = ngx_de_namelen(&dir);\n\n        p = ngx_snprintf(path, sizeof(path) - 1, \"%V/%V\", ppath, &name);\n        *p = 0;\n\n        spath.data = path;\n        spath.len = p - path;\n\n        nentries++;\n\n        if (!dir.valid_info && ngx_de_info(path, &dir) == NGX_FILE_ERROR) {\n            ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, ngx_errno,\n                          \"dash: cleanup \" ngx_de_info_n \" \\\"%V\\\" failed\",\n                          &spath);\n\n            continue;\n        }\n\n        if (ngx_de_is_dir(&dir)) {\n\n            if (ngx_rtmp_dash_cleanup_dir(&spath, playlen) == 0) {\n                ngx_log_debug1(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0,\n                               \"dash: cleanup dir '%V'\", &name);\n\n                /*\n                 * null-termination gets spoiled in win32\n                 * version of ngx_open_dir\n                 */\n\n                *p = 0;\n\n                if (ngx_delete_dir(path) == NGX_FILE_ERROR) {\n                    ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, ngx_errno,\n                                  \"dash: cleanup \" ngx_delete_dir_n\n                                  \" failed on '%V'\", &spath);\n                } else {\n                    nerased++;\n                }\n            }\n\n            continue;\n        }\n\n        if (!ngx_de_is_file(&dir)) {\n            continue;\n        }\n\n        if (name.len >= 8 && name.data[name.len - 8] == 'i' &&\n                             name.data[name.len - 7] == 'n' &&\n                             name.data[name.len - 6] == 'i' &&\n                             name.data[name.len - 5] == 't' &&\n                             name.data[name.len - 4] == '.' &&\n                             name.data[name.len - 3] == 'm' &&\n                             name.data[name.len - 2] == '4')\n        {\n            if (name.len == 8) {\n                ngx_str_set(&mpd, \"index\");\n            } else {\n                mpd.data = name.data;\n                mpd.len = name.len - 9;\n            }\n\n            p = ngx_snprintf(mpd_path, sizeof(mpd_path) - 1, \"%V/%V.mpd\",\n                             ppath, &mpd);\n            *p = 0;\n\n            if (ngx_file_info(mpd_path, &fi) != NGX_FILE_ERROR) {\n                ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0,\n                               \"dash: cleanup '%V' delayed, mpd exists '%s'\",\n                               &name, mpd_path);\n                continue;\n            }\n\n            ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0,\n                           \"dash: cleanup '%V' allowed, mpd missing '%s'\",\n                           &name, mpd_path);\n\n            max_age = 0;\n\n        } else if (name.len >= 4 && name.data[name.len - 4] == '.' &&\n                                    name.data[name.len - 3] == 'm' &&\n                                    name.data[name.len - 2] == '4' &&\n                                    name.data[name.len - 1] == 'v')\n        {\n            max_age = playlen / 500;\n\n        } else if (name.len >= 4 && name.data[name.len - 4] == '.' &&\n                                    name.data[name.len - 3] == 'm' &&\n                                    name.data[name.len - 2] == '4' &&\n                                    name.data[name.len - 1] == 'a')\n        {\n            max_age = playlen / 500;\n\n        } else if (name.len >= 4 && name.data[name.len - 4] == '.' &&\n                                    name.data[name.len - 3] == 'm' &&\n                                    name.data[name.len - 2] == 'p' &&\n                                    name.data[name.len - 1] == 'd')\n        {\n            max_age = playlen / 500;\n\n        } else if (name.len >= 4 && name.data[name.len - 4] == '.' &&\n                                    name.data[name.len - 3] == 'r' &&\n                                    name.data[name.len - 2] == 'a' &&\n                                    name.data[name.len - 1] == 'w')\n        {\n            max_age = playlen / 1000;\n\n        } else {\n            ngx_log_debug1(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0,\n                           \"dash: cleanup skip unknown file type '%V'\", &name);\n            continue;\n        }\n\n        mtime = ngx_de_mtime(&dir);\n        if (mtime + max_age > ngx_cached_time->sec) {\n            continue;\n        }\n\n        ngx_log_debug3(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0,\n                       \"dash: cleanup '%V' mtime=%T age=%T\",\n                       &name, mtime, ngx_cached_time->sec - mtime);\n\n        if (ngx_delete_file(path) == NGX_FILE_ERROR) {\n            ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, ngx_errno,\n                          \"dash: cleanup \" ngx_delete_file_n \" failed on '%V'\",\n                          &spath);\n            continue;\n        }\n\n        nerased++;\n    }\n}\n\n\n#if (nginx_version >= 1011005)\nstatic ngx_msec_t\n#else\nstatic time_t\n#endif\nngx_rtmp_dash_cleanup(void *data)\n{\n    ngx_rtmp_dash_cleanup_t *cleanup = data;\n\n    ngx_rtmp_dash_cleanup_dir(&cleanup->path, cleanup->playlen);\n\n#if (nginx_version >= 1011005)\n    return cleanup->playlen * 2;\n#else\n    return cleanup->playlen / 500;\n#endif\n}\n\n\nstatic void *\nngx_rtmp_dash_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_dash_app_conf_t *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_dash_app_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->dash = NGX_CONF_UNSET;\n    conf->fraglen = NGX_CONF_UNSET_MSEC;\n    conf->playlen = NGX_CONF_UNSET_MSEC;\n    conf->cleanup = NGX_CONF_UNSET;\n    conf->nested = NGX_CONF_UNSET;\n\n    return conf;\n}\n\n\nstatic char *\nngx_rtmp_dash_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_rtmp_dash_app_conf_t    *prev = parent;\n    ngx_rtmp_dash_app_conf_t    *conf = child;\n    ngx_rtmp_dash_cleanup_t     *cleanup;\n\n    ngx_conf_merge_value(conf->dash, prev->dash, 0);\n    ngx_conf_merge_msec_value(conf->fraglen, prev->fraglen, 5000);\n    ngx_conf_merge_msec_value(conf->playlen, prev->playlen, 30000);\n    ngx_conf_merge_value(conf->cleanup, prev->cleanup, 1);\n    ngx_conf_merge_value(conf->nested, prev->nested, 0);\n\n    if (conf->fraglen) {\n        conf->winfrags = conf->playlen / conf->fraglen;\n    }\n\n    /* schedule cleanup */\n\n    if (conf->dash && conf->path.len && conf->cleanup) {\n        if (conf->path.data[conf->path.len - 1] == '/') {\n            conf->path.len--;\n        }\n\n        cleanup = ngx_pcalloc(cf->pool, sizeof(*cleanup));\n        if (cleanup == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n        cleanup->path = conf->path;\n        cleanup->playlen = conf->playlen;\n\n        conf->slot = ngx_pcalloc(cf->pool, sizeof(*conf->slot));\n        if (conf->slot == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n        conf->slot->manager = ngx_rtmp_dash_cleanup;\n        conf->slot->name = conf->path;\n        conf->slot->data = cleanup;\n        conf->slot->conf_file = cf->conf_file->file.name.data;\n        conf->slot->line = cf->conf_file->line;\n\n        if (ngx_add_path(cf, &conf->slot) != NGX_OK) {\n            return NGX_CONF_ERROR;\n        }\n    }\n\n    ngx_conf_merge_str_value(conf->path, prev->path, \"\");\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_dash_postconfiguration(ngx_conf_t *cf)\n{\n    ngx_rtmp_handler_pt        *h;\n    ngx_rtmp_core_main_conf_t  *cmcf;\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]);\n    *h = ngx_rtmp_dash_video;\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]);\n    *h = ngx_rtmp_dash_audio;\n\n    next_publish = ngx_rtmp_publish;\n    ngx_rtmp_publish = ngx_rtmp_dash_publish;\n\n    next_close_stream = ngx_rtmp_close_stream;\n    ngx_rtmp_close_stream = ngx_rtmp_dash_close_stream;\n\n    next_stream_begin = ngx_rtmp_stream_begin;\n    ngx_rtmp_stream_begin = ngx_rtmp_dash_stream_begin;\n\n    next_stream_eof = ngx_rtmp_stream_eof;\n    ngx_rtmp_stream_eof = ngx_rtmp_dash_stream_eof;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/dash/ngx_rtmp_mp4.c",
    "content": "\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp_mp4.h\"\n#include <ngx_rtmp_codec_module.h>\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_field_32(ngx_buf_t *b, uint32_t n)\n{\n    u_char  bytes[4];\n\n    bytes[0] = ((uint32_t) n >> 24) & 0xFF;\n    bytes[1] = ((uint32_t) n >> 16) & 0xFF;\n    bytes[2] = ((uint32_t) n >> 8) & 0xFF;\n    bytes[3] = (uint32_t) n & 0xFF;\n\n    if (b->last + sizeof(bytes) > b->end) {\n        return NGX_ERROR;\n    }\n\n    b->last = ngx_cpymem(b->last, bytes, sizeof(bytes));\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_field_24(ngx_buf_t *b, uint32_t n)\n{\n    u_char  bytes[3];\n\n    bytes[0] = ((uint32_t) n >> 16) & 0xFF;\n    bytes[1] = ((uint32_t) n >> 8) & 0xFF;\n    bytes[2] = (uint32_t) n & 0xFF;\n\n    if (b->last + sizeof(bytes) > b->end) {\n        return NGX_ERROR;\n    }\n\n    b->last = ngx_cpymem(b->last, bytes, sizeof(bytes));\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_field_16(ngx_buf_t *b, uint16_t n)\n{\n    u_char  bytes[2];\n\n    bytes[0] = ((uint32_t) n >> 8) & 0xFF;\n    bytes[1] = (uint32_t) n & 0xFF;\n\n    if (b->last + sizeof(bytes) > b->end) {\n        return NGX_ERROR;\n    }\n\n    b->last = ngx_cpymem(b->last, bytes, sizeof(bytes));\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_field_8(ngx_buf_t *b, uint8_t n)\n{\n    u_char  bytes[1];\n\n    bytes[0] = n & 0xFF;\n\n    if (b->last + sizeof(bytes) > b->end) {\n        return NGX_ERROR;\n    }\n\n    b->last = ngx_cpymem(b->last, bytes, sizeof(bytes));\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_put_descr(ngx_buf_t *b, int tag, size_t size)\n{\n    ngx_rtmp_mp4_field_8(b, (uint8_t) tag);\n    ngx_rtmp_mp4_field_8(b, size & 0x7F);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_data(ngx_buf_t *b, void *data, size_t n)\n{\n    if (b->last + n > b->end) {\n        return NGX_ERROR;\n    }\n\n    b->last = ngx_cpymem(b->last, (u_char *) data, n);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_box(ngx_buf_t *b, const char box[4])\n{\n    if (b->last + 4 > b->end) {\n        return NGX_ERROR;\n    }\n\n    b->last = ngx_cpymem(b->last, (u_char *) box, 4);\n\n    return NGX_OK;\n}\n\n\nstatic u_char *\nngx_rtmp_mp4_start_box(ngx_buf_t *b, const char box[4])\n{\n    u_char  *p;\n\n    p = b->last;\n\n    if (ngx_rtmp_mp4_field_32(b, 0) != NGX_OK) {\n        return NULL;\n    }\n\n    if (ngx_rtmp_mp4_box(b, box) != NGX_OK) {\n        return NULL;\n    }\n\n    return p;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_update_box_size(ngx_buf_t *b, u_char *p)\n{\n    u_char  *curpos;\n\n    if (p == NULL) {\n        return NGX_ERROR;\n    }\n\n    curpos = b->last;\n\n    b->last = p;\n\n    ngx_rtmp_mp4_field_32(b, (uint32_t) (curpos - p));\n\n    b->last = curpos;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_matrix(ngx_buf_t *buf, uint32_t a, uint32_t b, uint32_t c,\n    uint32_t d, uint32_t tx, uint32_t ty)\n{\n\n/*\n * transformation matrix\n * |a  b  u|\n * |c  d  v|\n * |tx ty w|\n */\n\n    ngx_rtmp_mp4_field_32(buf, a << 16);  /* 16.16 format */\n    ngx_rtmp_mp4_field_32(buf, b << 16);  /* 16.16 format */\n    ngx_rtmp_mp4_field_32(buf, 0);        /* u in 2.30 format */\n    ngx_rtmp_mp4_field_32(buf, c << 16);  /* 16.16 format */\n    ngx_rtmp_mp4_field_32(buf, d << 16);  /* 16.16 format */\n    ngx_rtmp_mp4_field_32(buf, 0);        /* v in 2.30 format */\n    ngx_rtmp_mp4_field_32(buf, tx << 16); /* 16.16 format */\n    ngx_rtmp_mp4_field_32(buf, ty << 16); /* 16.16 format */\n    ngx_rtmp_mp4_field_32(buf, 1 << 30);  /* w in 2.30 format */\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_mp4_write_ftyp(ngx_buf_t *b)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"ftyp\");\n\n    /* major brand */\n    ngx_rtmp_mp4_box(b, \"iso6\");\n\n    /* minor version */\n    ngx_rtmp_mp4_field_32(b, 1);\n\n    /* compatible brands */\n    ngx_rtmp_mp4_box(b, \"isom\");\n    ngx_rtmp_mp4_box(b, \"iso6\");\n    ngx_rtmp_mp4_box(b, \"dash\");\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_mp4_write_styp(ngx_buf_t *b)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"styp\");\n\n    /* major brand */\n    ngx_rtmp_mp4_box(b, \"iso6\");\n\n    /* minor version */\n    ngx_rtmp_mp4_field_32(b, 1);\n\n    /* compatible brands */\n    ngx_rtmp_mp4_box(b, \"isom\");\n    ngx_rtmp_mp4_box(b, \"iso6\");\n    ngx_rtmp_mp4_box(b, \"dash\");\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_mvhd(ngx_buf_t *b)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"mvhd\");\n\n    /* version */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* creation time */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* modification time */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* timescale */\n    ngx_rtmp_mp4_field_32(b, 1000);\n\n    /* duration */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* reserved */\n    ngx_rtmp_mp4_field_32(b, 0x00010000);\n    ngx_rtmp_mp4_field_16(b, 0x0100);\n    ngx_rtmp_mp4_field_16(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    ngx_rtmp_mp4_write_matrix(b, 1, 0, 0, 1, 0, 0);\n\n    /* reserved */\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* next track id */\n    ngx_rtmp_mp4_field_32(b, 1);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_tkhd(ngx_rtmp_session_t *s, ngx_buf_t *b,\n    ngx_rtmp_mp4_track_type_t ttype)\n{\n    u_char                *pos;\n    ngx_rtmp_codec_ctx_t  *codec_ctx;\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    pos = ngx_rtmp_mp4_start_box(b, \"tkhd\");\n\n    /* version */\n    ngx_rtmp_mp4_field_8(b, 0);\n\n    /* flags: TrackEnabled */\n    ngx_rtmp_mp4_field_24(b, 0x0000000f);\n\n    /* creation time */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* modification time */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* track id */\n    ngx_rtmp_mp4_field_32(b, 1);\n\n    /* reserved */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* duration */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* reserved */\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* reserved */\n    ngx_rtmp_mp4_field_16(b, ttype == NGX_RTMP_MP4_VIDEO_TRACK ?  0 : 0x0100);\n\n    /* reserved */\n    ngx_rtmp_mp4_field_16(b, 0);\n\n    ngx_rtmp_mp4_write_matrix(b, 1, 0, 0, 1, 0, 0);\n\n    if (ttype == NGX_RTMP_MP4_VIDEO_TRACK) {\n        ngx_rtmp_mp4_field_32(b, (uint32_t) codec_ctx->width << 16);\n        ngx_rtmp_mp4_field_32(b, (uint32_t) codec_ctx->height << 16);\n    } else {\n        ngx_rtmp_mp4_field_32(b, 0);\n        ngx_rtmp_mp4_field_32(b, 0);\n    }\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_mdhd(ngx_buf_t *b)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"mdhd\");\n\n    /* version */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* creation time */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* modification time */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* time scale*/\n    ngx_rtmp_mp4_field_32(b, 1000);\n\n    /* duration */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* lanuguage */\n    ngx_rtmp_mp4_field_16(b, 0x15C7);\n\n    /* reserved */\n    ngx_rtmp_mp4_field_16(b, 0);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_hdlr(ngx_buf_t *b, ngx_rtmp_mp4_track_type_t ttype)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"hdlr\");\n\n    /* version and flags */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* pre defined */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    if (ttype == NGX_RTMP_MP4_VIDEO_TRACK) {\n        ngx_rtmp_mp4_box(b, \"vide\");\n    } else {\n        ngx_rtmp_mp4_box(b, \"soun\");\n    }\n\n    /* reserved */\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    if (ttype == NGX_RTMP_MP4_VIDEO_TRACK) {\n        /* video handler string, NULL-terminated */\n        ngx_rtmp_mp4_data(b, \"VideoHandler\", sizeof(\"VideoHandler\"));\n    } else {\n        /* sound handler string, NULL-terminated */\n        ngx_rtmp_mp4_data(b, \"SoundHandler\", sizeof(\"SoundHandler\"));\n    }\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_vmhd(ngx_buf_t *b)\n{\n    /* size is always 20, apparently */\n    ngx_rtmp_mp4_field_32(b, 20);\n\n    ngx_rtmp_mp4_box(b, \"vmhd\");\n\n    /* version and flags */\n    ngx_rtmp_mp4_field_32(b, 0x01);\n\n    /* reserved (graphics mode=copy) */\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_smhd(ngx_buf_t *b)\n{\n    /* size is always 16, apparently */\n    ngx_rtmp_mp4_field_32(b, 16);\n\n    ngx_rtmp_mp4_box(b, \"smhd\");\n\n    /* version and flags */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* reserved (balance normally=0) */\n    ngx_rtmp_mp4_field_16(b, 0);\n    ngx_rtmp_mp4_field_16(b, 0);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_dref(ngx_buf_t *b)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"dref\");\n\n    /* version and flags */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* entry count */\n    ngx_rtmp_mp4_field_32(b, 1);\n\n    /* url size */\n    ngx_rtmp_mp4_field_32(b, 0xc);\n\n    ngx_rtmp_mp4_box(b, \"url \");\n\n    /* version and flags */\n    ngx_rtmp_mp4_field_32(b, 0x00000001);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_dinf(ngx_buf_t *b)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"dinf\");\n\n    ngx_rtmp_mp4_write_dref(b);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_avcc(ngx_rtmp_session_t *s, ngx_buf_t *b)\n{\n    u_char                *pos, *p;\n    ngx_chain_t           *in;\n    ngx_rtmp_codec_ctx_t  *codec_ctx;\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    if (codec_ctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    in = codec_ctx->avc_header->chain;\n    if (in == NULL) {\n        return NGX_ERROR;\n    }\n\n    pos = ngx_rtmp_mp4_start_box(b, \"avcC\");\n\n    /* assume config fits one chunk (highly probable) */\n\n    /*\n     * Skip:\n     * - flv fmt\n     * - H264 CONF/PICT (0x00)\n     * - 0\n     * - 0\n     * - 0\n     */\n\n    p = in->buf->pos + 5;\n\n    if (p < in->buf->last) {\n        ngx_rtmp_mp4_data(b, p, (size_t) (in->buf->last - p));\n    } else {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"dash: invalid avcc received\");\n    }\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_video(ngx_rtmp_session_t *s, ngx_buf_t *b)\n{\n    u_char                *pos;\n    ngx_rtmp_codec_ctx_t  *codec_ctx;\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    pos = ngx_rtmp_mp4_start_box(b, \"avc1\");\n\n    /* reserved */\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_16(b, 0);\n\n    /* data reference index */\n    ngx_rtmp_mp4_field_16(b, 1);\n\n    /* codec stream version & revision */\n    ngx_rtmp_mp4_field_16(b, 0);\n    ngx_rtmp_mp4_field_16(b, 0);\n\n    /* reserved */\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* width & height */\n    ngx_rtmp_mp4_field_16(b, (uint16_t) codec_ctx->width);\n    ngx_rtmp_mp4_field_16(b, (uint16_t) codec_ctx->height);\n\n    /* horizontal & vertical resolutions 72 dpi */\n    ngx_rtmp_mp4_field_32(b, 0x00480000);\n    ngx_rtmp_mp4_field_32(b, 0x00480000);\n\n    /* data size */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* frame count */\n    ngx_rtmp_mp4_field_16(b, 1);\n\n    /* compressor name */\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* reserved */\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_16(b, 0x18);\n    ngx_rtmp_mp4_field_16(b, 0xffff);\n\n    ngx_rtmp_mp4_write_avcc(s, b);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_esds(ngx_rtmp_session_t *s, ngx_buf_t *b)\n{\n    size_t                 dsi_len;\n    u_char                *pos, *dsi;\n    ngx_buf_t             *db;\n    ngx_rtmp_codec_ctx_t  *codec_ctx;\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    if (codec_ctx == NULL || codec_ctx->aac_header == NULL) {\n        return NGX_ERROR;\n    }\n\n    db = codec_ctx->aac_header->chain->buf;\n    if (db == NULL) {\n        return NGX_ERROR;\n    }\n\n    dsi = db->pos + 2;\n    if (dsi > db->last) {\n        return NGX_ERROR;\n    }\n\n    dsi_len = db->last - dsi;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"esds\");\n\n    /* version */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n\n    /* ES Descriptor */\n\n    ngx_rtmp_mp4_put_descr(b, 0x03, 23 + dsi_len);\n\n    /* ES_ID */\n    ngx_rtmp_mp4_field_16(b, 1);\n\n    /* flags */\n    ngx_rtmp_mp4_field_8(b, 0);\n\n\n    /* DecoderConfig Descriptor */\n\n    ngx_rtmp_mp4_put_descr(b, 0x04, 15 + dsi_len);\n\n    /* objectTypeIndication: Audio ISO/IEC 14496-3 (AAC) */\n    ngx_rtmp_mp4_field_8(b, 0x40);\n\n    /* streamType: AudioStream */\n    ngx_rtmp_mp4_field_8(b, 0x15);\n\n    /* bufferSizeDB */\n    ngx_rtmp_mp4_field_24(b, 0);\n\n    /* maxBitrate */\n    ngx_rtmp_mp4_field_32(b, 0x0001F151);\n\n    /* avgBitrate */\n    ngx_rtmp_mp4_field_32(b, 0x0001F14D);\n\n\n    /* DecoderSpecificInfo Descriptor */\n\n    ngx_rtmp_mp4_put_descr(b, 0x05, dsi_len);\n    ngx_rtmp_mp4_data(b, dsi, dsi_len);\n\n\n    /* SL Descriptor */\n\n    ngx_rtmp_mp4_put_descr(b, 0x06, 1);\n    ngx_rtmp_mp4_field_8(b, 0x02);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_audio(ngx_rtmp_session_t *s, ngx_buf_t *b)\n{\n    u_char                *pos;\n    ngx_rtmp_codec_ctx_t  *codec_ctx;\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    pos = ngx_rtmp_mp4_start_box(b, \"mp4a\");\n\n    /* reserved */\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_16(b, 0);\n\n    /* data reference index */\n    ngx_rtmp_mp4_field_16(b, 1);\n\n    /* reserved */\n    ngx_rtmp_mp4_field_32(b, 0);\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* channel count */\n    ngx_rtmp_mp4_field_16(b, (uint16_t) codec_ctx->audio_channels);\n\n    /* sample size */\n    ngx_rtmp_mp4_field_16(b, (uint16_t) (codec_ctx->sample_size * 8));\n\n    /* reserved */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* time scale */\n    ngx_rtmp_mp4_field_16(b, 1000);\n\n    /* sample rate */\n    ngx_rtmp_mp4_field_16(b, (uint16_t) codec_ctx->sample_rate);\n\n    ngx_rtmp_mp4_write_esds(s, b);\n#if 0\n    /* tag size*/\n    ngx_rtmp_mp4_field_32(b, 8);\n\n    /* null tag */\n    ngx_rtmp_mp4_field_32(b, 0);\n#endif\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_stsd(ngx_rtmp_session_t *s, ngx_buf_t *b,\n    ngx_rtmp_mp4_track_type_t ttype)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"stsd\");\n\n    /* version & flags */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* entry count */\n    ngx_rtmp_mp4_field_32(b, 1);\n\n    if (ttype == NGX_RTMP_MP4_VIDEO_TRACK) {\n        ngx_rtmp_mp4_write_video(s, b);\n    } else {\n        ngx_rtmp_mp4_write_audio(s, b);\n    }\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_stts(ngx_buf_t *b)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"stts\");\n\n    ngx_rtmp_mp4_field_32(b, 0); /* version */\n    ngx_rtmp_mp4_field_32(b, 0); /* entry count */\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_stsc(ngx_buf_t *b)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"stsc\");\n\n    ngx_rtmp_mp4_field_32(b, 0); /* version */\n    ngx_rtmp_mp4_field_32(b, 0); /* entry count */\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_stsz(ngx_buf_t *b)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"stsz\");\n\n    ngx_rtmp_mp4_field_32(b, 0); /* version */\n    ngx_rtmp_mp4_field_32(b, 0); /* entry count */\n    ngx_rtmp_mp4_field_32(b, 0); /* moar zeros */\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_stco(ngx_buf_t *b)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"stco\");\n\n    ngx_rtmp_mp4_field_32(b, 0); /* version */\n    ngx_rtmp_mp4_field_32(b, 0); /* entry count */\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_stbl(ngx_rtmp_session_t *s, ngx_buf_t *b,\n    ngx_rtmp_mp4_track_type_t ttype)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"stbl\");\n\n    ngx_rtmp_mp4_write_stsd(s, b, ttype);\n    ngx_rtmp_mp4_write_stts(b);\n    ngx_rtmp_mp4_write_stsc(b);\n    ngx_rtmp_mp4_write_stsz(b);\n    ngx_rtmp_mp4_write_stco(b);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_minf(ngx_rtmp_session_t *s, ngx_buf_t *b,\n    ngx_rtmp_mp4_track_type_t ttype)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"minf\");\n\n    if (ttype == NGX_RTMP_MP4_VIDEO_TRACK) {\n        ngx_rtmp_mp4_write_vmhd(b);\n    } else {\n        ngx_rtmp_mp4_write_smhd(b);\n    }\n\n    ngx_rtmp_mp4_write_dinf(b);\n    ngx_rtmp_mp4_write_stbl(s, b, ttype);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_mdia(ngx_rtmp_session_t *s, ngx_buf_t *b,\n    ngx_rtmp_mp4_track_type_t ttype)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"mdia\");\n\n    ngx_rtmp_mp4_write_mdhd(b);\n    ngx_rtmp_mp4_write_hdlr(b, ttype);\n    ngx_rtmp_mp4_write_minf(s, b, ttype);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_trak(ngx_rtmp_session_t *s, ngx_buf_t *b,\n    ngx_rtmp_mp4_track_type_t ttype)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"trak\");\n\n    ngx_rtmp_mp4_write_tkhd(s, b, ttype);\n    ngx_rtmp_mp4_write_mdia(s, b, ttype);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_mvex(ngx_buf_t *b)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"mvex\");\n\n    ngx_rtmp_mp4_field_32(b, 0x20);\n\n    ngx_rtmp_mp4_box(b, \"trex\");\n\n    /* version & flags */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* track id */\n    ngx_rtmp_mp4_field_32(b, 1);\n\n    /* default sample description index */\n    ngx_rtmp_mp4_field_32(b, 1);\n\n    /* default sample duration */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* default sample size, 1024 for AAC */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* default sample flags, key on */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_mp4_write_moov(ngx_rtmp_session_t *s, ngx_buf_t *b,\n    ngx_rtmp_mp4_track_type_t ttype)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"moov\");\n\n    ngx_rtmp_mp4_write_mvhd(b);\n    ngx_rtmp_mp4_write_mvex(b);\n    ngx_rtmp_mp4_write_trak(s, b, ttype);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_tfhd(ngx_buf_t *b)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"tfhd\");\n\n    /* version & flags */\n    ngx_rtmp_mp4_field_32(b, 0x00020000);\n\n    /* track id */\n    ngx_rtmp_mp4_field_32(b, 1);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_tfdt(ngx_buf_t *b, uint32_t earliest_pres_time)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"tfdt\");\n\n    /* version == 1 aka 64 bit integer */\n    ngx_rtmp_mp4_field_32(b, 0x00000000);\n    ngx_rtmp_mp4_field_32(b, earliest_pres_time);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_trun(ngx_buf_t *b, uint32_t sample_count,\n    ngx_rtmp_mp4_sample_t *samples, ngx_uint_t sample_mask, u_char *moof_pos)\n{\n    u_char    *pos;\n    uint32_t   i, offset, nitems, flags;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"trun\");\n\n    nitems = 0;\n\n    /* data offset present */\n    flags = 0x01;\n\n    if (sample_mask & NGX_RTMP_MP4_SAMPLE_DURATION) {\n        nitems++;\n        flags |= 0x000100;\n    }\n\n    if (sample_mask & NGX_RTMP_MP4_SAMPLE_SIZE) {\n        nitems++;\n        flags |= 0x000200;\n    }\n\n    if (sample_mask & NGX_RTMP_MP4_SAMPLE_KEY) {\n        nitems++;\n        flags |= 0x000400;\n    }\n\n    if (sample_mask & NGX_RTMP_MP4_SAMPLE_DELAY) {\n        nitems++;\n        flags |= 0x000800;\n    }\n\n    offset = (pos - moof_pos) + 20 + (sample_count * nitems * 4) + 8;\n\n    ngx_rtmp_mp4_field_32(b, flags);\n    ngx_rtmp_mp4_field_32(b, sample_count);\n    ngx_rtmp_mp4_field_32(b, offset);\n\n    for (i = 0; i < sample_count; i++, samples++) {\n\n        if (sample_mask & NGX_RTMP_MP4_SAMPLE_DURATION) {\n            ngx_rtmp_mp4_field_32(b, samples->duration);\n        }\n\n        if (sample_mask & NGX_RTMP_MP4_SAMPLE_SIZE) {\n            ngx_rtmp_mp4_field_32(b, samples->size);\n        }\n\n        if (sample_mask & NGX_RTMP_MP4_SAMPLE_KEY) {\n            ngx_rtmp_mp4_field_32(b, samples->key ? 0x00000000 : 0x00010000);\n        }\n\n        if (sample_mask & NGX_RTMP_MP4_SAMPLE_DELAY) {\n            ngx_rtmp_mp4_field_32(b, samples->delay);\n        }\n    }\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_traf(ngx_buf_t *b, uint32_t earliest_pres_time,\n    uint32_t sample_count, ngx_rtmp_mp4_sample_t *samples,\n    ngx_uint_t sample_mask, u_char *moof_pos)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"traf\");\n\n    ngx_rtmp_mp4_write_tfhd(b);\n    ngx_rtmp_mp4_write_tfdt(b, earliest_pres_time);\n    ngx_rtmp_mp4_write_trun(b, sample_count, samples, sample_mask, moof_pos);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mp4_write_mfhd(ngx_buf_t *b, uint32_t index)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"mfhd\");\n\n    /* don't know what this is */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* fragment index. */\n    ngx_rtmp_mp4_field_32(b, index);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_mp4_write_sidx(ngx_buf_t *b, ngx_uint_t reference_size,\n    uint32_t earliest_pres_time, uint32_t latest_pres_time)\n{\n    u_char    *pos;\n    uint32_t   duration;\n\n    duration = latest_pres_time - earliest_pres_time;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"sidx\");\n\n    /* version */\n    ngx_rtmp_mp4_field_32(b, 0);\n\n    /* reference id */\n    ngx_rtmp_mp4_field_32(b, 1);\n\n    /* timescale */\n    ngx_rtmp_mp4_field_32(b, 1000);\n\n    /* earliest presentation time */\n    ngx_rtmp_mp4_field_32(b, earliest_pres_time);\n\n    /* first offset */\n    ngx_rtmp_mp4_field_32(b, duration); /*TODO*/\n\n    /* reserved */\n    ngx_rtmp_mp4_field_16(b, 0);\n\n    /* reference count = 1 */\n    ngx_rtmp_mp4_field_16(b, 1);\n\n    /* 1st bit is reference type, the rest is reference size */\n    ngx_rtmp_mp4_field_32(b, reference_size);\n\n    /* subsegment duration */\n    ngx_rtmp_mp4_field_32(b, duration);\n\n    /* first bit is startsWithSAP (=1), next 3 bits are SAP type (=001) */\n    ngx_rtmp_mp4_field_8(b, 0x90);\n\n    /* SAP delta time */\n    ngx_rtmp_mp4_field_24(b, 0);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_mp4_write_moof(ngx_buf_t *b, uint32_t earliest_pres_time,\n    uint32_t sample_count, ngx_rtmp_mp4_sample_t *samples,\n    ngx_uint_t sample_mask, uint32_t index)\n{\n    u_char  *pos;\n\n    pos = ngx_rtmp_mp4_start_box(b, \"moof\");\n\n    ngx_rtmp_mp4_write_mfhd(b, index);\n    ngx_rtmp_mp4_write_traf(b, earliest_pres_time, sample_count, samples,\n                            sample_mask, pos);\n\n    ngx_rtmp_mp4_update_box_size(b, pos);\n\n    return NGX_OK;\n}\n\n\nngx_uint_t\nngx_rtmp_mp4_write_mdat(ngx_buf_t *b, ngx_uint_t size)\n{\n    ngx_rtmp_mp4_field_32(b, size);\n\n    ngx_rtmp_mp4_box(b, \"mdat\");\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/dash/ngx_rtmp_mp4.h",
    "content": "\n\n#ifndef _NGX_RTMP_MP4_H_INCLUDED_\n#define _NGX_RTMP_MP4_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_rtmp.h>\n\n\n#define NGX_RTMP_MP4_SAMPLE_SIZE        0x01\n#define NGX_RTMP_MP4_SAMPLE_DURATION    0x02\n#define NGX_RTMP_MP4_SAMPLE_DELAY       0x04\n#define NGX_RTMP_MP4_SAMPLE_KEY         0x08\n\n\ntypedef struct {\n    uint32_t        size;\n    uint32_t        duration;\n    uint32_t        delay;\n    uint32_t        timestamp;\n    unsigned        key:1;\n} ngx_rtmp_mp4_sample_t;\n\n\ntypedef enum {\n    NGX_RTMP_MP4_FILETYPE_INIT,\n    NGX_RTMP_MP4_FILETYPE_SEG\n} ngx_rtmp_mp4_file_type_t;\n\n\ntypedef enum {\n    NGX_RTMP_MP4_VIDEO_TRACK,\n    NGX_RTMP_MP4_AUDIO_TRACK\n} ngx_rtmp_mp4_track_type_t;\n\n\nngx_int_t ngx_rtmp_mp4_write_ftyp(ngx_buf_t *b);\nngx_int_t ngx_rtmp_mp4_write_styp(ngx_buf_t *b);\nngx_int_t ngx_rtmp_mp4_write_moov(ngx_rtmp_session_t *s, ngx_buf_t *b,\n    ngx_rtmp_mp4_track_type_t ttype);\nngx_int_t ngx_rtmp_mp4_write_moof(ngx_buf_t *b, uint32_t earliest_pres_time,\n    uint32_t sample_count, ngx_rtmp_mp4_sample_t *samples,\n    ngx_uint_t sample_mask, uint32_t index);\nngx_int_t ngx_rtmp_mp4_write_sidx(ngx_buf_t *b,\n    ngx_uint_t reference_size, uint32_t earliest_pres_time,\n    uint32_t latest_pres_time);\nngx_uint_t ngx_rtmp_mp4_write_mdat(ngx_buf_t *b, ngx_uint_t size);\n\n\n#endif /* _NGX_RTMP_MP4_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/hls/ngx_rtmp_hls_module.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_rtmp.h>\n#include <ngx_rtmp_cmd_module.h>\n#include <ngx_rtmp_codec_module.h>\n#include \"ngx_rtmp_mpegts.h\"\n\n\nstatic ngx_rtmp_publish_pt              next_publish;\nstatic ngx_rtmp_close_stream_pt         next_close_stream;\nstatic ngx_rtmp_stream_begin_pt         next_stream_begin;\nstatic ngx_rtmp_stream_eof_pt           next_stream_eof;\n\n\nstatic char * ngx_rtmp_hls_variant(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\nstatic ngx_int_t ngx_rtmp_hls_postconfiguration(ngx_conf_t *cf);\nstatic void * ngx_rtmp_hls_create_app_conf(ngx_conf_t *cf);\nstatic char * ngx_rtmp_hls_merge_app_conf(ngx_conf_t *cf,\n       void *parent, void *child);\nstatic ngx_int_t ngx_rtmp_hls_flush_audio(ngx_rtmp_session_t *s);\nstatic ngx_int_t ngx_rtmp_hls_ensure_directory(ngx_rtmp_session_t *s,\n       ngx_str_t *path);\n\n\n#define NGX_RTMP_HLS_BUFSIZE            (1024*1024)\n#define NGX_RTMP_HLS_DIR_ACCESS         0744\n\n\ntypedef struct {\n    uint64_t                            id;\n    uint64_t                            key_id;\n    double                              duration;\n    unsigned                            active:1;\n    unsigned                            discont:1; /* before */\n} ngx_rtmp_hls_frag_t;\n\n\ntypedef struct {\n    ngx_str_t                           suffix;\n    ngx_array_t                         args;\n} ngx_rtmp_hls_variant_t;\n\n\ntypedef struct {\n    unsigned                            opened:1;\n\n    ngx_rtmp_mpegts_file_t              file;\n\n    ngx_str_t                           playlist;\n    ngx_str_t                           playlist_bak;\n    ngx_str_t                           var_playlist;\n    ngx_str_t                           var_playlist_bak;\n    ngx_str_t                           stream;\n    ngx_str_t                           keyfile;\n    ngx_str_t                           name;\n    u_char                              key[16];\n\n    uint64_t                            frag;\n    uint64_t                            frag_ts;\n    uint64_t                            key_id;\n    ngx_uint_t                          nfrags;\n    ngx_rtmp_hls_frag_t                *frags; /* circular 2 * winfrags + 1 */\n\n    ngx_uint_t                          audio_cc;\n    ngx_uint_t                          video_cc;\n    ngx_uint_t                          key_frags;\n\n    uint64_t                            aframe_base;\n    uint64_t                            aframe_num;\n\n    ngx_buf_t                          *aframe;\n    uint64_t                            aframe_pts;\n\n    ngx_rtmp_hls_variant_t             *var;\n} ngx_rtmp_hls_ctx_t;\n\n\ntypedef struct {\n    ngx_str_t                           path;\n    ngx_msec_t                          playlen;\n    ngx_uint_t                          frags_per_key;\n} ngx_rtmp_hls_cleanup_t;\n\n\ntypedef struct {\n    ngx_flag_t                          hls;\n    ngx_msec_t                          fraglen;\n    ngx_msec_t                          max_fraglen;\n    ngx_msec_t                          muxdelay;\n    ngx_msec_t                          sync;\n    ngx_msec_t                          playlen;\n    ngx_uint_t                          winfrags;\n    ngx_flag_t                          continuous;\n    ngx_flag_t                          nested;\n    ngx_str_t                           path;\n    ngx_uint_t                          naming;\n    ngx_uint_t                          slicing;\n    ngx_uint_t                          type;\n    ngx_path_t                         *slot;\n    ngx_msec_t                          max_audio_delay;\n    size_t                              audio_buffer_size;\n    ngx_flag_t                          cleanup;\n    ngx_array_t                        *variant;\n    ngx_str_t                           base_url;\n    ngx_int_t                           granularity;\n    ngx_flag_t                          keys;\n    ngx_str_t                           key_path;\n    ngx_str_t                           key_url;\n    ngx_uint_t                          frags_per_key;\n} ngx_rtmp_hls_app_conf_t;\n\n\n#define NGX_RTMP_HLS_NAMING_SEQUENTIAL  1\n#define NGX_RTMP_HLS_NAMING_TIMESTAMP   2\n#define NGX_RTMP_HLS_NAMING_SYSTEM      3\n\n\n#define NGX_RTMP_HLS_SLICING_PLAIN      1\n#define NGX_RTMP_HLS_SLICING_ALIGNED    2\n\n\n#define NGX_RTMP_HLS_TYPE_LIVE          1\n#define NGX_RTMP_HLS_TYPE_EVENT         2\n\n\nstatic ngx_conf_enum_t                  ngx_rtmp_hls_naming_slots[] = {\n    { ngx_string(\"sequential\"),         NGX_RTMP_HLS_NAMING_SEQUENTIAL },\n    { ngx_string(\"timestamp\"),          NGX_RTMP_HLS_NAMING_TIMESTAMP  },\n    { ngx_string(\"system\"),             NGX_RTMP_HLS_NAMING_SYSTEM     },\n    { ngx_null_string,                  0 }\n};\n\n\nstatic ngx_conf_enum_t                  ngx_rtmp_hls_slicing_slots[] = {\n    { ngx_string(\"plain\"),              NGX_RTMP_HLS_SLICING_PLAIN },\n    { ngx_string(\"aligned\"),            NGX_RTMP_HLS_SLICING_ALIGNED  },\n    { ngx_null_string,                  0 }\n};\n\n\nstatic ngx_conf_enum_t                  ngx_rtmp_hls_type_slots[] = {\n    { ngx_string(\"live\"),               NGX_RTMP_HLS_TYPE_LIVE  },\n    { ngx_string(\"event\"),              NGX_RTMP_HLS_TYPE_EVENT },\n    { ngx_null_string,                  0 }\n};\n\n\nstatic ngx_command_t ngx_rtmp_hls_commands[] = {\n\n    { ngx_string(\"hls\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, hls),\n      NULL },\n\n    { ngx_string(\"hls_fragment\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, fraglen),\n      NULL },\n\n    { ngx_string(\"hls_max_fragment\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, max_fraglen),\n      NULL },\n\n    { ngx_string(\"hls_path\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_str_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, path),\n      NULL },\n\n    { ngx_string(\"hls_playlist_length\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, playlen),\n      NULL },\n\n    { ngx_string(\"hls_muxdelay\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, muxdelay),\n      NULL },\n\n    { ngx_string(\"hls_sync\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, sync),\n      NULL },\n\n    { ngx_string(\"hls_continuous\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, continuous),\n      NULL },\n\n    { ngx_string(\"hls_nested\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, nested),\n      NULL },\n\n    { ngx_string(\"hls_fragment_naming\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_enum_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, naming),\n      &ngx_rtmp_hls_naming_slots },\n\n    { ngx_string(\"hls_fragment_slicing\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_enum_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, slicing),\n      &ngx_rtmp_hls_slicing_slots },\n\n    { ngx_string(\"hls_type\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_enum_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, type),\n      &ngx_rtmp_hls_type_slots },\n\n    { ngx_string(\"hls_max_audio_delay\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, max_audio_delay),\n      NULL },\n\n    { ngx_string(\"hls_audio_buffer_size\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_size_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, audio_buffer_size),\n      NULL },\n\n    { ngx_string(\"hls_cleanup\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, cleanup),\n      NULL },\n\n    { ngx_string(\"hls_variant\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_hls_variant,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"hls_base_url\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_str_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, base_url),\n      NULL },\n\n    { ngx_string(\"hls_fragment_naming_granularity\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, granularity),\n      NULL },\n\n    { ngx_string(\"hls_keys\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, keys),\n      NULL },\n\n    { ngx_string(\"hls_key_path\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_str_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, key_path),\n      NULL },\n\n    { ngx_string(\"hls_key_url\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_str_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, key_url),\n      NULL },\n\n    { ngx_string(\"hls_fragments_per_key\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_hls_app_conf_t, frags_per_key),\n      NULL },\n\n    ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_rtmp_hls_module_ctx = {\n    NULL,                               /* preconfiguration */\n    ngx_rtmp_hls_postconfiguration,     /* postconfiguration */\n\n    NULL,                               /* create main configuration */\n    NULL,                               /* init main configuration */\n\n    NULL,                               /* create server configuration */\n    NULL,                               /* merge server configuration */\n\n    ngx_rtmp_hls_create_app_conf,       /* create location configuration */\n    ngx_rtmp_hls_merge_app_conf,        /* merge location configuration */\n};\n\n\nngx_module_t  ngx_rtmp_hls_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_hls_module_ctx,           /* module context */\n    ngx_rtmp_hls_commands,              /* module directives */\n    NGX_RTMP_MODULE,                    /* module type */\n    NULL,                               /* init master */\n    NULL,                               /* init module */\n    NULL,                               /* init process */\n    NULL,                               /* init thread */\n    NULL,                               /* exit thread */\n    NULL,                               /* exit process */\n    NULL,                               /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_rtmp_hls_frag_t *\nngx_rtmp_hls_get_frag(ngx_rtmp_session_t *s, ngx_int_t n)\n{\n    ngx_rtmp_hls_ctx_t         *ctx;\n    ngx_rtmp_hls_app_conf_t    *hacf;\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module);\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module);\n\n    return &ctx->frags[(ctx->frag + n) % (hacf->winfrags * 2 + 1)];\n}\n\n\nstatic void\nngx_rtmp_hls_next_frag(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_hls_ctx_t         *ctx;\n    ngx_rtmp_hls_app_conf_t    *hacf;\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module);\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module);\n\n    if (ctx->nfrags == hacf->winfrags) {\n        ctx->frag++;\n    } else {\n        ctx->nfrags++;\n    }\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_rename_file(u_char *src, u_char *dst)\n{\n    /* rename file with overwrite */\n\n#if (NGX_WIN32)\n    return MoveFileEx((LPCTSTR) src, (LPCTSTR) dst, MOVEFILE_REPLACE_EXISTING);\n#else\n    return ngx_rename_file(src, dst);\n#endif\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_write_variant_playlist(ngx_rtmp_session_t *s)\n{\n    static u_char             buffer[1024];\n\n    u_char                   *p, *last;\n    ssize_t                   rc;\n    ngx_fd_t                  fd;\n    ngx_str_t                *arg;\n    ngx_uint_t                n, k;\n    ngx_rtmp_hls_ctx_t       *ctx;\n    ngx_rtmp_hls_variant_t   *var;\n    ngx_rtmp_hls_app_conf_t  *hacf;\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module);\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module);\n\n    fd = ngx_open_file(ctx->var_playlist_bak.data, NGX_FILE_WRONLY,\n                       NGX_FILE_TRUNCATE, NGX_FILE_DEFAULT_ACCESS);\n\n    if (fd == NGX_INVALID_FILE) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"hls: \" ngx_open_file_n \" failed: '%V'\",\n                      &ctx->var_playlist_bak);\n\n        return NGX_ERROR;\n    }\n\n#define NGX_RTMP_HLS_VAR_HEADER \"#EXTM3U\\n#EXT-X-VERSION:3\\n\"\n\n    rc = ngx_write_fd(fd, NGX_RTMP_HLS_VAR_HEADER,\n                      sizeof(NGX_RTMP_HLS_VAR_HEADER) - 1);\n    if (rc < 0) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"hls: \" ngx_write_fd_n \" failed: '%V'\",\n                      &ctx->var_playlist_bak);\n        ngx_close_file(fd);\n        return NGX_ERROR;\n    }\n\n    var = hacf->variant->elts;\n    for (n = 0; n < hacf->variant->nelts; n++, var++)\n    {\n        p = buffer;\n        last = buffer + sizeof(buffer);\n\n        p = ngx_slprintf(p, last, \"#EXT-X-STREAM-INF:PROGRAM-ID=1\");\n\n        arg = var->args.elts;\n        for (k = 0; k < var->args.nelts; k++, arg++) {\n            p = ngx_slprintf(p, last, \",%V\", arg);\n        }\n\n        if (p < last) {\n            *p++ = '\\n';\n        }\n\n        p = ngx_slprintf(p, last, \"%V%*s%V\",\n                         &hacf->base_url,\n                         ctx->name.len - ctx->var->suffix.len, ctx->name.data,\n                         &var->suffix);\n        if (hacf->nested) {\n            p = ngx_slprintf(p, last, \"%s\", \"/index\");\n        }\n\n        p = ngx_slprintf(p, last, \"%s\", \".m3u8\\n\");\n\n        rc = ngx_write_fd(fd, buffer, p - buffer);\n        if (rc < 0) {\n            ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                          \"hls: \" ngx_write_fd_n \" failed '%V'\",\n                          &ctx->var_playlist_bak);\n            ngx_close_file(fd);\n            return NGX_ERROR;\n        }\n    }\n\n    ngx_close_file(fd);\n\n    if (ngx_rtmp_hls_rename_file(ctx->var_playlist_bak.data,\n                                 ctx->var_playlist.data)\n        == NGX_FILE_ERROR)\n    {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"hls: rename failed: '%V'->'%V'\",\n                      &ctx->var_playlist_bak, &ctx->var_playlist);\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_write_playlist(ngx_rtmp_session_t *s)\n{\n    static u_char                   buffer[1024];\n    ngx_fd_t                        fd;\n    u_char                         *p, *end;\n    ngx_rtmp_hls_ctx_t             *ctx;\n    ssize_t                         n;\n    ngx_rtmp_hls_app_conf_t        *hacf;\n    ngx_rtmp_hls_frag_t            *f;\n    ngx_uint_t                      i, max_frag;\n    ngx_str_t                       name_part, key_name_part;\n    uint64_t                        prev_key_id;\n    const char                     *sep, *key_sep;\n\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module);\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module);\n\n    fd = ngx_open_file(ctx->playlist_bak.data, NGX_FILE_WRONLY,\n                       NGX_FILE_TRUNCATE, NGX_FILE_DEFAULT_ACCESS);\n\n    if (fd == NGX_INVALID_FILE) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"hls: \" ngx_open_file_n \" failed: '%V'\",\n                      &ctx->playlist_bak);\n        return NGX_ERROR;\n    }\n\n    max_frag = hacf->fraglen / 1000;\n\n    for (i = 0; i < ctx->nfrags; i++) {\n        f = ngx_rtmp_hls_get_frag(s, i);\n        if (f->duration > max_frag) {\n            max_frag = (ngx_uint_t) (f->duration + .5);\n        }\n    }\n\n    p = buffer;\n    end = p + sizeof(buffer);\n\n    p = ngx_slprintf(p, end,\n                     \"#EXTM3U\\n\"\n                     \"#EXT-X-VERSION:3\\n\"\n                     \"#EXT-X-MEDIA-SEQUENCE:%uL\\n\"\n                     \"#EXT-X-TARGETDURATION:%ui\\n\",\n                     ctx->frag, max_frag);\n\n    if (hacf->type == NGX_RTMP_HLS_TYPE_EVENT) {\n        p = ngx_slprintf(p, end, \"#EXT-X-PLAYLIST-TYPE: EVENT\\n\");\n    }\n\n    n = ngx_write_fd(fd, buffer, p - buffer);\n    if (n < 0) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"hls: \" ngx_write_fd_n \" failed: '%V'\",\n                      &ctx->playlist_bak);\n        ngx_close_file(fd);\n        return NGX_ERROR;\n    }\n\n    sep = hacf->nested ? (hacf->base_url.len ? \"/\" : \"\") : \"-\";\n    key_sep = hacf->nested ? (hacf->key_url.len ? \"/\" : \"\") : \"-\";\n\n    name_part.len = 0;\n    if (!hacf->nested || hacf->base_url.len) {\n        name_part = ctx->name;\n    }\n\n    key_name_part.len = 0;\n    if (!hacf->nested || hacf->key_url.len) {\n        key_name_part = ctx->name;\n    }\n\n    prev_key_id = 0;\n\n    for (i = 0; i < ctx->nfrags; i++) {\n        f = ngx_rtmp_hls_get_frag(s, i);\n\n        p = buffer;\n        end = p + sizeof(buffer);\n\n        if (f->discont) {\n            p = ngx_slprintf(p, end, \"#EXT-X-DISCONTINUITY\\n\");\n        }\n\n        if (hacf->keys && (i == 0 || f->key_id != prev_key_id)) {\n            p = ngx_slprintf(p, end, \"#EXT-X-KEY:METHOD=AES-128,\"\n                             \"URI=\\\"%V%V%s%uL.key\\\",IV=0x%032XL\\n\",\n                             &hacf->key_url, &key_name_part,\n                             key_sep, f->key_id, f->key_id);\n        }\n\n        prev_key_id = f->key_id;\n\n        p = ngx_slprintf(p, end,\n                         \"#EXTINF:%.3f,\\n\"\n                         \"%V%V%s%uL.ts\\n\",\n                         f->duration, &hacf->base_url, &name_part, sep, f->id);\n\n        ngx_log_debug5(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"hls: fragment frag=%uL, n=%ui/%ui, duration=%.3f, \"\n                       \"discont=%i\",\n                       ctx->frag, i + 1, ctx->nfrags, f->duration, f->discont);\n\n        n = ngx_write_fd(fd, buffer, p - buffer);\n        if (n < 0) {\n            ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                          \"hls: \" ngx_write_fd_n \" failed '%V'\",\n                          &ctx->playlist_bak);\n            ngx_close_file(fd);\n            return NGX_ERROR;\n        }\n    }\n\n    ngx_close_file(fd);\n\n    if (ngx_rtmp_hls_rename_file(ctx->playlist_bak.data, ctx->playlist.data)\n        == NGX_FILE_ERROR)\n    {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"hls: rename failed: '%V'->'%V'\",\n                      &ctx->playlist_bak, &ctx->playlist);\n        return NGX_ERROR;\n    }\n\n    if (ctx->var) {\n        return ngx_rtmp_hls_write_variant_playlist(s);\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_copy(ngx_rtmp_session_t *s, void *dst, u_char **src, size_t n,\n    ngx_chain_t **in)\n{\n    u_char  *last;\n    size_t   pn;\n\n    if (*in == NULL) {\n        return NGX_ERROR;\n    }\n\n    for ( ;; ) {\n        last = (*in)->buf->last;\n\n        if ((size_t)(last - *src) >= n) {\n            if (dst) {\n                ngx_memcpy(dst, *src, n);\n            }\n\n            *src += n;\n\n            while (*in && *src == (*in)->buf->last) {\n                *in = (*in)->next;\n                if (*in) {\n                    *src = (*in)->buf->pos;\n                }\n            }\n\n            return NGX_OK;\n        }\n\n        pn = last - *src;\n\n        if (dst) {\n            ngx_memcpy(dst, *src, pn);\n            dst = (u_char *)dst + pn;\n        }\n\n        n -= pn;\n        *in = (*in)->next;\n\n        if (*in == NULL) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                          \"hls: failed to read %uz byte(s)\", n);\n            return NGX_ERROR;\n        }\n\n        *src = (*in)->buf->pos;\n    }\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_append_hevc_aud(ngx_rtmp_session_t *s, ngx_buf_t *out)\n{\n    static u_char   aud_nal[] = { 0x00, 0x00, 0x00, 0x01, 0x46, 0x01, 0x50 };\n\n    if (out->last + sizeof(aud_nal) > out->end) {\n        return NGX_ERROR;\n    }\n\n    out->last = ngx_cpymem(out->last, aud_nal, sizeof(aud_nal));\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_append_hevc_vps_sps_pps(ngx_rtmp_session_t *s, ngx_buf_t *out)\n{\n    ngx_rtmp_codec_ctx_t           *codec_ctx;\n    u_char                         *p;\n    ngx_chain_t                    *in;\n    ngx_rtmp_hls_ctx_t             *ctx;\n    ngx_uint_t                      i, j, rnal_unit_len, nal_unit_len,\n                                    num_arrays, nal_unit_type,\n                                    rnum_nalus, num_nalus;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module);\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    if (ctx == NULL || codec_ctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    in = codec_ctx->avc_header->chain;\n    if (in == NULL) {\n        return NGX_ERROR;\n    }\n\n    p = in->buf->pos;\n    /*  6 bytes\n     * FrameType                                    4 bits\n     * CodecID                                      4 bits\n     * AVCPacketType                                1 byte\n     * CompositionTime                              3 bytes\n     * HEVCDecoderConfigurationRecord\n     *      configurationVersion                    1 byte\n     */\n\n    /*  20 bytes\n     * HEVCDecoderConfigurationRecord\n     *      general_profile_space                   2 bits\n     *      general_tier_flag                       1 bit\n     *      general_profile_idc                     5 bits\n     *      general_profile_compatibility_flags     4 bytes\n     *      general_constraint_indicator_flags      6 bytes\n     *      general_level_idc                       1 byte\n     *      min_spatial_segmentation_idc            4 bits reserved + 12 bits\n     *      parallelismType                         6 bits reserved + 2 bits\n     *      chroma_format_idc                       6 bits reserved + 2 bits\n     *      bit_depth_luma_minus8                   5 bits reserved + 3 bits\n     *      bit_depth_chroma_minus8                 5 bits reserved + 3 bits\n     *      avgFrameRate                            2 bytes\n     */\n\n    /* 1 bytes\n     * HEVCDecoderConfigurationRecord\n     *      constantFrameRate                       2 bits\n     *      numTemporalLayers                       3 bits\n     *      temporalIdNested                        1 bit\n     *      lengthSizeMinusOne                      2 bits\n     */\n\n    if (ngx_rtmp_hls_copy(s, NULL, &p, 27, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n     /* 1 byte\n     * HEVCDecoderConfigurationRecord\n     *      numOfArrays                             1 byte\n     */\n    num_arrays = 0;\n    if (ngx_rtmp_hls_copy(s, &num_arrays, &p, 1, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    for (i = 0; i < num_arrays; ++i) {\n        /*\n         * array_completeness                       1 bit\n         * reserved                                 1 bit\n         * NAL_unit_type                            6 bits\n         * numNalus                                 2 bytes\n         */\n        if (ngx_rtmp_hls_copy(s, &nal_unit_type, &p, 1, &in) != NGX_OK) {    // 32 33 34 39\n            return NGX_ERROR;\n        }\n        nal_unit_type &= 0x3f;\n        ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n            \"rtmp-hls: append_vps_sps_pps| type %d\", nal_unit_type);\n        if (ngx_rtmp_hls_copy(s, &rnum_nalus, &p, 2, &in) != NGX_OK) {\n            return NGX_ERROR;\n        }\n        num_nalus = 0;\n        ngx_rtmp_rmemcpy(&num_nalus, &rnum_nalus, 2);\n        for (j = 0; j < num_nalus; ++j) {\n            /*\n             * nalUnitLength                        2 bytes\n             */\n            if (ngx_rtmp_hls_copy(s, &rnal_unit_len, &p, 2, &in) != NGX_OK) {\n                return NGX_ERROR;\n            }\n            nal_unit_len = 0;\n            ngx_rtmp_rmemcpy(&nal_unit_len, &rnal_unit_len, 2);\n            if (out->end - out->last < 4) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                              \"hls: too small buffer for hevc header NAL size\");\n                return NGX_ERROR;\n            }\n\n            *out->last++ = 0;\n            *out->last++ = 0;\n            *out->last++ = 0;\n            *out->last++ = 1;\n\n            if (out->end - out->last < (ngx_int_t)nal_unit_len) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                              \"hls: too small buffer for hevc header NAL\");\n                return NGX_ERROR;\n            }\n\n            if (ngx_rtmp_hls_copy(s, out->last, &p, nal_unit_len, &in)\n                != NGX_OK)\n            {\n                return NGX_ERROR;\n            }\n\n            out->last += nal_unit_len;\n        }\n    }\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_append_aud(ngx_rtmp_session_t *s, ngx_buf_t *out)\n{\n    static u_char   aud_nal[] = { 0x00, 0x00, 0x00, 0x01, 0x09, 0xf0 };\n\n    if (out->last + sizeof(aud_nal) > out->end) {\n        return NGX_ERROR;\n    }\n\n    out->last = ngx_cpymem(out->last, aud_nal, sizeof(aud_nal));\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_append_sps_pps(ngx_rtmp_session_t *s, ngx_buf_t *out)\n{\n    ngx_rtmp_codec_ctx_t           *codec_ctx;\n    u_char                         *p;\n    ngx_chain_t                    *in;\n    ngx_rtmp_hls_ctx_t             *ctx;\n    int8_t                          nnals;\n    uint16_t                        len, rlen;\n    ngx_int_t                       n;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module);\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    if (ctx == NULL || codec_ctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    in = codec_ctx->avc_header->chain;\n    if (in == NULL) {\n        return NGX_ERROR;\n    }\n\n    p = in->buf->pos;\n\n    /*\n     * Skip bytes:\n     * - flv fmt\n     * - H264 CONF/PICT (0x00)\n     * - 0\n     * - 0\n     * - 0\n     * - version\n     * - profile\n     * - compatibility\n     * - level\n     * - nal bytes\n     */\n\n    if (ngx_rtmp_hls_copy(s, NULL, &p, 10, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    /* number of SPS NALs */\n    if (ngx_rtmp_hls_copy(s, &nnals, &p, 1, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    nnals &= 0x1f; /* 5lsb */\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"hls: SPS number: %uz\", nnals);\n\n    /* SPS */\n    for (n = 0; ; ++n) {\n        for (; nnals; --nnals) {\n\n            /* NAL length */\n            if (ngx_rtmp_hls_copy(s, &rlen, &p, 2, &in) != NGX_OK) {\n                return NGX_ERROR;\n            }\n\n            ngx_rtmp_rmemcpy(&len, &rlen, 2);\n\n            ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                           \"hls: header NAL length: %uz\", (size_t) len);\n\n            /* AnnexB prefix */\n            if (out->end - out->last < 4) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                              \"hls: too small buffer for header NAL size\");\n                return NGX_ERROR;\n            }\n\n            *out->last++ = 0;\n            *out->last++ = 0;\n            *out->last++ = 0;\n            *out->last++ = 1;\n\n            /* NAL body */\n            if (out->end - out->last < len) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                              \"hls: too small buffer for header NAL\");\n                return NGX_ERROR;\n            }\n\n            if (ngx_rtmp_hls_copy(s, out->last, &p, len, &in) != NGX_OK) {\n                return NGX_ERROR;\n            }\n\n            out->last += len;\n        }\n\n        if (n == 1) {\n            break;\n        }\n\n        /* number of PPS NALs */\n        if (ngx_rtmp_hls_copy(s, &nnals, &p, 1, &in) != NGX_OK) {\n            return NGX_ERROR;\n        }\n\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"hls: PPS number: %uz\", nnals);\n    }\n\n    return NGX_OK;\n}\n\n\nstatic uint64_t\nngx_rtmp_hls_get_fragment_id(ngx_rtmp_session_t *s, uint64_t ts)\n{\n    ngx_rtmp_hls_ctx_t         *ctx;\n    ngx_rtmp_hls_app_conf_t    *hacf;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module);\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module);\n\n    switch (hacf->naming) {\n\n    case NGX_RTMP_HLS_NAMING_TIMESTAMP:\n        return ts;\n\n    case NGX_RTMP_HLS_NAMING_SYSTEM:\n        return (uint64_t) ngx_cached_time->sec * 1000 + ngx_cached_time->msec;\n\n    default: /* NGX_RTMP_HLS_NAMING_SEQUENTIAL */\n        return ctx->frag + ctx->nfrags;\n    }\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_close_fragment(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_hls_ctx_t         *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module);\n    if (ctx == NULL || !ctx->opened) {\n        return NGX_OK;\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"hls: close fragment n=%uL\", ctx->frag);\n\n    ngx_rtmp_mpegts_close_file(&ctx->file);\n\n    ctx->opened = 0;\n\n    ngx_rtmp_hls_next_frag(s);\n\n    ngx_rtmp_hls_write_playlist(s);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_open_fragment(ngx_rtmp_session_t *s, uint64_t ts,\n    ngx_int_t discont)\n{\n    uint64_t                  id;\n    ngx_fd_t                  fd;\n    ngx_uint_t                g;\n    ngx_rtmp_hls_ctx_t       *ctx;\n    ngx_rtmp_hls_frag_t      *f;\n    ngx_rtmp_hls_app_conf_t  *hacf;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module);\n\n    if (ctx->opened) {\n        return NGX_OK;\n    }\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module);\n\n    if (ngx_rtmp_hls_ensure_directory(s, &hacf->path) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    if (hacf->keys &&\n        ngx_rtmp_hls_ensure_directory(s, &hacf->key_path) != NGX_OK)\n    {\n        return NGX_ERROR;\n    }\n\n    id = ngx_rtmp_hls_get_fragment_id(s, ts);\n\n    if (hacf->granularity) {\n        g = (ngx_uint_t) hacf->granularity;\n        id = (uint64_t) (id / g) * g;\n    }\n\n    ngx_sprintf(ctx->stream.data + ctx->stream.len, \"%uL.ts%Z\", id);\n\n    if (hacf->keys) {\n        if (ctx->key_frags == 0) {\n\n            ctx->key_frags = hacf->frags_per_key - 1;\n            ctx->key_id = id;\n\n            if (RAND_bytes(ctx->key, 16) < 0) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                              \"hls: failed to create key\");\n                return NGX_ERROR;\n            }\n\n            ngx_sprintf(ctx->keyfile.data + ctx->keyfile.len, \"%uL.key%Z\", id);\n\n            fd = ngx_open_file(ctx->keyfile.data, NGX_FILE_WRONLY,\n                               NGX_FILE_TRUNCATE, NGX_FILE_DEFAULT_ACCESS);\n\n            if (fd == NGX_INVALID_FILE) {\n                ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                              \"hls: failed to open key file '%s'\",\n                              ctx->keyfile.data);\n                return NGX_ERROR;\n            }\n\n            if (ngx_write_fd(fd, ctx->key, 16) != 16) {\n                ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                              \"hls: failed to write key file '%s'\",\n                              ctx->keyfile.data);\n                ngx_close_file(fd);\n                return NGX_ERROR;\n            }\n\n            ngx_close_file(fd);\n\n        } else {\n            if (hacf->frags_per_key) {\n                ctx->key_frags--;\n            }\n\n            if (ngx_set_file_time(ctx->keyfile.data, 0, ngx_cached_time->sec)\n                != NGX_OK)\n            {\n                ngx_log_error(NGX_LOG_ALERT, s->log, ngx_errno,\n                              ngx_set_file_time_n \" '%s' failed\",\n                              ctx->keyfile.data);\n            }\n        }\n    }\n\n    ngx_log_debug6(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"hls: open fragment file='%s', keyfile='%s', \"\n                   \"frag=%uL, n=%ui, time=%uL, discont=%i\",\n                   ctx->stream.data,\n                   ctx->keyfile.data ? ctx->keyfile.data : (u_char *) \"\",\n                   ctx->frag, ctx->nfrags, ts, discont);\n\n    if (hacf->keys &&\n        ngx_rtmp_mpegts_init_encryption(&ctx->file, ctx->key, 16, ctx->key_id)\n        != NGX_OK)\n    {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"hls: failed to initialize hls encryption\");\n        return NGX_ERROR;\n    }\n\n    ctx->file.acodec = s->acodec;\n    ctx->file.vcodec = s->vcodec;\n    if (ngx_rtmp_mpegts_open_file(&ctx->file, ctx->stream.data,\n                                  s->log)\n        != NGX_OK)\n    {\n        return NGX_ERROR;\n    }\n\n    ctx->opened = 1;\n\n    f = ngx_rtmp_hls_get_frag(s, ctx->nfrags);\n\n    ngx_memzero(f, sizeof(*f));\n\n    f->active = 1;\n    f->discont = discont;\n    f->id = id;\n    f->key_id = ctx->key_id;\n\n    ctx->frag_ts = ts;\n\n    /* start fragment with audio to make iPhone happy */\n\n    ngx_rtmp_hls_flush_audio(s);\n\n    return NGX_OK;\n}\n\n\nstatic void\nngx_rtmp_hls_restore_stream(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_hls_ctx_t             *ctx;\n    ngx_file_t                      file;\n    ssize_t                         ret;\n    off_t                           offset;\n    u_char                         *p, *last, *end, *next, *pa, *pp, c;\n    ngx_rtmp_hls_frag_t            *f;\n    double                          duration;\n    ngx_int_t                       discont;\n    uint64_t                        mag, key_id, base;\n    static u_char                   buffer[4096];\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module);\n\n    ngx_memzero(&file, sizeof(file));\n\n    file.log = s->log;\n\n    ngx_str_set(&file.name, \"m3u8\");\n\n    file.fd = ngx_open_file(ctx->playlist.data, NGX_FILE_RDONLY, NGX_FILE_OPEN,\n                            0);\n    if (file.fd == NGX_INVALID_FILE) {\n        return;\n    }\n\n    offset = 0;\n    ctx->nfrags = 0;\n    f = NULL;\n    duration = 0;\n    discont = 0;\n    key_id = 0;\n\n    for ( ;; ) {\n\n        ret = ngx_read_file(&file, buffer, sizeof(buffer), offset);\n        if (ret <= 0) {\n            goto done;\n        }\n\n        p = buffer;\n        end = buffer + ret;\n\n        for ( ;; ) {\n            last = ngx_strlchr(p, end, '\\n');\n\n            if (last == NULL) {\n                if (p == buffer) {\n                    goto done;\n                }\n                break;\n            }\n\n            next = last + 1;\n            offset += (next - p);\n\n            if (p != last && last[-1] == '\\r') {\n                last--;\n            }\n\n\n#define NGX_RTMP_MSEQ           \"#EXT-X-MEDIA-SEQUENCE:\"\n#define NGX_RTMP_MSEQ_LEN       (sizeof(NGX_RTMP_MSEQ) - 1)\n\n\n            if (ngx_memcmp(p, NGX_RTMP_MSEQ, NGX_RTMP_MSEQ_LEN) == 0) {\n\n                ctx->frag = (uint64_t) strtod((const char *)\n                                              &p[NGX_RTMP_MSEQ_LEN], NULL);\n\n                ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                               \"hls: restore sequence frag=%uL\", ctx->frag);\n            }\n\n\n#define NGX_RTMP_XKEY           \"#EXT-X-KEY:\"\n#define NGX_RTMP_XKEY_LEN       (sizeof(NGX_RTMP_XKEY) - 1)\n\n            if (ngx_memcmp(p, NGX_RTMP_XKEY, NGX_RTMP_XKEY_LEN) == 0) {\n\n                /* recover key id from initialization vector */\n\n                key_id = 0;\n                base = 1;\n                pp = last - 1;\n\n                for ( ;; ) {\n                    if (pp < p) {\n                        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                                \"hls: failed to read key id\");\n                        break;\n                    }\n\n                    c = *pp;\n                    if (c == 'x') {\n                        break;\n                    }\n\n                    if (c >= '0' && c <= '9') {\n                        c -= '0';\n                        goto next;\n                    }\n\n                    c |= 0x20;\n\n                    if (c >= 'a' && c <= 'f') {\n                        c -= 'a' - 10;\n                        goto next;\n                    }\n\n                    ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                                  \"hls: bad character in key id\");\n                    break;\n\n                next:\n\n                    key_id += base * c;\n                    base *= 0x10;\n                    pp--;\n                }\n            }\n\n\n#define NGX_RTMP_EXTINF         \"#EXTINF:\"\n#define NGX_RTMP_EXTINF_LEN     (sizeof(NGX_RTMP_EXTINF) - 1)\n\n\n            if (ngx_memcmp(p, NGX_RTMP_EXTINF, NGX_RTMP_EXTINF_LEN) == 0) {\n\n                duration = strtod((const char *) &p[NGX_RTMP_EXTINF_LEN], NULL);\n\n                ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                               \"hls: restore durarion=%.3f\", duration);\n            }\n\n\n#define NGX_RTMP_DISCONT        \"#EXT-X-DISCONTINUITY\"\n#define NGX_RTMP_DISCONT_LEN    (sizeof(NGX_RTMP_DISCONT) - 1)\n\n\n            if (ngx_memcmp(p, NGX_RTMP_DISCONT, NGX_RTMP_DISCONT_LEN) == 0) {\n\n                discont = 1;\n\n                ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                               \"hls: discontinuity\");\n            }\n\n            /* find '.ts\\r' */\n\n            if (p + 4 <= last &&\n                last[-3] == '.' && last[-2] == 't' && last[-1] == 's')\n            {\n                f = ngx_rtmp_hls_get_frag(s, ctx->nfrags);\n\n                ngx_memzero(f, sizeof(*f));\n\n                f->duration = duration;\n                f->discont = discont;\n                f->active = 1;\n                f->id = 0;\n\n                discont = 0;\n\n                mag = 1;\n                for (pa = last - 4; pa >= p; pa--) {\n                    if (*pa < '0' || *pa > '9') {\n                        break;\n                    }\n                    f->id += (*pa - '0') * mag;\n                    mag *= 10;\n                }\n\n                f->key_id = key_id;\n\n                ngx_rtmp_hls_next_frag(s);\n\n                ngx_log_debug6(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                               \"hls: restore fragment '%*s' id=%uL, \"\n                               \"duration=%.3f, frag=%uL, nfrags=%ui\",\n                               (size_t) (last - p), p, f->id, f->duration,\n                               ctx->frag, ctx->nfrags);\n            }\n\n            p = next;\n        }\n    }\n\ndone:\n    ngx_close_file(file.fd);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_ensure_directory(ngx_rtmp_session_t *s, ngx_str_t *path)\n{\n    size_t                    len;\n    ngx_file_info_t           fi;\n    ngx_rtmp_hls_ctx_t       *ctx;\n    ngx_rtmp_hls_app_conf_t  *hacf;\n\n    static u_char  zpath[NGX_MAX_PATH + 1];\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module);\n\n    if (path->len + 1 > sizeof(zpath)) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0, \"hls: too long path\");\n        return NGX_ERROR;\n    }\n\n    ngx_snprintf(zpath, sizeof(zpath), \"%V%Z\", path);\n\n    if (ngx_file_info(zpath, &fi) == NGX_FILE_ERROR) {\n\n        if (ngx_errno != NGX_ENOENT) {\n            ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                          \"hls: \" ngx_file_info_n \" failed on '%V'\", path);\n            return NGX_ERROR;\n        }\n\n        /* ENOENT */\n\n        if (ngx_create_dir(zpath, NGX_RTMP_HLS_DIR_ACCESS) == NGX_FILE_ERROR) {\n            ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                          \"hls: \" ngx_create_dir_n \" failed on '%V'\", path);\n            return NGX_ERROR;\n        }\n\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"hls: directory '%V' created\", path);\n\n    } else {\n\n        if (!ngx_is_dir(&fi)) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                          \"hls: '%V' exists and is not a directory\", path);\n            return  NGX_ERROR;\n        }\n\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"hls: directory '%V' exists\", path);\n    }\n\n    if (!hacf->nested) {\n        return NGX_OK;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module);\n\n    len = path->len;\n    if (path->data[len - 1] == '/') {\n        len--;\n    }\n\n    if (len + 1 + ctx->name.len + 1 > sizeof(zpath)) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0, \"hls: too long path\");\n        return NGX_ERROR;\n    }\n\n    ngx_snprintf(zpath, sizeof(zpath) - 1, \"%*s/%V%Z\", len, path->data,\n                 &ctx->name);\n\n    if (ngx_file_info(zpath, &fi) != NGX_FILE_ERROR) {\n\n        if (ngx_is_dir(&fi)) {\n            ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                           \"hls: directory '%s' exists\", zpath);\n            return NGX_OK;\n        }\n\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"hls: '%s' exists and is not a directory\", zpath);\n\n        return  NGX_ERROR;\n    }\n\n    if (ngx_errno != NGX_ENOENT) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"hls: \" ngx_file_info_n \" failed on '%s'\", zpath);\n        return NGX_ERROR;\n    }\n\n    /* NGX_ENOENT */\n\n    if (ngx_create_dir(zpath, NGX_RTMP_HLS_DIR_ACCESS) == NGX_FILE_ERROR) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                      \"hls: \" ngx_create_dir_n \" failed on '%s'\", zpath);\n        return NGX_ERROR;\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"hls: directory '%s' created\", zpath);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v)\n{\n    ngx_rtmp_hls_app_conf_t        *hacf;\n    ngx_rtmp_hls_ctx_t             *ctx;\n    u_char                         *p, *pp;\n    ngx_rtmp_hls_frag_t            *f;\n    ngx_buf_t                      *b;\n    size_t                          len;\n    ngx_rtmp_hls_variant_t         *var;\n    ngx_uint_t                      n;\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module);\n    if (hacf == NULL || !hacf->hls || hacf->path.len == 0) {\n        goto next;\n    }\n\n    if (s->interprocess) {\n        goto next;\n    }\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"hls: publish: name='%s' type='%s'\",\n                   v->name, v->type);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module);\n\n    if (ctx == NULL) {\n\n        ctx = ngx_pcalloc(s->pool, sizeof(ngx_rtmp_hls_ctx_t));\n        ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_hls_module);\n\n    } else {\n\n        f = ctx->frags;\n        b = ctx->aframe;\n\n        ngx_memzero(ctx, sizeof(ngx_rtmp_hls_ctx_t));\n\n        ctx->frags = f;\n        ctx->aframe = b;\n\n        if (b) {\n            b->pos = b->last = b->start;\n        }\n    }\n\n    if (ctx->frags == NULL) {\n        ctx->frags = ngx_pcalloc(s->pool,\n                                 sizeof(ngx_rtmp_hls_frag_t) *\n                                 (hacf->winfrags * 2 + 1));\n        if (ctx->frags == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    if (ngx_strstr(v->name, \"..\")) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"hls: bad stream name: '%s'\", v->name);\n        return NGX_ERROR;\n    }\n\n    ctx->name.len = ngx_strlen(v->name);\n    ctx->name.data = ngx_palloc(s->pool, ctx->name.len + 1);\n\n    if (ctx->name.data == NULL) {\n        return NGX_ERROR;\n    }\n\n    *ngx_cpymem(ctx->name.data, v->name, ctx->name.len) = 0;\n\n    len = hacf->path.len + 1 + ctx->name.len + sizeof(\".m3u8\");\n    if (hacf->nested) {\n        len += sizeof(\"/index\") - 1;\n    }\n\n    ctx->playlist.data = ngx_palloc(s->pool, len);\n    p = ngx_cpymem(ctx->playlist.data, hacf->path.data, hacf->path.len);\n\n    if (p[-1] != '/') {\n        *p++ = '/';\n    }\n\n    p = ngx_cpymem(p, ctx->name.data, ctx->name.len);\n\n    /*\n     * ctx->stream holds initial part of stream file path\n     * however the space for the whole stream path\n     * is allocated\n     */\n\n    ctx->stream.len = p - ctx->playlist.data + 1;\n    ctx->stream.data = ngx_palloc(s->pool,\n                                  ctx->stream.len + NGX_INT64_LEN +\n                                  sizeof(\".ts\"));\n\n    ngx_memcpy(ctx->stream.data, ctx->playlist.data, ctx->stream.len - 1);\n    ctx->stream.data[ctx->stream.len - 1] = (hacf->nested ? '/' : '-');\n\n    /* varint playlist path */\n\n    if (hacf->variant) {\n        var = hacf->variant->elts;\n        for (n = 0; n < hacf->variant->nelts; n++, var++) {\n            if (ctx->name.len > var->suffix.len &&\n                ngx_memcmp(var->suffix.data,\n                           ctx->name.data + ctx->name.len - var->suffix.len,\n                           var->suffix.len)\n                == 0)\n            {\n                ctx->var = var;\n\n                len = (size_t) (p - ctx->playlist.data);\n\n                ctx->var_playlist.len = len - var->suffix.len + sizeof(\".m3u8\")\n                                        - 1;\n                ctx->var_playlist.data = ngx_palloc(s->pool,\n                                                    ctx->var_playlist.len + 1);\n\n                pp = ngx_cpymem(ctx->var_playlist.data, ctx->playlist.data,\n                               len - var->suffix.len);\n                pp = ngx_cpymem(pp, \".m3u8\", sizeof(\".m3u8\") - 1);\n                *pp = 0;\n\n                ctx->var_playlist_bak.len = ctx->var_playlist.len +\n                                            sizeof(\".bak\") - 1;\n                ctx->var_playlist_bak.data = ngx_palloc(s->pool,\n                                                 ctx->var_playlist_bak.len + 1);\n\n                pp = ngx_cpymem(ctx->var_playlist_bak.data,\n                                ctx->var_playlist.data,\n                                ctx->var_playlist.len);\n                pp = ngx_cpymem(pp, \".bak\", sizeof(\".bak\") - 1);\n                *pp = 0;\n\n                break;\n            }\n        }\n    }\n\n\n    /* playlist path */\n\n    if (hacf->nested) {\n        p = ngx_cpymem(p, \"/index.m3u8\", sizeof(\"/index.m3u8\") - 1);\n    } else {\n        p = ngx_cpymem(p, \".m3u8\", sizeof(\".m3u8\") - 1);\n    }\n\n    ctx->playlist.len = p - ctx->playlist.data;\n\n    *p = 0;\n\n    /* playlist bak (new playlist) path */\n\n    ctx->playlist_bak.data = ngx_palloc(s->pool,\n                                        ctx->playlist.len + sizeof(\".bak\"));\n    p = ngx_cpymem(ctx->playlist_bak.data, ctx->playlist.data,\n                   ctx->playlist.len);\n    p = ngx_cpymem(p, \".bak\", sizeof(\".bak\") - 1);\n\n    ctx->playlist_bak.len = p - ctx->playlist_bak.data;\n\n    *p = 0;\n\n    /* key path */\n\n    if (hacf->keys) {\n        len = hacf->key_path.len + 1 + ctx->name.len + 1 + NGX_INT64_LEN\n              + sizeof(\".key\");\n\n        ctx->keyfile.data = ngx_palloc(s->pool, len);\n        if (ctx->keyfile.data == NULL) {\n            return NGX_ERROR;\n        }\n\n        p = ngx_cpymem(ctx->keyfile.data, hacf->key_path.data,\n                       hacf->key_path.len);\n\n        if (p[-1] != '/') {\n            *p++ = '/';\n        }\n\n        p = ngx_cpymem(p, ctx->name.data, ctx->name.len);\n        *p++ = (hacf->nested ? '/' : '-');\n\n        ctx->keyfile.len = p - ctx->keyfile.data;\n    }\n\n    ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"hls: playlist='%V' playlist_bak='%V' \"\n                   \"stream_pattern='%V' keyfile_pattern='%V'\",\n                   &ctx->playlist, &ctx->playlist_bak,\n                   &ctx->stream, &ctx->keyfile);\n\n    if (hacf->continuous) {\n        ngx_rtmp_hls_restore_stream(s);\n    }\n\nnext:\n    return next_publish(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)\n{\n    ngx_rtmp_hls_app_conf_t        *hacf;\n    ngx_rtmp_hls_ctx_t             *ctx;\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module);\n\n    if (hacf == NULL || !hacf->hls || ctx == NULL) {\n        goto next;\n    }\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"hls: close stream\");\n\n    ngx_rtmp_hls_close_fragment(s);\n\nnext:\n    return next_close_stream(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_parse_aac_header(ngx_rtmp_session_t *s, ngx_uint_t *objtype,\n    ngx_uint_t *srindex, ngx_uint_t *chconf)\n{\n    ngx_rtmp_codec_ctx_t   *codec_ctx;\n    ngx_chain_t            *cl;\n    u_char                 *p, b0, b1;\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    cl = codec_ctx->aac_header->chain;\n\n    p = cl->buf->pos;\n\n    if (ngx_rtmp_hls_copy(s, NULL, &p, 2, &cl) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    if (ngx_rtmp_hls_copy(s, &b0, &p, 1, &cl) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    if (ngx_rtmp_hls_copy(s, &b1, &p, 1, &cl) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    *objtype = b0 >> 3;\n    if (*objtype == 0 || *objtype == 0x1f) {\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"hls: unsupported adts object type:%ui\", *objtype);\n        return NGX_ERROR;\n    }\n\n    if (*objtype > 4) {\n\n        /*\n         * Mark all extended profiles as LC\n         * to make Android as happy as possible.\n         */\n\n        *objtype = 2;\n    }\n\n    *srindex = ((b0 << 1) & 0x0f) | ((b1 & 0x80) >> 7);\n    if (*srindex == 0x0f) {\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"hls: unsupported adts sample rate:%ui\", *srindex);\n        return NGX_ERROR;\n    }\n\n    *chconf = (b1 >> 3) & 0x0f;\n\n    ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"hls: aac object_type:%ui, sample_rate_index:%ui, \"\n                   \"channel_config:%ui\", *objtype, *srindex, *chconf);\n\n    return NGX_OK;\n}\n\n\nstatic void\nngx_rtmp_hls_update_fragment(ngx_rtmp_session_t *s, uint64_t ts,\n    ngx_int_t boundary, ngx_uint_t flush_rate)\n{\n    ngx_rtmp_hls_ctx_t         *ctx;\n    ngx_rtmp_hls_app_conf_t    *hacf;\n    ngx_rtmp_hls_frag_t        *f;\n    ngx_msec_t                  ts_frag_len;\n    ngx_int_t                   same_frag, force,discont;\n    ngx_buf_t                  *b;\n    int64_t                     d;\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module);\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module);\n    f = NULL;\n    force = 0;\n    discont = 1;\n\n    if (ctx->opened) {\n        f = ngx_rtmp_hls_get_frag(s, ctx->nfrags);\n        d = (int64_t) (ts - ctx->frag_ts);\n\n        if (d > (int64_t) hacf->max_fraglen * 90 || d < -90000) {\n            ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                          \"hls: force fragment split: %.3f sec, \", d / 90000.);\n            force = 1;\n\n        } else {\n            f->duration = (ts - ctx->frag_ts) / 90000.;\n            discont = 0;\n        }\n    }\n\n    switch (hacf->slicing) {\n        case NGX_RTMP_HLS_SLICING_PLAIN:\n            if (f && f->duration < hacf->fraglen / 1000.) {\n                boundary = 0;\n            }\n            break;\n\n        case NGX_RTMP_HLS_SLICING_ALIGNED:\n\n            ts_frag_len = hacf->fraglen * 90;\n            same_frag = ctx->frag_ts / ts_frag_len == ts / ts_frag_len;\n\n            if (f && same_frag) {\n                boundary = 0;\n            }\n\n            if (f == NULL && (ctx->frag_ts == 0 || same_frag)) {\n                ctx->frag_ts = ts;\n                boundary = 0;\n            }\n\n            break;\n    }\n\n    if (boundary || force) {\n        ngx_rtmp_hls_close_fragment(s);\n        ngx_rtmp_hls_open_fragment(s, ts, discont);\n    }\n\n    b = ctx->aframe;\n    if (ctx->opened && b && b->last > b->pos &&\n        ctx->aframe_pts + (uint64_t) hacf->max_audio_delay * 90 / flush_rate\n        < ts)\n    {\n        ngx_rtmp_hls_flush_audio(s);\n    }\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_flush_audio(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_hls_ctx_t             *ctx;\n    ngx_rtmp_mpegts_frame_t         frame;\n    ngx_int_t                       rc;\n    ngx_buf_t                      *b;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module);\n\n    if (ctx == NULL || !ctx->opened) {\n        return NGX_OK;\n    }\n\n    b = ctx->aframe;\n\n    if (b == NULL || b->pos == b->last) {\n        return NGX_OK;\n    }\n\n    ngx_memzero(&frame, sizeof(frame));\n\n    frame.dts = ctx->aframe_pts;\n    frame.pts = frame.dts;\n    frame.cc = ctx->audio_cc;\n    frame.pid = 0x101;\n    frame.sid = 0xc0;\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"hls: flush audio pts=%uL\", frame.pts);\n\n    rc = ngx_rtmp_mpegts_write_frame(&ctx->file, &frame, b);\n\n    if (rc != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"hls: audio flush failed\");\n    }\n\n    ctx->audio_cc = frame.cc;\n    b->pos = b->last = b->start;\n\n    return rc;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_audio(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n    ngx_chain_t *in)\n{\n    ngx_rtmp_hls_app_conf_t        *hacf;\n    ngx_rtmp_hls_ctx_t             *ctx;\n    ngx_rtmp_codec_ctx_t           *codec_ctx;\n    uint64_t                        pts, est_pts;\n    int64_t                         dpts;\n    size_t                          bsize;\n    ngx_buf_t                      *b;\n    u_char                         *p = NULL;\n    ngx_uint_t                      objtype, srindex, chconf, size = 0;\n    ngx_flag_t                      mp3_tag = 0;\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module);\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    if (hacf == NULL || !hacf->hls || ctx == NULL ||\n        codec_ctx == NULL  || h->mlen < 2)\n    {\n        return NGX_OK;\n    }\n\n    if ((codec_ctx->audio_codec_id != NGX_RTMP_AUDIO_AAC ||\n        codec_ctx->aac_header == NULL || ngx_rtmp_is_codec_header(in)) &&\n        codec_ctx->audio_codec_id != NGX_RTMP_AUDIO_MP3)\n    {\n        return NGX_OK;\n    }\n\n    if (s->pause) {\n        return NGX_OK;\n    }\n\n    b = ctx->aframe;\n\n    if (b == NULL) {\n\n        b = ngx_pcalloc(s->pool, sizeof(ngx_buf_t));\n        if (b == NULL) {\n            return NGX_ERROR;\n        }\n\n        ctx->aframe = b;\n\n        b->start = ngx_palloc(s->pool, hacf->audio_buffer_size);\n        if (b->start == NULL) {\n            return NGX_ERROR;\n        }\n\n        b->end = b->start + hacf->audio_buffer_size;\n        b->pos = b->last = b->start;\n    }\n\n    if (codec_ctx->audio_codec_id == NGX_RTMP_AUDIO_AAC) {\n        size = h->mlen - 2 + 7;\n    } else if (codec_ctx->audio_codec_id == NGX_RTMP_AUDIO_MP3) {\n        size = h->mlen - 1;\n    }\n\n    pts = (uint64_t) h->timestamp * 90;\n\n    if (b->start + size > b->end) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"hls: too big audio frame\");\n        return NGX_OK;\n    }\n\n    /*\n     * start new fragment here if\n     * there's no video at all, otherwise\n     * do it in video handler\n     */\n\n    ngx_rtmp_hls_update_fragment(s, pts, codec_ctx->avc_header == NULL, 2);\n\n    if (b->last + size > b->end) {\n        ngx_rtmp_hls_flush_audio(s);\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"hls: audio pts=%uL\", pts);\n\n    if (codec_ctx->audio_codec_id == NGX_RTMP_AUDIO_AAC) {\n        if (b->last + 7 > b->end) {\n            ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                        \"hls: not enough buffer for audio header\");\n            return NGX_OK;\n        }\n\n        p = b->last;\n        b->last += 5;\n\n        /* copy payload */\n\n        for (; in && b->last < b->end; in = in->next) {\n\n            bsize = in->buf->last - in->buf->pos;\n            if (b->last + bsize > b->end) {\n                bsize = b->end - b->last;\n            }\n\n            b->last = ngx_cpymem(b->last, in->buf->pos, bsize);\n        }\n\n        /* make up ADTS header */\n\n        if (ngx_rtmp_hls_parse_aac_header(s, &objtype, &srindex, &chconf)\n            != NGX_OK)\n        {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                        \"hls: aac header error\");\n            return NGX_OK;\n        }\n\n        /* we have 5 free bytes + 2 bytes of RTMP frame header */\n\n        p[0] = 0xff;\n        p[1] = 0xf1;\n        p[2] = (u_char) (((objtype - 1) << 6) | (srindex << 2) |\n                        ((chconf & 0x04) >> 2));\n        p[3] = (u_char) (((chconf & 0x03) << 6) | ((size >> 11) & 0x03));\n        p[4] = (u_char) (size >> 3);\n        p[5] = (u_char) ((size << 5) | 0x1f);\n        p[6] = 0xfc;\n    } else if (codec_ctx->audio_codec_id == NGX_RTMP_AUDIO_MP3) {\n\t\tif (b->last > b->end) {\n            ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                            \"hls: not enough buffer for audio header\");\n            return NGX_OK;\n        }\n\n        p = b->last;\n            \n        /* copy payload */\n\n        for (; in && b->last < b->end; in = in->next) {\n\n            bsize = in->buf->last - in->buf->pos;\n            if (b->last + bsize > b->end) {\n                bsize = b->end - b->last;\n            }\n\n            if (0 == mp3_tag) {\n                b->last = ngx_cpymem(b->last, in->buf->pos+1, bsize-1);\n                mp3_tag = 1;\n            } else {\n                b->last = ngx_cpymem(b->last, in->buf->pos, bsize);\n            }\n        }\n    }\n\n    if (p != b->start) {\n        ctx->aframe_num++;\n        return NGX_OK;\n    }\n\n    ctx->aframe_pts = pts;\n\n    if (!hacf->sync || codec_ctx->sample_rate == 0) {\n        return NGX_OK;\n    }\n\n    /* align audio frames */\n\n    /* TODO: We assume here AAC frame size is 1024\n     *       Need to handle AAC frames with frame size of 960 */\n\n    est_pts = ctx->aframe_base + ctx->aframe_num * 90000 * 1024 /\n                                 codec_ctx->sample_rate;\n    dpts = (int64_t) (est_pts - pts);\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"hls: audio sync dpts=%L (%.5fs)\",\n                   dpts, dpts / 90000.);\n\n    if (dpts <= (int64_t) hacf->sync * 90 &&\n        dpts >= (int64_t) hacf->sync * -90)\n    {\n        ctx->aframe_num++;\n        ctx->aframe_pts = est_pts;\n        return NGX_OK;\n    }\n\n    ctx->aframe_base = pts;\n    ctx->aframe_num  = 1;\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"hls: audio sync gap dpts=%L (%.5fs)\",\n                   dpts, dpts / 90000.);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_video(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n    ngx_chain_t *in)\n{\n    ngx_rtmp_hls_app_conf_t        *hacf;\n    ngx_rtmp_hls_ctx_t             *ctx;\n    ngx_rtmp_codec_ctx_t           *codec_ctx;\n    u_char                         *p;\n    uint8_t                         fmt, ftype, htype, nal_type, src_nal_type;\n    uint32_t                        len, rlen;\n    ngx_buf_t                       out, *b;\n    uint32_t                        cts;\n    ngx_rtmp_mpegts_frame_t         frame;\n    ngx_uint_t                      nal_bytes;\n    ngx_int_t                       aud_sent, sps_pps_sent, boundary;\n    static u_char                   buffer[NGX_RTMP_HLS_BUFSIZE];\n    ngx_rtmp_core_app_conf_t       *cacf;\n\n    cacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_core_module);\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_hls_module);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_hls_module);\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    if (hacf == NULL || !hacf->hls || ctx == NULL || codec_ctx == NULL ||\n        codec_ctx->avc_header == NULL || h->mlen < 1)\n    {\n        return NGX_OK;\n    }\n\n    /* Only H264 is supported */\n    if (codec_ctx->video_codec_id != NGX_RTMP_VIDEO_H264 &&\n        codec_ctx->video_codec_id != cacf->hevc_codec)\n    {\n        return NGX_OK;\n    }\n\n    if (s->pause) {\n        return NGX_OK;\n    }\n\n    p = in->buf->pos;\n    if (ngx_rtmp_hls_copy(s, &fmt, &p, 1, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    /* 1: keyframe (IDR)\n     * 2: inter frame\n     * 3: disposable inter frame */\n\n    ftype = (fmt & 0xf0) >> 4;\n\n    /* H264 HDR/PICT */\n\n    if (ngx_rtmp_hls_copy(s, &htype, &p, 1, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    /* proceed only with PICT */\n\n    if (htype != 1) {\n        return NGX_OK;\n    }\n\n    /* 3 bytes: decoder delay */\n\n    if (ngx_rtmp_hls_copy(s, &cts, &p, 3, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    cts = ((cts & 0x00FF0000) >> 16) | ((cts & 0x000000FF) << 16) |\n          (cts & 0x0000FF00);\n\n    ngx_memzero(&out, sizeof(out));\n\n    out.start = buffer;\n    out.end = buffer + sizeof(buffer);\n    out.pos = out.start;\n    out.last = out.pos;\n\n    nal_bytes = codec_ctx->avc_nal_bytes;\n    aud_sent = 0;\n    sps_pps_sent = 0;\n\n    while (in) {\n        if (ngx_rtmp_hls_copy(s, &rlen, &p, nal_bytes, &in) != NGX_OK) {\n            return NGX_OK;\n        }\n\n        len = 0;\n        ngx_rtmp_rmemcpy(&len, &rlen, nal_bytes);\n\n        if (len == 0) {\n            continue;\n        }\n\n        if (ngx_rtmp_hls_copy(s, &src_nal_type, &p, 1, &in) != NGX_OK) {\n            return NGX_OK;\n        }\n\n        if (codec_ctx->video_codec_id == NGX_RTMP_VIDEO_H264) {\n            nal_type = src_nal_type & 0x1f;\n\n            ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"hls: h264 NAL type=%ui, len=%uD\",\n                       (ngx_uint_t) nal_type, len);\n\n            if (nal_type >= 7 && nal_type <= 9) {\n                if (ngx_rtmp_hls_copy(s, NULL, &p, len - 1, &in) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n                continue;\n            }\n\n            if (!aud_sent) {\n                switch (nal_type) {\n                    case 1:\n                    case 5:\n                    case 6:\n                        if (ngx_rtmp_hls_append_aud(s, &out) != NGX_OK) {\n                            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                                        \"hls: error appending AUD NAL\");\n                        }\n                        aud_sent = 1;\n                        break;\n\n                    case 9:\n                        aud_sent = 1;\n                        break;\n                }\n            }\n\n            switch (nal_type) {\n                case 1:\n                    sps_pps_sent = 0;\n                    break;\n                case 5:\n                    if (sps_pps_sent) {\n                        break;\n                    }\n                    if (ngx_rtmp_hls_append_sps_pps(s, &out) != NGX_OK) {\n                        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                                    \"hls: error appenging SPS/PPS NALs\");\n                    }\n                    sps_pps_sent = 1;\n                    break;\n            }\n        } else {\n            if (src_nal_type == 0) {\n                if (ngx_rtmp_hls_copy(s, out.last, &p, 3, &in) != NGX_OK) {\n                    ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                                    \"rtmp-hls: video| buffer error\");\n                    return NGX_ERROR;\n                }\n                if (out.last[0] == 0x00 && out.last[1] == 0x00 &&\n                    out.last[2] == 0x01)\n                {\n                    ngx_rtmp_hls_copy(s, &src_nal_type, &p, 1, &in);\n                    len -= 4;\n                } else {\n                    p -= 3;\n                }\n            }\n\n            nal_type = (src_nal_type >> 1) & 0x3f;\n\n            ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                        \"hls: h265 NAL type=%ui, len=%uD\",\n                        (ngx_uint_t) nal_type, len);\n\n            if (nal_type == 32      // VPS\n             || nal_type == 33      // SPS\n             || nal_type == 34      // PPS\n             || nal_type == 35      // AUD\n             )\n            {\n                if (ngx_rtmp_hls_copy(s, NULL, &p, len - 1, &in) != NGX_OK) {\n                    ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                        \"rtmp-hls: video| jump nal, failed copy \");\n                    return NGX_ERROR;\n                }\n                continue;\n            }\n\n            if (!aud_sent) {\n                if (ngx_rtmp_hls_append_hevc_aud(s, &out) != NGX_OK) {\n                    ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                                \"hls: error appending AUD NAL\");\n                }\n                aud_sent = 1;\n            }\n\n            if (!IS_IRAP(nal_type)) {\n                sps_pps_sent = 0;\n            } else if (!sps_pps_sent) {\n                if (ngx_rtmp_hls_append_hevc_vps_sps_pps(s, &out) != NGX_OK)\n                {\n                    ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                                \"hls: error appenging VPS/SPS/PPS NALs\");\n                }\n                sps_pps_sent = 1;\n            }\n        }\n\n        /* AnnexB prefix */\n\n        if (out.end - out.last < 5) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                          \"hls: not enough buffer for AnnexB prefix\");\n            return NGX_OK;\n        }\n\n        /* first AnnexB prefix is long (4 bytes) */\n\n        if (out.last == out.pos) {\n            *out.last++ = 0;\n        }\n\n        *out.last++ = 0;\n        *out.last++ = 0;\n        *out.last++ = 1;\n        *out.last++ = src_nal_type;\n\n        /* NAL body */\n\n        if (out.end - out.last < (ngx_int_t) len) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                          \"hls: not enough buffer for NAL\");\n            return NGX_OK;\n        }\n\n        if (ngx_rtmp_hls_copy(s, out.last, &p, len - 1, &in) != NGX_OK) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                        \"rtmp-hls: video| copy nal, failed copy, len %d, in %d\",\n                        len - 1, in->buf->last - in->buf->pos);\n            return NGX_ERROR;\n        }\n\n        out.last += (len - 1);\n    }\n\n    ngx_memzero(&frame, sizeof(frame));\n\n    frame.cc = ctx->video_cc;\n    frame.dts = (uint64_t) h->timestamp * 90;\n    frame.pts = frame.dts + cts * 90;\n    frame.pid = 0x100;\n    frame.sid = 0xe0;\n    frame.key = (ftype == 1);\n\n    /*\n     * start new fragment if\n     * - we have video key frame AND\n     * - we have audio buffered or have no audio at all or stream is closed\n     */\n\n    b = ctx->aframe;\n    boundary = frame.key && (codec_ctx->aac_header == NULL || !ctx->opened ||\n                             (b && b->last > b->pos));\n\n    ngx_rtmp_hls_update_fragment(s, frame.dts, boundary, 1);\n\n    if (!ctx->opened) {\n        return NGX_OK;\n    }\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"hls: video pts=%uL, dts=%uL\", frame.pts, frame.dts);\n\n    if (ngx_rtmp_mpegts_write_frame(&ctx->file, &frame, &out) != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"hls: video frame failed\");\n    }\n\n    ctx->video_cc = frame.cc;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_stream_begin(ngx_rtmp_session_t *s, ngx_rtmp_stream_begin_t *v)\n{\n    return next_stream_begin(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_stream_eof(ngx_rtmp_session_t *s, ngx_rtmp_stream_eof_t *v)\n{\n    ngx_rtmp_hls_flush_audio(s);\n\n    ngx_rtmp_hls_close_fragment(s);\n\n    return next_stream_eof(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_cleanup_dir(ngx_str_t *ppath, ngx_msec_t playlen)\n{\n    ngx_dir_t               dir;\n    time_t                  mtime, max_age;\n    ngx_err_t               err;\n    ngx_str_t               name, spath;\n    u_char                 *p;\n    ngx_int_t               nentries, nerased;\n    u_char                  path[NGX_MAX_PATH + 1];\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0,\n                   \"hls: cleanup path='%V' playlen=%M\",\n                   ppath, playlen);\n\n    if (ngx_open_dir(ppath, &dir) != NGX_OK) {\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, ngx_errno,\n                      \"hls: cleanup open dir failed '%V'\", ppath);\n        return NGX_ERROR;\n    }\n\n    nentries = 0;\n    nerased = 0;\n\n    for ( ;; ) {\n        ngx_set_errno(0);\n\n        if (ngx_read_dir(&dir) == NGX_ERROR) {\n            err = ngx_errno;\n\n            if (ngx_close_dir(&dir) == NGX_ERROR) {\n                ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, ngx_errno,\n                              \"hls: cleanup \" ngx_close_dir_n \" \\\"%V\\\" failed\",\n                              ppath);\n            }\n\n            if (err == NGX_ENOMOREFILES) {\n                return nentries - nerased;\n            }\n\n            ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, err,\n                          \"hls: cleanup \" ngx_read_dir_n\n                          \" '%V' failed\", ppath);\n            return NGX_ERROR;\n        }\n\n        name.data = ngx_de_name(&dir);\n        if (name.data[0] == '.') {\n            continue;\n        }\n\n        name.len = ngx_de_namelen(&dir);\n\n        p = ngx_snprintf(path, sizeof(path) - 1, \"%V/%V\", ppath, &name);\n        *p = 0;\n\n        spath.data = path;\n        spath.len = p - path;\n\n        nentries++;\n\n        if (!dir.valid_info && ngx_de_info(path, &dir) == NGX_FILE_ERROR) {\n            ngx_log_error(NGX_LOG_CRIT, ngx_cycle->log, ngx_errno,\n                          \"hls: cleanup \" ngx_de_info_n \" \\\"%V\\\" failed\",\n                          &spath);\n\n            continue;\n        }\n\n        if (ngx_de_is_dir(&dir)) {\n\n            if (ngx_rtmp_hls_cleanup_dir(&spath, playlen) == 0) {\n                ngx_log_debug1(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0,\n                               \"hls: cleanup dir '%V'\", &name);\n\n                /*\n                 * null-termination gets spoiled in win32\n                 * version of ngx_open_dir\n                 */\n\n                *p = 0;\n\n                if (ngx_delete_dir(path) == NGX_FILE_ERROR) {\n                    ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, ngx_errno,\n                                  \"hls: cleanup \" ngx_delete_dir_n\n                                  \" failed on '%V'\", &spath);\n                } else {\n                    nerased++;\n                }\n            }\n\n            continue;\n        }\n\n        if (!ngx_de_is_file(&dir)) {\n            continue;\n        }\n\n        if (name.len >= 3 && name.data[name.len - 3] == '.' &&\n                             name.data[name.len - 2] == 't' &&\n                             name.data[name.len - 1] == 's')\n        {\n            max_age = playlen / 500;\n\n        } else if (name.len >= 5 && name.data[name.len - 5] == '.' &&\n                                    name.data[name.len - 4] == 'm' &&\n                                    name.data[name.len - 3] == '3' &&\n                                    name.data[name.len - 2] == 'u' &&\n                                    name.data[name.len - 1] == '8')\n        {\n            max_age = playlen / 1000;\n\n        } else if (name.len >= 4 && name.data[name.len - 4] == '.' &&\n                                    name.data[name.len - 3] == 'k' &&\n                                    name.data[name.len - 2] == 'e' &&\n                                    name.data[name.len - 1] == 'y')\n        {\n            max_age = playlen / 500;\n\n        } else {\n            ngx_log_debug1(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0,\n                           \"hls: cleanup skip unknown file type '%V'\", &name);\n            continue;\n        }\n\n        mtime = ngx_de_mtime(&dir);\n        if (mtime + max_age > ngx_cached_time->sec) {\n            continue;\n        }\n\n        ngx_log_debug3(NGX_LOG_DEBUG_RTMP, ngx_cycle->log, 0,\n                       \"hls: cleanup '%V' mtime=%T age=%T\",\n                       &name, mtime, ngx_cached_time->sec - mtime);\n\n        if (ngx_delete_file(path) == NGX_FILE_ERROR) {\n            ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, ngx_errno,\n                          \"hls: cleanup \" ngx_delete_file_n \" failed on '%V'\",\n                          &spath);\n            continue;\n        }\n\n        nerased++;\n    }\n}\n\n\n#if (nginx_version >= 1011005)\nstatic ngx_msec_t\n#else\nstatic time_t\n#endif\nngx_rtmp_hls_cleanup(void *data)\n{\n    ngx_rtmp_hls_cleanup_t *cleanup = data;\n\n    ngx_rtmp_hls_cleanup_dir(&cleanup->path, cleanup->playlen);\n\n#if (nginx_version >= 1011005)\n    return cleanup->playlen * 2;\n#else\n    return cleanup->playlen / 500;\n#endif\n}\n\n\nstatic char *\nngx_rtmp_hls_variant(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_rtmp_hls_app_conf_t  *hacf = conf;\n\n    ngx_str_t                *value, *arg;\n    ngx_uint_t                n;\n    ngx_rtmp_hls_variant_t   *var;\n\n    value = cf->args->elts;\n\n    if (hacf->variant == NULL) {\n        hacf->variant = ngx_array_create(cf->pool, 1,\n                                         sizeof(ngx_rtmp_hls_variant_t));\n        if (hacf->variant == NULL) {\n            return NGX_CONF_ERROR;\n        }\n    }\n\n    var = ngx_array_push(hacf->variant);\n    if (var == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    ngx_memzero(var, sizeof(ngx_rtmp_hls_variant_t));\n\n    var->suffix = value[1];\n\n    if (cf->args->nelts == 2) {\n        return NGX_CONF_OK;\n    }\n\n    if (ngx_array_init(&var->args, cf->pool, cf->args->nelts - 2,\n                       sizeof(ngx_str_t))\n        != NGX_OK)\n    {\n        return NGX_CONF_ERROR;\n    }\n\n    arg = ngx_array_push_n(&var->args, cf->args->nelts - 2);\n    if (arg == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    for (n = 2; n < cf->args->nelts; n++) {\n        *arg++ = value[n];\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic void *\nngx_rtmp_hls_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_hls_app_conf_t *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_hls_app_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->hls = NGX_CONF_UNSET;\n    conf->fraglen = NGX_CONF_UNSET_MSEC;\n    conf->max_fraglen = NGX_CONF_UNSET_MSEC;\n    conf->muxdelay = NGX_CONF_UNSET_MSEC;\n    conf->sync = NGX_CONF_UNSET_MSEC;\n    conf->playlen = NGX_CONF_UNSET_MSEC;\n    conf->continuous = NGX_CONF_UNSET;\n    conf->nested = NGX_CONF_UNSET;\n    conf->naming = NGX_CONF_UNSET_UINT;\n    conf->slicing = NGX_CONF_UNSET_UINT;\n    conf->type = NGX_CONF_UNSET_UINT;\n    conf->max_audio_delay = NGX_CONF_UNSET_MSEC;\n    conf->audio_buffer_size = NGX_CONF_UNSET_SIZE;\n    conf->cleanup = NGX_CONF_UNSET;\n    conf->granularity = NGX_CONF_UNSET;\n    conf->keys = NGX_CONF_UNSET;\n    conf->frags_per_key = NGX_CONF_UNSET_UINT;\n\n    return conf;\n}\n\n\nstatic char *\nngx_rtmp_hls_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_rtmp_hls_app_conf_t    *prev = parent;\n    ngx_rtmp_hls_app_conf_t    *conf = child;\n    ngx_rtmp_hls_cleanup_t     *cleanup;\n\n    ngx_conf_merge_value(conf->hls, prev->hls, 0);\n    ngx_conf_merge_msec_value(conf->fraglen, prev->fraglen, 5000);\n    ngx_conf_merge_msec_value(conf->max_fraglen, prev->max_fraglen,\n                              conf->fraglen * 10);\n    ngx_conf_merge_msec_value(conf->muxdelay, prev->muxdelay, 700);\n    ngx_conf_merge_msec_value(conf->sync, prev->sync, 2);\n    ngx_conf_merge_msec_value(conf->playlen, prev->playlen, 30000);\n    ngx_conf_merge_value(conf->continuous, prev->continuous, 1);\n    ngx_conf_merge_value(conf->nested, prev->nested, 0);\n    ngx_conf_merge_uint_value(conf->naming, prev->naming,\n                              NGX_RTMP_HLS_NAMING_SEQUENTIAL);\n    ngx_conf_merge_uint_value(conf->slicing, prev->slicing,\n                              NGX_RTMP_HLS_SLICING_PLAIN);\n    ngx_conf_merge_uint_value(conf->type, prev->type,\n                              NGX_RTMP_HLS_TYPE_LIVE);\n    ngx_conf_merge_msec_value(conf->max_audio_delay, prev->max_audio_delay,\n                              300);\n    ngx_conf_merge_size_value(conf->audio_buffer_size, prev->audio_buffer_size,\n                              NGX_RTMP_HLS_BUFSIZE);\n    ngx_conf_merge_value(conf->cleanup, prev->cleanup, 1);\n    ngx_conf_merge_str_value(conf->base_url, prev->base_url, \"\");\n    ngx_conf_merge_value(conf->granularity, prev->granularity, 0);\n    ngx_conf_merge_value(conf->keys, prev->keys, 0);\n    ngx_conf_merge_str_value(conf->key_path, prev->key_path, \"\");\n    ngx_conf_merge_str_value(conf->key_url, prev->key_url, \"\");\n    ngx_conf_merge_uint_value(conf->frags_per_key, prev->frags_per_key, 0);\n\n    if (conf->fraglen) {\n        conf->winfrags = conf->playlen / conf->fraglen;\n    }\n\n    /* schedule cleanup */\n\n    if (conf->hls && conf->path.len && conf->cleanup &&\n        conf->type != NGX_RTMP_HLS_TYPE_EVENT)\n    {\n        if (conf->path.data[conf->path.len - 1] == '/') {\n            conf->path.len--;\n        }\n\n        cleanup = ngx_pcalloc(cf->pool, sizeof(*cleanup));\n        if (cleanup == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n        cleanup->path = conf->path;\n        cleanup->playlen = conf->playlen;\n\n        conf->slot = ngx_pcalloc(cf->pool, sizeof(*conf->slot));\n        if (conf->slot == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n        conf->slot->manager = ngx_rtmp_hls_cleanup;\n        conf->slot->name = conf->path;\n        conf->slot->data = cleanup;\n        conf->slot->conf_file = cf->conf_file->file.name.data;\n        conf->slot->line = cf->conf_file->line;\n\n        if (ngx_add_path(cf, &conf->slot) != NGX_OK) {\n            return NGX_CONF_ERROR;\n        }\n    }\n\n    ngx_conf_merge_str_value(conf->path, prev->path, \"\");\n\n    if (conf->keys && conf->cleanup && conf->key_path.len &&\n        ngx_strcmp(conf->key_path.data, conf->path.data) != 0 &&\n        conf->type != NGX_RTMP_HLS_TYPE_EVENT)\n    {\n        if (conf->key_path.data[conf->key_path.len - 1] == '/') {\n            conf->key_path.len--;\n        }\n\n        cleanup = ngx_pcalloc(cf->pool, sizeof(*cleanup));\n        if (cleanup == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n        cleanup->path = conf->key_path;\n        cleanup->playlen = conf->playlen;\n\n        conf->slot = ngx_pcalloc(cf->pool, sizeof(*conf->slot));\n        if (conf->slot == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n        conf->slot->manager = ngx_rtmp_hls_cleanup;\n        conf->slot->name = conf->key_path;\n        conf->slot->data = cleanup;\n        conf->slot->conf_file = cf->conf_file->file.name.data;\n        conf->slot->line = cf->conf_file->line;\n\n        if (ngx_add_path(cf, &conf->slot) != NGX_OK) {\n            return NGX_CONF_ERROR;\n        }\n    }\n\n    ngx_conf_merge_str_value(conf->key_path, prev->key_path, \"\");\n\n    if (conf->key_path.len == 0) {\n        conf->key_path = conf->path;\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_hls_postconfiguration(ngx_conf_t *cf)\n{\n    ngx_rtmp_core_main_conf_t   *cmcf;\n    ngx_rtmp_handler_pt         *h;\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]);\n    *h = ngx_rtmp_hls_video;\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]);\n    *h = ngx_rtmp_hls_audio;\n\n    next_publish = ngx_rtmp_publish;\n    ngx_rtmp_publish = ngx_rtmp_hls_publish;\n\n    next_close_stream = ngx_rtmp_close_stream;\n    ngx_rtmp_close_stream = ngx_rtmp_hls_close_stream;\n\n    next_stream_begin = ngx_rtmp_stream_begin;\n    ngx_rtmp_stream_begin = ngx_rtmp_hls_stream_begin;\n\n    next_stream_eof = ngx_rtmp_stream_eof;\n    ngx_rtmp_stream_eof = ngx_rtmp_hls_stream_eof;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/hls/ngx_rtmp_mpegts.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_mpegts.h\"\n\n\nu_char ngx_rtmp_mpegts_pat[] = {\n\n    /* TS */\n    0x47, 0x40, 0x00, 0x10, 0x00,\n    /* PSI */\n    0x00, 0xb0, 0x0d, 0x00, 0x01, 0xc1, 0x00, 0x00,\n    /* PAT */\n    0x00, 0x01, 0xf0, 0x01,\n    /* CRC */\n    0x2e, 0x70, 0x19, 0x05,\n    /* stuffing 167 bytes */\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff,\n    0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff\n};\n\n\nstatic u_char ngx_mpegts_ts_header[] = {\n    /* TS */\n    0x47, 0x50, 0x01, 0x10, 0x00\n};\n\nstatic u_char ngx_mpegts_pmt_header[] = {\n    /* PSI */\n    0x02, 0xb0, 0x17, 0x00, 0x01, 0xc1, 0x00, 0x00,\n    /* PMT */\n    0xe1, 0x00,\n    0xf0, 0x00\n};\n\n\nenum {\n    NGX_RTMP_MPEGTS_PID_H264 = 0,\n    NGX_RTMP_MPEGTS_PID_H265,\n    NGX_RTMP_MPEGTS_PID_AAC,\n    NGX_RTMP_MPEGTS_PID_MP3\n};\n\nstatic u_char ngx_mpegts_pid[4][5] = {\n    {0x1b, 0xe1, 0x00, 0xf0, 0x00}, /* h264 */\n    {0x24, 0xe1, 0x00, 0xf0, 0x00}, /* h265 */\n    {0x0f, 0xe1, 0x01, 0xf0, 0x00}, /* aac */\n    {0x03, 0xe1, 0x01, 0xf0, 0x00}  /* mp3 */\n};\n\n/* 700 ms PCR delay */\n#define NGX_RTMP_HLS_DELAY  63000\n\nstatic uint32_t crc32table[256] = {\n    0x00000000, 0x04c11db7, 0x09823b6e, 0x0d4326d9, 0x130476dc, 0x17c56b6b,\n    0x1a864db2, 0x1e475005, 0x2608edb8, 0x22c9f00f, 0x2f8ad6d6, 0x2b4bcb61,\n    0x350c9b64, 0x31cd86d3, 0x3c8ea00a, 0x384fbdbd, 0x4c11db70, 0x48d0c6c7,\n    0x4593e01e, 0x4152fda9, 0x5f15adac, 0x5bd4b01b, 0x569796c2, 0x52568b75,\n    0x6a1936c8, 0x6ed82b7f, 0x639b0da6, 0x675a1011, 0x791d4014, 0x7ddc5da3,\n    0x709f7b7a, 0x745e66cd, 0x9823b6e0, 0x9ce2ab57, 0x91a18d8e, 0x95609039,\n    0x8b27c03c, 0x8fe6dd8b, 0x82a5fb52, 0x8664e6e5, 0xbe2b5b58, 0xbaea46ef,\n    0xb7a96036, 0xb3687d81, 0xad2f2d84, 0xa9ee3033, 0xa4ad16ea, 0xa06c0b5d,\n    0xd4326d90, 0xd0f37027, 0xddb056fe, 0xd9714b49, 0xc7361b4c, 0xc3f706fb,\n    0xceb42022, 0xca753d95, 0xf23a8028, 0xf6fb9d9f, 0xfbb8bb46, 0xff79a6f1,\n    0xe13ef6f4, 0xe5ffeb43, 0xe8bccd9a, 0xec7dd02d, 0x34867077, 0x30476dc0,\n    0x3d044b19, 0x39c556ae, 0x278206ab, 0x23431b1c, 0x2e003dc5, 0x2ac12072,\n    0x128e9dcf, 0x164f8078, 0x1b0ca6a1, 0x1fcdbb16, 0x018aeb13, 0x054bf6a4,\n    0x0808d07d, 0x0cc9cdca, 0x7897ab07, 0x7c56b6b0, 0x71159069, 0x75d48dde,\n    0x6b93dddb, 0x6f52c06c, 0x6211e6b5, 0x66d0fb02, 0x5e9f46bf, 0x5a5e5b08,\n    0x571d7dd1, 0x53dc6066, 0x4d9b3063, 0x495a2dd4, 0x44190b0d, 0x40d816ba,\n    0xaca5c697, 0xa864db20, 0xa527fdf9, 0xa1e6e04e, 0xbfa1b04b, 0xbb60adfc,\n    0xb6238b25, 0xb2e29692, 0x8aad2b2f, 0x8e6c3698, 0x832f1041, 0x87ee0df6,\n    0x99a95df3, 0x9d684044, 0x902b669d, 0x94ea7b2a, 0xe0b41de7, 0xe4750050,\n    0xe9362689, 0xedf73b3e, 0xf3b06b3b, 0xf771768c, 0xfa325055, 0xfef34de2,\n    0xc6bcf05f, 0xc27dede8, 0xcf3ecb31, 0xcbffd686, 0xd5b88683, 0xd1799b34,\n    0xdc3abded, 0xd8fba05a, 0x690ce0ee, 0x6dcdfd59, 0x608edb80, 0x644fc637,\n    0x7a089632, 0x7ec98b85, 0x738aad5c, 0x774bb0eb, 0x4f040d56, 0x4bc510e1,\n    0x46863638, 0x42472b8f, 0x5c007b8a, 0x58c1663d, 0x558240e4, 0x51435d53,\n    0x251d3b9e, 0x21dc2629, 0x2c9f00f0, 0x285e1d47, 0x36194d42, 0x32d850f5,\n    0x3f9b762c, 0x3b5a6b9b, 0x0315d626, 0x07d4cb91, 0x0a97ed48, 0x0e56f0ff,\n    0x1011a0fa, 0x14d0bd4d, 0x19939b94, 0x1d528623, 0xf12f560e, 0xf5ee4bb9,\n    0xf8ad6d60, 0xfc6c70d7, 0xe22b20d2, 0xe6ea3d65, 0xeba91bbc, 0xef68060b,\n    0xd727bbb6, 0xd3e6a601, 0xdea580d8, 0xda649d6f, 0xc423cd6a, 0xc0e2d0dd,\n    0xcda1f604, 0xc960ebb3, 0xbd3e8d7e, 0xb9ff90c9, 0xb4bcb610, 0xb07daba7,\n    0xae3afba2, 0xaafbe615, 0xa7b8c0cc, 0xa379dd7b, 0x9b3660c6, 0x9ff77d71,\n    0x92b45ba8, 0x9675461f, 0x8832161a, 0x8cf30bad, 0x81b02d74, 0x857130c3,\n    0x5d8a9099, 0x594b8d2e, 0x5408abf7, 0x50c9b640, 0x4e8ee645, 0x4a4ffbf2,\n    0x470cdd2b, 0x43cdc09c, 0x7b827d21, 0x7f436096, 0x7200464f, 0x76c15bf8,\n    0x68860bfd, 0x6c47164a, 0x61043093, 0x65c52d24, 0x119b4be9, 0x155a565e,\n    0x18197087, 0x1cd86d30, 0x029f3d35, 0x065e2082, 0x0b1d065b, 0x0fdc1bec,\n    0x3793a651, 0x3352bbe6, 0x3e119d3f, 0x3ad08088, 0x2497d08d, 0x2056cd3a,\n    0x2d15ebe3, 0x29d4f654, 0xc5a92679, 0xc1683bce, 0xcc2b1d17, 0xc8ea00a0,\n    0xd6ad50a5, 0xd26c4d12, 0xdf2f6bcb, 0xdbee767c, 0xe3a1cbc1, 0xe760d676,\n    0xea23f0af, 0xeee2ed18, 0xf0a5bd1d, 0xf464a0aa, 0xf9278673, 0xfde69bc4,\n    0x89b8fd09, 0x8d79e0be, 0x803ac667, 0x84fbdbd0, 0x9abc8bd5, 0x9e7d9662,\n    0x933eb0bb, 0x97ffad0c, 0xafb010b1, 0xab710d06, 0xa6322bdf, 0xa2f33668,\n    0xbcb4666d, 0xb8757bda, 0xb5365d03, 0xb1f740b4\n};\n\n\nuint32_t\nngx_rtmp_mpegts_crc32(u_char *crc_buf, const u_char *data, int len)\n{\n    int        i;\n    uint32_t   crc = 0xFFFFFFFF;\n\n    for(i = 0; i < len; i++) {\n        crc = (crc << 8) ^ crc32table[((crc >> 24) ^ *data++) & 0xFF];\n    }\n\n    crc_buf[0] = (crc & 0xff000000) >> 24;\n    crc_buf[1] = (crc & 0x00ff0000) >> 16;\n    crc_buf[2] = (crc & 0x0000ff00) >> 8;\n    crc_buf[3] = crc & 0x000000ff;\n\n    return crc;\n}\n\n\nngx_int_t\nngx_rtmp_mpegts_gen_pmt(ngx_int_t vcodec, ngx_int_t acodec,\n    ngx_log_t *log, u_char *pmt)\n{\n    u_char      *p, crc_buf[4], *pmt_pos;\n    ngx_int_t    vpid, apid;\n    u_char       section_length;\n\n    vpid = -1;\n    apid = -1;\n\n    if (vcodec == acodec && vcodec == 0) {\n        return NGX_ERROR;\n    }\n\n    p = pmt;\n    p = ngx_cpymem(p, ngx_mpegts_ts_header, sizeof(ngx_mpegts_ts_header));\n    pmt_pos = p;\n\n    p = ngx_cpymem(p, ngx_mpegts_pmt_header, sizeof(ngx_mpegts_pmt_header));\n\n    if (vcodec == 0) {\n        // ignore\n    } else if (vcodec ==  NGX_RTMP_VIDEO_H264) {\n        vpid = NGX_RTMP_MPEGTS_PID_H264;\n    } else if (vcodec == NGX_RTMP_HEVC_CODEC_ID) {\n        vpid = NGX_RTMP_MPEGTS_PID_H265;\n    } else if (log) {\n        ngx_log_error(NGX_LOG_ERR, log, 0,\n            \"rtmp: gen_pmt| unknown video codec (%d)\", vcodec);\n    }\n\n    switch (acodec) {\n        case 0: //ignore\n        break;\n\n        case NGX_RTMP_AUDIO_MP3:\n            apid = NGX_RTMP_MPEGTS_PID_MP3;\n        break;\n\n        case NGX_RTMP_AUDIO_AAC:\n            apid = NGX_RTMP_MPEGTS_PID_AAC;\n        break;\n\n        default:\n            if (log) {\n                ngx_log_error(NGX_LOG_ERR, log, 0,\n                    \"rtmp: gen_pmt| unknown video codec (%d)\", vcodec);\n            }\n    }\n\n    section_length = 13;\n    if (vpid != -1) {\n        p = ngx_cpymem(p, ngx_mpegts_pid[vpid], 5);\n        section_length += 5;\n    }\n\n    if (apid != -1) {\n        p = ngx_cpymem(p, ngx_mpegts_pid[apid], 5);\n        section_length += 5;\n    }\n\n    pmt_pos[2] = section_length;\n\n    ngx_rtmp_mpegts_crc32(crc_buf, pmt_pos, p - pmt_pos);\n    p = ngx_cpymem(p, crc_buf, 4);\n\n    ngx_memset(p, 0xff, 188 - (p - pmt));\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_mpegts_write_file(ngx_rtmp_mpegts_file_t *file, u_char *in,\n    size_t in_size)\n{\n    u_char   *out;\n    size_t    out_size, n;\n    ssize_t   rc;\n\n    static u_char  buf[1024];\n\n    if (!file->encrypt) {\n        ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,\n                       \"mpegts: write %uz bytes\", in_size);\n\n        if (file->whandle == NULL) {\n            rc = ngx_write_fd(file->fd, in, in_size);\n            if (rc < 0) {\n                return NGX_ERROR;\n            }\n\n            file->file_size += rc;\n        } else {\n            rc = file->whandle(file, in, in_size);\n            if (rc < 0) {\n                return NGX_ERROR;\n            }\n        }\n\n        return NGX_OK;\n    }\n\n    /* encrypt */\n\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, file->log, 0,\n                   \"mpegts: write %uz encrypted bytes\", in_size);\n\n    out = buf;\n    out_size = sizeof(buf);\n\n    if (file->size > 0 && file->size + in_size >= 16) {\n        ngx_memcpy(file->buf + file->size, in, 16 - file->size);\n\n        in += 16 - file->size;\n        in_size -= 16 - file->size;\n\n        AES_cbc_encrypt(file->buf, out, 16, &file->key, file->iv, AES_ENCRYPT);\n\n        out += 16;\n        out_size -= 16;\n\n        file->size = 0;\n    }\n\n    for ( ;; ) {\n        n = in_size & ~0x0f;\n\n        if (n > 0) {\n            if (n > out_size) {\n                n = out_size;\n            }\n\n            AES_cbc_encrypt(in, out, n, &file->key, file->iv, AES_ENCRYPT);\n\n            in += n;\n            in_size -= n;\n\n        } else if (out == buf) {\n            break;\n        }\n\n        rc = ngx_write_fd(file->fd, buf, out - buf + n);\n        if (rc < 0) {\n            return NGX_ERROR;\n        }\n\n        out = buf;\n        out_size = sizeof(buf);\n    }\n\n    if (in_size) {\n        ngx_memcpy(file->buf + file->size, in, in_size);\n        file->size += in_size;\n    }\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_mpegts_write_header(ngx_rtmp_mpegts_file_t *file)\n{\n    ngx_int_t       ret;\n    u_char          pmt[188];\n\n    ret = ngx_rtmp_mpegts_write_file(file, ngx_rtmp_mpegts_pat,\n                               sizeof(ngx_rtmp_mpegts_pat));\n    if (ret != NGX_OK) {\n        return ret;\n    }\n\n    if (ngx_rtmp_mpegts_gen_pmt(file->vcodec,\n        file->acodec, file->log, pmt) != NGX_OK)\n    {\n        return NGX_ERROR;\n    }\n\n    return ngx_rtmp_mpegts_write_file(file, pmt, sizeof(pmt));\n}\n\n\nstatic u_char *\nngx_rtmp_mpegts_write_pcr(u_char *p, uint64_t pcr)\n{\n    *p++ = (u_char) (pcr >> 25);\n    *p++ = (u_char) (pcr >> 17);\n    *p++ = (u_char) (pcr >> 9);\n    *p++ = (u_char) (pcr >> 1);\n    *p++ = (u_char) (pcr << 7 | 0x7e);\n    *p++ = 0;\n\n    return p;\n}\n\n\nstatic u_char *\nngx_rtmp_mpegts_write_pts(u_char *p, ngx_uint_t fb, uint64_t pts)\n{\n    ngx_uint_t val;\n\n    val = fb << 4 | (((pts >> 30) & 0x07) << 1) | 1;\n    *p++ = (u_char) val;\n\n    val = (((pts >> 15) & 0x7fff) << 1) | 1;\n    *p++ = (u_char) (val >> 8);\n    *p++ = (u_char) val;\n\n    val = (((pts) & 0x7fff) << 1) | 1;\n    *p++ = (u_char) (val >> 8);\n    *p++ = (u_char) val;\n\n    return p;\n}\n\n\nngx_int_t\nngx_rtmp_mpegts_write_frame(ngx_rtmp_mpegts_file_t *file,\n    ngx_rtmp_mpegts_frame_t *f, ngx_buf_t *b)\n{\n    ngx_uint_t  pes_size, header_size, body_size, in_size, stuff_size, flags;\n    u_char      packet[188], *p, *base;\n    ngx_int_t   first, rc;\n\n    ngx_log_debug6(NGX_LOG_DEBUG_CORE, file->log, 0,\n                   \"mpegts: pid=%ui, sid=%ui, pts=%uL, \"\n                   \"dts=%uL, key=%ui, size=%ui\",\n                   f->pid, f->sid, f->pts, f->dts,\n                   (ngx_uint_t) f->key, (size_t) (b->last - b->pos));\n\n    first = 1;\n\n    while (b->pos < b->last) {\n        p = packet;\n\n        f->cc++;\n\n        *p++ = 0x47;\n        *p++ = (u_char) (f->pid >> 8);\n\n        if (first) {\n            p[-1] |= 0x40;\n        }\n\n        *p++ = (u_char) f->pid;\n        *p++ = 0x10 | (f->cc & 0x0f); /* payload */\n\n        if (first) {\n\n            if (f->key) {\n                packet[3] |= 0x20; /* adaptation */\n\n                *p++ = 7;    /* size */\n                *p++ = 0x50; /* random access + PCR */\n\n                p = ngx_rtmp_mpegts_write_pcr(p, f->dts - NGX_RTMP_HLS_DELAY);\n            }\n\n            /* PES header */\n\n            *p++ = 0x00;\n            *p++ = 0x00;\n            *p++ = 0x01;\n            *p++ = (u_char) f->sid;\n\n            header_size = 5;\n            flags = 0x80; /* PTS */\n\n            if (f->dts != f->pts) {\n                header_size += 5;\n                flags |= 0x40; /* DTS */\n            }\n\n            pes_size = (b->last - b->pos) + header_size + 3;\n            if (pes_size > 0xffff) {\n                pes_size = 0;\n            }\n\n            *p++ = (u_char) (pes_size >> 8);\n            *p++ = (u_char) pes_size;\n            *p++ = 0x80; /* H222 */\n            *p++ = (u_char) flags;\n            *p++ = (u_char) header_size;\n\n            p = ngx_rtmp_mpegts_write_pts(p, flags >> 6, f->pts +\n                                                         NGX_RTMP_HLS_DELAY);\n\n            if (f->dts != f->pts) {\n                p = ngx_rtmp_mpegts_write_pts(p, 1, f->dts +\n                                                    NGX_RTMP_HLS_DELAY);\n            }\n\n            first = 0;\n        }\n\n        body_size = (ngx_uint_t) (packet + sizeof(packet) - p);\n        in_size = (ngx_uint_t) (b->last - b->pos);\n\n        if (body_size <= in_size) {\n            ngx_memcpy(p, b->pos, body_size);\n            b->pos += body_size;\n\n        } else {\n            stuff_size = (body_size - in_size);\n\n            if (packet[3] & 0x20) {\n\n                /* has adaptation */\n\n                base = &packet[5] + packet[4];\n                p = ngx_movemem(base + stuff_size, base, p - base);\n                ngx_memset(base, 0xff, stuff_size);\n                packet[4] += (u_char) stuff_size;\n\n            } else {\n\n                /* no adaptation */\n\n                packet[3] |= 0x20;\n                p = ngx_movemem(&packet[4] + stuff_size, &packet[4],\n                                p - &packet[4]);\n\n                packet[4] = (u_char) (stuff_size - 1);\n                if (stuff_size >= 2) {\n                    packet[5] = 0;\n                    ngx_memset(&packet[6], 0xff, stuff_size - 2);\n                }\n            }\n\n            ngx_memcpy(p, b->pos, in_size);\n            b->pos = b->last;\n        }\n\n        rc = ngx_rtmp_mpegts_write_file(file, packet, sizeof(packet));\n        if (rc != NGX_OK) {\n            return rc;\n        }\n    }\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_mpegts_init_encryption(ngx_rtmp_mpegts_file_t *file,\n    u_char *key, size_t key_len, uint64_t iv)\n{\n    if (AES_set_encrypt_key(key, key_len * 8, &file->key)) {\n        return NGX_ERROR;\n    }\n\n    ngx_memzero(file->iv, 8);\n\n    file->iv[8]  = (u_char) (iv >> 56);\n    file->iv[9]  = (u_char) (iv >> 48);\n    file->iv[10] = (u_char) (iv >> 40);\n    file->iv[11] = (u_char) (iv >> 32);\n    file->iv[12] = (u_char) (iv >> 24);\n    file->iv[13] = (u_char) (iv >> 16);\n    file->iv[14] = (u_char) (iv >> 8);\n    file->iv[15] = (u_char) (iv);\n\n    file->encrypt = 1;\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_mpegts_open_file(ngx_rtmp_mpegts_file_t *file, u_char *path,\n    ngx_log_t *log)\n{\n    file->log = log;\n\n    file->fd = ngx_open_file(path, NGX_FILE_WRONLY, NGX_FILE_TRUNCATE,\n                             NGX_FILE_DEFAULT_ACCESS);\n\n    if (file->fd == NGX_INVALID_FILE) {\n        ngx_log_error(NGX_LOG_ERR, log, ngx_errno,\n                      \"hls: error creating fragment file\");\n        return NGX_ERROR;\n    }\n\n    file->size = 0;\n\n    if (ngx_rtmp_mpegts_write_header(file) != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, log, ngx_errno,\n                      \"hls: error writing fragment header\");\n        ngx_close_file(file->fd);\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_mpegts_close_file(ngx_rtmp_mpegts_file_t *file)\n{\n    u_char   buf[16];\n    ssize_t  rc;\n\n    if (file->encrypt) {\n        ngx_memset(file->buf + file->size, 16 - file->size, 16 - file->size);\n\n        AES_cbc_encrypt(file->buf, buf, 16, &file->key, file->iv, AES_ENCRYPT);\n\n        rc = ngx_write_fd(file->fd, buf, 16);\n        if (rc < 0) {\n            return NGX_ERROR;\n        }\n    }\n\n    ngx_close_file(file->fd);\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/hls/ngx_rtmp_mpegts.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#ifndef _NGX_RTMP_MPEGTS_H_INCLUDED_\n#define _NGX_RTMP_MPEGTS_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <openssl/aes.h>\n\n\ntypedef struct ngx_rtmp_mpegts_file_s  ngx_rtmp_mpegts_file_t;\n\n\ntypedef ssize_t (*ngx_rtmp_mpegts_write_pt) (ngx_rtmp_mpegts_file_t *file,\n        u_char *in, size_t in_size);\n\n\nstruct ngx_rtmp_mpegts_file_s {\n    ngx_fd_t    fd;\n    ngx_log_t  *log;\n    off_t       file_size;\n    unsigned    encrypt:1;\n    unsigned    size:4;\n    u_char      buf[16];\n    u_char      iv[16];\n    AES_KEY     key;\n    ngx_int_t   acodec;\n    ngx_int_t   vcodec;\n    ngx_buf_t   wbuf;\n    ngx_rtmp_mpegts_write_pt whandle;\n};\n\n\ntypedef struct {\n    uint64_t    pts;\n    uint64_t    dts;\n    ngx_uint_t  pid;\n    ngx_uint_t  sid;\n    ngx_uint_t  cc;\n    unsigned    key:1;\n} ngx_rtmp_mpegts_frame_t;\n\n\nngx_int_t ngx_rtmp_mpegts_init_encryption(ngx_rtmp_mpegts_file_t *file,\n    u_char *key, size_t key_len, uint64_t iv);\nngx_int_t ngx_rtmp_mpegts_open_file(ngx_rtmp_mpegts_file_t *file, u_char *path,\n    ngx_log_t *log);\nngx_int_t ngx_rtmp_mpegts_close_file(ngx_rtmp_mpegts_file_t *file);\nngx_int_t ngx_rtmp_mpegts_write_header(ngx_rtmp_mpegts_file_t *file);\nngx_int_t ngx_rtmp_mpegts_write_frame(ngx_rtmp_mpegts_file_t *file,\n    ngx_rtmp_mpegts_frame_t *f, ngx_buf_t *b);\n\n#endif /* _NGX_RTMP_MPEGTS_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/http/ngx_http_flv_live_module.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_event.h>\n#include <ngx_http.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_cmd_module.h\"\n#include \"ngx_rbuf.h\"\n#include \"ngx_http_set_header.h\"\n#include \"ngx_rtmp_monitor_module.h\"\n\n\nstatic char *ngx_http_flv_live(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\n\nstatic void *ngx_http_flv_live_create_loc_conf(ngx_conf_t *cf);\nstatic char *ngx_http_flv_live_merge_loc_conf(ngx_conf_t *cf, void *parent,\n       void *child);\n\nstatic u_char  ngx_flv_live_audio_header[] = \"FLV\\x1\\x1\\0\\0\\0\\x9\\0\\0\\0\\0\";\nstatic u_char  ngx_flv_live_video_header[] = \"FLV\\x1\\x4\\0\\0\\0\\x9\\0\\0\\0\\0\";\nstatic u_char  ngx_flv_live_av_header[] = \"FLV\\x1\\x5\\0\\0\\0\\x9\\0\\0\\0\\0\";\n\nstatic ngx_keyval_t ngx_http_flv_live_headers[] = {\n    { ngx_string(\"Cache-Control\"),  ngx_string(\"no-cache\") },\n    { ngx_string(\"Content-Type\"),   ngx_string(\"video/x-flv\") },\n    { ngx_null_string, ngx_null_string }\n};\n\n#define NGX_FLV_TAG_SIZE        11\n#define NGX_FLV_PTS_SIZE        4\n\ntypedef struct {\n    ngx_rtmp_session_t         *session;\n} ngx_http_flv_live_ctx_t;\n\ntypedef struct {\n    ngx_str_t                   app;\n    ngx_str_t                   flashver;\n    ngx_str_t                   swf_url;\n    ngx_str_t                   tc_url;\n    ngx_str_t                   page_url;\n    ngx_uint_t                  audio;\n    ngx_uint_t                  video;\n\n    ngx_rtmp_addr_conf_t       *addr_conf;\n} ngx_http_flv_live_loc_conf_t;\n\n\nstatic ngx_command_t  ngx_http_flv_live_commands[] = {\n\n    { ngx_string(\"flv_live\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE123,\n      ngx_http_flv_live,\n      NGX_HTTP_LOC_CONF_OFFSET,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_http_flv_live_module_ctx = {\n    NULL,                               /* preconfiguration */\n    NULL,                               /* postconfiguration */\n\n    NULL,                               /* create main configuration */\n    NULL,                               /* init main configuration */\n\n    NULL,                               /* create server configuration */\n    NULL,                               /* merge server configuration */\n\n    ngx_http_flv_live_create_loc_conf,  /* create location configuration */\n    ngx_http_flv_live_merge_loc_conf    /* merge location configuration */\n};\n\n\nngx_module_t  ngx_http_flv_live_module = {\n    NGX_MODULE_V1,\n    &ngx_http_flv_live_module_ctx,      /* module context */\n    ngx_http_flv_live_commands,         /* module directives */\n    NGX_HTTP_MODULE,                    /* module type */\n    NULL,                               /* init master */\n    NULL,                               /* init module */\n    NULL,                               /* init process */\n    NULL,                               /* init thread */\n    NULL,                               /* exit thread */\n    NULL,                               /* exit process */\n    NULL,                               /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_int_t\nngx_http_flv_live_send_header(ngx_http_request_t *r)\n{\n    ngx_int_t                           rc;\n    ngx_keyval_t                       *h;\n    ngx_buf_t                          *b;\n    ngx_chain_t                         out;\n    ngx_http_flv_live_loc_conf_t       *hflcf;\n\n    if (r->header_sent) {\n        return NGX_OK;\n    }\n\n    hflcf = ngx_http_get_module_loc_conf(r, ngx_http_flv_live_module);\n\n    r->headers_out.status = NGX_HTTP_OK;\n    r->keepalive = 0; /* set Connection to closed */\n\n    h = ngx_http_flv_live_headers;\n    while (h->key.len) {\n        rc = ngx_http_set_header_out(r, &h->key, &h->value);\n        if (rc != NGX_OK) {\n            return rc;\n        }\n        ++h;\n    }\n\n    rc = ngx_http_send_header(r);\n    if (rc == NGX_ERROR || rc > NGX_OK) {\n        return rc;\n    }\n\n    b = ngx_pcalloc(r->pool, sizeof(ngx_buf_t));\n    if (b == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    switch (hflcf->audio | (hflcf->video << 1)) {\n        case 1: // audio only\n            b->start = b->pos = ngx_flv_live_audio_header;\n            b->end = b->last = ngx_flv_live_audio_header +\n                sizeof(ngx_flv_live_audio_header) - 1;\n        break;\n\n        case 2: // video only\n            b->start = b->pos = ngx_flv_live_video_header;\n            b->end = b->last = ngx_flv_live_video_header +\n                sizeof(ngx_flv_live_video_header) - 1;\n        break;\n\n        case 3: // audio and video\n            b->start = b->pos = ngx_flv_live_av_header;\n            b->end = b->last = ngx_flv_live_av_header +\n                sizeof(ngx_flv_live_av_header) - 1;\n        break;\n\n        default:\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                \"flv-live: send_header| av header config error.\");\n\n            return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    b->memory = 1;\n\n    out.buf = b;\n    out.next = NULL;\n\n    return ngx_http_output_filter(r, &out);\n}\n\nstatic ngx_chain_t *\nngx_http_flv_live_prepare_out_chain(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_frame_t                   *frame;\n    ngx_chain_t                        *head, **ll, *cl;\n    u_char                             *p;\n    size_t                              datasize, prev_tag_size;\n\n    frame = NULL;\n    head = NULL;\n    datasize = 0;\n\n    while (s->out_pos != s->out_last) {\n        frame = s->out[s->out_pos];\n        if (frame->hdr.type != NGX_RTMP_MSG_VIDEO\n                && frame->hdr.type != NGX_RTMP_MSG_AUDIO\n                && frame->hdr.type != NGX_RTMP_MSG_AMF_META\n                && frame->hdr.type != NGX_RTMP_MSG_AMF3_META)\n        {\n            ngx_rtmp_shared_free_frame(frame);\n            ++s->out_pos;\n            s->out_pos %= s->out_queue;\n            frame = NULL;\n\n            continue;\n        }\n        break;\n    }\n\n    /* no frame to send */\n    if (frame == NULL) {\n        return NULL;\n    }\n\n    for (ll = &head; *ll; ll = &(*ll)->next);\n\n    for (cl = frame->chain; cl; cl = cl->next) {\n        datasize += (cl->buf->last - cl->buf->pos);\n    }\n    prev_tag_size = datasize + NGX_FLV_TAG_SIZE;\n\n    /* flv tag header */\n    *ll = ngx_get_chainbuf(NGX_FLV_TAG_SIZE, 1);\n    if (*ll == NULL) {\n        goto falied;\n    }\n    p = (*ll)->buf->pos;\n\n    /* TagType 1 byte */\n    *p++ = frame->hdr.type;\n\n    /* DataSize 3 bytes */\n    *p++ = ((u_char *) &datasize)[2];\n    *p++ = ((u_char *) &datasize)[1];\n    *p++ = ((u_char *) &datasize)[0];\n\n    /* Timestamp 4 bytes */\n    *p++ = ((u_char *) &frame->hdr.timestamp)[2];\n    *p++ = ((u_char *) &frame->hdr.timestamp)[1];\n    *p++ = ((u_char *) &frame->hdr.timestamp)[0];\n    *p++ = ((u_char *) &frame->hdr.timestamp)[3];\n\n    /* StreamID 4 bytes, always set to 0 */\n    *p++ = 0;\n    *p++ = 0;\n    *p++ = 0;\n\n    (*ll)->buf->last = p;\n    ll = &(*ll)->next;\n\n    /* flv payload */\n    for (cl = frame->chain; cl; cl = cl->next) {\n        (*ll) = ngx_get_chainbuf(0, 0);\n        if (*ll == NULL) {\n            goto falied;\n        }\n        (*ll)->buf->pos = cl->buf->pos;\n        (*ll)->buf->last = cl->buf->last;\n        ll = &(*ll)->next;\n    }\n\n    /* flv previous tag size */\n    *ll = ngx_get_chainbuf(NGX_FLV_PTS_SIZE, 1);\n    if (*ll == NULL) {\n        goto falied;\n    }\n    p = (*ll)->buf->pos;\n\n    *p++ = ((u_char *) &prev_tag_size)[3];\n    *p++ = ((u_char *) &prev_tag_size)[2];\n    *p++ = ((u_char *) &prev_tag_size)[1];\n    *p++ = ((u_char *) &prev_tag_size)[0];\n\n    (*ll)->buf->last = p;\n    (*ll)->buf->flush = 1;\n\n    ngx_rtmp_monitor_frame(s, &frame->hdr, NULL, frame->av_header, 0);\n\n    return head;\n\nfalied:\n    ngx_put_chainbufs(head);\n\n    ngx_rtmp_finalize_session(s);\n    return NULL;\n}\n\nstatic void\nngx_http_flv_live_write_handler(ngx_http_request_t *r)\n{\n    ngx_http_flv_live_ctx_t            *ctx;\n    ngx_rtmp_session_t                 *s;\n    ngx_event_t                        *wev;\n    size_t                              present, sent;\n    ngx_int_t                           rc;\n    ngx_chain_t                        *cl;\n\n    wev = r->connection->write;\n\n    if (r->connection->destroyed) {\n        return;\n    }\n\n    ctx = ngx_http_get_module_ctx(r, ngx_http_flv_live_module);\n    s = ctx->session;\n\n    if (wev->timedout) {\n        ngx_log_error(NGX_LOG_INFO, r->connection->log, NGX_ETIMEDOUT,\n                \"http flv live, client timed out\");\n        r->connection->timedout = 1;\n        s->finalize_reason = NGX_LIVE_FLV_SEND_TIMEOUT;\n        if (r->header_sent) {\n            ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);\n        } else {\n            r->error_page = 1;\n            ngx_http_finalize_request(r, NGX_HTTP_SERVICE_UNAVAILABLE);\n        }\n\n        return;\n    }\n\n    if (wev->timer_set) {\n        ngx_del_timer(wev);\n    }\n\n    if (ngx_rtmp_core_main_conf->fast_reload && (ngx_exiting || ngx_terminate)) {\n        r->error_page = 1;\n        ngx_http_finalize_request(r, NGX_HTTP_SERVICE_UNAVAILABLE);\n        return;\n    }\n\n    if (ngx_rtmp_prepare_merge_frame(s) == NGX_ERROR) {\n        ngx_http_finalize_request(r, NGX_ERROR);\n        return;\n    }\n\n    if (s->out_chain) {\n        rc = ngx_http_flv_live_send_header(r);\n        if (rc == NGX_ERROR || rc > NGX_OK) {\n            s->finalize_reason = NGX_LIVE_FLV_SEND_ERR;\n            ngx_http_finalize_request(r, rc);\n            return;\n        }\n    }\n\n    while (s->out_chain) {\n        present = r->connection->sent;\n\n        if (r->connection->buffered) {\n            rc = ngx_http_output_filter(r, NULL);\n        } else {\n            rc = ngx_http_output_filter(r, s->out_chain);\n        }\n\n        sent = r->connection->sent - present;\n\n        ngx_rtmp_update_bandwidth(&ngx_rtmp_bw_out, sent);\n\n        if (rc == NGX_AGAIN) {\n            ngx_add_timer(wev, s->timeout);\n            if (ngx_handle_write_event(wev, 0) != NGX_OK) {\n                ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,\n                        \"http flv live, handle write event failed\");\n                ngx_http_finalize_request(r, NGX_ERROR);\n            }\n            return;\n        }\n\n        if (rc == NGX_ERROR) {\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,\n                    \"http flv live, send error\");\n            s->finalize_reason = NGX_LIVE_FLV_SEND_ERR;\n            ngx_http_finalize_request(r, NGX_ERROR);\n            return;\n        }\n\n        /* NGX_OK */\n        for (cl = s->out_chain; cl;) {\n            s->out_chain = cl->next;\n            ngx_free_chain(s->pool, cl);\n            cl = s->out_chain;\n        }\n\n        if (ngx_rtmp_prepare_merge_frame(s) == NGX_ERROR) {\n            ngx_http_finalize_request(r, NGX_ERROR);\n            return;\n        }\n    }\n\n    if (wev->active) {\n        ngx_del_event(wev, NGX_WRITE_EVENT, 0);\n    }\n}\n\n\nstatic void\nngx_http_flv_live_parse_url(ngx_http_request_t *r, ngx_str_t *app,\n        ngx_str_t *name)\n{\n    u_char                             *p, *end, *pos;\n\n    p = r->uri.data + 1; /* skip '/' */\n    end = r->uri.data + r->uri.len;\n    app->data = p;\n\n    pos = ngx_strnstr(p, \".flv\", end - p);\n    if (pos) {\n        end = pos;\n    }\n\n    p = (u_char *) ngx_strnstr(p, \"/\", end - p);\n    while (p) {\n        name->data = p;\n        p = (u_char *) ngx_strnstr(p + 1, \"/\", end - p);\n    }\n\n    if (name->data == NULL) {\n        return;\n    }\n\n    app->len = name->data - app->data;\n\n    ++name->data;\n    name->len = end - name->data;\n}\n\nstatic ngx_int_t\nngx_http_flv_live_parse(ngx_http_request_t *r, ngx_rtmp_session_t *s,\n        ngx_rtmp_play_t *v)\n{\n    ngx_http_flv_live_loc_conf_t       *hflcf;\n    ngx_str_t                           app, stream;\n    size_t                              tcurl_len;\n    u_char                             *p;\n\n    hflcf = ngx_http_get_module_loc_conf(r, ngx_http_flv_live_module);\n\n    ngx_memzero(&app, sizeof(ngx_str_t));\n    ngx_memzero(&stream, sizeof(ngx_str_t));\n\n    ngx_http_flv_live_parse_url(r, &app, &stream);\n\n    if (app.len == 0 || stream.len == 0 || stream.len > NGX_RTMP_MAX_NAME) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                \"http flv live, url error: %V\", &r->uri);\n        return NGX_HTTP_BAD_REQUEST;\n    }\n\n    if (hflcf->app.len) {\n        app = hflcf->app;\n    }\n\n    if (ngx_http_arg(r, (u_char *) \"flashver\", 8, &s->flashver) != NGX_OK) {\n        s->flashver = hflcf->flashver;\n    }\n\n    ngx_http_arg(r, (u_char *) \"app\", 3, &app);\n\n    s->app = app;\n\n    /* tc_url */\n#if (NGX_HTTP_SSL)\n    if (r->connection->ssl) {\n        tcurl_len = sizeof(\"https://\") - 1;\n    } else\n#endif\n    {\n        tcurl_len = sizeof(\"http://\") - 1;\n    }\n    tcurl_len += r->headers_in.server.len + 1 + app.len;\n\n    s->tc_url.len = tcurl_len;\n    s->tc_url.data = ngx_pcalloc(r->pool, tcurl_len);\n    if (s->tc_url.data == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    p = s->tc_url.data;\n\n#if (NGX_HTTP_SSL)\n    if (r->connection->ssl) {\n        p = ngx_cpymem(p, \"https://\", sizeof(\"https://\") - 1);\n    } else\n#endif\n    {\n        p = ngx_cpymem(p, \"http://\", sizeof(\"http://\") - 1);\n    }\n\n    p = ngx_cpymem(p, r->headers_in.server.data, r->headers_in.server.len);\n    *p++ = '/';\n    p = ngx_cpymem(p, app.data, app.len);\n\n    /* page_url */\n    if (r->headers_in.referer) {\n        s->page_url = r->headers_in.referer->value;\n    } else {\n        s->page_url = hflcf->page_url;\n    }\n\n    s->acodecs = 0x0DF7;\n    s->vcodecs = 0xFC;\n\n    ngx_memcpy(v->name, stream.data, stream.len);\n\n    if (r->args.len) {\n        ngx_memcpy(v->args, r->args.data,\n                ngx_min(r->args.len, NGX_RTMP_MAX_ARGS));\n    }\n\n    ngx_rtmp_cmd_middleware_init(s);\n\n    return NGX_OK;\n}\n\nstatic void\nngx_http_flv_live_cleanup(void *data)\n{\n    ngx_http_request_t                 *r;\n    ngx_http_flv_live_ctx_t            *ctx;\n\n    r = data;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_http_flv_live_module);\n\n    if (ctx == NULL) {\n        return;\n    }\n\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n            \"http flv live, cleanup\");\n\n    if (ctx->session) {\n        ctx->session->request = NULL;\n\n        if (ctx->session->finalize_reason == 0) {\n            ctx->session->finalize_reason = r->connection->read->error?\n                                            NGX_LIVE_FLV_RECV_ERR:\n                                            NGX_LIVE_NORMAL_CLOSE;\n        }\n\n        ngx_rtmp_finalize_fake_session(ctx->session);\n    }\n}\n\nstatic ngx_int_t\nngx_http_flv_live_handler(ngx_http_request_t *r)\n{\n    ngx_http_flv_live_loc_conf_t       *hflcf;\n    ngx_http_flv_live_ctx_t            *ctx;\n    ngx_rtmp_session_t                 *s;\n    ngx_rtmp_play_t                     v;\n    ngx_int_t                           rc;\n    ngx_uint_t                          n;\n    ngx_rtmp_core_srv_conf_t           *cscf;\n    ngx_rtmp_core_app_conf_t          **cacfp;\n    ngx_http_cleanup_t                 *cln;\n    ngx_rtmp_core_main_conf_t          *cmcf;\n\n    rc = ngx_http_discard_request_body(r);\n\n    if (rc != NGX_OK) {\n        return rc;\n    }\n\n    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_flv_live_ctx_t));\n    if (ctx == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n    ngx_http_set_ctx(r, ctx, ngx_http_flv_live_module);\n\n    /* cleanup handler */\n    cln = ngx_http_cleanup_add(r, 0);\n    if (cln == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n    cln->handler = ngx_http_flv_live_cleanup;\n    cln->data = r;\n\n    hflcf = ngx_http_get_module_loc_conf(r, ngx_http_flv_live_module);\n\n    /* create fake session */\n    s = ngx_rtmp_create_session(hflcf->addr_conf);\n    if (s == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n    s->connection = r->connection;\n    s->number = r->connection->number;\n    s->remote_addr_text.data = ngx_pcalloc(s->pool, r->connection->addr_text.len);\n    s->remote_addr_text.len = r->connection->addr_text.len;\n    ngx_memcpy(s->remote_addr_text.data,\n        r->connection->addr_text.data, r->connection->addr_text.len);\n    ngx_rtmp_set_combined_log(s, r->connection->log->data,\n            r->connection->log->handler);\n    s->log->connection = r->connection->number;\n    ctx->session = s;\n\n    /* get host, app, stream name */\n    ngx_memzero(&v, sizeof(ngx_rtmp_play_t));\n    rc = ngx_http_flv_live_parse(r, s, &v);\n    if (rc != NGX_OK) {\n        return rc;\n    }\n\n    if (ngx_rtmp_set_virtual_server(s, &s->domain)) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n\n    s->live_type = NGX_HTTP_FLV_LIVE;\n    s->live_server = ngx_live_create_server(&s->serverid);\n    s->request = r;\n\n    v.silent = 1;\n\n    cacfp = cscf->applications.elts;\n    for (n = 0; n < cscf->applications.nelts; ++n, ++cacfp) {\n        if ((*cacfp)->name.len == s->app.len &&\n            ngx_strncmp((*cacfp)->name.data, s->app.data, s->app.len) == 0)\n        {\n            /* found app! */\n            s->app_conf = (*cacfp)->app_conf;\n            break;\n        }\n    }\n\n    if (s->app_conf == NULL) {\n\n        if (cscf->default_app == NULL || cscf->default_app->app_conf == NULL) {\n            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n                    \"http flv live, application not found '%V'\", &s->app);\n            return NGX_HTTP_NOT_FOUND;\n        }\n\n        s->app_conf = cscf->default_app->app_conf;\n    }\n\n    s->prepare_handler = ngx_http_flv_live_prepare_out_chain;\n\n    s->stage = NGX_LIVE_PLAY;\n    s->ptime = ngx_current_msec;\n\n    cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module);\n    s->variables = ngx_pcalloc(s->pool, cmcf->variables.nelts\n            * sizeof(ngx_http_variable_value_t));\n    if (s->variables == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    if (ngx_rtmp_play_filter(s, &v) != NGX_OK) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    ngx_add_timer(r->connection->write, s->timeout);\n\n    r->read_event_handler = ngx_http_test_reading;\n    r->write_event_handler = ngx_http_flv_live_write_handler;\n\n    ++r->count;\n\n    return NGX_DONE;\n}\n\n\nstatic void *\nngx_http_flv_live_create_loc_conf(ngx_conf_t *cf)\n{\n    ngx_http_flv_live_loc_conf_t       *hflcf;\n\n    hflcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_flv_live_loc_conf_t));\n    if (hflcf == NULL) {\n        return NULL;\n    }\n\n    return hflcf;\n}\n\nstatic char *\nngx_http_flv_live_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_http_flv_live_loc_conf_t       *prev = parent;\n    ngx_http_flv_live_loc_conf_t       *conf = child;\n\n    ngx_conf_merge_str_value(conf->app, prev->app, \"\");\n    ngx_conf_merge_str_value(conf->flashver, prev->flashver, \"\");\n    ngx_conf_merge_str_value(conf->swf_url, prev->swf_url, \"\");\n    ngx_conf_merge_str_value(conf->tc_url, prev->tc_url, \"\");\n    ngx_conf_merge_str_value(conf->page_url, prev->page_url, \"\");\n\n    return NGX_CONF_OK;\n}\n\nstatic char *\nngx_http_flv_live(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t           *clcf;\n    ngx_http_flv_live_loc_conf_t       *hflcf;\n    ngx_str_t                          *value, v;\n    ngx_uint_t                          i;\n    ngx_uint_t                          audio, video;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_http_flv_live_handler;\n\n    hflcf = conf;\n\n    value = cf->args->elts;\n\n    hflcf->addr_conf = ngx_rtmp_find_related_addr_conf(cf->cycle, &value[1]);\n    if (hflcf->addr_conf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    audio = NGX_CONF_UNSET_UINT;\n    video = NGX_CONF_UNSET_UINT;\n\n    for (i = 2; i < cf->args->nelts; ++i) {\n        if (ngx_strncmp(value[i].data, \"app=\", 4) == 0) {\n            v.data = value[i].data + 4;\n            v.len = value[i].len - 4;\n            hflcf->app = v;\n        } else if (ngx_strncmp(value[i].data, \"audio=\", 6) == 0) {\n            v.data = value[i].data + 6;\n            v.len = value[i].len - 6;\n            audio = ngx_atoi(v.data, v.len);\n        } else if (ngx_strncmp(value[i].data, \"video=\", 6) == 0) {\n            v.data = value[i].data + 6;\n            v.len = value[i].len - 6;\n            video = ngx_atoi(v.data, v.len);\n        } else {\n            return NGX_CONF_ERROR;\n        }\n    }\n\n    if (audio == NGX_CONF_UNSET_UINT) {\n        audio = 1;\n    }\n\n    if (video == NGX_CONF_UNSET_UINT) {\n        video = 1;\n    }\n\n    hflcf->audio = audio;\n    hflcf->video = video;\n\n    return NGX_CONF_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/http/ngx_http_set_header.c",
    "content": "#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n\ntypedef struct ngx_http_header_val_s  ngx_http_header_val_t;\n\ntypedef ngx_int_t (*ngx_http_set_header_pt)(ngx_http_request_t *r,\n    ngx_http_header_val_t *hv, ngx_str_t *value);\n\nstruct ngx_http_header_val_s {\n    ngx_http_complex_value_t                value;\n    ngx_uint_t                              hash;\n    ngx_str_t                               key;\n    ngx_http_set_header_pt                  handler;\n    ngx_uint_t                              offset;\n};\n\ntypedef struct {\n    ngx_str_t                               name;\n    ngx_uint_t                              offset;\n    ngx_http_set_header_pt                  handler;\n\n} ngx_http_set_header_t;\n\n//TODO need fill all header set in future\n/* for header has no quick link in ngx_http_headers_out_t */\nstatic ngx_int_t ngx_http_set_header_out_other(ngx_http_request_t *r,\n    ngx_http_header_val_t *hv, ngx_str_t *value);\n/* for header has quick link like ngx_table_elt_t* in ngx_http_headers_out_t */\nstatic ngx_int_t ngx_http_set_header_out_builtin(ngx_http_request_t *r,\n    ngx_http_header_val_t *hv, ngx_str_t *value);\n/* for header has quick link like ngx_array_t in ngx_http_headers_out_t */\nstatic ngx_int_t ngx_http_set_header_out_builtin_multi(ngx_http_request_t *r,\n    ngx_http_header_val_t *hv, ngx_str_t *value);\n/* for header has quick link like ngx_table_elt_t* and\n * other attribute in ngx_http_headers_out_t defined below */\nstatic ngx_int_t ngx_http_set_header_out_content_type(ngx_http_request_t *r,\n    ngx_http_header_val_t *hv, ngx_str_t *value);\n\nstatic ngx_http_set_header_t  ngx_http_set_header_out_handlers[] = {\n\n    { ngx_string(\"Server\"),\n                 offsetof(ngx_http_headers_out_t, server),\n                 ngx_http_set_header_out_builtin },\n\n    { ngx_string(\"Date\"),\n                 offsetof(ngx_http_headers_out_t, date),\n                 ngx_http_set_header_out_builtin },\n\n    { ngx_string(\"Content-Type\"),\n                 offsetof(ngx_http_headers_out_t, content_type),\n                 ngx_http_set_header_out_content_type },\n\n    { ngx_string(\"Cache-Control\"),\n                 offsetof(ngx_http_headers_out_t, cache_control),\n                 ngx_http_set_header_out_builtin_multi },\n\n    { ngx_null_string, 0, ngx_http_set_header_out_other }\n};\n\nstatic ngx_int_t\nngx_http_set_header_out_helper(ngx_http_request_t *r,\n    ngx_http_header_val_t *hv, ngx_str_t *value, unsigned no_create)\n{\n    ngx_table_elt_t             *h;\n    ngx_list_part_t             *part;\n    ngx_uint_t                   i;\n\n    part = &r->headers_out.headers.part;\n    h = part->elts;\n\n    for (i = 0; /* void */; ++i) {\n\n        if (i >= part->nelts) {\n            if (part->next == NULL) {\n                break;\n            }\n\n            part = part->next;\n            h = part->elts;\n            i = 0;\n        }\n\n        if (h[i].hash != 0\n            && h[i].key.len == hv->key.len\n            && ngx_strncasecmp(hv->key.data, h[i].key.data, h[i].key.len) == 0)\n            /* header has been set */\n        {\n            h[i].value = *value;\n            if (value->len == 0) { /* if value is empty, remove header */\n                h[i].hash = 0;\n            } else {\n                h[i].hash = hv->hash;\n            }\n\n            return NGX_OK;\n        }\n    }\n\n    if (no_create && value->len == 0) { /* set header to empty but header cannot found */\n        return NGX_OK;\n    }\n\n    /* header has not been set, create it */\n\n    h = ngx_list_push(&r->headers_out.headers);\n\n    if (h == NULL) {\n        return NGX_ERROR;\n    }\n\n    h->hash = hv->hash;\n    h->key = hv->key;\n    h->value = *value;\n\n    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);\n    if (h->lowcase_key == NULL) {\n        return NGX_ERROR;\n    }\n\n    ngx_strlow(h->lowcase_key, h->key.data, h->key.len);\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_http_set_header_out_other(ngx_http_request_t * r,\n    ngx_http_header_val_t * hv,ngx_str_t * value)\n{\n    return ngx_http_set_header_out_helper(r, hv, value, 0);\n}\n\n\nstatic ngx_int_t\nngx_http_set_header_out_builtin(ngx_http_request_t *r,\n    ngx_http_header_val_t *hv, ngx_str_t *value)\n{\n    ngx_table_elt_t  *h, **old;\n\n    if (hv->offset) {\n        old = (ngx_table_elt_t **) ((char *) &r->headers_out + hv->offset);\n    } else {\n        old = NULL;\n    }\n\n    if (old == NULL || *old == NULL) {\n    /* user should use ngx_http_set_header_out_other but use this func to set header */\n        //TODO\n        return ngx_http_set_header_out_helper(r, hv, value, 0);\n    }\n\n    h = *old;\n\n    h->value = *value;\n    if (value->len == 0) { /* if value is empty, remove header */\n\n        h->hash = 0;\n        return NGX_OK;\n    }\n\n    h->hash = hv->hash;\n    h->key = hv->key;\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_http_set_header_out_builtin_multi(ngx_http_request_t *r,\n    ngx_http_header_val_t *hv, ngx_str_t *value)\n{\n    ngx_array_t      *pa;\n    ngx_table_elt_t  *ho, **ph;\n    ngx_uint_t        i;\n\n    pa = (ngx_array_t *) ((char *) &r->headers_out + hv->offset);\n\n    if (pa->elts == NULL) {\n        if (ngx_array_init(pa, r->pool, 2, sizeof(ngx_table_elt_t *))\n            != NGX_OK)\n        {\n            return NGX_ERROR;\n        }\n    }\n\n    if (pa->nelts > 0) {\n        ph = pa->elts;\n        for (i = 1; i < pa->nelts; i++) { /* clear old value */\n            ph[i]->hash = 0;\n            ph[i]->value.len = 0;\n        }\n\n        ph[0]->value = *value;\n\n        if (value->len == 0) {\n            ph[0]->hash = 0;\n        } else {\n            ph[0]->hash = hv->hash;\n        }\n\n        return NGX_OK;\n    }\n\n    /* header does not set */\n    ph = ngx_array_push(pa);\n    if (ph == NULL) {\n        return NGX_ERROR;\n    }\n\n    ho = ngx_list_push(&r->headers_out.headers);\n    if (ho == NULL) {\n        return NGX_ERROR;\n    }\n\n    ho->value = *value;\n    ho->hash = hv->hash;\n    ho->key = hv->key;\n    *ph = ho;\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_http_set_header_out_content_type(ngx_http_request_t *r,\n    ngx_http_header_val_t *hv, ngx_str_t *value)\n{\n    ngx_uint_t          i;\n\n    r->headers_out.content_type_len = value->len;\n\n    for (i = 0; i < value->len; i++) {\n        if (value->data[i] == ';') {\n            r->headers_out.content_type_len = i;\n            break;\n        }\n    }\n\n    r->headers_out.content_type = *value;\n    r->headers_out.content_type_hash = hv->hash;\n    r->headers_out.content_type_lowcase = NULL;\n\n    value->len = 0;\n\n    return ngx_http_set_header_out_helper(r, hv, value, 1);\n}\n\nngx_int_t\nngx_http_set_header_out(ngx_http_request_t *r, ngx_str_t *key, ngx_str_t *value)\n{\n    ngx_http_header_val_t           hv;\n    ngx_http_set_header_t          *handlers = ngx_http_set_header_out_handlers;\n    ngx_uint_t                      i;\n    ngx_str_t                       v;\n\n    hv.hash = ngx_hash_key_lc(key->data, key->len);\n    hv.key = *key;\n\n    hv.offset = 0;\n    hv.handler = NULL;\n\n    for (i = 0; handlers[i].name.len; ++i) {\n        if (hv.key.len != handlers[i].name.len\n            || ngx_strncasecmp(hv.key.data, handlers[i].name.data,\n                               handlers[i].name.len) != 0) {\n            continue;\n        }\n\n        /* match handler */\n        hv.offset = handlers[i].offset;\n        hv.handler = handlers[i].handler;\n\n        break;\n    }\n\n    if (handlers[i].name.len == 0 && handlers[i].handler) { /* if not matched, use ngx_http_set_header as default*/\n        hv.offset = handlers[i].offset;\n        hv.handler = handlers[i].handler;\n    }\n\n    v = *value;\n\n    return hv.handler(r, &hv, &v);\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/http/ngx_http_set_header.h",
    "content": "#ifndef _NGX_RTMP_HTTP_HEADER_OUT_H_INCLUDED_\n#define _NGX_RTMP_HTTP_HEADER_OUT_H_INCLUDED_\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n\nngx_int_t ngx_http_set_header_out(ngx_http_request_t *r,\n    ngx_str_t *key, ngx_str_t *value);\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/mpegts/ngx_hls_http_module.c",
    "content": "\n/*\n * Copyright (C) Pingo (cczjp89@gmail.com)\n */\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include <ngx_rtmp.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <math.h>\n#include <ngx_rtmp_cmd_module.h>\n#include \"ngx_http_set_header.h\"\n#include \"ngx_mpegts_live_module.h\"\n#include \"ngx_hls_live_module.h\"\n#include \"ngx_rbuf.h\"\n#include \"ngx_rtmp_dynamic.h\"\n\n#ifndef NGX_HTTP_GONE\n#define NGX_HTTP_GONE 410\n#endif\n\nstatic ngx_keyval_t ngx_302_headers[] = {\n    { ngx_string(\"Location\"),  ngx_null_string },\n    { ngx_null_string, ngx_null_string }\n};\n\nstatic ngx_keyval_t ngx_m3u8_headers[] = {\n    { ngx_string(\"Cache-Control\"),  ngx_string(\"no-cache\") },\n    { ngx_string(\"Content-Type\"),   ngx_string(\"application/vnd.apple.mpegurl\") },\n    { ngx_null_string, ngx_null_string }\n};\n\nstatic ngx_keyval_t ngx_ts_headers[] = {\n    { ngx_string(\"Cache-Control\"),  ngx_string(\"no-cache\") },\n    { ngx_string(\"Content-Type\"),   ngx_string(\"video/mp2t\") },\n    { ngx_null_string, ngx_null_string }\n};\n\n\ntypedef struct {\n    ngx_str_t                   app;\n    ngx_str_t                   name;\n    ngx_str_t                   stream;\n    ngx_str_t                   serverid;\n    ngx_str_t                   sid;\n    ngx_rtmp_session_t         *session;\n    ngx_msec_t                  timeout;\n    ngx_uint_t                  content_pos;\n    ngx_chain_t                *m3u8;\n    ngx_uint_t                  out_pos;\n    ngx_uint_t                  out_last;\n    ngx_chain_t                *out_chain;\n    ngx_hls_live_frag_t        *frag;\n} ngx_hls_http_ctx_t;\n\n\ntypedef struct {\n    ngx_str_t                   app;\n    ngx_str_t                   flashver;\n    ngx_str_t                   swf_url;\n    ngx_str_t                   tc_url;\n    ngx_str_t                   page_url;\n\tngx_msec_t                  timeout;\n    ngx_rtmp_addr_conf_t       *addr_conf;\n} ngx_hls_http_loc_conf_t;\n\nstatic u_char  NGX_HLS_LIVE_ARG_SESSION[] = \"session\";\n\nstatic ngx_int_t NGX_HLS_LIVE_ARG_SESSION_LENGTH = 7;\n\nstatic void * ngx_hls_http_create_loc_conf(ngx_conf_t *cf);\nstatic char * ngx_hls_http_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child);\nstatic char * ngx_http_hls(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\n//static char * ngx_hls_http_variant(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\nstatic ngx_int_t ngx_hls_http_postconfiguration(ngx_conf_t *cf);\n\nstatic ngx_command_t  ngx_hls_http_commands[] = {\n\n    { ngx_string(\"hls2_live\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,\n      ngx_http_hls,\n      NGX_HTTP_LOC_CONF_OFFSET,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\nstatic ngx_http_module_t  ngx_hls_http_module_ctx = {\n    NULL,                               /* preconfiguration */\n    ngx_hls_http_postconfiguration,     /* postconfiguration */\n\n    NULL,                               /* create main configuration */\n    NULL,                               /* init main configuration */\n\n    NULL,                               /* create server configuration */\n    NULL,                               /* merge server configuration */\n\n    ngx_hls_http_create_loc_conf,  /* create location configuration */\n    ngx_hls_http_merge_loc_conf    /* merge location configuration */\n};\n\nngx_module_t  ngx_hls_http_module = {\n    NGX_MODULE_V1,\n    &ngx_hls_http_module_ctx,      /* module context */\n    ngx_hls_http_commands,         /* module directives */\n    NGX_HTTP_MODULE,                    /* module type */\n    NULL,                               /* init master */\n    NULL,                               /* init module */\n    NULL,                               /* init process */\n    NULL,                               /* init thread */\n    NULL,                               /* exit thread */\n    NULL,                               /* exit process */\n    NULL,                               /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\nstatic void *\nngx_hls_http_create_loc_conf(ngx_conf_t *cf)\n{\n    ngx_hls_http_loc_conf_t       *hlcf;\n\n    hlcf = ngx_pcalloc(cf->pool, sizeof(ngx_hls_http_loc_conf_t));\n    if (hlcf == NULL) {\n        return NULL;\n    }\n\n    return hlcf;\n}\n\nstatic char *\nngx_hls_http_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_hls_http_loc_conf_t       *prev = parent;\n    ngx_hls_http_loc_conf_t       *conf = child;\n\n\tngx_conf_merge_str_value(conf->app, prev->app, \"\");\n    ngx_conf_merge_str_value(conf->flashver, prev->flashver, \"\");\n    ngx_conf_merge_str_value(conf->swf_url, prev->swf_url, \"\");\n    ngx_conf_merge_str_value(conf->tc_url, prev->tc_url, \"\");\n    ngx_conf_merge_str_value(conf->page_url, prev->page_url, \"\");\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_hls_http_ctx_init(ngx_http_request_t *r, ngx_rtmp_addr_conf_t *addr_conf)\n{\n    u_char                             *p, *e;\n    ngx_buf_t                          *buf;\n    ngx_rtmp_core_srv_conf_t           *cscf;\n    ngx_hls_http_loc_conf_t            *hlcf;\n    ngx_hls_http_ctx_t                 *ctx;\n    ngx_str_t                          *app, *name, *stream, *domain, *serverid;\n    ngx_int_t                           rc;\n\n    hlcf = ngx_http_get_module_loc_conf(r, ngx_hls_http_module);\n    ctx = ngx_http_get_module_ctx(r, ngx_hls_http_module);\n\n    app = &ctx->app;\n    name = &ctx->name;\n    stream = &ctx->stream;\n    serverid = &ctx->serverid;\n    domain = &r->headers_in.server;\n\n    p = r->uri.data;\n    e = r->uri.data + r->uri.len;\n\n    p++;\n    app->data = p;\n    p = ngx_strlchr(p, e, '/');\n    if (p == NULL) {\n        app->data = NULL;\n        app->len = 0;\n\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: ctx_init| invalid uri, lack of app\");\n\n        return NGX_ERROR;\n    }\n    app->len = p - app->data;\n\n    if (hlcf->app.len > 0 && hlcf->app.data) {\n        *app = hlcf->app;\n    }\n\n    p++;\n    name->data = p;\n    if (ngx_strncmp(&e[-5], \".m3u8\", 5) == 0) {\n        p = ngx_strlchr(p, e, '.');\n    } else if (ngx_strncmp(&e[-3], \".ts\", 3) == 0) {\n        p = ngx_strlchr(p, e, '-');\n    } else {\n        p = NULL;\n    }\n\n    if (p == NULL) {\n        name->data = NULL;\n        name->len = 0;\n\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: ctx_init| invalid uri, lack of name\");\n\n        return NGX_ERROR;\n    }\n    name->len = p - name->data;\n\n    cscf = addr_conf->default_server->\n            ctx->srv_conf[ngx_rtmp_core_module.ctx_index];\n\n    rc = ngx_rtmp_find_virtual_server(addr_conf->virtual_names, domain, &cscf);\n    if (rc != NGX_OK && rc != NGX_DECLINED) {\n\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: ctx_init| server(%V) not found.\", domain);\n\n        return NGX_ERROR;\n    }\n\n    if (cscf && cscf->serverid.len) {\n        serverid->data = ngx_pcalloc(r->connection->pool, cscf->serverid.len);\n        if (serverid->data == NULL) {\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                \"hls-http: ctx_init| pcalloc failed.\");\n            return NGX_ERROR;\n        }\n        serverid->len = cscf->serverid.len;\n        ngx_memcpy(serverid->data, cscf->serverid.data, cscf->serverid.len);\n    } else {\n        *serverid = *domain;\n    }\n\n    buf = ngx_create_temp_buf(r->connection->pool,\n                              serverid->len + 1 + app->len + name->len + 1);\n    buf->last = ngx_slprintf(buf->start, buf->end,\n        \"%V/%V/%V\", serverid, app, name);\n\n    stream->data = buf->pos;\n    stream->len = buf->last - buf->pos;\n\n    ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0,\n            \"hls-http: ctx_init| hls stream (%V).\", stream);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_hls_http_send_header(ngx_http_request_t *r, ngx_uint_t status, ngx_keyval_t *h)\n{\n    ngx_int_t                           rc;\n\n    r->headers_out.status = status;\n//    r->keepalive = 0; /* set Connection to closed */\n\n    //set eTag\n    if (ngx_http_set_etag(r) != NGX_OK) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    while (h && h->key.len) {\n        rc = ngx_http_set_header_out(r, &h->key, &h->value);\n        if (rc != NGX_OK) {\n            return rc;\n        }\n        ++h;\n    }\n\n    return ngx_http_send_header(r);\n}\n\nstatic ngx_int_t\nngx_hls_http_master_m3u8_handler(ngx_http_request_t *r,\n    ngx_rtmp_addr_conf_t *addr_conf)\n{\n\n    ngx_int_t                            rc;\n    ngx_str_t                            m3u8_url;\n    ngx_str_t                            host;\n    u_char                               sstr[NGX_RTMP_MAX_SESSION] = {0};\n    static ngx_uint_t                    sindex = 0;\n    ngx_str_t                            location = ngx_string(\"\");\n    ngx_str_t                            uri;\n    ngx_str_t                            uri_tail;\n    ngx_buf_t                           *m3u8;\n    ngx_chain_t                          out;\n    ngx_str_t                            scheme = ngx_string(\"\");\n    ngx_str_t                            http = ngx_string(\"http\");\n    ngx_str_t                            https = ngx_string(\"https\");\n    u_char                              *p;\n\n    host = r->headers_in.host->value;\n\n    rc = ngx_http_discard_request_body(r);\n    if (rc != NGX_OK) {\n        return rc;\n    }\n\n    *ngx_snprintf(sstr, sizeof(sstr) - 1, \"%uDt-%uDi-%dp-%uDc\",\n             time(NULL), sindex++, ngx_process_slot, r->connection->number) = 0;\n\n    ngx_http_arg(r, (u_char*)\"location\", 8, &location);\n    if (location.len == 0) {\n        uri = r->uri;\n    } else {\n        uri_tail.data =\n        ngx_strlchr(r->uri.data + 1, r->uri.data + r->uri.len - 1, '/');\n        if (uri_tail.data == NULL) {\n            uri_tail = r->uri;\n        } else {\n            uri_tail.len = r->uri.data+r->uri.len - uri_tail.data;\n        }\n\n        uri.len = location.len + uri_tail.len;\n        uri.data = ngx_pcalloc(r->pool, uri.len);\n        if (uri.data == NULL) {\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                \"hls-http: master_m3u8_handler| pcalloc uri buffer failed\");\n            return NGX_HTTP_INTERNAL_SERVER_ERROR;\n        }\n        ngx_snprintf(uri.data, uri.len, \"%V%V\", &location, &uri_tail);\n    }\n\n    ngx_http_arg(r, (u_char*)\"scheme\", 6, &scheme);\n    if (scheme.len == 0) {\n#if (NGX_HTTP_SSL)\n        if (r->connection->ssl) {\n            scheme = https;\n        } else\n#endif\n        {\n            scheme = http;\n        }\n    }\n\n    m3u8_url.len = scheme.len + ngx_strlen(\"://\") +\n            host.len +\n            uri.len +\n            NGX_HLS_LIVE_ARG_SESSION_LENGTH + 2 +\n            ngx_strlen(sstr);\n\n    if (r->args.len > 0) {\n        m3u8_url.len += 1 + r->args.len;\n    }\n\n    m3u8_url.data = ngx_pcalloc(r->connection->pool, m3u8_url.len);\n\n    p = ngx_snprintf(m3u8_url.data, m3u8_url.len, \"%V://%V%V?%s=%s\",\n                &scheme, &host, &uri, NGX_HLS_LIVE_ARG_SESSION, sstr);\n\n    if (r->args.len > 0) {\n        ngx_slprintf(p, m3u8_url.data + m3u8_url.len, \"&%V\", &r->args);\n    }\n\n    m3u8 = ngx_create_temp_buf(r->connection->pool, 64 * 1024);\n    m3u8->memory = 1;\n    m3u8->flush = 1;\n    out.buf = m3u8;\n    out.next = NULL;\n\n    m3u8->last = ngx_snprintf(m3u8->pos, m3u8->end - m3u8->start,\n        \"#EXTM3U\\n\"\n        \"#EXT-X-STREAM-INF:BANDWIDTH=1,AVERAGE-BANDWIDTH=1\\n\"\n        //\"#EXT-X-STREAM-INF:PROGRAM-ID=1,BANDWIDTH=1\\n\"\n        \"%V\\n\", &m3u8_url);\n\n    r->headers_out.content_length_n = m3u8->last - m3u8->pos;\n\n    rc = ngx_hls_http_send_header(r, NGX_HTTP_OK, ngx_m3u8_headers);\n    if (rc != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: master_m3u8_handler| \"\n            \"send header failed, redirect url: %V, rc=%d\", &m3u8_url, rc);\n    } else {\n        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n                \"hls-http: master_m3u8_handler| redirect url %V\", &m3u8_url);\n    }\n\n    return ngx_http_output_filter(r, &out);\n}\n\nstatic ngx_int_t\nngx_hls_http_redirect_handler(ngx_http_request_t *r,\n    ngx_rtmp_addr_conf_t *addr_conf)\n{\n    ngx_int_t                            rc;\n    ngx_str_t                            m3u8_url;\n    ngx_str_t                            host;\n    u_char                               sstr[NGX_RTMP_MAX_SESSION] = {0};\n    static ngx_uint_t                    sindex = 0;\n    ngx_str_t                            location = ngx_string(\"\");\n    ngx_str_t                            uri;\n    ngx_str_t                            uri_tail;\n    ngx_str_t                            scheme = ngx_string(\"\");\n    ngx_str_t                            http = ngx_string(\"http\");\n    ngx_str_t                            https = ngx_string(\"https\");\n    u_char                              *p;\n\n    host = r->headers_in.host->value;\n\n    rc = ngx_http_discard_request_body(r);\n    if (rc != NGX_OK) {\n        return rc;\n    }\n\n    *ngx_snprintf(sstr, sizeof(sstr) - 1, \"%uDt-%uDi-%dp-%uDc\",\n             time(NULL), sindex++, ngx_process_slot, r->connection->number) = 0;\n\n    ngx_http_arg(r, (u_char*)\"location\", 8, &location);\n    if (location.len == 0) {\n        uri = r->uri;\n    } else {\n        uri_tail.data =\n        ngx_strlchr(r->uri.data + 1, r->uri.data + r->uri.len - 1, '/');\n        if (uri_tail.data == NULL) {\n            uri_tail = r->uri;\n        } else {\n            uri_tail.len = r->uri.data+r->uri.len - uri_tail.data;\n        }\n\n        uri.len = location.len + uri_tail.len;\n        uri.data = ngx_pcalloc(r->pool, uri.len);\n        if (uri.data == NULL) {\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                       \"hls-http: redirect_handler| pcalloc uri buffer failed\");\n            return NGX_HTTP_INTERNAL_SERVER_ERROR;\n        }\n        ngx_snprintf(uri.data, uri.len, \"%V%V\", &location, &uri_tail);\n    }\n\n    ngx_http_arg(r, (u_char*)\"scheme\", 6, &scheme);\n    if (scheme.len == 0) {\n#if (NGX_HTTP_SSL)\n        if (r->connection->ssl) {\n            scheme = https;\n        } else\n#endif\n        {\n            scheme = http;\n        }\n    }\n\n    m3u8_url.len = scheme.len + ngx_strlen(\"://\") +\n            host.len +\n            uri.len +\n            NGX_HLS_LIVE_ARG_SESSION_LENGTH + 2 +\n            ngx_strlen(sstr);\n\n    if (r->args.len > 0) {\n        m3u8_url.len += 1 + r->args.len;\n    }\n\n    m3u8_url.data = ngx_pcalloc(r->connection->pool, m3u8_url.len);\n\n    p = ngx_snprintf(m3u8_url.data, m3u8_url.len, \"%V://%V%V?%s=%s\",\n                &scheme, &host, &uri, NGX_HLS_LIVE_ARG_SESSION, sstr);\n\n    if (r->args.len > 0) {\n        ngx_slprintf(p, m3u8_url.data + m3u8_url.len, \"&%V\", &r->args);\n    }\n\n    ngx_http_set_header_out(r, &ngx_302_headers[0].key, &m3u8_url);\n\n    r->headers_out.content_length_n = 0;\n    r->header_only = 1;\n\n    rc = ngx_hls_http_send_header(r, NGX_HTTP_MOVED_TEMPORARILY, NULL);\n    if (rc != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: redirect_handler| \"\n            \"send header failed, redirect url: %V, rc=%d\", &m3u8_url, rc);\n    } else {\n        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n                \"hls-http: redirect_handler| redirect url %V\", &m3u8_url);\n    }\n\n    return rc;\n}\n\n\nstatic ngx_hls_http_ctx_t *\nngx_hls_http_create_ctx(ngx_http_request_t *r, ngx_rtmp_addr_conf_t *addr_conf)\n{\n    ngx_hls_http_ctx_t         *ctx;\n    ngx_rtmp_core_srv_conf_t   *cscf;\n    u_char                     *p;\n\n    cscf = addr_conf->default_server->ctx->\n            srv_conf[ngx_rtmp_core_module.ctx_index];\n\n    ctx = ngx_http_get_module_ctx(r, ngx_hls_http_module);\n    if (ctx == NULL) {\n        p = ngx_pcalloc(r->connection->pool, sizeof(ngx_hls_http_ctx_t));\n\n        if (p == NULL) {\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                \"hls-http: create_ctx| alloc hls live ctx failed\");\n            return NULL;\n        }\n\n        ctx = (ngx_hls_http_ctx_t *)p;\n\n        ngx_http_set_ctx(r, ctx, ngx_hls_http_module);\n    }\n\n    ctx->timeout = cscf->timeout;\n\n    ngx_hls_http_ctx_init(r, addr_conf);\n\n    if (ctx->app.len == 0 || ctx->name.len == 0) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: create_ctx| parse app or name failed, uri %V\", &r->uri);\n        return NULL;\n    }\n\n    ngx_http_arg(r, NGX_HLS_LIVE_ARG_SESSION, NGX_HLS_LIVE_ARG_SESSION_LENGTH,\n        &ctx->sid);\n\n    return ctx;\n}\n\n\nstatic void\nngx_hls_http_cleanup(void *data)\n{\n    ngx_http_request_t   *r;\n    ngx_hls_http_ctx_t   *ctx;\n    ngx_chain_t          *cl;\n\n    r = data;\n    ctx = ngx_http_get_module_ctx(r, ngx_hls_http_module);\n\n    if (!ctx) {\n        return;\n    }\n\n    if (ctx->out_chain == NULL) {\n        cl = ctx->out_chain;\n        while (cl) {\n            ctx->out_chain = cl->next;\n            ngx_put_chainbuf(cl);\n            cl = ctx->out_chain;\n        }\n    }\n\n    ctx->content_pos = 0;\n\n    if (ctx->session) {\n        ctx->session->request = NULL;\n        ctx->session->connection = NULL;\n    }\n\n    ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0,\n            \"hls-http: cleanup_handler| http cleanup\");\n\n    if (ctx->frag) {\n        ngx_log_error(NGX_LOG_DEBUG, r->connection->log, 0,\n            \"hls-http: cleanup_handler| free frag[%p]\", ctx->frag);\n        ngx_hls_live_free_frag(ctx->frag);\n        ctx->frag = NULL;\n    }\n}\n\n\nstatic ngx_int_t\nngx_hls_http_parse(ngx_http_request_t *r, ngx_rtmp_session_t *s,\n        ngx_rtmp_play_t *v)\n{\n    ngx_hls_http_loc_conf_t   *hlcf;\n    size_t                     tcurl_len;\n    u_char                    *p;\n    ngx_hls_http_ctx_t        *ctx;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_hls_http_module);\n\n    hlcf = ngx_http_get_module_loc_conf(r, ngx_hls_http_module);\n\n#define NGX_HLS_HTTP_SET_VAL(_val)                                             \\\n    s->_val.data = ngx_pcalloc(s->pool, ctx->_val.len);                        \\\n    s->_val.len = ctx->_val.len;                                               \\\n    ngx_memcpy(s->_val.data, ctx->_val.data, ctx->_val.len)\n\n    NGX_HLS_HTTP_SET_VAL(app);\n    NGX_HLS_HTTP_SET_VAL(stream);\n\n#undef NGX_HLS_HTTP_SET_VAL\n\n    if (ngx_http_arg(r, (u_char *) \"flashver\", 8, &s->flashver) != NGX_OK) {\n        s->flashver = hlcf->flashver;\n    }\n\n    /* tc_url */\n#if (NGX_HTTP_SSL)\n    if (r->connection->ssl) {\n        tcurl_len = sizeof(\"https://\") - 1;\n    } else\n#endif\n    {\n        tcurl_len = sizeof(\"http://\") - 1;\n    }\n    tcurl_len += r->headers_in.server.len + 1 + s->app.len;\n\n    s->tc_url.len = tcurl_len;\n    s->tc_url.data = ngx_pcalloc(r->pool, tcurl_len);\n    if (s->tc_url.data == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    p = s->tc_url.data;\n\n#if (NGX_HTTP_SSL)\n    if (r->connection->ssl) {\n        p = ngx_cpymem(p, \"https://\", sizeof(\"https://\") - 1);\n    } else\n#endif\n    {\n        p = ngx_cpymem(p, \"http://\", sizeof(\"http://\") - 1);\n    }\n\n    p = ngx_cpymem(p, r->headers_in.server.data, r->headers_in.server.len);\n    *p++ = '/';\n    p = ngx_cpymem(p, s->app.data, s->app.len);\n\n    /* page_url */\n    if (r->headers_in.referer) {\n        s->page_url = r->headers_in.referer->value;\n    } else {\n        s->page_url = hlcf->page_url;\n    }\n\n    s->acodecs = 0x0DF7;\n    s->vcodecs = 0xFC;\n\n    ngx_memcpy(v->name, ctx->name.data, ctx->name.len);\n\n    if (r->args.len) {\n        ngx_memcpy(v->args, r->args.data,\n            ngx_min(r->args.len, NGX_RTMP_MAX_ARGS));\n    }\n\n    ngx_memcpy(v->session, ctx->sid.data, ctx->sid.len);\n\n    ngx_rtmp_cmd_middleware_init(s);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_rtmp_session_t*\nngx_hls_http_create_session(ngx_http_request_t *r)\n{\n    ngx_hls_http_loc_conf_t    *hlcf;\n    ngx_rtmp_session_t         *s;\n    ngx_rtmp_play_t             v;\n    ngx_int_t                   rc;\n    ngx_uint_t                  n;\n    ngx_rtmp_core_srv_conf_t   *cscf;\n    ngx_rtmp_core_app_conf_t  **cacfp;\n    ngx_rtmp_core_main_conf_t  *cmcf;\n\n    hlcf = ngx_http_get_module_loc_conf(r, ngx_hls_http_module);\n\n    /* create fake session */\n    s = ngx_rtmp_create_session(hlcf->addr_conf);\n    if (s == NULL) {\n        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n            \"hls-http: create_session| create session failed\");\n        return NULL;\n    }\n\n    /* get host, app, stream name */\n    ngx_memzero(&v, sizeof(ngx_rtmp_play_t));\n\n    rc = ngx_hls_http_parse(r, s, &v);\n    if (rc != NGX_OK) {\n        return NULL;\n    }\n\n    if (ngx_rtmp_set_virtual_server(s, &s->domain)) {\n        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n            \"hls-http: create_session| set virtual server failed, %V\",\n            &s->domain);\n        return NULL;\n    }\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n\n    s->log->connection = r->connection->number;\n    s->number = r->connection->number;\n    s->live_type = NGX_HLS_LIVE;\n    s->live_server = ngx_live_create_server(&s->serverid);\n    s->remote_addr_text.data = ngx_pcalloc(s->pool, r->connection->addr_text.len);\n    s->remote_addr_text.len = r->connection->addr_text.len;\n    ngx_memcpy(s->remote_addr_text.data,\n        r->connection->addr_text.data, r->connection->addr_text.len);\n\n    v.silent = 1;\n\n    cacfp = cscf->applications.elts;\n    for (n = 0; n < cscf->applications.nelts; ++n, ++cacfp) {\n        if ((*cacfp)->name.len == s->app.len &&\n            ngx_strncmp((*cacfp)->name.data, s->app.data, s->app.len) == 0)\n        {\n            /* found app! */\n            s->app_conf = (*cacfp)->app_conf;\n            break;\n        }\n    }\n\n    if (s->app_conf == NULL) {\n\n        if (cscf->default_app == NULL || cscf->default_app->app_conf == NULL) {\n            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n                \"hls-http: create_session| application not found '%V'\", &s->app);\n\n            ngx_rtmp_finalize_fake_session(s);\n\n            return NULL;\n        }\n\n        s->app_conf = cscf->default_app->app_conf;\n    }\n\n    s->stage = NGX_LIVE_PLAY;\n    s->ptime = ngx_current_msec;\n//    s->connection = r->connection;\n\n    cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module);\n    s->variables = ngx_pcalloc(s->pool, cmcf->variables.nelts\n            * sizeof(ngx_http_variable_value_t));\n    if (s->variables == NULL) {\n        return NULL;\n    }\n\n    if (ngx_rtmp_play_filter(s, &v) != NGX_OK) {\n        return NULL;\n    }\n\n    ngx_add_timer(r->connection->write, s->timeout);\n\n    return s;\n}\n\n\nstatic ngx_int_t\nngx_hls_http_m3u8_handler(ngx_http_request_t *r, ngx_rtmp_addr_conf_t *addr_conf)\n{\n    ngx_hls_http_ctx_t   *ctx;\n    ngx_int_t             rc;\n    ngx_rtmp_session_t   *s;\n    ngx_chain_t          *out;\n    ngx_buf_t            *buf;\n\n    ctx = ngx_hls_http_create_ctx(r, addr_conf);\n    if (ctx == NULL) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: m3u8_handler| create ctx failed\");\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    s = ngx_hls_live_fetch_session(&ctx->serverid, &ctx->stream, &ctx->sid);\n    if (s == NULL) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: m3u8_handler| hls session %V not found\", &ctx->sid);\n\n        s = ngx_hls_http_create_session(r);\n        if (s == NULL) {\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                \"hls-http: m3u8_handler| create hls session %V error\",\n                &ctx->sid);\n\n            return NGX_HTTP_INTERNAL_SERVER_ERROR;\n        }\n        s->sockaddr = ngx_pcalloc(s->pool, sizeof(struct sockaddr));\n        ngx_memcpy(s->sockaddr, r->connection->sockaddr, sizeof(struct sockaddr));\n    }\n\n    s->request = r;\n\n    ctx->session = s;\n\n    if (!ctx->m3u8) {\n        ctx->m3u8 = ngx_pcalloc(r->connection->pool, sizeof(ngx_chain_t));\n        ctx->m3u8->buf = ngx_create_temp_buf(r->connection->pool, 1024*512);\n    }\n\n    out = ctx->m3u8;\n    buf = out->buf;\n    buf->last = buf->pos = buf->start;\n    buf->memory = 1;\n    buf->flush = 1;\n//    buf->last_in_chain = 1;\n//    buf->last_buf = 1;\n\n    rc = ngx_hls_live_write_playlist(s, buf, &r->headers_out.last_modified_time);\n    if (rc != NGX_OK) {\n        goto again;\n    }\n\n    r->headers_out.content_length_n = buf->last - buf->pos;\n\n    s->out_bytes += r->headers_out.content_length_n;\n\n    if (!r->header_sent) {\n        rc = ngx_hls_http_send_header(r, NGX_HTTP_OK, ngx_m3u8_headers);\n        if (rc != NGX_OK) {\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                \"hls-http: m3u8_handler| send http header failed\");\n            return rc;\n        }\n    }\n\n    rc = ngx_http_output_filter(r, out);\n    if (rc != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: m3u8_handler| send http content failed\");\n        return rc;\n    }\n\n    return rc;\n\nagain:\n    r->count++;\n\n    return NGX_DONE;\n}\n\n\nstatic u_char*\nngx_hls_http_strrchr(ngx_str_t *str, u_char c)\n{\n    u_char                             *s, *e;\n\n    s = str->data;\n    e = str->data + str->len;\n\n    e--;\n    while(e != s) {\n        if (*e == c) {\n            break;\n        }\n        e--;\n    }\n\n    if (e == s) {\n        return NULL;\n    }\n\n    return e;\n}\n\n\nstatic ngx_int_t\nngx_hls_http_parse_frag(ngx_http_request_t *r, ngx_str_t *name)\n{\n    u_char                             *s, *e;\n\n    e = ngx_hls_http_strrchr(&r->uri, '?');\n    if (e == NULL) {\n        e = r->uri.data + r->uri.len;\n    }\n\n    s = ngx_hls_http_strrchr(&r->uri, '/');\n    if (s == NULL) {\n        s = r->uri.data;\n    } else {\n        s++;\n    }\n\n    name->data = s;\n    name->len = e - s;\n\n    return NGX_OK;\n}\n\nstatic ngx_chain_t *\nngx_hls_http_prepare_out_chain(ngx_http_request_t *r, ngx_int_t nframes)\n{\n    ngx_hls_http_ctx_t   *ctx;\n     ngx_hls_live_frag_t *frag;\n    ngx_rtmp_session_t   *s;\n    ngx_chain_t          *out, *cl, **ll;\n    ngx_mpegts_frame_t   *frame;\n    ngx_int_t             i = 0;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_hls_http_module);\n    s = ctx->session;\n    frag = ctx->frag;\n\n    out = NULL;\n\n    ll = &out;\n    while (i < nframes && ctx->content_pos != frag->content_last) {\n        frame = frag->content[ctx->content_pos];\n\n        for (cl = frame->chain; cl; cl = cl->next) {\n            *ll = ngx_get_chainbuf(0, 0);\n            (*ll)->buf->pos = cl->buf->pos;\n            (*ll)->buf->last = cl->buf->last;\n            (*ll)->buf->flush = 1;\n\n            ll = &(*ll)->next;\n        }\n\n        *ll = NULL;\n        ctx->content_pos = ngx_hls_live_next(s, ctx->content_pos);\n        i++;\n    }\n\n    return out;\n}\n\nstatic void\nngx_hls_http_write_handler(ngx_http_request_t *r)\n{\n    ngx_hls_http_ctx_t   *ctx;\n    ngx_rtmp_session_t   *s;\n    ngx_event_t          *wev;\n    size_t                present, sent;\n    ngx_int_t             rc;\n    ngx_chain_t          *cl;\n\n    wev = r->connection->write;           //wev->handler = ngx_http_request_handler;\n\n    if (r->connection->destroyed) {\n        return;\n    }\n\n    ctx = ngx_http_get_module_ctx(r, ngx_hls_http_module);\n    s = ctx->session;\n\n    if (wev->timedout) {\n        ngx_log_error(NGX_LOG_INFO, s->log, NGX_ETIMEDOUT,\n                \"hls_http: write_handler| client timed out\");\n        r->connection->timedout = 1;\n        if (r->header_sent) {\n            ngx_http_finalize_request(r, NGX_HTTP_CLIENT_CLOSED_REQUEST);\n        } else {\n            r->error_page = 1;\n            ngx_http_finalize_request(r, NGX_HTTP_SERVICE_UNAVAILABLE);\n        }\n\n        return;\n    }\n\n    if (wev->timer_set) {\n        ngx_del_timer(wev);\n    }\n\n    if (ctx->out_chain == NULL) {\n        ctx->out_chain = ngx_hls_http_prepare_out_chain(r, 4);\n    }\n\n    rc = NGX_OK;\n\n    while (ctx->out_chain) {\n        present = r->connection->sent;\n\n        if (r->connection->buffered) {\n            rc = ngx_http_output_filter(r, NULL);\n        } else {\n            rc = ngx_http_output_filter(r, ctx->out_chain);\n        }\n\n        sent = r->connection->sent - present;\n\n        ngx_rtmp_update_bandwidth(&ngx_rtmp_bw_out, sent);\n\n        if (rc == NGX_AGAIN) {\n            ngx_add_timer(wev, s->timeout);\n            if (ngx_handle_write_event(wev, 0) != NGX_OK) {\n                ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                        \"hls_http: write_handler| handle write event failed\");\n                ngx_http_finalize_request(r, NGX_ERROR);\n            }\n            return;\n        }\n\n        if (rc == NGX_ERROR) {\n            ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                    \"hls_http: write_handler| send error\");\n            ngx_http_finalize_request(r, NGX_ERROR);\n\n            return;\n        }\n\n        /* NGX_OK */\n        cl = ctx->out_chain;\n        while (cl) {\n            ctx->out_chain = cl->next;\n            ngx_put_chainbuf(cl);\n            cl = ctx->out_chain;\n        }\n\n        if (ctx->frag->content_pos == ctx->frag->content_last) {\n            ctx->out_chain = NULL;\n            break;\n        }\n\n        ctx->out_chain = ngx_hls_http_prepare_out_chain(r, 4);\n    }\n\n    if (wev->active) {\n        ngx_del_event(wev, NGX_WRITE_EVENT, 0);\n    }\n\n    ngx_http_finalize_request(r, NGX_HTTP_OK);\n}\n\nstatic ngx_int_t\nngx_hls_http_ts_handler(ngx_http_request_t *r, ngx_rtmp_addr_conf_t *addr_conf)\n{\n    ngx_hls_http_ctx_t                 *ctx;\n    ngx_rtmp_session_t                 *s;\n    ngx_hls_live_frag_t                *frag;\n    ngx_int_t                           rc;\n    ngx_str_t                           name;\n\n    ctx = ngx_hls_http_create_ctx(r, addr_conf);\n    if (ctx == NULL) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: ts_handler| create ctx failed\");\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    s = ngx_hls_live_fetch_session(&ctx->serverid, &ctx->stream, &ctx->sid);\n    if (s == NULL) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: ts_handler| hls session %V not found\", &ctx->sid);\n        return NGX_DECLINED;\n    }\n    ctx->session = s;\n    s->request = r;\n\n//    ngx_rtmp_set_combined_log(s, r->connection->log->data,\n//            r->connection->log->handler);\n\n    rc = ngx_hls_http_parse_frag(r, &name);\n    if (rc != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: ts_handler| parse frag args failed %V\", &r->uri);\n        return NGX_HTTP_NOT_ALLOWED;\n    }\n\n    frag = ngx_hls_live_find_frag(s, &name);\n    if (frag == NULL) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: ts_handler| ts not found, %V\", &r->uri);\n        return NGX_HTTP_NOT_FOUND;\n    }\n\n    ctx->frag = frag;\n\n    r->headers_out.content_length_n = frag->length;\n    r->headers_out.last_modified_time = frag->last_modified_time;\n    s->out_bytes += r->headers_out.content_length_n;\n\n    rc = ngx_hls_http_send_header(r, NGX_HTTP_OK, ngx_ts_headers);\n    if (rc != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: ts_handler| send http header failed, %V\", &r->uri);\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    ngx_rtmp_shared_acquire_frag(frag);\n\n    if (1) {\n        r->write_event_handler = ngx_hls_http_write_handler;\n\n        r->count++;\n\n        ngx_hls_http_write_handler(r);\n\n        return NGX_DONE;\n    } else {\n        ctx->out_chain = ngx_hls_live_prepare_frag(s, frag);\n\n        ngx_rtmp_update_bandwidth(&ngx_rtmp_bw_out, frag->length);\n\n        return ngx_http_output_filter(r, ctx->out_chain);\n    }\n}\n\n\nstatic ngx_int_t\nngx_hls_http_handler(ngx_http_request_t *r)\n{\n    ngx_hls_http_loc_conf_t    *hlcf;\n    ngx_int_t                   rc;\n    ngx_http_cleanup_t         *cln;\n    ngx_str_t                   sstr;\n    ngx_hls_http_ctx_t         *ctx;\n\n    hlcf = ngx_http_get_module_loc_conf(r, ngx_hls_http_module);\n\n    rc = ngx_http_discard_request_body(r);\n\n    if (rc != NGX_OK) {\n        return rc;\n    }\n\n    if (!(r->method & (NGX_HTTP_GET|NGX_HTTP_HEAD))) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: live_handler| donnot support the method\");\n        return NGX_HTTP_NOT_ALLOWED;\n    }\n\n    if (ngx_rtmp_core_main_conf->fast_reload && (ngx_exiting || ngx_terminate)) {\n        return NGX_DECLINED;\n    }\n\n    if (r->uri.len < 4) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: live_handler| donnot support the file type\");\n        return NGX_DECLINED;\n    }\n\n    ctx = ngx_http_get_module_ctx(r, ngx_hls_http_module);\n    if (!ctx) {\n        cln = ngx_http_cleanup_add(r, 0);\n        if (cln == NULL) {\n            return NGX_HTTP_INTERNAL_SERVER_ERROR;\n        }\n        cln->handler = ngx_hls_http_cleanup;\n        cln->data = r;\n        r->read_event_handler = ngx_http_test_reading;\n    }\n\n    if(!ngx_strncmp(r->uri.data + r->uri.len - 5, \".m3u8\", 5)) {\n\n        rc = ngx_http_arg(r, NGX_HLS_LIVE_ARG_SESSION,\n                         NGX_HLS_LIVE_ARG_SESSION_LENGTH, &sstr);\n\n        if (rc != NGX_OK || sstr.len == 0) {\n            if (1) {\n                return ngx_hls_http_master_m3u8_handler(r, hlcf->addr_conf);\n            } else {\n                return ngx_hls_http_redirect_handler(r, hlcf->addr_conf);\n            }\n        } else {\n            return ngx_hls_http_m3u8_handler(r, hlcf->addr_conf);\n        }\n\n    } else if (!ngx_strncmp(r->uri.data + r->uri.len - 3, \".ts\", 3)) {\n        return ngx_hls_http_ts_handler(r, hlcf->addr_conf);\n    }\n\n    return NGX_DECLINED;\n}\n\nstatic ngx_int_t\nngx_hls_http_m3u8(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, ngx_chain_t *in)\n{\n    ngx_http_request_t                 *r;\n    ngx_int_t                           rc;\n    ngx_hls_http_ctx_t                 *ctx;\n    ngx_buf_t                          *buf;\n    ngx_chain_t                        *out;\n\n    r = s->request;\n    if (!r) {\n        return NGX_ERROR;\n    }\n\n    ctx = ngx_http_get_module_ctx(r, ngx_hls_http_module);\n\n    if (!ctx->m3u8) {\n        ctx->m3u8 = ngx_pcalloc(r->connection->pool, sizeof(ngx_chain_t));\n        ctx->m3u8->buf = ngx_create_temp_buf(r->connection->pool, 1024*512);\n    }\n\n    out = ctx->m3u8;\n    buf = out->buf;\n    buf->last = buf->pos = buf->start;\n    buf->memory = 1;\n    buf->flush = 1;\n//    buf->last_in_chain = 1;\n//    buf->last_buf = 1;\n\n    ngx_hls_live_write_playlist(s, buf, &r->headers_out.last_modified_time);\n\n    r->headers_out.content_length_n = buf->last - buf->pos;\n\n    s->out_bytes += r->headers_out.content_length_n;\n\n    rc = ngx_hls_http_send_header(r, NGX_HTTP_OK, ngx_m3u8_headers);\n    if (rc != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: m3u8| send http header failed\");\n        return rc;\n    }\n\n    rc = ngx_http_output_filter(r, out);\n    if (rc != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"hls-http: m3u8| send http content failed\");\n        return rc;\n    }\n\n    ngx_http_finalize_request(r, NGX_HTTP_OK);\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_hls_http_close(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, ngx_chain_t *in)\n{\n    ngx_http_request_t   *r;\n    ngx_hls_http_ctx_t   *ctx;\n\n    r = s->request;\n    if (!r) {\n        return NGX_OK;\n    }\n\n    ctx = ngx_http_get_module_ctx(r, ngx_hls_http_module);\n    if (!ctx) {\n        return NGX_OK;\n    }\n\n    s->request = NULL;\n    s->connection = NULL;\n    ctx->session = NULL;\n\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n        \"hls-http: close| finalize http request\");\n\n    ngx_http_finalize_request(r, NGX_HTTP_GONE);\n\n    return NGX_OK;\n}\n\n\nstatic char *\nngx_http_hls(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t           *clcf;\n    ngx_hls_http_loc_conf_t            *hlcf;\n    ngx_str_t                          *value;\n    ngx_uint_t                          n;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_hls_http_handler;\n\n    hlcf = conf;\n\n    value = cf->args->elts;\n\n    hlcf->addr_conf = ngx_rtmp_find_related_addr_conf(cf->cycle, &value[1]);\n    if (hlcf->addr_conf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    for (n = 2; n < cf->args->nelts; ++n) {\n#define PARSE_CONF_ARGS(arg)                                                   \\\n        {                                                                      \\\n            size_t len = sizeof(#arg\"=\") - 1;                                  \\\n            if (ngx_memcmp(value[n].data, #arg\"=\", len) == 0) {                \\\n                hlcf->arg.data = value[n].data + len;                          \\\n                hlcf->arg.len = value[n].len - len;                            \\\n                continue;                                                      \\\n            }                                                                  \\\n        }\n\n        PARSE_CONF_ARGS(app);\n        PARSE_CONF_ARGS(flashver);\n        PARSE_CONF_ARGS(swf_url);\n        PARSE_CONF_ARGS(tc_url);\n        PARSE_CONF_ARGS(page_url);\n\n#undef PARSE_CONF_ARGS\n\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                \"\\\"%V\\\" para not support\", &value[n]);\n        return NGX_CONF_ERROR;\n    }\n\n    return NGX_CONF_OK;\n}\n\nstatic ngx_int_t\nngx_hls_http_postconfiguration(ngx_conf_t *cf)\n{\n    ngx_rtmp_core_main_conf_t   *cmcf;\n    ngx_rtmp_handler_pt         *h;\n\n    cmcf = ngx_rtmp_core_main_conf;\n\n    if (!cmcf) {\n        return NGX_OK;\n    }\n\n    h = ngx_array_push(&cmcf->events[NGX_MPEGTS_MSG_M3U8]);\n    *h = ngx_hls_http_m3u8;\n\n    h = ngx_array_push(&cmcf->events[NGX_MPEGTS_MSG_CLOSE]);\n    *h = ngx_hls_http_close;\n\n    return NGX_OK;\n}\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/mpegts/ngx_hls_live_module.c",
    "content": "\n/*\n * Copyright (C) Pingo (cczjp89@gmail.com)\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_rtmp.h>\n#include <ngx_rtmp_cmd_module.h>\n#include <ngx_rtmp_codec_module.h>\n#include \"ngx_rbuf.h\"\n#include \"ngx_hls_live_module.h\"\n#include \"ngx_mpegts_live_module.h\"\n#include \"ngx_rtmp_live_module.h\"\n#include \"ngx_mpegts_gop_module.h\"\n\nstatic ngx_rtmp_play_pt                 next_play;\nstatic ngx_rtmp_close_stream_pt         next_close_stream;\n\nstatic ngx_int_t ngx_hls_live_postconfiguration(ngx_conf_t *cf);\nstatic void * ngx_hls_live_create_main_conf(ngx_conf_t *cf);\nstatic void * ngx_hls_live_create_app_conf(ngx_conf_t *cf);\nstatic char * ngx_hls_live_merge_app_conf(ngx_conf_t *cf,\n       void *parent, void *child);\nstatic ngx_int_t\nngx_hls_live_write_frame(ngx_rtmp_session_t *s, ngx_mpegts_frame_t *frame);\nstatic void\nngx_hls_live_update_playlist(ngx_rtmp_session_t *s);\nstatic ngx_int_t\nngx_hls_live_update(ngx_rtmp_session_t *s, ngx_rtmp_codec_ctx_t *codec_ctx);\n\nstatic ngx_mpegts_video_pt next_mpegts_video;\nstatic ngx_mpegts_audio_pt next_mpegts_audio;\n\ntypedef struct {\n    ngx_flag_t                          hls;\n    ngx_msec_t                          fraglen;\n    ngx_msec_t                          max_fraglen;\n    ngx_msec_t                          playlen;\n    ngx_uint_t                          winfrags;\n    ngx_uint_t                          minfrags;\n    ngx_uint_t                          slicing;\n    ngx_uint_t                          type;\n    ngx_path_t                         *slot;\n    size_t                              audio_buffer_size;\n    ngx_flag_t                          cleanup;\n    ngx_array_t                        *variant;\n    ngx_str_t                           base_url;\n    ngx_pool_t                         *pool;\n    ngx_msec_t                          timeout;\n} ngx_hls_live_app_conf_t;\n\ntypedef struct {\n    ngx_hls_live_frag_t                *free_frag;\n    ngx_pool_t                         *pool;\n} ngx_hls_live_main_conf_t;\n\nngx_hls_live_main_conf_t *ngx_hls_live_main_conf = NULL;\n\n#define NGX_RTMP_HLS_NAMING_SEQUENTIAL  1\n#define NGX_RTMP_HLS_NAMING_TIMESTAMP   2\n#define NGX_RTMP_HLS_NAMING_SYSTEM      3\n\n\n#define NGX_RTMP_HLS_SLICING_PLAIN      1\n#define NGX_RTMP_HLS_SLICING_ALIGNED    2\n\n\n#define NGX_RTMP_HLS_TYPE_LIVE          1\n#define NGX_RTMP_HLS_TYPE_EVENT         2\n\n\nstatic ngx_conf_enum_t                  ngx_hls_live_slicing_slots[] = {\n    { ngx_string(\"plain\"),              NGX_RTMP_HLS_SLICING_PLAIN },\n    { ngx_string(\"aligned\"),            NGX_RTMP_HLS_SLICING_ALIGNED  },\n    { ngx_null_string,                  0 }\n};\n\n/*\nstatic ngx_conf_enum_t                  ngx_hls_live_type_slots[] = {\n    { ngx_string(\"live\"),               NGX_RTMP_HLS_TYPE_LIVE  },\n    { ngx_string(\"event\"),              NGX_RTMP_HLS_TYPE_EVENT },\n    { ngx_null_string,                  0 }\n};\n*/\n\nstatic ngx_command_t ngx_hls_live_commands[] = {\n\n    { ngx_string(\"hls2memory\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_hls_live_app_conf_t, hls),\n      NULL },\n\n    { ngx_string(\"hls2\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_hls_live_app_conf_t, hls),\n      NULL },\n\n    { ngx_string(\"hls2_fragment\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_hls_live_app_conf_t, fraglen),\n      NULL },\n\n    { ngx_string(\"hls2_max_fragment\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_hls_live_app_conf_t, max_fraglen),\n      NULL },\n\n    { ngx_string(\"hls2_playlist_length\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_hls_live_app_conf_t, playlen),\n      NULL },\n\n    { ngx_string(\"hls2_minfrags\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_hls_live_app_conf_t, minfrags),\n      NULL },\n\n    { ngx_string(\"hls2_fragment_slicing\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_enum_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_hls_live_app_conf_t, slicing),\n      &ngx_hls_live_slicing_slots },\n\n    { ngx_string(\"hls2_audio_buffer_size\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_size_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_hls_live_app_conf_t, audio_buffer_size),\n      NULL },\n\n    { ngx_string(\"hls2_cleanup\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_hls_live_app_conf_t, cleanup),\n      NULL },\n\n    { ngx_string(\"hls2_base_url\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_str_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_hls_live_app_conf_t, base_url),\n      NULL },\n\n    { ngx_string(\"hls2_timeout\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_hls_live_app_conf_t, timeout),\n      NULL },\n\n    ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_hls_live_module_ctx = {\n    NULL,                               /* preconfiguration */\n    ngx_hls_live_postconfiguration,     /* postconfiguration */\n\n    ngx_hls_live_create_main_conf,      /* create main configuration */\n    NULL,                               /* init main configuration */\n\n    NULL,                               /* create server configuration */\n    NULL,                               /* merge server configuration */\n\n    ngx_hls_live_create_app_conf,       /* create location configuration */\n    ngx_hls_live_merge_app_conf,        /* merge location configuration */\n};\n\n\nngx_module_t  ngx_hls_live_module = {\n    NGX_MODULE_V1,\n    &ngx_hls_live_module_ctx,           /* module context */\n    ngx_hls_live_commands,              /* module directives */\n    NGX_RTMP_MODULE,                    /* module type */\n    NULL,                               /* init master */\n    NULL,                               /* init module */\n    NULL,                               /* init process */\n    NULL,                               /* init thread */\n    NULL,                               /* exit thread */\n    NULL,                               /* exit process */\n    NULL,                               /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_hls_live_frag_t *\nngx_hls_live_get_frag(ngx_rtmp_session_t *s, ngx_int_t n)\n{\n    ngx_hls_live_ctx_t         *ctx;\n    ngx_hls_live_app_conf_t    *hacf;\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_hls_live_module);\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_hls_live_module);\n\n    return ctx->frags[(ctx->nfrag + n) % (hacf->winfrags * 2 + 1)];\n}\n\n\nstatic void\nngx_hls_live_next_frag(ngx_rtmp_session_t *s)\n{\n    ngx_hls_live_ctx_t         *ctx;\n    ngx_hls_live_app_conf_t    *hacf;\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_hls_live_module);\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_hls_live_module);\n\n    if (ctx->nfrags == hacf->winfrags) {\n        ctx->nfrag++;\n    } else {\n        ctx->nfrags++;\n    }\n}\n\n\nngx_int_t\nngx_hls_live_write_playlist(ngx_rtmp_session_t *s, ngx_buf_t *out,\n    time_t *last_modified_time)\n{\n    ngx_hls_live_ctx_t        *ctx;\n    ngx_str_t                  m3u8;\n    ngx_hls_live_app_conf_t   *hacf;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_hls_live_module);\n    if (ctx == NULL) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0, \"hls-live: playlist| ctx is null\");\n\n        return NGX_ERROR;\n    }\n\n    ctx->last_time = time(NULL);\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_hls_live_module);\n\n    if (ctx->nfrags < hacf->minfrags || ctx->playing == 0) {\n        return NGX_AGAIN;\n    }\n\n    ngx_hls_live_update_playlist(s);\n\n    *last_modified_time = ctx->playlist_modified_time;\n\n    out->last = ngx_cpymem(out->pos, ctx->playlist->pos,\n        ctx->playlist->last - ctx->playlist->pos);\n\n    m3u8.data = out->pos;\n    m3u8.len = out->last - out->pos;\n\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0, \"hls-live: playlist| %V, %D\",\n        &m3u8, ctx->last_time);\n\n    return NGX_OK;\n}\n\n\nngx_hls_live_frag_t*\nngx_hls_live_find_frag(ngx_rtmp_session_t *s, ngx_str_t *name)\n{\n    ngx_hls_live_ctx_t        *ctx;\n    u_char                    *p0, *p1, *e;\n    ngx_uint_t                 frag_id;\n    ngx_hls_live_frag_t       *frag;\n    ngx_hls_live_app_conf_t   *hacf;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_hls_live_module);\n\n    p0 = name->data;\n    e = p0 + name->len;\n\n    for (; *e != '.' && e != p0; e--);\n\n    if (e == p0) {\n        return NULL;\n    }\n\n    p1 = e;\n\n    for (; *e != '-' && e != p0; e--);\n\n    if (e == p0) {\n        return NULL;\n    }\n\n    p0 = e + 1;\n\n    frag_id = ngx_atoi(p0, p1 - p0);\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_hls_live_module);\n\n    if (frag_id > ctx->nfrag + ctx->nfrags ||\n        ctx->nfrag + ctx->nfrags - frag_id > hacf->winfrags * 2 + 1)\n    {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n            \"hls-live: find_frag| invalid frag id[%d], curr id [%d]\",\n            frag_id, ctx->nfrag + ctx->nfrags);\n        return NULL;\n    }\n\n    frag = ctx->frags[frag_id % (hacf->winfrags * 2 + 1)];\n\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n        \"hls-live: find_frag| find frag %p [%d] [frag %d] length %ui\",\n        frag, frag_id, frag->id, frag->length);\n\n    return frag;\n}\n\nvoid\nngx_rtmp_shared_acquire_frag(ngx_hls_live_frag_t *frag)\n{\n    frag->ref++;\n}\n\nngx_chain_t*\nngx_hls_live_prepare_frag(ngx_rtmp_session_t *s, ngx_hls_live_frag_t *frag)\n{\n    ngx_chain_t          *out, *cl, **ll, *last_chain;\n    ngx_mpegts_frame_t   *frame;\n\n    ll = &out;\n    if (frag->content_pos == frag->content_last) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0, \"hls-live: prepare_frag| \"\n        \"pos %D == last %D\",\n        frag->content_pos, frag->content_last);\n        return NULL;\n    }\n\n    last_chain = NULL;\n\n    while (frag->content_pos != frag->content_last) {\n        frame = frag->content[frag->content_pos];\n\n        ngx_log_error(NGX_LOG_DEBUG, s->log, 0, \"hls-live: prepare_frag| \"\n        \"pos %D, last %D, frame chain %p\",\n        frag->content_pos, frag->content_last,\n        frame);\n        for (cl = frame->chain; cl; cl = cl->next) {\n            *ll = ngx_get_chainbuf(0, 0);\n            (*ll)->buf->pos = cl->buf->pos;\n            (*ll)->buf->last = cl->buf->last;\n            (*ll)->buf->flush = 1;\n\n            last_chain = *ll;\n\n            ll = &(*ll)->next;\n        }\n\n        *ll = NULL;\n        frag->content_pos = ngx_hls_live_next(s, frag->content_pos);\n    }\n\n    if (last_chain) {\n        last_chain->buf->last_buf = 1;\n        last_chain->buf->last_in_chain = 1;\n    }\n    frag->content_pos = 0;\n\n    return out;\n}\n\n\nngx_rtmp_session_t*\nngx_hls_live_fetch_session(ngx_str_t *server,\n    ngx_str_t *stream, ngx_str_t *session)\n{\n    ngx_live_stream_t    *live_stream;\n    ngx_hls_live_ctx_t   *ctx;\n\n    live_stream = ngx_live_fetch_stream(server, stream);\n    if (live_stream) {\n        for (ctx = live_stream->hls_ctx; ctx; ctx = ctx->next) {\n            if (session->len == ctx->sid.len &&\n                !ngx_strncmp(ctx->sid.data, session->data, session->len))\n            {\n                ngx_log_error(NGX_LOG_DEBUG, ctx->session->log, 0,\n                    \"hls-live: fetch_session| session[%p]\"\n                    \"server %V, stream %V, session %V\",\n                    ctx->session, server, stream, session);\n                return ctx->session;\n            }\n        }\n    }\n\n    return NULL;\n}\n\nstatic uint64_t\nngx_hls_live_get_fragment_id(ngx_rtmp_session_t *s, uint64_t ts)\n{\n    ngx_hls_live_ctx_t         *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_hls_live_module);\n\n    return ctx->nfrag + ctx->nfrags;\n}\n\nstatic void\nngx_hls_live_update_playlist(ngx_rtmp_session_t *s)\n{\n    u_char                         *p, *end;\n    ngx_hls_live_ctx_t             *ctx;\n    ngx_hls_live_app_conf_t        *hacf;\n    ngx_hls_live_frag_t            *frag;\n    ngx_uint_t                      i, max_frag;\n    ngx_str_t                       name_part;\n    ngx_str_t                       m3u8;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_hls_live_module);\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_hls_live_module);\n\n    time(&ctx->playlist_modified_time);\n\n    max_frag = hacf->fraglen / 1000;\n\n    frag = NULL;\n\n    for (i = 0; i < ctx->nfrags; i++) {\n        frag = ngx_hls_live_get_frag(s, i);\n        if (frag && frag->duration > max_frag) {\n            max_frag = (ngx_uint_t) (frag->duration + .5);\n        }\n    }\n\n    if (!ctx->playlist) {\n        ctx->playlist = ngx_create_temp_buf(s->pool, 1024*512);\n    }\n\n    p = ctx->playlist->pos;\n    end = ctx->playlist->end;\n\n    p = ngx_slprintf(p, end,\n                     \"#EXTM3U\\n\"\n                     \"#EXT-X-VERSION:3\\n\"\n                     \"#EXT-X-MEDIA-SEQUENCE:%uL\\n\"\n                     \"#EXT-X-TARGETDURATION:%ui\\n\",\n                     ctx->nfrag, max_frag);\n\n//    if (hacf->type == NGX_RTMP_HLS_TYPE_EVENT) {\n//        p = ngx_slprintf(p, end, \"#EXT-X-PLAYLIST-TYPE: EVENT\\n\");\n//    }\n\n    name_part = s->name;\n\n    for (i = 0; i < ctx->nfrags; i++) {\n        frag = ngx_hls_live_get_frag(s, i);\n\n        if (frag->discont) {\n            p = ngx_slprintf(p, end, \"#EXT-X-DISCONTINUITY\\n\");\n        }\n\n        p = ngx_slprintf(p, end,\n            \"#EXTINF:%.3f,\\n\"\n            \"%V%V-%uL.ts?session=%V&slot=%d\\n\",\n            frag->duration, &hacf->base_url,\n            &name_part, frag->id, &ctx->sid, ngx_process_slot);\n\n        ngx_log_debug5(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"hls: fragment nfrag=%uL, n=%ui/%ui, duration=%.3f, \"\n            \"discont=%i\",\n            ctx->nfrag, i + 1, ctx->nfrags, frag->duration, frag->discont);\n    }\n/*\n    for (; frag && i < hacf->winfrags; i++) {\n        p = ngx_slprintf(p, end,\n                    \"#EXTINF:%.3f,\\n\"\n                    \"%V%V-%uL.ts?session=%V&slot=%d\\n\",\n                    hacf->fraglen/1000.0, &hacf->base_url,\n                    &name_part, i, &ctx->sid, ngx_process_slot);\n    }\n*/\n    ctx->playlist->last = p;\n    m3u8.data = ctx->playlist->pos;\n    m3u8.len = ctx->playlist->last - ctx->playlist->pos;\n\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0, \"hls-live: playlist| %V\", &m3u8);\n\n}\n\nstatic ngx_int_t\nngx_hls_live_close_fragment(ngx_rtmp_session_t *s)\n{\n    ngx_hls_live_ctx_t        *ctx;\n    ngx_hls_live_app_conf_t   *hacf;\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_hls_live_module);\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_hls_live_module);\n\n    if (ctx == NULL || !ctx->opened) {\n        return NGX_OK;\n    }\n\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                   \"hls: close fragment id=%uL\", ctx->nfrag);\n\n    ctx->opened = 0;\n\n    ngx_hls_live_next_frag(s);\n\n    if (ctx->nfrags >= hacf->minfrags && !ctx->playing)\n    {\n        ctx->playing = 1;\n        ngx_rtmp_fire_event(s, NGX_MPEGTS_MSG_M3U8, NULL, NULL);\n    }\n\n    return NGX_OK;\n}\n\n\nvoid\nngx_hls_live_free_frag(ngx_hls_live_frag_t *frag)\n{\n    ngx_mpegts_frame_t        *frame;\n    ngx_uint_t                 i;\n\n    frag->ref--;\n\n    if (frag->ref > 0) {\n        return;\n    }\n\n    ngx_log_error(NGX_LOG_DEBUG, ngx_cycle->log, 0,\n        \"hls-live: free_frag| frag[%p] ref %ui\", frag, frag->ref);\n\n    for (i = 0; i < frag->content_last; ++i) {\n        frame = frag->content[i];\n        if (frame) {\n            ngx_rtmp_shared_free_mpegts_frame(frame);\n        }\n    }\n\n    frag->next = ngx_hls_live_main_conf->free_frag;\n    ngx_hls_live_main_conf->free_frag = frag;\n}\n\n\nstatic ngx_hls_live_frag_t*\nngx_hls_live_create_frag(ngx_rtmp_session_t *s) {\n    ngx_hls_live_frag_t       *frag;\n\n    if (ngx_hls_live_main_conf->free_frag) {\n        frag = ngx_hls_live_main_conf->free_frag;\n        ngx_hls_live_main_conf->free_frag =\n            ngx_hls_live_main_conf->free_frag->next;\n\n        ngx_memzero(frag, sizeof(ngx_hls_live_frag_t) +\n            sizeof(ngx_mpegts_frame_t*) * s->out_queue);\n    } else {\n        frag = ngx_pcalloc(ngx_hls_live_main_conf->pool,\n            sizeof(ngx_hls_live_frag_t) +\n            sizeof(ngx_mpegts_frame_t*) * s->out_queue);\n    }\n\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n        \"hls-live: create_frag| create frag[%p]\", frag);\n\n    return frag;\n}\n\n\nstatic ngx_int_t\nngx_hls_live_open_fragment(ngx_rtmp_session_t *s, uint64_t ts,\n    ngx_int_t discont)\n{\n    uint64_t                  id;\n    ngx_hls_live_ctx_t       *ctx;\n    ngx_hls_live_frag_t     **ffrag, *frag;\n    ngx_hls_live_app_conf_t  *hacf;\n    ngx_mpegts_frame_t       *frame;\n    ngx_chain_t               patpmt;\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_hls_live_module);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_hls_live_module);\n\n    if (ctx->opened) {\n        return NGX_OK;\n    }\n\n    id = ngx_hls_live_get_fragment_id(s, ts);\n\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n            \"hls: open_fragment| create frag[%uL] timestamp %uL\", id, ts);\n\n    ffrag = &(ctx->frags[id % (hacf->winfrags * 2 + 1)]);\n    if (*ffrag) {\n        ngx_hls_live_free_frag(*ffrag);\n    }\n    *ffrag = ngx_hls_live_create_frag(s);\n\n    frag = *ffrag;\n\n    ngx_memzero(frag, sizeof(*frag));\n\n    frag->ref = 1;\n    frag->active = 1;\n    frag->discont = discont;\n    frag->id = id;\n\n    ctx->opened = 1;\n    ctx->frag_ts = ts;\n\n    ngx_memzero(&patpmt, sizeof(patpmt));\n    patpmt.buf = ngx_create_temp_buf(s->pool, 376);\n    patpmt.buf->last = ngx_cpymem(patpmt.buf->pos,\n        ngx_rtmp_mpegts_pat, 188);\n\n    ngx_rtmp_mpegts_gen_pmt(s->vcodec, s->acodec, s->log, patpmt.buf->last);\n    patpmt.buf->last += 188;\n\n    frame = ngx_rtmp_shared_alloc_mpegts_frame(&patpmt, 1);\n\n    ngx_hls_live_write_frame(s, frame);\n\n    ngx_rtmp_shared_free_mpegts_frame(frame);\n\n    frag->length = 376;\n\n    return NGX_OK;\n}\n\n\nstatic void\nngx_hls_live_timeout(ngx_event_t *ev)\n{\n    ngx_rtmp_session_t   *s;\n    ngx_hls_live_ctx_t   *ctx;\n\n    s = ev->data;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_hls_live_module);\n\n    if (time(NULL) - ctx->last_time > ctx->timeout/1000) {\n        ngx_log_error(NGX_LOG_ALERT, s->log, 0, \"hls-live: timeout| \"\n            \"hls live timeout, %D - %D > %D.\", time(NULL), ctx->last_time,\n            ctx->timeout/1000);\n\n        ngx_rtmp_finalize_fake_session(s);\n        return;\n    }\n\n    ngx_add_timer(ev, (ctx->timeout + 3000)/2);\n}\n\n\nstatic ngx_int_t\nngx_hls_live_join(ngx_rtmp_session_t *s, u_char *name, unsigned publisher)\n{\n    ngx_hls_live_ctx_t           *ctx;\n    ngx_live_stream_t            *st;\n    ngx_rtmp_live_app_conf_t     *lacf;\n    ngx_hls_live_app_conf_t      *hacf;\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_hls_live_module);\n\n    lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module);\n    if (lacf == NULL) {\n        return NGX_ERROR;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_hls_live_module);\n    if (ctx && ctx->stream) {\n        ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"mpegts-live: join| already joined\");\n        return NGX_ERROR;\n    }\n\n    if (ctx == NULL) {\n        ctx = ngx_pcalloc(s->pool, sizeof(ngx_hls_live_ctx_t));\n        ngx_rtmp_set_ctx(s, ctx, ngx_hls_live_module);\n\n        ctx->frags = ngx_pcalloc(s->pool,\n            sizeof(ngx_hls_live_frag_t *) * (hacf->winfrags * 2 + 1));\n        if (ctx->frags == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    ctx->session = s;\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0,\n                   \"mpegts-live: join| join '%s'\", name);\n\n    st = s->live_stream;\n\n    if (!(publisher || st->publish_ctx || lacf->idle_streams)) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"mpegts-live: join| stream not found\");\n\n        s->status = 404;\n\n        ngx_rtmp_finalize_session(s);\n\n        return NGX_ERROR;\n    }\n\n    ctx->stream = st;\n    ctx->next = st->hls_ctx;\n\n    st->hls_ctx = ctx;\n\n    ctx->ev.data = s;\n    ctx->ev.handler = ngx_hls_live_timeout;\n    ctx->ev.log = s->log;\n    ctx->timeout = hacf->timeout;\n\n    ngx_add_timer(&ctx->ev, (ctx->timeout + 3000)/2);\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_hls_live_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v)\n{\n    ngx_hls_live_app_conf_t        *hacf;\n    ngx_hls_live_ctx_t             *ctx;\n//    ngx_rtmp_codec_ctx_t           *codec_ctx;\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_hls_live_module);\n    if (hacf == NULL || !hacf->hls || s->live_type != NGX_HLS_LIVE) {\n        goto next;\n    }\n\n    if (s->interprocess || s->live_type != NGX_HLS_LIVE) {\n        goto next;\n    }\n\n    if (ngx_hls_live_join(s, v->name, 0) == NGX_ERROR) {\n        return NGX_ERROR;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_hls_live_module);\n\n    ctx->sid.len = ngx_strlen(v->session);\n    ctx->sid.data = ngx_pcalloc(s->pool, ctx->sid.len);\n    ngx_memcpy(ctx->sid.data, v->session, ctx->sid.len);\n/*\n    if (s->live_stream->publish_ctx) {\n\n        codec_ctx = ngx_rtmp_get_module_ctx(s->live_stream->publish_ctx->session,\n            ngx_rtmp_codec_module);\n\n        ngx_mpegts_gop_link(s->live_stream->publish_ctx->session,\n            s, hacf->playlen, hacf->playlen);\n        ngx_hls_live_update(s, codec_ctx);\n    }\n*/\nnext:\n    return next_play(s, v);\n}\n\n\nstatic ngx_int_t\nngx_hls_live_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)\n{\n    ngx_hls_live_app_conf_t   *hacf;\n    ngx_hls_live_ctx_t        *ctx, **cctx;\n    ngx_uint_t                 i;\n    ngx_hls_live_frag_t       *frag;\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_hls_live_module);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_hls_live_module);\n\n    if (hacf == NULL || !hacf->hls || ctx == NULL) {\n        goto next;\n    }\n\n    if (ctx->ev.timer_set) {\n        ngx_del_timer(&ctx->ev);\n    }\n\n    if (ctx->stream == NULL) {\n        goto next;\n    }\n\n    ngx_rtmp_fire_event(s, NGX_MPEGTS_MSG_CLOSE, NULL, NULL);\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"hls: close stream\");\n\n    ngx_hls_live_close_fragment(s);\n\n    for (i = 0; i < 2 * hacf->winfrags + 1; i++) {\n        frag = ctx->frags[i % (hacf->winfrags * 2 + 1)];\n        if (frag) {\n            ngx_hls_live_free_frag(frag);\n        }\n    }\n\n    for (cctx = &ctx->stream->hls_ctx; *cctx; cctx = &(*cctx)->next) {\n        if (*cctx == ctx) {\n            *cctx = ctx->next;\n            break;\n        }\n    }\n\n    if (ctx->stream->hls_ctx) {\n        ctx->stream = NULL;\n        goto next;\n    }\n\nnext:\n    return next_close_stream(s, v);\n}\n\n\nstatic void\nngx_hls_live_update_fragment(ngx_rtmp_session_t *s, uint64_t ts,\n    ngx_int_t boundary)\n{\n    ngx_hls_live_ctx_t         *ctx;\n    ngx_hls_live_app_conf_t    *hacf;\n    ngx_hls_live_frag_t        *frag;\n    ngx_msec_t                  ts_frag_len;\n    ngx_int_t                   same_frag, force,discont;\n    int64_t                     d;\n\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_hls_live_module);\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_hls_live_module);\n    frag = NULL;\n    force = 0;\n    discont = 1;\n\n    if (ctx->opened) {\n        frag = ngx_hls_live_get_frag(s, ctx->nfrags);\n        d = (int64_t) (ts - ctx->frag_ts);\n\n        if (d > (int64_t) hacf->max_fraglen * 90 || d < -90000) {\n            ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                        \"hls: force fragment split: %.3f sec, \", d / 90000.);\n            force = 1;\n//            if (!boundary) {\n                discont = 0;\n//            }\n        } else {\n            frag->duration = (ts - ctx->frag_ts) / 90000.;\n            discont = 0;\n        }\n    }\n\n    switch (hacf->slicing) {\n        case NGX_RTMP_HLS_SLICING_PLAIN:\n            if (frag && frag->duration < hacf->fraglen / 1000.) {\n                boundary = 0;\n            }\n            break;\n\n        case NGX_RTMP_HLS_SLICING_ALIGNED:\n\n            ts_frag_len = hacf->fraglen * 90;\n            same_frag = ctx->frag_ts / ts_frag_len == ts / ts_frag_len;\n\n            if (frag && same_frag) {\n                boundary = 0;\n            }\n\n            if (frag == NULL && (ctx->frag_ts == 0 || same_frag)) {\n                ctx->frag_ts = ts;\n                boundary = 0;\n            }\n\n            break;\n    }\n\n    if (boundary || force) {\n        ngx_hls_live_close_fragment(s);\n        ngx_hls_live_open_fragment(s, ts, discont);\n    }\n}\n\n\nstatic ngx_int_t\nngx_hls_live_write_frame(ngx_rtmp_session_t *s, ngx_mpegts_frame_t *frame)\n{\n    ngx_hls_live_frag_t   *frag;\n    ngx_hls_live_ctx_t    *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_hls_live_module);\n\n    frag = ngx_hls_live_get_frag(s, ctx->nfrags);\n\n    frag->length += frame->length;\n\n    frag->content[frag->content_last] = frame;\n    frag->content_last = ngx_hls_live_next(s, frag->content_last);\n    time(&frag->last_modified_time);\n\n    ngx_rtmp_shared_acquire_frame(frame);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_hls_live_update(ngx_rtmp_session_t *s, ngx_rtmp_codec_ctx_t *codec_ctx)\n{\n    ngx_hls_live_ctx_t   *ctx;\n    ngx_mpegts_frame_t   *frame;\n    ngx_int_t             boundary;\n    ngx_buf_t            *b;\n\n    b = NULL;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_hls_live_module);\n\n    while (s->out_pos != s->out_last) {\n\n        frame = s->mpegts_out[s->out_pos];\n#if 1\n        ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n            \"hls-live: update| \"\n            \"frame[%p] pos[%O] last[%O] pts[%uL] type [%d], key %d, opened %d\",\n            frame, s->out_pos, s->out_last,frame->pts,\n            frame->type, frame->key, ctx->opened);\n#endif\n        boundary = 0;\n\n        if (frame->type == NGX_MPEGTS_MSG_AUDIO) {\n            boundary = codec_ctx->avc_header == NULL;\n        } else if (frame->type == NGX_MPEGTS_MSG_VIDEO) {\n            b = ctx->aframe;\n            boundary = frame->key &&\n                (codec_ctx->aac_header == NULL || !ctx->opened ||\n                (b && b->last > b->pos));\n        } else {\n            return NGX_ERROR;\n        }\n\n        s->acodec = codec_ctx->audio_codec_id;\n        s->vcodec = codec_ctx->video_codec_id;\n\n        ngx_hls_live_update_fragment(s, frame->pts, boundary);\n\n        if (!ctx->opened) {\n            break;\n        }\n\n        ngx_hls_live_write_frame(s, frame);\n\n        ngx_rtmp_shared_free_mpegts_frame(frame);\n\n        ++s->out_pos;\n        s->out_pos %= s->out_queue;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_hls_live_av(ngx_rtmp_session_t *s, ngx_mpegts_frame_t *frame)\n{\n    ngx_live_stream_t         *live_stream;\n    ngx_hls_live_ctx_t        *ctx;\n    ngx_rtmp_session_t        *ss;\n    ngx_rtmp_codec_ctx_t      *codec_ctx;\n    ngx_hls_live_app_conf_t   *hacf;\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n    hacf = ngx_rtmp_get_module_app_conf(s, ngx_hls_live_module);\n\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n            \"hls-live: av| pts[%uL] type [%d] key[%d]\",\n            frame->dts/90, frame->type, frame->key);\n\n    live_stream = s->live_stream;\n    for (ctx = live_stream->hls_ctx; ctx; ctx = ctx->next) {\n        ss = ctx->session;\n\n        switch (ngx_mpegts_gop_link(s, ss, hacf->playlen, hacf->playlen)) {\n        case NGX_DECLINED:\n            continue;\n        case NGX_ERROR:\n            ngx_rtmp_finalize_fake_session(ss);\n            continue;\n        default:\n            break;\n        }\n\n        ngx_hls_live_update(ss, codec_ctx);\n    }\n\n    if (frame->type == NGX_MPEGTS_MSG_VIDEO) {\n        return next_mpegts_video(s, frame);\n    } else if (frame->type == NGX_MPEGTS_MSG_AUDIO) {\n        return next_mpegts_audio(s, frame);\n    }\n\n    return NGX_ERROR;\n}\n\nstatic void *\nngx_hls_live_create_main_conf(ngx_conf_t *cf)\n{\n    ngx_hls_live_main_conf_t *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_hls_live_main_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->pool = ngx_create_pool(1024, ngx_cycle->log);\n    ngx_hls_live_main_conf = conf;\n\n    return conf;\n}\n\nstatic void *\nngx_hls_live_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_hls_live_app_conf_t *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_hls_live_app_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->pool = ngx_create_pool(1024, ngx_cycle->log);\n\n    conf->hls = NGX_CONF_UNSET;\n    conf->fraglen = NGX_CONF_UNSET_MSEC;\n    conf->max_fraglen = NGX_CONF_UNSET_MSEC;\n    conf->playlen = NGX_CONF_UNSET_MSEC;\n    conf->slicing = NGX_CONF_UNSET_UINT;\n    conf->type = NGX_CONF_UNSET_UINT;\n    conf->audio_buffer_size = NGX_CONF_UNSET_SIZE;\n    conf->cleanup = NGX_CONF_UNSET;\n    conf->timeout = NGX_CONF_UNSET_MSEC;\n    conf->minfrags = NGX_CONF_UNSET_UINT;\n\n    return conf;\n}\n\n\nstatic char *\nngx_hls_live_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_hls_live_app_conf_t    *prev = parent;\n    ngx_hls_live_app_conf_t    *conf = child;\n\n    ngx_conf_merge_value(conf->hls, prev->hls, 0);\n    ngx_conf_merge_msec_value(conf->fraglen, prev->fraglen, 5000);\n    ngx_conf_merge_msec_value(conf->max_fraglen, prev->max_fraglen,\n                              conf->fraglen * 10);\n    ngx_conf_merge_msec_value(conf->playlen, prev->playlen, conf->fraglen * 3);\n    ngx_conf_merge_uint_value(conf->slicing, prev->slicing,\n                              NGX_RTMP_HLS_SLICING_PLAIN);\n    ngx_conf_merge_value(conf->cleanup, prev->cleanup, 1);\n    ngx_conf_merge_str_value(conf->base_url, prev->base_url, \"\");\n    ngx_conf_merge_uint_value(conf->minfrags, prev->minfrags, 2);\n\n    conf->timeout = conf->playlen * 3;\n\n    if (conf->fraglen) {\n        conf->winfrags = conf->playlen / conf->fraglen;\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_hls_live_postconfiguration(ngx_conf_t *cf)\n{\n    next_play = ngx_rtmp_play;\n    ngx_rtmp_play = ngx_hls_live_play;\n\n    next_close_stream = ngx_rtmp_close_stream;\n    ngx_rtmp_close_stream = ngx_hls_live_close_stream;\n\n    next_mpegts_video = ngx_mpegts_video;\n    ngx_mpegts_video = ngx_hls_live_av;\n\n    next_mpegts_audio = ngx_mpegts_audio;\n    ngx_mpegts_audio = ngx_hls_live_av;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/mpegts/ngx_hls_live_module.h",
    "content": "\n/*\n * Copyright (C) Pingo (cczjp89@gmail.com)\n */\n\n#ifndef _NGX_HLS_LIVE_MODULE_H_INCLUDE_\n#define _NGX_HLS_LIVE_MODULE_H_INCLUDE_\n\n#define ngx_hls_live_next(s, pos) ((pos + 1) % s->out_queue)\n#define ngx_hls_live_prev(s, pos) (pos == 0 ? s->out_queue - 1 : pos - 1)\n\ntypedef struct ngx_hls_live_frag_s ngx_hls_live_frag_t;\ntypedef struct ngx_hls_live_play_s ngx_hls_live_play_t;\n\nstruct ngx_hls_live_play_s {\n    ngx_str_t               name;\n    /* connection parameters */\n    ngx_rtmp_addr_conf_t   *addr_conf;\n    ngx_str_t               app;\n    ngx_str_t               stream;\n    ngx_str_t               args;\n    ngx_str_t               flashver;\n    ngx_str_t               swf_url;\n    ngx_str_t               tc_url;\n    uint32_t                acodecs;\n    uint32_t                vcodecs;\n    ngx_str_t               page_url;\n    ngx_str_t               domain;\n    ngx_str_t               serverid;\n    ngx_log_t              *log;\n};\n\nstruct ngx_hls_live_frag_s {\n    ngx_uint_t              ref;\n    ngx_hls_live_frag_t    *next;\n    time_t                  last_modified_time;\n    uint64_t                id;\n    uint64_t                key_id;\n    double                  duration;\n    unsigned                active:1;\n    unsigned                discont:1; /* before */\n    ngx_uint_t              length;\n    ngx_chain_t            *out;\n    ngx_uint_t              content_last;\n    ngx_uint_t              content_pos;\n    ngx_mpegts_frame_t     *content[0];\n};\n\nstruct ngx_hls_live_ctx_s {\n    unsigned                opened:1;\n    unsigned                playing:1;\n\n    ngx_buf_t              *patpmt;\n    ngx_rtmp_session_t     *session;\n\n    ngx_str_t               sid;\n    ngx_live_stream_t      *stream;\n    ngx_str_t               name;\n\n    uint64_t                nfrag;\n    uint64_t                frag_ts;\n    uint64_t                key_id;\n    ngx_uint_t              nfrags;\n    ngx_hls_live_frag_t   **frags; /* circular 2 * winfrags + 1 */\n    ngx_hls_live_frag_t    *frag;\n\n    ngx_uint_t              audio_cc;\n    ngx_uint_t              video_cc;\n    ngx_uint_t              key_frags;\n\n    uint64_t                aframe_base;\n    uint64_t                aframe_num;\n\n    ngx_buf_t              *aframe;\n    uint64_t                aframe_pts;\n    ngx_event_t             ev;\n    ngx_msec_t              timeout;\n    ngx_msec_t              last_time;\n    time_t                  playlist_modified_time;\n    ngx_buf_t              *playlist;\n    ngx_hls_live_ctx_t     *next;\n};\n\nngx_int_t ngx_hls_live_write_playlist(ngx_rtmp_session_t *s, ngx_buf_t *out,\n    time_t *last_modified_time);\nngx_hls_live_frag_t* ngx_hls_live_find_frag(ngx_rtmp_session_t *s,\n    ngx_str_t *name);\nngx_chain_t* ngx_hls_live_prepare_frag(ngx_rtmp_session_t *s,\n    ngx_hls_live_frag_t *frag);\nvoid ngx_hls_live_free_frag(ngx_hls_live_frag_t *frag);\nngx_rtmp_session_t* ngx_hls_live_fetch_session(ngx_str_t *server,\n    ngx_str_t *stream, ngx_str_t *session);\nvoid ngx_rtmp_shared_acquire_frag(ngx_hls_live_frag_t *frag);\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/mpegts/ngx_mpegts_gop_module.c",
    "content": "\n/*\n * Copyright (C) Pingo (cczjp89@gmail.com)\n */\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_codec_module.h\"\n#include \"ngx_rtmp_live_module.h\"\n#include \"ngx_mpegts_live_module.h\"\n\n\nstatic ngx_rtmp_close_stream_pt         next_close_stream;\n\nstatic ngx_mpegts_video_pt next_mpegts_video;\nstatic ngx_mpegts_audio_pt next_mpegts_audio;\n\nstatic void *ngx_mpegts_gop_create_app_conf(ngx_conf_t *cf);\nstatic char *ngx_mpegts_gop_merge_app_conf(ngx_conf_t *cf, void *parent,\n       void *child);\n\nstatic ngx_int_t ngx_mpegts_gop_postconfiguration(ngx_conf_t *cf);\n\n#define ngx_mpegts_gop_next(s, pos) ((pos + 1) % s->out_queue)\n#define ngx_mpegts_gop_prev(s, pos) (pos == 0 ? s->out_queue - 1 : pos - 1)\n\ntypedef struct {\n    /* publisher: head of cache\n     * player: cache send position of publisher's out\n     */\n    size_t                      gop_pos;\n    /* tail of cache */\n    size_t                      gop_last;\n    /* 0 for not send, 1 for sending, 2 for sent */\n    ngx_flag_t                  send_gop;\n\n    ngx_mpegts_frame_t         *keyframe;\n\n    ngx_uint_t                  meta_version;\n\n    uint64_t                    first_timestamp;\n    uint64_t                    current_timestamp;\n\n    ngx_uint_t                  base_type;\n\n    /* only for publisher, must at last of ngx_mpegts_gop_ctx_t */\n    ngx_mpegts_frame_t         *cache[];\n} ngx_mpegts_gop_ctx_t;\n\ntypedef struct {\n    ngx_msec_t                  cache_time;\n    ngx_msec_t                  roll_back;\n    ngx_msec_t                  one_off_send;\n    ngx_flag_t                  low_latency;\n    ngx_flag_t                  send_all;\n    ngx_msec_t                  fix_timestamp;\n    ngx_flag_t                  zero_start;\n} ngx_mpegts_gop_app_conf_t;\n\n\nstatic ngx_command_t  ngx_mpegts_gop_commands[] = {\n\n    { ngx_string(\"mpegts_cache_time\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_mpegts_gop_app_conf_t, cache_time),\n      NULL },\n\n    { ngx_string(\"mpegts_roll_back\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_mpegts_gop_app_conf_t, roll_back),\n      NULL },\n\n    { ngx_string(\"mpegts_one_off_send\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_mpegts_gop_app_conf_t, one_off_send),\n      NULL },\n\n    { ngx_string(\"mpegts_low_latency\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_mpegts_gop_app_conf_t, low_latency),\n      NULL },\n\n    { ngx_string(\"mpegts_send_all\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_mpegts_gop_app_conf_t, send_all),\n      NULL },\n\n    { ngx_string(\"mpegts_fix_timestamp\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_mpegts_gop_app_conf_t, fix_timestamp),\n      NULL },\n\n    { ngx_string(\"mpegts_zero_start\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_mpegts_gop_app_conf_t, zero_start),\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_mpegts_gop_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_mpegts_gop_postconfiguration,       /* postconfiguration */\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    ngx_mpegts_gop_create_app_conf,         /* create app configuration */\n    ngx_mpegts_gop_merge_app_conf           /* merge app configuration */\n};\n\n\nngx_module_t  ngx_mpegts_gop_module = {\n    NGX_MODULE_V1,\n    &ngx_mpegts_gop_module_ctx,             /* module context */\n    ngx_mpegts_gop_commands,                /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_mpegts_gop_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_mpegts_gop_app_conf_t    *gacf;\n\n    gacf = ngx_pcalloc(cf->pool, sizeof(ngx_mpegts_gop_app_conf_t));\n    if (gacf == NULL) {\n        return NULL;\n    }\n\n    gacf->cache_time = NGX_CONF_UNSET_MSEC;\n    gacf->roll_back = NGX_CONF_UNSET_MSEC;\n    gacf->one_off_send = NGX_CONF_UNSET_MSEC;\n    gacf->low_latency = NGX_CONF_UNSET;\n    gacf->send_all = NGX_CONF_UNSET;\n    gacf->fix_timestamp = NGX_CONF_UNSET_MSEC;\n    gacf->zero_start = NGX_CONF_UNSET;\n\n    return gacf;\n}\n\nstatic char *\nngx_mpegts_gop_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_mpegts_gop_app_conf_t    *prev = parent;\n    ngx_mpegts_gop_app_conf_t    *conf = child;\n\n    ngx_conf_merge_msec_value(conf->cache_time, prev->cache_time, 0);\n    ngx_conf_merge_msec_value(conf->roll_back, prev->roll_back, conf->cache_time);\n    ngx_conf_merge_msec_value(conf->one_off_send, prev->one_off_send, 3000);\n    ngx_conf_merge_value(conf->low_latency, prev->low_latency, 0);\n    ngx_conf_merge_value(conf->send_all, prev->send_all, 0);\n    ngx_conf_merge_msec_value(conf->fix_timestamp, prev->fix_timestamp, 10000);\n    ngx_conf_merge_value(conf->zero_start, prev->zero_start, 0);\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_mpegts_gop_link_frame(ngx_rtmp_session_t *s, ngx_mpegts_frame_t *frame)\n{\n    ngx_uint_t              nmsg;\n\n    if (frame == NULL) {\n        return NGX_OK;\n    }\n\n    nmsg = (s->out_last - s->out_pos) % s->out_queue + 1;\n\n    if (nmsg >= s->out_queue) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"link frame nmsg(%ui) >= out_queue(%O)\", nmsg, s->out_queue);\n        return NGX_AGAIN;\n    }\n\n#if 0\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n        \"link frame pos[%O] last[%O], pts[%ud]\",\n        s->out_pos, s->out_last, frame->pts);\n#endif\n\n    s->mpegts_out[s->out_last] = frame;\n    s->out_last = ngx_mpegts_gop_next(s, s->out_last);\n\n    ngx_rtmp_shared_acquire_mpegts_frame(frame);\n\n    return NGX_OK;\n}\n\n\nstatic void\nngx_mpegts_gop_reset_gop(ngx_rtmp_session_t *s, ngx_mpegts_gop_ctx_t *ctx,\n        ngx_mpegts_frame_t *frame)\n{\n    ngx_mpegts_gop_app_conf_t   *gacf;\n    ngx_mpegts_frame_t          *f, *next_keyframe;\n    size_t                       pos;\n    ngx_uint_t                   nmsg;\n    ngx_msec_t                   cache_time;\n\n    pos = ctx->gop_pos;\n\n    f = ctx->cache[pos];\n    if (f == NULL) {\n        return;\n    }\n\n    gacf = ngx_rtmp_get_module_app_conf(s, ngx_mpegts_gop_module);\n\n    cache_time = gacf->cache_time > gacf->roll_back ?\n        gacf->cache_time : gacf->roll_back;\n\n    /* only audio in cache */\n    if (ctx->keyframe == NULL) {\n        if (frame->pts - ctx->cache[ctx->gop_pos]->pts > cache_time * 90) {\n            ngx_rtmp_shared_free_mpegts_frame(f);\n            ctx->cache[ctx->gop_pos] = NULL;\n            ctx->gop_pos = ngx_mpegts_gop_next(s, ctx->gop_pos);\n        }\n\n        return;\n    }\n\n    /* only video of video + audio */\n    next_keyframe = ctx->keyframe->next;\n\n    /* only one gop in cache */\n    if (next_keyframe == NULL) {\n        return;\n    }\n\n    nmsg = (ctx->gop_last - ctx->gop_pos) % s->out_queue + 2;\n    if (nmsg >= s->out_queue) {\n        goto reset;\n    }\n\n    if (frame->type == NGX_MPEGTS_MSG_AUDIO) {\n        return;\n    }\n\n    if (frame->type == NGX_MPEGTS_MSG_VIDEO && frame->pts\n            - next_keyframe->pts < cache_time * 90)\n    {\n        return;\n    }\n\nreset:\n    for (pos = ctx->gop_pos; ctx->cache[pos] != next_keyframe;\n            pos = ngx_mpegts_gop_next(s, pos))\n    {\n        f = ctx->cache[pos];\n\n        ngx_rtmp_shared_free_mpegts_frame(f);\n\n        ctx->cache[pos] = NULL;\n    }\n\n    ctx->keyframe = next_keyframe;\n    ctx->gop_pos = pos;\n}\n\nstatic void\nngx_mpegts_gop_print_cache(ngx_rtmp_session_t *s, ngx_mpegts_gop_ctx_t *ctx)\n{\n#if (NGX_DEBUG)\n    ngx_mpegts_frame_t         *frame;\n    u_char                      content[10240], *p;\n    size_t                      pos;\n\n    ngx_memzero(content, sizeof(content));\n\n    p = content;\n    for (pos = ctx->gop_pos; pos != ctx->gop_last;\n            pos = ngx_mpegts_gop_next(s, pos))\n    {\n        frame = ctx->cache[pos];\n        switch (frame->type) {\n        case NGX_MPEGTS_MSG_AUDIO:\n            *p++ = 'A';\n            break;\n        case NGX_MPEGTS_MSG_VIDEO:\n            *p++ = 'V';\n            break;\n        default:\n            *p++ = 'O';\n            break;\n        }\n\n        if (frame->key) {\n            *p++ = 'I';\n        }\n\n        *p++ = ' ';\n    }\n\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n            \"[%z %z] %s\", ctx->gop_pos, ctx->gop_last, content);\n#endif\n}\n\nngx_int_t\nngx_mpegts_gop_cache(ngx_rtmp_session_t *s, ngx_mpegts_frame_t *frame)\n{\n    ngx_mpegts_gop_app_conf_t    *gacf;\n    ngx_mpegts_gop_ctx_t         *ctx;\n    ngx_mpegts_frame_t          **keyframe;\n    ngx_uint_t                    nmsg;\n\n    gacf = ngx_rtmp_get_module_app_conf(s, ngx_mpegts_gop_module);\n    if (gacf->cache_time == 0) {\n        return NGX_OK;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_gop_module);\n    if (ctx == NULL) {\n        ctx = ngx_pcalloc(s->pool, sizeof(ngx_mpegts_gop_ctx_t)\n                          + s->out_queue * sizeof(ngx_mpegts_frame_t *));\n        if (ctx == NULL) {\n            return NGX_ERROR;\n        }\n        ngx_rtmp_set_ctx(s, ctx, ngx_mpegts_gop_module);\n    }\n\n    nmsg = (ctx->gop_last - ctx->gop_pos) % s->out_queue + 1;\n    if (nmsg >= s->out_queue) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"cache frame nmsg(%ui) >= out_queue(%z)\", nmsg, s->out_queue);\n        return NGX_AGAIN;\n    }\n#if 0\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n            \"cache frame: %ud[%d], %ud, %ud\",\n            frame->type, frame->key, frame->pts, frame->length);\n#endif\n    /* first video frame is not intra_frame */\n    if (ctx->keyframe == NULL && frame->type == NGX_MPEGTS_MSG_VIDEO\n            && !frame->key)\n    {\n        return NGX_OK;\n    }\n\n    /* video intra_frame */\n    if (frame->key) {\n        for (keyframe = &ctx->keyframe; *keyframe;\n                keyframe = &((*keyframe)->next));\n        *keyframe = frame;\n    }\n\n    frame->pos = ctx->gop_last;\n    ctx->current_timestamp = frame->pts;\n    ctx->cache[ctx->gop_last] = frame;\n    ctx->gop_last = ngx_mpegts_gop_next(s, ctx->gop_last);\n\n    ngx_rtmp_shared_acquire_mpegts_frame(frame);\n\n    ngx_mpegts_gop_reset_gop(s, ctx, frame);\n\n    ngx_mpegts_gop_print_cache(s, ctx);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_mpegts_gop_send_gop(ngx_rtmp_session_t *s, ngx_rtmp_session_t *ss)\n{\n    ngx_mpegts_gop_app_conf_t    *gacf;\n    ngx_mpegts_gop_ctx_t         *sctx, *ssctx;\n    ngx_mpegts_frame_t           *frame, *keyframe;\n    size_t                        pos;\n\n    gacf = ngx_rtmp_get_module_app_conf(s, ngx_mpegts_gop_module);\n\n    sctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_gop_module);\n    ssctx = ngx_rtmp_get_module_ctx(ss, ngx_mpegts_gop_module);\n\n    /* already send gop */\n    if (ssctx->send_gop == 2) {\n        return NGX_OK;\n    }\n\n    //*****************************************************************\n    //\n    // TODO: send pat pmt\n    //\n    //*****************************************************************\n\n    /* link frame in s to ss */\n    if (ssctx->send_gop == 0) {\n        ssctx->gop_pos = sctx->gop_pos;\n        if (sctx->cache[ssctx->gop_pos] == NULL) {\n            return NGX_AGAIN;\n        }\n\n        ssctx->send_gop = 1;\n        ssctx->first_timestamp = sctx->cache[ssctx->gop_pos]->pts;\n        ssctx->base_type = sctx->cache[ssctx->gop_pos]->type;\n    } else {\n        if (sctx->cache[ssctx->gop_pos] == NULL) {\n            ssctx->gop_pos = sctx->gop_pos;\n        }\n    }\n\n    frame = NULL;\n\n    keyframe = sctx->keyframe;\n    while (ss->roll_back && keyframe &&\n        ((sctx->current_timestamp - keyframe->pts) > ss->roll_back * 90))\n    {\n        ngx_log_error(NGX_LOG_INFO, s->log, 0,\n            \"rtmp-gop: send_gop| curr %D - k %D, %D\",\n            sctx->current_timestamp, keyframe->pts, ss->roll_back * 90);\n        frame = keyframe;\n        keyframe = keyframe->next;\n    }\n\n    if (frame == NULL) {\n        pos = ssctx->gop_pos;\n        frame = sctx->cache[pos];\n    } else {\n        pos = frame->pos;\n    }\n\n    while (frame) {\n\n        ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n            \"send gop link %D, type %d, curr %D\",\n            frame->pts/90, frame->type, sctx->current_timestamp/90);\n        if (ngx_mpegts_gop_link_frame(ss, frame) == NGX_AGAIN) {\n            break;\n        }\n\n        if (!gacf->send_all && frame->type == ssctx->base_type &&\n            frame->pts - ssctx->first_timestamp >= gacf->one_off_send * 90)\n        {\n            ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                \"gone %D, type %d, first %D, curr %D, send %D\",\n                frame->pts/90, frame->type, ssctx->first_timestamp/90,\n                sctx->current_timestamp/90, gacf->one_off_send);\n\n            ssctx->send_gop = 2;\n            pos = ngx_mpegts_gop_next(s, pos);\n            break;\n        }\n\n        pos = ngx_mpegts_gop_next(s, pos);\n        frame = sctx->cache[pos];\n    }\n\n    if (frame == NULL) { /* send all frame in cache */\n        ssctx->send_gop = 2;\n    }\n\n    ssctx->gop_pos = pos;\n    ngx_rtmp_send_message(ss, NULL, 0);\n\n    return NGX_AGAIN;\n}\n\nngx_int_t\nngx_mpegts_gop_send(ngx_rtmp_session_t *s, ngx_rtmp_session_t *ss)\n{\n    ngx_mpegts_gop_app_conf_t   *gacf;\n    ngx_mpegts_gop_ctx_t        *sctx, *ssctx;\n    ngx_mpegts_frame_t          *frame;\n\n    gacf = ngx_rtmp_get_module_app_conf(s, ngx_mpegts_gop_module);\n    if (gacf->cache_time == 0) {\n        return NGX_DECLINED;\n    }\n\n    sctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_gop_module);\n    if (sctx == NULL) { /* publisher doesn't publish av frame */\n        return NGX_DECLINED;\n    }\n\n    ssctx = ngx_rtmp_get_module_ctx(ss, ngx_mpegts_gop_module);\n    if (ssctx == NULL) {\n        ssctx = ngx_pcalloc(ss->pool, sizeof(ngx_mpegts_gop_ctx_t));\n        if (ssctx == NULL) {\n            return NGX_ERROR;\n        }\n        ngx_rtmp_set_ctx(ss, ssctx, ngx_mpegts_gop_module);\n    }\n\n    if (ngx_mpegts_gop_send_gop(s, ss) == NGX_AGAIN) {\n        return NGX_OK;\n    }\n\n    if (sctx->cache[ssctx->gop_pos] == NULL) {\n        ngx_log_error(NGX_LOG_ERR, ss->log, 0,\n                \"mpegts-gop: gop_send| current gop pos is NULL, \"\n                \"skip to new postion [pos %d last %d] %d\",\n                sctx->gop_pos, sctx->gop_last, ssctx->gop_pos);\n\n        ssctx->gop_pos = sctx->gop_pos;\n    }\n\n    frame = sctx->cache[ssctx->gop_pos];\n    if (ngx_mpegts_gop_link_frame(ss, frame) == NGX_AGAIN) {\n        return NGX_AGAIN;\n    }\n\n    ssctx->gop_pos = ngx_mpegts_gop_next(s, ssctx->gop_pos);\n    ngx_rtmp_send_message(ss, NULL, 0);\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_mpegts_gop_offset_frames(ngx_rtmp_session_t *s, ngx_rtmp_session_t *ss,\n    ngx_msec_t time_offset, ngx_msec_t duration)\n{\n    ngx_mpegts_gop_ctx_t         *sctx, *ssctx;\n    ngx_mpegts_frame_t           *frame, *keyframe;\n    size_t                        pos;\n\n    sctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_gop_module);\n    ssctx = ngx_rtmp_get_module_ctx(ss, ngx_mpegts_gop_module);\n\n    /* already send gop */\n    if (ssctx->send_gop == 2) {\n        return NGX_OK;\n    }\n\n    //*****************************************************************\n    //\n    // TODO: send pat pmt\n    //\n    //*****************************************************************\n\n    /* link frame in s to ss */\n    if (ssctx->send_gop == 0) {\n        ssctx->gop_pos = sctx->gop_pos;\n        if (sctx->cache[ssctx->gop_pos] == NULL) {\n            return NGX_AGAIN;\n        }\n\n        ssctx->send_gop = 1;\n        ssctx->first_timestamp = sctx->cache[ssctx->gop_pos]->pts;\n        ssctx->base_type = sctx->cache[ssctx->gop_pos]->type;\n    } else {\n        if (sctx->cache[ssctx->gop_pos] == NULL) {\n            ssctx->gop_pos = sctx->gop_pos;\n        }\n    }\n\n    frame = NULL;\n\n    keyframe = sctx->keyframe;\n    while (time_offset && keyframe &&\n        ((sctx->current_timestamp - keyframe->pts) > time_offset * 90))\n    {\n        ngx_log_error(NGX_LOG_DEBUG, ss->log, 0,\n            \"mpegts-gop: offset_frames| curr %D - k %D = %D, %D\",\n            sctx->current_timestamp, keyframe->pts,\n            (sctx->current_timestamp - keyframe->pts) / 90, time_offset);\n        frame = keyframe;\n        keyframe = keyframe->next;\n        ssctx->first_timestamp = frame->pts;\n        ssctx->base_type = frame->type;\n    }\n\n    if (frame == NULL) {\n        pos = ssctx->gop_pos;\n        frame = sctx->cache[pos];\n    } else {\n        pos = frame->pos;\n    }\n\n    while (frame) {\n\n        if (ngx_mpegts_gop_link_frame(ss, frame) == NGX_AGAIN) {\n            break;\n        }\n\n        if (frame->type == ssctx->base_type &&\n            frame->pts - ssctx->first_timestamp >= duration * 90)\n        {\n            ngx_log_error(NGX_LOG_INFO, ss->log, 0, \"gone %D, first %D, curr %D\",\n                frame->pts, ssctx->first_timestamp, sctx->current_timestamp);\n            ssctx->send_gop = 2;\n            pos = ngx_mpegts_gop_next(s, pos);\n            break;\n        }\n\n        pos = ngx_mpegts_gop_next(s, pos);\n        frame = sctx->cache[pos];\n    }\n\n    if (frame == NULL) { /* send all frame in cache */\n        ssctx->send_gop = 2;\n    }\n\n    ssctx->gop_pos = pos;\n\n    return NGX_AGAIN;\n}\n\nngx_int_t\nngx_mpegts_gop_link(ngx_rtmp_session_t *s, ngx_rtmp_session_t *ss,\n    ngx_msec_t time_offset, ngx_msec_t duration)\n{\n    ngx_mpegts_gop_app_conf_t    *gacf;\n    ngx_mpegts_gop_ctx_t         *sctx, *ssctx;\n    ngx_mpegts_frame_t           *frame;\n\n    gacf = ngx_rtmp_get_module_app_conf(s, ngx_mpegts_gop_module);\n    if (gacf->cache_time == 0) {\n        return NGX_DECLINED;\n    }\n\n    sctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_gop_module);\n    if (sctx == NULL) { /* publisher doesn't publish av frame */\n        return NGX_DECLINED;\n    }\n\n    ssctx = ngx_rtmp_get_module_ctx(ss, ngx_mpegts_gop_module);\n    if (ssctx == NULL) {\n        ssctx = ngx_pcalloc(ss->pool, sizeof(ngx_mpegts_gop_ctx_t));\n        if (ssctx == NULL) {\n            return NGX_ERROR;\n        }\n        ngx_rtmp_set_ctx(ss, ssctx, ngx_mpegts_gop_module);\n    }\n\n    if (ngx_mpegts_gop_offset_frames(s, ss, time_offset, duration) == NGX_AGAIN)\n    {\n        return NGX_OK;\n    }\n\n    /* new frame is video key frame */\n    if (sctx->cache[ssctx->gop_pos] == NULL) {\n        ngx_log_error(NGX_LOG_ERR, ss->log, 0,\n                \"mpegts-gop: link| current gop pos is NULL, \"\n                \"skip to new postion [pos %d last %d] %d\",\n                sctx->gop_pos, sctx->gop_last, ssctx->gop_pos);\n\n        ssctx->gop_pos = sctx->gop_pos;\n    }\n\n    frame = sctx->cache[ssctx->gop_pos];\n    if (ngx_mpegts_gop_link_frame(ss, frame) == NGX_AGAIN) {\n        return NGX_AGAIN;\n    }\n\n    ssctx->gop_pos = ngx_mpegts_gop_next(s, ssctx->gop_pos);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_mpegts_gop_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)\n{\n    ngx_mpegts_gop_ctx_t   *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_gop_module);\n    if (ctx == NULL) {\n        goto next;\n    }\n\n    if (!s->published) {\n        goto next;\n    }\n\n    /* free cache in publisher */\n    while (ctx->gop_pos != ctx->gop_last) {\n        ngx_rtmp_shared_free_mpegts_frame(ctx->cache[ctx->gop_pos]);\n        ctx->gop_pos = ngx_mpegts_gop_next(s, ctx->gop_pos);\n    }\n\nnext:\n    return next_close_stream(s, v);\n}\n\nstatic ngx_int_t\nngx_mpegts_gop_av(ngx_rtmp_session_t *s, ngx_mpegts_frame_t *frame)\n{\n    if (frame->type == NGX_MPEGTS_MSG_VIDEO) {\n        ngx_mpegts_gop_cache(s, frame);\n\n        return next_mpegts_video(s, frame);\n    } else if (frame->type == NGX_MPEGTS_MSG_AUDIO) {\n        ngx_mpegts_gop_cache(s, frame);\n\n        return next_mpegts_audio(s, frame);\n    }\n\n    return NGX_ERROR;\n}\n\nstatic ngx_int_t\nngx_mpegts_gop_postconfiguration(ngx_conf_t *cf)\n{\n    next_close_stream = ngx_rtmp_close_stream;\n    ngx_rtmp_close_stream = ngx_mpegts_gop_close_stream;\n\n    next_mpegts_video = ngx_mpegts_video;\n    ngx_mpegts_video = ngx_mpegts_gop_av;\n\n    next_mpegts_audio = ngx_mpegts_audio;\n    ngx_mpegts_audio = ngx_mpegts_gop_av;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/mpegts/ngx_mpegts_gop_module.h",
    "content": "\n/*\n * Copyright (C) Pingo (cczjp89@gmail.com)\n */\n\n#ifndef _NGX_MPEGTS_GOP_MODULE_H_INCLUDE_\n#define _NGX_MPEGTS_GOP_MODULE_H_INCLUDE_\n\n#include \"ngx_rtmp.h\"\n\nngx_int_t\nngx_mpegts_gop_cache(ngx_rtmp_session_t *s, ngx_mpegts_frame_t *frame);\nngx_int_t\nngx_mpegts_gop_link(ngx_rtmp_session_t *s, ngx_rtmp_session_t *ss,\n    ngx_msec_t time_offset, ngx_msec_t duration);\nngx_int_t\nngx_mpegts_gop_send(ngx_rtmp_session_t *s, ngx_rtmp_session_t *ss);\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/mpegts/ngx_mpegts_http_module.c",
    "content": "\n/*\n * Copyright (C) Pingo (cczjp89@gmail.com)\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_event.h>\n#include <ngx_http.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_cmd_module.h\"\n#include \"ngx_rbuf.h\"\n#include \"ngx_http_set_header.h\"\n#include \"ngx_rtmp_monitor_module.h\"\n#include \"ngx_mpegts_gop_module.h\"\n#include \"ngx_mpegts_live_module.h\"\n\n\nstatic char *ngx_mpegts_http(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\n\nstatic void *ngx_mpegts_http_create_loc_conf(ngx_conf_t *cf);\nstatic char *ngx_mpegts_http_merge_loc_conf(ngx_conf_t *cf, void *parent,\n       void *child);\n\nstatic ngx_keyval_t ngx_mpegts_http_headers[] = {\n    { ngx_string(\"Cache-Control\"),  ngx_string(\"no-cache\") },\n//    { ngx_string(\"Content-Type\"),   ngx_string(\"video/x-ts\") },\n    { ngx_null_string, ngx_null_string }\n};\n\ntypedef struct {\n    ngx_rtmp_session_t         *session;\n} ngx_mpegts_http_ctx_t;\n\ntypedef struct {\n    ngx_str_t                   app;\n    ngx_str_t                   flashver;\n    ngx_str_t                   swf_url;\n    ngx_str_t                   tc_url;\n    ngx_str_t                   page_url;\n\n    ngx_rtmp_addr_conf_t       *addr_conf;\n} ngx_mpegts_http_loc_conf_t;\n\n\nstatic ngx_command_t  ngx_mpegts_http_commands[] = {\n\n    { ngx_string(\"ts_live\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE12,\n      ngx_mpegts_http,\n      NGX_HTTP_LOC_CONF_OFFSET,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_mpegts_http_module_ctx = {\n    NULL,                               /* preconfiguration */\n    NULL,                               /* postconfiguration */\n\n    NULL,                               /* create main configuration */\n    NULL,                               /* init main configuration */\n\n    NULL,                               /* create server configuration */\n    NULL,                               /* merge server configuration */\n\n    ngx_mpegts_http_create_loc_conf,  /* create location configuration */\n    ngx_mpegts_http_merge_loc_conf    /* merge location configuration */\n};\n\n\nngx_module_t  ngx_mpegts_http_module = {\n    NGX_MODULE_V1,\n    &ngx_mpegts_http_module_ctx,      /* module context */\n    ngx_mpegts_http_commands,         /* module directives */\n    NGX_HTTP_MODULE,                    /* module type */\n    NULL,                               /* init master */\n    NULL,                               /* init module */\n    NULL,                               /* init process */\n    NULL,                               /* init thread */\n    NULL,                               /* exit thread */\n    NULL,                               /* exit process */\n    NULL,                               /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_int_t\nngx_mpegts_http_send_header(ngx_http_request_t *r)\n{\n    ngx_int_t                rc;\n    ngx_keyval_t            *h;\n    ngx_chain_t              out;\n    ngx_mpegts_http_ctx_t   *ctx;\n    ngx_rtmp_session_t      *s, *ps;\n\n    if (r->header_sent) {\n        return NGX_OK;\n    }\n\n    ctx = ngx_http_get_module_ctx(r, ngx_mpegts_http_module);\n    s = ctx->session;\n    ps = s->live_stream->publish_ctx->session;\n\n    r->headers_out.status = NGX_HTTP_OK;\n    r->keepalive = 0; /* set Connection to closed */\n\n    h = ngx_mpegts_http_headers;\n    while (h->key.len) {\n        rc = ngx_http_set_header_out(r, &h->key, &h->value);\n        if (rc != NGX_OK) {\n            return rc;\n        }\n        ++h;\n    }\n\n    rc = ngx_http_send_header(r);\n    if (rc == NGX_ERROR || rc > NGX_OK) {\n        return rc;\n    }\n\n    ngx_memzero(&out, sizeof(out));\n    out.buf = ngx_create_temp_buf(s->pool, 376);\n    out.buf->last = ngx_cpymem(out.buf->pos,\n        ngx_rtmp_mpegts_pat, 188);\n\n    ngx_rtmp_mpegts_gen_pmt(ps->vcodec, ps->acodec, s->log, out.buf->last);\n    out.buf->last += 188;\n\n    out.buf->flush = 1;\n    out.buf->memory = 1;\n\n    return ngx_http_output_filter(r, &out);\n}\n\nstatic void\nngx_mpegts_http_write_handler(ngx_http_request_t *r)\n{\n    ngx_mpegts_http_ctx_t   *ctx;\n    ngx_rtmp_session_t      *s;\n    ngx_event_t             *wev;\n    size_t                   present, sent;\n    ngx_int_t                rc;\n    ngx_chain_t             *cl;\n\n    wev = r->connection->write;\n\n    if (r->connection->destroyed) {\n        return;\n    }\n\n    ctx = ngx_http_get_module_ctx(r, ngx_mpegts_http_module);\n    s = ctx->session;\n\n    if (wev->timedout) {\n        ngx_log_error(NGX_LOG_INFO, s->log, NGX_ETIMEDOUT,\n                \"mpegts-http: write_handler| client timed out\");\n        r->connection->timedout = 1;\n        s->finalize_reason = NGX_LIVE_FLV_SEND_TIMEOUT;\n        if (r->header_sent) {\n            ngx_http_finalize_request(r, NGX_HTTP_REQUEST_TIME_OUT);\n        } else {\n            r->error_page = 1;\n            ngx_http_finalize_request(r, NGX_HTTP_SERVICE_UNAVAILABLE);\n        }\n\n        return;\n    }\n\n    if (wev->timer_set) {\n        ngx_del_timer(wev);\n    }\n\n    if (ngx_rtmp_core_main_conf->fast_reload && (ngx_exiting || ngx_terminate)) {\n        r->error_page = 1;\n        ngx_http_finalize_request(r, NGX_HTTP_SERVICE_UNAVAILABLE);\n        return;\n    }\n\n    if (ngx_rtmp_prepare_merge_frame(s) == NGX_ERROR) {\n        ngx_http_finalize_request(r, NGX_ERROR);\n        return;\n    }\n\n    if (s->out_chain) {\n        rc = ngx_mpegts_http_send_header(r);\n        if (rc == NGX_ERROR || rc > NGX_OK) {\n            s->finalize_reason = NGX_LIVE_FLV_SEND_ERR;\n            ngx_http_finalize_request(r, rc);\n            return;\n        }\n    }\n\n    while (s->out_chain) {\n        present = r->connection->sent;\n\n        if (r->connection->buffered) {\n            rc = ngx_http_output_filter(r, NULL);\n        } else {\n            rc = ngx_http_output_filter(r, s->out_chain);\n        }\n\n        sent = r->connection->sent - present;\n\n        ngx_rtmp_update_bandwidth(&ngx_rtmp_bw_out, sent);\n\n        if (rc == NGX_AGAIN) {\n            ngx_add_timer(wev, s->timeout);\n            if (ngx_handle_write_event(wev, 0) != NGX_OK) {\n                ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,\n                        \"mpegts-http: write_handler| write event failed\");\n                ngx_http_finalize_request(r, NGX_ERROR);\n            }\n            return;\n        }\n\n        if (rc == NGX_ERROR) {\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,\n                    \"mpegts-http: write_handler| send error\");\n            s->finalize_reason = NGX_LIVE_FLV_SEND_ERR;\n            ngx_http_finalize_request(r, NGX_ERROR);\n            return;\n        }\n\n        /* NGX_OK */\n        for (cl = s->out_chain; cl;) {\n            s->out_chain = cl->next;\n            ngx_free_chain(s->pool, cl);\n            cl = s->out_chain;\n        }\n\n        if (ngx_rtmp_prepare_merge_frame(s) == NGX_ERROR) {\n            ngx_http_finalize_request(r, NGX_ERROR);\n            return;\n        }\n    }\n\n    if (wev->active) {\n        ngx_del_event(wev, NGX_WRITE_EVENT, 0);\n    }\n}\n\n\nstatic void\nngx_mpegts_http_parse_url(ngx_http_request_t *r, ngx_str_t *app,\n        ngx_str_t *name)\n{\n    u_char                             *p, *end, *pos;\n\n    p = r->uri.data + 1; /* skip '/' */\n    end = r->uri.data + r->uri.len;\n    app->data = p;\n\n    pos = (u_char *) ngx_strnstr(p, \".ts\", end - p);\n    if (pos) {\n        end = pos;\n    }\n\n    p = (u_char *) ngx_strnstr(p, \"/\", end - p);\n    while (p) {\n        name->data = p;\n        p = (u_char *) ngx_strnstr(p + 1, \"/\", end - p);\n    }\n\n    if (name->data == NULL) {\n        return;\n    }\n\n    app->len = name->data - app->data;\n\n    ++name->data;\n    name->len = end - name->data;\n}\n\nstatic ngx_int_t\nngx_mpegts_http_parse(ngx_http_request_t *r, ngx_rtmp_session_t *s,\n        ngx_rtmp_play_t *v)\n{\n    ngx_mpegts_http_loc_conf_t       *hflcf;\n    ngx_str_t                           app, stream;\n    size_t                              tcurl_len;\n    u_char                             *p;\n\n    hflcf = ngx_http_get_module_loc_conf(r, ngx_mpegts_http_module);\n\n    ngx_memzero(&app, sizeof(ngx_str_t));\n    ngx_memzero(&stream, sizeof(ngx_str_t));\n\n    ngx_mpegts_http_parse_url(r, &app, &stream);\n\n    if (app.len == 0 || stream.len == 0 || stream.len > NGX_RTMP_MAX_NAME) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                \"mpegts-http: http_parse| url error: %V\", &r->uri);\n        return NGX_HTTP_BAD_REQUEST;\n    }\n\n    if (hflcf->app.len) {\n        app = hflcf->app;\n    }\n\n    ngx_http_arg(r, (u_char *) \"app\", 3, &app);\n\n    s->app = app;\n\n    if (ngx_http_arg(r, (u_char *) \"flashver\", 8, &s->flashver) != NGX_OK) {\n        s->flashver = hflcf->flashver;\n    }\n\n    /* tc_url */\n#if (NGX_HTTP_SSL)\n    if (r->connection->ssl) {\n        tcurl_len = sizeof(\"https://\") - 1;\n    } else\n#endif\n    {\n        tcurl_len = sizeof(\"http://\") - 1;\n    }\n    tcurl_len += r->headers_in.server.len + 1 + app.len;\n\n    s->tc_url.len = tcurl_len;\n    s->tc_url.data = ngx_pcalloc(r->pool, tcurl_len);\n    if (s->tc_url.data == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    p = s->tc_url.data;\n\n#if (NGX_HTTP_SSL)\n    if (r->connection->ssl) {\n        p = ngx_cpymem(p, \"https://\", sizeof(\"https://\") - 1);\n    } else\n#endif\n    {\n        p = ngx_cpymem(p, \"http://\", sizeof(\"http://\") - 1);\n    }\n\n    p = ngx_cpymem(p, r->headers_in.server.data, r->headers_in.server.len);\n    *p++ = '/';\n    p = ngx_cpymem(p, app.data, app.len);\n\n    /* page_url */\n    if (r->headers_in.referer) {\n        s->page_url = r->headers_in.referer->value;\n    } else {\n        s->page_url = hflcf->page_url;\n    }\n\n    s->acodecs = 0x0DF7;\n    s->vcodecs = 0xFC;\n\n    ngx_memcpy(v->name, stream.data, stream.len);\n\n    if (r->args.len) {\n        ngx_memcpy(v->args, r->args.data,\n                ngx_min(r->args.len, NGX_RTMP_MAX_ARGS));\n    }\n\n    ngx_rtmp_cmd_middleware_init(s);\n\n    return NGX_OK;\n}\n\nstatic void\nngx_mpegts_http_cleanup(void *data)\n{\n    ngx_http_request_t                 *r;\n    ngx_mpegts_http_ctx_t            *ctx;\n\n    r = data;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_mpegts_http_module);\n\n    if (ctx == NULL) {\n        return;\n    }\n\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n            \"mpegts-http: cleanup| cleanup\");\n\n    if (ctx->session) {\n        ctx->session->request = NULL;\n\n        if (ctx->session->finalize_reason == 0) {\n            ctx->session->finalize_reason = r->connection->read->error?\n                NGX_LIVE_FLV_RECV_ERR : NGX_LIVE_NORMAL_CLOSE;\n        }\n\n        ngx_rtmp_finalize_fake_session(ctx->session);\n    }\n}\n\nstatic ngx_chain_t *\nngx_mpegts_http_prepare_out_chain(ngx_rtmp_session_t *s)\n{\n    ngx_mpegts_frame_t                 *frame;\n    ngx_chain_t                        *head, **ll, *cl;\n\n    frame = NULL;\n    head = NULL;\n\n    if (s->out_pos != s->out_last) {\n        frame = s->mpegts_out[s->out_pos];\n    }\n\n    /* no frame to send */\n    if (frame == NULL) {\n        return NULL;\n    }\n\n    ll = &head;\n\n    for (cl = frame->chain; cl; cl = cl->next) {\n        (*ll) = ngx_get_chainbuf(0, 0);\n        if (*ll == NULL) {\n            goto falied;\n        }\n        (*ll)->buf->pos = cl->buf->pos;\n        (*ll)->buf->last = cl->buf->last;\n        if (!(*ll)->next) {\n            (*ll)->buf->flush = 1;\n        }\n\n        ll = &(*ll)->next;\n    }\n\n    return head;\n\nfalied:\n    ngx_put_chainbufs(head);\n\n    ngx_rtmp_finalize_session(s);\n    return NULL;\n}\n\nstatic ngx_int_t\nngx_mpegts_http_handler(ngx_http_request_t *r)\n{\n    ngx_mpegts_http_loc_conf_t   *hflcf;\n    ngx_mpegts_http_ctx_t        *ctx;\n    ngx_rtmp_session_t           *s;\n    ngx_rtmp_play_t               v;\n    ngx_int_t                     rc;\n    ngx_uint_t                    n;\n    ngx_rtmp_core_srv_conf_t     *cscf;\n    ngx_rtmp_core_app_conf_t    **cacfp;\n    ngx_http_cleanup_t           *cln;\n    ngx_rtmp_core_main_conf_t    *cmcf;\n\n    ctx = ngx_pcalloc(r->pool, sizeof(ngx_mpegts_http_ctx_t));\n    if (ctx == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n    ngx_http_set_ctx(r, ctx, ngx_mpegts_http_module);\n\n    /* cleanup handler */\n    cln = ngx_http_cleanup_add(r, 0);\n    if (cln == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n    cln->handler = ngx_mpegts_http_cleanup;\n    cln->data = r;\n\n    hflcf = ngx_http_get_module_loc_conf(r, ngx_mpegts_http_module);\n\n    /* create fake session */\n    s = ngx_rtmp_create_session(hflcf->addr_conf);\n    if (s == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n    ctx->session = s;\n    s->connection = r->connection;\n    ngx_rtmp_set_combined_log(s, r->connection->log->data,\n            r->connection->log->handler);\n    s->log->connection = r->connection->number;\n    s->number = r->connection->number;\n    s->remote_addr_text.data = ngx_pcalloc(s->pool, r->connection->addr_text.len);\n    s->remote_addr_text.len = r->connection->addr_text.len;\n    ngx_memcpy(s->remote_addr_text.data,\n        r->connection->addr_text.data, r->connection->addr_text.len);\n\n    /* get host, app, stream name */\n    ngx_memzero(&v, sizeof(ngx_rtmp_play_t));\n    rc = ngx_mpegts_http_parse(r, s, &v);\n    if (rc != NGX_OK) {\n        return rc;\n    }\n\n    if (ngx_rtmp_set_virtual_server(s, &s->domain)) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n\n    s->live_type = NGX_MPEGTS_LIVE;\n    s->live_server = ngx_live_create_server(&s->serverid);\n    s->request = r;\n\n    v.silent = 1;\n\n    cacfp = cscf->applications.elts;\n    for (n = 0; n < cscf->applications.nelts; ++n, ++cacfp) {\n        if ((*cacfp)->name.len == s->app.len &&\n            ngx_strncmp((*cacfp)->name.data, s->app.data, s->app.len) == 0)\n        {\n            /* found app! */\n            s->app_conf = (*cacfp)->app_conf;\n            break;\n        }\n    }\n\n    if (s->app_conf == NULL) {\n\n        if (cscf->default_app == NULL || cscf->default_app->app_conf == NULL) {\n            ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n                    \"mpegts-http: http_handler| \"\n                    \"application not found '%V'\", &s->app);\n            return NGX_HTTP_NOT_FOUND;\n        }\n\n        s->app_conf = cscf->default_app->app_conf;\n    }\n\n    s->prepare_handler = ngx_mpegts_http_prepare_out_chain;\n\n    s->stage = NGX_LIVE_PLAY;\n    s->ptime = ngx_current_msec;\n\n    cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module);\n    s->variables = ngx_pcalloc(s->pool, cmcf->variables.nelts\n            * sizeof(ngx_http_variable_value_t));\n    if (s->variables == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    if (ngx_rtmp_play_filter(s, &v) != NGX_OK) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    ngx_add_timer(r->connection->write, s->timeout);\n\n    r->read_event_handler = ngx_http_test_reading;\n    r->write_event_handler = ngx_mpegts_http_write_handler;\n\n    ++r->count;\n\n    return NGX_DONE;\n}\n\n\nstatic void *\nngx_mpegts_http_create_loc_conf(ngx_conf_t *cf)\n{\n    ngx_mpegts_http_loc_conf_t   *hflcf;\n\n    hflcf = ngx_pcalloc(cf->pool, sizeof(ngx_mpegts_http_loc_conf_t));\n    if (hflcf == NULL) {\n        return NULL;\n    }\n\n    return hflcf;\n}\n\nstatic char *\nngx_mpegts_http_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_mpegts_http_loc_conf_t   *prev = parent;\n    ngx_mpegts_http_loc_conf_t   *conf = child;\n\n    ngx_conf_merge_str_value(conf->app, prev->app, \"\");\n    ngx_conf_merge_str_value(conf->flashver, prev->flashver, \"\");\n    ngx_conf_merge_str_value(conf->swf_url, prev->swf_url, \"\");\n    ngx_conf_merge_str_value(conf->tc_url, prev->tc_url, \"\");\n    ngx_conf_merge_str_value(conf->page_url, prev->page_url, \"\");\n\n    return NGX_CONF_OK;\n}\n\nstatic char *\nngx_mpegts_http(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t     *clcf;\n    ngx_mpegts_http_loc_conf_t   *hflcf;\n    ngx_str_t                    *value, v;\n    ngx_uint_t                    i;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_mpegts_http_handler;\n\n    hflcf = conf;\n\n    value = cf->args->elts;\n\n    hflcf->addr_conf = ngx_rtmp_find_related_addr_conf(cf->cycle, &value[1]);\n    if (hflcf->addr_conf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    for (i = 2; i < cf->args->nelts; ++i) {\n        if (ngx_strncmp(value[i].data, \"app=\", 4) == 0) {\n            v.data = value[i].data + 4;\n            v.len = value[i].len - 4;\n            hflcf->app = v;\n        } else {\n            return NGX_CONF_ERROR;\n        }\n    }\n\n    return NGX_CONF_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/mpegts/ngx_mpegts_live_module.c",
    "content": "\n/*\n * Copyright (C) Pingo (cczjp89@gmail.com)\n */\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_event.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_cmd_module.h\"\n#include \"ngx_rtmp_live_module.h\"\n#include \"ngx_rbuf.h\"\n#include \"ngx_mpegts_live_module.h\"\n#include \"ngx_mpegts_gop_module.h\"\n#include \"ngx_rtmp_codec_module.h\"\n\nngx_mpegts_video_pt ngx_mpegts_video;\nngx_mpegts_audio_pt ngx_mpegts_audio;\n\nstatic ngx_rtmp_publish_pt         next_publish;\nstatic ngx_rtmp_play_pt            next_play;\nstatic ngx_rtmp_close_stream_pt    next_close_stream;\n\n#define NGX_MPEGTS_BUF_SIZE   1316\n#define NGX_RTMP_MPEG_BUFSIZE 1024*1024\n\n#define TS_AUDIO_TYPE_AAC    0\n#define TS_AUDIO_TYPE_MP3    1\n\n#define TS_VIDEO_TYPE_H264   0\n#define TS_VIDEO_TYPE_H265   1\n\ntypedef struct ngx_mpegts_live_app_conf_s {\n    ngx_pool_t             *pool;\n    size_t                  audio_buffer_size;\n    ngx_msec_t              sync;\n    ngx_msec_t              audio_delay;\n    size_t                  out_queue;\n    ngx_mpegts_live_ctx_t  *players;\n    u_char                  packet_buffer[NGX_RTMP_MPEG_BUFSIZE];\n} ngx_mpegts_live_app_conf_t;\n\ntypedef struct ngx_mpegts_live_avc_codec_s {\n    ngx_rtmp_frame_t       *avc_header;\n    ngx_uint_t              video_codec_id;\n    ngx_uint_t              avc_nal_bytes;\n} ngx_mpegts_live_avc_codec_t;\n\ntypedef struct ngx_mpegts_live_aac_codec_s {\n    ngx_rtmp_frame_t       *aac_header;\n    uint64_t                sample_rate;\n} ngx_mpegts_live_aac_codec_t;\n\nstruct ngx_mpegts_live_ctx_s {\n\n    ngx_mpegts_live_ctx_t        *next;\n    ngx_rtmp_session_t           *session;\n    ngx_live_stream_t            *stream;\n\n    /* mpegts-module config */\n    size_t                        audio_buffer_size;\n    ngx_msec_t                    sync;\n    ngx_msec_t                    audio_delay;\n    size_t                        out_queue;\n\n    /* pat pmt frame*/\n    ngx_mpegts_frame_t           *patpmt;\n\n    /* video packet */\n    ngx_mpegts_live_avc_codec_t  *avc_codec;\n    ngx_uint_t                    video_cc;\n\n    /* audio packet */\n    ngx_mpegts_live_aac_codec_t  *aac_codec;\n    ngx_uint_t                    audio_cc;\n    uint64_t                      aframe_pts;\n    ngx_uint_t                    aframe_num;\n    ngx_msec_t                    aframe_base;\n    ngx_buf_t                    *aframe;\n};\n\n/* 700 ms PCR delay */\n#define NGX_RTMP_MEGPTS_DELAY  63000\n\nstatic void *\nngx_mpegts_live_create_app_conf(ngx_conf_t *cf);\nstatic char *\nngx_mpegts_live_merge_app_conf(ngx_conf_t *cf, void *parent, void *child);\nstatic ngx_int_t\nngx_mpegts_live_postconfiguration(ngx_conf_t *cf);\n\nstatic ngx_command_t ngx_mpegts_live_commands[] = {\n\n    { ngx_string(\"mpegts_audio_buffer_size\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_size_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_mpegts_live_app_conf_t, audio_buffer_size),\n      NULL },\n\n    { ngx_string(\"mpegts_sync\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_mpegts_live_app_conf_t, sync),\n      NULL },\n\n    { ngx_string(\"mpegts_audio_delay\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_mpegts_live_app_conf_t, audio_delay),\n      NULL },\n\n    { ngx_string(\"mpegts_out_queue\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_size_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_mpegts_live_app_conf_t, out_queue),\n      NULL },\n\n    ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t ngx_mpegts_live_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_mpegts_live_postconfiguration,      /* postconfiguration */\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    ngx_mpegts_live_create_app_conf,        /* create app configuration */\n    ngx_mpegts_live_merge_app_conf          /* merge app configuration */\n};\n\n\nngx_module_t ngx_mpegts_live_module = {\n    NGX_MODULE_V1,\n    &ngx_mpegts_live_ctx,                   /* module context */\n    ngx_mpegts_live_commands,               /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_mpegts_live_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_mpegts_live_app_conf_t   *macf;\n\n    macf = ngx_pcalloc(cf->pool, sizeof(ngx_mpegts_live_app_conf_t));\n    if (!macf) {\n        return NULL;\n    }\n\n    macf->audio_buffer_size = NGX_CONF_UNSET;\n    macf->sync = NGX_CONF_UNSET_MSEC;\n    macf->audio_delay = NGX_CONF_UNSET_MSEC;\n    macf->out_queue = NGX_CONF_UNSET;\n\n    return macf;\n}\n\n\nstatic char *\nngx_mpegts_live_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_mpegts_live_app_conf_t *prev = parent;\n    ngx_mpegts_live_app_conf_t *conf = child;\n\n    ngx_conf_merge_size_value(conf->audio_buffer_size, prev->audio_buffer_size,\n                              NGX_RTMP_MPEG_BUFSIZE);\n    ngx_conf_merge_msec_value(conf->sync, prev->sync, 2);\n    ngx_conf_merge_msec_value(conf->audio_delay, prev->audio_delay, 300);\n    ngx_conf_merge_size_value(conf->out_queue, prev->out_queue, 4096);\n    conf->pool = ngx_create_pool(4096, &cf->cycle->new_log);\n    if (!conf->pool) {\n        return NGX_CONF_ERROR;\n    }\n\n    return NGX_CONF_OK;\n}\n\nstatic u_char *\nngx_mpegts_live_write_pcr(u_char *p, uint64_t pcr)\n{\n    *p++ = (u_char) (pcr >> 25);\n    *p++ = (u_char) (pcr >> 17);\n    *p++ = (u_char) (pcr >> 9);\n    *p++ = (u_char) (pcr >> 1);\n    *p++ = (u_char) (pcr << 7 | 0x7e);\n    *p++ = 0;\n\n    return p;\n}\n\nstatic u_char *\nngx_mpegts_live_write_pts(u_char *p, ngx_uint_t fb, uint64_t pts)\n{\n    ngx_uint_t val;\n\n    val = fb << 4 | (((pts >> 30) & 0x07) << 1) | 1;\n    *p++ = (u_char) val;\n\n    val = (((pts >> 15) & 0x7fff) << 1) | 1;\n    *p++ = (u_char) (val >> 8);\n    *p++ = (u_char) val;\n\n    val = (((pts) & 0x7fff) << 1) | 1;\n    *p++ = (u_char) (val >> 8);\n    *p++ = (u_char) val;\n\n    return p;\n}\n\nngx_int_t\nngx_mpegts_live_shared_append_chain(ngx_mpegts_frame_t *f, ngx_buf_t *b,\n                                    ngx_flag_t mandatory)\n{\n    ngx_uint_t   pes_size, header_size, body_size, in_size, stuff_size, flags;\n    u_char      *packet, *p, *base;\n    ngx_int_t    first;\n    ngx_chain_t *cl, **ll;\n    uint64_t     pcr;\n\n    for (ll = &f->chain; (*ll) && (*ll)->next; ll = &(*ll)->next);\n    cl = *ll;\n\n    if ((b == NULL || b->pos == b->last) && mandatory) {\n        *ll = ngx_get_chainbuf(NGX_MPEGTS_BUF_SIZE, 1);\n        (*ll)->buf->flush = 1;\n        return NGX_OK;\n    }\n\n    first = 1;\n\n    while (b->pos < b->last) {\n        if ((*ll) && (*ll)->buf->end - (*ll)->buf->last < 188) {\n            ll = &(*ll)->next;\n            cl = *ll;\n        }\n\n        if (*ll == NULL) {\n            *ll = ngx_get_chainbuf(NGX_MPEGTS_BUF_SIZE, 1);\n            cl = *ll;\n            cl->buf->flush = 1;\n        }\n\n        packet = cl->buf->last;\n        p = packet;\n\n        f->cc++;\n\n        *p++ = 0x47;\n        *p++ = (u_char) (f->pid >> 8);\n\n        if (first) {\n            p[-1] |= 0x40;\n        }\n\n        *p++ = (u_char) f->pid;\n        *p++ = 0x10 | (f->cc & 0x0f); /* payload */\n\n        if (first) {\n\n            if (f->key) {\n                packet[3] |= 0x20; /* adaptation */\n\n                *p++ = 7;    /* size */\n                *p++ = 0x50; /* random access + PCR */\n                if (f->dts < NGX_RTMP_MEGPTS_DELAY) {\n                    pcr = 0;\n                } else {\n                    pcr = f->dts;\n                }\n                p = ngx_mpegts_live_write_pcr(p, pcr);\n            }\n\n            /* PES header */\n\n            *p++ = 0x00;\n            *p++ = 0x00;\n            *p++ = 0x01;\n            *p++ = (u_char) f->sid;\n\n            header_size = 5;\n            flags = 0x80; /* PTS */\n\n            if (f->dts != f->pts) {\n                header_size += 5;\n                flags |= 0x40; /* DTS */\n            }\n\n            pes_size = (b->last - b->pos) + header_size + 3;\n            if (pes_size > 0xffff) {\n                pes_size = 0;\n            }\n\n            *p++ = (u_char) (pes_size >> 8);\n            *p++ = (u_char) pes_size;\n            *p++ = 0x80; /* H222 */\n            *p++ = (u_char) flags;\n            *p++ = (u_char) header_size;\n\n            p = ngx_mpegts_live_write_pts(p, flags >> 6, f->pts +\n                                                         NGX_RTMP_MEGPTS_DELAY);\n\n            if (f->dts != f->pts) {\n                p = ngx_mpegts_live_write_pts(p, 1, f->dts +\n                                                    NGX_RTMP_MEGPTS_DELAY);\n            }\n\n            first = 0;\n        }\n\n        body_size = (ngx_uint_t) (packet + 188 - p);\n        in_size = (ngx_uint_t) (b->last - b->pos);\n\n        if (body_size <= in_size) {\n            ngx_memcpy(p, b->pos, body_size);\n            b->pos += body_size;\n\n        } else {\n            stuff_size = (body_size - in_size);\n\n            if (packet[3] & 0x20) {\n\n                /* has adaptation */\n\n                base = &packet[5] + packet[4];\n                p = ngx_movemem(base + stuff_size, base, p - base);\n                ngx_memset(base, 0xff, stuff_size);\n                packet[4] += (u_char) stuff_size;\n\n            } else {\n\n                /* no adaptation */\n\n                packet[3] |= 0x20;\n                p = ngx_movemem(&packet[4] + stuff_size, &packet[4],\n                                p - &packet[4]);\n\n                packet[4] = (u_char) (stuff_size - 1);\n                if (stuff_size >= 2) {\n                    packet[5] = 0;\n                    ngx_memset(&packet[6], 0xff, stuff_size - 2);\n                }\n            }\n\n            ngx_memcpy(p, b->pos, in_size);\n            b->pos = b->last;\n        }\n\n        cl->buf->last += 188;\n        f->length += 188;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_mpegts_live_copy(ngx_rtmp_session_t *s, void *dst, u_char **src, size_t n,\n    ngx_chain_t **in)\n{\n    u_char  *last;\n    size_t   pn;\n\n    if (*in == NULL) {\n        return NGX_ERROR;\n    }\n\n    for ( ;; ) {\n        last = (*in)->buf->last;\n\n        if ((size_t)(last - *src) >= n) {\n            if (dst) {\n                ngx_memcpy(dst, *src, n);\n            }\n\n            *src += n;\n\n            while (*in && *src == (*in)->buf->last) {\n                *in = (*in)->next;\n                if (*in) {\n                    *src = (*in)->buf->pos;\n                }\n            }\n\n            return NGX_OK;\n        }\n\n        pn = last - *src;\n\n        if (dst) {\n            ngx_memcpy(dst, *src, pn);\n            dst = (u_char *)dst + pn;\n        }\n\n        n -= pn;\n        *in = (*in)->next;\n\n        if (*in == NULL) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                          \"rtmp-mpegts: mpegts_copy| failed to read %uz byte(s)\", n);\n            return NGX_ERROR;\n        }\n\n        *src = (*in)->buf->pos;\n    }\n}\n\n\nstatic ngx_int_t\nngx_mpegts_live_append_aud(ngx_rtmp_session_t *s, ngx_buf_t *out)\n{\n    static u_char   aud_nal[] = { 0x00, 0x00, 0x00, 0x01, 0x09, 0xf0 };\n\n    if (out->last + sizeof(aud_nal) > out->end) {\n        return NGX_ERROR;\n    }\n\n    out->last = ngx_cpymem(out->last, aud_nal, sizeof(aud_nal));\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_mpegts_live_append_sps_pps(ngx_rtmp_session_t *s, ngx_buf_t *out)\n{\n    u_char                         *p;\n    ngx_chain_t                    *in;\n    ngx_mpegts_live_ctx_t          *ctx;\n    int8_t                          nnals;\n    uint16_t                        len, rlen;\n    ngx_int_t                       n;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_live_module);\n\n    if (ctx == NULL || ctx->avc_codec == NULL) {\n        return NGX_ERROR;\n    }\n\n    in = ctx->avc_codec->avc_header->chain;\n    if (in == NULL) {\n        return NGX_ERROR;\n    }\n\n    p = in->buf->pos;\n\n    /*\n     * Skip bytes:\n     * - flv fmt\n     * - H264 CONF/PICT (0x00)\n     * - 0\n     * - 0\n     * - 0\n     * - version\n     * - profile\n     * - compatibility\n     * - level\n     * - nal bytes\n     */\n\n    if (ngx_mpegts_live_copy(s, NULL, &p, 10, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    /* number of SPS NALs */\n    if (ngx_mpegts_live_copy(s, &nnals, &p, 1, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    nnals &= 0x1f; /* 5lsb */\n\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                   \"rtmp-mpegts: append_sps_pps| SPS number: %uz\", nnals);\n\n    /* SPS */\n    for (n = 0; ; ++n) {\n        for (; nnals; --nnals) {\n\n            /* NAL length */\n            if (ngx_mpegts_live_copy(s, &rlen, &p, 2, &in) != NGX_OK) {\n                return NGX_ERROR;\n            }\n\n            ngx_rtmp_rmemcpy(&len, &rlen, 2);\n\n            ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                           \"rtmp-mpegts: append_sps_pps| header NAL length: %uz\", (size_t) len);\n\n            /* AnnexB prefix */\n            if (out->end - out->last < 4) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                              \"rtmp-mpegts: append_sps_pps| too small buffer for header NAL size\");\n                return NGX_ERROR;\n            }\n\n            *out->last++ = 0;\n            *out->last++ = 0;\n            *out->last++ = 0;\n            *out->last++ = 1;\n\n            /* NAL body */\n            if (out->end - out->last < len) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                              \"rtmp-mpegts: append_sps_pps| too small buffer for header NAL\");\n                return NGX_ERROR;\n            }\n\n            if (ngx_mpegts_live_copy(s, out->last, &p, len, &in) != NGX_OK) {\n                return NGX_ERROR;\n            }\n\n            out->last += len;\n        }\n\n        if (n == 1) {\n            break;\n        }\n\n        /* number of PPS NALs */\n        if (ngx_mpegts_live_copy(s, &nnals, &p, 1, &in) != NGX_OK) {\n            return NGX_ERROR;\n        }\n\n        ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                       \"rtmp-mpegts: append_sps_pps| PPS number: %uz\", nnals);\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_mpegts_live_init_aac_codec(ngx_rtmp_session_t *s)\n{\n    ngx_mpegts_live_ctx_t          *ctx;\n    ngx_rtmp_codec_ctx_t           *codec_ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_live_module);\n    codec_ctx = ngx_rtmp_get_module_ctx(s->live_stream->publish_ctx->session, ngx_rtmp_codec_module);\n\n    if (ctx->aac_codec) {\n        return NGX_OK;\n    }\n\n    if (codec_ctx == NULL || codec_ctx->aac_header == NULL) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                   \"rtmp-mpegts: aac_codec| codec ctx %p, aac_header is null\", codec_ctx);\n        return NGX_AGAIN;\n    }\n\n    ctx->aac_codec = ngx_pcalloc(s->pool, sizeof(ngx_mpegts_live_aac_codec_t));\n    if (ctx->aac_codec == NULL) {\n        ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                   \"rtmp-mpegts: aac_codec| alloc mpegts aac_codec failed\");\n        return NGX_ERROR;\n    }\n\n    ctx->aac_codec->aac_header = ngx_rtmp_shared_alloc_frame(1024,\n                                    codec_ctx->aac_header->chain, 0);\n\n    ctx->aac_codec->sample_rate = codec_ctx->sample_rate;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_mpegts_live_init_avc_codec(ngx_rtmp_session_t *s)\n{\n    ngx_mpegts_live_ctx_t          *ctx;\n    ngx_rtmp_codec_ctx_t           *codec_ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_live_module);\n    codec_ctx = ngx_rtmp_get_module_ctx(s->live_stream->publish_ctx->session, ngx_rtmp_codec_module);\n\n    if (ctx->avc_codec) {\n        return NGX_OK;\n    }\n\n    if (codec_ctx == NULL || codec_ctx->avc_header == NULL) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                   \"rtmp-mpegts: avc_codec| codec ctx %p, avc_header is null\", codec_ctx);\n        return NGX_AGAIN;\n    }\n\n    ctx->avc_codec = ngx_pcalloc(s->pool, sizeof(ngx_mpegts_live_avc_codec_t));\n    if (ctx->avc_codec == NULL) {\n        ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                   \"rtmp-mpegts: avc_codec| alloc mpegts avc_codec failed\");\n        return NGX_ERROR;\n    }\n\n    ctx->avc_codec->video_codec_id = codec_ctx->video_codec_id;\n    ctx->avc_codec->avc_nal_bytes = codec_ctx->avc_nal_bytes;\n    ctx->avc_codec->avc_header = ngx_rtmp_shared_alloc_frame(1024,\n                                 codec_ctx->avc_header->chain, 0);\n\n    return NGX_OK;\n}\n\n/*\nstatic void\nngx_mpegts_live_append_out_chain(ngx_chain_t **header, ngx_mpegts_frame_t *frame)\n{\n    ngx_chain_t   **ll;\n    ngx_chain_t    *tail;\n\n    ngx_rtmp_shared_acquire_frame(frame);\n    tail = frame->chain;\n\n    for (ll = header; *ll; ll = &((*ll)->next)) {\n        (*ll)->buf->flush = 1;\n    }\n\n    *ll = tail;\n\n    for (; *ll; ll = &((*ll)->next)) {\n        (*ll)->buf->flush = 1;\n        if (!(*ll)->next) {\n            (*ll)->buf->last_in_chain = 1;\n        }\n    }\n}\n*/\n\nstatic ngx_int_t\nngx_mpegts_live_flush_audio(ngx_rtmp_session_t *s)\n{\n    ngx_mpegts_live_ctx_t          *ctx;\n    ngx_mpegts_frame_t             *frame;\n    ngx_int_t                       rc;\n    ngx_buf_t                      *b;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_live_module);\n\n    if (ctx == NULL) {\n        return NGX_OK;\n    }\n\n    b = ctx->aframe;\n\n    if (b == NULL || b->pos == b->last) {\n        return NGX_OK;\n    }\n\n    frame = ngx_rtmp_shared_alloc_mpegts_frame(NULL, 0);\n\n    frame->dts = ctx->aframe_pts;\n    frame->pts = ctx->aframe_pts;\n    frame->cc = ctx->audio_cc;\n    frame->pid = 0x101;\n    frame->sid = 0xc0;\n    frame->type = NGX_MPEGTS_MSG_AUDIO;\n\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                   \"rtmp-mpegts: flush_audio| pts=%uL\", frame->pts);\n\n    rc = ngx_mpegts_live_shared_append_chain(frame, b, 1);\n\n    if (rc != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"rtmp-mpegts: flush_audio| flush failed\");\n    } else {\n        ctx->audio_cc = frame->cc;\n        ngx_mpegts_live_audio_filter(s, frame);\n    }\n\n    ngx_rtmp_shared_free_mpegts_frame(frame);\n\n    b->pos = b->last = b->start;\n\n    return rc;\n}\n\n\nstatic ngx_int_t\nngx_mpegts_live_append_hevc_vps_sps_pps(ngx_rtmp_session_t *s, ngx_buf_t *out)\n{\n    ngx_mpegts_live_ctx_t          *ctx;\n    u_char                         *p;\n    ngx_chain_t                    *in;\n    ngx_uint_t                      rnal_unit_len, nal_unit_len, i, j,\n                                    num_arrays, nal_unit_type, rnum_nalus,\n                                    num_nalus;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_live_module);\n\n    if (ctx == NULL || ctx->avc_codec == NULL) {\n        return NGX_ERROR;\n    }\n\n    in = ctx->avc_codec->avc_header->chain;\n    if (in == NULL) {\n        return NGX_ERROR;\n    }\n\n    p = in->buf->pos;\n    /*  6 bytes\n     * FrameType                                    4 bits\n     * CodecID                                      4 bits\n     * AVCPacketType                                1 byte\n     * CompositionTime                              3 bytes\n     * HEVCDecoderConfigurationRecord\n     *      configurationVersion                    1 byte\n     */\n\n    /*  20 bytes\n     * HEVCDecoderConfigurationRecord\n     *      general_profile_space                   2 bits\n     *      general_tier_flag                       1 bit\n     *      general_profile_idc                     5 bits\n     *      general_profile_compatibility_flags     4 bytes\n     *      general_constraint_indicator_flags      6 bytes\n     *      general_level_idc                       1 byte\n     *      min_spatial_segmentation_idc            4 bits reserved + 12 bits\n     *      parallelismType                         6 bits reserved + 2 bits\n     *      chroma_format_idc                       6 bits reserved + 2 bits\n     *      bit_depth_luma_minus8                   5 bits reserved + 3 bits\n     *      bit_depth_chroma_minus8                 5 bits reserved + 3 bits\n     *      avgFrameRate                            2 bytes\n     */\n\n    /* 1 bytes\n     * HEVCDecoderConfigurationRecord\n     *      constantFrameRate                       2 bits\n     *      numTemporalLayers                       3 bits\n     *      temporalIdNested                        1 bit\n     *      lengthSizeMinusOne                      2 bits\n     */\n\n    if (ngx_mpegts_live_copy(s, NULL, &p, 27, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n     /* 1 byte\n     * HEVCDecoderConfigurationRecord\n     *      numOfArrays                             1 byte\n     */\n    num_arrays = 0;\n    if (ngx_mpegts_live_copy(s, &num_arrays, &p, 1, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    for (i = 0; i < num_arrays; ++i) {\n        /*\n         * array_completeness                       1 bit\n         * reserved                                 1 bit\n         * NAL_unit_type                            6 bits\n         * numNalus                                 2 bytes\n         */\n        if (ngx_mpegts_live_copy(s, &nal_unit_type, &p, 1, &in) != NGX_OK) {\n            return NGX_ERROR;\n        }\n        nal_unit_type &= 0x3f;\n\n        if (ngx_mpegts_live_copy(s, &rnum_nalus, &p, 2, &in) != NGX_OK) {\n            return NGX_ERROR;\n        }\n        num_nalus = 0;\n        ngx_rtmp_rmemcpy(&num_nalus, &rnum_nalus, 2);\n\n        for (j = 0; j < num_nalus; ++j) {\n            /*\n             * nalUnitLength                        2 bytes\n             */\n            if (ngx_mpegts_live_copy(s, &rnal_unit_len, &p, 2, &in) != NGX_OK) {\n                return NGX_ERROR;\n            }\n            nal_unit_len = 0;\n            ngx_rtmp_rmemcpy(&nal_unit_len, &rnal_unit_len, 2);\n            if (out->end - out->last < 4) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                              \"hls: too small buffer for header NAL size\");\n                return NGX_ERROR;\n            }\n\n            *out->last++ = 0;\n            *out->last++ = 0;\n            *out->last++ = 0;\n            *out->last++ = 1;\n\n            if (out->end - out->last < (ngx_int_t)nal_unit_len) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                              \"hls: too small buffer for header NAL\");\n                return NGX_ERROR;\n            }\n\n            if (ngx_mpegts_live_copy(s, out->last, &p, nal_unit_len, &in) != NGX_OK) {\n                return NGX_ERROR;\n            }\n\n            out->last += nal_unit_len;\n        }\n    }\n    return NGX_OK;\n}\n\n\n/* set h265 aud first, now is null*/\nstatic ngx_int_t\nngx_mpegts_live_append_hevc_aud(ngx_rtmp_session_t *s, ngx_buf_t *out)\n{\n    static u_char   aud_nal[] = { 0x00, 0x00, 0x00, 0x01, 0x46, 0x01, 0x50 };\n\n    if (out->last + sizeof(aud_nal) > out->end) {\n        return NGX_ERROR;\n    }\n\n    out->last = ngx_cpymem(out->last, aud_nal, sizeof(aud_nal));\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_mpegts_live_h265_handler(ngx_rtmp_session_t *s, ngx_rtmp_frame_t *f)\n{\n    ngx_mpegts_live_ctx_t       *ctx;\n    ngx_mpegts_live_app_conf_t  *macf;\n    u_char                      *p;\n    uint8_t                     fmt, ftype, htype, nal_type, src_nal_type;\n    uint32_t                    len, rlen;\n    ngx_buf_t                   out;\n    uint32_t                    cts;\n    ngx_mpegts_frame_t         *frame;\n    ngx_uint_t                  nal_bytes;\n    ngx_int_t                   aud_sent, sps_pps_sent;\n    u_char                     *buffer;\n    ngx_rtmp_header_t          *h;\n    ngx_chain_t                *in;\n    ngx_int_t                   rc;\n    ngx_rtmp_core_app_conf_t   *cacf;\n\n    cacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_core_module);\n\n    h = &f->hdr;\n    in = f->chain;\n\n    macf = ngx_rtmp_get_module_app_conf(s, ngx_mpegts_live_module);\n    buffer = macf->packet_buffer;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_live_module);\n    if (ctx == NULL || h->mlen < 1) {\n        ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                       \"rtmp-mpegts: h265_handler| \"\n                       \"resource error, mpegts_ctx=%p, h->mlen=%d\",\n                       ctx, h->mlen);\n        return NGX_OK;\n    }\n\n    if (ctx->avc_codec == NULL) {\n        rc = ngx_mpegts_live_init_avc_codec(s);\n        if (rc == NGX_ERROR) {\n            ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                       \"rtmp-mpegts: h265_handler| init avc_codec failed\");\n            return NGX_OK;\n        } else if (rc == NGX_AGAIN) {\n            return NGX_OK;\n        }\n    }\n\n    /* H265 is supported */\n    if (ctx->avc_codec->video_codec_id != cacf->hevc_codec)\n    {\n        return NGX_OK;\n    }\n\n    p = in->buf->pos;\n    if (ngx_mpegts_live_copy(s, &fmt, &p, 1, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    /* 1: keyframe (IDR)\n     * 2: inter frame\n     * 3: disposable inter frame */\n\n    ftype = (fmt & 0xf0) >> 4;    // 0x17/0x27/...\n\n    /* H264 HDR/PICT */\n\n    if (ngx_mpegts_live_copy(s, &htype, &p, 1, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    /* proceed only with PICT */\n\n    if (htype != 1) { /*0:AVC sequence header,1:AVC NALU 2:AVC end of sequence*/\n        return NGX_OK;\n    }\n\n    /* 3 bytes: decoder delay */\n\n    if (ngx_mpegts_live_copy(s, &cts, &p, 3, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n    /* convert big end to little end */\n    cts = ((cts & 0x00FF0000) >> 16) | ((cts & 0x000000FF) << 16) |\n          (cts & 0x0000FF00);\n\n    ngx_memzero(&out, sizeof(out));\n\n    out.start = buffer;\n    out.end = buffer + NGX_RTMP_MPEG_BUFSIZE;\n    out.pos = out.start;\n    out.last = out.pos;\n\n    nal_bytes = ctx->avc_codec->avc_nal_bytes;\n    aud_sent = 0;\n    sps_pps_sent = 0;\n    ngx_int_t vps_copy = 0;\n    ngx_int_t sps_copy = 0;\n    ngx_int_t pps_copy = 0;\n\n    while (in) {\n        if (ngx_mpegts_live_copy(s, &rlen, &p, nal_bytes, &in) != NGX_OK) {\n            return NGX_OK;\n        }\n\n        len = 0;\n        ngx_rtmp_rmemcpy(&len, &rlen, nal_bytes);\n\n        if (len == 0) {\n            continue;\n        }\n\n        if (ngx_mpegts_live_copy(s, &src_nal_type, &p, 1, &in) != NGX_OK) {\n            return NGX_OK;\n        }\n\n        nal_type = (src_nal_type & 0x7e) >> 1;\n\n        ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                       \"rtmp-mpegts: h265_handler| h265 NAL type=%ui, len=%uD\",\n                       (ngx_uint_t) nal_type, len);\n\n        /* h264 format of rtmp_flv contains NAL header Prefix \"00 00 00 01\" */\n        if (0 == nal_type) {\n            u_char nal_header[4] = {0};\n            if (ngx_mpegts_live_copy(s, nal_header, &p, 3, &in) != NGX_OK) {\n                return NGX_OK;\n            }\n\n            if (0 != ngx_strcmp(nal_header, \"\\0\\0\\1\")) {\n                ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                    \"mpegts module: h265 hander| \"\n                    \"is not h265 NAL header [00 00 00 01]\");\n                p -= 3;\n                goto NAL_TRAIL_N;\n                return NGX_OK;\n            }\n\n            if (ngx_mpegts_live_copy(s, &src_nal_type, &p, 1, &in) != NGX_OK) {\n                return NGX_OK;\n            }\n\n            nal_type = (src_nal_type & 0x7e) >> 1;\n            if (0 == nal_type) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                    \"mpegts module: h265 hander| h265 NAL type reparse error\");\n                return NGX_OK;\n            }\n\n#define HEVC_NAL_AUD_LENGTH 0\n            if (out.end - out.last < (ngx_int_t) (len + HEVC_NAL_AUD_LENGTH)) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                    \"mpegts module: h265 hander| not enough buffer for NAL\");\n                return NGX_OK;\n            }\n#if 1\n            if (ngx_mpegts_live_append_hevc_aud(s, &out) != NGX_OK) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                    \"mpegts module: h265 hander| error appending AUD NAL\");\n            }\n#endif\n            /* back to 00 00 01 nal_type*/\n            p = p - 4;\n            if (ngx_mpegts_live_copy(s, out.last, &p, len - 1, &in) != NGX_OK) {\n                return NGX_ERROR;\n            }\n\n            out.last += (len - 1);\n            break;\n        }\n\nNAL_TRAIL_N:\n\n        ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"mpegts module: h265 hander| h265 NAL type=%ui, len=%uD\",\n            (ngx_uint_t) nal_type, len);\n\n        /*\n         *  NAL_VPS 32\n         *  NAL_SPS 33\n         *  NAL_PPS 34\n         *  NAL_AUD 35\n         *  NAL_SEI_PREFIX 39\n         *  NAL_SEI_SUFFIX 40\n         */\n        if ((nal_type >= 32 && nal_type <= 35)\n            || nal_type == 39 || nal_type == 40)\n        {\n            if (out.end - out.last < (5 + len -1)) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                        \"hls: not enough buffer for AnnexB prefix\");\n                return NGX_OK;\n            }\n            if (32 == nal_type) {\n                ++vps_copy;\n                if(!aud_sent){\n                    if (ngx_mpegts_live_append_hevc_aud(s, &out) != NGX_OK) {\n                        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                                      \"hls: error appending AUD NAL\");\n                    }\n                    aud_sent = 1;\n                }\n            } else if (33 == nal_type) {\n                ++sps_copy;\n            } else if (34 == nal_type) {\n                ++pps_copy;\n            } else if (35 == nal_type) {\n                aud_sent = 1;\n            }\n\n            *out.last++ = 0;\n            *out.last++ = 0;\n            *out.last++ = 0;\n            *out.last++ = 1;\n            *out.last++ = src_nal_type;\n            if (ngx_mpegts_live_copy(s, out.last, &p, len - 1, &in) != NGX_OK) {\n                return NGX_ERROR;\n            }\n            out.last += (len - 1);\n            continue;\n        }\n\n        if (vps_copy > 0 && sps_copy > 0 && pps_copy > 0) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                    \"mpegts vps_copy %i, sps_copy %i, pps_copy %i\\n\",\n                        vps_copy, sps_copy, pps_copy);\n            sps_pps_sent = 1;\n        }\n\n        if (!aud_sent) {\n            if (35 == nal_type) {\n                aud_sent = 1;\n            } else if (!sps_pps_sent) {\n                if (ngx_mpegts_live_append_hevc_vps_sps_pps(s, &out) != NGX_OK)\n                {\n                    ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                                      \"hls: error appending AUD NAL\");\n                }\n                aud_sent = 1;\n            }\n        }\n\n        if (IS_IRAP(nal_type)) {\n            if (!sps_pps_sent) {\n                if (ngx_mpegts_live_append_hevc_vps_sps_pps(s, &out) != NGX_OK)\n                {\n                    ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                                  \"hls: error appenging VPS/SPS/PPS NALs\");\n                }\n                sps_pps_sent = 1;\n            }\n        }\n\n        /* AnnexB prefix */\n        if (out.end - out.last < 5) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                          \"hls: not enough buffer for AnnexB prefix\");\n            return NGX_OK;\n        }\n\n        /* first AnnexB prefix is long (4 bytes) */\n\n        if (out.last == out.pos) {\n            *out.last++ = 0;\n        }\n\n        *out.last++ = 0;\n        *out.last++ = 0;\n        *out.last++ = 1;\n        *out.last++ = src_nal_type;\n\n        /* NAL body */\n        if (out.end - out.last < (ngx_int_t) len) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                          \"hls: not enough buffer for NAL\");\n            return NGX_OK;\n        }\n\n        if (ngx_mpegts_live_copy(s, out.last, &p, len - 1, &in) != NGX_OK) {\n            return NGX_ERROR;\n        }\n\n        out.last += (len - 1);\n    }\n\n    frame = ngx_rtmp_shared_alloc_mpegts_frame(NULL, 0);\n    if (frame == NULL) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"rtmp-mpegts: h265_handler| \"\n                      \"memory error, alloc mpegts frame failed\");\n        return NGX_ERROR;\n    }\n\n    /* continuity counter */\n    frame->cc = ctx->video_cc;\n    frame->dts = (uint64_t) h->timestamp * 90;\n    /* pts = dts + composition time */\n    frame->pts = frame->dts + cts * 90;\n    /* program id */\n    frame->pid = 0x100;\n    /* stream id, video range from 0xe0 to 0xef */\n    frame->sid = 0xe0;\n    frame->key = (ftype == 1);\n    frame->type = NGX_MPEGTS_MSG_VIDEO;\n\n    /*\n     * start new fragment if\n     * - we have video key frame AND\n     * - we have audio buffered or have no audio at all or stream is closed\n     */\n    if (ctx->aframe && ctx->aframe->last > ctx->aframe->pos &&\n        ctx->aframe_pts + (uint64_t) ctx->audio_delay * 90  < frame->dts)\n    {\n        ngx_mpegts_live_flush_audio(s);\n    }\n\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                   \"rtmp-mpegts: h265_handler| video pts=%uL, dts=%uL\",\n                   frame->pts, frame->dts);\n\n    if (ngx_mpegts_live_shared_append_chain(frame, &out, 1) != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"rtmp-mpegts: h264_handler| video frame failed\");\n    } else {\n        ctx->video_cc = frame->cc;\n        ngx_mpegts_live_video_filter(s, frame);\n    }\n\n    ngx_rtmp_shared_free_mpegts_frame(frame);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_mpegts_live_h264_handler(ngx_rtmp_session_t *s, ngx_rtmp_frame_t *f)\n{\n    ngx_rtmp_header_t            *h;\n    ngx_chain_t                  *in;\n    ngx_mpegts_live_ctx_t         *ctx;\n    u_char                       *p;\n    uint8_t                       fmt, ftype, htype, nal_type, src_nal_type;\n    uint32_t                      len, rlen;\n    ngx_buf_t                     out;\n    uint32_t                      cts;\n    ngx_mpegts_frame_t           *frame;\n    ngx_uint_t                    nal_bytes;\n    ngx_int_t                     aud_sent, sps_pps_sent;\n    u_char                       *buffer;\n    ngx_mpegts_live_app_conf_t    *macf;\n    ngx_int_t                     rc;\n\n    h = &f->hdr;\n    in = f->chain;\n\n    macf = ngx_rtmp_get_module_app_conf(s, ngx_mpegts_live_module);\n    buffer = macf->packet_buffer;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_live_module);\n    if (ctx == NULL || h->mlen < 1) {\n        ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                       \"mpegts-mux: h264_handler| \"\n                       \"resource error, mpegts_ctx=%p, h->mlen=%d\",\n                       ctx, h->mlen);\n        return NGX_OK;\n    }\n\n    if (ctx->avc_codec == NULL) {\n        rc = ngx_mpegts_live_init_avc_codec(s);\n        if (rc == NGX_ERROR) {\n            ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                       \"mpegts-mux: h264_handler| init avc_codec failed\");\n            return NGX_OK;\n        } else if (rc == NGX_AGAIN) {\n            return NGX_OK;\n        }\n    }\n\n    /* H264 is supported */\n    if (ctx->avc_codec->video_codec_id != NGX_RTMP_VIDEO_H264) {\n        return NGX_OK;\n    }\n\n    p = in->buf->pos;\n    if (ngx_mpegts_live_copy(s, &fmt, &p, 1, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    /* 1: keyframe (IDR)\n     * 2: inter frame\n     * 3: disposable inter frame */\n\n    ftype = (fmt & 0xf0) >> 4;\n\n    /* H264 HDR/PICT */\n\n    if (ngx_mpegts_live_copy(s, &htype, &p, 1, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    /* proceed only with PICT */\n\n    if (htype != 1) {\n        return NGX_OK;\n    }\n\n    /* 3 bytes: decoder delay */\n\n    if (ngx_mpegts_live_copy(s, &cts, &p, 3, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    cts = ((cts & 0x00FF0000) >> 16) | ((cts & 0x000000FF) << 16) |\n          (cts & 0x0000FF00);\n\n    ngx_memzero(&out, sizeof(out));\n\n    out.start = buffer;\n    out.end = buffer + NGX_RTMP_MPEG_BUFSIZE;\n    out.pos = out.start;\n    out.last = out.pos;\n\n    nal_bytes = ctx->avc_codec->avc_nal_bytes;\n    aud_sent = 0;\n    sps_pps_sent = 0;\n\n    while (in) {\n        if (ngx_mpegts_live_copy(s, &rlen, &p, nal_bytes, &in) != NGX_OK) {\n            return NGX_OK;\n        }\n\n        len = 0;\n        ngx_rtmp_rmemcpy(&len, &rlen, nal_bytes);\n\n        if (len == 0) {\n            continue;\n        }\n\n        if (ngx_mpegts_live_copy(s, &src_nal_type, &p, 1, &in) != NGX_OK) {\n            return NGX_OK;\n        }\n\n        nal_type = src_nal_type & 0x1f;\n\n        ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                       \"mpegts-mux: h264_handler| h264 NAL type=%ui, len=%uD\",\n                       (ngx_uint_t) nal_type, len);\n\n        if (nal_type >= 7 && nal_type <= 9) {\n            if (ngx_mpegts_live_copy(s, NULL, &p, len - 1, &in) != NGX_OK) {\n                return NGX_ERROR;\n            }\n            continue;\n        }\n\n        if (!aud_sent) {\n            switch (nal_type) {\n                case 1:\n                case 5:\n                case 6:\n                    if (ngx_mpegts_live_append_aud(s, &out) != NGX_OK) {\n                        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                            \"mpegts-mux: h264_handler| error appending AUD NAL\");\n                    }\n                    aud_sent = 1;\n                    break;\n\n                case 9:\n                    aud_sent = 1;\n                    break;\n            }\n        }\n\n        switch (nal_type) {\n            case 1:\n                sps_pps_sent = 0;\n                break;\n            case 5:\n                if (sps_pps_sent) {\n                    break;\n                }\n                if (ngx_mpegts_live_append_sps_pps(s, &out) != NGX_OK) {\n                    ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                        \"mpegts-mux: h264_handler| error appenging SPS/PPS NALs\");\n                }\n                sps_pps_sent = 1;\n                break;\n        }\n\n        /* AnnexB prefix */\n\n        if (out.end - out.last < 5) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"mpegts-mux: h264_handler| not enough buffer for AnnexB prefix\");\n            return NGX_OK;\n        }\n\n        /* first AnnexB prefix is long (4 bytes) */\n\n        if (out.last == out.pos) {\n            *out.last++ = 0;\n        }\n\n        *out.last++ = 0;\n        *out.last++ = 0;\n        *out.last++ = 1;\n        *out.last++ = src_nal_type;\n\n        /* NAL body */\n\n        if (out.end - out.last < (ngx_int_t) len) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"mpegts-mux: h264_handler| not enough buffer for NAL\");\n            return NGX_OK;\n        }\n\n        if (ngx_mpegts_live_copy(s, out.last, &p, len - 1, &in) != NGX_OK) {\n            return NGX_ERROR;\n        }\n\n        out.last += (len - 1);\n    }\n\n    frame = ngx_rtmp_shared_alloc_mpegts_frame(NULL, 0);\n    if (frame == NULL) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n            \"mpegts-mux: h264_handler| \"\n            \"memory error, alloc mpegts frame failed\");\n        return NGX_ERROR;\n    }\n\n    frame->cc = ctx->video_cc;\n    frame->dts = (uint64_t) h->timestamp * 90;\n    frame->pts = frame->dts + (cts * 90);\n    frame->pid = 0x100;\n    frame->sid = 0xe0;\n    frame->key = (ftype == 1);\n    frame->type = NGX_MPEGTS_MSG_VIDEO;\n\n    if (ctx->aframe && ctx->aframe->last > ctx->aframe->pos &&\n        ctx->aframe_pts + (uint64_t) ctx->audio_delay * 90  < frame->dts)\n    {\n        ngx_mpegts_live_flush_audio(s);\n    }\n\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                    \"mpegts-mux: h264_handler| video pts=%uL, dts=%uL\",\n                    frame->pts/90, frame->dts/90);\n\n    if (ngx_mpegts_live_shared_append_chain(frame, &out, 1) != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                    \"mpegts-mux: h264_handler| video frame failed\");\n    } else {\n        ctx->video_cc = frame->cc;\n        ngx_mpegts_live_video_filter(s, frame);\n    }\n\n    ngx_rtmp_shared_free_mpegts_frame(frame);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_mpegts_live_parse_aac_header(ngx_rtmp_session_t *s, ngx_uint_t *objtype,\n    ngx_uint_t *srindex, ngx_uint_t *chconf)\n{\n    ngx_mpegts_live_ctx_t  *ctx;\n    ngx_chain_t            *cl;\n    u_char                 *p, b0, b1;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_live_module);\n\n    cl = ctx->aac_codec->aac_header->chain;\n\n    p = cl->buf->pos;\n\n    if (ngx_mpegts_live_copy(s, NULL, &p, 2, &cl) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    if (ngx_mpegts_live_copy(s, &b0, &p, 1, &cl) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    if (ngx_mpegts_live_copy(s, &b1, &p, 1, &cl) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    *objtype = b0 >> 3;\n    if (*objtype == 0 || *objtype == 0x1f) {\n        ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                       \"rtmp-mpegts: parse_aac_header| \"\n                       \"unsupported adts object type:%ui\", *objtype);\n        return NGX_ERROR;\n    }\n\n    if (*objtype > 4) {\n\n        /*\n         * Mark all extended profiles as LC\n         * to make Android as happy as possible.\n         */\n\n        *objtype = 2;\n    }\n\n    *srindex = ((b0 << 1) & 0x0f) | ((b1 & 0x80) >> 7);\n    if (*srindex == 0x0f) {\n        ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                       \"rtmp-mpegts: parse_aac_header| \"\n                       \"unsupported adts sample rate:%ui\", *srindex);\n        return NGX_ERROR;\n    }\n\n    *chconf = (b1 >> 3) & 0x0f;\n\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                   \"rtmp-mpegts: parse_aac_header| \"\n                   \"aac object_type:%ui, sample_rate_index:%ui, \"\n                   \"channel_config:%ui\", *objtype, *srindex, *chconf);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_mpegts_live_aac_handler(ngx_rtmp_session_t *s, ngx_rtmp_frame_t *f)\n{\n    ngx_rtmp_header_t              *h;\n    ngx_chain_t                    *in;\n    ngx_mpegts_live_ctx_t          *ctx;\n    uint64_t                        pts, est_pts;\n    int64_t                         dpts;\n    size_t                          bsize;\n    ngx_buf_t                      *b;\n    u_char                         *p;\n    ngx_uint_t                      objtype, srindex, chconf, size;\n    ngx_int_t                       rc;\n\n    h = &f->hdr;\n    in = f->chain;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_live_module);\n\n    if (ctx == NULL || h->mlen < 2) {\n        return NGX_OK;\n    }\n\n    if (ctx->aac_codec == NULL) {\n        rc = ngx_mpegts_live_init_aac_codec(s);\n        if (rc == NGX_ERROR) {\n            ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                    \"rtmp-mpegts: aac_handler| init aac_codec failed\");\n            return NGX_OK;\n        } else if(rc == NGX_AGAIN) {\n            return NGX_OK;\n        }\n    }\n\n    if (ngx_rtmp_is_codec_header(in)) {\n        return NGX_OK;\n    }\n\n    b = ctx->aframe;\n\n    if (b == NULL) {\n\n        b = ngx_pcalloc(s->pool, sizeof(ngx_buf_t));\n        if (b == NULL) {\n            return NGX_ERROR;\n        }\n\n        ctx->aframe = b;\n\n        b->start = ngx_palloc(s->pool, ctx->audio_buffer_size);\n        if (b->start == NULL) {\n            return NGX_ERROR;\n        }\n\n        b->end = b->start + ctx->audio_buffer_size;\n        b->pos = b->last = b->start;\n    }\n\n    size = h->mlen - 2 + 7;\n    pts = (uint64_t) h->timestamp * 90;\n\n    if (b->start + size > b->end) {\n        return NGX_OK;\n    }\n\n    if (b->last > b->pos &&\n        ctx->aframe_pts + (uint64_t) ctx->audio_delay * 90 / 2 < pts)\n    {\n        ngx_mpegts_live_flush_audio(s);\n    }\n\n    if (b->last + size > b->end) {\n        ngx_mpegts_live_flush_audio(s);\n    }\n\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n        \"rtmp-mpegts: aac_handler| audio pts=%uL\", pts);\n\n    if (b->last + 7 > b->end) {\n        ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n            \"rtmp-mpegts: aac_handler| not enough buffer for audio header\");\n        return NGX_OK;\n    }\n\n    p = b->last;\n    b->last += 5;\n\n    /* copy payload */\n\n    for (; in && b->last < b->end; in = in->next) {\n\n        bsize = in->buf->last - in->buf->pos;\n        if (b->last + bsize > b->end) {\n            bsize = b->end - b->last;\n        }\n\n        b->last = ngx_cpymem(b->last, in->buf->pos, bsize);\n    }\n\n    /* make up ADTS header */\n\n    if (ngx_mpegts_live_parse_aac_header(s, &objtype, &srindex, &chconf)\n        != NGX_OK)\n    {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"rtmp-mpegts: aac_handler| aac header error\");\n        return NGX_OK;\n    }\n\n    /* we have 5 free bytes + 2 bytes of RTMP frame header */\n\n    p[0] = 0xff;\n    p[1] = 0xf1;\n    p[2] = (u_char) (((objtype - 1) << 6) | (srindex << 2) |\n                     ((chconf & 0x04) >> 2));\n    p[3] = (u_char) (((chconf & 0x03) << 6) | ((size >> 11) & 0x03));\n    p[4] = (u_char) (size >> 3);\n    p[5] = (u_char) ((size << 5) | 0x1f);\n    p[6] = 0xfc;\n\n    if (p != b->start) {\n        ctx->aframe_num++;\n        return NGX_OK;\n    }\n\n    ctx->aframe_pts = pts;\n\n    if (!ctx->sync || ctx->aac_codec->sample_rate == 0) {\n        return NGX_OK;\n    }\n\n    /* align audio frames */\n\n    /* TODO: We assume here AAC frame size is 1024\n     *       Need to handle AAC frames with frame size of 960 */\n\n    est_pts = ctx->aframe_base + ctx->aframe_num * 90000 * 1024 /\n                                 ctx->aac_codec->sample_rate;\n    dpts = (int64_t) (est_pts - pts);\n\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                   \"rtmp-mpegts: aac_handler| audio sync dpts=%L (%.5fs)\",\n                   dpts, dpts / 90000.);\n\n    if (dpts <= (int64_t) ctx->sync * 90 &&\n        dpts >= (int64_t) ctx->sync * -90)\n    {\n        ctx->aframe_num++;\n        ctx->aframe_pts = est_pts;\n        return NGX_OK;\n    }\n\n    ctx->aframe_base = pts;\n    ctx->aframe_num  = 1;\n\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n                   \"rtmp-mpegts: aac_handler| audio sync gap dpts=%L (%.5fs)\",\n                   dpts, dpts / 90000.);\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_mpegts_live_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n                 ngx_chain_t *in)\n{\n    ngx_mpegts_live_ctx_t    *ctx;\n    ngx_rtmp_frame_t          frame;\n    ngx_rtmp_codec_ctx_t     *codec_ctx;\n    ngx_rtmp_core_app_conf_t *cacf;\n\n    cacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_core_module);\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_live_module);\n    if (ctx == NULL || codec_ctx == NULL || codec_ctx->avc_header == NULL) {\n        return NGX_OK;\n    }\n\n    /* Only H264 and H265 is supported */\n    if (codec_ctx->video_codec_id != NGX_RTMP_VIDEO_H264 &&\n        codec_ctx->video_codec_id != cacf->hevc_codec)\n    {\n        return NGX_OK;\n    }\n\n    if (s->pause) {\n        return NGX_OK;\n    }\n\n    ngx_memzero(&frame, sizeof(frame));\n\n    frame.hdr = *h;\n    frame.chain = in;\n\n    ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n            \"mpegts-mux: av| pts[%uL] type [%d] key[%d]\",\n            frame.hdr.timestamp, frame.hdr.type, frame.keyframe);\n\n    switch (frame.hdr.type) {\n    case NGX_RTMP_MSG_AUDIO:\n        // only aac, for now\n        ngx_mpegts_live_aac_handler(s, &frame);\n        break;\n\n    case NGX_RTMP_MSG_VIDEO:\n        /* h264 h265 */\n        if (codec_ctx->video_codec_id == NGX_RTMP_VIDEO_H264) {\n            ngx_mpegts_live_h264_handler(s, &frame);\n        } else if (codec_ctx->video_codec_id == cacf->hevc_codec) {\n            ngx_mpegts_live_h265_handler(s, &frame);\n        }\n        break;\n\n    default:\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                \"rtmp-mpegts: av| unknown frame-type=%d\", frame.hdr.type);\n        break;\n    }\n\n    return NGX_OK;\n}\n\nngx_int_t\nngx_mpegts_live_video_filter(ngx_rtmp_session_t *s, ngx_mpegts_frame_t *frame)\n{\n    return ngx_mpegts_video(s, frame);\n}\n\nngx_int_t\nngx_mpegts_live_audio_filter(ngx_rtmp_session_t *s, ngx_mpegts_frame_t *frame)\n{\n    return ngx_mpegts_audio(s, frame);\n}\n\nstatic ngx_int_t\nngx_mpegts_live_avframe(ngx_rtmp_session_t *s, ngx_mpegts_frame_t *frame)\n{\n    ngx_mpegts_live_ctx_t   *cctx;\n    ngx_rtmp_session_t      *ss;\n\n    for (cctx = s->live_stream->mpegts_ctx; cctx; cctx = cctx->next) {\n        ss = cctx->session;\n        ngx_mpegts_gop_send(s, ss);\n\n        if (!s->connection->write->active) {\n            ngx_post_event(s->connection->write, &ngx_posted_events);\n        }\n    }\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_mpegts_live_ctx_init(ngx_rtmp_session_t *s)\n{\n    ngx_mpegts_live_app_conf_t         *macf;\n    ngx_mpegts_live_ctx_t              *ctx;\n\n    macf = ngx_rtmp_get_module_app_conf(s, ngx_mpegts_live_module);\n    if (macf == NULL) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"rtmp-mpegts: ctx_init| get app conf failed\");\n        return NGX_ERROR;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_live_module);\n    if (ctx == NULL) {\n        ctx = ngx_pcalloc(s->pool, sizeof(ngx_mpegts_live_ctx_t));\n        if (ctx == NULL) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"rtmp-mpegts: ctx_init| pcalloc ctx failed\");\n            return NGX_ERROR;\n        }\n\n        ngx_rtmp_set_ctx(s, ctx, ngx_mpegts_live_module);\n        ctx->session = s;\n    }\n\n    ctx->sync = macf->sync;\n    ctx->audio_buffer_size = macf->audio_buffer_size;\n    ctx->audio_delay = macf->audio_delay;\n    ctx->out_queue = macf->out_queue;\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_mpegts_live_join(ngx_rtmp_session_t *s, u_char *name, unsigned publisher)\n{\n    ngx_mpegts_live_ctx_t        *ctx;\n    ngx_live_stream_t            *st;\n    ngx_rtmp_live_app_conf_t     *lacf;\n\n    lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module);\n    if (lacf == NULL) {\n        return NGX_ERROR;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_live_module);\n    if (ctx && ctx->stream) {\n        ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"mpegts-live: join| already joined\");\n        return NGX_ERROR;\n    }\n\n    if (ctx == NULL) {\n        ctx = ngx_pcalloc(s->pool, sizeof(ngx_mpegts_live_ctx_t));\n        if (ctx == NULL) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"mpegts-live: join| pcalloc ctx failed\");\n            return NGX_ERROR;\n        }\n\n        ngx_rtmp_set_ctx(s, ctx, ngx_mpegts_live_module);\n    }\n\n    ngx_memzero(ctx, sizeof(*ctx));\n\n    ctx->session = s;\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"mpegts-live: join| join '%s'\", name);\n\n    st = s->live_stream;\n\n    if (!(publisher || st->publish_ctx || lacf->idle_streams)) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"mpegts-live: join| stream not found\");\n\n        s->status = 404;\n\n        return NGX_ERROR;\n    }\n\n    ctx->stream = st;\n    ctx->next = st->mpegts_ctx;\n\n    st->mpegts_ctx = ctx;\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_mpegts_live_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v)\n{\n    ngx_mpegts_live_ctx_init(s);\n\n    return next_publish(s, v);\n}\n\nstatic ngx_int_t\nngx_mpegts_live_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v)\n{\n    if (s->live_type != NGX_MPEGTS_LIVE) {\n        goto next;\n    }\n\n    if (ngx_mpegts_live_join(s, v->name, 0) == NGX_ERROR) {\n        return NGX_ERROR;\n    }\n\nnext:\n    return next_play(s, v);\n}\n\nstatic ngx_int_t\nngx_mpegts_live_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)\n{\n    ngx_mpegts_live_ctx_t      *ctx, **cctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_mpegts_live_module);\n    if (ctx == NULL) {\n        goto next;\n    }\n\n    if (ctx->stream == NULL) {\n        ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                \"mpegts-live: close_stream| not joined\");\n        goto next;\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"mpegts-live: close_stream| leave '%s'\", ctx->stream->name);\n\n    for (cctx = &ctx->stream->mpegts_ctx; *cctx; cctx = &(*cctx)->next) {\n        if (*cctx == ctx) {\n            *cctx = ctx->next;\n            break;\n        }\n    }\n\n    if (ctx->stream->mpegts_ctx) {\n        ctx->stream = NULL;\n        goto next;\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"mpegts-live: close_stream| delete empty stream '%s'\",\n                   ctx->stream->name);\n\n    ctx->stream = NULL;\n\nnext:\n    return next_close_stream(s, v);\n}\n\nstatic ngx_int_t\nngx_mpegts_live_postconfiguration(ngx_conf_t *cf)\n{\n    ngx_rtmp_core_main_conf_t          *cmcf;\n    ngx_rtmp_handler_pt                *h;\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    /* register raw event handlers */\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]);\n    *h = ngx_mpegts_live_av;\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]);\n    *h = ngx_mpegts_live_av;\n\n    next_publish = ngx_rtmp_publish;\n    ngx_rtmp_publish = ngx_mpegts_live_publish;\n\n    next_play = ngx_rtmp_play;\n    ngx_rtmp_play = ngx_mpegts_live_play;\n\n    next_close_stream = ngx_rtmp_close_stream;\n    ngx_rtmp_close_stream = ngx_mpegts_live_close_stream;\n\n    ngx_mpegts_video = ngx_mpegts_live_avframe;\n    ngx_mpegts_audio = ngx_mpegts_live_avframe;\n\n    return NGX_OK;\n}\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/mpegts/ngx_mpegts_live_module.h",
    "content": "\n/*\n * Copyright (C) Pingo (cczjp89@gmail.com)\n */\n\n#ifndef _NGX_RTMP_MPEGTS_MODULE_H\n#define _NGX_RTMP_MPEGTS_MODULE_H\n\n#include \"ngx_rtmp.h\"\n\ntypedef ngx_int_t (*ngx_mpegts_video_pt)(ngx_rtmp_session_t *s,\n    ngx_mpegts_frame_t *frame);\ntypedef ngx_int_t (*ngx_mpegts_audio_pt)(ngx_rtmp_session_t *s,\n    ngx_mpegts_frame_t *frame);\n\nextern ngx_mpegts_video_pt ngx_mpegts_video;\nextern ngx_mpegts_audio_pt ngx_mpegts_audio;\n\nngx_int_t\nngx_rtmp_mpegts_gen_pmt(ngx_int_t vcodec, ngx_int_t acodec,\n    ngx_log_t *log, u_char *pmt);\nngx_int_t\nngx_mpegts_live_video_filter(ngx_rtmp_session_t *s, ngx_mpegts_frame_t *frame);\nngx_int_t\nngx_mpegts_live_audio_filter(ngx_rtmp_session_t *s, ngx_mpegts_frame_t *frame);\n\nextern u_char ngx_rtmp_mpegts_pat[];\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_live.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include \"ngx_live.h\"\n\n\nstatic void *ngx_live_create_conf(ngx_cycle_t *cf);\nstatic char *ngx_live_init_conf(ngx_cycle_t *cycle, void *conf);\n\n\nstatic ngx_command_t  ngx_live_commands[] = {\n\n    { ngx_string(\"stream_buckets\"),\n      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_size_slot,\n      0,\n      offsetof(ngx_live_conf_t, stream_buckets),\n      NULL },\n\n    { ngx_string(\"server_buckets\"),\n      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_size_slot,\n      0,\n      offsetof(ngx_live_conf_t, server_buckets),\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_core_module_t  ngx_live_module_ctx = {\n    ngx_string(\"live\"),\n    ngx_live_create_conf,           /* create conf */\n    ngx_live_init_conf              /* init conf */\n};\n\n\nngx_module_t  ngx_live_module = {\n    NGX_MODULE_V1,\n    &ngx_live_module_ctx,           /* module context */\n    ngx_live_commands,              /* module directives */\n    NGX_CORE_MODULE,                /* module type */\n    NULL,                           /* init master */\n    NULL,                           /* init module */\n    NULL,                           /* init process */\n    NULL,                           /* init thread */\n    NULL,                           /* exit thread */\n    NULL,                           /* exit process */\n    NULL,                           /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_live_create_conf(ngx_cycle_t *cycle)\n{\n    ngx_live_conf_t            *lcf;\n\n    lcf = ngx_pcalloc(cycle->pool, sizeof(ngx_live_conf_t));\n    if (lcf == NULL) {\n        return NULL;\n    }\n\n    lcf->stream_buckets = NGX_CONF_UNSET_SIZE;\n    lcf->server_buckets = NGX_CONF_UNSET_SIZE;\n\n    return lcf;\n}\n\nstatic char *\nngx_live_init_conf(ngx_cycle_t *cycle, void *conf)\n{\n    ngx_live_conf_t            *lcf = conf;\n\n    lcf->pool = ngx_create_pool(4096, cycle->log);\n    if (lcf->pool == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    ngx_conf_init_size_value(lcf->stream_buckets, 10007);\n    ngx_conf_init_size_value(lcf->server_buckets, 1031);\n\n    lcf->servers = ngx_pcalloc(lcf->pool,\n            sizeof(ngx_live_server_t *) * lcf->server_buckets);\n    if (lcf->servers == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_live_server_t **\nngx_live_find_server(ngx_str_t *serverid)\n{\n    ngx_live_conf_t            *lcf;\n    ngx_live_server_t         **psrv;\n\n    lcf = (ngx_live_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                           ngx_live_module);\n\n    psrv = &lcf->servers[ngx_hash_key(serverid->data, serverid->len)\n                         % lcf->server_buckets];\n    for (; *psrv; psrv = &(*psrv)->next) {\n        if (ngx_strlen((*psrv)->serverid) == serverid->len &&\n            ngx_memcmp((*psrv)->serverid, serverid->data, serverid->len) == 0)\n        {\n            break;\n        }\n    }\n\n    return psrv;\n}\n\nstatic ngx_live_server_t *\nngx_live_get_server(ngx_str_t *serverid)\n{\n    ngx_live_conf_t            *lcf;\n    ngx_live_server_t          *srv;\n\n    if (serverid->len > NGX_LIVE_SERVERID_LEN - 1) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"serverid too long: %ui\", serverid->len);\n        return NULL;\n    }\n\n    lcf = (ngx_live_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                           ngx_live_module);\n\n    srv = lcf->free_server;\n    if (srv == NULL) {\n        srv = ngx_pcalloc(lcf->pool, sizeof(ngx_live_server_t));\n        if (srv == NULL) {\n            return NULL;\n        }\n\n        srv->streams = ngx_pcalloc(lcf->pool,\n                sizeof(ngx_live_stream_t *) * lcf->stream_buckets);\n        if (srv->streams == NULL) {\n            return NULL;\n        }\n\n        ++lcf->alloc_server_count;\n    } else {\n        lcf->free_server = srv->next;\n        --lcf->free_server_count;\n    }\n\n    *ngx_cpymem(srv->serverid, serverid->data, serverid->len) = 0;\n    srv->deleted = 0;\n    srv->n_stream = 0;\n\n    return srv;\n}\n\nstatic void\nngx_live_put_server(ngx_live_server_t *server)\n{\n    ngx_live_conf_t            *lcf;\n\n    lcf = (ngx_live_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                           ngx_live_module);\n\n    server->next = lcf->free_server;\n    lcf->free_server = server;\n    ++lcf->free_server_count;\n}\n\nstatic ngx_live_stream_t **\nngx_live_find_stream(ngx_live_server_t *server, ngx_str_t *stream)\n{\n    ngx_live_conf_t            *lcf;\n    ngx_live_stream_t         **pst;\n\n    lcf = (ngx_live_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                           ngx_live_module);\n\n    pst = &server->streams[ngx_hash_key(stream->data, stream->len)\n                           % lcf->stream_buckets];\n    for (; *pst; pst = &(*pst)->next) {\n        if (ngx_strlen((*pst)->name) == stream->len &&\n            ngx_memcmp((*pst)->name, stream->data, stream->len) == 0)\n        {\n            break;\n        }\n    }\n\n    return pst;\n}\n\nstatic ngx_live_stream_t *\nngx_live_get_stream(ngx_str_t *stream)\n{\n    ngx_live_conf_t            *lcf;\n    ngx_live_stream_t          *st;\n\n    if (stream->len > NGX_LIVE_STREAM_LEN - 1) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"stream too long: %ui\", stream->len);\n        return NULL;\n    }\n\n    lcf = (ngx_live_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                           ngx_live_module);\n\n    st = lcf->free_stream;\n    if (st == NULL) {\n        st = ngx_pcalloc(lcf->pool, sizeof(ngx_live_stream_t));\n        ++lcf->alloc_stream_count;\n    } else {\n        lcf->free_stream = st->next;\n        --lcf->free_stream_count;\n        ngx_memzero(st, sizeof(ngx_live_stream_t));\n    }\n\n    *ngx_cpymem(st->name, stream->data, stream->len) = 0;\n    st->pslot = -1;\n    st->epoch = ngx_current_msec;\n    ngx_map_init(&st->pubctx, ngx_map_hash_int, ngx_cmp_int);\n\n    return st;\n}\n\nstatic void\nngx_live_put_stream(ngx_live_stream_t *st)\n{\n    ngx_live_conf_t            *lcf;\n\n    lcf = (ngx_live_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                           ngx_live_module);\n\n    st->next = lcf->free_stream;\n    lcf->free_stream = st;\n    ++lcf->free_stream_count;\n}\n\nngx_live_server_t *\nngx_live_create_server(ngx_str_t *serverid)\n{\n    ngx_live_server_t         **psrv;\n\n    psrv = ngx_live_find_server(serverid);\n    if (*psrv) {\n        (*psrv)->deleted = 0;\n        return *psrv;\n    }\n\n    *psrv = ngx_live_get_server(serverid);\n\n    return *psrv;\n}\n\nngx_live_server_t *\nngx_live_fetch_server(ngx_str_t *serverid)\n{\n    ngx_live_server_t         **psrv;\n\n    psrv = ngx_live_find_server(serverid);\n\n    return *psrv;\n}\n\nvoid\nngx_live_delete_server(ngx_str_t *serverid)\n{\n    ngx_live_server_t         **psrv, *srv;\n\n    psrv = ngx_live_find_server(serverid);\n    if (*psrv == NULL) {\n        return;\n    }\n\n    if ((*psrv)->n_stream != 0) {\n        (*psrv)->deleted = 1;\n    }\n\n    if ((*psrv)->n_stream == 0) {\n        srv = *psrv;\n        *psrv = srv->next;\n        ngx_live_put_server(srv);\n    }\n}\n\nngx_live_stream_t *\nngx_live_create_stream(ngx_str_t *serverid, ngx_str_t *stream)\n{\n    ngx_live_server_t         **psrv;\n    ngx_live_stream_t         **pst;\n\n    psrv = ngx_live_find_server(serverid);\n    if (*psrv == NULL) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"server %V does not exist when create stream\", serverid);\n        return NULL;\n    }\n\n    pst = ngx_live_find_stream(*psrv, stream);\n\n    if (*pst) {\n        return *pst;\n    }\n\n    *pst = ngx_live_get_stream(stream);\n    ++(*psrv)->n_stream;\n\n    return *pst;\n}\n\nngx_live_stream_t *\nngx_live_fetch_stream(ngx_str_t *serverid, ngx_str_t *stream)\n{\n    ngx_live_server_t         **psrv;\n    ngx_live_stream_t         **pst;\n\n    psrv = ngx_live_find_server(serverid);\n    if (*psrv == NULL) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"server %V does not exist when fetch stream\", serverid);\n        return NULL;\n    }\n\n    pst = ngx_live_find_stream(*psrv, stream);\n\n    return *pst;\n}\n\nvoid\nngx_live_delete_stream(ngx_str_t *serverid, ngx_str_t *stream)\n{\n    ngx_live_server_t         **psrv;\n    ngx_live_stream_t         **pst, *st;\n\n    psrv = ngx_live_find_server(serverid);\n    if (*psrv == NULL) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"server %V does not exist when delete stream\", serverid);\n        return;\n    }\n\n    pst = ngx_live_find_stream(*psrv, stream);\n\n    if (*pst == NULL) {\n        return;\n    }\n\n    st = *pst;\n\n    *pst = st->next;\n    ngx_live_put_stream(st);\n    --(*psrv)->n_stream;\n\n    if ((*psrv)->deleted && (*psrv)->n_stream == 0) {\n        ngx_live_delete_server(serverid);\n    }\n}\n\nvoid\nngx_live_create_ctx(ngx_rtmp_session_t *s, unsigned publishing)\n{\n    ngx_rtmp_core_ctx_t        *ctx, **pctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_core_module);\n    if (ctx == NULL) {\n        ctx = ngx_pcalloc(s->pool, sizeof(ngx_rtmp_core_ctx_t));\n        if (ctx == NULL) {\n            return;\n        }\n\n        ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_core_module);\n    }\n\n    ctx->publishing = publishing;\n    ctx->session = s;\n    if (publishing) {\n        pctx = &s->live_stream->publish_ctx;\n    } else {\n        pctx = &s->live_stream->play_ctx;\n    }\n\n    ctx->next = (*pctx);\n    *pctx = ctx;\n}\n\nvoid\nngx_live_delete_ctx(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_core_ctx_t        *ctx, **pctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_core_module);\n    if (ctx == NULL) {\n        return;\n    }\n\n    if (ctx->publishing) {\n        pctx = &s->live_stream->publish_ctx;\n    } else {\n        pctx = &s->live_stream->play_ctx;\n    }\n\n    for (/* void */; *pctx; pctx = &(*pctx)->next) {\n        if (*pctx == ctx) {\n            *pctx = ctx->next;\n            return;\n        }\n    }\n}\n\n\nngx_chain_t *\nngx_live_state(ngx_http_request_t *r)\n{\n    ngx_live_conf_t            *lcf;\n    ngx_chain_t                *cl;\n    ngx_buf_t                  *b;\n    size_t                      len;\n\n    lcf = (ngx_live_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                           ngx_live_module);\n\n\n    len = sizeof(\"##########ngx live state##########\\n\") - 1\n        + sizeof(\"ngx_live nalloc server: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_live nfree server: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_live nalloc stream: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_live nfree stream: \\n\") - 1 + NGX_OFF_T_LEN;\n\n    cl = ngx_alloc_chain_link(r->pool);\n    if (cl == NULL) {\n        return NULL;\n    }\n    cl->next = NULL;\n\n    b = ngx_create_temp_buf(r->pool, len);\n    if (b == NULL) {\n        return NULL;\n    }\n    cl->buf = b;\n\n    b->last = ngx_snprintf(b->last, len,\n            \"##########ngx live state##########\\n\"\n            \"ngx_live nalloc server: %ui\\nngx_live nfree server: %ui\\n\"\n            \"ngx_live nalloc stream: %ui\\nngx_live nfree stream: %ui\\n\",\n            lcf->alloc_server_count, lcf->free_server_count,\n            lcf->alloc_stream_count, lcf->free_stream_count);\n\n    return cl;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_live.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_LIVE_H_INCLUDED_\n#define _NGX_LIVE_H_INCLUDED_\n\n\n#include \"ngx_rtmp.h\"\n\n\ntypedef struct {\n    size_t                      stream_buckets;\n    size_t                      server_buckets;\n\n    ngx_live_server_t         **servers;\n\n    ngx_live_server_t          *free_server;\n    ngx_live_stream_t          *free_stream;\n\n    ngx_uint_t                  alloc_server_count;\n    ngx_uint_t                  free_server_count;\n\n    ngx_uint_t                  alloc_stream_count;\n    ngx_uint_t                  free_stream_count;\n\n    ngx_pool_t                 *pool;\n} ngx_live_conf_t;\n\n\nextern ngx_module_t     ngx_live_module;\n\n\n/*\n * paras:\n *      r: http request to query status of rbuf\n */\nngx_chain_t *ngx_live_state(ngx_http_request_t *r);\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_live_record.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_cmd_module.h\"\n#include \"ngx_rtmp_codec_module.h\"\n#include \"ngx_live_record.h\"\n\n\nngx_live_record_start_pt            ngx_live_record_start;\nngx_live_record_update_pt           ngx_live_record_update;\nngx_live_record_done_pt             ngx_live_record_done;\n\nstatic ngx_live_record_start_pt     next_record_start;\nstatic ngx_live_record_update_pt    next_record_update;\nstatic ngx_live_record_done_pt      next_record_done;\n\nstatic ngx_rtmp_publish_pt          next_publish;\nstatic ngx_rtmp_close_stream_pt     next_close_stream;\n\n\nstatic ngx_int_t ngx_live_record_postconfiguration(ngx_conf_t *cf);\nstatic void * ngx_live_record_create_app_conf(ngx_conf_t *cf);\nstatic char * ngx_live_record_merge_app_conf(ngx_conf_t *cf,\n       void *parent, void *child);\n\n\n#define NGX_LIVE_RECORD_BUFSIZE     (10*1024*1024)\n\n\ntypedef struct {\n    ngx_flag_t                      record;\n    ngx_str_t                       path;\n    ngx_msec_t                      interval;\n\n    ngx_msec_t                      min_fraglen;\n    ngx_msec_t                      max_fraglen;\n\n    size_t                          buffer;\n} ngx_live_record_app_conf_t;\n\n\nstatic ngx_command_t  ngx_live_record_commands[] = {\n\n    { ngx_string(\"live_record\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_live_record_app_conf_t, record),\n      NULL },\n\n    { ngx_string(\"live_record_path\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_str_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_live_record_app_conf_t, path),\n      NULL },\n\n    { ngx_string(\"live_record_interval\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_live_record_app_conf_t, interval),\n      NULL },\n\n    { ngx_string(\"live_record_min_fragment\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_live_record_app_conf_t, min_fraglen),\n      NULL },\n\n    { ngx_string(\"live_record_max_fragment\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_live_record_app_conf_t, max_fraglen),\n      NULL },\n\n    { ngx_string(\"live_record_buffer\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_size_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_live_record_app_conf_t, buffer),\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_live_record_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_live_record_postconfiguration,      /* postconfiguration */\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    ngx_live_record_create_app_conf,        /* create app configuration */\n    ngx_live_record_merge_app_conf          /* merge app configuration */\n};\n\n\nngx_module_t  ngx_live_record_module = {\n    NGX_MODULE_V1,\n    &ngx_live_record_module_ctx,            /* module context */\n    ngx_live_record_commands,               /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_live_record_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_live_record_app_conf_t     *racf;\n\n    racf = ngx_pcalloc(cf->pool, sizeof(ngx_live_record_app_conf_t));\n\n    if (racf == NULL) {\n        return NULL;\n    }\n\n    racf->record = NGX_CONF_UNSET;\n    racf->interval = NGX_CONF_UNSET_MSEC;\n    racf->min_fraglen = NGX_CONF_UNSET_MSEC;\n    racf->max_fraglen = NGX_CONF_UNSET_MSEC;\n    racf->buffer = NGX_CONF_UNSET_SIZE;\n\n    return racf;\n}\n\n\nstatic char *\nngx_live_record_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_err_t                       err;\n    ngx_live_record_app_conf_t     *prev;\n    ngx_live_record_app_conf_t     *conf;\n    u_char                          path[NGX_MAX_PATH + 1];\n\n    prev = parent;\n    conf = child;\n\n    ngx_conf_merge_value(conf->record, prev->record, 0);\n    ngx_conf_merge_str_value(conf->path, prev->path, \"record\");\n    ngx_conf_merge_msec_value(conf->interval, prev->interval, 10 * 60 * 1000);\n    ngx_conf_merge_msec_value(conf->min_fraglen, prev->min_fraglen, 8 * 1000);\n    ngx_conf_merge_msec_value(conf->max_fraglen, prev->max_fraglen, 12 * 1000);\n    ngx_conf_merge_msec_value(conf->buffer, prev->buffer, 1024 * 1024);\n\n    if (conf->path.data[conf->path.len - 1] == '/') {\n        --conf->path.len;\n    }\n\n    if (ngx_get_full_name(cf->pool, &cf->cycle->prefix, &conf->path)\n            != NGX_OK)\n    {\n        return NGX_CONF_ERROR;\n    }\n\n    *ngx_snprintf(path, sizeof(path) - 1, \"%V/\", &conf->path) = 0;\n    err = ngx_create_full_path(path, 0755);\n    if (err) {\n        ngx_conf_log_error(NGX_LOG_CRIT, cf, err,\n                ngx_create_dir_n \" \\\"%s\\\" failed\", path);\n        return NGX_CONF_ERROR;\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ssize_t\nngx_live_record_flush(ngx_rtmp_mpegts_file_t *file)\n{\n    ssize_t                         rc;\n\n    rc = ngx_write_fd(file->fd, file->wbuf.pos,\n            file->wbuf.last - file->wbuf.pos);\n    if (rc < 0) {\n        ngx_log_error(NGX_LOG_ERR, file->log, ngx_errno,\n                \"flush record buf error\");\n        return rc;\n    }\n\n    file->file_size += rc;\n    file->wbuf.last = file->wbuf.pos;\n\n    return rc;\n}\n\n\nstatic ssize_t\nngx_live_record_write_buf(ngx_rtmp_mpegts_file_t *file, u_char *in,\n        size_t in_size)\n{\n    u_char                         *p, *end;\n    size_t                          len;\n    ssize_t                         rc, n;\n\n    end = in + in_size;\n    n = 0;\n\n    for (p = in; p != end; /* void */ ) {\n        len = ngx_min(file->wbuf.end - file->wbuf.last, end - p);\n        file->wbuf.last = ngx_cpymem(file->wbuf.last, p, len);\n\n        p += len;\n        n += len;\n\n        if (file->wbuf.last == file->wbuf.end) {\n            rc = ngx_live_record_flush(file);\n            if (rc < 0) {\n                return rc;\n            }\n        }\n    }\n\n    return n;\n}\n\n\nstatic ngx_int_t\nngx_live_record_open_file(ngx_rtmp_session_t *s)\n{\n    ngx_live_record_app_conf_t     *lracf;\n    ngx_live_record_ctx_t          *ctx;\n    ngx_err_t                       err;\n    off_t                           file_size;\n    size_t                          len;\n    struct tm                       tm;\n    u_char                         *p;\n    ngx_rtmp_codec_ctx_t           *codec_ctx;\n\n    lracf = ngx_rtmp_get_module_app_conf(s, ngx_live_record_module);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_record_module);\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    len = lracf->path.len + sizeof(\"/\") - 1 + s->serverid.len + sizeof(\"/\") - 1\n        + s->app.len + sizeof(\"/\") - 1 + s->name.len + sizeof(\"/\") - 1\n        + sizeof(\"YYYYMMDD/\") - 1 + s->name.len\n        + NGX_OFF_T_LEN + sizeof(\"_.ts\") - 1;\n\n    if (ctx->file.name.len == 0) { // first create in current session\n        ctx->file.name.data = ngx_pcalloc(s->pool, len + 1);\n        if (ctx->file.name.data == NULL) {\n            ngx_log_error(NGX_LOG_CRIT, s->log, 0,\n                    \"record: alloc for ts name failed\");\n            return NGX_ERROR;\n        }\n    }\n\n    // fill file name\n    ngx_libc_localtime(ctx->last_time, &tm);\n\n    p = ngx_snprintf(ctx->file.name.data, len,\n            \"%V/%V/%V/%V/%04d%02d%02d/%V_%d.ts\",\n            &lracf->path, &s->serverid, &s->app, &s->name,\n            tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,\n            &s->name, ctx->last_time);\n    *p = 0;\n    ctx->file.name.len = p - ctx->file.name.data;\n\n    // create dir\n    err = ngx_create_full_path(ctx->file.name.data, 0755);\n    if (err) {\n        ngx_log_error(NGX_LOG_ERR, s->log, err,\n                ngx_create_dir_n \" \\\"%V\\\" failed\", &ctx->index.name);\n        return NGX_ERROR;\n    }\n\n    // open file\n    ctx->file.fd = ngx_open_file(ctx->file.name.data, NGX_FILE_RDWR,\n            NGX_FILE_CREATE_OR_OPEN, NGX_FILE_DEFAULT_ACCESS);\n    if (ctx->file.fd == NGX_INVALID_FILE) {\n        ngx_log_error(NGX_LOG_CRIT, s->log, ngx_errno,\n                \"record: failed to open file '%V'\", &ctx->file.name);\n\n        return NGX_ERROR;\n    }\n\n    file_size = lseek(ctx->file.fd, 0, SEEK_END);\n    if (file_size == (off_t) -1) {\n        ngx_log_error(NGX_LOG_CRIT, s->log, ngx_errno,\n                \"record: %V seek failed\", &ctx->file.name);\n\n        return NGX_ERROR;\n    }\n\n    if (ctx->ts.wbuf.start == NULL) {\n        ctx->ts.wbuf.start = ngx_pcalloc(s->pool, lracf->buffer);\n        if (ctx->ts.wbuf.start == NULL) {\n            ngx_log_error(NGX_LOG_CRIT, s->log, 0,\n                    \"record: alloc write buffer error\");\n            return NGX_ERROR;\n        }\n\n        ctx->ts.wbuf.pos = ctx->ts.wbuf.last = ctx->ts.wbuf.start;\n        ctx->ts.wbuf.end = ctx->ts.wbuf.start + lracf->buffer;\n\n        ctx->ts.whandle = ngx_live_record_write_buf;\n    }\n    ctx->ts.fd = ctx->file.fd;\n    ctx->ts.log = s->log;\n    ctx->ts.file_size = file_size;\n    ctx->ts.vcodec = codec_ctx->video_codec_id;\n    ctx->ts.acodec = codec_ctx->audio_codec_id;\n\n    if (file_size == 0) { // empty file\n        if (ngx_rtmp_mpegts_write_header(&ctx->ts) != NGX_OK) {\n            ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                    \"record: error writing fragment header\");\n\n            return NGX_ERROR;\n        }\n        ngx_live_record_flush(&ctx->ts);\n    }\n\n    ctx->startsize = ctx->ts.file_size;\n    ctx->endsize = ctx->ts.file_size;\n\n    return NGX_OK;\n}\n\n\nstatic void\nngx_live_record_write_index(ngx_rtmp_session_t *s, ngx_live_record_ctx_t *ctx,\n        ngx_msec_t curr_time)\n{\n    u_char                         *p, buf[1024];\n\n    ngx_live_record_flush(&ctx->ts);\n\n    ctx->endsize = ctx->ts.file_size - 1;\n\n    p = ngx_snprintf(buf, sizeof(buf) - 1,\n            \"%V-%D.ts?startsize=%O&endsize=%O&starttime=%M&endtime=%M\\n\",\n            &s->name, ctx->last_time, ctx->startsize, ctx->endsize,\n            ctx->starttime, ctx->endtime);\n    *p = 0;\n\n    if (ngx_write_fd(ctx->index.fd, buf, p - buf) < 0) {\n        ngx_log_error(NGX_LOG_ERR, s->log, ngx_errno,\n                \"record, write %V failed: %s\", &ctx->index.name, buf);\n    }\n\n    ctx->startsize = ctx->ts.file_size;\n    ctx->starttime = curr_time;\n}\n\n\nstatic ngx_int_t\nngx_live_record_open_index(ngx_rtmp_session_t *s)\n{\n    ngx_live_record_app_conf_t     *lracf;\n    ngx_live_record_ctx_t          *ctx;\n    ngx_err_t                       err;\n    size_t                          len;\n    struct tm                       tm;\n    u_char                         *p;\n\n    lracf = ngx_rtmp_get_module_app_conf(s, ngx_live_record_module);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_record_module);\n\n    len = lracf->path.len + sizeof(\"/\") - 1 + s->serverid.len + sizeof(\"/\") - 1\n        + s->app.len + sizeof(\"/\") - 1 + s->name.len + sizeof(\"/\") - 1\n        + sizeof(\"index/YYYYMMDD/\") - 1 + s->name.len\n        + NGX_OFF_T_LEN + sizeof(\"-.m3u8\") - 1;\n\n    if (ctx->index.name.len == 0) { // first create in current session\n        ctx->index.name.data = ngx_pcalloc(s->pool, len + 1);\n        if (ctx->index.name.data == NULL) {\n            ngx_log_error(NGX_LOG_CRIT, s->log, 0,\n                    \"record: alloc for index name failed\");\n            return NGX_ERROR;\n        }\n    }\n\n    // fill index and file name\n    ngx_libc_localtime(ctx->last_time, &tm);\n\n    p = ngx_snprintf(ctx->index.name.data, len,\n            \"%V/%V/%V/%V/index/%04d%02d%02d/%V-%D.m3u8\",\n            &lracf->path, &s->serverid, &s->app, &s->name,\n            tm.tm_year + 1900, tm.tm_mon + 1, tm.tm_mday,\n            &s->name, ctx->last_time);\n    *p = 0;\n    ctx->index.name.len = p - ctx->index.name.data;\n\n    // create dir\n    err = ngx_create_full_path(ctx->index.name.data, 0755);\n    if (err) {\n        ngx_log_error(NGX_LOG_ERR, s->log, err,\n                ngx_create_dir_n \" \\\"%V\\\" failed\", &ctx->index.name);\n        return NGX_ERROR;\n    }\n\n    // open index\n    ctx->index.fd = ngx_open_file(ctx->index.name.data, NGX_FILE_RDWR,\n            NGX_FILE_CREATE_OR_OPEN, NGX_FILE_DEFAULT_ACCESS);\n    if (ctx->index.fd == NGX_INVALID_FILE) {\n        ngx_log_error(NGX_LOG_CRIT, s->log, ngx_errno,\n                \"record: failed to open index '%V'\", &ctx->index.name);\n\n        return NGX_OK;\n    }\n\n    if (lseek(ctx->index.fd, 0, SEEK_END) == (off_t) -1) {\n        ngx_log_error(NGX_LOG_CRIT, s->log, ngx_errno,\n                \"record, %V seek failed\", &ctx->index.name);\n\n        return NGX_OK;\n    }\n\n    return ngx_live_record_open_file(s);\n}\n\n\nstatic void\nngx_live_record_close_index(ngx_rtmp_session_t *s, ngx_live_record_ctx_t *ctx)\n{\n    if (ctx->index.fd == -1 || ctx->file.fd == -1) {\n        return;\n    }\n\n    ngx_live_record_write_index(s, ctx, 0);\n\n    ngx_close_file(ctx->file.fd);\n    ctx->file.fd = -1;\n\n    ngx_close_file(ctx->index.fd);\n    ctx->index.fd = -1;\n}\n\n\nstatic void\nngx_live_record_reopen_index(ngx_rtmp_session_t *s, ngx_live_record_ctx_t *ctx,\n        ngx_msec_t curr_time, time_t last_time)\n{\n    // close old index and file\n    ngx_live_record_close_index(s, ctx);\n\n    ngx_live_record_update(s);\n\n    ctx->last_time = last_time;\n\n    ctx->begintime = curr_time;\n    ctx->starttime = curr_time;\n    ctx->endtime = curr_time;\n\n    // open new index and file\n    if (ngx_live_record_open_index(s) == NGX_ERROR) {\n        ctx->last_time = 0;\n\n        if (ctx->index.fd != -1) {\n            ngx_close_file(ctx->index.fd);\n        }\n\n        if (ctx->file.fd != -1) {\n            ngx_close_file(ctx->file.fd);\n        }\n\n        return;\n    }\n}\n\n\nstatic ngx_int_t\nngx_live_record_copy(ngx_rtmp_session_t *s, void *dst, u_char **src, size_t n,\n    ngx_chain_t **in)\n{\n    u_char  *last;\n    size_t   pn;\n\n    if (*in == NULL) {\n        return NGX_ERROR;\n    }\n\n    for ( ;; ) {\n        last = (*in)->buf->last;\n\n        if ((size_t)(last - *src) >= n) {\n            if (dst) {\n                ngx_memcpy(dst, *src, n);\n            }\n\n            *src += n;\n\n            while (*in && *src == (*in)->buf->last) {\n                *in = (*in)->next;\n                if (*in) {\n                    *src = (*in)->buf->pos;\n                }\n            }\n\n            return NGX_OK;\n        }\n\n        pn = last - *src;\n\n        if (dst) {\n            ngx_memcpy(dst, *src, pn);\n            dst = (u_char *)dst + pn;\n        }\n\n        n -= pn;\n        *in = (*in)->next;\n\n        if (*in == NULL) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                          \"hls: failed to read %uz byte(s)\", n);\n            return NGX_ERROR;\n        }\n\n        *src = (*in)->buf->pos;\n    }\n}\n\n\nstatic ngx_int_t\nngx_live_record_parse_aac_header(ngx_rtmp_session_t *s, ngx_uint_t *objtype,\n    ngx_uint_t *srindex, ngx_uint_t *chconf)\n{\n    ngx_rtmp_codec_ctx_t           *codec_ctx;\n    ngx_chain_t                    *cl;\n    u_char                         *p, b0, b1;\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    cl = codec_ctx->aac_header->chain;\n\n    p = cl->buf->pos;\n\n    if (ngx_live_record_copy(s, NULL, &p, 2, &cl) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    if (ngx_live_record_copy(s, &b0, &p, 1, &cl) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    if (ngx_live_record_copy(s, &b1, &p, 1, &cl) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    *objtype = b0 >> 3;\n    if (*objtype == 0 || *objtype == 0x1f) {\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"record: unsupported adts object type:%ui\", *objtype);\n        return NGX_ERROR;\n    }\n\n    if (*objtype > 4) {\n\n        /*\n         * Mark all extended profiles as LC\n         * to make Android as happy as possible.\n         */\n\n        *objtype = 2;\n    }\n\n    *srindex = ((b0 << 1) & 0x0f) | ((b1 & 0x80) >> 7);\n    if (*srindex == 0x0f) {\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"record: unsupported adts sample rate:%ui\", *srindex);\n        return NGX_ERROR;\n    }\n\n    *chconf = (b1 >> 3) & 0x0f;\n\n    ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"record: aac object_type:%ui, sample_rate_index:%ui, \"\n                   \"channel_config:%ui\", *objtype, *srindex, *chconf);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_record_append_aud(ngx_rtmp_session_t *s, ngx_buf_t *out)\n{\n    static u_char   aud_nal[] = { 0x00, 0x00, 0x00, 0x01, 0x09, 0xf0 };\n\n    if (out->last + sizeof(aud_nal) > out->end) {\n        return NGX_ERROR;\n    }\n\n    out->last = ngx_cpymem(out->last, aud_nal, sizeof(aud_nal));\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_record_append_sps_pps(ngx_rtmp_session_t *s, ngx_buf_t *out)\n{\n    ngx_rtmp_codec_ctx_t           *codec_ctx;\n    u_char                         *p;\n    ngx_chain_t                    *in;\n    int8_t                          nnals;\n    uint16_t                        len, rlen;\n    ngx_int_t                       n;\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    if (codec_ctx == NULL || codec_ctx->avc_header == NULL) {\n        return NGX_OK;\n    }\n\n    in = codec_ctx->avc_header->chain;\n    if (in == NULL) {\n        return NGX_ERROR;\n    }\n\n    p = in->buf->pos;\n\n    /*\n     * Skip bytes:\n     * - flv fmt\n     * - H264 CONF/PICT (0x00)\n     * - 0\n     * - 0\n     * - 0\n     * - version\n     * - profile\n     * - compatibility\n     * - level\n     * - nal bytes\n     */\n\n    if (ngx_live_record_copy(s, NULL, &p, 10, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    /* number of SPS NALs */\n    if (ngx_live_record_copy(s, &nnals, &p, 1, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    nnals &= 0x1f; /* 5lsb */\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"record: SPS number: %uz\", nnals);\n\n    /* SPS */\n    for (n = 0; ; ++n) {\n        for (; nnals; --nnals) {\n\n            /* NAL length */\n            if (ngx_live_record_copy(s, &rlen, &p, 2, &in) != NGX_OK) {\n                return NGX_ERROR;\n            }\n\n            ngx_rtmp_rmemcpy(&len, &rlen, 2);\n\n            ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                           \"record: header NAL length: %uz\", (size_t) len);\n\n            /* AnnexB prefix */\n            if (out->end - out->last < 4) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                              \"record: too small buffer for header NAL size\");\n                return NGX_ERROR;\n            }\n\n            *out->last++ = 0;\n            *out->last++ = 0;\n            *out->last++ = 0;\n            *out->last++ = 1;\n\n            /* NAL body */\n            if (out->end - out->last < len) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                              \"record: too small buffer for header NAL\");\n                return NGX_ERROR;\n            }\n\n            if (ngx_live_record_copy(s, out->last, &p, len, &in) != NGX_OK) {\n                return NGX_ERROR;\n            }\n\n            out->last += len;\n        }\n\n        if (n == 1) {\n            break;\n        }\n\n        /* number of PPS NALs */\n        if (ngx_live_record_copy(s, &nnals, &p, 1, &in) != NGX_OK) {\n            return NGX_ERROR;\n        }\n\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"record: PPS number: %uz\", nnals);\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_record_aac(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    ngx_live_record_ctx_t          *ctx;\n    ngx_rtmp_codec_ctx_t           *codec_ctx;\n    uint64_t                        pts;\n    ngx_rtmp_mpegts_frame_t         frame;\n    ngx_buf_t                       out;\n    u_char                         *p;\n    ngx_uint_t                      objtype, srindex, chconf, size;\n    static u_char                   buffer[NGX_LIVE_RECORD_BUFSIZE];\n    ngx_live_record_app_conf_t     *lracf;\n    ngx_msec_t                      curr_time;\n    time_t                          last_time;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_record_module);\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n    if (codec_ctx == NULL || codec_ctx->aac_header == NULL) {\n        return NGX_OK;\n    }\n\n    if (h->mlen < 2) {\n        return NGX_OK;\n    }\n\n    if (ctx->open == 2) {\n        if (codec_ctx->avc_header == NULL) { // pure audio\n            ctx->open = 1;\n        } else {\n            return NGX_OK;\n        }\n    }\n\n    lracf = ngx_rtmp_get_module_app_conf(s, ngx_live_record_module);\n\n    if (ctx->last_time == 0) {\n        ctx->publish_epoch = ngx_current_msec;\n        ctx->last_time = ngx_time() - ngx_time() % (lracf->interval / 1000);\n        ctx->basetime = ctx->publish_epoch - h->timestamp;\n\n        ctx->begintime = ngx_current_msec;\n        ctx->starttime = ngx_current_msec;\n        ctx->endtime = ngx_current_msec;\n\n        // open new index and file\n        if (ngx_live_record_open_index(s) == NGX_ERROR) {\n            ctx->last_time = 0;\n\n            if (ctx->index.fd != -1) {\n                ngx_close_file(ctx->index.fd);\n            }\n\n            if (ctx->file.fd != -1) {\n                ngx_close_file(ctx->file.fd);\n            }\n\n            return NGX_OK;\n        }\n    }\n\n    /*\n     * FLV Audio data config\n     *  SoundFormat 4bits, SoundRate 2bits, SoundSize 1bit, SoundType 1bit\n     *  AACPacketType 1byte\n     *\n     * mpegts ADTS 7 bytes\n     */\n    size = h->mlen - 2 + 7;\n    pts = (uint64_t) h->timestamp * 90;\n\n    p = in->buf->pos;\n\n    /* skip FLV Audio data config */\n    if (ngx_live_record_copy(s, NULL, &p, 2, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    ngx_memzero(&out, sizeof(out));\n\n    out.start = buffer;\n    out.end = buffer + sizeof(buffer);\n    out.pos = out.start;\n    out.last = out.pos;\n\n    /* make up ADTS */\n    if (ngx_live_record_parse_aac_header(s, &objtype, &srindex, &chconf)\n            != NGX_OK)\n    {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0, \"record: aac header error\");\n        return NGX_OK;\n    }\n\n    *out.last++ = 0xff;\n    *out.last++ = 0xf1;\n    *out.last++ = (u_char) (((objtype - 1) << 6) | (srindex << 2) |\n                  ((chconf & 0x04) >> 2));\n    *out.last++ = (u_char) (((chconf & 0x03) << 6) | ((size >> 11) & 0x03));\n    *out.last++ = (u_char) (size >> 3);\n    *out.last++ = (u_char) ((size << 5) | 0x1f);\n    *out.last++ = 0xfc;\n\n    /* copy payload */\n    while (in) {\n        if (in->buf->last - p) {\n            out.last = ngx_cpymem(out.last, p, in->buf->last - p);\n        }\n\n        in = in->next;\n        if (in) {\n            p = in->buf->pos;\n        }\n    }\n\n    // reopen index and ts file\n    curr_time = ctx->basetime + h->timestamp;\n    if (codec_ctx->avc_header == NULL) { // no video\n        last_time = curr_time / 1000 - (curr_time / 1000)\n                                     % (lracf->interval / 1000);\n        if (curr_time > ctx->starttime + lracf->min_fraglen) {\n            if (last_time > ctx->last_time) {\n                ngx_live_record_reopen_index(s, ctx, curr_time, last_time);\n            } else {\n                ngx_live_record_write_index(s, ctx, curr_time);\n            }\n        }\n    }\n\n    /* write frame */\n    ngx_memzero(&frame, sizeof(frame));\n\n    frame.cc = ctx->audio_cc;\n    frame.dts = pts;\n    frame.pts = frame.dts;\n    frame.pid = 0x101;\n    frame.sid = 0xc0;\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"record: audio pts=%uL, dts=%uL\", frame.pts, frame.dts);\n\n    if (ngx_rtmp_mpegts_write_frame(&ctx->ts, &frame, &out) != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0, \"record: audio frame failed\");\n    }\n\n    ctx->endtime = curr_time;\n    ctx->audio_cc = frame.cc;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_record_avc(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    ngx_live_record_ctx_t          *ctx;\n    ngx_rtmp_codec_ctx_t           *codec_ctx;\n    u_char                         *p;\n    uint8_t                         fmt, ftype, nal_type, src_nal_type;\n    uint32_t                        len, rlen;\n    ngx_buf_t                       out;\n    uint32_t                        cts;\n    ngx_rtmp_mpegts_frame_t         frame;\n    ngx_uint_t                      nal_bytes;\n    ngx_int_t                       aud_sent, sps_pps_sent;\n    static u_char                   buffer[NGX_LIVE_RECORD_BUFSIZE];\n    ngx_live_record_app_conf_t     *lracf;\n    ngx_msec_t                      curr_time;\n    time_t                          last_time;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_record_module);\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    p = in->buf->pos;\n    if (ngx_live_record_copy(s, &fmt, &p, 1, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    /*\n     * frame type:\n     *  1: keyframe (for AVC, a seekable frame)\n     *  2: inter frame (for AVC, a non- seekable frame)\n     *  3: disposable inter frame (H.263 only)\n     *  4: generated keyframe (reserved for server use only)\n     *  5: video info/command frame\n     */\n    ftype = (fmt & 0xf0) >> 4;\n\n    if (ctx->open == 2) { // wait for key frame\n        if (ftype == 1) {\n            ctx->open = 1;\n        } else {\n            return NGX_OK;\n        }\n    }\n\n    lracf = ngx_rtmp_get_module_app_conf(s, ngx_live_record_module);\n\n    if (ctx->last_time == 0) {\n        ctx->publish_epoch = ngx_current_msec;\n        ctx->last_time = ngx_time() - ngx_time() % (lracf->interval / 1000);\n        ctx->basetime = ctx->publish_epoch - h->timestamp;\n\n        ctx->begintime = ngx_current_msec;\n        ctx->starttime = ngx_current_msec;\n        ctx->endtime = ngx_current_msec;\n\n        // open new index and file\n        if (ngx_live_record_open_index(s) == NGX_ERROR) {\n            ctx->last_time = 0;\n\n            if (ctx->index.fd != -1) {\n                ngx_close_file(ctx->index.fd);\n            }\n\n            if (ctx->file.fd != -1) {\n                ngx_close_file(ctx->file.fd);\n            }\n\n            return NGX_OK;\n        }\n    }\n\n    if (ngx_live_record_copy(s, NULL, &p, 1, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    if (ngx_live_record_copy(s, &cts, &p, 3, &in) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    /* CompositionTime */\n    cts = ((cts & 0x00FF0000) >> 16) | ((cts & 0x000000FF) << 16) |\n          (cts & 0x0000FF00);\n\n    /* Data */\n    ngx_memzero(&out, sizeof(out));\n\n    out.start = buffer;\n    out.end = buffer + sizeof(buffer);\n    out.pos = out.start;\n    out.last = out.pos;\n\n    nal_bytes = codec_ctx->avc_nal_bytes;\n    aud_sent = 0;\n    sps_pps_sent = 0;\n\n    while (in) {\n        if (ngx_live_record_copy(s, &rlen, &p, nal_bytes, &in) != NGX_OK) {\n            return NGX_OK;\n        }\n\n        len = 0;\n        ngx_rtmp_rmemcpy(&len, &rlen, nal_bytes);\n\n        if (len == 0) {\n            continue;\n        }\n\n        if (ngx_live_record_copy(s, &src_nal_type, &p, 1, &in) != NGX_OK) {\n            return NGX_OK;\n        }\n\n        nal_type = src_nal_type & 0x1f;\n\n        ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"record: h264 NAL type=%ui, len=%uD\",\n                       (ngx_uint_t) nal_type, len);\n\n        if (nal_type >= 7 && nal_type <= 9) {\n            if (ngx_live_record_copy(s, NULL, &p, len - 1, &in) != NGX_OK) {\n                return NGX_ERROR;\n            }\n            continue;\n        }\n\n        if (!aud_sent) {\n            switch (nal_type) {\n                case 1:\n                case 5:\n                case 6:\n                    if (ngx_live_record_append_aud(s, &out) != NGX_OK) {\n                        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                                      \"record: error appending AUD NAL\");\n                    }\n                    aud_sent = 1;\n                    break;\n\n                case 9:\n                    aud_sent = 1;\n                    break;\n            }\n        }\n\n        switch (nal_type) {\n            case 1:\n                sps_pps_sent = 0;\n                break;\n            case 5:\n                if (sps_pps_sent) {\n                    break;\n                }\n                if (ngx_live_record_append_sps_pps(s, &out) != NGX_OK) {\n                    ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                                  \"record: error appenging SPS/PPS NALs\");\n                }\n                sps_pps_sent = 1;\n                break;\n        }\n\n        /* AnnexB prefix */\n\n        if (out.end - out.last < 5) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                          \"record: not enough buffer for AnnexB prefix\");\n            return NGX_OK;\n        }\n\n        /* first AnnexB prefix is long (4 bytes) */\n\n        if (out.last == out.pos) {\n            *out.last++ = 0;\n        }\n\n        *out.last++ = 0;\n        *out.last++ = 0;\n        *out.last++ = 1;\n        *out.last++ = src_nal_type;\n\n        /* NAL body */\n\n        if (out.end - out.last < (ngx_int_t) len) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                          \"record: not enough buffer for NAL\");\n            return NGX_OK;\n        }\n\n        if (ngx_live_record_copy(s, out.last, &p, len - 1, &in) != NGX_OK) {\n            return NGX_ERROR;\n        }\n\n        out.last += (len - 1);\n    }\n\n    // reopen index and ts file\n    curr_time = ctx->basetime + h->timestamp;\n    last_time = curr_time / 1000 - (curr_time / 1000)\n                                 % (lracf->interval / 1000);\n    if (ftype == 1) { // key frame\n        if (curr_time > ctx->starttime + lracf->min_fraglen) {\n            if (last_time > ctx->last_time) {\n                ngx_live_record_reopen_index(s, ctx, curr_time, last_time);\n            } else {\n                ngx_live_record_write_index(s, ctx, curr_time);\n            }\n        }\n    } else if (curr_time > ctx->starttime + lracf->max_fraglen) { // force slice\n        if (last_time > ctx->last_time) {\n            ngx_log_error(NGX_LOG_INFO, s->log, 0, \"record: force slice, \"\n                    \"curr_time:%M, starttime:%M, max_fraglen:%M\",\n                    curr_time, ctx->starttime, lracf->max_fraglen);\n\n            ngx_live_record_reopen_index(s, ctx, curr_time, last_time);\n        } else {\n            ngx_live_record_write_index(s, ctx, curr_time);\n        }\n    }\n\n    /* write frame */\n    ngx_memzero(&frame, sizeof(frame));\n\n    frame.cc = ctx->video_cc;\n    frame.dts = (uint64_t) h->timestamp * 90;\n    frame.pts = (h->timestamp + cts) * 90;\n    frame.pid = 0x100;\n    frame.sid = 0xe0;\n    frame.key = (ftype == 1);\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"record: video pts=%uL, dts=%uL\", frame.pts, frame.dts);\n\n    if (ngx_rtmp_mpegts_write_frame(&ctx->ts, &frame, &out) != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0, \"record: video frame failed\");\n    }\n\n    ctx->endtime = curr_time;\n    ctx->video_cc = frame.cc;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_record_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    ngx_live_record_ctx_t          *ctx;\n    ngx_rtmp_codec_ctx_t           *codec_ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_record_module);\n    if (ctx == NULL || !ctx->open) {\n        return NGX_OK;\n    }\n\n    if (ngx_rtmp_is_codec_header(in)) {\n        return NGX_OK;\n    }\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    if (h->type == NGX_RTMP_MSG_AUDIO) {\n        switch (codec_ctx->audio_codec_id) {\n            case NGX_RTMP_AUDIO_AAC:\n                return ngx_live_record_aac(s, h, in);\n        }\n    } else {\n        switch (codec_ctx->video_codec_id) {\n            case NGX_RTMP_VIDEO_H264:\n                return ngx_live_record_avc(s, h, in);\n        }\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_record_start_handle(ngx_rtmp_session_t *s)\n{\n    ngx_live_record_ctx_t          *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_record_module);\n\n    return next_publish(s, &ctx->pubv);\n}\n\n\nstatic ngx_int_t\nngx_live_record_update_handle(ngx_rtmp_session_t *s)\n{\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_record_done_handle(ngx_rtmp_session_t *s)\n{\n    return NGX_OK;\n}\n\n\nconst char *\nngx_live_record_open(ngx_rtmp_session_t *s)\n{\n    ngx_live_record_ctx_t          *ctx;\n\n    if (s->interprocess) {\n        return \"interprocess\";\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_record_module);\n\n    if (ctx->open) {\n        return NGX_CONF_OK;\n    }\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0, \"record: open %V:\", &s->stream);\n\n    ctx->open = 2;\n\n    return NGX_CONF_OK;\n}\n\n\nconst char *\nngx_live_record_close(ngx_rtmp_session_t *s)\n{\n    ngx_live_record_ctx_t          *ctx;\n\n    if (s->interprocess) {\n        return \"interprocess\";\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_record_module);\n\n    if (ctx->open == 0) {\n        return NGX_CONF_OK;\n    }\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0, \"record: close %V:\", &s->stream);\n\n    ngx_live_record_done(s);\n\n    ngx_live_record_close_index(s, ctx);\n\n    ctx->open = 0;\n    ctx->last_time = 0;\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_record_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v)\n{\n    ngx_live_record_app_conf_t     *lracf;\n    ngx_live_record_ctx_t          *ctx;\n\n    if (s->interprocess) {\n        return next_publish(s, v);\n    }\n\n    ctx = ngx_pcalloc(s->pool, sizeof(ngx_live_record_ctx_t));\n    if (ctx == NULL) {\n        return NGX_ERROR;\n    }\n    ngx_rtmp_set_ctx(s, ctx, ngx_live_record_module);\n\n    lracf = ngx_rtmp_get_module_app_conf(s, ngx_live_record_module);\n\n    if (lracf->record) {\n        ctx->open = 1;\n    }\n    ctx->pubv = *v;\n    ctx->index.fd = -1;\n    ctx->file.fd = -1;\n\n    return ngx_live_record_start(s);\n}\n\n\nstatic ngx_int_t\nngx_live_record_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)\n{\n    ngx_live_record_ctx_t          *ctx;\n\n    if (s->interprocess) {\n        goto next;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_record_module);\n    if (ctx == NULL) {\n        goto next;\n    }\n\n    if (ctx->open == 0) {\n        goto next;\n    }\n\n    ngx_live_record_done(s);\n\n    ngx_live_record_close_index(s, ctx);\n    ctx->open = 0;\n\nnext:\n    return next_close_stream(s, v);\n}\n\n\nstatic ngx_int_t\nngx_live_record_postconfiguration(ngx_conf_t *cf)\n{\n    ngx_rtmp_core_main_conf_t          *cmcf;\n    ngx_rtmp_handler_pt                *h;\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]);\n    *h = ngx_live_record_av;\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]);\n    *h = ngx_live_record_av;\n\n    next_record_start = ngx_live_record_start;\n    ngx_live_record_start = ngx_live_record_start_handle;\n\n    next_record_update = ngx_live_record_update;\n    ngx_live_record_update = ngx_live_record_update_handle;\n\n    next_record_done = ngx_live_record_done;\n    ngx_live_record_done = ngx_live_record_done_handle;\n\n    next_publish = ngx_rtmp_publish;\n    ngx_rtmp_publish = ngx_live_record_publish;\n\n    next_close_stream = ngx_rtmp_close_stream;\n    ngx_rtmp_close_stream = ngx_live_record_close_stream;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_live_record.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_LIVE_RECORD_H_INCLUDED_\n#define _NGX_LIVE_RECORD_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n#include \"hls/ngx_rtmp_mpegts.h\"\n\n\ntypedef struct {\n    unsigned                    open; /* 0 close, 1 open, 2 wait for key */\n\n    time_t                      last_time;\n\n    ngx_file_t                  index;\n\n    ngx_rtmp_mpegts_file_t      ts;\n    ngx_file_t                  file;\n\n    ngx_rtmp_publish_t          pubv;\n\n    ngx_uint_t                  audio_cc;\n    ngx_uint_t                  video_cc;\n\n    ngx_msec_t                  begintime;\n    ngx_msec_t                  starttime;\n    ngx_msec_t                  endtime;\n    off_t                       startsize;\n    off_t                       endsize;\n\n    ngx_msec_t                  publish_epoch;\n    ngx_msec_t                  basetime;\n} ngx_live_record_ctx_t;\n\n\ntypedef ngx_int_t (*ngx_live_record_start_pt)(ngx_rtmp_session_t *s);\ntypedef ngx_int_t (*ngx_live_record_update_pt)(ngx_rtmp_session_t *s);\ntypedef ngx_int_t (*ngx_live_record_done_pt)(ngx_rtmp_session_t *s);\n\n\nextern ngx_live_record_start_pt     ngx_live_record_start;\nextern ngx_live_record_update_pt    ngx_live_record_update;\nextern ngx_live_record_done_pt      ngx_live_record_done;\n\n\nextern ngx_module_t                 ngx_live_record_module;\n\n\nconst char *ngx_live_record_open(ngx_rtmp_session_t *s);\nconst char *ngx_live_record_close(ngx_rtmp_session_t *s);\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_live_relay.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include \"ngx_live_relay.h\"\n#include \"ngx_rtmp_cmd_module.h\"\n#include \"ngx_toolkit_misc.h\"\n\n\nstatic ngx_rtmp_publish_pt              next_publish;\nstatic ngx_rtmp_play_pt                 next_play;\nstatic ngx_rtmp_close_stream_pt         next_close_stream;\n\n\nstatic ngx_int_t ngx_live_relay_postconfiguration(ngx_conf_t *cf);\nstatic void *ngx_live_relay_create_app_conf(ngx_conf_t *cf);\nstatic char *ngx_live_relay_merge_app_conf(ngx_conf_t *cf, void *parent,\n       void *child);\n\n\nngx_live_push_pt                        ngx_live_push;\nngx_live_pull_pt                        ngx_live_pull;\nngx_live_push_close_pt                  ngx_live_push_close;\nngx_live_pull_close_pt                  ngx_live_pull_close;\n\n\ntypedef ngx_int_t (* relay_create_pt)(ngx_rtmp_session_t *rs,\n                                      ngx_live_relay_t *relay,\n                                      ngx_live_relay_url_t *url);\n\n\nstatic relay_create_pt create_relay[] = {\n    ngx_live_relay_create_httpflv,\n    ngx_live_relay_create_rtmp\n};\n\n\nstatic const char *relay_protocol[] = {\n    \"httpflv\",\n    \"rtmp\"\n};\n\n\nstatic const char *relay_type[] = {\n    \"push\",\n    \"pull\"\n};\n\n\nstatic ngx_command_t  ngx_live_relay_commands[] = {\n\n    { ngx_string(\"failed_reconnect\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_live_relay_app_conf_t, failed_reconnect),\n      NULL },\n\n    { ngx_string(\"relay_reconnect\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_live_relay_app_conf_t, relay_reconnect),\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_live_relay_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_live_relay_postconfiguration,       /* postconfiguration */\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    ngx_live_relay_create_app_conf,         /* create app configuration */\n    ngx_live_relay_merge_app_conf           /* merge app configuration */\n};\n\n\nngx_module_t  ngx_live_relay_module = {\n    NGX_MODULE_V1,\n    &ngx_live_relay_module_ctx,             /* module context */\n    ngx_live_relay_commands,                /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_live_relay_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_live_relay_app_conf_t  *racf;\n\n    racf = ngx_pcalloc(cf->pool, sizeof(ngx_live_relay_app_conf_t));\n    if (racf == NULL) {\n        return NULL;\n    }\n\n    racf->failed_reconnect = NGX_CONF_UNSET_MSEC;\n    racf->relay_reconnect = NGX_CONF_UNSET_MSEC;\n\n    return racf;\n}\n\n\nstatic char *\nngx_live_relay_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_live_relay_app_conf_t  *prev = parent;\n    ngx_live_relay_app_conf_t  *conf = child;\n\n    ngx_conf_merge_msec_value(conf->failed_reconnect, prev->failed_reconnect,\n            50);\n    ngx_conf_merge_msec_value(conf->relay_reconnect, prev->relay_reconnect,\n            3000);\n\n    return NGX_CONF_OK;\n}\n\n\nngx_int_t\nngx_live_relay_create(ngx_rtmp_session_t *rs, ngx_live_relay_t *relay)\n{\n    ngx_live_relay_ctx_t       *ctx;\n    ngx_live_relay_url_t       *url;\n    relay_create_pt             create;\n\n    ctx = ngx_rtmp_get_module_ctx(rs, ngx_live_relay_module);\n    if (ctx->idx >= relay->urls.nelts) {\n        ctx->idx = 0;\n    }\n    ctx->failed_delay = 0;\n\n    url = relay->urls.elts;\n    url += ctx->idx;\n\n    if (url->relay_type >= NGX_LIVE_RELAY_MAXTYPE) {\n        ngx_log_error(NGX_LOG_ERR, rs->log, 0, \"unsupported relay type %ui\",\n                url->relay_type);\n        return NGX_ERROR;\n    }\n\n    create = create_relay[url->relay_type];\n\n    ngx_log_error(NGX_LOG_INFO, rs->log, 0,\n            \"create %s relay %s to %V:%d, domain='%V' app='%V' name='%V' \"\n            \"pargs='%V' referer='%V' user_agent='%V'\",\n            relay_protocol[url->relay_type], relay_type[rs->publishing],\n            &url->url.host, url->port, &relay->domain, &relay->app,\n            &relay->name, &relay->pargs, &relay->referer, &relay->user_agent);\n\n    ++ctx->idx;\n\n    return create(rs, relay, url);\n}\n\n\nngx_int_t\nngx_live_relay_play_local(ngx_rtmp_session_t *rs)\n{\n    ngx_rtmp_play_t             v;\n\n    ngx_memzero(&v, sizeof(ngx_rtmp_play_t));\n    v.silent = 1;\n    *(ngx_cpymem(v.name, rs->name.data, ngx_min(sizeof(v.name) - 1,\n                 rs->name.len))) = 0;\n    if (rs->pargs.len) {\n        *(ngx_cpymem(v.args, rs->pargs.data, ngx_min(sizeof(v.args) - 1,\n                     rs->pargs.len))) = 0;\n    }\n\n    return ngx_rtmp_play_filter(rs, &v);\n}\n\n\nngx_int_t\nngx_live_relay_publish_local(ngx_rtmp_session_t *rs)\n{\n    ngx_rtmp_publish_t          v;\n\n    ngx_memzero(&v, sizeof(ngx_rtmp_publish_t));\n    v.silent = 1;\n    *(ngx_cpymem(v.name, rs->name.data, ngx_min(sizeof(v.name) - 1,\n                 rs->name.len))) = 0;\n    if (rs->pargs.len) {\n        *(ngx_cpymem(v.args, rs->pargs.data, ngx_min(sizeof(v.args) - 1,\n                     rs->pargs.len))) = 0;\n    }\n\n    return ngx_rtmp_publish_filter(rs, &v);\n}\n\n\nstatic ngx_int_t\nngx_live_relay_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v)\n{\n    ngx_live_relay_ctx_t       *ctx;\n\n    // second publish will not trigger push\n    if (s->live_stream->publish_ctx->next != NULL) {\n        goto next;\n    }\n\n    if (ngx_live_push(s) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (ctx == NULL) {\n        goto next;\n    }\n\n    if (ctx->reconnect.timer_set) {\n        ngx_del_timer(&ctx->reconnect);\n    }\n\n    if (ctx->reconnect.posted) {\n        ngx_delete_posted_event(&ctx->reconnect);\n    }\n\n    ctx->successd = 1;\n    ctx->failed_reconnect = 0;\n\n    ctx->idx = 0;\n\nnext:\n    return next_publish(s, v);\n}\n\n\nstatic ngx_int_t\nngx_live_relay_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v)\n{\n    ngx_live_relay_ctx_t       *ctx;\n\n    if (ngx_live_pull(s) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (ctx == NULL) {\n        goto next;\n    }\n\n    if (ctx->reconnect.timer_set) {\n        ngx_del_timer(&ctx->reconnect);\n    }\n\n    if (ctx->reconnect.posted) {\n        ngx_delete_posted_event(&ctx->reconnect);\n    }\n\n    ctx->successd = 1;\n    ctx->failed_reconnect = 0;\n\n    ctx->idx = 0;\n\nnext:\n\n    return next_play(s, v);\n}\n\n\nstatic ngx_int_t\nngx_live_relay_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)\n{\n    ngx_rtmp_core_ctx_t        *ctx;\n    ngx_live_relay_ctx_t       *rctx;\n\n    if (s->live_stream == NULL) {\n        goto next;\n    }\n\n    if (s->publishing) {\n        /*\n         * normal publisher close or relay puller close\n         * need to trigger ngx_live_pull_close\n         */\n        ngx_live_pull_close(s);\n\n        // all publishers close, close push (play + relay)\n        if (s->live_stream->publish_ctx == NULL) {\n            for (ctx = s->live_stream->play_ctx; ctx; ctx = ctx->next) {\n                if (ctx->session->relay) {\n                    ctx->session->finalize_reason = NGX_LIVE_RELAY_CLOSE;\n                    ngx_rtmp_finalize_session(ctx->session);\n                }\n            }\n        }\n    } else {\n        rctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n        if (rctx) {\n            // push close will trigger relay push reconnect in relay modules\n            ngx_live_push_close(s);\n        }\n\n        // all players close, close pull (publish + relay)\n        if (s->live_stream->play_ctx == NULL) {\n            for (ctx = s->live_stream->publish_ctx; ctx; ctx = ctx->next) {\n                if (ctx->session->relay) {\n                    ctx->session->finalize_reason = NGX_LIVE_RELAY_CLOSE;\n                    ngx_rtmp_finalize_session(ctx->session);\n                }\n            }\n        }\n    }\n\nnext:\n    return next_close_stream(s, v);\n}\n\n\nstatic ngx_int_t\nngx_live_relay_push(ngx_rtmp_session_t *s)\n{\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_relay_pull(ngx_rtmp_session_t *s)\n{\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_relay_push_close(ngx_rtmp_session_t *s)\n{\n    ngx_live_relay_ctx_t       *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n\n    if (ctx && ctx->reconnect.timer_set) {\n        ngx_del_timer(&ctx->reconnect);\n    }\n\n    if (ctx && ctx->reconnect.posted) {\n        ngx_delete_posted_event(&ctx->reconnect);\n    }\n\n    return NGX_OK;\n}\n\n\n/*\n * pull reconnect need to trigger ngx_live_pull chain\n */\nstatic ngx_int_t\nngx_live_relay_pull_close(ngx_rtmp_session_t *s)\n{\n    ngx_live_relay_ctx_t       *ctx;\n    ngx_flag_t                  has_player;\n    ngx_rtmp_core_ctx_t        *cctx;;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n\n    has_player = 0;\n\n    if (s->static_pull == 0) {\n        for (cctx = s->live_stream->play_ctx; cctx; cctx = cctx->next) {\n            if (cctx->session->relay == 0) { // has pure player, not relay push\n                has_player = 1;\n                break;\n            }\n        }\n    }\n\n    if (has_player || s->static_pull) { // has player in stream\n        // ctx is NULL, s is a normal publisher\n        // ctx is not NULL, s is a puller, if giveup flag set\n        //      no need to create pull reconnect\n        if (ctx == NULL || !ctx->giveup) {\n            ngx_live_pull(s);\n        }\n    }\n\n    if (ctx && ctx->reconnect.timer_set) {\n        ngx_del_timer(&ctx->reconnect);\n    }\n\n    if (ctx && ctx->reconnect.posted) {\n        ngx_delete_posted_event(&ctx->reconnect);\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_relay_postconfiguration(ngx_conf_t *cf)\n{\n    next_publish = ngx_rtmp_publish;\n    ngx_rtmp_publish = ngx_live_relay_publish;\n\n    next_play = ngx_rtmp_play;\n    ngx_rtmp_play = ngx_live_relay_play;\n\n    next_close_stream = ngx_rtmp_close_stream;\n    ngx_rtmp_close_stream = ngx_live_relay_close_stream;\n\n    ngx_live_pull = ngx_live_relay_pull;\n    ngx_live_push = ngx_live_relay_push;\n    ngx_live_pull_close = ngx_live_relay_pull_close;\n    ngx_live_push_close = ngx_live_relay_push_close;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_live_relay.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_LIVE_RELAY_H_INCLUDE_\n#define _NGX_LIVE_RELAY_H_INCLUDE_\n\n\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n\n\n#define NGX_LIVE_RELAY_HTTPFLV      0\n#define NGX_LIVE_RELAY_RTMP         1\n#define NGX_LIVE_RELAY_MAXTYPE      2\n\n\ntypedef struct {\n    // reconnect\n    ngx_event_t                 reconnect;\n    ngx_flag_t                  successd;           // connect successd\n    /*\n     * connect failed for first time, reconnect immediately\n     * then reconnect after failed_reconect\n     * then reconnect after 2 * failed_reconect\n     * then reconnect after 2 * 2 * failed_reconect\n     * ...\n     * when failed_reconnect is bigger than relay_reconnect\n     * then use relay_reconnect as failed_reconect\n     *\n     * connect failed not include connect timeout\n     */\n    ngx_msec_t                  failed_reconnect;   // reconnect timeout\n    ngx_flag_t                  failed_delay;\n    ngx_flag_t                  giveup;             // no need to reconnect\n\n    // base para\n    ngx_str_t                   domain;\n    ngx_str_t                   app;\n    ngx_str_t                   args;               // rtmp app args\n    ngx_str_t                   name;\n    ngx_str_t                   pargs;\n\n    // other para\n    ngx_str_t                   referer;            // rtmp page_url\n    ngx_str_t                   user_agent;         // rtmp flashver\n    ngx_str_t                   swf_url;            // rtmp swf_url\n    uint32_t                    acodecs;\n    uint32_t                    vcodecs;\n\n    void                       *tag;\n    ngx_uint_t                  idx;\n} ngx_live_relay_ctx_t;\n\n\ntypedef struct {\n    ngx_request_url_t           url;\n    in_port_t                   port;\n    ngx_uint_t                  relay_type;\n} ngx_live_relay_url_t;\n\n\ntypedef struct {\n    ngx_msec_t                  failed_reconnect;\n    ngx_msec_t                  relay_reconnect;\n} ngx_live_relay_app_conf_t;\n\n\nextern ngx_module_t  ngx_live_relay_module;\n\n\nngx_int_t ngx_live_relay_create_httpflv(ngx_rtmp_session_t *rs,\n        ngx_live_relay_t *relay, ngx_live_relay_url_t *url);\n\nngx_int_t ngx_live_relay_create_rtmp(ngx_rtmp_session_t *rs,\n        ngx_live_relay_t *relay, ngx_live_relay_url_t *url);\n\nngx_int_t ngx_live_relay_create(ngx_rtmp_session_t *rs,\n        ngx_live_relay_t *relay);\n\nngx_int_t ngx_live_relay_play_local(ngx_rtmp_session_t *rs);\n\nngx_int_t ngx_live_relay_publish_local(ngx_rtmp_session_t *rs);\n\n\ntypedef ngx_int_t (*ngx_live_pull_pt)(ngx_rtmp_session_t *s);\ntypedef ngx_int_t (*ngx_live_push_pt)(ngx_rtmp_session_t *s);\ntypedef ngx_int_t (*ngx_live_pull_close_pt)(ngx_rtmp_session_t *s);\ntypedef ngx_int_t (*ngx_live_push_close_pt)(ngx_rtmp_session_t *s);\n\n\nextern ngx_live_push_pt         ngx_live_push;\nextern ngx_live_pull_pt         ngx_live_pull;\nextern ngx_live_push_close_pt   ngx_live_push_close;\nextern ngx_live_pull_close_pt   ngx_live_pull_close;\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_live_relay_httpflv.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include \"ngx_live_relay.h\"\n#include \"ngx_http_client.h\"\n#include \"ngx_toolkit_misc.h\"\n#include \"ngx_dynamic_resolver.h\"\n#include \"ngx_rbuf.h\"\n\n\ntypedef struct {\n    ngx_uint_t                  status;\n    char                       *code;\n    char                       *level;\n    char                       *desc;\n} ngx_http_status_code_t;\n\n\nstatic ngx_http_status_code_t ngx_http_relay_status_code[] = {\n    { 400, \"NetStream.Play.BadName\", \"error\", \"Bad Request\" },\n    { 403, \"NetStream.Play.Forbidden\", \"error\", \"Forbidden\" },\n    { 404, \"NetStream.Play.StreamNotFound\", \"error\", \"No such stream\" },\n    { 503, \"NetStream.Play.ServiceUnavailable\", \"error\", \"Service Unavailable\"},\n    { 0, \"NetStream.Play.StreamError\", \"error\", \"Stream Error\" }\n};\n\n\nstatic ngx_int_t\nngx_live_relay_httpflv_parse(ngx_rtmp_session_t *s, ngx_buf_t *b)\n{\n    u_char                      ch, *p, *pc;\n    ngx_rtmp_stream_t          *st;\n    ngx_rtmp_header_t          *h;\n    ngx_chain_t               **ll;\n    size_t                      len;\n    ngx_rtmp_core_srv_conf_t   *cscf;\n    ngx_int_t                   rc = NGX_AGAIN;\n    enum {\n        flv_header_F = 0,\n        flv_header_FL,\n        flv_header_FLV,\n        flv_header_Version,\n        flv_header_Flags,\n        flv_header_DataOffset0,\n        flv_header_DataOffset1,\n        flv_header_DataOffset2,\n        flv_header_DataOffset3,\n        flv_tagsize0,\n        flv_tagsize1,\n        flv_tagsize2,\n        flv_tagsize3,\n        flv_tagtype,\n        flv_datasize0,\n        flv_datasize1,\n        flv_datasize2,\n        flv_timestamp0,\n        flv_timestamp1,\n        flv_timestamp2,\n        flv_timestamp_extended,\n        flv_streamid0,\n        flv_streamid1,\n        flv_streamid2,\n        flv_data\n    } state;\n\n    state = s->flv_state;\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n\n    for (p = b->pos; p < b->last; ++p) {\n        ch = *p;\n\n        switch (state) {\n\n        case flv_header_F:\n            switch (ch) {\n            case 'F':\n                state = flv_header_FL;\n                break;\n            default:\n                rc = NGX_ERROR;\n                goto done;\n            }\n            break;\n\n        case flv_header_FL:\n            switch (ch) {\n            case 'L':\n                state = flv_header_FLV;\n                break;\n            default:\n                rc = NGX_ERROR;\n                goto done;\n            }\n            break;\n\n        case flv_header_FLV:\n            switch (ch) {\n            case 'V':\n                state = flv_header_Version;\n                break;\n            default:\n                rc = NGX_ERROR;\n                goto done;\n            }\n            break;\n\n        case flv_header_Version:\n            s->flv_version = ch;\n            if (s->flv_version != 1) {\n                rc = NGX_ERROR;\n                goto done;\n            }\n            state = flv_header_Flags;\n            break;\n\n        case flv_header_Flags:\n            s->flv_flags = ch;\n            state = flv_header_DataOffset0;\n            break;\n\n        case flv_header_DataOffset0:\n            pc = (u_char *) &s->flv_data_offset;\n            pc[3] = ch;\n            state = flv_header_DataOffset1;\n            break;\n\n        case flv_header_DataOffset1:\n            pc = (u_char *) &s->flv_data_offset;\n            pc[2] = ch;\n            state = flv_header_DataOffset2;\n            break;\n\n        case flv_header_DataOffset2:\n            pc = (u_char *) &s->flv_data_offset;\n            pc[1] = ch;\n            state = flv_header_DataOffset3;\n            break;\n\n        case flv_header_DataOffset3:\n            pc = (u_char *) &s->flv_data_offset;\n            pc[0] = ch;\n            state = flv_tagsize0;\n            break;\n\n        case flv_tagsize0:\n            s->flv_tagsize = 0;\n            pc = (u_char *) &s->flv_tagsize;\n            pc[3] = ch;\n            state = flv_tagsize1;\n            break;\n\n        case flv_tagsize1:\n            pc = (u_char *) &s->flv_tagsize;\n            pc[2] = ch;\n            state = flv_tagsize2;\n            break;\n\n        case flv_tagsize2:\n            pc = (u_char *) &s->flv_tagsize;\n            pc[1] = ch;\n            state = flv_tagsize3;\n            break;\n\n        case flv_tagsize3:\n            pc = (u_char *) &s->flv_tagsize;\n            pc[0] = ch;\n\n            st = &s->in_streams[0];\n            h = &st->hdr;\n\n            if (h->mlen == 0 && s->flv_first_pts == 0) {\n                s->flv_first_pts = 1;\n                if (s->flv_tagsize != 0) {\n                    rc = NGX_ERROR;\n                    goto done;\n                }\n            } else {\n                if (h->mlen + 11 != s->flv_tagsize) {\n                    rc = NGX_ERROR;\n                    goto done;\n                }\n            }\n            state = flv_tagtype;\n\n            break;\n\n        case flv_tagtype:\n            if (ch != NGX_RTMP_MSG_AMF_META && ch != NGX_RTMP_MSG_AUDIO\n                    && ch != NGX_RTMP_MSG_VIDEO)\n            {\n                rc = NGX_ERROR;\n                goto done;\n            }\n\n            st = &s->in_streams[0];\n            h = &st->hdr;\n            h->type = ch;\n            state = flv_datasize0;\n\n            break;\n\n        case flv_datasize0:\n            st = &s->in_streams[0];\n            h = &st->hdr;\n            h->mlen = 0;\n            pc = (u_char *) &h->mlen;\n\n            pc[2] = ch;\n            state = flv_datasize1;\n\n            break;\n\n        case flv_datasize1:\n            st = &s->in_streams[0];\n            h = &st->hdr;\n            pc = (u_char *) &h->mlen;\n\n            pc[1] = ch;\n            state = flv_datasize2;\n\n            break;\n\n        case flv_datasize2:\n            st = &s->in_streams[0];\n            h = &st->hdr;\n            pc = (u_char *) &h->mlen;\n\n            pc[0] = ch;\n            state = flv_timestamp0;\n            st->len = h->mlen;\n\n            break;\n\n        case flv_timestamp0:\n            st = &s->in_streams[0];\n            h = &st->hdr;\n            pc = (u_char *) &h->timestamp;\n\n            pc[2] = ch;\n            state = flv_timestamp1;\n\n            break;\n\n        case flv_timestamp1:\n            st = &s->in_streams[0];\n            h = &st->hdr;\n            pc = (u_char *) &h->timestamp;\n\n            pc[1] = ch;\n            state = flv_timestamp2;\n\n            break;\n\n        case flv_timestamp2:\n            st = &s->in_streams[0];\n            h = &st->hdr;\n            pc = (u_char *) &h->timestamp;\n\n            pc[0] = ch;\n            state = flv_timestamp_extended;\n\n            break;\n\n        case flv_timestamp_extended:\n            st = &s->in_streams[0];\n            h = &st->hdr;\n            pc = (u_char *) &h->timestamp;\n\n            pc[3] = ch;\n            state = flv_streamid0;\n\n            break;\n\n        case flv_streamid0:\n            st = &s->in_streams[0];\n            h = &st->hdr;\n            h->msid = 0;\n            pc = (u_char *) &h->msid;\n\n            pc[2] = ch;\n            state = flv_streamid1;\n\n            break;\n\n        case flv_streamid1:\n            st = &s->in_streams[0];\n            h = &st->hdr;\n            pc = (u_char *) &h->msid;\n\n            pc[1] = ch;\n            state = flv_streamid2;\n\n            break;\n\n        case flv_streamid2:\n            st = &s->in_streams[0];\n            h = &st->hdr;\n            pc = (u_char *) &h->msid;\n\n            pc[0] = ch;\n            state = flv_data;\n\n            break;\n\n        case flv_data:\n            st = &s->in_streams[0];\n\n            for (ll = &st->in; (*ll) && (*ll)->buf->last == (*ll)->buf->end;\n                    ll = &(*ll)->next);\n\n            for (;;) {\n                if (*ll == NULL) {\n                    *ll = ngx_get_chainbuf(cscf->chunk_size, 1);\n                }\n\n                len = ngx_min(st->len, b->last - p);\n                if ((*ll)->buf->end - (*ll)->buf->last >= (long) len) {\n                    (*ll)->buf->last = ngx_cpymem((*ll)->buf->last, p, len);\n                    p += len;\n                    st->len -= len;\n\n                    break;\n                }\n\n                len = (*ll)->buf->end - (*ll)->buf->last;\n                (*ll)->buf->last = ngx_cpymem((*ll)->buf->last, p, len);\n                p += len;\n                st->len -= len;\n\n                ll = &(*ll)->next;\n            }\n\n            if (st->len != 0) {\n                rc = NGX_AGAIN;\n                goto done;\n            }\n\n            state = flv_tagsize0;\n            rc = NGX_OK;\n            goto done;\n        }\n    }\n\ndone:\n    b->pos = p;\n    s->flv_state = state;\n\n    return rc;\n}\n\n\nstatic void\nngx_live_relay_httpflv_recv_body(void *request, ngx_http_request_t *hcr)\n{\n    ngx_int_t                   n;\n    ngx_rtmp_session_t         *s;\n    ngx_chain_t                *cl, *l, *in;\n    ngx_rtmp_header_t          *h;\n    ngx_rtmp_stream_t          *st = NULL;\n\n    s = request;\n\n    n = ngx_http_client_read_body(hcr, &cl);\n\n    if (n == 0 || n == NGX_ERROR) {\n        s->finalize_reason = n == 0? NGX_LIVE_NORMAL_CLOSE:\n                                     NGX_LIVE_FLV_RECV_ERR;\n        ngx_log_error(NGX_LOG_INFO, s->log, ngx_errno,\n                \"http relay, recv body error\");\n        ngx_rtmp_finalize_session(s);\n        return;\n    }\n\n    l = cl;\n    for (;;) {\n        if (l && l->buf->pos == l->buf->last) {\n            l = l->next;\n        }\n\n        if (l == NULL) {\n            return;\n        }\n\n        n = ngx_live_relay_httpflv_parse(s, l->buf);\n\n        if (n == NGX_ERROR) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                    \"http relay, parse flv frame failed in state %d\",\n                    s->flv_state);\n            ngx_http_client_finalize_request(hcr, 1);\n\n            return;\n        }\n\n        if (n == NGX_AGAIN) {\n            continue;\n        }\n\n        /* NGX_OK */\n        st = &s->in_streams[0];\n        h = &st->hdr;\n        in = st->in;\n\n        if (ngx_rtmp_receive_message(s, h, in) != NGX_OK) {\n            ngx_rtmp_finalize_session(s);\n            return;\n        }\n\n        ngx_put_chainbufs(st->in);\n        st->in = NULL;\n    }\n}\n\n\nstatic void\nngx_live_relay_httpflv_cleanup(void *data)\n{\n    ngx_rtmp_session_t         *s;\n\n    s = data;\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0, \"http flv client, cleanup\");\n\n    if (s) {\n        if (s->close.posted) {\n            ngx_delete_posted_event(&s->close);\n        }\n\n        if (s->finalize_reason == 0) {\n            s->finalize_reason = NGX_LIVE_FLV_RECV_ERR;\n        }\n\n        ngx_rtmp_finalize_fake_session(s);\n    }\n}\n\n\nstatic void\nngx_live_relay_httpflv_error(ngx_rtmp_session_t *s, ngx_uint_t status)\n{\n    ngx_live_stream_t          *st;\n    ngx_rtmp_core_ctx_t        *cctx;\n    char                       *code, *level, *desc;\n    size_t                      i;\n\n    for (i = 0; ngx_http_relay_status_code[i].status; ++i) {\n\n        if (status != ngx_http_relay_status_code[i].status) {\n            continue;\n        }\n\n        break;\n    }\n\n    code = ngx_http_relay_status_code[i].code;\n    level = ngx_http_relay_status_code[i].level;\n    desc = ngx_http_relay_status_code[i].desc;\n\n    ngx_log_error(NGX_LOG_ERR, s->log, 0,\n            \"http relay transit, %d: level='%s' code='%s' description='%s'\",\n            status, level, code, desc);\n\n    st = ngx_live_create_stream(&s->serverid, &s->stream);\n    cctx = st->play_ctx;\n\n    for (; cctx; cctx = cctx->next) {\n        cctx->session->status = status;\n        ngx_rtmp_send_status(cctx->session, code, level, desc);\n\n        if (ngx_strcmp(level, \"error\") == 0 && !cctx->session->static_pull) {\n            cctx->session->finalize_reason = NGX_LIVE_RELAY_TRANSIT;\n            ngx_rtmp_finalize_session(cctx->session);\n        }\n    }\n}\n\n\nstatic void\nngx_live_relay_httpflv_recv(void *request, ngx_http_request_t *hcr)\n{\n    ngx_rtmp_session_t         *s;\n    ngx_uint_t                  status_code;\n\n    s = request;\n    status_code = ngx_http_client_status_code(hcr);\n\n    s->stage = NGX_LIVE_PLAY;\n    s->ptime = ngx_current_msec;\n\n    s->connection = hcr->connection;\n    ngx_rtmp_set_combined_log(s, hcr->connection->log->data,\n            hcr->connection->log->handler);\n    s->log->connection = s->connection->number;\n\n    if (ngx_rtmp_core_main_conf->fast_reload && (ngx_exiting || ngx_terminate)) {\n        ngx_live_relay_httpflv_error(s, NGX_LIVE_PROCESS_EXIT);\n        s->finalize_reason = NGX_LIVE_PROCESS_EXIT;\n        ngx_http_client_finalize_request(hcr, 1);\n        return;\n    }\n\n    if (status_code != NGX_HTTP_OK) {\n        ngx_live_relay_httpflv_error(s, status_code);\n        s->finalize_reason = NGX_LIVE_FLV_RECV_ERR;\n        ngx_http_client_finalize_request(hcr, 1);\n        return;\n    }\n\n    ngx_live_relay_publish_local(s);\n\n    ngx_http_client_set_read_handler(hcr, ngx_live_relay_httpflv_recv_body);\n    ngx_live_relay_httpflv_recv_body(request, hcr);\n}\n\n\nstatic ngx_int_t\nngx_live_relay_httpflv_send_request(ngx_rtmp_session_t *s,\n        ngx_live_relay_url_t *url)\n{\n    ngx_http_request_t         *hcr;\n    ngx_str_t                   request_url;\n    size_t                      len;\n    ngx_live_relay_ctx_t       *ctx;\n    ngx_http_cleanup_t         *cln;\n    u_char                     *p;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n\n    // request url\n    // http:// + url + ':' + port + '/' + app + '/' + name + ['?' + pargs]\n    len = 7 + url->url.host.len + 1 + sizeof(\"65535\") - 1\n        + 1 + ctx->app.len + 1 + ctx->name.len;\n    if (ctx->pargs.len) {\n        len = len + 1 + ctx->pargs.len;\n    }\n\n    request_url.data = ngx_pcalloc(s->pool, len);\n    if (request_url.data == NULL) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"alloc mem for request url failed\");\n        return NGX_ERROR;\n    }\n\n    if (ctx->pargs.len) {\n        p = ngx_snprintf(request_url.data, len, \"http://%V:%d/%V/%V?%V\",\n                &url->url.host, url->port, &ctx->app, &ctx->name, &ctx->pargs);\n    } else {\n        p = ngx_snprintf(request_url.data, len, \"http://%V:%d/%V/%V\",\n                &url->url.host, url->port, &ctx->app, &ctx->name);\n    }\n    request_url.len = p - request_url.data;\n\n    // request headers\n    ngx_keyval_t                headers[] = {\n        { ngx_string(\"Host\"),       ctx->domain     },\n        { ngx_string(\"Referer\"),    ctx->referer    },\n        { ngx_string(\"User-Agent\"), ctx->user_agent },\n        { ngx_null_string,          ngx_null_string }\n    };\n\n    s->stage = NGX_LIVE_CONNECT;\n    s->connect_time = ngx_current_msec;\n\n    hcr = ngx_http_client_get(s->log, &request_url, headers, s);\n    ngx_http_client_set_read_handler(hcr, ngx_live_relay_httpflv_recv);\n\n    cln = ngx_http_client_cleanup_add(hcr, 0);\n    if (cln == NULL) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0, \"http client add cleanup failed\");\n        ngx_live_relay_httpflv_error(s, NGX_HTTP_INTERNAL_SERVER_ERROR);\n        ngx_http_client_finalize_request(hcr, 1);\n        return NGX_ERROR;\n    }\n    cln->handler = ngx_live_relay_httpflv_cleanup;\n    cln->data = s;\n\n    s->request = hcr;\n    s->live_type = NGX_HTTP_FLV_LIVE;\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_live_relay_create_httpflv(ngx_rtmp_session_t *s, ngx_live_relay_t *relay,\n        ngx_live_relay_url_t *url)\n{\n    ngx_live_relay_ctx_t       *rctx;\n    // must use ngx_sockaddr_t, because sizeof(struct sockaddr)\n    //   is not long enouph, content will be covered by other var\n    ngx_sockaddr_t              nsa;\n    struct sockaddr            *sa;\n    socklen_t                   len;\n\n    rctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (rctx == NULL) {\n        return NGX_ERROR;\n    }\n\n#define NGX_LIVE_RELAY_CTX(para)                                        \\\n    if (ngx_copy_str(s->pool, &rctx->para, &relay->para) != NGX_OK) {   \\\n        goto destroy;                                                   \\\n    }\n\n    NGX_LIVE_RELAY_CTX(domain);\n    NGX_LIVE_RELAY_CTX(app);\n    NGX_LIVE_RELAY_CTX(name);\n    NGX_LIVE_RELAY_CTX(pargs);\n    NGX_LIVE_RELAY_CTX(referer);\n    NGX_LIVE_RELAY_CTX(user_agent);\n#undef NGX_LIVE_RELAY_CTX\n\n    rctx->tag = relay->tag;\n\n    // get address, host in url must be resolv sync\n    sa = (struct sockaddr *) &nsa;\n    len = ngx_dynamic_resolver_gethostbyname(&url->url.host, sa);\n    if (len == 0) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"relay httpflv: gethostbyname failed %V\", &url->url.host);\n        goto destroy;\n    }\n\n    // send http request\n    if (ngx_live_relay_httpflv_send_request(s, url) != NGX_OK) {\n        goto destroy;\n    }\n\n    return NGX_OK;\n\ndestroy:\n    ngx_rtmp_finalize_session(s);\n\n    return NGX_ERROR;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_live_relay_inner.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_live_relay.h\"\n#include \"ngx_stream_zone_module.h\"\n#include \"ngx_multiport.h\"\n\n\nstatic ngx_live_push_pt                 next_push;\nstatic ngx_live_pull_pt                 next_pull;\nstatic ngx_live_push_close_pt           next_push_close;\nstatic ngx_live_pull_close_pt           next_pull_close;\n\n\nstatic void *ngx_live_relay_inner_create_app_conf(ngx_conf_t *cf);\nstatic char *ngx_live_relay_inner_merge_app_conf(ngx_conf_t *cf,\n       void *parent, void *child);\nstatic ngx_int_t ngx_live_relay_inner_postconfiguration(ngx_conf_t *cf);\n\n\ntypedef struct {\n    ngx_flag_t                          inner_pull;\n    ngx_str_t                           inner_pull_port;\n} ngx_live_relay_inner_app_conf_t;\n\n\nstatic ngx_command_t  ngx_live_relay_inner_commands[] = {\n\n    { ngx_string(\"rtmp_auto_pull\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_FLAG,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_live_relay_inner_app_conf_t, inner_pull),\n      NULL },\n\n    { ngx_string(\"rtmp_auto_pull_port\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_str_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_live_relay_inner_app_conf_t, inner_pull_port),\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_live_relay_inner_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_live_relay_inner_postconfiguration, /* postconfiguration */\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    ngx_live_relay_inner_create_app_conf,   /* create app configuration */\n    ngx_live_relay_inner_merge_app_conf     /* merge app configuration */\n};\n\n\nngx_module_t  ngx_live_relay_inner_module = {\n    NGX_MODULE_V1,\n    &ngx_live_relay_inner_module_ctx,       /* module context */\n    ngx_live_relay_inner_commands,          /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_live_relay_inner_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_live_relay_inner_app_conf_t    *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_live_relay_inner_app_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->inner_pull = NGX_CONF_UNSET;\n\n    return conf;\n}\n\nstatic char *\nngx_live_relay_inner_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_live_relay_inner_app_conf_t    *prev = parent;\n    ngx_live_relay_inner_app_conf_t    *conf = child;\n\n    ngx_conf_merge_value(conf->inner_pull, prev->inner_pull, 1);\n    ngx_conf_merge_str_value(conf->inner_pull_port, prev->inner_pull_port,\n                             \"unix:/tmp/inner.sock\");\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_relay_inner_create_relay(ngx_rtmp_session_t *rs,\n        ngx_live_relay_t *relay, ngx_int_t pslot)\n{\n    ngx_live_relay_inner_app_conf_t    *riacf;\n    ngx_live_relay_url_t               *url;\n    ngx_str_t                           port;\n\n    riacf = ngx_rtmp_get_module_app_conf(rs, ngx_live_relay_inner_module);\n\n    ngx_memzero(relay, sizeof(ngx_live_relay_t));\n    if (ngx_array_init(&relay->urls, rs->pool, 1, sizeof(ngx_live_relay_url_t))\n            != NGX_OK)\n    {\n        ngx_log_error(NGX_LOG_ERR, rs->log, 0,\n                \"inner relay, relay init error: %V\", &riacf->inner_pull_port);\n        return NGX_ERROR;\n    }\n\n    url = ngx_array_push(&relay->urls);\n    if (url == NULL) {\n        ngx_log_error(NGX_LOG_ERR, rs->log, 0,\n                \"inner relay, get url failed: %V\", &riacf->inner_pull_port);\n        return NGX_ERROR;\n    }\n    relay->tag = &ngx_live_relay_inner_module;\n\n    ngx_memzero(url, sizeof(ngx_live_relay_url_t));\n    ngx_memzero(&port, sizeof(ngx_str_t));\n\n    if (ngx_multiport_get_port(rs->pool, &port,\n            &riacf->inner_pull_port, pslot) == NGX_ERROR)\n    {\n        ngx_log_error(NGX_LOG_ERR, rs->log, 0,\n                \"inner relay, get mulitport error: %V\",\n                &riacf->inner_pull_port);\n        return NGX_ERROR;\n    }\n\n    url->url.host = port;\n    url->url.host_with_port = port;\n    url->relay_type = NGX_LIVE_RELAY_RTMP;\n\n    return NGX_OK;\n}\n\n\nstatic void\nngx_live_relay_inner_handler(ngx_event_t *ev)\n{\n    ngx_rtmp_session_t                 *s;\n    ngx_live_relay_app_conf_t          *lracf;\n    ngx_live_relay_ctx_t               *ctx;\n    ngx_live_relay_t                    relay;\n\n    s = ev->data;\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n\n    if (!ctx->failed_delay && ev->timedout) { // connect timeout\n        ngx_log_error(NGX_LOG_ERR, s->log, NGX_ETIMEDOUT,\n                \"inner relay, relay timeout\");\n        s->finalize_reason = NGX_LIVE_RELAY_TIMEOUT;\n        ngx_rtmp_finalize_session(s);\n\n        return;\n    }\n\n    // relay pull, no player or relay push no publisher\n    if ((s->publishing && s->live_stream->play_ctx == NULL)\n            || (!s->publishing && s->live_stream->publish_ctx == NULL))\n    {\n        return;\n    }\n\n    lracf = ngx_rtmp_get_module_app_conf(s, ngx_live_relay_module);\n\n    ngx_add_timer(&ctx->reconnect, lracf->relay_reconnect);\n\n    if (ngx_live_relay_inner_create_relay(s, &relay, s->live_stream->pslot)\n            != NGX_OK)\n    {\n        return;\n    }\n\n    ngx_live_relay_create(s, &relay);\n}\n\n\n// if stream's need to continue pull or push chain, otherwise return NGX_OK\nstatic ngx_int_t\nngx_live_relay_inner_relay(ngx_rtmp_session_t *s, unsigned publishing)\n{\n    ngx_rtmp_session_t                 *rs;\n    ngx_live_relay_ctx_t               *ctx, *pctx;\n    ngx_live_relay_app_conf_t          *lracf;\n    ngx_int_t                           pslot;\n\n    pslot = ngx_stream_zone_insert_stream(&s->stream);\n    if (pslot == NGX_ERROR) { // stream zone not configured or configured error\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"inner relay, insert stream %V failed\", &s->stream);\n        return NGX_DECLINED;\n    }\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0,\n            \"inner relay, stream %V not in current process, \"\n            \"pslot:%i ngx_process_slot:%i\",\n            &s->stream, pslot, ngx_process_slot);\n\n    s->live_stream->pslot = pslot;\n    if (pslot == ngx_process_slot) { // current process become stream owner\n        return NGX_DECLINED;\n    }\n\n    rs = ngx_rtmp_create_relay_session(s, &ngx_live_relay_inner_module);\n    if (rs == NULL) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"inner relay, create relay session failed\");\n        return NGX_DECLINED;\n    }\n    rs->publishing = publishing;\n    rs->live_stream = s->live_stream;\n    ngx_live_create_ctx(rs, publishing);\n\n    ctx = ngx_rtmp_get_module_ctx(rs, ngx_live_relay_module);\n    ctx->reconnect.log = rs->log;\n    ctx->reconnect.data = rs;\n    ctx->reconnect.handler = ngx_live_relay_inner_handler;\n\n    lracf = ngx_rtmp_get_module_app_conf(rs, ngx_live_relay_module);\n\n    // play trigger pull or publish trigger push\n    if (s->publishing != rs->publishing) {\n        ngx_post_event(&ctx->reconnect, &ngx_posted_events);\n        return NGX_OK;\n    }\n\n    // normal publisher close, need to trigger pull\n    if (s->publishing && !s->relay) {\n        ngx_post_event(&ctx->reconnect, &ngx_posted_events);\n        return NGX_OK;\n    }\n\n    // reconnect\n    pctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (pctx->successd) { // prev relay susccessd\n        ngx_post_event(&ctx->reconnect, &ngx_posted_events);\n        return NGX_OK;\n    }\n\n    if (!pctx->reconnect.timer_set) { // prev relay timeout\n        ctx->failed_reconnect = ngx_min(pctx->failed_reconnect * 2,\n                lracf->relay_reconnect);\n        ngx_post_event(&ctx->reconnect, &ngx_posted_events);\n        return NGX_OK;\n    }\n\n    if (pctx->failed_reconnect) {\n        ctx->failed_reconnect = ngx_min(pctx->failed_reconnect * 2,\n                lracf->relay_reconnect);\n    } else {\n        ctx->failed_reconnect = lracf->failed_reconnect;\n    }\n\n    ctx->failed_delay = 1;\n    ngx_add_timer(&ctx->reconnect, ctx->failed_reconnect);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_relay_inner_push(ngx_rtmp_session_t *s)\n{\n    ngx_live_relay_inner_app_conf_t      *riacf;\n\n    riacf = ngx_rtmp_get_module_app_conf(s, ngx_live_relay_inner_module);\n\n    if (!riacf->inner_pull) {\n        goto next;\n    }\n\n    if (s->relay) {\n        goto next;\n    }\n\n    if (ngx_live_relay_inner_relay(s, 0) == NGX_OK) {\n        return NGX_OK;\n    }\n\nnext:\n    return next_push(s);\n}\n\n\nstatic ngx_int_t\nngx_live_relay_inner_pull(ngx_rtmp_session_t *s)\n{\n    ngx_live_relay_inner_app_conf_t      *riacf;\n\n    riacf = ngx_rtmp_get_module_app_conf(s, ngx_live_relay_inner_module);\n\n    if (!riacf->inner_pull) {\n        goto next;\n    }\n\n    if (!s->publishing && s->relay) { // relay push\n        goto next;\n    }\n\n    if (s->live_stream->pslot != -1) {\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                \"inner relay, stream %V already in current process\",\n                &s->stream);\n        if (s->live_stream->pslot == ngx_process_slot) {\n            // stream leader is in current process, continue pull or push chain\n            goto next;\n        }\n\n        return NGX_OK;\n    }\n\n    if (ngx_live_relay_inner_relay(s, 1) == NGX_OK) {\n        return NGX_OK;\n    }\n\nnext:\n    return next_pull(s);\n}\n\n\nstatic ngx_int_t\nngx_live_relay_inner_push_close(ngx_rtmp_session_t *s)\n{\n    ngx_live_relay_ctx_t       *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (ctx->tag != &ngx_live_relay_inner_module) {\n        goto next;\n    }\n\n    // relay push and has publisher in stream\n    if (!ctx->giveup && s->live_stream->publish_ctx) {\n        ngx_live_relay_inner_relay(s, 0);\n    }\n\nnext:\n    return next_push_close(s);\n}\n\n\nstatic ngx_int_t\nngx_live_relay_inner_pull_close(ngx_rtmp_session_t *s)\n{\n    ngx_live_relay_ctx_t       *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (ctx == NULL) {\n        goto next;\n    }\n\n    if (ctx->tag != &ngx_live_relay_inner_module) {\n        goto next;\n    }\n\n    // inner relay close\n    s->live_stream->pslot = -1;\n\nnext:\n    return next_pull_close(s);\n}\n\n\nstatic ngx_int_t\nngx_live_relay_inner_postconfiguration(ngx_conf_t *cf)\n{\n    /* chain handlers */\n\n    next_push = ngx_live_push;\n    ngx_live_push = ngx_live_relay_inner_push;\n\n    next_pull = ngx_live_pull;\n    ngx_live_pull = ngx_live_relay_inner_pull;\n\n    next_push_close = ngx_live_push_close;\n    ngx_live_push_close = ngx_live_relay_inner_push_close;\n\n    next_pull_close = ngx_live_pull_close;\n    ngx_live_pull_close = ngx_live_relay_inner_pull_close;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_live_relay_rtmp.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include \"ngx_live_relay.h\"\n#include \"ngx_poold.h\"\n#include \"ngx_toolkit_misc.h\"\n#include \"ngx_dynamic_resolver.h\"\n\n\nstatic ngx_int_t ngx_live_relay_rtmp_postconfiguration(ngx_conf_t *cf);\nstatic void *ngx_live_relay_rtmp_create_app_conf(ngx_conf_t *cf);\nstatic char *ngx_live_relay_rtmp_merge_app_conf(ngx_conf_t *cf, void *parent,\n       void *child);\n\n\ntypedef struct {\n    ngx_msec_t                  buflen;\n} ngx_live_relay_rtmp_app_conf_t;\n\n\ntypedef struct {\n    char                       *code;\n    ngx_uint_t                  status;\n    ngx_flag_t                  finalize;\n} ngx_rtmp_status_code_t;\n\n\nstatic ngx_rtmp_status_code_t ngx_rtmp_relay_status_error_code[] = {\n    { \"NetStream.Publish.BadName\",      400, 1 },\n    { \"NetStream.Stream.Forbidden\",     403, 1 },\n    { \"NetStream.Play.StreamNotFound\",  404, 1 },\n    { \"NetStream.Relay.ServerError\",    500, 1 },\n    { NULL, 0, 0 }\n};\n\n\n#define NGX_RTMP_RELAY_CONNECT_TRANS            1\n#define NGX_RTMP_RELAY_CREATE_STREAM_TRANS      2\n\n\n#define NGX_RTMP_RELAY_CSID_AMF_INI             3\n#define NGX_RTMP_RELAY_CSID_AMF                 5\n#define NGX_RTMP_RELAY_MSID                     1\n\n\nstatic ngx_command_t  ngx_live_relay_rtmp_commands[] = {\n\n    { ngx_string(\"relay_buffer\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_live_relay_rtmp_app_conf_t, buflen),\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_live_relay_rtmp_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_live_relay_rtmp_postconfiguration,  /* postconfiguration */\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    ngx_live_relay_rtmp_create_app_conf,    /* create app configuration */\n    ngx_live_relay_rtmp_merge_app_conf      /* merge app configuration */\n};\n\n\nngx_module_t  ngx_live_relay_rtmp_module = {\n    NGX_MODULE_V1,\n    &ngx_live_relay_rtmp_module_ctx,        /* module context */\n    ngx_live_relay_rtmp_commands,           /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_live_relay_rtmp_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_live_relay_rtmp_app_conf_t *racf;\n\n    racf = ngx_pcalloc(cf->pool, sizeof(ngx_live_relay_rtmp_app_conf_t));\n    if (racf == NULL) {\n        return NULL;\n    }\n\n    racf->buflen = NGX_CONF_UNSET_MSEC;\n\n    return racf;\n}\n\n\nstatic char *\nngx_live_relay_rtmp_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_live_relay_rtmp_app_conf_t *prev = parent;\n    ngx_live_relay_rtmp_app_conf_t *conf = child;\n\n    ngx_conf_merge_msec_value(conf->buflen, prev->buflen, 5000);\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_relay_rtmp_send_connect(ngx_rtmp_session_t *s)\n{\n    ngx_str_t                       app, tcurl;\n    double                          acodecs = 3575, vcodecs = 252;\n    static double                   trans = NGX_RTMP_RELAY_CONNECT_TRANS;\n\n    static ngx_rtmp_amf_elt_t       out_cmd[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"app\"),\n          NULL, 0 }, /* <-- fill */\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"tcUrl\"),\n          NULL, 0 }, /* <-- fill */\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"pageUrl\"),\n          NULL, 0 }, /* <-- fill */\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"swfUrl\"),\n          NULL, 0 }, /* <-- fill */\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"flashVer\"),\n          NULL, 0 }, /* <-- fill */\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"audioCodecs\"),\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"videoCodecs\"),\n          NULL, 0 }\n    };\n\n    static ngx_rtmp_amf_elt_t   out_elts[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          \"connect\", 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &trans, 0 },\n\n        { NGX_RTMP_AMF_OBJECT,\n          ngx_null_string,\n          out_cmd, sizeof(out_cmd) }\n    };\n\n    ngx_rtmp_core_app_conf_t       *cacf;\n    ngx_rtmp_core_srv_conf_t       *cscf;\n    ngx_live_relay_ctx_t           *ctx;\n    ngx_rtmp_header_t               h;\n\n\n    cacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_core_module);\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (cacf == NULL || ctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    /* app */\n    if (ctx->args.len) {\n        app.len = ctx->app.len + 1 + ctx->args.len;\n        app.data = ngx_pcalloc(s->pool, app.len);\n        if (app.data == NULL) {\n            return NGX_ERROR;\n        }\n\n        ngx_snprintf(app.data, app.len, \"%V?%V\", &ctx->app, &ctx->args);\n    } else {\n        app = ctx->app;\n    }\n\n    out_cmd[0].data = app.data;\n    out_cmd[0].len  = app.len;\n\n    /* tcUrl */\n    tcurl.len = sizeof(\"rtmp://\") - 1 + ctx->domain.len + 1 + ctx->app.len;\n    tcurl.data = ngx_palloc(s->pool, tcurl.len);\n    if (tcurl.data == NULL) {\n        return NGX_ERROR;\n    }\n    ngx_snprintf(tcurl.data, tcurl.len, \"rtmp://%V/%V\",\n            &ctx->domain, &ctx->app);\n\n    out_cmd[1].data = tcurl.data;\n    out_cmd[1].len = tcurl.len;\n\n    /* pageUrl */\n    out_cmd[2].data = ctx->referer.data;\n    out_cmd[2].len  = ctx->referer.len;\n\n    /* swfUrl */\n    out_cmd[3].data = ctx->swf_url.data;\n    out_cmd[3].len  = ctx->swf_url.len;\n\n    /* flashVer */\n    out_cmd[4].data = ctx->user_agent.data;\n    out_cmd[4].len  = ctx->user_agent.len;\n\n    if (ctx->acodecs != 0) {\n        acodecs = (double) ctx->acodecs;\n    }\n    out_cmd[5].data = &acodecs;\n\n    if (ctx->vcodecs != 0) {\n        vcodecs = (double) ctx->vcodecs;\n    }\n    out_cmd[6].data = &vcodecs;\n\n    ngx_memzero(&h, sizeof(h));\n    h.csid = NGX_RTMP_RELAY_CSID_AMF_INI;\n    h.type = NGX_RTMP_MSG_AMF_CMD;\n\n    s->status = NGX_LIVE_CONNECT;\n    s->connect_time = ngx_current_msec;\n\n    return ngx_rtmp_send_chunk_size(s, cscf->chunk_size) != NGX_OK\n        || ngx_rtmp_send_ack_size(s, cscf->ack_window) != NGX_OK\n        || ngx_rtmp_send_amf(s, &h, out_elts,\n            sizeof(out_elts) / sizeof(out_elts[0])) != NGX_OK\n        ? NGX_ERROR\n        : NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_relay_rtmp_send_create_stream(ngx_rtmp_session_t *s)\n{\n    static double                   trans = NGX_RTMP_RELAY_CREATE_STREAM_TRANS;\n\n    static ngx_rtmp_amf_elt_t       out_elts[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          \"createStream\", 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &trans, 0 },\n\n        { NGX_RTMP_AMF_NULL,\n          ngx_null_string,\n          NULL, 0 }\n    };\n\n    ngx_rtmp_header_t               h;\n\n\n    ngx_memzero(&h, sizeof(h));\n    h.csid = NGX_RTMP_RELAY_CSID_AMF_INI;\n    h.type = NGX_RTMP_MSG_AMF_CMD;\n\n    s->stage = NGX_LIVE_CREATE_STREAM;\n    s->create_stream_time = ngx_current_msec;\n\n    return ngx_rtmp_send_amf(s, &h, out_elts,\n            sizeof(out_elts) / sizeof(out_elts[0]));\n}\n\n\nstatic ngx_int_t\nngx_live_relay_rtmp_send_publish(ngx_rtmp_session_t *s)\n{\n    ngx_str_t                       name;\n    static double                   trans;\n\n    static ngx_rtmp_amf_elt_t       out_elts[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          \"publish\", 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &trans, 0 },\n\n        { NGX_RTMP_AMF_NULL,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          NULL, 0 }, /* <- to fill */\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          \"live\", 0 }\n    };\n\n    ngx_rtmp_header_t               h;\n    ngx_live_relay_ctx_t           *ctx;\n\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (ctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    if (ctx->pargs.len) {\n        name.len = ctx->name.len + 1 + ctx->pargs.len;\n        name.data = ngx_pcalloc(s->pool, name.len);\n        if (name.data == NULL) {\n            return NGX_ERROR;\n        }\n\n        ngx_snprintf(name.data, name.len, \"%V?%V\", &ctx->name, &ctx->pargs);\n    } else {\n        name = ctx->name;\n    }\n\n    out_elts[3].data = name.data;\n    out_elts[3].len  = name.len;\n\n    ngx_memzero(&h, sizeof(h));\n    h.csid = NGX_RTMP_RELAY_CSID_AMF;\n    h.msid = NGX_RTMP_RELAY_MSID;\n    h.type = NGX_RTMP_MSG_AMF_CMD;\n\n    s->stage = NGX_LIVE_PUBLISH;\n    s->ptime = ngx_current_msec;\n\n    return ngx_rtmp_send_amf(s, &h, out_elts,\n            sizeof(out_elts) / sizeof(out_elts[0]));\n}\n\n\nstatic ngx_int_t\nngx_live_relay_rtmp_send_play(ngx_rtmp_session_t *s)\n{\n    ngx_str_t                       name;\n    static double                   trans;\n    static double                   start, duration;\n\n    static ngx_rtmp_amf_elt_t       out_elts[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          \"play\", 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &trans, 0 },\n\n        { NGX_RTMP_AMF_NULL,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          NULL, 0 }, /* <- fill */\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &start, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &duration, 0 },\n    };\n\n    ngx_rtmp_header_t               h;\n    ngx_live_relay_ctx_t           *ctx;\n    ngx_live_relay_rtmp_app_conf_t *racf;\n\n\n    racf = ngx_rtmp_get_module_app_conf(s, ngx_live_relay_rtmp_module);\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (racf == NULL) {\n        return NGX_ERROR;\n    }\n\n    if (ctx->pargs.len) {\n        name.len = ctx->name.len + 1 + ctx->pargs.len;\n        name.data = ngx_pcalloc(s->pool, name.len);\n        if (name.data == NULL) {\n            return NGX_ERROR;\n        }\n\n        ngx_snprintf(name.data, name.len, \"%V?%V\", &ctx->name, &ctx->pargs);\n    } else {\n        name = ctx->name;\n    }\n\n    out_elts[3].data = name.data;\n    out_elts[3].len  = name.len;\n\n    start = -1000;\n    duration = -1000;\n\n    ngx_memzero(&h, sizeof(h));\n    h.csid = NGX_RTMP_RELAY_CSID_AMF;\n    h.msid = NGX_RTMP_RELAY_MSID;\n    h.type = NGX_RTMP_MSG_AMF_CMD;\n\n    s->stage = NGX_LIVE_PLAY;\n    s->ptime = ngx_current_msec;\n\n    return ngx_rtmp_send_amf(s, &h, out_elts,\n            sizeof(out_elts) / sizeof(out_elts[0])) != NGX_OK\n           || ngx_rtmp_send_set_buflen(s, NGX_RTMP_RELAY_MSID,\n                   racf->buflen) != NGX_OK\n           ? NGX_ERROR\n           : NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_relay_rtmp_status_error(ngx_rtmp_session_t *s, char *type, char *code,\n        char *level, char *desc)\n{\n    ngx_rtmp_core_ctx_t            *cctx;\n    size_t                          i;\n    ngx_flag_t                      status = 0;\n\n    if (ngx_strcmp(type, \"onStatus\") == 0) {\n        status = 1;\n    }\n\n    for (i = 0; ngx_rtmp_relay_status_error_code[i].code; ++i) {\n\n        if (ngx_strcmp(ngx_rtmp_relay_status_error_code[i].code, code)\n                != 0)\n        {\n            continue;\n        }\n\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"relay transit, %s: level='%s' code='%s' description='%s'\",\n                type, level, code, desc);\n\n        if (s->publishing) {\n            cctx = s->live_stream->play_ctx;\n        } else {\n            cctx = s->live_stream->publish_ctx;\n        }\n\n        for (; cctx; cctx = cctx->next) {\n            cctx->session->status = ngx_rtmp_relay_status_error_code[i].status;\n            status ? ngx_rtmp_send_status(cctx->session, code, level, desc)\n                   : ngx_rtmp_send_error(cctx->session, code, level, desc);\n\n            if (ngx_rtmp_relay_status_error_code[i].finalize\n                    && !cctx->session->static_pull)\n            {\n                cctx->session->finalize_reason = NGX_LIVE_RELAY_TRANSIT;\n                ngx_rtmp_finalize_session(cctx->session);\n            }\n        }\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_relay_rtmp_on_result(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    ngx_live_relay_ctx_t           *ctx;\n    static struct {\n        double                      trans;\n        u_char                      level[32];\n        u_char                      code[128];\n        u_char                      desc[1024];\n    } v;\n\n    static ngx_rtmp_amf_elt_t       in_inf[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"level\"),\n          &v.level, sizeof(v.level) },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"code\"),\n          &v.code, sizeof(v.code) },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"description\"),\n          &v.desc, sizeof(v.desc) },\n    };\n\n    static ngx_rtmp_amf_elt_t       in_elts[] = {\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &v.trans, 0 },\n\n        { NGX_RTMP_AMF_NULL,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_OBJECT,\n          ngx_null_string,\n          in_inf, sizeof(in_inf) },\n    };\n\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (ctx == NULL) {\n        return NGX_OK;\n    }\n\n    ngx_memzero(&v, sizeof(v));\n    if (ngx_rtmp_receive_amf(s, in, in_elts,\n                sizeof(in_elts) / sizeof(in_elts[0])))\n    {\n        return NGX_ERROR;\n    }\n\n    ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"relay: _result: level='%s' code='%s' description='%s'\",\n            v.level, v.code, v.desc);\n\n    switch ((ngx_int_t)v.trans) {\n        case NGX_RTMP_RELAY_CONNECT_TRANS:\n            return ngx_live_relay_rtmp_send_create_stream(s);\n\n        case NGX_RTMP_RELAY_CREATE_STREAM_TRANS:\n            if (s->publishing == 0) {\n                if (ngx_live_relay_rtmp_send_publish(s) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n                return ngx_live_relay_play_local(s);\n\n            } else {\n                if (ngx_live_relay_rtmp_send_play(s) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n                return ngx_live_relay_publish_local(s);\n            }\n\n        default:\n            return NGX_OK;\n    }\n}\n\n\nstatic ngx_int_t\nngx_live_relay_rtmp_on_error(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    ngx_live_relay_ctx_t           *ctx;\n    static struct {\n        double                      trans;\n        u_char                      level[32];\n        u_char                      code[128];\n        u_char                      desc[1024];\n    } v;\n\n    static ngx_rtmp_amf_elt_t       in_inf[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"level\"),\n          &v.level, sizeof(v.level) },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"code\"),\n          &v.code, sizeof(v.code) },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"description\"),\n          &v.desc, sizeof(v.desc) },\n    };\n\n    static ngx_rtmp_amf_elt_t       in_elts[] = {\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &v.trans, 0 },\n\n        { NGX_RTMP_AMF_NULL,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_OBJECT,\n          ngx_null_string,\n          in_inf, sizeof(in_inf) },\n    };\n\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (ctx == NULL) {\n        return NGX_OK;\n    }\n\n    ngx_memzero(&v, sizeof(v));\n    if (ngx_rtmp_receive_amf(s, in, in_elts,\n                sizeof(in_elts) / sizeof(in_elts[0])))\n    {\n        return NGX_ERROR;\n    }\n\n    ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"relay: _error: level='%s' code='%s' description='%s'\",\n            v.level, v.code, v.desc);\n\n    ngx_live_relay_rtmp_status_error(s, \"_error\", (char *) v.code,\n            (char *) v.level, (char *) v.desc);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_relay_rtmp_on_status(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    ngx_live_relay_ctx_t           *ctx;\n    static struct {\n        double                      trans;\n        u_char                      level[32];\n        u_char                      code[128];\n        u_char                      desc[1024];\n    } v;\n\n    static ngx_rtmp_amf_elt_t       in_inf[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"level\"),\n          &v.level, sizeof(v.level) },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"code\"),\n          &v.code, sizeof(v.code) },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"description\"),\n          &v.desc, sizeof(v.desc) },\n    };\n\n    static ngx_rtmp_amf_elt_t       in_elts[] = {\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &v.trans, 0 },\n\n        { NGX_RTMP_AMF_NULL,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_OBJECT,\n          ngx_null_string,\n          in_inf, sizeof(in_inf) },\n    };\n\n    static ngx_rtmp_amf_elt_t       in_elts_meta[] = {\n\n        { NGX_RTMP_AMF_OBJECT,\n          ngx_null_string,\n          in_inf, sizeof(in_inf) },\n    };\n\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (ctx == NULL) {\n        return NGX_OK;\n    }\n\n    ngx_memzero(&v, sizeof(v));\n    if (h->type == NGX_RTMP_MSG_AMF_META) {\n        ngx_rtmp_receive_amf(s, in, in_elts_meta,\n                sizeof(in_elts_meta) / sizeof(in_elts_meta[0]));\n    } else {\n        ngx_rtmp_receive_amf(s, in, in_elts,\n                sizeof(in_elts) / sizeof(in_elts[0]));\n    }\n\n    ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"relay: onStatus: level='%s' code='%s' description='%s'\",\n            v.level, v.code, v.desc);\n\n    ngx_live_relay_rtmp_status_error(s, \"onStatus\", (char *) v.code,\n            (char *) v.level, (char *) v.desc);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_relay_rtmp_handshake_done(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    ngx_live_relay_ctx_t           *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (ctx == NULL) {\n        return NGX_OK;\n    }\n\n    return ngx_live_relay_rtmp_send_connect(s);\n}\n\n\nstatic ngx_int_t\nngx_live_relay_rtmp_get_peer(ngx_peer_connection_t *pc, void *data)\n{\n    return NGX_OK;\n}\n\n\nstatic void\nngx_live_relay_rtmp_free_peer(ngx_peer_connection_t *pc, void *data,\n        ngx_uint_t state)\n{\n}\n\n\nngx_int_t\nngx_live_relay_create_rtmp(ngx_rtmp_session_t *s, ngx_live_relay_t *relay,\n        ngx_live_relay_url_t *url)\n{\n    ngx_live_relay_ctx_t           *rctx;\n    ngx_pool_t                     *pool;\n    ngx_peer_connection_t          *pc;\n    ngx_connection_t               *c;\n    ngx_int_t                       rc;\n    ngx_str_t                       name;\n    u_char                          text[NGX_SOCKADDRLEN];\n    // must use ngx_sockaddr_t, because sizeof(struct sockaddr)\n    //   is not long enouph, content will be covered by other var\n    ngx_sockaddr_t                  nsa;\n    struct sockaddr                *sa;\n    socklen_t                       len;\n\n    rctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (rctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    pool = ngx_create_pool(4096, ngx_cycle->log);\n    if (pool == NULL) {\n        goto destroy;\n    }\n\n#define NGX_LIVE_RELAY_CTX(para)                                        \\\n    if (ngx_copy_str(s->pool, &rctx->para, &relay->para) != NGX_OK) {   \\\n        goto destroy;                                                   \\\n    }\n\n    NGX_LIVE_RELAY_CTX(domain);\n    NGX_LIVE_RELAY_CTX(app);\n    NGX_LIVE_RELAY_CTX(name);\n    NGX_LIVE_RELAY_CTX(pargs);\n    NGX_LIVE_RELAY_CTX(referer);\n    NGX_LIVE_RELAY_CTX(user_agent);\n#undef NGX_LIVE_RELAY_CTX\n\n    rctx->tag = relay->tag;\n\n    // connect server\n    pc = ngx_pcalloc(s->pool, sizeof(ngx_peer_connection_t));\n    if (pc == NULL) {\n        goto destroy;\n    }\n    pc->log = s->log;\n\n    // get address\n    sa = (struct sockaddr *) &nsa;\n    len = ngx_dynamic_resolver_gethostbyname(&url->url.host, sa);\n    if (len == 0) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"relay rtmp: gethostbyname failed %V\", &url->url.host);\n        goto destroy;\n    }\n\n    if (url->port != 0) {\n        ngx_inet_set_port(sa, url->port);\n    }\n\n    ngx_memzero(text, sizeof(text));\n    name.len = ngx_sock_ntop(sa, len, text, NGX_SOCKADDRLEN, 1);\n    name.data = text;\n\n    /* copy log to keep shared log unchanged */\n    pc->get = ngx_live_relay_rtmp_get_peer;\n    pc->free = ngx_live_relay_rtmp_free_peer;\n    pc->name = &name;\n    pc->socklen = len;\n    pc->sockaddr = sa;\n\n    rc = ngx_event_connect_peer(pc);\n    if (rc != NGX_OK && rc != NGX_AGAIN ) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0, \"relay: connection failed\");\n        goto destroy;\n    }\n    c = pc->connection;\n    if (ngx_copy_str(pool, &c->addr_text, &url->url.host_with_port) != NGX_OK) {\n        goto destroy;\n    }\n    ngx_rtmp_init_session(s, c);\n    c->pool = pool;\n\n#if (NGX_STAT_STUB)\n    (void) ngx_atomic_fetch_add(ngx_stat_active, 1);\n#endif\n\n    ngx_rtmp_client_handshake(s, 1);\n\n    return NGX_OK;\n\ndestroy:\n    if (pool) {\n        ngx_destroy_pool(pool);\n    }\n\n    ngx_rtmp_finalize_session(s);\n\n    return NGX_ERROR;\n}\n\n\nstatic ngx_int_t\nngx_live_relay_rtmp_postconfiguration(ngx_conf_t *cf)\n{\n    ngx_rtmp_core_main_conf_t      *cmcf;\n    ngx_rtmp_handler_pt            *h;\n    ngx_rtmp_amf_handler_t         *ch;\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_HANDSHAKE_DONE]);\n    *h = ngx_live_relay_rtmp_handshake_done;\n\n    ch = ngx_array_push(&cmcf->amf);\n    ngx_str_set(&ch->name, \"_result\");\n    ch->handler = ngx_live_relay_rtmp_on_result;\n\n    ch = ngx_array_push(&cmcf->amf);\n    ngx_str_set(&ch->name, \"_error\");\n    ch->handler = ngx_live_relay_rtmp_on_error;\n\n    ch = ngx_array_push(&cmcf->amf);\n    ngx_str_set(&ch->name, \"onStatus\");\n    ch->handler = ngx_live_relay_rtmp_on_status;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_live_relay_simple.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_live_relay.h\"\n#include \"ngx_rtmp_dynamic.h\"\n#include \"ngx_dynamic_resolver.h\"\n\n\nstatic ngx_live_push_pt                 next_push;\nstatic ngx_live_pull_pt                 next_pull;\nstatic ngx_live_push_close_pt           next_push_close;\n\n\nstatic void *ngx_live_relay_simple_create_app_conf(ngx_conf_t *cf);\nstatic char *ngx_live_relay_simple_merge_app_conf(ngx_conf_t *cf,\n       void *parent, void *child);\nstatic ngx_int_t ngx_live_relay_simple_postconfiguration(ngx_conf_t *cf);\n\nstatic char *ngx_live_relay_push(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\nstatic char *ngx_live_relay_pull(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\n\n\ntypedef struct {\n    ngx_live_relay_t                    pull;\n    ngx_array_t                         pushes; /* ngx_live_relay_t */\n} ngx_live_relay_simple_app_conf_t;\n\n\ntypedef struct {\n    ngx_live_relay_t                   *relay;\n} ngx_live_relay_simple_ctx_t;\n\n\nstatic ngx_command_t  ngx_live_relay_simple_commands[] = {\n\n    { ngx_string(\"push\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_live_relay_push,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"pull\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_live_relay_pull,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_live_relay_simple_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_live_relay_simple_postconfiguration,/* postconfiguration */\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    ngx_live_relay_simple_create_app_conf,  /* create app configuration */\n    ngx_live_relay_simple_merge_app_conf    /* merge app configuration */\n};\n\n\nngx_module_t  ngx_live_relay_simple_module = {\n    NGX_MODULE_V1,\n    &ngx_live_relay_simple_module_ctx,      /* module context */\n    ngx_live_relay_simple_commands,         /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_live_relay_simple_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_live_relay_simple_app_conf_t   *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_live_relay_simple_app_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    if (ngx_array_init(&conf->pushes, cf->pool, 8, sizeof(ngx_live_relay_t))\n            != NGX_OK)\n    {\n        return NULL;\n    }\n\n    return conf;\n}\n\n\nstatic char *\nngx_live_relay_simple_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    return NGX_CONF_OK;\n}\n\n\nstatic void\nngx_live_relay_simple_handler(ngx_event_t *ev)\n{\n    ngx_rtmp_session_t                 *s;\n    ngx_live_relay_app_conf_t          *lracf;\n    ngx_live_relay_ctx_t               *ctx;\n    ngx_live_relay_simple_ctx_t        *sctx;\n    ngx_live_relay_t                   *relay;\n\n    s = ev->data;\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n\n    if (!ctx->failed_delay && ev->timedout) { // connect timeout\n        ngx_log_error(NGX_LOG_ERR, s->log, NGX_ETIMEDOUT,\n                \"simple relay, relay timeout\");\n        s->finalize_reason = NGX_LIVE_RELAY_TIMEOUT;\n        ngx_rtmp_finalize_session(s);\n\n        return;\n    }\n\n    // relay pull, no player or relay push no publisher\n    if ((s->publishing && s->live_stream->play_ctx == NULL)\n            || (!s->publishing && s->live_stream->publish_ctx == NULL))\n    {\n        return;\n    }\n\n    lracf = ngx_rtmp_get_module_app_conf(s, ngx_live_relay_module);\n\n    ngx_add_timer(&ctx->reconnect, lracf->relay_reconnect);\n\n    sctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_simple_module);\n    relay = sctx->relay;\n\n    ngx_live_relay_create(s, relay);\n}\n\n\nstatic ngx_int_t\nngx_live_relay_simple_relay(ngx_rtmp_session_t *s, ngx_live_relay_t *relay,\n        unsigned publishing)\n{\n    ngx_rtmp_session_t                 *rs;\n    ngx_live_relay_ctx_t               *ctx, *pctx;\n    ngx_live_relay_app_conf_t          *lracf;\n    ngx_live_relay_simple_ctx_t        *sctx;\n\n    rs = ngx_rtmp_create_relay_session(s, &ngx_live_relay_simple_module);\n    if (rs == NULL) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"relay simple, create relay session failed\");\n        return NGX_DECLINED;\n    }\n    rs->publishing = publishing;\n    rs->live_stream = s->live_stream;\n    ngx_live_create_ctx(rs, publishing);\n\n    sctx = ngx_pcalloc(rs->pool, sizeof(ngx_live_relay_simple_ctx_t));\n    if (sctx == NULL) {\n        ngx_log_error(NGX_LOG_ERR, rs->log, 0,\n                \"relay simple, create simple relay ctx failed\");\n        ngx_rtmp_finalize_session(rs);\n\n        return NGX_OK;\n    }\n    ngx_rtmp_set_ctx(rs, sctx, ngx_live_relay_simple_module);\n    sctx->relay = relay;\n\n    ctx = ngx_rtmp_get_module_ctx(rs, ngx_live_relay_module);\n    ctx->reconnect.log = rs->log;\n    ctx->reconnect.data = rs;\n    ctx->reconnect.handler = ngx_live_relay_simple_handler;\n\n    if (s->publishing != rs->publishing) {\n        ngx_post_event(&ctx->reconnect, &ngx_posted_events);\n        return NGX_OK;\n    }\n\n    // normal publisher close, need to trigger pull\n    if (s->publishing && !s->relay) {\n        ngx_post_event(&ctx->reconnect, &ngx_posted_events);\n        return NGX_OK;\n    }\n\n    // reconnect\n    pctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (pctx->successd) { // prev relay successd\n        ngx_post_event(&ctx->reconnect, &ngx_posted_events);\n        return NGX_OK;\n    }\n\n    ctx->idx = pctx->idx;\n    ctx->failed_reconnect = pctx->failed_reconnect;\n\n    if (ctx->idx < relay->urls.nelts) { // retry backup url immediately\n        ngx_post_event(&ctx->reconnect, &ngx_posted_events);\n        return NGX_OK;\n    }\n\n    lracf = ngx_rtmp_get_module_app_conf(rs, ngx_live_relay_module);\n\n    if (!pctx->reconnect.timer_set) { // prev relay timeout\n        ctx->failed_reconnect = ngx_min(pctx->failed_reconnect * 2,\n                lracf->relay_reconnect);\n        ngx_post_event(&ctx->reconnect, &ngx_posted_events);\n        return NGX_OK;\n    }\n\n    if (pctx->failed_reconnect) {\n        ctx->failed_reconnect = ngx_min(pctx->failed_reconnect * 2,\n                lracf->relay_reconnect);\n    } else {\n        ctx->failed_reconnect = lracf->failed_reconnect;\n    }\n\n    ctx->failed_delay = 1;\n    ngx_add_timer(&ctx->reconnect, ctx->failed_reconnect);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_relay_simple_push(ngx_rtmp_session_t *s)\n{\n    ngx_live_relay_simple_app_conf_t   *rsacf;\n    ngx_live_relay_t                   *relay;\n    ngx_uint_t                          i;\n\n    rsacf = ngx_rtmp_get_module_app_conf(s, ngx_live_relay_simple_module);\n\n    if (rsacf->pushes.nelts == 0) { // not configured\n        goto next;\n    }\n\n    if (s->relay && s->static_pull == 0) {\n        goto next;\n    }\n\n    relay = rsacf->pushes.elts;\n    for (i = 0; i < rsacf->pushes.nelts; ++i, ++relay) {\n        ngx_live_relay_simple_relay(s, relay, 0);\n    }\n\nnext:\n    return next_push(s);\n}\n\n\nstatic ngx_int_t\nngx_live_relay_simple_pull(ngx_rtmp_session_t *s)\n{\n    ngx_live_relay_simple_app_conf_t   *rsacf;\n    ngx_live_relay_t                   *relay;\n\n    rsacf = ngx_rtmp_get_module_app_conf(s, ngx_live_relay_simple_module);\n\n    if (rsacf->pull.urls.nelts == 0) { // not configured\n        goto next;\n    }\n\n    if (!s->publishing && s->relay) { // relay push\n        goto next;\n    }\n\n    if (s->live_stream->publish_ctx) { // already has publisher\n        goto next;\n    }\n\n    relay = &rsacf->pull;\n\n    if (ngx_live_relay_simple_relay(s, relay, 1) == NGX_OK) {\n        return NGX_OK;\n    }\n\nnext:\n    return next_pull(s);\n}\n\n\nstatic ngx_int_t\nngx_live_relay_simple_push_close(ngx_rtmp_session_t *s)\n{\n    ngx_live_relay_ctx_t               *ctx;\n    ngx_live_relay_simple_ctx_t        *sctx;\n    ngx_live_relay_t                   *relay;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (ctx->tag != &ngx_live_relay_simple_module) {\n        goto next;\n    }\n\n    // relay push and has publisher in stream\n    if (!ctx->giveup && s->live_stream->publish_ctx) {\n        sctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_simple_module);\n        relay = sctx->relay;\n\n        ngx_live_relay_simple_relay(s, relay, 0);\n    }\n\nnext:\n    return next_push_close(s);\n}\n\n\nstatic char *\nngx_live_relay_push_pull(ngx_conf_t *cf, ngx_live_relay_t *relay)\n{\n    ngx_live_relay_url_t               *url;\n    ngx_str_t                          *value, n, v;\n    ngx_uint_t                          i;\n    u_char                             *p;\n\n    relay->tag = &ngx_live_relay_simple_module;\n\n    if (ngx_array_init(&relay->urls, cf->pool, 8, sizeof(ngx_live_relay_url_t))\n            != NGX_OK)\n    {\n        return NGX_CONF_ERROR;\n    }\n\n    value = cf->args->elts;\n    ++value;\n\n    for (i = 1; i < cf->args->nelts; ++i, ++value) {\n        if (ngx_strncasecmp(value->data, (u_char *) \"rtmp://\", 7) == 0\n            || ngx_strncasecmp(value->data, (u_char *) \"http://\", 7) == 0)\n        {\n            url = ngx_array_push(&relay->urls);\n            if (url == NULL) {\n                return NGX_CONF_ERROR;\n            }\n            ngx_memzero(url, sizeof(ngx_live_relay_url_t));\n\n            if (value->data[0] == 'h') {\n                url->relay_type = NGX_LIVE_RELAY_HTTPFLV;\n            } else {\n                url->relay_type = NGX_LIVE_RELAY_RTMP;\n            }\n\n            if (ngx_parse_request_url(&url->url, value) != NGX_OK) {\n                return NGX_CONF_ERROR;\n            }\n\n            url->port = ngx_request_port(&url->url.scheme, &url->url.port);\n            if (url->port == 0) {\n                return \"invalid port\";\n            }\n\n            ngx_dynamic_resolver_add_domain(&url->url.host, cf->cycle);\n\n            continue;\n        }\n\n        p = ngx_strlchr(value->data, value->data + value->len, '=');\n\n        if (p == NULL) {\n            return \"unsupported parameter format\";\n        } else {\n            n.data = value->data;\n            n.len = p - value->data;\n\n            v.data = p + 1;\n            v.len = value->data + value->len - v.data;\n        }\n\n#define NGX_LIVE_RELAY_STR_PAR(name, var)                               \\\n        if (n.len == sizeof(name) - 1                                   \\\n            && ngx_strncasecmp(n.data, (u_char *) name, n.len) == 0)    \\\n        {                                                               \\\n            relay->var = v;                                             \\\n            continue;                                                   \\\n        }\n\n        NGX_LIVE_RELAY_STR_PAR(\"domain\",        domain);\n        NGX_LIVE_RELAY_STR_PAR(\"app\",           app);\n        NGX_LIVE_RELAY_STR_PAR(\"name\",          name);\n        NGX_LIVE_RELAY_STR_PAR(\"pargs\",         pargs);\n        NGX_LIVE_RELAY_STR_PAR(\"referer\",       referer);\n        NGX_LIVE_RELAY_STR_PAR(\"user_agent\",    user_agent);\n\n#undef NGX_LIVE_RELAY_STR_PAR\n\n        return \"unsupported parameter\";\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic char *\nngx_live_relay_push(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_live_relay_simple_app_conf_t   *rsacf;\n    ngx_live_relay_t                   *relay;\n    char                               *rc;\n\n    rsacf = conf;\n\n    relay = ngx_array_push(&rsacf->pushes);\n    if (relay == NULL) {\n        return NGX_CONF_ERROR;\n    }\n    ngx_memzero(relay, sizeof(ngx_live_relay_t));\n\n    rc = ngx_live_relay_push_pull(cf, relay);\n    if (rc != NGX_CONF_OK) {\n        return rc;\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic char *\nngx_live_relay_pull(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_live_relay_simple_app_conf_t   *rsacf;\n\n    rsacf = conf;\n\n    if (rsacf->pull.urls.nelts) {\n        return \"is duplicate\";\n    }\n\n    return ngx_live_relay_push_pull(cf, &rsacf->pull);\n}\n\n\nstatic ngx_int_t\nngx_live_relay_simple_postconfiguration(ngx_conf_t *cf)\n{\n    /* chain handlers */\n\n    next_push = ngx_live_push;\n    ngx_live_push = ngx_live_relay_simple_push;\n\n    next_pull = ngx_live_pull;\n    ngx_live_pull = ngx_live_relay_simple_pull;\n\n    next_push_close = ngx_live_push_close;\n    ngx_live_push_close = ngx_live_relay_simple_push_close;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_live_relay_static.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_live_relay.h\"\n#include \"ngx_map.h\"\n#include \"ngx_dynamic_conf.h\"\n#include \"ngx_rtmp_dynamic.h\"\n#include \"ngx_dynamic_resolver.h\"\n\nstatic ngx_live_pull_pt                 next_pull;\n\n\nstatic void *ngx_live_relay_static_create_main_conf(ngx_conf_t *cf);\nstatic char *ngx_live_relay_static_init_main_conf(ngx_conf_t *cf, void *conf);\n\nstatic void *ngx_live_relay_static_create_main_dconf(ngx_conf_t *cf);\nstatic char *ngx_live_relay_static_init_main_dconf(ngx_conf_t *cf, void *conf);\n\nstatic char *ngx_live_relay_pull(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\n\nstatic ngx_int_t ngx_live_relay_static_postconfiguration(ngx_conf_t *cf);\n\n\ntypedef struct ngx_live_relay_static_relay_s  ngx_live_relay_static_relay_t;\n\nstruct ngx_live_relay_static_relay_s {\n    ngx_map_node_t                      node;\n    ngx_live_relay_t                   *relay;\n    ngx_rtmp_session_t                 *session;\n    ngx_live_relay_static_relay_t      *next;\n};\n\n\ntypedef struct {\n    /* ngx_live_relay_static_relay_t */\n    ngx_map_t                           pulls[2];\n    /* 0 and 1 for index of conf */\n    unsigned                            used;\n    ngx_str_t                           pull_port;\n\n    ngx_live_relay_static_relay_t      *free;\n    unsigned                            nalloc;\n    unsigned                            nfree;\n} ngx_live_relay_static_main_conf_t;\n\n\ntypedef struct {\n    ngx_array_t                         pulls; /* ngx_live_relay_t */\n} ngx_live_relay_static_main_dconf_t;\n\n\ntypedef struct {\n    ngx_live_relay_static_relay_t      *relay;\n} ngx_live_relay_static_ctx_t;\n\n\nstatic ngx_command_t  ngx_live_relay_static_dcommands[] = {\n\n    { ngx_string(\"static_pull\"),\n      NGX_RTMP_MAIN_CONF|NGX_CONF_1MORE,\n      ngx_live_relay_pull,\n      NGX_RTMP_MAIN_CONF_OFFSET,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_dynamic_module_t  ngx_live_relay_static_module_dctx = {\n    ngx_live_relay_static_create_main_dconf,/* create main configuration */\n    ngx_live_relay_static_init_main_dconf,  /* init main configuration */\n\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n\n    NULL,                                   /* create app configuration */\n    NULL                                    /* merge app configuration */\n};\n\n\nstatic ngx_command_t  ngx_live_relay_static_commands[] = {\n\n    { ngx_string(\"static_pull_port\"),\n      NGX_RTMP_MAIN_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_str_slot,\n      NGX_RTMP_MAIN_CONF_OFFSET,\n      offsetof(ngx_live_relay_static_main_conf_t, pull_port),\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_live_relay_static_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_live_relay_static_postconfiguration,/* postconfiguration */\n    ngx_live_relay_static_create_main_conf, /* create main configuration */\n    ngx_live_relay_static_init_main_conf,   /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    NULL,                                   /* create app configuration */\n    NULL                                    /* merge app configuration */\n};\n\n\nngx_module_t  ngx_live_relay_static_module = {\n    NGX_MODULE_V1,\n    &ngx_live_relay_static_module_ctx,      /* module context */\n    ngx_live_relay_static_commands,         /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    (uintptr_t) &ngx_live_relay_static_module_dctx, /* module dynamic context */\n    (uintptr_t) ngx_live_relay_static_dcommands, /* module dynamic directives */\n    NGX_MODULE_V1_DYNAMIC_PADDING\n};\n\n\nstatic void\nngx_live_relay_static_handler(ngx_event_t *ev)\n{\n    ngx_rtmp_session_t                 *s;\n    ngx_live_relay_app_conf_t          *lracf;\n    ngx_live_relay_ctx_t               *ctx;\n    ngx_live_relay_static_ctx_t        *sctx;\n    ngx_live_relay_t                   *relay;\n\n    s = ev->data;\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n\n    if (!ctx->failed_delay && ev->timedout) { // connect timeout\n        ngx_log_error(NGX_LOG_ERR, s->log, NGX_ETIMEDOUT,\n                \"static relay, relay timeout\");\n        s->finalize_reason = NGX_LIVE_RELAY_TIMEOUT;\n        ngx_rtmp_finalize_session(s);\n\n        return;\n    }\n\n    lracf = ngx_rtmp_get_module_app_conf(s, ngx_live_relay_module);\n\n    ngx_add_timer(&ctx->reconnect, lracf->relay_reconnect);\n\n    sctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_static_module);\n    relay = sctx->relay->relay;\n\n    ngx_live_relay_create(s, relay);\n}\n\n\nstatic ngx_int_t\nngx_live_relay_static_relay(ngx_rtmp_session_t *s,\n        ngx_live_relay_static_relay_t *r)\n{\n    ngx_rtmp_session_t                 *rs;\n    ngx_live_relay_ctx_t               *ctx, *pctx;\n    ngx_live_relay_app_conf_t          *lracf;\n    ngx_live_relay_static_main_conf_t  *rsmcf;\n    ngx_live_relay_static_ctx_t        *sctx;\n    ngx_live_relay_t                   *relay;\n    ngx_rtmp_addr_conf_t               *addr_conf;\n\n    relay = r->relay;\n    rsmcf = ngx_rtmp_cycle_get_module_main_conf(ngx_cycle,\n                                                ngx_live_relay_static_module);\n    addr_conf = ngx_rtmp_find_related_addr_conf((ngx_cycle_t *) ngx_cycle,\n                                                &rsmcf->pull_port);\n    if (addr_conf == NULL) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"relay static, find related add_conf for %V failed\",\n                &rsmcf->pull_port);\n        return NGX_DECLINED;\n    }\n\n    rs = ngx_rtmp_create_static_session(relay, addr_conf,\n                                        &ngx_live_relay_static_module);\n    if (rs == NULL) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"relay static, create relay session %V failed\", &relay->stream);\n        return NGX_DECLINED;\n    }\n    r->session = rs;\n\n    rs->publishing = 1;\n    rs->live_stream = ngx_live_create_stream(&rs->domain, &rs->stream);\n    ngx_live_create_ctx(rs, 1);\n\n    sctx = ngx_pcalloc(rs->pool, sizeof(ngx_live_relay_static_ctx_t));\n    if (sctx == NULL) {\n        ngx_log_error(NGX_LOG_ERR, rs->log, 0,\n                \"relay static, create static relay ctx failed\");\n        ngx_rtmp_finalize_session(rs);\n\n        return NGX_OK;\n    }\n    ngx_rtmp_set_ctx(rs, sctx, ngx_live_relay_static_module);\n    sctx->relay = r;\n\n    ctx = ngx_rtmp_get_module_ctx(rs, ngx_live_relay_module);\n    ctx->reconnect.log = rs->log;\n    ctx->reconnect.data = rs;\n    ctx->reconnect.handler = ngx_live_relay_static_handler;\n\n    if (s == NULL) {\n        ngx_post_event(&ctx->reconnect, &ngx_posted_events);\n        return NGX_OK;\n    }\n\n    // reconnect\n    pctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (pctx->successd) { // prev relay successd\n        ngx_post_event(&ctx->reconnect, &ngx_posted_events);\n        return NGX_OK;\n    }\n\n    ctx->idx = pctx->idx;\n    ctx->failed_reconnect = pctx->failed_reconnect;\n\n    if (ctx->idx < relay->urls.nelts) { // retry backup url immediately\n        ngx_post_event(&ctx->reconnect, &ngx_posted_events);\n        return NGX_OK;\n    }\n\n    lracf = ngx_rtmp_get_module_app_conf(rs, ngx_live_relay_module);\n\n    if (!pctx->reconnect.timer_set) { // prev relay timeout\n        ctx->failed_reconnect = ngx_min(pctx->failed_reconnect * 2,\n                lracf->relay_reconnect);\n        ngx_post_event(&ctx->reconnect, &ngx_posted_events);\n        return NGX_OK;\n    }\n\n    if (pctx->failed_reconnect) {\n        ctx->failed_reconnect = ngx_min(pctx->failed_reconnect * 2,\n                lracf->relay_reconnect);\n    } else {\n        ctx->failed_reconnect = lracf->failed_reconnect;\n    }\n\n    ctx->failed_delay = 1;\n    ngx_add_timer(&ctx->reconnect, ctx->failed_reconnect);\n\n    return NGX_OK;\n}\n\n\n// only be called when reconnect\nstatic ngx_int_t\nngx_live_relay_static_pull(ngx_rtmp_session_t *s)\n{\n    ngx_live_relay_static_ctx_t        *ctx;\n    ngx_live_relay_ctx_t               *rctx;\n\n    rctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (rctx == NULL || rctx->tag != &ngx_live_relay_static_module) {\n        goto next;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_static_module);\n\n    if (ngx_live_relay_static_relay(s, ctx->relay) == NGX_OK) {\n        return NGX_OK;\n    }\n\nnext:\n    return next_pull(s);\n}\n\n\nstatic ngx_live_relay_static_relay_t *\nngx_live_relay_get_static_relay(ngx_live_relay_static_main_conf_t *rsmcf)\n{\n    ngx_live_relay_static_relay_t      *r;\n\n    r = rsmcf->free;\n    if (r) {\n        rsmcf->free = r->next;\n        r->session = NULL;\n        r->next = NULL;\n\n        --rsmcf->nfree;\n    } else {\n        r = ngx_pcalloc(ngx_cycle->pool, sizeof(ngx_live_relay_static_relay_t));\n        if (r == NULL) {\n            return NULL;\n        }\n\n        ++rsmcf->nalloc;\n    }\n\n    return r;\n}\n\n\nstatic void\nngx_live_relay_put_static_relay(ngx_live_relay_static_main_conf_t *rsmcf,\n        ngx_live_relay_static_relay_t *r)\n{\n    r->next = rsmcf->free;\n    rsmcf->free = r;\n    ++rsmcf->nfree;\n}\n\n\nstatic void *\nngx_live_relay_static_create_main_conf(ngx_conf_t *cf)\n{\n    ngx_live_relay_static_main_conf_t  *rsmcf;\n\n    rsmcf = ngx_pcalloc(cf->pool, sizeof(ngx_live_relay_static_main_conf_t));\n    if (rsmcf == NULL) {\n        return NULL;\n    }\n\n    rsmcf->used = 1;\n\n    ngx_map_init(&rsmcf->pulls[0], ngx_map_hash_str, ngx_cmp_str);\n    ngx_map_init(&rsmcf->pulls[1], ngx_map_hash_str, ngx_cmp_str);\n\n    return rsmcf;\n}\n\n\nstatic char *\nngx_live_relay_static_init_main_conf(ngx_conf_t *cf, void *conf)\n{\n    ngx_live_relay_static_main_conf_t  *rsmcf;\n\n    rsmcf = conf;\n\n    if (rsmcf->pull_port.len == 0) {\n        rsmcf->pull_port.data = (u_char *) \"1935\";\n        rsmcf->pull_port.len = sizeof(\"1935\") - 1;\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic void *\nngx_live_relay_static_create_main_dconf(ngx_conf_t *cf)\n{\n    ngx_live_relay_static_main_dconf_t *rsmdcf;\n\n    rsmdcf = ngx_pcalloc(cf->pool, sizeof(ngx_live_relay_static_main_dconf_t));\n    if (rsmdcf == NULL) {\n        return NULL;\n    }\n\n    if (ngx_array_init(&rsmdcf->pulls, cf->pool, 64, sizeof(ngx_live_relay_t))\n            != NGX_OK)\n    {\n        return NULL;\n    }\n\n    return rsmdcf;\n}\n\n\n// merge all static pull into ngx_live_relay_static_main_conf_t;\nstatic char *\nngx_live_relay_static_init_main_dconf(ngx_conf_t *cf, void *conf)\n{\n    ngx_live_relay_static_main_conf_t  *rsmcf;\n    ngx_live_relay_static_main_dconf_t *rsmdcf;\n    ngx_core_conf_t                    *ccf;\n    ngx_live_relay_t                   *relay;\n    ngx_live_relay_static_relay_t      *srelay, *old, *sl, *sln, **sll;\n    ngx_live_relay_static_ctx_t        *ctx;\n    ngx_live_relay_ctx_t               *rctx;\n    ngx_map_node_t                     *node;\n    unsigned                            used;\n    char                               *rc;\n    ngx_uint_t                          i, hash;\n\n    rsmdcf = conf;\n    rsmcf = ngx_rtmp_cycle_get_module_main_conf(ngx_cycle,\n                                                ngx_live_relay_static_module);\n    ccf = (ngx_core_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                           ngx_core_module);\n\n    used = rsmcf->used? 0: 1;\n    sl = NULL;\n    sll = &sl;\n\n    relay = rsmdcf->pulls.elts;\n    for (i = 0; i < rsmdcf->pulls.nelts; ++i, ++relay) {\n        // should static pull in current process?\n        if (ngx_process == NGX_PROCESS_WORKER) {\n            hash = ngx_hash_key_lc(relay->stream.data, relay->stream.len);\n            if (hash % ccf->worker_processes != ngx_worker) {\n                continue;\n            }\n        }\n\n        // check static pull duplicate\n        node = ngx_map_find(&rsmcf->pulls[used], (intptr_t) &relay->stream);\n        if (node) {\n            rc = \"duplicate static pull\";\n            goto error;\n        }\n\n        srelay = ngx_live_relay_get_static_relay(rsmcf);\n        if (srelay == NULL) {\n            rc = \"get static relay failed\";\n            goto error;\n        }\n        srelay->relay = relay;\n        srelay->node.raw_key = (intptr_t) &relay->stream;\n        ngx_map_insert(&rsmcf->pulls[used], &srelay->node, 0);\n\n        // check static pull is exist\n        node = ngx_map_find(&rsmcf->pulls[rsmcf->used],\n                            (intptr_t) &relay->stream);\n        if (node) {\n            old = (ngx_live_relay_static_relay_t *) node;\n            srelay->session = old->session;\n\n            // link swap static pull\n            *sll = old;\n            sll = &(*sll)->next;\n        }\n    }\n\n    // delete swap static pull from old\n    while (sl) {\n        sln = sl;\n        sl = sl->next;\n        ngx_map_delete(&rsmcf->pulls[rsmcf->used],\n                       (intptr_t) &sln->relay->stream);\n        ngx_live_relay_put_static_relay(rsmcf, sln);\n    }\n\n    // stop deleted static pull\n    node = ngx_map_begin(&rsmcf->pulls[rsmcf->used]);\n    while (node) {\n        srelay = (ngx_live_relay_static_relay_t *) node;\n        node = ngx_map_next(node);\n        ngx_live_relay_put_static_relay(rsmcf, srelay);\n\n        rctx = ngx_rtmp_get_module_ctx(srelay->session, ngx_live_relay_module);\n        rctx->giveup = 1;\n        srelay->session->finalize_reason = NGX_LIVE_NORMAL_CLOSE;\n        ngx_rtmp_finalize_session(srelay->session);\n\n        ngx_map_delete(&rsmcf->pulls[rsmcf->used],\n                       (intptr_t) &srelay->relay->stream);\n    }\n\n    // new static relay\n    node = ngx_map_begin(&rsmcf->pulls[used]);\n    for (; node; node = ngx_map_next(node)) {\n        srelay = (ngx_live_relay_static_relay_t *) node;\n        if (srelay->session == NULL) {\n            ngx_live_relay_static_relay(NULL, srelay);\n        } else {\n            ctx = ngx_rtmp_get_module_ctx(srelay->session,\n                                          ngx_live_relay_static_module);\n            ctx->relay = srelay;\n        }\n    }\n\n    rsmcf->used = used;\n\n    return NGX_CONF_OK;\n\nerror:\n    // recycle static relay resource\n    node = ngx_map_begin(&rsmcf->pulls[used]);\n    while (node) {\n        srelay = (ngx_live_relay_static_relay_t *) node;\n        node = ngx_map_next(node);\n        ngx_live_relay_put_static_relay(rsmcf, srelay);\n\n        ngx_map_delete(&rsmcf->pulls[used],\n                       (intptr_t) &srelay->relay->stream);\n    }\n\n    return rc;\n}\n\n\nstatic char *\nngx_live_relay_pull(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_live_relay_static_main_dconf_t *rsmdcf;\n    ngx_live_relay_t                   *relay;\n    ngx_live_relay_url_t               *url;\n    ngx_str_t                          *value, n, v;\n    ngx_uint_t                          i;\n    u_char                             *p;\n\n    rsmdcf = conf;\n\n    relay = ngx_array_push(&rsmdcf->pulls);\n    if (relay == NULL) {\n        return NGX_CONF_ERROR;\n    }\n    ngx_memzero(relay, sizeof(ngx_live_relay_t));\n\n    relay->tag = &ngx_live_relay_static_module;\n\n    if (ngx_array_init(&relay->urls, cf->pool, 8, sizeof(ngx_live_relay_url_t))\n            != NGX_OK)\n    {\n        return NGX_CONF_ERROR;\n    }\n\n    value = cf->args->elts;\n    ++value;\n\n    for (i = 1; i < cf->args->nelts; ++i, ++value) {\n        if (ngx_strncasecmp(value->data, (u_char *) \"rtmp://\", 7) == 0\n            || ngx_strncasecmp(value->data, (u_char *) \"http://\", 7) == 0)\n        {\n            url = ngx_array_push(&relay->urls);\n            if (url == NULL) {\n                return NGX_CONF_ERROR;\n            }\n            ngx_memzero(url, sizeof(ngx_live_relay_url_t));\n\n            if (value->data[0] == 'h') {\n                url->relay_type = NGX_LIVE_RELAY_HTTPFLV;\n            } else {\n                url->relay_type = NGX_LIVE_RELAY_RTMP;\n            }\n\n            if (ngx_parse_request_url(&url->url, value) != NGX_OK) {\n                return NGX_CONF_ERROR;\n            }\n\n            url->port = ngx_request_port(&url->url.scheme, &url->url.port);\n            if (url->port == 0) {\n                return \"invalid port\";\n            }\n\n            ngx_dynamic_resolver_add_domain(&url->url.host, cf->cycle);\n\n            continue;\n        }\n\n        p = ngx_strlchr(value->data, value->data + value->len, '=');\n\n        if (p == NULL) {\n            return \"unsupported parameter format\";\n        } else {\n            n.data = value->data;\n            n.len = p - value->data;\n\n            v.data = p + 1;\n            v.len = value->data + value->len - v.data;\n        }\n\n#define NGX_LIVE_RELAY_STR_PAR(name, var)                               \\\n        if (n.len == sizeof(name) - 1                                   \\\n            && ngx_strncasecmp(n.data, (u_char *) name, n.len) == 0)    \\\n        {                                                               \\\n            relay->var = v;                                             \\\n            continue;                                                   \\\n        }\n\n        NGX_LIVE_RELAY_STR_PAR(\"domain\",        domain);\n        NGX_LIVE_RELAY_STR_PAR(\"app\",           app);\n        NGX_LIVE_RELAY_STR_PAR(\"name\",          name);\n        NGX_LIVE_RELAY_STR_PAR(\"pargs\",         pargs);\n        NGX_LIVE_RELAY_STR_PAR(\"referer\",       referer);\n        NGX_LIVE_RELAY_STR_PAR(\"user_agent\",    user_agent);\n\n#undef NGX_LIVE_RELAY_STR_PAR\n\n        return \"unsupported parameter\";\n    }\n\n    if (relay->domain.len == 0) {\n        return \"domain not configured\";\n    }\n\n    if (relay->app.len == 0) {\n        return \"app not configured\";\n    }\n\n    if (relay->name.len == 0) {\n        return \"name not configured\";\n    }\n\n    // domain/app/name\n    relay->stream.len = relay->domain.len + 1 + relay->app.len + 1\n                      + relay->name.len;\n    relay->stream.data = ngx_pcalloc(cf->pool, relay->stream.len);\n    if (relay->stream.data == NULL) {\n        return NGX_CONF_ERROR;\n    }\n    ngx_snprintf(relay->stream.data, relay->stream.len, \"%V/%V/%V\",\n            &relay->domain, &relay->app, &relay->name);\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_live_relay_static_postconfiguration(ngx_conf_t *cf)\n{\n    next_pull = ngx_live_pull;\n    ngx_live_pull = ngx_live_relay_static_pull;\n\n    return NGX_OK;\n}\n\n\nngx_chain_t *\nngx_live_relay_static_state(ngx_http_request_t *r)\n{\n    ngx_live_relay_static_main_conf_t  *rsmcf;\n    ngx_chain_t                        *cl;\n    ngx_buf_t                          *b;\n    size_t                              len;\n\n    rsmcf = ngx_rtmp_cycle_get_module_main_conf(ngx_cycle,\n                                                ngx_live_relay_static_module);\n\n    len = sizeof(\"##########rtmp live relay static##########\\n\") - 1\n        + sizeof(\"relay_static alloc frame: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"relay_static free frame: \\n\") - 1 + NGX_OFF_T_LEN;\n\n    cl = ngx_alloc_chain_link(r->pool);\n    if (cl == NULL) {\n        return NULL;\n    }\n    cl->next = NULL;\n\n    b = ngx_create_temp_buf(r->pool, len);\n    if (b == NULL) {\n        return NULL;\n    }\n    cl->buf = b;\n\n    b->last = ngx_snprintf(b->last, len,\n            \"##########rtmp live relay static##########\\n\"\n            \"relay_static alloc frame: %ui\\n\"\n            \"relay_static free frame: %ui\\n\",\n            rsmcf->nalloc, rsmcf->nfree);\n\n    return cl;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_netcall.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include \"ngx_netcall.h\"\n#include \"ngx_poold.h\"\n\n\n// cleanup only be called when connect failed(exclusive timeout)\nstatic void\nngx_netcall_cleanup(void *data)\n{\n    ngx_netcall_ctx_t          *nctx;\n\n    nctx = data;\n\n    if (nctx->ev.timer_set) {\n        ngx_del_timer(&nctx->ev);\n    }\n\n    if (nctx->ev.posted) {\n        ngx_delete_posted_event(&nctx->ev);\n    }\n\n    if (nctx->hcr) {\n        ngx_http_client_detach(nctx->hcr);\n        nctx->handler(nctx, NGX_ERROR);\n        nctx->hcr = NULL;\n    }\n}\n\n// netcall timeout\nstatic void\nngx_netcall_timeout(ngx_event_t *ev)\n{\n    ngx_netcall_ctx_t          *nctx;\n\n    nctx = ev->data;\n\n    if (nctx->ev.timer_set) {\n        ngx_del_timer(&nctx->ev);\n    }\n\n    if (nctx->ev.posted) {\n        ngx_delete_posted_event(&nctx->ev);\n    }\n\n    if (nctx->hcr) {\n        ngx_http_client_detach(nctx->hcr);\n        nctx->handler(nctx, NGX_ERROR);\n        nctx->hcr = NULL;\n    }\n}\n\nstatic void\nngx_netcall_handler(void *data, ngx_http_request_t *hcr)\n{\n    ngx_netcall_ctx_t          *nctx;\n    ngx_int_t                   code;\n\n    nctx = data;\n\n    if (nctx->ev.timer_set) {\n        ngx_del_timer(&nctx->ev);\n    }\n\n    if (nctx->ev.posted) {\n        ngx_delete_posted_event(&nctx->ev);\n    }\n\n    code = ngx_http_client_status_code(hcr);\n\n    if (nctx->hcr) {\n        ngx_http_client_detach(nctx->hcr);\n        nctx->handler(nctx, code);\n        nctx->hcr = NULL;\n    }\n}\n\nstatic void\nngx_netcall_destroy_handler(ngx_event_t *ev)\n{\n    ngx_netcall_ctx_t          *nctx;\n\n    nctx = ev->data;\n\n    NGX_DESTROY_POOL(nctx->pool);\n}\n\nngx_netcall_ctx_t *\nngx_netcall_create_ctx(ngx_uint_t type, ngx_str_t *groupid, ngx_uint_t stage,\n        ngx_msec_t timeout, ngx_msec_t update, ngx_uint_t idx)\n{\n    ngx_netcall_ctx_t          *ctx;\n    ngx_pool_t                 *pool;\n\n    pool = NGX_CREATE_POOL(4096, ngx_cycle->log);\n    if (pool == NULL) {\n        return NULL;\n    }\n\n    ctx = ngx_pcalloc(pool, sizeof(ngx_netcall_ctx_t));\n    if (ctx == NULL) {\n        NGX_DESTROY_POOL(pool);\n        return NULL;\n    }\n\n    ctx->url.data = ngx_pcalloc(pool, NGX_NETCALL_MAX_URL_LEN);\n    if (ctx->url.data == NULL) {\n        NGX_DESTROY_POOL(pool);\n        return NULL;\n    }\n\n    ctx->pool = pool;\n\n    ctx->idx = idx;\n    ctx->type = type;\n\n    ctx->groupid.len = groupid->len;\n    ctx->groupid.data = ngx_pcalloc(pool, ctx->groupid.len);\n    if (ctx->groupid.data == NULL) {\n        NGX_DESTROY_POOL(pool);\n        return NULL;\n    }\n    ngx_memcpy(ctx->groupid.data, groupid->data, groupid->len);\n\n    ctx->ev.log = ngx_cycle->log;\n    ctx->ev.data = ctx;\n\n    ctx->stage = stage;\n    ctx->timeout = timeout;\n    ctx->update = update;\n\n    return ctx;\n}\n\nvoid\nngx_netcall_create(ngx_netcall_ctx_t *nctx, ngx_log_t *log)\n{\n    ngx_http_request_t         *hcr;\n    ngx_http_cleanup_t         *cln;\n\n    hcr = ngx_http_client_get(log, &nctx->url, NULL, nctx);\n    if (hcr == NULL) {\n        return;\n    }\n\n    ngx_http_client_set_read_handler(hcr, ngx_netcall_handler);\n\n    cln = ngx_http_client_cleanup_add(hcr, 0);\n    if (cln == NULL) {\n        ngx_log_error(NGX_LOG_ERR, log, 0,\n                \"netcall create add cleanup failed\");\n        return;\n    }\n    cln->handler = ngx_netcall_cleanup;\n    cln->data = nctx;\n\n    // detach old http client request\n    if (nctx->hcr) {\n        ngx_http_client_detach(nctx->hcr);\n    }\n\n    nctx->hcr = hcr;\n\n    nctx->ev.log = log;\n    nctx->ev.handler = ngx_netcall_timeout;\n    ngx_add_timer(&nctx->ev, nctx->timeout);\n}\n\nvoid\nngx_netcall_destroy(ngx_netcall_ctx_t *nctx)\n{\n    if (nctx->ev.timer_set) {\n        ngx_del_timer(&nctx->ev);\n    }\n\n    if (nctx->ev.posted) {\n        ngx_delete_posted_event(&nctx->ev);\n    }\n\n    if (nctx->hcr) { // use detach will keep client connection alive\n        ngx_http_client_detach(nctx->hcr);\n        nctx->hcr = NULL;\n    }\n\n    // destroy may called in nctx->handler\n    // destroy pool may cause memory error\n    // so we destroy nctx pool asynchronous\n    nctx->ev.handler = ngx_netcall_destroy_handler;\n    // reset ev log, use rtmp session log may be destroy\n    nctx->ev.log = ngx_cycle->log;\n    ngx_post_event(&nctx->ev, &ngx_posted_events);\n}\n\nngx_str_t *\nngx_netcall_header(ngx_netcall_ctx_t *nctx, ngx_str_t *key)\n{\n    ngx_http_request_t         *hcr;\n\n    hcr = nctx->hcr;\n\n    return ngx_http_client_header_in(hcr, key);\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_netcall.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_NETCALL_H_INCLUDE_\n#define _NGX_NETCALL_H_INCLUDE_\n\n\n#include <ngx_core.h>\n#include \"ngx_http_client.h\"\n\n\n#define NGX_NETCALL_MAX_URL_LEN     2048\n\ntypedef struct ngx_netcall_ctx_s  ngx_netcall_ctx_t;\n\ntypedef void (* ngx_netcall_handler_pt)(ngx_netcall_ctx_t *ctx, ngx_int_t code);\n\nstruct ngx_netcall_ctx_s {\n    ngx_pool_t                 *pool;\n\n    ngx_str_t                   url;\n\n    ngx_uint_t                  idx;\n    ngx_uint_t                  type;\n    ngx_str_t                   groupid;\n    ngx_uint_t                  stage;\n    ngx_msec_t                  timeout;\n    ngx_msec_t                  update;\n\n    ngx_event_t                 ev;\n    ngx_http_request_t         *hcr;\n    ngx_netcall_handler_pt      handler;\n    void                       *data;\n};\n\n\nngx_netcall_ctx_t *ngx_netcall_create_ctx(ngx_uint_t type, ngx_str_t *groupid,\n    ngx_uint_t stage, ngx_msec_t timeout, ngx_msec_t update, ngx_uint_t idx);\n\nvoid ngx_netcall_create(ngx_netcall_ctx_t *nctx, ngx_log_t *log);\nvoid ngx_netcall_destroy(ngx_netcall_ctx_t *nctx);\nngx_str_t *ngx_netcall_header(ngx_netcall_ctx_t *nctx, ngx_str_t *key);\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_event.h>\n#include <nginx.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_variables.h\"\n\n\nstatic char *ngx_rtmp_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\nstatic ngx_int_t ngx_rtmp_optimize_servers(ngx_conf_t *cf,\n    ngx_rtmp_core_main_conf_t *cmcf, ngx_array_t *ports);\nstatic ngx_int_t ngx_rtmp_add_addrs(ngx_conf_t *cf, ngx_rtmp_port_t *mport,\n    ngx_rtmp_conf_addr_t *addr);\n#if (NGX_HAVE_INET6)\nstatic ngx_int_t ngx_rtmp_add_addrs6(ngx_conf_t *cf, ngx_rtmp_port_t *mport,\n    ngx_rtmp_conf_addr_t *addr);\n#endif\nstatic ngx_int_t ngx_rtmp_cmp_conf_addrs(const void *one, const void *two);\nstatic ngx_int_t ngx_rtmp_init_events(ngx_conf_t *cf,\n        ngx_rtmp_core_main_conf_t *cmcf);\nstatic ngx_int_t ngx_rtmp_init_event_handlers(ngx_conf_t *cf,\n        ngx_rtmp_core_main_conf_t *cmcf);\nstatic char * ngx_rtmp_merge_applications(ngx_conf_t *cf,\n        ngx_array_t *applications, void **app_conf, ngx_rtmp_module_t *module,\n        ngx_uint_t ctx_index);\nstatic ngx_int_t ngx_rtmp_init_process(ngx_cycle_t *cycle);\n\n\n#if (nginx_version >= 1007011)\nngx_queue_t                         ngx_rtmp_init_queue;\n#elif (nginx_version >= 1007005)\nngx_thread_volatile ngx_queue_t     ngx_rtmp_init_queue;\n#else\nngx_thread_volatile ngx_event_t    *ngx_rtmp_init_queue;\n#endif\n\nngx_int_t NGX_RTMP_HEVC_CODEC_ID = NGX_RTMP_VIDEO_H265;\n\nngx_uint_t  ngx_rtmp_max_module;\n\n\nstatic ngx_command_t  ngx_rtmp_commands[] = {\n\n    { ngx_string(\"rtmp\"),\n      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,\n      ngx_rtmp_block,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_core_module_t  ngx_rtmp_module_ctx = {\n    ngx_string(\"rtmp\"),\n    NULL,\n    NULL\n};\n\n\nngx_module_t  ngx_rtmp_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_module_ctx,                  /* module context */\n    ngx_rtmp_commands,                     /* module directives */\n    NGX_CORE_MODULE,                       /* module type */\n    NULL,                                  /* init master */\n    NULL,                                  /* init module */\n    ngx_rtmp_init_process,                 /* init process */\n    NULL,                                  /* init thread */\n    NULL,                                  /* exit thread */\n    NULL,                                  /* exit process */\n    NULL,                                  /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic char *\nngx_rtmp_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    char                        *rv;\n    ngx_uint_t                   m, mi, s;\n    ngx_conf_t                   pcf;\n    ngx_array_t                  ports;\n    ngx_module_t               **modules;\n    ngx_rtmp_module_t           *module;\n    ngx_rtmp_conf_ctx_t         *ctx;\n    ngx_rtmp_core_srv_conf_t    *cscf, **cscfp;\n    ngx_rtmp_core_main_conf_t   *cmcf;\n\n    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_conf_ctx_t));\n    if (ctx == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    *(ngx_rtmp_conf_ctx_t **) conf = ctx;\n\n    /* count the number of the rtmp modules and set up their indices */\n\n#if (nginx_version >= 1009011)\n\n    ngx_rtmp_max_module = ngx_count_modules(cf->cycle, NGX_RTMP_MODULE);\n\n#else\n\n    ngx_rtmp_max_module = 0;\n    for (m = 0; ngx_modules[m]; m++) {\n        if (ngx_modules[m]->type != NGX_RTMP_MODULE) {\n            continue;\n        }\n\n        ngx_modules[m]->ctx_index = ngx_rtmp_max_module++;\n    }\n\n#endif\n\n\n    /* the rtmp main_conf context, it is the same in the all rtmp contexts */\n\n    ctx->main_conf = ngx_pcalloc(cf->pool,\n                                 sizeof(void *) * ngx_rtmp_max_module);\n    if (ctx->main_conf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n\n    /*\n     * the rtmp null srv_conf context, it is used to merge\n     * the server{}s' srv_conf's\n     */\n\n    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_rtmp_max_module);\n    if (ctx->srv_conf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n\n    /*\n     * the rtmp null app_conf context, it is used to merge\n     * the server{}s' app_conf's\n     */\n\n    ctx->app_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_rtmp_max_module);\n    if (ctx->app_conf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n\n    /*\n     * create the main_conf's, the null srv_conf's, and the null app_conf's\n     * of the all rtmp modules\n     */\n\n#if (nginx_version >= 1009011)\n    modules = cf->cycle->modules;\n#else\n    modules = ngx_modules;\n#endif\n\n    for (m = 0; modules[m]; m++) {\n        if (modules[m]->type != NGX_RTMP_MODULE) {\n            continue;\n        }\n\n        module = modules[m]->ctx;\n        mi = modules[m]->ctx_index;\n\n        if (module->create_main_conf) {\n            ctx->main_conf[mi] = module->create_main_conf(cf);\n            if (ctx->main_conf[mi] == NULL) {\n                return NGX_CONF_ERROR;\n            }\n        }\n\n        if (module->create_srv_conf) {\n            ctx->srv_conf[mi] = module->create_srv_conf(cf);\n            if (ctx->srv_conf[mi] == NULL) {\n                return NGX_CONF_ERROR;\n            }\n        }\n\n        if (module->create_app_conf) {\n            ctx->app_conf[mi] = module->create_app_conf(cf);\n            if (ctx->app_conf[mi] == NULL) {\n                return NGX_CONF_ERROR;\n            }\n        }\n    }\n\n    pcf = *cf;\n    cf->ctx = ctx;\n\n    for (m = 0; modules[m]; m++) {\n        if (modules[m]->type != NGX_RTMP_MODULE) {\n            continue;\n        }\n\n        module = modules[m]->ctx;\n\n        if (module->preconfiguration) {\n            if (module->preconfiguration(cf) != NGX_OK) {\n                return NGX_CONF_ERROR;\n            }\n        }\n    }\n\n    /* parse inside the rtmp{} block */\n\n    cf->module_type = NGX_RTMP_MODULE;\n    cf->cmd_type = NGX_RTMP_MAIN_CONF;\n    rv = ngx_conf_parse(cf, NULL);\n\n    if (rv != NGX_CONF_OK) {\n        *cf = pcf;\n        return rv;\n    }\n\n\n    /* init rtmp{} main_conf's, merge the server{}s' srv_conf's */\n\n    cmcf = ctx->main_conf[ngx_rtmp_core_module.ctx_index];\n    cscfp = cmcf->servers.elts;\n\n    for (m = 0; modules[m]; m++) {\n        if (modules[m]->type != NGX_RTMP_MODULE) {\n            continue;\n        }\n\n        module = modules[m]->ctx;\n        mi = modules[m]->ctx_index;\n\n        /* init rtmp{} main_conf's */\n\n        cf->ctx = ctx;\n\n        if (module->init_main_conf) {\n            rv = module->init_main_conf(cf, ctx->main_conf[mi]);\n            if (rv != NGX_CONF_OK) {\n                *cf = pcf;\n                return rv;\n            }\n        }\n\n        for (s = 0; s < cmcf->servers.nelts; s++) {\n\n            /* merge the server{}s' srv_conf's */\n\n            cf->ctx = cscfp[s]->ctx;\n\n            if (module->merge_srv_conf) {\n                rv = module->merge_srv_conf(cf,\n                                            ctx->srv_conf[mi],\n                                            cscfp[s]->ctx->srv_conf[mi]);\n                if (rv != NGX_CONF_OK) {\n                    *cf = pcf;\n                    return rv;\n                }\n            }\n\n            if (module->merge_app_conf) {\n\n                /* merge the server{}'s app_conf */\n\n                /*ctx->app_conf = cscfp[s]->ctx->loc_conf;*/\n\n                rv = module->merge_app_conf(cf,\n                                            ctx->app_conf[mi],\n                                            cscfp[s]->ctx->app_conf[mi]);\n                if (rv != NGX_CONF_OK) {\n                    *cf = pcf;\n                    return rv;\n                }\n\n                /* merge the applications{}' app_conf's */\n\n                cscf = cscfp[s]->ctx->srv_conf[ngx_rtmp_core_module.ctx_index];\n\n                rv = ngx_rtmp_merge_applications(cf, &cscf->applications,\n                                            cscfp[s]->ctx->app_conf,\n                                            module, mi);\n                if (rv != NGX_CONF_OK) {\n                    *cf = pcf;\n                    return rv;\n                }\n            }\n\n        }\n    }\n\n\n    if (ngx_rtmp_init_events(cf, cmcf) != NGX_OK) {\n        return NGX_CONF_ERROR;\n    }\n\n    for (m = 0; modules[m]; m++) {\n        if (modules[m]->type != NGX_RTMP_MODULE) {\n            continue;\n        }\n\n        module = modules[m]->ctx;\n\n        if (module->postconfiguration) {\n            if (module->postconfiguration(cf) != NGX_OK) {\n                return NGX_CONF_ERROR;\n            }\n        }\n    }\n\n    *cf = pcf;\n\n    if (ngx_rtmp_init_event_handlers(cf, cmcf) != NGX_OK) {\n        return NGX_CONF_ERROR;\n    }\n\n    if (ngx_array_init(&ports, cf->temp_pool, 4, sizeof(ngx_rtmp_conf_port_t))\n        != NGX_OK)\n    {\n        return NGX_CONF_ERROR;\n    }\n\n    if (ngx_rtmp_optimize_servers(cf, cmcf, cmcf->ports) != NGX_OK) {\n        return NGX_CONF_ERROR;\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic char *\nngx_rtmp_merge_applications(ngx_conf_t *cf, ngx_array_t *applications,\n            void **app_conf, ngx_rtmp_module_t *module, ngx_uint_t ctx_index)\n{\n    char                           *rv;\n    ngx_rtmp_conf_ctx_t            *ctx, saved;\n    ngx_rtmp_core_app_conf_t      **cacfp;\n    ngx_uint_t                      n;\n    ngx_rtmp_core_app_conf_t       *cacf;\n\n    if (applications == NULL) {\n        return NGX_CONF_OK;\n    }\n\n    ctx = (ngx_rtmp_conf_ctx_t *) cf->ctx;\n    saved = *ctx;\n\n    cacfp = applications->elts;\n    for (n = 0; n < applications->nelts; ++n, ++cacfp) {\n\n        ctx->app_conf = (*cacfp)->app_conf;\n\n        rv = module->merge_app_conf(cf, app_conf[ctx_index],\n                (*cacfp)->app_conf[ctx_index]);\n        if (rv != NGX_CONF_OK) {\n            return rv;\n        }\n\n        cacf = (*cacfp)->app_conf[ngx_rtmp_core_module.ctx_index];\n        rv = ngx_rtmp_merge_applications(cf, &cacf->applications,\n                                         (*cacfp)->app_conf,\n                                         module, ctx_index);\n        if (rv != NGX_CONF_OK) {\n            return rv;\n        }\n    }\n\n    *ctx = saved;\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_init_events(ngx_conf_t *cf, ngx_rtmp_core_main_conf_t *cmcf)\n{\n    size_t                      n;\n\n    for(n = 0; n < NGX_RTMP_MAX_EVENT; ++n) {\n        if (ngx_array_init(&cmcf->events[n], cf->pool, 1,\n                sizeof(ngx_rtmp_handler_pt)) != NGX_OK)\n        {\n            return NGX_ERROR;\n        }\n    }\n\n    if (ngx_array_init(&cmcf->amf, cf->pool, 1,\n                sizeof(ngx_rtmp_amf_handler_t)) != NGX_OK)\n    {\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_init_event_handlers(ngx_conf_t *cf, ngx_rtmp_core_main_conf_t *cmcf)\n{\n    ngx_hash_init_t             calls_hash;\n    ngx_rtmp_handler_pt        *eh;\n    ngx_rtmp_amf_handler_t     *h;\n    ngx_hash_key_t             *ha;\n    size_t                      n, m;\n\n    static size_t               pm_events[] = {\n        NGX_RTMP_MSG_CHUNK_SIZE,\n        NGX_RTMP_MSG_ABORT,\n        NGX_RTMP_MSG_ACK,\n        NGX_RTMP_MSG_ACK_SIZE,\n        NGX_RTMP_MSG_BANDWIDTH\n    };\n\n    static size_t               amf_events[] = {\n        NGX_RTMP_MSG_AMF_CMD,\n        NGX_RTMP_MSG_AMF_META,\n        NGX_RTMP_MSG_AMF_SHARED,\n        NGX_RTMP_MSG_AMF3_CMD,\n        NGX_RTMP_MSG_AMF3_META,\n        NGX_RTMP_MSG_AMF3_SHARED\n    };\n\n    /* init standard protocol events */\n    for(n = 0; n < sizeof(pm_events) / sizeof(pm_events[0]); ++n) {\n        eh = ngx_array_push(&cmcf->events[pm_events[n]]);\n        *eh = ngx_rtmp_protocol_message_handler;\n    }\n\n    /* init amf events */\n    for(n = 0; n < sizeof(amf_events) / sizeof(amf_events[0]); ++n) {\n        eh = ngx_array_push(&cmcf->events[amf_events[n]]);\n        *eh = ngx_rtmp_amf_message_handler;\n    }\n\n    /* init user protocol events */\n    eh = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_USER]);\n    *eh = ngx_rtmp_user_message_handler;\n\n    /* aggregate to audio/video map */\n    eh = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AGGREGATE]);\n    *eh = ngx_rtmp_aggregate_message_handler;\n\n    /* init amf callbacks */\n    ngx_array_init(&cmcf->amf_arrays, cf->pool, 1, sizeof(ngx_hash_key_t));\n\n    h = cmcf->amf.elts;\n    for(n = 0; n < cmcf->amf.nelts; ++n, ++h) {\n        ha = cmcf->amf_arrays.elts;\n        for(m = 0; m < cmcf->amf_arrays.nelts; ++m, ++ha) {\n            if (h->name.len == ha->key.len\n                    && !ngx_strncmp(h->name.data, ha->key.data, ha->key.len))\n            {\n                break;\n            }\n        }\n        if (m == cmcf->amf_arrays.nelts) {\n            ha = ngx_array_push(&cmcf->amf_arrays);\n            ha->key = h->name;\n            ha->key_hash = ngx_hash_key_lc(ha->key.data, ha->key.len);\n            ha->value = ngx_array_create(cf->pool, 1,\n                    sizeof(ngx_rtmp_handler_pt));\n            if (ha->value == NULL) {\n                return NGX_ERROR;\n            }\n        }\n\n        eh = ngx_array_push((ngx_array_t*)ha->value);\n        *eh = h->handler;\n    }\n\n    calls_hash.hash = &cmcf->amf_hash;\n    calls_hash.key = ngx_hash_key_lc;\n    calls_hash.max_size = 512;\n    calls_hash.bucket_size = ngx_cacheline_size;\n    calls_hash.name = \"amf_hash\";\n    calls_hash.pool = cf->pool;\n    calls_hash.temp_pool = NULL;\n\n    if (ngx_hash_init(&calls_hash, cmcf->amf_arrays.elts, cmcf->amf_arrays.nelts)\n            != NGX_OK)\n    {\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\n\n/* add the server core module configuration to the address:port */\n\nstatic ngx_int_t\nngx_rtmp_add_server(ngx_conf_t *cf, ngx_rtmp_core_srv_conf_t *cscf,\n    ngx_rtmp_conf_addr_t *addr)\n{\n    ngx_uint_t                  i;\n    ngx_rtmp_core_srv_conf_t  **server;\n\n    if (addr->servers.elts == NULL) {\n        if (ngx_array_init(&addr->servers, cf->temp_pool, 4,\n                           sizeof(ngx_rtmp_core_srv_conf_t *))\n            != NGX_OK)\n        {\n            return NGX_ERROR;\n        }\n\n    } else {\n        server = addr->servers.elts;\n        for (i = 0; i < addr->servers.nelts; i++) {\n            if (server[i] == cscf) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                   \"a duplicate listen %s\", addr->opt.addr);\n                return NGX_ERROR;\n            }\n        }\n    }\n\n    server = ngx_array_push(&addr->servers);\n    if (server == NULL) {\n        return NGX_ERROR;\n    }\n\n    *server = cscf;\n\n    return NGX_OK;\n}\n\n\n/*\n * add the server address, the server names and the server core module\n * configurations to the port list\n */\n\nstatic ngx_int_t\nngx_rtmp_add_address(ngx_conf_t *cf, ngx_rtmp_core_srv_conf_t *cscf,\n    ngx_rtmp_conf_port_t *port, ngx_rtmp_listen_opt_t *lsopt)\n{\n    ngx_rtmp_conf_addr_t  *addr;\n\n    if (port->addrs.elts == NULL) {\n        if (ngx_array_init(&port->addrs, cf->temp_pool, 4,\n                           sizeof(ngx_rtmp_conf_addr_t))\n            != NGX_OK)\n        {\n            return NGX_ERROR;\n        }\n    }\n\n    addr = ngx_array_push(&port->addrs);\n    if (addr == NULL) {\n        return NGX_ERROR;\n    }\n\n    addr->opt = *lsopt;\n    addr->hash.buckets = NULL;\n    addr->hash.size = 0;\n    addr->wc_head = NULL;\n    addr->wc_tail = NULL;\n#if (NGX_PCRE)\n    addr->nregex = 0;\n    addr->regex = NULL;\n#endif\n    addr->default_server = cscf;\n    addr->servers.elts = NULL;\n\n    return ngx_rtmp_add_server(cf, cscf, addr);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_add_addresses(ngx_conf_t *cf, ngx_rtmp_core_srv_conf_t *cscf,\n    ngx_rtmp_conf_port_t *port, ngx_rtmp_listen_opt_t *lsopt)\n{\n    ngx_uint_t             i, default_server, proxy_protocol;\n    ngx_rtmp_conf_addr_t  *addr;\n\n    /*\n     * we cannot compare whole sockaddr struct's as kernel\n     * may fill some fields in inherited sockaddr struct's\n     */\n\n    addr = port->addrs.elts;\n\n    for (i = 0; i < port->addrs.nelts; i++) {\n\n        if (ngx_cmp_sockaddr(lsopt->sockaddr, lsopt->socklen,\n                             addr[i].opt.sockaddr,\n                             addr[i].opt.socklen, 0)\n            != NGX_OK)\n        {\n            continue;\n        }\n\n        /* the address is already in the address list */\n\n        if (ngx_rtmp_add_server(cf, cscf, &addr[i]) != NGX_OK) {\n            return NGX_ERROR;\n        }\n\n        /* preserve default_server bit during listen options overwriting */\n        default_server = addr[i].opt.default_server;\n\n        proxy_protocol = lsopt->proxy_protocol || addr[i].opt.proxy_protocol;\n\n        if (lsopt->set) {\n\n            if (addr[i].opt.set) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                        \"duplicate listen options for %s\", addr[i].opt.addr);\n                return NGX_ERROR;\n            }\n\n            addr[i].opt = *lsopt;\n        }\n\n        /* check the duplicate \"default\" server for this address:port */\n\n        if (lsopt->default_server) {\n\n            if (default_server) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                        \"a duplicate default server for %s\", addr[i].opt.addr);\n                return NGX_ERROR;\n            }\n\n            default_server = 1;\n            addr[i].default_server = cscf;\n        }\n\n        addr[i].opt.default_server = default_server;\n        addr[i].opt.proxy_protocol = proxy_protocol;\n\n        return NGX_OK;\n    }\n\n    /* add the address to the addresses list that bound to this port */\n\n    return ngx_rtmp_add_address(cf, cscf, port, lsopt);\n}\n\n\nngx_int_t\nngx_rtmp_add_listen(ngx_conf_t *cf, ngx_rtmp_core_srv_conf_t *cscf,\n    ngx_rtmp_listen_opt_t *lsopt)\n{\n    in_port_t                   p;\n    ngx_uint_t                  i;\n    struct sockaddr            *sa;\n    ngx_rtmp_conf_port_t       *port;\n    ngx_rtmp_core_main_conf_t  *cmcf;\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    if (cmcf->ports == NULL) {\n        cmcf->ports = ngx_array_create(cf->temp_pool, 2,\n                                       sizeof(ngx_rtmp_conf_port_t));\n        if (cmcf->ports == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    sa = lsopt->sockaddr;\n    p = ngx_inet_get_port(sa);\n\n    port = cmcf->ports->elts;\n    for (i = 0; i < cmcf->ports->nelts; i++) {\n\n        if (p != port[i].port || sa->sa_family != port[i].family) {\n            continue;\n        }\n\n        /* a port is already in the port list */\n\n        return ngx_rtmp_add_addresses(cf, cscf, &port[i], lsopt);\n    }\n\n    /* add a port to the port list */\n\n    port = ngx_array_push(cmcf->ports);\n    if (port == NULL) {\n        return NGX_ERROR;\n    }\n\n    port->family = sa->sa_family;\n    port->port = p;\n    port->addrs.elts = NULL;\n\n    return ngx_rtmp_add_address(cf, cscf, port, lsopt);\n}\n\n\nstatic int ngx_libc_cdecl\nngx_rtmp_cmp_dns_wildcards(const void *one, const void *two)\n{\n    ngx_hash_key_t  *first, *second;\n\n    first = (ngx_hash_key_t *) one;\n    second = (ngx_hash_key_t *) two;\n\n    return ngx_dns_strcmp(first->key.data, second->key.data);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_server_names(ngx_conf_t *cf, ngx_rtmp_core_main_conf_t *cmcf,\n    ngx_rtmp_conf_addr_t *addr)\n{\n    ngx_int_t                   rc;\n    ngx_uint_t                  n, s;\n    ngx_hash_init_t             hash;\n    ngx_hash_keys_arrays_t      ha;\n    ngx_rtmp_server_name_t     *name;\n    ngx_rtmp_core_srv_conf_t  **cscfp;\n#if (NGX_PCRE)\n    ngx_uint_t                  regex, i;\n\n    regex = 0;\n#endif\n\n    ngx_memzero(&ha, sizeof(ngx_hash_keys_arrays_t));\n\n    ha.temp_pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);\n    if (ha.temp_pool == NULL) {\n        return NGX_ERROR;\n    }\n\n    ha.pool = cf->pool;\n\n    if (ngx_hash_keys_array_init(&ha, NGX_HASH_LARGE) != NGX_OK) {\n        goto failed;\n    }\n\n    cscfp = addr->servers.elts;\n\n    for (s = 0; s < addr->servers.nelts; s++) {\n\n        name = cscfp[s]->server_names.elts;\n\n        for (n = 0; n < cscfp[s]->server_names.nelts; n++) {\n\n#if (NGX_PCRE)\n            if (name[n].regex) {\n                regex++;\n                continue;\n            }\n#endif\n\n            rc = ngx_hash_add_key(&ha, &name[n].name, name[n].server,\n                                  NGX_HASH_WILDCARD_KEY);\n\n            if (rc == NGX_ERROR) {\n                return NGX_ERROR;\n            }\n\n            if (rc == NGX_DECLINED) {\n                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,\n                              \"invalid server name or wildcard \\\"%V\\\" on %s\",\n                              &name[n].name, addr->opt.addr);\n                return NGX_ERROR;\n            }\n\n            if (rc == NGX_BUSY) {\n                ngx_log_error(NGX_LOG_WARN, cf->log, 0,\n                              \"conflicting server name \\\"%V\\\" on %s, ignored\",\n                              &name[n].name, addr->opt.addr);\n            }\n        }\n    }\n\n    hash.key = ngx_hash_key_lc;\n    hash.max_size = cmcf->server_names_hash_max_size;\n    hash.bucket_size = cmcf->server_names_hash_bucket_size;\n    hash.name = \"rtmp_server_names_hash\";\n    hash.pool = cf->pool;\n\n    if (ha.keys.nelts) {\n        hash.hash = &addr->hash;\n        hash.temp_pool = NULL;\n\n        if (ngx_hash_init(&hash, ha.keys.elts, ha.keys.nelts) != NGX_OK) {\n            goto failed;\n        }\n    }\n\n    if (ha.dns_wc_head.nelts) {\n\n        ngx_qsort(ha.dns_wc_head.elts, (size_t) ha.dns_wc_head.nelts,\n                  sizeof(ngx_hash_key_t), ngx_rtmp_cmp_dns_wildcards);\n\n        hash.hash = NULL;\n        hash.temp_pool = ha.temp_pool;\n\n        if (ngx_hash_wildcard_init(&hash, ha.dns_wc_head.elts,\n                                   ha.dns_wc_head.nelts)\n            != NGX_OK)\n        {\n            goto failed;\n        }\n\n        addr->wc_head = (ngx_hash_wildcard_t *) hash.hash;\n    }\n\n    if (ha.dns_wc_tail.nelts) {\n\n        ngx_qsort(ha.dns_wc_tail.elts, (size_t) ha.dns_wc_tail.nelts,\n                  sizeof(ngx_hash_key_t), ngx_rtmp_cmp_dns_wildcards);\n\n        hash.hash = NULL;\n        hash.temp_pool = ha.temp_pool;\n\n        if (ngx_hash_wildcard_init(&hash, ha.dns_wc_tail.elts,\n                                   ha.dns_wc_tail.nelts)\n            != NGX_OK)\n        {\n            goto failed;\n        }\n\n        addr->wc_tail = (ngx_hash_wildcard_t *) hash.hash;\n    }\n\n    ngx_destroy_pool(ha.temp_pool);\n\n#if (NGX_PCRE)\n\n    if (regex == 0) {\n        return NGX_OK;\n    }\n\n    addr->nregex = regex;\n    addr->regex = ngx_palloc(cf->pool, regex * sizeof(ngx_rtmp_server_name_t));\n    if (addr->regex == NULL) {\n        return NGX_ERROR;\n    }\n\n    i = 0;\n\n    for (s = 0; s < addr->servers.nelts; s++) {\n\n        name = cscfp[s]->server_names.elts;\n\n        for (n = 0; n < cscfp[s]->server_names.nelts; n++) {\n            if (name[n].regex) {\n                addr->regex[i++] = name[n];\n            }\n        }\n    }\n\n#endif\n\n    return NGX_OK;\n\nfailed:\n\n    ngx_destroy_pool(ha.temp_pool);\n\n    return NGX_ERROR;\n}\n\n\nstatic ngx_listening_t *\nngx_rtmp_add_listening(ngx_conf_t *cf, ngx_rtmp_conf_addr_t *addr)\n{\n    ngx_listening_t           *ls;\n\n    ls = ngx_create_listening(cf, addr->opt.sockaddr,\n                              addr->opt.socklen);\n    if (ls == NULL) {\n        return NULL;\n    }\n\n    ls->addr_ntop = 1;\n    ls->handler = ngx_rtmp_init_connection;\n    ls->pool_size = 4096;\n\n    /* TODO: error_log directive */\n    ls->logp = &cf->cycle->new_log;\n    ls->log.data = &ls->addr_text;\n    ls->log.handler = ngx_accept_log_error;\n\n    ls->keepalive = addr->opt.so_keepalive;\n#if (NGX_HAVE_KEEPALIVE_TUNABLE)\n    ls->keepidle = addr->opt.tcp_keepidle;\n    ls->keepintvl = addr->opt.tcp_keepintvl;\n    ls->keepcnt = addr->opt.tcp_keepcnt;\n#endif\n\n#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)\n    ls->ipv6only = addr->opt.ipv6only;\n#endif\n\n#if (NGX_HAVE_REUSEPORT)\n    ls->reuseport = addr->opt.reuseport;\n#endif\n\n    return ls;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_init_listening(ngx_conf_t *cf, ngx_rtmp_conf_port_t *port)\n{\n    ngx_uint_t                 i, last, bind_wildcard;\n    ngx_listening_t           *ls;\n    ngx_rtmp_port_t           *mport;\n    ngx_rtmp_conf_addr_t      *addr;\n\n    addr = port->addrs.elts;\n    last = port->addrs.nelts;\n\n    /*\n     * If there is a binding to an \"*:port\" then we need to bind() to\n     * the \"*:port\" only and ignore other implicit bindings.  The bindings\n     * have been already sorted: explicit bindings are on the start, then\n     * implicit bindings go, and wildcard binding is in the end.\n     */\n\n    if (addr[last - 1].opt.wildcard) {\n        addr[last - 1].opt.bind = 1;\n        bind_wildcard = 1;\n\n    } else {\n        bind_wildcard = 0;\n    }\n\n    i = 0;\n\n    while (i < last) {\n\n        if (bind_wildcard && !addr[i].opt.bind) {\n            i++;\n            continue;\n        }\n\n        ls = ngx_rtmp_add_listening(cf, &addr[i]);\n        if (ls == NULL) {\n            return NGX_ERROR;\n        }\n\n        mport = ngx_palloc(cf->pool, sizeof(ngx_rtmp_port_t));\n        if (mport == NULL) {\n            return NGX_ERROR;\n        }\n\n        ls->servers = mport;\n\n        if (i == last - 1) {\n            mport->naddrs = last;\n\n        } else {\n            mport->naddrs = 1;\n            i = 0;\n        }\n\n        switch (ls->sockaddr->sa_family) {\n#if (NGX_HAVE_INET6)\n            case AF_INET6:\n                if (ngx_rtmp_add_addrs6(cf, mport, addr) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n                break;\n#endif\n            default: /* AF_INET */\n                if (ngx_rtmp_add_addrs(cf, mport, addr) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n                break;\n        }\n\n#if nginx_version < 1015002\n        if (ngx_clone_listening(cf, ls) != NGX_OK) {\n#else \n        if (ngx_clone_listening(cf->cycle, ls) != NGX_OK) {\n#endif\n            return NGX_ERROR;\n        }\n\n        addr++;\n        last--;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_optimize_servers(ngx_conf_t *cf, ngx_rtmp_core_main_conf_t *cmcf,\n        ngx_array_t *ports)\n{\n    ngx_uint_t             i, p;\n    ngx_rtmp_conf_port_t  *port;\n    ngx_rtmp_conf_addr_t  *addr;\n\n    if (ports == NULL) {\n        return NGX_OK;\n    }\n\n    port = ports->elts;\n    for (p = 0; p < ports->nelts; p++) {\n\n        ngx_sort(port[p].addrs.elts, (size_t) port[p].addrs.nelts,\n                 sizeof(ngx_rtmp_conf_addr_t), ngx_rtmp_cmp_conf_addrs);\n\n        /*\n         * check whether all name-based servers have the same\n         * configuration as a default server for given address:port\n         */\n\n        addr = port[p].addrs.elts;\n        for (i = 0; i < port[p].addrs.nelts; ++i) {\n\n            if (addr[i].servers.nelts > 1\n#if (NGX_PCRE)\n                || addr[i].default_server->captures\n#endif\n                )\n            {\n                if (ngx_rtmp_server_names(cf, cmcf, &addr[i]) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n            }\n\n            if (ngx_rtmp_init_listening(cf, &port[p]) != NGX_OK) {\n                return NGX_ERROR;\n            }\n        }\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_add_addrs(ngx_conf_t *cf, ngx_rtmp_port_t *mport,\n    ngx_rtmp_conf_addr_t *addr)\n{\n    u_char              *p;\n    size_t               len;\n    ngx_uint_t           i;\n    ngx_rtmp_in_addr_t  *addrs;\n    struct sockaddr_in  *sin;\n    u_char               buf[NGX_SOCKADDR_STRLEN];\n    ngx_rtmp_virtual_names_t   *vn;\n\n    mport->addrs = ngx_pcalloc(cf->pool,\n                               mport->naddrs * sizeof(ngx_rtmp_in_addr_t));\n    if (mport->addrs == NULL) {\n        return NGX_ERROR;\n    }\n\n    addrs = mport->addrs;\n\n    for (i = 0; i < mport->naddrs; i++) {\n\n        sin = (struct sockaddr_in *) addr[i].opt.sockaddr;\n        addrs[i].addr = sin->sin_addr.s_addr;\n        addrs[i].conf.default_server = addr[i].default_server;\n\n        len = ngx_sock_ntop(addr[i].opt.sockaddr,\n#if (nginx_version >= 1005003)\n                            addr[i].opt.socklen,\n#endif\n                            buf, NGX_SOCKADDR_STRLEN, 1);\n\n        p = ngx_pnalloc(cf->pool, len);\n        if (p == NULL) {\n            return NGX_ERROR;\n        }\n\n        ngx_memcpy(p, buf, len);\n\n        addrs[i].conf.addr_text.len = len;\n        addrs[i].conf.addr_text.data = p;\n        addrs[i].conf.proxy_protocol = addr->opt.proxy_protocol;\n\n        if (addr[i].hash.buckets == NULL\n            && (addr[i].wc_head == NULL\n                || addr[i].wc_head->hash.buckets == NULL)\n            && (addr[i].wc_tail == NULL\n                || addr[i].wc_tail->hash.buckets == NULL)\n#if (NGX_PCRE)\n            && addr[i].nregex == 0\n#endif\n            )\n        {\n            continue;\n        }\n\n        vn = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_virtual_names_t));\n        if (vn == NULL) {\n            return NGX_ERROR;\n        }\n\n        addrs[i].conf.virtual_names = vn;\n\n        vn->names.hash = addr[i].hash;\n        vn->names.wc_head = addr[i].wc_head;\n        vn->names.wc_tail = addr[i].wc_tail;\n#if (NGX_PCRE)\n        vn->nregex = addr[i].nregex;\n        vn->regex = addr[i].regex;\n#endif\n    }\n\n    return NGX_OK;\n}\n\n\n#if (NGX_HAVE_INET6)\n\nstatic ngx_int_t\nngx_rtmp_add_addrs6(ngx_conf_t *cf, ngx_rtmp_port_t *mport,\n    ngx_rtmp_conf_addr_t *addr)\n{\n    u_char               *p;\n    size_t                len;\n    ngx_uint_t            i;\n    ngx_rtmp_in6_addr_t  *addrs6;\n    struct sockaddr_in6  *sin6;\n    u_char                buf[NGX_SOCKADDR_STRLEN];\n    ngx_rtmp_virtual_names_t   *vn;\n\n    mport->addrs = ngx_pcalloc(cf->pool,\n                               mport->naddrs * sizeof(ngx_rtmp_in6_addr_t));\n    if (mport->addrs == NULL) {\n        return NGX_ERROR;\n    }\n\n    addrs6 = mport->addrs;\n\n    for (i = 0; i < mport->naddrs; i++) {\n\n        sin6 = (struct sockaddr_in6 *) addr[i].opt.sockaddr;\n        addrs6[i].addr6 = sin6->sin6_addr;\n        addrs6[i].conf.default_server = addr[i].default_server;\n\n        len = ngx_sock_ntop(addr[i].opt.sockaddr,\n#if (nginx_version >= 1005003)\n                            addr[i].opt.socklen,\n#endif\n                            buf, NGX_SOCKADDR_STRLEN, 1);\n\n        p = ngx_pnalloc(cf->pool, len);\n        if (p == NULL) {\n            return NGX_ERROR;\n        }\n\n        ngx_memcpy(p, buf, len);\n\n        addrs6[i].conf.addr_text.len = len;\n        addrs6[i].conf.addr_text.data = p;\n        addrs6[i].conf.proxy_protocol = addr->opt.proxy_protocol;\n\n        if (addr[i].hash.buckets == NULL\n            && (addr[i].wc_head == NULL\n                || addr[i].wc_head->hash.buckets == NULL)\n            && (addr[i].wc_tail == NULL\n                || addr[i].wc_tail->hash.buckets == NULL)\n#if (NGX_PCRE)\n            && addr[i].nregex == 0\n#endif\n            )\n        {\n            continue;\n        }\n\n        vn = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_virtual_names_t));\n        if (vn == NULL) {\n            return NGX_ERROR;\n        }\n\n        addrs6[i].conf.virtual_names = vn;\n\n        vn->names.hash = addr[i].hash;\n        vn->names.wc_head = addr[i].wc_head;\n        vn->names.wc_tail = addr[i].wc_tail;\n#if (NGX_PCRE)\n        vn->nregex = addr[i].nregex;\n        vn->regex = addr[i].regex;\n#endif\n    }\n\n    return NGX_OK;\n}\n\n#endif\n\n\nstatic ngx_int_t\nngx_rtmp_cmp_conf_addrs(const void *one, const void *two)\n{\n    ngx_rtmp_conf_addr_t  *first, *second;\n\n    first = (ngx_rtmp_conf_addr_t *) one;\n    second = (ngx_rtmp_conf_addr_t *) two;\n\n    if (first->opt.wildcard) {\n        /* a wildcard must be the last resort, shift it to the end */\n        return 1;\n    }\n\n    if (first->opt.bind && !second->opt.bind) {\n        /* shift explicit bind()ed addresses to the start */\n        return -1;\n    }\n\n    if (!first->opt.bind && second->opt.bind) {\n        /* shift explicit bind()ed addresses to the start */\n        return 1;\n    }\n\n    /* do not sort by default */\n\n    return 0;\n}\n\n\nngx_int_t\nngx_rtmp_fire_event(ngx_rtmp_session_t *s, ngx_uint_t evt,\n        ngx_rtmp_header_t *h, ngx_chain_t *in)\n{\n    ngx_rtmp_core_main_conf_t      *cmcf;\n    ngx_array_t                    *ch;\n    ngx_rtmp_handler_pt            *hh;\n    size_t                          n;\n\n    cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module);\n\n    ch = &cmcf->events[evt];\n    hh = ch->elts;\n    for(n = 0; n < ch->nelts; ++n, ++hh) {\n        if (*hh && (*hh)(s, h, in) != NGX_OK) {\n            return NGX_ERROR;\n        }\n    }\n    return NGX_OK;\n}\n\n\nvoid *\nngx_rtmp_rmemcpy(void *dst, const void* src, size_t n)\n{\n    u_char     *d, *s;\n\n    d = dst;\n    s = (u_char*)src + n - 1;\n\n    while(s >= (u_char*)src) {\n        *d++ = *s--;\n    }\n\n    return dst;\n}\n\n\nngx_int_t\nngx_rtmp_find_virtual_server(ngx_rtmp_virtual_names_t *virtual_names,\n    ngx_str_t *host, ngx_rtmp_core_srv_conf_t **cscfp)\n{\n    ngx_rtmp_core_srv_conf_t   *cscf;\n\n    if (virtual_names == NULL) {\n        return NGX_DECLINED;\n    }\n\n    cscf = ngx_hash_find_combined(&virtual_names->names,\n                                  ngx_hash_key(host->data, host->len),\n                                  host->data, host->len);\n\n    if (cscf) {\n        *cscfp = cscf;\n        return NGX_OK;\n    }\n\n#if (NGX_PCRE)\n\n    if (host->len && virtual_names->nregex) {\n        ngx_int_t               n;\n        ngx_uint_t              i;\n        ngx_rtmp_server_name_t *sn;\n\n        sn = virtual_names->regex;\n\n        for (i = 0; i < virtual_names->nregex; ++i) {\n\n            n = ngx_regex_exec(sn[i].regex->regex, host, NULL, 0);\n\n            if (n == NGX_REGEX_NO_MATCHED) {\n                continue;\n            }\n\n            if (n >= 0) {\n                *cscfp = sn[i].server;\n                return NGX_OK;\n            }\n\n            return NGX_ERROR;\n        }\n    }\n\n#endif\n\n    return NGX_DECLINED;\n}\n\nngx_int_t\nngx_rtmp_set_virtual_server(ngx_rtmp_session_t *s, ngx_str_t *host)\n{\n    ngx_int_t                   rc;\n    ngx_rtmp_addr_conf_t       *addr_conf;\n    ngx_rtmp_core_srv_conf_t   *cscf;\n\n#if (NGX_SUPPRESS_WARN)\n    cscf = NULL;\n#endif\n\n    addr_conf = s->addr_conf;\n\n    rc = ngx_rtmp_find_virtual_server(addr_conf->virtual_names, host, &cscf);\n\n    if (rc == NGX_ERROR) {\n        return NGX_ERROR;\n    }\n\n    if (rc == NGX_DECLINED) {\n        return NGX_OK;\n    }\n\n    s->srv_conf = cscf->ctx->srv_conf;\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_rtmp_init_process(ngx_cycle_t *cycle)\n{\n#if (nginx_version >= 1007005)\n    ngx_queue_init(&ngx_rtmp_init_queue);\n#endif\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#ifndef _NGX_RTMP_H_INCLUDED_\n#define _NGX_RTMP_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_event.h>\n#include <ngx_event_connect.h>\n#include <nginx.h>\n#include <ngx_http.h>\n\n#include \"ngx_rtmp_amf.h\"\n#include \"ngx_rtmp_bandwidth.h\"\n#include \"ngx_http_client.h\"\n#include \"ngx_netcall.h\"\n#include \"ngx_map.h\"\n\n\n#if (NGX_WIN32)\ntypedef __int8              int8_t;\ntypedef unsigned __int8     uint8_t;\n#endif\n\n\n#if (NGX_PCRE)\n\ntypedef struct {\n    ngx_uint_t                    capture;\n    ngx_int_t                     index;\n} ngx_rtmp_regex_variable_t;\n\ntypedef struct {\n    ngx_regex_t                *regex;\n    ngx_uint_t                  ncaptures;\n    ngx_rtmp_regex_variable_t  *variables;\n    ngx_uint_t                  nvariables;\n    ngx_str_t                   name;\n} ngx_rtmp_regex_t;\n\ntypedef struct {\n    ngx_rtmp_regex_t             *regex;\n    void                         *value;\n} ngx_rtmp_map_regex_t;\n\n#endif\n\n\ntypedef struct {\n    void                  **main_conf;\n    void                  **srv_conf;\n    void                  **app_conf;\n} ngx_rtmp_conf_ctx_t;\n\n\ntypedef struct {\n    void                   *addrs;\n    ngx_uint_t              naddrs;\n} ngx_rtmp_port_t;\n\n\ntypedef struct {\n    int                     family;\n    in_port_t               port;\n    ngx_array_t             addrs;       /* array of ngx_rtmp_conf_addr_t */\n} ngx_rtmp_conf_port_t;\n\n\n#define NGX_RTMP_VERSION                3\n\n#define NGX_LOG_DEBUG_RTMP              NGX_LOG_DEBUG_CORE\n\n#define NGX_RTMP_DEFAULT_CHUNK_SIZE     128\n\n\n/* RTMP message types */\n#define NGX_RTMP_MSG_CHUNK_SIZE         1\n#define NGX_RTMP_MSG_ABORT              2\n#define NGX_RTMP_MSG_ACK                3\n#define NGX_RTMP_MSG_USER               4\n#define NGX_RTMP_MSG_ACK_SIZE           5\n#define NGX_RTMP_MSG_BANDWIDTH          6\n#define NGX_RTMP_MSG_EDGE               7\n#define NGX_RTMP_MSG_AUDIO              8\n#define NGX_RTMP_MSG_VIDEO              9\n#define NGX_RTMP_MSG_AMF3_META          15\n#define NGX_RTMP_MSG_AMF3_SHARED        16\n#define NGX_RTMP_MSG_AMF3_CMD           17\n#define NGX_RTMP_MSG_AMF_META           18\n#define NGX_RTMP_MSG_AMF_SHARED         19\n#define NGX_RTMP_MSG_AMF_CMD            20\n#define NGX_RTMP_MSG_AGGREGATE          22\n#define NGX_RTMP_MSG_MAX                22\n\n#define NGX_RTMP_CONNECT                NGX_RTMP_MSG_MAX + 1\n#define NGX_RTMP_DISCONNECT             NGX_RTMP_MSG_MAX + 2\n#define NGX_RTMP_HANDSHAKE_DONE         NGX_RTMP_MSG_MAX + 3\n#define NGX_MPEGTS_MSG_AUDIO            NGX_RTMP_MSG_MAX + 4\n#define NGX_MPEGTS_MSG_VIDEO            NGX_RTMP_MSG_MAX + 5\n#define NGX_MPEGTS_MSG_PATPMT           NGX_RTMP_MSG_MAX + 6\n#define NGX_MPEGTS_MSG_M3U8             NGX_RTMP_MSG_MAX + 7\n#define NGX_MPEGTS_MSG_CLOSE            NGX_RTMP_MSG_MAX + 8\n#define NGX_RTMP_MAX_EVENT              NGX_RTMP_MSG_MAX + 9\n\n\n/* RMTP control message types */\n#define NGX_RTMP_USER_STREAM_BEGIN      0\n#define NGX_RTMP_USER_STREAM_EOF        1\n#define NGX_RTMP_USER_STREAM_DRY        2\n#define NGX_RTMP_USER_SET_BUFLEN        3\n#define NGX_RTMP_USER_RECORDED          4\n#define NGX_RTMP_USER_PING_REQUEST      6\n#define NGX_RTMP_USER_PING_RESPONSE     7\n#define NGX_RTMP_USER_UNKNOWN           8\n#define NGX_RTMP_USER_BUFFER_END        31\n\n\n/* Chunk header:\n *   max 3  basic header\n * + max 11 message header\n * + max 4  extended header (timestamp) */\n#define NGX_RTMP_MAX_CHUNK_HEADER       18\n\n#define IS_IRAP(_nal_type_) (_nal_type_ >= 16 && _nal_type_ <= 23)\n\n/* Audio codecs */\nenum {\n    /* Uncompressed codec id is actually 0,\n     * but we use another value for consistency */\n    NGX_RTMP_AUDIO_UNCOMPRESSED     = 16,\n    NGX_RTMP_AUDIO_ADPCM            = 1,\n    NGX_RTMP_AUDIO_MP3              = 2,\n    NGX_RTMP_AUDIO_LINEAR_LE        = 3,\n    NGX_RTMP_AUDIO_NELLY16          = 4,\n    NGX_RTMP_AUDIO_NELLY8           = 5,\n    NGX_RTMP_AUDIO_NELLY            = 6,\n    NGX_RTMP_AUDIO_G711A            = 7,\n    NGX_RTMP_AUDIO_G711U            = 8,\n    NGX_RTMP_AUDIO_AAC              = 10,\n    NGX_RTMP_AUDIO_SPEEX            = 11,\n    NGX_RTMP_AUDIO_MP3_8            = 14,\n    NGX_RTMP_AUDIO_DEVSPEC          = 15,\n};\n\n\n/* Video codecs */\nenum {\n    NGX_RTMP_VIDEO_JPEG             = 1,\n    NGX_RTMP_VIDEO_SORENSON_H263    = 2,\n    NGX_RTMP_VIDEO_SCREEN           = 3,\n    NGX_RTMP_VIDEO_ON2_VP6          = 4,\n    NGX_RTMP_VIDEO_ON2_VP6_ALPHA    = 5,\n    NGX_RTMP_VIDEO_SCREEN2          = 6,\n    NGX_RTMP_VIDEO_H264             = 7,\n    NGX_RTMP_VIDEO_H265             = 12\n};\n\nextern ngx_int_t NGX_RTMP_HEVC_CODEC_ID;\n\ntypedef struct {\n    uint32_t                csid;       /* chunk stream id */\n    uint32_t                timestamp;  /* timestamp (delta) */\n    uint32_t                mlen;       /* message length */\n    uint8_t                 type;       /* message type id */\n    uint32_t                msid;       /* message stream id */\n} ngx_rtmp_header_t;\n\n\ntypedef struct {\n    ngx_rtmp_header_t       hdr;\n    uint32_t                dtime;\n    uint32_t                len;        /* current fragment length */\n    uint8_t                 ext;\n    ngx_chain_t            *in;\n} ngx_rtmp_stream_t;\n\n\ntypedef struct ngx_rtmp_frame_s     ngx_rtmp_frame_t;\n\nstruct ngx_rtmp_frame_s {\n    ngx_rtmp_header_t       hdr;\n    ngx_flag_t              av_header;\n    ngx_flag_t              keyframe;\n    ngx_flag_t              mandatory;\n    ngx_uint_t              ref;\n\n    ngx_rtmp_frame_t       *next;\n    ngx_chain_t            *chain;\n};\n\ntypedef struct ngx_mpegts_frame_s   ngx_mpegts_frame_t;\n\nstruct ngx_mpegts_frame_s {\n    uint64_t                    pts;\n    uint64_t                    dts;\n    ngx_uint_t                  pid;\n    ngx_uint_t                  sid;\n    ngx_uint_t                  cc;\n    unsigned                    key:1;\n    ngx_uint_t                  ref;\n\n    ngx_uint_t                  type;\n    ngx_uint_t                  length;\n    size_t                      pos;\n\n    ngx_mpegts_frame_t         *next;\n    ngx_chain_t                *chain;\n};\n\n/* disable zero-sized array warning by msvc */\n\n#if (NGX_WIN32)\n#pragma warning(push)\n#pragma warning(disable:4200)\n#endif\n\n#define NGX_RTMP_LIVE       0\n#define NGX_HTTP_FLV_LIVE   1\n#define NGX_HLS_LIVE        2\n#define NGX_MPEGTS_LIVE     3\n\ntypedef struct ngx_rtmp_session_s  ngx_rtmp_session_t;\n\n#define NGX_RTMP_MAX_MERGE_FRAME    64\n\ntypedef ngx_chain_t * (* ngx_rtmp_prepared_pt)(ngx_rtmp_session_t *s);\n\ntypedef struct ngx_live_stream_s    ngx_live_stream_t;\ntypedef struct ngx_live_server_s    ngx_live_server_t;\ntypedef struct ngx_rtmp_addr_conf_s ngx_rtmp_addr_conf_t;\n\n#define NGX_LIVE_INIT               0\n#define NGX_LIVE_HANDSHAKE_DONE     1\n#define NGX_LIVE_CONNECT            2\n#define NGX_LIVE_CREATE_STREAM      3\n#define NGX_LIVE_PUBLISH            4\n#define NGX_LIVE_PLAY               5\n#define NGX_LIVE_AV                 6\n#define NGX_LIVE_CLOSE              7\n\n#define NGX_LIVE_INTERNAL_ERR       0\n#define NGX_LIVE_NORMAL_CLOSE       1\n#define NGX_LIVE_RTMP_SEND_ERR      2\n#define NGX_LIVE_RTMP_SEND_TIMEOUT  3\n#define NGX_LIVE_FLV_SEND_ERR       4\n#define NGX_LIVE_FLV_SEND_TIMEOUT   5\n#define NGX_LIVE_RTMP_RECV_ERR      6\n#define NGX_LIVE_FLV_RECV_ERR       7\n#define NGX_LIVE_RELAY_TRANSIT      8\n#define NGX_LIVE_RELAY_TIMEOUT      9\n#define NGX_LIVE_CONTROL_DROP       10\n#define NGX_LIVE_DROP_IDLE          11\n#define NGX_LIVE_OCLP_NOTIFY_ERR    12\n#define NGX_LIVE_OCLP_RELAY_ERR     13\n#define NGX_LIVE_OCLP_PARA_ERR      14\n#define NGX_LIVE_RELAY_CLOSE        15\n#define NGX_LIVE_PROCESS_EXIT       16\n\nstruct ngx_rtmp_session_s {\n    ngx_atomic_uint_t       number;\n    struct sockaddr        *sockaddr;\n    ngx_msec_t              roll_back;\n\n    unsigned int            destroyed:1;\n\n    ngx_flag_t              pause;\n\n    ngx_int_t               acodec;\n    ngx_int_t               vcodec;\n    uint32_t                signature;  /* \"RTMP\" */ /* <-- FIXME wtf */\n\n    ngx_event_t             close;\n\n    ngx_pool_t             *pool;\n    ngx_log_t              *log;\n\n    ngx_rtmp_addr_conf_t   *addr_conf;\n\n    void                  **ctx;\n    void                  **main_conf;\n    void                  **srv_conf;\n    void                  **app_conf;\n\n    ngx_live_server_t      *live_server;\n    ngx_live_stream_t      *live_stream;\n\n    ngx_str_t               remote_addr_text;\n    ngx_str_t              *addr_text;\n    int                     connected;\n\n    ngx_http_variable_value_t *variables;\n\n#if (NGX_PCRE)\n    ngx_uint_t              ncaptures;\n    int                    *captures;\n    u_char                 *captures_data;\n#endif\n\n#if (nginx_version >= 1007005)\n    ngx_queue_t             posted_dry_events;\n#else\n    ngx_event_t            *posted_dry_events;\n#endif\n\n    /* client buffer time in msec */\n    uint32_t                buflen;\n    uint32_t                ack_size;\n\n    ngx_str_t               groupid;\n\n    /* app/name */\n    ngx_str_t               stream;\n\n    /* stream name in publish or play*/\n    ngx_str_t               name;\n    ngx_str_t               pargs;  /* play or publish args */\n\n    /* connection parameters */\n    ngx_str_t               app;\n    ngx_str_t               args;\n    ngx_str_t               flashver;\n    ngx_str_t               swf_url;\n    ngx_str_t               tc_url;\n    uint32_t                acodecs;\n    uint32_t                vcodecs;\n    ngx_str_t               page_url;\n\n    /* middleware */\n    ngx_str_t               scheme;\n    ngx_str_t               domain;\n    ngx_str_t               serverid;\n\n    /* handshake data */\n    ngx_buf_t              *hs_buf;\n    u_char                 *hs_digest;\n    unsigned                hs_old:1;\n    ngx_uint_t              hs_stage;\n\n    /* connection timestamps */\n    ngx_msec_t              epoch;\n    ngx_msec_t              peer_epoch;\n    ngx_msec_t              base_time;\n    uint32_t                current_time;\n\n    /* ping */\n    ngx_event_t             ping_evt;\n    unsigned                ping_active:1;\n    unsigned                ping_reset:1;\n\n    /* auto-pushed? */\n    unsigned                interprocess:1;\n    unsigned                static_pull:1;\n    unsigned                relay:1;\n    unsigned                played:1;\n    unsigned                published:1;\n    unsigned                closed:1;\n    unsigned                publishing:1;\n    unsigned                finalized:1;\n\n    /* live type: 0- RTMP 1- http-flv 2- hls */\n    unsigned                live_type:2;\n    ngx_uint_t              status;\n    ngx_http_request_t     *request;\n\n    unsigned                flv_state;\n\n    ngx_uint_t              flv_version;\n    ngx_uint_t              flv_flags;\n    unsigned                flv_data_offset;\n    unsigned                flv_tagsize;\n    unsigned                flv_first_pts;\n\n    /* input stream 0 (reserved by RTMP spec)\n     * is used as free chain link */\n\n    ngx_rtmp_stream_t      *in_streams;\n    uint32_t                in_csid;\n    ngx_uint_t              in_chunk_size;\n    ngx_pool_t             *in_pool;\n    uint32_t                in_bytes;\n    uint32_t                in_last_ack;\n\n    ngx_pool_t             *in_old_pool;\n    ngx_int_t               in_chunk_size_changing;\n\n    ngx_connection_t       *connection;\n\n    /* merge frame and send */\n    ngx_mpegts_frame_t     *prepare_mpegts_frame[NGX_RTMP_MAX_MERGE_FRAME];\n    ngx_rtmp_frame_t       *prepare_frame[NGX_RTMP_MAX_MERGE_FRAME];\n    ngx_chain_t            *merge[NGX_RTMP_MAX_MERGE_FRAME];\n    ngx_uint_t              nframe;\n    ngx_rtmp_prepared_pt    prepare_handler;\n\n    /* for trace and statistics */\n    ngx_int_t               notify_status;\n    ngx_uint_t              finalize_reason;\n    ngx_uint_t              stage;\n    ngx_msec_t              init_time;\n    ngx_msec_t              handshake_done_time;\n    ngx_msec_t              connect_time;\n    ngx_msec_t              create_stream_time;\n    ngx_msec_t              ptime;                  /* publish or play time */\n    ngx_msec_t              first_data;             /* audio video or metadata*/\n    ngx_msec_t              first_metadata;\n    ngx_msec_t              first_audio;\n    ngx_msec_t              first_video;\n    ngx_msec_t              close_stream_time;\n\n    /* circular buffer of RTMP message pointers */\n    ngx_msec_t              timeout;\n    uint32_t                out_bytes;\n    size_t                  out_pos, out_last;\n    ngx_chain_t            *out_chain;\n    unsigned                out_buffer:1;\n    size_t                  out_queue;\n    size_t                  out_cork;\n    ngx_mpegts_frame_t    **mpegts_out;\n    ngx_rtmp_frame_t       *out[0];\n};\n\n/* live stream manage */\n#define NGX_LIVE_SERVERID_LEN   512\n#define NGX_LIVE_STREAM_LEN     512\n\ntypedef struct ngx_rtmp_core_ctx_s      ngx_rtmp_core_ctx_t;\ntypedef struct ngx_rtmp_live_ctx_s      ngx_rtmp_live_ctx_t;\ntypedef struct ngx_mpegts_live_ctx_s    ngx_mpegts_live_ctx_t;\ntypedef struct ngx_hls_live_ctx_s       ngx_hls_live_ctx_t;\n\nstruct ngx_rtmp_core_ctx_s {\n    ngx_rtmp_core_ctx_t    *next;\n    ngx_rtmp_session_t     *session;\n\n    unsigned                publishing:1;\n};\n\n\n#define NGX_RTMP_MAX_OCLP   8\n#define NGX_RTMP_MAX_PUSH   8\n\n\nstruct ngx_live_stream_s {\n    u_char                      name[NGX_LIVE_STREAM_LEN];\n\n    ngx_int_t                   pslot;\n\n    ngx_rtmp_core_ctx_t        *publish_ctx;\n    ngx_rtmp_core_ctx_t        *play_ctx;\n\n    /* notify */\n    ngx_netcall_ctx_t          *stream_nctx;\n\n    ngx_live_stream_t          *next;\n\n    /* for live */\n    ngx_map_t                   pubctx;\n    ngx_rtmp_live_ctx_t        *ctx;\n    ngx_mpegts_live_ctx_t      *mpegts_ctx;\n    ngx_hls_live_ctx_t         *hls_ctx;\n    ngx_rtmp_bandwidth_t        bw_in;\n    ngx_rtmp_bandwidth_t        bw_in_audio;\n    ngx_rtmp_bandwidth_t        bw_in_video;\n    ngx_rtmp_bandwidth_t        bw_out;\n    ngx_msec_t                  epoch;\n    unsigned                    active:1;\n    unsigned                    publishing:1;\n    unsigned                    notify_meta:1;\n};\n\nstruct ngx_live_server_s {\n    u_char                      serverid[NGX_LIVE_SERVERID_LEN];\n    ngx_uint_t                  n_stream;\n    ngx_flag_t                  deleted;\n\n    ngx_live_server_t          *next;\n\n    ngx_live_stream_t         **streams;\n};\n\n\nngx_live_server_t *ngx_live_create_server(ngx_str_t *serverid);\nngx_live_server_t *ngx_live_fetch_server(ngx_str_t *serverid);\nvoid ngx_live_delete_server(ngx_str_t *serverid);\n\nngx_live_stream_t *ngx_live_create_stream(ngx_str_t *serverid,\n        ngx_str_t *stream);\nngx_live_stream_t *ngx_live_fetch_stream(ngx_str_t *serverid,\n        ngx_str_t *stream);\nvoid ngx_live_delete_stream(ngx_str_t *serverid, ngx_str_t *stream);\n\nvoid ngx_live_create_ctx(ngx_rtmp_session_t *s, unsigned publishing);\nvoid ngx_live_delete_ctx(ngx_rtmp_session_t *s);\n\nvoid ngx_live_print();\n\n#if (NGX_WIN32)\n#pragma warning(pop)\n#endif\n\n\n/* handler result code:\n *  NGX_ERROR - error\n *  NGX_OK    - success, may continue\n *  NGX_DONE  - success, input parsed, reply sent; need no\n *      more calls on this event */\ntypedef ngx_int_t (*ngx_rtmp_handler_pt)(ngx_rtmp_session_t *s,\n        ngx_rtmp_header_t *h, ngx_chain_t *in);\n\n\ntypedef struct {\n    ngx_str_t               name;\n    ngx_rtmp_handler_pt     handler;\n} ngx_rtmp_amf_handler_t;\n\n\ntypedef struct {\n    ngx_flag_t              fast_reload;\n\n    ngx_array_t             servers;    /* ngx_rtmp_core_srv_conf_t */\n\n    ngx_array_t             events[NGX_RTMP_MAX_EVENT];\n\n    ngx_hash_t              amf_hash;\n    ngx_array_t             amf_arrays;\n    ngx_array_t             amf;\n\n    ngx_uint_t              server_names_hash_max_size;\n    ngx_uint_t              server_names_hash_bucket_size;\n\n    ngx_hash_t              variables_hash;\n\n    ngx_array_t             variables;         /* ngx_http_variable_t */\n    ngx_array_t             prefix_variables;  /* ngx_http_variable_t */\n    ngx_uint_t              ncaptures;\n\n    ngx_uint_t              variables_hash_max_size;\n    ngx_uint_t              variables_hash_bucket_size;\n\n    ngx_hash_keys_arrays_t *variables_keys;\n\n    ngx_array_t            *ports;  /* ngx_rtmp_conf_port_t */\n} ngx_rtmp_core_main_conf_t;\n\n\n/* global main conf for stats */\nextern ngx_rtmp_core_main_conf_t   *ngx_rtmp_core_main_conf;\n\n\ntypedef struct {\n    ngx_array_t             applications; /* ngx_rtmp_core_app_conf_t */\n    ngx_str_t               name;\n    ngx_uint_t              merge_frame;\n    ngx_flag_t              tcp_nodelay;\n    void                  **app_conf;\n    ngx_uint_t              hevc_codec;\n} ngx_rtmp_core_app_conf_t;\n\n\ntypedef struct ngx_rtmp_core_srv_conf_s {\n    ngx_array_t             applications; /* ngx_rtmp_core_app_conf_t */\n\n    ngx_rtmp_core_app_conf_t *default_app;\n\n    ngx_msec_t              timeout;\n    ngx_msec_t              ping;\n    ngx_msec_t              ping_timeout;\n    ngx_flag_t              so_keepalive;\n    ngx_int_t               max_streams;\n\n    ngx_uint_t              ack_window;\n\n    ngx_int_t               chunk_size;\n    ngx_pool_t             *pool;\n    ngx_chain_t            *free;\n    ngx_chain_t            *free_hs;\n    size_t                  max_message;\n    ngx_flag_t              play_time_fix;\n    ngx_flag_t              publish_time_fix;\n    ngx_flag_t              busy;\n    size_t                  out_queue;\n    size_t                  out_cork;\n    ngx_msec_t              buflen;\n\n    ngx_rtmp_conf_ctx_t    *ctx;\n\n    unsigned                listen:1;\n#if (NGX_PCRE)\n    unsigned                captures:1;\n#endif\n\n    ngx_str_t               server_name;\n    ngx_str_t               serverid;\n\n    /* array of the ngx_rtmp_server_name_t, \"server_name\" directive */\n    ngx_array_t             server_names;\n} ngx_rtmp_core_srv_conf_t;\n\n\ntypedef struct {\n#if (NGX_PCRE)\n    ngx_rtmp_regex_t       *regex;\n#endif\n    ngx_rtmp_core_srv_conf_t *server; /* virtual name server conf */\n    ngx_str_t               name;\n} ngx_rtmp_server_name_t;\n\n\ntypedef struct {\n    ngx_hash_combined_t     names;\n\n    ngx_uint_t              nregex;\n    ngx_rtmp_server_name_t *regex;\n} ngx_rtmp_virtual_names_t;\n\n\nstruct ngx_rtmp_addr_conf_s {\n    ngx_rtmp_core_srv_conf_t *default_server;\n    ngx_rtmp_virtual_names_t *virtual_names;\n\n    ngx_str_t               addr_text;\n    unsigned                proxy_protocol:1;\n};\n\ntypedef struct {\n    in_addr_t               addr;\n    ngx_rtmp_addr_conf_t    conf;\n} ngx_rtmp_in_addr_t;\n\n\n#if (NGX_HAVE_INET6)\n\ntypedef struct {\n    struct in6_addr         addr6;\n    ngx_rtmp_addr_conf_t    conf;\n} ngx_rtmp_in6_addr_t;\n\n#endif\n\n\ntypedef struct {\n    struct sockaddr        *sockaddr;\n    socklen_t               socklen;\n\n    unsigned                set:1;\n    unsigned                default_server:1;\n    unsigned                bind:1;\n    unsigned                wildcard:1;\n#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)\n    unsigned                ipv6only:2;\n#endif\n    unsigned                reuseport:1;\n    unsigned                so_keepalive:2;\n    unsigned                proxy_protocol:1;\n#if (NGX_HAVE_KEEPALIVE_TUNABLE)\n    int                     tcp_keepidle;\n    int                     tcp_keepintvl;\n    int                     tcp_keepcnt;\n#endif\n\n    u_char                  addr[NGX_SOCKADDR_STRLEN + 1];\n} ngx_rtmp_listen_opt_t;\n\n\ntypedef struct {\n    ngx_rtmp_listen_opt_t   opt;\n\n    ngx_hash_t              hash;\n    ngx_hash_wildcard_t    *wc_head;\n    ngx_hash_wildcard_t    *wc_tail;\n\n#if (NGX_PCRE)\n    ngx_uint_t              nregex;\n    ngx_rtmp_server_name_t *regex;\n#endif\n\n    /* the default server configuration for this address:port */\n    ngx_rtmp_core_srv_conf_t   *default_server;\n    ngx_array_t             servers;    /* array of ngx_http_core_srv_conf_t */\n} ngx_rtmp_conf_addr_t;\n\n\n/* nginx dynamic conf */\ntypedef struct {\n    ngx_str_t               serverid;\n} ngx_rtmp_core_srv_dconf_t;\n\n\ntypedef struct {\n    ngx_int_t             (*preconfiguration)(ngx_conf_t *cf);\n    ngx_int_t             (*postconfiguration)(ngx_conf_t *cf);\n\n    void                 *(*create_main_conf)(ngx_conf_t *cf);\n    char                 *(*init_main_conf)(ngx_conf_t *cf, void *conf);\n\n    void                 *(*create_srv_conf)(ngx_conf_t *cf);\n    char                 *(*merge_srv_conf)(ngx_conf_t *cf, void *prev,\n                                    void *conf);\n\n    void                 *(*create_app_conf)(ngx_conf_t *cf);\n    char                 *(*merge_app_conf)(ngx_conf_t *cf, void *prev,\n                                    void *conf);\n} ngx_rtmp_module_t;\n\n#define NGX_RTMP_MODULE                 0x504D5452     /* \"RTMP\" */\n\n#define NGX_RTMP_MAIN_CONF              0x02000000\n#define NGX_RTMP_SRV_CONF               0x04000000\n#define NGX_RTMP_APP_CONF               0x08000000\n#define NGX_RTMP_REC_CONF               0x10000000\n\n\n#define NGX_RTMP_MAIN_CONF_OFFSET  offsetof(ngx_rtmp_conf_ctx_t, main_conf)\n#define NGX_RTMP_SRV_CONF_OFFSET   offsetof(ngx_rtmp_conf_ctx_t, srv_conf)\n#define NGX_RTMP_APP_CONF_OFFSET   offsetof(ngx_rtmp_conf_ctx_t, app_conf)\n\n\n#define ngx_rtmp_get_module_ctx(s, module)     (s)->ctx[module.ctx_index]\n#define ngx_rtmp_set_ctx(s, c, module)         s->ctx[module.ctx_index] = c;\n#define ngx_rtmp_delete_ctx(s, module)         s->ctx[module.ctx_index] = NULL;\n\n\n#define ngx_rtmp_get_module_main_conf(s, module)                             \\\n    (s)->main_conf[module.ctx_index]\n#define ngx_rtmp_get_module_srv_conf(s, module)  (s)->srv_conf[module.ctx_index]\n#define ngx_rtmp_get_module_app_conf(s, module)  ((s)->app_conf ? \\\n    (s)->app_conf[module.ctx_index] : NULL)\n\n#define ngx_rtmp_conf_get_module_main_conf(cf, module)                       \\\n    ((ngx_rtmp_conf_ctx_t *) cf->ctx)->main_conf[module.ctx_index]\n#define ngx_rtmp_conf_get_module_srv_conf(cf, module)                        \\\n    ((ngx_rtmp_conf_ctx_t *) cf->ctx)->srv_conf[module.ctx_index]\n#define ngx_rtmp_conf_get_module_app_conf(cf, module)                        \\\n    ((ngx_rtmp_conf_ctx_t *) cf->ctx)->app_conf[module.ctx_index]\n\n#define ngx_rtmp_cycle_get_module_main_conf(cycle, module)                   \\\n    (cycle->conf_ctx[ngx_rtmp_module.index] ?                                \\\n        ((ngx_rtmp_conf_ctx_t *) cycle->conf_ctx[ngx_rtmp_module.index])     \\\n            ->main_conf[module.ctx_index]:                                   \\\n        NULL)\n\n/* for virtual server */\n#if (NGX_PCRE)\nngx_rtmp_regex_t *ngx_rtmp_regex_compile(ngx_conf_t *cf,\n    ngx_regex_compile_t *rc);\nngx_int_t ngx_rtmp_regex_exec(ngx_rtmp_session_t *s, ngx_rtmp_regex_t *re,\n    ngx_str_t *str);\n#endif\nngx_int_t ngx_rtmp_add_listen(ngx_conf_t *cf, ngx_rtmp_core_srv_conf_t *cscf,\n    ngx_rtmp_listen_opt_t *lsopt);\nngx_int_t ngx_rtmp_set_virtual_server(ngx_rtmp_session_t *s, ngx_str_t *host);\n\n\n#ifdef NGX_DEBUG\nchar* ngx_rtmp_message_type(uint8_t type);\nchar* ngx_rtmp_user_message_type(uint16_t evt);\n#endif\n\n\ntypedef struct {\n    ngx_array_t                 urls; // ngx_live_relay_url_t\n\n    ngx_str_t                   domain;\n    ngx_str_t                   app;\n    ngx_str_t                   name;\n    ngx_str_t                   pargs;\n    ngx_str_t                   referer;    // rtmp page_url\n    ngx_str_t                   user_agent; // rtmp flashver\n\n    ngx_str_t                   stream;\n\n    void                       *tag; // module create relay\n} ngx_live_relay_t;\n\n\nvoid ngx_rtmp_init_connection(ngx_connection_t *c);\nngx_rtmp_session_t *ngx_rtmp_create_session(ngx_rtmp_addr_conf_t *addr_conf);\nngx_rtmp_session_t *ngx_rtmp_create_relay_session(ngx_rtmp_session_t *s,\n    void *tag);\nngx_rtmp_session_t *ngx_rtmp_create_static_session(ngx_live_relay_t *relay,\n    ngx_rtmp_addr_conf_t *addr_conf, void *tag);\n\nvoid ngx_rtmp_set_combined_log(ngx_rtmp_session_t *s, void *d,\n    ngx_log_handler_pt h);\nvoid ngx_rtmp_init_session(ngx_rtmp_session_t *s, ngx_connection_t *c);\nvoid ngx_rtmp_finalize_session(ngx_rtmp_session_t *s);\nvoid ngx_rtmp_finalize_fake_session(ngx_rtmp_session_t *s);\nvoid ngx_rtmp_handshake(ngx_rtmp_session_t *s);\nvoid ngx_rtmp_client_handshake(ngx_rtmp_session_t *s, unsigned async);\nvoid ngx_rtmp_free_handshake_buffers(ngx_rtmp_session_t *s);\nvoid ngx_rtmp_cycle(ngx_rtmp_session_t *s);\nvoid ngx_rtmp_reset_ping(ngx_rtmp_session_t *s);\nngx_int_t ngx_rtmp_fire_event(ngx_rtmp_session_t *s, ngx_uint_t evt,\n        ngx_rtmp_header_t *h, ngx_chain_t *in);\n\nngx_int_t ngx_rtmp_set_chunk_size(ngx_rtmp_session_t *s, ngx_uint_t size);\n\n\n/* Bit reverse: we need big-endians in many places  */\nvoid * ngx_rtmp_rmemcpy(void *dst, const void* src, size_t n);\n\n#define ngx_rtmp_rcpymem(dst, src, n) \\\n    (((u_char*)ngx_rtmp_rmemcpy(dst, src, n)) + (n))\n\n\nstatic ngx_inline uint16_t\nngx_rtmp_r16(uint16_t n)\n{\n    return (n << 8) | (n >> 8);\n}\n\n\nstatic ngx_inline uint32_t\nngx_rtmp_r32(uint32_t n)\n{\n    return (n << 24) | ((n << 8) & 0xff0000) | ((n >> 8) & 0xff00) | (n >> 24);\n}\n\n\nstatic ngx_inline uint64_t\nngx_rtmp_r64(uint64_t n)\n{\n    return (uint64_t) ngx_rtmp_r32((uint32_t) n) << 32 |\n                      ngx_rtmp_r32((uint32_t) (n >> 32));\n}\n\n\nngx_int_t\nngx_rtmp_find_virtual_server(ngx_rtmp_virtual_names_t *virtual_names,\n    ngx_str_t *host, ngx_rtmp_core_srv_conf_t **cscfp);\n\n/* Receiving messages */\nngx_int_t ngx_rtmp_receive_message(ngx_rtmp_session_t *s,\n        ngx_rtmp_header_t *h, ngx_chain_t *in);\nngx_int_t ngx_rtmp_protocol_message_handler(ngx_rtmp_session_t *s,\n        ngx_rtmp_header_t *h, ngx_chain_t *in);\nngx_int_t ngx_rtmp_user_message_handler(ngx_rtmp_session_t *s,\n        ngx_rtmp_header_t *h, ngx_chain_t *in);\nngx_int_t ngx_rtmp_aggregate_message_handler(ngx_rtmp_session_t *s,\n        ngx_rtmp_header_t *h, ngx_chain_t *in);\nngx_int_t ngx_rtmp_amf_message_handler(ngx_rtmp_session_t *s,\n        ngx_rtmp_header_t *h, ngx_chain_t *in);\nngx_int_t ngx_rtmp_amf_shared_object_handler(ngx_rtmp_session_t *s,\n        ngx_rtmp_header_t *h, ngx_chain_t *in);\n\n\n/* Shared output buffers */\n\nngx_int_t ngx_rtmp_prepare_merge_frame(ngx_rtmp_session_t *s);\nvoid ngx_rtmp_free_merge_frame(ngx_rtmp_session_t *s);\n\nvoid ngx_rtmp_shared_append_chain(ngx_rtmp_frame_t *frame, size_t size,\n        ngx_chain_t *cl, ngx_flag_t mandatory);\nngx_rtmp_frame_t *ngx_rtmp_shared_alloc_frame(size_t size, ngx_chain_t *cl,\n        ngx_flag_t mandatory);\nvoid ngx_rtmp_shared_free_frame(ngx_rtmp_frame_t *frame);\n\n#define ngx_rtmp_shared_acquire_frame(frame) ++frame->ref;\n\nngx_chain_t *ngx_rtmp_shared_state(ngx_http_request_t *r);\n\nvoid ngx_mpegts_shared_append_chain(ngx_mpegts_frame_t *frame, ngx_chain_t *cl,\n        ngx_flag_t mandatory);\nngx_mpegts_frame_t *ngx_rtmp_shared_alloc_mpegts_frame(ngx_chain_t *cl,\n        ngx_flag_t mandatory);\nvoid ngx_rtmp_shared_free_mpegts_frame(ngx_mpegts_frame_t *frame);\n\n#define ngx_rtmp_shared_acquire_mpegts_frame(frame) ++frame->ref;\n\n/* Sending messages */\nngx_int_t ngx_rtmp_send_message(ngx_rtmp_session_t *s, ngx_rtmp_frame_t *out,\n        ngx_uint_t priority);\n\n/* GOP */\nngx_int_t ngx_rtmp_gop_cache(ngx_rtmp_session_t *s, ngx_rtmp_frame_t *frame);\nngx_int_t ngx_rtmp_gop_send(ngx_rtmp_session_t *s, ngx_rtmp_session_t *ss);\n\n/* RTMP Relation server */\nngx_rtmp_addr_conf_t *ngx_rtmp_find_related_addr_conf(ngx_cycle_t *cycle,\n        ngx_str_t *addr);\n\n/* core */\nngx_int_t ngx_rtmp_arg(ngx_rtmp_session_t *s, u_char *name, size_t len,\n        ngx_str_t *value);\n\n/* Note on priorities:\n * the bigger value the lower the priority.\n * priority=0 is the highest */\n\n\n#define NGX_RTMP_LIMIT_SOFT         0\n#define NGX_RTMP_LIMIT_HARD         1\n#define NGX_RTMP_LIMIT_DYNAMIC      2\n\n/* Protocol control messages */\nngx_rtmp_frame_t *ngx_rtmp_create_chunk_size(ngx_rtmp_session_t *s,\n        uint32_t chunk_size);\nngx_rtmp_frame_t *ngx_rtmp_create_abort(ngx_rtmp_session_t *s,\n        uint32_t csid);\nngx_rtmp_frame_t *ngx_rtmp_create_ack(ngx_rtmp_session_t *s,\n        uint32_t seq);\nngx_rtmp_frame_t *ngx_rtmp_create_ack_size(ngx_rtmp_session_t *s,\n        uint32_t ack_size);\nngx_rtmp_frame_t *ngx_rtmp_create_bandwidth(ngx_rtmp_session_t *s,\n        uint32_t ack_size, uint8_t limit_type);\n\nngx_int_t ngx_rtmp_send_chunk_size(ngx_rtmp_session_t *s,\n        uint32_t chunk_size);\nngx_int_t ngx_rtmp_send_abort(ngx_rtmp_session_t *s,\n        uint32_t csid);\nngx_int_t ngx_rtmp_send_ack(ngx_rtmp_session_t *s,\n        uint32_t seq);\nngx_int_t ngx_rtmp_send_ack_size(ngx_rtmp_session_t *s,\n        uint32_t ack_size);\nngx_int_t ngx_rtmp_send_bandwidth(ngx_rtmp_session_t *s,\n        uint32_t ack_size, uint8_t limit_type);\n\n/* User control messages */\nngx_rtmp_frame_t *ngx_rtmp_create_stream_begin(ngx_rtmp_session_t *s,\n        uint32_t msid);\nngx_rtmp_frame_t *ngx_rtmp_create_stream_eof(ngx_rtmp_session_t *s,\n        uint32_t msid);\nngx_rtmp_frame_t *ngx_rtmp_create_stream_dry(ngx_rtmp_session_t *s,\n        uint32_t msid);\nngx_rtmp_frame_t *ngx_rtmp_create_set_buflen(ngx_rtmp_session_t *s,\n        uint32_t msid, uint32_t buflen_msec);\nngx_rtmp_frame_t *ngx_rtmp_create_recorded(ngx_rtmp_session_t *s,\n        uint32_t msid);\nngx_rtmp_frame_t *ngx_rtmp_create_ping_request(ngx_rtmp_session_t *s,\n        uint32_t timestamp);\nngx_rtmp_frame_t *ngx_rtmp_create_ping_response(ngx_rtmp_session_t *s,\n        uint32_t timestamp);\n\nngx_int_t ngx_rtmp_send_stream_begin(ngx_rtmp_session_t *s,\n        uint32_t msid);\nngx_int_t ngx_rtmp_send_stream_eof(ngx_rtmp_session_t *s,\n        uint32_t msid);\nngx_int_t ngx_rtmp_send_stream_dry(ngx_rtmp_session_t *s,\n        uint32_t msid);\nngx_int_t ngx_rtmp_send_set_buflen(ngx_rtmp_session_t *s,\n        uint32_t msid, uint32_t buflen_msec);\nngx_int_t ngx_rtmp_send_recorded(ngx_rtmp_session_t *s,\n        uint32_t msid);\nngx_int_t ngx_rtmp_send_ping_request(ngx_rtmp_session_t *s,\n        uint32_t timestamp);\nngx_int_t ngx_rtmp_send_ping_response(ngx_rtmp_session_t *s,\n        uint32_t timestamp);\n\n/* AMF sender/receiver */\nngx_int_t ngx_rtmp_append_amf(ngx_rtmp_session_t *s,\n        ngx_chain_t **first, ngx_chain_t **last,\n        ngx_rtmp_amf_elt_t *elts, size_t nelts);\nngx_int_t ngx_rtmp_receive_amf(ngx_rtmp_session_t *s, ngx_chain_t *in,\n        ngx_rtmp_amf_elt_t *elts, size_t nelts);\n\nngx_rtmp_frame_t *ngx_rtmp_create_amf(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_rtmp_amf_elt_t *elts, size_t nelts);\nngx_int_t ngx_rtmp_send_amf(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_rtmp_amf_elt_t *elts, size_t nelts);\n\n/* AMF status sender */\nngx_rtmp_frame_t *ngx_rtmp_create_error(ngx_rtmp_session_t *s, char *code,\n        char* level, char *desc);\nngx_rtmp_frame_t *ngx_rtmp_create_status(ngx_rtmp_session_t *s, char *code,\n        char* level, char *desc);\nngx_rtmp_frame_t *ngx_rtmp_create_play_status(ngx_rtmp_session_t *s, char *code,\n        char* level, ngx_uint_t duration, ngx_uint_t bytes);\nngx_rtmp_frame_t *ngx_rtmp_create_sample_access(ngx_rtmp_session_t *s);\n\nngx_int_t ngx_rtmp_send_error(ngx_rtmp_session_t *s, char *code,\n        char* level, char *desc);\nngx_int_t ngx_rtmp_send_status(ngx_rtmp_session_t *s, char *code,\n        char* level, char *desc);\nngx_int_t ngx_rtmp_send_play_status(ngx_rtmp_session_t *s, char *code,\n        char* level, ngx_uint_t duration, ngx_uint_t bytes);\nngx_int_t ngx_rtmp_send_sample_access(ngx_rtmp_session_t *s);\nvoid ngx_rtmp_mpegts_mux(ngx_rtmp_session_t *s);\n\n\n/* Frame types */\n#define NGX_RTMP_VIDEO_KEY_FRAME            1\n#define NGX_RTMP_VIDEO_INTER_FRAME          2\n#define NGX_RTMP_VIDEO_DISPOSABLE_FRAME     3\n\n\nstatic ngx_inline ngx_int_t\nngx_rtmp_get_video_frame_type(ngx_chain_t *in)\n{\n    return (in->buf->pos[0] & 0xf0) >> 4;\n}\n\n\nstatic ngx_inline ngx_int_t\nngx_rtmp_is_codec_header(ngx_chain_t *in)\n{\n    return in->buf->pos + 1 < in->buf->last && in->buf->pos[1] == 0;\n}\n\n\nextern ngx_rtmp_bandwidth_t                 ngx_rtmp_bw_out;\nextern ngx_rtmp_bandwidth_t                 ngx_rtmp_bw_in;\n\n\nextern ngx_uint_t                           ngx_rtmp_naccepted;\n#if (nginx_version >= 1007011)\nextern ngx_queue_t                          ngx_rtmp_init_queue;\n#elif (nginx_version >= 1007005)\nextern ngx_thread_volatile ngx_queue_t      ngx_rtmp_init_queue;\n#else\nextern ngx_thread_volatile ngx_event_t     *ngx_rtmp_init_queue;\n#endif\n\nextern ngx_uint_t                           ngx_rtmp_max_module;\nextern ngx_module_t                         ngx_rtmp_module;\nextern ngx_module_t                         ngx_rtmp_core_module;\n\n#endif /* _NGX_RTMP_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_access_module.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_cmd_module.h\"\n\n\nstatic ngx_rtmp_publish_pt          next_publish;\nstatic ngx_rtmp_play_pt             next_play;\n\n\n#define NGX_RTMP_ACCESS_PUBLISH     0x01\n#define NGX_RTMP_ACCESS_PLAY        0x02\n\n\nstatic char * ngx_rtmp_access_rule(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\nstatic ngx_int_t ngx_rtmp_access_postconfiguration(ngx_conf_t *cf);\nstatic void * ngx_rtmp_access_create_app_conf(ngx_conf_t *cf);\nstatic char * ngx_rtmp_access_merge_app_conf(ngx_conf_t *cf,\n       void *parent, void *child);\n\n\ntypedef struct {\n    in_addr_t               mask;\n    in_addr_t               addr;\n    ngx_uint_t              deny;\n    ngx_uint_t              flags;\n} ngx_rtmp_access_rule_t;\n\n\n#if (NGX_HAVE_INET6)\n\ntypedef struct {\n    struct in6_addr         addr;\n    struct in6_addr         mask;\n    ngx_uint_t              deny;\n    ngx_uint_t              flags;\n} ngx_rtmp_access_rule6_t;\n\n#endif\n\n\ntypedef struct {\n    ngx_array_t             rules;     /* array of ngx_rtmp_access_rule_t */\n#if (NGX_HAVE_INET6)\n    ngx_array_t             rules6;    /* array of ngx_rtmp_access_rule6_t */\n#endif\n} ngx_rtmp_access_app_conf_t;\n\n\nstatic ngx_command_t  ngx_rtmp_access_commands[] = {\n\n    { ngx_string(\"allow\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE12,\n      ngx_rtmp_access_rule,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"deny\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE12,\n      ngx_rtmp_access_rule,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_rtmp_access_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_rtmp_access_postconfiguration,      /* postconfiguration */\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    ngx_rtmp_access_create_app_conf,        /* create app configuration */\n    ngx_rtmp_access_merge_app_conf,         /* merge app configuration */\n};\n\n\nngx_module_t  ngx_rtmp_access_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_access_module_ctx,            /* module context */\n    ngx_rtmp_access_commands,               /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_rtmp_access_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_access_app_conf_t      *aacf;\n\n    aacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_access_app_conf_t));\n    if (aacf == NULL) {\n        return NULL;\n    }\n\n    if (ngx_array_init(&aacf->rules, cf->pool, 1,\n                       sizeof(ngx_rtmp_access_rule_t))\n        != NGX_OK)\n    {\n        return NULL;\n    }\n\n#if (NGX_HAVE_INET6)\n    if (ngx_array_init(&aacf->rules6, cf->pool, 1,\n                       sizeof(ngx_rtmp_access_rule6_t))\n        != NGX_OK)\n    {\n        return NULL;\n    }\n#endif\n\n    return aacf;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_access_merge_rules(ngx_array_t *prev, ngx_array_t *rules)\n{\n    void   *p;\n\n    if (prev->nelts == 0) {\n        return NGX_OK;\n    }\n\n    if (rules->nelts == 0) {\n        *rules = *prev;\n        return NGX_OK;\n    }\n\n    p = ngx_array_push_n(rules, prev->nelts);\n    if (p == NULL) {\n        return NGX_ERROR;\n    }\n\n    ngx_memcpy(p, prev->elts, prev->size * prev->nelts);\n\n    return NGX_OK;\n}\n\n\nstatic char *\nngx_rtmp_access_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_rtmp_access_app_conf_t *prev = parent;\n    ngx_rtmp_access_app_conf_t *conf = child;\n\n    if (ngx_rtmp_access_merge_rules(&prev->rules, &conf->rules) != NGX_OK) {\n        return NGX_CONF_ERROR;\n    }\n\n#if (NGX_HAVE_INET6)\n    if (ngx_rtmp_access_merge_rules(&prev->rules6, &conf->rules6) != NGX_OK) {\n        return NGX_CONF_ERROR;\n    }\n#endif\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_access_found(ngx_rtmp_session_t *s, ngx_uint_t deny)\n{\n    if (deny) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"access forbidden by rule\");\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_access_inet(ngx_rtmp_session_t *s, in_addr_t addr, ngx_uint_t flag)\n{\n    ngx_uint_t                  i;\n    ngx_rtmp_access_rule_t     *rule;\n    ngx_rtmp_access_app_conf_t *ascf;\n\n    ascf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_access_module);\n\n    rule = ascf->rules.elts;\n    for (i = 0; i < ascf->rules.nelts; i++) {\n\n        ngx_log_debug3(NGX_LOG_DEBUG_HTTP, s->log, 0,\n                       \"access: %08XD %08XD %08XD\",\n                       addr, rule[i].mask, rule[i].addr);\n\n        if ((addr & rule[i].mask) == rule[i].addr && (flag & rule[i].flags)) {\n            return ngx_rtmp_access_found(s, rule[i].deny);\n        }\n    }\n\n    return NGX_OK;\n}\n\n\n#if (NGX_HAVE_INET6)\n\nstatic ngx_int_t\nngx_rtmp_access_inet6(ngx_rtmp_session_t *s, u_char *p, ngx_uint_t flag)\n{\n    ngx_uint_t                  n;\n    ngx_uint_t                  i;\n    ngx_rtmp_access_rule6_t    *rule6;\n    ngx_rtmp_access_app_conf_t *ascf;\n\n    ascf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_access_module);\n\n    rule6 = ascf->rules6.elts;\n    for (i = 0; i < ascf->rules6.nelts; i++) {\n\n#if (NGX_DEBUG)\n        {\n        size_t  cl, ml, al;\n        u_char  ct[NGX_INET6_ADDRSTRLEN];\n        u_char  mt[NGX_INET6_ADDRSTRLEN];\n        u_char  at[NGX_INET6_ADDRSTRLEN];\n\n        cl = ngx_inet6_ntop(p, ct, NGX_INET6_ADDRSTRLEN);\n        ml = ngx_inet6_ntop(rule6[i].mask.s6_addr, mt, NGX_INET6_ADDRSTRLEN);\n        al = ngx_inet6_ntop(rule6[i].addr.s6_addr, at, NGX_INET6_ADDRSTRLEN);\n\n        ngx_log_debug6(NGX_LOG_DEBUG_HTTP, s->log, 0,\n                       \"access: %*s %*s %*s\", cl, ct, ml, mt, al, at);\n        }\n#endif\n\n        for (n = 0; n < 16; n++) {\n            if ((p[n] & rule6[i].mask.s6_addr[n]) != rule6[i].addr.s6_addr[n]) {\n                goto next;\n            }\n        }\n\n        if (flag & rule6[i].flags) {\n            return ngx_rtmp_access_found(s, rule6[i].deny);\n        }\n\n    next:\n        continue;\n    }\n\n    return NGX_OK;\n}\n\n#endif\n\n\nstatic ngx_int_t\nngx_rtmp_access(ngx_rtmp_session_t *s, ngx_uint_t flag)\n{\n    struct sockaddr_in             *sin;\n    ngx_rtmp_access_app_conf_t     *ascf;\n#if (NGX_HAVE_INET6)\n    u_char                         *p;\n    in_addr_t                       addr;\n    struct sockaddr_in6            *sin6;\n#endif\n\n    ascf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_access_module);\n    if (ascf == NULL) {\n        ngx_log_debug0(NGX_LOG_DEBUG_HTTP, s->log, 0,\n                       \"access: NULL app conf\");\n        return NGX_ERROR;\n    }\n\n    /* relay etc */\n    if (s->sockaddr == NULL) {\n        return NGX_OK;\n    }\n\n    switch (s->sockaddr->sa_family) {\n\n    case AF_INET:\n        sin = (struct sockaddr_in *) s->sockaddr;\n        return ngx_rtmp_access_inet(s, sin->sin_addr.s_addr, flag);\n\n#if (NGX_HAVE_INET6)\n\n    case AF_INET6:\n        sin6 = (struct sockaddr_in6 *) s->sockaddr;\n        p = sin6->sin6_addr.s6_addr;\n\n        if (IN6_IS_ADDR_V4MAPPED(&sin6->sin6_addr)) {\n            addr  = p[12] << 24;\n            addr += p[13] << 16;\n            addr += p[14] << 8;\n            addr += p[15];\n            return ngx_rtmp_access_inet(s, htonl(addr), flag);\n        }\n\n        return ngx_rtmp_access_inet6(s, p, flag);\n\n#endif\n    }\n\n    return NGX_OK;\n}\n\n\nstatic char *\nngx_rtmp_access_rule(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_rtmp_access_app_conf_t         *ascf = conf;\n\n    ngx_int_t                           rc;\n    ngx_uint_t                          all;\n    ngx_str_t                          *value;\n    ngx_cidr_t                          cidr;\n    ngx_rtmp_access_rule_t             *rule;\n#if (NGX_HAVE_INET6)\n    ngx_rtmp_access_rule6_t            *rule6;\n#endif\n    size_t                              n;\n    ngx_uint_t                          flags;\n\n    ngx_memzero(&cidr, sizeof(ngx_cidr_t));\n\n    value = cf->args->elts;\n\n    n = 1;\n    flags = 0;\n\n    if (cf->args->nelts == 2) {\n\n        flags = NGX_RTMP_ACCESS_PUBLISH | NGX_RTMP_ACCESS_PLAY;\n\n    } else {\n\n        for(; n < cf->args->nelts - 1; ++n) {\n\n            if (value[n].len == sizeof(\"publish\") - 1 &&\n                ngx_strcmp(value[1].data, \"publish\") == 0)\n            {\n                flags |= NGX_RTMP_ACCESS_PUBLISH;\n                continue;\n\n            }\n\n            if (value[n].len == sizeof(\"play\") - 1 &&\n                ngx_strcmp(value[1].data, \"play\") == 0)\n            {\n                flags |= NGX_RTMP_ACCESS_PLAY;\n                continue;\n\n            }\n\n            ngx_log_error(NGX_LOG_ERR, cf->log, 0,\n                          \"unexpected access specified: '%V'\", &value[n]);\n            return NGX_CONF_ERROR;\n        }\n    }\n\n    all = (value[n].len == 3 && ngx_strcmp(value[n].data, \"all\") == 0);\n\n    if (!all) {\n\n        rc = ngx_ptocidr(&value[n], &cidr);\n\n        if (rc == NGX_ERROR) {\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                               \"invalid parameter \\\"%V\\\"\", &value[1]);\n            return NGX_CONF_ERROR;\n        }\n\n        if (rc == NGX_DONE) {\n            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,\n                               \"low address bits of %V are meaningless\",\n                               &value[1]);\n        }\n    }\n\n    switch (cidr.family) {\n\n#if (NGX_HAVE_INET6)\n    case AF_INET6:\n    case 0: /* all */\n\n        rule6 = ngx_array_push(&ascf->rules6);\n        if (rule6 == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n        rule6->mask = cidr.u.in6.mask;\n        rule6->addr = cidr.u.in6.addr;\n        rule6->deny = (value[0].data[0] == 'd') ? 1 : 0;\n        rule6->flags = flags;\n\n        if (!all) {\n            break;\n        }\n\n        rule = ngx_array_push(&ascf->rules);\n        if (rule == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n        rule->mask = cidr.u.in.mask;\n        rule->addr = cidr.u.in.addr;\n        rule->deny = (value[0].data[0] == 'd') ? 1 : 0;\n        rule->flags = flags;\n\n        break;\n        /* \"all\" passes through */\n#endif\n\n    default: /* AF_INET */\n\n        rule = ngx_array_push(&ascf->rules);\n        if (rule == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n        rule->mask = cidr.u.in.mask;\n        rule->addr = cidr.u.in.addr;\n        rule->deny = (value[0].data[0] == 'd') ? 1 : 0;\n        rule->flags = flags;\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_access_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v)\n{\n    if (s->interprocess) {\n        goto next;\n    }\n\n    if (ngx_rtmp_access(s, NGX_RTMP_ACCESS_PUBLISH) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\nnext:\n    return next_publish(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_access_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v)\n{\n    if (ngx_rtmp_access(s, NGX_RTMP_ACCESS_PLAY) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    return next_play(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_access_postconfiguration(ngx_conf_t *cf)\n{\n    /* chain handlers */\n    next_publish = ngx_rtmp_publish;\n    ngx_rtmp_publish = ngx_rtmp_access_publish;\n\n    next_play = ngx_rtmp_play;\n    ngx_rtmp_play = ngx_rtmp_access_play;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_amf.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp_amf.h\"\n#include \"ngx_rtmp.h\"\n#include <string.h>\n\n\nstatic ngx_inline void*\nngx_rtmp_amf_reverse_copy(void *dst, void* src, size_t len)\n{\n    size_t  k;\n\n    if (dst == NULL || src == NULL) {\n        return NULL;\n    }\n\n    for(k = 0; k < len; ++k) {\n        ((u_char*)dst)[k] = ((u_char*)src)[len - 1 - k];\n    }\n\n    return dst;\n}\n\n#define NGX_RTMP_AMF_DEBUG_SIZE 16\n\n#ifdef NGX_DEBUG\nstatic void\nngx_rtmp_amf_debug(const char* op, ngx_log_t *log, u_char *p, size_t n)\n{\n    u_char          hstr[3 * NGX_RTMP_AMF_DEBUG_SIZE + 1];\n    u_char          str[NGX_RTMP_AMF_DEBUG_SIZE + 1];\n    u_char         *hp, *sp;\n    static u_char   hex[] = \"0123456789ABCDEF\";\n    size_t          i;\n\n    hp = hstr;\n    sp = str;\n\n    for(i = 0; i < n && i < NGX_RTMP_AMF_DEBUG_SIZE; ++i) {\n        *hp++ = ' ';\n        if (p) {\n            *hp++ = hex[(*p & 0xf0) >> 4];\n            *hp++ = hex[*p & 0x0f];\n            *sp++ = (*p >= 0x20 && *p <= 0x7e) ?\n                *p : (u_char)'?';\n            ++p;\n        } else {\n            *hp++ = 'X';\n            *hp++ = 'X';\n            *sp++ = '?';\n        }\n    }\n    *hp = *sp = '\\0';\n\n    ngx_log_debug4(NGX_LOG_DEBUG_RTMP, log, 0,\n            \"AMF %s (%d)%s '%s'\", op, n, hstr, str);\n}\n#endif\n\nstatic ngx_int_t\nngx_rtmp_amf_get(ngx_rtmp_amf_ctx_t *ctx, void *p, size_t n)\n{\n    size_t          size;\n    ngx_chain_t    *l;\n    size_t          offset;\n    u_char         *pos, *last;\n#ifdef NGX_DEBUG\n    void           *op = p;\n    size_t          on = n;\n#endif\n\n    if (!n)\n        return NGX_OK;\n\n    for(l = ctx->link, offset = ctx->offset; l; l = l->next, offset = 0) {\n\n        pos  = l->buf->pos + offset;\n        last = l->buf->last;\n\n        if (last >= pos + n) {\n            if (p) {\n                p = ngx_cpymem(p, pos, n);\n            }\n            ctx->offset = offset + n;\n            ctx->link = l;\n\n#ifdef NGX_DEBUG\n            ngx_rtmp_amf_debug(\"read\", ctx->log, (u_char*)op, on);\n#endif\n\n            return NGX_OK;\n        }\n\n        size = last - pos;\n\n        if (p) {\n            p = ngx_cpymem(p, pos, size);\n        }\n\n        n -= size;\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, ctx->log, 0,\n            \"AMF read eof (%d)\", n);\n\n    return NGX_DONE;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_amf_put(ngx_rtmp_amf_ctx_t *ctx, void *p, size_t n)\n{\n    ngx_buf_t       *b;\n    size_t          size;\n    ngx_chain_t    *l, *ln;\n\n#ifdef NGX_DEBUG\n    ngx_rtmp_amf_debug(\"write\", ctx->log, (u_char*)p, n);\n#endif\n\n    l = ctx->link;\n\n    if (ctx->link && ctx->first == NULL) {\n        ctx->first = ctx->link;\n    }\n\n    while(n) {\n        b = l ? l->buf : NULL;\n\n        if (b == NULL || b->last == b->end) {\n\n            ln = ctx->alloc(ctx->arg);\n            if (ln == NULL) {\n                return NGX_ERROR;\n            }\n\n            if (ctx->first == NULL) {\n                ctx->first = ln;\n            }\n\n            if (l) {\n                l->next = ln;\n            }\n\n            l = ln;\n            ctx->link = l;\n            b = l->buf;\n        }\n\n        size = b->end - b->last;\n\n        if (size >= n) {\n            b->last = ngx_cpymem(b->last, p, n);\n            return NGX_OK;\n        }\n\n        b->last = ngx_cpymem(b->last, p, size);\n        p = (u_char*)p + size;\n        n -= size;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_amf_read_object(ngx_rtmp_amf_ctx_t *ctx, ngx_rtmp_amf_elt_t *elts,\n        size_t nelts)\n{\n    uint8_t                 type;\n    uint16_t                len;\n    size_t                  n, namelen, maxlen;\n    ngx_int_t               rc;\n    u_char                  buf[2];\n\n    maxlen = 0;\n    for(n = 0; n < nelts; ++n) {\n        namelen = elts[n].name.len;\n        if (namelen > maxlen)\n            maxlen = namelen;\n    }\n\n    for( ;; ) {\n\n#if !(NGX_WIN32)\n        char    name[maxlen];\n#else\n        char    name[1024];\n        if (maxlen > sizeof(name)) {\n            return NGX_ERROR;\n        }\n#endif\n        /* read key */\n        switch (ngx_rtmp_amf_get(ctx, buf, 2)) {\n        case NGX_DONE:\n            /* Envivio sends unfinalized arrays */\n            return NGX_OK;\n        case NGX_OK:\n            break;\n        default:\n            return NGX_ERROR;\n        }\n\n        ngx_rtmp_amf_reverse_copy(&len, buf, 2);\n\n        if (!len)\n            break;\n\n        if (len <= maxlen) {\n            rc = ngx_rtmp_amf_get(ctx, name, len);\n\n        } else {\n            rc = ngx_rtmp_amf_get(ctx, name, maxlen);\n            if (rc != NGX_OK)\n                return NGX_ERROR;\n            rc = ngx_rtmp_amf_get(ctx, 0, len - maxlen);\n        }\n\n        if (rc != NGX_OK)\n            return NGX_ERROR;\n\n        /* TODO: if we require array to be sorted on name\n         * then we could be able to use binary search */\n        for(n = 0; n < nelts\n                && (len != elts[n].name.len\n                    || ngx_strncmp(name, elts[n].name.data, len));\n                ++n);\n\n        if (ngx_rtmp_amf_read(ctx, n < nelts ? &elts[n] : NULL, 1) != NGX_OK)\n            return NGX_ERROR;\n    }\n\n    if (ngx_rtmp_amf_get(ctx, &type, 1) != NGX_OK\n        || type != NGX_RTMP_AMF_END)\n    {\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_amf_read_array(ngx_rtmp_amf_ctx_t *ctx, ngx_rtmp_amf_elt_t *elts,\n        size_t nelts)\n{\n    uint32_t                len;\n    size_t                  n;\n    u_char                  buf[4];\n\n    /* read length */\n    if (ngx_rtmp_amf_get(ctx, buf, 4) != NGX_OK)\n        return NGX_ERROR;\n\n    ngx_rtmp_amf_reverse_copy(&len, buf, 4);\n\n    for (n = 0; n < len; ++n) {\n        if (ngx_rtmp_amf_read(ctx, n < nelts ? &elts[n] : NULL, 1) != NGX_OK)\n            return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_amf_read_variant(ngx_rtmp_amf_ctx_t *ctx, ngx_rtmp_amf_elt_t *elts,\n        size_t nelts)\n{\n    uint8_t                 type;\n    ngx_int_t               rc;\n    size_t                  n;\n    ngx_rtmp_amf_elt_t      elt;\n\n    rc = ngx_rtmp_amf_get(ctx, &type, 1);\n    if (rc != NGX_OK) {\n        return rc;\n    }\n\n    ngx_memzero(&elt, sizeof(elt));\n    for (n = 0; n < nelts; ++n, ++elts) {\n        if (type == elts->type) {\n            elt.data = elts->data;\n            elt.len  = elts->len;\n        }\n    }\n\n    elt.type = type | NGX_RTMP_AMF_TYPELESS;\n\n    return ngx_rtmp_amf_read(ctx, &elt, 1);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_amf_is_compatible_type(uint8_t t1, uint8_t t2)\n{\n    return t1 == t2\n        || (t1 == NGX_RTMP_AMF_OBJECT && t2 == NGX_RTMP_AMF_MIXED_ARRAY)\n        || (t2 == NGX_RTMP_AMF_OBJECT && t1 == NGX_RTMP_AMF_MIXED_ARRAY);\n}\n\n\nngx_int_t\nngx_rtmp_amf_read(ngx_rtmp_amf_ctx_t *ctx, ngx_rtmp_amf_elt_t *elts,\n        size_t nelts)\n{\n    void                       *data;\n    ngx_int_t                   type;\n    uint8_t                     type8;\n    size_t                      n;\n    uint16_t                    len;\n    ngx_int_t                   rc;\n    u_char                      buf[8];\n    uint32_t                    max_index;\n\n    for(n = 0; n < nelts; ++n) {\n\n        if (elts && elts->type & NGX_RTMP_AMF_TYPELESS) {\n            type = elts->type & ~NGX_RTMP_AMF_TYPELESS;\n            data = elts->data;\n\n        } else {\n            switch (ngx_rtmp_amf_get(ctx, &type8, 1)) {\n                case NGX_DONE:\n                    if (elts->type & NGX_RTMP_AMF_OPTIONAL) {\n                        return NGX_OK;\n                    } else {\n                        return NGX_ERROR;\n                    }\n                    break;\n                case NGX_ERROR:\n                    return NGX_ERROR;\n            }\n            type = type8;\n            data = (elts &&\n                    ngx_rtmp_amf_is_compatible_type(\n                                 (uint8_t) (elts->type & 0xff), (uint8_t) type))\n                ? elts->data\n                : NULL;\n\n            if (elts && (elts->type & NGX_RTMP_AMF_CONTEXT)) {\n                if (data) {\n                    *(ngx_rtmp_amf_ctx_t *) data = *ctx;\n                }\n                data = NULL;\n            }\n        }\n\n        switch (type) {\n            case NGX_RTMP_AMF_NUMBER:\n                if (ngx_rtmp_amf_get(ctx, buf, 8) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n                ngx_rtmp_amf_reverse_copy(data, buf, 8);\n                break;\n\n            case NGX_RTMP_AMF_BOOLEAN:\n                if (ngx_rtmp_amf_get(ctx, data, 1) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n                break;\n\n            case NGX_RTMP_AMF_STRING:\n                if (ngx_rtmp_amf_get(ctx, buf, 2) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n                ngx_rtmp_amf_reverse_copy(&len, buf, 2);\n\n                if (data == NULL) {\n                    rc = ngx_rtmp_amf_get(ctx, data, len);\n\n                } else if (elts->len <= len) {\n                    rc = ngx_rtmp_amf_get(ctx, data, elts->len - 1);\n                    if (rc != NGX_OK)\n                        return NGX_ERROR;\n                    ((char*)data)[elts->len - 1] = 0;\n                    rc = ngx_rtmp_amf_get(ctx, NULL, len - elts->len + 1);\n\n                } else {\n                    rc = ngx_rtmp_amf_get(ctx, data, len);\n                    ((char*)data)[len] = 0;\n                }\n\n                if (rc != NGX_OK) {\n                    return NGX_ERROR;\n                }\n\n                break;\n\n            case NGX_RTMP_AMF_NULL:\n            case NGX_RTMP_AMF_ARRAY_NULL:\n                break;\n\n            case NGX_RTMP_AMF_MIXED_ARRAY:\n                if (ngx_rtmp_amf_get(ctx, &max_index, 4) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n                if (ngx_rtmp_amf_read_object(ctx, data,\n                    data && elts ? elts->len / sizeof(ngx_rtmp_amf_elt_t) : 0\n                    ) != NGX_OK)\n                {\n                    return NGX_ERROR;\n                }\n                break;\n\n            case NGX_RTMP_AMF_OBJECT:\n                if (ngx_rtmp_amf_read_object(ctx, data,\n                    data && elts ? elts->len / sizeof(ngx_rtmp_amf_elt_t) : 0\n                    ) != NGX_OK)\n                {\n                    return NGX_ERROR;\n                }\n                break;\n\n            case NGX_RTMP_AMF_ARRAY:\n                if (ngx_rtmp_amf_read_array(ctx, data,\n                    data && elts ? elts->len / sizeof(ngx_rtmp_amf_elt_t) : 0\n                    ) != NGX_OK)\n                {\n                    return NGX_ERROR;\n                }\n                break;\n\n            case NGX_RTMP_AMF_VARIANT_:\n                if (ngx_rtmp_amf_read_variant(ctx, data,\n                    data && elts ? elts->len / sizeof(ngx_rtmp_amf_elt_t) : 0\n                    ) != NGX_OK)\n                {\n                    return NGX_ERROR;\n                }\n                break;\n\n            case NGX_RTMP_AMF_INT8:\n                if (ngx_rtmp_amf_get(ctx, data, 1) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n                break;\n\n            case NGX_RTMP_AMF_INT16:\n                if (ngx_rtmp_amf_get(ctx, buf, 2) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n                ngx_rtmp_amf_reverse_copy(data, buf, 2);\n                break;\n\n            case NGX_RTMP_AMF_INT32:\n                if (ngx_rtmp_amf_get(ctx, buf, 4) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n                ngx_rtmp_amf_reverse_copy(data, buf, 4);\n                break;\n\n            case NGX_RTMP_AMF_END:\n                return NGX_OK;\n\n            default:\n                return NGX_ERROR;\n        }\n\n        if (elts) {\n            ++elts;\n        }\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_amf_write_object(ngx_rtmp_amf_ctx_t *ctx,\n        ngx_rtmp_amf_elt_t *elts, size_t nelts)\n{\n    uint16_t                len;\n    size_t                  n;\n    u_char                  buf[2];\n\n    for(n = 0; n < nelts; ++n) {\n\n        len = (uint16_t) elts[n].name.len;\n\n        if (ngx_rtmp_amf_put(ctx,\n                    ngx_rtmp_amf_reverse_copy(buf,\n                        &len, 2), 2) != NGX_OK)\n        {\n            return NGX_ERROR;\n        }\n\n        if (ngx_rtmp_amf_put(ctx, elts[n].name.data, len) != NGX_OK) {\n            return NGX_ERROR;\n        }\n\n        if (ngx_rtmp_amf_write(ctx, &elts[n], 1) != NGX_OK) {\n            return NGX_ERROR;\n        }\n    }\n\n    if (ngx_rtmp_amf_put(ctx, \"\\0\\0\", 2) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_amf_write_array(ngx_rtmp_amf_ctx_t *ctx,\n        ngx_rtmp_amf_elt_t *elts, size_t nelts)\n{\n    uint32_t                len;\n    size_t                  n;\n    u_char                  buf[4];\n\n    len = nelts;\n    if (ngx_rtmp_amf_put(ctx,\n                ngx_rtmp_amf_reverse_copy(buf,\n                    &len, 4), 4) != NGX_OK)\n    {\n        return NGX_ERROR;\n    }\n\n    for(n = 0; n < nelts; ++n) {\n        if (ngx_rtmp_amf_write(ctx, &elts[n], 1) != NGX_OK) {\n            return NGX_ERROR;\n        }\n    }\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_amf_write(ngx_rtmp_amf_ctx_t *ctx,\n        ngx_rtmp_amf_elt_t *elts, size_t nelts)\n{\n    size_t                  n;\n    ngx_int_t               type;\n    uint8_t                 type8;\n    void                   *data;\n    uint16_t                len;\n    uint32_t                max_index;\n    u_char                  buf[8];\n\n    for(n = 0; n < nelts; ++n) {\n\n        type = elts[n].type;\n        data = elts[n].data;\n        len  = (uint16_t) elts[n].len;\n\n        if (type & NGX_RTMP_AMF_TYPELESS) {\n            type &= ~NGX_RTMP_AMF_TYPELESS;\n        } else {\n            type8 = (uint8_t)type;\n            if (ngx_rtmp_amf_put(ctx, &type8, 1) != NGX_OK)\n                return NGX_ERROR;\n        }\n\n        switch(type) {\n            case NGX_RTMP_AMF_NUMBER:\n                if (ngx_rtmp_amf_put(ctx,\n                            ngx_rtmp_amf_reverse_copy(buf,\n                                data, 8), 8) != NGX_OK)\n                {\n                    return NGX_ERROR;\n                }\n                break;\n\n            case NGX_RTMP_AMF_BOOLEAN:\n                if (ngx_rtmp_amf_put(ctx, data, 1) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n                break;\n\n            case NGX_RTMP_AMF_STRING:\n                if (len == 0 && data) {\n                    len = (uint16_t) ngx_strlen((u_char*) data);\n                }\n\n                if (ngx_rtmp_amf_put(ctx,\n                            ngx_rtmp_amf_reverse_copy(buf,\n                                &len, 2), 2) != NGX_OK)\n                {\n                    return NGX_ERROR;\n                }\n\n                if (ngx_rtmp_amf_put(ctx, data, len) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n                break;\n\n            case NGX_RTMP_AMF_NULL:\n            case NGX_RTMP_AMF_ARRAY_NULL:\n                break;\n\n            case NGX_RTMP_AMF_MIXED_ARRAY:\n                max_index = 0;\n                if (ngx_rtmp_amf_put(ctx, &max_index, 4) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n\n                type8 = NGX_RTMP_AMF_END;\n                if (ngx_rtmp_amf_write_object(ctx, data,\n                        elts[n].len / sizeof(ngx_rtmp_amf_elt_t)) != NGX_OK\n                    || ngx_rtmp_amf_put(ctx, &type8, 1) != NGX_OK)\n                {\n                    return NGX_ERROR;\n                }\n                break;\n\n            case NGX_RTMP_AMF_OBJECT:\n                type8 = NGX_RTMP_AMF_END;\n                if (ngx_rtmp_amf_write_object(ctx, data,\n                        elts[n].len / sizeof(ngx_rtmp_amf_elt_t)) != NGX_OK\n                    || ngx_rtmp_amf_put(ctx, &type8, 1) != NGX_OK)\n                {\n                    return NGX_ERROR;\n                }\n                break;\n\n            case NGX_RTMP_AMF_ARRAY:\n                if (ngx_rtmp_amf_write_array(ctx, data,\n                        elts[n].len / sizeof(ngx_rtmp_amf_elt_t)) != NGX_OK)\n                {\n                    return NGX_ERROR;\n                }\n                break;\n\n            case NGX_RTMP_AMF_INT8:\n                if (ngx_rtmp_amf_put(ctx, data, 1) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n                break;\n\n            case NGX_RTMP_AMF_INT16:\n                if (ngx_rtmp_amf_put(ctx,\n                            ngx_rtmp_amf_reverse_copy(buf,\n                                data, 2), 2) != NGX_OK)\n                {\n                    return NGX_ERROR;\n                }\n                break;\n\n            case NGX_RTMP_AMF_INT32:\n                if (ngx_rtmp_amf_put(ctx,\n                            ngx_rtmp_amf_reverse_copy(buf,\n                                data, 4), 4) != NGX_OK)\n                {\n                    return NGX_ERROR;\n                }\n                break;\n\n            default:\n                return NGX_ERROR;\n        }\n    }\n\n    return NGX_OK;\n}\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_amf.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#ifndef _NGX_RTMP_AMF_H_INCLUDED_\n#define _NGX_RTMP_AMF_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n\n/* basic types */\n#define NGX_RTMP_AMF_NUMBER             0x00\n#define NGX_RTMP_AMF_BOOLEAN            0x01\n#define NGX_RTMP_AMF_STRING             0x02\n#define NGX_RTMP_AMF_OBJECT             0x03\n#define NGX_RTMP_AMF_NULL               0x05\n#define NGX_RTMP_AMF_ARRAY_NULL         0x06\n#define NGX_RTMP_AMF_MIXED_ARRAY        0x08\n#define NGX_RTMP_AMF_END                0x09\n#define NGX_RTMP_AMF_ARRAY              0x0a\n\n/* extended types */\n#define NGX_RTMP_AMF_INT8               0x0100\n#define NGX_RTMP_AMF_INT16              0x0101\n#define NGX_RTMP_AMF_INT32              0x0102\n#define NGX_RTMP_AMF_VARIANT_           0x0103\n\n/* r/w flags */\n#define NGX_RTMP_AMF_OPTIONAL           0x1000\n#define NGX_RTMP_AMF_TYPELESS           0x2000\n#define NGX_RTMP_AMF_CONTEXT            0x4000\n\n#define NGX_RTMP_AMF_VARIANT            (NGX_RTMP_AMF_VARIANT_\\\n                                        |NGX_RTMP_AMF_TYPELESS)\n\n\ntypedef struct {\n    ngx_int_t                           type;\n    ngx_str_t                           name;\n    void                               *data;\n    size_t                              len;\n} ngx_rtmp_amf_elt_t;\n\n\ntypedef ngx_chain_t * (*ngx_rtmp_amf_alloc_pt)(void *arg);\n\n\ntypedef struct {\n    ngx_chain_t                        *link, *first;\n    size_t                              offset;\n    ngx_rtmp_amf_alloc_pt               alloc;\n    void                               *arg;\n    ngx_log_t                          *log;\n} ngx_rtmp_amf_ctx_t;\n\n\n/* reading AMF */\nngx_int_t ngx_rtmp_amf_read(ngx_rtmp_amf_ctx_t *ctx,\n        ngx_rtmp_amf_elt_t *elts, size_t nelts);\n\n/* writing AMF */\nngx_int_t ngx_rtmp_amf_write(ngx_rtmp_amf_ctx_t *ctx,\n        ngx_rtmp_amf_elt_t *elts, size_t nelts);\n\n\n#endif /* _NGX_RTMP_AMF_H_INCLUDED_ */\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_bandwidth.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp_bandwidth.h\"\n\n\nvoid\nngx_rtmp_update_bandwidth(ngx_rtmp_bandwidth_t *bw, uint32_t bytes)\n{\n    if (ngx_cached_time->sec > bw->intl_end) {\n        bw->bandwidth = ngx_cached_time->sec >\n            bw->intl_end + NGX_RTMP_BANDWIDTH_INTERVAL\n            ? 0\n            : bw->intl_bytes / NGX_RTMP_BANDWIDTH_INTERVAL;\n        bw->intl_bytes = 0;\n        bw->intl_end = ngx_cached_time->sec + NGX_RTMP_BANDWIDTH_INTERVAL;\n    }\n\n    bw->bytes += bytes;\n    bw->intl_bytes += bytes;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_bandwidth.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#ifndef _NGX_RTMP_BANDWIDTH_H_INCLUDED_\n#define _NGX_RTMP_BANDWIDTH_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n\n/* Bandwidth update interval in seconds */\n#define NGX_RTMP_BANDWIDTH_INTERVAL     10\n\n\ntypedef struct {\n    uint64_t            bytes;\n    uint64_t            bandwidth;      /* bytes/sec */\n\n    time_t              intl_end;\n    uint64_t            intl_bytes;\n} ngx_rtmp_bandwidth_t;\n\n\nvoid ngx_rtmp_update_bandwidth(ngx_rtmp_bandwidth_t *bw, uint32_t bytes);\n\n\n#endif /* _NGX_RTMP_BANDWIDTH_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_bitop.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp_bitop.h\"\n\n\nvoid\nngx_rtmp_bit_init_reader(ngx_rtmp_bit_reader_t *br, u_char *pos, u_char *last)\n{\n    ngx_memzero(br, sizeof(ngx_rtmp_bit_reader_t));\n\n    br->pos = pos;\n    br->last = last;\n}\n\n\nuint64_t\nngx_rtmp_bit_read(ngx_rtmp_bit_reader_t *br, ngx_uint_t n)\n{\n    uint64_t    v;\n    ngx_uint_t  d;\n\n    v = 0;\n\n    while (n) {\n\n        if (br->pos >= br->last) {\n            br->err = 1;\n            return 0;\n        }\n\n        d = (br->offs + n > 8 ? (ngx_uint_t) (8 - br->offs) : n);\n\n        v <<= d;\n        v += (*br->pos >> (8 - br->offs - d)) & ((u_char) 0xff >> (8 - d));\n\n        br->offs += d;\n        n -= d;\n\n        if (br->offs == 8) {\n            br->pos++;\n            br->offs = 0;\n        }\n    }\n\n    return v;\n}\n\n\nuint64_t\nngx_rtmp_bit_read_golomb(ngx_rtmp_bit_reader_t *br)\n{\n    ngx_uint_t  n;\n\n    for (n = 0; ngx_rtmp_bit_read(br, 1) == 0 && !br->err; n++);\n\n    return ((uint64_t) 1 << n) + ngx_rtmp_bit_read(br, n) - 1;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_bitop.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#ifndef _NGX_RTMP_BITOP_H_INCLUDED_\n#define _NGX_RTMP_BITOP_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n\ntypedef struct {\n    u_char      *pos;\n    u_char      *last;\n    ngx_uint_t   offs;\n    ngx_uint_t   err;\n} ngx_rtmp_bit_reader_t;\n\n\nvoid ngx_rtmp_bit_init_reader(ngx_rtmp_bit_reader_t *br, u_char *pos,\n    u_char *last);\nuint64_t ngx_rtmp_bit_read(ngx_rtmp_bit_reader_t *br, ngx_uint_t n);\nuint64_t ngx_rtmp_bit_read_golomb(ngx_rtmp_bit_reader_t *br);\n\n\n#define ngx_rtmp_bit_read_err(br) ((br)->err)\n\n#define ngx_rtmp_bit_read_eof(br) ((br)->pos == (br)->last)\n\n#define ngx_rtmp_bit_read_8(br)                                               \\\n    ((uint8_t) ngx_rtmp_bit_read(br, 8))\n\n#define ngx_rtmp_bit_read_16(br)                                              \\\n    ((uint16_t) ngx_rtmp_bit_read(br, 16))\n\n#define ngx_rtmp_bit_read_32(br)                                              \\\n    ((uint32_t) ngx_rtmp_bit_read(br, 32))\n\n#define ngx_rtmp_bit_read_64(br)                                              \\\n    ((uint64_t) ngx_rtmp_read(br, 64))\n\n\n#endif /* _NGX_RTMP_BITOP_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_cmd_module.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp_cmd_module.h\"\n#include \"ngx_rtmp_notify_module.h\"\n#include \"ngx_rtmp_streams.h\"\n#include \"ngx_stream_zone_module.h\"\n#include \"ngx_dynamic_conf.h\"\n#include \"ngx_toolkit_misc.h\"\n#include \"ngx_rtmp_dynamic.h\"\n\n\n#define NGX_RTMP_FMS_VERSION        \"FMS/3,0,1,123\"\n#define NGX_RTMP_CAPABILITIES       31\n\n\nstatic ngx_int_t ngx_rtmp_cmd_connect(ngx_rtmp_session_t *s,\n       ngx_rtmp_connect_t *v);\nstatic ngx_int_t ngx_rtmp_cmd_disconnect(ngx_rtmp_session_t *s);\nstatic ngx_int_t ngx_rtmp_cmd_create_stream(ngx_rtmp_session_t *s,\n       ngx_rtmp_create_stream_t *v);\nstatic ngx_int_t ngx_rtmp_cmd_close_stream(ngx_rtmp_session_t *s,\n       ngx_rtmp_close_stream_t *v);\nstatic ngx_int_t ngx_rtmp_cmd_delete_stream(ngx_rtmp_session_t *s,\n       ngx_rtmp_delete_stream_t *v);\nstatic ngx_int_t ngx_rtmp_cmd_publish(ngx_rtmp_session_t *s,\n       ngx_rtmp_publish_t *v);\nstatic ngx_int_t ngx_rtmp_cmd_play(ngx_rtmp_session_t *s,\n       ngx_rtmp_play_t *v);\nstatic ngx_int_t ngx_rtmp_cmd_seek(ngx_rtmp_session_t *s,\n       ngx_rtmp_seek_t *v);\nstatic ngx_int_t ngx_rtmp_cmd_pause(ngx_rtmp_session_t *s,\n       ngx_rtmp_pause_t *v);\n\n\nstatic ngx_int_t ngx_rtmp_cmd_stream_begin(ngx_rtmp_session_t *s,\n       ngx_rtmp_stream_begin_t *v);\nstatic ngx_int_t ngx_rtmp_cmd_stream_eof(ngx_rtmp_session_t *s,\n       ngx_rtmp_stream_eof_t *v);\nstatic ngx_int_t ngx_rtmp_cmd_stream_dry(ngx_rtmp_session_t *s,\n       ngx_rtmp_stream_dry_t *v);\nstatic ngx_int_t ngx_rtmp_cmd_recorded(ngx_rtmp_session_t *s,\n       ngx_rtmp_recorded_t *v);\nstatic ngx_int_t ngx_rtmp_cmd_set_buflen(ngx_rtmp_session_t *s,\n       ngx_rtmp_set_buflen_t *v);\n\n\nngx_rtmp_connect_pt         ngx_rtmp_connect;\nngx_rtmp_disconnect_pt      ngx_rtmp_disconnect;\nngx_rtmp_create_stream_pt   ngx_rtmp_create_stream;\nngx_rtmp_close_stream_pt    ngx_rtmp_close_stream;\nngx_rtmp_delete_stream_pt   ngx_rtmp_delete_stream;\nngx_rtmp_publish_pt         ngx_rtmp_publish;\nngx_rtmp_play_pt            ngx_rtmp_play;\nngx_rtmp_seek_pt            ngx_rtmp_seek;\nngx_rtmp_pause_pt           ngx_rtmp_pause;\n\n\nngx_rtmp_stream_begin_pt    ngx_rtmp_stream_begin;\nngx_rtmp_stream_eof_pt      ngx_rtmp_stream_eof;\nngx_rtmp_stream_dry_pt      ngx_rtmp_stream_dry;\nngx_rtmp_recorded_pt        ngx_rtmp_recorded;\nngx_rtmp_set_buflen_pt      ngx_rtmp_set_buflen;\n\n\nstatic ngx_int_t ngx_rtmp_cmd_postconfiguration(ngx_conf_t *cf);\n\n\nstatic ngx_rtmp_module_t  ngx_rtmp_cmd_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_rtmp_cmd_postconfiguration,         /* postconfiguration */\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    NULL,                                   /* create app configuration */\n    NULL                                    /* merge app configuration */\n};\n\n\nngx_module_t  ngx_rtmp_cmd_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_cmd_module_ctx,               /* module context */\n    NULL,                                   /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nvoid\nngx_rtmp_cmd_fill_args(u_char name[NGX_RTMP_MAX_NAME],\n        u_char args[NGX_RTMP_MAX_ARGS])\n{\n    u_char      *p;\n\n    p = (u_char *)ngx_strchr(name, '?');\n    if (p == NULL) {\n        return;\n    }\n\n    *p++ = 0;\n    ngx_cpystrn(args, p, NGX_RTMP_MAX_ARGS);\n}\n\nvoid\nngx_rtmp_cmd_reset_vhost(ngx_rtmp_session_t *s, ngx_rtmp_connect_t *v)\n{\n    ngx_request_url_t           ru;\n    ngx_str_t                   tcurl;\n    char                       *p;\n\n    tcurl.data = v->tc_url;\n    tcurl.len = ngx_strlen(v->tc_url);\n\n    if (ngx_parse_request_url(&ru, &tcurl) == NGX_ERROR) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"tcurl error, %s\", v->tc_url);\n        return;\n    }\n\n    if (ngx_inet_addr(ru.host.data, ru.host.len) == INADDR_NONE) {\n        /* domain is not ip */\n        return;\n    }\n\n    p = ngx_strstr(v->app, \"/\");\n    if (p == NULL) { /* app only has one level */\n        return;\n    }\n\n    /* use first level of app as domain, the rest as app */\n    *ngx_snprintf(v->tc_url, NGX_RTMP_MAX_URL, \"rtmp://%s\", v->app) = 0;\n    *ngx_snprintf(v->app, NGX_RTMP_MAX_NAME, \"%s\", p + 1) = 0;\n}\n\nvoid\nngx_rtmp_cmd_middleware_init(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_core_srv_dconf_t  *rcsdf;\n    ngx_rtmp_core_srv_conf_t   *rcsf;\n    ngx_request_url_t           rurl;\n\n    if (ngx_parse_request_url(&rurl, &s->tc_url) == NGX_ERROR) {\n        return;\n    }\n\n    s->scheme = rurl.scheme;\n    s->domain = rurl.host;\n\n    rcsf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n    rcsdf = ngx_rtmp_get_module_srv_dconf(s, &ngx_rtmp_core_module);\n    if (rcsdf && rcsdf->serverid.len) {\n        s->serverid.data = ngx_pcalloc(s->pool,\n                                       rcsdf->serverid.len);\n        if (s->serverid.data == NULL) {\n            return;\n        }\n        s->serverid.len = rcsdf->serverid.len;\n        ngx_memcpy(s->serverid.data, rcsdf->serverid.data, s->serverid.len);\n    } else if (rcsf && rcsf->serverid.len) {\n        s->serverid.data = ngx_pcalloc(s->pool,\n                                       rcsf->serverid.len);\n        if (s->serverid.data == NULL) {\n            return;\n        }\n        s->serverid.len = rcsf->serverid.len;\n        ngx_memcpy(s->serverid.data, rcsf->serverid.data, s->serverid.len);\n    }else {\n        s->serverid = s->domain;\n    }\n}\n\nvoid\nngx_rtmp_cmd_stream_init(ngx_rtmp_session_t *s, u_char *name, u_char *args,\n        unsigned publishing)\n{\n    u_char                     *p;\n\n    if (s->name.len == 0) {\n        s->name.len = ngx_strlen(name);\n        s->name.data = ngx_palloc(s->pool, s->name.len);\n        ngx_memcpy(s->name.data, name, s->name.len);\n    }\n\n    if (s->pargs.len == 0) {\n        s->pargs.len = ngx_strlen(args);\n        s->pargs.data = ngx_palloc(s->pool, s->pargs.len);\n        ngx_memcpy(s->pargs.data, args, s->pargs.len);\n    }\n\n    if (s->stream.len == 0) {\n        /* serverid/app/name */\n        s->stream.len = s->serverid.len + 1 + s->app.len + 1 + s->name.len;\n        s->stream.data = ngx_palloc(s->pool, s->stream.len);\n        p = s->stream.data;\n\n        p = ngx_copy(p, s->serverid.data, s->serverid.len);\n        *p++ = '/';\n        p = ngx_copy(p, s->app.data, s->app.len);\n        *p++ = '/';\n        p = ngx_copy(p, s->name.data, s->name.len);\n    }\n\n    s->live_stream = ngx_live_create_stream(&s->serverid, &s->stream);\n\n    ngx_live_create_ctx(s, publishing);\n    s->publishing = publishing;\n\n    ngx_rtmp_notify_stream_start(s);\n}\n\nngx_int_t\nngx_rtmp_publish_filter(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v)\n{\n    if (s->published) {\n        ngx_log_error(NGX_LOG_INFO, s->log, 0, \"session has been published\");\n        return NGX_OK;\n    }\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0, \"rtmp publish filter\");\n\n    s->published = 1;\n\n    if (!s->relay) { /* relay pull */\n        ngx_rtmp_cmd_stream_init(s, v->name, v->args, 1);\n    }\n\n    return ngx_rtmp_publish(s, v);\n}\n\nngx_int_t\nngx_rtmp_play_filter(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v)\n{\n    if (s->played) {\n        ngx_log_error(NGX_LOG_INFO, s->log, 0, \"session has been played\");\n        return NGX_OK;\n    }\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0, \"rtmp play filter\");\n\n    s->played = 1;\n\n    if (!s->relay) { /* relay push */\n        ngx_rtmp_cmd_stream_init(s, v->name, v->args, 0);\n    }\n\n    return ngx_rtmp_play(s, v);\n}\n\nngx_int_t\nngx_rtmp_close_stream_filter(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)\n{\n    if (s->closed) {\n        ngx_log_error(NGX_LOG_INFO, s->log, 0, \"session has been closed\");\n        return NGX_OK;\n    }\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0, \"rtmp close stream filter\");\n\n    s->closed = 1;\n\n    ngx_live_delete_ctx(s);\n    if (s->live_stream && s->live_stream->play_ctx == NULL\n            && s->live_stream->publish_ctx == NULL)\n    {\n        if (s->live_stream->pslot == ngx_process_slot) {\n            ngx_stream_zone_delete_stream(&s->stream);\n        }\n        ngx_rtmp_notify_stream_done(s);\n        ngx_live_delete_stream(&s->serverid, &s->stream);\n    }\n\n    return ngx_rtmp_close_stream(s, v);\n}\n\nstatic ngx_int_t\nngx_rtmp_cmd_connect_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    size_t                      len;\n    ngx_rtmp_core_srv_conf_t   *cscf;\n    ngx_rtmp_core_app_conf_t  **cacfp;\n    ngx_uint_t                  n;\n    u_char                     *p;\n\n    static ngx_rtmp_connect_t   v;\n\n    static ngx_rtmp_amf_elt_t  in_cmd[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"app\"),\n          v.app, sizeof(v.app) },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"flashVer\"),\n          v.flashver, sizeof(v.flashver) },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"swfUrl\"),\n          v.swf_url, sizeof(v.swf_url) },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"tcUrl\"),\n          v.tc_url, sizeof(v.tc_url) },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"audioCodecs\"),\n          &v.acodecs, sizeof(v.acodecs) },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"videoCodecs\"),\n          &v.vcodecs, sizeof(v.vcodecs) },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"pageUrl\"),\n          v.page_url, sizeof(v.page_url) },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"objectEncoding\"),\n          &v.object_encoding, 0},\n    };\n\n    static ngx_rtmp_amf_elt_t  in_elts[] = {\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &v.trans, 0 },\n\n        { NGX_RTMP_AMF_OBJECT,\n          ngx_null_string,\n          in_cmd, sizeof(in_cmd) },\n    };\n\n    ngx_memzero(&v, sizeof(v));\n    if (ngx_rtmp_receive_amf(s, in, in_elts,\n                sizeof(in_elts) / sizeof(in_elts[0])))\n    {\n        return NGX_ERROR;\n    }\n\n    len = ngx_strlen(v.app);\n    if (len > 10 && !ngx_memcmp(v.app + len - 10, \"/_definst_\", 10)) {\n        v.app[len - 10] = 0;\n    } else if (len && v.app[len - 1] == '/') {\n        v.app[len - 1] = 0;\n    }\n\n    ngx_rtmp_cmd_fill_args(v.app, v.args);\n    ngx_rtmp_cmd_reset_vhost(s, &v);\n\n#define NGX_RTMP_SET_STRPAR(name)                                           \\\n    s->name.len = ngx_strlen(v.name);                                       \\\n    s->name.data = ngx_palloc(s->pool, s->name.len);                        \\\n    ngx_memcpy(s->name.data, v.name, s->name.len)\n\n    NGX_RTMP_SET_STRPAR(app);\n    NGX_RTMP_SET_STRPAR(args);\n    NGX_RTMP_SET_STRPAR(flashver);\n    NGX_RTMP_SET_STRPAR(swf_url);\n    NGX_RTMP_SET_STRPAR(tc_url);\n    NGX_RTMP_SET_STRPAR(page_url);\n\n#undef NGX_RTMP_SET_STRPAR\n\n    p = ngx_strlchr(s->app.data, s->app.data + s->app.len, '?');\n    if (p) {\n        s->app.len = (p - s->app.data);\n    }\n\n    s->acodecs = (uint32_t) v.acodecs;\n    s->vcodecs = (uint32_t) v.vcodecs;\n\n    ngx_rtmp_cmd_middleware_init(s);\n\n    if (ngx_rtmp_set_virtual_server(s, &s->domain)) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"rtmp connect, set vhost for \\\"%V\\\" failed\", &s->domain);\n        return NGX_ERROR;\n    }\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n\n    /* find application & set app_conf */\n    cacfp = cscf->applications.elts;\n    for(n = 0; n < cscf->applications.nelts; ++n, ++cacfp) {\n        if ((*cacfp)->name.len == s->app.len &&\n            ngx_strncmp((*cacfp)->name.data, s->app.data, s->app.len) == 0)\n        {\n            /* found app! */\n            s->app_conf = (*cacfp)->app_conf;\n            break;\n        }\n    }\n\n    if (s->app_conf == NULL) {\n\n        if (cscf->default_app == NULL || cscf->default_app->app_conf == NULL) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                    \"connect: application not found: '%V'\", &s->app);\n            return NGX_ERROR;\n        }\n\n        s->app_conf = cscf->default_app->app_conf;\n    }\n\n    s->live_server = ngx_live_create_server(&s->serverid);\n\n    s->stage = NGX_LIVE_CONNECT;\n    s->connect_time = ngx_current_msec;\n\n    return ngx_rtmp_connect(s, &v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_connect(ngx_rtmp_session_t *s, ngx_rtmp_connect_t *v)\n{\n    ngx_rtmp_core_srv_conf_t   *cscf;\n    ngx_rtmp_core_app_conf_t   *cacf;\n    ngx_rtmp_header_t           h;\n    int                         tcp_nodelay;\n\n    static double               trans;\n    static double               capabilities = NGX_RTMP_CAPABILITIES;\n    static double               object_encoding = 0;\n\n    static ngx_rtmp_amf_elt_t  out_obj[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"fmsVer\"),\n          NGX_RTMP_FMS_VERSION, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"capabilities\"),\n          &capabilities, 0 },\n    };\n\n    static ngx_rtmp_amf_elt_t  out_inf[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"level\"),\n          \"status\", 0 },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"code\"),\n          \"NetConnection.Connect.Success\", 0 },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"description\"),\n          \"Connection succeeded.\", 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"objectEncoding\"),\n          &object_encoding, 0 }\n    };\n\n    static ngx_rtmp_amf_elt_t  out_elts[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          \"_result\", 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &trans, 0 },\n\n        { NGX_RTMP_AMF_OBJECT,\n          ngx_null_string,\n          out_obj, sizeof(out_obj) },\n\n        { NGX_RTMP_AMF_OBJECT,\n          ngx_null_string,\n          out_inf, sizeof(out_inf) },\n    };\n\n    if (s->connected) {\n        ngx_log_error(NGX_LOG_INFO, s->log, 0,\n                \"connect: duplicate connection\");\n        return NGX_ERROR;\n    }\n\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n\n    /* set tcp_nodelay */\n    cacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_core_module);\n    if (cacf->tcp_nodelay &&\n            s->connection->tcp_nodelay == NGX_TCP_NODELAY_UNSET)\n    {\n        ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                \"tcp_nodelay\");\n\n        tcp_nodelay = 1;\n\n        if (setsockopt(s->connection->fd, IPPROTO_TCP, TCP_NODELAY,\n                       (const void *) &tcp_nodelay, sizeof(int)) == -1)\n        {\n            ngx_connection_error(s->connection, ngx_socket_errno,\n                                 \"setsockopt(TCP_NODELAY) failed\");\n            return NGX_ERROR;\n        }\n\n        s->connection->tcp_nodelay = NGX_TCP_NODELAY_SET;\n    }\n\n    trans = v->trans;\n\n    /* fill session parameters */\n    s->connected = 1;\n\n    ngx_memzero(&h, sizeof(h));\n    h.csid = NGX_RTMP_CSID_AMF_INI;\n    h.type = NGX_RTMP_MSG_AMF_CMD;\n\n    object_encoding = v->object_encoding;\n\n    return ngx_rtmp_send_ack_size(s, cscf->ack_window) != NGX_OK ||\n           ngx_rtmp_send_bandwidth(s, cscf->ack_window,\n                                   NGX_RTMP_LIMIT_DYNAMIC) != NGX_OK ||\n           ngx_rtmp_send_chunk_size(s, cscf->chunk_size) != NGX_OK ||\n           ngx_rtmp_send_amf(s, &h, out_elts,\n                             sizeof(out_elts) / sizeof(out_elts[0]))\n           != NGX_OK ? NGX_ERROR : NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_create_stream_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n                                ngx_chain_t *in)\n{\n    static ngx_rtmp_create_stream_t     v;\n\n    static ngx_rtmp_amf_elt_t  in_elts[] = {\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &v.trans, sizeof(v.trans) },\n    };\n\n    if (ngx_rtmp_receive_amf(s, in, in_elts,\n                sizeof(in_elts) / sizeof(in_elts[0])))\n    {\n        return NGX_ERROR;\n    }\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0, \"createStream\");\n\n    s->stage = NGX_LIVE_CREATE_STREAM;\n    s->create_stream_time = ngx_current_msec;\n\n    return ngx_rtmp_create_stream(s, &v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_create_stream(ngx_rtmp_session_t *s, ngx_rtmp_create_stream_t *v)\n{\n    /* support one message stream per connection */\n    static double               stream;\n    static double               trans;\n    ngx_rtmp_header_t           h;\n\n    static ngx_rtmp_amf_elt_t  out_elts[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          \"_result\", 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &trans, 0 },\n\n        { NGX_RTMP_AMF_NULL,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &stream, sizeof(stream) },\n    };\n\n    trans = v->trans;\n    stream = NGX_RTMP_MSID;\n\n    ngx_memzero(&h, sizeof(h));\n\n    h.csid = NGX_RTMP_CSID_AMF_INI;\n    h.type = NGX_RTMP_MSG_AMF_CMD;\n\n    return ngx_rtmp_send_amf(s, &h, out_elts,\n                             sizeof(out_elts) / sizeof(out_elts[0])) == NGX_OK ?\n           NGX_DONE : NGX_ERROR;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_close_stream_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n                               ngx_chain_t *in)\n{\n    static ngx_rtmp_close_stream_t     v;\n\n    static ngx_rtmp_amf_elt_t  in_elts[] = {\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &v.stream, 0 },\n    };\n\n    if (ngx_rtmp_receive_amf(s, in, in_elts,\n                             sizeof(in_elts) / sizeof(in_elts[0])))\n    {\n        return NGX_ERROR;\n    }\n\n    s->finalize_reason = NGX_LIVE_NORMAL_CLOSE;\n\n    return ngx_rtmp_close_stream_filter(s, &v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)\n{\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_delete_stream_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n                                ngx_chain_t *in)\n{\n    static ngx_rtmp_delete_stream_t     v;\n\n    static ngx_rtmp_amf_elt_t  in_elts[] = {\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_NULL,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &v.stream, 0 },\n    };\n\n    if (ngx_rtmp_receive_amf(s, in, in_elts,\n                             sizeof(in_elts) / sizeof(in_elts[0])))\n    {\n        return NGX_ERROR;\n    }\n\n    s->finalize_reason = NGX_LIVE_NORMAL_CLOSE;\n\n    return ngx_rtmp_delete_stream(s, &v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_delete_stream(ngx_rtmp_session_t *s, ngx_rtmp_delete_stream_t *v)\n{\n    ngx_rtmp_close_stream_t         cv;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0, \"deleteStream\");\n\n    cv.stream = 0;\n\n    return ngx_rtmp_close_stream_filter(s, &cv);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_publish_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    static ngx_rtmp_publish_t       v;\n\n    static ngx_rtmp_amf_elt_t      in_elts[] = {\n\n        /* transaction is always 0 */\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_NULL,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          &v.name, sizeof(v.name) },\n\n        { NGX_RTMP_AMF_OPTIONAL | NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          &v.type, sizeof(v.type) },\n    };\n\n    ngx_memzero(&v, sizeof(v));\n\n    if (ngx_rtmp_receive_amf(s, in, in_elts,\n                             sizeof(in_elts) / sizeof(in_elts[0])))\n    {\n        return NGX_ERROR;\n    }\n\n    ngx_rtmp_cmd_fill_args(v.name, v.args);\n\n    ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"publish: name='%s' args='%s' type=%s silent=%d\",\n                   v.name, v.args, v.type, v.silent);\n\n    s->stage = NGX_LIVE_PUBLISH;\n    s->ptime = ngx_current_msec;\n\n    return ngx_rtmp_publish_filter(s, &v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v)\n{\n    ngx_log_error(NGX_LOG_INFO, s->log, 0,\n            \"publish: name='%V' pargs='%V' app='%V' args='%V' flashver='%V' \"\n            \"swf_url='%V' tc_url='%V' page_url='%V' acodecs=%uD vcodecs=%uD \"\n            \"scheme='%V' domain='%V' serverid='%V' stream='%V' groupid='%V'\",\n            &s->name, &s->pargs, &s->app, &s->args, &s->flashver,\n            &s->swf_url, &s->tc_url, &s->page_url, s->acodecs, s->vcodecs,\n            &s->scheme, &s->domain, &s->serverid, &s->stream, &s->groupid);\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_rtmp_cmd_play_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    static ngx_rtmp_play_t          v;\n\n    static ngx_rtmp_amf_elt_t       in_elts[] = {\n\n        /* transaction is always 0 */\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_NULL,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          &v.name, sizeof(v.name) },\n\n        { NGX_RTMP_AMF_OPTIONAL | NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &v.start, 0 },\n\n        { NGX_RTMP_AMF_OPTIONAL | NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &v.duration, 0 },\n\n        { NGX_RTMP_AMF_OPTIONAL | NGX_RTMP_AMF_BOOLEAN,\n          ngx_null_string,\n          &v.reset, 0 }\n    };\n\n    ngx_memzero(&v, sizeof(v));\n\n    if (ngx_rtmp_receive_amf(s, in, in_elts,\n                             sizeof(in_elts) / sizeof(in_elts[0])))\n    {\n        return NGX_ERROR;\n    }\n\n    ngx_rtmp_cmd_fill_args(v.name, v.args);\n\n    ngx_log_debug6(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"play: name='%s' args='%s' start=%i duration=%i \"\n                   \"reset=%i silent=%i\",\n                   v.name, v.args, (ngx_int_t) v.start,\n                   (ngx_int_t) v.duration, (ngx_int_t) v.reset,\n                   (ngx_int_t) v.silent);\n\n    s->stage = NGX_LIVE_PLAY;\n    s->ptime = ngx_current_msec;\n\n    return ngx_rtmp_play_filter(s, &v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v)\n{\n    ngx_log_error(NGX_LOG_INFO, s->log, 0,\n            \"play: name='%V' pargs='%V' app='%V' args='%V' flashver='%V' \"\n            \"swf_url='%V' tc_url='%V' page_url='%V' acodecs=%uD vcodecs=%uD \"\n            \"scheme='%V' domain='%V' serverid='%V' stream='%V' groupid='%V'\",\n            &s->name, &s->pargs, &s->app, &s->args, &s->flashver,\n            &s->swf_url, &s->tc_url, &s->page_url, s->acodecs, s->vcodecs,\n            &s->scheme, &s->domain, &s->serverid, &s->stream, &s->groupid);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_play2_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    static ngx_rtmp_play_t          v;\n    static ngx_rtmp_close_stream_t  vc;\n\n    static ngx_rtmp_amf_elt_t       in_obj[] = {\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"start\"),\n          &v.start, 0 },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"streamName\"),\n          &v.name, sizeof(v.name) },\n    };\n\n    static ngx_rtmp_amf_elt_t       in_elts[] = {\n\n        /* transaction is always 0 */\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_NULL,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_OBJECT,\n          ngx_null_string,\n          &in_obj, sizeof(in_obj) }\n    };\n\n    ngx_memzero(&v, sizeof(v));\n\n    if (ngx_rtmp_receive_amf(s, in, in_elts,\n                             sizeof(in_elts) / sizeof(in_elts[0])))\n    {\n        return NGX_ERROR;\n    }\n\n    ngx_rtmp_cmd_fill_args(v.name, v.args);\n\n    ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"play2: name='%s' args='%s' start=%i\",\n                   v.name, v.args, (ngx_int_t) v.start);\n\n    /* continue from current timestamp */\n\n    if (v.start < 0) {\n        v.start = s->current_time;\n    }\n\n    ngx_memzero(&vc, sizeof(vc));\n\n    /* close_stream should be synchronous */\n    ngx_rtmp_close_stream_filter(s, &vc);\n\n    return ngx_rtmp_play_filter(s, &v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_pause_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    static ngx_rtmp_pause_t     v;\n\n    static ngx_rtmp_amf_elt_t   in_elts[] = {\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_NULL,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_BOOLEAN,\n          ngx_null_string,\n          &v.pause, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &v.position, 0 },\n    };\n\n    ngx_memzero(&v, sizeof(v));\n\n    if (ngx_rtmp_receive_amf(s, in, in_elts,\n                sizeof(in_elts) / sizeof(in_elts[0])))\n    {\n        return NGX_ERROR;\n    }\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"pause: pause=%i position=%i\",\n                    (ngx_int_t) v.pause, (ngx_int_t) v.position);\n\n    return ngx_rtmp_pause(s, &v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_pause(ngx_rtmp_session_t *s, ngx_rtmp_pause_t *v)\n{\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_disconnect_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n                        ngx_chain_t *in)\n{\n    s->stage = NGX_LIVE_CLOSE;\n    s->close_stream_time = ngx_current_msec;\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0, \"disconnect\");\n\n    return ngx_rtmp_disconnect(s);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_disconnect(ngx_rtmp_session_t *s)\n{\n    return ngx_rtmp_delete_stream(s, NULL);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_seek_init(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    static ngx_rtmp_seek_t         v;\n\n    static ngx_rtmp_amf_elt_t      in_elts[] = {\n\n        /* transaction is always 0 */\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_NULL,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &v.offset, sizeof(v.offset) },\n    };\n\n    ngx_memzero(&v, sizeof(v));\n\n    if (ngx_rtmp_receive_amf(s, in, in_elts,\n                             sizeof(in_elts) / sizeof(in_elts[0])))\n    {\n        return NGX_ERROR;\n    }\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0,\n                  \"seek: offset=%i\", (ngx_int_t) v.offset);\n\n    return ngx_rtmp_seek(s, &v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_seek(ngx_rtmp_session_t *s, ngx_rtmp_seek_t *v)\n{\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_stream_begin(ngx_rtmp_session_t *s, ngx_rtmp_stream_begin_t *v)\n{\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_stream_eof(ngx_rtmp_session_t *s, ngx_rtmp_stream_eof_t *v)\n{\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_stream_dry(ngx_rtmp_session_t *s, ngx_rtmp_stream_dry_t *v)\n{\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_recorded(ngx_rtmp_session_t *s,\n                      ngx_rtmp_recorded_t *v)\n{\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_set_buflen(ngx_rtmp_session_t *s, ngx_rtmp_set_buflen_t *v)\n{\n    return NGX_OK;\n}\n\n\nstatic ngx_rtmp_amf_handler_t ngx_rtmp_cmd_map[] = {\n    { ngx_string(\"connect\"),            ngx_rtmp_cmd_connect_init           },\n    { ngx_string(\"createStream\"),       ngx_rtmp_cmd_create_stream_init     },\n    { ngx_string(\"closeStream\"),        ngx_rtmp_cmd_close_stream_init      },\n    { ngx_string(\"deleteStream\"),       ngx_rtmp_cmd_delete_stream_init     },\n    { ngx_string(\"publish\"),            ngx_rtmp_cmd_publish_init           },\n    { ngx_string(\"play\"),               ngx_rtmp_cmd_play_init              },\n    { ngx_string(\"play2\"),              ngx_rtmp_cmd_play2_init             },\n    { ngx_string(\"seek\"),               ngx_rtmp_cmd_seek_init              },\n    { ngx_string(\"pause\"),              ngx_rtmp_cmd_pause_init             },\n    { ngx_string(\"pauseraw\"),           ngx_rtmp_cmd_pause_init             },\n};\n\n\nstatic ngx_int_t\nngx_rtmp_cmd_postconfiguration(ngx_conf_t *cf)\n{\n    ngx_rtmp_core_main_conf_t          *cmcf;\n    ngx_rtmp_handler_pt                *h;\n    ngx_rtmp_amf_handler_t             *ch, *bh;\n    size_t                              n, ncalls;\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    /* redirect disconnects to deleteStream\n     * to free client modules from registering\n     * disconnect callback */\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_DISCONNECT]);\n    if (h == NULL) {\n        return NGX_ERROR;\n    }\n\n    *h = ngx_rtmp_cmd_disconnect_init;\n\n    /* register AMF callbacks */\n\n    ncalls = sizeof(ngx_rtmp_cmd_map) / sizeof(ngx_rtmp_cmd_map[0]);\n\n    ch = ngx_array_push_n(&cmcf->amf, ncalls);\n    if (ch == NULL) {\n        return NGX_ERROR;\n    }\n\n    bh = ngx_rtmp_cmd_map;\n\n    for(n = 0; n < ncalls; ++n, ++ch, ++bh) {\n        *ch = *bh;\n    }\n\n    ngx_rtmp_connect = ngx_rtmp_cmd_connect;\n    ngx_rtmp_disconnect = ngx_rtmp_cmd_disconnect;\n    ngx_rtmp_create_stream = ngx_rtmp_cmd_create_stream;\n    ngx_rtmp_close_stream = ngx_rtmp_cmd_close_stream;\n    ngx_rtmp_delete_stream = ngx_rtmp_cmd_delete_stream;\n    ngx_rtmp_publish = ngx_rtmp_cmd_publish;\n    ngx_rtmp_play = ngx_rtmp_cmd_play;\n    ngx_rtmp_seek = ngx_rtmp_cmd_seek;\n    ngx_rtmp_pause = ngx_rtmp_cmd_pause;\n\n    ngx_rtmp_stream_begin = ngx_rtmp_cmd_stream_begin;\n    ngx_rtmp_stream_eof = ngx_rtmp_cmd_stream_eof;\n    ngx_rtmp_stream_dry = ngx_rtmp_cmd_stream_dry;\n    ngx_rtmp_recorded = ngx_rtmp_cmd_recorded;\n    ngx_rtmp_set_buflen = ngx_rtmp_cmd_set_buflen;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_cmd_module.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#ifndef _NGX_RTMP_CMD_H_INCLUDED_\n#define _NGX_RTMP_CMD_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_event.h>\n#include \"ngx_rtmp.h\"\n\n\n#define NGX_RTMP_MAX_NAME           256\n#define NGX_RTMP_MAX_FLASHVER       256\n#define NGX_RTMP_MAX_URL            256\n#define NGX_RTMP_MAX_SESSION        256\n#define NGX_RTMP_MAX_ARGS           NGX_RTMP_MAX_NAME\n\n\n/* Basic RTMP call support */\n\ntypedef struct {\n    double                          trans;\n    u_char                          app[NGX_RTMP_MAX_NAME];\n    u_char                          args[NGX_RTMP_MAX_ARGS];\n    u_char                          flashver[NGX_RTMP_MAX_FLASHVER];\n    u_char                          swf_url[NGX_RTMP_MAX_URL];\n    u_char                          tc_url[NGX_RTMP_MAX_URL];\n    double                          acodecs;\n    double                          vcodecs;\n    u_char                          page_url[NGX_RTMP_MAX_URL];\n    double                          object_encoding;\n} ngx_rtmp_connect_t;\n\n\ntypedef struct {\n    double                          trans;\n    double                          stream;\n} ngx_rtmp_create_stream_t;\n\n\ntypedef struct {\n    double                          stream;\n} ngx_rtmp_delete_stream_t;\n\n\ntypedef struct {\n    double                          stream;\n} ngx_rtmp_close_stream_t;\n\n\ntypedef struct {\n    u_char                          name[NGX_RTMP_MAX_NAME];\n    u_char                          args[NGX_RTMP_MAX_ARGS];\n    u_char                          type[16];\n    int                             silent;\n} ngx_rtmp_publish_t;\n\n\ntypedef struct {\n    u_char                          name[NGX_RTMP_MAX_NAME];\n    u_char                          args[NGX_RTMP_MAX_ARGS];\n    u_char                          session[NGX_RTMP_MAX_SESSION];\n    double                          start;\n    double                          duration;\n    int                             reset;\n    int                             silent;\n} ngx_rtmp_play_t;\n\n\ntypedef struct {\n    double                          offset;\n} ngx_rtmp_seek_t;\n\n\ntypedef struct {\n    uint8_t                         pause;\n    double                          position;\n} ngx_rtmp_pause_t;\n\n\ntypedef struct {\n    uint32_t                        msid;\n} ngx_rtmp_msid_t;\n\n\ntypedef ngx_rtmp_msid_t             ngx_rtmp_stream_begin_t;\ntypedef ngx_rtmp_msid_t             ngx_rtmp_stream_eof_t;\ntypedef ngx_rtmp_msid_t             ngx_rtmp_stream_dry_t;\ntypedef ngx_rtmp_msid_t             ngx_rtmp_recorded_t;\n\n\ntypedef struct {\n    uint32_t                        msid;\n    uint32_t                        buflen;\n} ngx_rtmp_set_buflen_t;\n\n\nvoid ngx_rtmp_cmd_fill_args(u_char name[NGX_RTMP_MAX_NAME],\n        u_char args[NGX_RTMP_MAX_ARGS]);\nvoid ngx_rtmp_cmd_middleware_init(ngx_rtmp_session_t *s);\nvoid ngx_rtmp_cmd_stream_init(ngx_rtmp_session_t *s, u_char *name, u_char *args,\n        unsigned publishing);\n\nngx_int_t ngx_rtmp_publish_filter(ngx_rtmp_session_t *s,\n        ngx_rtmp_publish_t *v);\nngx_int_t ngx_rtmp_play_filter(ngx_rtmp_session_t *s,\n        ngx_rtmp_play_t *v);\nngx_int_t ngx_rtmp_close_stream_filter(ngx_rtmp_session_t *s,\n        ngx_rtmp_close_stream_t *v);\n\nngx_int_t ngx_rtmp_push_filter(ngx_rtmp_session_t *s);\nngx_int_t ngx_rtmp_pull_filter(ngx_rtmp_session_t *s);\n\ntypedef ngx_int_t (*ngx_rtmp_connect_pt)(ngx_rtmp_session_t *s,\n        ngx_rtmp_connect_t *v);\ntypedef ngx_int_t (*ngx_rtmp_disconnect_pt)(ngx_rtmp_session_t *s);\ntypedef ngx_int_t (*ngx_rtmp_create_stream_pt)(ngx_rtmp_session_t *s,\n        ngx_rtmp_create_stream_t *v);\ntypedef ngx_int_t (*ngx_rtmp_close_stream_pt)(ngx_rtmp_session_t *s,\n        ngx_rtmp_close_stream_t *v);\ntypedef ngx_int_t (*ngx_rtmp_delete_stream_pt)(ngx_rtmp_session_t *s,\n        ngx_rtmp_delete_stream_t *v);\ntypedef ngx_int_t (*ngx_rtmp_publish_pt)(ngx_rtmp_session_t *s,\n        ngx_rtmp_publish_t *v);\ntypedef ngx_int_t (*ngx_rtmp_play_pt)(ngx_rtmp_session_t *s,\n        ngx_rtmp_play_t *v);\ntypedef ngx_int_t (*ngx_rtmp_seek_pt)(ngx_rtmp_session_t *s,\n        ngx_rtmp_seek_t *v);\ntypedef ngx_int_t (*ngx_rtmp_pause_pt)(ngx_rtmp_session_t *s,\n        ngx_rtmp_pause_t *v);\n\ntypedef ngx_int_t (*ngx_rtmp_stream_begin_pt)(ngx_rtmp_session_t *s,\n        ngx_rtmp_stream_begin_t *v);\ntypedef ngx_int_t (*ngx_rtmp_stream_eof_pt)(ngx_rtmp_session_t *s,\n        ngx_rtmp_stream_eof_t *v);\ntypedef ngx_int_t (*ngx_rtmp_stream_dry_pt)(ngx_rtmp_session_t *s,\n        ngx_rtmp_stream_dry_t *v);\ntypedef ngx_int_t (*ngx_rtmp_recorded_pt)(ngx_rtmp_session_t *s,\n        ngx_rtmp_recorded_t *v);\ntypedef ngx_int_t (*ngx_rtmp_set_buflen_pt)(ngx_rtmp_session_t *s,\n        ngx_rtmp_set_buflen_t *v);\n\n\nextern ngx_rtmp_connect_pt          ngx_rtmp_connect;\nextern ngx_rtmp_disconnect_pt       ngx_rtmp_disconnect;\nextern ngx_rtmp_create_stream_pt    ngx_rtmp_create_stream;\nextern ngx_rtmp_close_stream_pt     ngx_rtmp_close_stream;\nextern ngx_rtmp_delete_stream_pt    ngx_rtmp_delete_stream;\nextern ngx_rtmp_publish_pt          ngx_rtmp_publish;\nextern ngx_rtmp_play_pt             ngx_rtmp_play;\nextern ngx_rtmp_seek_pt             ngx_rtmp_seek;\nextern ngx_rtmp_pause_pt            ngx_rtmp_pause;\n\nextern ngx_rtmp_stream_begin_pt     ngx_rtmp_stream_begin;\nextern ngx_rtmp_stream_eof_pt       ngx_rtmp_stream_eof;\nextern ngx_rtmp_stream_dry_pt       ngx_rtmp_stream_dry;\nextern ngx_rtmp_set_buflen_pt       ngx_rtmp_set_buflen;\nextern ngx_rtmp_recorded_pt         ngx_rtmp_recorded;\n\n\n#endif /*_NGX_RTMP_CMD_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_codec_module.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp_codec_module.h\"\n#include \"ngx_rtmp_live_module.h\"\n#include \"ngx_rtmp_cmd_module.h\"\n#include \"ngx_rtmp_bitop.h\"\n#include \"ngx_rbuf.h\"\n\n\n#define NGX_RTMP_CODEC_META_OFF     0\n#define NGX_RTMP_CODEC_META_ON      1\n#define NGX_RTMP_CODEC_META_COPY    2\n\n\nstatic void * ngx_rtmp_codec_create_app_conf(ngx_conf_t *cf);\nstatic char * ngx_rtmp_codec_merge_app_conf(ngx_conf_t *cf,\n       void *parent, void *child);\nstatic ngx_int_t ngx_rtmp_codec_postconfiguration(ngx_conf_t *cf);\nstatic ngx_int_t ngx_rtmp_codec_reconstruct_meta(ngx_rtmp_session_t *s);\nstatic ngx_int_t ngx_rtmp_codec_copy_meta(ngx_rtmp_session_t *s,\n       ngx_rtmp_header_t *h, ngx_chain_t *in);\nstatic ngx_int_t ngx_rtmp_codec_prepare_meta(ngx_rtmp_session_t *s,\n       uint32_t timestamp);\nstatic void ngx_rtmp_codec_parse_aac_header(ngx_rtmp_session_t *s,\n       ngx_chain_t *in);\nstatic void ngx_rtmp_codec_parse_avc_header(ngx_rtmp_session_t *s,\n       ngx_chain_t *in);\nstatic void ngx_rtmp_codec_parse_hevc_header(ngx_rtmp_session_t *s,\n       ngx_chain_t *in);\n#if (NGX_DEBUG)\nstatic void ngx_rtmp_codec_dump_header(ngx_rtmp_session_t *s, const char *type,\n       ngx_chain_t *in);\n#endif\n\n\ntypedef struct {\n    ngx_uint_t                      meta;\n} ngx_rtmp_codec_app_conf_t;\n\n\nstatic ngx_conf_enum_t ngx_rtmp_codec_meta_slots[] = {\n    { ngx_string(\"off\"),            NGX_RTMP_CODEC_META_OFF  },\n    { ngx_string(\"on\"),             NGX_RTMP_CODEC_META_ON   },\n    { ngx_string(\"copy\"),           NGX_RTMP_CODEC_META_COPY },\n    { ngx_null_string,              0 }\n};\n\n\nstatic ngx_command_t  ngx_rtmp_codec_commands[] = {\n\n    { ngx_string(\"meta\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_enum_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_codec_app_conf_t, meta),\n      &ngx_rtmp_codec_meta_slots },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_rtmp_codec_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_rtmp_codec_postconfiguration,       /* postconfiguration */\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    ngx_rtmp_codec_create_app_conf,         /* create app configuration */\n    ngx_rtmp_codec_merge_app_conf           /* merge app configuration */\n};\n\n\nngx_module_t  ngx_rtmp_codec_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_codec_module_ctx,             /* module context */\n    ngx_rtmp_codec_commands,                /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic const char *\naudio_codecs[] = {\n    \"\",\n    \"ADPCM\",\n    \"MP3\",\n    \"LinearLE\",\n    \"Nellymoser16\",\n    \"Nellymoser8\",\n    \"Nellymoser\",\n    \"G711A\",\n    \"G711U\",\n    \"\",\n    \"AAC\",\n    \"Speex\",\n    \"\",\n    \"\",\n    \"MP3-8K\",\n    \"DeviceSpecific\",\n    \"Uncompressed\"\n};\n\n\nstatic const char *\nvideo_codecs[] = {\n    \"\",\n    \"Jpeg\",\n    \"Sorenson-H263\",\n    \"ScreenVideo\",\n    \"On2-VP6\",\n    \"On2-VP6-Alpha\",\n    \"ScreenVideo2\",\n    \"H264\",\n};\n\n\nu_char *\nngx_rtmp_get_audio_codec_name(ngx_uint_t id)\n{\n    return (u_char *)(id < sizeof(audio_codecs) / sizeof(audio_codecs[0])\n        ? audio_codecs[id]\n        : \"\");\n}\n\n\nu_char *\nngx_rtmp_get_video_codec_name(ngx_uint_t id)\n{\n    return (u_char *)(id < sizeof(video_codecs) / sizeof(video_codecs[0])\n        ? video_codecs[id]\n        : \"\");\n}\n\n\nstatic ngx_uint_t\nngx_rtmp_codec_get_next_version()\n{\n    ngx_uint_t          v;\n    static ngx_uint_t   version;\n\n    do {\n        v = ++version;\n    } while (v == 0);\n\n    return v;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_codec_disconnect(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    ngx_rtmp_codec_ctx_t               *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n    if (ctx == NULL) {\n        return NGX_OK;\n    }\n\n    if (ctx->avc_header) {\n        ngx_rtmp_shared_free_frame(ctx->avc_header);\n        ctx->avc_header = NULL;\n    }\n\n    if (ctx->aac_header) {\n        ngx_rtmp_shared_free_frame(ctx->aac_header);\n        ctx->aac_header = NULL;\n    }\n\n    if (ctx->meta) {\n        ngx_rtmp_shared_free_frame(ctx->meta);\n        ctx->meta = NULL;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_codec_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    ngx_rtmp_core_srv_conf_t           *cscf;\n    ngx_rtmp_core_app_conf_t           *cacf;\n    ngx_rtmp_codec_ctx_t               *ctx;\n    ngx_rtmp_frame_t                  **header;\n    uint8_t                             fmt;\n    u_char                              frametype;\n    static ngx_uint_t                   sample_rates[] =\n                                        { 5512, 11025, 22050, 44100 };\n\n    if (h->type != NGX_RTMP_MSG_AUDIO && h->type != NGX_RTMP_MSG_VIDEO) {\n        return NGX_OK;\n    }\n\n    if (h->type == NGX_RTMP_MSG_VIDEO) {\n        frametype = in->buf->pos[0] & 0xf0;\n        if (frametype != 0x10 && frametype != 0x20) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                    \"codec: receive unkwnon frametype %02xD\", frametype);\n            return NGX_OK;\n        }\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n    if (ctx == NULL) {\n        ctx = ngx_pcalloc(s->pool, sizeof(ngx_rtmp_codec_ctx_t));\n        ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_codec_module);\n    }\n\n    /* save codec */\n    if (in->buf->last - in->buf->pos < 1) {\n        return NGX_OK;\n    }\n\n    fmt =  in->buf->pos[0];\n    if (h->type == NGX_RTMP_MSG_AUDIO) {\n        ctx->audio_codec_id = (fmt & 0xf0) >> 4;\n        ctx->audio_channels = (fmt & 0x01) + 1;\n        ctx->sample_size = (fmt & 0x02) ? 2 : 1;\n\n        if (ctx->sample_rate == 0) {\n            ctx->sample_rate = sample_rates[(fmt & 0x0c) >> 2];\n        }\n        s->acodec = ctx->audio_codec_id;\n    } else {\n        ctx->video_codec_id = (fmt & 0x0f);\n        s->vcodec = ctx->video_codec_id;\n    }\n\n    /* save AVC/AAC header */\n    if (in->buf->last - in->buf->pos < 3) {\n        return NGX_OK;\n    }\n\n    /* no conf */\n    if (!ngx_rtmp_is_codec_header(in)) {\n        return NGX_OK;\n    }\n\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n    cacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_core_module);\n    header = NULL;\n\n    if (h->type == NGX_RTMP_MSG_AUDIO) {\n        if (ctx->audio_codec_id == NGX_RTMP_AUDIO_AAC) {\n            header = &ctx->aac_header;\n            ngx_rtmp_codec_parse_aac_header(s, in);\n        }\n    } else {\n        if (ctx->video_codec_id == NGX_RTMP_VIDEO_H264) {\n            header = &ctx->avc_header;\n            ngx_rtmp_codec_parse_avc_header(s, in);\n        } else if (ctx->video_codec_id == cacf->hevc_codec) {\n            header = &ctx->avc_header;\n            ngx_rtmp_codec_parse_hevc_header(s, in);\n        }\n    }\n\n    if (header == NULL) {\n        return NGX_OK;\n    }\n\n    if (*header) {\n        ngx_rtmp_shared_free_frame(*header);\n    }\n\n    *header = ngx_rtmp_shared_alloc_frame(cscf->chunk_size, in, 0);\n\n    return NGX_OK;\n}\n\n\nstatic void\nngx_rtmp_codec_parse_aac_header(ngx_rtmp_session_t *s, ngx_chain_t *in)\n{\n    ngx_uint_t              idx;\n    ngx_rtmp_codec_ctx_t   *ctx;\n    ngx_rtmp_bit_reader_t   br;\n\n    static ngx_uint_t      aac_sample_rates[] =\n        { 96000, 88200, 64000, 48000,\n          44100, 32000, 24000, 22050,\n          16000, 12000, 11025,  8000,\n           7350,     0,     0,     0 };\n\n#if (NGX_DEBUG)\n    ngx_rtmp_codec_dump_header(s, \"aac\", in);\n#endif\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    ngx_rtmp_bit_init_reader(&br, in->buf->pos, in->buf->last);\n\n    ngx_rtmp_bit_read(&br, 16);\n\n    ctx->aac_profile = (ngx_uint_t) ngx_rtmp_bit_read(&br, 5);\n    if (ctx->aac_profile == 31) {\n        ctx->aac_profile = (ngx_uint_t) ngx_rtmp_bit_read(&br, 6) + 32;\n    }\n\n    idx = (ngx_uint_t) ngx_rtmp_bit_read(&br, 4);\n    if (idx == 15) {\n        ctx->sample_rate = (ngx_uint_t) ngx_rtmp_bit_read(&br, 24);\n    } else {\n        ctx->sample_rate = aac_sample_rates[idx];\n    }\n\n    ctx->aac_chan_conf = (ngx_uint_t) ngx_rtmp_bit_read(&br, 4);\n\n    if (ctx->aac_profile == 5 || ctx->aac_profile == 29) {\n        \n        if (ctx->aac_profile == 29) {\n            ctx->aac_ps = 1;\n        }\n\n        ctx->aac_sbr = 1;\n\n        idx = (ngx_uint_t) ngx_rtmp_bit_read(&br, 4);\n        if (idx == 15) {\n            ctx->sample_rate = (ngx_uint_t) ngx_rtmp_bit_read(&br, 24);\n        } else {\n            ctx->sample_rate = aac_sample_rates[idx];\n        }\n\n        ctx->aac_profile = (ngx_uint_t) ngx_rtmp_bit_read(&br, 5);\n        if (ctx->aac_profile == 31) {\n            ctx->aac_profile = (ngx_uint_t) ngx_rtmp_bit_read(&br, 6) + 32;\n        }\n    }\n\n    /* MPEG-4 Audio Specific Config\n\n       5 bits: object type\n       if (object type == 31)\n         6 bits + 32: object type\n       4 bits: frequency index\n       if (frequency index == 15)\n         24 bits: frequency\n       4 bits: channel configuration\n\n       if (object_type == 5)\n           4 bits: frequency index\n           if (frequency index == 15)\n             24 bits: frequency\n           5 bits: object type\n           if (object type == 31)\n             6 bits + 32: object type\n\n       var bits: AOT Specific Config\n     */\n\n    ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"codec: aac header profile=%ui, \"\n                   \"sample_rate=%ui, chan_conf=%ui\",\n                   ctx->aac_profile, ctx->sample_rate, ctx->aac_chan_conf);\n}\n\n\n/*\n * ITU-T H.265 7.3.1 General NAL unit syntax\n */\nstatic ngx_int_t\nngx_rtmp_codec_parse_hevc_nal_to_rbsp(ngx_rtmp_session_t *s, u_char *p,\n        ngx_rtmp_bit_reader_t *br, ngx_uint_t nal_unit_type,\n        ngx_uint_t nal_unit_len)\n{\n    ngx_uint_t                  i, count, rbsp_bytes;\n\n    /*\n     * nal_unit\n     *      nal_unit_header()\n     *      NumBytesInRbsp = 0\n     *      for (i = 2; i < NumBytesInNalUnit; i++)\n     *          if (i + 2 < NumBytesInNalUnit && next_bits(24) == 0x000003) {\n     *              rbsp_byte[NumBytesInRbsp++]\n     *              rbsp_byte[NumBytesInRbsp++]\n     *              i += 2\n     *              emulation_prevention_three_byte // equal to 0x03\n     *          } else\n     *              rbsp_byte[NumBytesInRbsp++]\n     *\n     * nal_unit_header\n     *      forbidden_zero_bit                      1 bit\n     *      nal_unit_type                           6 bits\n     *      nuh_layer_id                            6 bits\n     *      nuh_temporal_id_plus1                   3 bits\n     *\n     * ITU-T H.265 7.4.2.1\n     * emulation_prevention_three_byte is a byte equal to 0x03.\n     * When an emulation_prevention_three_byte is present in the NAL unit,\n     * it shall be discarded by the decoding process\n     *      Within the NAL unit, the following three-byte sequences shall not\n     *      occur at any byte-aligned position:\n     *          0x000000\n     *          0x000001\n     *          0x000002\n     *      Within the NAL unit, any four-byte sequence that starts with\n     *      0x000003 other than the following sequences shall not occur at\n     *      any byte-aligned position:\n     *          0x00000300\n     *          0x00000301\n     *          0x00000302\n     *          0x00000303\n     */\n\n    ngx_rtmp_bit_read(br, 1);\n    if (ngx_rtmp_bit_read(br, 6) != nal_unit_type) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"nal_unit_type not expect %ui\", nal_unit_type);\n        return NGX_ERROR;\n    }\n    ngx_rtmp_bit_read(br, 6);\n    ngx_rtmp_bit_read(br, 3);\n\n    count = 0;\n    rbsp_bytes = 0;\n    for (i = 0; i < nal_unit_len; ++i) {\n        if (count == 2) { /* already 0x0000 */\n            if (br->pos[i] < 0x03) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                        \"three bytes sequence error\");\n                return NGX_ERROR;\n            }\n\n            if (br->pos[i] == 0x03 && br->pos[i + 1] > 0x03) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                        \"four bytes sequence error\");\n                return NGX_ERROR;\n            }\n\n            if (br->pos[i] == 0x03) {\n                count = 0;\n                continue;\n            }\n        }\n\n        *p++ = br->pos[i];\n        ++rbsp_bytes;\n        if (br->pos[i] == 0x00) {\n            ++count;\n        } else {\n            count = 0;\n        }\n    }\n\n    return rbsp_bytes;\n}\n\n/*\n * ITU-T H.265 7.3.3 Profile, tier and level syntax\n */\nstatic void\nngx_rtmp_codec_parse_hevc_ptl(ngx_rtmp_session_t *s, ngx_rtmp_bit_reader_t *br,\n        ngx_flag_t profilePresentFlag, ngx_uint_t maxNumSubLayersMinus1)\n{\n    ngx_uint_t                  i, slppf[8], sllpf[8];\n\n    if (profilePresentFlag) {\n        /*\n         * profile_tier_level\n         *      general_profile_space                       2 bits\n         *      general_tier_flag                           1 bit\n         *      general_profile_idc                         5 bits\n         *      for (j = 0; j < 32; j++)\n         *          general_profile_compatibility_flag[j]   1 bit\n         *      general_progressive_source_flag             1 bit\n         *      general_interlaced_source_flag              1 bit\n         *      general_non_packed_constraint_flag          1 bit\n         *      general_frame_only_constraint_flag          1 bit\n         *\n         *      general_max_12bit_constraint_flag           1 bit\n         *      general_max_10bit_constraint_flag           1 bit\n         *      general_max_8bit_constraint_flag            1 bit\n         *      general_max_422chroma_constraint_flag       1 bit\n         *      general_max_420chroma_constraint_flag       1 bit\n         *      general_max_monochrome_constraint_flag      1 bit\n         *      general_intra_constraint_flag               1 bit\n         *      general_one_picture_only_constraint_flag    1 bit\n         *      general_lower_bit_rate_constraint_flag      1 bit\n         *      general_reserved_zero_34bits                34 bits\n         *\n         *      general_inbld_flag                          1 bit\n         */\n        ngx_rtmp_bit_read(br, 88);\n    }\n\n    /*\n     * profile_tier_level\n     *      general_level_idc                               8 bits\n     */\n    ngx_rtmp_bit_read(br, 8);\n\n    /*\n     * profile_tier_level\n     *      for(i = 0; i < maxNumSubLayersMinus1; i++) {\n     *           sub_layer_profile_present_flag[i]          1 bit\n     *           sub_layer_level_present_flag[i]            1 bit\n     *      }\n     *\n     *      if (maxNumSubLayersMinus1 > 0)\n     *           for(i = maxNumSubLayersMinus1; i < 8; i++)\n     *               reserved_zero_2bits[i]                 2 bits\n     */\n    for (i = 0; i < maxNumSubLayersMinus1; ++i) {\n        slppf[i] = ngx_rtmp_bit_read(br, 1);\n        sllpf[i] = ngx_rtmp_bit_read(br, 1);\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"%d sub_layer_profile_present_flag:%d, \"\n                \"sub_layer_level_present_flag:%d\", i, slppf[i], sllpf[i]);\n    }\n\n    if (maxNumSubLayersMinus1 > 0) {\n        for (i = maxNumSubLayersMinus1; i < 8; ++i) {\n            ngx_uint_t t = ngx_rtmp_bit_read(br, 2);\n            ngx_log_error(NGX_LOG_ERR, s->log, 0, \"zero bit %d\", t);\n        }\n    }\n\n    /*\n     * profile_tier_level\n     *      for (i = 0; i < maxNumSubLayersMinus1; i++) {\n     *          if (sub_layer_profile_present_flag[i] {\n     *                                                      44 bits\n     *          }\n     *          if (sub_layer_level_present_flag[i]) {\n     *              sub_layer_level_idc[i]                  8 bits\n     *          }\n     *      }\n     */\n    for (i = 0; i < maxNumSubLayersMinus1; ++i) {\n        if (slppf[i]) {\n            ngx_rtmp_bit_read(br, 88);\n        }\n\n        if (sllpf[i]) {\n            ngx_rtmp_bit_read(br, 8);\n        }\n    }\n}\n\n/*\n * ITU-T H.265 7.3.2.2 Sequence parameter set RBSP syntax\n */\nstatic void\nngx_rtmp_codec_parse_hevc_sps(ngx_rtmp_session_t *s, ngx_rtmp_codec_ctx_t *ctx,\n        ngx_rtmp_bit_reader_t *pbr, ngx_uint_t nal_unit_len)\n{\n    ngx_uint_t              mslm, psi, cfi, width, height,\n                            subwidthC, subheightC,\n                            cwlo, cwro, cwto, cwbo;\n    ngx_rtmp_bit_reader_t   br;\n    u_char                  buf[4096];\n    ngx_int_t               rbsp_bytes;\n\n    ngx_rtmp_bit_init_reader(&br, pbr->pos, pbr->pos + nal_unit_len);\n    rbsp_bytes = ngx_rtmp_codec_parse_hevc_nal_to_rbsp(s, buf, &br, NAL_SPS,\n                                                       nal_unit_len);\n    if (rbsp_bytes == NGX_ERROR) {\n        return;\n    }\n\n    ngx_rtmp_bit_init_reader(&br, buf, buf + rbsp_bytes);\n\n    /*\n     * seq_parameter_set_rbsp\n     *      sps_video_parameter_set_id              4 bits\n     *      sps_max_sub_layers_minus1               3 bits\n     *      sps_temporal_id_nesting_flag            1 bit\n     */\n    ngx_rtmp_bit_read(&br, 4);\n    mslm = ngx_rtmp_bit_read(&br, 3);\n    ngx_rtmp_bit_read(&br, 1);\n\n    /*\n     * seq_parameter_set_rbsp\n     *      profile_tier_level(1, sps_max_sub_layers_minus1)\n     */\n    ngx_rtmp_codec_parse_hevc_ptl(s, &br, 1, mslm);\n\n    /* calc resolution */\n    /*\n     * seq_parameter_set_rbsp\n     *      sps_seq_parameter_set_id                v\n     *      chroma_format_idc                       v\n     *      if (chroma_format_idc == 3)\n     *          separate_colour_plane_flag          1 bit\n     *      pic_width_in_luma_samples               v\n     *      pic_height_in_luma_samples              v\n     *      conformance_window_flag                 1 bit\n     *      if (conformance_window_flag) {\n     *          conf_win_left_offset                v\n     *          conf_win_right_offset               v\n     *          conf_win_top_offset                 v\n     *          conf_win_bottom_offset              v\n     *      }\n     */\n    psi = ngx_rtmp_bit_read_golomb(&br);\n    if (psi > 16 || br.err) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"read sps_seq_parameter_set_id error: %ui\", psi);\n        return;\n    }\n\n    cfi = ngx_rtmp_bit_read_golomb(&br);\n    if (cfi > 3 || br.err) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"read chroma_format_idc error: %ui\", cfi);\n        return;\n    }\n\n    if (cfi == 3) {\n        ngx_rtmp_bit_read(&br, 1);\n    }\n\n    width = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br);\n    if (br.err) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0, \"read width error\");\n        return;\n    }\n\n    height = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br);\n    if (br.err) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0, \"read height error\");\n        return;\n    }\n\n    if (ngx_rtmp_bit_read(&br, 1)) {\n        cwlo = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br);\n        cwro = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br);\n        cwto = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br);\n        cwbo = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br);\n\n        /*\n         * ITU-T H.265 Table 6-1\n         */\n        if (cfi == 1) { /* 4:2:0 */\n            subwidthC = 2;\n            subheightC = 2;\n        } else if (cfi == 2) { /* 4:2:2 */\n            subwidthC = 2;\n            subheightC = 1;\n        } else { /* Monochrome or 4:4:4 */\n            subwidthC = 1;\n            subheightC = 1;\n        }\n\n        /*\n         * ITU-T H.265 7.4.3.2.1\n         *\n         * horizontal picture coordinates from\n         *  SubWidthC * conf_win_left_offset to\n         *  pic_width_in_luma_samples - (SubWidthC * conf_win_right_offset + 1)\n         * vertical picture coordinates from\n         *  SubHeightC * conf_win_top_offset to\n         *  pic_height_in_luma_samples -\n         *  (SubHeightC * conf_win_bottom_offset + 1)\n         */\n        ctx->width = width - (subwidthC * cwro + 1) - (subwidthC * cwlo);\n        ctx->height = height - (subheightC * cwbo + 1) - (subheightC * cwto);\n    } else {\n        ctx->width = width;\n        ctx->height = height;\n    }\n\n    return;\n}\n\nstatic void\nngx_rtmp_codec_parse_hevc_header(ngx_rtmp_session_t *s, ngx_chain_t *in)\n{\n    ngx_uint_t              i, j, num_arrays, nal_unit_type, num_nalus,\n                            nal_unit_len;\n    ngx_rtmp_codec_ctx_t   *ctx;\n    ngx_rtmp_bit_reader_t   br;\n\n#if (NGX_DEBUG)\n    ngx_rtmp_codec_dump_header(s, \"hevc\", in);\n#endif\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    ngx_rtmp_bit_init_reader(&br, in->buf->pos, in->buf->last);\n\n    /*\n     * FrameType                                    4 bits\n     * CodecID                                      4 bits\n     * AVCPacketType                                1 byte\n     * CompositionTime                              3 bytes\n     * HEVCDecoderConfigurationRecord\n     *      configurationVersion                    1 byte\n     */\n    ngx_rtmp_bit_read(&br, 48);\n\n    /*\n     * HEVCDecoderConfigurationRecord\n     *      general_profile_space                   2 bits\n     *      general_tier_flag                       1 bit\n     *      general_profile_idc                     5 bits\n     *      general_profile_compatibility_flags     4 bytes\n     *      general_constraint_indicator_flags      6 bytes\n     *      general_level_idc                       1 byte\n     *      min_spatial_segmentation_idc            4 bits reserved + 12 bits\n     *      parallelismType                         6 bits reserved + 2 bits\n     *      chroma_format_idc                       6 bits reserved + 2 bits\n     *      bit_depth_luma_minus8                   5 bits reserved + 3 bits\n     *      bit_depth_chroma_minus8                 5 bits reserved + 3 bits\n     *      avgFrameRate                            2 bytes\n     */\n    ngx_rtmp_bit_read(&br, 160);\n\n    /*\n     * HEVCDecoderConfigurationRecord\n     *      constantFrameRate                       2 bits\n     *      numTemporalLayers                       3 bits\n     *      temporalIdNested                        1 bit\n     *      lengthSizeMinusOne                      2 bits\n     */\n    ctx->avc_nal_bytes = (ngx_uint_t) ((ngx_rtmp_bit_read_8(&br) & 0x03) + 1);\n\n    /*\n     * HEVCDecoderConfigurationRecord\n     *      numOfArrays                             1 byte\n     */\n    num_arrays = (ngx_uint_t) ngx_rtmp_bit_read_8(&br);\n\n    for (i = 0; i < num_arrays; ++i) {\n        /*\n         * array_completeness                       1 bit\n         * reserved                                 1 bit\n         * NAL_unit_type                            6 bits\n         * numNalus                                 2 bytes\n         */\n        nal_unit_type = (ngx_uint_t) (ngx_rtmp_bit_read_8(&br) & 0x3f);\n        num_nalus = (ngx_uint_t) ngx_rtmp_bit_read_16(&br);\n\n        for (j = 0; j < num_nalus; ++j) {\n            /*\n             * nalUnitLength                        2 bytes\n             */\n            nal_unit_len = (ngx_uint_t) ngx_rtmp_bit_read_16(&br);\n\n            switch (nal_unit_type) {\n            case NAL_SPS:\n                ngx_rtmp_codec_parse_hevc_sps(s, ctx, &br, nal_unit_len);\n                ngx_rtmp_bit_read(&br, nal_unit_len * 8);\n                break;\n            default:\n                ngx_rtmp_bit_read(&br, nal_unit_len * 8);\n                break;\n            }\n        }\n    }\n\n    ngx_log_debug7(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"codec: hevc header \"\n                   \"profile=%ui, compat=%ui, level=%ui, \"\n                   \"nal_bytes=%ui, ref_frames=%ui, width=%ui, height=%ui\",\n                   ctx->avc_profile, ctx->avc_compat, ctx->avc_level,\n                   ctx->avc_nal_bytes, ctx->avc_ref_frames,\n                   ctx->width, ctx->height);\n}\n\n\nstatic void\nngx_rtmp_codec_parse_avc_header(ngx_rtmp_session_t *s, ngx_chain_t *in)\n{\n    ngx_uint_t              profile_idc, width, height, crop_left, crop_right,\n                            crop_top, crop_bottom, frame_mbs_only, n, cf_idc,\n                            num_ref_frames;\n    ngx_rtmp_codec_ctx_t   *ctx;\n    ngx_rtmp_bit_reader_t   br;\n\n#if (NGX_DEBUG)\n    ngx_rtmp_codec_dump_header(s, \"avc\", in);\n#endif\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    ngx_rtmp_bit_init_reader(&br, in->buf->pos, in->buf->last);\n\n    ngx_rtmp_bit_read(&br, 48);\n\n    ctx->avc_profile = (ngx_uint_t) ngx_rtmp_bit_read_8(&br);\n    ctx->avc_compat = (ngx_uint_t) ngx_rtmp_bit_read_8(&br);\n    ctx->avc_level = (ngx_uint_t) ngx_rtmp_bit_read_8(&br);\n\n    /* nal bytes */\n    ctx->avc_nal_bytes = (ngx_uint_t) ((ngx_rtmp_bit_read_8(&br) & 0x03) + 1);\n\n    /* nnals */\n    if ((ngx_rtmp_bit_read_8(&br) & 0x1f) == 0) {\n        return;\n    }\n\n    /* nal size */\n    ngx_rtmp_bit_read(&br, 16);\n\n    /* nal type */\n    if (ngx_rtmp_bit_read_8(&br) != 0x67) {\n        return;\n    }\n\n    /* SPS */\n\n    /* profile idc */\n    profile_idc = (ngx_uint_t) ngx_rtmp_bit_read(&br, 8);\n\n    /* flags */\n    ngx_rtmp_bit_read(&br, 8);\n\n    /* level idc */\n    ngx_rtmp_bit_read(&br, 8);\n\n    /* SPS id */\n    ngx_rtmp_bit_read_golomb(&br);\n\n    if (profile_idc == 100 || profile_idc == 110 ||\n        profile_idc == 122 || profile_idc == 244 || profile_idc == 44 ||\n        profile_idc == 83 || profile_idc == 86 || profile_idc == 118)\n    {\n        /* chroma format idc */\n        cf_idc = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br);\n\n        if (cf_idc == 3) {\n\n            /* separate color plane */\n            ngx_rtmp_bit_read(&br, 1);\n        }\n\n        /* bit depth luma - 8 */\n        ngx_rtmp_bit_read_golomb(&br);\n\n        /* bit depth chroma - 8 */\n        ngx_rtmp_bit_read_golomb(&br);\n\n        /* qpprime y zero transform bypass */\n        ngx_rtmp_bit_read(&br, 1);\n\n        /* seq scaling matrix present */\n        if (ngx_rtmp_bit_read(&br, 1)) {\n\n            for (n = 0; n < (cf_idc != 3 ? 8u : 12u); n++) {\n\n                /* seq scaling list present */\n                if (ngx_rtmp_bit_read(&br, 1)) {\n\n                    /* TODO: scaling_list()\n                    if (n < 6) {\n                    } else {\n                    }\n                    */\n                }\n            }\n        }\n    }\n\n    /* log2 max frame num */\n    ngx_rtmp_bit_read_golomb(&br);\n\n    /* pic order cnt type */\n    switch (ngx_rtmp_bit_read_golomb(&br)) {\n    case 0:\n\n        /* max pic order cnt */\n        ngx_rtmp_bit_read_golomb(&br);\n        break;\n\n    case 1:\n\n        /* delta pic order alwys zero */\n        ngx_rtmp_bit_read(&br, 1);\n\n        /* offset for non-ref pic */\n        ngx_rtmp_bit_read_golomb(&br);\n\n        /* offset for top to bottom field */\n        ngx_rtmp_bit_read_golomb(&br);\n\n        /* num ref frames in pic order */\n        num_ref_frames = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br);\n\n        for (n = 0; n < num_ref_frames; n++) {\n\n            /* offset for ref frame */\n            ngx_rtmp_bit_read_golomb(&br);\n        }\n    }\n\n    /* num ref frames */\n    ctx->avc_ref_frames = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br);\n\n    /* gaps in frame num allowed */\n    ngx_rtmp_bit_read(&br, 1);\n\n    /* pic width in mbs - 1 */\n    width = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br);\n\n    /* pic height in map units - 1 */\n    height = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br);\n\n    /* frame mbs only flag */\n    frame_mbs_only = (ngx_uint_t) ngx_rtmp_bit_read(&br, 1);\n\n    if (!frame_mbs_only) {\n\n        /* mbs adaprive frame field */\n        ngx_rtmp_bit_read(&br, 1);\n    }\n\n    /* direct 8x8 inference flag */\n    ngx_rtmp_bit_read(&br, 1);\n\n    /* frame cropping */\n    if (ngx_rtmp_bit_read(&br, 1)) {\n\n        crop_left = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br);\n        crop_right = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br);\n        crop_top = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br);\n        crop_bottom = (ngx_uint_t) ngx_rtmp_bit_read_golomb(&br);\n\n    } else {\n\n        crop_left = 0;\n        crop_right = 0;\n        crop_top = 0;\n        crop_bottom = 0;\n    }\n\n    ctx->width = (width + 1) * 16 - (crop_left + crop_right) * 2;\n    ctx->height = (2 - frame_mbs_only) * (height + 1) * 16 -\n                  (crop_top + crop_bottom) * 2;\n\n    ngx_log_debug7(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"codec: avc header \"\n                   \"profile=%ui, compat=%ui, level=%ui, \"\n                   \"nal_bytes=%ui, ref_frames=%ui, width=%ui, height=%ui\",\n                   ctx->avc_profile, ctx->avc_compat, ctx->avc_level,\n                   ctx->avc_nal_bytes, ctx->avc_ref_frames,\n                   ctx->width, ctx->height);\n}\n\n\n#if (NGX_DEBUG)\nstatic void\nngx_rtmp_codec_dump_header(ngx_rtmp_session_t *s, const char *type,\n    ngx_chain_t *in)\n{\n    u_char buf[256], *p, *pp;\n    u_char hex[] = \"0123456789abcdef\";\n\n    for (pp = buf, p = in->buf->pos;\n         p < in->buf->last && pp < buf + sizeof(buf) - 1;\n         ++p)\n    {\n        *pp++ = hex[*p >> 4];\n        *pp++ = hex[*p & 0x0f];\n    }\n\n    *pp = 0;\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"codec: %s header %s\", type, buf);\n}\n#endif\n\n\nstatic ngx_int_t\nngx_rtmp_codec_reconstruct_meta(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_codec_ctx_t           *ctx;\n    ngx_rtmp_core_srv_conf_t       *cscf;\n    ngx_int_t                       rc;\n\n    static struct {\n        double                      width;\n        double                      height;\n        double                      duration;\n        double                      frame_rate;\n        double                      video_data_rate;\n        double                      video_codec_id;\n        double                      audio_data_rate;\n        double                      audio_codec_id;\n        u_char                      profile[32];\n        u_char                      level[32];\n    }                               v;\n\n    static ngx_rtmp_amf_elt_t       out_inf[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"Server\"),\n          \"PingOS (https://pingos.io)\", 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"width\"),\n          &v.width, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"height\"),\n          &v.height, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"displayWidth\"),\n          &v.width, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"displayHeight\"),\n          &v.height, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"duration\"),\n          &v.duration, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"framerate\"),\n          &v.frame_rate, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"fps\"),\n          &v.frame_rate, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"videodatarate\"),\n          &v.video_data_rate, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"videocodecid\"),\n          &v.video_codec_id, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"audiodatarate\"),\n          &v.audio_data_rate, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"audiocodecid\"),\n          &v.audio_codec_id, 0 },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"profile\"),\n          &v.profile, sizeof(v.profile) },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"level\"),\n          &v.level, sizeof(v.level) },\n    };\n\n    static ngx_rtmp_amf_elt_t       out_elts[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          \"onMetaData\", 0 },\n\n        { NGX_RTMP_AMF_OBJECT,\n          ngx_null_string,\n          out_inf, sizeof(out_inf) },\n    };\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n    if (ctx == NULL) {\n        return NGX_OK;\n    }\n\n    if (ctx->meta) {\n        ngx_rtmp_shared_free_frame(ctx->meta);\n    }\n\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n\n    ctx->meta = ngx_rtmp_shared_alloc_frame(cscf->chunk_size, NULL, 1);\n\n    v.width = ctx->width;\n    v.height = ctx->height;\n    v.duration = ctx->duration;\n    v.frame_rate = ctx->frame_rate;\n    v.video_data_rate = ctx->video_data_rate;\n    v.video_codec_id = ctx->video_codec_id;\n    v.audio_data_rate = ctx->audio_data_rate;\n    v.audio_codec_id = ctx->audio_codec_id;\n    ngx_memcpy(v.profile, ctx->profile, sizeof(ctx->profile));\n    ngx_memcpy(v.level, ctx->level, sizeof(ctx->level));\n\n    rc = ngx_rtmp_append_amf(s, &ctx->meta->chain, &ctx->meta->chain, out_elts,\n                             sizeof(out_elts) / sizeof(out_elts[0]));\n    if (rc != NGX_OK || ctx->meta == NULL) {\n        return NGX_ERROR;\n    }\n\n    return ngx_rtmp_codec_prepare_meta(s, 0);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_codec_copy_meta(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    ngx_rtmp_codec_ctx_t      *ctx;\n    ngx_rtmp_core_srv_conf_t  *cscf;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n\n    if (ctx->meta) {\n        ngx_rtmp_shared_free_frame(ctx->meta);\n    }\n\n    ctx->meta = ngx_rtmp_shared_alloc_frame(cscf->chunk_size, in, 0);\n\n    if (ctx->meta == NULL) {\n        return NGX_ERROR;\n    }\n\n    return ngx_rtmp_codec_prepare_meta(s, h->timestamp);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_codec_prepare_meta(ngx_rtmp_session_t *s, uint32_t timestamp)\n{\n    ngx_rtmp_codec_ctx_t  *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    ctx->meta->hdr.csid = NGX_RTMP_CSID_AMF;\n    ctx->meta->hdr.msid = NGX_RTMP_MSID;\n    ctx->meta->hdr.type = NGX_RTMP_MSG_AMF_META;\n    ctx->meta->hdr.timestamp = timestamp;\n\n    ctx->meta_version = ngx_rtmp_codec_get_next_version();\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_codec_meta_data(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    ngx_rtmp_codec_app_conf_t      *cacf;\n    ngx_rtmp_codec_ctx_t           *ctx;\n    ngx_uint_t                      skip;\n\n    static struct {\n        double                      width;\n        double                      height;\n        double                      duration;\n        double                      frame_rate;\n        double                      video_data_rate;\n        double                      video_codec_id_n;\n        u_char                      video_codec_id_s[32];\n        double                      audio_data_rate;\n        double                      audio_codec_id_n;\n        u_char                      audio_codec_id_s[32];\n        u_char                      profile[32];\n        u_char                      level[32];\n    }                               v;\n\n    static ngx_rtmp_amf_elt_t       in_video_codec_id[] = {\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &v.video_codec_id_n, 0 },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          &v.video_codec_id_s, sizeof(v.video_codec_id_s) },\n    };\n\n    static ngx_rtmp_amf_elt_t       in_audio_codec_id[] = {\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &v.audio_codec_id_n, 0 },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          &v.audio_codec_id_s, sizeof(v.audio_codec_id_s) },\n    };\n\n    static ngx_rtmp_amf_elt_t       in_inf[] = {\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"width\"),\n          &v.width, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"height\"),\n          &v.height, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"duration\"),\n          &v.duration, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"framerate\"),\n          &v.frame_rate, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"fps\"),\n          &v.frame_rate, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"videodatarate\"),\n          &v.video_data_rate, 0 },\n\n        { NGX_RTMP_AMF_VARIANT,\n          ngx_string(\"videocodecid\"),\n          in_video_codec_id, sizeof(in_video_codec_id) },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"audiodatarate\"),\n          &v.audio_data_rate, 0 },\n\n        { NGX_RTMP_AMF_VARIANT,\n          ngx_string(\"audiocodecid\"),\n          in_audio_codec_id, sizeof(in_audio_codec_id) },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"profile\"),\n          &v.profile, sizeof(v.profile) },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"level\"),\n          &v.level, sizeof(v.level) },\n    };\n\n    static ngx_rtmp_amf_elt_t       in_elts[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_OBJECT,\n          ngx_null_string,\n          in_inf, sizeof(in_inf) },\n    };\n\n    cacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_codec_module);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n    if (ctx == NULL) {\n        ctx = ngx_pcalloc(s->pool, sizeof(ngx_rtmp_codec_ctx_t));\n        ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_codec_module);\n    }\n\n    ngx_memzero(&v, sizeof(v));\n\n    /* use -1 as a sign of unchanged data;\n     * 0 is a valid value for uncompressed audio */\n    v.audio_codec_id_n = -1;\n\n    /* FFmpeg sends a string in front of actal metadata; ignore it */\n    skip = !(in->buf->last > in->buf->pos\n            && *in->buf->pos == NGX_RTMP_AMF_STRING);\n    if (ngx_rtmp_receive_amf(s, in, in_elts + skip,\n                sizeof(in_elts) / sizeof(in_elts[0]) - skip))\n    {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"codec: error parsing data frame\");\n        return NGX_OK;\n    }\n\n    ctx->width = (ngx_uint_t) v.width;\n    ctx->height = (ngx_uint_t) v.height;\n    ctx->duration = (ngx_uint_t) v.duration;\n    ctx->frame_rate = v.frame_rate;\n    ctx->video_data_rate = (ngx_uint_t) v.video_data_rate;\n    ctx->video_codec_id = (ngx_uint_t) v.video_codec_id_n;\n    ctx->audio_data_rate = (ngx_uint_t) v.audio_data_rate;\n    ctx->audio_codec_id = (v.audio_codec_id_n == -1\n            ? 0 : v.audio_codec_id_n == 0\n            ? NGX_RTMP_AUDIO_UNCOMPRESSED : (ngx_uint_t) v.audio_codec_id_n);\n    ngx_memcpy(ctx->profile, v.profile, sizeof(v.profile));\n    ngx_memcpy(ctx->level, v.level, sizeof(v.level));\n\n    ngx_log_debug8(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"codec: data frame: \"\n            \"width=%ui height=%ui duration=%ui frame_rate=%f \"\n            \"video=%s (%ui) audio=%s (%ui)\",\n            ctx->width, ctx->height, ctx->duration, ctx->frame_rate,\n            ngx_rtmp_get_video_codec_name(ctx->video_codec_id),\n            ctx->video_codec_id,\n            ngx_rtmp_get_audio_codec_name(ctx->audio_codec_id),\n            ctx->audio_codec_id);\n\n    switch (cacf->meta) {\n        case NGX_RTMP_CODEC_META_ON:\n            return ngx_rtmp_codec_reconstruct_meta(s);\n        case NGX_RTMP_CODEC_META_COPY:\n            return ngx_rtmp_codec_copy_meta(s, h, in);\n    }\n\n    /* NGX_RTMP_CODEC_META_OFF */\n\n    return NGX_OK;\n}\n\n\nstatic void *\nngx_rtmp_codec_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_codec_app_conf_t  *cacf;\n\n    cacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_codec_app_conf_t));\n    if (cacf == NULL) {\n        return NULL;\n    }\n\n    cacf->meta = NGX_CONF_UNSET_UINT;\n\n    return cacf;\n}\n\n\nstatic char *\nngx_rtmp_codec_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_rtmp_codec_app_conf_t *prev = parent;\n    ngx_rtmp_codec_app_conf_t *conf = child;\n\n    ngx_conf_merge_uint_value(conf->meta, prev->meta, NGX_RTMP_CODEC_META_ON);\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_codec_postconfiguration(ngx_conf_t *cf)\n{\n    ngx_rtmp_core_main_conf_t          *cmcf;\n    ngx_rtmp_handler_pt                *h;\n    ngx_rtmp_amf_handler_t             *ch;\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]);\n    *h = ngx_rtmp_codec_av;\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]);\n    *h = ngx_rtmp_codec_av;\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_DISCONNECT]);\n    *h = ngx_rtmp_codec_disconnect;\n\n    /* register metadata handler */\n    ch = ngx_array_push(&cmcf->amf);\n    if (ch == NULL) {\n        return NGX_ERROR;\n    }\n    ngx_str_set(&ch->name, \"@setDataFrame\");\n    ch->handler = ngx_rtmp_codec_meta_data;\n\n    ch = ngx_array_push(&cmcf->amf);\n    if (ch == NULL) {\n        return NGX_ERROR;\n    }\n    ngx_str_set(&ch->name, \"onMetaData\");\n    ch->handler = ngx_rtmp_codec_meta_data;\n\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_codec_module.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#ifndef _NGX_RTMP_CODEC_H_INCLUDED_\n#define _NGX_RTMP_CODEC_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n\n\n/* hevc nal type */\nenum {\n    NAL_TRAIL_N    = 0,\n    NAL_TRAIL_R    = 1,\n    NAL_TSA_N      = 2,\n    NAL_TSA_R      = 3,\n    NAL_STSA_N     = 4,\n    NAL_STSA_R     = 5,\n    NAL_RADL_N     = 6,\n    NAL_RADL_R     = 7,\n    NAL_RASL_N     = 8,\n    NAL_RASL_R     = 9,\n    NAL_BLA_W_LP   = 16,\n    NAL_BLA_W_RADL = 17,\n    NAL_BLA_N_LP   = 18,\n    NAL_IDR_W_RADL = 19,\n    NAL_IDR_N_LP   = 20,\n    NAL_CRA_NUT    = 21,\n    NAL_VPS        = 32,\n    NAL_SPS        = 33,\n    NAL_PPS        = 34,\n    NAL_AUD        = 35,\n    NAL_EOS_NUT    = 36,\n    NAL_EOB_NUT    = 37,\n    NAL_FD_NUT     = 38,\n    NAL_SEI_PREFIX = 39,\n    NAL_SEI_SUFFIX = 40,\n};\n\n\nu_char * ngx_rtmp_get_audio_codec_name(ngx_uint_t id);\nu_char * ngx_rtmp_get_video_codec_name(ngx_uint_t id);\n\n\ntypedef struct {\n    ngx_uint_t                  width;\n    ngx_uint_t                  height;\n    ngx_uint_t                  duration;\n    double                      frame_rate;\n    ngx_uint_t                  video_data_rate;\n    ngx_uint_t                  video_codec_id;\n    ngx_uint_t                  audio_data_rate;\n    ngx_uint_t                  audio_codec_id;\n    ngx_uint_t                  aac_profile;\n    ngx_uint_t                  aac_chan_conf;\n    ngx_uint_t                  aac_sbr;\n    ngx_uint_t                  aac_ps;\n    ngx_uint_t                  avc_profile;    /* avc or hevc */\n    ngx_uint_t                  avc_compat;     /* avc or hevc */\n    ngx_uint_t                  avc_level;      /* avc or hevc */\n    ngx_uint_t                  avc_nal_bytes;  /* avc or hevc */\n    ngx_uint_t                  avc_ref_frames; /* avc or hevc */\n    ngx_uint_t                  sample_rate;    /* 5512, 11025, 22050, 44100 */\n    ngx_uint_t                  sample_size;    /* 1=8bit, 2=16bit */\n    ngx_uint_t                  audio_channels; /* 1, 2 */\n    u_char                      profile[32];\n    u_char                      level[32];\n\n    ngx_rtmp_frame_t           *avc_header;     /* avc or hevc */\n    ngx_rtmp_frame_t           *aac_header;\n\n    ngx_rtmp_frame_t           *meta;\n    ngx_uint_t                  meta_version;\n} ngx_rtmp_codec_ctx_t;\n\n\nextern ngx_module_t  ngx_rtmp_codec_module;\n\n\n#endif /* _NGX_RTMP_LIVE_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_control_module.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_live.h\"\n#include \"ngx_rtmp_live_module.h\"\n#include \"ngx_live_record.h\"\n#include \"ngx_rtmp_record_module.h\"\n#include \"ngx_rtmp_dynamic.h\"\n\n\nstatic char *ngx_rtmp_control(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\nstatic void *ngx_rtmp_control_create_loc_conf(ngx_conf_t *cf);\nstatic char *ngx_rtmp_control_merge_loc_conf(ngx_conf_t *cf,\n       void *parent, void *child);\n\n\ntypedef const char * (*ngx_rtmp_control_handler_t)(ngx_http_request_t *r,\n    ngx_rtmp_session_t *);\n\n\n#define NGX_RTMP_CONTROL_ALL        0xff\n#define NGX_RTMP_CONTROL_RECORD     0x01\n#define NGX_RTMP_CONTROL_DROP       0x02\n#define NGX_RTMP_CONTROL_REDIRECT   0x04\n#define NGX_RTMP_CONTROL_PAUSE      0x08\n#define NGX_RTMP_CONTROL_RESUME     0x10\n\n\nenum {\n    NGX_RTMP_CONTROL_FILTER_CLIENT = 0,\n    NGX_RTMP_CONTROL_FILTER_PUBLISHER,\n    NGX_RTMP_CONTROL_FILTER_SUBSCRIBER\n};\n\n\ntypedef struct {\n    ngx_uint_t                      count;\n    ngx_uint_t                      filter;\n    ngx_str_t                       method;\n    ngx_str_t                       path;\n    ngx_array_t                     sessions; /* ngx_rtmp_session_t * */\n} ngx_rtmp_control_ctx_t;\n\n\ntypedef struct {\n    ngx_uint_t                      control;\n} ngx_rtmp_control_loc_conf_t;\n\n\nstatic ngx_conf_bitmask_t           ngx_rtmp_control_masks[] = {\n    { ngx_string(\"all\"),            NGX_RTMP_CONTROL_ALL       },\n    { ngx_string(\"record\"),         NGX_RTMP_CONTROL_RECORD    },\n    { ngx_string(\"drop\"),           NGX_RTMP_CONTROL_DROP      },\n    { ngx_string(\"redirect\"),       NGX_RTMP_CONTROL_REDIRECT  },\n    { ngx_string(\"pause\"),          NGX_RTMP_CONTROL_PAUSE     },\n    { ngx_string(\"resume\"),         NGX_RTMP_CONTROL_RESUME    },\n    { ngx_null_string,              0                          }\n};\n\n\nstatic ngx_command_t  ngx_rtmp_control_commands[] = {\n\n    { ngx_string(\"rtmp_control\"),\n      NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_control,\n      NGX_HTTP_LOC_CONF_OFFSET,\n      offsetof(ngx_rtmp_control_loc_conf_t, control),\n      ngx_rtmp_control_masks },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_rtmp_control_module_ctx = {\n    NULL,                               /* preconfiguration */\n    NULL,                               /* postconfiguration */\n\n    NULL,                               /* create main configuration */\n    NULL,                               /* init main configuration */\n\n    NULL,                               /* create server configuration */\n    NULL,                               /* merge server configuration */\n\n    ngx_rtmp_control_create_loc_conf,   /* create location configuration */\n    ngx_rtmp_control_merge_loc_conf,    /* merge location configuration */\n};\n\n\nngx_module_t  ngx_rtmp_control_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_control_module_ctx,       /* module context */\n    ngx_rtmp_control_commands,          /* module directives */\n    NGX_HTTP_MODULE,                    /* module type */\n    NULL,                               /* init master */\n    NULL,                               /* init module */\n    NULL,                               /* init process */\n    NULL,                               /* init thread */\n    NULL,                               /* exit thread */\n    NULL,                               /* exit process */\n    NULL,                               /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic const char *\nngx_rtmp_control_record_handler(ngx_http_request_t *r, ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_control_ctx_t      *ctx;\n    ngx_uint_t                   rn;\n    ngx_str_t                    rec = ngx_null_string;\n    ngx_rtmp_core_app_conf_t    *cacf;\n    ngx_rtmp_record_app_conf_t  *racf;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module);\n    cacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_core_module);\n    racf = cacf->app_conf[ngx_rtmp_record_module.ctx_index];\n\n    if (ngx_http_arg(r, (u_char *) \"rec\", sizeof(\"rec\") - 1, &rec) != NGX_OK) {\n        rec.len = 0;\n    }\n\n    rn = ngx_rtmp_record_find(racf, &rec);\n    if (rn == NGX_CONF_UNSET_UINT) {\n        return \"Recorder not found\";\n    }\n\n    if (ctx->method.len == sizeof(\"start\") - 1 &&\n        ngx_strncmp(ctx->method.data, \"start\", ctx->method.len) == 0)\n    {\n        ngx_rtmp_record_open(s, rn, &ctx->path);\n\n        return ngx_live_record_open(s);\n\n    } else if (ctx->method.len == sizeof(\"stop\") - 1 &&\n        ngx_strncmp(ctx->method.data, \"stop\", ctx->method.len) == 0)\n    {\n        ngx_rtmp_record_close(s, rn, &ctx->path);\n\n        return ngx_live_record_close(s);\n\n    } else {\n        return \"Undefined method\";\n    }\n}\n\n\nstatic const char *\nngx_rtmp_control_drop_handler(ngx_http_request_t *r, ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_control_ctx_t  *ctx;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module);\n\n    s->finalize_reason = NGX_LIVE_CONTROL_DROP;\n    ngx_rtmp_finalize_session(s);\n\n    ++ctx->count;\n\n    return NGX_CONF_OK;\n}\n\n\nstatic const char *\nngx_rtmp_control_redirect_handler(ngx_http_request_t *r, ngx_rtmp_session_t *s)\n{\n    ngx_str_t                 name;\n    ngx_rtmp_play_t           vplay;\n    ngx_rtmp_publish_t        vpublish;\n    ngx_rtmp_live_ctx_t      *lctx;\n    ngx_rtmp_control_ctx_t   *ctx;\n    ngx_rtmp_close_stream_t   vc;\n\n    if (ngx_http_arg(r, (u_char *) \"newname\", sizeof(\"newname\") - 1, &name)\n        != NGX_OK)\n    {\n        return \"newname not specified\";\n    }\n\n    if (name.len >= NGX_RTMP_MAX_NAME) {\n        name.len = NGX_RTMP_MAX_NAME - 1;\n    }\n\n    ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module);\n    ctx->count++;\n\n    ngx_memzero(&vc, sizeof(ngx_rtmp_close_stream_t));\n\n    /* close_stream should be synchronous */\n    ngx_rtmp_close_stream_filter(s, &vc);\n\n    lctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module);\n\n    if (lctx && lctx->publishing) {\n        /* publish */\n\n        ngx_memzero(&vpublish, sizeof(ngx_rtmp_publish_t));\n\n        ngx_memcpy(vpublish.name, name.data, name.len);\n\n        ngx_rtmp_cmd_fill_args(vpublish.name, vpublish.args);\n\n        if (ngx_rtmp_publish_filter(s, &vpublish) != NGX_OK) {\n            return \"publish failed\";\n        }\n\n    } else {\n        /* play */\n\n        ngx_memzero(&vplay, sizeof(ngx_rtmp_play_t));\n\n        ngx_memcpy(vplay.name, name.data, name.len);\n\n        ngx_rtmp_cmd_fill_args(vplay.name, vplay.args);\n\n        if (ngx_rtmp_play_filter(s, &vplay) != NGX_OK) {\n            return \"play failed\";\n        }\n    }\n\n    return NGX_CONF_OK;\n}\n\nstatic const char *\nngx_rtmp_control_pause_handler(ngx_http_request_t *r, ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_control_ctx_t  *ctx;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module);\n\n    s->pause = 1;\n\n    ++ctx->count;\n\n    return NGX_CONF_OK;\n}\n\nstatic const char *\nngx_rtmp_control_resume_handler(ngx_http_request_t *r, ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_control_ctx_t  *ctx;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module);\n\n    if (s->pause == 1) {\n        s->pause = 2;\n    }\n\n    ++ctx->count;\n\n    return NGX_CONF_OK;\n}\n\nstatic const char *\nngx_rtmp_control_walk_session(ngx_http_request_t *r, ngx_rtmp_core_ctx_t *cctx)\n{\n    ngx_str_t                addr, *paddr, clientid;\n    ngx_rtmp_session_t      *s, **ss;\n    ngx_rtmp_control_ctx_t  *ctx;\n\n    s = cctx->session;\n\n    if (s == NULL) {\n        return NGX_CONF_OK;\n    }\n\n    if (ngx_http_arg(r, (u_char *) \"addr\", sizeof(\"addr\") - 1, &addr)\n            == NGX_OK)\n    {\n        paddr = s->addr_text;\n        if (paddr->len != addr.len ||\n                ngx_strncmp(paddr->data, addr.data, addr.len))\n        {\n            return NGX_CONF_OK;\n        }\n    }\n\n    if (ngx_http_arg(r, (u_char *) \"clientid\", sizeof(\"clientid\") - 1,\n                &clientid)\n            == NGX_OK)\n    {\n        if (s->number !=\n                (ngx_uint_t) ngx_atoi(clientid.data, clientid.len))\n        {\n            return NGX_CONF_OK;\n        }\n    }\n\n    ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module);\n\n    switch (ctx->filter) {\n        case NGX_RTMP_CONTROL_FILTER_PUBLISHER:\n            if (!cctx->publishing) {\n                return NGX_CONF_OK;\n            }\n            break;\n\n        case NGX_RTMP_CONTROL_FILTER_SUBSCRIBER:\n            if (cctx->publishing) {\n                return NGX_CONF_OK;\n            }\n            break;\n\n        case NGX_RTMP_CONTROL_FILTER_CLIENT:\n            break;\n    }\n\n    ss = ngx_array_push(&ctx->sessions);\n    if (ss == NULL) {\n        return \"allocation error\";\n    }\n\n    *ss = s;\n\n    return NGX_CONF_OK;\n}\n\n\nstatic const char *\nngx_rtmp_control_walk_stream(ngx_http_request_t *r, ngx_live_stream_t *st)\n{\n    const char           *s;\n    ngx_rtmp_core_ctx_t  *ctx;\n\n    for (ctx = st->play_ctx; ctx; ctx = ctx->next) {\n        s = ngx_rtmp_control_walk_session(r, ctx);\n        if (s != NGX_CONF_OK) {\n            return s;\n        }\n    }\n\n    for (ctx = st->publish_ctx; ctx; ctx = ctx->next) {\n        s = ngx_rtmp_control_walk_session(r, ctx);\n        if (s != NGX_CONF_OK) {\n            return s;\n        }\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic const char *\nngx_rtmp_control_walk_server(ngx_http_request_t *r, ngx_live_server_t *srv)\n{\n    ngx_live_conf_t            *lcf;\n    ngx_live_stream_t          *st;\n    ngx_str_t                   serverid, app, name, stream;\n    size_t                      n;\n    const char                 *s;\n    u_char                     *p;\n\n    lcf = (ngx_live_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                           ngx_live_module);\n\n    if (ngx_http_arg(r, (u_char *) \"app\", sizeof(\"app\") - 1, &app) != NGX_OK) {\n        app.len = 0;\n    }\n\n    if (app.len == 0) {\n        for (n = 0; n < lcf->stream_buckets; ++n) {\n            for (st = srv->streams[n]; st; st = st->next) {\n                s = ngx_rtmp_control_walk_stream(r, st);\n                if (s != NGX_CONF_OK) {\n                    return s;\n                }\n            }\n        }\n\n        return NGX_CONF_OK;\n    }\n\n    if (ngx_http_arg(r, (u_char *) \"name\", sizeof(\"name\") - 1, &name)\n            != NGX_OK)\n    {\n        name.len = 0;\n    }\n\n    serverid.data = srv->serverid;\n    serverid.len = ngx_strlen(srv->serverid);\n\n    /* serverid/app/name */\n    stream.len = serverid.len + 1 + app.len + 1 + name.len;\n    stream.data = ngx_pcalloc(r->pool, stream.len);\n    p = stream.data;\n    p = ngx_copy(p, serverid.data, serverid.len);\n    *p++ = '/';\n    p = ngx_copy(p, app.data, app.len);\n    *p++ = '/';\n    p = ngx_copy(p, name.data, name.len);\n\n    if (name.len == 0) {\n        for (n = 0; n < lcf->stream_buckets; ++n) {\n            for (st = srv->streams[n]; st; st = st->next) {\n                if (ngx_memcmp(stream.data, st->name, stream.len) == 0) {\n                    s = ngx_rtmp_control_walk_stream(r, st);\n                    if (s != NGX_CONF_OK) {\n                        return s;\n                    }\n                }\n            }\n        }\n    } else {\n        st = ngx_live_fetch_stream(&serverid, &stream);\n        if (st) {\n            s = ngx_rtmp_control_walk_stream(r, st);\n            if (s != NGX_CONF_OK) {\n                return s;\n            }\n        }\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic const char *\nngx_rtmp_control_walk(ngx_http_request_t *r, ngx_rtmp_control_handler_t h)\n{\n    ngx_live_server_t                      *server;\n    ngx_str_t                               srv;\n    ngx_str_t                               serverid = ngx_null_string;\n    ngx_uint_t                              n;\n    const char                             *msg;\n    ngx_rtmp_session_t                    **s;\n    ngx_rtmp_control_ctx_t                 *ctx;\n\n    if (ngx_http_arg(r, (u_char *) \"srv\", sizeof(\"srv\") - 1, &srv) != NGX_OK) {\n        return \"Server not set\";\n    }\n\n    ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module);\n\n    serverid = srv;\n\n    if (!serverid.len) {\n        ngx_rmtp_get_serverid_by_domain(&serverid, &srv);\n    }\n\n    server = ngx_live_fetch_server(&serverid);\n    if (server == NULL) {\n        return NGX_CONF_OK;\n    }\n\n    msg = ngx_rtmp_control_walk_server(r, server);\n    if (msg != NGX_CONF_OK) {\n        return msg;\n    }\n\n    s = ctx->sessions.elts;\n    for (n = 0; n < ctx->sessions.nelts; n++) {\n        msg = h(r, s[n]);\n        if (msg != NGX_CONF_OK) {\n            return msg;\n        }\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_control_record(ngx_http_request_t *r, ngx_str_t *method)\n{\n    ngx_buf_t               *b;\n    const char              *msg;\n    ngx_chain_t              cl;\n    ngx_rtmp_control_ctx_t  *ctx;\n    size_t                   len;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module);\n    ctx->filter = NGX_RTMP_CONTROL_FILTER_PUBLISHER;\n\n    msg = ngx_rtmp_control_walk(r, ngx_rtmp_control_record_handler);\n    if (msg != NGX_CONF_OK) {\n        goto error;\n    }\n\n    /* output record path */\n\n    len = sizeof(\"ok\\n\") - 1;\n\n    r->headers_out.status = NGX_HTTP_OK;\n    r->headers_out.content_length_n = len;\n\n    b = ngx_create_temp_buf(r->pool, len);\n    if (b == NULL) {\n        goto error;\n    }\n\n    ngx_memzero(&cl, sizeof(cl));\n    cl.buf = b;\n\n    b->last = ngx_cpymem(b->pos, \"ok\\n\", len);\n    b->last_buf = 1;\n\n    ngx_http_send_header(r);\n\n    return ngx_http_output_filter(r, &cl);\n\nerror:\n    return NGX_HTTP_INTERNAL_SERVER_ERROR;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_control_drop(ngx_http_request_t *r, ngx_str_t *method)\n{\n    size_t                   len;\n    u_char                  *p;\n    ngx_buf_t               *b;\n    ngx_chain_t              cl;\n    const char              *msg;\n    ngx_rtmp_control_ctx_t  *ctx;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module);\n\n    if (ctx->method.len == sizeof(\"publisher\") - 1 &&\n        ngx_memcmp(ctx->method.data, \"publisher\", ctx->method.len) == 0)\n    {\n        ctx->filter = NGX_RTMP_CONTROL_FILTER_PUBLISHER;\n\n    } else if (ctx->method.len == sizeof(\"subscriber\") - 1 &&\n               ngx_memcmp(ctx->method.data, \"subscriber\", ctx->method.len)\n               == 0)\n    {\n        ctx->filter = NGX_RTMP_CONTROL_FILTER_SUBSCRIBER;\n\n    } else if (method->len == sizeof(\"client\") - 1 &&\n               ngx_memcmp(ctx->method.data, \"client\", ctx->method.len) == 0)\n    {\n        ctx->filter = NGX_RTMP_CONTROL_FILTER_CLIENT;\n\n    } else {\n        msg = \"Undefined filter\";\n        goto error;\n    }\n\n    msg = ngx_rtmp_control_walk(r, ngx_rtmp_control_drop_handler);\n    if (msg != NGX_CONF_OK) {\n        goto error;\n    }\n\n    /* output count */\n\n    len = NGX_INT_T_LEN;\n\n    p = ngx_palloc(r->connection->pool, len);\n    if (p == NULL) {\n        return NGX_ERROR;\n    }\n\n    len = (size_t) (ngx_snprintf(p, len, \"%ui\", ctx->count) - p);\n\n    r->headers_out.status = NGX_HTTP_OK;\n    r->headers_out.content_length_n = len;\n\n    b = ngx_calloc_buf(r->pool);\n    if (b == NULL) {\n        goto error;\n    }\n\n    b->start = b->pos = p;\n    b->end = b->last = p + len;\n    b->temporary = 1;\n    b->last_buf = 1;\n\n    ngx_memzero(&cl, sizeof(cl));\n    cl.buf = b;\n\n    ngx_http_send_header(r);\n\n    return ngx_http_output_filter(r, &cl);\n\nerror:\n    return NGX_HTTP_INTERNAL_SERVER_ERROR;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_control_redirect(ngx_http_request_t *r, ngx_str_t *method)\n{\n    size_t                   len;\n    u_char                  *p;\n    ngx_buf_t               *b;\n    ngx_chain_t              cl;\n    const char              *msg;\n    ngx_rtmp_control_ctx_t  *ctx;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module);\n\n    if (ctx->method.len == sizeof(\"publisher\") - 1 &&\n        ngx_memcmp(ctx->method.data, \"publisher\", ctx->method.len) == 0)\n    {\n        ctx->filter = NGX_RTMP_CONTROL_FILTER_PUBLISHER;\n\n    } else if (ctx->method.len == sizeof(\"subscriber\") - 1 &&\n               ngx_memcmp(ctx->method.data, \"subscriber\", ctx->method.len)\n               == 0)\n    {\n        ctx->filter = NGX_RTMP_CONTROL_FILTER_SUBSCRIBER;\n\n    } else if (ctx->method.len == sizeof(\"client\") - 1 &&\n               ngx_memcmp(ctx->method.data, \"client\", ctx->method.len) == 0)\n    {\n        ctx->filter = NGX_RTMP_CONTROL_FILTER_CLIENT;\n\n    } else {\n        msg = \"Undefined filter\";\n        goto error;\n    }\n\n    msg = ngx_rtmp_control_walk(r, ngx_rtmp_control_redirect_handler);\n    if (msg != NGX_CONF_OK) {\n        goto error;\n    }\n\n    /* output count */\n\n    len = NGX_INT_T_LEN;\n\n    p = ngx_pcalloc(r->connection->pool, len);\n    if (p == NULL) {\n        msg = \"ngx_palloc failed\";\n        goto error;\n    }\n\n    len = (size_t) (ngx_snprintf(p, len, \"%ui\", ctx->count) - p);\n\n    r->headers_out.status = NGX_HTTP_OK;\n    r->headers_out.content_length_n = len;\n\n    b = ngx_calloc_buf(r->pool);\n    if (b == NULL) {\n        msg = \"calloc buf failed\";\n        goto error;\n    }\n\n    b->start = b->pos = p;\n    b->end = b->last = p + len;\n    b->temporary = 1;\n    b->last_buf = 1;\n\n    ngx_memzero(&cl, sizeof(cl));\n    cl.buf = b;\n\n    ngx_http_send_header(r);\n\n    return ngx_http_output_filter(r, &cl);\n\nerror:\n    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n        \"rtmp-control: redirect| %s\", msg);\n    return NGX_HTTP_INTERNAL_SERVER_ERROR;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_control_pause(ngx_http_request_t *r, ngx_str_t *method)\n{\n    size_t                   len;\n    u_char                  *p;\n    ngx_buf_t               *b;\n    ngx_chain_t              cl;\n    const char              *msg;\n    ngx_rtmp_control_ctx_t  *ctx;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module);\n\n    if (ctx->method.len == sizeof(\"publisher\") - 1 &&\n        ngx_memcmp(ctx->method.data, \"publisher\", ctx->method.len) == 0)\n    {\n        ctx->filter = NGX_RTMP_CONTROL_FILTER_PUBLISHER;\n\n    } else if (ctx->method.len == sizeof(\"subscriber\") - 1 &&\n               ngx_memcmp(ctx->method.data, \"subscriber\", ctx->method.len)\n               == 0)\n    {\n        ctx->filter = NGX_RTMP_CONTROL_FILTER_SUBSCRIBER;\n\n    } else if (method->len == sizeof(\"client\") - 1 &&\n               ngx_memcmp(ctx->method.data, \"client\", ctx->method.len) == 0)\n    {\n        ctx->filter = NGX_RTMP_CONTROL_FILTER_CLIENT;\n\n    } else {\n        msg = \"Undefined filter\";\n        goto error;\n    }\n\n    msg = ngx_rtmp_control_walk(r, ngx_rtmp_control_pause_handler);\n    if (msg != NGX_CONF_OK) {\n        goto error;\n    }\n\n    /* output count */\n\n    len = NGX_INT_T_LEN;\n\n    p = ngx_palloc(r->connection->pool, len);\n    if (p == NULL) {\n        return NGX_ERROR;\n    }\n\n    len = (size_t) (ngx_snprintf(p, len, \"%ui\", ctx->count) - p);\n\n    r->headers_out.status = NGX_HTTP_OK;\n    r->headers_out.content_length_n = len;\n\n    b = ngx_calloc_buf(r->pool);\n    if (b == NULL) {\n        goto error;\n    }\n\n    b->start = b->pos = p;\n    b->end = b->last = p + len;\n    b->temporary = 1;\n    b->last_buf = 1;\n\n    ngx_memzero(&cl, sizeof(cl));\n    cl.buf = b;\n\n    ngx_http_send_header(r);\n\n    return ngx_http_output_filter(r, &cl);\n\nerror:\n    return NGX_HTTP_INTERNAL_SERVER_ERROR;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_control_resume(ngx_http_request_t *r, ngx_str_t *method)\n{\n    size_t                   len;\n    u_char                  *p;\n    ngx_buf_t               *b;\n    ngx_chain_t              cl;\n    const char              *msg;\n    ngx_rtmp_control_ctx_t  *ctx;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_rtmp_control_module);\n\n    if (ctx->method.len == sizeof(\"publisher\") - 1 &&\n        ngx_memcmp(ctx->method.data, \"publisher\", ctx->method.len) == 0)\n    {\n        ctx->filter = NGX_RTMP_CONTROL_FILTER_PUBLISHER;\n\n    } else if (ctx->method.len == sizeof(\"subscriber\") - 1 &&\n               ngx_memcmp(ctx->method.data, \"subscriber\", ctx->method.len)\n               == 0)\n    {\n        ctx->filter = NGX_RTMP_CONTROL_FILTER_SUBSCRIBER;\n\n    } else if (method->len == sizeof(\"client\") - 1 &&\n               ngx_memcmp(ctx->method.data, \"client\", ctx->method.len) == 0)\n    {\n        ctx->filter = NGX_RTMP_CONTROL_FILTER_CLIENT;\n\n    } else {\n        msg = \"Undefined filter\";\n        goto error;\n    }\n\n    msg = ngx_rtmp_control_walk(r, ngx_rtmp_control_resume_handler);\n    if (msg != NGX_CONF_OK) {\n        goto error;\n    }\n\n    /* output count */\n\n    len = NGX_INT_T_LEN;\n\n    p = ngx_palloc(r->connection->pool, len);\n    if (p == NULL) {\n        return NGX_ERROR;\n    }\n\n    len = (size_t) (ngx_snprintf(p, len, \"%ui\", ctx->count) - p);\n\n    r->headers_out.status = NGX_HTTP_OK;\n    r->headers_out.content_length_n = len;\n\n    b = ngx_calloc_buf(r->pool);\n    if (b == NULL) {\n        goto error;\n    }\n\n    b->start = b->pos = p;\n    b->end = b->last = p + len;\n    b->temporary = 1;\n    b->last_buf = 1;\n\n    ngx_memzero(&cl, sizeof(cl));\n    cl.buf = b;\n\n    ngx_http_send_header(r);\n\n    return ngx_http_output_filter(r, &cl);\n\nerror:\n    return NGX_HTTP_INTERNAL_SERVER_ERROR;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_control_handler(ngx_http_request_t *r)\n{\n    u_char                       *p;\n    ngx_str_t                     section, method;\n    ngx_uint_t                    n;\n    ngx_rtmp_control_ctx_t       *ctx;\n    ngx_rtmp_control_loc_conf_t  *llcf;\n\n    llcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_control_module);\n    if (llcf->control == 0) {\n        return NGX_DECLINED;\n    }\n\n    /* uri format: .../section/method?args */\n\n    ngx_str_null(&section);\n    ngx_str_null(&method);\n\n    for (n = r->uri.len; n; --n) {\n        p = &r->uri.data[n - 1];\n\n        if (*p != '/') {\n            continue;\n        }\n\n        if (method.data) {\n            section.data = p + 1;\n            section.len  = method.data - section.data - 1;\n            break;\n        }\n\n        method.data = p + 1;\n        method.len  = r->uri.data + r->uri.len - method.data;\n    }\n\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n                   \"rtmp_control: section='%V' method='%V'\",\n                   &section, &method);\n\n    ctx = ngx_pcalloc(r->pool, sizeof(ngx_rtmp_control_ctx_t));\n    if (ctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    ngx_http_set_ctx(r, ctx, ngx_rtmp_control_module);\n\n    if (ngx_array_init(&ctx->sessions, r->pool, 1, sizeof(void *)) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    ctx->method = method;\n\n#define NGX_RTMP_CONTROL_SECTION(flag, secname)                             \\\n    if (llcf->control & NGX_RTMP_CONTROL_##flag &&                          \\\n        section.len == sizeof(#secname) - 1 &&                              \\\n        ngx_strncmp(section.data, #secname, sizeof(#secname) - 1) == 0)     \\\n    {                                                                       \\\n        return ngx_rtmp_control_##secname(r, &method);                      \\\n    }\n\n    NGX_RTMP_CONTROL_SECTION(RECORD, record);\n    NGX_RTMP_CONTROL_SECTION(DROP, drop);\n    NGX_RTMP_CONTROL_SECTION(REDIRECT, redirect);\n    NGX_RTMP_CONTROL_SECTION(PAUSE, pause);\n    NGX_RTMP_CONTROL_SECTION(RESUME, resume);\n\n#undef NGX_RTMP_CONTROL_SECTION\n\n    return NGX_DECLINED;\n}\n\n\nstatic void *\nngx_rtmp_control_create_loc_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_control_loc_conf_t  *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_control_loc_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->control = 0;\n\n    return conf;\n}\n\n\nstatic char *\nngx_rtmp_control_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_rtmp_control_loc_conf_t  *prev = parent;\n    ngx_rtmp_control_loc_conf_t  *conf = child;\n\n    ngx_conf_merge_bitmask_value(conf->control, prev->control, 0);\n\n    return NGX_CONF_OK;\n}\n\n\nstatic char *\nngx_rtmp_control(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t  *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_rtmp_control_handler;\n\n    return ngx_conf_set_bitmask_slot(cf, cmd, conf);\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_core_module.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_event.h>\n#include <nginx.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_dynamic_conf.h\"\n#include \"ngx_rtmp_dynamic.h\"\n#include \"ngx_rtmp_variables.h\"\n\n\nstatic ngx_int_t ngx_rtmp_core_preconfiguration(ngx_conf_t *cf);\n\nstatic void *ngx_rtmp_core_create_main_conf(ngx_conf_t *cf);\nstatic char *ngx_rtmp_core_init_main_conf(ngx_conf_t *cf, void *conf);\nstatic void *ngx_rtmp_core_create_srv_conf(ngx_conf_t *cf);\nstatic char *ngx_rtmp_core_merge_srv_conf(ngx_conf_t *cf, void *parent,\n    void *child);\nstatic void *ngx_rtmp_core_create_app_conf(ngx_conf_t *cf);\nstatic char *ngx_rtmp_core_merge_app_conf(ngx_conf_t *cf, void *parent,\n    void *child);\nstatic char *ngx_rtmp_core_server(ngx_conf_t *cf, ngx_command_t *cmd,\n    void *conf);\nstatic char *ngx_rtmp_core_listen(ngx_conf_t *cf, ngx_command_t *cmd,\n    void *conf);\nstatic char *ngx_rtmp_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd,\n    void *conf);\nstatic char *ngx_rtmp_core_application(ngx_conf_t *cf, ngx_command_t *cmd,\n    void *conf);\n\nstatic void *ngx_rtmp_core_create_srv_dconf(ngx_conf_t *cf);\nstatic char *ngx_rtmp_core_init_srv_dconf(ngx_conf_t *cf, void *conf);\n\nstatic char *ngx_rtmp_merge_frame(ngx_conf_t *cf, void *post, void *data);\n\nstatic ngx_conf_post_handler_pt  ngx_rtmp_merge_frame_p =\n    ngx_rtmp_merge_frame;\n\nngx_rtmp_core_main_conf_t      *ngx_rtmp_core_main_conf;\n\n\nstatic ngx_conf_deprecated_t  ngx_conf_deprecated_so_keepalive = {\n    ngx_conf_deprecated, \"so_keepalive\",\n    \"so_keepalive\\\" parameter of the \\\"listen\"\n};\n\n\nstatic ngx_command_t  ngx_rtmp_core_commands[] = {\n\n    { ngx_string(\"server_names_hash_max_size\"),\n      NGX_RTMP_MAIN_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      NGX_RTMP_MAIN_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_main_conf_t, server_names_hash_max_size),\n      NULL },\n\n    { ngx_string(\"server_names_hash_bucket_size\"),\n      NGX_RTMP_MAIN_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      NGX_RTMP_MAIN_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_main_conf_t, server_names_hash_bucket_size),\n      NULL },\n\n    { ngx_string(\"fast_reload\"),\n      NGX_RTMP_MAIN_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_MAIN_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_main_conf_t, fast_reload),\n      NULL },\n\n    { ngx_string(\"server\"),\n      NGX_RTMP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,\n      ngx_rtmp_core_server,\n      0,\n      0,\n      NULL },\n\n    { ngx_string(\"listen\"),\n      NGX_RTMP_SRV_CONF|NGX_CONF_TAKE12,\n      ngx_rtmp_core_listen,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"server_name\"),\n      NGX_RTMP_SRV_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_core_server_name,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"application\"),\n      NGX_RTMP_SRV_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1,\n      ngx_rtmp_core_application,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"so_keepalive\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_FLAG,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_srv_conf_t, so_keepalive),\n      &ngx_conf_deprecated_so_keepalive },\n\n    { ngx_string(\"timeout\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_srv_conf_t, timeout),\n      NULL },\n\n    { ngx_string(\"ping\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_srv_conf_t, ping),\n      NULL },\n\n    { ngx_string(\"ping_timeout\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_srv_conf_t, ping_timeout),\n      NULL },\n\n    { ngx_string(\"max_streams\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_srv_conf_t, max_streams),\n      NULL },\n\n    { ngx_string(\"ack_window\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_srv_conf_t, ack_window),\n      NULL },\n\n    { ngx_string(\"chunk_size\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_srv_conf_t, chunk_size),\n      NULL },\n\n    { ngx_string(\"max_message\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_size_slot,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_srv_conf_t, max_message),\n      NULL },\n\n    { ngx_string(\"out_queue\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_size_slot,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_srv_conf_t, out_queue),\n      NULL },\n\n    { ngx_string(\"merge_frame\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_app_conf_t, merge_frame),\n      &ngx_rtmp_merge_frame_p },\n\n    { ngx_string(\"tcp_nodelay\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_FLAG,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_app_conf_t, tcp_nodelay),\n      NULL },\n\n    { ngx_string(\"out_cork\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_size_slot,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_srv_conf_t, out_cork),\n      NULL },\n\n    { ngx_string(\"busy\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_srv_conf_t, busy),\n      NULL },\n\n    /* time fixes are needed for flash clients */\n    { ngx_string(\"play_time_fix\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_srv_conf_t, play_time_fix),\n      NULL },\n\n    { ngx_string(\"publish_time_fix\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_srv_conf_t, publish_time_fix),\n      NULL },\n\n    { ngx_string(\"buflen\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_srv_conf_t, buflen),\n      NULL },\n\n    { ngx_string(\"serverid\"),\n      NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_str_slot,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_srv_conf_t, serverid),\n      NULL },\n\n    { ngx_string(\"hevc_codecid\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_app_conf_t, hevc_codec),\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_rtmp_core_module_ctx = {\n    ngx_rtmp_core_preconfiguration,         /* preconfiguration */\n    NULL,                                   /* postconfiguration */\n    ngx_rtmp_core_create_main_conf,         /* create main configuration */\n    ngx_rtmp_core_init_main_conf,           /* init main configuration */\n    ngx_rtmp_core_create_srv_conf,          /* create server configuration */\n    ngx_rtmp_core_merge_srv_conf,           /* merge server configuration */\n    ngx_rtmp_core_create_app_conf,          /* create app configuration */\n    ngx_rtmp_core_merge_app_conf            /* merge app configuration */\n};\n\n/* nginx rtmp dynamic */\nstatic ngx_command_t  ngx_rtmp_core_dcommands[] = {\n\n    { ngx_string(\"serverid\"),\n      NGX_RTMP_SRV_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_str_slot,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      offsetof(ngx_rtmp_core_srv_dconf_t, serverid),\n      NULL },\n\n      ngx_null_command\n};\n\nstatic ngx_rtmp_dynamic_module_t  ngx_rtmp_core_module_dctx = {\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n\n    ngx_rtmp_core_create_srv_dconf,         /* create server configuration */\n    ngx_rtmp_core_init_srv_dconf,           /* merge server configuration */\n\n    NULL,                                   /* create app configuration */\n    NULL                                    /* merge app configuration */\n};\n\n\nngx_module_t  ngx_rtmp_core_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_core_module_ctx,              /* module context */\n    ngx_rtmp_core_commands,                 /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    (uintptr_t) &ngx_rtmp_core_module_dctx, /* module dynamic context */\n    (uintptr_t) ngx_rtmp_core_dcommands,    /* module dynamic directives */\n    NGX_MODULE_V1_DYNAMIC_PADDING\n};\n\n\nstatic void *\nngx_rtmp_core_create_main_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_core_main_conf_t  *cmcf;\n\n    cmcf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_core_main_conf_t));\n    if (cmcf == NULL) {\n        return NULL;\n    }\n\n    ngx_rtmp_core_main_conf = cmcf;\n\n    if (ngx_array_init(&cmcf->servers, cf->pool, 4,\n                       sizeof(ngx_rtmp_core_srv_conf_t *))\n        != NGX_OK)\n    {\n        return NULL;\n    }\n\n    cmcf->server_names_hash_max_size = NGX_CONF_UNSET_UINT;\n    cmcf->server_names_hash_bucket_size = NGX_CONF_UNSET_UINT;\n    cmcf->fast_reload = NGX_CONF_UNSET;\n    cmcf->variables_hash_max_size = 1024;\n    cmcf->variables_hash_bucket_size = 64;\n\n    return cmcf;\n}\n\n\nstatic char *\nngx_rtmp_core_init_main_conf(ngx_conf_t *cf, void *conf)\n{\n    ngx_rtmp_core_main_conf_t  *cmcf;\n\n    cmcf = conf;\n\n    ngx_conf_init_uint_value(cmcf->server_names_hash_max_size, 512);\n    ngx_conf_init_uint_value(cmcf->server_names_hash_bucket_size,\n                             ngx_cacheline_size);\n    ngx_conf_init_value(cmcf->fast_reload, 0);\n\n    return NGX_CONF_OK;\n}\n\n\nstatic void *\nngx_rtmp_core_create_srv_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_core_srv_conf_t   *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_core_srv_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    if (ngx_array_init(&conf->applications, cf->pool, 4,\n                       sizeof(ngx_rtmp_core_app_conf_t *))\n        != NGX_OK)\n    {\n        return NULL;\n    }\n\n    if (ngx_array_init(&conf->server_names, cf->temp_pool, 4,\n                       sizeof(ngx_rtmp_server_name_t))\n        != NGX_OK)\n    {\n        return NULL;\n    }\n\n    conf->timeout = NGX_CONF_UNSET_MSEC;\n    conf->ping = NGX_CONF_UNSET_MSEC;\n    conf->ping_timeout = NGX_CONF_UNSET_MSEC;\n    conf->so_keepalive = NGX_CONF_UNSET;\n    conf->max_streams = NGX_CONF_UNSET;\n    conf->chunk_size = NGX_CONF_UNSET;\n    conf->ack_window = NGX_CONF_UNSET_UINT;\n    conf->max_message = NGX_CONF_UNSET_SIZE;\n    conf->out_queue = NGX_CONF_UNSET_SIZE;\n    conf->out_cork = NGX_CONF_UNSET_SIZE;\n    conf->play_time_fix = NGX_CONF_UNSET;\n    conf->publish_time_fix = NGX_CONF_UNSET;\n    conf->buflen = NGX_CONF_UNSET_MSEC;\n    conf->busy = NGX_CONF_UNSET;\n\n    return conf;\n}\n\n\nstatic char *\nngx_rtmp_core_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_rtmp_core_srv_conf_t *prev = parent;\n    ngx_rtmp_core_srv_conf_t *conf = child;\n\n    ngx_str_t                   name;\n    ngx_rtmp_server_name_t     *sn;\n\n    ngx_conf_merge_msec_value(conf->timeout, prev->timeout, 60000);\n    ngx_conf_merge_msec_value(conf->ping, prev->ping, 60000);\n    ngx_conf_merge_msec_value(conf->ping_timeout, prev->ping_timeout, 30000);\n\n    ngx_conf_merge_value(conf->so_keepalive, prev->so_keepalive, 0);\n    ngx_conf_merge_value(conf->max_streams, prev->max_streams, 32);\n    ngx_conf_merge_value(conf->chunk_size, prev->chunk_size, 4096);\n    ngx_conf_merge_uint_value(conf->ack_window, prev->ack_window, 5000000);\n    ngx_conf_merge_size_value(conf->max_message, prev->max_message,\n            1 * 1024 * 1024);\n    ngx_conf_merge_size_value(conf->out_queue, prev->out_queue, 2048);\n    ngx_conf_merge_size_value(conf->out_cork, prev->out_cork,\n            conf->out_queue / 8);\n    ngx_conf_merge_value(conf->play_time_fix, prev->play_time_fix, 1);\n    ngx_conf_merge_value(conf->publish_time_fix, prev->publish_time_fix, 1);\n    ngx_conf_merge_msec_value(conf->buflen, prev->buflen, 1000);\n    ngx_conf_merge_value(conf->busy, prev->busy, 0);\n    ngx_conf_merge_str_value(conf->serverid, prev->serverid, \"default\");\n\n    if (prev->pool == NULL) {\n        prev->pool = ngx_create_pool(4096, &cf->cycle->new_log);\n        if (prev->pool == NULL) {\n            return NGX_CONF_ERROR;\n        }\n    }\n\n    conf->pool = prev->pool;\n\n    if (conf->server_names.nelts == 0) {\n        sn = ngx_array_push(&conf->server_names);\n#if (NGX_PCRE)\n        sn->regex = NULL;\n#endif\n        sn->server = conf;\n        ngx_str_set(&sn->name, \"\");\n    }\n\n    sn = conf->server_names.elts;\n    name = sn[0].name;\n\n#if (NGX_PCRE)\n    if (sn->regex) {\n        name.len++;\n        name.data--;\n    } else\n#endif\n    if (name.data[0] == '.') {\n        name.len--;\n        name.data++;\n    }\n\n    conf->server_name.len = name.len;\n    conf->server_name.data = ngx_pstrdup(cf->pool, &name);\n    if (conf->server_name.data == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic void *\nngx_rtmp_core_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_core_app_conf_t   *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_core_app_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    if (ngx_array_init(&conf->applications, cf->pool, 1,\n                       sizeof(ngx_rtmp_core_app_conf_t *))\n        != NGX_OK)\n    {\n        return NULL;\n    }\n\n    conf->hevc_codec = NGX_CONF_UNSET_UINT;\n    conf->merge_frame = NGX_CONF_UNSET_UINT;\n    conf->tcp_nodelay = NGX_CONF_UNSET;\n\n    return conf;\n}\n\n\nstatic char *\nngx_rtmp_core_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_rtmp_core_app_conf_t *prev = parent;\n    ngx_rtmp_core_app_conf_t *conf = child;\n\n    ngx_conf_merge_uint_value(conf->hevc_codec, prev->hevc_codec, 12);\n    ngx_conf_merge_uint_value(conf->merge_frame, prev->merge_frame, 32);\n    ngx_conf_merge_value(conf->tcp_nodelay, prev->tcp_nodelay, 1);\n\n    NGX_RTMP_HEVC_CODEC_ID = conf->hevc_codec;\n\n    return NGX_CONF_OK;\n}\n\n/* nginx rtmp dynamic */\nstatic void *\nngx_rtmp_core_create_srv_dconf(ngx_conf_t *cf)\n{\n    ngx_rtmp_core_srv_dconf_t      *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_core_srv_dconf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    return conf;\n}\n\nstatic char *\nngx_rtmp_core_init_srv_dconf(ngx_conf_t *cf, void *conf)\n{\n    return NGX_CONF_OK;\n}\n\n\nstatic char *\nngx_rtmp_merge_frame(ngx_conf_t *cf, void *post, void *data)\n{\n    ngx_uint_t                 *mfp;\n\n    mfp = data;\n\n    if (*mfp > NGX_RTMP_MAX_MERGE_FRAME) {\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                           \"the merge_frame must be no larger than %ui\",\n                           NGX_RTMP_MAX_MERGE_FRAME);\n        return NGX_CONF_ERROR;\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic char *\nngx_rtmp_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    char                       *rv;\n    void                       *mconf;\n    ngx_uint_t                  m;\n    ngx_conf_t                  pcf;\n    ngx_module_t              **modules;\n    ngx_rtmp_module_t          *module;\n    struct sockaddr_in         *sin;\n    ngx_rtmp_conf_ctx_t        *ctx, *rtmp_ctx;\n    ngx_rtmp_listen_opt_t       lsopt;\n    ngx_rtmp_core_srv_conf_t   *cscf, **cscfp;\n    ngx_rtmp_core_main_conf_t  *cmcf;\n\n    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_conf_ctx_t));\n    if (ctx == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    rtmp_ctx = cf->ctx;\n    ctx->main_conf = rtmp_ctx->main_conf;\n\n    /* the server{}'s srv_conf */\n\n    ctx->srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_rtmp_max_module);\n    if (ctx->srv_conf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    ctx->app_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_rtmp_max_module);\n    if (ctx->app_conf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n#if (nginx_version >= 1009011)\n    modules = cf->cycle->modules;\n#else\n    modules = ngx_modules;\n#endif\n\n    for (m = 0; modules[m]; m++) {\n        if (modules[m]->type != NGX_RTMP_MODULE) {\n            continue;\n        }\n\n        module = modules[m]->ctx;\n\n        if (module->create_srv_conf) {\n            mconf = module->create_srv_conf(cf);\n            if (mconf == NULL) {\n                return NGX_CONF_ERROR;\n            }\n\n            ctx->srv_conf[modules[m]->ctx_index] = mconf;\n        }\n\n        if (module->create_app_conf) {\n            mconf = module->create_app_conf(cf);\n            if (mconf == NULL) {\n                return NGX_CONF_ERROR;\n            }\n\n            ctx->app_conf[modules[m]->ctx_index] = mconf;\n        }\n    }\n\n    /* the server configuration context */\n\n    cscf = ctx->srv_conf[ngx_rtmp_core_module.ctx_index];\n    cscf->ctx = ctx;\n\n    cmcf = ctx->main_conf[ngx_rtmp_core_module.ctx_index];\n\n    cscfp = ngx_array_push(&cmcf->servers);\n    if (cscfp == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    *cscfp = cscf;\n\n    /* parse inside server{} */\n\n    pcf = *cf;\n    cf->ctx = ctx;\n    cf->cmd_type = NGX_RTMP_SRV_CONF;\n\n    rv = ngx_conf_parse(cf, NULL);\n\n    *cf = pcf;\n\n    if (rv == NGX_CONF_OK && !cscf->listen) {\n        /* if listen not configured, set 1935 as default */\n        ngx_memzero(&lsopt, sizeof(ngx_rtmp_listen_opt_t));\n\n        lsopt.sockaddr = ngx_pcalloc(cf->pool, NGX_SOCKADDR_STRLEN);\n        if (lsopt.sockaddr == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n        sin = (struct sockaddr_in *) lsopt.sockaddr;\n\n        sin->sin_family = AF_INET;\n        sin->sin_port = htons(1935);\n        sin->sin_addr.s_addr = INADDR_ANY;\n\n        lsopt.socklen = sizeof(struct sockaddr_in);\n        lsopt.wildcard = 1;\n\n        (void) ngx_sock_ntop(lsopt.sockaddr, lsopt.socklen, lsopt.addr,\n                             NGX_SOCKADDR_STRLEN, 1);\n\n        if (ngx_rtmp_add_listen(cf, cscf, &lsopt) != NGX_OK) {\n            return NGX_CONF_ERROR;\n        }\n    }\n\n    return rv;\n}\n\n\nstatic char *\nngx_rtmp_core_application(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    char                       *rv;\n    ngx_int_t                   i;\n    ngx_str_t                  *value;\n    ngx_conf_t                  save;\n    ngx_module_t              **modules;\n    ngx_rtmp_module_t          *module;\n    ngx_rtmp_conf_ctx_t        *ctx, *pctx;\n    ngx_rtmp_core_srv_conf_t   *cscf;\n    ngx_rtmp_core_app_conf_t   *cacf, **cacfp;\n\n    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_conf_ctx_t));\n    if (ctx == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    pctx = cf->ctx;\n    ctx->main_conf = pctx->main_conf;\n    ctx->srv_conf = pctx->srv_conf;\n\n    ctx->app_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_rtmp_max_module);\n    if (ctx->app_conf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n#if (nginx_version >= 1009011)\n    modules = cf->cycle->modules;\n#else\n    modules = ngx_modules;\n#endif\n\n    for (i = 0; modules[i]; i++) {\n        if (modules[i]->type != NGX_RTMP_MODULE) {\n            continue;\n        }\n\n        module = modules[i]->ctx;\n\n        if (module->create_app_conf) {\n            ctx->app_conf[modules[i]->ctx_index] = module->create_app_conf(cf);\n            if (ctx->app_conf[modules[i]->ctx_index] == NULL) {\n                return NGX_CONF_ERROR;\n            }\n        }\n    }\n\n    cacf = ctx->app_conf[ngx_rtmp_core_module.ctx_index];\n    cacf->app_conf = ctx->app_conf;\n\n    value = cf->args->elts;\n\n    cacf->name = value[1];\n    cscf = pctx->srv_conf[ngx_rtmp_core_module.ctx_index];\n\n    if (cacf->name.len == 1 && cacf->name.data[0] == '*') {  /* default_app */\n        cscf->default_app = cacf;\n    }\n\n    cacfp = ngx_array_push(&cscf->applications);\n    if (cacfp == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    *cacfp = cacf;\n\n    save = *cf;\n    cf->ctx = ctx;\n    cf->cmd_type = NGX_RTMP_APP_CONF;\n\n    rv = ngx_conf_parse(cf, NULL);\n\n    *cf= save;\n\n    return rv;\n}\n\n\nstatic char *\nngx_rtmp_core_listen(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_rtmp_core_srv_conf_t    *cscf = conf;\n\n    ngx_str_t                  *value;\n    ngx_url_t                   u;\n    ngx_uint_t                  i;\n    ngx_rtmp_listen_opt_t       lsopt;\n\n    cscf->listen = 1;\n\n    value = cf->args->elts;\n\n    ngx_memzero(&u, sizeof(ngx_url_t));\n\n    u.url = value[1];\n    u.listen = 1;\n    u.default_port = 1935;\n\n    if (ngx_parse_url(cf->pool, &u) != NGX_OK) {\n        if (u.err) {\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                               \"%s in \\\"%V\\\" of the \\\"listen\\\" directive\",\n                               u.err, &u.url);\n        }\n\n        return NGX_CONF_ERROR;\n    }\n\n    ngx_memzero(&lsopt, sizeof(ngx_rtmp_listen_opt_t));\n\n    lsopt.sockaddr = ngx_pcalloc(cf->pool, NGX_SOCKADDR_STRLEN);\n    if (lsopt.sockaddr == NULL) {\n        return NGX_CONF_ERROR;\n    }\n    ngx_memcpy(lsopt.sockaddr, (u_char *) &u.sockaddr, u.socklen);\n\n    lsopt.socklen = u.socklen;\n    lsopt.wildcard = u.wildcard;\n\n    (void) ngx_sock_ntop(lsopt.sockaddr, lsopt.socklen, lsopt.addr,\n                         NGX_SOCKADDR_STRLEN, 1);\n\n    for (i = 2; i < cf->args->nelts; i++) {\n\n        if (ngx_strcmp(value[i].data, \"default_server\") == 0\n            || ngx_strcmp(value[i].data, \"default\") == 0)\n        {\n            lsopt.default_server = 1;\n            continue;\n        }\n\n        if (ngx_strcmp(value[i].data, \"bind\") == 0) {\n            lsopt.bind = 1;\n            continue;\n        }\n\n        if (ngx_strncmp(value[i].data, \"ipv6only=o\", 10) == 0) {\n#if (NGX_HAVE_INET6 && defined IPV6_V6ONLY)\n            struct sockaddr  *sa;\n\n            sa = lsopt.sockaddr;\n\n            if (sa->sa_family == AF_INET6) {\n\n                if (ngx_strcmp(&value[i].data[10], \"n\") == 0) {\n                    lsopt.ipv6only = 1;\n\n                } else if (ngx_strcmp(&value[i].data[10], \"ff\") == 0) {\n                    lsopt.ipv6only = 0;\n\n                } else {\n                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                       \"invalid ipv6only flags \\\"%s\\\"\",\n                                       &value[i].data[9]);\n                    return NGX_CONF_ERROR;\n                }\n\n                lsopt.bind = 1;\n\n            } else {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                   \"ipv6only is not supported \"\n                                   \"on addr \\\"%s\\\", ignored\", lsopt.addr);\n            }\n\n            continue;\n#else\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                               \"bind ipv6only is not supported \"\n                               \"on this platform\");\n            return NGX_CONF_ERROR;\n#endif\n        }\n\n        if (ngx_strcmp(value[i].data, \"reuseport\") == 0) {\n#if (NGX_HAVE_REUSEPORT)\n            lsopt.reuseport = 1;\n            lsopt.set = 1;\n            lsopt.bind = 1;\n#else\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                               \"reuseport is not supported \"\n                               \"on this platform, ignored\");\n#endif\n            continue;\n        }\n\n        if (ngx_strncmp(value[i].data, \"so_keepalive=\", 13) == 0) {\n\n            if (ngx_strcmp(&value[i].data[13], \"on\") == 0) {\n                lsopt.so_keepalive = 1;\n\n            } else if (ngx_strcmp(&value[i].data[13], \"off\") == 0) {\n                lsopt.so_keepalive = 2;\n\n            } else {\n\n#if (NGX_HAVE_KEEPALIVE_TUNABLE)\n                u_char     *p, *end;\n                ngx_str_t   s;\n\n                end = value[i].data + value[i].len;\n                s.data = value[i].data + 13;\n\n                p = ngx_strlchr(s.data, end, ':');\n                if (p == NULL) {\n                    p = end;\n                }\n\n                if (p > s.data) {\n                    s.len = p - s.data;\n\n                    lsopt.tcp_keepidle = ngx_parse_time(&s, 1);\n                    if (lsopt.tcp_keepidle == (time_t) NGX_ERROR) {\n                        goto invalid_so_keepalive;\n                    }\n                }\n\n                s.data = (p < end) ? (p + 1) : end;\n\n                p = ngx_strlchr(s.data, end, ':');\n                if (p == NULL) {\n                    p = end;\n                }\n\n                if (p > s.data) {\n                    s.len = p - s.data;\n\n                    lsopt.tcp_keepintvl = ngx_parse_time(&s, 1);\n                    if (lsopt.tcp_keepintvl == (time_t) NGX_ERROR) {\n                        goto invalid_so_keepalive;\n                    }\n                }\n\n                s.data = (p < end) ? (p + 1) : end;\n\n                if (s.data < end) {\n                    s.len = end - s.data;\n\n                    lsopt.tcp_keepcnt = ngx_atoi(s.data, s.len);\n                    if (lsopt.tcp_keepcnt == NGX_ERROR) {\n                        goto invalid_so_keepalive;\n                    }\n                }\n\n                if (lsopt.tcp_keepidle == 0 && lsopt.tcp_keepintvl == 0\n                    && lsopt.tcp_keepcnt == 0)\n                {\n                    goto invalid_so_keepalive;\n                }\n\n                lsopt.so_keepalive = 1;\n\n#else\n\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                   \"the \\\"so_keepalive\\\" parameter accepts \"\n                                   \"only \\\"on\\\" or \\\"off\\\" on this platform\");\n                return NGX_CONF_ERROR;\n\n#endif\n            }\n\n            lsopt.bind = 1;\n\n            continue;\n\n#if (NGX_HAVE_KEEPALIVE_TUNABLE)\n        invalid_so_keepalive:\n\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                               \"invalid so_keepalive value: \\\"%s\\\"\",\n                               &value[i].data[13]);\n            return NGX_CONF_ERROR;\n#endif\n        }\n\n        if (ngx_strcmp(value[i].data, \"proxy_protocol\") == 0) {\n            lsopt.proxy_protocol = 1;\n            continue;\n        }\n\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                           \"the invalid \\\"%V\\\" parameter\", &value[i]);\n        return NGX_CONF_ERROR;\n    }\n\n    if (ngx_rtmp_add_listen(cf, cscf, &lsopt) == NGX_OK) {\n        return NGX_CONF_OK;\n    }\n\n    return NGX_CONF_ERROR;\n}\n\nstatic char *\nngx_rtmp_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_rtmp_core_srv_conf_t *cscf = conf;\n\n    u_char                   ch;\n    ngx_str_t               *value;\n    ngx_uint_t               i;\n    ngx_rtmp_server_name_t  *sn;\n\n    value = cf->args->elts;\n\n    for (i = 1; i < cf->args->nelts; i++) {\n\n        ch = value[i].data[0];\n\n        if ((ch == '*' && (value[i].len < 3 || value[i].data[1] != '.'))\n            || (ch == '.' && value[i].len < 2))\n        {\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                               \"server name \\\"%V\\\" is invalid\", &value[i]);\n            return NGX_CONF_ERROR;\n        }\n\n        if (ngx_strchr(value[i].data, '/')) {\n            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,\n                               \"server name \\\"%V\\\" has suspicious symbols\",\n                               &value[i]);\n        }\n\n        sn = ngx_array_push(&cscf->server_names);\n        if (sn == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n#if (NGX_PCRE)\n        sn->regex = NULL;\n#endif\n        sn->server = cscf;\n\n        if (ngx_strcasecmp(value[i].data, (u_char *) \"$hostname\") == 0) {\n            sn->name = cf->cycle->hostname;\n\n        } else {\n            sn->name = value[i];\n        }\n\n        if (value[i].data[0] != '~') {\n            ngx_strlow(sn->name.data, sn->name.data, sn->name.len);\n            continue;\n        }\n\n#if (NGX_PCRE)\n        {\n        u_char               *p;\n        ngx_regex_compile_t   rc;\n        u_char                errstr[NGX_MAX_CONF_ERRSTR];\n\n        if (value[i].len == 1) {\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                               \"empty regex in server name \\\"%V\\\"\", &value[i]);\n            return NGX_CONF_ERROR;\n        }\n\n        value[i].len--;\n        value[i].data++;\n\n        ngx_memzero(&rc, sizeof(ngx_regex_compile_t));\n\n        rc.pattern = value[i];\n        rc.err.len = NGX_MAX_CONF_ERRSTR;\n        rc.err.data = errstr;\n\n        for (p = value[i].data; p < value[i].data + value[i].len; p++) {\n            if (*p >= 'A' && *p <= 'Z') {\n                rc.options = NGX_REGEX_CASELESS;\n                break;\n            }\n        }\n\n        sn->regex = ngx_rtmp_regex_compile(cf, &rc);\n        if (sn->regex == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n        sn->name = value[i];\n        cscf->captures = (rc.captures > 0);\n        }\n#else\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                           \"using regex \\\"%V\\\" \"\n                           \"requires PCRE library\", &value[i]);\n\n        return NGX_CONF_ERROR;\n#endif\n    }\n\n    return NGX_CONF_OK;\n}\n\nstatic ngx_rtmp_addr_conf_t *\nngx_rtmp_get_addr_conf(ngx_listening_t *ls, struct sockaddr *sa, socklen_t len)\n{\n    ngx_uint_t                  i;\n    ngx_rtmp_addr_conf_t       *addr_conf;\n    ngx_rtmp_port_t            *port;\n    struct sockaddr_in         *sin;\n    ngx_rtmp_in_addr_t         *addr;\n#if (NGX_HAVE_INET6)\n    struct sockaddr_in6        *sin6;\n    ngx_rtmp_in6_addr_t        *addr6;\n#endif\n\n    port = ls->servers;\n    addr_conf = NULL;\n\n    if (port->naddrs > 1) {\n        switch (sa->sa_family) {\n#if (NGX_HAVE_INET6)\n        case AF_INET6:\n            sin6 = (struct sockaddr_in6 *) sa;\n\n            addr6 = port->addrs;\n\n            /* the last address is \"*\" */\n\n            for (i = 0; i < port->naddrs - 1; ++i) {\n                if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) {\n                    break;\n                }\n            }\n\n            addr_conf = &addr6[i].conf;\n\n            break;\n#endif\n        default:\n            sin = (struct sockaddr_in *) sa;\n\n            addr = port->addrs;\n\n            /* the last address is \"*\" */\n\n            for (i = 0; i < port->naddrs - 1; ++i) {\n                if (addr[i].addr == sin->sin_addr.s_addr) {\n                    break;\n                }\n            }\n\n            addr_conf = &addr[i].conf;\n\n            break;\n        }\n    } else {\n\n        switch (sa->sa_family) {\n#if (NGX_HAVE_INET6)\n        case AF_INET6:\n            addr6 = port->addrs;\n            addr_conf = &addr6[0].conf;\n            break;\n#endif\n\n        default:\n            addr = port->addrs;\n            addr_conf = &addr[0].conf;\n            break;\n        }\n    }\n\n    return addr_conf;\n}\n\nngx_rtmp_addr_conf_t *\nngx_rtmp_find_related_addr_conf(ngx_cycle_t *cycle, ngx_str_t *addr)\n{\n    ngx_url_t                   u;\n    ngx_listening_t            *ls;\n    ngx_uint_t                  i;\n\n    ngx_memzero(&u, sizeof(ngx_url_t));\n\n    u.url = *addr;\n    u.listen = 1;\n    u.default_port = 0;\n\n    if (ngx_parse_url(cycle->pool, &u) != NGX_OK) {\n        if (u.err) {\n            ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,\n                    \"Relation port err: %V\", addr);\n        }\n\n        return NULL;\n    }\n\n    ls = cycle->listening.elts;\n\n    for (i = 0; i < cycle->listening.nelts; ++i, ++ls) {\n\n        if (ls->handler == ngx_rtmp_init_connection\n            && ls->socklen == u.socklen\n                && ngx_memcmp(ls->sockaddr, (u_char *) &u.sockaddr,\n                    u.socklen) == 0)\n        {\n            return ngx_rtmp_get_addr_conf(ls, &u.sockaddr.sockaddr, u.socklen);\n        }\n    }\n\n    ngx_log_error(NGX_LOG_EMERG, cycle->log, 0,\n            \"Can not find relation port: %V\", addr);\n\n    return NULL;\n}\n\n\nngx_int_t\nngx_rtmp_arg(ngx_rtmp_session_t *s, u_char *name, size_t len, ngx_str_t *value)\n{\n    u_char                     *p, *last;\n\n    if (s->pargs.len == 0) {\n        return NGX_DECLINED;\n    }\n\n    p = s->pargs.data;\n    last = p + s->pargs.len;\n\n    for ( /* void */ ; p < last; p++) {\n\n        /* we need '=' after name, so drop one char from last */\n\n        p = ngx_strlcasestrn(p, last - 1, name, len - 1);\n\n        if (p == NULL) {\n            return NGX_DECLINED;\n        }\n\n        if ((p == s->pargs.data || *(p - 1) == '&') && *(p + len) == '=') {\n\n            value->data = p + len + 1;\n\n            p = ngx_strlchr(p, last, '&');\n\n            if (p == NULL) {\n                p = s->pargs.data + s->pargs.len;\n            }\n\n            value->len = p - value->data;\n\n            return NGX_OK;\n        }\n    }\n\n    return NGX_DECLINED;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_core_preconfiguration(ngx_conf_t *cf)\n{\n    return ngx_rtmp_variables_add_core_vars(cf);\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_dynamic.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_dynamic.h\"\n\n\nstatic void *ngx_rtmp_dynamic_create_conf(ngx_conf_t *cf);\nstatic void *ngx_rtmp_dynamic_core_create_main_conf(ngx_conf_t *cf);\nstatic char *ngx_rtmp_dynamic_core_init_main_conf(ngx_conf_t *cf, void *conf);\nstatic void *ngx_rtmp_dynamic_core_create_srv_conf(ngx_conf_t *cf);\nstatic char *ngx_rtmp_dynamic_core_init_srv_conf(ngx_conf_t *cf, void *conf);\nstatic void *ngx_rtmp_dynamic_core_create_app_conf(ngx_conf_t *cf);\nstatic char *ngx_rtmp_dynamic_core_init_app_conf(ngx_conf_t *cf, void *conf);\n\nstatic char *ngx_rtmp_dynamic_block(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\nstatic char *ngx_rtmp_dynamic_core_server(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\nstatic char *ngx_rtmp_dynamic_core_server_name(ngx_conf_t *cf,\n       ngx_command_t *cmd, void *conf);\nstatic char *ngx_rtmp_dynamic_core_application(ngx_conf_t *cf,\n       ngx_command_t *cmd, void *conf);\n\n\ntypedef struct {\n    ngx_str_t                           name;\n    ngx_map_node_t                      node;\n\n    void                              **app_conf;\n} ngx_rtmp_dynamic_core_app_conf_t;\n\ntypedef struct {\n    /* array of the ngx_rtmp_server_name_t, \"server_name\" directive */\n    ngx_array_t                         server_names;\n\n    ngx_rtmp_dynamic_core_app_conf_t   *default_app;\n    ngx_map_t                           app_conf;\n\n    void                              **srv_conf;\n} ngx_rtmp_dynamic_core_srv_conf_t;\n\ntypedef struct {\n#if (NGX_PCRE)\n    ngx_dynamic_regex_t                *regex;\n#endif\n    ngx_rtmp_dynamic_core_srv_conf_t   *server;   /* virtual name server conf */\n    ngx_str_t                           name;\n} ngx_rtmp_dynamic_server_name_t;\n\n\ntypedef struct {\n    /* ngx_rtmp_dynamic_srv_conf_t */\n    ngx_array_t                         servers;\n\n    ngx_uint_t                          server_names_hash_max_size;\n    ngx_uint_t                          server_names_hash_bucket_size;\n\n    /* the default server configuration for this address:port */\n    ngx_rtmp_dynamic_core_srv_conf_t   *default_server;\n\n    ngx_hash_combined_t                 names;\n\n#if (NGX_PCRE)\n    ngx_uint_t                          nregex;\n    ngx_rtmp_dynamic_server_name_t     *regex;\n#endif\n} ngx_rtmp_dynamic_core_main_conf_t;\n\n\ntypedef struct {\n    void                              **main_conf;\n} ngx_rtmp_dynamic_conf_t;\n\n\nstatic ngx_core_module_t  ngx_rtmp_dynamic_module_ctx = {\n    ngx_string(\"rtmp_dynamic\"),\n    NULL,\n    NULL\n};\n\nstatic ngx_command_t  ngx_rtmp_dynamic_dcommands[] = {\n\n    { ngx_string(\"rtmp\"),\n      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,\n      ngx_rtmp_dynamic_block,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\nstatic ngx_dynamic_core_module_t  ngx_rtmp_dynamic_module_dctx = {\n    ngx_string(\"rtmp_dynamic\"),\n    ngx_rtmp_dynamic_create_conf,\n    NULL\n};\n\nngx_module_t  ngx_rtmp_dynamic_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_dynamic_module_ctx,       /* module context */\n    NULL,                               /* module directives */\n    NGX_CORE_MODULE,                    /* module type */\n    NULL,                               /* init master */\n    NULL,                               /* init module */\n    NULL,                               /* init process */\n    NULL,                               /* init thread */\n    NULL,                               /* exit thread */\n    NULL,                               /* exit process */\n    NULL,                               /* exit master */\n    (uintptr_t) &ngx_rtmp_dynamic_module_dctx, /* module dynamic context */\n    (uintptr_t) ngx_rtmp_dynamic_dcommands, /* module dynamic directives */\n    NGX_MODULE_V1_DYNAMIC_PADDING\n};\n\n\nstatic ngx_rtmp_module_t  ngx_rtmp_dynamic_core_module_ctx = {\n    NULL,                               /* preconfiguration */\n    NULL,                               /* postconfiguration */\n\n    NULL,                               /* create main configuration */\n    NULL,                               /* init main configuration */\n\n    NULL,                               /* create server configuration */\n    NULL,                               /* merge server configuration */\n\n    NULL,                               /* create application configuration */\n    NULL                                /* merge application configuration */\n};\n\n\nstatic ngx_command_t  ngx_rtmp_dynamic_core_dcommands[] = {\n\n    { ngx_string(\"server_names_hash_max_size\"),\n      NGX_RTMP_MAIN_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      0,\n      offsetof(ngx_rtmp_dynamic_core_main_conf_t, server_names_hash_max_size),\n      NULL },\n\n    { ngx_string(\"server_names_hash_bucket_size\"),\n      NGX_RTMP_MAIN_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      0,\n      offsetof(ngx_rtmp_dynamic_core_main_conf_t,\n               server_names_hash_bucket_size),\n      NULL },\n\n    { ngx_string(\"server\"),\n      NGX_RTMP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,\n      ngx_rtmp_dynamic_core_server,\n      0,\n      0,\n      NULL },\n\n    { ngx_string(\"server_name\"),\n      NGX_RTMP_SRV_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_dynamic_core_server_name,\n      0,\n      0,\n      NULL },\n\n    { ngx_string(\"application\"),\n      NGX_RTMP_SRV_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE12,\n      ngx_rtmp_dynamic_core_application,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_dynamic_module_t  ngx_rtmp_dynamic_core_module_dctx = {\n    ngx_rtmp_dynamic_core_create_main_conf, /* create main configuration */\n    ngx_rtmp_dynamic_core_init_main_conf,   /* init main configuration */\n\n    ngx_rtmp_dynamic_core_create_srv_conf,  /* create srv configuration */\n    ngx_rtmp_dynamic_core_init_srv_conf,    /* init srv configuration */\n\n    ngx_rtmp_dynamic_core_create_app_conf,  /* create app configuration */\n    ngx_rtmp_dynamic_core_init_app_conf     /* init app configuration */\n};\n\n\nngx_module_t  ngx_rtmp_dynamic_core_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_dynamic_core_module_ctx,      /* module context */\n    NULL,                                   /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    (uintptr_t) &ngx_rtmp_dynamic_core_module_dctx, /* module dynamic context */\n    (uintptr_t) ngx_rtmp_dynamic_core_dcommands, /* module dynamic directives */\n    NGX_MODULE_V1_DYNAMIC_PADDING\n};\n\n\nstatic void *\nngx_rtmp_dynamic_create_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_dynamic_conf_t                *rdccf;\n\n    rdccf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_dynamic_conf_t));\n    if (rdccf == NULL) {\n        return NULL;\n    }\n\n    return rdccf;\n}\n\nstatic void *\nngx_rtmp_dynamic_core_create_main_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_dynamic_core_main_conf_t      *rdcmcf;\n\n    rdcmcf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_dynamic_core_main_conf_t));\n    if (rdcmcf == NULL) {\n        return NULL;\n    }\n\n    if (ngx_array_init(&rdcmcf->servers, cf->pool, 4,\n        sizeof(ngx_rtmp_dynamic_core_srv_conf_t *)) != NGX_OK)\n    {\n        return NULL;\n    }\n\n    rdcmcf->server_names_hash_max_size = NGX_CONF_UNSET_UINT;\n    rdcmcf->server_names_hash_bucket_size = NGX_CONF_UNSET_UINT;\n\n    return rdcmcf;\n}\n\nstatic char *\nngx_rtmp_dynamic_core_init_main_conf(ngx_conf_t *cf, void *conf)\n{\n    ngx_rtmp_dynamic_core_main_conf_t      *rdcmcf;\n\n    rdcmcf = conf;\n\n    ngx_conf_init_uint_value(rdcmcf->server_names_hash_max_size, 512);\n    ngx_conf_init_uint_value(rdcmcf->server_names_hash_bucket_size,\n                             ngx_cacheline_size);\n\n    return NGX_CONF_OK;\n}\n\nstatic void *\nngx_rtmp_dynamic_core_create_srv_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_dynamic_core_srv_conf_t       *rdcscf;\n\n    rdcscf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_dynamic_core_srv_conf_t));\n    if (rdcscf == NULL) {\n        return NULL;\n    }\n\n    if (ngx_array_init(&rdcscf->server_names, cf->pool, 4,\n        sizeof(ngx_rtmp_dynamic_server_name_t)) != NGX_OK)\n    {\n        return NULL;\n    }\n\n    return rdcscf;\n}\n\nstatic char *\nngx_rtmp_dynamic_core_init_srv_conf(ngx_conf_t *cf, void *conf)\n{\n    return NGX_CONF_OK;\n}\n\nstatic void *\nngx_rtmp_dynamic_core_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_dynamic_core_app_conf_t       *rdcacf;\n\n    rdcacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_dynamic_core_app_conf_t));\n    if (rdcacf == NULL) {\n        return NULL;\n    }\n\n    return rdcacf;\n}\n\nstatic char *\nngx_rtmp_dynamic_core_init_app_conf(ngx_conf_t *cf, void *conf)\n{\n    return NGX_CONF_OK;\n}\n\nstatic ngx_int_t\nngx_rtmp_dynamic_core_find_application(ngx_rtmp_session_t *s,\n        ngx_rtmp_dynamic_core_srv_conf_t *rdcscf,\n        ngx_rtmp_dynamic_core_app_conf_t **rdcacf)\n{\n    ngx_map_node_t                         *node;\n\n    node = ngx_map_find(&rdcscf->app_conf, (intptr_t) &s->app);\n    if (node == NULL) {\n        *rdcacf = rdcscf->default_app;\n    } else {\n        *rdcacf = (ngx_rtmp_dynamic_core_app_conf_t *)\n            ((char *) node - offsetof(ngx_rtmp_dynamic_core_app_conf_t, node));\n    }\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_rtmp_dynamic_core_init_virtual_servers(ngx_conf_t *cf,\n        ngx_rtmp_dynamic_conf_t *hdcf)\n{\n    ngx_rtmp_dynamic_core_main_conf_t      *rdcmcf;\n    ngx_rtmp_dynamic_core_srv_conf_t      **rdcscfp;\n    ngx_hash_init_t                         hash;\n    ngx_hash_keys_arrays_t                  ha;\n    ngx_rtmp_dynamic_server_name_t         *name;\n    ngx_uint_t                              s, n;\n    ngx_int_t                               rc;\n#if (NGX_PCRE)\n    ngx_uint_t                              regex, i;\n\n    regex = 0;\n#endif\n\n    rdcmcf = hdcf->main_conf[ngx_rtmp_dynamic_core_module.ctx_index];\n\n    ngx_memzero(&ha, sizeof(ngx_hash_keys_arrays_t));\n\n    ha.temp_pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);\n    if (ha.temp_pool == NULL) {\n        return NGX_ERROR;\n    }\n\n    ha.pool = cf->pool;\n\n    if (ngx_hash_keys_array_init(&ha, NGX_HASH_LARGE) != NGX_OK) {\n        goto failed;\n    }\n\n    rdcscfp = rdcmcf->servers.elts;\n    rdcmcf->default_server = rdcscfp[0];\n\n    for (s = 0; s < rdcmcf->servers.nelts; ++s) {\n\n        name = rdcscfp[s]->server_names.elts;\n\n        for (n = 0; n < rdcscfp[s]->server_names.nelts; ++n) {\n#if (NGX_PCRE)\n            if (name[n].regex) {\n                ++regex;\n                continue;\n            }\n#endif\n\n            rc = ngx_hash_add_key(&ha, &name[n].name, name[n].server,\n                                  NGX_HASH_WILDCARD_KEY);\n            if (rc == NGX_ERROR) {\n                return NGX_ERROR;\n            }\n\n            if (rc == NGX_DECLINED) {\n                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,\n                        \"invalid server name or wildcard \\\"%V\\\"\",\n                        &name[n].name);\n                return NGX_ERROR;\n            }\n\n            if (rc == NGX_BUSY) {\n                ngx_log_error(NGX_LOG_WARN, cf->log, 0,\n                        \"conflicting server name \\\"%V\\\", ignored\",\n                        &name[n].name);\n            }\n        }\n    }\n\n    hash.key = ngx_hash_key_lc;\n    hash.max_size = rdcmcf->server_names_hash_max_size;\n    hash.bucket_size = rdcmcf->server_names_hash_bucket_size;\n    hash.name = \"rtmp_dynamic_server_names_hash\";\n    hash.pool = cf->pool;\n\n    if (ha.keys.nelts) {\n        hash.hash = &rdcmcf->names.hash;\n        hash.temp_pool = NULL;\n\n        if (ngx_hash_init(&hash, ha.keys.elts, ha.keys.nelts) != NGX_OK) {\n            goto failed;\n        }\n    }\n\n    if (ha.dns_wc_head.nelts) {\n\n        ngx_qsort(ha.dns_wc_head.elts, (size_t) ha.dns_wc_head.nelts,\n                  sizeof(ngx_hash_key_t), ngx_dynamic_cmp_dns_wildcards);\n\n        hash.hash = NULL;\n        hash.temp_pool = ha.temp_pool;\n\n        if (ngx_hash_wildcard_init(&hash, ha.dns_wc_head.elts,\n            ha.dns_wc_head.nelts) != NGX_OK)\n        {\n            goto failed;\n        }\n\n        rdcmcf->names.wc_head = (ngx_hash_wildcard_t *) hash.hash;\n    }\n\n    if (ha.dns_wc_tail.nelts) {\n\n        ngx_qsort(ha.dns_wc_tail.elts, (size_t) ha.dns_wc_tail.nelts,\n                  sizeof(ngx_hash_key_t), ngx_dynamic_cmp_dns_wildcards);\n\n        hash.hash = NULL;\n        hash.temp_pool = ha.temp_pool;\n\n        if (ngx_hash_wildcard_init(&hash, ha.dns_wc_tail.elts,\n            ha.dns_wc_tail.nelts) != NGX_OK)\n        {\n            goto failed;\n        }\n\n        rdcmcf->names.wc_tail = (ngx_hash_wildcard_t *) hash.hash;\n\n    }\n\n    ngx_destroy_pool(ha.temp_pool);\n\n#if (NGX_PCRE)\n    if (regex == 0) {\n        return NGX_OK;\n    }\n\n    rdcmcf->nregex = regex;\n    rdcmcf->regex = ngx_pcalloc(cf->pool,\n                                regex * sizeof(ngx_rtmp_dynamic_server_name_t));\n    if (rdcmcf->regex == NULL) {\n        return NGX_ERROR;\n    }\n\n    i = 0;\n\n    for (s = 0; s < rdcmcf->servers.nelts; ++s) {\n\n        name = rdcscfp[s]->server_names.elts;\n\n        for (n = 0; n < rdcscfp[s]->server_names.nelts; ++n) {\n            if (name[n].regex) {\n                rdcmcf->regex[i++] = name[n];\n            }\n        }\n    }\n#endif\n\n    return NGX_OK;\n\nfailed:\n    ngx_destroy_pool(ha.temp_pool);\n\n    return NGX_ERROR;\n}\n\nstatic ngx_int_t\nngx_rtmp_dynamic_core_find_virtual_server(ngx_str_t *server,\n        ngx_rtmp_dynamic_core_main_conf_t *rdcmcf,\n        ngx_rtmp_dynamic_core_srv_conf_t **rdcscfp)\n{\n    ngx_rtmp_dynamic_core_srv_conf_t       *rdcscf;\n\n    rdcscf = ngx_hash_find_combined(&rdcmcf->names,\n                                    ngx_hash_key(server->data, server->len),\n                                    server->data, server->len);\n\n    if (rdcscf) {\n        *rdcscfp = rdcscf;\n        return NGX_OK;\n    }\n\n#if (NGX_PCRE)\n\n    if (server->len && rdcmcf->nregex) {\n        ngx_int_t                           n;\n        ngx_uint_t                          i;\n        ngx_rtmp_dynamic_server_name_t     *sn;\n\n        sn = rdcmcf->regex;\n\n        for (i = 0; i < rdcmcf->nregex; ++i) {\n\n            n = ngx_regex_exec(sn[i].regex->regex, server, NULL, 0);\n\n            if (n == NGX_REGEX_NO_MATCHED) {\n                continue;\n            }\n\n            if (n >= 0) {\n                *rdcscfp = sn[i].server;\n                return NGX_OK;\n            }\n\n            return NGX_ERROR;\n        }\n    }\n#endif\n\n    return NGX_DECLINED;\n}\n\nstatic char *\nngx_rtmp_dynamic_core_application(ngx_conf_t *cf, ngx_command_t *cmd,\n        void *conf)\n{\n    ngx_rtmp_dynamic_module_t              *module;\n    ngx_rtmp_dynamic_core_app_conf_t       *rdcacf;\n    ngx_rtmp_dynamic_core_srv_conf_t       *rdcscf;\n    ngx_conf_t                              pcf;\n    void                                   *mconf, **app_conf;\n    ngx_uint_t                              i, ci;\n    ngx_str_t                              *value;\n    char                                   *rv = NULL;\n\n    rdcscf = conf;\n\n    /* app_conf is temp cause hdclcf does not created now */\n    app_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_rtmp_max_module);\n    if (app_conf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    for (i = 0; cf->cycle->modules[i]; ++i) {\n        if (cf->cycle->modules[i]->type != NGX_RTMP_MODULE) {\n            continue;\n        }\n\n        module = (ngx_rtmp_dynamic_module_t *)\n                    cf->cycle->modules[i]->spare_hook0;\n\n        if (module == NULL) {\n            continue;\n        }\n\n        if (module->create_app_conf) {\n            mconf = module->create_app_conf(cf);\n            if (mconf == NULL) {\n                return NGX_CONF_ERROR;\n            }\n\n            app_conf[cf->cycle->modules[i]->ctx_index] = mconf;\n        }\n    }\n\n    rdcacf = app_conf[ngx_rtmp_dynamic_core_module.ctx_index];\n    rdcacf->app_conf = app_conf;\n\n    value = cf->args->elts;\n\n    rdcacf->name = value[1];\n    if (rdcacf->name.len == 1 && rdcacf->name.data[0] == '*') { /* default */\n        if (rdcscf->default_app) {\n            return \"is duplicate\";\n        }\n\n        rdcscf->default_app = rdcacf;\n    } else {\n        rdcacf->node.raw_key = (intptr_t) &rdcacf->name;\n        ngx_map_insert(&rdcscf->app_conf, &rdcacf->node, 0);\n    }\n\n    pcf = *cf;\n    cf->ctx = rdcacf->app_conf;\n    cf->cmd_type = NGX_RTMP_APP_CONF;\n\n    if (ngx_dynamic_conf_parse(cf, 0) != NGX_OK) {\n        goto failed;\n    }\n\n    for (i = 0; cf->cycle->modules[i]; ++i) {\n        if (cf->cycle->modules[i]->type != NGX_RTMP_MODULE) {\n            continue;\n        }\n\n        module = (ngx_rtmp_dynamic_module_t *)\n                    cf->cycle->modules[i]->spare_hook0;\n        ci = cf->cycle->modules[i]->ctx_index;\n        if (module == NULL) {\n            continue;\n        }\n\n        if (module->init_app_conf) {\n            rv = module->init_app_conf(cf, rdcacf->app_conf[ci]);\n            if (rv != NGX_CONF_OK) {\n                goto failed;\n            }\n        }\n    }\n\n    *cf = pcf;\n\n    return NGX_CONF_OK;\n\nfailed:\n    *cf = pcf;\n\n    if (rv) {\n        return rv;\n    }\n\n    return NGX_CONF_ERROR;\n}\n\nstatic char *\nngx_rtmp_dynamic_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd,\n        void *conf)\n{\n    ngx_rtmp_dynamic_core_srv_conf_t       *rdcscf;\n    u_char                                  ch;\n    ngx_str_t                              *value;\n    ngx_uint_t                              i;\n    ngx_rtmp_dynamic_server_name_t         *sn;\n\n    rdcscf = conf;\n\n    value = cf->args->elts;\n\n    for (i = 1; i < cf->args->nelts; i++) {\n\n        ch = value[i].data[0];\n\n        if ((ch == '*' && (value[i].len < 3 || value[i].data[1] != '.'))\n            || (ch == '.' && value[i].len < 2))\n        {\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                               \"server name \\\"%V\\\" is invalid\", &value[i]);\n            return NGX_CONF_ERROR;\n        }\n\n        if (ngx_strchr(value[i].data, '/')) {\n            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,\n                               \"server name \\\"%V\\\" has suspicious symbols\",\n                               &value[i]);\n        }\n\n        sn = ngx_array_push(&rdcscf->server_names);\n        if (sn == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n#if (NGX_PCRE)\n        sn->regex = NULL;\n#endif\n        sn->server = rdcscf;\n\n        if (ngx_strcasecmp(value[i].data, (u_char *) \"$hostname\") == 0) {\n            sn->name = cf->cycle->hostname;\n\n        } else {\n            sn->name = value[i];\n        }\n\n        if (value[i].data[0] != '~') {\n            ngx_strlow(sn->name.data, sn->name.data, sn->name.len);\n            continue;\n        }\n\n#if (NGX_PCRE)\n        {\n        u_char                             *p;\n        ngx_regex_compile_t                 rc;\n        u_char                              errstr[NGX_MAX_CONF_ERRSTR];\n\n        if (value[i].len == 1) {\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                               \"empty regex in server name \\\"%V\\\"\", &value[i]);\n            return NGX_CONF_ERROR;\n        }\n\n        value[i].len--;\n        value[i].data++;\n\n        ngx_memzero(&rc, sizeof(ngx_regex_compile_t));\n\n        rc.pattern = value[i];\n        rc.err.len = NGX_MAX_CONF_ERRSTR;\n        rc.err.data = errstr;\n\n        for (p = value[i].data; p < value[i].data + value[i].len; p++) {\n            if (*p >= 'A' && *p <= 'Z') {\n                rc.options = NGX_REGEX_CASELESS;\n                break;\n            }\n        }\n\n        sn->regex = ngx_dynamic_regex_compile(cf, &rc);\n        if (sn->regex == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n        sn->name = value[i];\n        }\n#else\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                           \"using regex \\\"%V\\\" \"\n                           \"requires PCRE library\", &value[i]);\n\n        return NGX_CONF_ERROR;\n#endif\n    }\n\n    return NGX_CONF_OK;\n}\n\nstatic char *\nngx_rtmp_dynamic_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_rtmp_dynamic_module_t              *module;\n    ngx_rtmp_dynamic_core_main_conf_t      *rdcmcf;\n    ngx_rtmp_dynamic_core_srv_conf_t       *rdcscf, **rdcscfp;\n    ngx_conf_t                              pcf;\n    void                                   *mconf, **srv_conf;\n    ngx_uint_t                              i, ci;\n    char                                   *rv = NULL;\n\n    rdcmcf = conf;\n\n    /* srv_conf is temp cause hdcscf does not created now */\n    srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_rtmp_max_module);\n    if (srv_conf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    for (i = 0; cf->cycle->modules[i]; ++i) {\n        if (cf->cycle->modules[i]->type != NGX_RTMP_MODULE) {\n            continue;\n        }\n\n        module = (ngx_rtmp_dynamic_module_t *)\n                    cf->cycle->modules[i]->spare_hook0;\n        if (module == NULL) {\n            continue;\n        }\n\n        if (module->create_srv_conf) {\n            mconf = module->create_srv_conf(cf);\n            if (mconf == NULL) {\n                return NGX_CONF_ERROR;\n            }\n\n            srv_conf[cf->cycle->modules[i]->ctx_index] = mconf;\n        }\n    }\n\n    rdcscf = srv_conf[ngx_rtmp_dynamic_core_module.ctx_index];\n    rdcscf->srv_conf = srv_conf;\n    ngx_map_init(&rdcscf->app_conf, ngx_map_hash_str, ngx_cmp_str);\n\n    /* save hdcscf into hdcmcf */\n    rdcscfp = ngx_array_push(&rdcmcf->servers);\n    if (rdcscfp == NULL) {\n        return NGX_CONF_ERROR;\n    }\n    *rdcscfp = rdcscf;\n\n    pcf = *cf;\n    cf->ctx = rdcscf->srv_conf;\n    cf->cmd_type = NGX_RTMP_SRV_CONF;\n\n    if (ngx_dynamic_conf_parse(cf, 0) != NGX_OK) {\n        goto failed;\n    }\n\n    for (i = 0; cf->cycle->modules[i]; ++i) {\n        if (cf->cycle->modules[i]->type != NGX_RTMP_MODULE) {\n            continue;\n        }\n\n        module = (ngx_rtmp_dynamic_module_t *)\n                    cf->cycle->modules[i]->spare_hook0;\n        ci = cf->cycle->modules[i]->ctx_index;\n        if (module == NULL) {\n            continue;\n        }\n\n        if (module->init_srv_conf) {\n            rv = module->init_srv_conf(cf, rdcscf->srv_conf[ci]);\n            if (rv != NGX_CONF_OK) {\n                goto failed;\n            }\n        }\n    }\n\n    *cf = pcf;\n\n    return NGX_CONF_OK;\n\nfailed:\n    *cf = pcf;\n\n    if (rv) {\n        return rv;\n    }\n\n    return NGX_CONF_ERROR;\n}\n\nstatic char *\nngx_rtmp_dynamic_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_rtmp_dynamic_conf_t                *rdccf;\n    ngx_rtmp_dynamic_module_t              *module;\n    ngx_conf_t                              pcf;\n    ngx_uint_t                              i, ci;\n    char                                   *rv = NULL;\n\n    rdccf = conf;\n\n    /* create main_conf ctx */\n    rdccf->main_conf = ngx_pcalloc(cf->pool, sizeof(void *)\n                                   * ngx_rtmp_max_module);\n    if (rdccf->main_conf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    /* create http dynamic conf for all http module */\n    for (i = 0; cf->cycle->modules[i]; ++i) {\n        if (cf->cycle->modules[i]->type != NGX_RTMP_MODULE) {\n            continue;\n        }\n\n        module = (ngx_rtmp_dynamic_module_t *)\n                    cf->cycle->modules[i]->spare_hook0;\n        ci = cf->cycle->modules[i]->ctx_index;\n\n        if (module == NULL) {\n            continue;\n        }\n\n        if (module->create_main_conf) {\n            rdccf->main_conf[ci] = module->create_main_conf(cf);\n            if (rdccf->main_conf[ci] == NULL) {\n                return NGX_CONF_ERROR;\n            }\n        }\n    }\n\n    /* save conf for recovery */\n    pcf = *cf;\n\n    cf->ctx = rdccf->main_conf;\n    cf->module_type = NGX_RTMP_MODULE;\n    cf->cmd_type = NGX_RTMP_MAIN_CONF;\n\n    if (ngx_dynamic_conf_parse(cf, 0) != NGX_OK) {\n        goto failed;\n    }\n\n    for (i = 0; cf->cycle->modules[i]; ++i) {\n        if (cf->cycle->modules[i]->type != NGX_RTMP_MODULE) {\n            continue;\n        }\n\n        module = (ngx_rtmp_dynamic_module_t *)\n                    cf->cycle->modules[i]->spare_hook0;\n        ci = cf->cycle->modules[i]->ctx_index;\n\n        if (module == NULL) {\n            continue;\n        }\n\n        if (module->init_main_conf) {\n            rv = module->init_main_conf(cf, rdccf->main_conf[ci]);\n            if (rv != NGX_CONF_OK) {\n                goto failed;\n            }\n        }\n    }\n\n    if (ngx_rtmp_dynamic_core_init_virtual_servers(cf, rdccf) != NGX_OK) {\n        goto failed;\n    }\n\n    *cf = pcf;\n\n    return NGX_CONF_OK;\n\nfailed:\n    *cf = pcf;\n\n    if (rv) {\n        return rv;\n    }\n\n    return NGX_CONF_ERROR;\n}\n\n\n/* interface from here */\n\nvoid *\nngx_rtmp_get_module_main_dconf(ngx_rtmp_session_t *s, ngx_module_t *m)\n{\n    ngx_rtmp_dynamic_conf_t                *rdcf;\n\n    rdcf = ngx_get_dconf(&ngx_rtmp_dynamic_module);\n    if (rdcf == NULL || rdcf->main_conf == NULL) {\n        return NULL;\n    }\n\n    return rdcf->main_conf[m->ctx_index];\n}\n\nvoid *\nngx_rtmp_get_module_srv_dconf(ngx_rtmp_session_t *s, ngx_module_t *m)\n{\n    ngx_rtmp_dynamic_core_main_conf_t      *rdcmcf;\n    ngx_rtmp_dynamic_core_srv_conf_t       *rdcscf;\n    ngx_int_t                               rc;\n\n    rdcmcf = ngx_rtmp_get_module_main_dconf(s, &ngx_rtmp_dynamic_core_module);\n    if (rdcmcf == NULL) {\n        return NULL;\n    }\n\n    rc = ngx_rtmp_dynamic_core_find_virtual_server(&s->domain, rdcmcf, &rdcscf);\n    switch (rc) {\n    case NGX_ERROR:\n        return NULL;\n    case NGX_DECLINED:  /* virtual server not found */\n        return rdcmcf->default_server->srv_conf[m->ctx_index];\n    default:\n        return rdcscf->srv_conf[m->ctx_index];\n    }\n}\n\nvoid *\nngx_rtmp_get_module_app_dconf(ngx_rtmp_session_t *s, ngx_module_t *m)\n{\n    ngx_rtmp_dynamic_core_srv_conf_t       *rdcscf;\n    ngx_rtmp_dynamic_core_app_conf_t       *rdcacf;\n    ngx_int_t                               rc;\n\n    rdcscf = ngx_rtmp_get_module_srv_dconf(s, &ngx_rtmp_dynamic_core_module);\n    if (rdcscf == NULL) {\n        return NULL;\n    }\n\n    rdcacf = NULL;\n    rc = ngx_rtmp_dynamic_core_find_application(s, rdcscf, &rdcacf);\n    if (rc == NGX_ERROR) {\n        return NULL;\n    }\n\n    if (rdcacf) {\n        return rdcacf->app_conf[m->ctx_index];\n    }\n\n    return NULL;\n}\n\nvoid\nngx_rmtp_get_serverid_by_domain(ngx_str_t *serverid, ngx_str_t *domain)\n{\n    ngx_rtmp_dynamic_conf_t                *rdcf;\n    ngx_rtmp_dynamic_core_main_conf_t      *rdcmcf;\n    ngx_rtmp_dynamic_core_srv_conf_t       *rdcscf;\n    ngx_rtmp_core_srv_dconf_t              *rcsdcf;\n\n    rdcf = ngx_get_dconf(&ngx_rtmp_dynamic_module);\n    if (rdcf == NULL || rdcf->main_conf) {\n        goto notfound;\n    }\n\n    rdcmcf = rdcf->main_conf[ngx_rtmp_dynamic_core_module.ctx_index];\n    if (rdcmcf == NULL) {\n        goto notfound;\n    }\n\n    ngx_rtmp_dynamic_core_find_virtual_server(domain, rdcmcf, &rdcscf);\n    if (rdcscf && rdcscf->srv_conf) {\n        rcsdcf = rdcscf->srv_conf[ngx_rtmp_core_module.ctx_index];\n        if (rcsdcf && rcsdcf->serverid.len) {\n            *serverid = rcsdcf->serverid;\n            return;\n        }\n    }\n\nnotfound:\n    *serverid = *domain;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_dynamic.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_RTMP_DYNAMIC_H_INCLUDED_\n#define _NGX_RTMP_DYNAMIC_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_map.h\"\n#include \"ngx_dynamic_conf.h\"\n#include \"ngx_rtmp.h\"\n\n\ntypedef struct {\n    void       *(*create_main_conf)(ngx_conf_t *cf);\n    char       *(*init_main_conf)(ngx_conf_t *cf, void *conf);\n\n    void       *(*create_srv_conf)(ngx_conf_t *cf);\n    char       *(*init_srv_conf)(ngx_conf_t *cf, void *conf);\n\n    void       *(*create_app_conf)(ngx_conf_t *cf);\n    char       *(*init_app_conf)(ngx_conf_t *cf, void *conf);\n} ngx_rtmp_dynamic_module_t;\n\n\nvoid *ngx_rtmp_get_module_main_dconf(ngx_rtmp_session_t *s, ngx_module_t *m);\nvoid *ngx_rtmp_get_module_srv_dconf(ngx_rtmp_session_t *s, ngx_module_t *m);\nvoid *ngx_rtmp_get_module_app_dconf(ngx_rtmp_session_t *s, ngx_module_t *m);\n\nvoid  ngx_rmtp_get_serverid_by_domain(ngx_str_t *serverid, ngx_str_t *domain);\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_eval.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp_eval.h\"\n\n\n#define NGX_RTMP_EVAL_BUFLEN    16\n\n\nstatic void\nngx_rtmp_eval_session_str(void *ctx, ngx_rtmp_eval_t *e, ngx_str_t *ret)\n{\n    *ret = *(ngx_str_t *) ((u_char *) ctx + e->offset);\n}\n\n\nstatic void\nngx_rtmp_eval_connection_str(void *ctx, ngx_rtmp_eval_t *e, ngx_str_t *ret)\n{\n    ngx_rtmp_session_t  *s = ctx;\n\n    *ret = *(ngx_str_t *) ((u_char *) s->connection + e->offset);\n}\n\n\nngx_rtmp_eval_t ngx_rtmp_eval_session[] = {\n\n    { ngx_string(\"app\"),\n      ngx_rtmp_eval_session_str,\n      offsetof(ngx_rtmp_session_t, app) },\n\n    { ngx_string(\"flashver\"),\n      ngx_rtmp_eval_session_str,\n      offsetof(ngx_rtmp_session_t, flashver) },\n\n    { ngx_string(\"swfurl\"),\n      ngx_rtmp_eval_session_str,\n      offsetof(ngx_rtmp_session_t, swf_url) },\n\n    { ngx_string(\"tcurl\"),\n      ngx_rtmp_eval_session_str,\n      offsetof(ngx_rtmp_session_t, tc_url) },\n\n    { ngx_string(\"pageurl\"),\n      ngx_rtmp_eval_session_str,\n      offsetof(ngx_rtmp_session_t, page_url) },\n\n    { ngx_string(\"addr\"),\n      ngx_rtmp_eval_connection_str,\n      offsetof(ngx_connection_t, addr_text) },\n\n    ngx_rtmp_null_eval\n};\n\n\nstatic void\nngx_rtmp_eval_append(ngx_buf_t *b, void *data, size_t len, ngx_log_t *log)\n{\n    size_t  buf_len;\n\n    if (b->last + len > b->end) {\n        buf_len = 2 * (b->last - b->pos) + len;\n\n        b->start = ngx_alloc(buf_len, log);\n        if (b->start == NULL) {\n            return;\n        }\n\n        b->last = ngx_cpymem(b->start, b->pos, b->last - b->pos);\n        b->pos = b->start;\n        b->end = b->start + buf_len;\n    }\n\n    b->last = ngx_cpymem(b->last, data, len);\n}\n\n\nstatic void\nngx_rtmp_eval_append_var(void *ctx, ngx_buf_t *b, ngx_rtmp_eval_t **e,\n    ngx_str_t *name, ngx_log_t *log)\n{\n    ngx_uint_t          k;\n    ngx_str_t           v;\n    ngx_rtmp_eval_t    *ee;\n\n    for (; *e; ++e) {\n        for (k = 0, ee = *e; ee->handler; ++k, ++ee) {\n            if (ee->name.len == name->len &&\n                ngx_memcmp(ee->name.data, name->data, name->len) == 0)\n            {\n                ee->handler(ctx, ee, &v);\n                ngx_rtmp_eval_append(b, v.data, v.len, log);\n            }\n        }\n    }\n}\n\n\nngx_int_t\nngx_rtmp_eval(void *ctx, ngx_str_t *in, ngx_rtmp_eval_t **e, ngx_str_t *out,\n    ngx_log_t *log)\n{\n    u_char      c, *p;\n    ngx_str_t   name;\n    ngx_buf_t   b;\n    ngx_uint_t  n;\n\n    enum {\n        NORMAL,\n        ESCAPE,\n        NAME,\n        SNAME\n    } state = NORMAL;\n\n    b.pos = b.last = b.start = ngx_alloc(NGX_RTMP_EVAL_BUFLEN, log);\n    if (b.pos == NULL) {\n        return NGX_ERROR;\n    }\n\n    b.end = b.pos + NGX_RTMP_EVAL_BUFLEN;\n    name.data = NULL;\n\n    for (n = 0; n < in->len; ++n) {\n        p = &in->data[n];\n        c = *p;\n\n        switch (state) {\n            case SNAME:\n                if (c != '}') {\n                    continue;\n                }\n\n                name.len = p - name.data;\n                ngx_rtmp_eval_append_var(ctx, &b, e, &name, log);\n\n                state = NORMAL;\n\n                continue;\n\n            case NAME:\n                if (c == '{' && name.data == p) {\n                    ++name.data;\n                    state = SNAME;\n                    continue;\n                }\n                if ((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {\n                    continue;\n                }\n\n                name.len = p - name.data;\n                ngx_rtmp_eval_append_var(ctx, &b, e, &name, log);\n                switch (c) {\n                    case '$':\n                        name.data = p + 1;\n                        state = NAME;\n                        continue;\n                    case '\\\\':\n                        state = ESCAPE;\n                        continue;\n                }\n\n                ngx_rtmp_eval_append(&b, &c, 1, log);\n                state = NORMAL;\n                break;\n\n            case NORMAL:\n                switch (c) {\n                    case '$':\n                        name.data = p + 1;\n                        state = NAME;\n                        continue;\n                    case '\\\\':\n                        state = ESCAPE;\n                        continue;\n                }\n                ngx_rtmp_eval_append(&b, &c, 1, log);\n                state = NORMAL;\n                break;\n\n            case ESCAPE:\n                ngx_rtmp_eval_append(&b, &c, 1, log);\n                state = NORMAL;\n                break;\n\n        }\n    }\n\n    if (state == NAME) {\n        p = &in->data[n];\n        name.len = p - name.data;\n        ngx_rtmp_eval_append_var(ctx, &b, e, &name, log);\n    }\n\n    c = 0;\n    ngx_rtmp_eval_append(&b, &c, 1, log);\n\n    out->data = b.pos;\n    out->len  = b.last - b.pos - 1;\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_eval_streams(ngx_str_t *in)\n{\n#if !(NGX_WIN32)\n    ngx_int_t   mode, create, v, close_src;\n    ngx_fd_t    dst, src;\n    u_char     *path;\n\n    path = in->data;\n\n    while (*path >= '0' && *path <= '9') {\n        path++;\n    }\n\n    switch ((char) *path) {\n\n        case '>':\n\n            v = (path == in->data ? 1 : ngx_atoi(in->data, path - in->data));\n            if (v == NGX_ERROR) {\n                return NGX_ERROR;\n            }\n\n            dst = (ngx_fd_t) v;\n            mode = NGX_FILE_WRONLY;\n            create = NGX_FILE_TRUNCATE;\n            path++;\n\n            if (*path == (u_char) '>') {\n                mode = NGX_FILE_APPEND;\n                create = NGX_FILE_CREATE_OR_OPEN;\n                path++;\n            }\n\n            break;\n\n        case '<':\n\n            v = (path == in->data ? 0 : ngx_atoi(in->data, path - in->data));\n            if (v == NGX_ERROR) {\n                return NGX_ERROR;\n            }\n\n            dst = (ngx_fd_t) v;\n            mode = NGX_FILE_RDONLY;\n            create = NGX_FILE_OPEN;\n            path++;\n\n            break;\n\n        default:\n\n            return NGX_DONE;\n    }\n\n    if (*path == (u_char) '&') {\n\n        path++;\n        v = ngx_atoi(path, in->data + in->len - path);\n        if (v == NGX_ERROR) {\n            return NGX_ERROR;\n        }\n        src = (ngx_fd_t) v;\n        close_src = 0;\n\n    } else {\n\n        src = ngx_open_file(path, mode, create, NGX_FILE_DEFAULT_ACCESS);\n        if (src == NGX_INVALID_FILE) {\n            return NGX_ERROR;\n        }\n        close_src = 1;\n\n    }\n\n    if (src == dst) {\n        return NGX_OK;\n    }\n\n    dup2(src, dst);\n\n    if (close_src) {\n        ngx_close_file(src);\n    }\n    return NGX_OK;\n\n#else\n    return NGX_DONE;\n#endif\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_eval.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#ifndef _NGX_RTMP_EVAL_H_INCLUDED_\n#define _NGX_RTMP_EVAL_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n\n\ntypedef struct ngx_rtmp_eval_s ngx_rtmp_eval_t;\n\n\ntypedef void (* ngx_rtmp_eval_pt)(void *ctx, ngx_rtmp_eval_t *e,\n                                  ngx_str_t *ret);\n\n\nstruct ngx_rtmp_eval_s {\n    ngx_str_t               name;\n    ngx_rtmp_eval_pt        handler;\n    ngx_uint_t              offset;\n};\n\n\n#define ngx_rtmp_null_eval  { ngx_null_string, NULL, 0 }\n\n\n/* standard session eval variables */\nextern ngx_rtmp_eval_t      ngx_rtmp_eval_session[];\n\n\nngx_int_t ngx_rtmp_eval(void *ctx, ngx_str_t *in, ngx_rtmp_eval_t **e,\n    ngx_str_t *out, ngx_log_t *log);\n\n\nngx_int_t ngx_rtmp_eval_streams(ngx_str_t *in);\n\n\n#endif /* _NGX_RTMP_EVAL_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_exec_module.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp_cmd_module.h\"\n#include \"ngx_rtmp_eval.h\"\n#include \"ngx_poold.h\"\n#include <stdlib.h>\n\n#ifdef NGX_LINUX\n#include <unistd.h>\n#endif\n\n\n#if !(NGX_WIN32)\nstatic ngx_rtmp_publish_pt              next_publish;\nstatic ngx_rtmp_play_pt                 next_play;\nstatic ngx_rtmp_close_stream_pt         next_close_stream;\n#endif\n\n\nstatic ngx_int_t ngx_rtmp_exec_init_process(ngx_cycle_t *cycle);\nstatic ngx_int_t ngx_rtmp_exec_postconfiguration(ngx_conf_t *cf);\nstatic void * ngx_rtmp_exec_create_main_conf(ngx_conf_t *cf);\nstatic char * ngx_rtmp_exec_init_main_conf(ngx_conf_t *cf, void *conf);\nstatic void * ngx_rtmp_exec_create_app_conf(ngx_conf_t *cf);\nstatic char * ngx_rtmp_exec_merge_app_conf(ngx_conf_t *cf,\n       void *parent, void *child);\n/*static char * ngx_rtmp_exec_block(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);*/\nstatic char * ngx_rtmp_exec_conf(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\nstatic char *ngx_rtmp_exec_kill_signal(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\n\n\n#define NGX_RTMP_EXEC_RESPAWN           0x01\n#define NGX_RTMP_EXEC_KILL              0x02\n\n\n#define NGX_RTMP_EXEC_PUBLISHING        0x01\n#define NGX_RTMP_EXEC_PLAYING           0x02\n\n\nenum {\n    NGX_RTMP_EXEC_PUSH,\n    NGX_RTMP_EXEC_PULL,\n\n    NGX_RTMP_EXEC_PUBLISH,\n    NGX_RTMP_EXEC_PUBLISH_DONE,\n    NGX_RTMP_EXEC_PLAY,\n    NGX_RTMP_EXEC_PLAY_DONE,\n    NGX_RTMP_EXEC_RECORD_DONE,\n\n    NGX_RTMP_EXEC_MAX,\n\n    NGX_RTMP_EXEC_STATIC\n};\n\n\ntypedef struct {\n    ngx_str_t                           id;\n    ngx_uint_t                          type;\n    ngx_str_t                           cmd;\n    ngx_array_t                         args;       /* ngx_str_t */\n    ngx_array_t                         names;\n} ngx_rtmp_exec_conf_t;\n\n\ntypedef struct {\n    ngx_rtmp_exec_conf_t               *conf;\n    ngx_log_t                          *log;\n    ngx_rtmp_eval_t                   **eval;\n    void                               *eval_ctx;\n    unsigned                            active:1;\n    unsigned                            managed:1;\n    ngx_pid_t                           pid;\n    ngx_pid_t                          *save_pid;\n    int                                 pipefd;\n    ngx_connection_t                    dummy_conn;  /*needed by ngx_xxx_event*/\n    ngx_event_t                         read_evt, write_evt;\n    ngx_event_t                         respawn_evt;\n    ngx_msec_t                          respawn_timeout;\n    ngx_int_t                           kill_signal;\n} ngx_rtmp_exec_t;\n\n\ntypedef struct {\n    ngx_array_t                         static_conf; /* ngx_rtmp_exec_conf_t */\n    ngx_array_t                         static_exec; /* ngx_rtmp_exec_t */\n    ngx_msec_t                          respawn_timeout;\n    ngx_int_t                           kill_signal;\n    ngx_log_t                          *log;\n} ngx_rtmp_exec_main_conf_t;\n\n\ntypedef struct ngx_rtmp_exec_pull_ctx_s  ngx_rtmp_exec_pull_ctx_t;\n\nstruct ngx_rtmp_exec_pull_ctx_s {\n    ngx_pool_t                         *pool;\n    ngx_uint_t                          counter;\n    ngx_str_t                           name;\n    ngx_str_t                           app;\n    ngx_array_t                         pull_exec;   /* ngx_rtmp_exec_t */\n    ngx_rtmp_exec_pull_ctx_t           *next;\n};\n\n\ntypedef struct {\n    ngx_int_t                           active;\n    ngx_array_t                         conf[NGX_RTMP_EXEC_MAX];\n                                                     /* ngx_rtmp_exec_conf_t */\n    ngx_flag_t                          respawn;\n    ngx_flag_t                          options;\n    ngx_uint_t                          nbuckets;\n    ngx_rtmp_exec_pull_ctx_t          **pull;\n} ngx_rtmp_exec_app_conf_t;\n\n\ntypedef struct {\n    ngx_uint_t                          flags;\n    ngx_str_t                           path;     /* /tmp/rec/myfile-123.flv */\n    ngx_str_t                           filename; /* myfile-123.flv */\n    ngx_str_t                           basename; /* myfile-123 */\n    ngx_str_t                           dirname;  /* /tmp/rec */\n    ngx_str_t                           recorder;\n    u_char                              name[NGX_RTMP_MAX_NAME];\n    u_char                              args[NGX_RTMP_MAX_ARGS];\n    u_char                              starttime[NGX_RTMP_MAX_NAME];\n    ngx_array_t                         push_exec;   /* ngx_rtmp_exec_t */\n    ngx_rtmp_exec_pull_ctx_t           *pull;\n} ngx_rtmp_exec_ctx_t;\n\n\n#if !(NGX_WIN32)\nstatic void ngx_rtmp_exec_respawn(ngx_event_t *ev);\nstatic ngx_int_t ngx_rtmp_exec_kill(ngx_rtmp_exec_t *e, ngx_int_t kill_signal);\nstatic ngx_int_t ngx_rtmp_exec_run(ngx_rtmp_exec_t *e);\n#endif\n\n\nstatic ngx_command_t  ngx_rtmp_exec_commands[] = {\n/*\n    { ngx_string(\"exec_block\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS|NGX_CONF_TAKE1,\n      ngx_rtmp_exec_block,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n*/\n    { ngx_string(\"exec\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_exec_conf,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_exec_app_conf_t, conf) +\n      NGX_RTMP_EXEC_PUSH * sizeof(ngx_array_t),\n      NULL },\n\n    { ngx_string(\"exec_push\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_exec_conf,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_exec_app_conf_t, conf) +\n      NGX_RTMP_EXEC_PUSH * sizeof(ngx_array_t),\n      NULL },\n\n    { ngx_string(\"exec_pull\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_exec_conf,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_exec_app_conf_t, conf) +\n      NGX_RTMP_EXEC_PULL * sizeof(ngx_array_t),\n      NULL },\n\n    { ngx_string(\"exec_publish\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_exec_conf,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_exec_app_conf_t, conf) +\n      NGX_RTMP_EXEC_PUBLISH * sizeof(ngx_array_t),\n      NULL },\n\n    { ngx_string(\"exec_publish_done\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_exec_conf,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_exec_app_conf_t, conf) +\n      NGX_RTMP_EXEC_PUBLISH_DONE * sizeof(ngx_array_t),\n      NULL },\n\n    { ngx_string(\"exec_play\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_exec_conf,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_exec_app_conf_t, conf) +\n      NGX_RTMP_EXEC_PLAY * sizeof(ngx_array_t),\n      NULL },\n\n    { ngx_string(\"exec_play_done\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_exec_conf,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_exec_app_conf_t, conf) +\n      NGX_RTMP_EXEC_PLAY_DONE * sizeof(ngx_array_t),\n      NULL },\n\n    { ngx_string(\"exec_record_done\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_RTMP_REC_CONF|\n                         NGX_CONF_1MORE,\n      ngx_rtmp_exec_conf,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_exec_app_conf_t, conf) +\n      NGX_RTMP_EXEC_RECORD_DONE * sizeof(ngx_array_t),\n      NULL },\n\n    { ngx_string(\"exec_static\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_exec_conf,\n      NGX_RTMP_MAIN_CONF_OFFSET,\n      offsetof(ngx_rtmp_exec_main_conf_t, static_conf),\n      NULL },\n\n    { ngx_string(\"respawn\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_exec_app_conf_t, respawn),\n      NULL },\n\n    { ngx_string(\"respawn_timeout\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_MAIN_CONF_OFFSET,\n      offsetof(ngx_rtmp_exec_main_conf_t, respawn_timeout),\n      NULL },\n\n    { ngx_string(\"exec_kill_signal\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_rtmp_exec_kill_signal,\n      NGX_RTMP_MAIN_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"exec_options\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_exec_app_conf_t, options),\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_rtmp_exec_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_rtmp_exec_postconfiguration,        /* postconfiguration */\n    ngx_rtmp_exec_create_main_conf,         /* create main configuration */\n    ngx_rtmp_exec_init_main_conf,           /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    ngx_rtmp_exec_create_app_conf,          /* create app configuration */\n    ngx_rtmp_exec_merge_app_conf            /* merge app configuration */\n};\n\n\nngx_module_t  ngx_rtmp_exec_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_exec_module_ctx,              /* module context */\n    ngx_rtmp_exec_commands,                 /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    ngx_rtmp_exec_init_process,             /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void\nngx_rtmp_exec_eval_ctx_cstr(void *sctx, ngx_rtmp_eval_t *e, ngx_str_t *ret)\n{\n    ngx_rtmp_session_t  *s = sctx;\n\n    ngx_rtmp_exec_ctx_t  *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_exec_module);\n    if (ctx == NULL) {\n        ret->len = 0;\n        return;\n    }\n\n    ret->data = (u_char *) ctx + e->offset;\n    ret->len = ngx_strlen(ret->data);\n}\n\n\nstatic void\nngx_rtmp_exec_eval_ctx_str(void *sctx, ngx_rtmp_eval_t *e, ngx_str_t *ret)\n{\n    ngx_rtmp_session_t  *s = sctx;\n\n    ngx_rtmp_exec_ctx_t  *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_exec_module);\n    if (ctx == NULL) {\n        ret->len = 0;\n        return;\n    }\n\n    *ret = * (ngx_str_t *) ((u_char *) ctx + e->offset);\n}\n\n\nstatic void\nngx_rtmp_exec_eval_pctx_str(void *ctx, ngx_rtmp_eval_t *e, ngx_str_t *ret)\n{\n    *ret = *(ngx_str_t *) ((u_char *) ctx + e->offset);\n}\n\n\nstatic ngx_rtmp_eval_t ngx_rtmp_exec_push_specific_eval[] = {\n\n    { ngx_string(\"name\"),\n      ngx_rtmp_exec_eval_ctx_cstr,\n      offsetof(ngx_rtmp_exec_ctx_t, name) },\n\n    { ngx_string(\"args\"),\n      ngx_rtmp_exec_eval_ctx_cstr,\n      offsetof(ngx_rtmp_exec_ctx_t, args) },\n\n    ngx_rtmp_null_eval\n};\n\n\nstatic ngx_rtmp_eval_t * ngx_rtmp_exec_push_eval[] = {\n    ngx_rtmp_eval_session,\n    ngx_rtmp_exec_push_specific_eval,\n    NULL\n};\n\n\nstatic ngx_rtmp_eval_t ngx_rtmp_exec_pull_specific_eval[] = {\n\n    { ngx_string(\"name\"),\n      ngx_rtmp_exec_eval_pctx_str,\n      offsetof(ngx_rtmp_exec_pull_ctx_t, name) },\n\n    { ngx_string(\"app\"),\n      ngx_rtmp_exec_eval_pctx_str,\n      offsetof(ngx_rtmp_exec_pull_ctx_t, app) },\n\n    ngx_rtmp_null_eval\n};\n\n\nstatic ngx_rtmp_eval_t * ngx_rtmp_exec_pull_eval[] = {\n    ngx_rtmp_exec_pull_specific_eval,\n    NULL\n};\n\n\nstatic ngx_rtmp_eval_t ngx_rtmp_exec_event_specific_eval[] = {\n\n    { ngx_string(\"name\"),\n      ngx_rtmp_exec_eval_ctx_cstr,\n      offsetof(ngx_rtmp_exec_ctx_t, name) },\n\n    { ngx_string(\"args\"),\n      ngx_rtmp_exec_eval_ctx_cstr,\n      offsetof(ngx_rtmp_exec_ctx_t, args) },\n\n    { ngx_string(\"path\"),\n      ngx_rtmp_exec_eval_ctx_str,\n      offsetof(ngx_rtmp_exec_ctx_t, path) },\n\n    { ngx_string(\"filename\"),\n      ngx_rtmp_exec_eval_ctx_str,\n      offsetof(ngx_rtmp_exec_ctx_t, filename) },\n\n    { ngx_string(\"basename\"),\n      ngx_rtmp_exec_eval_ctx_str,\n      offsetof(ngx_rtmp_exec_ctx_t, basename) },\n\n    { ngx_string(\"dirname\"),\n      ngx_rtmp_exec_eval_ctx_str,\n      offsetof(ngx_rtmp_exec_ctx_t, dirname) },\n\n    { ngx_string(\"recorder\"),\n      ngx_rtmp_exec_eval_ctx_str,\n      offsetof(ngx_rtmp_exec_ctx_t, recorder) },\n\n    { ngx_string(\"starttime\"),\n      ngx_rtmp_exec_eval_ctx_cstr,\n      offsetof(ngx_rtmp_exec_ctx_t, starttime) },\n\n    ngx_rtmp_null_eval\n};\n\n\nstatic ngx_rtmp_eval_t * ngx_rtmp_exec_event_eval[] = {\n    ngx_rtmp_eval_session,\n    ngx_rtmp_exec_event_specific_eval,\n    NULL\n};\n\n\nstatic void *\nngx_rtmp_exec_create_main_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_exec_main_conf_t     *emcf;\n\n    emcf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_exec_main_conf_t));\n    if (emcf == NULL) {\n        return NULL;\n    }\n\n    emcf->respawn_timeout = NGX_CONF_UNSET_MSEC;\n    emcf->kill_signal = NGX_CONF_UNSET;\n\n    if (ngx_array_init(&emcf->static_conf, cf->pool, 1,\n                       sizeof(ngx_rtmp_exec_conf_t)) != NGX_OK)\n    {\n        return NULL;\n    }\n\n    return emcf;\n}\n\n\nstatic char *\nngx_rtmp_exec_init_main_conf(ngx_conf_t *cf, void *conf)\n{\n    ngx_rtmp_exec_main_conf_t  *emcf = conf;\n    ngx_rtmp_exec_conf_t       *ec;\n    ngx_rtmp_exec_t            *e;\n    ngx_uint_t                  n;\n\n    if (emcf->respawn_timeout == NGX_CONF_UNSET_MSEC) {\n        emcf->respawn_timeout = 5000;\n    }\n\n#if !(NGX_WIN32)\n    if (emcf->kill_signal == NGX_CONF_UNSET) {\n        emcf->kill_signal = SIGKILL;\n    }\n#endif\n\n    if (ngx_array_init(&emcf->static_exec, cf->pool,\n                       emcf->static_conf.nelts,\n                       sizeof(ngx_rtmp_exec_t)) != NGX_OK)\n    {\n        return NGX_CONF_ERROR;\n    }\n\n    e = ngx_array_push_n(&emcf->static_exec, emcf->static_conf.nelts);\n    if (e == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    emcf->log = &cf->cycle->new_log;\n\n    ec = emcf->static_conf.elts;\n\n    for (n = 0; n < emcf->static_conf.nelts; n++, e++, ec++) {\n        ngx_memzero(e, sizeof(*e));\n        e->conf = ec;\n        e->managed = 1;\n        e->log = emcf->log;\n        e->respawn_timeout = emcf->respawn_timeout;\n        e->kill_signal = emcf->kill_signal;\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic void *\nngx_rtmp_exec_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_exec_app_conf_t      *eacf;\n\n    eacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_exec_app_conf_t));\n    if (eacf == NULL) {\n        return NULL;\n    }\n\n    eacf->respawn = NGX_CONF_UNSET;\n    eacf->options = NGX_CONF_UNSET;\n    eacf->nbuckets = NGX_CONF_UNSET_UINT;\n\n    return eacf;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_exec_merge_confs(ngx_array_t *conf, ngx_array_t *prev)\n{\n    size_t                 n;\n    ngx_rtmp_exec_conf_t  *ec, *pec;\n\n    if (prev->nelts == 0) {\n        return NGX_OK;\n    }\n\n    if (conf->nelts == 0) {\n        *conf = *prev;\n        return NGX_OK;\n    }\n\n    ec = ngx_array_push_n(conf, prev->nelts);\n    if (ec == NULL) {\n        return NGX_ERROR;\n    }\n\n    pec = prev->elts;\n    for (n = 0; n < prev->nelts; n++, ec++, pec++) {\n        *ec = *pec;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic char *\nngx_rtmp_exec_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_rtmp_exec_app_conf_t   *prev = parent;\n    ngx_rtmp_exec_app_conf_t   *conf = child;\n\n    ngx_uint_t  n;\n\n    ngx_conf_merge_value(conf->respawn, prev->respawn, 1);\n    ngx_conf_merge_uint_value(conf->nbuckets, prev->nbuckets, 1024);\n\n    for (n = 0; n < NGX_RTMP_EXEC_MAX; n++) {\n        if (ngx_rtmp_exec_merge_confs(&conf->conf[n], &prev->conf[n]) != NGX_OK)\n        {\n            return NGX_CONF_ERROR;\n        }\n\n        if (conf->conf[n].nelts) {\n            conf->active = 1;\n            prev->active = 1;\n        }\n    }\n\n    if (conf->conf[NGX_RTMP_EXEC_PULL].nelts > 0) {\n        conf->pull = ngx_pcalloc(cf->pool, sizeof(void *) * conf->nbuckets);\n        if (conf->pull == NULL) {\n            return NGX_CONF_ERROR;\n        }\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_exec_init_process(ngx_cycle_t *cycle)\n{\n#if !(NGX_WIN32)\n    ngx_rtmp_core_main_conf_t  *cmcf = ngx_rtmp_core_main_conf;\n    ngx_rtmp_core_srv_conf_t  **cscf;\n    ngx_rtmp_conf_ctx_t        *cctx;\n    ngx_rtmp_exec_main_conf_t  *emcf;\n    ngx_rtmp_exec_t            *e;\n    ngx_uint_t                  n;\n\n    if (cmcf == NULL || cmcf->servers.nelts == 0) {\n        return NGX_OK;\n    }\n\n    /* execs are always started by the first worker */\n    if (ngx_process_slot) {\n        return NGX_OK;\n    }\n\n    cscf = cmcf->servers.elts;\n    cctx = (*cscf)->ctx;\n    emcf = cctx->main_conf[ngx_rtmp_exec_module.ctx_index];\n\n    /* FreeBSD note:\n     * When worker is restarted, child process (ffmpeg) will\n     * not be terminated if it's connected to another\n     * (still alive) worker. That leads to starting\n     * another instance of exec_static process.\n     * Need to kill previously started processes.\n     *\n     * On Linux \"prctl\" syscall is used to kill child\n     * when nginx worker is terminated.\n     */\n\n    e = emcf->static_exec.elts;\n    for (n = 0; n < emcf->static_exec.nelts; ++n, ++e) {\n        e->respawn_evt.data = e;\n        e->respawn_evt.log = e->log;\n        e->respawn_evt.handler = ngx_rtmp_exec_respawn;\n        ngx_post_event((&e->respawn_evt), &ngx_rtmp_init_queue);\n    }\n#endif\n\n    return NGX_OK;\n}\n\n\n#if !(NGX_WIN32)\nstatic void\nngx_rtmp_exec_respawn(ngx_event_t *ev)\n{\n    ngx_rtmp_exec_run((ngx_rtmp_exec_t *) ev->data);\n}\n\n\nstatic void\nngx_rtmp_exec_child_dead(ngx_event_t *ev)\n{\n    ngx_connection_t   *dummy_conn = ev->data;\n    ngx_rtmp_exec_t    *e;\n\n    e = dummy_conn->data;\n\n    ngx_log_error(NGX_LOG_INFO, e->log, 0,\n                  \"exec: child %ui exited; %s\", (ngx_int_t) e->pid,\n                  e->respawn_timeout == NGX_CONF_UNSET_MSEC ? \"respawning\" :\n                                                               \"ignoring\");\n\n    ngx_rtmp_exec_kill(e, 0);\n\n    if (e->respawn_timeout == NGX_CONF_UNSET_MSEC) {\n        return;\n    }\n\n    if (e->respawn_timeout == 0) {\n        ngx_rtmp_exec_run(e);\n        return;\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, e->log, 0,\n                   \"exec: shedule respawn %Mmsec\", e->respawn_timeout);\n\n    e->respawn_evt.data = e;\n    e->respawn_evt.log = e->log;\n    e->respawn_evt.handler = ngx_rtmp_exec_respawn;\n\n    ngx_add_timer(&e->respawn_evt, e->respawn_timeout);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_exec_kill(ngx_rtmp_exec_t *e, ngx_int_t kill_signal)\n{\n    if (e->respawn_evt.timer_set) {\n        ngx_del_timer(&e->respawn_evt);\n    }\n\n    if (e->read_evt.active) {\n        ngx_del_event(&e->read_evt, NGX_READ_EVENT, 0);\n    }\n\n    if (e->active == 0) {\n        return NGX_OK;\n    }\n\n    ngx_log_error(NGX_LOG_INFO, e->log, 0,\n                  \"exec: terminating child %ui\", (ngx_int_t) e->pid);\n\n    e->active = 0;\n    close(e->pipefd);\n    if (e->save_pid) {\n        *e->save_pid = NGX_INVALID_PID;\n    }\n\n    if (kill_signal == 0) {\n        return NGX_OK;\n    }\n\n    if (kill(e->pid, kill_signal) == -1) {\n        ngx_log_error(NGX_LOG_INFO, e->log, ngx_errno,\n                      \"exec: kill failed pid=%i\", (ngx_int_t) e->pid);\n    } else {\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, e->log, 0,\n                       \"exec: killed pid=%i\", (ngx_int_t) e->pid);\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_exec_run(ngx_rtmp_exec_t *e)\n{\n    int                     fd, ret, maxfd, pipefd[2];\n    char                  **args, **arg_out;\n    ngx_pid_t               pid;\n    ngx_str_t              *arg_in, a;\n    ngx_uint_t              n;\n    ngx_rtmp_exec_conf_t   *ec;\n\n    ec = e->conf;\n\n    ngx_log_error(NGX_LOG_INFO, e->log, 0,\n                  \"exec: starting %s child '%V'\",\n                  e->managed ? \"managed\" : \"unmanaged\", &ec->cmd);\n\n    pipefd[0] = -1;\n    pipefd[1] = -1;\n\n    if (e->managed) {\n\n        if (e->active) {\n            ngx_log_debug1(NGX_LOG_DEBUG_RTMP, e->log, 0,\n                           \"exec: already active '%V'\", &ec->cmd);\n            return NGX_OK;\n        }\n\n        if (pipe(pipefd) == -1) {\n            ngx_log_error(NGX_LOG_INFO, e->log, ngx_errno,\n                          \"exec: pipe failed\");\n            return NGX_ERROR;\n        }\n\n        /* make pipe write end survive through exec */\n\n        ret = fcntl(pipefd[1], F_GETFD);\n\n        if (ret != -1) {\n            ret &= ~FD_CLOEXEC;\n            ret = fcntl(pipefd[1], F_SETFD, ret);\n        }\n\n        if (ret == -1) {\n\n            close(pipefd[0]);\n            close(pipefd[1]);\n\n            ngx_log_error(NGX_LOG_INFO, e->log, ngx_errno,\n                          \"exec: fcntl failed\");\n\n            return NGX_ERROR;\n        }\n    }\n\n    pid = fork();\n\n    switch (pid) {\n\n        case -1:\n\n            /* failure */\n\n            if (pipefd[0] != -1) {\n                close(pipefd[0]);\n            }\n\n            if (pipefd[1] != -1) {\n                close(pipefd[1]);\n            }\n\n            ngx_log_error(NGX_LOG_INFO, e->log, ngx_errno,\n                          \"exec: fork failed\");\n\n            return NGX_ERROR;\n\n        case 0:\n\n            /* child */\n\n#if (NGX_LINUX)\n            if (e->managed) {\n                prctl(PR_SET_PDEATHSIG, e->kill_signal, 0, 0, 0);\n            }\n#endif\n\n            /* close all descriptors but pipe write end */\n\n            maxfd = sysconf(_SC_OPEN_MAX);\n            for (fd = 0; fd < maxfd; ++fd) {\n                if (fd == pipefd[1]) {\n                    continue;\n                }\n\n                close(fd);\n            }\n\n            fd = open(\"/dev/null\", O_RDWR);\n\n            dup2(fd, STDIN_FILENO);\n            dup2(fd, STDOUT_FILENO);\n            dup2(fd, STDERR_FILENO);\n\n            args = ngx_alloc((ec->args.nelts + 2) * sizeof(char *), e->log);\n            if (args == NULL) {\n                exit(1);\n            }\n\n            arg_in = ec->args.elts;\n            arg_out = args;\n            *arg_out++ = (char *) ec->cmd.data;\n\n            for (n = 0; n < ec->args.nelts; n++, ++arg_in) {\n\n                if (e->eval == NULL) {\n                    a = *arg_in;\n                } else {\n                    ngx_rtmp_eval(e->eval_ctx, arg_in, e->eval, &a, e->log);\n                }\n\n                if (ngx_rtmp_eval_streams(&a) != NGX_DONE) {\n                    continue;\n                }\n\n                *arg_out++ = (char *) a.data;\n            }\n\n            *arg_out = NULL;\n\n#if (NGX_DEBUG)\n            {\n                char    **p;\n\n                for (p = args; *p; p++) {\n                    ngx_write_fd(STDERR_FILENO, \"'\", 1);\n                    ngx_write_fd(STDERR_FILENO, *p, strlen(*p));\n                    ngx_write_fd(STDERR_FILENO, \"' \", 2);\n                }\n\n                ngx_write_fd(STDERR_FILENO, \"\\n\", 1);\n            }\n#endif\n\n            if (execvp((char *) ec->cmd.data, args) == -1) {\n                char    *msg;\n\n                msg = strerror(errno);\n\n                ngx_write_fd(STDERR_FILENO, \"execvp error: \", 14);\n                ngx_write_fd(STDERR_FILENO, msg, strlen(msg));\n                ngx_write_fd(STDERR_FILENO, \"\\n\", 1);\n\n                exit(1);\n            }\n\n            break;\n\n        default:\n\n            /* parent */\n\n            if (pipefd[1] != -1) {\n                close(pipefd[1]);\n            }\n\n            if (pipefd[0] != -1) {\n\n                e->active = 1;\n                e->pid = pid;\n                e->pipefd = pipefd[0];\n\n                if (e->save_pid) {\n                    *e->save_pid = pid;\n                }\n\n                e->dummy_conn.fd = e->pipefd;\n                e->dummy_conn.data = e;\n                e->dummy_conn.read  = &e->read_evt;\n                e->dummy_conn.write = &e->write_evt;\n                e->read_evt.data  = &e->dummy_conn;\n                e->write_evt.data = &e->dummy_conn;\n\n                e->read_evt.log = e->log;\n                e->read_evt.handler = ngx_rtmp_exec_child_dead;\n\n                if (ngx_add_event(&e->read_evt, NGX_READ_EVENT, 0) != NGX_OK) {\n                    ngx_log_error(NGX_LOG_INFO, e->log, ngx_errno,\n                                  \"exec: failed to add child control event\");\n                }\n            }\n\n            ngx_log_debug2(NGX_LOG_DEBUG_RTMP, e->log, 0,\n                           \"exec: child '%V' started pid=%i\",\n                           &ec->cmd, (ngx_int_t) pid);\n            break;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_exec_init_ctx(ngx_rtmp_session_t *s, u_char name[NGX_RTMP_MAX_NAME],\n    u_char args[NGX_RTMP_MAX_ARGS], ngx_uint_t flags)\n{\n    ngx_uint_t                  n;\n    ngx_array_t                *push_conf;\n    ngx_rtmp_exec_t            *e;\n    ngx_rtmp_exec_ctx_t        *ctx;\n    ngx_rtmp_exec_conf_t       *ec;\n    ngx_rtmp_exec_app_conf_t   *eacf;\n    ngx_rtmp_exec_main_conf_t  *emcf;\n    time_t                      t;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_exec_module);\n\n    if (ctx != NULL) {\n        goto done;\n    }\n\n    ctx = ngx_pcalloc(s->pool, sizeof(ngx_rtmp_exec_ctx_t));\n\n    if (ctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_exec_module);\n\n    eacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_exec_module);\n\n    emcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_exec_module);\n\n    push_conf = &eacf->conf[NGX_RTMP_EXEC_PUSH];\n\n    if (push_conf->nelts > 0) {\n\n        if (ngx_array_init(&ctx->push_exec, s->pool,\n                           push_conf->nelts,\n                           sizeof(ngx_rtmp_exec_t)) != NGX_OK)\n        {\n            return NGX_ERROR;\n        }\n\n        e = ngx_array_push_n(&ctx->push_exec, push_conf->nelts);\n\n        if (e == NULL) {\n            return NGX_ERROR;\n        }\n\n        ec = push_conf->elts;\n\n        for (n = 0; n < push_conf->nelts; n++, e++, ec++) {\n            ngx_memzero(e, sizeof(*e));\n            e->conf = ec;\n            e->managed = 1;\n            e->log = s->log;\n            e->eval = ngx_rtmp_exec_push_eval;\n            e->eval_ctx = s;\n            e->kill_signal = emcf->kill_signal;\n            e->respawn_timeout = (eacf->respawn ? emcf->respawn_timeout :\n                                  NGX_CONF_UNSET_MSEC);\n        }\n    }\n\ndone:\n\n    ngx_memcpy(ctx->name, name, NGX_RTMP_MAX_NAME);\n    ngx_memcpy(ctx->args, args, NGX_RTMP_MAX_ARGS);\n\n    t = time( 0 );\n    strftime((char *)(ctx->starttime), sizeof(ctx->starttime),\n        \"%Y%m%d%H%M%S\", localtime(&t));\n\n    ctx->flags |= flags;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_exec_init_pull_ctx(ngx_rtmp_session_t *s,\n    u_char name[NGX_RTMP_MAX_NAME])\n{\n    size_t                      len;\n    ngx_uint_t                  n;\n    ngx_pool_t                 *pool;\n    ngx_array_t                *pull_conf;\n    ngx_rtmp_exec_t            *e;\n    ngx_rtmp_exec_ctx_t        *ctx;\n    ngx_rtmp_exec_conf_t       *ec;\n    ngx_rtmp_exec_pull_ctx_t   *pctx, **ppctx;\n    ngx_rtmp_exec_app_conf_t   *eacf;\n    ngx_rtmp_exec_main_conf_t  *emcf;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_exec_module);\n    if (ctx->pull != NULL) {\n        return NGX_OK;\n    }\n\n    eacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_exec_module);\n\n    pull_conf = &eacf->conf[NGX_RTMP_EXEC_PULL];\n\n    if (pull_conf->nelts == 0) {\n        return NGX_OK;\n    }\n\n    emcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_exec_module);\n\n    len = ngx_strlen(name);\n\n    ppctx = &eacf->pull[ngx_hash_key(name, len) % eacf->nbuckets];\n\n    for (; *ppctx; ppctx = &(*ppctx)->next) {\n        pctx = *ppctx;\n\n        if (pctx->name.len == len &&\n            ngx_strncmp(name, pctx->name.data, len) == 0)\n        {\n            goto done;\n        }\n    }\n\n    pool = NGX_CREATE_POOL(4096, emcf->log);\n    if (pool == NULL) {\n        return NGX_ERROR;\n    }\n\n    pctx = ngx_pcalloc(pool, sizeof(ngx_rtmp_exec_pull_ctx_t));\n    if (pctx == NULL) {\n        goto error;\n    }\n\n    pctx->pool = pool;\n    pctx->name.len = len;\n    pctx->name.data = ngx_palloc(pool, len);\n\n    if (pctx->name.data == NULL) {\n        goto error;\n    }\n\n    ngx_memcpy(pctx->name.data, name, len);\n\n    pctx->app.len = s->app.len;\n    pctx->app.data = ngx_palloc(pool, s->app.len);\n\n    if (pctx->app.data == NULL) {\n        goto error;\n    }\n\n    ngx_memcpy(pctx->app.data, s->app.data, s->app.len);\n\n    if (ngx_array_init(&pctx->pull_exec, pool, pull_conf->nelts,\n                       sizeof(ngx_rtmp_exec_t)) != NGX_OK)\n    {\n        goto error;\n    }\n\n    e = ngx_array_push_n(&pctx->pull_exec, pull_conf->nelts);\n    if (e == NULL) {\n        goto error;\n    }\n\n    ec = pull_conf->elts;\n    for (n = 0; n < pull_conf->nelts; n++, e++, ec++) {\n        ngx_memzero(e, sizeof(*e));\n        e->conf = ec;\n        e->managed = 1;\n        e->log = emcf->log;\n        e->eval = ngx_rtmp_exec_pull_eval;\n        e->eval_ctx = pctx;\n        e->kill_signal = emcf->kill_signal;\n        e->respawn_timeout = (eacf->respawn ? emcf->respawn_timeout :\n                                              NGX_CONF_UNSET_MSEC);\n    }\n\n    *ppctx = pctx;\n\ndone:\n\n    ctx->pull = pctx;\n    ctx->pull->counter++;\n\n    return NGX_OK;\n\nerror:\n\n    NGX_DESTROY_POOL(pool);\n\n    return NGX_ERROR;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_exec_filter(ngx_rtmp_session_t *s, ngx_rtmp_exec_conf_t *ec)\n{\n    size_t                len;\n    ngx_str_t            *v;\n    ngx_uint_t            n;\n    ngx_rtmp_exec_ctx_t  *ctx;\n\n    if (ec->names.nelts == 0) {\n        return NGX_OK;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_exec_module);\n\n    len = ngx_strlen(ctx->name);\n\n    v = ec->names.elts;\n    for (n = 0; n < ec->names.nelts; n++, s++) {\n        if (v->len == len && ngx_strncmp(v->data, ctx->name, len) == 0) {\n            return NGX_OK;\n        }\n    }\n\n    return NGX_DECLINED;\n}\n\n\nstatic void\nngx_rtmp_exec_unmanaged(ngx_rtmp_session_t *s, ngx_array_t *e, const char *op)\n{\n    ngx_uint_t             n;\n    ngx_rtmp_exec_t        en;\n    ngx_rtmp_exec_conf_t  *ec;\n\n    if (e->nelts == 0) {\n        return;\n    }\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"exec: %s %uz unmanaged command(s)\", op, e->nelts);\n\n    ec = e->elts;\n    for (n = 0; n < e->nelts; n++, ec++) {\n        if (ngx_rtmp_exec_filter(s, ec) != NGX_OK) {\n            continue;\n        }\n\n        ngx_memzero(&en, sizeof(ngx_rtmp_exec_t));\n\n        en.conf = ec;\n        en.eval = ngx_rtmp_exec_event_eval;\n        en.eval_ctx = s;\n        en.log = s->log;\n\n        ngx_rtmp_exec_run(&en);\n    }\n}\n\n\nstatic void\nngx_rtmp_exec_managed(ngx_rtmp_session_t *s, ngx_array_t *e, const char *op)\n{\n    ngx_uint_t        n;\n    ngx_rtmp_exec_t  *en;\n\n    if (e->nelts == 0) {\n        return;\n    }\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"exec: %s %uz managed command(s)\", op, e->nelts);\n\n    en = e->elts;\n    for (n = 0; n < e->nelts; n++, en++) {\n        if (ngx_rtmp_exec_filter(s, en->conf) == NGX_OK) {\n            ngx_rtmp_exec_run(en);\n        }\n    }\n}\n\n\nstatic ngx_int_t\nngx_rtmp_exec_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v)\n{\n    ngx_rtmp_exec_ctx_t       *ctx;\n    ngx_rtmp_exec_app_conf_t  *eacf;\n\n    eacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_exec_module);\n\n    if (eacf == NULL || !eacf->active) {\n        goto next;\n    }\n\n    if (s->interprocess) {\n        goto next;\n    }\n\n    if (ngx_rtmp_exec_init_ctx(s, v->name, v->args, NGX_RTMP_EXEC_PUBLISHING)\n        != NGX_OK)\n    {\n        goto next;\n    }\n\n    ngx_rtmp_exec_unmanaged(s, &eacf->conf[NGX_RTMP_EXEC_PUBLISH], \"publish\");\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_exec_module);\n\n    ngx_rtmp_exec_managed(s, &ctx->push_exec, \"push\");\n\nnext:\n    return next_publish(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_exec_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v)\n{\n    ngx_rtmp_exec_ctx_t       *ctx;\n    ngx_rtmp_exec_pull_ctx_t  *pctx;\n    ngx_rtmp_exec_app_conf_t  *eacf;\n\n    eacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_exec_module);\n\n    if (eacf == NULL || !eacf->active) {\n        goto next;\n    }\n\n    if (ngx_rtmp_exec_init_ctx(s, v->name, v->args, NGX_RTMP_EXEC_PLAYING)\n        != NGX_OK)\n    {\n        goto next;\n    }\n\n    ngx_rtmp_exec_unmanaged(s, &eacf->conf[NGX_RTMP_EXEC_PLAY], \"play\");\n\n    if (ngx_rtmp_exec_init_pull_ctx(s, v->name) != NGX_OK) {\n        goto next;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_exec_module);\n    pctx = ctx->pull;\n\n    if (pctx && pctx->counter == 1) {\n        ngx_rtmp_exec_managed(s, &pctx->pull_exec, \"pull\");\n    }\n\nnext:\n    return next_play(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_exec_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)\n{\n    size_t                     n;\n    ngx_rtmp_exec_t           *e;\n    ngx_rtmp_exec_ctx_t       *ctx;\n    ngx_rtmp_exec_pull_ctx_t  *pctx, **ppctx;\n    ngx_rtmp_exec_app_conf_t  *eacf;\n\n    eacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_exec_module);\n    if (eacf == NULL) {\n        goto next;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_exec_module);\n    if (ctx == NULL) {\n        goto next;\n    }\n\n    if (ctx->flags & NGX_RTMP_EXEC_PUBLISHING) {\n        ngx_rtmp_exec_unmanaged(s, &eacf->conf[NGX_RTMP_EXEC_PUBLISH_DONE],\n                                \"publish_done\");\n    }\n\n    if (ctx->flags & NGX_RTMP_EXEC_PLAYING) {\n        ngx_rtmp_exec_unmanaged(s, &eacf->conf[NGX_RTMP_EXEC_PLAY_DONE],\n                                \"play_done\");\n    }\n\n    ctx->flags = 0;\n\n    if (ctx->push_exec.nelts > 0) {\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"exec: delete %uz push command(s)\",\n                       ctx->push_exec.nelts);\n\n        e = ctx->push_exec.elts;\n        for (n = 0; n < ctx->push_exec.nelts; n++, e++) {\n            ngx_rtmp_exec_kill(e, e->kill_signal);\n        }\n    }\n\n    pctx = ctx->pull;\n\n    if (pctx && --pctx->counter == 0) {\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"exec: delete %uz pull command(s)\",\n                       pctx->pull_exec.nelts);\n\n        e = pctx->pull_exec.elts;\n        for (n = 0; n < pctx->pull_exec.nelts; n++, e++) {\n            ngx_rtmp_exec_kill(e, e->kill_signal);\n        }\n\n        ppctx = &eacf->pull[ngx_hash_key(pctx->name.data, pctx->name.len) %\n                            eacf->nbuckets];\n\n        for (; *ppctx; ppctx = &(*ppctx)->next) {\n            if (pctx == *ppctx) {\n                *ppctx = pctx->next;\n                break;\n            }\n        }\n\n        NGX_DESTROY_POOL(pctx->pool);\n    }\n\n    ctx->pull = NULL;\n\nnext:\n    return next_close_stream(s, v);\n}\n#endif /* NGX_WIN32 */\n\n\nstatic char *\nngx_rtmp_exec_conf(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    char  *p = conf;\n\n    size_t                     n, nargs;\n    ngx_str_t                 *s, *value, v;\n    ngx_array_t               *confs;\n    ngx_rtmp_exec_conf_t      *ec;\n    ngx_rtmp_exec_app_conf_t  *eacf;\n\n    confs = (ngx_array_t *) (p + cmd->offset);\n\n    eacf = ngx_rtmp_conf_get_module_app_conf(cf, ngx_rtmp_exec_module);\n\n    if (confs->nalloc == 0 && ngx_array_init(confs, cf->pool, 1,\n                                             sizeof(ngx_rtmp_exec_conf_t))\n                              != NGX_OK)\n    {\n        return NGX_CONF_ERROR;\n    }\n\n    value = cf->args->elts;\n\n    ec = ngx_array_push(confs);\n    if (ec == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    ngx_memzero(ec, sizeof(ngx_rtmp_exec_conf_t));\n\n    /* type is undefined for explicit execs */\n\n    ec->type = NGX_CONF_UNSET_UINT;\n    ec->cmd = value[1];\n\n    if (ngx_array_init(&ec->names, cf->pool, 1, sizeof(ngx_str_t)) != NGX_OK) {\n        return NGX_CONF_ERROR;\n    }\n\n    if (cf->args->nelts == 2) {\n        return NGX_CONF_OK;\n    }\n\n    nargs = cf->args->nelts - 2;\n    if (ngx_array_init(&ec->args, cf->pool, nargs, sizeof(ngx_str_t)) != NGX_OK)\n    {\n        return NGX_CONF_ERROR;\n    }\n\n    for (n = 2; n < cf->args->nelts; n++) {\n\n        v = value[n];\n\n        if (eacf->options == 1) {\n\n            if (v.len >= 5 && ngx_strncmp(v.data, \"name=\", 5) == 0) {\n\n                s = ngx_array_push(&ec->names);\n                if (s == NULL) {\n                    return NGX_CONF_ERROR;\n                }\n\n                v.data += 5;\n                v.len -= 5;\n\n                *s = v;\n\n                continue;\n            }\n        }\n\n        s = ngx_array_push(&ec->args);\n        if (s == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n        *s = v;\n    }\n\n    return NGX_CONF_OK;\n}\n\n/*\nstatic char *\nngx_rtmp_exec_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    char                       *rv;\n    ngx_str_t                  *value;\n    ngx_conf_t                  save;\n    ngx_array_t                *confs;\n    ngx_rtmp_conf_ctx_t        *ctx, *pctx;\n    ngx_rtmp_exec_conf_t       *ec, *eec;\n    ngx_rtmp_exec_app_conf_t   *eacf;\n    ngx_rtmp_exec_main_conf_t  *emcf;\n\n    value = cf->args->elts;\n\n    eacf = ngx_rtmp_conf_get_module_app_conf(cf, ngx_rtmp_exec_module);\n\n    emcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_exec_module);\n\n    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_conf_ctx_t));\n    if (ctx == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    pctx = cf->ctx;\n\n    ctx->main_conf = pctx->main_conf;\n    ctx->srv_conf  = pctx->srv_conf;\n\n    ctx->app_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_rtmp_max_module);\n    if (ctx->app_conf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    ec = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_exec_conf_t));\n    if (ec == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    ec->id = value[1];\n    ec->type = NGX_CONF_UNSET_UINT;\n\n    ctx->app_conf[ngx_rtmp_exec_module.ctx_index] = ec;\n\n    save = *cf;\n\n    cf->ctx = ctx;\n    cf->cmd_type = NGX_RTMP_EXEC_CONF;\n\n    rv = ngx_conf_parse(cf, NULL);\n    *cf= save;\n\n    switch (ec->type) {\n\n        case NGX_RTMP_EXEC_STATIC:\n            confs = &emcf->static_conf;\n            break;\n\n        case NGX_CONF_UNSET_UINT:\n            return \"unspecified exec type\";\n\n        default:\n            confs = &eacf->conf[ec->type];\n    }\n\n    if (confs->nalloc == 0 && ngx_array_init(confs, cf->pool, 1,\n                                             sizeof(ngx_rtmp_exec_conf_t))\n                             != NGX_OK)\n    {\n        return NGX_CONF_ERROR;\n    }\n\n    eec = ngx_array_push(confs);\n    if (eec == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    *eec = *ec;\n\n    return rv;\n}\n*/\n\nstatic char *\nngx_rtmp_exec_kill_signal(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_rtmp_exec_main_conf_t  *emcf = conf;\n\n    ngx_str_t  *value;\n\n    value = cf->args->elts;\n    value++;\n\n    emcf->kill_signal = ngx_atoi(value->data, value->len);\n    if (emcf->kill_signal != NGX_ERROR) {\n        return NGX_CONF_OK;\n    }\n\n#define NGX_RMTP_EXEC_SIGNAL(name)                                          \\\n    if (value->len == sizeof(#name) - 1 &&                                  \\\n        ngx_strncasecmp(value->data, (u_char *) #name, value->len) == 0)    \\\n    {                                                                       \\\n        emcf->kill_signal = SIG##name;                                      \\\n        return NGX_CONF_OK;                                                 \\\n    }\n\n    /* POSIX.1-1990 signals */\n\n#if !(NGX_WIN32)\n    NGX_RMTP_EXEC_SIGNAL(HUP);\n    NGX_RMTP_EXEC_SIGNAL(INT);\n    NGX_RMTP_EXEC_SIGNAL(QUIT);\n    NGX_RMTP_EXEC_SIGNAL(ILL);\n    NGX_RMTP_EXEC_SIGNAL(ABRT);\n    NGX_RMTP_EXEC_SIGNAL(FPE);\n    NGX_RMTP_EXEC_SIGNAL(KILL);\n    NGX_RMTP_EXEC_SIGNAL(SEGV);\n    NGX_RMTP_EXEC_SIGNAL(PIPE);\n    NGX_RMTP_EXEC_SIGNAL(ALRM);\n    NGX_RMTP_EXEC_SIGNAL(TERM);\n    NGX_RMTP_EXEC_SIGNAL(USR1);\n    NGX_RMTP_EXEC_SIGNAL(USR2);\n    NGX_RMTP_EXEC_SIGNAL(CHLD);\n    NGX_RMTP_EXEC_SIGNAL(CONT);\n    NGX_RMTP_EXEC_SIGNAL(STOP);\n    NGX_RMTP_EXEC_SIGNAL(TSTP);\n    NGX_RMTP_EXEC_SIGNAL(TTIN);\n    NGX_RMTP_EXEC_SIGNAL(TTOU);\n#endif\n\n#undef NGX_RMTP_EXEC_SIGNAL\n\n    return \"unknown signal\";\n}\n\n\nstatic ngx_int_t\nngx_rtmp_exec_postconfiguration(ngx_conf_t *cf)\n{\n#if !(NGX_WIN32)\n\n    next_publish = ngx_rtmp_publish;\n    ngx_rtmp_publish = ngx_rtmp_exec_publish;\n\n    next_play = ngx_rtmp_play;\n    ngx_rtmp_play = ngx_rtmp_exec_play;\n\n    next_close_stream = ngx_rtmp_close_stream;\n    ngx_rtmp_close_stream = ngx_rtmp_exec_close_stream;\n\n#endif /* NGX_WIN32 */\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_gop_module.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_codec_module.h\"\n#include \"ngx_rtmp_live_module.h\"\n\n\nstatic ngx_rtmp_close_stream_pt         next_close_stream;\n\n\nstatic void *ngx_rtmp_gop_create_app_conf(ngx_conf_t *cf);\nstatic char *ngx_rtmp_gop_merge_app_conf(ngx_conf_t *cf, void *parent,\n       void *child);\n\nstatic ngx_int_t ngx_rtmp_gop_postconfiguration(ngx_conf_t *cf);\n\n#define ngx_rtmp_gop_next(s, pos) ((pos + 1) % s->out_queue)\n#define ngx_rtmp_gop_prev(s, pos) (pos == 0 ? s->out_queue - 1 : pos - 1)\n\ntypedef struct {\n    /* publisher: head of cache\n     * player: cache send position of publisher's out\n     */\n    size_t                      gop_pos;\n    /* tail of cache */\n    size_t                      gop_last;\n    /* 0 for not send, 1 for sending, 2 for sent */\n    ngx_flag_t                  send_gop;\n\n    ngx_rtmp_frame_t           *keyframe;\n\n    ngx_rtmp_frame_t           *aac_header;\n    ngx_rtmp_frame_t           *avc_header;\n\n    ngx_rtmp_frame_t           *latest_aac_header;\n    ngx_rtmp_frame_t           *latest_avc_header;\n\n    ngx_uint_t                  meta_version;\n\n    uint32_t                    first_timestamp;\n\n    /* only for publisher, must at last of ngx_rtmp_gop_ctx_t */\n    ngx_rtmp_frame_t           *cache[];\n} ngx_rtmp_gop_ctx_t;\n\ntypedef struct {\n    ngx_msec_t                  cache_time;\n    ngx_flag_t                  low_latency;\n    ngx_flag_t                  send_all;\n    ngx_msec_t                  fix_timestamp;\n    ngx_flag_t                  zero_start;\n} ngx_rtmp_gop_app_conf_t;\n\n\nstatic ngx_command_t  ngx_rtmp_gop_commands[] = {\n\n    { ngx_string(\"cache_time\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_gop_app_conf_t, cache_time),\n      NULL },\n\n    { ngx_string(\"low_latency\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_gop_app_conf_t, low_latency),\n      NULL },\n\n    { ngx_string(\"send_all\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_gop_app_conf_t, send_all),\n      NULL },\n\n    { ngx_string(\"fix_timestamp\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_gop_app_conf_t, fix_timestamp),\n      NULL },\n\n    { ngx_string(\"zero_start\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_gop_app_conf_t, zero_start),\n      NULL },\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_rtmp_gop_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_rtmp_gop_postconfiguration,         /* postconfiguration */\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    ngx_rtmp_gop_create_app_conf,           /* create app configuration */\n    ngx_rtmp_gop_merge_app_conf             /* merge app configuration */\n};\n\n\nngx_module_t  ngx_rtmp_gop_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_gop_module_ctx,               /* module context */\n    ngx_rtmp_gop_commands,                  /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_rtmp_gop_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_gop_app_conf_t    *gacf;\n\n    gacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_gop_app_conf_t));\n    if (gacf == NULL) {\n        return NULL;\n    }\n\n    gacf->cache_time = NGX_CONF_UNSET_MSEC;\n    gacf->low_latency = NGX_CONF_UNSET;\n    gacf->send_all = NGX_CONF_UNSET;\n    gacf->fix_timestamp = NGX_CONF_UNSET_MSEC;\n    gacf->zero_start = NGX_CONF_UNSET;\n\n    return gacf;\n}\n\nstatic char *\nngx_rtmp_gop_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_rtmp_gop_app_conf_t    *prev = parent;\n    ngx_rtmp_gop_app_conf_t    *conf = child;\n\n    ngx_conf_merge_msec_value(conf->cache_time, prev->cache_time, 0);\n    ngx_conf_merge_value(conf->low_latency, prev->low_latency, 0);\n    ngx_conf_merge_value(conf->send_all, prev->send_all, 0);\n    ngx_conf_merge_msec_value(conf->fix_timestamp, prev->fix_timestamp, 10000);\n    ngx_conf_merge_value(conf->zero_start, prev->zero_start, 0);\n\n    return NGX_CONF_OK;\n}\n\nstatic ngx_int_t\nngx_rtmp_gop_link_frame(ngx_rtmp_session_t *s, ngx_rtmp_frame_t *frame)\n{\n    ngx_uint_t                      nmsg;\n    ngx_rtmp_live_chunk_stream_t   *cs;\n    ngx_uint_t                      csidx;\n    ngx_rtmp_live_ctx_t            *lctx;\n    ngx_rtmp_gop_ctx_t             *ctx;\n    uint32_t                        delta;\n    ngx_rtmp_gop_app_conf_t        *gacf;\n\n    if (frame == NULL) {\n        return NGX_OK;\n    }\n\n    gacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_gop_module);\n    if (gacf->fix_timestamp) {\n        lctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module);\n        csidx = !(frame->hdr.type == NGX_RTMP_MSG_VIDEO);\n\n        cs  = &lctx->cs[csidx];\n\n        delta = frame->hdr.timestamp > cs->last_timestamp ?\n            frame->hdr.timestamp - cs->last_timestamp :\n            cs->last_timestamp - frame->hdr.timestamp;\n\n        if (delta > gacf->fix_timestamp) {\n            delta = 0;\n        }\n\n        if (!gacf->zero_start && cs->timestamp == 0) {\n            cs->timestamp = frame->hdr.timestamp;\n        } else if (frame->hdr.timestamp > cs->last_timestamp) {\n            cs->timestamp += delta;\n        } else if (cs->timestamp >= delta) {\n            cs->timestamp -= delta;\n        }\n\n        cs->last_timestamp = frame->hdr.timestamp;\n\n        ngx_log_error(NGX_LOG_DEBUG, s->log, 0,\n            \"gop: link_frame| type %d, delta %d,\"\n            \" timestamp %uD, fixed timestamp %uD\",\n            frame->hdr.type, delta, frame->hdr.timestamp, cs->timestamp);\n\n        frame->hdr.timestamp = cs->timestamp;\n        if (frame->hdr.type == NGX_RTMP_MSG_AMF_META) {\n            frame->hdr.timestamp = 0;\n        }\n    }\n\n    nmsg = (s->out_last - s->out_pos) % s->out_queue + 1;\n\n    if (nmsg >= s->out_queue) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"link frame nmsg(%ui) >= out_queue(%O)\", nmsg, s->out_queue);\n        return NGX_AGAIN;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_gop_module);\n\n    if (frame->hdr.type == NGX_RTMP_MSG_AUDIO && frame->av_header) {\n        ctx->latest_aac_header = frame;\n    }\n\n    if (frame->hdr.type == NGX_RTMP_MSG_VIDEO && frame->av_header) {\n        ctx->latest_avc_header = frame;\n    }\n\n    s->out[s->out_last] = frame;\n    s->out_last = ngx_rtmp_gop_next(s, s->out_last);\n\n    ngx_rtmp_shared_acquire_frame(frame);\n\n    return NGX_OK;\n}\n\nstatic void\nngx_rtmp_gop_set_avframe_tag(ngx_rtmp_frame_t *frame)\n{\n    ngx_chain_t                *cl;\n\n    if (frame->hdr.type != NGX_RTMP_MSG_AUDIO &&\n            frame->hdr.type != NGX_RTMP_MSG_VIDEO)\n    {\n        return;\n    }\n\n    cl = frame->chain;\n\n    frame->av_header = ngx_rtmp_is_codec_header(cl);\n    frame->keyframe = (frame->hdr.type == NGX_RTMP_MSG_VIDEO)\n            ? (ngx_rtmp_get_video_frame_type(cl) == NGX_RTMP_VIDEO_KEY_FRAME)\n            : 0;\n\n    if (frame->av_header) {\n        frame->mandatory = 1;\n    }\n}\n\nstatic void\nngx_rtmp_gop_reset_avheader(ngx_rtmp_gop_ctx_t *ctx,\n        ngx_rtmp_frame_t *frame)\n{\n    if (frame->hdr.type == NGX_RTMP_MSG_AUDIO) {\n        if (ctx->aac_header) {\n            ngx_rtmp_shared_free_frame(ctx->aac_header);\n        }\n        ctx->aac_header = frame;\n    } else {\n        if (ctx->avc_header) {\n            ngx_rtmp_shared_free_frame(ctx->avc_header);\n        }\n        ctx->avc_header = frame;\n    }\n}\n\nstatic void\nngx_rtmp_gop_reset_gop(ngx_rtmp_session_t *s, ngx_rtmp_gop_ctx_t *ctx,\n        ngx_rtmp_frame_t *frame)\n{\n    ngx_rtmp_gop_app_conf_t    *gacf;\n    ngx_rtmp_frame_t           *f, *next_keyframe;\n    size_t                      pos;\n    ngx_uint_t                  nmsg;\n\n    /* reset av_header at the front of cache */\n    for (pos = ctx->gop_pos; pos != ctx->gop_last;\n            pos = ngx_rtmp_gop_next(s, pos))\n    {\n        if (ctx->cache[pos]->av_header) {\n            ngx_rtmp_gop_reset_avheader(ctx, ctx->cache[pos]);\n            ctx->gop_pos = ngx_rtmp_gop_next(s, ctx->gop_pos);\n            continue;\n        }\n\n        break;\n    }\n\n    f = ctx->cache[pos];\n    if (f == NULL) {\n        return;\n    }\n\n    gacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_gop_module);\n\n    /* only audio in cache */\n    if (ctx->keyframe == NULL) {\n        if (frame->hdr.timestamp - ctx->cache[ctx->gop_pos]->hdr.timestamp\n                > gacf->cache_time)\n        {\n            ngx_rtmp_shared_free_frame(f);\n            ctx->cache[ctx->gop_pos] = NULL;\n            ctx->gop_pos = ngx_rtmp_gop_next(s, ctx->gop_pos);\n        }\n\n        return;\n    }\n\n    /* only video of video + audio */\n    next_keyframe = ctx->keyframe->next;\n\n    /* only one gop in cache */\n    if (next_keyframe == NULL) {\n        return;\n    }\n\n    nmsg = (ctx->gop_last - ctx->gop_pos) % s->out_queue + 2;\n    if (nmsg >= s->out_queue) {\n        goto reset;\n    }\n\n    if (frame->hdr.type == NGX_RTMP_MSG_AUDIO) {\n        return;\n    }\n\n    if (frame->hdr.type == NGX_RTMP_MSG_VIDEO && frame->hdr.timestamp\n            - next_keyframe->hdr.timestamp < gacf->cache_time)\n    {\n        return;\n    }\n\nreset:\n    for (pos = ctx->gop_pos; ctx->cache[pos] != next_keyframe;\n            pos = ngx_rtmp_gop_next(s, pos))\n    {\n        f = ctx->cache[pos];\n\n        if (f->av_header) {\n            ngx_rtmp_gop_reset_avheader(ctx, f);\n        } else {\n            ngx_rtmp_shared_free_frame(f);\n        }\n\n        ctx->cache[pos] = NULL;\n    }\n\n    ctx->keyframe = next_keyframe;\n    ctx->gop_pos = pos;\n}\n\nstatic void\nngx_rtmp_gop_print_cache(ngx_rtmp_session_t *s, ngx_rtmp_gop_ctx_t *ctx)\n{\n#if (NGX_DEBUG)\n    ngx_rtmp_frame_t           *frame;\n    u_char                      content[10240], *p;\n    size_t                      pos;\n\n    ngx_memzero(content, sizeof(content));\n\n    p = content;\n    for (pos = ctx->gop_pos; pos != ctx->gop_last;\n            pos = ngx_rtmp_gop_next(s, pos))\n    {\n        frame = ctx->cache[pos];\n        switch (frame->hdr.type) {\n        case NGX_RTMP_MSG_AUDIO:\n            *p++ = 'A';\n            break;\n        case NGX_RTMP_MSG_VIDEO:\n            *p++ = 'V';\n            break;\n        default:\n            *p++ = 'O';\n            break;\n        }\n\n        if (frame->keyframe) {\n            *p++ = 'I';\n        }\n\n        if (frame->av_header) {\n            *p++ = 'H';\n        }\n\n        *p++ = ' ';\n    }\n\n    ngx_log_debug5(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"[%z %z] [%p %p] %s\", ctx->gop_pos, ctx->gop_last, ctx->aac_header,\n            ctx->avc_header, content);\n#endif\n}\n\nngx_int_t\nngx_rtmp_gop_cache(ngx_rtmp_session_t *s, ngx_rtmp_frame_t *frame)\n{\n    ngx_rtmp_gop_app_conf_t    *gacf;\n    ngx_rtmp_gop_ctx_t         *ctx;\n    ngx_rtmp_frame_t          **keyframe;\n    ngx_uint_t                  nmsg;\n\n    gacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_gop_module);\n    if (gacf->cache_time == 0) {\n        return NGX_OK;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_gop_module);\n    if (ctx == NULL) {\n        ctx = ngx_pcalloc(s->pool, sizeof(ngx_rtmp_gop_ctx_t)\n                          + s->out_queue * sizeof(ngx_rtmp_frame_t *));\n        if (ctx == NULL) {\n            return NGX_ERROR;\n        }\n        ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_gop_module);\n    }\n\n    nmsg = (ctx->gop_last - ctx->gop_pos) % s->out_queue + 1;\n    if (nmsg >= s->out_queue) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"cache frame nmsg(%ui) >= out_queue(%z)\", nmsg, s->out_queue);\n        return NGX_AGAIN;\n    }\n\n    ngx_rtmp_gop_set_avframe_tag(frame);\n\n    ngx_log_debug5(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"cache frame: %ud[%d %d], %ud, %ud\",\n            frame->hdr.type, frame->keyframe, frame->av_header,\n            frame->hdr.timestamp, frame->hdr.mlen);\n\n    if (frame->hdr.type == NGX_RTMP_MSG_AUDIO && frame->av_header) {\n        ctx->latest_aac_header = frame;\n    }\n\n    if (frame->hdr.type == NGX_RTMP_MSG_VIDEO && frame->av_header) {\n        ctx->latest_avc_header = frame;\n    }\n\n    /* first video frame is not intra_frame or video header */\n    if (ctx->keyframe == NULL && frame->hdr.type == NGX_RTMP_MSG_VIDEO\n            && !frame->keyframe && !frame->av_header)\n    {\n        return NGX_OK;\n    }\n\n    /* video intra_frame */\n    if (frame->keyframe && !frame->av_header) {\n        for (keyframe = &ctx->keyframe; *keyframe;\n                keyframe = &((*keyframe)->next));\n        *keyframe = frame;\n    }\n\n    ctx->cache[ctx->gop_last] = frame;\n    ctx->gop_last = ngx_rtmp_gop_next(s, ctx->gop_last);\n\n    ngx_rtmp_shared_acquire_frame(frame);\n\n    ngx_rtmp_gop_reset_gop(s, ctx, frame);\n\n    ngx_rtmp_gop_print_cache(s, ctx);\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_rtmp_gop_send_meta(ngx_rtmp_session_t *s, ngx_rtmp_session_t *ss)\n{\n    ngx_rtmp_gop_ctx_t         *ssctx;\n    ngx_rtmp_codec_ctx_t       *cctx;\n\n    ssctx = ngx_rtmp_get_module_ctx(ss, ngx_rtmp_gop_module);\n    cctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    /* meta */\n    if (ssctx->meta_version != cctx->meta_version\n            && ngx_rtmp_gop_link_frame(ss, cctx->meta) == NGX_AGAIN)\n    {\n        return NGX_AGAIN;\n    }\n    ssctx->meta_version = cctx->meta_version;\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_rtmp_gop_send_gop(ngx_rtmp_session_t *s, ngx_rtmp_session_t *ss)\n{\n    ngx_rtmp_gop_app_conf_t    *gacf;\n    ngx_rtmp_gop_ctx_t         *sctx, *ssctx;\n    ngx_rtmp_frame_t           *frame;\n    size_t                      pos;\n\n    gacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_gop_module);\n\n    sctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_gop_module);\n    ssctx = ngx_rtmp_get_module_ctx(ss, ngx_rtmp_gop_module);\n\n    /* already send gop */\n    if (ssctx->send_gop == 3) {\n        return NGX_OK;\n    }\n\n    if (ssctx->send_gop == 0) {\n        if (ngx_rtmp_gop_send_meta(s, ss) == NGX_AGAIN) {\n            return NGX_AGAIN;\n        }\n\n        ngx_rtmp_send_message(ss, NULL, 0);\n\n        ssctx->send_gop = 1;\n\n        return NGX_AGAIN;\n    }\n\n    /* link frame in s to ss */\n    if (ssctx->send_gop == 1) {\n        ssctx->gop_pos = sctx->gop_pos;\n        if (sctx->cache[ssctx->gop_pos] == NULL) {\n            return NGX_AGAIN;\n        }\n\n        if (sctx->aac_header) {\n            if (ngx_rtmp_gop_link_frame(ss, sctx->aac_header) == NGX_AGAIN) {\n                return NGX_AGAIN;\n            }\n        }\n\n        if (sctx->avc_header) {\n            if (ngx_rtmp_gop_link_frame(ss, sctx->avc_header) == NGX_AGAIN) {\n                return NGX_AGAIN;\n            }\n        }\n\n        ssctx->send_gop = 2;\n        ssctx->first_timestamp = sctx->cache[ssctx->gop_pos]->hdr.timestamp;\n    } else {\n        if (sctx->cache[ssctx->gop_pos] == NULL) {\n            ssctx->gop_pos = sctx->gop_pos;\n        }\n    }\n\n    pos = ssctx->gop_pos;\n    frame = sctx->cache[pos];\n    while (frame) {\n        if (!gacf->send_all &&\n            frame->hdr.timestamp - ssctx->first_timestamp >= gacf->cache_time)\n        {\n            ssctx->send_gop = 3;\n            break;\n        }\n\n        if (ngx_rtmp_gop_link_frame(ss, frame) == NGX_AGAIN) {\n            break;\n        }\n\n        pos = ngx_rtmp_gop_next(s, pos);\n        frame = sctx->cache[pos];\n    }\n\n    if (frame == NULL) { /* send all frame in cache */\n        ssctx->send_gop = 3;\n    }\n\n    ssctx->gop_pos = pos;\n    ngx_rtmp_send_message(ss, NULL, 0);\n\n    return NGX_AGAIN;\n}\n\nngx_int_t\nngx_rtmp_gop_send(ngx_rtmp_session_t *s, ngx_rtmp_session_t *ss)\n{\n    ngx_rtmp_gop_app_conf_t    *gacf;\n    ngx_rtmp_gop_ctx_t         *sctx, *ssctx;\n    ngx_rtmp_frame_t           *frame;\n    size_t                      pos;\n\n    gacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_gop_module);\n    if (gacf->cache_time == 0) {\n        return NGX_DECLINED;\n    }\n\n    sctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_gop_module);\n    if (sctx == NULL) { /* publisher doesn't publish av frame */\n        return NGX_DECLINED;\n    }\n\n    ssctx = ngx_rtmp_get_module_ctx(ss, ngx_rtmp_gop_module);\n    if (ssctx == NULL) {\n        ssctx = ngx_pcalloc(ss->pool, sizeof(ngx_rtmp_gop_ctx_t));\n        if (ssctx == NULL) {\n            return NGX_ERROR;\n        }\n        ngx_rtmp_set_ctx(ss, ssctx, ngx_rtmp_gop_module);\n    }\n\n    if (ngx_rtmp_gop_send_gop(s, ss) == NGX_AGAIN) {\n        return NGX_OK;\n    }\n\n    /* send frame by frame */\n    if (ngx_rtmp_gop_send_meta(s, ss) == NGX_AGAIN) {\n        return NGX_AGAIN;\n    }\n\n    pos = ngx_rtmp_gop_prev(s, sctx->gop_last);\n    /* new frame is video key frame */\n    if (sctx->cache[pos]->keyframe && !sctx->cache[pos]->av_header) {\n        if (gacf->low_latency && pos != ssctx->gop_pos) {\n            ssctx->gop_pos = pos;\n\n            ss->out_pos = ss->out_last;\n\n            ngx_log_error(NGX_LOG_INFO, ss->log, 0,\n                    \"gop, low latency, chase to new keyframe\");\n\n            if (sctx->latest_aac_header\n                    && sctx->latest_aac_header != ssctx->latest_aac_header)\n            {\n                if (ngx_rtmp_gop_link_frame(ss, sctx->latest_aac_header)\n                        == NGX_AGAIN)\n                {\n                    return NGX_AGAIN;\n                }\n            }\n\n            if (sctx->latest_avc_header\n                    && sctx->latest_avc_header != ssctx->latest_avc_header)\n            {\n                if (ngx_rtmp_gop_link_frame(ss, sctx->latest_avc_header)\n                        == NGX_AGAIN)\n                {\n                    return NGX_AGAIN;\n                }\n            }\n        }\n    } else {\n        if (sctx->cache[ssctx->gop_pos] == NULL) {\n            ngx_log_error(NGX_LOG_ERR, ss->log, 0,\n                    \"gop, current gop pos is NULL, \"\n                    \"skip to new postion [pos %d last %d] %d\",\n                    sctx->gop_pos, sctx->gop_last, ssctx->gop_pos);\n\n            if (sctx->aac_header\n                    && sctx->aac_header != ssctx->latest_aac_header)\n            {\n                if (ngx_rtmp_gop_link_frame(ss, sctx->aac_header)\n                        == NGX_AGAIN)\n                {\n                    return NGX_AGAIN;\n                }\n            }\n\n            if (sctx->avc_header\n                    && sctx->avc_header != ssctx->latest_avc_header)\n            {\n                if (ngx_rtmp_gop_link_frame(ss, sctx->avc_header)\n                        == NGX_AGAIN)\n                {\n                    return NGX_AGAIN;\n                }\n            }\n\n            ssctx->gop_pos = sctx->gop_pos;\n        }\n    }\n\n    frame = sctx->cache[ssctx->gop_pos];\n    if (ngx_rtmp_gop_link_frame(ss, frame) == NGX_AGAIN) {\n        return NGX_AGAIN;\n    }\n\n    ssctx->gop_pos = ngx_rtmp_gop_next(s, ssctx->gop_pos);\n    ngx_rtmp_send_message(ss, NULL, 0);\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_rtmp_gop_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)\n{\n    ngx_rtmp_gop_ctx_t         *ctx;\n    ngx_rtmp_live_ctx_t        *lctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_gop_module);\n    if (ctx == NULL) {\n        goto next;\n    }\n\n    lctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module);\n\n    if (!lctx->publishing) {\n        goto next;\n    }\n\n    if (ctx->avc_header) {\n        ngx_rtmp_shared_free_frame(ctx->avc_header);\n    }\n\n    if (ctx->aac_header) {\n        ngx_rtmp_shared_free_frame(ctx->aac_header);\n    }\n\n    /* free cache in publisher */\n    while (ctx->gop_pos != ctx->gop_last) {\n        ngx_rtmp_shared_free_frame(ctx->cache[ctx->gop_pos]);\n        ctx->gop_pos = ngx_rtmp_gop_next(s, ctx->gop_pos);\n    }\n\nnext:\n    return next_close_stream(s, v);\n}\n\nstatic ngx_int_t\nngx_rtmp_gop_postconfiguration(ngx_conf_t *cf)\n{\n    next_close_stream = ngx_rtmp_close_stream;\n    ngx_rtmp_close_stream = ngx_rtmp_gop_close_stream;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_handler.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_amf.h\"\n#include \"ngx_rbuf.h\"\n#include \"ngx_poold.h\"\n#include \"ngx_rtmp_monitor_module.h\"\n\n\nstatic void ngx_rtmp_recv(ngx_event_t *rev);\nstatic void ngx_rtmp_send(ngx_event_t *rev);\nstatic void ngx_rtmp_ping(ngx_event_t *rev);\nstatic ngx_int_t ngx_rtmp_finalize_set_chunk_size(ngx_rtmp_session_t *s);\n\n\nngx_uint_t                  ngx_rtmp_naccepted;\n\n\nngx_rtmp_bandwidth_t        ngx_rtmp_bw_out;\nngx_rtmp_bandwidth_t        ngx_rtmp_bw_in;\n\n\n#ifdef NGX_DEBUG\nchar*\nngx_rtmp_message_type(uint8_t type)\n{\n    static char*    types[] = {\n        \"?\",\n        \"chunk_size\",\n        \"abort\",\n        \"ack\",\n        \"user\",\n        \"ack_size\",\n        \"bandwidth\",\n        \"edge\",\n        \"audio\",\n        \"video\",\n        \"?\",\n        \"?\",\n        \"?\",\n        \"?\",\n        \"?\",\n        \"amf3_meta\",\n        \"amf3_shared\",\n        \"amf3_cmd\",\n        \"amf_meta\",\n        \"amf_shared\",\n        \"amf_cmd\",\n        \"?\",\n        \"aggregate\"\n    };\n\n    return type < sizeof(types) / sizeof(types[0])\n        ? types[type]\n        : \"?\";\n}\n\n\nchar*\nngx_rtmp_user_message_type(uint16_t evt)\n{\n    static char*    evts[] = {\n        \"stream_begin\",\n        \"stream_eof\",\n        \"stream dry\",\n        \"set_buflen\",\n        \"recorded\",\n        \"\",\n        \"ping_request\",\n        \"ping_response\",\n    };\n\n    return evt < sizeof(evts) / sizeof(evts[0])\n        ? evts[evt]\n        : \"?\";\n}\n#endif\n\n\nvoid\nngx_rtmp_cycle(ngx_rtmp_session_t *s)\n{\n    ngx_connection_t           *c;\n\n    c = s->connection;\n    c->read->handler =  ngx_rtmp_recv;\n    c->write->handler = ngx_rtmp_send;\n\n    s->ping_evt.data = c;\n    s->ping_evt.log = s->log;\n    s->ping_evt.handler = ngx_rtmp_ping;\n    ngx_rtmp_reset_ping(s);\n\n    ngx_rtmp_recv(c->read);\n}\n\n\nstatic ngx_chain_t *\nngx_rtmp_alloc_in_buf(ngx_rtmp_session_t *s)\n{\n    ngx_chain_t        *cl;\n    ngx_buf_t          *b;\n    size_t              size;\n\n    if ((cl = ngx_alloc_chain_link(s->in_pool)) == NULL\n       || (cl->buf = ngx_calloc_buf(s->in_pool)) == NULL)\n    {\n        return NULL;\n    }\n\n    cl->next = NULL;\n    b = cl->buf;\n    size = s->in_chunk_size + NGX_RTMP_MAX_CHUNK_HEADER;\n\n    b->start = b->last = b->pos = ngx_palloc(s->in_pool, size);\n    if (b->start == NULL) {\n        return NULL;\n    }\n    b->end = b->start + size;\n\n    return cl;\n}\n\n\nvoid\nngx_rtmp_reset_ping(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_core_srv_conf_t   *cscf;\n\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n    if (cscf->ping == 0) {\n        return;\n    }\n\n    s->ping_active = 0;\n    s->ping_reset = 0;\n    ngx_add_timer(&s->ping_evt, cscf->ping);\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"ping: wait %Mms\", cscf->ping);\n}\n\n\nstatic void\nngx_rtmp_ping(ngx_event_t *pev)\n{\n    ngx_connection_t           *c;\n    ngx_rtmp_session_t         *s;\n    ngx_rtmp_core_srv_conf_t   *cscf;\n\n    c = pev->data;\n    s = c->data;\n\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n\n    /* i/o event has happened; no need to ping */\n    if (s->ping_reset) {\n        ngx_rtmp_reset_ping(s);\n        return;\n    }\n\n    if (s->ping_active) {\n        ngx_log_error(NGX_LOG_INFO, s->log, 0, \"ping: unresponded\");\n        ngx_rtmp_finalize_session(s);\n        return;\n    }\n\n    if (cscf->busy) {\n        ngx_log_error(NGX_LOG_INFO, s->log, 0, \"ping: not busy between pings\");\n        ngx_rtmp_finalize_session(s);\n        return;\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"ping: schedule %Mms\", cscf->ping_timeout);\n\n    if (ngx_rtmp_send_ping_request(s, (uint32_t)ngx_current_msec) != NGX_OK) {\n        ngx_rtmp_finalize_session(s);\n        return;\n    }\n\n    s->ping_active = 1;\n    ngx_add_timer(pev, cscf->ping_timeout);\n}\n\n\nstatic void\nngx_rtmp_recv(ngx_event_t *rev)\n{\n    ngx_int_t                   n;\n    ngx_connection_t           *c;\n    ngx_rtmp_session_t         *s;\n    ngx_rtmp_core_srv_conf_t   *cscf;\n    ngx_rtmp_header_t          *h;\n    ngx_rtmp_stream_t          *st, *st0;\n    ngx_chain_t                *in, *head;\n    ngx_buf_t                  *b;\n    u_char                     *p, *pp, *old_pos;\n    size_t                      size, fsize, old_size;\n    uint8_t                     fmt, ext;\n    uint32_t                    csid, timestamp;\n\n    c = rev->data;\n    s = c->data;\n    b = NULL;\n    old_pos = NULL;\n    old_size = 0;\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n\n    if (c->destroyed) {\n        return;\n    }\n\n    if (ngx_rtmp_core_main_conf->fast_reload && (ngx_exiting || ngx_terminate)) {\n        s->finalize_reason = NGX_LIVE_PROCESS_EXIT;\n        ngx_rtmp_finalize_session(s);\n        return;\n    }\n\n    for( ;; ) {\n\n        st = &s->in_streams[s->in_csid];\n\n        /* allocate new buffer */\n        if (st->in == NULL) {\n            st->in = ngx_rtmp_alloc_in_buf(s);\n            if (st->in == NULL) {\n                ngx_log_error(NGX_LOG_INFO, s->log, 0, \"in buf alloc failed\");\n                ngx_rtmp_finalize_session(s);\n                return;\n            }\n        }\n\n        h  = &st->hdr;\n        in = st->in;\n        b  = in->buf;\n\n        if (old_size) {\n\n            ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                    \"reusing formerly read data: %d\", old_size);\n\n            b->pos = b->start;\n            b->last = ngx_movemem(b->pos, old_pos, old_size);\n\n            if (s->in_chunk_size_changing) {\n                ngx_rtmp_finalize_set_chunk_size(s);\n            }\n\n        } else {\n\n            if (old_pos) {\n                b->pos = b->last = b->start;\n            }\n\n            n = c->recv(c, b->last, b->end - b->last);\n\n            if (n == NGX_ERROR || n == 0) {\n                s->finalize_reason = n == 0? NGX_LIVE_NORMAL_CLOSE:\n                                             NGX_LIVE_RTMP_RECV_ERR;\n                ngx_rtmp_finalize_session(s);\n                return;\n            }\n\n            if (n == NGX_AGAIN) {\n                if (ngx_handle_read_event(c->read, 0) != NGX_OK) {\n                    ngx_rtmp_finalize_session(s);\n                }\n                return;\n            }\n\n            s->ping_reset = 1;\n            ngx_rtmp_update_bandwidth(&ngx_rtmp_bw_in, n);\n            b->last += n;\n            s->in_bytes += n;\n\n            if (s->in_bytes >= 0xf0000000) {\n                ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                               \"resetting byte counter\");\n                s->in_bytes = 0;\n                s->in_last_ack = 0;\n            }\n\n            if (s->ack_size && s->in_bytes - s->in_last_ack >= s->ack_size) {\n\n                s->in_last_ack = s->in_bytes;\n\n                ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                        \"sending RTMP ACK(%uD)\", s->in_bytes);\n\n                if (ngx_rtmp_send_ack(s, s->in_bytes)) {\n                    ngx_rtmp_finalize_session(s);\n                    return;\n                }\n            }\n        }\n\n        old_pos = NULL;\n        old_size = 0;\n\n        /* parse headers */\n        if (b->pos == b->start) {\n            p = b->pos;\n\n            /* chunk basic header */\n            fmt  = (*p >> 6) & 0x03;\n            csid = *p++ & 0x3f;\n\n            if (csid == 0) {\n                if (b->last - p < 1)\n                    continue;\n                csid = 64;\n                csid += *(uint8_t*)p++;\n\n            } else if (csid == 1) {\n                if (b->last - p < 2)\n                    continue;\n                csid = 64;\n                csid += *(uint8_t*)p++;\n                csid += (uint32_t)256 * (*(uint8_t*)p++);\n            }\n\n            ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                    \"RTMP bheader fmt=%d csid=%D\",\n                    (int)fmt, csid);\n\n            if (csid >= (uint32_t)cscf->max_streams) {\n                ngx_log_error(NGX_LOG_INFO, s->log, 0,\n                    \"RTMP in chunk stream too big: %D >= %D\",\n                    csid, cscf->max_streams);\n                ngx_rtmp_finalize_session(s);\n                return;\n            }\n\n            /* link orphan */\n            if (s->in_csid == 0) {\n\n                /* unlink from stream #0 */\n                st->in = st->in->next;\n\n                /* link to new stream */\n                s->in_csid = csid;\n                st = &s->in_streams[csid];\n                if (st->in == NULL) {\n                    in->next = in;\n                } else {\n                    in->next = st->in->next;\n                    st->in->next = in;\n                }\n                st->in = in;\n                h = &st->hdr;\n                h->csid = csid;\n            }\n\n            ext = st->ext;\n            timestamp = st->dtime;\n            if (fmt <= 2 ) {\n                if (b->last - p < 3)\n                    continue;\n                /* timestamp:\n                 *  big-endian 3b -> little-endian 4b */\n                pp = (u_char*)&timestamp;\n                pp[2] = *p++;\n                pp[1] = *p++;\n                pp[0] = *p++;\n                pp[3] = 0;\n\n                ext = (timestamp == 0x00ffffff);\n\n                if (fmt <= 1) {\n                    if (b->last - p < 4)\n                        continue;\n                    /* size:\n                     *  big-endian 3b -> little-endian 4b\n                     * type:\n                     *  1b -> 1b*/\n                    pp = (u_char*)&h->mlen;\n                    pp[2] = *p++;\n                    pp[1] = *p++;\n                    pp[0] = *p++;\n                    pp[3] = 0;\n                    h->type = *(uint8_t*)p++;\n\n                    if (fmt == 0) {\n                        if (b->last - p < 4)\n                            continue;\n                        /* stream:\n                         *  little-endian 4b -> little-endian 4b */\n                        pp = (u_char*)&h->msid;\n                        pp[0] = *p++;\n                        pp[1] = *p++;\n                        pp[2] = *p++;\n                        pp[3] = *p++;\n                    }\n                }\n            }\n\n            /* extended header */\n            if (ext) {\n                if (b->last - p < 4)\n                    continue;\n                pp = (u_char*)&timestamp;\n                pp[3] = *p++;\n                pp[2] = *p++;\n                pp[1] = *p++;\n                pp[0] = *p++;\n            }\n\n            if (st->len == 0) {\n                /* Messages with type=3 should\n                 * never have ext timestamp field\n                 * according to standard.\n                 * However that's not always the case\n                 * in real life */\n                st->ext = (ext && cscf->publish_time_fix);\n                if (fmt) {\n                    st->dtime = timestamp;\n                } else {\n                    h->timestamp = timestamp;\n                    st->dtime = 0;\n                }\n            }\n\n            ngx_log_debug8(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                    \"RTMP mheader fmt=%d %s (%d) \"\n                    \"time=%uD+%uD mlen=%D len=%D msid=%D\",\n                    (int)fmt, ngx_rtmp_message_type(h->type), (int)h->type,\n                    h->timestamp, st->dtime, h->mlen, st->len, h->msid);\n\n            /* header done */\n            b->pos = p;\n\n            if (h->mlen > cscf->max_message) {\n                ngx_log_error(NGX_LOG_INFO, s->log, 0,\n                        \"too big message: %uz\", cscf->max_message);\n                ngx_rtmp_finalize_session(s);\n                return;\n            }\n        }\n\n        size = b->last - b->pos;\n        fsize = h->mlen - st->len;\n\n        if (size < ngx_min(fsize, s->in_chunk_size))\n            continue;\n\n        /* buffer is ready */\n\n        if (fsize > s->in_chunk_size) {\n            /* collect fragmented chunks */\n            st->len += s->in_chunk_size;\n            b->last = b->pos + s->in_chunk_size;\n            old_pos = b->last;\n            old_size = size - s->in_chunk_size;\n\n        } else {\n            /* handle! */\n            head = st->in->next;\n            st->in->next = NULL;\n            b->last = b->pos + fsize;\n            old_pos = b->last;\n            old_size = size - fsize;\n            st->len = 0;\n            h->timestamp += st->dtime;\n\n            if (ngx_rtmp_receive_message(s, h, head) != NGX_OK) {\n                ngx_rtmp_finalize_session(s);\n                return;\n            }\n\n            if (s->in_chunk_size_changing) {\n                /* copy old data to a new buffer */\n                if (!old_size) {\n                    ngx_rtmp_finalize_set_chunk_size(s);\n                }\n\n            } else {\n                /* add used bufs to stream #0 */\n                st0 = &s->in_streams[0];\n                st->in->next = st0->in;\n                st0->in = head;\n                st->in = NULL;\n            }\n        }\n\n        s->in_csid = 0;\n    }\n}\n\n\nstatic ngx_flag_t\nngx_rtmp_relative_timestamp(ngx_rtmp_session_t *s, ngx_rtmp_header_t *lh)\n{\n    return 0;\n}\n\nstatic ngx_chain_t *\nngx_rtmp_prepare_out_chain(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_core_srv_conf_t   *cscf;\n    ngx_rtmp_frame_t           *frame;\n    ngx_chain_t                *head, *l, **ll;\n    uint32_t                    mlen, timestamp, ext_timestamp;\n    uint8_t                     fmt, hsize, thsize;\n    static uint8_t              hdrsize[] = { 12, 8, 4, 1 };\n    ngx_flag_t                  relative;\n    ngx_rtmp_header_t           lh;\n    u_char                      th[7], *p, *pp;\n\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n\n    frame = s->out[s->out_pos];\n    head = NULL;\n\n    if (frame->hdr.csid >= (uint32_t)cscf->max_streams) {\n        ngx_log_error(NGX_LOG_INFO, s->log, 0,\n                \"RTMP out chunk stream too big: %D >= %D\",\n                frame->hdr.csid, cscf->max_streams);\n        goto failed;\n    }\n\n    mlen = 0;\n    fmt = 0;\n    relative = ngx_rtmp_relative_timestamp(s, &lh);\n\n    for (l = frame->chain; l; l = l->next) {\n        mlen += ngx_buf_size(l->buf);\n    }\n\n    if (relative && lh.csid && frame->hdr.msid == lh.msid) {\n        ++fmt;\n        if (frame->hdr.type == lh.type && mlen && mlen == lh.mlen) {\n            ++fmt;\n            if (frame->hdr.timestamp == lh.timestamp) {\n                ++fmt;\n            }\n        }\n        timestamp = frame->hdr.timestamp - lh.timestamp;\n    } else {\n        timestamp = frame->hdr.timestamp;\n    }\n\n    hsize = hdrsize[fmt];\n\n    ngx_log_debug7(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"RTMP prep %s (%d) fmt=%d csid=%uD timestamp=%uD mlen=%uD msid=%uD\",\n            ngx_rtmp_message_type(frame->hdr.type), (int)frame->hdr.type,\n            (int)fmt, frame->hdr.csid, timestamp, mlen, frame->hdr.msid);\n\n    ext_timestamp = 0;\n    if (timestamp >= 0x00ffffff) {\n        ext_timestamp = timestamp;\n        timestamp = 0x00ffffff;\n        hsize += 4;\n    }\n\n    if (frame->hdr.csid >= 64) {\n        ++hsize;\n        if (frame->hdr.csid >= 320) {\n            ++hsize;\n        }\n    }\n\n    /* fill initial header */\n    head = ngx_get_chainbuf(NGX_RTMP_MAX_CHUNK_HEADER, 1);\n    if (head == NULL) {\n        goto failed;\n    }\n    p = head->buf->pos;\n\n    /* basic header */\n    *p = (fmt << 6);\n    if (frame->hdr.csid >= 2 && frame->hdr.csid <= 63) {\n        *p++ |= (((uint8_t)frame->hdr.csid) & 0x3f);\n    } else if (frame->hdr.csid >= 64 && frame->hdr.csid < 320) {\n        ++p;\n        *p++ = (uint8_t)(frame->hdr.csid - 64);\n    } else {\n        *p++ |= 1;\n        *p++ = (uint8_t)(frame->hdr.csid - 64);\n        *p++ = (uint8_t)((frame->hdr.csid - 64) >> 8);\n    }\n\n    /* create fmt3 header for successive fragments */\n    thsize = p - head->buf->pos;\n    ngx_memcpy(th, head->buf->pos, thsize);\n    th[0] |= 0xc0;\n\n    /* message header */\n    if (fmt <= 2) {\n        pp = (u_char *)&timestamp;\n        *p++ = pp[2];\n        *p++ = pp[1];\n        *p++ = pp[0];\n        if (fmt <= 1) {\n            pp = (u_char *)&mlen;\n            *p++ = pp[2];\n            *p++ = pp[1];\n            *p++ = pp[0];\n            *p++ = frame->hdr.type;\n            if (fmt == 0) {\n                pp = (u_char *)&frame->hdr.msid;\n                *p++ = pp[0];\n                *p++ = pp[1];\n                *p++ = pp[2];\n                *p++ = pp[3];\n            }\n        }\n    }\n\n    /* extended timestamp */\n    if (ext_timestamp) {\n        pp = (u_char *)&ext_timestamp;\n        *p++ = pp[3];\n        *p++ = pp[2];\n        *p++ = pp[1];\n        *p++ = pp[0];\n\n        /* This CONTRADICTS the standard\n         * but that's the way flash client\n         * wants data to be encoded;\n         * ffmpeg complains */\n        if (cscf->play_time_fix) {\n            ngx_memcpy(&th[thsize], p - 4, 4);\n            thsize += 4;\n        }\n    }\n    head->buf->last = p;\n\n    /* append headers to successive fragments */\n    ll = &head->next;\n    l = frame->chain;\n    while (l && l->buf->pos == l->buf->last) {\n        l = l->next;\n    }\n    if (l == NULL) {\n        return head;\n    }\n\n    *ll = ngx_get_chainbuf(0, 0);\n    (*ll)->buf->pos = l->buf->pos;\n    (*ll)->buf->last = l->buf->last;\n\n    for (l = l->next; l; l = l->next) {\n        /* chunk header */\n        ll = &(*ll)->next;\n        *ll = ngx_get_chainbuf(NGX_RTMP_MAX_CHUNK_HEADER, 1);\n        (*ll)->buf->last = ngx_cpymem((*ll)->buf->last, th, thsize);\n\n        /* payload */\n        ll = &(*ll)->next;\n        *ll = ngx_get_chainbuf(0, 0);\n        (*ll)->buf->pos = l->buf->pos;\n        (*ll)->buf->last = l->buf->last;\n    }\n\n    ngx_rtmp_monitor_frame(s, &frame->hdr, NULL, frame->av_header, 0);\n\n    return head;\n\nfailed:\n    ngx_put_chainbufs(head);\n\n    ngx_rtmp_finalize_session(s);\n    return NULL;\n}\n\nstatic void\nngx_rtmp_send(ngx_event_t *wev)\n{\n    ngx_connection_t           *c;\n    ngx_rtmp_session_t         *s;\n    ngx_int_t                   n;\n    ngx_chain_t                *chain, *cl;\n    off_t                       sent;\n\n    c = wev->data;\n    s = c->data;\n\n    if (c->destroyed) {\n        return;\n    }\n\n    if (wev->timedout) {\n        ngx_log_error(NGX_LOG_INFO, s->log, NGX_ETIMEDOUT, \"client timed out\");\n        c->timedout = 1;\n        s->finalize_reason = NGX_LIVE_RTMP_SEND_TIMEOUT;\n        ngx_rtmp_finalize_session(s);\n        return;\n    }\n\n    if (wev->timer_set) {\n        ngx_del_timer(wev);\n    }\n\n    if (s->prepare_handler == NULL) {\n        s->prepare_handler = ngx_rtmp_prepare_out_chain;\n    }\n\n    if (ngx_rtmp_core_main_conf->fast_reload && (ngx_exiting || ngx_terminate)) {\n        s->finalize_reason = NGX_LIVE_PROCESS_EXIT;\n        ngx_rtmp_finalize_session(s);\n        return;\n    }\n\n    if (ngx_rtmp_prepare_merge_frame(s) == NGX_ERROR) {\n        ngx_rtmp_finalize_session(s);\n        return;\n    }\n\n    while (s->out_chain) {\n        sent = c->sent;\n\n        chain = c->send_chain(c, s->out_chain, 0);\n\n        n = c->sent - sent;\n\n        if (chain == NGX_CHAIN_ERROR) { /* NGX_ERROR */\n            c->error = 1;\n            s->finalize_reason = NGX_LIVE_RTMP_SEND_ERR;\n            ngx_rtmp_finalize_session(s);\n            return;\n        }\n\n        for (cl = s->out_chain; cl != chain;) {\n            s->out_chain = cl->next;\n            ngx_free_chain(s->pool, cl);\n            cl = s->out_chain;\n        }\n\n        if (chain) { /* NGX_AGAIN */\n            ngx_add_timer(c->write, s->timeout);\n            if (ngx_handle_write_event(c->write, 0) != NGX_OK) {\n                ngx_rtmp_finalize_session(s);\n            }\n            return;\n        }\n\n        s->out_bytes += n;\n        s->ping_reset = 1;\n        ngx_rtmp_update_bandwidth(&ngx_rtmp_bw_out, n);\n\n        if (ngx_rtmp_prepare_merge_frame(s) == NGX_ERROR) {\n            ngx_rtmp_finalize_session(s);\n            return;\n        }\n    }\n\n    if (wev->active) {\n        ngx_del_event(wev, NGX_WRITE_EVENT, 0);\n    }\n\n    ngx_event_process_posted((ngx_cycle_t *) ngx_cycle, &s->posted_dry_events);\n}\n\n\nngx_int_t\nngx_rtmp_send_message(ngx_rtmp_session_t *s, ngx_rtmp_frame_t *out,\n        ngx_uint_t priority)\n{\n    ngx_uint_t                      nmsg;\n\n    if (out == NULL) {\n        goto send;\n    }\n\n    nmsg = (s->out_last - s->out_pos) % s->out_queue + 1;\n\n    if (priority > 3) {\n        priority = 3;\n    }\n\n    /* drop packet?\n     * Note we always leave 1 slot free */\n    if (nmsg + priority * s->out_queue / 4 >= s->out_queue) {\n        ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                \"RTMP drop message bufs=%ui, priority=%ui\",\n                nmsg, priority);\n        return NGX_AGAIN;\n    }\n\n    s->out[s->out_last++] = out;\n    s->out_last %= s->out_queue;\n\n    ngx_rtmp_shared_acquire_frame(out);\n\n    ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"RTMP send nmsg=%ui, priority=%ui #%ui\",\n            nmsg, priority, s->out_last);\n\n    if (priority && s->out_buffer && nmsg < s->out_cork) {\n        return NGX_OK;\n    }\n\nsend:\n    if (!s->connection->write->active) {\n        ngx_post_event(s->connection->write, &ngx_posted_events);\n    }\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_receive_message(ngx_rtmp_session_t *s,\n        ngx_rtmp_header_t *h, ngx_chain_t *in)\n{\n    ngx_rtmp_core_main_conf_t  *cmcf;\n    ngx_array_t                *evhs;\n    size_t                      n;\n    ngx_rtmp_handler_pt        *evh;\n\n    cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module);\n\n#ifdef NGX_DEBUG\n    {\n        int             nbufs;\n        ngx_chain_t    *ch;\n\n        for(nbufs = 1, ch = in;\n                ch->next;\n                ch = ch->next, ++nbufs);\n\n        ngx_log_debug7(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                \"RTMP recv %s (%d) csid=%D timestamp=%D \"\n                \"mlen=%D msid=%D nbufs=%d\",\n                ngx_rtmp_message_type(h->type), (int)h->type,\n                h->csid, h->timestamp, h->mlen, h->msid, nbufs);\n    }\n#endif\n\n    if (h->type > NGX_RTMP_MSG_MAX) {\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                \"unexpected RTMP message type: %d\", (int)h->type);\n        return NGX_OK;\n    }\n\n    evhs = &cmcf->events[h->type];\n    evh = evhs->elts;\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0, \"nhandlers: %d\", evhs->nelts);\n\n    for(n = 0; n < evhs->nelts; ++n, ++evh) {\n        if (!evh) {\n            continue;\n        }\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0, \"calling handler %d\", n);\n\n        switch ((*evh)(s, h, in)) {\n            case NGX_ERROR:\n                ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                        \"handler %d failed\", n);\n                return NGX_ERROR;\n            case NGX_DONE:\n                return NGX_OK;\n        }\n    }\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_set_chunk_size(ngx_rtmp_session_t *s, ngx_uint_t size)\n{\n    ngx_rtmp_core_srv_conf_t           *cscf;\n    ngx_chain_t                        *li, *fli, *lo, *flo;\n    ngx_buf_t                          *bi, *bo;\n    ngx_int_t                           n;\n\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n\n    s->in_old_pool = s->in_pool;\n    s->in_chunk_size = size;\n    s->in_pool = NGX_CREATE_POOL(4096, ngx_cycle->log);\n\n    /* copy existing chunk data */\n    if (s->in_old_pool) {\n        s->in_chunk_size_changing = 1;\n        s->in_streams[0].in = NULL;\n\n        for(n = 1; n < cscf->max_streams; ++n) {\n            /* stream buffer is circular\n             * for all streams except for the current one\n             * (which caused this chunk size change);\n             * we can simply ignore it */\n            li = s->in_streams[n].in;\n            if (li == NULL || li->next == NULL) {\n                s->in_streams[n].in = NULL;\n                continue;\n            }\n            /* move from last to the first */\n            li = li->next;\n            fli = li;\n            lo = ngx_rtmp_alloc_in_buf(s);\n            if (lo == NULL) {\n                return NGX_ERROR;\n            }\n            flo = lo;\n            for ( ;; ) {\n                bi = li->buf;\n                bo = lo->buf;\n\n                if (bo->end - bo->last >= bi->last - bi->pos) {\n                    bo->last = ngx_cpymem(bo->last, bi->pos,\n                            bi->last - bi->pos);\n                    li = li->next;\n                    if (li == fli)  {\n                        lo->next = flo;\n                        s->in_streams[n].in = lo;\n                        break;\n                    }\n                    continue;\n                }\n\n                bi->pos += (ngx_cpymem(bo->last, bi->pos,\n                            bo->end - bo->last) - bo->last);\n                lo->next = ngx_rtmp_alloc_in_buf(s);\n                lo = lo->next;\n                if (lo == NULL) {\n                    return NGX_ERROR;\n                }\n            }\n        }\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_finalize_set_chunk_size(ngx_rtmp_session_t *s)\n{\n    if (s->in_chunk_size_changing && s->in_old_pool) {\n        NGX_DESTROY_POOL(s->in_old_pool);\n        s->in_old_pool = NULL;\n        s->in_chunk_size_changing = 0;\n    }\n    return NGX_OK;\n}\n\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_handshake.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n\n#include <openssl/hmac.h>\n#include <openssl/sha.h>\n\n\nstatic void ngx_rtmp_handshake_send(ngx_event_t *wev);\nstatic void ngx_rtmp_handshake_recv(ngx_event_t *rev);\nstatic void ngx_rtmp_handshake_done(ngx_rtmp_session_t *s);\n\n\n/* RTMP handshake :\n *\n *          =peer1=                      =peer2=\n * challenge ----> (.....[digest1]......) ----> 1537 bytes\n * response  <---- (...........[digest2]) <---- 1536 bytes\n *\n *\n * - both packets contain random bytes except for digests\n * - digest1 position is calculated on random packet bytes\n * - digest2 is always at the end of the packet\n *\n * digest1: HMAC_SHA256(packet, peer1_partial_key)\n * digest2: HMAC_SHA256(packet, HMAC_SHA256(digest1, peer2_full_key))\n */\n\n\n/* Handshake keys */\nstatic u_char\nngx_rtmp_server_key[] = {\n    'G', 'e', 'n', 'u', 'i', 'n', 'e', ' ', 'A', 'd', 'o', 'b', 'e', ' ',\n    'F', 'l', 'a', 's', 'h', ' ', 'M', 'e', 'd', 'i', 'a', ' ',\n    'S', 'e', 'r', 'v', 'e', 'r', ' ',\n    '0', '0', '1',\n\n    0xF0, 0xEE, 0xC2, 0x4A, 0x80, 0x68, 0xBE, 0xE8, 0x2E, 0x00, 0xD0, 0xD1,\n    0x02, 0x9E, 0x7E, 0x57, 0x6E, 0xEC, 0x5D, 0x2D, 0x29, 0x80, 0x6F, 0xAB,\n    0x93, 0xB8, 0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE\n};\n\n\nstatic u_char\nngx_rtmp_client_key[] = {\n    'G', 'e', 'n', 'u', 'i', 'n', 'e', ' ', 'A', 'd', 'o', 'b', 'e', ' ',\n    'F', 'l', 'a', 's', 'h', ' ', 'P', 'l', 'a', 'y', 'e', 'r', ' ',\n    '0', '0', '1',\n\n    0xF0, 0xEE, 0xC2, 0x4A, 0x80, 0x68, 0xBE, 0xE8, 0x2E, 0x00, 0xD0, 0xD1,\n    0x02, 0x9E, 0x7E, 0x57, 0x6E, 0xEC, 0x5D, 0x2D, 0x29, 0x80, 0x6F, 0xAB,\n    0x93, 0xB8, 0xE6, 0x36, 0xCF, 0xEB, 0x31, 0xAE\n};\n\n\nstatic const u_char\nngx_rtmp_server_version[4] = {\n    0x0D, 0x0E, 0x0A, 0x0D\n};\n\n\nstatic const u_char\nngx_rtmp_client_version[4] = {\n    0x0C, 0x00, 0x0D, 0x0E\n};\n\n\n#define NGX_RTMP_HANDSHAKE_KEYLEN                   SHA256_DIGEST_LENGTH\n#define NGX_RTMP_HANDSHAKE_BUFSIZE                  3073\n#define NGX_RTMP_HANDSHAKE_CHALLENGE_SIZE           1537\n\n\n#define NGX_RTMP_HANDSHAKE_SERVER_RECV_CHALLENGE    1\n#define NGX_RTMP_HANDSHAKE_SERVER_SEND_CHALLRESP    2\n#define NGX_RTMP_HANDSHAKE_SERVER_RECV_RESPONSE     3\n#define NGX_RTMP_HANDSHAKE_SERVER_DONE              4\n\n\n#define NGX_RTMP_HANDSHAKE_CLIENT_SEND_CHALLENGE    6\n#define NGX_RTMP_HANDSHAKE_CLIENT_RECV_CHALLENGE    7\n#define NGX_RTMP_HANDSHAKE_CLIENT_RECV_RESPONSE     8\n#define NGX_RTMP_HANDSHAKE_CLIENT_SEND_RESPONSE     9\n#define NGX_RTMP_HANDSHAKE_CLIENT_DONE              10\n\n\nstatic ngx_str_t            ngx_rtmp_server_full_key\n    = { sizeof(ngx_rtmp_server_key), ngx_rtmp_server_key };\nstatic ngx_str_t            ngx_rtmp_server_partial_key\n    = { 36, ngx_rtmp_server_key };\n\nstatic ngx_str_t            ngx_rtmp_client_full_key\n    = { sizeof(ngx_rtmp_client_key), ngx_rtmp_client_key };\nstatic ngx_str_t            ngx_rtmp_client_partial_key\n    = { 30, ngx_rtmp_client_key };\n\n\nstatic ngx_int_t\nngx_rtmp_make_digest(ngx_str_t *key, ngx_buf_t *src,\n        u_char *skip, u_char *dst, ngx_log_t *log)\n{\n    static HMAC_CTX        *hmac;\n    unsigned int            len;\n\n    if (hmac == NULL) {\n#if OPENSSL_VERSION_NUMBER < 0x10100000L\n        static HMAC_CTX  shmac;\n        hmac = &shmac;\n        HMAC_CTX_init(hmac);\n#else\n        hmac = HMAC_CTX_new();\n        if (hmac == NULL) {\n            return NGX_ERROR;\n        }\n#endif\n    }\n\n    HMAC_Init_ex(hmac, key->data, key->len, EVP_sha256(), NULL);\n\n    if (skip && src->pos <= skip && skip <= src->last) {\n        if (skip != src->pos) {\n            HMAC_Update(hmac, src->pos, skip - src->pos);\n        }\n        if (src->last != skip + NGX_RTMP_HANDSHAKE_KEYLEN) {\n            HMAC_Update(hmac, skip + NGX_RTMP_HANDSHAKE_KEYLEN,\n                    src->last - skip - NGX_RTMP_HANDSHAKE_KEYLEN);\n        }\n    } else {\n        HMAC_Update(hmac, src->pos, src->last - src->pos);\n    }\n\n    HMAC_Final(hmac, dst, &len);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_find_digest(ngx_buf_t *b, ngx_str_t *key, size_t base, ngx_log_t *log)\n{\n    size_t                  n, offs;\n    u_char                  digest[NGX_RTMP_HANDSHAKE_KEYLEN];\n    u_char                 *p;\n\n    offs = 0;\n    for (n = 0; n < 4; ++n) {\n        offs += b->pos[base + n];\n    }\n    offs = (offs % 728) + base + 4;\n    p = b->pos + offs;\n\n    if (ngx_rtmp_make_digest(key, b, p, digest, log) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    if (ngx_memcmp(digest, p, NGX_RTMP_HANDSHAKE_KEYLEN) == 0) {\n        return offs;\n    }\n\n    return NGX_ERROR;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_write_digest(ngx_buf_t *b, ngx_str_t *key, size_t base,\n        ngx_log_t *log)\n{\n    size_t                  n, offs;\n    u_char                 *p;\n\n    offs = 0;\n    for (n = 8; n < 12; ++n) {\n        offs += b->pos[base + n];\n    }\n    offs = (offs % 728) + base + 12;\n    p = b->pos + offs;\n\n    if (ngx_rtmp_make_digest(key, b, p, p, log) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic void\nngx_rtmp_fill_random_buffer(ngx_buf_t *b, u_char *end)\n{\n    for (; b->last != end; ++b->last) {\n        *b->last = (u_char) rand();\n    }\n}\n\n\nstatic ngx_buf_t *\nngx_rtmp_alloc_handshake_buffer(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_core_srv_conf_t   *cscf;\n    ngx_chain_t                *cl;\n    ngx_buf_t                  *b;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"handshake: allocating buffer\");\n\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n\n    if (cscf->free_hs) {\n        cl = cscf->free_hs;\n        b = cl->buf;\n        cscf->free_hs = cl->next;\n        ngx_free_chain(cscf->pool, cl);\n\n    } else {\n        b = ngx_pcalloc(cscf->pool, sizeof(ngx_buf_t));\n        if (b == NULL) {\n            return NULL;\n        }\n        b->memory = 1;\n        b->start = ngx_pcalloc(cscf->pool, NGX_RTMP_HANDSHAKE_BUFSIZE);\n        if (b->start == NULL) {\n            return NULL;\n        }\n        b->end = b->start + NGX_RTMP_HANDSHAKE_BUFSIZE;\n    }\n\n    b->pos = b->last = b->start;\n\n    return b;\n}\n\n\nvoid\nngx_rtmp_free_handshake_buffers(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_core_srv_conf_t   *cscf;\n    ngx_chain_t                *cl;\n\n    if (s->hs_buf == NULL) {\n        return;\n    }\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n    cl = ngx_alloc_chain_link(cscf->pool);\n    if (cl == NULL) {\n        return;\n    }\n    cl->buf = s->hs_buf;\n    cl->next = cscf->free_hs;\n    cscf->free_hs = cl;\n    s->hs_buf = NULL;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_handshake_create_challenge(ngx_rtmp_session_t *s,\n        const u_char version[4], ngx_str_t *key)\n{\n    ngx_buf_t          *b;\n    u_char             *end;\n\n    b = s->hs_buf;\n    b->last = b->pos = b->start;\n    end = b->start + NGX_RTMP_HANDSHAKE_CHALLENGE_SIZE;\n    *b->last++ = '\\x03';\n    b->last = ngx_rtmp_rcpymem(b->last, &s->epoch, 4);\n    b->last = ngx_cpymem(b->last, version, 4);\n    ngx_rtmp_fill_random_buffer(b, end);\n    ++b->pos;\n    if (ngx_rtmp_write_digest(b, key, 0, s->log) != NGX_OK) {\n        return NGX_ERROR;\n    }\n    --b->pos;\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_handshake_parse_challenge(ngx_rtmp_session_t *s,\n        ngx_str_t *peer_key, ngx_str_t *key)\n{\n    ngx_buf_t              *b;\n    u_char                 *p;\n    ngx_int_t               offs;\n\n    b = s->hs_buf;\n    if (*b->pos != '\\x03') {\n        ngx_log_error(NGX_LOG_INFO, s->log, 0,\n                \"handshake: unexpected RTMP version: %i\",\n                (ngx_int_t)*b->pos);\n        return NGX_ERROR;\n    }\n    ++b->pos;\n    s->peer_epoch = 0;\n    ngx_rtmp_rmemcpy(&s->peer_epoch, b->pos, 4);\n\n    p = b->pos + 4;\n    ngx_log_debug5(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"handshake: peer version=%i.%i.%i.%i epoch=%uD\",\n            (ngx_int_t)p[3], (ngx_int_t)p[2],\n            (ngx_int_t)p[1], (ngx_int_t)p[0],\n            (uint32_t)s->peer_epoch);\n    if (*(uint32_t *)p == 0) {\n        s->hs_old = 1;\n        return NGX_OK;\n    }\n\n    offs = ngx_rtmp_find_digest(b, peer_key, 772, s->log);\n    if (offs == NGX_ERROR) {\n        offs = ngx_rtmp_find_digest(b, peer_key, 8, s->log);\n    }\n    if (offs == NGX_ERROR) {\n        ngx_log_error(NGX_LOG_INFO, s->log, 0, \"handshake: digest not found\");\n        s->hs_old = 1;\n        return NGX_OK;\n    }\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"handshake: digest found at pos=%i\", offs);\n    b->pos += offs;\n    b->last = b->pos + NGX_RTMP_HANDSHAKE_KEYLEN;\n    s->hs_digest = ngx_palloc(s->pool, NGX_RTMP_HANDSHAKE_KEYLEN);\n    if (ngx_rtmp_make_digest(key, b, NULL, s->hs_digest, s->log)\n            != NGX_OK)\n    {\n        return NGX_ERROR;\n    }\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_handshake_create_response(ngx_rtmp_session_t *s)\n{\n    ngx_buf_t          *b;\n    u_char             *p, *pos;\n    ngx_str_t           key;\n\n    b = s->hs_buf;\n    pos = b->pos;\n    b->pos = b->start + NGX_RTMP_HANDSHAKE_CHALLENGE_SIZE;\n    ngx_rtmp_fill_random_buffer(b, b->end);\n    if (s->hs_digest) {\n        p = b->last - NGX_RTMP_HANDSHAKE_KEYLEN;\n        key.data = s->hs_digest;\n        key.len = NGX_RTMP_HANDSHAKE_KEYLEN;\n        if (ngx_rtmp_make_digest(&key, b, p, p, s->log) != NGX_OK) {\n            return NGX_ERROR;\n        }\n    }\n    b->pos = pos;\n\n    return NGX_OK;\n}\n\n\nstatic void\nngx_rtmp_handshake_done(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_free_handshake_buffers(s);\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"handshake: done\");\n\n    if (ngx_rtmp_fire_event(s, NGX_RTMP_HANDSHAKE_DONE,\n                NULL, NULL) != NGX_OK)\n    {\n        ngx_rtmp_finalize_session(s);\n        return;\n    }\n\n    s->stage = NGX_LIVE_HANDSHAKE_DONE;\n    s->handshake_done_time = ngx_current_msec;\n\n    ngx_rtmp_cycle(s);\n}\n\n\nstatic void\nngx_rtmp_handshake_recv(ngx_event_t *rev)\n{\n    ssize_t                     n;\n    ngx_connection_t           *c;\n    ngx_rtmp_session_t         *s;\n    ngx_buf_t                  *b;\n\n    c = rev->data;\n    s = c->data;\n\n    if (c->destroyed) {\n        return;\n    }\n\n    if (rev->timedout) {\n        ngx_log_error(NGX_LOG_INFO, s->log, NGX_ETIMEDOUT,\n                \"handshake: recv: client timed out\");\n        c->timedout = 1;\n        ngx_rtmp_finalize_session(s);\n        return;\n    }\n\n    if (rev->timer_set) {\n        ngx_del_timer(rev);\n    }\n\n    b = s->hs_buf;\n\n    while (b->last != b->end) {\n        n = c->recv(c, b->last, b->end - b->last);\n\n        if (n == NGX_ERROR || n == 0) {\n            ngx_rtmp_finalize_session(s);\n            return;\n        }\n\n        if (n == NGX_AGAIN) {\n            ngx_add_timer(rev, s->timeout);\n            if (ngx_handle_read_event(c->read, 0) != NGX_OK) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                        \"handshake: recv: handle read event error\");\n                ngx_rtmp_finalize_session(s);\n            }\n            return;\n        }\n\n        b->last += n;\n    }\n\n    if (rev->active) {\n        ngx_del_event(rev, NGX_READ_EVENT, 0);\n    }\n\n    ++s->hs_stage;\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"handshake: stage %ui\", s->hs_stage);\n\n    switch (s->hs_stage) {\n        case NGX_RTMP_HANDSHAKE_SERVER_SEND_CHALLRESP:\n            if (ngx_rtmp_handshake_parse_challenge(s,\n                    &ngx_rtmp_client_partial_key,\n                    &ngx_rtmp_server_full_key) != NGX_OK)\n            {\n                ngx_log_error(NGX_LOG_INFO, s->log, 0,\n                        \"handshake: error parsing challenge\");\n                ngx_rtmp_finalize_session(s);\n                return;\n            }\n\n            // create version and challege\n            if (ngx_rtmp_handshake_create_challenge(s, ngx_rtmp_server_version,\n                    &ngx_rtmp_server_partial_key) != NGX_OK)\n            {\n                ngx_log_error(NGX_LOG_INFO, s->log, 0,\n                        \"handshake: error creating challenge\");\n                ngx_rtmp_finalize_session(s);\n                return;\n            }\n\n            // create response\n            if (s->hs_old) {\n                ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                        \"handshake: old-style response\");\n                s->hs_buf->last = s->hs_buf->end;\n            } else if (ngx_rtmp_handshake_create_response(s) != NGX_OK) {\n                ngx_log_error(NGX_LOG_INFO, s->log, 0,\n                        \"handshake: response error\");\n                ngx_rtmp_finalize_session(s);\n                return;\n            }\n\n            ngx_rtmp_handshake_send(c->write);\n            break;\n\n        case NGX_RTMP_HANDSHAKE_SERVER_DONE:\n            ngx_rtmp_handshake_done(s);\n            break;\n\n        case NGX_RTMP_HANDSHAKE_CLIENT_RECV_RESPONSE:\n            if (ngx_rtmp_handshake_parse_challenge(s,\n                    &ngx_rtmp_server_partial_key,\n                    &ngx_rtmp_client_full_key) != NGX_OK)\n            {\n                ngx_log_error(NGX_LOG_INFO, s->log, 0,\n                        \"handshake: error parsing challenge\");\n                ngx_rtmp_finalize_session(s);\n                return;\n            }\n            s->hs_buf->pos = s->hs_buf->last = s->hs_buf->start\n                           + NGX_RTMP_HANDSHAKE_CHALLENGE_SIZE;\n            ngx_rtmp_handshake_recv(c->read);\n            break;\n\n        case NGX_RTMP_HANDSHAKE_CLIENT_SEND_RESPONSE:\n            if (ngx_rtmp_handshake_create_response(s) != NGX_OK) {\n                ngx_log_error(NGX_LOG_INFO, s->log, 0,\n                        \"handshake: response error\");\n                ngx_rtmp_finalize_session(s);\n                return;\n            }\n            ngx_rtmp_handshake_send(c->write);\n            break;\n    }\n}\n\n\nstatic void\nngx_rtmp_handshake_send(ngx_event_t *wev)\n{\n    ngx_int_t                   n;\n    ngx_connection_t           *c;\n    ngx_rtmp_session_t         *s;\n    ngx_buf_t                  *b;\n\n    c = wev->data;\n    s = c->data;\n\n    if (c->destroyed) {\n        return;\n    }\n\n    if (wev->timedout) {\n        ngx_log_error(NGX_LOG_INFO, s->log, NGX_ETIMEDOUT,\n                \"handshake: send: client timed out\");\n        c->timedout = 1;\n        ngx_rtmp_finalize_session(s);\n        return;\n    }\n\n    if (wev->timer_set) {\n        ngx_del_timer(wev);\n    }\n\n    b = s->hs_buf;\n\n    while(b->pos != b->last) {\n        n = c->send(c, b->pos, b->last - b->pos);\n\n        if (n == NGX_ERROR) {\n            ngx_rtmp_finalize_session(s);\n            return;\n        }\n\n        if (n == NGX_AGAIN || n == 0) {\n            ngx_add_timer(c->write, s->timeout);\n            if (ngx_handle_write_event(c->write, 0) != NGX_OK) {\n                ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                        \"handshake: recv: handle write event error\");\n                ngx_rtmp_finalize_session(s);\n            }\n            return;\n        }\n\n        b->pos += n;\n    }\n\n    if (wev->active) {\n        ngx_del_event(wev, NGX_WRITE_EVENT, 0);\n    }\n\n    ++s->hs_stage;\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"handshake: stage %ui\", s->hs_stage);\n\n    switch (s->hs_stage) {\n\n        case NGX_RTMP_HANDSHAKE_SERVER_RECV_RESPONSE:\n            s->hs_buf->last = s->hs_buf->start\n                            + NGX_RTMP_HANDSHAKE_CHALLENGE_SIZE;\n            ngx_rtmp_handshake_recv(c->read);\n            break;\n\n        case NGX_RTMP_HANDSHAKE_CLIENT_RECV_CHALLENGE:\n            s->hs_buf->pos = s->hs_buf->last = s->hs_buf->end\n                           - NGX_RTMP_HANDSHAKE_CHALLENGE_SIZE;\n            ngx_rtmp_handshake_recv(c->read);\n            break;\n\n        case NGX_RTMP_HANDSHAKE_CLIENT_DONE:\n            ngx_rtmp_handshake_done(s);\n            break;\n    }\n}\n\n\nvoid\nngx_rtmp_handshake(ngx_rtmp_session_t *s)\n{\n    ngx_connection_t           *c;\n\n    c = s->connection;\n    c->read->handler =  ngx_rtmp_handshake_recv;\n    c->write->handler = ngx_rtmp_handshake_send;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"handshake: start server handshake\");\n\n    s->hs_buf = ngx_rtmp_alloc_handshake_buffer(s);\n    s->hs_buf->pos = s->hs_buf->last = s->hs_buf->end\n                   - NGX_RTMP_HANDSHAKE_CHALLENGE_SIZE;\n    s->hs_stage = NGX_RTMP_HANDSHAKE_SERVER_RECV_CHALLENGE;\n\n    ngx_rtmp_handshake_recv(c->read);\n}\n\n\nvoid\nngx_rtmp_client_handshake(ngx_rtmp_session_t *s, unsigned async)\n{\n    ngx_connection_t           *c;\n\n    c = s->connection;\n    c->read->handler =  ngx_rtmp_handshake_recv;\n    c->write->handler = ngx_rtmp_handshake_send;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"handshake: start client handshake\");\n\n    s->hs_buf = ngx_rtmp_alloc_handshake_buffer(s);\n    s->hs_stage = NGX_RTMP_HANDSHAKE_CLIENT_SEND_CHALLENGE;\n\n    if (ngx_rtmp_handshake_create_challenge(s,\n                ngx_rtmp_client_version,\n                &ngx_rtmp_client_partial_key) != NGX_OK)\n    {\n        ngx_rtmp_finalize_session(s);\n        return;\n    }\n\n    if (async) {\n        ngx_add_timer(c->write, s->timeout);\n        if (ngx_handle_write_event(c->write, 0) != NGX_OK) {\n            ngx_rtmp_finalize_session(s);\n        }\n        return;\n    }\n\n    ngx_rtmp_handshake_send(c->write);\n}\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_init.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_cmd_module.h\"\n#include \"ngx_live_relay.h\"\n#include \"ngx_rtmp_proxy_protocol.h\"\n#include \"ngx_http_client.h\"\n#include \"ngx_rbuf.h\"\n#include \"ngx_poold.h\"\n\n\nstatic void ngx_rtmp_close_connection(ngx_connection_t *c);\nstatic u_char * ngx_rtmp_log_error(ngx_log_t *log, u_char *buf, size_t len);\n\n\ntypedef struct {\n    ngx_str_t              *client;\n    ngx_rtmp_session_t     *session;\n    void                   *data;       // combined log\n    ngx_log_handler_pt      handler;    // combined log handler\n} ngx_rtmp_error_log_ctx_t;\n\n\nchar *ngx_live_stage[] = {\n    \"init\",\n    \"handshake_done\",\n    \"connect\",\n    \"create_stream\",\n    \"publish\",\n    \"play\",\n    \"audio_video\",\n    \"close_stream\",\n};\n\n\nchar *ngx_live_err[] = {\n    \"internal_err\",\n    \"normal_close\",\n    \"rtmp_send_err\",\n    \"rtmp_send_timeout\",\n    \"flv_send_err\",\n    \"flv_send_timeout\",\n    \"rtmp_recv_err\",\n    \"flv_recv_err\",\n    \"relay_transit\",\n    \"relay_timeout\",\n    \"control_drop\",\n    \"drop_idle\",\n    \"notify_notify_err\",\n    \"notify_relay_err\",\n    \"notify_para_err\",\n    \"relay_close\",\n    \"process_exit\",\n};\n\n\nvoid\nngx_rtmp_init_connection(ngx_connection_t *c)\n{\n    ngx_uint_t             i;\n    ngx_rtmp_port_t       *port;\n    struct sockaddr       *sa;\n    struct sockaddr_in    *sin;\n    ngx_rtmp_in_addr_t    *addr;\n    ngx_rtmp_session_t    *s;\n    ngx_rtmp_addr_conf_t  *addr_conf;\n    ngx_int_t              unix_socket;\n#if (NGX_HAVE_INET6)\n    struct sockaddr_in6   *sin6;\n    ngx_rtmp_in6_addr_t   *addr6;\n#endif\n\n    ++ngx_rtmp_naccepted;\n\n    /* find the server configuration for the address:port */\n\n    /* AF_INET only */\n\n    port = c->listening->servers;\n    unix_socket = 0;\n\n    if (port->naddrs > 1) {\n\n        /*\n         * There are several addresses on this port and one of them\n         * is the \"*:port\" wildcard so getsockname() is needed to determine\n         * the server address.\n         *\n         * AcceptEx() already gave this address.\n         */\n\n        if (ngx_connection_local_sockaddr(c, NULL, 0) != NGX_OK) {\n            ngx_rtmp_close_connection(c);\n            return;\n        }\n\n        sa = c->local_sockaddr;\n\n        switch (sa->sa_family) {\n\n#if (NGX_HAVE_INET6)\n        case AF_INET6:\n            sin6 = (struct sockaddr_in6 *) sa;\n\n            addr6 = port->addrs;\n\n            /* the last address is \"*\" */\n\n            for (i = 0; i < port->naddrs - 1; i++) {\n                if (ngx_memcmp(&addr6[i].addr6, &sin6->sin6_addr, 16) == 0) {\n                    break;\n                }\n            }\n\n            addr_conf = &addr6[i].conf;\n\n            break;\n#endif\n\n        case AF_UNIX:\n            unix_socket = 1;\n\n            sin = (struct sockaddr_in *) sa;\n\n            addr = port->addrs;\n\n            /* the last address is \"*\" */\n\n            for (i = 0; i < port->naddrs - 1; i++) {\n                if (addr[i].addr == sin->sin_addr.s_addr) {\n                    break;\n                }\n            }\n\n            addr_conf = &addr[i].conf;\n\n            break;\n\n        default: /* AF_INET */\n            sin = (struct sockaddr_in *) sa;\n\n            addr = port->addrs;\n\n            /* the last address is \"*\" */\n\n            for (i = 0; i < port->naddrs - 1; i++) {\n                if (addr[i].addr == sin->sin_addr.s_addr) {\n                    break;\n                }\n            }\n\n            addr_conf = &addr[i].conf;\n\n            break;\n        }\n\n    } else {\n        switch (c->local_sockaddr->sa_family) {\n\n#if (NGX_HAVE_INET6)\n        case AF_INET6:\n            addr6 = port->addrs;\n            addr_conf = &addr6[0].conf;\n            break;\n#endif\n\n        case AF_UNIX:\n            unix_socket = 1;\n            addr = port->addrs;\n            addr_conf = &addr[0].conf;\n            break;\n\n        default: /* AF_INET */\n            addr = port->addrs;\n            addr_conf = &addr[0].conf;\n            break;\n        }\n    }\n\n    ngx_log_error(NGX_LOG_INFO, c->log, 0, \"*%ui client connected '%V'\",\n                  c->number, &c->addr_text);\n\n    s = ngx_rtmp_create_session(addr_conf);\n    if (s == NULL) {\n        ngx_log_error(NGX_LOG_INFO, c->log, 0, \"create rtmp session failed\");\n        return;\n    }\n    s->log->connection = c->number;\n    s->number = c->number;\n    s->remote_addr_text.data = ngx_pcalloc(s->pool, c->addr_text.len);\n    s->remote_addr_text.len = c->addr_text.len;\n    ngx_memcpy(s->remote_addr_text.data, c->addr_text.data, c->addr_text.len);\n    s->sockaddr = ngx_pcalloc(s->pool, sizeof(struct sockaddr));\n    ngx_memcpy(s->sockaddr, c->sockaddr, sizeof(struct sockaddr));\n\n    ngx_rtmp_init_session(s, c);\n\n    /* only auto-pushed connections are\n     * done through unix socket */\n\n    s->interprocess = unix_socket;\n\n    if (addr_conf->proxy_protocol) {\n        ngx_rtmp_proxy_protocol(s);\n\n    } else {\n        ngx_rtmp_handshake(s);\n    }\n}\n\n\nstatic u_char *\nngx_rtmp_log_error(ngx_log_t *log, u_char *buf, size_t len)\n{\n    u_char                     *p;\n    ngx_rtmp_session_t         *s;\n    ngx_rtmp_error_log_ctx_t   *ctx;\n\n    p = buf;\n\n    ctx = log->data;\n\n    if (ctx->client) {\n        p = ngx_snprintf(buf, len, \", client: %V\", ctx->client);\n        len -= p - buf;\n        buf = p;\n    }\n\n    s = ctx->session;\n\n    if (s == NULL) {\n        return p;\n    }\n\n    p = ngx_snprintf(buf, len, \", server: %V, session: %p\", s->addr_text, s);\n    len -= p - buf;\n    buf = p;\n\n    if (s->stream.len) {\n        p = ngx_snprintf(buf, len, \", stream: %V\", &s->stream);\n        len -= p - buf;\n        buf = p;\n    }\n\n    if (ctx->data) { // combined log\n        log->data = ctx->data;\n        p = ctx->handler(log, p, len);\n        log->data = ctx;\n    }\n\n    return p;\n}\n\n\nstatic void\nngx_rtmp_close_connection(ngx_connection_t *c)\n{\n    ngx_pool_t                         *pool;\n\n    if (c == NULL) {\n        return;\n    }\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, c->log, 0, \"close connection\");\n\n#if (NGX_STAT_STUB)\n    (void) ngx_atomic_fetch_add(ngx_stat_active, -1);\n#endif\n\n    pool = c->pool;\n    ngx_close_connection(c);\n    ngx_destroy_pool(pool);\n}\n\n\nstatic void\nngx_rtmp_close_session(ngx_rtmp_session_t *s)\n{\n    if (s->ping_evt.timer_set) {\n        ngx_del_timer(&s->ping_evt);\n    }\n\n    if (s->in_old_pool) {\n        NGX_DESTROY_POOL(s->in_old_pool);\n        s->in_old_pool = NULL;\n    }\n\n    if (s->in_pool) {\n        NGX_DESTROY_POOL(s->in_pool);\n        s->in_pool = NULL;\n    }\n\n    if (s->live_type == NGX_HTTP_FLV_LIVE) {\n        ngx_put_chainbufs(s->in_streams[0].in);\n    }\n\n    ngx_rtmp_free_handshake_buffers(s);\n\n    ngx_rtmp_free_merge_frame(s);\n\n    if (s->live_type == NGX_MPEGTS_LIVE) {\n        while (s->out_pos != s->out_last) {\n            ngx_rtmp_shared_free_mpegts_frame(s->mpegts_out[s->out_pos++]);\n            s->out_pos %= s->out_queue;\n        }\n    } else {\n        while (s->out_pos != s->out_last) {\n            ngx_rtmp_shared_free_frame(s->out[s->out_pos++]);\n            s->out_pos %= s->out_queue;\n        }\n    }\n\n    if (s->pool) {\n        NGX_DESTROY_POOL(s->pool);\n    }\n}\n\n\nstatic void\nngx_rtmp_close_session_handler(ngx_event_t *e)\n{\n    ngx_rtmp_session_t                 *s;\n    ngx_connection_t                   *c;\n\n    s = e->data;\n    c = s->connection;\n    if (c) {\n        c->destroyed = 1;\n    }\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0, \"async close session\");\n\n    ngx_rtmp_fire_event(s, NGX_RTMP_DISCONNECT, NULL, NULL);\n\n    // close connection before session, connection log use session log\n    // may cause memory error\n    ngx_rtmp_close_connection(c);\n\n    ngx_rtmp_close_session(s);\n}\n\n\nstatic void\nngx_rtmp_async_finalize_http_client(ngx_event_t *ev)\n{\n    ngx_rtmp_session_t         *s;\n    ngx_http_request_t         *hcr;\n\n    s = ev->data;\n    hcr = s->request;\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0, \"asyn finalize http client\");\n\n    if (hcr) {\n        ngx_http_client_finalize_request(hcr, 1);\n    }\n}\n\n\nstatic void\nngx_rtmp_async_finalize_http_request(ngx_event_t *ev)\n{\n    ngx_rtmp_session_t         *s;\n    ngx_http_request_t         *r;\n\n    s = ev->data;\n    r = s->request;\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0, \"asyn finalize http request\");\n\n    if (!r) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0, \"Http request is null\");\n        return;\n    }\n\n    if (r->header_sent) {\n        ngx_http_finalize_request(r, NGX_HTTP_CLIENT_CLOSED_REQUEST);\n        ngx_http_run_posted_requests(r->connection);\n    } else {\n        r->error_page = 1;\n\n        if (s->status) {\n            ngx_http_finalize_request(r, s->status);\n        } else {\n            ngx_http_finalize_request(r, NGX_HTTP_SERVICE_UNAVAILABLE);\n        }\n    }\n}\n\n\nvoid\nngx_rtmp_finalize_session(ngx_rtmp_session_t *s)\n{\n    ngx_event_t        *e;\n    ngx_connection_t   *c;\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0, \"finalize session\");\n\n    if (s->live_type == NGX_HLS_LIVE) {\n        ngx_rtmp_finalize_fake_session(s);\n        return;\n    }\n\n    c = s->connection;\n    if (c && c->destroyed) {\n        return;\n    }\n\n    if (s->finalized) {\n        ngx_log_error(NGX_LOG_WARN, s->log, 0, \"The session has been finalized.\");\n        return;\n    }\n\n    s->finalized = 1;\n\n    if (s->live_type != NGX_RTMP_LIVE) {\n        e = &s->close;\n        e->data = s;\n        if (s->relay) {\n            e->handler = ngx_rtmp_async_finalize_http_client;\n        } else {\n            e->handler = ngx_rtmp_async_finalize_http_request;\n        }\n        e->log = s->log;\n\n        ngx_post_event(e, &ngx_posted_events);\n\n        return;\n    }\n\n    e = &s->close;\n    e->data = s;\n    e->handler = ngx_rtmp_close_session_handler;\n    e->log = s->log;\n\n    ngx_post_event(e, &ngx_posted_events);\n}\n\n\n// session combined with http request or http client request\nvoid\nngx_rtmp_finalize_fake_session(ngx_rtmp_session_t *s)\n{\n    ngx_log_error(NGX_LOG_INFO, s->log, 0, \"finalize fake session\");\n\n\n    if (s->finalized) {\n        ngx_log_error(NGX_LOG_WARN, s->log, 0, \"The fake session has been finalized.\");\n        return;\n    }\n\n    s->finalized = 1;\n\n    ngx_rtmp_fire_event(s, NGX_RTMP_DISCONNECT, NULL, NULL);\n\n    ngx_rtmp_close_session(s);\n}\n\n\nvoid\nngx_rtmp_set_combined_log(ngx_rtmp_session_t *s, void *d, ngx_log_handler_pt h)\n{\n    ngx_rtmp_error_log_ctx_t       *ctx;\n\n    ctx = s->log->data;\n    ctx->data = d;\n    ctx->handler = h;\n}\n\n\n// Only rtmp need to init session\nvoid\nngx_rtmp_init_session(ngx_rtmp_session_t *s, ngx_connection_t *c)\n{\n    ngx_rtmp_error_log_ctx_t       *ctx;\n    ngx_rtmp_core_main_conf_t  *cmcf;\n\n    cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module);\n\n    c->data = s;\n    s->connection = c;\n\n    c->log = s->log;\n    c->write->log = s->log;\n    c->read->log = s->log;\n\n    ctx = s->log->data;\n    ctx->client = &c->addr_text;\n\n    s->log->connection = c->number;\n\n    c->log_error = NGX_ERROR_INFO;\n\n    ngx_rtmp_set_chunk_size(s, NGX_RTMP_DEFAULT_CHUNK_SIZE);\n\n    if (s->variables == NULL) {\n        s->variables = ngx_pcalloc(s->pool, cmcf->variables.nelts\n                * sizeof(ngx_http_variable_value_t));\n    }\n\n    if (s->variables == NULL) {\n        ngx_rtmp_finalize_session(s);\n        return;\n    }\n\n    return;\n}\n\n\nngx_rtmp_session_t *\nngx_rtmp_create_relay_session(ngx_rtmp_session_t *s, void *tag)\n{\n    ngx_rtmp_session_t         *rs;\n    ngx_live_relay_ctx_t       *rctx;\n    ngx_rtmp_core_main_conf_t  *cmcf;\n\n    rs = ngx_rtmp_create_session(s->addr_conf);\n    if (rs == NULL) {\n        return NULL;\n    }\n\n    rs->relay = 1;\n    rs->main_conf = s->main_conf;\n    rs->srv_conf = s->srv_conf;\n    rs->app_conf = s->app_conf;\n\n    // clone para from origin session\n#define NGX_RTMP_RELAY_SESSION_COPY_PARA(para)                      \\\n    if (ngx_copy_str(rs->pool, &rs->para, &s->para) != NGX_OK) {    \\\n        goto destroy;                                               \\\n    }\n\n    NGX_RTMP_RELAY_SESSION_COPY_PARA(stream);\n\n    NGX_RTMP_RELAY_SESSION_COPY_PARA(name);\n    NGX_RTMP_RELAY_SESSION_COPY_PARA(pargs);\n\n    NGX_RTMP_RELAY_SESSION_COPY_PARA(app);\n    NGX_RTMP_RELAY_SESSION_COPY_PARA(args);\n    NGX_RTMP_RELAY_SESSION_COPY_PARA(flashver);\n    NGX_RTMP_RELAY_SESSION_COPY_PARA(swf_url);\n    NGX_RTMP_RELAY_SESSION_COPY_PARA(tc_url);\n    NGX_RTMP_RELAY_SESSION_COPY_PARA(page_url);\n\n    NGX_RTMP_RELAY_SESSION_COPY_PARA(serverid);\n#undef NGX_RTMP_RELAY_SESSION_COPY_PARA\n\n    rs->acodecs = s->acodecs;\n    rs->vcodecs = s->vcodecs;\n\n    ngx_rtmp_cmd_middleware_init(rs);\n\n    // create relay ctx\n    rctx = ngx_pcalloc(rs->pool, sizeof(ngx_live_relay_ctx_t));\n    if (rctx == NULL) {\n        goto destroy;\n    }\n    rctx->domain = rs->domain;\n    rctx->app = rs->app;\n    rctx->args = rs->args;\n    rctx->name = rs->name;\n    rctx->pargs = rs->pargs;\n\n    rctx->referer = rs->page_url;\n    rctx->user_agent = rs->flashver;\n    rctx->swf_url = rs->swf_url;\n    rctx->acodecs = rs->acodecs;\n    rctx->vcodecs = rs->vcodecs;\n\n    rctx->tag = tag;\n\n    ngx_rtmp_set_ctx(rs, rctx, ngx_live_relay_module);\n\n    cmcf = ngx_rtmp_get_module_main_conf(rs, ngx_rtmp_core_module);\n    if (rs->variables == NULL) {\n        rs->variables = ngx_pcalloc(rs->pool, cmcf->variables.nelts\n                * sizeof(ngx_http_variable_value_t));\n    }\n\n    return rs;\n\ndestroy:\n    ngx_rtmp_close_session(rs);\n\n    return NULL;\n}\n\n\nngx_rtmp_session_t *\nngx_rtmp_create_static_session(ngx_live_relay_t *relay,\n        ngx_rtmp_addr_conf_t *addr_conf, void *tag)\n{\n    ngx_rtmp_session_t         *rs;\n    ngx_live_relay_ctx_t       *rctx;\n    ngx_uint_t                  n;\n    ngx_rtmp_core_srv_conf_t   *cscf;\n    ngx_rtmp_core_app_conf_t  **cacfp;\n\n    rs = ngx_rtmp_create_session(addr_conf);\n    if (rs == NULL) {\n        return NULL;\n    }\n\n    rs->static_pull = 1;\n    rs->relay = 1;\n\n    // clone para from origin session\n#define NGX_RTMP_RELAY_SESSION_COPY_PARA(to, from)                  \\\n    if (ngx_copy_str(rs->pool, &rs->to, &relay->from) != NGX_OK) {  \\\n        goto destroy;                                               \\\n    }\n\n    NGX_RTMP_RELAY_SESSION_COPY_PARA(app, app);\n    NGX_RTMP_RELAY_SESSION_COPY_PARA(name, name);\n    NGX_RTMP_RELAY_SESSION_COPY_PARA(pargs, pargs);\n    NGX_RTMP_RELAY_SESSION_COPY_PARA(page_url, referer);\n    NGX_RTMP_RELAY_SESSION_COPY_PARA(flashver, user_agent);\n\n    NGX_RTMP_RELAY_SESSION_COPY_PARA(stream, stream);\n#undef NGX_RTMP_RELAY_SESSION_COPY_PARA\n\n    rs->tc_url.len = sizeof(\"rtmp://\") - 1 + relay->domain.len\n                   + sizeof(\"/\") - 1 + relay->app.len;\n    rs->tc_url.data = ngx_pcalloc(rs->pool, rs->tc_url.len);\n    if (rs->tc_url.data == NULL) {\n        goto destroy;\n    }\n    ngx_snprintf(rs->tc_url.data, rs->tc_url.len, \"rtmp://%V/%V\",\n            &relay->domain, &relay->app);\n\n    ngx_rtmp_cmd_middleware_init(rs);\n\n    if (ngx_rtmp_set_virtual_server(rs, &rs->domain)) {\n        goto destroy;\n    }\n    cscf = ngx_rtmp_get_module_srv_conf(rs, ngx_rtmp_core_module);\n\n    rs->live_server = ngx_live_create_server(&rs->serverid);\n\n    cacfp = cscf->applications.elts;\n    for (n = 0; n < cscf->applications.nelts; ++n, ++cacfp) {\n        if ((*cacfp)->name.len == rs->app.len &&\n            ngx_strncmp((*cacfp)->name.data, rs->app.data, rs->app.len) == 0)\n        {\n            /* found app! */\n            rs->app_conf = (*cacfp)->app_conf;\n            break;\n        }\n    }\n\n    if (rs->app_conf == NULL) {\n\n        if (cscf->default_app == NULL || cscf->default_app->app_conf == NULL) {\n            ngx_log_error(NGX_LOG_ERR, rs->log, 0,\n                    \"static session: application not found: '%V'\", &rs->app);\n            goto destroy;\n        }\n\n        rs->app_conf = cscf->default_app->app_conf;\n    }\n\n    // create relay ctx\n    rctx = ngx_pcalloc(rs->pool, sizeof(ngx_live_relay_ctx_t));\n    if (rctx == NULL) {\n        goto destroy;\n    }\n    rctx->domain = rs->domain;\n    rctx->app = rs->app;\n    rctx->args = rs->args;\n    rctx->name = rs->name;\n    rctx->pargs = rs->pargs;\n\n    rctx->referer = rs->page_url;\n    rctx->user_agent = rs->flashver;\n    rctx->swf_url = rs->swf_url;\n    rctx->acodecs = rs->acodecs;\n    rctx->vcodecs = rs->vcodecs;\n\n    rctx->tag = tag;\n\n    ngx_rtmp_set_ctx(rs, rctx, ngx_live_relay_module);\n\n    return rs;\n\ndestroy:\n    ngx_rtmp_close_session(rs);\n\n    return NULL;\n}\n\n\n// if return NULL, memory must be error\nngx_rtmp_session_t *\nngx_rtmp_create_session(ngx_rtmp_addr_conf_t *addr_conf)\n{\n    ngx_rtmp_session_t             *s;\n    ngx_rtmp_core_srv_conf_t       *cscf;\n    ngx_pool_t                     *pool;\n    ngx_rtmp_error_log_ctx_t       *ctx;\n\n    pool = NGX_CREATE_POOL(4096, ngx_cycle->log);\n    if (pool == NULL) {\n        return NULL;\n    }\n\n    s = ngx_pcalloc(pool, sizeof(ngx_rtmp_session_t) +\n            sizeof(ngx_rtmp_frame_t *) * ((ngx_rtmp_core_srv_conf_t *)\n                addr_conf->default_server->ctx-> srv_conf[ngx_rtmp_core_module\n                    .ctx_index])->out_queue);\n    if (s == NULL) {\n        goto destroy;\n    }\n    s->pool = pool;\n\n    s->addr_conf = addr_conf;\n\n    s->main_conf = addr_conf->default_server->ctx->main_conf;\n    s->srv_conf = addr_conf->default_server->ctx->srv_conf;\n\n    s->addr_text = ngx_pcalloc(s->pool, sizeof(ngx_str_t));\n    s->addr_text->data = ngx_pcalloc(s->pool, addr_conf->addr_text.len);\n    s->addr_text->len = addr_conf->addr_text.len;\n    ngx_memcpy(s->addr_text->data,\n        addr_conf->addr_text.data, addr_conf->addr_text.len);\n\n    s->ctx = ngx_pcalloc(pool, sizeof(void *) * ngx_rtmp_max_module);\n    if (s->ctx == NULL) {\n        goto destroy;\n    }\n\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n\n    s->out_queue = cscf->out_queue;\n    s->out_cork = cscf->out_cork;\n    s->in_streams = ngx_pcalloc(pool, sizeof(ngx_rtmp_stream_t)\n            * cscf->max_streams);\n    if (s->in_streams == NULL) {\n        goto destroy;\n    }\n\n#if (nginx_version >= 1007005)\n    ngx_queue_init(&s->posted_dry_events);\n#endif\n\n    s->epoch = ngx_current_msec;\n    s->timeout = cscf->timeout;\n    s->buflen = cscf->buflen;\n\n    // init log\n    ctx = ngx_pcalloc(pool, sizeof(ngx_rtmp_error_log_ctx_t));\n    if (ctx == NULL) {\n        goto destroy;\n    }\n\n    ctx->session = s;\n\n    s->log = ngx_pcalloc(pool, sizeof(ngx_log_t));\n    if (s->pool == NULL) {\n        goto destroy;\n    }\n    *s->log = ngx_cycle->new_log;\n\n    s->log->handler = ngx_rtmp_log_error;\n    s->log->data = ctx;\n\n    s->stage = NGX_LIVE_INIT;\n    s->init_time = ngx_current_msec;\n\n    s->mpegts_out = ngx_pcalloc(s->pool, sizeof(ngx_mpegts_frame_t *) *\n                ((ngx_rtmp_core_srv_conf_t *) addr_conf->default_server->ctx->\n                srv_conf[ngx_rtmp_core_module.ctx_index])->out_queue);\n\n    return s;\n\ndestroy:\n    if (pool) {\n        NGX_DESTROY_POOL(pool);\n    }\n\n    return NULL;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_limit_module.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n\n\ntypedef struct {\n    ngx_int_t       max_conn;\n    ngx_shm_zone_t *shm_zone;\n} ngx_rtmp_limit_main_conf_t;\n\n\nstatic ngx_str_t    shm_name = ngx_string(\"rtmp_limit\");\n\n\nstatic ngx_int_t ngx_rtmp_limit_postconfiguration(ngx_conf_t *cf);\nstatic void *ngx_rtmp_limit_create_main_conf(ngx_conf_t *cf);\n\n\nstatic ngx_command_t  ngx_rtmp_limit_commands[] = {\n\n    { ngx_string(\"max_connections\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      NGX_RTMP_MAIN_CONF_OFFSET,\n      offsetof(ngx_rtmp_limit_main_conf_t, max_conn),\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_rtmp_limit_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_rtmp_limit_postconfiguration,       /* postconfiguration */\n    ngx_rtmp_limit_create_main_conf,        /* create main configuration */\n    NULL,                                   /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    NULL,                                   /* create app configuration */\n    NULL                                    /* merge app configuration */\n};\n\n\nngx_module_t  ngx_rtmp_limit_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_limit_module_ctx,             /* module context */\n    ngx_rtmp_limit_commands,                /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_rtmp_limit_create_main_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_limit_main_conf_t      *lmcf;\n\n    lmcf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_limit_main_conf_t));\n    if (lmcf == NULL) {\n        return NULL;\n    }\n\n    lmcf->max_conn = NGX_CONF_UNSET;\n\n    return lmcf;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_limit_connect(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n    ngx_chain_t *in)\n{\n    ngx_rtmp_limit_main_conf_t *lmcf;\n    ngx_slab_pool_t            *shpool;\n    ngx_shm_zone_t             *shm_zone;\n    uint32_t                   *nconn, n;\n    ngx_int_t                   rc;\n\n    lmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_limit_module);\n    if (lmcf->max_conn == NGX_CONF_UNSET) {\n        return NGX_OK;\n    }\n\n    shm_zone = lmcf->shm_zone;\n    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;\n    nconn = shm_zone->data;\n\n    ngx_shmtx_lock(&shpool->mutex);\n    n = ++*nconn;\n    ngx_shmtx_unlock(&shpool->mutex);\n\n    rc = n > (ngx_uint_t) lmcf->max_conn ? NGX_ERROR : NGX_OK;\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"limit: inc conection counter: %uD\", n);\n\n    if (rc != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"limit: too many connections: %uD > %i\",\n                      n, lmcf->max_conn);\n    }\n\n    return rc;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_limit_disconnect(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n    ngx_chain_t *in)\n{\n    ngx_rtmp_limit_main_conf_t *lmcf;\n    ngx_slab_pool_t            *shpool;\n    ngx_shm_zone_t             *shm_zone;\n    uint32_t                   *nconn, n;\n\n    lmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_limit_module);\n    if (lmcf->max_conn == NGX_CONF_UNSET) {\n        return NGX_OK;\n    }\n\n    shm_zone = lmcf->shm_zone;\n    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;\n    nconn = shm_zone->data;\n\n    ngx_shmtx_lock(&shpool->mutex);\n    n = --*nconn;\n    ngx_shmtx_unlock(&shpool->mutex);\n\n    (void) n;\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"limit: dec conection counter: %uD\", n);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_limit_shm_init(ngx_shm_zone_t *shm_zone, void *data)\n{\n    ngx_slab_pool_t    *shpool;\n    uint32_t           *nconn;\n\n    if (data) {\n        shm_zone->data = data;\n        return NGX_OK;\n    }\n\n    shpool = (ngx_slab_pool_t *) shm_zone->shm.addr;\n\n    nconn = ngx_slab_alloc(shpool, 4);\n    if (nconn == NULL) {\n        return NGX_ERROR;\n    }\n\n    *nconn = 0;\n\n    shm_zone->data = nconn;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_limit_postconfiguration(ngx_conf_t *cf)\n{\n    ngx_rtmp_core_main_conf_t  *cmcf;\n    ngx_rtmp_limit_main_conf_t *lmcf;\n    ngx_rtmp_handler_pt        *h;\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_CONNECT]);\n    *h = ngx_rtmp_limit_connect;\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_DISCONNECT]);\n    *h = ngx_rtmp_limit_disconnect;\n\n    lmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_limit_module);\n    if (lmcf->max_conn == NGX_CONF_UNSET) {\n        return NGX_OK;\n    }\n\n    lmcf->shm_zone = ngx_shared_memory_add(cf, &shm_name, ngx_pagesize * 2,\n                                           &ngx_rtmp_limit_module);\n    if (lmcf->shm_zone == NULL) {\n        return NGX_ERROR;\n    }\n\n    lmcf->shm_zone->init = ngx_rtmp_limit_shm_init;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_live_module.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp_live_module.h\"\n#include \"ngx_rtmp_cmd_module.h\"\n#include \"ngx_rtmp_codec_module.h\"\n\n\nstatic ngx_rtmp_publish_pt              next_publish;\nstatic ngx_rtmp_play_pt                 next_play;\nstatic ngx_rtmp_close_stream_pt         next_close_stream;\nstatic ngx_rtmp_pause_pt                next_pause;\nstatic ngx_rtmp_stream_begin_pt         next_stream_begin;\nstatic ngx_rtmp_stream_eof_pt           next_stream_eof;\n\n\nstatic ngx_int_t ngx_rtmp_live_postconfiguration(ngx_conf_t *cf);\nstatic void * ngx_rtmp_live_create_app_conf(ngx_conf_t *cf);\nstatic char * ngx_rtmp_live_merge_app_conf(ngx_conf_t *cf,\n       void *parent, void *child);\nstatic char *ngx_rtmp_live_set_msec_slot(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\nstatic void ngx_rtmp_live_start(ngx_rtmp_session_t *s);\nstatic void ngx_rtmp_live_stop(ngx_rtmp_session_t *s);\n\n\nstatic ngx_command_t  ngx_rtmp_live_commands[] = {\n\n    { ngx_string(\"live\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_live_app_conf_t, live),\n      NULL },\n\n    { ngx_string(\"buffer\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_live_app_conf_t, buflen),\n      NULL },\n\n    { ngx_string(\"sync\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_rtmp_live_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_live_app_conf_t, sync),\n      NULL },\n\n    { ngx_string(\"interleave\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_live_app_conf_t, interleave),\n      NULL },\n\n    { ngx_string(\"wait_key\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_live_app_conf_t, wait_key),\n      NULL },\n\n    { ngx_string(\"wait_video\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_live_app_conf_t, wait_video),\n      NULL },\n\n    { ngx_string(\"publish_notify\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_live_app_conf_t, publish_notify),\n      NULL },\n\n    { ngx_string(\"play_restart\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_live_app_conf_t, play_restart),\n      NULL },\n\n    { ngx_string(\"idle_streams\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_live_app_conf_t, idle_streams),\n      NULL },\n\n    { ngx_string(\"drop_idle_publisher\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_rtmp_live_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_live_app_conf_t, idle_timeout),\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_rtmp_live_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_rtmp_live_postconfiguration,        /* postconfiguration */\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    ngx_rtmp_live_create_app_conf,          /* create app configuration */\n    ngx_rtmp_live_merge_app_conf            /* merge app configuration */\n};\n\n\nngx_module_t  ngx_rtmp_live_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_live_module_ctx,              /* module context */\n    ngx_rtmp_live_commands,                 /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_rtmp_live_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_live_app_conf_t      *lacf;\n\n    lacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_live_app_conf_t));\n    if (lacf == NULL) {\n        return NULL;\n    }\n\n    lacf->live = NGX_CONF_UNSET;\n    lacf->buflen = NGX_CONF_UNSET_MSEC;\n    lacf->sync = NGX_CONF_UNSET_MSEC;\n    lacf->idle_timeout = NGX_CONF_UNSET_MSEC;\n    lacf->interleave = NGX_CONF_UNSET;\n    lacf->wait_key = NGX_CONF_UNSET;\n    lacf->wait_video = NGX_CONF_UNSET;\n    lacf->publish_notify = NGX_CONF_UNSET;\n    lacf->play_restart = NGX_CONF_UNSET;\n    lacf->idle_streams = NGX_CONF_UNSET;\n\n    return lacf;\n}\n\n\nstatic char *\nngx_rtmp_live_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_rtmp_live_app_conf_t *prev = parent;\n    ngx_rtmp_live_app_conf_t *conf = child;\n\n    ngx_conf_merge_value(conf->live, prev->live, 0);\n    ngx_conf_merge_msec_value(conf->buflen, prev->buflen, 0);\n    ngx_conf_merge_msec_value(conf->sync, prev->sync, 300);\n    ngx_conf_merge_msec_value(conf->idle_timeout, prev->idle_timeout, 0);\n    ngx_conf_merge_value(conf->interleave, prev->interleave, 0);\n    ngx_conf_merge_value(conf->wait_key, prev->wait_key, 1);\n    ngx_conf_merge_value(conf->wait_video, prev->wait_video, 0);\n    ngx_conf_merge_value(conf->publish_notify, prev->publish_notify, 0);\n    ngx_conf_merge_value(conf->play_restart, prev->play_restart, 0);\n    ngx_conf_merge_value(conf->idle_streams, prev->idle_streams, 1);\n\n    return NGX_CONF_OK;\n}\n\n\nstatic char *\nngx_rtmp_live_set_msec_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    char                       *p = conf;\n    ngx_str_t                  *value;\n    ngx_msec_t                 *msp;\n\n    msp = (ngx_msec_t *) (p + cmd->offset);\n\n    value = cf->args->elts;\n\n    if (value[1].len == sizeof(\"off\") - 1 &&\n        ngx_strncasecmp(value[1].data, (u_char *) \"off\", value[1].len) == 0)\n    {\n        *msp = 0;\n        return NGX_CONF_OK;\n    }\n\n    return ngx_conf_set_msec_slot(cf, cmd, conf);\n}\n\n\nstatic void\nngx_rtmp_live_idle(ngx_event_t *pev)\n{\n    ngx_connection_t           *c;\n    ngx_rtmp_session_t         *s;\n\n    c = pev->data;\n    s = c->data;\n\n    ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                  \"live: drop idle publisher\");\n\n    s->finalize_reason = NGX_LIVE_DROP_IDLE;\n    ngx_rtmp_finalize_session(s);\n}\n\n\nstatic void\nngx_rtmp_live_set_status(ngx_rtmp_session_t *s, ngx_rtmp_frame_t *control,\n                         ngx_rtmp_frame_t **status, size_t nstatus,\n                         unsigned active)\n{\n    ngx_rtmp_live_app_conf_t   *lacf;\n    ngx_rtmp_live_ctx_t        *ctx, *pctx;\n    ngx_rtmp_frame_t          **frame;\n    ngx_event_t                *e;\n    size_t                      n;\n\n    lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module);\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"live: set active=%ui\", active);\n\n    if (ctx->active == active) {\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"live: unchanged active=%ui\", active);\n        return;\n    }\n\n    ctx->active = active;\n\n    if (ctx->publishing) {\n\n        /* publisher */\n\n        if (lacf->idle_timeout) {\n            e = &ctx->idle_evt;\n\n            if (active && !ctx->idle_evt.timer_set) {\n                e->data = s->connection;\n                e->log = s->log;\n                e->handler = ngx_rtmp_live_idle;\n\n                ngx_add_timer(e, lacf->idle_timeout);\n\n            } else if (!active && ctx->idle_evt.timer_set) {\n                ngx_del_timer(e);\n            }\n        }\n\n        ctx->stream->active = active;\n\n        for (pctx = ctx->stream->ctx; pctx; pctx = pctx->next) {\n            if (pctx->publishing == 0) {\n                ngx_rtmp_live_set_status(pctx->session, control, status,\n                                         nstatus, active);\n            }\n        }\n\n        return;\n    }\n\n    /* subscriber */\n\n    if (control && ngx_rtmp_send_message(s, control, 0) != NGX_OK) {\n        ngx_rtmp_finalize_session(s);\n        return;\n    }\n\n    if (!ctx->silent) {\n        frame = status;\n\n        for (n = 0; n < nstatus; ++n, ++frame) {\n            if (*frame && ngx_rtmp_send_message(s, *frame, 0) != NGX_OK) {\n                ngx_rtmp_finalize_session(s);\n                return;\n            }\n        }\n    }\n\n    ctx->cs[0].active = 0;\n    ctx->cs[0].dropped = 0;\n\n    ctx->cs[1].active = 0;\n    ctx->cs[1].dropped = 0;\n}\n\n\nstatic void\nngx_rtmp_live_start(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_live_app_conf_t   *lacf;\n    ngx_rtmp_frame_t           *control;\n    ngx_rtmp_frame_t           *status[3];\n    size_t                      n, nstatus;\n\n    if (s->live_type == NGX_HLS_LIVE) {\n        return;\n    }\n\n    lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module);\n\n    control = ngx_rtmp_create_stream_begin(s, NGX_RTMP_MSID);\n\n    nstatus = 0;\n\n    if (lacf->play_restart) {\n        status[nstatus++] = ngx_rtmp_create_status(s, \"NetStream.Play.Start\",\n                                                   \"status\", \"Start live\");\n        status[nstatus++] = ngx_rtmp_create_sample_access(s);\n    }\n\n    if (lacf->publish_notify) {\n        status[nstatus++] = ngx_rtmp_create_status(s,\n                                                 \"NetStream.Play.PublishNotify\",\n                                                 \"status\", \"Start publishing\");\n    }\n\n    ngx_rtmp_live_set_status(s, control, status, nstatus, 1);\n\n    if (control) {\n        ngx_rtmp_shared_free_frame(control);\n    }\n\n    for (n = 0; n < nstatus; ++n) {\n        ngx_rtmp_shared_free_frame(status[n]);\n    }\n}\n\n\nstatic void\nngx_rtmp_live_stop(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_live_app_conf_t   *lacf;\n    ngx_rtmp_frame_t           *control;\n    ngx_rtmp_frame_t           *status[3];\n    size_t                      n, nstatus;\n\n    lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module);\n\n    control = ngx_rtmp_create_stream_eof(s, NGX_RTMP_MSID);\n\n    nstatus = 0;\n\n    if (lacf->play_restart) {\n        status[nstatus++] = ngx_rtmp_create_status(s, \"NetStream.Play.Stop\",\n                                                   \"status\", \"Stop live\");\n    }\n\n    if (lacf->publish_notify) {\n        status[nstatus++] = ngx_rtmp_create_status(s,\n                                               \"NetStream.Play.UnpublishNotify\",\n                                               \"status\", \"Stop publishing\");\n    }\n\n    ngx_rtmp_live_set_status(s, control, status, nstatus, 0);\n\n    if (control) {\n        ngx_rtmp_shared_free_frame(control);\n    }\n\n    for (n = 0; n < nstatus; ++n) {\n        ngx_rtmp_shared_free_frame(status[n]);\n    }\n}\n\n\nstatic ngx_int_t\nngx_rtmp_live_stream_begin(ngx_rtmp_session_t *s, ngx_rtmp_stream_begin_t *v)\n{\n    ngx_rtmp_live_ctx_t    *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module);\n\n    if (ctx == NULL || ctx->stream == NULL || !ctx->publishing) {\n        goto next;\n    }\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"live: stream_begin\");\n\n    ngx_rtmp_live_start(s);\n\nnext:\n    return next_stream_begin(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_live_stream_eof(ngx_rtmp_session_t *s, ngx_rtmp_stream_eof_t *v)\n{\n    ngx_rtmp_live_ctx_t    *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module);\n\n    if (ctx == NULL || ctx->stream == NULL || !ctx->publishing) {\n        goto next;\n    }\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"live: stream_eof\");\n\n    ngx_rtmp_live_stop(s);\n\nnext:\n    return next_stream_eof(s, v);\n}\n\n\nstatic void\nngx_rtmp_live_join(ngx_rtmp_session_t *s, u_char *name, unsigned publisher)\n{\n    ngx_rtmp_live_ctx_t            *ctx;\n    ngx_live_stream_t              *st;\n    ngx_rtmp_live_app_conf_t       *lacf;\n    ngx_str_t                       pubpri;\n\n    lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module);\n    if (lacf == NULL) {\n        return;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module);\n    if (ctx && ctx->stream) {\n        ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"live: already joined\");\n        return;\n    }\n\n    if (ctx == NULL) {\n        ctx = ngx_palloc(s->pool, sizeof(ngx_rtmp_live_ctx_t));\n        ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_live_module);\n    }\n\n    ngx_memzero(ctx, sizeof(*ctx));\n\n    ctx->session = s;\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"live: join '%s'\", name);\n\n    st = s->live_stream;\n\n    if (!(publisher || st->publish_ctx || lacf->idle_streams)) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"live: stream not found\");\n\n        s->status = 404;\n        ngx_rtmp_send_status(s, \"NetStream.Play.StreamNotFound\", \"error\",\n                             \"No such stream\");\n\n        ngx_rtmp_finalize_session(s);\n\n        return;\n    }\n\n    if (publisher) {\n        // set publish priority\n        if (s->relay) { // relay pull\n            ctx->pubpri = -1;\n        } else {\n            if (ngx_rtmp_arg(s, (u_char *) \"pubpri\", 6, &pubpri) == NGX_OK) {\n                ctx->pubpri = ngx_atoi(pubpri.data, pubpri.len);\n                if (ctx->pubpri == NGX_ERROR) { // invalid publish priority\n                    ctx->pubpri = 0;\n                }\n            }\n        }\n\n        // duplicate publish priority\n        if (ngx_map_find(&st->pubctx, (intptr_t) ctx->pubpri)) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                          \"live: already publishing\");\n\n            ngx_rtmp_send_status(s, \"NetStream.Publish.BadName\", \"error\",\n                                 \"Already publishing\");\n\n            return;\n        }\n\n        ctx->node.raw_key = (intptr_t) ctx->pubpri;\n        ngx_map_insert(&st->pubctx, &ctx->node, 0);\n\n        st->publishing = 1;\n    }\n\n    ctx->stream = st;\n    ctx->publishing = publisher;\n    ctx->next = st->ctx;\n\n    st->ctx = ctx;\n\n    if (lacf->buflen) {\n        s->out_buffer = 1;\n    }\n\n    ctx->cs[0].csid = NGX_RTMP_CSID_VIDEO;\n    ctx->cs[1].csid = NGX_RTMP_CSID_AUDIO;\n\n    if (!ctx->publishing && ctx->stream->active) {\n        ngx_rtmp_live_start(s);\n    }\n}\n\n\nstatic ngx_int_t\nngx_rtmp_live_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)\n{\n    ngx_rtmp_session_t             *ss;\n    ngx_rtmp_live_ctx_t            *ctx, **cctx, *pctx;\n    ngx_rtmp_live_app_conf_t       *lacf;\n\n    lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module);\n    if (lacf == NULL) {\n        goto next;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module);\n    if (ctx == NULL) {\n        goto next;\n    }\n\n    if (ctx->stream == NULL) {\n        ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"live: not joined\");\n        goto next;\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"live: leave '%s'\", ctx->stream->name);\n\n    if (s->publishing) {\n        ngx_map_delete(&s->live_stream->pubctx, (intptr_t) ctx->pubpri);\n    }\n\n    if (ctx->stream->publishing && ctx->publishing) {\n        ctx->stream->publishing = 0;\n    }\n\n    for (cctx = &ctx->stream->ctx; *cctx; cctx = &(*cctx)->next) {\n        if (*cctx == ctx) {\n            *cctx = ctx->next;\n            break;\n        }\n    }\n\n    if (ctx->publishing || ctx->stream->active) {\n        ngx_rtmp_live_stop(s);\n    }\n\n    if (ctx->publishing) {\n        ngx_rtmp_send_status(s, \"NetStream.Unpublish.Success\",\n                             \"status\", \"Stop publishing\");\n        if (!lacf->idle_streams) {\n            for (pctx = ctx->stream->ctx; pctx; pctx = pctx->next) {\n                if (pctx->publishing == 0) {\n                    ss = pctx->session;\n                    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->log, 0,\n                                   \"live: no publisher\");\n                    ngx_rtmp_finalize_session(ss);\n                }\n            }\n        }\n    }\n\n    if (ctx->stream->ctx) {\n        ctx->stream = NULL;\n        goto next;\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"live: delete empty stream '%s'\",\n                   ctx->stream->name);\n\n    ctx->stream = NULL;\n\n    if (!ctx->silent && !ctx->publishing && !lacf->play_restart) {\n        ngx_rtmp_send_status(s, \"NetStream.Play.Stop\", \"status\", \"Stop live\");\n    }\n\nnext:\n    return next_close_stream(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_live_pause(ngx_rtmp_session_t *s, ngx_rtmp_pause_t *v)\n{\n    ngx_rtmp_live_ctx_t            *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module);\n\n    if (ctx == NULL || ctx->stream == NULL) {\n        goto next;\n    }\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"live: pause=%i timestamp=%f\",\n                   (ngx_int_t) v->pause, v->position);\n\n    if (v->pause) {\n        if (ngx_rtmp_send_status(s, \"NetStream.Pause.Notify\", \"status\",\n                                 \"Paused live\")\n            != NGX_OK)\n        {\n            return NGX_ERROR;\n        }\n\n        ctx->paused = 1;\n\n        ngx_rtmp_live_stop(s);\n\n    } else {\n        if (ngx_rtmp_send_status(s, \"NetStream.Unpause.Notify\", \"status\",\n                                 \"Unpaused live\")\n            != NGX_OK)\n        {\n            return NGX_ERROR;\n        }\n\n        ctx->paused = 0;\n\n        ngx_rtmp_live_start(s);\n    }\n\nnext:\n    return next_pause(s, v);\n}\n\nstatic ngx_int_t\nngx_rtmp_live_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n                 ngx_chain_t *in)\n{\n    ngx_rtmp_live_ctx_t            *ctx, *pctx;\n    ngx_rtmp_codec_ctx_t           *codec_ctx;\n    ngx_rtmp_frame_t               *header, *coheader, *meta, *avframe, *dummy;\n    ngx_rtmp_core_srv_conf_t       *cscf;\n    ngx_rtmp_live_app_conf_t       *lacf;\n    ngx_rtmp_session_t             *ss;\n    ngx_rtmp_header_t               ch, lh, clh;\n    ngx_int_t                       rc, mandatory, dummy_audio;\n    ngx_uint_t                      prio;\n    ngx_uint_t                      peers;\n    ngx_uint_t                      meta_version;\n    ngx_uint_t                      csidx;\n    uint32_t                        delta;\n    ngx_rtmp_live_chunk_stream_t   *cs;\n    u_char                          frametype;\n\n#define MSG_TYPE (h->type == NGX_RTMP_MSG_VIDEO ? \"video\" : \"audio\")\n\n    lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module);\n    if (lacf == NULL) {\n        return NGX_ERROR;\n    }\n\n    if (!lacf->live || in == NULL  || in->buf == NULL || s->pause == 1) {\n        return NGX_OK;\n    }\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n\n    if (s->pause == 2) {\n        if ((codec_ctx && codec_ctx->video_codec_id == 0) ||\n            (h->type == NGX_RTMP_MSG_VIDEO &&\n            ngx_rtmp_get_video_frame_type(in) == NGX_RTMP_VIDEO_KEY_FRAME))\n        {\n            s->pause = 0;\n        } else {\n            return NGX_OK;\n        }\n    }\n\n    if (h->type == NGX_RTMP_MSG_VIDEO) {\n        frametype = in->buf->pos[0] & 0xf0;\n        if (frametype != 0x10 && frametype != 0x20) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                    \"codec: receive unkwnon frametype %02xD\", frametype);\n            return NGX_OK;\n        }\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module);\n    if (ctx == NULL || ctx->stream == NULL) {\n        return NGX_OK;\n    }\n\n    if (ctx->publishing == 0) {\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"live: %s from non-publisher\", MSG_TYPE);\n        return NGX_OK;\n    }\n\n    if (!ctx->stream->active) {\n        ngx_rtmp_live_start(s);\n    }\n\n    if (ctx->idle_evt.timer_set) {\n        ngx_add_timer(&ctx->idle_evt, lacf->idle_timeout);\n    }\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"live: %s packet timestamp=%uD\",\n                   MSG_TYPE, h->timestamp);\n\n    s->current_time = h->timestamp;\n\n    peers = 0;\n    header = NULL;\n    coheader = NULL;\n    meta = NULL;\n    dummy = NULL;\n    meta_version = 0;\n    mandatory = 0;\n\n    prio = (h->type == NGX_RTMP_MSG_VIDEO ?\n            ngx_rtmp_get_video_frame_type(in) : 0);\n\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n\n    csidx = !(lacf->interleave || h->type == NGX_RTMP_MSG_VIDEO);\n\n    cs  = &ctx->cs[csidx];\n\n    ngx_memzero(&ch, sizeof(ch));\n\n    ch.timestamp = h->timestamp;\n    ch.msid = NGX_RTMP_MSID;\n    ch.csid = cs->csid;\n    ch.type = h->type;\n    ch.mlen = h->mlen;\n\n    lh = ch;\n\n    if (cs->active) {\n        lh.timestamp = cs->timestamp;\n    }\n\n    clh = lh;\n    clh.type = (h->type == NGX_RTMP_MSG_AUDIO ? NGX_RTMP_MSG_VIDEO :\n                                                NGX_RTMP_MSG_AUDIO);\n\n    cs->active = 1;\n    cs->timestamp = ch.timestamp;\n\n    delta = ch.timestamp - lh.timestamp;\n/*\n    if (delta >> 31) {\n        ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"live: clipping non-monotonical timestamp %uD->%uD\",\n                       lh.timestamp, ch.timestamp);\n\n        delta = 0;\n\n        ch.timestamp = lh.timestamp;\n    }\n*/\n    avframe = ngx_rtmp_shared_alloc_frame(cscf->chunk_size, in, 0);\n    avframe->hdr = ch;\n\n    if (codec_ctx) {\n\n        if (h->type == NGX_RTMP_MSG_AUDIO) {\n            header = codec_ctx->aac_header;\n\n            if (lacf->interleave) {\n                coheader = codec_ctx->avc_header;\n            }\n\n            if (codec_ctx->audio_codec_id == NGX_RTMP_AUDIO_AAC &&\n                ngx_rtmp_is_codec_header(in))\n            {\n                prio = 0;\n                mandatory = 1;\n            }\n\n        } else {\n            header = codec_ctx->avc_header;\n\n            if (lacf->interleave) {\n                coheader = codec_ctx->aac_header;\n            }\n\n            if (codec_ctx->video_codec_id == NGX_RTMP_VIDEO_H264 &&\n                ngx_rtmp_is_codec_header(in))\n            {\n                prio = 0;\n                mandatory = 1;\n            }\n        }\n\n        if (codec_ctx->meta) {\n            meta = codec_ctx->meta;\n            meta_version = codec_ctx->meta_version;\n        }\n    }\n\n    if (ngx_rtmp_gop_cache(s, avframe) == NGX_ERROR) {\n        return NGX_ERROR;\n    }\n\n    /* broadcast to all subscribers */\n\n    for (pctx = ctx->stream->ctx; pctx; pctx = pctx->next) {\n        // not the highest priority\n        if (ngx_map_rbegin(&ctx->stream->pubctx) != &ctx->node) {\n            break;\n        }\n\n        // do not send to publish session\n        if (pctx->publishing || pctx->paused || s->pause) {\n            continue;\n        }\n\n        ss = pctx->session;\n        cs = &pctx->cs[csidx];\n\n        if (ss->live_type == NGX_MPEGTS_LIVE || ss->live_type == NGX_HLS_LIVE) {\n            continue;\n        }\n\n        /* send gop cache is set */\n        switch (ngx_rtmp_gop_send(s, ss)) {\n        case NGX_DECLINED:\n            break;\n        case NGX_ERROR:\n            ngx_rtmp_finalize_session(ss);\n            continue;\n        default:\n            peers++;\n            continue;\n        }\n\n        /* send metadata */\n\n        if (meta && meta_version != pctx->meta_version) {\n            ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->log, 0,\n                           \"live: meta\");\n\n            if (ngx_rtmp_send_message(ss, meta, 0) == NGX_OK) {\n                pctx->meta_version = meta_version;\n            }\n        }\n\n        /* sync stream */\n\n        if (cs->active && (lacf->sync && cs->dropped > lacf->sync)) {\n            ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ss->log, 0,\n                           \"live: sync %s dropped=%uD\", MSG_TYPE, cs->dropped);\n\n            cs->active = 0;\n            cs->dropped = 0;\n        }\n\n        /* absolute packet */\n\n        if (!cs->active) {\n\n            if (mandatory) {\n                ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->log, 0,\n                               \"live: skipping header\");\n                continue;\n            }\n\n            if (lacf->wait_video && h->type == NGX_RTMP_MSG_AUDIO &&\n                !pctx->cs[0].active)\n            {\n                ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->log, 0,\n                               \"live: waiting for video\");\n                continue;\n            }\n\n            if (lacf->wait_key && prio != NGX_RTMP_VIDEO_KEY_FRAME &&\n               (lacf->interleave || h->type == NGX_RTMP_MSG_VIDEO))\n            {\n                ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->log, 0,\n                               \"live: skip non-key\");\n                continue;\n            }\n\n            dummy_audio = 0;\n            if (lacf->wait_video && h->type == NGX_RTMP_MSG_VIDEO &&\n                !pctx->cs[1].active)\n            {\n                dummy_audio = 1;\n                if (dummy == NULL) {\n                    dummy = ngx_rtmp_shared_alloc_frame(cscf->chunk_size,\n                                                        NULL, 1);\n                    dummy->hdr = clh;\n                }\n            }\n\n            if (header || coheader) {\n\n                /* send absolute codec header */\n\n                ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ss->log, 0,\n                               \"live: abs %s header timestamp=%uD\",\n                               MSG_TYPE, lh.timestamp);\n\n                if (header) {\n                    header->hdr = lh;\n                    rc = ngx_rtmp_send_message(ss, header, 0);\n                    if (rc != NGX_OK) {\n                        continue;\n                    }\n                }\n\n                if (coheader) {\n                    coheader->hdr = clh;\n                    rc = ngx_rtmp_send_message(ss, coheader, 0);\n                    if (rc != NGX_OK) {\n                        continue;\n                    }\n\n                } else if (dummy_audio) {\n                    ngx_rtmp_send_message(ss, dummy, 0);\n                }\n\n                cs->timestamp = lh.timestamp;\n                cs->active = 1;\n                ss->current_time = cs->timestamp;\n\n            }\n        }\n\n        /* send av packet */\n\n        ngx_log_debug2(NGX_LOG_DEBUG_RTMP, ss->log, 0,\n                       \"live: rel %s packet delta=%uD\",\n                       MSG_TYPE, delta);\n\n        if (ngx_rtmp_send_message(ss, avframe, prio) != NGX_OK) {\n            ++pctx->ndropped;\n\n            cs->dropped += delta;\n\n            if (mandatory) {\n                ngx_log_debug0(NGX_LOG_DEBUG_RTMP, ss->log, 0,\n                               \"live: mandatory packet failed\");\n                ngx_rtmp_finalize_session(ss);\n            }\n\n            continue;\n        }\n\n        cs->timestamp += delta;\n        ++peers;\n        ss->current_time = cs->timestamp;\n    }\n\n    if (avframe) {\n        ngx_rtmp_shared_free_frame(avframe);\n    }\n\n    if (dummy) {\n        ngx_rtmp_shared_free_frame(dummy);\n    }\n\n    ngx_rtmp_update_bandwidth(&ctx->stream->bw_in, h->mlen);\n    ngx_rtmp_update_bandwidth(&ctx->stream->bw_out, h->mlen * peers);\n\n    ngx_rtmp_update_bandwidth(h->type == NGX_RTMP_MSG_AUDIO ?\n                              &ctx->stream->bw_in_audio :\n                              &ctx->stream->bw_in_video,\n                              h->mlen);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_live_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v)\n{\n    ngx_rtmp_live_app_conf_t       *lacf;\n    ngx_rtmp_live_ctx_t            *ctx;\n\n    lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module);\n\n    if (lacf == NULL || !lacf->live) {\n        goto next;\n    }\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"live: publish: name='%s' type='%s'\",\n                   v->name, v->type);\n\n    /* join stream as publisher */\n\n    ngx_rtmp_live_join(s, v->name, 1);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module);\n    if (ctx == NULL || !ctx->publishing) {\n        goto next;\n    }\n\n    ctx->silent = v->silent;\n\n    if (!ctx->silent) {\n        ngx_rtmp_send_status(s, \"NetStream.Publish.Start\",\n                             \"status\", \"Start publishing\");\n    }\n\nnext:\n    return next_publish(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_live_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v)\n{\n    ngx_rtmp_live_app_conf_t   *lacf;\n    ngx_rtmp_live_ctx_t        *ctx;\n    ngx_rtmp_session_t         *ps;\n\n    lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_live_module);\n\n    if (lacf == NULL || !lacf->live ||\n        s->live_type == NGX_HLS_LIVE || s->live_type == NGX_MPEGTS_LIVE)\n    {\n        goto next;\n    }\n\n    ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"live: play: name='%s' start=%uD duration=%uD reset=%d\",\n                   v->name, (uint32_t) v->start,\n                   (uint32_t) v->duration, (uint32_t) v->reset);\n\n    /* join stream as subscriber */\n\n    ngx_rtmp_live_join(s, v->name, 0);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_live_module);\n    if (ctx == NULL) {\n        goto next;\n    }\n\n    ctx->silent = v->silent;\n\n    if (!ctx->silent && !lacf->play_restart) {\n        ngx_rtmp_send_status(s, \"NetStream.Play.Start\",\n                             \"status\", \"Start live\");\n        ngx_rtmp_send_sample_access(s);\n    }\n\n    if (s->live_stream->publish_ctx && s->live_stream->publish_ctx->session) {\n        ps = s->live_stream->publish_ctx->session;\n        ngx_rtmp_gop_send(ps, s);\n    }\n\nnext:\n    return next_play(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_live_postconfiguration(ngx_conf_t *cf)\n{\n    ngx_rtmp_core_main_conf_t          *cmcf;\n    ngx_rtmp_handler_pt                *h;\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    /* register raw event handlers */\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]);\n    *h = ngx_rtmp_live_av;\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]);\n    *h = ngx_rtmp_live_av;\n\n    /* chain handlers */\n\n    next_publish = ngx_rtmp_publish;\n    ngx_rtmp_publish = ngx_rtmp_live_publish;\n\n    next_play = ngx_rtmp_play;\n    ngx_rtmp_play = ngx_rtmp_live_play;\n\n    next_close_stream = ngx_rtmp_close_stream;\n    ngx_rtmp_close_stream = ngx_rtmp_live_close_stream;\n\n    next_pause = ngx_rtmp_pause;\n    ngx_rtmp_pause = ngx_rtmp_live_pause;\n\n    next_stream_begin = ngx_rtmp_stream_begin;\n    ngx_rtmp_stream_begin = ngx_rtmp_live_stream_begin;\n\n    next_stream_eof = ngx_rtmp_stream_eof;\n    ngx_rtmp_stream_eof = ngx_rtmp_live_stream_eof;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_live_module.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#ifndef _NGX_RTMP_LIVE_H_INCLUDED_\n#define _NGX_RTMP_LIVE_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_cmd_module.h\"\n#include \"ngx_rtmp_bandwidth.h\"\n#include \"ngx_rtmp_streams.h\"\n#include \"ngx_map.h\"\n\n\ntypedef struct {\n    unsigned                            active:1;\n    uint32_t                            timestamp;\n    uint32_t                            last_timestamp;\n    uint32_t                            csid;\n    uint32_t                            dropped;\n} ngx_rtmp_live_chunk_stream_t;\n\n\nstruct ngx_rtmp_live_ctx_s {\n    ngx_map_node_t                      node;\n    ngx_int_t                           pubpri;\n    ngx_rtmp_session_t                 *session;\n    ngx_live_stream_t                  *stream;\n    ngx_rtmp_live_ctx_t                *next;\n    ngx_uint_t                          ndropped;\n    ngx_rtmp_live_chunk_stream_t        cs[2];\n    ngx_uint_t                          meta_version;\n    ngx_event_t                         idle_evt;\n    unsigned                            active:1;\n    unsigned                            publishing:1;\n    unsigned                            silent:1;\n    unsigned                            paused:1;\n};\n\n\ntypedef struct {\n    ngx_flag_t                          live;\n    ngx_flag_t                          meta;\n    ngx_msec_t                          sync;\n    ngx_msec_t                          idle_timeout;\n    ngx_flag_t                          atc;\n    ngx_flag_t                          interleave;\n    ngx_flag_t                          wait_key;\n    ngx_flag_t                          wait_video;\n    ngx_flag_t                          publish_notify;\n    ngx_flag_t                          play_restart;\n    ngx_flag_t                          idle_streams;\n    ngx_flag_t                          fix_timestamp;\n    ngx_msec_t                          buflen;\n} ngx_rtmp_live_app_conf_t;\n\n\nextern ngx_module_t  ngx_rtmp_live_module;\n\n\n#endif /* _NGX_RTMP_LIVE_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_log_module.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp_cmd_module.h\"\n#include \"ngx_rtmp_codec_module.h\"\n\n\nstatic ngx_rtmp_publish_pt  next_publish;\nstatic ngx_rtmp_play_pt     next_play;\n\n\nstatic ngx_int_t ngx_rtmp_log_postconfiguration(ngx_conf_t *cf);\nstatic void *ngx_rtmp_log_create_main_conf(ngx_conf_t *cf);\nstatic void * ngx_rtmp_log_create_app_conf(ngx_conf_t *cf);\nstatic char * ngx_rtmp_log_merge_app_conf(ngx_conf_t *cf,\n       void *parent, void *child);\nstatic char * ngx_rtmp_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\nstatic char * ngx_rtmp_log_set_format(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\nstatic char * ngx_rtmp_log_compile_format(ngx_conf_t *cf, ngx_array_t *ops,\n       ngx_array_t *args, ngx_uint_t s);\n\n\ntypedef struct ngx_rtmp_log_op_s ngx_rtmp_log_op_t;\n\n#define MAX_ACCESS_LOG_LINE_LEN     4096\n\ntypedef size_t (*ngx_rtmp_log_op_getlen_pt)(ngx_rtmp_session_t *s,\n        ngx_rtmp_log_op_t *op);\ntypedef u_char * (*ngx_rtmp_log_op_getdata_pt)(ngx_rtmp_session_t *s,\n        u_char *buf, ngx_rtmp_log_op_t *log);\n\n\nstruct ngx_rtmp_log_op_s {\n    ngx_rtmp_log_op_getlen_pt   getlen;\n    ngx_rtmp_log_op_getdata_pt  getdata;\n    ngx_str_t                   value;\n    ngx_uint_t                  offset;\n};\n\n\ntypedef struct {\n    ngx_str_t                   name;\n    ngx_rtmp_log_op_getlen_pt   getlen;\n    ngx_rtmp_log_op_getdata_pt  getdata;\n    ngx_uint_t                  offset;\n} ngx_rtmp_log_var_t;\n\n\ntypedef struct {\n    ngx_str_t                   name;\n    ngx_array_t                *ops; /* ngx_rtmp_log_op_t */\n} ngx_rtmp_log_fmt_t;\n\n\ntypedef struct {\n    ngx_open_file_t            *file;\n    time_t                      disk_full_time;\n    time_t                      error_log_time;\n    ngx_msec_t                  trunc_timer;\n    ngx_rtmp_log_fmt_t         *format;\n} ngx_rtmp_log_t;\n\n\ntypedef struct {\n    ngx_array_t                *logs; /* ngx_rtmp_log_t */\n    ngx_uint_t                  off;\n} ngx_rtmp_log_app_conf_t;\n\n\ntypedef struct {\n    ngx_array_t                 formats; /* ngx_rtmp_log_fmt_t */\n    ngx_uint_t                  combined_used;\n} ngx_rtmp_log_main_conf_t;\n\n\ntypedef struct {\n    ngx_rtmp_session_t         *session;\n    ngx_event_t                 event;\n    ngx_rtmp_log_t             *log;\n} ngx_rtmp_log_timer_ctx_t;\n\ntypedef struct {\n    unsigned                    play:1;\n    unsigned                    publish:1;\n    ngx_uint_t                  last_bytes;\n    u_char                      name[NGX_RTMP_MAX_NAME];\n    u_char                      stream[NGX_RTMP_MAX_NAME];\n    u_char                      args[NGX_RTMP_MAX_ARGS];\n    ngx_array_t                 timers; /* ngx_rtmp_log_timer_ctx_t */\n} ngx_rtmp_log_ctx_t;\n\n\nstatic ngx_str_t ngx_rtmp_access_log = ngx_string(NGX_HTTP_LOG_PATH);\n\n\nstatic ngx_command_t  ngx_rtmp_log_commands[] = {\n\n    { ngx_string(\"access_log\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE123,\n      ngx_rtmp_log_set_log,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"log_format\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_2MORE,\n      ngx_rtmp_log_set_format,\n      NGX_RTMP_MAIN_CONF_OFFSET,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_rtmp_log_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_rtmp_log_postconfiguration,         /* postconfiguration */\n    ngx_rtmp_log_create_main_conf,          /* create main configuration */\n    NULL,                                   /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    ngx_rtmp_log_create_app_conf,           /* create app configuration */\n    ngx_rtmp_log_merge_app_conf             /* merge app configuration */\n};\n\n\nngx_module_t  ngx_rtmp_log_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_log_module_ctx,               /* module context */\n    ngx_rtmp_log_commands,                  /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_str_t ngx_rtmp_combined_fmt =\n    ngx_string(\"$remote_addr [$time_local] $command \"\n               \"\\\"$app\\\" \\\"$name\\\" \\\"$args\\\" - \"\n               \"$bytes_received $bytes_sent \"\n               \"\\\"$pageurl\\\" \\\"$flashver\\\" ($session_readable_time)\");\n\n\nstatic size_t\nngx_rtmp_log_var_default_getlen(ngx_rtmp_session_t *s, ngx_rtmp_log_op_t *op)\n{\n    return op->value.len;\n}\n\n\nstatic u_char *\nngx_rtmp_log_var_default_getdata(ngx_rtmp_session_t *s, u_char *buf,\n    ngx_rtmp_log_op_t *op)\n{\n    return ngx_cpymem(buf, op->value.data, op->value.len);\n}\n\nstatic size_t\nngx_rtmp_log_var_parg_getlen(ngx_rtmp_session_t *s, ngx_rtmp_log_op_t *op)\n{\n    ngx_str_t                  *name = &(op->value);\n    u_char                     *arg;\n    size_t                      len;\n    ngx_str_t                   value;\n\n    len = name->len - (sizeof(\"parg_\") - 1);\n    arg = name->data + sizeof(\"parg_\") - 1;\n\n    if (ngx_rtmp_arg(s, arg, len, &value) != NGX_OK) {\n        return op->value.len;\n    }\n\n    return value.len;\n}\n\n\nstatic u_char *\nngx_rtmp_log_var_parg_getdata(ngx_rtmp_session_t *s, u_char *buf,\n    ngx_rtmp_log_op_t *op)\n{\n    ngx_str_t                  *name = &(op->value);\n    u_char                     *arg;\n    size_t                      len;\n    ngx_str_t                   value;\n\n    len = name->len - (sizeof(\"parg_\") - 1);\n    arg = name->data + sizeof(\"parg_\") - 1;\n\n    if (ngx_rtmp_arg(s, arg, len, &value) != NGX_OK) {\n        return ngx_cpymem(buf, op->value.data, op->value.len);\n    }\n\n    return ngx_cpymem(buf, value.data, value.len);\n}\n\nstatic size_t\nngx_rtmp_log_var_connection_getlen(ngx_rtmp_session_t *s, ngx_rtmp_log_op_t *op)\n{\n    return NGX_INT_T_LEN;\n}\n\nstatic u_char *\nngx_rtmp_log_var_connection_getdata(ngx_rtmp_session_t *s, u_char *buf,\n    ngx_rtmp_log_op_t *op)\n{\n    return ngx_sprintf(buf, \"%ui\", (ngx_uint_t) s->number);\n}\n\n\nstatic size_t\nngx_rtmp_log_var_remote_addr_getlen(ngx_rtmp_session_t *s,\n    ngx_rtmp_log_op_t *op)\n{\n    return s->remote_addr_text.len;\n}\n\n\nstatic u_char *\nngx_rtmp_log_var_remote_addr_getdata(ngx_rtmp_session_t *s, u_char *buf,\n    ngx_rtmp_log_op_t *op)\n{\n    return ngx_cpymem(buf, s->remote_addr_text.data,\n                           s->remote_addr_text.len);\n}\n\n\nstatic size_t\nngx_rtmp_log_var_msec_getlen(ngx_rtmp_session_t *s,\n    ngx_rtmp_log_op_t *op)\n{\n    return NGX_TIME_T_LEN + 4;\n}\n\n\nstatic u_char *\nngx_rtmp_log_var_msec_getdata(ngx_rtmp_session_t *s, u_char *buf,\n    ngx_rtmp_log_op_t *op)\n{\n    ngx_time_t  *tp;\n\n    tp = ngx_timeofday();\n\n    return ngx_sprintf(buf, \"%T.%03M\", tp->sec, tp->msec);\n}\n\nstatic size_t\nngx_rtmp_log_var_sec_getlen(ngx_rtmp_session_t *s,\n    ngx_rtmp_log_op_t *op)\n{\n    return NGX_TIME_T_LEN + 4;\n}\n\n\nstatic u_char *\nngx_rtmp_log_var_sec_getdata(ngx_rtmp_session_t *s, u_char *buf,\n    ngx_rtmp_log_op_t *op)\n{\n    ngx_time_t  *tp;\n\n    tp = ngx_timeofday();\n\n    return ngx_sprintf(buf, \"%T\", tp->sec);\n}\n\n\nstatic size_t\nngx_rtmp_log_var_session_string_getlen(ngx_rtmp_session_t *s,\n    ngx_rtmp_log_op_t *op)\n{\n    return ((ngx_str_t *) ((u_char *) s + op->offset))->len;\n}\n\n\nstatic u_char *\nngx_rtmp_log_var_session_string_getdata(ngx_rtmp_session_t *s, u_char *buf,\n    ngx_rtmp_log_op_t *op)\n{\n    ngx_str_t  *str;\n\n    str = (ngx_str_t *) ((u_char *) s + op->offset);\n\n    return ngx_cpymem(buf, str->data, str->len);\n}\n\n\nstatic size_t\nngx_rtmp_log_var_command_getlen(ngx_rtmp_session_t *s,\n    ngx_rtmp_log_op_t *op)\n{\n    return sizeof(\"PLAY+PUBLISH\") - 1;\n}\n\n\nstatic u_char *\nngx_rtmp_log_var_command_getdata(ngx_rtmp_session_t *s, u_char *buf,\n    ngx_rtmp_log_op_t *op)\n{\n    ngx_rtmp_log_ctx_t *ctx;\n    ngx_str_t          *cmd;\n    ngx_uint_t          n;\n\n    static ngx_str_t    commands[] = {\n        ngx_string(\"NONE\"),\n        ngx_string(\"PLAY\"),\n        ngx_string(\"PUBLISH\"),\n        ngx_string(\"PLAY+PUBLISH\")\n    };\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_log_module);\n\n    n = ctx ? (ctx->play + ctx->publish * 2) : 0;\n\n    cmd = &commands[n];\n\n    return ngx_cpymem(buf, cmd->data, cmd->len);\n}\n\n\nstatic size_t\nngx_rtmp_log_var_context_cstring_getlen(ngx_rtmp_session_t *s,\n    ngx_rtmp_log_op_t *op)\n{\n    return ngx_max(NGX_RTMP_MAX_NAME, NGX_RTMP_MAX_ARGS);\n}\n\n\nstatic u_char *\nngx_rtmp_log_var_context_cstring_getdata(ngx_rtmp_session_t *s, u_char *buf,\n    ngx_rtmp_log_op_t *op)\n{\n    ngx_rtmp_log_ctx_t *ctx;\n    u_char             *p;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_log_module);\n    if (ctx == NULL) {\n        return buf;\n    }\n\n    p = (u_char *) ctx + op->offset;\n    while (*p) {\n        *buf++ = *p++;\n    }\n\n    return buf;\n}\n\n\nstatic size_t\nngx_rtmp_log_var_session_uint32_getlen(ngx_rtmp_session_t *s,\n    ngx_rtmp_log_op_t *op)\n{\n    return NGX_INT32_LEN;\n}\n\n\nstatic u_char *\nngx_rtmp_log_var_session_uint32_getdata(ngx_rtmp_session_t *s, u_char *buf,\n    ngx_rtmp_log_op_t *op)\n{\n    uint32_t   *v;\n\n    v = (uint32_t *) ((uint8_t *) s + op->offset);\n\n    return ngx_sprintf(buf, \"%uD\", *v);\n}\n\nstatic u_char *\nngx_rtmp_log_var_session_video_flag(ngx_rtmp_session_t *s, u_char *buf,\n    ngx_rtmp_log_op_t *op)\n{\n    ngx_rtmp_codec_ctx_t   *ctx;\n    ngx_int_t               flag;\n\n    flag = 0;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n    if (ctx) {\n        flag = (ctx->video_codec_id > 0);\n    }\n\n    return ngx_sprintf(buf, \"%d\", flag);\n}\n\nstatic u_char *\nngx_rtmp_log_var_session_audio_flag(ngx_rtmp_session_t *s, u_char *buf,\n    ngx_rtmp_log_op_t *op)\n{\n    ngx_rtmp_codec_ctx_t   *ctx;\n    ngx_int_t               flag;\n\n    flag = 0;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n    if (ctx) {\n        flag = (ctx->audio_codec_id > 0);\n    }\n\n    return ngx_sprintf(buf, \"%d\", flag);\n}\n\nstatic u_char *\nngx_rtmp_log_var_session_bitrate_getdata(ngx_rtmp_session_t *s, u_char *buf,\n    ngx_rtmp_log_op_t *op)\n{\n    ngx_rtmp_log_ctx_t   *ctx;\n    uint32_t              bitrate;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_log_module);\n    if (!ctx) {\n        return buf;\n    }\n\n    bitrate = 0;\n    if (s->publishing) {\n        bitrate = 8 * (s->in_bytes - ctx->last_bytes);\n        ctx->last_bytes = s->in_bytes;\n    } else {\n        bitrate = 8 * (s->out_bytes - ctx->last_bytes);\n        ctx->last_bytes = s->out_bytes;\n    }\n\n    return ngx_sprintf(buf, \"%D\", bitrate);\n}\n\nstatic size_t\nngx_rtmp_log_var_time_local_getlen(ngx_rtmp_session_t *s,\n    ngx_rtmp_log_op_t *op)\n{\n    return ngx_cached_http_log_time.len;\n}\n\n\nstatic u_char *\nngx_rtmp_log_var_time_local_getdata(ngx_rtmp_session_t *s, u_char *buf,\n    ngx_rtmp_log_op_t *op)\n{\n    return ngx_cpymem(buf, ngx_cached_http_log_time.data,\n                      ngx_cached_http_log_time.len);\n}\n\n\nstatic size_t\nngx_rtmp_log_var_session_time_getlen(ngx_rtmp_session_t *s,\n    ngx_rtmp_log_op_t *op)\n{\n    return NGX_INT64_LEN;\n}\n\n\nstatic u_char *\nngx_rtmp_log_var_session_time_getdata(ngx_rtmp_session_t *s, u_char *buf,\n    ngx_rtmp_log_op_t *op)\n{\n    return ngx_sprintf(buf, \"%L\",\n                       (int64_t) (ngx_current_msec - s->epoch) / 1000);\n}\n\n\nstatic size_t\nngx_rtmp_log_var_session_readable_time_getlen(ngx_rtmp_session_t *s,\n    ngx_rtmp_log_op_t *op)\n{\n    return NGX_INT_T_LEN + sizeof(\"d 23h 59m 59s\") - 1;\n}\n\n\nstatic u_char *\nngx_rtmp_log_var_session_readable_time_getdata(ngx_rtmp_session_t *s,\n    u_char *buf, ngx_rtmp_log_op_t *op)\n{\n    int64_t     v;\n    ngx_uint_t  days, hours, minutes, seconds;\n\n    v = (ngx_current_msec - s->epoch) / 1000;\n\n    days = (ngx_uint_t) (v / (60 * 60 * 24));\n    hours = (ngx_uint_t) (v / (60 * 60) % 24);\n    minutes = (ngx_uint_t) (v / 60 % 60);\n    seconds = (ngx_uint_t) (v % 60);\n\n    if (days) {\n        buf = ngx_sprintf(buf, \"%uid \", days);\n    }\n\n    if (days || hours) {\n        buf = ngx_sprintf(buf, \"%uih \", hours);\n    }\n\n    if (days || hours || minutes) {\n        buf = ngx_sprintf(buf, \"%uim \", minutes);\n    }\n\n    buf = ngx_sprintf(buf, \"%uis\", seconds);\n\n    return buf;\n}\n\n\nstatic ngx_rtmp_log_var_t ngx_rtmp_log_vars[] = {\n    { ngx_string(\"connection\"),\n      ngx_rtmp_log_var_connection_getlen,\n      ngx_rtmp_log_var_connection_getdata,\n      0 },\n\n    { ngx_string(\"remote_addr\"),\n      ngx_rtmp_log_var_remote_addr_getlen,\n      ngx_rtmp_log_var_remote_addr_getdata,\n      0 },\n\n    { ngx_string(\"app\"),\n      ngx_rtmp_log_var_session_string_getlen,\n      ngx_rtmp_log_var_session_string_getdata,\n      offsetof(ngx_rtmp_session_t, app) },\n\n    { ngx_string(\"flashver\"),\n      ngx_rtmp_log_var_session_string_getlen,\n      ngx_rtmp_log_var_session_string_getdata,\n      offsetof(ngx_rtmp_session_t, flashver) },\n\n    { ngx_string(\"swfurl\"),\n      ngx_rtmp_log_var_session_string_getlen,\n      ngx_rtmp_log_var_session_string_getdata,\n      offsetof(ngx_rtmp_session_t, swf_url) },\n\n    { ngx_string(\"tcurl\"),\n      ngx_rtmp_log_var_session_string_getlen,\n      ngx_rtmp_log_var_session_string_getdata,\n      offsetof(ngx_rtmp_session_t, tc_url) },\n\n    { ngx_string(\"domain\"),\n      ngx_rtmp_log_var_session_string_getlen,\n      ngx_rtmp_log_var_session_string_getdata,\n      offsetof(ngx_rtmp_session_t, domain) },\n\n    { ngx_string(\"parg_\"),\n      ngx_rtmp_log_var_parg_getlen,\n      ngx_rtmp_log_var_parg_getdata,\n      0 },\n\n    { ngx_string(\"pageurl\"),\n      ngx_rtmp_log_var_session_string_getlen,\n      ngx_rtmp_log_var_session_string_getdata,\n      offsetof(ngx_rtmp_session_t, page_url) },\n\n    { ngx_string(\"command\"),\n      ngx_rtmp_log_var_command_getlen,\n      ngx_rtmp_log_var_command_getdata,\n      0 },\n\n    { ngx_string(\"name\"),\n      ngx_rtmp_log_var_context_cstring_getlen,\n      ngx_rtmp_log_var_context_cstring_getdata,\n      offsetof(ngx_rtmp_log_ctx_t, name) },\n\n    { ngx_string(\"stream\"),\n      ngx_rtmp_log_var_context_cstring_getlen,\n      ngx_rtmp_log_var_context_cstring_getdata,\n      offsetof(ngx_rtmp_log_ctx_t, stream) },\n\n    { ngx_string(\"args\"),\n      ngx_rtmp_log_var_context_cstring_getlen,\n      ngx_rtmp_log_var_context_cstring_getdata,\n      offsetof(ngx_rtmp_log_ctx_t, args) },\n\n    { ngx_string(\"bytes_sent\"),\n      ngx_rtmp_log_var_session_uint32_getlen,\n      ngx_rtmp_log_var_session_uint32_getdata,\n      offsetof(ngx_rtmp_session_t, out_bytes) },\n\n    { ngx_string(\"bytes_received\"),\n      ngx_rtmp_log_var_session_uint32_getlen,\n      ngx_rtmp_log_var_session_uint32_getdata,\n      offsetof(ngx_rtmp_session_t, in_bytes) },\n\n    { ngx_string(\"time_local\"),\n      ngx_rtmp_log_var_time_local_getlen,\n      ngx_rtmp_log_var_time_local_getdata,\n      0 },\n\n    { ngx_string(\"msec\"),\n      ngx_rtmp_log_var_msec_getlen,\n      ngx_rtmp_log_var_msec_getdata,\n      0 },\n\n    { ngx_string(\"ntp\"),\n      ngx_rtmp_log_var_sec_getlen,\n      ngx_rtmp_log_var_sec_getdata,\n      0 },\n\n    { ngx_string(\"session_time\"),\n      ngx_rtmp_log_var_session_time_getlen,\n      ngx_rtmp_log_var_session_time_getdata,\n      0 },\n\n    { ngx_string(\"session_readable_time\"),\n      ngx_rtmp_log_var_session_readable_time_getlen,\n      ngx_rtmp_log_var_session_readable_time_getdata,\n      0 },\n\n    { ngx_string(\"bitrate\"),\n      ngx_rtmp_log_var_session_uint32_getlen,\n      ngx_rtmp_log_var_session_bitrate_getdata,\n      0 },\n\n    { ngx_string(\"be_video\"),\n      ngx_rtmp_log_var_session_uint32_getlen,\n      ngx_rtmp_log_var_session_video_flag,\n      0 },\n\n    { ngx_string(\"be_audio\"),\n      ngx_rtmp_log_var_session_uint32_getlen,\n      ngx_rtmp_log_var_session_audio_flag,\n      0 },\n\n    { ngx_null_string, NULL, NULL, 0 }\n};\n\n\nstatic void *\nngx_rtmp_log_create_main_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_log_main_conf_t   *lmcf;\n    ngx_rtmp_log_fmt_t         *fmt;\n\n    lmcf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_log_main_conf_t));\n    if (lmcf == NULL) {\n        return NULL;\n    }\n\n    if (ngx_array_init(&lmcf->formats, cf->pool, 4, sizeof(ngx_rtmp_log_fmt_t))\n        != NGX_OK)\n    {\n        return NULL;\n    }\n\n    fmt = ngx_array_push(&lmcf->formats);\n    if (fmt == NULL) {\n        return NULL;\n    }\n\n    ngx_str_set(&fmt->name, \"combined\");\n\n    fmt->ops = ngx_array_create(cf->pool, 16, sizeof(ngx_rtmp_log_op_t));\n    if (fmt->ops == NULL) {\n        return NULL;\n    }\n\n    return lmcf;\n\n}\n\n\nstatic void *\nngx_rtmp_log_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_log_app_conf_t *lacf;\n\n    lacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_log_app_conf_t));\n    if (lacf == NULL) {\n        return NULL;\n    }\n\n    return lacf;\n}\n\n\nstatic char *\nngx_rtmp_log_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_rtmp_log_app_conf_t    *prev = parent;\n    ngx_rtmp_log_app_conf_t    *conf = child;\n    ngx_rtmp_log_main_conf_t   *lmcf;\n    ngx_rtmp_log_fmt_t         *fmt;\n    ngx_rtmp_log_t             *log;\n\n    if (conf->logs || conf->off) {\n        return NGX_OK;\n    }\n\n    conf->logs = prev->logs;\n    conf->off = prev->off;\n\n    if (conf->logs || conf->off) {\n        return NGX_OK;\n    }\n\n    conf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_rtmp_log_t));\n    if (conf->logs == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    log = ngx_array_push(conf->logs);\n    if (log == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    log->file = ngx_conf_open_file(cf->cycle, &ngx_rtmp_access_log);\n    if (log->file == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    log->disk_full_time = 0;\n    log->error_log_time = 0;\n    log->trunc_timer = 0;\n\n    lmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_log_module);\n    fmt = lmcf->formats.elts;\n\n    log->format = &fmt[0];\n    lmcf->combined_used = 1;\n\n    return NGX_CONF_OK;\n}\n\n\n/*\n * access_log off;\n * access_log file;\n * access_log file format_name;\n * access_log file trunc=1m;\n * access_log file format_name trunc=1m;\n */\nstatic char *\nngx_rtmp_log_set_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_rtmp_log_app_conf_t    *lacf = conf;\n\n    ngx_rtmp_log_main_conf_t   *lmcf;\n    ngx_rtmp_log_fmt_t         *fmt;\n    ngx_rtmp_log_t             *log;\n    ngx_str_t                  *value, name, timer;\n    ngx_uint_t                  n;\n    ngx_flag_t                  format_configured;\n\n    name.len = 0;\n    format_configured = 0;\n\n    value = cf->args->elts;\n\n    if (ngx_strcmp(value[1].data, \"off\") == 0) {\n        lacf->off = 1;\n        return NGX_CONF_OK;\n    }\n\n    if (lacf->logs == NULL) {\n        lacf->logs = ngx_array_create(cf->pool, 2, sizeof(ngx_rtmp_log_t));\n        if (lacf->logs == NULL) {\n            return NGX_CONF_ERROR;\n        }\n    }\n\n    log = ngx_array_push(lacf->logs);\n    if (log == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    ngx_memzero(log, sizeof(*log));\n\n    lmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_log_module);\n\n    log->file = ngx_conf_open_file(cf->cycle, &value[1]);\n    if (log->file == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    for (n = 2; n < cf->args->nelts; ++n) {\n        /* sizeof(\"trunc=\") - 1 = 6 */\n        if (ngx_memcmp(\"trunc=\", value[n].data, 6) == 0) {\n            timer.data = value[n].data + 6;\n            timer.len = value[n].len - 6;\n\n            log->trunc_timer = ngx_parse_time(&timer, 0);\n            if (log->trunc_timer == (ngx_msec_t) NGX_ERROR) {\n                ngx_conf_log_error(NGX_LOG_WARN, cf, 0,\n                        \"unknown trunc timer format \\\"%V\\\"\", &timer);\n                return NGX_CONF_ERROR;\n            }\n        } else {\n            if (format_configured) {\n                ngx_conf_log_error(NGX_LOG_WARN, cf, 0,\n                        \"format name has been configured\");\n                return NGX_CONF_ERROR;\n            }\n\n            format_configured = 1;\n            name = value[n];\n        }\n    }\n\n    if (name.len == 0) {\n        ngx_str_set(&name, \"combined\");\n        lmcf->combined_used = 1;\n\n    } else {\n        if (ngx_strcmp(name.data, \"combined\") == 0) {\n            lmcf->combined_used = 1;\n        }\n    }\n\n    fmt = lmcf->formats.elts;\n    for (n = 0; n < lmcf->formats.nelts; ++n, ++fmt) {\n        if (fmt->name.len == name.len &&\n            ngx_strncasecmp(fmt->name.data, name.data, name.len) == 0)\n        {\n            log->format = fmt;\n            break;\n        }\n    }\n\n    if (log->format == NULL) {\n        ngx_conf_log_error(NGX_LOG_WARN, cf, 0, \"unknown log format \\\"%V\\\"\",\n                           &name);\n        return NGX_CONF_ERROR;\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic char *\nngx_rtmp_log_set_format(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_rtmp_log_main_conf_t   *lmcf = conf;\n    ngx_rtmp_log_fmt_t         *fmt;\n    ngx_str_t                  *value;\n    ngx_uint_t                  i;\n\n    value = cf->args->elts;\n\n    if (cf->cmd_type != NGX_RTMP_MAIN_CONF) {\n        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,\n                           \"\\\"log_format\\\" directive can only be used on \"\n                           \"\\\"rtmp\\\" level\");\n    }\n\n    fmt = lmcf->formats.elts;\n    for (i = 0; i < lmcf->formats.nelts; i++) {\n        if (fmt[i].name.len == value[1].len &&\n            ngx_strcmp(fmt[i].name.data, value[1].data) == 0)\n        {\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                               \"duplicate \\\"log_format\\\" name \\\"%V\\\"\",\n                               &value[1]);\n            return NGX_CONF_ERROR;\n        }\n    }\n\n    fmt = ngx_array_push(&lmcf->formats);\n    if (fmt == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    fmt->name = value[1];\n\n    fmt->ops = ngx_array_create(cf->pool, 16, sizeof(ngx_rtmp_log_op_t));\n    if (fmt->ops == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    return ngx_rtmp_log_compile_format(cf, fmt->ops, cf->args, 2);\n}\n\n\nstatic char *\nngx_rtmp_log_compile_format(ngx_conf_t *cf, ngx_array_t *ops, ngx_array_t *args,\n                            ngx_uint_t s)\n{\n    size_t              i, len;\n    u_char             *data, *d, c;\n    ngx_uint_t          bracket;\n    ngx_str_t          *value, var, pre_var;\n    ngx_rtmp_log_op_t  *op;\n    ngx_rtmp_log_var_t *v;\n    u_char             *p;\n\n    value = args->elts;\n\n    for (; s < args->nelts; ++s) {\n        i = 0;\n\n        len = value[s].len;\n        d = value[s].data;\n\n        while (i < len) {\n\n            op = ngx_array_push(ops);\n            if (op == NULL) {\n                return NGX_CONF_ERROR;\n            }\n\n            ngx_memzero(op, sizeof(*op));\n\n            data = &d[i];\n\n            if (d[i] == '$') {\n                if (++i == len) {\n                    goto invalid;\n                }\n\n                if (d[i] == '{') {\n                    bracket = 1;\n                    if (++i == len) {\n                        goto invalid;\n                    }\n                } else {\n                    bracket = 0;\n                }\n\n                var.data = &d[i];\n\n                for (var.len = 0; i < len; ++i, ++var.len) {\n                    c = d[i];\n\n                    if (c == '}' && bracket) {\n                        ++i;\n                        bracket = 0;\n                        break;\n                    }\n\n                    if ((c >= 'A' && c <= 'Z') ||\n                        (c >= 'a' && c <= 'z') ||\n                        (c >= '0' && c <= '9') ||\n                        (c == '_'))\n                    {\n                        continue;\n                    }\n\n                    break;\n                }\n\n                if (bracket) {\n                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                       \"missing closing bracket in \\\"%V\\\"\",\n                                       &var);\n                    return NGX_CONF_ERROR;\n                }\n\n                if (var.len == 0) {\n                    goto invalid;\n                }\n\n                for (v = ngx_rtmp_log_vars; v->name.len; ++v) {\n                    if (v->name.len == var.len &&\n                        ngx_strncmp(v->name.data, var.data, var.len) == 0)\n                    {\n                        op->getlen = v->getlen;\n                        op->getdata = v->getdata;\n                        op->offset = v->offset;\n                        break;\n                    }\n                }\n\n                if (v->name.len == 0) {\n                    p = ngx_strnstr(var.data, \"_\", var.len);\n                    if (p == NULL) {\n                        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                       \"unknown variable \\\"%V\\\"\", &var);\n                        return NGX_CONF_ERROR;\n                    }\n\n                    pre_var.data = var.data;\n                    pre_var.len = p - var.data + 1;\n                    for (v = ngx_rtmp_log_vars; v->name.len; ++v) {\n                        if (v->name.len == pre_var.len &&\n                            !ngx_strncmp(v->name.data, pre_var.data, pre_var.len))\n                        {\n                            op->getlen = v->getlen;\n                            op->getdata = v->getdata;\n                            op->offset = v->offset;\n                            op->value = var;\n                            break;\n                        }\n                    }\n                }\n\n                if (v->name.len == 0) {\n                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                       \"unknown variable \\\"%V\\\"\", &var);\n                    return NGX_CONF_ERROR;\n                }\n\n                continue;\n            }\n\n            ++i;\n\n            while (i < len && d[i] != '$') {\n                ++i;\n            }\n\n            op->getlen = ngx_rtmp_log_var_default_getlen;\n            op->getdata = ngx_rtmp_log_var_default_getdata;\n\n            op->value.len = &d[i] - data;\n\n            op->value.data = ngx_pnalloc(cf->pool, op->value.len);\n            if (op->value.data == NULL) {\n                return NGX_CONF_ERROR;\n            }\n\n            ngx_memcpy(op->value.data, data, op->value.len);\n        }\n    }\n\n    return NGX_CONF_OK;\n\ninvalid:\n\n    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, \"invalid parameter \\\"%s\\\"\", data);\n\n    return NGX_CONF_ERROR;\n}\n\n\nstatic ngx_rtmp_log_ctx_t *\nngx_rtmp_log_set_names(ngx_rtmp_session_t *s, u_char *name, u_char *args)\n{\n    ngx_rtmp_log_ctx_t         *ctx;\n    ngx_rtmp_log_app_conf_t    *lacf;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_log_module);\n    if (ctx == NULL) {\n        ctx = ngx_pcalloc(s->pool, sizeof(ngx_rtmp_log_ctx_t));\n        if (ctx == NULL) {\n            return NULL;\n        }\n\n        lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_log_module);\n\n        if (lacf->logs) {\n            if (ngx_array_init(&ctx->timers, s->pool,\n                lacf->logs->nelts, sizeof(ngx_rtmp_log_timer_ctx_t)) != NGX_OK)\n            {\n                return NULL;\n            }\n        }\n\n        ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_log_module);\n    }\n\n    ngx_memcpy(ctx->stream, s->stream.data, s->stream.len);\n    ngx_memcpy(ctx->name, name, NGX_RTMP_MAX_NAME);\n    ngx_memcpy(ctx->args, args, NGX_RTMP_MAX_ARGS);\n\n    return ctx;\n}\n\n\nstatic void\nngx_rtmp_log_write(ngx_rtmp_session_t *s, ngx_rtmp_log_t *log, u_char *buf,\n                   size_t len)\n{\n    u_char *name;\n    time_t  now;\n    ssize_t n;\n    int     err;\n\n    err = 0;\n    name = log->file->name.data;\n    n = ngx_write_fd(log->file->fd, buf, len);\n\n    if (n == (ssize_t) len) {\n        return;\n    }\n\n    now = ngx_time();\n\n    if (n == -1) {\n        err = ngx_errno;\n\n        if (err == NGX_ENOSPC) {\n            log->disk_full_time = now;\n        }\n\n        if (now - log->error_log_time > 59) {\n            ngx_log_error(NGX_LOG_ALERT, s->log, err,\n                          ngx_write_fd_n \" to \\\"%s\\\" failed\", name);\n            log->error_log_time = now;\n        }\n    }\n\n    if (now - log->error_log_time > 59) {\n        ngx_log_error(NGX_LOG_ALERT, s->log, err,\n                      ngx_write_fd_n \" to \\\"%s\\\" was incomplete: %z of %uz\",\n                      name, n, len);\n        log->error_log_time = now;\n    }\n}\n\nstatic void\nngx_rtmp_log_pre_write(ngx_rtmp_session_t *s, ngx_rtmp_log_t *log)\n{\n    ngx_rtmp_log_op_t          *op;\n    u_char                      line[MAX_ACCESS_LOG_LINE_LEN], *p;\n    size_t                      len;\n    ngx_uint_t                  n;\n\n    if (ngx_time() == log->disk_full_time) {\n        /* FreeBSD full disk protection;\n         * nginx http logger does the same */\n        return;\n    }\n\n    len = 0;\n    op = log->format->ops->elts;\n    for (n = 0; n < log->format->ops->nelts; ++n, ++op) {\n        len += op->getlen(s, op);\n    }\n    len += NGX_LINEFEED_SIZE;\n\n    if (len > MAX_ACCESS_LOG_LINE_LEN) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"Access line len %z greater than %d\",\n                len, MAX_ACCESS_LOG_LINE_LEN);\n        ngx_rtmp_finalize_session(s);\n\n        return;\n    }\n\n    p = line;\n    op = log->format->ops->elts;\n    for (n = 0; n < log->format->ops->nelts; ++n, ++op) {\n        p = op->getdata(s, p, op);\n    }\n\n    ngx_linefeed(p);\n\n    ngx_rtmp_log_write(s, log, line, p - line);\n}\n\nstatic void\nngx_rtmp_log_trunc_timer(ngx_event_t *ev)\n{\n    ngx_rtmp_log_timer_ctx_t   *ltctx;\n    ngx_rtmp_session_t         *s;\n    ngx_rtmp_log_t             *log;\n    ngx_msec_t                  t;\n\n    ltctx = ev->data;\n\n    s = ltctx->session;\n    log = ltctx->log;\n\n    ngx_rtmp_log_pre_write(s, log);\n\n    t = log->trunc_timer - ngx_current_msec % log->trunc_timer;\n    ngx_add_timer(ev, t);\n}\n\nstatic void\nngx_rtmp_log_add_trunc_timer(ngx_rtmp_session_t *s, ngx_rtmp_log_ctx_t *ctx,\n        ngx_rtmp_log_t *log)\n{\n    ngx_rtmp_log_timer_ctx_t   *ltctx;\n    ngx_event_t                *e;\n    ngx_msec_t                  t;\n\n    ltctx = ngx_array_push(&ctx->timers);\n    ngx_memzero(ltctx, sizeof(ngx_rtmp_log_timer_ctx_t));\n    ltctx->session = s;\n    ltctx->log = log;\n    e = &ltctx->event;\n\n    e->data = ltctx;\n    e->log = s->log;\n    e->handler = ngx_rtmp_log_trunc_timer;\n\n    t = log->trunc_timer - ngx_current_msec % log->trunc_timer;\n    ngx_add_timer(e, t);\n}\n\nstatic ngx_int_t\nngx_rtmp_log_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v)\n{\n    ngx_rtmp_log_app_conf_t    *lacf;\n    ngx_rtmp_log_t             *log;\n    ngx_rtmp_log_ctx_t         *ctx;\n    ngx_uint_t                  i;\n\n    if (s->interprocess || s->relay) {\n        goto next;\n    }\n\n    ctx = ngx_rtmp_log_set_names(s, v->name, v->args);\n    if (ctx == NULL) {\n        goto next;\n    }\n\n    if (ctx->publish) { /* avoid multi push */\n        goto next;\n    }\n\n    ctx->publish = 1;\n\n    lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_log_module);\n\n    if (lacf->logs == NULL) {\n        goto next;\n    }\n\n    log = lacf->logs->elts;\n    for (i = 0; i < lacf->logs->nelts; ++i, ++log) {\n        if (log->trunc_timer != 0) {\n            ngx_rtmp_log_add_trunc_timer(s, ctx, log);\n        }\n    }\n\nnext:\n    return next_publish(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_log_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v)\n{\n    ngx_rtmp_log_app_conf_t    *lacf;\n    ngx_rtmp_log_t             *log;\n    ngx_rtmp_log_ctx_t         *ctx;\n    ngx_uint_t                  i;\n\n    if (s->interprocess || s->relay) {\n        goto next;\n    }\n\n    ctx = ngx_rtmp_log_set_names(s, v->name, v->args);\n    if (ctx == NULL) {\n        goto next;\n    }\n\n    if (ctx->play) { /* avoid mulit pull */\n        goto next;\n    }\n\n    ctx->play = 1;\n\n    lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_log_module);\n\n    if (lacf->logs == NULL) {\n        goto next;\n    }\n\n    log = lacf->logs->elts;\n    for (i = 0; i < lacf->logs->nelts; ++i, ++log) {\n        if (log->trunc_timer != 0) {\n            ngx_rtmp_log_add_trunc_timer(s, ctx, log);\n        }\n    }\n\nnext:\n    return next_play(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_log_disconnect(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n                        ngx_chain_t *in)\n{\n    ngx_rtmp_log_app_conf_t    *lacf;\n    ngx_rtmp_log_ctx_t         *ctx;\n    ngx_rtmp_log_timer_ctx_t   *ltctx;\n    ngx_rtmp_log_t             *log;\n    ngx_uint_t                  i;\n\n    if (s->interprocess || s->relay) {\n        return NGX_OK;\n    }\n\n    lacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_log_module);\n    if (lacf == NULL || lacf->off || lacf->logs == NULL) {\n        return NGX_OK;\n    }\n\n    log = lacf->logs->elts;\n    for (i = 0; i < lacf->logs->nelts; ++i, ++log) {\n        ngx_rtmp_log_pre_write(s, log);\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_log_module);\n\n    if (ctx == NULL) {\n        return NGX_OK;\n    }\n\n    ltctx = ctx->timers.elts;\n    for (i = 0; i < ctx->timers.nelts; ++i, ++ltctx) {\n        ngx_del_timer(&ltctx->event);\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_log_postconfiguration(ngx_conf_t *cf)\n{\n    ngx_rtmp_core_main_conf_t  *cmcf;\n    ngx_rtmp_handler_pt        *h;\n    ngx_rtmp_log_main_conf_t   *lmcf;\n    ngx_array_t                 a;\n    ngx_rtmp_log_fmt_t         *fmt;\n    ngx_str_t                  *value;\n\n    lmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_log_module);\n    if (lmcf->combined_used) {\n        if (ngx_array_init(&a, cf->pool, 1, sizeof(ngx_str_t)) != NGX_OK) {\n            return NGX_ERROR;\n        }\n\n        value = ngx_array_push(&a);\n        if (value == NULL) {\n            return NGX_ERROR;\n        }\n\n        *value = ngx_rtmp_combined_fmt;\n        fmt = lmcf->formats.elts;\n\n        if (ngx_rtmp_log_compile_format(cf, fmt->ops, &a, 0)\n            != NGX_CONF_OK)\n        {\n            return NGX_ERROR;\n        }\n    }\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_DISCONNECT]);\n    *h = ngx_rtmp_log_disconnect;\n\n    next_publish = ngx_rtmp_publish;\n    ngx_rtmp_publish = ngx_rtmp_log_publish;\n\n    next_play = ngx_rtmp_play;\n    ngx_rtmp_play = ngx_rtmp_log_play;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_monitor_module.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include \"ngx_rtmp_monitor_module.h\"\n#include \"ngx_rtmp_cmd_module.h\"\n#include \"ngx_rtmp_codec_module.h\"\n\n\nstatic ngx_rtmp_close_stream_pt         next_close_stream;\n\n\nstatic void *ngx_rtmp_monitor_create_app_conf(ngx_conf_t *cf);\nstatic char *ngx_rtmp_monitor_merge_app_conf(ngx_conf_t *cf,\n       void *parent, void *child);\nstatic ngx_int_t ngx_rtmp_monitor_postconfiguration(ngx_conf_t *cf);\n\nstatic char *ngx_rtmp_monitor_dump(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\nstatic char *ngx_rtmp_monitor_buffered_log(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\n\n\n#define NGX_RTMP_MONITOR_BUFFER_SIZE    61\n\n\ntypedef struct {\n    ngx_str_t                   dump_path;\n    ngx_flag_t                  monitor;\n    ngx_log_t                  *buffered_log;\n} ngx_rtmp_monitor_app_conf_t;\n\n\ntypedef struct {\n    ngx_event_t                 consume;\n    ngx_msec_t                  buffered;\n    ngx_uint_t                  nbuffered;\n\n    double                      frame_rate;\n    double                      nframes;\n\n    double                      buffers[NGX_RTMP_MONITOR_BUFFER_SIZE];\n    ngx_uint_t                  fps[NGX_RTMP_MONITOR_BUFFER_SIZE];\n    ngx_uint_t                  curr;\n\n    ngx_flag_t                  dump;\n\n    unsigned                    publishing:1;\n} ngx_rtmp_monitor_ctx_t;\n\n\nstatic ngx_command_t  ngx_rtmp_monitor_commands[] = {\n\n    { ngx_string(\"dump\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_rtmp_monitor_dump,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"buffered_log\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_monitor_buffered_log,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_rtmp_monitor_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_rtmp_monitor_postconfiguration,     /* postconfiguration */\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    ngx_rtmp_monitor_create_app_conf,       /* create app configuration */\n    ngx_rtmp_monitor_merge_app_conf         /* merge app configuration */\n};\n\n\nngx_module_t  ngx_rtmp_monitor_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_monitor_module_ctx,           /* module context */\n    ngx_rtmp_monitor_commands,              /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void\nngx_rtmp_monitor_dump_frame(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n}\n\nstatic void\nngx_rtmp_monitor_consume(ngx_event_t *ev)\n{\n    ngx_rtmp_session_t             *s, *ps;\n    ngx_rtmp_monitor_ctx_t         *ctx;\n    ngx_rtmp_codec_ctx_t           *cctx;\n    ngx_rtmp_monitor_app_conf_t    *macf;\n    u_char                          peer[NGX_SOCKADDR_STRLEN];\n    u_char                          local[NGX_SOCKADDR_STRLEN];\n    struct sockaddr                 paddr, laddr;\n    socklen_t                       plen, llen;\n\n    s = ev->data;\n\n    macf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_monitor_module);\n\n    if (macf->monitor == 0) {\n        return;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_monitor_module);\n    if (ctx == NULL) {\n        return;\n    }\n\n    if (ctx->publishing) {\n        ps = s;\n    } else {\n        if (s->live_stream->publish_ctx) {\n            ps = s->live_stream->publish_ctx->session;\n        } else {\n            goto next;\n        }\n    }\n\n    cctx = ngx_rtmp_get_module_ctx(ps, ngx_rtmp_codec_module);\n    if (cctx == NULL) {\n        goto next;\n    }\n\n    if (cctx->frame_rate != 0) {\n        ctx->frame_rate = cctx->frame_rate;\n    }\n\nnext:\n    if (ctx->frame_rate == 0) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"monitor, frame rate error, stream: %V, frame rate: %.2f\",\n                &s->stream, ctx->frame_rate);\n        return;\n    }\n\n    ctx->nframes -= ctx->frame_rate;\n\n    if (ctx->nframes <= 0) {\n        ctx->nframes = 0;\n        if (ctx->buffered == 0) {\n            ++ctx->nbuffered;\n        }\n        ++ctx->buffered;\n\n        ngx_memzero(local, sizeof(local));\n        ngx_memzero(peer, sizeof(peer));\n        plen = sizeof(paddr);\n        llen = sizeof(laddr);\n\n        if (s->connection) {\n            getpeername(s->connection->fd, &paddr, &plen);\n            getsockname(s->connection->fd, &laddr, &llen);\n\n            ngx_sock_ntop(&paddr, plen, peer, NGX_SOCKADDR_STRLEN, 1);\n            ngx_sock_ntop(&laddr, llen, local, NGX_SOCKADDR_STRLEN, 1);\n\n            ngx_log_error(NGX_LOG_ERR, macf->buffered_log, 0,\n                    \"%p %s, peer: %s, local: %s, \"\n                    \"stream: %V, buffered: %ui, time: %uis\",\n                    s, ctx->publishing ? \"publisher\" : \"player\", peer, local,\n                    &s->stream, ctx->nbuffered, ctx->buffered);\n\n        }\n    } else {\n        ctx->buffered = 0;\n    }\n\n    ctx->buffers[ctx->curr] = ctx->nframes;\n\n    ctx->curr = (ctx->curr + 1) % NGX_RTMP_MONITOR_BUFFER_SIZE;\n\n    ctx->fps[ctx->curr] = 0;\n\n    ngx_add_timer(&ctx->consume, 1000);\n}\n\nstatic ngx_int_t\nngx_rtmp_monitor_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    ngx_rtmp_monitor_frame(s, h, in, ngx_rtmp_is_codec_header(in), 1);\n\n//    if (h->type == NGX_RTMP_MSG_VIDEO) {\n//        ngx_log_error(NGX_LOG_INFO, s->log, 0,\n//                \"!!!!!!video(%d): %02xD %02xD %02xD %02xD %02xD\",\n//                h->mlen, in->buf->pos[0], in->buf->pos[1], in->buf->pos[2],\n//                in->buf->pos[3], in->buf->pos[4], in->buf->pos[5]);\n//    }\n//\n//    if (h->type == NGX_RTMP_MSG_AUDIO) {\n//        ngx_log_error(NGX_LOG_INFO, s->log, 0,\n//                \"!!!!!!audio(%d): %02xD %02xD %02xD %02xD %02xD\",\n//                h->mlen, in->buf->pos[0], in->buf->pos[1], in->buf->pos[2],\n//                in->buf->pos[3], in->buf->pos[4], in->buf->pos[5]);\n//    }\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_rtmp_monitor_meta_data(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in)\n{\n    if (s->first_metadata == 0) {\n        s->stage = NGX_LIVE_AV;\n        s->first_metadata = ngx_current_msec;\n        s->first_data = s->first_data == 0? ngx_current_msec: s->first_data;\n    }\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0, \"receive metadata\");\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_rtmp_monitor_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)\n{\n    ngx_rtmp_monitor_ctx_t     *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_monitor_module);\n\n    if (ctx == NULL) {\n        goto next;\n    }\n\n    if (ctx->consume.timer_set) {\n        ngx_del_timer(&ctx->consume);\n    }\n\n    if (ctx->consume.posted) {\n        ngx_delete_posted_event(&ctx->consume);\n    }\n\nnext:\n    return next_close_stream(s, v);\n}\n\nvoid\nngx_rtmp_monitor_frame(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in, ngx_flag_t is_header, ngx_flag_t publishing)\n{\n    ngx_rtmp_monitor_app_conf_t    *macf;\n    ngx_rtmp_monitor_ctx_t         *ctx;\n\n    if (s->first_metadata == 0 && (h->type == NGX_RTMP_MSG_AMF_META\n                               || h->type == NGX_RTMP_MSG_AMF3_META))\n    {\n        s->stage = NGX_LIVE_AV;\n        s->first_metadata = ngx_current_msec;\n        s->first_data = s->first_data == 0? ngx_current_msec: s->first_data;\n    }\n\n    if (s->first_audio == 0 && h->type == NGX_RTMP_MSG_AUDIO) {\n        s->stage = NGX_LIVE_AV;\n        s->first_audio = ngx_current_msec;\n        s->first_data = s->first_data == 0? ngx_current_msec: s->first_data;\n    }\n\n    if (s->first_video == 0 && h->type == NGX_RTMP_MSG_VIDEO) {\n        s->stage = NGX_LIVE_AV;\n        s->first_video = ngx_current_msec;\n        s->first_data = s->first_data == 0? ngx_current_msec: s->first_data;\n    }\n\n    if (h->type == NGX_RTMP_MSG_AUDIO && is_header) {\n        if (s->publishing) {\n            ngx_log_error(NGX_LOG_INFO, s->log, 0, \"receive audio header\");\n        } else {\n            ngx_log_error(NGX_LOG_INFO, s->log, 0, \"send audio header\");\n        }\n    }\n\n    if (h->type == NGX_RTMP_MSG_VIDEO && is_header) {\n        if (s->publishing) {\n            ngx_log_error(NGX_LOG_INFO, s->log, 0, \"receive video header\");\n        } else {\n            ngx_log_error(NGX_LOG_INFO, s->log, 0, \"send video header\");\n        }\n    }\n\n    if (h->type != NGX_RTMP_MSG_VIDEO) {\n        return;\n    }\n\n    macf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_monitor_module);\n\n    if (macf->monitor == 0) {\n        return;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_monitor_module);\n\n    if (ctx == NULL) {\n        ctx = ngx_pcalloc(s->pool, sizeof(ngx_rtmp_monitor_ctx_t));\n        if (ctx == NULL) {\n            return;\n        }\n        ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_monitor_module);\n\n        ctx->dump = macf->dump_path.len > 0;\n        ctx->publishing = publishing;\n\n        ctx->consume.data = s;\n        ctx->consume.log = s->log;\n        ctx->consume.handler = ngx_rtmp_monitor_consume;\n        ngx_add_timer(&ctx->consume, 1000);\n    }\n\n    if (publishing && ctx->dump) {\n        ngx_rtmp_monitor_dump_frame(s, h, in);\n    }\n\n    if (is_header) {\n        return;\n    }\n\n    ++ctx->nframes;\n    ++ctx->fps[ctx->curr];\n}\n\n\nstatic void *\nngx_rtmp_monitor_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_monitor_app_conf_t\t   *macf;\n\n    macf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_monitor_app_conf_t));\n    if (macf == NULL) {\n        return NULL;\n    }\n\n    macf->monitor = NGX_CONF_UNSET;\n\n    return macf;\n}\n\nstatic char *\nngx_rtmp_monitor_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_rtmp_monitor_app_conf_t    *prev = parent;\n    ngx_rtmp_monitor_app_conf_t    *conf = child;\n\n    if (conf->dump_path.data == NULL) {\n        conf->dump_path = prev->dump_path;\n    }\n\n    ngx_conf_merge_value(conf->monitor, prev->monitor, 0);\n\n    if (conf->buffered_log == NULL) {\n        if (prev->buffered_log) {\n            conf->buffered_log = prev->buffered_log;\n        } else {\n            conf->buffered_log = &cf->cycle->new_log;\n        }\n    }\n\n    return NGX_CONF_OK;\n}\n\nstatic char *\nngx_rtmp_monitor_dump(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_rtmp_monitor_app_conf_t    *macf;\n    ngx_str_t                      *value;\n\n    macf = conf;\n\n    if (macf->dump_path.len) {\n        return \"is duplicate\";\n    }\n\n    value = cf->args->elts;\n\n    macf->dump_path = value[1];\n\n    if (macf->dump_path.len > 0 &&\n            macf->dump_path.data[macf->dump_path.len - 1] == '/')\n    {\n        --macf->dump_path.len;\n    }\n\n    if (ngx_conf_full_name(cf->cycle, &macf->dump_path, 0) != NGX_OK) {\n        return NGX_CONF_ERROR;\n    }\n\n    return NGX_CONF_OK;\n}\n\nstatic char *\nngx_rtmp_monitor_buffered_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_rtmp_monitor_app_conf_t    *macf;\n\n    macf = conf;\n\n    macf->monitor = 1;\n\n    return ngx_log_set_log(cf, &macf->buffered_log);\n}\n\nstatic ngx_int_t\nngx_rtmp_monitor_postconfiguration(ngx_conf_t *cf)\n{\n    ngx_rtmp_core_main_conf_t          *cmcf;\n    ngx_rtmp_handler_pt                *h;\n    ngx_rtmp_amf_handler_t             *ch;\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]);\n    *h = ngx_rtmp_monitor_av;\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]);\n    *h = ngx_rtmp_monitor_av;\n\n    /* register metadata handler */\n    ch = ngx_array_push(&cmcf->amf);\n    if (ch == NULL) {\n        return NGX_ERROR;\n    }\n    ngx_str_set(&ch->name, \"@setDataFrame\");\n    ch->handler = ngx_rtmp_monitor_meta_data;\n\n    ch = ngx_array_push(&cmcf->amf);\n    if (ch == NULL) {\n        return NGX_ERROR;\n    }\n    ngx_str_set(&ch->name, \"onMetaData\");\n    ch->handler = ngx_rtmp_monitor_meta_data;\n\n    next_close_stream = ngx_rtmp_close_stream;\n    ngx_rtmp_close_stream = ngx_rtmp_monitor_close_stream;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_monitor_module.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_RTMP_MONITOR_H_INCLUDED_\n#define _NGX_RTMP_MONITOR_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_event.h>\n#include \"ngx_rtmp.h\"\n\n\nvoid ngx_rtmp_monitor_frame(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n        ngx_chain_t *in, ngx_flag_t is_header, ngx_flag_t publishing);\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_notify_module.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n *\n * Open Capability Live Platform\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_cmd_module.h\"\n#include \"ngx_live_record.h\"\n#include \"ngx_live_relay.h\"\n#include \"ngx_dynamic_resolver.h\"\n#include \"ngx_toolkit_misc.h\"\n#include \"ngx_netcall.h\"\n#include \"ngx_rtmp_variables.h\"\n\n\nstatic ngx_live_record_start_pt     next_record_start;\nstatic ngx_live_record_update_pt    next_record_update;\nstatic ngx_live_record_done_pt      next_record_done;\n\n\nstatic ngx_rtmp_publish_pt          next_publish;\nstatic ngx_rtmp_play_pt             next_play;\nstatic ngx_rtmp_close_stream_pt     next_close_stream;\n\n\nstatic ngx_live_push_pt             next_push;\nstatic ngx_live_pull_pt             next_pull;\nstatic ngx_live_push_close_pt       next_push_close;\nstatic ngx_live_pull_close_pt       next_pull_close;\n\n\nstatic ngx_int_t ngx_rtmp_notify_init_process(ngx_cycle_t *cycle);\n\nstatic ngx_int_t ngx_rtmp_notify_postconfiguration(ngx_conf_t *cf);\nstatic void *ngx_rtmp_notify_create_main_conf(ngx_conf_t *cf);\nstatic char *ngx_rtmp_notify_init_main_conf(ngx_conf_t *cf, void *conf);\nstatic void *ngx_rtmp_notify_create_srv_conf(ngx_conf_t *cf);\nstatic char *ngx_rtmp_notify_merge_srv_conf(ngx_conf_t *cf, void *parent,\n       void *child);\nstatic void *ngx_rtmp_notify_create_app_conf(ngx_conf_t *cf);\nstatic char *ngx_rtmp_notify_merge_app_conf(ngx_conf_t *cf, void *parent,\n       void *child);\n\nstatic char *ngx_rtmp_notify_on_main_event(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\nstatic char *ngx_rtmp_notify_on_srv_event(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\nstatic char *ngx_rtmp_notify_on_app_event(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\n\n#define NGX_RTMP_OCLP_START     0x01\n#define NGX_RTMP_OCLP_UPDATE    0x02\n#define NGX_RTMP_OCLP_DONE      0x04\n\n\nenum {\n    NGX_RTMP_OCLP_PROC,         /* only notify */\n    NGX_RTMP_OCLP_MAIN_MAX\n};\n\nenum {\n    NGX_RTMP_OCLP_CONNECT,      /* only notify */\n    NGX_RTMP_OCLP_SRV_MAX\n};\n\nenum {\n    NGX_RTMP_OCLP_PLAY,         /* only notify */\n    NGX_RTMP_OCLP_PUBLISH,      /* only notify */\n    NGX_RTMP_OCLP_PULL,         /* relay pull */\n    NGX_RTMP_OCLP_PUSH,         /* relay push */\n    NGX_RTMP_OCLP_STREAM,       /* only notify */\n    NGX_RTMP_OCLP_META,         /* for transcode */\n    NGX_RTMP_OCLP_RECORD,       /* for record */\n    NGX_RTMP_OCLP_APP_MAX\n};\n\nstatic char *ngx_rtmp_notify_stage[] = {\n    \"\",\n    \"start\",\n    \"update\",\n    \"\",\n    \"done\",\n};\n\nstatic char *ngx_rtmp_notify_app_type[] = {\n    \"play\",\n    \"publish\",\n    \"pull\",\n    \"push\",\n    \"stream\",\n    \"meta\",\n    \"record\",\n};\n\ntypedef struct {\n    ngx_uint_t                  status;\n    char                       *code;\n    char                       *level;\n    char                       *desc;\n} ngx_rtmp_notify_relay_error_t;\n\nstatic ngx_rtmp_notify_relay_error_t ngx_rtmp_notify_relay_errors[] = {\n    { 404, \"NetStream.Play.StreamNotFound\", \"error\", \"No such stream\" },\n    { 400, \"NetStream.Publish.BadName\",     \"error\", \"Already publishing\" },\n    { 0, NULL, NULL, NULL },\n};\n\n\n#define NGX_RTMP_OCLP_META_VIDEO    0\n#define NGX_RTMP_OCLP_META_AUDIO    1\n#define NGX_RTMP_OCLP_META_BOTH     2\n\nstatic ngx_conf_enum_t ngx_rtmp_notify_meta_type[] = {\n    { ngx_string(\"video\"),  NGX_RTMP_OCLP_META_VIDEO },\n    { ngx_string(\"audio\"),  NGX_RTMP_OCLP_META_AUDIO },\n    { ngx_string(\"both\"),   NGX_RTMP_OCLP_META_BOTH  },\n    { ngx_null_string,      0 }\n};\n\ntypedef struct {\n    ngx_str_t                   url;\n    ngx_str_t                   args;\n    ngx_str_t                   groupid;\n    ngx_uint_t                  stage;\n    ngx_msec_t                  timeout;\n    ngx_msec_t                  update;\n} ngx_rtmp_notify_event_t;\n\ntypedef struct {\n    ngx_rtmp_notify_event_t       events[NGX_RTMP_OCLP_MAIN_MAX];\n} ngx_rtmp_notify_main_conf_t;\n\ntypedef struct {\n    ngx_rtmp_notify_event_t       events[NGX_RTMP_OCLP_SRV_MAX];\n} ngx_rtmp_notify_srv_conf_t;\n\ntypedef struct {\n    ngx_flag_t                  ignore_invalid_notify;\n    ngx_flag_t                  meta_once;\n    ngx_uint_t                  meta_type;\n    ngx_array_t                 events[NGX_RTMP_OCLP_APP_MAX];\n} ngx_rtmp_notify_app_conf_t;\n\n\ntypedef struct {\n    ngx_netcall_ctx_t          *nctx;\n    ngx_netcall_ctx_t          *rctx;\n\n    ngx_rtmp_notify_event_t      *event;\n    ngx_uint_t                  type;\n    ngx_live_relay_t           *relay;\n\n    ngx_rtmp_publish_t          publish_v;\n    ngx_rtmp_play_t             play_v;\n} ngx_rtmp_notify_ctx_t;\n\n\nstatic ngx_command_t ngx_rtmp_notify_commands[] = {\n\n    { ngx_string(\"ignore_invalid_notify\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_notify_app_conf_t, ignore_invalid_notify),\n      NULL },\n\n    { ngx_string(\"on_proc\"),\n      NGX_RTMP_MAIN_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_main_event,\n      NGX_RTMP_MAIN_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"on_connect\"),\n      NGX_RTMP_SRV_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_srv_event,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"on_play\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_app_event,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"on_publish\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_app_event,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"on_pull\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_app_event,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"on_push\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_app_event,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"on_stream\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_app_event,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"on_meta\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_app_event,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"on_record\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_app_event,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"on_meta_once\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_notify_app_conf_t, meta_once),\n      NULL },\n\n    { ngx_string(\"on_meta_type\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_conf_set_enum_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_notify_app_conf_t, meta_type),\n      &ngx_rtmp_notify_meta_type },\n////////////////////////////////////////////////////////////////////\n\n    { ngx_string(\"oclp_proc\"),\n      NGX_RTMP_MAIN_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_main_event,\n      NGX_RTMP_MAIN_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"oclp_connect\"),\n      NGX_RTMP_SRV_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_srv_event,\n      NGX_RTMP_SRV_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"oclp_play\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_app_event,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"oclp_publish\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_app_event,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"oclp_pull\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_app_event,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"oclp_push\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_app_event,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"oclp_stream\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_app_event,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"oclp_meta\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_app_event,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"oclp_record\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_rtmp_notify_on_app_event,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n    { ngx_string(\"oclp_meta_once\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_notify_app_conf_t, meta_once),\n      NULL },\n\n    { ngx_string(\"oclp_meta_type\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|NGX_CONF_1MORE,\n      ngx_conf_set_enum_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_notify_app_conf_t, meta_type),\n      &ngx_rtmp_notify_meta_type },\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_rtmp_notify_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_rtmp_notify_postconfiguration,        /* postconfiguration */\n    ngx_rtmp_notify_create_main_conf,         /* create main configuration */\n    ngx_rtmp_notify_init_main_conf,           /* init main configuration */\n    ngx_rtmp_notify_create_srv_conf,          /* create server configuration */\n    ngx_rtmp_notify_merge_srv_conf,           /* merge server configuration */\n    ngx_rtmp_notify_create_app_conf,          /* create app configuration */\n    ngx_rtmp_notify_merge_app_conf            /* merge app configuration */\n};\n\n\nngx_module_t  ngx_rtmp_notify_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_notify_module_ctx,              /* module context */\n    ngx_rtmp_notify_commands,                 /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    ngx_rtmp_notify_init_process,             /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_rtmp_notify_create_main_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_notify_main_conf_t  *omcf;\n\n    omcf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_notify_main_conf_t));\n    if (omcf == NULL) {\n        return NULL;\n    }\n\n    return omcf;\n}\n\nstatic char *\nngx_rtmp_notify_init_main_conf(ngx_conf_t *cf, void *conf)\n{\n    return NGX_CONF_OK;\n}\n\nstatic void *\nngx_rtmp_notify_create_srv_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_notify_srv_conf_t   *oscf;\n\n    oscf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_notify_srv_conf_t));\n    if (oscf == NULL) {\n        return NULL;\n    }\n\n    return oscf;\n}\n\nstatic char *\nngx_rtmp_notify_merge_srv_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    return NGX_CONF_OK;\n}\n\nstatic void *\nngx_rtmp_notify_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_notify_app_conf_t   *oacf;\n    ngx_uint_t                  n;\n\n    oacf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_notify_app_conf_t));\n    if (oacf == NULL) {\n        return NULL;\n    }\n\n    for (n = 0; n < NGX_RTMP_OCLP_APP_MAX; ++n) {\n        if (ngx_array_init(&oacf->events[n], cf->pool, NGX_RTMP_MAX_OCLP,\n            sizeof(ngx_rtmp_notify_event_t)) == NGX_ERROR)\n        {\n            return NULL;\n        }\n    }\n\n    oacf->meta_once = NGX_CONF_UNSET;\n    oacf->meta_type = NGX_CONF_UNSET_UINT;\n    oacf->ignore_invalid_notify = NGX_CONF_UNSET;\n\n    return oacf;\n}\n\nstatic char *\nngx_rtmp_notify_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_rtmp_notify_app_conf_t   *prev = parent;\n    ngx_rtmp_notify_app_conf_t   *conf = child;\n\n    ngx_conf_merge_value(conf->meta_once, prev->meta_once, 1);\n    ngx_conf_merge_uint_value(conf->meta_type, prev->meta_type,\n                              NGX_RTMP_OCLP_META_VIDEO);\n    ngx_conf_merge_value(conf->ignore_invalid_notify,\n        prev->ignore_invalid_notify, 1);\n\n    return NGX_CONF_OK;\n}\n\nstatic ngx_int_t\nngx_rtmp_notify_create_event(ngx_conf_t *cf, ngx_rtmp_notify_event_t *event,\n    ngx_str_t *values, ngx_uint_t n)\n{\n    ngx_request_url_t           ru;\n    ngx_str_t                   tmp;\n    ngx_uint_t                  i;\n    u_char                     *p, *last;\n\n    for (i = 0; i < n; ++i) {\n        if (ngx_strncmp(values[i].data, \"args=\", 5) == 0) {\n            tmp = values[i];\n            tmp.len -= 5;\n            tmp.data += 5;\n            ngx_rtmp_variable_transform_index(cf, &tmp, &event->args);\n//            event->args.len = values[i].len - 5;\n//            event->args.data = values[i].data + 5;\n            continue;\n        }\n\n        if (ngx_strncmp(values[i].data, \"groupid=\", 8) == 0) {\n            event->groupid.len = values[i].len - 8;\n            event->groupid.data = values[i].data + 8;\n            continue;\n        }\n\n        if (ngx_strncmp(values[i].data, \"stage=\", 6) == 0) {\n            p = values[i].data + 6;\n            last = values[i].data + values[i].len;\n\n            while (1) {\n                tmp.data = p;\n                p = ngx_strlchr(p, last, ',');\n                if (p == NULL) {\n                    tmp.len = last - tmp.data;\n                } else {\n                    tmp.len = p - tmp.data;\n                }\n\n                switch (tmp.len) {\n                case 4:\n                    if (ngx_strncmp(tmp.data, \"done\", 4) == 0) {\n                        event->stage |= NGX_RTMP_OCLP_DONE;\n                    } else {\n                        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,\n                                \"unknown stage \\\"%V\\\"\", &tmp);\n                        return NGX_ERROR;\n                    }\n                    break;\n                case 5:\n                    if (ngx_strncmp(tmp.data, \"start\", 5) == 0) {\n                        event->stage |= NGX_RTMP_OCLP_START;\n                    } else {\n                        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,\n                                \"unknown stage \\\"%V\\\"\", &tmp);\n                        return NGX_ERROR;\n                    }\n                    break;\n                case 6:\n                    if (ngx_strncmp(tmp.data, \"update\", 6) == 0) {\n                        event->stage |= NGX_RTMP_OCLP_UPDATE;\n                    } else {\n                        ngx_conf_log_error(NGX_LOG_WARN, cf, 0,\n                                \"unknown stage \\\"%V\\\"\", &tmp);\n                        return NGX_ERROR;\n                    }\n                    break;\n                default:\n                    ngx_conf_log_error(NGX_LOG_WARN, cf, 0,\n                            \"unknown stage \\\"%V\\\"\", &tmp);\n                    return NGX_ERROR;\n                }\n\n                if (p == last || p == NULL) {\n                    break;\n                }\n\n                ++p;\n            }\n\n            continue;\n        }\n\n        if (ngx_strncmp(values[i].data, \"timeout=\", 8) == 0) {\n            tmp.len = values[i].len - 8;\n            tmp.data = values[i].data + 8;\n\n            event->timeout = ngx_parse_time(&tmp, 0);\n            if (event->timeout == (ngx_msec_t) NGX_ERROR) {\n                ngx_conf_log_error(NGX_LOG_WARN, cf, 0,\n                        \"unknown timeout timer format \\\"%V\\\"\", &tmp);\n                return NGX_ERROR;\n            }\n\n            continue;\n        }\n\n        if (ngx_strncmp(values[i].data, \"update=\", 7) == 0) {\n            tmp.len = values[i].len - 7;\n            tmp.data = values[i].data + 7;\n\n            event->update = ngx_parse_time(&tmp, 0);\n            if (event->update == (ngx_msec_t) NGX_ERROR) {\n                ngx_conf_log_error(NGX_LOG_WARN, cf, 0,\n                        \"unknown cont timer format \\\"%V\\\"\", &tmp);\n                return NGX_ERROR;\n            }\n\n            continue;\n        }\n\n        if (ngx_strncmp(values[i].data, \"http://\", 7) != 0) {\n            ngx_conf_log_error(NGX_LOG_WARN, cf, 0, \"must be http url\");\n            return NGX_ERROR;\n        }\n\n        if (event->url.len != 0) {\n            ngx_conf_log_error(NGX_LOG_WARN, cf, 0, \"duplicate url\");\n            return NGX_ERROR;\n        }\n\n        event->url.len = values[i].len;\n        event->url.data = values[i].data;\n        if (values[i].data[values[i].len - 1] != '/') {\n            event->url.data = ngx_pcalloc(cf->pool, values[i].len + 1);\n            event->url.len = values[i].len + 1;\n            ngx_snprintf(event->url.data, event->url.len, \"%V/\", &values[i]);\n        }\n\n        if (ngx_parse_request_url(&ru, &event->url) != NGX_OK) {\n            ngx_conf_log_error(NGX_LOG_WARN, cf, 0, \"request url format error\");\n            return NGX_ERROR;\n        }\n\n        ngx_dynamic_resolver_add_domain(&ru.host, cf->cycle);\n    }\n\n    if (event->url.len == 0) {\n        return NGX_ERROR;\n    } else {\n        if (event->timeout == 0) {\n            event->timeout = 3000;\n        }\n\n        if (event->update == 0) {\n            event->update = 60000;\n        }\n\n        event->stage |= NGX_RTMP_OCLP_START;\n\n        return NGX_OK;\n    }\n}\n\nstatic char *\nngx_rtmp_notify_on_main_event(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_rtmp_notify_main_conf_t  *omcf;\n    ngx_str_t                  *name, *value;\n    ngx_uint_t                  n;\n\n    omcf = conf;\n\n    value = cf->args->elts;\n\n    name = &value[0];\n\n    n = 0;\n\n    switch (name->len) {\n    case sizeof(\"on_proc\") - 1:\n        n = NGX_RTMP_OCLP_PROC;\n        break;\n    case sizeof(\"oclp_proc\") - 1:\n        n = NGX_RTMP_OCLP_PROC;\n        break;\n    }\n\n    if (ngx_rtmp_notify_create_event(cf, &omcf->events[n], &value[1],\n            cf->args->nelts - 1) == NGX_ERROR)\n    {\n        return NGX_CONF_ERROR;\n    }\n\n    return NGX_CONF_OK;\n}\n\nstatic char *\nngx_rtmp_notify_on_srv_event(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_rtmp_notify_srv_conf_t   *oscf;\n    ngx_str_t                  *name, *value;\n    ngx_uint_t                  n;\n\n    oscf = conf;\n\n    value = cf->args->elts;\n\n    name = &value[0];\n\n    n = 0;\n\n    switch (name->len) {\n    case sizeof(\"on_connect\") - 1:\n        n = NGX_RTMP_OCLP_CONNECT;\n        break;\n    case sizeof(\"oclp_connect\") - 1:\n        n = NGX_RTMP_OCLP_CONNECT;\n        break;\n    }\n\n    if (ngx_rtmp_notify_create_event(cf, &oscf->events[n], &value[1],\n            cf->args->nelts - 1) == NGX_ERROR)\n    {\n        return NGX_CONF_ERROR;\n    }\n\n    return NGX_CONF_OK;\n}\n\nstatic char *\nngx_rtmp_notify_on_app_event(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_rtmp_notify_app_conf_t   *oacf;\n    ngx_rtmp_notify_event_t      *event;\n    ngx_str_t                  *name, *value;\n    ngx_uint_t                  n;\n\n    oacf = conf;\n\n    value = cf->args->elts;\n\n    name = &value[0];\n\n    n = 0;\n\n    if (name->data[1] == 'c') {\n        switch (name->len) {\n        case sizeof(\"oclp_play\") - 1:\n            if (name->data[8] == 'y') { /* oclp_play */\n                n = NGX_RTMP_OCLP_PLAY;\n                if (oacf->events[n].nelts != 0) {\n                    ngx_conf_log_error(NGX_LOG_WARN, cf, 0, \"duplicate %V\", name);\n                    return NGX_CONF_ERROR;\n                }\n            } else if (name->data[8] == 'l') { /* oclp_pull */\n                n = NGX_RTMP_OCLP_PULL;\n                if (oacf->events[n].nelts != 0) {\n                    ngx_conf_log_error(NGX_LOG_WARN, cf, 0, \"duplicate %V\", name);\n                    return NGX_CONF_ERROR;\n                }\n            } else if (name->data[8] == 'h') { /* oclp_push */\n                n = NGX_RTMP_OCLP_PUSH;\n            } else if (name->data[8] == 'a') { /* oclp_meta */\n                n = NGX_RTMP_OCLP_META;\n            }\n            break;\n        case sizeof(\"oclp_publish\") - 1:\n            n = NGX_RTMP_OCLP_PUBLISH;\n            if (oacf->events[n].nelts != 0) {\n                ngx_conf_log_error(NGX_LOG_WARN, cf, 0, \"duplicate %V\", name);\n                return NGX_CONF_ERROR;\n            }\n            break;\n        case sizeof(\"oclp_stream\") - 1:\n            if (name->data[5] == 's') { /* oclp_stream */\n                n = NGX_RTMP_OCLP_STREAM;\n            } else if (name->data[5] == 'r') { /* oclp_record */\n                n = NGX_RTMP_OCLP_RECORD;\n            }\n\n            if (oacf->events[n].nelts != 0) {\n                ngx_conf_log_error(NGX_LOG_WARN, cf, 0, \"duplicate %V\", name);\n                return NGX_CONF_ERROR;\n            }\n            break;\n        }\n    } else {\n        switch (name->len) {\n        case sizeof(\"on_play\") - 1:\n            if (name->data[6] == 'y') { /* on_play */\n                n = NGX_RTMP_OCLP_PLAY;\n                if (oacf->events[n].nelts != 0) {\n                    ngx_conf_log_error(NGX_LOG_WARN, cf, 0, \"duplicate %V\", name);\n                    return NGX_CONF_ERROR;\n                }\n            } else if (name->data[6] == 'l') { /* on_pull */\n                n = NGX_RTMP_OCLP_PULL;\n                if (oacf->events[n].nelts != 0) {\n                    ngx_conf_log_error(NGX_LOG_WARN, cf, 0, \"duplicate %V\", name);\n                    return NGX_CONF_ERROR;\n                }\n            } else if (name->data[6] == 'h') { /* on_push */\n                n = NGX_RTMP_OCLP_PUSH;\n            } else if (name->data[6] == 'a') { /* on_meta */\n                n = NGX_RTMP_OCLP_META;\n            }\n            break;\n        case sizeof(\"on_publish\") - 1:\n            n = NGX_RTMP_OCLP_PUBLISH;\n            if (oacf->events[n].nelts != 0) {\n                ngx_conf_log_error(NGX_LOG_WARN, cf, 0, \"duplicate %V\", name);\n                return NGX_CONF_ERROR;\n            }\n            break;\n        case sizeof(\"on_stream\") - 1:\n            if (name->data[3] == 's') { /* on_stream */\n                n = NGX_RTMP_OCLP_STREAM;\n            } else if (name->data[3] == 'r') { /* on_record */\n                n = NGX_RTMP_OCLP_RECORD;\n            }\n\n            if (oacf->events[n].nelts != 0) {\n                ngx_conf_log_error(NGX_LOG_WARN, cf, 0, \"duplicate %V\", name);\n                return NGX_CONF_ERROR;\n            }\n            break;\n        }\n    }\n\n\n    if (oacf->events[n].nelts >= NGX_RTMP_MAX_OCLP) {\n        ngx_conf_log_error(NGX_LOG_WARN, cf, 0, \"too much %V events\", name);\n        return NGX_CONF_ERROR;\n    }\n\n    event = ngx_array_push(&oacf->events[n]);\n    ngx_memzero(event, sizeof(ngx_rtmp_notify_event_t));\n    if (ngx_rtmp_notify_create_event(cf, event, &value[1], cf->args->nelts - 1)\n            == NGX_ERROR)\n    {\n        return NGX_CONF_ERROR;\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic void\nngx_rtmp_notify_init_process_url(ngx_str_t *url, ngx_pool_t *pool,\n    ngx_rtmp_notify_event_t *event)\n{\n    size_t                      len;\n    u_char                     *p;\n\n    len = event->url.len + sizeof(\"?call=init_process&worker_id=\") - 1\n        + sizeof(\"256\") - 1;\n\n    url->data = ngx_pcalloc(pool, len);\n    if (url->data == NULL) {\n        return;\n    }\n\n    p = url->data;\n    p = ngx_snprintf(p, len, \"%V?call=init_process&worker_id=%ui\",\n            &event->url, ngx_worker);\n    url->len = p - url->data;\n}\n\nstatic void\nngx_rtmp_notify_init_process_handle(ngx_netcall_ctx_t *nctx, ngx_int_t code)\n{\n    if (code != NGX_HTTP_OK) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"notify init process notify error: %i\", code);\n    }\n\n    return;\n}\n\nstatic void\nngx_rtmp_notify_init_process_create(ngx_event_t *ev)\n{\n    ngx_netcall_ctx_t          *nctx;\n\n    nctx = ev->data;\n\n    ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, \"notify init process create\");\n\n    ngx_netcall_create(nctx, ngx_cycle->log);\n}\n\nstatic ngx_int_t\nngx_rtmp_notify_init_process(ngx_cycle_t *cycle)\n{\n    ngx_rtmp_notify_main_conf_t  *omcf;\n    ngx_rtmp_notify_event_t      *event;\n    ngx_rtmp_conf_ctx_t        *ctx;\n    ngx_netcall_ctx_t          *nctx;\n    ngx_event_t                *ev;\n\n    if (ngx_process != NGX_PROCESS_WORKER &&\n        ngx_process != NGX_PROCESS_SINGLE)\n    {\n        return NGX_OK;\n    }\n\n    if (ngx_rtmp_core_main_conf == NULL) {\n        return NGX_OK;\n    }\n\n    ctx = (ngx_rtmp_conf_ctx_t *) ngx_get_conf(cycle->conf_ctx,\n                                               ngx_rtmp_module);\n    omcf = (ngx_rtmp_notify_main_conf_t *)\n            ctx->main_conf[ngx_rtmp_notify_module.ctx_index];\n\n    if (omcf->events[NGX_RTMP_OCLP_PROC].url.len == 0) {\n        return NGX_OK;\n    }\n\n    event = &omcf->events[NGX_RTMP_OCLP_PROC];\n\n    nctx = ngx_netcall_create_ctx(NGX_RTMP_OCLP_PROC, &event->groupid,\n            event->stage, event->timeout, event->update, 0);\n    if (nctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    ngx_rtmp_notify_init_process_url(&nctx->url, nctx->pool, event);\n    nctx->handler = ngx_rtmp_notify_init_process_handle;\n    nctx->data = nctx;\n\n    ev = &nctx->ev;\n    ev->handler = ngx_rtmp_notify_init_process_create;\n\n    ngx_post_event(ev, &ngx_rtmp_init_queue);\n\n    return NGX_OK;\n}\n\nstatic void\nngx_rtmp_notify_common_url(ngx_str_t *url, ngx_rtmp_session_t *s,\n    ngx_rtmp_notify_event_t *event, ngx_netcall_ctx_t *nctx, ngx_uint_t stage)\n{\n    ngx_request_url_t           ru;\n    size_t                      len;\n    u_char                     *p, *buf;\n    ngx_live_record_ctx_t      *lrctx;\n    unsigned                    fill = 0;\n    ngx_str_t                   args;\n\n    ngx_memzero(&ru, sizeof(ngx_request_url_t));\n    ngx_parse_request_url(&ru, &event->url);\n\n    len = NGX_NETCALL_MAX_URL_LEN;\n    buf = url->data;\n    p = ngx_snprintf(buf, len , \"%V\", &event->url);\n    if (fill) {\n        *p++ = '/';\n    }\n    len -= p - buf;\n    buf = p;\n\n    if (ru.args.len) { // url already has args\n        p = ngx_snprintf(buf, len,\n                \"&call=%s&act=%s&domain=%V&app=%V&name=%V&clientid=%D\",\n                ngx_rtmp_notify_app_type[nctx->type],\n                ngx_rtmp_notify_stage[stage],\n                &s->domain, &s->app, &s->name, s->number);\n    } else {\n        p = ngx_snprintf(buf, len,\n                \"?call=%s&act=%s&domain=%V&app=%V&name=%V&clientid=%D\",\n                ngx_rtmp_notify_app_type[nctx->type],\n                ngx_rtmp_notify_stage[stage],\n                &s->domain, &s->app, &s->name, s->number);\n    }\n    len -= p - buf;\n    buf = p;\n\n    if (nctx->type == NGX_RTMP_OCLP_RECORD && stage != NGX_RTMP_OCLP_START) {\n        lrctx = ngx_rtmp_get_module_ctx(s, ngx_live_record_module);\n        p = ngx_snprintf(buf, len, \"&begintime=%M&endtime=%M&index=%V&file=%V\",\n                lrctx->begintime, lrctx->endtime, &lrctx->index.name,\n                &lrctx->file.name);\n\n        len -= p - buf;\n        buf = p;\n    }\n\n    if (event->groupid.len) {\n        p = ngx_snprintf(buf, len, \"&groupid=%V\", &event->groupid);\n        len -= p - buf;\n        buf = p;\n    }\n\n    if (event->args.len) {\n        ngx_rtmp_fetch_variable(s, s->pool, &event->args, &args);\n        if (args.len > 0) {\n            p = ngx_snprintf(buf, len, \"&%V\", &args);\n            len -= p - buf;\n            buf = p;\n        }\n    }\n\n    url->len = p - url->data;\n}\n\nstatic void\nngx_rtmp_notify_common_timer(ngx_event_t *ev)\n{\n    ngx_netcall_ctx_t          *nctx;\n\n    nctx = ev->data;\n\n    ngx_log_error(NGX_LOG_INFO, ev->log, 0, \"notify %s update create %V\",\n            ngx_rtmp_notify_app_type[nctx->type], &nctx->url);\n\n    ngx_netcall_create(nctx, ev->log);\n}\n\nstatic void\nngx_rtmp_notify_common_update_handle(ngx_netcall_ctx_t *nctx, ngx_int_t code)\n{\n    ngx_event_t                *ev;\n\n    ev = &nctx->ev;\n    ev->handler = ngx_rtmp_notify_common_timer;\n\n    if (code != NGX_HTTP_OK) {\n        ngx_log_error(NGX_LOG_ERR, ev->log, 0,\n                \"notify %s update notify error: %i\",\n                ngx_rtmp_notify_app_type[nctx->type], code);\n    }\n\n    ngx_add_timer(ev, nctx->update);\n}\n\nstatic void\nngx_rtmp_notify_common_update_create(ngx_rtmp_session_t *s,\n    ngx_netcall_ctx_t *nctx)\n{\n    ngx_rtmp_notify_app_conf_t   *oacf;\n    ngx_rtmp_notify_event_t      *event;\n    ngx_event_t                *ev;\n\n    if ((nctx->stage & NGX_RTMP_OCLP_UPDATE) == NGX_RTMP_OCLP_UPDATE) {\n        oacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module);\n\n        event = oacf->events[nctx->type].elts;\n        event += nctx->idx;\n\n        ngx_rtmp_notify_common_url(&nctx->url, s, event, nctx,\n                                 NGX_RTMP_OCLP_UPDATE);\n        nctx->handler = ngx_rtmp_notify_common_update_handle;\n\n        ev = &nctx->ev;\n        ev->data = nctx;\n        ev->handler = ngx_rtmp_notify_common_timer;\n\n        ngx_add_timer(ev, nctx->update);\n    }\n}\n\nstatic void\nngx_rtmp_notify_common_done(ngx_rtmp_session_t *s, ngx_netcall_ctx_t *nctx)\n{\n    ngx_rtmp_notify_app_conf_t   *oacf;\n    ngx_rtmp_notify_event_t      *event;\n\n    if (nctx == NULL) {\n        return;\n    }\n\n    if ((nctx->stage & NGX_RTMP_OCLP_DONE) == NGX_RTMP_OCLP_DONE) {\n        oacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module);\n        event = oacf->events[nctx->type].elts;\n\n        ngx_rtmp_notify_common_url(&nctx->url, s, event, nctx,\n                                 NGX_RTMP_OCLP_DONE);\n\n        ngx_log_error(NGX_LOG_INFO, s->log, 0,\n                \"notify %s done create %V %p\",\n                ngx_rtmp_notify_app_type[nctx->type], &nctx->url, nctx);\n\n        ngx_netcall_create(nctx, s->log);\n    }\n\n    ngx_netcall_destroy(nctx);\n}\n\nstatic void\nngx_rtmp_notify_pnotify_start_handle(ngx_netcall_ctx_t *nctx, ngx_int_t code)\n{\n    ngx_rtmp_session_t           *s;\n    ngx_rtmp_notify_ctx_t        *octx;\n    ngx_rtmp_notify_app_conf_t   *oacf;\n\n    s = nctx->data;\n\n    octx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module);\n\n    oacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module);\n\n    s->notify_status = code;\n\n    if (code < NGX_HTTP_OK || code > NGX_HTTP_SPECIAL_RESPONSE) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"notify %s start notify error: %i\",\n               ngx_rtmp_notify_app_type[nctx->type], code);\n\n        if (code != -1 || !oacf->ignore_invalid_notify) {\n            goto error;\n        }\n\n        goto next;\n    }\n\nnext:\n    if (octx->type == NGX_RTMP_OCLP_PUBLISH) {\n        if (next_publish(s, &octx->publish_v) != NGX_OK) {\n            goto error;\n        }\n    } else {\n        if (next_play(s, &octx->play_v) != NGX_OK) {\n            goto error;\n        }\n    }\n\n    ngx_rtmp_notify_common_update_create(s, nctx);\n\n    return;\n\nerror:\n    if (octx->type == NGX_RTMP_OCLP_PUBLISH) {\n        ngx_rtmp_send_status(s, \"NetStream.Publish.Forbidden\", \"status\",\n                \"Publish stream Forbidden\");\n    } else if (s->live_type == NGX_RTMP_LIVE) {\n        s->status = 403;\n        ngx_rtmp_send_status(s, \"NetStream.Play.Forbidden\", \"status\",\n                \"Play stream Forbidden\");\n    }\n    s->finalize_reason = NGX_LIVE_OCLP_NOTIFY_ERR;\n    ngx_rtmp_finalize_session(s);\n}\n\nstatic ngx_int_t\nngx_rtmp_notify_pnotify_start(ngx_rtmp_session_t *s, ngx_uint_t type)\n{\n    ngx_rtmp_notify_app_conf_t   *oacf;\n    ngx_rtmp_notify_event_t      *event;\n    ngx_rtmp_notify_ctx_t        *ctx;\n    ngx_netcall_ctx_t          *nctx;\n\n    oacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module);\n\n    if (oacf->events[type].nelts == 0) {\n        return NGX_DECLINED;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module);\n    if (ctx == NULL) {\n        ctx = ngx_pcalloc(s->pool, sizeof(ngx_rtmp_notify_ctx_t));\n        if (ctx == NULL) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0, \"palloc notify ctx failed\");\n            return NGX_ERROR;\n        }\n        ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_notify_module);\n    }\n\n    event = oacf->events[type].elts;\n\n    nctx = ngx_netcall_create_ctx(type, &event->groupid,\n            event->stage, event->timeout, event->update, 0);\n    nctx->ev.log = s->log;\n\n    ngx_rtmp_notify_common_url(&nctx->url, s, event, nctx,\n                                NGX_RTMP_OCLP_START);\n    nctx->handler = ngx_rtmp_notify_pnotify_start_handle;\n    nctx->data = s;\n\n    ctx->nctx = nctx;\n    ctx->type = type;\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0, \"notify %s start create %V\",\n            ngx_rtmp_notify_app_type[nctx->type], &nctx->url);\n\n    ngx_netcall_create(nctx, s->log);\n\n    return NGX_OK;\n}\n\nstatic void\nngx_rtmp_notify_pnotify_done(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_notify_ctx_t        *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module);\n    if (ctx == NULL) {\n        return;\n    }\n\n    ngx_rtmp_notify_common_done(s, ctx->nctx);\n}\n\nstatic void\nngx_rtmp_notify_relay_error(ngx_rtmp_session_t *s, ngx_uint_t status)\n{\n    ngx_rtmp_core_ctx_t        *cctx;\n    size_t                      i;\n\n    for (i = 0; ngx_rtmp_notify_relay_errors[i].status; ++i) {\n        if (status != ngx_rtmp_notify_relay_errors[i].status) {\n            continue;\n        }\n\n        if (s->publishing) { // relay pull\n            cctx = s->live_stream->play_ctx;\n        } else { // relay push\n            cctx = s->live_stream->publish_ctx;\n        }\n\n        for (; cctx; cctx = cctx->next) {\n            if (!cctx->session->static_pull) {\n                cctx->session->status = status;\n                cctx->session->finalize_reason = NGX_LIVE_RELAY_TRANSIT;\n                ngx_rtmp_finalize_session(cctx->session);\n            }\n        }\n    }\n}\n\nstatic void\nngx_rtmp_notify_relay_start_handle(ngx_netcall_ctx_t *nctx, ngx_int_t code)\n{\n    ngx_rtmp_session_t         *s;\n    ngx_live_relay_t            relay;\n    ngx_live_relay_url_t       *url;\n    ngx_str_t                  *local_name;\n    ngx_str_t                  *local_domain;\n    u_char                     *p, *last;\n    ngx_rtmp_notify_ctx_t        *octx;\n    ngx_live_relay_ctx_t       *ctx;\n\n    static ngx_str_t            location = ngx_string(\"location\");\n    static ngx_str_t            domain = ngx_string(\"domain\");\n\n    s = nctx->data;\n    // relay pull, no player or relay push no publisher\n    if ((s->publishing && s->live_stream->play_ctx == NULL)\n            || (!s->publishing && s->live_stream->publish_ctx == NULL))\n    {\n        return;\n    }\n\n    s->notify_status = code;\n\n    if (code == -1) { // wait for notify relay reconnect\n        ngx_log_error(NGX_LOG_ERR, s->log, 0, \"notify relay start failed\");\n\n        s->finalize_reason = NGX_LIVE_OCLP_RELAY_ERR;\n        ngx_rtmp_finalize_session(s); // only reconnect immediately\n\n        return;\n    }\n\n    if (code >= 400) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"notify: relay_start_handle| \"\n                \"notify error: %i\", code);\n\n        if (s->publishing) { // relay pull\n            ngx_rtmp_notify_relay_error(s, 404);\n        } else { // relay push\n            ngx_rtmp_notify_relay_error(s, 400);\n        }\n        s->finalize_reason = NGX_LIVE_OCLP_RELAY_ERR;\n        ngx_rtmp_finalize_session(s);\n\n        return;\n    }\n\n    if (code == NGX_HTTP_OK) { // successd but no need to relay\n        ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n        ctx->giveup = 1;\n        s->finalize_reason = NGX_LIVE_NORMAL_CLOSE;\n        ngx_rtmp_finalize_session(s);\n        return;\n    }\n\n    /* redirect */\n    local_name = ngx_netcall_header(nctx, &location);\n    if (local_name == NULL) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"notify relay start has no Location when redirect\");\n        s->finalize_reason = NGX_LIVE_OCLP_PARA_ERR;\n        ngx_rtmp_finalize_session(s);\n\n        return;\n    }\n\n    ngx_memzero(&relay, sizeof(ngx_live_relay_t));\n    if (ngx_array_init(&relay.urls, s->pool, 1, sizeof(ngx_live_relay_url_t))\n            != NGX_OK)\n    {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"notify relay start, init relay urls failed\");\n        ngx_rtmp_finalize_session(s);\n\n        return;\n    }\n\n    url = ngx_array_push(&relay.urls);\n    if (url == NULL) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"notify relay start, alloc url from relay urls failed\");\n        ngx_rtmp_finalize_session(s);\n\n        return;\n    }\n    ngx_memzero(url, sizeof(ngx_live_relay_url_t));\n    relay.tag = &ngx_rtmp_notify_module;\n\n    if (ngx_parse_request_url(&url->url, local_name) != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"notify relay start, request url format error: %V\", &location);\n        s->finalize_reason = NGX_LIVE_OCLP_PARA_ERR;\n        ngx_rtmp_finalize_session(s);\n\n        return;\n    }\n\n    if (ngx_strncasecmp(url->url.scheme.data, (u_char *) \"rtmp://\", 7) == 0) {\n        url->relay_type = NGX_LIVE_RELAY_RTMP;\n    }\n\n    url->port = ngx_request_port(&url->url.scheme, &url->url.port);\n    if (url->port == 0) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"notify relay start, request url port error\");\n        s->finalize_reason = NGX_LIVE_OCLP_PARA_ERR;\n        ngx_rtmp_finalize_session(s);\n\n        return;\n    }\n\n    // set domain\n    local_domain = ngx_netcall_header(nctx, &domain);\n    if (local_domain && local_domain->len) {\n        relay.domain = *local_domain;\n    }\n\n    if (url->url.path.len == 0) { // no app and stream\n        goto relay_create;\n    }\n\n    p = url->url.path.data;\n    last = url->url.path.data + url->url.path.len;\n\n    // set app\n    relay.app.data = p;\n    p = ngx_strlchr(p, last, '/');\n    if (p == NULL) { // only has app\n        relay.app.len = last - relay.app.data;\n        goto relay_create;\n    } else {\n        relay.app.len = p - relay.app.data;\n    }\n\n    ++p;\n    if (p == last) {\n        goto relay_create;\n    }\n\n    // set stream name\n    relay.name.data = p;\n    relay.name.len = last - relay.name.data;\n\n    // set args\n    if (url->url.args.len) {\n        relay.pargs = url->url.args;\n    }\n\nrelay_create:\n    octx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module);\n    ngx_rtmp_notify_common_update_create(s, octx->nctx);\n\n    ngx_live_relay_create(s, &relay);\n\n    return;\n}\n\nstatic void\nngx_rtmp_notify_relay_handler(ngx_event_t *ev)\n{\n    ngx_rtmp_session_t         *s;\n    ngx_live_relay_app_conf_t  *lracf;\n    ngx_live_relay_ctx_t       *ctx;\n    ngx_rtmp_notify_ctx_t        *octx;\n    ngx_rtmp_notify_event_t      *event;\n    ngx_netcall_ctx_t          *nctx;\n\n    s = ev->data;\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n\n    octx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module);\n    event = octx->event;\n\n    if (!ctx->failed_delay && ev->timedout) { // connect timeout\n        ngx_log_error(NGX_LOG_ERR, s->log, NGX_ETIMEDOUT,\n                \"notify relay, relay timeout\");\n        s->finalize_reason = NGX_LIVE_RELAY_TIMEOUT;\n        ngx_rtmp_finalize_session(s);\n\n        if (octx->nctx->hcr) {\n            ngx_http_client_detach(octx->nctx->hcr);\n            octx->nctx->hcr = NULL;\n\n            if (octx->nctx->ev.timer_set) {\n                ngx_del_timer(&octx->nctx->ev);\n            }\n\n            if (octx->nctx->ev.posted) {\n                ngx_delete_posted_event(&octx->nctx->ev);\n            }\n        }\n\n        return;\n    }\n\n    // relay pull, no player or relay push no publisher\n    if ((s->publishing && s->live_stream->play_ctx == NULL)\n            || (!s->publishing && s->live_stream->publish_ctx == NULL))\n    {\n        return;\n    }\n\n    lracf = ngx_rtmp_get_module_app_conf(s, ngx_live_relay_module);\n\n    // this timer control start netcall until relay create success\n    ngx_add_timer(&ctx->reconnect, lracf->relay_reconnect);\n\n    nctx = ngx_netcall_create_ctx(octx->type, &event->groupid, event->stage,\n            event->timeout, event->update, 0);\n    if (nctx == NULL) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0, \"notify relay, create nctx failed\");\n        ngx_rtmp_finalize_session(s);\n\n        return;\n    }\n    nctx->ev.log = s->log;\n\n    ngx_rtmp_notify_common_url(&nctx->url, s, event, nctx,\n            NGX_RTMP_OCLP_START);\n    nctx->handler = ngx_rtmp_notify_relay_start_handle;\n    nctx->data = s;\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0, \"notify %s start create %V\",\n            ngx_rtmp_notify_app_type[nctx->type], &nctx->url);\n\n    octx->nctx = nctx;\n\n    ngx_netcall_create(nctx, s->log);\n}\n\nstatic ngx_int_t\nngx_rtmp_notify_relay_start(ngx_rtmp_session_t *s, ngx_rtmp_notify_event_t *event,\n    ngx_uint_t type, unsigned publishing)\n{\n    ngx_rtmp_session_t         *rs;\n    ngx_live_relay_ctx_t       *ctx, *pctx;\n    ngx_live_relay_app_conf_t  *lracf;\n    ngx_rtmp_notify_ctx_t        *octx;\n\n    rs = ngx_rtmp_create_relay_session(s, &ngx_rtmp_notify_module);\n    if (rs == NULL) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"notify relay start, create relay session failed\");\n        return NGX_DECLINED;\n    }\n    rs->publishing = publishing;\n    rs->groupid = event->groupid;\n    rs->live_stream = s->live_stream;\n    ngx_live_create_ctx(rs, publishing);\n\n    octx = ngx_pcalloc(rs->pool, sizeof(ngx_rtmp_notify_ctx_t));\n    if (octx == NULL) {\n        ngx_log_error(NGX_LOG_ERR, rs->log, 0,\n                \"notify relay start, create notify ctx failed\");\n        ngx_rtmp_finalize_session(rs);\n\n        return NGX_OK;\n    }\n    ngx_rtmp_set_ctx(rs, octx, ngx_rtmp_notify_module);\n    octx->event = event;\n    octx->type = type;\n\n    ctx = ngx_rtmp_get_module_ctx(rs, ngx_live_relay_module);\n    ctx->reconnect.log = rs->log;\n    ctx->reconnect.data = rs;\n    ctx->reconnect.handler = ngx_rtmp_notify_relay_handler;\n\n    if (s->publishing != rs->publishing) {\n        ngx_post_event(&ctx->reconnect, &ngx_posted_events);\n        return NGX_OK;\n    }\n\n    // normal publisher close, need to trigger pull\n    if (s->publishing && !s->relay) {\n        ngx_post_event(&ctx->reconnect, &ngx_posted_events);\n        return NGX_OK;\n    }\n\n    // reconnect\n    pctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (pctx->successd) { // prev relay successd\n        ngx_post_event(&ctx->reconnect, &ngx_posted_events);\n        return NGX_OK;\n    }\n\n    ctx->idx = pctx->idx;\n    ctx->failed_reconnect = pctx->failed_reconnect;\n\n    lracf = ngx_rtmp_get_module_app_conf(rs, ngx_live_relay_module);\n\n    if (!pctx->reconnect.timer_set) { // prev relay timeout\n        ctx->failed_reconnect = ngx_min(pctx->failed_reconnect * 2,\n                lracf->relay_reconnect);\n        ngx_post_event(&ctx->reconnect, &ngx_posted_events);\n        return NGX_OK;\n    }\n\n    if (pctx->failed_reconnect) {\n        ctx->failed_reconnect = ngx_min(pctx->failed_reconnect * 2,\n                lracf->relay_reconnect);\n    } else {\n        ctx->failed_reconnect = lracf->failed_reconnect;\n    }\n\n    ctx->failed_delay = 1;\n    ngx_add_timer(&ctx->reconnect, ctx->failed_reconnect);\n\n    return NGX_OK;\n}\n\nstatic void\nngx_rtmp_notify_relay_done(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_notify_ctx_t        *octx;\n    ngx_netcall_ctx_t          *nctx;\n\n    octx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module);\n    nctx = octx->nctx;\n    ngx_rtmp_notify_common_done(s, nctx);\n}\n\nstatic void\nngx_rtmp_notify_stream_start_handle(ngx_netcall_ctx_t *nctx, ngx_int_t code)\n{\n    ngx_live_stream_t          *st;\n    ngx_rtmp_session_t         *s;\n\n    st = nctx->data;\n\n    if (code != NGX_HTTP_OK) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"notify stream start notify error: %i\", code);\n\n        return;\n    }\n\n    if (st->play_ctx) {\n        s = st->play_ctx->session;\n    } else if (st->publish_ctx) {\n        s = st->publish_ctx->session;\n    } else {\n        ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0,\n                \"notify stream start handle but all stream session close\");\n        return;\n    }\n\n    ngx_rtmp_notify_common_update_create(s, nctx);\n}\n\nvoid\nngx_rtmp_notify_stream_start(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_notify_app_conf_t   *oacf;\n    ngx_rtmp_notify_event_t      *event;\n    ngx_netcall_ctx_t          *nctx;\n\n    oacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module);\n\n    if (oacf->events[NGX_RTMP_OCLP_STREAM].nelts == 0) {\n        return;\n    }\n\n    nctx = s->live_stream->stream_nctx;\n    if (nctx) { /* stream start has been sent */\n        return;\n    }\n\n    event = oacf->events[NGX_RTMP_OCLP_STREAM].elts;\n\n    if ((event->stage & NGX_RTMP_OCLP_START) == NGX_RTMP_OCLP_START) {\n        nctx = ngx_netcall_create_ctx(NGX_RTMP_OCLP_STREAM, &event->groupid,\n                event->stage, event->timeout, event->update, 0);\n\n        ngx_rtmp_notify_common_url(&nctx->url, s, event, nctx,\n                                 NGX_RTMP_OCLP_START);\n        nctx->handler = ngx_rtmp_notify_stream_start_handle;\n        nctx->data = s->live_stream;\n\n        s->live_stream->stream_nctx = nctx;\n\n        ngx_log_error(NGX_LOG_INFO, s->log, 0,\n                \"notify stream start create %V\", &nctx->url);\n\n        ngx_netcall_create(nctx, ngx_cycle->log);\n    }\n}\n\nvoid\nngx_rtmp_notify_stream_done(ngx_rtmp_session_t *s)\n{\n    ngx_netcall_ctx_t          *nctx;\n\n    nctx = s->live_stream->stream_nctx;\n    ngx_rtmp_notify_common_done(s, nctx);\n    s->live_stream->stream_nctx = NULL;\n}\n\nstatic void\nngx_rtmp_notify_record_start_handle(ngx_netcall_ctx_t *nctx, ngx_int_t code)\n{\n    ngx_rtmp_session_t         *s;\n    ngx_live_record_ctx_t      *ctx;\n\n    s = nctx->data;\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_record_module);\n\n    if (code == NGX_HTTP_OK) {\n        ctx->open = 1;\n    } else if (code != -1) {\n        ctx->open = 0;\n    }\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0,\n            \"notify record receive code %i, open: %d\", code, ctx->open);\n\n    if (next_record_start(s) != NGX_OK) {\n        ngx_rtmp_finalize_session(s);\n    }\n}\n\nstatic ngx_int_t\nngx_rtmp_notify_record_start(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_notify_app_conf_t   *oacf;\n    ngx_netcall_ctx_t          *nctx;\n    ngx_rtmp_notify_ctx_t        *octx;\n    ngx_rtmp_notify_event_t      *event;\n\n    oacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module);\n\n    if (oacf->events[NGX_RTMP_OCLP_RECORD].nelts == 0) {\n        goto next;\n    }\n\n    octx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module);\n    if (octx == NULL) {\n        octx = ngx_pcalloc(s->pool, sizeof(ngx_rtmp_notify_ctx_t));\n        if (octx == NULL) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0, \"pcalloc notify ctx failed\");\n            goto next;\n        }\n        ngx_rtmp_set_ctx(s, octx, ngx_rtmp_notify_module);\n    }\n\n    event = oacf->events[NGX_RTMP_OCLP_RECORD].elts;\n\n    nctx = ngx_netcall_create_ctx(NGX_RTMP_OCLP_RECORD, &event->groupid,\n            event->stage, event->timeout, event->update, 0);\n\n    ngx_rtmp_notify_common_url(&nctx->url, s, event, nctx,\n                             NGX_RTMP_OCLP_START);\n    nctx->handler = ngx_rtmp_notify_record_start_handle;\n    nctx->data = s;\n\n    octx->rctx = nctx;\n    octx->type = NGX_RTMP_OCLP_RECORD;\n\n    ngx_log_error(NGX_LOG_INFO, s->log, 0, \"notify record start create %V\",\n            &nctx->url);\n\n    ngx_netcall_create(nctx, s->log);\n\n    return NGX_OK;\n\nnext:\n    return next_record_start(s);\n}\n\nstatic void\nngx_rtmp_notify_record_update_handle(ngx_netcall_ctx_t *nctx, ngx_int_t code)\n{\n    ngx_rtmp_session_t         *s;\n\n    s = nctx->data;\n\n    if (code != NGX_HTTP_OK) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                \"notify record update notify error: %i\", code);\n    }\n}\n\nstatic ngx_int_t\nngx_rtmp_notify_record_update(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_notify_app_conf_t   *oacf;\n    ngx_netcall_ctx_t          *nctx;\n    ngx_rtmp_notify_ctx_t        *octx;\n    ngx_rtmp_notify_event_t      *event;\n\n    octx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module);\n    if (octx == NULL || octx->rctx == NULL) {\n        goto next;\n    }\n\n    nctx = octx->rctx;\n\n    if ((nctx->stage & NGX_RTMP_OCLP_UPDATE) == NGX_RTMP_OCLP_UPDATE) {\n        oacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module);\n        event = oacf->events[nctx->type].elts;\n\n        ngx_rtmp_notify_common_url(&nctx->url, s, event, nctx,\n                                 NGX_RTMP_OCLP_UPDATE);\n        nctx->handler = ngx_rtmp_notify_record_update_handle;\n\n        ngx_log_error(NGX_LOG_INFO, s->log, 0,\n                \"notify record update create %V %p\", &nctx->url, nctx);\n\n        ngx_netcall_create(nctx, s->log);\n    }\n\nnext:\n    return next_record_update(s);\n}\n\nstatic ngx_int_t\nngx_rtmp_notify_record_done(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_notify_app_conf_t   *oacf;\n    ngx_netcall_ctx_t          *nctx;\n    ngx_rtmp_notify_ctx_t        *octx;\n    ngx_rtmp_notify_event_t      *event;\n\n    octx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module);\n    if (octx == NULL || octx->rctx == NULL) {\n        goto next;\n    }\n\n    nctx = octx->rctx;\n\n    if ((nctx->stage & NGX_RTMP_OCLP_DONE) == NGX_RTMP_OCLP_DONE) {\n        oacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module);\n        event = oacf->events[nctx->type].elts;\n\n        ngx_rtmp_notify_common_url(&nctx->url, s, event, nctx,\n                                 NGX_RTMP_OCLP_DONE);\n\n        ngx_log_error(NGX_LOG_INFO, s->log, 0,\n                \"notify record done create %V %p\", &nctx->url, nctx);\n\n        ngx_netcall_create(nctx, s->log);\n    }\n\n    ngx_netcall_destroy(nctx);\n\nnext:\n    return next_record_done(s);\n}\n\nstatic ngx_int_t\nngx_rtmp_notify_push(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_notify_app_conf_t   *oacf;\n    ngx_rtmp_notify_event_t      *event;\n    ngx_uint_t                  i;\n\n    oacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module);\n    if (oacf->events[NGX_RTMP_OCLP_PUSH].nelts == 0) { // not configured\n        goto next;\n    }\n\n    if (s->relay && s->static_pull == 0) {\n        goto next;\n    }\n\n    event = oacf->events[NGX_RTMP_OCLP_PUSH].elts;\n    for (i = 0; i < oacf->events[NGX_RTMP_OCLP_PUSH].nelts; ++i, ++event) {\n        ngx_rtmp_notify_relay_start(s, event, NGX_RTMP_OCLP_PUSH, 0);\n    }\n\nnext:\n    return next_push(s);\n}\n\nstatic ngx_int_t\nngx_rtmp_notify_pull(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_notify_app_conf_t   *oacf;\n    ngx_rtmp_notify_event_t      *event;\n\n    oacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module);\n    if (oacf->events[NGX_RTMP_OCLP_PULL].nelts == 0) { // not configured\n        goto next;\n    }\n\n    if (!s->publishing && s->relay) { // relay push\n        goto next;\n    }\n\n    if (s->live_stream->publish_ctx) { // already has publisher\n        goto next;\n    }\n\n    event = oacf->events[NGX_RTMP_OCLP_PULL].elts;\n\n    if (ngx_rtmp_notify_relay_start(s, event, NGX_RTMP_OCLP_PULL, 1) == NGX_OK) {\n        return NGX_OK;\n    }\n\nnext:\n    return next_pull(s);\n}\n\nstatic ngx_int_t\nngx_rtmp_notify_push_close(ngx_rtmp_session_t *s)\n{\n    ngx_live_relay_ctx_t       *ctx;\n    ngx_rtmp_notify_ctx_t        *octx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (ctx->tag != &ngx_rtmp_notify_module) {\n        goto next;\n    }\n\n    ngx_rtmp_notify_relay_done(s); // nctx will close in relay done\n\n    // relay push and has publisher in stream\n    if (!ctx->giveup && s->live_stream->publish_ctx) {\n        octx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module);\n\n        ngx_rtmp_notify_relay_start(s, octx->event, octx->type, 0);\n    }\n\nnext:\n    return next_push_close(s);\n}\n\nstatic ngx_int_t\nngx_rtmp_notify_pull_close(ngx_rtmp_session_t *s)\n{\n    ngx_live_relay_ctx_t       *ctx;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n    if (ctx == NULL) {\n        goto next;\n    }\n\n    if (ctx->tag != &ngx_rtmp_notify_module) {\n        goto next;\n    }\n\n    ngx_rtmp_notify_relay_done(s); // nctx will close in relay done\n\nnext:\n    return next_pull_close(s);\n}\n\nstatic ngx_int_t\nngx_rtmp_notify_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h, ngx_chain_t *in)\n{\n    ngx_rtmp_notify_app_conf_t   *oacf;\n    ngx_rtmp_notify_event_t      *event;\n    ngx_uint_t                  i;\n\n    if (ngx_rtmp_is_codec_header(in)) {\n        oacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_notify_module);\n\n        if (oacf->meta_once && s->live_stream->notify_meta) {\n            return NGX_OK;\n        }\n\n        switch (oacf->meta_type) {\n        case NGX_RTMP_OCLP_META_VIDEO:\n            if (h->type == NGX_RTMP_MSG_AUDIO) {\n                return NGX_OK;\n            }\n\n            break;\n        case NGX_RTMP_OCLP_META_AUDIO:\n            if (h->type == NGX_RTMP_MSG_VIDEO) {\n                return NGX_OK;\n            }\n\n            break;\n        default:\n            break;\n        }\n\n        s->live_stream->notify_meta = 1;\n\n        event = oacf->events[NGX_RTMP_OCLP_META].elts;\n        for (i = 0; i < oacf->events[NGX_RTMP_OCLP_META].nelts; ++i, ++event) {\n            ngx_rtmp_notify_relay_start(s, event, NGX_RTMP_OCLP_META, 0);\n        }\n    }\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_rtmp_notify_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v)\n{\n    ngx_rtmp_notify_ctx_t        *octx;\n\n    if (s->relay || s->interprocess) {\n        goto next;\n    }\n\n    switch (ngx_rtmp_notify_pnotify_start(s, NGX_RTMP_OCLP_PUBLISH)) {\n    case NGX_OK:\n        break;\n    case NGX_DECLINED:\n        goto next;\n    default:\n        return NGX_ERROR;\n    }\n\n    octx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module);\n    ngx_memcpy(&octx->publish_v, v, sizeof(ngx_rtmp_publish_t));\n\n    return NGX_OK;\n\nnext:\n    return next_publish(s, v);\n}\n\nstatic ngx_int_t\nngx_rtmp_notify_play(ngx_rtmp_session_t *s, ngx_rtmp_play_t *v)\n{\n    ngx_rtmp_notify_ctx_t        *octx;\n\n    if (s->relay || s->interprocess) {\n        goto next;\n    }\n\n    switch (ngx_rtmp_notify_pnotify_start(s, NGX_RTMP_OCLP_PLAY)) {\n    case NGX_OK:\n        break;\n    case NGX_DECLINED:\n        goto next;\n    default:\n        return NGX_ERROR;\n    }\n\n    octx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_notify_module);\n    ngx_memcpy(&octx->play_v, v, sizeof(ngx_rtmp_play_t));\n\n    return NGX_OK;\n\nnext:\n    return next_play(s, v);\n}\n\nstatic ngx_int_t\nngx_rtmp_notify_close_stream(ngx_rtmp_session_t *s, ngx_rtmp_close_stream_t *v)\n{\n    if (s->relay || s->interprocess) {\n        goto next;\n    }\n\n    ngx_rtmp_notify_pnotify_done(s);\n\nnext:\n    return next_close_stream(s, v);\n}\n\nstatic ngx_int_t\nngx_rtmp_notify_postconfiguration(ngx_conf_t *cf)\n{\n    ngx_rtmp_core_main_conf_t  *cmcf;\n    ngx_rtmp_handler_pt        *h;\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]);\n    *h = ngx_rtmp_notify_av;\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]);\n    *h = ngx_rtmp_notify_av;\n\n    /* record */\n    next_record_start = ngx_live_record_start;\n    ngx_live_record_start = ngx_rtmp_notify_record_start;\n\n    next_record_update = ngx_live_record_update;\n    ngx_live_record_update = ngx_rtmp_notify_record_update;\n\n    next_record_done = ngx_live_record_done;\n    ngx_live_record_done = ngx_rtmp_notify_record_done;\n\n    /* pull & push */\n    next_push = ngx_live_push;\n    ngx_live_push = ngx_rtmp_notify_push;\n\n    next_pull = ngx_live_pull;\n    ngx_live_pull = ngx_rtmp_notify_pull;\n\n    next_push_close = ngx_live_push_close;\n    ngx_live_push_close = ngx_rtmp_notify_push_close;\n\n    next_pull_close = ngx_live_pull_close;\n    ngx_live_pull_close = ngx_rtmp_notify_pull_close;\n\n    /* publish & play */\n    next_publish = ngx_rtmp_publish;\n    ngx_rtmp_publish = ngx_rtmp_notify_publish;\n\n    next_play = ngx_rtmp_play;\n    ngx_rtmp_play = ngx_rtmp_notify_play;\n\n    next_close_stream = ngx_rtmp_close_stream;\n    ngx_rtmp_close_stream = ngx_rtmp_notify_close_stream;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_notify_module.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n *\n */\n\n\n#ifndef _NGX_RTMP_OCLP_MODULE_H_INCLUDED_\n#define _NGX_RTMP_OCLP_MODULE_H_INCLUDED_\n\n\n#include \"ngx_rtmp.h\"\n#include \"ngx_netcall.h\"\n\n\nvoid ngx_rtmp_notify_stream_start(ngx_rtmp_session_t *s);\nvoid ngx_rtmp_notify_stream_done(ngx_rtmp_session_t *s);\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_proxy_protocol.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <nginx.h>\n#include \"ngx_rtmp_proxy_protocol.h\"\n\n\nstatic void ngx_rtmp_proxy_protocol_recv(ngx_event_t *rev);\n\n\nvoid\nngx_rtmp_proxy_protocol(ngx_rtmp_session_t *s)\n{\n    ngx_event_t       *rev;\n    ngx_connection_t  *c;\n\n    c = s->connection;\n    rev = c->read;\n    rev->handler =  ngx_rtmp_proxy_protocol_recv;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"proxy_protocol: start\");\n\n    if (rev->ready) {\n        /* the deferred accept(), rtsig, aio, iocp */\n\n        if (ngx_use_accept_mutex) {\n            ngx_post_event(rev, &ngx_posted_events);\n            return;\n        }\n\n        rev->handler(rev);\n        return;\n    }\n\n    ngx_add_timer(rev, s->timeout);\n\n    if (ngx_handle_read_event(rev, 0) != NGX_OK) {\n        ngx_rtmp_finalize_session(s);\n        return;\n    }\n}\n\n\nstatic void\nngx_rtmp_proxy_protocol_recv(ngx_event_t *rev)\n{\n    u_char               buf[107], *p, *pp, *text;\n    size_t               len;\n    ssize_t              n;\n    ngx_err_t            err;\n    ngx_int_t            i;\n    ngx_addr_t           addr;\n    ngx_connection_t    *c;\n    ngx_rtmp_session_t  *s;\n\n    c = rev->data;\n    s = c->data;\n\n    if (c->destroyed) {\n        return;\n    }\n\n    if (rev->timedout) {\n        ngx_log_error(NGX_LOG_INFO, c->log, NGX_ETIMEDOUT,\n                \"proxy_protocol: recv: client timed out\");\n        c->timedout = 1;\n        ngx_rtmp_finalize_session(s);\n        return;\n    }\n\n    if (rev->timer_set) {\n        ngx_del_timer(rev);\n    }\n\n    n = recv(c->fd, (char *) buf, sizeof(buf), MSG_PEEK);\n\n    err = ngx_socket_errno;\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, c->log, 0, \"recv(): %d\", n);\n\n    if (n == -1) {\n\n        if (err == NGX_EAGAIN) {\n            ngx_add_timer(rev, s->timeout);\n\n            if (ngx_handle_read_event(c->read, 0) != NGX_OK) {\n                ngx_rtmp_finalize_session(s);\n            }\n\n            return;\n        }\n\n        ngx_rtmp_finalize_session(s);\n\n        return;\n    }\n\n    p = buf;\n\n    if (n <= 8 && ngx_strncmp(p, \"PROXY \", 6) != 0) {\n        goto bad_header;\n    }\n\n    n -= 6;\n    p += 6;\n\n    ngx_memzero(&addr, sizeof(ngx_addr_t));\n\n    if (n >= 7 && ngx_strncmp(p, \"UNKNOWN\", 7) == 0) {\n        n -= 7;\n        p += 7;\n        goto skip;\n    }\n\n    if (n < 5 || ngx_strncmp(p, \"TCP\", 3) != 0\n        || (p[3] != '4' && p[3] != '6') || p[4] != ' ')\n    {\n        goto bad_header;\n    }\n\n    n -= 5;\n    p += 5;\n\n    pp = ngx_strlchr(p, p + n, ' ');\n\n    if (pp == NULL) {\n        goto bad_header;\n    }\n\n    if (ngx_parse_addr(s->pool, &addr, p, pp - p) != NGX_OK) {\n        goto bad_header;\n    }\n\n    n -= pp - p;\n    p = pp;\n\nskip:\n\n    for (i = 0; i + 1 < n; i++) {\n        if (p[i] == CR && p[i + 1] == LF) {\n            break;\n        }\n    }\n\n    if (i + 1 >= n) {\n        goto bad_header;\n    }\n\n    n = p - buf + i + 2;\n\n    if (c->recv(c, buf, n) != n) {\n        goto failed;\n    }\n\n    if (addr.socklen) {\n        text = ngx_palloc(s->pool, NGX_SOCKADDR_STRLEN);\n\n        if (text == NULL) {\n            goto failed;\n        }\n\n        len = ngx_sock_ntop(addr.sockaddr,\n#if (nginx_version >= 1005003)\n                            addr.socklen,\n#endif\n                            text, NGX_SOCKADDR_STRLEN, 0);\n        if (len == 0) {\n            goto failed;\n        }\n\n        c->sockaddr = addr.sockaddr;\n        c->socklen = addr.socklen;\n        c->addr_text.data = text;\n        c->addr_text.len = len;\n\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, c->log, 0,\n                       \"proxy_protocol: remote_addr:'%V'\", &c->addr_text);\n    }\n\n    ngx_rtmp_handshake(s);\n\n    return;\n\nbad_header:\n\n    ngx_log_error(NGX_LOG_INFO, c->log, 0, \"proxy_protocol: bad header\");\n\nfailed:\n\n    ngx_rtmp_finalize_session(s);\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_proxy_protocol.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#ifndef _NGX_RTMP_PROXY_PROTOCOL_H_INCLUDED_\n#define _NGX_RTMP_PROXY_PROTOCOL_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n\n\nvoid ngx_rtmp_proxy_protocol(ngx_rtmp_session_t *c);\n\n\n#endif /* _NGX_RTMP_PROXY_PROTOCOL_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_receive.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_amf.h\"\n#include \"ngx_rtmp_cmd_module.h\"\n#include <string.h>\n\n\nngx_int_t\nngx_rtmp_protocol_message_handler(ngx_rtmp_session_t *s,\n        ngx_rtmp_header_t *h, ngx_chain_t *in)\n{\n    ngx_buf_t              *b;\n    u_char                 *p;\n    uint32_t                val;\n    uint8_t                 limit;\n\n    b = in->buf;\n\n    if (b->last - b->pos < 4) {\n        ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                \"too small buffer for %d message: %d\",\n                (int)h->type, b->last - b->pos);\n        return NGX_OK;\n    }\n\n    p = (u_char*)&val;\n    p[0] = b->pos[3];\n    p[1] = b->pos[2];\n    p[2] = b->pos[1];\n    p[3] = b->pos[0];\n\n    switch(h->type) {\n        case NGX_RTMP_MSG_CHUNK_SIZE:\n            /* set chunk size =val */\n            ngx_rtmp_set_chunk_size(s, val);\n            break;\n\n        case NGX_RTMP_MSG_ABORT:\n            /* abort chunk stream =val */\n            break;\n\n        case NGX_RTMP_MSG_ACK:\n            /* receive ack with sequence number =val */\n            ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                \"receive ack seq=%uD\", val);\n            break;\n\n        case NGX_RTMP_MSG_ACK_SIZE:\n            /* receive window size =val */\n            ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                \"receive ack_size=%uD\", val);\n            s->ack_size = val;\n            break;\n\n        case NGX_RTMP_MSG_BANDWIDTH:\n            if (b->last - b->pos >= 5) {\n                limit = *(uint8_t*)&b->pos[4];\n\n                (void)val;\n                (void)limit;\n\n                ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                    \"receive bandwidth=%uD limit=%d\",\n                    val, (int)limit);\n\n                /* receive window size =val\n                 * && limit */\n            }\n            break;\n\n        default:\n            return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_user_message_handler(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n                              ngx_chain_t *in)\n{\n    ngx_buf_t              *b;\n    u_char                 *p;\n    uint16_t                evt;\n    uint32_t                val;\n\n    b = in->buf;\n\n    if (b->last - b->pos < 6) {\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"too small buffer for user message: %d\",\n                       b->last - b->pos);\n        return NGX_OK;\n    }\n\n    p = (u_char*)&evt;\n\n    p[0] = b->pos[1];\n    p[1] = b->pos[0];\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"RTMP recv user evt %s (%i)\",\n                   ngx_rtmp_user_message_type(evt), (ngx_int_t) evt);\n\n    p = (u_char *) &val;\n\n    p[0] = b->pos[5];\n    p[1] = b->pos[4];\n    p[2] = b->pos[3];\n    p[3] = b->pos[2];\n\n    switch(evt) {\n        case NGX_RTMP_USER_STREAM_BEGIN:\n            {\n                ngx_rtmp_stream_begin_t     v;\n\n                v.msid = val;\n\n                ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                               \"receive: stream_begin msid=%uD\", v.msid);\n\n                return ngx_rtmp_stream_begin(s, &v);\n            }\n\n        case NGX_RTMP_USER_STREAM_EOF:\n            {\n                ngx_rtmp_stream_eof_t       v;\n\n                v.msid = val;\n\n                ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                               \"receive: stream_eof msid=%uD\", v.msid);\n\n                return ngx_rtmp_stream_eof(s, &v);\n            }\n\n        case NGX_RTMP_USER_STREAM_DRY:\n            {\n                ngx_rtmp_stream_dry_t       v;\n\n                v.msid = val;\n\n                ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                               \"receive: stream_dry msid=%uD\", v.msid);\n\n                return ngx_rtmp_stream_dry(s, &v);\n            }\n\n        case NGX_RTMP_USER_SET_BUFLEN:\n            {\n                ngx_rtmp_set_buflen_t       v;\n\n                v.msid = val;\n\n                if (b->last - b->pos < 10) {\n                    return NGX_OK;\n                }\n\n                p = (u_char *) &v.buflen;\n\n                p[0] = b->pos[9];\n                p[1] = b->pos[8];\n                p[2] = b->pos[7];\n                p[3] = b->pos[6];\n\n                ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                               \"receive: set_buflen msid=%uD buflen=%uD\",\n                               v.msid, v.buflen);\n\n                /*TODO: move this to play module */\n                s->buflen = v.buflen;\n\n                return ngx_rtmp_set_buflen(s, &v);\n            }\n\n        case NGX_RTMP_USER_RECORDED:\n            {\n                ngx_rtmp_recorded_t       v;\n\n                v.msid = val;\n\n                ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                               \"receive: recorded msid=%uD\", v.msid);\n\n                return ngx_rtmp_recorded(s, &v);\n            }\n\n        case NGX_RTMP_USER_PING_REQUEST:\n            return ngx_rtmp_send_ping_response(s, val);\n\n        case NGX_RTMP_USER_PING_RESPONSE:\n\n            /* val = incoming timestamp */\n\n            ngx_rtmp_reset_ping(s);\n\n            return NGX_OK;\n\n        default:\n            ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                           \"unexpected user event: %i\", (ngx_int_t) evt);\n\n            return NGX_OK;\n    }\n}\n\n\nstatic ngx_int_t\nngx_rtmp_fetch(ngx_chain_t **in, u_char *ret)\n{\n    while (*in && (*in)->buf->pos >= (*in)->buf->last) {\n        *in = (*in)->next;\n    }\n\n    if (*in == NULL) {\n        return NGX_DONE;\n    }\n\n    *ret = *(*in)->buf->pos++;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_fetch_uint8(ngx_chain_t **in, uint8_t *ret)\n{\n    return ngx_rtmp_fetch(in, (u_char *) ret);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_fetch_uint32(ngx_chain_t **in, uint32_t *ret, ngx_int_t n)\n{\n    u_char     *r = (u_char *) ret;\n    ngx_int_t   rc;\n\n    *ret = 0;\n\n    while (--n >= 0) {\n        rc = ngx_rtmp_fetch(in, &r[n]);\n        if (rc != NGX_OK) {\n            return rc;\n        }\n    }\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_aggregate_message_handler(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n                                   ngx_chain_t *in)\n{\n    uint32_t            base_time, timestamp, prev_size;\n    size_t              len;\n    ngx_int_t           first;\n    u_char             *last;\n    ngx_int_t           rc;\n    ngx_buf_t          *b;\n    ngx_chain_t        *cl, *next;\n    ngx_rtmp_header_t   ch;\n\n    ch = *h;\n\n    first = 1;\n    base_time = 0;\n\n    while (in) {\n        if (ngx_rtmp_fetch_uint8(&in, &ch.type) != NGX_OK) {\n            return NGX_OK;\n        }\n\n        if (ngx_rtmp_fetch_uint32(&in, &ch.mlen, 3) != NGX_OK) {\n            return NGX_ERROR;\n        }\n\n        if (ngx_rtmp_fetch_uint32(&in, &timestamp, 3) != NGX_OK) {\n            return NGX_ERROR;\n        }\n\n        if (ngx_rtmp_fetch_uint8(&in, (uint8_t *) &timestamp + 3) != NGX_OK)\n        {\n            return NGX_ERROR;\n        }\n\n        if (ngx_rtmp_fetch_uint32(&in, &ch.msid, 3) != NGX_OK)\n        {\n            return NGX_ERROR;\n        }\n\n        if (first) {\n            base_time = timestamp;\n            first = 0;\n        }\n\n        ngx_log_debug6(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"RTMP aggregate %s (%d) len=%uD time=%uD (+%D) msid=%uD\",\n                       ngx_rtmp_message_type(ch.type),\n                       (ngx_int_t) ch.type, ch.mlen, ch.timestamp,\n                       timestamp - base_time, ch.msid);\n\n        /* limit chain */\n\n        len = 0;\n        cl = in;\n        while (cl) {\n            b = cl->buf;\n            len += (b->last - b->pos);\n            if (len > ch.mlen) {\n                break;\n            }\n            cl = cl->next;\n        }\n\n        if (cl == NULL) {\n            ngx_log_error(NGX_LOG_INFO, s->log, 0,\n                          \"RTMP error parsing aggregate\");\n            return NGX_ERROR;\n        }\n\n        next = cl->next;\n        cl->next = NULL;\n        b = cl->buf;\n        last = b->last;\n        b->last -= (len - ch.mlen);\n\n        /* handle aggregated message */\n\n        ch.timestamp = h->timestamp + timestamp - base_time;\n\n        rc = ngx_rtmp_receive_message(s, &ch, in);\n\n        /* restore chain before checking the result */\n\n        in = cl;\n        in->next = next;\n        b->pos = b->last;\n        b->last = last;\n\n        if (rc != NGX_OK) {\n            return rc;\n        }\n\n        /* read 32-bit previous tag size */\n\n        if (ngx_rtmp_fetch_uint32(&in, &prev_size, 4) != NGX_OK) {\n            return NGX_OK;\n        }\n\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"RTMP aggregate prev_size=%uD\", prev_size);\n    }\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_amf_message_handler(ngx_rtmp_session_t *s,\n        ngx_rtmp_header_t *h, ngx_chain_t *in)\n{\n    ngx_rtmp_amf_ctx_t          act;\n    ngx_rtmp_core_main_conf_t  *cmcf;\n    ngx_array_t                *ch;\n    ngx_rtmp_handler_pt        *ph;\n    size_t                      len, n;\n\n    static u_char               func[128];\n\n    static ngx_rtmp_amf_elt_t   elts[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          func,   sizeof(func) },\n    };\n\n    /* AMF command names come with string type, but shared object names\n     * come without type */\n    if (h->type == NGX_RTMP_MSG_AMF_SHARED ||\n        h->type == NGX_RTMP_MSG_AMF3_SHARED)\n    {\n        elts[0].type |= NGX_RTMP_AMF_TYPELESS;\n    } else {\n        elts[0].type &= ~NGX_RTMP_AMF_TYPELESS;\n    }\n\n    if ((h->type == NGX_RTMP_MSG_AMF3_SHARED ||\n         h->type == NGX_RTMP_MSG_AMF3_META ||\n         h->type == NGX_RTMP_MSG_AMF3_CMD)\n         && in->buf->last > in->buf->pos)\n    {\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                \"AMF3 prefix: %ui\", (ngx_int_t)*in->buf->pos);\n        ++in->buf->pos;\n    }\n\n    cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module);\n\n    /* read AMF func name & transaction id */\n    ngx_memzero(&act, sizeof(act));\n    act.link = in;\n    act.log = s->log;\n    memset(func, 0, sizeof(func));\n\n    if (ngx_rtmp_amf_read(&act, elts,\n                sizeof(elts) / sizeof(elts[0])) != NGX_OK)\n    {\n        ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                \"AMF cmd failed\");\n        return NGX_ERROR;\n    }\n\n    /* skip name */\n    in = act.link;\n    in->buf->pos += act.offset;\n\n    len = ngx_strlen(func);\n\n    ch = ngx_hash_find(&cmcf->amf_hash,\n            ngx_hash_strlow(func, func, len), func, len);\n\n    if (ch && ch->nelts) {\n        ph = ch->elts;\n        for (n = 0; n < ch->nelts; ++n, ++ph) {\n            ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                \"AMF func '%s' passed to handler %d/%d\",\n                func, n, ch->nelts);\n            switch ((*ph)(s, h, in)) {\n                case NGX_ERROR:\n                    return NGX_ERROR;\n                case NGX_DONE:\n                    return NGX_OK;\n            }\n        }\n    } else {\n        ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n            \"AMF cmd '%s' no handler\", func);\n    }\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_receive_amf(ngx_rtmp_session_t *s, ngx_chain_t *in,\n        ngx_rtmp_amf_elt_t *elts, size_t nelts)\n{\n    ngx_rtmp_amf_ctx_t     act;\n\n    ngx_memzero(&act, sizeof(act));\n    act.link = in;\n    act.log = s->log;\n\n    return ngx_rtmp_amf_read(&act, elts, nelts);\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_record_module.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_cmd_module.h\"\n#include \"ngx_rtmp_codec_module.h\"\n#include \"ngx_rtmp_record_module.h\"\n\n\nngx_rtmp_record_done_pt             ngx_rtmp_record_done;\n\n\nstatic ngx_rtmp_publish_pt          next_publish;\nstatic ngx_rtmp_close_stream_pt     next_close_stream;\nstatic ngx_rtmp_stream_begin_pt     next_stream_begin;\nstatic ngx_rtmp_stream_eof_pt       next_stream_eof;\n\n\nstatic char *ngx_rtmp_record_recorder(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\nstatic ngx_int_t ngx_rtmp_record_postconfiguration(ngx_conf_t *cf);\nstatic void * ngx_rtmp_record_create_app_conf(ngx_conf_t *cf);\nstatic char * ngx_rtmp_record_merge_app_conf(ngx_conf_t *cf,\n       void *parent, void *child);\nstatic ngx_int_t ngx_rtmp_record_write_frame(ngx_rtmp_session_t *s,\n       ngx_rtmp_record_rec_ctx_t *rctx,\n       ngx_rtmp_header_t *h, ngx_chain_t *in, ngx_int_t inc_nframes);\nstatic ngx_int_t ngx_rtmp_record_av(ngx_rtmp_session_t *s,\n       ngx_rtmp_header_t *h, ngx_chain_t *in);\nstatic ngx_int_t ngx_rtmp_record_node_av(ngx_rtmp_session_t *s,\n       ngx_rtmp_record_rec_ctx_t *rctx, ngx_rtmp_header_t *h, ngx_chain_t *in);\nstatic ngx_int_t ngx_rtmp_record_node_open(ngx_rtmp_session_t *s,\n       ngx_rtmp_record_rec_ctx_t *rctx);\nstatic ngx_int_t ngx_rtmp_record_node_close(ngx_rtmp_session_t *s,\n       ngx_rtmp_record_rec_ctx_t *rctx);\nstatic void  ngx_rtmp_record_make_path(ngx_rtmp_session_t *s,\n       ngx_rtmp_record_rec_ctx_t *rctx, ngx_str_t *path);\nstatic ngx_int_t ngx_rtmp_record_init(ngx_rtmp_session_t *s);\n\n\nstatic ngx_conf_bitmask_t  ngx_rtmp_record_mask[] = {\n    { ngx_string(\"off\"),                NGX_RTMP_RECORD_OFF         },\n    { ngx_string(\"all\"),                NGX_RTMP_RECORD_AUDIO       |\n                                        NGX_RTMP_RECORD_VIDEO       },\n    { ngx_string(\"audio\"),              NGX_RTMP_RECORD_AUDIO       },\n    { ngx_string(\"video\"),              NGX_RTMP_RECORD_VIDEO       },\n    { ngx_string(\"keyframes\"),          NGX_RTMP_RECORD_KEYFRAMES   },\n    { ngx_string(\"manual\"),             NGX_RTMP_RECORD_MANUAL      },\n    { ngx_null_string,                  0                           }\n};\n\n\nstatic ngx_command_t  ngx_rtmp_record_commands[] = {\n\n    { ngx_string(\"record\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|\n                         NGX_RTMP_REC_CONF|NGX_CONF_1MORE,\n      ngx_conf_set_bitmask_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_record_app_conf_t, flags),\n      ngx_rtmp_record_mask },\n\n    { ngx_string(\"record_path\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|\n                         NGX_RTMP_REC_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_str_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_record_app_conf_t, path),\n      NULL },\n\n    { ngx_string(\"record_suffix\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|\n                         NGX_RTMP_REC_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_str_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_record_app_conf_t, suffix),\n      NULL },\n\n    { ngx_string(\"record_unique\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|\n                         NGX_RTMP_REC_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_record_app_conf_t, unique),\n      NULL },\n\n    { ngx_string(\"record_append\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|\n                         NGX_RTMP_REC_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_record_app_conf_t, append),\n      NULL },\n\n    { ngx_string(\"record_lock\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|\n                         NGX_RTMP_REC_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_record_app_conf_t, lock_file),\n      NULL },\n\n    { ngx_string(\"record_max_size\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|\n                         NGX_RTMP_REC_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_size_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_record_app_conf_t, max_size),\n      NULL },\n\n    { ngx_string(\"record_max_frames\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|\n                         NGX_RTMP_REC_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_size_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_record_app_conf_t, max_frames),\n      NULL },\n\n    { ngx_string(\"record_interval\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|\n                         NGX_RTMP_REC_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_record_app_conf_t, interval),\n      NULL },\n\n    { ngx_string(\"record_notify\"),\n      NGX_RTMP_MAIN_CONF|NGX_RTMP_SRV_CONF|NGX_RTMP_APP_CONF|\n                         NGX_RTMP_REC_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_flag_slot,\n      NGX_RTMP_APP_CONF_OFFSET,\n      offsetof(ngx_rtmp_record_app_conf_t, notify),\n      NULL },\n\n    { ngx_string(\"recorder\"),\n      NGX_RTMP_APP_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE1,\n      ngx_rtmp_record_recorder,\n      NGX_RTMP_APP_CONF_OFFSET,\n      0,\n      NULL },\n\n\n      ngx_null_command\n};\n\n\nstatic ngx_rtmp_module_t  ngx_rtmp_record_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    ngx_rtmp_record_postconfiguration,      /* postconfiguration */\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n    ngx_rtmp_record_create_app_conf,        /* create app configuration */\n    ngx_rtmp_record_merge_app_conf          /* merge app configuration */\n};\n\n\nngx_module_t  ngx_rtmp_record_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_record_module_ctx,            /* module context */\n    ngx_rtmp_record_commands,               /* module directives */\n    NGX_RTMP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_rtmp_record_create_app_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_record_app_conf_t      *racf;\n\n    racf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_record_app_conf_t));\n\n    if (racf == NULL) {\n        return NULL;\n    }\n\n    racf->max_size = NGX_CONF_UNSET_SIZE;\n    racf->max_frames = NGX_CONF_UNSET_SIZE;\n    racf->interval = NGX_CONF_UNSET_MSEC;\n    racf->unique = NGX_CONF_UNSET;\n    racf->append = NGX_CONF_UNSET;\n    racf->lock_file = NGX_CONF_UNSET;\n    racf->notify = NGX_CONF_UNSET;\n    racf->url = NGX_CONF_UNSET_PTR;\n\n    if (ngx_array_init(&racf->rec, cf->pool, 1, sizeof(void *)) != NGX_OK) {\n        return NULL;\n    }\n\n    return racf;\n}\n\n\nstatic char *\nngx_rtmp_record_merge_app_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_rtmp_record_app_conf_t     *prev = parent;\n    ngx_rtmp_record_app_conf_t     *conf = child;\n    ngx_rtmp_record_app_conf_t    **rracf;\n\n    ngx_conf_merge_str_value(conf->path, prev->path, \"\");\n    ngx_conf_merge_str_value(conf->suffix, prev->suffix, \".flv\");\n    ngx_conf_merge_size_value(conf->max_size, prev->max_size, 0);\n    ngx_conf_merge_size_value(conf->max_frames, prev->max_frames, 0);\n    ngx_conf_merge_value(conf->unique, prev->unique, 0);\n    ngx_conf_merge_value(conf->append, prev->append, 0);\n    ngx_conf_merge_value(conf->lock_file, prev->lock_file, 0);\n    ngx_conf_merge_value(conf->notify, prev->notify, 0);\n    ngx_conf_merge_msec_value(conf->interval, prev->interval,\n                              (ngx_msec_t) NGX_CONF_UNSET);\n    ngx_conf_merge_bitmask_value(conf->flags, prev->flags, 0);\n    ngx_conf_merge_ptr_value(conf->url, prev->url, NULL);\n\n    if (conf->flags) {\n        rracf = ngx_array_push(&conf->rec);\n        if (rracf == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n        *rracf = conf;\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_record_write_header(ngx_file_t *file)\n{\n    static u_char       flv_header[] = {\n        0x46, /* 'F' */\n        0x4c, /* 'L' */\n        0x56, /* 'V' */\n        0x01, /* version = 1 */\n        0x05, /* 00000 1 0 1 = has audio & video */\n        0x00,\n        0x00,\n        0x00,\n        0x09, /* header size */\n        0x00,\n        0x00,\n        0x00,\n        0x00  /* PreviousTagSize0 (not actually a header) */\n    };\n\n    return ngx_write_file(file, flv_header, sizeof(flv_header), 0) == NGX_ERROR\n           ? NGX_ERROR\n           : NGX_OK;\n}\n\n\nstatic ngx_rtmp_record_rec_ctx_t *\nngx_rtmp_record_get_node_ctx(ngx_rtmp_session_t *s, ngx_uint_t n)\n{\n    ngx_rtmp_record_ctx_t          *ctx;\n    ngx_rtmp_record_rec_ctx_t      *rctx;\n\n    if (ngx_rtmp_record_init(s) != NGX_OK) {\n        return NULL;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_record_module);\n\n    if (n >= ctx->rec.nelts) {\n        return NULL;\n    }\n\n    rctx = ctx->rec.elts;\n\n    return &rctx[n];\n}\n\n\nngx_int_t\nngx_rtmp_record_open(ngx_rtmp_session_t *s, ngx_uint_t n, ngx_str_t *path)\n{\n    ngx_rtmp_record_rec_ctx_t      *rctx;\n    ngx_int_t                       rc;\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"record: #%ui manual open\", n);\n\n    rctx = ngx_rtmp_record_get_node_ctx(s, n);\n\n    if (rctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    rc = ngx_rtmp_record_node_open(s, rctx);\n    if (rc != NGX_OK) {\n        return rc;\n    }\n\n    if (path) {\n        ngx_rtmp_record_make_path(s, rctx, path);\n    }\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_record_close(ngx_rtmp_session_t *s, ngx_uint_t n, ngx_str_t *path)\n{\n    ngx_rtmp_record_rec_ctx_t      *rctx;\n    ngx_int_t                       rc;\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"record: #%ui manual close\", n);\n\n    rctx = ngx_rtmp_record_get_node_ctx(s, n);\n\n    if (rctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    rc = ngx_rtmp_record_node_close(s, rctx);\n    if (rc != NGX_OK) {\n        return rc;\n    }\n\n    if (path) {\n        ngx_rtmp_record_make_path(s, rctx, path);\n    }\n\n    return NGX_OK;\n}\n\n\nngx_uint_t\nngx_rtmp_record_find(ngx_rtmp_record_app_conf_t *racf, ngx_str_t *id)\n{\n    ngx_rtmp_record_app_conf_t    **pracf, *rracf;\n    ngx_uint_t                      n;\n\n    pracf = racf->rec.elts;\n\n    for (n = 0; n < racf->rec.nelts; ++n, ++pracf) {\n        rracf = *pracf;\n\n        if (rracf->id.len == id->len &&\n            ngx_strncmp(rracf->id.data, id->data, id->len) == 0)\n        {\n            return n;\n        }\n    }\n\n    return NGX_CONF_UNSET_UINT;\n}\n\n\n/* This funcion returns pointer to a static buffer */\nstatic void\nngx_rtmp_record_make_path(ngx_rtmp_session_t *s,\n                          ngx_rtmp_record_rec_ctx_t *rctx, ngx_str_t *path)\n{\n    ngx_rtmp_record_ctx_t          *ctx;\n    ngx_rtmp_record_app_conf_t     *rracf;\n    u_char                         *p, *l;\n    struct tm                       tm;\n\n    static u_char                   buf[NGX_TIME_T_LEN + 1];\n    static u_char                   pbuf[NGX_MAX_PATH + 1];\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_record_module);\n\n    rracf = rctx->conf;\n\n    /* create file path */\n    p = pbuf;\n    l = pbuf + sizeof(pbuf) - 1;\n\n    p = ngx_cpymem(p, rracf->path.data,\n                ngx_min(rracf->path.len, (size_t)(l - p - 1)));\n    *p++ = '/';\n    p = (u_char *)ngx_escape_uri(p, ctx->name, ngx_min(ngx_strlen(ctx->name),\n                (size_t)(l - p)), NGX_ESCAPE_URI_COMPONENT);\n\n    /* append timestamp */\n    if (rracf->unique) {\n        p = ngx_cpymem(p, buf, ngx_min(ngx_sprintf(buf, \"-%T\",\n                       rctx->timestamp) - buf, l - p));\n    }\n\n    if (ngx_strchr(rracf->suffix.data, '%')) {\n        ngx_libc_localtime(rctx->timestamp, &tm);\n        p += strftime((char *) p, l - p, (char *) rracf->suffix.data, &tm);\n    } else {\n        p = ngx_cpymem(p, rracf->suffix.data,\n                ngx_min(rracf->suffix.len, (size_t)(l - p)));\n    }\n\n    *p = 0;\n    path->data = pbuf;\n    path->len  = p - pbuf;\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"record: %V path: '%V'\", &rracf->id, path);\n}\n\n\nstatic void\nngx_rtmp_record_notify_error(ngx_rtmp_session_t *s,\n                             ngx_rtmp_record_rec_ctx_t *rctx)\n{\n    ngx_rtmp_record_app_conf_t *rracf = rctx->conf;\n\n    rctx->failed = 1;\n\n    if (!rracf->notify) {\n        return;\n    }\n\n    ngx_rtmp_send_status(s, \"NetStream.Record.Failed\", \"error\",\n                         rracf->id.data ? (char *) rracf->id.data : \"\");\n}\n\n\nstatic ngx_int_t\nngx_rtmp_record_node_open(ngx_rtmp_session_t *s,\n                          ngx_rtmp_record_rec_ctx_t *rctx)\n{\n    ngx_rtmp_record_app_conf_t *rracf;\n    ngx_err_t                   err;\n    ngx_str_t                   path;\n    ngx_int_t                   mode, create_mode;\n    u_char                      buf[8], *p;\n    off_t                       file_size;\n    uint32_t                    tag_size, mlen, timestamp;\n\n    rracf = rctx->conf;\n    tag_size = 0;\n\n    if (rctx->file.fd != NGX_INVALID_FILE) {\n        return NGX_AGAIN;\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"record: %V opening\", &rracf->id);\n\n    ngx_memzero(rctx, sizeof(*rctx));\n    rctx->conf = rracf;\n    rctx->last = *ngx_cached_time;\n    rctx->timestamp = ngx_cached_time->sec;\n\n    ngx_rtmp_record_make_path(s, rctx, &path);\n\n    mode = rracf->append ? NGX_FILE_RDWR : NGX_FILE_WRONLY;\n    create_mode = rracf->append ? NGX_FILE_CREATE_OR_OPEN : NGX_FILE_TRUNCATE;\n\n    ngx_memzero(&rctx->file, sizeof(rctx->file));\n    rctx->file.offset = 0;\n    rctx->file.log = s->log;\n    rctx->file.fd = ngx_open_file(path.data, mode, create_mode,\n                                  NGX_FILE_DEFAULT_ACCESS);\n    ngx_str_set(&rctx->file.name, \"recorded\");\n\n    if (rctx->file.fd == NGX_INVALID_FILE) {\n        err = ngx_errno;\n\n        if (err != NGX_ENOENT) {\n            ngx_log_error(NGX_LOG_CRIT, s->log, err,\n                          \"record: %V failed to open file '%V'\",\n                          &rracf->id, &path);\n        }\n\n        ngx_rtmp_record_notify_error(s, rctx);\n\n        return NGX_OK;\n    }\n\n#if !(NGX_WIN32)\n    if (rracf->lock_file) {\n        err = ngx_lock_fd(rctx->file.fd);\n        if (err) {\n            ngx_log_error(NGX_LOG_CRIT, s->log, err,\n                          \"record: %V lock failed\", &rracf->id);\n        }\n    }\n#endif\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"record: %V opened '%V'\", &rracf->id, &path);\n\n    if (rracf->notify) {\n        ngx_rtmp_send_status(s, \"NetStream.Record.Start\", \"status\",\n                             rracf->id.data ? (char *) rracf->id.data : \"\");\n    }\n\n    if (rracf->append) {\n\n        file_size = 0;\n        timestamp = 0;\n\n#if (NGX_WIN32)\n        {\n            LONG  lo, hi;\n\n            lo = 0;\n            hi = 0;\n            lo = SetFilePointer(rctx->file.fd, lo, &hi, FILE_END);\n            file_size = (lo == INVALID_SET_FILE_POINTER ?\n                         (off_t) -1 : (off_t) hi << 32 | (off_t) lo);\n        }\n#else\n        file_size = lseek(rctx->file.fd, 0, SEEK_END);\n#endif\n        if (file_size == (off_t) -1) {\n            ngx_log_error(NGX_LOG_CRIT, s->log, ngx_errno,\n                          \"record: %V seek failed\", &rracf->id);\n            goto done;\n        }\n\n        if (file_size < 4) {\n            goto done;\n        }\n\n        if (ngx_read_file(&rctx->file, buf, 4, file_size - 4) != 4) {\n            ngx_log_error(NGX_LOG_CRIT, s->log, ngx_errno,\n                          \"record: %V tag size read failed\", &rracf->id);\n            goto done;\n        }\n\n        p = (u_char *) &tag_size;\n        p[0] = buf[3];\n        p[1] = buf[2];\n        p[2] = buf[1];\n        p[3] = buf[0];\n\n        if (tag_size == 0 || tag_size + 4 > file_size) {\n            file_size = 0;\n            goto done;\n        }\n\n        if (ngx_read_file(&rctx->file, buf, 8, file_size - tag_size - 4) != 8)\n        {\n            ngx_log_error(NGX_LOG_CRIT, s->log, ngx_errno,\n                          \"record: %V tag read failed\", &rracf->id);\n            goto done;\n        }\n\n        p = (u_char *) &mlen;\n        p[0] = buf[3];\n        p[1] = buf[2];\n        p[2] = buf[1];\n        p[3] = 0;\n\n        if (tag_size != mlen + 11) {\n            ngx_log_error(NGX_LOG_CRIT, s->log, ngx_errno,\n                          \"record: %V tag size mismatch: \"\n                          \"tag_size=%uD, mlen=%uD\", &rracf->id, tag_size, mlen);\n            goto done;\n        }\n\n        p = (u_char *) &timestamp;\n        p[3] = buf[7];\n        p[0] = buf[6];\n        p[1] = buf[5];\n        p[2] = buf[4];\n\ndone:\n        rctx->file.offset = file_size;\n        rctx->time_shift = timestamp;\n\n        ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"record: append offset=%O, time=%uD, tag_size=%uD\",\n                       file_size, timestamp, tag_size);\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_record_init(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_record_app_conf_t     *racf, **rracf;\n    ngx_rtmp_record_rec_ctx_t      *rctx;\n    ngx_rtmp_record_ctx_t          *ctx;\n    ngx_uint_t                      n;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_record_module);\n\n    if (ctx) {\n        return NGX_OK;\n    }\n\n    racf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_record_module);\n\n    if (racf == NULL || racf->rec.nelts == 0) {\n        return NGX_OK;\n    }\n\n    ctx = ngx_pcalloc(s->connection->pool, sizeof(ngx_rtmp_record_ctx_t));\n\n    if (ctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    ngx_rtmp_set_ctx(s, ctx, ngx_rtmp_record_module);\n\n    if (ngx_array_init(&ctx->rec, s->connection->pool, racf->rec.nelts,\n                       sizeof(ngx_rtmp_record_rec_ctx_t))\n        != NGX_OK)\n    {\n        return NGX_ERROR;\n    }\n\n    rracf = racf->rec.elts;\n\n    rctx = ngx_array_push_n(&ctx->rec, racf->rec.nelts);\n\n    if (rctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    for (n = 0; n < racf->rec.nelts; ++n, ++rracf, ++rctx) {\n        ngx_memzero(rctx, sizeof(*rctx));\n\n        rctx->conf = *rracf;\n        rctx->file.fd = NGX_INVALID_FILE;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic void\nngx_rtmp_record_start(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_record_app_conf_t     *racf;\n    ngx_rtmp_record_rec_ctx_t      *rctx;\n    ngx_rtmp_record_ctx_t          *ctx;\n    ngx_uint_t                      n;\n\n    racf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_record_module);\n    if (racf == NULL || racf->rec.nelts == 0) {\n        return;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_record_module);\n    if (ctx == NULL) {\n        return;\n    }\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"record: start\");\n\n    rctx = ctx->rec.elts;\n    for (n = 0; n < ctx->rec.nelts; ++n, ++rctx) {\n        if (rctx->conf->flags & (NGX_RTMP_RECORD_OFF|NGX_RTMP_RECORD_MANUAL)) {\n            continue;\n        }\n        ngx_rtmp_record_node_open(s, rctx);\n    }\n}\n\n\nstatic void\nngx_rtmp_record_stop(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_record_app_conf_t     *racf;\n    ngx_rtmp_record_rec_ctx_t      *rctx;\n    ngx_rtmp_record_ctx_t          *ctx;\n    ngx_uint_t                      n;\n\n    racf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_record_module);\n    if (racf == NULL || racf->rec.nelts == 0) {\n        return;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_record_module);\n    if (ctx == NULL) {\n        return;\n    }\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"record: stop\");\n\n    rctx = ctx->rec.elts;\n    for (n = 0; n < ctx->rec.nelts; ++n, ++rctx) {\n        ngx_rtmp_record_node_close(s, rctx);\n    }\n}\n\n\nstatic ngx_int_t\nngx_rtmp_record_publish(ngx_rtmp_session_t *s, ngx_rtmp_publish_t *v)\n{\n    ngx_rtmp_record_app_conf_t     *racf;\n    ngx_rtmp_record_ctx_t          *ctx;\n    u_char                         *p;\n\n    if (s->interprocess) {\n        goto next;\n    }\n\n    racf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_record_module);\n\n    if (racf == NULL || racf->rec.nelts == 0) {\n        goto next;\n    }\n\n    if (ngx_rtmp_record_init(s) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"record: publish %ui nodes\",\n                   racf->rec.nelts);\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_record_module);\n\n    ngx_memcpy(ctx->name, v->name, sizeof(ctx->name));\n    ngx_memcpy(ctx->args, v->args, sizeof(ctx->args));\n\n    /* terminate name on /../ */\n    for (p = ctx->name; *p; ++p) {\n        if (ngx_path_separator(p[0]) &&\n            p[1] == '.' && p[2] == '.' &&\n            ngx_path_separator(p[3]))\n        {\n            *p = 0;\n            break;\n        }\n    }\n\n    ngx_rtmp_record_start(s);\n\nnext:\n    return next_publish(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_record_stream_begin(ngx_rtmp_session_t *s, ngx_rtmp_stream_begin_t *v)\n{\n    if (s->interprocess) {\n        goto next;\n    }\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"record: stream_begin\");\n\n    ngx_rtmp_record_start(s);\n\nnext:\n    return next_stream_begin(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_record_stream_eof(ngx_rtmp_session_t *s, ngx_rtmp_stream_begin_t *v)\n{\n    if (s->interprocess) {\n        goto next;\n    }\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"record: stream_eof\");\n\n    ngx_rtmp_record_stop(s);\n\nnext:\n    return next_stream_eof(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_record_node_close(ngx_rtmp_session_t *s,\n                           ngx_rtmp_record_rec_ctx_t *rctx)\n{\n    ngx_rtmp_record_app_conf_t *rracf;\n    ngx_err_t                   err;\n    void                      **app_conf;\n    ngx_int_t                   rc;\n    ngx_rtmp_record_done_t      v;\n    u_char                      av;\n\n    rracf = rctx->conf;\n\n    if (rctx->file.fd == NGX_INVALID_FILE) {\n        return NGX_AGAIN;\n    }\n\n    if (rctx->initialized) {\n        av = 0;\n\n        if (rctx->video) {\n            av |= 0x01;\n        }\n\n        if (rctx->audio) {\n            av |= 0x04;\n        }\n\n        if (ngx_write_file(&rctx->file, &av, 1, 4) == NGX_ERROR) {\n            ngx_log_error(NGX_LOG_CRIT, s->log, ngx_errno,\n                          \"record: %V error writing av mask\", &rracf->id);\n        }\n    }\n\n    if (ngx_close_file(rctx->file.fd) == NGX_FILE_ERROR) {\n        err = ngx_errno;\n        ngx_log_error(NGX_LOG_CRIT, s->log, err,\n                      \"record: %V error closing file\", &rracf->id);\n\n        ngx_rtmp_record_notify_error(s, rctx);\n    }\n\n    rctx->file.fd = NGX_INVALID_FILE;\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"record: %V closed\", &rracf->id);\n\n    if (rracf->notify) {\n        ngx_rtmp_send_status(s, \"NetStream.Record.Stop\", \"status\",\n                             rracf->id.data ? (char *) rracf->id.data : \"\");\n    }\n\n    app_conf = s->app_conf;\n\n    if (rracf->rec_conf) {\n        s->app_conf = rracf->rec_conf;\n    }\n\n    v.recorder = rracf->id;\n    ngx_rtmp_record_make_path(s, rctx, &v.path);\n\n    rc = ngx_rtmp_record_done(s, &v);\n\n    s->app_conf = app_conf;\n\n    return rc;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_record_close_stream(ngx_rtmp_session_t *s,\n                             ngx_rtmp_close_stream_t *v)\n{\n    if (s->interprocess) {\n        goto next;\n    }\n\n    ngx_log_debug0(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"record: close_stream\");\n\n    ngx_rtmp_record_stop(s);\n\nnext:\n    return next_close_stream(s, v);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_record_write_frame(ngx_rtmp_session_t *s,\n                            ngx_rtmp_record_rec_ctx_t *rctx,\n                            ngx_rtmp_header_t *h, ngx_chain_t *in,\n                            ngx_int_t inc_nframes)\n{\n    u_char                      hdr[11], *p, *ph;\n    uint32_t                    timestamp, tag_size;\n    ngx_rtmp_record_app_conf_t *rracf;\n\n    rracf = rctx->conf;\n\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"record: %V frame: mlen=%uD\",\n                   &rracf->id, h->mlen);\n\n    if (h->type == NGX_RTMP_MSG_VIDEO) {\n        rctx->video = 1;\n    } else {\n        rctx->audio = 1;\n    }\n\n    timestamp = h->timestamp - rctx->epoch;\n\n    if ((int32_t) timestamp < 0) {\n        ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                       \"record: %V cut timestamp=%D\", &rracf->id, timestamp);\n\n        timestamp = 0;\n    }\n\n    /* write tag header */\n    ph = hdr;\n\n    *ph++ = (u_char)h->type;\n\n    p = (u_char*)&h->mlen;\n    *ph++ = p[2];\n    *ph++ = p[1];\n    *ph++ = p[0];\n\n    p = (u_char*)&timestamp;\n    *ph++ = p[2];\n    *ph++ = p[1];\n    *ph++ = p[0];\n    *ph++ = p[3];\n\n    *ph++ = 0;\n    *ph++ = 0;\n    *ph++ = 0;\n\n    tag_size = (ph - hdr) + h->mlen;\n\n    if (ngx_write_file(&rctx->file, hdr, ph - hdr, rctx->file.offset)\n        == NGX_ERROR)\n    {\n        ngx_rtmp_record_notify_error(s, rctx);\n\n        ngx_close_file(rctx->file.fd);\n\n        return NGX_ERROR;\n    }\n\n    /* write tag body\n     * FIXME: NGINX\n     * ngx_write_chain seems to fit best\n     * but it suffers from uncontrollable\n     * allocations.\n     * we're left with plain writing */\n    for(; in; in = in->next) {\n        if (in->buf->pos == in->buf->last) {\n            continue;\n        }\n\n        if (ngx_write_file(&rctx->file, in->buf->pos, in->buf->last\n                           - in->buf->pos, rctx->file.offset)\n            == NGX_ERROR)\n        {\n            return NGX_ERROR;\n        }\n    }\n\n    /* write tag size */\n    ph = hdr;\n    p = (u_char*)&tag_size;\n\n    *ph++ = p[3];\n    *ph++ = p[2];\n    *ph++ = p[1];\n    *ph++ = p[0];\n\n    if (ngx_write_file(&rctx->file, hdr, ph - hdr,\n                       rctx->file.offset)\n        == NGX_ERROR)\n    {\n        return NGX_ERROR;\n    }\n\n    rctx->nframes += inc_nframes;\n\n    /* watch max size */\n    if ((rracf->max_size && rctx->file.offset >= (ngx_int_t) rracf->max_size) ||\n        (rracf->max_frames && rctx->nframes >= rracf->max_frames))\n    {\n        ngx_rtmp_record_node_close(s, rctx);\n    }\n\n    return NGX_OK;\n}\n\n\nstatic size_t\nngx_rtmp_record_get_chain_mlen(ngx_chain_t *in)\n{\n    size_t                          ret;\n\n    for (ret = 0; in; in = in->next) {\n        ret += (in->buf->last - in->buf->pos);\n    }\n\n    return ret;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_record_av(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n                   ngx_chain_t *in)\n{\n    ngx_rtmp_record_ctx_t          *ctx;\n    ngx_rtmp_record_rec_ctx_t      *rctx;\n    ngx_uint_t                      n;\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_record_module);\n\n    if (ctx == NULL || s->pause) {\n        return NGX_OK;\n    }\n\n    rctx = ctx->rec.elts;\n\n    for (n = 0; n < ctx->rec.nelts; ++n, ++rctx) {\n        ngx_rtmp_record_node_av(s, rctx, h, in);\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_record_node_av(ngx_rtmp_session_t *s, ngx_rtmp_record_rec_ctx_t *rctx,\n                        ngx_rtmp_header_t *h, ngx_chain_t *in)\n{\n    ngx_time_t                      next;\n    ngx_rtmp_header_t               ch;\n    ngx_rtmp_codec_ctx_t           *codec_ctx;\n    ngx_int_t                       keyframe, brkframe;\n    ngx_rtmp_record_app_conf_t     *rracf;\n\n    rracf = rctx->conf;\n\n    if (rracf->flags & NGX_RTMP_RECORD_OFF) {\n        ngx_rtmp_record_node_close(s, rctx);\n        return NGX_OK;\n    }\n\n    keyframe = (h->type == NGX_RTMP_MSG_VIDEO)\n             ? (ngx_rtmp_get_video_frame_type(in) == NGX_RTMP_VIDEO_KEY_FRAME)\n             : 0;\n\n    brkframe = (h->type == NGX_RTMP_MSG_VIDEO)\n             ? keyframe\n             : (rracf->flags & NGX_RTMP_RECORD_VIDEO) == 0;\n\n    if (brkframe && (rracf->flags & NGX_RTMP_RECORD_MANUAL) == 0) {\n\n        if (rracf->interval != (ngx_msec_t) NGX_CONF_UNSET) {\n\n            next = rctx->last;\n            next.msec += rracf->interval;\n            next.sec  += (next.msec / 1000);\n            next.msec %= 1000;\n\n            if (ngx_cached_time->sec  > next.sec ||\n               (ngx_cached_time->sec == next.sec &&\n                ngx_cached_time->msec > next.msec))\n            {\n                ngx_rtmp_record_node_close(s, rctx);\n                ngx_rtmp_record_node_open(s, rctx);\n            }\n\n        } else if (!rctx->failed) {\n            ngx_rtmp_record_node_open(s, rctx);\n        }\n    }\n\n    if ((rracf->flags & NGX_RTMP_RECORD_MANUAL) &&\n        !brkframe && rctx->nframes == 0)\n    {\n        return NGX_OK;\n    }\n\n    if (rctx->file.fd == NGX_INVALID_FILE) {\n        return NGX_OK;\n    }\n\n    if (h->type == NGX_RTMP_MSG_AUDIO &&\n       (rracf->flags & NGX_RTMP_RECORD_AUDIO) == 0)\n    {\n        return NGX_OK;\n    }\n\n    if (h->type == NGX_RTMP_MSG_VIDEO &&\n       (rracf->flags & NGX_RTMP_RECORD_VIDEO) == 0 &&\n       ((rracf->flags & NGX_RTMP_RECORD_KEYFRAMES) == 0 || !keyframe))\n    {\n        return NGX_OK;\n    }\n\n    if (!rctx->initialized) {\n\n        rctx->initialized = 1;\n        rctx->epoch = h->timestamp - rctx->time_shift;\n\n        if (rctx->file.offset == 0 &&\n            ngx_rtmp_record_write_header(&rctx->file) != NGX_OK)\n        {\n            ngx_rtmp_record_node_close(s, rctx);\n            return NGX_OK;\n        }\n    }\n\n    codec_ctx = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n    if (codec_ctx) {\n        ch = *h;\n\n        /* AAC header */\n        if (!rctx->aac_header_sent && codec_ctx->aac_header &&\n           (rracf->flags & NGX_RTMP_RECORD_AUDIO))\n        {\n            ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                           \"record: %V writing AAC header\", &rracf->id);\n\n            ch.type = NGX_RTMP_MSG_AUDIO;\n            ch.mlen =\n                ngx_rtmp_record_get_chain_mlen(codec_ctx->aac_header->chain);\n\n            if (ngx_rtmp_record_write_frame(s, rctx, &ch,\n                                            codec_ctx->aac_header->chain, 0)\n                != NGX_OK)\n            {\n                return NGX_OK;\n            }\n\n            rctx->aac_header_sent = 1;\n        }\n\n        /* AVC header */\n        if (!rctx->avc_header_sent && codec_ctx->avc_header &&\n           (rracf->flags & (NGX_RTMP_RECORD_VIDEO|\n                            NGX_RTMP_RECORD_KEYFRAMES)))\n        {\n            ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                           \"record: %V writing AVC header\", &rracf->id);\n\n            ch.type = NGX_RTMP_MSG_VIDEO;\n            ch.mlen =\n                ngx_rtmp_record_get_chain_mlen(codec_ctx->avc_header->chain);\n\n            if (ngx_rtmp_record_write_frame(s, rctx, &ch,\n                                            codec_ctx->avc_header->chain, 0)\n                != NGX_OK)\n            {\n                return NGX_OK;\n            }\n\n            rctx->avc_header_sent = 1;\n        }\n    }\n\n    if (h->type == NGX_RTMP_MSG_VIDEO) {\n        if (codec_ctx && codec_ctx->video_codec_id == NGX_RTMP_VIDEO_H264 &&\n            !rctx->avc_header_sent)\n        {\n            ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                           \"record: %V skipping until H264 header\", &rracf->id);\n            return NGX_OK;\n        }\n\n        if (ngx_rtmp_get_video_frame_type(in) == NGX_RTMP_VIDEO_KEY_FRAME &&\n            ((codec_ctx && codec_ctx->video_codec_id != NGX_RTMP_VIDEO_H264) ||\n             !ngx_rtmp_is_codec_header(in)))\n        {\n            rctx->video_key_sent = 1;\n        }\n\n        if (!rctx->video_key_sent) {\n            ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                           \"record: %V skipping until keyframe\", &rracf->id);\n            return NGX_OK;\n        }\n\n    } else {\n        if (codec_ctx && codec_ctx->audio_codec_id == NGX_RTMP_AUDIO_AAC &&\n            !rctx->aac_header_sent)\n        {\n            ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                           \"record: %V skipping until AAC header\", &rracf->id);\n            return NGX_OK;\n        }\n    }\n\n    return ngx_rtmp_record_write_frame(s, rctx, h, in, 1);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_record_done_init(ngx_rtmp_session_t *s, ngx_rtmp_record_done_t *v)\n{\n    return NGX_OK;\n}\n\n\nstatic char *\nngx_rtmp_record_recorder(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    char                       *rv;\n    ngx_int_t                   i;\n    ngx_str_t                  *value;\n    ngx_conf_t                  save;\n    ngx_module_t              **modules;\n    ngx_rtmp_module_t          *module;\n    ngx_rtmp_core_app_conf_t   *cacf, **pcacf, *rcacf;\n    ngx_rtmp_record_app_conf_t *racf, **pracf, *rracf;\n    ngx_rtmp_conf_ctx_t        *ctx, *pctx;\n\n    value = cf->args->elts;\n\n    cacf = ngx_rtmp_conf_get_module_app_conf(cf, ngx_rtmp_core_module);\n\n    racf = ngx_rtmp_conf_get_module_app_conf(cf, ngx_rtmp_record_module);\n\n    ctx = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_conf_ctx_t));\n    if (ctx == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    pctx = cf->ctx;\n\n    ctx->main_conf = pctx->main_conf;\n    ctx->srv_conf  = pctx->srv_conf;\n\n    ctx->app_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_rtmp_max_module);\n    if (ctx->app_conf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n#if (nginx_version >= 1009011)\n    modules = cf->cycle->modules;\n#else\n    modules = ngx_modules;\n#endif\n\n    for (i = 0; modules[i]; i++) {\n        if (modules[i]->type != NGX_RTMP_MODULE) {\n            continue;\n        }\n\n        module = modules[i]->ctx;\n\n        if (module->create_app_conf) {\n            ctx->app_conf[modules[i]->ctx_index] = module->create_app_conf(cf);\n            if (ctx->app_conf[modules[i]->ctx_index] == NULL) {\n                return NGX_CONF_ERROR;\n            }\n        }\n    }\n\n    /* add to sub-applications */\n    rcacf = ctx->app_conf[ngx_rtmp_core_module.ctx_index];\n    rcacf->app_conf = ctx->app_conf;\n    pcacf = ngx_array_push(&cacf->applications);\n    if (pcacf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n    *pcacf = rcacf;\n\n    /* add to recorders */\n    rracf = ctx->app_conf[ngx_rtmp_record_module.ctx_index];\n    rracf->rec_conf = ctx->app_conf;\n    pracf = ngx_array_push(&racf->rec);\n    if (pracf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n    *pracf = rracf;\n\n    rracf->id = value[1];\n\n\n    save = *cf;\n    cf->ctx = ctx;\n    cf->cmd_type = NGX_RTMP_REC_CONF;\n\n    rv = ngx_conf_parse(cf, NULL);\n    *cf= save;\n\n    return rv;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_record_postconfiguration(ngx_conf_t *cf)\n{\n    ngx_rtmp_core_main_conf_t          *cmcf;\n    ngx_rtmp_handler_pt                *h;\n\n    ngx_rtmp_record_done = ngx_rtmp_record_done_init;\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_AUDIO]);\n    *h = ngx_rtmp_record_av;\n\n    h = ngx_array_push(&cmcf->events[NGX_RTMP_MSG_VIDEO]);\n    *h = ngx_rtmp_record_av;\n\n    next_publish = ngx_rtmp_publish;\n    ngx_rtmp_publish = ngx_rtmp_record_publish;\n\n    next_close_stream = ngx_rtmp_close_stream;\n    ngx_rtmp_close_stream = ngx_rtmp_record_close_stream;\n\n    next_stream_begin = ngx_rtmp_stream_begin;\n    ngx_rtmp_stream_begin = ngx_rtmp_record_stream_begin;\n\n    next_stream_eof = ngx_rtmp_stream_eof;\n    ngx_rtmp_stream_eof = ngx_rtmp_record_stream_eof;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_record_module.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#ifndef _NGX_RTMP_RECORD_H_INCLUDED_\n#define _NGX_RTMP_RECORD_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n\n\n#define NGX_RTMP_RECORD_OFF             0x01\n#define NGX_RTMP_RECORD_AUDIO           0x02\n#define NGX_RTMP_RECORD_VIDEO           0x04\n#define NGX_RTMP_RECORD_KEYFRAMES       0x08\n#define NGX_RTMP_RECORD_MANUAL          0x10\n\n\ntypedef struct {\n    ngx_str_t                           id;\n    ngx_uint_t                          flags;\n    ngx_str_t                           path;\n    size_t                              max_size;\n    size_t                              max_frames;\n    ngx_msec_t                          interval;\n    ngx_str_t                           suffix;\n    ngx_flag_t                          unique;\n    ngx_flag_t                          append;\n    ngx_flag_t                          lock_file;\n    ngx_flag_t                          notify;\n    ngx_url_t                          *url;\n\n    void                              **rec_conf;\n    ngx_array_t                         rec; /* ngx_rtmp_record_app_conf_t * */\n} ngx_rtmp_record_app_conf_t;\n\n\ntypedef struct {\n    ngx_rtmp_record_app_conf_t         *conf;\n    ngx_file_t                          file;\n    ngx_uint_t                          nframes;\n    uint32_t                            epoch, time_shift;\n    ngx_time_t                          last;\n    time_t                              timestamp;\n    unsigned                            failed:1;\n    unsigned                            initialized:1;\n    unsigned                            aac_header_sent:1;\n    unsigned                            avc_header_sent:1;\n    unsigned                            video_key_sent:1;\n    unsigned                            audio:1;\n    unsigned                            video:1;\n} ngx_rtmp_record_rec_ctx_t;\n\n\ntypedef struct {\n    ngx_array_t                         rec; /* ngx_rtmp_record_rec_ctx_t */\n    u_char                              name[NGX_RTMP_MAX_NAME];\n    u_char                              args[NGX_RTMP_MAX_ARGS];\n} ngx_rtmp_record_ctx_t;\n\n\nngx_uint_t ngx_rtmp_record_find(ngx_rtmp_record_app_conf_t *racf,\n           ngx_str_t *id);\n\n\n/* Manual recording control,\n * 'n' is record node index in config array.\n * Note: these functions allocate path in static buffer */\n\nngx_int_t ngx_rtmp_record_open(ngx_rtmp_session_t *s, ngx_uint_t n,\n          ngx_str_t *path);\nngx_int_t ngx_rtmp_record_close(ngx_rtmp_session_t *s, ngx_uint_t n,\n          ngx_str_t *path);\n\n\ntypedef struct {\n    ngx_str_t                           recorder;\n    ngx_str_t                           path;\n} ngx_rtmp_record_done_t;\n\n\ntypedef ngx_int_t (*ngx_rtmp_record_done_pt)(ngx_rtmp_session_t *s,\n        ngx_rtmp_record_done_t *v);\n\n\nextern ngx_rtmp_record_done_pt          ngx_rtmp_record_done;\n\n\nextern ngx_module_t                     ngx_rtmp_record_module;\n\n\n#endif /* _NGX_RTMP_RECORD_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_send.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_amf.h\"\n#include \"ngx_rtmp_streams.h\"\n#include \"ngx_rbuf.h\"\n\n\n#define NGX_RTMP_USER_START(s, tp)                                          \\\n    ngx_chain_t                    *__l;                                    \\\n    ngx_buf_t                      *__b;                                    \\\n    ngx_rtmp_core_srv_conf_t       *__cscf;                                 \\\n    ngx_rtmp_frame_t               *__f;                                    \\\n                                                                            \\\n    __cscf = ngx_rtmp_get_module_srv_conf(                                  \\\n            s, ngx_rtmp_core_module);                                       \\\n                                                                            \\\n    __f = ngx_rtmp_shared_alloc_frame(__cscf->chunk_size, NULL, 1);         \\\n    __f->hdr.type = tp;                                                     \\\n    __f->hdr.csid = 2;                                                      \\\n    __l = __f->chain;                                                       \\\n    if (__l == NULL) {                                                      \\\n        return NULL;                                                        \\\n    }                                                                       \\\n    __b = __l->buf;\n\n#define NGX_RTMP_UCTL_START(s, type, utype)                                 \\\n    NGX_RTMP_USER_START(s, type);                                           \\\n    *(__b->last++) = (u_char)((utype) >> 8);                                \\\n    *(__b->last++) = (u_char)(utype);\n\n#define NGX_RTMP_USER_OUT1(v)                                               \\\n    *(__b->last++) = ((u_char*)&v)[0];\n\n#define NGX_RTMP_USER_OUT4(v)                                               \\\n    *(__b->last++) = ((u_char*)&v)[3];                                      \\\n    *(__b->last++) = ((u_char*)&v)[2];                                      \\\n    *(__b->last++) = ((u_char*)&v)[1];                                      \\\n    *(__b->last++) = ((u_char*)&v)[0];\n\n#define NGX_RTMP_USER_END(s)                                                \\\n    return __f;\n\n\nstatic ngx_int_t\nngx_rtmp_send_shared_packet(ngx_rtmp_session_t *s, ngx_rtmp_frame_t *frame)\n{\n    ngx_int_t                       rc;\n\n    if (frame == NULL) {\n        return NGX_ERROR;\n    }\n\n    rc = ngx_rtmp_send_message(s, frame, 0);\n\n    ngx_rtmp_shared_free_frame(frame);\n\n    return rc;\n}\n\n\n/* Protocol control messages */\n\nngx_rtmp_frame_t *\nngx_rtmp_create_chunk_size(ngx_rtmp_session_t *s, uint32_t chunk_size)\n{\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"chunk_size=%uD\", chunk_size);\n\n    {\n        NGX_RTMP_USER_START(s, NGX_RTMP_MSG_CHUNK_SIZE);\n\n        NGX_RTMP_USER_OUT4(chunk_size);\n\n        NGX_RTMP_USER_END(s);\n    }\n}\n\n\nngx_int_t\nngx_rtmp_send_chunk_size(ngx_rtmp_session_t *s, uint32_t chunk_size)\n{\n    return ngx_rtmp_send_shared_packet(s,\n           ngx_rtmp_create_chunk_size(s, chunk_size));\n}\n\n\nngx_rtmp_frame_t *\nngx_rtmp_create_abort(ngx_rtmp_session_t *s, uint32_t csid)\n{\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"create: abort csid=%uD\", csid);\n\n    {\n        NGX_RTMP_USER_START(s, NGX_RTMP_MSG_CHUNK_SIZE);\n\n        NGX_RTMP_USER_OUT4(csid);\n\n        NGX_RTMP_USER_END(s);\n    }\n}\n\n\nngx_int_t\nngx_rtmp_send_abort(ngx_rtmp_session_t *s, uint32_t csid)\n{\n    return ngx_rtmp_send_shared_packet(s,\n           ngx_rtmp_create_abort(s, csid));\n}\n\n\nngx_rtmp_frame_t *\nngx_rtmp_create_ack(ngx_rtmp_session_t *s, uint32_t seq)\n{\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"create: ack seq=%uD\", seq);\n\n    {\n        NGX_RTMP_USER_START(s, NGX_RTMP_MSG_ACK);\n\n        NGX_RTMP_USER_OUT4(seq);\n\n        NGX_RTMP_USER_END(s);\n    }\n}\n\n\nngx_int_t\nngx_rtmp_send_ack(ngx_rtmp_session_t *s, uint32_t seq)\n{\n    return ngx_rtmp_send_shared_packet(s,\n           ngx_rtmp_create_ack(s, seq));\n}\n\n\nngx_rtmp_frame_t *\nngx_rtmp_create_ack_size(ngx_rtmp_session_t *s, uint32_t ack_size)\n{\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"create: ack_size=%uD\", ack_size);\n\n    {\n        NGX_RTMP_USER_START(s, NGX_RTMP_MSG_ACK_SIZE);\n\n        NGX_RTMP_USER_OUT4(ack_size);\n\n        NGX_RTMP_USER_END(s);\n    }\n}\n\n\nngx_int_t\nngx_rtmp_send_ack_size(ngx_rtmp_session_t *s, uint32_t ack_size)\n{\n    return ngx_rtmp_send_shared_packet(s,\n           ngx_rtmp_create_ack_size(s, ack_size));\n}\n\n\nngx_rtmp_frame_t *\nngx_rtmp_create_bandwidth(ngx_rtmp_session_t *s, uint32_t ack_size,\n                          uint8_t limit_type)\n{\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"create: bandwidth ack_size=%uD limit=%d\",\n                   ack_size, (int)limit_type);\n\n    {\n        NGX_RTMP_USER_START(s, NGX_RTMP_MSG_BANDWIDTH);\n\n        NGX_RTMP_USER_OUT4(ack_size);\n        NGX_RTMP_USER_OUT1(limit_type);\n\n        NGX_RTMP_USER_END(s);\n    }\n}\n\n\nngx_int_t\nngx_rtmp_send_bandwidth(ngx_rtmp_session_t *s, uint32_t ack_size,\n                        uint8_t limit_type)\n{\n    return ngx_rtmp_send_shared_packet(s,\n           ngx_rtmp_create_bandwidth(s, ack_size, limit_type));\n}\n\n\n/* User control messages */\n\nngx_rtmp_frame_t *\nngx_rtmp_create_stream_begin(ngx_rtmp_session_t *s, uint32_t msid)\n{\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"create: stream_begin msid=%uD\", msid);\n\n    {\n        NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_STREAM_BEGIN);\n\n        NGX_RTMP_USER_OUT4(msid);\n\n        NGX_RTMP_USER_END(s);\n    }\n}\n\n\nngx_int_t\nngx_rtmp_send_stream_begin(ngx_rtmp_session_t *s, uint32_t msid)\n{\n    return ngx_rtmp_send_shared_packet(s,\n           ngx_rtmp_create_stream_begin(s, msid));\n}\n\n\nngx_rtmp_frame_t *\nngx_rtmp_create_stream_eof(ngx_rtmp_session_t *s, uint32_t msid)\n{\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"create: stream_end msid=%uD\", msid);\n\n    {\n        NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_STREAM_EOF);\n\n        NGX_RTMP_USER_OUT4(msid);\n\n        NGX_RTMP_USER_END(s);\n    }\n}\n\n\nngx_int_t\nngx_rtmp_send_stream_eof(ngx_rtmp_session_t *s, uint32_t msid)\n{\n    return ngx_rtmp_send_shared_packet(s,\n           ngx_rtmp_create_stream_eof(s, msid));\n}\n\n\nngx_rtmp_frame_t *\nngx_rtmp_create_stream_dry(ngx_rtmp_session_t *s, uint32_t msid)\n{\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"create: stream_dry msid=%uD\", msid);\n\n    {\n        NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_STREAM_DRY);\n\n        NGX_RTMP_USER_OUT4(msid);\n\n        NGX_RTMP_USER_END(s);\n    }\n}\n\n\nngx_int_t\nngx_rtmp_send_stream_dry(ngx_rtmp_session_t *s, uint32_t msid)\n{\n    return ngx_rtmp_send_shared_packet(s,\n           ngx_rtmp_create_stream_dry(s, msid));\n}\n\n\nngx_rtmp_frame_t *\nngx_rtmp_create_set_buflen(ngx_rtmp_session_t *s, uint32_t msid,\n                           uint32_t buflen_msec)\n{\n    ngx_log_debug2(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"create: set_buflen msid=%uD buflen=%uD\",\n                   msid, buflen_msec);\n\n    {\n        NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_SET_BUFLEN);\n\n        NGX_RTMP_USER_OUT4(msid);\n        NGX_RTMP_USER_OUT4(buflen_msec);\n\n        NGX_RTMP_USER_END(s);\n    }\n}\n\n\nngx_int_t\nngx_rtmp_send_set_buflen(ngx_rtmp_session_t *s, uint32_t msid,\n        uint32_t buflen_msec)\n{\n    return ngx_rtmp_send_shared_packet(s,\n           ngx_rtmp_create_set_buflen(s, msid, buflen_msec));\n}\n\n\nngx_rtmp_frame_t *\nngx_rtmp_create_recorded(ngx_rtmp_session_t *s, uint32_t msid)\n{\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"create: recorded msid=%uD\", msid);\n\n    {\n        NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_RECORDED);\n\n        NGX_RTMP_USER_OUT4(msid);\n\n        NGX_RTMP_USER_END(s);\n    }\n}\n\n\nngx_int_t\nngx_rtmp_send_recorded(ngx_rtmp_session_t *s, uint32_t msid)\n{\n    return ngx_rtmp_send_shared_packet(s,\n           ngx_rtmp_create_recorded(s, msid));\n}\n\n\nngx_rtmp_frame_t *\nngx_rtmp_create_ping_request(ngx_rtmp_session_t *s, uint32_t timestamp)\n{\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"create: ping_request timestamp=%uD\", timestamp);\n\n    {\n        NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_PING_REQUEST);\n\n        NGX_RTMP_USER_OUT4(timestamp);\n\n        NGX_RTMP_USER_END(s);\n    }\n}\n\n\nngx_int_t\nngx_rtmp_send_ping_request(ngx_rtmp_session_t *s, uint32_t timestamp)\n{\n    return ngx_rtmp_send_shared_packet(s,\n           ngx_rtmp_create_ping_request(s, timestamp));\n}\n\n\nngx_rtmp_frame_t *\nngx_rtmp_create_ping_response(ngx_rtmp_session_t *s, uint32_t timestamp)\n{\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"create: ping_response timestamp=%uD\", timestamp);\n\n    {\n        NGX_RTMP_UCTL_START(s, NGX_RTMP_MSG_USER, NGX_RTMP_USER_PING_RESPONSE);\n\n        NGX_RTMP_USER_OUT4(timestamp);\n\n        NGX_RTMP_USER_END(s);\n    }\n}\n\n\nngx_int_t\nngx_rtmp_send_ping_response(ngx_rtmp_session_t *s, uint32_t timestamp)\n{\n    return ngx_rtmp_send_shared_packet(s,\n           ngx_rtmp_create_ping_response(s, timestamp));\n}\n\n\nstatic ngx_chain_t *\nngx_rtmp_alloc_amf_buf(void *arg)\n{\n    return ngx_get_chainbuf(((ngx_rtmp_core_srv_conf_t *)arg)->chunk_size, 1);\n}\n\n\n/* AMF sender */\n\n/* NOTE: this function does not free shared bufs on error */\nngx_int_t\nngx_rtmp_append_amf(ngx_rtmp_session_t *s,\n                    ngx_chain_t **first, ngx_chain_t **last,\n                    ngx_rtmp_amf_elt_t *elts, size_t nelts)\n{\n    ngx_rtmp_amf_ctx_t          act;\n    ngx_rtmp_core_srv_conf_t   *cscf;\n    ngx_int_t                   rc;\n\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n\n    memset(&act, 0, sizeof(act));\n    act.arg = cscf;\n    act.alloc = ngx_rtmp_alloc_amf_buf;\n    act.log = s->log;\n\n    if (first) {\n        act.first = *first;\n    }\n\n    if (last) {\n        act.link = *last;\n    }\n\n    rc = ngx_rtmp_amf_write(&act, elts, nelts);\n\n    if (first) {\n        *first = act.first;\n    }\n\n    if (last) {\n        *last = act.link;\n    }\n\n    return rc;\n}\n\n\nngx_rtmp_frame_t *\nngx_rtmp_create_amf(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n                    ngx_rtmp_amf_elt_t *elts, size_t nelts)\n{\n    ngx_int_t                   rc;\n    ngx_rtmp_core_srv_conf_t   *cscf;\n    ngx_rtmp_frame_t           *frame;\n\n    ngx_log_debug1(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"create: amf nelts=%ui\", nelts);\n\n    cscf = ngx_rtmp_get_module_srv_conf(s, ngx_rtmp_core_module);\n\n    frame = ngx_rtmp_shared_alloc_frame(cscf->chunk_size, NULL, 1);\n    frame->hdr = *h;\n\n    rc = ngx_rtmp_append_amf(s, &frame->chain, &frame->chain, elts, nelts);\n\n    if (rc != NGX_OK) {\n        ngx_rtmp_shared_free_frame(frame);\n        return NULL;\n    }\n\n    return frame;\n}\n\n\nngx_int_t\nngx_rtmp_send_amf(ngx_rtmp_session_t *s, ngx_rtmp_header_t *h,\n                  ngx_rtmp_amf_elt_t *elts, size_t nelts)\n{\n    return ngx_rtmp_send_shared_packet(s,\n           ngx_rtmp_create_amf(s, h, elts, nelts));\n}\n\n\nngx_rtmp_frame_t *\nngx_rtmp_create_error(ngx_rtmp_session_t *s, char *code, char* level,\n                      char *desc)\n{\n    ngx_rtmp_header_t               h;\n    static double                   trans;\n\n    static ngx_rtmp_amf_elt_t       out_inf[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"level\"),\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"code\"),\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"description\"),\n          NULL, 0 },\n    };\n\n    static ngx_rtmp_amf_elt_t       out_elts[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          \"_error\", 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &trans, 0 },\n\n        { NGX_RTMP_AMF_NULL,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_OBJECT,\n          ngx_null_string,\n          out_inf,\n          sizeof(out_inf) },\n    };\n\n    ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"create: error code='%s' level='%s' desc='%s'\",\n                   code, level, desc);\n\n    out_inf[0].data = level;\n    out_inf[1].data = code;\n    out_inf[2].data = desc;\n\n    memset(&h, 0, sizeof(h));\n\n    h.type = NGX_RTMP_MSG_AMF_CMD;\n    h.csid = NGX_RTMP_CSID_AMF;\n    h.msid = NGX_RTMP_MSID;\n\n    return ngx_rtmp_create_amf(s, &h, out_elts,\n                               sizeof(out_elts) / sizeof(out_elts[0]));\n}\n\n\nngx_int_t\nngx_rtmp_send_error(ngx_rtmp_session_t *s, char *code, char* level, char *desc)\n{\n    return ngx_rtmp_send_shared_packet(s,\n           ngx_rtmp_create_error(s, code, level, desc));\n}\n\n\nngx_rtmp_frame_t *\nngx_rtmp_create_status(ngx_rtmp_session_t *s, char *code, char* level,\n                       char *desc)\n{\n    ngx_rtmp_header_t               h;\n    static double                   trans;\n\n    static ngx_rtmp_amf_elt_t       out_inf[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"level\"),\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"code\"),\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"description\"),\n          NULL, 0 },\n    };\n\n    static ngx_rtmp_amf_elt_t       out_elts[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          \"onStatus\", 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_null_string,\n          &trans, 0 },\n\n        { NGX_RTMP_AMF_NULL,\n          ngx_null_string,\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_OBJECT,\n          ngx_null_string,\n          out_inf,\n          sizeof(out_inf) },\n    };\n\n    ngx_log_debug3(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"create: status code='%s' level='%s' desc='%s'\",\n                   code, level, desc);\n\n    out_inf[0].data = level;\n    out_inf[1].data = code;\n    out_inf[2].data = desc;\n\n    memset(&h, 0, sizeof(h));\n\n    h.type = NGX_RTMP_MSG_AMF_CMD;\n    h.csid = NGX_RTMP_CSID_AMF;\n    h.msid = NGX_RTMP_MSID;\n\n    return ngx_rtmp_create_amf(s, &h, out_elts,\n                               sizeof(out_elts) / sizeof(out_elts[0]));\n}\n\n\nngx_int_t\nngx_rtmp_send_status(ngx_rtmp_session_t *s, char *code, char* level, char *desc)\n{\n    return ngx_rtmp_send_shared_packet(s,\n           ngx_rtmp_create_status(s, code, level, desc));\n}\n\n\nngx_rtmp_frame_t *\nngx_rtmp_create_play_status(ngx_rtmp_session_t *s, char *code, char* level,\n                            ngx_uint_t duration, ngx_uint_t bytes)\n{\n    ngx_rtmp_header_t               h;\n    static double                   dduration;\n    static double                   dbytes;\n\n    static ngx_rtmp_amf_elt_t       out_inf[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"code\"),\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_string(\"level\"),\n          NULL, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"duration\"),\n          &dduration, 0 },\n\n        { NGX_RTMP_AMF_NUMBER,\n          ngx_string(\"bytes\"),\n          &dbytes, 0 },\n    };\n\n    static ngx_rtmp_amf_elt_t       out_elts[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          \"onPlayStatus\", 0 },\n\n        { NGX_RTMP_AMF_OBJECT,\n          ngx_null_string,\n          out_inf,\n          sizeof(out_inf) },\n    };\n\n    ngx_log_debug4(NGX_LOG_DEBUG_RTMP, s->log, 0,\n                   \"create: play_status code='%s' level='%s' \"\n                   \"duration=%ui bytes=%ui\",\n                   code, level, duration, bytes);\n\n    out_inf[0].data = code;\n    out_inf[1].data = level;\n\n    dduration = duration;\n    dbytes = bytes;\n\n    memset(&h, 0, sizeof(h));\n\n    h.type = NGX_RTMP_MSG_AMF_META;\n    h.csid = NGX_RTMP_CSID_AMF;\n    h.msid = NGX_RTMP_MSID;\n    h.timestamp = duration;\n\n    return ngx_rtmp_create_amf(s, &h, out_elts,\n                               sizeof(out_elts) / sizeof(out_elts[0]));\n}\n\n\nngx_int_t\nngx_rtmp_send_play_status(ngx_rtmp_session_t *s, char *code, char* level,\n                          ngx_uint_t duration, ngx_uint_t bytes)\n{\n    return ngx_rtmp_send_shared_packet(s,\n           ngx_rtmp_create_play_status(s, code, level, duration, bytes));\n}\n\n\nngx_rtmp_frame_t *\nngx_rtmp_create_sample_access(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_header_t               h;\n\n    static int                      access = 1;\n\n    static ngx_rtmp_amf_elt_t       access_elts[] = {\n\n        { NGX_RTMP_AMF_STRING,\n          ngx_null_string,\n          \"|RtmpSampleAccess\", 0 },\n\n        { NGX_RTMP_AMF_BOOLEAN,\n          ngx_null_string,\n          &access, 0 },\n\n        { NGX_RTMP_AMF_BOOLEAN,\n          ngx_null_string,\n          &access, 0 },\n    };\n\n    memset(&h, 0, sizeof(h));\n\n    h.type = NGX_RTMP_MSG_AMF_META;\n    h.csid = NGX_RTMP_CSID_AMF;\n    h.msid = NGX_RTMP_MSID;\n\n    return ngx_rtmp_create_amf(s, &h, access_elts,\n                               sizeof(access_elts) / sizeof(access_elts[0]));\n}\n\n\nngx_int_t\nngx_rtmp_send_sample_access(ngx_rtmp_session_t *s)\n{\n    return ngx_rtmp_send_shared_packet(s,\n           ngx_rtmp_create_sample_access(s));\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_shared_module.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rbuf.h\"\n\n\nstatic void *ngx_rtmp_shared_create_conf(ngx_cycle_t *cycle);\nstatic char *ngx_rtmp_shared_init_conf(ngx_cycle_t *cycle, void *conf);\n\n\n/* 1316 == 188 * 7 RTP pack 7 MPEG-TS packets as a RTP package */\n#define NGX_MPEGTS_BUF_SIZE   1316\n\ntypedef struct {\n    ngx_rtmp_frame_t           *free_frame;\n    ngx_mpegts_frame_t         *free_mpegts_frame;\n    ngx_pool_t                 *pool;\n\n    ngx_uint_t                  nalloc_frame;\n    ngx_uint_t                  nfree_frame;\n} ngx_rtmp_shared_conf_t;\n\n\nstatic ngx_command_t  ngx_rtmp_shared_commands[] = {\n\n      ngx_null_command\n};\n\n\nstatic ngx_core_module_t  ngx_rtmp_shared_module_ctx = {\n    ngx_string(\"rtmp_shared\"),\n    ngx_rtmp_shared_create_conf,            /* create conf */\n    ngx_rtmp_shared_init_conf               /* init conf */\n};\n\n\nngx_module_t  ngx_rtmp_shared_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_shared_module_ctx,            /* module context */\n    ngx_rtmp_shared_commands,               /* module directives */\n    NGX_CORE_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_rtmp_shared_create_conf(ngx_cycle_t *cycle)\n{\n    ngx_rtmp_shared_conf_t     *rscf;\n\n    rscf = ngx_pcalloc(cycle->pool, sizeof(ngx_rtmp_shared_conf_t));\n    if (rscf == NULL) {\n        return NULL;\n    }\n\n    return rscf;\n}\n\n\nstatic char *\nngx_rtmp_shared_init_conf(ngx_cycle_t *cycle, void *conf)\n{\n    ngx_rtmp_shared_conf_t     *rscf = conf;\n\n    rscf->pool = ngx_create_pool(4096, cycle->log);\n    if (rscf->pool == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nngx_int_t\nngx_rtmp_prepare_merge_frame(ngx_rtmp_session_t *s)\n{\n    ngx_rtmp_core_app_conf_t   *cacf;\n    ngx_chain_t                *ll, **ln;\n    ngx_uint_t                  n;\n\n    // merge frame not send completely\n    if (s->out_chain) {\n        return NGX_OK;\n    }\n\n    cacf = ngx_rtmp_get_module_app_conf(s, ngx_rtmp_core_module);\n\n    ngx_rtmp_free_merge_frame(s);\n\n    ln = &s->out_chain;\n\n    for (n = 0; n < cacf->merge_frame && s->out_pos != s->out_last; ++n) {\n        // save frame chain with rtmp chunk or flv tag\n        s->merge[n] = s->prepare_handler(s);\n\n        if (s->out_pos == s->out_last) {\n            break;\n        }\n\n        // normal link to chain all merge frames\n        for (ll = s->merge[n]; ll; ll = ll->next, ln = &(*ln)->next) {\n            *ln = ngx_alloc_chain_link(s->pool);\n            if (*ln == NULL) {\n                s->nframe = n;\n                return NGX_ERROR;\n            }\n            (*ln)->next = NULL;\n\n            (*ln)->buf = ll->buf;\n        }\n\n        // save frame prepare to send\n        if (s->live_type == NGX_MPEGTS_LIVE) {\n            s->prepare_mpegts_frame[n] = s->mpegts_out[s->out_pos];\n        } else {\n            s->prepare_frame[n] = s->out[s->out_pos];\n        }\n\n        ++s->out_pos;\n        s->out_pos %= s->out_queue;\n    }\n\n    s->nframe = n;\n\n    return NGX_OK;\n}\n\nvoid\nngx_rtmp_free_merge_frame(ngx_rtmp_session_t *s)\n{\n    ngx_uint_t                  n;\n\n    if (s->live_type == NGX_MPEGTS_LIVE) {\n        for (n = 0; n < s->nframe; ++n) {\n            ngx_put_chainbufs(s->merge[n]);\n            s->merge[n] = NULL;\n\n            ngx_rtmp_shared_free_mpegts_frame(s->prepare_mpegts_frame[n]);\n            s->prepare_mpegts_frame[n] = NULL;\n        }\n    } else {\n        for (n = 0; n < s->nframe; ++n) {\n            ngx_put_chainbufs(s->merge[n]);\n            s->merge[n] = NULL;\n\n            ngx_rtmp_shared_free_frame(s->prepare_frame[n]);\n            s->prepare_frame[n] = NULL;\n        }\n    }\n\n    s->nframe = 0;\n}\n\nvoid\nngx_rtmp_shared_append_chain(ngx_rtmp_frame_t *frame, size_t size,\n        ngx_chain_t *cl, ngx_flag_t mandatory)\n{\n    ngx_chain_t               **ll;\n    u_char                     *p;\n    size_t                      len;\n\n    for (ll = &frame->chain; (*ll) && (*ll)->next; ll = &(*ll)->next);\n\n    if (cl == NULL) {\n        if (mandatory) {\n            *ll = ngx_get_chainbuf(size, 1);\n        }\n        return;\n    }\n\n    p = cl->buf->pos;\n\n    for (;;) {\n        if ((*ll) && (*ll)->buf->last == (*ll)->buf->end) {\n            ll = &(*ll)->next;\n        }\n\n        if (*ll == NULL) {\n            *ll = ngx_get_chainbuf(size, 1);\n        }\n\n        while ((*ll)->buf->end - (*ll)->buf->last >= cl->buf->last - p) {\n            len = cl->buf->last - p;\n            (*ll)->buf->last = ngx_cpymem((*ll)->buf->last, p, len);\n            cl = cl->next;\n            if (cl == NULL) {\n                return;\n            }\n            p = cl->buf->pos;\n        }\n\n        len = (*ll)->buf->end - (*ll)->buf->last;\n        (*ll)->buf->last = ngx_cpymem((*ll)->buf->last, p, len);\n        p += len;\n    }\n}\n\nngx_rtmp_frame_t *\nngx_rtmp_shared_alloc_frame(size_t size, ngx_chain_t *cl, ngx_flag_t mandatory)\n{\n    ngx_rtmp_shared_conf_t     *rscf;\n    ngx_rtmp_frame_t           *frame;\n\n    rscf = (ngx_rtmp_shared_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                                   ngx_rtmp_shared_module);\n\n    frame = rscf->free_frame;\n    if (frame) {\n        rscf->free_frame = frame->next;\n        frame->chain = NULL;\n        --rscf->nfree_frame;\n    } else {\n        frame = ngx_pcalloc(rscf->pool, sizeof(ngx_rtmp_frame_t));\n        if (frame == NULL) {\n            return NULL;\n        }\n        ++rscf->nalloc_frame;\n    }\n\n    frame->ref = 1;\n    frame->next = NULL;\n\n    ngx_rtmp_shared_append_chain(frame, size, cl, mandatory);\n\n    return frame;\n}\n\nvoid\nngx_rtmp_shared_free_frame(ngx_rtmp_frame_t *frame)\n{\n    ngx_rtmp_shared_conf_t     *rscf;\n    ngx_chain_t                *cl;\n\n    rscf = (ngx_rtmp_shared_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                                   ngx_rtmp_shared_module);\n\n    if (frame == NULL || --frame->ref) {\n        return;\n    }\n\n    /* recycle chainbuf */\n    cl = frame->chain;\n    while (cl) {\n        frame->chain = cl->next;\n        ngx_put_chainbuf(cl);\n        cl = frame->chain;\n    }\n\n    /* recycle frame */\n    frame->next = rscf->free_frame;\n    rscf->free_frame = frame;\n    ++rscf->nfree_frame;\n}\n\nvoid\nngx_mpegts_shared_append_chain(ngx_mpegts_frame_t *frame, ngx_chain_t *cl,\n        ngx_flag_t mandatory)\n{\n    ngx_chain_t               **ll;\n    u_char                     *p;\n    size_t                      len;\n\n    for (ll = &frame->chain; (*ll) && (*ll)->next; ll = &(*ll)->next);\n\n    if (cl == NULL) {\n        if (mandatory) {\n            *ll = ngx_get_chainbuf(NGX_MPEGTS_BUF_SIZE, 1);\n        }\n        return;\n    }\n\n    p = cl->buf->pos;\n\n    for (;;) {\n        if ((*ll) && (*ll)->buf->last == (*ll)->buf->end) {\n            ll = &(*ll)->next;\n        }\n\n        if (*ll == NULL) {\n            *ll = ngx_get_chainbuf(NGX_MPEGTS_BUF_SIZE, 1);\n        }\n\n        while ((*ll)->buf->end - (*ll)->buf->last >= cl->buf->last - p) {\n            len = cl->buf->last - p;\n            (*ll)->buf->last = ngx_cpymem((*ll)->buf->last, p, len);\n            cl = cl->next;\n            if (cl == NULL) {\n                return;\n            }\n            p = cl->buf->pos;\n        }\n\n        len = (*ll)->buf->end - (*ll)->buf->last;\n        (*ll)->buf->last = ngx_cpymem((*ll)->buf->last, p, len);\n        p += len;\n    }\n}\n\nngx_mpegts_frame_t *\nngx_rtmp_shared_alloc_mpegts_frame(ngx_chain_t *cl, ngx_flag_t mandatory)\n{\n    ngx_rtmp_shared_conf_t     *rscf;\n    ngx_mpegts_frame_t         *frame;\n\n    rscf = (ngx_rtmp_shared_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                                   ngx_rtmp_shared_module);\n\n    frame = rscf->free_mpegts_frame;\n    if (frame) {\n        rscf->free_mpegts_frame = frame->next;\n        --rscf->nfree_frame;\n    } else {\n        frame = ngx_pcalloc(rscf->pool, sizeof(ngx_mpegts_frame_t));\n        if (frame == NULL) {\n            return NULL;\n        }\n        ++rscf->nalloc_frame;\n    }\n\n    ngx_memset(frame, 0, sizeof(ngx_mpegts_frame_t));\n    frame->ref = 1;\n    frame->next = NULL;\n\n    ngx_mpegts_shared_append_chain(frame, cl, mandatory);\n\n    return frame;\n}\n\nvoid\nngx_rtmp_shared_free_mpegts_frame(ngx_mpegts_frame_t *frame)\n{\n    ngx_rtmp_shared_conf_t     *rscf;\n    ngx_chain_t                *cl;\n\n    rscf = (ngx_rtmp_shared_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                                   ngx_rtmp_shared_module);\n\n    if (frame == NULL || --frame->ref) {\n        return;\n    }\n\n    /* recycle chainbuf */\n    cl = frame->chain;\n    while (cl) {\n        frame->chain = cl->next;\n        ngx_put_chainbuf(cl);\n        cl = frame->chain;\n    }\n\n    /* recycle frame */\n    frame->next = rscf->free_mpegts_frame;\n    rscf->free_mpegts_frame = frame;\n    ++rscf->nfree_frame;\n}\n\nngx_chain_t *\nngx_rtmp_shared_state(ngx_http_request_t *r)\n{\n\tngx_rtmp_shared_conf_t     *rscf;\n    ngx_chain_t                *cl;\n    ngx_buf_t                  *b;\n    size_t                      len;\n\n    rscf = (ngx_rtmp_shared_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                                   ngx_rtmp_shared_module);\n\n    len = sizeof(\"##########rtmp shared state##########\\n\") - 1\n        + sizeof(\"ngx_rtmp_shared alloc frame: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_rtmp_shared free frame: \\n\") - 1 + NGX_OFF_T_LEN;\n\n    cl = ngx_alloc_chain_link(r->pool);\n    if (cl == NULL) {\n        return NULL;\n    }\n    cl->next = NULL;\n\n    b = ngx_create_temp_buf(r->pool, len);\n    if (b == NULL) {\n        return NULL;\n    }\n    cl->buf = b;\n\n    b->last = ngx_snprintf(b->last, len,\n            \"##########rtmp shared state##########\\n\"\n            \"ngx_rtmp_shared alloc frame: %ui\\n\"\n            \"ngx_rtmp_shared free frame: %ui\\n\",\n            rscf->nalloc_frame, rscf->nfree_frame);\n\n    return cl;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_stat_module.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include <nginx.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_live.h\"\n#include \"ngx_rtmp_version.h\"\n#include \"ngx_rtmp_live_module.h\"\n#include \"ngx_rtmp_codec_module.h\"\n\n\nstatic ngx_int_t ngx_rtmp_stat_init_process(ngx_cycle_t *cycle);\nstatic char *ngx_rtmp_stat(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\nstatic ngx_int_t ngx_rtmp_stat_postconfiguration(ngx_conf_t *cf);\nstatic void * ngx_rtmp_stat_create_loc_conf(ngx_conf_t *cf);\nstatic char * ngx_rtmp_stat_merge_loc_conf(ngx_conf_t *cf,\n        void *parent, void *child);\n\n\nstatic time_t                       start_time;\n\n\n#define NGX_RTMP_STAT_ALL           0xff\n#define NGX_RTMP_STAT_GLOBAL        0x01\n#define NGX_RTMP_STAT_LIVE          0x02\n#define NGX_RTMP_STAT_CLIENTS       0x04\n#define NGX_RTMP_STAT_PLAY          0x08\n\n/*\n * global: stat-{bufs-{total,free,used}, total bytes in/out, bw in/out} - cscf\n*/\n\n\ntypedef struct {\n    ngx_uint_t                      stat;\n    ngx_str_t                       stylesheet;\n} ngx_rtmp_stat_loc_conf_t;\n\n\nstatic ngx_conf_bitmask_t           ngx_rtmp_stat_masks[] = {\n    { ngx_string(\"all\"),            NGX_RTMP_STAT_ALL           },\n    { ngx_string(\"global\"),         NGX_RTMP_STAT_GLOBAL        },\n    { ngx_string(\"live\"),           NGX_RTMP_STAT_LIVE          },\n    { ngx_string(\"clients\"),        NGX_RTMP_STAT_CLIENTS       },\n    { ngx_null_string,              0 }\n};\n\n\nstatic ngx_command_t  ngx_rtmp_stat_commands[] = {\n\n    { ngx_string(\"rtmp_stat\"),\n        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,\n        ngx_rtmp_stat,\n        NGX_HTTP_LOC_CONF_OFFSET,\n        offsetof(ngx_rtmp_stat_loc_conf_t, stat),\n        ngx_rtmp_stat_masks },\n\n    { ngx_string(\"rtmp_stat_stylesheet\"),\n        NGX_HTTP_MAIN_CONF|NGX_HTTP_SRV_CONF|NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,\n        ngx_conf_set_str_slot,\n        NGX_HTTP_LOC_CONF_OFFSET,\n        offsetof(ngx_rtmp_stat_loc_conf_t, stylesheet),\n        NULL },\n\n    ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_rtmp_stat_module_ctx = {\n    NULL,                               /* preconfiguration */\n    ngx_rtmp_stat_postconfiguration,    /* postconfiguration */\n\n    NULL,                               /* create main configuration */\n    NULL,                               /* init main configuration */\n\n    NULL,                               /* create server configuration */\n    NULL,                               /* merge server configuration */\n\n    ngx_rtmp_stat_create_loc_conf,      /* create location configuration */\n    ngx_rtmp_stat_merge_loc_conf,       /* merge location configuration */\n};\n\n\nngx_module_t  ngx_rtmp_stat_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_stat_module_ctx,          /* module context */\n    ngx_rtmp_stat_commands,             /* module directives */\n    NGX_HTTP_MODULE,                    /* module type */\n    NULL,                               /* init master */\n    NULL,                               /* init module */\n    ngx_rtmp_stat_init_process,         /* init process */\n    NULL,                               /* init thread */\n    NULL,                               /* exit thread */\n    NULL,                               /* exit process */\n    NULL,                               /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\n#define NGX_RTMP_STAT_BUFSIZE           256\n\n\nstatic ngx_int_t\nngx_rtmp_stat_init_process(ngx_cycle_t *cycle)\n{\n    /*\n     * HTTP process initializer is called\n     * after event module initializer\n     * so we can run posted events here\n     */\n\n    ngx_event_process_posted(cycle, &ngx_rtmp_init_queue);\n\n    return NGX_OK;\n}\n\n\n/* ngx_escape_html does not escape characters out of ASCII range\n * which are bad for xslt */\n\nstatic void *\nngx_rtmp_stat_escape(ngx_http_request_t *r, void *data, size_t len)\n{\n    u_char *p, *np;\n    void   *new_data;\n    size_t  n;\n\n    p = data;\n\n    for (n = 0; n < len; ++n, ++p) {\n        if (*p < 0x20 || *p >= 0x7f) {\n            break;\n        }\n    }\n\n    if (n == len) {\n        return data;\n    }\n\n    new_data = ngx_palloc(r->pool, len);\n    if (new_data == NULL) {\n        return NULL;\n    }\n\n    p  = data;\n    np = new_data;\n\n    for (n = 0; n < len; ++n, ++p, ++np) {\n        *np = (*p < 0x20 || *p >= 0x7f) ? (u_char) ' ' : *p;\n    }\n\n    return new_data;\n}\n\n#if (NGX_WIN32)\n/*\n * Fix broken MSVC memcpy optimization for 4-byte data\n * when this function is inlined\n */\n__declspec(noinline)\n#endif\n\nstatic void\nngx_rtmp_stat_output(ngx_http_request_t *r, ngx_chain_t ***lll,\n        void *data, size_t len, ngx_uint_t escape)\n{\n    ngx_chain_t        *cl;\n    ngx_buf_t          *b;\n    size_t              real_len;\n\n    if (len == 0) {\n        return;\n    }\n\n    if (escape) {\n        data = ngx_rtmp_stat_escape(r, data, len);\n        if (data == NULL) {\n            return;\n        }\n    }\n\n    real_len = escape\n        ? len + ngx_escape_html(NULL, data, len)\n        : len;\n\n    cl = **lll;\n    if (cl && cl->buf->last + real_len > cl->buf->end) {\n        *lll = &cl->next;\n    }\n\n    if (**lll == NULL) {\n        cl = ngx_alloc_chain_link(r->pool);\n        if (cl == NULL) {\n            return;\n        }\n        b = ngx_create_temp_buf(r->pool,\n                ngx_max(NGX_RTMP_STAT_BUFSIZE, real_len));\n        if (b == NULL || b->pos == NULL) {\n            return;\n        }\n        cl->next = NULL;\n        cl->buf = b;\n        **lll = cl;\n    }\n\n    b = (**lll)->buf;\n\n    if (escape) {\n        b->last = (u_char *)ngx_escape_html(b->last, data, len);\n    } else {\n        b->last = ngx_cpymem(b->last, data, len);\n    }\n}\n\n\n/* These shortcuts assume 2 variables exist in current context:\n *   ngx_http_request_t    *r\n *   ngx_chain_t         ***lll */\n\n/* plain data */\n#define NGX_RTMP_STAT(data, len)    ngx_rtmp_stat_output(r, lll, data, len, 0)\n\n/* escaped data */\n#define NGX_RTMP_STAT_E(data, len)  ngx_rtmp_stat_output(r, lll, data, len, 1)\n\n/* literal */\n#define NGX_RTMP_STAT_L(s)          NGX_RTMP_STAT((s), sizeof(s) - 1)\n\n/* ngx_str_t */\n#define NGX_RTMP_STAT_S(s)          NGX_RTMP_STAT((s)->data, (s)->len)\n\n/* escaped ngx_str_t */\n#define NGX_RTMP_STAT_ES(s)         NGX_RTMP_STAT_E((s)->data, (s)->len)\n\n/* C string */\n#define NGX_RTMP_STAT_CS(s)         NGX_RTMP_STAT((s), ngx_strlen(s))\n\n/* escaped C string */\n#define NGX_RTMP_STAT_ECS(s)        NGX_RTMP_STAT_E((s), ngx_strlen(s))\n\n\n#define NGX_RTMP_STAT_BW            0x01\n#define NGX_RTMP_STAT_BYTES         0x02\n#define NGX_RTMP_STAT_BW_BYTES      0x03\n\n\nstatic void\nngx_rtmp_stat_bw(ngx_http_request_t *r, ngx_chain_t ***lll,\n                 ngx_rtmp_bandwidth_t *bw, char *name,\n                 ngx_uint_t flags)\n{\n    u_char  buf[NGX_INT64_LEN + 9];\n\n    ngx_rtmp_update_bandwidth(bw, 0);\n\n    if (flags & NGX_RTMP_STAT_BW) {\n        NGX_RTMP_STAT_L(\"<bw_\");\n        NGX_RTMP_STAT_CS(name);\n        NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), \">%uL</bw_\",\n                                        bw->bandwidth * 8)\n                           - buf);\n        NGX_RTMP_STAT_CS(name);\n        NGX_RTMP_STAT_L(\">\\r\\n\");\n    }\n\n    if (flags & NGX_RTMP_STAT_BYTES) {\n        NGX_RTMP_STAT_L(\"<bytes_\");\n        NGX_RTMP_STAT_CS(name);\n        NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), \">%uL</bytes_\",\n                                        bw->bytes)\n                           - buf);\n        NGX_RTMP_STAT_CS(name);\n        NGX_RTMP_STAT_L(\">\\r\\n\");\n    }\n}\n\n\n#ifdef NGX_RTMP_POOL_DEBUG\nstatic void\nngx_rtmp_stat_get_pool_size(ngx_pool_t *pool, ngx_uint_t *nlarge,\n        ngx_uint_t *size)\n{\n    ngx_pool_large_t       *l;\n    ngx_pool_t             *p, *n;\n\n    *nlarge = 0;\n    for (l = pool->large; l; l = l->next) {\n        ++*nlarge;\n    }\n\n    *size = 0;\n    for (p = pool, n = pool->d.next; /* void */; p = n, n = n->d.next) {\n        *size += (p->d.last - (u_char *)p);\n        if (n == NULL) {\n            break;\n        }\n    }\n}\n\n\nstatic void\nngx_rtmp_stat_dump_pool(ngx_http_request_t *r, ngx_chain_t ***lll,\n        ngx_pool_t *pool)\n{\n    ngx_uint_t  nlarge, size;\n    u_char      buf[NGX_INT_T_LEN];\n\n    size = 0;\n    nlarge = 0;\n    ngx_rtmp_stat_get_pool_size(pool, &nlarge, &size);\n    NGX_RTMP_STAT_L(\"<pool><nlarge>\");\n    NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), \"%ui\", nlarge) - buf);\n    NGX_RTMP_STAT_L(\"</nlarge><size>\");\n    NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), \"%ui\", size) - buf);\n    NGX_RTMP_STAT_L(\"</size></pool>\\r\\n\");\n}\n#endif\n\n\n\nstatic void\nngx_rtmp_stat_client(ngx_http_request_t *r, ngx_chain_t ***lll,\n    ngx_rtmp_session_t *s)\n{\n    u_char  buf[NGX_INT_T_LEN];\n\n#ifdef NGX_RTMP_POOL_DEBUG\n    ngx_rtmp_stat_dump_pool(r, lll, s->pool);\n#endif\n    NGX_RTMP_STAT_L(\"<id>\");\n    NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), \"%ui\",\n                  (ngx_uint_t) s->number) - buf);\n    NGX_RTMP_STAT_L(\"</id>\");\n\n    NGX_RTMP_STAT_L(\"<address>\");\n    NGX_RTMP_STAT_ES(s->addr_text);\n    NGX_RTMP_STAT_L(\"</address>\");\n\n    NGX_RTMP_STAT_L(\"<remote_address>\");\n    NGX_RTMP_STAT_ES(&(s->remote_addr_text));\n    NGX_RTMP_STAT_L(\"</remote_address>\");\n\n    NGX_RTMP_STAT_L(\"<time>\");\n    NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), \"%i\",\n                  (ngx_int_t) (ngx_current_msec - s->epoch)) - buf);\n    NGX_RTMP_STAT_L(\"</time>\");\n\n    if (s->flashver.len) {\n        NGX_RTMP_STAT_L(\"<flashver>\");\n        NGX_RTMP_STAT_ES(&s->flashver);\n        NGX_RTMP_STAT_L(\"</flashver>\");\n    }\n\n    if (s->page_url.len) {\n        NGX_RTMP_STAT_L(\"<pageurl>\");\n        NGX_RTMP_STAT_ES(&s->page_url);\n        NGX_RTMP_STAT_L(\"</pageurl>\");\n    }\n\n    if (s->swf_url.len) {\n        NGX_RTMP_STAT_L(\"<swfurl>\");\n        NGX_RTMP_STAT_ES(&s->swf_url);\n        NGX_RTMP_STAT_L(\"</swfurl>\");\n    }\n}\n\n\nstatic char *\nngx_rtmp_stat_get_aac_profile(ngx_uint_t p, ngx_uint_t sbr, ngx_uint_t ps) {\n    switch (p) {\n        case 1:\n            return \"Main\";\n        case 2:\n            if (ps) {\n                return \"HEv2\";\n            }\n            if (sbr) {\n                return \"HE\";\n            }\n            return \"LC\";\n        case 3:\n            return \"SSR\";\n        case 4:\n            return \"LTP\";\n        case 5:\n            return \"SBR\";\n        default:\n            return \"\";\n    }\n}\n\n\nstatic char *\nngx_rtmp_stat_get_avc_profile(ngx_uint_t p) {\n    switch (p) {\n        case 66:\n            return \"Baseline\";\n        case 77:\n            return \"Main\";\n        case 100:\n            return \"High\";\n        default:\n            return \"\";\n    }\n}\n\n\nstatic void\nngx_rtmp_stat_live(ngx_http_request_t *r, ngx_chain_t ***lll,\n        ngx_live_server_t *srv)\n{\n    ngx_live_stream_t              *stream;\n    ngx_rtmp_codec_ctx_t           *codec;\n    ngx_rtmp_live_ctx_t            *ctx;\n    ngx_rtmp_session_t             *s;\n    size_t                          n;\n    ngx_uint_t                      nclients, total_nclients;\n    u_char                          buf[NGX_INT_T_LEN];\n    u_char                          bbuf[NGX_INT32_LEN];\n    ngx_rtmp_stat_loc_conf_t       *slcf;\n    ngx_live_conf_t                *lcf;\n    u_char                         *cname;\n    u_char                         *p;\n\n    slcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_stat_module);\n    lcf = (ngx_live_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                           ngx_live_module);\n\n    NGX_RTMP_STAT_L(\"<live>\\r\\n\");\n\n    total_nclients = 0;\n    for (n = 0; n < lcf->stream_buckets; ++n) {\n        for (stream = srv->streams[n]; stream; stream = stream->next) {\n            NGX_RTMP_STAT_L(\"<stream>\\r\\n\");\n\n            NGX_RTMP_STAT_L(\"<name>\");\n            p = stream->name + ngx_strlen(stream->name);\n            while (*p != '/' && p != stream->name) {\n                p--;\n            }\n\n            if (p != stream->name) {\n                p++;\n            }\n\n            NGX_RTMP_STAT_ECS(p);\n            NGX_RTMP_STAT_L(\"</name>\\r\\n\");\n\n            NGX_RTMP_STAT_L(\"<time>\");\n            NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf), \"%i\",\n                          (ngx_int_t) (ngx_current_msec - stream->epoch))\n                          - buf);\n            NGX_RTMP_STAT_L(\"</time>\");\n\n            ngx_rtmp_stat_bw(r, lll, &stream->bw_in, \"in\",\n                             NGX_RTMP_STAT_BW_BYTES);\n            ngx_rtmp_stat_bw(r, lll, &stream->bw_out, \"out\",\n                             NGX_RTMP_STAT_BW_BYTES);\n            ngx_rtmp_stat_bw(r, lll, &stream->bw_in_audio, \"audio\",\n                             NGX_RTMP_STAT_BW);\n            ngx_rtmp_stat_bw(r, lll, &stream->bw_in_video, \"video\",\n                             NGX_RTMP_STAT_BW);\n\n            nclients = 0;\n            codec = NULL;\n            for (ctx = stream->ctx; ctx; ctx = ctx->next, ++nclients) {\n                s = ctx->session;\n                if (slcf->stat & NGX_RTMP_STAT_CLIENTS) {\n                    NGX_RTMP_STAT_L(\"<client>\");\n\n                    ngx_rtmp_stat_client(r, lll, s);\n\n                    NGX_RTMP_STAT_L(\"<dropped>\");\n                    NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf),\n                                  \"%ui\", ctx->ndropped) - buf);\n                    NGX_RTMP_STAT_L(\"</dropped>\");\n\n                    NGX_RTMP_STAT_L(\"<avsync>\");\n                    NGX_RTMP_STAT(bbuf, ngx_snprintf(bbuf, sizeof(bbuf),\n                                  \"%D\", ctx->cs[1].timestamp -\n                                  ctx->cs[0].timestamp) - bbuf);\n                    NGX_RTMP_STAT_L(\"</avsync>\");\n\n                    NGX_RTMP_STAT_L(\"<timestamp>\");\n                    NGX_RTMP_STAT(bbuf, ngx_snprintf(bbuf, sizeof(bbuf),\n                                  \"%D\", s->current_time) - bbuf);\n                    NGX_RTMP_STAT_L(\"</timestamp>\");\n\n                    if (ctx->publishing) {\n                        NGX_RTMP_STAT_L(\"<publishing/>\");\n                    }\n\n                    if (ctx->active) {\n                        NGX_RTMP_STAT_L(\"<active/>\");\n                    }\n\n                    NGX_RTMP_STAT_L(\"</client>\\r\\n\");\n                }\n                if (ctx->publishing) {\n                    codec = ngx_rtmp_get_module_ctx(s, ngx_rtmp_codec_module);\n                }\n            }\n            total_nclients += nclients;\n\n            if (codec) {\n                NGX_RTMP_STAT_L(\"<meta>\");\n\n                NGX_RTMP_STAT_L(\"<video>\");\n                NGX_RTMP_STAT_L(\"<width>\");\n                NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf),\n                              \"%ui\", codec->width) - buf);\n                NGX_RTMP_STAT_L(\"</width><height>\");\n                NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf),\n                              \"%ui\", codec->height) - buf);\n                NGX_RTMP_STAT_L(\"</height><frame_rate>\");\n                NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf),\n                              \"%f\", codec->frame_rate) - buf);\n                NGX_RTMP_STAT_L(\"</frame_rate>\");\n\n                cname = ngx_rtmp_get_video_codec_name(codec->video_codec_id);\n                if (*cname) {\n                    NGX_RTMP_STAT_L(\"<codec>\");\n                    NGX_RTMP_STAT_ECS(cname);\n                    NGX_RTMP_STAT_L(\"</codec>\");\n                }\n                if (codec->avc_profile) {\n                    NGX_RTMP_STAT_L(\"<profile>\");\n                    NGX_RTMP_STAT_CS(\n                            ngx_rtmp_stat_get_avc_profile(codec->avc_profile));\n                    NGX_RTMP_STAT_L(\"</profile>\");\n                }\n                if (codec->avc_level) {\n                    NGX_RTMP_STAT_L(\"<compat>\");\n                    NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf),\n                                  \"%ui\", codec->avc_compat) - buf);\n                    NGX_RTMP_STAT_L(\"</compat>\");\n                }\n                if (codec->avc_level) {\n                    NGX_RTMP_STAT_L(\"<level>\");\n                    NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf),\n                                  \"%.1f\", codec->avc_level / 10.) - buf);\n                    NGX_RTMP_STAT_L(\"</level>\");\n                }\n                NGX_RTMP_STAT_L(\"</video>\");\n\n                NGX_RTMP_STAT_L(\"<audio>\");\n                cname = ngx_rtmp_get_audio_codec_name(codec->audio_codec_id);\n                if (*cname) {\n                    NGX_RTMP_STAT_L(\"<codec>\");\n                    NGX_RTMP_STAT_ECS(cname);\n                    NGX_RTMP_STAT_L(\"</codec>\");\n                }\n                if (codec->aac_profile) {\n                    NGX_RTMP_STAT_L(\"<profile>\");\n                    NGX_RTMP_STAT_CS(\n                            ngx_rtmp_stat_get_aac_profile(codec->aac_profile,\n                                                          codec->aac_sbr,\n                                                          codec->aac_ps));\n                    NGX_RTMP_STAT_L(\"</profile>\");\n                }\n                if (codec->aac_chan_conf) {\n                    NGX_RTMP_STAT_L(\"<channels>\");\n                    NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf),\n                                  \"%ui\", codec->aac_chan_conf) - buf);\n                    NGX_RTMP_STAT_L(\"</channels>\");\n                } else if (codec->audio_channels) {\n                    NGX_RTMP_STAT_L(\"<channels>\");\n                    NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf),\n                                  \"%ui\", codec->audio_channels) - buf);\n                    NGX_RTMP_STAT_L(\"</channels>\");\n                }\n                if (codec->sample_rate) {\n                    NGX_RTMP_STAT_L(\"<sample_rate>\");\n                    NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf),\n                                  \"%ui\", codec->sample_rate) - buf);\n                    NGX_RTMP_STAT_L(\"</sample_rate>\");\n                }\n                NGX_RTMP_STAT_L(\"</audio>\");\n\n                NGX_RTMP_STAT_L(\"</meta>\\r\\n\");\n            }\n\n            NGX_RTMP_STAT_L(\"<nclients>\");\n            NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf),\n                          \"%ui\", nclients) - buf);\n            NGX_RTMP_STAT_L(\"</nclients>\\r\\n\");\n\n            if (stream->publishing) {\n                NGX_RTMP_STAT_L(\"<publishing/>\\r\\n\");\n            }\n\n            if (stream->active) {\n                NGX_RTMP_STAT_L(\"<active/>\\r\\n\");\n            }\n\n            NGX_RTMP_STAT_L(\"</stream>\\r\\n\");\n        }\n    }\n\n    NGX_RTMP_STAT_L(\"<nclients>\");\n    NGX_RTMP_STAT(buf, ngx_snprintf(buf, sizeof(buf),\n                  \"%ui\", total_nclients) - buf);\n    NGX_RTMP_STAT_L(\"</nclients>\\r\\n\");\n\n    NGX_RTMP_STAT_L(\"</live>\\r\\n\");\n}\n\n\nstatic ngx_int_t\nngx_rtmp_stat_handler(ngx_http_request_t *r)\n{\n    ngx_rtmp_stat_loc_conf_t       *slcf;\n    ngx_live_conf_t                *lcf;\n    ngx_live_server_t              *psrv;\n    ngx_chain_t                    *cl, *l, **ll, ***lll;\n    size_t                          n;\n    off_t                           len;\n    static u_char                   tbuf[NGX_TIME_T_LEN];\n    static u_char                   nbuf[NGX_INT_T_LEN];\n\n    slcf = ngx_http_get_module_loc_conf(r, ngx_rtmp_stat_module);\n    if (slcf->stat == 0) {\n        return NGX_DECLINED;\n    }\n\n    cl = NULL;\n    ll = &cl;\n    lll = &ll;\n\n    NGX_RTMP_STAT_L(\"<?xml version=\\\"1.0\\\" encoding=\\\"utf-8\\\" ?>\\r\\n\");\n    if (slcf->stylesheet.len) {\n        NGX_RTMP_STAT_L(\"<?xml-stylesheet type=\\\"text/xsl\\\" href=\\\"\");\n        NGX_RTMP_STAT_ES(&slcf->stylesheet);\n        NGX_RTMP_STAT_L(\"\\\" ?>\\r\\n\");\n    }\n\n    NGX_RTMP_STAT_L(\"<rtmp>\\r\\n\");\n\n#ifdef NGINX_VERSION\n    NGX_RTMP_STAT_L(\"<nginx_version>\" NGINX_VERSION \"</nginx_version>\\r\\n\");\n#endif\n\n#ifdef NGINX_RTMP_VERSION\n    NGX_RTMP_STAT_L(\"<nginx_rtmp_version>\" NGINX_RTMP_VERSION \"</nginx_rtmp_version>\\r\\n\");\n#endif\n\n#ifdef NGX_COMPILER\n    NGX_RTMP_STAT_L(\"<compiler>\" NGX_COMPILER \"</compiler>\\r\\n\");\n#endif\n    NGX_RTMP_STAT_L(\"<built>\" __DATE__ \" \" __TIME__ \"</built>\\r\\n\");\n\n    NGX_RTMP_STAT_L(\"<pid>\");\n    NGX_RTMP_STAT(nbuf, ngx_snprintf(nbuf, sizeof(nbuf),\n                  \"%ui\", (ngx_uint_t) ngx_getpid()) - nbuf);\n    NGX_RTMP_STAT_L(\"</pid>\\r\\n\");\n\n    NGX_RTMP_STAT_L(\"<uptime>\");\n    NGX_RTMP_STAT(tbuf, ngx_snprintf(tbuf, sizeof(tbuf),\n                  \"%T\", ngx_cached_time->sec - start_time) - tbuf);\n    NGX_RTMP_STAT_L(\"</uptime>\\r\\n\");\n\n    NGX_RTMP_STAT_L(\"<naccepted>\");\n    NGX_RTMP_STAT(nbuf, ngx_snprintf(nbuf, sizeof(nbuf),\n                  \"%ui\", ngx_rtmp_naccepted) - nbuf);\n    NGX_RTMP_STAT_L(\"</naccepted>\\r\\n\");\n\n    ngx_rtmp_stat_bw(r, lll, &ngx_rtmp_bw_in, \"in\", NGX_RTMP_STAT_BW_BYTES);\n    ngx_rtmp_stat_bw(r, lll, &ngx_rtmp_bw_out, \"out\", NGX_RTMP_STAT_BW_BYTES);\n\n    lcf = (ngx_live_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                           ngx_live_module);\n\n    for (n = 0; n < lcf->server_buckets; ++n) {\n        for (psrv = lcf->servers[n]; psrv; psrv = psrv->next) {\n            NGX_RTMP_STAT_L(\"<server>\\r\\n\");\n\n            NGX_RTMP_STAT_L(\"<serverid>\");\n            NGX_RTMP_STAT(psrv->serverid, ngx_strlen(psrv->serverid));\n            NGX_RTMP_STAT_L(\"</serverid>\\r\\n\");\n\n            ngx_rtmp_stat_live(r, lll, psrv);\n            NGX_RTMP_STAT_L(\"</server>\\r\\n\");\n        }\n    }\n\n    NGX_RTMP_STAT_L(\"</rtmp>\\r\\n\");\n\n    len = 0;\n    for (l = cl; l; l = l->next) {\n        len += (l->buf->last - l->buf->pos);\n    }\n    ngx_str_set(&r->headers_out.content_type, \"text/xml\");\n    r->headers_out.content_length_n = len;\n    r->headers_out.status = NGX_HTTP_OK;\n    ngx_http_send_header(r);\n    (*ll)->buf->last_buf = 1;\n    return ngx_http_output_filter(r, cl);\n}\n\n\nstatic void *\nngx_rtmp_stat_create_loc_conf(ngx_conf_t *cf)\n{\n    ngx_rtmp_stat_loc_conf_t       *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_stat_loc_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->stat = 0;\n\n    return conf;\n}\n\n\nstatic char *\nngx_rtmp_stat_merge_loc_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_rtmp_stat_loc_conf_t       *prev = parent;\n    ngx_rtmp_stat_loc_conf_t       *conf = child;\n\n    ngx_conf_merge_bitmask_value(conf->stat, prev->stat, 0);\n    ngx_conf_merge_str_value(conf->stylesheet, prev->stylesheet, \"\");\n\n    return NGX_CONF_OK;\n}\n\n\nstatic char *\nngx_rtmp_stat(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t  *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_rtmp_stat_handler;\n\n    return ngx_conf_set_bitmask_slot(cf, cmd, conf);\n}\n\n\nstatic ngx_int_t\nngx_rtmp_stat_postconfiguration(ngx_conf_t *cf)\n{\n    start_time = ngx_cached_time->sec;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_streams.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#ifndef _NGX_RTMP_STREAMS_H_INCLUDED_\n#define _NGX_RTMP_STREAMS_H_INCLUDED_\n\n\n#define NGX_RTMP_MSID                   1\n\n#define NGX_RTMP_CSID_AMF_INI           3\n#define NGX_RTMP_CSID_AMF               5\n#define NGX_RTMP_CSID_AUDIO             6\n#define NGX_RTMP_CSID_VIDEO             7\n\n\n#endif /* _NGX_RTMP_STREAMS_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_sys_stat_module.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_event.h>\n#include <ngx_http.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rbuf.h\"\n#include \"ngx_poold.h\"\n#include \"ngx_stream_zone_module.h\"\n#include \"ngx_event_timer_module.h\"\n#include \"ngx_event_resolver.h\"\n#include \"ngx_dynamic_resolver.h\"\n#include \"ngx_live.h\"\n\n\nstatic char *ngx_rtmp_sys_stat(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\n\n\nextern ngx_chain_t *ngx_live_relay_static_state(ngx_http_request_t *r);\n\n\nstatic ngx_command_t  ngx_rtmp_sys_stat_commands[] = {\n\n    { ngx_string(\"sys_stat\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,\n      ngx_rtmp_sys_stat,\n      NGX_HTTP_LOC_CONF_OFFSET,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_rtmp_sys_stat_module_ctx = {\n    NULL,                               /* preconfiguration */\n    NULL,                               /* postconfiguration */\n\n    NULL,                               /* create main configuration */\n    NULL,                               /* init main configuration */\n\n    NULL,                               /* create server configuration */\n    NULL,                               /* merge server configuration */\n\n    NULL,                               /* create location configuration */\n    NULL                                /* merge location configuration */\n};\n\n\nngx_module_t  ngx_rtmp_sys_stat_module = {\n    NGX_MODULE_V1,\n    &ngx_rtmp_sys_stat_module_ctx,      /* module context */\n    ngx_rtmp_sys_stat_commands,         /* module directives */\n    NGX_HTTP_MODULE,                    /* module type */\n    NULL,                               /* init master */\n    NULL,                               /* init module */\n    NULL,                               /* init process */\n    NULL,                               /* init thread */\n    NULL,                               /* exit thread */\n    NULL,                               /* exit process */\n    NULL,                               /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_int_t\nngx_rtmp_sys_stat_handler(ngx_http_request_t *r)\n{\n    ngx_chain_t                       **ll, *out;\n    ngx_buf_t                          *b;\n    ngx_str_t                           detail_arg;\n    ngx_uint_t                          detail = 0;\n    size_t                              len;\n\n    if (ngx_http_arg(r, (u_char *) \"detail\", sizeof(\"detail\") - 1, &detail_arg)\n            == NGX_OK)\n    {\n        detail = 1;\n    }\n\n    r->headers_out.status = NGX_HTTP_OK;\n    ngx_http_send_header(r);\n\n    ll = &out;\n\n    len = sizeof(\"--------------------------------------------------\\n\") - 1\n        + sizeof(\"ngx_worker:   ngx_process_slot:   pid: \\n\") - 1\n        + 3 * NGX_OFF_T_LEN;\n\n    *ll = ngx_alloc_chain_link(r->pool);\n    if (*ll == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n    (*ll)->next = NULL;\n\n    b = ngx_create_temp_buf(r->pool, len);\n    if (b == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n    (*ll)->buf = b;\n\n    b->last = ngx_snprintf(b->last, len,\n            \"--------------------------------------------------\\n\"\n            \"ngx_worker: %i  ngx_process_slot: %i  pid: %i\\n\",\n            ngx_worker, ngx_process_slot, ngx_pid);\n\n    if (*ll) {\n        ll = &(*ll)->next;\n    }\n    *ll = ngx_live_state(r);\n\n    if (*ll) {\n        ll = &(*ll)->next;\n    }\n    *ll = ngx_live_relay_static_state(r);\n\n    if (*ll) {\n        ll = &(*ll)->next;\n    }\n    *ll = ngx_rtmp_shared_state(r);\n\n    if (*ll) {\n        ll = &(*ll)->next;\n    }\n    *ll = ngx_rbuf_state(r, detail);\n\n    if (*ll) {\n        ll = &(*ll)->next;\n    }\n    *ll = ngx_stream_zone_state(r, 0);\n\n    if (*ll) {\n        ll = &(*ll)->next;\n    }\n    *ll = ngx_event_timer_state(r);\n\n    if (*ll) {\n        ll = &(*ll)->next;\n    }\n    *ll = ngx_event_resolver_state(r);\n\n    if (*ll) {\n        ll = &(*ll)->next;\n    }\n    *ll = ngx_dynamic_resolver_state(r);\n\n    if (*ll) {\n        ll = &(*ll)->next;\n    }\n    *ll = ngx_poold_state(r, detail);\n\n    (*ll)->buf->last_buf = 1;\n\n    return ngx_http_output_filter(r, out);\n}\n\nstatic char *\nngx_rtmp_sys_stat(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t           *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_rtmp_sys_stat_handler;\n\n    return NGX_CONF_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_variables.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <nginx.h>\n#include \"ngx_rtmp.h\"\n#include \"ngx_rtmp_variables.h\"\n#include \"ngx_live_relay.h\"\n\n\nstatic ngx_int_t ngx_rtmp_variable_session_get_str(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_rtmp_variable_session_get_uint(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_rtmp_variable_session_get_int(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_rtmp_variable_session_get_msec(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\n\nstatic ngx_int_t ngx_rtmp_variable_relay_get_str(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_rtmp_variable_relay_get_uint(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\n\nstatic ngx_int_t ngx_rtmp_variable_finalize_reason(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_rtmp_variable_stage(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_rtmp_variable_remote_addr(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_rtmp_variable_remote_port(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_rtmp_variable_local_addr(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_rtmp_variable_local_port(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_rtmp_variable_nginx_version(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_rtmp_variable_pid(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_rtmp_variable_msec(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_rtmp_variable_time_iso8601(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_rtmp_variable_time_local(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_rtmp_variable_ngx_worker(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_rtmp_variable_argument(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data);\n\n\nstatic ngx_rtmp_variable_t  ngx_rtmp_core_variables[] = {\n\n    { ngx_string(\"domain\"), NULL, ngx_rtmp_variable_session_get_str,\n      offsetof(ngx_rtmp_session_t, domain), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"app\"), NULL, ngx_rtmp_variable_session_get_str,\n      offsetof(ngx_rtmp_session_t, app), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"name\"), NULL, ngx_rtmp_variable_session_get_str,\n      offsetof(ngx_rtmp_session_t, name), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"stream\"), NULL, ngx_rtmp_variable_session_get_str,\n      offsetof(ngx_rtmp_session_t, stream), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"pargs\"), NULL, ngx_rtmp_variable_session_get_str,\n      offsetof(ngx_rtmp_session_t, pargs), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"args\"), NULL, ngx_rtmp_variable_session_get_str,\n      offsetof(ngx_rtmp_session_t, args), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"flashver\"), NULL, ngx_rtmp_variable_session_get_str,\n      offsetof(ngx_rtmp_session_t, flashver), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"swf_url\"), NULL, ngx_rtmp_variable_session_get_str,\n      offsetof(ngx_rtmp_session_t, swf_url), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"tc_url\"), NULL, ngx_rtmp_variable_session_get_str,\n      offsetof(ngx_rtmp_session_t, tc_url), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"page_url\"), NULL, ngx_rtmp_variable_session_get_str,\n      offsetof(ngx_rtmp_session_t, page_url), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"acodecs\"), NULL, ngx_rtmp_variable_session_get_uint,\n      offsetof(ngx_rtmp_session_t, acodecs), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"vcodecs\"), NULL, ngx_rtmp_variable_session_get_uint,\n      offsetof(ngx_rtmp_session_t, vcodecs), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"scheme\"), NULL, ngx_rtmp_variable_session_get_str,\n      offsetof(ngx_rtmp_session_t, scheme), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"serverid\"), NULL, ngx_rtmp_variable_session_get_str,\n      offsetof(ngx_rtmp_session_t, serverid), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"groupid\"), NULL, ngx_rtmp_variable_session_get_str,\n      offsetof(ngx_rtmp_session_t, groupid), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"notify_status\"), NULL, ngx_rtmp_variable_session_get_int,\n      offsetof(ngx_rtmp_session_t, notify_status), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"finalize_reason\"), NULL, ngx_rtmp_variable_finalize_reason,\n      0, NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"stage\"), NULL, ngx_rtmp_variable_stage,\n      0, NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"init\"), NULL, ngx_rtmp_variable_session_get_msec,\n      offsetof(ngx_rtmp_session_t, init_time), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"handshake_done\"), NULL, ngx_rtmp_variable_session_get_msec,\n      offsetof(ngx_rtmp_session_t, handshake_done_time),\n      NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"connect\"), NULL, ngx_rtmp_variable_session_get_msec,\n      offsetof(ngx_rtmp_session_t, connect_time), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"create_stream\"), NULL, ngx_rtmp_variable_session_get_msec,\n      offsetof(ngx_rtmp_session_t, create_stream_time),\n      NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"ptime\"), NULL, ngx_rtmp_variable_session_get_msec,\n      offsetof(ngx_rtmp_session_t, ptime), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"first_data\"), NULL, ngx_rtmp_variable_session_get_msec,\n      offsetof(ngx_rtmp_session_t, first_data), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"first_metadata\"), NULL, ngx_rtmp_variable_session_get_msec,\n      offsetof(ngx_rtmp_session_t, first_metadata),\n      NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"first_audio\"), NULL, ngx_rtmp_variable_session_get_msec,\n      offsetof(ngx_rtmp_session_t, first_audio), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"first_video\"), NULL, ngx_rtmp_variable_session_get_msec,\n      offsetof(ngx_rtmp_session_t, first_video), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"close_stream\"), NULL, ngx_rtmp_variable_session_get_msec,\n      offsetof(ngx_rtmp_session_t, close_stream_time),\n      NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"relay_domain\"), NULL, ngx_rtmp_variable_relay_get_str,\n      offsetof(ngx_live_relay_ctx_t, domain), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"relay_app\"), NULL, ngx_rtmp_variable_relay_get_str,\n      offsetof(ngx_live_relay_ctx_t, app), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"relay_name\"), NULL, ngx_rtmp_variable_relay_get_str,\n      offsetof(ngx_live_relay_ctx_t, name), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"relay_args\"), NULL, ngx_rtmp_variable_relay_get_str,\n      offsetof(ngx_live_relay_ctx_t, args), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"relay_pargs\"), NULL, ngx_rtmp_variable_relay_get_str,\n      offsetof(ngx_live_relay_ctx_t, pargs), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"relay_referer\"), NULL, ngx_rtmp_variable_relay_get_str,\n      offsetof(ngx_live_relay_ctx_t, referer), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"relay_user_agent\"), NULL, ngx_rtmp_variable_relay_get_str,\n      offsetof(ngx_live_relay_ctx_t, user_agent), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"relay_swf_url\"), NULL, ngx_rtmp_variable_relay_get_str,\n      offsetof(ngx_live_relay_ctx_t, swf_url), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"relay_acodecs\"), NULL, ngx_rtmp_variable_relay_get_uint,\n      offsetof(ngx_live_relay_ctx_t, acodecs), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"relay_vcodecs\"), NULL, ngx_rtmp_variable_relay_get_uint,\n      offsetof(ngx_live_relay_ctx_t, vcodecs), NGX_RTMP_VAR_NOCACHEABLE, 0},\n\n    { ngx_string(\"remote_addr\"), NULL, ngx_rtmp_variable_remote_addr,\n      0, NGX_RTMP_VAR_NOCACHEABLE, 0 },\n\n    { ngx_string(\"remote_port\"), NULL, ngx_rtmp_variable_remote_port,\n      0, NGX_RTMP_VAR_NOCACHEABLE, 0 },\n\n    { ngx_string(\"server_addr\"), NULL, ngx_rtmp_variable_local_addr,\n      0, NGX_RTMP_VAR_NOCACHEABLE, 0 },\n\n    { ngx_string(\"server_port\"), NULL, ngx_rtmp_variable_local_port,\n      0, NGX_RTMP_VAR_NOCACHEABLE, 0 },\n\n    { ngx_string(\"nginx_version\"), NULL,\n      ngx_rtmp_variable_nginx_version, 0, 0, 0},\n\n    { ngx_string(\"pid\"), NULL, ngx_rtmp_variable_pid, 0, 0, 0},\n\n    { ngx_string(\"msec\"), NULL, ngx_rtmp_variable_msec,\n      0, NGX_RTMP_VAR_NOCACHEABLE, 0 },\n\n    { ngx_string(\"time_iso8601\"), NULL, ngx_rtmp_variable_time_iso8601,\n      0, NGX_RTMP_VAR_NOCACHEABLE, 0 },\n\n    { ngx_string(\"time_local\"), NULL, ngx_rtmp_variable_time_local,\n      0, NGX_RTMP_VAR_NOCACHEABLE, 0 },\n\n    { ngx_string(\"ngx_worker\"), NULL, ngx_rtmp_variable_ngx_worker,\n      0, 0, 0},\n\n    { ngx_string(\"parg_\"), NULL, ngx_rtmp_variable_argument,\n      0, NGX_RTMP_VAR_NOCACHEABLE|NGX_RTMP_VAR_PREFIX, 0 },\n\n    { ngx_null_string, NULL, NULL, 0, 0, 0 }\n};\n\n\nngx_rtmp_variable_value_t  ngx_rtmp_variable_null_value =\n    ngx_rtmp_variable(\"\");\nngx_rtmp_variable_value_t  ngx_rtmp_variable_true_value =\n    ngx_rtmp_variable(\"1\");\n\n\nstatic ngx_uint_t  ngx_rtmp_variable_depth = 100;\n\n\nextern char *ngx_live_stage[];\nextern char *ngx_live_err[];\n\n\nstatic ngx_int_t\nngx_rtmp_variable_session_get_str(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    ngx_str_t                  *str;\n\n    str = (ngx_str_t *) ((u_char *) s + data);\n\n    v->data = str->data;\n    v->len = str->len;\n    v->valid = 1;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_session_get_uint(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    ngx_uint_t                 *ui;\n\n    ui = (ngx_uint_t *) ((u_char *) s + data);\n\n    if (v->data == NULL) {\n        v->data = ngx_pnalloc(s->pool, NGX_INT_T_LEN);\n        if (v->data == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    v->len = ngx_sprintf(v->data, \"%ui\", *ui) - v->data;\n    v->valid = 1;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_session_get_int(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    ngx_int_t                  *i;\n\n    i = (ngx_int_t *) ((u_char *) s + data);\n\n    if (v->data == NULL) {\n        v->data = ngx_pnalloc(s->pool, NGX_INT_T_LEN);\n        if (v->data == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    v->len = ngx_sprintf(v->data, \"%i\", *i) - v->data;\n    v->valid = 1;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_session_get_msec(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    ngx_msec_t                 *m;\n\n    m = (ngx_msec_t *) ((u_char *) s + data);\n\n    if (v->data == NULL) {\n        v->data = ngx_pnalloc(s->pool, NGX_INT_T_LEN);\n        if (v->data == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    v->len = ngx_sprintf(v->data, \"%i\", *m) - v->data;\n    v->valid = 1;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_relay_get_str(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    ngx_live_relay_ctx_t       *ctx;\n    ngx_str_t                  *str;\n\n    if (!s->relay) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n\n    str = (ngx_str_t *) ((u_char *) ctx + data);\n\n    v->data = str->data;\n    v->len = str->len;\n    v->valid = 1;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_relay_get_uint(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    ngx_live_relay_ctx_t       *ctx;\n    ngx_uint_t                 *ui;\n\n    if (!s->relay) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    ctx = ngx_rtmp_get_module_ctx(s, ngx_live_relay_module);\n\n    ui = (ngx_uint_t *) ((u_char *) ctx + data);\n\n    if (v->data == NULL) {\n        v->data = ngx_pnalloc(s->pool, NGX_INT_T_LEN);\n        if (v->data == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    v->len = ngx_sprintf(v->data, \"%ui\", *ui) - v->data;\n    v->valid = 1;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_finalize_reason(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    v->data = (u_char *) ngx_live_err[s->finalize_reason];\n    v->len = ngx_strlen(v->data);\n    v->valid = 1;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_stage(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    v->data = (u_char *) ngx_live_stage[s->stage];\n    v->len = ngx_strlen(v->data);\n    v->valid = 1;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_remote_addr(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    ngx_sockaddr_t              nsa;\n    struct sockaddr            *sa;\n    socklen_t                   len;\n\n    if (s->connection == NULL || s->connection->fd == (ngx_socket_t) -1) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    sa = (struct sockaddr *) &nsa;\n    len = sizeof(nsa);\n\n    if (getpeername(s->connection->fd, sa, &len) == -1) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    if (v->data == NULL) {\n        v->data = ngx_pnalloc(s->pool, NGX_SOCKADDRLEN);\n        if (v->data == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    v->valid = 1;\n    v->no_cacheable = 0;\n    v->not_found = 0;\n    v->len = ngx_sock_ntop(sa, sizeof(nsa), v->data, NGX_SOCKADDRLEN, 0);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_remote_port(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    ngx_sockaddr_t              nsa;\n    struct sockaddr            *sa;\n    socklen_t                   len;\n    in_port_t                   port;\n\n    if (s->connection == NULL || s->connection->fd == (ngx_socket_t) -1) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    sa = (struct sockaddr *) &nsa;\n    len = sizeof(nsa);\n\n    if (getpeername(s->connection->fd, sa, &len) == -1) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    if (v->data == NULL) {\n        v->data = ngx_pnalloc(s->pool, sizeof(\"65535\") - 1);\n        if (v->data == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    port = ngx_inet_get_port(sa);\n    if (port == 0) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    v->valid = 1;\n    v->no_cacheable = 0;\n    v->not_found = 0;\n    v->len = ngx_sprintf(v->data, \"%ui\", port) - v->data;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_local_addr(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    ngx_sockaddr_t              nsa;\n    struct sockaddr            *sa;\n    socklen_t                   len;\n\n    if (s->connection == NULL || s->connection->fd == (ngx_socket_t) -1) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    sa = (struct sockaddr *) &nsa;\n    len = sizeof(nsa);\n\n    if (getsockname(s->connection->fd, sa, &len) == -1) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    if (v->data == NULL) {\n        v->data = ngx_pnalloc(s->pool, NGX_SOCKADDRLEN);\n        if (v->data == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    v->valid = 1;\n    v->no_cacheable = 0;\n    v->not_found = 0;\n    v->len = ngx_sock_ntop(sa, sizeof(nsa), v->data, NGX_SOCKADDRLEN, 0);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_local_port(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    ngx_sockaddr_t              nsa;\n    struct sockaddr            *sa;\n    socklen_t                   len;\n    in_port_t                   port;\n\n    if (s->connection == NULL || s->connection->fd == (ngx_socket_t) -1) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    sa = (struct sockaddr *) &nsa;\n    len = sizeof(nsa);\n\n    if (getsockname(s->connection->fd, sa, &len) == -1) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    if (v->data == NULL) {\n        v->data = ngx_pnalloc(s->pool, sizeof(\"65535\") - 1);\n        if (v->data == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    port = ngx_inet_get_port(sa);\n    if (port == 0) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    v->valid = 1;\n    v->no_cacheable = 0;\n    v->not_found = 0;\n    v->len = ngx_sprintf(v->data, \"%ui\", port) - v->data;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_nginx_version(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    v->len = sizeof(NGINX_VERSION) - 1;\n    v->valid = 1;\n    v->no_cacheable = 0;\n    v->not_found = 0;\n    v->data = (u_char *) NGINX_VERSION;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_pid(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    if (v->data == NULL) {\n        v->data = ngx_pnalloc(s->pool, NGX_INT64_LEN);\n        if (v->data == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    v->len = ngx_sprintf(v->data, \"%P\", ngx_pid) - v->data;\n    v->valid = 1;\n    v->no_cacheable = 0;\n    v->not_found = 0;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_msec(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    ngx_time_t                 *tp;\n\n    if (v->data == NULL) {\n        v->data = ngx_pnalloc(s->pool, NGX_TIME_T_LEN + 4);\n        if (v->data == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    tp = ngx_timeofday();\n\n    v->len = ngx_sprintf(v->data, \"%T.%03M\", tp->sec, tp->msec) - v->data;\n    v->valid = 1;\n    v->no_cacheable = 1;\n    v->not_found = 0;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_time_iso8601(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    if (v->data == NULL) {\n        v->data = ngx_pnalloc(s->pool, ngx_cached_http_log_iso8601.len);\n        if (v->data == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    ngx_memcpy(v->data, ngx_cached_http_log_iso8601.data,\n               ngx_cached_http_log_iso8601.len);\n\n    v->len = ngx_cached_http_log_iso8601.len;\n    v->valid = 1;\n    v->no_cacheable = 1;\n    v->not_found = 0;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_time_local(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    if (v->data == NULL) {\n        v->data = ngx_pnalloc(s->pool, ngx_cached_http_log_time.len);\n        if (v->data == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    ngx_memcpy(v->data, ngx_cached_http_log_time.data,\n               ngx_cached_http_log_time.len);\n\n    v->len = ngx_cached_http_log_time.len;\n    v->valid = 1;\n    v->no_cacheable = 1;\n    v->not_found = 0;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_ngx_worker(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    if (v->data == NULL) {\n        v->data = ngx_pnalloc(s->pool, NGX_INT64_LEN);\n        if (v->data == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    v->len = ngx_sprintf(v->data, \"%ui\", ngx_worker) - v->data;\n    v->valid = 1;\n    v->no_cacheable = 0;\n    v->not_found = 0;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_rtmp_variable_argument(ngx_rtmp_session_t *s,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    ngx_str_t                  *name = (ngx_str_t *) data;\n\n    u_char                     *arg;\n    size_t                      len;\n    ngx_str_t                   value;\n\n    len = name->len - (sizeof(\"parg_\") - 1);\n    arg = name->data + sizeof(\"parg_\") - 1;\n\n    if (ngx_rtmp_arg(s, arg, len, &value) != NGX_OK) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    v->data = value.data;\n    v->len = value.len;\n    v->valid = 1;\n    v->no_cacheable = 0;\n    v->not_found = 0;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_rtmp_variable_t *\nngx_rtmp_add_prefix_variable(ngx_conf_t *cf, ngx_str_t *name, ngx_uint_t flags)\n{\n    ngx_uint_t                  i;\n    ngx_rtmp_variable_t        *v;\n    ngx_rtmp_core_main_conf_t  *cmcf;\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    v = cmcf->prefix_variables.elts;\n    for (i = 0; i < cmcf->prefix_variables.nelts; i++) {\n        if (name->len != v[i].name.len\n            || ngx_strncasecmp(name->data, v[i].name.data, name->len) != 0)\n        {\n            continue;\n        }\n\n        v = &v[i];\n\n        if (!(v->flags & NGX_HTTP_VAR_CHANGEABLE)) {\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                               \"the duplicate \\\"%V\\\" variable\", name);\n            return NULL;\n        }\n\n        v->flags &= flags | ~NGX_HTTP_VAR_WEAK;\n\n        return v;\n    }\n\n    v = ngx_array_push(&cmcf->prefix_variables);\n    if (v == NULL) {\n        return NULL;\n    }\n\n    v->name.len = name->len;\n    v->name.data = ngx_pnalloc(cf->pool, name->len);\n    if (v->name.data == NULL) {\n        return NULL;\n    }\n\n    ngx_strlow(v->name.data, name->data, name->len);\n\n    v->set_handler = NULL;\n    v->get_handler = NULL;\n    v->data = 0;\n    v->flags = flags;\n    v->index = 0;\n\n    return v;\n}\n\n\nstatic u_char *\nngx_rtmp_strlechr(u_char *p, u_char *last)\n{\n    while (p != last) {\n        if ((*p >= '0' && *p <= '9') ||\n            (*p >= 'a' && *p <= 'z') ||\n            (*p >= 'A' && *p <= 'Z') ||\n            *p == '_')\n        {\n            p++;\n            continue;\n        }\n\n        return p;\n    }\n\n    return NULL;\n}\n\n\nngx_int_t\nngx_rtmp_variable_transform_index(ngx_conf_t *cf, ngx_str_t *origin, ngx_str_t *target)\n{\n    u_char                   *p, *e, *t;\n    u_char                   *wp, *we;\n    ngx_str_t                 str, var;\n    ngx_buf_t                *buf;\n    ngx_int_t                 index;\n\n    p = origin->data;\n    e = origin->data + origin->len;\n\n    buf = ngx_create_temp_buf(cf->pool, 2 * origin->len);\n    if (buf == NULL) {\n        return NGX_ERROR;\n    }\n\n    wp = buf->start;\n    we = buf->end;\n\n    while (p < e) {\n        t = ngx_strlchr(p, e, '$');\n        if (t == NULL) {\n            t = e;\n        }\n        str.data = p;\n        str.len = t - p;\n        wp = ngx_slprintf(wp, we, \"%V\", &str);\n\n        if (t == e) {\n            break;\n        }\n\n        var.data = ++t;\n        t = ngx_rtmp_strlechr(t, e);\n        if (t == NULL) {\n            t = e;\n        }\n        var.len = t - var.data;\n\n        index = ngx_rtmp_get_variable_index(cf, &var);\n        if (index == NGX_ERROR) {\n            return NGX_ERROR;\n        }\n\n        wp = ngx_slprintf(wp, we, \"$%d\", index);\n        p = t;\n    }\n\n    target->data = buf->start;\n    target->len = wp - buf->start;\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_fetch_variable(ngx_rtmp_session_t *s, ngx_pool_t *pool,\n                          ngx_str_t *origin, ngx_str_t *target)\n{\n    ngx_rtmp_variable_value_t         *vv;\n    u_char                            *p, *e, *t;\n    u_char                            *wp, *we;\n    ngx_chain_t                       *ch, *cl, *ct;\n    u_char                            *pt;\n    ngx_uint_t                         length;\n    ngx_int_t                          index;\n    ngx_str_t                          var;\n\n    length = 0;\n    p = origin->data;\n    e = p + origin->len;\n\n    #define NGX_RTMP_NOTIFY_BUF(__start__, __end__)                            \\\n    ct = cl;                                                                   \\\n    pt = ngx_pcalloc(pool, sizeof(ngx_chain_t) +                               \\\n                     sizeof(ngx_buf_t) + __end__ - __start__);                 \\\n    cl = (ngx_chain_t*)pt;                                                     \\\n    cl->buf = (ngx_buf_t*)(pt + sizeof(ngx_chain_t));                          \\\n    cl->buf->start =                                                           \\\n    cl->buf->pos =                                                             \\\n    cl->buf->last = pt + sizeof(ngx_chain_t) + sizeof(ngx_buf_t);              \\\n    if (ch == NULL) {                                                          \\\n        ch = cl;                                                               \\\n    } else {                                                                   \\\n        ct->next = cl;                                                         \\\n    }                                                                          \\\n    cl->buf->last = ngx_cpymem(cl->buf->pos, __start__, __end__ - __start__);  \\\n    length += __end__ - __start__\n\n    ch = cl = ct = NULL;\n\n    while(p < e) {\n        t = ngx_strlchr(p, e, '$');\n        if (t == NULL) {\n            t = e;\n        }\n        NGX_RTMP_NOTIFY_BUF(p, t);\n        if (t == e) {\n            break;\n        }\n\n        var.data = ++t;\n        t = ngx_rtmp_strlechr(t, e);\n        if (t == NULL) {\n            t = e;\n        }\n        var.len = t - var.data;\n        index = ngx_atoi(var.data, var.len);\n        vv = ngx_rtmp_get_indexed_variable(s, index);\n        if (vv == NULL) {\n            p = t;\n            continue;\n        }\n        wp = vv->data;\n        we = vv->data + vv->len;\n\n        NGX_RTMP_NOTIFY_BUF(wp, we);\n        p = t;\n    }\n\n    #undef NGX_RTMP_NOTIFY_BUF\n\n    wp = ngx_pcalloc(pool, length);\n    we = wp;\n\n    for (ct = ch; ct;) {\n        we = ngx_cpymem(we, ct->buf->pos, ct->buf->last - ct->buf->pos);\n        cl = ct->next;\n        ngx_pfree(pool, ct);\n        ct = cl;\n    }\n    target->data = wp;\n    target->len = we - wp;\n    if (target->len != length) {\n        ngx_log_error(NGX_LOG_ERR, s->connection->log, 0,\n        \"variable: fetch_variable| target len = %d, content length = %d\",\n         target->len, length);\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\nngx_rtmp_variable_t *\nngx_rtmp_add_variable(ngx_conf_t *cf, ngx_str_t *name, ngx_uint_t flags)\n{\n    ngx_int_t                   rc;\n    ngx_uint_t                  i;\n    ngx_hash_key_t             *key;\n    ngx_rtmp_variable_t        *v;\n    ngx_rtmp_core_main_conf_t  *cmcf;\n\n    if (name->len == 0) {\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                           \"invalid variable name \\\"$\\\"\");\n        return NULL;\n    }\n\n    if (flags & NGX_HTTP_VAR_PREFIX) {\n        return ngx_rtmp_add_prefix_variable(cf, name, flags);\n    }\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    key = cmcf->variables_keys->keys.elts;\n    for (i = 0; i < cmcf->variables_keys->keys.nelts; i++) {\n        if (name->len != key[i].key.len\n            || ngx_strncasecmp(name->data, key[i].key.data, name->len) != 0)\n        {\n            continue;\n        }\n\n        v = key[i].value;\n\n        if (!(v->flags & NGX_HTTP_VAR_CHANGEABLE)) {\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                               \"the duplicate \\\"%V\\\" variable\", name);\n            return NULL;\n        }\n\n        v->flags &= flags | ~NGX_HTTP_VAR_WEAK;\n\n        return v;\n    }\n\n    v = ngx_palloc(cf->pool, sizeof(ngx_rtmp_variable_t));\n    if (v == NULL) {\n        return NULL;\n    }\n\n    v->name.len = name->len;\n    v->name.data = ngx_pnalloc(cf->pool, name->len);\n    if (v->name.data == NULL) {\n        return NULL;\n    }\n\n    ngx_strlow(v->name.data, name->data, name->len);\n\n    v->set_handler = NULL;\n    v->get_handler = NULL;\n    v->data = 0;\n    v->flags = flags;\n    v->index = 0;\n\n    rc = ngx_hash_add_key(cmcf->variables_keys, &v->name, v, 0);\n\n    if (rc == NGX_ERROR) {\n        return NULL;\n    }\n\n    if (rc == NGX_BUSY) {\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                           \"conflicting variable name \\\"%V\\\"\", name);\n        return NULL;\n    }\n\n    return v;\n}\n\n\nngx_int_t\nngx_rtmp_get_variable_index(ngx_conf_t *cf, ngx_str_t *name)\n{\n    ngx_uint_t                  i = 0, n;\n    ngx_rtmp_variable_t        *v, *av;\n    ngx_rtmp_core_main_conf_t  *cmcf;\n    ngx_hash_key_t             *key;\n\n    if (name->len == 0) {\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                           \"invalid variable name \\\"$\\\"\");\n        return NGX_ERROR;\n    }\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    v = cmcf->variables.elts;\n    key = cmcf->variables_keys->keys.elts;\n\n    if (v == NULL) {\n        if (ngx_array_init(&cmcf->variables, cf->pool, 4,\n                           sizeof(ngx_http_variable_t))\n            != NGX_OK)\n        {\n            return NGX_ERROR;\n        }\n\n    } else {\n        for (i = 0; i < cmcf->variables.nelts; i++) {\n            if (name->len != v[i].name.len\n                || ngx_strncasecmp(name->data, v[i].name.data, name->len) != 0)\n            {\n                continue;\n            }\n\n            return i;\n        }\n    }\n\n    v = ngx_array_push(&cmcf->variables);\n    if (v == NULL) {\n        return NGX_ERROR;\n    }\n\n    v->name.len = name->len;\n    v->name.data = ngx_pnalloc(cf->pool, name->len);\n    if (v->name.data == NULL) {\n        return NGX_ERROR;\n    }\n\n    ngx_strlow(v->name.data, name->data, name->len);\n\n    for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) {\n        av = key[n].value;\n        if (av->get_handler\n            && v->name.len == key[n].key.len\n            && ngx_strncmp(v->name.data, key[n].key.data, v->name.len) == 0)\n        {\n            v->get_handler = av->get_handler;\n            v->data = av->data;\n            av->flags= NGX_RTMP_VAR_INDEXED;\n            v->flags = av->flags;\n            av->index = i;\n\n            goto next;\n        }\n    }\n\n    ngx_log_error(NGX_LOG_EMERG, cf->log, 0,\n                \"variables: get_variable_index| unknown \\\"%V\\\" variable\",\n                &v->name);\n\n    return NGX_ERROR;\n\nnext:\n    v->set_handler = NULL;\n    v->index = cmcf->variables.nelts - 1;\n\n    return v->index;\n}\n\n\nngx_rtmp_variable_value_t *\nngx_rtmp_get_indexed_variable(ngx_rtmp_session_t *s, ngx_uint_t index)\n{\n    ngx_rtmp_variable_t        *v;\n    ngx_rtmp_core_main_conf_t  *cmcf;\n\n    cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module);\n\n    if (cmcf->variables.nelts <= index) {\n        ngx_log_error(NGX_LOG_ALERT, s->log, 0,\n                      \"unknown variable index: %ui\", index);\n        return NULL;\n    }\n\n    if (s->variables[index].not_found || s->variables[index].valid) {\n        return &s->variables[index];\n    }\n\n    v = cmcf->variables.elts;\n\n    if (ngx_rtmp_variable_depth == 0) {\n        ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                      \"cycle while evaluating variable \\\"%V\\\"\",\n                      &v[index].name);\n        return NULL;\n    }\n\n    ngx_rtmp_variable_depth--;\n\n    if (v[index].get_handler(s, &s->variables[index], v[index].data)\n        == NGX_OK)\n    {\n        ngx_rtmp_variable_depth++;\n\n        if (v[index].flags & NGX_HTTP_VAR_NOCACHEABLE) {\n            s->variables[index].no_cacheable = 1;\n        }\n\n        return &s->variables[index];\n    }\n\n    ngx_rtmp_variable_depth++;\n\n    s->variables[index].valid = 0;\n    s->variables[index].not_found = 1;\n\n    return NULL;\n}\n\n\nngx_rtmp_variable_value_t *\nngx_rtmp_get_flushed_variable(ngx_rtmp_session_t *s, ngx_uint_t index)\n{\n    ngx_rtmp_variable_value_t  *v;\n\n    v = &s->variables[index];\n\n    if (v->valid || v->not_found) {\n        if (!v->no_cacheable) {\n            return v;\n        }\n\n        v->valid = 0;\n        v->not_found = 0;\n    }\n\n    return ngx_rtmp_get_indexed_variable(s, index);\n}\n\n\nngx_rtmp_variable_value_t *\nngx_rtmp_get_variable(ngx_rtmp_session_t *s, ngx_str_t *name, ngx_uint_t key)\n{\n    size_t                      len;\n    ngx_uint_t                  i, n;\n    ngx_rtmp_variable_t        *v;\n    ngx_rtmp_variable_value_t  *vv;\n    ngx_rtmp_core_main_conf_t  *cmcf;\n\n    cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module);\n\n    v = ngx_hash_find(&cmcf->variables_hash, key, name->data, name->len);\n\n    if (v) {\n        if (v->flags & NGX_HTTP_VAR_INDEXED) {\n            return ngx_rtmp_get_flushed_variable(s, v->index);\n        }\n\n        if (ngx_rtmp_variable_depth == 0) {\n            ngx_log_error(NGX_LOG_ERR, s->log, 0,\n                          \"cycle while evaluating variable \\\"%V\\\"\", name);\n            return NULL;\n        }\n\n        ngx_rtmp_variable_depth--;\n\n        vv = ngx_palloc(s->pool, sizeof(ngx_rtmp_variable_value_t));\n\n        if (vv && v->get_handler(s, vv, v->data) == NGX_OK) {\n            ngx_rtmp_variable_depth++;\n            return vv;\n        }\n\n        ngx_rtmp_variable_depth++;\n        return NULL;\n    }\n\n    vv = ngx_palloc(s->pool, sizeof(ngx_rtmp_variable_value_t));\n    if (vv == NULL) {\n        return NULL;\n    }\n\n    len = 0;\n\n    v = cmcf->prefix_variables.elts;\n    n = cmcf->prefix_variables.nelts;\n\n    for (i = 0; i < cmcf->prefix_variables.nelts; i++) {\n        if (name->len >= v[i].name.len && name->len > len\n            && ngx_strncmp(name->data, v[i].name.data, v[i].name.len) == 0)\n        {\n            len = v[i].name.len;\n            n = i;\n        }\n    }\n\n    if (n != cmcf->prefix_variables.nelts) {\n        if (v[n].get_handler(s, vv, (uintptr_t) name) == NGX_OK) {\n            return vv;\n        }\n\n        return NULL;\n    }\n\n    vv->not_found = 1;\n\n    return vv;\n}\n\n\nvoid *\nngx_rtmp_map_find(ngx_rtmp_session_t *s, ngx_rtmp_map_t *map, ngx_str_t *match)\n{\n    void        *value;\n    u_char      *low;\n    size_t       len;\n    ngx_uint_t   key;\n\n    len = match->len;\n\n    if (len) {\n        low = ngx_pnalloc(s->pool, len);\n        if (low == NULL) {\n            return NULL;\n        }\n\n    } else {\n        low = NULL;\n    }\n\n    key = ngx_hash_strlow(low, match->data, len);\n\n    value = ngx_hash_find_combined(&map->hash, key, low, len);\n    if (value) {\n        return value;\n    }\n\n#if (NGX_PCRE)\n\n    if (len && map->nregex) {\n        ngx_int_t              n;\n        ngx_uint_t             i;\n        ngx_rtmp_map_regex_t  *reg;\n\n        reg = map->regex;\n\n        for (i = 0; i < map->nregex; i++) {\n\n            n = ngx_rtmp_regex_exec(s, reg[i].regex, match);\n\n            if (n == NGX_OK) {\n                return reg[i].value;\n            }\n\n            if (n == NGX_DECLINED) {\n                continue;\n            }\n\n            /* NGX_ERROR */\n\n            return NULL;\n        }\n    }\n\n#endif\n\n    return NULL;\n}\n\n\n#if (NGX_PCRE)\n\nstatic ngx_int_t\nngx_rtmp_variable_not_found(ngx_rtmp_session_t *s, ngx_rtmp_variable_value_t *v,\n    uintptr_t data)\n{\n    v->not_found = 1;\n    return NGX_OK;\n}\n\n\nngx_rtmp_regex_t *\nngx_rtmp_regex_compile(ngx_conf_t *cf, ngx_regex_compile_t *rc)\n{\n    u_char                     *p;\n    size_t                      size;\n    ngx_str_t                   name;\n    ngx_uint_t                  i, n;\n    ngx_rtmp_variable_t        *v;\n    ngx_rtmp_regex_t           *re;\n    ngx_rtmp_regex_variable_t  *rv;\n    ngx_rtmp_core_main_conf_t  *cmcf;\n\n    rc->pool = cf->pool;\n\n    if (ngx_regex_compile(rc) != NGX_OK) {\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, \"%V\", &rc->err);\n        return NULL;\n    }\n\n    re = ngx_pcalloc(cf->pool, sizeof(ngx_rtmp_regex_t));\n    if (re == NULL) {\n        return NULL;\n    }\n\n    re->regex = rc->regex;\n    re->ncaptures = rc->captures;\n    re->name = rc->pattern;\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n    cmcf->ncaptures = ngx_max(cmcf->ncaptures, re->ncaptures);\n\n    n = (ngx_uint_t) rc->named_captures;\n\n    if (n == 0) {\n        return re;\n    }\n\n    rv = ngx_palloc(rc->pool, n * sizeof(ngx_rtmp_regex_variable_t));\n    if (rv == NULL) {\n        return NULL;\n    }\n\n    re->variables = rv;\n    re->nvariables = n;\n\n    size = rc->name_size;\n    p = rc->names;\n\n    for (i = 0; i < n; i++) {\n        rv[i].capture = 2 * ((p[0] << 8) + p[1]);\n\n        name.data = &p[2];\n        name.len = ngx_strlen(name.data);\n\n        v = ngx_rtmp_add_variable(cf, &name, NGX_HTTP_VAR_CHANGEABLE);\n        if (v == NULL) {\n            return NULL;\n        }\n\n        rv[i].index = ngx_rtmp_get_variable_index(cf, &name);\n        if (rv[i].index == NGX_ERROR) {\n            return NULL;\n        }\n\n        v->get_handler = ngx_rtmp_variable_not_found;\n\n        p += size;\n    }\n\n    return re;\n}\n\n\nngx_int_t\nngx_rtmp_regex_exec(ngx_rtmp_session_t *s, ngx_rtmp_regex_t *re, ngx_str_t *str)\n{\n    ngx_int_t                   rc, index;\n    ngx_uint_t                  i, n, len;\n    ngx_rtmp_variable_value_t  *vv;\n    ngx_rtmp_core_main_conf_t  *cmcf;\n\n    cmcf = ngx_rtmp_get_module_main_conf(s, ngx_rtmp_core_module);\n\n    if (re->ncaptures) {\n        len = cmcf->ncaptures;\n\n        if (s->captures == NULL) {\n            s->captures = ngx_palloc(s->pool, len * sizeof(int));\n            if (s->captures == NULL) {\n                return NGX_ERROR;\n            }\n        }\n\n    } else {\n        len = 0;\n    }\n\n    rc = ngx_regex_exec(re->regex, str, s->captures, len);\n\n    if (rc == NGX_REGEX_NO_MATCHED) {\n        return NGX_DECLINED;\n    }\n\n    if (rc < 0) {\n        ngx_log_error(NGX_LOG_ALERT, s->log, 0,\n                      ngx_regex_exec_n \" failed: %i on \\\"%V\\\" using \\\"%V\\\"\",\n                      rc, str, &re->name);\n        return NGX_ERROR;\n    }\n\n    for (i = 0; i < re->nvariables; i++) {\n\n        n = re->variables[i].capture;\n        index = re->variables[i].index;\n        vv = &s->variables[index];\n\n        vv->len = s->captures[n + 1] - s->captures[n];\n        vv->valid = 1;\n        vv->no_cacheable = 0;\n        vv->not_found = 0;\n        vv->data = &str->data[s->captures[n]];\n\n#if (NGX_DEBUG)\n        {\n        ngx_rtmp_variable_t  *v;\n\n        v = cmcf->variables.elts;\n\n        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, s->log, 0,\n                       \"http regex set $%V to \\\"%v\\\"\", &v[index].name, vv);\n        }\n#endif\n    }\n\n    s->ncaptures = rc * 2;\n    s->captures_data = str->data;\n\n    return NGX_OK;\n}\n\n#endif\n\n\nngx_int_t\nngx_rtmp_variables_add_core_vars(ngx_conf_t *cf)\n{\n    ngx_rtmp_variable_t        *cv, *v;\n    ngx_rtmp_core_main_conf_t  *cmcf;\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    cmcf->variables_keys = ngx_pcalloc(cf->temp_pool,\n                                       sizeof(ngx_hash_keys_arrays_t));\n    if (cmcf->variables_keys == NULL) {\n        return NGX_ERROR;\n    }\n\n    cmcf->variables_keys->pool = cf->pool;\n    cmcf->variables_keys->temp_pool = cf->pool;\n\n    if (ngx_hash_keys_array_init(cmcf->variables_keys, NGX_HASH_SMALL)\n        != NGX_OK)\n    {\n        return NGX_ERROR;\n    }\n\n    if (ngx_array_init(&cmcf->prefix_variables, cf->pool, 8,\n                       sizeof(ngx_rtmp_variable_t))\n        != NGX_OK)\n    {\n        return NGX_ERROR;\n    }\n\n    for (cv = ngx_rtmp_core_variables; cv->name.len; cv++) {\n        v = ngx_rtmp_add_variable(cf, &cv->name, cv->flags);\n        if (v == NULL) {\n            return NGX_ERROR;\n        }\n\n        *v = *cv;\n    }\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_rtmp_variables_init_vars(ngx_conf_t *cf)\n{\n    size_t                      len;\n    ngx_uint_t                  i, n;\n    ngx_hash_key_t             *key;\n    ngx_hash_init_t             hash;\n    ngx_rtmp_variable_t        *v, *av, *pv;\n    ngx_rtmp_core_main_conf_t  *cmcf;\n\n    /* set the handlers for the indexed http variables */\n\n    cmcf = ngx_rtmp_conf_get_module_main_conf(cf, ngx_rtmp_core_module);\n\n    v = cmcf->variables.elts;\n    pv = cmcf->prefix_variables.elts;\n    key = cmcf->variables_keys->keys.elts;\n\n    for (i = 0; i < cmcf->variables.nelts; i++) {\n\n        for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) {\n\n            av = key[n].value;\n\n            if (v[i].name.len == key[n].key.len\n                && ngx_strncmp(v[i].name.data, key[n].key.data, v[i].name.len)\n                   == 0)\n            {\n                v[i].get_handler = av->get_handler;\n                v[i].data = av->data;\n\n                av->flags |= NGX_HTTP_VAR_INDEXED;\n                v[i].flags = av->flags;\n\n                av->index = i;\n\n                if (av->get_handler == NULL\n                    || (av->flags & NGX_HTTP_VAR_WEAK))\n                {\n                    break;\n                }\n\n                goto next;\n            }\n        }\n\n        len = 0;\n        av = NULL;\n\n        for (n = 0; n < cmcf->prefix_variables.nelts; n++) {\n            if (v[i].name.len >= pv[n].name.len && v[i].name.len > len\n                && ngx_strncmp(v[i].name.data, pv[n].name.data, pv[n].name.len)\n                   == 0)\n            {\n                av = &pv[n];\n                len = pv[n].name.len;\n            }\n        }\n\n        if (av) {\n            v[i].get_handler = av->get_handler;\n            v[i].data = (uintptr_t) &v[i].name;\n            v[i].flags = av->flags;\n\n            goto next;\n        }\n\n        if (v[i].get_handler == NULL) {\n            ngx_log_error(NGX_LOG_EMERG, cf->log, 0,\n                          \"unknown \\\"%V\\\" variable\", &v[i].name);\n\n            return NGX_ERROR;\n        }\n\n    next:\n        continue;\n    }\n\n\n    for (n = 0; n < cmcf->variables_keys->keys.nelts; n++) {\n        av = key[n].value;\n\n        if (av->flags & NGX_HTTP_VAR_NOHASH) {\n            key[n].key.data = NULL;\n        }\n    }\n\n\n    hash.hash = &cmcf->variables_hash;\n    hash.key = ngx_hash_key;\n    hash.max_size = cmcf->variables_hash_max_size;\n    hash.bucket_size = cmcf->variables_hash_bucket_size;\n    hash.name = \"variables_hash\";\n    hash.pool = cf->pool;\n    hash.temp_pool = NULL;\n\n    if (ngx_hash_init(&hash, cmcf->variables_keys->keys.elts,\n                      cmcf->variables_keys->keys.nelts)\n        != NGX_OK)\n    {\n        return NGX_ERROR;\n    }\n\n    cmcf->variables_keys = NULL;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_variables.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_RTMP_VARIABLES_H_INCLUDED_\n#define _NGX_RTMP_VARIABLES_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include \"ngx_rtmp.h\"\n\n\ntypedef ngx_variable_value_t  ngx_rtmp_variable_value_t;\n\n#define ngx_rtmp_variable(v)     { sizeof(v) - 1, 1, 0, 0, 0, (u_char *) v }\n\ntypedef struct ngx_rtmp_variable_s  ngx_rtmp_variable_t;\n\ntypedef void (*ngx_rtmp_set_variable_pt) (ngx_rtmp_session_t *s,\n    ngx_rtmp_variable_value_t *v, uintptr_t data);\ntypedef ngx_int_t (*ngx_rtmp_get_variable_pt) (ngx_rtmp_session_t *s,\n    ngx_rtmp_variable_value_t *v, uintptr_t data);\n\n\n#define NGX_RTMP_VAR_CHANGEABLE   1\n#define NGX_RTMP_VAR_NOCACHEABLE  2\n#define NGX_RTMP_VAR_INDEXED      4\n#define NGX_RTMP_VAR_NOHASH       8\n#define NGX_RTMP_VAR_WEAK         16\n#define NGX_RTMP_VAR_PREFIX       32\n\n\nstruct ngx_rtmp_variable_s {\n    ngx_str_t                     name;   /* must be first to build the hash */\n    ngx_rtmp_set_variable_pt      set_handler;\n    ngx_rtmp_get_variable_pt      get_handler;\n    uintptr_t                     data;\n    ngx_uint_t                    flags;\n    ngx_uint_t                    index;\n};\n\n\nngx_rtmp_variable_t *ngx_rtmp_add_variable(ngx_conf_t *cf, ngx_str_t *name,\n    ngx_uint_t flags);\nngx_int_t ngx_rtmp_get_variable_index(ngx_conf_t *cf, ngx_str_t *name);\nngx_rtmp_variable_value_t *ngx_rtmp_get_indexed_variable(ngx_rtmp_session_t *s,\n    ngx_uint_t index);\nngx_rtmp_variable_value_t *ngx_rtmp_get_flushed_variable(ngx_rtmp_session_t *s,\n    ngx_uint_t index);\n\nngx_rtmp_variable_value_t *ngx_rtmp_get_variable(ngx_rtmp_session_t *s,\n    ngx_str_t *name, ngx_uint_t key);\n\nngx_int_t ngx_rtmp_variable_unknown_header(ngx_rtmp_variable_value_t *v,\n    ngx_str_t *var, ngx_list_part_t *part, size_t prefix);\n\n\ntypedef struct {\n    ngx_hash_combined_t           hash;\n#if (NGX_PCRE)\n    ngx_rtmp_map_regex_t         *regex;\n    ngx_uint_t                    nregex;\n#endif\n} ngx_rtmp_map_t;\n\n\nvoid *ngx_rtmp_map_find(ngx_rtmp_session_t *s, ngx_rtmp_map_t *map,\n    ngx_str_t *match);\n\n\nngx_int_t ngx_rtmp_variables_add_core_vars(ngx_conf_t *cf);\nngx_int_t ngx_rtmp_variables_init_vars(ngx_conf_t *cf);\n\nngx_int_t ngx_rtmp_variable_transform_index(ngx_conf_t *cf,\n    ngx_str_t *origin, ngx_str_t *target);\nngx_int_t ngx_rtmp_fetch_variable(ngx_rtmp_session_t *s, ngx_pool_t *pool,\n                          ngx_str_t *origin, ngx_str_t *target);\n\nextern ngx_rtmp_variable_value_t  ngx_rtmp_variable_null_value;\nextern ngx_rtmp_variable_value_t  ngx_rtmp_variable_true_value;\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-rtmp-module/ngx_rtmp_version.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#ifndef _NGX_RTMP_VERSION_H_INCLUDED_\n#define _NGX_RTMP_VERSION_H_INCLUDED_\n\n\n#define nginx_rtmp_version  1001004\n#define NGINX_RTMP_VERSION  \"1.1.4\"\n\n\n#endif /* _NGX_RTMP_VERSION_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/COPYRIGHT",
    "content": "Copyright (C) 2016-2020, by Jie Wu \"AlexWoo\" <wj19840501@gmail.com>.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n1. Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\nOR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\nHOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\nLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\nOUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGE.\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/config",
    "content": "ngx_addon_name=ngx_toolkit_module\n\n\nCORE_MODULES=\"$CORE_MODULES                                     \\\n             ngx_http_dynamic_module                            \\\n             \"\n\nEVENT_MODULES=\"$EVENT_MODULES                                   \\\n              ngx_event_timer_module                            \\\n              ngx_dynamic_conf_module                           \\\n              ngx_event_resolver_module                         \\\n              ngx_dynamic_resolver_module                       \\\n              \"\n\nHTTP_MODULES=\"$HTTP_MODULES                                     \\\n             ngx_http_dynamic_core_module                       \\\n             ngx_http_trace_module                              \\\n             \"\n\nNGX_ADDON_SRCS=\"$NGX_ADDON_SRCS                                 \\\n               $ngx_addon_dir/ngx_event_timer_module.c          \\\n               $ngx_addon_dir/ngx_event_resolver.c              \\\n               $ngx_addon_dir/ngx_dynamic_resolver.c            \\\n               $ngx_addon_dir/ngx_dynamic_conf.c                \\\n               $ngx_addon_dir/ngx_http_dynamic.c                \\\n               $ngx_addon_dir/ngx_toolkit_misc.c                \\\n               $ngx_addon_dir/ngx_map.c                         \\\n               $ngx_addon_dir/ngx_rbuf.c                        \\\n               $ngx_addon_dir/ngx_poold.c                       \\\n               $ngx_addon_dir/ngx_timerd.c                      \\\n               $ngx_addon_dir/ngx_http_trace_module.c           \\\n               \"\n\nNGX_ADDON_DEPS=\"$NGX_ADDON_DEPS                                 \\\n               $ngx_addon_dir/ngx_event_timer_module.h          \\\n               $ngx_addon_dir/ngx_event_resolver.h              \\\n               $ngx_addon_dir/ngx_dynamic_resolver.h            \\\n               $ngx_addon_dir/ngx_dynamic_conf.h                \\\n               $ngx_addon_dir/ngx_http_dynamic.h                \\\n               $ngx_addon_dir/ngx_toolkit_misc.h                \\\n               $ngx_addon_dir/ngx_map.h                         \\\n               $ngx_addon_dir/ngx_rbuf.h                        \\\n               $ngx_addon_dir/ngx_poold.h                       \\\n               $ngx_addon_dir/ngx_timerd.h                      \\\n               \"\n\nCFLAGS=\"$CFLAGS -I $ngx_addon_dir\"\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_dynamic_conf.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include \"ngx_dynamic_conf.h\"\n#include \"ngx_toolkit_misc.h\"\n#include \"ngx_event_timer_module.h\"\n\n\nstatic ngx_int_t ngx_dynamic_conf_process_init(ngx_cycle_t *cycle);\n\nstatic void *ngx_dynamic_conf_module_create_conf(ngx_cycle_t *cycle);\nstatic char *ngx_dynamic_conf_module_init_conf(ngx_cycle_t *cycle, void *conf);\n\nstatic char *ngx_dynamic_conf(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\nstatic char *ngx_dynamic_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\n\n\n#define NGX_CONF_BUFFER  4096\n\nngx_uint_t  ngx_core_max_module;\n\nstatic ngx_uint_t arg_number[] = {\n    NGX_CONF_NOARGS,\n    NGX_CONF_TAKE1,\n    NGX_CONF_TAKE2,\n    NGX_CONF_TAKE3,\n    NGX_CONF_TAKE4,\n    NGX_CONF_TAKE5,\n    NGX_CONF_TAKE6,\n    NGX_CONF_TAKE7\n};\n\ntypedef struct {\n    void                      **module_conf;    /* index is module index */\n    ngx_pool_t                 *pool;           /* dynamic conf alloc pool */\n} ngx_dynamic_conf_ctx_t;\n\ntypedef struct {\n    ngx_dynamic_conf_ctx_t     *conf[2];\n    unsigned                    used;   /* 0 and 1 for index of conf */\n\n    ngx_str_t                   file;\n    ngx_msec_t                  refresh;\n    ngx_log_t                  *log;\n\n    u_char                      md5key[NGX_MD5KEY_LEN + 1];\n} ngx_dynamic_conf_conf_t;\n\n\nstatic ngx_command_t  ngx_dynamic_conf_commands[] = {\n\n    { ngx_string(\"dynamic_conf\"),\n      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_TAKE2,\n      ngx_dynamic_conf,\n      0,\n      0,\n      NULL },\n\n    { ngx_string(\"dynamic_log\"),\n      NGX_MAIN_CONF|NGX_DIRECT_CONF|NGX_CONF_1MORE,\n      ngx_dynamic_log,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nngx_core_module_t  ngx_dynamic_conf_module_ctx = {\n    ngx_string(\"dynamic_conf\"),\n    ngx_dynamic_conf_module_create_conf,\n    ngx_dynamic_conf_module_init_conf\n};\n\n\nngx_module_t  ngx_dynamic_conf_module = {\n    NGX_MODULE_V1,\n    &ngx_dynamic_conf_module_ctx,           /* module context */\n    ngx_dynamic_conf_commands,              /* module directives */\n    NGX_CORE_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    ngx_dynamic_conf_process_init,          /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_dynamic_conf_module_create_conf(ngx_cycle_t *cycle)\n{\n    ngx_dynamic_conf_conf_t    *conf;\n\n    conf = ngx_pcalloc(cycle->pool, sizeof(ngx_dynamic_conf_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->refresh = NGX_CONF_UNSET_MSEC;\n\n    return conf;\n}\n\nstatic char *\nngx_dynamic_conf_module_init_conf(ngx_cycle_t *cycle, void *conf)\n{\n    ngx_dynamic_conf_conf_t    *dccf;\n\n    dccf = conf;\n\n    ngx_conf_init_msec_value(dccf->refresh, 60000);\n\n    if (dccf->log == NULL) {\n        dccf->log = &cycle->new_log;\n    }\n\n    return NGX_CONF_OK;\n}\n\nstatic char *\nngx_dynamic_conf(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_dynamic_conf_conf_t    *dccf;\n    ngx_str_t                  *value;\n    ngx_fd_t                    fd;\n\n    dccf = conf;\n\n    if (dccf->file.len) {\n        return \"is duplicate\";\n    }\n\n    value = cf->args->elts;\n\n    dccf->file = value[1];\n\n    if (ngx_conf_full_name(cf->cycle, &dccf->file, 0)) {\n        return NGX_CONF_ERROR;\n    }\n\n    /* test file, ngx_conf_full_name will fill '\\0' at end of file name */\n    fd = ngx_open_file(dccf->file.data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);\n    if (fd == NGX_INVALID_FILE) {\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, ngx_errno, \"dynamic conf \"\n                ngx_open_file_n \" \\\"%s\\\" failed\", dccf->file.data);\n        return NGX_CONF_ERROR;\n    }\n    ngx_close_file(fd);\n\n    dccf->refresh = ngx_parse_time(&value[2], 0);\n    if (dccf->refresh == (ngx_msec_t) NGX_ERROR) {\n        return \"invalid refresh\";\n    }\n\n    dccf->used = 1;\n\n    return NGX_CONF_OK;\n}\n\nstatic char *\nngx_dynamic_log(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_dynamic_conf_conf_t    *dccf = conf;\n\n    return ngx_log_set_log(cf, &dccf->log);\n}\n\n\nstatic ngx_int_t\nngx_dynamic_conf_handler(ngx_conf_t *cf, ngx_int_t last)\n{\n    char                       *rv;\n    ngx_uint_t                  i, found;\n    ngx_str_t                  *name;\n    ngx_command_t              *cmd;\n    void                       *conf;\n\n    name = cf->args->elts;\n\n    found = 0;\n\n    for (i = 0; cf->cycle->modules[i]; ++i) {\n\n        cmd = (ngx_command_t *) cf->cycle->modules[i]->spare_hook1;\n        if (cmd == NULL) {\n            continue;\n        }\n\n        for (/* void */; cmd->name.len; ++cmd) {\n\n            if (name->len != cmd->name.len) {\n                continue;\n            }\n\n            if (ngx_strcmp(name->data, cmd->name.data) != 0) {\n                continue;\n            }\n\n            found = 1;\n\n            if (cf->cycle->modules[i]->type != NGX_CONF_MODULE\n                && cf->cycle->modules[i]->type != cf->module_type)\n            {\n                continue;\n            }\n\n            /* is the directive's location right ? */\n\n            if (!(cmd->type & cf->cmd_type)) {\n                continue;\n            }\n\n            if (!(cmd->type & NGX_CONF_BLOCK) && last != NGX_OK) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                  \"directive \\\"%s\\\" is not terminated by \\\";\\\"\",\n                                  name->data);\n                return NGX_ERROR;\n            }\n\n            if ((cmd->type & NGX_CONF_BLOCK) && last != NGX_CONF_BLOCK_START) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                   \"directive \\\"%s\\\" has no opening \\\"{\\\"\",\n                                   name->data);\n                return NGX_ERROR;\n            }\n\n            /* is the directive's argument count right ? */\n\n            if (!(cmd->type & NGX_CONF_ANY)) {\n\n                if (cmd->type & NGX_CONF_FLAG) {\n\n                    if (cf->args->nelts != 2) {\n                        goto invalid;\n                    }\n\n                } else if (cmd->type & NGX_CONF_1MORE) {\n\n                    if (cf->args->nelts < 2) {\n                        goto invalid;\n                    }\n\n                } else if (cmd->type & NGX_CONF_2MORE) {\n\n                    if (cf->args->nelts < 3) {\n                        goto invalid;\n                    }\n\n                } else if (cf->args->nelts > NGX_CONF_MAX_ARGS) {\n\n                    goto invalid;\n\n                } else if (!(cmd->type & arg_number[cf->args->nelts - 1])) {\n                    goto invalid;\n                }\n            }\n\n            /* set up the directive's configuration context */\n\n            conf = ((void **) cf->ctx)[cf->cycle->modules[i]->ctx_index];\n\n            rv = cmd->set(cf, cmd, conf);\n\n            if (rv == NGX_CONF_OK) {\n                return NGX_OK;\n            }\n\n            if (rv == NGX_CONF_ERROR) {\n                return NGX_ERROR;\n            }\n\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                    \"\\\"%s\\\" directive %s\", name->data, rv);\n\n            return NGX_ERROR;\n        }\n    }\n\n    if (found) {\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                \"\\\"%s\\\" directive is not allowed here\", name->data);\n\n        return NGX_ERROR;\n    }\n\n    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n            \"unknown directive \\\"%s\\\"\", name->data);\n\n    return NGX_ERROR;\n\ninvalid:\n\n    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n            \"invalid number of arguments in \\\"%s\\\" directive\",\n            name->data);\n\n    return NGX_ERROR;\n}\n\n/* same as ngx_conf_read_token in ngx_conf_file.c */\nstatic ngx_int_t\nngx_dynamic_conf_read_token(ngx_conf_t *cf)\n{\n    u_char                     *start, ch, *src, *dst;\n    off_t                       file_size;\n    size_t                      len;\n    ssize_t                     n, size;\n    ngx_uint_t                  found, need_space, last_space, sharp_comment,\n                                variable;\n    ngx_uint_t                  quoted, s_quoted, d_quoted, start_line;\n    ngx_str_t                  *word;\n    ngx_buf_t                  *b;\n\n    found = 0;\n    need_space = 0;\n    last_space = 1;\n    sharp_comment = 0;\n    variable = 0;\n    quoted = 0;\n    s_quoted = 0;\n    d_quoted = 0;\n\n    cf->args->nelts = 0;\n    b = cf->conf_file->buffer;\n    start = b->pos;\n    start_line = cf->conf_file->line;\n\n    file_size = ngx_file_size(&cf->conf_file->file.info);\n\n    for ( ;; ) {\n\n        if (b->pos >= b->last) {\n\n            if (cf->conf_file->file.offset >= file_size) {\n\n                if (cf->args->nelts > 0 || !last_space) {\n\n                    if (cf->conf_file->file.fd == NGX_INVALID_FILE) {\n                        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                           \"unexpected end of parameter, \"\n                                           \"expecting \\\";\\\"\");\n                        return NGX_ERROR;\n                    }\n\n                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                  \"unexpected end of file, \"\n                                  \"expecting \\\";\\\" or \\\"}\\\"\");\n                    return NGX_ERROR;\n                }\n\n                return NGX_CONF_FILE_DONE;\n            }\n\n            len = b->pos - start;\n\n            if (len == NGX_CONF_BUFFER) {\n                cf->conf_file->line = start_line;\n\n                if (d_quoted) {\n                    ch = '\"';\n\n                } else if (s_quoted) {\n                    ch = '\\'';\n\n                } else {\n                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                       \"too long parameter \\\"%*s...\\\" started\",\n                                       10, start);\n                    return NGX_ERROR;\n                }\n\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                   \"too long parameter, probably \"\n                                   \"missing terminating \\\"%c\\\" character\", ch);\n                return NGX_ERROR;\n            }\n\n            if (len) {\n                ngx_memmove(b->start, start, len);\n            }\n\n            size = (ssize_t) (file_size - cf->conf_file->file.offset);\n\n            if (size > b->end - (b->start + len)) {\n                size = b->end - (b->start + len);\n            }\n\n            n = ngx_read_file(&cf->conf_file->file, b->start + len, size,\n                              cf->conf_file->file.offset);\n\n            if (n == NGX_ERROR) {\n                return NGX_ERROR;\n            }\n\n            if (n != size) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                   ngx_read_file_n \" returned \"\n                                   \"only %z bytes instead of %z\",\n                                   n, size);\n                return NGX_ERROR;\n            }\n\n            b->pos = b->start + len;\n            b->last = b->pos + n;\n            start = b->start;\n        }\n\n        ch = *b->pos++;\n\n        if (ch == LF) {\n            cf->conf_file->line++;\n\n            if (sharp_comment) {\n                sharp_comment = 0;\n            }\n        }\n\n        if (sharp_comment) {\n            continue;\n        }\n\n        if (quoted) {\n            quoted = 0;\n            continue;\n        }\n\n        if (need_space) {\n            if (ch == ' ' || ch == '\\t' || ch == CR || ch == LF) {\n                last_space = 1;\n                need_space = 0;\n                continue;\n            }\n\n            if (ch == ';') {\n                return NGX_OK;\n            }\n\n            if (ch == '{') {\n                return NGX_CONF_BLOCK_START;\n            }\n\n            if (ch == ')') {\n                last_space = 1;\n                need_space = 0;\n\n            } else {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                   \"unexpected \\\"%c\\\"\", ch);\n                return NGX_ERROR;\n            }\n        }\n\n        if (last_space) {\n            if (ch == ' ' || ch == '\\t' || ch == CR || ch == LF) {\n                continue;\n            }\n\n            start = b->pos - 1;\n            start_line = cf->conf_file->line;\n\n            switch (ch) {\n\n            case ';':\n            case '{':\n                if (cf->args->nelts == 0) {\n                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                       \"unexpected \\\"%c\\\"\", ch);\n                    return NGX_ERROR;\n                }\n\n                if (ch == '{') {\n                    return NGX_CONF_BLOCK_START;\n                }\n\n                return NGX_OK;\n\n            case '}':\n                if (cf->args->nelts != 0) {\n                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                       \"unexpected \\\"}\\\"\");\n                    return NGX_ERROR;\n                }\n\n                return NGX_CONF_BLOCK_DONE;\n\n            case '#':\n                sharp_comment = 1;\n                continue;\n\n            case '\\\\':\n                quoted = 1;\n                last_space = 0;\n                continue;\n\n            case '\"':\n                start++;\n                d_quoted = 1;\n                last_space = 0;\n                continue;\n\n            case '\\'':\n                start++;\n                s_quoted = 1;\n                last_space = 0;\n                continue;\n\n            default:\n                last_space = 0;\n            }\n\n        } else {\n            if (ch == '{' && variable) {\n                continue;\n            }\n\n            variable = 0;\n\n            if (ch == '\\\\') {\n                quoted = 1;\n                continue;\n            }\n\n            if (ch == '$') {\n                variable = 1;\n                continue;\n            }\n\n            if (d_quoted) {\n                if (ch == '\"') {\n                    d_quoted = 0;\n                    need_space = 1;\n                    found = 1;\n                }\n\n            } else if (s_quoted) {\n                if (ch == '\\'') {\n                    s_quoted = 0;\n                    need_space = 1;\n                    found = 1;\n                }\n\n            } else if (ch == ' ' || ch == '\\t' || ch == CR || ch == LF\n                       || ch == ';' || ch == '{')\n            {\n                last_space = 1;\n                found = 1;\n            }\n\n            if (found) {\n                word = ngx_array_push(cf->args);\n                if (word == NULL) {\n                    return NGX_ERROR;\n                }\n\n                word->data = ngx_pnalloc(cf->pool, b->pos - 1 - start + 1);\n                if (word->data == NULL) {\n                    return NGX_ERROR;\n                }\n\n                for (dst = word->data, src = start, len = 0;\n                     src < b->pos - 1;\n                     len++)\n                {\n                    if (*src == '\\\\') {\n                        switch (src[1]) {\n                        case '\"':\n                        case '\\'':\n                        case '\\\\':\n                            src++;\n                            break;\n\n                        case 't':\n                            *dst++ = '\\t';\n                            src += 2;\n                            continue;\n\n                        case 'r':\n                            *dst++ = '\\r';\n                            src += 2;\n                            continue;\n\n                        case 'n':\n                            *dst++ = '\\n';\n                            src += 2;\n                            continue;\n                        }\n\n                    }\n                    *dst++ = *src++;\n                }\n                *dst = '\\0';\n                word->len = len;\n\n                if (ch == ';') {\n                    return NGX_OK;\n                }\n\n                if (ch == '{') {\n                    return NGX_CONF_BLOCK_START;\n                }\n\n                found = 0;\n            }\n        }\n    }\n}\n\nngx_int_t\nngx_dynamic_conf_parse(ngx_conf_t *cf, unsigned init)\n{\n    ngx_int_t                   rc;\n    enum {\n        parse_init = 0,\n        parse_block\n    } type;\n\n    type = init ? parse_init : parse_block;\n\n    for (;;) {\n        rc = ngx_dynamic_conf_read_token(cf);\n\n\t\t/*\n         * ngx_conf_read_token() may return\n         *\n         *    NGX_ERROR             there is error\n         *    NGX_OK                the token terminated by \";\" was found\n         *    NGX_CONF_BLOCK_START  the token terminated by \"{\" was found\n         *    NGX_CONF_BLOCK_DONE   the \"}\" was found\n         *    NGX_CONF_FILE_DONE    the configuration file is done\n         */\n\n        if (rc == NGX_ERROR) {\n            return NGX_ERROR;\n        }\n\n        if (rc == NGX_CONF_BLOCK_DONE) {\n\n            if (type != parse_block) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, \"unexpected \\\"}\\\"\");\n                return NGX_ERROR;\n            }\n\n            return NGX_OK;\n        }\n\n        if (rc == NGX_CONF_FILE_DONE) {\n\n            if (type == parse_block) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                        \"unexpected end of file, expecting \\\"}\\\"\");\n                return NGX_ERROR;\n            }\n\n            return NGX_OK;\n        }\n\n        rc = ngx_dynamic_conf_handler(cf, rc);\n\n        if (rc == NGX_ERROR) {\n            return NGX_ERROR;\n        }\n    }\n}\n\nstatic ngx_int_t\nngx_dynamic_conf_load_conf(ngx_fd_t fd, ngx_dynamic_conf_conf_t *dccf)\n{\n    ngx_dynamic_conf_ctx_t     *conf;\n    ngx_dynamic_core_module_t  *module;\n    ngx_pool_t                 *pool;\n    ngx_conf_t                  cf;\n    ngx_buf_t                   buf;\n    ngx_conf_file_t             conf_file;\n    u_char                      buffer[NGX_CONF_BUFFER];\n    ngx_uint_t                  i;\n    void                       *rv;\n\n    ngx_memzero(&cf, sizeof(ngx_conf_t));\n\n    pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, dccf->log);\n    if (pool == NULL) {\n        return NGX_ERROR;\n    }\n    pool->log = dccf->log;\n\n    conf = ngx_pcalloc(pool, sizeof(ngx_dynamic_conf_ctx_t));\n    if (conf == NULL) {\n        goto failed;\n    }\n    conf->pool = pool;\n\n    ngx_core_max_module = ngx_count_modules((ngx_cycle_t *) ngx_cycle,\n                                            NGX_CORE_MODULE);\n\n    conf->module_conf = ngx_pcalloc(pool, sizeof(void *) * ngx_core_max_module);\n    if (conf->module_conf == NULL) {\n        goto failed;\n    }\n\n    cf.args = ngx_array_create(pool, 10, sizeof(ngx_str_t));\n    if (cf.args == NULL) {\n        goto failed;\n    }\n\n    cf.temp_pool = ngx_create_pool(NGX_CYCLE_POOL_SIZE, dccf->log);\n    if (cf.temp_pool == NULL) {\n        goto failed;\n    }\n\n    cf.ctx = conf->module_conf;\n    cf.cycle = (ngx_cycle_t *) ngx_cycle;\n    cf.pool = pool;\n    cf.log = dccf->log;\n    cf.module_type = NGX_CORE_MODULE;\n    cf.cmd_type = NGX_MAIN_CONF;\n\n    cf.conf_file = &conf_file;\n\n    if (ngx_fd_info(fd, &cf.conf_file->file.info) == NGX_FILE_ERROR) {\n        ngx_log_error(NGX_LOG_EMERG, cf.log, ngx_errno,\n                ngx_fd_info_n \" failed\");\n    }\n\n    cf.conf_file->buffer = &buf;\n\n    buf.pos = buf.last = buf.start = buffer;\n    buf.end = buf.start + NGX_CONF_BUFFER;\n    buf.temporary = 1;\n\n    cf.conf_file->file.fd = fd;\n    cf.conf_file->file.name.len = dccf->file.len;\n    cf.conf_file->file.name.data = dccf->file.data;\n    cf.conf_file->file.offset = 0;\n    cf.conf_file->file.log = cf.log;\n    cf.conf_file->line = 1;\n\n    for (i = 0; ngx_cycle->modules[i]; ++i) {\n        if (ngx_cycle->modules[i]->type != NGX_CORE_MODULE) {\n            continue;\n        }\n\n        module = (ngx_dynamic_core_module_t *)\n                    ngx_cycle->modules[i]->spare_hook0;\n        if (module == NULL) { /* dctx not configured */\n            continue;\n        }\n\n        if (module->create_conf) {\n            rv = module->create_conf(&cf);\n            if (rv == NULL) {\n                goto failed;\n            }\n            conf->module_conf[ngx_cycle->modules[i]->ctx_index] = rv;\n        }\n    }\n\n    if (ngx_dynamic_conf_parse(&cf, 1) != NGX_OK) {\n        goto failed;\n    }\n\n    for (i = 0; ngx_cycle->modules[i]; ++i) {\n        if (ngx_cycle->modules[i]->type != NGX_CORE_MODULE) {\n            continue;\n        }\n\n        module = (ngx_dynamic_core_module_t *) ngx_cycle->modules[i]->\n                                               spare_hook0;\n        if (module == NULL) {\n            continue;\n        }\n\n        if (module->init_conf) {\n\n            rv = conf->module_conf[ngx_cycle->modules[i]->ctx_index];\n            if (module->init_conf(&cf, rv) == NGX_CONF_ERROR) {\n                goto failed;\n            }\n        }\n    }\n\n    /* load conf ok, switch conf to new conf */\n    if (dccf->conf[dccf->used]) {\n        pool = dccf->conf[dccf->used]->pool;\n        dccf->conf[dccf->used] = NULL;\n        ngx_destroy_pool(pool);\n    }\n\n    dccf->used = dccf->used ? 0 : 1;\n    dccf->conf[dccf->used] = conf;\n\n    return NGX_OK;\n\nfailed:\n    if (cf.temp_pool) {\n        ngx_destroy_pool(cf.temp_pool);\n    }\n\n    ngx_destroy_pool(pool);\n\n    return NGX_ERROR;\n}\n\nstatic void\nngx_dynamic_conf_check_conf(void *data)\n{\n    ngx_dynamic_conf_conf_t    *dccf;\n    ngx_fd_t                    fd;\n    u_char                      md5key[NGX_MD5KEY_LEN];\n    NGX_START_TIMING\n\n    dccf = data;\n\n    if (ngx_exiting) { /* avoid nginx reload worker hungup */\n        return;\n    }\n\n    fd = ngx_open_file(dccf->file.data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);\n    if (fd == NGX_INVALID_FILE) {\n        ngx_log_error(NGX_LOG_ERR, dccf->log, ngx_errno,\n                ngx_open_file_n \"\\\"%V\\\" failed\", &dccf->file);\n        goto done;\n    }\n\n    /* check md5key for dynamic conf file */\n    if (ngx_md5_file(fd, md5key) == NGX_ERROR) {\n        ngx_log_error(NGX_LOG_ERR, dccf->log, 0, \"md5 file \\\"%V\\\" failed\",\n                &dccf->file);\n        goto done;\n    }\n\n    if (ngx_memcmp(dccf->md5key, md5key, NGX_MD5KEY_LEN) == 0) {\n        ngx_log_debug1(NGX_LOG_DEBUG_CORE, dccf->log, 0,\n                \"\\\"%V\\\" md5key not change\", &dccf->file);\n        goto done;\n    }\n\n    /* parse dynamic conf */\n    if (ngx_dynamic_conf_load_conf(fd, dccf) != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, dccf->log, 0, \"load file \\\"%V\\\" failed\",\n                &dccf->file);\n        goto done;\n    }\n\n    ngx_memcpy(dccf->md5key, md5key, NGX_MD5KEY_LEN);\n\n    ngx_log_error(NGX_LOG_INFO, dccf->log, 0,\n            \"dynamic conf load successd, md5key: \\\"%s\\\"\", dccf->md5key);\n\ndone:\n    ngx_close_file(fd);\n\n    ngx_event_timer_add_timer(dccf->refresh, ngx_dynamic_conf_check_conf, dccf);\n\n    NGX_STOP_TIMING(dccf->log, \"ngx_dynamic_conf_check_conf\")\n}\n\nstatic ngx_int_t ngx_dynamic_conf_process_init(ngx_cycle_t *cycle)\n{\n    ngx_dynamic_conf_conf_t    *dccf;\n    ngx_fd_t                    fd;\n    u_char                      md5key[NGX_MD5KEY_LEN];\n\n    NGX_START_TIMING\n\n    dccf = (ngx_dynamic_conf_conf_t *) ngx_get_conf(cycle->conf_ctx,\n                                                    ngx_dynamic_conf_module);\n\n    if (dccf->file.len == 0) { /* dynamic conf not configured */\n        return NGX_OK;\n    }\n\n    fd = ngx_open_file(dccf->file.data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);\n    if (fd == NGX_INVALID_FILE) {\n        ngx_log_error(NGX_LOG_ERR, dccf->log, ngx_errno,\n                ngx_open_file_n \"\\\"%V\\\" failed\", &dccf->file);\n        return NGX_ERROR;\n    }\n\n    /* parse dynamic conf */\n    if (ngx_dynamic_conf_load_conf(fd, dccf) != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, dccf->log, 0, \"load file \\\"%V\\\" failed\",\n                &dccf->file);\n        return NGX_ERROR;\n    }\n\n    /* calc md5key for dynamic conf file */\n    if (ngx_md5_file(fd, md5key) == NGX_ERROR) {\n        ngx_log_error(NGX_LOG_ERR, dccf->log, 0, \"md5 file \\\"%V\\\" failed\",\n                &dccf->file);\n        return NGX_ERROR;\n    }\n\n    ngx_close_file(fd);\n\n    ngx_memcpy(dccf->md5key, md5key, NGX_MD5KEY_LEN);\n\n    ngx_log_error(NGX_LOG_INFO, dccf->log, 0,\n            \"dynamic conf load successd, md5key: \\\"%s\\\"\", dccf->md5key);\n\n    /* add dynamic conf parse timer */\n    ngx_event_timer_add_timer(dccf->refresh, ngx_dynamic_conf_check_conf, dccf);\n\n    NGX_STOP_TIMING(dccf->log, \"ngx_dynamic_conf_process_init\")\n\n    return NGX_OK;\n}\n\n#if (NGX_PCRE)\nngx_dynamic_regex_t *\nngx_dynamic_regex_compile(ngx_conf_t *cf, ngx_regex_compile_t *rc)\n{\n    ngx_dynamic_regex_t        *re;\n\n    rc->pool = cf->pool;\n\n    if (ngx_regex_compile(rc) != NGX_OK) {\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0, \"%V\", &rc->err);\n        return NULL;\n    }\n\n    re = ngx_pcalloc(cf->pool, sizeof(ngx_regex_elt_t));\n    if (re == NULL) {\n        return NULL;\n    }\n\n    re->regex = rc->regex;\n    re->name = rc->pattern;\n\n    return re;\n}\n#endif\n\nint\nngx_dynamic_cmp_dns_wildcards(const void *one, const void *two)\n{\n    ngx_hash_key_t  *first, *second;\n\n    first = (ngx_hash_key_t *) one;\n    second = (ngx_hash_key_t *) two;\n\n    return ngx_dns_strcmp(first->key.data, second->key.data);\n}\n\nvoid *\nngx_get_dconf(ngx_module_t *m)\n{\n    ngx_dynamic_conf_conf_t    *dccf;\n\n    dccf = (ngx_dynamic_conf_conf_t *) ngx_get_conf(ngx_cycle->conf_ctx,\n                                                    ngx_dynamic_conf_module);\n\n    if (dccf->conf[dccf->used] == 0) {  /* dynamic conf not configured */\n        return NULL;\n    }\n\n    return dccf->conf[dccf->used]->module_conf[m->ctx_index];\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_dynamic_conf.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n\n#ifndef _NGX_DYNAMIC_COMMAND_H_INCLUDED_\n#define _NGX_DYNAMIC_COMMAND_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_event.h>\n\n\ntypedef struct {\n    ngx_str_t               name;\n    void                 *(*create_conf)(ngx_conf_t *cf);\n    char                 *(*init_conf)(ngx_conf_t *cf, void *conf);\n} ngx_dynamic_core_module_t;\n\n\n#if (NGX_PCRE)\ntypedef struct {\n    ngx_regex_t            *regex;\n    ngx_str_t               name;\n} ngx_dynamic_regex_t;\n#endif\n\n#if 0\n/*\n * if use dynamic conf, module define should use\n *  NGX_MODULE_V1_DYNAMIC_PADDING and set\n *  module dynamic context and\n *  module dynamic directives as bellow\n */\nngx_module_t  ngx_test_module = {\n    NGX_MODULE_V1,\n    &ngx_test_module_ctx,                   /* module context */\n    ngx_test_commands,                      /* module directives */\n    NGX_CORE_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    &ngx_test_module_dctx,                  /* module dynamic context */\n    ngx_test_dcommands,                     /* module dynamic directives */\n    NGX_MODULE_V1_DYNAMIC_PADDING\n};\n#endif\n#define NGX_MODULE_V1_DYNAMIC_PADDING  0, 0, 0, 0, 0, 0\n\nextern ngx_uint_t  ngx_core_max_module;\n\n/*\n * return value:\n *      return NGX_OK for successd, NGX_ERROR for failed\n * paras:\n *      cf:   ngx_conf_t passed from ngx_dynamic_conf_load_conf\n *      init: only ngx_dynamic_conf_load_conf set 1, otherwise set 0\n */\nngx_int_t ngx_dynamic_conf_parse(ngx_conf_t *cf, unsigned init);\n\n/*\n * return value:\n *      return regex context\n * paras:\n *      cf: ngx_conf_t passed in dynamic cmd handler\n *      rc: regex options\n */\n#if (NGX_PCRE)\nngx_dynamic_regex_t *ngx_dynamic_regex_compile(ngx_conf_t *cf,\n        ngx_regex_compile_t *rc);\n#endif\n\nint ngx_dynamic_cmp_dns_wildcards(const void *one, const void *two);\n\nvoid *ngx_get_dconf(ngx_module_t *m);\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_dynamic_resolver.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_event.h>\n#include \"ngx_event_timer_module.h\"\n#include \"ngx_event_resolver.h\"\n#include \"ngx_dynamic_resolver.h\"\n#include \"ngx_toolkit_misc.h\"\n\n\nstatic ngx_int_t ngx_dynamic_resolver_process_init(ngx_cycle_t *cycle);\n\nstatic void *ngx_dynamic_resolver_create_conf(ngx_cycle_t *cycle);\nstatic char *ngx_dynamic_resolver_init_conf(ngx_cycle_t *cycle, void *conf);\n\n\n#define MAX_DOMAIN_LEN      128\n#define MAX_ADDRS           8\n\n\ntypedef struct ngx_dynamic_resolver_ctx_s       ngx_dynamic_resolver_ctx_t;\ntypedef struct ngx_dynamic_resolver_domain_s    ngx_dynamic_resolver_domain_t;\n\nstruct ngx_dynamic_resolver_ctx_s {\n    ngx_dynamic_resolver_handler_pt     h;\n    void                               *data;\n\n    ngx_dynamic_resolver_ctx_t         *next;\n};\n\ntypedef struct {\n    struct sockaddr                     sockaddr;\n    socklen_t                           socklen;\n    u_short                             priority;\n    u_short                             weight;\n} ngx_dynamic_resolver_addr_t;\n\nstruct ngx_dynamic_resolver_domain_s {\n    ngx_str_t                           domain;\n    u_char                              domain_cstr[MAX_DOMAIN_LEN];\n\n    ngx_uint_t                          naddrs;\n    ngx_dynamic_resolver_addr_t         addrs[MAX_ADDRS];\n\n    ngx_dynamic_resolver_ctx_t         *ctx;\n\n    ngx_dynamic_resolver_domain_t      *next;\n};\n\ntypedef struct {\n    ngx_msec_t                          refresh_interval;\n\n    size_t                              domain_buckets;\n    ngx_dynamic_resolver_domain_t     **resolver_hash;\n\n    ngx_dynamic_resolver_ctx_t         *free_ctx;\n    ngx_dynamic_resolver_domain_t      *free_domain;\n\n    ngx_uint_t                          nalloc_ctx;\n    ngx_uint_t                          nfree_ctx;\n    ngx_uint_t                          nalloc_domain;\n    ngx_uint_t                          nfree_domain;\n} ngx_dynamic_resolver_conf_t;\n\n\nstatic ngx_str_t dynamic_resolver_name = ngx_string(\"dynamic_resolver\");\n\n\nstatic ngx_command_t ngx_dynamic_resolver_commands[] = {\n\n    { ngx_string(\"dynamic_refresh_interval\"),\n      NGX_EVENT_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      0,\n      offsetof(ngx_dynamic_resolver_conf_t, refresh_interval),\n      NULL },\n\n    { ngx_string(\"dynamic_domain_buckets\"),\n      NGX_EVENT_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      0,\n      offsetof(ngx_dynamic_resolver_conf_t, domain_buckets),\n      NULL },\n\n      ngx_null_command\n};\n\n\nngx_event_module_t  ngx_dynamic_resolver_module_ctx = {\n    &dynamic_resolver_name,\n    ngx_dynamic_resolver_create_conf,         /* create configuration */\n    ngx_dynamic_resolver_init_conf,           /* init configuration */\n\n    { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }\n};\n\n\n/* this module use ngx_cycle->log */\nngx_module_t  ngx_dynamic_resolver_module = {\n    NGX_MODULE_V1,\n    &ngx_dynamic_resolver_module_ctx,         /* module context */\n    ngx_dynamic_resolver_commands,            /* module directives */\n    NGX_EVENT_MODULE,                       /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    ngx_dynamic_resolver_process_init,        /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_dynamic_resolver_create_conf(ngx_cycle_t *cycle)\n{\n    ngx_dynamic_resolver_conf_t      *conf;\n\n    conf = ngx_pcalloc(cycle->pool, sizeof(ngx_dynamic_resolver_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->refresh_interval = NGX_CONF_UNSET_MSEC;\n    conf->domain_buckets = NGX_CONF_UNSET_UINT;\n\n    return conf;\n}\n\nstatic char *\nngx_dynamic_resolver_init_conf(ngx_cycle_t *cycle, void *conf)\n{\n    ngx_dynamic_resolver_conf_t      *drcf = conf;\n\n    ngx_conf_init_msec_value(drcf->refresh_interval, 5000);\n    ngx_conf_init_uint_value(drcf->domain_buckets, 101);\n\n    if (drcf->refresh_interval > 0 && drcf->domain_buckets > 0) {\n        drcf->resolver_hash = ngx_pcalloc(cycle->pool,\n            sizeof(ngx_dynamic_resolver_domain_t *) * drcf->domain_buckets);\n    }\n\n    return NGX_CONF_OK;\n}\n\n/* reuse for ngx_dynamic_resolver_ctx_t */\nstatic ngx_dynamic_resolver_ctx_t *\nngx_dynamic_resolver_get_ctx(ngx_cycle_t *cycle)\n{\n    ngx_dynamic_resolver_conf_t    *drcf;\n    ngx_dynamic_resolver_ctx_t     *ctx;\n\n    drcf = ngx_event_get_conf(cycle->conf_ctx, ngx_dynamic_resolver_module);\n\n    ctx = drcf->free_ctx;\n\n    if (ctx == NULL) {\n        ctx = ngx_pcalloc(cycle->pool, sizeof(ngx_dynamic_resolver_ctx_t));\n\n        if (ctx == NULL) {\n            ngx_log_error(NGX_LOG_ERR, cycle->log, 0, \"dynamic resolver, \"\n                    \"alloc memory dynamic resolver ctx failed\");\n            return NULL;\n        }\n        ++drcf->nalloc_ctx;\n    } else {\n        drcf->free_ctx = drcf->free_ctx->next;\n        ngx_memzero(ctx, sizeof(ngx_dynamic_resolver_ctx_t));\n        --drcf->nfree_ctx;\n    }\n\n    return ctx;\n}\n\nstatic void\nngx_dynamic_resolver_put_ctx(ngx_dynamic_resolver_ctx_t *ctx,\n        ngx_cycle_t *cycle)\n{\n    ngx_dynamic_resolver_conf_t    *drcf;\n\n    drcf = ngx_event_get_conf(cycle->conf_ctx, ngx_dynamic_resolver_module);\n\n    ctx->next = drcf->free_ctx;\n    drcf->free_ctx = ctx;\n    ++drcf->nfree_ctx;\n}\n\n/* reuse for ngx_dynamic_resolver_domain_t */\nstatic ngx_dynamic_resolver_domain_t *\nngx_dynamic_resolver_get_domain(ngx_cycle_t *cycle)\n{\n    ngx_dynamic_resolver_conf_t    *drcf;\n    ngx_dynamic_resolver_domain_t  *domain;\n\n    drcf = ngx_event_get_conf(cycle->conf_ctx, ngx_dynamic_resolver_module);\n\n    domain = drcf->free_domain;\n\n    if (domain == NULL) {\n        domain = ngx_pcalloc(cycle->pool,\n                             sizeof(ngx_dynamic_resolver_domain_t));\n\n        if (domain == NULL) {\n            ngx_log_error(NGX_LOG_ERR, cycle->log, 0, \"dynamic resolver, \"\n                    \"alloc memory dynamic resolver domain failed\");\n            return NULL;\n        }\n        ++drcf->nalloc_domain;\n    } else {\n        drcf->free_domain = drcf->free_domain->next;\n        ngx_memzero(domain, sizeof(ngx_dynamic_resolver_domain_t));\n        --drcf->nfree_domain;\n    }\n\n    return domain;\n}\n\nstatic void\nngx_dynamic_resolver_put_domain(ngx_dynamic_resolver_domain_t *domain,\n        ngx_cycle_t *cycle)\n{\n    ngx_dynamic_resolver_conf_t    *drcf;\n\n    drcf = ngx_event_get_conf(cycle->conf_ctx, ngx_dynamic_resolver_module);\n\n    domain->next = drcf->free_domain;\n    drcf->free_domain = domain;\n    ++drcf->nfree_domain;\n}\n\n\nstatic void\nngx_dynamic_resolver_on_result(void *data, ngx_resolver_addr_t *addrs,\n        ngx_uint_t naddrs)\n{\n    ngx_dynamic_resolver_domain_t  *domain;\n    ngx_dynamic_resolver_ctx_t     *ctx;\n    ngx_uint_t                      i, n;\n\n    domain = data;\n\n    if (domain == NULL) {\n        ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, \"dynamic resolver, \"\n                \"%V has been deleted\", &domain->domain);\n        return;\n    }\n\n    if (naddrs == 0) {\n        ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, \"dynamic resolver, \"\n                \"domain '%V' resolver failed\", &domain->domain);\n\n        while (domain->ctx) {\n            ctx = domain->ctx;\n            domain->ctx = ctx->next;\n\n            ctx->h(ctx->data, NULL, 0);\n            ngx_dynamic_resolver_put_ctx(ctx, (ngx_cycle_t *) ngx_cycle);\n        }\n\n        return;\n    }\n\n    domain->naddrs = ngx_min(naddrs, MAX_ADDRS);\n    for (i = 0; i < domain->naddrs; ++i) {\n        ngx_memcpy(&domain->addrs[i].sockaddr, addrs[i].sockaddr,\n                   addrs[i].socklen);\n        domain->addrs[i].socklen = addrs[i].socklen;\n        domain->addrs[i].priority = addrs[i].priority;\n        domain->addrs[i].weight = addrs[i].weight;\n\n        n = ngx_random() % domain->naddrs;\n\n        while (domain->ctx) {\n            ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,\n                    \"dynamic resolver, resolver '%V' successd\",\n                    &domain->domain);\n            ctx = domain->ctx;\n            domain->ctx = ctx->next;\n\n            ctx->h(ctx->data, &domain->addrs[n].sockaddr,\n                   domain->addrs[n].socklen);\n            ngx_dynamic_resolver_put_ctx(ctx, (ngx_cycle_t *) ngx_cycle);\n\n            ++n;\n            n %= domain->naddrs;\n        }\n    }\n}\n\nstatic void\nngx_dynamic_resolver_on_timer(void *data)\n{\n    ngx_dynamic_resolver_conf_t    *drcf;\n    ngx_dynamic_resolver_domain_t  *domain;\n    ngx_uint_t                      i;\n\n    if (ngx_exiting) {\n        return;\n    }\n\n    drcf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_dynamic_resolver_module);\n\n    for (i = 0; i < drcf->domain_buckets; ++i) {\n        domain = drcf->resolver_hash[i];\n        while (domain) {\n            ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,\n                    \"dynamic resolver, on timer start resolver %V\",\n                    &domain->domain);\n\n            ngx_event_resolver_start_resolver(&domain->domain,\n                    ngx_dynamic_resolver_on_result, domain);\n            domain = domain->next;\n        }\n    }\n\n    ngx_event_timer_add_timer(drcf->refresh_interval,\n            ngx_dynamic_resolver_on_timer, NULL);\n}\n\nstatic ngx_int_t\nngx_dynamic_resolver_process_init(ngx_cycle_t *cycle)\n{\n    ngx_dynamic_resolver_conf_t      *drcf;\n\n    drcf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_dynamic_resolver_module);\n    if (drcf->refresh_interval == 0) {\n        return NGX_OK;\n    }\n\n    ngx_event_timer_add_timer(0, ngx_dynamic_resolver_on_timer, NULL);\n\n    return NGX_OK;\n}\n\n\nvoid\nngx_dynamic_resolver_add_domain(ngx_str_t *domain, ngx_cycle_t *cycle)\n{\n    ngx_dynamic_resolver_conf_t    *drcf;\n    ngx_dynamic_resolver_domain_t  *d;\n    ngx_uint_t                      idx;\n    struct sockaddr                 sa;\n    socklen_t                       len;\n    u_char                          temp[MAX_DOMAIN_LEN];\n\n    if (domain == NULL || domain->len == 0) {\n        ngx_log_error(NGX_LOG_ERR, cycle->log, 0,\n                \"dynamic resolver add, domain is NULL\");\n        return;\n    }\n\n    len = ngx_sock_pton(&sa, domain->data, domain->len);\n    /* addr is IP address */\n    if (len) {\n        ngx_log_error(NGX_LOG_DEBUG_CORE, cycle->log, 0,\n                \"dynamic resolver add, domain is ipv4/ipv6/unix address\");\n\n        return;\n    }\n\n    drcf = ngx_event_get_conf(cycle->conf_ctx, ngx_dynamic_resolver_module);\n    if (drcf->refresh_interval == 0) {\n        ngx_log_error(NGX_LOG_ERR, cycle->log, 0, \"dynamic resolver add, \"\n                \"dynamic resolver closed when add domain\");\n        return;\n    }\n\n    if (domain->len > MAX_DOMAIN_LEN) {\n        ngx_log_error(NGX_LOG_ERR, cycle->log, 0, \"dynamic resolver add, \"\n                \"domain length(%z) is too long\", domain->len);\n        return;\n    }\n\n    ngx_memzero(temp, MAX_DOMAIN_LEN);\n    idx = ngx_hash_strlow(temp, domain->data, domain->len);\n    idx %= drcf->domain_buckets;\n\n    ngx_log_debug2(NGX_LOG_DEBUG_CORE, cycle->log, 0, \"dynamic resolver add, \"\n            \"prepare add %V in %d slot\", domain, idx);\n\n    for (d = drcf->resolver_hash[idx]; d; d = d->next) {\n\n        if (d->domain.len == domain->len &&\n            ngx_memcmp(d->domain.data, temp, domain->len) == 0)\n        {\n            ngx_log_debug1(NGX_LOG_DEBUG_CORE, cycle->log, 0,\n                    \"dynamic resolver add, %V is in dynamic resolv hash table\",\n                    domain);\n            return;\n        }\n    }\n\n    d = ngx_dynamic_resolver_get_domain(cycle);\n    if (d == NULL) {\n        return;\n    }\n\n    /* add domain in dynamic resolver */\n    d->next = drcf->resolver_hash[idx];\n    drcf->resolver_hash[idx] = d;\n\n    ngx_memcpy(d->domain_cstr, temp, MAX_DOMAIN_LEN);\n    d->domain.data = d->domain_cstr;\n    d->domain.len = domain->len;\n}\n\nvoid\nngx_dynamic_resolver_del_domain(ngx_str_t *domain)\n{\n    ngx_dynamic_resolver_conf_t    *drcf;\n    ngx_dynamic_resolver_domain_t **pd, *d;\n    ngx_dynamic_resolver_ctx_t     *ctx;\n    ngx_uint_t                      idx;\n    struct sockaddr                 sa;\n    socklen_t                       len;\n    u_char                          temp[MAX_DOMAIN_LEN];\n\n    if (domain == NULL || domain->len == 0) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"dynamic resolver del, domain is NULL\");\n        return;\n    }\n\n    len = ngx_sock_pton(&sa, domain->data, domain->len);\n    /* addr is IP address */\n    if (len) {\n        ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,\n                \"dynamic resolver del, domain is ipv4/ipv6/unix address\");\n\n        return;\n    }\n\n    drcf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_dynamic_resolver_module);\n    if (drcf->refresh_interval == 0) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"dynamic resolver del, \"\n                \"dynamic resolver closed when del domain\");\n        return;\n    }\n\n    if (domain->len > MAX_DOMAIN_LEN) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"dynamic resolver del, \"\n                \"domain length(%z) is too long\", domain->len);\n        return;\n    }\n\n    ngx_memzero(temp, MAX_DOMAIN_LEN);\n    idx = ngx_hash_strlow(temp, domain->data, domain->len);\n    idx %= drcf->domain_buckets;\n\n    ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, \"dynamic resolver del, \"\n            \"prepare del %V in %d slot\", domain, idx);\n\n    for (pd = &drcf->resolver_hash[idx]; *pd; pd = &(*pd)->next) {\n\n        if ((*pd)->domain.len == domain->len &&\n            ngx_memcmp((*pd)->domain.data, temp, domain->len) == 0)\n        {\n            d= *pd;\n            *pd = (*pd)->next;\n\n            while (d->ctx) {\n                ctx = d->ctx;\n                d->ctx = ctx->next;\n\n                ctx->h(ctx->data, NULL, 0);\n                ngx_dynamic_resolver_put_ctx(ctx, (ngx_cycle_t *) ngx_cycle);\n            }\n\n            ngx_dynamic_resolver_put_domain(d, (ngx_cycle_t *) ngx_cycle);\n\n            return;\n        }\n    }\n\n    ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, \"dynamic resolver del, \"\n                  \"%V is not in dynamic resolv hash table\", domain);\n}\n\nvoid\nngx_dynamic_resolver_start_resolver(ngx_str_t *domain,\n    ngx_dynamic_resolver_handler_pt h, void *data)\n{\n    ngx_dynamic_resolver_conf_t    *drcf;\n    ngx_dynamic_resolver_domain_t  *d;\n    ngx_dynamic_resolver_ctx_t     *ctx;\n    ngx_uint_t                      idx, n;\n    struct sockaddr                 sa;\n    socklen_t                       len;\n    u_char                          temp[MAX_DOMAIN_LEN];\n\n    if (domain == NULL || domain->len == 0) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"dynamic resolver async, domain is NULL\");\n        return;\n    }\n\n    len = ngx_sock_pton(&sa, domain->data, domain->len);\n    /* addr is ipv4/ipv6/unix address */\n    if (len) {\n        ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,\n                \"dynamic resolver async, domain is ipv4/ipv6/unix address\");\n\n        h(data, &sa, len);\n\n        return;\n    }\n\n    drcf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_dynamic_resolver_module);\n    if (drcf->refresh_interval == 0) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"dynamic resolver async, \"\n                \"dynamic resolver closed when start resolver\");\n        goto failed;\n    }\n\n    if (domain->len > MAX_DOMAIN_LEN) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"dynamic resolver async, \"\n                \"domain length(%z) is too long\", domain->len);\n        goto failed;\n    }\n\n    ngx_memzero(temp, MAX_DOMAIN_LEN);\n    idx = ngx_hash_strlow(temp, domain->data, domain->len);\n    idx %= drcf->domain_buckets;\n\n    d = drcf->resolver_hash[idx];\n    while (d) {\n        if (d->domain.len == domain->len &&\n            ngx_memcmp(d->domain.data, temp, domain->len) == 0)\n        {\n            break;\n        }\n        d = d->next;\n    }\n\n    if (d == NULL) { /* not found */\n        d = ngx_dynamic_resolver_get_domain((ngx_cycle_t *) ngx_cycle);\n        if (d == NULL) {\n            goto failed;\n        }\n\n        /* add domain in dynamic resolver */\n        d->next = drcf->resolver_hash[idx];\n        drcf->resolver_hash[idx] = d;\n\n        ngx_memcpy(d->domain_cstr, temp, MAX_DOMAIN_LEN);\n        d->domain.data = d->domain_cstr;\n        d->domain.len = domain->len;\n    }\n\n    /* domain is not resolved */\n    if (d->naddrs == 0) {\n\n        /* add call back in resolver list */\n        ctx = ngx_dynamic_resolver_get_ctx((ngx_cycle_t *) ngx_cycle);\n        if (ctx == NULL) {\n            goto failed;\n        }\n\n        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,\n                \"dynamic resolver async, domain '%V' is not resolved\",\n                &d->domain);\n        ctx->h = h;\n        ctx->data = data;\n\n        ctx->next = d->ctx;\n        d->ctx = ctx;\n\n        ngx_event_resolver_start_resolver(&d->domain,\n                ngx_dynamic_resolver_on_result, d);\n\n        return;\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,\n            \"dynamic resolver async, domain '%V' is resolved, call directly\",\n            &d->domain);\n\n    /* call callback */\n    n = ngx_random() % d->naddrs;\n    h(data, &d->addrs[n].sockaddr, d->addrs[n].socklen);\n\n    return;\n\nfailed:\n\n    h(data, NULL, 0);\n}\n\nsocklen_t\nngx_dynamic_resolver_gethostbyname(ngx_str_t *domain, struct sockaddr *sa)\n{\n    ngx_dynamic_resolver_conf_t    *drcf;\n    ngx_dynamic_resolver_domain_t  *d;\n    ngx_uint_t                      idx, n;\n    socklen_t                       len;\n    u_char                          temp[MAX_DOMAIN_LEN];\n\n    if (domain == NULL) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"dynamic resolver sync, domain is NULL\");\n        return 0;\n    }\n\n    len = ngx_sock_pton(sa, domain->data, domain->len);\n    /* addr is ipv4/ipv6/unix address */\n    if (len) {\n        ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,\n                \"dynamic resolver sync, domain is ipv4/ipv6/unix address\");\n\n        return len;\n    }\n\n    drcf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_dynamic_resolver_module);\n    if (drcf->refresh_interval == 0) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"dynamic resolver sync, \"\n                \"dynamic resolver closed when start resolver\");\n        return 0;\n    }\n\n    if (domain->len > MAX_DOMAIN_LEN) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"dynamic resolver sync, \"\n                \"domain length(%z) is too long\", domain->len);\n        return 0;\n    }\n\n    ngx_memzero(temp, MAX_DOMAIN_LEN);\n    idx = ngx_hash_strlow(temp, domain->data, domain->len);\n    idx %= drcf->domain_buckets;\n\n    d = drcf->resolver_hash[idx];\n    while (d) {\n        if (d->domain.len == domain->len &&\n            ngx_memcmp(d->domain.data, temp, domain->len) == 0)\n        {\n            if (d->naddrs == 0) {\n                ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0,\n                        \"dynamic resolver sync, domain '%V' is not resolved\",\n                        &d->domain);\n                return 0;\n            }\n\n            n = ngx_random() % d->naddrs;\n            ngx_memcpy(sa, &d->addrs[n].sockaddr, d->addrs[n].socklen);\n\n            return d->addrs[n].socklen;\n        }\n\n        d = d->next;\n    }\n\n    ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, \"dynamic resolver sync, \"\n            \"domain '%V' is not in dynamic resolver table\", domain);\n\n    return 0;\n}\n\nngx_chain_t *\nngx_dynamic_resolver_state(ngx_http_request_t *r)\n{\n\tngx_dynamic_resolver_conf_t *drcf;\n    ngx_chain_t                *cl;\n    ngx_buf_t                  *b;\n    size_t                      len;\n\n    drcf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_dynamic_resolver_module);\n\n    len = sizeof(\"##########dynamic resolver state##########\\n\") - 1\n        + sizeof(\"ngx_dynamic_resolver alloc ctx: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_dynamic_resolver free ctx: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_dynamic_resolver alloc domain: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_dynamic_resolver free domain: \\n\") - 1 + NGX_OFF_T_LEN;\n\n    cl = ngx_alloc_chain_link(r->pool);\n    if (cl == NULL) {\n        return NULL;\n    }\n    cl->next = NULL;\n\n    b = ngx_create_temp_buf(r->pool, len);\n    if (b == NULL) {\n        return NULL;\n    }\n    cl->buf = b;\n\n    b->last = ngx_snprintf(b->last, len,\n            \"##########dynamic resolver state##########\\n\"\n            \"ngx_dynamic_resolver alloc ctx: %ui\\n\"\n            \"ngx_dynamic_resolver free ctx: %ui\\n\"\n            \"ngx_dynamic_resolver alloc domain: %ui\\n\"\n            \"ngx_dynamic_resolver free domain: %ui\\n\",\n            drcf->nalloc_ctx, drcf->nfree_ctx,\n            drcf->nalloc_domain, drcf->nfree_domain);\n\n    return cl;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_dynamic_resolver.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_DYNAMIC_RESOLVER_H_INCLUDED_\n#define _NGX_DYNAMIC_RESOLVER_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n\n\n/*\n * paras:\n *      data   : user private data set in ngx_dynamic_resolver_start_resolver\n *      sa     : sock address get\n *      socklen: sock address len, 0 for get none address\n */\ntypedef void (* ngx_dynamic_resolver_handler_pt)(void *data,\n        struct sockaddr *sa, socklen_t socklen);\n\n/*\n * add domain into dynamic resolver\n *\n * paras:\n *      domain: domain for DNS query\n */\n\nvoid ngx_dynamic_resolver_add_domain(ngx_str_t *domain, ngx_cycle_t *cycle);\n\n/*\n * del domain from dynamic resolver\n *\n * paras:\n *      domain: domain for DNS query\n */\nvoid ngx_dynamic_resolver_del_domain(ngx_str_t *domain);\n\n/*\n * get addr from dynamic resolver by domain if exist,\n *  otherwise, get from resolver configured into event resolver\n *  and add domain into dynamic resolver\n *\n * paras:\n *      domain: domain for DNS query\n *      h     : callback handler\n *      data  : data for callback\n */\nvoid ngx_dynamic_resolver_start_resolver(ngx_str_t *domain,\n        ngx_dynamic_resolver_handler_pt h, void *data);\n\n/*\n * get addr from dynamic resolver by domain,\n *\n * return:\n *      0 for failed\n *      socklen for successd\n *\n * paras:\n *      domain: domain for query\n *      sa    : sockaddr for domain\n */\nsocklen_t ngx_dynamic_resolver_gethostbyname(ngx_str_t *domain,\n        struct sockaddr *sa);\n\n/*\n * paras:\n *      r: http request to query status of dynamic resolver\n */\nngx_chain_t *ngx_dynamic_resolver_state(ngx_http_request_t *r);\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_event_resolver.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include \"ngx_event_resolver.h\"\n\n\nstatic void *ngx_event_resolver_create_conf(ngx_cycle_t *cycle);\nstatic char *ngx_event_resolver_init_conf(ngx_cycle_t *cycle, void *conf);\n\nstatic char *ngx_event_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\n\n\ntypedef struct ngx_event_resolver_ctx_s ngx_event_resolver_ctx_t;\n\nstruct ngx_event_resolver_ctx_s {\n    ngx_event_resolver_handler_pt   handler;\n    void                           *data;\n    ngx_event_resolver_ctx_t       *next;\n};\n\ntypedef struct {\n    ngx_msec_t                      resolver_timeout;\n    ngx_resolver_t                 *resolver;\n    ngx_event_resolver_ctx_t       *free_ctx;\n\n    ngx_uint_t                      nalloc;\n    ngx_uint_t                      nfree;\n} ngx_event_resolver_conf_t;\n\n\nstatic ngx_str_t    event_resolver_name = ngx_string(\"event_resolver\");\n\n\nstatic ngx_command_t  ngx_event_resolver_commands[] = {\n\n\t{ ngx_string(\"resolver\"),\n      NGX_EVENT_CONF|NGX_CONF_1MORE,\n      ngx_event_resolver,\n      0,\n      0,\n      NULL },\n\n    { ngx_string(\"resolver_timeout\"),\n      NGX_EVENT_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_msec_slot,\n      0,\n      offsetof(ngx_event_resolver_conf_t, resolver_timeout),\n      NULL },\n\n\t  ngx_null_command\n};\n\n\nngx_event_module_t  ngx_event_resolver_module_ctx = {\n    &event_resolver_name,\n    ngx_event_resolver_create_conf,         /* create configuration */\n    ngx_event_resolver_init_conf,           /* init configuration */\n\n    { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }\n};\n\n\n/* this module use ngx_cycle->log */\nngx_module_t  ngx_event_resolver_module = {\n    NGX_MODULE_V1,\n    &ngx_event_resolver_module_ctx,         /* module context */\n    ngx_event_resolver_commands,            /* module directives */\n    NGX_EVENT_MODULE,                       /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_event_resolver_create_conf(ngx_cycle_t *cycle)\n{\n    ngx_event_resolver_conf_t      *conf;\n\n    conf = ngx_pcalloc(cycle->pool, sizeof(ngx_event_resolver_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->resolver_timeout = NGX_CONF_UNSET_MSEC;\n\n    return conf;\n}\n\nstatic char *\nngx_event_resolver_init_conf(ngx_cycle_t *cycle, void *conf)\n{\n    ngx_event_resolver_conf_t      *ercf = conf;\n\n    ngx_conf_init_msec_value(ercf->resolver_timeout, 60000);\n\n    return NGX_CONF_OK;\n}\n\nstatic char *\nngx_event_resolver(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_event_resolver_conf_t      *ercf = conf;\n\n    ngx_str_t                      *value;\n\n    if (ercf->resolver) {\n        return \"is duplicate\";\n    }\n\n    value = cf->args->elts;\n\n    ercf->resolver = ngx_resolver_create(cf, &value[1], cf->args->nelts - 1);\n    if (ercf->resolver == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_event_resolver_ctx_t *\nngx_event_resolver_get_ctx()\n{\n    ngx_event_resolver_ctx_t       *ctx;\n    ngx_event_resolver_conf_t      *ercf;\n\n    ercf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_resolver_module);\n\n    ctx = ercf->free_ctx;\n    if (ctx == NULL) {\n        ctx = ngx_pcalloc(ngx_cycle->pool, sizeof(ngx_event_resolver_ctx_t));\n        ++ercf->nalloc;\n    } else {\n        ercf->free_ctx = ctx->next;\n        ctx->next = NULL;\n        --ercf->nfree;\n    }\n\n    return ctx;\n}\n\nstatic void\nngx_event_resolver_put_ctx(ngx_event_resolver_ctx_t *ctx)\n{\n    ngx_event_resolver_conf_t      *ercf;\n\n    ercf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_resolver_module);\n\n    ctx->next = ercf->free_ctx;\n    ercf->free_ctx = ctx;\n    ++ercf->nfree;\n}\n\nstatic void\nngx_event_resolver_handler(ngx_resolver_ctx_t *ctx)\n{\n    ngx_event_resolver_ctx_t       *erctx;\n\n    erctx = ctx->data;\n\n    if (ctx->state) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"event resolver, domain '%V' could not be resolved (%i: %s)\",\n                &ctx->name, ctx->state, ngx_resolver_strerror(ctx->state));\n        erctx->handler(erctx->data, NULL, 0);\n\n        goto failed;\n    }\n\n    erctx->handler(erctx->data, ctx->addrs, ctx->naddrs);\n\nfailed:\n    ngx_resolve_name_done(ctx);\n    ngx_event_resolver_put_ctx(erctx);\n}\n\nvoid\nngx_event_resolver_start_resolver(ngx_str_t *domain,\n        ngx_event_resolver_handler_pt h, void *data)\n{\n    ngx_event_resolver_conf_t      *ercf;\n    ngx_event_resolver_ctx_t       *erctx;\n    ngx_resolver_ctx_t             *ctx, temp;\n\n    ercf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_resolver_module);\n\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, \"event resolver, \"\n            \"start resolv domain '%V'\", domain);\n\n    if (ercf->resolver == NULL) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"event resolver, \"\n                \"resolver does not configured\");\n        h(data, NULL, 0);\n\n        return;\n    }\n\n    temp.name = *domain;\n\n    erctx = ngx_event_resolver_get_ctx();\n    if (erctx == NULL) {\n        return;\n    }\n    erctx->handler = h;\n    erctx->data = data;\n\n    ctx = ngx_resolve_start(ercf->resolver, &temp);\n    if (ctx == NULL) {\n        goto failed;\n    }\n\n    if (ctx == NGX_NO_RESOLVER) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"event resolver, \"\n                \"no resolver defined to resolv %V\", domain);\n        goto failed;\n    }\n\n    ctx->name = *domain;\n    ctx->handler = ngx_event_resolver_handler;\n    ctx->data = erctx;\n    ctx->timeout = ercf->resolver_timeout;\n\n    if (ngx_resolve_name(ctx) != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"event resolver, \"\n                \"resolv %V failed\", domain);\n\n        goto failed;\n    }\n\n    return;\n\nfailed:\n    h(data, NULL, 0);\n\n    if (ctx == NULL || ctx == NGX_NO_RESOLVER) {\n        ngx_resolve_name_done(ctx);\n        ngx_event_resolver_put_ctx(erctx);\n    }\n}\n\nngx_chain_t *\nngx_event_resolver_state(ngx_http_request_t *r)\n{\n\tngx_event_resolver_conf_t  *ercf;\n    ngx_chain_t                *cl;\n    ngx_buf_t                  *b;\n    size_t                      len;\n\n    ercf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_resolver_module);\n\n    len = sizeof(\"##########event resolver state##########\\n\") - 1\n        + sizeof(\"ngx_event_resolver alloc: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_event_resolver free: \\n\") - 1 + NGX_OFF_T_LEN;\n\n    cl = ngx_alloc_chain_link(r->pool);\n    if (cl == NULL) {\n        return NULL;\n    }\n    cl->next = NULL;\n\n    b = ngx_create_temp_buf(r->pool, len);\n    if (b == NULL) {\n        return NULL;\n    }\n    cl->buf = b;\n\n    b->last = ngx_snprintf(b->last, len,\n            \"##########event resolver state##########\\n\"\n            \"ngx_event_resolver alloc: %ui\\nngx_event_resolver free: %ui\\n\",\n            ercf->nalloc, ercf->nfree);\n\n    return cl;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_event_resolver.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n\n#ifndef _NGX_EVENT_RESOLVER_H_INCLUDED_\n#define _NGX_EVENT_RESOLVER_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_event.h>\n#include <ngx_http.h>\n\n\n/*\n * paras:\n *      data  : user private data set in ngx_event_resolver_start_resolver\n *      addrs : addrs resolv by DNS\n *      naddrs: number of addrs resolv by DNS\n */\ntypedef void (* ngx_event_resolver_handler_pt)(void *data,\n        ngx_resolver_addr_t *addrs, ngx_uint_t naddrs);\n\n\n/*\n * paras:\n *      domain: domain for resolving\n *      h     : callback handler\n *      data  : data for callback\n */\nvoid ngx_event_resolver_start_resolver(ngx_str_t *domain,\n        ngx_event_resolver_handler_pt h, void *data);\n\n/*\n * paras:\n *      r: http request to query status of event resolver\n */\nngx_chain_t *ngx_event_resolver_state(ngx_http_request_t *r);\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_event_timer_module.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include \"ngx_event_timer_module.h\"\n\n\nstatic ngx_int_t ngx_event_timer_process_init(ngx_cycle_t *cycle);\n\nstatic void *ngx_event_timer_create_conf(ngx_cycle_t *cycle);\nstatic char *ngx_event_timer_init_conf(ngx_cycle_t *cycle, void *conf);\n\n\ntypedef struct {\n    ngx_uint_t              timerid;\n\n    ngx_event_t             event;\n\n    ngx_timer_handler_pt    handler;\n    void                   *data;\n} ngx_event_timer_ctx_t;\n\ntypedef struct {\n    ngx_uint_t              timer_n;\n\n    ngx_event_timer_ctx_t  *timer_ctx; /* array to store timers */\n\n    ngx_event_timer_ctx_t  *free_timers; /* timer unused */\n    ngx_uint_t              free_timer_n;\n} ngx_event_timer_conf_t;\n\n\nstatic ngx_str_t  event_timer_name = ngx_string(\"event_timer\");\n\n\nstatic ngx_command_t  ngx_event_timer_commands[] = {\n\n    { ngx_string(\"worker_timers\"),\n      NGX_EVENT_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      0,\n      offsetof(ngx_event_timer_conf_t, timer_n),\n      NULL },\n\n      ngx_null_command\n};\n\n\nngx_event_module_t  ngx_event_timer_module_ctx = {\n    &event_timer_name,\n    ngx_event_timer_create_conf,            /* create configuration */\n    ngx_event_timer_init_conf,              /* init configuration */\n\n    { NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL }\n};\n\n\n/* this module use ngx_cycle->log */\nngx_module_t  ngx_event_timer_module = {\n    NGX_MODULE_V1,\n    &ngx_event_timer_module_ctx,            /* module context */\n    ngx_event_timer_commands,               /* module directives */\n    NGX_EVENT_MODULE,                       /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    ngx_event_timer_process_init,           /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void *\nngx_event_timer_create_conf(ngx_cycle_t *cycle)\n{\n    ngx_event_timer_conf_t           *conf;\n\n    conf = ngx_pcalloc(cycle->pool, sizeof(ngx_event_timer_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->timer_n = NGX_CONF_UNSET_UINT;\n\n    return conf;\n}\n\nstatic char *\nngx_event_timer_init_conf(ngx_cycle_t *cycle, void *conf)\n{\n    ngx_event_timer_conf_t     *etcf = conf;\n\n    ngx_conf_init_uint_value(etcf->timer_n, 1024);\n\n    return NGX_CONF_OK;\n}\n\nstatic ngx_int_t\nngx_event_timer_process_init(ngx_cycle_t *cycle)\n{\n    ngx_event_timer_conf_t     *etcf;\n    ngx_event_timer_ctx_t      *t, *next;\n    ngx_uint_t                  i;\n\n    etcf = ngx_event_get_conf(cycle->conf_ctx, ngx_event_timer_module);\n\n    if (etcf->timer_n == 0) {\n        return NGX_OK;\n    }\n\n    etcf->timer_ctx =\n        ngx_alloc(sizeof(ngx_event_timer_ctx_t) * etcf->timer_n, cycle->log);\n    if (etcf->timer_ctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    t = etcf->timer_ctx;\n\n    i = etcf->timer_n;\n    next = NULL;\n\n    do {\n        --i;\n\n        t[i].timerid = i;\n        t[i].event.timer_set = 0;\n        t[i].event.log = NULL;\n        t[i].handler = NULL;\n        t[i].data = next;\n\n        next = &t[i];\n    } while (i);\n\n    etcf->free_timers = next;\n    etcf->free_timer_n = etcf->timer_n;\n\n    return NGX_OK;\n}\n\nstatic ngx_event_timer_ctx_t *\nngx_event_timer_get_timer()\n{\n    ngx_event_timer_conf_t     *etcf;\n    ngx_event_timer_ctx_t      *free;\n\n    etcf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_timer_module);\n\n    free = etcf->free_timers;\n    if (etcf->free_timer_n == 0) {\n        ngx_log_error(NGX_LOG_ALERT, ngx_cycle->log, 0,\n                      \"nginx event timer module, no free timer\");\n        return NULL;\n    }\n\n    etcf->free_timers = free->data;\n    --etcf->free_timer_n;\n\n    return free;\n}\n\nstatic void\nngx_event_timer_free_timer(ngx_event_timer_ctx_t *ctx)\n{\n    ngx_event_timer_conf_t     *etcf;\n\n    etcf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_timer_module);\n\n    ctx->data = etcf->free_timers;\n    etcf->free_timers = ctx;\n    ++etcf->free_timer_n;\n}\n\nstatic void\nngx_event_timer_event_handler(ngx_event_t *e)\n{\n    ngx_event_timer_ctx_t      *ctx;\n\n    ctx = e->data;\n\n    if (ctx->handler) {\n        ctx->handler(ctx->data);\n    }\n\n    ngx_event_timer_free_timer(ctx);\n}\n\nngx_int_t\nngx_event_timer_add_timer(ngx_msec_t tv, ngx_timer_handler_pt h, void *data)\n{\n    ngx_event_timer_ctx_t      *ctx;\n\n    if (h == NULL) {\n        return NGX_ERROR;\n    }\n\n    ctx = ngx_event_timer_get_timer();\n    if (ctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    ctx->event.handler = ngx_event_timer_event_handler;\n    ctx->event.data = ctx;\n\n    ctx->handler = h;\n    ctx->data = data;\n\n    if (ctx->event.log == NULL) {\n        ctx->event.log = ngx_cycle->log;\n    }\n\n    ngx_event_add_timer(&ctx->event, tv);\n\n    return ctx->timerid;\n}\n\nvoid\nngx_event_timer_del_timer(ngx_uint_t timerid)\n{\n    ngx_event_timer_ctx_t      *ctx;\n    ngx_event_timer_conf_t     *etcf;\n\n    etcf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_timer_module);\n\n    ctx = &etcf->timer_ctx[timerid];\n\n    if (!ctx->event.timer_set) {\n        ngx_log_debug0(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,\n                       \"timer has already deleted\");\n        return;\n    }\n\n    ngx_event_del_timer(&ctx->event);\n    ngx_event_timer_free_timer(ctx);\n}\n\nngx_chain_t *\nngx_event_timer_state(ngx_http_request_t *r)\n{\n    ngx_event_timer_conf_t     *etcf;\n    ngx_chain_t                *cl;\n    ngx_buf_t                  *b;\n    size_t                      len;\n\n    etcf = ngx_event_get_conf(ngx_cycle->conf_ctx, ngx_event_timer_module);\n\n    len = sizeof(\"##########event timer state##########\\n\") - 1\n        + sizeof(\"ngx_event_timer alloc: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_event_timer free: \\n\") - 1 + NGX_OFF_T_LEN;\n\n    cl = ngx_alloc_chain_link(r->pool);\n    if (cl == NULL) {\n        return NULL;\n    }\n    cl->next = NULL;\n\n    b = ngx_create_temp_buf(r->pool, len);\n    if (b == NULL) {\n        return NULL;\n    }\n    cl->buf = b;\n\n    b->last = ngx_snprintf(b->last, len,\n            \"##########event timer state##########\\n\"\n            \"ngx_event_timer alloc: %ui\\nngx_event_timer free: %ui\\n\",\n            etcf->timer_n, etcf->free_timer_n);\n\n    return cl;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_event_timer_module.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_EVENT_TIMER_MODULE_H_INCLUDED_\n#define _NGX_EVENT_TIMER_MODULE_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_event.h>\n#include <ngx_http.h>\n\n\ntypedef void (* ngx_timer_handler_pt)(void *data);\n\n/*\n * return value:\n *      return timerid for successd, NGX_ERROR for failed\n * paras:\n *      tv   : timer interval to trigger handler\n *      h    : timer handler\n *      data : data of h para\n */\nngx_int_t ngx_event_timer_add_timer(ngx_msec_t tv,\n        ngx_timer_handler_pt h, void *data);\n\n/*\n * paras:\n *      timerid: value return in ngx_timer_add_timer\n */\nvoid ngx_event_timer_del_timer(ngx_uint_t timerid);\n\n/*\n * paras:\n *      r: http request to query status of event timer\n */\nngx_chain_t *ngx_event_timer_state(ngx_http_request_t *r);\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_http_dynamic.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_dynamic_conf.h\"\n#include \"ngx_http_dynamic.h\"\n\n\nstatic void *ngx_http_dynamic_create_conf(ngx_conf_t *cf);\nstatic void *ngx_http_dynamic_core_create_main_conf(ngx_conf_t *cf);\nstatic char *ngx_http_dynamic_core_init_main_conf(ngx_conf_t *cf, void *conf);\nstatic void *ngx_http_dynamic_core_create_srv_conf(ngx_conf_t *cf);\nstatic char *ngx_http_dynamic_core_init_srv_conf(ngx_conf_t *cf, void *conf);\nstatic void *ngx_http_dynamic_core_create_loc_conf(ngx_conf_t *cf);\nstatic char *ngx_http_dynamic_core_init_loc_conf(ngx_conf_t *cf, void *conf);\n\nstatic char *ngx_http_dynamic_block(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\nstatic char *ngx_http_dynamic_core_server(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\nstatic char *ngx_http_dynamic_core_server_name(ngx_conf_t *cf,\n       ngx_command_t *cmd, void *conf);\nstatic char *ngx_http_dynamic_core_location(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\n\n\ntypedef struct ngx_http_dynamic_location_tree_node_s\n               ngx_http_dynamic_location_tree_node_t;\ntypedef struct ngx_http_dynamic_core_loc_conf_s\n               ngx_http_dynamic_core_loc_conf_t;\n\nstruct ngx_http_dynamic_core_loc_conf_s {\n    ngx_str_t                           name;       /* location name */\n\n#if (NGX_PCRE)\n    ngx_dynamic_regex_t                *regex;\n#endif\n\n    unsigned                            exact_match:1;\n    unsigned                            noregex:1;\n\n    ngx_queue_t                        *locations;\n\n    ngx_http_dynamic_location_tree_node_t  *static_locations;\n#if (NGX_PCRE)\n    ngx_http_dynamic_core_loc_conf_t  **regex_locations;\n#endif\n\n    void                              **loc_conf;\n};\n\ntypedef struct {\n    ngx_queue_t                         queue;\n    ngx_http_dynamic_core_loc_conf_t   *exact;\n    ngx_http_dynamic_core_loc_conf_t   *inclusive;\n    ngx_str_t                          *name;\n    u_char                             *file_name;\n    ngx_uint_t                          line;\n    ngx_queue_t                         list;\n} ngx_http_dynamic_location_queue_t;\n\nstruct ngx_http_dynamic_location_tree_node_s {\n    ngx_http_dynamic_location_tree_node_t  *left;\n    ngx_http_dynamic_location_tree_node_t  *right;\n    ngx_http_dynamic_location_tree_node_t  *tree;\n\n    ngx_http_dynamic_core_loc_conf_t   *exact;\n    ngx_http_dynamic_core_loc_conf_t   *inclusive;\n\n    u_char                              len;\n    u_char                              name[1];\n};\n\n\ntypedef struct {\n    /* array of the ngx_http_dynamic_server_name_t, \"server_name\" directive */\n    ngx_array_t                         server_names;\n\n    ngx_http_dynamic_core_loc_conf_t   *hdclcf;\n\n    void                              **srv_conf;\n} ngx_http_dynamic_core_srv_conf_t;\n\ntypedef struct {\n#if (NGX_PCRE)\n    ngx_dynamic_regex_t                *regex;\n#endif\n    ngx_http_dynamic_core_srv_conf_t   *server;   /* virtual name server conf */\n    ngx_str_t                           name;\n} ngx_http_dynamic_server_name_t;\n\n\ntypedef struct {\n    /* ngx_http_dynamic_srv_conf_t */\n    ngx_array_t                         servers;\n\n    ngx_uint_t                          server_names_hash_max_size;\n    ngx_uint_t                          server_names_hash_bucket_size;\n\n    /* the default server configuration for this address:port */\n    ngx_http_dynamic_core_srv_conf_t   *default_server;\n\n    ngx_hash_combined_t                 names;\n\n#if (NGX_PCRE)\n    ngx_uint_t                          nregex;\n    ngx_http_dynamic_server_name_t     *regex;\n#endif\n} ngx_http_dynamic_core_main_conf_t;\n\n\ntypedef struct {\n    void                              **main_conf;\n} ngx_http_dynamic_conf_t;\n\n\nstatic ngx_core_module_t  ngx_http_dynamic_module_ctx = {\n    ngx_string(\"http_dynamic\"),\n    NULL,\n    NULL\n};\n\nstatic ngx_command_t  ngx_http_dynamic_dcommands[] = {\n\n    { ngx_string(\"http\"),\n      NGX_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,\n      ngx_http_dynamic_block,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\nstatic ngx_dynamic_core_module_t  ngx_http_dynamic_module_dctx = {\n    ngx_string(\"http_dynamic\"),\n    ngx_http_dynamic_create_conf,\n    NULL\n};\n\nngx_module_t  ngx_http_dynamic_module = {\n    NGX_MODULE_V1,\n    &ngx_http_dynamic_module_ctx,           /* module context */\n    NULL,                                   /* module directives */\n    NGX_CORE_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    (uintptr_t) &ngx_http_dynamic_module_dctx, /* module dynamic context */\n    (uintptr_t) ngx_http_dynamic_dcommands, /* module dynamic directives */\n    NGX_MODULE_V1_DYNAMIC_PADDING\n};\n\n\nstatic ngx_http_module_t  ngx_http_dynamic_core_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    NULL,                                   /* postconfiguration */\n\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n\n    NULL,                                   /* create location configuration */\n    NULL                                    /* merge location configuration */\n};\n\n\nstatic ngx_command_t  ngx_http_dynamic_core_dcommands[] = {\n\n    { ngx_string(\"server_names_hash_max_size\"),\n      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      0,\n      offsetof(ngx_http_dynamic_core_main_conf_t, server_names_hash_max_size),\n      NULL },\n\n    { ngx_string(\"server_names_hash_bucket_size\"),\n      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      0,\n      offsetof(ngx_http_dynamic_core_main_conf_t,\n               server_names_hash_bucket_size),\n      NULL },\n\n    { ngx_string(\"server\"),\n      NGX_HTTP_MAIN_CONF|NGX_CONF_BLOCK|NGX_CONF_NOARGS,\n      ngx_http_dynamic_core_server,\n      0,\n      0,\n      NULL },\n\n    { ngx_string(\"server_name\"),\n      NGX_HTTP_SRV_CONF|NGX_CONF_1MORE,\n      ngx_http_dynamic_core_server_name,\n      0,\n      0,\n      NULL },\n\n    { ngx_string(\"location\"),\n      NGX_HTTP_SRV_CONF|NGX_CONF_BLOCK|NGX_CONF_TAKE12,\n      ngx_http_dynamic_core_location,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_dynamic_module_t  ngx_http_dynamic_core_module_dctx = {\n    ngx_http_dynamic_core_create_main_conf, /* create main configuration */\n    ngx_http_dynamic_core_init_main_conf,   /* init main configuration */\n\n    ngx_http_dynamic_core_create_srv_conf,  /* create server configuration */\n    ngx_http_dynamic_core_init_srv_conf,    /* init server configuration */\n\n    ngx_http_dynamic_core_create_loc_conf,  /* create location configuration */\n    ngx_http_dynamic_core_init_loc_conf     /* init location configuration */\n};\n\n\nngx_module_t  ngx_http_dynamic_core_module = {\n    NGX_MODULE_V1,\n    &ngx_http_dynamic_core_module_ctx,      /* module context */\n    NULL,                                   /* module directives */\n    NGX_HTTP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    (uintptr_t) &ngx_http_dynamic_core_module_dctx, /* module dynamic context */\n    (uintptr_t) ngx_http_dynamic_core_dcommands, /* module dynamic directives */\n    NGX_MODULE_V1_DYNAMIC_PADDING\n};\n\n\nstatic void *\nngx_http_dynamic_create_conf(ngx_conf_t *cf)\n{\n    ngx_http_dynamic_conf_t                *hdccf;\n\n    hdccf = ngx_pcalloc(cf->pool, sizeof(ngx_http_dynamic_conf_t));\n    if (hdccf == NULL) {\n        return NULL;\n    }\n\n    return hdccf;\n}\n\nstatic void *\nngx_http_dynamic_core_create_main_conf(ngx_conf_t *cf)\n{\n    ngx_http_dynamic_core_main_conf_t      *hdcmcf;\n\n    hdcmcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_dynamic_core_main_conf_t));\n    if (hdcmcf == NULL) {\n        return NULL;\n    }\n\n    if (ngx_array_init(&hdcmcf->servers, cf->pool, 4,\n        sizeof(ngx_http_dynamic_core_srv_conf_t *)) != NGX_OK)\n    {\n        return NULL;\n    }\n\n    hdcmcf->server_names_hash_max_size = NGX_CONF_UNSET_UINT;\n    hdcmcf->server_names_hash_bucket_size = NGX_CONF_UNSET_UINT;\n\n    return hdcmcf;\n}\n\nstatic char *\nngx_http_dynamic_core_init_main_conf(ngx_conf_t *cf, void *conf)\n{\n    ngx_http_dynamic_core_main_conf_t      *hdcmcf;\n\n    hdcmcf = conf;\n\n    ngx_conf_init_uint_value(hdcmcf->server_names_hash_max_size, 512);\n    ngx_conf_init_uint_value(hdcmcf->server_names_hash_bucket_size,\n                             ngx_cacheline_size);\n\n    return NGX_CONF_OK;\n}\n\nstatic void *\nngx_http_dynamic_core_create_srv_conf(ngx_conf_t *cf)\n{\n    ngx_http_dynamic_core_srv_conf_t       *hdcscf;\n\n    hdcscf = ngx_pcalloc(cf->pool, sizeof(ngx_http_dynamic_core_srv_conf_t));\n    if (hdcscf == NULL) {\n        return NULL;\n    }\n\n    if (ngx_array_init(&hdcscf->server_names, cf->pool, 4,\n        sizeof(ngx_http_dynamic_server_name_t)) != NGX_OK)\n    {\n        return NULL;\n    }\n\n    return hdcscf;\n}\n\nstatic char *\nngx_http_dynamic_core_init_srv_conf(ngx_conf_t *cf, void *conf)\n{\n    return NGX_CONF_OK;\n}\n\nstatic void *\nngx_http_dynamic_core_create_loc_conf(ngx_conf_t *cf)\n{\n    ngx_http_dynamic_core_loc_conf_t       *hdclcf;\n\n    hdclcf = ngx_pcalloc(cf->pool, sizeof(ngx_http_dynamic_core_loc_conf_t));\n    if (hdclcf == NULL) {\n        return NULL;\n    }\n\n    return hdclcf;\n}\n\nstatic char *\nngx_http_dynamic_core_init_loc_conf(ngx_conf_t *cf, void *conf)\n{\n    return NGX_CONF_OK;\n}\n\nstatic ngx_int_t\nngx_http_dynamic_core_regex_location(ngx_conf_t *cf,\n        ngx_http_dynamic_core_loc_conf_t *hdclcf,\n        ngx_str_t *regex, ngx_uint_t caseless)\n{\n#if (NGX_PCRE)\n    ngx_regex_compile_t                     rc;\n    u_char                                  errstr[NGX_MAX_CONF_ERRSTR];\n\n    ngx_memzero(&rc, sizeof(ngx_regex_compile_t));\n\n    rc.pattern = *regex;\n    rc.err.len = NGX_MAX_CONF_ERRSTR;\n    rc.err.data = errstr;\n\n#if (NGX_HAVE_CASELESS_FILESYSTEM)\n    rc.options = NGX_REGEX_CASELESS;\n#else\n    rc.options = caseless ? NGX_REGEX_CASELESS : 0;\n#endif\n\n    hdclcf->regex = ngx_dynamic_regex_compile(cf, &rc);\n    if (hdclcf->regex == NULL) {\n        return NGX_ERROR;\n    }\n\n    hdclcf->name = *regex;\n\n    return NGX_OK;\n\n#else\n\n    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n            \"using regex \\\"%V\\\" requires PCRE library\",\n            regex);\n    return NGX_ERROR;\n\n#endif\n}\n\nstatic ngx_int_t\nngx_http_dynamic_core_predeal_location(ngx_conf_t *cf,\n        ngx_http_dynamic_core_loc_conf_t *hdclcf)\n{\n    ngx_str_t                              *value, *name;\n    size_t                                  len;\n    u_char                                 *mod;\n\n    value = cf->args->elts;\n\n    if (cf->args->nelts == 3) {\n\n        len = value[1].len;\n        mod = value[1].data;\n        name = &value[2];\n\n        if (len == 1 && mod[0] == '=') {\n\n            hdclcf->name = *name;\n            hdclcf->exact_match = 1;\n\n        } else if (len == 2 && mod[0] == '^' && mod[1] == '~') {\n\n            hdclcf->name = *name;\n            hdclcf->noregex = 1;\n\n        } else if (len == 1 && mod[0] == '~') {\n\n            if (ngx_http_dynamic_core_regex_location(cf, hdclcf, name, 0)\n                != NGX_OK)\n            {\n                return NGX_ERROR;\n            }\n\n        } else if (len == 2 && mod[0] == '~' && mod[1] == '*') {\n\n            if (ngx_http_dynamic_core_regex_location(cf, hdclcf, name, 1)\n                != NGX_OK)\n            {\n                return NGX_ERROR;\n            }\n\n        } else {\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                               \"invalid location modifier \\\"%V\\\"\", &value[1]);\n            return NGX_ERROR;\n        }\n    } else { /* cf->args->nelts == 2 */\n\n        name = &value[1];\n\n        if (name->data[0] == '=') {\n\n            hdclcf->name.len = name->len - 1;\n            hdclcf->name.data = name->data + 1;\n            hdclcf->exact_match = 1;\n\n        } else if (name->data[0] == '^' && name->data[1] == '~') {\n\n            hdclcf->name.len = name->len - 2;\n            hdclcf->name.data = name->data + 2;\n            hdclcf->noregex = 1;\n\n        } else if (name->data[0] == '~') {\n\n            name->len--;\n            name->data++;\n\n            if (name->data[0] == '*') {\n\n                name->len--;\n                name->data++;\n\n                if (ngx_http_dynamic_core_regex_location(cf, hdclcf, name, 1)\n                    != NGX_OK)\n                {\n                    return NGX_ERROR;\n                }\n\n            } else {\n                if (ngx_http_dynamic_core_regex_location(cf, hdclcf, name, 0)\n                    != NGX_OK)\n                {\n                    return NGX_ERROR;\n                }\n            }\n\n        } else {\n\n            hdclcf->name = *name;\n        }\n    }\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_http_dynamic_core_cmp_locations(const ngx_queue_t *one,\n        const ngx_queue_t *two)\n{\n    ngx_int_t                               rc;\n    ngx_http_dynamic_core_loc_conf_t       *first, *second;\n    ngx_http_dynamic_location_queue_t      *lq1, *lq2;\n\n    lq1 = (ngx_http_dynamic_location_queue_t *) one;\n    lq2 = (ngx_http_dynamic_location_queue_t *) two;\n\n    first = lq1->exact ? lq1->exact : lq1->inclusive;\n    second = lq2->exact ? lq2->exact : lq2->inclusive;\n\n#if (NGX_PCRE)\n    if (first->regex && !second->regex) {\n        /* shift the regex matches to the end */\n        return 1;\n    }\n\n    if (!first->regex && second->regex) {\n        /* shift the regex matches to the end */\n        return -1;\n    }\n\n    if (first->regex || second->regex) {\n        /* do not sort the regex matches */\n        return 0;\n    }\n#endif\n\n    rc = ngx_filename_cmp(first->name.data, second->name.data,\n            ngx_min(first->name.len, second->name.len) + 1);\n\n    if (rc == 0 && !first->exact_match && second->exact_match) {\n        /* an exact match must be before the same inclusive one */\n        return 1;\n    }\n\n    return rc;\n}\n\nstatic ngx_int_t\nngx_http_dynamic_core_join_exact_locations(ngx_conf_t *cf,\n        ngx_queue_t *locations)\n{\n    ngx_queue_t                            *q, *x;\n    ngx_http_dynamic_location_queue_t      *lq, *lx;\n\n    q = ngx_queue_head(locations);\n\n    while (q != ngx_queue_last(locations)) {\n\n        x = ngx_queue_next(q);\n\n        lq = (ngx_http_dynamic_location_queue_t *) q;\n        lx = (ngx_http_dynamic_location_queue_t *) x;\n\n        if (lq->name->len == lx->name->len\n            && ngx_filename_cmp(lq->name->data, lx->name->data, lx->name->len)\n               == 0)\n        {\n            if ((lq->exact && lx->exact) || (lq->inclusive && lx->inclusive)) {\n                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,\n                              \"duplicate location \\\"%V\\\" in %s:%ui\",\n                              lx->name, lx->file_name, lx->line);\n\n                return NGX_ERROR;\n            }\n\n            lq->inclusive = lx->inclusive;\n\n            ngx_queue_remove(x);\n\n            continue;\n        }\n\n        q = ngx_queue_next(q);\n    }\n\n    return NGX_OK;\n}\n\nstatic void\nngx_http_dynamic_core_create_locations_list(ngx_queue_t *locations,\n        ngx_queue_t *q)\n{\n    u_char                                 *name;\n    size_t                                  len;\n    ngx_queue_t                            *x, tail;\n    ngx_http_dynamic_location_queue_t      *lq, *lx;\n\n    if (q == ngx_queue_last(locations)) {\n        return;\n    }\n\n    lq = (ngx_http_dynamic_location_queue_t *) q;\n\n    if (lq->inclusive == NULL) {\n        ngx_http_dynamic_core_create_locations_list(locations,\n                                                    ngx_queue_next(q));\n        return;\n    }\n\n    len = lq->name->len;\n    name = lq->name->data;\n\n    for (x = ngx_queue_next(q);\n         x != ngx_queue_sentinel(locations);\n         x = ngx_queue_next(x))\n    {\n        lx = (ngx_http_dynamic_location_queue_t *) x;\n\n        if (len > lx->name->len\n            || ngx_filename_cmp(name, lx->name->data, len) != 0)\n        {\n            break;\n        }\n    }\n\n    q = ngx_queue_next(q);\n\n    if (q == x) {\n        ngx_http_dynamic_core_create_locations_list(locations, x);\n        return;\n    }\n\n    ngx_queue_split(locations, q, &tail);\n    ngx_queue_add(&lq->list, &tail);\n\n    if (x == ngx_queue_sentinel(locations)) {\n        ngx_http_dynamic_core_create_locations_list(&lq->list,\n                                                    ngx_queue_head(&lq->list));\n        return;\n    }\n\n    ngx_queue_split(&lq->list, x, &tail);\n    ngx_queue_add(locations, &tail);\n\n    ngx_http_dynamic_core_create_locations_list(&lq->list,\n                                                ngx_queue_head(&lq->list));\n\n    ngx_http_dynamic_core_create_locations_list(locations, x);\n}\n\n/*\n * to keep cache locality for left leaf nodes, allocate nodes in following\n * order: node, left subtree, right subtree, inclusive subtree\n */\n\nstatic ngx_http_dynamic_location_tree_node_t *\nngx_http_dynamic_core_create_locations_tree(ngx_conf_t *cf,\n        ngx_queue_t *locations, size_t prefix)\n{\n    size_t                                  len;\n    ngx_queue_t                            *q, tail;\n    ngx_http_dynamic_location_queue_t      *lq;\n    ngx_http_dynamic_location_tree_node_t  *node;\n\n    q = ngx_queue_middle(locations);\n\n    lq = (ngx_http_dynamic_location_queue_t *) q;\n    len = lq->name->len - prefix;\n\n    node = ngx_palloc(cf->pool,\n                offsetof(ngx_http_dynamic_location_tree_node_t, name) + len);\n    if (node == NULL) {\n        return NULL;\n    }\n\n    node->left = NULL;\n    node->right = NULL;\n    node->tree = NULL;\n    node->exact = lq->exact;\n    node->inclusive = lq->inclusive;\n\n    node->len = (u_char) len;\n    ngx_memcpy(node->name, &lq->name->data[prefix], len);\n\n    ngx_queue_split(locations, q, &tail);\n\n    if (ngx_queue_empty(locations)) {\n        /*\n         * ngx_queue_split() insures that if left part is empty,\n         * then right one is empty too\n         */\n        goto inclusive;\n    }\n\n    node->left = ngx_http_dynamic_core_create_locations_tree(cf, locations,\n                                                             prefix);\n    if (node->left == NULL) {\n        return NULL;\n    }\n\n    ngx_queue_remove(q);\n\n    if (ngx_queue_empty(&tail)) {\n        goto inclusive;\n    }\n\n    node->right = ngx_http_dynamic_core_create_locations_tree(cf, &tail,\n                                                              prefix);\n    if (node->right == NULL) {\n        return NULL;\n    }\n\ninclusive:\n\n    if (ngx_queue_empty(&lq->list)) {\n        return node;\n    }\n\n    node->tree = ngx_http_dynamic_core_create_locations_tree(cf, &lq->list,\n                                                             prefix + len);\n    if (node->tree == NULL) {\n        return NULL;\n    }\n\n    return node;\n}\n\nstatic ngx_int_t\nngx_http_dynamic_core_init_locations(ngx_conf_t *cf,\n        ngx_http_dynamic_core_loc_conf_t *phdclcf)\n{\n    ngx_queue_t                            *q, *locations, tail;\n    ngx_http_dynamic_core_loc_conf_t       *hdclcf;\n    ngx_http_dynamic_location_queue_t      *lq;\n    ngx_http_dynamic_core_loc_conf_t      **hdclcfp;\n#if (NGX_PCRE)\n    ngx_uint_t                              r;\n    ngx_queue_t                            *regex;\n#endif\n\n    locations = phdclcf->locations;\n\n    if (locations == NULL) {\n        return NGX_OK;\n    }\n\n    ngx_queue_sort(locations, ngx_http_dynamic_core_cmp_locations);\n\n#if (NGX_PCRE)\n    regex = NULL;\n    r = 0;\n#endif\n\n    for (q = ngx_queue_head(locations);\n         q != ngx_queue_sentinel(locations);\n         q = ngx_queue_next(q))\n    {\n        lq = (ngx_http_dynamic_location_queue_t *) q;\n\n        hdclcf = lq->exact ? lq->exact : lq->inclusive;\n\n#if (NGX_PCRE)\n\n        if (hdclcf->regex) {\n            r++;\n\n            if (regex == NULL) {\n                regex = q;\n            }\n\n            continue;\n        }\n\n#endif\n    }\n\n    if (q != ngx_queue_sentinel(locations)) {\n        ngx_queue_split(locations, q, &tail);\n    }\n\n#if (NGX_PCRE)\n\n    if (regex) {\n\n        hdclcfp = ngx_palloc(cf->pool,\n                    (r + 1) * sizeof(ngx_http_dynamic_core_loc_conf_t *));\n        if (hdclcfp == NULL) {\n            return NGX_ERROR;\n        }\n\n        phdclcf->regex_locations = hdclcfp;\n\n        for (q = regex;\n             q != ngx_queue_sentinel(locations);\n             q = ngx_queue_next(q))\n        {\n            lq = (ngx_http_dynamic_location_queue_t *) q;\n\n            *(hdclcfp++) = lq->exact;\n        }\n\n        *hdclcfp = NULL;\n\n        ngx_queue_split(locations, regex, &tail);\n    }\n\n#endif\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_http_dynamic_core_init_static_location_trees(ngx_conf_t *cf,\n    \tngx_http_dynamic_core_loc_conf_t *phdclcf)\n{\n    ngx_queue_t                            *locations;\n\n    locations = phdclcf->locations;\n\n    if (locations == NULL) {\n        return NGX_OK;\n    }\n\n    if (ngx_queue_empty(locations)) {\n        return NGX_OK;\n    }\n\n    if (ngx_http_dynamic_core_join_exact_locations(cf, locations) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    ngx_http_dynamic_core_create_locations_list(locations,\n                                                ngx_queue_head(locations));\n\n    phdclcf->static_locations =\n        ngx_http_dynamic_core_create_locations_tree(cf, locations, 0);\n    if (phdclcf->static_locations == NULL) {\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\nstatic ngx_int_t\nngx_http_dynamic_core_add_location(ngx_conf_t *cf, ngx_queue_t **locations,\n        ngx_http_dynamic_core_loc_conf_t *hdclcf)\n{\n    ngx_http_dynamic_location_queue_t              *lq;\n\n    if (ngx_http_dynamic_core_predeal_location(cf, hdclcf) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    if (*locations == NULL) {\n        *locations = ngx_pcalloc(cf->temp_pool,\n                                 sizeof(ngx_http_location_queue_t));\n        if (*locations == NULL) {\n            return NGX_ERROR;\n        }\n\n        ngx_queue_init(*locations);\n    }\n\n    lq = ngx_pcalloc(cf->temp_pool, sizeof(ngx_http_location_queue_t));\n    if (lq == NULL) {\n        return NGX_ERROR;\n    }\n\n    if (hdclcf->exact_match\n#if (NGX_PCRE)\n        || hdclcf->regex\n#endif\n        )\n    {\n        lq->exact = hdclcf;\n        lq->inclusive = NULL;\n    } else {\n        lq->exact = NULL;\n        lq->inclusive = hdclcf;\n    }\n\n    lq->name = &hdclcf->name;\n    lq->file_name = cf->conf_file->file.name.data;\n    lq->line = cf->conf_file->line;\n\n    ngx_queue_init(&lq->list);\n\n    ngx_queue_insert_tail(*locations, &lq->queue);\n\n    return NGX_OK;\n}\n\n/*\n * NGX_OK       - exact or regex match\n * NGX_AGAIN    - inclusive match\n * NGX_DECLINED - no match\n */\n\nstatic ngx_int_t\nngx_http_dynamic_core_find_static_location(ngx_http_request_t *r,\n        ngx_http_dynamic_core_loc_conf_t *phdclcf,\n        ngx_http_dynamic_core_loc_conf_t **hdclcf)\n{\n    ngx_http_dynamic_location_tree_node_t  *node;\n    u_char                                 *uri;\n    size_t                                  len, n;\n    ngx_int_t                               rc, rv;\n\n    len = r->uri.len;\n    uri = r->uri.data;\n\n    rv = NGX_DECLINED;\n\n    node = phdclcf->static_locations;\n\n    for ( ;; ) {\n\n        if (node == NULL) {\n            return rv;\n        }\n\n        ngx_log_debug2(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n                       \"test location: \\\"%*s\\\"\",\n                       (size_t) node->len, node->name);\n\n        n = (len <= (size_t) node->len) ? len : node->len;\n\n        rc = ngx_filename_cmp(uri, node->name, n);\n\n        if (rc != 0) {\n            node = (rc < 0) ? node->left : node->right;\n\n            continue;\n        }\n\n        if (len > (size_t) node->len) {\n\n            if (node->inclusive) {\n\n                *hdclcf = node->inclusive->\n                            loc_conf[ngx_http_dynamic_core_module.ctx_index];\n                rv = NGX_AGAIN;\n\n                node = node->tree;\n                uri += n;\n                len -= n;\n\n                continue;\n            }\n\n            /* exact only */\n\n            node = node->right;\n\n            continue;\n        }\n\n        if (len == (size_t) node->len) {\n\n            if (node->exact) {\n                *hdclcf = node->exact->\n                            loc_conf[ngx_http_dynamic_core_module.ctx_index];\n                return NGX_OK;\n\n            } else {\n                *hdclcf = node->inclusive->\n                            loc_conf[ngx_http_dynamic_core_module.ctx_index];\n                return NGX_AGAIN;\n            }\n        }\n\n        /* len < node->len */\n\n        node = node->left;\n    }\n}\n\n/*\n * NGX_OK       - exact or regex match\n * NGX_AGAIN    - inclusive match\n * NGX_ERROR    - regex error\n * NGX_DECLINED - no match\n */\n\nstatic ngx_int_t\nngx_http_dynamic_core_find_location(ngx_http_request_t *r,\n        ngx_http_dynamic_core_srv_conf_t *hdcscf,\n        ngx_http_dynamic_core_loc_conf_t **hdclcf)\n{\n    ngx_int_t                               rc;\n    ngx_http_dynamic_core_loc_conf_t       *phdclcf;\n#if (NGX_PCRE)\n    ngx_int_t                               n;\n    ngx_uint_t                              noregex;\n    ngx_http_dynamic_core_loc_conf_t      **hdclcfp;\n\n    noregex = 0;\n#endif\n\n    phdclcf = hdcscf->hdclcf;\n\n    rc = ngx_http_dynamic_core_find_static_location(r, phdclcf, hdclcf);\n\n    if (rc == NGX_AGAIN) {\n\n#if (NGX_PCRE)\n        noregex = (*hdclcf)->noregex;\n#endif\n\n    }\n\n    if (rc == NGX_OK || rc == NGX_DONE) {\n        return rc;\n    }\n\n    /* rc == NGX_DECLINED or rc == NGX_AGAIN in nested location */\n\n#if (NGX_PCRE)\n\n    if (noregex == 0 && phdclcf->regex_locations) {\n\n        for (hdclcfp = phdclcf->regex_locations; *hdclcfp; hdclcfp++) {\n\n            ngx_log_debug1(NGX_LOG_DEBUG_HTTP, r->connection->log, 0,\n                           \"test location: ~ \\\"%V\\\"\", &(*hdclcfp)->name);\n\n            n = ngx_regex_exec((*hdclcfp)->regex->regex, &r->uri, NULL, 0);\n\n            if (n == NGX_OK) {\n                *hdclcf = (*hdclcfp)->\n                            loc_conf[ngx_http_dynamic_core_module.ctx_index];\n\n                return NGX_OK;\n            }\n\n            if (n == NGX_REGEX_NO_MATCHED) {\n                continue;\n            }\n\n            return NGX_ERROR;\n        }\n    }\n#endif\n\n    return rc;\n}\n\nstatic ngx_int_t\nngx_http_dynamic_core_init_virtual_servers(ngx_conf_t *cf,\n        ngx_http_dynamic_conf_t *hdcf)\n{\n    ngx_http_dynamic_core_main_conf_t      *hdcmcf;\n    ngx_http_dynamic_core_srv_conf_t      **hdcscfp;\n    ngx_hash_init_t                         hash;\n    ngx_hash_keys_arrays_t                  ha;\n    ngx_http_dynamic_server_name_t         *name;\n    ngx_uint_t                              s, n;\n    ngx_int_t                               rc;\n#if (NGX_PCRE)\n    ngx_uint_t                              regex, i;\n\n    regex = 0;\n#endif\n\n    hdcmcf = hdcf->main_conf[ngx_http_dynamic_core_module.ctx_index];\n\n    ngx_memzero(&ha, sizeof(ngx_hash_keys_arrays_t));\n\n    ha.temp_pool = ngx_create_pool(NGX_DEFAULT_POOL_SIZE, cf->log);\n    if (ha.temp_pool == NULL) {\n        return NGX_ERROR;\n    }\n\n    ha.pool = cf->pool;\n\n    if (ngx_hash_keys_array_init(&ha, NGX_HASH_LARGE) != NGX_OK) {\n        goto failed;\n    }\n\n    hdcscfp = hdcmcf->servers.elts;\n    hdcmcf->default_server = hdcscfp[0];\n\n    for (s = 0; s < hdcmcf->servers.nelts; ++s) {\n\n        name = hdcscfp[s]->server_names.elts;\n\n        for (n = 0; n < hdcscfp[s]->server_names.nelts; ++n) {\n#if (NGX_PCRE)\n            if (name[n].regex) {\n                ++regex;\n                continue;\n            }\n#endif\n\n            rc = ngx_hash_add_key(&ha, &name[n].name, name[n].server,\n                                  NGX_HASH_WILDCARD_KEY);\n            if (rc == NGX_ERROR) {\n                return NGX_ERROR;\n            }\n\n            if (rc == NGX_DECLINED) {\n                ngx_log_error(NGX_LOG_EMERG, cf->log, 0,\n                        \"invalid server name or wildcard \\\"%V\\\"\",\n                        &name[n].name);\n                return NGX_ERROR;\n            }\n\n            if (rc == NGX_BUSY) {\n                ngx_log_error(NGX_LOG_WARN, cf->log, 0,\n                        \"conflicting server name \\\"%V\\\", ignored\",\n                        &name[n].name);\n            }\n        }\n    }\n\n    hash.key = ngx_hash_key_lc;\n    hash.max_size = hdcmcf->server_names_hash_max_size;\n    hash.bucket_size = hdcmcf->server_names_hash_bucket_size;\n    hash.name = \"http_dynamic_server_names_hash\";\n    hash.pool = cf->pool;\n\n    if (ha.keys.nelts) {\n        hash.hash = &hdcmcf->names.hash;\n        hash.temp_pool = NULL;\n\n        if (ngx_hash_init(&hash, ha.keys.elts, ha.keys.nelts) != NGX_OK) {\n            goto failed;\n        }\n    }\n\n    if (ha.dns_wc_head.nelts) {\n\n        ngx_qsort(ha.dns_wc_head.elts, (size_t) ha.dns_wc_head.nelts,\n                  sizeof(ngx_hash_key_t), ngx_dynamic_cmp_dns_wildcards);\n\n        hash.hash = NULL;\n        hash.temp_pool = ha.temp_pool;\n\n        if (ngx_hash_wildcard_init(&hash, ha.dns_wc_head.elts,\n            ha.dns_wc_head.nelts) != NGX_OK)\n        {\n            goto failed;\n        }\n\n        hdcmcf->names.wc_head = (ngx_hash_wildcard_t *) hash.hash;\n    }\n\n    if (ha.dns_wc_tail.nelts) {\n\n        ngx_qsort(ha.dns_wc_tail.elts, (size_t) ha.dns_wc_tail.nelts,\n                  sizeof(ngx_hash_key_t), ngx_dynamic_cmp_dns_wildcards);\n\n        hash.hash = NULL;\n        hash.temp_pool = ha.temp_pool;\n\n        if (ngx_hash_wildcard_init(&hash, ha.dns_wc_tail.elts,\n            ha.dns_wc_tail.nelts) != NGX_OK)\n        {\n            goto failed;\n        }\n\n        hdcmcf->names.wc_tail = (ngx_hash_wildcard_t *) hash.hash;\n\n    }\n\n    ngx_destroy_pool(ha.temp_pool);\n\n#if (NGX_PCRE)\n    if (regex == 0) {\n        return NGX_OK;\n    }\n\n    hdcmcf->nregex = regex;\n    hdcmcf->regex = ngx_pcalloc(cf->pool,\n                                regex * sizeof(ngx_http_dynamic_server_name_t));\n    if (hdcmcf->regex == NULL) {\n        return NGX_ERROR;\n    }\n\n    i = 0;\n\n    for (s = 0; s < hdcmcf->servers.nelts; ++s) {\n\n        name = hdcscfp[s]->server_names.elts;\n\n        for (n = 0; n < hdcscfp[s]->server_names.nelts; ++n) {\n            if (name[n].regex) {\n                hdcmcf->regex[i++] = name[n];\n            }\n        }\n    }\n#endif\n\n    return NGX_OK;\n\nfailed:\n    ngx_destroy_pool(ha.temp_pool);\n\n    return NGX_ERROR;\n}\n\nstatic ngx_int_t\nngx_http_dynamic_core_find_virtual_server(ngx_http_request_t *r,\n        ngx_http_dynamic_core_main_conf_t *hdcmcf,\n        ngx_http_dynamic_core_srv_conf_t **hdcscfp)\n{\n    ngx_http_dynamic_core_srv_conf_t       *hdcscf;\n    ngx_str_t                              *server;\n\n    server = &r->headers_in.server;\n\n    hdcscf = ngx_hash_find_combined(&hdcmcf->names,\n                                    ngx_hash_key(server->data, server->len),\n                                    server->data, server->len);\n\n    if (hdcscf) {\n        *hdcscfp = hdcscf;\n        return NGX_OK;\n    }\n\n#if (NGX_PCRE)\n\n    if (server->len && hdcmcf->nregex) {\n        ngx_int_t                           n;\n        ngx_uint_t                          i;\n        ngx_http_dynamic_server_name_t     *sn;\n\n        sn = hdcmcf->regex;\n\n        for (i = 0; i < hdcmcf->nregex; ++i) {\n\n            n = ngx_regex_exec(sn[i].regex->regex, server, NULL, 0);\n\n            if (n == NGX_REGEX_NO_MATCHED) {\n                continue;\n            }\n\n            if (n >= 0) {\n                *hdcscfp = sn[i].server;\n                return NGX_OK;\n            }\n\n            return NGX_ERROR;\n        }\n    }\n#endif\n\n    return NGX_DECLINED;\n}\n\nstatic char *\nngx_http_dynamic_core_location(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_dynamic_module_t              *module;\n    ngx_http_dynamic_core_loc_conf_t       *hdclcf, *phdclcf;\n    ngx_http_dynamic_core_srv_conf_t       *hdcscf;\n    ngx_conf_t                              pcf;\n    void                                   *mconf, **loc_conf;\n    ngx_uint_t                              i, ci;\n    char                                   *rv = NULL;\n\n    hdcscf = conf;\n    phdclcf = hdcscf->hdclcf;\n\n    /* loc_conf is temp cause hdclcf does not created now */\n    loc_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);\n    if (loc_conf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    for (i = 0; cf->cycle->modules[i]; ++i) {\n        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {\n            continue;\n        }\n\n        module = (ngx_http_dynamic_module_t *)\n                    cf->cycle->modules[i]->spare_hook0;\n\n        if (module == NULL) {\n            continue;\n        }\n\n        if (module->create_loc_conf) {\n            mconf = module->create_loc_conf(cf);\n            if (mconf == NULL) {\n                return NGX_CONF_ERROR;\n            }\n\n            loc_conf[cf->cycle->modules[i]->ctx_index] = mconf;\n        }\n    }\n\n    hdclcf = loc_conf[ngx_http_dynamic_core_module.ctx_index];\n    hdclcf->loc_conf = loc_conf;\n\n    if (ngx_http_dynamic_core_add_location(cf, &phdclcf->locations, hdclcf)\n        != NGX_OK)\n    {\n        return NGX_CONF_ERROR;\n    }\n\n    pcf = *cf;\n    cf->ctx = hdclcf->loc_conf;\n    cf->cmd_type = NGX_HTTP_LOC_CONF;\n\n    if (ngx_dynamic_conf_parse(cf, 0) != NGX_OK) {\n        goto failed;\n    }\n\n    for (i = 0; cf->cycle->modules[i]; ++i) {\n        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {\n            continue;\n        }\n\n        module = (ngx_http_dynamic_module_t *)\n                    cf->cycle->modules[i]->spare_hook0;\n        ci = cf->cycle->modules[i]->ctx_index;\n        if (module == NULL) {\n            continue;\n        }\n\n        if (module->init_loc_conf) {\n            rv = module->init_loc_conf(cf, hdclcf->loc_conf[ci]);\n            if (rv != NGX_CONF_OK) {\n                goto failed;\n            }\n        }\n    }\n\n    *cf = pcf;\n\n    return NGX_CONF_OK;\n\nfailed:\n    *cf = pcf;\n\n    if (rv) {\n        return rv;\n    }\n\n    return NGX_CONF_ERROR;\n}\n\nstatic char *\nngx_http_dynamic_core_server_name(ngx_conf_t *cf, ngx_command_t *cmd,\n        void *conf)\n{\n    ngx_http_dynamic_core_srv_conf_t       *hdcscf;\n    u_char                                  ch;\n    ngx_str_t                              *value;\n    ngx_uint_t                              i;\n    ngx_http_dynamic_server_name_t         *sn;\n\n    hdcscf = conf;\n\n    value = cf->args->elts;\n\n    for (i = 1; i < cf->args->nelts; i++) {\n\n        ch = value[i].data[0];\n\n        if ((ch == '*' && (value[i].len < 3 || value[i].data[1] != '.'))\n            || (ch == '.' && value[i].len < 2))\n        {\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                               \"server name \\\"%V\\\" is invalid\", &value[i]);\n            return NGX_CONF_ERROR;\n        }\n\n        if (ngx_strchr(value[i].data, '/')) {\n            ngx_conf_log_error(NGX_LOG_WARN, cf, 0,\n                               \"server name \\\"%V\\\" has suspicious symbols\",\n                               &value[i]);\n        }\n\n        sn = ngx_array_push(&hdcscf->server_names);\n        if (sn == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n#if (NGX_PCRE)\n        sn->regex = NULL;\n#endif\n        sn->server = hdcscf;\n\n        if (ngx_strcasecmp(value[i].data, (u_char *) \"$hostname\") == 0) {\n            sn->name = cf->cycle->hostname;\n\n        } else {\n            sn->name = value[i];\n        }\n\n        if (value[i].data[0] != '~') {\n            ngx_strlow(sn->name.data, sn->name.data, sn->name.len);\n            continue;\n        }\n\n#if (NGX_PCRE)\n        {\n        u_char                             *p;\n        ngx_regex_compile_t                 rc;\n        u_char                              errstr[NGX_MAX_CONF_ERRSTR];\n\n        if (value[i].len == 1) {\n            ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                               \"empty regex in server name \\\"%V\\\"\", &value[i]);\n            return NGX_CONF_ERROR;\n        }\n\n        value[i].len--;\n        value[i].data++;\n\n        ngx_memzero(&rc, sizeof(ngx_regex_compile_t));\n\n        rc.pattern = value[i];\n        rc.err.len = NGX_MAX_CONF_ERRSTR;\n        rc.err.data = errstr;\n\n        for (p = value[i].data; p < value[i].data + value[i].len; p++) {\n            if (*p >= 'A' && *p <= 'Z') {\n                rc.options = NGX_REGEX_CASELESS;\n                break;\n            }\n        }\n\n        sn->regex = ngx_dynamic_regex_compile(cf, &rc);\n        if (sn->regex == NULL) {\n            return NGX_CONF_ERROR;\n        }\n\n        sn->name = value[i];\n        }\n#else\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                           \"using regex \\\"%V\\\" \"\n                           \"requires PCRE library\", &value[i]);\n\n        return NGX_CONF_ERROR;\n#endif\n    }\n\n    return NGX_CONF_OK;\n}\n\nstatic char *\nngx_http_dynamic_core_server(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_dynamic_module_t              *module;\n    ngx_http_dynamic_core_main_conf_t      *hdcmcf;\n    ngx_http_dynamic_core_srv_conf_t       *hdcscf, **hdcscfp;\n    ngx_http_dynamic_core_loc_conf_t       *phdclcf;\n    ngx_conf_t                              pcf;\n    void                                   *mconf, **srv_conf;\n    ngx_uint_t                              i, ci;\n    char                                   *rv = NULL;\n\n    hdcmcf = conf;\n\n    /* srv_conf is temp cause hdcscf does not created now */\n    srv_conf = ngx_pcalloc(cf->pool, sizeof(void *) * ngx_http_max_module);\n    if (srv_conf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    for (i = 0; cf->cycle->modules[i]; ++i) {\n        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {\n            continue;\n        }\n\n        module = (ngx_http_dynamic_module_t *)\n                    cf->cycle->modules[i]->spare_hook0;\n        if (module == NULL) {\n            continue;\n        }\n\n        if (module->create_srv_conf) {\n            mconf = module->create_srv_conf(cf);\n            if (mconf == NULL) {\n                return NGX_CONF_ERROR;\n            }\n\n            srv_conf[cf->cycle->modules[i]->ctx_index] = mconf;\n        }\n    }\n\n    hdcscf = srv_conf[ngx_http_dynamic_core_module.ctx_index];\n    hdcscf->srv_conf = srv_conf;\n\n    hdcscf->hdclcf = ngx_pcalloc(cf->pool,\n                                 sizeof(ngx_http_dynamic_core_loc_conf_t));\n\n    /* save hdcscf into hdcmcf */\n    hdcscfp = ngx_array_push(&hdcmcf->servers);\n    if (hdcscfp == NULL) {\n        return NGX_CONF_ERROR;\n    }\n    *hdcscfp = hdcscf;\n\n    pcf = *cf;\n    cf->ctx = hdcscf->srv_conf;\n    cf->cmd_type = NGX_HTTP_SRV_CONF;\n\n    if (ngx_dynamic_conf_parse(cf, 0) != NGX_OK) {\n        goto failed;\n    }\n\n    for (i = 0; cf->cycle->modules[i]; ++i) {\n        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {\n            continue;\n        }\n\n        module = (ngx_http_dynamic_module_t *)\n                    cf->cycle->modules[i]->spare_hook0;\n        ci = cf->cycle->modules[i]->ctx_index;\n        if (module == NULL) {\n            continue;\n        }\n\n        if (module->init_srv_conf) {\n            rv = module->init_srv_conf(cf, hdcscf->srv_conf[ci]);\n            if (rv != NGX_CONF_OK) {\n                goto failed;\n            }\n        }\n    }\n\n    *cf = pcf;\n\n    phdclcf = hdcscf->hdclcf;\n\n    if (ngx_http_dynamic_core_init_locations(cf, phdclcf) != NGX_OK) {\n        return NGX_CONF_ERROR;\n    }\n\n    if (ngx_http_dynamic_core_init_static_location_trees(cf, phdclcf) != NGX_OK) {\n        return NGX_CONF_ERROR;\n    }\n\n    return NGX_CONF_OK;\n\nfailed:\n    *cf = pcf;\n\n    if (rv) {\n        return rv;\n    }\n\n    return NGX_CONF_ERROR;\n\n}\n\nstatic char *\nngx_http_dynamic_block(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_dynamic_conf_t                *hdccf;\n    ngx_http_dynamic_module_t              *module;\n    ngx_conf_t                              pcf;\n    ngx_uint_t                              i, ci;\n    char                                   *rv = NULL;\n\n    hdccf = conf;\n\n    /* create main_conf ctx */\n    hdccf->main_conf = ngx_pcalloc(cf->pool, sizeof(void *)\n                                   * ngx_http_max_module);\n    if (hdccf->main_conf == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    /* create http dynamic conf for all http module */\n    for (i = 0; cf->cycle->modules[i]; ++i) {\n        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {\n            continue;\n        }\n\n        module = (ngx_http_dynamic_module_t *)\n                    cf->cycle->modules[i]->spare_hook0;\n        ci = cf->cycle->modules[i]->ctx_index;\n\n        if (module == NULL) {\n            continue;\n        }\n\n        if (module->create_main_conf) {\n            hdccf->main_conf[ci] = module->create_main_conf(cf);\n            if (hdccf->main_conf[ci] == NULL) {\n                return NGX_CONF_ERROR;\n            }\n        }\n    }\n\n    /* save conf for recovery */\n    pcf = *cf;\n\n    cf->ctx = hdccf->main_conf;\n    cf->module_type = NGX_HTTP_MODULE;\n    cf->cmd_type = NGX_HTTP_MAIN_CONF;\n\n    if (ngx_dynamic_conf_parse(cf, 0) != NGX_OK) {\n        goto failed;\n    }\n\n    for (i = 0; cf->cycle->modules[i]; ++i) {\n        if (cf->cycle->modules[i]->type != NGX_HTTP_MODULE) {\n            continue;\n        }\n\n        module = (ngx_http_dynamic_module_t *)\n                    cf->cycle->modules[i]->spare_hook0;\n        ci = cf->cycle->modules[i]->ctx_index;\n\n        if (module == NULL) {\n            continue;\n        }\n\n        if (module->init_main_conf) {\n            rv = module->init_main_conf(cf, hdccf->main_conf[ci]);\n            if (rv != NGX_CONF_OK) {\n                goto failed;\n            }\n        }\n    }\n\n    if (ngx_http_dynamic_core_init_virtual_servers(cf, hdccf) != NGX_OK) {\n        goto failed;\n    }\n\n    *cf = pcf;\n\n    return NGX_CONF_OK;\n\nfailed:\n    *cf = pcf;\n\n    if (rv) {\n        return rv;\n    }\n\n    return NGX_CONF_ERROR;\n}\n\n\n/* interface from here */\n\nvoid *\nngx_http_get_module_main_dconf(ngx_http_request_t *r, ngx_module_t *m)\n{\n    ngx_http_dynamic_conf_t                *hdcf;\n\n    hdcf = ngx_get_dconf(&ngx_http_dynamic_module);\n    if (hdcf == NULL) {\n        return NULL;\n    }\n\n    return hdcf->main_conf[m->ctx_index];\n}\n\nvoid *\nngx_http_get_module_srv_dconf(ngx_http_request_t *r, ngx_module_t *m)\n{\n    ngx_http_dynamic_core_main_conf_t      *hdcmcf;\n    ngx_http_dynamic_core_srv_conf_t       *hdcscf;\n    ngx_int_t                               rc;\n\n    hdcmcf = ngx_http_get_module_main_dconf(r, &ngx_http_dynamic_core_module);\n    if (hdcmcf == NULL) {\n        return NULL;\n    }\n\n    rc = ngx_http_dynamic_core_find_virtual_server(r, hdcmcf, &hdcscf);\n    switch (rc) {\n    case NGX_ERROR:\n        return NULL;\n    case NGX_DECLINED:  /* virtual server not found */\n        return hdcmcf->default_server->srv_conf[m->ctx_index];\n    default:\n        return hdcscf->srv_conf[m->ctx_index];\n    }\n}\n\nvoid *\nngx_http_get_module_loc_dconf(ngx_http_request_t *r, ngx_module_t *m)\n{\n    ngx_http_dynamic_core_srv_conf_t       *hdcscf;\n    ngx_http_dynamic_core_loc_conf_t       *hdclcf;\n    ngx_int_t                               rc;\n\n    hdcscf = ngx_http_get_module_srv_dconf(r, &ngx_http_dynamic_core_module);\n    if (hdcscf == NULL) {\n        return NULL;\n    }\n\n    hdclcf = NULL;\n    rc = ngx_http_dynamic_core_find_location(r, hdcscf, &hdclcf);\n    if (rc == NGX_ERROR) {\n        return NULL;\n    }\n\n    if (hdclcf) {\n        return hdclcf->loc_conf[m->ctx_index];\n    }\n\n    return NULL;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_http_dynamic.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_HTTP_DYNAMIC_H_INCLUDED_\n#define _NGX_HTTP_DYNAMIC_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n\ntypedef struct {\n    void       *(*create_main_conf)(ngx_conf_t *cf);\n    char       *(*init_main_conf)(ngx_conf_t *cf, void *conf);\n\n    void       *(*create_srv_conf)(ngx_conf_t *cf);\n    char       *(*init_srv_conf)(ngx_conf_t *cf, void *conf);\n\n    void       *(*create_loc_conf)(ngx_conf_t *cf);\n    char       *(*init_loc_conf)(ngx_conf_t *cf, void *conf);\n} ngx_http_dynamic_module_t;\n\n\nvoid *ngx_http_get_module_main_dconf(ngx_http_request_t *r, ngx_module_t *m);\nvoid *ngx_http_get_module_srv_dconf(ngx_http_request_t *r, ngx_module_t *m);\nvoid *ngx_http_get_module_loc_dconf(ngx_http_request_t *r, ngx_module_t *m);\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_http_trace_module.c",
    "content": "#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n\n\ntypedef struct {\n    ngx_flag_t                  trace;\n} ngx_http_trace_main_conf_t;\n\n\ntypedef struct {\n    u_char                      traceid[32]; /* X-NTM-Traceid */\n    u_char                      cid[32];     /* X-NTM-Currentid */\n    u_char                      pid[32];     /* X-NTM-Parentid */\n    ngx_flag_t                  debug;       /* X-NTM-Debug */\n} ngx_http_trace_ctx_t;\n\n\nstatic void *ngx_http_trace_create_main_conf(ngx_conf_t *cf);\nstatic char *ngx_http_trace_init_main_conf(ngx_conf_t *cf, void *conf);\n\nstatic char *ngx_http_trace(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\n\nstatic ngx_int_t ngx_http_trace_add_variables(ngx_conf_t *cf);\nstatic ngx_int_t ngx_http_trace_init(ngx_conf_t *cf);\n\nstatic ngx_int_t ngx_http_trace_traceid_variable(ngx_http_request_t *r,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_http_trace_currentid_variable(ngx_http_request_t *r,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_http_trace_parentid_variable(ngx_http_request_t *r,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_http_trace_debug_variable(ngx_http_request_t *r,\n    ngx_http_variable_value_t *v, uintptr_t data);\nstatic ngx_int_t ngx_http_trace_newid_variable(ngx_http_request_t *r,\n    ngx_http_variable_value_t *v, uintptr_t data);\n\n\nstatic ngx_command_t  ngx_http_trace_commands[] = {\n\n    { ngx_string(\"http_trace\"),\n      NGX_HTTP_MAIN_CONF|NGX_CONF_NOARGS,\n      ngx_http_trace,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_http_trace_module_ctx = {\n    ngx_http_trace_add_variables,           /* preconfiguration */\n    ngx_http_trace_init,                    /* postconfiguration */\n\n    ngx_http_trace_create_main_conf,        /* create main configuration */\n    ngx_http_trace_init_main_conf,          /* init main configuration */\n\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n\n    NULL,                                   /* create location configuration */\n    NULL                                    /* merge location configuration */\n};\n\n\nngx_module_t  ngx_http_trace_module = {\n    NGX_MODULE_V1,\n    &ngx_http_trace_module_ctx,             /* module context */\n    ngx_http_trace_commands,                /* module directives */\n    NGX_HTTP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_http_variable_t  ngx_http_trace_vars[] = {\n\n    { ngx_string(\"ntm_traceid\"), NULL,\n      ngx_http_trace_traceid_variable, 0, 0, 0 },\n\n    { ngx_string(\"ntm_currentid\"), NULL,\n      ngx_http_trace_currentid_variable, 0, 0, 0 },\n\n    { ngx_string(\"ntm_parentid\"), NULL,\n      ngx_http_trace_parentid_variable, 0, 0, 0 },\n\n    { ngx_string(\"ntm_debug\"), NULL,\n      ngx_http_trace_debug_variable, 0, 0, 0 },\n\n    { ngx_string(\"ntm_newid\"), NULL,\n      ngx_http_trace_newid_variable, 0, 0, 0 },\n\n    { ngx_null_string, NULL, NULL, 0, 0, 0 }\n};\n\n\nstatic void\nngx_http_trace_genid(u_char *id) {\n    ngx_sprintf(id, \"%08xD%08xD%08xD%08xD\",\n                (uint32_t) ngx_random(), (uint32_t) ngx_random(),\n                (uint32_t) ngx_random(), (uint32_t) ngx_random());\n}\n\n\nstatic u_char *\nngx_http_trace_log_error(ngx_log_t *log, u_char *buf, size_t len)\n{\n    u_char                         *p;\n    ngx_http_request_t             *r;\n    ngx_http_log_ctx_t             *ctx;\n    ngx_http_trace_ctx_t           *tctx;\n    ngx_str_t                       traceid, currentid, parentid;\n\n    if (log->action) {\n        p = ngx_snprintf(buf, len, \" while %s\", log->action);\n        len -= p - buf;\n        buf = p;\n    }\n\n    ctx = log->data;\n\n    p = ngx_snprintf(buf, len, \", client: %V\", &ctx->connection->addr_text);\n    len -= p - buf;\n    buf = p;\n\n    r = ctx->request;\n\n    if (r) {\n        p = r->log_handler(r, ctx->current_request, p, len);\n        len -= p - buf;\n        buf = p;\n\n    } else {\n        p = ngx_snprintf(p, len, \", server: %V\",\n                         &ctx->connection->listening->addr_text);\n        len -= p - buf;\n        buf = p;\n    }\n\n    tctx = ngx_http_get_module_ctx(r, ngx_http_trace_module);\n    if (tctx) {\n        traceid.data = tctx->traceid;\n        traceid.len = sizeof(tctx->traceid);\n\n        currentid.data = tctx->cid;\n        currentid.len = sizeof(tctx->cid);\n\n        parentid.data = tctx->pid;\n        parentid.len = sizeof(tctx->pid);\n\n        p = ngx_snprintf(p, len, \", [NGINX-TRACE] traceid: %V, currentid: %V, \"\n            \"parentid: %V [NGINX-TRACE-END]\",\n            &traceid, &currentid, &parentid);\n    }\n\n    return p;\n}\n\n\n// First request without X-NTM-Traceid X-NTM-Currentid or X-NTM-Parentid\n// Need to gen these ids and set X-NTM headers in main request\nstatic ngx_int_t\nngx_http_trace_first_request(ngx_http_request_t *r, ngx_http_trace_ctx_t *ctx)\n{\n    ngx_table_elt_t                *h;\n\n    ngx_http_trace_genid(ctx->traceid);\n    ngx_http_trace_genid(ctx->cid);\n    ngx_sprintf(ctx->pid, \"00000000000000000000000000000000\");\n\n    // Set X-NTM-Traceid\n    h = ngx_list_push(&r->headers_in.headers);\n    if (h == NULL) {\n        return NGX_ERROR;\n    }\n\n    h->key.data = (u_char *) \"X-NTM-Traceid\";\n    h->key.len = sizeof(\"X-NTM-Traceid\") - 1;\n\n    h->value.data = ctx->traceid;\n    h->value.len = sizeof(ctx->traceid);\n\n    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);\n    if (h->lowcase_key == NULL) {\n        return NGX_ERROR;\n    }\n    h->hash = ngx_hash_strlow(h->lowcase_key, h->key.data, h->key.len);\n\n    // Set X-NTM-Currentid\n    h = ngx_list_push(&r->headers_in.headers);\n    if (h == NULL) {\n        return NGX_ERROR;\n    }\n\n    h->key.data = (u_char *) \"X-NTM-Currentid\";\n    h->key.len = sizeof(\"X-NTM-Currentid\") - 1;\n\n    h->value.data = ctx->cid;\n    h->value.len = sizeof(ctx->cid);\n\n    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);\n    if (h->lowcase_key == NULL) {\n        return NGX_ERROR;\n    }\n    h->hash = ngx_hash_strlow(h->lowcase_key, h->key.data, h->key.len);\n\n    // Set X-NTM-Parentid\n    h = ngx_list_push(&r->headers_in.headers);\n    if (h == NULL) {\n        return NGX_ERROR;\n    }\n\n    h->key.data = (u_char *) \"X-NTM-Parentid\";\n    h->key.len = sizeof(\"X-NTM-Parentid\") - 1;\n\n    h->value.data = ctx->pid;\n    h->value.len = sizeof(ctx->pid);\n\n    h->lowcase_key = ngx_pnalloc(r->pool, h->key.len);\n    if (h->lowcase_key == NULL) {\n        return NGX_ERROR;\n    }\n    h->hash = ngx_hash_strlow(h->lowcase_key, h->key.data, h->key.len);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_http_trace_handler(ngx_http_request_t *r)\n{\n    ngx_http_trace_main_conf_t     *tmcf;\n    ngx_http_trace_ctx_t           *ctx;\n    ngx_http_variable_value_t       v;\n    ngx_str_t                       header;\n\n    if (r != r->main) { // subrequest\n        return NGX_DECLINED;\n    }\n\n    tmcf = ngx_http_get_module_main_conf(r, ngx_http_trace_module);\n    if (!tmcf->trace) {\n        return NGX_DECLINED;\n    }\n\n    ctx = ngx_http_get_module_ctx(r, ngx_http_trace_module);\n    if (ctx) { // ctx already create, enter twice\n        return NGX_DECLINED;\n    }\n\n    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_trace_ctx_t));\n    if (ctx == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n    ngx_http_set_ctx(r, ctx, ngx_http_trace_module);\n\n    // traceid currentid parentid log into nginx error log\n    r->connection->log->handler = ngx_http_trace_log_error;\n\n    // Get X-NTM-Debug\n    header.data = (u_char *) \"http_x_ntm_debug\";\n    header.len = sizeof(\"http_x_ntm_debug\") - 1;\n    ngx_http_variable_unknown_header(&v, &header, &r->headers_in.headers.part,\n                                     sizeof(\"http_\") - 1);\n    if (!v.not_found && v.len == 1 && v.data[0] == '1') {\n        // Has header X-NTM-Debug: 1\n        ctx->debug = 1;\n    }\n\n    // Get X-NTM-Traceid\n    header.data = (u_char *) \"http_x_ntm_traceid\";\n    header.len = sizeof(\"http_x_ntm_traceid\") - 1;\n    ngx_http_variable_unknown_header(&v, &header, &r->headers_in.headers.part,\n                                     sizeof(\"http_\") - 1);\n    if (v.not_found) {\n        goto notfound;\n    }\n\n    ngx_memcpy(ctx->traceid, v.data, ngx_min(v.len, sizeof(ctx->traceid)));\n\n    // Get X-NTM-Currentid\n    header.data = (u_char *) \"http_x_ntm_currentid\";\n    header.len = sizeof(\"http_x_ntm_currentid\") - 1;\n    ngx_http_variable_unknown_header(&v, &header, &r->headers_in.headers.part,\n                                     sizeof(\"http_\") - 1);\n    if (v.not_found) {\n        goto notfound;\n    }\n\n    ngx_memcpy(ctx->cid, v.data, ngx_min(v.len, sizeof(ctx->cid)));\n\n    // Get X-NTM-Parentid\n    header.data = (u_char *) \"http_x_ntm_parentid\";\n    header.len = sizeof(\"http_x_ntm_parentid\") - 1;\n    ngx_http_variable_unknown_header(&v, &header, &r->headers_in.headers.part,\n                                     sizeof(\"http_\") - 1);\n    if (v.not_found) {\n        goto notfound;\n    }\n\n    ngx_memcpy(ctx->pid, v.data, ngx_min(v.len, sizeof(ctx->pid)));\n\n    return NGX_DECLINED;\n\nnotfound:\n\n    if (ngx_http_trace_first_request(r, ctx) != NGX_OK) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    return NGX_DECLINED;\n}\n\n\nstatic ngx_int_t\nngx_http_trace_traceid_variable(ngx_http_request_t *r,\n        ngx_http_variable_value_t *v, uintptr_t data)\n{\n    ngx_http_trace_ctx_t           *ctx;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_http_trace_module);\n    if (ctx == NULL) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    v->data = ctx->traceid;\n    v->len = sizeof(ctx->traceid);\n    v->valid = 1;\n    v->no_cacheable = 0;\n    v->not_found = 0;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_http_trace_currentid_variable(ngx_http_request_t *r,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    ngx_http_trace_ctx_t           *ctx;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_http_trace_module);\n    if (ctx == NULL) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    v->data = ctx->cid;\n    v->len = sizeof(ctx->cid);\n    v->valid = 1;\n    v->no_cacheable = 0;\n    v->not_found = 0;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_http_trace_parentid_variable(ngx_http_request_t *r,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    ngx_http_trace_ctx_t           *ctx;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_http_trace_module);\n    if (ctx == NULL) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    v->data = ctx->pid;\n    v->len = sizeof(ctx->pid);\n    v->valid = 1;\n    v->no_cacheable = 0;\n    v->not_found = 0;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_http_trace_debug_variable(ngx_http_request_t *r,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    ngx_http_trace_ctx_t           *ctx;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_http_trace_module);\n    if (ctx == NULL) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    if (ctx->debug) {\n        v->data = (u_char *) \"1\";\n    } else {\n        v->data = (u_char *) \"0\";\n    }\n\n    v->len = sizeof(\"1\") - 1;\n    v->valid = 1;\n    v->no_cacheable = 0;\n    v->not_found = 0;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_http_trace_newid_variable(ngx_http_request_t *r,\n    ngx_http_variable_value_t *v, uintptr_t data)\n{\n    ngx_http_trace_ctx_t           *ctx;\n    u_char                         *newid;\n\n    ctx = ngx_http_get_module_ctx(r, ngx_http_trace_module);\n    if (ctx == NULL) {\n        v->not_found = 1;\n        return NGX_OK;\n    }\n\n    newid = ngx_pcalloc(r->pool, sizeof(ctx->cid));\n    if (newid == NULL) {\n        return NGX_ERROR;\n    }\n\n    // fill newid\n    ngx_http_trace_genid(newid);\n\n    v->data = newid;\n    v->len = sizeof(ctx->cid);\n    v->valid = 1;\n    v->no_cacheable = 0;\n    v->not_found = 0;\n\n    return NGX_OK;\n}\n\n\nstatic void *\nngx_http_trace_create_main_conf(ngx_conf_t *cf)\n{\n    ngx_http_trace_main_conf_t     *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_trace_main_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->trace = NGX_CONF_UNSET;\n\n    return conf;\n}\n\n\nstatic char *\nngx_http_trace_init_main_conf(ngx_conf_t *cf, void *conf)\n{\n    ngx_http_trace_main_conf_t     *tmcf;\n\n    tmcf = conf;\n\n    ngx_conf_init_value(tmcf->trace, 0);\n\n    return NGX_CONF_OK;\n}\n\n\nstatic char *\nngx_http_trace(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_trace_main_conf_t     *tmcf;\n\n    tmcf = conf;\n\n    if (tmcf->trace != NGX_CONF_UNSET) {\n        return \"is duplicate\";\n    }\n\n    tmcf->trace = 1;\n\n    return NGX_CONF_OK;\n}\n\n\nstatic ngx_int_t\nngx_http_trace_add_variables(ngx_conf_t *cf)\n{\n    ngx_http_variable_t  *var, *v;\n\n    for (v = ngx_http_trace_vars; v->name.len; v++) {\n        var = ngx_http_add_variable(cf, &v->name, v->flags);\n        if (var == NULL) {\n            return NGX_ERROR;\n        }\n\n        var->get_handler = v->get_handler;\n        var->data = v->data;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_http_trace_init(ngx_conf_t *cf)\n{\n    ngx_http_handler_pt        *h;\n    ngx_http_core_main_conf_t  *cmcf;\n\n    cmcf = ngx_http_conf_get_module_main_conf(cf, ngx_http_core_module);\n\n    h = ngx_array_push(&cmcf->phases[NGX_HTTP_POST_READ_PHASE].handlers);\n    if (h == NULL) {\n        return NGX_ERROR;\n    }\n\n    *h = ngx_http_trace_handler;\n\n    return NGX_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_map.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include \"ngx_map.h\"\n\n\nstatic void\nngx_map_rbtree_insert_value(ngx_rbtree_node_t *temp, ngx_rbtree_node_t *node,\n        ngx_rbtree_node_t *sentinel)\n{\n    ngx_rbtree_node_t         **p;\n    intptr_t                   *raw_key, *raw_key_temp;\n    ngx_map_t                 **map;\n\n    for (;;) {\n\n        if (node->key < temp->key) {\n            p = &temp->left;\n        } else if (node->key > temp->key) {\n            p = &temp->right;\n        } else {\n            raw_key = (intptr_t *)((char *) node\n                                        + offsetof(ngx_map_node_t, raw_key));\n            raw_key_temp = (intptr_t *)((char *) temp\n                                        + offsetof(ngx_map_node_t, raw_key));\n            map = (ngx_map_t **)((char *) node + offsetof(ngx_map_node_t, map));\n\n            switch ((*map)->cmp(*raw_key, *raw_key_temp)) {\n            case -1:\n                p = &temp->left;\n                break;\n            case 1:\n                p = &temp->right;\n                break;\n            default:     /* key is duplicate */\n                return;\n            }\n        }\n\n        if (*p == sentinel) {\n            break;\n        }\n\n        temp = *p;\n    }\n\n    *p = node;\n    node->parent = temp;\n    node->left = sentinel;\n    node->right = sentinel;\n    ngx_rbt_red(node);\n}\n\nvoid\nngx_map_init(ngx_map_t *map, ngx_map_hash_pt hash, ngx_cmp_pt cmp)\n{\n    ngx_rbtree_init(&map->rbtree, &map->sentinel, ngx_map_rbtree_insert_value);\n    map->hash = hash;\n    map->cmp = cmp;\n}\n\nngx_map_node_t *\nngx_map_begin(ngx_map_t *map)\n{\n    ngx_rbtree_node_t          *p;\n\n    if (ngx_map_empty(map)) {\n        return NULL;\n    }\n\n    p = map->rbtree.root;\n\n    for (;;) {\n        if (p->left == map->rbtree.sentinel) {\n            break;\n        }\n\n        p = p->left;\n    }\n\n    return (ngx_map_node_t *) p;\n}\n\nngx_map_node_t *\nngx_map_rbegin(ngx_map_t *map)\n{\n    ngx_rbtree_node_t          *p;\n\n    if (ngx_map_empty(map)) {\n        return NULL;\n    }\n\n    p = map->rbtree.root;\n\n    for (;;) {\n        if (p->right == map->rbtree.sentinel) {\n            break;\n        }\n\n        p = p->right;\n    }\n\n    return (ngx_map_node_t *) p;\n}\n\nngx_map_node_t *\nngx_map_next(ngx_map_node_t *n)\n{\n    ngx_map_t                  *map;\n    ngx_rbtree_node_t          *p, *top;\n\n    map = n->map;\n    p = &n->rn;\n    top = NULL;\n\n    if (p->right != map->rbtree.sentinel) {\n        // current node has right subtree\n        top = p->right;\n    } else {\n        for (;;) {\n            if (p == map->rbtree.root) {\n                return NULL;\n            }\n\n            if (p->parent->left == p) {\n                return (ngx_map_node_t *) p->parent;\n            }\n\n            // p->parent->right == p\n            p = p->parent;\n        }\n    }\n\n    // get the mininum node\n    p = top;\n    for (;;) {\n        if (p->left == map->rbtree.sentinel) {\n            break;\n        }\n\n        p = p->left;\n    }\n\n    return (ngx_map_node_t *) p;\n}\n\nngx_map_node_t *\nngx_map_prev(ngx_map_node_t *n)\n{\n    ngx_map_t                  *map;\n    ngx_rbtree_node_t          *p, *top;\n\n    map = n->map;\n    p = &n->rn;\n    top = NULL;\n\n    if (p->left != map->rbtree.sentinel) {\n        // current node has left subtree\n        top = p->left;\n    } else {\n        for (;;) {\n            if (p == map->rbtree.root) {\n                return NULL;\n            }\n\n            if (p->parent->right == p) {\n                return (ngx_map_node_t *) p->parent;\n            }\n\n            // p->parent->left == p\n            p = p->parent;\n        }\n    }\n\n    // get the maximum node\n    p = top;\n    for (;;) {\n        if (p->right == map->rbtree.sentinel) {\n            break;\n        }\n\n        p = p->right;\n    }\n\n    return (ngx_map_node_t *) p;\n}\n\nvoid\nngx_map_insert(ngx_map_t *map, ngx_map_node_t *node, ngx_flag_t covered)\n{\n    ngx_map_node_t             *n;\n\n    node->rn.key = map->hash(node->raw_key);\n    node->map = map;\n\n    n = ngx_map_find(map, node->raw_key);\n    if (n == NULL) {\n        ngx_rbtree_insert(&map->rbtree, &node->rn);\n    } else if (covered) {\n        ngx_map_delete(map, node->raw_key);\n        ngx_rbtree_insert(&map->rbtree, &node->rn);\n    }\n}\n\nvoid\nngx_map_delete(ngx_map_t *map, intptr_t key)\n{\n    ngx_map_node_t             *node;\n\n    node = ngx_map_find(map, key);\n    if (node) {\n        ngx_rbtree_delete(&map->rbtree, &node->rn);\n    }\n}\n\nngx_map_node_t *\nngx_map_find(ngx_map_t *map, intptr_t key)\n{\n    ngx_rbtree_node_t          *p;\n    ngx_rbtree_key_t            k;\n    intptr_t                   *key_temp;\n\n    if (ngx_map_empty(map)) {\n        return NULL;\n    }\n\n    k = map->hash(key);\n    p = map->rbtree.root;\n\n    for (;;) {\n        if (k < p->key) {\n            p = p->left;\n        } else if (k > p->key) {\n            p = p->right;\n        } else {\n            key_temp = (intptr_t *)((char *) p\n                     + offsetof(ngx_map_node_t, raw_key));\n\n            switch (map->cmp(key, *key_temp)) {\n            case -1:\n                p = p->left;\n                break;\n            case 1:\n                p = p->right;\n                break;\n            case 0:\n                return (ngx_map_node_t *) p;\n            }\n        }\n\n        if (p == map->rbtree.sentinel) {\n            return NULL;\n        }\n    }\n}\n\n\n/* ngx_str_t */\nngx_rbtree_key_t\nngx_map_hash_str(intptr_t key)\n{\n    ngx_str_t                  *k;\n\n    k = (ngx_str_t *) key;\n\n    return ngx_hash_key(k->data, k->len);\n}\n\nint\nngx_cmp_str(intptr_t key1, intptr_t key2)\n{\n    ngx_str_t                  *k1, *k2;\n    ngx_int_t                   rc;\n\n    k1 = (ngx_str_t *) key1;\n    k2 = (ngx_str_t *) key2;\n\n    rc = ngx_memn2cmp(k1->data, k2->data, k1->len, k2->len);\n\n    if (rc < 0) {\n        return -1;\n    } else if (rc > 0) {\n        return 1;\n    } else {\n        return 0;\n    }\n}\n\n/* ngx_uint_t */\nngx_rbtree_key_t\nngx_map_hash_uint(intptr_t key)\n{\n    return (ngx_rbtree_key_t) key;\n}\n\nint\nngx_cmp_uint(intptr_t key1, intptr_t key2)\n{\n    if ((ngx_uint_t) key1 < (ngx_uint_t) key2) {\n        return -1;\n    } else if ((ngx_uint_t) key1 > (ngx_uint_t) key2) {\n        return 1;\n    } else {\n        return 0;\n    }\n}\n\n/* ngx_int_t */\nngx_rbtree_key_t\nngx_map_hash_int(intptr_t key)\n{\n    return (ngx_rbtree_key_t) key;\n}\n\nint\nngx_cmp_int(intptr_t key1, intptr_t key2)\n{\n    if ((ngx_int_t) key1 < (ngx_int_t) key2) {\n        return -1;\n    } else if ((ngx_int_t) key1 > (ngx_int_t) key2) {\n        return 1;\n    } else {\n        return 0;\n    }\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_map.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_MAP_H_INCLUDED_\n#define _NGX_MAP_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n\n/*\n * key: key for map node\n */\ntypedef ngx_rbtree_key_t (* ngx_map_hash_pt)(intptr_t key);\n\n/*\n * if key1 < key2, return -1\n * if key1 = key2, return 0\n * if key1 > key2, return 1\n */\ntypedef int (* ngx_cmp_pt)(intptr_t key1, intptr_t key2);\n\n\n/* ngx_str_t */\nngx_rbtree_key_t ngx_map_hash_str(intptr_t key);\nint ngx_cmp_str(intptr_t key1, intptr_t key2);\n\n/* ngx_uint_t */\nngx_rbtree_key_t ngx_map_hash_uint(intptr_t key);\nint ngx_cmp_uint(intptr_t key1, intptr_t key2);\n\n/* ngx_int_t */\nngx_rbtree_key_t ngx_map_hash_int(intptr_t key);\nint ngx_cmp_int(intptr_t key1, intptr_t key2);\n\n\ntypedef struct {\n    ngx_rbtree_t                rbtree;\n    ngx_rbtree_node_t           sentinel;\n    ngx_map_hash_pt             hash;\n    ngx_cmp_pt                  cmp;\n} ngx_map_t;\n\ntypedef struct {\n    ngx_rbtree_node_t           rn;\n    intptr_t                    raw_key;\n    ngx_map_t                  *map;\n} ngx_map_node_t;\n\n\n/*\n * return value:\n *      None\n * paras:\n *      map : map for initial\n *      hash: hash func for calc key's hash\n *      cmp : cmp func for cmp two keys\n */\nvoid ngx_map_init(ngx_map_t *map, ngx_map_hash_pt hash, ngx_cmp_pt cmp);\n\n/*\n * return value:\n *      if map is empty return 1, else return 0\n */\n#define ngx_map_empty(map) (map->rbtree.root == map->rbtree.sentinel)\n\n/*\n * return value:\n *      the mininum key map node, if map is empty, return NULL\n * paras:\n *      map: map for operate\n */\nngx_map_node_t *ngx_map_begin(ngx_map_t *map);\n\n/*\n * return value:\n *      the maximum key map node, if map is empty, return NULL\n * paras:\n *      map: map for operate\n */\nngx_map_node_t *ngx_map_rbegin(ngx_map_t *map);\n\n/*\n * return value:\n *      the next bigger key map node, if none, return NULL\n * paras:\n *      n  : current node\n */\nngx_map_node_t *ngx_map_next(ngx_map_node_t *n);\n\n/*\n * return value:\n *      the next smaller key map node, if none, return NULL\n * paras:\n *      n  : current node\n */\nngx_map_node_t *ngx_map_prev(ngx_map_node_t *n);\n\n/*\n * return value:\n *      None\n * paras:\n *      map    : map for operate\n *      node   : map node for inserting into map\n *      covered: 1 for covered if key is same, 0 do nothing if key is same\n */\nvoid ngx_map_insert(ngx_map_t *map, ngx_map_node_t *node, ngx_flag_t covered);\n\n/*\n * return value:\n *      None\n * paras:\n *      map: map for operate\n *      key: map node key for deleting from map\n */\nvoid ngx_map_delete(ngx_map_t *map, intptr_t key);\n\n/*\n * return value:\n *      node in map searching by key, NULL for not found\n * paras:\n *      map: map for operate\n *      key: node key for searching\n */\nngx_map_node_t *ngx_map_find(ngx_map_t *map, intptr_t key);\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_poold.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include \"ngx_poold.h\"\n#include \"ngx_map.h\"\n\n\ntypedef struct ngx_poold_node_s ngx_poold_node_t;\n\nstatic ngx_pool_t              *ngx_poold_pool;\n\nstatic ngx_map_t                ngx_poold_map;\nstatic ngx_poold_node_t        *ngx_poold_free_node;\n\nstatic ngx_uint_t               ngx_poold_nalloc;\nstatic ngx_uint_t               ngx_poold_nfree;\n\n\nstruct ngx_poold_node_s {\n    ngx_map_node_t              m;      /* map node */\n    ngx_poold_node_t           *next;   /* free node */\n\n    ngx_pool_t                 *pool;\n    char                       *file;   /* file create pool */\n    int                         line;   /* line create pool */\n};\n\n\nstatic ngx_int_t\nngx_poold_init()\n{\n    ngx_poold_pool = ngx_create_pool(4096, ngx_cycle->log);\n    if (ngx_poold_pool == NULL) {\n        return NGX_ERROR;\n    }\n\n    ngx_map_init(&ngx_poold_map, ngx_map_hash_uint, ngx_cmp_uint);\n    ngx_poold_free_node = NULL;\n\n    ngx_poold_nalloc = 0;\n    ngx_poold_nfree = 0;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_poold_node_t *\nngx_poold_get_node()\n{\n    ngx_poold_node_t           *n;\n\n    n = ngx_poold_free_node;\n    if (n == NULL) {\n        n = ngx_pcalloc(ngx_poold_pool, sizeof(ngx_poold_node_t));\n        if (n == NULL) {\n            return NULL;\n        }\n\n        ++ngx_poold_nalloc;\n    } else {\n        ngx_poold_free_node = n->next;\n        ngx_memzero(n, sizeof(ngx_poold_node_t));\n\n        --ngx_poold_nfree;\n    }\n\n    return n;\n}\n\n\nstatic void\nngx_poold_put_node(ngx_poold_node_t *node)\n{\n    if (ngx_poold_pool == NULL) {\n        return;\n    }\n\n    if (node == NULL) {\n        return;\n    }\n\n    node->next = ngx_poold_free_node;\n    ngx_poold_free_node = node;\n\n    ++ngx_poold_nfree;\n}\n\n\nngx_pool_t *\nngx_create_pool_debug(size_t size, ngx_log_t *log, char *file, int line)\n{\n    ngx_poold_node_t           *node;\n\n    if (ngx_poold_pool == NULL) {\n        ngx_poold_init();\n    }\n\n    /* construct a poold node */\n    node = ngx_poold_get_node();\n    node->pool = ngx_create_pool(size, log);\n    node->file = file;\n    node->line = line;\n\n    /* record node in poold map */\n    node->m.raw_key = (intptr_t) node->pool;\n    ngx_map_insert(&ngx_poold_map, &node->m, 0);\n\n    return node->pool;\n}\n\n\nvoid\nngx_destroy_pool_debug(ngx_pool_t *pool, char *file, int line)\n{\n    ngx_poold_node_t           *node;\n    ngx_map_node_t             *m;\n\n    /* get node by pool */\n    m = ngx_map_find(&ngx_poold_map, (intptr_t) pool);\n    if (m == NULL) {\n        ngx_log_error(NGX_LOG_EMERG, ngx_cycle->log, 0,\n                \"destroy pool twice: %s:%d\", file, line);\n        return;\n    }\n    ngx_map_delete(&ngx_poold_map, (intptr_t) pool);\n    node = (ngx_poold_node_t *) ((char *) m - offsetof(ngx_poold_node_t, m));\n\n    ngx_destroy_pool(pool);\n\n    /* put node in poold map */\n    ngx_poold_put_node(node);\n}\n\n\nngx_chain_t *\nngx_poold_state(ngx_http_request_t *r, unsigned detail)\n{\n    ngx_chain_t                *cl;\n    ngx_buf_t                  *b;\n    ngx_map_node_t             *node;\n    ngx_poold_node_t           *pn;\n    size_t                      len, len1;\n    ngx_uint_t                  n;\n\n    len = sizeof(\"##########ngx debug pool##########\\n\") - 1\n        + sizeof(\"ngx_poold nalloc node: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_poold nfree node: \\n\") - 1 + NGX_OFF_T_LEN;\n\n    len1 = 0;\n\n    /* node for create pool */\n    if (detail) {\n        n = ngx_poold_nalloc - ngx_poold_nfree;\n        /* \"    file:line\\n\" */\n        len1 = 4 + 256 + 1 + NGX_OFF_T_LEN + 1;\n        len += len1 * n;\n    }\n\n    cl = ngx_alloc_chain_link(r->pool);\n    if (cl == NULL) {\n        return NULL;\n    }\n    cl->next = NULL;\n\n    b = ngx_create_temp_buf(r->pool, len);\n    if (b == NULL) {\n        return NULL;\n    }\n    cl->buf = b;\n\n    b->last = ngx_snprintf(b->last, len,\n            \"##########ngx debug pool##########\\n\"\n            \"ngx_poold nalloc node: %ui\\nngx_poold nfree node: %ui\\n\",\n            ngx_poold_nalloc, ngx_poold_nfree);\n\n    if (detail) {\n        for (node = ngx_map_begin(&ngx_poold_map); node;\n                node = ngx_map_next(node))\n        {\n            /* m is first element of ngx_poold_node_t */\n            pn = (ngx_poold_node_t *) node;\n            b->last = ngx_snprintf(b->last, len1, \"    %s:%d\\n\",\n                    pn->file, pn->line);\n        }\n    }\n\n    return cl;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_poold.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_POOL_DEBUG_H_INCLUDED_\n#define _NGX_POOL_DEBUG_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n\n\n#define NGX_CREATE_POOL(size, log)                          \\\n    ngx_create_pool_debug(size, log, __FILE__, __LINE__)\n\n#define NGX_DESTROY_POOL(pool)                              \\\n    ngx_destroy_pool_debug(pool, __FILE__, __LINE__)\n\n\n/*\n * create pool and record where to create it for debugging\n *  such as pool not destroy\n *\n * paras:\n *      size: pool size for pool creating interface in raw ngx_create_pool\n *      log:  log for pool creating interface in raw ngx_create_pool\n *      file: use __FILE__ for recording file\n *      line: use __LINE__ for recording line\n * return:\n *      pool for successd, NULL for failed\n */\nngx_pool_t *ngx_create_pool_debug(size_t size, ngx_log_t *log,\n        char *file, int line);\n\n\n/*\n * destroy pool for debugging, use as pair for ngx_create_pool_debug\n *\n * paras:\n *      pool: pool for pool destroying interface in ran ngx_destroy_pool\n *      file: use __FILE__ for recording file\n *      line: use __LINE__ for recording line\n */\nvoid ngx_destroy_pool_debug(ngx_pool_t *pool, char *file, int line);\n\n\n/*\n * paras:\n *      r: http request to query status of rbuf\n */\nngx_chain_t *ngx_poold_state(ngx_http_request_t *r, unsigned detail);\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_rbuf.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_map.h\"\n\n\nstatic ngx_pool_t              *ngx_rbuf_pool;\n\nstatic ngx_map_t                ngx_rbuf_map;\nstatic ngx_chain_t             *ngx_rbuf_free_chain;\n\nstatic ngx_uint_t               ngx_rbuf_nalloc_node;\n\nstatic ngx_uint_t               ngx_rbuf_nalloc_buf;\nstatic ngx_uint_t               ngx_rbuf_nfree_buf;\n\nstatic ngx_uint_t               ngx_rbuf_nalloc_chain;\nstatic ngx_uint_t               ngx_rbuf_nfree_chain;\n\nstatic ngx_map_t                ngx_rbuf_using;\n\n#define ngx_rbuf_buf(b)                                             \\\n    (ngx_rbuf_t *) ((u_char *) (b) - offsetof(ngx_rbuf_t, buf))\n\ntypedef struct ngx_rbuf_s   ngx_rbuf_t;\n\nstruct ngx_rbuf_s {\n    size_t                      size;\n    ngx_rbuf_t                 *next;\n    u_char                      buf[];\n};\n\ntypedef struct {\n    ngx_map_node_t              node;\n    ngx_rbuf_t                 *rbuf;\n} ngx_rbuf_node_t;\n\ntypedef struct {\n    ngx_chain_t                 cl;\n    ngx_buf_t                   buf;\n    unsigned                    alloc;\n\n    ngx_map_node_t              node;\n    char                       *file;\n    int                         line;\n} ngx_chainbuf_t;\n\n\nstatic ngx_int_t\nngx_rbuf_init()\n{\n    ngx_rbuf_pool = ngx_create_pool(4096, ngx_cycle->log);\n    if (ngx_rbuf_pool == NULL) {\n        return NGX_ERROR;\n    }\n\n    ngx_map_init(&ngx_rbuf_map, ngx_map_hash_uint, ngx_cmp_uint);\n    ngx_map_init(&ngx_rbuf_using, ngx_map_hash_uint, ngx_cmp_uint);\n\n    ngx_rbuf_nalloc_node = 0;\n    ngx_rbuf_nalloc_buf = 0;\n    ngx_rbuf_nfree_buf = 0;\n    ngx_rbuf_nalloc_chain = 0;\n    ngx_rbuf_nfree_chain = 0;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_rbuf_t *\nngx_rbuf_get_buf(size_t key)\n{\n    ngx_rbuf_node_t            *rn;\n    ngx_map_node_t             *node;\n    ngx_rbuf_t                 *rb;\n\n    node = ngx_map_find(&ngx_rbuf_map, key);\n    if (node == NULL) { /* new key */\n        rn = ngx_pcalloc(ngx_rbuf_pool, sizeof(ngx_rbuf_node_t));\n        if (rn == NULL) {\n            return NULL;\n        }\n\n        node = &rn->node;\n        node->raw_key = key;\n        ngx_map_insert(&ngx_rbuf_map, node, 0);\n\n        ++ngx_rbuf_nalloc_node;\n    } else {\n        rn = (ngx_rbuf_node_t *) node;\n    }\n\n    rb = rn->rbuf;\n    if (rb == NULL) {\n        rb = ngx_pcalloc(ngx_rbuf_pool, sizeof(ngx_rbuf_t) + key);\n        if (rb == NULL) {\n            return NULL;\n        }\n        rb->size = key;\n\n        ++ngx_rbuf_nalloc_buf;\n    } else {\n        rn->rbuf = rb->next;\n        rb->next = NULL;\n\n        --ngx_rbuf_nfree_buf;\n    }\n\n    return rb;\n}\n\nstatic void\nngx_rbuf_put_buf(ngx_rbuf_t *rb)\n{\n    ngx_rbuf_node_t            *rn;\n    ngx_map_node_t             *node;\n\n    node = ngx_map_find(&ngx_rbuf_map, rb->size);\n    if (node == NULL) {\n        return;\n    }\n\n    rn = (ngx_rbuf_node_t *) node;\n    rb->next = rn->rbuf;\n    rn->rbuf = rb;\n\n    ++ngx_rbuf_nfree_buf;\n}\n\n\nstatic u_char *\nngx_rbuf_alloc(size_t size)\n{\n    ngx_rbuf_t                 *rb;\n\n    rb = ngx_rbuf_get_buf(size);\n\n    return rb->buf;\n}\n\nstatic void\nngx_rbuf_free(u_char *rb)\n{\n    ngx_rbuf_t                 *rbuf;\n\n    rbuf = ngx_rbuf_buf(rb);\n    ngx_rbuf_put_buf(rbuf);\n}\n\n\nngx_chain_t *\nngx_get_chainbuf_debug(size_t size, ngx_flag_t alloc_rbuf, char *file, int line)\n{\n    ngx_chainbuf_t             *cb;\n    ngx_chain_t                *cl;\n\n    if (ngx_rbuf_pool == NULL) {\n        ngx_rbuf_init();\n    }\n\n    cl = ngx_rbuf_free_chain;\n    if (cl) {\n        ngx_rbuf_free_chain = cl->next;\n        cl->next = NULL;\n        cb = (ngx_chainbuf_t *) cl;\n\n        --ngx_rbuf_nfree_chain;\n    } else {\n        cb = ngx_pcalloc(ngx_rbuf_pool, sizeof(ngx_chainbuf_t));\n        if (cb == NULL) {\n            return NULL;\n        }\n\n        cl = &cb->cl;\n        cl->buf = &cb->buf;\n\n        ++ngx_rbuf_nalloc_chain;\n    }\n\n    if (alloc_rbuf) {\n        cl->buf->last = cl->buf->pos = cl->buf->start = ngx_rbuf_alloc(size);\n        cl->buf->end = cl->buf->start + size;\n        cb->alloc = 1;\n    } else {\n        cl->buf->pos = cl->buf->last = cl->buf->start = cl->buf->end = NULL;\n        cb->alloc = 0;\n    }\n    cl->buf->memory = 1;\n\n    // record chainbuf in using map\n    cb->file = file;\n    cb->line = line;\n    cb->node.raw_key = (intptr_t) cl;\n    ngx_map_insert(&ngx_rbuf_using, &cb->node, 0);\n\n    return cl;\n}\n\nvoid\nngx_put_chainbuf_debug(ngx_chain_t *cl, char *file, int line)\n{\n    ngx_chainbuf_t             *cb;\n\n    if (ngx_rbuf_pool == NULL) {\n        return;\n    }\n\n    if (cl == NULL) {\n        return;\n    }\n\n    cb = (ngx_chainbuf_t *) cl;\n\n    if (cb->alloc) {\n        ngx_rbuf_free(cl->buf->start);\n    }\n    cl->next = ngx_rbuf_free_chain;\n    ngx_rbuf_free_chain = cl;\n    ++ngx_rbuf_nfree_chain;\n\n    // delete chainbuf from using map\n    if (ngx_map_find(&ngx_rbuf_using, (intptr_t) cl) == NULL) {\n        ngx_log_error(NGX_LOG_EMERG, ngx_cycle->log, 0,\n                \"destroy chainbuf twice: %s:%d\", file, line);\n        return;\n    }\n    ngx_map_delete(&ngx_rbuf_using, (intptr_t) cl);\n}\n\nngx_chain_t *\nngx_rbuf_state(ngx_http_request_t *r, unsigned detail)\n{\n    ngx_chain_t                *cl;\n    ngx_buf_t                  *b;\n    size_t                      len, len1;\n    ngx_uint_t                  n;\n    ngx_chainbuf_t             *cb;\n    ngx_map_node_t             *node;\n\n    len = sizeof(\"##########ngx rbuf state##########\\n\") - 1\n        + sizeof(\"ngx_rbuf nalloc node: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_rbuf nalloc buf: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_rbuf nfree buf: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_rbuf nalloc chain: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_rbuf nfree chain: \\n\") - 1 + NGX_OFF_T_LEN;\n\n    len1 = 0;\n\n    if (detail) {\n        n = ngx_rbuf_nalloc_chain - ngx_rbuf_nfree_chain;\n        /* \"    file:line\\n\" */\n        len1 = 4 + 256 + 1 + NGX_OFF_T_LEN + 1;\n        len += len1 * n;\n    }\n\n    cl = ngx_alloc_chain_link(r->pool);\n    if (cl == NULL) {\n        return NULL;\n    }\n    cl->next = NULL;\n\n    b = ngx_create_temp_buf(r->pool, len);\n    if (b == NULL) {\n        return NULL;\n    }\n    cl->buf = b;\n\n    b->last = ngx_snprintf(b->last, len,\n            \"##########ngx rbuf state##########\\nngx_rbuf nalloc node: %ui\\n\"\n            \"ngx_rbuf nalloc buf: %ui\\nngx_rbuf nfree buf: %ui\\n\"\n            \"ngx_rbuf nalloc chain: %ui\\nngx_rbuf nfree chain: %ui\\n\",\n            ngx_rbuf_nalloc_node, ngx_rbuf_nalloc_buf, ngx_rbuf_nfree_buf,\n            ngx_rbuf_nalloc_chain, ngx_rbuf_nfree_chain);\n\n    if (detail) {\n        for (node = ngx_map_begin(&ngx_rbuf_using); node;\n                node = ngx_map_next(node))\n        {\n            cb = (ngx_chainbuf_t *) ((char *) node\n                    - offsetof(ngx_chainbuf_t, node));\n            b->last = ngx_snprintf(b->last, len1, \"    %s:%d\\n\",\n                    cb->file, cb->line);\n        }\n    }\n\n    return cl;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_rbuf.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_RBUF_H_INCLUDED_\n#define _NGX_RBUF_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n\n\nngx_chain_t *ngx_get_chainbuf_debug(size_t size, ngx_flag_t alloc_rbuf,\n        char *file, int line);\nvoid ngx_put_chainbuf_debug(ngx_chain_t *cl, char *file, int len);\n\n/*\n * paras:\n *      size: buffer size for allocate\n *      alloc_rbuf: whether alloc rbuf\n * return:\n *      nginx chain\n */\n#define ngx_get_chainbuf(size, alloc_rbuf)                          \\\n    ngx_get_chainbuf_debug(size, alloc_rbuf, __FILE__, __LINE__);\n\n/*\n * paras:\n *      cl: nginx chain return by ngx_rtmp_shared_get_chainbuf\n */\n#define ngx_put_chainbuf(cl)                                        \\\n    ngx_put_chainbuf_debug(cl, __FILE__, __LINE__);\n\n\n/*\n * paras:\n *      cl: nginx chain return by ngx_rtmp_shared_get_chainbuf\n */\n#define ngx_put_chainbufs(cl)                                       \\\n{                                                                   \\\n    ngx_chain_t                *l;                                  \\\n                                                                    \\\n    l = cl;                                                         \\\n    while (l) {                                                     \\\n        cl = l->next;                                               \\\n        ngx_put_chainbuf_debug(l, __FILE__, __LINE__);              \\\n        l = cl;                                                     \\\n    }                                                               \\\n}\n\n/*\n * paras:\n *      r: http request to query status of rbuf\n */\nngx_chain_t *ngx_rbuf_state(ngx_http_request_t *r, unsigned detail);\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_timerd.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include \"ngx_timerd.h\"\n#include \"ngx_map.h\"\n\n\ntypedef struct ngx_timerd_node_s ngx_timerd_node_t;\n\nstatic ngx_pool_t              *ngx_timerd_pool;\n\nstatic ngx_map_t                ngx_timerd_map;\nstatic ngx_timerd_node_t        *ngx_timerd_free_node;\n\nstatic ngx_uint_t               timerd_footprint;\nstatic ngx_uint_t               ngx_timerd_nalloc;\nstatic ngx_uint_t               ngx_timerd_nfree;\n\n\nstruct ngx_timerd_node_s {\n    ngx_map_node_t              m;      /* map node */\n    ngx_timerd_node_t          *next;   /* free node */\n\n    ngx_uint_t                  footprint;\n    off_t                       fpoff;\n    ngx_event_t                 ev;\n\n    ngx_event_t                *uev;\n    char                       *file;   /* file create pool */\n    int                         line;   /* line create pool */\n};\n\n\nstatic ngx_int_t\nngx_timerd_init()\n{\n    ngx_timerd_pool = ngx_create_pool(4096, ngx_cycle->log);\n    if (ngx_timerd_pool == NULL) {\n        return NGX_ERROR;\n    }\n\n    ngx_map_init(&ngx_timerd_map, ngx_map_hash_uint, ngx_cmp_uint);\n    ngx_timerd_free_node = NULL;\n\n    ngx_timerd_nalloc = 0;\n    ngx_timerd_nfree = 0;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_timerd_node_t *\nngx_timerd_get_node()\n{\n    ngx_timerd_node_t          *n;\n\n    n = ngx_timerd_free_node;\n    if (n == NULL) {\n        n = ngx_pcalloc(ngx_timerd_pool, sizeof(ngx_timerd_node_t));\n        if (n == NULL) {\n            return NULL;\n        }\n\n        ++ngx_timerd_nalloc;\n    } else {\n        ngx_timerd_free_node = n->next;\n        ngx_memzero(n, sizeof(ngx_timerd_node_t));\n\n        --ngx_timerd_nfree;\n    }\n\n    return n;\n}\n\n\nstatic void\nngx_timerd_put_node(ngx_timerd_node_t *node)\n{\n    if (ngx_timerd_pool == NULL) {\n        return;\n    }\n\n    if (node == NULL) {\n        return;\n    }\n\n    node->next = ngx_timerd_free_node;\n    ngx_timerd_free_node = node;\n\n    ++ngx_timerd_nfree;\n}\n\n\nstatic void\nngx_timerd_wrap(ngx_event_t *ev)\n{\n    ngx_timerd_node_t          *node;\n    ngx_event_t                *uev;\n    ngx_uint_t                 *fp;\n\n    node = ev->data;\n    uev = node->uev;\n\n    fp = (ngx_uint_t *) ((char *) (uev->data) + node->fpoff);\n    if (*fp != node->footprint) {\n        ngx_log_error(NGX_LOG_EMERG, ngx_cycle->log, 0,\n                \"timer wrap, timer trigger but not timer owner: %s:%d\",\n                node->file, node->line);\n        return;\n    }\n\n    ngx_map_delete(&ngx_timerd_map, (intptr_t) uev);\n\n    uev->timer_set = 0;\n    uev->timedout = 1;\n\n    uev->handler(uev);\n\n    ngx_timerd_put_node(node);\n}\n\n\nngx_uint_t\nngx_timerd_footprint()\n{\n    return timerd_footprint++;\n}\n\n\nvoid\nngx_add_timer_debug(ngx_event_t *ev, ngx_msec_t timer, off_t fpoff,\n        char *file, int line)\n{\n    ngx_timerd_node_t          *node;\n    ngx_map_node_t             *m;\n    ngx_uint_t                 *fp;\n\n    if (ngx_timerd_pool == NULL) {\n        ngx_timerd_init();\n    }\n\n    fp = (ngx_uint_t *) ((char *) ev->data + fpoff);\n\n    m = ngx_map_find(&ngx_timerd_map, (intptr_t) ev);\n    if (m == NULL) { // first add\n        node = ngx_timerd_get_node();\n\n        node->m.raw_key = (intptr_t) ev;\n        ngx_map_insert(&ngx_timerd_map, &node->m, 0);\n\n        node->footprint = *fp;\n        node->fpoff = fpoff;\n\n        node->ev.log = ngx_cycle->log;\n        node->ev.data = node;\n        node->ev.handler = ngx_timerd_wrap;\n\n        node->uev = ev;\n        node->file = file;\n        node->line = line;\n    } else {\n        node = (ngx_timerd_node_t *) ((char *) m -\n                                      offsetof(ngx_timerd_node_t, m));\n        if (node->footprint != *fp) {\n            ngx_log_error(NGX_LOG_EMERG, ngx_cycle->log, 0,\n                    \"add timer but not timer owner(%s:%d): %s:%d\",\n                    node->file, node->line, file, line);\n            return;\n        }\n    }\n\n    ev->timer_set = 1;\n    ngx_add_timer(&node->ev, timer);\n}\n\n\nvoid\nngx_del_timer_debug(ngx_event_t *ev, ngx_uint_t footprint, char *file, int line)\n{\n    ngx_timerd_node_t          *node;\n    ngx_map_node_t             *m;\n\n    /* get node by pool */\n    m = ngx_map_find(&ngx_timerd_map, (intptr_t) ev);\n    if (m == NULL) {\n        ngx_log_error(NGX_LOG_EMERG, ngx_cycle->log, 0,\n                \"delete timer twice: %s:%d\", file, line);\n        return;\n    }\n\n    node = (ngx_timerd_node_t *) ((char *) m - offsetof(ngx_timerd_node_t, m));\n    if (node->footprint != footprint) {\n        ngx_log_error(NGX_LOG_EMERG, ngx_cycle->log, 0,\n                \"delete timer but not timer owner: %s:%d\", file, line);\n        return;\n    }\n\n    ngx_map_delete(&ngx_timerd_map, (intptr_t) ev);\n\n    if (node->ev.timer_set) {\n        ev->timer_set = 0;\n        ngx_del_timer(&node->ev);\n    }\n\n    if (node->ev.posted) {\n        ngx_delete_posted_event(&node->ev);\n    }\n\n    /* put node in timerd map */\n    ngx_timerd_put_node(node);\n}\n\n\nngx_chain_t *\nngx_timerd_state(ngx_http_request_t *r, unsigned detail)\n{\n    ngx_chain_t                *cl;\n    ngx_buf_t                  *b;\n    ngx_map_node_t             *node;\n    ngx_timerd_node_t          *pn;\n    size_t                      len, len1;\n    ngx_uint_t                  n;\n\n    len = sizeof(\"##########ngx debug pool##########\\n\") - 1\n        + sizeof(\"ngx_timerd nalloc node: \\n\") - 1 + NGX_OFF_T_LEN\n        + sizeof(\"ngx_timerd nfree node: \\n\") - 1 + NGX_OFF_T_LEN;\n\n    len1 = 0;\n\n    /* node for create pool */\n    if (detail) {\n        n = ngx_timerd_nalloc - ngx_timerd_nfree;\n        /* \"    file:line\\n\" */\n        len1 = 4 + 256 + 1 + NGX_OFF_T_LEN + 1;\n        len += len1 * n;\n    }\n\n    cl = ngx_alloc_chain_link(r->pool);\n    if (cl == NULL) {\n        return NULL;\n    }\n    cl->next = NULL;\n\n    b = ngx_create_temp_buf(r->pool, len);\n    if (b == NULL) {\n        return NULL;\n    }\n    cl->buf = b;\n\n    b->last = ngx_snprintf(b->last, len,\n            \"##########ngx debug pool##########\\n\"\n            \"ngx_timerd nalloc node: %ui\\nngx_timerd nfree node: %ui\\n\",\n            ngx_timerd_nalloc, ngx_timerd_nfree);\n\n    if (detail) {\n        for (node = ngx_map_begin(&ngx_timerd_map); node;\n                node = ngx_map_next(node))\n        {\n            /* m is first element of ngx_timerd_node_t */\n            pn = (ngx_timerd_node_t *) node;\n            b->last = ngx_snprintf(b->last, len1, \"    %s:%d\\n\",\n                    pn->file, pn->line);\n        }\n    }\n\n    return cl;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_timerd.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_TIMER_DEBUG_H_INCLUDED_\n#define _NGX_TIMER_DEBUG_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n\n\n#define NGX_ADD_TIMER(ev, timer, fpoff)                                 \\\n    ngx_add_timer_debug(ev, timer, fpoff, __FILE__, __LINE__)\n\n#define NGX_DEL_TIMER(ev, footprint)                                    \\\n    ngx_del_timer_debug(ev, footprint, __FILE__, __LINE__)\n\n\n/*\n * generate a new footprint\n *\n * return:\n *      footprint\n */\nngx_uint_t ngx_timerd_footprint();\n\n\n/*\n * add timer and record where to add it for debugging\n *  such as timer not destroy\n *\n * paras:\n *      ev:    nginx event for timer\n *      timer: timer interval for triggering timer\n *      fpoff: footprint offset in event data\n *      file:  use __FILE__ for recording file\n *      line:  use __LINE__ for recording line\n * return:\n *      pool for successd, NULL for failed\n */\nvoid ngx_add_timer_debug(ngx_event_t *ev, ngx_msec_t timer, off_t fpoff,\n        char *file, int line);\n\n\n/*\n * destroy pool for debugging, use as pair for ngx_create_pool_debug\n *\n * paras:\n *      ev:        nginx event for timer\n *      footprint: footprint value in user event data\n *      file:      use __FILE__ for recording file\n *      line:      use __LINE__ for recording line\n */\nvoid ngx_del_timer_debug(ngx_event_t *ev, ngx_uint_t footprint,\n        char *file, int line);\n\n\n/*\n * paras:\n *      r: http request to query status of rbuf\n */\nngx_chain_t *ngx_timerd_state(ngx_http_request_t *r, unsigned detail);\n\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_toolkit_misc.c",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#include \"ngx_toolkit_misc.h\"\n#include <ngx_md5.h>\n\n\ntypedef struct {\n    ngx_str_t                   scheme;\n    in_port_t                   port;\n} ngx_scheme_port_t;\n\n\nngx_scheme_port_t ngx_sheme_port[] = {\n    { ngx_string(\"http\"),   80      },\n    { ngx_string(\"https\"),  443     },\n    { ngx_string(\"rtmp\"),   1935    },\n    { ngx_null_string,      0       }\n};\n\n\n#define FILEBUFSIZE     8192\n\n\nsocklen_t\nngx_sock_pton_unix(struct sockaddr *sa, u_char *text, size_t len)\n{\n#if NGX_HAVE_UNIX_DOMAIN\n    u_char                     *path;\n    struct sockaddr_un         *saun;\n\n    // skip 'unix:'\n    path = text + 5;\n    len -= 5;\n\n    if (len == 0) {\n        ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0,\n                \"no path in the unix domain\");\n        return 0;\n    }\n\n    ++len; // sun_path need '\\0' as end\n    if (len > sizeof(saun->sun_path)) {\n        ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0,\n                \"too long path in the unix domain socket\");\n        return 0;\n    }\n\n    saun = (struct sockaddr_un *) sa;\n    saun->sun_family = AF_UNIX;\n    (void) ngx_cpystrn((u_char *) saun->sun_path, path, len);\n\n    return sizeof(struct sockaddr_un);\n\n#else\n    ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0,\n            \"the unix domain sockets are not supported on this platform\");\n\n    return 0;\n#endif\n}\n\nsocklen_t\nngx_sock_pton_inet6(struct sockaddr *sa, u_char *text, size_t len)\n{\n#if NGX_HAVE_INET6\n    struct in6_addr             inaddr6;\n    struct sockaddr_in6        *sin6;\n    u_char                     *p, *last;\n    ngx_int_t                   port;\n    size_t                      alen, plen;\n\n    last = text + len;\n    p = ngx_strlchr(text, last, ']');\n\n    if (p == NULL || p == last - 1) {\n        ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0,\n                \"not a ipv6 address format\");\n        return 0;\n    }\n\n    ++text;\n    alen = p - text;\n\n    /*\n     * prevent MSVC8 warning:\n     *    potentially uninitialized local variable 'inaddr6' used\n     */\n    ngx_memzero(&inaddr6, sizeof(struct in6_addr));\n\n    if (ngx_inet6_addr(text, alen, inaddr6.s6_addr) != NGX_OK) {\n        // not ipv6 address\n        return 0;\n    }\n\n    sa->sa_family = AF_INET6;\n\n    sin6 = (struct sockaddr_in6 *) sa;\n    ngx_memcpy(sin6->sin6_addr.s6_addr, inaddr6.s6_addr, 16);\n\n    ++p;\n    if (*p == ':') { // has port\n        ++p;\n        plen = last - p;\n\n        port = ngx_atoi(p, plen);\n        if (port < 0 || port > 65535) {\n            ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0,\n                    \"invalid port: %i\", port);\n            return 0;\n        }\n\n        ngx_inet_set_port(sa, (in_port_t) port);\n    }\n\n    return sizeof(struct sockaddr_in6);\n\n#else\n    ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0,\n            \"the INET6 sockets are not supported on this platform\");\n\n    return 0;\n#endif\n}\n\nsocklen_t\nngx_sock_pton_inet(struct sockaddr *sa, u_char *text, size_t len)\n{\n    in_addr_t                   inaddr;\n    struct sockaddr_in         *sin;\n    u_char                     *p, *last;\n    ngx_int_t                   port;\n    size_t                      alen, plen;\n\n    last = text + len;\n    p = ngx_strlchr(text, last, ':');\n    alen = len;\n\n    if (p != NULL) { // have port\n        alen = p - text;\n    }\n\n    inaddr = ngx_inet_addr(text, alen);\n    if (inaddr == INADDR_NONE) {\n        // not ipv4 address\n        return 0;\n    }\n\n    sa->sa_family = AF_INET;\n\n    sin = (struct sockaddr_in *) sa;\n    sin->sin_addr.s_addr = inaddr;\n\n    if (p != NULL) { // has port\n        ++p;\n        plen = last - p;\n\n        port = ngx_atoi(p, plen);\n        if (port < 0 || port > 65535) {\n            ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0,\n                    \"invalid port: %i\", port);\n            return 0;\n        }\n\n        ngx_inet_set_port(sa, (in_port_t) port);\n    }\n\n    return sizeof(struct sockaddr_in);\n}\n\nngx_int_t\nngx_parse_request_url(ngx_request_url_t *request_url, ngx_str_t *url)\n{\n    u_char                     *last, *host_last;\n    u_char                     *scheme;\n    u_char                     *user, *host, *port;\n    u_char                     *path, *args, *fragment;\n\n    /* NULL url */\n    if (url->len == 0) {\n        return NGX_ERROR;\n    }\n\n    last = url->data + url->len;\n\n    scheme = url->data;\n\n    user = (u_char *) ngx_strnstr(scheme, \"://\", last - scheme);\n\n    if (user == NULL) {\n        return NGX_ERROR;\n    }\n\n    request_url->scheme.data = scheme;\n    request_url->scheme.len = user - scheme;\n\n    user += 3;\n    if (user >= last) {\n        return NGX_ERROR;\n    }\n\n    host_last = ngx_strlchr(user, last, '/');\n    if (host_last == NULL) {\n        host_last = last;\n    }\n\n    host = ngx_strlchr(user, host_last, '@');\n    if (host == NULL) { /* no user */\n        host = user;\n    } else {\n        if (user == host) { /* user is \"\" */\n            return NGX_ERROR;\n        }\n\n        request_url->user.data = user;\n        request_url->user.len = host - user;\n        ++host;\n        if (host == host_last) { /* no host */\n            return NGX_ERROR;\n        }\n    }\n\n    port = ngx_strlchr(host, host_last, ':');\n    if (port == NULL) { /* no port */\n        request_url->host.data = host;\n        request_url->host.len = host_last - host;\n\n        request_url->host_with_port = request_url->host;\n    } else {\n        request_url->host.data = host;\n        request_url->host.len = port - host;\n        ++port;\n        if (port == host_last) { /* port error */\n            return NGX_ERROR;\n        }\n\n        request_url->port.data = port;\n        request_url->port.len = host_last - port;\n\n        request_url->host_with_port.data = host;\n        request_url->host_with_port.len = host_last - host;\n    }\n\n    path = ++host_last;\n    if (path >= last) { /* no path */\n        goto done;\n    }\n\n    args = ngx_strlchr(path, last, '?');\n    if (args == NULL) { /* no args */\n        request_url->path.data = path;\n        request_url->path.len = last - path;\n\n        request_url->uri_with_args = request_url->path;\n\n        goto done;\n    } else {\n        request_url->path.data = path;\n        request_url->path.len = args - path;\n        ++args;\n        if (args == last) { /* args error */\n            return NGX_ERROR;\n        }\n    }\n\n    fragment = ngx_strlchr(args, last, '#');\n    if (fragment == NULL) { /* no fragment */\n        request_url->args.data = args;\n        request_url->args.len = last - args;\n    } else {\n        request_url->args.data = args;\n        request_url->args.len = fragment - args;\n        ++fragment;\n        if (fragment == last) { /* fragment error */\n            return NGX_ERROR;\n        }\n\n        request_url->fragment.data = fragment;\n        request_url->fragment.len = last - fragment;\n    }\n\n    request_url->uri_with_args.data = path;\n    request_url->uri_with_args.len = last - path;\n\ndone:\n    return NGX_OK;\n}\n\nin_port_t\nngx_request_port(ngx_str_t *scheme, ngx_str_t *port)\n{\n    ngx_int_t                   p;\n    ngx_scheme_port_t          *sp;\n\n    if (port->len) {\n        p = ngx_atoi(port->data, port->len);\n        if (p < 1 || p > 65535) { /* invalid port */\n            return 0;\n        }\n\n        return p;\n    }\n\n    for (sp = ngx_sheme_port; sp->port != 0; ++sp) {\n        if (sp->scheme.len == scheme->len\n            && ngx_memcmp(sp->scheme.data, scheme->data, scheme->len) == 0)\n        {\n            return sp->port;\n        }\n    }\n\n    return 0;\n}\n\nngx_int_t\nngx_md5_file(ngx_fd_t fd, u_char md5key[NGX_MD5KEY_LEN])\n{\n    ngx_md5_t                   ctx;\n    u_char                      buf[FILEBUFSIZE];\n    u_char                      md5[16];\n    ssize_t                     n;\n    ngx_uint_t                  i;\n    u_char                     *p;\n\n    ngx_md5_init(&ctx);\n\n    for (;;) {\n        n = ngx_read_fd(fd, buf, FILEBUFSIZE);\n\n        if (n == 0) { /* read eof of file */\n            break;\n        }\n\n        if (n == NGX_FILE_ERROR) {\n            return NGX_ERROR;\n        }\n\n        ngx_md5_update(&ctx, buf, n);\n    }\n\n    ngx_md5_final(md5, &ctx);\n\n    p = md5key;\n    for (i = 0; i < 16; ++i) {\n        p = ngx_sprintf(p, \"%02xi\", md5[i]);\n    }\n\n    return NGX_OK;\n}\n\nngx_int_t\nngx_copy_str(ngx_pool_t *pool, ngx_str_t *dst, ngx_str_t *src)\n{\n    if (src->len == 0) {\n        return NGX_OK;\n    }\n\n    dst->len = src->len;\n    dst->data = ngx_palloc(pool, src->len);\n    if (dst->data == NULL) {\n        return NGX_ERROR;\n    }\n\n    ngx_memcpy(dst->data, src->data, src->len);\n\n    return NGX_OK;\n}\n\nsocklen_t\nngx_sock_pton(struct sockaddr *sa, u_char *text, size_t len)\n{\n    if (len >= 5 && ngx_strncasecmp(text, (u_char *) \"unix:\", 5) == 0) {\n        return ngx_sock_pton_unix(sa, text, len);\n    }\n\n    if (len && text[0] == '[') {\n        return ngx_sock_pton_inet6(sa, text, len);\n    }\n\n    return ngx_sock_pton_inet(sa, text, len);\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/ngx_toolkit_misc.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_TOOLKIT_MISC_H_INCLUDED_\n#define _NGX_TOOLKIT_MISC_H_INCLUDED_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n\n/*\n * scheme://[user@]host[:port]/path[?args][#fragment]\n */\ntypedef struct {\n    ngx_str_t                   scheme;\n    ngx_str_t                   user;\n    ngx_str_t                   host;\n    ngx_str_t                   port;\n    ngx_str_t                   path;\n    ngx_str_t                   args;\n    ngx_str_t                   fragment;\n\n    ngx_str_t                   host_with_port; /* host[:port] */\n    ngx_str_t                   uri_with_args;  /* /path[?args][#fragment] */\n} ngx_request_url_t;\n\n\n#define NGX_MD5KEY_LEN  32\n\n\n/*\n * parse request url format as:\n *      scheme://[user@]host[:port]/path[?args][#fragment]\n *\n * return value:\n *      NGX_OK   : parse success\n *      NGX_ERROR: request url format error\n * paras:\n *      request_url: url parse result return to user,\n *          all paras in request url is segment point to url\n *      url        : request url for parse\n */\nngx_int_t ngx_parse_request_url(ngx_request_url_t *request_url, ngx_str_t *url);\n\n/*\n * convert port to in_port_t according to scheme and port\n *\n * return value:\n *      If port is set to correct number range in [1, 65535], return port\n *      If port is set to non correct value, return 0\n *      If port is not set, return default value for scheme:\n *          80 for http\n *          443 for https\n *          1935 for rtmp\n *          0 for others now\n * values:\n *      scheme : sheme string like http https or rtmp\n *      port   : port for convert to in_port_t\n */\nin_port_t ngx_request_port(ngx_str_t *scheme, ngx_str_t *port);\n\n/*\n * calculating file md5key as md5sum in shell\n *\n * return value:\n *      NGX_OK   : calculating success\n *      NGX_ERROR: calculating error such as file is not exist\n * paras:\n *      fd    : file desc for calculating md5key\n *      md5key: md5key result\n */\nngx_int_t ngx_md5_file(ngx_fd_t fd, u_char md5key[NGX_MD5KEY_LEN]);\n\n\n/*\n * copy str\n *\n * return value:\n *      NGX_OK: copy successd\n *      NGX_ERROR: copy failed\n * paras:\n *      pool: for alloc space for storing str\n *      dst: str copy to\n *      src: str copy from\n */\nngx_int_t ngx_copy_str(ngx_pool_t *pool, ngx_str_t *dst, ngx_str_t *src);\n\n\n/*\n * parse text to struct sockaddr\n *\n * return value:\n *      0: if text is not ipv4/ipv6/unix address\n *      >0: socklen for sa\n *\n * paras:\n *      sa: struct sockadd parse to\n *      text: ipv4/ipv6/unix address for parsing, text could have port\n *      len: text's length\n */\nsocklen_t ngx_sock_pton(struct sockaddr *sa, u_char *text, size_t len);\n\n\n#ifdef NGX_DEBUG\n\n#define NGX_START_TIMING                                            \\\n    struct timeval      __start, __end;                             \\\n    ngx_gettimeofday(&__start);\n\n#define NGX_STOP_TIMING(log, msg)                                   \\\n    ngx_gettimeofday(&__end);                                       \\\n    ngx_log_error(NGX_LOG_INFO, log, 0, msg \" spend %ui us\",        \\\n        (__end.tv_sec - __start.tv_sec) * 1000000                   \\\n        + (__end.tv_usec - __start.tv_usec));\n\n#else\n\n#define NGX_START_TIMING\n#define NGX_STOP_TIMING(log, msg)\n\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/config",
    "content": "ngx_addon_name=ngx_toolkit_test_module\n\n\nCORE_MODULES=\"$CORE_MODULES\n             ngx_dynamic_core_test_module                                   \\\n             \"\n\nHTTP_MODULES=\"$HTTP_MODULES                                                 \\\n             ngx_event_timer_test_module                                    \\\n             ngx_event_resolver_test_module                                 \\\n             ngx_dynamic_resolver_test_module                               \\\n             ngx_dynamic_conf_test_module                                   \\\n             ngx_http_dynamic_test_module                                   \\\n             ngx_toolkit_misc_test_module                                   \\\n             ngx_map_test_module                                            \\\n             ngx_rbuf_test_module                                           \\\n             ngx_poold_test_module                                          \\\n             ngx_timerd_test_module                                         \\\n             \"\n\nNGX_ADDON_SRCS=\"$NGX_ADDON_SRCS                                             \\\n               $ngx_addon_dir/ngx_event_timer_test_module.c                 \\\n               $ngx_addon_dir/ngx_event_resolver_test_module.c              \\\n               $ngx_addon_dir/ngx_dynamic_resolver_test_module.c            \\\n               $ngx_addon_dir/ngx_dynamic_conf_test_module.c                \\\n               $ngx_addon_dir/ngx_http_dynamic_test_module.c                \\\n               $ngx_addon_dir/ngx_toolkit_misc_test_module.c                \\\n               $ngx_addon_dir/ngx_map_test_module.c                         \\\n               $ngx_addon_dir/ngx_rbuf_test_module.c                        \\\n               $ngx_addon_dir/ngx_poold_test_module.c                       \\\n               $ngx_addon_dir/ngx_timerd_test_module.c                      \\\n               \"\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/dns_install.sh",
    "content": "#! /bin/bash\n\nyum install -y bind bind-chroot bind-utils\ncp -f named.conf /etc/\ncp -f test.com.zone /var/named/\nchgrp named /etc/named.conf\nchgrp named /var/named/test.com.zone\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/md5testfile",
    "content": "Copyright (C) 2016-2020, by Jie Wu \"AlexWoo\" <wj19840501@gmail.com>.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions\nare met:\n1. Redistributions of source code must retain the above copyright\n   notice, this list of conditions and the following disclaimer.\n2. Redistributions in binary form must reproduce the above copyright\n   notice, this list of conditions and the following disclaimer in the\n   documentation and/or other materials provided with the distribution.\n\nTHIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\nANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\nARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\nFOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\nDAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\nOR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\nHOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\nLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\nOUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\nSUCH DAMAGE.\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/named.conf",
    "content": "options {\n    directory \t\"/var/named\";\n    recursion   no;\n};\n\nlogging {\n    channel default_debug {\n        file \"data/named.run\";\n        severity dynamic;\n    };\n};\n\nzone \"test.com.\" {\n    type master;\n    file \"test.com.zone\";\n};\n\nzone \"test1.com.\" {\n    type master;\n    file \"test1.com.zone\";\n};\n\ninclude \"/etc/named.rfc1912.zones\";\ninclude \"/etc/named.root.key\";\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/nginx.conf",
    "content": "\nuser  root;\nworker_processes  1;\n\n#error_log  logs/error.log;\n#error_log  logs/error.log  notice;\nerror_log  logs/error.log  info;\n#error_log  logs/error.log  debug;\n\n#pid        logs/nginx.pid;\n\ndynamic_conf    conf/nginx_dynamic.conf 10;\ndynamic_log     logs/error_dynamic.log  info;\n\nevents {\n    worker_connections  1024;\n    worker_timers       1024;\n    resolver            192.168.84.254 valid=20s;\n    resolver_timeout    10s;\n    dynamic_refresh_interval  5m;\n}\n\nhttp {\n    include       mime.types;\n    default_type  application/octet-stream;\n\n    sendfile        on;\n\n    keepalive_timeout  65;\n\n    server {\n        listen       80;\n        server_name  localhost;\n\n        location /trace1/ {\n            proxy_http_version 1.1;\n            proxy_set_header Host $host;\n            proxy_set_header X-Real-IP $remote_addr;\n            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n            proxy_set_header Connection \"\";\n            proxy_set_header X-NTM-Parentid $ntm_currentid;\n            proxy_set_header X-NTM-Currentid $ntm_newid;\n            proxy_pass http://127.0.0.1/trace/;\n        }\n\n        location /trace/ {\n            echo $http_x_ntm_traceid;\n            echo $http_x_ntm_currentid;\n            echo $http_x_ntm_parentid;\n            echo $http_x_ntm_debug;\n            echo \"trace variables\";\n            echo $ntm_traceid;\n            echo $ntm_currentid;\n            echo $ntm_parentid;\n            echo $ntm_debug;\n        }\n\n        location /event_timer_test/ {\n            event_timer_test;\n        }\n\n        location /event_resolver_test/ {\n            event_resolver_test;\n        }\n\n        location /dynamic_resolver_test/ {\n            dynamic_resolver_test 192.168.84.4  www.test1.com;\n        }\n\n        location /dynamic_conf_test/ {\n            dynamic_conf_test;\n        }\n\n        location / {\n            http_dynamic_test;\n        }\n\n        location /map_test/ {\n            map_test;\n        }\n\n        location /toolkit_misc_test/ {\n            toolkit_misc_test;\n        }\n\n        location /rbuf_test/ {\n            rbuf_test;\n        }\n\n        location /poold_test/ {\n            poold_test;\n        }\n    }\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/nginx_dynamic.conf",
    "content": "dynamic_test_i  200;\ndynamic_test_s  hello_world;\n\nhttp {\n    main_int    1000;\n    main_str    gogogo;\n\n    #defult server\n    server {\n        srv_int         1;\n        srv_str         default;\n    }\n\n    #wildcard_head\n    server {\n        srv_int         2;\n        srv_str         wildcard_head;\n        server_name     *.baidu.com;\n    }\n\n    #wildcard_tail\n    server {\n        srv_int         3;\n        srv_str         wildcard_tail;\n        server_name     www.google.*;\n    }\n\n    #hash\n    server {\n        srv_int         4;\n        srv_str         hash;\n        server_name     sports.sina.com.cn;\n\n        location = / {\n            loc_int     1;\n            loc_str     =/;\n        }\n\n        location / {\n            loc_int     2;\n            loc_str     /;\n        }\n\n        location ^~ /test1/ {\n            loc_int     3;\n            loc_str     ^~/test1/;\n        }\n\n        location ~* \\.(gif|jpg|jpeg)$ {\n            loc_int     4;\n            loc_str     ~*\\.(gif|jpg|jpeg)$;\n        }\n\n        location /test {\n            loc_int     5;\n            loc_str     /test;\n        }\n    }\n\n    #pcre\n    server {\n        srv_int         5;\n        srv_str         pcre;\n        server_name     ~^flv(?!.*(dl\\.))[A-Za-z0-9]*\\.test\\.com$;\n    }\n\n    #multi\n    server {\n        srv_int         6;\n        srv_str         multi;\n        server_name     ~^flv(?!.*(dl\\.))[A-Za-z0-9]*\\.haha\\.com$ www.sohu.com;\n        server_name     *.qq.com;\n    }\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/ngx_dynamic_conf_test_module.c",
    "content": "#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_dynamic_conf.h\"\n\n\n/******************************************************************************/\nstatic void *ngx_dynamic_core_test_create_conf(ngx_conf_t *cf);\nstatic char *ngx_dynamic_core_test_init_conf(ngx_conf_t *cf, void *conf);\n\n\ntypedef struct {\n    ngx_uint_t                  i;\n    ngx_str_t                   s;\n} ngx_dynamic_core_test_conf_t;\n\n\nngx_core_module_t  ngx_dynamic_core_test_module_ctx = {\n    ngx_string(\"dynamic_core_test\"),\n    NULL,\n    NULL\n};\n\nstatic ngx_command_t  ngx_dynamic_core_test_dcommands[] = {\n\n    { ngx_string(\"dynamic_test_i\"),\n      NGX_MAIN_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      0,\n      offsetof(ngx_dynamic_core_test_conf_t, i),\n      NULL },\n\n    { ngx_string(\"dynamic_test_s\"),\n      NGX_MAIN_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_str_slot,\n      0,\n      offsetof(ngx_dynamic_core_test_conf_t, s),\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_dynamic_core_module_t ngx_dynamic_core_test_module_dctx = {\n    ngx_string(\"dynamic_core_test\"),\n    ngx_dynamic_core_test_create_conf,\n    ngx_dynamic_core_test_init_conf\n};\n\n\nngx_module_t  ngx_dynamic_core_test_module = {\n    NGX_MODULE_V1,\n    &ngx_dynamic_core_test_module_ctx,      /* module context */\n    NULL,                                   /* module directives */\n    NGX_CORE_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    (uintptr_t) &ngx_dynamic_core_test_module_dctx, /* module dynamic context */\n    (uintptr_t) ngx_dynamic_core_test_dcommands, /* module dynamic directives */\n    NGX_MODULE_V1_DYNAMIC_PADDING\n};\n\n\nstatic void *\nngx_dynamic_core_test_create_conf(ngx_conf_t *cf)\n{\n    ngx_dynamic_core_test_conf_t       *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_dynamic_core_test_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->i = NGX_CONF_UNSET_UINT;\n\n    return conf;\n}\n\n\nstatic char *\nngx_dynamic_core_test_init_conf(ngx_conf_t *cf, void *conf)\n{\n    ngx_dynamic_core_test_conf_t       *dctcf;\n\n    dctcf = conf;\n\n    ngx_conf_init_uint_value(dctcf->i, 1000);\n\n    return NGX_CONF_OK;\n}\n/******************************************************************************/\n\n\nstatic char *ngx_dynamic_conf_test(ngx_conf_t *cf, ngx_command_t *cmd,\n    void *conf);\n\n\n#define MAXBUFSIZE  4096\n\n\nstatic ngx_command_t  ngx_dynamic_conf_test_commands[] = {\n\n    { ngx_string(\"dynamic_conf_test\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,\n      ngx_dynamic_conf_test,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_dynamic_conf_test_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    NULL,                                   /* postconfiguration */\n\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n\n    NULL,                                   /* create location configuration */\n    NULL                                    /* merge location configuration */\n};\n\n\nngx_module_t  ngx_dynamic_conf_test_module = {\n    NGX_MODULE_V1,\n    &ngx_dynamic_conf_test_module_ctx,      /* module context */\n    ngx_dynamic_conf_test_commands,         /* module directives */\n    NGX_HTTP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_int_t\nngx_dynamic_conf_test_handler(ngx_http_request_t *r)\n{\n    ngx_chain_t                     cl;\n    ngx_buf_t                      *b;\n    ngx_dynamic_core_test_conf_t   *dctcf;\n\n    ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"dynamic conf test handler\");\n\n    b = ngx_create_temp_buf(r->pool, MAXBUFSIZE);\n\n    if (b == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    dctcf = (ngx_dynamic_core_test_conf_t *)\n                ngx_get_dconf(&ngx_dynamic_core_test_module);\n    if (dctcf == NULL) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"dynamic conf test handler, dynamic conf not configured\");\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    r->headers_out.status = NGX_HTTP_OK;\n\n    ngx_http_send_header(r);\n\n    b->last = ngx_snprintf(b->last, MAXBUFSIZE, \"dynamic core test %ui [%V]\\n\",\n                           dctcf->i, &dctcf->s);\n    b->last_buf = 1;\n    b->last_in_chain = 1;\n\n    cl.buf = b;\n    cl.next = NULL;\n\n    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, \"send body\");\n\n    return ngx_http_output_filter(r, &cl);\n}\n\n\nstatic char *\nngx_dynamic_conf_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t  *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_dynamic_conf_test_handler;\n\n    return NGX_CONF_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/ngx_dynamic_resolver_test_module.c",
    "content": "#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_dynamic_resolver.h\"\n\n\nstatic char *ngx_dynamic_resolver_test(ngx_conf_t *cf, ngx_command_t *cmd,\n    void *conf);\n\n\ntypedef struct {\n    ngx_flag_t                  sync;\n} ngx_dynamic_resolver_test_ctx_t;\n\n\nstatic ngx_command_t  ngx_dynamic_resolver_test_commands[] = {\n\n    { ngx_string(\"dynamic_resolver_test\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_ANY,\n      ngx_dynamic_resolver_test,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_dynamic_resolver_test_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    NULL,                                   /* postconfiguration */\n\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n\n    NULL,                                   /* create location configuration */\n    NULL                                    /* merge location configuration */\n};\n\n\nngx_module_t  ngx_dynamic_resolver_test_module = {\n    NGX_MODULE_V1,\n    &ngx_dynamic_resolver_test_module_ctx,  /* module context */\n    ngx_dynamic_resolver_test_commands,     /* module directives */\n    NGX_HTTP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void\nngx_dynamic_resolver_test_result(void *data, struct sockaddr *sa, socklen_t len)\n{\n    ngx_dynamic_resolver_test_ctx_t *ctx;\n    ngx_chain_t                     cl;\n    ngx_buf_t                      *b;\n    ngx_int_t                       rc;\n    ngx_http_request_t             *r;\n    u_char                          text[NGX_SOCKADDRLEN];\n\n    r = data;\n\n    r->headers_out.status = NGX_HTTP_OK;\n\n    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, \"send header\");\n\n    if (len == 0) {\n        r->headers_out.content_length_n = 0;\n        r->header_only = 1;\n    }\n\n    ctx = ngx_http_get_module_ctx(r, ngx_dynamic_resolver_test_module);\n    if (ctx == NULL) {\n        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);\n        return;\n    }\n\n    rc = ngx_http_send_header(r);\n    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {\n        ngx_http_finalize_request(r, rc);\n        return;\n    }\n\n    ngx_memzero(text, sizeof(text));\n    len = ngx_sock_ntop(sa, len, text, NGX_SOCKADDRLEN, 0) + 1;\n\n    b = ngx_create_temp_buf(r->pool, len);\n\n    if (b == NULL) {\n        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);\n        return;\n    }\n\n    b->last = ngx_snprintf(b->last, len, \"%s\\n\", text);\n    b->last_buf = 1;\n    b->last_in_chain = 1;\n\n    cl.buf = b;\n    cl.next = NULL;\n\n    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, \"send body\");\n\n    ngx_http_output_filter(r, &cl);\n\n    if (ctx->sync) {\n        return;\n    }\n\n    ngx_http_finalize_request(r, NGX_OK);\n}\n\nstatic ngx_int_t\nngx_dynamic_resolver_test_handler(ngx_http_request_t *r)\n{\n    ngx_dynamic_resolver_test_ctx_t *ctx;\n    ngx_str_t                       domain, sync;\n    struct sockaddr                 sa;\n    socklen_t                       len;\n\n    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                  \"dynamic resolver test handler\");\n\n    ctx = ngx_pcalloc(r->pool, sizeof(ngx_dynamic_resolver_test_ctx_t));\n    if (ctx == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n    ngx_http_set_ctx(r, ctx, ngx_dynamic_resolver_test_module);\n\n    if (ngx_http_arg(r, (u_char *) \"domain\", 6, &domain) != NGX_OK) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                      \"dynamic resolver test, no domain in http args\");\n        return NGX_HTTP_BAD_REQUEST;\n    }\n\n    if (ngx_http_arg(r, (u_char *) \"sync\", 4, &sync) == NGX_OK) {\n        ctx->sync = 1;\n    }\n\n    if (r->method == NGX_HTTP_GET && ctx->sync == 0) {\n        r->count++;\n        ngx_dynamic_resolver_start_resolver(&domain,\n                ngx_dynamic_resolver_test_result, r);\n\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                      \"dynamic resolver test, after start resolver\");\n        return NGX_DONE;\n    } else if (r->method == NGX_HTTP_GET && ctx->sync) {\n        ngx_memzero(&sa, sizeof(sa));\n        len = ngx_dynamic_resolver_gethostbyname(&domain, &sa);\n        ngx_dynamic_resolver_test_result(r, &sa, len);\n\n        return NGX_OK;\n    } else if (r->method != NGX_HTTP_DELETE) {\n        return NGX_HTTP_BAD_REQUEST;\n    }\n\n    ngx_dynamic_resolver_del_domain(&domain);\n\n    r->headers_out.status = NGX_HTTP_OK;\n    r->headers_out.content_length_n = 0;\n    r->header_only = 1;\n\n    return ngx_http_send_header(r);\n}\n\n\nstatic char *\nngx_dynamic_resolver_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t       *clcf;\n    ngx_str_t                      *value;\n    ngx_uint_t                      i;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_dynamic_resolver_test_handler;\n\n    value = cf->args->elts;\n\n    for (i = 1; i < cf->args->nelts; ++i) {\n        ngx_dynamic_resolver_add_domain(&value[i], cf->cycle);\n    }\n\n    return NGX_CONF_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/ngx_event_resolver_test_module.c",
    "content": "#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_event_resolver.h\"\n\n\nstatic char *ngx_event_resolver_test(ngx_conf_t *cf, ngx_command_t *cmd,\n    void *conf);\n\n\nstatic ngx_command_t  ngx_event_resolver_test_commands[] = {\n\n    { ngx_string(\"event_resolver_test\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,\n      ngx_event_resolver_test,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_event_resolver_test_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    NULL,                                   /* postconfiguration */\n\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n\n    NULL,                                   /* create location configuration */\n    NULL                                    /* merge location configuration */\n};\n\n\nngx_module_t  ngx_event_resolver_test_module = {\n    NGX_MODULE_V1,\n    &ngx_event_resolver_test_module_ctx,    /* module context */\n    ngx_event_resolver_test_commands,       /* module directives */\n    NGX_HTTP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void\nngx_event_resolver_test_result(void *data, ngx_resolver_addr_t *addrs,\n    ngx_uint_t naddrs)\n{\n    ngx_chain_t                    *cl, **ll;\n    ngx_buf_t                      *b;\n    size_t                          len;\n    ngx_int_t                       rc;\n    ngx_uint_t                      i;\n    ngx_http_request_t             *r;\n    u_char                          text[NGX_SOCKADDRLEN];\n\n    r = data;\n\n    r->headers_out.status = NGX_HTTP_OK;\n\n    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, \"send header\");\n\n    if (naddrs == 0) {\n        r->headers_out.content_length_n = 0;\n        r->header_only = 1;\n    }\n\n    rc = ngx_http_send_header(r);\n    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {\n        ngx_http_finalize_request(r, rc);\n        return;\n    }\n\n    ll = &cl;\n    for (i = 0; i < naddrs; ++i) {\n        len = ngx_sock_ntop(addrs[i].sockaddr, addrs[i].socklen, text,\n                            NGX_SOCKADDRLEN, 0) + 1;\n\n        b = ngx_create_temp_buf(r->pool, len);\n\n        if (b == NULL) {\n            ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);\n            return;\n        }\n\n        b->last = ngx_snprintf(b->last, len, \"%s\\n\", text);\n        if (i == naddrs - 1) {\n            b->last_buf = 1;\n            b->last_in_chain = 1;\n        }\n\n        *ll = ngx_alloc_chain_link(r->pool);\n        (*ll)->buf = b;\n        (*ll)->next = NULL;\n        ll = &(*ll)->next;\n    }\n\n    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, \"send body\");\n\n    ngx_http_output_filter(r, cl);\n\n    ngx_http_finalize_request(r, NGX_OK);\n}\n\nstatic ngx_int_t\nngx_event_resolver_test_handler(ngx_http_request_t *r)\n{\n    ngx_str_t                       domain;\n\n    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"event resolver test handler\");\n\n    if (ngx_http_arg(r, (u_char *) \"domain\", sizeof(\"domain\") - 1, &domain)\n            != NGX_OK)\n    {\n        return NGX_HTTP_BAD_REQUEST;\n    }\n\n    ++r->count;\n\n    ngx_event_resolver_start_resolver(&domain,\n                                      ngx_event_resolver_test_result, r);\n\n    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"after start resolver\");\n\n    return NGX_DONE;\n}\n\n\nstatic char *\nngx_event_resolver_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t  *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_event_resolver_test_handler;\n\n    return NGX_CONF_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/ngx_event_timer_test_module.c",
    "content": "#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_event_timer_module.h\"\n\n\nstatic char *ngx_event_timer_test(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\n\nstatic ngx_command_t  ngx_event_timer_test_commands[] = {\n\n    { ngx_string(\"event_timer_test\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,\n      ngx_event_timer_test,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_event_timer_test_module_ctx = {\n    NULL,                               /* preconfiguration */\n    NULL,                               /* postconfiguration */\n\n    NULL,                               /* create main configuration */\n    NULL,                               /* init main configuration */\n\n    NULL,                               /* create server configuration */\n    NULL,                               /* merge server configuration */\n\n    NULL,                               /* create location configuration */\n    NULL                                /* merge location configuration */\n};\n\n\nngx_module_t  ngx_event_timer_test_module = {\n    NGX_MODULE_V1,\n    &ngx_event_timer_test_module_ctx,   /* module context */\n    ngx_event_timer_test_commands,      /* module directives */\n    NGX_HTTP_MODULE,                    /* module type */\n    NULL,                               /* init master */\n    NULL,                               /* init module */\n    NULL,                               /* init process */\n    NULL,                               /* init thread */\n    NULL,                               /* exit thread */\n    NULL,                               /* exit process */\n    NULL,                               /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void\nngx_event_timer_test_timer_handler(void *data)\n{\n    ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n            \"event timer test timer handler\");\n}\n\nstatic ngx_int_t\nngx_event_timer_test_handler(ngx_http_request_t *r)\n{\n    ngx_chain_t                     cl;\n    ngx_buf_t                      *b;\n    size_t                          len;\n    ngx_int_t                       rc, timerid;\n    ngx_msec_t                      time;\n    ngx_str_t                       arg;\n\n    ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                  \"event timer test handler\");\n\n    if (r->method == NGX_HTTP_DELETE) {\n        len = sizeof(\"delete timer timerid=NGX_OFF_T_LEN\\n\") - 1;\n\n        if (ngx_http_arg(r, (u_char *) \"timerid\", 7, &arg) != NGX_OK) {\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                    \"event timer test, no timerid in http args\");\n            return NGX_HTTP_BAD_REQUEST;\n        }\n\n        timerid = ngx_atoi(arg.data, arg.len);\n        if (timerid == NGX_ERROR) {\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                    \"event timer test, timerid arg not int type\");\n            return NGX_HTTP_BAD_REQUEST;\n        }\n\n        ngx_event_timer_del_timer(timerid);\n    } else if (r->method == NGX_HTTP_POST) {\n        len = sizeof(\"add timer timerid=NGX_OFF_T_LEN\\n\") - 1;\n\n        if (ngx_http_arg(r, (u_char *) \"time\", 4, &arg) != NGX_OK) {\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                    \"event timer test, no time in http args\");\n            return NGX_HTTP_BAD_REQUEST;\n        }\n\n        time = ngx_parse_time(&arg, 0);\n        if (time == (ngx_msec_t) NGX_ERROR) {\n            ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                    \"event timer test, time arg not time type\");\n            return NGX_HTTP_BAD_REQUEST;\n        }\n\n        timerid = ngx_event_timer_add_timer(time,\n                ngx_event_timer_test_timer_handler, NULL);\n    } else {\n        return NGX_HTTP_BAD_REQUEST;\n    }\n\n    r->headers_out.status = NGX_HTTP_OK;\n\n    rc = ngx_http_send_header(r);\n    if (rc == NGX_ERROR || rc > NGX_OK || r->header_only) {\n        return rc;\n    }\n\n    b = ngx_create_temp_buf(r->pool, len);\n\n    if (b == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    if (r->method == NGX_HTTP_DELETE) {\n        b->last = ngx_snprintf(b->last, len,\n                \"delete timer timerid=%i\\n\", timerid);\n    } else {\n        b->last = ngx_snprintf(b->last, len,\n                \"add timer timerid=%i\\n\", timerid);\n    }\n    b->last_buf = 1;\n    b->last_in_chain = 1;\n\n    cl.buf = b;\n    cl.next = NULL;\n\n    return ngx_http_output_filter(r, &cl);\n}\n\nstatic char *\nngx_event_timer_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t  *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_event_timer_test_handler;\n\n    return NGX_CONF_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/ngx_http_dynamic_test_module.c",
    "content": "#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_dynamic_conf.h\"\n#include \"ngx_http_dynamic.h\"\n\n\nstatic char *ngx_http_dynamic_test(ngx_conf_t *cf, ngx_command_t *cmd,\n       void *conf);\n\nstatic void *ngx_http_dynamic_test_create_main_conf(ngx_conf_t *cf);\nstatic char *ngx_http_dynamic_test_init_main_conf(ngx_conf_t *cf, void *conf);\nstatic void *ngx_http_dynamic_test_create_srv_conf(ngx_conf_t *cf);\nstatic char *ngx_http_dynamic_test_init_srv_conf(ngx_conf_t *cf, void *conf);\nstatic void *ngx_http_dynamic_test_create_loc_conf(ngx_conf_t *cf);\nstatic char *ngx_http_dynamic_test_init_loc_conf(ngx_conf_t *cf, void *conf);\n\n#define MAXBUFSIZE  4096\n\ntypedef struct {\n    ngx_uint_t                  mi;\n    ngx_str_t                   ms;\n} ngx_http_dynamic_test_main_conf_t;\n\ntypedef struct {\n    ngx_uint_t                  si;\n    ngx_str_t                   ss;\n} ngx_http_dynamic_test_srv_conf_t;\n\ntypedef struct {\n    ngx_uint_t                  li;\n    ngx_str_t                   ls;\n} ngx_http_dynamic_test_loc_conf_t;\n\n\nstatic ngx_command_t  ngx_http_dynamic_test_commands[] = {\n\n    { ngx_string(\"http_dynamic_test\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,\n      ngx_http_dynamic_test,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\nstatic ngx_http_module_t  ngx_http_dynamic_test_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    NULL,                                   /* postconfiguration */\n\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n\n    NULL,                                   /* create location configuration */\n    NULL                                    /* merge location configuration */\n};\n\nstatic ngx_command_t  ngx_http_dynamic_test_dcommands[] = {\n\n    { ngx_string(\"main_int\"),\n      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      0,\n      offsetof(ngx_http_dynamic_test_main_conf_t, mi),\n      NULL },\n\n    { ngx_string(\"main_str\"),\n      NGX_HTTP_MAIN_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_str_slot,\n      0,\n      offsetof(ngx_http_dynamic_test_main_conf_t, ms),\n      NULL },\n\n    { ngx_string(\"srv_int\"),\n      NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      0,\n      offsetof(ngx_http_dynamic_test_srv_conf_t, si),\n      NULL },\n\n    { ngx_string(\"srv_str\"),\n      NGX_HTTP_SRV_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_str_slot,\n      0,\n      offsetof(ngx_http_dynamic_test_srv_conf_t, ss),\n      NULL },\n\n    { ngx_string(\"loc_int\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_num_slot,\n      0,\n      offsetof(ngx_http_dynamic_test_loc_conf_t, li),\n      NULL },\n\n    { ngx_string(\"loc_str\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_TAKE1,\n      ngx_conf_set_str_slot,\n      0,\n      offsetof(ngx_http_dynamic_test_loc_conf_t, ls),\n      NULL },\n\n      ngx_null_command\n};\n\nstatic ngx_http_dynamic_module_t  ngx_http_dynamic_test_module_dctx = {\n    ngx_http_dynamic_test_create_main_conf, /* create main configuration */\n    ngx_http_dynamic_test_init_main_conf,   /* init main configuration */\n\n    ngx_http_dynamic_test_create_srv_conf,  /* create server configuration */\n    ngx_http_dynamic_test_init_srv_conf,    /* init server configuration */\n\n    ngx_http_dynamic_test_create_loc_conf,  /* create location configuration */\n    ngx_http_dynamic_test_init_loc_conf     /* init location configuration */\n};\n\nngx_module_t  ngx_http_dynamic_test_module = {\n    NGX_MODULE_V1,\n    &ngx_http_dynamic_test_module_ctx,      /* module context */\n    ngx_http_dynamic_test_commands,         /* module directives */\n    NGX_HTTP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    (uintptr_t) &ngx_http_dynamic_test_module_dctx, /* module dynamic context */\n    (uintptr_t) ngx_http_dynamic_test_dcommands, /* module dynamic directives */\n    NGX_MODULE_V1_DYNAMIC_PADDING\n};\n\n\nstatic void *\nngx_http_dynamic_test_create_main_conf(ngx_conf_t *cf)\n{\n    ngx_http_dynamic_test_main_conf_t      *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_dynamic_test_main_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->mi = NGX_CONF_UNSET_UINT;\n\n    return conf;\n}\n\nstatic char *\nngx_http_dynamic_test_init_main_conf(ngx_conf_t *cf, void *conf)\n{\n    ngx_http_dynamic_test_main_conf_t      *hdtmcf;\n\n    hdtmcf = conf;\n\n    ngx_conf_init_uint_value(hdtmcf->mi, 100);\n\n    if (hdtmcf->ms.len == 0) {\n        ngx_str_set(&hdtmcf->ms, \"test for ms\");\n    }\n\n    return NGX_CONF_OK;\n}\n\nstatic void *\nngx_http_dynamic_test_create_srv_conf(ngx_conf_t *cf)\n{\n    ngx_http_dynamic_test_srv_conf_t       *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_dynamic_test_srv_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->si = NGX_CONF_UNSET_UINT;\n\n    return conf;\n}\n\nstatic char *\nngx_http_dynamic_test_init_srv_conf(ngx_conf_t *cf, void *conf)\n{\n    ngx_http_dynamic_test_srv_conf_t       *hdtscf;\n\n    hdtscf = conf;\n\n    ngx_conf_init_uint_value(hdtscf->si, 100);\n\n    if (hdtscf->ss.len == 0) {\n        ngx_str_set(&hdtscf->ss, \"test for ss\");\n    }\n\n    return NGX_CONF_OK;\n}\n\nstatic void *\nngx_http_dynamic_test_create_loc_conf(ngx_conf_t *cf)\n{\n    ngx_http_dynamic_test_loc_conf_t       *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_dynamic_test_loc_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->li = NGX_CONF_UNSET_UINT;\n\n    return conf;\n}\n\nstatic char *\nngx_http_dynamic_test_init_loc_conf(ngx_conf_t *cf, void *conf)\n{\n    ngx_http_dynamic_test_loc_conf_t       *hdtlcf;\n\n    hdtlcf = conf;\n\n    ngx_conf_init_uint_value(hdtlcf->li, 100);\n\n    if (hdtlcf->ls.len == 0) {\n        ngx_str_set(&hdtlcf->ls, \"test for ls\");\n    }\n\n    return NGX_CONF_OK;\n}\n\nstatic ngx_int_t\nngx_http_dynamic_test_handler(ngx_http_request_t *r)\n{\n    ngx_chain_t                             cl;\n    ngx_buf_t                              *b;\n    ngx_http_dynamic_test_main_conf_t      *hdtmcf;\n    ngx_http_dynamic_test_srv_conf_t       *hdtscf;\n    ngx_http_dynamic_test_loc_conf_t       *hdtlcf;\n\n    ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0, \"http dynamic test handler\");\n\n    b = ngx_create_temp_buf(r->pool, MAXBUFSIZE);\n\n    if (b == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    hdtmcf = ngx_http_get_module_main_dconf(r, &ngx_http_dynamic_test_module);\n    if (hdtmcf == NULL) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"dynamic conf test handler, dynamic main conf not configured\");\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    hdtscf = ngx_http_get_module_srv_dconf(r, &ngx_http_dynamic_test_module);\n    if (hdtscf == NULL) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"dynamic conf test handler, dynamic srv conf not configured\");\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    hdtlcf = ngx_http_get_module_loc_dconf(r, &ngx_http_dynamic_test_module);\n    if (hdtlcf == NULL) {\n        ngx_log_error(NGX_LOG_ERR, ngx_cycle->log, 0,\n                \"dynamic conf test handler, dynamic loc conf not configured\");\n    }\n\n    r->headers_out.status = NGX_HTTP_OK;\n\n    ngx_http_send_header(r);\n\n    b->last = ngx_snprintf(b->last, MAXBUFSIZE,\n            \"dynamic core test mi:%ui ms:%V\\n\", hdtmcf->mi, &hdtmcf->ms);\n    b->last = ngx_snprintf(b->last, MAXBUFSIZE,\n            \"dynamic core test si:%ui ss:%V\\n\", hdtscf->si, &hdtscf->ss);\n    if (hdtlcf) {\n        b->last = ngx_snprintf(b->last, MAXBUFSIZE,\n                \"dynamic core test li:%ui ls:%V\\n\", hdtlcf->li, &hdtlcf->ls);\n    }\n    b->last_buf = 1;\n    b->last_in_chain = 1;\n\n    cl.buf = b;\n    cl.next = NULL;\n\n    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0, \"send body\");\n\n    return ngx_http_output_filter(r, &cl);\n}\n\nstatic char *\nngx_http_dynamic_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t  *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_http_dynamic_test_handler;\n\n    return NGX_CONF_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/ngx_map_test_module.c",
    "content": "#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_map.h\"\n#include \"ngx_test_macro.h\"\n\n\nstatic char *ngx_map_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\n\n\nstatic ngx_command_t  ngx_map_test_commands[] = {\n\n    { ngx_string(\"map_test\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,\n      ngx_map_test,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_map_test_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    NULL,                                   /* postconfiguration */\n\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n\n    NULL,                                   /* create location configuration */\n    NULL                                    /* merge location configuration */\n};\n\n\nngx_module_t  ngx_map_test_module = {\n    NGX_MODULE_V1,\n    &ngx_map_test_module_ctx,               /* module context */\n    ngx_map_test_commands,                  /* module directives */\n    NGX_HTTP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\n#define MAP_NODE_INIT_STR(n, k)                                 \\\n    ngx_map_node_t      n;                                      \\\n    static ngx_str_t    k = ngx_string(#k);                     \\\n    ngx_memzero(&n, sizeof(ngx_map_node_t));                    \\\n    n.raw_key = (intptr_t) &k;\n\n#define MAP_NODE_PRINT_KEY_STR(n)                               \\\n    {                                                           \\\n        ngx_str_t      *s = (ngx_str_t *) (n)->raw_key;         \\\n        ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,      \\\n                \"!!!!!!!!!!!!!!!!%V\", s);                       \\\n    }\n\nstatic ngx_int_t\nngx_map_test_handler(ngx_http_request_t *r)\n{\n    ngx_buf_t                  *b;\n    ngx_chain_t                 cl;\n    size_t                      len;\n    ngx_map_t                   map;\n\n    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"map test handler\");\n\n    ngx_memzero(&map, sizeof(ngx_map_t));\n    ngx_map_init(&map, ngx_map_hash_str, ngx_cmp_str);\n\n    MAP_NODE_INIT_STR(n1, k1)\n    MAP_NODE_INIT_STR(n2, k2)\n    MAP_NODE_INIT_STR(n3, k3)\n    MAP_NODE_INIT_STR(n4, k4)\n    MAP_NODE_INIT_STR(n5, k5)\n    MAP_NODE_INIT_STR(n6, k6)\n    MAP_NODE_INIT_STR(n7, k7)\n    MAP_NODE_INIT_STR(n8, k8)\n    MAP_NODE_INIT_STR(n9, k9)\n    MAP_NODE_INIT_STR(n10, k10)\n    ngx_map_node_t      n11;\n    static ngx_str_t    k11 = ngx_string(\"k5\");\n    ngx_memzero(&n11, sizeof(ngx_map_node_t));\n    n11.raw_key = (intptr_t) &k11;\n\n    ngx_map_insert(&map, &n1, 0);\n    ngx_map_insert(&map, &n2, 0);\n    ngx_map_insert(&map, &n3, 0);\n    ngx_map_insert(&map, &n4, 0);\n    ngx_map_insert(&map, &n5, 0);\n    ngx_map_insert(&map, &n6, 0);\n    ngx_map_insert(&map, &n7, 0);\n    ngx_map_insert(&map, &n8, 0);\n    ngx_map_insert(&map, &n9, 0);\n    ngx_map_insert(&map, &n10, 0);\n    ngx_map_insert(&map, &n11, 0);\n\n    NGX_TEST_INIT\n\n    ngx_map_node_t     *n;\n    n = ngx_map_begin(&map);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n1 == n)\n\n    n = ngx_map_next(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n2 == n)\n\n    n = ngx_map_next(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n3 == n)\n\n    n = ngx_map_next(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n4 == n)\n\n    n = ngx_map_next(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n5 == n)\n\n    n = ngx_map_next(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n6 == n)\n\n    n = ngx_map_next(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n7 == n)\n\n    n = ngx_map_next(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n8 == n)\n\n    n = ngx_map_next(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n9 == n)\n\n    n = ngx_map_next(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n10 == n)\n\n    n = ngx_map_next(n);\n    NGX_TEST_ISOK(NULL == n)\n\n    n = ngx_map_rbegin(&map);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n10 == n)\n\n    n = ngx_map_prev(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n9 == n)\n\n    n = ngx_map_prev(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n8 == n)\n\n    n = ngx_map_prev(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n7 == n)\n\n    n = ngx_map_prev(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n6 == n)\n\n    n = ngx_map_prev(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n5 == n)\n\n    n = ngx_map_prev(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n4 == n)\n\n    n = ngx_map_prev(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n3 == n)\n\n    n = ngx_map_prev(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n2 == n)\n\n    n = ngx_map_prev(n);\n    MAP_NODE_PRINT_KEY_STR(n)\n    NGX_TEST_ISOK(&n1 == n)\n\n    n = ngx_map_prev(n);\n    NGX_TEST_ISOK(NULL == n)\n\n    static ngx_str_t kk1 = ngx_string(\"k100\");\n    NGX_TEST_ISOK(NULL == ngx_map_find(&map, (intptr_t) &kk1))\n\n    static ngx_str_t kk2 = ngx_string(\"k5\");\n    NGX_TEST_ISOK(&n5 == ngx_map_find(&map, (intptr_t) &kk2))\n\n    ngx_map_insert(&map, &n11, 1);\n    NGX_TEST_ISOK(&n11 == ngx_map_find(&map, (intptr_t) &kk2))\n\n    static ngx_str_t kk3 = ngx_string(\"k8\");\n    ngx_map_delete(&map, (intptr_t) &kk3);\n    NGX_TEST_ISOK(NULL == ngx_map_find(&map, (intptr_t) &kk3))\n\n    static ngx_str_t kk4 = ngx_string(\"k8\");\n    ngx_map_insert(&map, &n8, 1);\n    NGX_TEST_ISOK(&n8 == ngx_map_find(&map, (intptr_t) &kk4))\n\n    static ngx_str_t kk5 = ngx_string(\"k7\");\n    NGX_TEST_ISOK(&n7 == ngx_map_find(&map, (intptr_t) &kk5))\n\n    r->headers_out.status = NGX_HTTP_OK;\n\n    ngx_http_send_header(r);\n\n    len = sizeof(\"TEST cases 4294967296, 4294967296 pass\\n\") - 1;\n    b = ngx_create_temp_buf(r->pool, len);\n\n    if (b == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    b->last = ngx_snprintf(b->last, len, \"TEST cases %d, %d pass\\n\",\n            count, pass);\n    b->last_buf = 1;\n    b->last_in_chain = 1;\n\n    cl.buf = b;\n    cl.next = NULL;\n\n    return ngx_http_output_filter(r, &cl);\n}\n\n\nstatic char *\nngx_map_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t   *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_map_test_handler;\n\n    return NGX_CONF_OK;\n}\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/ngx_poold_test_module.c",
    "content": "#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_poold.h\"\n\n\nstatic char *ngx_poold_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\n\n\nstatic ngx_command_t  ngx_poold_test_commands[] = {\n\n    { ngx_string(\"poold_test\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,\n      ngx_poold_test,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_poold_test_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    NULL,                                   /* postconfiguration */\n\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n\n    NULL,                                   /* create location configuration */\n    NULL                                    /* merge location configuration */\n};\n\n\nngx_module_t  ngx_poold_test_module = {\n    NGX_MODULE_V1,\n    &ngx_poold_test_module_ctx,             /* module context */\n    ngx_poold_test_commands,                /* module directives */\n    NGX_HTTP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_int_t\nngx_poold_test_handler(ngx_http_request_t *r)\n{\n    ngx_chain_t                    *out;\n    ngx_pool_t                     *pool;\n\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, \"poold test handler\");\n\n    pool = NGX_CREATE_POOL(4096, r->connection->log);\n\n    pool = NGX_CREATE_POOL(1024, r->connection->log);\n\n    NGX_DESTROY_POOL(pool);\n\n    NGX_DESTROY_POOL(pool);\n\n    r->headers_out.status = NGX_HTTP_OK;\n    ngx_http_send_header(r);\n\n    out = ngx_poold_state(r, 1);\n    out->buf->last_buf = 1;\n\n    return ngx_http_output_filter(r, out);\n}\n\n\nstatic char *\nngx_poold_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t   *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_poold_test_handler;\n\n    return NGX_CONF_OK;\n}\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/ngx_rbuf_test_module.c",
    "content": "#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"../ngx_rbuf.h\"\n\n\nstatic char *ngx_rbuf_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\n\n\nstatic ngx_command_t  ngx_rbuf_test_commands[] = {\n\n    { ngx_string(\"rbuf_test\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,\n      ngx_rbuf_test,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_rbuf_test_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    NULL,                                   /* postconfiguration */\n\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n\n    NULL,                                   /* create location configuration */\n    NULL                                    /* merge location configuration */\n};\n\n\nngx_module_t  ngx_rbuf_test_module = {\n    NGX_MODULE_V1,\n    &ngx_rbuf_test_module_ctx,              /* module context */\n    ngx_rbuf_test_commands,                 /* module directives */\n    NGX_HTTP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_int_t\nngx_rbuf_test_handler(ngx_http_request_t *r)\n{\n    ngx_str_t                       size;\n    ngx_int_t                       key;\n    ngx_chain_t                    *cl, *cl1, *cl2;\n    ngx_chain_t                    *out;\n\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, \"rbuf test handler\");\n\n    if (ngx_http_arg(r, (u_char *) \"size\", sizeof(\"size\") - 1, &size)\n            != NGX_OK)\n    {\n        return NGX_HTTP_BAD_REQUEST;\n    }\n\n    key = ngx_atoi(size.data, size.len);\n    cl = ngx_get_chainbuf(key, 1);\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, \"cl: %p\", cl);\n\n    cl1 = ngx_get_chainbuf(key, 0);\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, \"cl1: %p\", cl1);\n    cl1->buf->start = cl->buf->start;\n    cl1->buf->end = cl->buf->end;\n    cl1->buf->pos = cl->buf->pos;\n    cl1->buf->last = cl->buf->last;\n\n    cl2 = ngx_get_chainbuf(key, 0);\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, \"cl2: %p\", cl2);\n    cl2->buf->start = cl->buf->start;\n    cl2->buf->end = cl->buf->end;\n    cl2->buf->pos = cl->buf->pos;\n    cl2->buf->last = cl->buf->last;\n\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0, \"rbuf free\");\n\n    ngx_put_chainbuf(cl2);\n\n    ngx_put_chainbuf(cl);\n\n    ngx_put_chainbuf(cl1);\n\n    r->headers_out.status = NGX_HTTP_OK;\n    ngx_http_send_header(r);\n\n    out = ngx_rbuf_state(r, 1);\n    out->buf->last_buf = 1;\n\n    return ngx_http_output_filter(r, out);\n}\n\n\nstatic char *\nngx_rbuf_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t  *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_rbuf_test_handler;\n\n    return NGX_CONF_OK;\n}\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/ngx_test_macro.h",
    "content": "/*\n * Copyright (C) AlexWoo(Wu Jie) wj19840501@gmail.com\n */\n\n\n#ifndef _NGX_TEST_MACRO_H_INCLUDE_\n#define _NGX_TEST_MACRO_H_INCLUDE_\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n\nstatic ngx_int_t count  = 0;\nstatic ngx_int_t pass   = 0;\n\n#define NGX_TEST_INIT       count = 0, pass = 0;\n\n#define NGX_TEST_ISOK(testcase)                                             \\\n{                                                                           \\\n    ngx_int_t  __ret = testcase;                                            \\\n    ++count;                                                                \\\n    if (__ret) ++pass;                                                      \\\n    ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, \"    TEST \"#testcase\"%s\",\\\n            (__ret ? \" ...OK\" : \" ...ERROR\"));                              \\\n}\n\n#define NGX_TEST_INT(di, si)                                                \\\n    (di == si)\n\nstatic ngx_inline ngx_int_t\nngx_test_str(ngx_str_t *nstr, char *cstr)\n{\n    size_t                      len;\n\n    len = ngx_strlen(cstr);\n\n    return (nstr->len == len && ngx_memcmp(nstr->data, cstr, len) == 0);\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/ngx_timerd_test_module.c",
    "content": "#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_timerd.h\"\n\n\nstatic char *ngx_timerd_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\n\n\ntypedef struct {\n    ngx_pool_t                 *pool;\n    ngx_event_t                 ev;\n    ngx_uint_t                  footprint;\n} ngx_timer_test_data_t;\n\n\nstatic ngx_command_t  ngx_timerd_test_commands[] = {\n\n    { ngx_string(\"timerd_test\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,\n      ngx_timerd_test,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_timerd_test_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    NULL,                                   /* postconfiguration */\n\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n\n    NULL,                                   /* create location configuration */\n    NULL                                    /* merge location configuration */\n};\n\n\nngx_module_t  ngx_timerd_test_module = {\n    NGX_MODULE_V1,\n    &ngx_timerd_test_module_ctx,            /* module context */\n    ngx_timerd_test_commands,               /* module directives */\n    NGX_HTTP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void\nngx_timerd_test_timer(ngx_event_t *ev)\n{\n    ngx_timer_test_data_t      *data;\n\n    data = ev->data;\n\n    ngx_log_error(NGX_LOG_INFO, ngx_cycle->log, 0, \"timerd test timer: %p %ui\",\n            data, data->footprint);\n}\n\n\nstatic ngx_int_t\nngx_timerd_test_handler(ngx_http_request_t *r)\n{\n    ngx_chain_t                *out;\n\n    // normal timer trigger\n    ngx_timer_test_data_t      *test;\n    ngx_pool_t                 *pool;\n\n    pool = ngx_create_pool(4096, r->connection->log);\n    test = ngx_pcalloc(pool, sizeof(ngx_timer_test_data_t));\n\n    test->pool = pool;\n    test->footprint = ngx_timerd_footprint();\n    test->ev.data = test;\n    test->ev.handler = ngx_timerd_test_timer;\n    NGX_ADD_TIMER(&test->ev, 5000, offsetof(ngx_timer_test_data_t, footprint));\n\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n            \"!!!!!!!!!!normal timer trigger: %p %ui\", test, test->footprint);\n\n    // delete timer twice\n    ngx_timer_test_data_t      *test1;\n    ngx_pool_t                 *pool1;\n\n    pool1 = ngx_create_pool(4096, r->connection->log);\n    test1 = ngx_pcalloc(pool1, sizeof(ngx_timer_test_data_t));\n\n    test1->pool = pool1;\n    test1->footprint = ngx_timerd_footprint();\n    test1->ev.data = test1;\n    test1->ev.handler = ngx_timerd_test_timer;\n    NGX_ADD_TIMER(&test1->ev, 5000, offsetof(ngx_timer_test_data_t, footprint));\n\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n            \"!!!!!!!!!!delete timer twice: %p %ui\", test1, test1->footprint);\n    NGX_DEL_TIMER(&test1->ev, test1->footprint);\n    NGX_DEL_TIMER(&test1->ev, test1->footprint);\n\n    // timer trigger after event destroy\n    ngx_timer_test_data_t      *test2;\n    ngx_pool_t                 *pool2;\n\n    pool2 = ngx_create_pool(4096, r->connection->log);\n    test2 = ngx_pcalloc(pool2, sizeof(ngx_timer_test_data_t));\n\n    test2->pool = pool2;\n    test2->footprint = ngx_timerd_footprint();\n    test2->ev.data = test2;\n    test2->ev.handler = ngx_timerd_test_timer;\n    NGX_ADD_TIMER(&test2->ev, 5000, offsetof(ngx_timer_test_data_t, footprint));\n\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n            \"!!!!!!!!!!timer trigger after event destroy: %p %ui\",\n            test2, test2->footprint);\n    test2->footprint = ngx_timerd_footprint();\n\n    ngx_destroy_pool(pool2);\n\n    // delete timer after event destroy\n    ngx_timer_test_data_t      *test3;\n    ngx_pool_t                 *pool3;\n\n    pool3 = ngx_create_pool(4096, r->connection->log);\n    test3 = ngx_pcalloc(pool3, sizeof(ngx_timer_test_data_t));\n\n    test3->pool = pool3;\n    test3->footprint = ngx_timerd_footprint();\n    test3->ev.data = test3;\n    test3->ev.handler = ngx_timerd_test_timer;\n    NGX_ADD_TIMER(&test3->ev, 5000, offsetof(ngx_timer_test_data_t, footprint));\n\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n            \"!!!!!!!!!!delete timer after event destroy: %p %ui\",\n            test3, test3->footprint);\n    test3->footprint = ngx_timerd_footprint();\n\n    NGX_DEL_TIMER(&test3->ev, test3->footprint);\n\n    ngx_destroy_pool(pool3);\n\n\n    // add timer after event destroy\n    ngx_timer_test_data_t      *test4;\n    ngx_pool_t                 *pool4;\n\n    pool4 = ngx_create_pool(4096, r->connection->log);\n    test4 = ngx_pcalloc(pool4, sizeof(ngx_timer_test_data_t));\n\n    test4->pool = pool4;\n    test4->footprint = ngx_timerd_footprint();\n    test4->ev.data = test4;\n    test4->ev.handler = ngx_timerd_test_timer;\n    NGX_ADD_TIMER(&test4->ev, 5000, offsetof(ngx_timer_test_data_t, footprint));\n\n    ngx_log_error(NGX_LOG_INFO, r->connection->log, 0,\n            \"!!!!!!!!!!add timer after event destroy: %p %ui\",\n            test4, test4->footprint);\n    test4->footprint = ngx_timerd_footprint();\n\n    NGX_ADD_TIMER(&test4->ev, 5000, offsetof(ngx_timer_test_data_t, footprint));\n\n    ngx_destroy_pool(pool4);\n\n\n    r->headers_out.status = NGX_HTTP_OK;\n    ngx_http_send_header(r);\n\n    out = ngx_timerd_state(r, 1);\n    out->buf->last_buf = 1;\n\n    return ngx_http_output_filter(r, out);\n}\n\n\nstatic char *\nngx_timerd_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t   *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_timerd_test_handler;\n\n    return NGX_CONF_OK;\n}\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/ngx_toolkit_misc_test_module.c",
    "content": "#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n#include \"ngx_toolkit_misc.h\"\n#include \"ngx_test_macro.h\"\n\n\nstatic char *ngx_toolkit_misc_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\n\n\nstatic ngx_command_t  ngx_toolkit_misc_test_commands[] = {\n\n    { ngx_string(\"toolkit_misc_test\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,\n      ngx_toolkit_misc_test,\n      0,\n      0,\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_toolkit_misc_test_module_ctx = {\n    NULL,                                   /* preconfiguration */\n    NULL,                                   /* postconfiguration */\n\n    NULL,                                   /* create main configuration */\n    NULL,                                   /* init main configuration */\n\n    NULL,                                   /* create server configuration */\n    NULL,                                   /* merge server configuration */\n\n    NULL,                                   /* create location configuration */\n    NULL                                    /* merge location configuration */\n};\n\n\nngx_module_t  ngx_toolkit_misc_test_module = {\n    NGX_MODULE_V1,\n    &ngx_toolkit_misc_test_module_ctx,      /* module context */\n    ngx_toolkit_misc_test_commands,         /* module directives */\n    NGX_HTTP_MODULE,                        /* module type */\n    NULL,                                   /* init master */\n    NULL,                                   /* init module */\n    NULL,                                   /* init process */\n    NULL,                                   /* init thread */\n    NULL,                                   /* exit thread */\n    NULL,                                   /* exit process */\n    NULL,                                   /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_int_t\nngx_parse_toolkit_misc_test(ngx_int_t ret, char *url, char *scheme, char *user,\n        char *host, char *port, char *path, char *args, char *fragment,\n        char *host_with_port, char *uri_with_args)\n{\n    ngx_int_t                   _ret;\n    ngx_str_t                   _url;\n    ngx_request_url_t           rurl;\n\n    ngx_memzero(&rurl, sizeof(ngx_request_url_t));\n    _url.data = (u_char *) url;\n    _url.len = ngx_strlen(url);\n\n    _ret = ngx_parse_request_url(&rurl, &_url);\n    if (ret != _ret) {\n        return 0;\n    }\n\n    if (_ret == NGX_ERROR) {\n        return 1;\n    }\n\n#define TEST(para)                                                      \\\n    if (para == NULL && rurl.para.len) {                                \\\n        return 0;                                                       \\\n    } else if (para && ngx_test_str(&rurl.para, para) == NGX_ERROR) {   \\\n        return 0;                                                       \\\n    }\n\n    TEST(scheme)\n    TEST(user)\n    TEST(host)\n    TEST(port)\n    TEST(path)\n    TEST(args)\n    TEST(fragment)\n    TEST(host_with_port)\n    TEST(uri_with_args)\n\n#undef TEST\n\n    return 1;\n}\n\nstatic ngx_int_t\nngx_request_port_test(in_port_t expect, char *scheme, char *port)\n{\n    in_port_t                   ret;\n    ngx_str_t                   _scheme, _port;\n\n    _scheme.data = (u_char *) scheme;\n    _scheme.len = ngx_strlen(scheme);\n\n    _port.data = (u_char *) port;\n    _port.len = ngx_strlen(port);\n\n    ret = ngx_request_port(&_scheme, &_port);\n\n    return ret == expect;\n}\n\nstatic ngx_int_t\nngx_toolkit_misc_test_handler(ngx_http_request_t *r)\n{\n    ngx_buf_t                  *b;\n    ngx_chain_t                 cl;\n    size_t                      len;\n    ngx_fd_t                    fd;\n    u_char                      md5key[NGX_MD5KEY_LEN];\n    ngx_str_t                   file;\n\n    ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n            \"request url test handler\");\n\n    NGX_TEST_INIT\n\n    NGX_TEST_ISOK(ngx_parse_toolkit_misc_test(NGX_ERROR, \"test\",\n                NULL,\n                NULL, NULL, NULL,\n                NULL, NULL, NULL,\n                NULL, NULL));\n    NGX_TEST_ISOK(ngx_parse_toolkit_misc_test(NGX_ERROR, \"http://\",\n                NULL,\n                NULL, NULL, NULL,\n                NULL, NULL, NULL,\n                NULL, NULL));\n    NGX_TEST_ISOK(ngx_parse_toolkit_misc_test(NGX_ERROR, \"http://alex@\",\n                NULL,\n                NULL, NULL, NULL,\n                NULL, NULL, NULL,\n                NULL, NULL));\n    NGX_TEST_ISOK(ngx_parse_toolkit_misc_test(NGX_OK, \"http://alex@test\",\n                \"http\",\n                \"alex\", \"test\", NULL,\n                NULL, NULL, NULL,\n                \"test\", NULL));\n    NGX_TEST_ISOK(ngx_parse_toolkit_misc_test(NGX_ERROR, \"http://alex@test:\",\n                NULL,\n                NULL, NULL, NULL,\n                NULL, NULL, NULL,\n                NULL, NULL));\n    NGX_TEST_ISOK(ngx_parse_toolkit_misc_test(NGX_OK, \"http://alex@test:8080\",\n                \"http\",\n                \"alex\", \"test\", \"8080\",\n                NULL, NULL, NULL,\n                \"test:8080\", NULL));\n    NGX_TEST_ISOK(ngx_parse_toolkit_misc_test(NGX_ERROR, \"http://@test:8080\",\n                NULL,\n                NULL, NULL, NULL,\n                NULL, NULL, NULL,\n                NULL, NULL));\n    NGX_TEST_ISOK(ngx_parse_toolkit_misc_test(NGX_OK, \"http://test\",\n                \"http\",\n                NULL, \"test\", NULL,\n                NULL, NULL, NULL,\n                \"test\", NULL));\n    NGX_TEST_ISOK(ngx_parse_toolkit_misc_test(NGX_ERROR, \"http://test:\",\n                NULL,\n                NULL, NULL, NULL,\n                NULL, NULL, NULL,\n                NULL, NULL));\n    NGX_TEST_ISOK(ngx_parse_toolkit_misc_test(NGX_OK, \"http://test:8080\",\n                \"http\",\n                NULL, \"test\", \"8080\",\n                NULL, NULL, NULL,\n                \"test:8080\", NULL));\n    NGX_TEST_ISOK(ngx_parse_toolkit_misc_test(NGX_OK, \"http://test:8080/\",\n                \"http\",\n                NULL, \"test\", \"8080\",\n                NULL, NULL, NULL,\n                \"test:8080\", NULL));\n    NGX_TEST_ISOK(ngx_parse_toolkit_misc_test(NGX_OK, \"http://test:8080/live\",\n                \"http\",\n                NULL, \"test\", \"8080\",\n                \"live\", NULL, NULL,\n                \"test:8080\", \"live\"));\n    NGX_TEST_ISOK(ngx_parse_toolkit_misc_test(NGX_OK,\n                \"http://alex@test/live/test\",\n                \"http\",\n                \"alex\", \"test\", \"8080\",\n                \"live/test\", NULL, NULL,\n                \"test\", \"live/test\"));\n    NGX_TEST_ISOK(ngx_parse_toolkit_misc_test(NGX_ERROR,\n                \"http://alex@test:80/live/test?\",\n                NULL,\n                NULL, NULL, NULL,\n                NULL, NULL, NULL,\n                NULL, NULL));\n    NGX_TEST_ISOK(ngx_parse_toolkit_misc_test(NGX_OK,\n                \"http://alex@test:80/live/test?a=b&c=d\",\n                \"http\",\n                \"alex\", \"test\", \"80\",\n                \"live/test\", \"a=b&c=d\", NULL,\n                \"test:80\", \"live/test?a=b&c=d\"));\n    NGX_TEST_ISOK(ngx_parse_toolkit_misc_test(NGX_ERROR,\n                \"http://alex@/live/test?a=b&c=d\",\n                NULL,\n                NULL, NULL, NULL,\n                NULL, NULL, NULL,\n                NULL, NULL));\n    NGX_TEST_ISOK(ngx_parse_toolkit_misc_test(NGX_OK,\n                \"http://alex@test:8080/live/test?a=b&c=d#test\",\n                \"http\",\n                \"alex\", \"test\", \"8080\",\n                \"live/test\", \"a=b&c=d\", \"test\",\n                \"test:8080\", \"live/test?a=b&c=d#test\"));\n\n    NGX_TEST_ISOK(ngx_request_port_test(0, \"\", \"abcd\"));\n    NGX_TEST_ISOK(ngx_request_port_test(1234, \"\", \"1234\"));\n    NGX_TEST_ISOK(ngx_request_port_test(0, \"\", \"102222\"));\n    NGX_TEST_ISOK(ngx_request_port_test(0, \"rtp\", \"\"));\n    NGX_TEST_ISOK(ngx_request_port_test(80, \"http\", \"\"));\n    NGX_TEST_ISOK(ngx_request_port_test(443, \"https\", \"\"));\n    NGX_TEST_ISOK(ngx_request_port_test(1935, \"rtmp\", \"\"));\n\n    file.data = (u_char *) \"/usr/local/nginx/conf/md5testfile\";\n    file.len = sizeof(\"/usr/local/nginx/conf/md5testfile\") - 1;\n\n    fd = ngx_open_file(file.data, NGX_FILE_RDONLY, NGX_FILE_OPEN, 0);\n    if (fd == NGX_INVALID_FILE) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, ngx_errno,\n                ngx_open_file_n \" %s failed\", file.data);\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    if (ngx_md5_file(fd, md5key)) {\n        ngx_log_error(NGX_LOG_ERR, r->connection->log, 0,\n                \"md5 file %V failed\", &file);\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    NGX_TEST_ISOK(ngx_memcmp(md5key, \"d4309a79dbeaeb6d7811734ce483db59\", 32)\n                             == 0);\n\n    ngx_close_file(fd);\n\n\n    r->headers_out.status = NGX_HTTP_OK;\n\n    ngx_http_send_header(r);\n\n    len = sizeof(\"TEST cases 4294967296, 4294967296 pass\\n\") - 1;\n    b = ngx_create_temp_buf(r->pool, len);\n\n    if (b == NULL) {\n        return NGX_HTTP_INTERNAL_SERVER_ERROR;\n    }\n\n    b->last = ngx_snprintf(b->last, len, \"TEST cases %d, %d pass\\n\",\n            count, pass);\n    b->last_buf = 1;\n    b->last_in_chain = 1;\n\n    cl.buf = b;\n    cl.next = NULL;\n\n    return ngx_http_output_filter(r, &cl);\n}\n\n\nstatic char *\nngx_toolkit_misc_test(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t   *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_toolkit_misc_test_handler;\n\n    return NGX_CONF_OK;\n}\n\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/test.com.zone",
    "content": "$TTL 3H\n@   IN  SOA @   wj19840501.gmail.com. (\n\t\t\t\t\t0\t; serial\n\t\t\t\t\t1D\t; refresh\n\t\t\t\t\t1H\t; retry\n\t\t\t\t\t1W\t; expire\n\t\t\t\t\t3H  ; minimum\n                    )\n\n@       IN      NS          dns\ndns     IN      A           192.168.84.254\nwww     IN      A           1.1.1.1\nwww     IN      A           1.1.1.2\nwww     IN      A           1.1.1.3\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-toolkit-module/t/test1.com.zone",
    "content": "$TTL 3H\n@   IN  SOA @   wj19840501.gmail.com. (\n\t\t\t\t\t0\t; serial\n\t\t\t\t\t1D\t; refresh\n\t\t\t\t\t1H\t; retry\n\t\t\t\t\t1W\t; expire\n\t\t\t\t\t3H  ; minimum\n                    )\n\n@       IN      NS          dns\ndns     IN      A           192.168.84.254\nwww     IN      A           1.1.1.4\nwww     IN      A           1.1.1.5\nwww     IN      A           1.1.1.6\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-ts-module/README.rst",
    "content": "*************************\nNGINX MPEG-TS Live Module\n*************************\n\n\n.. contents::\n\n\nFeatures\n========\n\n- receives MPEG-TS over HTTP\n- produces and manages live HLS_\n- produces and manages live MPEG-DASH_\n\n\nCompatibility\n=============\n\n- `nginx <http://nginx.org>`_ version >= 1.11.5\n\n\nBuild\n=====\n\nBuilding nginx with the module:\n\n.. code-block:: bash\n\n    # static module\n    $ ./configure --add-module=/path/to/nginx-ts-module\n\n    # dynamic module\n    $ ./configure --add-dynamic-module=/path/to/nginx-ts-module\n\n\nDirectives\n==========\n\nts\n--\n\n========== ========\n*Syntax:*  ``ts``\n*Context:* location\n========== ========\n\nSets up a live MPEG-TS handler for the location.\nThis directive is **required** for HLS or MPEG-DASH generation.\n\nThe last URI component is used as a stream name.\nFor example, if the URI is ``/foo/bar/baz``, the stream name is ``baz``.\n\nA simple way to stream MPEG-TS over HTTP is by running ``ffmpeg``:\n\n.. code-block:: bash\n  \n    $ ffmpeg ... -f mpegts http://127.0.0.1:8000/foo\n\n\nBy default, HTTP request body size is limited in nginx.\nTo enable live streaming without size limitation, use the directive\n``client_max_body_size 0``.\n\n\nts_hls\n------\n\n========== ========\n*Syntax:*  ``ts_hls path=PATH [segment=MIN[:MAX]] [segments=NUMBER] [max_size=SIZE] [noclean]``\n*Context:* location\n========== ========\n\nEnables generating live HLS in the location.\nThe ``PATH`` parameter specifies a directory where HLS playlist and segment\nfiles will be created.\nThe directory is created if missing.\nFor every publshed stream a subdirectory with the stream name is created under\nthe ``PATH`` directory.\nThe HLS playlist file created in the stream subdirectory is named\n``index.m3u8``.\nA path handler is installed to watch files in the directory.\nThe old files in the directory are automatically deleted once they get old\nenough and are not supposed to be accessed by clients anymore.\nIt is not allowed to reuse the path in other ``ts_hls`` or ``ts_dash``\ndirectives.\n\nThe ``segment`` parameter specifies minimum and maximum segment durations.\nIf the stream has video, segments are started at video key frames.\nIf a key frame does not appear within ``MAX`` duration, the segment is\ntruncated.\nThe default value for minimum segment duration is 5 seconds.\nIf unspecified, maximum segment duration is set to be twice as much as the\nminimum.\n\nThe ``segments`` parameter specifies the maximum number of segments in a\nplaylist.\nAs new segments are added to the playlist, the oldest segments are removed from\nit.\n\nThe ``max_size`` parameter specifies the maximum size of a segment.\nA segment is truncated once it reaches this size.\n\nThe ``noclean`` parameter indicates that the old files (segments and the\nplaylist) should not be automatically deleted from disk.\n\nExample::\n\n    location / {\n        ts;\n        ts_hls path=/var/hls segment=10s;\n    }\n\n\nts_dash\n-------\n\n========== ========\n*Syntax:*  ``ts_dash path=PATH [segment=MIN[:MAX]] [segments=NUMBER] [max_size=SIZE] [noclean]``\n*Context:* location\n========== ========\n\nEnables generating live MPEG-DASH in the location.\nThe ``PATH`` parameter specifies a directory where MPEG-DASH manifest and\nsegment files will be created.\nThe directory is created if missing.\nFor every publshed stream a subdirectory with the stream name is created under\nthe ``PATH`` directory.\nThe MPEG-DASH manifest file created in the stream subdirectory is named\n``index.mpd``.\nA path handler is installed to watch files in the directory.\nThe old files in the directory are automatically deleted once they get old\nenough and are not supposed to be accessed by clients anymore.\nIt is not allowed to reuse the path in other ``ts_hls`` or ``ts_dash``\ndirectives.\n\nThe ``segment`` parameter specifies minimum and maximum segment durations.\nIf the stream has video, segments are started at video key frames.\nIf a key frame does not appear within ``MAX`` duration, the segment is\ntruncated.\nThe default value for minimum segment duration is 5 seconds.\nIf unspecified, maximum segment duration is set to be twice as much as the\nminimum.\n\n  When setting an explicit value for the ``MAX`` parameter, the following\n  note should be taken into account.\n  If the next segment is shorter than the previous one by a factor more that\n  two, dash.js_ can end up in a busy cycle requesting the second segment over\n  and over again.\n\nThe ``segments`` parameter specifies the maximum number of segments in a\nmanifest.\nAs new segments are added to the manifest, the oldest segments are removed from\nit.\n\nThe ``max_size`` parameter specifies the maximum size of a segment.\nA segment is truncated once it reaches this size.\n\nThe ``noclean`` parameter indicates that the old files (segments and the\nmanifest) should not be automatically deleted from disk.\n\nExample::\n\n    location / {\n        ts;\n        ts_dash path=/var/hls segment=10s;\n    }\n\n\nExample\n=======\n\nnginx.conf::\n\n    # nginx.conf\n\n    events {\n    }\n\n    http {\n        server {\n            listen 8000;\n\n            location / {\n                root html;\n            }\n\n            location /publish/ {\n                ts;\n                ts_hls path=/var/media/hls segment=10s;\n                ts_dash path=/var/media/dash segment=10s;\n\n                client_max_body_size 0;\n            }\n\n            location /play/ {\n                types {\n                    application/x-mpegURL m3u8;\n                    application/dash+xml mpd;\n                    video/MP2T ts;\n                    video/mp4 mp4;\n                }\n                alias /var/media/;\n            }\n        }\n    }\n\nHLS in HTML:\n\n.. code-block:: html\n\n    <body>\n      <video width=\"640\" height=\"480\" controls autoplay\n             src=\"http://127.0.0.1:8000/play/hls/sintel/index.m3u8\">\n      </video>\n    </body>\n\nMPEG-DASH in HTML using the dash.js_ player:\n\n.. code-block:: html\n\n    <script src=\"http://cdn.dashjs.org/latest/dash.all.min.js\"></script>\n\n    <body>\n      <video data-dashjs-player\n             width=\"640\" height=\"480\" controls autoplay\n             src=\"http://127.0.0.1:8000/play/dash/sintel/index.mpd\">\n      </video>\n    </body>\n\nBroadcasting a single-bitrate mp4 file:\n\n.. code-block:: bash\n\n    $ ffmpeg -re -i ~/Movies/sintel.mp4 -bsf:v h264_mp4toannexb\n             -c copy -f mpegts http://127.0.0.1:8000/publish/sintel\n\nBroadcasting an mp4 file in multiple bitrates.\nFor proper HLS generation streams should be grouped into MPEG-TS programs with\nthe ``-program`` option of ``ffmpeg``:\n\n.. code-block:: bash\n\n    $ ffmpeg -re -i ~/Movies/sintel.mp4 -bsf:v h264_mp4toannexb\n             -map 0:0 -map 0:1 -map 0:0 -map 0:1\n             -c:v:0 copy\n             -c:a:0 copy\n             -c:v:1 libx264 -b:v:1 100k\n             -c:a:1 libfaac -ac:a:1 1 -b:a:1 32k\n             -program \"st=0:st=1\" -program \"st=2:st=3\"\n             -f mpegts http://127.0.0.1:8000/publish/sintel\n\n\n.. _HLS: https://tools.ietf.org/html/draft-pantos-http-live-streaming-23\n.. _MPEG-DASH: https://en.wikipedia.org/wiki/Dynamic_Adaptive_Streaming_over_HTTP\n.. _dash.js: https://github.com/Dash-Industry-Forum/dash.js\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-ts-module/config",
    "content": "ngx_module_type=HTTP\nngx_addon_name=ngx_http_ts_module\nngx_module_name=ngx_http_ts_module\nngx_module_incs=\nngx_module_deps=\"$ngx_addon_dir/src/ngx_ts_stream.h \\\n                 $ngx_addon_dir/src/ngx_ts_hls.h \\\n                 $ngx_addon_dir/src/ngx_ts_dash.h \\\n                 $ngx_addon_dir/src/ngx_ts_avc.h \\\n                 $ngx_addon_dir/src/ngx_ts_aac.h\"\nngx_module_srcs=\"$ngx_addon_dir/src/ngx_http_ts_module.c \\\n                 $ngx_addon_dir/src/ngx_ts_stream.c \\\n                 $ngx_addon_dir/src/ngx_ts_hls.c \\\n                 $ngx_addon_dir/src/ngx_ts_dash.c \\\n                 $ngx_addon_dir/src/ngx_ts_dash_mp4.c \\\n                 $ngx_addon_dir/src/ngx_ts_avc.c \\\n                 $ngx_addon_dir/src/ngx_ts_aac.c\"\n\n. auto/module\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-ts-module/src/ngx_http_ts_module.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_http.h>\n\n#include \"ngx_ts_stream.h\"\n#include \"ngx_ts_hls.h\"\n#include \"ngx_ts_dash.h\"\n\n\ntypedef struct {\n    ngx_ts_hls_conf_t   *hls;\n    ngx_ts_dash_conf_t  *dash;\n} ngx_http_ts_loc_conf_t;\n\n\ntypedef struct {\n    ngx_ts_stream_t     *ts;\n} ngx_http_ts_ctx_t;\n\n\nstatic ngx_int_t ngx_http_ts_handler(ngx_http_request_t *r);\nstatic void ngx_http_ts_init(ngx_http_request_t *r);\nstatic void ngx_http_ts_read_event_handler(ngx_http_request_t *r);\n\nstatic char *ngx_http_ts(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\nstatic void *ngx_http_ts_create_conf(ngx_conf_t *cf);\nstatic char *ngx_http_ts_merge_conf(ngx_conf_t *cf, void *parent, void *child);\n\n\nstatic ngx_command_t  ngx_http_ts_commands[] = {\n\n    { ngx_string(\"ts\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_NOARGS,\n      ngx_http_ts,\n      0,\n      0,\n      NULL },\n\n    { ngx_string(\"ts_hls\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,\n      ngx_ts_hls_set_slot,\n      NGX_HTTP_LOC_CONF_OFFSET,\n      offsetof(ngx_http_ts_loc_conf_t, hls),\n      NULL },\n\n    { ngx_string(\"ts_dash\"),\n      NGX_HTTP_LOC_CONF|NGX_CONF_1MORE,\n      ngx_ts_dash_set_slot,\n      NGX_HTTP_LOC_CONF_OFFSET,\n      offsetof(ngx_http_ts_loc_conf_t, dash),\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_http_module_t  ngx_http_ts_module_ctx = {\n    NULL,                          /* preconfiguration */\n    NULL,                          /* postconfiguration */\n\n    NULL,                          /* create main configuration */\n    NULL,                          /* init main configuration */\n\n    NULL,                          /* create server configuration */\n    NULL,                          /* merge server configuration */\n\n    ngx_http_ts_create_conf,       /* create location configuration */\n    ngx_http_ts_merge_conf         /* merge location configuration */\n};\n\n\nngx_module_t  ngx_http_ts_module = {\n    NGX_MODULE_V1,\n    &ngx_http_ts_module_ctx,       /* module context */\n    ngx_http_ts_commands,          /* module directives */\n    NGX_HTTP_MODULE,               /* module type */\n    NULL,                          /* init master */\n    NULL,                          /* init module */\n    NULL,                          /* init process */\n    NULL,                          /* init thread */\n    NULL,                          /* exit thread */\n    NULL,                          /* exit process */\n    NULL,                          /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic ngx_int_t\nngx_http_ts_handler(ngx_http_request_t *r)\n{\n    ngx_int_t                rc;\n    ngx_str_t                name;\n    ngx_uint_t               n;\n    ngx_http_ts_ctx_t       *ctx;\n    ngx_http_ts_loc_conf_t  *tlcf;\n\n    ctx = ngx_pcalloc(r->pool, sizeof(ngx_http_ts_ctx_t));\n    if (ctx == NULL) {\n        return NGX_ERROR;\n    }\n\n    ctx->ts = ngx_pcalloc(r->pool, sizeof(ngx_ts_stream_t));\n    if (ctx->ts == NULL) {\n        return NGX_ERROR;\n    }\n\n    ctx->ts->pool = r->pool;\n    ctx->ts->log = r->connection->log;\n\n    for (n = 0; n < r->uri.len; n++) {\n        if (r->uri.data[r->uri.len - 1 - n] == '/') {\n            break;\n        }\n    }\n\n    name.data = &r->uri.data[r->uri.len - n];\n    name.len = n;\n\n    /* XXX detect streams with the same name, add shared zone */\n\n    tlcf = ngx_http_get_module_loc_conf(r, ngx_http_ts_module);\n\n    if (tlcf->hls) {\n        if (ngx_ts_hls_create(tlcf->hls, ctx->ts, &name) == NULL) {\n            return  NGX_ERROR;\n        }\n    }\n\n    if (tlcf->dash) {\n        if (ngx_ts_dash_create(tlcf->dash, ctx->ts, &name) == NULL) {\n            return NGX_ERROR;\n        }\n    }\n\n    ngx_http_set_ctx(r, ctx, ngx_http_ts_module);\n\n    r->request_body_no_buffering = 1;\n\n    rc = ngx_http_read_client_request_body(r, ngx_http_ts_init);\n\n    if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {\n        return rc;\n    }\n\n    return NGX_DONE;\n}\n\n\nstatic void\nngx_http_ts_init(ngx_http_request_t *r)\n{\n    ngx_http_ts_ctx_t        *ctx;\n    ngx_http_request_body_t  *rb;\n\n    rb = r->request_body;\n\n    if (rb == NULL) {\n        ngx_http_finalize_request(r, NGX_HTTP_INTERNAL_SERVER_ERROR);\n        return;\n    }\n\n    ctx = ngx_http_get_module_ctx(r, ngx_http_ts_module);\n\n    if (ngx_ts_read(ctx->ts, rb->bufs) != NGX_OK) {\n        ngx_http_finalize_request(r, NGX_ERROR);\n        return;\n    }\n\n    if (r->reading_body) {\n        r->read_event_handler = ngx_http_ts_read_event_handler;\n    }\n}\n\n\nstatic void\nngx_http_ts_read_event_handler(ngx_http_request_t *r)\n{\n    ngx_int_t                 rc;\n    ngx_http_ts_ctx_t        *ctx;\n    ngx_http_request_body_t  *rb;\n\n    if (ngx_exiting || ngx_terminate) {\n        ngx_http_finalize_request(r, NGX_HTTP_CLOSE);\n        return;\n    }\n\n    ctx = ngx_http_get_module_ctx(r, ngx_http_ts_module);\n\n    rb = r->request_body;\n\n    for ( ;; ) {\n        rc = ngx_http_read_unbuffered_request_body(r);\n\n        if (rc >= NGX_HTTP_SPECIAL_RESPONSE) {\n            ngx_http_finalize_request(r, rc);\n            return;\n        }\n\n        if (rb->bufs == NULL) {\n            return;\n        }\n\n        if (ngx_ts_read(ctx->ts, rb->bufs) != NGX_OK) {\n            ngx_http_finalize_request(r, NGX_ERROR);\n            return;\n        }\n\n        if (rc == NGX_OK) {\n            ngx_http_finalize_request(r, NGX_HTTP_NO_CONTENT);\n            return;\n        }\n\n        rb->bufs = NULL;\n    }\n}\n\n\nstatic char *\nngx_http_ts(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_http_core_loc_conf_t  *clcf;\n\n    clcf = ngx_http_conf_get_module_loc_conf(cf, ngx_http_core_module);\n    clcf->handler = ngx_http_ts_handler;\n\n    return NGX_CONF_OK;\n}\n\n\nstatic void *\nngx_http_ts_create_conf(ngx_conf_t *cf)\n{\n    ngx_http_ts_loc_conf_t  *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_http_ts_loc_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->hls = NGX_CONF_UNSET_PTR;\n    conf->dash = NGX_CONF_UNSET_PTR;\n\n    return conf;\n}\n\n\nstatic char *\nngx_http_ts_merge_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_http_ts_loc_conf_t *prev = parent;\n    ngx_http_ts_loc_conf_t *conf = child;\n\n    ngx_conf_merge_ptr_value(conf->hls, prev->hls, NULL);\n    ngx_conf_merge_ptr_value(conf->dash, prev->dash, NULL);\n\n    return NGX_CONF_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-ts-module/src/ngx_stream_ts_module.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n#include <ngx_stream.h>\n\n#include \"ngx_ts_stream.h\"\n#include \"ngx_ts_hls.h\"\n#include \"ngx_ts_dash.h\"\n\n\ntypedef struct {\n    ngx_ts_hls_conf_t   *hls;\n    ngx_ts_dash_conf_t  *dash;\n} ngx_stream_ts_srv_conf_t;\n\n\ntypedef struct {\n    ngx_ts_stream_t     *ts;\n} ngx_stream_ts_ctx_t;\n\n\nstatic void ngx_stream_ts_handler(ngx_stream_session_t *s);\nstatic char *ngx_stream_ts(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\nstatic void *ngx_stream_ts_create_conf(ngx_conf_t *cf);\nstatic char *ngx_stream_ts_merge_conf(ngx_conf_t *cf, void *parent,\n    void *child);\n\n\nstatic ngx_command_t  ngx_stream_ts_commands[] = {\n\n    { ngx_string(\"ts\"),\n      NGX_STREAM_SRV_CONF|NGX_CONF_NOARGS,\n      ngx_stream_ts,\n      0,\n      0,\n      NULL },\n\n    { ngx_string(\"ts_hls\"),\n      NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,\n      ngx_ts_hls_set_slot,\n      NGX_STREAM_SRV_CONF_OFFSET,\n      offsetof(ngx_stream_ts_srv_conf_t, hls),\n      NULL },\n\n    { ngx_string(\"ts_dash\"),\n      NGX_STREAM_SRV_CONF|NGX_CONF_1MORE,\n      ngx_ts_dash_set_slot,\n      NGX_STREAM_SRV_CONF_OFFSET,\n      offsetof(ngx_stream_ts_srv_conf_t, dash),\n      NULL },\n\n      ngx_null_command\n};\n\n\nstatic ngx_stream_module_t  ngx_stream_ts_module_ctx = {\n    NULL,                          /* preconfiguration */\n    NULL,                          /* postconfiguration */\n\n    NULL,                          /* create main configuration */\n    NULL,                          /* init main configuration */\n\n    ngx_stream_ts_create_conf,     /* create server configuration */\n    ngx_stream_ts_merge_conf       /* merge server configuration */\n};\n\n\nngx_module_t  ngx_stream_ts_module = {\n    NGX_MODULE_V1,\n    &ngx_stream_ts_module_ctx,     /* module context */\n    ngx_stream_ts_commands,        /* module directives */\n    NGX_STREAM_MODULE,             /* module type */\n    NULL,                          /* init master */\n    NULL,                          /* init module */\n    NULL,                          /* init process */\n    NULL,                          /* init thread */\n    NULL,                          /* exit thread */\n    NULL,                          /* exit process */\n    NULL,                          /* exit master */\n    NGX_MODULE_V1_PADDING\n};\n\n\nstatic void\nngx_stream_ts_handler(ngx_stream_session_t *s);\n{\n    ngx_str_t                  name;\n    ngx_connection_t          *c;\n    ngx_stream_ts_ctx_t       *ctx;\n    ngx_stream_ts_srv_conf_t  *tscf;\n\n    c = s->connection;\n\n    ctx = ngx_pcalloc(c->pool, sizeof(ngx_stream_ts_ctx_t));\n    if (ctx == NULL) {\n        ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);\n        return;\n    }\n\n    ctx->ts = ngx_pcalloc(c->pool, sizeof(ngx_ts_stream_t));\n    if (ctx->ts == NULL) {\n        ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);\n        return;\n    }\n\n    ctx->ts->pool = c->pool;\n    ctx->ts->log = c->log;\n\n    /* XXX */\n    ngx_ste_set(&name, \"foo\");\n\n    /* XXX detect streams with the same name, add shared zone */\n\n    tscf = ngx_stream_get_module_srv_conf(s, ngx_stream_ts_module);\n\n    if (tscf->hls) {\n        if (ngx_ts_hls_create(tscf->hls, ctx->ts, &name) == NULL) {\n            ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);\n            return;\n        }\n    }\n\n    if (tscf->dash) {\n        if (ngx_ts_dash_create(tscf->dash, ctx->ts, &name) == NULL) {\n            ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);\n            return;\n        }\n    }\n\n    ngx_stream_set_ctx(r, ctx, ngx_stream_ts_module);\n\n    c->write->handler = ngx_stream_ts_read_handler;\n\n    ngx_stream_ts_read_handler(c->write);\n}\n\n\nstatic voi\nngx_stream_ts_read_handler(ngx_event_t *rev)\n{\n    ssize_t                n;\n    ngx_buf_t              b;\n    ngx_chain_t            in;\n    ngx_connection_t      *c;\n    ngx_stream_ts_ctx_t   *ctx;\n    ngx_stream_session_t  *s;\n    u_char                 buf[4096];\n\n    c = rev->data;\n    s = c->data;\n\n    if (ngx_exiting || ngx_terminate) {\n        ngx_stream_finalize_request(s, NGX_STREAM_OK);\n        return;\n    }\n\n    if (rev->timedout) {\n        ngx_stream_finalize_session(s, NGX_STREAM_OK);\n        return;\n    }\n\n    ctx = ngx_stream_get_module_ctx(s, ngx_stream_ts_module);\n\n    in.buf = &b;\n    in.next = NULL;\n\n    ngx_memzero(&b, sizeof(ngx_buf_t));\n\n    while (rev->ready) {\n        n = c->recv(c, buf, sizeof(buf));\n\n        if (n == NGX_ERROR || n == 0) {\n            ngx_stream_finalize_session(s, NGX_STREAM_OK);\n            return;\n        }\n\n        if (n == NGX_AGAIN) {\n            break;\n        }\n\n        b.pos = buf;\n        b.last = buf + n;\n\n        if (ngx_ts_read(ctx->ts, &in) != NGX_OK) {\n            ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);\n            return;\n        }\n    }\n\n    ngx_add_timer(rev, 5000); /* XXX */\n\n    if (ngx_handle_read_event(rev, 0) != NGX_OK) {\n        ngx_stream_finalize_session(s, NGX_STREAM_INTERNAL_SERVER_ERROR);\n        return;\n    }\n}\n\n\nstatic char *\nngx_stream_ts(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    ngx_stream_core_srv_conf_t  *cscf;\n\n    cscf = ngx_stream_conf_get_module_srv_conf(cf, ngx_stream_core_module);\n    cscf->handler = ngx_stream_ts_handler;\n\n    return NGX_CONF_OK;\n}\n\n\nstatic void *\nngx_stream_ts_create_conf(ngx_conf_t *cf)\n{\n    ngx_stream_ts_srv_conf_t  *conf;\n\n    conf = ngx_pcalloc(cf->pool, sizeof(ngx_stream_ts_srv_conf_t));\n    if (conf == NULL) {\n        return NULL;\n    }\n\n    conf->hls = NGX_CONF_UNSET_PTR;\n    conf->dash = NGX_CONF_UNSET_PTR;\n\n    return conf;\n}\n\n\nstatic char *\nngx_stream_ts_merge_conf(ngx_conf_t *cf, void *parent, void *child)\n{\n    ngx_stream_ts_srv_conf_t *prev = parent;\n    ngx_stream_ts_srv_conf_t *conf = child;\n\n    ngx_conf_merge_ptr_value(conf->hls, prev->hls, NULL);\n    ngx_conf_merge_ptr_value(conf->dash, prev->dash, NULL);\n\n    return NGX_CONF_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-ts-module/src/ngx_ts_aac.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n#include \"ngx_ts_aac.h\"\n\n\nngx_ts_aac_params_t *\nngx_ts_aac_decode_params(ngx_ts_stream_t *ts, u_char *adts, size_t adts_len)\n{\n    /*\n     * XXX\n     * https://wiki.multimedia.cx/index.php/ADTS\n     */\n\n    ngx_ts_aac_params_t  *aac;\n\n    static ngx_uint_t  freq[] = {\n        96000, 88200, 64000, 48000, 44100, 32000, 24000, 22050,\n        16000, 12000, 11025,  8000,  7350,     0,     0,     0\n    };\n\n    if (adts_len < 7) {\n        return NULL;\n    }\n\n    aac = ngx_pcalloc(ts->pool, sizeof(ngx_ts_aac_params_t));\n    if (aac == NULL) {\n        return NULL;\n    }\n\n    /* MPEG Version: 0 for MPEG-4, 1 for MPEG-2 */\n    aac->version = (adts[1] & 0x08) ? 1 : 0;\n\n    /*\n     * MPEG-4 Audio Object Types:\n     *   1: AAC Main\n     *   2: AAC LC (Low Complexity)\n     *   3: AAC SSR (Scalable Sample Rate)\n     *   4: AAC LTP (Long Term Prediction)\n     */\n    aac->profile = (adts[2] >> 6) + 1;\n\n    aac->freq_index = (adts[2] >> 2) & 0x0f;\n\n    aac->freq = freq[aac->freq_index];\n    if (aac->freq == 0) {\n        goto failed;\n    }\n\n    aac->chan = ((adts[2] & 0x01) << 2) | (adts[3] >> 6);\n\n    ngx_log_debug4(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                   \"ts aac version:%ui, profile:%ui, freq:%ui, chan:%ui\",\n                   aac->version, aac->profile, aac->freq, aac->chan);\n\n    return aac;\n\nfailed:\n\n    ngx_log_error(NGX_LOG_ERR, ts->log, 0, \"failed to parse AAC parameters\");\n\n    return NULL;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-ts-module/src/ngx_ts_aac.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n#include \"ngx_ts_stream.h\"\n\n\n#ifndef _NGX_TS_AAC_H_INCLUDED_\n#define _NGX_TS_AAC_H_INCLUDED_\n\n\ntypedef struct {\n    ngx_uint_t   version;\n    ngx_uint_t   profile;\n    ngx_uint_t   freq_index;\n    ngx_uint_t   freq;\n    ngx_uint_t   chan;\n} ngx_ts_aac_params_t;\n\n\nngx_ts_aac_params_t *ngx_ts_aac_decode_params(ngx_ts_stream_t *ts, u_char *adts,\n    size_t adts_len);\n\n\n#endif /* _NGX_TS_AAC_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-ts-module/src/ngx_ts_avc.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n#include \"ngx_ts_avc.h\"\n\n\ntypedef struct {\n    u_char      *pos;\n    u_char      *last;\n    ngx_uint_t   shift;\n    ngx_uint_t   err;  /* unsigned  err:1; */\n    const char  *name;\n    ngx_log_t   *log;\n} ngx_ts_avc_reader_t;\n\n\nstatic void ngx_ts_avc_init_reader(ngx_ts_avc_reader_t *br, u_char *buf,\n    size_t len, ngx_log_t *log);\nstatic uint64_t ngx_ts_avc_read(ngx_ts_avc_reader_t *br, ngx_uint_t bits);\nstatic uint64_t ngx_ts_avc_read_golomb(ngx_ts_avc_reader_t *br);\n\n\nstatic void\nngx_ts_avc_init_reader(ngx_ts_avc_reader_t *br, u_char *buf, size_t len,\n    ngx_log_t *log)\n{\n    ngx_memzero(br, sizeof(ngx_ts_avc_reader_t));\n\n    br->pos = buf;\n    br->last = buf + len;\n    br->log = log;\n}\n\n\nstatic uint64_t\nngx_ts_avc_read(ngx_ts_avc_reader_t *br, ngx_uint_t bits)\n{\n    uint64_t    v;\n    ngx_uint_t  k, n;\n\n    if (br->err) {\n        return 0;\n    }\n\n    v = 0;\n    n = bits;\n\n    while (n) {\n        if (br->pos == br->last) {\n            br->err = 1;\n            break;\n        }\n\n        k = ngx_min(8 - br->shift, n);\n\n        /*\n         * [-------------|||||||||--------------]\n         *    br->shift      k\n         */\n\n        v = (v << k) | (*br->pos & (0xff >> br->shift)) >> (8 - br->shift - k);\n\n        n -= k;\n        br->shift += k;\n\n        if (br->shift == 8) {\n            br->shift = 0;\n            br->pos++;\n        }\n    }\n\n    ngx_log_debug3(NGX_LOG_DEBUG_CORE, br->log, 0,\n                   \"ts avc %s[%uL]:%uL\", br->name, bits, v);\n\n    return v;\n}\n\n\nstatic uint64_t\nngx_ts_avc_read_golomb(ngx_ts_avc_reader_t *br)\n{\n    /*\n     * ISO/IEC 14496-10:2004(E)\n     * 9.1 Parsing process for Exp-Golomb codes, p. 159\n     */\n\n    uint64_t    v;\n    ngx_uint_t  n;\n\n    if (br->err) {\n        return 0;\n    }\n\n    n = 0;\n    \n    while (ngx_ts_avc_read(br, 1) == 0) {\n        if (br->err) {\n            return 0;\n        }\n\n        n++;\n    }\n\n    v = ((uint64_t) 1 << n) - 1 + ngx_ts_avc_read(br, n);\n\n    ngx_log_debug2(NGX_LOG_DEBUG_CORE, br->log, 0, \"ts avc %s:%uL\",\n                   br->name, v);\n\n    return v;\n}\n\n\nngx_ts_avc_params_t *\nngx_ts_avc_decode_params(ngx_ts_stream_t *ts, u_char *sps, size_t sps_len,\n    u_char *pps, size_t pps_len)\n{\n    /*\n     * ISO/IEC 14496-10:2004(E)\n     * 7.3.2.1 Sequence parameter set RBSP syntax, p. 31\n     */\n\n    ngx_uint_t            type, n, i;\n    ngx_ts_avc_reader_t   br;\n    ngx_ts_avc_params_t  *avc;\n\n    /* ignore PPS so far */\n\n    avc = ngx_pcalloc(ts->pool, sizeof(ngx_ts_avc_params_t));\n    if (avc == NULL) {\n        return NULL;\n    }\n\n    ngx_ts_avc_init_reader(&br, sps, sps_len, ts->log);\n\n    br.name = \"nalu_type\";\n    type = ngx_ts_avc_read(&br, 8);\n    if ((type & 0x1f) != 7) {\n        goto failed;\n    }\n\n    br.name = \"profile_idc\";\n    avc->profile_idc = ngx_ts_avc_read(&br, 8);\n\n    br.name = \"constraints\";\n    avc->constraints = ngx_ts_avc_read(&br, 8);\n\n    br.name = \"level_idc\";\n    avc->level_idc = ngx_ts_avc_read(&br, 8);\n\n    br.name = \"seq_parameter_set_id\";\n    avc->sps_id = ngx_ts_avc_read_golomb(&br);\n\n    if (avc->profile_idc == 100\n        || avc->profile_idc == 110\n        || avc->profile_idc == 122\n        || avc->profile_idc == 244\n        || avc->profile_idc == 44\n        || avc->profile_idc == 83\n        || avc->profile_idc == 86\n        || avc->profile_idc == 118\n        || avc->profile_idc == 128\n        || avc->profile_idc == 138\n        || avc->profile_idc == 139\n        || avc->profile_idc == 134)\n    {\n        br.name = \"chroma_format_idc\";\n        avc->chroma_format_idc = ngx_ts_avc_read_golomb(&br);\n\n        if (avc->chroma_format_idc == 3) {\n            br.name =\n                     \"residual_colour_transform_flagseparate_colour_plane_flag\";\n            avc->residual_colour_transform_flagseparate_colour_plane_flag = \n                                                        ngx_ts_avc_read(&br, 1);\n        }\n\n        br.name = \"bit_depth_luma_minus8\";\n        avc->bit_depth_luma = ngx_ts_avc_read_golomb(&br) + 8;\n\n        br.name = \"bit_depth_chroma_minus8\";\n        avc->bit_depth_chroma = ngx_ts_avc_read_golomb(&br) + 8;\n\n        br.name = \"qpprime_y_zero_transform_bypass_flag\";\n        avc->qpprime_y_zero_transform_bypass_flag = ngx_ts_avc_read(&br, 1);\n\n        br.name = \"seq_scaling_matrix_present_flag\";\n        avc->seq_scaling_matrix_present_flag = ngx_ts_avc_read(&br, 1);\n\n        if (avc->seq_scaling_matrix_present_flag) {\n            n = (avc->chroma_format_idc != 3) ? 8 : 12;\n\n            for (i = 0; i < n; i++) {\n                br.name = \"seq_scaling_list_present_flag[i]\";\n                if (ngx_ts_avc_read(&br, 1)) {\n                    goto failed;\n                }\n            }\n        }\n    }\n\n    br.name = \"log2_max_frame_num_minus4\";\n    avc->max_frame_num = (1 << (ngx_ts_avc_read_golomb(&br) + 4));\n\n    br.name = \"pic_order_cnt_type\";\n    avc->pic_order_cnt_type = ngx_ts_avc_read_golomb(&br);\n\n    if (avc->pic_order_cnt_type == 0) {\n        br.name = \"log2_max_pic_order_cnt_lsb_minus4\";\n        avc->max_pic_order_cnt_lsb = (1 << (ngx_ts_avc_read_golomb(&br) + 4));\n\n    } else if (avc->pic_order_cnt_type == 1) {\n        br.name = \"delta_pic_order_always_zero_flag\";\n        avc->delta_pic_order_always_zero_flag = ngx_ts_avc_read(&br, 1);\n\n        br.name = \"offset_for_non_ref_pic\";\n        avc->offset_for_non_ref_pic = ngx_ts_avc_read_golomb(&br);\n\n        br.name = \"offset_for_top_to_bottom_field\";\n        avc->offset_for_top_to_bottom_field = ngx_ts_avc_read_golomb(&br);\n\n        br.name = \"num_ref_frames_in_pic_order_cnt_cycle\";\n        n = ngx_ts_avc_read_golomb(&br);\n\n        for (i = 0; i < n; i++) {\n            br.name = \"offset_for_ref_frame[i]\";\n            (void) ngx_ts_avc_read_golomb(&br);\n        }\n    }\n\n    br.name = \"num_ref_frames\";\n    avc->num_ref_frames = ngx_ts_avc_read_golomb(&br);\n\n    br.name = \"gaps_in_frame_num_value_allowed_flag\";\n    avc->gaps_in_frame_num_value_allowed_flag = ngx_ts_avc_read(&br, 1);\n\n    br.name = \"pic_width_in_mbs_minus1\";\n    avc->pic_width_in_mbs = ngx_ts_avc_read_golomb(&br) + 1;\n\n    br.name = \"pic_height_in_map_units_minus1\";\n    avc->pic_height_in_map_units = ngx_ts_avc_read_golomb(&br) + 1;\n\n    br.name = \"frame_mbs_only_flag\";\n    avc->frame_mbs_only_flag = ngx_ts_avc_read(&br, 1);\n\n    if (!avc->frame_mbs_only_flag) {\n        br.name = \"mb_adaptive_frame_field_flag\";\n        avc->mb_adaptive_frame_field_flag = ngx_ts_avc_read(&br, 1);\n    }\n\n    br.name = \"direct_8x8_inference_flag\";\n    avc->direct_8x8_inference_flag = ngx_ts_avc_read(&br, 1);\n\n    br.name = \"frame_cropping_flag\";\n    avc->frame_cropping_flag = ngx_ts_avc_read(&br, 1);\n\n    if (avc->frame_cropping_flag) {\n        br.name = \"frame_crop_left_offset\";\n        avc->frame_crop_left_offset = ngx_ts_avc_read_golomb(&br);\n\n        br.name = \"frame_crop_right_offset\";\n        avc->frame_crop_right_offset = ngx_ts_avc_read_golomb(&br);\n\n        br.name = \"frame_crop_top_offset\";\n        avc->frame_crop_top_offset = ngx_ts_avc_read_golomb(&br);\n\n        br.name = \"frame_crop_bottom_offset\";\n        avc->frame_crop_bottom_offset = ngx_ts_avc_read_golomb(&br);\n    }\n\n    if (br.err) {\n        goto failed;\n    }\n\n    avc->width =\n            avc->pic_width_in_mbs * 16\n            - (avc->frame_crop_left_offset + avc->frame_crop_right_offset) * 2;\n\n    avc->height =\n            (2 - avc->frame_mbs_only_flag) * avc->pic_height_in_map_units * 16\n            - (avc->frame_crop_top_offset + avc->frame_crop_bottom_offset) * 2;\n\n    ngx_log_debug2(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                   \"ts avc width:%ui, height:%ui\", avc->width, avc->height);\n\n    return avc;\n\nfailed:\n\n    ngx_log_error(NGX_LOG_ERR, ts->log, 0,\n                  \"failed to parse AVC parameters\");\n\n    return NULL;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-ts-module/src/ngx_ts_avc.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n#include \"ngx_ts_stream.h\"\n\n\n#ifndef _NGX_TS_AVC_H_INCLUDED_\n#define _NGX_TS_AVC_H_INCLUDED_\n\n\ntypedef struct {\n    ngx_uint_t   profile_idc;\n    ngx_uint_t   constraints;\n    ngx_uint_t   level_idc;\n    ngx_uint_t   sps_id;\n    ngx_uint_t   chroma_format_idc;\n    ngx_uint_t   bit_depth_luma;\n    ngx_uint_t   bit_depth_chroma;\n    ngx_uint_t   max_frame_num;\n    ngx_uint_t   pic_order_cnt_type;\n    ngx_uint_t   max_pic_order_cnt_lsb;\n    ngx_int_t    offset_for_non_ref_pic;\n    ngx_int_t    offset_for_top_to_bottom_field;\n    ngx_uint_t   num_ref_frames_in_pic_order_cnt_cycle;\n    ngx_uint_t   num_ref_frames;\n    ngx_uint_t   pic_width_in_mbs;\n    ngx_uint_t   pic_height_in_map_units;\n    ngx_uint_t   frame_crop_left_offset;\n    ngx_uint_t   frame_crop_right_offset;\n    ngx_uint_t   frame_crop_top_offset;\n    ngx_uint_t   frame_crop_bottom_offset;\n    ngx_uint_t   width;\n    ngx_uint_t   height;\n\n    unsigned     delta_pic_order_always_zero_flag:1;\n    unsigned     gaps_in_frame_num_value_allowed_flag:1;\n    unsigned     frame_mbs_only_flag:1;\n    unsigned     mb_adaptive_frame_field_flag:1;\n    unsigned     direct_8x8_inference_flag:1;\n    unsigned     frame_cropping_flag:1;\n    unsigned     residual_colour_transform_flagseparate_colour_plane_flag:1;\n    unsigned     qpprime_y_zero_transform_bypass_flag:1;\n    unsigned     seq_scaling_matrix_present_flag:1;\n} ngx_ts_avc_params_t;\n\n\nngx_ts_avc_params_t *ngx_ts_avc_decode_params(ngx_ts_stream_t *ts, u_char *sps,\n    size_t sps_len, u_char *pps, size_t pps_len);\n\n\n#endif /* _NGX_TS_AVC_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-ts-module/src/ngx_ts_dash.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n#include \"ngx_ts_dash.h\"\n\n\n#define NGX_TS_DASH_DATETIME_LEN  sizeof(\"2000-12-31T23:59:59Z\")\n#define NGX_TS_DASH_CODEC_LEN     sizeof(\"avc1.PPPCCCLLL\")\n\n\nstatic void ngx_ts_dash_cleanup(void *data);\nstatic ngx_int_t ngx_ts_dash_handler(ngx_ts_handler_data_t *hd);\nstatic ngx_int_t ngx_ts_dash_pmt_handler(ngx_ts_dash_t *dash);\nstatic ngx_int_t ngx_ts_dash_pes_handler(ngx_ts_dash_t *dash,\n    ngx_ts_program_t *prog, ngx_ts_es_t *es, ngx_chain_t *in);\nstatic void ngx_ts_dash_update_bandwidth(ngx_ts_dash_t *dash,\n    ngx_ts_dash_rep_t *rep, ngx_chain_t *in, uint64_t dts);\nstatic ngx_int_t ngx_ts_dash_copy_avc(ngx_ts_dash_t *dash,\n    ngx_ts_dash_rep_t *rep, ngx_chain_t *in);\nstatic ngx_int_t ngx_ts_dash_copy_aac(ngx_ts_dash_t *dash,\n    ngx_ts_dash_rep_t *rep, ngx_chain_t *in);\nstatic ngx_int_t ngx_ts_dash_copy_default(ngx_ts_dash_t *dash,\n    ngx_ts_dash_rep_t *rep, ngx_chain_t *in);\nstatic ngx_int_t ngx_ts_dash_close_segment(ngx_ts_dash_t *dash,\n    ngx_ts_dash_rep_t *rep);\nstatic ngx_int_t ngx_ts_dash_update_playlist(ngx_ts_dash_t *dash);\nstatic ngx_int_t ngx_ts_dash_write_file(u_char *path1, u_char *path2,\n    u_char *data, size_t len, ngx_log_t *log);\nstatic void ngx_ts_dash_format_datetime(u_char *p, time_t t);\nstatic void ngx_ts_dash_format_codec(u_char *p, ngx_ts_dash_rep_t *rep);\nstatic ngx_int_t ngx_ts_dash_update_init_segments(ngx_ts_dash_t *dash);\nstatic ngx_int_t ngx_ts_dash_open_segment(ngx_ts_dash_t *dash,\n    ngx_ts_dash_rep_t *rep);\n\nstatic ngx_msec_t ngx_ts_dash_file_manager(void *data);\nstatic ngx_int_t ngx_ts_dash_manage_file(ngx_tree_ctx_t *ctx, ngx_str_t *path);\nstatic ngx_int_t ngx_ts_dash_manage_directory(ngx_tree_ctx_t *ctx,\n    ngx_str_t *path);\nstatic ngx_int_t ngx_ts_dash_delete_directory(ngx_tree_ctx_t *ctx,\n    ngx_str_t *path);\nstatic ngx_int_t ngx_ts_dash_delete_file(ngx_tree_ctx_t *ctx, ngx_str_t *path);\n\n\nngx_ts_dash_t *\nngx_ts_dash_create(ngx_ts_dash_conf_t *conf, ngx_ts_stream_t *ts,\n    ngx_str_t *name)\n{\n    size_t               len;\n    ngx_ts_dash_t       *dash;\n    ngx_pool_cleanup_t  *cln;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ts->log, 0, \"ts dash create\");\n\n    dash = ngx_pcalloc(ts->pool, sizeof(ngx_ts_dash_t));\n    if (dash == NULL) {\n        return NULL;\n    }\n\n    dash->conf = conf;\n    dash->ts = ts;\n    dash->playlist_len = 128;\n    dash->init_seg_len = 256;\n\n    dash->path.len = conf->path->name.len + 1 + name->len;\n    dash->path.data = ngx_pnalloc(ts->pool, dash->path.len + 1);\n    if (dash->path.data == NULL) {\n        return NULL;\n    }\n\n    ngx_sprintf(dash->path.data, \"%V/%V%Z\", &conf->path->name, name);\n\n    /* index.mpd */\n\n    len = dash->path.len + sizeof(\"/index.mpd\");\n\n    dash->mpd_path = ngx_pnalloc(ts->pool, len);\n    if (dash->mpd_path == NULL) {\n        return NULL;\n    }\n\n    ngx_sprintf(dash->mpd_path, \"%V/index.mpd%Z\", &dash->path);\n\n    /* index.mpd.tmp */\n\n    len += sizeof(\".tmp\") - 1;\n\n    dash->mpd_tmp_path = ngx_pnalloc(ts->pool, len);\n    if (dash->mpd_tmp_path == NULL) {\n        return NULL;\n    }\n\n    ngx_sprintf(dash->mpd_tmp_path, \"%s.tmp%Z\", dash->mpd_path);\n\n    cln = ngx_pool_cleanup_add(ts->pool, 0);\n    if (cln == NULL) {\n        return NULL;\n    }\n\n    cln->handler = ngx_ts_dash_cleanup;\n    cln->data = dash;\n\n    if (ngx_ts_add_handler(ts, ngx_ts_dash_handler, dash) != NGX_OK) {\n        return NULL;\n    }\n\n    return dash;\n}\n\n\nstatic void\nngx_ts_dash_cleanup(void *data)\n{\n    ngx_ts_dash_t *dash = data;\n\n    ngx_uint_t          i, j;\n    ngx_ts_dash_set_t  *set;\n    ngx_ts_dash_rep_t  *rep;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, dash->ts->log, 0, \"ts dash cleanup\");\n\n    dash->flush = 1;\n\n    for (i = 0; i < dash->nsets; i++) {\n        set = &dash->sets[i];\n\n        for (j = 0; j < set->nreps; j++) {\n            rep =  &set->reps[j];\n\n            if (ngx_ts_dash_close_segment(dash, rep) != NGX_OK) {\n                return;\n            }\n        }\n    }\n}\n\n\nstatic ngx_int_t\nngx_ts_dash_handler(ngx_ts_handler_data_t *hd)\n{\n    ngx_ts_dash_t *dash = hd->data;\n\n    switch (hd->event) {\n\n    case NGX_TS_PMT:\n        return ngx_ts_dash_pmt_handler(dash);\n\n    case NGX_TS_PES:\n        return ngx_ts_dash_pes_handler(dash, hd->prog, hd->es, hd->bufs);\n\n    default:\n        return NGX_OK;\n    }\n}\n\n\nstatic ngx_int_t\nngx_ts_dash_pmt_handler(ngx_ts_dash_t *dash)\n{\n    size_t              len;\n    ngx_uint_t          i, j, n;\n    ngx_ts_es_t        *es;\n    ngx_ts_stream_t    *ts;\n    ngx_ts_program_t   *prog;\n    ngx_ts_dash_rep_t  *rep;\n    ngx_ts_dash_set_t  *set, *aset, *vset;\n\n    if (dash->sets) {\n        return NGX_OK;\n    }\n\n    ts = dash->ts;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ts->log, 0, \"ts dash pmt\");\n\n    n = 0;\n\n    for (i = 0; i < ts->nprogs; i++) {\n        prog = &ts->progs[i];\n\n        if (prog->es == NULL) {\n            return NGX_OK;\n        }\n\n        n += prog->nes;\n    }\n\n    dash->nsets = 0;\n    dash->sets = ngx_pcalloc(ts->pool, 2 * sizeof(ngx_ts_dash_set_t));\n    if (dash->sets == NULL) {\n        return NGX_ERROR;\n    }\n\n    aset = NULL;\n    vset = NULL;\n\n    for (i = 0; i < ts->nprogs; i++) {\n        prog = &ts->progs[i];\n\n        for (j = 0; j < prog->nes; j++) {\n            es = &prog->es[j];\n\n            switch (es->type) {\n            case NGX_TS_VIDEO_MPEG1:\n            case NGX_TS_VIDEO_MPEG2:\n            case NGX_TS_VIDEO_MPEG4:\n            case NGX_TS_VIDEO_AVC:\n                if (vset == NULL) {\n                    vset = &dash->sets[dash->nsets++];\n                    vset->video = 1;\n                }\n\n                set = vset;\n                break;\n\n            case NGX_TS_AUDIO_MPEG1:\n            case NGX_TS_AUDIO_MPEG2:\n            case NGX_TS_AUDIO_AAC:\n                if (aset == NULL) {\n                    aset = &dash->sets[dash->nsets++];\n                }\n\n                set = aset;\n                break;\n\n            default:\n                continue;\n            }\n\n            if (set->reps == NULL) {\n                set->nreps = 0;\n                set->reps = ngx_pcalloc(ts->pool,\n                                        n * sizeof(ngx_ts_dash_rep_t));\n                if (set->reps == NULL) {\n                    return NGX_ERROR;\n                }\n            }\n\n            rep = &set->reps[set->nreps++];\n\n            rep->es = es;\n\n            rep->nsegs = dash->conf->nsegs;\n            rep->segs = ngx_pcalloc(ts->pool,\n                                    rep->nsegs * sizeof(ngx_ts_dash_segment_t));\n            if (rep->segs == NULL) {\n                return NGX_ERROR;\n            }\n\n            len = dash->path.len + 1 + NGX_INT_T_LEN + 1 + NGX_INT64_LEN\n                  + sizeof(\".mp4\");\n\n            rep->path.data = ngx_pnalloc(ts->pool, len);\n            if (rep->path.data == NULL) {\n                return NGX_ERROR;\n            }\n\n            rep->path.len = ngx_sprintf(rep->path.data, \"%V/%ui.\",\n                                        &dash->path, (ngx_uint_t) es->pid)\n                            - rep->path.data;\n\n            /* init.mp4 */\n\n            len = dash->path.len + 1 + NGX_INT_T_LEN + sizeof(\".init.mp4\");\n\n            rep->init_path = ngx_pnalloc(ts->pool, len);\n            if (rep->init_path == NULL) {\n                return NGX_ERROR;\n            }\n\n            ngx_sprintf(rep->init_path, \"%V/%ui.init.mp4%Z\",\n                        &dash->path, (ngx_uint_t) es->pid);\n\n            /* init.mp4.tmp */\n\n            len += sizeof(\".tmp\") - 1;\n\n            rep->init_tmp_path = ngx_pnalloc(ts->pool, len);\n            if (rep->init_tmp_path == NULL) {\n                return NGX_ERROR;\n            }\n\n            ngx_sprintf(rep->init_tmp_path, \"%s.tmp%Z\", rep->init_path);\n        }\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_ts_dash_pes_handler(ngx_ts_dash_t *dash, ngx_ts_program_t *prog,\n    ngx_ts_es_t *es, ngx_chain_t *in)\n{\n    ngx_uint_t          i, j;\n    ngx_ts_dash_set_t  *set;\n    ngx_ts_dash_rep_t  *rep;\n\n    if (!es->ptsf) {\n        return NGX_OK;\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, dash->ts->log, 0, \"ts dash pes pid:%ud\",\n                   (unsigned) es->pid);\n\n    for (i = 0; i < dash->nsets; i++) {\n        set = &dash->sets[i];\n\n        for (j = 0; j < set->nreps; j++) {\n            rep =  &set->reps[j];\n\n            if (rep->es == es) {\n                goto found;\n            }\n        }\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, dash->ts->log, 0,\n                   \"ts dash skip es pid:%ud\", (unsigned) es->pid);\n\n    return NGX_OK;\n\nfound:\n\n    ngx_ts_dash_update_bandwidth(dash, rep, in, es->dts);\n\n    if (ngx_ts_dash_close_segment(dash, rep) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    if (ngx_ts_dash_open_segment(dash, rep) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    switch (es->type) {\n    case NGX_TS_VIDEO_AVC:\n        return ngx_ts_dash_copy_avc(dash, rep, in);\n\n    case NGX_TS_AUDIO_AAC:\n        return ngx_ts_dash_copy_aac(dash, rep, in);\n/*\n    case NGX_TS_AUDIO_MPEG1:\n    case NGX_TS_AUDIO_MPEG2:\n        return ngx_ts_dash_copy_mp3(dash, rep, in);\n*/\n\n    default:\n        return ngx_ts_dash_copy_default(dash, rep, in);\n    }\n}\n\n\nstatic void\nngx_ts_dash_update_bandwidth(ngx_ts_dash_t *dash, ngx_ts_dash_rep_t *rep,\n    ngx_chain_t *in, uint64_t dts)\n{\n    int64_t  d, analyze;\n\n    if (rep->bandwidth) {\n        return;\n    }\n\n    if (rep->bandwidth_bytes == 0) {\n        rep->bandwidth_dts = dts;\n    }\n\n    while (in) {\n        rep->bandwidth_bytes += in->buf->last - in->buf->pos;\n        in = in->next;\n    }\n\n    d = dts - rep->bandwidth_dts;\n    analyze = (int64_t) dash->conf->analyze * 90;\n\n    if (d >= analyze) {\n        rep->bandwidth = rep->bandwidth_bytes * 8 * 90000 / d;\n    }\n\n    ngx_log_debug2(NGX_LOG_DEBUG_CORE, dash->ts->log, 0,\n                   \"ts dash bandwidth:%ui, pid:%ud\",\n                   rep->bandwidth, (unsigned) rep->es->pid);\n}\n\n\nstatic ngx_int_t\nngx_ts_dash_copy_avc(ngx_ts_dash_t *dash, ngx_ts_dash_rep_t *rep,\n    ngx_chain_t *in)\n{\n    /*\n     * Source format:\n     * ISO/IEC 14496-10:2004(E)\n     * Annex B. Byte Stream Format, p. 216\n     *\n     * Destination format:\n     * ISO/IEC 14496-15:2004(E)\n     * 5.3.4.2 Sample format, p. 15\n     */\n\n    size_t        n, size, len;\n    u_char       *p, *s, *spec, c, type, buf[4];\n    ngx_uint_t    z;\n    ngx_chain_t  *cl;\n\n    if (in == NULL) {\n        return NGX_OK;\n    }\n\n    p = in->buf->pos;\n\n    size = 0;\n\n    while (in) {\n        z = 0;\n        len = 0;\n        type = 0;\n        cl = in;\n        s = p;\n\n        for ( ;; ) {\n            if (p == in->buf->last) {\n                in = in->next;\n                if (in == NULL) {\n                    break;\n                }\n\n                p = in->buf->pos;\n                continue;\n            }\n\n            c = *p++;\n\n            if (c == 0) {\n                z++;\n                continue;\n            }\n\n            if (c == 1 && z >= 2) {\n                break;\n            }\n\n            if (z >= 3) {\n                goto failed;\n            }\n\n            if (len == 0) {\n                type = z ? 0 : (c & 0x1f);\n            }\n\n            len += z + 1;\n            z = 0;\n        }\n\n        if (len == 0) {\n            continue;\n        }\n\n        if (type == 7 || type == 8) {\n            if ((type == 7 && rep->sps) || (type == 8 && rep->pps)) {\n                continue;\n            }\n\n            if (len > 0xffff) {\n                goto failed;\n            }\n\n            spec = ngx_pnalloc(dash->ts->pool, len);\n            if (spec == NULL) {\n                return NGX_ERROR;\n            }\n\n            if (type == 7) {\n                rep->sps = spec;\n                rep->sps_len = len;\n\n            } else if (type == 8) {\n                rep->pps = spec;\n                rep->pps_len = len;\n            }\n\n            while (len) {\n                if (s == cl->buf->last) {\n                    cl = cl->next;\n                    s = cl->buf->pos;\n                }\n\n                n = ngx_min((size_t) (cl->buf->last - s), len);\n\n                spec = ngx_cpymem(spec, s, n);\n\n                s += n;\n                len -= n;\n            }\n\n            if (rep->sps && rep->pps) {\n                rep->avc = ngx_ts_avc_decode_params(dash->ts,\n                                                    rep->sps, rep->sps_len,\n                                                    rep->pps, rep->pps_len);\n                if (rep->avc == NULL) {\n                    return NGX_ERROR;\n                }\n            }\n\n            continue;\n        }\n\n        buf[0] = len >> 24;\n        buf[1] = len >> 16;\n        buf[2] = len >> 8;\n        buf[3] = len;\n\n        if (ngx_ts_dash_append_data(dash, rep, buf, 4) != NGX_OK) {\n            return NGX_ERROR;\n        }\n\n        size += 4;\n\n        while (len) {\n            if (s == cl->buf->last) {\n                cl = cl->next;\n                s = cl->buf->pos;\n            }\n\n            n = ngx_min((size_t) (cl->buf->last - s), len);\n\n            if (ngx_ts_dash_append_data(dash, rep, s, n) != NGX_OK) {\n                return  NGX_ERROR;\n            }\n\n            size += n;\n            s += n;\n            len -= n;\n        }\n    }\n\n    ngx_log_debug2(NGX_LOG_DEBUG_CORE, dash->ts->log, 0,\n                   \"ts dash AVC frame:%uz, dts:%uL\", size, rep->es->dts);\n\n    return ngx_ts_dash_append_meta(dash, rep, size, rep->es->dts);\n\nfailed:\n\n    ngx_log_error(NGX_LOG_ERR, dash->ts->log, 0, \"invalid AVC frame\");\n\n    return NGX_ERROR;\n\n}\n\n\nstatic ngx_int_t\nngx_ts_dash_copy_aac(ngx_ts_dash_t *dash, ngx_ts_dash_rep_t *rep,\n    ngx_chain_t *in)\n{\n    /*\n     * XXX\n     * ISO/IEC CD 14496-3 Subpart 4: 1998\n     * 1.1.2 Audio_Data_Transport_Stream frame, ADTS, p. 10\n     */\n\n    size_t       len, n;\n    u_char      *p, adts[9];\n    uint64_t     dts;\n    ngx_uint_t   i;\n\n    if (in == NULL) {\n        return NGX_OK;\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, dash->ts->log, 0, \"ts dash AAC ts:%uL\",\n                   rep->es->dts);\n\n    i = 0;\n\n    p = in->buf->pos;\n\n    for ( ;; ) {\n        n = 0;\n\n        /* protection_absent */\n        adts[1] = 0;\n\n        while (n < ((adts[1] & 0x01) ? 7 : 9 )) {\n            if (p == in->buf->last) {\n                in = in->next;\n\n                if (in == NULL) {\n                    if (n == 0) {\n                        return NGX_OK;\n                    }\n\n                    goto failed;\n                }\n\n                p = in->buf->pos;\n                continue;\n            }\n\n            adts[n++] = *p++;\n        }\n\n        if (rep->aac == NULL) {\n            rep->aac = ngx_ts_aac_decode_params(dash->ts, adts, 7);\n            if (rep->aac == NULL) {\n                return NGX_ERROR;\n            }\n        }\n\n        len = adts[3] & 0x03;\n        len = (len << 8) + adts[4];\n        len = (len << 3) + (adts[5] >> 5);\n\n        if (len < n) {\n            goto failed;\n        }\n\n        len -= n;\n\n        dts = rep->es->dts + (uint64_t) 90000 * 1024 * i++ / rep->aac->freq;\n\n        ngx_log_debug3(NGX_LOG_DEBUG_CORE, dash->ts->log, 0,\n                       \"ts dash AAC adts:%uz, frame:%uz, ts:%uL\", n, len, dts);\n\n        if (ngx_ts_dash_append_meta(dash, rep, len, dts) != NGX_OK) {\n            return NGX_ERROR;\n        }\n\n        while (len) {\n            if (p == in->buf->last) {\n                in = in->next;\n                if (in == NULL) {\n                    goto failed;\n                }\n\n                p = in->buf->pos;\n            }\n\n            n = ngx_min((size_t) (in->buf->last - p), len);\n\n            if (ngx_ts_dash_append_data(dash, rep, p, n) != NGX_OK) {\n                return  NGX_ERROR;\n            }\n\n            p += n;\n            len -= n;\n        }\n    }\n\nfailed:\n\n    ngx_log_error(NGX_LOG_ERR, dash->ts->log, 0, \"invalid AAC ADTS frame\");\n\n    return NGX_ERROR;\n}\n\n\nstatic ngx_int_t\nngx_ts_dash_copy_default(ngx_ts_dash_t *dash, ngx_ts_dash_rep_t *rep,\n    ngx_chain_t *in)\n{\n    size_t  n, size;\n\n    for (size = 0; in; in = in->next) {\n        n = in->buf->last - in->buf->pos;\n\n        if (ngx_ts_dash_append_data(dash, rep, in->buf->pos, n) != NGX_OK) {\n            return  NGX_ERROR;\n        }\n\n        size += n;\n    }\n\n    return ngx_ts_dash_append_meta(dash, rep, size, rep->es->dts);\n}\n\n\nstatic ngx_int_t\nngx_ts_dash_close_segment(ngx_ts_dash_t *dash, ngx_ts_dash_rep_t *rep)\n{\n    size_t                  max_size;\n    ssize_t                 n;\n    int64_t                 d, min_seg, max_seg;\n    ngx_err_t               err;\n    ngx_str_t              *path;\n    ngx_file_t              file;\n    ngx_uint_t              try;\n    ngx_chain_t            *out;\n    ngx_ts_es_t            *es;\n    ngx_ts_stream_t        *ts;\n    ngx_ts_dash_segment_t  *seg;\n\n    if (rep->meta == NULL) {\n        return NGX_OK;\n    }\n\n    ts = dash->ts;\n\n    es = rep->es;\n\n    d = es->dts - rep->seg_dts;\n\n    min_seg = (int64_t) dash->conf->min_seg * 90;\n    max_seg = (int64_t) dash->conf->max_seg * 90;\n    max_size = dash->conf->max_size;\n\n    if (!dash->flush) {\n        if (d < min_seg\n            || (d < max_seg && es->video && !es->rand))\n        {\n            if (max_size == 0 || rep->nmeta + rep->ndata < max_size) {\n                return NGX_OK;\n            }\n\n            ngx_log_error(NGX_LOG_WARN, ts->log, 0,\n                          \"closing DASH segment \\\"%V%uL.mp4\\\" on size limit\",\n                          &rep->path, rep->seg_dts);\n        }\n    }\n\n    path = &rep->path;\n\n    ngx_memzero(&file, sizeof(ngx_file_t));\n\n    file.log = ts->log;\n    file.name.data = path->data;\n    file.name.len = ngx_sprintf(path->data + path->len, \"%uL.mp4%Z\",\n                                rep->seg_dts)\n                    - path->data - 1;\n\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                   \"ts dash close segment \\\"%s\\\"\", file.name.data);\n\n    for (try = 0; /* void */; try++) {\n        file.fd = ngx_open_file(path->data,\n                                NGX_FILE_WRONLY,\n                                NGX_FILE_TRUNCATE,\n                                NGX_FILE_DEFAULT_ACCESS);\n\n        if (file.fd != NGX_INVALID_FILE) {\n            break;\n        }\n\n        err = ngx_errno;\n\n        if (try || (err != NGX_ENOENT && err != NGX_ENOTDIR)) {\n            ngx_log_error(NGX_LOG_EMERG, ts->log, err,\n                          ngx_open_file_n \" \\\"%s\\\" failed\", path->data);\n            return NGX_ERROR;\n        }\n\n        /* XXX dir access mode */\n        if (ngx_create_dir(dash->path.data, 0700) == NGX_FILE_ERROR) {\n            err = ngx_errno;\n\n            if (err != NGX_EEXIST) {\n                ngx_log_error(NGX_LOG_CRIT, ts->log, err,\n                              ngx_create_dir_n \" \\\"%s\\\" failed\",\n                              dash->path.data);\n                return NGX_ERROR;\n            }\n        }\n    }\n\n    out = ngx_ts_dash_end_segment(dash, rep);\n\n    n = ngx_write_chain_to_file(&file, out, 0, ts->pool);\n\n    if (ngx_close_file(file.fd) == NGX_FILE_ERROR) {\n        ngx_log_error(NGX_LOG_ALERT, ts->log, ngx_errno,\n                      ngx_close_file_n \" \\\"%s\\\" failed\", path->data);\n    }\n\n    ngx_ts_dash_free_segment(dash, rep, out);\n\n    if (n == NGX_ERROR) {\n        return NGX_ERROR;\n    }\n\n    seg = &rep->segs[rep->seg++ % rep->nsegs];\n    seg->start = rep->seg_dts;\n    seg->duration = d;\n\n    if (ngx_ts_dash_update_playlist(dash) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_ts_dash_update_playlist(ngx_ts_dash_t *dash)\n{\n    u_char                 *p, *last, *data;\n    time_t                  now;\n    size_t                  len;\n    ngx_uint_t              i, j, k, pid, bandwidth, min_update, min_buftime,\n                            buf_depth;\n    ngx_ts_stream_t        *ts;\n    ngx_ts_dash_set_t      *set;\n    ngx_ts_dash_rep_t      *rep;\n    ngx_ts_dash_segment_t  *seg;\n    u_char                  codec[NGX_TS_DASH_CODEC_LEN];\n    u_char                  avail_start_time[NGX_TS_DASH_DATETIME_LEN];\n    u_char                  pub_time[NGX_TS_DASH_DATETIME_LEN];\n\n    if (ngx_ts_dash_update_init_segments(dash) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    ts = dash->ts;\n\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                   \"ts dash update playlist \\\"%s\\\"\", dash->mpd_path);\n\n    now = ngx_time();\n\n    if (dash->availability_start == 0) {\n        dash->availability_start = now;\n    }\n\n    ngx_ts_dash_format_datetime(avail_start_time, dash->availability_start);\n    ngx_ts_dash_format_datetime(pub_time, now);\n\n    /*\n     *                 timeShiftBufferDepth\n     *       ----------------------------------------\n     *      |                                        |\n     * -----///////----------------*-----------------> now\n     *            |                |                 |\n     *             ---------------- -----------------\n     *                 liveDelay     lastSegDuration\n     *           = 2 * minBufferTime\n     *\n     */\n\n    min_update = dash->conf->min_seg / 1000;\n    min_buftime = dash->conf->min_seg / 1000;\n    buf_depth = 2 * min_buftime + dash->conf->max_seg / 1000 + 1;\n\n    for ( ;; ) {\n        ngx_log_debug1(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                       \"ts dash playlist len:%uz\", dash->playlist_len);\n\n        data = ngx_alloc(dash->playlist_len, ts->log);\n        if (data == NULL) {\n            return NGX_ERROR;\n        }\n\n        p = data;\n        last = data + dash->playlist_len;\n\n        p = ngx_slprintf(p, last,\n                \"<?xml version=\\\"1.0\\\"?>\\n\"\n                \"<MPD\\n\"\n                \"    xmlns:xsi=\\\"http://www.w3.org/2001/XMLSchema-instance\\\"\\n\"\n                \"    xmlns=\\\"urn:mpeg:DASH:schema:MPD:2011\\\"\\n\"\n                \"    xsi:schemaLocation=\\\"urn:mpeg:DASH:schema:MPD:2011 \"\n                                                             \"DASH-MPD.xsd\\\"\\n\"\n                \"    type=\\\"dynamic\\\"\\n\"\n                \"    availabilityStartTime=\\\"%s\\\"\\n\"\n                \"    publishTime=\\\"%s\\\"\\n\"\n                \"    minimumUpdatePeriod=\\\"PT%uiS\\\"\\n\"\n                \"    minBufferTime=\\\"PT%uiS\\\"\\n\"\n                \"    timeShiftBufferDepth=\\\"PT%uiS\\\"\\n\"\n                \"    profiles=\\\"urn:hbbtv:dash:profile:isoff-live:2012,\"\n                               \"urn:mpeg:dash:profile:isoff-live:2011\\\">\\n\"\n                \"  <Period\\n\"\n                \"      id=\\\"0\\\"\\n\"\n                \"      start=\\\"PT0S\\\">\\n\",\n                avail_start_time, pub_time, min_update, min_buftime, buf_depth);\n\n        for (i = 0; i < dash->nsets; i++) {\n            set = &dash->sets[i];\n\n            p = ngx_slprintf(p, last,\n                    \"    <AdaptationSet\\n\"\n                    \"        segmentAlignment=\\\"true\\\"\\n\"\n                    \"        mimeType=\\\"%s/mp4\\\">\\n\",\n                    set->video ? \"video\" : \"audio\");\n\n            for (j = 0; j < set->nreps; j++) {\n                rep = &set->reps[j];\n\n                if (rep->bandwidth == 0) {\n                    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                                   \"ts dash bandwidth not available\");\n                    ngx_free(data);\n                    return NGX_OK;\n                }\n\n                pid = rep->es->pid;\n                bandwidth = rep->bandwidth;\n\n                ngx_ts_dash_format_codec(codec, rep);\n\n                p = ngx_slprintf(p, last,\n                        \"      <Representation\\n\"\n                        \"          id=\\\"%ui\\\"\\n\"\n                        \"          codecs=\\\"%s\\\"\\n\"\n                        \"          bandwidth=\\\"%ui\\\">\\n\"\n                        \"        <SegmentTemplate\\n\"\n                        \"            timescale=\\\"90000\\\"\\n\"\n                        \"            media=\\\"$RepresentationID$.$Time$.mp4\\\"\\n\"\n                        \"            initialization=\"\n                                           \"\\\"$RepresentationID$.init.mp4\\\">\\n\"\n                        \"          <SegmentTimeline>\\n\",\n                        pid, codec, bandwidth);\n\n                for (k = 0; k < rep->nsegs; k++) {\n                    seg = &rep->segs[(rep->seg + k) % rep->nsegs];\n\n                    if (seg->duration) {\n                        p = ngx_slprintf(p, last,\n                                \"            <S t=\\\"%uL\\\" d=\\\"%uL\\\"/>\\n\",\n                                seg->start, seg->duration);\n                    }\n                }\n\n                p = ngx_slprintf(p, last,\n                        \"          </SegmentTimeline>\\n\"\n                        \"        </SegmentTemplate>\\n\"\n                        \"      </Representation>\\n\");\n            }\n\n            p = ngx_slprintf(p, last,\n                    \"    </AdaptationSet>\\n\");\n        }\n\n        p = ngx_slprintf(p, last,\n                \"  </Period>\\n\"\n                \"</MPD>\\n\");\n\n        if (p != last) {\n            break;\n        }\n\n        ngx_free(data);\n\n        dash->playlist_len *= 2;\n    }\n\n    len = p - data;\n\n    if (ngx_ts_dash_write_file(dash->mpd_tmp_path, dash->mpd_path, data, len,\n                               ts->log)\n        != NGX_OK)\n    {\n        ngx_free(data);\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_ts_dash_write_file(u_char *path1, u_char *path2, u_char *data, size_t len,\n    ngx_log_t *log)\n{\n    ssize_t    n;\n    ngx_fd_t   fd;\n    ngx_err_t  err;\n\n    fd = ngx_open_file(path1,\n                       NGX_FILE_WRONLY,\n                       NGX_FILE_TRUNCATE,\n                       NGX_FILE_DEFAULT_ACCESS);\n\n    if (fd == NGX_INVALID_FILE) {\n        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,\n                      ngx_open_file_n \" \\\"%s\\\" failed\", path1);\n        return NGX_ERROR;\n    }\n\n    n = ngx_write_fd(fd, data, len);\n\n    err = errno;\n\n    if (ngx_close_file(fd) == NGX_FILE_ERROR) {\n        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,\n                      ngx_close_file_n \" \\\"%s\\\" failed\", path1);\n        return NGX_ERROR;\n    }\n\n    if (n < 0) {\n        ngx_log_error(NGX_LOG_ALERT, log, err,\n                      ngx_write_fd_n \" to \\\"%s\\\" failed\", path1);\n        return NGX_ERROR;\n    }\n\n    if ((size_t) n != len) {\n        ngx_log_error(NGX_LOG_ALERT, log, 0,\n                      \"incomplete write to \\\"%s\\\"\", path1);\n        return NGX_ERROR;\n    }\n\n    if (path2) {\n        if (ngx_rename_file(path1, path2) == NGX_FILE_ERROR) {\n            ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,\n                          ngx_rename_file_n \" \\\"%s\\\" to \\\"%s\\\" failed\",\n                          path1, path2);\n            return NGX_ERROR;\n        }\n    }\n\n    return NGX_OK;\n}\n\n\nstatic void\nngx_ts_dash_format_datetime(u_char *p, time_t t)\n{\n    struct tm  tm;\n\n    ngx_libc_gmtime(t, &tm);\n\n    if (strftime((char *) p, NGX_TS_DASH_DATETIME_LEN, \"%Y-%m-%dT%H:%M:%SZ\",\n                 &tm)\n        == 0)\n    {\n        *p = 0;\n    }\n}\n\n\nstatic void\nngx_ts_dash_format_codec(u_char *p, ngx_ts_dash_rep_t *rep)\n{\n    ngx_uint_t  oti;\n\n    if (rep->avc) {\n        ngx_sprintf(p, \"avc1.%02uXi%02uXi%02uXi%Z\",\n                    rep->avc->profile_idc,\n                    rep->avc->constraints,\n                    rep->avc->level_idc);\n        return;\n    }\n\n    if (rep->aac) {\n        ngx_sprintf(p, \"mp4a.40.%ui%Z\", rep->aac->profile);\n        return;\n    }\n\n    oti = ngx_ts_dash_get_oti(rep->es->type);\n\n    ngx_sprintf(p, \"mp4%c.%02uXi%Z\", rep->es->video ? 'v' : 'a', oti);\n}\n\n\nstatic ngx_int_t\nngx_ts_dash_update_init_segments(ngx_ts_dash_t *dash)\n{\n    u_char             *data;\n    ngx_buf_t           out;\n    ngx_uint_t          i, j;\n    ngx_ts_stream_t    *ts;\n    ngx_ts_dash_set_t  *set;\n    ngx_ts_dash_rep_t  *rep;\n\n    ts = dash->ts;\n\n    for (i = 0; i < dash->nsets; i++) {\n        set = &dash->sets[i];\n\n        for (j = 0; j < set->nreps; j++) {\n            rep = &set->reps[j];\n\n            if (rep->bandwidth == 0) {\n                continue;\n            }\n\n            for ( ;; ) {\n                ngx_log_debug2(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                               \"ts dash write init segment \\\"%s\\\", buf:%uz\",\n                               rep->init_path, dash->init_seg_len);\n\n                ngx_memzero(&out, sizeof(ngx_buf_t));\n\n                data = ngx_alloc(dash->init_seg_len, ts->log);\n                if (data == NULL) {\n                    return NGX_ERROR;\n                }\n\n                out.start = data;\n                out.pos = data;\n                out.last = data;\n                out.end = data + dash->init_seg_len;\n\n                ngx_ts_dash_write_init_segment(&out, rep);\n\n                if (out.last < out.end) {\n                    break;\n                }\n\n                ngx_free(data);\n\n                dash->init_seg_len *= 2;\n            }\n\n            if (ngx_ts_dash_write_file(rep->init_tmp_path, rep->init_path,\n                                       out.pos, out.last - out.pos, ts->log)\n                != NGX_OK)\n            {\n                ngx_free(data);\n                return NGX_ERROR;\n            }\n\n            ngx_free(data);\n        }\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_ts_dash_open_segment(ngx_ts_dash_t *dash, ngx_ts_dash_rep_t *rep)\n{\n    ngx_ts_es_t  *es;\n\n    if (rep->meta) {\n        return NGX_OK;\n    }\n\n    ngx_log_debug2(NGX_LOG_DEBUG_CORE, dash->ts->log, 0,\n                   \"ts dash open segment \\\"%V%uL.mp4\\\"\",\n                   &rep->path, rep->seg_dts);\n\n    es = rep->es;\n\n    rep->seg_pts = es->pts;\n    rep->seg_dts = es->dts;\n\n    return ngx_ts_dash_start_segment(dash, rep);\n}\n\n\nstatic ngx_msec_t\nngx_ts_dash_file_manager(void *data)\n{\n    ngx_ts_dash_conf_t *dash = data;\n\n    ngx_tree_ctx_t  tree;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,\n                  \"ts dash file manager\");\n\n    tree.init_handler = NULL;\n    tree.file_handler = ngx_ts_dash_manage_file;\n    tree.pre_tree_handler = ngx_ts_dash_manage_directory;\n    tree.post_tree_handler = ngx_ts_dash_delete_directory;\n    tree.spec_handler = ngx_ts_dash_delete_file;\n    tree.data = dash;\n    tree.alloc = 0;\n    tree.log = ngx_cycle->log;\n\n    (void) ngx_walk_tree(&tree, &dash->path->name);\n\n    return dash->max_seg * dash->nsegs;\n}\n\n\nstatic ngx_int_t\nngx_ts_dash_manage_file(ngx_tree_ctx_t *ctx, ngx_str_t *path)\n{\n    ngx_ts_dash_conf_t *dash = ctx->data;\n\n    time_t  age, max_age;\n\n    age = ngx_time() - ctx->mtime;\n\n    max_age = 0;\n\n    if (path->len >= 4\n        && ngx_memcmp(path->data + path->len - 4, \".mpd\", 4) == 0)\n    {\n        max_age = dash->max_seg * dash->nsegs / 1000;\n    }\n\n    if (path->len >= 4\n        && ngx_memcmp(path->data + path->len - 4, \".mp4\", 4) == 0)\n    {\n        max_age = dash->max_seg * dash->nsegs / 500;\n    }\n\n    if (path->len >= 4\n        && ngx_memcmp(path->data + path->len - 4, \".tmp\", 4) == 0)\n    {\n        max_age = 10;\n    }\n\n    ngx_log_debug3(NGX_LOG_DEBUG_CORE, ctx->log, 0,\n                   \"ts dash file \\\"%s\\\", age:%T, max_age:%T\",\n                   path->data, age, max_age);\n\n    if (age < max_age) {\n        return NGX_OK;\n    }\n\n    return ngx_ts_dash_delete_file(ctx, path);\n}\n\n\nstatic ngx_int_t\nngx_ts_dash_manage_directory(ngx_tree_ctx_t *ctx, ngx_str_t *path)\n{\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_ts_dash_delete_directory(ngx_tree_ctx_t *ctx, ngx_str_t *path)\n{\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,\n                   \"ts dash delete dir: \\\"%s\\\"\", path->data);\n\n    /* non-empty directory will not be removed anyway */\n\n    /* TODO count files instead */\n\n    (void) ngx_delete_dir(path->data);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_ts_dash_delete_file(ngx_tree_ctx_t *ctx, ngx_str_t *path)\n{\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,\n                   \"ts dash file delete: \\\"%s\\\"\", path->data);\n\n    if (ngx_delete_file(path->data) == NGX_FILE_ERROR) {\n        ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,\n                      ngx_delete_file_n \" \\\"%s\\\" failed\", path->data);\n    }\n\n    return NGX_OK;\n}\n\n\nchar *\nngx_ts_dash_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    char  *p = conf;\n\n    ssize_t              max_size;\n    ngx_str_t           *value, s, ss, path;\n    ngx_int_t            v;\n    ngx_uint_t           i, nsegs, clean;\n    ngx_msec_t           min_seg, max_seg, analyze;\n    ngx_ts_dash_conf_t  *dash, **field;\n\n    field = (ngx_ts_dash_conf_t **) (p + cmd->offset);\n\n    if (*field != NGX_CONF_UNSET_PTR) {\n        return \"is duplicate\";\n    }\n\n    value = cf->args->elts;\n\n    ngx_str_null(&path);\n\n    min_seg = 5000;\n    max_seg = 10000;\n    analyze = 0;\n    max_size = 16 * 1024 * 1024;\n    nsegs = 6;\n    clean = 1;\n\n    for (i = 1; i < cf->args->nelts; i++) {\n\n        if (ngx_strncmp(value[i].data, \"path=\", 5) == 0) {\n\n            path.len = value[i].len - 5;\n            path.data = value[i].data + 5;\n\n            if (path.data[path.len - 1] == '/') {\n                path.len--;\n            }\n\n            if (ngx_conf_full_name(cf->cycle, &path, 0) != NGX_OK) {\n                return NGX_CONF_ERROR;\n            }\n\n            continue;\n        }\n\n        if (ngx_strncmp(value[i].data, \"segment=\", 8) == 0) {\n\n            s.len = value[i].len - 8;\n            s.data = value[i].data + 8;\n\n            ss.data = (u_char *) ngx_strchr(s.data, ':');\n\n            if (ss.data) {\n                ss.len = s.data + s.len - ss.data - 1;\n                s.len = ss.data - s.data;\n                ss.data++;\n            }\n\n            min_seg = ngx_parse_time(&s, 0);\n            if (min_seg == (ngx_msec_t) NGX_ERROR) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                   \"invalid segment duration value \\\"%V\\\"\",\n                                   &value[i]);\n                return NGX_CONF_ERROR;\n            }\n\n            if (ss.data) {\n                max_seg = ngx_parse_time(&ss, 0);\n                if (max_seg == (ngx_msec_t) NGX_ERROR) {\n                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                       \"invalid segment duration value \\\"%V\\\"\",\n                                       &value[i]);\n                    return NGX_CONF_ERROR;\n                }\n\n            } else {\n                max_seg = min_seg * 2;\n            }\n\n            continue;\n        }\n\n        if (ngx_strncmp(value[i].data, \"analyze=\", 8) == 0) {\n\n            s.len = value[i].len - 8;\n            s.data = value[i].data + 8;\n\n            analyze = ngx_parse_time(&s, 0);\n            if (analyze == (ngx_msec_t) NGX_ERROR) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                   \"invalid analyze duration value \\\"%V\\\"\",\n                                   &value[i]);\n                return NGX_CONF_ERROR;\n            }\n\n            continue;\n        }\n\n        if (ngx_strncmp(value[i].data, \"max_size=\", 9) == 0) {\n\n            s.len = value[i].len - 9;\n            s.data = value[i].data + 9;\n\n            max_size = ngx_parse_size(&s);\n            if (max_size == NGX_ERROR) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                   \"invalid max segment size value \\\"%V\\\"\",\n                                   &value[i]);\n                return NGX_CONF_ERROR;\n            }\n\n            continue;\n        }\n\n        if (ngx_strncmp(value[i].data, \"segments=\", 9) == 0) {\n\n            v = ngx_atoi(value[i].data + 9, value[i].len - 9);\n            if (v == NGX_ERROR) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                   \"invalid segments number value \\\"%V\\\"\",\n                                   &value[i]);\n                return NGX_CONF_ERROR;\n            }\n\n            nsegs = v;\n\n            continue;\n        }\n\n        if (ngx_strcmp(value[i].data, \"noclean\") == 0) {\n            clean = 0;\n            continue;\n        }\n\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                           \"invalid parameter \\\"%V\\\"\", &value[i]);\n        return NGX_CONF_ERROR;\n    }\n\n    if (path.len == 0) {\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                           \"\\\"%V\\\" must have \\\"path\\\" parameter\", &cmd->name);\n        return NGX_CONF_ERROR;\n    }\n\n    dash = ngx_pcalloc(cf->pool, sizeof(ngx_ts_dash_conf_t));\n    if (dash == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    dash->path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t));\n    if (dash->path == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    dash->path->name = path;\n\n    dash->min_seg = min_seg;\n    dash->max_seg = max_seg;\n    dash->analyze = analyze ? analyze : min_seg;\n    dash->max_size = max_size;\n    dash->nsegs = nsegs;\n\n    if (clean) {\n        dash->path->manager = ngx_ts_dash_file_manager;\n    }\n\n    dash->path->data = dash;\n    dash->path->conf_file = cf->conf_file->file.name.data;\n    dash->path->line = cf->conf_file->line;\n\n    if (ngx_add_path(cf, &dash->path) != NGX_OK) {\n        return NGX_CONF_ERROR;\n    }\n\n    *field = dash;\n\n    return NGX_CONF_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-ts-module/src/ngx_ts_dash.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n#include \"ngx_ts_stream.h\"\n#include \"ngx_ts_avc.h\"\n#include \"ngx_ts_aac.h\"\n\n\n#ifndef _NGX_TS_DASH_H_INCLUDED_\n#define _NGX_TS_DASH_H_INCLUDED_\n\n\ntypedef struct {\n    ngx_path_t             *path;\n    ngx_msec_t              min_seg;\n    ngx_msec_t              max_seg;\n    ngx_msec_t              analyze;\n    size_t                  max_size;\n    ngx_uint_t              nsegs;\n} ngx_ts_dash_conf_t;\n\n\ntypedef struct {\n    uint64_t                start;\n    uint64_t                duration;\n} ngx_ts_dash_segment_t;\n\n\ntypedef struct {\n    u_char                 *dts;  /* 64-bit */\n    u_char                 *pts;  /* 64-bit */\n    u_char                 *seq;\n    u_char                 *duration;\n    u_char                 *sample_duration;\n    u_char                 *nsamples;\n    u_char                 *traf;\n    u_char                 *trun;\n    u_char                 *moof;\n    u_char                 *moof_mdat;\n    u_char                 *moof_data;\n    u_char                 *mdat;\n} ngx_ts_dash_subs_t;\n\n\ntypedef struct {\n    ngx_ts_es_t            *es;\n\n    ngx_ts_dash_segment_t  *segs;\n    ngx_uint_t              nsegs;\n    ngx_uint_t              seg;\n    uint64_t                seg_pts;\n    uint64_t                seg_dts;\n    uint64_t                dts;\n\n    ngx_uint_t              bandwidth;\n    ngx_uint_t              bandwidth_bytes;\n    uint64_t                bandwidth_dts;\n\n    u_char                 *sps;\n    u_char                 *pps;\n    size_t                  sps_len;\n    size_t                  pps_len;\n\n    ngx_ts_avc_params_t    *avc;\n    ngx_ts_aac_params_t    *aac;\n\n    ngx_str_t               path;\n    u_char                 *init_path;\n    u_char                 *init_tmp_path;\n\n    ngx_chain_t            *meta;\n    ngx_chain_t            *last_meta;\n    ngx_chain_t            *data;\n    ngx_chain_t            *last_data;\n\n    ngx_uint_t              nsamples;\n    ngx_uint_t              nmeta;\n    ngx_uint_t              ndata;\n\n    ngx_ts_dash_subs_t      subs;\n} ngx_ts_dash_rep_t;\n\n\ntypedef struct {\n    ngx_ts_dash_rep_t      *reps;\n    ngx_uint_t              nreps;\n    ngx_uint_t              video;  /* unsigned  video:1; */\n} ngx_ts_dash_set_t;\n\n\ntypedef struct {\n    ngx_ts_stream_t        *ts;\n    ngx_ts_dash_conf_t     *conf;\n\n    u_char                 *mpd_path;\n    u_char                 *mpd_tmp_path;\n    ngx_str_t               path;\n    size_t                  playlist_len;\n    size_t                  init_seg_len;\n    time_t                  availability_start;\n\n    ngx_chain_t            *free;\n    ngx_ts_dash_set_t      *sets;\n    ngx_uint_t              nsets;\n\n    ngx_uint_t              flush;  /* unsigned  flush:1; */\n} ngx_ts_dash_t;\n\n\nngx_ts_dash_t *ngx_ts_dash_create(ngx_ts_dash_conf_t *conf, ngx_ts_stream_t *ts,\n    ngx_str_t *name);\nchar *ngx_ts_dash_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\n\nvoid ngx_ts_dash_write_init_segment(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\n\nngx_int_t ngx_ts_dash_start_segment(ngx_ts_dash_t *dash,\n    ngx_ts_dash_rep_t *rep);\nngx_chain_t *ngx_ts_dash_end_segment(ngx_ts_dash_t *dash,\n    ngx_ts_dash_rep_t *rep);\nvoid ngx_ts_dash_free_segment(ngx_ts_dash_t *dash, ngx_ts_dash_rep_t *rep,\n    ngx_chain_t *out);\nngx_int_t ngx_ts_dash_append_meta(ngx_ts_dash_t *dash, ngx_ts_dash_rep_t *rep,\n    size_t size, uint64_t dts);\nngx_int_t ngx_ts_dash_append_data(ngx_ts_dash_t *dash, ngx_ts_dash_rep_t *rep,\n    u_char *data, size_t len);\n\n\n#endif /* _NGX_TS_DASH_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-ts-module/src/ngx_ts_dash_mp4.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n#include \"ngx_ts_dash.h\"\n\n\n#define NGX_TS_DASH_BUFFER_SIZE     1024\n\n#define NGX_TS_DASH_DEFAULT_WIDTH   400\n#define NGX_TS_DASH_DEFAULT_HEIGHT  400\n\n\n/*\n * ISO base media file format\n * ISO/IEC 14496-12:2008(E)\n */\n\n\nstatic void ngx_ts_dash_box_styp(ngx_buf_t *b);\nstatic void ngx_ts_dash_box_sidx(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_moof(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_mfhd(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_traf(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_tfhd(ngx_buf_t *b);\nstatic void ngx_ts_dash_box_tfdt(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_trun(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_mdat(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_ftyp(ngx_buf_t *b);\nstatic void ngx_ts_dash_box_moov(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_mvhd(ngx_buf_t *b);\nstatic void ngx_ts_dash_box_mvex(ngx_buf_t *b);\nstatic void ngx_ts_dash_box_trex(ngx_buf_t *b);\nstatic void ngx_ts_dash_box_trak(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_tkhd(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_mdia(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_mdhd(ngx_buf_t *b);\nstatic void ngx_ts_dash_box_hdlr(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_minf(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_vmhd(ngx_buf_t *b);\nstatic void ngx_ts_dash_box_smhd(ngx_buf_t *b);\nstatic void ngx_ts_dash_box_dinf(ngx_buf_t *b);\nstatic void ngx_ts_dash_box_dref(ngx_buf_t *b);\nstatic void ngx_ts_dash_box_url(ngx_buf_t *b);\nstatic void ngx_ts_dash_box_stbl(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_stts(ngx_buf_t *b);\nstatic void ngx_ts_dash_box_stsc(ngx_buf_t *b);\nstatic void ngx_ts_dash_box_stsz(ngx_buf_t *b);\nstatic void ngx_ts_dash_box_stco(ngx_buf_t *b);\nstatic void ngx_ts_dash_box_stsd(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_video(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_audio(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_avcc(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_box_esds(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\n\nstatic u_char *ngx_ts_dash_box(ngx_buf_t *b, const char type[4]);\nstatic u_char *ngx_ts_dash_box_full(ngx_buf_t *b, const char type[4],\n    u_char version, uint32_t flags);\nstatic void ngx_ts_dash_box_update(ngx_buf_t *b, u_char *p);\n\nstatic void ngx_ts_dash_desc_es(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_desc_dec_conf(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_desc_dec_spec(ngx_buf_t *b, ngx_ts_dash_rep_t *rep);\nstatic void ngx_ts_dash_desc_sl_conf(ngx_buf_t *b);\n\nstatic u_char *ngx_ts_dash_desc(ngx_buf_t *b, u_char tag);\nstatic void ngx_ts_dash_desc_update(ngx_buf_t *b, u_char *p);\n\nstatic void ngx_ts_dash_cpymem(ngx_buf_t *b, const void *data, size_t size);\nstatic void ngx_ts_dash_write64(ngx_buf_t *b, uint64_t v);\nstatic void ngx_ts_dash_write32(ngx_buf_t *b, uint32_t v);\nstatic void ngx_ts_dash_write24(ngx_buf_t *b, uint32_t v);\nstatic void ngx_ts_dash_write16(ngx_buf_t *b, uint16_t v);\nstatic void ngx_ts_dash_write8(ngx_buf_t *b, u_char v);\n\nstatic void ngx_ts_dash_set_sub(ngx_buf_t *b, u_char **p);\nstatic uint32_t ngx_ts_dash_get32(u_char *p);\nstatic void ngx_ts_dash_put32(u_char *p, uint32_t v);\nstatic void ngx_ts_dash_put64(u_char *p, uint64_t v);\n\nstatic ngx_chain_t *ngx_ts_dash_get_buffer(ngx_ts_dash_t *dash);\n\n\nvoid\nngx_ts_dash_write_init_segment(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    ngx_ts_dash_box_ftyp(b);\n    ngx_ts_dash_box_moov(b, rep);\n}\n\n\nstatic void\nngx_ts_dash_box_styp(ngx_buf_t *b)\n{\n    /* TODO\n     * ETSI TS 126 244 V12.3.0 (2014-10)\n     * 13.2 Segment types, p. 52\n     */\n\n    u_char  *p;\n\n    p = ngx_ts_dash_box(b, \"styp\");\n\n    /* major_brand */\n    ngx_ts_dash_cpymem(b, \"iso6\", 4); /* XXX 3gh9 */\n\n    /* TODO version */\n    /* minor_version */\n    ngx_ts_dash_write32(b, 1);\n\n    /* TODO brands */\n    /* compatible_brands */\n    ngx_ts_dash_cpymem(b, \"isom\", 4);\n    ngx_ts_dash_cpymem(b, \"iso6\", 4);\n    ngx_ts_dash_cpymem(b, \"dash\", 4);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_sidx(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    /* TODO\n     * ETSI TS 126 244 V12.3.0 (2014-10)\n     * 13.4 Segment Index Box, p. 53\n     */\n\n    u_char  *p;\n\n    p = ngx_ts_dash_box_full(b, \"sidx\", 1, 0);\n\n    /* reference_ID */\n    ngx_ts_dash_write32(b, 1);\n\n    /* timescale */\n    ngx_ts_dash_write32(b, 90000);\n\n    /* earliest_presentation_time */\n    ngx_ts_dash_set_sub(b, &rep->subs.pts);\n    ngx_ts_dash_write64(b, 0);\n\n    /* first_offset */\n    ngx_ts_dash_write64(b, 0);\n\n    /* reference_count */\n    ngx_ts_dash_write32(b, 1);\n\n    /* referenced_size */\n    ngx_ts_dash_set_sub(b, &rep->subs.moof_mdat);\n    ngx_ts_dash_write32(b, 0);\n\n    /* subsegment_duration */\n    ngx_ts_dash_set_sub(b, &rep->subs.duration);\n    ngx_ts_dash_write32(b, 0);\n\n    /* starts_with_SAP, SAP_type, SAP_delta_time */\n    ngx_ts_dash_write32(b, 0x80000000);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_moof(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char  *p;\n\n    ngx_ts_dash_set_sub(b, &rep->subs.moof);\n\n    p = ngx_ts_dash_box(b, \"moof\");\n\n    ngx_ts_dash_box_mfhd(b, rep);\n    ngx_ts_dash_box_traf(b, rep);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_mfhd(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box_full(b, \"mfhd\", 0, 0);\n\n    /* sequence_number */\n    ngx_ts_dash_set_sub(b, &rep->subs.seq);\n    ngx_ts_dash_write32(b, 0);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_traf(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char  *p;\n\n    ngx_ts_dash_set_sub(b, &rep->subs.traf);\n\n    p = ngx_ts_dash_box(b, \"traf\");\n\n    ngx_ts_dash_box_tfhd(b);\n    ngx_ts_dash_box_tfdt(b, rep);\n    ngx_ts_dash_box_trun(b, rep);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_tfhd(ngx_buf_t *b)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box_full(b, \"tfhd\", 0, 0);\n\n    /* track_ID */\n    ngx_ts_dash_write32(b, 1);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_tfdt(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    /* \n     * ETSI TS 126 244 V12.3.0 (2014-10)\n     * 13.5 Track Fragment Decode Time Box, p. 55\n     */\n\n    u_char  *p;\n\n    p = ngx_ts_dash_box_full(b, \"tfdt\", 1, 0);\n\n    /* baseMediaDecodeTime */\n    ngx_ts_dash_set_sub(b, &rep->subs.dts);\n    ngx_ts_dash_write64(b, 0);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_trun(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char    *p;\n    uint32_t   flags;\n\n    flags = 0x000001          /* data-offset-present */\n            | 0x000100        /* sample-duration-present */\n            | 0x000200;       /* sample-size-present */\n\n    if (rep->es->video) {\n        flags |= 0x000400     /* sample-flags-present */\n                 | 0x000800;  /* sample-composition-time-offset-present */\n    }\n\n    ngx_ts_dash_set_sub(b, &rep->subs.trun);\n\n    p = ngx_ts_dash_box_full(b, \"trun\", 0, flags);\n\n    /* sample_count */\n    ngx_ts_dash_set_sub(b, &rep->subs.nsamples);\n    ngx_ts_dash_write32(b, 0);\n\n    /* data_offset */\n    ngx_ts_dash_set_sub(b, &rep->subs.moof_data);\n    ngx_ts_dash_write32(b, 0);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_mdat(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char  *p;\n\n    ngx_ts_dash_set_sub(b, &rep->subs.mdat);\n\n    p = ngx_ts_dash_box(b, \"mdat\");\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_ftyp(ngx_buf_t *b)\n{\n    /*\n     * ISO/IEC 14496-12:2008(E)\n     * 4.3 File Type Box, p. 4\n     */\n\n    u_char  *p;\n\n    p = ngx_ts_dash_box(b, \"ftyp\");\n\n    /* major_brand */\n    ngx_ts_dash_cpymem(b, \"iso6\", 4);\n\n    /* minor_version */\n    ngx_ts_dash_write32(b, 1);\n\n    /* TODO brands */\n    /* compatible_brands */\n    ngx_ts_dash_cpymem(b, \"isom\", 4);\n    ngx_ts_dash_cpymem(b, \"iso6\", 4);\n    ngx_ts_dash_cpymem(b, \"dash\", 4);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_moov(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box(b, \"moov\");\n\n    ngx_ts_dash_box_mvhd(b);\n    ngx_ts_dash_box_mvex(b);\n    ngx_ts_dash_box_trak(b, rep);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_mvhd(ngx_buf_t *b)\n{\n    u_char  *p;\n    time_t   now;\n\n    p = ngx_ts_dash_box_full(b, \"mvhd\", 0, 0);\n\n    now = ngx_time();\n\n    /* creation_time */\n    ngx_ts_dash_write32(b, now);\n\n    /* modification_time */\n    ngx_ts_dash_write32(b, now);\n\n    /* timescale */\n    ngx_ts_dash_write32(b, 90000);\n\n    /* duration */\n    ngx_ts_dash_write32(b, 0);\n\n    /* rate */\n    ngx_ts_dash_write32(b, 0x00010000);\n\n    /* volume */\n    ngx_ts_dash_write32(b, 0x01000000);\n\n    /* reserved */\n    ngx_ts_dash_write64(b, 0);\n\n    /* matrix */\n    ngx_ts_dash_write32(b, 0x00010000);\n    ngx_ts_dash_write32(b, 0x00000000);\n    ngx_ts_dash_write32(b, 0x00000000);\n    ngx_ts_dash_write32(b, 0x00000000);\n    ngx_ts_dash_write32(b, 0x00010000);\n    ngx_ts_dash_write32(b, 0x00000000);\n    ngx_ts_dash_write32(b, 0x00000000);\n    ngx_ts_dash_write32(b, 0x00000000);\n    ngx_ts_dash_write32(b, 0x40000000);\n\n    /* pre_defined */\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n\n    /* next_track_ID */\n    ngx_ts_dash_write32(b, 1);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_mvex(ngx_buf_t *b)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box(b, \"mvex\");\n\n    ngx_ts_dash_box_trex(b);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_trex(ngx_buf_t *b)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box_full(b, \"trex\", 0, 0);\n\n    /* track_ID */\n    ngx_ts_dash_write32(b, 1);\n\n    /* default_sample_description_index */\n    ngx_ts_dash_write32(b, 1);\n\n    /* default_sample_duration */\n    ngx_ts_dash_write32(b, 0);\n\n    /* default_sample_size */\n    ngx_ts_dash_write32(b, 0);\n\n    /* default_sample_flags */\n    ngx_ts_dash_write32(b, 0);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_trak(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box(b, \"trak\");\n\n    ngx_ts_dash_box_tkhd(b, rep);\n    ngx_ts_dash_box_mdia(b, rep);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_tkhd(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char  *p;\n    time_t   now;\n\n    /* flags: Track_enabled (0x01), Track_in_movie (0x02) */\n    p = ngx_ts_dash_box_full(b, \"tkhd\", 0, 0x03);\n\n    now = ngx_time();\n\n    /* creation_time */\n    ngx_ts_dash_write32(b, now);\n\n    /* modification_time */\n    ngx_ts_dash_write32(b, now);\n\n    /* track_ID */\n    ngx_ts_dash_write32(b, 1);\n\n    /* reserved */\n    ngx_ts_dash_write32(b, 0);\n\n    /* duration */\n    ngx_ts_dash_write32(b, 0xffffffff);\n\n    /* reserved */\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n\n    /* layer, alternate_group */\n    ngx_ts_dash_write32(b, 0);\n\n    /* volume */\n    ngx_ts_dash_write32(b, rep->es->video ? 0x00000000 : 0x01000000);\n\n    /* matrix */\n    ngx_ts_dash_write32(b, 0x00010000);\n    ngx_ts_dash_write32(b, 0x00000000);\n    ngx_ts_dash_write32(b, 0x00000000);\n    ngx_ts_dash_write32(b, 0x00000000);\n    ngx_ts_dash_write32(b, 0x00010000);\n    ngx_ts_dash_write32(b, 0x00000000);\n    ngx_ts_dash_write32(b, 0x00000000);\n    ngx_ts_dash_write32(b, 0x00000000);\n    ngx_ts_dash_write32(b, 0x40000000);\n\n    ngx_ts_dash_write32(b, (rep->avc ? rep->avc->width\n                                     : NGX_TS_DASH_DEFAULT_WIDTH) << 16);\n\n    ngx_ts_dash_write32(b, (rep->avc ? rep->avc->height\n                                     : NGX_TS_DASH_DEFAULT_HEIGHT) << 16);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_mdia(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box(b, \"mdia\");\n\n    ngx_ts_dash_box_mdhd(b);\n    ngx_ts_dash_box_hdlr(b, rep);\n    ngx_ts_dash_box_minf(b, rep);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_mdhd(ngx_buf_t *b)\n{\n    u_char  *p;\n\n    time_t   now;\n\n    p = ngx_ts_dash_box_full(b, \"mdhd\", 0, 0);\n\n    now = ngx_time();\n\n    /* creation_time */\n    ngx_ts_dash_write32(b, now);\n\n    /* modification_time */\n    ngx_ts_dash_write32(b, now);\n\n    /* timescale */\n    ngx_ts_dash_write32(b, 90000);\n\n    /* duration */\n    ngx_ts_dash_write32(b, 0);\n\n    /* language: und */\n    ngx_ts_dash_write32(b, 0x55c40000);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_hdlr(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box_full(b, \"hdlr\", 0, 0);\n\n    /* pre_defined */\n    ngx_ts_dash_write32(b, 0);\n\n    /* handler_type */\n    ngx_ts_dash_cpymem(b, rep->es->video ? \"vide\" : \"soun\", 4);\n\n    /* reserved */\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n\n    /* name */\n    ngx_ts_dash_cpymem(b, rep->es->video ? \"video\" : \"audio\", 6);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_minf(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box(b, \"minf\");\n\n    if (rep->es->video) {\n        ngx_ts_dash_box_vmhd(b);\n\n    } else {\n        ngx_ts_dash_box_smhd(b);\n    }\n\n    ngx_ts_dash_box_dinf(b);\n    ngx_ts_dash_box_stbl(b, rep);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_vmhd(ngx_buf_t *b)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box_full(b, \"vmhd\", 0, 1);\n\n    /* graphicsmode, opcolor */\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_smhd(ngx_buf_t *b)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box_full(b, \"smhd\", 0, 0);\n\n    /* balance, reserved */\n    ngx_ts_dash_write32(b, 0);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_dinf(ngx_buf_t *b)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box(b, \"dinf\");\n\n    ngx_ts_dash_box_dref(b);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_dref(ngx_buf_t *b)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box_full(b, \"dref\", 0, 0);\n\n    /* entry_count */\n    ngx_ts_dash_write32(b, 1);\n\n    ngx_ts_dash_box_url(b);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_url(ngx_buf_t *b)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box_full(b, \"url \", 0, 0x01);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_stbl(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box(b, \"stbl\");\n\n    ngx_ts_dash_box_stsd(b, rep);\n    ngx_ts_dash_box_stts(b);\n    ngx_ts_dash_box_stsc(b);\n    ngx_ts_dash_box_stsz(b);\n    ngx_ts_dash_box_stco(b);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_stts(ngx_buf_t *b)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box_full(b, \"stts\", 0, 0);\n\n    /* entry_count */\n    ngx_ts_dash_write32(b, 0);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_stsc(ngx_buf_t *b)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box_full(b, \"stsc\", 0, 0);\n\n    /* entry_count */\n    ngx_ts_dash_write32(b, 0);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_stsz(ngx_buf_t *b)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box_full(b, \"stsz\", 0, 0);\n\n    /* sample_size */\n    ngx_ts_dash_write32(b, 0);\n\n    /* sample_count */\n    ngx_ts_dash_write32(b, 0);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_stco(ngx_buf_t *b)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box_full(b, \"stco\", 0, 0);\n\n    /* entry_count */\n    ngx_ts_dash_write32(b, 0);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_stsd(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box_full(b, \"stsd\", 0, 0);\n\n    /* entry_count */\n    ngx_ts_dash_write32(b, 1);\n    \n    if (rep->es->video) {\n        ngx_ts_dash_box_video(b, rep);\n\n    } else {\n        ngx_ts_dash_box_audio(b, rep);\n    }\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_video(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char      *p;\n    ngx_uint_t   avc1;\n\n    avc1 = (rep->es->type == NGX_TS_VIDEO_AVC);\n\n    p = ngx_ts_dash_box(b, avc1 ? \"avc1\" : \"mp4v\");\n\n    /* reserved */\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write16(b, 0);\n\n    /* data_reference_index */\n    ngx_ts_dash_write16(b, 1);\n\n    /* pre_defined, reserved */\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n\n    ngx_ts_dash_write16(b, rep->avc ? rep->avc->width\n                                    : NGX_TS_DASH_DEFAULT_WIDTH);\n\n    ngx_ts_dash_write16(b, rep->avc ? rep->avc->height\n                                    : NGX_TS_DASH_DEFAULT_HEIGHT);\n\n    /* horizresolution */\n    ngx_ts_dash_write32(b, 0x00480000);\n\n    /* vertresolution */\n    ngx_ts_dash_write32(b, 0x00480000);\n\n    /* reserved */\n    ngx_ts_dash_write32(b, 0);\n\n    /* frame_count */\n    ngx_ts_dash_write16(b, 1);\n\n    /* compressorname */\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n\n    /* depth */\n    ngx_ts_dash_write16(b, 0x0018);\n\n    /* pre_defined */\n    ngx_ts_dash_write16(b, 0xffff);\n\n    if (avc1) {\n        ngx_ts_dash_box_avcc(b, rep);\n\n    } else {\n        ngx_ts_dash_box_esds(b, rep);\n    }\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_audio(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box(b, \"mp4a\");\n\n    /* reserved */\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write16(b, 0);\n\n    /* data_reference_index */\n    ngx_ts_dash_write16(b, 1);\n\n    /* reserved */\n    ngx_ts_dash_write32(b, 0);\n    ngx_ts_dash_write32(b, 0);\n\n    /* channel_count */\n    ngx_ts_dash_write16(b, 2);\n\n    /* samplesize */\n    ngx_ts_dash_write16(b, 16);\n\n    /* pre_defined, reserved */\n    ngx_ts_dash_write32(b, 0);\n\n    /* XXX samplerate */\n    ngx_ts_dash_write32(b, 90000);\n\n    ngx_ts_dash_box_esds(b, rep);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_avcc(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char  *p, *sps, *pps;\n    size_t   sps_len, pps_len;\n\n    sps_len = rep->sps_len;\n    pps_len = rep->pps_len;\n\n    if (sps_len < 4 || pps_len == 0) {\n        return;\n    }\n\n    sps = rep->sps;\n    pps = rep->pps;\n\n    p = ngx_ts_dash_box(b, \"avcC\");\n\n    /*\n     * ISO/IEC 14496-15:2004(E)\n     * 5.2.4.1 AVC decoder configuration record, p. 12\n     */\n\n    /* configurationVersion */\n    ngx_ts_dash_write8(b, 1);\n\n    /* AVCProfileIndication, profile_compatibility, AVCLevelIndication */\n    ngx_ts_dash_cpymem(b, &sps[1], 3);\n\n    /* lengthSizeMinusOne (lengthSize = 4) */\n    ngx_ts_dash_write8(b, 0xff);\n\n    /* numOfSequenceParameterSets = 1 */\n    ngx_ts_dash_write8(b, 0xe1);\n\n    /* sequenceParameterSetLength */\n    ngx_ts_dash_write16(b, sps_len);\n\n    /* sequenceParameterSetNALUnit */\n    ngx_ts_dash_cpymem(b, sps, sps_len);\n\n    /* numOfPictureParameterSets */\n    ngx_ts_dash_write8(b, 1);\n\n    /* pictureParameterSetLength */\n    ngx_ts_dash_write16(b, pps_len);\n\n    /* pictureParameterSetNALUnit */\n    ngx_ts_dash_cpymem(b, pps, pps_len);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_box_esds(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char  *p;\n\n    p = ngx_ts_dash_box_full(b, \"esds\", 0, 0);\n\n    ngx_ts_dash_desc_es(b, rep);\n\n    ngx_ts_dash_box_update(b, p);\n}\n\n\nstatic u_char *\nngx_ts_dash_box(ngx_buf_t *b, const char type[4])\n{\n    /*\n     * class Box\n     * ISO/IEC 14496-12:2008(E)\n     * 4.2 Object Structure, p. 4\n     */\n\n    u_char  *p;\n\n    p = b->last;\n\n    /* size */\n    ngx_ts_dash_write32(b, 0);\n\n    /* type */\n    ngx_ts_dash_cpymem(b, type, 4);\n\n    return p;\n}\n\n\nstatic u_char *\nngx_ts_dash_box_full(ngx_buf_t *b, const char type[4], u_char version,\n    uint32_t flags)\n{\n    /*\n     * class Box\n     * ISO/IEC 14496-12:2008(E)\n     * 4.2 Object Structure, p. 4\n     */\n\n    u_char  *p;\n\n    p = ngx_ts_dash_box(b, type);\n\n    /* version */\n    ngx_ts_dash_write8(b, version);\n\n    /* flags */\n    ngx_ts_dash_write24(b, flags);\n\n    return p;\n}\n\n\nstatic void\nngx_ts_dash_box_update(ngx_buf_t *b, u_char *p)\n{\n    uint32_t  size;\n\n    if (p + 4 > b->end) {\n        return;\n    }\n\n    size = b->last - p;\n\n    *p++ = (u_char) (size >> 24);\n    *p++ = (u_char) (size >> 16);\n    *p++ = (u_char) (size >> 8);\n    *p++ = (u_char) size;\n}\n\n\nstatic void\nngx_ts_dash_desc_es(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    /*\n     * ISO/IEC 14496-1:2001(E)\n     * 8.6.5 ES_Descriptor, p. 28\n     */\n\n    u_char  *p;\n\n    p = ngx_ts_dash_desc(b, 0x03);\n\n    /* ES_ID */\n    ngx_ts_dash_write16(b, 1);\n\n    /* flags */\n    ngx_ts_dash_write8(b, 0);\n\n    ngx_ts_dash_desc_dec_conf(b, rep);\n    ngx_ts_dash_desc_sl_conf(b);\n\n    ngx_ts_dash_desc_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_desc_dec_conf(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    /*\n     * ISO/IEC 14496-1:2001(E)\n     * 8.6.6 DecoderConfigDescriptor, p. 30\n     */\n\n    u_char  *p;\n\n    p = ngx_ts_dash_desc(b, 0x04);\n\n    /* objectTypeIndication */\n    ngx_ts_dash_write8(b, ngx_ts_dash_get_oti(rep->es->type));\n\n    /* streamType, upStream, reserved */\n    ngx_ts_dash_write8(b, (rep->es->video ? 0x04 : 0x05) << 2);\n\n    /* bufferSizeDB */\n    ngx_ts_dash_write24(b, 0);\n\n    /* maxBitrate */\n    ngx_ts_dash_write32(b, rep->bandwidth * 2);\n\n    /* avgBitrate */\n    ngx_ts_dash_write32(b, rep->bandwidth);\n\n    ngx_ts_dash_desc_dec_spec(b, rep);\n\n    ngx_ts_dash_desc_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_desc_dec_spec(ngx_buf_t *b, ngx_ts_dash_rep_t *rep)\n{\n    u_char  *p;\n\n    if (rep->aac == NULL) {\n        return;\n    }\n\n    /* TODO\n     * AudioSpecificConfig\n     * https://wiki.multimedia.cx/index.php/MPEG-4_Audio#Audio_Specific_Config\n     */\n\n    p = ngx_ts_dash_desc(b, 0x05);\n\n    ngx_ts_dash_write8(b,\n                       (rep->aac->profile << 3) + (rep->aac->freq_index >> 1));\n    ngx_ts_dash_write8(b, (rep->aac->freq_index << 7) + (rep->aac->chan << 3));\n\n    ngx_ts_dash_desc_update(b, p);\n}\n\n\nstatic void\nngx_ts_dash_desc_sl_conf(ngx_buf_t *b)\n{\n    /*\n     * ISO/IEC 14496-1:2001(E)\n     * 10.2.3 SL Packet Header Configuration, p. 227\n     */\n\n    u_char  *p;\n\n    p = ngx_ts_dash_desc(b, 0x06);\n\n    /* predefined */\n    ngx_ts_dash_write8(b, 0x02);\n\n    ngx_ts_dash_desc_update(b, p);\n}\n\n\nstatic u_char *\nngx_ts_dash_desc(ngx_buf_t *b, u_char tag)\n{\n    /*\n     * ISO/IEC 14496-1:2001(E)\n     * 8.2.2 BaseDescriptor, p. 16\n     */\n\n    u_char  *p;\n\n    ngx_ts_dash_write8(b, tag);\n\n    p = b->last;\n\n    /* size */\n    ngx_ts_dash_write32(b, 0);\n\n    return p;\n}\n\n\nstatic void\nngx_ts_dash_desc_update(ngx_buf_t *b, u_char *p)\n{\n    uint32_t  size;\n\n    if (p + 4 > b->end) {\n        return;\n    }\n\n    size = b->last - p - 4;\n\n    *p++ = (size >> 21) | 0x80;\n    *p++ = (size >> 14) | 0x80;\n    *p++ = (size >> 7) | 0x80;\n    *p++ = size & 0x7f;\n}\n\n\nstatic void\nngx_ts_dash_cpymem(ngx_buf_t *b, const void *data, size_t size)\n{\n    size_t  n;\n\n    n = ngx_min((size_t) (b->end - b->last), size);\n\n    b->last = ngx_cpymem(b->last, data, n);\n}\n\n\nstatic void\nngx_ts_dash_write64(ngx_buf_t *b, uint64_t v)\n{\n    ngx_int_t  n;\n\n    for (n = 56; n >= 0 && b->last < b->end; n -= 8) {\n        *b->last++ = (u_char) (v >> n);\n    }\n}\n\n\nstatic void\nngx_ts_dash_write32(ngx_buf_t *b, uint32_t v)\n{\n    ngx_int_t  n;\n\n    for (n = 24; n >= 0 && b->last < b->end; n -= 8) {\n        *b->last++ = (u_char) (v >> n);\n    }\n}\n\n\nstatic void\nngx_ts_dash_write24(ngx_buf_t *b, uint32_t v)\n{\n    ngx_int_t  n;\n\n    for (n = 16; n >= 0 && b->last < b->end; n -= 8) {\n        *b->last++ = (u_char) (v >> n);\n    }\n}\n\n\nstatic void\nngx_ts_dash_write16(ngx_buf_t *b, uint16_t v)\n{\n    ngx_int_t  n;\n\n    for (n = 8; n >= 0 && b->last < b->end; n -= 8) {\n        *b->last++ = (u_char) (v >> n);\n    }\n}\n\n\nstatic void\nngx_ts_dash_write8(ngx_buf_t *b, u_char v)\n{\n    if (b->last < b->end) {\n        *b->last++ = v;\n    }\n}\n\n\nngx_int_t\nngx_ts_dash_start_segment(ngx_ts_dash_t *dash, ngx_ts_dash_rep_t *rep)\n{\n    ngx_buf_t  *b;\n\n    ngx_memzero(&rep->subs, sizeof(ngx_ts_dash_subs_t));\n\n    rep->nsamples = 0;\n    rep->nmeta = 0;\n    rep->ndata = 0;\n\n    rep->meta = ngx_ts_dash_get_buffer(dash);\n    if (rep->meta == NULL) {\n        return NGX_ERROR;\n    }\n\n    rep->last_meta = rep->meta;\n\n    b = rep->meta->buf;\n\n    ngx_ts_dash_box_styp(b);\n    ngx_ts_dash_box_sidx(b, rep);\n    ngx_ts_dash_box_moof(b, rep);\n\n    if (b->last == b->end) {\n        return NGX_ERROR;\n    }\n\n    rep->data = ngx_ts_dash_get_buffer(dash);\n    if (rep->data == NULL) {\n        return NGX_ERROR;\n    }\n\n    rep->last_data = rep->data;\n\n    b = rep->data->buf;\n\n    ngx_ts_dash_box_mdat(b, rep);\n\n    if (b->last == b->end) {\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\n\nngx_chain_t *\nngx_ts_dash_end_segment(ngx_ts_dash_t *dash, ngx_ts_dash_rep_t *rep)\n{\n    int32_t              d;\n    uint32_t             traf, trun, moof, mdat;\n    ngx_chain_t         *out;\n    ngx_ts_dash_subs_t  *subs;\n\n    subs = &rep->subs;\n\n    ngx_ts_dash_put64(subs->pts, rep->seg_pts);\n    ngx_ts_dash_put64(subs->dts, rep->seg_dts);\n\n    ngx_ts_dash_put32(subs->seq, rep->seg);\n    ngx_ts_dash_put32(subs->nsamples, rep->nsamples);\n    ngx_ts_dash_put32(subs->duration, rep->es->dts - rep->seg_dts);\n\n    d = rep->es->dts - rep->dts;\n\n    if (subs->sample_duration && d > 0) {\n        ngx_ts_dash_put32(subs->sample_duration, d);\n    }\n\n    traf = ngx_ts_dash_get32(subs->traf) + rep->nmeta;\n    ngx_ts_dash_put32(subs->traf, traf);\n\n    trun = ngx_ts_dash_get32(subs->trun) + rep->nmeta;\n    ngx_ts_dash_put32(subs->trun, trun);\n\n    moof = ngx_ts_dash_get32(subs->moof) + rep->nmeta;\n    ngx_ts_dash_put32(subs->moof, moof);\n\n    mdat = ngx_ts_dash_get32(subs->mdat) + rep->ndata;\n    ngx_ts_dash_put32(subs->mdat, mdat);\n\n    ngx_ts_dash_put32(subs->moof_mdat, moof + mdat);\n    ngx_ts_dash_put32(subs->moof_data, moof + 8);\n\n    out = rep->meta;\n    rep->last_meta->next = rep->data;\n\n    rep->meta = NULL;\n    rep->data = NULL;\n    rep->last_meta = NULL;\n    rep->last_data = NULL;\n\n    return out;\n}\n\n\nstatic void\nngx_ts_dash_set_sub(ngx_buf_t *b, u_char **p)\n{\n    *p = b->last;\n}\n\n\nstatic uint32_t\nngx_ts_dash_get32(u_char *p)\n{\n    uint32_t  v;\n\n    v = *p++;\n    v = (v << 8) + *p++;\n    v = (v << 8) + *p++;\n    v = (v << 8) + *p;\n\n    return v;\n}\n\n\nstatic void\nngx_ts_dash_put32(u_char *p, uint32_t v)\n{\n    *p++ = (u_char) (v >> 24);\n    *p++ = (u_char) (v >> 16);\n    *p++ = (u_char) (v >> 8);\n    *p++ = (u_char) v;\n}\n\n\nstatic void\nngx_ts_dash_put64(u_char *p, uint64_t v)\n{\n    *p++ = (u_char) (v >> 56);\n    *p++ = (u_char) (v >> 48);\n    *p++ = (u_char) (v >> 40);\n    *p++ = (u_char) (v >> 32);\n    *p++ = (u_char) (v >> 24);\n    *p++ = (u_char) (v >> 16);\n    *p++ = (u_char) (v >> 8);\n    *p++ = (u_char) v;\n}\n\n\nvoid\nngx_ts_dash_free_segment(ngx_ts_dash_t *dash, ngx_ts_dash_rep_t *rep,\n    ngx_chain_t *out)\n{\n    ngx_chain_t  *cl;\n\n    for (cl = out; cl->next; cl = cl->next);\n\n    cl->next = dash->free;\n    dash->free = out;\n}\n\n\nngx_int_t\nngx_ts_dash_append_meta(ngx_ts_dash_t *dash, ngx_ts_dash_rep_t *rep,\n    size_t size, uint64_t dts)\n{\n    size_t        n;\n    ngx_buf_t    *b;\n    ngx_chain_t  *cl;\n    ngx_ts_es_t  *es;\n\n    es = rep->es;\n\n    rep->ndata += size;\n    rep->nsamples++;\n\n    n = es->video ? 16 : 8;\n\n    cl = rep->last_meta;\n    b = cl->buf;\n\n    if ((size_t) (b->end - b->last) < n) {\n        cl->next = ngx_ts_dash_get_buffer(dash);\n        if (cl->next == NULL) {\n            return NGX_ERROR;\n        }\n\n        cl = cl->next;\n        rep->last_meta = cl;\n        b = cl->buf;\n    }\n\n    rep->nmeta += n;\n\n    /* sample_duration */\n    if (rep->subs.sample_duration) {\n        ngx_ts_dash_put32(rep->subs.sample_duration, dts - rep->dts);\n    }\n\n    ngx_ts_dash_set_sub(b, &rep->subs.sample_duration);\n    ngx_ts_dash_write32(b, 0);\n\n    /* sample_size */\n    ngx_ts_dash_write32(b, size);\n\n    if (es->video) {\n\n        /*\n         * ISO/IEC 14496-12:2008(E)\n         * 8.8.3 Track Extends Box, Sample flags, p. 44\n         * sample_is_difference_sample for non-key sample\n         */\n\n        ngx_ts_dash_write32(b, es->rand ? 0x00000000 : 0x00010000);\n\n        /* sample_composition_time_offset */\n        ngx_ts_dash_write32(b, es->pts - es->dts);\n    }\n\n    rep->dts = dts;\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_ts_dash_append_data(ngx_ts_dash_t *dash, ngx_ts_dash_rep_t *rep,\n    u_char *data, size_t len)\n{\n    size_t        n;\n    ngx_chain_t  *cl;\n\n    cl = rep->last_data;\n\n    while (len) {\n        if (cl->buf->last == cl->buf->end) {\n            cl->next = ngx_ts_dash_get_buffer(dash);\n            if (cl->next == NULL) {\n                return NGX_ERROR;\n            }\n\n            cl = cl->next;\n            rep->last_data = cl;\n        }\n\n        n = ngx_min((size_t) (cl->buf->end - cl->buf->last), len);\n\n        cl->buf->last = ngx_cpymem(cl->buf->last, data, n);\n\n        data += n;\n        len -= n;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_chain_t *\nngx_ts_dash_get_buffer(ngx_ts_dash_t *dash)\n{\n    ngx_buf_t    *b;\n    ngx_chain_t  *out;\n\n    if (dash->free) {\n        out = dash->free;\n        dash->free = out->next;\n        out->next = NULL;\n        b = out->buf;\n\n    } else {\n        out = ngx_alloc_chain_link(dash->ts->pool);\n        if (out == NULL) {\n            return NULL;\n        }\n\n        ngx_log_debug1(NGX_LOG_DEBUG_CORE, dash->ts->log, 0,\n                       \"ts dash alloc buffer:%d\", NGX_TS_DASH_BUFFER_SIZE);\n\n        b = ngx_create_temp_buf(dash->ts->pool, NGX_TS_DASH_BUFFER_SIZE);\n        if (b == NULL) {\n            return NULL;\n        }\n\n        out->buf = b;\n        out->next = NULL;\n    }\n\n    b->pos = b->start;\n    b->last = b->start;\n\n    return out;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-ts-module/src/ngx_ts_hls.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n#include \"ngx_ts_hls.h\"\n\n\nstatic void ngx_ts_hls_cleanup(void *data);\nstatic ngx_int_t ngx_ts_hls_handler(ngx_ts_handler_data_t *hd);\nstatic ngx_int_t ngx_ts_hls_pat_handler(ngx_ts_hls_t *hls);\nstatic ngx_int_t ngx_ts_hls_pes_handler(ngx_ts_hls_t *hls,\n    ngx_ts_program_t *prog, ngx_ts_es_t *es, ngx_chain_t *bufs);\nstatic void ngx_ts_hls_update_bandwidth(ngx_ts_hls_t *hls,\n    ngx_ts_hls_variant_t *var, ngx_chain_t *bufs, uint64_t dts);\nstatic ngx_int_t ngx_ts_hls_close_segment(ngx_ts_hls_t *hls,\n    ngx_ts_hls_variant_t *var, ngx_ts_es_t *es);\nstatic ngx_int_t ngx_ts_hls_update_playlist(ngx_ts_hls_t *hls,\n    ngx_ts_hls_variant_t *var);\nstatic ngx_int_t ngx_ts_hls_update_master_playlist(ngx_ts_hls_t *hls);\nstatic ngx_int_t ngx_ts_hls_write_file(u_char *path, u_char *tmp_path,\n    u_char *data, size_t len, ngx_log_t *log);\nstatic ngx_int_t ngx_ts_hls_open_segment(ngx_ts_hls_t *hls,\n    ngx_ts_hls_variant_t *var);\n\nstatic ngx_msec_t ngx_ts_hls_file_manager(void *data);\nstatic ngx_int_t ngx_ts_hls_manage_file(ngx_tree_ctx_t *ctx, ngx_str_t *path);\nstatic ngx_int_t ngx_ts_hls_manage_directory(ngx_tree_ctx_t *ctx,\n    ngx_str_t *path);\nstatic ngx_int_t ngx_ts_hls_delete_directory(ngx_tree_ctx_t *ctx,\n    ngx_str_t *path);\nstatic ngx_int_t ngx_ts_hls_delete_file(ngx_tree_ctx_t *ctx, ngx_str_t *path);\n\n\nngx_ts_hls_t *\nngx_ts_hls_create(ngx_ts_hls_conf_t *conf, ngx_ts_stream_t *ts, ngx_str_t *name)\n{\n    ngx_ts_hls_t        *hls;\n    ngx_pool_cleanup_t  *cln;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ts->log, 0, \"ts hls create\");\n\n    hls = ngx_pcalloc(ts->pool, sizeof(ngx_ts_hls_t));\n    if (hls == NULL) {\n        return NULL;\n    }\n\n    hls->conf = conf;\n    hls->ts = ts;\n\n    hls->path.len = conf->path->name.len + 1 + name->len;\n    hls->path.data = ngx_pnalloc(ts->pool, hls->path.len + 1);\n    if (hls->path.data == NULL) {\n        return NULL;\n    }\n\n    ngx_sprintf(hls->path.data, \"%V/%V%Z\", &conf->path->name, name);\n\n    cln = ngx_pool_cleanup_add(ts->pool, 0);\n    if (cln == NULL) {\n        return NULL;\n    }\n\n    cln->handler = ngx_ts_hls_cleanup;\n    cln->data = hls;\n\n    if (ngx_ts_add_handler(ts, ngx_ts_hls_handler, hls) != NGX_OK) {\n        return NULL;\n    }\n\n    return hls;\n}\n\n\nstatic void\nngx_ts_hls_cleanup(void *data)\n{\n    ngx_ts_hls_t *hls = data;\n\n    int64_t                d, maxd;\n    ngx_uint_t             n, i;\n    ngx_ts_es_t           *es;\n    ngx_ts_stream_t       *ts;\n    ngx_ts_hls_segment_t  *seg;\n    ngx_ts_hls_variant_t  *var;\n\n    hls->done = 1;\n\n    ts = hls->ts;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ts->log, 0, \"ts hls cleanup\");\n\n    for (n = 0; n < hls->nvars; n++) {\n        var = &hls->vars[n];\n\n        if (var->file.fd != NGX_INVALID_FILE) {\n            if (ngx_close_file(var->file.fd) == NGX_FILE_ERROR) {\n                ngx_log_error(NGX_LOG_ALERT, ts->log, ngx_errno,\n                              ngx_close_file_n \" \\\"%s\\\" failed\",\n                              var->file.name.data);\n            }\n\n            var->file.fd = NGX_INVALID_FILE;\n        }\n\n        maxd = 0;\n\n        for (i = 0; i < var->prog->nes; i++) {\n            es = &var->prog->es[i];\n\n            d = es->dts - var->seg_dts;\n            if (maxd < d) {\n                maxd = d;\n            }\n        }\n\n        seg = &var->segs[var->seg % var->nsegs];\n        seg->id = var->seg++;\n        seg->duration = maxd;\n\n        (void) ngx_ts_hls_update_playlist(hls, var);\n    }\n}\n\n\nstatic ngx_int_t\nngx_ts_hls_handler(ngx_ts_handler_data_t *hd)\n{\n    ngx_ts_hls_t *hls = hd->data;\n\n    switch (hd->event) {\n\n    case NGX_TS_PAT:\n        return ngx_ts_hls_pat_handler(hls);\n\n    case NGX_TS_PES:\n        return ngx_ts_hls_pes_handler(hls, hd->prog, hd->es, hd->bufs);\n\n    default:\n        return NGX_OK;\n    }\n}\n\n\nstatic ngx_int_t\nngx_ts_hls_pat_handler(ngx_ts_hls_t *hls)\n{\n    size_t                 len;\n    u_char                *p;\n    ngx_uint_t             n;\n    ngx_ts_stream_t       *ts;\n    ngx_ts_program_t      *prog;\n    ngx_ts_hls_variant_t  *var;\n\n    if (hls->vars) {\n        return NGX_OK;\n    }\n\n    ts = hls->ts;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ts->log, 0, \"ts hls pat\");\n\n    hls->nvars = ts->nprogs;\n    hls->vars = ngx_pcalloc(ts->pool,\n                            sizeof(ngx_ts_hls_variant_t) * ts->nprogs);\n    if (hls->vars == NULL) {\n        return NGX_ERROR;\n    }\n\n    if (hls->nvars > 1) {\n        /* index.m3u8 */\n\n        len = hls->path.len + sizeof(\"/index.m3u8\");\n\n        hls->m3u8_path = ngx_pnalloc(ts->pool, len);\n        if (hls->m3u8_path == NULL) {\n            return NGX_ERROR;\n        }\n\n        ngx_sprintf(hls->m3u8_path, \"%V/index.m3u8%Z\", &hls->path);\n\n        /* index.m3u8.tmp */\n\n        len += sizeof(\".tmp\") - 1;\n\n        hls->m3u8_tmp_path = ngx_pnalloc(ts->pool, len);\n        if (hls->m3u8_tmp_path == NULL) {\n            return NGX_ERROR;\n        }\n\n        ngx_sprintf(hls->m3u8_tmp_path, \"%s.tmp%Z\", hls->m3u8_path);\n    }\n\n    for (n = 0; n < ts->nprogs; n++) {\n        prog = &ts->progs[n];\n        var = &hls->vars[n];\n\n        var->prog = prog;\n        var->file.fd = NGX_INVALID_FILE;\n        var->file.log = ts->log;\n\n        var->nsegs = hls->conf->nsegs;\n        var->segs = ngx_pcalloc(ts->pool,\n                               sizeof(ngx_ts_hls_segment_t) * hls->conf->nsegs);\n        if (var->segs == NULL) {\n            return NGX_ERROR;\n        }\n\n        /* [<prog>.]<seg>.ts */\n\n        len = hls->path.len + 1 + NGX_INT_T_LEN + sizeof(\".ts\");\n\n        if (hls->nvars > 1) {\n            len += NGX_INT_T_LEN + 1;\n        }\n\n        p = ngx_pnalloc(ts->pool, len);\n        if (p == NULL) {\n            return NGX_ERROR;\n        }\n\n        var->path.data = p;\n\n        if (hls->nvars > 1) {\n            p = ngx_sprintf(p, \"%V/%ui.\",\n                            &hls->path, (ngx_uint_t) prog->number);\n\n        } else {\n            p = ngx_sprintf(p, \"%V/\", &hls->path);\n        }\n\n        var->path.len = p - var->path.data;\n\n        /* (<prog>|index).m3u8 */\n\n        len = hls->path.len + 1 + sizeof(\".m3u8\");\n\n        if (hls->nvars > 1) {\n            len += NGX_INT_T_LEN;\n\n        } else {\n            len += sizeof(\"index\") - 1;\n        }\n\n        var->m3u8_path = ngx_pnalloc(ts->pool, len);\n        if (var->m3u8_path == NULL) {\n            return NGX_ERROR;\n        }\n\n        if (hls->nvars > 1) {\n            ngx_sprintf(var->m3u8_path, \"%V/%ui.m3u8%Z\",\n                        &hls->path, (ngx_uint_t) prog->number);\n\n        } else {\n            ngx_sprintf(var->m3u8_path, \"%V/index.m3u8%Z\", &hls->path);\n        }\n\n        /* (<prog>|index).m3u8.tmp */\n\n        len += sizeof(\".tmp\") - 1;\n\n        var->m3u8_tmp_path = ngx_pnalloc(ts->pool, len);\n        if (var->m3u8_tmp_path == NULL) {\n            return NGX_ERROR;\n        }\n\n        ngx_sprintf(var->m3u8_tmp_path, \"%s.tmp%Z\", var->m3u8_path);\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_ts_hls_pes_handler(ngx_ts_hls_t *hls, ngx_ts_program_t *prog,\n    ngx_ts_es_t *es, ngx_chain_t *bufs)\n{\n    ngx_uint_t             n;\n    ngx_chain_t           *out;\n    ngx_ts_stream_t       *ts;\n    ngx_ts_hls_variant_t  *var;\n\n    if (!es->ptsf) {\n        return NGX_OK;\n    }\n\n    ts = hls->ts;\n\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ts->log, 0, \"ts hls pes pid:%ud\",\n                   (unsigned) es->pid);\n\n    for (n = 0; n < hls->nvars; n++) {\n        var = &hls->vars[n];\n        if (prog == var->prog) {\n            goto found;\n        }\n    }\n\n    ngx_log_error(NGX_LOG_ERR, ts->log, 0, \"TS program not found\");\n\n    return NGX_ERROR;\n\nfound:\n\n    ngx_ts_hls_update_bandwidth(hls, var, bufs, es->pts);\n\n    if (ngx_ts_hls_close_segment(hls, var, es) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    if (ngx_ts_hls_open_segment(hls, var) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    out = ngx_ts_write_pes(ts, prog, es, bufs);\n    if (out == NULL) {\n        return NGX_ERROR;\n    }\n\n    if (ngx_write_chain_to_file(&var->file, out, var->file.offset, ts->pool)\n        == NGX_ERROR)\n    {\n        return NGX_ERROR;\n    }\n\n    ngx_ts_free_chain(ts, &out);\n\n    return NGX_OK;\n}\n\nstatic void\nngx_ts_hls_update_bandwidth(ngx_ts_hls_t *hls, ngx_ts_hls_variant_t *var,\n    ngx_chain_t *bufs, uint64_t dts)\n{\n    int64_t  d, analyze;\n\n    if (var->bandwidth) {\n        return;\n    }\n\n    if (var->bandwidth_bytes == 0) {\n        var->bandwidth_dts = dts;\n    }\n\n    while (bufs) {\n        var->bandwidth_bytes += bufs->buf->last - bufs->buf->pos;\n        bufs = bufs->next;\n    }\n\n    d = dts - var->bandwidth_dts;\n    analyze = (int64_t) hls->conf->analyze * 90;\n\n    if (d >= analyze) {\n        var->bandwidth = var->bandwidth_bytes * 8 * 90000 / d;\n    }\n\n    ngx_log_debug2(NGX_LOG_DEBUG_CORE, hls->ts->log, 0,\n                   \"ts hls bandwidth:%ui, pid:%ud\",\n                   var->bandwidth, (unsigned) var->prog->pid);\n}\n\n\nstatic ngx_int_t\nngx_ts_hls_close_segment(ngx_ts_hls_t *hls, ngx_ts_hls_variant_t *var,\n    ngx_ts_es_t *es)\n{\n    off_t                  max_size;\n    int64_t                d, min_seg, max_seg;\n    ngx_ts_stream_t       *ts;\n    ngx_ts_hls_segment_t  *seg;\n\n    ts = hls->ts;\n\n    if (var->file.fd == NGX_INVALID_FILE) {\n        var->seg_dts = es->dts;\n        return NGX_OK;\n    }\n\n    d = es->dts - var->seg_dts;\n\n    min_seg = (int64_t) hls->conf->min_seg * 90;\n    max_seg = (int64_t) hls->conf->max_seg * 90;\n    max_size = hls->conf->max_size;\n\n    if (d < min_seg\n        || (d < max_seg && es->video && !es->rand)\n        || (d < max_seg && !es->video && var->prog->video))\n    {\n        if (max_size == 0 || var->file.offset < max_size) {\n            return NGX_OK;\n        }\n\n        ngx_log_error(NGX_LOG_WARN, ts->log, 0,\n                      \"closing HLS segment \\\"%s\\\" on size limit\",\n                      var->file.name.data);\n    }\n\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                   \"ts hls close segment \\\"%s\\\"\", var->file.name.data);\n\n    var->seg_dts = es->dts;\n\n    seg = &var->segs[var->seg % var->nsegs];\n    seg->id = var->seg++;\n    seg->duration = d;\n    seg->size = var->file.offset;\n\n    if (ngx_close_file(var->file.fd) == NGX_FILE_ERROR) {\n        ngx_log_error(NGX_LOG_ALERT, ts->log, ngx_errno,\n                      ngx_close_file_n \" \\\"%s\\\" failed\", var->file.name.data);\n    }\n\n    ngx_memzero(&var->file, sizeof(ngx_file_t));\n\n    var->file.fd = NGX_INVALID_FILE;\n    var->file.log = ts->log;\n\n    if (ngx_ts_hls_update_playlist(hls, var) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    return ngx_ts_hls_update_master_playlist(hls);\n}\n\n\nstatic ngx_int_t\nngx_ts_hls_update_playlist(ngx_ts_hls_t *hls, ngx_ts_hls_variant_t *var)\n{\n    size_t                 len;\n    u_char                *p, *data;\n    uint64_t               maxd;\n    ngx_int_t              rc;\n    ngx_uint_t             i, ms, td;\n    ngx_ts_stream_t       *ts;\n    ngx_ts_hls_segment_t  *seg;\n\n    ts = hls->ts;\n\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                   \"ts hls update playlist \\\"%s\\\"\", var->m3u8_path);\n\n    len = sizeof(\"#EXTM3U\\n\"\n                 \"#EXT-X-VERSION:3\\n\"\n                 \"#EXT-X-MEDIA-SEQUENCE:\\n\"\n                 \"#EXT-X-TARGETDURATION:\\n\\n\") - 1\n          + 2 * NGX_INT_T_LEN;\n\n    maxd = 0;\n\n    for (i = 0; i < var->nsegs; i++) {\n        seg = &var->segs[(var->seg + i) % var->nsegs];\n\n        if (seg->duration) {\n            if (maxd < seg->duration) {\n                maxd = seg->duration;\n            }\n\n            len += sizeof(\"#EXTINF:.xxx,\\n\"\n                          \".ts\\n\") - 1\n                   + 2 * NGX_INT_T_LEN;\n\n            if (hls->nvars > 1) {\n                len += NGX_INT_T_LEN + 1;\n            }\n        }\n    }\n\n    if (hls->done) {\n        len += sizeof(\"\\n#EXT-X-ENDLIST\\n\") - 1;\n    }\n\n    data = ngx_alloc(len, ts->log);\n    if (data == NULL) {\n        return NGX_ERROR;\n    }\n\n    p = data;\n\n    ms = var->seg <= var->nsegs ? 0 : var->seg - var->nsegs;\n    td = (hls->conf->max_seg + 999) / 1000;\n\n    p = ngx_sprintf(p, \"#EXTM3U\\n\"\n                       \"#EXT-X-VERSION:3\\n\"\n                       \"#EXT-X-MEDIA-SEQUENCE:%ui\\n\"\n                       \"#EXT-X-TARGETDURATION:%ui\\n\\n\", ms, td);\n\n    for (i = 0; i < var->nsegs; i++) {\n        seg = &var->segs[(var->seg + i) % var->nsegs];\n\n        if (seg->duration) {\n            p = ngx_sprintf(p, \"#EXTINF:%.3f,\\n\", seg->duration / 90000.);\n\n            if (hls->nvars > 1) {\n                p = ngx_sprintf(p, \"%ui.%ui.ts\\n\",\n                                (ngx_uint_t) var->prog->number, seg->id);\n\n            } else {\n                p = ngx_sprintf(p, \"%ui.ts\\n\", seg->id);\n            }\n        }\n    }\n\n    if (hls->done) {\n        p = ngx_cpymem(p, \"\\n#EXT-X-ENDLIST\\n\",\n                       sizeof(\"\\n#EXT-X-ENDLIST\\n\") - 1);\n    }\n\n    rc = ngx_ts_hls_write_file(var->m3u8_path, var->m3u8_tmp_path, data,\n                               p - data, ts->log);\n\n    ngx_free(data);\n\n    return rc;\n}\n\n\nstatic ngx_int_t\nngx_ts_hls_update_master_playlist(ngx_ts_hls_t *hls)\n{\n    size_t                 len;\n    u_char                *p, *data;\n    ngx_int_t              rc;\n    ngx_uint_t             n;\n    ngx_ts_stream_t       *ts;\n    ngx_ts_hls_variant_t  *var;\n\n    /* TODO touch file if it exists*/\n\n    if (hls->nvars == 1) {\n        return NGX_OK;\n    }\n\n    ts = hls->ts;\n\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                   \"ts hls update master playlist \\\"%s\\\"\", hls->m3u8_path);\n\n    len = sizeof(\"#EXTM3U\\n\") - 1;\n\n    for (n = 0; n < hls->nvars; n++) {\n        var = &hls->vars[n];\n\n        if (var->bandwidth == 0) {\n            ngx_log_debug0(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                           \"ts hls bandwidth not available\");\n            return NGX_OK;\n        }\n\n        len += sizeof(\"#EXT-X-STREAM-INF:BANDWIDTH=\\n\") - 1 + NGX_INT_T_LEN\n               + NGX_INT_T_LEN + sizeof(\".m3u8\\n\") - 1;\n    }\n\n    data = ngx_alloc(len, ts->log);\n    if (data == NULL) {\n        return NGX_ERROR;\n    }\n\n    p = data;\n\n    p = ngx_cpymem(p, \"#EXTM3U\\n\", sizeof(\"#EXTM3U\\n\") - 1);\n\n    for (n = 0; n < hls->nvars; n++) {\n        var = &hls->vars[n];\n\n        p = ngx_sprintf(p, \"#EXT-X-STREAM-INF:BANDWIDTH=%ui\\n%ui.m3u8\\n\",\n                        var->bandwidth, (ngx_uint_t) var->prog->number);\n    }\n\n    rc = ngx_ts_hls_write_file(hls->m3u8_path, hls->m3u8_tmp_path, data,\n                               p - data, ts->log);\n\n    ngx_free(data);\n\n    return rc;\n}\n\n\nstatic ngx_int_t\nngx_ts_hls_write_file(u_char *path, u_char *tmp_path, u_char *data, size_t len,\n    ngx_log_t *log)\n{\n    ssize_t    n;\n    ngx_fd_t   fd;\n    ngx_err_t  err;\n\n    fd = ngx_open_file(tmp_path,\n                       NGX_FILE_WRONLY,\n                       NGX_FILE_TRUNCATE,\n                       NGX_FILE_DEFAULT_ACCESS);\n\n    if (fd == NGX_INVALID_FILE) {\n        ngx_log_error(NGX_LOG_EMERG, log, ngx_errno,\n                      ngx_open_file_n \" \\\"%s\\\" failed\", tmp_path);\n        return NGX_ERROR;\n    }\n\n    n = ngx_write_fd(fd, data, len);\n\n    err = ngx_errno;\n\n    if (ngx_close_file(fd) == NGX_FILE_ERROR) {\n        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,\n                      ngx_close_file_n \" \\\"%s\\\" failed\", tmp_path);\n        return NGX_ERROR;\n    }\n\n    if (n < 0) {\n        ngx_log_error(NGX_LOG_ALERT, log, err,\n                      ngx_write_fd_n \" to \\\"%s\\\" failed\", tmp_path);\n        return NGX_ERROR;\n    }\n\n    if ((size_t) n != len) {\n        ngx_log_error(NGX_LOG_ALERT, log, 0,\n                      \"incomplete write to \\\"%s\\\"\", tmp_path);\n        return NGX_ERROR;\n    }\n\n    if (ngx_rename_file(tmp_path, path) == NGX_FILE_ERROR) {\n        ngx_log_error(NGX_LOG_ALERT, log, ngx_errno,\n                      ngx_rename_file_n \" \\\"%s\\\" to \\\"%s\\\" failed\",\n                      tmp_path, path);\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_ts_hls_open_segment(ngx_ts_hls_t *hls, ngx_ts_hls_variant_t *var)\n{\n    size_t            n;\n    ngx_err_t         err;\n    ngx_str_t        *path;\n    ngx_uint_t        try;\n    ngx_chain_t      *out, **ll;\n    ngx_ts_stream_t  *ts;\n\n    if (var->file.fd != NGX_INVALID_FILE) {\n        return NGX_OK;\n    }\n\n    ts = hls->ts;\n\n    path = &var->path;\n\n    n = ngx_sprintf(path->data + path->len, \"%ui.ts%Z\", var->seg) - path->data\n        - 1;\n\n    var->file.name.data = path->data;\n    var->file.name.len = n;\n\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                   \"ts hls open segment \\\"%s\\\"\", var->file.name.data);\n\n    for (try = 0; /* void */; try++) {\n        var->file.fd = ngx_open_file(path->data,\n                                     NGX_FILE_WRONLY,\n                                     NGX_FILE_TRUNCATE,\n                                     NGX_FILE_DEFAULT_ACCESS);\n\n        if (var->file.fd != NGX_INVALID_FILE) {\n            break;\n        }\n\n        err = ngx_errno;\n\n        if (try || (err != NGX_ENOENT && err != NGX_ENOTDIR)) {\n            ngx_log_error(NGX_LOG_EMERG, ts->log, err,\n                          ngx_open_file_n \" \\\"%s\\\" failed\", path->data);\n            return NGX_ERROR;\n        }\n\n        /* XXX dir access mode */\n        if (ngx_create_dir(hls->path.data, 0700) == NGX_FILE_ERROR) {\n            err = ngx_errno;\n\n            if (err != NGX_EEXIST) {\n                ngx_log_error(NGX_LOG_CRIT, ts->log, err,\n                              ngx_create_dir_n \" \\\"%s\\\" failed\",\n                              hls->path.data);\n                return NGX_ERROR;\n            }\n        }\n    }\n\n    if (var->prologue == NULL) {\n        out = ngx_ts_write_pat(ts, var->prog);\n        if (out == NULL) {\n            return NGX_ERROR;\n        }\n\n        for (ll = &out; *ll; ll = &(*ll)->next);\n\n        *ll = ngx_ts_write_pmt(ts, var->prog);\n        if (*ll == NULL) {\n            return NGX_ERROR;\n        }\n\n        var->prologue = out;\n    }\n\n    if (ngx_write_chain_to_file(&var->file, var->prologue, 0, ts->pool)\n        == NGX_ERROR)\n    {\n        return NGX_ERROR;\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_msec_t\nngx_ts_hls_file_manager(void *data)\n{\n    ngx_ts_hls_conf_t *hls = data;\n\n    ngx_tree_ctx_t  tree;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,\n                  \"ts hls file manager\");\n\n    tree.init_handler = NULL;\n    tree.file_handler = ngx_ts_hls_manage_file;\n    tree.pre_tree_handler = ngx_ts_hls_manage_directory;\n    tree.post_tree_handler = ngx_ts_hls_delete_directory;\n    tree.spec_handler = ngx_ts_hls_delete_file;\n    tree.data = hls;\n    tree.alloc = 0;\n    tree.log = ngx_cycle->log;\n\n    (void) ngx_walk_tree(&tree, &hls->path->name);\n\n    return hls->max_seg * hls->nsegs;\n}\n\n\nstatic ngx_int_t\nngx_ts_hls_manage_file(ngx_tree_ctx_t *ctx, ngx_str_t *path)\n{\n    ngx_ts_hls_conf_t *hls = ctx->data;\n\n    time_t  age, max_age;\n\n    age = ngx_time() - ctx->mtime;\n\n    max_age = 0;\n\n    if (path->len >= 5\n        && ngx_memcmp(path->data + path->len - 5, \".m3u8\", 5) == 0)\n    {\n        max_age = hls->max_seg * hls->nsegs / 1000;\n    }\n\n    if (path->len >= 3\n        && ngx_memcmp(path->data + path->len - 3, \".ts\", 3) == 0)\n    {\n        max_age = hls->max_seg * hls->nsegs / 500;\n    }\n\n    if (path->len >= 4\n        && ngx_memcmp(path->data + path->len - 4, \".tmp\", 3) == 0)\n    {\n        max_age = 10;\n    }\n\n    ngx_log_debug3(NGX_LOG_DEBUG_CORE, ctx->log, 0,\n                   \"ts hls file \\\"%s\\\", age:%T, max_age:%T\",\n                   path->data, age, max_age);\n\n    if (age < max_age) {\n        return NGX_OK;\n    }\n\n    return ngx_ts_hls_delete_file(ctx, path);\n}\n\n\nstatic ngx_int_t\nngx_ts_hls_manage_directory(ngx_tree_ctx_t *ctx, ngx_str_t *path)\n{\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_ts_hls_delete_directory(ngx_tree_ctx_t *ctx, ngx_str_t *path)\n{\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,\n                   \"ts hls delete dir: \\\"%s\\\"\", path->data);\n\n    /* non-empty directory will not be removed anyway */\n\n    /* TODO count files instead */\n\n    (void) ngx_delete_dir(path->data);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_ts_hls_delete_file(ngx_tree_ctx_t *ctx, ngx_str_t *path)\n{\n    ngx_log_debug1(NGX_LOG_DEBUG_CORE, ctx->log, 0,\n                   \"ts hls file delete: \\\"%s\\\"\", path->data);\n\n    if (ngx_delete_file(path->data) == NGX_FILE_ERROR) {\n        ngx_log_error(NGX_LOG_CRIT, ctx->log, ngx_errno,\n                      ngx_delete_file_n \" \\\"%s\\\" failed\", path->data);\n    }\n\n    return NGX_OK;\n}\n\n\nchar *\nngx_ts_hls_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf)\n{\n    char  *p = conf;\n\n    ssize_t             max_size;\n    ngx_str_t          *value, s, ss, path;\n    ngx_int_t           v;\n    ngx_uint_t          i, nsegs, clean;\n    ngx_msec_t          min_seg, max_seg, analyze;\n    ngx_ts_hls_conf_t  *hls, **field;\n\n    field = (ngx_ts_hls_conf_t **) (p + cmd->offset);\n\n    if (*field != NGX_CONF_UNSET_PTR) {\n        return \"is duplicate\";\n    }\n\n    value = cf->args->elts;\n\n    ngx_str_null(&path);\n\n    min_seg = 5000;\n    max_seg = 10000;\n    analyze = 0;\n    max_size = 16 * 1024 * 1024;\n    nsegs = 6;\n    clean = 1;\n\n    for (i = 1; i < cf->args->nelts; i++) {\n\n        if (ngx_strncmp(value[i].data, \"path=\", 5) == 0) {\n\n            path.len = value[i].len - 5;\n            path.data = value[i].data + 5;\n\n            if (path.data[path.len - 1] == '/') {\n                path.len--;\n            }\n\n            if (ngx_conf_full_name(cf->cycle, &path, 0) != NGX_OK) {\n                return NGX_CONF_ERROR;\n            }\n\n            continue;\n        }\n\n        if (ngx_strncmp(value[i].data, \"segment=\", 8) == 0) {\n\n            s.len = value[i].len - 8;\n            s.data = value[i].data + 8;\n\n            ss.data = (u_char *) ngx_strchr(s.data, ':');\n\n            if (ss.data) {\n                ss.len = s.data + s.len - ss.data - 1;\n                s.len = ss.data - s.data;\n                ss.data++;\n            }\n\n            min_seg = ngx_parse_time(&s, 0);\n            if (min_seg == (ngx_msec_t) NGX_ERROR) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                   \"invalid segment duration value \\\"%V\\\"\",\n                                   &value[i]);\n                return NGX_CONF_ERROR;\n            }\n\n            if (ss.data) {\n                max_seg = ngx_parse_time(&ss, 0);\n                if (max_seg == (ngx_msec_t) NGX_ERROR) {\n                    ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                       \"invalid segment duration value \\\"%V\\\"\",\n                                       &value[i]);\n                    return NGX_CONF_ERROR;\n                }\n\n            } else {\n                max_seg = min_seg * 2;\n            }\n\n            continue;\n        }\n\n        if (ngx_strncmp(value[i].data, \"analyze=\", 8) == 0) {\n\n            s.len = value[i].len - 8;\n            s.data = value[i].data + 8;\n\n            analyze = ngx_parse_time(&s, 0);\n            if (analyze == (ngx_msec_t) NGX_ERROR) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                   \"invalid analyze duration value \\\"%V\\\"\",\n                                   &value[i]);\n                return NGX_CONF_ERROR;\n            }\n\n            continue;\n        }\n\n        if (ngx_strncmp(value[i].data, \"max_size=\", 9) == 0) {\n\n            s.len = value[i].len - 9;\n            s.data = value[i].data + 9;\n\n            max_size = ngx_parse_size(&s);\n            if (max_size == NGX_ERROR) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                   \"invalid max segment size value \\\"%V\\\"\",\n                                   &value[i]);\n                return NGX_CONF_ERROR;\n            }\n\n            continue;\n        }\n\n        if (ngx_strncmp(value[i].data, \"segments=\", 9) == 0) {\n\n            v = ngx_atoi(value[i].data + 9, value[i].len - 9);\n            if (v == NGX_ERROR) {\n                ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                                   \"invalid segments number value \\\"%V\\\"\",\n                                   &value[i]);\n                return NGX_CONF_ERROR;\n            }\n\n            nsegs = v;\n\n            continue;\n        }\n\n        if (ngx_strcmp(value[i].data, \"noclean\") == 0) {\n            clean = 0;\n            continue;\n        }\n\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                           \"invalid parameter \\\"%V\\\"\", &value[i]);\n        return NGX_CONF_ERROR;\n    }\n\n    if (path.len == 0) {\n        ngx_conf_log_error(NGX_LOG_EMERG, cf, 0,\n                           \"\\\"%V\\\" must have \\\"path\\\" parameter\", &cmd->name);\n        return NGX_CONF_ERROR;\n    }\n\n    hls = ngx_pcalloc(cf->pool, sizeof(ngx_ts_hls_conf_t));\n    if (hls == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    hls->path = ngx_pcalloc(cf->pool, sizeof(ngx_path_t));\n    if (hls->path == NULL) {\n        return NGX_CONF_ERROR;\n    }\n\n    hls->path->name = path;\n\n    hls->min_seg = min_seg;\n    hls->max_seg = max_seg;\n    hls->analyze = analyze ? analyze : min_seg;\n    hls->max_size = max_size;\n    hls->nsegs = nsegs;\n\n    if (clean) {\n        hls->path->manager = ngx_ts_hls_file_manager;\n    }\n\n    hls->path->data = hls;\n    hls->path->conf_file = cf->conf_file->file.name.data;\n    hls->path->line = cf->conf_file->line;\n\n    if (ngx_add_path(cf, &hls->path) != NGX_OK) {\n        return NGX_CONF_ERROR;\n    }\n\n    *field = hls;\n\n    return NGX_CONF_OK;\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-ts-module/src/ngx_ts_hls.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n#include \"ngx_ts_stream.h\"\n\n\n#ifndef _NGX_TS_HLS_H_INCLUDED_\n#define _NGX_TS_HLS_H_INCLUDED_\n\n\ntypedef struct {\n    ngx_path_t            *path;\n    ngx_msec_t             min_seg;\n    ngx_msec_t             max_seg;\n    ngx_msec_t             analyze;\n    size_t                 max_size;\n    ngx_uint_t             nsegs;\n} ngx_ts_hls_conf_t;\n\n\ntypedef struct {\n    ngx_uint_t             id;\n    uint64_t               duration;\n    off_t                  size;\n} ngx_ts_hls_segment_t;\n\n\ntypedef struct {\n    ngx_file_t             file;\n    ngx_chain_t           *prologue;\n\n    ngx_uint_t             bandwidth;\n    ngx_uint_t             bandwidth_bytes;\n    uint64_t               bandwidth_dts;\n\n    ngx_ts_hls_segment_t  *segs;\n    ngx_uint_t             nsegs;\n    ngx_uint_t             seg;\n    uint64_t               seg_dts;\n\n    u_char                *m3u8_path;\n    u_char                *m3u8_tmp_path;\n    ngx_str_t              path;\n\n    ngx_ts_program_t      *prog;\n} ngx_ts_hls_variant_t;\n\n\ntypedef struct {\n    ngx_ts_stream_t       *ts;\n    ngx_ts_hls_conf_t     *conf;\n\n    u_char                *m3u8_path;\n    u_char                *m3u8_tmp_path;\n    ngx_str_t              path;\n\n    ngx_ts_hls_variant_t  *vars;\n    ngx_uint_t             nvars;\n\n    ngx_uint_t             done;  /* unsigned  done:1; */\n} ngx_ts_hls_t;\n\n\nngx_ts_hls_t *ngx_ts_hls_create(ngx_ts_hls_conf_t *conf, ngx_ts_stream_t *ts,\n    ngx_str_t *name);\nchar *ngx_ts_hls_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);\n\n\n#endif /* _NGX_TS_HLS_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-ts-module/src/ngx_ts_stream.c",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n#include \"ngx_ts_stream.h\"\n\n\n#define NGX_TS_PACKET_SIZE  188\n\n\ntypedef struct {\n    ngx_chain_t   *cl;\n    u_char        *p;\n} ngx_ts_byte_read_t;\n\n\ntypedef struct {\n    unsigned       pusi:1;\n    unsigned       cont:4;\n    unsigned       rand:1;\n    unsigned       pcrf:1;\n    unsigned       stuff:1;\n    uint16_t       pid;\n    uint64_t       pcr;\n} ngx_ts_header_t;\n\n\nstatic ngx_int_t ngx_ts_run_handlers(ngx_ts_event_e event, ngx_ts_stream_t *ts,\n    ngx_ts_program_t *prog, ngx_ts_es_t *es, ngx_chain_t *bufs);\nstatic void ngx_ts_byte_read_init(ngx_ts_byte_read_t *br, ngx_chain_t *cl);\nstatic ngx_int_t ngx_ts_byte_read(ngx_ts_byte_read_t *br, u_char *dst,\n    size_t len);\nstatic ngx_int_t ngx_ts_byte_read_skip(ngx_ts_byte_read_t *br, size_t len);\nstatic ngx_int_t ngx_ts_byte_read8(ngx_ts_byte_read_t *br, u_char *v);\nstatic ngx_int_t ngx_ts_byte_read16(ngx_ts_byte_read_t *br, uint16_t *v);\n\nstatic ssize_t ngx_ts_read_header(ngx_ts_stream_t *ts, u_char *p,\n    ngx_ts_header_t *h);\nstatic ngx_int_t ngx_ts_read_packet(ngx_ts_stream_t *ts, ngx_buf_t *b);\nstatic ngx_int_t ngx_ts_read_pat(ngx_ts_stream_t *ts, ngx_ts_header_t *h,\n    ngx_buf_t *b);\nstatic ngx_int_t ngx_ts_read_pmt(ngx_ts_stream_t *ts, ngx_ts_program_t *prog,\n    ngx_ts_header_t *h, ngx_buf_t *b);\nstatic ngx_int_t ngx_ts_read_pes(ngx_ts_stream_t *ts, ngx_ts_program_t *prog,\n    ngx_ts_es_t *es, ngx_ts_header_t *h, ngx_buf_t *b);\nstatic ngx_chain_t *ngx_ts_packetize(ngx_ts_stream_t *ts, ngx_ts_header_t *h,\n    ngx_chain_t *in);\n\nstatic ngx_int_t ngx_ts_free_buf(ngx_ts_stream_t *ts, ngx_buf_t *b);\nstatic ngx_int_t ngx_ts_append_buf(ngx_ts_stream_t *ts, ngx_ts_header_t *h,\n    ngx_chain_t **ll, ngx_buf_t *b);\nstatic uint32_t ngx_ts_crc32(u_char *p, size_t len);\n\n\nstatic uint32_t  ngx_ts_crc32_table_ieee[] = {\n    0x00000000, 0xb71dc104, 0x6e3b8209, 0xd926430d,\n    0xdc760413, 0x6b6bc517, 0xb24d861a, 0x0550471e,\n    0xb8ed0826, 0x0ff0c922, 0xd6d68a2f, 0x61cb4b2b,\n    0x649b0c35, 0xd386cd31, 0x0aa08e3c, 0xbdbd4f38,\n    0x70db114c, 0xc7c6d048, 0x1ee09345, 0xa9fd5241,\n    0xacad155f, 0x1bb0d45b, 0xc2969756, 0x758b5652,\n    0xc836196a, 0x7f2bd86e, 0xa60d9b63, 0x11105a67,\n    0x14401d79, 0xa35ddc7d, 0x7a7b9f70, 0xcd665e74,\n    0xe0b62398, 0x57abe29c, 0x8e8da191, 0x39906095,\n    0x3cc0278b, 0x8bdde68f, 0x52fba582, 0xe5e66486,\n    0x585b2bbe, 0xef46eaba, 0x3660a9b7, 0x817d68b3,\n    0x842d2fad, 0x3330eea9, 0xea16ada4, 0x5d0b6ca0,\n    0x906d32d4, 0x2770f3d0, 0xfe56b0dd, 0x494b71d9,\n    0x4c1b36c7, 0xfb06f7c3, 0x2220b4ce, 0x953d75ca,\n    0x28803af2, 0x9f9dfbf6, 0x46bbb8fb, 0xf1a679ff,\n    0xf4f63ee1, 0x43ebffe5, 0x9acdbce8, 0x2dd07dec,\n    0x77708634, 0xc06d4730, 0x194b043d, 0xae56c539,\n    0xab068227, 0x1c1b4323, 0xc53d002e, 0x7220c12a,\n    0xcf9d8e12, 0x78804f16, 0xa1a60c1b, 0x16bbcd1f,\n    0x13eb8a01, 0xa4f64b05, 0x7dd00808, 0xcacdc90c,\n    0x07ab9778, 0xb0b6567c, 0x69901571, 0xde8dd475,\n    0xdbdd936b, 0x6cc0526f, 0xb5e61162, 0x02fbd066,\n    0xbf469f5e, 0x085b5e5a, 0xd17d1d57, 0x6660dc53,\n    0x63309b4d, 0xd42d5a49, 0x0d0b1944, 0xba16d840,\n    0x97c6a5ac, 0x20db64a8, 0xf9fd27a5, 0x4ee0e6a1,\n    0x4bb0a1bf, 0xfcad60bb, 0x258b23b6, 0x9296e2b2,\n    0x2f2bad8a, 0x98366c8e, 0x41102f83, 0xf60dee87,\n    0xf35da999, 0x4440689d, 0x9d662b90, 0x2a7bea94,\n    0xe71db4e0, 0x500075e4, 0x892636e9, 0x3e3bf7ed,\n    0x3b6bb0f3, 0x8c7671f7, 0x555032fa, 0xe24df3fe,\n    0x5ff0bcc6, 0xe8ed7dc2, 0x31cb3ecf, 0x86d6ffcb,\n    0x8386b8d5, 0x349b79d1, 0xedbd3adc, 0x5aa0fbd8,\n    0xeee00c69, 0x59fdcd6d, 0x80db8e60, 0x37c64f64,\n    0x3296087a, 0x858bc97e, 0x5cad8a73, 0xebb04b77,\n    0x560d044f, 0xe110c54b, 0x38368646, 0x8f2b4742,\n    0x8a7b005c, 0x3d66c158, 0xe4408255, 0x535d4351,\n    0x9e3b1d25, 0x2926dc21, 0xf0009f2c, 0x471d5e28,\n    0x424d1936, 0xf550d832, 0x2c769b3f, 0x9b6b5a3b,\n    0x26d61503, 0x91cbd407, 0x48ed970a, 0xfff0560e,\n    0xfaa01110, 0x4dbdd014, 0x949b9319, 0x2386521d,\n    0x0e562ff1, 0xb94beef5, 0x606dadf8, 0xd7706cfc,\n    0xd2202be2, 0x653deae6, 0xbc1ba9eb, 0x0b0668ef,\n    0xb6bb27d7, 0x01a6e6d3, 0xd880a5de, 0x6f9d64da,\n    0x6acd23c4, 0xddd0e2c0, 0x04f6a1cd, 0xb3eb60c9,\n    0x7e8d3ebd, 0xc990ffb9, 0x10b6bcb4, 0xa7ab7db0,\n    0xa2fb3aae, 0x15e6fbaa, 0xccc0b8a7, 0x7bdd79a3,\n    0xc660369b, 0x717df79f, 0xa85bb492, 0x1f467596,\n    0x1a163288, 0xad0bf38c, 0x742db081, 0xc3307185,\n    0x99908a5d, 0x2e8d4b59, 0xf7ab0854, 0x40b6c950,\n    0x45e68e4e, 0xf2fb4f4a, 0x2bdd0c47, 0x9cc0cd43,\n    0x217d827b, 0x9660437f, 0x4f460072, 0xf85bc176,\n    0xfd0b8668, 0x4a16476c, 0x93300461, 0x242dc565,\n    0xe94b9b11, 0x5e565a15, 0x87701918, 0x306dd81c,\n    0x353d9f02, 0x82205e06, 0x5b061d0b, 0xec1bdc0f,\n    0x51a69337, 0xe6bb5233, 0x3f9d113e, 0x8880d03a,\n    0x8dd09724, 0x3acd5620, 0xe3eb152d, 0x54f6d429,\n    0x7926a9c5, 0xce3b68c1, 0x171d2bcc, 0xa000eac8,\n    0xa550add6, 0x124d6cd2, 0xcb6b2fdf, 0x7c76eedb,\n    0xc1cba1e3, 0x76d660e7, 0xaff023ea, 0x18ede2ee,\n    0x1dbda5f0, 0xaaa064f4, 0x738627f9, 0xc49be6fd,\n    0x09fdb889, 0xbee0798d, 0x67c63a80, 0xd0dbfb84,\n    0xd58bbc9a, 0x62967d9e, 0xbbb03e93, 0x0cadff97,\n    0xb110b0af, 0x060d71ab, 0xdf2b32a6, 0x6836f3a2,\n    0x6d66b4bc, 0xda7b75b8, 0x035d36b5, 0xb440f7b1\n};\n\n\nngx_int_t\nngx_ts_add_handler(ngx_ts_stream_t *ts, ngx_ts_handler_pt handler, void *data)\n{\n    ngx_ts_handler_t  *h;\n\n    h = ngx_palloc(ts->pool, sizeof(ngx_ts_handler_t));\n    if (h == NULL) {\n        return NGX_ERROR;\n    }\n\n    h->handler = handler;\n    h->data = data;\n\n    h->next = ts->handlers;\n    ts->handlers = h;\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_ts_run_handlers(ngx_ts_event_e event, ngx_ts_stream_t *ts,\n    ngx_ts_program_t *prog, ngx_ts_es_t *es, ngx_chain_t *bufs)\n{\n    ngx_ts_handler_t       *h;\n    ngx_ts_handler_data_t   hd;\n\n    hd.event = event;\n    hd.ts = ts;\n    hd.prog = prog;\n    hd.es = es;\n    hd.bufs = bufs;\n\n    for (h = ts->handlers; h; h = h->next) {\n        hd.data = h->data;\n\n        if (h->handler(&hd) != NGX_OK) {\n            return NGX_ERROR;\n        }\n    }\n\n    return NGX_OK;\n}\n\n\nstatic void\nngx_ts_byte_read_init(ngx_ts_byte_read_t *br, ngx_chain_t *cl)\n{\n    br->cl = cl;\n    br->p = cl ? cl->buf->pos : NULL;\n}\n\n\nstatic ngx_int_t\nngx_ts_byte_read(ngx_ts_byte_read_t *br, u_char *dst, size_t len)\n{\n    size_t  n;\n\n    while (br->cl && len) {\n        n = ngx_min((size_t) (br->cl->buf->last - br->p), len);\n\n        if (dst) {\n            dst = ngx_cpymem(dst, br->p, n);\n        }\n\n        br->p += n;\n        len -= n;\n\n        if (br->p == br->cl->buf->last) {\n            br->cl = br->cl->next;\n            br->p = br->cl ? br->cl->buf->pos : NULL;\n        }\n    }\n\n    return len ? NGX_AGAIN : NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_ts_byte_read_skip(ngx_ts_byte_read_t *br, size_t len)\n{\n    return ngx_ts_byte_read(br, NULL, len);\n}\n\n\nstatic ngx_int_t\nngx_ts_byte_read8(ngx_ts_byte_read_t *br, u_char *v)\n{\n    return ngx_ts_byte_read(br, v, 1);\n}\n\n\nstatic ngx_int_t\nngx_ts_byte_read16(ngx_ts_byte_read_t *br, uint16_t *v)\n{\n    if (ngx_ts_byte_read(br, (u_char *) v, 2) == NGX_AGAIN) {\n        return NGX_AGAIN;\n    }\n\n#if (NGX_HAVE_LITTLE_ENDIAN)\n    *v = htons(*v);\n#endif\n\n    return NGX_OK;\n}\n\n\nngx_int_t\nngx_ts_read(ngx_ts_stream_t *ts, ngx_chain_t *in)\n{\n    size_t        n, size;\n    ngx_buf_t    *b;\n    ngx_chain_t  *cl;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ts->log, 0, \"ts read\");\n\n    for (/* void */; in; in = in->next) {\n\n        while (in->buf->pos != in->buf->last) {\n            b = ts->buf;\n\n            if (b == NULL) {\n                if (ts->free) {\n                    cl = ts->free;\n                    ts->free = cl->next;\n\n                    b = cl->buf;\n                    ngx_free_chain(ts->pool, cl);\n\n                    b->pos = b->start;\n                    b->last = b->start;\n\n                } else {\n                    b = ngx_create_temp_buf(ts->pool, NGX_TS_PACKET_SIZE);\n                    if (b == NULL) {\n                        return NGX_ERROR;\n                    }\n                }\n\n                ts->buf = b;\n            }\n\n            n = b->end - b->last;\n            size = in->buf->last - in->buf->pos;\n\n            if (n > size) {\n                n = size;\n            }\n\n            b->last = ngx_cpymem(b->last, in->buf->pos, n);\n            in->buf->pos += n;\n\n            if (b->last == b->end) {\n                if (ngx_ts_read_packet(ts, b) != NGX_OK) {\n                    return NGX_ERROR;\n                }\n\n                ts->buf = NULL;\n            }\n        }\n    }\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_ts_read_packet(ngx_ts_stream_t *ts, ngx_buf_t *b)\n{\n    ssize_t            n;\n    ngx_uint_t         i, j;\n    ngx_chain_t       *cl;\n    ngx_ts_es_t       *es;\n    ngx_ts_header_t    h;\n    ngx_ts_program_t  *prog;\n\n    n = ngx_ts_read_header(ts, b->pos, &h);\n\n    if (n == NGX_ERROR) {\n        return NGX_ERROR;\n    }\n\n    if (n == NGX_DONE) {\n        b->pos = b->last;\n\n    } else {\n        b->pos += n;\n    }\n\n    if (h.pid == 0) {\n        return ngx_ts_read_pat(ts, &h, b);\n    }\n\n    for (i = 0; i < ts->nprogs; i++) {\n        prog = &ts->progs[i];\n\n        if (h.pid == prog->pid) {\n            return ngx_ts_read_pmt(ts, prog, &h, b);\n        }\n\n        for (j = 0; j < prog->nes; j++) {\n            es = &prog->es[j];\n\n            if (h.pid == es->pid) {\n                return ngx_ts_read_pes(ts, prog, es, &h, b);\n            }\n        }\n    }\n\n    ngx_log_error(NGX_LOG_INFO, ts->log, 0,\n                  \"dropping unexpected TS packet pid:0x%04uxd\",\n                  (unsigned) h.pid);\n\n    cl = ngx_alloc_chain_link(ts->pool);\n    if (cl == NULL) {\n        return NGX_ERROR;\n    }\n\n    cl->buf = b;\n    cl->next = ts->free;\n    ts->free = cl;\n\n    return NGX_OK;\n}\n\n\nstatic ssize_t\nngx_ts_read_header(ngx_ts_stream_t *ts, u_char *p, ngx_ts_header_t *h)\n{\n    /*\n     * TS Packet Header\n     * ISO/IEC 13818-1 : 2000 (E)\n     * 2.4.3.2 Transport Stream packet layer, p. 18\n     */\n\n    u_char    alen, afic;\n    ssize_t   n;\n    uint64_t  pcrb, pcre;\n\n    /* sync_byte */\n    if (*p++ != 0x47) {\n        ngx_log_error(NGX_LOG_ERR, ts->log, 0, \"invalid TS sync byte\");\n        return NGX_ERROR;\n    }\n\n    ngx_memzero(h, sizeof(ngx_ts_header_t));\n\n    /* payload_unit_start_indicator */\n    h->pusi = (*p & 0x40) ? 1 : 0;\n\n    /* PID */\n    h->pid = *p++ & 0x1f;\n    h->pid = (h->pid << 8) + *p++;\n\n    /* adaptation_field_control */\n    afic = (*p & 0x30) >> 4;\n\n    /* continuity_counter */\n    h->cont = *p++ & 0x0f;\n\n    if (afic == 0) {\n        ngx_log_error(NGX_LOG_ERR, ts->log, 0, \"invalid TS packet\");\n        return NGX_ERROR;\n    }\n\n    n = 4;\n\n    if (afic & 0x02) {\n        /* adaptation_field_length */\n        alen = *p++;\n\n        if (alen > 183) {\n            ngx_log_error(NGX_LOG_ERR, ts->log, 0,\n                          \"too long TS adaptation field\");\n            return NGX_ERROR;\n        }\n\n        if (afic & 0x01) {\n            n += alen + 1;\n\n        } else {\n            n = NGX_DONE;\n        }\n\n        if (alen) {\n            /* random_access_indicator */\n            h->rand = (*p & 0x40) ? 1 : 0;\n\n            /* PCR_flag */\n            h->pcrf = (*p & 0x10) ? 1 : 0;\n\n            p++;\n\n            if (h->pcrf) {\n                /* program_clock_reference_base */\n                pcrb = *p++;\n                pcrb = (pcrb << 8) + *p++;\n                pcrb = (pcrb << 8) + *p++;\n                pcrb = (pcrb << 8) + *p++;\n                pcrb = (pcrb << 1) + (*p >> 7);\n\n                /* program_clock_reference_extension */\n                pcre = *p++ & 0x01;\n                pcre = (pcre << 8) + *p++;\n\n                h->pcr = pcrb * 300 + pcre;\n            }\n        }\n    }\n\n    ngx_log_debug6(NGX_LOG_DEBUG_CORE, ts->log, 0, \"ts packet \"\n                   \"pid:0x%04uxd, pusi:%d, c:%02d, r:%d, pcr:%uL, n:%uz\",\n                   (unsigned) h->pid, h->pusi, h->cont, h->rand, h->pcr,\n                   n == NGX_DONE ? 0 : NGX_TS_PACKET_SIZE - n);\n\n    return n;\n}\n\n\nstatic ngx_int_t\nngx_ts_read_pat(ngx_ts_stream_t *ts, ngx_ts_header_t *h, ngx_buf_t *b)\n{\n    /*\n     * PAT\n     * ISO/IEC 13818-1 : 2000 (E)\n     * 2.4.4.3 Program association Table, p. 43\n     */\n\n    u_char               ptr;\n    uint16_t             len, number, pid;\n    ngx_uint_t           nprogs, n;\n    ngx_ts_program_t    *prog;\n    ngx_ts_byte_read_t   br, pr;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ts->log, 0, \"ts pat\");\n\n    if (ts->nprogs) {\n        ngx_log_debug0(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                       \"ts dropping successive pat\");\n        return ngx_ts_free_buf(ts, b);\n    }\n\n    if (ngx_ts_append_buf(ts, h, &ts->bufs, b) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    ngx_ts_byte_read_init(&br, ts->bufs);\n\n    /* pointer_field */\n    if (ngx_ts_byte_read8(&br, &ptr) == NGX_AGAIN) {\n        return NGX_OK;\n    }\n\n    /* skipped bytes + table_id */\n    if (ngx_ts_byte_read_skip(&br, ptr + 1) == NGX_AGAIN) {\n        return NGX_OK;\n    }\n\n    /* section_length */\n    if (ngx_ts_byte_read16(&br, &len) == NGX_AGAIN) {\n        return NGX_OK;\n    }\n\n    len &= 0x0fff;\n\n    if (len < 9) {\n        ngx_log_error(NGX_LOG_ERR, ts->log, 0, \"malformed PAT\");\n        return NGX_ERROR;\n    }\n\n    if (len > 0x03fd) {\n        ngx_log_error(NGX_LOG_ERR, ts->log, 0, \"too big PAT: %ud\",\n                      (unsigned) len);\n        return NGX_ERROR;\n    }\n\n    pr = br;\n\n    if (ngx_ts_byte_read_skip(&pr, len) == NGX_AGAIN) {\n        return NGX_OK;\n    }\n\n    /* PAT is fully available */\n\n    /* transport_stream_id .. last_section_number */\n    ngx_ts_byte_read_skip(&br, 5);\n\n    nprogs = (len - 9) / 4;\n\n    ts->progs = ngx_pcalloc(ts->pool,\n                            nprogs * sizeof(ngx_ts_program_t));\n    if (ts->progs == NULL) {\n        return NGX_ERROR;\n    }\n\n    prog = ts->progs;\n\n    for (n = 0; n < nprogs; n++) {\n        /* program_number */\n        (void) ngx_ts_byte_read16(&br, &number);\n\n        /* network_PID / program_map_PID */\n        (void) ngx_ts_byte_read16(&br, &pid);\n\n        if (number) {\n            pid = pid & 0x1fff;\n\n            prog->number = number;\n            prog->pid = pid;\n            prog++;\n\n            ngx_log_debug2(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                           \"ts program %ud, pid:0x%04uxd\",\n                           (unsigned) number, (unsigned) pid);\n        }\n    }\n\n    ts->nprogs = prog - ts->progs;\n\n    if (ngx_ts_run_handlers(NGX_TS_PAT, ts, NULL, NULL, NULL) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    ngx_ts_free_chain(ts, &ts->bufs);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_ts_read_pmt(ngx_ts_stream_t *ts, ngx_ts_program_t *prog, ngx_ts_header_t *h,\n    ngx_buf_t *b)\n{\n    /*\n     * PMT\n     * ISO/IEC 13818-1 : 2000 (E)\n     * 2.4.4.8 Program Map Table, p. 46\n     */\n\n    u_char               ptr, type;\n    uint16_t             len, pilen, elen, pid;\n    ngx_uint_t           nes, n;\n    ngx_ts_es_t         *es;\n    ngx_ts_byte_read_t   br, pr;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ts->log, 0, \"ts pmt\");\n\n    if (prog->nes) {\n        ngx_log_debug0(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                       \"ts dropping successive pmt\");\n        return ngx_ts_free_buf(ts, b);\n    }\n\n    if (ngx_ts_append_buf(ts, h, &prog->bufs, b) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    ngx_ts_byte_read_init(&br, prog->bufs);\n\n    /* pointer_field */\n    if (ngx_ts_byte_read8(&br, &ptr) == NGX_AGAIN) {\n        return NGX_OK;\n    }\n\n    /* skipped bytes + table_id */\n    if (ngx_ts_byte_read_skip(&br, ptr + 1) == NGX_AGAIN) {\n        return NGX_OK;\n    }\n\n    /* section_length */\n    if (ngx_ts_byte_read16(&br, &len) == NGX_AGAIN) {\n        return NGX_OK;\n    }\n\n    len &= 0x0fff;\n\n    if (len < 13) {\n        ngx_log_error(NGX_LOG_ERR, ts->log, 0, \"malformed PMT\");\n        return NGX_ERROR;\n    }\n\n    if (len > 0x03fd) {\n        ngx_log_error(NGX_LOG_ERR, ts->log, 0, \"too big PMT: %ud\",\n                      (unsigned) len);\n        return NGX_ERROR;\n    }\n\n    pr = br;\n\n    if (ngx_ts_byte_read_skip(&pr, len) == NGX_AGAIN) {\n        return NGX_OK;\n    }\n\n    /* PMT is fully available */\n\n    /* program_number .. last_sesion_number */\n    (void) ngx_ts_byte_read_skip(&br, 5);\n\n    /* PCR_PID */\n    (void) ngx_ts_byte_read16(&br, &pid);\n\n    prog->pcr_pid = pid & 0x1fff;\n\n    /* program_info_length */\n    (void) ngx_ts_byte_read16(&br, &pilen);\n\n    pilen &= 0x0fff;\n\n    if (ngx_ts_byte_read_skip(&br, pilen) == NGX_AGAIN\n        || len < 13 + pilen)\n    {\n        ngx_log_error(NGX_LOG_ERR, ts->log, 0, \"malformed PMT\");\n        return NGX_ERROR;\n    }\n\n    len -= 13 + pilen;\n\n    pr = br;\n\n    for (nes = 0; len > 0; nes++) {\n        if (ngx_ts_byte_read(&pr, NULL, 3) == NGX_AGAIN\n            || ngx_ts_byte_read16(&pr, &elen) == NGX_AGAIN\n            || ngx_ts_byte_read(&pr, NULL, elen & 0x0fff) == NGX_AGAIN\n            || len < 5 + (elen & 0x0fff))\n        {\n            ngx_log_error(NGX_LOG_ERR, ts->log, 0, \"malformed PMT\");\n            return NGX_ERROR;\n        }\n\n        len -= 5 + (elen & 0x0fff);\n    }\n\n    es = ngx_pcalloc(ts->pool, nes * sizeof(ngx_ts_es_t));\n    if (es == NULL) {\n        return NGX_ERROR;\n    }\n\n    prog->es = es;\n    prog->nes = nes;\n\n    for (n = 0; n < nes; n++, es++) {\n        /* stream_type */\n        (void) ngx_ts_byte_read8(&br, &type);\n\n        /* elementary_PID */\n        (void) ngx_ts_byte_read16(&br, &pid);\n\n        /* ES_info_length */\n        (void) ngx_ts_byte_read16(&br, &elen);\n\n        /* ES_info */\n        (void) ngx_ts_byte_read_skip(&br, elen & 0x0fff);\n\n        pid = pid & 0x1fff;\n\n        es->type = type;\n        es->pid = pid;\n\n        if (type == NGX_TS_VIDEO_MPEG1\n            || type == NGX_TS_VIDEO_MPEG2\n            || type == NGX_TS_VIDEO_MPEG4\n            || type == NGX_TS_VIDEO_AVC)\n        {\n            es->video = 1;\n            prog->video = 1;\n        }\n\n        ngx_log_debug3(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                       \"ts es type:%ui, video:%d, pid:0x%04uxd\",\n                       (ngx_uint_t) type, es->video, (unsigned) pid);\n    }\n\n    if (ngx_ts_run_handlers(NGX_TS_PMT, ts, prog, NULL, NULL) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    ngx_ts_free_chain(ts, &prog->bufs);\n\n    return NGX_OK;\n}\n\n\nstatic ngx_int_t\nngx_ts_read_pes(ngx_ts_stream_t *ts, ngx_ts_program_t *prog, ngx_ts_es_t *es,\n    ngx_ts_header_t *h, ngx_buf_t *b)\n{\n    /*\n     * PES Packet\n     * ISO/IEC 13818-1 : 2000 (E)\n     * 2.4.3.6 PES packet, p. 31\n     */\n\n    u_char              sid, pfx[3], v8, hlen;\n    uint16_t            len, flags, v16;\n    uint64_t            pts, dts;\n    ngx_uint_t          ptsf;\n    ngx_ts_byte_read_t  br, pr;\n\n    ngx_log_debug0(NGX_LOG_DEBUG_CORE, ts->log, 0, \"ts pes\");\n\n    if (es->bufs && h->pusi && b) {\n        if (ngx_ts_read_pes(ts, prog, es, h, NULL) != NGX_OK) {\n            return NGX_ERROR;\n        }\n    }\n\n    if (es->bufs == NULL) {\n        es->rand = h->rand;\n    }\n\n    if (h->pcrf && prog->pcr_pid == es->pid) {\n        prog->pcr = h->pcr;\n    }\n\n    if (ngx_ts_append_buf(ts, h, &es->bufs, b) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    ngx_ts_byte_read_init(&br, es->bufs);\n\n    /* packet_start_code_prefix */\n    if (ngx_ts_byte_read(&br, pfx, 3) == NGX_AGAIN) {\n        return NGX_OK;\n    }\n\n    if (pfx[0] != 0 || pfx[1] != 0 || pfx[2] != 1) {\n        ngx_log_error(NGX_LOG_INFO, ts->log, 0, \"missing PES start prefix\");\n        return NGX_ERROR;\n    }\n\n    /* stream_id */\n    if (ngx_ts_byte_read8(&br, &sid) == NGX_AGAIN) {\n        return NGX_OK;\n    }\n\n    es->sid = sid;\n\n    /* PES_packet_length */\n    if (ngx_ts_byte_read16(&br, &len) == NGX_AGAIN) {\n        return NGX_OK;\n    }\n\n    if (len) {\n        pr = br;\n\n        if (ngx_ts_byte_read_skip(&pr, len) == NGX_AGAIN) {\n            return NGX_OK;\n        }\n\n    } else if (b) {\n        /* wait for PUSI */\n        return NGX_OK;\n    }\n\n    /* PES is fully available */\n\n    if (sid == 0xbe) {  /* padding_stream */\n        ngx_ts_free_chain(ts, &es->bufs);\n        return NGX_OK;\n    }\n\n    ptsf = 0;\n\n    if (sid != 0xbc     /* program_stream_map */\n        && sid != 0xbf  /* private_stream_2 */\n        && sid != 0xf0  /* ECM_stream */\n        && sid != 0xf1  /* EMM_stream */\n        && sid != 0xff  /* program_stream_directory */\n        && sid != 0xf2  /* DSMCC_stream */\n        && sid != 0xf8) /* ITU-T Rec. H.222.1 type E stream */\n    {\n        /* PES_scrambling_control .. PES_extension_flag */\n        if (ngx_ts_byte_read16(&br, &flags) == NGX_AGAIN) {\n            return NGX_OK;\n        }\n\n        /* PES_header_data_length */\n        if (ngx_ts_byte_read8(&br, &hlen) == NGX_AGAIN) {\n            return NGX_OK;\n        }\n\n        if (len) {\n            if (len < 3 + hlen) {\n                ngx_log_error(NGX_LOG_INFO, ts->log, 0, \"malformed PES\");\n                return NGX_ERROR;\n            }\n\n            len -= 3 + hlen;\n        }\n\n        pr = br;\n\n        if (ngx_ts_byte_read_skip(&br, hlen) == NGX_AGAIN) {\n            return NGX_OK;\n        }\n\n        if ((flags & 0x00c0) == 0x0080) { /* PTS_DTS_flags == '10' */\n            ptsf = 1;\n\n            /* PTS[32..30] */\n            if (ngx_ts_byte_read8(&pr, &v8) == NGX_AGAIN) {\n                return NGX_OK;\n            }\n\n            pts = (uint64_t) (v8 & 0x0e) << 29;\n\n            /* PTS[29..15] */\n            if (ngx_ts_byte_read16(&pr, &v16) == NGX_AGAIN) {\n                return NGX_OK;\n            }\n\n            pts |= (uint64_t) (v16 & 0xfffe) << 14;\n\n            /* PTS[14..0] */\n            if (ngx_ts_byte_read16(&pr, &v16) == NGX_AGAIN) {\n                return NGX_OK;\n            }\n\n            pts |= v16 >> 1;\n\n            es->pts = pts;\n            es->dts = pts;\n\n            ngx_log_debug1(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                           \"ts pes pts:%uL\", pts);\n        }\n\n        if ((flags & 0x00c0) == 0x00c0) { /* PTS_DTS_flags == '11' */\n            ptsf = 1;\n\n            /* PTS[32..30] */\n            if (ngx_ts_byte_read8(&pr, &v8) == NGX_AGAIN) {\n                return NGX_OK;\n            }\n\n            pts = (uint64_t) (v8 & 0x0e) << 29;\n\n            /* PTS[29..15] */\n            if (ngx_ts_byte_read16(&pr, &v16) == NGX_AGAIN) {\n                return NGX_OK;\n            }\n\n            pts |= (uint64_t) (v16 & 0xfffe) << 14;\n\n            /* PTS[14..0] */\n            if (ngx_ts_byte_read16(&pr, &v16) == NGX_AGAIN) {\n                return NGX_OK;\n            }\n\n            pts |= v16 >> 1;\n\n            /* DTS[32..30] */\n            if (ngx_ts_byte_read8(&pr, &v8) == NGX_AGAIN) {\n                return NGX_OK;\n            }\n\n            dts = (uint64_t) (v8 & 0x0e) << 29;\n\n            /* DTS[29..15] */\n            if (ngx_ts_byte_read16(&pr, &v16) == NGX_AGAIN) {\n                return NGX_OK;\n            }\n\n            dts |= (uint64_t) (v16 & 0xfffe) << 14;\n\n            /* DTS[14..0] */\n            if (ngx_ts_byte_read16(&pr, &v16) == NGX_AGAIN) {\n                return NGX_OK;\n            }\n\n            dts |= v16 >> 1;\n\n            es->pts = pts;\n            es->dts = dts;\n\n            ngx_log_debug2(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                           \"ts pes pts:%uL, dts:%uL\", pts, dts);\n        }\n    }\n\n    if (br.cl) {\n        br.cl->buf->pos = br.p;\n    }\n\n    if (len) {\n        pr = br;\n\n        if (ngx_ts_byte_read_skip(&pr, len) == NGX_AGAIN) {\n            return NGX_OK;\n        }\n\n        if (pr.cl) {\n            pr.cl->buf->last = pr.p;\n        }\n    }\n\n    es->ptsf = ptsf;\n\n    if (ngx_ts_run_handlers(NGX_TS_PES, ts, prog, es, br.cl) != NGX_OK) {\n        return NGX_ERROR;\n    }\n\n    ngx_ts_free_chain(ts, &es->bufs);\n\n    return NGX_OK;\n}\n\n\nngx_chain_t *\nngx_ts_write_pat(ngx_ts_stream_t *ts, ngx_ts_program_t *prog)\n{\n    size_t            len;\n    u_char           *p, *data;\n    uint32_t          crc;\n    ngx_buf_t         b;\n    ngx_uint_t        n, nprogs;\n    ngx_chain_t       in;\n    ngx_ts_header_t   h;\n\n    if (prog) {\n        nprogs = 1;\n\n    } else {\n        nprogs = ts->nprogs;\n        prog = ts->progs;\n    }\n\n    len = 9 + nprogs * 4;\n\n    data = ngx_pnalloc(ts->pool, 4 + len);\n    if (data == NULL) {\n        return NULL;\n    }\n\n    p = data;\n\n    /* pointer_field */\n    *p++ = 0;\n\n    /* table_id */\n    *p++ = 0;\n\n    /* section_syntax_indicator, section_length */\n    *p++ = 0x80 | (u_char) (len >> 8);\n    *p++ = (u_char) len;\n\n    /* transport_stream_id */\n    *p++ = 0;\n    *p++ = 0;\n\n    /* version_number, current_next_indicator */\n    *p++ = 0x01;\n\n    /* section_number */\n    *p++ = 0;\n\n    /* last_section_number */\n    *p++ = 0;\n\n    for (n = 0; n < nprogs; n++, prog++) {\n        /* program_number */\n        *p++ = (u_char) (prog->number >> 8);\n        *p++ = (u_char) prog->number;\n\n        /* program_map_PID */\n        *p++ = (u_char) (prog->pid >> 8);\n        *p++ = (u_char) prog->pid;\n    }\n\n    crc = ngx_ts_crc32(data + 1, p - data - 1);\n\n    *p++ = (u_char) crc;\n    *p++ = (u_char) (crc >> 8);\n    *p++ = (u_char) (crc >> 16);\n    *p++ = (u_char) (crc >> 24);\n\n    ngx_memzero(&b, sizeof(ngx_buf_t));\n\n    b.start = data;\n    b.pos = data;\n    b.last = p;\n    b.end = p;\n\n    in.buf = &b;\n    in.next = NULL;\n\n    ngx_memzero(&h, sizeof(ngx_ts_header_t));\n\n    return ngx_ts_packetize(ts, &h, &in);\n}\n\n\nngx_chain_t *\nngx_ts_write_pmt(ngx_ts_stream_t *ts, ngx_ts_program_t *prog)\n{\n    size_t            len;\n    u_char           *p, *data;\n    uint32_t          crc;\n    ngx_buf_t         b;\n    ngx_uint_t        n;\n    ngx_chain_t       in;\n    ngx_ts_es_t      *es;\n    ngx_ts_header_t   h;\n\n    len = 13 + 5 * prog->nes;\n\n    data = ngx_pnalloc(ts->pool, 4 + len);\n    if (data == NULL) {\n        return NULL;\n    }\n\n    p = data;\n\n    /* pointer_field */\n    *p++ = 0;\n\n    /* table_id */\n    *p++ = 0x02;\n\n    /* section_syntax_indicator */\n    *p++ = 0x80 | (u_char) (len >> 8);\n    *p++ = (u_char) len;\n    \n    /* program_number */\n    *p++ = (u_char) (prog->number >> 8);\n    *p++ = (u_char) prog->number;\n\n    /* version_number, current_next_indicator */\n    *p++ = 0x01;\n\n    /* section_number */\n    *p++ = 0;\n\n    /* last_section_number */\n    *p++ = 0;\n\n    /* PCR_PID */\n    *p++ = (u_char) (prog->pcr_pid >> 8);\n    *p++ = (u_char) prog->pcr_pid;\n\n    /* program_info_length */\n    *p++ = 0;\n    *p++ = 0;\n\n    for (n = 0; n < prog->nes; n++) {\n        es = &prog->es[n];\n\n        /* stream_type */\n        *p++ = es->type;\n\n        /* elementary_PID */\n        *p++ = (u_char) (es->pid >> 8);\n        *p++ = (u_char) es->pid;\n\n        /* ES_info_length */\n        *p++ = 0;\n        *p++ = 0;\n    }\n\n    crc = ngx_ts_crc32(data + 1, p - data - 1);\n\n    *p++ = (u_char) crc;\n    *p++ = (u_char) (crc >> 8);\n    *p++ = (u_char) (crc >> 16);\n    *p++ = (u_char) (crc >> 24);\n\n    ngx_memzero(&b, sizeof(ngx_buf_t));\n\n    b.start = data;\n    b.pos = data;\n    b.last = p;\n    b.end = p;\n\n    in.buf = &b;\n    in.next = NULL;\n\n    ngx_memzero(&h, sizeof(ngx_ts_header_t));\n\n    h.pid = prog->pid;\n\n    return ngx_ts_packetize(ts, &h, &in);\n}\n\n\nngx_chain_t *\nngx_ts_write_pes(ngx_ts_stream_t *ts, ngx_ts_program_t *prog, ngx_ts_es_t *es,\n    ngx_chain_t *bufs)\n{\n    size_t            len;\n    u_char           *p, *plen, *phflags, *phlen;\n    ngx_buf_t         b;\n    ngx_chain_t       in, *cl, *out;\n    ngx_ts_header_t   h;\n    u_char            buf[19];\n\n    p = buf;\n\n    /* packet_start_code_prefix */\n    *p++ = 0;\n    *p++ = 0;\n    *p++ = 1;\n\n    /* stream_id */\n    *p++ = es->sid;\n\n    /* PES_packet_length */\n    plen = p;\n    *p++ = 0;\n    *p++ = 0;\n\n    if (es->sid != 0xbc     /* program_stream_map */\n        && es->sid != 0xbe  /* padding_stream */\n        && es->sid != 0xbf  /* private_stream_2 */\n        && es->sid != 0xf0  /* ECM_stream */\n        && es->sid != 0xf1  /* EMM_stream */\n        && es->sid != 0xff  /* program_stream_directory */\n        && es->sid != 0xf2  /* DSMCC_stream */\n        && es->sid != 0xf8) /* ITU-T Rec. H.222.1 type E stream */\n    {\n        /* PES_scrambling_control .. original_or_copy */\n        *p++ = 0x80;\n\n        /* XXX ptsf */\n\n        /* PTS_DTS_flags .. PES_extension_flag */\n        phflags = p;\n        *p++ = 0;\n\n        /* PES_header_data_lenth */\n        phlen = p;\n        *p++ = 0;\n\n        if (es->pts == es->dts) {\n            *phlen += 5;\n            *phflags |= 0x80;\n\n            /* PTS */\n            *p++ = 0x21 | (u_char) ((es->pts >> 29) & 0x0e);\n            *p++ = (u_char) (es->pts >> 22);\n            *p++ = 0x01 | (u_char) (es->pts >> 14);\n            *p++ = (u_char) (es->pts >> 7);\n            *p++ = 0x01 | (u_char) (es->pts << 1);\n\n        } else {\n            *phlen += 10;\n            *phflags |= 0xc0;\n\n            /* PTS */\n            *p++ = 0x31 | (u_char) ((es->pts >> 29) & 0x0e);\n            *p++ = (u_char) (es->pts >> 22);\n            *p++ = 0x01 | (u_char) (es->pts >> 14);\n            *p++ = (u_char) (es->pts >> 7);\n            *p++ = 0x01 | (u_char) (es->pts << 1);\n\n            /* DTS */\n            *p++ = 0x11 | (u_char) ((es->dts >> 29) & 0x0e);\n            *p++ = (u_char) (es->dts >> 22);\n            *p++ = 0x01 | (u_char) (es->dts >> 14);\n            *p++ = (u_char) (es->dts >> 7);\n            *p++ = 0x01 | (u_char) (es->dts << 1);\n        }\n    }\n\n    len = p - plen - 2;\n    for (cl = bufs; cl; cl = cl->next) {\n        len += cl->buf->last - cl->buf->pos;\n    }\n\n    if (len <= 0xffff) {\n        *plen++ = (u_char) (len >> 8);\n        *plen++ = (u_char) len;\n    }\n\n    ngx_memzero(&b, sizeof(ngx_buf_t));\n\n    b.start = buf;\n    b.pos = buf;\n    b.last = p;\n    b.end = p;\n\n    in.buf = &b;\n    in.next = bufs;\n\n    ngx_memzero(&h, sizeof(ngx_ts_header_t));\n\n    h.pid = es->pid;\n    h.rand = es->rand;\n    h.cont = es->cont;\n    h.stuff = 1;\n\n    if (prog->pcr_pid == es->pid) {\n        h.pcrf = 1;\n        h.pcr = prog->pcr;\n    }\n\n    out = ngx_ts_packetize(ts, &h, &in);\n    if (out == NULL) {\n        return NULL;\n    }\n\n    es->cont = h.cont;\n\n    return out;\n}\n\n\nstatic ngx_chain_t *\nngx_ts_packetize(ngx_ts_stream_t *ts, ngx_ts_header_t *h, ngx_chain_t *in)\n{\n    u_char       *p, *ip, *af, *aflen;\n    size_t        n, left;\n    uint64_t      pcrb, pcre;\n    ngx_buf_t    *b;\n    ngx_chain_t  *out, *cl, **ll;\n\n    left = 0;\n\n    for (cl = in; cl; cl = cl->next) {\n        left += cl->buf->last - cl->buf->pos;\n    }\n\n    ip = in->buf->pos;\n\n    ll = &out;\n\n    do {\n        if (ts->free) {\n            cl = ts->free;\n            ts->free = cl->next;\n            b = cl->buf;\n\n        } else {\n            ngx_log_debug1(NGX_LOG_DEBUG_CORE, ts->log, 0,\n                           \"ts alloc buffer:%d\", NGX_TS_PACKET_SIZE);\n\n            b = ngx_create_temp_buf(ts->pool, NGX_TS_PACKET_SIZE);\n            if (b == NULL) {\n                return NULL;\n            }\n\n            cl = ngx_alloc_chain_link(ts->pool);\n            if (cl == NULL) {\n                return NULL;\n            }\n\n            cl->buf = b;\n        }\n\n        b->pos = b->start;\n        b->last = b->end;\n\n        p = b->pos;\n\n        /* sync_byte */\n        *p++ = 0x47;\n\n        /* payload_unit_start_indicator, PID */\n        *p++ = (ll == &out ? 0x40 : 0x00) | (u_char) (h->pid >> 8);\n        *p++ = (u_char) h->pid;\n\n        /* payload_present, continuity_counter */\n        af = p;\n        *p++ = 0x10 | h->cont;\n        h->cont = (h->cont + 1) & 0x0f;\n\n        if (h->rand || h->pcrf || (h->stuff && left < 184)) {\n            /* adaptation_field_control */\n            *af |= 0x20;\n\n            /* adaptation_field_length */\n            aflen = p;\n            *p++ = 1;\n\n            /* random_access_indicator, PCR_flag */\n            *p++ = (h->rand ? 0x40 : 0x00) | (h->pcrf ? 0x10 : 0x00);\n\n            if (h->pcrf) {\n                pcrb = h->pcr / 300;\n                pcre = h->pcr % 300;\n\n                /*\n                 * program_clock_reference_base,\n                 * program_clock_reference_extension\n                 */\n                *p++ = (u_char) (pcrb >> 25);\n                *p++ = (u_char) (pcrb >> 17);\n                *p++ = (u_char) (pcrb >> 9);\n                *p++ = (u_char) (pcrb >> 1);\n                *p++ = (u_char) (pcrb << 7) | (u_char) ((pcre >> 8) & 0x01);\n                *p++ = (u_char) pcre;\n\n                *aflen += 6;\n            }\n\n            if (h->stuff && left < (size_t) (b->end - p)) {\n                n = b->end - p - left;\n\n                /* stuffing_byte */\n                ngx_memset(p, '\\xff', n);\n                p += n;\n                *aflen += n;\n            }\n        }\n\n        /* data_byte */\n\n        while (p != b->end) {\n            n = ngx_min(in->buf->last - ip, b->end - p);\n\n            p = ngx_cpymem(p, ip, n);\n\n            left -= n;\n            ip += n;\n\n            if (ip == in->buf->last) {\n                in = in->next;\n                if (in == NULL) {\n                    ngx_memset(p, '\\xff', b->end - p);\n                    break;\n                }\n\n                ip = in->buf->pos;\n            }\n        }\n\n        h->rand = 0;\n        h->pcrf = 0;\n\n        *ll = cl;\n        ll = &cl->next;\n\n    } while (in);\n\n    *ll = NULL;\n\n    return out;\n}\n\n\nstatic ngx_int_t\nngx_ts_free_buf(ngx_ts_stream_t *ts, ngx_buf_t *b)\n{\n    ngx_chain_t  *cl;\n\n    cl = ngx_alloc_chain_link(ts->pool);\n    if (cl == NULL) {\n        return NGX_ERROR;\n    }\n\n    cl->buf = b;\n    cl->next = ts->free;\n    ts->free = cl;\n\n    return NGX_OK;\n}\n\n\nvoid\nngx_ts_free_chain(ngx_ts_stream_t *ts, ngx_chain_t **ll)\n{\n    ngx_chain_t  **fl;\n\n    if (*ll == NULL) {\n        return;\n    }\n\n    fl = ll;\n\n    while (*ll) {\n        ll = &(*ll)->next;\n    }\n\n    *ll = ts->free;\n    ts->free = *fl;\n\n    *fl = NULL;\n}\n\n\nstatic ngx_int_t\nngx_ts_append_buf(ngx_ts_stream_t *ts, ngx_ts_header_t *h, ngx_chain_t **ll,\n    ngx_buf_t *b)\n{\n    ngx_chain_t  *cl;\n\n    if (b == NULL) {\n        return NGX_OK;\n    }\n\n    if (!h->pusi && *ll == NULL) {\n        ngx_log_error(NGX_LOG_INFO, ts->log, 0, \"dropping orhaned TS packet\");\n        return ngx_ts_free_buf(ts, b);\n    }\n\n    if (h->pusi && *ll) {\n        ngx_log_error(NGX_LOG_INFO, ts->log, 0,\n                      \"dropping unfinished TS packets\");\n        ngx_ts_free_chain(ts, ll);\n    }\n\n    while (*ll) {\n        ll = &(*ll)->next;\n    }\n\n    cl = ngx_alloc_chain_link(ts->pool);\n    if (cl == NULL) {\n        return NGX_ERROR;\n    }\n\n    cl->buf = b;\n    cl->next = NULL;\n\n    *ll = cl;\n\n    return NGX_OK;\n}\n\n\nstatic uint32_t\nngx_ts_crc32(u_char *p, size_t len)\n{\n    uint32_t  crc;\n\n    crc = 0xffffffff;\n\n    while (len--) {\n        crc = ngx_ts_crc32_table_ieee[(crc ^ *p++) & 0xff] ^ (crc >> 8);\n    }\n\n    return crc;\n}\n\n\nngx_uint_t\nngx_ts_dash_get_oti(u_char type)\n{\n    /*\n     * ISO/IEC 14496-1:2001(E)\n     * Table 8 - objectTypeIndication Values, p. 30\n     */\n\n    switch (type) {\n    case NGX_TS_VIDEO_MPEG1:\n        return 0x6a;\n\n    case NGX_TS_VIDEO_MPEG2:\n        /* treat as Main Profile */\n        return 0x61;\n\n    case NGX_TS_VIDEO_MPEG4:\n        return 0x20;\n\n    case NGX_TS_VIDEO_AVC:\n        return 0x21;\n\n    case NGX_TS_AUDIO_MPEG1:\n        return 0x6b;\n\n    case NGX_TS_AUDIO_MPEG2:\n        return 0x69;\n\n    case NGX_TS_AUDIO_AAC:\n        /* consider as ISO/IEC 14496-3 Audio */\n        return 0x40;\n\n    default:\n        return 0;\n    }\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/modules/nginx-ts-module/src/ngx_ts_stream.h",
    "content": "\n/*\n * Copyright (C) Roman Arutyunyan\n */\n\n\n#include <ngx_config.h>\n#include <ngx_core.h>\n\n\n#ifndef _NGX_TS_STREAM_H_INCLUDED_\n#define _NGX_TS_STREAM_H_INCLUDED_\n\n\n/*\n * ISO/IEC 13818-1 : 2000 (E)\n * Table 2-29 – Stream type assignments, p. 48\n *\n * ISO/IEC 13818-1:2007/Amd.3:2009 (E)\n * Table 2-34 – Stream type assignments, p. 6\n */\n\n#define NGX_TS_VIDEO_MPEG1     0x01 /* ISO/IEC 11172-2, MPEG-1 Video */\n#define NGX_TS_VIDEO_MPEG2     0x02 /* ISO/IEC 13818-2, MPEG-2 Video */\n#define NGX_TS_VIDEO_MPEG4     0x10 /* ISO/IEC 14496-2, MPEG-4 Video */\n#define NGX_TS_VIDEO_AVC       0x1b /* ISO/IEC 14496-10, AVC */\n\n#define NGX_TS_AUDIO_MPEG1     0x03 /* ISO/IEC 11172-3, MPEG-1 Audio */\n#define NGX_TS_AUDIO_MPEG2     0x04 /* ISO/IEC 13818-3, MPEG-2 Audio */\n#define NGX_TS_AUDIO_AAC       0x0f /* ISO/IEC 13818-7, MPEG-2 AAC ADTS Audio */\n\n\ntypedef enum {\n    NGX_TS_PAT = 0,\n    NGX_TS_PMT,\n    NGX_TS_PES\n} ngx_ts_event_e;\n\n\ntypedef struct {\n    u_char                        type;\n    u_char                        sid;\n    u_char                        cont;\n    uint16_t                      pid;\n    uint64_t                      pts;\n    uint64_t                      dts;\n    unsigned                      ptsf:1;\n    unsigned                      rand:1;\n    unsigned                      video:1;\n    ngx_chain_t                  *bufs;  /* ES */\n} ngx_ts_es_t;\n\n\ntypedef struct {\n    uint16_t                      number;\n    uint16_t                      pid;\n    uint16_t                      pcr_pid;\n    uint64_t                      pcr;\n    ngx_uint_t                    video;  /* unisgned  video:1; */\n    ngx_uint_t                    nes;\n    ngx_ts_es_t                  *es;\n    ngx_chain_t                  *bufs;  /* PMT */\n} ngx_ts_program_t;\n\n\ntypedef struct ngx_ts_handler_s  ngx_ts_handler_t;\n\n\ntypedef struct {\n    ngx_uint_t                    nprogs;\n    ngx_ts_program_t             *progs;\n    ngx_log_t                    *log;\n    ngx_pool_t                   *pool;\n    ngx_buf_t                    *buf;\n    ngx_chain_t                  *free;\n    ngx_chain_t                  *bufs;  /* PAT */\n    ngx_ts_handler_t             *handlers;\n    void                         *data;\n} ngx_ts_stream_t;\n\n\ntypedef struct {\n    ngx_ts_event_e                event;\n    ngx_ts_stream_t              *ts;\n    ngx_ts_program_t             *prog;\n    ngx_ts_es_t                  *es;\n    ngx_chain_t                  *bufs;\n    void                         *data;\n} ngx_ts_handler_data_t;\n\n\ntypedef ngx_int_t (*ngx_ts_handler_pt)(ngx_ts_handler_data_t *hd);\n\n\nstruct ngx_ts_handler_s {\n    ngx_ts_handler_pt             handler;\n    void                         *data;\n    ngx_ts_handler_t             *next;\n};\n\n\nngx_int_t ngx_ts_add_handler(ngx_ts_stream_t *ts, ngx_ts_handler_pt handler,\n    void *data);\nngx_int_t ngx_ts_read(ngx_ts_stream_t *ts, ngx_chain_t *in);\nngx_chain_t *ngx_ts_write_pat(ngx_ts_stream_t *ts, ngx_ts_program_t *prog);\nngx_chain_t *ngx_ts_write_pmt(ngx_ts_stream_t *ts, ngx_ts_program_t *prog);\nngx_chain_t *ngx_ts_write_pes(ngx_ts_stream_t *ts, ngx_ts_program_t *prog,\n    ngx_ts_es_t *es, ngx_chain_t *bufs);\nvoid ngx_ts_free_chain(ngx_ts_stream_t *ts, ngx_chain_t **ll);\nngx_uint_t ngx_ts_dash_get_oti(u_char type);\n\n\n#endif /* _NGX_TS_STREAM_H_INCLUDED_ */\n"
  },
  {
    "path": "luci-app-nginx-pingos/patches/101-feature_test_fix.patch",
    "content": "--- a/auto/cc/name\n+++ b/auto/cc/name\n@@ -7,7 +7,7 @@ if [ \"$NGX_PLATFORM\" != win32 ]; then\n \n     ngx_feature=\"C compiler\"\n     ngx_feature_name=\n-    ngx_feature_run=yes\n+    ngx_feature_run=\n     ngx_feature_incs=\n     ngx_feature_path=\n     ngx_feature_libs=\n--- a/auto/cc/conf\n+++ b/auto/cc/conf\n@@ -183,7 +183,7 @@ if [ \"$NGX_PLATFORM\" != win32 ]; then\n     else\n         ngx_feature=\"gcc builtin atomic operations\"\n         ngx_feature_name=NGX_HAVE_GCC_ATOMIC\n-        ngx_feature_run=yes\n+        ngx_feature_run=no\n         ngx_feature_incs=\n         ngx_feature_path=\n         ngx_feature_libs=\n@@ -204,7 +204,7 @@ if [ \"$NGX_PLATFORM\" != win32 ]; then\n     else\n         ngx_feature=\"C99 variadic macros\"\n         ngx_feature_name=\"NGX_HAVE_C99_VARIADIC_MACROS\"\n-        ngx_feature_run=yes\n+        ngx_feature_run=no\n         ngx_feature_incs=\"#include <stdio.h>\n #define var(dummy, ...)  sprintf(__VA_ARGS__)\"\n         ngx_feature_path=\n@@ -218,7 +218,7 @@ if [ \"$NGX_PLATFORM\" != win32 ]; then\n \n     ngx_feature=\"gcc variadic macros\"\n     ngx_feature_name=\"NGX_HAVE_GCC_VARIADIC_MACROS\"\n-    ngx_feature_run=yes\n+    ngx_feature_run=no\n     ngx_feature_incs=\"#include <stdio.h>\n #define var(dummy, args...)  sprintf(args)\"\n     ngx_feature_path=\n--- a/auto/os/linux\n+++ b/auto/os/linux\n@@ -36,7 +36,7 @@ fi\n \n ngx_feature=\"epoll\"\n ngx_feature_name=\"NGX_HAVE_EPOLL\"\n-ngx_feature_run=yes\n+ngx_feature_run=no\n ngx_feature_incs=\"#include <sys/epoll.h>\"\n ngx_feature_path=\n ngx_feature_libs=\n@@ -110,7 +110,7 @@ ngx_feature_test=\"int fd; struct stat sb\n CC_AUX_FLAGS=\"$cc_aux_flags -D_GNU_SOURCE\"\n ngx_feature=\"sendfile()\"\n ngx_feature_name=\"NGX_HAVE_SENDFILE\"\n-ngx_feature_run=yes\n+ngx_feature_run=no\n ngx_feature_incs=\"#include <sys/sendfile.h>\n                   #include <errno.h>\"\n ngx_feature_path=\n@@ -131,7 +131,7 @@ fi\n CC_AUX_FLAGS=\"$cc_aux_flags -D_GNU_SOURCE -D_FILE_OFFSET_BITS=64\"\n ngx_feature=\"sendfile64()\"\n ngx_feature_name=\"NGX_HAVE_SENDFILE64\"\n-ngx_feature_run=yes\n+ngx_feature_run=no\n ngx_feature_incs=\"#include <sys/sendfile.h>\n                   #include <errno.h>\"\n ngx_feature_path=\n@@ -149,7 +149,7 @@ ngx_include=\"sys/prctl.h\"; . auto/includ\n \n ngx_feature=\"prctl(PR_SET_DUMPABLE)\"\n ngx_feature_name=\"NGX_HAVE_PR_SET_DUMPABLE\"\n-ngx_feature_run=yes\n+ngx_feature_run=no\n ngx_feature_incs=\"#include <sys/prctl.h>\"\n ngx_feature_path=\n ngx_feature_libs=\n--- a/auto/unix\n+++ b/auto/unix\n@@ -840,7 +840,7 @@ ngx_feature_test=\"void *p; p = memalign(\n \n ngx_feature=\"mmap(MAP_ANON|MAP_SHARED)\"\n ngx_feature_name=\"NGX_HAVE_MAP_ANON\"\n-ngx_feature_run=yes\n+ngx_feature_run=no\n ngx_feature_incs=\"#include <sys/mman.h>\"\n ngx_feature_path=\n ngx_feature_libs=\n@@ -853,7 +853,7 @@ ngx_feature_test=\"void *p;\n \n ngx_feature='mmap(\"/dev/zero\", MAP_SHARED)'\n ngx_feature_name=\"NGX_HAVE_MAP_DEVZERO\"\n-ngx_feature_run=yes\n+ngx_feature_run=no\n ngx_feature_incs=\"#include <sys/mman.h>\n                   #include <sys/stat.h>\n                   #include <fcntl.h>\"\n@@ -868,7 +868,7 @@ ngx_feature_test='void *p; int  fd;\n \n ngx_feature=\"System V shared memory\"\n ngx_feature_name=\"NGX_HAVE_SYSVSHM\"\n-ngx_feature_run=yes\n+ngx_feature_run=no\n ngx_feature_incs=\"#include <sys/ipc.h>\n                   #include <sys/shm.h>\"\n ngx_feature_path=\n@@ -882,7 +882,7 @@ ngx_feature_test=\"int  id;\n \n ngx_feature=\"POSIX semaphores\"\n ngx_feature_name=\"NGX_HAVE_POSIX_SEM\"\n-ngx_feature_run=yes\n+ngx_feature_run=no\n ngx_feature_incs=\"#include <semaphore.h>\"\n ngx_feature_path=\n ngx_feature_libs=\n"
  },
  {
    "path": "luci-app-nginx-pingos/patches/102-sizeof_test_fix.patch",
    "content": "--- a/auto/types/sizeof\n+++ b/auto/types/sizeof\n@@ -25,8 +25,14 @@ $NGX_INCLUDE_UNISTD_H\n $NGX_INCLUDE_INTTYPES_H\n $NGX_INCLUDE_AUTO_CONFIG_H\n \n+char object_code_block[] = {\n+\t'\\n', 'e', '4', 'V', 'A',\n+\t'0', 'x', ('0' + sizeof($ngx_type)),\n+\t'Y', '3', 'p', 'M', '\\n'\n+};\n+\n int main(void) {\n-    printf(\"%d\", (int) sizeof($ngx_type));\n+    printf(\"dummy use of object_code_block to avoid gc-section: %c\", object_code_block[0]);\n     return 0;\n }\n \n@@ -40,7 +46,7 @@ eval \"$ngx_test >> $NGX_AUTOCONF_ERR 2>&\n \n \n if [ -x $NGX_AUTOTEST ]; then\n-    ngx_size=`$NGX_AUTOTEST`\n+    ngx_size=`sed -ne 's/^e4VA0x\\(.\\)Y3pM$/\\1/p' < $NGX_AUTOTEST`\n     echo \" $ngx_size bytes\"\n fi\n \n"
  },
  {
    "path": "luci-app-nginx-pingos/patches/103-sys_nerr.patch",
    "content": "--- a/src/os/unix/ngx_errno.c\n+++ b/src/os/unix/ngx_errno.c\n@@ -8,6 +8,9 @@\n #include <ngx_config.h>\n #include <ngx_core.h>\n \n+#ifndef NGX_SYS_NERR\n+#define NGX_SYS_NERR  128\n+#endif\n \n /*\n  * The strerror() messages are copied because:\n"
  },
  {
    "path": "luci-app-nginx-pingos/patches/104-endianness_fix.patch",
    "content": "diff --git a/auto/endianness b/auto/endianness\nindex 1b552b6b..2b6f9ea4 100644\n--- a/auto/endianness\n+++ b/auto/endianness\n@@ -12,6 +12,16 @@ checking for system byte ordering\n \n END\n \n+if [ \"${CONFIG_BIG_ENDIAN}\" != \"y\" ]; then\n+    echo \" little endian\"\n+    have=NGX_HAVE_LITTLE_ENDIAN . auto/have\n+else\n+    echo \" big endian\"\n+fi\n+\n+return\n+\n+\n \n cat << END > $NGX_AUTOTEST.c\n \n"
  },
  {
    "path": "luci-app-nginx-pingos/patches/200-config.patch",
    "content": "--- a/conf/nginx.conf\n+++ b/conf/nginx.conf\n@@ -1,5 +1,5 @@\n \n-#user  nobody;\n+user nobody nogroup;\n worker_processes  1;\n \n #error_log  logs/error.log;\n@@ -16,7 +16,7 @@ events {\n \n http {\n     include       mime.types;\n-    default_type  application/octet-stream;\n+    #default_type  application/octet-stream;\n \n     #log_format  main  '$remote_addr - $remote_user [$time_local] \"$request\" '\n     #                  '$status $body_bytes_sent \"$http_referer\" '\n"
  },
  {
    "path": "luci-app-nginx-pingos/patches/201-ignore-invalid-options.patch",
    "content": "--- a/auto/options\n+++ b/auto/options\n@@ -396,8 +396,7 @@ $0: warning: the \\\"--with-sha1-asm\\\" opt\n         --test-build-solaris-sendfilev)  NGX_TEST_BUILD_SOLARIS_SENDFILEV=YES ;;\n \n         *)\n-            echo \"$0: error: invalid option \\\"$option\\\"\"\n-            exit 1\n+            echo \"$0: error: ignoring invalid option \\\"$option\\\"\"\n         ;;\n     esac\n done\n"
  },
  {
    "path": "luci-app-nginx-pingos/po/zh_Hans/pingos.po",
    "content": "msgid \"Running Status\"\nmsgstr \"运行状态\"\n\nmsgid \"Status\"\nmsgstr \"状态\"\n\nmsgid \"Collecting data...\"\nmsgstr \"正在收集数据...\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\nmsgid \"RUNNING\"\nmsgstr \"运行中\"\n\nmsgid \"If you need external network access, please open the port by yourself.\"\nmsgstr \"如需外网访问，请自行放行端口。\"\n\nmsgid \"Global Settings\"\nmsgstr \"全局设置\"\n\nmsgid \"Edit Template\"\nmsgstr \"编辑模板\"\n\nmsgid \"Edit the template that is used for generating the %s configuration.\"\nmsgstr \"编辑生成 %s 的模板\"\n\nmsgid \"This is the content of the file '%s'\"\nmsgstr \"这是文件内容：%s\"\n\nmsgid \"Values enclosed by pipe symbols ('|') should not be changed. They get their values from the '%s' tab.\"\nmsgstr \"由管道符（“|”）包围的值不应更改。它们将从 '%s' 标签中获取其值。\"\n\nmsgid \"Listen IPv6\"\nmsgstr \"监听IPv6\"\n\nmsgid \"Record\"\nmsgstr \"录像\"\n\nmsgid \"Path\"\nmsgstr \"路径\"\n\nmsgid \"Stream name\"\nmsgstr \"流名\"\n"
  },
  {
    "path": "luci-app-nginx-pingos/root/etc/config/pingos",
    "content": "\nconfig global\n\toption enable '0'\n\toption ipv6 '0'\n\toption https '0'\n\toption ts_record '0'\n\toption flv_record '0'\n\toption http_port '18080'\n\toption rtmp_port '1935'\n\toption hls '1'\n\toption hls2 '1'\n"
  },
  {
    "path": "luci-app-nginx-pingos/root/etc/init.d/pingos",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2020 Lienol <lawlienol@gmail.com>\n\nSTART=99\n\nCONFIG=\"pingos\"\n\nTEMP_PATH=\"/var/etc/$CONFIG\"\nNGINX_CONFIG=\"$TEMP_PATH/nginx.conf\"\n\nconfig_t_get() {\n\tlocal index=0\n\t[ -n \"$4\" ] && index=$4\n\tlocal ret=$(uci get $CONFIG.@$1[$index].$2 2>/dev/null)\n\techo ${ret:=$3}\n}\n\ngen_nginx_config() {\n\tipv6=$(config_t_get global ipv6 0)\n\thttp_port=$(config_t_get global http_port)\n\t[ \"$(config_t_get global https 0)\" == \"1\" ] && {\n\t\thttp_port=\"$http_port ssl\"\n\t\tssl_certificate=\"ssl_certificate $(config_t_get global certificate);\"\n\t\tssl_certificate_key=\"ssl_certificate_key $(config_t_get global key);\"\n\t}\n\trtmp_port=$(config_t_get global rtmp_port)\n\thls=$(config_t_get global hls 0)\n\t[ $hls == 1 ] && hls=on || hls=off\n\thls2=$(config_t_get global hls2 0)\n\t[ $hls2 == 1 ] && hls2=on || hls2=off\n\tts_record=$(config_t_get global ts_record 0)\n\t[ $ts_record == 1 ] && ts_record=on || ts_record=off\n\tflv_record=$(config_t_get global flv_record 0)\n\t[ $flv_record == 1 ] && flv_record=all || flv_record=off\n\trecord_path=$(config_t_get global record_path \"$TEMP_PATH/record\")\n\t\n\tsed -e \"s#|TMP_PATH|#$TEMP_PATH#g\" \\\n\t    -e \"s#|HTTP_PORT|#$http_port#g\" \\\n\t    -e \"s#|ssl_certificate|#$ssl_certificate#g\" \\\n\t    -e \"s#|ssl_certificate_key|#$ssl_certificate_key#g\" \\\n\t    -e \"s#|RTMP_PORT|#$rtmp_port#g\" \\\n\t    -e \"s#|HLS|#$hls#g\" \\\n\t    -e \"s#|HLS2|#$hls2#g\" \\\n\t    -e \"s#|TS_RECORD|#$ts_record#g\" \\\n\t    -e \"s#|FLV_RECORD|#$flv_record#g\" \\\n\t    -e \"s#|RECORD_PATH|#$record_path#g\" \\\n\t    /etc/$CONFIG.template > $1\n\t\t\n\t[ \"$ipv6\" = \"0\" ] && sed -i '/listen \\[::\\]:/d' $1\n}\n\nstart() {\n\tENABLED=$(config_t_get global enable 0)\n\t[ \"$ENABLED\" = \"0\" ] && return 0\n\tmkdir -p $TEMP_PATH $TEMP_PATH/lib\n\tgen_nginx_config $NGINX_CONFIG\n\t/usr/sbin/pingos -c $NGINX_CONFIG >/dev/null 2>&1 &\n}\n\nstop() {\n\t/usr/sbin/pingos -c $NGINX_CONFIG -s stop >/dev/null 2>&1\n\trm -rf $TEMP_PATH\n}\n\nrestart() {\n\tstop\n\tstart\n}"
  },
  {
    "path": "luci-app-nginx-pingos/root/etc/pingos.template",
    "content": "user root;\ndaemon on;\nmaster_process on;\nworker_processes 1;\n#worker_rlimit 4g;\n\n#error_log |TMP_PATH|/error.log;\n#error_log |TMP_PATH|/error.log  notice;\nerror_log |TMP_PATH|/error.log info;\n\nworker_rlimit_nofile 102400;\nworker_rlimit_core 2G;\nworking_directory |TMP_PATH|;\n\npid |TMP_PATH|/pingos.pid;\n\nevents {\n\tuse epoll;\n\tworker_connections 4096;\n\tmulti_listen unix:|TMP_PATH|/http |HTTP_PORT|;\n\tmulti_listen unix:|TMP_PATH|/rtmp |RTMP_PORT|;\n\n\tdynamic_refresh_interval 5s;\n\tdynamic_domain_buckets 1001;\n\tresolver 114.114.114.114 valid=1m;\n\tresolver_timeout 30s;\n}\n\n#stream_zone buckets=1024 streams=4096;\n\n#dynamic_conf conf/nginx_dynamic.conf 10;\n#dynamic_log |TMP_PATH|/dynamic.log info;\n\nrtmp {\n\tlog_format log_bandwidth '{\"app\":\"$app\",\"name\":\"$name\",\"bitrate\":$bitrate,\"args\":\"$args\",\"timestamp\":$ntp,\"ts\":\"$time_local\",\"type\":\"$command\",\"remote_addr\":\"$remote_addr\",\"domain\":\"$domain\"}';\n\taccess_log |TMP_PATH|/bandwidth.log log_bandwidth trunc=60s;\n\n\tserver {\n\t\tlisten |RTMP_PORT|;\n\t\tlisten [::]:|RTMP_PORT| ipv6only=on;\n\t\tserverid 000;\n\t\tout_queue 2048;\n\t\tserver_name localhost;\n\t\trtmp_auto_pull on;\n\t\trtmp_auto_pull_port unix:|TMP_PATH|/rtmp;\n\n\t\tapplication push {\n\t\t\tlive on;\n\t\t\tpush rtmp://127.0.0.1:|RTMP_PORT|/live app=live;\n\t\t}\n\n\t\tapplication live {\n\t\t\tlive_record |TS_RECORD|;\n\t\t\tlive_record_path |RECORD_PATH|;\n\n\t\t\trecorder r1{\n\t\t\t\trecord |FLV_RECORD|;\n\t\t\t\trecord_path |RECORD_PATH|;\n\t\t\t}\n\n\t\t\tlive on;\n\t\t\thls |HLS|;\n\t\t\thls_path |TMP_PATH|/hls;\n\t\t\thls_fragment 4000ms;\n\t\t\t#hls_max_fragment 10000ms;\n\t\t\thls_playlist_length 12000ms;\n\t\t\thls_type live;\n\n\t\t\thls2 |HLS2|;\n\t\t\tmpegts_cache_time 20s;\n\n\t\t\thls2_fragment 2000ms;\n\t\t\thls2_max_fragment 3000ms;\n\t\t\thls2_playlist_length 6000ms;\n\n\t\t\twait_key on;\n\t\t\twait_video on;\n\t\t\tcache_time 1s;\n\t\t\tsend_all on;\n\t\t\tlow_latency off;\n\t\t\tfix_timestamp 2s;\n\t\t\t# h265 codecid, default 12\n\t\t\thevc_codecid 12;\n\t\t}\n\t}\n}\n\nhttp {\n\tinclude /usr/share/pingos/conf/mime.types;\n\tdefault_type application/octet-stream;\n\n\tlog_format main '$remote_addr - $remote_user [$time_local] \"$request\" '\n\t'$status $body_bytes_sent \"$http_referer\" '\n\t'\"$http_user_agent\" \"$http_X-Forwarded-For\" \"$http_X-Real-IP\" \"$host\"';\n\n\n\taccess_log |TMP_PATH|/access.log main;\n\n\tsendfile on;\n\t#tcp_nopush     on;\n\n\t#keepalive_timeout  0;\n\tkeepalive_timeout 65;\n\n\t#reset_server_name www.test1.com www.test2.com;\n\t#gzip  on;\n\n\tupstream hlsm {\n\t\t#hash $remote_addr consistent;\n\t\thash $arg_session consistent;\n\t\t# 这里需要注意，你要开几个进程，就要按这个规则写几条记录\n\t\tserver unix:|TMP_PATH|/http.0;\n\t\t#server unix:|TMP_PATH|/http.1;\n\t}\n\n\tserver {\n\t\tlisten |HTTP_PORT|;\n\t\tlisten [::]:|HTTP_PORT|;\n\t\t|ssl_certificate|\n\t\t|ssl_certificate_key|\n\t\tssl_session_cache shared:SSL:1m;\n\t\tssl_session_timeout 5m;\n\t\tssl_ciphers HIGH:!aNULL:!MD5;\n\t\tssl_prefer_server_ciphers on;\n\n\t\tlocation /rtmp_stat {\n\t\t\trtmp_stat all;\n\t\t\trtmp_stat_stylesheet /stat.xsl;\n\t\t}\n\n\t\tlocation /xstat {\n\t\t\trtmp_stat all;\n\t\t}\n\n\t\tlocation /sys_stat {\n\t\t\tsys_stat;\n\t\t}\n\t\tlocation ~ .mp4$ {\n\t\t\troot /usr/share/pingos/html;\n\t\t\t#mp4;\n\t\t}\n\n\t\tlocation /control {\n\t\t\trtmp_control all;\n\t\t}\n\t\tlocation /flv {\n\t\t\tflv_live |RTMP_PORT| app=live;\n\t\t\tadd_header 'Access-Control-Allow-Origin' '*';\n\t\t\tadd_header \"Access-Control-Allow-Credentials\" \"true\";\n\t\t\tadd_header \"Access-Control-Allow-Methods\" \"*\";\n\t\t\tadd_header \"Access-Control-Allow-Headers\" \"Content-Type,Access-Token\";\n\t\t\tadd_header \"Access-Control-Expose-Headers\" \"*\";\n\t\t}\n\t\tlocation /ts {\n\t\t\tts_live |RTMP_PORT| app=live;\n\t\t\texpires -1;\n\t\t\tadd_header 'Access-Control-Allow-Origin' '*';\n\t\t\tadd_header \"Access-Control-Allow-Credentials\" \"true\";\n\t\t\tadd_header \"Access-Control-Allow-Methods\" \"*\";\n\t\t\tadd_header \"Access-Control-Allow-Headers\" \"Content-Type,Access-Token\";\n\t\t\tadd_header \"Access-Control-Expose-Headers\" \"*\";\n\t\t}\n\t\tlocation /hls {\n\t\t\t# Serve HLS fragments\n\t\t\ttypes {\n\t\t\t\tapplication/vnd.apple.mpegurl m3u8;\n\t\t\t\tvideo/mp2t ts;\n\t\t\t}\n\t\t\troot |TMP_PATH|;\n\t\t\texpires -1;\n\t\t\tadd_header Cache-Control no-cache;\n\t\t\tadd_header 'Access-Control-Allow-Origin' '*';\n\t\t\tadd_header \"Access-Control-Allow-Credentials\" \"true\";\n\t\t\tadd_header \"Access-Control-Allow-Methods\" \"*\";\n\t\t\tadd_header \"Access-Control-Allow-Headers\" \"Content-Type,Access-Token\";\n\t\t\tadd_header \"Access-Control-Expose-Headers\" \"*\";\n\t\t}\n\n\t\tlocation /hlsm {\n\t\t\thls2_live |RTMP_PORT| app=live;\n\t\t\tadd_header 'Access-Control-Allow-Origin' '*';\n\t\t\tadd_header Cache-Control no-cache;\n\t\t\tadd_header \"Access-Control-Allow-Credentials\" \"true\";\n\t\t\tadd_header \"Access-Control-Allow-Methods\" \"*\";\n\t\t\tadd_header \"Access-Control-Allow-Headers\" \"Content-Type,Access-Token\";\n\t\t\tadd_header \"Access-Control-Expose-Headers\" \"*\";\n\t\t}\n\n\t\tlocation /hls2 {\n\t\t\tproxy_buffering on;\n\t\t\tproxy_buffer_size 4k;\n\t\t\tproxy_buffers 8 1M;\n\t\t\tproxy_busy_buffers_size 2M;\n\t\t\tproxy_max_temp_file_size 0;\n\t\t\tset $hls_args location=/hls2&scheme=$scheme;\n\t\t\t#if ($args) {\n\t\t\t#\tset $hls_args $args&location=/hls2&scheme=$scheme;\n\t\t\t#}\n\t\t\tproxy_set_header Host $host:$server_port;\n\t\t\trewrite ^/(.*)/(.*)\\.(.*)$ /hlsm/$2.$3?$hls_args break;\n\t\t\tproxy_pass http://hlsm;\n\t\t}\n\n\t\tlocation / {\n\t\t\tchunked_transfer_encoding on;\n\t\t\troot /usr/share/pingos/html/;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/root/etc/uci-defaults/luci-app-nginx-pingos",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@pingos[-1]\n\tadd ucitrack pingos\n\tset ucitrack.@pingos[-1].init=pingos\n\tcommit ucitrack\nEOF\n\nrm -rf /tmp/luci-*cache\nexit 0\n"
  },
  {
    "path": "luci-app-nginx-pingos/root/resource/conf-template/nginx.conf",
    "content": "user root;\ndaemon on;\nmaster_process on;\nworker_processes 1;\n#worker_rlimit 4g;\n\n#error_log  logs/error.log;\n#error_log  logs/error.log  notice;\nerror_log logs/error.log info;\n\nworker_rlimit_nofile 102400;\nworker_rlimit_core 2G;\nworking_directory /tmp;\n\npid logs/nginx.pid;\n\nevents {\n\tuse epoll;\n\tworker_connections 4096;\n\tmulti_listen unix:/tmp/http 8080;\n\tmulti_listen unix:/tmp/rtmp 1935;\n\n\tdynamic_refresh_interval 5s;\n\tdynamic_domain_buckets 1001;\n\tresolver 114.114.114.114 valid=1m;\n\tresolver_timeout 30s;\n}\n\n#stream_zone buckets=1024 streams=4096;\n\n#dynamic_conf conf/nginx_dynamic.conf 10;\n#dynamic_log logs/dynamic.log info;\n\n\nrtmp {\n\tlog_format log_bandwidth '{\"app\":\"$app\",\"name\":\"$name\",\"bitrate\":$bitrate,\"args\":\"$args\",\"timestamp\":$ntp,\"ts\":\"$time_local\",\"type\":\"$command\",\"remote_addr\":\"$remote_addr\",\"domain\":\"$domain\"}';\n\taccess_log logs/bandwidth.log log_bandwidth trunc=60s;\n\n\tserver {\n\t\tlisten 1935;\n\t\tserverid 000;\n\t\tout_queue 2048;\n\t\tserver_name live.pingos.io;\n\t\trtmp_auto_pull on;\n\t\trtmp_auto_pull_port unix:/tmp/rtmp;\n   \n\t\tapplication push {\n\t\t\tlive on;\n\t\t\tpush rtmp://127.0.0.1/live app=live;\n\t\t}\n\n\t\tapplication live {\n\t\t\tlive_record on;\n\t\t\tlive_record_path /data/record;\n\n\t\t\trecorder r1{\n\t\t\t\trecord all;\n\t\t\t\trecord_path /data/record;\n\t\t\t}\n\n\t\t\tlive on;\n\t\t\thls on;\n\t\t\thls_path /tmp/hls;\n\t\t\thls_fragment 4000ms;\n\t\t\t#hls_max_fragment 10000ms;\n\t\t\thls_playlist_length 12000ms;\n\t\t\thls_type live;\n\n\t\t\thls2 on;\n\t\t\tmpegts_cache_time 20s;\n\n\t\t\thls2_fragment 2000ms;\n\t\t\thls2_max_fragment 3000ms;\n\t\t\thls2_playlist_length 6000ms;\n\n\t\t\twait_key on;\n\t\t\twait_video on;\n\t\t\tcache_time 1s;\n\t\t\tsend_all on;\n\t\t\tlow_latency off;\n\t\t\tfix_timestamp 2s;\n\t\t\t# h265 codecid, default 12\n\t\t\thevc_codecid 12;\n\t\t}\n\t}\n}\n\nhttp {\n\tinclude mime.types;\n\tdefault_type application/octet-stream;\n\n\tlog_format main '$remote_addr - $remote_user [$time_local] \"$request\" '\n\t'$status $body_bytes_sent \"$http_referer\" '\n\t'\"$http_user_agent\" \"$http_X-Forwarded-For\" \"$http_X-Real-IP\" \"$host\"';\n\n\n\taccess_log logs/access.log main;\n\n\tsendfile on;\n\t#tcp_nopush     on;\n\n\t#keepalive_timeout  0;\n\tkeepalive_timeout 65;\n\n\t#reset_server_name www.test1.com www.test2.com;\n\t#gzip  on;\n\n\tupstream hlsm {\n\t\t#        hash $remote_addr consistent;\n\t\thash $arg_session consistent;\n\t\t# 这里需要注意，你要开几个进程，就要按这个规则写几条记录\n\t\tserver unix:/tmp/http.0;\n\t\t#        server unix:/tmp/http.1;\n\t\t#        server unix:/tmp/http.2;\n\t\t#        server unix:/tmp/http.3;\n\t}\n\n\tserver {\n\t\tlisten 8080;\n\t\t#        listen 443 ssl;\n\t\t#        ssl_certificate     /usr/local/pingos/cert/full_chain.pem;\n\t\t#        ssl_certificate_key /usr/local/pingos/cert/privkey.pem;\n\t\tlocation /rtmp_stat {\n\t\t\trtmp_stat all;\n\t\t\trtmp_stat_stylesheet /stat.xsl;\n\t\t}\n\n\t\tlocation /xstat {\n\t\t\trtmp_stat all;\n\t\t}\n\n\t\tlocation /sys_stat {\n\t\t\tsys_stat;\n\t\t}\n\t\tlocation ~ .mp4$ {\n\t\t\troot html;\n\t\t\t#mp4;\n\t\t}\n\n\t\tlocation /control {\n\t\t\trtmp_control all;\n\t\t}\n\t\tlocation /flv {\n\t\t\tflv_live 1935 app=live;\n\t\t\tadd_header 'Access-Control-Allow-Origin' '*';\n\t\t\tadd_header \"Access-Control-Allow-Credentials\" \"true\";\n\t\t\tadd_header \"Access-Control-Allow-Methods\" \"*\";\n\t\t\tadd_header \"Access-Control-Allow-Headers\" \"Content-Type,Access-Token\";\n\t\t\tadd_header \"Access-Control-Expose-Headers\" \"*\";\n\t\t}\n\t\tlocation /ts {\n\t\t\tts_live 1935 app=live;\n\t\t\texpires -1;\n\t\t\tadd_header 'Access-Control-Allow-Origin' '*';\n\t\t\tadd_header \"Access-Control-Allow-Credentials\" \"true\";\n\t\t\tadd_header \"Access-Control-Allow-Methods\" \"*\";\n\t\t\tadd_header \"Access-Control-Allow-Headers\" \"Content-Type,Access-Token\";\n\t\t\tadd_header \"Access-Control-Expose-Headers\" \"*\";\n\t\t}\n\t\tlocation /hls {\n\t\t\t# Serve HLS fragments\n\t\t\ttypes {\n\t\t\t\tapplication/vnd.apple.mpegurl m3u8;\n\t\t\t\tvideo/mp2t ts;\n\t\t\t}\n\t\t\troot /tmp;\n\t\t\texpires -1;\n\t\t\tadd_header Cache-Control no-cache;\n\t\t\tadd_header 'Access-Control-Allow-Origin' '*';\n\t\t\tadd_header \"Access-Control-Allow-Credentials\" \"true\";\n\t\t\tadd_header \"Access-Control-Allow-Methods\" \"*\";\n\t\t\tadd_header \"Access-Control-Allow-Headers\" \"Content-Type,Access-Token\";\n\t\t\tadd_header \"Access-Control-Expose-Headers\" \"*\";\n\t\t}\n\n\t\tlocation /hlsm {\n\t\t\thls2_live 1935 app=live;\n\t\t\tadd_header 'Access-Control-Allow-Origin' '*';\n\t\t\tadd_header Cache-Control no-cache;\n\t\t\tadd_header \"Access-Control-Allow-Credentials\" \"true\";\n\t\t\tadd_header \"Access-Control-Allow-Methods\" \"*\";\n\t\t\tadd_header \"Access-Control-Allow-Headers\" \"Content-Type,Access-Token\";\n\t\t\tadd_header \"Access-Control-Expose-Headers\" \"*\";\n\t\t}\n\n\t\tlocation /hls2 {\n\t\t\tproxy_buffering on;\n\t\t\tproxy_buffer_size 4k;\n\t\t\tproxy_buffers 8 1M;\n\t\t\tproxy_busy_buffers_size 2M;\n\t\t\tproxy_max_temp_file_size 0;\n\t\t\tset $hls_args location=/hls2&scheme=$scheme;\n\t\t\t#             if ($args) {\n\t\t\t#                 set $hls_args $args&location=/hls2&scheme=$scheme;\n\t\t\t#             }\n\t\t\tproxy_set_header Host $host:$server_port;\n\t\t\trewrite ^/(.*)/(.*)\\.(.*)$ /hlsm/$2.$3?$hls_args break;\n\t\t\tproxy_pass http://hlsm;\n\t\t}\n\n\t\tlocation / {\n\t\t\tchunked_transfer_encoding on;\n\t\t\troot html/;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/root/resource/crossdomain.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>  \n<cross-domain-policy>  \n<allow-access-from domain=\"*\"/>  \n</cross-domain-policy>  "
  },
  {
    "path": "luci-app-nginx-pingos/root/resource/stat.xsl",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\" ?>\n\n\n<!--\n   Copyright (C) Roman Arutyunyan\n-->\n\n\n<xsl:stylesheet version=\"1.0\" xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\">\n\n\n<xsl:template match=\"/\">\n    <html>\n        <head>\n            <title>RTMP statistics</title>\n        </head>\n        <body>\n            <xsl:apply-templates select=\"rtmp\"/>\n            <hr/>\n            Generated by <a href='https://github.com/im-pingo/pingos'>\n            PingOS</a>&#160;<xsl:value-of select=\"/rtmp/nginx_rtmp_version\"/>,\n            <a href=\"http://nginx.org\">nginx</a>&#160;<xsl:value-of select=\"/rtmp/nginx_version\"/>,\n            pid <xsl:value-of select=\"/rtmp/pid\"/>,\n            built <xsl:value-of select=\"/rtmp/built\"/>&#160;<xsl:value-of select=\"/rtmp/compiler\"/>\n        </body>\n    </html>\n</xsl:template>\n\n<xsl:template match=\"rtmp\">\n    <table cellspacing=\"1\" cellpadding=\"5\">\n        <tr bgcolor=\"#999999\">\n            <th>RTMP</th>\n            <th>#clients</th>\n            <th colspan=\"4\">Video</th>\n            <th colspan=\"4\">Audio</th>\n            <th>In bytes</th>\n            <th>Out bytes</th>\n            <th>In bits/s</th>\n            <th>Out bits/s</th>\n            <th>State</th>\n            <th>Time</th>\n        </tr>\n        <tr>\n            <td colspan=\"2\">Accepted: <xsl:value-of select=\"naccepted\"/></td>\n            <th bgcolor=\"#999999\">codec</th>\n            <th bgcolor=\"#999999\">bits/s</th>\n            <th bgcolor=\"#999999\">size</th>\n            <th bgcolor=\"#999999\">fps</th>\n            <th bgcolor=\"#999999\">codec</th>\n            <th bgcolor=\"#999999\">bits/s</th>\n            <th bgcolor=\"#999999\">freq</th>\n            <th bgcolor=\"#999999\">chan</th>\n            <td>\n                <xsl:call-template name=\"showsize\">\n                    <xsl:with-param name=\"size\" select=\"bytes_in\"/>\n                </xsl:call-template>\n            </td>\n            <td>\n                <xsl:call-template name=\"showsize\">\n                    <xsl:with-param name=\"size\" select=\"bytes_out\"/>\n                </xsl:call-template>\n            </td>\n            <td>\n                <xsl:call-template name=\"showsize\">\n                    <xsl:with-param name=\"size\" select=\"bw_in\"/>\n                    <xsl:with-param name=\"bits\" select=\"1\"/>\n                    <xsl:with-param name=\"persec\" select=\"1\"/>\n                </xsl:call-template>\n            </td>\n            <td>\n                <xsl:call-template name=\"showsize\">\n                    <xsl:with-param name=\"size\" select=\"bw_out\"/>\n                    <xsl:with-param name=\"bits\" select=\"1\"/>\n                    <xsl:with-param name=\"persec\" select=\"1\"/>\n                </xsl:call-template>\n            </td>\n            <td/>\n            <td>\n                <xsl:call-template name=\"showtime\">\n                    <xsl:with-param name=\"time\" select=\"/rtmp/uptime * 1000\"/>\n                </xsl:call-template>\n            </td>\n        </tr>\n        <xsl:apply-templates select=\"server\"/>\n    </table>\n</xsl:template>\n\n<xsl:template match=\"server\">\n    <xsl:apply-templates select=\"live\"/>\n</xsl:template>\n\n<xsl:template match=\"application\">\n    <tr bgcolor=\"#999999\">\n        <td>\n            <b><xsl:value-of select=\"name\"/></b>\n        </td>\n    </tr>\n    <xsl:apply-templates select=\"live\"/>\n    <xsl:apply-templates select=\"play\"/>\n</xsl:template>\n\n<xsl:template match=\"live\">\n    <tr bgcolor=\"#aaaaaa\">\n        <td>\n            <i>live streams</i>\n        </td>\n        <td align=\"middle\">\n            <xsl:value-of select=\"nclients\"/>\n        </td>\n    </tr>\n    <xsl:apply-templates select=\"stream\"/>\n</xsl:template>\n\n<xsl:template match=\"play\">\n    <tr bgcolor=\"#aaaaaa\">\n        <td>\n            <i>vod streams</i>\n        </td>\n        <td align=\"middle\">\n            <xsl:value-of select=\"nclients\"/>\n        </td>\n    </tr>\n    <xsl:apply-templates select=\"stream\"/>\n</xsl:template>\n\n<xsl:template match=\"stream\">\n    <tr valign=\"top\">\n        <xsl:attribute name=\"bgcolor\">\n            <xsl:choose>\n                <xsl:when test=\"active\">#cccccc</xsl:when>\n                <xsl:otherwise>#dddddd</xsl:otherwise>\n            </xsl:choose>\n        </xsl:attribute>\n        <td>\n            <a href=\"\">\n                <xsl:attribute name=\"onclick\">\n                    var d=document.getElementById('<xsl:value-of select=\"../../name\"/>-<xsl:value-of select=\"name\"/>');\n                    d.style.display=d.style.display=='none'?'':'none';\n                    return false\n                </xsl:attribute>\n                <xsl:value-of select=\"name\"/>\n                <xsl:if test=\"string-length(name) = 0\">\n                    [EMPTY]\n                </xsl:if>\n            </a>\n        </td>\n        <td align=\"middle\"> <xsl:value-of select=\"nclients\"/> </td>\n        <td>\n            <xsl:value-of select=\"meta/video/codec\"/>&#160;<xsl:value-of select=\"meta/video/profile\"/>&#160;<xsl:value-of select=\"meta/video/level\"/>\n        </td>\n        <td>\n            <xsl:call-template name=\"showsize\">\n                <xsl:with-param name=\"size\" select=\"bw_video\"/>\n                <xsl:with-param name=\"bits\" select=\"1\"/>\n                <xsl:with-param name=\"persec\" select=\"1\"/>\n            </xsl:call-template>\n        </td>\n        <td>\n            <xsl:apply-templates select=\"meta/video/width\"/>\n        </td>\n        <td>\n            <xsl:value-of select=\"meta/video/frame_rate\"/>\n        </td>\n        <td>\n            <xsl:value-of select=\"meta/audio/codec\"/>&#160;<xsl:value-of select=\"meta/audio/profile\"/>\n        </td>\n        <td>\n            <xsl:call-template name=\"showsize\">\n                <xsl:with-param name=\"size\" select=\"bw_audio\"/>\n                <xsl:with-param name=\"bits\" select=\"1\"/>\n                <xsl:with-param name=\"persec\" select=\"1\"/>\n            </xsl:call-template>\n        </td>\n        <td>\n            <xsl:apply-templates select=\"meta/audio/sample_rate\"/>\n        </td>\n        <td>\n            <xsl:value-of select=\"meta/audio/channels\"/>\n        </td>\n        <td>\n            <xsl:call-template name=\"showsize\">\n               <xsl:with-param name=\"size\" select=\"bytes_in\"/>\n           </xsl:call-template>\n        </td>\n        <td>\n            <xsl:call-template name=\"showsize\">\n                <xsl:with-param name=\"size\" select=\"bytes_out\"/>\n            </xsl:call-template>\n        </td>\n        <td>\n            <xsl:call-template name=\"showsize\">\n                <xsl:with-param name=\"size\" select=\"bw_in\"/>\n                <xsl:with-param name=\"bits\" select=\"1\"/>\n                <xsl:with-param name=\"persec\" select=\"1\"/>\n            </xsl:call-template>\n        </td>\n        <td>\n            <xsl:call-template name=\"showsize\">\n                <xsl:with-param name=\"size\" select=\"bw_out\"/>\n                <xsl:with-param name=\"bits\" select=\"1\"/>\n                <xsl:with-param name=\"persec\" select=\"1\"/>\n            </xsl:call-template>\n        </td>\n        <td><xsl:call-template name=\"streamstate\"/></td>\n        <td>\n            <xsl:call-template name=\"showtime\">\n               <xsl:with-param name=\"time\" select=\"time\"/>\n            </xsl:call-template>\n        </td>\n    </tr>\n    <tr style=\"display:none\">\n        <xsl:attribute name=\"id\">\n            <xsl:value-of select=\"../../name\"/>-<xsl:value-of select=\"name\"/>\n        </xsl:attribute>\n        <td colspan=\"16\" ngcolor=\"#eeeeee\">\n            <table cellspacing=\"1\" cellpadding=\"5\">\n                <tr>\n                    <th>Id</th>\n                    <th>State</th>\n                    <th>Address</th>\n                    <th>Flash version</th>\n                    <th>Page URL</th>\n                    <th>SWF URL</th>\n                    <th>Dropped</th>\n                    <th>Timestamp</th>\n                    <th>A-V</th>\n                    <th>Time</th>\n                </tr>\n                <xsl:apply-templates select=\"client\"/>\n            </table>\n        </td>\n    </tr>\n</xsl:template>\n\n<xsl:template name=\"showtime\">\n    <xsl:param name=\"time\"/>\n\n    <xsl:if test=\"$time &gt; 0\">\n        <xsl:variable name=\"sec\">\n            <xsl:value-of select=\"floor($time div 1000)\"/>\n        </xsl:variable>\n\n        <xsl:if test=\"$sec &gt;= 86400\">\n            <xsl:value-of select=\"floor($sec div 86400)\"/>d\n        </xsl:if>\n\n        <xsl:if test=\"$sec &gt;= 3600\">\n            <xsl:value-of select=\"(floor($sec div 3600)) mod 24\"/>h\n        </xsl:if>\n\n        <xsl:if test=\"$sec &gt;= 60\">\n            <xsl:value-of select=\"(floor($sec div 60)) mod 60\"/>m\n        </xsl:if>\n\n        <xsl:value-of select=\"$sec mod 60\"/>s\n    </xsl:if>\n</xsl:template>\n\n<xsl:template name=\"showsize\">\n    <xsl:param name=\"size\"/>\n    <xsl:param name=\"bits\" select=\"0\" />\n    <xsl:param name=\"persec\" select=\"0\" />\n    <xsl:variable name=\"sizen\">\n        <xsl:value-of select=\"floor($size div 1024)\"/>\n    </xsl:variable>\n    <xsl:choose>\n        <xsl:when test=\"$sizen &gt;= 1073741824\">\n            <xsl:value-of select=\"format-number($sizen div 1073741824,'#.###')\"/> T</xsl:when>\n\n        <xsl:when test=\"$sizen &gt;= 1048576\">\n            <xsl:value-of select=\"format-number($sizen div 1048576,'#.###')\"/> G</xsl:when>\n\n        <xsl:when test=\"$sizen &gt;= 1024\">\n            <xsl:value-of select=\"format-number($sizen div 1024,'#.##')\"/> M</xsl:when>\n        <xsl:when test=\"$sizen &gt;= 0\">\n            <xsl:value-of select=\"$sizen\"/> K</xsl:when>\n    </xsl:choose>\n    <xsl:if test=\"string-length($size) &gt; 0\">\n        <xsl:choose>\n            <xsl:when test=\"$bits = 1\">b</xsl:when>\n            <xsl:otherwise>B</xsl:otherwise>\n        </xsl:choose>\n        <xsl:if test=\"$persec = 1\">/s</xsl:if>\n    </xsl:if>\n</xsl:template>\n\n<xsl:template name=\"streamstate\">\n    <xsl:choose>\n        <xsl:when test=\"active\">active</xsl:when>\n        <xsl:otherwise>idle</xsl:otherwise>\n    </xsl:choose>\n</xsl:template>\n\n\n<xsl:template name=\"clientstate\">\n    <xsl:choose>\n        <xsl:when test=\"publishing\">publishing</xsl:when>\n        <xsl:otherwise>playing</xsl:otherwise>\n    </xsl:choose>\n</xsl:template>\n\n\n<xsl:template match=\"client\">\n    <tr>\n        <xsl:attribute name=\"bgcolor\">\n            <xsl:choose>\n                <xsl:when test=\"publishing\">#cccccc</xsl:when>\n                <xsl:otherwise>#eeeeee</xsl:otherwise>\n            </xsl:choose>\n        </xsl:attribute>\n        <td><xsl:value-of select=\"id\"/></td>\n        <td><xsl:call-template name=\"clientstate\"/></td>\n        <td>\n            <a target=\"_blank\">\n                <xsl:attribute name=\"href\">\n                    http://apps.db.ripe.net/search/query.html&#63;searchtext=<xsl:value-of select=\"address\"/>\n                </xsl:attribute>\n                <xsl:attribute name=\"title\">whois</xsl:attribute>\n                <xsl:value-of select=\"address\"/>\n            </a>\n        </td>\n        <td><xsl:value-of select=\"flashver\"/></td>\n        <td>\n            <a target=\"_blank\">\n                <xsl:attribute name=\"href\">\n                    <xsl:value-of select=\"pageurl\"/>\n                </xsl:attribute>\n                <xsl:value-of select=\"pageurl\"/>\n            </a>\n        </td>\n        <td><xsl:value-of select=\"swfurl\"/></td>\n        <td><xsl:value-of select=\"dropped\"/></td>\n        <td><xsl:value-of select=\"timestamp\"/></td>\n        <td><xsl:value-of select=\"avsync\"/></td>\n        <td>\n            <xsl:call-template name=\"showtime\">\n               <xsl:with-param name=\"time\" select=\"time\"/>\n            </xsl:call-template>\n        </td>\n    </tr>\n</xsl:template>\n\n<xsl:template match=\"publishing\">\n    publishing\n</xsl:template>\n\n<xsl:template match=\"active\">\n    active\n</xsl:template>\n\n<xsl:template match=\"width\">\n    <xsl:value-of select=\".\"/>x<xsl:value-of select=\"../height\"/>\n</xsl:template>\n\n</xsl:stylesheet>\n"
  },
  {
    "path": "luci-app-nginx-pingos/root/usr/share/rpcd/acl.d/luci-app-nginx-pingos.json",
    "content": "{\n\t\"luci-app-nginx-pingos\": {\n\t\t\"description\": \"Grant UCI access for luci-app-nginx-pingos\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"pingos\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"pingos\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-nginx-pingos/root/usr/share/ucitrack/luci-app-nginx-pingos.json",
    "content": "{\n\t\"config\": \"pingos\",\n\t\"init\": \"pingos\"\n}\n"
  },
  {
    "path": "luci-app-nikki/feed.sh",
    "content": "#!/bin/sh\n\n# Nikki's feed\n\n# check env\nif [[ ! -x \"/bin/opkg\" && ! -x \"/usr/bin/apk\" || ! -x \"/sbin/fw4\" ]]; then\n\techo \"only supports OpenWrt build with firewall4!\"\n\texit 1\nfi\n\n# include openwrt_release\n. /etc/openwrt_release\n\n# get branch/arch\narch=\"$DISTRIB_ARCH\"\nbranch=\ncase \"$DISTRIB_RELEASE\" in\n\t*\"24.10\"*)\n\t\tbranch=\"openwrt-24.10\"\n\t\t;;\n\t*\"25.12\"*)\n\t\tbranch=\"openwrt-25.12\"\n\t\t;;\n\t\"SNAPSHOT\")\n\t\tbranch=\"SNAPSHOT\"\n\t\t;;\n\t*)\n\t\techo \"unsupported release: $DISTRIB_RELEASE\"\n\t\texit 1\n\t\t;;\nesac\n\n# feed url\nrepository_url=\"https://nikkinikki.pages.dev\"\nfeed_url=\"$repository_url/$branch/$arch/nikki\"\n\nif [ -x \"/bin/opkg\" ]; then\n\t# add key\n\techo \"add key\"\n\tkey_build_pub_file=\"key-build.pub\"\n\twget -O \"$key_build_pub_file\" \"$repository_url/key-build.pub\"\n\topkg-key add \"$key_build_pub_file\"\n\trm -f \"$key_build_pub_file\"\n\t# add feed\n\techo \"add feed\"\n\tif grep -q nikki /etc/opkg/customfeeds.conf; then\n\t\tsed -i '/nikki/d' /etc/opkg/customfeeds.conf\n\tfi\n\techo \"src/gz nikki $feed_url\" >> /etc/opkg/customfeeds.conf\n\t# update feeds\n\techo \"update feeds\"\n\topkg update\nelif [ -x \"/usr/bin/apk\" ]; then\n\t# add key\n\techo \"add key\"\n\twget -O \"/etc/apk/keys/nikki.pem\" \"$repository_url/public-key.pem\"\n\t# add feed\n\techo \"add feed\"\n\tif grep -q nikki /etc/apk/repositories.d/customfeeds.list; then\n\t\tsed -i '/nikki/d' /etc/apk/repositories.d/customfeeds.list\n\tfi\n\techo \"$feed_url/packages.adb\" >> /etc/apk/repositories.d/customfeeds.list\n\t# update feeds\n\techo \"update feeds\"\n\tapk update\nfi\n\necho \"success\"\n"
  },
  {
    "path": "luci-app-nikki/install.sh",
    "content": "#!/bin/sh\n\n# Nikki's installer\n\n# check env\nif [[ ! -x \"/bin/opkg\" && ! -x \"/usr/bin/apk\" || ! -x \"/sbin/fw4\" ]]; then\n\techo \"only supports OpenWrt build with firewall4!\"\n\texit 1\nfi\n\n# include openwrt_release\n. /etc/openwrt_release\n\n# get branch/arch\narch=\"$DISTRIB_ARCH\"\nbranch=\ncase \"$DISTRIB_RELEASE\" in\n\t*\"24.10\"*)\n\t\tbranch=\"openwrt-24.10\"\n\t\t;;\n\t*\"25.12\"*)\n\t\tbranch=\"openwrt-25.12\"\n\t\t;;\n\t\"SNAPSHOT\")\n\t\tbranch=\"SNAPSHOT\"\n\t\t;;\n\t*)\n\t\techo \"unsupported release: $DISTRIB_RELEASE\"\n\t\texit 1\n\t\t;;\nesac\n\n# feed url\nrepository_url=\"https://nikkinikki.pages.dev\"\nfeed_url=\"$repository_url/$branch/$arch/nikki\"\n\nif [ -x \"/bin/opkg\" ]; then\n\t# update feeds\n\techo \"update feeds\"\n\topkg update\n\t# get languages\n\techo \"get languages\"\n\tlanguages=$(opkg list-installed luci-i18n-base-* | cut -d ' ' -f 1 | cut -d '-' -f 4-)\n\t# get latest version\n\techo \"get latest version\"\n\twget -O nikki.version $feed_url/index.json\n\t# install ipks\n\techo \"install ipks\"\n\teval \"$(jsonfilter -i nikki.version -e \"mihomo_meta_version=@['packages']['mihomo-meta']\" -e \"nikki_version=@['packages']['nikki']\" -e \"luci_app_nikki_version=@['packages']['luci-app-nikki']\")\"\n\topkg install \"$feed_url/mihomo-meta_${mihomo_meta_version}_${arch}.ipk\"\n\topkg install \"$feed_url/nikki_${nikki_version}_${arch}.ipk\"\n\topkg install \"$feed_url/luci-app-nikki_${luci_app_nikki_version}_all.ipk\"\n\tfor lang in $languages; do\n\t\tlang_version=$(jsonfilter -i nikki.version -e \"@['packages']['luci-i18n-nikki-${lang}']\")\n\t\topkg install \"$feed_url/luci-i18n-nikki-${lang}_${lang_version}_all.ipk\"\n\tdone\n\t\n\trm -f nikki.version\nelif [ -x \"/usr/bin/apk\" ]; then\n\t# update feeds\n\techo \"update feeds\"\n\tapk update\n\t# get languages\n\techo \"get languages\"\n\tlanguages=$(apk list --installed --manifest luci-i18n-base-* | cut -d ' ' -f 1 | cut -d '-' -f 4-)\n\t# install apks from remote repository\n\techo \"install apks from remote repository\"\n\tapk add --allow-untrusted -X $feed_url/packages.adb mihomo-meta nikki luci-app-nikki\n\tfor lang in $languages; do\n\t\tapk add --allow-untrusted -X $feed_url/packages.adb \"luci-i18n-nikki-${lang}\"\n\tdone\nfi\n\necho \"success\" \n"
  },
  {
    "path": "luci-app-nikki/luci-app-nikki/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_VERSION:=1.26.0\n\nLUCI_TITLE:=LuCI Support for nikki\nLUCI_DEPENDS:=+luci-base +nikki\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature"
  },
  {
    "path": "luci-app-nikki/luci-app-nikki/htdocs/luci-static/resources/tools/nikki.js",
    "content": "'use strict';\n'require baseclass';\n'require uci';\n'require fs';\n'require rpc';\n'require request';\n\nconst callRCList = rpc.declare({\n    object: 'rc',\n    method: 'list',\n    params: ['name'],\n    expect: { '': {} }\n});\n\nconst callRCInit = rpc.declare({\n    object: 'rc',\n    method: 'init',\n    params: ['name', 'action'],\n    expect: { '': {} }\n});\n\nconst callNikkiVersion = rpc.declare({\n    object: 'luci.nikki',\n    method: 'version',\n    expect: { '': {} }\n});\n\nconst callNikkiProfile = rpc.declare({\n    object: 'luci.nikki',\n    method: 'profile',\n    params: ['defaults'],\n    expect: { '': {} }\n});\n\nconst callNikkiUpdateSubscription = rpc.declare({\n    object: 'luci.nikki',\n    method: 'update_subscription',\n    params: ['section_id'],\n    expect: { '': {} }\n});\n\nconst callNikkiAPI = rpc.declare({\n    object: 'luci.nikki',\n    method: 'api',\n    params: ['method', 'path', 'query', 'body'],\n    expect: { '': {} }\n});\n\nconst callNikkiGetIdentifiers = rpc.declare({\n    object: 'luci.nikki',\n    method: 'get_identifiers',\n    expect: { '': {} }\n});\n\nconst callNikkiDebug = rpc.declare({\n    object: 'luci.nikki',\n    method: 'debug',\n    expect: { '': {} }\n});\n\nconst homeDir = '/etc/nikki';\nconst profilesDir = `${homeDir}/profiles`;\nconst subscriptionsDir = `${homeDir}/subscriptions`;\nconst mixinFilePath = `${homeDir}/mixin.yaml`;\nconst runDir = `${homeDir}/run`;\nconst runProfilePath = `${runDir}/config.yaml`;\nconst providersDir = `${runDir}/providers`;\nconst ruleProvidersDir = `${providersDir}/rule`;\nconst proxyProvidersDir = `${providersDir}/proxy`;\nconst logDir = `/var/log/nikki`;\nconst appLogPath = `${logDir}/app.log`;\nconst coreLogPath = `${logDir}/core.log`;\nconst debugLogPath = `${logDir}/debug.log`;\nconst nftDir = `${homeDir}/nftables`;\n\nreturn baseclass.extend({\n    homeDir: homeDir,\n    profilesDir: profilesDir,\n    subscriptionsDir: subscriptionsDir,\n    mixinFilePath: mixinFilePath,\n    runDir: runDir,\n    runProfilePath: runProfilePath,\n    ruleProvidersDir: ruleProvidersDir,\n    proxyProvidersDir: proxyProvidersDir,\n    appLogPath: appLogPath,\n    coreLogPath: coreLogPath,\n    debugLogPath: debugLogPath,\n\n    status: async function () {\n        return (await callRCList('nikki'))?.nikki?.running;\n    },\n\n    reload: function () {\n        return callRCInit('nikki', 'reload');\n    },\n\n    restart: function () {\n        return callRCInit('nikki', 'restart');\n    },\n\n    version: function () {\n        return callNikkiVersion();\n    },\n\n    profile: function (defaults) {\n        return callNikkiProfile(defaults);\n    },\n\n    updateSubscription: function (section_id) {\n        return callNikkiUpdateSubscription(section_id);\n    },\n\n    updateDashboard: function () {\n        return callNikkiAPI('POST', '/upgrade/ui');\n    },\n\n    openDashboard: async function () {\n        const profile = await callNikkiProfile({\n            'external-ui-name': null,\n            'external-controller': null,\n            'external-controller-tls': null,\n            'secret': null\n        });\n        const uiName = profile['external-ui-name'];\n        const apiListen = profile['external-controller'];\n        const apiTLSListen = profile['external-controller-tls'];\n        const apiSecret = profile['secret'] ?? '';\n        if (!apiListen && !apiTLSListen) {\n            return Promise.reject('API has not been configured');\n        }\n\n        let protocol;\n        let port;\n        if (apiTLSListen) {\n            protocol = 'https';\n            port = apiTLSListen.substring(apiTLSListen.lastIndexOf(':') + 1);\n        } else {\n            protocol = 'http';\n            port = apiListen.substring(apiListen.lastIndexOf(':') + 1);\n        }\n\n        const params = {\n            host: window.location.hostname,\n            hostname: window.location.hostname,\n            port: port,\n            secret: apiSecret\n        };\n        const query = new URLSearchParams(params).toString();\n        let url;\n        if (uiName) {\n            url = `${protocol}://${window.location.hostname}:${port}/ui/${uiName}/?${query}`;\n        } else {\n            url = `${protocol}://${window.location.hostname}:${port}/ui/?${query}`;\n        }\n\n        setTimeout(function () { window.open(url, '_blank') }, 0);\n\n        return Promise.resolve();\n    },\n\n    getIdentifiers: function () {\n        return callNikkiGetIdentifiers();\n    },\n\n    listProfiles: function () {\n        return L.resolveDefault(fs.list(this.profilesDir), []);\n    },\n\n    listRuleProviders: function () {\n        return L.resolveDefault(fs.list(this.ruleProvidersDir), []);\n    },\n\n    listProxyProviders: function () {\n        return L.resolveDefault(fs.list(this.proxyProvidersDir), []);\n    },\n\n    getAppLog: function () {\n        return L.resolveDefault(fs.read_direct(this.appLogPath));\n    },\n\n    getCoreLog: function () {\n        return L.resolveDefault(fs.read_direct(this.coreLogPath));\n    },\n\n    clearAppLog: function () {\n        return fs.write(this.appLogPath);\n    },\n\n    clearCoreLog: function () {\n        return fs.write(this.coreLogPath);\n    },\n\n    debug: function () {\n        return callNikkiDebug();\n    },\n})\n"
  },
  {
    "path": "luci-app-nikki/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js",
    "content": "'use strict';\n'require form';\n'require view';\n'require uci';\n'require poll';\n'require tools.nikki as nikki';\n\nfunction renderStatus(running) {\n    return updateStatus(E('input', { id: 'core_status', style: 'border: unset; font-style: italic; font-weight: bold;', readonly: '' }), running);\n}\n\nfunction updateStatus(element, running) {\n    if (element) {\n        element.style.color = running ? 'green' : 'red';\n        element.value = running ? _('Running') : _('Not Running');\n    }\n    return element;\n}\n\nreturn view.extend({\n    load: function () {\n        return Promise.all([\n            uci.load('nikki'),\n            nikki.version(),\n            nikki.status(),\n            nikki.listProfiles()\n        ]);\n    },\n    render: function (data) {\n        const subscriptions = uci.sections('nikki', 'subscription');\n        const appVersion = data[1].app ?? '';\n        const coreVersion = data[1].core ?? '';\n        const running = data[2];\n        const profiles = data[3];\n\n        let m, s, o;\n\n        m = new form.Map('nikki', _('Nikki'), `${_('Transparent Proxy with Mihomo on OpenWrt.')} <a href=\"https://github.com/nikkinikki-org/OpenWrt-nikki/wiki\" target=\"_blank\">${_('How To Use')}</a>`);\n\n        s = m.section(form.TableSection, 'status', _('Status'));\n        s.anonymous = true;\n\n        o = s.option(form.Value, '_app_version', _('App Version'));\n        o.readonly = true;\n        o.load = function () {\n            return appVersion;\n        };\n        o.write = function () { };\n\n        o = s.option(form.Value, '_core_version', _('Core Version'));\n        o.readonly = true;\n        o.load = function () {\n            return coreVersion;\n        };\n        o.write = function () { };\n\n        o = s.option(form.DummyValue, '_core_status', _('Core Status'));\n        o.cfgvalue = function () {\n            return renderStatus(running);\n        };\n        poll.add(function () {\n            return L.resolveDefault(nikki.status()).then(function (running) {\n                updateStatus(document.getElementById('core_status'), running);\n            });\n        });\n\n        o = s.option(form.Button, 'reload');\n        o.inputstyle = 'action';\n        o.inputtitle = _('Reload Service');\n        o.onclick = function () {\n            return nikki.reload();\n        };\n\n        o = s.option(form.Button, 'restart');\n        o.inputstyle = 'negative';\n        o.inputtitle = _('Restart Service');\n        o.onclick = function () {\n            return nikki.restart();\n        };\n\n        o = s.option(form.Button, 'update_dashboard');\n        o.inputstyle = 'positive';\n        o.inputtitle = _('Update Dashboard');\n        o.onclick = function () {\n            return nikki.updateDashboard();\n        };\n\n        o = s.option(form.Button, 'open_dashboard');\n        o.inputtitle = _('Open Dashboard');\n        o.onclick = function () {\n            return nikki.openDashboard();\n        };\n\n        s = m.section(form.NamedSection, 'config', 'config', _('App Config'));\n\n        o = s.option(form.Flag, 'enabled', _('Enable'));\n        o.rmempty = false;\n\n        o = s.option(form.ListValue, 'profile', _('Choose Profile'));\n        o.optional = true;\n\n        for (const profile of profiles) {\n            o.value('file:' + profile.name, _('File:') + profile.name);\n        };\n\n        for (const subscription of subscriptions) {\n            o.value('subscription:' + subscription['.name'], _('Subscription:') + subscription.name);\n        };\n\n        o = s.option(form.Value, 'start_delay', _('Start Delay'));\n        o.datatype = 'uinteger';\n        o.placeholder = _('Start Immidiately');\n\n        o = s.option(form.Flag, 'scheduled_restart', _('Scheduled Restart'));\n        o.rmempty = false;\n\n        o = s.option(form.Value, 'scheduled_restart_cron', _('Scheduled Restart Cron'));\n        o.retain = true;\n        o.rmempty = false;\n        o.depends('scheduled_restart', '1');\n\n        o = s.option(form.Flag, 'test_profile', _('Test Profile'));\n        o.rmempty = false;\n\n        o = s.option(form.Flag, 'core_only', _('Core Only'));\n        o.rmempty = false;\n\n        s = m.section(form.NamedSection, 'procd', 'procd', _('procd Config'));\n\n        s.tab('general', _('General Config'));\n\n        o = s.taboption('general', form.Flag, 'fast_reload', _('Fast Reload'));\n        o.rmempty = false;\n\n        s.tab('rlimit', _('RLIMIT Config'));\n\n        o = s.taboption('rlimit', form.Value, 'rlimit_address_space_soft', _('Address Space Size Soft Limit'));\n        o.datatype = 'uinteger';\n        o.placeholder = _('Unlimited');\n\n        o = s.taboption('rlimit', form.Value, 'rlimit_address_space_hard', _('Address Space Size Hard Limit'));\n        o.datatype = 'uinteger';\n        o.placeholder = _('Unlimited');\n\n        o = s.taboption('rlimit', form.Value, 'rlimit_data_soft', _('Heap Size Soft Limit'));\n        o.datatype = 'uinteger';\n        o.placeholder = _('Unlimited');\n\n        o = s.taboption('rlimit', form.Value, 'rlimit_data_hard', _('Heap Size Hard Limit'));\n        o.datatype = 'uinteger';\n        o.placeholder = _('Unlimited');\n\n        o = s.taboption('rlimit', form.Value, 'rlimit_stack_soft', _('Stack Size Soft Limit'));\n        o.datatype = 'uinteger';\n        o.placeholder = _('Unlimited');\n\n        o = s.taboption('rlimit', form.Value, 'rlimit_stack_hard', _('Stack Size Hard Limit'));\n        o.datatype = 'uinteger';\n        o.placeholder = _('Unlimited');\n\n        o = s.taboption('rlimit', form.Value, 'rlimit_nofile_soft', _('Number of Open Files Soft Limit'));\n        o.datatype = 'uinteger';\n\n        o = s.taboption('rlimit', form.Value, 'rlimit_nofile_hard', _('Number of Open Files Hard Limit'));\n        o.datatype = 'uinteger';\n\n        s.tab('environment_variable', _('Environment Variable Config'));\n\n        o = s.taboption('environment_variable', form.DynamicList, 'env_safe_paths', _('Safe Paths'));\n        o.load = function (section_id) {\n            return this.super('load', section_id)?.split(':');\n        };\n        o.write = function (section_id, formvalue) {\n            this.super('write', section_id, formvalue?.join(':'));\n        };\n\n        o = s.taboption('environment_variable', form.Flag, 'env_disable_loopback_detector', _('Disable Loopback Detector'));\n        o.rmempty = false;\n\n        o = s.taboption('environment_variable', form.Flag, 'env_disable_quic_go_gso', _('Disable GSO of quic-go'));\n        o.rmempty = false;\n\n        o = s.taboption('environment_variable', form.Flag, 'env_disable_quic_go_ecn', _('Disable ECN of quic-go'));\n        o.rmempty = false;\n\n        o = s.taboption('environment_variable', form.Flag, 'env_skip_system_ipv6_check', _('Skip System IPv6 Check'));\n        o.rmempty = false;\n\n        return m.render();\n    }\n});\n"
  },
  {
    "path": "luci-app-nikki/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js",
    "content": "'use strict';\n'require form';\n'require view';\n'require uci';\n'require fs';\n'require tools.nikki as nikki';\n\nreturn view.extend({\n    load: function () {\n        return Promise.all([\n            uci.load('nikki'),\n            nikki.listProfiles(),\n            nikki.listRuleProviders(),\n            nikki.listProxyProviders(),\n        ]);\n    },\n    render: function (data) {\n        const subscriptions = uci.sections('nikki', 'subscription');\n        const profiles = data[1];\n        const ruleProviders = data[2];\n        const proxyProviders = data[3];\n\n        let m, s, o;\n\n        m = new form.Map('nikki');\n\n        s = m.section(form.NamedSection, 'editor', 'editor', _('Editor'));\n\n        o = s.option(form.ListValue, '_file', _('Choose File'));\n        o.optional = true;\n\n        for (const profile of profiles) {\n            o.value(nikki.profilesDir + '/' + profile.name, _('File:') + profile.name);\n        };\n\n        for (const subscription of subscriptions) {\n            o.value(nikki.subscriptionsDir + '/' + subscription['.name'] + '.yaml', _('Subscription:') + subscription.name);\n        };\n\n        for (const ruleProvider of ruleProviders) {\n            o.value(nikki.ruleProvidersDir + '/' + ruleProvider.name, _('Rule Provider:') + ruleProvider.name);\n        };\n\n        for (const proxyProvider of proxyProviders) {\n            o.value(nikki.proxyProvidersDir + '/' + proxyProvider.name, _('Proxy Provider:') + proxyProvider.name);\n        };\n\n        o.value(nikki.mixinFilePath, _('File for Mixin'));\n        o.value(nikki.runProfilePath, _('Profile for Startup'));\n\n        o.write = function (section_id, formvalue) {\n            return true;\n        };\n        o.onchange = function (event, section_id, value) {\n            return L.resolveDefault(fs.read_direct(value), '').then(function (content) {\n                m.lookupOption('_file_content', section_id)[0].getUIElement(section_id).setValue(content);\n            });\n        };\n\n        o = s.option(form.TextValue, '_file_content',);\n        o.rows = 25;\n        o.wrap = false;\n        o.write = function (section_id, formvalue) {\n            const path = m.lookupOption('_file', section_id)[0].formvalue(section_id);\n            return fs.write(path, formvalue);\n        };\n        o.remove = function (section_id) {\n            const path = m.lookupOption('_file', section_id)[0].formvalue(section_id);\n            return fs.write(path);\n        };\n\n        return m.render();\n    },\n    handleSaveApply: function (ev, mode) {\n        return this.handleSave(ev).finally(function () {\n            return mode === '0' ? nikki.reload() : nikki.restart();\n        });\n    },\n    handleReset: null\n});\n"
  },
  {
    "path": "luci-app-nikki/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js",
    "content": "'use strict';\n'require form';\n'require view';\n'require uci';\n'require fs';\n'require poll';\n'require tools.nikki as nikki';\n\nreturn view.extend({\n    load: function () {\n        return Promise.all([\n            uci.load('nikki'),\n            nikki.getAppLog(),\n            nikki.getCoreLog()\n        ]);\n    },\n    render: function (data) {\n        const appLog = data[1];\n        const coreLog = data[2];\n\n        let m, s, o;\n\n        m = new form.Map('nikki');\n\n        s = m.section(form.NamedSection, 'log', 'log', _('Log'));\n\n        s.tab('log_config', _('Log Config'));\n        \n        o = s.taboption('log_config', form.Flag, 'scheduled_clear', _('Scheduled Clear'));\n        o.rmempty = false;\n        \n        o = s.taboption('log_config', form.Value, 'scheduled_clear_cron', _('Scheduled Clear Cron'));\n        o.retain = true;\n        o.rmempty = false;\n        o.depends('scheduled_clear', '1');\n\n        o = s.taboption('log_config', form.Value, 'scheduled_clear_size_limit', _('Scheduled Clear Size Limit'));\n        o.retain = true;\n        o.rmempty = false;\n        o.datatype = 'uinteger';\n        o.depends('scheduled_clear', '1');\n\n        o = s.taboption('log_config', form.ListValue, 'scheduled_clear_size_limit_unit', _('Scheduled Clear Size Limit Unit'));\n        o.retain = true;\n        o.rmempty = false;\n        o.depends('scheduled_clear', '1');\n        o.value('KB', 'KB');\n        o.value('MB', 'MB');\n        o.value('GB', 'GB');\n\n        s.tab('app_log', _('App Log'));\n\n        o = s.taboption('app_log', form.Button, 'clear_app_log');\n        o.inputstyle = 'negative';\n        o.inputtitle = _('Clear Log');\n        o.onclick = function (_, section_id) {\n            m.lookupOption('_app_log', section_id)[0].getUIElement(section_id).setValue('');\n            return nikki.clearAppLog();\n        };\n\n        o = s.taboption('app_log', form.TextValue, '_app_log');\n        o.rows = 25;\n        o.wrap = false;\n        o.load = function (section_id) {\n            return appLog;\n        };\n        o.write = function (section_id, formvalue) {\n            return true;\n        };\n        poll.add(L.bind(function () {\n            const option = this;\n            return L.resolveDefault(nikki.getAppLog()).then(function (log) {\n                option.getUIElement('log').setValue(log);\n            });\n        }, o));\n\n        o = s.taboption('app_log', form.Button, 'scroll_app_log_to_bottom');\n        o.inputtitle = _('Scroll To Bottom');\n        o.onclick = function (_, section_id) {\n            const element = m.lookupOption('_app_log', section_id)[0].getUIElement(section_id).node.firstChild;\n            element.scrollTop = element.scrollHeight;\n        };\n\n        s.tab('core_log', _('Core Log'));\n\n        o = s.taboption('core_log', form.Button, 'clear_core_log');\n        o.inputstyle = 'negative';\n        o.inputtitle = _('Clear Log');\n        o.onclick = function (_, section_id) {\n            m.lookupOption('_core_log', section_id)[0].getUIElement(section_id).setValue('');\n            return nikki.clearCoreLog();\n        };\n\n        o = s.taboption('core_log', form.TextValue, '_core_log');\n        o.rows = 25;\n        o.wrap = false;\n        o.load = function (section_id) {\n            return coreLog;\n        };\n        o.write = function (section_id, formvalue) {\n            return true;\n        };\n        poll.add(L.bind(function () {\n            const option = this;\n            return L.resolveDefault(nikki.getCoreLog()).then(function (log) {\n                option.getUIElement('log').setValue(log);\n            });\n        }, o));\n\n        o = s.taboption('core_log', form.Button, 'scroll_core_log_to_bottom');\n        o.inputtitle = _('Scroll To Bottom');\n        o.onclick = function (_, section_id) {\n            const element = m.lookupOption('_core_log', section_id)[0].getUIElement(section_id).node.firstChild;\n            element.scrollTop = element.scrollHeight;\n        };\n\n        s.tab('debug_log', _('Debug Log'));\n\n        o = s.taboption('debug_log', form.Button, '_generate_download_debug_log');\n        o.inputstyle = 'negative';\n        o.inputtitle = _('Generate & Download');\n        o.onclick = function () {\n            return nikki.debug().then(function () {\n                fs.read_direct(nikki.debugLogPath, 'blob').then(function (data) {\n                    // create url\n                    const url = window.URL.createObjectURL(data, { type: 'text/markdown' });\n                    // create link\n                    const link = document.createElement('a');\n                    link.href = url;\n                    link.download = 'debug.log';\n                    // append to body\n                    document.body.appendChild(link);\n                    // download\n                    link.click();\n                    // remove from body\n                    document.body.removeChild(link);\n                    // revoke url\n                    window.URL.revokeObjectURL(url);\n                });\n            });\n        };\n\n        return m.render();\n    }\n});"
  },
  {
    "path": "luci-app-nikki/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js",
    "content": "'use strict';\n'require form';\n'require view';\n'require uci';\n'require fs';\n'require network';\n'require poll';\n'require tools.widgets as widgets';\n'require tools.nikki as nikki';\n\nreturn view.extend({\n    load: function () {\n        return Promise.all([\n            uci.load('nikki'),\n            network.getNetworks(),\n        ]);\n    },\n    render: function (data) {\n        const networks = data[1];\n\n        let m, s, o, so;\n\n        m = new form.Map('nikki');\n\n        s = m.section(form.NamedSection, 'mixin', 'mixin', _('Mixin Option'));\n\n        s.tab('general', _('General Config'));\n\n        o = s.taboption('general', form.ListValue, 'log_level', _('Log Level'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('silent');\n        o.value('error');\n        o.value('warning');\n        o.value('info');\n        o.value('debug');\n\n        o = s.taboption('general', form.ListValue, 'mode', _('Mode'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('global', _('Global Mode'));\n        o.value('rule', _('Rule Mode'));\n        o.value('direct', _('Direct Mode'));\n\n        o = s.taboption('general', form.ListValue, 'match_process', _('Match Process'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('off');\n        o.value('strict');\n        o.value('always');\n\n        o = s.taboption('general', form.ListValue, 'outbound_interface', _('Outbound Interface'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n\n        for (const network of networks) {\n            if (network.getName() === 'loopback') {\n                continue;\n            }\n            o.value(network.getName());\n        }\n\n        o = s.taboption('general', form.ListValue, 'ipv6', 'IPv6');\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('general', form.ListValue, 'unify_delay', _('Unify Delay'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('general', form.ListValue, 'tcp_concurrent', _('TCP Concurrent'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('general', form.ListValue, 'disable_tcp_keep_alive', _('Disable TCP Keep Alive'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('general', form.Value, 'tcp_keep_alive_idle', _('TCP Keep Alive Idle'));\n        o.datatype = 'uinteger';\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('general', form.Value, 'tcp_keep_alive_interval', _('TCP Keep Alive Interval'));\n        o.datatype = 'uinteger';\n        o.placeholder = _('Unmodified');\n\n        s.tab('external_control', _('External Control Config'));\n\n        o = s.taboption('external_control', form.Value, 'ui_path', _('UI Path'));\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('external_control', form.Value, 'ui_name', _('UI Name'));\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('external_control', form.Value, 'ui_url', _('UI Url'));\n        o.placeholder = _('Unmodified');\n        o.value('https://github.com/Zephyruso/zashboard/releases/latest/download/dist-cdn-fonts.zip', 'Zashboard (CDN Fonts)');\n        o.value('https://github.com/Zephyruso/zashboard/releases/latest/download/dist.zip', 'Zashboard');\n        o.value('https://github.com/MetaCubeX/metacubexd/archive/refs/heads/gh-pages.zip', 'MetaCubeXD');\n        o.value('https://github.com/MetaCubeX/Yacd-meta/archive/refs/heads/gh-pages.zip', 'YACD');\n        o.value('https://github.com/MetaCubeX/Razord-meta/archive/refs/heads/gh-pages.zip', 'Razord');\n\n        o = s.taboption('external_control', form.Value, 'api_listen', _('API Listen'));\n        o.datatype = 'ipaddrport(1)';\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('external_control', form.Value, 'api_tls_listen', _('API TLS Listen'));\n        o.datatype = 'ipaddrport(1)';\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('external_control', form.Value, 'api_tls_cert', _('API TLS Cert'));\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('external_control', form.Value, 'api_tls_key', _('API TLS Key'));\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('external_control', form.Value, 'api_tls_ech_key', _('API TLS ECH Key'));\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('external_control', form.Value, 'api_secret', _('API Secret'));\n        o.password = true;\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('external_control', form.ListValue, 'selection_cache', _('Save Proxy Selection'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        s.tab('inbound', _('Inbound Config'));\n\n        o = s.taboption('inbound', form.ListValue, 'allow_lan', _('Allow Lan'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('inbound', form.Value, 'http_port', _('HTTP Port'));\n        o.datatype = 'port';\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('inbound', form.Value, 'socks_port', _('SOCKS Port'));\n        o.datatype = 'port';\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('inbound', form.Value, 'mixed_port', _('Mixed Port'));\n        o.datatype = 'port';\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('inbound', form.Value, 'redir_port', _('Redirect Port'));\n        o.datatype = 'port';\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('inbound', form.Value, 'tproxy_port', _('TPROXY Port'));\n        o.datatype = 'port';\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('inbound', form.Flag, 'authentication', _('Overwrite Authentication'));\n        o.rmempty = false;\n\n        o = s.taboption('inbound', form.SectionValue, '_authentications', form.TableSection, 'authentication', _('Edit Authentications'));\n        o.retain = true;\n        o.depends('authentication', '1');\n\n        o.subsection.addremove = true;\n        o.subsection.anonymous = true;\n        o.subsection.sortable = true;\n\n        so = o.subsection.option(form.Flag, 'enabled', _('Enable'));\n        so.rmempty = false;\n\n        so = o.subsection.option(form.Value, 'username', _('Username'));\n        so.rmempty = false;\n\n        so = o.subsection.option(form.Value, 'password', _('Password'));\n        so.password = true;\n        so.rmempty = false;\n\n        s.tab('tun', _('TUN Config'));\n\n        o = s.taboption('tun', form.ListValue, 'tun_enabled', _('Enable'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('tun', form.Value, 'tun_device', _('Device Name'));\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('tun', form.ListValue, 'tun_stack', _('Stack'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('system', 'System');\n        o.value('gvisor', 'gVisor');\n        o.value('mixed', 'Mixed');\n\n        o = s.taboption('tun', form.Value, 'tun_mtu', _('MTU'));\n        o.datatype = 'uinteger';\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('tun', form.ListValue, 'tun_gso', _('GSO'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('tun', form.Value, 'tun_gso_max_size', _('GSO Max Size'));\n        o.datatype = 'uinteger';\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('tun', form.Flag, 'tun_dns_hijack', _('Overwrite DNS Hijack'));\n        o.rmempty = false;\n\n        o = s.taboption('tun', form.DynamicList, 'tun_dns_hijacks', _('Edit DNS Hijacks'));\n        o.retain = true;\n        o.depends('tun_dns_hijack', '1');\n        o.value('tcp://any:53');\n        o.value('udp://any:53');\n\n        s.tab('dns', _('DNS Config'));\n\n        o = s.taboption('dns', form.ListValue, 'dns_enabled', _('Enable'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('dns', form.ListValue, 'dns_cache_algorithm', _('DNS Cache Algorithm'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('lru', _('Least Recently Used (LRU)'));\n        o.value('arc', _('Adaptive Replacement Cache (ARC)'));\n\n        o = s.taboption('dns', form.Value, 'dns_listen', _('DNS Listen'));\n        o.datatype = 'ipaddrport(1)';\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('dns', form.ListValue, 'dns_ipv6', 'IPv6');\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('dns', form.ListValue, 'dns_mode', _('DNS Mode'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('redir-host', 'Redir-Host');\n        o.value('fake-ip', 'Fake-IP');\n\n        o = s.taboption('dns', form.Value, 'fake_ip_range', _('Fake-IP Range'));\n        o.datatype = 'cidr4';\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('dns', form.Value, 'fake_ip6_range', _('Fake-IP6 Range'));\n        o.datatype = 'cidr6';\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('dns', form.Value, 'fake_ip_ttl', _('Fake-IP TTL'));\n        o.datatype = 'uinteger';\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('dns', form.Flag, 'fake_ip_filter', _('Overwrite Fake-IP Filter'));\n        o.rmempty = false;\n\n        o = s.taboption('dns', form.DynamicList, 'fake_ip_filters', _('Edit Fake-IP Filters'));\n        o.retain = true;\n        o.depends('fake_ip_filter', '1');\n\n        o = s.taboption('dns', form.ListValue, 'fake_ip_filter_mode', _('Fake-IP Filter Mode'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('blacklist', _('Block Mode'));\n        o.value('whitelist', _('Allow Mode'));\n        o.value('rule', _('Rule Mode'));\n\n        o = s.taboption('dns', form.ListValue, 'fake_ip_cache', _('Fake-IP Cache'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('dns', form.ListValue, 'dns_respect_rules', _('Respect Rules'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('dns', form.ListValue, 'dns_doh_prefer_http3', _('DoH Prefer HTTP/3'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('dns', form.ListValue, 'dns_system_hosts', _('Use System Hosts'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('dns', form.ListValue, 'dns_hosts', _('Use Hosts'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('dns', form.Flag, 'hosts', _('Overwrite Hosts'));\n        o.rmempty = false;\n\n        o = s.taboption('dns', form.SectionValue, '_hosts', form.TableSection, 'hosts', _('Edit Hosts'));\n        o.retain = true;\n        o.depends('hosts', '1');\n\n        o.subsection.addremove = true;\n        o.subsection.anonymous = true;\n        o.subsection.sortable = true;\n\n        so = o.subsection.option(form.Flag, 'enabled', _('Enable'));\n        so.rmempty = false;\n\n        so = o.subsection.option(form.Value, 'domain_name', _('Domain Name'));\n        so.rmempty = false;\n\n        so = o.subsection.option(form.DynamicList, 'ip', 'IP');\n\n        o = s.taboption('dns', form.Flag, 'dns_nameserver', _('Overwrite Nameserver'));\n        o.rmempty = false;\n\n        o = s.taboption('dns', form.SectionValue, '_dns_nameservers', form.TableSection, 'nameserver', _('Edit Nameservers'));\n        o.retain = true;\n        o.depends('dns_nameserver', '1');\n\n        o.subsection.addremove = true;\n        o.subsection.anonymous = true;\n        o.subsection.sortable = true;\n\n        so = o.subsection.option(form.Flag, 'enabled', _('Enable'));\n        so.rmempty = false;\n\n        so = o.subsection.option(form.ListValue, 'type', _('Type'));\n        so.value('default-nameserver');\n        so.value('proxy-server-nameserver');\n        so.value('direct-nameserver');\n        so.value('nameserver');\n        so.value('fallback');\n\n        so = o.subsection.option(form.DynamicList, 'nameserver', _('Nameserver'));\n\n        o = s.taboption('dns', form.Flag, 'dns_proxy_server_nameserver_policy', _('Overwrite Proxy Server Nameserver Policy'));\n        o.rmempty = false;\n\n        o = s.taboption('dns', form.SectionValue, '_dns_proxy_server_nameserver_policies', form.TableSection, 'proxy_server_nameserver_policy', _('Edit Proxy Server Nameserver Policies'));\n        o.retain = true;\n        o.depends('dns_proxy_server_nameserver_policy', '1');\n\n        o.subsection.addremove = true;\n        o.subsection.anonymous = true;\n        o.subsection.sortable = true;\n\n        so = o.subsection.option(form.Flag, 'enabled', _('Enable'));\n        so.rmempty = false;\n\n        so = o.subsection.option(form.Value, 'matcher', _('Matcher'));\n        so.rmempty = false;\n\n        so = o.subsection.option(form.DynamicList, 'nameserver', _('Nameserver'));\n\n        o = s.taboption('dns', form.ListValue, 'dns_direct_nameserver_follow_policy', _('Direct Nameserver Follow Policy'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('dns', form.Flag, 'dns_nameserver_policy', _('Overwrite Nameserver Policy'));\n        o.rmempty = false;\n\n        o = s.taboption('dns', form.SectionValue, '_dns_nameserver_policies', form.TableSection, 'nameserver_policy', _('Edit Nameserver Policies'));\n        o.retain = true;\n        o.depends('dns_nameserver_policy', '1');\n\n        o.subsection.addremove = true;\n        o.subsection.anonymous = true;\n        o.subsection.sortable = true;\n\n        so = o.subsection.option(form.Flag, 'enabled', _('Enable'));\n        so.rmempty = false;\n\n        so = o.subsection.option(form.Value, 'matcher', _('Matcher'));\n        so.rmempty = false;\n\n        so = o.subsection.option(form.DynamicList, 'nameserver', _('Nameserver'));\n\n        s.tab('sniffer', _('Sniffer Config'));\n\n        o = s.taboption('sniffer', form.ListValue, 'sniffer', _('Enable'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('sniffer', form.ListValue, 'sniffer_sniff_dns_mapping', _('Sniff Redir-Host'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('sniffer', form.ListValue, 'sniffer_sniff_pure_ip', _('Sniff Pure IP'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('sniffer', form.Flag, 'sniffer_force_domain_name', _('Overwrite Force Sniff Domain Name'));\n        o.rmempty = false;\n\n        o = s.taboption('sniffer', form.DynamicList, 'sniffer_force_domain_names', _('Force Sniff Domain Name'));\n        o.retain = true;\n        o.depends('sniffer_force_domain_name', '1');\n\n        o = s.taboption('sniffer', form.Flag, 'sniffer_ignore_domain_name', _('Overwrite Ignore Sniff Domain Name'));\n        o.rmempty = false;\n\n        o = s.taboption('sniffer', form.DynamicList, 'sniffer_ignore_domain_names', _('Ignore Sniff Domain Name'));\n        o.retain = true;\n        o.depends('sniffer_ignore_domain_name', '1');\n\n        o = s.taboption('sniffer', form.Flag, 'sniffer_sniff', _('Overwrite Sniff By Protocol'));\n        o.rmempty = false;\n\n        o = s.taboption('sniffer', form.SectionValue, '_sniffer_sniffs', form.TableSection, 'sniff', _('Sniff By Protocol'));\n        o.retain = true;\n        o.depends('sniffer_sniff', '1');\n\n        o.subsection.anonymous = true;\n        o.subsection.addremove = false;\n\n        so = o.subsection.option(form.Flag, 'enabled', _('Enable'));\n        so.rmempty = false;\n\n        so = o.subsection.option(form.ListValue, 'protocol', _('Protocol'));\n        so.value('HTTP');\n        so.value('TLS');\n        so.value('QUIC');\n        so.readonly = true;\n\n        so = o.subsection.option(form.DynamicList, 'port', _('Port'));\n        so.datatype = 'portrange';\n\n        so = o.subsection.option(form.Flag, 'overwrite_destination', _('Overwrite Destination'));\n        so.rmempty = false;\n\n        s.tab('rule', _('Rule Config'));\n\n        o = s.taboption('rule', form.Flag, 'rule_provider', _('Append Rule Provider'));\n        o.rmempty = false;\n\n        o = s.taboption('rule', form.SectionValue, '_rule_providers', form.GridSection, 'rule_provider', _('Edit Rule Providers'));\n        o.retain = true;\n        o.depends('rule_provider', '1');\n\n        o.subsection.anonymous = true;\n        o.subsection.addremove = true;\n        o.subsection.sortable = true;\n\n        so = o.subsection.option(form.Flag, 'enabled', _('Enable'));\n        so.default = 1;\n        so.editable = true;\n        so.modalonly = false;\n        so.rmempty = false;\n\n        so = o.subsection.option(form.Value, 'name', _('Name'));\n        so.rmempty = false;\n\n        so = o.subsection.option(form.ListValue, 'type', _('Type'));\n        so.default = 'http';\n        so.rmempty = false;\n        so.value('http');\n        so.value('file');\n\n        so = o.subsection.option(form.Value, 'url', _('Url'));\n        so.modalonly = true;\n        so.rmempty = false;\n        so.depends('type', 'http');\n\n        so = o.subsection.option(form.Value, 'node', _('Node'));\n        so.default = 'DIRECT';\n        so.modalonly = true;\n        so.depends('type', 'http');\n        so.value('GLOBAL');\n        so.value('DIRECT');\n\n        so = o.subsection.option(form.Value, 'file_size_limit', _('File Size Limit'));\n        so.datatype = 'uinteger';\n        so.default = 0;\n        so.modalonly = true;\n        so.depends('type', 'http');\n\n        so = o.subsection.option(form.FileUpload, 'file_path', _('File Path'));\n        so.modalonly = true;\n        so.rmempty = false;\n        so.root_directory = nikki.ruleProvidersDir;\n        so.depends('type', 'file');\n\n        so = o.subsection.option(form.ListValue, 'file_format', _('File Format'));\n        so.default = 'yaml';\n        so.value('mrs');\n        so.value('yaml');\n        so.value('text');\n\n        so = o.subsection.option(form.ListValue, 'behavior', _('Behavior'));\n        so.default = 'classical';\n        so.rmempty = false;\n        so.value('classical');\n        so.value('domain');\n        so.value('ipcidr');\n\n        so = o.subsection.option(form.Value, 'update_interval', _('Update Interval'));\n        so.datatype = 'uinteger';\n        so.default = 0;\n        so.modalonly = true;\n        so.depends('type', 'http');\n\n        o = s.taboption('rule', form.Flag, 'rule', _('Append Rule'));\n        o.rmempty = false;\n\n        o = s.taboption('rule', form.SectionValue, '_rules', form.TableSection, 'rule', _('Edit Rules'));\n        o.retain = true;\n        o.depends('rule', '1');\n\n        o.subsection.anonymous = true;\n        o.subsection.addremove = true;\n        o.subsection.sortable = true;\n\n        so = o.subsection.option(form.Flag, 'enabled', _('Enable'));\n        so.default = 1;\n        so.rmempty = false;\n\n        so = o.subsection.option(form.Value, 'type', _('Type'));\n        so.rmempty = false;\n        so.value('RULE-SET', _('Rule Set'));\n        so.value('DOMAIN', _('Domain Name'));\n        so.value('DOMAIN-SUFFIX', _('Domain Name Suffix'));\n        so.value('DOMAIN-WILDCARD', _('Domain Name Wildcard'));\n        so.value('DOMAIN-KEYWORD', _('Domain Name Keyword'));\n        so.value('DOMAIN-REGEX', _('Domain Name Regex'));\n        so.value('IP-CIDR', _('Destination IP'));\n        so.value('DST-PORT', _('Destination Port'));\n        so.value('PROCESS-NAME', _('Process Name'));\n        so.value('GEOSITE', _('Domain Name Geo'));\n        so.value('GEOIP', _('Destination IP Geo'));\n\n        so = o.subsection.option(form.Value, 'matcher', _('Matcher'));\n        so.rmempty = false;\n        so.depends({ 'type': /MATCH/i, '!reverse': true });\n\n        so = o.subsection.option(form.Value, 'node', _('Node'));\n        so.default = 'GLOBAL';\n        so.value('GLOBAL');\n        so.value('DIRECT');\n        so.value('REJECT');\n        so.value('REJECT-DROP');\n\n        so = o.subsection.option(form.Flag, 'no_resolve', _('No Resolve'));\n        so.rmempty = false;\n        so.depends('type', /IP-CIDR6?/i);\n        so.depends('type', /IP-ASN/i);\n        so.depends('type', /GEOIP/i);\n\n        s.tab('geox', _('GeoX Config'));\n\n        o = s.taboption('geox', form.ListValue, 'geoip_format', _('GeoIP Format'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('dat', 'DAT');\n        o.value('mmdb', 'MMDB');\n\n        o = s.taboption('geox', form.ListValue, 'geodata_loader', _('GeoData Loader'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('standard', _('Standard Loader'));\n        o.value('memconservative', _('Memory Conservative Loader'));\n\n        o = s.taboption('geox', form.Value, 'geosite_url', _('GeoSite Url'));\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('geox', form.Value, 'geoip_mmdb_url', _('GeoIP(MMDB) Url'));\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('geox', form.Value, 'geoip_dat_url', _('GeoIP(DAT) Url'));\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('geox', form.Value, 'geoip_asn_url', _('GeoIP(ASN) Url'));\n        o.placeholder = _('Unmodified');\n\n        o = s.taboption('geox', form.ListValue, 'geox_auto_update', _('GeoX Auto Update'));\n        o.optional = true;\n        o.placeholder = _('Unmodified');\n        o.value('0', _('Disable'));\n        o.value('1', _('Enable'));\n\n        o = s.taboption('geox', form.Value, 'geox_update_interval', _('GeoX Update Interval'));\n        o.datatype = 'uinteger';\n        o.placeholder = _('Unmodified');\n\n        s.tab('mixin_file_content', _('Mixin File Content'));\n\n        o = s.taboption('mixin_file_content', form.Flag, 'mixin_file_content', _('Enable'), _('Please go to the editor tab to edit the file for mixin'));\n        o.rmempty = false;\n\n        return m.render();\n    }\n});"
  },
  {
    "path": "luci-app-nikki/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js",
    "content": "'use strict';\n'require form';\n'require view';\n'require uci';\n'require tools.nikki as nikki';\n\nreturn view.extend({\n    load: function () {\n        return Promise.all([\n            uci.load('nikki')\n        ]);\n    },\n    render: function (data) {\n        let m, s, o, so;\n\n        m = new form.Map('nikki');\n\n        s = m.section(form.NamedSection, 'config', 'config', _('Profile'));\n\n        o = s.option(form.FileUpload, '_upload_profile', _('Upload Profile'));\n        o.browser = true;\n        o.enable_download = true;\n        o.root_directory = nikki.profilesDir;\n        o.write = function (section_id, formvalue) {\n            return true;\n        };\n\n        s = m.section(form.GridSection, 'subscription', _('Subscription'));\n        s.addremove = true;\n        s.anonymous = true;\n        s.sortable = true;\n        s.modaltitle = _('Edit Subscription');\n\n        o = s.option(form.Value, 'name', _('Subscription Name'));\n        o.rmempty = false;\n\n        o = s.option(form.Value, 'used', _('Used'));\n        o.modalonly = false;\n        o.optional = true;\n        o.readonly = true;\n\n        o = s.option(form.Value, 'total', _('Total'));\n        o.modalonly = false;\n        o.optional = true;\n        o.readonly = true;\n\n        o = s.option(form.Value, 'expire', _('Expire At'));\n        o.modalonly = false;\n        o.optional = true;\n        o.readonly = true;\n\n        o = s.option(form.Value, 'update', _('Update At'));\n        o.modalonly = false;\n        o.optional = true;\n        o.readonly = true;\n\n        o = s.option(form.Button, 'update_subscription');\n        o.editable = true;\n        o.inputstyle = 'positive';\n        o.inputtitle = _('Update');\n        o.modalonly = false;\n        o.onclick = function (_, section_id) {\n            return nikki.updateSubscription(section_id);\n        };\n\n        o = s.option(form.Value, 'info_url', _('Subscription Info Url'));\n        o.modalonly = true;\n\n        o = s.option(form.Value, 'url', _('Subscription Url'));\n        o.modalonly = true;\n        o.rmempty = false;\n\n        o = s.option(form.Value, 'user_agent', _('User Agent'));\n        o.default = 'clash';\n        o.modalonly = true;\n        o.rmempty = false;\n        o.value('clash');\n        o.value('clash.meta');\n        o.value('mihomo');\n\n        o = s.option(form.ListValue, 'prefer', _('Prefer'));\n        o.default = 'remote';\n        o.modalonly = true;\n        o.value('remote', _('Remote'));\n        o.value('local', _('Local'));\n\n        return m.render();\n    }\n});\n"
  },
  {
    "path": "luci-app-nikki/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js",
    "content": "'use strict';\n'require form';\n'require view';\n'require uci';\n'require network';\n'require tools.widgets as widgets';\n'require tools.nikki as nikki';\n\nreturn view.extend({\n    load: function () {\n        return Promise.all([\n            uci.load('nikki'),\n            network.getHostHints(),\n            network.getNetworks(),\n            nikki.getIdentifiers(),\n        ]);\n    },\n    render: function (data) {\n        const hosts = data[1].hosts;\n        const networks = data[2];\n        const users = data[3]?.users ?? [];\n        const groups = data[3]?.groups ?? [];\n        const cgroups = data[3]?.cgroups ?? [];\n\n        let m, s, o, so;\n\n        m = new form.Map('nikki');\n\n        s = m.section(form.NamedSection, 'proxy', 'proxy', _('Proxy Config'));\n\n        s.tab('proxy', _('Proxy Config'));\n\n        o = s.taboption('proxy', form.Flag, 'enabled', _('Enable'));\n        o.rmempty = false;\n\n        o = s.taboption('proxy', form.ListValue, 'tcp_mode', _('TCP Mode'));\n        o.optional = true;\n        o.placeholder = _('Disable');\n        o.value('redirect', _('Redirect Mode'));\n        o.value('tproxy', _('TPROXY Mode'));\n        o.value('tun', _('TUN Mode'));\n\n        o = s.taboption('proxy', form.ListValue, 'udp_mode', _('UDP Mode'));\n        o.optional = true;\n        o.placeholder = _('Disable');\n        o.value('tproxy', _('TPROXY Mode'));\n        o.value('tun', _('TUN Mode'));\n\n        o = s.taboption('proxy', form.Flag, 'ipv4_dns_hijack', _('IPv4 DNS Hijack'));\n        o.rmempty = false;\n\n        o = s.taboption('proxy', form.Flag, 'ipv6_dns_hijack', _('IPv6 DNS Hijack'));\n        o.rmempty = false;\n\n        o = s.taboption('proxy', form.Flag, 'ipv4_proxy', _('IPv4 Proxy'));\n        o.rmempty = false;\n\n        o = s.taboption('proxy', form.Flag, 'ipv6_proxy', _('IPv6 Proxy'));\n        o.rmempty = false;\n\n        o = s.taboption('proxy', form.Flag, 'fake_ip_ping_hijack', _('Fake-IP Ping Hijack'));\n        o.rmempty = false;\n\n        s.tab('router', _('Router Proxy'));\n\n        o = s.taboption('router', form.Flag, 'router_proxy', _('Enable'));\n        o.rmempty = false;\n\n        o = s.taboption('router', form.SectionValue, '_router_access_control', form.TableSection, 'router_access_control', _('Access Control'));\n        o.retain = true;\n        o.depends('router_proxy', '1');\n\n        o.subsection.addremove = true;\n        o.subsection.anonymous = true;\n        o.subsection.sortable = true;\n\n        so = o.subsection.option(form.Flag, 'enabled', _('Enable'));\n        so.default = '1';\n        so.rmempty = false;\n\n        so = o.subsection.option(form.DynamicList, 'user', _('User'));\n\n        for (const user of users) {\n            so.value(user);\n        };\n\n        so = o.subsection.option(form.DynamicList, 'group', _('Group'));\n\n        for (const group of groups) {\n            so.value(group);\n        };\n\n        so = o.subsection.option(form.DynamicList, 'cgroup', _('CGroup'));\n\n        for (const cgroup of cgroups) {\n            so.value(cgroup);\n        };\n\n        so = o.subsection.option(form.Flag, 'dns', _('DNS'));\n        so.rmempty = false;\n\n        so = o.subsection.option(form.Flag, 'proxy', _('Proxy'));\n        so.rmempty = false;\n\n        s.tab('lan', _('LAN Proxy'));\n\n        o = s.taboption('lan', form.Flag, 'lan_proxy', _('Enable'));\n        o.rmempty = false;\n\n        o = s.taboption('lan', form.DynamicList, 'lan_inbound_interface', _('Inbound Interface'));\n        o.retain = true;\n        o.rmempty = false;\n        o.depends('lan_proxy', '1');\n\n        for (const network of networks) {\n            if (network.getName() === 'loopback') {\n                continue;\n            }\n            o.value(network.getName());\n        }\n\n        o = s.taboption('lan', form.SectionValue, '_lan_access_control', form.TableSection, 'lan_access_control', _('Access Control'));\n        o.retain = true;\n        o.depends('lan_proxy', '1');\n\n        o.subsection.addremove = true;\n        o.subsection.anonymous = true;\n        o.subsection.sortable = true;\n\n        so = o.subsection.option(form.Flag, 'enabled', _('Enable'));\n        so.default = '1';\n        so.rmempty = false;\n\n        so = o.subsection.option(form.DynamicList, 'ip', 'IP');\n        so.datatype = 'ip4addr';\n\n        for (const mac in hosts) {\n            const host = hosts[mac];\n            for (const ip of host.ipaddrs) {\n                const hint = host.name ?? mac;\n                so.value(ip, hint ? '%s (%s)'.format(ip, hint) : ip);\n            };\n        };\n\n        so = o.subsection.option(form.DynamicList, 'ip6', 'IP6');\n        so.datatype = 'ip6addr';\n\n        for (const mac in hosts) {\n            const host = hosts[mac];\n            for (const ip of host.ip6addrs) {\n                const hint = host.name ?? mac;\n                so.value(ip, hint ? '%s (%s)'.format(ip, hint) : ip);\n            };\n        };\n\n        so = o.subsection.option(form.DynamicList, 'mac', 'MAC');\n        so.datatype = 'macaddr';\n\n        for (const mac in hosts) {\n            const host = hosts[mac];\n            const hint = host.name ?? host.ipaddrs[0];\n            so.value(mac, hint ? '%s (%s)'.format(mac, hint) : mac);\n        };\n\n        so = o.subsection.option(form.Flag, 'dns', _('DNS'));\n        so.rmempty = false;\n\n        so = o.subsection.option(form.Flag, 'proxy', _('Proxy'));\n        so.rmempty = false;\n\n        s.tab('bypass', _('Bypass'));\n\n        o = s.taboption('bypass', form.Flag, 'bypass_china_mainland_ip', _('Bypass China Mainland IP'));\n        o.rmempty = false;\n\n        o = s.taboption('bypass', form.Flag, 'bypass_china_mainland_ip6', _('Bypass China Mainland IP6'));\n        o.rmempty = false;\n\n        o = s.taboption('bypass', form.Value, 'proxy_tcp_dport', _('Destination TCP Port to Proxy'));\n        o.rmempty = false;\n        o.value('0-65535', _('All Port'));\n        o.value('21 22 80 110 143 194 443 465 853 993 995 8080 8443', _('Commonly Used Port'));\n\n        o = s.taboption('bypass', form.Value, 'proxy_udp_dport', _('Destination UDP Port to Proxy'));\n        o.rmempty = false;\n        o.value('0-65535', _('All Port'));\n        o.value('123 443 8443', _('Commonly Used Port'));\n\n        o = s.taboption('bypass', form.DynamicList, 'bypass_dscp', _('Bypass DSCP'));\n        o.datatype = 'range(0, 63)';\n\n        o = s.taboption('bypass', form.DynamicList, 'bypass_fwmark', _('Bypass FWMark'));\n\n        s.tab('misc', _('Misc'));\n\n        o = s.taboption('misc', form.DynamicList, 'reserved_ip', _('Reserved IP'));\n        o.datatype = 'ip4addr';\n\n        o = s.taboption('misc', form.DynamicList, 'reserved_ip6', _('Reserved IP6'));\n        o.datatype = 'ip6addr';\n\n        o = s.taboption('misc', form.Value, 'tun_timeout', _('TUN Timeout'));\n        o.datatype = 'uinteger';\n        o.rmempty = false;\n\n        o = s.taboption('misc', form.Value, 'tun_interval', _('TUN Interval'));\n        o.datatype = 'uinteger';\n        o.rmempty = false;\n\n        return m.render();\n    }\n});\n"
  },
  {
    "path": "luci-app-nikki/luci-app-nikki/po/ru/nikki.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Last-Translator: Automatically generated\\n\"\n\"Language-Team: none\\n\"\n\"Language: ru\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:112\nmsgid \"API Listen\"\nmsgstr \"Прослушивание API\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:129\nmsgid \"API Secret\"\nmsgstr \"Секрет API\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:120\nmsgid \"API TLS Cert\"\nmsgstr \"Сертификат TLS API\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:126\nmsgid \"API TLS ECH Key\"\nmsgstr \"Ключ ECH TLS API\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:123\nmsgid \"API TLS Key\"\nmsgstr \"Ключ TLS API\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:116\nmsgid \"API TLS Listen\"\nmsgstr \"Прослушивание TLS API\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:69\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:122\nmsgid \"Access Control\"\nmsgstr \"Контроль доступа\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:241\nmsgid \"Adaptive Replacement Cache (ARC)\"\nmsgstr \"Адаптивный кэш замещения (ARC)\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:141\nmsgid \"Address Space Size Hard Limit\"\nmsgstr \"Жёсткий лимит адресного пространства\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:137\nmsgid \"Address Space Size Soft Limit\"\nmsgstr \"Мягкий лимит адресного пространства\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:181\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:186\nmsgid \"All Port\"\nmsgstr \"Все порты\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:141\nmsgid \"Allow Lan\"\nmsgstr \"Разрешить LAN\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:282\nmsgid \"Allow Mode\"\nmsgstr \"Режим разрешения\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:94\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:13\nmsgid \"App Config\"\nmsgstr \"Настройки приложения\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:51\nmsgid \"App Log\"\nmsgstr \"Лог приложения\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:43\nmsgid \"App Version\"\nmsgstr \"Версия приложения\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:531\nmsgid \"Append Rule\"\nmsgstr \"Добавить правило\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:462\nmsgid \"Append Rule Provider\"\nmsgstr \"Добавить список правил\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:518\nmsgid \"Behavior\"\nmsgstr \"Поведение\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:281\nmsgid \"Block Mode\"\nmsgstr \"Режим блокировки\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:171\nmsgid \"Bypass\"\nmsgstr \"Обход\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:173\nmsgid \"Bypass China Mainland IP\"\nmsgstr \"Обход IP материкового Китая\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:176\nmsgid \"Bypass China Mainland IP6\"\nmsgstr \"Обход IPv6 материкового Китая\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:189\nmsgid \"Bypass DSCP\"\nmsgstr \"Обход DSCP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:192\nmsgid \"Bypass FWMark\"\nmsgstr \"Обход FWMark\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:93\nmsgid \"CGroup\"\nmsgstr \"CGroup\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:29\nmsgid \"Choose File\"\nmsgstr \"Выбрать файл\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:99\nmsgid \"Choose Profile\"\nmsgstr \"Выбрать профиль\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:55\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:88\nmsgid \"Clear Log\"\nmsgstr \"Очистить лог\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:182\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:187\nmsgid \"Commonly Used Port\"\nmsgstr \"Часто используемые порты\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:84\nmsgid \"Core Log\"\nmsgstr \"Лог ядра\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:125\nmsgid \"Core Only\"\nmsgstr \"Только ядро\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:57\nmsgid \"Core Status\"\nmsgstr \"Статус ядра\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:50\nmsgid \"Core Version\"\nmsgstr \"Версия ядра\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:99\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:165\nmsgid \"DNS\"\nmsgstr \"DNS\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:237\nmsgid \"DNS Cache Algorithm\"\nmsgstr \"Алгоритм кэша DNS\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:229\nmsgid \"DNS Config\"\nmsgstr \"Настройки DNS\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:243\nmsgid \"DNS Listen\"\nmsgstr \"Прослушивание DNS\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:253\nmsgid \"DNS Mode\"\nmsgstr \"Режим DNS\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:117\nmsgid \"Debug Log\"\nmsgstr \"Отладочный лог\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:554\nmsgid \"Destination IP\"\nmsgstr \"IP назначения\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558\nmsgid \"Destination IP Geo\"\nmsgstr \"Гео-IP назначения\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:555\nmsgid \"Destination Port\"\nmsgstr \"Порт назначения\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:179\nmsgid \"Destination TCP Port to Proxy\"\nmsgstr \"TCP-порт назначения для прокси\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:184\nmsgid \"Destination UDP Port to Proxy\"\nmsgstr \"UDP-порт назначения для прокси\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:196\nmsgid \"Device Name\"\nmsgstr \"Имя устройства\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:44\nmsgid \"Direct Mode\"\nmsgstr \"Прямой режим\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:376\nmsgid \"Direct Nameserver Follow Policy\"\nmsgstr \"Политика прямого DNS-сервера\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:67\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:73\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:79\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:85\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:136\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:144\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:193\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:213\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:234\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:250\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:288\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:294\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:300\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:306\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:312\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:379\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:406\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:412\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:418\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:606\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:38\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:45\nmsgid \"Disable\"\nmsgstr \"Отключить\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:183\nmsgid \"Disable ECN of quic-go\"\nmsgstr \"Отключить ECN в quic-go\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:180\nmsgid \"Disable GSO of quic-go\"\nmsgstr \"Отключить GSO в quic-go\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:177\nmsgid \"Disable Loopback Detector\"\nmsgstr \"Отключить детектор петли\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:82\nmsgid \"Disable TCP Keep Alive\"\nmsgstr \"Отключить TCP Keep-Alive\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:297\nmsgid \"DoH Prefer HTTP/3\"\nmsgstr \"Предпочитать HTTP/3 для DoH\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:329\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:549\nmsgid \"Domain Name\"\nmsgstr \"Доменное имя\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:557\nmsgid \"Domain Name Geo\"\nmsgstr \"Гео по доменному имени\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:552\nmsgid \"Domain Name Keyword\"\nmsgstr \"Ключевое слово домена\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553\nmsgid \"Domain Name Regex\"\nmsgstr \"Регулярное выражение домена\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550\nmsgid \"Domain Name Suffix\"\nmsgstr \"Суффикс домена\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:551\nmsgid \"Domain Name Wildcard\"\nmsgstr \"Шаблон домена\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:170\nmsgid \"Edit Authentications\"\nmsgstr \"Редактировать учётные данные\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:223\nmsgid \"Edit DNS Hijacks\"\nmsgstr \"Редактировать подмену DNS\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:274\nmsgid \"Edit Fake-IP Filters\"\nmsgstr \"Редактировать фильтры Fake-IP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:318\nmsgid \"Edit Hosts\"\nmsgstr \"Редактировать hosts\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:385\nmsgid \"Edit Nameserver Policies\"\nmsgstr \"Редактировать политики DNS-серверов\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:337\nmsgid \"Edit Nameservers\"\nmsgstr \"Редактировать DNS-серверы\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:360\nmsgid \"Edit Proxy Server Nameserver Policies\"\nmsgstr \"Редактировать политики DNS-сервера прокси\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:465\nmsgid \"Edit Rule Providers\"\nmsgstr \"Редактировать источники правил\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:534\nmsgid \"Edit Rules\"\nmsgstr \"Редактировать правила\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:32\nmsgid \"Edit Subscription\"\nmsgstr \"Изменить подписку\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:27\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:45\nmsgid \"Editor\"\nmsgstr \"Редактор\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:96\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:68\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:74\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:80\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:86\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:137\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:145\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:178\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:190\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:194\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:214\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:231\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:235\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:251\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:289\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:295\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:301\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:307\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:313\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:326\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:345\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:368\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:380\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:393\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:403\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:407\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:413\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:419\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:445\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:473\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:542\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:607\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:615\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:33\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:66\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:77\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:107\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:130\nmsgid \"Enable\"\nmsgstr \"Включить\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:167\nmsgid \"Environment Variable Config\"\nmsgstr \"Переменные окружения\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:47\nmsgid \"Expire At\"\nmsgstr \"Истекает\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:96\nmsgid \"External Control Config\"\nmsgstr \"Настройки внешнего управления\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:285\nmsgid \"Fake-IP Cache\"\nmsgstr \"Кэш Fake-IP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:278\nmsgid \"Fake-IP Filter Mode\"\nmsgstr \"Режим фильтрации Fake-IP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:61\nmsgid \"Fake-IP Ping Hijack\"\nmsgstr \"Перехват ping для Fake-IP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:259\nmsgid \"Fake-IP Range\"\nmsgstr \"Диапазон Fake-IP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:267\nmsgid \"Fake-IP TTL\"\nmsgstr \"TTL Fake-IP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:263\nmsgid \"Fake-IP6 Range\"\nmsgstr \"Диапазон Fake-IP6\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:132\nmsgid \"Fast Reload\"\nmsgstr \"Быстрая перезагрузка\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:512\nmsgid \"File Format\"\nmsgstr \"Формат файла\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506\nmsgid \"File Path\"\nmsgstr \"Путь к файлу\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:500\nmsgid \"File Size Limit\"\nmsgstr \"Ограничение размера файла\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:48\nmsgid \"File for Mixin\"\nmsgstr \"Файл для mixin\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:103\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:33\nmsgid \"File:\"\nmsgstr \"Файл:\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:424\nmsgid \"Force Sniff Domain Name\"\nmsgstr \"Принудительно определять домены\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:210\nmsgid \"GSO\"\nmsgstr \"GSO\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:216\nmsgid \"GSO Max Size\"\nmsgstr \"Макс. размер GSO\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:130\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:28\nmsgid \"General Config\"\nmsgstr \"Основные настройки\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:121\nmsgid \"Generate & Download\"\nmsgstr \"Сформировать и скачать\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:585\nmsgid \"GeoData Loader\"\nmsgstr \"Загрузчик GeoData\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:579\nmsgid \"GeoIP Format\"\nmsgstr \"Формат GeoIP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:600\nmsgid \"GeoIP(ASN) Url\"\nmsgstr \"URL GeoIP(ASN)\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:597\nmsgid \"GeoIP(DAT) Url\"\nmsgstr \"URL GeoIP(DAT)\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:594\nmsgid \"GeoIP(MMDB) Url\"\nmsgstr \"URL GeoIP(MMDB)\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:591\nmsgid \"GeoSite Url\"\nmsgstr \"URL GeoSite\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:603\nmsgid \"GeoX Auto Update\"\nmsgstr \"Автообновление GeoX\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:577\nmsgid \"GeoX Config\"\nmsgstr \"Настройки GeoX\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:609\nmsgid \"GeoX Update Interval\"\nmsgstr \"Интервал обновления GeoX\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:42\nmsgid \"Global Mode\"\nmsgstr \"Глобальный режим\"\n\n#: applications/luci-app-nikki/root/usr/share/rpcd/acl.d/luci-app-nikki.json:3\nmsgid \"Grant access to nikki procedures\"\nmsgstr \"Предоставить доступ к процедурам nikki\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:87\nmsgid \"Group\"\nmsgstr \"Группа\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:147\nmsgid \"HTTP Port\"\nmsgstr \"Порт HTTP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:149\nmsgid \"Heap Size Hard Limit\"\nmsgstr \"Жёсткий лимит размера кучи\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:145\nmsgid \"Heap Size Soft Limit\"\nmsgstr \"Мягкий лимит размера кучи\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38\nmsgid \"How To Use\"\nmsgstr \"Как использовать\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:49\nmsgid \"IPv4 DNS Hijack\"\nmsgstr \"Перехват DNS IPv4\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:55\nmsgid \"IPv4 Proxy\"\nmsgstr \"Прокси IPv4\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:52\nmsgid \"IPv6 DNS Hijack\"\nmsgstr \"Перехват DNS IPv6\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:58\nmsgid \"IPv6 Proxy\"\nmsgstr \"Прокси IPv6\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:431\nmsgid \"Ignore Sniff Domain Name\"\nmsgstr \"Игнорировать определение доменов\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:139\nmsgid \"Inbound Config\"\nmsgstr \"Настройки входящих\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:110\nmsgid \"Inbound Interface\"\nmsgstr \"Входящий интерфейс\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:105\nmsgid \"LAN Proxy\"\nmsgstr \"LAN-прокси\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:240\nmsgid \"Least Recently Used (LRU)\"\nmsgstr \"Наименее недавно использованный (LRU)\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:85\nmsgid \"Local\"\nmsgstr \"Локально\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:25\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:53\nmsgid \"Log\"\nmsgstr \"Журнал\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:27\nmsgid \"Log Config\"\nmsgstr \"Настройки журнала\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:30\nmsgid \"Log Level\"\nmsgstr \"Уровень логирования\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:206\nmsgid \"MTU\"\nmsgstr \"MTU\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:46\nmsgid \"Match Process\"\nmsgstr \"Сопоставление процесса\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:371\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:396\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:560\nmsgid \"Matcher\"\nmsgstr \"Сопоставитель\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:589\nmsgid \"Memory Conservative Loader\"\nmsgstr \"Загрузчик с экономией памяти\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:194\nmsgid \"Misc\"\nmsgstr \"Прочее\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:155\nmsgid \"Mixed Port\"\nmsgstr \"Смешанный порт\"\n\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:29\nmsgid \"Mixin Config\"\nmsgstr \"Настройки mixin\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:613\nmsgid \"Mixin File Content\"\nmsgstr \"Содержимое файла mixin\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:26\nmsgid \"Mixin Option\"\nmsgstr \"Опции mixin\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:39\nmsgid \"Mode\"\nmsgstr \"Режим\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:479\nmsgid \"Name\"\nmsgstr \"Имя\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:355\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:374\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:399\nmsgid \"Nameserver\"\nmsgstr \"DNS-сервер\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:3\nmsgid \"Nikki\"\nmsgstr \"Nikki\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:571\nmsgid \"No Resolve\"\nmsgstr \"Не выполнять разрешение\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:493\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:564\nmsgid \"Node\"\nmsgstr \"Узел\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:15\nmsgid \"Not Running\"\nmsgstr \"Не запущен\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:164\nmsgid \"Number of Open Files Hard Limit\"\nmsgstr \"Жёсткий лимит открытых файлов\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:161\nmsgid \"Number of Open Files Soft Limit\"\nmsgstr \"Мягкий лимит открытых файлов\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:89\nmsgid \"Open Dashboard\"\nmsgstr \"Открыть панель\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:53\nmsgid \"Outbound Interface\"\nmsgstr \"Исходящий интерфейс\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:167\nmsgid \"Overwrite Authentication\"\nmsgstr \"Заменить учётные данные\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:220\nmsgid \"Overwrite DNS Hijack\"\nmsgstr \"Переопределить перехват DNS\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:457\nmsgid \"Overwrite Destination\"\nmsgstr \"Переопределить назначение\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:271\nmsgid \"Overwrite Fake-IP Filter\"\nmsgstr \"Переопределить фильтр Fake-IP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:421\nmsgid \"Overwrite Force Sniff Domain Name\"\nmsgstr \"Переопределить принудительное определение доменов\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:315\nmsgid \"Overwrite Hosts\"\nmsgstr \"Переопределить hosts\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:428\nmsgid \"Overwrite Ignore Sniff Domain Name\"\nmsgstr \"Переопределить игнорирование определения доменов\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:334\nmsgid \"Overwrite Nameserver\"\nmsgstr \"Переопределить DNS-сервер\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:382\nmsgid \"Overwrite Nameserver Policy\"\nmsgstr \"Переопределить политику DNS-серверов\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:357\nmsgid \"Overwrite Proxy Server Nameserver Policy\"\nmsgstr \"Перезаписать политику DNS-сервера прокси\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:435\nmsgid \"Overwrite Sniff By Protocol\"\nmsgstr \"Переопределить определение по протоколу\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:184\nmsgid \"Password\"\nmsgstr \"Пароль\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:615\nmsgid \"Please go to the editor tab to edit the file for mixin\"\nmsgstr \"Перейдите на вкладку редактора, чтобы изменить файл mixin\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:454\nmsgid \"Port\"\nmsgstr \"Порт\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:81\nmsgid \"Prefer\"\nmsgstr \"Предпочтение\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:556\nmsgid \"Process Name\"\nmsgstr \"Имя процесса\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:18\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:21\nmsgid \"Profile\"\nmsgstr \"Профиль\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:49\nmsgid \"Profile for Startup\"\nmsgstr \"Профиль для автозапуска\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:448\nmsgid \"Protocol\"\nmsgstr \"Протокол\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:102\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:168\nmsgid \"Proxy\"\nmsgstr \"Прокси\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:29\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:31\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:37\nmsgid \"Proxy Config\"\nmsgstr \"Настройки прокси\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:45\nmsgid \"Proxy Provider:\"\nmsgstr \"Провайдер прокси:\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:135\nmsgid \"RLIMIT Config\"\nmsgstr \"Настройки RLIMIT\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:39\nmsgid \"Redirect Mode\"\nmsgstr \"Режим перенаправления\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:159\nmsgid \"Redirect Port\"\nmsgstr \"Порт перенаправления\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:69\nmsgid \"Reload Service\"\nmsgstr \"Перезагрузить сервис\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:84\nmsgid \"Remote\"\nmsgstr \"Удалённо\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:196\nmsgid \"Reserved IP\"\nmsgstr \"Зарезервированные IP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:199\nmsgid \"Reserved IP6\"\nmsgstr \"Зарезервированные IPv6\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:291\nmsgid \"Respect Rules\"\nmsgstr \"Учитывать правила\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:76\nmsgid \"Restart Service\"\nmsgstr \"Перезапустить сервис\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:64\nmsgid \"Router Proxy\"\nmsgstr \"Прокси роутера\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:460\nmsgid \"Rule Config\"\nmsgstr \"Настройки правил\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:43\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:283\nmsgid \"Rule Mode\"\nmsgstr \"Режим правил\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:41\nmsgid \"Rule Provider:\"\nmsgstr \"Провайдер правил:\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:548\nmsgid \"Rule Set\"\nmsgstr \"Набор правил\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:15\nmsgid \"Running\"\nmsgstr \"Запущен\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:151\nmsgid \"SOCKS Port\"\nmsgstr \"Порт SOCKS\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:169\nmsgid \"Safe Paths\"\nmsgstr \"Разрешённые пути\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:133\nmsgid \"Save Proxy Selection\"\nmsgstr \"Сохранять выбор прокси\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:29\nmsgid \"Scheduled Clear\"\nmsgstr \"Запланированная очистка\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:32\nmsgid \"Scheduled Clear Cron\"\nmsgstr \"Cron-выражение\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:37\nmsgid \"Scheduled Clear Size Limit\"\nmsgstr \"Ограничение размера журнала\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:43\nmsgid \"Scheduled Clear Size Limit Unit\"\nmsgstr \"Единица ограничения размера журнала\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:114\nmsgid \"Scheduled Restart\"\nmsgstr \"Запланированный перезапуск\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:117\nmsgid \"Scheduled Restart Cron\"\nmsgstr \"Cron-выражение\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:78\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:111\nmsgid \"Scroll To Bottom\"\nmsgstr \"Прокрутить вниз\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:186\nmsgid \"Skip System IPv6 Check\"\nmsgstr \"Пропустить проверку системного IPv6\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:438\nmsgid \"Sniff By Protocol\"\nmsgstr \"Определять по протоколу\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:415\nmsgid \"Sniff Pure IP\"\nmsgstr \"Определять чистые IP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:409\nmsgid \"Sniff Redir-Host\"\nmsgstr \"Определять Redir-Host\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:401\nmsgid \"Sniffer Config\"\nmsgstr \"Настройки сниффера\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:199\nmsgid \"Stack\"\nmsgstr \"Стек\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:157\nmsgid \"Stack Size Hard Limit\"\nmsgstr \"Жёсткий лимит размера стека\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:153\nmsgid \"Stack Size Soft Limit\"\nmsgstr \"Мягкий лимит размера стека\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:588\nmsgid \"Standard Loader\"\nmsgstr \"Стандартный загрузчик\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:110\nmsgid \"Start Delay\"\nmsgstr \"Задержка запуска\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:112\nmsgid \"Start Immidiately\"\nmsgstr \"Запускать немедленно\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:40\nmsgid \"Status\"\nmsgstr \"Статус\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:28\nmsgid \"Subscription\"\nmsgstr \"Подписка\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:66\nmsgid \"Subscription Info Url\"\nmsgstr \"URL сведений о подписке\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:34\nmsgid \"Subscription Name\"\nmsgstr \"Имя подписки\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:69\nmsgid \"Subscription Url\"\nmsgstr \"URL подписки\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:107\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:37\nmsgid \"Subscription:\"\nmsgstr \"Подписка:\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:76\nmsgid \"TCP Concurrent\"\nmsgstr \"Параллельные TCP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:88\nmsgid \"TCP Keep Alive Idle\"\nmsgstr \"Простой TCP Keep-Alive\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:92\nmsgid \"TCP Keep Alive Interval\"\nmsgstr \"Интервал TCP Keep-Alive\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:36\nmsgid \"TCP Mode\"\nmsgstr \"Режим TCP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:40\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:46\nmsgid \"TPROXY Mode\"\nmsgstr \"Режим TPROXY\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:163\nmsgid \"TPROXY Port\"\nmsgstr \"Порт TPROXY\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:188\nmsgid \"TUN Config\"\nmsgstr \"Настройки TUN\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:206\nmsgid \"TUN Interval\"\nmsgstr \"Интервал TUN\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:41\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:47\nmsgid \"TUN Mode\"\nmsgstr \"Режим TUN\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:202\nmsgid \"TUN Timeout\"\nmsgstr \"Тайм-аут TUN\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:122\nmsgid \"Test Profile\"\nmsgstr \"Проверить профиль\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:42\nmsgid \"Total\"\nmsgstr \"Всего\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38\nmsgid \"Transparent Proxy with Mihomo on OpenWrt.\"\nmsgstr \"Прозрачный прокси Mihomo для OpenWrt.\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:348\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:482\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:546\nmsgid \"Type\"\nmsgstr \"Тип\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:43\nmsgid \"UDP Mode\"\nmsgstr \"Режим UDP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:101\nmsgid \"UI Name\"\nmsgstr \"Имя интерфейса\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:98\nmsgid \"UI Path\"\nmsgstr \"Путь к интерфейсу\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:104\nmsgid \"UI Url\"\nmsgstr \"URL интерфейса\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:70\nmsgid \"Unify Delay\"\nmsgstr \"Унифицированная задержка\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:139\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:143\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:147\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:151\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:155\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:159\nmsgid \"Unlimited\"\nmsgstr \"Без ограничений\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:32\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:41\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:48\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:55\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:66\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:72\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:78\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:84\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:90\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:94\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:99\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:102\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:105\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:114\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:118\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:121\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:124\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:127\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:131\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:135\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:143\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:149\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:153\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:157\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:161\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:165\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:192\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:197\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:201\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:208\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:212\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:218\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:233\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:239\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:245\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:249\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:255\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:261\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:265\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:269\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:280\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:287\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:293\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:299\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:305\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:311\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:378\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:405\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:411\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:417\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:581\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:587\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:592\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:595\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:598\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:601\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:605\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:611\nmsgid \"Unmodified\"\nmsgstr \"Без изменений\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:60\nmsgid \"Update\"\nmsgstr \"Обновить\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:52\nmsgid \"Update At\"\nmsgstr \"Обновлено\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:83\nmsgid \"Update Dashboard\"\nmsgstr \"Обновить панель\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:525\nmsgid \"Update Interval\"\nmsgstr \"Интервал обновления\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:20\nmsgid \"Upload Profile\"\nmsgstr \"Загрузить профиль\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:488\nmsgid \"Url\"\nmsgstr \"URL\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:309\nmsgid \"Use Hosts\"\nmsgstr \"Использовать hosts\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:303\nmsgid \"Use System Hosts\"\nmsgstr \"Использовать системный hosts\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:37\nmsgid \"Used\"\nmsgstr \"Использовано\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:81\nmsgid \"User\"\nmsgstr \"Пользователь\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:73\nmsgid \"User Agent\"\nmsgstr \"User-Agent\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:181\nmsgid \"Username\"\nmsgstr \"Имя пользователя\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:128\nmsgid \"procd Config\"\nmsgstr \"Настройки procd\"\n"
  },
  {
    "path": "luci-app-nikki/luci-app-nikki/po/templates/nikki.pot",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:112\nmsgid \"API Listen\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:129\nmsgid \"API Secret\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:120\nmsgid \"API TLS Cert\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:126\nmsgid \"API TLS ECH Key\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:123\nmsgid \"API TLS Key\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:116\nmsgid \"API TLS Listen\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:69\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:122\nmsgid \"Access Control\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:241\nmsgid \"Adaptive Replacement Cache (ARC)\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:141\nmsgid \"Address Space Size Hard Limit\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:137\nmsgid \"Address Space Size Soft Limit\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:181\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:186\nmsgid \"All Port\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:141\nmsgid \"Allow Lan\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:282\nmsgid \"Allow Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:94\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:13\nmsgid \"App Config\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:51\nmsgid \"App Log\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:43\nmsgid \"App Version\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:531\nmsgid \"Append Rule\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:462\nmsgid \"Append Rule Provider\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:518\nmsgid \"Behavior\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:281\nmsgid \"Block Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:171\nmsgid \"Bypass\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:173\nmsgid \"Bypass China Mainland IP\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:176\nmsgid \"Bypass China Mainland IP6\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:189\nmsgid \"Bypass DSCP\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:192\nmsgid \"Bypass FWMark\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:93\nmsgid \"CGroup\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:29\nmsgid \"Choose File\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:99\nmsgid \"Choose Profile\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:55\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:88\nmsgid \"Clear Log\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:182\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:187\nmsgid \"Commonly Used Port\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:84\nmsgid \"Core Log\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:125\nmsgid \"Core Only\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:57\nmsgid \"Core Status\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:50\nmsgid \"Core Version\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:99\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:165\nmsgid \"DNS\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:237\nmsgid \"DNS Cache Algorithm\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:229\nmsgid \"DNS Config\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:243\nmsgid \"DNS Listen\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:253\nmsgid \"DNS Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:117\nmsgid \"Debug Log\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:554\nmsgid \"Destination IP\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558\nmsgid \"Destination IP Geo\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:555\nmsgid \"Destination Port\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:179\nmsgid \"Destination TCP Port to Proxy\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:184\nmsgid \"Destination UDP Port to Proxy\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:196\nmsgid \"Device Name\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:44\nmsgid \"Direct Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:376\nmsgid \"Direct Nameserver Follow Policy\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:67\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:73\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:79\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:85\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:136\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:144\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:193\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:213\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:234\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:250\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:288\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:294\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:300\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:306\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:312\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:379\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:406\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:412\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:418\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:606\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:38\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:45\nmsgid \"Disable\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:183\nmsgid \"Disable ECN of quic-go\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:180\nmsgid \"Disable GSO of quic-go\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:177\nmsgid \"Disable Loopback Detector\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:82\nmsgid \"Disable TCP Keep Alive\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:297\nmsgid \"DoH Prefer HTTP/3\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:329\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:549\nmsgid \"Domain Name\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:557\nmsgid \"Domain Name Geo\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:552\nmsgid \"Domain Name Keyword\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553\nmsgid \"Domain Name Regex\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550\nmsgid \"Domain Name Suffix\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:551\nmsgid \"Domain Name Wildcard\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:170\nmsgid \"Edit Authentications\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:223\nmsgid \"Edit DNS Hijacks\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:274\nmsgid \"Edit Fake-IP Filters\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:318\nmsgid \"Edit Hosts\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:385\nmsgid \"Edit Nameserver Policies\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:337\nmsgid \"Edit Nameservers\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:360\nmsgid \"Edit Proxy Server Nameserver Policies\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:465\nmsgid \"Edit Rule Providers\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:534\nmsgid \"Edit Rules\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:32\nmsgid \"Edit Subscription\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:27\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:45\nmsgid \"Editor\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:96\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:68\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:74\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:80\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:86\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:137\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:145\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:178\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:190\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:194\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:214\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:231\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:235\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:251\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:289\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:295\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:301\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:307\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:313\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:326\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:345\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:368\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:380\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:393\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:403\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:407\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:413\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:419\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:445\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:473\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:542\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:607\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:615\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:33\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:66\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:77\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:107\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:130\nmsgid \"Enable\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:167\nmsgid \"Environment Variable Config\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:47\nmsgid \"Expire At\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:96\nmsgid \"External Control Config\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:285\nmsgid \"Fake-IP Cache\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:278\nmsgid \"Fake-IP Filter Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:61\nmsgid \"Fake-IP Ping Hijack\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:259\nmsgid \"Fake-IP Range\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:267\nmsgid \"Fake-IP TTL\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:263\nmsgid \"Fake-IP6 Range\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:132\nmsgid \"Fast Reload\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:512\nmsgid \"File Format\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506\nmsgid \"File Path\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:500\nmsgid \"File Size Limit\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:48\nmsgid \"File for Mixin\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:103\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:33\nmsgid \"File:\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:424\nmsgid \"Force Sniff Domain Name\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:210\nmsgid \"GSO\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:216\nmsgid \"GSO Max Size\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:130\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:28\nmsgid \"General Config\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:121\nmsgid \"Generate & Download\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:585\nmsgid \"GeoData Loader\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:579\nmsgid \"GeoIP Format\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:600\nmsgid \"GeoIP(ASN) Url\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:597\nmsgid \"GeoIP(DAT) Url\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:594\nmsgid \"GeoIP(MMDB) Url\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:591\nmsgid \"GeoSite Url\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:603\nmsgid \"GeoX Auto Update\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:577\nmsgid \"GeoX Config\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:609\nmsgid \"GeoX Update Interval\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:42\nmsgid \"Global Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/root/usr/share/rpcd/acl.d/luci-app-nikki.json:3\nmsgid \"Grant access to nikki procedures\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:87\nmsgid \"Group\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:147\nmsgid \"HTTP Port\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:149\nmsgid \"Heap Size Hard Limit\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:145\nmsgid \"Heap Size Soft Limit\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38\nmsgid \"How To Use\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:49\nmsgid \"IPv4 DNS Hijack\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:55\nmsgid \"IPv4 Proxy\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:52\nmsgid \"IPv6 DNS Hijack\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:58\nmsgid \"IPv6 Proxy\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:431\nmsgid \"Ignore Sniff Domain Name\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:139\nmsgid \"Inbound Config\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:110\nmsgid \"Inbound Interface\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:105\nmsgid \"LAN Proxy\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:240\nmsgid \"Least Recently Used (LRU)\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:85\nmsgid \"Local\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:25\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:53\nmsgid \"Log\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:27\nmsgid \"Log Config\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:30\nmsgid \"Log Level\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:206\nmsgid \"MTU\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:46\nmsgid \"Match Process\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:371\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:396\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:560\nmsgid \"Matcher\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:589\nmsgid \"Memory Conservative Loader\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:194\nmsgid \"Misc\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:155\nmsgid \"Mixed Port\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:29\nmsgid \"Mixin Config\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:613\nmsgid \"Mixin File Content\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:26\nmsgid \"Mixin Option\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:39\nmsgid \"Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:479\nmsgid \"Name\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:355\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:374\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:399\nmsgid \"Nameserver\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:3\nmsgid \"Nikki\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:571\nmsgid \"No Resolve\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:493\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:564\nmsgid \"Node\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:15\nmsgid \"Not Running\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:164\nmsgid \"Number of Open Files Hard Limit\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:161\nmsgid \"Number of Open Files Soft Limit\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:89\nmsgid \"Open Dashboard\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:53\nmsgid \"Outbound Interface\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:167\nmsgid \"Overwrite Authentication\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:220\nmsgid \"Overwrite DNS Hijack\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:457\nmsgid \"Overwrite Destination\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:271\nmsgid \"Overwrite Fake-IP Filter\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:421\nmsgid \"Overwrite Force Sniff Domain Name\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:315\nmsgid \"Overwrite Hosts\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:428\nmsgid \"Overwrite Ignore Sniff Domain Name\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:334\nmsgid \"Overwrite Nameserver\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:382\nmsgid \"Overwrite Nameserver Policy\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:357\nmsgid \"Overwrite Proxy Server Nameserver Policy\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:435\nmsgid \"Overwrite Sniff By Protocol\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:184\nmsgid \"Password\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:615\nmsgid \"Please go to the editor tab to edit the file for mixin\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:454\nmsgid \"Port\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:81\nmsgid \"Prefer\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:556\nmsgid \"Process Name\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:18\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:21\nmsgid \"Profile\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:49\nmsgid \"Profile for Startup\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:448\nmsgid \"Protocol\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:102\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:168\nmsgid \"Proxy\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:29\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:31\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:37\nmsgid \"Proxy Config\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:45\nmsgid \"Proxy Provider:\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:135\nmsgid \"RLIMIT Config\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:39\nmsgid \"Redirect Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:159\nmsgid \"Redirect Port\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:69\nmsgid \"Reload Service\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:84\nmsgid \"Remote\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:196\nmsgid \"Reserved IP\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:199\nmsgid \"Reserved IP6\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:291\nmsgid \"Respect Rules\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:76\nmsgid \"Restart Service\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:64\nmsgid \"Router Proxy\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:460\nmsgid \"Rule Config\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:43\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:283\nmsgid \"Rule Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:41\nmsgid \"Rule Provider:\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:548\nmsgid \"Rule Set\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:15\nmsgid \"Running\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:151\nmsgid \"SOCKS Port\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:169\nmsgid \"Safe Paths\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:133\nmsgid \"Save Proxy Selection\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:29\nmsgid \"Scheduled Clear\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:32\nmsgid \"Scheduled Clear Cron\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:37\nmsgid \"Scheduled Clear Size Limit\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:43\nmsgid \"Scheduled Clear Size Limit Unit\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:114\nmsgid \"Scheduled Restart\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:117\nmsgid \"Scheduled Restart Cron\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:78\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:111\nmsgid \"Scroll To Bottom\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:186\nmsgid \"Skip System IPv6 Check\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:438\nmsgid \"Sniff By Protocol\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:415\nmsgid \"Sniff Pure IP\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:409\nmsgid \"Sniff Redir-Host\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:401\nmsgid \"Sniffer Config\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:199\nmsgid \"Stack\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:157\nmsgid \"Stack Size Hard Limit\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:153\nmsgid \"Stack Size Soft Limit\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:588\nmsgid \"Standard Loader\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:110\nmsgid \"Start Delay\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:112\nmsgid \"Start Immidiately\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:40\nmsgid \"Status\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:28\nmsgid \"Subscription\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:66\nmsgid \"Subscription Info Url\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:34\nmsgid \"Subscription Name\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:69\nmsgid \"Subscription Url\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:107\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:37\nmsgid \"Subscription:\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:76\nmsgid \"TCP Concurrent\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:88\nmsgid \"TCP Keep Alive Idle\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:92\nmsgid \"TCP Keep Alive Interval\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:36\nmsgid \"TCP Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:40\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:46\nmsgid \"TPROXY Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:163\nmsgid \"TPROXY Port\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:188\nmsgid \"TUN Config\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:206\nmsgid \"TUN Interval\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:41\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:47\nmsgid \"TUN Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:202\nmsgid \"TUN Timeout\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:122\nmsgid \"Test Profile\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:42\nmsgid \"Total\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38\nmsgid \"Transparent Proxy with Mihomo on OpenWrt.\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:348\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:482\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:546\nmsgid \"Type\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:43\nmsgid \"UDP Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:101\nmsgid \"UI Name\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:98\nmsgid \"UI Path\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:104\nmsgid \"UI Url\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:70\nmsgid \"Unify Delay\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:139\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:143\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:147\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:151\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:155\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:159\nmsgid \"Unlimited\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:32\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:41\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:48\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:55\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:66\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:72\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:78\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:84\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:90\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:94\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:99\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:102\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:105\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:114\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:118\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:121\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:124\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:127\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:131\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:135\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:143\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:149\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:153\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:157\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:161\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:165\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:192\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:197\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:201\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:208\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:212\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:218\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:233\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:239\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:245\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:249\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:255\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:261\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:265\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:269\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:280\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:287\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:293\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:299\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:305\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:311\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:378\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:405\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:411\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:417\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:581\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:587\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:592\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:595\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:598\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:601\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:605\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:611\nmsgid \"Unmodified\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:60\nmsgid \"Update\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:52\nmsgid \"Update At\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:83\nmsgid \"Update Dashboard\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:525\nmsgid \"Update Interval\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:20\nmsgid \"Upload Profile\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:488\nmsgid \"Url\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:309\nmsgid \"Use Hosts\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:303\nmsgid \"Use System Hosts\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:37\nmsgid \"Used\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:81\nmsgid \"User\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:73\nmsgid \"User Agent\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:181\nmsgid \"Username\"\nmsgstr \"\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:128\nmsgid \"procd Config\"\nmsgstr \"\"\n"
  },
  {
    "path": "luci-app-nikki/luci-app-nikki/po/zh_Hans/nikki.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Last-Translator: Automatically generated\\n\"\n\"Language-Team: none\\n\"\n\"Language: zh_Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:112\nmsgid \"API Listen\"\nmsgstr \"API 监听\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:129\nmsgid \"API Secret\"\nmsgstr \"API 密码\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:120\nmsgid \"API TLS Cert\"\nmsgstr \"API TLS 证书\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:126\nmsgid \"API TLS ECH Key\"\nmsgstr \"APL TLS ECH 密钥\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:123\nmsgid \"API TLS Key\"\nmsgstr \"API TLS 密钥\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:116\nmsgid \"API TLS Listen\"\nmsgstr \"API TLS 监听\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:69\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:122\nmsgid \"Access Control\"\nmsgstr \"访问控制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:241\nmsgid \"Adaptive Replacement Cache (ARC)\"\nmsgstr \"自适应替换缓存（ARC）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:141\nmsgid \"Address Space Size Hard Limit\"\nmsgstr \"地址空间大小硬限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:137\nmsgid \"Address Space Size Soft Limit\"\nmsgstr \"地址空间大小软限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:181\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:186\nmsgid \"All Port\"\nmsgstr \"全部端口\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:141\nmsgid \"Allow Lan\"\nmsgstr \"允许局域网访问\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:282\nmsgid \"Allow Mode\"\nmsgstr \"白名单模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:94\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:13\nmsgid \"App Config\"\nmsgstr \"插件配置\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:51\nmsgid \"App Log\"\nmsgstr \"插件日志\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:43\nmsgid \"App Version\"\nmsgstr \"插件版本\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:531\nmsgid \"Append Rule\"\nmsgstr \"追加规则\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:462\nmsgid \"Append Rule Provider\"\nmsgstr \"追加规则提供者\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:518\nmsgid \"Behavior\"\nmsgstr \"行为\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:281\nmsgid \"Block Mode\"\nmsgstr \"黑名单模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:171\nmsgid \"Bypass\"\nmsgstr \"绕过\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:173\nmsgid \"Bypass China Mainland IP\"\nmsgstr \"绕过中国大陆 IP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:176\nmsgid \"Bypass China Mainland IP6\"\nmsgstr \"绕过中国大陆 IP6\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:189\nmsgid \"Bypass DSCP\"\nmsgstr \"绕过 DSCP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:192\nmsgid \"Bypass FWMark\"\nmsgstr \"绕过 FWMark\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:93\nmsgid \"CGroup\"\nmsgstr \"控制组\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:29\nmsgid \"Choose File\"\nmsgstr \"选择文件\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:99\nmsgid \"Choose Profile\"\nmsgstr \"选择配置文件\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:55\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:88\nmsgid \"Clear Log\"\nmsgstr \"清空日志\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:182\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:187\nmsgid \"Commonly Used Port\"\nmsgstr \"常用端口\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:84\nmsgid \"Core Log\"\nmsgstr \"核心日志\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:125\nmsgid \"Core Only\"\nmsgstr \"仅核心\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:57\nmsgid \"Core Status\"\nmsgstr \"核心状态\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:50\nmsgid \"Core Version\"\nmsgstr \"核心版本\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:99\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:165\nmsgid \"DNS\"\nmsgstr \"DNS\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:237\nmsgid \"DNS Cache Algorithm\"\nmsgstr \"DNS 缓存算法\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:229\nmsgid \"DNS Config\"\nmsgstr \"DNS 配置\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:243\nmsgid \"DNS Listen\"\nmsgstr \"DNS 监听\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:253\nmsgid \"DNS Mode\"\nmsgstr \"DNS 模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:117\nmsgid \"Debug Log\"\nmsgstr \"调试日志\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:554\nmsgid \"Destination IP\"\nmsgstr \"目标 IP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558\nmsgid \"Destination IP Geo\"\nmsgstr \"目标 IP（Geo）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:555\nmsgid \"Destination Port\"\nmsgstr \"目标端口\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:179\nmsgid \"Destination TCP Port to Proxy\"\nmsgstr \"要代理的 TCP 目标端口\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:184\nmsgid \"Destination UDP Port to Proxy\"\nmsgstr \"要代理的 UDP 目标端口\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:196\nmsgid \"Device Name\"\nmsgstr \"设备名称\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:44\nmsgid \"Direct Mode\"\nmsgstr \"直连模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:376\nmsgid \"Direct Nameserver Follow Policy\"\nmsgstr \"Direct Nameserver 跟随查询策略\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:67\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:73\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:79\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:85\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:136\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:144\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:193\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:213\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:234\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:250\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:288\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:294\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:300\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:306\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:312\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:379\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:406\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:412\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:418\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:606\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:38\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:45\nmsgid \"Disable\"\nmsgstr \"禁用\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:183\nmsgid \"Disable ECN of quic-go\"\nmsgstr \"禁用 quic-go 的显式拥塞通知\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:180\nmsgid \"Disable GSO of quic-go\"\nmsgstr \"禁用 quic-go 的通用分段卸载\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:177\nmsgid \"Disable Loopback Detector\"\nmsgstr \"禁用回环检测\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:82\nmsgid \"Disable TCP Keep Alive\"\nmsgstr \"禁用 TCP Keep Alive\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:297\nmsgid \"DoH Prefer HTTP/3\"\nmsgstr \"DoH 优先 HTTP/3\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:329\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:549\nmsgid \"Domain Name\"\nmsgstr \"域名\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:557\nmsgid \"Domain Name Geo\"\nmsgstr \"域名（Geo）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:552\nmsgid \"Domain Name Keyword\"\nmsgstr \"域名（关键字）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553\nmsgid \"Domain Name Regex\"\nmsgstr \"域名（正则表达式）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550\nmsgid \"Domain Name Suffix\"\nmsgstr \"域名（后缀）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:551\nmsgid \"Domain Name Wildcard\"\nmsgstr \"域名（通配符）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:170\nmsgid \"Edit Authentications\"\nmsgstr \"编辑身份验证\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:223\nmsgid \"Edit DNS Hijacks\"\nmsgstr \"编辑 DNS 劫持\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:274\nmsgid \"Edit Fake-IP Filters\"\nmsgstr \"编辑 Fake-IP 过滤列表\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:318\nmsgid \"Edit Hosts\"\nmsgstr \"编辑 Hosts\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:385\nmsgid \"Edit Nameserver Policies\"\nmsgstr \"编辑 DNS 服务器查询策略\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:337\nmsgid \"Edit Nameservers\"\nmsgstr \"编辑 DNS 服务器\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:360\nmsgid \"Edit Proxy Server Nameserver Policies\"\nmsgstr \"编辑 DNS 服务器查询策略（节点用）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:465\nmsgid \"Edit Rule Providers\"\nmsgstr \"编辑规则提供者\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:534\nmsgid \"Edit Rules\"\nmsgstr \"编辑规则\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:32\nmsgid \"Edit Subscription\"\nmsgstr \"编辑订阅\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:27\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:45\nmsgid \"Editor\"\nmsgstr \"编辑器\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:96\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:68\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:74\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:80\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:86\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:137\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:145\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:178\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:190\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:194\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:214\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:231\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:235\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:251\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:289\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:295\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:301\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:307\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:313\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:326\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:345\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:368\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:380\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:393\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:403\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:407\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:413\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:419\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:445\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:473\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:542\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:607\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:615\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:33\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:66\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:77\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:107\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:130\nmsgid \"Enable\"\nmsgstr \"启用\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:167\nmsgid \"Environment Variable Config\"\nmsgstr \"环境变量配置\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:47\nmsgid \"Expire At\"\nmsgstr \"到期时间\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:96\nmsgid \"External Control Config\"\nmsgstr \"外部控制配置\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:285\nmsgid \"Fake-IP Cache\"\nmsgstr \"Fake-IP 缓存\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:278\nmsgid \"Fake-IP Filter Mode\"\nmsgstr \"Fake-IP 过滤模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:61\nmsgid \"Fake-IP Ping Hijack\"\nmsgstr \"Fake-IP Ping 劫持\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:259\nmsgid \"Fake-IP Range\"\nmsgstr \"Fake-IP 范围\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:267\nmsgid \"Fake-IP TTL\"\nmsgstr \"Fake-IP TTL\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:263\nmsgid \"Fake-IP6 Range\"\nmsgstr \"Fake-IP6 范围\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:132\nmsgid \"Fast Reload\"\nmsgstr \"快速重载\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:512\nmsgid \"File Format\"\nmsgstr \"文件格式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506\nmsgid \"File Path\"\nmsgstr \"文件路径\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:500\nmsgid \"File Size Limit\"\nmsgstr \"文件大小限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:48\nmsgid \"File for Mixin\"\nmsgstr \"用于混入的文件\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:103\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:33\nmsgid \"File:\"\nmsgstr \"文件：\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:424\nmsgid \"Force Sniff Domain Name\"\nmsgstr \"强制嗅探的域名\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:210\nmsgid \"GSO\"\nmsgstr \"通用分段卸载\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:216\nmsgid \"GSO Max Size\"\nmsgstr \"分段最大长度\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:130\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:28\nmsgid \"General Config\"\nmsgstr \"全局配置\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:121\nmsgid \"Generate & Download\"\nmsgstr \"生成并下载\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:585\nmsgid \"GeoData Loader\"\nmsgstr \"GeoData 加载器\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:579\nmsgid \"GeoIP Format\"\nmsgstr \"GeoIP 格式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:600\nmsgid \"GeoIP(ASN) Url\"\nmsgstr \"GeoIP(ASN) 下载地址\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:597\nmsgid \"GeoIP(DAT) Url\"\nmsgstr \"GeoIP(DAT) 下载地址\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:594\nmsgid \"GeoIP(MMDB) Url\"\nmsgstr \"GeoIP(MMDB) 下载地址\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:591\nmsgid \"GeoSite Url\"\nmsgstr \"GeoSite 下载地址\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:603\nmsgid \"GeoX Auto Update\"\nmsgstr \"定时更新GeoX文件\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:577\nmsgid \"GeoX Config\"\nmsgstr \"GeoX 配置\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:609\nmsgid \"GeoX Update Interval\"\nmsgstr \"GeoX 文件更新间隔\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:42\nmsgid \"Global Mode\"\nmsgstr \"全局模式\"\n\n#: applications/luci-app-nikki/root/usr/share/rpcd/acl.d/luci-app-nikki.json:3\nmsgid \"Grant access to nikki procedures\"\nmsgstr \"授予访问 nikki 程序的权限\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:87\nmsgid \"Group\"\nmsgstr \"用户组\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:147\nmsgid \"HTTP Port\"\nmsgstr \"HTTP 端口\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:149\nmsgid \"Heap Size Hard Limit\"\nmsgstr \"堆大小硬限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:145\nmsgid \"Heap Size Soft Limit\"\nmsgstr \"堆大小软限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38\nmsgid \"How To Use\"\nmsgstr \"使用说明\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:49\nmsgid \"IPv4 DNS Hijack\"\nmsgstr \"IPv4 DNS 劫持\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:55\nmsgid \"IPv4 Proxy\"\nmsgstr \"IPv4 代理\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:52\nmsgid \"IPv6 DNS Hijack\"\nmsgstr \"IPv6 DNS 劫持\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:58\nmsgid \"IPv6 Proxy\"\nmsgstr \"IPv6 代理\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:431\nmsgid \"Ignore Sniff Domain Name\"\nmsgstr \"忽略嗅探的域名\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:139\nmsgid \"Inbound Config\"\nmsgstr \"入站配置\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:110\nmsgid \"Inbound Interface\"\nmsgstr \"入站接口\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:105\nmsgid \"LAN Proxy\"\nmsgstr \"局域网代理\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:240\nmsgid \"Least Recently Used (LRU)\"\nmsgstr \"最近最少使用（LRU）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:85\nmsgid \"Local\"\nmsgstr \"本地\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:25\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:53\nmsgid \"Log\"\nmsgstr \"日志\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:27\nmsgid \"Log Config\"\nmsgstr \"日志配置\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:30\nmsgid \"Log Level\"\nmsgstr \"日志级别\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:206\nmsgid \"MTU\"\nmsgstr \"最大传输单元\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:46\nmsgid \"Match Process\"\nmsgstr \"匹配进程\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:371\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:396\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:560\nmsgid \"Matcher\"\nmsgstr \"匹配\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:589\nmsgid \"Memory Conservative Loader\"\nmsgstr \"为内存受限设备优化的加载器\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:194\nmsgid \"Misc\"\nmsgstr \"杂项\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:155\nmsgid \"Mixed Port\"\nmsgstr \"混合端口\"\n\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:29\nmsgid \"Mixin Config\"\nmsgstr \"混入配置\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:613\nmsgid \"Mixin File Content\"\nmsgstr \"混入文件内容\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:26\nmsgid \"Mixin Option\"\nmsgstr \"混入选项\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:39\nmsgid \"Mode\"\nmsgstr \"模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:479\nmsgid \"Name\"\nmsgstr \"名称\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:355\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:374\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:399\nmsgid \"Nameserver\"\nmsgstr \"DNS 服务器\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:3\nmsgid \"Nikki\"\nmsgstr \"Nikki\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:571\nmsgid \"No Resolve\"\nmsgstr \"不解析\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:493\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:564\nmsgid \"Node\"\nmsgstr \"节点\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:15\nmsgid \"Not Running\"\nmsgstr \"未在运行\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:164\nmsgid \"Number of Open Files Hard Limit\"\nmsgstr \"打开文件数量硬限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:161\nmsgid \"Number of Open Files Soft Limit\"\nmsgstr \"打开文件数量软限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:89\nmsgid \"Open Dashboard\"\nmsgstr \"打开面板\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:53\nmsgid \"Outbound Interface\"\nmsgstr \"出站接口\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:167\nmsgid \"Overwrite Authentication\"\nmsgstr \"覆盖身份验证\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:220\nmsgid \"Overwrite DNS Hijack\"\nmsgstr \"覆盖 DNS 劫持\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:457\nmsgid \"Overwrite Destination\"\nmsgstr \"将嗅探结果作为连接目标\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:271\nmsgid \"Overwrite Fake-IP Filter\"\nmsgstr \"覆盖 Fake-IP 过滤列表\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:421\nmsgid \"Overwrite Force Sniff Domain Name\"\nmsgstr \"覆盖强制嗅探的域名\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:315\nmsgid \"Overwrite Hosts\"\nmsgstr \"覆盖 Hosts\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:428\nmsgid \"Overwrite Ignore Sniff Domain Name\"\nmsgstr \"覆盖忽略嗅探的域名\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:334\nmsgid \"Overwrite Nameserver\"\nmsgstr \"覆盖 DNS 服务器\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:382\nmsgid \"Overwrite Nameserver Policy\"\nmsgstr \"覆盖 DNS 服务器查询策略\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:357\nmsgid \"Overwrite Proxy Server Nameserver Policy\"\nmsgstr \"覆盖 DNS 服务器查询策略（节点用）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:435\nmsgid \"Overwrite Sniff By Protocol\"\nmsgstr \"覆盖按协议嗅探\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:184\nmsgid \"Password\"\nmsgstr \"密码\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:615\nmsgid \"Please go to the editor tab to edit the file for mixin\"\nmsgstr \"请前往编辑器标签编辑用于混入的文件\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:454\nmsgid \"Port\"\nmsgstr \"端口\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:81\nmsgid \"Prefer\"\nmsgstr \"优先\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:556\nmsgid \"Process Name\"\nmsgstr \"进程名\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:18\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:21\nmsgid \"Profile\"\nmsgstr \"配置文件\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:49\nmsgid \"Profile for Startup\"\nmsgstr \"用于启动的配置文件\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:448\nmsgid \"Protocol\"\nmsgstr \"协议\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:102\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:168\nmsgid \"Proxy\"\nmsgstr \"代理\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:29\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:31\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:37\nmsgid \"Proxy Config\"\nmsgstr \"代理配置\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:45\nmsgid \"Proxy Provider:\"\nmsgstr \"代理提供者：\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:135\nmsgid \"RLIMIT Config\"\nmsgstr \"资源限制配置\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:39\nmsgid \"Redirect Mode\"\nmsgstr \"Redirect 模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:159\nmsgid \"Redirect Port\"\nmsgstr \"Redirect 端口\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:69\nmsgid \"Reload Service\"\nmsgstr \"重载服务\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:84\nmsgid \"Remote\"\nmsgstr \"远程\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:196\nmsgid \"Reserved IP\"\nmsgstr \"IPv4 保留地址\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:199\nmsgid \"Reserved IP6\"\nmsgstr \"IPv6 保留地址\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:291\nmsgid \"Respect Rules\"\nmsgstr \"遵循分流规则\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:76\nmsgid \"Restart Service\"\nmsgstr \"重启服务\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:64\nmsgid \"Router Proxy\"\nmsgstr \"路由器代理\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:460\nmsgid \"Rule Config\"\nmsgstr \"规则配置\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:43\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:283\nmsgid \"Rule Mode\"\nmsgstr \"规则模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:41\nmsgid \"Rule Provider:\"\nmsgstr \"规则提供者：\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:548\nmsgid \"Rule Set\"\nmsgstr \"规则集\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:15\nmsgid \"Running\"\nmsgstr \"运行中\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:151\nmsgid \"SOCKS Port\"\nmsgstr \"SOCKS 端口\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:169\nmsgid \"Safe Paths\"\nmsgstr \"安全路径\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:133\nmsgid \"Save Proxy Selection\"\nmsgstr \"保存节点/策略组选择\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:29\nmsgid \"Scheduled Clear\"\nmsgstr \"定时清除\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:32\nmsgid \"Scheduled Clear Cron\"\nmsgstr \"Cron 表达式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:37\nmsgid \"Scheduled Clear Size Limit\"\nmsgstr \"日志大小上限\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:43\nmsgid \"Scheduled Clear Size Limit Unit\"\nmsgstr \"日志大小上限单位\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:114\nmsgid \"Scheduled Restart\"\nmsgstr \"定时重启\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:117\nmsgid \"Scheduled Restart Cron\"\nmsgstr \"Cron 表达式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:78\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:111\nmsgid \"Scroll To Bottom\"\nmsgstr \"滚动到底部\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:186\nmsgid \"Skip System IPv6 Check\"\nmsgstr \"跳过系统 IPv6 检查\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:438\nmsgid \"Sniff By Protocol\"\nmsgstr \"按协议嗅探\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:415\nmsgid \"Sniff Pure IP\"\nmsgstr \"嗅探纯 IP 连接\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:409\nmsgid \"Sniff Redir-Host\"\nmsgstr \"嗅探 Redir-Host 流量\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:401\nmsgid \"Sniffer Config\"\nmsgstr \"嗅探器配置\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:199\nmsgid \"Stack\"\nmsgstr \"栈\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:157\nmsgid \"Stack Size Hard Limit\"\nmsgstr \"栈大小硬限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:153\nmsgid \"Stack Size Soft Limit\"\nmsgstr \"栈大小软限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:588\nmsgid \"Standard Loader\"\nmsgstr \"标准加载器\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:110\nmsgid \"Start Delay\"\nmsgstr \"启动延迟\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:112\nmsgid \"Start Immidiately\"\nmsgstr \"立即启动\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:40\nmsgid \"Status\"\nmsgstr \"状态\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:28\nmsgid \"Subscription\"\nmsgstr \"订阅\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:66\nmsgid \"Subscription Info Url\"\nmsgstr \"订阅信息链接\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:34\nmsgid \"Subscription Name\"\nmsgstr \"订阅名称\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:69\nmsgid \"Subscription Url\"\nmsgstr \"订阅链接\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:107\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:37\nmsgid \"Subscription:\"\nmsgstr \"订阅：\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:76\nmsgid \"TCP Concurrent\"\nmsgstr \"TCP 并发\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:88\nmsgid \"TCP Keep Alive Idle\"\nmsgstr \"TCP Keep Alive 空闲\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:92\nmsgid \"TCP Keep Alive Interval\"\nmsgstr \"TCP Keep Alive 间隔\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:36\nmsgid \"TCP Mode\"\nmsgstr \"TCP 模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:40\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:46\nmsgid \"TPROXY Mode\"\nmsgstr \"TPROXY 模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:163\nmsgid \"TPROXY Port\"\nmsgstr \"TPROXY 端口\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:188\nmsgid \"TUN Config\"\nmsgstr \"TUN 配置\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:206\nmsgid \"TUN Interval\"\nmsgstr \"TUN 等待间隔\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:41\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:47\nmsgid \"TUN Mode\"\nmsgstr \"TUN 模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:202\nmsgid \"TUN Timeout\"\nmsgstr \"TUN 等待超时\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:122\nmsgid \"Test Profile\"\nmsgstr \"检查配置文件\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:42\nmsgid \"Total\"\nmsgstr \"总量\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38\nmsgid \"Transparent Proxy with Mihomo on OpenWrt.\"\nmsgstr \"在 OpenWrt 上使用 Mihomo 进行透明代理。\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:348\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:482\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:546\nmsgid \"Type\"\nmsgstr \"类型\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:43\nmsgid \"UDP Mode\"\nmsgstr \"UDP 模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:101\nmsgid \"UI Name\"\nmsgstr \"UI 名称\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:98\nmsgid \"UI Path\"\nmsgstr \"UI 路径\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:104\nmsgid \"UI Url\"\nmsgstr \"UI 下载地址\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:70\nmsgid \"Unify Delay\"\nmsgstr \"统一延迟\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:139\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:143\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:147\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:151\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:155\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:159\nmsgid \"Unlimited\"\nmsgstr \"无限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:32\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:41\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:48\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:55\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:66\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:72\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:78\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:84\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:90\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:94\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:99\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:102\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:105\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:114\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:118\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:121\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:124\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:127\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:131\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:135\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:143\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:149\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:153\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:157\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:161\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:165\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:192\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:197\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:201\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:208\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:212\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:218\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:233\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:239\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:245\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:249\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:255\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:261\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:265\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:269\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:280\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:287\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:293\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:299\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:305\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:311\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:378\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:405\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:411\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:417\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:581\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:587\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:592\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:595\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:598\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:601\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:605\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:611\nmsgid \"Unmodified\"\nmsgstr \"不修改\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:60\nmsgid \"Update\"\nmsgstr \"更新\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:52\nmsgid \"Update At\"\nmsgstr \"更新时间\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:83\nmsgid \"Update Dashboard\"\nmsgstr \"更新面板\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:525\nmsgid \"Update Interval\"\nmsgstr \"更新间隔\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:20\nmsgid \"Upload Profile\"\nmsgstr \"上传配置文件\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:488\nmsgid \"Url\"\nmsgstr \"下载地址\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:309\nmsgid \"Use Hosts\"\nmsgstr \"使用 Hosts\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:303\nmsgid \"Use System Hosts\"\nmsgstr \"使用系统的 Hosts\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:37\nmsgid \"Used\"\nmsgstr \"已使用\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:81\nmsgid \"User\"\nmsgstr \"用户\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:73\nmsgid \"User Agent\"\nmsgstr \"用户代理（UA）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:181\nmsgid \"Username\"\nmsgstr \"用户名\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:128\nmsgid \"procd Config\"\nmsgstr \"procd 配置\"\n"
  },
  {
    "path": "luci-app-nikki/luci-app-nikki/po/zh_Hant/nikki.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Last-Translator: Automatically generated\\n\"\n\"Language-Team: none\\n\"\n\"Language: zh_Hant\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:112\nmsgid \"API Listen\"\nmsgstr \"API 監聽\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:129\nmsgid \"API Secret\"\nmsgstr \"API 密碼\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:120\nmsgid \"API TLS Cert\"\nmsgstr \"API TLS 憑證\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:126\nmsgid \"API TLS ECH Key\"\nmsgstr \"API TLS ECH 金鑰\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:123\nmsgid \"API TLS Key\"\nmsgstr \"API TLS 金鑰\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:116\nmsgid \"API TLS Listen\"\nmsgstr \"API TLS 監聽\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:69\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:122\nmsgid \"Access Control\"\nmsgstr \"存取控制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:241\nmsgid \"Adaptive Replacement Cache (ARC)\"\nmsgstr \"調適型替換快取（ARC）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:141\nmsgid \"Address Space Size Hard Limit\"\nmsgstr \"位址空間大小硬限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:137\nmsgid \"Address Space Size Soft Limit\"\nmsgstr \"位址空間大小軟限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:181\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:186\nmsgid \"All Port\"\nmsgstr \"所有埠\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:141\nmsgid \"Allow Lan\"\nmsgstr \"允許區域網路存取\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:282\nmsgid \"Allow Mode\"\nmsgstr \"白名單模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:94\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:13\nmsgid \"App Config\"\nmsgstr \"應用程式設定\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:51\nmsgid \"App Log\"\nmsgstr \"應用程式日誌\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:43\nmsgid \"App Version\"\nmsgstr \"應用程式版本\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:531\nmsgid \"Append Rule\"\nmsgstr \"追加規則\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:462\nmsgid \"Append Rule Provider\"\nmsgstr \"追加規則提供者\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:518\nmsgid \"Behavior\"\nmsgstr \"行為\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:281\nmsgid \"Block Mode\"\nmsgstr \"黑名單模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:171\nmsgid \"Bypass\"\nmsgstr \"繞過\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:173\nmsgid \"Bypass China Mainland IP\"\nmsgstr \"繞過中國大陸 IP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:176\nmsgid \"Bypass China Mainland IP6\"\nmsgstr \"繞過中國大陸 IP6\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:189\nmsgid \"Bypass DSCP\"\nmsgstr \"繞過 DSCP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:192\nmsgid \"Bypass FWMark\"\nmsgstr \"繞過 FWMark\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:93\nmsgid \"CGroup\"\nmsgstr \"控制群組\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:29\nmsgid \"Choose File\"\nmsgstr \"選擇檔案\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:99\nmsgid \"Choose Profile\"\nmsgstr \"選擇設定檔\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:55\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:88\nmsgid \"Clear Log\"\nmsgstr \"清空日誌\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:182\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:187\nmsgid \"Commonly Used Port\"\nmsgstr \"常用埠\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:84\nmsgid \"Core Log\"\nmsgstr \"核心日誌\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:125\nmsgid \"Core Only\"\nmsgstr \"僅核心\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:57\nmsgid \"Core Status\"\nmsgstr \"核心狀態\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:50\nmsgid \"Core Version\"\nmsgstr \"核心版本\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:99\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:165\nmsgid \"DNS\"\nmsgstr \"DNS\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:237\nmsgid \"DNS Cache Algorithm\"\nmsgstr \"DNS 快取演算法\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:229\nmsgid \"DNS Config\"\nmsgstr \"DNS 設定\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:243\nmsgid \"DNS Listen\"\nmsgstr \"DNS 監聽\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:253\nmsgid \"DNS Mode\"\nmsgstr \"DNS 模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:117\nmsgid \"Debug Log\"\nmsgstr \"除錯日誌\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:554\nmsgid \"Destination IP\"\nmsgstr \"目標 IP\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:558\nmsgid \"Destination IP Geo\"\nmsgstr \"目標 IP（地理位置）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:555\nmsgid \"Destination Port\"\nmsgstr \"目標埠\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:179\nmsgid \"Destination TCP Port to Proxy\"\nmsgstr \"要代理的 TCP 目標埠\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:184\nmsgid \"Destination UDP Port to Proxy\"\nmsgstr \"要代理的 UDP 目標埠\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:196\nmsgid \"Device Name\"\nmsgstr \"裝置名稱\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:44\nmsgid \"Direct Mode\"\nmsgstr \"直連模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:376\nmsgid \"Direct Nameserver Follow Policy\"\nmsgstr \"Direct Nameserver 跟隨查詢策略\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:67\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:73\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:79\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:85\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:136\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:144\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:193\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:213\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:234\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:250\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:288\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:294\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:300\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:306\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:312\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:379\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:406\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:412\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:418\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:606\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:38\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:45\nmsgid \"Disable\"\nmsgstr \"停用\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:183\nmsgid \"Disable ECN of quic-go\"\nmsgstr \"停用 quic-go 的顯式擁塞通知\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:180\nmsgid \"Disable GSO of quic-go\"\nmsgstr \"停用 quic-go 的通用分段卸載\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:177\nmsgid \"Disable Loopback Detector\"\nmsgstr \"停用迴路檢測\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:82\nmsgid \"Disable TCP Keep Alive\"\nmsgstr \"停用 TCP Keep Alive\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:297\nmsgid \"DoH Prefer HTTP/3\"\nmsgstr \"DoH 優先使用 HTTP/3\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:329\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:549\nmsgid \"Domain Name\"\nmsgstr \"網域名稱\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:557\nmsgid \"Domain Name Geo\"\nmsgstr \"網域名稱（地理位置）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:552\nmsgid \"Domain Name Keyword\"\nmsgstr \"網域名稱（關鍵字）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:553\nmsgid \"Domain Name Regex\"\nmsgstr \"網域名稱（正則表達式）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:550\nmsgid \"Domain Name Suffix\"\nmsgstr \"網域名稱（後綴）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:551\nmsgid \"Domain Name Wildcard\"\nmsgstr \"網域名稱（通配符）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:170\nmsgid \"Edit Authentications\"\nmsgstr \"編輯身分驗證\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:223\nmsgid \"Edit DNS Hijacks\"\nmsgstr \"編輯 DNS 劫持\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:274\nmsgid \"Edit Fake-IP Filters\"\nmsgstr \"編輯 Fake-IP 過濾清單\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:318\nmsgid \"Edit Hosts\"\nmsgstr \"編輯 Hosts\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:385\nmsgid \"Edit Nameserver Policies\"\nmsgstr \"編輯 DNS 伺服器查詢策略\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:337\nmsgid \"Edit Nameservers\"\nmsgstr \"編輯 DNS 伺服器\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:360\nmsgid \"Edit Proxy Server Nameserver Policies\"\nmsgstr \"編輯 DNS 伺服器查詢策略（節點用）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:465\nmsgid \"Edit Rule Providers\"\nmsgstr \"編輯規則提供者\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:534\nmsgid \"Edit Rules\"\nmsgstr \"編輯規則\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:32\nmsgid \"Edit Subscription\"\nmsgstr \"編輯訂閱\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:27\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:45\nmsgid \"Editor\"\nmsgstr \"編輯器\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:96\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:68\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:74\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:80\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:86\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:137\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:145\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:178\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:190\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:194\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:214\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:231\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:235\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:251\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:289\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:295\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:301\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:307\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:313\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:326\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:345\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:368\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:380\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:393\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:403\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:407\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:413\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:419\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:445\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:473\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:542\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:607\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:615\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:33\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:66\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:77\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:107\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:130\nmsgid \"Enable\"\nmsgstr \"啟用\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:167\nmsgid \"Environment Variable Config\"\nmsgstr \"環境變數設定\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:47\nmsgid \"Expire At\"\nmsgstr \"到期時間\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:96\nmsgid \"External Control Config\"\nmsgstr \"外部控制設定\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:285\nmsgid \"Fake-IP Cache\"\nmsgstr \"Fake-IP 快取\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:278\nmsgid \"Fake-IP Filter Mode\"\nmsgstr \"Fake-IP 過濾模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:61\nmsgid \"Fake-IP Ping Hijack\"\nmsgstr \"Fake-IP Ping 劫持\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:259\nmsgid \"Fake-IP Range\"\nmsgstr \"Fake-IP 範圍\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:267\nmsgid \"Fake-IP TTL\"\nmsgstr \"Fake-IP TTL\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:263\nmsgid \"Fake-IP6 Range\"\nmsgstr \"Fake-IP6 範圍\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:132\nmsgid \"Fast Reload\"\nmsgstr \"快速重載\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:512\nmsgid \"File Format\"\nmsgstr \"檔案格式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:506\nmsgid \"File Path\"\nmsgstr \"檔案路徑\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:500\nmsgid \"File Size Limit\"\nmsgstr \"檔案大小限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:48\nmsgid \"File for Mixin\"\nmsgstr \"用於混入的檔案\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:103\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:33\nmsgid \"File:\"\nmsgstr \"檔案:\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:424\nmsgid \"Force Sniff Domain Name\"\nmsgstr \"強制嗅探的網域名稱\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:210\nmsgid \"GSO\"\nmsgstr \"通用分段卸載\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:216\nmsgid \"GSO Max Size\"\nmsgstr \"分段最大長度\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:130\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:28\nmsgid \"General Config\"\nmsgstr \"一般設定\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:121\nmsgid \"Generate & Download\"\nmsgstr \"生成並下載\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:585\nmsgid \"GeoData Loader\"\nmsgstr \"GeoData 載入器\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:579\nmsgid \"GeoIP Format\"\nmsgstr \"GeoIP 格式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:600\nmsgid \"GeoIP(ASN) Url\"\nmsgstr \"GeoIP(ASN) 下載網址\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:597\nmsgid \"GeoIP(DAT) Url\"\nmsgstr \"GeoIP(DAT) 下載網址\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:594\nmsgid \"GeoIP(MMDB) Url\"\nmsgstr \"GeoIP(MMDB) 下載網址\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:591\nmsgid \"GeoSite Url\"\nmsgstr \"GeoSite 下載網址\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:603\nmsgid \"GeoX Auto Update\"\nmsgstr \"定時更新 GeoX 檔案\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:577\nmsgid \"GeoX Config\"\nmsgstr \"GeoX 設定\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:609\nmsgid \"GeoX Update Interval\"\nmsgstr \"GeoX 檔案更新間隔\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:42\nmsgid \"Global Mode\"\nmsgstr \"全局模式\"\n\n#: applications/luci-app-nikki/root/usr/share/rpcd/acl.d/luci-app-nikki.json:3\nmsgid \"Grant access to nikki procedures\"\nmsgstr \"授予存取 nikki 程序的權限\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:87\nmsgid \"Group\"\nmsgstr \"使用者群組\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:147\nmsgid \"HTTP Port\"\nmsgstr \"HTTP 埠\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:149\nmsgid \"Heap Size Hard Limit\"\nmsgstr \"堆積大小硬限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:145\nmsgid \"Heap Size Soft Limit\"\nmsgstr \"堆積大小軟限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38\nmsgid \"How To Use\"\nmsgstr \"使用說明\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:49\nmsgid \"IPv4 DNS Hijack\"\nmsgstr \"IPv4 DNS 劫持\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:55\nmsgid \"IPv4 Proxy\"\nmsgstr \"IPv4 代理\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:52\nmsgid \"IPv6 DNS Hijack\"\nmsgstr \"IPv6 DNS 劫持\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:58\nmsgid \"IPv6 Proxy\"\nmsgstr \"IPv6 代理\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:431\nmsgid \"Ignore Sniff Domain Name\"\nmsgstr \"忽略嗅探的網域名稱\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:139\nmsgid \"Inbound Config\"\nmsgstr \"入站設定\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:110\nmsgid \"Inbound Interface\"\nmsgstr \"入站介面\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:105\nmsgid \"LAN Proxy\"\nmsgstr \"區域網路代理\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:240\nmsgid \"Least Recently Used (LRU)\"\nmsgstr \"最近最少使用（LRU）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:85\nmsgid \"Local\"\nmsgstr \"本地\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:25\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:53\nmsgid \"Log\"\nmsgstr \"日誌\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:27\nmsgid \"Log Config\"\nmsgstr \"日誌設定\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:30\nmsgid \"Log Level\"\nmsgstr \"日誌等級\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:206\nmsgid \"MTU\"\nmsgstr \"最大傳輸單元\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:46\nmsgid \"Match Process\"\nmsgstr \"匹配程序\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:371\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:396\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:560\nmsgid \"Matcher\"\nmsgstr \"匹配器\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:589\nmsgid \"Memory Conservative Loader\"\nmsgstr \"為記憶體受限裝置最佳化的載入器\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:194\nmsgid \"Misc\"\nmsgstr \"雜項\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:155\nmsgid \"Mixed Port\"\nmsgstr \"混合埠\"\n\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:29\nmsgid \"Mixin Config\"\nmsgstr \"混入設定\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:613\nmsgid \"Mixin File Content\"\nmsgstr \"混入檔案內容\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:26\nmsgid \"Mixin Option\"\nmsgstr \"混入選項\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:39\nmsgid \"Mode\"\nmsgstr \"模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:479\nmsgid \"Name\"\nmsgstr \"名稱\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:355\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:374\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:399\nmsgid \"Nameserver\"\nmsgstr \"DNS 伺服器\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:3\nmsgid \"Nikki\"\nmsgstr \"Nikki\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:571\nmsgid \"No Resolve\"\nmsgstr \"不解析\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:493\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:564\nmsgid \"Node\"\nmsgstr \"節點\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:15\nmsgid \"Not Running\"\nmsgstr \"未在執行\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:164\nmsgid \"Number of Open Files Hard Limit\"\nmsgstr \"可開啟檔案數量硬限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:161\nmsgid \"Number of Open Files Soft Limit\"\nmsgstr \"可開啟檔案數量軟限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:89\nmsgid \"Open Dashboard\"\nmsgstr \"開啟儀表板\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:53\nmsgid \"Outbound Interface\"\nmsgstr \"出站介面\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:167\nmsgid \"Overwrite Authentication\"\nmsgstr \"覆寫身分驗證\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:220\nmsgid \"Overwrite DNS Hijack\"\nmsgstr \"覆寫 DNS 劫持\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:457\nmsgid \"Overwrite Destination\"\nmsgstr \"將嗅探結果作為連線目標\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:271\nmsgid \"Overwrite Fake-IP Filter\"\nmsgstr \"覆寫 Fake-IP 過濾清單\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:421\nmsgid \"Overwrite Force Sniff Domain Name\"\nmsgstr \"覆寫強制嗅探的網域名稱\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:315\nmsgid \"Overwrite Hosts\"\nmsgstr \"覆寫 Hosts\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:428\nmsgid \"Overwrite Ignore Sniff Domain Name\"\nmsgstr \"覆寫忽略嗅探的網域名稱\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:334\nmsgid \"Overwrite Nameserver\"\nmsgstr \"覆寫 DNS 伺服器\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:382\nmsgid \"Overwrite Nameserver Policy\"\nmsgstr \"覆寫 DNS 伺服器查詢策略\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:357\nmsgid \"Overwrite Proxy Server Nameserver Policy\"\nmsgstr \"覆蓋 DNS 伺服器查詢策略（節點用）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:435\nmsgid \"Overwrite Sniff By Protocol\"\nmsgstr \"覆寫按協定嗅探\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:184\nmsgid \"Password\"\nmsgstr \"密碼\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:615\nmsgid \"Please go to the editor tab to edit the file for mixin\"\nmsgstr \"請前往編輯器標籤編輯用於混入的檔案\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:454\nmsgid \"Port\"\nmsgstr \"埠\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:81\nmsgid \"Prefer\"\nmsgstr \"優先\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:556\nmsgid \"Process Name\"\nmsgstr \"程序名稱\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:18\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:21\nmsgid \"Profile\"\nmsgstr \"設定檔\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:49\nmsgid \"Profile for Startup\"\nmsgstr \"用於啟動的設定檔\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:448\nmsgid \"Protocol\"\nmsgstr \"協定\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:102\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:168\nmsgid \"Proxy\"\nmsgstr \"代理\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:29\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:31\n#: applications/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json:37\nmsgid \"Proxy Config\"\nmsgstr \"代理設定\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:45\nmsgid \"Proxy Provider:\"\nmsgstr \"代理提供者:\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:135\nmsgid \"RLIMIT Config\"\nmsgstr \"RLIMIT 設定\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:39\nmsgid \"Redirect Mode\"\nmsgstr \"Redirect 模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:159\nmsgid \"Redirect Port\"\nmsgstr \"Redirect 埠\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:69\nmsgid \"Reload Service\"\nmsgstr \"重新載入服務\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:84\nmsgid \"Remote\"\nmsgstr \"遠端\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:196\nmsgid \"Reserved IP\"\nmsgstr \"IPv4 保留位址\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:199\nmsgid \"Reserved IP6\"\nmsgstr \"IPv6 保留位址\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:291\nmsgid \"Respect Rules\"\nmsgstr \"遵循分流規則\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:76\nmsgid \"Restart Service\"\nmsgstr \"重新啟動服務\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:64\nmsgid \"Router Proxy\"\nmsgstr \"路由器代理\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:460\nmsgid \"Rule Config\"\nmsgstr \"規則設定\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:43\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:283\nmsgid \"Rule Mode\"\nmsgstr \"規則模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:41\nmsgid \"Rule Provider:\"\nmsgstr \"規則提供者:\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:548\nmsgid \"Rule Set\"\nmsgstr \"規則集\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:15\nmsgid \"Running\"\nmsgstr \"執行中\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:151\nmsgid \"SOCKS Port\"\nmsgstr \"SOCKS 埠\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:169\nmsgid \"Safe Paths\"\nmsgstr \"安全路徑\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:133\nmsgid \"Save Proxy Selection\"\nmsgstr \"儲存節點/策略群組選擇\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:29\nmsgid \"Scheduled Clear\"\nmsgstr \"定時清除\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:32\nmsgid \"Scheduled Clear Cron\"\nmsgstr \"Cron 表達式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:37\nmsgid \"Scheduled Clear Size Limit\"\nmsgstr \"日誌大小上限\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:43\nmsgid \"Scheduled Clear Size Limit Unit\"\nmsgstr \"日誌大小上限單位\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:114\nmsgid \"Scheduled Restart\"\nmsgstr \"定時重新啟動\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:117\nmsgid \"Scheduled Restart Cron\"\nmsgstr \"Cron 表達式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:78\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/log.js:111\nmsgid \"Scroll To Bottom\"\nmsgstr \"捲動到底部\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:186\nmsgid \"Skip System IPv6 Check\"\nmsgstr \"跳過系統 IPv6 檢查\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:438\nmsgid \"Sniff By Protocol\"\nmsgstr \"按協定嗅探\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:415\nmsgid \"Sniff Pure IP\"\nmsgstr \"嗅探純 IP 連線\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:409\nmsgid \"Sniff Redir-Host\"\nmsgstr \"嗅探 Redir-Host 流量\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:401\nmsgid \"Sniffer Config\"\nmsgstr \"嗅探器設定\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:199\nmsgid \"Stack\"\nmsgstr \"堆疊\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:157\nmsgid \"Stack Size Hard Limit\"\nmsgstr \"堆疊大小硬限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:153\nmsgid \"Stack Size Soft Limit\"\nmsgstr \"堆疊大小軟限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:588\nmsgid \"Standard Loader\"\nmsgstr \"標準載入器\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:110\nmsgid \"Start Delay\"\nmsgstr \"啟動延遲\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:112\nmsgid \"Start Immidiately\"\nmsgstr \"立即啟動\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:40\nmsgid \"Status\"\nmsgstr \"狀態\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:28\nmsgid \"Subscription\"\nmsgstr \"訂閱\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:66\nmsgid \"Subscription Info Url\"\nmsgstr \"訂閱信息連結\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:34\nmsgid \"Subscription Name\"\nmsgstr \"訂閱名稱\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:69\nmsgid \"Subscription Url\"\nmsgstr \"訂閱連結\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:107\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/editor.js:37\nmsgid \"Subscription:\"\nmsgstr \"訂閱:\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:76\nmsgid \"TCP Concurrent\"\nmsgstr \"TCP 並發\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:88\nmsgid \"TCP Keep Alive Idle\"\nmsgstr \"TCP Keep Alive 閒置\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:92\nmsgid \"TCP Keep Alive Interval\"\nmsgstr \"TCP Keep Alive 間隔\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:36\nmsgid \"TCP Mode\"\nmsgstr \"TCP 模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:40\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:46\nmsgid \"TPROXY Mode\"\nmsgstr \"TPROXY 模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:163\nmsgid \"TPROXY Port\"\nmsgstr \"TPROXY 埠\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:188\nmsgid \"TUN Config\"\nmsgstr \"TUN 設定\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:206\nmsgid \"TUN Interval\"\nmsgstr \"TUN 等待間隔\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:41\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:47\nmsgid \"TUN Mode\"\nmsgstr \"TUN 模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:202\nmsgid \"TUN Timeout\"\nmsgstr \"TUN 等待超時\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:122\nmsgid \"Test Profile\"\nmsgstr \"檢查設定檔\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:42\nmsgid \"Total\"\nmsgstr \"總計\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:38\nmsgid \"Transparent Proxy with Mihomo on OpenWrt.\"\nmsgstr \"在 OpenWrt 上使用 Mihomo 進行透明代理.\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:348\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:482\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:546\nmsgid \"Type\"\nmsgstr \"類型\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:43\nmsgid \"UDP Mode\"\nmsgstr \"UDP 模式\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:101\nmsgid \"UI Name\"\nmsgstr \"UI 名稱\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:98\nmsgid \"UI Path\"\nmsgstr \"UI 路徑\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:104\nmsgid \"UI Url\"\nmsgstr \"UI 下載網址\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:70\nmsgid \"Unify Delay\"\nmsgstr \"統一延遲\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:139\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:143\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:147\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:151\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:155\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:159\nmsgid \"Unlimited\"\nmsgstr \"無限制\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:32\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:41\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:48\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:55\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:66\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:72\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:78\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:84\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:90\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:94\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:99\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:102\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:105\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:114\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:118\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:121\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:124\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:127\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:131\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:135\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:143\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:149\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:153\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:157\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:161\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:165\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:192\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:197\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:201\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:208\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:212\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:218\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:233\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:239\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:245\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:249\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:255\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:261\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:265\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:269\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:280\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:287\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:293\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:299\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:305\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:311\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:378\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:405\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:411\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:417\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:581\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:587\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:592\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:595\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:598\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:601\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:605\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:611\nmsgid \"Unmodified\"\nmsgstr \"不修改\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:60\nmsgid \"Update\"\nmsgstr \"更新\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:52\nmsgid \"Update At\"\nmsgstr \"更新時間\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:83\nmsgid \"Update Dashboard\"\nmsgstr \"更新儀表板\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:525\nmsgid \"Update Interval\"\nmsgstr \"更新間隔\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:20\nmsgid \"Upload Profile\"\nmsgstr \"上傳設定檔\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:488\nmsgid \"Url\"\nmsgstr \"下載網址\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:309\nmsgid \"Use Hosts\"\nmsgstr \"使用 Hosts\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:303\nmsgid \"Use System Hosts\"\nmsgstr \"使用系統的 Hosts\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:37\nmsgid \"Used\"\nmsgstr \"已使用\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/proxy.js:81\nmsgid \"User\"\nmsgstr \"使用者\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/profile.js:73\nmsgid \"User Agent\"\nmsgstr \"使用者代理（UA）\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/mixin.js:181\nmsgid \"Username\"\nmsgstr \"使用者名稱\"\n\n#: applications/luci-app-nikki/htdocs/luci-static/resources/view/nikki/app.js:128\nmsgid \"procd Config\"\nmsgstr \"procd 設定\"\n"
  },
  {
    "path": "luci-app-nikki/luci-app-nikki/root/usr/share/luci/menu.d/luci-app-nikki.json",
    "content": "{\n    \"admin/services/nikki\": {\n        \"title\": \"Nikki\",\n        \"action\": {\n            \"type\": \"firstchild\"\n        },\n        \"depends\": {\n            \"acl\": [ \"luci-app-nikki\" ],\n            \"uci\": { \"nikki\": true }\n        }\n    },\n    \"admin/services/nikki/config\": {\n        \"title\": \"App Config\",\n        \"order\": 10,\n        \"action\": {\n            \"type\": \"view\",\n            \"path\": \"nikki/app\"\n        }\n    },\n    \"admin/services/nikki/profile\": {\n        \"title\": \"Profile\",\n        \"order\": 20,\n        \"action\": {\n            \"type\": \"view\",\n            \"path\": \"nikki/profile\"\n        }\n    },\n    \"admin/services/nikki/mixin\": {\n        \"title\": \"Mixin Config\",\n        \"order\": 30,\n        \"action\": {\n            \"type\": \"view\",\n            \"path\": \"nikki/mixin\"\n        }\n    },\n    \"admin/services/nikki/proxy\": {\n        \"title\": \"Proxy Config\",\n        \"order\": 40,\n        \"action\": {\n            \"type\": \"view\",\n            \"path\": \"nikki/proxy\"\n        }\n    },\n    \"admin/services/nikki/editor\": {\n        \"title\": \"Editor\",\n        \"order\": 50,\n        \"action\": {\n            \"type\": \"view\",\n            \"path\": \"nikki/editor\"\n        }\n    },\n    \"admin/services/nikki/log\": {\n        \"title\": \"Log\",\n        \"order\": 60,\n        \"action\": {\n            \"type\": \"view\",\n            \"path\": \"nikki/log\"\n        }\n    }\n}"
  },
  {
    "path": "luci-app-nikki/luci-app-nikki/root/usr/share/rpcd/acl.d/luci-app-nikki.json",
    "content": "{\n    \"luci-app-nikki\": {\n        \"description\": \"Grant access to nikki procedures\",\n        \"read\": {\n            \"uci\": [ \"nikki\" ],\n            \"ubus\": {\n                \"rc\": [ \"*\" ],\n                \"luci.nikki\": [ \"*\" ]\n            },\n            \"file\": {\n                \"/etc/nikki/profiles/*.yaml\": [\"read\"],\n                \"/etc/nikki/profiles/*.yml\": [\"read\"],\n                \"/etc/nikki/subscriptions/*.yaml\": [\"read\"],\n                \"/etc/nikki/subscriptions/*.yml\": [\"read\"],\n                \"/etc/nikki/mixin.yaml\": [\"read\"],\n                \"/etc/nikki/run/config.yaml\": [\"read\"],\n                \"/etc/nikki/run/providers/rule/*\": [\"read\"],\n                \"/etc/nikki/run/providers/proxy/*\": [\"read\"],\n                \"/var/log/nikki/*.log\": [\"read\"]\n            }\n        },\n        \"write\": {\n            \"uci\": [ \"nikki\" ],\n            \"file\": {\n                \"/etc/nikki/profiles/*.yaml\": [\"write\"],\n                \"/etc/nikki/profiles/*.yml\": [\"write\"],\n                \"/etc/nikki/subscriptions/*.yaml\": [\"write\"],\n                \"/etc/nikki/subscriptions/*.yml\": [\"write\"],\n                \"/etc/nikki/mixin.yaml\": [\"write\"],\n                \"/etc/nikki/run/config.yaml\": [\"write\"],\n                \"/etc/nikki/run/providers/rule/*\": [\"write\"],\n                \"/etc/nikki/run/providers/proxy/*\": [\"write\"],\n                \"/var/log/nikki/*.log\": [\"write\"]\n            }\n        }\n    }\n}"
  },
  {
    "path": "luci-app-nikki/luci-app-nikki/root/usr/share/rpcd/ucode/luci.nikki",
    "content": "#!/usr/bin/ucode\n\n'use strict';\n\nimport { access, popen, writefile } from 'fs';\nimport { get_users, get_groups, get_cgroups, load_profile } from '/etc/nikki/ucode/include.uc';\n\nconst methods = {\n\tversion: {\n\t\tcall: function() {\n\t\t\tlet process;\n\t\t\tlet app = '';\n\t\t\tif (system('command -v opkg') == 0) {\n\t\t\t\tprocess = popen('opkg list-installed luci-app-nikki | cut -d \" \" -f 3');\n\t\t\t\tif (process) {\n\t\t\t\t\tapp = trim(process.read('all'));\n\t\t\t\t\tprocess.close();\n\t\t\t\t}\n\t\t\t} else if (system('command -v apk') == 0) {\n\t\t\t\tprocess = popen('apk list -I luci-app-nikki | cut -d \" \" -f 1 | cut -d \"-\" -f 4');\n\t\t\t\tif (process) {\n\t\t\t\t\tapp = trim(process.read('all'));\n\t\t\t\t\tprocess.close();\n\t\t\t\t}\n\t\t\t}\n\t\t\tlet core = '';\n\t\t\tprocess = popen('mihomo -v | grep Mihomo | cut -d \" \" -f 3');\n\t\t\tif (process) {\n\t\t\t\tcore = trim(process.read('all'));\n\t\t\t\tprocess.close();\n\t\t\t}\n\t\t\treturn { app: app, core: core };\n\t\t}\n\t},\n\tprofile: {\n\t\targs: { defaults: {} },\n\t\tcall: function(req) {\n\t\t\tlet profile = {};\n\t\t\tconst defaults = req.args?.defaults ?? {};\n\t\t\tconst filepath = '/etc/nikki/run/config.yaml';\n\t\t\tconst tmpFilepath = '/var/run/nikki/profile.json';\n\t\t\tif (access(filepath, 'r')) {\n\t\t\t\twritefile(tmpFilepath, defaults);\n\t\t\t\tconst command = `yq -M -p yaml -o json eval-all 'select(fi == 0) *? select(fi == 1)' ${tmpFilepath} ${filepath}`;\n\t\t\t\tconst process = popen(command);\n\t\t\t\tif (process) {\n\t\t\t\t\tprofile = json(process);\n\t\t\t\t\tprocess.close();\n\t\t\t\t}\n\t\t\t}\n\t\t\treturn profile;\n\t\t}\n\t},\n\tupdate_subscription: {\n\t\targs: { section_id: 'section_id' },\n\t\tcall: function(req) {\n\t\t\tlet success = false;\n\t\t\tconst section_id = req.args?.section_id;\n\t\t\tif (section_id) {\n\t\t\t\tsuccess = system(['service', 'nikki', 'update_subscription', section_id]) == 0;\n\t\t\t}\n\t\t\treturn { success: success };\n\t\t}\n\t},\n\tapi: {\n\t\targs: { method: 'method', path: 'path', query: 'query', body: 'body' },\n\t\tcall: function(req) {\n\t\t\tlet result = {};\n\n\t\t\tconst method = req.args?.method;\n\t\t\tconst path = req.args?.path;\n\t\t\tconst query = req.args?.query;\n\t\t\tconst body = req.args?.body;\n\n\t\t\tconst profile = load_profile();\n\t\t\tconst api_listen = profile['external-controller'];\n\t\t\tconst api_tls_listen = profile['external-controller-tls'];\n\t\t\tconst api_secret = profile['secret'];\n\t\t\tif (!api_listen && !api_tls_listen) {\n\t\t\t\treturn result;\n\t\t\t}\n\n\t\t\tconst protocol = api_tls_listen ? 'https' : 'http';\n\n\t\t\tconst url = api_listen + path;\n\n\t\t\tconst process = popen(`curl --proto-default '${protocol}' --insecure --request '${method}' --oauth2-bearer '${api_secret}' --url-query '${query}' --data '${body}' '${url}'`);\n\t\t\tif (process) {\n\t\t\t\tresult = json(process);\n\t\t\t\tprocess.close();\n\t\t\t}\n\n\t\t\treturn result;\n\t\t}\n\t},\n\tget_identifiers: {\n\t\tcall: function() {\n\t\t\tconst users = filter(get_users(), (x) => x != '');\n\t\t\tconst groups = filter(get_groups(), (x) => x != '');\n\t\t\tconst cgroups = filter(get_cgroups(), (x) => x != '' && index(x, 'services/nikki') < 0);\n\t\t\treturn { users: users, groups: groups, cgroups: cgroups };\n\t\t}\n\t},\n\tdebug: {\n\t\tcall: function() {\n\t\t\tconst success = system('/etc/nikki/scripts/debug.sh > /var/log/nikki/debug.log') == 0;\n\t\t\treturn { success: success };\n\t\t}\n\t}\n};\n\nreturn { 'luci.nikki': methods };"
  },
  {
    "path": "luci-app-nikki/mihomo-alpha/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=mihomo-alpha\nPKG_VERSION:=2026.05.08\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)\nPKG_SOURCE_PROTO:=git\nPKG_SOURCE_URL:=https://github.com/MetaCubeX/mihomo.git\nPKG_SOURCE_VERSION:=35d5d4e44d7a7b8352617b1fec7faf0ba26efc8a\nPKG_MIRROR_HASH:=d4f8305736fe92a11efceb60ad994ed409c1f312c93d381f0605be17afd6825a\n\nPKG_LICENSE:=GPL3.0+\nPKG_MAINTAINER:=Joseph Mory <morytyann@gmail.com>\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_BUILD_FLAGS:=no-mips16\n\nPKG_BUILD_VERSION:=alpha-35d5d4e4\nPKG_BUILD_TIME:=$(shell date -u -Iseconds)\n\nGO_PKG:=github.com/metacubex/mihomo\nGO_PKG_LDFLAGS_X:=$(GO_PKG)/constant.Version=$(PKG_BUILD_VERSION) $(GO_PKG)/constant.BuildTime=$(PKG_BUILD_TIME)\nGO_PKG_TAGS:=with_gvisor\nGO_PKG_INSTALL_BIN_PATH:=/usr/libexec\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/mihomo-alpha\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=A rule based proxy in Go.\n  URL:=https://wiki.metacubex.one\n  DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle +ip-full +kmod-inet-diag +kmod-tun\n  PROVIDES:=mihomo\n  CONFLICTS:=mihomo-meta\n  VARIANT:=alpha\n  ALTERNATIVES:=\\\n    300:/usr/bin/mihomo:/usr/libexec/mihomo\nendef\n\ndefine Package/mihomo-alpha/description\n  A rule based proxy in Go.\nendef\n\ndefine Package/mihomo-alpha/install\n\t$(call GoPackage/Package/Install/Bin,$(1))\nendef\n\ndefine Build/Prepare\n\t$(Build/Prepare/Default)\n\t$(RM) -r $(PKG_BUILD_DIR)/rules/logic_test\nendef\n\n$(eval $(call GoBinPackage,mihomo-alpha))\n$(eval $(call BuildPackage,mihomo-alpha))\n"
  },
  {
    "path": "luci-app-nikki/mihomo-meta/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=mihomo-meta\nPKG_VERSION:=1.19.24\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_SUBDIR:=$(PKG_NAME)-$(PKG_VERSION)\nPKG_SOURCE_PROTO:=git\nPKG_SOURCE_URL:=https://github.com/MetaCubeX/mihomo.git\nPKG_SOURCE_VERSION:=v1.19.24\nPKG_MIRROR_HASH:=3c7a996f3eeb675d7b93ea07694af67b0958957b579fba62199826dd65056192\n\nPKG_LICENSE:=GPL3.0+\nPKG_MAINTAINER:=Joseph Mory <morytyann@gmail.com>\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_BUILD_FLAGS:=no-mips16\n\nPKG_BUILD_VERSION:=v1.19.24\nPKG_BUILD_TIME:=$(shell date -u -Iseconds)\n\nGO_PKG:=github.com/metacubex/mihomo\nGO_PKG_LDFLAGS_X:=$(GO_PKG)/constant.Version=$(PKG_BUILD_VERSION) $(GO_PKG)/constant.BuildTime=$(PKG_BUILD_TIME)\nGO_PKG_TAGS:=with_gvisor\nGO_PKG_INSTALL_BIN_PATH:=/usr/libexec\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/mihomo-meta\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=A rule based proxy in Go.\n  URL:=https://wiki.metacubex.one\n  DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle +ip-full +kmod-inet-diag +kmod-tun\n  PROVIDES:=mihomo\n  CONFLICTS:=mihomo-alpha\n  VARIANT:=meta\n  DEFAULT_VARIANT:=1\n  ALTERNATIVES:=\\\n    300:/usr/bin/mihomo:/usr/libexec/mihomo\nendef\n\ndefine Package/mihomo-meta/description\n  A rule based proxy in Go.\nendef\n\ndefine Package/mihomo-meta/install\n\t$(call GoPackage/Package/Install/Bin,$(1))\nendef\n\ndefine Build/Prepare\n\t$(Build/Prepare/Default)\n\t$(RM) -r $(PKG_BUILD_DIR)/rules/logic_test\nendef\n\n$(eval $(call GoBinPackage,mihomo-meta))\n$(eval $(call BuildPackage,mihomo-meta))\n"
  },
  {
    "path": "luci-app-nikki/nikki/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=nikki\nPKG_VERSION:=2026.04.08\nPKG_RELEASE:=1\n\nPKG_LICENSE:=GPL3.0+\nPKG_MAINTAINER:=Joseph Mory <morytyann@gmail.com>\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_BUILD_FLAGS:=no-mips16\n\nPKG_BUILD_TIME:=$(shell date -u -Iseconds)\n\nGO_PKG:=github.com/metacubex/mihomo\nGO_PKG_LDFLAGS_X:=$(GO_PKG)/constant.Version=$(PKG_SOURCE_VERSION) $(GO_PKG)/constant.BuildTime=$(PKG_BUILD_TIME)\nGO_PKG_TAGS:=with_gvisor\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/nikki\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=Transparent Proxy with Mihomo on OpenWrt.\n  URL:=https://github.com/nikkinikki-org\n  DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle +curl +yq firewall4 +ip-full +kmod-inet-diag +kmod-nft-socket +kmod-nft-tproxy +kmod-tun +kmod-dummy +mihomo\nendef\n\ndefine Package/nikki/conffiles\n/etc/config/nikki\n/etc/nikki/mixin.yaml\nendef\n\ndefine Package/nikki/install\n\t$(INSTALL_DIR) $(1)/etc/nikki\n\t$(INSTALL_DIR) $(1)/etc/nikki/ucode\n\t$(INSTALL_DIR) $(1)/etc/nikki/scripts\n\t$(INSTALL_DIR) $(1)/etc/nikki/nftables\n\t$(INSTALL_DIR) $(1)/etc/nikki/profiles\n\t$(INSTALL_DIR) $(1)/etc/nikki/subscriptions\n\t$(INSTALL_DIR) $(1)/etc/nikki/run\n\t$(INSTALL_DIR) $(1)/etc/nikki/run/providers\n\t$(INSTALL_DIR) $(1)/etc/nikki/run/providers/rule\n\t$(INSTALL_DIR) $(1)/etc/nikki/run/providers/proxy\n\n\t$(INSTALL_DATA) $(CURDIR)/files/mixin.yaml $(1)/etc/nikki/mixin.yaml\n\n\t$(INSTALL_BIN) $(CURDIR)/files/ucode/include.uc $(1)/etc/nikki/ucode/include.uc\n\t$(INSTALL_BIN) $(CURDIR)/files/ucode/mixin.uc $(1)/etc/nikki/ucode/mixin.uc\n\t$(INSTALL_BIN) $(CURDIR)/files/ucode/hijack.ut $(1)/etc/nikki/ucode/hijack.ut\n\n\t$(INSTALL_BIN) $(CURDIR)/files/scripts/include.sh $(1)/etc/nikki/scripts/include.sh\n\t$(INSTALL_BIN) $(CURDIR)/files/scripts/firewall_include.sh $(1)/etc/nikki/scripts/firewall_include.sh\n\t$(INSTALL_BIN) $(CURDIR)/files/scripts/debug.sh $(1)/etc/nikki/scripts/debug.sh\n\n\t$(INSTALL_BIN) $(CURDIR)/files/nftables/geoip_cn.nft $(1)/etc/nikki/nftables/geoip_cn.nft\n\t$(INSTALL_BIN) $(CURDIR)/files/nftables/geoip6_cn.nft $(1)/etc/nikki/nftables/geoip6_cn.nft\n\n\t$(INSTALL_DIR) $(1)/etc/config\n\t$(INSTALL_CONF) $(CURDIR)/files/nikki.conf $(1)/etc/config/nikki\n\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_BIN) $(CURDIR)/files/nikki.init $(1)/etc/init.d/nikki\n\n\t$(INSTALL_DIR) $(1)/etc/uci-defaults\n\t$(INSTALL_BIN) $(CURDIR)/files/uci-defaults/firewall.sh $(1)/etc/uci-defaults/99_firewall_nikki\n\t$(INSTALL_BIN) $(CURDIR)/files/uci-defaults/init.sh $(1)/etc/uci-defaults/99_init_nikki\n\t$(INSTALL_BIN) $(CURDIR)/files/uci-defaults/migrate.sh $(1)/etc/uci-defaults/99_migrate_nikki\n\n\t$(INSTALL_DIR) $(1)/lib/upgrade/keep.d\n\t$(INSTALL_DATA) $(CURDIR)/files/nikki.upgrade $(1)/lib/upgrade/keep.d/nikki\nendef\n\ndefine Package/nikki/postrm\n#!/bin/sh\nif [ -z $${IPKG_INSTROOT} ]; then\n\tuci -q batch <<-EOF > /dev/null\n\t\tdel firewall.nikki\n\t\tcommit firewall\n\tEOF\nfi\nendef\n\ndefine Build/Compile\n\nendef\n\n$(eval $(call GoBinPackage,nikki))\n$(eval $(call BuildPackage,nikki))\n"
  },
  {
    "path": "luci-app-nikki/nikki/files/mixin.yaml",
    "content": "# Mixin File\n# You can set any mihomo profile's config at here, it will mixin to the profile.\n# Mixin file have lower priority than the LuCI mixin options.\n#\n# Mihomo's Wiki: https://wiki.metacubex.one\n#\n# For example:\n#\n# experimental: # experimental config\n#   dialer-ip4p-convert: false # IP4P support\n# listeners: # overwrite listeners\n#   - name: shadowsocks\n#     type: shadowsocks\n#     listen: \"::\"\n#     port: 12060\n# nikki-proxies: # prepend proxies\n#   - name: PROXY\n#     type: ss\n#     server: proxy.example.com\n#     port: 443\n#     cipher: chacha20-ietf-poly1305\n#     password: password\n# nikki-proxy-groups: # prepend proxy groups\n#   - name: PROXY_GROUP\n#     type: select\n#     proxies:\n#       - PROXY\n# nikki-rules: # prepend rules\n#   - DOMAIN,direct.example.com,DIRECT\n#   - DOMAIN-SUFFIX,proxy.example.com,PROXY"
  },
  {
    "path": "luci-app-nikki/nikki/files/nftables/geoip6_cn.nft",
    "content": "#!/usr/sbin/nft -f\n\ntable inet nikki {\n\tset china_ip6 {\n\t\ttype ipv6_addr\n\t\tflags interval\n\t\telements = {\n\t\t\t2001:250::/30,\n\t\t\t2001:254::/33,\n\t\t\t2001:255::/32,\n\t\t\t2001:256:100::/48,\n\t\t\t2001:3c8:1012::/48,\n\t\t\t2001:678:120::/48,\n\t\t\t2001:678:53c::/48,\n\t\t\t2001:678:10d0::/48,\n\t\t\t2001:678:114c::/48,\n\t\t\t2001:67c:ebc::/48,\n\t\t\t2001:7fa:5::/48,\n\t\t\t2001:c68::/32,\n\t\t\t2001:cc0::/32,\n\t\t\t2001:da8::/32,\n\t\t\t2001:daa:1::/48,\n\t\t\t2001:daa:2::/47,\n\t\t\t2001:daa:4::/47,\n\t\t\t2001:daa:6::/48,\n\t\t\t2001:dc7::/32,\n\t\t\t2001:dcc:501::/48,\n\t\t\t2001:dd8:1::/48,\n\t\t\t2001:dd9::/48,\n\t\t\t2001:df0:ac40::/48,\n\t\t\t2001:df1:da00::/48,\n\t\t\t2001:df3:8b80::/48,\n\t\t\t2001:df3:d0c0::/48,\n\t\t\t2001:df5:4740::/48,\n\t\t\t2001:df6:40::/48,\n\t\t\t2001:df7:1480::/48,\n\t\t\t2001:4510:400::/40,\n\t\t\t2400:1160::/32,\n\t\t\t2400:3200::/32,\n\t\t\t2400:5280:f803::/48,\n\t\t\t2400:54a0:21c0::/46,\n\t\t\t2400:5a00::/32,\n\t\t\t2400:5a60:2::/48,\n\t\t\t2400:5f60::/32,\n\t\t\t2400:6000::/32,\n\t\t\t2400:6600::/32,\n\t\t\t2400:6e60:1301::/48,\n\t\t\t2400:75aa::/32,\n\t\t\t2400:7bc0:20::/43,\n\t\t\t2400:7fc0::/40,\n\t\t\t2400:7fc0:220::/44,\n\t\t\t2400:7fc0:240::/44,\n\t\t\t2400:7fc0:2a0::/44,\n\t\t\t2400:7fc0:2c0::/44,\n\t\t\t2400:7fc0:4000::/40,\n\t\t\t2400:7fc0:4100::/48,\n\t\t\t2400:7fc0:6000::/40,\n\t\t\t2400:7fc0:8000::/36,\n\t\t\t2400:7fc0:a000::/36,\n\t\t\t2400:7fc0:bb00::/40,\n\t\t\t2400:7fc0:c000::/36,\n\t\t\t2400:8200::/32,\n\t\t\t2400:89c0:1010::/44,\n\t\t\t2400:89c0:1050::/46,\n\t\t\t2400:89c0:1130::/44,\n\t\t\t2400:89c0:1150::/48,\n\t\t\t2400:89c0:2100::/48,\n\t\t\t2400:89c0:2200::/48,\n\t\t\t2400:89c0:3010::/44,\n\t\t\t2400:89c0:6000::/48,\n\t\t\t2400:89c0:6100::/48,\n\t\t\t2400:8fc0:571::/48,\n\t\t\t2400:9020:f010::/46,\n\t\t\t2400:9340::/32,\n\t\t\t2400:9380:8001::/48,\n\t\t\t2400:9380:8003::/48,\n\t\t\t2400:9380:8021::/48,\n\t\t\t2400:9380:8040::/48,\n\t\t\t2400:9380:8140::/48,\n\t\t\t2400:9380:8201::/48,\n\t\t\t2400:9380:8301::/48,\n\t\t\t2400:9380:9001::/48,\n\t\t\t2400:9380:9009::/48,\n\t\t\t2400:9380:9020::/47,\n\t\t\t2400:9380:9050::/47,\n\t\t\t2400:9380:9060::/48,\n\t\t\t2400:9380:9071::/48,\n\t\t\t2400:9380:9080::/47,\n\t\t\t2400:9380:90b1::/48,\n\t\t\t2400:9380:90b2::/47,\n\t\t\t2400:9380:90b4::/46,\n\t\t\t2400:9380:90c0::/44,\n\t\t\t2400:9380:9121::/48,\n\t\t\t2400:9380:91c0::/44,\n\t\t\t2400:9380:9220::/47,\n\t\t\t2400:9380:9250::/47,\n\t\t\t2400:9380:9260::/48,\n\t\t\t2400:9380:9271::/48,\n\t\t\t2400:9380:9280::/47,\n\t\t\t2400:9380:92b1::/48,\n\t\t\t2400:9380:92b2::/47,\n\t\t\t2400:9380:92b4::/46,\n\t\t\t2400:9380:92c0::/44,\n\t\t\t2400:9380:93c0::/44,\n\t\t\t2400:9380:94c0::/44,\n\t\t\t2400:9380:95c0::/44,\n\t\t\t2400:9380:96c0::/44,\n\t\t\t2400:9380:97c0::/44,\n\t\t\t2400:9380:98c0::/44,\n\t\t\t2400:9380:99c0::/44,\n\t\t\t2400:9380:9ac0::/44,\n\t\t\t2400:9380:9bc0::/44,\n\t\t\t2400:9380:9cc0::/44,\n\t\t\t2400:9380:9dc0::/44,\n\t\t\t2400:9380:9ec0::/44,\n\t\t\t2400:9380:9fc0::/44,\n\t\t\t2400:95e0::/48,\n\t\t\t2400:9600:8800::/48,\n\t\t\t2400:9620::/32,\n\t\t\t2400:a040::/32,\n\t\t\t2400:a860:1::/48,\n\t\t\t2400:a860:2::/47,\n\t\t\t2400:a860:4::/47,\n\t\t\t2400:a860:6::/48,\n\t\t\t2400:a980::/29,\n\t\t\t2400:ae00:1981::/48,\n\t\t\t2400:b200::/32,\n\t\t\t2400:b600::/32,\n\t\t\t2400:b620::/48,\n\t\t\t2400:b700::/48,\n\t\t\t2400:be00::/48,\n\t\t\t2400:cb80:e2e::/47,\n\t\t\t2400:cb80:e30::/44,\n\t\t\t2400:cb80:e40::/44,\n\t\t\t2400:da00::/32,\n\t\t\t2400:dd00::/28,\n\t\t\t2400:ee00:ffec::/46,\n\t\t\t2400:ee00:fff0::/44,\n\t\t\t2400:f6e0::/32,\n\t\t\t2400:f720::/32,\n\t\t\t2400:fe00::/32,\n\t\t\t2401:20::/40,\n\t\t\t2401:20:1330::/46,\n\t\t\t2401:800::/32,\n\t\t\t2401:1160::/32,\n\t\t\t2401:1320::/32,\n\t\t\t2401:1d40::/32,\n\t\t\t2401:2e00::/32,\n\t\t\t2401:3480::/36,\n\t\t\t2401:3480:2000::/48,\n\t\t\t2401:3480:3000::/36,\n\t\t\t2401:34a0::/31,\n\t\t\t2401:3800::/32,\n\t\t\t2401:5c20:10::/48,\n\t\t\t2401:70e0::/32,\n\t\t\t2401:71c0::/48,\n\t\t\t2401:7660::/48,\n\t\t\t2401:7700::/32,\n\t\t\t2401:8a00:11::/48,\n\t\t\t2401:8a00:12::/48,\n\t\t\t2401:8be0::/48,\n\t\t\t2401:8d00::/46,\n\t\t\t2401:8d00:4::/48,\n\t\t\t2401:8d00:7::/48,\n\t\t\t2401:8d00:8::/47,\n\t\t\t2401:8d00:b::/48,\n\t\t\t2401:8d00:c::/48,\n\t\t\t2401:8d00:f::/48,\n\t\t\t2401:8d00:14::/48,\n\t\t\t2401:9a00::/44,\n\t\t\t2401:9a00:10::/46,\n\t\t\t2401:a140:1::/48,\n\t\t\t2401:b180::/32,\n\t\t\t2401:b400::/45,\n\t\t\t2401:b400:8::/47,\n\t\t\t2401:b400:11::/48,\n\t\t\t2401:b400:14::/48,\n\t\t\t2401:b400:16::/47,\n\t\t\t2401:b400:20::/47,\n\t\t\t2401:b680::/32,\n\t\t\t2401:bd60::/32,\n\t\t\t2401:be00::/32,\n\t\t\t2401:c020:6::/48,\n\t\t\t2401:c020:8::/47,\n\t\t\t2401:c020:14::/48,\n\t\t\t2401:cb80::/32,\n\t\t\t2401:cc00::/32,\n\t\t\t2401:ce00::/32,\n\t\t\t2401:d0e0:2::/47,\n\t\t\t2401:d180::/46,\n\t\t\t2401:d180:10::/47,\n\t\t\t2401:d180:111::/48,\n\t\t\t2401:d180:2120::/48,\n\t\t\t2401:d920::/48,\n\t\t\t2401:de00::/32,\n\t\t\t2401:ec00::/32,\n\t\t\t2401:f860:7::/48,\n\t\t\t2401:f860:b::/48,\n\t\t\t2401:f860:d::/48,\n\t\t\t2401:f860:85::/48,\n\t\t\t2401:f860:87::/48,\n\t\t\t2401:f860:88::/47,\n\t\t\t2401:f860:90::/46,\n\t\t\t2401:f860:94::/48,\n\t\t\t2401:f860:96::/47,\n\t\t\t2401:f860:f6::/48,\n\t\t\t2401:f860:100::/40,\n\t\t\t2401:fa00:40::/43,\n\t\t\t2402:840:d000::/46,\n\t\t\t2402:840:e000::/46,\n\t\t\t2402:840:f000::/38,\n\t\t\t2402:c60::/48,\n\t\t\t2402:1440::/32,\n\t\t\t2402:1460::/32,\n\t\t\t2402:2000::/32,\n\t\t\t2402:20e0:f000::/48,\n\t\t\t2402:3180::/46,\n\t\t\t2402:3180:8000::/33,\n\t\t\t2402:33e0::/32,\n\t\t\t2402:36e0::/44,\n\t\t\t2402:3c00::/32,\n\t\t\t2402:3f80:1400::/40,\n\t\t\t2402:4060:8888::/48,\n\t\t\t2402:4b80::/32,\n\t\t\t2402:4e00::/32,\n\t\t\t2402:5ec0::/32,\n\t\t\t2402:6e80::/32,\n\t\t\t2402:6f40::/48,\n\t\t\t2402:6f40:2::/48,\n\t\t\t2402:7d80::/48,\n\t\t\t2402:7d80:240::/48,\n\t\t\t2402:7d80:8888::/48,\n\t\t\t2402:8bc0::/32,\n\t\t\t2402:8cc0::/40,\n\t\t\t2402:8cc0:200::/40,\n\t\t\t2402:92c0::/48,\n\t\t\t2402:93c0::/48,\n\t\t\t2402:93c0:20::/48,\n\t\t\t2402:93c0:100::/48,\n\t\t\t2402:9a80::/32,\n\t\t\t2402:a200::/32,\n\t\t\t2402:b8c0:6::/48,\n\t\t\t2402:b8c0:86::/48,\n\t\t\t2402:b8c0:106::/48,\n\t\t\t2402:b8c0:186::/48,\n\t\t\t2402:b940::/40,\n\t\t\t2402:b940:200::/39,\n\t\t\t2402:d340::/32,\n\t\t\t2402:db40:5100::/48,\n\t\t\t2402:db40:5900::/48,\n\t\t\t2402:db40:5f00::/46,\n\t\t\t2402:dfc0::/44,\n\t\t\t2402:dfc0:50::/44,\n\t\t\t2402:e380:15::/48,\n\t\t\t2402:e380:100::/40,\n\t\t\t2402:e480::/32,\n\t\t\t2402:e740::/32,\n\t\t\t2402:e7c0::/32,\n\t\t\t2402:e880::/48,\n\t\t\t2402:ef40::/32,\n\t\t\t2402:f000::/32,\n\t\t\t2402:f140:ff00::/46,\n\t\t\t2402:f140:ff04::/48,\n\t\t\t2402:f140:ff10::/46,\n\t\t\t2402:f140:ff14::/48,\n\t\t\t2402:f8c0::/42,\n\t\t\t2403:600::/32,\n\t\t\t2403:c80::/32,\n\t\t\t2403:1b80::/48,\n\t\t\t2403:1ec0:1200::/48,\n\t\t\t2403:1ec0:1400::/48,\n\t\t\t2403:1ec0:1600::/48,\n\t\t\t2403:1ec0:1610::/48,\n\t\t\t2403:1ec0:1900::/48,\n\t\t\t2403:2040::/48,\n\t\t\t2403:2b40::/32,\n\t\t\t2403:3140::/32,\n\t\t\t2403:4240::/32,\n\t\t\t2403:4280::/47,\n\t\t\t2403:4300::/32,\n\t\t\t2403:4c80::/48,\n\t\t\t2403:5c80::/48,\n\t\t\t2403:6380:40::/46,\n\t\t\t2403:6380:60::/44,\n\t\t\t2403:6740::/48,\n\t\t\t2403:6a00::/32,\n\t\t\t2403:7580::/32,\n\t\t\t2403:8080:101::/48,\n\t\t\t2403:8c00::/32,\n\t\t\t2403:9b00:2000::/48,\n\t\t\t2403:9b00:2400::/48,\n\t\t\t2403:9b00:6000::/48,\n\t\t\t2403:a100::/48,\n\t\t\t2403:a140:10::/48,\n\t\t\t2403:a140:100::/40,\n\t\t\t2403:a200::/32,\n\t\t\t2403:ac00::/32,\n\t\t\t2403:ad80:8008::/48,\n\t\t\t2403:ad80:8047::/48,\n\t\t\t2403:b400::/32,\n\t\t\t2403:c980::/32,\n\t\t\t2403:d400::/32,\n\t\t\t2403:e7c0:3::/48,\n\t\t\t2403:e840::/33,\n\t\t\t2403:e840:8000::/34,\n\t\t\t2403:e840:c000::/35,\n\t\t\t2403:e840:e000::/36,\n\t\t\t2403:e840:f000::/37,\n\t\t\t2403:e840:f800::/38,\n\t\t\t2403:e840:fc00::/39,\n\t\t\t2403:e840:fe00::/40,\n\t\t\t2403:e840:ff00::/41,\n\t\t\t2403:e840:ff80::/42,\n\t\t\t2403:e840:ffc0::/43,\n\t\t\t2403:e840:ffe0::/44,\n\t\t\t2403:e840:fff0::/45,\n\t\t\t2403:e840:fff8::/46,\n\t\t\t2403:e840:fffc::/47,\n\t\t\t2403:e840:ffff::/48,\n\t\t\t2403:f4c0::/48,\n\t\t\t2403:ffc0:1100::/40,\n\t\t\t2403:ffc0:1200::/39,\n\t\t\t2404:bc0:1::/48,\n\t\t\t2404:bc0:4000::/43,\n\t\t\t2404:bc0:4100::/43,\n\t\t\t2404:bc0:4200::/43,\n\t\t\t2404:bc0:4300::/44,\n\t\t\t2404:bc0:4400::/43,\n\t\t\t2404:bc0:4500::/43,\n\t\t\t2404:bc0:4f00::/43,\n\t\t\t2404:1c80::/32,\n\t\t\t2404:3700::/48,\n\t\t\t2404:4dc0::/32,\n\t\t\t2404:6380::/48,\n\t\t\t2404:6380:1000::/48,\n\t\t\t2404:6380:8001::/48,\n\t\t\t2404:6500:dcb3::/48,\n\t\t\t2404:7180:a000::/48,\n\t\t\t2404:7180:a010::/48,\n\t\t\t2404:7180:aa00::/48,\n\t\t\t2404:7180:aa10::/48,\n\t\t\t2404:7180:b001::/48,\n\t\t\t2404:7180:b002::/48,\n\t\t\t2404:7180:b010::/48,\n\t\t\t2404:7180:c001::/48,\n\t\t\t2404:7180:c002::/48,\n\t\t\t2404:7180:c011::/48,\n\t\t\t2404:7180:c012::/48,\n\t\t\t2404:7180:f000::/48,\n\t\t\t2404:7180:f010::/48,\n\t\t\t2404:7240::/33,\n\t\t\t2404:7600::/32,\n\t\t\t2404:7940::/32,\n\t\t\t2404:7ac0:200::/40,\n\t\t\t2404:7cc0:7f04::/47,\n\t\t\t2404:8c80:ff00::/48,\n\t\t\t2404:c2c0::/40,\n\t\t\t2404:c2c0:240::/44,\n\t\t\t2404:c2c0:280::/44,\n\t\t\t2404:c2c0:2c0::/44,\n\t\t\t2404:c2c0:501::/48,\n\t\t\t2404:c2c0:4000::/40,\n\t\t\t2404:c2c0:4100::/48,\n\t\t\t2404:c2c0:6000::/40,\n\t\t\t2404:c2c0:8000::/36,\n\t\t\t2404:c2c0:bb00::/40,\n\t\t\t2404:c2c0:c000::/36,\n\t\t\t2404:c300::/32,\n\t\t\t2404:c940::/48,\n\t\t\t2404:e280::/47,\n\t\t\t2404:e5c0::/32,\n\t\t\t2404:e8c0::/32,\n\t\t\t2404:f4c0::/33,\n\t\t\t2404:f4c0:8000::/34,\n\t\t\t2404:f4c0:c000::/35,\n\t\t\t2404:f4c0:e000::/36,\n\t\t\t2404:f4c0:f000::/47,\n\t\t\t2404:f4c0:f003::/48,\n\t\t\t2404:f4c0:f004::/46,\n\t\t\t2404:f4c0:f008::/45,\n\t\t\t2404:f4c0:f010::/44,\n\t\t\t2404:f4c0:f020::/43,\n\t\t\t2404:f4c0:f040::/42,\n\t\t\t2404:f4c0:f080::/41,\n\t\t\t2404:f4c0:f100::/40,\n\t\t\t2404:f4c0:f200::/39,\n\t\t\t2404:f4c0:f400::/38,\n\t\t\t2404:f4c0:f800::/40,\n\t\t\t2404:f4c0:f900::/41,\n\t\t\t2404:f4c0:f980::/42,\n\t\t\t2404:f4c0:f9c0::/47,\n\t\t\t2404:f4c0:f9c2::/48,\n\t\t\t2404:f4c0:f9c4::/46,\n\t\t\t2404:f4c0:f9c8::/46,\n\t\t\t2404:f4c0:f9cc::/47,\n\t\t\t2404:f4c0:f9ce::/48,\n\t\t\t2404:f4c0:f9d0::/44,\n\t\t\t2404:f4c0:f9e0::/43,\n\t\t\t2404:f4c0:fa00::/41,\n\t\t\t2404:f4c0:fa90::/44,\n\t\t\t2404:f4c0:faa0::/43,\n\t\t\t2404:f4c0:fac0::/42,\n\t\t\t2404:f4c0:fb00::/40,\n\t\t\t2404:f4c0:fc00::/38,\n\t\t\t2405:6c0:2::/48,\n\t\t\t2405:6c0:4::/48,\n\t\t\t2405:1480:1000::/48,\n\t\t\t2405:1480:2000::/48,\n\t\t\t2405:1480:3000::/47,\n\t\t\t2405:3140:11::/48,\n\t\t\t2405:3140:21::/48,\n\t\t\t2405:3140:31::/48,\n\t\t\t2405:3140:3a::/48,\n\t\t\t2405:66c0::/32,\n\t\t\t2405:68c0:21::/48,\n\t\t\t2405:6940::/48,\n\t\t\t2405:6f00:c101::/48,\n\t\t\t2405:6f00:c102::/48,\n\t\t\t2405:6f00:c170::/47,\n\t\t\t2405:6f00:c602::/48,\n\t\t\t2405:7040:6000::/47,\n\t\t\t2405:78c0:6e00::/43,\n\t\t\t2405:8a40::/32,\n\t\t\t2405:a900:ffee::/48,\n\t\t\t2405:a900:fffe::/48,\n\t\t\t2405:ad00::/32,\n\t\t\t2405:b7c0::/32,\n\t\t\t2405:d900::/32,\n\t\t\t2405:e000::/32,\n\t\t\t2405:f580::/32,\n\t\t\t2405:f940::/32,\n\t\t\t2406:280::/32,\n\t\t\t2406:840:8100::/40,\n\t\t\t2406:840:9000::/44,\n\t\t\t2406:840:9600::/44,\n\t\t\t2406:840:9620::/44,\n\t\t\t2406:840:9963::/48,\n\t\t\t2406:840:996c::/48,\n\t\t\t2406:840:e080::/44,\n\t\t\t2406:840:e0cf::/48,\n\t\t\t2406:840:e0e0::/46,\n\t\t\t2406:840:e0e4::/47,\n\t\t\t2406:840:e0e8::/48,\n\t\t\t2406:840:e10f::/48,\n\t\t\t2406:840:e14f::/48,\n\t\t\t2406:840:e260::/48,\n\t\t\t2406:840:e304::/48,\n\t\t\t2406:840:e330::/44,\n\t\t\t2406:840:e600::/44,\n\t\t\t2406:840:e620::/47,\n\t\t\t2406:840:e666::/47,\n\t\t\t2406:840:e720::/44,\n\t\t\t2406:840:e770::/48,\n\t\t\t2406:840:e777::/48,\n\t\t\t2406:840:e80f::/48,\n\t\t\t2406:840:eb00::/46,\n\t\t\t2406:840:eb04::/47,\n\t\t\t2406:840:eb07::/48,\n\t\t\t2406:840:eb08::/48,\n\t\t\t2406:840:eb0b::/48,\n\t\t\t2406:840:eb0f::/48,\n\t\t\t2406:840:ee40::/47,\n\t\t\t2406:840:ee44::/48,\n\t\t\t2406:840:ee4b::/48,\n\t\t\t2406:840:ee4d::/48,\n\t\t\t2406:840:eee5::/48,\n\t\t\t2406:840:f200::/48,\n\t\t\t2406:840:f203::/48,\n\t\t\t2406:840:f380::/44,\n\t\t\t2406:840:f44f::/48,\n\t\t\t2406:840:f860::/46,\n\t\t\t2406:840:f868::/47,\n\t\t\t2406:840:f86c::/48,\n\t\t\t2406:840:f889::/48,\n\t\t\t2406:840:fa01::/48,\n\t\t\t2406:840:fa40::/48,\n\t\t\t2406:840:fa60::/44,\n\t\t\t2406:840:fc10::/44,\n\t\t\t2406:840:fc20::/43,\n\t\t\t2406:840:fc40::/42,\n\t\t\t2406:840:fc80::/46,\n\t\t\t2406:840:fc84::/48,\n\t\t\t2406:840:fc86::/47,\n\t\t\t2406:840:fc88::/48,\n\t\t\t2406:840:fc8f::/48,\n\t\t\t2406:840:fc90::/44,\n\t\t\t2406:840:fca0::/43,\n\t\t\t2406:840:fcc0::/44,\n\t\t\t2406:840:fcd0::/48,\n\t\t\t2406:840:fcf0::/46,\n\t\t\t2406:840:fcf4::/47,\n\t\t\t2406:840:fd40::/42,\n\t\t\t2406:840:fd80::/42,\n\t\t\t2406:840:fdc0::/44,\n\t\t\t2406:840:fdef::/48,\n\t\t\t2406:840:fe27::/48,\n\t\t\t2406:840:fe90::/46,\n\t\t\t2406:840:fe94::/48,\n\t\t\t2406:840:fe96::/47,\n\t\t\t2406:840:fe98::/46,\n\t\t\t2406:840:fe9d::/48,\n\t\t\t2406:840:fe9e::/48,\n\t\t\t2406:840:fea2::/47,\n\t\t\t2406:840:fea4::/46,\n\t\t\t2406:840:fea8::/48,\n\t\t\t2406:840:feaa::/47,\n\t\t\t2406:840:feac::/46,\n\t\t\t2406:840:fec0::/48,\n\t\t\t2406:840:fec2::/47,\n\t\t\t2406:840:fec4::/47,\n\t\t\t2406:840:feca::/47,\n\t\t\t2406:840:fecc::/47,\n\t\t\t2406:840:fecf::/48,\n\t\t\t2406:840:fed1::/48,\n\t\t\t2406:840:fed8::/48,\n\t\t\t2406:840:fedb::/48,\n\t\t\t2406:840:fedc::/48,\n\t\t\t2406:840:fedf::/48,\n\t\t\t2406:840:fef0::/48,\n\t\t\t2406:840:fef3::/48,\n\t\t\t2406:840:fef4::/48,\n\t\t\t2406:840:fef6::/47,\n\t\t\t2406:840:fef8::/46,\n\t\t\t2406:840:fefc::/48,\n\t\t\t2406:840:feff::/48,\n\t\t\t2406:1080::/48,\n\t\t\t2406:2700::/32,\n\t\t\t2406:3340::/32,\n\t\t\t2406:3d80::/32,\n\t\t\t2406:4d00::/48,\n\t\t\t2406:52c0::/32,\n\t\t\t2406:5340:6666::/48,\n\t\t\t2406:5340:8888::/48,\n\t\t\t2406:6100::/32,\n\t\t\t2406:b640:100::/48,\n\t\t\t2406:b640:4100::/48,\n\t\t\t2406:cac0::/40,\n\t\t\t2406:cac0:200::/40,\n\t\t\t2406:cf00::/48,\n\t\t\t2406:cf00:1000::/43,\n\t\t\t2406:d440:100::/43,\n\t\t\t2406:d440:200::/43,\n\t\t\t2406:d440:300::/43,\n\t\t\t2406:d440:ff00::/48,\n\t\t\t2406:d440:ffff::/48,\n\t\t\t2406:e3c0::/32,\n\t\t\t2406:e500::/33,\n\t\t\t2407:23c0::/48,\n\t\t\t2407:2840::/48,\n\t\t\t2407:37c0::/32,\n\t\t\t2407:5380::/32,\n\t\t\t2407:6c40:1100::/48,\n\t\t\t2407:6c40:1210::/48,\n\t\t\t2407:6c40:1500::/48,\n\t\t\t2407:6c40:1600::/40,\n\t\t\t2407:8f40:2::/48,\n\t\t\t2407:9f00::/32,\n\t\t\t2407:ad80::/32,\n\t\t\t2407:ae80::/32,\n\t\t\t2407:b380:8000::/48,\n\t\t\t2407:bc00::/32,\n\t\t\t2407:c080::/35,\n\t\t\t2407:c080:4000::/37,\n\t\t\t2407:c080:5000::/37,\n\t\t\t2407:c080:6000::/36,\n\t\t\t2407:c080:8000::/36,\n\t\t\t2407:d9c0::/32,\n\t\t\t2408:4000::/22,\n\t\t\t2408:8000::/48,\n\t\t\t2408:8000:2::/47,\n\t\t\t2408:8000:1000::/36,\n\t\t\t2408:8000:2000::/35,\n\t\t\t2408:8000:4000::/34,\n\t\t\t2408:8000:8000::/33,\n\t\t\t2408:8001::/32,\n\t\t\t2408:8020::/30,\n\t\t\t2408:8024::/31,\n\t\t\t2408:8026::/32,\n\t\t\t2408:802a:8000::/33,\n\t\t\t2408:802c::/32,\n\t\t\t2408:803e::/32,\n\t\t\t2408:8056::/32,\n\t\t\t2408:805c::/30,\n\t\t\t2408:8060::/33,\n\t\t\t2408:80c2::/33,\n\t\t\t2408:80c5::/33,\n\t\t\t2408:80ca::/33,\n\t\t\t2408:80ca:8000::/34,\n\t\t\t2408:80da::/33,\n\t\t\t2408:80da:8000::/34,\n\t\t\t2408:80e0:4000::/34,\n\t\t\t2408:80e0:8000::/33,\n\t\t\t2408:80e2::/33,\n\t\t\t2408:80e9:4000::/34,\n\t\t\t2408:80ea:4000::/34,\n\t\t\t2408:80ea:8000::/33,\n\t\t\t2408:80f0:4000::/34,\n\t\t\t2408:80f0:8000::/33,\n\t\t\t2408:80f1::/42,\n\t\t\t2408:80f1:40::/43,\n\t\t\t2408:80f1:70::/44,\n\t\t\t2408:80f1:80::/41,\n\t\t\t2408:80f1:100::/43,\n\t\t\t2408:80f1:120::/44,\n\t\t\t2408:80f1:160::/43,\n\t\t\t2408:80f1:180::/43,\n\t\t\t2408:80f1:1b0::/44,\n\t\t\t2408:80f1:1c0::/43,\n\t\t\t2408:80f1:1e0::/44,\n\t\t\t2408:80f1:200::/40,\n\t\t\t2408:80f5:4000::/34,\n\t\t\t2408:80f9:4000::/34,\n\t\t\t2408:80fa:4000::/34,\n\t\t\t2408:80fa:8000::/33,\n\t\t\t2408:8120:1::/48,\n\t\t\t2408:8120:2::/48,\n\t\t\t2408:8120:7000::/36,\n\t\t\t2408:8140:2000::/48,\n\t\t\t2408:815f:e000::/35,\n\t\t\t2408:8181::/40,\n\t\t\t2408:8181:6000::/40,\n\t\t\t2408:8181:8000::/40,\n\t\t\t2408:8181:a000::/40,\n\t\t\t2408:8181:a220::/44,\n\t\t\t2408:8181:e000::/40,\n\t\t\t2408:8182:6000::/40,\n\t\t\t2408:8182:c000::/40,\n\t\t\t2408:8183:4000::/40,\n\t\t\t2408:8183:8000::/40,\n\t\t\t2408:81a2:2000::/35,\n\t\t\t2408:81a2:4000::/35,\n\t\t\t2408:81a3:6000::/35,\n\t\t\t2408:81a3:c800::/48,\n\t\t\t2408:81a3:ca66::/48,\n\t\t\t2408:8206::/31,\n\t\t\t2408:8208::/29,\n\t\t\t2408:8210::/30,\n\t\t\t2408:8214::/31,\n\t\t\t2408:821a::/31,\n\t\t\t2408:8220::/31,\n\t\t\t2408:8226::/32,\n\t\t\t2408:822a::/31,\n\t\t\t2408:822e::/31,\n\t\t\t2408:8230::/29,\n\t\t\t2408:8238::/31,\n\t\t\t2408:823c::/31,\n\t\t\t2408:8240::/32,\n\t\t\t2408:8244::/30,\n\t\t\t2408:8248::/30,\n\t\t\t2408:824c::/32,\n\t\t\t2408:824e::/31,\n\t\t\t2408:8250::/30,\n\t\t\t2408:8254::/32,\n\t\t\t2408:8256::/31,\n\t\t\t2408:8258::/30,\n\t\t\t2408:825c::/31,\n\t\t\t2408:825f::/32,\n\t\t\t2408:8260::/32,\n\t\t\t2408:8262::/31,\n\t\t\t2408:8264::/31,\n\t\t\t2408:8266::/32,\n\t\t\t2408:826a::/32,\n\t\t\t2408:826c::/30,\n\t\t\t2408:8270::/32,\n\t\t\t2408:8274::/30,\n\t\t\t2408:8278::/31,\n\t\t\t2408:827a::/32,\n\t\t\t2408:8306::/31,\n\t\t\t2408:8308::/30,\n\t\t\t2408:8310::/30,\n\t\t\t2408:832a::/32,\n\t\t\t2408:832e::/31,\n\t\t\t2408:8330::/30,\n\t\t\t2408:8338::/32,\n\t\t\t2408:8340::/32,\n\t\t\t2408:8344::/30,\n\t\t\t2408:8348::/30,\n\t\t\t2408:834e::/31,\n\t\t\t2408:8350::/30,\n\t\t\t2408:8354::/32,\n\t\t\t2408:8356::/31,\n\t\t\t2408:8358::/30,\n\t\t\t2408:8360::/30,\n\t\t\t2408:8364::/31,\n\t\t\t2408:836c::/30,\n\t\t\t2408:8374::/30,\n\t\t\t2408:8378::/31,\n\t\t\t2408:837a::/32,\n\t\t\t2408:8406:c0::/42,\n\t\t\t2408:8406:100::/41,\n\t\t\t2408:8406:180::/42,\n\t\t\t2408:8406:cc0::/42,\n\t\t\t2408:8406:d00::/41,\n\t\t\t2408:8406:d80::/42,\n\t\t\t2408:8406:18c0::/42,\n\t\t\t2408:8406:1900::/41,\n\t\t\t2408:8406:1980::/42,\n\t\t\t2408:8406:24c0::/42,\n\t\t\t2408:8406:2500::/41,\n\t\t\t2408:8406:2580::/42,\n\t\t\t2408:8406:30c0::/42,\n\t\t\t2408:8406:3100::/41,\n\t\t\t2408:8406:3180::/42,\n\t\t\t2408:8406:3cc0::/42,\n\t\t\t2408:8406:3d00::/41,\n\t\t\t2408:8406:3d80::/42,\n\t\t\t2408:8406:48c0::/42,\n\t\t\t2408:8406:4900::/41,\n\t\t\t2408:8406:4980::/42,\n\t\t\t2408:8406:54c0::/42,\n\t\t\t2408:8406:5500::/41,\n\t\t\t2408:8406:5580::/42,\n\t\t\t2408:8406:60c0::/42,\n\t\t\t2408:8406:6100::/41,\n\t\t\t2408:8406:6180::/42,\n\t\t\t2408:8406:6cc0::/42,\n\t\t\t2408:8406:6d00::/41,\n\t\t\t2408:8406:6d80::/42,\n\t\t\t2408:8406:78c0::/42,\n\t\t\t2408:8406:7900::/41,\n\t\t\t2408:8406:7980::/42,\n\t\t\t2408:8406:84c0::/42,\n\t\t\t2408:8406:8500::/41,\n\t\t\t2408:8406:8580::/42,\n\t\t\t2408:8406:90c0::/42,\n\t\t\t2408:8406:9100::/41,\n\t\t\t2408:8406:9180::/42,\n\t\t\t2408:8406:9cc0::/42,\n\t\t\t2408:8406:9d00::/41,\n\t\t\t2408:8406:9d80::/42,\n\t\t\t2408:8406:a8c0::/42,\n\t\t\t2408:8406:a900::/41,\n\t\t\t2408:8406:a980::/42,\n\t\t\t2408:8406:b4c0::/42,\n\t\t\t2408:8406:b500::/41,\n\t\t\t2408:8406:b580::/42,\n\t\t\t2408:8407:500::/42,\n\t\t\t2408:8409::/40,\n\t\t\t2408:8409:100::/41,\n\t\t\t2408:8409:1a0::/43,\n\t\t\t2408:8409:1c0::/42,\n\t\t\t2408:8409:200::/42,\n\t\t\t2408:8409:c00::/40,\n\t\t\t2408:8409:d00::/41,\n\t\t\t2408:8409:da0::/43,\n\t\t\t2408:8409:dc0::/42,\n\t\t\t2408:8409:e00::/42,\n\t\t\t2408:8409:1800::/40,\n\t\t\t2408:8409:1900::/41,\n\t\t\t2408:8409:19a0::/43,\n\t\t\t2408:8409:19c0::/42,\n\t\t\t2408:8409:1a00::/42,\n\t\t\t2408:8409:2400::/40,\n\t\t\t2408:8409:2500::/41,\n\t\t\t2408:8409:25a0::/43,\n\t\t\t2408:8409:25c0::/42,\n\t\t\t2408:8409:2600::/42,\n\t\t\t2408:8409:3000::/40,\n\t\t\t2408:8409:3100::/41,\n\t\t\t2408:8409:31a0::/43,\n\t\t\t2408:8409:31c0::/42,\n\t\t\t2408:8409:3200::/42,\n\t\t\t2408:8409:3c00::/40,\n\t\t\t2408:8409:3d00::/41,\n\t\t\t2408:8409:3da0::/43,\n\t\t\t2408:8409:3dc0::/42,\n\t\t\t2408:8409:3e00::/42,\n\t\t\t2408:8409:4800::/40,\n\t\t\t2408:8409:4900::/41,\n\t\t\t2408:8409:49a0::/43,\n\t\t\t2408:8409:49c0::/42,\n\t\t\t2408:8409:4a00::/42,\n\t\t\t2408:8409:5400::/40,\n\t\t\t2408:8409:5500::/41,\n\t\t\t2408:8409:55a0::/43,\n\t\t\t2408:8409:55c0::/42,\n\t\t\t2408:8409:5600::/42,\n\t\t\t2408:8409:6000::/40,\n\t\t\t2408:8409:6100::/41,\n\t\t\t2408:8409:61a0::/43,\n\t\t\t2408:8409:61c0::/42,\n\t\t\t2408:8409:6200::/42,\n\t\t\t2408:8409:6c00::/40,\n\t\t\t2408:8409:6d00::/41,\n\t\t\t2408:8409:6da0::/43,\n\t\t\t2408:8409:6dc0::/42,\n\t\t\t2408:8409:6e00::/42,\n\t\t\t2408:8409:7800::/40,\n\t\t\t2408:8409:7900::/41,\n\t\t\t2408:8409:79a0::/43,\n\t\t\t2408:8409:79c0::/42,\n\t\t\t2408:8409:7a00::/42,\n\t\t\t2408:8409:8400::/40,\n\t\t\t2408:8409:8500::/41,\n\t\t\t2408:8409:85a0::/43,\n\t\t\t2408:8409:85c0::/42,\n\t\t\t2408:8409:8600::/42,\n\t\t\t2408:8409:9000::/40,\n\t\t\t2408:8409:9100::/41,\n\t\t\t2408:8409:91a0::/43,\n\t\t\t2408:8409:91c0::/42,\n\t\t\t2408:8409:9200::/42,\n\t\t\t2408:8409:9c00::/40,\n\t\t\t2408:8409:9d00::/41,\n\t\t\t2408:8409:9da0::/43,\n\t\t\t2408:8409:9dc0::/42,\n\t\t\t2408:8409:9e00::/42,\n\t\t\t2408:8409:a800::/40,\n\t\t\t2408:8409:a900::/41,\n\t\t\t2408:8409:a9a0::/43,\n\t\t\t2408:8409:a9c0::/42,\n\t\t\t2408:8409:aa00::/42,\n\t\t\t2408:8409:b400::/40,\n\t\t\t2408:8409:b500::/41,\n\t\t\t2408:8409:b5a0::/43,\n\t\t\t2408:8409:b5c0::/42,\n\t\t\t2408:8409:b600::/42,\n\t\t\t2408:840c::/40,\n\t\t\t2408:840c:200::/40,\n\t\t\t2408:840c:d00::/40,\n\t\t\t2408:840c:f00::/40,\n\t\t\t2408:840c:1a00::/40,\n\t\t\t2408:840c:1c00::/40,\n\t\t\t2408:840c:2700::/40,\n\t\t\t2408:840c:2900::/40,\n\t\t\t2408:840c:3400::/40,\n\t\t\t2408:840c:3600::/40,\n\t\t\t2408:840c:4e00::/40,\n\t\t\t2408:840c:5000::/40,\n\t\t\t2408:840c:5b00::/40,\n\t\t\t2408:840c:5d00::/40,\n\t\t\t2408:840c:6800::/40,\n\t\t\t2408:840c:6a00::/40,\n\t\t\t2408:840c:7500::/40,\n\t\t\t2408:840c:7700::/40,\n\t\t\t2408:840c:8200::/40,\n\t\t\t2408:840c:8400::/40,\n\t\t\t2408:840c:8f00::/40,\n\t\t\t2408:840c:9100::/40,\n\t\t\t2408:840c:9c00::/40,\n\t\t\t2408:840c:9e00::/40,\n\t\t\t2408:840c:a900::/40,\n\t\t\t2408:840c:ab00::/40,\n\t\t\t2408:840c:b600::/40,\n\t\t\t2408:840c:b800::/40,\n\t\t\t2408:840c:c300::/40,\n\t\t\t2408:840c:c500::/40,\n\t\t\t2408:840c:d000::/40,\n\t\t\t2408:840c:d200::/40,\n\t\t\t2408:840c:dd00::/40,\n\t\t\t2408:840c:de00::/40,\n\t\t\t2408:840d::/42,\n\t\t\t2408:840d:200::/42,\n\t\t\t2408:840d:400::/42,\n\t\t\t2408:840d:440::/43,\n\t\t\t2408:840d:600::/42,\n\t\t\t2408:840d:d00::/42,\n\t\t\t2408:840d:f00::/42,\n\t\t\t2408:840d:1100::/42,\n\t\t\t2408:840d:1140::/43,\n\t\t\t2408:840d:1300::/42,\n\t\t\t2408:840d:1a00::/42,\n\t\t\t2408:840d:1c00::/42,\n\t\t\t2408:840d:1e00::/42,\n\t\t\t2408:840d:1e40::/43,\n\t\t\t2408:840d:2000::/42,\n\t\t\t2408:840d:2700::/42,\n\t\t\t2408:840d:2900::/42,\n\t\t\t2408:840d:2b00::/42,\n\t\t\t2408:840d:2b40::/43,\n\t\t\t2408:840d:2d00::/42,\n\t\t\t2408:840d:3400::/42,\n\t\t\t2408:840d:3600::/42,\n\t\t\t2408:840d:3800::/42,\n\t\t\t2408:840d:3840::/43,\n\t\t\t2408:840d:3a00::/42,\n\t\t\t2408:840d:4e00::/42,\n\t\t\t2408:840d:5000::/42,\n\t\t\t2408:840d:5200::/42,\n\t\t\t2408:840d:5240::/43,\n\t\t\t2408:840d:5400::/42,\n\t\t\t2408:840d:5b00::/42,\n\t\t\t2408:840d:5d00::/42,\n\t\t\t2408:840d:5f00::/42,\n\t\t\t2408:840d:5f40::/43,\n\t\t\t2408:840d:6100::/42,\n\t\t\t2408:840d:6800::/42,\n\t\t\t2408:840d:6a00::/42,\n\t\t\t2408:840d:6c00::/42,\n\t\t\t2408:840d:6c40::/43,\n\t\t\t2408:840d:6e00::/42,\n\t\t\t2408:840d:7500::/42,\n\t\t\t2408:840d:7700::/42,\n\t\t\t2408:840d:7900::/42,\n\t\t\t2408:840d:7940::/43,\n\t\t\t2408:840d:7b00::/42,\n\t\t\t2408:840d:8200::/42,\n\t\t\t2408:840d:8400::/42,\n\t\t\t2408:840d:8600::/42,\n\t\t\t2408:840d:8640::/43,\n\t\t\t2408:840d:8800::/42,\n\t\t\t2408:840d:8f00::/42,\n\t\t\t2408:840d:9100::/42,\n\t\t\t2408:840d:9300::/42,\n\t\t\t2408:840d:9340::/43,\n\t\t\t2408:840d:9500::/42,\n\t\t\t2408:840d:9c00::/42,\n\t\t\t2408:840d:9e00::/42,\n\t\t\t2408:840d:a000::/42,\n\t\t\t2408:840d:a040::/43,\n\t\t\t2408:840d:a200::/42,\n\t\t\t2408:840d:a900::/42,\n\t\t\t2408:840d:ab00::/42,\n\t\t\t2408:840d:ad00::/42,\n\t\t\t2408:840d:ad40::/43,\n\t\t\t2408:840d:af00::/42,\n\t\t\t2408:840d:b600::/42,\n\t\t\t2408:840d:b800::/42,\n\t\t\t2408:840d:ba00::/42,\n\t\t\t2408:840d:ba40::/43,\n\t\t\t2408:840d:bc00::/42,\n\t\t\t2408:840d:c300::/42,\n\t\t\t2408:840d:c500::/42,\n\t\t\t2408:840d:c700::/42,\n\t\t\t2408:840d:c740::/43,\n\t\t\t2408:840d:c900::/42,\n\t\t\t2408:840d:d000::/42,\n\t\t\t2408:840d:d200::/42,\n\t\t\t2408:840d:d400::/42,\n\t\t\t2408:840d:d440::/43,\n\t\t\t2408:840d:d600::/42,\n\t\t\t2408:840d:dd00::/42,\n\t\t\t2408:840d:de00::/42,\n\t\t\t2408:840e:dd00::/40,\n\t\t\t2408:840e:de00::/40,\n\t\t\t2408:840f:1e0::/46,\n\t\t\t2408:840f:1e4::/47,\n\t\t\t2408:8410::/30,\n\t\t\t2408:8414::/31,\n\t\t\t2408:8417::/32,\n\t\t\t2408:8418::/32,\n\t\t\t2408:841a::/31,\n\t\t\t2408:841c::/31,\n\t\t\t2408:841e::/32,\n\t\t\t2408:8420::/31,\n\t\t\t2408:8422::/32,\n\t\t\t2408:8426::/31,\n\t\t\t2408:842a::/31,\n\t\t\t2408:842c::/32,\n\t\t\t2408:842e::/32,\n\t\t\t2408:8430::/31,\n\t\t\t2408:8434::/30,\n\t\t\t2408:8438::/31,\n\t\t\t2408:843c::/30,\n\t\t\t2408:8440::/31,\n\t\t\t2408:8444::/30,\n\t\t\t2408:8448::/32,\n\t\t\t2408:844b::/32,\n\t\t\t2408:844c::/30,\n\t\t\t2408:8452::/31,\n\t\t\t2408:8454::/32,\n\t\t\t2408:8456::/31,\n\t\t\t2408:8458::/30,\n\t\t\t2408:845c::/31,\n\t\t\t2408:8460::/30,\n\t\t\t2408:8464::/31,\n\t\t\t2408:8466::/32,\n\t\t\t2408:8469::/32,\n\t\t\t2408:846a::/31,\n\t\t\t2408:846c::/30,\n\t\t\t2408:8470::/31,\n\t\t\t2408:8474::/30,\n\t\t\t2408:8478::/31,\n\t\t\t2408:847a::/32,\n\t\t\t2408:84e1::/32,\n\t\t\t2408:84e2::/31,\n\t\t\t2408:84e4::/30,\n\t\t\t2408:84e9::/32,\n\t\t\t2408:84eb::/32,\n\t\t\t2408:84ec::/30,\n\t\t\t2408:84f0::/28,\n\t\t\t2408:856c::/31,\n\t\t\t2408:8606::/31,\n\t\t\t2408:8608::/29,\n\t\t\t2408:8610::/30,\n\t\t\t2408:8614::/31,\n\t\t\t2408:861a::/31,\n\t\t\t2408:861c::/32,\n\t\t\t2408:8620::/31,\n\t\t\t2408:8624::/31,\n\t\t\t2408:8626::/32,\n\t\t\t2408:862a::/31,\n\t\t\t2408:862d::/32,\n\t\t\t2408:862e::/31,\n\t\t\t2408:8630::/29,\n\t\t\t2408:8638::/31,\n\t\t\t2408:863c::/31,\n\t\t\t2408:8640::/32,\n\t\t\t2408:8642::/32,\n\t\t\t2408:8644::/30,\n\t\t\t2408:8648::/31,\n\t\t\t2408:864c::/32,\n\t\t\t2408:864e::/31,\n\t\t\t2408:8650::/30,\n\t\t\t2408:8656::/31,\n\t\t\t2408:8658::/30,\n\t\t\t2408:865c::/31,\n\t\t\t2408:865f::/32,\n\t\t\t2408:8660::/32,\n\t\t\t2408:8662::/31,\n\t\t\t2408:8664::/31,\n\t\t\t2408:8666::/32,\n\t\t\t2408:866a::/31,\n\t\t\t2408:866c::/30,\n\t\t\t2408:8670::/32,\n\t\t\t2408:8674::/30,\n\t\t\t2408:8678::/31,\n\t\t\t2408:867a::/32,\n\t\t\t2408:8706::/31,\n\t\t\t2408:8708::/29,\n\t\t\t2408:8710::/30,\n\t\t\t2408:8719::/32,\n\t\t\t2408:871a::/31,\n\t\t\t2408:8720::/30,\n\t\t\t2408:8726::/32,\n\t\t\t2408:872b::/32,\n\t\t\t2408:872f::/32,\n\t\t\t2408:8730::/30,\n\t\t\t2408:8734::/31,\n\t\t\t2408:8736::/32,\n\t\t\t2408:8738::/32,\n\t\t\t2408:873c::/31,\n\t\t\t2408:8740::/32,\n\t\t\t2408:8742::/32,\n\t\t\t2408:8744::/30,\n\t\t\t2408:8748::/29,\n\t\t\t2408:8752::/32,\n\t\t\t2408:8756::/31,\n\t\t\t2408:8758::/30,\n\t\t\t2408:875c::/32,\n\t\t\t2408:8760::/32,\n\t\t\t2408:8762::/31,\n\t\t\t2408:8764::/31,\n\t\t\t2408:8766::/32,\n\t\t\t2408:8768::/32,\n\t\t\t2408:876a::/32,\n\t\t\t2408:876c::/30,\n\t\t\t2408:8770::/32,\n\t\t\t2408:8772::/31,\n\t\t\t2408:8774::/32,\n\t\t\t2408:8776::/31,\n\t\t\t2408:8778::/31,\n\t\t\t2408:877a::/32,\n\t\t\t2408:877c::/30,\n\t\t\t2408:8806::/42,\n\t\t\t2408:8806:40::/43,\n\t\t\t2408:880c::/30,\n\t\t\t2408:8810::/30,\n\t\t\t2408:8814::/31,\n\t\t\t2408:8818::/31,\n\t\t\t2408:882c::/32,\n\t\t\t2408:883a::/32,\n\t\t\t2408:8844::/43,\n\t\t\t2408:8856::/31,\n\t\t\t2408:8858::/30,\n\t\t\t2408:8862::/31,\n\t\t\t2408:8864::/31,\n\t\t\t2408:8866::/32,\n\t\t\t2408:886e::/31,\n\t\t\t2408:8872::/32,\n\t\t\t2408:8878::/31,\n\t\t\t2408:887e::/32,\n\t\t\t2408:8906:20::/44,\n\t\t\t2408:8907:9000::/44,\n\t\t\t2408:890c::/31,\n\t\t\t2408:8912::/31,\n\t\t\t2408:8914::/30,\n\t\t\t2408:891c::/32,\n\t\t\t2408:8920::/32,\n\t\t\t2408:8924::/32,\n\t\t\t2408:892c::/32,\n\t\t\t2408:8936::/32,\n\t\t\t2408:893a::/32,\n\t\t\t2408:8940::/32,\n\t\t\t2408:8948::/32,\n\t\t\t2408:894c::/32,\n\t\t\t2408:894e::/32,\n\t\t\t2408:8956::/31,\n\t\t\t2408:8958::/30,\n\t\t\t2408:8962::/31,\n\t\t\t2408:8964::/31,\n\t\t\t2408:8966::/32,\n\t\t\t2408:896c::/32,\n\t\t\t2408:896e::/31,\n\t\t\t2408:8972::/32,\n\t\t\t2408:8978::/30,\n\t\t\t2408:897e::/32,\n\t\t\t2408:8a00:c000::/36,\n\t\t\t2408:8a00:d000::/37,\n\t\t\t2408:8a00:e000::/35,\n\t\t\t2408:8a01::/36,\n\t\t\t2408:8a02:b110::/44,\n\t\t\t2408:8a02:b120::/44,\n\t\t\t2408:8a04:8000::/36,\n\t\t\t2408:8a04:e000::/40,\n\t\t\t2408:8a05:6000::/35,\n\t\t\t2408:8a05:8000::/36,\n\t\t\t2408:8a06::/47,\n\t\t\t2408:8a06:100::/47,\n\t\t\t2408:8a21:4000::/35,\n\t\t\t2408:8a22:9200::/39,\n\t\t\t2408:8a22:9400::/38,\n\t\t\t2408:8a22:9800::/40,\n\t\t\t2408:8a22:9a00::/39,\n\t\t\t2408:8a22:9c00::/38,\n\t\t\t2408:8a22:a000::/37,\n\t\t\t2408:8a23:4000::/34,\n\t\t\t2408:8a24:4000::/34,\n\t\t\t2408:8a26:c000::/34,\n\t\t\t2408:8a27:4000::/35,\n\t\t\t2409:2000::/31,\n\t\t\t2409:2002::/32,\n\t\t\t2409:2003::/47,\n\t\t\t2409:27fa::/48,\n\t\t\t2409:27fa:f000::/48,\n\t\t\t2409:27fb::/48,\n\t\t\t2409:27fc::/48,\n\t\t\t2409:27fe::/33,\n\t\t\t2409:8000::/20,\n\t\t\t240a:2000::/40,\n\t\t\t240a:2001:100::/40,\n\t\t\t240a:2001:1000::/36,\n\t\t\t240a:4002:1b00::/40,\n\t\t\t240a:4010:8000::/33,\n\t\t\t240a:4020:83a::/48,\n\t\t\t240a:4020:883a::/48,\n\t\t\t240a:4021:83a::/48,\n\t\t\t240a:4021:883a::/48,\n\t\t\t240a:4080:8000::/35,\n\t\t\t240a:4084:2000::/35,\n\t\t\t240a:4088:a000::/35,\n\t\t\t240a:408c:2000::/35,\n\t\t\t240a:4090:50::/48,\n\t\t\t240a:4090:120::/48,\n\t\t\t240a:4090:250::/48,\n\t\t\t240a:4090:1000::/39,\n\t\t\t240a:4090:1200::/40,\n\t\t\t240a:4090:2010::/48,\n\t\t\t240a:4090:2041::/48,\n\t\t\t240a:4090:2061::/48,\n\t\t\t240a:4090:3000::/39,\n\t\t\t240a:4090:3200::/40,\n\t\t\t240a:4090:5000::/39,\n\t\t\t240a:4090:5200::/40,\n\t\t\t240a:4090:7000::/39,\n\t\t\t240a:4090:7200::/40,\n\t\t\t240a:4090:8000::/35,\n\t\t\t240a:4093::/35,\n\t\t\t240a:4094:2000::/35,\n\t\t\t240a:409c:2000::/35,\n\t\t\t240a:40a4:2000::/35,\n\t\t\t240a:40a8:8000::/35,\n\t\t\t240a:40ac:2000::/35,\n\t\t\t240a:40b0:83a::/48,\n\t\t\t240a:40b0:283a::/48,\n\t\t\t240a:40b0:483a::/48,\n\t\t\t240a:40b0:683a::/48,\n\t\t\t240a:40c0:8000::/43,\n\t\t\t240a:40c0:8200::/48,\n\t\t\t240a:40c0:8240::/48,\n\t\t\t240a:40c0:a000::/43,\n\t\t\t240a:40c0:c000::/43,\n\t\t\t240a:40c0:e000::/43,\n\t\t\t240a:40c1::/43,\n\t\t\t240a:40c1:2000::/43,\n\t\t\t240a:40c1:4000::/43,\n\t\t\t240a:40c1:6000::/43,\n\t\t\t240a:40c1:8000::/43,\n\t\t\t240a:40c1:a000::/43,\n\t\t\t240a:40c1:c000::/43,\n\t\t\t240a:40c1:e000::/43,\n\t\t\t240a:40c2::/43,\n\t\t\t240a:40c2:2000::/43,\n\t\t\t240a:40c2:4000::/43,\n\t\t\t240a:40c2:6000::/43,\n\t\t\t240a:40c2:8000::/43,\n\t\t\t240a:40c2:a000::/43,\n\t\t\t240a:40c2:c000::/43,\n\t\t\t240a:40c2:e000::/43,\n\t\t\t240a:40c3::/43,\n\t\t\t240a:40c3:2000::/43,\n\t\t\t240a:40c3:4000::/43,\n\t\t\t240a:40c3:6000::/43,\n\t\t\t240a:40c3:8000::/43,\n\t\t\t240a:40c3:a000::/43,\n\t\t\t240a:40c3:c000::/43,\n\t\t\t240a:40c3:c200::/48,\n\t\t\t240a:40c3:c240::/48,\n\t\t\t240a:40c3:e000::/43,\n\t\t\t240a:40c4::/43,\n\t\t\t240a:40c4:2000::/43,\n\t\t\t240a:40c4:4000::/43,\n\t\t\t240a:4172::/31,\n\t\t\t240a:4180::/31,\n\t\t\t240a:41b0::/34,\n\t\t\t240a:41b8:8800::/40,\n\t\t\t240a:41b8:a000::/40,\n\t\t\t240a:41b8:d400::/40,\n\t\t\t240a:41b8:e400::/40,\n\t\t\t240a:41d6::/31,\n\t\t\t240a:41f2::/31,\n\t\t\t240a:4208::/30,\n\t\t\t240a:4224:9000::/44,\n\t\t\t240a:4224:a000::/44,\n\t\t\t240a:4224:c000::/44,\n\t\t\t240a:4224:d000::/44,\n\t\t\t240a:4224:e000::/44,\n\t\t\t240a:4225:1000::/44,\n\t\t\t240a:4230::/31,\n\t\t\t240a:4242::/31,\n\t\t\t240a:4280::/26,\n\t\t\t240a:42c0::/27,\n\t\t\t240a:42e0::/28,\n\t\t\t240a:42f0::/29,\n\t\t\t240a:42f8::/30,\n\t\t\t240a:6001::/48,\n\t\t\t240a:a000::/20,\n\t\t\t240a:c000::/20,\n\t\t\t240b:e001::/32,\n\t\t\t240b:e002::/31,\n\t\t\t240b:e004::/30,\n\t\t\t240b:e008::/29,\n\t\t\t240b:e010::/32,\n\t\t\t240c:6::/47,\n\t\t\t240c:6:3::/48,\n\t\t\t240c:f:1::/48,\n\t\t\t240c:4000::/22,\n\t\t\t240c:c000::/20,\n\t\t\t240d:4000::/21,\n\t\t\t240e::/21,\n\t\t\t240e:800::/24,\n\t\t\t240e:900::/26,\n\t\t\t240e:940::/27,\n\t\t\t240e:960::/28,\n\t\t\t240e:970::/29,\n\t\t\t240e:978::/30,\n\t\t\t240e:97c::/32,\n\t\t\t240e:97d::/33,\n\t\t\t240e:97d:8001::/48,\n\t\t\t240e:97d:8002::/47,\n\t\t\t240e:97d:8004::/46,\n\t\t\t240e:97d:8008::/45,\n\t\t\t240e:97d:8010::/44,\n\t\t\t240e:97d:8020::/43,\n\t\t\t240e:97d:8040::/42,\n\t\t\t240e:97d:8080::/41,\n\t\t\t240e:97d:8100::/40,\n\t\t\t240e:97d:8200::/39,\n\t\t\t240e:97d:8400::/38,\n\t\t\t240e:97d:8800::/37,\n\t\t\t240e:97d:9000::/36,\n\t\t\t240e:97d:a000::/35,\n\t\t\t240e:97d:c000::/34,\n\t\t\t240e:97e::/31,\n\t\t\t240e:980::/25,\n\t\t\t240e:a00::/23,\n\t\t\t240e:c00::/22,\n\t\t\t2602:2e0:ff::/48,\n\t\t\t2602:814:f008::/48,\n\t\t\t2602:f46d:6::/48,\n\t\t\t2602:f486:fe::/48,\n\t\t\t2602:f612::/40,\n\t\t\t2602:f7ee:ee::/48,\n\t\t\t2602:f92a:124::/48,\n\t\t\t2602:f92a:1314::/48,\n\t\t\t2602:f92a:a46d::/48,\n\t\t\t2602:f92a:a46f::/48,\n\t\t\t2602:f92a:a470::/48,\n\t\t\t2602:f92a:a473::/48,\n\t\t\t2602:f92a:dead::/48,\n\t\t\t2602:f93b:c00::/39,\n\t\t\t2602:f93b:e00::/40,\n\t\t\t2602:f93b:f00::/43,\n\t\t\t2602:f93b:f20::/44,\n\t\t\t2602:f93b:f30::/48,\n\t\t\t2602:f93b:f32::/47,\n\t\t\t2602:f93b:f34::/46,\n\t\t\t2602:f93b:f38::/45,\n\t\t\t2602:f93b:f40::/48,\n\t\t\t2602:f93b:f42::/47,\n\t\t\t2602:f93b:f44::/46,\n\t\t\t2602:f93b:f48::/45,\n\t\t\t2602:f93b:f50::/44,\n\t\t\t2602:f93b:f60::/43,\n\t\t\t2602:f93b:f80::/41,\n\t\t\t2602:f9ba:a8::/48,\n\t\t\t2602:f9ba:10c::/48,\n\t\t\t2602:fab0:11::/48,\n\t\t\t2602:feda:1bf::/48,\n\t\t\t2602:feda:1d1::/48,\n\t\t\t2602:feda:1df::/48,\n\t\t\t2602:feda:2d0::/44,\n\t\t\t2602:feda:2f0::/44,\n\t\t\t2605:9d80:8001::/48,\n\t\t\t2605:9d80:8011::/48,\n\t\t\t2605:9d80:8021::/48,\n\t\t\t2605:9d80:8031::/48,\n\t\t\t2605:9d80:8041::/48,\n\t\t\t2605:9d80:9003::/48,\n\t\t\t2605:9d80:9013::/48,\n\t\t\t2605:9d80:9023::/48,\n\t\t\t2605:9d80:9033::/48,\n\t\t\t2605:9d80:9042::/48,\n\t\t\t2605:9d80:9071::/48,\n\t\t\t2605:9d80:9092::/48,\n\t\t\t2804:1e48:9001::/48,\n\t\t\t2804:1e48:9002::/48,\n\t\t\t2a00:8a05::/44,\n\t\t\t2a01:e281:aafa::/47,\n\t\t\t2a01:e281:aafc::/46,\n\t\t\t2a01:f100:1f8::/48,\n\t\t\t2a03:5345::/44,\n\t\t\t2a04:3e00:1002::/48,\n\t\t\t2a04:f580:8010::/47,\n\t\t\t2a04:f580:8090::/48,\n\t\t\t2a04:f580:8210::/47,\n\t\t\t2a04:f580:8290::/48,\n\t\t\t2a04:f580:9010::/48,\n\t\t\t2a04:f580:9012::/47,\n\t\t\t2a04:f580:9020::/48,\n\t\t\t2a04:f580:9030::/48,\n\t\t\t2a04:f580:9040::/48,\n\t\t\t2a04:f580:9050::/48,\n\t\t\t2a04:f580:9060::/48,\n\t\t\t2a04:f580:9070::/48,\n\t\t\t2a04:f580:9080::/48,\n\t\t\t2a04:f580:9210::/48,\n\t\t\t2a04:f580:9212::/47,\n\t\t\t2a04:f580:9220::/48,\n\t\t\t2a04:f580:9230::/48,\n\t\t\t2a04:f580:9240::/48,\n\t\t\t2a04:f580:9250::/48,\n\t\t\t2a04:f580:9260::/48,\n\t\t\t2a04:f580:9270::/48,\n\t\t\t2a04:f580:9280::/48,\n\t\t\t2a04:f580:9290::/48,\n\t\t\t2a05:1087::/32,\n\t\t\t2a05:4140:307::/48,\n\t\t\t2a05:dfc3:ff00::/40,\n\t\t\t2a06:1281:8000::/36,\n\t\t\t2a06:3600:e000::/40,\n\t\t\t2a06:3600:fb00::/40,\n\t\t\t2a06:3600:fc00::/38,\n\t\t\t2a06:3604::/30,\n\t\t\t2a06:9801:20::/48,\n\t\t\t2a06:9f81:4600::/43,\n\t\t\t2a06:9f81:4620::/44,\n\t\t\t2a06:9f81:4640::/43,\n\t\t\t2a06:a005:260::/43,\n\t\t\t2a06:a005:280::/43,\n\t\t\t2a06:a005:2a0::/44,\n\t\t\t2a06:a005:4b2::/48,\n\t\t\t2a06:a005:8d0::/44,\n\t\t\t2a06:a005:a13::/48,\n\t\t\t2a06:a005:1c40::/44,\n\t\t\t2a06:a005:2950::/44,\n\t\t\t2a09:54c4::/32,\n\t\t\t2a09:54c6:d000::/47,\n\t\t\t2a09:54c6:e000::/36,\n\t\t\t2a09:b280:ff81::/48,\n\t\t\t2a09:b280:ff83::/48,\n\t\t\t2a09:b280:ff84::/47,\n\t\t\t2a0a:2840::/30,\n\t\t\t2a0a:2845:aab8::/46,\n\t\t\t2a0a:2845:d647::/48,\n\t\t\t2a0a:2846::/48,\n\t\t\t2a0a:6040:ec00::/40,\n\t\t\t2a0a:6044:6600::/39,\n\t\t\t2a0a:6044:7a00::/40,\n\t\t\t2a0a:d681:e000::/40,\n\t\t\t2a0a:d681:fb00::/40,\n\t\t\t2a0a:d681:fc00::/38,\n\t\t\t2a0b:2542::/48,\n\t\t\t2a0b:4e07:b8::/47,\n\t\t\t2a0c:9a40:89c0::/48,\n\t\t\t2a0c:9a40:8fc1::/48,\n\t\t\t2a0c:9a40:8fc2::/47,\n\t\t\t2a0c:9a40:8fc4::/48,\n\t\t\t2a0c:b641:571::/48,\n\t\t\t2a0c:b641:722::/47,\n\t\t\t2a0c:b641:9e0::/47,\n\t\t\t2a0d:2580:1886::/48,\n\t\t\t2a0d:2587:7fdb::/48,\n\t\t\t2a0e:46c4:2902::/48,\n\t\t\t2a0e:97c0:5ef::/48,\n\t\t\t2a0e:9b00::/29,\n\t\t\t2a0e:aa01:1fff::/48,\n\t\t\t2a0e:aa06::/40,\n\t\t\t2a0e:aa06:440::/48,\n\t\t\t2a0e:aa06:490::/44,\n\t\t\t2a0e:aa06:4e0::/44,\n\t\t\t2a0e:aa06:500::/47,\n\t\t\t2a0e:aa06:504::/46,\n\t\t\t2a0e:aa06:508::/45,\n\t\t\t2a0e:aa06:520::/48,\n\t\t\t2a0e:aa06:525::/48,\n\t\t\t2a0e:aa06:541::/48,\n\t\t\t2a0e:aa06:56a::/48,\n\t\t\t2a0e:aa07:e01a::/47,\n\t\t\t2a0e:aa07:e021::/48,\n\t\t\t2a0e:aa07:e025::/48,\n\t\t\t2a0e:aa07:e030::/48,\n\t\t\t2a0e:aa07:e035::/48,\n\t\t\t2a0e:aa07:e039::/48,\n\t\t\t2a0e:aa07:e0e0::/44,\n\t\t\t2a0e:aa07:e151::/48,\n\t\t\t2a0e:aa07:e155::/48,\n\t\t\t2a0e:aa07:e15f::/48,\n\t\t\t2a0e:aa07:e160::/47,\n\t\t\t2a0e:aa07:e162::/48,\n\t\t\t2a0e:aa07:e16a::/48,\n\t\t\t2a0e:aa07:e1a0::/44,\n\t\t\t2a0e:aa07:e200::/44,\n\t\t\t2a0e:aa07:e210::/48,\n\t\t\t2a0e:aa07:e21c::/47,\n\t\t\t2a0e:aa07:e220::/44,\n\t\t\t2a0e:aa07:e280::/45,\n\t\t\t2a0e:aa07:e288::/46,\n\t\t\t2a0e:aa07:e28c::/48,\n\t\t\t2a0e:aa07:e28e::/48,\n\t\t\t2a0e:aa07:f0d0::/46,\n\t\t\t2a0e:aa07:f0d4::/47,\n\t\t\t2a0e:aa07:f0d8::/48,\n\t\t\t2a0e:aa07:f0de::/47,\n\t\t\t2a0e:b107:12b::/48,\n\t\t\t2a0e:b107:272::/48,\n\t\t\t2a0e:b107:740::/44,\n\t\t\t2a0e:b107:c10::/48,\n\t\t\t2a0e:b107:da0::/44,\n\t\t\t2a0e:b107:14a0::/44,\n\t\t\t2a0e:b107:178d::/48,\n\t\t\t2a0e:b107:178e::/48,\n\t\t\t2a0f:1cc5:10::/46,\n\t\t\t2a0f:1cc5:14::/47,\n\t\t\t2a0f:1cc5:20::/44,\n\t\t\t2a0f:1cc5:110::/44,\n\t\t\t2a0f:1cc5:130::/44,\n\t\t\t2a0f:1cc5:140::/44,\n\t\t\t2a0f:1cc5:600::/47,\n\t\t\t2a0f:1cc5:603::/48,\n\t\t\t2a0f:1cc5:645::/48,\n\t\t\t2a0f:1cc5:661::/48,\n\t\t\t2a0f:1cc5:662::/48,\n\t\t\t2a0f:1cc5:690::/48,\n\t\t\t2a0f:1cc5:6a0::/48,\n\t\t\t2a0f:1cc5:900::/40,\n\t\t\t2a0f:1cc5:e50::/44,\n\t\t\t2a0f:1cc5:ef5::/48,\n\t\t\t2a0f:1cc5:f00::/46,\n\t\t\t2a0f:1cc5:f04::/47,\n\t\t\t2a0f:1cc5:f06::/48,\n\t\t\t2a0f:1cc5:f08::/47,\n\t\t\t2a0f:1cc5:fff::/48,\n\t\t\t2a0f:1cc5:1310::/44,\n\t\t\t2a0f:1cc5:1400::/48,\n\t\t\t2a0f:1cc5:1c00::/47,\n\t\t\t2a0f:1cc5:1c02::/48,\n\t\t\t2a0f:1cc5:1c30::/48,\n\t\t\t2a0f:1cc5:1cc0::/48,\n\t\t\t2a0f:1cc5:1d10::/47,\n\t\t\t2a0f:1cc5:1d14::/47,\n\t\t\t2a0f:1cc5:2600::/42,\n\t\t\t2a0f:1cc5:2640::/43,\n\t\t\t2a0f:1cc5:2d01::/48,\n\t\t\t2a0f:1cc5:2d03::/48,\n\t\t\t2a0f:1cc5:2e01::/48,\n\t\t\t2a0f:1cc5:2e02::/48,\n\t\t\t2a0f:1cc6:b110::/47,\n\t\t\t2a0f:1cc6:b120::/48,\n\t\t\t2a0f:1cc6:bab4::/48,\n\t\t\t2a0f:1cc6:bab9::/48,\n\t\t\t2a0f:2706::/32,\n\t\t\t2a0f:6282:2000::/35,\n\t\t\t2a0f:6284:51::/48,\n\t\t\t2a0f:6284:300::/40,\n\t\t\t2a0f:6284:400::/42,\n\t\t\t2a0f:6284:440::/43,\n\t\t\t2a0f:6284:3000::/39,\n\t\t\t2a0f:6284:4c00::/44,\n\t\t\t2a0f:6284:4c20::/44,\n\t\t\t2a0f:6284:4c30::/48,\n\t\t\t2a0f:6284:4c40::/43,\n\t\t\t2a0f:6284:4c60::/44,\n\t\t\t2a0f:6284:4c80::/43,\n\t\t\t2a0f:6284:4ca0::/44,\n\t\t\t2a0f:6284:4cd0::/44,\n\t\t\t2a0f:6284:4f00::/40,\n\t\t\t2a0f:6284:e000::/35,\n\t\t\t2a0f:7803:e300::/40,\n\t\t\t2a0f:7803:f680::/44,\n\t\t\t2a0f:7803:fa21::/48,\n\t\t\t2a0f:7803:fa22::/47,\n\t\t\t2a0f:7803:fa24::/46,\n\t\t\t2a0f:7803:faf3::/48,\n\t\t\t2a0f:7803:fe45::/48,\n\t\t\t2a0f:7803:fe81::/48,\n\t\t\t2a0f:7803:fe82::/48,\n\t\t\t2a0f:7804:f650::/44,\n\t\t\t2a0f:7804:f9f0::/44,\n\t\t\t2a0f:85c1:ba5::/48,\n\t\t\t2a0f:85c1:bfe::/48,\n\t\t\t2a0f:85c1:ce1::/48,\n\t\t\t2a0f:85c1:cf1::/48,\n\t\t\t2a0f:85c1:d90::/48,\n\t\t\t2a0f:9400:6110::/48,\n\t\t\t2a0f:9400:7700::/48,\n\t\t\t2a0f:9400:8015::/48,\n\t\t\t2a12:cb46::/36,\n\t\t\t2a13:1800::/48,\n\t\t\t2a13:1800:10::/48,\n\t\t\t2a13:1800:80::/44,\n\t\t\t2a13:1800:300::/44,\n\t\t\t2a13:1801:180::/43,\n\t\t\t2a13:a5c0:500::/40,\n\t\t\t2a13:a5c3:ff21::/48,\n\t\t\t2a13:a5c3:ff50::/44,\n\t\t\t2a13:a5c7:1800::/40,\n\t\t\t2a13:a5c7:2121::/48,\n\t\t\t2a13:a5c7:2302::/47,\n\t\t\t2a13:a5c7:2306::/48,\n\t\t\t2a13:a5c7:23c0::/48,\n\t\t\t2a13:a5c7:2801::/48,\n\t\t\t2a13:a5c7:3100::/40,\n\t\t\t2a13:a5c7:3301::/48,\n\t\t\t2a13:a5c7:3302::/48,\n\t\t\t2a13:a5c7:3304::/48,\n\t\t\t2a13:a5c7:3306::/47,\n\t\t\t2a13:aac4:f000::/44,\n\t\t\t2a14:7c0:5103::/48,\n\t\t\t2a14:4c41::/32,\n\t\t\t2a14:67c1:70::/47,\n\t\t\t2a14:67c1:73::/48,\n\t\t\t2a14:67c1:74::/48,\n\t\t\t2a14:67c1:7f::/48,\n\t\t\t2a14:67c1:702::/47,\n\t\t\t2a14:67c1:900::/48,\n\t\t\t2a14:67c1:8000::/36,\n\t\t\t2a14:67c1:a020::/48,\n\t\t\t2a14:67c1:a023::/48,\n\t\t\t2a14:67c1:a024::/48,\n\t\t\t2a14:67c1:a02f::/48,\n\t\t\t2a14:67c1:a040::/47,\n\t\t\t2a14:67c1:a100::/43,\n\t\t\t2a14:67c1:a123::/48,\n\t\t\t2a14:67c1:a125::/48,\n\t\t\t2a14:67c1:a128::/48,\n\t\t\t2a14:67c1:a144::/48,\n\t\t\t2a14:67c1:a150::/44,\n\t\t\t2a14:67c1:b000::/48,\n\t\t\t2a14:67c1:b065::/48,\n\t\t\t2a14:67c1:b066::/48,\n\t\t\t2a14:67c1:b068::/47,\n\t\t\t2a14:67c1:b100::/46,\n\t\t\t2a14:67c1:b105::/48,\n\t\t\t2a14:67c1:b107::/48,\n\t\t\t2a14:67c1:b110::/48,\n\t\t\t2a14:67c1:b130::/46,\n\t\t\t2a14:67c1:b134::/48,\n\t\t\t2a14:67c1:b136::/48,\n\t\t\t2a14:67c1:b140::/46,\n\t\t\t2a14:67c1:b146::/48,\n\t\t\t2a14:67c1:b500::/47,\n\t\t\t2a14:67c1:b511::/48,\n\t\t\t2a14:67c1:b514::/48,\n\t\t\t2a14:67c1:b530::/44,\n\t\t\t2a14:67c1:b561::/48,\n\t\t\t2a14:67c1:b563::/48,\n\t\t\t2a14:67c1:b578::/48,\n\t\t\t2a14:67c1:b582::/48,\n\t\t\t2a14:67c1:b586::/47,\n\t\t\t2a14:67c1:b588::/47,\n\t\t\t2a14:67c1:b590::/48,\n\t\t\t2a14:67c1:b599::/48,\n\t\t\t2a14:67c1:b5e0::/44,\n\t\t\t2a14:67c1:c300::/40,\n\t\t\t2a14:67c1:c600::/40,\n\t\t\t2a14:67c2:800::/40,\n\t\t\t2a14:67c3:30::/44,\n\t\t\t2a14:67c3:c0::/48,\n\t\t\t2a14:67c3:d0::/44,\n\t\t\t2a14:67c3:360::/47,\n\t\t\t2a14:67c3:362::/48,\n\t\t\t2a14:67c3:520::/44,\n\t\t\t2a14:67c3:888::/48,\n\t\t\t2a14:67c3:9990::/44,\n\t\t\t2a14:67c3:e622::/48,\n\t\t\t2a14:7580:71f::/48,\n\t\t\t2a14:7580:730::/44,\n\t\t\t2a14:7580:740::/44,\n\t\t\t2a14:7580:777::/48,\n\t\t\t2a14:7580:ce0::/48,\n\t\t\t2a14:7580:d000::/37,\n\t\t\t2a14:7580:d800::/39,\n\t\t\t2a14:7580:df00::/40,\n\t\t\t2a14:7580:fe00::/40,\n\t\t\t2a14:7580:ffe4::/48,\n\t\t\t2a14:7580:fff4::/48,\n\t\t\t2a14:7580:fff7::/48,\n\t\t\t2a14:7580:fffa::/48,\n\t\t\t2a14:7581:b12::/47,\n\t\t\t2a14:7581:b14::/48,\n\t\t\t2a14:7581:b20::/46,\n\t\t\t2a14:7581:b40::/45,\n\t\t\t2a14:7581:b60::/44,\n\t\t\t2a14:7581:bbb::/48,\n\t\t\t2a14:7581:bcd::/48,\n\t\t\t2a14:7581:bff::/48,\n\t\t\t2a14:7581:fe6::/48,\n\t\t\t2a14:7581:ffb::/48,\n\t\t\t2a14:7581:3011::/48,\n\t\t\t2a14:7581:30b6::/48,\n\t\t\t2a14:7581:3100::/40,\n\t\t\t2a14:7583:e0e0::/48,\n\t\t\t2a14:7583:f224::/47,\n\t\t\t2a14:7583:f228::/48,\n\t\t\t2a14:7583:f22c::/48,\n\t\t\t2a14:7583:f244::/48,\n\t\t\t2a14:7583:f264::/48,\n\t\t\t2a14:7583:f268::/48,\n\t\t\t2a14:7583:f300::/46,\n\t\t\t2a14:7583:f304::/47,\n\t\t\t2a14:7583:f306::/48,\n\t\t\t2a14:7583:f4f0::/47,\n\t\t\t2a14:7583:f4f4::/48,\n\t\t\t2a14:7583:f4fe::/48,\n\t\t\t2a14:7583:f500::/48,\n\t\t\t2a14:7583:f701::/48,\n\t\t\t2a14:7583:f703::/48,\n\t\t\t2a14:7583:f704::/46,\n\t\t\t2a14:7583:f708::/46,\n\t\t\t2a14:7583:f743::/48,\n\t\t\t2a14:7583:f744::/48,\n\t\t\t2a14:7583:f764::/48,\n\t\t\t2a14:7586:6100::/45,\n\t\t\t2a14:7586:6108::/48,\n\t\t\t2a14:7586:6110::/48,\n\t\t\t2a14:7dc0:510::/47,\n\t\t\t2a14:7dc0:515::/48,\n\t\t\t2a14:7dc0:516::/47,\n\t\t\t2a14:7dc0:520::/48,\n\t\t\t2a14:7dc0:52f::/48,\n\t\t\t2a14:c380:328::/48,\n\t\t\t2c0f:f7a8:8011::/48,\n\t\t\t2c0f:f7a8:8050::/48,\n\t\t\t2c0f:f7a8:805f::/48,\n\t\t\t2c0f:f7a8:8150::/48,\n\t\t\t2c0f:f7a8:815f::/48,\n\t\t\t2c0f:f7a8:8211::/48,\n\t\t\t2c0f:f7a8:9020::/48,\n\t\t\t2c0f:f7a8:9041::/48,\n\t\t\t2c0f:f7a8:9211::/48,\n\t\t\t2c0f:f7a8:9220::/48,\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-nikki/nikki/files/nftables/geoip_cn.nft",
    "content": "#!/usr/sbin/nft -f\n\ntable inet nikki {\n\tset china_ip {\n\t\ttype ipv4_addr\n\t\tflags interval\n\t\telements = {\n\t\t\t1.0.1.0/24,\n\t\t\t1.0.2.0/23,\n\t\t\t1.0.8.0/21,\n\t\t\t1.0.32.0/19,\n\t\t\t1.1.0.0/24,\n\t\t\t1.1.2.0/23,\n\t\t\t1.1.4.0/22,\n\t\t\t1.1.8.0/21,\n\t\t\t1.1.16.0/20,\n\t\t\t1.1.32.0/19,\n\t\t\t1.2.0.0/23,\n\t\t\t1.2.2.0/24,\n\t\t\t1.2.4.0/22,\n\t\t\t1.2.8.0/21,\n\t\t\t1.2.16.0/20,\n\t\t\t1.2.32.0/19,\n\t\t\t1.2.64.0/18,\n\t\t\t1.3.0.0/16,\n\t\t\t1.4.1.0/24,\n\t\t\t1.4.2.0/23,\n\t\t\t1.4.4.0/22,\n\t\t\t1.4.8.0/21,\n\t\t\t1.4.16.0/20,\n\t\t\t1.4.32.0/19,\n\t\t\t1.4.64.0/18,\n\t\t\t1.8.0.0/16,\n\t\t\t1.10.0.0/21,\n\t\t\t1.10.8.0/23,\n\t\t\t1.10.11.0/24,\n\t\t\t1.10.12.0/22,\n\t\t\t1.10.16.0/20,\n\t\t\t1.10.32.0/19,\n\t\t\t1.10.64.0/18,\n\t\t\t1.12.0.0/14,\n\t\t\t1.18.128.0/24,\n\t\t\t1.24.0.0/13,\n\t\t\t1.45.0.0/16,\n\t\t\t1.48.0.0/14,\n\t\t\t1.56.0.0/13,\n\t\t\t1.68.0.0/14,\n\t\t\t1.80.0.0/12,\n\t\t\t1.116.0.0/15,\n\t\t\t1.118.1.0/24,\n\t\t\t1.118.2.0/23,\n\t\t\t1.118.4.0/22,\n\t\t\t1.118.8.0/21,\n\t\t\t1.118.16.0/20,\n\t\t\t1.118.32.0/19,\n\t\t\t1.118.64.0/18,\n\t\t\t1.118.128.0/17,\n\t\t\t1.119.0.0/16,\n\t\t\t1.180.0.0/14,\n\t\t\t1.184.0.0/15,\n\t\t\t1.188.0.0/14,\n\t\t\t1.192.0.0/13,\n\t\t\t1.202.0.0/15,\n\t\t\t1.204.0.0/14,\n\t\t\t5.10.138.0/23,\n\t\t\t5.10.140.0/24,\n\t\t\t5.10.143.0/24,\n\t\t\t5.83.221.0/24,\n\t\t\t5.154.155.54/31,\n\t\t\t5.154.155.58/31,\n\t\t\t5.154.156.38/31,\n\t\t\t5.154.156.42/31,\n\t\t\t5.154.156.50/31,\n\t\t\t5.154.156.54/31,\n\t\t\t5.160.111.0/24,\n\t\t\t5.181.226.0/23,\n\t\t\t8.21.143.0/24,\n\t\t\t8.128.0.0/10,\n\t\t\t11.210.240.0/23,\n\t\t\t13.104.184.80/28,\n\t\t\t14.0.0.0/21,\n\t\t\t14.0.12.0/22,\n\t\t\t14.1.0.0/22,\n\t\t\t14.1.24.0/22,\n\t\t\t14.1.108.0/22,\n\t\t\t14.16.0.0/12,\n\t\t\t14.102.128.0/22,\n\t\t\t14.102.156.0/22,\n\t\t\t14.102.180.0/22,\n\t\t\t14.103.0.0/16,\n\t\t\t14.104.0.0/13,\n\t\t\t14.112.0.0/12,\n\t\t\t14.130.0.0/15,\n\t\t\t14.134.0.0/15,\n\t\t\t14.144.0.0/12,\n\t\t\t14.192.61.0/24,\n\t\t\t14.192.62.0/23,\n\t\t\t14.192.76.0/22,\n\t\t\t14.196.0.0/15,\n\t\t\t14.204.0.0/15,\n\t\t\t14.208.0.0/12,\n\t\t\t14.255.249.0/24,\n\t\t\t14.255.254.0/24,\n\t\t\t15.32.104.0/23,\n\t\t\t15.36.64.0/22,\n\t\t\t15.36.75.0/24,\n\t\t\t15.36.76.0/22,\n\t\t\t15.36.101.0/24,\n\t\t\t15.36.102.0/24,\n\t\t\t15.36.116.0/23,\n\t\t\t15.40.80.0/23,\n\t\t\t15.40.83.0/24,\n\t\t\t15.79.88.0/22,\n\t\t\t15.89.164.0/22,\n\t\t\t15.230.41.0/24,\n\t\t\t15.230.49.0/24,\n\t\t\t15.230.141.0/24,\n\t\t\t15.248.5.228/30,\n\t\t\t16.2.142.0/23,\n\t\t\t17.33.145.0/24,\n\t\t\t17.85.6.64/29,\n\t\t\t17.85.34.0/25,\n\t\t\t17.85.38.72/31,\n\t\t\t17.85.164.128/25,\n\t\t\t17.85.192.0/20,\n\t\t\t17.87.0.0/21,\n\t\t\t17.87.9.0/24,\n\t\t\t17.87.10.0/23,\n\t\t\t17.87.12.0/23,\n\t\t\t17.87.16.32/27,\n\t\t\t17.87.16.64/26,\n\t\t\t17.87.16.128/25,\n\t\t\t17.87.17.0/24,\n\t\t\t17.87.18.0/23,\n\t\t\t17.87.20.0/22,\n\t\t\t17.87.24.0/21,\n\t\t\t17.87.72.224/31,\n\t\t\t17.87.112.0/21,\n\t\t\t17.87.138.160/31,\n\t\t\t17.87.144.16/28,\n\t\t\t17.87.145.192/27,\n\t\t\t17.87.245.0/24,\n\t\t\t17.88.2.16/28,\n\t\t\t17.88.73.0/31,\n\t\t\t17.88.75.0/24,\n\t\t\t17.88.80.160/31,\n\t\t\t17.88.96.144/31,\n\t\t\t17.88.104.64/31,\n\t\t\t17.88.108.0/23,\n\t\t\t17.88.112.126/31,\n\t\t\t17.88.118.0/27,\n\t\t\t17.88.207.192/32,\n\t\t\t17.93.8.0/21,\n\t\t\t17.93.24.0/21,\n\t\t\t17.93.48.0/20,\n\t\t\t17.93.64.0/20,\n\t\t\t17.93.96.0/19,\n\t\t\t17.93.136.0/21,\n\t\t\t17.93.152.0/21,\n\t\t\t17.93.184.0/21,\n\t\t\t17.93.200.0/21,\n\t\t\t17.93.208.0/20,\n\t\t\t17.93.224.0/22,\n\t\t\t17.93.232.0/21,\n\t\t\t17.94.0.22/32,\n\t\t\t17.94.0.54/32,\n\t\t\t17.94.0.93/32,\n\t\t\t17.94.3.0/31,\n\t\t\t17.94.3.248/29,\n\t\t\t17.94.16.0/20,\n\t\t\t17.94.32.0/19,\n\t\t\t17.94.64.0/18,\n\t\t\t17.94.128.0/18,\n\t\t\t17.94.192.0/19,\n\t\t\t17.94.224.0/20,\n\t\t\t17.94.240.0/21,\n\t\t\t17.127.128.0/23,\n\t\t\t17.127.130.0/24,\n\t\t\t17.235.160.0/20,\n\t\t\t23.161.8.0/24,\n\t\t\t23.162.120.0/24,\n\t\t\t23.236.111.0/24,\n\t\t\t26.234.64.0/22,\n\t\t\t26.241.140.0/22,\n\t\t\t27.0.128.0/21,\n\t\t\t27.0.160.0/21,\n\t\t\t27.0.188.0/22,\n\t\t\t27.0.204.0/22,\n\t\t\t27.0.208.0/21,\n\t\t\t27.8.0.0/13,\n\t\t\t27.16.0.0/12,\n\t\t\t27.34.232.0/21,\n\t\t\t27.36.0.0/14,\n\t\t\t27.40.0.0/13,\n\t\t\t27.50.40.0/21,\n\t\t\t27.50.128.0/17,\n\t\t\t27.54.72.0/21,\n\t\t\t27.54.152.0/21,\n\t\t\t27.54.192.0/18,\n\t\t\t27.98.208.0/20,\n\t\t\t27.98.224.0/19,\n\t\t\t27.99.128.0/17,\n\t\t\t27.103.0.0/16,\n\t\t\t27.106.128.0/18,\n\t\t\t27.106.204.0/22,\n\t\t\t27.109.32.0/19,\n\t\t\t27.109.124.0/22,\n\t\t\t27.112.0.0/18,\n\t\t\t27.112.80.0/20,\n\t\t\t27.112.112.0/21,\n\t\t\t27.113.128.0/18,\n\t\t\t27.115.0.0/17,\n\t\t\t27.116.44.0/22,\n\t\t\t27.121.72.0/21,\n\t\t\t27.121.120.0/21,\n\t\t\t27.128.0.0/15,\n\t\t\t27.131.220.0/22,\n\t\t\t27.144.0.0/16,\n\t\t\t27.148.0.0/14,\n\t\t\t27.152.0.0/13,\n\t\t\t27.184.0.0/13,\n\t\t\t27.192.0.0/11,\n\t\t\t27.224.0.0/14,\n\t\t\t31.42.125.0/24,\n\t\t\t31.56.66.0/24,\n\t\t\t31.57.10.0/24,\n\t\t\t31.57.248.0/24,\n\t\t\t36.0.0.0/22,\n\t\t\t36.0.8.0/21,\n\t\t\t36.0.16.0/20,\n\t\t\t36.0.32.0/19,\n\t\t\t36.0.64.0/18,\n\t\t\t36.1.0.0/16,\n\t\t\t36.4.0.0/14,\n\t\t\t36.16.0.0/12,\n\t\t\t36.32.0.0/14,\n\t\t\t36.36.0.0/16,\n\t\t\t36.37.0.0/19,\n\t\t\t36.37.36.0/23,\n\t\t\t36.37.39.0/24,\n\t\t\t36.37.40.0/21,\n\t\t\t36.37.48.0/20,\n\t\t\t36.40.0.0/13,\n\t\t\t36.48.0.0/15,\n\t\t\t36.50.226.0/23,\n\t\t\t36.50.254.0/23,\n\t\t\t36.51.0.0/17,\n\t\t\t36.51.128.0/18,\n\t\t\t36.51.192.0/19,\n\t\t\t36.51.224.0/20,\n\t\t\t36.51.240.0/21,\n\t\t\t36.51.248.0/22,\n\t\t\t36.51.252.0/23,\n\t\t\t36.51.254.0/24,\n\t\t\t36.56.0.0/13,\n\t\t\t36.96.0.0/11,\n\t\t\t36.128.0.0/10,\n\t\t\t36.192.0.0/11,\n\t\t\t36.248.0.0/14,\n\t\t\t36.254.0.0/16,\n\t\t\t36.255.116.0/22,\n\t\t\t36.255.128.0/22,\n\t\t\t36.255.164.0/22,\n\t\t\t36.255.172.0/22,\n\t\t\t36.255.176.0/23,\n\t\t\t36.255.179.0/24,\n\t\t\t38.95.118.0/23,\n\t\t\t38.95.121.0/24,\n\t\t\t38.95.122.0/23,\n\t\t\t38.95.124.0/22,\n\t\t\t38.105.24.0/24,\n\t\t\t38.105.26.0/23,\n\t\t\t38.105.28.0/22,\n\t\t\t38.134.56.0/24,\n\t\t\t38.134.58.0/23,\n\t\t\t38.247.24.0/22,\n\t\t\t38.247.32.0/23,\n\t\t\t38.247.36.0/22,\n\t\t\t39.0.0.0/24,\n\t\t\t39.0.2.0/23,\n\t\t\t39.0.4.0/22,\n\t\t\t39.0.8.0/21,\n\t\t\t39.0.16.0/20,\n\t\t\t39.0.32.0/19,\n\t\t\t39.0.64.0/18,\n\t\t\t39.0.128.0/17,\n\t\t\t39.64.0.0/11,\n\t\t\t39.96.0.0/16,\n\t\t\t39.97.0.0/17,\n\t\t\t39.97.128.0/18,\n\t\t\t39.97.192.0/21,\n\t\t\t39.97.200.0/22,\n\t\t\t39.97.208.0/20,\n\t\t\t39.97.224.0/19,\n\t\t\t39.98.0.0/15,\n\t\t\t39.100.0.0/14,\n\t\t\t39.104.0.0/14,\n\t\t\t39.108.0.0/16,\n\t\t\t39.109.92.0/24,\n\t\t\t39.128.0.0/10,\n\t\t\t40.0.176.0/20,\n\t\t\t40.0.248.0/21,\n\t\t\t40.72.0.0/15,\n\t\t\t40.77.136.112/28,\n\t\t\t40.77.236.224/27,\n\t\t\t40.77.254.64/27,\n\t\t\t40.125.128.0/17,\n\t\t\t40.126.64.0/18,\n\t\t\t40.162.0.0/16,\n\t\t\t40.198.10.0/24,\n\t\t\t40.198.16.0/21,\n\t\t\t40.198.24.0/23,\n\t\t\t40.251.225.0/24,\n\t\t\t40.251.227.0/24,\n\t\t\t40.251.228.0/24,\n\t\t\t42.0.0.0/22,\n\t\t\t42.0.8.0/21,\n\t\t\t42.0.16.0/21,\n\t\t\t42.0.24.0/22,\n\t\t\t42.0.32.0/19,\n\t\t\t42.0.128.0/18,\n\t\t\t42.0.192.0/21,\n\t\t\t42.0.201.0/24,\n\t\t\t42.0.202.0/23,\n\t\t\t42.0.204.0/22,\n\t\t\t42.0.208.0/20,\n\t\t\t42.0.224.0/19,\n\t\t\t42.1.0.0/19,\n\t\t\t42.1.32.0/20,\n\t\t\t42.1.48.0/21,\n\t\t\t42.1.56.0/22,\n\t\t\t42.1.128.0/17,\n\t\t\t42.4.0.0/14,\n\t\t\t42.48.0.0/13,\n\t\t\t42.56.0.0/14,\n\t\t\t42.62.0.0/17,\n\t\t\t42.62.128.0/19,\n\t\t\t42.62.160.0/20,\n\t\t\t42.62.180.0/22,\n\t\t\t42.62.184.0/21,\n\t\t\t42.63.0.0/16,\n\t\t\t42.80.0.0/15,\n\t\t\t42.83.64.0/20,\n\t\t\t42.83.80.0/22,\n\t\t\t42.83.88.0/21,\n\t\t\t42.83.96.0/19,\n\t\t\t42.83.128.0/17,\n\t\t\t42.84.0.0/14,\n\t\t\t42.88.0.0/13,\n\t\t\t42.96.64.0/19,\n\t\t\t42.96.96.0/21,\n\t\t\t42.96.108.0/22,\n\t\t\t42.96.112.0/20,\n\t\t\t42.96.128.0/17,\n\t\t\t42.97.0.0/16,\n\t\t\t42.99.0.0/18,\n\t\t\t42.99.64.0/19,\n\t\t\t42.99.96.0/20,\n\t\t\t42.99.112.0/22,\n\t\t\t42.99.120.0/21,\n\t\t\t42.100.0.0/14,\n\t\t\t42.120.0.0/15,\n\t\t\t42.122.0.0/16,\n\t\t\t42.123.0.0/19,\n\t\t\t42.123.36.0/22,\n\t\t\t42.123.40.0/21,\n\t\t\t42.123.48.0/20,\n\t\t\t42.123.64.0/18,\n\t\t\t42.123.128.0/17,\n\t\t\t42.128.0.0/12,\n\t\t\t42.156.0.0/19,\n\t\t\t42.156.36.0/22,\n\t\t\t42.156.40.0/21,\n\t\t\t42.156.48.0/20,\n\t\t\t42.156.64.0/18,\n\t\t\t42.156.128.0/17,\n\t\t\t42.157.0.0/16,\n\t\t\t42.158.0.0/15,\n\t\t\t42.160.0.0/12,\n\t\t\t42.176.0.0/13,\n\t\t\t42.184.0.0/15,\n\t\t\t42.186.0.0/16,\n\t\t\t42.187.0.0/18,\n\t\t\t42.187.64.0/19,\n\t\t\t42.187.96.0/20,\n\t\t\t42.187.112.0/21,\n\t\t\t42.187.120.0/22,\n\t\t\t42.187.128.0/17,\n\t\t\t42.192.0.0/13,\n\t\t\t42.201.0.0/17,\n\t\t\t42.202.0.0/15,\n\t\t\t42.204.0.0/14,\n\t\t\t42.208.0.0/12,\n\t\t\t42.224.0.0/12,\n\t\t\t42.240.0.0/16,\n\t\t\t42.242.0.0/15,\n\t\t\t42.244.0.0/14,\n\t\t\t42.248.0.0/13,\n\t\t\t43.0.0.0/10,\n\t\t\t43.64.0.0/12,\n\t\t\t43.80.0.0/13,\n\t\t\t43.88.0.0/15,\n\t\t\t43.90.0.0/16,\n\t\t\t43.92.0.0/17,\n\t\t\t43.93.0.0/16,\n\t\t\t43.94.0.0/15,\n\t\t\t43.96.6.0/24,\n\t\t\t43.96.30.0/23,\n\t\t\t43.96.37.0/24,\n\t\t\t43.96.38.0/24,\n\t\t\t43.96.41.0/24,\n\t\t\t43.96.42.0/23,\n\t\t\t43.96.44.0/22,\n\t\t\t43.96.48.0/20,\n\t\t\t43.96.79.0/24,\n\t\t\t43.96.82.0/24,\n\t\t\t43.96.86.0/23,\n\t\t\t43.96.89.0/24,\n\t\t\t43.96.90.0/23,\n\t\t\t43.96.92.0/22,\n\t\t\t43.96.98.0/23,\n\t\t\t43.96.100.0/22,\n\t\t\t43.96.104.0/21,\n\t\t\t43.96.112.0/20,\n\t\t\t43.96.128.0/17,\n\t\t\t43.97.0.0/16,\n\t\t\t43.98.0.0/15,\n\t\t\t43.100.0.0/14,\n\t\t\t43.104.0.0/13,\n\t\t\t43.112.0.0/12,\n\t\t\t43.135.224.0/19,\n\t\t\t43.136.0.0/13,\n\t\t\t43.144.0.0/13,\n\t\t\t43.152.16.0/24,\n\t\t\t43.152.38.0/23,\n\t\t\t43.152.46.0/24,\n\t\t\t43.152.48.0/24,\n\t\t\t43.152.118.0/23,\n\t\t\t43.152.120.0/21,\n\t\t\t43.152.141.0/24,\n\t\t\t43.152.165.0/24,\n\t\t\t43.152.167.0/24,\n\t\t\t43.152.189.0/24,\n\t\t\t43.152.191.0/24,\n\t\t\t43.159.66.0/24,\n\t\t\t43.159.68.0/24,\n\t\t\t43.159.75.0/24,\n\t\t\t43.159.76.0/24,\n\t\t\t43.159.92.0/24,\n\t\t\t43.159.101.0/24,\n\t\t\t43.164.64.0/18,\n\t\t\t43.166.192.0/19,\n\t\t\t43.168.0.0/14,\n\t\t\t43.172.0.0/21,\n\t\t\t43.172.8.0/22,\n\t\t\t43.172.12.0/23,\n\t\t\t43.172.14.0/24,\n\t\t\t43.172.16.0/20,\n\t\t\t43.172.32.0/19,\n\t\t\t43.172.64.0/18,\n\t\t\t43.172.128.0/17,\n\t\t\t43.174.107.0/24,\n\t\t\t43.174.108.0/22,\n\t\t\t43.174.112.0/20,\n\t\t\t43.174.128.0/18,\n\t\t\t43.174.202.0/24,\n\t\t\t43.174.208.0/20,\n\t\t\t43.174.226.0/23,\n\t\t\t43.174.228.0/22,\n\t\t\t43.174.232.0/21,\n\t\t\t43.174.240.0/21,\n\t\t\t43.174.252.0/22,\n\t\t\t43.175.223.0/24,\n\t\t\t43.176.0.0/12,\n\t\t\t43.192.0.0/14,\n\t\t\t43.196.0.0/15,\n\t\t\t43.224.12.0/22,\n\t\t\t43.224.24.0/22,\n\t\t\t43.224.44.0/22,\n\t\t\t43.224.52.0/22,\n\t\t\t43.224.56.0/22,\n\t\t\t43.224.68.0/22,\n\t\t\t43.224.72.0/22,\n\t\t\t43.224.80.0/22,\n\t\t\t43.224.100.0/22,\n\t\t\t43.224.160.0/22,\n\t\t\t43.224.176.0/22,\n\t\t\t43.224.184.0/22,\n\t\t\t43.224.200.0/21,\n\t\t\t43.224.208.0/21,\n\t\t\t43.224.216.0/22,\n\t\t\t43.224.240.0/23,\n\t\t\t43.224.242.0/24,\n\t\t\t43.225.76.0/22,\n\t\t\t43.225.84.0/22,\n\t\t\t43.225.120.0/22,\n\t\t\t43.225.180.0/22,\n\t\t\t43.225.208.0/22,\n\t\t\t43.225.216.0/21,\n\t\t\t43.225.224.0/20,\n\t\t\t43.225.240.0/21,\n\t\t\t43.225.252.0/22,\n\t\t\t43.226.32.0/19,\n\t\t\t43.226.64.0/19,\n\t\t\t43.226.96.0/20,\n\t\t\t43.226.112.0/21,\n\t\t\t43.226.120.0/22,\n\t\t\t43.226.128.0/18,\n\t\t\t43.226.192.0/20,\n\t\t\t43.226.208.0/21,\n\t\t\t43.226.236.0/22,\n\t\t\t43.226.240.0/20,\n\t\t\t43.227.0.0/21,\n\t\t\t43.227.8.0/22,\n\t\t\t43.227.32.0/19,\n\t\t\t43.227.64.0/19,\n\t\t\t43.227.96.0/21,\n\t\t\t43.227.104.0/22,\n\t\t\t43.227.136.0/21,\n\t\t\t43.227.144.0/22,\n\t\t\t43.227.152.0/21,\n\t\t\t43.227.160.0/20,\n\t\t\t43.227.176.0/21,\n\t\t\t43.227.188.0/22,\n\t\t\t43.227.192.0/19,\n\t\t\t43.227.232.0/22,\n\t\t\t43.227.248.0/21,\n\t\t\t43.228.0.0/18,\n\t\t\t43.228.64.0/21,\n\t\t\t43.228.76.0/22,\n\t\t\t43.228.100.0/22,\n\t\t\t43.228.116.0/22,\n\t\t\t43.228.132.0/22,\n\t\t\t43.228.136.0/22,\n\t\t\t43.228.148.0/22,\n\t\t\t43.228.152.0/22,\n\t\t\t43.228.188.0/22,\n\t\t\t43.228.204.0/22,\n\t\t\t43.228.240.0/22,\n\t\t\t43.229.40.0/22,\n\t\t\t43.229.48.0/22,\n\t\t\t43.229.56.0/22,\n\t\t\t43.229.96.0/22,\n\t\t\t43.229.136.0/21,\n\t\t\t43.229.168.0/21,\n\t\t\t43.229.176.0/20,\n\t\t\t43.229.192.0/21,\n\t\t\t43.229.216.0/21,\n\t\t\t43.229.232.0/21,\n\t\t\t43.230.20.0/22,\n\t\t\t43.230.32.0/22,\n\t\t\t43.230.68.0/22,\n\t\t\t43.230.72.0/22,\n\t\t\t43.230.124.0/22,\n\t\t\t43.230.136.0/22,\n\t\t\t43.230.220.0/22,\n\t\t\t43.230.224.0/19,\n\t\t\t43.231.32.0/20,\n\t\t\t43.231.80.0/20,\n\t\t\t43.231.96.0/20,\n\t\t\t43.231.136.0/21,\n\t\t\t43.231.144.0/20,\n\t\t\t43.231.160.0/20,\n\t\t\t43.231.176.0/21,\n\t\t\t43.236.0.0/17,\n\t\t\t43.236.128.0/18,\n\t\t\t43.236.192.0/19,\n\t\t\t43.236.224.0/20,\n\t\t\t43.236.240.0/21,\n\t\t\t43.236.248.0/22,\n\t\t\t43.236.253.0/24,\n\t\t\t43.236.254.0/23,\n\t\t\t43.237.0.0/21,\n\t\t\t43.237.11.0/24,\n\t\t\t43.237.12.0/22,\n\t\t\t43.237.16.0/20,\n\t\t\t43.237.32.0/22,\n\t\t\t43.237.37.0/24,\n\t\t\t43.237.40.0/21,\n\t\t\t43.237.48.0/20,\n\t\t\t43.237.64.0/18,\n\t\t\t43.237.128.0/18,\n\t\t\t43.237.192.0/22,\n\t\t\t43.237.200.0/21,\n\t\t\t43.237.208.0/21,\n\t\t\t43.237.217.0/24,\n\t\t\t43.237.219.0/24,\n\t\t\t43.237.220.0/22,\n\t\t\t43.237.224.0/19,\n\t\t\t43.238.0.0/17,\n\t\t\t43.238.128.0/20,\n\t\t\t43.238.145.0/24,\n\t\t\t43.238.146.0/23,\n\t\t\t43.238.148.0/22,\n\t\t\t43.238.152.0/21,\n\t\t\t43.238.160.0/19,\n\t\t\t43.238.192.0/18,\n\t\t\t43.239.0.0/19,\n\t\t\t43.239.32.0/20,\n\t\t\t43.239.48.0/22,\n\t\t\t43.239.116.0/22,\n\t\t\t43.239.120.0/22,\n\t\t\t43.239.172.0/22,\n\t\t\t43.240.0.0/22,\n\t\t\t43.240.56.0/21,\n\t\t\t43.240.68.0/22,\n\t\t\t43.240.72.0/21,\n\t\t\t43.240.84.0/22,\n\t\t\t43.240.124.0/22,\n\t\t\t43.240.128.0/21,\n\t\t\t43.240.136.0/22,\n\t\t\t43.240.156.0/22,\n\t\t\t43.240.160.0/19,\n\t\t\t43.240.192.0/19,\n\t\t\t43.240.240.0/20,\n\t\t\t43.241.0.0/20,\n\t\t\t43.241.16.0/21,\n\t\t\t43.241.48.0/22,\n\t\t\t43.241.76.0/22,\n\t\t\t43.241.80.0/20,\n\t\t\t43.241.112.0/22,\n\t\t\t43.241.168.0/21,\n\t\t\t43.241.176.0/21,\n\t\t\t43.241.184.0/22,\n\t\t\t43.241.208.0/20,\n\t\t\t43.241.224.0/20,\n\t\t\t43.241.240.0/22,\n\t\t\t43.242.8.0/21,\n\t\t\t43.242.16.0/20,\n\t\t\t43.242.48.0/22,\n\t\t\t43.242.53.0/24,\n\t\t\t43.242.54.0/24,\n\t\t\t43.242.56.0/21,\n\t\t\t43.242.64.0/22,\n\t\t\t43.242.72.0/21,\n\t\t\t43.242.80.0/20,\n\t\t\t43.242.96.0/22,\n\t\t\t43.242.144.0/20,\n\t\t\t43.242.160.0/21,\n\t\t\t43.242.168.0/22,\n\t\t\t43.242.180.0/22,\n\t\t\t43.242.188.0/22,\n\t\t\t43.242.192.0/21,\n\t\t\t43.242.204.0/22,\n\t\t\t43.242.216.0/21,\n\t\t\t43.242.252.0/22,\n\t\t\t43.243.4.0/22,\n\t\t\t43.243.8.0/21,\n\t\t\t43.243.16.0/22,\n\t\t\t43.243.88.0/22,\n\t\t\t43.243.128.0/22,\n\t\t\t43.243.136.0/22,\n\t\t\t43.243.144.0/21,\n\t\t\t43.243.156.0/22,\n\t\t\t43.243.180.0/22,\n\t\t\t43.243.228.0/22,\n\t\t\t43.243.232.0/22,\n\t\t\t43.243.244.0/22,\n\t\t\t43.246.0.0/18,\n\t\t\t43.246.64.0/19,\n\t\t\t43.246.96.0/22,\n\t\t\t43.246.112.0/24,\n\t\t\t43.246.228.0/22,\n\t\t\t43.247.4.0/22,\n\t\t\t43.247.8.0/22,\n\t\t\t43.247.44.0/22,\n\t\t\t43.247.48.0/22,\n\t\t\t43.247.68.0/22,\n\t\t\t43.247.76.0/22,\n\t\t\t43.247.84.0/22,\n\t\t\t43.247.88.0/21,\n\t\t\t43.247.96.0/21,\n\t\t\t43.247.108.0/22,\n\t\t\t43.247.112.0/22,\n\t\t\t43.247.148.0/22,\n\t\t\t43.247.152.0/22,\n\t\t\t43.247.176.0/20,\n\t\t\t43.247.196.0/22,\n\t\t\t43.247.200.0/21,\n\t\t\t43.247.208.0/20,\n\t\t\t43.247.224.0/19,\n\t\t\t43.248.0.0/21,\n\t\t\t43.248.20.0/22,\n\t\t\t43.248.28.0/22,\n\t\t\t43.248.48.0/22,\n\t\t\t43.248.76.0/22,\n\t\t\t43.248.80.0/20,\n\t\t\t43.248.96.0/19,\n\t\t\t43.248.128.0/20,\n\t\t\t43.248.144.0/21,\n\t\t\t43.248.177.0/24,\n\t\t\t43.248.178.0/23,\n\t\t\t43.248.180.0/22,\n\t\t\t43.248.184.0/21,\n\t\t\t43.248.192.0/20,\n\t\t\t43.248.208.0/22,\n\t\t\t43.248.228.0/22,\n\t\t\t43.248.232.0/22,\n\t\t\t43.248.244.0/22,\n\t\t\t43.249.4.0/22,\n\t\t\t43.249.120.0/22,\n\t\t\t43.249.132.0/22,\n\t\t\t43.249.136.0/22,\n\t\t\t43.249.144.0/20,\n\t\t\t43.249.160.0/21,\n\t\t\t43.249.168.0/22,\n\t\t\t43.249.192.0/22,\n\t\t\t43.249.236.0/22,\n\t\t\t43.250.4.0/22,\n\t\t\t43.250.12.0/25,\n\t\t\t43.250.12.128/29,\n\t\t\t43.250.12.136/31,\n\t\t\t43.250.12.140/30,\n\t\t\t43.250.12.144/28,\n\t\t\t43.250.12.160/28,\n\t\t\t43.250.12.176/30,\n\t\t\t43.250.12.182/31,\n\t\t\t43.250.12.184/29,\n\t\t\t43.250.12.192/26,\n\t\t\t43.250.13.0/24,\n\t\t\t43.250.14.0/25,\n\t\t\t43.250.14.128/29,\n\t\t\t43.250.14.136/31,\n\t\t\t43.250.14.140/30,\n\t\t\t43.250.14.144/28,\n\t\t\t43.250.14.160/28,\n\t\t\t43.250.14.176/30,\n\t\t\t43.250.14.182/31,\n\t\t\t43.250.14.184/29,\n\t\t\t43.250.14.192/26,\n\t\t\t43.250.15.0/24,\n\t\t\t43.250.16.0/21,\n\t\t\t43.250.28.0/22,\n\t\t\t43.250.32.0/21,\n\t\t\t43.250.96.0/21,\n\t\t\t43.250.107.0/24,\n\t\t\t43.250.108.0/22,\n\t\t\t43.250.112.0/22,\n\t\t\t43.250.128.0/22,\n\t\t\t43.250.144.0/21,\n\t\t\t43.250.160.0/22,\n\t\t\t43.250.168.0/22,\n\t\t\t43.250.176.0/22,\n\t\t\t43.250.200.0/22,\n\t\t\t43.250.212.0/22,\n\t\t\t43.250.216.0/21,\n\t\t\t43.250.236.0/22,\n\t\t\t43.250.244.0/22,\n\t\t\t43.251.4.0/22,\n\t\t\t43.251.8.0/22,\n\t\t\t43.251.36.0/22,\n\t\t\t43.251.100.0/22,\n\t\t\t43.251.192.0/22,\n\t\t\t43.251.232.0/22,\n\t\t\t43.251.244.0/22,\n\t\t\t43.252.48.0/22,\n\t\t\t43.252.56.0/22,\n\t\t\t43.254.0.0/21,\n\t\t\t43.254.8.0/22,\n\t\t\t43.254.24.0/22,\n\t\t\t43.254.36.0/22,\n\t\t\t43.254.44.0/22,\n\t\t\t43.254.52.0/22,\n\t\t\t43.254.64.0/22,\n\t\t\t43.254.72.0/22,\n\t\t\t43.254.84.0/22,\n\t\t\t43.254.88.0/21,\n\t\t\t43.254.100.0/22,\n\t\t\t43.254.104.0/22,\n\t\t\t43.254.112.0/21,\n\t\t\t43.254.136.0/21,\n\t\t\t43.254.144.0/20,\n\t\t\t43.254.168.0/21,\n\t\t\t43.254.180.0/22,\n\t\t\t43.254.184.0/21,\n\t\t\t43.254.192.0/21,\n\t\t\t43.254.200.0/22,\n\t\t\t43.254.208.0/22,\n\t\t\t43.254.220.0/22,\n\t\t\t43.254.224.0/20,\n\t\t\t43.254.240.0/22,\n\t\t\t43.254.248.0/21,\n\t\t\t43.255.0.0/21,\n\t\t\t43.255.8.0/22,\n\t\t\t43.255.16.0/22,\n\t\t\t43.255.48.0/22,\n\t\t\t43.255.64.0/20,\n\t\t\t43.255.84.0/22,\n\t\t\t43.255.96.0/22,\n\t\t\t43.255.144.0/22,\n\t\t\t43.255.176.0/22,\n\t\t\t43.255.184.0/22,\n\t\t\t43.255.192.0/22,\n\t\t\t43.255.200.0/21,\n\t\t\t43.255.208.0/21,\n\t\t\t43.255.224.0/21,\n\t\t\t43.255.232.0/22,\n\t\t\t43.255.244.0/22,\n\t\t\t44.30.28.0/24,\n\t\t\t44.31.28.0/24,\n\t\t\t44.31.42.0/24,\n\t\t\t44.31.81.0/24,\n\t\t\t44.31.96.0/24,\n\t\t\t44.31.216.0/24,\n\t\t\t44.32.143.0/24,\n\t\t\t44.32.191.0/24,\n\t\t\t44.32.192.0/24,\n\t\t\t45.9.11.0/24,\n\t\t\t45.40.192.0/18,\n\t\t\t45.62.168.0/24,\n\t\t\t45.65.16.0/20,\n\t\t\t45.112.132.0/22,\n\t\t\t45.112.188.0/22,\n\t\t\t45.112.208.0/21,\n\t\t\t45.112.216.0/22,\n\t\t\t45.112.220.0/23,\n\t\t\t45.112.222.0/26,\n\t\t\t45.112.222.64/27,\n\t\t\t45.112.222.96/29,\n\t\t\t45.112.222.106/31,\n\t\t\t45.112.222.108/30,\n\t\t\t45.112.222.112/28,\n\t\t\t45.112.222.130/31,\n\t\t\t45.112.222.132/30,\n\t\t\t45.112.222.136/29,\n\t\t\t45.112.222.146/31,\n\t\t\t45.112.222.150/31,\n\t\t\t45.112.222.152/29,\n\t\t\t45.112.222.160/27,\n\t\t\t45.112.222.192/26,\n\t\t\t45.112.223.0/24,\n\t\t\t45.112.228.0/22,\n\t\t\t45.112.232.0/21,\n\t\t\t45.113.12.0/22,\n\t\t\t45.113.16.0/20,\n\t\t\t45.113.40.0/22,\n\t\t\t45.113.56.0/22,\n\t\t\t45.113.72.0/22,\n\t\t\t45.113.144.0/21,\n\t\t\t45.113.168.0/22,\n\t\t\t45.113.176.0/22,\n\t\t\t45.113.184.0/22,\n\t\t\t45.113.200.0/21,\n\t\t\t45.113.208.0/20,\n\t\t\t45.113.240.0/22,\n\t\t\t45.113.252.0/22,\n\t\t\t45.114.0.0/22,\n\t\t\t45.114.32.0/22,\n\t\t\t45.114.40.0/22,\n\t\t\t45.114.52.0/22,\n\t\t\t45.114.96.0/22,\n\t\t\t45.114.136.0/22,\n\t\t\t45.114.196.0/22,\n\t\t\t45.114.200.0/22,\n\t\t\t45.114.228.0/22,\n\t\t\t45.114.252.0/22,\n\t\t\t45.115.44.0/22,\n\t\t\t45.115.100.0/22,\n\t\t\t45.115.120.0/22,\n\t\t\t45.115.132.0/22,\n\t\t\t45.115.144.0/22,\n\t\t\t45.115.156.0/22,\n\t\t\t45.115.164.0/22,\n\t\t\t45.115.200.0/22,\n\t\t\t45.115.212.0/22,\n\t\t\t45.115.244.0/22,\n\t\t\t45.115.248.0/22,\n\t\t\t45.116.16.0/22,\n\t\t\t45.116.24.0/22,\n\t\t\t45.116.32.0/21,\n\t\t\t45.116.52.0/22,\n\t\t\t45.116.96.0/21,\n\t\t\t45.116.140.0/22,\n\t\t\t45.116.152.0/22,\n\t\t\t45.116.208.0/22,\n\t\t\t45.117.8.0/22,\n\t\t\t45.117.20.0/22,\n\t\t\t45.117.68.0/22,\n\t\t\t45.117.124.0/22,\n\t\t\t45.117.252.0/22,\n\t\t\t45.119.60.0/22,\n\t\t\t45.119.64.0/21,\n\t\t\t45.119.72.0/22,\n\t\t\t45.119.104.0/22,\n\t\t\t45.119.116.0/22,\n\t\t\t45.119.232.0/22,\n\t\t\t45.120.100.0/22,\n\t\t\t45.120.140.0/22,\n\t\t\t45.120.164.0/22,\n\t\t\t45.120.180.128/27,\n\t\t\t45.120.182.0/24,\n\t\t\t45.120.240.0/24,\n\t\t\t45.120.242.0/23,\n\t\t\t45.121.52.0/22,\n\t\t\t45.121.64.0/21,\n\t\t\t45.121.72.0/22,\n\t\t\t45.121.92.0/22,\n\t\t\t45.121.96.0/22,\n\t\t\t45.121.172.0/22,\n\t\t\t45.121.176.0/22,\n\t\t\t45.121.240.0/20,\n\t\t\t45.122.0.0/19,\n\t\t\t45.122.32.0/21,\n\t\t\t45.122.40.0/22,\n\t\t\t45.122.60.0/22,\n\t\t\t45.122.64.0/19,\n\t\t\t45.122.96.0/20,\n\t\t\t45.122.112.0/21,\n\t\t\t45.122.160.0/19,\n\t\t\t45.122.192.0/20,\n\t\t\t45.122.208.0/21,\n\t\t\t45.122.216.0/22,\n\t\t\t45.123.28.0/22,\n\t\t\t45.123.32.0/21,\n\t\t\t45.123.44.0/22,\n\t\t\t45.123.48.0/20,\n\t\t\t45.123.64.0/20,\n\t\t\t45.123.80.0/21,\n\t\t\t45.123.120.0/22,\n\t\t\t45.123.128.0/21,\n\t\t\t45.123.136.0/22,\n\t\t\t45.123.148.0/22,\n\t\t\t45.123.152.0/21,\n\t\t\t45.123.164.0/22,\n\t\t\t45.123.168.0/21,\n\t\t\t45.123.176.0/21,\n\t\t\t45.123.184.0/22,\n\t\t\t45.123.204.0/22,\n\t\t\t45.123.212.0/22,\n\t\t\t45.123.224.0/19,\n\t\t\t45.124.0.0/22,\n\t\t\t45.124.20.0/22,\n\t\t\t45.124.28.0/22,\n\t\t\t45.124.32.0/21,\n\t\t\t45.124.44.0/22,\n\t\t\t45.124.68.0/22,\n\t\t\t45.124.76.0/22,\n\t\t\t45.124.80.0/22,\n\t\t\t45.124.100.0/22,\n\t\t\t45.124.124.0/22,\n\t\t\t45.124.172.0/22,\n\t\t\t45.124.176.0/22,\n\t\t\t45.124.208.0/22,\n\t\t\t45.124.248.0/22,\n\t\t\t45.125.24.0/22,\n\t\t\t45.125.44.0/22,\n\t\t\t45.125.52.0/22,\n\t\t\t45.125.56.0/22,\n\t\t\t45.125.76.0/22,\n\t\t\t45.125.80.0/20,\n\t\t\t45.125.96.0/21,\n\t\t\t45.125.136.0/23,\n\t\t\t45.125.138.0/24,\n\t\t\t45.126.48.0/21,\n\t\t\t45.126.100.0/22,\n\t\t\t45.126.108.0/22,\n\t\t\t45.126.112.0/21,\n\t\t\t45.126.120.0/22,\n\t\t\t45.126.220.0/23,\n\t\t\t45.126.222.0/24,\n\t\t\t45.127.8.0/21,\n\t\t\t45.127.128.0/22,\n\t\t\t45.127.144.0/21,\n\t\t\t45.127.156.0/22,\n\t\t\t45.135.149.0/24,\n\t\t\t45.147.6.0/24,\n\t\t\t45.150.236.0/23,\n\t\t\t45.195.6.0/24,\n\t\t\t45.202.64.0/22,\n\t\t\t45.202.209.0/24,\n\t\t\t45.202.210.0/23,\n\t\t\t45.202.212.0/24,\n\t\t\t45.248.8.0/22,\n\t\t\t45.248.80.0/21,\n\t\t\t45.248.88.0/22,\n\t\t\t45.248.96.0/20,\n\t\t\t45.248.128.0/21,\n\t\t\t45.248.204.0/22,\n\t\t\t45.248.208.0/20,\n\t\t\t45.248.224.0/19,\n\t\t\t45.249.0.0/21,\n\t\t\t45.249.12.0/22,\n\t\t\t45.249.16.0/20,\n\t\t\t45.249.32.0/21,\n\t\t\t45.249.112.0/22,\n\t\t\t45.249.188.0/22,\n\t\t\t45.249.192.0/20,\n\t\t\t45.249.208.0/21,\n\t\t\t45.250.12.0/22,\n\t\t\t45.250.16.0/22,\n\t\t\t45.250.28.0/22,\n\t\t\t45.250.32.0/21,\n\t\t\t45.250.40.0/22,\n\t\t\t45.250.76.0/22,\n\t\t\t45.250.80.0/20,\n\t\t\t45.250.96.0/22,\n\t\t\t45.250.104.0/21,\n\t\t\t45.250.112.0/20,\n\t\t\t45.250.128.0/20,\n\t\t\t45.250.144.0/21,\n\t\t\t45.250.152.0/22,\n\t\t\t45.250.164.0/22,\n\t\t\t45.250.180.0/22,\n\t\t\t45.250.184.0/21,\n\t\t\t45.250.192.0/22,\n\t\t\t45.251.0.0/22,\n\t\t\t45.251.8.0/22,\n\t\t\t45.251.16.0/21,\n\t\t\t45.251.54.0/23,\n\t\t\t45.251.84.0/22,\n\t\t\t45.251.88.0/21,\n\t\t\t45.251.96.0/21,\n\t\t\t45.251.120.0/21,\n\t\t\t45.251.140.0/22,\n\t\t\t45.251.144.0/20,\n\t\t\t45.251.160.0/19,\n\t\t\t45.251.192.0/19,\n\t\t\t45.251.224.0/22,\n\t\t\t45.252.0.0/21,\n\t\t\t45.252.9.0/24,\n\t\t\t45.252.10.0/23,\n\t\t\t45.252.12.0/22,\n\t\t\t45.252.16.0/20,\n\t\t\t45.252.32.0/20,\n\t\t\t45.252.48.0/22,\n\t\t\t45.252.84.0/22,\n\t\t\t45.252.88.0/21,\n\t\t\t45.252.96.0/19,\n\t\t\t45.252.128.0/19,\n\t\t\t45.252.160.0/20,\n\t\t\t45.252.176.0/22,\n\t\t\t45.252.192.0/19,\n\t\t\t45.252.224.0/21,\n\t\t\t45.252.232.0/22,\n\t\t\t45.253.0.0/18,\n\t\t\t45.253.64.0/20,\n\t\t\t45.253.80.0/21,\n\t\t\t45.253.92.0/22,\n\t\t\t45.253.96.0/20,\n\t\t\t45.253.112.0/21,\n\t\t\t45.253.120.0/22,\n\t\t\t45.253.132.0/22,\n\t\t\t45.253.136.0/21,\n\t\t\t45.253.144.0/20,\n\t\t\t45.253.160.0/19,\n\t\t\t45.253.192.0/19,\n\t\t\t45.253.224.0/20,\n\t\t\t45.253.240.0/22,\n\t\t\t45.254.0.0/20,\n\t\t\t45.254.16.0/21,\n\t\t\t45.254.28.0/22,\n\t\t\t45.254.40.0/22,\n\t\t\t45.254.48.0/20,\n\t\t\t45.254.64.0/18,\n\t\t\t45.254.128.0/18,\n\t\t\t45.254.192.0/19,\n\t\t\t45.254.224.0/21,\n\t\t\t45.254.236.0/22,\n\t\t\t45.254.240.0/22,\n\t\t\t45.254.248.0/22,\n\t\t\t45.255.0.0/18,\n\t\t\t45.255.64.0/19,\n\t\t\t45.255.96.0/20,\n\t\t\t45.255.112.0/21,\n\t\t\t45.255.120.0/22,\n\t\t\t45.255.136.0/21,\n\t\t\t45.255.144.0/20,\n\t\t\t45.255.160.0/19,\n\t\t\t45.255.192.0/19,\n\t\t\t45.255.224.0/20,\n\t\t\t45.255.240.0/21,\n\t\t\t45.255.248.0/22,\n\t\t\t46.248.24.0/23,\n\t\t\t47.92.0.0/14,\n\t\t\t47.96.0.0/11,\n\t\t\t49.4.0.0/17,\n\t\t\t49.4.128.0/22,\n\t\t\t49.4.160.0/20,\n\t\t\t49.4.178.0/23,\n\t\t\t49.4.180.0/22,\n\t\t\t49.4.184.0/21,\n\t\t\t49.4.192.0/18,\n\t\t\t49.5.0.0/16,\n\t\t\t49.6.0.0/15,\n\t\t\t49.51.57.0/24,\n\t\t\t49.51.58.0/23,\n\t\t\t49.51.60.0/23,\n\t\t\t49.51.110.0/23,\n\t\t\t49.51.112.0/20,\n\t\t\t49.52.0.0/14,\n\t\t\t49.64.0.0/11,\n\t\t\t49.112.0.0/13,\n\t\t\t49.120.0.0/14,\n\t\t\t49.128.0.0/24,\n\t\t\t49.128.2.0/23,\n\t\t\t49.128.4.0/22,\n\t\t\t49.128.223.0/24,\n\t\t\t49.140.0.0/15,\n\t\t\t49.152.0.0/14,\n\t\t\t49.208.0.0/14,\n\t\t\t49.213.62.0/23,\n\t\t\t49.220.0.0/14,\n\t\t\t49.232.0.0/14,\n\t\t\t49.239.0.0/18,\n\t\t\t49.239.192.0/18,\n\t\t\t49.246.224.0/23,\n\t\t\t49.246.228.0/22,\n\t\t\t49.246.232.0/23,\n\t\t\t49.246.236.0/22,\n\t\t\t49.246.240.0/20,\n\t\t\t52.80.0.0/14,\n\t\t\t52.93.242.120/29,\n\t\t\t52.93.242.128/25,\n\t\t\t52.94.249.0/27,\n\t\t\t52.130.0.0/15,\n\t\t\t54.222.0.0/15,\n\t\t\t54.240.224.0/24,\n\t\t\t57.176.0.0/15,\n\t\t\t58.14.0.0/21,\n\t\t\t58.14.16.0/20,\n\t\t\t58.14.32.0/19,\n\t\t\t58.14.64.0/18,\n\t\t\t58.14.128.0/17,\n\t\t\t58.15.0.0/16,\n\t\t\t58.16.0.0/13,\n\t\t\t58.24.0.0/15,\n\t\t\t58.30.0.0/15,\n\t\t\t58.32.0.0/11,\n\t\t\t58.65.232.0/21,\n\t\t\t58.66.0.0/18,\n\t\t\t58.66.192.0/18,\n\t\t\t58.67.0.0/16,\n\t\t\t58.68.128.0/19,\n\t\t\t58.68.160.0/21,\n\t\t\t58.68.200.0/21,\n\t\t\t58.68.208.0/20,\n\t\t\t58.68.224.0/19,\n\t\t\t58.82.0.0/17,\n\t\t\t58.83.0.0/16,\n\t\t\t58.87.64.0/18,\n\t\t\t58.99.128.0/17,\n\t\t\t58.100.0.0/15,\n\t\t\t58.116.0.0/14,\n\t\t\t58.128.0.0/13,\n\t\t\t58.144.0.0/16,\n\t\t\t58.154.0.0/15,\n\t\t\t58.192.0.0/11,\n\t\t\t58.240.0.0/12,\n\t\t\t59.32.0.0/11,\n\t\t\t59.64.0.0/12,\n\t\t\t59.80.0.0/14,\n\t\t\t59.107.0.0/17,\n\t\t\t59.107.128.0/18,\n\t\t\t59.107.252.0/22,\n\t\t\t59.108.0.0/14,\n\t\t\t59.151.0.0/17,\n\t\t\t59.152.16.0/20,\n\t\t\t59.152.36.0/22,\n\t\t\t59.152.64.0/20,\n\t\t\t59.152.112.0/21,\n\t\t\t59.153.4.0/22,\n\t\t\t59.153.32.0/22,\n\t\t\t59.153.64.0/21,\n\t\t\t59.153.72.0/22,\n\t\t\t59.153.92.0/22,\n\t\t\t59.153.116.0/22,\n\t\t\t59.153.136.0/22,\n\t\t\t59.153.152.0/22,\n\t\t\t59.153.164.0/22,\n\t\t\t59.153.168.0/21,\n\t\t\t59.153.176.0/20,\n\t\t\t59.153.192.0/22,\n\t\t\t59.155.0.0/16,\n\t\t\t59.172.0.0/14,\n\t\t\t59.191.0.0/17,\n\t\t\t59.192.0.0/10,\n\t\t\t60.0.0.0/11,\n\t\t\t60.55.0.0/16,\n\t\t\t60.63.0.0/16,\n\t\t\t60.160.0.0/11,\n\t\t\t60.194.0.0/15,\n\t\t\t60.200.0.0/13,\n\t\t\t60.208.0.0/12,\n\t\t\t60.232.0.0/15,\n\t\t\t60.235.0.0/16,\n\t\t\t60.245.128.0/17,\n\t\t\t60.247.0.0/16,\n\t\t\t60.252.0.0/16,\n\t\t\t60.253.128.0/17,\n\t\t\t60.255.0.0/16,\n\t\t\t61.4.80.0/20,\n\t\t\t61.4.176.0/20,\n\t\t\t61.8.160.0/20,\n\t\t\t61.14.212.0/22,\n\t\t\t61.14.216.0/21,\n\t\t\t61.14.240.0/21,\n\t\t\t61.28.0.0/17,\n\t\t\t61.29.128.0/18,\n\t\t\t61.29.194.0/23,\n\t\t\t61.29.196.0/23,\n\t\t\t61.29.198.0/24,\n\t\t\t61.29.201.0/24,\n\t\t\t61.29.202.0/23,\n\t\t\t61.29.204.0/22,\n\t\t\t61.29.208.0/23,\n\t\t\t61.29.212.0/22,\n\t\t\t61.29.216.0/21,\n\t\t\t61.29.224.0/21,\n\t\t\t61.29.232.0/23,\n\t\t\t61.29.235.0/24,\n\t\t\t61.29.236.0/22,\n\t\t\t61.45.128.0/18,\n\t\t\t61.45.224.0/20,\n\t\t\t61.47.128.0/18,\n\t\t\t61.48.0.0/13,\n\t\t\t61.87.192.0/18,\n\t\t\t61.128.0.0/10,\n\t\t\t61.232.0.0/14,\n\t\t\t61.236.0.0/15,\n\t\t\t61.240.0.0/14,\n\t\t\t62.234.0.0/16,\n\t\t\t63.140.0.0/24,\n\t\t\t63.140.3.0/24,\n\t\t\t64.188.38.0/23,\n\t\t\t64.188.40.0/22,\n\t\t\t64.188.44.0/23,\n\t\t\t64.235.230.152/30,\n\t\t\t65.97.55.248/29,\n\t\t\t66.102.240.0/24,\n\t\t\t66.102.242.0/23,\n\t\t\t66.102.244.0/22,\n\t\t\t66.102.248.0/23,\n\t\t\t66.102.251.0/24,\n\t\t\t66.102.252.0/24,\n\t\t\t66.102.254.0/23,\n\t\t\t66.119.149.0/24,\n\t\t\t67.220.137.144/28,\n\t\t\t68.79.0.0/18,\n\t\t\t69.163.106.0/24,\n\t\t\t69.163.123.0/24,\n\t\t\t69.172.70.0/24,\n\t\t\t69.230.192.0/18,\n\t\t\t69.231.128.0/18,\n\t\t\t69.234.192.0/18,\n\t\t\t69.235.128.0/18,\n\t\t\t71.131.192.0/18,\n\t\t\t71.132.0.0/18,\n\t\t\t71.136.64.0/18,\n\t\t\t71.137.0.0/18,\n\t\t\t72.163.240.0/23,\n\t\t\t72.163.248.0/22,\n\t\t\t74.114.51.0/24,\n\t\t\t74.122.24.0/22,\n\t\t\t79.172.250.0/24,\n\t\t\t81.68.0.0/14,\n\t\t\t81.173.18.0/23,\n\t\t\t81.173.20.0/22,\n\t\t\t81.173.28.0/24,\n\t\t\t82.39.172.0/24,\n\t\t\t82.152.105.0/24,\n\t\t\t82.156.0.0/15,\n\t\t\t84.54.2.0/23,\n\t\t\t85.149.220.0/24,\n\t\t\t87.76.211.0/24,\n\t\t\t87.76.221.0/24,\n\t\t\t87.76.222.0/24,\n\t\t\t87.254.207.0/24,\n\t\t\t93.95.117.0/24,\n\t\t\t93.113.109.8/29,\n\t\t\t93.113.109.24/29,\n\t\t\t93.113.109.104/29,\n\t\t\t93.113.109.136/29,\n\t\t\t93.113.109.152/29,\n\t\t\t93.113.109.232/29,\n\t\t\t93.183.14.0/24,\n\t\t\t93.183.18.0/24,\n\t\t\t94.191.0.0/17,\n\t\t\t101.0.0.0/22,\n\t\t\t101.1.0.0/22,\n\t\t\t101.2.172.0/22,\n\t\t\t101.4.0.0/14,\n\t\t\t101.16.0.0/12,\n\t\t\t101.33.128.0/17,\n\t\t\t101.34.0.0/15,\n\t\t\t101.36.0.0/18,\n\t\t\t101.36.64.0/20,\n\t\t\t101.36.82.0/23,\n\t\t\t101.36.85.0/24,\n\t\t\t101.36.86.0/23,\n\t\t\t101.36.88.0/21,\n\t\t\t101.36.128.0/17,\n\t\t\t101.37.0.0/16,\n\t\t\t101.38.0.0/15,\n\t\t\t101.40.0.0/14,\n\t\t\t101.48.0.0/15,\n\t\t\t101.50.8.0/21,\n\t\t\t101.50.56.0/22,\n\t\t\t101.52.0.0/16,\n\t\t\t101.53.100.0/22,\n\t\t\t101.54.0.0/16,\n\t\t\t101.55.21.0/24,\n\t\t\t101.55.224.0/21,\n\t\t\t101.64.0.0/13,\n\t\t\t101.72.0.0/14,\n\t\t\t101.76.0.0/15,\n\t\t\t101.78.0.0/22,\n\t\t\t101.78.32.0/19,\n\t\t\t101.80.0.0/12,\n\t\t\t101.96.0.0/21,\n\t\t\t101.96.8.0/22,\n\t\t\t101.96.16.0/20,\n\t\t\t101.96.128.0/17,\n\t\t\t101.99.96.0/19,\n\t\t\t101.101.64.0/19,\n\t\t\t101.101.100.0/24,\n\t\t\t101.101.102.0/23,\n\t\t\t101.101.104.0/21,\n\t\t\t101.101.112.0/20,\n\t\t\t101.102.64.0/19,\n\t\t\t101.102.100.0/23,\n\t\t\t101.102.102.0/24,\n\t\t\t101.102.104.0/21,\n\t\t\t101.102.112.0/20,\n\t\t\t101.104.0.0/14,\n\t\t\t101.110.64.0/19,\n\t\t\t101.110.96.0/20,\n\t\t\t101.110.116.0/22,\n\t\t\t101.110.120.0/21,\n\t\t\t101.120.0.0/14,\n\t\t\t101.124.0.0/15,\n\t\t\t101.126.0.0/16,\n\t\t\t101.128.0.0/22,\n\t\t\t101.128.8.0/21,\n\t\t\t101.128.16.0/20,\n\t\t\t101.128.32.0/19,\n\t\t\t101.129.0.0/16,\n\t\t\t101.130.0.0/15,\n\t\t\t101.132.0.0/15,\n\t\t\t101.134.0.0/16,\n\t\t\t101.135.0.0/19,\n\t\t\t101.135.32.0/24,\n\t\t\t101.135.34.0/23,\n\t\t\t101.135.36.0/22,\n\t\t\t101.135.40.0/21,\n\t\t\t101.135.48.0/20,\n\t\t\t101.135.64.0/18,\n\t\t\t101.135.128.0/17,\n\t\t\t101.144.0.0/12,\n\t\t\t101.192.0.0/13,\n\t\t\t101.200.0.0/15,\n\t\t\t101.203.128.0/19,\n\t\t\t101.203.160.0/21,\n\t\t\t101.203.172.0/22,\n\t\t\t101.203.176.0/20,\n\t\t\t101.204.0.0/14,\n\t\t\t101.224.0.0/13,\n\t\t\t101.232.0.0/15,\n\t\t\t101.234.64.0/21,\n\t\t\t101.234.76.0/22,\n\t\t\t101.234.80.0/20,\n\t\t\t101.234.96.0/19,\n\t\t\t101.236.0.0/14,\n\t\t\t101.240.0.0/13,\n\t\t\t101.248.0.0/15,\n\t\t\t101.251.0.0/22,\n\t\t\t101.251.8.0/21,\n\t\t\t101.251.16.0/20,\n\t\t\t101.251.32.0/19,\n\t\t\t101.251.64.0/18,\n\t\t\t101.251.128.0/17,\n\t\t\t101.252.0.0/15,\n\t\t\t101.254.0.0/16,\n\t\t\t103.1.8.0/22,\n\t\t\t103.1.20.0/22,\n\t\t\t103.1.24.0/22,\n\t\t\t103.1.72.0/22,\n\t\t\t103.1.88.0/22,\n\t\t\t103.1.168.0/22,\n\t\t\t103.2.108.0/22,\n\t\t\t103.2.156.0/22,\n\t\t\t103.2.164.0/22,\n\t\t\t103.2.188.0/23,\n\t\t\t103.2.200.0/21,\n\t\t\t103.2.208.0/21,\n\t\t\t103.3.84.0/22,\n\t\t\t103.3.88.0/21,\n\t\t\t103.3.96.0/19,\n\t\t\t103.3.128.0/20,\n\t\t\t103.3.148.0/22,\n\t\t\t103.3.152.0/21,\n\t\t\t103.4.56.0/22,\n\t\t\t103.4.168.0/22,\n\t\t\t103.4.184.0/22,\n\t\t\t103.4.224.0/22,\n\t\t\t103.5.36.0/22,\n\t\t\t103.5.52.0/23,\n\t\t\t103.5.56.0/22,\n\t\t\t103.5.152.0/22,\n\t\t\t103.5.168.0/22,\n\t\t\t103.5.192.0/22,\n\t\t\t103.5.252.0/22,\n\t\t\t103.6.76.0/22,\n\t\t\t103.6.108.0/22,\n\t\t\t103.6.220.0/22,\n\t\t\t103.6.228.0/22,\n\t\t\t103.7.140.0/22,\n\t\t\t103.7.212.0/22,\n\t\t\t103.7.216.0/21,\n\t\t\t103.8.0.0/21,\n\t\t\t103.8.8.0/22,\n\t\t\t103.8.32.0/22,\n\t\t\t103.8.52.0/22,\n\t\t\t103.8.68.0/22,\n\t\t\t103.8.108.0/22,\n\t\t\t103.8.156.0/22,\n\t\t\t103.8.200.0/21,\n\t\t\t103.8.220.0/22,\n\t\t\t103.9.8.0/22,\n\t\t\t103.9.24.0/22,\n\t\t\t103.9.108.0/22,\n\t\t\t103.9.152.0/22,\n\t\t\t103.9.248.0/21,\n\t\t\t103.10.0.0/22,\n\t\t\t103.10.16.0/22,\n\t\t\t103.10.84.0/22,\n\t\t\t103.10.140.0/22,\n\t\t\t103.11.16.0/22,\n\t\t\t103.11.168.0/22,\n\t\t\t103.11.180.0/22,\n\t\t\t103.12.32.0/22,\n\t\t\t103.12.98.0/23,\n\t\t\t103.12.136.0/22,\n\t\t\t103.12.184.0/22,\n\t\t\t103.12.232.0/22,\n\t\t\t103.13.12.0/22,\n\t\t\t103.13.124.0/22,\n\t\t\t103.13.145.0/24,\n\t\t\t103.13.147.0/24,\n\t\t\t103.13.196.0/22,\n\t\t\t103.13.244.0/22,\n\t\t\t103.14.78.0/24,\n\t\t\t103.14.84.0/22,\n\t\t\t103.14.132.0/22,\n\t\t\t103.14.136.0/22,\n\t\t\t103.14.156.0/22,\n\t\t\t103.14.240.0/22,\n\t\t\t103.15.4.0/22,\n\t\t\t103.15.8.0/22,\n\t\t\t103.15.16.0/22,\n\t\t\t103.15.96.0/22,\n\t\t\t103.15.200.0/22,\n\t\t\t103.16.52.0/22,\n\t\t\t103.16.80.0/21,\n\t\t\t103.16.88.0/22,\n\t\t\t103.16.108.0/22,\n\t\t\t103.16.124.0/22,\n\t\t\t103.17.40.0/22,\n\t\t\t103.17.64.0/22,\n\t\t\t103.17.120.0/22,\n\t\t\t103.17.136.0/22,\n\t\t\t103.17.160.0/22,\n\t\t\t103.17.204.0/22,\n\t\t\t103.17.228.0/22,\n\t\t\t103.18.186.0/23,\n\t\t\t103.18.192.0/22,\n\t\t\t103.18.208.0/21,\n\t\t\t103.18.224.0/22,\n\t\t\t103.19.12.0/22,\n\t\t\t103.19.40.0/21,\n\t\t\t103.19.64.0/21,\n\t\t\t103.19.72.0/22,\n\t\t\t103.19.232.0/22,\n\t\t\t103.20.12.0/22,\n\t\t\t103.20.32.0/22,\n\t\t\t103.20.68.0/22,\n\t\t\t103.20.112.0/22,\n\t\t\t103.20.128.0/22,\n\t\t\t103.20.160.0/22,\n\t\t\t103.20.248.0/22,\n\t\t\t103.21.98.0/23,\n\t\t\t103.21.102.0/23,\n\t\t\t103.21.112.0/21,\n\t\t\t103.21.140.0/22,\n\t\t\t103.21.176.0/22,\n\t\t\t103.21.240.0/22,\n\t\t\t103.22.0.0/18,\n\t\t\t103.22.64.0/19,\n\t\t\t103.22.100.0/22,\n\t\t\t103.22.104.0/21,\n\t\t\t103.22.112.0/20,\n\t\t\t103.22.157.0/24,\n\t\t\t103.22.188.0/22,\n\t\t\t103.22.228.0/22,\n\t\t\t103.22.252.0/22,\n\t\t\t103.23.8.0/22,\n\t\t\t103.23.56.0/22,\n\t\t\t103.23.160.0/21,\n\t\t\t103.23.176.0/22,\n\t\t\t103.23.228.0/22,\n\t\t\t103.24.24.0/22,\n\t\t\t103.24.83.232/31,\n\t\t\t103.24.83.236/30,\n\t\t\t103.24.83.249/32,\n\t\t\t103.24.83.250/32,\n\t\t\t103.24.83.253/32,\n\t\t\t103.24.116.0/22,\n\t\t\t103.24.128.0/22,\n\t\t\t103.24.144.0/22,\n\t\t\t103.24.176.0/22,\n\t\t\t103.24.184.0/22,\n\t\t\t103.24.228.0/22,\n\t\t\t103.24.252.0/22,\n\t\t\t103.25.20.0/22,\n\t\t\t103.25.24.0/21,\n\t\t\t103.25.32.0/21,\n\t\t\t103.25.40.0/22,\n\t\t\t103.25.48.0/22,\n\t\t\t103.25.64.0/21,\n\t\t\t103.25.148.0/22,\n\t\t\t103.25.156.0/22,\n\t\t\t103.25.216.0/22,\n\t\t\t103.26.0.0/22,\n\t\t\t103.26.64.0/22,\n\t\t\t103.26.76.0/22,\n\t\t\t103.26.132.0/22,\n\t\t\t103.26.156.0/22,\n\t\t\t103.26.160.0/22,\n\t\t\t103.26.228.0/22,\n\t\t\t103.26.240.0/22,\n\t\t\t103.27.4.0/22,\n\t\t\t103.27.12.0/22,\n\t\t\t103.27.24.0/22,\n\t\t\t103.27.56.0/22,\n\t\t\t103.27.96.0/22,\n\t\t\t103.27.240.0/22,\n\t\t\t103.28.4.0/22,\n\t\t\t103.28.8.0/22,\n\t\t\t103.28.147.0/24,\n\t\t\t103.28.184.0/22,\n\t\t\t103.28.204.0/22,\n\t\t\t103.28.212.0/22,\n\t\t\t103.29.16.0/22,\n\t\t\t103.29.24.0/23,\n\t\t\t103.29.29.0/24,\n\t\t\t103.29.128.0/21,\n\t\t\t103.29.136.0/22,\n\t\t\t103.29.236.0/23,\n\t\t\t103.30.20.0/22,\n\t\t\t103.30.96.0/22,\n\t\t\t103.30.104.0/22,\n\t\t\t103.30.148.0/22,\n\t\t\t103.30.228.0/22,\n\t\t\t103.30.236.0/22,\n\t\t\t103.31.0.0/22,\n\t\t\t103.31.48.0/20,\n\t\t\t103.31.64.0/21,\n\t\t\t103.31.148.0/22,\n\t\t\t103.31.160.0/22,\n\t\t\t103.31.168.0/22,\n\t\t\t103.31.200.0/22,\n\t\t\t103.31.236.0/22,\n\t\t\t103.31.242.0/23,\n\t\t\t103.32.0.0/15,\n\t\t\t103.34.0.0/16,\n\t\t\t103.35.0.0/19,\n\t\t\t103.35.32.0/20,\n\t\t\t103.35.48.0/22,\n\t\t\t103.35.104.0/22,\n\t\t\t103.35.220.0/22,\n\t\t\t103.35.254.0/24,\n\t\t\t103.36.28.0/22,\n\t\t\t103.36.36.0/22,\n\t\t\t103.36.56.0/21,\n\t\t\t103.36.64.0/22,\n\t\t\t103.36.72.0/22,\n\t\t\t103.36.96.0/22,\n\t\t\t103.36.132.0/22,\n\t\t\t103.36.136.0/22,\n\t\t\t103.36.160.0/19,\n\t\t\t103.36.192.0/19,\n\t\t\t103.36.224.0/20,\n\t\t\t103.36.240.0/21,\n\t\t\t103.37.12.0/22,\n\t\t\t103.37.16.0/22,\n\t\t\t103.37.24.0/22,\n\t\t\t103.37.44.0/22,\n\t\t\t103.37.52.0/22,\n\t\t\t103.37.56.0/22,\n\t\t\t103.37.72.0/22,\n\t\t\t103.37.100.0/22,\n\t\t\t103.37.104.0/22,\n\t\t\t103.37.136.0/21,\n\t\t\t103.37.144.0/20,\n\t\t\t103.37.160.0/21,\n\t\t\t103.37.172.0/22,\n\t\t\t103.37.176.0/22,\n\t\t\t103.37.188.0/22,\n\t\t\t103.37.208.0/20,\n\t\t\t103.37.252.0/22,\n\t\t\t103.38.0.0/22,\n\t\t\t103.38.32.0/22,\n\t\t\t103.38.40.0/21,\n\t\t\t103.38.56.0/22,\n\t\t\t103.38.76.0/22,\n\t\t\t103.38.84.0/22,\n\t\t\t103.38.92.0/22,\n\t\t\t103.38.96.0/22,\n\t\t\t103.38.116.0/22,\n\t\t\t103.38.132.0/22,\n\t\t\t103.38.140.0/22,\n\t\t\t103.38.224.0/21,\n\t\t\t103.38.232.0/22,\n\t\t\t103.38.252.0/23,\n\t\t\t103.39.64.0/22,\n\t\t\t103.39.88.0/22,\n\t\t\t103.39.100.0/22,\n\t\t\t103.39.104.0/22,\n\t\t\t103.39.160.0/19,\n\t\t\t103.39.200.0/21,\n\t\t\t103.39.208.0/20,\n\t\t\t103.39.224.0/21,\n\t\t\t103.39.232.0/22,\n\t\t\t103.40.12.0/22,\n\t\t\t103.40.16.0/20,\n\t\t\t103.40.32.0/20,\n\t\t\t103.40.88.0/22,\n\t\t\t103.40.158.0/23,\n\t\t\t103.40.173.0/24,\n\t\t\t103.40.174.0/23,\n\t\t\t103.40.192.0/22,\n\t\t\t103.40.212.0/22,\n\t\t\t103.40.220.0/22,\n\t\t\t103.40.228.0/22,\n\t\t\t103.40.232.0/21,\n\t\t\t103.40.240.0/20,\n\t\t\t103.41.0.0/22,\n\t\t\t103.41.52.0/22,\n\t\t\t103.41.116.0/22,\n\t\t\t103.41.127.0/24,\n\t\t\t103.41.140.0/25,\n\t\t\t103.41.140.128/28,\n\t\t\t103.41.140.144/29,\n\t\t\t103.41.140.154/31,\n\t\t\t103.41.140.158/31,\n\t\t\t103.41.140.162/31,\n\t\t\t103.41.140.166/31,\n\t\t\t103.41.140.168/29,\n\t\t\t103.41.140.176/28,\n\t\t\t103.41.140.192/26,\n\t\t\t103.41.141.0/24,\n\t\t\t103.41.142.0/23,\n\t\t\t103.41.148.0/22,\n\t\t\t103.41.152.0/22,\n\t\t\t103.41.160.0/21,\n\t\t\t103.41.220.0/22,\n\t\t\t103.41.224.0/21,\n\t\t\t103.41.232.0/22,\n\t\t\t103.42.8.0/22,\n\t\t\t103.42.24.0/22,\n\t\t\t103.42.32.0/22,\n\t\t\t103.42.64.0/21,\n\t\t\t103.42.76.0/22,\n\t\t\t103.42.104.0/22,\n\t\t\t103.42.232.0/22,\n\t\t\t103.43.96.0/21,\n\t\t\t103.43.105.0/24,\n\t\t\t103.43.106.0/23,\n\t\t\t103.43.124.0/22,\n\t\t\t103.43.132.0/22,\n\t\t\t103.43.184.0/22,\n\t\t\t103.43.192.0/21,\n\t\t\t103.43.208.0/22,\n\t\t\t103.43.220.0/22,\n\t\t\t103.43.224.0/22,\n\t\t\t103.43.240.0/22,\n\t\t\t103.44.56.0/22,\n\t\t\t103.44.80.0/22,\n\t\t\t103.44.120.0/21,\n\t\t\t103.44.144.0/22,\n\t\t\t103.44.168.0/22,\n\t\t\t103.44.176.0/20,\n\t\t\t103.44.192.0/22,\n\t\t\t103.44.196.0/23,\n\t\t\t103.44.199.0/24,\n\t\t\t103.44.200.0/21,\n\t\t\t103.44.224.0/22,\n\t\t\t103.44.236.0/22,\n\t\t\t103.44.240.0/20,\n\t\t\t103.45.0.0/19,\n\t\t\t103.45.32.0/21,\n\t\t\t103.45.41.0/24,\n\t\t\t103.45.42.0/23,\n\t\t\t103.45.44.0/22,\n\t\t\t103.45.48.0/20,\n\t\t\t103.45.72.0/21,\n\t\t\t103.45.80.0/20,\n\t\t\t103.45.96.0/19,\n\t\t\t103.45.128.0/18,\n\t\t\t103.45.192.0/19,\n\t\t\t103.45.224.0/22,\n\t\t\t103.45.248.0/22,\n\t\t\t103.46.0.0/22,\n\t\t\t103.46.12.0/22,\n\t\t\t103.46.16.0/20,\n\t\t\t103.46.32.0/19,\n\t\t\t103.46.64.0/18,\n\t\t\t103.46.128.0/21,\n\t\t\t103.46.136.0/22,\n\t\t\t103.46.152.0/21,\n\t\t\t103.46.160.0/20,\n\t\t\t103.46.176.0/21,\n\t\t\t103.46.244.0/22,\n\t\t\t103.46.248.0/22,\n\t\t\t103.47.4.0/22,\n\t\t\t103.47.20.0/22,\n\t\t\t103.47.36.0/22,\n\t\t\t103.47.40.0/22,\n\t\t\t103.47.48.0/22,\n\t\t\t103.47.80.0/22,\n\t\t\t103.47.96.0/22,\n\t\t\t103.47.116.0/22,\n\t\t\t103.47.120.0/22,\n\t\t\t103.47.136.0/21,\n\t\t\t103.47.212.0/22,\n\t\t\t103.48.52.0/22,\n\t\t\t103.48.92.0/22,\n\t\t\t103.48.148.0/22,\n\t\t\t103.48.152.0/22,\n\t\t\t103.48.202.0/23,\n\t\t\t103.48.216.0/21,\n\t\t\t103.48.224.0/20,\n\t\t\t103.48.240.0/21,\n\t\t\t103.49.12.0/22,\n\t\t\t103.49.20.0/22,\n\t\t\t103.49.72.0/21,\n\t\t\t103.49.96.0/22,\n\t\t\t103.49.108.0/22,\n\t\t\t103.49.176.0/21,\n\t\t\t103.49.196.0/22,\n\t\t\t103.49.212.0/24,\n\t\t\t103.49.214.0/24,\n\t\t\t103.50.36.0/22,\n\t\t\t103.50.44.0/22,\n\t\t\t103.50.48.0/20,\n\t\t\t103.50.64.0/21,\n\t\t\t103.50.72.0/22,\n\t\t\t103.50.108.0/22,\n\t\t\t103.50.112.0/20,\n\t\t\t103.50.132.0/22,\n\t\t\t103.50.136.0/21,\n\t\t\t103.50.172.0/22,\n\t\t\t103.50.176.0/20,\n\t\t\t103.50.192.0/21,\n\t\t\t103.50.200.0/22,\n\t\t\t103.50.220.0/22,\n\t\t\t103.50.224.0/20,\n\t\t\t103.50.240.0/21,\n\t\t\t103.50.248.0/22,\n\t\t\t103.51.62.0/23,\n\t\t\t103.52.40.0/22,\n\t\t\t103.52.72.0/23,\n\t\t\t103.52.74.0/25,\n\t\t\t103.52.74.128/26,\n\t\t\t103.52.74.192/27,\n\t\t\t103.52.74.224/28,\n\t\t\t103.52.74.240/30,\n\t\t\t103.52.74.252/30,\n\t\t\t103.52.75.0/24,\n\t\t\t103.52.76.0/30,\n\t\t\t103.52.76.8/29,\n\t\t\t103.52.76.20/30,\n\t\t\t103.52.76.32/29,\n\t\t\t103.52.76.40/30,\n\t\t\t103.52.76.44/31,\n\t\t\t103.52.76.48/29,\n\t\t\t103.52.76.56/30,\n\t\t\t103.52.76.64/26,\n\t\t\t103.52.76.128/26,\n\t\t\t103.52.76.192/27,\n\t\t\t103.52.76.224/29,\n\t\t\t103.52.76.232/30,\n\t\t\t103.52.76.244/30,\n\t\t\t103.52.76.248/29,\n\t\t\t103.52.77.0/28,\n\t\t\t103.52.77.16/29,\n\t\t\t103.52.77.24/30,\n\t\t\t103.52.77.32/27,\n\t\t\t103.52.77.64/28,\n\t\t\t103.52.77.80/29,\n\t\t\t103.52.77.92/30,\n\t\t\t103.52.77.96/27,\n\t\t\t103.52.77.128/27,\n\t\t\t103.52.77.160/28,\n\t\t\t103.52.77.176/29,\n\t\t\t103.52.77.188/30,\n\t\t\t103.52.77.192/26,\n\t\t\t103.52.78.4/30,\n\t\t\t103.52.78.8/29,\n\t\t\t103.52.78.16/28,\n\t\t\t103.52.78.32/29,\n\t\t\t103.52.78.40/30,\n\t\t\t103.52.78.48/30,\n\t\t\t103.52.78.56/29,\n\t\t\t103.52.78.64/30,\n\t\t\t103.52.78.76/30,\n\t\t\t103.52.78.80/28,\n\t\t\t103.52.78.96/29,\n\t\t\t103.52.78.104/30,\n\t\t\t103.52.78.112/28,\n\t\t\t103.52.78.128/28,\n\t\t\t103.52.78.144/29,\n\t\t\t103.52.78.156/30,\n\t\t\t103.52.78.160/29,\n\t\t\t103.52.78.168/30,\n\t\t\t103.52.78.176/28,\n\t\t\t103.52.78.192/28,\n\t\t\t103.52.78.212/30,\n\t\t\t103.52.78.216/29,\n\t\t\t103.52.78.232/29,\n\t\t\t103.52.78.240/28,\n\t\t\t103.52.79.0/27,\n\t\t\t103.52.79.32/29,\n\t\t\t103.52.79.40/30,\n\t\t\t103.52.79.48/28,\n\t\t\t103.52.79.64/26,\n\t\t\t103.52.79.128/25,\n\t\t\t103.52.80.0/21,\n\t\t\t103.52.96.0/21,\n\t\t\t103.52.104.0/22,\n\t\t\t103.52.160.0/21,\n\t\t\t103.52.172.0/22,\n\t\t\t103.52.176.0/22,\n\t\t\t103.52.184.0/22,\n\t\t\t103.52.196.0/22,\n\t\t\t103.53.64.0/21,\n\t\t\t103.53.92.0/22,\n\t\t\t103.53.100.0/22,\n\t\t\t103.53.124.0/22,\n\t\t\t103.53.128.0/20,\n\t\t\t103.53.144.0/22,\n\t\t\t103.53.181.0/24,\n\t\t\t103.53.182.0/23,\n\t\t\t103.53.204.0/22,\n\t\t\t103.53.208.0/21,\n\t\t\t103.53.236.0/22,\n\t\t\t103.53.248.0/22,\n\t\t\t103.54.8.0/22,\n\t\t\t103.54.48.0/22,\n\t\t\t103.54.160.0/21,\n\t\t\t103.54.212.0/22,\n\t\t\t103.54.240.0/22,\n\t\t\t103.55.5.35/32,\n\t\t\t103.55.5.73/32,\n\t\t\t103.55.80.0/22,\n\t\t\t103.55.120.0/22,\n\t\t\t103.55.152.0/22,\n\t\t\t103.55.172.0/22,\n\t\t\t103.55.204.0/22,\n\t\t\t103.55.208.0/22,\n\t\t\t103.55.228.0/22,\n\t\t\t103.55.236.0/22,\n\t\t\t103.56.20.0/22,\n\t\t\t103.56.32.0/22,\n\t\t\t103.56.56.0/21,\n\t\t\t103.56.72.0/21,\n\t\t\t103.56.94.0/23,\n\t\t\t103.56.100.0/22,\n\t\t\t103.56.104.0/22,\n\t\t\t103.56.140.0/22,\n\t\t\t103.56.152.0/22,\n\t\t\t103.56.184.0/22,\n\t\t\t103.56.200.0/22,\n\t\t\t103.57.12.0/22,\n\t\t\t103.57.52.0/22,\n\t\t\t103.57.56.0/22,\n\t\t\t103.57.76.0/22,\n\t\t\t103.57.136.0/22,\n\t\t\t103.57.196.0/22,\n\t\t\t103.58.24.0/22,\n\t\t\t103.59.76.0/22,\n\t\t\t103.59.112.0/21,\n\t\t\t103.59.120.0/23,\n\t\t\t103.59.124.0/22,\n\t\t\t103.59.128.0/22,\n\t\t\t103.59.148.0/22,\n\t\t\t103.59.164.0/22,\n\t\t\t103.59.168.0/23,\n\t\t\t103.60.32.0/22,\n\t\t\t103.60.44.0/22,\n\t\t\t103.60.164.0/22,\n\t\t\t103.60.228.0/22,\n\t\t\t103.60.236.0/22,\n\t\t\t103.61.60.0/22,\n\t\t\t103.61.104.0/22,\n\t\t\t103.61.140.0/22,\n\t\t\t103.61.152.0/21,\n\t\t\t103.61.160.0/22,\n\t\t\t103.61.172.0/22,\n\t\t\t103.61.176.0/22,\n\t\t\t103.61.188.0/22,\n\t\t\t103.62.24.0/22,\n\t\t\t103.62.72.0/21,\n\t\t\t103.62.80.0/21,\n\t\t\t103.62.88.0/22,\n\t\t\t103.62.96.0/19,\n\t\t\t103.62.128.0/21,\n\t\t\t103.62.156.0/22,\n\t\t\t103.62.160.0/19,\n\t\t\t103.62.192.0/22,\n\t\t\t103.62.204.0/22,\n\t\t\t103.62.208.0/20,\n\t\t\t103.62.224.0/22,\n\t\t\t103.63.32.0/19,\n\t\t\t103.63.64.0/20,\n\t\t\t103.63.80.0/21,\n\t\t\t103.63.88.0/22,\n\t\t\t103.63.140.0/22,\n\t\t\t103.63.144.0/22,\n\t\t\t103.63.152.0/22,\n\t\t\t103.63.160.0/20,\n\t\t\t103.63.176.0/21,\n\t\t\t103.63.184.0/22,\n\t\t\t103.63.192.0/20,\n\t\t\t103.63.208.0/22,\n\t\t\t103.63.240.0/20,\n\t\t\t103.64.0.0/21,\n\t\t\t103.64.24.0/21,\n\t\t\t103.64.32.0/19,\n\t\t\t103.64.64.0/18,\n\t\t\t103.64.140.0/22,\n\t\t\t103.64.144.0/22,\n\t\t\t103.64.152.0/21,\n\t\t\t103.64.160.0/19,\n\t\t\t103.64.192.0/18,\n\t\t\t103.65.0.0/20,\n\t\t\t103.65.16.0/22,\n\t\t\t103.65.48.0/20,\n\t\t\t103.65.64.0/19,\n\t\t\t103.65.100.0/22,\n\t\t\t103.65.104.0/21,\n\t\t\t103.65.112.0/22,\n\t\t\t103.65.144.0/20,\n\t\t\t103.65.160.0/20,\n\t\t\t103.65.204.0/22,\n\t\t\t103.65.224.0/23,\n\t\t\t103.66.32.0/22,\n\t\t\t103.66.40.0/22,\n\t\t\t103.66.108.0/22,\n\t\t\t103.66.200.0/22,\n\t\t\t103.66.240.0/20,\n\t\t\t103.67.0.0/21,\n\t\t\t103.67.8.0/22,\n\t\t\t103.67.100.0/22,\n\t\t\t103.67.104.0/21,\n\t\t\t103.67.112.0/20,\n\t\t\t103.67.128.0/20,\n\t\t\t103.67.144.0/21,\n\t\t\t103.67.172.0/24,\n\t\t\t103.67.175.0/24,\n\t\t\t103.67.192.0/22,\n\t\t\t103.67.212.0/22,\n\t\t\t103.68.88.0/22,\n\t\t\t103.68.100.0/22,\n\t\t\t103.68.128.0/22,\n\t\t\t103.69.16.0/22,\n\t\t\t103.69.62.0/23,\n\t\t\t103.69.116.0/22,\n\t\t\t103.70.8.0/22,\n\t\t\t103.70.14.0/23,\n\t\t\t103.70.148.0/22,\n\t\t\t103.70.220.0/22,\n\t\t\t103.70.236.0/22,\n\t\t\t103.70.252.0/22,\n\t\t\t103.71.0.0/22,\n\t\t\t103.71.68.0/22,\n\t\t\t103.71.72.0/22,\n\t\t\t103.71.80.0/21,\n\t\t\t103.71.88.0/22,\n\t\t\t103.71.120.0/21,\n\t\t\t103.71.128.0/22,\n\t\t\t103.71.196.0/22,\n\t\t\t103.71.200.0/22,\n\t\t\t103.71.232.0/22,\n\t\t\t103.72.12.0/22,\n\t\t\t103.72.16.0/20,\n\t\t\t103.72.32.0/20,\n\t\t\t103.72.48.0/21,\n\t\t\t103.72.112.0/21,\n\t\t\t103.72.121.0/24,\n\t\t\t103.72.123.0/24,\n\t\t\t103.72.124.0/22,\n\t\t\t103.72.128.0/21,\n\t\t\t103.72.172.0/22,\n\t\t\t103.72.180.0/22,\n\t\t\t103.72.224.0/19,\n\t\t\t103.73.0.0/19,\n\t\t\t103.73.48.0/22,\n\t\t\t103.73.99.0/24,\n\t\t\t103.73.116.0/22,\n\t\t\t103.73.120.0/22,\n\t\t\t103.73.128.0/20,\n\t\t\t103.73.144.0/22,\n\t\t\t103.73.168.0/22,\n\t\t\t103.73.176.0/22,\n\t\t\t103.73.204.0/22,\n\t\t\t103.73.208.0/22,\n\t\t\t103.73.244.0/22,\n\t\t\t103.73.248.0/22,\n\t\t\t103.74.24.0/21,\n\t\t\t103.74.32.0/20,\n\t\t\t103.74.48.0/22,\n\t\t\t103.74.56.0/21,\n\t\t\t103.74.80.0/22,\n\t\t\t103.74.124.0/22,\n\t\t\t103.74.148.0/22,\n\t\t\t103.74.152.0/21,\n\t\t\t103.74.204.0/22,\n\t\t\t103.74.232.0/22,\n\t\t\t103.75.83.0/24,\n\t\t\t103.75.88.0/21,\n\t\t\t103.75.104.0/21,\n\t\t\t103.75.112.0/22,\n\t\t\t103.75.120.0/22,\n\t\t\t103.75.128.0/22,\n\t\t\t103.75.144.0/22,\n\t\t\t103.75.152.0/22,\n\t\t\t103.76.60.0/22,\n\t\t\t103.76.64.0/21,\n\t\t\t103.76.72.0/22,\n\t\t\t103.76.92.0/22,\n\t\t\t103.76.216.0/21,\n\t\t\t103.76.224.0/22,\n\t\t\t103.77.28.0/22,\n\t\t\t103.77.52.0/22,\n\t\t\t103.77.56.0/22,\n\t\t\t103.77.72.0/22,\n\t\t\t103.77.88.0/21,\n\t\t\t103.77.132.0/22,\n\t\t\t103.77.148.0/22,\n\t\t\t103.77.220.0/22,\n\t\t\t103.78.56.0/21,\n\t\t\t103.78.64.0/22,\n\t\t\t103.78.124.0/22,\n\t\t\t103.78.172.0/22,\n\t\t\t103.78.176.0/22,\n\t\t\t103.78.196.0/22,\n\t\t\t103.78.228.0/22,\n\t\t\t103.79.24.0/21,\n\t\t\t103.79.36.0/22,\n\t\t\t103.79.40.0/21,\n\t\t\t103.79.56.0/21,\n\t\t\t103.79.64.0/21,\n\t\t\t103.79.80.0/21,\n\t\t\t103.79.136.0/22,\n\t\t\t103.79.188.0/22,\n\t\t\t103.79.192.0/20,\n\t\t\t103.79.208.0/21,\n\t\t\t103.79.228.0/23,\n\t\t\t103.80.44.0/22,\n\t\t\t103.80.72.0/22,\n\t\t\t103.80.176.0/21,\n\t\t\t103.80.184.0/22,\n\t\t\t103.80.192.0/22,\n\t\t\t103.80.200.0/22,\n\t\t\t103.80.232.0/22,\n\t\t\t103.81.4.0/22,\n\t\t\t103.81.8.0/22,\n\t\t\t103.81.16.0/21,\n\t\t\t103.81.44.0/22,\n\t\t\t103.81.48.0/22,\n\t\t\t103.81.96.0/22,\n\t\t\t103.81.120.0/22,\n\t\t\t103.81.148.0/22,\n\t\t\t103.81.164.0/22,\n\t\t\t103.81.184.0/23,\n\t\t\t103.81.186.0/24,\n\t\t\t103.81.200.0/22,\n\t\t\t103.81.232.0/22,\n\t\t\t103.82.52.0/22,\n\t\t\t103.82.60.0/22,\n\t\t\t103.82.68.0/22,\n\t\t\t103.82.84.0/22,\n\t\t\t103.82.104.0/22,\n\t\t\t103.82.224.0/22,\n\t\t\t103.82.236.0/22,\n\t\t\t103.83.44.0/22,\n\t\t\t103.83.52.0/22,\n\t\t\t103.83.60.0/22,\n\t\t\t103.83.64.0/22,\n\t\t\t103.83.72.0/22,\n\t\t\t103.83.112.0/22,\n\t\t\t103.83.120.0/22,\n\t\t\t103.83.180.0/22,\n\t\t\t103.84.0.0/22,\n\t\t\t103.84.12.0/22,\n\t\t\t103.84.16.0/20,\n\t\t\t103.84.48.0/22,\n\t\t\t103.84.64.0/22,\n\t\t\t103.84.72.0/22,\n\t\t\t103.84.136.0/23,\n\t\t\t103.84.138.0/24,\n\t\t\t103.84.170.0/23,\n\t\t\t103.85.44.0/22,\n\t\t\t103.85.48.0/22,\n\t\t\t103.85.84.0/22,\n\t\t\t103.85.136.0/22,\n\t\t\t103.85.144.0/22,\n\t\t\t103.85.164.0/22,\n\t\t\t103.85.168.0/21,\n\t\t\t103.85.176.0/22,\n\t\t\t103.85.186.0/23,\n\t\t\t103.86.28.0/22,\n\t\t\t103.86.32.0/22,\n\t\t\t103.86.60.0/22,\n\t\t\t103.86.80.0/22,\n\t\t\t103.86.204.0/22,\n\t\t\t103.86.208.0/20,\n\t\t\t103.86.224.0/19,\n\t\t\t103.87.0.0/21,\n\t\t\t103.87.20.0/22,\n\t\t\t103.87.32.0/22,\n\t\t\t103.87.96.0/22,\n\t\t\t103.87.132.0/22,\n\t\t\t103.87.180.0/22,\n\t\t\t103.87.224.0/22,\n\t\t\t103.88.4.0/22,\n\t\t\t103.88.8.0/21,\n\t\t\t103.88.16.0/21,\n\t\t\t103.88.32.0/21,\n\t\t\t103.88.60.0/22,\n\t\t\t103.88.64.0/22,\n\t\t\t103.88.72.0/22,\n\t\t\t103.88.96.0/22,\n\t\t\t103.88.164.0/22,\n\t\t\t103.88.212.0/22,\n\t\t\t103.89.28.0/22,\n\t\t\t103.89.96.0/20,\n\t\t\t103.89.112.0/21,\n\t\t\t103.89.148.0/22,\n\t\t\t103.89.172.0/22,\n\t\t\t103.89.184.0/21,\n\t\t\t103.89.192.0/19,\n\t\t\t103.89.224.0/21,\n\t\t\t103.90.51.0/24,\n\t\t\t103.90.52.0/22,\n\t\t\t103.90.56.0/23,\n\t\t\t103.90.80.0/22,\n\t\t\t103.90.92.0/22,\n\t\t\t103.90.100.0/22,\n\t\t\t103.90.104.0/21,\n\t\t\t103.90.112.0/20,\n\t\t\t103.90.128.0/21,\n\t\t\t103.90.152.0/22,\n\t\t\t103.90.168.0/22,\n\t\t\t103.90.173.0/24,\n\t\t\t103.90.176.0/22,\n\t\t\t103.90.188.0/22,\n\t\t\t103.90.192.0/22,\n\t\t\t103.91.36.0/22,\n\t\t\t103.91.40.0/22,\n\t\t\t103.91.108.0/22,\n\t\t\t103.91.112.0/23,\n\t\t\t103.91.138.0/23,\n\t\t\t103.91.152.0/22,\n\t\t\t103.91.176.0/22,\n\t\t\t103.91.200.0/22,\n\t\t\t103.91.208.0/21,\n\t\t\t103.91.236.0/22,\n\t\t\t103.91.252.0/22,\n\t\t\t103.92.0.0/21,\n\t\t\t103.92.8.0/22,\n\t\t\t103.92.12.0/23,\n\t\t\t103.92.48.0/20,\n\t\t\t103.92.64.0/20,\n\t\t\t103.92.80.0/22,\n\t\t\t103.92.88.0/22,\n\t\t\t103.92.108.0/22,\n\t\t\t103.92.124.0/22,\n\t\t\t103.92.132.0/24,\n\t\t\t103.92.134.0/23,\n\t\t\t103.92.156.0/22,\n\t\t\t103.92.164.0/22,\n\t\t\t103.92.168.0/21,\n\t\t\t103.92.176.0/20,\n\t\t\t103.92.192.0/22,\n\t\t\t103.92.236.0/22,\n\t\t\t103.92.240.0/20,\n\t\t\t103.93.0.0/21,\n\t\t\t103.93.28.0/22,\n\t\t\t103.93.84.0/22,\n\t\t\t103.93.142.0/23,\n\t\t\t103.93.152.0/22,\n\t\t\t103.93.180.0/22,\n\t\t\t103.93.204.0/22,\n\t\t\t103.94.12.0/22,\n\t\t\t103.94.20.0/22,\n\t\t\t103.94.32.0/20,\n\t\t\t103.94.72.0/22,\n\t\t\t103.94.88.0/22,\n\t\t\t103.94.116.0/22,\n\t\t\t103.94.160.0/22,\n\t\t\t103.94.200.0/22,\n\t\t\t103.95.52.0/22,\n\t\t\t103.95.68.0/22,\n\t\t\t103.95.88.0/21,\n\t\t\t103.95.136.0/21,\n\t\t\t103.95.144.0/22,\n\t\t\t103.95.152.0/22,\n\t\t\t103.95.216.0/21,\n\t\t\t103.95.224.0/22,\n\t\t\t103.95.236.0/22,\n\t\t\t103.95.240.0/20,\n\t\t\t103.96.8.0/22,\n\t\t\t103.96.124.0/22,\n\t\t\t103.96.136.0/22,\n\t\t\t103.96.152.0/21,\n\t\t\t103.96.160.0/19,\n\t\t\t103.96.192.0/20,\n\t\t\t103.96.208.0/21,\n\t\t\t103.96.216.0/22,\n\t\t\t103.96.224.0/23,\n\t\t\t103.97.16.0/20,\n\t\t\t103.97.40.0/22,\n\t\t\t103.97.60.0/22,\n\t\t\t103.97.64.0/21,\n\t\t\t103.97.112.0/21,\n\t\t\t103.97.144.0/21,\n\t\t\t103.97.188.0/22,\n\t\t\t103.97.192.0/22,\n\t\t\t103.98.0.0/23,\n\t\t\t103.98.15.0/24,\n\t\t\t103.98.40.0/21,\n\t\t\t103.98.48.0/22,\n\t\t\t103.98.56.0/22,\n\t\t\t103.98.80.0/22,\n\t\t\t103.98.88.0/21,\n\t\t\t103.98.96.0/21,\n\t\t\t103.98.124.0/22,\n\t\t\t103.98.136.0/21,\n\t\t\t103.98.144.0/22,\n\t\t\t103.98.164.0/22,\n\t\t\t103.98.168.0/22,\n\t\t\t103.98.180.0/22,\n\t\t\t103.98.196.0/22,\n\t\t\t103.98.216.0/21,\n\t\t\t103.98.224.0/21,\n\t\t\t103.98.232.0/22,\n\t\t\t103.98.240.0/21,\n\t\t\t103.98.248.0/23,\n\t\t\t103.98.251.0/24,\n\t\t\t103.98.252.0/22,\n\t\t\t103.99.40.0/23,\n\t\t\t103.99.56.0/22,\n\t\t\t103.99.104.0/22,\n\t\t\t103.99.116.0/22,\n\t\t\t103.99.120.0/22,\n\t\t\t103.99.152.0/22,\n\t\t\t103.99.220.0/22,\n\t\t\t103.99.232.0/21,\n\t\t\t103.100.0.0/22,\n\t\t\t103.100.32.0/22,\n\t\t\t103.100.40.0/22,\n\t\t\t103.100.48.0/22,\n\t\t\t103.100.56.0/22,\n\t\t\t103.100.64.0/22,\n\t\t\t103.100.88.0/22,\n\t\t\t103.100.116.0/22,\n\t\t\t103.100.144.0/22,\n\t\t\t103.100.240.0/22,\n\t\t\t103.100.248.0/21,\n\t\t\t103.101.8.0/21,\n\t\t\t103.101.60.0/22,\n\t\t\t103.101.121.0/24,\n\t\t\t103.101.122.0/23,\n\t\t\t103.101.124.0/22,\n\t\t\t103.101.144.0/21,\n\t\t\t103.101.180.0/22,\n\t\t\t103.101.184.0/22,\n\t\t\t103.102.76.0/22,\n\t\t\t103.102.80.0/22,\n\t\t\t103.102.168.0/21,\n\t\t\t103.102.180.0/22,\n\t\t\t103.102.184.0/21,\n\t\t\t103.102.192.0/21,\n\t\t\t103.102.200.0/22,\n\t\t\t103.102.208.0/21,\n\t\t\t103.103.12.0/22,\n\t\t\t103.103.16.0/22,\n\t\t\t103.103.36.0/22,\n\t\t\t103.103.68.0/22,\n\t\t\t103.103.72.0/22,\n\t\t\t103.103.188.0/22,\n\t\t\t103.103.200.0/21,\n\t\t\t103.103.221.0/24,\n\t\t\t103.103.222.0/23,\n\t\t\t103.103.224.0/21,\n\t\t\t103.103.232.0/22,\n\t\t\t103.103.248.0/21,\n\t\t\t103.104.0.0/21,\n\t\t\t103.104.36.0/22,\n\t\t\t103.104.40.0/22,\n\t\t\t103.104.64.0/22,\n\t\t\t103.104.152.0/22,\n\t\t\t103.104.188.0/22,\n\t\t\t103.104.252.0/22,\n\t\t\t103.105.0.0/21,\n\t\t\t103.105.12.0/22,\n\t\t\t103.105.16.0/22,\n\t\t\t103.105.60.0/22,\n\t\t\t103.105.116.0/22,\n\t\t\t103.105.180.0/22,\n\t\t\t103.105.184.0/22,\n\t\t\t103.105.200.0/21,\n\t\t\t103.105.220.0/22,\n\t\t\t103.106.36.0/22,\n\t\t\t103.106.40.0/21,\n\t\t\t103.106.60.0/22,\n\t\t\t103.106.68.0/22,\n\t\t\t103.106.96.0/22,\n\t\t\t103.106.120.0/22,\n\t\t\t103.106.128.0/21,\n\t\t\t103.106.196.0/22,\n\t\t\t103.106.212.0/22,\n\t\t\t103.106.252.0/22,\n\t\t\t103.107.0.0/22,\n\t\t\t103.107.28.0/22,\n\t\t\t103.107.32.0/22,\n\t\t\t103.107.44.0/22,\n\t\t\t103.107.72.0/22,\n\t\t\t103.107.164.0/22,\n\t\t\t103.107.168.0/22,\n\t\t\t103.107.188.0/22,\n\t\t\t103.107.192.0/22,\n\t\t\t103.107.208.0/20,\n\t\t\t103.108.52.0/22,\n\t\t\t103.108.160.0/21,\n\t\t\t103.108.196.0/22,\n\t\t\t103.108.208.0/21,\n\t\t\t103.108.224.0/22,\n\t\t\t103.108.244.0/22,\n\t\t\t103.109.20.0/22,\n\t\t\t103.109.48.0/22,\n\t\t\t103.109.88.0/22,\n\t\t\t103.109.248.0/22,\n\t\t\t103.110.92.0/22,\n\t\t\t103.110.116.0/23,\n\t\t\t103.110.119.0/24,\n\t\t\t103.110.132.0/22,\n\t\t\t103.110.136.0/22,\n\t\t\t103.110.156.0/22,\n\t\t\t103.110.188.0/22,\n\t\t\t103.110.204.0/22,\n\t\t\t103.111.64.0/22,\n\t\t\t103.111.172.0/22,\n\t\t\t103.111.252.0/22,\n\t\t\t103.112.72.0/22,\n\t\t\t103.112.88.0/21,\n\t\t\t103.112.108.0/22,\n\t\t\t103.112.112.0/22,\n\t\t\t103.112.140.0/22,\n\t\t\t103.113.4.0/22,\n\t\t\t103.113.92.0/22,\n\t\t\t103.113.220.0/22,\n\t\t\t103.113.232.0/21,\n\t\t\t103.114.4.0/22,\n\t\t\t103.114.28.0/22,\n\t\t\t103.114.68.0/22,\n\t\t\t103.114.100.0/22,\n\t\t\t103.114.148.0/22,\n\t\t\t103.114.158.0/23,\n\t\t\t103.114.176.0/22,\n\t\t\t103.114.212.0/22,\n\t\t\t103.114.236.0/22,\n\t\t\t103.114.240.0/22,\n\t\t\t103.115.52.0/22,\n\t\t\t103.115.68.0/22,\n\t\t\t103.115.92.0/22,\n\t\t\t103.115.120.0/22,\n\t\t\t103.115.148.0/22,\n\t\t\t103.115.248.0/22,\n\t\t\t103.116.42.0/24,\n\t\t\t103.116.76.0/22,\n\t\t\t103.116.92.0/22,\n\t\t\t103.116.120.0/22,\n\t\t\t103.116.128.0/22,\n\t\t\t103.116.138.0/23,\n\t\t\t103.116.184.0/22,\n\t\t\t103.116.220.0/22,\n\t\t\t103.116.224.0/21,\n\t\t\t103.117.16.0/22,\n\t\t\t103.117.73.0/24,\n\t\t\t103.117.74.0/23,\n\t\t\t103.117.88.0/22,\n\t\t\t103.117.188.0/22,\n\t\t\t103.117.220.0/22,\n\t\t\t103.117.248.0/22,\n\t\t\t103.118.52.0/22,\n\t\t\t103.118.56.0/21,\n\t\t\t103.118.64.0/21,\n\t\t\t103.118.72.0/22,\n\t\t\t103.118.88.0/22,\n\t\t\t103.118.173.0/24,\n\t\t\t103.119.28.0/22,\n\t\t\t103.119.104.0/22,\n\t\t\t103.119.115.0/24,\n\t\t\t103.119.156.0/22,\n\t\t\t103.119.180.0/22,\n\t\t\t103.119.200.0/22,\n\t\t\t103.119.224.0/22,\n\t\t\t103.120.52.0/22,\n\t\t\t103.120.72.0/22,\n\t\t\t103.120.88.0/22,\n\t\t\t103.120.96.0/22,\n\t\t\t103.120.140.0/22,\n\t\t\t103.120.196.0/22,\n\t\t\t103.120.224.0/22,\n\t\t\t103.121.52.0/22,\n\t\t\t103.121.160.0/21,\n\t\t\t103.121.250.0/24,\n\t\t\t103.121.252.0/22,\n\t\t\t103.122.48.0/22,\n\t\t\t103.122.192.0/22,\n\t\t\t103.122.240.0/23,\n\t\t\t103.122.242.0/24,\n\t\t\t103.123.4.0/22,\n\t\t\t103.123.56.0/22,\n\t\t\t103.123.88.0/21,\n\t\t\t103.123.116.0/22,\n\t\t\t103.123.176.0/22,\n\t\t\t103.123.200.0/21,\n\t\t\t103.123.208.0/21,\n\t\t\t103.124.24.0/22,\n\t\t\t103.124.48.0/22,\n\t\t\t103.124.64.0/22,\n\t\t\t103.124.182.0/23,\n\t\t\t103.124.212.0/22,\n\t\t\t103.124.216.0/22,\n\t\t\t103.125.20.0/22,\n\t\t\t103.125.44.0/22,\n\t\t\t103.125.132.0/22,\n\t\t\t103.125.164.0/22,\n\t\t\t103.125.196.0/22,\n\t\t\t103.125.236.0/22,\n\t\t\t103.125.249.0/24,\n\t\t\t103.125.250.0/23,\n\t\t\t103.126.0.0/22,\n\t\t\t103.126.16.0/23,\n\t\t\t103.126.44.0/22,\n\t\t\t103.126.101.0/24,\n\t\t\t103.126.102.0/23,\n\t\t\t103.126.124.0/22,\n\t\t\t103.126.128.0/22,\n\t\t\t103.129.55.0/24,\n\t\t\t103.130.132.0/22,\n\t\t\t103.130.160.0/22,\n\t\t\t103.130.228.0/22,\n\t\t\t103.131.20.0/22,\n\t\t\t103.131.36.0/22,\n\t\t\t103.131.138.0/23,\n\t\t\t103.131.152.0/22,\n\t\t\t103.131.168.0/22,\n\t\t\t103.131.177.0/24,\n\t\t\t103.131.179.0/24,\n\t\t\t103.131.224.0/21,\n\t\t\t103.131.240.0/22,\n\t\t\t103.132.22.0/23,\n\t\t\t103.132.60.0/22,\n\t\t\t103.132.64.0/20,\n\t\t\t103.132.80.0/22,\n\t\t\t103.132.104.0/21,\n\t\t\t103.132.112.0/21,\n\t\t\t103.132.120.0/22,\n\t\t\t103.132.188.0/22,\n\t\t\t103.132.208.0/21,\n\t\t\t103.132.234.0/23,\n\t\t\t103.133.12.0/22,\n\t\t\t103.133.40.0/22,\n\t\t\t103.133.128.0/22,\n\t\t\t103.133.176.0/22,\n\t\t\t103.133.232.0/22,\n\t\t\t103.134.196.0/22,\n\t\t\t103.134.232.0/23,\n\t\t\t103.135.80.0/22,\n\t\t\t103.135.124.0/22,\n\t\t\t103.135.148.0/22,\n\t\t\t103.135.156.0/22,\n\t\t\t103.135.160.0/21,\n\t\t\t103.135.176.0/22,\n\t\t\t103.135.184.0/22,\n\t\t\t103.135.192.0/21,\n\t\t\t103.135.236.0/22,\n\t\t\t103.136.128.0/22,\n\t\t\t103.136.232.0/22,\n\t\t\t103.137.58.0/23,\n\t\t\t103.137.60.0/24,\n\t\t\t103.137.136.0/23,\n\t\t\t103.137.180.0/22,\n\t\t\t103.137.236.0/22,\n\t\t\t103.138.2.0/23,\n\t\t\t103.138.135.0/24,\n\t\t\t103.138.156.0/23,\n\t\t\t103.138.208.0/23,\n\t\t\t103.138.220.0/23,\n\t\t\t103.138.248.0/23,\n\t\t\t103.139.22.0/23,\n\t\t\t103.139.134.0/23,\n\t\t\t103.139.136.0/23,\n\t\t\t103.139.172.0/23,\n\t\t\t103.139.204.0/23,\n\t\t\t103.139.212.0/23,\n\t\t\t103.140.14.0/23,\n\t\t\t103.140.140.0/23,\n\t\t\t103.140.152.0/23,\n\t\t\t103.140.192.0/23,\n\t\t\t103.140.228.0/23,\n\t\t\t103.141.10.0/23,\n\t\t\t103.141.58.0/23,\n\t\t\t103.141.128.0/23,\n\t\t\t103.141.186.0/23,\n\t\t\t103.141.242.0/23,\n\t\t\t103.142.28.0/23,\n\t\t\t103.142.58.0/23,\n\t\t\t103.142.82.0/23,\n\t\t\t103.142.96.0/23,\n\t\t\t103.142.122.0/23,\n\t\t\t103.142.128.0/23,\n\t\t\t103.142.154.0/23,\n\t\t\t103.142.156.0/23,\n\t\t\t103.142.172.0/23,\n\t\t\t103.142.180.0/23,\n\t\t\t103.142.186.0/23,\n\t\t\t103.142.220.0/23,\n\t\t\t103.142.234.0/23,\n\t\t\t103.142.238.0/23,\n\t\t\t103.143.16.0/22,\n\t\t\t103.143.74.0/23,\n\t\t\t103.143.124.0/23,\n\t\t\t103.143.132.0/22,\n\t\t\t103.143.174.0/23,\n\t\t\t103.143.228.0/23,\n\t\t\t103.144.52.0/23,\n\t\t\t103.144.66.0/23,\n\t\t\t103.144.70.0/23,\n\t\t\t103.144.72.0/23,\n\t\t\t103.144.136.0/23,\n\t\t\t103.144.158.0/23,\n\t\t\t103.145.38.0/23,\n\t\t\t103.145.42.0/23,\n\t\t\t103.145.90.0/24,\n\t\t\t103.145.92.0/24,\n\t\t\t103.145.98.0/23,\n\t\t\t103.145.188.0/23,\n\t\t\t103.146.72.0/23,\n\t\t\t103.146.91.0/24,\n\t\t\t103.146.126.0/23,\n\t\t\t103.146.138.0/23,\n\t\t\t103.146.236.0/23,\n\t\t\t103.146.252.0/23,\n\t\t\t103.147.124.0/23,\n\t\t\t103.147.206.0/23,\n\t\t\t103.148.174.0/23,\n\t\t\t103.149.6.0/23,\n\t\t\t103.149.17.0/24,\n\t\t\t103.149.44.0/23,\n\t\t\t103.149.210.0/23,\n\t\t\t103.149.214.0/23,\n\t\t\t103.149.220.0/23,\n\t\t\t103.149.242.0/23,\n\t\t\t103.149.244.0/22,\n\t\t\t103.150.10.0/23,\n\t\t\t103.150.24.0/23,\n\t\t\t103.150.66.0/23,\n\t\t\t103.150.72.0/23,\n\t\t\t103.150.122.0/23,\n\t\t\t103.150.126.0/23,\n\t\t\t103.150.128.0/23,\n\t\t\t103.150.146.0/23,\n\t\t\t103.150.164.0/23,\n\t\t\t103.150.172.0/23,\n\t\t\t103.150.181.0/24,\n\t\t\t103.150.200.0/23,\n\t\t\t103.150.212.0/24,\n\t\t\t103.150.216.0/23,\n\t\t\t103.150.244.0/23,\n\t\t\t103.151.4.0/24,\n\t\t\t103.151.142.0/23,\n\t\t\t103.151.148.0/23,\n\t\t\t103.151.158.0/23,\n\t\t\t103.151.216.0/23,\n\t\t\t103.151.228.0/23,\n\t\t\t103.152.28.0/22,\n\t\t\t103.152.56.0/23,\n\t\t\t103.152.76.0/23,\n\t\t\t103.152.120.0/22,\n\t\t\t103.152.152.0/23,\n\t\t\t103.152.168.0/22,\n\t\t\t103.152.186.0/23,\n\t\t\t103.152.192.0/23,\n\t\t\t103.152.200.0/23,\n\t\t\t103.152.208.0/23,\n\t\t\t103.152.224.0/23,\n\t\t\t103.152.250.0/23,\n\t\t\t103.153.36.0/23,\n\t\t\t103.153.100.0/23,\n\t\t\t103.153.114.0/23,\n\t\t\t103.153.122.0/23,\n\t\t\t103.153.132.0/23,\n\t\t\t103.153.138.0/23,\n\t\t\t103.153.146.0/23,\n\t\t\t103.153.160.0/23,\n\t\t\t103.154.18.0/23,\n\t\t\t103.154.30.0/23,\n\t\t\t103.154.32.0/23,\n\t\t\t103.154.40.0/23,\n\t\t\t103.154.66.0/23,\n\t\t\t103.154.162.0/23,\n\t\t\t103.154.164.0/23,\n\t\t\t103.154.168.0/23,\n\t\t\t103.155.14.0/23,\n\t\t\t103.155.34.0/23,\n\t\t\t103.155.48.0/23,\n\t\t\t103.155.76.0/23,\n\t\t\t103.155.110.0/23,\n\t\t\t103.155.120.0/23,\n\t\t\t103.155.248.0/23,\n\t\t\t103.156.28.0/23,\n\t\t\t103.156.68.0/23,\n\t\t\t103.156.78.0/23,\n\t\t\t103.156.104.0/23,\n\t\t\t103.156.158.0/23,\n\t\t\t103.156.174.0/23,\n\t\t\t103.156.186.0/23,\n\t\t\t103.156.228.0/23,\n\t\t\t103.157.30.0/23,\n\t\t\t103.157.174.0/23,\n\t\t\t103.157.212.0/23,\n\t\t\t103.157.234.0/23,\n\t\t\t103.157.254.0/23,\n\t\t\t103.158.0.0/23,\n\t\t\t103.158.8.0/23,\n\t\t\t103.158.16.0/23,\n\t\t\t103.158.200.0/23,\n\t\t\t103.158.222.241/32,\n\t\t\t103.158.224.0/23,\n\t\t\t103.159.80.0/23,\n\t\t\t103.159.122.0/23,\n\t\t\t103.159.124.0/23,\n\t\t\t103.159.134.0/23,\n\t\t\t103.159.142.0/23,\n\t\t\t103.160.33.0/24,\n\t\t\t103.160.34.0/23,\n\t\t\t103.160.112.0/22,\n\t\t\t103.160.244.0/23,\n\t\t\t103.160.254.0/23,\n\t\t\t103.161.14.0/23,\n\t\t\t103.161.102.0/23,\n\t\t\t103.161.139.0/24,\n\t\t\t103.161.208.0/23,\n\t\t\t103.161.220.0/23,\n\t\t\t103.161.254.0/23,\n\t\t\t103.162.10.0/23,\n\t\t\t103.162.32.0/23,\n\t\t\t103.162.116.0/23,\n\t\t\t103.163.28.0/23,\n\t\t\t103.163.32.0/23,\n\t\t\t103.163.46.0/23,\n\t\t\t103.163.74.0/23,\n\t\t\t103.163.180.0/23,\n\t\t\t103.164.4.0/23,\n\t\t\t103.164.32.0/23,\n\t\t\t103.164.40.0/22,\n\t\t\t103.164.64.0/23,\n\t\t\t103.164.76.0/23,\n\t\t\t103.164.178.0/23,\n\t\t\t103.165.44.0/23,\n\t\t\t103.165.52.0/23,\n\t\t\t103.165.82.0/23,\n\t\t\t103.165.110.0/23,\n\t\t\t103.166.20.0/23,\n\t\t\t103.166.50.0/23,\n\t\t\t103.166.52.0/22,\n\t\t\t103.166.84.0/23,\n\t\t\t103.166.138.0/23,\n\t\t\t103.167.0.0/23,\n\t\t\t103.167.36.0/23,\n\t\t\t103.167.100.0/23,\n\t\t\t103.168.98.0/23,\n\t\t\t103.168.170.0/23,\n\t\t\t103.169.50.0/23,\n\t\t\t103.169.62.0/23,\n\t\t\t103.169.108.0/23,\n\t\t\t103.169.162.0/23,\n\t\t\t103.169.202.0/23,\n\t\t\t103.170.4.0/23,\n\t\t\t103.170.134.0/23,\n\t\t\t103.170.212.0/23,\n\t\t\t103.171.32.0/23,\n\t\t\t103.171.214.0/23,\n\t\t\t103.172.32.0/23,\n\t\t\t103.172.160.0/25,\n\t\t\t103.172.160.128/26,\n\t\t\t103.172.160.194/31,\n\t\t\t103.172.160.196/30,\n\t\t\t103.172.160.200/29,\n\t\t\t103.172.160.208/28,\n\t\t\t103.172.160.226/31,\n\t\t\t103.172.160.228/31,\n\t\t\t103.172.160.238/31,\n\t\t\t103.172.160.244/30,\n\t\t\t103.172.160.248/29,\n\t\t\t103.172.161.0/25,\n\t\t\t103.172.161.128/26,\n\t\t\t103.172.161.192/30,\n\t\t\t103.172.161.196/31,\n\t\t\t103.172.161.211/32,\n\t\t\t103.172.161.212/30,\n\t\t\t103.172.161.216/30,\n\t\t\t103.172.161.220/31,\n\t\t\t103.172.161.223/32,\n\t\t\t103.172.161.224/32,\n\t\t\t103.172.161.226/31,\n\t\t\t103.172.161.228/31,\n\t\t\t103.172.161.240/28,\n\t\t\t103.172.191.0/24,\n\t\t\t103.173.102.0/23,\n\t\t\t103.173.182.0/23,\n\t\t\t103.173.184.0/23,\n\t\t\t103.174.94.0/23,\n\t\t\t103.175.114.0/23,\n\t\t\t103.175.118.0/23,\n\t\t\t103.175.197.0/24,\n\t\t\t103.176.52.0/23,\n\t\t\t103.176.222.0/23,\n\t\t\t103.176.244.0/23,\n\t\t\t103.177.28.0/23,\n\t\t\t103.177.70.0/23,\n\t\t\t103.177.162.0/24,\n\t\t\t103.178.240.0/23,\n\t\t\t103.179.76.0/22,\n\t\t\t103.180.108.0/23,\n\t\t\t103.180.226.0/23,\n\t\t\t103.181.234.0/23,\n\t\t\t103.182.96.0/23,\n\t\t\t103.183.26.0/23,\n\t\t\t103.183.66.0/23,\n\t\t\t103.183.122.0/23,\n\t\t\t103.183.124.0/23,\n\t\t\t103.184.46.0/23,\n\t\t\t103.184.60.0/23,\n\t\t\t103.185.78.0/23,\n\t\t\t103.185.80.0/23,\n\t\t\t103.186.4.0/23,\n\t\t\t103.186.108.0/23,\n\t\t\t103.186.158.0/23,\n\t\t\t103.186.228.0/23,\n\t\t\t103.189.92.0/23,\n\t\t\t103.189.140.0/23,\n\t\t\t103.189.152.0/22,\n\t\t\t103.190.20.0/23,\n\t\t\t103.190.71.0/24,\n\t\t\t103.190.104.0/23,\n\t\t\t103.190.116.0/22,\n\t\t\t103.190.122.0/23,\n\t\t\t103.191.102.0/23,\n\t\t\t103.191.242.0/23,\n\t\t\t103.192.0.0/19,\n\t\t\t103.192.48.0/21,\n\t\t\t103.192.56.0/22,\n\t\t\t103.192.84.0/22,\n\t\t\t103.192.88.0/21,\n\t\t\t103.192.96.0/20,\n\t\t\t103.192.112.0/22,\n\t\t\t103.192.128.0/21,\n\t\t\t103.192.139.0/24,\n\t\t\t103.192.140.0/22,\n\t\t\t103.192.144.0/22,\n\t\t\t103.192.164.0/22,\n\t\t\t103.192.188.0/22,\n\t\t\t103.192.208.0/21,\n\t\t\t103.192.216.0/22,\n\t\t\t103.192.252.0/22,\n\t\t\t103.193.42.0/23,\n\t\t\t103.193.44.0/22,\n\t\t\t103.193.120.0/22,\n\t\t\t103.193.140.0/22,\n\t\t\t103.193.160.0/22,\n\t\t\t103.193.172.0/23,\n\t\t\t103.193.188.0/22,\n\t\t\t103.193.192.0/22,\n\t\t\t103.193.212.0/22,\n\t\t\t103.193.216.0/21,\n\t\t\t103.193.224.0/20,\n\t\t\t103.194.18.0/23,\n\t\t\t103.195.112.0/22,\n\t\t\t103.195.152.0/22,\n\t\t\t103.195.160.0/22,\n\t\t\t103.196.64.0/22,\n\t\t\t103.196.72.0/22,\n\t\t\t103.196.88.0/21,\n\t\t\t103.196.96.0/22,\n\t\t\t103.196.168.0/22,\n\t\t\t103.197.0.0/22,\n\t\t\t103.197.228.0/22,\n\t\t\t103.198.20.0/22,\n\t\t\t103.198.60.0/22,\n\t\t\t103.198.64.0/22,\n\t\t\t103.198.72.0/22,\n\t\t\t103.198.124.0/22,\n\t\t\t103.198.156.0/22,\n\t\t\t103.198.180.0/22,\n\t\t\t103.198.196.0/22,\n\t\t\t103.198.216.0/21,\n\t\t\t103.198.224.0/20,\n\t\t\t103.198.240.0/21,\n\t\t\t103.199.164.0/22,\n\t\t\t103.199.196.0/22,\n\t\t\t103.199.228.0/22,\n\t\t\t103.199.252.0/22,\n\t\t\t103.200.52.0/22,\n\t\t\t103.200.64.0/21,\n\t\t\t103.200.136.0/21,\n\t\t\t103.200.144.0/20,\n\t\t\t103.200.160.0/19,\n\t\t\t103.200.192.0/22,\n\t\t\t103.200.220.0/22,\n\t\t\t103.200.224.0/19,\n\t\t\t103.201.0.0/20,\n\t\t\t103.201.16.0/21,\n\t\t\t103.201.28.0/22,\n\t\t\t103.201.32.0/19,\n\t\t\t103.201.64.0/22,\n\t\t\t103.201.76.0/22,\n\t\t\t103.201.80.0/20,\n\t\t\t103.201.96.0/20,\n\t\t\t103.201.112.0/21,\n\t\t\t103.201.120.0/22,\n\t\t\t103.201.152.0/21,\n\t\t\t103.201.160.0/19,\n\t\t\t103.201.192.0/18,\n\t\t\t103.202.0.0/19,\n\t\t\t103.202.32.0/20,\n\t\t\t103.202.56.0/21,\n\t\t\t103.202.64.0/18,\n\t\t\t103.202.128.0/20,\n\t\t\t103.202.144.0/22,\n\t\t\t103.202.152.0/21,\n\t\t\t103.202.160.0/19,\n\t\t\t103.202.192.0/20,\n\t\t\t103.202.212.0/22,\n\t\t\t103.202.228.0/22,\n\t\t\t103.202.236.0/22,\n\t\t\t103.202.240.0/20,\n\t\t\t103.203.0.0/19,\n\t\t\t103.203.32.0/22,\n\t\t\t103.203.56.0/22,\n\t\t\t103.203.96.0/22,\n\t\t\t103.203.104.0/21,\n\t\t\t103.203.112.0/20,\n\t\t\t103.203.128.0/22,\n\t\t\t103.203.140.0/22,\n\t\t\t103.203.164.0/22,\n\t\t\t103.203.168.0/22,\n\t\t\t103.203.192.0/22,\n\t\t\t103.203.200.0/22,\n\t\t\t103.203.212.0/22,\n\t\t\t103.203.216.0/22,\n\t\t\t103.204.24.0/22,\n\t\t\t103.204.72.0/22,\n\t\t\t103.204.88.0/22,\n\t\t\t103.204.112.0/22,\n\t\t\t103.204.136.0/21,\n\t\t\t103.204.144.0/21,\n\t\t\t103.204.152.0/22,\n\t\t\t103.204.196.0/22,\n\t\t\t103.204.216.0/23,\n\t\t\t103.204.232.0/21,\n\t\t\t103.205.4.0/22,\n\t\t\t103.205.40.0/21,\n\t\t\t103.205.52.0/22,\n\t\t\t103.205.108.0/22,\n\t\t\t103.205.116.0/22,\n\t\t\t103.205.136.0/22,\n\t\t\t103.205.162.0/24,\n\t\t\t103.205.188.0/22,\n\t\t\t103.205.192.0/21,\n\t\t\t103.205.200.0/22,\n\t\t\t103.205.236.0/22,\n\t\t\t103.205.248.0/21,\n\t\t\t103.206.0.0/22,\n\t\t\t103.206.44.0/22,\n\t\t\t103.206.148.0/22,\n\t\t\t103.207.70.0/24,\n\t\t\t103.207.104.0/22,\n\t\t\t103.207.184.0/21,\n\t\t\t103.207.192.0/20,\n\t\t\t103.207.208.0/21,\n\t\t\t103.207.220.0/22,\n\t\t\t103.207.228.0/22,\n\t\t\t103.207.232.0/22,\n\t\t\t103.208.12.0/22,\n\t\t\t103.208.16.0/22,\n\t\t\t103.208.28.0/22,\n\t\t\t103.208.40.0/21,\n\t\t\t103.208.48.0/22,\n\t\t\t103.209.112.0/22,\n\t\t\t103.209.136.0/22,\n\t\t\t103.209.201.0/24,\n\t\t\t103.209.202.0/23,\n\t\t\t103.209.209.0/24,\n\t\t\t103.209.210.0/23,\n\t\t\t103.209.216.0/22,\n\t\t\t103.210.96.0/22,\n\t\t\t103.210.156.0/22,\n\t\t\t103.210.160.0/19,\n\t\t\t103.210.217.0/24,\n\t\t\t103.210.218.0/23,\n\t\t\t103.211.44.0/22,\n\t\t\t103.211.96.0/23,\n\t\t\t103.211.98.0/24,\n\t\t\t103.211.156.0/22,\n\t\t\t103.211.164.0/22,\n\t\t\t103.211.220.0/22,\n\t\t\t103.211.248.0/22,\n\t\t\t103.212.0.0/20,\n\t\t\t103.212.44.0/22,\n\t\t\t103.212.48.0/22,\n\t\t\t103.212.84.0/22,\n\t\t\t103.212.100.0/22,\n\t\t\t103.212.109.0/24,\n\t\t\t103.212.148.0/22,\n\t\t\t103.212.164.0/22,\n\t\t\t103.212.196.0/22,\n\t\t\t103.212.200.0/22,\n\t\t\t103.212.252.0/22,\n\t\t\t103.213.40.0/21,\n\t\t\t103.213.48.0/20,\n\t\t\t103.213.64.0/19,\n\t\t\t103.213.96.0/22,\n\t\t\t103.213.132.0/22,\n\t\t\t103.213.136.0/21,\n\t\t\t103.213.144.0/20,\n\t\t\t103.213.160.0/19,\n\t\t\t103.213.196.0/22,\n\t\t\t103.213.226.0/23,\n\t\t\t103.214.48.0/22,\n\t\t\t103.214.84.0/22,\n\t\t\t103.214.212.0/22,\n\t\t\t103.214.240.0/21,\n\t\t\t103.215.28.0/22,\n\t\t\t103.215.32.0/21,\n\t\t\t103.215.44.0/22,\n\t\t\t103.215.100.0/22,\n\t\t\t103.215.108.0/22,\n\t\t\t103.215.116.0/22,\n\t\t\t103.215.120.0/22,\n\t\t\t103.215.140.0/22,\n\t\t\t103.216.4.0/22,\n\t\t\t103.216.8.0/21,\n\t\t\t103.216.16.0/20,\n\t\t\t103.216.32.0/20,\n\t\t\t103.216.64.0/22,\n\t\t\t103.216.108.0/22,\n\t\t\t103.216.136.0/22,\n\t\t\t103.216.152.0/22,\n\t\t\t103.216.156.0/23,\n\t\t\t103.216.224.0/21,\n\t\t\t103.216.240.0/20,\n\t\t\t103.217.0.0/18,\n\t\t\t103.217.168.0/22,\n\t\t\t103.217.180.0/22,\n\t\t\t103.217.184.0/21,\n\t\t\t103.217.192.0/20,\n\t\t\t103.218.8.0/21,\n\t\t\t103.218.16.0/21,\n\t\t\t103.218.28.0/22,\n\t\t\t103.218.32.0/19,\n\t\t\t103.218.64.0/20,\n\t\t\t103.218.80.0/21,\n\t\t\t103.218.88.0/22,\n\t\t\t103.218.178.0/23,\n\t\t\t103.218.192.0/20,\n\t\t\t103.218.208.0/21,\n\t\t\t103.218.216.0/22,\n\t\t\t103.219.24.0/21,\n\t\t\t103.219.32.0/21,\n\t\t\t103.219.64.0/22,\n\t\t\t103.219.84.0/22,\n\t\t\t103.219.88.0/21,\n\t\t\t103.219.96.0/21,\n\t\t\t103.219.176.0/22,\n\t\t\t103.219.184.0/22,\n\t\t\t103.220.48.0/20,\n\t\t\t103.220.64.0/22,\n\t\t\t103.220.92.0/22,\n\t\t\t103.220.96.0/22,\n\t\t\t103.220.100.0/24,\n\t\t\t103.220.102.0/23,\n\t\t\t103.220.104.0/21,\n\t\t\t103.220.116.0/22,\n\t\t\t103.220.120.0/21,\n\t\t\t103.220.128.0/20,\n\t\t\t103.220.144.0/21,\n\t\t\t103.220.152.0/22,\n\t\t\t103.220.160.0/19,\n\t\t\t103.220.192.0/21,\n\t\t\t103.220.200.0/22,\n\t\t\t103.220.240.0/20,\n\t\t\t103.221.0.0/19,\n\t\t\t103.221.32.0/20,\n\t\t\t103.221.50.0/23,\n\t\t\t103.221.88.0/22,\n\t\t\t103.221.92.0/23,\n\t\t\t103.221.96.0/19,\n\t\t\t103.221.128.0/18,\n\t\t\t103.221.192.0/20,\n\t\t\t103.222.0.0/20,\n\t\t\t103.222.16.0/22,\n\t\t\t103.222.24.0/21,\n\t\t\t103.222.33.0/24,\n\t\t\t103.222.34.0/23,\n\t\t\t103.222.36.0/22,\n\t\t\t103.222.40.0/21,\n\t\t\t103.222.48.0/20,\n\t\t\t103.222.64.0/18,\n\t\t\t103.222.128.0/18,\n\t\t\t103.222.192.0/19,\n\t\t\t103.222.224.0/21,\n\t\t\t103.222.232.0/22,\n\t\t\t103.222.240.0/21,\n\t\t\t103.223.16.0/20,\n\t\t\t103.223.32.0/19,\n\t\t\t103.223.64.0/19,\n\t\t\t103.223.96.0/20,\n\t\t\t103.223.112.0/21,\n\t\t\t103.223.124.0/22,\n\t\t\t103.223.128.0/21,\n\t\t\t103.223.140.0/22,\n\t\t\t103.223.144.0/20,\n\t\t\t103.223.160.0/20,\n\t\t\t103.223.176.0/21,\n\t\t\t103.223.188.0/22,\n\t\t\t103.223.192.0/18,\n\t\t\t103.224.0.0/22,\n\t\t\t103.224.40.0/21,\n\t\t\t103.224.60.0/22,\n\t\t\t103.224.220.0/22,\n\t\t\t103.224.224.0/21,\n\t\t\t103.224.232.0/22,\n\t\t\t103.225.18.0/24,\n\t\t\t103.226.40.0/22,\n\t\t\t103.226.56.0/22,\n\t\t\t103.226.80.0/22,\n\t\t\t103.226.132.0/22,\n\t\t\t103.226.156.0/22,\n\t\t\t103.226.180.0/22,\n\t\t\t103.226.196.0/22,\n\t\t\t103.227.48.0/22,\n\t\t\t103.227.72.0/21,\n\t\t\t103.227.80.0/22,\n\t\t\t103.227.100.0/22,\n\t\t\t103.227.120.0/22,\n\t\t\t103.227.132.0/22,\n\t\t\t103.227.136.0/22,\n\t\t\t103.227.196.0/22,\n\t\t\t103.227.204.0/23,\n\t\t\t103.227.206.0/24,\n\t\t\t103.227.212.0/22,\n\t\t\t103.227.228.0/22,\n\t\t\t103.228.12.0/22,\n\t\t\t103.228.88.0/22,\n\t\t\t103.228.136.0/22,\n\t\t\t103.228.160.0/22,\n\t\t\t103.228.176.0/22,\n\t\t\t103.228.204.0/22,\n\t\t\t103.228.208.0/22,\n\t\t\t103.228.228.0/22,\n\t\t\t103.228.232.0/22,\n\t\t\t103.229.20.0/22,\n\t\t\t103.229.136.0/22,\n\t\t\t103.229.148.0/22,\n\t\t\t103.229.172.0/22,\n\t\t\t103.229.212.0/22,\n\t\t\t103.229.216.0/21,\n\t\t\t103.229.228.0/22,\n\t\t\t103.229.236.0/22,\n\t\t\t103.229.240.0/22,\n\t\t\t103.230.0.0/22,\n\t\t\t103.230.28.0/22,\n\t\t\t103.230.44.0/22,\n\t\t\t103.230.96.0/22,\n\t\t\t103.230.110.0/23,\n\t\t\t103.230.196.0/22,\n\t\t\t103.230.200.0/21,\n\t\t\t103.230.212.0/22,\n\t\t\t103.230.236.0/22,\n\t\t\t103.231.16.0/21,\n\t\t\t103.231.64.0/21,\n\t\t\t103.231.180.0/22,\n\t\t\t103.231.186.0/24,\n\t\t\t103.231.244.0/22,\n\t\t\t103.232.4.0/22,\n\t\t\t103.232.17.168/29,\n\t\t\t103.232.144.0/22,\n\t\t\t103.232.166.0/23,\n\t\t\t103.233.4.0/22,\n\t\t\t103.233.44.0/22,\n\t\t\t103.233.52.0/22,\n\t\t\t103.233.104.0/22,\n\t\t\t103.233.128.0/22,\n\t\t\t103.233.136.0/22,\n\t\t\t103.233.162.0/23,\n\t\t\t103.233.228.0/22,\n\t\t\t103.234.0.0/22,\n\t\t\t103.234.20.0/22,\n\t\t\t103.234.56.0/22,\n\t\t\t103.234.128.0/22,\n\t\t\t103.234.172.0/22,\n\t\t\t103.234.180.0/22,\n\t\t\t103.234.244.0/22,\n\t\t\t103.235.48.0/22,\n\t\t\t103.235.56.0/21,\n\t\t\t103.235.80.0/22,\n\t\t\t103.235.85.0/24,\n\t\t\t103.235.87.0/24,\n\t\t\t103.235.100.0/22,\n\t\t\t103.235.128.0/20,\n\t\t\t103.235.144.0/21,\n\t\t\t103.235.184.0/22,\n\t\t\t103.235.192.0/22,\n\t\t\t103.235.200.0/22,\n\t\t\t103.235.220.0/22,\n\t\t\t103.235.224.0/19,\n\t\t\t103.236.0.0/18,\n\t\t\t103.236.64.0/19,\n\t\t\t103.236.96.0/22,\n\t\t\t103.236.116.0/23,\n\t\t\t103.236.120.0/22,\n\t\t\t103.236.184.0/22,\n\t\t\t103.236.240.0/21,\n\t\t\t103.236.248.0/23,\n\t\t\t103.236.250.0/24,\n\t\t\t103.236.252.0/22,\n\t\t\t103.237.0.0/20,\n\t\t\t103.237.24.0/21,\n\t\t\t103.237.68.0/22,\n\t\t\t103.237.88.0/22,\n\t\t\t103.237.152.0/22,\n\t\t\t103.237.176.0/20,\n\t\t\t103.237.192.0/18,\n\t\t\t103.238.0.0/21,\n\t\t\t103.238.18.0/23,\n\t\t\t103.238.20.0/22,\n\t\t\t103.238.24.0/21,\n\t\t\t103.238.32.0/20,\n\t\t\t103.238.48.0/21,\n\t\t\t103.238.56.0/22,\n\t\t\t103.238.88.0/21,\n\t\t\t103.238.96.0/22,\n\t\t\t103.238.132.0/22,\n\t\t\t103.238.140.0/22,\n\t\t\t103.238.144.0/22,\n\t\t\t103.238.152.0/23,\n\t\t\t103.238.160.0/19,\n\t\t\t103.238.196.0/22,\n\t\t\t103.238.204.0/22,\n\t\t\t103.238.252.0/22,\n\t\t\t103.239.0.0/22,\n\t\t\t103.239.44.0/22,\n\t\t\t103.239.68.0/22,\n\t\t\t103.239.152.0/21,\n\t\t\t103.239.180.0/22,\n\t\t\t103.239.184.0/22,\n\t\t\t103.239.192.0/21,\n\t\t\t103.239.204.0/22,\n\t\t\t103.239.208.0/22,\n\t\t\t103.239.224.0/22,\n\t\t\t103.239.244.0/22,\n\t\t\t103.240.16.0/22,\n\t\t\t103.240.36.0/22,\n\t\t\t103.240.42.0/23,\n\t\t\t103.240.72.0/22,\n\t\t\t103.240.84.0/22,\n\t\t\t103.240.124.0/22,\n\t\t\t103.240.172.0/22,\n\t\t\t103.240.188.0/22,\n\t\t\t103.240.200.0/22,\n\t\t\t103.240.244.0/22,\n\t\t\t103.241.12.0/22,\n\t\t\t103.241.92.0/22,\n\t\t\t103.241.96.0/22,\n\t\t\t103.241.160.0/22,\n\t\t\t103.241.172.0/23,\n\t\t\t103.241.184.0/21,\n\t\t\t103.241.220.0/22,\n\t\t\t103.242.64.0/22,\n\t\t\t103.242.128.0/24,\n\t\t\t103.242.130.0/23,\n\t\t\t103.242.160.0/22,\n\t\t\t103.242.168.0/21,\n\t\t\t103.242.176.0/22,\n\t\t\t103.242.200.0/22,\n\t\t\t103.242.212.0/22,\n\t\t\t103.242.220.0/22,\n\t\t\t103.242.240.0/22,\n\t\t\t103.243.136.0/22,\n\t\t\t103.243.252.0/22,\n\t\t\t103.244.16.0/22,\n\t\t\t103.244.26.0/23,\n\t\t\t103.244.58.0/23,\n\t\t\t103.244.60.0/22,\n\t\t\t103.244.64.0/20,\n\t\t\t103.244.80.0/21,\n\t\t\t103.244.119.0/24,\n\t\t\t103.244.164.0/22,\n\t\t\t103.244.232.0/22,\n\t\t\t103.244.252.0/22,\n\t\t\t103.245.23.0/24,\n\t\t\t103.245.52.0/22,\n\t\t\t103.245.60.0/22,\n\t\t\t103.245.80.0/22,\n\t\t\t103.245.124.0/22,\n\t\t\t103.245.128.0/22,\n\t\t\t103.246.8.0/21,\n\t\t\t103.246.120.0/21,\n\t\t\t103.246.132.0/22,\n\t\t\t103.246.152.0/22,\n\t\t\t103.247.168.0/21,\n\t\t\t103.247.176.0/22,\n\t\t\t103.247.191.0/24,\n\t\t\t103.247.200.0/22,\n\t\t\t103.247.212.0/22,\n\t\t\t103.248.0.0/24,\n\t\t\t103.248.64.0/23,\n\t\t\t103.248.100.0/22,\n\t\t\t103.248.124.0/22,\n\t\t\t103.248.152.0/22,\n\t\t\t103.248.168.0/22,\n\t\t\t103.248.192.0/22,\n\t\t\t103.248.212.0/22,\n\t\t\t103.248.224.0/22,\n\t\t\t103.249.8.0/21,\n\t\t\t103.249.52.0/22,\n\t\t\t103.249.128.0/22,\n\t\t\t103.249.136.0/22,\n\t\t\t103.249.144.0/22,\n\t\t\t103.249.164.0/22,\n\t\t\t103.249.168.0/21,\n\t\t\t103.249.176.0/22,\n\t\t\t103.249.188.0/22,\n\t\t\t103.249.244.0/22,\n\t\t\t103.249.252.0/22,\n\t\t\t103.250.32.0/22,\n\t\t\t103.250.104.0/22,\n\t\t\t103.250.124.0/22,\n\t\t\t103.250.172.0/22,\n\t\t\t103.250.180.0/22,\n\t\t\t103.250.192.0/22,\n\t\t\t103.250.216.0/22,\n\t\t\t103.250.224.0/22,\n\t\t\t103.250.236.0/22,\n\t\t\t103.250.248.0/21,\n\t\t\t103.251.32.0/22,\n\t\t\t103.251.84.0/22,\n\t\t\t103.251.96.0/22,\n\t\t\t103.251.124.0/22,\n\t\t\t103.251.129.0/24,\n\t\t\t103.251.131.0/24,\n\t\t\t103.251.160.0/22,\n\t\t\t103.251.192.0/22,\n\t\t\t103.251.204.0/22,\n\t\t\t103.251.240.0/22,\n\t\t\t103.252.28.0/22,\n\t\t\t103.252.36.0/22,\n\t\t\t103.252.64.0/22,\n\t\t\t103.252.96.0/22,\n\t\t\t103.252.104.0/22,\n\t\t\t103.252.172.0/22,\n\t\t\t103.252.204.0/22,\n\t\t\t103.252.208.0/22,\n\t\t\t103.252.232.0/22,\n\t\t\t103.252.248.0/22,\n\t\t\t103.253.4.0/22,\n\t\t\t103.253.60.0/22,\n\t\t\t103.253.204.0/22,\n\t\t\t103.253.220.0/22,\n\t\t\t103.253.224.0/22,\n\t\t\t103.253.232.0/22,\n\t\t\t103.254.8.0/22,\n\t\t\t103.254.20.0/22,\n\t\t\t103.254.64.0/21,\n\t\t\t103.254.76.0/22,\n\t\t\t103.254.112.0/22,\n\t\t\t103.254.176.0/22,\n\t\t\t103.254.188.0/22,\n\t\t\t103.254.196.0/24,\n\t\t\t103.255.68.0/22,\n\t\t\t103.255.88.0/21,\n\t\t\t103.255.136.0/21,\n\t\t\t103.255.184.0/22,\n\t\t\t103.255.200.0/22,\n\t\t\t103.255.212.0/22,\n\t\t\t103.255.228.0/22,\n\t\t\t104.28.9.46/31,\n\t\t\t104.28.9.48/32,\n\t\t\t104.28.37.44/31,\n\t\t\t104.28.43.36/30,\n\t\t\t104.28.43.40/29,\n\t\t\t104.28.43.48/29,\n\t\t\t104.28.66.15/32,\n\t\t\t104.28.66.16/31,\n\t\t\t104.28.66.30/31,\n\t\t\t104.28.66.32/27,\n\t\t\t104.28.66.64/29,\n\t\t\t104.28.66.74/31,\n\t\t\t104.28.66.76/30,\n\t\t\t104.28.66.80/29,\n\t\t\t104.28.66.88/30,\n\t\t\t104.28.66.92/31,\n\t\t\t104.28.66.96/29,\n\t\t\t104.28.66.104/31,\n\t\t\t104.28.69.30/31,\n\t\t\t104.28.69.32/27,\n\t\t\t104.28.69.64/29,\n\t\t\t104.28.69.74/31,\n\t\t\t104.28.69.76/30,\n\t\t\t104.28.69.80/29,\n\t\t\t104.28.69.88/30,\n\t\t\t104.28.69.92/31,\n\t\t\t104.28.69.96/29,\n\t\t\t104.28.69.104/31,\n\t\t\t104.28.83.2/31,\n\t\t\t104.28.83.4/30,\n\t\t\t104.28.83.8/29,\n\t\t\t104.28.83.16/28,\n\t\t\t104.28.83.32/29,\n\t\t\t104.28.83.40/30,\n\t\t\t104.28.83.46/31,\n\t\t\t104.28.83.48/28,\n\t\t\t104.28.83.64/31,\n\t\t\t104.28.83.68/30,\n\t\t\t104.28.83.72/30,\n\t\t\t104.28.83.76/31,\n\t\t\t104.28.99.0/27,\n\t\t\t104.28.99.32/29,\n\t\t\t104.28.99.40/31,\n\t\t\t104.28.99.42/32,\n\t\t\t104.28.99.44/30,\n\t\t\t104.28.99.48/29,\n\t\t\t104.28.99.56/30,\n\t\t\t104.28.99.62/31,\n\t\t\t104.28.99.64/29,\n\t\t\t104.28.101.0/27,\n\t\t\t104.28.101.32/29,\n\t\t\t104.28.101.40/31,\n\t\t\t104.28.101.44/30,\n\t\t\t104.28.101.48/29,\n\t\t\t104.28.101.56/30,\n\t\t\t104.28.101.62/31,\n\t\t\t104.28.101.64/29,\n\t\t\t104.28.117.32/27,\n\t\t\t104.28.117.64/29,\n\t\t\t104.28.117.72/31,\n\t\t\t104.28.117.76/30,\n\t\t\t104.28.117.80/28,\n\t\t\t104.28.117.98/31,\n\t\t\t104.28.117.100/30,\n\t\t\t104.28.117.104/30,\n\t\t\t104.28.120.32/27,\n\t\t\t104.28.120.64/29,\n\t\t\t104.28.120.72/31,\n\t\t\t104.28.120.76/30,\n\t\t\t104.28.120.80/28,\n\t\t\t104.28.120.98/31,\n\t\t\t104.28.120.100/30,\n\t\t\t104.28.120.104/30,\n\t\t\t104.28.143.54/31,\n\t\t\t104.28.148.204/32,\n\t\t\t104.28.156.204/32,\n\t\t\t104.28.162.190/31,\n\t\t\t104.28.192.13/32,\n\t\t\t104.28.192.14/31,\n\t\t\t104.28.192.16/30,\n\t\t\t104.28.192.20/32,\n\t\t\t104.28.192.130/31,\n\t\t\t104.28.192.132/30,\n\t\t\t104.28.192.136/32,\n\t\t\t104.28.192.197/32,\n\t\t\t104.28.192.198/31,\n\t\t\t104.28.192.200/30,\n\t\t\t104.28.193.33/32,\n\t\t\t104.28.193.34/31,\n\t\t\t104.28.193.36/30,\n\t\t\t104.28.193.101/32,\n\t\t\t104.28.193.102/31,\n\t\t\t104.28.193.104/30,\n\t\t\t104.28.193.108/32,\n\t\t\t104.28.195.18/31,\n\t\t\t104.28.195.20/30,\n\t\t\t104.28.195.24/32,\n\t\t\t104.28.195.194/31,\n\t\t\t104.28.195.196/30,\n\t\t\t104.28.195.200/32,\n\t\t\t104.28.197.93/32,\n\t\t\t104.28.197.94/31,\n\t\t\t104.28.197.96/30,\n\t\t\t104.28.197.100/32,\n\t\t\t104.28.198.171/32,\n\t\t\t104.28.198.172/30,\n\t\t\t104.28.198.176/31,\n\t\t\t104.28.199.200/30,\n\t\t\t104.28.199.204/31,\n\t\t\t104.28.199.206/32,\n\t\t\t104.28.204.182/31,\n\t\t\t104.28.204.184/30,\n\t\t\t104.28.204.188/32,\n\t\t\t104.28.207.248/30,\n\t\t\t104.28.207.252/31,\n\t\t\t104.28.207.254/32,\n\t\t\t104.28.208.27/32,\n\t\t\t104.28.208.28/30,\n\t\t\t104.28.208.32/31,\n\t\t\t104.28.208.66/31,\n\t\t\t104.28.208.68/30,\n\t\t\t104.28.208.72/32,\n\t\t\t104.28.208.126/31,\n\t\t\t104.28.208.128/29,\n\t\t\t104.28.208.136/30,\n\t\t\t104.28.208.140/32,\n\t\t\t104.28.208.147/32,\n\t\t\t104.28.208.148/30,\n\t\t\t104.28.208.152/31,\n\t\t\t104.28.209.224/29,\n\t\t\t104.28.209.246/31,\n\t\t\t104.28.209.248/30,\n\t\t\t104.28.209.252/32,\n\t\t\t104.28.211.6/31,\n\t\t\t104.28.211.8/30,\n\t\t\t104.28.211.12/32,\n\t\t\t104.28.211.41/32,\n\t\t\t104.28.211.42/31,\n\t\t\t104.28.211.44/30,\n\t\t\t104.28.212.132/30,\n\t\t\t104.28.212.136/30,\n\t\t\t104.28.213.170/31,\n\t\t\t104.28.213.172/30,\n\t\t\t104.28.213.176/31,\n\t\t\t104.28.213.199/32,\n\t\t\t104.28.213.200/30,\n\t\t\t104.28.213.204/31,\n\t\t\t104.28.216.52/30,\n\t\t\t104.28.216.56/30,\n\t\t\t104.28.216.60/31,\n\t\t\t104.28.216.62/32,\n\t\t\t104.28.216.132/30,\n\t\t\t104.28.216.136/30,\n\t\t\t104.28.216.189/32,\n\t\t\t104.28.216.190/31,\n\t\t\t104.28.216.192/30,\n\t\t\t104.28.219.46/31,\n\t\t\t104.28.219.48/30,\n\t\t\t104.28.219.52/31,\n\t\t\t104.28.219.109/32,\n\t\t\t104.28.219.110/31,\n\t\t\t104.28.219.112/30,\n\t\t\t104.28.220.207/32,\n\t\t\t104.28.220.208/30,\n\t\t\t104.28.220.212/31,\n\t\t\t104.28.221.2/31,\n\t\t\t104.28.221.4/30,\n\t\t\t104.28.221.8/32,\n\t\t\t104.28.222.59/32,\n\t\t\t104.28.222.60/30,\n\t\t\t104.28.222.64/31,\n\t\t\t104.28.222.66/32,\n\t\t\t104.28.223.75/32,\n\t\t\t104.28.223.76/30,\n\t\t\t104.28.223.80/31,\n\t\t\t104.28.223.162/31,\n\t\t\t104.28.223.164/30,\n\t\t\t104.28.223.168/32,\n\t\t\t104.28.223.177/32,\n\t\t\t104.28.223.178/31,\n\t\t\t104.28.223.180/30,\n\t\t\t104.28.223.200/30,\n\t\t\t104.28.223.204/31,\n\t\t\t104.28.223.206/32,\n\t\t\t104.28.224.13/32,\n\t\t\t104.28.224.14/31,\n\t\t\t104.28.224.16/30,\n\t\t\t104.28.224.20/32,\n\t\t\t104.28.224.130/31,\n\t\t\t104.28.224.132/30,\n\t\t\t104.28.224.136/32,\n\t\t\t104.28.224.197/32,\n\t\t\t104.28.224.198/31,\n\t\t\t104.28.224.200/30,\n\t\t\t104.28.225.33/32,\n\t\t\t104.28.225.34/31,\n\t\t\t104.28.225.36/30,\n\t\t\t104.28.225.101/32,\n\t\t\t104.28.225.102/31,\n\t\t\t104.28.225.104/30,\n\t\t\t104.28.225.108/32,\n\t\t\t104.28.227.18/31,\n\t\t\t104.28.227.20/30,\n\t\t\t104.28.227.24/32,\n\t\t\t104.28.227.194/31,\n\t\t\t104.28.227.196/30,\n\t\t\t104.28.227.200/32,\n\t\t\t104.28.229.93/32,\n\t\t\t104.28.229.94/31,\n\t\t\t104.28.229.96/30,\n\t\t\t104.28.229.100/32,\n\t\t\t104.28.230.171/32,\n\t\t\t104.28.230.172/30,\n\t\t\t104.28.230.176/31,\n\t\t\t104.28.231.200/30,\n\t\t\t104.28.231.204/31,\n\t\t\t104.28.231.206/32,\n\t\t\t104.28.236.182/31,\n\t\t\t104.28.236.184/30,\n\t\t\t104.28.236.188/32,\n\t\t\t104.28.239.248/30,\n\t\t\t104.28.239.252/31,\n\t\t\t104.28.239.254/32,\n\t\t\t104.28.240.27/32,\n\t\t\t104.28.240.28/30,\n\t\t\t104.28.240.32/31,\n\t\t\t104.28.240.66/31,\n\t\t\t104.28.240.68/30,\n\t\t\t104.28.240.72/32,\n\t\t\t104.28.240.126/31,\n\t\t\t104.28.240.128/29,\n\t\t\t104.28.240.136/30,\n\t\t\t104.28.240.140/32,\n\t\t\t104.28.240.147/32,\n\t\t\t104.28.240.148/30,\n\t\t\t104.28.240.152/31,\n\t\t\t104.28.241.224/29,\n\t\t\t104.28.241.246/31,\n\t\t\t104.28.241.248/30,\n\t\t\t104.28.241.252/32,\n\t\t\t104.28.243.6/31,\n\t\t\t104.28.243.8/30,\n\t\t\t104.28.243.12/32,\n\t\t\t104.28.243.41/32,\n\t\t\t104.28.243.42/31,\n\t\t\t104.28.243.44/30,\n\t\t\t104.28.244.132/30,\n\t\t\t104.28.244.136/30,\n\t\t\t104.28.245.170/31,\n\t\t\t104.28.245.172/30,\n\t\t\t104.28.245.176/31,\n\t\t\t104.28.245.199/32,\n\t\t\t104.28.245.200/30,\n\t\t\t104.28.245.204/31,\n\t\t\t104.28.248.52/30,\n\t\t\t104.28.248.56/30,\n\t\t\t104.28.248.60/31,\n\t\t\t104.28.248.62/32,\n\t\t\t104.28.248.132/30,\n\t\t\t104.28.248.136/30,\n\t\t\t104.28.248.189/32,\n\t\t\t104.28.248.190/31,\n\t\t\t104.28.248.192/30,\n\t\t\t104.28.251.46/31,\n\t\t\t104.28.251.48/30,\n\t\t\t104.28.251.52/31,\n\t\t\t104.28.251.109/32,\n\t\t\t104.28.251.110/31,\n\t\t\t104.28.251.112/30,\n\t\t\t104.28.252.207/32,\n\t\t\t104.28.252.208/30,\n\t\t\t104.28.252.212/31,\n\t\t\t104.28.253.2/31,\n\t\t\t104.28.253.4/30,\n\t\t\t104.28.253.8/32,\n\t\t\t104.28.254.59/32,\n\t\t\t104.28.254.60/30,\n\t\t\t104.28.254.64/31,\n\t\t\t104.28.254.66/32,\n\t\t\t104.28.255.75/32,\n\t\t\t104.28.255.76/30,\n\t\t\t104.28.255.80/31,\n\t\t\t104.28.255.162/31,\n\t\t\t104.28.255.164/30,\n\t\t\t104.28.255.168/32,\n\t\t\t104.28.255.177/32,\n\t\t\t104.28.255.178/31,\n\t\t\t104.28.255.180/30,\n\t\t\t104.28.255.200/30,\n\t\t\t104.28.255.204/31,\n\t\t\t104.28.255.206/32,\n\t\t\t104.30.161.11/32,\n\t\t\t104.44.213.0/31,\n\t\t\t104.192.108.0/23,\n\t\t\t104.192.110.0/24,\n\t\t\t104.212.68.57/32,\n\t\t\t104.212.68.58/32,\n\t\t\t104.212.68.102/32,\n\t\t\t104.212.68.151/32,\n\t\t\t104.212.68.152/32,\n\t\t\t104.233.144.0/21,\n\t\t\t106.0.0.0/24,\n\t\t\t106.0.2.0/23,\n\t\t\t106.0.4.0/22,\n\t\t\t106.0.8.0/21,\n\t\t\t106.0.16.0/20,\n\t\t\t106.0.44.0/22,\n\t\t\t106.0.64.0/18,\n\t\t\t106.2.0.0/16,\n\t\t\t106.3.0.0/18,\n\t\t\t106.3.64.0/20,\n\t\t\t106.3.80.0/22,\n\t\t\t106.3.88.0/21,\n\t\t\t106.3.96.0/19,\n\t\t\t106.3.128.0/19,\n\t\t\t106.3.164.0/22,\n\t\t\t106.3.168.0/22,\n\t\t\t106.3.172.0/24,\n\t\t\t106.3.174.0/23,\n\t\t\t106.3.176.0/20,\n\t\t\t106.3.192.0/18,\n\t\t\t106.4.0.0/14,\n\t\t\t106.8.0.0/15,\n\t\t\t106.11.0.0/16,\n\t\t\t106.12.0.0/14,\n\t\t\t106.16.0.0/12,\n\t\t\t106.32.0.0/12,\n\t\t\t106.48.0.0/15,\n\t\t\t106.50.0.0/16,\n\t\t\t106.52.0.0/14,\n\t\t\t106.56.0.0/13,\n\t\t\t106.74.0.0/16,\n\t\t\t106.75.0.0/17,\n\t\t\t106.75.128.0/18,\n\t\t\t106.75.200.0/21,\n\t\t\t106.75.208.0/20,\n\t\t\t106.75.224.0/19,\n\t\t\t106.80.0.0/12,\n\t\t\t106.108.0.0/14,\n\t\t\t106.112.0.0/12,\n\t\t\t106.224.0.0/12,\n\t\t\t107.176.0.0/15,\n\t\t\t109.71.4.0/24,\n\t\t\t109.244.0.0/16,\n\t\t\t110.6.0.0/15,\n\t\t\t110.16.0.0/14,\n\t\t\t110.34.40.0/21,\n\t\t\t110.40.0.0/14,\n\t\t\t110.44.12.0/22,\n\t\t\t110.48.0.0/17,\n\t\t\t110.48.128.0/19,\n\t\t\t110.51.0.0/16,\n\t\t\t110.52.0.0/15,\n\t\t\t110.56.0.0/13,\n\t\t\t110.64.0.0/15,\n\t\t\t110.72.0.0/15,\n\t\t\t110.75.0.0/16,\n\t\t\t110.76.0.0/18,\n\t\t\t110.76.132.0/22,\n\t\t\t110.76.156.0/22,\n\t\t\t110.76.184.0/22,\n\t\t\t110.76.192.0/18,\n\t\t\t110.77.0.0/17,\n\t\t\t110.80.0.0/13,\n\t\t\t110.88.0.0/14,\n\t\t\t110.92.68.0/22,\n\t\t\t110.93.32.0/19,\n\t\t\t110.94.0.0/15,\n\t\t\t110.96.0.0/11,\n\t\t\t110.152.0.0/14,\n\t\t\t110.156.0.0/15,\n\t\t\t110.165.37.0/24,\n\t\t\t110.165.38.0/23,\n\t\t\t110.165.40.0/21,\n\t\t\t110.165.48.0/20,\n\t\t\t110.166.0.0/15,\n\t\t\t110.172.200.0/21,\n\t\t\t110.172.208.0/20,\n\t\t\t110.172.224.0/19,\n\t\t\t110.173.0.0/19,\n\t\t\t110.173.32.0/20,\n\t\t\t110.173.64.0/18,\n\t\t\t110.173.192.0/19,\n\t\t\t110.176.0.0/12,\n\t\t\t110.192.0.0/11,\n\t\t\t110.228.0.0/14,\n\t\t\t110.232.32.0/19,\n\t\t\t110.236.0.0/15,\n\t\t\t110.240.0.0/12,\n\t\t\t111.0.0.0/10,\n\t\t\t111.66.0.0/18,\n\t\t\t111.66.64.0/19,\n\t\t\t111.66.96.0/22,\n\t\t\t111.66.100.0/24,\n\t\t\t111.66.102.0/23,\n\t\t\t111.66.104.0/21,\n\t\t\t111.66.112.0/20,\n\t\t\t111.66.128.0/19,\n\t\t\t111.66.160.0/20,\n\t\t\t111.66.176.0/23,\n\t\t\t111.66.178.0/24,\n\t\t\t111.66.180.0/22,\n\t\t\t111.66.184.0/21,\n\t\t\t111.66.192.0/18,\n\t\t\t111.67.192.0/20,\n\t\t\t111.72.0.0/13,\n\t\t\t111.85.0.0/16,\n\t\t\t111.92.248.0/21,\n\t\t\t111.112.0.0/14,\n\t\t\t111.116.0.0/15,\n\t\t\t111.118.200.0/21,\n\t\t\t111.119.64.0/18,\n\t\t\t111.119.128.0/19,\n\t\t\t111.120.0.0/14,\n\t\t\t111.124.0.0/16,\n\t\t\t111.126.0.0/15,\n\t\t\t111.128.0.0/11,\n\t\t\t111.160.0.0/13,\n\t\t\t111.170.0.0/16,\n\t\t\t111.172.0.0/14,\n\t\t\t111.176.0.0/13,\n\t\t\t111.186.0.0/15,\n\t\t\t111.192.0.0/12,\n\t\t\t111.208.0.0/13,\n\t\t\t111.221.28.0/24,\n\t\t\t111.221.128.0/17,\n\t\t\t111.222.0.0/16,\n\t\t\t111.223.4.0/22,\n\t\t\t111.223.8.0/21,\n\t\t\t111.223.16.0/22,\n\t\t\t111.223.240.0/22,\n\t\t\t111.223.248.0/22,\n\t\t\t111.224.0.0/13,\n\t\t\t111.235.96.0/19,\n\t\t\t111.235.156.0/22,\n\t\t\t111.235.160.0/19,\n\t\t\t112.0.0.0/10,\n\t\t\t112.64.0.0/14,\n\t\t\t112.73.64.0/18,\n\t\t\t112.73.128.0/17,\n\t\t\t112.74.0.0/15,\n\t\t\t112.80.0.0/12,\n\t\t\t112.96.0.0/13,\n\t\t\t112.109.128.0/17,\n\t\t\t112.111.0.0/16,\n\t\t\t112.112.0.0/14,\n\t\t\t112.116.0.0/15,\n\t\t\t112.122.0.0/15,\n\t\t\t112.124.0.0/14,\n\t\t\t112.128.0.0/14,\n\t\t\t112.132.0.0/16,\n\t\t\t112.137.48.0/21,\n\t\t\t112.192.0.0/14,\n\t\t\t112.196.208.0/24,\n\t\t\t112.224.0.0/11,\n\t\t\t113.0.0.0/13,\n\t\t\t113.8.0.0/15,\n\t\t\t113.11.192.0/19,\n\t\t\t113.12.0.0/14,\n\t\t\t113.16.0.0/15,\n\t\t\t113.18.0.0/16,\n\t\t\t113.21.232.0/21,\n\t\t\t113.24.0.0/14,\n\t\t\t113.31.88.0/23,\n\t\t\t113.31.96.0/19,\n\t\t\t113.31.136.0/21,\n\t\t\t113.31.144.0/20,\n\t\t\t113.31.160.0/19,\n\t\t\t113.31.192.0/18,\n\t\t\t113.44.0.0/14,\n\t\t\t113.48.0.0/14,\n\t\t\t113.52.160.0/19,\n\t\t\t113.52.228.0/22,\n\t\t\t113.54.0.0/15,\n\t\t\t113.56.0.0/15,\n\t\t\t113.58.0.0/16,\n\t\t\t113.59.0.0/17,\n\t\t\t113.59.224.0/22,\n\t\t\t113.62.0.0/15,\n\t\t\t113.64.0.0/10,\n\t\t\t113.128.0.0/15,\n\t\t\t113.130.96.0/20,\n\t\t\t113.130.112.0/21,\n\t\t\t113.132.0.0/14,\n\t\t\t113.136.0.0/13,\n\t\t\t113.192.40.0/23,\n\t\t\t113.192.57.0/24,\n\t\t\t113.192.62.0/23,\n\t\t\t113.194.0.0/15,\n\t\t\t113.197.100.0/22,\n\t\t\t113.197.104.0/22,\n\t\t\t113.200.0.0/15,\n\t\t\t113.202.0.0/16,\n\t\t\t113.204.0.0/14,\n\t\t\t113.208.96.0/19,\n\t\t\t113.208.128.0/17,\n\t\t\t113.209.0.0/16,\n\t\t\t113.212.0.0/18,\n\t\t\t113.212.100.0/22,\n\t\t\t113.212.184.0/21,\n\t\t\t113.213.0.0/17,\n\t\t\t113.214.0.0/15,\n\t\t\t113.218.0.0/15,\n\t\t\t113.220.0.0/14,\n\t\t\t113.224.0.0/12,\n\t\t\t113.240.0.0/13,\n\t\t\t113.248.0.0/14,\n\t\t\t114.28.0.0/17,\n\t\t\t114.28.128.0/18,\n\t\t\t114.28.194.0/23,\n\t\t\t114.28.196.0/24,\n\t\t\t114.28.200.0/23,\n\t\t\t114.28.209.0/24,\n\t\t\t114.28.211.0/24,\n\t\t\t114.28.212.0/22,\n\t\t\t114.28.216.0/21,\n\t\t\t114.28.229.0/24,\n\t\t\t114.28.232.0/23,\n\t\t\t114.28.234.0/24,\n\t\t\t114.28.236.0/22,\n\t\t\t114.28.240.0/20,\n\t\t\t114.31.64.0/21,\n\t\t\t114.54.0.0/15,\n\t\t\t114.60.0.0/14,\n\t\t\t114.64.0.0/15,\n\t\t\t114.66.0.0/17,\n\t\t\t114.66.128.0/20,\n\t\t\t114.66.144.0/21,\n\t\t\t114.66.152.0/22,\n\t\t\t114.66.176.0/20,\n\t\t\t114.66.192.0/19,\n\t\t\t114.66.228.0/22,\n\t\t\t114.66.232.0/21,\n\t\t\t114.66.240.0/20,\n\t\t\t114.67.0.0/16,\n\t\t\t114.68.0.0/16,\n\t\t\t114.79.64.0/18,\n\t\t\t114.80.0.0/12,\n\t\t\t114.96.0.0/13,\n\t\t\t114.104.0.0/14,\n\t\t\t114.110.0.0/20,\n\t\t\t114.110.64.0/18,\n\t\t\t114.111.0.0/19,\n\t\t\t114.111.160.0/19,\n\t\t\t114.112.4.0/22,\n\t\t\t114.112.8.0/22,\n\t\t\t114.112.22.0/24,\n\t\t\t114.112.24.0/21,\n\t\t\t114.112.32.0/19,\n\t\t\t114.112.64.0/19,\n\t\t\t114.112.96.0/20,\n\t\t\t114.112.116.0/22,\n\t\t\t114.112.120.0/21,\n\t\t\t114.112.136.0/21,\n\t\t\t114.112.144.0/20,\n\t\t\t114.112.160.0/19,\n\t\t\t114.112.192.0/19,\n\t\t\t114.113.0.0/17,\n\t\t\t114.113.128.0/21,\n\t\t\t114.113.140.0/22,\n\t\t\t114.113.144.0/20,\n\t\t\t114.113.160.0/19,\n\t\t\t114.113.196.0/22,\n\t\t\t114.113.200.0/21,\n\t\t\t114.113.208.0/20,\n\t\t\t114.113.224.0/20,\n\t\t\t114.114.0.0/15,\n\t\t\t114.116.0.0/15,\n\t\t\t114.118.0.0/16,\n\t\t\t114.119.0.0/17,\n\t\t\t114.119.192.0/18,\n\t\t\t114.132.0.0/16,\n\t\t\t114.135.0.0/16,\n\t\t\t114.138.0.0/15,\n\t\t\t114.141.64.0/21,\n\t\t\t114.141.80.0/21,\n\t\t\t114.141.128.0/18,\n\t\t\t114.142.136.0/21,\n\t\t\t114.196.0.0/15,\n\t\t\t114.198.248.0/21,\n\t\t\t114.208.0.0/12,\n\t\t\t114.224.0.0/11,\n\t\t\t115.24.0.0/14,\n\t\t\t115.28.0.0/15,\n\t\t\t115.31.64.0/22,\n\t\t\t115.31.72.0/21,\n\t\t\t115.32.0.0/14,\n\t\t\t115.42.56.0/22,\n\t\t\t115.44.0.0/14,\n\t\t\t115.48.0.0/12,\n\t\t\t115.69.64.0/20,\n\t\t\t115.84.0.0/18,\n\t\t\t115.85.192.0/18,\n\t\t\t115.100.0.0/14,\n\t\t\t115.104.0.0/14,\n\t\t\t115.120.0.0/14,\n\t\t\t115.124.16.0/20,\n\t\t\t115.148.0.0/14,\n\t\t\t115.152.0.0/13,\n\t\t\t115.166.64.0/19,\n\t\t\t115.168.0.0/13,\n\t\t\t115.180.0.0/14,\n\t\t\t115.187.0.0/20,\n\t\t\t115.190.0.0/15,\n\t\t\t115.192.0.0/11,\n\t\t\t115.224.0.0/12,\n\t\t\t116.0.8.0/21,\n\t\t\t116.0.24.0/21,\n\t\t\t116.1.0.0/16,\n\t\t\t116.2.0.0/15,\n\t\t\t116.4.0.0/14,\n\t\t\t116.8.0.0/14,\n\t\t\t116.13.0.0/16,\n\t\t\t116.16.0.0/12,\n\t\t\t116.50.0.0/20,\n\t\t\t116.52.0.0/14,\n\t\t\t116.56.0.0/15,\n\t\t\t116.58.128.0/20,\n\t\t\t116.58.208.0/20,\n\t\t\t116.60.0.0/14,\n\t\t\t116.66.0.0/17,\n\t\t\t116.68.136.0/21,\n\t\t\t116.68.176.0/21,\n\t\t\t116.69.0.0/16,\n\t\t\t116.70.64.0/18,\n\t\t\t116.76.0.0/14,\n\t\t\t116.85.0.0/16,\n\t\t\t116.89.144.0/20,\n\t\t\t116.90.80.0/20,\n\t\t\t116.90.184.0/21,\n\t\t\t116.95.0.0/16,\n\t\t\t116.112.0.0/14,\n\t\t\t116.116.0.0/15,\n\t\t\t116.128.0.0/10,\n\t\t\t116.192.0.0/16,\n\t\t\t116.193.16.0/20,\n\t\t\t116.193.32.0/19,\n\t\t\t116.193.176.0/21,\n\t\t\t116.194.0.0/15,\n\t\t\t116.196.0.0/21,\n\t\t\t116.196.8.0/22,\n\t\t\t116.196.12.0/23,\n\t\t\t116.196.32.0/19,\n\t\t\t116.196.64.0/18,\n\t\t\t116.196.128.0/17,\n\t\t\t116.197.160.0/21,\n\t\t\t116.198.0.0/16,\n\t\t\t116.199.0.0/17,\n\t\t\t116.199.128.0/19,\n\t\t\t116.204.0.0/17,\n\t\t\t116.205.0.0/16,\n\t\t\t116.207.0.0/16,\n\t\t\t116.208.0.0/14,\n\t\t\t116.212.160.0/20,\n\t\t\t116.213.45.0/24,\n\t\t\t116.213.46.0/23,\n\t\t\t116.213.64.0/18,\n\t\t\t116.213.128.0/17,\n\t\t\t116.214.32.0/19,\n\t\t\t116.214.64.0/20,\n\t\t\t116.214.128.0/17,\n\t\t\t116.215.0.0/16,\n\t\t\t116.216.0.0/14,\n\t\t\t116.224.0.0/12,\n\t\t\t116.242.0.0/15,\n\t\t\t116.244.0.0/14,\n\t\t\t116.248.0.0/15,\n\t\t\t116.251.65.140/31,\n\t\t\t116.251.66.42/31,\n\t\t\t116.251.68.15/32,\n\t\t\t116.251.79.12/31,\n\t\t\t116.251.84.168/30,\n\t\t\t116.251.84.180/30,\n\t\t\t116.251.84.184/29,\n\t\t\t116.251.84.192/27,\n\t\t\t116.251.84.226/31,\n\t\t\t116.251.84.228/30,\n\t\t\t116.251.84.232/29,\n\t\t\t116.251.84.240/29,\n\t\t\t116.251.84.248/30,\n\t\t\t116.251.88.36/30,\n\t\t\t116.251.88.40/29,\n\t\t\t116.251.88.48/29,\n\t\t\t116.251.88.58/31,\n\t\t\t116.251.88.60/30,\n\t\t\t116.251.88.64/30,\n\t\t\t116.251.88.70/31,\n\t\t\t116.251.88.72/29,\n\t\t\t116.251.88.80/29,\n\t\t\t116.251.88.88/31,\n\t\t\t116.251.88.92/31,\n\t\t\t116.251.88.96/28,\n\t\t\t116.251.88.112/29,\n\t\t\t116.251.88.122/31,\n\t\t\t116.251.88.124/30,\n\t\t\t116.251.88.128/27,\n\t\t\t116.251.88.162/31,\n\t\t\t116.251.88.164/30,\n\t\t\t116.251.88.170/31,\n\t\t\t116.251.88.174/31,\n\t\t\t116.251.88.176/29,\n\t\t\t116.251.88.186/31,\n\t\t\t116.251.88.188/30,\n\t\t\t116.251.88.192/30,\n\t\t\t116.251.88.198/31,\n\t\t\t116.251.88.200/29,\n\t\t\t116.251.88.208/30,\n\t\t\t116.251.88.212/31,\n\t\t\t116.251.88.218/31,\n\t\t\t116.251.88.224/30,\n\t\t\t116.251.88.230/31,\n\t\t\t116.251.88.234/31,\n\t\t\t116.251.88.240/31,\n\t\t\t116.251.88.244/30,\n\t\t\t116.251.88.248/31,\n\t\t\t116.251.88.252/30,\n\t\t\t116.251.89.0/31,\n\t\t\t116.251.89.4/30,\n\t\t\t116.251.89.8/30,\n\t\t\t116.251.89.12/31,\n\t\t\t116.251.89.16/29,\n\t\t\t116.251.89.36/30,\n\t\t\t116.251.89.40/31,\n\t\t\t116.251.89.44/30,\n\t\t\t116.251.89.48/29,\n\t\t\t116.251.89.56/30,\n\t\t\t116.251.89.60/31,\n\t\t\t116.251.89.64/29,\n\t\t\t116.251.89.72/30,\n\t\t\t116.251.89.76/31,\n\t\t\t116.251.89.80/31,\n\t\t\t116.251.89.84/30,\n\t\t\t116.251.89.88/29,\n\t\t\t116.251.89.96/27,\n\t\t\t116.251.89.128/27,\n\t\t\t116.251.89.160/28,\n\t\t\t116.251.89.176/31,\n\t\t\t116.251.89.180/30,\n\t\t\t116.251.89.184/29,\n\t\t\t116.251.89.192/27,\n\t\t\t116.251.89.224/28,\n\t\t\t116.251.89.240/29,\n\t\t\t116.251.89.248/30,\n\t\t\t116.251.90.0/27,\n\t\t\t116.251.90.32/29,\n\t\t\t116.251.90.40/30,\n\t\t\t116.251.90.48/29,\n\t\t\t116.251.90.60/30,\n\t\t\t116.251.90.66/31,\n\t\t\t116.251.90.72/30,\n\t\t\t116.251.90.80/28,\n\t\t\t116.251.90.96/27,\n\t\t\t116.251.90.128/28,\n\t\t\t116.251.90.144/30,\n\t\t\t116.251.90.168/29,\n\t\t\t116.251.90.176/28,\n\t\t\t116.251.90.192/27,\n\t\t\t116.251.90.224/28,\n\t\t\t116.251.90.244/30,\n\t\t\t116.251.91.16/28,\n\t\t\t116.251.91.32/28,\n\t\t\t116.251.91.56/29,\n\t\t\t116.251.91.64/26,\n\t\t\t116.251.91.128/28,\n\t\t\t116.251.91.144/29,\n\t\t\t116.251.91.156/31,\n\t\t\t116.251.91.166/31,\n\t\t\t116.251.91.170/31,\n\t\t\t116.251.91.182/31,\n\t\t\t116.251.91.186/31,\n\t\t\t116.251.91.198/31,\n\t\t\t116.251.91.202/31,\n\t\t\t116.251.91.206/31,\n\t\t\t116.251.91.210/31,\n\t\t\t116.251.91.212/30,\n\t\t\t116.251.91.216/29,\n\t\t\t116.251.91.224/28,\n\t\t\t116.251.91.240/29,\n\t\t\t116.251.91.248/30,\n\t\t\t116.251.92.0/31,\n\t\t\t116.251.92.4/31,\n\t\t\t116.251.93.10/31,\n\t\t\t116.251.93.30/31,\n\t\t\t116.251.93.34/31,\n\t\t\t116.251.93.38/31,\n\t\t\t116.251.93.44/30,\n\t\t\t116.251.93.48/29,\n\t\t\t116.251.93.72/30,\n\t\t\t116.251.93.88/30,\n\t\t\t116.251.93.104/29,\n\t\t\t116.251.93.112/28,\n\t\t\t116.251.93.128/29,\n\t\t\t116.251.93.136/30,\n\t\t\t116.251.93.152/29,\n\t\t\t116.251.93.160/29,\n\t\t\t116.251.93.168/30,\n\t\t\t116.251.93.176/29,\n\t\t\t116.251.93.200/29,\n\t\t\t116.251.93.208/28,\n\t\t\t116.251.94.4/30,\n\t\t\t116.251.94.8/29,\n\t\t\t116.251.94.16/28,\n\t\t\t116.251.94.32/27,\n\t\t\t116.251.94.64/26,\n\t\t\t116.251.94.128/27,\n\t\t\t116.251.94.160/28,\n\t\t\t116.251.94.176/29,\n\t\t\t116.251.94.186/31,\n\t\t\t116.251.94.188/30,\n\t\t\t116.251.94.192/26,\n\t\t\t116.251.95.0/24,\n\t\t\t116.251.100.4/30,\n\t\t\t116.251.100.8/31,\n\t\t\t116.251.100.20/31,\n\t\t\t116.251.100.24/31,\n\t\t\t116.251.100.72/31,\n\t\t\t116.251.100.84/31,\n\t\t\t116.251.100.90/31,\n\t\t\t116.251.100.92/31,\n\t\t\t116.251.100.98/31,\n\t\t\t116.251.100.100/31,\n\t\t\t116.251.100.104/31,\n\t\t\t116.251.100.118/31,\n\t\t\t116.251.100.122/31,\n\t\t\t116.251.100.124/31,\n\t\t\t116.251.100.136/31,\n\t\t\t116.251.100.181/32,\n\t\t\t116.251.100.182/31,\n\t\t\t116.251.100.184/29,\n\t\t\t116.251.100.211/32,\n\t\t\t116.251.100.212/30,\n\t\t\t116.251.100.220/31,\n\t\t\t116.251.100.224/32,\n\t\t\t116.251.100.226/32,\n\t\t\t116.251.100.234/31,\n\t\t\t116.251.100.242/31,\n\t\t\t116.251.100.244/30,\n\t\t\t116.251.100.253/32,\n\t\t\t116.251.100.254/31,\n\t\t\t116.251.101.4/30,\n\t\t\t116.251.101.8/30,\n\t\t\t116.251.101.12/31,\n\t\t\t116.251.101.18/31,\n\t\t\t116.251.101.20/31,\n\t\t\t116.251.101.24/31,\n\t\t\t116.251.101.32/30,\n\t\t\t116.251.101.52/31,\n\t\t\t116.251.101.62/31,\n\t\t\t116.251.101.72/31,\n\t\t\t116.251.101.78/31,\n\t\t\t116.251.101.84/31,\n\t\t\t116.251.101.90/31,\n\t\t\t116.251.101.92/31,\n\t\t\t116.251.101.98/31,\n\t\t\t116.251.101.100/31,\n\t\t\t116.251.101.104/30,\n\t\t\t116.251.101.108/31,\n\t\t\t116.251.101.118/31,\n\t\t\t116.251.101.122/31,\n\t\t\t116.251.101.124/31,\n\t\t\t116.251.101.146/31,\n\t\t\t116.251.101.148/30,\n\t\t\t116.251.101.152/30,\n\t\t\t116.251.101.160/31,\n\t\t\t116.251.101.176/28,\n\t\t\t116.251.101.210/31,\n\t\t\t116.251.101.212/30,\n\t\t\t116.251.101.220/31,\n\t\t\t116.251.101.234/31,\n\t\t\t116.251.101.236/30,\n\t\t\t116.251.101.242/31,\n\t\t\t116.251.101.244/30,\n\t\t\t116.251.101.248/29,\n\t\t\t116.251.102.0/23,\n\t\t\t116.251.104.0/27,\n\t\t\t116.251.104.32/28,\n\t\t\t116.251.104.48/30,\n\t\t\t116.251.104.52/31,\n\t\t\t116.251.104.58/31,\n\t\t\t116.251.104.60/30,\n\t\t\t116.251.104.64/26,\n\t\t\t116.251.104.128/25,\n\t\t\t116.251.105.0/24,\n\t\t\t116.251.106.0/25,\n\t\t\t116.251.106.128/27,\n\t\t\t116.251.106.160/30,\n\t\t\t116.251.106.166/31,\n\t\t\t116.251.106.170/31,\n\t\t\t116.251.106.174/31,\n\t\t\t116.251.106.176/28,\n\t\t\t116.251.106.192/26,\n\t\t\t116.251.107.0/28,\n\t\t\t116.251.107.16/30,\n\t\t\t116.251.107.22/31,\n\t\t\t116.251.107.26/31,\n\t\t\t116.251.107.28/30,\n\t\t\t116.251.107.34/31,\n\t\t\t116.251.107.36/30,\n\t\t\t116.251.107.40/29,\n\t\t\t116.251.107.48/28,\n\t\t\t116.251.107.64/28,\n\t\t\t116.251.107.80/30,\n\t\t\t116.251.107.92/30,\n\t\t\t116.251.107.96/29,\n\t\t\t116.251.107.104/30,\n\t\t\t116.251.107.112/28,\n\t\t\t116.251.107.128/26,\n\t\t\t116.251.107.192/27,\n\t\t\t116.251.107.224/28,\n\t\t\t116.251.107.240/29,\n\t\t\t116.251.107.248/30,\n\t\t\t116.251.108.0/26,\n\t\t\t116.251.108.64/28,\n\t\t\t116.251.108.80/29,\n\t\t\t116.251.108.96/30,\n\t\t\t116.251.108.104/29,\n\t\t\t116.251.108.112/30,\n\t\t\t116.251.108.144/28,\n\t\t\t116.251.108.160/28,\n\t\t\t116.251.108.176/29,\n\t\t\t116.251.108.188/30,\n\t\t\t116.251.108.194/31,\n\t\t\t116.251.108.196/30,\n\t\t\t116.251.108.200/29,\n\t\t\t116.251.109.33/32,\n\t\t\t116.251.109.34/31,\n\t\t\t116.251.109.36/30,\n\t\t\t116.251.109.40/31,\n\t\t\t116.251.109.42/32,\n\t\t\t116.251.109.63/32,\n\t\t\t116.251.109.64/31,\n\t\t\t116.251.109.66/32,\n\t\t\t116.251.109.80/30,\n\t\t\t116.251.109.87/32,\n\t\t\t116.251.109.88/30,\n\t\t\t116.251.109.95/32,\n\t\t\t116.251.109.96/30,\n\t\t\t116.251.109.108/30,\n\t\t\t116.251.109.120/30,\n\t\t\t116.251.109.131/32,\n\t\t\t116.251.109.132/30,\n\t\t\t116.251.109.136/30,\n\t\t\t116.251.109.143/32,\n\t\t\t116.251.109.144/30,\n\t\t\t116.251.109.151/32,\n\t\t\t116.251.109.152/29,\n\t\t\t116.251.109.160/30,\n\t\t\t116.251.109.167/32,\n\t\t\t116.251.109.168/29,\n\t\t\t116.251.109.176/30,\n\t\t\t116.251.109.187/32,\n\t\t\t116.251.109.188/30,\n\t\t\t116.251.109.192/30,\n\t\t\t116.251.109.204/30,\n\t\t\t116.251.109.208/29,\n\t\t\t116.251.109.216/30,\n\t\t\t116.251.109.231/32,\n\t\t\t116.251.109.232/30,\n\t\t\t116.251.109.243/32,\n\t\t\t116.251.109.244/30,\n\t\t\t116.251.109.248/30,\n\t\t\t116.251.110.16/28,\n\t\t\t116.251.110.32/28,\n\t\t\t116.251.110.48/29,\n\t\t\t116.251.110.56/31,\n\t\t\t116.251.110.62/31,\n\t\t\t116.251.110.64/27,\n\t\t\t116.251.110.96/28,\n\t\t\t116.251.110.112/29,\n\t\t\t116.251.110.124/30,\n\t\t\t116.251.110.128/26,\n\t\t\t116.251.110.192/27,\n\t\t\t116.251.110.224/31,\n\t\t\t116.251.110.230/31,\n\t\t\t116.251.110.232/29,\n\t\t\t116.251.110.240/28,\n\t\t\t116.251.111.0/29,\n\t\t\t116.251.111.8/30,\n\t\t\t116.251.111.16/30,\n\t\t\t116.251.111.32/29,\n\t\t\t116.251.111.48/30,\n\t\t\t116.251.111.52/31,\n\t\t\t116.251.111.76/30,\n\t\t\t116.251.111.84/30,\n\t\t\t116.251.111.88/30,\n\t\t\t116.251.111.112/30,\n\t\t\t116.251.111.148/30,\n\t\t\t116.251.111.164/31,\n\t\t\t116.251.111.196/30,\n\t\t\t116.251.111.200/30,\n\t\t\t116.251.111.214/31,\n\t\t\t116.251.111.218/31,\n\t\t\t116.251.111.220/31,\n\t\t\t116.251.111.234/31,\n\t\t\t116.251.111.236/31,\n\t\t\t116.251.112.0/22,\n\t\t\t116.251.116.0/26,\n\t\t\t116.251.116.68/30,\n\t\t\t116.251.116.72/29,\n\t\t\t116.251.116.80/28,\n\t\t\t116.251.116.96/27,\n\t\t\t116.251.116.128/26,\n\t\t\t116.251.116.192/28,\n\t\t\t116.251.116.208/29,\n\t\t\t116.251.116.216/30,\n\t\t\t116.251.116.222/31,\n\t\t\t116.251.116.226/31,\n\t\t\t116.251.116.230/31,\n\t\t\t116.251.116.232/29,\n\t\t\t116.251.116.240/28,\n\t\t\t116.251.117.0/24,\n\t\t\t116.251.118.0/25,\n\t\t\t116.251.118.128/27,\n\t\t\t116.251.118.160/29,\n\t\t\t116.251.118.168/31,\n\t\t\t116.251.118.172/31,\n\t\t\t116.251.118.176/28,\n\t\t\t116.251.118.192/30,\n\t\t\t116.251.118.212/30,\n\t\t\t116.251.118.216/29,\n\t\t\t116.251.118.224/27,\n\t\t\t116.251.119.0/24,\n\t\t\t116.251.120.4/30,\n\t\t\t116.251.120.12/30,\n\t\t\t116.251.120.16/28,\n\t\t\t116.251.120.32/27,\n\t\t\t116.251.120.64/26,\n\t\t\t116.251.120.128/25,\n\t\t\t116.251.124.0/22,\n\t\t\t116.252.0.0/15,\n\t\t\t116.254.104.0/21,\n\t\t\t116.254.128.0/17,\n\t\t\t116.255.128.0/17,\n\t\t\t117.8.0.0/13,\n\t\t\t117.21.0.0/16,\n\t\t\t117.22.0.0/15,\n\t\t\t117.24.0.0/13,\n\t\t\t117.32.0.0/13,\n\t\t\t117.40.0.0/14,\n\t\t\t117.44.0.0/15,\n\t\t\t117.48.0.0/16,\n\t\t\t117.49.0.0/19,\n\t\t\t117.49.32.0/20,\n\t\t\t117.49.48.0/23,\n\t\t\t117.49.50.0/24,\n\t\t\t117.49.51.0/25,\n\t\t\t117.49.51.128/28,\n\t\t\t117.49.51.144/30,\n\t\t\t117.49.51.148/31,\n\t\t\t117.49.51.152/29,\n\t\t\t117.49.51.160/27,\n\t\t\t117.49.51.192/26,\n\t\t\t117.49.52.0/22,\n\t\t\t117.49.56.0/22,\n\t\t\t117.49.60.0/24,\n\t\t\t117.49.61.0/28,\n\t\t\t117.49.61.20/30,\n\t\t\t117.49.61.24/29,\n\t\t\t117.49.61.32/29,\n\t\t\t117.49.61.48/28,\n\t\t\t117.49.61.64/27,\n\t\t\t117.49.61.96/28,\n\t\t\t117.49.61.112/29,\n\t\t\t117.49.61.120/30,\n\t\t\t117.49.61.128/25,\n\t\t\t117.49.62.0/23,\n\t\t\t117.49.64.0/18,\n\t\t\t117.49.128.0/17,\n\t\t\t117.50.0.0/15,\n\t\t\t117.53.48.0/20,\n\t\t\t117.53.176.0/20,\n\t\t\t117.55.253.0/24,\n\t\t\t117.57.0.0/16,\n\t\t\t117.58.0.0/17,\n\t\t\t117.59.0.0/16,\n\t\t\t117.60.0.0/14,\n\t\t\t117.64.0.0/13,\n\t\t\t117.72.0.0/15,\n\t\t\t117.74.64.0/19,\n\t\t\t117.74.128.0/17,\n\t\t\t117.75.0.0/16,\n\t\t\t117.76.0.0/14,\n\t\t\t117.80.0.0/12,\n\t\t\t117.100.0.0/15,\n\t\t\t117.103.16.0/20,\n\t\t\t117.103.40.0/21,\n\t\t\t117.103.72.0/21,\n\t\t\t117.103.128.0/20,\n\t\t\t117.104.168.0/21,\n\t\t\t117.106.0.0/15,\n\t\t\t117.112.0.0/13,\n\t\t\t117.120.64.0/18,\n\t\t\t117.121.0.0/19,\n\t\t\t117.121.32.0/21,\n\t\t\t117.121.40.0/22,\n\t\t\t117.121.44.0/23,\n\t\t\t117.121.46.0/24,\n\t\t\t117.121.48.0/20,\n\t\t\t117.121.64.0/18,\n\t\t\t117.121.128.0/20,\n\t\t\t117.121.148.0/22,\n\t\t\t117.121.152.0/21,\n\t\t\t117.121.160.0/19,\n\t\t\t117.121.192.0/21,\n\t\t\t117.122.128.0/17,\n\t\t\t117.124.0.0/14,\n\t\t\t117.128.0.0/10,\n\t\t\t118.24.0.0/15,\n\t\t\t118.26.0.0/19,\n\t\t\t118.26.32.0/22,\n\t\t\t118.26.40.0/21,\n\t\t\t118.26.48.0/21,\n\t\t\t118.26.64.0/19,\n\t\t\t118.26.96.0/21,\n\t\t\t118.26.112.0/20,\n\t\t\t118.26.128.0/22,\n\t\t\t118.26.133.0/24,\n\t\t\t118.26.134.0/23,\n\t\t\t118.26.136.0/21,\n\t\t\t118.26.144.0/23,\n\t\t\t118.26.147.0/24,\n\t\t\t118.26.160.0/20,\n\t\t\t118.26.188.0/22,\n\t\t\t118.26.192.0/18,\n\t\t\t118.28.0.0/14,\n\t\t\t118.64.0.0/15,\n\t\t\t118.66.0.0/16,\n\t\t\t118.67.112.0/20,\n\t\t\t118.72.0.0/13,\n\t\t\t118.80.0.0/15,\n\t\t\t118.84.0.0/15,\n\t\t\t118.88.32.0/19,\n\t\t\t118.88.64.0/18,\n\t\t\t118.88.128.0/17,\n\t\t\t118.89.0.0/16,\n\t\t\t118.91.240.0/20,\n\t\t\t118.102.16.0/20,\n\t\t\t118.102.32.0/21,\n\t\t\t118.103.164.0/22,\n\t\t\t118.103.168.0/21,\n\t\t\t118.103.176.0/22,\n\t\t\t118.112.0.0/13,\n\t\t\t118.120.0.0/14,\n\t\t\t118.124.0.0/15,\n\t\t\t118.126.0.0/16,\n\t\t\t118.127.128.0/19,\n\t\t\t118.132.0.0/14,\n\t\t\t118.144.0.0/14,\n\t\t\t118.178.0.0/16,\n\t\t\t118.180.0.0/14,\n\t\t\t118.184.4.0/22,\n\t\t\t118.184.12.0/22,\n\t\t\t118.184.16.0/22,\n\t\t\t118.184.20.0/23,\n\t\t\t118.184.23.0/24,\n\t\t\t118.184.24.0/22,\n\t\t\t118.184.28.0/23,\n\t\t\t118.184.31.0/24,\n\t\t\t118.184.32.0/21,\n\t\t\t118.184.53.0/24,\n\t\t\t118.184.54.0/23,\n\t\t\t118.184.56.0/21,\n\t\t\t118.184.65.0/24,\n\t\t\t118.184.70.0/23,\n\t\t\t118.184.74.0/23,\n\t\t\t118.184.80.0/24,\n\t\t\t118.184.89.0/24,\n\t\t\t118.184.90.0/23,\n\t\t\t118.184.108.0/22,\n\t\t\t118.184.128.0/17,\n\t\t\t118.186.0.0/15,\n\t\t\t118.188.0.0/22,\n\t\t\t118.188.8.0/21,\n\t\t\t118.188.16.0/20,\n\t\t\t118.188.32.0/19,\n\t\t\t118.188.64.0/18,\n\t\t\t118.188.160.0/19,\n\t\t\t118.188.192.0/18,\n\t\t\t118.190.0.0/16,\n\t\t\t118.191.0.0/21,\n\t\t\t118.191.8.0/22,\n\t\t\t118.191.12.0/24,\n\t\t\t118.191.17.0/24,\n\t\t\t118.191.18.0/23,\n\t\t\t118.191.20.0/22,\n\t\t\t118.191.48.0/20,\n\t\t\t118.191.64.0/20,\n\t\t\t118.191.80.0/22,\n\t\t\t118.191.128.0/19,\n\t\t\t118.191.176.0/20,\n\t\t\t118.191.192.0/20,\n\t\t\t118.191.208.0/24,\n\t\t\t118.191.216.0/22,\n\t\t\t118.191.223.0/24,\n\t\t\t118.191.224.0/24,\n\t\t\t118.191.240.0/20,\n\t\t\t118.192.0.0/16,\n\t\t\t118.193.0.0/22,\n\t\t\t118.193.8.0/21,\n\t\t\t118.193.48.0/22,\n\t\t\t118.193.52.0/23,\n\t\t\t118.193.54.0/24,\n\t\t\t118.193.96.0/19,\n\t\t\t118.193.130.0/23,\n\t\t\t118.193.132.0/22,\n\t\t\t118.193.137.0/24,\n\t\t\t118.193.139.0/24,\n\t\t\t118.193.140.0/24,\n\t\t\t118.193.149.0/24,\n\t\t\t118.193.150.0/23,\n\t\t\t118.193.163.0/24,\n\t\t\t118.193.169.0/24,\n\t\t\t118.193.170.0/24,\n\t\t\t118.193.172.0/24,\n\t\t\t118.193.177.0/24,\n\t\t\t118.193.178.0/23,\n\t\t\t118.193.180.0/22,\n\t\t\t118.193.184.0/22,\n\t\t\t118.193.192.0/18,\n\t\t\t118.194.0.0/17,\n\t\t\t118.194.128.0/18,\n\t\t\t118.194.192.0/19,\n\t\t\t118.194.240.0/21,\n\t\t\t118.195.0.0/16,\n\t\t\t118.196.0.0/14,\n\t\t\t118.202.0.0/15,\n\t\t\t118.204.0.0/14,\n\t\t\t118.212.0.0/15,\n\t\t\t118.215.192.0/18,\n\t\t\t118.224.0.0/14,\n\t\t\t118.228.0.0/15,\n\t\t\t118.230.0.0/16,\n\t\t\t118.239.0.0/16,\n\t\t\t118.242.0.0/16,\n\t\t\t118.244.0.0/14,\n\t\t\t118.248.0.0/13,\n\t\t\t119.0.0.0/15,\n\t\t\t119.2.0.0/19,\n\t\t\t119.2.128.0/17,\n\t\t\t119.3.0.0/16,\n\t\t\t119.4.0.0/14,\n\t\t\t119.10.0.0/17,\n\t\t\t119.15.136.0/21,\n\t\t\t119.16.0.0/16,\n\t\t\t119.18.192.0/20,\n\t\t\t119.18.208.0/21,\n\t\t\t119.18.224.0/19,\n\t\t\t119.19.0.0/16,\n\t\t\t119.20.0.0/14,\n\t\t\t119.27.64.0/18,\n\t\t\t119.27.128.0/17,\n\t\t\t119.28.28.0/24,\n\t\t\t119.29.0.0/16,\n\t\t\t119.30.48.0/20,\n\t\t\t119.31.160.0/24,\n\t\t\t119.31.192.0/19,\n\t\t\t119.32.0.0/14,\n\t\t\t119.36.0.0/15,\n\t\t\t119.38.0.0/17,\n\t\t\t119.38.129.0/24,\n\t\t\t119.38.130.0/23,\n\t\t\t119.38.132.0/22,\n\t\t\t119.38.136.0/21,\n\t\t\t119.38.144.0/20,\n\t\t\t119.38.160.0/19,\n\t\t\t119.38.192.0/18,\n\t\t\t119.39.0.0/16,\n\t\t\t119.40.0.0/18,\n\t\t\t119.40.64.0/20,\n\t\t\t119.40.128.0/17,\n\t\t\t119.41.0.0/16,\n\t\t\t119.42.0.0/19,\n\t\t\t119.42.128.0/20,\n\t\t\t119.42.224.0/19,\n\t\t\t119.44.0.0/15,\n\t\t\t119.48.0.0/13,\n\t\t\t119.57.0.0/16,\n\t\t\t119.58.0.0/16,\n\t\t\t119.59.128.0/18,\n\t\t\t119.59.208.0/22,\n\t\t\t119.59.220.0/22,\n\t\t\t119.59.236.0/22,\n\t\t\t119.59.244.0/22,\n\t\t\t119.60.0.0/15,\n\t\t\t119.62.0.0/16,\n\t\t\t119.63.32.0/19,\n\t\t\t119.75.208.0/20,\n\t\t\t119.78.0.0/15,\n\t\t\t119.80.0.0/16,\n\t\t\t119.82.208.0/20,\n\t\t\t119.84.0.0/14,\n\t\t\t119.88.0.0/14,\n\t\t\t119.96.0.0/13,\n\t\t\t119.108.0.0/15,\n\t\t\t119.112.0.0/12,\n\t\t\t119.128.0.0/12,\n\t\t\t119.144.0.0/14,\n\t\t\t119.148.160.0/19,\n\t\t\t119.151.192.0/18,\n\t\t\t119.160.200.0/21,\n\t\t\t119.161.120.0/21,\n\t\t\t119.161.136.0/23,\n\t\t\t119.161.138.0/24,\n\t\t\t119.161.140.0/22,\n\t\t\t119.161.144.0/22,\n\t\t\t119.161.148.0/23,\n\t\t\t119.161.151.0/24,\n\t\t\t119.161.152.0/21,\n\t\t\t119.161.160.0/19,\n\t\t\t119.161.192.0/18,\n\t\t\t119.162.0.0/15,\n\t\t\t119.164.0.0/14,\n\t\t\t119.176.0.0/12,\n\t\t\t119.232.0.0/15,\n\t\t\t119.235.128.0/19,\n\t\t\t119.235.160.0/20,\n\t\t\t119.235.181.0/24,\n\t\t\t119.235.184.0/22,\n\t\t\t119.248.0.0/14,\n\t\t\t119.252.96.0/21,\n\t\t\t119.252.240.0/21,\n\t\t\t119.252.249.0/24,\n\t\t\t119.252.252.0/23,\n\t\t\t119.253.0.0/16,\n\t\t\t119.254.0.0/15,\n\t\t\t120.0.0.0/12,\n\t\t\t120.24.0.0/14,\n\t\t\t120.30.0.0/17,\n\t\t\t120.30.128.0/20,\n\t\t\t120.30.144.0/22,\n\t\t\t120.30.148.0/23,\n\t\t\t120.30.151.0/24,\n\t\t\t120.30.152.0/21,\n\t\t\t120.30.160.0/19,\n\t\t\t120.30.192.0/18,\n\t\t\t120.31.0.0/16,\n\t\t\t120.32.0.0/12,\n\t\t\t120.48.0.0/15,\n\t\t\t120.52.0.0/14,\n\t\t\t120.64.0.0/13,\n\t\t\t120.72.32.0/19,\n\t\t\t120.72.128.0/17,\n\t\t\t120.76.0.0/14,\n\t\t\t120.80.0.0/13,\n\t\t\t120.88.8.0/21,\n\t\t\t120.90.0.0/15,\n\t\t\t120.92.0.0/16,\n\t\t\t120.94.0.0/15,\n\t\t\t120.128.0.0/13,\n\t\t\t120.136.16.0/21,\n\t\t\t120.136.128.0/18,\n\t\t\t120.137.0.0/17,\n\t\t\t120.143.128.0/19,\n\t\t\t120.192.0.0/10,\n\t\t\t121.0.8.0/21,\n\t\t\t121.0.16.0/20,\n\t\t\t121.4.0.0/15,\n\t\t\t121.8.0.0/13,\n\t\t\t121.16.0.0/12,\n\t\t\t121.32.0.0/13,\n\t\t\t121.40.0.0/14,\n\t\t\t121.46.0.0/18,\n\t\t\t121.46.76.0/22,\n\t\t\t121.46.128.0/21,\n\t\t\t121.46.141.0/24,\n\t\t\t121.46.160.0/19,\n\t\t\t121.46.192.0/18,\n\t\t\t121.47.0.0/16,\n\t\t\t121.48.0.0/15,\n\t\t\t121.50.8.0/21,\n\t\t\t121.51.0.0/16,\n\t\t\t121.52.160.0/19,\n\t\t\t121.52.208.0/20,\n\t\t\t121.52.224.0/19,\n\t\t\t121.54.176.0/21,\n\t\t\t121.55.0.0/18,\n\t\t\t121.56.0.0/15,\n\t\t\t121.58.0.0/17,\n\t\t\t121.58.136.0/21,\n\t\t\t121.58.144.0/20,\n\t\t\t121.58.160.0/21,\n\t\t\t121.59.0.0/20,\n\t\t\t121.59.16.0/24,\n\t\t\t121.59.18.0/23,\n\t\t\t121.59.20.0/22,\n\t\t\t121.59.24.0/22,\n\t\t\t121.59.28.0/24,\n\t\t\t121.59.30.0/23,\n\t\t\t121.59.36.0/23,\n\t\t\t121.59.39.0/24,\n\t\t\t121.59.40.0/21,\n\t\t\t121.59.48.0/20,\n\t\t\t121.59.64.0/19,\n\t\t\t121.59.96.0/22,\n\t\t\t121.59.102.0/23,\n\t\t\t121.59.104.0/24,\n\t\t\t121.59.108.0/24,\n\t\t\t121.59.110.0/23,\n\t\t\t121.59.112.0/21,\n\t\t\t121.59.121.0/24,\n\t\t\t121.59.123.0/24,\n\t\t\t121.59.125.0/24,\n\t\t\t121.59.126.0/23,\n\t\t\t121.59.160.0/19,\n\t\t\t121.59.192.0/18,\n\t\t\t121.60.0.0/14,\n\t\t\t121.68.0.0/14,\n\t\t\t121.76.0.0/15,\n\t\t\t121.79.128.0/18,\n\t\t\t121.89.0.0/16,\n\t\t\t121.91.104.0/21,\n\t\t\t121.100.128.0/17,\n\t\t\t121.101.0.0/18,\n\t\t\t121.101.208.0/20,\n\t\t\t121.192.0.0/13,\n\t\t\t121.200.192.0/21,\n\t\t\t121.201.0.0/16,\n\t\t\t121.204.0.0/14,\n\t\t\t121.224.0.0/12,\n\t\t\t121.248.0.0/14,\n\t\t\t121.255.0.0/16,\n\t\t\t122.0.64.0/18,\n\t\t\t122.4.0.0/14,\n\t\t\t122.8.0.0/24,\n\t\t\t122.8.23.0/24,\n\t\t\t122.8.70.0/23,\n\t\t\t122.8.72.0/22,\n\t\t\t122.8.116.0/22,\n\t\t\t122.8.192.0/18,\n\t\t\t122.9.0.0/16,\n\t\t\t122.10.132.0/23,\n\t\t\t122.10.136.0/23,\n\t\t\t122.10.160.0/24,\n\t\t\t122.10.164.0/22,\n\t\t\t122.10.168.0/21,\n\t\t\t122.10.194.0/23,\n\t\t\t122.10.200.0/22,\n\t\t\t122.10.205.0/24,\n\t\t\t122.10.206.0/23,\n\t\t\t122.10.208.0/23,\n\t\t\t122.10.210.0/24,\n\t\t\t122.10.212.0/22,\n\t\t\t122.10.216.0/22,\n\t\t\t122.10.228.0/22,\n\t\t\t122.10.232.0/21,\n\t\t\t122.10.240.0/22,\n\t\t\t122.11.32.0/19,\n\t\t\t122.12.0.0/15,\n\t\t\t122.14.0.0/17,\n\t\t\t122.14.128.0/21,\n\t\t\t122.14.172.0/24,\n\t\t\t122.14.174.0/23,\n\t\t\t122.14.176.0/21,\n\t\t\t122.14.184.0/22,\n\t\t\t122.14.188.0/23,\n\t\t\t122.14.190.0/24,\n\t\t\t122.14.192.0/18,\n\t\t\t122.48.0.0/16,\n\t\t\t122.49.0.0/18,\n\t\t\t122.51.0.0/16,\n\t\t\t122.64.0.0/11,\n\t\t\t122.96.0.0/15,\n\t\t\t122.102.0.0/20,\n\t\t\t122.102.64.0/19,\n\t\t\t122.112.0.0/18,\n\t\t\t122.112.64.0/19,\n\t\t\t122.112.118.0/24,\n\t\t\t122.112.122.0/24,\n\t\t\t122.112.125.0/24,\n\t\t\t122.112.128.0/17,\n\t\t\t122.113.0.0/19,\n\t\t\t122.113.32.0/20,\n\t\t\t122.113.48.0/23,\n\t\t\t122.113.51.0/24,\n\t\t\t122.113.52.0/22,\n\t\t\t122.113.56.0/21,\n\t\t\t122.113.64.0/18,\n\t\t\t122.113.128.0/17,\n\t\t\t122.114.0.0/16,\n\t\t\t122.115.0.0/18,\n\t\t\t122.115.80.0/20,\n\t\t\t122.115.96.0/19,\n\t\t\t122.115.128.0/17,\n\t\t\t122.119.0.0/16,\n\t\t\t122.128.100.0/22,\n\t\t\t122.128.120.0/21,\n\t\t\t122.136.0.0/13,\n\t\t\t122.144.128.0/17,\n\t\t\t122.152.192.0/18,\n\t\t\t122.156.0.0/14,\n\t\t\t122.188.0.0/14,\n\t\t\t122.192.0.0/14,\n\t\t\t122.198.0.0/18,\n\t\t\t122.198.68.0/22,\n\t\t\t122.198.72.0/21,\n\t\t\t122.198.80.0/20,\n\t\t\t122.198.96.0/19,\n\t\t\t122.198.128.0/17,\n\t\t\t122.200.40.0/21,\n\t\t\t122.200.64.0/18,\n\t\t\t122.201.48.0/20,\n\t\t\t122.204.0.0/14,\n\t\t\t122.224.0.0/12,\n\t\t\t122.240.0.0/13,\n\t\t\t122.248.24.0/21,\n\t\t\t122.248.48.0/20,\n\t\t\t122.255.64.0/21,\n\t\t\t123.0.128.0/18,\n\t\t\t123.4.0.0/14,\n\t\t\t123.8.0.0/13,\n\t\t\t123.49.128.0/17,\n\t\t\t123.50.160.0/19,\n\t\t\t123.52.0.0/14,\n\t\t\t123.56.0.0/15,\n\t\t\t123.58.0.0/17,\n\t\t\t123.58.128.0/18,\n\t\t\t123.58.224.0/19,\n\t\t\t123.59.0.0/16,\n\t\t\t123.60.0.0/15,\n\t\t\t123.62.0.0/16,\n\t\t\t123.64.0.0/11,\n\t\t\t123.96.0.0/15,\n\t\t\t123.98.4.0/22,\n\t\t\t123.98.8.0/22,\n\t\t\t123.98.16.0/21,\n\t\t\t123.98.28.0/22,\n\t\t\t123.98.32.0/22,\n\t\t\t123.98.40.0/21,\n\t\t\t123.98.48.0/22,\n\t\t\t123.98.56.0/21,\n\t\t\t123.98.68.0/22,\n\t\t\t123.98.76.0/22,\n\t\t\t123.98.80.0/21,\n\t\t\t123.98.88.0/22,\n\t\t\t123.98.96.0/22,\n\t\t\t123.98.104.0/21,\n\t\t\t123.98.112.0/21,\n\t\t\t123.98.120.0/22,\n\t\t\t123.99.128.0/19,\n\t\t\t123.99.160.0/22,\n\t\t\t123.99.164.0/24,\n\t\t\t123.99.166.0/23,\n\t\t\t123.99.168.0/21,\n\t\t\t123.99.176.0/20,\n\t\t\t123.99.192.0/18,\n\t\t\t123.100.0.0/19,\n\t\t\t123.101.0.0/16,\n\t\t\t123.103.0.0/17,\n\t\t\t123.108.88.0/23,\n\t\t\t123.108.130.0/23,\n\t\t\t123.108.132.0/22,\n\t\t\t123.108.136.0/21,\n\t\t\t123.108.208.0/20,\n\t\t\t123.112.0.0/12,\n\t\t\t123.128.0.0/13,\n\t\t\t123.137.0.0/16,\n\t\t\t123.138.0.0/15,\n\t\t\t123.144.0.0/12,\n\t\t\t123.160.0.0/12,\n\t\t\t123.176.60.0/22,\n\t\t\t123.176.80.0/20,\n\t\t\t123.177.0.0/16,\n\t\t\t123.178.0.0/15,\n\t\t\t123.180.0.0/14,\n\t\t\t123.184.0.0/13,\n\t\t\t123.196.0.0/15,\n\t\t\t123.199.128.0/17,\n\t\t\t123.206.0.0/15,\n\t\t\t123.232.0.0/14,\n\t\t\t123.242.192.0/21,\n\t\t\t123.244.0.0/14,\n\t\t\t123.249.0.0/17,\n\t\t\t123.253.226.0/24,\n\t\t\t123.253.240.0/22,\n\t\t\t123.254.96.0/21,\n\t\t\t124.6.64.0/18,\n\t\t\t124.14.0.0/15,\n\t\t\t124.16.0.0/15,\n\t\t\t124.22.0.0/15,\n\t\t\t124.28.192.0/18,\n\t\t\t124.29.0.0/17,\n\t\t\t124.31.0.0/16,\n\t\t\t124.40.112.0/20,\n\t\t\t124.40.128.0/18,\n\t\t\t124.40.192.0/19,\n\t\t\t124.40.240.0/22,\n\t\t\t124.42.0.0/16,\n\t\t\t124.47.0.0/18,\n\t\t\t124.64.0.0/15,\n\t\t\t124.66.0.0/17,\n\t\t\t124.67.0.0/16,\n\t\t\t124.68.0.0/17,\n\t\t\t124.68.128.0/18,\n\t\t\t124.68.192.0/19,\n\t\t\t124.68.224.0/20,\n\t\t\t124.68.240.0/21,\n\t\t\t124.68.248.0/22,\n\t\t\t124.68.254.0/23,\n\t\t\t124.69.0.0/16,\n\t\t\t124.70.0.0/16,\n\t\t\t124.71.0.0/17,\n\t\t\t124.71.128.0/18,\n\t\t\t124.71.192.0/19,\n\t\t\t124.71.224.0/20,\n\t\t\t124.71.240.0/21,\n\t\t\t124.71.250.0/23,\n\t\t\t124.71.254.0/23,\n\t\t\t124.72.0.0/13,\n\t\t\t124.88.0.0/13,\n\t\t\t124.108.8.0/21,\n\t\t\t124.108.41.0/24,\n\t\t\t124.108.42.0/23,\n\t\t\t124.108.44.0/22,\n\t\t\t124.109.96.0/21,\n\t\t\t124.112.0.0/13,\n\t\t\t124.126.0.0/15,\n\t\t\t124.128.0.0/13,\n\t\t\t124.150.137.0/24,\n\t\t\t124.151.0.0/16,\n\t\t\t124.152.0.0/16,\n\t\t\t124.160.0.0/13,\n\t\t\t124.172.0.0/15,\n\t\t\t124.174.0.0/16,\n\t\t\t124.175.0.0/17,\n\t\t\t124.175.160.0/19,\n\t\t\t124.192.0.0/15,\n\t\t\t124.196.0.0/16,\n\t\t\t124.200.0.0/13,\n\t\t\t124.220.0.0/14,\n\t\t\t124.224.0.0/12,\n\t\t\t124.240.0.0/17,\n\t\t\t124.240.128.0/18,\n\t\t\t124.242.0.0/16,\n\t\t\t124.243.192.0/18,\n\t\t\t124.248.0.0/17,\n\t\t\t124.249.0.0/16,\n\t\t\t124.250.0.0/15,\n\t\t\t124.254.0.0/18,\n\t\t\t125.31.192.0/18,\n\t\t\t125.32.0.0/12,\n\t\t\t125.58.128.0/17,\n\t\t\t125.61.128.0/17,\n\t\t\t125.62.0.0/18,\n\t\t\t125.64.0.0/11,\n\t\t\t125.96.0.0/15,\n\t\t\t125.98.0.0/16,\n\t\t\t125.104.0.0/13,\n\t\t\t125.112.0.0/12,\n\t\t\t125.169.0.0/16,\n\t\t\t125.171.0.0/16,\n\t\t\t125.208.0.0/18,\n\t\t\t125.210.0.0/15,\n\t\t\t125.213.0.0/17,\n\t\t\t125.214.96.0/19,\n\t\t\t125.215.0.0/18,\n\t\t\t125.216.0.0/13,\n\t\t\t125.254.128.0/17,\n\t\t\t128.107.24.0/23,\n\t\t\t128.108.0.0/16,\n\t\t\t129.28.0.0/16,\n\t\t\t129.204.0.0/16,\n\t\t\t129.211.0.0/16,\n\t\t\t129.227.29.0/24,\n\t\t\t129.227.30.0/24,\n\t\t\t129.227.146.0/23,\n\t\t\t129.227.157.0/24,\n\t\t\t129.227.158.0/23,\n\t\t\t129.227.168.0/21,\n\t\t\t129.227.192.0/23,\n\t\t\t129.227.195.0/24,\n\t\t\t130.36.146.0/23,\n\t\t\t130.214.218.0/23,\n\t\t\t131.228.96.0/23,\n\t\t\t131.253.12.0/29,\n\t\t\t131.253.12.80/28,\n\t\t\t131.253.12.240/29,\n\t\t\t132.232.0.0/16,\n\t\t\t132.237.134.0/24,\n\t\t\t134.75.107.10/31,\n\t\t\t134.75.107.14/31,\n\t\t\t134.175.0.0/16,\n\t\t\t137.59.59.0/24,\n\t\t\t137.59.88.0/22,\n\t\t\t138.252.72.0/23,\n\t\t\t138.252.97.0/24,\n\t\t\t139.5.56.0/21,\n\t\t\t139.5.80.0/22,\n\t\t\t139.5.92.0/22,\n\t\t\t139.5.128.0/22,\n\t\t\t139.5.160.0/22,\n\t\t\t139.5.192.0/22,\n\t\t\t139.5.204.0/22,\n\t\t\t139.5.244.0/22,\n\t\t\t139.9.0.0/16,\n\t\t\t139.95.4.34/32,\n\t\t\t139.129.0.0/16,\n\t\t\t139.138.238.0/28,\n\t\t\t139.148.0.0/16,\n\t\t\t139.155.0.0/16,\n\t\t\t139.159.0.0/19,\n\t\t\t139.159.32.0/21,\n\t\t\t139.159.40.0/22,\n\t\t\t139.159.52.0/22,\n\t\t\t139.159.56.0/21,\n\t\t\t139.159.64.0/19,\n\t\t\t139.159.96.0/20,\n\t\t\t139.159.112.0/22,\n\t\t\t139.159.116.0/23,\n\t\t\t139.159.120.0/21,\n\t\t\t139.159.128.0/17,\n\t\t\t139.170.0.0/16,\n\t\t\t139.176.0.0/16,\n\t\t\t139.183.0.0/18,\n\t\t\t139.183.64.0/19,\n\t\t\t139.183.96.0/22,\n\t\t\t139.183.101.0/24,\n\t\t\t139.183.102.0/23,\n\t\t\t139.183.104.0/21,\n\t\t\t139.183.112.0/20,\n\t\t\t139.183.128.0/18,\n\t\t\t139.186.0.0/16,\n\t\t\t139.189.0.0/16,\n\t\t\t139.196.0.0/15,\n\t\t\t139.198.0.0/18,\n\t\t\t139.198.66.0/23,\n\t\t\t139.198.68.0/22,\n\t\t\t139.198.72.0/21,\n\t\t\t139.198.80.0/20,\n\t\t\t139.198.96.0/19,\n\t\t\t139.198.128.0/17,\n\t\t\t139.199.0.0/16,\n\t\t\t139.200.0.0/13,\n\t\t\t139.208.0.0/13,\n\t\t\t139.217.0.0/16,\n\t\t\t139.219.0.0/16,\n\t\t\t139.220.0.0/15,\n\t\t\t139.224.0.0/16,\n\t\t\t139.226.0.0/15,\n\t\t\t140.75.0.0/16,\n\t\t\t140.143.0.0/16,\n\t\t\t140.179.0.0/16,\n\t\t\t140.205.0.0/16,\n\t\t\t140.206.0.0/15,\n\t\t\t140.210.0.0/16,\n\t\t\t140.224.0.0/16,\n\t\t\t140.237.0.0/16,\n\t\t\t140.240.0.0/16,\n\t\t\t140.242.223.0/24,\n\t\t\t140.242.224.0/24,\n\t\t\t140.243.0.0/16,\n\t\t\t140.246.0.0/16,\n\t\t\t140.248.33.2/31,\n\t\t\t140.249.0.0/16,\n\t\t\t140.250.0.0/16,\n\t\t\t140.255.0.0/16,\n\t\t\t141.11.219.0/24,\n\t\t\t142.70.0.0/16,\n\t\t\t142.86.0.0/16,\n\t\t\t143.20.246.0/24,\n\t\t\t143.64.0.0/16,\n\t\t\t144.0.0.0/16,\n\t\t\t144.7.0.0/16,\n\t\t\t144.12.0.0/16,\n\t\t\t144.36.147.0/24,\n\t\t\t144.48.64.0/22,\n\t\t\t144.48.88.0/22,\n\t\t\t144.48.156.0/22,\n\t\t\t144.48.180.0/22,\n\t\t\t144.48.184.0/22,\n\t\t\t144.48.204.0/22,\n\t\t\t144.48.208.0/21,\n\t\t\t144.48.252.0/22,\n\t\t\t144.52.0.0/16,\n\t\t\t144.79.10.0/23,\n\t\t\t144.79.54.0/23,\n\t\t\t144.79.70.0/23,\n\t\t\t144.79.148.0/24,\n\t\t\t144.123.0.0/16,\n\t\t\t144.178.30.48/28,\n\t\t\t144.225.186.0/24,\n\t\t\t144.255.0.0/16,\n\t\t\t145.14.71.0/24,\n\t\t\t145.14.72.0/22,\n\t\t\t145.14.81.0/24,\n\t\t\t145.14.82.0/24,\n\t\t\t145.14.84.0/24,\n\t\t\t145.14.86.0/24,\n\t\t\t145.14.88.0/24,\n\t\t\t145.14.90.0/24,\n\t\t\t146.56.192.0/18,\n\t\t\t146.75.187.2/31,\n\t\t\t146.75.189.2/31,\n\t\t\t146.75.196.0/31,\n\t\t\t146.196.56.0/22,\n\t\t\t146.196.68.0/22,\n\t\t\t146.196.92.0/22,\n\t\t\t146.196.112.0/21,\n\t\t\t146.196.124.0/22,\n\t\t\t146.222.79.0/24,\n\t\t\t146.222.81.0/24,\n\t\t\t146.222.94.0/24,\n\t\t\t147.78.132.0/24,\n\t\t\t147.78.134.0/24,\n\t\t\t147.243.29.192/26,\n\t\t\t147.243.30.64/26,\n\t\t\t147.243.30.128/27,\n\t\t\t147.243.103.0/25,\n\t\t\t148.70.0.0/16,\n\t\t\t149.41.0.0/16,\n\t\t\t150.0.0.0/16,\n\t\t\t150.107.61.0/24,\n\t\t\t150.115.0.0/16,\n\t\t\t150.121.0.0/16,\n\t\t\t150.122.0.0/16,\n\t\t\t150.129.136.0/22,\n\t\t\t150.129.192.0/22,\n\t\t\t150.129.252.0/22,\n\t\t\t150.138.0.0/15,\n\t\t\t150.158.0.0/16,\n\t\t\t150.222.64.0/24,\n\t\t\t150.222.88.0/23,\n\t\t\t150.223.0.0/16,\n\t\t\t150.242.0.0/21,\n\t\t\t150.242.8.0/22,\n\t\t\t150.242.28.0/22,\n\t\t\t150.242.44.0/22,\n\t\t\t150.242.48.0/21,\n\t\t\t150.242.56.0/22,\n\t\t\t150.242.76.0/22,\n\t\t\t150.242.80.0/22,\n\t\t\t150.242.92.0/22,\n\t\t\t150.242.96.0/22,\n\t\t\t150.242.112.0/21,\n\t\t\t150.242.120.0/22,\n\t\t\t150.242.152.0/21,\n\t\t\t150.242.160.0/21,\n\t\t\t150.242.168.0/22,\n\t\t\t150.242.184.0/21,\n\t\t\t150.242.192.0/22,\n\t\t\t150.242.212.0/24,\n\t\t\t150.242.226.0/23,\n\t\t\t150.242.232.0/21,\n\t\t\t150.242.240.0/21,\n\t\t\t150.242.248.0/22,\n\t\t\t150.248.0.0/16,\n\t\t\t150.255.0.0/16,\n\t\t\t151.158.14.0/23,\n\t\t\t151.242.10.0/24,\n\t\t\t151.243.25.0/24,\n\t\t\t151.247.148.0/23,\n\t\t\t151.247.174.0/24,\n\t\t\t152.104.128.0/17,\n\t\t\t152.136.0.0/16,\n\t\t\t153.0.0.0/16,\n\t\t\t153.3.0.0/16,\n\t\t\t153.34.0.0/15,\n\t\t\t153.36.0.0/15,\n\t\t\t153.99.0.0/16,\n\t\t\t153.101.0.0/16,\n\t\t\t153.118.0.0/15,\n\t\t\t154.8.128.0/17,\n\t\t\t154.19.43.0/24,\n\t\t\t154.72.42.0/24,\n\t\t\t154.72.44.0/24,\n\t\t\t154.72.47.0/24,\n\t\t\t154.84.180.0/24,\n\t\t\t154.89.32.0/21,\n\t\t\t154.89.40.0/22,\n\t\t\t154.89.45.0/24,\n\t\t\t154.89.46.0/24,\n\t\t\t154.91.158.0/23,\n\t\t\t155.117.188.0/24,\n\t\t\t155.126.176.0/23,\n\t\t\t156.59.202.0/23,\n\t\t\t156.59.204.0/23,\n\t\t\t156.59.206.0/24,\n\t\t\t156.59.216.0/24,\n\t\t\t156.107.160.0/23,\n\t\t\t156.107.170.0/24,\n\t\t\t156.107.179.0/24,\n\t\t\t156.107.181.0/24,\n\t\t\t156.154.62.0/23,\n\t\t\t156.230.11.0/24,\n\t\t\t156.231.163.0/24,\n\t\t\t156.237.104.0/23,\n\t\t\t156.242.5.0/24,\n\t\t\t157.0.0.0/16,\n\t\t\t157.10.34.0/23,\n\t\t\t157.10.36.0/23,\n\t\t\t157.10.112.0/23,\n\t\t\t157.10.118.0/23,\n\t\t\t157.10.130.0/23,\n\t\t\t157.10.218.0/23,\n\t\t\t157.10.220.0/23,\n\t\t\t157.10.246.0/23,\n\t\t\t157.15.74.0/23,\n\t\t\t157.15.94.0/23,\n\t\t\t157.15.100.0/22,\n\t\t\t157.15.104.0/23,\n\t\t\t157.18.0.0/16,\n\t\t\t157.20.33.0/24,\n\t\t\t157.20.136.0/23,\n\t\t\t157.20.194.0/23,\n\t\t\t157.20.246.0/23,\n\t\t\t157.61.0.0/16,\n\t\t\t157.66.70.0/23,\n\t\t\t157.66.88.0/21,\n\t\t\t157.66.164.0/23,\n\t\t\t157.66.244.0/23,\n\t\t\t157.119.8.0/21,\n\t\t\t157.119.16.0/22,\n\t\t\t157.119.28.0/22,\n\t\t\t157.119.132.0/22,\n\t\t\t157.119.136.0/21,\n\t\t\t157.119.144.0/20,\n\t\t\t157.119.160.0/21,\n\t\t\t157.119.172.0/22,\n\t\t\t157.119.192.0/21,\n\t\t\t157.119.240.0/22,\n\t\t\t157.119.252.0/22,\n\t\t\t157.122.0.0/16,\n\t\t\t157.133.186.0/23,\n\t\t\t157.133.192.0/21,\n\t\t\t157.148.0.0/16,\n\t\t\t157.156.0.0/16,\n\t\t\t157.255.0.0/16,\n\t\t\t158.26.192.0/24,\n\t\t\t158.26.194.0/24,\n\t\t\t158.60.0.0/16,\n\t\t\t158.79.0.0/24,\n\t\t\t158.79.2.0/23,\n\t\t\t158.79.4.0/22,\n\t\t\t158.79.8.0/21,\n\t\t\t158.79.16.0/20,\n\t\t\t158.79.32.0/19,\n\t\t\t158.79.64.0/18,\n\t\t\t158.79.128.0/17,\n\t\t\t158.140.252.0/22,\n\t\t\t159.27.0.0/16,\n\t\t\t159.75.0.0/16,\n\t\t\t159.226.0.0/16,\n\t\t\t160.19.76.0/23,\n\t\t\t160.19.82.0/23,\n\t\t\t160.19.208.0/21,\n\t\t\t160.19.216.0/22,\n\t\t\t160.20.16.0/22,\n\t\t\t160.20.48.0/22,\n\t\t\t160.20.130.0/23,\n\t\t\t160.22.58.0/23,\n\t\t\t160.22.82.0/23,\n\t\t\t160.22.148.0/23,\n\t\t\t160.22.188.0/23,\n\t\t\t160.22.224.0/23,\n\t\t\t160.22.230.0/23,\n\t\t\t160.22.244.0/22,\n\t\t\t160.25.10.0/23,\n\t\t\t160.25.12.0/23,\n\t\t\t160.25.194.0/23,\n\t\t\t160.30.40.0/23,\n\t\t\t160.30.148.0/22,\n\t\t\t160.30.194.0/23,\n\t\t\t160.30.196.0/22,\n\t\t\t160.30.230.0/23,\n\t\t\t160.83.110.0/24,\n\t\t\t160.187.223.0/24,\n\t\t\t160.187.252.0/22,\n\t\t\t160.191.0.0/23,\n\t\t\t160.191.104.0/23,\n\t\t\t160.191.110.0/23,\n\t\t\t160.202.60.0/23,\n\t\t\t160.202.62.0/24,\n\t\t\t160.202.148.0/22,\n\t\t\t160.202.152.0/22,\n\t\t\t160.202.212.0/22,\n\t\t\t160.202.216.0/21,\n\t\t\t160.202.224.0/19,\n\t\t\t160.250.14.0/23,\n\t\t\t160.250.16.0/22,\n\t\t\t160.250.24.0/23,\n\t\t\t160.250.84.0/23,\n\t\t\t160.250.90.0/23,\n\t\t\t160.250.102.0/23,\n\t\t\t160.250.104.0/23,\n\t\t\t160.250.160.0/23,\n\t\t\t160.250.170.0/23,\n\t\t\t160.250.214.0/23,\n\t\t\t160.250.252.0/23,\n\t\t\t161.120.0.0/16,\n\t\t\t161.163.0.0/21,\n\t\t\t161.163.28.0/23,\n\t\t\t161.189.0.0/16,\n\t\t\t161.207.0.0/16,\n\t\t\t161.248.20.0/23,\n\t\t\t161.248.42.0/23,\n\t\t\t161.248.84.0/23,\n\t\t\t161.248.92.0/23,\n\t\t\t161.248.136.0/24,\n\t\t\t162.14.0.0/19,\n\t\t\t162.14.32.0/20,\n\t\t\t162.14.52.0/22,\n\t\t\t162.14.56.0/21,\n\t\t\t162.14.64.0/18,\n\t\t\t162.14.128.0/17,\n\t\t\t162.62.240.0/23,\n\t\t\t162.62.242.0/24,\n\t\t\t162.105.0.0/16,\n\t\t\t162.141.138.0/24,\n\t\t\t162.213.0.0/24,\n\t\t\t163.0.0.0/16,\n\t\t\t163.47.4.0/22,\n\t\t\t163.53.0.0/20,\n\t\t\t163.53.36.0/22,\n\t\t\t163.53.40.0/21,\n\t\t\t163.53.48.0/20,\n\t\t\t163.53.64.0/22,\n\t\t\t163.53.88.0/21,\n\t\t\t163.53.96.0/19,\n\t\t\t163.53.128.0/21,\n\t\t\t163.53.136.0/22,\n\t\t\t163.53.160.0/20,\n\t\t\t163.53.188.0/22,\n\t\t\t163.53.240.0/22,\n\t\t\t163.61.63.0/24,\n\t\t\t163.61.178.0/23,\n\t\t\t163.61.202.0/23,\n\t\t\t163.61.214.0/23,\n\t\t\t163.125.0.0/16,\n\t\t\t163.142.0.0/16,\n\t\t\t163.177.0.0/16,\n\t\t\t163.179.0.0/16,\n\t\t\t163.204.0.0/16,\n\t\t\t163.223.173.0/24,\n\t\t\t163.223.178.0/23,\n\t\t\t163.227.40.0/23,\n\t\t\t163.228.0.0/16,\n\t\t\t163.244.246.0/24,\n\t\t\t164.52.74.0/24,\n\t\t\t164.52.80.0/24,\n\t\t\t165.101.70.0/23,\n\t\t\t165.101.122.0/23,\n\t\t\t166.111.0.0/16,\n\t\t\t167.139.0.0/16,\n\t\t\t167.189.0.0/16,\n\t\t\t167.220.244.0/22,\n\t\t\t168.159.144.0/21,\n\t\t\t168.159.152.0/22,\n\t\t\t168.159.156.0/23,\n\t\t\t168.159.158.0/24,\n\t\t\t168.160.0.0/16,\n\t\t\t170.33.1.0/24,\n\t\t\t170.33.100.0/24,\n\t\t\t170.179.0.0/16,\n\t\t\t171.8.0.0/13,\n\t\t\t171.34.0.0/15,\n\t\t\t171.36.0.0/14,\n\t\t\t171.40.0.0/13,\n\t\t\t171.80.0.0/12,\n\t\t\t171.104.0.0/13,\n\t\t\t171.112.0.0/12,\n\t\t\t171.208.0.0/12,\n\t\t\t172.81.192.0/18,\n\t\t\t172.225.51.64/26,\n\t\t\t172.225.58.32/27,\n\t\t\t172.225.58.64/26,\n\t\t\t172.225.80.0/26,\n\t\t\t172.225.126.0/26,\n\t\t\t172.225.181.192/26,\n\t\t\t172.225.200.32/28,\n\t\t\t172.226.47.0/27,\n\t\t\t172.226.138.64/27,\n\t\t\t172.226.180.96/27,\n\t\t\t172.226.180.128/27,\n\t\t\t172.226.214.64/27,\n\t\t\t173.39.200.0/23,\n\t\t\t174.136.239.0/24,\n\t\t\t175.0.0.0/12,\n\t\t\t175.16.0.0/13,\n\t\t\t175.24.0.0/14,\n\t\t\t175.30.0.0/15,\n\t\t\t175.42.0.0/15,\n\t\t\t175.44.0.0/16,\n\t\t\t175.45.179.0/24,\n\t\t\t175.46.0.0/15,\n\t\t\t175.48.0.0/12,\n\t\t\t175.64.0.0/11,\n\t\t\t175.102.0.0/16,\n\t\t\t175.106.128.0/17,\n\t\t\t175.111.144.0/20,\n\t\t\t175.111.160.0/20,\n\t\t\t175.111.184.0/22,\n\t\t\t175.146.0.0/15,\n\t\t\t175.148.0.0/14,\n\t\t\t175.152.0.0/14,\n\t\t\t175.158.96.0/22,\n\t\t\t175.160.0.0/12,\n\t\t\t175.176.156.0/22,\n\t\t\t175.176.176.0/22,\n\t\t\t175.176.188.0/22,\n\t\t\t175.178.0.0/16,\n\t\t\t175.184.128.0/18,\n\t\t\t175.185.0.0/16,\n\t\t\t175.186.0.0/15,\n\t\t\t175.188.0.0/14,\n\t\t\t178.219.5.0/24,\n\t\t\t178.236.38.0/23,\n\t\t\t180.76.16.0/20,\n\t\t\t180.76.32.0/19,\n\t\t\t180.76.64.0/18,\n\t\t\t180.76.128.0/17,\n\t\t\t180.77.0.0/16,\n\t\t\t180.78.0.0/15,\n\t\t\t180.84.0.0/15,\n\t\t\t180.86.0.0/16,\n\t\t\t180.88.0.0/14,\n\t\t\t180.92.176.0/23,\n\t\t\t180.94.56.0/21,\n\t\t\t180.94.96.0/20,\n\t\t\t180.94.120.0/21,\n\t\t\t180.95.128.0/17,\n\t\t\t180.96.0.0/11,\n\t\t\t180.129.128.0/17,\n\t\t\t180.130.0.0/16,\n\t\t\t180.136.0.0/13,\n\t\t\t180.148.16.0/21,\n\t\t\t180.148.152.0/21,\n\t\t\t180.148.216.0/21,\n\t\t\t180.148.224.0/19,\n\t\t\t180.149.128.0/19,\n\t\t\t180.150.160.0/19,\n\t\t\t180.152.0.0/13,\n\t\t\t180.160.0.0/12,\n\t\t\t180.178.112.0/21,\n\t\t\t180.178.192.0/18,\n\t\t\t180.184.0.0/14,\n\t\t\t180.188.0.0/17,\n\t\t\t180.189.148.0/22,\n\t\t\t180.200.252.0/22,\n\t\t\t180.201.0.0/16,\n\t\t\t180.202.0.0/15,\n\t\t\t180.208.0.0/15,\n\t\t\t180.210.212.0/22,\n\t\t\t180.210.228.0/22,\n\t\t\t180.210.232.0/21,\n\t\t\t180.212.0.0/15,\n\t\t\t180.222.224.0/19,\n\t\t\t180.223.0.0/19,\n\t\t\t180.223.40.0/21,\n\t\t\t180.223.48.0/20,\n\t\t\t180.223.128.0/20,\n\t\t\t180.223.144.0/22,\n\t\t\t180.223.152.0/21,\n\t\t\t180.223.160.0/19,\n\t\t\t180.223.212.0/22,\n\t\t\t180.233.0.0/18,\n\t\t\t180.233.64.0/19,\n\t\t\t180.233.144.0/22,\n\t\t\t180.235.64.0/19,\n\t\t\t180.235.112.0/22,\n\t\t\t182.16.144.0/21,\n\t\t\t182.16.192.0/19,\n\t\t\t182.18.0.0/17,\n\t\t\t182.23.184.0/21,\n\t\t\t182.23.200.0/21,\n\t\t\t182.32.0.0/12,\n\t\t\t182.48.96.0/19,\n\t\t\t182.49.0.0/16,\n\t\t\t182.50.0.0/22,\n\t\t\t182.50.8.0/21,\n\t\t\t182.50.112.0/20,\n\t\t\t182.51.0.0/16,\n\t\t\t182.54.0.0/17,\n\t\t\t182.54.244.0/22,\n\t\t\t182.61.0.0/18,\n\t\t\t182.61.128.0/19,\n\t\t\t182.61.192.0/18,\n\t\t\t182.80.0.0/13,\n\t\t\t182.88.0.0/14,\n\t\t\t182.92.0.0/16,\n\t\t\t182.96.0.0/11,\n\t\t\t182.128.0.0/12,\n\t\t\t182.144.0.0/13,\n\t\t\t182.157.0.0/16,\n\t\t\t182.160.64.0/19,\n\t\t\t182.174.0.0/15,\n\t\t\t182.200.0.0/13,\n\t\t\t182.236.128.0/17,\n\t\t\t182.237.24.0/21,\n\t\t\t182.238.0.0/16,\n\t\t\t182.239.0.0/19,\n\t\t\t182.240.0.0/13,\n\t\t\t182.254.0.0/16,\n\t\t\t183.0.0.0/10,\n\t\t\t183.64.0.0/13,\n\t\t\t183.78.161.0/24,\n\t\t\t183.78.162.0/23,\n\t\t\t183.78.164.0/22,\n\t\t\t183.78.180.0/22,\n\t\t\t183.81.180.0/22,\n\t\t\t183.84.0.0/15,\n\t\t\t183.91.39.0/24,\n\t\t\t183.91.40.0/21,\n\t\t\t183.91.48.0/23,\n\t\t\t183.91.50.0/24,\n\t\t\t183.91.52.0/22,\n\t\t\t183.91.56.0/24,\n\t\t\t183.91.61.0/24,\n\t\t\t183.91.63.0/24,\n\t\t\t183.91.128.0/22,\n\t\t\t183.91.136.0/21,\n\t\t\t183.91.144.0/20,\n\t\t\t183.92.0.0/14,\n\t\t\t183.128.0.0/11,\n\t\t\t183.160.0.0/13,\n\t\t\t183.168.0.0/15,\n\t\t\t183.170.0.0/16,\n\t\t\t183.172.0.0/14,\n\t\t\t183.182.0.0/21,\n\t\t\t183.182.8.0/23,\n\t\t\t183.182.12.0/22,\n\t\t\t183.182.16.0/23,\n\t\t\t183.182.23.0/24,\n\t\t\t183.182.24.0/23,\n\t\t\t183.182.26.0/24,\n\t\t\t183.182.28.0/22,\n\t\t\t183.184.0.0/13,\n\t\t\t183.192.0.0/10,\n\t\t\t185.75.173.0/24,\n\t\t\t185.75.174.0/24,\n\t\t\t185.80.200.0/22,\n\t\t\t185.192.56.0/22,\n\t\t\t185.234.212.0/24,\n\t\t\t188.131.128.0/17,\n\t\t\t191.96.206.0/24,\n\t\t\t191.101.176.0/24,\n\t\t\t192.23.191.0/24,\n\t\t\t192.55.46.0/23,\n\t\t\t192.55.68.0/22,\n\t\t\t192.56.99.0/24,\n\t\t\t192.102.204.0/22,\n\t\t\t192.124.154.0/24,\n\t\t\t192.137.31.0/24,\n\t\t\t192.140.128.0/21,\n\t\t\t192.140.136.0/22,\n\t\t\t192.140.156.0/22,\n\t\t\t192.140.160.0/19,\n\t\t\t192.140.192.0/20,\n\t\t\t192.140.208.0/21,\n\t\t\t192.144.128.0/17,\n\t\t\t192.163.11.0/24,\n\t\t\t192.208.13.0/24,\n\t\t\t192.232.97.0/24,\n\t\t\t193.112.0.0/16,\n\t\t\t193.119.0.0/19,\n\t\t\t193.200.222.160/28,\n\t\t\t193.233.49.0/24,\n\t\t\t194.15.39.0/24,\n\t\t\t194.61.236.0/23,\n\t\t\t194.127.229.0/24,\n\t\t\t194.138.136.0/24,\n\t\t\t194.138.202.0/23,\n\t\t\t194.138.245.0/24,\n\t\t\t195.49.78.0/23,\n\t\t\t198.175.100.0/22,\n\t\t\t198.208.17.0/24,\n\t\t\t198.208.19.0/24,\n\t\t\t198.208.30.0/24,\n\t\t\t198.208.61.0/24,\n\t\t\t198.208.63.0/24,\n\t\t\t198.208.67.0/24,\n\t\t\t198.208.112.0/23,\n\t\t\t199.65.192.0/21,\n\t\t\t199.182.239.0/24,\n\t\t\t199.244.144.0/24,\n\t\t\t202.0.100.0/23,\n\t\t\t202.0.122.0/23,\n\t\t\t202.1.86.0/23,\n\t\t\t202.1.90.0/23,\n\t\t\t202.1.105.0/24,\n\t\t\t202.1.106.0/24,\n\t\t\t202.1.110.0/23,\n\t\t\t202.1.112.0/23,\n\t\t\t202.3.128.0/23,\n\t\t\t202.4.128.0/19,\n\t\t\t202.4.252.0/22,\n\t\t\t202.5.196.0/24,\n\t\t\t202.5.208.0/21,\n\t\t\t202.5.216.0/22,\n\t\t\t202.6.6.0/23,\n\t\t\t202.6.66.0/23,\n\t\t\t202.6.72.0/23,\n\t\t\t202.6.87.0/24,\n\t\t\t202.6.88.0/23,\n\t\t\t202.6.92.0/23,\n\t\t\t202.6.103.0/24,\n\t\t\t202.6.108.0/24,\n\t\t\t202.6.110.0/23,\n\t\t\t202.6.114.0/24,\n\t\t\t202.6.176.0/20,\n\t\t\t202.6.202.0/23,\n\t\t\t202.8.0.0/24,\n\t\t\t202.8.2.0/23,\n\t\t\t202.8.4.0/23,\n\t\t\t202.8.12.0/24,\n\t\t\t202.8.24.0/24,\n\t\t\t202.8.77.0/24,\n\t\t\t202.8.128.0/19,\n\t\t\t202.8.192.0/20,\n\t\t\t202.9.32.0/24,\n\t\t\t202.9.34.0/23,\n\t\t\t202.9.48.0/23,\n\t\t\t202.9.51.0/24,\n\t\t\t202.9.52.0/23,\n\t\t\t202.9.54.0/24,\n\t\t\t202.9.57.0/24,\n\t\t\t202.9.58.0/23,\n\t\t\t202.10.64.0/21,\n\t\t\t202.10.74.0/23,\n\t\t\t202.10.76.0/22,\n\t\t\t202.10.112.0/20,\n\t\t\t202.12.1.0/24,\n\t\t\t202.12.2.0/24,\n\t\t\t202.12.17.0/24,\n\t\t\t202.12.18.0/24,\n\t\t\t202.12.72.0/24,\n\t\t\t202.12.84.0/23,\n\t\t\t202.12.96.0/24,\n\t\t\t202.12.98.0/23,\n\t\t\t202.12.106.0/24,\n\t\t\t202.12.111.0/24,\n\t\t\t202.12.116.0/24,\n\t\t\t202.14.64.0/23,\n\t\t\t202.14.69.0/24,\n\t\t\t202.14.73.0/24,\n\t\t\t202.14.74.0/23,\n\t\t\t202.14.76.0/24,\n\t\t\t202.14.78.0/23,\n\t\t\t202.14.88.0/24,\n\t\t\t202.14.97.0/24,\n\t\t\t202.14.104.0/23,\n\t\t\t202.14.108.0/23,\n\t\t\t202.14.111.0/24,\n\t\t\t202.14.114.0/23,\n\t\t\t202.14.118.0/23,\n\t\t\t202.14.124.0/23,\n\t\t\t202.14.127.0/24,\n\t\t\t202.14.129.0/24,\n\t\t\t202.14.135.0/24,\n\t\t\t202.14.136.0/24,\n\t\t\t202.14.149.0/24,\n\t\t\t202.14.151.0/24,\n\t\t\t202.14.157.0/24,\n\t\t\t202.14.158.0/23,\n\t\t\t202.14.169.0/24,\n\t\t\t202.14.170.0/23,\n\t\t\t202.14.172.0/22,\n\t\t\t202.14.176.0/24,\n\t\t\t202.14.184.0/23,\n\t\t\t202.14.208.0/23,\n\t\t\t202.14.213.0/24,\n\t\t\t202.14.219.0/24,\n\t\t\t202.14.220.0/24,\n\t\t\t202.14.222.0/23,\n\t\t\t202.14.225.0/24,\n\t\t\t202.14.226.0/23,\n\t\t\t202.14.231.0/24,\n\t\t\t202.14.235.0/24,\n\t\t\t202.14.236.0/22,\n\t\t\t202.14.246.0/24,\n\t\t\t202.14.251.0/24,\n\t\t\t202.20.66.0/24,\n\t\t\t202.20.79.0/24,\n\t\t\t202.20.87.0/24,\n\t\t\t202.20.88.0/23,\n\t\t\t202.20.90.0/24,\n\t\t\t202.20.94.0/23,\n\t\t\t202.20.114.0/24,\n\t\t\t202.20.117.0/24,\n\t\t\t202.20.120.0/24,\n\t\t\t202.20.125.0/24,\n\t\t\t202.20.126.0/23,\n\t\t\t202.21.48.0/20,\n\t\t\t202.21.131.0/24,\n\t\t\t202.21.132.0/24,\n\t\t\t202.21.141.0/24,\n\t\t\t202.21.142.0/24,\n\t\t\t202.21.147.0/24,\n\t\t\t202.21.148.0/24,\n\t\t\t202.21.150.0/23,\n\t\t\t202.21.152.0/23,\n\t\t\t202.21.154.0/24,\n\t\t\t202.21.156.0/24,\n\t\t\t202.22.248.0/21,\n\t\t\t202.27.12.0/24,\n\t\t\t202.27.14.0/24,\n\t\t\t202.27.136.0/23,\n\t\t\t202.28.194.0/24,\n\t\t\t202.29.12.0/24,\n\t\t\t202.36.226.0/24,\n\t\t\t202.38.0.0/22,\n\t\t\t202.38.8.0/21,\n\t\t\t202.38.48.0/20,\n\t\t\t202.38.64.0/18,\n\t\t\t202.38.128.0/21,\n\t\t\t202.38.136.0/23,\n\t\t\t202.38.140.0/22,\n\t\t\t202.38.146.0/23,\n\t\t\t202.38.149.0/24,\n\t\t\t202.38.150.0/23,\n\t\t\t202.38.152.0/22,\n\t\t\t202.38.156.0/24,\n\t\t\t202.38.158.0/23,\n\t\t\t202.38.164.0/22,\n\t\t\t202.38.168.0/23,\n\t\t\t202.38.170.0/24,\n\t\t\t202.38.176.0/23,\n\t\t\t202.38.184.0/21,\n\t\t\t202.38.192.0/18,\n\t\t\t202.40.4.0/23,\n\t\t\t202.40.7.0/24,\n\t\t\t202.40.15.0/24,\n\t\t\t202.40.135.0/24,\n\t\t\t202.40.136.0/24,\n\t\t\t202.40.140.0/24,\n\t\t\t202.40.143.0/24,\n\t\t\t202.40.144.0/23,\n\t\t\t202.40.150.0/24,\n\t\t\t202.40.155.0/24,\n\t\t\t202.40.156.0/24,\n\t\t\t202.40.158.0/23,\n\t\t\t202.40.162.0/24,\n\t\t\t202.41.8.0/23,\n\t\t\t202.41.11.0/24,\n\t\t\t202.41.12.0/23,\n\t\t\t202.41.128.0/24,\n\t\t\t202.41.130.0/23,\n\t\t\t202.41.142.0/24,\n\t\t\t202.41.152.0/21,\n\t\t\t202.41.192.0/24,\n\t\t\t202.41.196.0/22,\n\t\t\t202.41.200.0/22,\n\t\t\t202.41.240.0/20,\n\t\t\t202.43.76.0/22,\n\t\t\t202.43.144.0/20,\n\t\t\t202.44.16.0/20,\n\t\t\t202.44.48.0/22,\n\t\t\t202.44.67.0/24,\n\t\t\t202.44.74.0/24,\n\t\t\t202.44.97.0/24,\n\t\t\t202.44.129.0/24,\n\t\t\t202.44.132.0/23,\n\t\t\t202.44.146.0/23,\n\t\t\t202.45.0.0/23,\n\t\t\t202.45.2.0/24,\n\t\t\t202.45.15.0/24,\n\t\t\t202.45.16.0/20,\n\t\t\t202.46.16.0/23,\n\t\t\t202.46.18.0/24,\n\t\t\t202.46.20.0/23,\n\t\t\t202.46.39.0/24,\n\t\t\t202.46.40.0/24,\n\t\t\t202.46.128.0/24,\n\t\t\t202.46.224.0/20,\n\t\t\t202.47.82.0/23,\n\t\t\t202.47.96.0/20,\n\t\t\t202.47.126.0/24,\n\t\t\t202.47.128.0/24,\n\t\t\t202.47.130.0/23,\n\t\t\t202.52.33.0/24,\n\t\t\t202.52.34.0/24,\n\t\t\t202.52.47.0/24,\n\t\t\t202.52.143.0/24,\n\t\t\t202.53.140.0/24,\n\t\t\t202.53.143.0/24,\n\t\t\t202.55.0.0/23,\n\t\t\t202.55.4.0/24,\n\t\t\t202.55.18.0/23,\n\t\t\t202.55.20.0/22,\n\t\t\t202.55.24.0/21,\n\t\t\t202.57.192.0/20,\n\t\t\t202.57.212.0/22,\n\t\t\t202.57.216.0/22,\n\t\t\t202.57.240.0/20,\n\t\t\t202.58.0.0/24,\n\t\t\t202.58.112.0/22,\n\t\t\t202.59.0.0/23,\n\t\t\t202.59.212.0/22,\n\t\t\t202.59.236.0/24,\n\t\t\t202.59.240.0/24,\n\t\t\t202.60.48.0/21,\n\t\t\t202.60.96.0/21,\n\t\t\t202.60.112.0/20,\n\t\t\t202.60.132.0/22,\n\t\t\t202.60.136.0/21,\n\t\t\t202.60.144.0/20,\n\t\t\t202.61.68.0/22,\n\t\t\t202.61.76.0/22,\n\t\t\t202.61.88.0/22,\n\t\t\t202.61.123.0/24,\n\t\t\t202.61.127.0/24,\n\t\t\t202.62.112.0/22,\n\t\t\t202.62.248.0/22,\n\t\t\t202.62.252.0/24,\n\t\t\t202.62.255.0/24,\n\t\t\t202.63.80.0/20,\n\t\t\t202.63.160.0/19,\n\t\t\t202.63.248.0/22,\n\t\t\t202.63.253.0/24,\n\t\t\t202.65.0.0/21,\n\t\t\t202.65.8.0/23,\n\t\t\t202.65.96.0/24,\n\t\t\t202.65.100.0/22,\n\t\t\t202.65.104.0/21,\n\t\t\t202.66.169.0/24,\n\t\t\t202.66.170.0/23,\n\t\t\t202.67.0.0/22,\n\t\t\t202.69.4.0/23,\n\t\t\t202.69.16.0/20,\n\t\t\t202.70.0.0/19,\n\t\t\t202.70.96.0/20,\n\t\t\t202.70.192.0/20,\n\t\t\t202.71.32.0/20,\n\t\t\t202.72.40.0/21,\n\t\t\t202.72.80.0/20,\n\t\t\t202.72.112.0/20,\n\t\t\t202.73.128.0/22,\n\t\t\t202.73.240.0/20,\n\t\t\t202.74.8.0/21,\n\t\t\t202.74.36.0/24,\n\t\t\t202.74.42.0/24,\n\t\t\t202.74.52.0/24,\n\t\t\t202.74.80.0/20,\n\t\t\t202.74.254.0/23,\n\t\t\t202.75.208.0/20,\n\t\t\t202.75.252.0/22,\n\t\t\t202.76.247.0/24,\n\t\t\t202.76.252.0/22,\n\t\t\t202.77.80.0/21,\n\t\t\t202.77.92.0/22,\n\t\t\t202.78.8.0/21,\n\t\t\t202.79.224.0/21,\n\t\t\t202.79.248.0/22,\n\t\t\t202.80.192.0/20,\n\t\t\t202.81.0.0/22,\n\t\t\t202.81.176.0/20,\n\t\t\t202.83.252.0/22,\n\t\t\t202.84.0.0/20,\n\t\t\t202.84.16.0/23,\n\t\t\t202.84.22.0/24,\n\t\t\t202.84.24.0/21,\n\t\t\t202.85.208.0/20,\n\t\t\t202.86.249.0/24,\n\t\t\t202.87.80.0/20,\n\t\t\t202.88.32.0/22,\n\t\t\t202.89.8.0/21,\n\t\t\t202.89.96.0/22,\n\t\t\t202.89.108.0/22,\n\t\t\t202.89.119.0/24,\n\t\t\t202.89.232.0/21,\n\t\t\t202.90.16.0/20,\n\t\t\t202.90.37.0/24,\n\t\t\t202.90.96.0/19,\n\t\t\t202.90.193.0/24,\n\t\t\t202.90.196.0/24,\n\t\t\t202.90.205.0/24,\n\t\t\t202.90.224.0/20,\n\t\t\t202.91.0.0/22,\n\t\t\t202.91.96.0/20,\n\t\t\t202.91.176.0/20,\n\t\t\t202.91.224.0/19,\n\t\t\t202.92.8.0/21,\n\t\t\t202.92.48.0/20,\n\t\t\t202.92.252.0/22,\n\t\t\t202.93.252.0/22,\n\t\t\t202.94.74.0/24,\n\t\t\t202.94.81.0/24,\n\t\t\t202.94.92.0/22,\n\t\t\t202.95.0.0/24,\n\t\t\t202.95.2.0/23,\n\t\t\t202.95.24.0/21,\n\t\t\t202.95.240.0/21,\n\t\t\t202.96.0.0/12,\n\t\t\t202.112.0.0/13,\n\t\t\t202.120.0.0/15,\n\t\t\t202.122.0.0/21,\n\t\t\t202.122.32.0/21,\n\t\t\t202.122.64.0/19,\n\t\t\t202.122.112.0/20,\n\t\t\t202.122.132.0/24,\n\t\t\t202.123.96.0/20,\n\t\t\t202.123.116.0/22,\n\t\t\t202.123.120.0/22,\n\t\t\t202.124.16.0/21,\n\t\t\t202.124.24.0/22,\n\t\t\t202.125.107.0/24,\n\t\t\t202.125.109.0/24,\n\t\t\t202.125.112.0/20,\n\t\t\t202.125.176.0/20,\n\t\t\t202.127.0.0/21,\n\t\t\t202.127.12.0/22,\n\t\t\t202.127.16.0/20,\n\t\t\t202.127.40.0/21,\n\t\t\t202.127.48.0/20,\n\t\t\t202.127.112.0/20,\n\t\t\t202.127.128.0/19,\n\t\t\t202.127.192.0/20,\n\t\t\t202.127.212.0/22,\n\t\t\t202.127.216.0/21,\n\t\t\t202.127.224.0/19,\n\t\t\t202.129.208.0/24,\n\t\t\t202.130.0.0/19,\n\t\t\t202.130.39.0/24,\n\t\t\t202.130.224.0/19,\n\t\t\t202.131.16.0/21,\n\t\t\t202.131.48.0/22,\n\t\t\t202.131.54.0/23,\n\t\t\t202.131.56.0/21,\n\t\t\t202.131.208.0/20,\n\t\t\t202.133.32.0/20,\n\t\t\t202.134.58.0/24,\n\t\t\t202.134.128.0/20,\n\t\t\t202.134.208.0/20,\n\t\t\t202.136.48.0/20,\n\t\t\t202.136.72.0/23,\n\t\t\t202.136.208.0/20,\n\t\t\t202.136.224.0/20,\n\t\t\t202.136.248.0/22,\n\t\t\t202.136.255.0/24,\n\t\t\t202.137.231.0/24,\n\t\t\t202.140.140.0/22,\n\t\t\t202.140.144.0/20,\n\t\t\t202.141.160.0/19,\n\t\t\t202.142.16.0/20,\n\t\t\t202.143.4.0/22,\n\t\t\t202.143.16.0/20,\n\t\t\t202.143.32.0/20,\n\t\t\t202.143.56.0/21,\n\t\t\t202.143.100.0/22,\n\t\t\t202.143.104.0/22,\n\t\t\t202.144.198.0/24,\n\t\t\t202.146.160.0/20,\n\t\t\t202.146.184.0/23,\n\t\t\t202.146.186.0/24,\n\t\t\t202.146.188.0/22,\n\t\t\t202.146.196.0/22,\n\t\t\t202.146.200.0/21,\n\t\t\t202.147.144.0/20,\n\t\t\t202.148.32.0/20,\n\t\t\t202.148.64.0/18,\n\t\t\t202.149.32.0/19,\n\t\t\t202.149.160.0/19,\n\t\t\t202.149.224.0/20,\n\t\t\t202.149.240.0/21,\n\t\t\t202.149.248.0/22,\n\t\t\t202.149.252.0/23,\n\t\t\t202.149.255.0/24,\n\t\t\t202.150.16.0/20,\n\t\t\t202.150.32.0/20,\n\t\t\t202.150.56.0/22,\n\t\t\t202.150.192.0/20,\n\t\t\t202.150.210.0/24,\n\t\t\t202.150.213.0/24,\n\t\t\t202.150.214.0/24,\n\t\t\t202.150.217.0/24,\n\t\t\t202.150.218.0/23,\n\t\t\t202.150.224.0/19,\n\t\t\t202.151.0.0/22,\n\t\t\t202.151.33.0/24,\n\t\t\t202.151.128.0/19,\n\t\t\t202.152.176.0/20,\n\t\t\t202.153.0.0/22,\n\t\t\t202.153.7.0/24,\n\t\t\t202.153.48.0/20,\n\t\t\t202.157.192.0/19,\n\t\t\t202.158.160.0/19,\n\t\t\t202.158.242.0/24,\n\t\t\t202.160.140.0/22,\n\t\t\t202.160.156.0/22,\n\t\t\t202.162.67.0/24,\n\t\t\t202.162.75.0/24,\n\t\t\t202.163.1.160/28,\n\t\t\t202.163.8.80/30,\n\t\t\t202.164.0.0/20,\n\t\t\t202.164.25.0/24,\n\t\t\t202.164.96.0/19,\n\t\t\t202.165.176.0/20,\n\t\t\t202.165.208.0/20,\n\t\t\t202.165.239.0/24,\n\t\t\t202.165.240.0/23,\n\t\t\t202.165.243.0/24,\n\t\t\t202.165.245.0/24,\n\t\t\t202.165.251.0/24,\n\t\t\t202.165.252.0/22,\n\t\t\t202.166.224.0/19,\n\t\t\t202.168.80.0/22,\n\t\t\t202.168.128.0/20,\n\t\t\t202.168.160.0/19,\n\t\t\t202.170.128.0/19,\n\t\t\t202.170.216.0/21,\n\t\t\t202.170.224.0/19,\n\t\t\t202.171.216.0/21,\n\t\t\t202.171.232.0/24,\n\t\t\t202.171.235.0/24,\n\t\t\t202.172.0.0/22,\n\t\t\t202.172.7.0/24,\n\t\t\t202.173.0.0/22,\n\t\t\t202.173.6.0/24,\n\t\t\t202.173.8.0/21,\n\t\t\t202.173.112.0/22,\n\t\t\t202.173.224.0/19,\n\t\t\t202.174.64.0/20,\n\t\t\t202.174.124.0/22,\n\t\t\t202.176.224.0/19,\n\t\t\t202.179.160.0/20,\n\t\t\t202.179.240.0/21,\n\t\t\t202.179.248.0/24,\n\t\t\t202.179.249.0/26,\n\t\t\t202.179.249.64/28,\n\t\t\t202.179.249.80/30,\n\t\t\t202.179.249.88/29,\n\t\t\t202.179.249.96/27,\n\t\t\t202.179.249.128/25,\n\t\t\t202.179.250.0/23,\n\t\t\t202.179.252.0/22,\n\t\t\t202.180.128.0/19,\n\t\t\t202.180.208.0/21,\n\t\t\t202.181.8.0/22,\n\t\t\t202.181.28.0/22,\n\t\t\t202.181.112.0/20,\n\t\t\t202.182.32.0/20,\n\t\t\t202.182.192.0/19,\n\t\t\t202.189.0.0/18,\n\t\t\t202.189.80.0/20,\n\t\t\t202.189.184.0/21,\n\t\t\t202.191.0.0/24,\n\t\t\t202.191.68.0/22,\n\t\t\t202.191.72.0/21,\n\t\t\t202.191.80.0/20,\n\t\t\t202.192.0.0/12,\n\t\t\t203.0.4.0/22,\n\t\t\t203.0.10.0/23,\n\t\t\t203.0.18.0/24,\n\t\t\t203.0.24.0/24,\n\t\t\t203.0.42.0/23,\n\t\t\t203.0.45.0/24,\n\t\t\t203.0.46.0/23,\n\t\t\t203.0.81.0/24,\n\t\t\t203.0.82.0/23,\n\t\t\t203.0.90.0/23,\n\t\t\t203.0.96.0/23,\n\t\t\t203.0.104.0/21,\n\t\t\t203.0.114.0/23,\n\t\t\t203.0.122.0/24,\n\t\t\t203.0.128.0/24,\n\t\t\t203.0.130.0/23,\n\t\t\t203.0.132.0/22,\n\t\t\t203.0.137.0/24,\n\t\t\t203.0.142.0/24,\n\t\t\t203.0.144.0/24,\n\t\t\t203.0.146.0/24,\n\t\t\t203.0.148.0/24,\n\t\t\t203.0.150.0/23,\n\t\t\t203.0.152.0/24,\n\t\t\t203.0.177.0/24,\n\t\t\t203.0.224.0/24,\n\t\t\t203.1.4.0/22,\n\t\t\t203.1.18.0/24,\n\t\t\t203.1.26.0/23,\n\t\t\t203.1.65.0/24,\n\t\t\t203.1.66.0/23,\n\t\t\t203.1.70.0/23,\n\t\t\t203.1.76.0/23,\n\t\t\t203.1.90.0/24,\n\t\t\t203.1.97.0/24,\n\t\t\t203.1.98.0/23,\n\t\t\t203.1.100.0/22,\n\t\t\t203.1.108.0/24,\n\t\t\t203.1.253.0/24,\n\t\t\t203.1.254.0/24,\n\t\t\t203.2.64.0/21,\n\t\t\t203.2.73.0/24,\n\t\t\t203.2.112.0/21,\n\t\t\t203.2.126.0/23,\n\t\t\t203.2.140.0/24,\n\t\t\t203.2.150.0/24,\n\t\t\t203.2.152.0/22,\n\t\t\t203.2.156.0/23,\n\t\t\t203.2.160.0/21,\n\t\t\t203.2.180.0/23,\n\t\t\t203.2.196.0/23,\n\t\t\t203.2.209.0/24,\n\t\t\t203.2.214.0/23,\n\t\t\t203.2.226.0/23,\n\t\t\t203.2.229.0/24,\n\t\t\t203.2.236.0/23,\n\t\t\t203.3.68.0/24,\n\t\t\t203.3.72.0/23,\n\t\t\t203.3.75.0/24,\n\t\t\t203.3.80.0/21,\n\t\t\t203.3.96.0/22,\n\t\t\t203.3.105.0/24,\n\t\t\t203.3.112.0/21,\n\t\t\t203.3.120.0/24,\n\t\t\t203.3.123.0/24,\n\t\t\t203.3.135.0/24,\n\t\t\t203.3.139.0/24,\n\t\t\t203.3.143.0/24,\n\t\t\t203.4.132.0/23,\n\t\t\t203.4.134.0/24,\n\t\t\t203.4.151.0/24,\n\t\t\t203.4.152.0/22,\n\t\t\t203.4.174.0/23,\n\t\t\t203.4.180.0/24,\n\t\t\t203.4.186.0/24,\n\t\t\t203.4.205.0/24,\n\t\t\t203.4.208.0/22,\n\t\t\t203.4.227.0/24,\n\t\t\t203.4.230.0/23,\n\t\t\t203.5.4.0/23,\n\t\t\t203.5.7.0/24,\n\t\t\t203.5.8.0/23,\n\t\t\t203.5.11.0/24,\n\t\t\t203.5.21.0/24,\n\t\t\t203.5.22.0/24,\n\t\t\t203.5.44.0/24,\n\t\t\t203.5.46.0/23,\n\t\t\t203.5.52.0/22,\n\t\t\t203.5.56.0/23,\n\t\t\t203.5.60.0/23,\n\t\t\t203.5.114.0/23,\n\t\t\t203.5.118.0/24,\n\t\t\t203.5.120.0/24,\n\t\t\t203.5.172.0/24,\n\t\t\t203.5.180.0/23,\n\t\t\t203.5.182.0/24,\n\t\t\t203.5.185.0/24,\n\t\t\t203.5.186.0/24,\n\t\t\t203.5.188.0/23,\n\t\t\t203.5.190.0/24,\n\t\t\t203.5.195.0/24,\n\t\t\t203.5.214.0/23,\n\t\t\t203.5.218.0/23,\n\t\t\t203.6.131.0/24,\n\t\t\t203.6.136.0/24,\n\t\t\t203.6.138.0/23,\n\t\t\t203.6.142.0/24,\n\t\t\t203.6.150.0/23,\n\t\t\t203.6.157.0/24,\n\t\t\t203.6.159.0/24,\n\t\t\t203.6.224.0/20,\n\t\t\t203.6.248.0/23,\n\t\t\t203.7.129.0/24,\n\t\t\t203.7.138.0/23,\n\t\t\t203.7.147.0/24,\n\t\t\t203.7.150.0/23,\n\t\t\t203.7.158.0/24,\n\t\t\t203.7.192.0/23,\n\t\t\t203.7.200.0/24,\n\t\t\t203.8.0.0/24,\n\t\t\t203.8.8.0/24,\n\t\t\t203.8.23.0/24,\n\t\t\t203.8.25.0/24,\n\t\t\t203.8.30.0/24,\n\t\t\t203.8.70.0/24,\n\t\t\t203.8.82.0/24,\n\t\t\t203.8.86.0/23,\n\t\t\t203.8.91.0/24,\n\t\t\t203.8.110.0/23,\n\t\t\t203.8.115.0/24,\n\t\t\t203.8.166.0/23,\n\t\t\t203.8.169.0/24,\n\t\t\t203.8.173.0/24,\n\t\t\t203.8.184.0/24,\n\t\t\t203.8.186.0/23,\n\t\t\t203.8.190.0/23,\n\t\t\t203.8.192.0/24,\n\t\t\t203.8.197.0/24,\n\t\t\t203.8.198.0/23,\n\t\t\t203.8.203.0/24,\n\t\t\t203.8.209.0/24,\n\t\t\t203.8.210.0/23,\n\t\t\t203.8.212.0/22,\n\t\t\t203.8.217.0/24,\n\t\t\t203.8.220.0/24,\n\t\t\t203.9.32.0/24,\n\t\t\t203.9.36.0/23,\n\t\t\t203.9.57.0/24,\n\t\t\t203.9.63.0/24,\n\t\t\t203.9.65.0/24,\n\t\t\t203.9.70.0/23,\n\t\t\t203.9.72.0/24,\n\t\t\t203.9.75.0/24,\n\t\t\t203.9.76.0/23,\n\t\t\t203.9.96.0/22,\n\t\t\t203.9.100.0/23,\n\t\t\t203.9.108.0/24,\n\t\t\t203.9.158.0/24,\n\t\t\t203.10.34.0/24,\n\t\t\t203.10.56.0/24,\n\t\t\t203.10.74.0/23,\n\t\t\t203.10.84.0/22,\n\t\t\t203.10.88.0/24,\n\t\t\t203.10.95.0/24,\n\t\t\t203.10.125.0/24,\n\t\t\t203.11.70.0/24,\n\t\t\t203.11.76.0/22,\n\t\t\t203.11.82.0/24,\n\t\t\t203.11.84.0/22,\n\t\t\t203.11.100.0/22,\n\t\t\t203.11.109.0/24,\n\t\t\t203.11.117.0/24,\n\t\t\t203.11.122.0/24,\n\t\t\t203.11.126.0/24,\n\t\t\t203.11.136.0/22,\n\t\t\t203.11.141.0/24,\n\t\t\t203.11.142.0/23,\n\t\t\t203.11.180.0/22,\n\t\t\t203.11.208.0/22,\n\t\t\t203.12.16.0/24,\n\t\t\t203.12.19.0/24,\n\t\t\t203.12.24.0/24,\n\t\t\t203.12.57.0/24,\n\t\t\t203.12.65.0/24,\n\t\t\t203.12.66.0/24,\n\t\t\t203.12.70.0/23,\n\t\t\t203.12.87.0/24,\n\t\t\t203.12.91.0/24,\n\t\t\t203.12.93.0/24,\n\t\t\t203.12.100.0/23,\n\t\t\t203.12.103.0/24,\n\t\t\t203.12.114.0/24,\n\t\t\t203.12.118.0/24,\n\t\t\t203.12.130.0/24,\n\t\t\t203.12.137.0/24,\n\t\t\t203.12.196.0/22,\n\t\t\t203.12.211.0/24,\n\t\t\t203.12.219.0/24,\n\t\t\t203.12.226.0/24,\n\t\t\t203.12.240.0/22,\n\t\t\t203.13.18.0/24,\n\t\t\t203.13.24.0/24,\n\t\t\t203.13.44.0/23,\n\t\t\t203.13.81.0/24,\n\t\t\t203.13.88.0/23,\n\t\t\t203.13.92.0/22,\n\t\t\t203.13.173.0/24,\n\t\t\t203.13.224.0/23,\n\t\t\t203.13.227.0/24,\n\t\t\t203.13.233.0/24,\n\t\t\t203.14.24.0/22,\n\t\t\t203.14.33.0/24,\n\t\t\t203.14.56.0/24,\n\t\t\t203.14.61.0/24,\n\t\t\t203.14.62.0/24,\n\t\t\t203.14.104.0/24,\n\t\t\t203.14.114.0/23,\n\t\t\t203.14.118.0/24,\n\t\t\t203.14.162.0/24,\n\t\t\t203.14.192.0/24,\n\t\t\t203.14.194.0/23,\n\t\t\t203.14.214.0/24,\n\t\t\t203.14.231.0/24,\n\t\t\t203.14.246.0/24,\n\t\t\t203.15.0.0/20,\n\t\t\t203.15.20.0/23,\n\t\t\t203.15.22.0/24,\n\t\t\t203.15.87.0/24,\n\t\t\t203.15.88.0/23,\n\t\t\t203.15.105.0/24,\n\t\t\t203.15.112.0/22,\n\t\t\t203.15.119.0/24,\n\t\t\t203.15.130.0/23,\n\t\t\t203.15.149.0/24,\n\t\t\t203.15.151.0/24,\n\t\t\t203.15.156.0/22,\n\t\t\t203.15.174.0/24,\n\t\t\t203.15.227.0/24,\n\t\t\t203.15.232.0/22,\n\t\t\t203.15.238.0/23,\n\t\t\t203.15.240.0/23,\n\t\t\t203.15.246.0/24,\n\t\t\t203.16.10.0/24,\n\t\t\t203.16.12.0/23,\n\t\t\t203.16.16.0/21,\n\t\t\t203.16.27.0/24,\n\t\t\t203.16.38.0/24,\n\t\t\t203.16.49.0/24,\n\t\t\t203.16.50.0/23,\n\t\t\t203.16.58.0/24,\n\t\t\t203.16.63.0/24,\n\t\t\t203.16.133.0/24,\n\t\t\t203.16.161.0/24,\n\t\t\t203.16.162.0/24,\n\t\t\t203.16.186.0/23,\n\t\t\t203.16.228.0/24,\n\t\t\t203.16.238.0/24,\n\t\t\t203.16.240.0/24,\n\t\t\t203.16.245.0/24,\n\t\t\t203.17.2.0/24,\n\t\t\t203.17.18.0/24,\n\t\t\t203.17.28.0/24,\n\t\t\t203.17.39.0/24,\n\t\t\t203.17.56.0/24,\n\t\t\t203.17.74.0/23,\n\t\t\t203.17.88.0/23,\n\t\t\t203.17.136.0/24,\n\t\t\t203.17.164.0/24,\n\t\t\t203.17.187.0/24,\n\t\t\t203.17.190.0/23,\n\t\t\t203.17.231.0/24,\n\t\t\t203.17.233.0/24,\n\t\t\t203.17.248.0/23,\n\t\t\t203.17.255.0/24,\n\t\t\t203.18.2.0/23,\n\t\t\t203.18.4.0/24,\n\t\t\t203.18.7.0/24,\n\t\t\t203.18.31.0/24,\n\t\t\t203.18.37.0/24,\n\t\t\t203.18.48.0/23,\n\t\t\t203.18.52.0/24,\n\t\t\t203.18.72.0/22,\n\t\t\t203.18.80.0/23,\n\t\t\t203.18.87.0/24,\n\t\t\t203.18.100.0/23,\n\t\t\t203.18.105.0/24,\n\t\t\t203.18.107.0/24,\n\t\t\t203.18.110.0/24,\n\t\t\t203.18.129.0/24,\n\t\t\t203.18.131.0/24,\n\t\t\t203.18.132.0/23,\n\t\t\t203.18.144.0/24,\n\t\t\t203.18.153.0/24,\n\t\t\t203.18.199.0/24,\n\t\t\t203.18.208.0/24,\n\t\t\t203.18.211.0/24,\n\t\t\t203.18.215.0/24,\n\t\t\t203.19.1.0/24,\n\t\t\t203.19.18.0/24,\n\t\t\t203.19.24.0/24,\n\t\t\t203.19.30.0/24,\n\t\t\t203.19.41.0/24,\n\t\t\t203.19.44.0/23,\n\t\t\t203.19.46.0/24,\n\t\t\t203.19.58.0/24,\n\t\t\t203.19.60.0/23,\n\t\t\t203.19.64.0/24,\n\t\t\t203.19.68.0/24,\n\t\t\t203.19.72.0/24,\n\t\t\t203.19.101.0/24,\n\t\t\t203.19.111.0/24,\n\t\t\t203.19.131.0/24,\n\t\t\t203.19.133.0/24,\n\t\t\t203.19.144.0/24,\n\t\t\t203.19.147.0/24,\n\t\t\t203.19.149.0/24,\n\t\t\t203.19.156.0/24,\n\t\t\t203.19.176.0/24,\n\t\t\t203.19.178.0/23,\n\t\t\t203.19.208.0/24,\n\t\t\t203.19.228.0/22,\n\t\t\t203.19.233.0/24,\n\t\t\t203.19.242.0/24,\n\t\t\t203.19.248.0/23,\n\t\t\t203.19.255.0/24,\n\t\t\t203.20.17.0/24,\n\t\t\t203.20.40.0/23,\n\t\t\t203.20.44.0/24,\n\t\t\t203.20.48.0/24,\n\t\t\t203.20.61.0/24,\n\t\t\t203.20.65.0/24,\n\t\t\t203.20.84.0/23,\n\t\t\t203.20.89.0/24,\n\t\t\t203.20.106.0/23,\n\t\t\t203.20.115.0/24,\n\t\t\t203.20.117.0/24,\n\t\t\t203.20.118.0/23,\n\t\t\t203.20.122.0/24,\n\t\t\t203.20.126.0/23,\n\t\t\t203.20.135.0/24,\n\t\t\t203.20.150.0/24,\n\t\t\t203.20.230.0/24,\n\t\t\t203.20.232.0/24,\n\t\t\t203.20.236.0/24,\n\t\t\t203.21.0.0/23,\n\t\t\t203.21.2.0/24,\n\t\t\t203.21.8.0/24,\n\t\t\t203.21.10.0/24,\n\t\t\t203.21.18.0/24,\n\t\t\t203.21.33.0/24,\n\t\t\t203.21.34.0/24,\n\t\t\t203.21.41.0/24,\n\t\t\t203.21.44.0/24,\n\t\t\t203.21.68.0/24,\n\t\t\t203.21.82.0/24,\n\t\t\t203.21.96.0/22,\n\t\t\t203.21.124.0/24,\n\t\t\t203.21.136.0/23,\n\t\t\t203.21.145.0/24,\n\t\t\t203.21.206.0/24,\n\t\t\t203.22.24.0/24,\n\t\t\t203.22.28.0/23,\n\t\t\t203.22.31.0/24,\n\t\t\t203.22.68.0/24,\n\t\t\t203.22.76.0/24,\n\t\t\t203.22.78.0/24,\n\t\t\t203.22.84.0/24,\n\t\t\t203.22.87.0/24,\n\t\t\t203.22.92.0/22,\n\t\t\t203.22.99.0/24,\n\t\t\t203.22.106.0/24,\n\t\t\t203.22.122.0/23,\n\t\t\t203.22.131.0/24,\n\t\t\t203.22.163.0/24,\n\t\t\t203.22.166.0/24,\n\t\t\t203.22.170.0/24,\n\t\t\t203.22.194.0/24,\n\t\t\t203.22.242.0/23,\n\t\t\t203.22.245.0/24,\n\t\t\t203.22.246.0/24,\n\t\t\t203.22.252.0/23,\n\t\t\t203.23.0.0/24,\n\t\t\t203.23.47.0/24,\n\t\t\t203.23.61.0/24,\n\t\t\t203.23.62.0/23,\n\t\t\t203.23.73.0/24,\n\t\t\t203.23.85.0/24,\n\t\t\t203.23.92.0/22,\n\t\t\t203.23.98.0/24,\n\t\t\t203.23.107.0/24,\n\t\t\t203.23.112.0/24,\n\t\t\t203.23.130.0/24,\n\t\t\t203.23.140.0/23,\n\t\t\t203.23.172.0/24,\n\t\t\t203.23.182.0/24,\n\t\t\t203.23.186.0/23,\n\t\t\t203.23.192.0/24,\n\t\t\t203.23.197.0/24,\n\t\t\t203.23.198.0/24,\n\t\t\t203.23.204.0/22,\n\t\t\t203.23.224.0/24,\n\t\t\t203.23.226.0/23,\n\t\t\t203.23.228.0/22,\n\t\t\t203.23.249.0/24,\n\t\t\t203.23.251.0/24,\n\t\t\t203.24.13.0/24,\n\t\t\t203.24.18.0/24,\n\t\t\t203.24.27.0/24,\n\t\t\t203.24.43.0/24,\n\t\t\t203.24.56.0/24,\n\t\t\t203.24.58.0/24,\n\t\t\t203.24.67.0/24,\n\t\t\t203.24.74.0/24,\n\t\t\t203.24.79.0/24,\n\t\t\t203.24.80.0/23,\n\t\t\t203.24.84.0/23,\n\t\t\t203.24.86.0/24,\n\t\t\t203.24.90.0/24,\n\t\t\t203.24.111.0/24,\n\t\t\t203.24.112.0/24,\n\t\t\t203.24.116.0/24,\n\t\t\t203.24.122.0/23,\n\t\t\t203.24.145.0/24,\n\t\t\t203.24.152.0/23,\n\t\t\t203.24.157.0/24,\n\t\t\t203.24.161.0/24,\n\t\t\t203.24.167.0/24,\n\t\t\t203.24.186.0/23,\n\t\t\t203.24.199.0/24,\n\t\t\t203.24.202.0/24,\n\t\t\t203.24.212.0/23,\n\t\t\t203.24.217.0/24,\n\t\t\t203.24.219.0/24,\n\t\t\t203.24.244.0/24,\n\t\t\t203.25.19.0/24,\n\t\t\t203.25.20.0/23,\n\t\t\t203.25.46.0/24,\n\t\t\t203.25.52.0/24,\n\t\t\t203.25.64.0/23,\n\t\t\t203.25.91.0/24,\n\t\t\t203.25.99.0/24,\n\t\t\t203.25.100.0/24,\n\t\t\t203.25.106.0/24,\n\t\t\t203.25.131.0/24,\n\t\t\t203.25.135.0/24,\n\t\t\t203.25.138.0/24,\n\t\t\t203.25.147.0/24,\n\t\t\t203.25.153.0/24,\n\t\t\t203.25.154.0/23,\n\t\t\t203.25.164.0/24,\n\t\t\t203.25.166.0/24,\n\t\t\t203.25.174.0/23,\n\t\t\t203.25.180.0/24,\n\t\t\t203.25.182.0/24,\n\t\t\t203.25.191.0/24,\n\t\t\t203.25.199.0/24,\n\t\t\t203.25.200.0/24,\n\t\t\t203.25.202.0/23,\n\t\t\t203.25.208.0/20,\n\t\t\t203.25.229.0/24,\n\t\t\t203.25.235.0/24,\n\t\t\t203.25.236.0/24,\n\t\t\t203.25.242.0/24,\n\t\t\t203.26.12.0/24,\n\t\t\t203.26.34.0/24,\n\t\t\t203.26.49.0/24,\n\t\t\t203.26.50.0/24,\n\t\t\t203.26.55.0/24,\n\t\t\t203.26.56.0/23,\n\t\t\t203.26.60.0/24,\n\t\t\t203.26.65.0/24,\n\t\t\t203.26.68.0/24,\n\t\t\t203.26.76.0/24,\n\t\t\t203.26.80.0/24,\n\t\t\t203.26.84.0/24,\n\t\t\t203.26.97.0/24,\n\t\t\t203.26.102.0/23,\n\t\t\t203.26.115.0/24,\n\t\t\t203.26.116.0/24,\n\t\t\t203.26.129.0/24,\n\t\t\t203.26.143.0/24,\n\t\t\t203.26.144.0/24,\n\t\t\t203.26.148.0/23,\n\t\t\t203.26.154.0/24,\n\t\t\t203.26.158.0/23,\n\t\t\t203.26.170.0/24,\n\t\t\t203.26.173.0/24,\n\t\t\t203.26.176.0/24,\n\t\t\t203.26.185.0/24,\n\t\t\t203.26.202.0/23,\n\t\t\t203.26.210.0/24,\n\t\t\t203.26.214.0/24,\n\t\t\t203.26.222.0/24,\n\t\t\t203.26.224.0/24,\n\t\t\t203.26.228.0/24,\n\t\t\t203.26.232.0/24,\n\t\t\t203.27.0.0/24,\n\t\t\t203.27.10.0/24,\n\t\t\t203.27.15.0/24,\n\t\t\t203.27.16.0/24,\n\t\t\t203.27.20.0/24,\n\t\t\t203.27.22.0/23,\n\t\t\t203.27.40.0/24,\n\t\t\t203.27.45.0/24,\n\t\t\t203.27.53.0/24,\n\t\t\t203.27.65.0/24,\n\t\t\t203.27.66.0/24,\n\t\t\t203.27.81.0/24,\n\t\t\t203.27.88.0/24,\n\t\t\t203.27.102.0/24,\n\t\t\t203.27.109.0/24,\n\t\t\t203.27.117.0/24,\n\t\t\t203.27.121.0/24,\n\t\t\t203.27.122.0/23,\n\t\t\t203.27.125.0/24,\n\t\t\t203.27.200.0/24,\n\t\t\t203.27.202.0/24,\n\t\t\t203.27.233.0/24,\n\t\t\t203.27.241.0/24,\n\t\t\t203.27.250.0/24,\n\t\t\t203.28.10.0/24,\n\t\t\t203.28.12.0/24,\n\t\t\t203.28.33.0/24,\n\t\t\t203.28.34.0/23,\n\t\t\t203.28.43.0/24,\n\t\t\t203.28.44.0/24,\n\t\t\t203.28.54.0/24,\n\t\t\t203.28.56.0/24,\n\t\t\t203.28.73.0/24,\n\t\t\t203.28.74.0/24,\n\t\t\t203.28.76.0/24,\n\t\t\t203.28.86.0/24,\n\t\t\t203.28.88.0/24,\n\t\t\t203.28.112.0/24,\n\t\t\t203.28.131.0/24,\n\t\t\t203.28.136.0/24,\n\t\t\t203.28.140.0/24,\n\t\t\t203.28.145.0/24,\n\t\t\t203.28.165.0/24,\n\t\t\t203.28.169.0/24,\n\t\t\t203.28.170.0/24,\n\t\t\t203.28.178.0/23,\n\t\t\t203.28.185.0/24,\n\t\t\t203.28.187.0/24,\n\t\t\t203.28.196.0/24,\n\t\t\t203.28.226.0/23,\n\t\t\t203.28.239.0/24,\n\t\t\t203.29.2.0/24,\n\t\t\t203.29.8.0/23,\n\t\t\t203.29.13.0/24,\n\t\t\t203.29.14.0/24,\n\t\t\t203.29.28.0/24,\n\t\t\t203.29.46.0/24,\n\t\t\t203.29.57.0/24,\n\t\t\t203.29.61.0/24,\n\t\t\t203.29.63.0/24,\n\t\t\t203.29.69.0/24,\n\t\t\t203.29.73.0/24,\n\t\t\t203.29.81.0/24,\n\t\t\t203.29.90.0/24,\n\t\t\t203.29.95.0/24,\n\t\t\t203.29.100.0/24,\n\t\t\t203.29.103.0/24,\n\t\t\t203.29.112.0/24,\n\t\t\t203.29.120.0/22,\n\t\t\t203.29.182.0/23,\n\t\t\t203.29.187.0/24,\n\t\t\t203.29.189.0/24,\n\t\t\t203.29.190.0/24,\n\t\t\t203.29.205.0/24,\n\t\t\t203.29.210.0/24,\n\t\t\t203.29.217.0/24,\n\t\t\t203.29.227.0/24,\n\t\t\t203.29.231.0/24,\n\t\t\t203.29.233.0/24,\n\t\t\t203.29.234.0/24,\n\t\t\t203.29.248.0/24,\n\t\t\t203.29.254.0/23,\n\t\t\t203.30.16.0/23,\n\t\t\t203.30.25.0/24,\n\t\t\t203.30.27.0/24,\n\t\t\t203.30.29.0/24,\n\t\t\t203.30.66.0/24,\n\t\t\t203.30.81.0/24,\n\t\t\t203.30.87.0/24,\n\t\t\t203.30.111.0/24,\n\t\t\t203.30.121.0/24,\n\t\t\t203.30.123.0/24,\n\t\t\t203.30.152.0/24,\n\t\t\t203.30.156.0/24,\n\t\t\t203.30.162.0/24,\n\t\t\t203.30.173.0/24,\n\t\t\t203.30.175.0/24,\n\t\t\t203.30.187.0/24,\n\t\t\t203.30.194.0/24,\n\t\t\t203.30.217.0/24,\n\t\t\t203.30.220.0/24,\n\t\t\t203.30.222.0/24,\n\t\t\t203.30.232.0/23,\n\t\t\t203.30.235.0/24,\n\t\t\t203.30.240.0/23,\n\t\t\t203.30.246.0/24,\n\t\t\t203.30.250.0/23,\n\t\t\t203.31.45.0/24,\n\t\t\t203.31.46.0/24,\n\t\t\t203.31.49.0/24,\n\t\t\t203.31.51.0/24,\n\t\t\t203.31.54.0/23,\n\t\t\t203.31.69.0/24,\n\t\t\t203.31.72.0/24,\n\t\t\t203.31.80.0/24,\n\t\t\t203.31.85.0/24,\n\t\t\t203.31.97.0/24,\n\t\t\t203.31.105.0/24,\n\t\t\t203.31.106.0/24,\n\t\t\t203.31.108.0/23,\n\t\t\t203.31.124.0/24,\n\t\t\t203.31.162.0/24,\n\t\t\t203.31.174.0/24,\n\t\t\t203.31.177.0/24,\n\t\t\t203.31.181.0/24,\n\t\t\t203.31.187.0/24,\n\t\t\t203.31.189.0/24,\n\t\t\t203.31.204.0/24,\n\t\t\t203.31.220.0/24,\n\t\t\t203.31.222.0/23,\n\t\t\t203.31.225.0/24,\n\t\t\t203.31.229.0/24,\n\t\t\t203.31.248.0/23,\n\t\t\t203.31.253.0/24,\n\t\t\t203.32.20.0/24,\n\t\t\t203.32.48.0/23,\n\t\t\t203.32.56.0/24,\n\t\t\t203.32.60.0/24,\n\t\t\t203.32.62.0/24,\n\t\t\t203.32.68.0/23,\n\t\t\t203.32.76.0/24,\n\t\t\t203.32.81.0/24,\n\t\t\t203.32.84.0/23,\n\t\t\t203.32.95.0/24,\n\t\t\t203.32.102.0/24,\n\t\t\t203.32.105.0/24,\n\t\t\t203.32.130.0/24,\n\t\t\t203.32.133.0/24,\n\t\t\t203.32.140.0/24,\n\t\t\t203.32.152.0/24,\n\t\t\t203.32.186.0/23,\n\t\t\t203.32.192.0/24,\n\t\t\t203.32.196.0/24,\n\t\t\t203.32.203.0/24,\n\t\t\t203.32.204.0/23,\n\t\t\t203.32.212.0/24,\n\t\t\t203.33.4.0/24,\n\t\t\t203.33.7.0/24,\n\t\t\t203.33.12.0/23,\n\t\t\t203.33.21.0/24,\n\t\t\t203.33.26.0/24,\n\t\t\t203.33.32.0/24,\n\t\t\t203.33.63.0/24,\n\t\t\t203.33.64.0/24,\n\t\t\t203.33.67.0/24,\n\t\t\t203.33.68.0/24,\n\t\t\t203.33.73.0/24,\n\t\t\t203.33.79.0/24,\n\t\t\t203.33.100.0/24,\n\t\t\t203.33.122.0/24,\n\t\t\t203.33.129.0/24,\n\t\t\t203.33.131.0/24,\n\t\t\t203.33.145.0/24,\n\t\t\t203.33.156.0/24,\n\t\t\t203.33.158.0/23,\n\t\t\t203.33.174.0/24,\n\t\t\t203.33.185.0/24,\n\t\t\t203.33.200.0/24,\n\t\t\t203.33.202.0/23,\n\t\t\t203.33.204.0/24,\n\t\t\t203.33.206.0/23,\n\t\t\t203.33.214.0/23,\n\t\t\t203.33.224.0/23,\n\t\t\t203.33.226.0/24,\n\t\t\t203.33.233.0/24,\n\t\t\t203.33.243.0/24,\n\t\t\t203.33.250.0/24,\n\t\t\t203.34.4.0/24,\n\t\t\t203.34.21.0/24,\n\t\t\t203.34.27.0/24,\n\t\t\t203.34.39.0/24,\n\t\t\t203.34.48.0/23,\n\t\t\t203.34.54.0/24,\n\t\t\t203.34.56.0/23,\n\t\t\t203.34.67.0/24,\n\t\t\t203.34.69.0/24,\n\t\t\t203.34.76.0/24,\n\t\t\t203.34.92.0/24,\n\t\t\t203.34.106.0/24,\n\t\t\t203.34.113.0/24,\n\t\t\t203.34.147.0/24,\n\t\t\t203.34.150.0/24,\n\t\t\t203.34.152.0/23,\n\t\t\t203.34.161.0/24,\n\t\t\t203.34.162.0/24,\n\t\t\t203.34.187.0/24,\n\t\t\t203.34.198.0/24,\n\t\t\t203.34.204.0/22,\n\t\t\t203.34.232.0/24,\n\t\t\t203.34.240.0/24,\n\t\t\t203.34.242.0/24,\n\t\t\t203.34.245.0/24,\n\t\t\t203.34.251.0/24,\n\t\t\t203.55.2.0/23,\n\t\t\t203.55.4.0/24,\n\t\t\t203.55.10.0/24,\n\t\t\t203.55.13.0/24,\n\t\t\t203.55.22.0/24,\n\t\t\t203.55.30.0/24,\n\t\t\t203.55.93.0/24,\n\t\t\t203.55.101.0/24,\n\t\t\t203.55.109.0/24,\n\t\t\t203.55.110.0/24,\n\t\t\t203.55.116.0/23,\n\t\t\t203.55.119.0/24,\n\t\t\t203.55.128.0/23,\n\t\t\t203.55.146.0/23,\n\t\t\t203.55.192.0/24,\n\t\t\t203.55.196.0/24,\n\t\t\t203.55.218.0/23,\n\t\t\t203.55.221.0/24,\n\t\t\t203.55.224.0/24,\n\t\t\t203.56.1.0/24,\n\t\t\t203.56.4.0/24,\n\t\t\t203.56.12.0/24,\n\t\t\t203.56.24.0/24,\n\t\t\t203.56.38.0/24,\n\t\t\t203.56.40.0/24,\n\t\t\t203.56.46.0/24,\n\t\t\t203.56.68.0/23,\n\t\t\t203.56.82.0/23,\n\t\t\t203.56.84.0/23,\n\t\t\t203.56.95.0/24,\n\t\t\t203.56.110.0/24,\n\t\t\t203.56.121.0/24,\n\t\t\t203.56.161.0/24,\n\t\t\t203.56.169.0/24,\n\t\t\t203.56.172.0/23,\n\t\t\t203.56.175.0/24,\n\t\t\t203.56.183.0/24,\n\t\t\t203.56.185.0/24,\n\t\t\t203.56.187.0/24,\n\t\t\t203.56.192.0/24,\n\t\t\t203.56.198.0/24,\n\t\t\t203.56.201.0/24,\n\t\t\t203.56.208.0/23,\n\t\t\t203.56.210.0/24,\n\t\t\t203.56.214.0/24,\n\t\t\t203.56.216.0/24,\n\t\t\t203.56.227.0/24,\n\t\t\t203.56.228.0/24,\n\t\t\t203.56.232.0/24,\n\t\t\t203.56.240.0/24,\n\t\t\t203.56.252.0/24,\n\t\t\t203.56.254.0/24,\n\t\t\t203.57.5.0/24,\n\t\t\t203.57.6.0/24,\n\t\t\t203.57.12.0/23,\n\t\t\t203.57.28.0/24,\n\t\t\t203.57.39.0/24,\n\t\t\t203.57.46.0/24,\n\t\t\t203.57.58.0/24,\n\t\t\t203.57.61.0/24,\n\t\t\t203.57.66.0/24,\n\t\t\t203.57.69.0/24,\n\t\t\t203.57.70.0/23,\n\t\t\t203.57.73.0/24,\n\t\t\t203.57.90.0/24,\n\t\t\t203.57.101.0/24,\n\t\t\t203.57.109.0/24,\n\t\t\t203.57.123.0/24,\n\t\t\t203.57.157.0/24,\n\t\t\t203.57.200.0/24,\n\t\t\t203.57.202.0/24,\n\t\t\t203.57.206.0/24,\n\t\t\t203.57.222.0/24,\n\t\t\t203.57.224.0/20,\n\t\t\t203.57.246.0/23,\n\t\t\t203.57.249.0/24,\n\t\t\t203.57.253.0/24,\n\t\t\t203.57.254.0/23,\n\t\t\t203.62.2.0/24,\n\t\t\t203.62.131.0/24,\n\t\t\t203.62.139.0/24,\n\t\t\t203.62.161.0/24,\n\t\t\t203.62.197.0/24,\n\t\t\t203.62.228.0/22,\n\t\t\t203.62.234.0/24,\n\t\t\t203.62.246.0/24,\n\t\t\t203.65.240.0/22,\n\t\t\t203.76.160.0/22,\n\t\t\t203.76.168.0/22,\n\t\t\t203.76.208.0/21,\n\t\t\t203.76.216.0/22,\n\t\t\t203.76.240.0/22,\n\t\t\t203.77.180.0/22,\n\t\t\t203.78.48.0/20,\n\t\t\t203.78.156.0/22,\n\t\t\t203.79.0.0/20,\n\t\t\t203.80.4.0/23,\n\t\t\t203.80.32.0/20,\n\t\t\t203.80.57.0/24,\n\t\t\t203.80.129.0/24,\n\t\t\t203.80.132.0/22,\n\t\t\t203.80.144.0/20,\n\t\t\t203.81.16.0/20,\n\t\t\t203.81.244.0/22,\n\t\t\t203.82.0.0/23,\n\t\t\t203.82.112.0/20,\n\t\t\t203.82.224.0/20,\n\t\t\t203.83.0.0/22,\n\t\t\t203.83.12.0/22,\n\t\t\t203.83.56.0/21,\n\t\t\t203.83.224.0/20,\n\t\t\t203.86.0.0/18,\n\t\t\t203.86.64.0/19,\n\t\t\t203.86.96.0/23,\n\t\t\t203.86.108.0/24,\n\t\t\t203.86.110.0/24,\n\t\t\t203.86.112.0/24,\n\t\t\t203.86.117.0/24,\n\t\t\t203.86.250.0/24,\n\t\t\t203.86.254.0/23,\n\t\t\t203.88.32.0/19,\n\t\t\t203.88.192.0/19,\n\t\t\t203.89.100.0/22,\n\t\t\t203.89.136.0/22,\n\t\t\t203.89.144.0/24,\n\t\t\t203.90.8.0/21,\n\t\t\t203.90.128.0/18,\n\t\t\t203.90.192.0/19,\n\t\t\t203.91.32.0/19,\n\t\t\t203.91.96.0/20,\n\t\t\t203.91.120.0/21,\n\t\t\t203.92.0.0/22,\n\t\t\t203.92.6.0/24,\n\t\t\t203.92.160.0/19,\n\t\t\t203.93.0.0/16,\n\t\t\t203.94.0.0/19,\n\t\t\t203.95.0.0/21,\n\t\t\t203.95.96.0/19,\n\t\t\t203.95.128.0/18,\n\t\t\t203.95.200.0/21,\n\t\t\t203.95.208.0/22,\n\t\t\t203.95.224.0/19,\n\t\t\t203.99.16.0/20,\n\t\t\t203.99.80.0/20,\n\t\t\t203.100.32.0/20,\n\t\t\t203.100.58.0/24,\n\t\t\t203.100.60.0/24,\n\t\t\t203.100.63.0/24,\n\t\t\t203.100.80.0/20,\n\t\t\t203.100.96.0/19,\n\t\t\t203.100.192.0/20,\n\t\t\t203.104.32.0/20,\n\t\t\t203.105.96.0/19,\n\t\t\t203.105.128.0/19,\n\t\t\t203.107.0.0/18,\n\t\t\t203.107.69.0/24,\n\t\t\t203.107.70.0/23,\n\t\t\t203.107.72.0/21,\n\t\t\t203.107.80.0/20,\n\t\t\t203.107.96.0/19,\n\t\t\t203.110.160.0/19,\n\t\t\t203.110.208.0/20,\n\t\t\t203.110.232.0/23,\n\t\t\t203.110.234.0/24,\n\t\t\t203.114.80.0/20,\n\t\t\t203.114.244.0/22,\n\t\t\t203.118.192.0/19,\n\t\t\t203.118.241.0/24,\n\t\t\t203.118.248.0/22,\n\t\t\t203.119.24.0/21,\n\t\t\t203.119.32.0/22,\n\t\t\t203.119.80.0/22,\n\t\t\t203.119.85.0/24,\n\t\t\t203.119.113.0/24,\n\t\t\t203.119.114.0/23,\n\t\t\t203.119.116.0/22,\n\t\t\t203.119.128.0/17,\n\t\t\t203.123.58.0/24,\n\t\t\t203.128.32.0/19,\n\t\t\t203.128.96.0/19,\n\t\t\t203.129.12.0/22,\n\t\t\t203.130.32.0/20,\n\t\t\t203.130.49.0/24,\n\t\t\t203.130.50.0/23,\n\t\t\t203.130.52.0/22,\n\t\t\t203.130.56.0/21,\n\t\t\t203.132.32.0/19,\n\t\t\t203.134.240.0/21,\n\t\t\t203.135.96.0/19,\n\t\t\t203.135.160.0/20,\n\t\t\t203.142.219.0/24,\n\t\t\t203.142.224.0/19,\n\t\t\t203.144.96.0/24,\n\t\t\t203.144.107.0/24,\n\t\t\t203.144.108.0/22,\n\t\t\t203.144.112.0/20,\n\t\t\t203.145.0.0/19,\n\t\t\t203.148.0.0/18,\n\t\t\t203.148.64.0/20,\n\t\t\t203.148.80.0/22,\n\t\t\t203.148.86.0/23,\n\t\t\t203.149.92.0/22,\n\t\t\t203.152.64.0/19,\n\t\t\t203.152.128.0/19,\n\t\t\t203.153.0.0/22,\n\t\t\t203.156.192.0/18,\n\t\t\t203.158.16.0/21,\n\t\t\t203.160.70.196/31,\n\t\t\t203.160.70.208/31,\n\t\t\t203.160.129.0/24,\n\t\t\t203.160.192.0/19,\n\t\t\t203.161.0.0/22,\n\t\t\t203.161.180.0/24,\n\t\t\t203.161.183.0/24,\n\t\t\t203.161.192.0/19,\n\t\t\t203.166.160.0/19,\n\t\t\t203.167.28.0/22,\n\t\t\t203.168.0.0/19,\n\t\t\t203.170.58.0/23,\n\t\t\t203.171.0.0/22,\n\t\t\t203.171.208.0/24,\n\t\t\t203.171.224.0/20,\n\t\t\t203.174.4.0/24,\n\t\t\t203.174.6.0/23,\n\t\t\t203.174.96.0/19,\n\t\t\t203.175.128.0/19,\n\t\t\t203.175.192.0/18,\n\t\t\t203.176.0.0/18,\n\t\t\t203.176.64.0/19,\n\t\t\t203.176.168.0/21,\n\t\t\t203.184.80.0/20,\n\t\t\t203.185.189.0/24,\n\t\t\t203.187.160.0/19,\n\t\t\t203.189.0.0/23,\n\t\t\t203.189.6.0/23,\n\t\t\t203.189.112.0/22,\n\t\t\t203.189.192.0/19,\n\t\t\t203.189.240.0/22,\n\t\t\t203.190.96.0/20,\n\t\t\t203.190.249.0/24,\n\t\t\t203.191.0.0/23,\n\t\t\t203.191.2.0/24,\n\t\t\t203.191.5.0/24,\n\t\t\t203.191.7.0/24,\n\t\t\t203.191.16.0/21,\n\t\t\t203.191.28.0/22,\n\t\t\t203.191.64.0/18,\n\t\t\t203.191.133.0/24,\n\t\t\t203.191.144.0/20,\n\t\t\t203.192.0.0/19,\n\t\t\t203.193.224.0/19,\n\t\t\t203.194.122.0/23,\n\t\t\t203.194.124.0/24,\n\t\t\t203.195.64.0/19,\n\t\t\t203.195.113.0/24,\n\t\t\t203.195.114.0/24,\n\t\t\t203.195.118.0/23,\n\t\t\t203.195.128.0/17,\n\t\t\t203.196.0.0/21,\n\t\t\t203.196.28.0/22,\n\t\t\t203.201.181.0/24,\n\t\t\t203.201.182.0/24,\n\t\t\t203.202.236.0/22,\n\t\t\t203.205.64.0/19,\n\t\t\t203.205.130.0/23,\n\t\t\t203.205.132.0/23,\n\t\t\t203.205.148.0/22,\n\t\t\t203.205.152.0/23,\n\t\t\t203.205.154.0/24,\n\t\t\t203.205.158.0/24,\n\t\t\t203.205.160.0/20,\n\t\t\t203.205.176.0/21,\n\t\t\t203.205.184.0/22,\n\t\t\t203.205.189.0/24,\n\t\t\t203.205.190.0/24,\n\t\t\t203.205.200.0/21,\n\t\t\t203.205.208.0/21,\n\t\t\t203.205.216.0/23,\n\t\t\t203.205.225.0/24,\n\t\t\t203.205.226.0/23,\n\t\t\t203.205.228.0/22,\n\t\t\t203.205.243.0/24,\n\t\t\t203.205.244.0/22,\n\t\t\t203.207.64.0/18,\n\t\t\t203.207.128.0/17,\n\t\t\t203.208.32.0/19,\n\t\t\t203.209.224.0/19,\n\t\t\t203.212.0.0/20,\n\t\t\t203.212.80.0/20,\n\t\t\t203.215.232.0/23,\n\t\t\t203.215.236.0/24,\n\t\t\t203.217.164.0/22,\n\t\t\t203.223.21.0/24,\n\t\t\t204.13.175.0/24,\n\t\t\t204.55.160.0/24,\n\t\t\t204.79.135.24/32,\n\t\t\t205.198.19.0/24,\n\t\t\t206.54.1.128/25,\n\t\t\t206.54.9.0/24,\n\t\t\t206.54.10.0/23,\n\t\t\t206.54.12.0/22,\n\t\t\t207.254.180.0/24,\n\t\t\t210.2.0.0/23,\n\t\t\t210.2.2.0/24,\n\t\t\t210.2.4.0/22,\n\t\t\t210.2.8.0/21,\n\t\t\t210.2.16.0/22,\n\t\t\t210.2.20.0/23,\n\t\t\t210.2.24.0/21,\n\t\t\t210.5.0.0/19,\n\t\t\t210.5.56.0/24,\n\t\t\t210.5.58.0/23,\n\t\t\t210.5.60.0/22,\n\t\t\t210.5.128.0/19,\n\t\t\t210.7.56.0/21,\n\t\t\t210.12.0.0/15,\n\t\t\t210.14.64.0/19,\n\t\t\t210.14.112.0/20,\n\t\t\t210.14.128.0/17,\n\t\t\t210.15.0.0/17,\n\t\t\t210.15.128.0/18,\n\t\t\t210.16.128.0/18,\n\t\t\t210.21.0.0/16,\n\t\t\t210.22.0.0/16,\n\t\t\t210.23.32.0/19,\n\t\t\t210.25.0.0/16,\n\t\t\t210.26.0.0/15,\n\t\t\t210.28.0.0/14,\n\t\t\t210.32.0.0/12,\n\t\t\t210.48.140.0/23,\n\t\t\t210.48.142.0/24,\n\t\t\t210.51.0.0/16,\n\t\t\t210.52.0.0/15,\n\t\t\t210.56.192.0/19,\n\t\t\t210.72.0.0/15,\n\t\t\t210.74.0.0/16,\n\t\t\t210.75.0.0/17,\n\t\t\t210.75.160.0/19,\n\t\t\t210.75.192.0/18,\n\t\t\t210.76.0.0/15,\n\t\t\t210.78.0.0/16,\n\t\t\t210.79.64.0/18,\n\t\t\t210.79.224.0/19,\n\t\t\t210.82.0.0/15,\n\t\t\t210.87.72.0/23,\n\t\t\t210.87.114.0/23,\n\t\t\t210.87.128.0/18,\n\t\t\t210.185.192.0/18,\n\t\t\t210.192.96.0/19,\n\t\t\t211.64.0.0/13,\n\t\t\t211.76.179.0/24,\n\t\t\t211.80.0.0/12,\n\t\t\t211.96.0.0/13,\n\t\t\t211.136.0.0/13,\n\t\t\t211.144.0.0/14,\n\t\t\t211.148.0.0/16,\n\t\t\t211.149.0.0/18,\n\t\t\t211.149.64.0/21,\n\t\t\t211.149.72.0/22,\n\t\t\t211.149.80.0/20,\n\t\t\t211.149.96.0/19,\n\t\t\t211.149.128.0/17,\n\t\t\t211.150.0.0/15,\n\t\t\t211.152.0.0/17,\n\t\t\t211.152.134.0/23,\n\t\t\t211.152.140.0/22,\n\t\t\t211.152.150.0/23,\n\t\t\t211.152.157.0/24,\n\t\t\t211.152.160.0/19,\n\t\t\t211.152.192.0/18,\n\t\t\t211.153.0.0/16,\n\t\t\t211.154.0.0/16,\n\t\t\t211.155.0.0/18,\n\t\t\t211.155.67.0/24,\n\t\t\t211.155.68.0/22,\n\t\t\t211.155.72.0/21,\n\t\t\t211.155.80.0/20,\n\t\t\t211.155.96.0/20,\n\t\t\t211.155.112.0/23,\n\t\t\t211.155.114.0/24,\n\t\t\t211.155.116.0/22,\n\t\t\t211.155.120.0/21,\n\t\t\t211.155.128.0/17,\n\t\t\t211.156.0.0/18,\n\t\t\t211.156.64.0/19,\n\t\t\t211.156.96.0/21,\n\t\t\t211.156.104.0/22,\n\t\t\t211.156.108.0/23,\n\t\t\t211.156.112.0/20,\n\t\t\t211.156.128.0/17,\n\t\t\t211.157.0.0/16,\n\t\t\t211.158.0.0/15,\n\t\t\t211.160.0.0/13,\n\t\t\t212.64.0.0/17,\n\t\t\t212.129.128.0/17,\n\t\t\t213.130.140.0/22,\n\t\t\t213.199.169.0/24,\n\t\t\t218.0.0.0/12,\n\t\t\t218.16.0.0/13,\n\t\t\t218.24.0.0/14,\n\t\t\t218.28.0.0/15,\n\t\t\t218.30.0.0/19,\n\t\t\t218.30.32.0/21,\n\t\t\t218.30.40.0/22,\n\t\t\t218.30.45.0/24,\n\t\t\t218.30.46.0/23,\n\t\t\t218.30.48.0/21,\n\t\t\t218.30.56.0/22,\n\t\t\t218.30.60.0/23,\n\t\t\t218.30.64.0/18,\n\t\t\t218.30.128.0/17,\n\t\t\t218.31.0.0/16,\n\t\t\t218.56.0.0/13,\n\t\t\t218.64.0.0/11,\n\t\t\t218.96.0.0/15,\n\t\t\t218.98.0.0/18,\n\t\t\t218.98.64.0/22,\n\t\t\t218.98.68.0/24,\n\t\t\t218.98.73.0/24,\n\t\t\t218.98.74.0/23,\n\t\t\t218.98.76.0/22,\n\t\t\t218.98.86.0/23,\n\t\t\t218.98.88.0/21,\n\t\t\t218.98.96.0/19,\n\t\t\t218.98.128.0/17,\n\t\t\t218.100.88.0/21,\n\t\t\t218.100.96.0/19,\n\t\t\t218.100.128.0/17,\n\t\t\t218.104.0.0/14,\n\t\t\t218.108.0.0/15,\n\t\t\t218.185.192.0/19,\n\t\t\t218.185.240.0/24,\n\t\t\t218.185.242.0/24,\n\t\t\t218.185.244.0/24,\n\t\t\t218.185.246.0/23,\n\t\t\t218.192.0.0/12,\n\t\t\t218.213.85.0/24,\n\t\t\t218.240.0.0/14,\n\t\t\t218.244.0.0/15,\n\t\t\t218.246.0.0/19,\n\t\t\t218.246.32.0/20,\n\t\t\t218.246.48.0/21,\n\t\t\t218.246.56.0/23,\n\t\t\t218.246.58.0/24,\n\t\t\t218.246.60.0/22,\n\t\t\t218.246.64.0/18,\n\t\t\t218.246.128.0/21,\n\t\t\t218.246.136.0/22,\n\t\t\t218.246.144.0/20,\n\t\t\t218.246.160.0/19,\n\t\t\t218.246.192.0/18,\n\t\t\t218.247.0.0/18,\n\t\t\t218.247.96.0/19,\n\t\t\t218.247.128.0/17,\n\t\t\t218.249.0.0/16,\n\t\t\t219.72.0.0/16,\n\t\t\t219.82.0.0/16,\n\t\t\t219.83.128.0/17,\n\t\t\t219.90.68.0/22,\n\t\t\t219.90.72.0/21,\n\t\t\t219.128.0.0/11,\n\t\t\t219.216.0.0/13,\n\t\t\t219.224.0.0/13,\n\t\t\t219.232.0.0/15,\n\t\t\t219.234.10.0/23,\n\t\t\t219.234.12.0/22,\n\t\t\t219.234.32.0/19,\n\t\t\t219.234.64.0/18,\n\t\t\t219.234.128.0/17,\n\t\t\t219.235.0.0/16,\n\t\t\t219.236.0.0/14,\n\t\t\t219.242.0.0/15,\n\t\t\t219.244.0.0/14,\n\t\t\t220.101.192.0/18,\n\t\t\t220.112.0.0/14,\n\t\t\t220.152.128.0/17,\n\t\t\t220.154.0.0/16,\n\t\t\t220.155.0.0/21,\n\t\t\t220.155.9.0/24,\n\t\t\t220.155.10.0/23,\n\t\t\t220.155.12.0/22,\n\t\t\t220.155.16.0/21,\n\t\t\t220.155.24.0/22,\n\t\t\t220.155.28.0/23,\n\t\t\t220.155.31.0/24,\n\t\t\t220.155.32.0/19,\n\t\t\t220.155.64.0/18,\n\t\t\t220.155.128.0/17,\n\t\t\t220.158.240.0/22,\n\t\t\t220.160.0.0/11,\n\t\t\t220.192.0.0/12,\n\t\t\t220.231.0.0/18,\n\t\t\t220.231.128.0/17,\n\t\t\t220.232.64.0/18,\n\t\t\t220.234.0.0/16,\n\t\t\t220.242.0.0/22,\n\t\t\t220.242.4.0/23,\n\t\t\t220.242.6.0/24,\n\t\t\t220.242.8.0/21,\n\t\t\t220.242.17.0/24,\n\t\t\t220.242.18.0/23,\n\t\t\t220.242.20.0/22,\n\t\t\t220.242.24.0/21,\n\t\t\t220.242.32.0/19,\n\t\t\t220.242.64.0/18,\n\t\t\t220.242.128.0/20,\n\t\t\t220.242.144.0/21,\n\t\t\t220.242.152.0/24,\n\t\t\t220.242.154.0/23,\n\t\t\t220.242.156.0/22,\n\t\t\t220.242.160.0/20,\n\t\t\t220.242.176.0/21,\n\t\t\t220.242.184.0/23,\n\t\t\t220.242.186.0/24,\n\t\t\t220.242.188.0/22,\n\t\t\t220.242.192.0/21,\n\t\t\t220.242.200.0/24,\n\t\t\t220.242.202.0/23,\n\t\t\t220.242.205.0/24,\n\t\t\t220.242.206.0/23,\n\t\t\t220.242.208.0/20,\n\t\t\t220.242.224.0/19,\n\t\t\t220.243.0.0/17,\n\t\t\t220.243.128.0/18,\n\t\t\t220.243.192.0/20,\n\t\t\t220.243.208.0/21,\n\t\t\t220.243.216.0/23,\n\t\t\t220.243.218.0/24,\n\t\t\t220.243.220.0/22,\n\t\t\t220.243.224.0/20,\n\t\t\t220.243.240.0/23,\n\t\t\t220.243.243.0/24,\n\t\t\t220.243.244.0/22,\n\t\t\t220.243.248.0/21,\n\t\t\t220.247.136.0/23,\n\t\t\t220.248.0.0/14,\n\t\t\t220.252.0.0/16,\n\t\t\t221.0.0.0/13,\n\t\t\t221.8.0.0/14,\n\t\t\t221.12.0.0/17,\n\t\t\t221.12.128.0/18,\n\t\t\t221.13.0.0/16,\n\t\t\t221.14.0.0/15,\n\t\t\t221.122.0.0/15,\n\t\t\t221.129.0.0/16,\n\t\t\t221.130.0.0/15,\n\t\t\t221.133.225.0/24,\n\t\t\t221.133.226.0/24,\n\t\t\t221.133.228.0/22,\n\t\t\t221.133.232.0/22,\n\t\t\t221.133.240.0/20,\n\t\t\t221.136.0.0/15,\n\t\t\t221.172.0.0/14,\n\t\t\t221.176.0.0/13,\n\t\t\t221.192.0.0/14,\n\t\t\t221.196.0.0/15,\n\t\t\t221.198.0.0/16,\n\t\t\t221.199.0.0/17,\n\t\t\t221.199.128.0/18,\n\t\t\t221.199.192.0/20,\n\t\t\t221.199.224.0/19,\n\t\t\t221.200.0.0/13,\n\t\t\t221.208.0.0/12,\n\t\t\t221.224.0.0/12,\n\t\t\t222.16.0.0/12,\n\t\t\t222.32.0.0/11,\n\t\t\t222.64.0.0/11,\n\t\t\t222.125.0.0/16,\n\t\t\t222.126.128.0/17,\n\t\t\t222.128.0.0/12,\n\t\t\t222.160.0.0/14,\n\t\t\t222.168.0.0/13,\n\t\t\t222.176.0.0/12,\n\t\t\t222.192.0.0/11,\n\t\t\t222.240.0.0/13,\n\t\t\t222.248.0.0/15,\n\t\t\t223.0.0.0/12,\n\t\t\t223.20.0.0/15,\n\t\t\t223.27.184.0/22,\n\t\t\t223.29.208.0/22,\n\t\t\t223.29.252.0/24,\n\t\t\t223.29.255.0/24,\n\t\t\t223.64.0.0/11,\n\t\t\t223.96.0.0/12,\n\t\t\t223.112.0.0/14,\n\t\t\t223.116.0.0/15,\n\t\t\t223.121.128.0/17,\n\t\t\t223.122.0.0/20,\n\t\t\t223.122.16.0/24,\n\t\t\t223.122.18.0/23,\n\t\t\t223.122.20.0/22,\n\t\t\t223.122.24.0/24,\n\t\t\t223.122.26.0/23,\n\t\t\t223.122.28.0/22,\n\t\t\t223.123.195.0/24,\n\t\t\t223.123.196.0/22,\n\t\t\t223.123.202.0/23,\n\t\t\t223.123.204.0/22,\n\t\t\t223.123.208.0/20,\n\t\t\t223.123.224.0/19,\n\t\t\t223.124.0.0/14,\n\t\t\t223.128.0.0/15,\n\t\t\t223.144.0.0/12,\n\t\t\t223.160.0.0/14,\n\t\t\t223.166.0.0/15,\n\t\t\t223.192.0.0/15,\n\t\t\t223.198.0.0/15,\n\t\t\t223.201.0.0/16,\n\t\t\t223.202.0.0/15,\n\t\t\t223.208.0.0/13,\n\t\t\t223.220.0.0/15,\n\t\t\t223.223.176.0/20,\n\t\t\t223.223.192.0/20,\n\t\t\t223.240.0.0/13,\n\t\t\t223.248.0.0/14,\n\t\t\t223.252.128.0/19,\n\t\t\t223.252.192.0/19,\n\t\t\t223.255.0.0/17,\n\t\t\t223.255.236.0/22,\n\t\t\t223.255.252.0/23,\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-nikki/nikki/files/nikki.conf",
    "content": "config status 'status'\n\nconfig config 'config'\n\toption 'init' '1'\n\toption 'enabled' '0'\n\toption 'profile' 'subscription:subscription'\n\toption 'start_delay' '0'\n\toption 'scheduled_restart' '0'\n\toption 'scheduled_restart_cron' '0 3 * * *'\n\toption 'test_profile' '1'\n\toption 'core_only' '0'\n\nconfig procd 'procd'\n\toption 'fast_reload' '0'\n\toption 'env_disable_loopback_detector' '0'\n\toption 'env_disable_quic_go_gso' '0'\n\toption 'env_disable_quic_go_ecn' '0'\n\toption 'env_skip_system_ipv6_check' '0'\n\toption 'rlimit_nofile_soft' '65536'\n\toption 'rlimit_nofile_hard' '65536'\n\nconfig core 'core'\n\toption 'redirect_listener_name' 'redir-in'\n\toption 'tproxy_listener_name' 'tproxy-in'\n\toption 'tun_listener_name' 'tun-in'\n\nconfig subscription 'subscription'\n\toption 'name' 'default'\n\toption 'url' 'http://example.com/default.yaml'\n\toption 'user_agent' 'clash'\n\toption 'prefer' 'remote'\n\nconfig mixin 'mixin'\n\toption 'log_level' 'warning'\n\toption 'mode' 'rule'\n\toption 'match_process' 'off'\n\toption 'ipv6' '1'\n\toption 'ui_path' 'ui'\n\toption 'ui_url' 'https://github.com/Zephyruso/zashboard/releases/latest/download/dist-cdn-fonts.zip'\n\toption 'api_listen' '[::]:9090'\n\toption 'selection_cache' '1'\n\toption 'allow_lan' '1'\n\toption 'http_port' '8080'\n\toption 'socks_port' '1080'\n\toption 'mixed_port' '7890'\n\toption 'redir_port' '7891'\n\toption 'tproxy_port' '7892'\n\toption 'authentication' '1'\n\toption 'tun_enabled' '1'\n\toption 'tun_device' 'nikki'\n\toption 'tun_stack' 'mixed'\n\toption 'tun_dns_hijack' '0'\n\tlist 'tun_dns_hijacks' 'tcp://any:53'\n\tlist 'tun_dns_hijacks' 'udp://any:53'\n\toption 'dns_enabled' '1'\n\toption 'dns_listen' '[::]:1053'\n\toption 'dns_ipv6' '1'\n\toption 'dns_mode' 'fake-ip'\n\toption 'fake_ip_range' '198.18.0.1/16'\n\toption 'fake_ip_filter' '0'\n\tlist 'fake_ip_filters' '+.lan'\n\tlist 'fake_ip_filters' '+.local'\n\toption 'fake_ip_cache' '1'\n\toption 'hosts' '0'\n\toption 'dns_nameserver' '0'\n\toption 'proxy_server_nameserver_policy' '0'\n\toption 'dns_direct_nameserver_follow_policy' '0'\n\toption 'dns_nameserver_policy' '0'\n\toption 'sniffer_force_domain_name' '0'\n\toption 'sniffer_ignore_domain_name' '0'\n\toption 'sniffer_sniff' '0'\n\toption 'rule' '0'\n\toption 'rule_provider' '0'\n\toption 'mixin_file_content' '0'\n\nconfig authentication\n\toption 'enabled' '1'\n\toption 'username' 'nikki'\n\toption 'password' ''\n\nconfig hosts\n\toption 'enabled' '0'\n\toption 'domain_name' 'localhost'\n\tlist 'ip' '127.0.0.1'\n\tlist 'ip' '::1'\n\nconfig nameserver\n\toption 'enabled' '1'\n\toption 'type' 'default-nameserver'\n\tlist 'nameserver' '223.5.5.5'\n\tlist 'nameserver' '223.6.6.6'\n\nconfig nameserver\n\toption 'enabled' '0'\n\toption 'type' 'proxy-server-nameserver'\n\tlist 'nameserver' 'https://223.5.5.5/dns-query'\n\tlist 'nameserver' 'https://223.6.6.6/dns-query'\n\nconfig nameserver\n\toption 'enabled' '0'\n\toption 'type' 'direct-nameserver'\n\tlist 'nameserver' 'https://223.5.5.5/dns-query'\n\tlist 'nameserver' 'https://223.6.6.6/dns-query'\n\nconfig nameserver\n\toption 'enabled' '1'\n\toption 'type' 'nameserver'\n\tlist 'nameserver' 'https://223.5.5.5/dns-query'\n\tlist 'nameserver' 'https://223.6.6.6/dns-query'\n\nconfig nameserver_policy\n\toption 'enabled' '1'\n\toption 'matcher' 'geosite:private,cn'\n\tlist 'nameserver' 'https://223.5.5.5/dns-query'\n\tlist 'nameserver' 'https://223.6.6.6/dns-query'\n\nconfig nameserver_policy\n\toption 'enabled' '1'\n\toption 'matcher' 'geosite:geolocation-!cn'\n\tlist 'nameserver' 'https://1.1.1.1/dns-query'\n\tlist 'nameserver' 'https://8.8.8.8/dns-query'\n\nconfig sniff\n\toption 'enabled' '1'\n\toption 'protocol' 'HTTP'\n\tlist 'port' '80'\n\tlist 'port' '8080'\n\toption 'overwrite_destination' '1'\n\nconfig sniff\n\toption 'enabled' '1'\n\toption 'protocol' 'TLS'\n\tlist 'port' '443'\n\tlist 'port' '8443'\n\toption 'overwrite_destination' '1'\n\nconfig sniff\n\toption 'enabled' '1'\n\toption 'protocol' 'QUIC'\n\tlist 'port' '443'\n\tlist 'port' '8443'\n\toption 'overwrite_destination' '1'\n\nconfig proxy 'proxy'\n\toption 'enabled' '1'\n\toption 'tcp_mode' 'redirect'\n\toption 'udp_mode' 'tun'\n\toption 'ipv4_dns_hijack' '1'\n\toption 'ipv6_dns_hijack' '1'\n\toption 'ipv4_proxy' '1'\n\toption 'ipv6_proxy' '1'\n\toption 'fake_ip_ping_hijack' '1'\n\toption 'router_proxy' '1'\n\toption 'lan_proxy' '1'\n\tlist 'lan_inbound_interface' 'lan'\n\tlist 'reserved_ip' '0.0.0.0/8'\n\tlist 'reserved_ip' '10.0.0.0/8'\n\tlist 'reserved_ip' '127.0.0.0/8'\n\tlist 'reserved_ip' '100.64.0.0/10'\n\tlist 'reserved_ip' '169.254.0.0/16'\n\tlist 'reserved_ip' '172.16.0.0/12'\n\tlist 'reserved_ip' '192.168.0.0/16'\n\tlist 'reserved_ip' '224.0.0.0/4'\n\tlist 'reserved_ip' '240.0.0.0/4'\n\tlist 'reserved_ip6' '::/128'\n\tlist 'reserved_ip6' '::1/128'\n\tlist 'reserved_ip6' '::ffff:0:0/96'\n\tlist 'reserved_ip6' '100::/64'\n\tlist 'reserved_ip6' '64:ff9b::/96'\n\tlist 'reserved_ip6' '2001::/32'\n\tlist 'reserved_ip6' '2001:10::/28'\n\tlist 'reserved_ip6' '2001:20::/28'\n\tlist 'reserved_ip6' '2001:db8::/32'\n\tlist 'reserved_ip6' '2002::/16'\n\tlist 'reserved_ip6' 'fc00::/7'\n\tlist 'reserved_ip6' 'fe80::/10'\n\tlist 'reserved_ip6' 'ff00::/8'\n\tlist 'bypass_dscp' '4'\n\toption 'bypass_china_mainland_ip' '0'\n\toption 'bypass_china_mainland_ip6' '0'\n\toption 'proxy_tcp_dport' '0-65535'\n\toption 'proxy_udp_dport' '0-65535'\n\toption 'tun_timeout' '30'\n\toption 'tun_interval' '1'\n\nconfig router_access_control\n\toption 'enabled' '1'\n\tlist 'user' 'dnsmasq'\n\tlist 'user' 'ftp'\n\tlist 'user' 'logd'\n\tlist 'user' 'nobody'\n\tlist 'user' 'ntp'\n\tlist 'user' 'ubus'\n\tlist 'group' 'dnsmasq'\n\tlist 'group' 'ftp'\n\tlist 'group' 'logd'\n\tlist 'group' 'nogroup'\n\tlist 'group' 'ntp'\n\tlist 'group' 'ubus'\n\tlist 'cgroup' 'services/adguardhome'\n\tlist 'cgroup' 'services/aria2'\n\tlist 'cgroup' 'services/dnsmasq'\n\tlist 'cgroup' 'services/netbird'\n\tlist 'cgroup' 'services/qbittorrent'\n\tlist 'cgroup' 'services/sysntpd'\n\tlist 'cgroup' 'services/tailscale'\n\tlist 'cgroup' 'services/zerotier'\n\toption 'dns' '0'\n\toption 'proxy' '0'\n\nconfig router_access_control\n\toption 'enabled' '1'\n\toption 'dns' '1'\n\toption 'proxy' '1'\n\nconfig lan_access_control\n\toption 'enabled' '1'\n\toption 'dns' '1'\n\toption 'proxy' '1'\n\nconfig routing 'routing'\n\toption 'tproxy_fw_mark' '0x80'\n\toption 'tproxy_fw_mask' '0xFF'\n\toption 'tun_fw_mark' '0x81'\n\toption 'tun_fw_mask' '0xFF'\n\toption 'tproxy_rule_pref' '1024'\n\toption 'tun_rule_pref' '1025'\n\toption 'tproxy_route_table' '80'\n\toption 'tun_route_table' '81'\n\toption 'cgroup_id' '0x12061206'\n\toption 'cgroup_name' 'nikki'\n\toption 'dummy_device' 'nikki-dummy'\n\nconfig editor 'editor'\n\nconfig log 'log'\n\toption 'scheduled_clear' '1'\n\toption 'scheduled_clear_cron' '*/5 * * * *'\n\toption 'scheduled_clear_size_limit' '1'\n\toption 'scheduled_clear_size_limit_unit' 'MB'\n"
  },
  {
    "path": "luci-app-nikki/nikki/files/nikki.init",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=99\nSTOP=10\nUSE_PROCD=1\n\nPROG=\"/usr/bin/mihomo\"\n\n. \"$IPKG_INSTROOT/etc/nikki/scripts/include.sh\"\n\nextra_command 'update_subscription' 'Update subscription by section id'\nextra_command 'clear_logs' 'Clear logs if size exceeds the limit'\n\nboot_func() {\n\t# prepare files\n\tprepare_files\n\t# load config\n\tconfig_load nikki\n\t# start delay\n\tlocal enabled start_delay\n\tconfig_get_bool enabled \"config\" \"enabled\" 0\n\tconfig_get start_delay \"config\" \"start_delay\" 0\n\tif [ \"$enabled\" = 1 ] && [ \"$start_delay\" -gt 0 ]; then\n\t\tlog \"App\" \"Start after $start_delay seconds.\"\n\t\tsleep \"$start_delay\"\n\tfi\n\t# start\n\tstart\n}\n\nboot() {\n\tboot_func < /dev/null > /dev/null 2>&1 &\n}\n\nstart_service() {\n\t# prepare files\n\tprepare_files\n\t# load config\n\tconfig_load nikki\n\t# check if enabled\n\tlocal enabled\n\tconfig_get_bool enabled \"config\" \"enabled\" 0\n\tif [ \"$enabled\" = 0 ]; then\n\t\tlog \"App\" \"Disabled.\"\n\t\tlog \"App\" \"Exit.\"\n\t\treturn\n\tfi\n\t# start\n\tlog \"App\" \"Enabled.\"\n\tlog \"App\" \"Start.\"\n\t# check if executable\n\tif [ ! -x $PROG ]; then\n\t\tlog \"App\" \"Core is not executable.\"\n\t\tlog \"App\" \"Exit.\"\n\t\treturn\n\tfi\n\t# get config\n\t## app config\n\tlocal scheduled_restart scheduled_restart_cron profile test_profile core_only\n\tconfig_get_bool scheduled_restart \"config\" \"scheduled_restart\" 0\n\tconfig_get scheduled_restart_cron \"config\" \"scheduled_restart_cron\"\n\tconfig_get profile \"config\" \"profile\"\n\tconfig_get_bool test_profile \"config\" \"test_profile\" 0\n\tconfig_get_bool core_only \"config\" \"core_only\" 0\n\t## procd config\n\t### general\n\tlocal fast_reload\n\tconfig_get_bool fast_reload \"procd\" \"fast_reload\" 0\n\t### rlimit\n\tlocal rlimit_address_space_soft rlimit_address_space_hard rlimit_data_soft rlimit_data_hard rlimit_stack_soft rlimit_stack_hard rlimit_nofile_soft rlimit_nofile_hard\n\tconfig_get rlimit_address_space_soft \"procd\" \"rlimit_address_space_soft\"\n\tconfig_get rlimit_address_space_hard \"procd\" \"rlimit_address_space_hard\"\n\tconfig_get rlimit_data_soft \"procd\" \"rlimit_data_soft\"\n\tconfig_get rlimit_data_hard \"procd\" \"rlimit_data_hard\"\n\tconfig_get rlimit_stack_soft \"procd\" \"rlimit_stack_soft\"\n\tconfig_get rlimit_stack_hard \"procd\" \"rlimit_stack_hard\"\n\tconfig_get rlimit_nofile_soft \"procd\" \"rlimit_nofile_soft\" \"$(ulimit -Sn)\"\n\tconfig_get rlimit_nofile_hard \"procd\" \"rlimit_nofile_hard\" \"$(ulimit -Hn)\"\n\t### environment variable\n\tlocal env_safe_paths env_disable_loopback_detector env_disable_quic_go_gso env_disable_quic_go_ecn env_skip_system_ipv6_check\n\tconfig_get env_safe_paths \"procd\" \"env_safe_paths\"\n\tconfig_get_bool env_disable_loopback_detector \"procd\" \"env_disable_loopback_detector\" 0\n\tconfig_get_bool env_disable_quic_go_gso \"procd\" \"env_disable_quic_go_gso\" 0\n\tconfig_get_bool env_disable_quic_go_ecn \"procd\" \"env_disable_quic_go_ecn\" 0\n\tconfig_get_bool env_skip_system_ipv6_check \"procd\" \"env_skip_system_ipv6_check\" 0\n\t## mixin config\n\t### overwrite\n\tlocal overwrite_authentication overwrite_tun_dns_hijack overwrite_fake_ip_filter overwrite_hosts overwrite_dns_nameserver overwrite_dns_nameserver_policy overwrite_sniffer_sniff overwrite_sniffer_force_domain_name overwrite_sniffer_ignore_domain_name\n\tconfig_get_bool overwrite_authentication \"mixin\" \"authentication\" 0\n\tconfig_get_bool overwrite_tun_dns_hijack \"mixin\" \"tun_dns_hijack\" 0\n\tconfig_get_bool overwrite_fake_ip_filter \"mixin\" \"fake_ip_filter\" 0\n\tconfig_get_bool overwrite_hosts \"mixin\" \"hosts\" 0\n\tconfig_get_bool overwrite_dns_nameserver \"mixin\" \"dns_nameserver\" 0\n\tconfig_get_bool overwrite_dns_nameserver_policy \"mixin\" \"dns_nameserver_policy\" 0\n\tconfig_get_bool overwrite_sniffer_force_domain_name \"mixin\" \"sniffer_force_domain_name\" 0\n\tconfig_get_bool overwrite_sniffer_ignore_domain_name \"mixin\" \"sniffer_ignore_domain_name\" 0\n\tconfig_get_bool overwrite_sniffer_sniff \"mixin\" \"sniffer_sniff\" 0\n\t### mixin file content\n\tlocal mixin_file_content\n\tconfig_get_bool mixin_file_content \"mixin\" \"mixin_file_content\" 0\n\t## core config\n\tlocal redirect_listener_name tproxy_listener_name tun_listener_name\n\tconfig_get redirect_listener_name \"core\" \"redirect_listener_name\"\n\tconfig_get tproxy_listener_name \"core\" \"tproxy_listener_name\"\n\tconfig_get tun_listener_name \"core\" \"tun_listener_name\"\n\t## proxy config\n\tlocal proxy_enabled ipv4_dns_hijack ipv6_dns_hijack tcp_mode udp_mode\n\tconfig_get_bool proxy_enabled \"proxy\" \"enabled\" 0\n\tconfig_get_bool ipv4_dns_hijack \"proxy\" \"ipv4_dns_hijack\" 0\n\tconfig_get_bool ipv6_dns_hijack \"proxy\" \"ipv6_dns_hijack\" 0\n\tconfig_get tcp_mode \"proxy\" \"tcp_mode\"\n\tconfig_get udp_mode \"proxy\" \"udp_mode\"\n\t## log config\n\tlocal log_scheduled_clear log_scheduled_clear_cron\n\tconfig_get_bool log_scheduled_clear \"log\" \"scheduled_clear\" 0\n\tconfig_get log_scheduled_clear_cron \"log\" \"scheduled_clear_cron\"\n\t# get profile\n\tlocal profile_type; profile_type=$(echo \"$profile\" | cut -d ':' -f 1)\n\tlocal profile_id; profile_id=$(echo \"$profile\" | cut -d ':' -f 2)\n\tif [ \"$profile_type\" = \"file\" ]; then\n\t\tlocal profile_name; profile_name=\"$profile_id\"\n\t\tlocal profile_file; profile_file=\"$PROFILES_DIR/$profile_name\"\n\t\tlog \"Profile\" \"Use file: $profile_name.\"\n\t\tif [ ! -f \"$profile_file\" ]; then\n\t\t\tlog \"Profile\" \"File not found.\"\n\t\t\tlog \"App\" \"Exit.\"\n\t\t\treturn\n\t\tfi\n\t\tcp -f \"$profile_file\" \"$RUN_PROFILE_PATH\"\n\telif [ \"$profile_type\" = \"subscription\" ]; then\n\t\tlocal subscription_section; subscription_section=\"$profile_id\"\n\t\tlocal subscription_name subscription_prefer\n\t\tconfig_get subscription_name \"$subscription_section\" \"name\"\n\t\tconfig_get subscription_prefer \"$subscription_section\" \"prefer\" \"remote\"\n\t\tlog \"Profile\" \"Use subscription: $subscription_name.\"\n\t\tlocal subscription_file; subscription_file=\"$SUBSCRIPTIONS_DIR/$subscription_section.yaml\"\n\t\tif [ \"$subscription_prefer\" = \"remote\" ] || [ ! -f \"$subscription_file\" ]; then\n\t\t\tupdate_subscription \"$subscription_section\"\n\t\tfi\n\t\tif [ ! -f \"$subscription_file\" ]; then\n\t\t\tlog \"Profile\" \"Subscription file not found.\"\n\t\t\tlog \"App\" \"Exit.\"\n\t\t\treturn\n\t\tfi\n\t\tcp -f \"$subscription_file\" \"$RUN_PROFILE_PATH\"\n\telse\n\t\tlog \"Profile\" \"No profile/subscription selected.\"\n\t\tlog \"App\" \"Exit.\"\n\t\treturn\n\tfi\n\t# mixin\n\tif [ \"$core_only\" = 0 ]; then\n\t\tlog \"Mixin\" \"Mixin config.\"\n\t\tif [ \"$overwrite_authentication\" = 1 ]; then\n\t\t\tyq -M -i 'del(.authentication)' \"$RUN_PROFILE_PATH\"\n\t\tfi\n\t\tif [ \"$overwrite_tun_dns_hijack\" = 1 ]; then\n\t\t\tyq -M -i 'del(.tun.dns-hijack)' \"$RUN_PROFILE_PATH\"\n\t\tfi\n\t\tif [ \"$overwrite_fake_ip_filter\" = 1 ]; then\n\t\t\tyq -M -i 'del(.dns.fake-ip-filter)' \"$RUN_PROFILE_PATH\"\n\t\tfi\n\t\tif [ \"$overwrite_hosts\" = 1 ]; then\n\t\t\tyq -M -i 'del(.hosts)' \"$RUN_PROFILE_PATH\"\n\t\tfi\n\t\tif [ \"$overwrite_dns_nameserver\" = 1 ]; then\n\t\t\tyq -M -i 'del(.dns.default-nameserver) | del(.dns.proxy-server-nameserver) | del(.dns.direct-nameserver) | del(.dns.nameserver) | del(.dns.fallback) ' \"$RUN_PROFILE_PATH\"\n\t\tfi\n\t\tif [ \"$overwrite_dns_nameserver_policy\" = 1 ]; then\n\t\t\tyq -M -i 'del(.dns.nameserver-policy)' \"$RUN_PROFILE_PATH\"\n\t\tfi\n\t\tif [ \"$overwrite_sniffer_force_domain_name\" = 1 ]; then\n\t\t\tyq -M -i 'del(.sniffer.force-domain)' \"$RUN_PROFILE_PATH\"\n\t\tfi\n\t\tif [ \"$overwrite_sniffer_ignore_domain_name\" = 1 ]; then\n\t\t\tyq -M -i 'del(.sniffer.skip-domain)' \"$RUN_PROFILE_PATH\"\n\t\tfi\n\t\tif [ \"$overwrite_sniffer_sniff\" = 1 ]; then\n\t\t\tyq -M -i 'del(.sniffer.sniff)' \"$RUN_PROFILE_PATH\"\n\t\tfi\n\t\tif [ \"$mixin_file_content\" = 0 ]; then\n\t\t\tucode -S \"$MIXIN_UC\" | yq -M -p json -o yaml | yq -M -i eval-all '... comments=\"\" | . as $item ireduce ({}; . * $item ) | .proxies = .nikki-proxies + .proxies | del(.nikki-proxies) | .proxy-groups = .nikki-proxy-groups + .proxy-groups | del(.nikki-proxy-groups) | .rules = .nikki-rules + .rules | del(.nikki-rules)' \"$RUN_PROFILE_PATH\" -\n\t\telif [ \"$mixin_file_content\" = 1 ]; then\n\t\t\tucode -S \"$MIXIN_UC\" | yq -M -p json -o yaml | yq -M -i eval-all '... comments=\"\" | . as $item ireduce ({}; . * $item ) | .proxies = .nikki-proxies + .proxies | del(.nikki-proxies) | .proxy-groups = .nikki-proxy-groups + .proxy-groups | del(.nikki-proxy-groups) | .rules = .nikki-rules + .rules | del(.nikki-rules)' \"$RUN_PROFILE_PATH\" \"$MIXIN_FILE_PATH\" -\n\t\tfi\n\t\tif [ \"$proxy_enabled\" = 1 ]; then\n\t\t\tif yq -M -e 'has(\"tun\")' \"$RUN_PROFILE_PATH\" > /dev/null 2>&1; then\n\t\t\t\tyq -M -i '(.tun) |= (.auto-route = false | .auto-redirect = false | .auto-detect-interface = false | .disable-icmp-forwarding = true)' \"$RUN_PROFILE_PATH\"\n\t\t\tfi\n\t\t\tif yq -M -e 'has(\"listeners\")' \"$RUN_PROFILE_PATH\" > /dev/null 2>&1; then\n\t\t\t\tyq -M -i '(.listeners[] | select(.type == \"tun\")) |= (.auto-route = false | .auto-redirect = false | .auto-detect-interface = false | .disable-icmp-forwarding = true)' \"$RUN_PROFILE_PATH\"\n\t\t\tfi\n\t\tfi\n\tfi\n\t# check profile\n\tif [ \"$core_only\" = 0 ] && [ \"$proxy_enabled\" = 1 ]; then\n\t\tlog \"Profile\" \"Checking...\"\n\t\tif [ \"$ipv4_dns_hijack\" = 1 ] || [ \"$ipv6_dns_hijack\" = 1 ]; then\n\t\t\tif yq -M -e '(has(\"dns\") and (.dns | .enable) and (.dns | has(\"listen\"))) | not' \"$RUN_PROFILE_PATH\" > /dev/null 2>&1; then\n\t\t\t\tlog \"Profile\" \"Check failed.\"\n\t\t\t\tlog \"Profile\" \"DNS should be enabled and listen should be defined.\"\n\t\t\t\tlog \"App\" \"Exit.\"\n\t\t\t\treturn\n\t\t\tfi\n\t\tfi\n\t\tif [ \"$tcp_mode\" = \"redirect\" ]; then\n\t\t\tif yq -M -e \"(has(\\\"redir-port\\\") or (has(\\\"listeners\\\") and .listeners | any_c(.name == \\\"$redirect_listener_name\\\" and .type == \\\"redir\\\"))) | not\" \"$RUN_PROFILE_PATH\" > /dev/null 2>&1; then\n\t\t\t\tlog \"Profile\" \"Check failed.\"\n\t\t\t\tlog \"Profile\" \"Redirect Port/Listener should be defined.\"\n\t\t\t\tlog \"App\" \"Exit.\"\n\t\t\t\treturn\n\t\t\tfi\n\t\tfi\n\t\tif [ \"$tcp_mode\" = \"tproxy\" ] || [ \"$udp_mode\" = \"tproxy\" ]; then\n\t\t\tif yq -M -e \"(has(\\\"tproxy-port\\\") or (has(\\\"listeners\\\") and .listeners | any_c(.name == \\\"$tproxy_listener_name\\\" and .type == \\\"tproxy\\\"))) | not\" \"$RUN_PROFILE_PATH\" > /dev/null 2>&1; then\n\t\t\t\tlog \"Profile\" \"Check failed.\"\n\t\t\t\tlog \"Profile\" \"TPROXY Port/Listener should be defined.\"\n\t\t\t\tlog \"App\" \"Exit.\"\n\t\t\t\treturn\n\t\t\tfi\n\t\tfi\n\t\tif [ \"$tcp_mode\" = \"tun\" ] || [ \"$udp_mode\" = \"tun\" ]; then\n\t\t\tif yq -M -e \"(has(\\\"tun\\\") and (.tun | .enable) and (.tun | has(\\\"device\\\"))) or (has(\\\"listeners\\\") and .listeners | any_c(.name == \\\"$tun_listener_name\\\" and .type == \\\"tun\\\" and has(\\\"device\\\")))) | not\" \"$RUN_PROFILE_PATH\" > /dev/null 2>&1; then\n\t\t\t\tlog \"Profile\" \"Check failed.\"\n\t\t\t\tlog \"Profile\" \"TUN should be defined.\"\n\t\t\t\tlog \"App\" \"Exit.\"\n\t\t\t\treturn\n\t\t\tfi\n\t\tfi\n\t\tlog \"Profile\" \"Check passed.\"\n\tfi\n\t# test profile\n\tif [ \"$test_profile\" = 1 ]; then\n\t\tlog \"Profile\" \"Testing...\"\n\t\tif $PROG -d \"$RUN_DIR\" -t >> \"$CORE_LOG_PATH\" 2>&1; then\n\t\t\tlog \"Profile\" \"Test passed.\"\n\t\telse\n\t\t\tlog \"Profile\" \"Test failed.\"\n\t\t\tlog \"Profile\" \"Please check the core log to find out the problem.\"\n\t\t\tlog \"App\" \"Exit.\"\n\t\t\treturn\n\t\tfi\n\tfi\n\t# start core\n\tlog \"Core\" \"Start.\"\n\tprocd_open_instance nikki\n\n\tprocd_set_param command /bin/sh -c \"$PROG -d $RUN_DIR >> $CORE_LOG_PATH 2>&1\"\n\tprocd_set_param file \"$RUN_PROFILE_PATH\"\n\tprocd_append_param env SAFE_PATHS=\"$env_safe_paths\"\n\tprocd_append_param env DISABLE_LOOPBACK_DETECTOR=\"$env_disable_loopback_detector\"\n\tprocd_append_param env QUIC_GO_DISABLE_GSO=\"$env_disable_quic_go_gso\"\n\tprocd_append_param env QUIC_GO_DISABLE_ECN=\"$env_disable_quic_go_ecn\"\n\tprocd_append_param env SKIP_SYSTEM_IPV6_CHECK=\"$env_skip_system_ipv6_check\"\n\tif [ \"$fast_reload\" = 1 ]; then\n\t\tprocd_set_param reload_signal HUP\n\tfi\n\tprocd_set_param pidfile \"$PID_FILE_PATH\"\n\tprocd_set_param respawn\n\tprocd_append_param limits as=\"${rlimit_address_space_soft:-unlimited} ${rlimit_address_space_hard:-unlimited}\"\n\tprocd_append_param limits data=\"${rlimit_data_soft:-unlimited} ${rlimit_data_hard:-unlimited}\"\n\tprocd_append_param limits stack=\"${rlimit_stack_soft:-unlimited} ${rlimit_stack_hard:-unlimited}\"\n\tprocd_append_param limits nofile=\"${rlimit_nofile_soft} ${rlimit_nofile_hard}\"\n\n\tprocd_close_instance\n\t# cron\n\tlocal reload_cron; reload_cron=0\n\tif [ \"$scheduled_restart\" = 1 ] && [ -n \"$scheduled_restart_cron\" ]; then\n\t\tlog \"App\" \"Set scheduled restart.\"\n\t\techo \"$scheduled_restart_cron /etc/init.d/nikki restart #nikki scheduled restart\" >> \"/etc/crontabs/root\"\n\t\treload_cron=1\n\tfi\n\tif [ \"$log_scheduled_clear\" = 1 ] && [ -n \"$log_scheduled_clear_cron\" ]; then\n\t\tlog \"App\" \"Set log scheduled clear.\"\n\t\techo \"$log_scheduled_clear_cron /etc/init.d/nikki clear_logs #nikki log scheduled clear\" >> \"/etc/crontabs/root\"\n\t\treload_cron=1\n\tfi\n\tif [ \"$reload_cron\" = 1 ]; then\n\t\t/etc/init.d/cron restart\n\tfi\n\t# set started flag\n\ttouch \"$STARTED_FLAG_PATH\"\n}\n\nservice_started() {\n\t# check if started\n\tif [ ! -f \"$STARTED_FLAG_PATH\" ]; then\n\t\treturn\n\tfi\n\t# load config\n\tconfig_load nikki\n\t# check if proxy enabled\n\tlocal proxy_enabled\n\tconfig_get_bool proxy_enabled \"proxy\" \"enabled\" 0\n\tif [ \"$proxy_enabled\" = 0 ]; then\n\t\tlog \"Proxy\" \"Disabled.\"\n\t\treturn\n\tfi\n\t# get config\n\t## app config\n\tlocal core_only\n\tconfig_get_bool core_only \"config\" \"core_only\" 0\n\t## core\n\tlocal tun_listener_name\n\tconfig_get tun_listener_name \"core\" \"tun_listener_name\"\n\t## proxy config\n\t### general\n\tlocal tcp_mode udp_mode ipv4_proxy ipv6_proxy tun_timeout tun_interval\n\tconfig_get tcp_mode \"proxy\" \"tcp_mode\"\n\tconfig_get udp_mode \"proxy\" \"udp_mode\"\n\tconfig_get_bool ipv4_proxy \"proxy\" \"ipv4_proxy\" 0\n\tconfig_get_bool ipv6_proxy \"proxy\" \"ipv6_proxy\" 0\n\tconfig_get tun_timeout \"proxy\" \"tun_timeout\" 30\n\tconfig_get tun_interval \"proxy\" \"tun_interval\" 1\n\t## routing config\n\tlocal tproxy_fw_mark tproxy_fw_mask tun_fw_mark tun_fw_mask tproxy_rule_pref tun_rule_pref tproxy_route_table tun_route_table cgroup_id cgroup_name dummy_device\n\tconfig_get tproxy_fw_mark \"routing\" \"tproxy_fw_mark\" \"0x80\"\n\tconfig_get tproxy_fw_mask \"routing\" \"tproxy_fw_mask\" \"0xFF\"\n\tconfig_get tun_fw_mark \"routing\" \"tun_fw_mark\" \"0x81\"\n\tconfig_get tun_fw_mask \"routing\" \"tun_fw_mask\" \"0xFF\"\n\tconfig_get tproxy_rule_pref \"routing\" \"tproxy_rule_pref\" \"1024\"\n\tconfig_get tun_rule_pref \"routing\" \"tun_rule_pref\" \"1025\"\n\tconfig_get tproxy_route_table \"routing\" \"tproxy_route_table\" \"80\"\n\tconfig_get tun_route_table \"routing\" \"tun_route_table\" \"81\"\n\tconfig_get cgroup_id \"routing\" \"cgroup_id\" \"0x12061206\"\n\tconfig_get cgroup_name \"routing\" \"cgroup_name\" \"nikki\"\n\tconfig_get dummy_device \"routing\" \"dummy_device\" \"nikki-dummy\"\n\t# prepare config\n\tlocal tproxy_enable; tproxy_enable=0\n\tif [ \"$tcp_mode\" = \"tproxy\" ] || [ \"$udp_mode\" = \"tproxy\" ]; then\n\t\ttproxy_enable=1\n\tfi\n\tlocal tun_enable; tun_enable=0\n\tif [ \"$tcp_mode\" = \"tun\" ] || [ \"$udp_mode\" = \"tun\" ]; then\n\t\ttun_enable=1\n\tfi\n\tlocal dns_mode; dns_mode=$(yq -M '.dns.enhanced-mode // \"\"' \"$RUN_PROFILE_PATH\")\n\tlocal fake_ip6_range; fake_ip6_range=$(yq -M '.dns.fake-ip-range6 // \"\"' \"$RUN_PROFILE_PATH\")\n\tlocal tun_device; tun_device=$(yq -M \"(.tun | select(.enable) | .device) // (.listeners[] | select(.name == \\\"$tun_listener_name\\\" and .type == \\\"tun\\\") | .device)\" \"$RUN_PROFILE_PATH\")\n\tif [ \"$core_only\" = 0 ]; then\n\t\t# proxy\n\t\tlog \"Proxy\" \"Enabled.\"\n\t\t# wait for tun device online\n\t\tif [ \"$tun_enable\" = 1 ]; then\n\t\t\tlog \"Proxy\" \"Waiting for tun device online within $tun_timeout seconds...\"\n\t\t\twhile [ \"$tun_timeout\" -gt 0 ]; do\n\t\t\t\tif ip -j link show dev \"$tun_device\" 2>/dev/null | jsonfilter -q -e \"@[@['flags'][@='UP']]\" > /dev/null 2>&1; then\n\t\t\t\t\tlog \"Proxy\" \"TUN device is online.\"\n\t\t\t\t\tbreak\n\t\t\t\tfi\n\t\t\t\ttun_timeout=$((tun_timeout - tun_interval))\n\t\t\t\tsleep \"$tun_interval\"\n\t\t\tdone\n\t\t\tif [ \"$tun_timeout\" -le 0 ]; then\n\t\t\t\tlog \"Proxy\" \"Timeout, TUN device is not online.\"\n\t\t\t\tlog \"App\" \"Exit.\"\n\t\t\t\treturn\n\t\t\tfi\n\t\tfi\n\t\t# fix compatible with dockerd\n\t\t## cgroupfs-mount\n\t\t### when cgroupfs-mount is installed, cgroupv1 will mounted instead of cgroupv2, we need to create cgroup manually\n\t\tif mount | grep -q -w \"^cgroup\"; then\n\t\t\tmkdir -p \"/sys/fs/cgroup/net_cls/$cgroup_name\"\n\t\t\techo \"$cgroup_id\" > \"/sys/fs/cgroup/net_cls/$cgroup_name/net_cls.classid\"\n\t\t\tcat \"$PID_FILE_PATH\" > \"/sys/fs/cgroup/net_cls/$cgroup_name/cgroup.procs\"\n\t\tfi\n\t\t## kmod-br-netfilter\n\t\t### when kmod-br-netfilter is loaded, bridge-nf-call-iptables and bridge-nf-call-ip6tables are set to 1, we need to set them to 0 if tproxy is enabled\n\t\tif [ \"$tproxy_enable\" = 1 ] && (lsmod | grep -q br_netfilter); then\n\t\t\tif [ \"$ipv4_proxy\" = 1 ]; then\n\t\t\t\tlocal bridge_nf_call_iptables; bridge_nf_call_iptables=$(sysctl -e -n net.bridge.bridge-nf-call-iptables)\n\t\t\t\tif [ \"$bridge_nf_call_iptables\" = 1 ]; then\n\t\t\t\t\ttouch \"$BRIDGE_NF_CALL_IPTABLES_FLAG_PATH\"\n\t\t\t\t\tsysctl -q -w net.bridge.bridge-nf-call-iptables=0\n\t\t\t\tfi\n\t\t\tfi\n\t\t\tif [ \"$ipv6_proxy\" = 1 ]; then\n\t\t\t\tlocal bridge_nf_call_ip6tables; bridge_nf_call_ip6tables=$(sysctl -e -n net.bridge.bridge-nf-call-ip6tables)\n\t\t\t\tif [ \"$bridge_nf_call_ip6tables\" = 1 ]; then\n\t\t\t\t\ttouch \"$BRIDGE_NF_CALL_IP6TABLES_FLAG_PATH\"\n\t\t\t\t\tsysctl -q -w net.bridge.bridge-nf-call-ip6tables=0\n\t\t\t\tfi\n\t\t\tfi\n\t\tfi\n\t\t# ip route and rule\n\t\tif [ \"$tproxy_enable\" = 1 ]; then\n\t\t\tif [ \"$ipv4_proxy\" = 1 ]; then\n\t\t\t\tip -4 route add local default dev lo table \"$tproxy_route_table\"\n\t\t\t\tip -4 rule add pref \"$tproxy_rule_pref\" fwmark \"$tproxy_fw_mark/$tproxy_fw_mask\" table \"$tproxy_route_table\"\n\t\t\tfi\n\t\t\tif [ \"$ipv6_proxy\" = 1 ]; then\n\t\t\t\tip -6 route add local default dev lo table \"$tproxy_route_table\"\n\t\t\t\tip -6 rule add pref \"$tproxy_rule_pref\" fwmark \"$tproxy_fw_mark/$tproxy_fw_mask\" table \"$tproxy_route_table\"\n\t\t\tfi\n\t\tfi\n\t\tif [ \"$tun_enable\" = 1 ]; then\n\t\t\tif [ \"$ipv4_proxy\" = 1 ]; then\n\t\t\t\tip -4 route add unicast default dev \"$tun_device\" table \"$tun_route_table\"\n\t\t\t\tip -4 rule add pref \"$tun_rule_pref\" fwmark \"$tun_fw_mark/$tun_fw_mask\" table \"$tun_route_table\"\n\t\t\tfi\n\t\t\tif [ \"$ipv6_proxy\" = 1 ]; then\n\t\t\t\tip -6 route add unicast default dev \"$tun_device\" table \"$tun_route_table\"\n\t\t\t\tip -6 rule add pref \"$tun_rule_pref\" fwmark \"$tun_fw_mark/$tun_fw_mask\" table \"$tun_route_table\"\n\t\t\tfi\n\t\t\t$FIREWALL_INCLUDE_SH\n\t\tfi\n\t\tif [ \"$dns_mode\" = \"fake-ip\" ] && [ -n \"$fake_ip6_range\" ]; then\n\t\t\tip link add \"$dummy_device\" type dummy\n\t\t\tip link set dev \"$dummy_device\" up\n\t\t\tip -6 route add \"$fake_ip6_range\" dev \"$dummy_device\"\n\t\tfi\n\t\t# hijack\n\t\tutpl -S \"$HIJACK_UT\" | nft -f -\n\t\t# check hijack\n\t\tif nft list tables | grep -q nikki; then\n\t\t\tlog \"Proxy\" \"Hijack successful.\"\n\t\telse\n\t\t\tlog \"Proxy\" \"Hijack failed.\"\n\t\t\tlog \"App\" \"Exit.\"\n\t\tfi\n\tfi\n}\n\nservice_stopped() {\n\tcleanup\n}\n\nreload_service() {\n\tcleanup\n\tstart\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"nikki\"\n}\n\ncleanup() {\n\t# load config\n\tconfig_load nikki\n\t# get config\n\t## routing config\n\tlocal tproxy_route_table tun_route_table dummy_device\n\tconfig_get tproxy_route_table \"routing\" \"tproxy_route_table\" \"80\"\n\tconfig_get tun_route_table \"routing\" \"tun_route_table\" \"81\"\n\tconfig_get dummy_device \"routing\" \"dummy_device\" \"nikki-dummy\"\n\t# delete routing policy\n\tip -4 rule del table \"$tproxy_route_table\" > /dev/null 2>&1\n\tip -4 rule del table \"$tun_route_table\" > /dev/null 2>&1\n\tip -6 rule del table \"$tproxy_route_table\" > /dev/null 2>&1\n\tip -6 rule del table \"$tun_route_table\" > /dev/null 2>&1\n\t# delete routing table\n\tip -4 route flush table \"$tproxy_route_table\" > /dev/null 2>&1\n\tip -4 route flush table \"$tun_route_table\" > /dev/null 2>&1\n\tip -6 route flush table \"$tproxy_route_table\" > /dev/null 2>&1\n\tip -6 route flush table \"$tun_route_table\" > /dev/null 2>&1\n\t# delete dummy device\n\tip -6 link del \"$dummy_device\" > /dev/null 2>&1\n\t# delete hijack\n\tnft delete table inet nikki > /dev/null 2>&1\n\tlocal handles handle\n\thandles=$(nft --json list table inet fw4 | jsonfilter -q -e \"@['nftables'][*]['rule']\" | jsonfilter -q -a -e \"@[@['chain']='input']\" | jsonfilter -q -a -e \"@[@['comment']='nikki']\" | jsonfilter -q -a -e \"@[*]['handle']\")\n\tfor handle in $handles; do\n\t\tnft delete rule inet fw4 input handle \"$handle\"\n\tdone\n\thandles=$(nft --json list table inet fw4 | jsonfilter -q -e \"@['nftables'][*]['rule']\" | jsonfilter -q -a -e \"@[@['chain']='forward']\" | jsonfilter -q -a -e \"@[@['comment']='nikki']\" | jsonfilter -q -a -e \"@[*]['handle']\")\n\tfor handle in $handles; do\n\t\tnft delete rule inet fw4 forward handle \"$handle\"\n\tdone\n\t# delete started flag\n\trm \"$STARTED_FLAG_PATH\" > /dev/null 2>&1\n\t# revert fix compatible with dockerd\n\t## kmod-br-netfilter\n\tif rm \"$BRIDGE_NF_CALL_IPTABLES_FLAG_PATH\" > /dev/null 2>&1; then\n\t\tsysctl -q -w net.bridge.bridge-nf-call-iptables=1\n\tfi\n\tif rm \"$BRIDGE_NF_CALL_IP6TABLES_FLAG_PATH\" > /dev/null 2>&1; then\n\t\tsysctl -q -w net.bridge.bridge-nf-call-ip6tables=1\n\tfi\n\t# delete cron\n\tsed -i \"/#nikki/d\" \"/etc/crontabs/root\" > /dev/null 2>&1\n\t/etc/init.d/cron restart\n}\n\nclear_logs() {\n\t# load config\n\tconfig_load nikki\n\t# get config\n\t## log config\n\tlocal log_scheduled_clear_size_limit log_scheduled_clear_size_limit_unit\n\tconfig_get log_scheduled_clear_size_limit \"log\" \"scheduled_clear_size_limit\" 1\n\tconfig_get log_scheduled_clear_size_limit_unit \"log\" \"scheduled_clear_size_limit_unit\" \"MB\"\n\t# prepare config\n\tlocal log_scheduled_clear_size_limit_in_bytes; log_scheduled_clear_size_limit_in_bytes=0\n\tcase \"$log_scheduled_clear_size_limit_unit\" in\n\t\tB)\n\t\t\tlog_scheduled_clear_size_limit_in_bytes=$((log_scheduled_clear_size_limit))\n\t\t;;\n\t\tKB)\n\t\t\tlog_scheduled_clear_size_limit_in_bytes=$((log_scheduled_clear_size_limit * 1024))\n\t\t;;\n\t\tMB)\n\t\t\tlog_scheduled_clear_size_limit_in_bytes=$((log_scheduled_clear_size_limit * 1024 * 1024))\n\t\t;;\n\t\tGB)\n\t\t\tlog_scheduled_clear_size_limit_in_bytes=$((log_scheduled_clear_size_limit * 1024 * 1024 * 1024))\n\t\t;;\n\tesac\n\t# clear logs\n\tif [ -f \"$APP_LOG_PATH\" ] && [ \"$(wc -c < \"$APP_LOG_PATH\")\" -ge \"$log_scheduled_clear_size_limit_in_bytes\" ]; then\n\t\techo -n > \"$APP_LOG_PATH\"\n\t\tlog \"Log\" \"App log is cleared due to scheduled clear and exceeding size limits.\"\n\tfi\n\tif [ -f \"$CORE_LOG_PATH\" ] && [ \"$(wc -c < \"$CORE_LOG_PATH\")\" -ge \"$log_scheduled_clear_size_limit_in_bytes\" ]; then\n\t\techo -n > \"$CORE_LOG_PATH\"\n\t\tlog \"Log\" \"Core log is cleared due to scheduled clear and exceeding size limits.\"\n\tfi\n}\n\nupdate_subscription() {\n\tlocal subscription_section; subscription_section=\"$1\"\n\tif [ -z \"$subscription_section\" ]; then\n\t\treturn\n\tfi\n\t# load config\n\tconfig_load nikki\n\t# get subscription config\n\tlocal subscription_name subscription_info_url subscription_url subscription_user_agent\n\tconfig_get subscription_name \"$subscription_section\" \"name\"\n\tconfig_get subscription_info_url \"$subscription_section\" \"info_url\"\n\tconfig_get subscription_url \"$subscription_section\" \"url\"\n\tconfig_get subscription_user_agent \"$subscription_section\" \"user_agent\"\n\t# reset subscription info\n\tuci_remove \"nikki\" \"$subscription_section\" \"expire\" > /dev/null 2>&1\n\tuci_remove \"nikki\" \"$subscription_section\" \"upload\" > /dev/null 2>&1\n\tuci_remove \"nikki\" \"$subscription_section\" \"download\" > /dev/null 2>&1\n\tuci_remove \"nikki\" \"$subscription_section\" \"total\" > /dev/null 2>&1\n\tuci_remove \"nikki\" \"$subscription_section\" \"used\" > /dev/null 2>&1\n\tuci_remove \"nikki\" \"$subscription_section\" \"avaliable\" > /dev/null 2>&1\n\tuci_remove \"nikki\" \"$subscription_section\" \"update\" > /dev/null 2>&1\n\tuci_remove \"nikki\" \"$subscription_section\" \"success\" > /dev/null 2>&1\n\t# update subscription\n\tlog \"Profile\" \"Update subscription: $subscription_name.\"\n\tlocal success\n\tlocal subscription_info_header_tmpfile; subscription_info_header_tmpfile=\"$TEMP_DIR/$subscription_section.info.header\"\n\tlocal subscription_header_tmpfile; subscription_header_tmpfile=\"$TEMP_DIR/$subscription_section.header\"\n\tlocal subscription_tmpfile; subscription_tmpfile=\"$TEMP_DIR/$subscription_section.yaml\"\n\tlocal subscription_info_file\n\tlocal subscription_file; subscription_file=\"$SUBSCRIPTIONS_DIR/$subscription_section.yaml\"\n\t# fetch subscription info\n\tif [ -n \"$subscription_info_url\" ]; then\n\t\tlog \"Profile\" \"Fetch subscription info.\"\n\t\tif curl -s -f -m 120 --connect-timeout 15 --retry 3 -L -X GET -A \"$subscription_user_agent\" -D \"$subscription_info_header_tmpfile\" \"$subscription_info_url\" > /dev/null 2>&1; then\n\t\t\tif [ ! -f \"$subscription_info_file\" ] && grep -q -i \"subscription-userinfo:\" \"$subscription_info_header_tmpfile\"; then\n\t\t\t\tsubscription_info_file=\"$subscription_info_header_tmpfile\"\n\t\t\tfi\n\t\tfi\n\tfi\n\t# download subscription\n\tlog \"Profile\" \"Download subscription.\"\n\tif curl -s -f -m 120 --connect-timeout 15 --retry 3 -L -X GET -A \"$subscription_user_agent\" -D \"$subscription_header_tmpfile\" -o \"$subscription_tmpfile\" \"$subscription_url\" > /dev/null 2>&1; then\n\t\tlog \"Profile\" \"Subscription download successful.\"\n\t\tif [ ! -f \"$subscription_info_file\" ] && grep -q -i \"subscription-userinfo:\" \"$subscription_header_tmpfile\"; then\n\t\t\tsubscription_info_file=\"$subscription_header_tmpfile\"\n\t\tfi\n\t\tif yq -M -p yaml -o yaml -e 'has(\"proxies\") or has(\"proxy-providers\")' \"$subscription_tmpfile\" > /dev/null 2>&1; then\n\t\t\tlog \"Profile\" \"Subscription is valid.\"\n\t\t\tsuccess=1\n\t\telse\n\t\t\tlog \"Profile\" \"Subscription is not valid.\"\n\t\t\tsuccess=0\n\t\tfi\n\telse\n\t\tlog \"Profile\" \"Subscription download failed.\"\n\t\tsuccess=0\n\tfi\n\t# check if success\n\tif [ \"$success\" = 1 ]; then\n\t\tlog \"Profile\" \"Subscription update successful.\"\n\t\tif [ -f \"$subscription_info_file\" ]; then\n\t\t\tlocal subscription_expire subscription_upload subscription_download subscription_total subscription_used subscription_avaliable\n\t\t\tsubscription_expire=$(grep -i \"subscription-userinfo: \" \"$subscription_info_file\" | grep -i -o -E \"expire=[[:digit:]]+\" | cut -d '=' -f 2)\n\t\t\tsubscription_upload=$(grep -i \"subscription-userinfo: \" \"$subscription_info_file\" | grep -i -o -E \"upload=[[:digit:]]+\" | cut -d '=' -f 2)\n\t\t\tsubscription_download=$(grep -i \"subscription-userinfo: \" \"$subscription_info_file\" | grep -i -o -E \"download=[[:digit:]]+\" | cut -d '=' -f 2)\n\t\t\tsubscription_total=$(grep -i \"subscription-userinfo: \" \"$subscription_info_file\" | grep -i -o -E \"total=[[:digit:]]+\" | cut -d '=' -f 2)\n\t\t\tif [ -n \"$subscription_upload\" ] && [ -n \"$subscription_download\" ]; then\n\t\t\t\tsubscription_used=$((subscription_upload + subscription_download))\n\t\t\t\tif [ -n \"$subscription_total\" ]; then\n\t\t\t\t\tsubscription_avaliable=$((subscription_total - subscription_used))\n\t\t\t\tfi\n\t\t\tfi\n\t\t\t# update subscription info\n\t\t\tif [ -n \"$subscription_expire\" ]; then\n\t\t\t\tuci_set \"nikki\" \"$subscription_section\" \"expire\" \"$(date \"+%Y-%m-%d %H:%M:%S\" -d \"@$subscription_expire\")\"\n\t\t\tfi\n\t\t\tif [ -n \"$subscription_upload\" ]; then\n\t\t\t\tuci_set \"nikki\" \"$subscription_section\" \"upload\" \"$(format_filesize \"$subscription_upload\")\"\n\t\t\tfi\n\t\t\tif [ -n \"$subscription_download\" ]; then\n\t\t\t\tuci_set \"nikki\" \"$subscription_section\" \"download\" \"$(format_filesize \"$subscription_download\")\"\n\t\t\tfi\n\t\t\tif [ -n \"$subscription_total\" ]; then\n\t\t\t\tuci_set \"nikki\" \"$subscription_section\" \"total\" \"$(format_filesize \"$subscription_total\")\"\n\t\t\tfi\n\t\t\tif [ -n \"$subscription_used\" ]; then\n\t\t\t\tuci_set \"nikki\" \"$subscription_section\" \"used\" \"$(format_filesize \"$subscription_used\")\"\n\t\t\tfi\n\t\t\tif [ -n \"$subscription_avaliable\" ]; then\n\t\t\t\tuci_set \"nikki\" \"$subscription_section\" \"avaliable\" \"$(format_filesize \"$subscription_avaliable\")\"\n\t\t\tfi\n\t\tfi\n\t\tuci_set \"nikki\" \"$subscription_section\" \"update\" \"$(date \"+%Y-%m-%d %H:%M:%S\")\"\n\t\tuci_set \"nikki\" \"$subscription_section\" \"success\" \"1\"\n\t\t# update subscription file\n\t\trm -f \"$subscription_info_header_tmpfile\"\n\t\trm -f \"$subscription_header_tmpfile\"\n\t\tmv -f \"$subscription_tmpfile\" \"$subscription_file\"\n\telif [ \"$success\" = 0 ]; then\n\t\tlog \"Profile\" \"Subscription update failed.\"\n\t\t# update subscription info\n\t\tuci_set \"nikki\" \"$subscription_section\" \"success\" \"0\"\n\t\t# remove tmpfile\n\t\trm -f \"$subscription_info_header_tmpfile\"\n\t\trm -f \"$subscription_header_tmpfile\"\n\t\trm -f \"$subscription_tmpfile\"\n\tfi\n\tuci_commit \"nikki\"\n}\n"
  },
  {
    "path": "luci-app-nikki/nikki/files/nikki.upgrade",
    "content": "/etc/nikki/profiles/\n/etc/nikki/subscriptions/\n/etc/nikki/mixin.yaml\n/etc/nikki/run/providers/rule/\n/etc/nikki/run/providers/proxy/\n"
  },
  {
    "path": "luci-app-nikki/nikki/files/scripts/debug.sh",
    "content": "#!/bin/sh\n\n. \"$IPKG_INSTROOT/etc/nikki/scripts/include.sh\"\n\nenabled=`uci get nikki.config.enabled`\n\nif [ \"$enabled\" == \"0\" ]; then\n\tuci set nikki.config.enabled=1\n\tuci commit nikki\n\t/etc/init.d/nikki restart\nfi\n\necho \\\n\"\n# Nikki Debug Info\n## system\n\\`\\`\\`shell\n`\ncat /etc/openwrt_release\n`\n\\`\\`\\`\n## kernel\n\\`\\`\\`\n`\nuname -a\n`\n\\`\\`\\`\n## application\n\\`\\`\\`\n`\nif [ -x \"/bin/opkg\" ]; then\n\topkg list-installed \"nikki\"\n\topkg list-installed \"luci-app-nikki\"\nelif [ -x \"/usr/bin/apk\" ]; then\n\tapk list -I \"nikki\"\n\tapk list -I \"luci-app-nikki\"\nfi\n`\n\\`\\`\\`\n## config\n\\`\\`\\`json\n`\nucode -S -e '\nimport { cursor } from \"uci\";\n\nconst uci = cursor();\n\nconst config = uci.get_all(\"nikki\");\nconst result = {};\n\nfor (let section_id in config) {\n\tconst section = config[section_id];\n\tconst section_type = section[\".type\"];\n\tif (result[section_type] == null) {\n\t\tresult[section_type] = [];\n\t}\n\tpush(result[section_type], section);\n}\nfor (let section_type in result) {\n\tfor (let section in result[section_type]) {\n\t\tdelete section[\".anonymous\"];\n\t\tdelete section[\".type\"];\n\t\tdelete section[\".name\"];\n\t\tdelete section[\".index\"];\n\t}\n}\nif (exists(result, \"mixin\")) {\n\tfor (let x in result[\"mixin\"]) {\n\t\tif (exists(x, \"api_secret\")) {\n\t\t\tx[\"api_secret\"] = \"*\";\n\t\t}\n\t}\n}\nif (exists(result, \"authentication\")) {\n\tfor (let x in result[\"authentication\"]) {\n\t\tif (exists(x, \"password\")) {\n\t\t\tx[\"password\"] = \"*\";\n\t\t}\n\t}\n}\nif (exists(result, \"subscription\")) {\n\tfor (let x in result[\"subscription\"]) {\n\t\tif (exists(x, \"url\")) {\n\t\t\tx[\"url\"] = \"*\";\n\t\t}\n\t}\n}\nif (exists(result, \"lan_access_control\")) {\n\tfor (let x in result[\"lan_access_control\"]) {\n\t\tif (exists(x, \"ip\")) {\n\t\t\tfor (let i = 0; i < length(x[\"ip\"]); i++) {\n\t\t\t\tx[\"ip\"][i] = \"*\";\n\t\t\t}\n\t\t}\n\t\tif (exists(x, \"ip6\")) {\n\t\t\tfor (let i = 0; i < length(x[\"ip6\"]); i++) {\n\t\t\t\tx[\"ip6\"][i] = \"*\";\n\t\t\t}\n\t\t}\n\t\tif (exists(x, \"mac\")) {\n\t\t\tfor (let i = 0; i < length(x[\"mac\"]); i++) {\n\t\t\t\tx[\"mac\"][i] = \"*\";\n\t\t\t}\n\t\t}\n\t}\n}\ndelete result[\"status\"];\ndelete result[\"editor\"];\ndelete result[\"log\"];\nprint(result);\n'\n`\n\\`\\`\\`\n## profile\n\\`\\`\\`json\n`\nucode -S -e '\nimport { popen } from \"fs\";\n\nfunction desensitize_proxies(proxies) {\n\tfor (let x in proxies) {\n\t\tif (exists(x, \"server\")) {\n\t\t\tx[\"server\"] = \"*\";\n\t\t}\n\t\tif (exists(x, \"servername\")) {\n\t\t\tx[\"servername\"] = \"*\";\n\t\t}\n\t\tif (exists(x, \"sni\")) {\n\t\t\tx[\"sni\"] = \"*\";\n\t\t}\n\t\tif (exists(x, \"port\")) {\n\t\t\tx[\"port\"] = \"*\";\n\t\t}\n\t\tif (exists(x, \"ports\")) {\n\t\t\tx[\"ports\"] = \"*\";\n\t\t}\n\t\tif (exists(x, \"port-range\")) {\n\t\t\tx[\"port-range\"] = \"*\";\n\t\t}\n\t\tif (exists(x, \"uuid\")) {\n\t\t\tx[\"uuid\"] = \"*\";\n\t\t}\n\t\tif (exists(x, \"private-key\")) {\n\t\t\tx[\"private-key\"] = \"*\";\n\t\t}\n\t\tif (exists(x, \"public-key\")) {\n\t\t\tx[\"public-key\"] = \"*\";\n\t\t}\n\t\tif (exists(x, \"token\")) {\n\t\t\tx[\"token\"] = \"*\";\n\t\t}\n\t\tif (exists(x, \"username\")) {\n\t\t\tx[\"username\"] = \"*\";\n\t\t}\n\t\tif (exists(x, \"password\")) {\n\t\t\tx[\"password\"] = \"*\";\n\t\t}\n\t}\n}\n\nfunction desensitize_profile() {\n\tlet profile = {};\n\tconst process = popen(\"yq -M -p yaml -o json /etc/nikki/run/config.yaml\");\n\tif (process) {\n\t\tprofile = json(process);\n\t\tif (exists(profile, \"secret\")) {\n\t\t\tprofile[\"secret\"] = \"*\";\n\t\t}\n\t\tif (exists(profile, \"authentication\")) {\n\t\t\tprofile[\"authentication\"] = [];\n\t\t}\n\t\tif (exists(profile, \"proxy-providers\")) {\n\t\t\tfor (let x in profile[\"proxy-providers\"]) {\n\t\t\t\tif (exists(profile[\"proxy-providers\"][x], \"url\")) {\n\t\t\t\t\tprofile[\"proxy-providers\"][x][\"url\"] = \"*\";\n\t\t\t\t}\n\t\t\t\tif (exists(profile[\"proxy-providers\"][x], \"payload\")) {\n\t\t\t\t\tdesensitize_proxies(profile[\"proxy-providers\"][x][\"payload\"]);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (exists(profile, \"proxies\")) {\n\t\t\tdesensitize_proxies(profile[\"proxies\"]);\n\t\t}\n\t\tprocess.close();\n\t}\n\treturn profile;\n}\n\nprint(desensitize_profile());\n'\n`\n\\`\\`\\`\n## ip rule\n\\`\\`\\`\n`\nip rule list\n`\n\\`\\`\\`\n## ip route\n\\`\\`\\`\nTPROXY: \n`\nip route list table \"$(uci get nikki.routing.tproxy_route_table)\"\n`\n\nTUN: \n`\nip route list table \"$(uci get nikki.routing.tun_route_table)\"\n`\n\\`\\`\\`\n## ip6 rule\n\\`\\`\\`\n`\nip -6 rule list\n`\n\\`\\`\\`\n## ip6 route\n\\`\\`\\`\nTPROXY: \n`\nip -6 route list table \"$(uci get nikki.routing.tproxy_route_table)\"\n`\n\nTUN: \n`\nip -6 route list table \"$(uci get nikki.routing.tun_route_table)\"\n`\n\\`\\`\\`\n## nftables\n\\`\\`\\`\n`\nnft list table inet nikki\n`\n\\`\\`\\`\n## service\n\\`\\`\\`json\n`\n/etc/init.d/nikki info\n`\n\\`\\`\\`\n\"\n\nif [ \"$enabled\" == \"0\" ]; then\n\tuci set nikki.config.enabled=0\n\tuci commit nikki\n\t/etc/init.d/nikki restart\nfi\n"
  },
  {
    "path": "luci-app-nikki/nikki/files/scripts/firewall_include.sh",
    "content": "#!/bin/sh\n\n. \"$IPKG_INSTROOT/lib/functions.sh\"\n. \"$IPKG_INSTROOT/etc/nikki/scripts/include.sh\"\n\nconfig_load nikki\nconfig_get_bool enabled \"config\" \"enabled\" 0\nconfig_get_bool core_only \"config\" \"core_only\" 0\nconfig_get tun_listener_name \"core\" \"tun_listener_name\"\nconfig_get_bool proxy_enabled \"proxy\" \"enabled\" 0 \nconfig_get tcp_mode \"proxy\" \"tcp_mode\"\nconfig_get udp_mode \"proxy\" \"udp_mode\"\n\nif [ \"$enabled\" = 1 ] && [ \"$core_only\" = 0 ] && [ \"$proxy_enabled\" = 1 ]; then\n\tif [ \"$tcp_mode\" = \"tun\" ] || [ \"$udp_mode\" = \"tun\" ]; then\n\t\ttun_device=$(yq -M \"(.tun | select(.enable) | .device) // (.listeners[] | select(.name == \\\"$tun_listener_name\\\" and .type == \\\"tun\\\") | .device)\" \"$RUN_PROFILE_PATH\")\n\t\tnft insert rule inet fw4 input iifname \"$tun_device\" counter accept comment \"nikki\"\n\t\tnft insert rule inet fw4 forward oifname \"$tun_device\" counter accept comment \"nikki\"\n\t\tnft insert rule inet fw4 forward iifname \"$tun_device\" counter accept comment \"nikki\"\n\tfi\nfi\n\nexit 0\n"
  },
  {
    "path": "luci-app-nikki/nikki/files/scripts/include.sh",
    "content": "#!/bin/sh\n\n# paths\nHOME_DIR=\"/etc/nikki\"\nPROFILES_DIR=\"$HOME_DIR/profiles\"\nSUBSCRIPTIONS_DIR=\"$HOME_DIR/subscriptions\"\nMIXIN_FILE_PATH=\"$HOME_DIR/mixin.yaml\"\nRUN_DIR=\"$HOME_DIR/run\"\nRUN_PROFILE_PATH=\"$RUN_DIR/config.yaml\"\nPROVIDERS_DIR=\"$RUN_DIR/providers\"\nRULE_PROVIDERS_DIR=\"$PROVIDERS_DIR/rule\"\nPROXY_PROVIDERS_DIR=\"$PROVIDERS_DIR/proxy\"\n\n# log\nLOG_DIR=\"/var/log/nikki\"\nAPP_LOG_PATH=\"$LOG_DIR/app.log\"\nCORE_LOG_PATH=\"$LOG_DIR/core.log\"\n\n# temp\nTEMP_DIR=\"/var/run/nikki\"\nPID_FILE_PATH=\"$TEMP_DIR/nikki.pid\"\nSTARTED_FLAG_PATH=\"$TEMP_DIR/started.flag\"\nBRIDGE_NF_CALL_IPTABLES_FLAG_PATH=\"$TEMP_DIR/bridge_nf_call_iptables.flag\"\nBRIDGE_NF_CALL_IP6TABLES_FLAG_PATH=\"$TEMP_DIR/bridge_nf_call_ip6tables.flag\"\n\n# ucode\nUCODE_DIR=\"$HOME_DIR/ucode\"\nINCLUDE_UC=\"$UCODE_DIR/include.uc\"\nMIXIN_UC=\"$UCODE_DIR/mixin.uc\"\nHIJACK_UT=\"$UCODE_DIR/hijack.ut\"\n\n# scripts\nSH_DIR=\"$HOME_DIR/scripts\"\nINCLUDE_SH=\"$SH_DIR/include.sh\"\nFIREWALL_INCLUDE_SH=\"$SH_DIR/firewall_include.sh\"\n\n# nftables\nNFT_DIR=\"$HOME_DIR/nftables\"\nGEOIP_CN_NFT=\"$NFT_DIR/geoip_cn.nft\"\nGEOIP6_CN_NFT=\"$NFT_DIR/geoip6_cn.nft\"\n\n# functions\nformat_filesize() {\n\tlocal b; b=1\n\tlocal kb; kb=$((b * 1024))\n\tlocal mb; mb=$((kb * 1024))\n\tlocal gb; gb=$((mb * 1024))\n\tlocal tb; tb=$((gb * 1024))\n\tlocal pb; pb=$((tb * 1024))\n\tlocal size; size=\"$1\"\n\tif [ -n \"$size\" ]; then\n\t\tif [ \"$size\" -lt \"$kb\" ]; then\n\t\t\techo \"$(awk \"BEGIN {print $size / $b}\") B\"\n\t\telif [ \"$size\" -lt \"$mb\" ]; then\n\t\t\techo \"$(awk \"BEGIN {print $size / $kb}\") KB\"\n\t\telif [ \"$size\" -lt \"$gb\" ]; then\n\t\t\techo \"$(awk \"BEGIN {print $size / $mb}\") MB\"\n\t\telif [ \"$size\" -lt \"$tb\" ]; then\n\t\t\techo \"$(awk \"BEGIN {print $size / $gb}\") GB\"\n\t\telif [ \"$size\" -lt \"$pb\" ]; then\n\t\t\techo \"$(awk \"BEGIN {print $size / $tb}\") TB\"\n\t\telse\n\t\t\techo \"$(awk \"BEGIN {print $size / $pb}\") PB\"\n\t\tfi\n\tfi\n}\n\nprepare_files() {\n\tif [ ! -d \"$LOG_DIR\" ]; then\n\t\tmkdir -p \"$LOG_DIR\"\n\tfi\n\tif [ ! -f \"$APP_LOG_PATH\" ]; then\n\t\ttouch \"$APP_LOG_PATH\"\n\tfi\n\tif [ ! -f \"$CORE_LOG_PATH\" ]; then\n\t\ttouch \"$CORE_LOG_PATH\"\n\tfi\n\tif [ ! -d \"$TEMP_DIR\" ]; then\n\t\tmkdir -p \"$TEMP_DIR\"\n\tfi\n}\n\nlog() {\n\techo \"[$(date \"+%Y-%m-%d %H:%M:%S\")] [$1] $2\" >> \"$APP_LOG_PATH\"\n}\n"
  },
  {
    "path": "luci-app-nikki/nikki/files/uci-defaults/firewall.sh",
    "content": "#!/bin/sh\n\n. \"$IPKG_INSTROOT/etc/nikki/scripts/include.sh\"\n\nuci -q batch <<-EOF > /dev/null\n\tdel firewall.nikki\n\tset firewall.nikki=include\n\tset firewall.nikki.type=script\n\tset firewall.nikki.path=$FIREWALL_INCLUDE_SH\n\tset firewall.nikki.fw4_compatible=1\n\tcommit firewall\nEOF\n"
  },
  {
    "path": "luci-app-nikki/nikki/files/uci-defaults/init.sh",
    "content": "#!/bin/sh\n\n. \"$IPKG_INSTROOT/etc/nikki/scripts/include.sh\"\n\n# check nikki.config.init\ninit=$(uci -q get nikki.config.init); [ -z \"$init\" ] && return\n\n# generate random string for api secret and authentication password\nrandom=$(awk 'BEGIN{srand(); printf \"%06d\", int(rand() * 1000000)}')\n\n# set nikki.mixin.api_secret\nuci set nikki.mixin.api_secret=\"$random\"\n\n# set nikki.@authentication[0].password\nuci set nikki.@authentication[0].password=\"$random\"\n\n# remove nikki.config.init\nuci del nikki.config.init\n\n# commit\nuci commit nikki\n\n# exit with 0\nexit 0\n"
  },
  {
    "path": "luci-app-nikki/nikki/files/uci-defaults/migrate.sh",
    "content": "#!/bin/sh\n\n. \"$IPKG_INSTROOT/etc/nikki/scripts/include.sh\"\n\n# since v1.18.0\n\nmixin_rule=$(uci -q get nikki.mixin.rule); [ -z \"$mixin_rule\" ] && uci set nikki.mixin.rule=0\n\nmixin_rule_provider=$(uci -q get nikki.mixin.rule_provider); [ -z \"$mixin_rule_provider\" ] && uci set nikki.mixin.rule_provider=0\n\n# since v1.19.0\n\nuci show nikki | grep -E 'nikki\\.@rule\\[[[:digit:]]+\\].match=' | sed 's/nikki.@rule\\[\\([[:digit:]]\\+\\)\\].match=.*/rename nikki.@rule[\\1].match=matcher/' | uci batch\n\n# since v1.19.1\n\nproxy_fake_ip_ping_hijack=$(uci -q get nikki.proxy.fake_ip_ping_hijack); [ -z \"$proxy_fake_ip_ping_hijack\" ] && uci set nikki.proxy.fake_ip_ping_hijack=0\n\n# since v1.20.0\n\nmixin_api_port=$(uci -q get nikki.mixin.api_port); [ -n \"$mixin_api_port\" ] && {\n\tuci del nikki.mixin.api_port\n\tuci set nikki.mixin.api_listen=\"[::]:$mixin_api_port\"\n}\n\nmixin_dns_port=$(uci -q get nikki.mixin.dns_port); [ -n \"$mixin_dns_port\" ] && {\n\tuci del nikki.mixin.dns_port\n\tuci set nikki.mixin.dns_listen=\"[::]:$mixin_dns_port\"\n}\n\n# since v1.22.0\n\nproxy_transparent_proxy=$(uci -q get nikki.proxy.transparent_proxy); [ -n \"$proxy_transparent_proxy\" ] && {\n\tuci rename nikki.proxy.transparent_proxy=enabled\n\tuci rename nikki.proxy.tcp_transparent_proxy_mode=tcp_mode\n\tuci rename nikki.proxy.udp_transparent_proxy_mode=udp_mode\n\n\tuci add nikki router_access_control\n\tuci set nikki.@router_access_control[-1].enabled=1\n\tproxy_bypass_user=$(uci -q get nikki.proxy.bypass_user); [ -n \"$proxy_bypass_user\" ] && {\n\t\tfor router_access_control_user in $proxy_bypass_user; do\n\t\t\tuci add_list nikki.@router_access_control[-1].user=\"$router_access_control_user\"\n\t\tdone\n\t}\n\tproxy_bypass_group=$(uci -q get nikki.proxy.bypass_group); [ -n \"$proxy_bypass_group\" ] && {\n\t\tfor router_access_control_group in $proxy_bypass_group; do\n\t\t\tuci add_list nikki.@router_access_control[-1].group=\"$router_access_control_group\"\n\t\tdone\n\t}\n\tproxy_bypass_cgroup=$(uci -q get nikki.proxy.bypass_cgroup); [ -n \"$proxy_bypass_cgroup\" ] && {\n\t\tfor router_access_control_cgroup in $proxy_bypass_cgroup; do\n\t\t\tuci add_list nikki.@router_access_control[-1].cgroup=\"$router_access_control_cgroup\"\n\t\tdone\n\t}\n\tuci set nikki.@router_access_control[-1].proxy=0\n\n\tuci add nikki router_access_control\n\tuci set nikki.@router_access_control[-1].enabled=1\n\tuci set nikki.@router_access_control[-1].proxy=1\n\n\tuci add_list nikki.proxy.lan_inbound_interface=lan\n\n\tproxy_access_control_mode=$(uci -q get nikki.proxy.access_control_mode)\n\n\t[ \"$proxy_access_control_mode\" != \"all\" ] && {\n\t\tproxy_acl_ip=$(uci -q get nikki.proxy.acl_ip); [ -n \"$proxy_acl_ip\" ] && {\n\t\t\tfor ip in $proxy_acl_ip; do\n\t\t\t\tuci add nikki lan_access_control\n\t\t\t\tuci set nikki.@lan_access_control[-1].enabled=1\n\t\t\t\tuci add_list nikki.@lan_access_control[-1].ip=\"$ip\"\n\t\t\t\t[ \"$proxy_access_control_mode\" = \"allow\" ] && uci set nikki.@lan_access_control[-1].proxy=1\n\t\t\t\t[ \"$proxy_access_control_mode\" = \"block\" ] && uci set nikki.@lan_access_control[-1].proxy=0\n\t\t\tdone\n\t\t}\n\t\tproxy_acl_ip6=$(uci -q get nikki.proxy.acl_ip6); [ -n \"$proxy_acl_ip6\" ] && {\n\t\t\tfor ip6 in $proxy_acl_ip6; do\n\t\t\t\tuci add nikki lan_access_control\n\t\t\t\tuci set nikki.@lan_access_control[-1].enabled=1\n\t\t\t\tuci add_list nikki.@lan_access_control[-1].ip6=\"$ip6\"\n\t\t\t\t[ \"$proxy_access_control_mode\" = \"allow\" ] && uci set nikki.@lan_access_control[-1].proxy=1\n\t\t\t\t[ \"$proxy_access_control_mode\" = \"block\" ] && uci set nikki.@lan_access_control[-1].proxy=0\n\t\t\tdone\n\t\t}\n\t\tproxy_acl_mac=$(uci -q get nikki.proxy.acl_mac); [ -n \"$proxy_acl_mac\" ] && {\n\t\t\tfor mac in $proxy_acl_mac; do\n\t\t\t\tuci add nikki lan_access_control\n\t\t\t\tuci set nikki.@lan_access_control[-1].enabled=1\n\t\t\t\tuci add_list nikki.@lan_access_control[-1].mac=\"$mac\"\n\t\t\t\t[ \"$proxy_access_control_mode\" = \"allow\" ] && uci set nikki.@lan_access_control[-1].proxy=1\n\t\t\t\t[ \"$proxy_access_control_mode\" = \"block\" ] && uci set nikki.@lan_access_control[-1].proxy=0\n\t\t\tdone\n\t\t}\n\t}\n\n\t[ \"$proxy_access_control_mode\" != \"allow\" ] && {\n\t\tuci add nikki lan_access_control\n\t\tuci set nikki.@lan_access_control[-1].enabled=1\n\t\tuci set nikki.@lan_access_control[-1].proxy=1\n\t}\n\n\tuci del nikki.proxy.access_control_mode\n\tuci del nikki.proxy.acl_ip\n\tuci del nikki.proxy.acl_ip6\n\tuci del nikki.proxy.acl_mac\n\tuci del nikki.proxy.acl_interface\n\tuci del nikki.proxy.bypass_user\n\tuci del nikki.proxy.bypass_group\n\tuci del nikki.proxy.bypass_cgroup\n}\n\n# since v1.23.0\n\nsection_routing=$(uci -q get nikki.routing); [ -z \"$section_routing\" ] && {\n\tuci set nikki.routing=routing\n\tuci set nikki.routing.tproxy_fw_mark=0x80\n\tuci set nikki.routing.tun_fw_mark=0x81\n\tuci set nikki.routing.tproxy_rule_pref=1024\n\tuci set nikki.routing.tun_rule_pref=1025\n\tuci set nikki.routing.tproxy_route_table=80\n\tuci set nikki.routing.tun_route_table=81\n\tuci set nikki.routing.cgroup_id=0x12061206\n\tuci set nikki.routing.cgroup_name=nikki\n}\n\nproxy_tun_timeout=$(uci -q get nikki.proxy.tun_timeout); [ -z \"$proxy_tun_timeout\" ] && uci set nikki.proxy.tun_timeout=30\n\nproxy_tun_interval=$(uci -q get nikki.proxy.tun_interval); [ -z \"$proxy_tun_interval\" ] && uci set nikki.proxy.tun_interval=1\n\n# since v1.23.1\n\nuci show nikki | grep -o -E 'nikki\\.@router_access_control\\[[[:digit:]]+\\]=router_access_control' | cut -d '=' -f 1 | while read -r router_access_control; do\n\tfor router_access_control_cgroup in $(uci -q get \"$router_access_control.cgroup\"); do\n\t\t[ -d \"/sys/fs/cgroup/$router_access_control_cgroup\" ] && continue\n\t\t[ -d \"/sys/fs/cgroup/services/$router_access_control_cgroup\" ] && {\n\t\t\tuci del_list \"$router_access_control.cgroup=$router_access_control_cgroup\"\n\t\t\tuci add_list \"$router_access_control.cgroup=services/$router_access_control_cgroup\"\n\t\t}\n\tdone\ndone\n\n# since v1.23.3\n\nuci show nikki | grep -o -E 'nikki\\.@router_access_control\\[[[:digit:]]+\\]=router_access_control' | cut -d '=' -f 1 | while read -r router_access_control; do\n\trouter_access_control_proxy=$(uci -q get \"$router_access_control.proxy\")\n\trouter_access_control_dns=$(uci -q get \"$router_access_control.dns\")\n\t[ -z \"$router_access_control_dns\" ] && uci set \"$router_access_control.dns=$router_access_control_proxy\"\ndone\n\nuci show nikki | grep -o -E 'nikki\\.@lan_access_control\\[[[:digit:]]+\\]=lan_access_control' | cut -d '=' -f 1 | while read -r lan_access_control; do\n\tlan_access_control_proxy=$(uci -q get \"$lan_access_control.proxy\")\n\tlan_access_control_dns=$(uci -q get \"$lan_access_control.dns\")\n\t[ -z \"$lan_access_control_dns\" ] && uci set \"$lan_access_control.dns=$lan_access_control_proxy\"\ndone\n\n# since v1.24.0\n\nproxy_reserved_ip=$(uci -q get nikki.proxy.reserved_ip); [ -z \"$proxy_reserved_ip\" ] && {\n\tuci add_list nikki.proxy.reserved_ip=0.0.0.0/8\n\tuci add_list nikki.proxy.reserved_ip=10.0.0.0/8\n\tuci add_list nikki.proxy.reserved_ip=127.0.0.0/8\n\tuci add_list nikki.proxy.reserved_ip=100.64.0.0/10\n\tuci add_list nikki.proxy.reserved_ip=169.254.0.0/16\n\tuci add_list nikki.proxy.reserved_ip=172.16.0.0/12\n\tuci add_list nikki.proxy.reserved_ip=192.168.0.0/16\n\tuci add_list nikki.proxy.reserved_ip=224.0.0.0/4\n\tuci add_list nikki.proxy.reserved_ip=240.0.0.0/4\n}\n\nproxy_reserved_ip6=$(uci -q get nikki.proxy.reserved_ip6); [ -z \"$proxy_reserved_ip6\" ] && {\n\tuci add_list nikki.proxy.reserved_ip6=::/128\n\tuci add_list nikki.proxy.reserved_ip6=::1/128\n\tuci add_list nikki.proxy.reserved_ip6=::ffff:0:0/96\n\tuci add_list nikki.proxy.reserved_ip6=100::/64\n\tuci add_list nikki.proxy.reserved_ip6=64:ff9b::/96\n\tuci add_list nikki.proxy.reserved_ip6=2001::/32\n\tuci add_list nikki.proxy.reserved_ip6=2001:10::/28\n\tuci add_list nikki.proxy.reserved_ip6=2001:20::/28\n\tuci add_list nikki.proxy.reserved_ip6=2001:db8::/32\n\tuci add_list nikki.proxy.reserved_ip6=2002::/16\n\tuci add_list nikki.proxy.reserved_ip6=fc00::/7\n\tuci add_list nikki.proxy.reserved_ip6=fe80::/10\n\tuci add_list nikki.proxy.reserved_ip6=ff00::/8\n}\n\n# since v1.24.3\n\nproxy_bypass_china_mainland_ip=$(uci -q get nikki.proxy.bypass_china_mainland_ip)\nproxy_bypass_china_mainland_ip6=$(uci -q get nikki.proxy.bypass_china_mainland_ip6)\n[ -z \"$proxy_bypass_china_mainland_ip6\" ] && uci set nikki.proxy.bypass_china_mainland_ip6=$proxy_bypass_china_mainland_ip\n\nrouting_tproxy_fw_mask=$(uci -q get nikki.routing.tproxy_fw_mask); [ -z \"$routing_tproxy_fw_mask\" ] && uci set nikki.routing.tproxy_fw_mask=0xFF\nrouting_tun_fw_mask=$(uci -q get nikki.routing.tun_fw_mask); [ -z \"$routing_tun_fw_mask\" ] && uci set nikki.routing.tun_fw_mask=0xFF\n\nsection_procd=$(uci -q get nikki.procd); [ -z \"$section_procd\" ] && {\n\tuci set nikki.procd=procd\n\tuci set nikki.procd.fast_reload=$(uci -q get nikki.config.fast_reload)\n\tuci set nikki.procd.env_safe_paths=$(uci -q get nikki.env.safe_paths)\n\tuci set nikki.procd.env_disable_loopback_detector=$(uci -q get nikki.env.disable_loopback_detector)\n\tuci set nikki.procd.env_disable_quic_go_gso=$(uci -q get nikki.env.disable_quic_go_gso)\n\tuci set nikki.procd.env_disable_quic_go_ecn=$(uci -q get nikki.env.disable_quic_go_ecn)\n\tuci set nikki.procd.env_skip_system_ipv6_check=$(uci -q get nikki.env.skip_system_ipv6_check)\n\tuci del nikki.config.fast_reload\n\tuci del nikki.env\n}\n\n# since v1.25.1\n\nrouting_dummy_device=$(uci -q get nikki.routing.dummy_device); [ -z \"$routing_dummy_device\" ] && uci set nikki.routing.dummy_device=nikki-dummy\n\n# since v1.25.2\n\nsection_core=$(uci -q get nikki.core); [ -z \"$section_core\" ] && {\n\tuci set nikki.core=core\n\tuci set nikki.core.redirect_listener_name=redir-in\n\tuci set nikki.core.tproxy_listener_name=tproxy-in\n\tuci set nikki.core.tun_listener_name=tun-in\n}\n\n# since v1.25.3\n\nconfig_scheduled_restart_cron=$(uci -q get nikki.config.scheduled_restart_cron); [ -z \"$config_scheduled_restart_cron\" ] && uci rename nikki.config.cron_expression=\"scheduled_restart_cron\"\n\nlog_scheduled_clear=$(uci -q get nikki.log.scheduled_clear); [ -z \"$log_scheduled_clear\" ] && uci set nikki.log.scheduled_clear=1\nlog_scheduled_clear_cron=$(uci -q get nikki.log.scheduled_clear_cron); [ -z \"$log_scheduled_clear_cron\" ] && uci set nikki.log.scheduled_clear_cron=\"*/5 * * * *\"\nlog_scheduled_clear_size_limit=$(uci -q get nikki.log.scheduled_clear_size_limit); [ -z \"$log_scheduled_clear_size_limit\" ] && uci set nikki.log.scheduled_clear_size_limit=1\nlog_scheduled_clear_size_limit_unit=$(uci -q get nikki.log.scheduled_clear_size_limit_unit); [ -z \"$log_scheduled_clear_size_limit_unit\" ] && uci set nikki.log.scheduled_clear_size_limit_unit=MB\n\n# commit\nuci commit nikki\n\n# exit with 0\nexit 0\n"
  },
  {
    "path": "luci-app-nikki/nikki/files/ucode/hijack.ut",
    "content": "#!/usr/bin/utpl\n\n{%-\n\t'use strict';\n\n\timport { cursor } from 'uci';\n\timport { connect } from 'ubus';\n\timport { uci_bool, uci_array, get_cgroups_version, get_users, get_groups, get_cgroups, load_profile } from '/etc/nikki/ucode/include.uc';\n\n\tconst fw4 = require('fw4');\n\n\tconst cgroups_version = get_cgroups_version();\n\n\tconst users = get_users();\n\tconst groups = get_groups();\n\tconst cgroups = get_cgroups();\n\n\tconst uci = cursor();\n\tconst ubus = connect();\n\n\tconst profile = load_profile();\n\n\tlet redir_port;\n\tlet tproxy_port;\n\tlet tun_device;\n\tlet dns_port;\n\tlet fake_ip_range;\n\tlet fake_ip6_range;\n\n\tconst redirect_listener_name = uci.get('nikki', 'core', 'redirect_listener_name');\n\tconst tproxy_listener_name = uci.get('nikki', 'core', 'tproxy_listener_name');\n\tconst tun_listener_name = uci.get('nikki', 'core', 'tun_listener_name');\n\n\tif (profile['redir-port']) {\n\t\tredir_port = profile['redir-port']\n\t} else {\n\t\tconst profile_listeners = filter(profile['listeners'], (x) => x['name'] == redirect_listener_name && x['type'] === 'redir');\n\t\tif (length(profile_listeners) > 0) {\n\t\t\tredir_port = profile_listeners[0]['port'];\n\t\t}\n\t}\n\tif (profile['tproxy-port']) {\n\t\ttproxy_port = profile['tproxy-port']\n\t} else {\n\t\tconst profile_listeners = filter(profile['listeners'], (x) => x['name'] == tproxy_listener_name && x['type'] === 'tproxy');\n\t\tif (length(profile_listeners) > 0) {\n\t\t\ttproxy_port = profile_listeners[0]['port'];\n\t\t}\n\t}\n\tif (profile['tun'] && profile['tun']['enable'] && profile['tun']['device']) {\n\t\ttun_device = profile['tun']['device'];\n\t} else {\n\t\tconst profile_listeners = filter(profile['listeners'], (x) => x['name'] == tun_listener_name && x['type'] === 'tun');\n\t\tif (length(profile_listeners) > 0) {\n\t\t\ttun_device = profile_listeners[0]['device'];\n\t\t}\n\t}\n\n\tif (profile['dns']) {\n\t\tconst dns_listen = profile['dns']['listen'];\n\t\tconst dns_listen_rindex = rindex(dns_listen, ':');\n\t\tif (dns_listen_rindex >= 0 && dns_listen_rindex + 1 < length(dns_listen)) {\n\t\t\tdns_port = substr(dns_listen, dns_listen_rindex + 1);\n\t\t}\n\t\tfake_ip_range = profile['dns']['fake-ip-range'];\n\t\tfake_ip6_range = profile['dns']['fake-ip-range6'];\n\t}\n\n\tuci.load('nikki');\n\n\tconst tcp_mode = uci.get('nikki', 'proxy', 'tcp_mode');\n\tconst udp_mode = uci.get('nikki', 'proxy', 'udp_mode');\n\tconst ipv4_dns_hijack = uci_bool(uci.get('nikki', 'proxy', 'ipv4_dns_hijack'));\n\tconst ipv6_dns_hijack = uci_bool(uci.get('nikki', 'proxy', 'ipv6_dns_hijack'));\n\tconst ipv4_proxy = uci_bool(uci.get('nikki', 'proxy', 'ipv4_proxy'));\n\tconst ipv6_proxy = uci_bool(uci.get('nikki', 'proxy', 'ipv6_proxy'));\n\tconst fake_ip_ping_hijack = uci_bool(uci.get('nikki', 'proxy', 'fake_ip_ping_hijack'));\n\n\tconst router_proxy = uci_bool(uci.get('nikki', 'proxy', 'router_proxy'));\n\tconst router_access_control = [];\n\tuci.foreach('nikki', 'router_access_control', (access_control) => {\n\t\taccess_control['enabled'] = uci_bool(access_control['enabled']);\n\t\taccess_control['user'] = filter(uci_array(access_control['user']), (x) => index(users, x) >= 0);\n\t\taccess_control['group'] = filter(uci_array(access_control['group']), (x) => index(groups, x) >= 0);\n\t\taccess_control['cgroup'] = filter(uci_array(access_control['cgroup']), (x) => index(cgroups, x) >= 0);\n\t\taccess_control['proxy'] = uci_bool(access_control['proxy']);\n\t\taccess_control['dns'] = uci_bool(access_control['dns']);\n\t\tif (access_control['enabled']) {\n\t\t\tpush(router_access_control, access_control);\n\t\t}\n\t});\n\n\tconst lan_proxy = uci_bool(uci.get('nikki', 'proxy', 'lan_proxy'));\n\tconst lan_inbound_interface = uci_array(uci.get('nikki', 'proxy', 'lan_inbound_interface'));\n\tconst lan_inbound_device = [];\n\tfor (let interface in lan_inbound_interface) {\n\t\tconst status = ubus.call('network.interface', 'status', { 'interface': interface });\n\t\tconst device = status?.l3_device ?? status?.device ?? '';\n\t\tif (device != '') {\n\t\t\tpush(lan_inbound_device, device);\n\t\t}\n\t}\n\tconst lan_access_control = [];\n\tuci.foreach('nikki', 'lan_access_control', (access_control) => {\n\t\taccess_control['enabled'] = uci_bool(access_control['enabled']);\n\t\taccess_control['ip'] = uci_array(access_control['ip']);\n\t\taccess_control['ip6'] = uci_array(access_control['ip6']);\n\t\taccess_control['mac'] = uci_array(access_control['mac']);\n\t\taccess_control['proxy'] = uci_bool(access_control['proxy']);\n\t\taccess_control['dns'] = uci_bool(access_control['dns']);\n\t\tif (access_control['enabled']) {\n\t\t\tpush(lan_access_control, access_control);\n\t\t}\n\t});\n\n\tconst reserved_ip = uci_array(uci.get('nikki', 'proxy', 'reserved_ip'));\n\tconst reserved_ip6 = uci_array(uci.get('nikki', 'proxy', 'reserved_ip6'));\n\tconst bypass_dscp = uci_array(uci.get('nikki', 'proxy', 'bypass_dscp'));\n\tconst bypass_fwmark = [];\n\tfor (let fwmark in uci_array(uci.get('nikki', 'proxy', 'bypass_fwmark'))) {\n\t\tlet mark;\n\t\tlet mask = '0xFFFFFFFF';\n\t\tif (index(fwmark, '/') >= 0) {\n\t\t\tconst parts = split(fwmark, '/');\n\t\t\tmark = parts[0];\n\t\t\tmask = parts[1];\n\t\t} else {\n\t\t\tmark = fwmark;\n\t\t}\n\t\tpush(bypass_fwmark, { mark: mark, mask: mask });\n\t}\n\tconst bypass_china_mainland_ip = uci_bool(uci.get('nikki', 'proxy', 'bypass_china_mainland_ip'));\n\tconst bypass_china_mainland_ip6 = uci_bool(uci.get('nikki', 'proxy', 'bypass_china_mainland_ip6'));\n\tconst proxy_tcp_dport = split((uci.get('nikki', 'proxy', 'proxy_tcp_dport') ?? '0-65535'), ' ');\n\tconst proxy_udp_dport = split((uci.get('nikki', 'proxy', 'proxy_udp_dport') ?? '0-65535'), ' ');\n\n\tconst cgroup_id = uci.get('nikki', 'routing', 'cgroup_id') ?? '0x12061206';\n\tconst cgroup_name = uci.get('nikki', 'routing', 'cgroup_name') ?? 'nikki';\n\tconst tproxy_fw_mark = uci.get('nikki', 'routing', 'tproxy_fw_mark') ?? '0x80';\n\tconst tproxy_fw_mask = uci.get('nikki', 'routing', 'tproxy_fw_mask') ?? '0xFF';\n\tconst tproxy_fw_umask = fw4.hex(~tproxy_fw_mask & 0xFFFFFFFF);\n\tconst tun_fw_mark = uci.get('nikki', 'routing', 'tun_fw_mark') ?? '0x81';\n\tconst tun_fw_mask = uci.get('nikki', 'routing', 'tun_fw_mask') ?? '0xFF';\n\tconst tun_fw_umask = fw4.hex(~tun_fw_mask & 0xFFFFFFFF);\n\n\tconst dns_hijack_nfproto = [];\n\tif (ipv4_dns_hijack) {\n\t\tpush(dns_hijack_nfproto, 'ipv4');\n\t}\n\tif (ipv6_dns_hijack) {\n\t\tpush(dns_hijack_nfproto, 'ipv6');\n\t}\n\n\tconst proxy_nfproto = [];\n\tif (ipv4_proxy) {\n\t\tpush(proxy_nfproto, 'ipv4');\n\t}\n\tif (ipv6_proxy) {\n\t\tpush(proxy_nfproto, 'ipv6');\n\t}\n\n\tconst proxy_dport = [];\n\tfor (let port in proxy_tcp_dport) {\n\t\tpush(proxy_dport, `tcp . ${port}`);\n\t}\n\tfor (let port in proxy_udp_dport) {\n\t\tpush(proxy_dport, `udp . ${port}`);\n\t}\n-%}\n\ntable inet nikki {\n\tset dns_hijack_nfproto {\n\t\ttype nf_proto\n\t\tflags interval\n\t\t{% if (length(dns_hijack_nfproto) > 0): %}\n\t\telements = {\n\t\t\t{{ join(', ', dns_hijack_nfproto) }}\n\t\t}\n\t\t{% endif %}\n\t}\n\n\tset proxy_nfproto {\n\t\ttype nf_proto\n\t\tflags interval\n\t\t{% if (length(proxy_nfproto) > 0): %}\n\t\telements = {\n\t\t\t{{ join(', ', proxy_nfproto) }}\n\t\t}\n\t\t{% endif %}\n\t}\n\n\tset reserved_ip {\n\t\ttype ipv4_addr\n\t\tflags interval\n\t\tauto-merge\n\t\t{% if (length(reserved_ip) > 0): %}\n\t\telements = {\n\t\t\t{{ join(', ', reserved_ip) }}\n\t\t}\n\t\t{% endif %}\n\t}\n\n\tset reserved_ip6 {\n\t\ttype ipv6_addr\n\t\tflags interval\n\t\tauto-merge\n\t\t{% if (length(reserved_ip6) > 0): %}\n\t\telements = {\n\t\t\t{{ join(', ', reserved_ip6) }}\n\t\t}\n\t\t{% endif %}\n\t}\n\n\tset lan_inbound_device {\n\t\ttype ifname\n\t\tflags interval\n\t\tauto-merge\n\t\t{% if (length(lan_inbound_device) > 0): %}\n\t\telements = {\n\t\t\t{{ join(', ', map(lan_inbound_device, (x) => `\"${x}\"`)) }}\n\t\t}\n\t\t{% endif %}\n\t}\n\n\tset china_ip {\n\t\ttype ipv4_addr\n\t\tflags interval\n\t}\n\n\tset china_ip6 {\n\t\ttype ipv6_addr\n\t\tflags interval\n\t}\n\n\tset proxy_dport {\n\t\ttype inet_proto . inet_service\n\t\tflags interval\n\t\tauto-merge\n\t\t{% if (length(proxy_dport) > 0): %}\n\t\telements = {\n\t\t\t{{ join(', ', proxy_dport) }}\n\t\t}\n\t\t{% endif %}\n\t}\n\n\tset bypass_dscp {\n\t\ttype dscp\n\t\tflags interval\n\t\tauto-merge\n\t\t{% if (length(bypass_dscp) > 0): %}\n\t\telements = {\n\t\t\t{{ join(', ', bypass_dscp) }}\n\t\t}\n\t\t{% endif %}\n\t}\n\n\t{% if (router_proxy): %}\n\tchain router_dns_hijack {\n\t\t{% for (let access_control in router_access_control): %}\n\t\t{% if (length(access_control['user']) == 0 && length(access_control['group']) == 0 && length(access_control['cgroup']) == 0): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } th dport 53 counter {% if (access_control['dns']): %} redirect to :{{ dns_port }} {% else %} return {% endif %} #\n\t\t{% else %}\n\t\t{% if (length(access_control['user']) > 0): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } meta skuid { {{ join(', ', access_control['user']) }} } th dport 53 counter {% if (access_control['dns']): %} redirect to :{{ dns_port }} {% else %} return {% endif %} #\n\t\t{% endif %}\n\t\t{% if (length(access_control['group']) > 0): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } meta skgid { {{ join(', ', access_control['group']) }} } th dport 53 counter {% if (access_control['dns']): %} redirect to :{{ dns_port }} {% else %} return {% endif %} #\n\t\t{% endif %}\n\t\t{% if (cgroups_version == 2 && length(access_control['cgroup']) > 0): %}\n\t\t{% for (let cgroup in access_control['cgroup']): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } socket cgroupv2 level {{ length(split(cgroup, '/')) }} \"{{ cgroup }}\" th dport 53 counter {% if (access_control['dns']): %} redirect to :{{ dns_port }} {% else %} return {% endif %} #\n\t\t{% endfor %}\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% endfor %}\n\t}\n\n\t{% if (tcp_mode == 'redirect'): %}\n\tchain router_redirect {\n\t\t{% for (let access_control in router_access_control): %}\n\t\t{% if (length(access_control['user']) == 0 && length(access_control['group']) == 0 && length(access_control['cgroup']) == 0): %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto tcp counter {% if (access_control['proxy']): %} redirect to :{{ redir_port }} {% else %} return {% endif %} #\n\t\t{% else %}\n\t\t{% if (length(access_control['user']) > 0): %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto tcp meta skuid { {{ join(', ', access_control['user']) }} } counter {% if (access_control['proxy']): %} redirect to :{{ redir_port }} {% else %} return {% endif %} #\n\t\t{% endif %}\n\t\t{% if (length(access_control['group']) > 0): %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto tcp meta skgid { {{ join(', ', access_control['group']) }} } counter {% if (access_control['proxy']): %} redirect to :{{ redir_port }} {% else %} return {% endif %} #\n\t\t{% endif %}\n\t\t{% if (cgroups_version == 2 && length(access_control['cgroup']) > 0): %}\n\t\t{% for (let cgroup in access_control['cgroup']): %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto tcp socket cgroupv2 level {{ length(split(cgroup, '/')) }} \"{{ cgroup }}\" counter {% if (access_control['proxy']): %} redirect to :{{ redir_port }} {% else %} return {% endif %} #\n\t\t{% endfor %}\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% endfor %}\n\t}\n\t{% endif %}\n\n\t{% if (tcp_mode == 'tproxy' || udp_mode == 'tproxy'): %}\n\tchain router_tproxy {\n\t\t{% for (let access_control in router_access_control): %}\n\t\t{% if (length(access_control['user']) == 0 && length(access_control['group']) == 0 && length(access_control['cgroup']) == 0): %}\n\t\t{% if (access_control['dns']): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } th dport 53 counter return #\n\t\t{% endif %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto { tcp, udp } {% if (access_control['proxy']): %} meta mark set meta mark & {{ tproxy_fw_umask }} | {{ tproxy_fw_mark }} counter accept {% else %} counter return {% endif %} #\n\t\t{% else %}\n\t\t{% if (length(access_control['user']) > 0): %}\n\t\t{% if (access_control['dns']): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } meta skuid { {{ join(', ', access_control['user']) }} } th dport 53 counter return #\n\t\t{% endif %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto { tcp, udp } meta skuid { {{ join(', ', access_control['user']) }} } {% if (access_control['proxy']): %} meta mark set meta mark & {{ tproxy_fw_umask }} | {{ tproxy_fw_mark }} counter accept {% else %} counter return {% endif %} #\n\t\t{% endif %}\n\t\t{% if (length(access_control['group']) > 0): %}\n\t\t{% if (access_control['dns']): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } meta skgid { {{ join(', ', access_control['group']) }} } th dport 53 counter return #\n\t\t{% endif %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto { tcp, udp } meta skgid { {{ join(', ', access_control['group']) }} } {% if (access_control['proxy']): %} meta mark set meta mark & {{ tproxy_fw_umask }} | {{ tproxy_fw_mark }} counter accept {% else %} counter return {% endif %} #\n\t\t{% endif %}\n\t\t{% if (cgroups_version == 2 && length(access_control['cgroup']) > 0): %}\n\t\t{% for (let cgroup in access_control['cgroup']): %}\n\t\t{% if (access_control['dns']): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } socket cgroupv2 level {{ length(split(cgroup, '/')) }} \"{{ cgroup }}\" th dport 53 counter return #\n\t\t{% endif %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto { tcp, udp } socket cgroupv2 level {{ length(split(cgroup, '/')) }} \"{{ cgroup }}\" {% if (access_control['proxy']): %} meta mark set meta mark & {{ tproxy_fw_umask }} | {{ tproxy_fw_mark }} counter accept {% else %} counter return {% endif %} #\n\t\t{% endfor %}\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% endfor %}\n\t}\n\t{% endif %}\n\n\t{% if (tcp_mode == 'tun' || udp_mode == 'tun'): %}\n\tchain router_tun {\n\t\t{% for (let access_control in router_access_control): %}\n\t\t{% if (length(access_control['user']) == 0 && length(access_control['group']) == 0 && length(access_control['cgroup']) == 0): %}\n\t\t{% if (access_control['dns']): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } th dport 53 counter return #\n\t\t{% endif %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto { tcp, udp } {% if (access_control['proxy']): %} meta mark set meta mark & {{ tun_fw_umask }} | {{ tun_fw_mark }} counter accept {% else %} counter return {% endif %} #\n\t\t{% else %}\n\t\t{% if (length(access_control['user']) > 0): %}\n\t\t{% if (access_control['dns']): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } meta skuid { {{ join(', ', access_control['user']) }} } th dport 53 counter return #\n\t\t{% endif %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto { tcp, udp } meta skuid { {{ join(', ', access_control['user']) }} } {% if (access_control['proxy']): %} meta mark set meta mark & {{ tun_fw_umask }} | {{ tun_fw_mark }} counter accept {% else %} counter return {% endif %} #\n\t\t{% endif %}\n\t\t{% if (length(access_control['group']) > 0): %}\n\t\t{% if (access_control['dns']): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } meta skgid { {{ join(', ', access_control['group']) }} } th dport 53 counter return #\n\t\t{% endif %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto { tcp, udp } meta skgid { {{ join(', ', access_control['group']) }} } {% if (access_control['proxy']): %} meta mark set meta mark & {{ tun_fw_umask }} | {{ tun_fw_mark }} counter accept {% else %} counter return {% endif %} #\n\t\t{% endif %}\n\t\t{% if (cgroups_version == 2 && length(access_control['cgroup']) > 0): %}\n\t\t{% for (let cgroup in access_control['cgroup']): %}\n\t\t{% if (access_control['dns']): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } socket cgroupv2 level {{ length(split(cgroup, '/')) }} \"{{ cgroup }}\" th dport 53 counter return #\n\t\t{% endif %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto { tcp, udp } socket cgroupv2 level {{ length(split(cgroup, '/')) }} \"{{ cgroup }}\" {% if (access_control['proxy']): %} meta mark set meta mark & {{ tun_fw_umask }} | {{ tun_fw_mark }} counter accept {% else %} counter return {% endif %} #\n\t\t{% endfor %}\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% endfor %}\n\t}\n\t{% endif %}\n\t{% endif %}\n\n\t{% if (lan_proxy): %}\n\tchain lan_dns_hijack {\n\t\t{% for (let access_control in lan_access_control): %}\n\t\t{% if (length(access_control['ip']) == 0 && length(access_control['ip6']) == 0 && length(access_control['mac']) == 0): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } th dport 53 counter {% if (access_control['dns']): %} redirect to :{{ dns_port }} {% else %} return {% endif %} #\n\t\t{% else %}\n\t\t{% if (length(access_control['ip']) > 0): %}\n\t\t{% if (ipv4_dns_hijack): %}\n\t\tmeta l4proto { tcp, udp } ip saddr { {{ join(', ', access_control['ip']) }} } th dport 53 counter {% if (access_control['dns']): %} redirect to :{{ dns_port }} {% else %} return {% endif %} #\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% if (length(access_control['ip6']) > 0): %}\n\t\t{% if (ipv6_dns_hijack): %}\n\t\tmeta l4proto { tcp, udp } ip6 saddr { {{ join(', ', access_control['ip6']) }} } th dport 53 counter {% if (access_control['dns']): %} redirect to :{{ dns_port }} {% else %} return {% endif %} #\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% if (length(access_control['mac']) > 0): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } ether saddr { {{ join(', ', access_control['mac']) }} } th dport 53 counter {% if (access_control['dns']): %} redirect to :{{ dns_port }} {% else %} return {% endif %} #\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% endfor %}\n\t}\n\n\t{% if (tcp_mode == 'redirect'): %}\n\tchain lan_redirect {\n\t\t{% for (let access_control in lan_access_control): %}\n\t\t{% if (length(access_control['ip']) == 0 && length(access_control['ip6']) == 0 && length(access_control['mac']) == 0): %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto tcp counter {% if (access_control['proxy']): %} redirect to :{{ redir_port }} {% else %} counter return {% endif %} #\n\t\t{% else %}\n\t\t{% if (length(access_control['ip']) > 0): %}\n\t\t{% if (ipv4_proxy): %}\n\t\tmeta l4proto tcp ip saddr { {{ join(', ', access_control['ip']) }} } counter {% if (access_control['proxy']): %} redirect to :{{ redir_port }} {% else %} return {% endif %} #\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% if (length(access_control['ip6']) > 0): %}\n\t\t{% if (ipv6_proxy): %}\n\t\tmeta l4proto tcp ip6 saddr { {{ join(', ', access_control['ip6']) }} } counter {% if (access_control['proxy']): %} redirect to :{{ redir_port }} {% else %} return {% endif %} #\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% if (length(access_control['mac']) > 0): %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto tcp ether saddr { {{ join(', ', access_control['mac']) }} } counter {% if (access_control['proxy']): %} redirect to :{{ redir_port }} {% else %} return {% endif %} #\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% endfor %}\n\t}\n\t{% endif %}\n\n\t{% if (tcp_mode == 'tproxy' || udp_mode == 'tproxy'): %}\n\tchain lan_tproxy {\n\t\t{% for (let access_control in lan_access_control): %}\n\t\t{% if (length(access_control['ip']) == 0 && length(access_control['ip6']) == 0 && length(access_control['mac']) == 0): %}\n\t\t{% if (access_control['dns']): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } th dport 53 counter return #\n\t\t{% endif %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto { tcp, udp } {% if (access_control['proxy']): %} meta mark set meta mark & {{ tproxy_fw_umask }} | {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %} #\n\t\t{% else %}\n\t\t{% if (length(access_control['ip']) > 0): %}\n\t\t{% if (access_control['dns']): %}\n\t\t{% if (ipv4_dns_hijack): %}\n\t\tmeta l4proto { tcp, udp } ip saddr { {{ join(', ', access_control['ip']) }} } th dport 53 counter return #\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% if (ipv4_proxy): %}\n\t\tmeta l4proto { tcp, udp } ip saddr { {{ join(', ', access_control['ip']) }} } {% if (access_control['proxy']): %} meta mark set meta mark & {{ tproxy_fw_umask }} | {{ tproxy_fw_mark }} tproxy ip to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %} #\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% if (length(access_control['ip6']) > 0): %}\n\t\t{% if (access_control['dns']): %}\n\t\t{% if (ipv6_dns_hijack): %}\n\t\tmeta l4proto { tcp, udp } ip6 saddr { {{ join(', ', access_control['ip6']) }} } th dport 53 counter return #\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% if (ipv6_proxy): %}\n\t\tmeta l4proto { tcp, udp } ip6 saddr { {{ join(', ', access_control['ip6']) }} } {% if (access_control['proxy']): %} meta mark set meta mark & {{ tproxy_fw_umask }} | {{ tproxy_fw_mark }} tproxy ip6 to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %} #\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% if (length(access_control['mac']) > 0): %}\n\t\t{% if (access_control['dns']): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } ether saddr { {{ join(', ', access_control['mac']) }} } th dport 53 counter return #\n\t\t{% endif %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto { tcp, udp } ether saddr { {{ join(', ', access_control['mac']) }} } {% if (access_control['proxy']): %} meta mark set meta mark & {{ tproxy_fw_umask }} | {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept {% else %} counter return {% endif %} #\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% endfor %}\n\t}\n\t{% endif %}\n\n\t{% if (tcp_mode == 'tun' || udp_mode == 'tun'): %}\n\tchain lan_tun {\n\t\t{% for (let access_control in lan_access_control): %}\n\t\t{% if (length(access_control['ip']) == 0 && length(access_control['ip6']) == 0 && length(access_control['mac']) == 0): %}\n\t\t{% if (access_control['dns']): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } th dport 53 counter return #\n\t\t{% endif %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto { tcp, udp } {% if (access_control['proxy']): %} meta mark set meta mark & {{ tun_fw_umask }} | {{ tun_fw_mark }} counter accept {% else %} counter return {% endif %} #\n\t\t{% else %}\n\t\t{% if (length(access_control['ip']) > 0): %}\n\t\t{% if (access_control['dns']): %}\n\t\t{% if (ipv4_dns_hijack): %}\n\t\tmeta l4proto { tcp, udp } ip saddr { {{ join(', ', access_control['ip']) }} } th dport 53 counter return #\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% if (ipv4_proxy): %}\n\t\tmeta l4proto { tcp, udp } ip saddr { {{ join(', ', access_control['ip']) }} } {% if (access_control['proxy']): %} meta mark set meta mark & {{ tun_fw_umask }} | {{ tun_fw_mark }} counter accept {% else %} counter return {% endif %} #\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% if (length(access_control['ip6']) > 0): %}\n\t\t{% if (access_control['dns']): %}\n\t\t{% if (ipv6_dns_hijack): %}\n\t\tmeta l4proto { tcp, udp } ip6 saddr { {{ join(', ', access_control['ip6']) }} } th dport 53 counter return #\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% if (ipv6_proxy): %}\n\t\tmeta l4proto { tcp, udp } ip6 saddr { {{ join(', ', access_control['ip6']) }} } {% if (access_control['proxy']): %} meta mark set meta mark & {{ tun_fw_umask }} | {{ tun_fw_mark }} counter accept {% else %} counter return {% endif %} #\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% if (length(access_control['mac']) > 0): %}\n\t\t{% if (access_control['dns']): %}\n\t\tmeta nfproto @dns_hijack_nfproto meta l4proto { tcp, udp } ether saddr { {{ join(', ', access_control['mac']) }} } th dport 53 counter return #\n\t\t{% endif %}\n\t\tmeta nfproto @proxy_nfproto meta l4proto { tcp, udp } ether saddr { {{ join(', ', access_control['mac']) }} } {% if (access_control['proxy']): %} meta mark set meta mark & {{ tun_fw_umask }} | {{ tun_fw_mark }} counter accept {% else %} counter return {% endif %} #\n\t\t{% endif %}\n\t\t{% endif %}\n\t\t{% endfor %}\n\t}\n\t{% endif %}\n\t{% endif %}\n\n\t{% if (router_proxy): %}\n\tchain nat_output {\n\t\ttype nat hook output priority filter; policy accept;\n\t\t{% if (cgroups_version == 1): %}\n\t\tmeta cgroup {{ cgroup_id }} counter return\n\t\t{% elif (cgroups_version == 2): %}\n\t\tsocket cgroupv2 level 2 \"services/{{ cgroup_name }}\" counter return\n\t\t{% endif %}\n\t\tjump router_dns_hijack\n\t\t{% if (tcp_mode == 'redirect'): %}\n\t\tfib daddr type { local, broadcast, anycast, multicast } counter return\n\t\tct direction reply counter return\n\t\tip daddr @reserved_ip {% if (fake_ip_range): %} ip daddr != {{ fake_ip_range }} {% endif %} counter return\n\t\tip6 daddr @reserved_ip6 {% if (fake_ip6_range): %} ip6 daddr != {{ fake_ip6_range }} {% endif %} counter return\n\t\tip daddr @china_ip counter return\n\t\tip6 daddr @china_ip6 counter return\n\t\tmeta nfproto ipv4 meta l4proto . th dport != @proxy_dport {% if (fake_ip_range): %} ip daddr != {{ fake_ip_range }} {% endif %} counter return\n\t\tmeta nfproto ipv6 meta l4proto . th dport != @proxy_dport {% if (fake_ip6_range): %} ip6 daddr != {{ fake_ip6_range }} {% endif %} counter return\n\t\tmeta l4proto { tcp, udp } ip dscp @bypass_dscp {% if (fake_ip_range): %} ip daddr != {{ fake_ip_range }} {% endif %} counter return\n\t\tmeta l4proto { tcp, udp } ip6 dscp @bypass_dscp {% if (fake_ip6_range): %} ip6 daddr != {{ fake_ip6_range }} {% endif %} counter return\n\t\t{% for (let fwmark in bypass_fwmark): %}\n\t\tmeta mark & {{ fwmark.mask }} == {{ fwmark.mark }} counter return\n\t\t{% endfor %}\n\t\tjump router_redirect\n\t\t{% endif %}\n\t\t{% if (fake_ip_ping_hijack): %}\n\t\t{% if (fake_ip_range): %}\n\t\ticmp type echo-request ip daddr {{ fake_ip_range }} counter redirect\n\t\t{% endif %}\n\t\t{% if (fake_ip6_range): %}\n\t\ticmpv6 type echo-request ip6 daddr {{ fake_ip6_range }} counter redirect\n\t\t{% endif %}\n\t\t{% endif %}\n\t}\n\n\tchain mangle_output {\n\t\ttype route hook output priority mangle; policy accept;\n\t\t{% if (cgroups_version == 1): %}\n\t\tmeta cgroup {{ cgroup_id }} counter return\n\t\t{% elif (cgroups_version == 2): %}\n\t\tsocket cgroupv2 level 2 \"services/{{ cgroup_name }}\" counter return\n\t\t{% endif %}\n\t\tfib daddr type { local, broadcast, anycast, multicast } counter return\n\t\tct direction reply counter return\n\t\tip daddr @reserved_ip {% if (fake_ip_range): %} ip daddr != {{ fake_ip_range }} {% endif %} counter return\n\t\tip6 daddr @reserved_ip6 {% if (fake_ip6_range): %} ip6 daddr != {{ fake_ip6_range }} {% endif %} counter return\n\t\tip daddr @china_ip counter return\n\t\tip6 daddr @china_ip6 counter return\n\t\tmeta nfproto ipv4 meta l4proto . th dport != @proxy_dport {% if (fake_ip_range): %} ip daddr != {{ fake_ip_range }} {% endif %} counter return\n\t\tmeta nfproto ipv6 meta l4proto . th dport != @proxy_dport {% if (fake_ip6_range): %} ip6 daddr != {{ fake_ip6_range }} {% endif %} counter return\n\t\tmeta l4proto { tcp, udp } ip dscp @bypass_dscp {% if (fake_ip_range): %} ip daddr != {{ fake_ip_range }} {% endif %} counter return\n\t\tmeta l4proto { tcp, udp } ip6 dscp @bypass_dscp {% if (fake_ip6_range): %} ip6 daddr != {{ fake_ip6_range }} {% endif %} counter return\n\t\t{% for (let fwmark in bypass_fwmark): %}\n\t\tmeta mark & {{ fwmark.mask }} == {{ fwmark.mark }} counter return\n\t\t{% endfor %}\n\t\tmeta l4proto vmap { tcp: {% if (tcp_mode == 'tproxy'): %} jump router_tproxy {% elif (tcp_mode == 'tun'): %} jump router_tun {% else %} continue {% endif %}, udp: {% if (udp_mode == 'tproxy'): %} jump router_tproxy {% elif (udp_mode == 'tun'): %} jump router_tun {% else %} continue {% endif %} }\n\t}\n\n\tchain mangle_prerouting_router {\n\t\ttype filter hook prerouting priority mangle - 1; policy accept;\n\t\t{% if (tcp_mode == 'tproxy' || udp_mode == 'tproxy'): %}\n\t\tiifname lo meta l4proto { tcp, udp } meta mark & {{ tproxy_fw_mask }} == {{ tproxy_fw_mark }} tproxy to :{{ tproxy_port }} counter accept\n\t\t{% endif %}\n\t\t{% if (tcp_mode == 'tun' || udp_mode == 'tun'): %}\n\t\tiifname \"{{ tun_device }}\" meta l4proto { icmp, tcp, udp } counter accept\n\t\t{% endif %}\n\t}\n\t{% endif %}\n\n\t{% if (lan_proxy): %}\n\tchain dstnat {\n\t\ttype nat hook prerouting priority dstnat + 1; policy accept;\n\t\tiifname @lan_inbound_device jump lan_dns_hijack\n\t\t{% if (tcp_mode == 'redirect'): %}\n\t\tfib daddr type { local, broadcast, anycast, multicast } counter return\n\t\tct direction reply counter return\n\t\tip daddr @reserved_ip {% if (fake_ip_range): %} ip daddr != {{ fake_ip_range }} {% endif %} counter return\n\t\tip6 daddr @reserved_ip6 {% if (fake_ip6_range): %} ip6 daddr != {{ fake_ip6_range }} {% endif %} counter return\n\t\tip daddr @china_ip counter return\n\t\tip6 daddr @china_ip6 counter return\n\t\tmeta nfproto ipv4 meta l4proto . th dport != @proxy_dport {% if (fake_ip_range): %} ip daddr != {{ fake_ip_range }} {% endif %} counter return\n\t\tmeta nfproto ipv6 meta l4proto . th dport != @proxy_dport {% if (fake_ip6_range): %} ip6 daddr != {{ fake_ip6_range }} {% endif %} counter return\n\t\tmeta l4proto { tcp, udp } ip dscp @bypass_dscp {% if (fake_ip_range): %} ip daddr != {{ fake_ip_range }} {% endif %} counter return\n\t\tmeta l4proto { tcp, udp } ip6 dscp @bypass_dscp {% if (fake_ip6_range): %} ip6 daddr != {{ fake_ip6_range }} {% endif %} counter return\n\t\t{% for (let fwmark in bypass_fwmark): %}\n\t\tmeta mark & {{ fwmark.mask }} == {{ fwmark.mark }} counter return\n\t\t{% endfor %}\n\t\tiifname @lan_inbound_device jump lan_redirect\n\t\t{% endif %}\n\t\t{% if (fake_ip_ping_hijack): %}\n\t\t{% if (fake_ip_range): %}\n\t\ticmp type echo-request ip daddr {{ fake_ip_range }} counter redirect\n\t\t{% endif %}\n\t\t{% if (fake_ip6_range): %}\n\t\ticmpv6 type echo-request ip6 daddr {{ fake_ip6_range }} counter redirect\n\t\t{% endif %}\n\t\t{% endif %}\n\t}\n\n\tchain mangle_prerouting_lan {\n\t\ttype filter hook prerouting priority mangle; policy accept;\n\t\tfib daddr type { local, broadcast, anycast, multicast } counter return\n\t\tct direction reply counter return\n\t\tip daddr @reserved_ip {% if (fake_ip_range): %} ip daddr != {{ fake_ip_range }} {% endif %} counter return\n\t\tip6 daddr @reserved_ip6 {% if (fake_ip6_range): %} ip6 daddr != {{ fake_ip6_range }} {% endif %} counter return\n\t\tip daddr @china_ip counter return\n\t\tip6 daddr @china_ip6 counter return\n\t\tmeta nfproto ipv4 meta l4proto . th dport != @proxy_dport {% if (fake_ip_range): %} ip daddr != {{ fake_ip_range }} {% endif %} counter return\n\t\tmeta nfproto ipv6 meta l4proto . th dport != @proxy_dport {% if (fake_ip6_range): %} ip6 daddr != {{ fake_ip6_range }} {% endif %} counter return\n\t\tmeta l4proto { tcp, udp } ip dscp @bypass_dscp {% if (fake_ip_range): %} ip daddr != {{ fake_ip_range }} {% endif %} counter return\n\t\tmeta l4proto { tcp, udp } ip6 dscp @bypass_dscp {% if (fake_ip6_range): %} ip6 daddr != {{ fake_ip6_range }} {% endif %} counter return\n\t\t{% for (let fwmark in bypass_fwmark): %}\n\t\tmeta mark & {{ fwmark.mask }} == {{ fwmark.mark }} counter return\n\t\t{% endfor %}\n\t\tiifname @lan_inbound_device meta l4proto vmap { tcp: {% if (tcp_mode == 'tproxy'): %} jump lan_tproxy {% elif (tcp_mode == 'tun'): %} jump lan_tun {% else %} continue {% endif %}, udp: {% if (udp_mode == 'tproxy'): %} jump lan_tproxy {% elif (udp_mode == 'tun'): %} jump lan_tun {% else %} continue {% endif %} }\n\t}\n\t{% endif %}\n}\n\n{% if (bypass_china_mainland_ip): %}\ninclude \"/etc/nikki/nftables/geoip_cn.nft\"\n{% endif %}\n{% if (bypass_china_mainland_ip6): %}\ninclude \"/etc/nikki/nftables/geoip6_cn.nft\"\n{% endif %}"
  },
  {
    "path": "luci-app-nikki/nikki/files/ucode/include.uc",
    "content": "import { readfile, popen } from 'fs';\n\nexport function uci_bool(obj) {\n\treturn obj == null ? null : obj == '1';\n};\n\nexport function uci_int(obj) {\n\treturn obj == null ? null : int(obj);\n};\n\nexport function uci_array(obj) {\n\tif (obj == null) {\n\t\treturn [];\n\t}\n\tif (type(obj) == 'array') {\n\t\treturn uniq(obj);\n\t}\n\treturn [obj];\n};\n\nexport function trim_all(obj) {\n\tif (obj == null) {\n\t\treturn null;\n\t}\n\tif (type(obj) == 'string') {\n\t\tif (length(obj) == 0) {\n\t\t\treturn null;\n\t\t}\n\t\treturn obj;\n\t}\n\tif (type(obj) == 'array') {\n\t\tif (length(obj) == 0) {\n\t\t\treturn null;\n\t\t}\n\t\treturn obj;\n\t}\n\tif (type(obj) == 'object') {\n\t\tconst obj_keys = keys(obj);\n\t\tfor (let key in obj_keys) {\n\t\t\tobj[key] = trim_all(obj[key]);\n\t\t\tif (obj[key] == null) {\n\t\t\t\tdelete obj[key];\n\t\t\t}\n\t\t}\n\t\tif (length(keys(obj)) == 0) {\n\t\t\treturn null;\n\t\t}\n\t\treturn obj;\n\t}\n\treturn obj;\n};\n\nexport function get_cgroups_version() {\n\treturn system('mount | grep -q -w \"^cgroup\"') == 0 ? 1 : 2;\n};\n\nexport function get_users() {\n\treturn map(split(readfile('/etc/passwd'), '\\n'), (x) => split(x, ':')[0]);\n};\n\nexport function get_groups() {\n\treturn map(split(readfile('/etc/group'), '\\n'), (x) => split(x, ':')[0]);\n};\n\nexport function get_cgroups() {\n\tconst result = [];\n\tif (get_cgroups_version() == 2) {\n\t\tconst cgroup_path = '/sys/fs/cgroup/';\n\t\tconst process = popen(`find ${cgroup_path} -type d -mindepth 1`);\n\t\tif (process) {\n\t\t\tfor (let line = process.read('line'); length(line); line = process.read('line')) {\n\t\t\t\tpush(result, substr(trim(line), length(cgroup_path)));\n\t\t\t}\n\t\t}\n\t}\n\treturn result;\n};\n\nexport function load_profile() {\n\tlet result = {};\n\tconst process = popen('yq -M -p yaml -o json /etc/nikki/run/config.yaml');\n\tif (process) {\n\t\tresult = json(process);\n\t\tprocess.close();\n\t}\n\treturn result;\n};"
  },
  {
    "path": "luci-app-nikki/nikki/files/ucode/mixin.uc",
    "content": "#!/usr/bin/ucode\n\n'use strict';\n\nimport { cursor } from 'uci';\nimport { connect } from 'ubus';\nimport { uci_bool, uci_int, uci_array, trim_all } from '/etc/nikki/ucode/include.uc';\n\nconst uci = cursor();\nconst ubus = connect();\n\nconst config = {};\n\nconst outbound_interface = uci.get('nikki', 'mixin', 'outbound_interface');\nconst outbound_interface_status = ubus.call('network.interface', 'status', { 'interface': outbound_interface });\nconst outbound_device = outbound_interface_status?.l3_device ?? outbound_interface_status?.device ?? '';\n\nconfig['log-level'] = uci.get('nikki', 'mixin', 'log_level');\nconfig['mode'] = uci.get('nikki', 'mixin', 'mode');\nconfig['find-process-mode'] = uci.get('nikki', 'mixin', 'match_process');\nconfig['interface-name'] = outbound_device;\nconfig['ipv6'] = uci_bool(uci.get('nikki', 'mixin', 'ipv6'));\nconfig['unified-delay'] = uci_bool(uci.get('nikki', 'mixin', 'unify_delay'));\nconfig['tcp-concurrent'] = uci_bool(uci.get('nikki', 'mixin', 'tcp_concurrent'));\nconfig['disable-keep-alive'] = uci_bool(uci.get('nikki', 'mixin', 'disable_tcp_keep_alive'));\nconfig['keep-alive-idle'] = uci_int(uci.get('nikki', 'mixin', 'tcp_keep_alive_idle'));\nconfig['keep-alive-interval'] = uci_int(uci.get('nikki', 'mixin', 'tcp_keep_alive_interval'));\n\nconfig['external-ui'] = uci.get('nikki', 'mixin', 'ui_path');\nconfig['external-ui-name'] = uci.get('nikki', 'mixin', 'ui_name');\nconfig['external-ui-url'] = uci.get('nikki', 'mixin', 'ui_url');\nconfig['external-controller'] = uci.get('nikki', 'mixin', 'api_listen');\nconfig['external-controller-tls'] = uci.get('nikki', 'mixin', 'api_tls_listen');\nconfig['tls'] = {};\nconfig['tls']['certificate'] = uci.get('nikki', 'mixin', 'api_tls_cert');\nconfig['tls']['private-key'] = uci.get('nikki', 'mixin', 'api_tls_key');\nconfig['tls']['ech-key'] = uci.get('nikki', 'mixin', 'api_tls_ech_key');\nconfig['secret'] = uci.get('nikki', 'mixin', 'api_secret');\n\nconfig['allow-lan'] = uci_bool(uci.get('nikki', 'mixin', 'allow_lan'));\nconfig['port'] = uci_int(uci.get('nikki', 'mixin', 'http_port'));\nconfig['socks-port'] = uci_int(uci.get('nikki', 'mixin', 'socks_port'));\nconfig['mixed-port'] = uci_int(uci.get('nikki', 'mixin', 'mixed_port'));\nconfig['redir-port'] = uci_int(uci.get('nikki', 'mixin', 'redir_port'));\nconfig['tproxy-port'] = uci_int(uci.get('nikki', 'mixin', 'tproxy_port'));\n\nif (uci_bool(uci.get('nikki', 'mixin', 'authentication'))) {\n\tconfig['authentication'] = [];\n\tuci.foreach('nikki', 'authentication', (section) => {\n\t\tif (!uci_bool(section.enabled)) {\n\t\t\treturn;\n\t\t}\n\t\tpush(config['authentication'], `${section.username}:${section.password}`);\n\t});\n}\n\nconfig['tun'] = {};\nconfig['tun']['enable'] = uci_bool(uci.get('nikki', 'mixin', 'tun_enabled'));\nconfig['tun']['device'] = uci.get('nikki', 'mixin', 'tun_device');\nconfig['tun']['stack'] = uci.get('nikki', 'mixin', 'tun_stack');\nconfig['tun']['mtu'] = uci_int(uci.get('nikki', 'mixin', 'tun_mtu'));\nconfig['tun']['gso'] = uci_bool(uci.get('nikki', 'mixin', 'tun_gso'));\nconfig['tun']['gso-max-size'] = uci_int(uci.get('nikki', 'mixin', 'tun_gso_max_size'));\nif (uci_bool(uci.get('nikki', 'mixin', 'tun_dns_hijack'))) {\n\tconfig['tun']['dns-hijack'] = uci_array(uci.get('nikki', 'mixin', 'tun_dns_hijacks'));\n}\n\nconfig['dns'] = {};\nconfig['dns']['enable'] = uci_bool(uci.get('nikki', 'mixin', 'dns_enabled'));\nconfig['dns']['cache-algorithm'] = uci.get('nikki', 'mixin', 'dns_cache_algorithm');\nconfig['dns']['listen'] = uci.get('nikki', 'mixin', 'dns_listen');\nconfig['dns']['ipv6'] = uci_bool(uci.get('nikki', 'mixin', 'dns_ipv6'));\nconfig['dns']['enhanced-mode'] = uci.get('nikki', 'mixin', 'dns_mode');\nconfig['dns']['fake-ip-range'] = uci.get('nikki', 'mixin', 'fake_ip_range');\nconfig['dns']['fake-ip-range6'] = uci.get('nikki', 'mixin', 'fake_ip6_range');\nconfig['dns']['fake-ip-ttl'] = uci_int(uci.get('nikki', 'mixin', 'fake_ip_ttl'));\nif (uci_bool(uci.get('nikki', 'mixin', 'fake_ip_filter'))) {\n\tconfig['dns']['fake-ip-filter'] = uci_array(uci.get('nikki', 'mixin', 'fake_ip_filters'));\n}\nconfig['dns']['fake-ip-filter-mode'] = uci.get('nikki', 'mixin', 'fake_ip_filter_mode');\n\nconfig['dns']['respect-rules'] = uci_bool(uci.get('nikki', 'mixin', 'dns_respect_rules'));\nconfig['dns']['prefer-h3'] = uci_bool(uci.get('nikki', 'mixin', 'dns_doh_prefer_http3'));\nconfig['dns']['use-system-hosts'] = uci_bool(uci.get('nikki', 'mixin', 'dns_system_hosts'));\nconfig['dns']['use-hosts'] = uci_bool(uci.get('nikki', 'mixin', 'dns_hosts'));\nif (uci_bool(uci.get('nikki', 'mixin', 'hosts'))) {\n\tconfig['hosts'] = {};\n\tuci.foreach('nikki', 'hosts', (section) => {\n\t\tif (!uci_bool(section.enabled)) {\n\t\t\treturn;\n\t\t}\n\t\tconfig['hosts'][section.domain_name] = uci_array(section.ip);\n\t});\n}\nif (uci_bool(uci.get('nikki', 'mixin', 'dns_nameserver'))) {\n\tconfig['dns']['default-nameserver'] = [];\n\tconfig['dns']['proxy-server-nameserver'] = [];\n\tconfig['dns']['direct-nameserver'] = [];\n\tconfig['dns']['nameserver'] = [];\n\tconfig['dns']['fallback'] = [];\n\tuci.foreach('nikki', 'nameserver', (section) => {\n\t\tif (!uci_bool(section.enabled)) {\n\t\t\treturn;\n\t\t}\n\t\tpush(config['dns'][section.type], ...uci_array(section.nameserver));\n\t})\n}\nif (uci_bool(uci.get('nikki', 'mixin', 'dns_proxy_server_nameserver_policy'))) {\n\tconfig['dns']['proxy-server-nameserver-policy'] = {};\n\tuci.foreach('nikki', 'proxy_server_nameserver_policy', (section) => {\n\t\tif (!uci_bool(section.enabled)) {\n\t\t\treturn;\n\t\t}\n\t\tconfig['dns']['proxy-server-nameserver-policy'][section.matcher] = uci_array(section.nameserver);\n\t});\n}\nconfig['dns']['direct-nameserver-follow-policy'] = uci_bool(uci.get('nikki', 'mixin', 'dns_direct_nameserver_follow_policy'));\nif (uci_bool(uci.get('nikki', 'mixin', 'dns_nameserver_policy'))) {\n\tconfig['dns']['nameserver-policy'] = {};\n\tuci.foreach('nikki', 'nameserver_policy', (section) => {\n\t\tif (!uci_bool(section.enabled)) {\n\t\t\treturn;\n\t\t}\n\t\tconfig['dns']['nameserver-policy'][section.matcher] = uci_array(section.nameserver);\n\t});\n}\n\nconfig['sniffer'] = {};\nconfig['sniffer']['enable'] = uci_bool(uci.get('nikki', 'mixin', 'sniffer'));\nconfig['sniffer']['force-dns-mapping'] = uci_bool(uci.get('nikki', 'mixin', 'sniffer_sniff_dns_mapping'));\nconfig['sniffer']['parse-pure-ip'] = uci_bool(uci.get('nikki', 'mixin', 'sniffer_sniff_pure_ip'));\nif (uci_bool(uci.get('nikki', 'mixin', 'sniffer_force_domain_name'))) {\n\tconfig['sniffer']['force-domain'] = uci_array(uci.get('nikki', 'mixin', 'sniffer_force_domain_names'));\n}\nif (uci_bool(uci.get('nikki', 'mixin', 'sniffer_ignore_domain_name'))) {\n\tconfig['sniffer']['skip-domain'] = uci_array(uci.get('nikki', 'mixin', 'sniffer_ignore_domain_names'));\n}\nif (uci_bool(uci.get('nikki', 'mixin', 'sniffer_sniff'))) {\n\tconfig['sniffer']['sniff'] = {};\n\tconfig['sniffer']['sniff']['HTTP'] = {};\n\tconfig['sniffer']['sniff']['TLS'] = {};\n\tconfig['sniffer']['sniff']['QUIC'] = {};\n\tuci.foreach('nikki', 'sniff', (section) => {\n\t\tif (!uci_bool(section.enabled)) {\n\t\t\treturn;\n\t\t}\n\t\tconfig['sniffer']['sniff'][section.protocol]['port'] = uci_array(section.port);\n\t\tconfig['sniffer']['sniff'][section.protocol]['override-destination'] = uci_bool(section.overwrite_destination);\n\t});\n}\n\nconfig['profile'] = {};\nconfig['profile']['store-selected'] = uci_bool(uci.get('nikki', 'mixin', 'selection_cache'));\nconfig['profile']['store-fake-ip'] = uci_bool(uci.get('nikki', 'mixin', 'fake_ip_cache'));\n\nif (uci_bool(uci.get('nikki', 'mixin', 'rule_provider'))) {\n\tconfig['rule-providers'] = {};\n\tuci.foreach('nikki', 'rule_provider', (section) => {\n\t\tif (!uci_bool(section.enabled)) {\n\t\t\treturn;\n\t\t}\n\t\tif (section.type == 'http') {\n\t\t\tconfig['rule-providers'][section.name] = {\n\t\t\t\ttype: section.type,\n\t\t\t\turl: section.url,\n\t\t\t\tproxy: section.node,\n\t\t\t\tsize_limit: section.file_size_limit,\n\t\t\t\tformat: section.file_format,\n\t\t\t\tbehavior: section.behavior,\n\t\t\t\tinterval: section.update_interval,\n\t\t\t}\n\t\t} else if (section.type == 'file') {\n\t\t\tconfig['rule-providers'][section.name] = {\n\t\t\t\ttype: section.type,\n\t\t\t\tpath: section.file_path,\n\t\t\t\tformat: section.file_format,\n\t\t\t\tbehavior: section.behavior,\n\t\t\t}\n\t\t}\n\t})\n}\nif (uci_bool(uci.get('nikki', 'mixin', 'rule'))) {\n\tconfig['nikki-rules'] = [];\n\tuci.foreach('nikki', 'rule', (section) => {\n\t\tif (!uci_bool(section.enabled)) {\n\t\t\treturn;\n\t\t}\n\t\tconst rule = [ section.type, section.matcher, section.node, uci_bool(section.no_resolve) ? 'no-resolve' : null ];\n\t\tpush(config['nikki-rules'], join(',', filter(rule, (item) => item != null && item != '')));\n\t})\n}\n\nconst geoip_format = uci.get('nikki', 'mixin', 'geoip_format');\nconfig['geodata-mode'] = geoip_format == null ? null : geoip_format == 'dat';\nconfig['geodata-loader'] = uci.get('nikki', 'mixin', 'geodata_loader');\nconfig['geox-url'] = {};\nconfig['geox-url']['geosite'] = uci.get('nikki', 'mixin', 'geosite_url');\nconfig['geox-url']['mmdb'] = uci.get('nikki', 'mixin', 'geoip_mmdb_url');\nconfig['geox-url']['geoip'] = uci.get('nikki', 'mixin', 'geoip_dat_url');\nconfig['geox-url']['asn'] = uci.get('nikki', 'mixin', 'geoip_asn_url');\nconfig['geo-auto-update'] = uci_bool(uci.get('nikki', 'mixin', 'geox_auto_update'));\nconfig['geo-update-interval'] = uci_int(uci.get('nikki', 'mixin', 'geox_update_interval'));\n\nprint(trim_all(config));"
  },
  {
    "path": "luci-app-nikki/uninstall.sh",
    "content": "#!/bin/sh\n\n# Nikki's uninstaller\n\n# uninstall\nif [ -x \"/bin/opkg\" ]; then\n\topkg list-installed luci-i18n-nikki-* | cut -d ' ' -f 1 | xargs opkg remove\n\topkg remove luci-app-nikki\n\topkg remove nikki\n\topkg remove mihomo-meta mihomo-alpha\nelif [ -x \"/usr/bin/apk\" ]; then\n\tapk list --installed --manifest luci-i18n-nikki-* | cut -d ' ' -f 1 | xargs apk del\n\tapk del luci-app-nikki\n\tapk del nikki\n\tapk del mihomo-meta mihomo-alpha\nfi\n# remove config\nrm -f /etc/config/nikki\n# remove files\nrm -rf /etc/nikki\n# remove log\nrm -rf /var/log/nikki\n# remove temp\nrm -rf /var/run/nikki\n# remove feed\nif [ -x \"/bin/opkg\" ]; then\n\tif grep -q nikki /etc/opkg/customfeeds.conf; then\n\t\tsed -i '/nikki/d' /etc/opkg/customfeeds.conf\n\tfi\n\twget -O \"nikki.pub\" \"https://nikkinikki.pages.dev/key-build.pub\"\n\topkg-key remove nikki.pub\n\trm -f nikki.pub\nelif [ -x \"/usr/bin/apk\" ]; then\n\tif grep -q nikki /etc/apk/repositories.d/customfeeds.list; then\n\t\tsed -i '/nikki/d' /etc/apk/repositories.d/customfeeds.list\n\tfi\n\trm -f /etc/apk/keys/nikki.pem\nfi\n"
  },
  {
    "path": "luci-app-npc/Makefile",
    "content": "# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>\n# Copyright (C) 2020-2021 Hyy2001X <https://github.com/Hyy2001X>\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for NPS Client(NPC)\nLUCI_DEPENDS:=+npc\nLUCI_PKGARCH:=all\nPKG_VERSION:=1.3\nPKG_RELEASE:=2\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-npc/luasrc/controller/npc.lua",
    "content": "module(\"luci.controller.npc\",package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/npc\") then\n\t\treturn\n\tend\n\n\tentry({\"admin\", \"services\", \"npc\"}, cbi(\"npc\"), _(\"NPS Client\"), 99).dependent = true\n\tentry({\"admin\", \"services\", \"npc\", \"status\"}, call(\"act_status\")).leaf = true\nend\n\nfunction act_status()\n\tlocal e = {}\n\te.running = luci.sys.call(\"pgrep npc > /dev/null\") == 0\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n"
  },
  {
    "path": "luci-app-npc/luasrc/model/cbi/npc.lua",
    "content": "m = Map(\"npc\", translate(\"NPS Client\"), translate(\"Nps is a fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.\"))\n\nm:section(SimpleSection).template = \"npc/npc_status\"\n\ns = m:section(TypedSection,\"npc\")\ns.addremove = false\ns.anonymous = true\n\nenable = s:option(Flag, \"enable\", translate(\"Enable\"))\nenable.rmempty = false\nenable.default = \"0\"\n\nserver = s:option(Value, \"server_addr\", translate(\"Server Address\"), translate(\"IPv4 address or Domain Name\"))\nserver.rmempty = false\n\nport = s:option(Value, \"server_port\", translate(\"Port\"))\nport.datatype = \"port\"\nport.default = \"8024\"\nport.rmempty = false\n\nvkey = s:option(Value, \"vkey\", translate(\"vkey\"))\nvkey.password = true\nvkey.rmempty = false\n\nprotocol = s:option(ListValue, \"protocol\", translate(\"Protocol Type\"))\nprotocol.default = \"tcp\"\nprotocol:value(\"tcp\", translate(\"TCP Protocol\"))\nprotocol:value(\"kcp\", translate(\"KCP Protocol\"))\n\nmax_conn = s:option(Value, \"max_conn\", translate(\"Max Connection Limit\"), translate(\"Maximum number of connections (Not necessary)\"))\nmax_conn.optional = true\nmax_conn.rmempty = true\n\nrate_limit = s:option(Value, \"rate_limit\", translate(\"Rate Limit\"), translate(\"Client rate limit (Not necessary)\"))\nrate_limit.optional = true\nrate_limit.rmempty = true\n\nflow_limit = s:option(Value, \"flow_limit\", translate(\"Flow Limit\"), translate(\"Client flow limit (Not necessary)\"))\nflow_limit.optional = true\nflow_limit.rmempty = true\n\ncompress = s:option(Flag, \"compress\", translate(\"Enable Compression\"), translate(\"The contents will be compressed to speed up the traffic forwarding speed, but this will consume some additional cpu resources.\"))\ncompress.default = \"0\"\ncompress.rmempty = false\n\ncrypt = s:option(Flag, \"crypt\", translate(\"Enable Encryption\"), translate(\"Encrypted the communication between Npc and Nps, will effectively prevent the traffic intercepted.\"))\ncrypt.default = \"0\"\ncrypt.rmempty = false\n\nreturn m\n"
  },
  {
    "path": "luci-app-npc/luasrc/view/npc/npc_status.htm",
    "content": "<script type=\"text/javascript\">//<![CDATA[\nXHR.poll(3, '<%=url([[admin]], [[services]], [[npc]], [[status]])%>', null,\n\tfunction(x, data) {\n\t\tvar tb = document.getElementById('npc_status');\n\t\tif (data && tb) {\n\t\t\tif (data.running) {\n\t\t\t\tvar links = '<em><b><font color=green>NPS Client <%:RUNNING%></font></b></em>';\n\t\t\t\ttb.innerHTML = links;\n\t\t\t} else {\n\t\t\t\ttb.innerHTML = '<em><b><font color=red>NPS Client <%:NOT RUNNING%></font></b></em>';\n\t\t\t}\n\t\t}\n\t}\n);\n//]]>\n</script>\n<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>\n<fieldset class=\"cbi-section\">\n\t<p id=\"npc_status\">\n\t\t<em><%:Collecting data...%></em>\n\t</p>\n</fieldset>\n"
  },
  {
    "path": "luci-app-npc/po/zh_Hans/npc.po",
    "content": "msgid \"NPS Client\"\nmsgstr \"NPS 内网穿透客户端\"\n\nmsgid \"Nps is a fast reverse proxy to help you expose a local server behind a NAT or firewall to the internet.\"\nmsgstr \"NPS 是一种快速反向代理,可帮助您将 NAT 或防火墙后的本地服务器公开到 Internet\"\n\nmsgid \"IPv4 address or Domain Name\"\nmsgstr \"服务器域名或 IPv4 地址\"\n\nmsgid \"vkey\"\nmsgstr \"唯一验证密钥(vkey)\"\n\nmsgid \"Enable Compression\"\nmsgstr \"压缩传输\"\n\nmsgid \"Enable Encryption\"\nmsgstr \"加密传输\"\n\nmsgid \"The contents will be compressed to speed up the traffic forwarding speed, but this will consume some additional cpu resources.\"\nmsgstr \"启用压缩传输内容会加快流量转发速度,但是会额外消耗 CPU 资源\"\n\nmsgid \"Encrypted the communication between Npc and Nps, will effectively prevent the traffic intercepted.\"\nmsgstr \"启用加密传输客户端与服务端之间的通信内容,会有效防止流量被拦截\"\n\nmsgid \"Basic Setting\"\nmsgstr \"基本设置\"\n\nmsgid \"Protocol Type\"\nmsgstr \"协议类型\"\n\nmsgid \"Server Address\"\nmsgstr \"服务端地址\"\n\nmsgid \"TCP Protocol\"\nmsgstr \"TCP\"\n\nmsgid \"KCP Protocol\"\nmsgstr \"KCP\"\n\nmsgid \"Max Connection Limit\"\nmsgstr \"连接数限制\"\n\nmsgid \"Maximum number of connections (Not necessary)\"\nmsgstr \"最大连接数限制 (可选,非必须)\"\n\nmsgid \"Rate Limit\"\nmsgstr \"速度限制\"\n\nmsgid \"Client rate limit (Not necessary)\"\nmsgstr \"客户端速度限制 (可选,非必须)\"\n\nmsgid \"Flow Limit\"\nmsgstr \"流量限制\"\n\nmsgid \"Client flow limit (Not necessary)\"\nmsgstr \"客户端流量限制 (可选,非必须)\"\n"
  },
  {
    "path": "luci-app-npc/root/etc/config/npc",
    "content": "\nconfig npc\n\toption enable '0'\n\toption server_addr '1.2.3.4'\n\toption vkey 'abcdefg'\n\n"
  },
  {
    "path": "luci-app-npc/root/etc/init.d/npc",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=95\nUSE_PROCD=1\nLOGGER=\"logger -t [NPC]\"\n\nnpc_Path=\"$(command -v npc)\"\nconf_Path=\"/tmp/etc/npc.conf\"\n\nstart_service() {\n\tlocal basic_list=\"enable server_addr server_port protocol vkey max_conn rate_limit flow_limit compress crypt\"\n\tfor i in $(echo $basic_list);do\n\t\tlocal eval $i=\"$(uci_get_by_type npc 0 $i)\"\n\tdone;unset i\n\n\t[ -s \"$conf_Path\" ] && rm -f $conf_Path\n\techo \"[common]\" > $conf_Path || {\n\t\t${LOGGER} \"Failed to create config,exit ...\"\n\t\texit 1\n\t}\n\techo \"server_addr=${server_addr}:${server_port}\" >> $conf_Path\n\techo \"conn_type=${protocol}\" >> $conf_Path\n\techo \"vkey=${vkey}\" >> $conf_Path\n\techo \"auto_reconnection=true\" >> $conf_Path\n\t[ -n \"$max_conn\" ] && echo \"max_conn=${max_conn}\" >> $conf_Path\n\t[ -n \"$rate_limit\" ] && echo \"rate_limit=${rate_limit}\" >> $conf_Path\n\t[ -n \"$flow_limit\" ] && echo \"flow_limit=${flow_limit}\" >> $conf_Path\n\tconf_write_bool compress $compress\n\tconf_write_bool crypt $crypt\n\n\tif [ \"$enable\" = 1 ]\n\tthen\n\t\t${LOGGER} \"Starting NPS Client(NPC) ...\"\n\t\tprocd_open_instance\n\t\tprocd_set_param command $npc_Path -config=$conf_Path\n\t\tprocd_set_param respawn\n\t\tprocd_set_param stdout 1\n\t\tprocd_set_param stderr 1\n\t\tprocd_close_instance\n\telse\n\t\t${LOGGER} \"NPS Client(NPC) Service is now disabled ...\"\n\tfi\n}\n\nstop_service() {\n\t$LOGGER \"Stopping NPS Client(NPC) ...\"\n\trm -f $conf_Path\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"npc\"\n}\n\nconf_write_bool() {\n\tif [ \"$2\" == 0 ]\n\tthen\n\t\techo \"$1=false\" >> $conf_Path\n\telse\n\t\techo \"$1=true\" >> $conf_Path\n\tfi\n\treturn\n}\n\nuci_get_by_type() {\n\tlocal ret=$(uci get npc.@$1[$2].$3 2>/dev/null)\n\techo ${ret:=$4}\n}\n"
  },
  {
    "path": "luci-app-npc/root/etc/uci-defaults/luci-npc",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@npc[-1]\n\tadd ucitrack npc\n\tset ucitrack.@npc[-1].init=npc\n\tcommit ucitrack\nEOF\n\nrm -f /tmp/luci-indexcache\nexit 0\n"
  },
  {
    "path": "luci-app-oled/linux/ssd1306.cfg",
    "content": "i2cDevPath = \"/dev/i2c-5\";\nfrom = 0;\nto = 1440;\nneetInit = 1;\nrotate = 1;\ninterval = 60;\ndisplayInvertNormal = 0;\ndisplayDate = 1;\ndisplayIp = 0;\nipIfName = \"eth0\";\ndisplayNetSpeed = 0;\nspeedIfName = \"eth0\";\ndisplayCpuTemp = 0;\ndisplayCpuFreq = 0;\ndrawLine = 1;\ndrawRect = 0;\nfillRect = 0;\ndrawCircle = 0;\ndrawRoundCircle = 0;\nfillRoundCircle = 0;\ndrawTriangle = 0;\nfillTriangle = 0;\ndisplayBitmap = 0;\ndrawBitmapEg = 0;\nscroll = 1;\nscrollText = \"H69K-Max\";\n"
  },
  {
    "path": "luci-app-oled/linux/ssd1306.service",
    "content": "[Unit]\nDescription=OLED ssd1306 display service\nAfter=network.target\n\n[Service]\nType=forking\nExecStart=/usr/bin/ssd1306 --config=/etc/ssd1306.cfg\nExecReload=/bin/kill -s HUP $MAINPID\nKillMode=mixed\n\n[Install]\nWantedBy=multi-user.target\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/Makefile",
    "content": "#\n# Copyright (C) 2020 Nate Ding\n#\n# This is free software, licensed under the GUN General Public License v3.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_Title:=LuCI support for ssd1306 0.91\\' 138x32 display\nLUCI_DEPENDS:=+libconfig\nLUCI_PKGARCH:=$(if $(realpath src/Makefile),,all)\nPKG_VERSION:=20230823\nPKG_RELEASE:=1\n\nPKG_LICENSE:=GPLv3\nPKG_LINCESE_FILES:=LICENSE\nPKG_MAINTAINER:=natelol <natelol@github.com>\n\ndefine Package/luci-app-oled/conffiles\n/etc/config/oled\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/luasrc/controller/oled.lua",
    "content": "module(\"luci.controller.oled\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/oled\") then\n\t\treturn\n\tend\n\tlocal uci = require \"luci.model.uci\".cursor()\n\tlocal showmenu = uci:get_first(\"oled\", \"oled\", \"showmenu\", \"0\")\n\tif showmenu == \"0\" then\n\t\treturn\n\tend\n\tentry({\"admin\", \"services\", \"oled\"}, alias(\"admin\", \"services\", \"oled\", \"setting\"),_(\"OLED\"), 90).dependent = true\n\tentry({\"admin\", \"services\", \"oled\", \"status\"}, call(\"act_status\"))\n\tentry({\"admin\", \"services\", \"oled\", \"setting\"}, cbi(\"oled/setting\"),_(\"Setting\"),30).leaf = true\nend\n\nfunction act_status()\n\tlocal e={}\n\te.running = luci.sys.call(\"pgrep -f /usr/bin/oled > /dev/null\")==0\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/luasrc/model/cbi/oled/setting.lua",
    "content": "m = Map(\"oled\", translate(\"OLED\"), translate(\"A LuCI app that helps you config your oled display (SSD1306, 0.91', 128X32) with screensavers! <br /> <br /> Any issues, please go to: \")..[[<a href=\"https://github.com/natelol/luci-app-oled\" target=\"_blank\">luci-app-oled</a>]])\n\n--m.chain(\"luci\")\n\nm:section(SimpleSection).template=\"oled/status\"\n\ns = m:section(TypedSection, \"oled\", translate(\"\"))\ns.anonymous=true\ns.addremove=false\n\n--OPTIONS\ns:tab(\"info\", translate(\"Info Display\"))\ns:tab(\"screensaver\", translate(\"screensaver\"))\n\no = s:taboption(\"info\", Flag, \"enable\", translate(\"Enable\"))\no.default=0\no = s:taboption(\"info\", Value, \"path\", translate(\"I2C PATH\"))\no.default='/dev/i2c-0'\no = s:taboption(\"info\", Flag, \"rotate\", translate(\"180 degree rotation\"))\no.default=0\no = s:taboption(\"info\", Flag, \"autoswitch\", translate(\"Enable Auto switch\"))\no.default=0\nfrom = s:taboption(\"info\", ListValue, \"from\", translate(\"From\"))\nto = s:taboption(\"info\", ListValue, \"to\", translate(\"To\"))\nfor i=0,23 do\n\tfor j=0,30,30 do\n\t\tfrom:value(i*60+j,string.format(\"%02d:%02d\",i,j))\n\t\tto:value(i*60+j,string.format(\"%02d:%02d\",i,j))\n\tend\nend\nfrom:value(1440,\"24:00\")\nto:value(1440,\"24:00\")\nfrom:depends(\"autoswitch\",'1')\nto:depends(\"autoswitch\",'1')\nfrom.default=0\nto.default=1440\n\n--informtion  options----\no = s:taboption(\"info\", Flag, \"date\", translate(\"Date\"), translate('Format YYYY-MM-DD HH:MM:SS'))\no.default=0\no = s:taboption(\"info\", Flag, \"lanip\", translate(\"IP\"), translate(\"LAN IP address\"))\no.default=0\no = s:taboption(\"info\", Value, \"ipifname\", translate(\"which eth to monitor\"))\no:depends(\"lanip\",'1')\no.default='br-lan'\no = s:taboption(\"info\", Flag, \"cputemp\", translate(\"CPU temperature\"))\no.default=0\no = s:taboption(\"info\", Flag, \"cpufreq\", translate(\"CPU frequency\"))\no.default=0\no = s:taboption(\"info\", Flag, \"netspeed\", translate(\"Network speed\"), translate(\"1Mbps(m/s)=1,000Kbps(k/s)=1,000,000bps(b/s)\"))\no.default=0\no = s:taboption(\"info\", Value, \"netsource\", translate(\"which eth to monitor\"))\no:depends(\"netspeed\",'1')\no.default='eth0'\no = s:taboption(\"info\", Value, \"time\", translate(\"Display interval(s)\"), translate('Screensaver will activate in set seconds'))\no.default=0\n\n--screensaver options--\no = s:taboption(\"screensaver\", Flag, \"scroll\", translate(\"Scroll Text\"))\no.default=1\no = s:taboption(\"screensaver\", Value, \"text\", translate(\"Text you want to scroll\"))\no:depends(\"scroll\",'1')\no.default='OPENWRT'\no = s:taboption(\"screensaver\", Flag, \"drawline\", translate(\"Draw Many Lines\"))\no.default=0\no = s:taboption(\"screensaver\", Flag, \"drawrect\", translate(\"Draw Rectangles\"))\no.default=0\no = s:taboption(\"screensaver\", Flag, \"fillrect\", translate(\"Draw Multiple Rectangles\"))\no.default=0\no = s:taboption(\"screensaver\", Flag, \"drawcircle\", translate(\"Draw Multiple Circles\"))\no.default=0\no = s:taboption(\"screensaver\", Flag, \"drawroundrect\", translate(\"Draw a white circle, 10 pixel radius\"))\no.default=0\no = s:taboption(\"screensaver\", Flag, \"fillroundrect\", translate(\"Fill the Round Rectangles\"))\no.default=0\no = s:taboption(\"screensaver\", Flag, \"drawtriangle\", translate(\"Draw Triangles\"))\no.default=0\no = s:taboption(\"screensaver\", Flag, \"filltriangle\", translate(\"Fill Triangles\"))\no.default=0\no = s:taboption(\"screensaver\", Flag, \"displaybitmap\", translate(\"Display miniature bitmap\"))\no.default=0\no = s:taboption(\"screensaver\", Flag, \"displayinvertnormal\", translate(\"Invert Display Normalize it\"))\no.default=0\no = s:taboption(\"screensaver\", Flag, \"drawbitmapeg\", translate(\"Draw a bitmap and animate\"))\no.default=0\n\nreturn m\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/luasrc/view/oled/status.htm",
    "content": "<script type=\"text/javascript\">//<![CDATA[\nXHR.poll(3, '<%=url([[admin]], [[services]], [[oled]], [[status]])%>', null,\n\tfunction(x, data) {\n\t\tvar tb = document.getElementById('oled_status');\n\t\tif (data && tb) {\n\t\t\tif (data.running) {\n\t\t\t\tvar links = '<em><b><font color=green>OLED <%:RUNNING%></font></b></em>';\n\t\t\t\ttb.innerHTML = links;\n\t\t\t} else {\n\t\t\t\ttb.innerHTML = '<em><b><font color=red>OLED <%:NOT RUNNING%></font></b></em>';\n\t\t\t}\n\t\t}\n\t}\n);\n//]]>\n</script>\n<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>\n<fieldset class=\"cbi-section\">\n\t<p id=\"oled_status\">\n\t\t<em><%:Collecting data...%></em>\n\t</p>\n</fieldset>\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/po/zh_Hans/oled.po",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:1\nmsgid \"\"\n\"A LuCI app that helps you config your oled display (SSD1306, 0.91', 128X32) \"\n\"with screensavers! <br /> <br /> Any issues, please go to:\"\nmsgstr \"\"\n\"这是一款支持在ssd1306，0.91寸，128x32像素的oled显示屏上显示你要的信息，包含屏\"\n\"保的程序。<br /> <br />任何问题请到：\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:24\nmsgid \"CPU frequency\"\nmsgstr \"CPU 频率\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:22\nmsgid \"CPU temperature\"\nmsgstr \"CPU 温度\"\n\nmsgid \"Scroll Text\"\nmsgstr \"文字滚动\"\n\nmsgid \"Enable Auto switch\"\nmsgstr \"启用定时开关\"\n\nmsgid \"From\"\nmsgstr \"起始时间\"\n\nmsgid \"To\"\nmsgstr \"结束时间\"\n\nmsgid \"Text you want to scroll\"\nmsgstr \"你想要显示的文字\"\n\nmsgid \"which eth to monitor\"\nmsgstr \"选择监控哪个网口\"\n\n#: ../../package/new/luci-app-oled/luasrc/view/oled/status.htm:20\nmsgid \"Collecting data...\"\nmsgstr \"\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:18\nmsgid \"Date\"\nmsgstr \"时间\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:48\nmsgid \"Display miniature bitmap\"\nmsgstr \"小图案\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:28\nmsgid \"Display interval(s)\"\nmsgstr \"信息显示间隔（秒）\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:28\nmsgid \"Screensaver will activate in set seconds\"\nmsgstr \"屏保每间隔设置的时间运行一次\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:32\nmsgid \"Draw Many Lines\"\nmsgstr \"直线\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:38\nmsgid \"Draw Multiple Circles\"\nmsgstr \"多圆\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:36\nmsgid \"Draw Multiple Rectangles\"\nmsgstr \"多方块\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:34\nmsgid \"Draw Rectangles\"\nmsgstr \"方块\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:44\nmsgid \"Draw Triangles\"\nmsgstr \"三角形\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:54\nmsgid \"Draw a bitmap and animate\"\nmsgstr \"动图\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:52\nmsgid \"Draw a bitmap and animate movement\"\nmsgstr \"变化图\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:40\nmsgid \"Draw a white circle, 10 pixel radius\"\nmsgstr \"实心圆\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:15\nmsgid \"Enable\"\nmsgstr \"启用\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:46\nmsgid \"Fill Triangles\"\nmsgstr \"三角填充\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:42\nmsgid \"Fill the Round Rectangles\"\nmsgstr \"方形填充\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:18\nmsgid \"Format YYYY-MM-DD HH:MM:SS\"\nmsgstr \"日期格式 YYYY-MM-DD HH:MM:SS\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:17\nmsgid \"I2C PATH\"\nmsgstr \"I2C 路径\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:20\nmsgid \"IP\"\nmsgstr \"\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:12\nmsgid \"Info Display\"\nmsgstr \"显示信息\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:50\nmsgid \"Invert Display Normalize it\"\nmsgstr \"反转\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:20\nmsgid \"LAN IP address\"\nmsgstr \"LAN 地址\"\n\n#: ../../package/new/luci-app-oled/luasrc/view/oled/status.htm:10\nmsgid \"NOT RUNNING\"\nmsgstr \"\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:26\nmsgid \"Network speed\"\nmsgstr \"网速\"\n\n#: ../../package/new/luci-app-oled/luasrc/controller/oled.lua:7\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:1\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:7\nmsgid \"OLED\"\nmsgstr \"\"\n\n#: ../../package/new/luci-app-oled/luasrc/view/oled/status.htm:7\nmsgid \"RUNNING\"\nmsgstr \"\"\n\n#: ../../package/new/luci-app-oled/luasrc/controller/oled.lua:9\nmsgid \"Setting\"\nmsgstr \"设置\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:13\nmsgid \"screensaver\"\nmsgstr \"屏保\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:19\nmsgid \"180 degree rotation\"\nmsgstr \"180 度旋转\"\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/po/zh_Hant/oled.po",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:1\nmsgid \"\"\n\"A LuCI app that helps you config your oled display (SSD1306, 0.91', 128X32) \"\n\"with screensavers! <br /> <br /> Any issues, please go to:\"\nmsgstr \"這是壹款支持在ssd1306，0.91寸，128x32像素的oled顯示屏上顯示妳要的信息，包含屏保的程序。<br /> <br />任何問題請到：\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:24\nmsgid \"CPU frequency\"\nmsgstr \"CPU頻率\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:22\nmsgid \"CPU temperature\"\nmsgstr \"CPU溫度\"\n\nmsgid \"Scroll Text\"\nmsgstr \"文字滾動\"\n\nmsgid \"Text you want to scroll\"\nmsgstr \"妳想要顯示的文字\"\n\nmsgid \"which eth to monitor\"\nmsgstr \"選擇監控哪個網口\"\n\n#: ../../package/new/luci-app-oled/luasrc/view/oled/status.htm:20\nmsgid \"Collecting data...\"\nmsgstr \"\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:18\nmsgid \"Date\"\nmsgstr \"時間\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:48\nmsgid \"Display miniature bitmap\"\nmsgstr \"小圖案\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:28\nmsgid \"Display interval(s)\"\nmsgstr \"信息顯示間隔（秒）\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:28\nmsgid \"Screensaver will activate in set seconds\"\nmsgstr \"屏保每間隔設置的時間運行壹次\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:32\nmsgid \"Draw Many Lines\"\nmsgstr \"直線\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:38\nmsgid \"Draw Multiple Circles\"\nmsgstr \"多圓\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:36\nmsgid \"Draw Multiple Rectangles\"\nmsgstr \"多方塊\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:34\nmsgid \"Draw Rectangles\"\nmsgstr \"方塊\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:44\nmsgid \"Draw Triangles\"\nmsgstr \"三角形\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:54\nmsgid \"Draw a bitmap and animate\"\nmsgstr \"動圖\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:52\nmsgid \"Draw a bitmap and animate movement\"\nmsgstr \"變化圖\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:40\nmsgid \"Draw a white circle, 10 pixel radius\"\nmsgstr \"實心圓\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:15\nmsgid \"Enable\"\nmsgstr \"啟用\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:46\nmsgid \"Fill Triangles\"\nmsgstr \"三角填充\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:42\nmsgid \"Fill the Round Rectangles\"\nmsgstr \"方形填充\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:18\nmsgid \"Format YYYY-MM-DD HH:MM:SS\"\nmsgstr \"日期格式 YYYY-MM-DD HH:MM:SS\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:20\nmsgid \"IP\"\nmsgstr \"\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:12\nmsgid \"Info Display\"\nmsgstr \"顯示信息\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:50\nmsgid \"Invert Display Normalize it\"\nmsgstr \"反轉\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:20\nmsgid \"LAN IP address\"\nmsgstr \"LAN地址\"\n\n#: ../../package/new/luci-app-oled/luasrc/view/oled/status.htm:10\nmsgid \"NOT RUNNING\"\nmsgstr \"\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:26\nmsgid \"Network speed\"\nmsgstr \"網速\"\n\n#: ../../package/new/luci-app-oled/luasrc/controller/oled.lua:7\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:1\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:7\nmsgid \"OLED\"\nmsgstr \"\"\n\n#: ../../package/new/luci-app-oled/luasrc/view/oled/status.htm:7\nmsgid \"RUNNING\"\nmsgstr \"\"\n\n#: ../../package/new/luci-app-oled/luasrc/controller/oled.lua:9\nmsgid \"Setting\"\nmsgstr \"設置\"\n\n#: ../../package/new/luci-app-oled/luasrc/model/cbi/oled/setting.lua:13\nmsgid \"screensaver\"\nmsgstr \"屏保\"\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/root/etc/config/oled",
    "content": "config oled\n\toption showmenu '0'\n\toption enable '0'\n\toption drawline '0'\n\toption drawrect '0'\n\toption fillrect '0'\n\toption drawcircle '0'\n\toption drawroundrect '0'\n\toption fillroundrect '0'\n\toption drawtriangle '0'\n\toption filltriangle '0'\n\toption displaybitmap '0'\n\toption displayinvertnormal '0'\n\toption drawbitmapeg '0'\n\toption date '1'\n\toption netspeed '0'\n\toption lanip '1'\n\toption ipifname 'br-lan'\n\toption cpufreq '1'\n\toption cputemp '1'\n\toption time '60'\n\toption from '0'\n\toption to '1440'\n\toption autoswitch '0'\n\toption rotate '0'\n\toption scroll '0'\n\toption text 'OPENWRT'\n\toption netsource 'eth0'\n\toption path '/dev/i2c-0'\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/root/etc/init.d/oled",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=88\nSTOP=11\nUSE_PROCD=1\nPROG=/usr/bin/oled\n\nget_section() {\n\teval \"export -n ${2}=\\\"$1\\\"\"\n\treturn 1\n}\n\nstart_service() {\n\tlocal mainsection\n\tconfig_load oled\n\tconfig_foreach get_section oled mainsection\n\tlocal section=$mainsection\n\n\tlocal enabled ; config_get enabled \"$section\" enable 0\n\tif [[ $enabled -eq 0 ]]; then\n\t\treturn 1\n\tfi\n\n\tprocd_open_instance\n\tprocd_set_param command ${PROG}\n\tprocd_append_param command --needInit\n\n\tlocal param\n\t# default /dev/i2c-0\n\tconfig_get param \"$section\" path\n\t[ \"$param\" != \"\" ]  && procd_append_param command --i2cDevPath=\"$param\"\n\n\t# from begin_minitues to end_minitues\n\t# default 0 - 1440\n\tconfig_get param \"$section\" from\n\t[ \"$param\" != \"\" ]  && procd_append_param command --from=\"$param\"\n\tconfig_get param \"$section\" to\n\t[ \"$param\" != \"\" ]  && procd_append_param command --to=\"$param\"\n\n\tconfig_get param \"$section\" date\n\t[ \"$param\" == \"1\" ] && procd_append_param command --displayDate\n\n\tconfig_get param \"$section\" lanip\n\t[ \"$param\" == \"1\" ] && procd_append_param command --displayIp\n\tconfig_get param \"$section\" ipifname\n\tif [ \"$param\" != \"\" ];then\n\t\tprocd_append_param command --ipIfName=\"$param\"\n\telse\n\t\tprocd_append_param command --ipIfName=\"br-lan\"\n\tfi\n\n\tconfig_get param \"$section\" cputemp\n\t[ \"$param\" == \"1\" ] && procd_append_param command --displayCpuTemp\n\n\tconfig_get param \"$section\" cpufreq\n\t[ \"$param\" == \"1\" ] && procd_append_param command --displayCpuFreq\n\n\tconfig_get param \"$section\" netspeed\n\t[ \"$param\" == \"1\" ] && procd_append_param command --displayNetSpeed\n\t# default eth0\n\tconfig_get param \"$section\" netsource\n\t[ \"$param\" != \"\" ]  && procd_append_param command --speedIfName=\"$param\"\n\n\t# default 60\n\tconfig_get param \"$section\" time\n\t[ \"$param\" != \"\" ]  && procd_append_param command --interval=\"$param\"\n\n\tconfig_get param \"$section\" drawline\n\t[ \"$param\" == \"1\" ] && procd_append_param command --drawLine\n\n\tconfig_get param \"$section\" drawrect\n\t[ \"$param\" == \"1\" ] && procd_append_param command --drawRect\n\n\tconfig_get param \"$section\" fillrect\n\t[ \"$param\" == \"1\" ] && procd_append_param command --fillRect\n\n\tconfig_get param \"$section\" drawcircle\n\t[ \"$param\" == \"1\" ] && procd_append_param command --drawCircle\n\n\tconfig_get param \"$section\" drawroundrect\n\t[ \"$param\" == \"1\" ] && procd_append_param command --drawRoundCircle\n\n\tconfig_get param \"$section\" fillroundrect\n\t[ \"$param\" == \"1\" ] && procd_append_param command --fillRoundCircle\n\n\tconfig_get param \"$section\" drawtriangle\n\t[ \"$param\" == \"1\" ] && procd_append_param command --drawTriangle\n\n\tconfig_get param \"$section\" filltriangle\n\t[ \"$param\" == \"1\" ] && procd_append_param command --fillTriangle\n\n\tconfig_get param \"$section\" displaybitmap\n\t[ \"$param\" == \"1\" ] && procd_append_param command --displayBitmap\n\n\tconfig_get param \"$section\" drawbitmapeg\n\t[ \"$param\" == \"1\" ] && procd_append_param command --drawBitmapEg\n\n\tconfig_get param \"$section\" displayinvertnormal\n\t[ \"$param\" == \"1\" ] && procd_append_param command --displayInvertNormal\n\n\tconfig_get param \"$section\" rotate\n\t[ \"$param\" == \"1\" ] && procd_append_param command --rotate\n\n\tconfig_get param \"$section\" scroll\n\t[ \"$param\" == \"1\" ] && procd_append_param command --scroll\n\tconfig_get param \"$section\" text\n\t[ \"$param\" != \"\" ]  && procd_append_param command --scrollText=\"$param\"\n\n\tprocd_set_param respawn\n\tprocd_close_instance\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"oled\"\n}\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/root/etc/uci-defaults/oled",
    "content": "#!/bin/sh\n\nuci_write_config() {\n\t[[ `uci -q get oled.@oled[0].showmenu` -eq 1 ]] && return\n\tuci -q batch <<-EOF >/dev/null\n\t\tset oled.@oled[0].showmenu=\"1\"\n\t\tset oled.@oled[0].enable=\"1\"\n\t\tset oled.@oled[0].path=\"$1\"\n\t\tset oled.@oled[0].rotate=\"$2\"\n\t\tset oled.@oled[0].netspeed=\"$3\"\n\t\tset oled.@oled[0].netsource=\"$4\"\n\t\tcommit oled\nEOF\n}\n\n. /lib/functions/system.sh\n\ncase \"$(board_name)\" in\nhinlink,opc-h69k)\n\tuci_write_config '/dev/i2c-5' 1 1 eth0\n\t;;\nesac\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@oled[-1]\n\tadd ucitrack oled\n\tset ucitrack.@oled[-1].init=oled\n\tcommit ucitrack\nEOF\n\nsed -e \"/\\/etc\\/init\\.d\\/oled/d\" -i /etc/crontabs/root && /etc/init.d/cron reload\nrm -rf /tmp/luci-*\nexit 0\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/root/usr/share/rpcd/acl.d/luci-app-oled.json",
    "content": "{\n\t\"luci-app-oled\": {\n\t\t\"description\": \"Grant UCI access for luci-app-oled\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"oled\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"oled\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/src/Example_Code/.clang-format",
    "content": "---\nLanguage:        Cpp\n# BasedOnStyle:  Google\nAccessModifierOffset: -1\nAlignAfterOpenBracket: Align\nAlignConsecutiveMacros: false\nAlignConsecutiveAssignments: false\nAlignConsecutiveBitFields: false\nAlignConsecutiveDeclarations: false\nAlignEscapedNewlines: Left\nAlignOperands:   Align\nAlignTrailingComments: true\nAllowAllArgumentsOnNextLine: true\nAllowAllConstructorInitializersOnNextLine: true\nAllowAllParametersOfDeclarationOnNextLine: true\nAllowShortEnumsOnASingleLine: true\nAllowShortBlocksOnASingleLine: Never\nAllowShortCaseLabelsOnASingleLine: false\nAllowShortFunctionsOnASingleLine: All\nAllowShortLambdasOnASingleLine: All\nAllowShortIfStatementsOnASingleLine: WithoutElse\nAllowShortLoopsOnASingleLine: true\nAlwaysBreakAfterDefinitionReturnType: None\nAlwaysBreakAfterReturnType: None\nAlwaysBreakBeforeMultilineStrings: true\nAlwaysBreakTemplateDeclarations: Yes\nBinPackArguments: true\nBinPackParameters: true\nBraceWrapping:\n  AfterCaseLabel:  false\n  AfterClass:      false\n  AfterControlStatement: Never\n  AfterEnum:       false\n  AfterFunction:   false\n  AfterNamespace:  false\n  AfterObjCDeclaration: false\n  AfterStruct:     false\n  AfterUnion:      false\n  AfterExternBlock: false\n  BeforeCatch:     false\n  BeforeElse:      false\n  BeforeLambdaBody: false\n  BeforeWhile:     false\n  IndentBraces:    false\n  SplitEmptyFunction: true\n  SplitEmptyRecord: true\n  SplitEmptyNamespace: true\nBreakBeforeBinaryOperators: None\nBreakBeforeBraces: Attach\nBreakBeforeInheritanceComma: false\nBreakInheritanceList: BeforeColon\nBreakBeforeTernaryOperators: true\nBreakConstructorInitializersBeforeComma: false\nBreakConstructorInitializers: BeforeColon\nBreakAfterJavaFieldAnnotations: false\nBreakStringLiterals: true\nColumnLimit:     80\nCommentPragmas:  '^ IWYU pragma:'\nCompactNamespaces: false\nConstructorInitializerAllOnOneLineOrOnePerLine: true\nConstructorInitializerIndentWidth: 4\nContinuationIndentWidth: 4\nCpp11BracedListStyle: true\nDeriveLineEnding: true\nDerivePointerAlignment: true\nDisableFormat:   false\nExperimentalAutoDetectBinPacking: false\nFixNamespaceComments: true\nForEachMacros:\n  - foreach\n  - Q_FOREACH\n  - BOOST_FOREACH\nIncludeBlocks:   Regroup\nIncludeCategories:\n  - Regex:           '^<ext/.*\\.h>'\n    Priority:        2\n    SortPriority:    0\n  - Regex:           '^<.*\\.h>'\n    Priority:        1\n    SortPriority:    0\n  - Regex:           '^<.*'\n    Priority:        2\n    SortPriority:    0\n  - Regex:           '.*'\n    Priority:        3\n    SortPriority:    0\nIncludeIsMainRegex: '([-_](test|unittest))?$'\nIncludeIsMainSourceRegex: ''\nIndentCaseLabels: true\nIndentCaseBlocks: false\nIndentGotoLabels: true\nIndentPPDirectives: None\nIndentExternBlock: AfterExternBlock\nIndentWidth:     2\nIndentWrappedFunctionNames: false\nInsertTrailingCommas: None\nJavaScriptQuotes: Leave\nJavaScriptWrapImports: true\nKeepEmptyLinesAtTheStartOfBlocks: false\nMacroBlockBegin: ''\nMacroBlockEnd:   ''\nMaxEmptyLinesToKeep: 1\nNamespaceIndentation: None\nObjCBinPackProtocolList: Never\nObjCBlockIndentWidth: 2\nObjCBreakBeforeNestedBlockParam: true\nObjCSpaceAfterProperty: false\nObjCSpaceBeforeProtocolList: true\nPenaltyBreakAssignment: 2\nPenaltyBreakBeforeFirstCallParameter: 1\nPenaltyBreakComment: 300\nPenaltyBreakFirstLessLess: 120\nPenaltyBreakString: 1000\nPenaltyBreakTemplateDeclaration: 10\nPenaltyExcessCharacter: 1000000\nPenaltyReturnTypeOnItsOwnLine: 200\nPointerAlignment: Left\nRawStringFormats:\n  - Language:        Cpp\n    Delimiters:\n      - cc\n      - CC\n      - cpp\n      - Cpp\n      - CPP\n      - 'c++'\n      - 'C++'\n    CanonicalDelimiter: ''\n    BasedOnStyle:    google\n  - Language:        TextProto\n    Delimiters:\n      - pb\n      - PB\n      - proto\n      - PROTO\n    EnclosingFunctions:\n      - EqualsProto\n      - EquivToProto\n      - PARSE_PARTIAL_TEXT_PROTO\n      - PARSE_TEST_PROTO\n      - PARSE_TEXT_PROTO\n      - ParseTextOrDie\n      - ParseTextProtoOrDie\n      - ParseTestProto\n      - ParsePartialTestProto\n    CanonicalDelimiter: ''\n    BasedOnStyle:    google\nReflowComments:  true\nSortIncludes:    true\nSortUsingDeclarations: true\nSpaceAfterCStyleCast: false\nSpaceAfterLogicalNot: false\nSpaceAfterTemplateKeyword: true\nSpaceBeforeAssignmentOperators: true\nSpaceBeforeCpp11BracedList: false\nSpaceBeforeCtorInitializerColon: true\nSpaceBeforeInheritanceColon: true\nSpaceBeforeParens: ControlStatements\nSpaceBeforeRangeBasedForLoopColon: true\nSpaceInEmptyBlock: false\nSpaceInEmptyParentheses: false\nSpacesBeforeTrailingComments: 2\nSpacesInAngles:  false\nSpacesInConditionalStatement: false\nSpacesInContainerLiterals: true\nSpacesInCStyleCastParentheses: false\nSpacesInParentheses: false\nSpacesInSquareBrackets: false\nSpaceBeforeSquareBrackets: false\nStandard:        Auto\nStatementMacros:\n  - Q_UNUSED\n  - QT_REQUIRE_VERSION\nIndentWidth:     8\nTabWidth:        8\nUseCRLF:         false\nUseTab:          Always\nWhitespaceSensitiveMacros:\n  - STRINGIZE\n  - PP_STRINGIZE\n  - BOOST_PP_STRINGIZE\n...\n\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/src/Example_Code/example_app.c",
    "content": "/*\n * MIT License\n\nCopyright (c) 2017 DeeplyEmbedded\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n * example_app.c\n *\n *  Created on  : Sep 6, 2017\n *  Author      : Vinay Divakar\n *  Website     : www.deeplyembedded.org\n */\n\n/* Lib Includes */\n#include \"example_app.h\"\n\n#include <arpa/inet.h>\n#include <net/if.h>\n#include <netinet/in.h>\n#include <signal.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/ioctl.h>\n#include <sys/socket.h>\n#include <sys/types.h>\n#include <time.h>\n#include <unistd.h>\n\n#include \"SSD1306_OLED.h\"\n\n#define BUFMAX SSD1306_LCDWIDTH *SSD1306_LCDHEIGHT\n\n/* MACRO's */\n#define LOGO16_GLCD_HEIGHT 16\n#define LOGO16_GLCD_WIDTH 16\n#define NUMFLAKES 10\n#define XPOS 0\n#define YPOS 1\n#define DELTAY 2\n\n#define TIMESIZE 64\n// temperature\n#define TEMPPATH \"/sys/class/thermal/thermal_zone0/temp\"\n#define TEMPSIZE 5\n// cpu\n#define FREQSIZE 8\n#define FREQPATH \"/sys/devices/system/cpu/cpu0/cpufreq/cpuinfo_cur_freq\"\n// ip\n#define IPSIZE 20\n\n/* Extern volatile */\nextern volatile unsigned char flag;\n\n/* Bit Map - Taken from Adafruit SSD1306 OLED Library  */\nstatic const unsigned char logo16_glcd_bmp[] = {\n    0b00000000, 0b11000000, 0b00000001, 0b11000000, 0b00000001, 0b11000000,\n    0b00000011, 0b11100000, 0b11110011, 0b11100000, 0b11111110, 0b11111000,\n    0b01111110, 0b11111111, 0b00110011, 0b10011111, 0b00011111, 0b11111100,\n    0b00001101, 0b01110000, 0b00011011, 0b10100000, 0b00111111, 0b11100000,\n    0b00111111, 0b11110000, 0b01111100, 0b11110000, 0b01110000, 0b01110000,\n    0b00000000, 0b00110000};\n\nFILE *fp;\nchar content_buff[BUFMAX];\nchar buf[BUFMAX];\nint display_offset = 7;\n/* draw many lines */\nvoid testdrawline() {\n\tshort i = 0;\n\tfor (i = 0; i < SSD1306_LCDWIDTH; i += 4) {\n\t\tdrawLine(0, 0, i, SSD1306_LCDHEIGHT - 1, WHITE);\n\t\tDisplay();\n\t\tusleep(1000);\n\t}\n\tfor (i = 0; i < SSD1306_LCDHEIGHT; i += 4) {\n\t\tdrawLine(0, 0, SSD1306_LCDWIDTH - 1, i, WHITE);\n\t\tDisplay();\n\t\tusleep(1000);\n\t}\n\tusleep(250000);\n\n\tclearDisplay();\n\tfor (i = 0; i < SSD1306_LCDWIDTH; i += 4) {\n\t\tdrawLine(0, SSD1306_LCDHEIGHT - 1, i, 0, WHITE);\n\t\tDisplay();\n\t\tusleep(1000);\n\t}\n\tfor (i = SSD1306_LCDHEIGHT - 1; i >= 0; i -= 4) {\n\t\tdrawLine(0, SSD1306_LCDHEIGHT - 1, SSD1306_LCDWIDTH - 1, i,\n\t\t\t WHITE);\n\t\tDisplay();\n\t\tusleep(1000);\n\t}\n\tusleep(250000);\n\n\tclearDisplay();\n\tfor (i = SSD1306_LCDWIDTH - 1; i >= 0; i -= 4) {\n\t\tdrawLine(SSD1306_LCDWIDTH - 1, SSD1306_LCDHEIGHT - 1, i, 0,\n\t\t\t WHITE);\n\t\tDisplay();\n\t\tusleep(1000);\n\t}\n\tfor (i = SSD1306_LCDHEIGHT - 1; i >= 0; i -= 4) {\n\t\tdrawLine(SSD1306_LCDWIDTH - 1, SSD1306_LCDHEIGHT - 1, 0, i,\n\t\t\t WHITE);\n\t\tDisplay();\n\t\tusleep(1000);\n\t}\n\tusleep(250000);\n\n\tclearDisplay();\n\tfor (i = 0; i < SSD1306_LCDHEIGHT; i += 4) {\n\t\tdrawLine(SSD1306_LCDWIDTH - 1, 0, 0, i, WHITE);\n\t\tDisplay();\n\t\tusleep(1000);\n\t}\n\tfor (i = 0; i < SSD1306_LCDWIDTH; i += 4) {\n\t\tdrawLine(SSD1306_LCDWIDTH - 1, 0, i, SSD1306_LCDHEIGHT - 1,\n\t\t\t WHITE);\n\t\tDisplay();\n\t\tusleep(1000);\n\t}\n\tusleep(250000);\n}\n\n/* draw rectangles */\nvoid testdrawrect() {\n\tshort i = 0;\n\tfor (i = 0; i < SSD1306_LCDHEIGHT / 2; i += 2) {\n\t\tdrawRect(i, i, SSD1306_LCDWIDTH - 2 * i,\n\t\t\t SSD1306_LCDHEIGHT - 2 * i, WHITE);\n\t\tDisplay();\n\t\tusleep(1000);\n\t}\n}\n\n/* draw multiple rectangles */\nvoid testfillrect() {\n\tunsigned char color = 1;\n\tshort i = 0;\n\tfor (i = 0; i < SSD1306_LCDHEIGHT / 2; i += 3) {\n\t\t// alternate colors\n\t\tfillRect(i, i, SSD1306_LCDWIDTH - i * 2,\n\t\t\t SSD1306_LCDHEIGHT - i * 2, color % 2);\n\t\tDisplay();\n\t\tusleep(1000);\n\t\tcolor++;\n\t}\n}\n\n/* draw mulitple circles */\nvoid testdrawcircle() {\n\tshort i = 0;\n\tfor (i = 0; i < SSD1306_LCDHEIGHT; i += 2) {\n\t\tdrawCircle(SSD1306_LCDWIDTH / 2, SSD1306_LCDHEIGHT / 2, i,\n\t\t\t   WHITE);\n\t\tDisplay();\n\t\tusleep(1000);\n\t}\n}\n\n/*draw a white circle, 10 pixel radius */\nvoid testdrawroundrect() {\n\tshort i = 0;\n\tfor (i = 0; i < SSD1306_LCDHEIGHT / 2 - 2; i += 2) {\n\t\tdrawRoundRect(i, i, SSD1306_LCDWIDTH - 2 * i,\n\t\t\t      SSD1306_LCDHEIGHT - 2 * i, SSD1306_LCDHEIGHT / 4,\n\t\t\t      WHITE);\n\t\tDisplay();\n\t\tusleep(1000);\n\t}\n}\n\n/* Fill the round rectangle */\nvoid testfillroundrect() {\n\tshort color = WHITE, i = 0;\n\tfor (i = 0; i < SSD1306_LCDHEIGHT / 2 - 2; i += 2) {\n\t\tfillRoundRect(i, i, SSD1306_LCDWIDTH - 2 * i,\n\t\t\t      SSD1306_LCDHEIGHT - 2 * i, SSD1306_LCDHEIGHT / 4,\n\t\t\t      color);\n\t\tif (color == WHITE)\n\t\t\tcolor = BLACK;\n\t\telse\n\t\t\tcolor = WHITE;\n\t\tDisplay();\n\t\tusleep(1000);\n\t}\n}\n\n/* Draw triangles */\nvoid testdrawtriangle() {\n\tshort i = 0;\n\tfor (i = 0; i < MIN(SSD1306_LCDWIDTH, SSD1306_LCDHEIGHT) / 2; i += 5) {\n\t\tdrawTriangle(\n\t\t    SSD1306_LCDWIDTH / 2, SSD1306_LCDHEIGHT / 2 - i,\n\t\t    SSD1306_LCDWIDTH / 2 - i, SSD1306_LCDHEIGHT / 2 + i,\n\t\t    SSD1306_LCDWIDTH / 2 + i, SSD1306_LCDHEIGHT / 2 + i, WHITE);\n\t\tDisplay();\n\t\tusleep(1000);\n\t}\n}\n\n/* Fill triangles */\nvoid testfilltriangle() {\n\tunsigned char color = WHITE;\n\tshort i = 0;\n\tfor (i = MIN(SSD1306_LCDWIDTH, SSD1306_LCDHEIGHT) / 2; i > 0; i -= 5) {\n\t\tfillTriangle(\n\t\t    SSD1306_LCDWIDTH / 2, SSD1306_LCDHEIGHT / 2 - i,\n\t\t    SSD1306_LCDWIDTH / 2 - i, SSD1306_LCDHEIGHT / 2 + i,\n\t\t    SSD1306_LCDWIDTH / 2 + i, SSD1306_LCDHEIGHT / 2 + i, WHITE);\n\t\tif (color == WHITE)\n\t\t\tcolor = BLACK;\n\t\telse\n\t\t\tcolor = WHITE;\n\t\tDisplay();\n\t\tusleep(1000);\n\t}\n}\n\n/* Display a bunch of characters and emoticons */\nvoid testdrawchar() {\n\tunsigned char i = 0;\n\tsetTextSize(1);\n\tsetTextColor(WHITE);\n\tsetCursor(0, 0);\n\n\tfor (i = 0; i < 168; i++) {\n\t\tif (i == '\\n') continue;\n\t\toled_write(i);\n\t\tif ((i > 0) && (i % 21 == 0)) println();\n\t}\n\tDisplay();\n\tusleep(1000);\n}\n\n/* Display \"scroll\" and scroll around */\nvoid testscrolltext(char *str) {\n\tsetTextSize(2);\n\tsetTextColor(WHITE);\n\tsetCursor(10, 8);\n\tsprintf(buf, \"%s\", str);\n\tprint_strln(buf);\n\tDisplay();\n\tusleep(1000);\n\tstartscrollright(0x00, 0x0F);\n\tusleep(5000000);\n\tstopscroll();\n\tusleep(1000000);\n\tstartscrollleft(0x00, 0x0F);\n\tusleep(5000000);\n\tstopscroll();\n\tusleep(1000000);\n\tstartscrolldiagright(0x00, 0x07);\n\tusleep(5000000);\n\tstartscrolldiagleft(0x00, 0x07);\n\tusleep(5000000);\n\tstopscroll();\n}\n\n/* Display Texts */\nvoid display_texts() {\n\tsetTextSize(1);\n\tsetTextColor(WHITE);\n\tsetCursor(10, 0);\n\tprint_str(\"HELLO FELLAS!\");\n\tprintln();\n\tprintFloat_ln(3.141592, 4);  // Print 4 No's after the decimal Pt.\n\tprintNumber_L_ln(-1234, DEC);\n\tprintNumber_UC_ln(170, BIN);\n\tsetTextSize(2);\n\tsetTextColor(WHITE);\n\tprint_str(\"0x\");\n\tprintNumber_UL_ln(0xDEADBEEF, HEX);\n}\n\n/* Display miniature bitmap */\nvoid display_bitmap() { drawBitmap(30, 16, logo16_glcd_bmp, 16, 16, 1); }\n\n/* Invert Display and Normalize it */\nvoid display_invert_normal() {\n\tinvertDisplay(SSD1306_INVERT_DISPLAY);\n\tusleep(1000000);\n\tinvertDisplay(SSD1306_NORMALIZE_DISPLAY);\n\tusleep(1000000);\n}\n\n/* Draw a bitmap and 'animate' movement */\nvoid testdrawbitmap(const unsigned char *bitmap, unsigned char w,\n\t\t    unsigned char h) {\n\tunsigned char icons[NUMFLAKES][3], f = 0;\n\n\t// initialize\n\tfor (f = 0; f < NUMFLAKES; f++) {\n\t\ticons[f][XPOS] = rand() % SSD1306_LCDWIDTH;\n\t\ticons[f][YPOS] = 0;\n\t\ticons[f][DELTAY] = (rand() % 5) + 1;\n\n\t\t/* Looks kinna ugly to me - Un-Comment if you need it */\n\t\t// print_str(\"x: \");\n\t\t// printNumber_UC(icons[f][XPOS], DEC);\n\t\t// print_str(\"y: \");\n\t\t// printNumber_UC(icons[f][YPOS], DEC);\n\t\t// print_str(\"dy: \");\n\t\t// printNumber_UC(icons[f][DELTAY], DEC);\n\t}\n\n\twhile (flag != 5) {\n\t\t// draw each icon\n\t\tfor (f = 0; f < NUMFLAKES; f++) {\n\t\t\tdrawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h,\n\t\t\t\t   WHITE);\n\t\t}\n\t\tDisplay();\n\t\tusleep(200000);\n\n\t\t// then erase it + move it\n\t\tfor (f = 0; f < NUMFLAKES; f++) {\n\t\t\tdrawBitmap(icons[f][XPOS], icons[f][YPOS], bitmap, w, h,\n\t\t\t\t   BLACK);\n\n\t\t\t// move it\n\t\t\ticons[f][YPOS] += icons[f][DELTAY];\n\n\t\t\t// if its gone, reinit\n\t\t\tif (icons[f][YPOS] > SSD1306_LCDHEIGHT) {\n\t\t\t\ticons[f][XPOS] = rand() % SSD1306_LCDWIDTH;\n\t\t\t\ticons[f][YPOS] = 0;\n\t\t\t\ticons[f][DELTAY] = (rand() % 5) + 1;\n\t\t\t}\n\t\t}\n\t}\n}\n\n/* Draw bitmap and animate */\nvoid testdrawbitmap_eg() {\n\tsetTextSize(1);\n\tsetTextColor(WHITE);\n\tsetCursor(10, 0);\n\ttestdrawbitmap(logo16_glcd_bmp, LOGO16_GLCD_HEIGHT, LOGO16_GLCD_WIDTH);\n}\n\n/* Intro */\nvoid deeplyembedded_credits() {\n\tsetTextSize(1);\n\tsetTextColor(WHITE);\n\tsetCursor(1, 0);\n\tprint_strln(\"deeplyembedded.org\");\n\tprintln();\n\tprint_strln(\"Author:Vinay Divakar\");\n\tprintln();\n\tprintln();\n\tprint_strln(\"THANK YOU\");\n}\n\nvoid testdate(int mode, int y) {\n\ttime_t rawtime;\n\ttime_t curtime;\n\tuint8_t timebuff[TIMESIZE];\n\tcurtime = time(NULL);\n\ttime(&rawtime);\n\tswitch (mode) {\n\t\tcase CENTER:\n\t\t\tsetTextSize(2);\n\t\t\tstrftime(timebuff, 80, \"%H:%M\", localtime(&rawtime));\n\t\t\tsprintf(buf, \"%s\", timebuff);\n\t\t\tsetCursor((127 - strlen(buf) * 11) / 2 - 4, y);\n\t\t\tbreak;\n\t\tcase FULL:\n\t\t\tsetTextSize(1);\n\t\t\tstrftime(timebuff, 80, \"%Y-%m-%d %H:%M:%S\",\n\t\t\t\t localtime(&rawtime));\n\t\t\tsprintf(buf, \"%s\", timebuff);\n\t\t\tsetCursor(display_offset, y);\n\t}\n\tprint_strln(buf);\n}\n\nchar *get_ip_addr(char *ifname) {\n\tint n;\n\tstruct ifreq ifr;\n\n\tn = socket(AF_INET, SOCK_DGRAM, 0);\n\t// Type of address to retrieve - IPv4 IP address\n\tifr.ifr_addr.sa_family = AF_INET;\n\t// Copy the interface name in the ifreq structure\n\tstrncpy(ifr.ifr_name, ifname, IFNAMSIZ - 1);\n\tioctl(n, SIOCGIFADDR, &ifr);\n\tclose(n);\n\treturn inet_ntoa(((struct sockaddr_in *)&ifr.ifr_addr)->sin_addr);\n}\n\nvoid testip(int mode, int y, char *ifname) {\n\tsetTextSize(1);\n\tswitch (mode) {\n\t\tcase CENTER:\n\t\t\tsetTextSize(1);\n\t\t\tsprintf(buf, \"%s\", get_ip_addr(ifname));\n\t\t\tsetCursor((127 - strlen(buf) * 6) / 2, y + 4);\n\t\t\tbreak;\n\n\t\tcase FULL:\n\t\t\tsetTextSize(1);\n\t\t\tsprintf(buf, \"IP:%s\", get_ip_addr(ifname));\n\t\t\tsetCursor(display_offset, y);\n\t}\n\tprint_strln(buf);\n}\n\nvoid testcputemp(int mode, int y) {\n\tif ((fp = fopen(TEMPPATH, \"r\")) != NULL) {\n\t\tif (fgets(content_buff, TEMPSIZE, fp))\n\t\t\t;\n\t\tfclose(fp);\n\t\tswitch (mode) {\n\t\t\tcase CENTER:\n\t\t\t\tsetTextSize(2);\n\t\t\t\tsprintf(buf, \"%.2f\",\n\t\t\t\t\tatoi(content_buff) / 100.0);\n\t\t\t\tsetCursor(\n\t\t\t\t    (127 - (strlen(buf) + 2) * 11) / 2 - 4, y);\n\t\t\t\tprint_str(buf);\n\t\t\t\toled_write(0);\n\t\t\t\toled_write(67);\n\t\t\t\tdrawCircle(getCursorX() - 16, getCursorY() + 3,\n\t\t\t\t\t   2, WHITE);\n\t\t\t\tbreak;\n\t\t\tcase FULL:\n\t\t\t\tsetTextSize(1);\n\t\t\t\tsprintf(buf, \"CPU TEMP:%.2f\",\n\t\t\t\t\tatoi(content_buff) / 100.0);\n\t\t\t\tsetCursor(display_offset, y);\n\t\t\t\tprint_str(buf);\n\t\t\t\toled_write(0);\n\t\t\t\toled_write(67);\n\t\t\t\tdrawCircle(getCursorX() - 8, getCursorY() + 1,\n\t\t\t\t\t   1, WHITE);\n\t\t}\n\t}\n}\n\nvoid testcpufreq(int mode, int y) {\n\tif ((fp = fopen(FREQPATH, \"r\")) != NULL) {\n\t\tif (fgets(content_buff, FREQSIZE, fp))\n\t\t\t;\n\t\tfclose(fp);\n\t\tswitch (mode) {\n\t\t\tcase CENTER:\n\t\t\t\tsetTextSize(2);\n\t\t\t\tsprintf(buf, \"%4dMHz\",\n\t\t\t\t\tatoi(content_buff) / 1000);\n\t\t\t\tsetCursor((127 - strlen(buf) * 11) / 2 - 4, y);\n\t\t\t\tbreak;\n\t\t\tcase FULL:\n\t\t\t\tsetTextSize(1);\n\t\t\t\tsprintf(buf, \"CPU FREQ:%4dMHz\",\n\t\t\t\t\tatoi(content_buff) / 1000);\n\t\t\t\tsetCursor(display_offset, y);\n\t\t}\n\t\tprint_strln(buf);\n\t}\n}\n\nvoid testnetspeed(int mode, int y, unsigned long int rx, unsigned long int tx) {\n\tchar tx_str[8], rx_str[8];\n\n\tif (tx < KB_BYTES) {\n\t\tsprintf(tx_str, \"%4dB \", (unsigned int)tx);\n\t} else if (tx >= MB_BYTES) {\n\t\tsprintf(tx_str, \"%4dM \", (unsigned int)tx / MB_BYTES);\n\t} else {\n\t\tsprintf(tx_str, \"%4dK \", (unsigned int)tx / KB_BYTES);\n\t}\n\n\tif (rx < KB_BYTES) {\n\t\tsprintf(rx_str, \"%4dB \", (unsigned int)rx);\n\t} else if (rx >= MB_BYTES) {\n\t\tsprintf(rx_str, \"%4dM \", (unsigned int)rx / MB_BYTES);\n\t} else {\n\t\tsprintf(rx_str, \"%4dK \", (unsigned int)rx / KB_BYTES);\n\t}\n\n\t// printf(\"rxspeed: %s txspeed: %s\\n\", rx_str, tx_str);\n\tswitch (mode) {\n\t\tcase SPLIT:\n\t\t\tsetTextSize(2);\n\t\t\tstrcpy(buf, tx_str);\n\t\t\tsetCursor((127 - (strlen(buf) + 1) * 11) / 2, 0);\n\t\t\toled_write(24);\n\t\t\tprint_str(buf);\n\n\t\t\tstrcpy(buf, rx_str);\n\t\t\tsetCursor((127 - (strlen(buf) + 1) * 11) / 2, 16);\n\t\t\toled_write(25);\n\t\t\tprint_str(buf);\n\t\t\tbreak;\n\t\tcase MERGE:\n\t\t\tsetTextSize(1);\n\t\t\tstrcpy(buf, tx_str);\n\t\t\tsetCursor((127 - (2 * strlen(buf) - 1) * 6) / 2 - 4,\n\t\t\t\t  y + 4);\n\t\t\toled_write(24);\n\t\t\tprint_str(buf);\n\n\t\t\tstrcpy(buf, rx_str);\n\t\t\toled_write(25);\n\t\t\tprint_str(buf);\n\t\t\tbreak;\n\t\tcase FULL:\n\t\t\tsetTextSize(1);\n\t\t\tsetCursor(display_offset, y);\n\t\t\toled_write(24);\n\t\t\tstrcpy(buf, tx_str);\n\t\t\tprint_str(buf);\n\n\t\t\toled_write(25);\n\t\t\tstrcpy(buf, rx_str);\n\t\t\tprint_str(buf);\n\t}\n}\n\nvoid testcpu(int y) {\n\t// freq\n\tsetTextSize(1);\n\tsetCursor(display_offset, y);\n\tif ((fp = fopen(FREQPATH, \"r\")) != NULL) {\n\t\tif (fgets(content_buff, FREQSIZE, fp))\n\t\t\t;\n\t\tfclose(fp);\n\t\tsprintf(buf, \"CPU:%4dMHz \", atoi(content_buff) / 1000);\n\t\tprint_str(buf);\n\t}\n\n\t// temp\n\tif ((fp = fopen(TEMPPATH, \"r\")) != NULL) {\n\t\tif (fgets(content_buff, TEMPSIZE, fp))\n\t\t\t;\n\t\tfclose(fp);\n\t\tsprintf(buf, \"%.2f\", atoi(content_buff) / 100.0);\n\t\tprint_str(buf);\n\t\toled_write(0);\n\t\toled_write(67);\n\t\tdrawCircle(getCursorX() - 8, getCursorY() + 1, 1, WHITE);\n\t}\n}\n\nvoid testprintinfo() {\n\tsetTextSize(1);\n\tsetTextColor(WHITE);\n\tsetCursor(0, 0);\n\n\t// date\n\ttime_t rawtime;\n\ttime_t curtime;\n\tuint8_t timebuff[TIMESIZE];\n\tcurtime = time(NULL);\n\ttime(&rawtime);\n\tstrftime(timebuff, 80, \"%Y-%m-%d_%w %H:%M:%S\", localtime(&rawtime));\n\tsprintf(buf, \"%s\", timebuff);\n\tprint_strln(buf);\n\n\t// br-lan ip\n\tsprintf(buf, \"IP:%s\", get_ip_addr(\"br-lan\"));\n\tprint_strln(buf);\n\n\t// CPU temp\n\tif ((fp = fopen(FREQPATH, \"r\")) != NULL) {\n\t\tif (fgets(content_buff, FREQSIZE, fp))\n\t\t\t;\n\t\tfclose(fp);\n\t\tsprintf(buf, \"CPU freq:%d MHz \", atoi(content_buff) / 1000);\n\t\tprint_strln(buf);\n\t}\n\n\t// cpu freq\n\tif ((fp = fopen(TEMPPATH, \"r\")) != NULL) {\n\t\tif (fgets(content_buff, TEMPSIZE, fp))\n\t\t\t;\n\t\tfclose(fp);\n\t\tsprintf(buf, \"CPU temp:%.2f C\", atoi(content_buff) / 100.0);\n\t\tprint_strln(buf);\n\t}\n}\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/src/Example_Code/example_app.h",
    "content": "#define CENTER 0  // single item display\n#define SPLIT 1\t  // two items\n#define MERGE 2\n#define FULL 3\n#define KB_BYTES (1024)\n#define MB_BYTES (1024 * 1024)\n#define GB_BYTES (1024 * 1024 * 1024)\n\nvoid testdrawline();\nvoid testdrawrect();\nvoid testfillrect();\nvoid testdrawcircle();\nvoid testdrawroundrect();\nvoid testfillroundrect();\nvoid testdrawtriangle();\nvoid testfilltriangle();\nvoid testdrawchar();\nvoid testscrolltext(char *str);\nvoid display_texts();\nvoid display_bitmap();\nvoid display_invert_normal();\nvoid testdrawbitmap(const unsigned char *bitmap, unsigned char w,\n\t\t    unsigned char h);\nvoid testdrawbitmap_eg();\nvoid deeplyembedded_credits();\nvoid testprintinfo();\nvoid testdate(int mode, int y);\nvoid testip(int mode, int y, char *ifname);\nvoid testcpufreq(int mode, int y);\nvoid testcputemp(int mode, int y);\nvoid testnetspeed(int mode, int y, unsigned long int rx, unsigned long int tx);\nvoid testcpu(int y);\nchar *get_ip_addr(char *ifname);\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/src/Example_Code/main.c",
    "content": "/*\n * Main.c\n *\n *  Created on  : Sep 6, 2017\n *  Author      : Vinay Divakar\n *  Description : Example usage of the SSD1306 Driver API's\n *  Website     : www.deeplyembedded.org\n */\n\n/* Lib Includes */\n#include <getopt.h>\n#include <libconfig.h>\n#include <limits.h>\n#include <pthread.h>\n#include <signal.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n#include <unistd.h>\n\n/* Header Files */\n#include \"I2C.h\"\n#include \"SSD1306_OLED.h\"\n#include \"example_app.h\"\n\n#define NETSPEED_INTERVAL 1000000\n#define DISPLAY_INTERVAL 1000000\n#define TIME_CHECK_INTERVAL 5000000\n\nstruct st_config {\n\tunsigned int disp_date;\n\tunsigned int disp_ip;\n\tchar *ip_if_name;\n\tunsigned int disp_cpu_temp;\n\tunsigned int disp_cpu_freq;\n\tunsigned int disp_net_speed;\n\tchar *speed_if_name;\n\tunsigned int interval;\n\tunsigned int draw_line;\n\tunsigned int draw_rect;\n\tunsigned int fill_rect;\n\tunsigned int draw_circle;\n\tunsigned int draw_round_circle;\n\tunsigned int fill_round_circle;\n\tunsigned int draw_triangle;\n\tunsigned int fill_triangle;\n\tunsigned int disp_bitmap;\n\tunsigned int disp_invert_normal;\n\tunsigned int draw_bitmap_eg;\n\tunsigned int scroll;\n\tchar *scroll_text;\n\tchar *i2c_dev_path;\n\tunsigned int rotate;\n\tunsigned int need_init;\n\tint from;\n\tint to;\n};\n\nstatic void printHelp() {\n\tprintf(\n\t    \"\\n\\\nUsage: oled [options] ...\\n\\\nOptions:\\n\\\n  --help or -h                      Display this information.\\n\\\n  --version or -v                   Display compiler version information.\\n\\\n\\n\\\n  --config=file or -c file          Specify configuration file.\\n\\\n\\n\\\n  --i2cDevPath=path or -d path      Specify the i2c device, default is /dev/i2c-0.\\n\\\n  --from=minutes or -f minites      Specify the time(in minutes of day) to start displaying, default is 0.\\n\\\n  --to=minutes or -t minites        Specify the time(in minutes of day) to stop displaying, default is 1440.\\n\\\n  --neetInit or -N                  Turn on init, default is on.\\n\\\n  --interval=n or -l n              Specify the display interval, default is 60(s).\\n\\\n  --displayInvertNormal or -I       Turn on the invert normal mode.\\n\\\n  --rotate or -H                    Turn on rotate.\\n\\\n\\n\\\n  --displayDate or -D               Turn on the date display.\\n\\\n  --displayIp or -A                 Turn on the IP address display.\\n\\\n  --ipIfName=ifname or -a ifname    Specify the eth device to display the ip address, default is br-lan.\\n\\\n  --displayNetSpeed or -S           Turn on the net speed display.\\n\\\n  --speedIfName=ifname or -s ifname Specify the eth device to display the net speed, default is eth0.\\n\\\n  --displayCpuTemp or -T            Turn on the CPU temperature.\\n\\\n  --displayCpuFreq or -F            Turn on the CPU frequency.\\n\\\n\\n\\\n  --drawLine or -L                  Turn on draw line.\\n\\\n  --drawRect or -W                  Turn on draw rect.\\n\\\n  --fillRect or -w                  Turn on fill rect.\\n\\\n  --drawCircle or -C                Turn on draw circle.\\n\\\n  --drawRoundCircle or -R           Turn on draw round circle.\\n\\\n  --fillRoundCircle or -r           Turn on fill round circle.\\n\\\n  --drawTriangle or -G              Turn on draw triangle.\\n\\\n  --fillTriangle or -g              Turn on fill triangle.\\n\\\n  --displayBitmap or -B             Turn on display bitmap.\\n\\\n  --drawBitmapEg or -E              Turn on draw bitmap eg.\\n\\\n  --scroll or -O                    Turn on scroll text.\\n\\\n  --scrollText=text or -o text      Specify the scroll text, default is 'Hello world'.\\n\\\n\\n\");\n}\n\nstatic void printVersion() {\n\t// Code to print version information\n\tprintf(\"Version: 1.0\\n\");\n}\n\nstatic void read_conf_file(const char *filename, struct st_config *stcfg) {\n\tconfig_t cfg;\n\tconfig_init(&cfg);\n\tchar *buff;\n\n\tif (!config_read_file(&cfg, filename)) {\n\t\tfprintf(stderr, \"Error reading configuration file: %s\\n\",\n\t\t\tconfig_error_text(&cfg));\n\t\tconfig_destroy(&cfg);\n\t\texit(EXIT_FAILURE);\n\t}\n\n\tconfig_lookup_int(&cfg, \"displayDate\", &stcfg->disp_date);\n\tconfig_lookup_int(&cfg, \"displayIp\", &stcfg->disp_ip);\n\n\tif (config_lookup_string(&cfg, \"ipIfName\", (const char **)&buff)) {\n\t\tsprintf(stcfg->ip_if_name, \"%s\", buff);\n\t}\n\n\tconfig_lookup_int(&cfg, \"displayCpuTemp\", &stcfg->disp_cpu_temp);\n\tconfig_lookup_int(&cfg, \"displayCpuFreq\", &stcfg->disp_cpu_freq);\n\tconfig_lookup_int(&cfg, \"displayNetSpeed\", &stcfg->disp_net_speed);\n\n\tif (config_lookup_string(&cfg, \"speedIfName\", (const char **)&buff)) {\n\t\tsprintf(stcfg->speed_if_name, \"%s\", buff);\n\t}\n\n\tconfig_lookup_int(&cfg, \"interval\", &stcfg->interval);\n\tconfig_lookup_int(&cfg, \"drawLine\", &stcfg->draw_line);\n\tconfig_lookup_int(&cfg, \"drawRect\", &stcfg->draw_rect);\n\tconfig_lookup_int(&cfg, \"fillRect\", &stcfg->fill_rect);\n\tconfig_lookup_int(&cfg, \"drawCircle\", &stcfg->draw_circle);\n\tconfig_lookup_int(&cfg, \"drawRoundCircle\", &stcfg->draw_round_circle);\n\tconfig_lookup_int(&cfg, \"fillRoundCircle\", &stcfg->fill_round_circle);\n\tconfig_lookup_int(&cfg, \"drawTriangle\", &stcfg->draw_triangle);\n\tconfig_lookup_int(&cfg, \"fillTriangle\", &stcfg->fill_triangle);\n\tconfig_lookup_int(&cfg, \"displayBitmap\", &stcfg->disp_bitmap);\n\tconfig_lookup_int(&cfg, \"displayInvertNormal\",\n\t\t\t  &stcfg->disp_invert_normal);\n\tconfig_lookup_int(&cfg, \"drawBitmapEg\", &stcfg->draw_bitmap_eg);\n\tconfig_lookup_int(&cfg, \"scroll\", &stcfg->scroll);\n\n\tif (config_lookup_string(&cfg, \"scrollText\", (const char **)&buff)) {\n\t\tsprintf(stcfg->scroll_text, \"%s\", buff);\n\t}\n\n\tif (config_lookup_string(&cfg, \"i2cDevPath\", (const char **)&buff)) {\n\t\tsprintf(stcfg->i2c_dev_path, \"%s\", buff);\n\t}\n\n\tconfig_lookup_int(&cfg, \"rotate\", &stcfg->rotate);\n\tconfig_lookup_int(&cfg, \"needInit\", &stcfg->need_init);\n\tconfig_lookup_int(&cfg, \"from\", &stcfg->from);\n\tconfig_lookup_int(&cfg, \"to\", &stcfg->to);\n\n\tconfig_destroy(&cfg);\n}\n\nstatic int get_current_minitues() {\n\ttime_t rawtime;\n\tstruct tm *info;\n\ttime(&rawtime);\n\tinfo = localtime(&rawtime);\n\t// printf(\"Current local time and date: %s\", asctime(info));\n\t// printf(\"Current minutues: %d\\n\", info->tm_hour * 60 + info->tm_min);\n\treturn (info->tm_hour * 60 + info->tm_min);\n}\n\n/* Oh Compiler-Please leave me as is */\nvolatile unsigned char flag = 0;\n\n/** Shared variable by the threads */\nstatic unsigned long int __shared_rx_speed = 0;\nstatic unsigned long int __shared_tx_speed = 0;\nstatic int __shared_sleeped = 0;\n\n/** Mutual exclusion of the shared variable */\nstatic pthread_mutex_t __mutex_shared_variable =\n    (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER;\n\nstatic pthread_mutex_t __mutex_shared_variable1 =\n    (pthread_mutex_t)PTHREAD_MUTEX_INITIALIZER;\n\n/* thread id */\nstatic pthread_t tid = 0;\nstatic pthread_t tid1 = 0;\n\nstatic float get_uptime() {\n\tFILE *fp1;\n\tfloat uptime = 0, idletime = 0;\n\tif ((fp1 = fopen(\"/proc/uptime\", \"r\")) != NULL) {\n\t\tif (fscanf(fp1, \"%f %f\", &uptime, &idletime))\n\t\t\t;\n\t\tfclose(fp1);\n\t}\n\treturn uptime;\n}\n\nstatic void *pth_time_check(void *arg) {\n\tint now;\n\tstruct st_config *stcfg;\n\tstcfg = (struct st_config *)arg;\n\twhile (1) {\n\t\t// Work only during specified time periods\n\t\tnow = get_current_minitues();\n\t\tpthread_mutex_lock(&__mutex_shared_variable1);\n\t\t{\n\t\t\tif (stcfg->from != stcfg->to &&\n\t\t\t    (now < stcfg->from || now >= stcfg->to)) {\n\t\t\t\tif (__shared_sleeped == 0) {\n\t\t\t\t\tclearDisplay();\n\t\t\t\t\tDisplay();\n\t\t\t\t}\n\t\t\t\t__shared_sleeped = 1;\n\t\t\t} else {\n\t\t\t\t__shared_sleeped = 0;\n\t\t\t}\n\t\t}\n\t\tpthread_mutex_unlock(&__mutex_shared_variable1);\n\t\tusleep(TIME_CHECK_INTERVAL);\n\t}\n}\n\nstatic inline int get_sleep_flag() {\n\tint flag;\n\tpthread_mutex_lock(&__mutex_shared_variable1);\n\t{ flag = __shared_sleeped; }\n\tpthread_mutex_unlock(&__mutex_shared_variable1);\n\treturn flag;\n}\n\nstatic void *pth_netspeed(char *ifname) {\n\tchar rxbytes_path[80];\n\tchar txbytes_path[80];\n\tunsigned long long int llu_bytes;\n\tunsigned long int rx_bytes = 0, tx_bytes = 0, last_rx_bytes = 0,\n\t\t\t  last_tx_bytes = 0;\n\tunsigned long int rx_speed, tx_speed;\n\tFILE *fp1;\n\tfloat last_uptime, uptime;\n\n\tsprintf(rxbytes_path, \"/sys/class/net/%s/statistics/rx_bytes\", ifname);\n\tsprintf(txbytes_path, \"/sys/class/net/%s/statistics/tx_bytes\", ifname);\n\tlast_uptime = get_uptime();\n\twhile (1) {\n\t\tuptime = get_uptime();\n\t\tif ((fp1 = fopen(rxbytes_path, \"r\")) != NULL) {\n\t\t\tif (fscanf(fp1, \"%llu\", &llu_bytes))\n\t\t\t\t;\n\t\t\tfclose(fp1);\n\t\t\trx_bytes = llu_bytes % ULONG_MAX;\n\t\t} else {\n\t\t\tlast_uptime = uptime;\n\t\t\tusleep(NETSPEED_INTERVAL);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ((fp1 = fopen(txbytes_path, \"r\")) != NULL) {\n\t\t\tif (fscanf(fp1, \"%llu\", &llu_bytes))\n\t\t\t\t;\n\t\t\tfclose(fp1);\n\t\t\ttx_bytes = llu_bytes % ULONG_MAX;\n\t\t} else {\n\t\t\tlast_uptime = uptime;\n\t\t\tusleep(NETSPEED_INTERVAL);\n\t\t\tcontinue;\n\t\t}\n\n\t\tif ((last_rx_bytes == 0 && last_tx_bytes == 0) ||\n\t\t    (rx_bytes < last_rx_bytes) || (tx_bytes < last_tx_bytes) ||\n\t\t    (uptime <= last_uptime)) {\n\t\t\tlast_rx_bytes = rx_bytes;\n\t\t\tlast_tx_bytes = tx_bytes;\n\t\t} else {\n\t\t\trx_speed =\n\t\t\t    (rx_bytes - last_rx_bytes) / (uptime - last_uptime);\n\t\t\ttx_speed =\n\t\t\t    (tx_bytes - last_tx_bytes) / (uptime - last_uptime);\n\n\t\t\t// write shared variables;\n\t\t\tpthread_mutex_lock(&__mutex_shared_variable);\n\t\t\t{\n\t\t\t\t__shared_rx_speed = rx_speed;\n\t\t\t\t__shared_tx_speed = tx_speed;\n\t\t\t}\n\t\t\tpthread_mutex_unlock(&__mutex_shared_variable);\n\n\t\t\tlast_rx_bytes = rx_bytes;\n\t\t\tlast_tx_bytes = tx_bytes;\n\t\t}\n\t\tlast_uptime = uptime;\n\t\tusleep(NETSPEED_INTERVAL);\n\t}\n}\n\n/* Alarm Signal Handler */\nvoid ALARMhandler(int sig) {\n\t/* Set flag */\n\tflag = 5;\n}\n\nvoid BreakDeal(int sig) {\n\tprintf(\"Recived a KILL signal!\\n\");\n\tif (tid != 0) {\n\t\tpthread_cancel(tid);\n\t\tpthread_join(tid, NULL);\n\t}\n\tif (tid1 != 0) {\n\t\tpthread_cancel(tid1);\n\t\tpthread_join(tid1, NULL);\n\t}\n\tclearDisplay();\n\tusleep(DISPLAY_INTERVAL);\n\tDisplay();\n\texit(0);\n}\n\nint main(int argc, char *argv[]) {\n\tint option;\n\tint option_index = 0;\n\tchar *config_file = NULL;\n\tunsigned long int rx_speed, tx_speed;\n\tstruct st_config *stcfg;\n\n\tstatic struct option long_options[] = {\n\t    {\"config\", required_argument, 0, 'c'},\n\t    {\"help\", no_argument, 0, 'h'},\n\t    {\"version\", no_argument, 0, 'v'},\n\t    {\"displayDate\", no_argument, 0, 'D'},\n\t    {\"displayIp\", no_argument, 0, 'A'},\n\t    {\"ipIfName\", required_argument, 0, 'a'},\n\t    {\"displayNetSpeed\", no_argument, 0, 'S'},\n\t    {\"speedIfName\", required_argument, 0, 's'},\n\t    {\"displayCpuTemp\", no_argument, 0, 'T'},\n\t    {\"displayCpuFreq\", no_argument, 0, 'F'},\n\t    {\"displayInvertNormal\", no_argument, 0, 'I'},\n\t    {\"interval\", required_argument, 0, 'l'},\n\t    {\"drawLine\", no_argument, 0, 'L'},\n\t    {\"drawRect\", no_argument, 0, 'W'},\n\t    {\"fillRect\", no_argument, 0, 'w'},\n\t    {\"drawCircle\", no_argument, 0, 'C'},\n\t    {\"drawRoundCircle\", no_argument, 0, 'R'},\n\t    {\"fillRoundCircle\", no_argument, 0, 'r'},\n\t    {\"drawTriangle\", no_argument, 0, 'G'},\n\t    {\"fillTriangle\", no_argument, 0, 'g'},\n\t    {\"displayBitmap\", no_argument, 0, 'B'},\n\t    {\"drawBitmapEg\", no_argument, 0, 'E'},\n\t    {\"scroll\", no_argument, 0, 'O'},\n\t    {\"scrollText\", required_argument, 0, 'o'},\n\t    {\"i2cDevPath\", required_argument, 0, 'd'},\n\t    {\"rotate\", no_argument, 0, 'H'},\n\t    {\"needInit\", no_argument, 0, 'N'},\n\t    {\"from\", required_argument, 0, 'f'},\n\t    {\"to\", required_argument, 0, 't'},\n\t    {0, 0, 0, 0}};\n\n\tstcfg = (struct st_config *)malloc(sizeof(struct st_config));\n\tmemset(stcfg, 0, sizeof(struct st_config));\n\n\t/* set default value for config */\n\tstcfg->need_init = 1;\n\tstcfg->interval = 60;\n\tstcfg->from = 0;\n\tstcfg->to = 1440;\n\n\tstcfg->ip_if_name = malloc(sizeof(char) * 20);\n\tsprintf(stcfg->ip_if_name, \"br-lan\");\n\n\tstcfg->speed_if_name = malloc(sizeof(char) * 20);\n\tsprintf(stcfg->speed_if_name, \"eth0\");\n\n\tstcfg->scroll_text = malloc(sizeof(char) * 100);\n\tsprintf(stcfg->scroll_text, \"Hello\");\n\n\tstcfg->i2c_dev_path = malloc(sizeof(char) * 20);\n\tsprintf(stcfg->i2c_dev_path, \"%s\", I2C_DEV0_PATH);\n\t/* The end of set default value for config */\n\n\twhile ((option = getopt_long(argc, argv,\n\t\t\t\t     \"c:hvDAa:Ss:TFIl:LWwCRrGgBEOo:d:HNf:t:\",\n\t\t\t\t     long_options, &option_index)) != -1) {\n\t\tswitch (option) {\n\t\t\tcase 'c':\n\t\t\t\tconfig_file = optarg;\n\t\t\t\tbreak;\n\t\t\tcase 'h':\n\t\t\t\tprintHelp();\n\t\t\t\texit(EXIT_SUCCESS);\n\t\t\tcase 'v':\n\t\t\t\tprintVersion();\n\t\t\t\texit(EXIT_SUCCESS);\n\t\t\tcase '?':\n\t\t\t\t// Invalid option or missing argument\n\t\t\t\texit(EXIT_FAILURE);\n\t\t\tdefault:\n\t\t\t\t// Handle other parameters\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (config_file != NULL) {\n\t\t// Read parameters from the configuration file\n\t\tread_conf_file(config_file, stcfg);\n\t}\n\n\t// Update config from the command params\n\toptind = 0;\n\twhile ((option = getopt_long(argc, argv,\n\t\t\t\t     \"c:hvDAa:Ss:TFIl:LWwCRrGgBEOo:d:HNf:t:\",\n\t\t\t\t     long_options, &option_index)) != -1) {\n\t\tswitch (option) {\n\t\t\tcase 'D':\n\t\t\t\tstcfg->disp_date = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'A':\n\t\t\t\tstcfg->disp_ip = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'a':\n\t\t\t\tsprintf(stcfg->ip_if_name, \"%s\", optarg);\n\t\t\t\tbreak;\n\t\t\tcase 'S':\n\t\t\t\tstcfg->disp_net_speed = 1;\n\t\t\t\tbreak;\n\t\t\tcase 's':\n\t\t\t\tsprintf(stcfg->speed_if_name, \"%s\", optarg);\n\t\t\t\tbreak;\n\t\t\tcase 'T':\n\t\t\t\tstcfg->disp_cpu_temp = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'F':\n\t\t\t\tstcfg->disp_cpu_freq = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'I':\n\t\t\t\tstcfg->disp_invert_normal = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'l':\n\t\t\t\tstcfg->interval = atoi(optarg);\n\t\t\t\tbreak;\n\t\t\tcase 'L':\n\t\t\t\tstcfg->draw_line = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'W':\n\t\t\t\tstcfg->draw_rect = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'w':\n\t\t\t\tstcfg->fill_rect = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'C':\n\t\t\t\tstcfg->draw_circle = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'R':\n\t\t\t\tstcfg->draw_round_circle = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'r':\n\t\t\t\tstcfg->fill_round_circle = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'G':\n\t\t\t\tstcfg->draw_triangle = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'g':\n\t\t\t\tstcfg->fill_triangle = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'B':\n\t\t\t\tstcfg->disp_bitmap = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'E':\n\t\t\t\tstcfg->draw_bitmap_eg = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'O':\n\t\t\t\tstcfg->scroll = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'o':\n\t\t\t\tsprintf(stcfg->scroll_text, \"%s\", optarg);\n\t\t\t\tbreak;\n\t\t\tcase 'd':\n\t\t\t\tsprintf(stcfg->i2c_dev_path, \"%s\", optarg);\n\t\t\t\tbreak;\n\t\t\tcase 'H':\n\t\t\t\tstcfg->rotate = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'N':\n\t\t\t\tstcfg->need_init = 1;\n\t\t\t\tbreak;\n\t\t\tcase 'f':\n\t\t\t\tstcfg->from = atoi(optarg);\n\t\t\t\tbreak;\n\t\t\tcase 't':\n\t\t\t\tstcfg->to = atoi(optarg);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\t// Handle other parameters\n\t\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (stcfg->i2c_dev_path == NULL)\n\t\tsprintf(stcfg->i2c_dev_path, \"%s\", I2C_DEV0_PATH);\n\n\t/* Initialize I2C bus and connect to the I2C Device */\n\tif (init_i2c_dev(stcfg->i2c_dev_path, SSD1306_OLED_ADDR) == 0) {\n\t\tprintf(\"Successfully connected to I2C device: %s\\n\",\n\t\t       stcfg->i2c_dev_path);\n\t} else {\n\t\tprintf(\"Oops! There seems to be something wrong: %s\\n\",\n\t\t       stcfg->i2c_dev_path);\n\t\texit(EXIT_FAILURE);\n\t}\n\n\tif (stcfg->disp_net_speed == 1 &&\n\t    strcmp(stcfg->speed_if_name, \"\") != 0) {\n\t\tpthread_create(&tid, NULL, (void *)pth_netspeed,\n\t\t\t       stcfg->speed_if_name);\n\t}\n\n\t/* Run SDD1306 Initialization Sequence */\n\tif (stcfg->need_init == 1) display_Init_seq();\n\n\tif (stcfg->rotate == 1)\n\t\tdisplay_rotate();\n\telse\n\t\tdisplay_normal();\n\n\t/* Clear display */\n\tclearDisplay();\n\n\tif (stcfg->from <= 0 || stcfg->from > 1440) {\n\t\tstcfg->from = 0;\n\t}\n\n\tif (stcfg->to <= 0 || stcfg->to > 1440) {\n\t\tstcfg->to = 1440;\n\t}\n\n\tif (stcfg->from > stcfg->to) {\n\t\tint temp = stcfg->from;\n\t\tstcfg->from = stcfg->to;\n\t\tstcfg->to = temp;\n\t}\n\n\tpthread_create(&tid1, NULL, (void *)pth_time_check, (void *)stcfg);\n\n\t/* Register the Alarm Handler */\n\tsignal(SIGALRM, ALARMhandler);\n\tsignal(SIGINT, BreakDeal);\n\tsignal(SIGTERM, BreakDeal);\n\n\t// draw a single pixel\n\t//    drawPixel(0, 1, WHITE);\n\t//    Display();\n\t//    usleep(DISPLAY_INTERVAL);\n\t//    clearDisplay();\n\n\t// draw many lines\n\twhile (1) {\n\t\tif (get_sleep_flag() == 0 && stcfg->scroll) {\n\t\t\ttestscrolltext(stcfg->scroll_text);\n\t\t\tusleep(DISPLAY_INTERVAL);\n\t\t\tclearDisplay();\n\t\t}\n\n\t\tif (get_sleep_flag() == 0 && stcfg->draw_line) {\n\t\t\ttestdrawline();\n\t\t\tusleep(DISPLAY_INTERVAL);\n\t\t\tclearDisplay();\n\t\t}\n\n\t\t// draw rectangles\n\t\tif (get_sleep_flag() == 0 && stcfg->draw_rect) {\n\t\t\ttestdrawrect();\n\t\t\tusleep(DISPLAY_INTERVAL);\n\t\t\tclearDisplay();\n\t\t}\n\n\t\t// draw multiple rectangles\n\t\tif (get_sleep_flag() == 0 && stcfg->fill_rect) {\n\t\t\ttestfillrect();\n\t\t\tusleep(DISPLAY_INTERVAL);\n\t\t\tclearDisplay();\n\t\t}\n\n\t\t// draw mulitple circles\n\t\tif (get_sleep_flag() == 0 && stcfg->draw_circle) {\n\t\t\ttestdrawcircle();\n\t\t\tusleep(DISPLAY_INTERVAL);\n\t\t\tclearDisplay();\n\t\t}\n\n\t\t// draw a white circle, 10 pixel radius\n\t\tif (get_sleep_flag() == 0 && stcfg->draw_round_circle) {\n\t\t\ttestdrawroundrect();\n\t\t\tusleep(DISPLAY_INTERVAL);\n\t\t\tclearDisplay();\n\t\t}\n\n\t\t// Fill the round rectangle\n\t\tif (get_sleep_flag() == 0 && stcfg->fill_round_circle) {\n\t\t\ttestfillroundrect();\n\t\t\tusleep(DISPLAY_INTERVAL);\n\t\t\tclearDisplay();\n\t\t}\n\n\t\t// Draw triangles\n\t\tif (get_sleep_flag() == 0 && stcfg->draw_triangle) {\n\t\t\ttestdrawtriangle();\n\t\t\tusleep(DISPLAY_INTERVAL);\n\t\t\tclearDisplay();\n\t\t}\n\t\t// Fill triangles\n\t\tif (get_sleep_flag() == 0 && stcfg->fill_triangle) {\n\t\t\ttestfilltriangle();\n\t\t\tusleep(DISPLAY_INTERVAL);\n\t\t\tclearDisplay();\n\t\t}\n\n\t\t// Display miniature bitmap\n\t\tif (get_sleep_flag() == 0 && stcfg->disp_bitmap) {\n\t\t\tdisplay_bitmap();\n\t\t\tDisplay();\n\t\t\tusleep(DISPLAY_INTERVAL);\n\t\t};\n\n\t\t// Display Inverted image and normalize it back\n\t\tif (get_sleep_flag() == 0 && stcfg->disp_invert_normal) {\n\t\t\tdisplay_invert_normal();\n\t\t\tclearDisplay();\n\t\t\tusleep(DISPLAY_INTERVAL);\n\t\t\tDisplay();\n\t\t}\n\n\t\t// Generate Signal after 20 Seconds\n\n\t\t// draw a bitmap icon and 'animate' movement\n\t\tif (get_sleep_flag() == 0 && stcfg->draw_bitmap_eg) {\n\t\t\talarm(10);\n\t\t\tflag = 0;\n\t\t\ttestdrawbitmap_eg();\n\t\t\tclearDisplay();\n\t\t\tusleep(DISPLAY_INTERVAL);\n\t\t\tDisplay();\n\t\t}\n\n\t\t// setCursor(0,0);\n\t\tsetTextColor(WHITE);\n\n\t\t// info display\n\t\tint sum = stcfg->disp_date + stcfg->disp_ip +\n\t\t\t  stcfg->disp_cpu_freq + stcfg->disp_cpu_temp +\n\t\t\t  stcfg->disp_net_speed;\n\t\tif (sum == 0) {\n\t\t\tclearDisplay();\n\t\t\tDisplay();\n\t\t\tusleep(DISPLAY_INTERVAL);\n\t\t\tcontinue;\n\t\t}\n\n\t\tfor (int i = 1; i < stcfg->interval; i++) {\n\t\t\tif (get_sleep_flag() == 1) {\n\t\t\t\tusleep(DISPLAY_INTERVAL);\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (sum == 1) {\t // only one item for display\n\t\t\t\tif (stcfg->disp_date) testdate(CENTER, 8);\n\t\t\t\tif (stcfg->disp_ip)\n\t\t\t\t\ttestip(CENTER, 8, stcfg->ip_if_name);\n\t\t\t\tif (stcfg->disp_cpu_freq)\n\t\t\t\t\ttestcpufreq(CENTER, 8);\n\t\t\t\tif (stcfg->disp_cpu_temp)\n\t\t\t\t\ttestcputemp(CENTER, 8);\n\t\t\t\tif (stcfg->disp_net_speed) {\n\t\t\t\t\t// read shared variables;\n\t\t\t\t\tpthread_mutex_lock(\n\t\t\t\t\t    &__mutex_shared_variable);\n\t\t\t\t\t{\n\t\t\t\t\t\trx_speed = __shared_rx_speed;\n\t\t\t\t\t\ttx_speed = __shared_tx_speed;\n\t\t\t\t\t}\n\t\t\t\t\tpthread_mutex_unlock(\n\t\t\t\t\t    &__mutex_shared_variable);\n\n\t\t\t\t\ttestnetspeed(SPLIT, 0, rx_speed,\n\t\t\t\t\t\t     tx_speed);\n\t\t\t\t}\n\t\t\t\tDisplay();\n\t\t\t\tusleep(DISPLAY_INTERVAL);\n\t\t\t\tclearDisplay();\n\t\t\t} else if (sum == 2) {\t// two items for display\n\t\t\t\tif (stcfg->disp_date) {\n\t\t\t\t\ttestdate(CENTER,\n\t\t\t\t\t\t 16 * (stcfg->disp_date - 1));\n\t\t\t\t}\n\t\t\t\tif (stcfg->disp_ip) {\n\t\t\t\t\ttestip(CENTER,\n\t\t\t\t\t       16 * (stcfg->disp_date +\n\t\t\t\t\t\t     stcfg->disp_ip - 1),\n\t\t\t\t\t       stcfg->ip_if_name);\n\t\t\t\t}\n\t\t\t\tif (stcfg->disp_cpu_freq) {\n\t\t\t\t\ttestcpufreq(\n\t\t\t\t\t    CENTER,\n\t\t\t\t\t    16 * (stcfg->disp_date +\n\t\t\t\t\t\t  stcfg->disp_ip +\n\t\t\t\t\t\t  stcfg->disp_cpu_freq - 1));\n\t\t\t\t}\n\t\t\t\tif (stcfg->disp_cpu_temp) {\n\t\t\t\t\ttestcputemp(\n\t\t\t\t\t    CENTER,\n\t\t\t\t\t    16 * (stcfg->disp_date +\n\t\t\t\t\t\t  stcfg->disp_ip +\n\t\t\t\t\t\t  stcfg->disp_cpu_freq +\n\t\t\t\t\t\t  stcfg->disp_cpu_temp - 1));\n\t\t\t\t}\n\t\t\t\tif (stcfg->disp_net_speed) {\n\t\t\t\t\t// read shared variables;\n\t\t\t\t\tpthread_mutex_lock(\n\t\t\t\t\t    &__mutex_shared_variable);\n\t\t\t\t\t{\n\t\t\t\t\t\trx_speed = __shared_rx_speed;\n\t\t\t\t\t\ttx_speed = __shared_tx_speed;\n\t\t\t\t\t}\n\t\t\t\t\tpthread_mutex_unlock(\n\t\t\t\t\t    &__mutex_shared_variable);\n\n\t\t\t\t\ttestnetspeed(\n\t\t\t\t\t    MERGE,\n\t\t\t\t\t    16 * (stcfg->disp_date +\n\t\t\t\t\t\t  stcfg->disp_ip +\n\t\t\t\t\t\t  stcfg->disp_cpu_freq +\n\t\t\t\t\t\t  stcfg->disp_cpu_temp +\n\t\t\t\t\t\t  stcfg->disp_net_speed - 1),\n\t\t\t\t\t    rx_speed, tx_speed);\n\t\t\t\t}\n\t\t\t\tDisplay();\n\t\t\t\tusleep(DISPLAY_INTERVAL);\n\t\t\t\tclearDisplay();\n\t\t\t} else {  // more than two items for display\n\t\t\t\tif (stcfg->disp_date) {\n\t\t\t\t\ttestdate(FULL,\n\t\t\t\t\t\t 8 * (stcfg->disp_date - 1));\n\t\t\t\t}\n\t\t\t\tif (stcfg->disp_ip) {\n\t\t\t\t\ttestip(FULL,\n\t\t\t\t\t       8 * (stcfg->disp_date +\n\t\t\t\t\t\t    stcfg->disp_ip - 1),\n\t\t\t\t\t       stcfg->ip_if_name);\n\t\t\t\t}\n\t\t\t\tif (stcfg->disp_cpu_freq &&\n\t\t\t\t    stcfg->disp_cpu_temp) {\n\t\t\t\t\ttestcpu(8 * (stcfg->disp_date +\n\t\t\t\t\t\t     stcfg->disp_ip));\n\t\t\t\t\tif (stcfg->disp_net_speed) {\n\t\t\t\t\t\t// read shared variables;\n\t\t\t\t\t\tpthread_mutex_lock(\n\t\t\t\t\t\t    &__mutex_shared_variable);\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trx_speed =\n\t\t\t\t\t\t\t    __shared_rx_speed;\n\t\t\t\t\t\t\ttx_speed =\n\t\t\t\t\t\t\t    __shared_tx_speed;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpthread_mutex_unlock(\n\t\t\t\t\t\t    &__mutex_shared_variable);\n\n\t\t\t\t\t\ttestnetspeed(\n\t\t\t\t\t\t    FULL,\n\t\t\t\t\t\t    8 * (stcfg->disp_date +\n\t\t\t\t\t\t\t stcfg->disp_ip + 1 +\n\t\t\t\t\t\t\t stcfg->disp_net_speed -\n\t\t\t\t\t\t\t 1),\n\t\t\t\t\t\t    rx_speed, tx_speed);\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tif (stcfg->disp_cpu_freq) {\n\t\t\t\t\t\ttestcpufreq(\n\t\t\t\t\t\t    FULL,\n\t\t\t\t\t\t    8 * (stcfg->disp_date +\n\t\t\t\t\t\t\t stcfg->disp_ip +\n\t\t\t\t\t\t\t stcfg->disp_cpu_freq -\n\t\t\t\t\t\t\t 1));\n\t\t\t\t\t}\n\t\t\t\t\tif (stcfg->disp_cpu_temp) {\n\t\t\t\t\t\ttestcputemp(\n\t\t\t\t\t\t    FULL,\n\t\t\t\t\t\t    8 * (stcfg->disp_date +\n\t\t\t\t\t\t\t stcfg->disp_ip +\n\t\t\t\t\t\t\t stcfg->disp_cpu_freq +\n\t\t\t\t\t\t\t stcfg->disp_cpu_temp -\n\t\t\t\t\t\t\t 1));\n\t\t\t\t\t}\n\t\t\t\t\tif (stcfg->disp_net_speed) {\n\t\t\t\t\t\t// read shared variables;\n\t\t\t\t\t\tpthread_mutex_lock(\n\t\t\t\t\t\t    &__mutex_shared_variable);\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\trx_speed =\n\t\t\t\t\t\t\t    __shared_rx_speed;\n\t\t\t\t\t\t\ttx_speed =\n\t\t\t\t\t\t\t    __shared_tx_speed;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tpthread_mutex_unlock(\n\t\t\t\t\t\t    &__mutex_shared_variable);\n\n\t\t\t\t\t\ttestnetspeed(\n\t\t\t\t\t\t    FULL,\n\t\t\t\t\t\t    8 * (stcfg->disp_date +\n\t\t\t\t\t\t\t stcfg->disp_ip +\n\t\t\t\t\t\t\t stcfg->disp_cpu_freq +\n\t\t\t\t\t\t\t stcfg->disp_cpu_temp +\n\t\t\t\t\t\t\t stcfg->disp_net_speed -\n\t\t\t\t\t\t\t 1),\n\t\t\t\t\t\t    rx_speed, tx_speed);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tDisplay();\n\t\t\t\tusleep(DISPLAY_INTERVAL);\n\t\t\t\tclearDisplay();\n\t\t\t}\n\t\t} // for\n\t} //while\n\n\tif (stcfg->disp_net_speed == 1 &&\n\t    strcmp(stcfg->speed_if_name, \"\") != 0) {\n\t\tpthread_cancel(tid);\n\t\tpthread_join(tid, NULL);\n\t}\n\n\tif (tid1 != 0) {\n\t\tpthread_cancel(tid1);\n\t\tpthread_join(tid1, NULL);\n\t}\n\n\tclearDisplay();\n\tDisplay();\n\texit(EXIT_SUCCESS);\n}\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/src/I2C_Library/.clang-format",
    "content": "---\nLanguage:        Cpp\n# BasedOnStyle:  Google\nAccessModifierOffset: -1\nAlignAfterOpenBracket: Align\nAlignConsecutiveMacros: false\nAlignConsecutiveAssignments: false\nAlignConsecutiveBitFields: false\nAlignConsecutiveDeclarations: false\nAlignEscapedNewlines: Left\nAlignOperands:   Align\nAlignTrailingComments: true\nAllowAllArgumentsOnNextLine: true\nAllowAllConstructorInitializersOnNextLine: true\nAllowAllParametersOfDeclarationOnNextLine: true\nAllowShortEnumsOnASingleLine: true\nAllowShortBlocksOnASingleLine: Never\nAllowShortCaseLabelsOnASingleLine: false\nAllowShortFunctionsOnASingleLine: All\nAllowShortLambdasOnASingleLine: All\nAllowShortIfStatementsOnASingleLine: WithoutElse\nAllowShortLoopsOnASingleLine: true\nAlwaysBreakAfterDefinitionReturnType: None\nAlwaysBreakAfterReturnType: None\nAlwaysBreakBeforeMultilineStrings: true\nAlwaysBreakTemplateDeclarations: Yes\nBinPackArguments: true\nBinPackParameters: true\nBraceWrapping:\n  AfterCaseLabel:  false\n  AfterClass:      false\n  AfterControlStatement: Never\n  AfterEnum:       false\n  AfterFunction:   false\n  AfterNamespace:  false\n  AfterObjCDeclaration: false\n  AfterStruct:     false\n  AfterUnion:      false\n  AfterExternBlock: false\n  BeforeCatch:     false\n  BeforeElse:      false\n  BeforeLambdaBody: false\n  BeforeWhile:     false\n  IndentBraces:    false\n  SplitEmptyFunction: true\n  SplitEmptyRecord: true\n  SplitEmptyNamespace: true\nBreakBeforeBinaryOperators: None\nBreakBeforeBraces: Attach\nBreakBeforeInheritanceComma: false\nBreakInheritanceList: BeforeColon\nBreakBeforeTernaryOperators: true\nBreakConstructorInitializersBeforeComma: false\nBreakConstructorInitializers: BeforeColon\nBreakAfterJavaFieldAnnotations: false\nBreakStringLiterals: true\nColumnLimit:     80\nCommentPragmas:  '^ IWYU pragma:'\nCompactNamespaces: false\nConstructorInitializerAllOnOneLineOrOnePerLine: true\nConstructorInitializerIndentWidth: 4\nContinuationIndentWidth: 4\nCpp11BracedListStyle: true\nDeriveLineEnding: true\nDerivePointerAlignment: true\nDisableFormat:   false\nExperimentalAutoDetectBinPacking: false\nFixNamespaceComments: true\nForEachMacros:\n  - foreach\n  - Q_FOREACH\n  - BOOST_FOREACH\nIncludeBlocks:   Regroup\nIncludeCategories:\n  - Regex:           '^<ext/.*\\.h>'\n    Priority:        2\n    SortPriority:    0\n  - Regex:           '^<.*\\.h>'\n    Priority:        1\n    SortPriority:    0\n  - Regex:           '^<.*'\n    Priority:        2\n    SortPriority:    0\n  - Regex:           '.*'\n    Priority:        3\n    SortPriority:    0\nIncludeIsMainRegex: '([-_](test|unittest))?$'\nIncludeIsMainSourceRegex: ''\nIndentCaseLabels: true\nIndentCaseBlocks: false\nIndentGotoLabels: true\nIndentPPDirectives: None\nIndentExternBlock: AfterExternBlock\nIndentWidth:     2\nIndentWrappedFunctionNames: false\nInsertTrailingCommas: None\nJavaScriptQuotes: Leave\nJavaScriptWrapImports: true\nKeepEmptyLinesAtTheStartOfBlocks: false\nMacroBlockBegin: ''\nMacroBlockEnd:   ''\nMaxEmptyLinesToKeep: 1\nNamespaceIndentation: None\nObjCBinPackProtocolList: Never\nObjCBlockIndentWidth: 2\nObjCBreakBeforeNestedBlockParam: true\nObjCSpaceAfterProperty: false\nObjCSpaceBeforeProtocolList: true\nPenaltyBreakAssignment: 2\nPenaltyBreakBeforeFirstCallParameter: 1\nPenaltyBreakComment: 300\nPenaltyBreakFirstLessLess: 120\nPenaltyBreakString: 1000\nPenaltyBreakTemplateDeclaration: 10\nPenaltyExcessCharacter: 1000000\nPenaltyReturnTypeOnItsOwnLine: 200\nPointerAlignment: Left\nRawStringFormats:\n  - Language:        Cpp\n    Delimiters:\n      - cc\n      - CC\n      - cpp\n      - Cpp\n      - CPP\n      - 'c++'\n      - 'C++'\n    CanonicalDelimiter: ''\n    BasedOnStyle:    google\n  - Language:        TextProto\n    Delimiters:\n      - pb\n      - PB\n      - proto\n      - PROTO\n    EnclosingFunctions:\n      - EqualsProto\n      - EquivToProto\n      - PARSE_PARTIAL_TEXT_PROTO\n      - PARSE_TEST_PROTO\n      - PARSE_TEXT_PROTO\n      - ParseTextOrDie\n      - ParseTextProtoOrDie\n      - ParseTestProto\n      - ParsePartialTestProto\n    CanonicalDelimiter: ''\n    BasedOnStyle:    google\nReflowComments:  true\nSortIncludes:    true\nSortUsingDeclarations: true\nSpaceAfterCStyleCast: false\nSpaceAfterLogicalNot: false\nSpaceAfterTemplateKeyword: true\nSpaceBeforeAssignmentOperators: true\nSpaceBeforeCpp11BracedList: false\nSpaceBeforeCtorInitializerColon: true\nSpaceBeforeInheritanceColon: true\nSpaceBeforeParens: ControlStatements\nSpaceBeforeRangeBasedForLoopColon: true\nSpaceInEmptyBlock: false\nSpaceInEmptyParentheses: false\nSpacesBeforeTrailingComments: 2\nSpacesInAngles:  false\nSpacesInConditionalStatement: false\nSpacesInContainerLiterals: true\nSpacesInCStyleCastParentheses: false\nSpacesInParentheses: false\nSpacesInSquareBrackets: false\nSpaceBeforeSquareBrackets: false\nStandard:        Auto\nStatementMacros:\n  - Q_UNUSED\n  - QT_REQUIRE_VERSION\nIndentWidth:     8\nTabWidth:        8\nUseCRLF:         false\nUseTab:          Always\nWhitespaceSensitiveMacros:\n  - STRINGIZE\n  - PP_STRINGIZE\n  - BOOST_PP_STRINGIZE\n...\n\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/src/I2C_Library/I2C.c",
    "content": "/*\n * MIT License\n\nCopyright (c) 2017 DeeplyEmbedded\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n * I2C.c\n *\n *  Created on  : September 19, 2017\n *  Author      : Vinay Divakar\n *  Description : This is an I2C Library for the BeagleBone that consists of the\nAPI's to support the standard\n *                I2C operations.\n *  Website     : www.deeplyembedded.org\n */\n\n/*Libs Includes*/\n#include <fcntl.h>\n#include <linux/i2c-dev.h>\n#include <stdio.h>\n#include <sys/ioctl.h>\n#include <unistd.h>\n// heuristic to guess what version of i2c-dev.h we have:\n// the one installed with `apt-get install libi2c-dev`\n// would conflict with linux/i2c.h, while the stock\n// one requires linus/i2c.h\n#ifndef I2C_SMBUS_BLOCK_MAX\n// If this is not defined, we have the \"stock\" i2c-dev.h\n// so we include linux/i2c.h\n#include <linux/i2c.h>\ntypedef unsigned char i2c_char_t;\n#else\ntypedef char i2c_char_t;\n#endif\n\n/* Header Files */\n#include \"I2C.h\"\n\n/* Exposed objects for i2c-x */\nI2C_DeviceT I2C_DEV_2;\n\n/****************************************************************\n * Function Name : Open_device\n * Description   : Opens the I2C device to use\n * Returns       : 0 on success, -1 on failure\n * Params        @i2c_dev_path: Path to the I2C device\n *               @fd: Variable to store the file handler\n ****************************************************************/\nint Open_device(char *i2c_dev_path, int *fd) {\n\tif ((*fd = open(i2c_dev_path, O_RDWR)) < 0)\n\t\treturn -1;\n\telse\n\t\treturn 0;\n}\n\n/****************************************************************\n * Function Name : Close_device\n * Description   : Closes the I2C device in use\n * Returns       : 0 on success, -1 on failure\n * Params        : @fd: file descriptor\n ****************************************************************/\nint Close_device(int fd) {\n\tif (close(fd) == -1)\n\t\treturn -1;\n\telse\n\t\treturn 0;\n}\n\n/****************************************************************\n * Function Name : Set_slave_addr\n * Description   : Connect to the Slave device\n * Returns       : 0 on success, -1 on failure\n * Params        @fd: File descriptor\n *               @slave_addr: Address of the slave device to\n *               talk to.\n ****************************************************************/\nint Set_slave_addr(int fd, unsigned char slave_addr) {\n\tif (ioctl(fd, I2C_SLAVE, slave_addr) < 0)\n\t\treturn -1;\n\telse\n\t\treturn 0;\n}\n\n/****************************************************************\n * Function Name : i2c_write\n * Description   : Write a byte on SDA\n * Returns       : No. of bytes written on success, -1 on failure\n * Params        @fd: File descriptor\n *               @data: data to write on SDA\n ****************************************************************/\nint i2c_write(int fd, unsigned char data) {\n\tint ret = 0;\n\tret = write(fd, &data, I2C_ONE_BYTE);\n\tif ((ret == -1) || (ret != 1))\n\t\treturn -1;\n\telse\n\t\treturn (ret);\n}\n\n/****************************************************************\n * Function Name : i2c_read\n * Description   : Read a byte on SDA\n * Returns       : No. of bytes read on success, -1 on failure\n * Params        @fd: File descriptor\n *               @read_data: Points to the variable  that stores\n *               the read data byte\n ****************************************************************/\nint i2c_read(int fd, unsigned char *read_data) {\n\tint ret = 0;\n\tret = read(fd, &read_data, I2C_ONE_BYTE);\n\tif (ret == -1) perror(\"I2C: Failed to read |\");\n\tif (ret == 0) perror(\"I2C: End of FILE |\");\n\treturn (ret);\n}\n\n/****************************************************************\n * Function Name : i2c_read_register\n * Description   : Read a single register of the slave device\n * Returns       : No. of bytes read on success, -1 on failure\n * Params        @fd: File descriptor\n *               @read_addr: Register address to be read\n *               @read_data: Points to the variable  that stores\n *               the read data byte\n ****************************************************************/\nint i2c_read_register(int fd, unsigned char read_addr,\n\t\t      unsigned char *read_data) {\n\tint ret = 0;\n\tif (i2c_write(fd, read_addr) == -1) {\n\t\tperror(\"I2C: Failed to write |\");\n\t\treturn -1;\n\t}\n\tret = read(fd, &read_data, I2C_ONE_BYTE);\n\tif (ret == -1) perror(\"I2C: Failed to read |\");\n\tif (ret == 0) perror(\"I2C: End of FILE |\");\n\treturn (ret);\n}\n\n/****************************************************************\n * Function Name : i2c_read_registers\n * Description   : Read a multiple registers on the slave device\n *                 from starting address\n * Returns       : No. of bytes read on success, -1 on failure\n * Params        @fd: File descriptor\n *               @num: Number of registers/bytes to read from.\n *               @starting_addr: Starting address to read from\n *               @buff_Ptr: Buffer to store the read bytes\n ****************************************************************/\nint i2c_read_registers(int fd, int num, unsigned char starting_addr,\n\t\t       unsigned char *buff_Ptr) {\n\tint ret = 0;\n\tif (i2c_write(fd, starting_addr) == -1) {\n\t\tperror(\"I2C: Failed to write |\");\n\t\treturn -1;\n\t}\n\tret = read(fd, buff_Ptr, num);\n\tif (ret == -1) perror(\"I2C: Failed to read |\");\n\tif (ret == 0) perror(\"I2C: End of FILE |\");\n\treturn (ret);\n}\n\n/****************************************************************\n * Function Name : i2c_multiple_writes\n * Description   : Write multiple bytes on SDA\n * Returns       : No. of bytes written on success, -1 on failure\n * Params        @fd: file descriptor\n *               @num: No. of bytes to write\n *               @Ptr_buff: Pointer to the buffer containing the\n *               bytes to be written on the SDA\n ****************************************************************/\nint i2c_multiple_writes(int fd, int num, unsigned char *Ptr_buff) {\n\tint ret = 0;\n\tret = write(fd, Ptr_buff, num);\n\tif ((ret == -1) || (ret != num))\n\t\treturn -1;\n\telse\n\t\treturn (ret);\n}\n\n/****************************************************************\n * Function Name : i2c_write_register\n * Description   : Write a control byte or byte to a register\n * Returns       : No. of bytes written on success, -1 on failure\n * Params        @fd: file descriptor\n *               @reg_addr_or_cntrl: Control byte or Register\n *               address to be written\n *               @val: Command or value to be written in the\n *               addressed register\n ****************************************************************/\nint i2c_write_register(int fd, unsigned char reg_addr_or_cntrl,\n\t\t       unsigned char val) {\n\tunsigned char buff[2];\n\tint ret = 0;\n\tbuff[0] = reg_addr_or_cntrl;\n\tbuff[1] = val;\n\tret = write(fd, buff, I2C_TWO_BYTES);\n\tif ((ret == -1) || (ret != I2C_TWO_BYTES))\n\t\treturn -1;\n\telse\n\t\treturn (ret);\n}\n\n/****************************************************************\n * Function Name : config_i2c_struct\n * Description   : Initialize the I2C device structure\n * Returns       : NONE\n * Params        @i2c_dev_path: Device path\n *               @slave_addr: Slave device address\n *               @i2c_dev: Pointer to the device structure\n ****************************************************************/\nvoid config_i2c_struct(char *i2c_dev_path, unsigned char slave_addr,\n\t\t       I2C_DevicePtr i2c_dev) {\n\ti2c_dev->i2c_dev_path = i2c_dev_path;\n\ti2c_dev->fd_i2c = 0;\n\ti2c_dev->i2c_slave_addr = slave_addr;\n}\n\n/****************************************************************\n * Function Name : init_i2c_dev\n * Description   : Connect the i2c bus to the slave device\n * Returns       : 0 on success, -1 on failure\n * Params        @i2c_path: the path to the device\n *               @slave_addr: Slave device address\n ****************************************************************/\nint init_i2c_dev(const char *i2c_path, unsigned char slave_address) {\n\tconfig_i2c_struct((char *)i2c_path, slave_address, &I2C_DEV_2);\n\tif (Open_device(I2C_DEV_2.i2c_dev_path, &I2C_DEV_2.fd_i2c) == -1) {\n\t\tperror(\"I2C: Failed to open device |\");\n\t\treturn -1;\n\t}\n\tif (Set_slave_addr(I2C_DEV_2.fd_i2c, I2C_DEV_2.i2c_slave_addr) == -1) {\n\t\tperror(\"I2C: Failed to connect to slave device |\");\n\t\treturn -1;\n\t}\n\n\treturn 0;\n}\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/src/I2C_Library/I2C.h",
    "content": "/*\n * MIT License\n\nCopyright (c) 2017 DeeplyEmbedded\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n * I2C.h\n *\n *  Created on  : Sep 4, 2017\n *  Author      : Vinay Divakar\n *  Website     : www.deeplyembedded.org\n */\n\n#ifndef I2C_H_\n#define I2C_H_\n\n#include <stdint.h>\n\n/* No. of bytes per transaction */\n#define I2C_ONE_BYTE 1\n#define I2C_TWO_BYTES 2\n#define I2C_THREE_BYTES 3\n\n/*Definitions specific to i2c-x */\n#define I2C_DEV0_PATH \"/dev/i2c-0\"\n#define I2C_DEV1_PATH \"/dev/i2c-1\"\n#define I2C_DEV2_PATH \"/dev/i2c-2\"\n\n/*I2C device configuration structure*/\ntypedef struct {\n\tchar *i2c_dev_path;\n\tint fd_i2c;\n\tunsigned char i2c_slave_addr;\n} I2C_DeviceT, *I2C_DevicePtr;\n\n/* Exposed Generic I2C Functions */\nextern int Open_device(char *i2c_dev_path, int *fd);\nextern int Close_device(int fd);\nextern int Set_slave_addr(int fd, unsigned char slave_addr);\nextern int i2c_write(int fd, unsigned char data);\nextern int i2c_read(int fd, unsigned char *read_data);\nextern int i2c_read_register(int fd, unsigned char read_addr,\n\t\t\t     unsigned char *read_data);\nextern int i2c_read_registers(int fd, int num, unsigned char starting_addr,\n\t\t\t      unsigned char *buff_Ptr);\nextern void config_i2c_struct(char *i2c_dev_path, unsigned char slave_addr,\n\t\t\t      I2C_DevicePtr i2c_dev);\nextern int i2c_multiple_writes(int fd, int num, unsigned char *Ptr_buff);\nextern int i2c_write_register(int fd, unsigned char reg_addr_or_cntrl,\n\t\t\t      unsigned char val);\n\n/* Exposed I2C-x Specific Functions */\nextern int init_i2c_dev(const char *i2c_path, unsigned char slave_address);\n\n#endif /* I2C_H_ */\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/src/Makefile",
    "content": "ifndef CC\nCC = gcc\nendif\nifndef LD\nLD = ld\nendif\n\nSOURCES = SSD1306_OLED_Library/SSD1306_OLED.c Example_Code/main.c Example_Code/example_app.c I2C_Library/I2C.c\nOBJS := $(SOURCES:.c=.o)\nCPPFLAGS := -I SSD1306_OLED_Library -I I2C_Library\nifndef CFLAGS\nCFLAGS := -O2\nendif\nLDFLAGS := -lpthread -lconfig\n\noled: $(OBJS)\n\t$(CC) $^ -o $@ $(LDFLAGS)\n\nssd1306: $(OBJS)\n\t$(CC) $^ -o $@ $(LDFLAGS) --static\n\tstrip $@\n\nclean:\n\trm -rf oled ssd1306 $(OBJS)\n\ncompile: oled\n\ninstall: compile\n\tmkdir -p $(DESTDIR)/usr/bin\n\tcp oled $(DESTDIR)/usr/bin/oled\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/src/SSD1306_OLED_Library/.clang-format",
    "content": "---\nLanguage:        Cpp\n# BasedOnStyle:  Google\nAccessModifierOffset: -1\nAlignAfterOpenBracket: Align\nAlignConsecutiveMacros: false\nAlignConsecutiveAssignments: false\nAlignConsecutiveBitFields: false\nAlignConsecutiveDeclarations: false\nAlignEscapedNewlines: Left\nAlignOperands:   Align\nAlignTrailingComments: true\nAllowAllArgumentsOnNextLine: true\nAllowAllConstructorInitializersOnNextLine: true\nAllowAllParametersOfDeclarationOnNextLine: true\nAllowShortEnumsOnASingleLine: true\nAllowShortBlocksOnASingleLine: Never\nAllowShortCaseLabelsOnASingleLine: false\nAllowShortFunctionsOnASingleLine: All\nAllowShortLambdasOnASingleLine: All\nAllowShortIfStatementsOnASingleLine: WithoutElse\nAllowShortLoopsOnASingleLine: true\nAlwaysBreakAfterDefinitionReturnType: None\nAlwaysBreakAfterReturnType: None\nAlwaysBreakBeforeMultilineStrings: true\nAlwaysBreakTemplateDeclarations: Yes\nBinPackArguments: true\nBinPackParameters: true\nBraceWrapping:\n  AfterCaseLabel:  false\n  AfterClass:      false\n  AfterControlStatement: Never\n  AfterEnum:       false\n  AfterFunction:   false\n  AfterNamespace:  false\n  AfterObjCDeclaration: false\n  AfterStruct:     false\n  AfterUnion:      false\n  AfterExternBlock: false\n  BeforeCatch:     false\n  BeforeElse:      false\n  BeforeLambdaBody: false\n  BeforeWhile:     false\n  IndentBraces:    false\n  SplitEmptyFunction: true\n  SplitEmptyRecord: true\n  SplitEmptyNamespace: true\nBreakBeforeBinaryOperators: None\nBreakBeforeBraces: Attach\nBreakBeforeInheritanceComma: false\nBreakInheritanceList: BeforeColon\nBreakBeforeTernaryOperators: true\nBreakConstructorInitializersBeforeComma: false\nBreakConstructorInitializers: BeforeColon\nBreakAfterJavaFieldAnnotations: false\nBreakStringLiterals: true\nColumnLimit:     80\nCommentPragmas:  '^ IWYU pragma:'\nCompactNamespaces: false\nConstructorInitializerAllOnOneLineOrOnePerLine: true\nConstructorInitializerIndentWidth: 4\nContinuationIndentWidth: 4\nCpp11BracedListStyle: true\nDeriveLineEnding: true\nDerivePointerAlignment: true\nDisableFormat:   false\nExperimentalAutoDetectBinPacking: false\nFixNamespaceComments: true\nForEachMacros:\n  - foreach\n  - Q_FOREACH\n  - BOOST_FOREACH\nIncludeBlocks:   Regroup\nIncludeCategories:\n  - Regex:           '^<ext/.*\\.h>'\n    Priority:        2\n    SortPriority:    0\n  - Regex:           '^<.*\\.h>'\n    Priority:        1\n    SortPriority:    0\n  - Regex:           '^<.*'\n    Priority:        2\n    SortPriority:    0\n  - Regex:           '.*'\n    Priority:        3\n    SortPriority:    0\nIncludeIsMainRegex: '([-_](test|unittest))?$'\nIncludeIsMainSourceRegex: ''\nIndentCaseLabels: true\nIndentCaseBlocks: false\nIndentGotoLabels: true\nIndentPPDirectives: None\nIndentExternBlock: AfterExternBlock\nIndentWidth:     2\nIndentWrappedFunctionNames: false\nInsertTrailingCommas: None\nJavaScriptQuotes: Leave\nJavaScriptWrapImports: true\nKeepEmptyLinesAtTheStartOfBlocks: false\nMacroBlockBegin: ''\nMacroBlockEnd:   ''\nMaxEmptyLinesToKeep: 1\nNamespaceIndentation: None\nObjCBinPackProtocolList: Never\nObjCBlockIndentWidth: 2\nObjCBreakBeforeNestedBlockParam: true\nObjCSpaceAfterProperty: false\nObjCSpaceBeforeProtocolList: true\nPenaltyBreakAssignment: 2\nPenaltyBreakBeforeFirstCallParameter: 1\nPenaltyBreakComment: 300\nPenaltyBreakFirstLessLess: 120\nPenaltyBreakString: 1000\nPenaltyBreakTemplateDeclaration: 10\nPenaltyExcessCharacter: 1000000\nPenaltyReturnTypeOnItsOwnLine: 200\nPointerAlignment: Left\nRawStringFormats:\n  - Language:        Cpp\n    Delimiters:\n      - cc\n      - CC\n      - cpp\n      - Cpp\n      - CPP\n      - 'c++'\n      - 'C++'\n    CanonicalDelimiter: ''\n    BasedOnStyle:    google\n  - Language:        TextProto\n    Delimiters:\n      - pb\n      - PB\n      - proto\n      - PROTO\n    EnclosingFunctions:\n      - EqualsProto\n      - EquivToProto\n      - PARSE_PARTIAL_TEXT_PROTO\n      - PARSE_TEST_PROTO\n      - PARSE_TEXT_PROTO\n      - ParseTextOrDie\n      - ParseTextProtoOrDie\n      - ParseTestProto\n      - ParsePartialTestProto\n    CanonicalDelimiter: ''\n    BasedOnStyle:    google\nReflowComments:  true\nSortIncludes:    true\nSortUsingDeclarations: true\nSpaceAfterCStyleCast: false\nSpaceAfterLogicalNot: false\nSpaceAfterTemplateKeyword: true\nSpaceBeforeAssignmentOperators: true\nSpaceBeforeCpp11BracedList: false\nSpaceBeforeCtorInitializerColon: true\nSpaceBeforeInheritanceColon: true\nSpaceBeforeParens: ControlStatements\nSpaceBeforeRangeBasedForLoopColon: true\nSpaceInEmptyBlock: false\nSpaceInEmptyParentheses: false\nSpacesBeforeTrailingComments: 2\nSpacesInAngles:  false\nSpacesInConditionalStatement: false\nSpacesInContainerLiterals: true\nSpacesInCStyleCastParentheses: false\nSpacesInParentheses: false\nSpacesInSquareBrackets: false\nSpaceBeforeSquareBrackets: false\nStandard:        Auto\nStatementMacros:\n  - Q_UNUSED\n  - QT_REQUIRE_VERSION\nIndentWidth:     8\nTabWidth:        8\nUseCRLF:         false\nUseTab:          Always\nWhitespaceSensitiveMacros:\n  - STRINGIZE\n  - PP_STRINGIZE\n  - BOOST_PP_STRINGIZE\n...\n\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/src/SSD1306_OLED_Library/SSD1306_OLED.c",
    "content": "/*\n * MIT License\n\nCopyright (c) 2017 DeeplyEmbedded\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n * SSD1306_OLED.c\n *\n *  Created on  : Sep 26, 2017\n *  Author      : Vinay Divakar\n *  Description : SSD1306 OLED Driver, Graphics API's.\n *  Website     : www.deeplyembedded.org\n */\n\n/* Lib Includes */\n#include \"SSD1306_OLED.h\"\n\n#include <math.h>\n#include <stdint.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"I2C.h\"\n#include \"gfxfont.h\"\n\n/* Enable or Disable DEBUG Prints */\n//#define SSD1306_DBG\n\n/* MACROS */\n#define SWAP(x, y)          \\\n\t{                   \\\n\t\tshort temp; \\\n\t\ttemp = x;   \\\n\t\tx = y;      \\\n\t\ty = temp;   \\\n\t}\n#define pgm_read_byte(addr) (*(const unsigned char *)(addr))\n#define pgm_read_word(addr) (*(const unsigned long *)(addr))\n#define pgm_read_dword(addr) (*(const unsigned long *)(addr))\n#define pgm_read_pointer(addr) ((void *)pgm_read_word(addr))\n\n/* static Variables */\nstatic unsigned char _rotation = 0, textsize = 0;\nstatic short _width = SSD1306_LCDWIDTH;\nstatic short _height = SSD1306_LCDHEIGHT;\nstatic short cursor_x = 0, cursor_y = 0, textcolor = 0, textbgcolor = 0;\nstatic bool _cp437 = false, wrap = true;\n\n/* static struct objects */\nstatic GFXfontPtr gfxFont;\n\n/* Externs - I2C.c */\nextern I2C_DeviceT I2C_DEV_2;\n\n/* Chunk Buffer */\nstatic unsigned char chunk[17] = {0};\n\n/* Memory buffer for displaying data on LCD - This is an Apple - Fruit */\nstatic unsigned char screen[DISPLAY_BUFF_SIZE] = {0};\n\n/* Static Functions */\nstatic void transfer();\nstatic void drawFastVLine(short x, short y, short h, short color);\nstatic void writeFastVLine(short x, short y, short h, short color);\nstatic void drawFastHLine(short x, short y, short w, short color);\nstatic void writeFastHLine(short x, short y, short w, short color);\nstatic short print(const unsigned char *buffer, short size);\n\n// Standard ASCII 5x7 font\nstatic const unsigned char ssd1306_font5x7[] = {\n    0x00, 0x00, 0x00, 0x00, 0x00,  // space\n    0x3E, 0x5B, 0x4F, 0x5B, 0x3E, 0x3E, 0x6B, 0x4F, 0x6B, 0x3E, 0x1C,\n    0x3E, 0x7C, 0x3E, 0x1C, 0x18, 0x3C, 0x7E, 0x3C, 0x18, 0x1C, 0x57,\n    0x7D, 0x57, 0x1C, 0x1C, 0x5E, 0x7F, 0x5E, 0x1C, 0x00, 0x18, 0x3C,\n    0x18, 0x00, 0xFF, 0xE7, 0xC3, 0xE7, 0xFF, 0x00, 0x18, 0x24, 0x18,\n    0x00, 0xFF, 0xE7, 0xDB, 0xE7, 0xFF, 0x30, 0x48, 0x3A, 0x06, 0x0E,\n    0x26, 0x29, 0x79, 0x29, 0x26, 0x40, 0x7F, 0x05, 0x05, 0x07, 0x40,\n    0x7F, 0x05, 0x25, 0x3F, 0x5A, 0x3C, 0xE7, 0x3C, 0x5A, 0x7F, 0x3E,\n    0x1C, 0x1C, 0x08, 0x08, 0x1C, 0x1C, 0x3E, 0x7F, 0x14, 0x22, 0x7F,\n    0x22, 0x14, 0x5F, 0x5F, 0x00, 0x5F, 0x5F, 0x06, 0x09, 0x7F, 0x01,\n    0x7F, 0x00, 0x66, 0x89, 0x95, 0x6A, 0x60, 0x60, 0x60, 0x60, 0x60,\n    0x94, 0xA2, 0xFF, 0xA2, 0x94, 0x08, 0x04, 0x7E, 0x04, 0x08,\t // up INDEX 24\n    0x10, 0x20, 0x7E, 0x20, 0x10,  // down INDEX 25\n    0x08, 0x08, 0x2A, 0x1C, 0x08, 0x08, 0x1C, 0x2A, 0x08, 0x08, 0x1E,\n    0x10, 0x10, 0x10, 0x10, 0x0C, 0x1E, 0x0C, 0x1E, 0x0C, 0x30, 0x38,\n    0x3E, 0x38, 0x30, 0x06, 0x0E, 0x3E, 0x0E, 0x06, 0x00, 0x00, 0x00,\n    0x00, 0x00, 0x00, 0x00, 0x5F, 0x00, 0x00, 0x00, 0x07, 0x00, 0x07,\n    0x00, 0x14, 0x7F, 0x14, 0x7F, 0x14, 0x24, 0x2A, 0x7F, 0x2A, 0x12,\n    0x23, 0x13, 0x08, 0x64, 0x62, 0x36, 0x49, 0x56, 0x20, 0x50, 0x00,\n    0x08, 0x07, 0x03, 0x00, 0x00, 0x1C, 0x22, 0x41, 0x00, 0x00, 0x41,\n    0x22, 0x1C, 0x00, 0x2A, 0x1C, 0x7F, 0x1C, 0x2A, 0x08, 0x08, 0x3E,\n    0x08, 0x08, 0x00, 0x80, 0x70, 0x30, 0x00, 0x08, 0x08, 0x08, 0x08,\n    0x08, 0x00, 0x00, 0x60, 0x60, 0x00, 0x20, 0x10, 0x08, 0x04, 0x02,\n    0x3E, 0x51, 0x49, 0x45, 0x3E, 0x00, 0x42, 0x7F, 0x40, 0x00, 0x72,\n    0x49, 0x49, 0x49, 0x46, 0x21, 0x41, 0x49, 0x4D, 0x33, 0x18, 0x14,\n    0x12, 0x7F, 0x10, 0x27, 0x45, 0x45, 0x45, 0x39, 0x3C, 0x4A, 0x49,\n    0x49, 0x31, 0x41, 0x21, 0x11, 0x09, 0x07, 0x36, 0x49, 0x49, 0x49,\n    0x36, 0x46, 0x49, 0x49, 0x29, 0x1E, 0x00, 0x00, 0x14, 0x00, 0x00,\n    0x00, 0x40, 0x34, 0x00, 0x00, 0x00, 0x08, 0x14, 0x22, 0x41, 0x14,\n    0x14, 0x14, 0x14, 0x14, 0x00, 0x41, 0x22, 0x14, 0x08, 0x02, 0x01,\n    0x59, 0x09, 0x06, 0x3E, 0x41, 0x5D, 0x59, 0x4E, 0x7C, 0x12, 0x11,\n    0x12, 0x7C, 0x7F, 0x49, 0x49, 0x49, 0x36, 0x3E, 0x41, 0x41, 0x41,\n    0x22,\t\t\t   // C\n    0x7F, 0x41, 0x41, 0x41, 0x3E,  // D\n    0x7F, 0x49, 0x49, 0x49, 0x41,  // E\n    0x7F, 0x09, 0x09, 0x09, 0x01,  // F\n    0x3E, 0x41, 0x41, 0x51, 0x73, 0x7F, 0x08, 0x08, 0x08, 0x7F, 0x00,\n    0x41, 0x7F, 0x41, 0x00, 0x20, 0x40, 0x41, 0x3F, 0x01, 0x7F, 0x08,\n    0x14, 0x22, 0x41, 0x7F, 0x40, 0x40, 0x40, 0x40, 0x7F, 0x02, 0x1C,\n    0x02, 0x7F, 0x7F, 0x04, 0x08, 0x10, 0x7F, 0x3E, 0x41, 0x41, 0x41,\n    0x3E, 0x7F, 0x09, 0x09, 0x09, 0x06, 0x3E, 0x41, 0x51, 0x21, 0x5E,\n    0x7F, 0x09, 0x19, 0x29, 0x46, 0x26, 0x49, 0x49, 0x49, 0x32, 0x03,\n    0x01, 0x7F, 0x01, 0x03, 0x3F, 0x40, 0x40, 0x40, 0x3F, 0x1F, 0x20,\n    0x40, 0x20, 0x1F, 0x3F, 0x40, 0x38, 0x40, 0x3F, 0x63, 0x14, 0x08,\n    0x14, 0x63, 0x03, 0x04, 0x78, 0x04, 0x03, 0x61, 0x59, 0x49, 0x4D,\n    0x43, 0x00, 0x7F, 0x41, 0x41, 0x41, 0x02, 0x04, 0x08, 0x10, 0x20,\n    0x00, 0x41, 0x41, 0x41, 0x7F, 0x04, 0x02, 0x01, 0x02, 0x04, 0x40,\n    0x40, 0x40, 0x40, 0x40, 0x00, 0x03, 0x07, 0x08, 0x00, 0x20, 0x54,\n    0x54, 0x78, 0x40, 0x7F, 0x28, 0x44, 0x44, 0x38, 0x38, 0x44, 0x44,\n    0x44, 0x28, 0x38, 0x44, 0x44, 0x28, 0x7F, 0x38, 0x54, 0x54, 0x54,\n    0x18, 0x00, 0x08, 0x7E, 0x09, 0x02, 0x18, 0xA4, 0xA4, 0x9C, 0x78,\n    0x7F, 0x08, 0x04, 0x04, 0x78, 0x00, 0x44, 0x7D, 0x40, 0x00, 0x20,\n    0x40, 0x40, 0x3D, 0x00, 0x7F, 0x10, 0x28, 0x44, 0x00, 0x00, 0x41,\n    0x7F, 0x40, 0x00, 0x7C, 0x04, 0x78, 0x04, 0x78, 0x7C, 0x08, 0x04,\n    0x04, 0x78, 0x38, 0x44, 0x44, 0x44, 0x38, 0xFC, 0x18, 0x24, 0x24,\n    0x18, 0x18, 0x24, 0x24, 0x18, 0xFC, 0x7C, 0x08, 0x04, 0x04, 0x08,\n    0x48, 0x54, 0x54, 0x54, 0x24, 0x04, 0x04, 0x3F, 0x44, 0x24, 0x3C,\n    0x40, 0x40, 0x20, 0x7C, 0x1C, 0x20, 0x40, 0x20, 0x1C, 0x3C, 0x40,\n    0x30, 0x40, 0x3C, 0x44, 0x28, 0x10, 0x28, 0x44, 0x4C, 0x90, 0x90,\n    0x90, 0x7C, 0x44, 0x64, 0x54, 0x4C, 0x44, 0x00, 0x08, 0x36, 0x41,\n    0x00, 0x00, 0x00, 0x77, 0x00, 0x00, 0x00, 0x41, 0x36, 0x08, 0x00,\n    0x02, 0x01, 0x02, 0x04, 0x02, 0x3C, 0x26, 0x23, 0x26, 0x3C, 0x1E,\n    0xA1, 0xA1, 0x61, 0x12, 0x3A, 0x40, 0x40, 0x20, 0x7A, 0x38, 0x54,\n    0x54, 0x55, 0x59, 0x21, 0x55, 0x55, 0x79, 0x41, 0x22, 0x54, 0x54,\n    0x78, 0x42,\t // a-umlaut\n    0x21, 0x55, 0x54, 0x78, 0x40, 0x20, 0x54, 0x55, 0x79, 0x40, 0x0C,\n    0x1E, 0x52, 0x72, 0x12, 0x39, 0x55, 0x55, 0x55, 0x59, 0x39, 0x54,\n    0x54, 0x54, 0x59, 0x39, 0x55, 0x54, 0x54, 0x58, 0x00, 0x00, 0x45,\n    0x7C, 0x41, 0x00, 0x02, 0x45, 0x7D, 0x42, 0x00, 0x01, 0x45, 0x7C,\n    0x40, 0x7D, 0x12, 0x11, 0x12, 0x7D,\t // A-umlaut\n    0xF0, 0x28, 0x25, 0x28, 0xF0, 0x7C, 0x54, 0x55, 0x45, 0x00, 0x20,\n    0x54, 0x54, 0x7C, 0x54, 0x7C, 0x0A, 0x09, 0x7F, 0x49, 0x32, 0x49,\n    0x49, 0x49, 0x32, 0x3A, 0x44, 0x44, 0x44, 0x3A,  // o-umlaut\n    0x32, 0x4A, 0x48, 0x48, 0x30, 0x3A, 0x41, 0x41, 0x21, 0x7A, 0x3A,\n    0x42, 0x40, 0x20, 0x78, 0x00, 0x9D, 0xA0, 0xA0, 0x7D, 0x3D, 0x42,\n    0x42, 0x42, 0x3D,  // O-umlaut\n    0x3D, 0x40, 0x40, 0x40, 0x3D, 0x3C, 0x24, 0xFF, 0x24, 0x24, 0x48,\n    0x7E, 0x49, 0x43, 0x66, 0x2B, 0x2F, 0xFC, 0x2F, 0x2B, 0xFF, 0x09,\n    0x29, 0xF6, 0x20, 0xC0, 0x88, 0x7E, 0x09, 0x03, 0x20, 0x54, 0x54,\n    0x79, 0x41, 0x00, 0x00, 0x44, 0x7D, 0x41, 0x30, 0x48, 0x48, 0x4A,\n    0x32, 0x38, 0x40, 0x40, 0x22, 0x7A, 0x00, 0x7A, 0x0A, 0x0A, 0x72,\n    0x7D, 0x0D, 0x19, 0x31, 0x7D, 0x26, 0x29, 0x29, 0x2F, 0x28, 0x26,\n    0x29, 0x29, 0x29, 0x26, 0x30, 0x48, 0x4D, 0x40, 0x20, 0x38, 0x08,\n    0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x08, 0x38, 0x2F, 0x10, 0xC8,\n    0xAC, 0xBA, 0x2F, 0x10, 0x28, 0x34, 0xFA, 0x00, 0x00, 0x7B, 0x00,\n    0x00, 0x08, 0x14, 0x2A, 0x14, 0x22, 0x22, 0x14, 0x2A, 0x14, 0x08,\n    0x55, 0x00, 0x55, 0x00, 0x55,  // #176 (25% block) missing in old code\n    0xAA, 0x55, 0xAA, 0x55, 0xAA,  // 50% block\n    0xFF, 0x55, 0xFF, 0x55, 0xFF,  // 75% block\n    0x00, 0x00, 0x00, 0xFF, 0x00, 0x10, 0x10, 0x10, 0xFF, 0x00, 0x14,\n    0x14, 0x14, 0xFF, 0x00, 0x10, 0x10, 0xFF, 0x00, 0xFF, 0x10, 0x10,\n    0xF0, 0x10, 0xF0, 0x14, 0x14, 0x14, 0xFC, 0x00, 0x14, 0x14, 0xF7,\n    0x00, 0xFF, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x14, 0x14, 0xF4, 0x04,\n    0xFC, 0x14, 0x14, 0x17, 0x10, 0x1F, 0x10, 0x10, 0x1F, 0x10, 0x1F,\n    0x14, 0x14, 0x14, 0x1F, 0x00, 0x10, 0x10, 0x10, 0xF0, 0x00, 0x00,\n    0x00, 0x00, 0x1F, 0x10, 0x10, 0x10, 0x10, 0x1F, 0x10, 0x10, 0x10,\n    0x10, 0xF0, 0x10, 0x00, 0x00, 0x00, 0xFF, 0x10, 0x10, 0x10, 0x10,\n    0x10, 0x10, 0x10, 0x10, 0x10, 0xFF, 0x10, 0x00, 0x00, 0x00, 0xFF,\n    0x14, 0x00, 0x00, 0xFF, 0x00, 0xFF, 0x00, 0x00, 0x1F, 0x10, 0x17,\n    0x00, 0x00, 0xFC, 0x04, 0xF4, 0x14, 0x14, 0x17, 0x10, 0x17, 0x14,\n    0x14, 0xF4, 0x04, 0xF4, 0x00, 0x00, 0xFF, 0x00, 0xF7, 0x14, 0x14,\n    0x14, 0x14, 0x14, 0x14, 0x14, 0xF7, 0x00, 0xF7, 0x14, 0x14, 0x14,\n    0x17, 0x14, 0x10, 0x10, 0x1F, 0x10, 0x1F, 0x14, 0x14, 0x14, 0xF4,\n    0x14, 0x10, 0x10, 0xF0, 0x10, 0xF0, 0x00, 0x00, 0x1F, 0x10, 0x1F,\n    0x00, 0x00, 0x00, 0x1F, 0x14, 0x00, 0x00, 0x00, 0xFC, 0x14, 0x00,\n    0x00, 0xF0, 0x10, 0xF0, 0x10, 0x10, 0xFF, 0x10, 0xFF, 0x14, 0x14,\n    0x14, 0xFF, 0x14, 0x10, 0x10, 0x10, 0x1F, 0x00, 0x00, 0x00, 0x00,\n    0xF0, 0x10, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xF0, 0xF0, 0xF0, 0xF0,\n    0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF,\n    0x0F, 0x0F, 0x0F, 0x0F, 0x0F, 0x38, 0x44, 0x44, 0x38, 0x44, 0xFC,\n    0x4A, 0x4A, 0x4A, 0x34,  // sharp-s or beta\n    0x7E, 0x02, 0x02, 0x06, 0x06, 0x02, 0x7E, 0x02, 0x7E, 0x02, 0x63,\n    0x55, 0x49, 0x41, 0x63, 0x38, 0x44, 0x44, 0x3C, 0x04, 0x40, 0x7E,\n    0x20, 0x1E, 0x20, 0x06, 0x02, 0x7E, 0x02, 0x02, 0x99, 0xA5, 0xE7,\n    0xA5, 0x99, 0x1C, 0x2A, 0x49, 0x2A, 0x1C, 0x4C, 0x72, 0x01, 0x72,\n    0x4C, 0x30, 0x4A, 0x4D, 0x4D, 0x30, 0x30, 0x48, 0x78, 0x48, 0x30,\n    0xBC, 0x62, 0x5A, 0x46, 0x3D, 0x3E, 0x49, 0x49, 0x49, 0x00, 0x7E,\n    0x01, 0x01, 0x01, 0x7E, 0x2A, 0x2A, 0x2A, 0x2A, 0x2A, 0x44, 0x44,\n    0x5F, 0x44, 0x44, 0x40, 0x51, 0x4A, 0x44, 0x40, 0x40, 0x44, 0x4A,\n    0x51, 0x40, 0x00, 0x00, 0xFF, 0x01, 0x03, 0xE0, 0x80, 0xFF, 0x00,\n    0x00, 0x08, 0x08, 0x6B, 0x6B, 0x08, 0x36, 0x12, 0x36, 0x24, 0x36,\n    0x06, 0x0F, 0x09, 0x0F, 0x06, 0x00, 0x00, 0x18, 0x18, 0x00, 0x00,\n    0x00, 0x10, 0x10, 0x00, 0x30, 0x40, 0xFF, 0x01, 0x01, 0x00, 0x1F,\n    0x01, 0x01, 0x1E, 0x00, 0x19, 0x1D, 0x17, 0x12, 0x00, 0x3C, 0x3C,\n    0x3C, 0x3C, 0x00, 0x00, 0x00, 0x00, 0x00  // #255 NBSP\n};\n\n/****************************************************************\n * Function Name : clearDisplay\n * Description   : Clear the display memory buffer\n * Returns       : NONE.\n * Params        : NONE.\n ****************************************************************/\nvoid clearDisplay() { memset(screen, 0x00, DISPLAY_BUFF_SIZE); }\n\n/****************************************************************\n * Function Name : display_Init_seq\n * Description   : Performs SSD1306 OLED Initialization Sequence\n * Returns       : NONE.\n * Params        : NONE.\n ****************************************************************/\nvoid display_Init_seq() {\n\t/* Add the reset code, If needed */\n\n\t/* Send display OFF command */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_DISPLAY_OFF) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display OFF Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display OFF Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set display clock frequency */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_SET_DISP_CLK) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display CLK Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display CLK Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Send display CLK command parameter */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_DISPCLK_DIV) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display CLK Command Parameter Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display CLK Command Parameter Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set display multiplex */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_SET_MULTIPLEX) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display MULT Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display MULT Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Send display MULT command parameter */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_MULT_DAT) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display MULT Command Parameter Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display MULT Command Parameter Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set display OFFSET */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_SET_DISP_OFFSET) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display OFFSET Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display OFFSET Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Send display OFFSET command parameter */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_DISP_OFFSET_VAL) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display OFFSET Command Parameter Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display OFFSET Command Parameter Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set display START LINE - Check this command if something weird\n\t * happens */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_SET_DISP_START_LINE) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display START LINE Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display START LINE Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Enable CHARGEPUMP*/\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_CONFIG_CHARGE_PUMP) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display CHARGEPUMP Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display CHARGEPUMP Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Send display CHARGEPUMP command parameter */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_CHARGE_PUMP_EN) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display CHARGEPUMP Command Parameter Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display CHARGEPUMP Command Parameter Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set display MEMORYMODE */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_SET_MEM_ADDR_MODE) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display MEMORYMODE Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display MEMORYMODE Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Send display HORIZONTAL MEMORY ADDR MODE command parameter */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_HOR_MM) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\n\t\t    \"Display HORIZONTAL MEMORY ADDR MODE Command Parameter \"\n\t\t    \"Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\n\t\t    \"Display HORIZONTAL MEMORY ADDR MODE Command Parameter \"\n\t\t    \"Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set display COM */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_SET_COMPINS) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display COM Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display COM Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Send display COM command parameter */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_CONFIG_COM_PINS) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display COM Command Parameter Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display COM Command Parameter Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set display CONTRAST */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_SET_CONTRAST) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display CONTRAST Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display CONTRAST Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Send display CONTRAST command parameter */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_CONTRAST_VAL) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display CONTRAST Command Parameter Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display CONTRAST Command Parameter Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set display PRECHARGE */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_SET_PRECHARGE) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display PRECHARGE Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display PRECHARGE Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Send display PRECHARGE command parameter */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_PRECHARGE_VAL) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display PRECHARGE Command Parameter Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display PRECHARGE Command Parameter Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set display VCOMH */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_SET_VCOMDETECT) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display VCOMH Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display VCOMH Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Send display VCOMH command parameter */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_VCOMH_VAL) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display VCOMH Command Parameter Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display VCOMH Command Parameter Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set display ALL-ON */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_DISPLAYALLON_RESUME) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display ALL-ON Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display ALL-ON Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set display to NORMAL-DISPLAY */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_NORMAL_DISPLAY) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display NORMAL-DISPLAY Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display NORMAL-DISPLAY Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set display to DEACTIVATE_SCROLL */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_DEACTIVATE_SCROLL) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display DEACTIVATE_SCROLL Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display DEACTIVATE_SCROLL Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set display to TURN-ON */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_DISPLAYON) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display TURN-ON Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display TURN-ON Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n}\n\n/****************************************************************\n * Function Name : display_normal\n * Description   : Normal display\n * Returns       : NONE.\n * Params        : NONE.\n ****************************************************************/\nvoid display_normal() {\n\t/* Set display SEG_REMAP */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_SEG_REMAP) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display SEG_REMAP Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display SEG_REMAP Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set display COMSCANDEC */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_SET_COMSCANDEC) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display DIR Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display DIR Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n}\n\n/****************************************************************\n * Function Name : display_rotate\n * Description   : 180 degree rotation\n * Returns       : NONE.\n * Params        : NONE.\n ****************************************************************/\nvoid display_rotate() {\n\t/* Set display SEG_REMAP1 */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_SEG_REMAP1) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display SEG_REMAP Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display SEG_REMAP Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set display COMSCANDEC1 */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_SET_COMSCANDEC1) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display DIR Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display DIR Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n}\n\n/****************************************************************\n * Function Name : transfer\n * Description   : Transfer the frame buffer onto the display\n * Returns       : NONE.\n * Params        : NONE.\n ****************************************************************/\nvoid transfer() {\n\tshort loop_1 = 0, loop_2 = 0;\n\tshort index = 0x00;\n\tfor (loop_1 = 0; loop_1 < 1024; loop_1++) {\n\t\tchunk[0] = 0x40;\n\t\tfor (loop_2 = 1; loop_2 < 17; loop_2++)\n\t\t\tchunk[loop_2] = screen[index++];\n\t\tif (i2c_multiple_writes(I2C_DEV_2.fd_i2c, 17, chunk) == 17) {\n#ifdef SSD1306_DBG\n\t\t\tprintf(\"Chunk written to RAM - Completed\\r\\n\");\n#endif\n\t\t} else {\n#ifdef SSD1306_DBG\n\t\t\tprintf(\"Chunk written to RAM - Failed\\r\\n\");\n#endif\n\t\t\texit(1);\n\t\t}\n\n\t\tmemset(chunk, 0x00, 17);\n\t\tif (index == 1024) break;\n\t}\n}\n\n/****************************************************************\n * Function Name : Display\n * Description   : 1. Resets the column and page addresses.\n *                 2. Displays the contents of the memory buffer.\n * Returns       : NONE.\n * Params        : NONE.\n * Note          : Each new form can be preceded by a clearDisplay.\n ****************************************************************/\nvoid Display() {\n\tInit_Col_PG_addrs(SSD1306_COL_START_ADDR, SSD1306_COL_END_ADDR,\n\t\t\t  SSD1306_PG_START_ADDR, SSD1306_PG_END_ADDR);\n\ttransfer();\n}\n\n/****************************************************************\n * Function Name : Init_Col_PG_addrs\n * Description   : Sets the column and page, start and\n *                 end addresses.\n * Returns       : NONE.\n * Params        : @col_start_addr: Column start address\n *                 @col_end_addr: Column end address\n *                 @pg_start_addr: Page start address\n *                 @pg_end_addr: Page end address\n ****************************************************************/\nvoid Init_Col_PG_addrs(unsigned char col_start_addr, unsigned char col_end_addr,\n\t\t       unsigned char pg_start_addr, unsigned char pg_end_addr) {\n\t/* Send COLMN address setting command  */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_SET_COL_ADDR) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display COLMN Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display COLMN Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set COLMN start address */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       col_start_addr) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display COLMN Start Address param Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display COLMN Start Address param  Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set COLMN end address */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       col_end_addr) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display COLMN End Address param Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display COLMN End Address param  Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Send PAGE address setting command  */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_PAGEADDR) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display PAGE Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display PAGE Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set PAGE start address */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       pg_start_addr) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display PAGE Start Address param Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display PAGE Start Address param  Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Set PAGE end address */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       pg_end_addr) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display PAGE End Address param Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display PAGE End Address param  Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n}\n\n/****************************************************************\n * Function Name : setRotation\n * Description   : Set the display rotation\n * Returns       : NONE.\n * Params        : @x: Display rotation parameter\n ****************************************************************/\nvoid setRotation(unsigned char x) {\n\t_rotation = x & 3;\n\tswitch (_rotation) {\n\t\tcase 0:\n\t\tcase 2:\n\t\t\t_width = SSD1306_LCDWIDTH;\n\t\t\t_height = SSD1306_LCDHEIGHT;\n\t\t\tbreak;\n\t\tcase 1:\n\t\tcase 3:\n\t\t\t_width = SSD1306_LCDHEIGHT;\n\t\t\t_height = SSD1306_LCDWIDTH;\n\t\t\tbreak;\n\t}\n}\n\n/****************************************************************\n * Function Name : startscrollright\n * Description   : Activate a right handed scroll for rows start\n *                 through stop\n * Returns       : NONE.\n * Params        : @start: Start location\n *                 @stop: Stop location\n * HINT.         : the display is 16 rows tall. To scroll the whole\n *                 display, run: display.scrollright(0x00, 0x0F)\n ****************************************************************/\nvoid startscrollright(unsigned char start, unsigned char stop) {\n\t/* Send SCROLL horizontal right command  */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_RIGHT_HORIZONTAL_SCROLL) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display HORIZONTAL SCROLL RIGHT Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display HORIZONTAL SCROLL RIGHT Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, 0x00) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_1 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_1 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, start) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_2 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_2 Passed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, 0x00) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_3 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_3 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, stop) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_4 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_4 Passed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, 0x00) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_5 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_5 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, 0xFF) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_6 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_6 Passed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\t/* Send SCROLL Activate command  */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_ACTIVATE_SCROLL) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"SCROLL Activate Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"SCROLL Activate Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n}\n\n/****************************************************************\n * Function Name : startscrollleft\n * Description   : Activate a left handed scroll for rows start\n *                 through stop\n * Returns       : NONE.\n * Params        : @start: Start location\n *                 @stop: Stop location\n * HINT.         : the display is 16 rows tall. To scroll the whole\n *                 display, run: display.scrollright(0x00, 0x0F)\n ****************************************************************/\nvoid startscrollleft(unsigned char start, unsigned char stop) {\n\t/* Send SCROLL horizontal left command  */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_LEFT_HORIZONTAL_SCROLL) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display HORIZONTAL SCROLL LEFT Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display HORIZONTAL SCROLL LEFT Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, 0x00) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_1 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_1 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, start) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_2 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_2 Passed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, 0x00) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_3 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_3 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, stop) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_4 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_4 Passed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, 0x00) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_5 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_5 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, 0xFF) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_6 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"HORI_SR Param_6 Passed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\t/* Send SCROLL Activate command  */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_ACTIVATE_SCROLL) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"SCROLL Activate Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"SCROLL Activate Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n}\n\n/****************************************************************\n * Function Name : startscrolldiagright\n * Description   : Activate a diagonal scroll for rows start\n *                 through stop\n * Returns       : NONE.\n * Params        : @start: Start location\n *                 @stop: Stop location\n * HINT.         : the display is 16 rows tall. To scroll the whole\n *                 display, run: display.scrollright(0x00, 0x0F)\n ****************************************************************/\nvoid startscrolldiagright(unsigned char start, unsigned char stop) {\n\t/* Send SCROLL diagonal right command  */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_SET_VERTICAL_SCROLL_AREA) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display DIAGONAL SCROLL RIGHT Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display DIAGONAL SCROLL RIGHT Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, 0x00) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_1 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_1 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_LCDHEIGHT) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_2 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_2 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Cmd Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Cmd Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, 0x00) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_3 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_3 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, start) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_4 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_4 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, 0x00) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_5 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_5 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, stop) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_6 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_6 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, 0x01) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_5 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_5 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Send SCROLL Activate command  */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_ACTIVATE_SCROLL) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"SCROLL Activate Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"SCROLL Activate Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n}\n\n/****************************************************************\n * Function Name : startscrolldiagleft\n * Description   : Activate a diagonal scroll for rows start\n *                 through stop\n * Returns       : NONE.\n * Params        : @start: Start location\n *                 @stop: Stop location\n * HINT.         : the display is 16 rows tall. To scroll the whole\n *                 display, run: display.scrollright(0x00, 0x0F)\n ****************************************************************/\nvoid startscrolldiagleft(unsigned char start, unsigned char stop) {\n\t/* Send SCROLL diagonal right command  */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_SET_VERTICAL_SCROLL_AREA) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display DIAGONAL SCROLL RIGHT Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Display DIAGONAL SCROLL RIGHT Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, 0x00) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_1 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_1 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_LCDHEIGHT) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_2 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_2 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Cmd Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"Cmd Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, 0x00) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_3 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_3 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, start) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_4 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_4 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, 0x00) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_5 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_5 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, stop) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_6 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_6 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD, 0x01) ==\n\t    I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_5 Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"DIAG_SR Param_5 Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n\n\t/* Send SCROLL Activate command  */\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_ACTIVATE_SCROLL) == I2C_TWO_BYTES) {\n#ifdef SSD1306_DBG\n\t\tprintf(\"SCROLL Activate Command Passed\\r\\n\");\n#endif\n\t} else {\n#ifdef SSD1306_DBG\n\t\tprintf(\"SCROLL Activate Command Failed\\r\\n\");\n#endif\n\t\texit(1);\n\t}\n}\n\n/****************************************************************\n * Function Name : stopscroll\n * Description   : Stop scrolling\n * Returns       : NONE.\n * Params        : NONE.\n ****************************************************************/\nvoid stopscroll() {\n\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t       SSD1306_DEACTIVATE_SCROLL) == I2C_TWO_BYTES) {\n\t\tprintf(\"De-activate SCROLL Command Passed\\r\\n\");\n\t} else {\n\t\tprintf(\"De-activate SCROLL Command Passed Failed\\r\\n\");\n\t\texit(1);\n\t}\n}\n\n/****************************************************************\n * Function Name : invertDisplay\n * Description   : Invert or Normalize the display\n * Returns       : NONE.\n * Params        : @i: 0x00 to Normal and 0x01 for Inverting\n ****************************************************************/\nvoid invertDisplay(unsigned char i) {\n\tif (i) {\n\t\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t\t       SSD1306_INVERTDISPLAY) ==\n\t\t    I2C_TWO_BYTES) {\n\t\t\tprintf(\"Display Inverted - Passed\\r\\n\");\n\t\t} else {\n\t\t\tprintf(\"Display Inverted - Failed\\r\\n\");\n\t\t\texit(1);\n\t\t}\n\t} else {\n\t\tif (i2c_write_register(I2C_DEV_2.fd_i2c, SSD1306_CNTRL_CMD,\n\t\t\t\t       SSD1306_NORMAL_DISPLAY) ==\n\t\t    I2C_TWO_BYTES) {\n\t\t\tprintf(\"Display Normal - Passed\\r\\n\");\n\t\t} else {\n\t\t\tprintf(\"Display Normal - Failed\\r\\n\");\n\t\t\texit(1);\n\t\t}\n\t}\n}\n\n/****************************************************************\n * Function Name : drawPixel\n * Description   : Draw a pixel\n * Returns       : -1 on error and 0 on success\n * Params        : @x: X - Co-ordinate\n *                 @y: Y - Co-ordinate\n *                 @color: Color\n ****************************************************************/\nsigned char drawPixel(short x, short y, short color) {\n\t/* Return if co-ordinates are out of display dimension's range */\n\tif ((x < 0) || (x >= _width) || (y < 0) || (y >= _height)) return -1;\n\tswitch (_rotation) {\n\t\tcase 1:\n\t\t\tSWAP(x, y);\n\t\t\tx = _width - x - 1;\n\t\t\tbreak;\n\t\tcase 2:\n\t\t\tx = _width - x - 1;\n\t\t\ty = _height - y - 1;\n\t\t\tbreak;\n\t\tcase 3:\n\t\t\tSWAP(x, y);\n\t\t\ty = _height - y - 1;\n\t\t\tbreak;\n\t}\n\n\t/* x is the column */\n\tswitch (color) {\n\t\tcase WHITE:\n\t\t\tscreen[x + (y / 8) * SSD1306_LCDWIDTH] |=\n\t\t\t    (1 << (y & 7));\n\t\t\tbreak;\n\t\tcase BLACK:\n\t\t\tscreen[x + (y / 8) * SSD1306_LCDWIDTH] &=\n\t\t\t    ~(1 << (y & 7));\n\t\t\tbreak;\n\t\tcase INVERSE:\n\t\t\tscreen[x + (y / 8) * SSD1306_LCDWIDTH] ^=\n\t\t\t    (1 << (y & 7));\n\t\t\tbreak;\n\t}\n\treturn 0;\n}\n\n/****************************************************************\n * Function Name : writeLine\n * Description   : Bresenham's algorithm\n * Returns       : NONE\n * Params        : @x0: X0 Co-ordinate\n *                 @y0: Y0 Co-ordinate\n *                 @x1: X1 Co-ordinate\n *                 @y1: Y1 Co-ordinate\n *                 @color: Pixel color\n ****************************************************************/\nvoid writeLine(short x0, short y0, short x1, short y1, short color) {\n\tshort steep = 0, dx = 0, dy = 0, err = 0, ystep = 0;\n\tsteep = abs(y1 - y0) > abs(x1 - x0);\n\tif (steep) {\n\t\tSWAP(x0, y0);\n\t\tSWAP(x1, y1);\n\t}\n\n\tif (x0 > x1) {\n\t\tSWAP(x0, x1);\n\t\tSWAP(y0, y1);\n\t}\n\tdx = x1 - x0;\n\tdy = abs(y1 - y0);\n\n\terr = dx / 2;\n\n\tif (y0 < y1) {\n\t\tystep = 1;\n\t} else {\n\t\tystep = -1;\n\t}\n\n\tfor (; x0 <= x1; x0++) {\n\t\tif (steep) {\n\t\t\tdrawPixel(y0, x0, color);\n\t\t} else {\n\t\t\tdrawPixel(x0, y0, color);\n\t\t}\n\t\terr -= dy;\n\t\tif (err < 0) {\n\t\t\ty0 += ystep;\n\t\t\terr += dx;\n\t\t}\n\t}\n}\n\n/* (x,y) is topmost point; if unsure, calling function\nshould sort endpoints or call writeLine() instead */\nvoid drawFastVLine(short x, short y, short h, short color) {\n\t// startWrite();\n\twriteLine(x, y, x, y + h - 1, color);\n\t// endWrite();\n}\n\n/* (x,y) is topmost point; if unsure, calling function\nshould sort endpoints or call writeLine() instead */\nvoid writeFastVLine(short x, short y, short h, short color) {\n\tdrawFastVLine(x, y, h, color);\n}\n\n/* (x,y) is leftmost point; if unsure, calling function\n should sort endpoints or call writeLine() instead */\nvoid drawFastHLine(short x, short y, short w, short color) {\n\t// startWrite();\n\twriteLine(x, y, x + w - 1, y, color);\n\t// endWrite();\n}\n\n// (x,y) is leftmost point; if unsure, calling function\n// should sort endpoints or call writeLine() instead\nvoid writeFastHLine(short x, short y, short w, short color) {\n\tdrawFastHLine(x, y, w, color);\n}\n\n/****************************************************************\n * Function Name : drawCircleHelper\n * Description   : Draw a....\n * Returns       : NONE\n * Params        : @x: X Co-ordinate\n *                 @y: Y Co-ordinate\n *                 @w: Width\n *                 @h: height\n *                 @r: Corner radius\n *                 @color: Pixel color\n ****************************************************************/\nvoid drawCircleHelper(short x0, short y0, short r, unsigned char cornername,\n\t\t      short color) {\n\tshort f = 1 - r;\n\tshort ddF_x = 1;\n\tshort ddF_y = -2 * r;\n\tshort x = 0;\n\tshort y = r;\n\n\twhile (x < y) {\n\t\tif (f >= 0) {\n\t\t\ty--;\n\t\t\tddF_y += 2;\n\t\t\tf += ddF_y;\n\t\t}\n\t\tx++;\n\t\tddF_x += 2;\n\t\tf += ddF_x;\n\t\tif (cornername & 0x4) {\n\t\t\tdrawPixel(x0 + x, y0 + y, color);\n\t\t\tdrawPixel(x0 + y, y0 + x, color);\n\t\t}\n\t\tif (cornername & 0x2) {\n\t\t\tdrawPixel(x0 + x, y0 - y, color);\n\t\t\tdrawPixel(x0 + y, y0 - x, color);\n\t\t}\n\t\tif (cornername & 0x8) {\n\t\t\tdrawPixel(x0 - y, y0 + x, color);\n\t\t\tdrawPixel(x0 - x, y0 + y, color);\n\t\t}\n\t\tif (cornername & 0x1) {\n\t\t\tdrawPixel(x0 - y, y0 - x, color);\n\t\t\tdrawPixel(x0 - x, y0 - y, color);\n\t\t}\n\t}\n}\n\n/****************************************************************\n * Function Name : drawLine\n * Description   : Draw line between two points\n * Returns       : NONE\n * Params        : @x0: X0 Starting X Co-ordinate\n *                 @y0: Y0 Starting Y Co-ordinate\n *                 @x1: X1 Ending X Co-ordinate\n *                 @y1: Y1 Ending Y Co-ordinate\n *                 @color: Pixel color\n ****************************************************************/\nvoid drawLine(short x0, short y0, short x1, short y1, short color) {\n\tif (x0 == x1) {\n\t\tif (y0 > y1) SWAP(y0, y1);\n\t\tdrawFastVLine(x0, y0, y1 - y0 + 1, color);\n\t} else if (y0 == y1) {\n\t\tif (x0 > x1) SWAP(x0, x1);\n\t\tdrawFastHLine(x0, y0, x1 - x0 + 1, color);\n\t} else {\n\t\t// startWrite();\n\t\twriteLine(x0, y0, x1, y1, color);\n\t\t// endWrite();\n\t}\n}\n\n/****************************************************************\n * Function Name : drawRect\n * Description   : Draw a rectangle\n * Returns       : NONE\n * Params        : @x: Corner X Co-ordinate\n *                 @y: Corner Y Co-ordinate\n *                 @w: Width in pixels\n *                 @h: Height in pixels\n *                 @color: Pixel color\n ****************************************************************/\nvoid drawRect(short x, short y, short w, short h, short color) {\n\t// startWrite();\n\twriteFastHLine(x, y, w, color);\n\twriteFastHLine(x, y + h - 1, w, color);\n\twriteFastVLine(x, y, h, color);\n\twriteFastVLine(x + w - 1, y, h, color);\n\t// endWrite();\n}\n\n/****************************************************************\n * Function Name : fillRect\n * Description   : Fill the rectangle\n * Returns       : NONE\n * Params        : @x: Starting X Co-ordinate\n *                 @y: Starting Y Co-ordinate\n *                 @w: Width in pixels\n *                 @h: Height in pixels\n *                 @color: Pixel color\n ****************************************************************/\nvoid fillRect(short x, short y, short w, short h, short color) {\n\tshort i = 0;\n\t// startWrite();\n\tfor (i = x; i < x + w; i++) {\n\t\twriteFastVLine(i, y, h, color);\n\t}\n\t// endWrite();\n}\n\n/****************************************************************\n * Function Name : drawCircle\n * Description   : Draw a circle\n * Returns       : NONE\n * Params        : @x: Center X Co-ordinate\n *                 @y: Center Y Co-ordinate\n *                 @r: Radius in pixels\n *                 @color: Pixel color\n ****************************************************************/\nvoid drawCircle(short x0, short y0, short r, short color) {\n\tshort f = 1 - r;\n\tshort ddF_x = 1;\n\tshort ddF_y = -2 * r;\n\tshort x = 0;\n\tshort y = r;\n\n\t// startWrite();\n\tdrawPixel(x0, y0 + r, color);\n\tdrawPixel(x0, y0 - r, color);\n\tdrawPixel(x0 + r, y0, color);\n\tdrawPixel(x0 - r, y0, color);\n\n\twhile (x < y) {\n\t\tif (f >= 0) {\n\t\t\ty--;\n\t\t\tddF_y += 2;\n\t\t\tf += ddF_y;\n\t\t}\n\t\tx++;\n\t\tddF_x += 2;\n\t\tf += ddF_x;\n\n\t\tdrawPixel(x0 + x, y0 + y, color);\n\t\tdrawPixel(x0 - x, y0 + y, color);\n\t\tdrawPixel(x0 + x, y0 - y, color);\n\t\tdrawPixel(x0 - x, y0 - y, color);\n\t\tdrawPixel(x0 + y, y0 + x, color);\n\t\tdrawPixel(x0 - y, y0 + x, color);\n\t\tdrawPixel(x0 + y, y0 - x, color);\n\t\tdrawPixel(x0 - y, y0 - x, color);\n\t}\n\t// endWrite();\n}\n\n/****************************************************************\n * Function Name : fillCircleHelper\n * Description   : Used to do circles and roundrects\n * Returns       : NONE\n * Params        : @x: Center X Co-ordinate\n *                 @y: Center Y Co-ordinate\n *                 @r: Radius in pixels\n *                 @cornername: Corner radius in pixels\n *                 @color: Pixel color\n ****************************************************************/\nvoid fillCircleHelper(short x0, short y0, short r, unsigned char cornername,\n\t\t      short delta, short color) {\n\tshort f = 1 - r;\n\tshort ddF_x = 1;\n\tshort ddF_y = -2 * r;\n\tshort x = 0;\n\tshort y = r;\n\n\twhile (x < y) {\n\t\tif (f >= 0) {\n\t\t\ty--;\n\t\t\tddF_y += 2;\n\t\t\tf += ddF_y;\n\t\t}\n\t\tx++;\n\t\tddF_x += 2;\n\t\tf += ddF_x;\n\n\t\tif (cornername & 0x1) {\n\t\t\twriteFastVLine(x0 + x, y0 - y, 2 * y + 1 + delta,\n\t\t\t\t       color);\n\t\t\twriteFastVLine(x0 + y, y0 - x, 2 * x + 1 + delta,\n\t\t\t\t       color);\n\t\t}\n\t\tif (cornername & 0x2) {\n\t\t\twriteFastVLine(x0 - x, y0 - y, 2 * y + 1 + delta,\n\t\t\t\t       color);\n\t\t\twriteFastVLine(x0 - y, y0 - x, 2 * x + 1 + delta,\n\t\t\t\t       color);\n\t\t}\n\t}\n}\n\n/****************************************************************\n * Function Name : fillCircle\n * Description   : Fill the circle\n * Returns       : NONE\n * Params        : @x0: Center X Co-ordinate\n *                 @y0: Center Y Co-ordinate\n *                 @r: Radius in pixels\n *                 @color: Pixel color\n ****************************************************************/\nvoid fillCircle(short x0, short y0, short r, short color) {\n\t// startWrite();\n\twriteFastVLine(x0, y0 - r, 2 * r + 1, color);\n\tfillCircleHelper(x0, y0, r, 3, 0, color);\n\t// endWrite();\n}\n\n/****************************************************************\n * Function Name : drawTriangle\n * Description   : Draw a triangle\n * Returns       : NONE\n * Params        : @x0: Corner-1 X Co-ordinate\n *                 @y0: Corner-1 Y Co-ordinate\n *                 @x1: Corner-2 X Co-ordinate\n *                 @y1: Corner-2 Y Co-ordinate\n *                 @x2: Corner-3 X Co-ordinate\n *                 @y2: Corner-3 Y Co-ordinate\n *                 @color: Pixel color\n ****************************************************************/\nvoid drawTriangle(short x0, short y0, short x1, short y1, short x2, short y2,\n\t\t  short color) {\n\tdrawLine(x0, y0, x1, y1, color);\n\tdrawLine(x1, y1, x2, y2, color);\n\tdrawLine(x2, y2, x0, y0, color);\n}\n\n/****************************************************************\n * Function Name : fillTriangle\n * Description   : Fill a triangle\n * Returns       : NONE\n * Params        : @x0: Corner-1 X Co-ordinate\n *                 @y0: Corner-1 Y Co-ordinate\n *                 @x1: Corner-2 X Co-ordinate\n *                 @y1: Corner-2 Y Co-ordinate\n *                 @x2: Corner-3 X Co-ordinate\n *                 @y2: Corner-3 Y Co-ordinate\n *                 @color: Pixel color\n ****************************************************************/\nvoid fillTriangle(short x0, short y0, short x1, short y1, short x2, short y2,\n\t\t  short color) {\n\tshort a, b, y, last, dx01, dy01, dx02, dy02, dx12, dy12;\n\tint sa, sb;\n\n\t// Sort coordinates by Y order (y2 >= y1 >= y0)\n\tif (y0 > y1) {\n\t\tSWAP(y0, y1);\n\t\tSWAP(x0, x1);\n\t}\n\tif (y1 > y2) {\n\t\tSWAP(y2, y1);\n\t\tSWAP(x2, x1);\n\t}\n\tif (y0 > y1) {\n\t\tSWAP(y0, y1);\n\t\tSWAP(x0, x1);\n\t}\n\n\t// startWrite();\n\tif (y0 ==\n\t    y2) {  // Handle awkward all-on-same-line case as its own thing\n\t\ta = b = x0;\n\t\tif (x1 < a)\n\t\t\ta = x1;\n\t\telse if (x1 > b)\n\t\t\tb = x1;\n\t\tif (x2 < a)\n\t\t\ta = x2;\n\t\telse if (x2 > b)\n\t\t\tb = x2;\n\t\twriteFastHLine(a, y0, b - a + 1, color);\n\t\t// endWrite();\n\t\treturn;\n\t}\n\n\tdx01 = x1 - x0;\n\tdy01 = y1 - y0;\n\tdx02 = x2 - x0;\n\tdy02 = y2 - y0;\n\tdx12 = x2 - x1;\n\tdy12 = y2 - y1;\n\tsa = 0;\n\tsb = 0;\n\n\t// For upper part of triangle, find scanline crossings for segments\n\t// 0-1 and 0-2.  If y1=y2 (flat-bottomed triangle), the scanline y1\n\t// is included here (and second loop will be skipped, avoiding a /0\n\t// error there), otherwise scanline y1 is skipped here and handled\n\t// in the second loop...which also avoids a /0 error here if y0=y1\n\t// (flat-topped triangle).\n\tif (y1 == y2)\n\t\tlast = y1;  // Include y1 scanline\n\telse\n\t\tlast = y1 - 1;\t// Skip it\n\n\tfor (y = y0; y <= last; y++) {\n\t\ta = x0 + sa / dy01;\n\t\tb = x0 + sb / dy02;\n\t\tsa += dx01;\n\t\tsb += dx02;\n\t\t/* longhand:\n\t\ta = x0 + (x1 - x0) * (y - y0) / (y1 - y0);\n\t\tb = x0 + (x2 - x0) * (y - y0) / (y2 - y0);\n\t\t */\n\t\tif (a > b) SWAP(a, b);\n\t\twriteFastHLine(a, y, b - a + 1, color);\n\t}\n\n\t// For lower part of triangle, find scanline crossings for segments\n\t// 0-2 and 1-2.  This loop is skipped if y1=y2.\n\tsa = dx12 * (y - y1);\n\tsb = dx02 * (y - y0);\n\tfor (; y <= y2; y++) {\n\t\ta = x1 + sa / dy12;\n\t\tb = x0 + sb / dy02;\n\t\tsa += dx12;\n\t\tsb += dx02;\n\t\t/* longhand:\n\t\ta = x1 + (x2 - x1) * (y - y1) / (y2 - y1);\n\t\tb = x0 + (x2 - x0) * (y - y0) / (y2 - y0);\n\t\t */\n\t\tif (a > b) SWAP(a, b);\n\t\twriteFastHLine(a, y, b - a + 1, color);\n\t}\n\t// endWrite();\n}\n\n/****************************************************************\n * Function Name : drawRoundRect\n * Description   : Draw a rounded rectangle\n * Returns       : NONE\n * Params        : @x: X Co-ordinate\n *                 @y: Y Co-ordinate\n *                 @w: Width\n *                 @h: height\n *                 @r: Corner radius\n *                 @color: Pixel color\n ****************************************************************/\nvoid drawRoundRect(short x, short y, short w, short h, short r, short color) {\n\t// smarter version\n\t// startWrite();\n\twriteFastHLine(x + r, y, w - 2 * r, color);\t     // Top\n\twriteFastHLine(x + r, y + h - 1, w - 2 * r, color);  // Bottom\n\twriteFastVLine(x, y + r, h - 2 * r, color);\t     // Left\n\twriteFastVLine(x + w - 1, y + r, h - 2 * r, color);  // Right\n\t// draw four corners\n\tdrawCircleHelper(x + r, y + r, r, 1, color);\n\tdrawCircleHelper(x + w - r - 1, y + r, r, 2, color);\n\tdrawCircleHelper(x + w - r - 1, y + h - r - 1, r, 4, color);\n\tdrawCircleHelper(x + r, y + h - r - 1, r, 8, color);\n\t// endWrite();\n}\n\n/****************************************************************\n * Function Name : fillRoundRect\n * Description   :  Fill a rounded rectangle\n * Returns       : NONE\n * Params        : @x: X Co-ordinate\n *                 @y: Y Co-ordinate\n *                 @w: Width\n *                 @h: height\n *                 @r: Corner radius\n *                 @color: Pixel color\n ****************************************************************/\nvoid fillRoundRect(short x, short y, short w, short h, short r, short color) {\n\t// smarter version\n\t// startWrite();\n\tfillRect(x + r, y, w - 2 * r, h, color);\n\n\t// draw four corners\n\tfillCircleHelper(x + w - r - 1, y + r, r, 1, h - 2 * r - 1, color);\n\tfillCircleHelper(x + r, y + r, r, 2, h - 2 * r - 1, color);\n\t// endWrite();\n}\n\n/*----------------------------------------------------------------------------\n * BITMAP API's\n ----------------------------------------------------------------------------*/\n\n/****************************************************************\n * Function Name : drawBitmap\n * Description   : Draw a bitmap\n * Returns       : NONE\n * Params        : @x: X Co-ordinate\n *                 @y: Y Co-ordinate\n *                 @bitmap: bitmap to display\n *                 @w: Width\n *                 @h: height\n *                 @color: Pixel color\n ****************************************************************/\nvoid drawBitmap(short x, short y, const unsigned char bitmap[], short w,\n\t\tshort h, short color) {\n\tshort byteWidth = 0, j = 0, i = 0;\n\tunsigned char byte = 0;\n\tbyteWidth = (w + 7) / 8;  // Bitmap scanline pad = whole byte\n\n\tfor (j = 0; j < h; j++, y++) {\n\t\tfor (i = 0; i < w; i++) {\n\t\t\tif (i & 7)\n\t\t\t\tbyte <<= 1;\n\t\t\telse\n\t\t\t\tbyte = pgm_read_byte(\n\t\t\t\t    &bitmap[j * byteWidth + i / 8]);\n\t\t\tif (byte & 0x80) drawPixel(x + i, y, color);\n\t\t}\n\t}\n}\n\n/*----------------------------------------------------------------------------\n * TEXT AND CHARACTER HANDLING API's\n ----------------------------------------------------------------------------*/\n\n/****************************************************************\n * Function Name : setCursor\n * Description   : Sets the cursor on f(x,y)\n * Returns       : NONE.\n * Params        : @x - X-Cordinate\n *                 @y - Y-Cordinate\n ****************************************************************/\nvoid setCursor(short x, short y) {\n\tcursor_x = x;\n\tcursor_y = y;\n}\n\n/****************************************************************\n * Function Name : getCursorX\n * Description   : Get cursor at X- Cordinate\n * Returns       : x cordinate value.\n ****************************************************************/\nshort getCursorX() { return cursor_x; }\n\n/****************************************************************\n * Function Name : getCursorY\n * Description   : Get cursor at Y- Cordinate\n * Returns       : y cordinate value.\n ****************************************************************/\nshort getCursorY() { return cursor_y; }\n\n/****************************************************************\n * Function Name : setTextSize\n * Description   : Set text size\n * Returns       : @s - font size\n ****************************************************************/\nvoid setTextSize(unsigned char s) { textsize = (s > 0) ? s : 1; }\n\n/****************************************************************\n * Function Name : setTextColor\n * Description   : Set text color\n * Returns       : @c - Color\n ****************************************************************/\nvoid setTextColor(short c) {\n\t// For 'transparent' background, we'll set the bg\n\t// to the same as fg instead of using a flag\n\ttextcolor = textbgcolor = c;\n}\n\n/****************************************************************\n * Function Name : setTextWrap\n * Description   : Wraps the text\n * Returns       : @w - enable or disbale wrap\n ****************************************************************/\nvoid setTextWrap(bool w) { wrap = w; }\n\n/****************************************************************\n * Function Name : getRotation\n * Description   : Get the rotation value\n * Returns       : NONE.\n ****************************************************************/\nunsigned char getRotation() { return _rotation; }\n\n/****************************************************************\n * Function Name : drawBitmap\n * Description   : Draw a character\n * Returns       : NONE\n * Params        : @x: X Co-ordinate\n *                 @y: Y Co-ordinate\n *                 @c: Character\n *                 @size: Scaling factor\n *                 @bg: Background color\n *                 @color: Pixel color\n ****************************************************************/\nvoid drawChar(short x, short y, unsigned char c, short color, short bg,\n\t      unsigned char size) {\n\tunsigned char line = 0, *bitmap = NULL, w = 0, h = 0, xx = 0, yy = 0,\n\t\t      bits = 0, bit = 0;\n\tchar i = 0, j = 0, xo = 0, yo = 0;\n\tshort bo = 0, xo16 = 0, yo16 = 0;\n\tGFXglyphPtr glyph;\n\tif (!gfxFont) {\n\t\t// 'Classic' built-in font\n\t\tif ((x >= _width) || (y >= _height) ||\n\t\t    ((x + 6 * size - 1) < 0) || ((y + 8 * size - 1) < 0))\n\t\t\treturn;\n\n\t\t// Handle 'classic' charset behavior\n\t\tif (!_cp437 && (c >= 176)) c++;\n\n\t\t// Char bitmap = 5 columns\n\t\tfor (i = 0; i < 5; i++) {\n\t\t\tline = pgm_read_byte(&ssd1306_font5x7[c * 5 + i]);\n\t\t\tfor (j = 0; j < 8; j++, line >>= 1) {\n\t\t\t\tif (line & 1) {\n\t\t\t\t\tif (size == 1)\n\t\t\t\t\t\tdrawPixel(x + i, y + j, color);\n\t\t\t\t\telse\n\t\t\t\t\t\tfillRect(x + i * size,\n\t\t\t\t\t\t\t y + j * size, size,\n\t\t\t\t\t\t\t size, color);\n\t\t\t\t} else if (bg != color) {\n\t\t\t\t\tif (size == 1)\n\t\t\t\t\t\tdrawPixel(x + i, y + j, bg);\n\t\t\t\t\telse\n\t\t\t\t\t\tfillRect(x + i * size,\n\t\t\t\t\t\t\t y + j * size, size,\n\t\t\t\t\t\t\t size, bg);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\t// If opaque, draw vertical line for last column\n\t\tif (bg != color) {\n\t\t\tif (size == 1)\n\t\t\t\twriteFastVLine(x + 5, y, 8, bg);\n\t\t\telse\n\t\t\t\tfillRect(x + 5 * size, y, size, 8 * size, bg);\n\t\t}\n\n\t}\n\t// Custom font\n\telse {\n\t\t// Character is assumed previously filtered by write() to\n\t\t// eliminate newlines, returns, non-printable characters, etc.\n\t\t// Calling drawChar() directly with 'bad' characters of font may\n\t\t// cause mayhem!\n\n\t\tc -= (unsigned char)pgm_read_byte(&gfxFont->first);\n\t\tglyph = &(((GFXglyphT *)pgm_read_pointer(&gfxFont->glyph))[c]);\n\t\tbitmap = (unsigned char *)pgm_read_pointer(&gfxFont->bitmap);\n\t\tbo = pgm_read_word(&glyph->bitmapOffset);\n\t\tw = pgm_read_byte(&glyph->width);\n\t\th = pgm_read_byte(&glyph->height);\n\t\txo = pgm_read_byte(&glyph->xOffset);\n\t\tyo = pgm_read_byte(&glyph->yOffset);\n\n\t\tif (size > 1) {\n\t\t\txo16 = xo;\n\t\t\tyo16 = yo;\n\t\t}\n\n\t\t// Todo: Add character clipping here\n\n\t\t// NOTE: THERE IS NO 'BACKGROUND' COLOR OPTION ON CUSTOM FONTS.\n\t\t// THIS IS ON PURPOSE AND BY DESIGN.  The background color\n\t\t// feature has typically been used with the 'classic' font to\n\t\t// overwrite old screen contents with new data.  This ONLY works\n\t\t// because the characters are a uniform size; it's not a\n\t\t// sensible thing to do with proportionally-spaced fonts with\n\t\t// glyphs of varying sizes (and that may overlap).  To replace\n\t\t// previously-drawn text when using a custom font, use the\n\t\t// getTextBounds() function to determine the smallest rectangle\n\t\t// encompassing a string, erase the area with fillRect(), then\n\t\t// draw new text.  This WILL unfortunately 'blink' the text, but\n\t\t// is unavoidable.  Drawing 'background' pixels will NOT fix\n\t\t// this, only creates a new set of problems.  Have an idea to\n\t\t// work around this (a canvas object type for MCUs that can\n\t\t// afford the RAM and displays supporting setAddrWindow() and\n\t\t// pushColors()), but haven't implemented this yet.\n\t\tfor (yy = 0; yy < h; yy++) {\n\t\t\tfor (xx = 0; xx < w; xx++) {\n\t\t\t\tif (!(bit++ & 7)) {\n\t\t\t\t\tbits = pgm_read_byte(&bitmap[bo++]);\n\t\t\t\t}\n\t\t\t\tif (bits & 0x80) {\n\t\t\t\t\tif (size == 1) {\n\t\t\t\t\t\tdrawPixel(x + xo + xx,\n\t\t\t\t\t\t\t  y + yo + yy, color);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tfillRect(x + (xo16 + xx) * size,\n\t\t\t\t\t\t\t y + (yo16 + yy) * size,\n\t\t\t\t\t\t\t size, size, color);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbits <<= 1;\n\t\t\t}\n\t\t}\n\t}  // End classic vs custom font\n}\n\n/****************************************************************\n * Function Name : write\n * Description   : Base function for text and character handling\n * Returns       : 1\n * Params        : @c: Character\n ****************************************************************/\nshort oled_write(unsigned char c) {\n\tunsigned char first = 0, w = 0, h = 0;\n\tshort xo = 0;\n\tGFXglyphPtr glyph;\n\tif (!gfxFont) {\n\t\t// 'Classic' built-in font\n\t\tif (c == '\\n') {\n\t\t\t// Newline?\n\t\t\tcursor_x = 0;\t\t   // Reset x to zero,\n\t\t\tcursor_y += textsize * 8;  // advance y one line\n\t\t} else if (c != '\\r') {\n\t\t\t// Ignore carriage returns\n\t\t\tif (wrap && ((cursor_x + textsize * 6) > _width)) {\n\t\t\t\t// Off right?\n\t\t\t\tcursor_x = 0;\t\t   // Reset x to zero,\n\t\t\t\tcursor_y += textsize * 8;  // advance y one line\n\t\t\t}\n\t\t\tdrawChar(cursor_x, cursor_y, c, textcolor, textbgcolor,\n\t\t\t\t textsize);\n\t\t\tcursor_x += textsize * 6;  // Advance x one char\n\t\t}\n\n\t} else {\n\t\t// Custom font\n\t\tif (c == '\\n') {\n\t\t\tcursor_x = 0;\n\t\t\tcursor_y +=\n\t\t\t    (short)textsize *\n\t\t\t    (unsigned char)pgm_read_byte(&gfxFont->yAdvance);\n\t\t} else if (c != '\\r') {\n\t\t\tfirst = pgm_read_byte(&gfxFont->first);\n\t\t\tif ((c >= first) && (c <= (unsigned char)pgm_read_byte(\n\t\t\t\t\t\t      &gfxFont->last))) {\n\t\t\t\tglyph = &(((GFXglyphT *)pgm_read_pointer(\n\t\t\t\t    &gfxFont->glyph))[c - first]);\n\t\t\t\tw = pgm_read_byte(&glyph->width);\n\t\t\t\th = pgm_read_byte(&glyph->height);\n\t\t\t\tif ((w > 0) && (h > 0)) {\n\t\t\t\t\t// Is there an associated bitmap?\n\t\t\t\t\txo = (char)pgm_read_byte(\n\t\t\t\t\t    &glyph->xOffset);  // sic\n\t\t\t\t\tif (wrap &&\n\t\t\t\t\t    ((cursor_x + textsize * (xo + w)) >\n\t\t\t\t\t     _width)) {\n\t\t\t\t\t\tcursor_x = 0;\n\t\t\t\t\t\tcursor_y +=\n\t\t\t\t\t\t    (short)textsize *\n\t\t\t\t\t\t    (unsigned char)\n\t\t\t\t\t\t\tpgm_read_byte(\n\t\t\t\t\t\t\t    &gfxFont->yAdvance);\n\t\t\t\t\t}\n\t\t\t\t\tdrawChar(cursor_x, cursor_y, c,\n\t\t\t\t\t\t textcolor, textbgcolor,\n\t\t\t\t\t\t textsize);\n\t\t\t\t}\n\t\t\t\tcursor_x += (unsigned char)pgm_read_byte(\n\t\t\t\t\t\t&glyph->xAdvance) *\n\t\t\t\t\t    (short)textsize;\n\t\t\t}\n\t\t}\n\t}\n\treturn 1;\n}\n\n/****************************************************************\n * Function Name : print\n * Description   : Base function for printing strings\n * Returns       : No. of characters printed\n * Params        : @buffer: Ptr to buffer containing the string\n *                 @size: Length of the string.\n ****************************************************************/\nshort print(const unsigned char *buffer, short size) {\n\tshort n = 0;\n\twhile (size--) {\n\t\tif (oled_write(*buffer++))\n\t\t\tn++;\n\t\telse\n\t\t\tbreak;\n\t}\n\treturn (n);\n}\n\n/****************************************************************\n * Function Name : print_str\n * Description   : Print strings\n * Returns       : No. of characters printed\n * Params        : @strPtr: Ptr to buffer containing the string\n ****************************************************************/\nshort print_str(const unsigned char *strPtr) {\n\treturn print(strPtr, strlen(strPtr));\n}\n\n/****************************************************************\n * Function Name : println\n * Description   : Move to next line\n * Returns       : No. of characters printed\n * Params        : NONE.\n ****************************************************************/\nshort println() { return print_str(\"\\r\\n\"); }\n\n/****************************************************************\n * Function Name : print_strln\n * Description   : Print strings and move to next line\n * Returns       : No. of characters printed\n * Params        : @strPtr: Ptr to buffer containing the string\n ****************************************************************/\nshort print_strln(const unsigned char *strPtr) {\n\tshort n = 0;\n\tn = print(strPtr, strlen(strPtr));\n\tn += print_str(\"\\r\\n\");\n\treturn (n);\n}\n\n/*----------------------------------------------------------------------------\n * NUMBERS HANDLING API's\n ----------------------------------------------------------------------------*/\n\n/****************************************************************\n * Function Name : printNumber\n * Description   : Base function to print unsigned numbers\n * Returns       : No. of characters printed\n * Params        : @n: Number\n *                 @base: Base e.g. HEX, BIN...\n ****************************************************************/\nshort printNumber(unsigned long n, unsigned char base) {\n\tunsigned long m = 0;\n\tchar c = 0;\n\tchar buf[8 * sizeof(long) + 1];\t // Assumes 8-bit chars plus zero byte.\n\tchar *str = &buf[sizeof(buf) - 1];\n\n\t*str = '\\0';\n\n\t// prevent crash if called with base == 1\n\tif (base < 2) base = 10;\n\tdo {\n\t\tm = n;\n\t\tn /= base;\n\t\tc = m - base * n;\n\t\t*--str = c < 10 ? c + '0' : c + 'A' - 10;\n\t} while (n);\n\t// return oled_write((unsigned char)str);\n\treturn print_str(str);\n}\n\n/****************************************************************\n * Function Name : printNumber_UL\n * Description   : Print unsigned long data types\n * Returns       : No. of characters printed\n * Params        : @n: Number\n *                 @base: Base e.g. HEX, BIN...\n ****************************************************************/\nshort printNumber_UL(unsigned long n, int base) {\n\tif (base == 0)\n\t\treturn oled_write(n);\n\telse\n\t\treturn printNumber(n, base);\n}\n\n/****************************************************************\n * Function Name : printNumber_UL_ln\n * Description   : Print unsigned long & advance to next line\n * Returns       : No. of characters printed\n * Params        : @n: Number\n *                 @base: Base e.g. HEX, BIN...\n ****************************************************************/\nshort printNumber_UL_ln(unsigned long num, int base) {\n\tshort n = 0;\n\tn = printNumber(num, base);\n\tn += println();\n\treturn (n);\n}\n\n/****************************************************************\n * Function Name : printNumber_UI\n * Description   : Print unsigned int data types\n * Returns       : No. of characters printed\n * Params        : @n: Number\n *                 @base: Base e.g. HEX, BIN...\n ****************************************************************/\nshort printNumber_UI(unsigned int n, int base) {\n\treturn printNumber((unsigned long)n, base);\n}\n\n/****************************************************************\n * Function Name : printNumber_UI_ln\n * Description   : Print unsigned int & advance to next line\n * Returns       : No. of characters printed\n * Params        : @n: Number\n *                 @base: Base e.g. HEX, BIN...\n ****************************************************************/\nshort printNumber_UI_ln(unsigned int n, int base) {\n\tshort a = 0;\n\ta = printNumber((unsigned long)n, base);\n\ta += println();\n\treturn (a);\n}\n\n/****************************************************************\n * Function Name : printNumber_UC\n * Description   : Print unsigned char data types\n * Returns       : No. of characters printed\n * Params        : @n: Number\n *                 @base: Base e.g. HEX, BIN...\n ****************************************************************/\nshort printNumber_UC(unsigned char b, int base) {\n\treturn printNumber((unsigned long)b, base);\n}\n\n/****************************************************************\n * Function Name : printNumber_UC_ln\n * Description   : Print unsigned char & advance to next line\n * Returns       : No. of characters printed\n * Params        : @n: Number\n *                 @base: Base e.g. HEX, BIN...\n ****************************************************************/\nshort printNumber_UC_ln(unsigned char b, int base) {\n\tshort n = 0;\n\tn = printNumber((unsigned long)b, base);\n\tn += println();\n\treturn (n);\n}\n\n/****************************************************************\n * Function Name : printNumber_L\n * Description   : Print Long data types\n * Returns       : No. of characters printed\n * Params        : @n: Number\n *                 @base: Base e.g. HEX, BIN...\n ****************************************************************/\nshort printNumber_L(long n, int base) {\n\tint t = 0;\n\tif (base == 0) {\n\t\treturn oled_write(n);\n\t} else if (base == 10) {\n\t\tif (n < 0) {\n\t\t\tt = oled_write('-');\n\t\t\tn = -n;\n\t\t\treturn printNumber(n, 10) + t;\n\t\t}\n\t\treturn printNumber(n, 10);\n\t} else {\n\t\treturn printNumber(n, base);\n\t}\n}\n\n/****************************************************************\n * Function Name : printNumber_UC_ln\n * Description   : Print long & advance to next line\n * Returns       : No. of characters printed\n * Params        : @n: Number\n *                 @base: Base e.g. HEX, BIN...\n ****************************************************************/\nshort printNumber_L_ln(long num, int base) {\n\tshort n = 0;\n\tn = printNumber_L(num, base);\n\tn += println();\n\treturn n;\n}\n\n/****************************************************************\n * Function Name : printNumber_I\n * Description   : Print int data types\n * Returns       : No. of characters printed\n * Params        : @n: Number\n *                 @base: Base e.g. HEX, BIN...\n ****************************************************************/\nshort printNumber_I(int n, int base) { return printNumber_L((long)n, base); }\n\n/****************************************************************\n * Function Name : printNumber_I_ln\n * Description   : Print int & advance to next line\n * Returns       : No. of characters printed\n * Params        : @n: Number\n *                 @base: Base e.g. HEX, BIN...\n ****************************************************************/\nshort printNumber_I_ln(int n, int base) {\n\tshort a = 0;\n\ta = printNumber_L((long)n, base);\n\ta += println();\n\treturn a;\n}\n\n/****************************************************************\n * Function Name : printFloat\n * Description   : Print floating Pt. No's.\n * Returns       : No. of characters printed\n * Params        : @n: Number\n *                 @digits: Resolution\n ****************************************************************/\nshort printFloat(double number, unsigned char digits) {\n\tunsigned char i = 0;\n\tshort n = 0;\n\tunsigned long int_part = 0;\n\tdouble remainder = 0.0;\n\tint toPrint = 0;\n\n\t// Round correctly so that print(1.999, 2) prints as \"2.00\"\n\tdouble rounding = 0.5;\n\n\tif (isnan(number)) return print_str(\"nan\");\n\tif (isinf(number)) return print_str(\"inf\");\n\tif (number > 4294967040.0)\n\t\treturn print_str(\"ovf\");  // constant determined empirically\n\tif (number < -4294967040.0)\n\t\treturn print_str(\"ovf\");  // constant determined empirically\n\n\t// Handle negative numbers\n\tif (number < 0.0) {\n\t\tn += oled_write('-');\n\t\tnumber = -number;\n\t}\n\n\tfor (i = 0; i < digits; ++i) rounding /= 10.0;\n\n\tnumber += rounding;\n\n\t// Extract the integer part of the number and print it\n\tint_part = (unsigned long)number;\n\tremainder = number - (double)int_part;\n\tn += printNumber_UL(int_part, DEC);\n\n\t// Print the decimal point, but only if there are digits beyond\n\tif (digits > 0) {\n\t\tn += print_str(\".\");\n\t}\n\n\t// Extract digits from the remainder one at a time\n\twhile (digits-- > 0) {\n\t\tremainder *= 10.0;\n\t\ttoPrint = (int)remainder;\n\t\tn += printNumber_I(toPrint, DEC);\n\t\tremainder -= toPrint;\n\t}\n\treturn n;\n}\n\n/****************************************************************\n * Function Name : printFloat_ln\n * Description   : Print floating Pt. No and advance to next line\n * Returns       : No. of characters printed\n * Params        : @n: Number\n *                 @digits: Resolution\n ****************************************************************/\nshort printFloat_ln(double num, int digits) {\n\tshort n = 0;\n\tn = printFloat(num, digits);\n\tn += println();\n\treturn n;\n}\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/src/SSD1306_OLED_Library/SSD1306_OLED.h",
    "content": "/*\n * MIT License\n\nCopyright (c) 2017 DeeplyEmbedded\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in all\ncopies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\nSOFTWARE.\n\n * SSD1306_OLED.h\n *\n *  Created on : Sep 21, 2017\n *  Author     : Vinay Divakar\n *  Website    : www.deeplyembedded.org\n */\n\n#ifndef SSD1306_OLED_H_\n#define SSD1306_OLED_H_\n\n/* Lib's */\n#include <stdbool.h>\n\n/* Find Min and Max - MACROS */\n#define MIN(a, b) (((a) < (b)) ? (a) : (b))\n#define MAX(a, b) (((a) > (b)) ? (a) : (b))\n\n/* I2C Address of SSD1306 */\n#define SSD1306_OLED_ADDR 0x3C\n#define DISPLAY_BUFF_SIZE (SSD1306_LCDWIDTH * SSD1306_LCDHEIGHT / 8)\n\n/* COLOR MACROS */\n#define WHITE 1\n#define BLACK 0\n#define INVERSE 2\n\n/* Number output format */\n#define DEC 10\n#define HEX 16\n#define OCT 8\n#define BIN 2\n#define DEFAULT 0\n\n/*D/C# bit is '0' indicating that following\n * byte is a command. '1' is for data\n */\n#define SSD1306_CNTRL_CMD 0x00\n#define SSD1306_CNTRL_DATA 0x40\n\n/*-----------------------Enable the WxL of the Display\n * ---------------------------*/\n//#define SSD1306_128_64\n#define SSD1306_128_32\n//#define SSD1306_96_16\n/*--------------------------------------------------------------------------------*/\n\n/* LCD HxW i.e. 64x128 || WxL i.e. 128x64 */\n#if defined SSD1306_128_64\n#define SSD1306_LCDWIDTH 128\n#define SSD1306_LCDHEIGHT 64\n#endif\n#if defined SSD1306_128_32\n#define SSD1306_LCDWIDTH 128\n#define SSD1306_LCDHEIGHT 32\n#endif\n#if defined SSD1306_96_16\n#define SSD1306_LCDWIDTH 96\n#define SSD1306_LCDHEIGHT 16\n#endif\n\n/* SSD1306 Commands */\n#define SSD1306_DISPLAY_OFF 0xAE\n#define SSD1306_SET_DISP_CLK 0xD5\n#define SSD1306_SET_MULTIPLEX 0xA8\n#define SSD1306_SET_DISP_OFFSET 0xD3\n#define SSD1306_SET_DISP_START_LINE 0x40\n#define SSD1306_CONFIG_CHARGE_PUMP 0x8D\n#define SSD1306_SET_MEM_ADDR_MODE 0x20\n#define SSD1306_SEG_REMAP (0xA0 | 0x01)\n#define SSD1306_SEG_REMAP1 0xA0\n#define SSD1306_SET_COMSCANDEC 0xC8\n#define SSD1306_SET_COMSCANDEC1 0xC0\n#define SSD1306_SET_COMPINS 0xDA\n#define SSD1306_SET_CONTRAST 0x81\n#define SSD1306_SET_PRECHARGE 0xD9\n#define SSD1306_SET_VCOMDETECT 0xDB\n#define SSD1306_DISPLAYALLON_RESUME 0xA4\n#define SSD1306_NORMAL_DISPLAY 0xA6\n#define SSD1306_DISPLAYON 0xAF\n#define SSD1306_SET_COL_ADDR 0x21\n#define SSD1306_PAGEADDR 0x22\n#define SSD1306_INVERT_DISPLAY 0x01\n#define SSD1306_NORMALIZE_DISPLAY 0x00\n\n/* SDD1306 Scroll Commands */\n#define SSD1306_SET_VERTICAL_SCROLL_AREA 0xA3\n#define SSD1306_ACTIVATE_SCROLL 0x2F\n#define SSD1306_DEACTIVATE_SCROLL 0x2E\n#define SSD1306_RIGHT_HORIZONTAL_SCROLL 0x26\n#define SSD1306_LEFT_HORIZONTAL_SCROLL 0x27\n#define SSD1306_VERTICAL_AND_RIGHT_HORIZONTAL_SCROLL 0x29\n#define SSD1306_VERTICAL_AND_LEFT_HORIZONTAL_SCROLL 0x2A\n#define SSD1306_INVERTDISPLAY 0xA7\n\n/* SSD1306 Configuration Commands */\n#define SSD1306_DISPCLK_DIV 0x80\n#if defined SSD1306_128_64\n#define SSD1306_MULT_64 0x3F\n#endif\n#if defined SSD1306_128_32\n#define SSD1306_MULT_64 0x1F\n#endif\n#define SSD1306_MULT_64 0x1F\n#define SSD1306_DISP_OFFSET_VAL 0x00\n#define SSD1306_COL_START_ADDR 0x00\t\t     // Reset to = 0\n#define SSD1306_COL_END_ADDR (SSD1306_LCDWIDTH - 1)  // Reset to = 127\n#define SSD1306_PG_START_ADDR 0x00\n#define SSD1306_PG_END_ADDR 7\n#define SSD1306_CHARGE_PUMP_EN 0x14\n#if defined SSD1306_128_64\n#define SSD1306_CONFIG_COM_PINS 0x12\n#endif\n#if defined SSD1306_128_32\n#define SSD1306_CONFIG_COM_PINS 0x02\n#endif\n#define SSD1306_CONTRAST_VAL 0xCF  // 207\n#define SSD1306_PRECHARGE_VAL 0xF1\n#define SSD1306_VCOMH_VAL 0x40\n#define SSD1306_MULT_DAT (SSD1306_LCDHEIGHT - 1)\n#define SSD1306_HOR_MM 0x00\n\n/*SSD1306 Display API's */\nextern void clearDisplay();\nextern void display_Init_seq();\nextern void Display();\nextern void Init_Col_PG_addrs(unsigned char col_start_addr,\n\t\t\t      unsigned char col_end_addr,\n\t\t\t      unsigned char pg_start_addr,\n\t\t\t      unsigned char pg_end_addr);\nextern void setRotation(unsigned char x);\nextern void startscrollright(unsigned char start, unsigned char stop);\nextern void startscrollleft(unsigned char start, unsigned char stop);\nextern void startscrolldiagright(unsigned char start, unsigned char stop);\nextern void startscrolldiagleft(unsigned char start, unsigned char stop);\nextern void stopscroll();\nextern void setCursor(short x, short y);\nextern short getCursorX();\nextern short getCursorY();\nextern unsigned char getRotation();\nextern void invertDisplay(unsigned char i);\nextern void display_rotate();\nextern void display_normal();\n\n/*SSD1306 Graphics Handling API's */\nextern signed char drawPixel(short x, short y, short color);\nextern void writeLine(short x0, short y0, short x1, short y1, short color);\nextern void drawCircleHelper(short x0, short y0, short r,\n\t\t\t     unsigned char cornername, short color);\nextern void drawLine(short x0, short y0, short x1, short y1, short color);\nextern void drawRect(short x, short y, short w, short h, short color);\nextern void fillRect(short x, short y, short w, short h, short color);\nextern void drawCircle(short x0, short y0, short r, short color);\nextern void fillCircleHelper(short x0, short y0, short r,\n\t\t\t     unsigned char cornername, short delta,\n\t\t\t     short color);\nextern void fillCircle(short x0, short y0, short r, short color);\nextern void drawTriangle(short x0, short y0, short x1, short y1, short x2,\n\t\t\t short y2, short color);\nextern void fillTriangle(short x0, short y0, short x1, short y1, short x2,\n\t\t\t short y2, short color);\nextern void drawRoundRect(short x, short y, short w, short h, short r,\n\t\t\t  short color);\nextern void fillRoundRect(short x, short y, short w, short h, short r,\n\t\t\t  short color);\nextern void drawBitmap(short x, short y, const unsigned char bitmap[], short w,\n\t\t       short h, short color);\nextern short oled_write(unsigned char c);\n\n/*SSD1306 Text and Character Handling API's */\nextern void setTextSize(unsigned char s);\nextern void setTextColor(short c);\nextern void setTextWrap(bool w);\nextern void drawChar(short x, short y, unsigned char c, short color, short bg,\n\t\t     unsigned char size);\nextern short print_str(const unsigned char *strPtr);\nextern short println();\nextern short print_strln(const unsigned char *strPtr);\n\n/*SSD1306 Number Handling API's */\nextern short printNumber(unsigned long n, unsigned char base);\nextern short printNumber_UL(unsigned long n, int base);\nextern short printNumber_UL_ln(unsigned long num, int base);\nextern short printNumber_UI(unsigned int n, int base);\nextern short printNumber_UI_ln(unsigned int n, int base);\nextern short printNumber_UC(unsigned char b, int base);\nextern short printNumber_UC_ln(unsigned char b, int base);\nextern short printNumber_L(long n, int base);\nextern short printNumber_L_ln(long num, int base);\nextern short printNumber_I(int n, int base);\nextern short printNumber_I_ln(int n, int base);\nextern short printFloat(double number, unsigned char digits);\nextern short printFloat_ln(double num, int digits);\n#endif /* SSD1306_OLED_H_ */\n"
  },
  {
    "path": "luci-app-oled/luci-app-oled/src/SSD1306_OLED_Library/gfxfont.h",
    "content": "#ifndef _GFXFONT_H_\n#define _GFXFONT_H_\n\ntypedef struct {\t\t      // Data stored PER GLYPH\n\tunsigned short bitmapOffset;  // Pointer into GFXfont->bitmap\n\tunsigned char width, height;  // Bitmap dimensions in pixels\n\tunsigned char xAdvance;\t      // Distance to advance cursor (x axis)\n\tchar xOffset, yOffset;\t      // Dist from cursor pos to UL corner\n} GFXglyphT, *GFXglyphPtr;\n\ntypedef struct {\t\t    // Data stored for FONT AS A WHOLE:\n\tunsigned char *bitmap;\t    // Glyph bitmaps, concatenated\n\tGFXglyphPtr glyph;\t    // Glyph array\n\tunsigned char first, last;  // ASCII extents\n\tunsigned char yAdvance;\t    // Newline distance (y axis)\n} GFXfontT, *GFXfontPtr;\n\n#endif\t// _GFXFONT_H_\n"
  },
  {
    "path": "luci-app-onliner/Makefile",
    "content": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support arp online\nLUCI_PKGARCH:=all\nPKG_NAME:=luci-app-onliner\nPKG_VERSION:=1.2\n\ndefine Package/luci-app-onliner/install\n    $(INSTALL_DIR) $(1)/usr/lib/lua/luci\n\tcp -pR ./luasrc/* $(1)/usr/lib/lua/luci\n\t$(INSTALL_DIR) $(1)/\n\tcp -pR ./root/* $(1)/\nendef\n\ndefine Package/luci-app-onliner/postinst\n#!/bin/sh\n\trm -f /tmp/luci-indexcache\n\trm -f /tmp/luci-modulecache/*\n\tchmod -R 755 /usr/share/onliner/*\nexit 0\nendef\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n\n"
  },
  {
    "path": "luci-app-onliner/luasrc/controller/onliner.lua",
    "content": "module(\"luci.controller.onliner\",package.seeall)\nnixio=require\"nixio\"\n\nfunction index()\n\tentry({\"admin\", \"status\", \"onliner\"}, template(\"onliner/onliner\"), _(\"在线用户\"))\n\tentry({\"admin\", \"status\", \"onliner\", \"setnlbw\"}, call(\"set_nlbw\"))\nend\n\nfunction set_nlbw()\n\tif nixio.fs.access(\"/var/run/onsetnlbw\") then\n\t\tnixio.fs.writefile(\"/var/run/onsetnlbw\",\"1\");\n\telse\n\t\tio.popen(\"/usr/share/onliner/setnlbw.sh &\")\n\tend\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write('')\nend\n"
  },
  {
    "path": "luci-app-onliner/luasrc/view/onliner/display.htm",
    "content": "<%#\n Copyright 2017 Jo-Philipp Wich <jo@mein.io>\n Licensed to the public under the Apache License 2.0.\n-%>\n\n<% css = [[\n\n\t#chartjs-tooltip {\n\t\topacity: 0;\n\t\tposition: absolute;\n\t\tbackground: rgba(0, 0, 0, .7);\n\t\tcolor: white;\n\t\tpadding: 3px;\n\t\tborder-radius: 3px;\n\t\t-webkit-transition: all .1s ease;\n\t\ttransition: all .1s ease;\n\t\tpointer-events: none;\n\t\t-webkit-transform: translate(-50%, 0);\n\t\ttransform: translate(-50%, 0);\n\t\tz-index: 200;\n\t}\n\n\t#chartjs-tooltip.above {\n\t\t-webkit-transform: translate(-50%, -100%);\n\t\ttransform: translate(-50%, -100%);\n\t}\n\n\t#chartjs-tooltip.above:before {\n\t\tborder: solid;\n\t\tborder-color: #111 transparent;\n\t\tborder-color: rgba(0, 0, 0, .8) transparent;\n\t\tborder-width: 8px 8px 0 8px;\n\t\tbottom: 1em;\n\t\tcontent: \"\";\n\t\tdisplay: block;\n\t\tleft: 50%;\n\t\ttop: 100%;\n\t\tposition: absolute;\n\t\tz-index: 99;\n\t\t-webkit-transform: translate(-50%, 0);\n\t\ttransform: translate(-50%, 0);\n\t}\n\n\ttable {\n\t\tborder: 1px solid #999;\n\t\tborder-collapse: collapse;\n\t\tmargin: 0 0 2px !important;\n\t}\n\n\tth, td, table table td {\n\t\tborder: 1px solid #999;\n\t\ttext-align: right;\n\t\tpadding: 1px 3px !important;\n\t\twhite-space: nowrap;\n\t}\n\n\ttbody td {\n\t\tborder-bottom-color: #ccc;\n\t}\n\ttbody td:nth-last-child(4) {\n\t\twidth: 10%;\n\t}\n\ttbody td:nth-last-child(3) {\n\t\twidth: 10%;\n\t}\n\ttbody td:nth-last-child(2) {\n\t\twidth: 10%;\n\t}\n\ttbody td:nth-last-child(1) {\n\t\twidth: 10%;\n\t}\t\n\ttbody td[rowspan] {\n\t\tborder-bottom-color: #999;\n\t}\n\n\ttbody tr:last-child td {\n\t\tborder-bottom-color: #999;\n\t}\n\n\t.kpi {\n\t\tdisplay: inline-block;\n\t\tvertical-align: top;\n\t}\n\n\t.kpi ul {\n\t\tlist-style: none;\n\t}\n\n\t.kpi li {\n\t\tmargin: 10px;\n\t\tdisplay: none;\n\t}\n\n\t.kpi big {\n\t\tfont-weight: bold;\n\t}\n\n\t#detail-bubble {\n\t\tposition: absolute;\n\t\topacity: 0;\n\t\tvisibility: hidden;\n\t}\n\n\t#detail-bubble.in {\n\t\topacity: 1;\n\t\tvisibility: visible;\n\t\ttransition: opacity 0.5s;\n\t}\n\n\t#detail-bubble > div {\n\t\tborder: 1px solid #ccc;\n\t\tborder-radius: 2px;\n\t\tpadding: 5px;\n\t\tbackground: #fcfcfc;\n\t}\n\n\t#detail-bubble .head {\n\t\ttext-align: center;\n\t\twhite-space: nowrap;\n\t\tposition: relative;\n\t}\n\n\t#detail-bubble .head .dismiss {\n\t\ttop: 0;\n\t\tright: 0;\n\t\twidth: 20px;\n\t\tline-height: 20px;\n\t\ttext-align: center;\n\t\ttext-decoration: none;\n\t\tfont-weight: bold;\n\t\tcolor: #000;\n\t\tposition: absolute;\n\t\tfont-size: 20px;\n\t}\n\t#detail-bubble .kpi {\n\t\tmargin: 40px 5px 5px;\n\t\tfont-size: smaller;\n\t\ttext-align: left;\n\t}\n\n\t#detail-bubble .kpi ul {\n\t\tmargin: 0;\n\t}\n\n\t#bubble-arrow {\n\t\tborder: 1px solid #ccc;\n\t\tborder-width: 1px 0 0 1px;\n\t\tbackground: #fcfcfc;\n\t\twidth: 15px;\n\t\theight: 15px;\n\t\tposition: absolute;\n\t\tleft: 0;\n\t\ttop: -8px;\n\t\ttransform: rotate(45deg);\n\t\tmargin: 0 0 0 -8px;\n\t}\n\n\ttr.active > td {\n\t\tborder-bottom: 2px solid red;\n\t}\n\n\ttr.active > td.active {\n\t\tborder: 2px solid red;\n\t\tborder-bottom: none;\n\t}\n\n\ttd.detail {\n\t\tborder: 2px solid red;\n\t\tborder-top: none;\n\t\topacity: 0;\n\t\ttransition: opacity 0.5s;\n\t}\n\n\ttd.detail.in {\n\t\topacity: 1;\n\t}\n\n\tth.hostname,\n\ttd.hostname {\n\t\ttext-align: left;\n\t}\n\n]] -%>\n\n<%+header%>\n\n<script type=\"text/javascript\" src=\"<%=resource%>/cbi.js?v=git-19.338.43082-9e87e69\"></script>\n<script type=\"text/javascript\" src=\"<%=resource%>/nlbw.chart.min.js?v=git-19.338.43082-9e87e69\"></script>\n<script type=\"text/javascript\">//<![CDATA[\n\nvar chartRegistry = {},\n\ttrafficPeriods = [],\n\ttrafficData = { columns: [], data: [] },\n\thostNames = {},\n\thostInfo = <%=luci.util.serialize_json(luci.sys.net.host_hints())%>,\n\touiData = [];\n\n\nfunction off(elem)\n{\n\tvar val = [0, 0];\n\tdo {\n\t\tif (!isNaN(elem.offsetLeft) && !isNaN(elem.offsetTop)) {\n\t\t\tval[0] += elem.offsetLeft;\n\t\t\tval[1] += elem.offsetTop;\n\t\t}\n\t}\n\twhile ((elem = elem.offsetParent) != null);\n\treturn val;\n}\n\nChart.defaults.global.customTooltips = function(tooltip) {\n\tvar tooltipEl = document.getElementById('chartjs-tooltip');\n\n\tif (!tooltipEl) {\n\t\ttooltipEl = document.createElement('div');\n\t\ttooltipEl.setAttribute('id', 'chartjs-tooltip');\n\t\tdocument.body.appendChild(tooltipEl);\n\t}\n\n\tif (!tooltip) {\n\t\tif (tooltipEl.row)\n\t\t\ttooltipEl.row.style.backgroundColor = '';\n\n\t\ttooltipEl.style.opacity = 0;\n\t\treturn;\n\t}\n\n\tvar pos = off(tooltip.chart.canvas);\n\n\ttooltipEl.className = tooltip.yAlign;\n\ttooltipEl.innerHTML = tooltip.text[0];\n\n\ttooltipEl.style.opacity = 1;\n\ttooltipEl.style.left = pos[0] + tooltip.x + 'px';\n\ttooltipEl.style.top = pos[1] + tooltip.y - tooltip.caretHeight - tooltip.caretPadding + 'px';\n\n\tvar row = tooltip.text[1],\n\t    hue = tooltip.text[2];\n\n\tif (row && !isNaN(hue)) {\n\t\trow.style.backgroundColor = 'hsl(%u, 100%%, 80%%)'.format(hue);\n\t\ttooltipEl.row = row;\n\t}\n};\n\nChart.defaults.global.tooltipFontSize = 10;\nChart.defaults.global.tooltipTemplate = function(tip) {\n\ttip.label[0] = tip.label[0].format(tip.value);\n\treturn tip.label;\n};\n\nfunction kpi(id, val1, val2, val3)\n{\n\tvar e = document.getElementById(id);\n\n\tif (val1 && val2 && val3)\n\t\te.innerHTML = '<%:%s, %s and %s%>'.format(val1, val2, val3);\n\telse if (val1 && val2)\n\t\te.innerHTML = '<%:%s and %s%>'.format(val1, val2);\n\telse if (val1)\n\t\te.innerHTML = val1;\n\n\te.parentNode.style.display = val1 ? 'list-item' : '';\n}\n\nfunction query(filter, group, order)\n{\n\tvar keys = [], columns = {}, records = {}, result = [];\n\n\tif (typeof(group) !== 'function' && typeof(group) !== 'object')\n\t\tgroup = ['mac'];\n\n\tfor (var i = 0; i < trafficData.columns.length; i++)\n\t\tcolumns[trafficData.columns[i]] = i;\n\n\tfor (var i = 0; i < trafficData.data.length; i++) {\n\t\tvar record = trafficData.data[i];\n\n\t\tif (typeof(filter) === 'function' && filter(columns, record) !== true)\n\t\t\tcontinue;\n\n\t\tvar key;\n\n\t\tif (typeof(group) === 'function') {\n\t\t\tkey = group(columns, record);\n\t\t}\n\t\telse {\n\t\t\tkey = [];\n\n\t\t\tfor (var j = 0; j < group.length; j++)\n\t\t\t\tif (columns.hasOwnProperty(group[j]))\n\t\t\t\t\tkey.push(record[columns[group[j]]]);\n\n\t\t\tkey = key.join(',');\n\t\t}\n\n\t\tif (!records.hasOwnProperty(key)) {\n\t\t\tvar rec = {};\n\n\t\t\tfor (var col in columns)\n\t\t\t\trec[col] = record[columns[col]];\n\n\t\t\trecords[key] = rec;\n\t\t\tresult.push(rec);\n\t\t}\n\t\telse {\n\t\t\trecords[key].conns    += record[columns.conns];\n\t\t\trecords[key].rx_bytes += record[columns.rx_bytes];\n\t\t\trecords[key].rx_pkts  += record[columns.rx_pkts];\n\t\t\trecords[key].tx_bytes += record[columns.tx_bytes];\n\t\t\trecords[key].tx_pkts  += record[columns.tx_pkts];\n\t\t}\n\t}\n\n\tif (typeof(order) === 'function')\n\t\tresult.sort(order);\n\n\treturn result;\n}\n\nfunction oui(mac) {\n\tvar m, l = 0, r = ouiData.length / 3 - 1;\n\tvar mac1 = parseInt(mac.replace(/[^a-fA-F0-9]/g, ''), 16);\n\n\twhile (l <= r) {\n\t\tm = l + Math.floor((r - l) / 2);\n\n\t\tvar mask = (0xffffffffffff -\n\t\t\t\t\t(Math.pow(2, 48 - ouiData[m * 3 + 1]) - 1));\n\n\t\tvar mac1_hi = ((mac1 / 0x10000) & (mask / 0x10000)) >>> 0;\n\t\tvar mac1_lo = ((mac1 &  0xffff) & (mask &  0xffff)) >>> 0;\n\n\t\tvar mac2 = parseInt(ouiData[m * 3], 16);\n\t\tvar mac2_hi = (mac2 / 0x10000) >>> 0;\n\t\tvar mac2_lo = (mac2 &  0xffff) >>> 0;\n\n\t\tif (mac1_hi === mac2_hi && mac1_lo === mac2_lo)\n\t\t\treturn ouiData[m * 3 + 2];\n\n\t\tif (mac2_hi > mac1_hi ||\n\t\t\t(mac2_hi === mac1_hi && mac2_lo > mac1_lo))\n\t\t\tr = m - 1;\n\t\telse\n\t\t\tl = m + 1;\n\t}\n\n\treturn null;\n}\n\nvar bakdataold;\nvar bakdatanew;\nfunction fetchData(period)\n{\n\tXHR.poll(2,'<%=url(\"admin/nlbw/data\")%>', { period: period, group_by: 'family,mac,ip,layer7' }, function(xhr, res) {\n\t\tif (res !== null && typeof(res) === 'object' && typeof(res.columns) === 'object' && typeof(res.data) === 'object')\n\t\t\ttrafficData = res;\n\t\ttrafficData[\"data\"].sort();\n\t\tbakdatanew = JSON.parse(JSON.stringify(trafficData[\"data\"]));\n\t\tif (bakdataold){\n\t\t\tvar j=0;\n\t\t\tvar k=j;\n\t\t\tvar ll=bakdataold.length;\n\t\t\tfor (i=0,l=trafficData[\"data\"].length; i<l ; i++){\n\t\t\t\tone=trafficData[\"data\"][i];\n\t\t\t\tfor (j=k;j<ll;j++){\n\t\t\t\t\tif (one[0]==bakdataold[j][0] && one[1]==bakdataold[j][1] && one[2]==bakdataold[j][2] && one[3]==bakdataold[j][3] && one[4]==bakdataold[j][4] ){\n\t\t\t\t\t\tone[5]=(one[5]-bakdataold[j][5])/2;\n\t\t\t\t\t\tone[6]=(one[6]-bakdataold[j][6])/2;\n\t\t\t\t\t\tone[7]=(one[7]-bakdataold[j][7])/2;\n\t\t\t\t\t\tone[8]=(one[8]-bakdataold[j][8])/2;\n\t\t\t\t\t\tone[9]=(one[9]-bakdataold[j][9])/2;\n\t\t\t\t\t\tk=j+1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbakdataold=bakdatanew;\n\t\tvar addrs = query(null, ['ip'], null);\n\t\tvar ipAddrs = [];\n\n\t\tfor (var i = 0; i < addrs.length; i++)\n\t\t\tif (ipAddrs.indexOf(addrs[i].ip) < 0)\n\t\t\t\tipAddrs.push(addrs[i].ip);\n\t\tif (hostNames.length == 0){\n\t\t\tXHR.get('<%=url(\"admin/nlbw/ptr\")%>/' + ipAddrs.join('/'), null, function(xhr, res) {\n\t\t\t\tif (res !== null && typeof(res) === 'object')\n\t\t\t\t\thostNames = res;\n\t\t\t});\n\t\t}\n\t\trenderHostData();\n\t\trenderLayer7Data();\n\t\trenderIPv6Data();\n\t});\n\tXHR.poll(5,'<%=url([[admin]], [[status]], [[onliner]], [[setnlbw]])%>', null, function(xhr, res) {\n\t});\n}\n\nfunction switchTab(tab)\n{\n\tbubbleDismiss();\n\n\treturn cbi_t_switch('nlbw', tab);\n}\n\nfunction renderHostDetail()\n{\n\tvar key = this.getAttribute('href').substr(1),\n\t    col = this.getAttribute('data-col'),\n\t    label = this.getAttribute('data-label'),\n\t    bubble = document.getElementById('detail-bubble'),\n\t    arrow = document.getElementById('bubble-arrow'),\n\t    table = document.getElementById('bubble-table');\n\n\tbubbleDismiss();\n\n\tvar detailData = query(\n\t\tfunction(c, r) {\n\t\t\treturn ((r[c.mac] === key || r[c.ip] === key) &&\n\t\t\t        (r[c.rx_bytes] > 0 || r[c.tx_bytes] > 0));\n\t\t},\n\t\t[col],\n\t\tfunction(r1, r2) {\n\t\t\treturn ((r2.rx_bytes + r2.tx_bytes) - (r1.rx_bytes + r1.tx_bytes));\n\t\t}\n\t);\n\n\tvar rxData = [], txData = [];\n\n\ttable.innerHTML = '<tr>' +\n\t\t'<th>%s</th>'.format(label || col) +\n\t\t'<th><%:Conn.%></th>' +\n\t\t'<th colspan=\"2\"><%:Down. (Bytes / Pkts.)%></th>' +\n\t\t'<th colspan=\"2\"><%:Up. (Bytes / Pkts.)%></th>' +\n\t'</tr>';\n\n\tfor (var i = 0; i < detailData.length; i++) {\n\t\tvar rec = detailData[i],\n\t\t    row = table.insertRow(-1);\n\n\t\trow.insertCell(-1).innerHTML = rec[col] || '<%:other%>';\n\t\trow.insertCell(-1).innerHTML = \"%1000.2m\".format(rec.conns);\n\t\trow.insertCell(-1).innerHTML = \"%1024.2mB\".format(rec.rx_bytes);\n\t\trow.insertCell(-1).innerHTML = \"%1000.2mP\".format(rec.rx_pkts);\n\t\trow.insertCell(-1).innerHTML = \"%1024.2mB\".format(rec.tx_bytes);\n\t\trow.insertCell(-1).innerHTML = \"%1000.2mP\".format(rec.tx_pkts);\n\n\t\trxData.push({\n\t\t\tlabel: ['%s: %%1024.2mB'.format(rec[col] || '<%:other%>'), row],\n\t\t\tvalue: rec.rx_bytes\n\t\t});\n\n\t\ttxData.push({\n\t\t\tlabel: ['%s: %%1024.2mB'.format(rec[col] || '<%:other%>'), row],\n\t\t\tvalue: rec.tx_bytes\n\t\t});\n\t}\n\tvar mac = key.toUpperCase();\n\tvar name = hostInfo.hasOwnProperty(mac) ? hostInfo[mac].name : null;\n\n\tif (!name)\n\t\tfor (var i = 0; i < detailData.length; i++)\n\t\t\tif ((name = hostNames[detailData[i].ip]) !== undefined)\n\t\t\t\tbreak;\n\n\tif (mac !== '00:00:00:00:00:00') {\n\t\tkpi('bubble-hostname', name);\n\t\tkpi('bubble-vendor', oui(mac));\n\t}\n\telse {\n\t\tkpi('bubble-hostname');\n\t\tkpi('bubble-vendor');\n\t}\n\n\tvar tr = this.parentNode.parentNode,\n\t    xy = off(tr),\n\t    xy2 = off(this);\n\n\tbubble.style.width = tr.offsetWidth + 'px';\n\tbubble.style.left = xy[0] + 'px';\n\tbubble.style.top = (xy[1] + tr.offsetHeight) + 'px';\n\tarrow.style.left = Math.floor(xy2[0] + this.offsetWidth / 2 - xy[0]) + 'px';\n\n\tbubble.className = 'in';\n\n\treturn false;\n}\n\nfunction formatHostname(dns)\n{\n\tif (dns === undefined || dns === null || dns === '')\n\t\treturn '-';\n\n\tdns = dns.split('.')[0];\n\n\tif (dns.length > 12)\n\t\treturn '<span title=\"%q\">%q</span>'.format(dns, dns);\n\n\treturn '%h'.format(dns);\n}\n\nfunction renderHostData()\n{\n\tvar trafData = [], connData = [];\n\tvar rx_total = 0, tx_total = 0, conn_total = 0;\n\tvar table = document.getElementById('host-data');\n\n\tvar hostData = query(\n\t\tfunction(c, r) {\n\t\t\treturn (r[c.rx_bytes] > 0 || r[c.tx_bytes] > 0);\n\t\t},\n\t\t['mac'],\n\t\t//function(c, r) {\n\t\t//\treturn (r[c.mac] !== '00:00:00:00:00:00') ? r[c.mac] : r[c.ip];\n\t\t//},\n\t\tfunction(r1, r2) {\n\t\t\treturn ((r2.rx_bytes + r2.tx_bytes) - (r1.rx_bytes + r1.tx_bytes));\n\t\t}\n\t);\n\n\twhile (table.rows.length > 1)\n\t\ttable.deleteRow(1);\n\n\tfor (var i = 0; i < hostData.length; i++) {\n\t\tvar row = table.insertRow(-1),\n\t\t    cell = row.insertCell(-1),\n\t\t    rec = hostData[i],\n\t\t    mac = rec.mac.toUpperCase(),\n\t\t    key = (mac !== '00:00:00:00:00:00') ? mac : rec.ip,\n\t\t    dns = hostInfo[mac] ? hostInfo[mac].name : null;\n\n\t\tvar link1 = document.createElement('a');\n\t\t    link1.onclick = renderHostDetail;\n\t\t    link1.href = '#' + rec.mac;\n\t\t    link1.setAttribute('data-col', 'ip');\n\t\t    link1.setAttribute('data-label', '<%:Source IP%>');\n\t\t    link1.innerHTML = (mac !== '00:00:00:00:00:00') ? mac : '<%:other%>';\n\n\t\tvar link2 = document.createElement('a');\n\t\t    link2.onclick = renderHostDetail;\n\t\t    link2.href = '#' + rec.mac;\n\t\t    link2.setAttribute('data-col', 'layer7');\n\t\t    link2.setAttribute('data-label', '<%:Protocol%>');\n\t\t    link2.innerHTML = \"%1000.2m\".format(rec.conns);\n\n\t\tcell.innerHTML = formatHostname(dns);\n\t\tcell.className = 'hostname';\n\n\t\trow.insertCell(-1).appendChild(link1);\n\t\trow.insertCell(-1).appendChild(link2);\n\t\trow.insertCell(-1).innerHTML = \"%1024.2mB\".format(rec.rx_bytes);\n\t\trow.insertCell(-1).innerHTML = \"%1000.2mP\".format(rec.rx_pkts);\n\t\trow.insertCell(-1).innerHTML = \"%1024.2mB\".format(rec.tx_bytes);\n\t\trow.insertCell(-1).innerHTML = \"%1000.2mP\".format(rec.tx_pkts);\n\n\t\ttrafData.push({\n\t\t\tvalue: rec.rx_bytes + rec.tx_bytes,\n\t\t\tlabel: [\"%s: %%.2mB\".format(key), row]\n\t\t});\n\n\t\tconnData.push({\n\t\t\tvalue: rec.conns,\n\t\t\tlabel: [\"%s: %%.2m\".format(key), row]\n\t\t});\n\n\t\trx_total += rec.rx_bytes;\n\t\ttx_total += rec.tx_bytes;\n\t\tconn_total += rec.conns;\n\t}\n\n\tif (table.rows.length === 1) {\n\t\tvar cell = table.insertRow(-1).insertCell(-1);\n\n\t\tcell.setAttribute('colspan', 6);\n\t\tcell.innerHTML = '<em><%:No data recorded yet.%> <a href=\"<%=url(\"admin/nlbw/commit\")%>\"><%:Force reload…%></a></em>';\n\t}\n\tkpi('rx-total', '%1024.2mB'.format(rx_total));\n\tkpi('tx-total', '%1024.2mB'.format(tx_total));\n\tkpi('conn-total', '%1000m'.format(conn_total));\n\tkpi('host-total', '%u'.format(hostData.length));\n}\n\nfunction renderLayer7Data()\n{\n\tvar rxData = [], txData = [];\n\tvar topConn = [[0],[0],[0]], topRx = [[0],[0],[0]], topTx = [[0],[0],[0]];\n\tvar table = document.getElementById('layer7-data');\n\n\tvar layer7Data = query(\n\t\tnull, ['layer7'],\n\t\tfunction(r1, r2) {\n\t\t\treturn ((r2.rx_bytes + r2.tx_bytes) - (r1.rx_bytes + r1.tx_bytes));\n\t\t}\n\t);\n\n\twhile (table.rows.length > 1)\n\t\ttable.deleteRow(1);\n\n\tfor (var i = 0, c = 0; i < layer7Data.length; i++) {\n\t\tvar rec = layer7Data[i],\n\t\t    row = table.insertRow(-1);\n\n\t\trxData.push({\n\t\t\tvalue: rec.rx_bytes,\n\t\t\tlabel: [\"%s: %%.2mB\".format(rec.layer7 || '<%:other%>'), row]\n\t\t});\n\n\t\ttxData.push({\n\t\t\tvalue: rec.tx_bytes,\n\t\t\tlabel: [\"%s: %%.2mB\".format(rec.layer7 || '<%:other%>'), row]\n\t\t});\n\n\t\trow.insertCell(-1).innerHTML = rec.layer7 || '<%:other%>';\n\t\trow.insertCell(-1).innerHTML = \"%1000m\".format(rec.conns);\n\t\trow.insertCell(-1).innerHTML = \"%1024.2mB\".format(rec.rx_bytes);\n\t\trow.insertCell(-1).innerHTML = \"%1000.2mP\".format(rec.rx_pkts);\n\t\trow.insertCell(-1).innerHTML = \"%1024.2mB\".format(rec.tx_bytes);\n\t\trow.insertCell(-1).innerHTML = \"%1000.2mP\".format(rec.tx_pkts);\n\n\t\tif (rec.layer7) {\n\t\t\ttopRx.push([rec.rx_bytes, rec.layer7]);\n\t\t\ttopTx.push([rec.tx_bytes, rec.layer7]);\n\t\t\ttopConn.push([rec.conns, rec.layer7]);\n\t\t}\n\t}\n\n\tif (table.rows.length === 1) {\n\t\tvar cell = table.insertRow(-1).insertCell(-1);\n\n\t\tcell.setAttribute('colspan', 6);\n\t\tcell.innerHTML = '<em><%:No data recorded yet.%> <a href=\"<%=url(\"admin/nlbw/commit\")%>\"><%:Force reload…%></a></em>';\n\t}\n\ttopRx.sort(function(a, b) { return b[0] - a[0] });\n\ttopTx.sort(function(a, b) { return b[0] - a[0] });\n\ttopConn.sort(function(a, b) { return b[0] - a[0] });\n\n\tkpi('layer7-total', layer7Data.length);\n\tkpi('layer7-most-rx', topRx[0][1], topRx[1][1], topRx[2][1]);\n\tkpi('layer7-most-tx', topTx[0][1], topTx[1][1], topTx[2][1]);\n\tkpi('layer7-most-conn', topConn[0][1], topConn[1][1], topConn[2][1]);\n}\n\nfunction renderIPv6Data()\n{\n\tvar table     = document.getElementById('ipv6-data'),\n\t    col       = { },\n\t    rx4_total = 0,\n\t    tx4_total = 0,\n\t    rx6_total = 0,\n\t    tx6_total = 0,\n\t    v4_total  = 0,\n\t    v6_total  = 0,\n\t    ds_total  = 0,\n\t    families  = { },\n\t    records   = { };\n\n\tipv6Data = query(\n\t\tnull, ['family', 'mac'],\n\t\tfunction(r1, r2) {\n\t\t\treturn ((r2.rx_bytes + r2.tx_bytes) - (r1.rx_bytes + r1.tx_bytes));\n\t\t}\n\t);\n\n\tfor (var i = 0, c = 0; i < ipv6Data.length; i++) {\n\t\tvar rec = ipv6Data[i],\n\t\t    mac = rec.mac.toUpperCase(),\n\t\t    ip  = rec.ip,\n\t\t    fam = families[mac] || 0,\n\t\t    recs = records[mac] || {};\n\n\t\tif (rec.family == 4) {\n\t\t\trx4_total += rec.rx_bytes;\n\t\t\ttx4_total += rec.tx_bytes;\n\t\t\tfam |= 1;\n\t\t}\n\t\telse {\n\t\t\trx6_total += rec.rx_bytes;\n\t\t\ttx6_total += rec.tx_bytes;\n\t\t\tfam |= 2;\n\t\t}\n\n\t\trecs[rec.family] = rec;\n\t\trecords[mac] = recs;\n\n\t\tfamilies[mac] = fam;\n\t}\n\n\tfor (var mac in families) {\n\t\tswitch (families[mac])\n\t\t{\n\t\tcase 3:\n\t\t\tds_total++;\n\t\t\tbreak;\n\n\t\tcase 2:\n\t\t\tv6_total++;\n\t\t\tbreak;\n\n\t\tcase 1:\n\t\t\tv4_total++;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\twhile (table.rows.length > 1)\n\t\ttable.deleteRow(1);\n\n\tfor (var mac in records) {\n\t\tif (mac === '00:00:00:00:00:00')\n\t\t\tcontinue;\n\n\t\tvar row = table.insertRow(-1),\n\t\t    cell1 = row.insertCell(-1),\n\t\t    cell2 = row.insertCell(-1),\n\t\t    dns = hostInfo[mac] ? hostInfo[mac].name : null,\n\t\t    rec4 = records[mac][4],\n\t\t    rec6 = records[mac][6];\n\n\t\tcell1.setAttribute('rowspan', 2);\n\t\tcell1.innerHTML = formatHostname(dns);\n\t\tcell1.className = 'hostname';\n\n\t\tcell2.setAttribute('rowspan', 2);\n\t\tcell2.innerHTML = mac;\n\n\t\trow.insertCell(-1).innerHTML = 'IPv4';\n\t\trow.insertCell(-1).innerHTML = rec4 ? \"%1024.2mB\".format(rec4.rx_bytes) : '-';\n\t\trow.insertCell(-1).innerHTML = rec4 ? \"%1000.2mP\".format(rec4.rx_pkts)  : '-';\n\t\trow.insertCell(-1).innerHTML = rec4 ? \"%1024.2mB\".format(rec4.tx_bytes) : '-';\n\t\trow.insertCell(-1).innerHTML = rec4 ? \"%1000.2mP\".format(rec4.tx_pkts)  : '-';\n\n\t\trow = table.insertRow(-1);\n\n\t\trow.insertCell(-1).innerHTML = 'IPv6';\n\t\trow.insertCell(-1).innerHTML = rec6 ? \"%1024.2mB\".format(rec6.rx_bytes) : '-';\n\t\trow.insertCell(-1).innerHTML = rec6 ? \"%1000.2mP\".format(rec6.rx_pkts)  : '-';\n\t\trow.insertCell(-1).innerHTML = rec6 ? \"%1024.2mB\".format(rec6.tx_bytes) : '-';\n\t\trow.insertCell(-1).innerHTML = rec6 ? \"%1000.2mP\".format(rec6.tx_pkts)  : '-';\n\t}\n\n\tif (table.rows.length === 1) {\n\t\tvar cell = table.insertRow(-1).insertCell(-1);\n\n\t\tcell.setAttribute('colspan', 7);\n\t\tcell.innerHTML = '<em><%:No data recorded yet.%> <a href=\"<%=url(\"admin/nlbw/commit\")%>\"><%:Force reload…%></a></em>';\n\t}\n\n\tvar shareData = [], hostsData = [];\n\n\tif (rx4_total > 0 || tx4_total > 0)\n\t\tshareData.push({\n\t\t\tvalue: rx4_total + tx4_total,\n\t\t\tlabel: [\"IPv4: %.2mB\"],\n\t\t\tcolor: 'hsl(140, 100%, 50%)'\n\t        });\n\n\tif (rx6_total > 0 || tx6_total > 0)\n\t\tshareData.push({\n\t\t\tvalue: rx6_total + tx6_total,\n\t\t\tlabel: [\"IPv6: %.2mB\"],\n\t\t\tcolor: 'hsl(180, 100%, 50%)'\n\t\t});\n\n\tif (v4_total > 0)\n\t\thostsData.push({\n\t\t\tvalue: v4_total,\n\t\t\tlabel: [\"<%:%d IPv4-only hosts%>\"],\n\t\t\tcolor: 'hsl(140, 100%, 50%)'\n\t\t});\n\n\tif (v6_total > 0)\n\t\thostsData.push({\n\t\t\tvalue: v6_total,\n\t\t\tlabel: [\"<%:%d IPv6-only hosts%>\"],\n\t\t\tcolor: 'hsl(180, 100%, 50%)'\n\t\t});\n\n\tif (ds_total > 0)\n\t\thostsData.push({\n\t\t\tvalue: ds_total,\n\t\t\tlabel: [\"<%:%d dual-stack hosts%>\"],\n\t\t\tcolor: 'hsl(50, 100%, 50%)'\n\t\t});\n\tkpi('ipv6-hosts', '%.2f%%'.format(100 / (ds_total + v4_total + v6_total) * (ds_total + v6_total)));\n\tkpi('ipv6-share', '%.2f%%'.format(100 / (rx4_total + rx6_total + tx4_total + tx6_total) * (rx6_total + tx6_total)));\n\tkpi('ipv6-rx', '%1024.2mB'.format(rx6_total));\n\tkpi('ipv6-tx', '%1024.2mB'.format(tx6_total));\n}\n\nfunction bubbleDismiss()\n{\n\tvar bubble = document.getElementById('detail-bubble');\n\n\tbubble.className = '';\n\tdocument.body.appendChild(bubble);\n\n\treturn false;\n}\n\n\n//]]></script>\n\n<h2 name=\"content\"><%:Netlink Bandwidth Monitor%></h2>\n\n<div id=\"detail-bubble\">\n\t<span id=\"bubble-arrow\"></span>\n\t<div>\n\t\t<div class=\"head\">\n\t\t\t<a class=\"dismiss\" href=\"#\" onclick=\"this.blur(); return bubbleDismiss()\">×</a>\n\t\t\t<div class=\"kpi\">\n\t\t\t\t<ul>\n\t\t\t\t\t<li><%_Hostname: <big id=\"bubble-hostname\">example.org</big>%></li>\n\t\t\t\t\t<li><%_Vendor: <big id=\"bubble-vendor\">Example Corp.</big>%></li>\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t</div>\n\t\t<table id=\"bubble-table\"></table>\n\t</div>\n</div>\n\n<ul class=\"cbi-tabmenu\">\n\t<li id=\"tab.nlbw.traffic\" class=\"cbi-tab\"><a href=\"#\" onclick=\"return switchTab('traffic')\"><%:Traffic Distribution%></a></li>\n\t<li id=\"tab.nlbw.layer7\" class=\"cbi-tab-disabled\"><a href=\"#\" onclick=\"return switchTab('layer7')\"><%:Application Protocols%></a></li>\n\t<li id=\"tab.nlbw.ipv6\" class=\"cbi-tab-disabled\"><a href=\"#\" onclick=\"return switchTab('ipv6')\"><%:IPv6%></a></li>\n</ul>\n\n<div class=\"cbi-section\" id=\"container.nlbw.traffic\">\n\t<div>\n\t\t<div class=\"kpi\">\n\t\t\t<ul>\n\t\t\t\t<li><%_<big id=\"host-total\">0</big> hosts%></li>\n\t\t\t\t<li><%_<big id=\"rx-total\">0</big> download%></li>\n\t\t\t\t<li><%_<big id=\"tx-total\">0</big> upload%></li>\n\t\t\t\t<li><%_<big id=\"conn-total\">0</big> connections%></li>\n\t\t\t</ul>\n\t\t</div>\n\t</div>\n\t<table id=\"host-data\">\n\t\t<tr>\n\t\t\t<th width=\"20%\" class=\"hostname\"><%:Host%></th>\n\t\t\t<th width=\"10%\"><%:MAC%></th>\n\t\t\t<th width=\"10%\"><%:Connections%></th>\n\t\t\t<th width=\"20%\" colspan=\"2\"><%:Download (Bytes / Packets)%></th>\n\t\t\t<th width=\"20%\" colspan=\"2\"><%:Upload (Bytes / Packets)%></th>\n\t\t</tr>\n\t</table>\n</div>\n\n<div class=\"cbi-section\" id=\"container.nlbw.layer7\" style=\"display:none\">\n\t<div>\n\t\t<div class=\"kpi\">\n\t\t\t<ul>\n\t\t\t\t<li><%_<big id=\"layer7-total\">0</big> different application protocols%></li>\n\t\t\t\t<li><%_<big id=\"layer7-most-rx\">0</big> cause the most download%></li>\n\t\t\t\t<li><%_<big id=\"layer7-most-tx\">0</big> cause the most upload%></li>\n\t\t\t\t<li><%_<big id=\"layer7-most-conn\">0</big> cause the most connections%></li>\n\t\t\t</ul>\n\t\t</div>\n\t</div>\n\t<table id=\"layer7-data\">\n\t\t<tr>\n\t\t\t<th width=\"10%\"><%:Application%></th>\n\t\t\t<th width=\"10%\"><%:Connections%></th>\n\t\t\t<th width=\"30%\" colspan=\"2\"><%:Download (Bytes / Packets)%></th>\n\t\t\t<th width=\"30%\" colspan=\"2\"><%:Upload (Bytes / Packets)%></th>\n\t\t</tr>\n\t</table>\n</div>\n\n<div class=\"cbi-section\" id=\"container.nlbw.ipv6\" style=\"display:none\">\n\t<div>\n\n\t\t<div class=\"kpi\">\n\t\t\t<ul>\n\t\t\t\t<li><%_<big id=\"ipv6-hosts\">0%</big> IPv6 support rate among hosts%></li>\n\t\t\t\t<li><%_<big id=\"ipv6-share\">0%</big> of the total traffic is IPv6%></li>\n\t\t\t\t<li><%_<big id=\"ipv6-rx\">0B</big> total IPv6 download%></li>\n\t\t\t\t<li><%_<big id=\"ipv6-tx\">0B</big> total IPv6 upload%></li>\n\t\t\t</ul>\n\t\t</div>\n\t</div>\n\t<table id=\"ipv6-data\">\n\t\t<tr>\n\t\t\t<th width=\"20%\" class=\"hostname\"><%:Host%></th>\n\t\t\t<th width=\"10%\"><%:MAC%></th>\n\t\t\t<th width=\"10%\"><%:Family%></th>\n\t\t\t<th width=\"20%\" colspan=\"2\"><%:Download (Bytes / Packets)%></th>\n\t\t\t<th width=\"20%\" colspan=\"2\"><%:Upload (Bytes / Packets)%></th>\n\t\t</tr>\n\t</table>\n</div>\n\n<script type=\"text/javascript\">//<![CDATA[\n\tcbi_t_add('nlbw', 'traffic');\n\tcbi_t_add('nlbw', 'layer7');\n\tcbi_t_add('nlbw', 'ipv6');\n\tcbi_t_add('nlbw', 'export');\n\tfetchData('');\n\tXHR.get('<%=url(\"admin/nlbw/list\")%>', null, function(xhr, res) {\n\n\t\txhr.open('GET', 'https://raw.githubusercontent.com/jow-/oui-database/master/oui.json', true);\n\t\txhr.onreadystatechange = function() {\n\t\t\tif (xhr.readyState === 4) {\n\t\t\t\ttry { res = JSON.parse(xhr.responseText); }\n\t\t\t\tcatch(e) { res = null; }\n\n\t\t\t\tif (res !== null && typeof(res) === 'object' && (res.length % 3) === 0)\n\t\t\t\t\touiData = res;\n\t\t\t}\n\t\t};\n\t\txhr.send(null);\n\t});\n\tXHR.get('<%=url(\"admin/nlbw/ptr\")%>/' + ipAddrs.join('/'), null, function(xhr, res) {\n\t\t\tif (res !== null && typeof(res) === 'object')\n\t\t\t\thostNames = res;\n\t\t});\n//]]></script>\n\n<%+footer%>\n"
  },
  {
    "path": "luci-app-onliner/luasrc/view/onliner/onliner.htm",
    "content": "<%#\n Copyright 2008 Steven Barth <steven@midlink.org>\n Copyright 2008-2011 Jo-Philipp Wich <jow@openwrt.org>\n Licensed to the public under the Apache License 2.0.\n-%>\n\n<%\nlocal util = require \"luci.util\"\nlocal function online_data()\n\tlocal rv = { }\n\tlocal fd = util.execi('/usr/bin/awk \\'BEGIN{while ((getline < \"/tmp/dhcp.leases\") > 0){a[$2]=$4;}while ((getline < \"/proc/net/arp\") > 0){if (!a[$4]){a[$4]=\"\\?\";}if (match($3,\"0x[26]\")){\"ping -q -c 1 \"$1\" &\";if (b[$4]){b[$4]=b[$4]\"/\"$1;}else{b[$4]=$1;}c[$4]=$6;}}while ((\"ip -6 neighbor show | grep -v fe80\" | getline) > 0){if (b[$5]) {\"ping -q -c 1 \"$1\" &\";b[$5]=b[$5]\"/\"$1;}}for (mac in b){print(a[mac],b[mac],mac,c[mac]);}}\\' ')\n\twhile true do\n\t\tlocal ln = fd()\n\t\tif ln == nil then break end\n\t\tlocal name,ip,mac,dev = ln:match(\"^(%S+) (%S+) (%S+) (%S+)\")\n\t\tif mac and ip and name and dev then\n\t\t\trv[#rv+1] = {\n\t\t\t\thostname = name,\n\t\t\t\tdevice  = dev,\n\t\t\t\tmacaddr  = mac,\n\t\t\t\tipaddr   = ip\n\t\t\t}\n\t\tend\n\tend\n\treturn rv\nend\n\n\nif luci.http.formvalue(\"status\") == \"1\" then\n\tlocal rv = {\n\t\tonlines   = online_data()\n\t}\t\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(rv)\n\treturn\nend\t\n-%>\n\n<%+header%>\n\n<script type=\"text/javascript\" src=\"<%=resource%>/cbi.js?v=git-19.271.33176-b099749\"></script>\n<script type=\"text/javascript\">//<![CDATA[\n\tvar npoll = 1;\n\n\tXHR.poll(5, '<%=REQUEST_URI%>', { status: 1 },\n\t\tfunction(x, info)\n\t\t{\n\t\t\tvar ls = document.getElementById('online_status_table');\n\t\t\tif (ls)\n\t\t\t{\n\t\t\t\t/* clear all rows */\n\t\t\t\twhile( ls.rows.length > 1 )\n\t\t\t\t\tls.rows[0].parentNode.deleteRow(1);\n\n\t\t\t\tfor( var i = 0; i < info.onlines.length; i++ )\n\t\t\t\t{\n\n\t\t\t\t\tvar tr = ls.rows[0].parentNode.insertRow(-1);\n\t\t\t\t\t\ttr.className = 'cbi-section-table-row cbi-rowstyle-' + ((i % 2) + 1);\n\n\t\t\t\t\ttr.insertCell(-1).innerHTML = info.onlines[i].hostname ? info.onlines[i].hostname : '?';\n\t\t\t\t\ttr.insertCell(-1).innerHTML = info.onlines[i].ipaddr.split(\"/\").join(\"<br>\");\n\t\t\t\t\ttr.insertCell(-1).innerHTML = info.onlines[i].macaddr;\n\t\t\t\t\ttr.insertCell(-1).innerHTML = info.onlines[i].device;\n\t\t\t\t}\n\n\t\t\t\tif( ls.rows.length == 1 )\n\t\t\t\t{\n\t\t\t\t\tvar tr = ls.rows[0].parentNode.insertRow(-1);\n\t\t\t\t\t\ttr.className = 'cbi-section-table-row';\n\n\t\t\t\t\tvar td = tr.insertCell(-1);\n\t\t\t\t\t\ttd.colSpan = 4;\n\t\t\t\t\t\ttd.innerHTML = '<em><br /><%:当前无用户在线%></em>';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t);\n//]]></script>\n\n<h2 name=\"content\"><%:Status%></h2>\n\n<fieldset class=\"cbi-section\">\n\t<legend><%:在线用户%></legend>\n\n\t<table class=\"cbi-section-table\" id=\"online_status_table\">\n\t\t<tr class=\"cbi-section-table-titles\">\n\t\t\t<th class=\"cbi-section-table-cell\"><%:Hostname%></th>\n\t\t\t<th class=\"cbi-section-table-cell\"><%:IP Address%></th>\n\t\t\t<th class=\"cbi-section-table-cell\"><%:MAC Address%></th>\n\t\t\t<th class=\"cbi-section-table-cell\"><%:Interface%></th>\n\t\t</tr>\n\t\t<tr class=\"cbi-section-table-row\">\n\t\t\t<td colspan=\"4\"><em><br /><%:Collecting data...%></em></td>\n\t\t</tr>\n\t</table>\n</fieldset>\n\n<%+footer%>"
  },
  {
    "path": "luci-app-onliner/root/usr/share/onliner/setnlbw.sh",
    "content": "#!/bin/sh\n\nPATH=\"/usr/sbin:/usr/bin:/sbin:/bin\"\necho \"1\" > /var/run/onsetnlbw\ninterval=$(uci get nlbwmon.@nlbwmon[0].refresh_interval)\nuci set nlbwmon.@nlbwmon[0].refresh_interval=\"2s\"\n/etc/init.d/nlbwmon reload\n\nwhile true\ndo\n\tsleep 12\n\twatchdog=$(cat /var/run/onsetnlbw)\n\tif [ \"$watchdog\"x == \"0\"x ]; then\n\t\tuci set nlbwmon.@nlbwmon[0].refresh_interval=$interval\n\t\tuci commit nlbwmon\n\t\t/etc/init.d/nlbwmon reload\n\t\trm -f /var/run/onsetnlbw\n\t\texit 0\n\telse\n\t\techo \"0\" > /var/run/onsetnlbw\n\tfi\ndone\n"
  },
  {
    "path": "luci-app-oscam/Makefile",
    "content": "#\n#-- Copyright (C) 2018 dz <dingzhong110@gmail.com>\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI Support for oscam\nLUCI_DEPENDS:= +oscam\nPKG_VERSION:=1.7\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-oscam/luasrc/controller/oscam.lua",
    "content": "#-- Copyright (C) 2018 dz <dingzhong110@gmail.com>\n\nmodule(\"luci.controller.oscam\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/oscam\") then\n\t\treturn\n\tend\n\n\tlocal page\n\n\tpage = entry({\"admin\", \"services\", \"oscam\"}, cbi(\"oscam\"), _(\"OSCAM\"), 60)\n\tpage.dependent = true\n\tpage.acl_depends = { \"luci-app-oscam\" }\nend\n"
  },
  {
    "path": "luci-app-oscam/luasrc/model/cbi/oscam.lua",
    "content": "#-- Copyright (C) 2018 dz <dingzhong110@gmail.com>\n\nlocal sys = require(\"luci.sys\")\nlocal util = require(\"luci.util\")\nlocal fs = require(\"nixio.fs\")\n\nlocal trport = 8888\nlocal button = \"\"\n\nif luci.sys.call(\"pidof oscam >/dev/null\") == 0 then\n\tm = Map(\"oscam\", translate(\"oscam\"), \"%s - %s\" %{translate(\"oscam\"), translate(\"<strong><font color=\\\"green\\\">Running</font></strong>\")})\n\tbutton = \"&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type=\\\"button\\\" value=\\\" \" .. translate(\"Open Web Interface\") .. \" \\\" onclick=\\\"window.open('http://'+window.location.hostname+':\" .. trport .. \"')\\\"/>\"\nelse\n\tm = Map(\"oscam\", translate(\"oscam\"), \"%s - %s\" %{translate(\"oscam\"), translate(\"<strong><font color=\\\"red\\\">Not Running</font></strong>\")})\nend\n\n-- Basic\ns = m:section(TypedSection, \"oscam\", translate(\"Settings\"), translate(\"General Settings\") .. button)\ns.anonymous = true\n\n---- Eanble\nenable = s:option(Flag, \"enabled\", translate(\"Enable\"), translate(\"Enable or disable oscam server\"))\nenable.default = 0\nenable.rmempty = false\n\n-- Doman addresss\ns = m:section(TypedSection, \"oscam\", translate(\"oscam conf\"), \n\ttranslate(\"oscam conf\"))\ns.anonymous = true\n\n---- address\naddr = s:option(Value, \"address\",\n\ttranslate(\"\"), \n\ttranslate(\"-------------------------------------------------------------------- \" ..\n\t  \"----------------------------------------------------------------------------. \" ..\n\t  \"\"))\n\naddr.template = \"cbi/tvalue\"\naddr.rows = 30\n\nfunction addr.cfgvalue(self, section)\n\treturn nixio.fs.readfile(\"/etc/oscam/oscam.conf\")\nend\n\nfunction addr.write(self, section, value)\n\tvalue = value:gsub(\"\\r\\n?\", \"\\n\")\n\tnixio.fs.writefile(\"/etc/oscam/oscam.conf\", value)\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-oscam/po/zh_Hans/oscam.po",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\\n\"\n\nmsgid \"oscam\"\nmsgstr \"oscam\"\n\nmsgid \"<strong><font color=\\\"green\\\">Running</font></strong>\"\nmsgstr \"<strong><font color=\\\"green\\\">运行</font></strong>\"\n\nmsgid \"<strong><font color=\\\"red\\\">Not Running</font></strong>\"\nmsgstr \"<strong><font color=\\\"red\\\">未运行</font></strong>\"\n\nmsgid \"Settings\"\nmsgstr \"设置\"\n\nmsgid \"General Settings\"\nmsgstr \"基本设置\"\n\nmsgid \"Enable\"\nmsgstr \"启用\"\n\nmsgid \"Enable or disable oscam server\"\nmsgstr \"启用或禁用oscam服务器\"\n\nmsgid \"oscam conf\"\nmsgstr \"oscam配置文件\"\n\nmsgid \"oscam server\"\nmsgstr \"oscam服务器配置\"\n\nmsgid \"oscam user\"\nmsgstr \"oscam用户配置\"\n"
  },
  {
    "path": "luci-app-oscam/root/etc/config/oscam",
    "content": "\nconfig oscam 'config'\n\toption enabled '0'\n"
  },
  {
    "path": "luci-app-oscam/root/etc/uci-defaults/luci-oscam",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@oscam[-1]\n\tadd ucitrack oscam\n\tset ucitrack.@oscam[-1].init=oscam\n\tcommit ucitrack\nEOF\n\n\n/etc/init.d/oscam stop\n\nrm -f /tmp/luci-indexcache\nexit 0\n"
  },
  {
    "path": "luci-app-oscam/root/usr/share/rpcd/acl.d/luci-app-oscam.json",
    "content": "{\n\t\"luci-app-oscam\": {\n\t\t\"description\": \"Grant UCI access for luci-app-oscam\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"oscam\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"oscam\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-partexp/Makefile",
    "content": "#\n# Copyright (C) 2020-2025 sirpdboy <herboy2008@gmail.com>\n#\n# This is free software, licensed under the GNU General Public License v3.\n# \n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-partexp\nLUCI_TITLE:=LuCI Support for Automatic Partition Mount\nLUCI_PKGARCH:=all\nLUCI_DEPENDS:=+fdisk +block-mount +bc +blkid +parted +btrfs-progs +losetup +resize2fs +e2fsprogs +f2fs-tools +kmod-loop\nPKG_VERSION:=2.0.5\nPKG_RELEASE:=20260318\n\nPKG_LICENSE:=Apache-2.0\nPKG_MAINTAINER:=Sirpdboy <herboy2008@gmail.com>\n\n\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-partexp/htdocs/luci-static/resources/view/partexp/manual.js",
    "content": "/*\n *  Copyright (C) 2022-2025 Sirpdboy <herboy2008@gmail.com>\n *\n *  Licensed to the public under the Apache License 2.0\n */\n\n'use strict';\n\n'require form';\n'require fs';\n'require rpc';\n'require uci';\n'require ui';\n'require view';\n\n// 声明 RPC 接口\nvar callPartExpAutopart = rpc.declare({\n    object: 'partexp',\n    method: 'autopart'\n});\n\nvar callPartExpGetLog = rpc.declare({\n    object: 'partexp',\n    method: 'get_log',\n    params: ['position']\n});\n\nvar callPartExpGetDevices = rpc.declare({\n    object: 'partexp',\n    method: 'get_devices'\n});\n\nvar callPartExpGetStatus = rpc.declare({\n    object: 'partexp',\n    method: 'get_status'\n});\n\n// 添加保存配置的 RPC 声明\nvar callPartExpSaveConfig = rpc.declare({\n    object: 'partexp',\n    method: 'save_config',\n    params: ['target_function', 'target_disk', 'keep_config', 'format_type']\n});\n\nreturn view.extend({\n    load: function() {\n        return Promise.all([\n            L.resolveDefault(fs.stat('/usr/bin/partexp'), null),\n            L.resolveDefault(fs.stat('/tmp/partexp.log'), null)\n        ]);\n    },\n\n    render: function(data) {\n        var container = E('div', { class: 'cbi-map' });\n        var htmlParts = [\n            '<style>',\n            '.state-ctl .state { display: none !important; }',\n            '.state-ctl.state-ctl-ready .state.state-ready,',\n            '.state-ctl.state-ctl-executing .state.state-executing {',\n            '    display: block !important;',\n            '}',\n            '.progress-container {',\n            '    width: 100%;',\n            '    height: 20px;',\n            '    background: rgba(0,0,0,0.2);',\n            '    border-radius: 10px;',\n            '    display: inline-block;',\n            '    margin: 10px 0;',\n            '    vertical-align: middle;',\n            '    position: relative;',\n            '    overflow: hidden;',\n            '}',\n            '.progress-bar {',\n            '    height: 100%;',\n            '    background: linear-gradient(90deg, #4CAF50, #8BC34A);',\n            '    transition: width 0.3s ease-out;',\n            '    position: absolute;',\n            '    left: 0;',\n            '    top: 0;',\n            '}',\n            '.progress-text {',\n            '    position: absolute;',\n            '    width: 100%;',\n            '    text-align: center;',\n            '    line-height: 20px;',\n            '    font-size: 12px;',\n            '    font-weight: bold;',\n            '    color: #eee;',\n            '    z-index: 1;',\n            '    text-shadow: 1px 1px 2px rgba(0,0,0,0.5);',\n            '}',\n            '.error-message {',\n            '    color: #dc3545;',\n            '}',\n            '.info-note {',\n            '    padding: 10px;',\n            '    margin: 10px 0;',\n            '    border-radius: 4px;',\n            '}',\n            '.log-view {',\n            '    font-family: \"Courier New\", monospace;',\n            '    font-size: 12px;',\n            '    height: 300px;',\n            '    overflow-y: auto;',\n            '    white-space: pre-wrap;',\n            '}',\n        '</style>',\n        '<h2 name=\"content\">' + _('One click partition expansion mounting tool') + '</h2>',\n        '<div class=\"cbi-section-descr\">',\n        '    <div class=\"info-note\">',\n        '        ' + _('Automatically format and mount the target device partition. If there are multiple partitions, it is recommended to manually delete all partitions before using this tool.') + '<br>',\n        '        ' + _('For specific usage, see:') + ' ',\n        '        <a href=\"https://github.com/sirpdboy/luci-app-partexp.git\" target=\"_blank\">',\n        '            GitHub @partexp',\n        '        </a>',\n        '    </div>',\n            '</div>',\n            '<div class=\"state-ctl state-ctl-ready\" id=\"state-container\">',\n            '    <div class=\"cbi-section cbi-section-node\">',\n            '        <div class=\"state state-ready\">',\n            '            <form id=\"partexp-form\">',\n            '                <div class=\"cbi-value\">',\n            '                    <label class=\"cbi-value-title\" for=\"target_function\">' + _('Select function') + '</label>',\n            '                    <div class=\"cbi-value-field\">',\n            '                        <select class=\"cbi-input-select\" id=\"target_function\" name=\"target_function\">',\n            '                            <option value=\"/\">' + _('Used to extend to the root directory of EXT4 firmware(Ext4 /)') + '</option>',\n            '                            <option value=\"/overlay\">' + _('Expand application space overlay (/overlay)') + '</option>',\n            '                            <option value=\"/opt\">' + _('Used as Docker data disk (/opt)') + '</option>',\n            '                            <option value=\"/mnt\">' + _('Normal mount and use by device name(/mnt/x1)') + '</option>',\n            '                        </select>',\n            '                        <div class=\"cbi-value-description\">' + _('Select the function to be performed') + '</div>',\n            '                    </div>',\n            '                </div>',\n            '                <div class=\"cbi-value\">',\n            '                    <label class=\"cbi-value-title\" for=\"target_disk\">' + _('Destination hard disk') + '</label>',\n            '                    <div class=\"cbi-value-field\">',\n            '                        <select class=\"cbi-input-select\" id=\"target_disk\" name=\"target_disk\">',\n            '                            <option value=\"\">' + _('Loading devices...') + '</option>',\n            '                        </select>',\n            '                        <div class=\"cbi-value-description\">' + _('Select the hard disk device to operate') + '</div>',\n            '                    </div>',\n            '                </div>',\n            '                <div class=\"cbi-value\">',\n            '                    <label class=\"cbi-value-title\" for=\"keep_config\">' + _('Keep configuration') + '</label>',\n            '                    <div class=\"cbi-value-field\">',\n            '                        <input type=\"checkbox\" class=\"cbi-input-checkbox\" id=\"keep_config\" name=\"keep_config\" value=\"1\" />',\n            '                        <label for=\"keep_config\">' + _('Tick means to retain the settings') + '</label>',\n            '                    </div>',\n            '                </div>',\n            '                <div class=\"cbi-value\">',\n            '                    <label class=\"cbi-value-title\" for=\"format_type\">' + _('Format system type') + '</label>',\n            '                    <div class=\"cbi-value-field\">',\n            '                        <select class=\"cbi-input-select\" id=\"format_type\" name=\"format_type\">',\n            '                            <option value=\"0\">' + _('No formatting required') + '</option>',\n            '                            <option value=\"ext4\">' + _('Linux system partition(EXT4)') + '</option>',\n            '                            <option value=\"btrfs\">' + _('Large capacity storage devices(Btrfs)') + '</option>',\n            '                            <option value=\"ntfs\">' + _('Windows system partition(NTFS)') + '</option>',\n            '                        </select>',\n            '                    </div>',\n            '                </div>',\n            '                <div class=\"cbi-value cbi-value-last\">',\n            '                    <label class=\"cbi-value-title\">' + _('Perform operation') + '</label>',\n            '                    <div class=\"cbi-value-field\">',\n            '                        <button type=\"button\" class=\"cbi-button cbi-button-apply\" id=\"execute-btn\">',\n            '                            ' + _('Click to execute') + '',\n            '                        </button>',\n            '                    </div>',\n            '                </div>',\n            '            </form>',\n            '        </div>',\n            '        <div class=\"state state-executing\">',\n            '            <div class=\"cbi-value\">',\n            '                <label class=\"cbi-value-title\" id=\"execute_status\">' + _('Starting operation...') + '</label>',\n            '                <div class=\"cbi-value-field\">',\n            '                    <div class=\"progress-container\">',\n            '                        <div id=\"progress-bar\" class=\"progress-bar\" style=\"width: 0%\"></div>',\n            '                        <div id=\"progress-text\" class=\"progress-text\">0%</div>',\n            '                    </div>',\n            '                </div>',\n            '            </div>',\n            '        </div>',\n            '    </div>',\n            '    <div id=\"log-section\" style=\"display: block; margin-top: 20px;\">',\n            '        <div class=\"cbi-value\">',\n            '            <label class=\"cbi-value-title\">' + _('Operation Log') + '</label>',\n            '            <div class=\"cbi-value-field\">',\n            '                <textarea id=\"log-view\" class=\"log-view\" readonly=\"readonly\" rows=\"15\"></textarea>',\n            '            </div>',\n            '        </div>',\n            '    </div>',\n            '</div>'\n        ];\n        container.innerHTML = htmlParts.join('');\n\n        var self = this;\n        \n        var uci = self.uci || window.uci;\n        setTimeout(function() {\n            self.initDOM();\n            self.bindEvents();\n            self.loadDevices();\n            self.loadSavedConfig();\n            self.checkOperationStatus();\n            self.loadExistingLog();\n        }, 100);\n\n        return container;\n    },\n\n    initDOM: function() {\n        this.dom = {\n            stateContainer: document.querySelector('#state-container'),\n            targetFunction: document.querySelector('#target_function'),\n            targetDisk: document.querySelector('#target_disk'),\n            keepConfig: document.querySelector('#keep_config'),\n            formatType: document.querySelector('#format_type'),\n            executeBtn: document.querySelector('#execute-btn'),\n            logView: document.querySelector('#log-view'),\n            progressBar: document.querySelector('#progress-bar'),\n            progressText: document.querySelector('#progress-text'),\n            executeStatus: document.querySelector('#execute_status')\n        };\n        \n        this.logPosition = '0';\n        this.logPolling = null;\n        this.isRunning = false;\n        this.operationComplete = false;\n        this.pollErrorCount = 0;\n        this.pollingStartTime = 0;\n        this.lastPollTime = 0;\n        this.currentProgress = 0;\n        this.autoSaveTimer = null;\n        this.isNewOperation = false; // 标记是否是新操作\n    },\n\n    bindEvents: function() {\n        var self = this;\n        if (this.dom.executeBtn) {\n            this.dom.executeBtn.addEventListener('click', function(e) {\n                e.preventDefault();\n                self.executeOperation();\n            });\n        }\n        \n        [this.dom.targetFunction, this.dom.targetDisk, this.dom.formatType].forEach(function(element) {\n            if (element) {\n                element.addEventListener('change', function() {\n                    self.autoSaveConfig();\n                    self.updateFormVisibility();\n                });\n            }\n        });\n        \n        if (this.dom.keepConfig) {\n            this.dom.keepConfig.addEventListener('click', function() {\n                self.autoSaveConfig();\n            });\n        }\n        \n        if (this.dom.targetFunction) {\n            this.updateFormVisibility();\n        }\n    },\n    \nloadDevices: function() {\n    var self = this;\n    \n    if (self.dom.targetDisk) {\n        var loadingOption = document.createElement('option');\n        loadingOption.value = '';\n        loadingOption.textContent = _('Loading devices...');\n        loadingOption.disabled = true;\n        loadingOption.selected = true;\n        self.dom.targetDisk.innerHTML = '';\n        self.dom.targetDisk.appendChild(loadingOption);\n    }\n    function loadDevicesWithRetry(retryCount = 0) {\n        callPartExpGetDevices().then(function(response) {\n            if (!response) {\n                throw new Error('Empty response');\n            }\n            if (self.dom.targetDisk) {\n                self.dom.targetDisk.innerHTML = '';\n                if (response.devices && response.devices.length > 0) {\n                    response.devices.forEach(function(device) {\n                        var option = document.createElement('option');\n                        option.value = device.name;\n                        option.textContent = device.name + ' (' + device.dev + ', ' + device.size + ' MB)';\n                        self.dom.targetDisk.appendChild(option);\n                    });\n                } else {\n\t\t\n                    var noDeviceOption = document.createElement('option');\n                    noDeviceOption.value = '';\n                    noDeviceOption.textContent = _('no find device');\n                    noDeviceOption.disabled = true;\n                    noDeviceOption.selected = true;\n                    self.dom.targetDisk.appendChild(noDeviceOption);\n                }\n            }\n        }).catch(function(error) {\n            console.error('Failed to load devices:', error);\n            \n            if (retryCount < 3) {\n                setTimeout(function() {\n                    loadDevicesWithRetry(retryCount + 1);\n                }, 1000 * (retryCount + 1));\n            } else {\n                if (self.dom.targetDisk) {\n                    self.dom.targetDisk.innerHTML = '';\n                    var errorOption = document.createElement('option');\n                    errorOption.value = '';\n                    errorOption.textContent = _('load error');\n                    errorOption.disabled = true;\n                    errorOption.selected = true;\n                    self.dom.targetDisk.appendChild(errorOption);\n                }\n                \n                ui.addNotification({\n                    title: _('load device error'),\n                    text: _('Failed to load devices:'),\n                    type: 'error',\n                    delay: 5000\n                });\n            }\n        });\n    }\n\n    loadDevicesWithRetry();\n},\n\n\n    loadExistingLog: function() {\n        var self = this;\n        \n        callPartExpGetLog('0').then(function(response) {\n            if (response && response.log) {\n                var logContent = response.log.toString().trim();\n                if (logContent && self.dom.logView) {\n                    self.dom.logView.value = logContent;\n                    \n                    setTimeout(function() {\n                        if (self.dom.logView && self.dom.logView.value) {\n                            self.dom.logView.scrollTop = self.dom.logView.scrollHeight;\n                        }\n                    }, 100);\n                    \n                    if (response.position) {\n                        self.logPosition = response.position;\n                    }\n                    if (!self.isRunning && logContent.includes('正在执行') && !logContent.includes('操作完成')) {\n                        self.isRunning = true;\n                        self.switchState('executing');\n                        self.startLogPolling();\n                    }\n                }\n            }\n        }).catch(function(error) {\n            console.error('Failed to load existing log:', error);\n        });\n    },\n\n    loadSavedConfig: function() {\n        var self = this;\n        \n        return fs.read('/etc/config/partexp').then(function(content) {\n            if (!content) {\n                self.setDefaultConfig();\n                return;\n            }\n            \n            var lines = content.split('\\n');\n            var config = {};\n            \n            lines.forEach(function(line) {\n                line = line.trim();\n                if (line.startsWith('option')) {\n                    var parts = line.split(/\\s+/);\n                    if (parts.length >= 3) {\n                        var key = parts[1];\n                        var value = parts.slice(2).join(' ').replace(/^['\"]|['\"]$/g, '');\n                        config[key] = value;\n                    }\n                }\n            });\n            \n            if (self.dom.targetFunction) {\n                self.dom.targetFunction.value = config.target_function || '/opt';\n            }\n            if (self.dom.targetDisk && config.target_disk) {\n                setTimeout(function() {\n                    if (self.dom.targetDisk) {\n                        self.dom.targetDisk.value = config.target_disk;\n                    }\n                }, 500);\n            }\n            if (self.dom.keepConfig) {\n                self.dom.keepConfig.checked = (config.keep_config === '1');\n            }\n            if (self.dom.formatType) {\n                self.dom.formatType.value = config.format_type || '0';\n            }\n            \n            self.configCache = config;\n            \n            self.updateFormVisibility();\n            \n        }).catch(function(error) {\n            console.log('Failed to load config:', error);\n            self.setDefaultConfig();\n        });\n    },\n\n    setDefaultConfig: function() {\n        if (this.dom.targetFunction) {\n            this.dom.targetFunction.value = '/opt';\n        }\n        if (this.dom.formatType) {\n            this.dom.formatType.value = '0';\n        }\n        if (this.dom.keepConfig) {\n            this.dom.keepConfig.checked = false;\n        }\n        this.updateFormVisibility();\n        \n        this.configCache = {\n            target_function: '/opt',\n            target_disk: '',\n            keep_config: '0',\n            format_type: '0'\n        };\n    },\n\n    autoSaveConfig: function() {\n        var self = this;\n        \n        if (this.autoSaveTimer) {\n            clearTimeout(this.autoSaveTimer);\n        }\n        this.autoSaveTimer = setTimeout(function() {\n            self.saveCurrentConfig();\n        }, 1500);\n    },\n\n    saveCurrentConfig: function() {\n        var self = this;\n        \n        var targetFunction = this.dom.targetFunction ? this.dom.targetFunction.value : '/opt';\n        var targetDisk = this.dom.targetDisk ? this.dom.targetDisk.value : '';\n        var keepConfig = this.dom.keepConfig ? this.dom.keepConfig.checked : false;\n        var formatType = this.dom.formatType ? this.dom.formatType.value : '0';\n        if (callPartExpSaveConfig) {\n            return callPartExpSaveConfig(\n                targetFunction,\n                targetDisk,\n                keepConfig ? '1' : '0',\n                formatType\n            ).then(function(response) {\n                if (response && response.success) {\n\n                    self.configCache = {\n                        target_function: targetFunction,\n                        target_disk: targetDisk,\n                        keep_config: keepConfig ? '1' : '0',\n                        format_type: formatType\n                    };\n                    \n                    return true;\n                } else {\n                    console.warn('RPC save failed, falling back to file write');\n                    return self.saveConfigToFile(targetFunction, targetDisk, keepConfig, formatType);\n                }\n            }).catch(function(error) {\n                console.error('RPC save config error:', error);\n                return self.saveConfigToFile(targetFunction, targetDisk, keepConfig, formatType);\n            });\n        } else {\n            return self.saveConfigToFile(targetFunction, targetDisk, keepConfig, formatType);\n        }\n    },\n\n    saveConfigToFile: function(targetFunction, targetDisk, keepConfig, formatType) {\n        var configContent = [\n            '# Auto-generated by partexp',\n            '',\n            'config global global',\n            \"\\toption target_function '\" + targetFunction + \"'\",\n            \"\\toption target_disk '\" + targetDisk + \"'\",\n            \"\\toption keep_config '\" + (keepConfig ? '1' : '0') + \"'\",\n            \"\\toption format_type '\" + formatType + \"'\",\n            ''\n        ].join('\\n');\n        \n        return fs.write('/etc/config/partexp', configContent).then(function() {\n            console.log('Settings saved to file /etc/config/partexp');\n            return true;\n        }).catch(function(error) {\n            console.error('Failed to save settings to file:', error);\n            return false;\n        });\n    },\n\n    executeOperation: function() {\n        var self = this;\n        \n        this.saveCurrentConfig();\n        var target_function = this.dom.targetFunction.value;\n        var target_disk = this.dom.targetDisk.value;\n        \n        if (target_function !== '/' && (!target_disk || target_disk.trim() === '')) {\n            alert(_('Please select a target disk'));\n            return;\n        }\n        \n        var confirmMessage = _('Are you sure you want to execute partition expansion?') + '\\n\\n' +\n                           _('Function:') + ' ' + this.getFunctionDescription(target_function) + '\\n' +\n                           (target_function !== '/' ? _('Disk:') + ' ' + target_disk + '\\n' : '') +\n                           (target_function === '/' || target_function === '/overlay' ? \n                            _('Keep config:') + ' ' + (this.dom.keepConfig.checked ? _('Yes') : _('No')) + '\\n' : '') +\n                           (target_function === '/opt' || target_function === '/dev' ? \n                            _('Format type:') + ' ' + this.getFormatTypeDescription(this.dom.formatType.value) + '\\n' : '') +\n                           '\\n' + _('This operation may take several minutes.');\n        \n        if (!confirm(confirmMessage)) {\n            return;\n        }\n        \n        this.resetOperationState();\n        \n        this.isNewOperation = true;\n        \n        if (this.dom.logView) {\n            this.dom.logView.value = _('正在启动操作...');\n        }\n        \n        if (this.dom.executeBtn) {\n            this.dom.executeBtn.disabled = true;\n            this.dom.executeBtn.textContent = _('Executing...');\n        }\n        \n        this.switchState('executing');\n        \n        this.updateProgress(5, _('Starting operation...'));\n        \n        callPartExpAutopart()\n            .then(function(response) {\n                if (response && response.success) {\n                    self.isRunning = true;\n                    self.operationComplete = false;\n                    self.startLogPolling();\n                    \n                    if (self.dom.executeStatus) {\n                        self.dom.executeStatus.textContent = _('Operation started successfully');\n                    }\n                } else {\n                    var errorMsg = response && response.message ? response.message : _('Operation failed');\n                    self.handleOperationError(errorMsg);\n                }\n            })\n            .catch(function(error) {\n                console.error('Operation failed:', error);\n                self.handleOperationError(_('Failed to start operation:') + ' ' + (error.message || _('Unknown error')));\n            });\n    },\n\n    resetOperationState: function() {\n        this.logPosition = '0';\n        this.isRunning = true;\n        this.operationComplete = false;\n        this.pollErrorCount = 0;\n        this.pollingStartTime = Date.now();\n        this.lastPollTime = 0;\n        this.currentProgress = 0;\n        \n        this.updateProgress(0, _('Starting operation...'));\n    },\n\n    handleOperationError: function(errorMsg) {\n        alert(errorMsg);\n        if (this.dom.executeBtn) {\n            this.dom.executeBtn.disabled = false;\n            this.dom.executeBtn.textContent = _('Click to execute');\n        }\n        \n        this.switchState('ready');\n        this.stopLogPolling();\n        \n        if (this.dom.logView) {\n            var currentLog = this.dom.logView.value || '';\n            this.dom.logView.value = currentLog + '\\n\\n' + _('操作失败:') + ' ' + errorMsg;\n            setTimeout(() => {\n                if (this.dom.logView) {\n                    this.dom.logView.scrollTop = this.dom.logView.scrollHeight;\n                }\n            }, 100);\n        }\n    },\n\n    updateFormVisibility: function() {\n        if (!this.dom.targetFunction || !this.dom.targetDisk || \n            !this.dom.keepConfig || !this.dom.formatType) return;\n        \n        var func = this.dom.targetFunction.value;\n        var diskDiv = this.dom.targetDisk.closest('.cbi-value');\n        var keepDiv = this.dom.keepConfig.closest('.cbi-value');\n        var formatDiv = this.dom.formatType.closest('.cbi-value');\n        \n        if (!diskDiv || !keepDiv || !formatDiv) return;\n        \n        if (func === '/') {\n            diskDiv.style.display = 'none';\n            formatDiv.style.display = 'none';\n            keepDiv.style.display = 'block';\n        } else if (func === '/overlay') {\n            diskDiv.style.display = 'block';\n            formatDiv.style.display = 'none';\n            keepDiv.style.display = 'block';\n        } else {\n            diskDiv.style.display = 'block';\n            formatDiv.style.display = 'block';\n            keepDiv.style.display = 'none';\n        }\n    },\n\n    checkOperationStatus: function() {\n        var self = this;\n        \n        callPartExpGetStatus().then(function(response) {\n            if (response && response.running) {\n                self.isRunning = true;\n                self.switchState('executing');\n                self.startLogPolling();\n                \n                if (self.dom.executeBtn) {\n                    self.dom.executeBtn.disabled = true;\n                    self.dom.executeBtn.textContent = _('Operation in progress...');\n                }\n                \n                if (self.dom.executeStatus) {\n                    self.dom.executeStatus.textContent = _('Operation in progress...');\n                }\n            }\n        }).catch(function(error) {\n            console.error('Failed to check operation status:', error);\n        });\n    },\n\n    startLogPolling: function() {\n        var self = this;\n        \n        this.stopLogPolling();\n        \n        this.pollErrorCount = 0;\n        this.pollingStartTime = Date.now();\n        this.lastPollTime = 0;\n        \n        this.updateProgress(10, _('Operation in progress...'));\n        \n        this.logPolling = setInterval(function() {\n            if (Date.now() - self.pollingStartTime > 20 * 60 * 1000) {\n                console.error('Operation timeout');\n                self.stopLogPolling();\n                self.isRunning = false;\n                \n                if (self.dom.logView) {\n                    var currentLog = self.dom.logView.value || '';\n                    self.dom.logView.value = currentLog + '\\n\\n[超时] 操作超过20分钟未完成，请检查系统';\n                    setTimeout(() => {\n                        if (self.dom.logView) {\n                            self.dom.logView.scrollTop = self.dom.logView.scrollHeight;\n                        }\n                    }, 100);\n                }\n                \n                self.switchState('ready');\n                \n                if (self.dom.executeBtn) {\n                    self.dom.executeBtn.disabled = false;\n                    self.dom.executeBtn.textContent = _('Click to execute');\n                }\n                return;\n            }\n            \n            self.pollLog();\n        }, 3000); // 每3秒轮询一次，减少频率\n    },\n\n    pollLog: function() {\n        var self = this;\n        \n        if (!this.isRunning) {\n            this.stopLogPolling();\n            return;\n        }\n        \n        var pollStartTime = Date.now();\n        \n        callPartExpGetLog('0').then(function(response) {\n            if (!response) {\n                console.error('No response from log polling');\n                return;\n            }\n            \n            if (pollStartTime < self.lastPollTime) {\n                return;\n            }\n            \n            self.lastPollTime = pollStartTime;\n            \n            if (response.log !== undefined) {\n                var logContent = response.log.toString().trim();\n                \n                if (response.position) {\n                    self.logPosition = response.position;\n                }\n                \n                if (self.dom.logView) {\n                    if (logContent !== '') {\n                        self.dom.logView.value = logContent;\n                        \n                        setTimeout(function() {\n                            if (self.dom.logView && self.dom.logView.value) {\n                                self.dom.logView.scrollTop = self.dom.logView.scrollHeight;\n                            }\n                        }, 50);\n                    }\n                }\n                \n                self.parseAndUpdateProgress(logContent);\n                \n                if (self.checkOperationComplete(logContent)) {\n                    self.handleOperationComplete();\n                }\n            }\n            \n            if (response.complete) {\n                self.handleOperationComplete();\n            }\n            \n            self.pollErrorCount = 0;\n            \n        }).catch(function(error) {\n            console.error('Log polling error:', error);\n            \n            self.pollErrorCount = (self.pollErrorCount || 0) + 1;\n            if (self.pollErrorCount > 5) {\n                console.error('Too many polling errors, stopping');\n                self.stopLogPolling();\n                self.isRunning = false;\n                self.switchState('ready');\n                \n                if (self.dom.executeBtn) {\n                    self.dom.executeBtn.disabled = false;\n                    self.dom.executeBtn.textContent = _('Click to execute');\n                }\n                if (self.dom.logView) {\n                    var currentLog = self.dom.logView.value || '';\n                    self.dom.logView.value = currentLog + '\\n\\n[错误] 日志轮询失败，请刷新页面查看最新状态';\n                    setTimeout(() => {\n                        if (self.dom.logView) {\n                            self.dom.logView.scrollTop = self.dom.logView.scrollHeight;\n                        }\n                    }, 100);\n                }\n            }\n        });\n    },\n\n    checkOperationComplete: function(logText) {\n        if (!logText) return false;\n        \n        var completeMarkers = [\n            '重启设备',\n            '操作完成'\n        ];\n        \n        for (var i = 0; i < completeMarkers.length; i++) {\n            if (logText.includes(completeMarkers[i])) {\n                return true;\n            }\n        }\n        \n        return false;\n    },\n\n    handleOperationComplete: function() {\n        if (this.operationComplete) {\n            return;\n        }\n        \n        this.operationComplete = true;\n        this.isRunning = false;\n        this.isNewOperation = false;\n        \n        this.stopLogPolling();\n        if (this.dom.logView) {\n            var currentLog = this.dom.logView.value || '';\n            if (!currentLog.includes('操作完成')) {\n                this.dom.logView.value = currentLog;\n                setTimeout(() => {\n                    if (this.dom.logView) {\n                        this.dom.logView.scrollTop = this.dom.logView.scrollHeight;\n                    }\n                }, 100);\n            }\n        }\n        \n        this.updateProgress(100, _('Operation completed'));\n        \n        setTimeout(() => {\n            if (this.dom.executeBtn) {\n                this.dom.executeBtn.disabled = false;\n                this.dom.executeBtn.textContent = _('Click to execute');\n            }\n            \n            setTimeout(() => {\n                this.switchState('ready');\n            }, 3000);\n        }, 2000);\n    },\n\n    parseAndUpdateProgress: function(logText) {\n        if (!logText || !this.dom.executeStatus) return;\n        \n        var percent = 0;\n        var statusMessage = _('Operation in progress...');\n        \n        if (logText.includes('100%') || logText.includes('操作完成') || logText.includes('扩容成功')) {\n            percent = 100;\n            statusMessage = _('Operation completed');\n        } else if ( logText.includes('错误') || logText.includes('error')) {\n            return;\n        } else if (logText.includes('分区扩容和挂载到') || logText.includes('正在挂载')) {\n            percent = 90;\n            statusMessage = _('Getting device information');\n        } else if (logText.includes('检测设备')) {\n            percent = 60;\n            statusMessage = _('Checking partition format');\n        } else if (logText.includes('开始检测目标')) {\n            percent = 50;\n            statusMessage = _('Checking target device');\n        } else if (logText.includes('定位到操作目标设备分区')) {\n            percent = 40;\n            statusMessage = _('Locating target partition');\n        } else if (logText.includes('目标盘') && logText.includes('有剩余空间')) {\n            percent = 30;\n            statusMessage = _('Checking free space');\n        } else if (logText.includes('操作功能')) {\n            percent = 20;\n            statusMessage = _('Starting operation');\n        } else if (logText.includes('开始执行') || logText.includes('Starting')) {\n            percent = 10;\n            statusMessage = _('Initializing...');\n        }\n        \n        if (percent > 0) {\n            this.currentProgress = Math.max(this.currentProgress || 0, percent);\n        } else {\n            this.currentProgress = Math.min(90, (this.currentProgress || 0) + 1);\n        }\n        \n        this.updateProgress(this.currentProgress, statusMessage);\n    },\n\n    updateProgress: function(percent, message) {\n        if (!this.dom.progressBar || !this.dom.progressText || !this.dom.executeStatus) {\n            return;\n        }\n        \n        percent = Math.max(0, Math.min(100, percent));\n        \n        this.dom.progressBar.style.width = percent + '%';\n        \n        this.dom.progressText.textContent = percent + '%';\n        \n        this.dom.executeStatus.textContent = message;\n    },\n\n    stopLogPolling: function() {\n        if (this.logPolling) {\n            clearInterval(this.logPolling);\n            this.logPolling = null;\n        }\n    },\n\n    // 切换状态\n    switchState: function(to) {\n        if (!this.dom.stateContainer) return;\n        \n        this.dom.stateContainer.classList.remove(\n            'state-ctl-ready',\n            'state-ctl-executing'\n        );\n        \n        this.dom.stateContainer.classList.add('state-ctl-' + to);\n    },\n\n    getFunctionDescription: function(func) {\n        switch(func) {\n            case '/': return _('Extend to root directory');\n            case '/overlay': return _('Expand overlay');\n            case '/opt': return _('Docker data disk');\n            case '/dev': return _('Normal mount');\n            default: return func;\n        }\n    },\n\n    getFormatTypeDescription: function(type) {\n        switch(type) {\n            case '0': return _('No formatting');\n            case 'ext4': return _('EXT4');\n            case 'btrfs': return _('Btrfs');\n            case 'ntfs': return _('NTFS');\n            default: return type;\n        }\n    },\n\n    handleSaveApply: null,\n    handleSave: null,\n    handleReset: null\n});"
  },
  {
    "path": "luci-app-partexp/htdocs/luci-static/resources/view/partexp/partexp.js",
    "content": "/*\n *  Copyright (C) 2022-2025 Sirpdboy <herboy2008@gmail.com>\n *\n *  Licensed to the public under the Apache License 2.0\n */\n\n'use strict';\n\n'require form';\n'require fs';\n'require rpc';\n'require uci';\n'require ui';\n'require view';\n\n// 声明 RPC 接口\nvar callPartExpAutopart = rpc.declare({\n    object: 'partexp',\n    method: 'autopart'\n});\n\nvar callPartExpGetLog = rpc.declare({\n    object: 'partexp',\n    method: 'get_log',\n    params: ['position']\n});\n\nvar callPartExpGetDevices = rpc.declare({\n    object: 'partexp',\n    method: 'get_devices'\n});\n\nvar callPartExpGetStatus = rpc.declare({\n    object: 'partexp',\n    method: 'get_status'\n});\n\n// 添加保存配置的 RPC 声明\nvar callPartExpSaveConfig = rpc.declare({\n    object: 'partexp',\n    method: 'save_config',\n    params: ['target_function', 'target_disk', 'keep_config', 'format_type']\n});\n\nreturn view.extend({\n    load: function() {\n        return Promise.all([\n            L.resolveDefault(fs.stat('/usr/bin/partexp'), null),\n            L.resolveDefault(fs.stat('/tmp/partexp.log'), null)\n        ]);\n    },\n\n    render: function(data) {\n        var container = E('div', { class: 'cbi-map' });\n        var htmlParts = [\n            '<style>',\n            '.state-ctl .state { display: none !important; }',\n            '.state-ctl.state-ctl-ready .state.state-ready,',\n            '.state-ctl.state-ctl-executing .state.state-executing {',\n            '    display: block !important;',\n            '}',\n            '.progress-container {',\n            '    width: 100%;',\n            '    height: 20px;',\n            '    background: rgba(0,0,0,0.2);',\n            '    border-radius: 10px;',\n            '    display: inline-block;',\n            '    margin: 10px 0;',\n            '    vertical-align: middle;',\n            '    position: relative;',\n            '    overflow: hidden;',\n            '}',\n            '.progress-bar {',\n            '    height: 100%;',\n            '    background: linear-gradient(90deg, #4CAF50, #8BC34A);',\n            '    transition: width 0.3s ease-out;',\n            '    position: absolute;',\n            '    left: 0;',\n            '    top: 0;',\n            '}',\n            '.progress-text {',\n            '    position: absolute;',\n            '    width: 100%;',\n            '    text-align: center;',\n            '    line-height: 20px;',\n            '    font-size: 12px;',\n            '    font-weight: bold;',\n            '    color: #eee;',\n            '    z-index: 1;',\n            '    text-shadow: 1px 1px 2px rgba(0,0,0,0.5);',\n            '}',\n            '.error-message {',\n            '    color: #dc3545;',\n            '}',\n            '.info-note {',\n            '    padding: 10px;',\n            '    margin: 10px 0;',\n            '    border-radius: 4px;',\n            '}',\n            '.log-view {',\n            '    font-family: \"Courier New\", monospace;',\n            '    font-size: 12px;',\n            '    height: 300px;',\n            '    overflow-y: auto;',\n            '    white-space: pre-wrap;',\n            '}',\n        '</style>',\n        '<h2 name=\"content\">' + _('One click partition expansion mounting tool') + '</h2>',\n        '<div class=\"cbi-section-descr\">',\n        '    <div class=\"info-note\">',\n        '        ' + _('Automatically format and mount the target device partition. If there are multiple partitions, it is recommended to manually delete all partitions before using this tool.') + '<br>',\n        '        ' + _('For specific usage, see:') + ' ',\n        '        <a href=\"https://github.com/sirpdboy/luci-app-partexp.git\" target=\"_blank\">',\n        '            GitHub @partexp',\n        '        </a>',\n        '    </div>',\n            '</div>',\n            '<div class=\"state-ctl state-ctl-ready\" id=\"state-container\">',\n            '    <div class=\"cbi-section cbi-section-node\">',\n            '        <div class=\"state state-ready\">',\n            '            <form id=\"partexp-form\">',\n            '                <div class=\"cbi-value\">',\n            '                    <label class=\"cbi-value-title\" for=\"target_function\">' + _('Select function') + '</label>',\n            '                    <div class=\"cbi-value-field\">',\n            '                        <select class=\"cbi-input-select\" id=\"target_function\" name=\"target_function\">',\n            '                            <option value=\"/\">' + _('Used to extend to the root directory of EXT4 firmware(Ext4 /)') + '</option>',\n            '                            <option value=\"/overlay\">' + _('Expand application space overlay (/overlay)') + '</option>',\n            '                            <option value=\"/opt\">' + _('Used as Docker data disk (/opt)') + '</option>',\n            '                            <option value=\"/mnt\">' + _('Normal mount and use by device name(/mnt/x1)') + '</option>',\n            '                        </select>',\n            '                        <div class=\"cbi-value-description\">' + _('Select the function to be performed') + '</div>',\n            '                    </div>',\n            '                </div>',\n            '                <div class=\"cbi-value\">',\n            '                    <label class=\"cbi-value-title\" for=\"target_disk\">' + _('Destination hard disk') + '</label>',\n            '                    <div class=\"cbi-value-field\">',\n            '                        <select class=\"cbi-input-select\" id=\"target_disk\" name=\"target_disk\">',\n            '                            <option value=\"\">' + _('Loading devices...') + '</option>',\n            '                        </select>',\n            '                        <div class=\"cbi-value-description\">' + _('Select the hard disk device to operate') + '</div>',\n            '                    </div>',\n            '                </div>',\n            '                <div class=\"cbi-value\">',\n            '                    <label class=\"cbi-value-title\" for=\"keep_config\">' + _('Keep configuration') + '</label>',\n            '                    <div class=\"cbi-value-field\">',\n            '                        <input type=\"checkbox\" class=\"cbi-input-checkbox\" id=\"keep_config\" name=\"keep_config\" value=\"1\" />',\n            '                        <label for=\"keep_config\">' + _('Tick means to retain the settings') + '</label>',\n            '                    </div>',\n            '                </div>',\n            '                <div class=\"cbi-value\">',\n            '                    <label class=\"cbi-value-title\" for=\"format_type\">' + _('Format system type') + '</label>',\n            '                    <div class=\"cbi-value-field\">',\n            '                        <select class=\"cbi-input-select\" id=\"format_type\" name=\"format_type\">',\n            '                            <option value=\"0\">' + _('No formatting required') + '</option>',\n            '                            <option value=\"ext4\">' + _('Linux system partition(EXT4)') + '</option>',\n            '                            <option value=\"btrfs\">' + _('Large capacity storage devices(Btrfs)') + '</option>',\n            '                            <option value=\"ntfs\">' + _('Windows system partition(NTFS)') + '</option>',\n            '                        </select>',\n            '                    </div>',\n            '                </div>',\n            '                <div class=\"cbi-value cbi-value-last\">',\n            '                    <label class=\"cbi-value-title\">' + _('Perform operation') + '</label>',\n            '                    <div class=\"cbi-value-field\">',\n            '                        <button type=\"button\" class=\"cbi-button cbi-button-apply\" id=\"execute-btn\">',\n            '                            ' + _('Click to execute') + '',\n            '                        </button>',\n            '                    </div>',\n            '                </div>',\n            '            </form>',\n            '        </div>',\n            '        <div class=\"state state-executing\">',\n            '            <div class=\"cbi-value\">',\n            '                <label class=\"cbi-value-title\" id=\"execute_status\">' + _('Starting operation...') + '</label>',\n            '                <div class=\"cbi-value-field\">',\n            '                    <div class=\"progress-container\">',\n            '                        <div id=\"progress-bar\" class=\"progress-bar\" style=\"width: 0%\"></div>',\n            '                        <div id=\"progress-text\" class=\"progress-text\">0%</div>',\n            '                    </div>',\n            '                </div>',\n            '            </div>',\n            '        </div>',\n            '    </div>',\n            '    <div id=\"log-section\" style=\"display: block; margin-top: 20px;\">',\n            '        <div class=\"cbi-value\">',\n            '            <label class=\"cbi-value-title\">' + _('Operation Log') + '</label>',\n            '            <div class=\"cbi-value-field\">',\n            '                <textarea id=\"log-view\" class=\"log-view\" readonly=\"readonly\" rows=\"15\"></textarea>',\n            '            </div>',\n            '        </div>',\n            '    </div>',\n            '</div>'\n        ];\n        container.innerHTML = htmlParts.join('');\n\n        var self = this;\n        \n        var uci = self.uci || window.uci;\n        setTimeout(function() {\n            self.initDOM();\n            self.bindEvents();\n            self.loadDevices();\n            self.loadSavedConfig();\n            self.checkOperationStatus();\n            self.loadExistingLog();\n        }, 100);\n\n        return container;\n    },\n\n    initDOM: function() {\n        this.dom = {\n            stateContainer: document.querySelector('#state-container'),\n            targetFunction: document.querySelector('#target_function'),\n            targetDisk: document.querySelector('#target_disk'),\n            keepConfig: document.querySelector('#keep_config'),\n            formatType: document.querySelector('#format_type'),\n            executeBtn: document.querySelector('#execute-btn'),\n            logView: document.querySelector('#log-view'),\n            progressBar: document.querySelector('#progress-bar'),\n            progressText: document.querySelector('#progress-text'),\n            executeStatus: document.querySelector('#execute_status')\n        };\n        \n        this.logPosition = '0';\n        this.logPolling = null;\n        this.isRunning = false;\n        this.operationComplete = false;\n        this.pollErrorCount = 0;\n        this.pollingStartTime = 0;\n        this.lastPollTime = 0;\n        this.currentProgress = 0;\n        this.autoSaveTimer = null;\n        this.isNewOperation = false; // 标记是否是新操作\n    },\n\n    bindEvents: function() {\n        var self = this;\n        if (this.dom.executeBtn) {\n            this.dom.executeBtn.addEventListener('click', function(e) {\n                e.preventDefault();\n                self.executeOperation();\n            });\n        }\n        \n        [this.dom.targetFunction, this.dom.targetDisk, this.dom.formatType].forEach(function(element) {\n            if (element) {\n                element.addEventListener('change', function() {\n                    self.autoSaveConfig();\n                    self.updateFormVisibility();\n                });\n            }\n        });\n        \n        if (this.dom.keepConfig) {\n            this.dom.keepConfig.addEventListener('click', function() {\n                self.autoSaveConfig();\n            });\n        }\n        \n        if (this.dom.targetFunction) {\n            this.updateFormVisibility();\n        }\n    },\n    \nloadDevices: function() {\n    var self = this;\n    \n    if (self.dom.targetDisk) {\n        var loadingOption = document.createElement('option');\n        loadingOption.value = '';\n        loadingOption.textContent = _('Loading devices...');\n        loadingOption.disabled = true;\n        loadingOption.selected = true;\n        self.dom.targetDisk.innerHTML = '';\n        self.dom.targetDisk.appendChild(loadingOption);\n    }\n    function loadDevicesWithRetry(retryCount = 0) {\n        callPartExpGetDevices().then(function(response) {\n            if (!response) {\n                throw new Error('Empty response');\n            }\n            if (self.dom.targetDisk) {\n                self.dom.targetDisk.innerHTML = '';\n                if (response.devices && response.devices.length > 0) {\n                    response.devices.forEach(function(device) {\n                        var option = document.createElement('option');\n                        option.value = device.name;\n                        option.textContent = device.name + ' (' + device.dev + ', ' + device.size + ' MB)';\n                        self.dom.targetDisk.appendChild(option);\n                    });\n                } else {\n\t\t\n                    var noDeviceOption = document.createElement('option');\n                    noDeviceOption.value = '';\n                    noDeviceOption.textContent = _('no find device');\n                    noDeviceOption.disabled = true;\n                    noDeviceOption.selected = true;\n                    self.dom.targetDisk.appendChild(noDeviceOption);\n                }\n            }\n        }).catch(function(error) {\n            console.error('Failed to load devices:', error);\n            \n            if (retryCount < 3) {\n                setTimeout(function() {\n                    loadDevicesWithRetry(retryCount + 1);\n                }, 1000 * (retryCount + 1));\n            } else {\n                if (self.dom.targetDisk) {\n                    self.dom.targetDisk.innerHTML = '';\n                    var errorOption = document.createElement('option');\n                    errorOption.value = '';\n                    errorOption.textContent = _('load error');\n                    errorOption.disabled = true;\n                    errorOption.selected = true;\n                    self.dom.targetDisk.appendChild(errorOption);\n                }\n                \n                ui.addNotification({\n                    title: _('load device error'),\n                    text: _('Failed to load devices:'),\n                    type: 'error',\n                    delay: 5000\n                });\n            }\n        });\n    }\n\n    loadDevicesWithRetry();\n},\n\n\n    loadExistingLog: function() {\n        var self = this;\n        \n        callPartExpGetLog('0').then(function(response) {\n            if (response && response.log) {\n                var logContent = response.log.toString().trim();\n                if (logContent && self.dom.logView) {\n                    self.dom.logView.value = logContent;\n                    \n                    setTimeout(function() {\n                        if (self.dom.logView && self.dom.logView.value) {\n                            self.dom.logView.scrollTop = self.dom.logView.scrollHeight;\n                        }\n                    }, 100);\n                    \n                    if (response.position) {\n                        self.logPosition = response.position;\n                    }\n                    if (!self.isRunning && logContent.includes('正在执行') && !logContent.includes('操作完成')) {\n                        self.isRunning = true;\n                        self.switchState('executing');\n                        self.startLogPolling();\n                    }\n                }\n            }\n        }).catch(function(error) {\n            console.error('Failed to load existing log:', error);\n        });\n    },\n\n    loadSavedConfig: function() {\n        var self = this;\n        \n        return fs.read('/etc/config/partexp').then(function(content) {\n            if (!content) {\n                self.setDefaultConfig();\n                return;\n            }\n            \n            var lines = content.split('\\n');\n            var config = {};\n            \n            lines.forEach(function(line) {\n                line = line.trim();\n                if (line.startsWith('option')) {\n                    var parts = line.split(/\\s+/);\n                    if (parts.length >= 3) {\n                        var key = parts[1];\n                        var value = parts.slice(2).join(' ').replace(/^['\"]|['\"]$/g, '');\n                        config[key] = value;\n                    }\n                }\n            });\n            \n            if (self.dom.targetFunction) {\n                self.dom.targetFunction.value = config.target_function || '/opt';\n            }\n            if (self.dom.targetDisk && config.target_disk) {\n                setTimeout(function() {\n                    if (self.dom.targetDisk) {\n                        self.dom.targetDisk.value = config.target_disk;\n                    }\n                }, 500);\n            }\n            if (self.dom.keepConfig) {\n                self.dom.keepConfig.checked = (config.keep_config === '1');\n            }\n            if (self.dom.formatType) {\n                self.dom.formatType.value = config.format_type || '0';\n            }\n            \n            self.configCache = config;\n            \n            self.updateFormVisibility();\n            \n        }).catch(function(error) {\n            console.log('Failed to load config:', error);\n            self.setDefaultConfig();\n        });\n    },\n\n    setDefaultConfig: function() {\n        if (this.dom.targetFunction) {\n            this.dom.targetFunction.value = '/opt';\n        }\n        if (this.dom.formatType) {\n            this.dom.formatType.value = '0';\n        }\n        if (this.dom.keepConfig) {\n            this.dom.keepConfig.checked = false;\n        }\n        this.updateFormVisibility();\n        \n        this.configCache = {\n            target_function: '/opt',\n            target_disk: '',\n            keep_config: '0',\n            format_type: '0'\n        };\n    },\n\n    autoSaveConfig: function() {\n        var self = this;\n        \n        if (this.autoSaveTimer) {\n            clearTimeout(this.autoSaveTimer);\n        }\n        this.autoSaveTimer = setTimeout(function() {\n            self.saveCurrentConfig();\n        }, 1500);\n    },\n\n    saveCurrentConfig: function() {\n        var self = this;\n        \n        var targetFunction = this.dom.targetFunction ? this.dom.targetFunction.value : '/opt';\n        var targetDisk = this.dom.targetDisk ? this.dom.targetDisk.value : '';\n        var keepConfig = this.dom.keepConfig ? this.dom.keepConfig.checked : false;\n        var formatType = this.dom.formatType ? this.dom.formatType.value : '0';\n        if (callPartExpSaveConfig) {\n            return callPartExpSaveConfig(\n                targetFunction,\n                targetDisk,\n                keepConfig ? '1' : '0',\n                formatType\n            ).then(function(response) {\n                if (response && response.success) {\n\n                    self.configCache = {\n                        target_function: targetFunction,\n                        target_disk: targetDisk,\n                        keep_config: keepConfig ? '1' : '0',\n                        format_type: formatType\n                    };\n                    \n                    return true;\n                } else {\n                    console.warn('RPC save failed, falling back to file write');\n                    return self.saveConfigToFile(targetFunction, targetDisk, keepConfig, formatType);\n                }\n            }).catch(function(error) {\n                console.error('RPC save config error:', error);\n                return self.saveConfigToFile(targetFunction, targetDisk, keepConfig, formatType);\n            });\n        } else {\n            return self.saveConfigToFile(targetFunction, targetDisk, keepConfig, formatType);\n        }\n    },\n\n    saveConfigToFile: function(targetFunction, targetDisk, keepConfig, formatType) {\n        var configContent = [\n            '# Auto-generated by partexp',\n            '',\n            'config global global',\n            \"\\toption target_function '\" + targetFunction + \"'\",\n            \"\\toption target_disk '\" + targetDisk + \"'\",\n            \"\\toption keep_config '\" + (keepConfig ? '1' : '0') + \"'\",\n            \"\\toption format_type '\" + formatType + \"'\",\n            ''\n        ].join('\\n');\n        \n        return fs.write('/etc/config/partexp', configContent).then(function() {\n            console.log('Settings saved to file /etc/config/partexp');\n            return true;\n        }).catch(function(error) {\n            console.error('Failed to save settings to file:', error);\n            return false;\n        });\n    },\n\n    executeOperation: function() {\n        var self = this;\n        \n        this.saveCurrentConfig();\n        var target_function = this.dom.targetFunction.value;\n        var target_disk = this.dom.targetDisk.value;\n        \n        if (target_function !== '/' && (!target_disk || target_disk.trim() === '')) {\n            alert(_('Please select a target disk'));\n            return;\n        }\n        \n        var confirmMessage = _('Are you sure you want to execute partition expansion?') + '\\n\\n' +\n                           _('Function:') + ' ' + this.getFunctionDescription(target_function) + '\\n' +\n                           (target_function !== '/' ? _('Disk:') + ' ' + target_disk + '\\n' : '') +\n                           (target_function === '/' || target_function === '/overlay' ? \n                            _('Keep config:') + ' ' + (this.dom.keepConfig.checked ? _('Yes') : _('No')) + '\\n' : '') +\n                           (target_function === '/opt' || target_function === '/dev' ? \n                            _('Format type:') + ' ' + this.getFormatTypeDescription(this.dom.formatType.value) + '\\n' : '') +\n                           '\\n' + _('This operation may take several minutes.');\n        \n        if (!confirm(confirmMessage)) {\n            return;\n        }\n        \n        this.resetOperationState();\n        \n        this.isNewOperation = true;\n        \n        if (this.dom.logView) {\n            this.dom.logView.value = _('正在启动操作...');\n        }\n        \n        if (this.dom.executeBtn) {\n            this.dom.executeBtn.disabled = true;\n            this.dom.executeBtn.textContent = _('Executing...');\n        }\n        \n        this.switchState('executing');\n        \n        this.updateProgress(5, _('Starting operation...'));\n        \n        callPartExpAutopart()\n            .then(function(response) {\n                if (response && response.success) {\n                    self.isRunning = true;\n                    self.operationComplete = false;\n                    self.startLogPolling();\n                    \n                    if (self.dom.executeStatus) {\n                        self.dom.executeStatus.textContent = _('Operation started successfully');\n                    }\n                } else {\n                    var errorMsg = response && response.message ? response.message : _('Operation failed');\n                    self.handleOperationError(errorMsg);\n                }\n            })\n            .catch(function(error) {\n                console.error('Operation failed:', error);\n                self.handleOperationError(_('Failed to start operation:') + ' ' + (error.message || _('Unknown error')));\n            });\n    },\n\n    resetOperationState: function() {\n        this.logPosition = '0';\n        this.isRunning = true;\n        this.operationComplete = false;\n        this.pollErrorCount = 0;\n        this.pollingStartTime = Date.now();\n        this.lastPollTime = 0;\n        this.currentProgress = 0;\n        \n        this.updateProgress(0, _('Starting operation...'));\n    },\n\n    handleOperationError: function(errorMsg) {\n        alert(errorMsg);\n        if (this.dom.executeBtn) {\n            this.dom.executeBtn.disabled = false;\n            this.dom.executeBtn.textContent = _('Click to execute');\n        }\n        \n        this.switchState('ready');\n        this.stopLogPolling();\n        \n        if (this.dom.logView) {\n            var currentLog = this.dom.logView.value || '';\n            this.dom.logView.value = currentLog + '\\n\\n' + _('操作失败:') + ' ' + errorMsg;\n            setTimeout(() => {\n                if (this.dom.logView) {\n                    this.dom.logView.scrollTop = this.dom.logView.scrollHeight;\n                }\n            }, 100);\n        }\n    },\n\n    updateFormVisibility: function() {\n        if (!this.dom.targetFunction || !this.dom.targetDisk || \n            !this.dom.keepConfig || !this.dom.formatType) return;\n        \n        var func = this.dom.targetFunction.value;\n        var diskDiv = this.dom.targetDisk.closest('.cbi-value');\n        var keepDiv = this.dom.keepConfig.closest('.cbi-value');\n        var formatDiv = this.dom.formatType.closest('.cbi-value');\n        \n        if (!diskDiv || !keepDiv || !formatDiv) return;\n        \n        if (func === '/') {\n            diskDiv.style.display = 'none';\n            formatDiv.style.display = 'none';\n            keepDiv.style.display = 'block';\n        } else if (func === '/overlay') {\n            diskDiv.style.display = 'block';\n            formatDiv.style.display = 'none';\n            keepDiv.style.display = 'block';\n        } else {\n            diskDiv.style.display = 'block';\n            formatDiv.style.display = 'block';\n            keepDiv.style.display = 'none';\n        }\n    },\n\n    checkOperationStatus: function() {\n        var self = this;\n        \n        callPartExpGetStatus().then(function(response) {\n            if (response && response.running) {\n                self.isRunning = true;\n                self.switchState('executing');\n                self.startLogPolling();\n                \n                if (self.dom.executeBtn) {\n                    self.dom.executeBtn.disabled = true;\n                    self.dom.executeBtn.textContent = _('Operation in progress...');\n                }\n                \n                if (self.dom.executeStatus) {\n                    self.dom.executeStatus.textContent = _('Operation in progress...');\n                }\n            }\n        }).catch(function(error) {\n            console.error('Failed to check operation status:', error);\n        });\n    },\n\n    startLogPolling: function() {\n        var self = this;\n        \n        this.stopLogPolling();\n        \n        this.pollErrorCount = 0;\n        this.pollingStartTime = Date.now();\n        this.lastPollTime = 0;\n        \n        this.updateProgress(10, _('Operation in progress...'));\n        \n        this.logPolling = setInterval(function() {\n            if (Date.now() - self.pollingStartTime > 20 * 60 * 1000) {\n                console.error('Operation timeout');\n                self.stopLogPolling();\n                self.isRunning = false;\n                \n                if (self.dom.logView) {\n                    var currentLog = self.dom.logView.value || '';\n                    self.dom.logView.value = currentLog + '\\n\\n[超时] 操作超过20分钟未完成，请检查系统';\n                    setTimeout(() => {\n                        if (self.dom.logView) {\n                            self.dom.logView.scrollTop = self.dom.logView.scrollHeight;\n                        }\n                    }, 100);\n                }\n                \n                self.switchState('ready');\n                \n                if (self.dom.executeBtn) {\n                    self.dom.executeBtn.disabled = false;\n                    self.dom.executeBtn.textContent = _('Click to execute');\n                }\n                return;\n            }\n            \n            self.pollLog();\n        }, 3000); // 每3秒轮询一次，减少频率\n    },\n\n    pollLog: function() {\n        var self = this;\n        \n        if (!this.isRunning) {\n            this.stopLogPolling();\n            return;\n        }\n        \n        var pollStartTime = Date.now();\n        \n        callPartExpGetLog('0').then(function(response) {\n            if (!response) {\n                console.error('No response from log polling');\n                return;\n            }\n            \n            if (pollStartTime < self.lastPollTime) {\n                return;\n            }\n            \n            self.lastPollTime = pollStartTime;\n            \n            if (response.log !== undefined) {\n                var logContent = response.log.toString().trim();\n                \n                if (response.position) {\n                    self.logPosition = response.position;\n                }\n                \n                if (self.dom.logView) {\n                    if (logContent !== '') {\n                        self.dom.logView.value = logContent;\n                        \n                        setTimeout(function() {\n                            if (self.dom.logView && self.dom.logView.value) {\n                                self.dom.logView.scrollTop = self.dom.logView.scrollHeight;\n                            }\n                        }, 50);\n                    }\n                }\n                \n                self.parseAndUpdateProgress(logContent);\n                \n                if (self.checkOperationComplete(logContent)) {\n                    self.handleOperationComplete();\n                }\n            }\n            \n            if (response.complete) {\n                self.handleOperationComplete();\n            }\n            \n            self.pollErrorCount = 0;\n            \n        }).catch(function(error) {\n            console.error('Log polling error:', error);\n            \n            self.pollErrorCount = (self.pollErrorCount || 0) + 1;\n            if (self.pollErrorCount > 5) {\n                console.error('Too many polling errors, stopping');\n                self.stopLogPolling();\n                self.isRunning = false;\n                self.switchState('ready');\n                \n                if (self.dom.executeBtn) {\n                    self.dom.executeBtn.disabled = false;\n                    self.dom.executeBtn.textContent = _('Click to execute');\n                }\n                if (self.dom.logView) {\n                    var currentLog = self.dom.logView.value || '';\n                    self.dom.logView.value = currentLog + '\\n\\n[错误] 日志轮询失败，请刷新页面查看最新状态';\n                    setTimeout(() => {\n                        if (self.dom.logView) {\n                            self.dom.logView.scrollTop = self.dom.logView.scrollHeight;\n                        }\n                    }, 100);\n                }\n            }\n        });\n    },\n\n    checkOperationComplete: function(logText) {\n        if (!logText) return false;\n        \n        var completeMarkers = [\n            '重启设备',\n            '操作完成'\n        ];\n        \n        for (var i = 0; i < completeMarkers.length; i++) {\n            if (logText.includes(completeMarkers[i])) {\n                return true;\n            }\n        }\n        \n        return false;\n    },\n\n    handleOperationComplete: function() {\n        if (this.operationComplete) {\n            return;\n        }\n        \n        this.operationComplete = true;\n        this.isRunning = false;\n        this.isNewOperation = false;\n        \n        this.stopLogPolling();\n        if (this.dom.logView) {\n            var currentLog = this.dom.logView.value || '';\n            if (!currentLog.includes('操作完成')) {\n                this.dom.logView.value = currentLog;\n                setTimeout(() => {\n                    if (this.dom.logView) {\n                        this.dom.logView.scrollTop = this.dom.logView.scrollHeight;\n                    }\n                }, 100);\n            }\n        }\n        \n        this.updateProgress(100, _('Operation completed'));\n        \n        setTimeout(() => {\n            if (this.dom.executeBtn) {\n                this.dom.executeBtn.disabled = false;\n                this.dom.executeBtn.textContent = _('Click to execute');\n            }\n            \n            setTimeout(() => {\n                this.switchState('ready');\n            }, 3000);\n        }, 2000);\n    },\n\n    parseAndUpdateProgress: function(logText) {\n        if (!logText || !this.dom.executeStatus) return;\n        \n        var percent = 0;\n        var statusMessage = _('Operation in progress...');\n        \n        if (logText.includes('100%') || logText.includes('操作完成') || logText.includes('扩容成功')) {\n            percent = 100;\n            statusMessage = _('Operation completed');\n        } else if ( logText.includes('错误') || logText.includes('error')) {\n            return;\n        } else if (logText.includes('分区扩容和挂载到') || logText.includes('正在挂载')) {\n            percent = 90;\n            statusMessage = _('Getting device information');\n        } else if (logText.includes('检测设备')) {\n            percent = 60;\n            statusMessage = _('Checking partition format');\n        } else if (logText.includes('开始检测目标')) {\n            percent = 50;\n            statusMessage = _('Checking target device');\n        } else if (logText.includes('定位到操作目标设备分区')) {\n            percent = 40;\n            statusMessage = _('Locating target partition');\n        } else if (logText.includes('目标盘') && logText.includes('有剩余空间')) {\n            percent = 30;\n            statusMessage = _('Checking free space');\n        } else if (logText.includes('操作功能')) {\n            percent = 20;\n            statusMessage = _('Starting operation');\n        } else if (logText.includes('开始执行') || logText.includes('Starting')) {\n            percent = 10;\n            statusMessage = _('Initializing...');\n        }\n        \n        if (percent > 0) {\n            this.currentProgress = Math.max(this.currentProgress || 0, percent);\n        } else {\n            this.currentProgress = Math.min(90, (this.currentProgress || 0) + 1);\n        }\n        \n        this.updateProgress(this.currentProgress, statusMessage);\n    },\n\n    updateProgress: function(percent, message) {\n        if (!this.dom.progressBar || !this.dom.progressText || !this.dom.executeStatus) {\n            return;\n        }\n        \n        percent = Math.max(0, Math.min(100, percent));\n        \n        this.dom.progressBar.style.width = percent + '%';\n        \n        this.dom.progressText.textContent = percent + '%';\n        \n        this.dom.executeStatus.textContent = message;\n    },\n\n    stopLogPolling: function() {\n        if (this.logPolling) {\n            clearInterval(this.logPolling);\n            this.logPolling = null;\n        }\n    },\n\n    // 切换状态\n    switchState: function(to) {\n        if (!this.dom.stateContainer) return;\n        \n        this.dom.stateContainer.classList.remove(\n            'state-ctl-ready',\n            'state-ctl-executing'\n        );\n        \n        this.dom.stateContainer.classList.add('state-ctl-' + to);\n    },\n\n    getFunctionDescription: function(func) {\n        switch(func) {\n            case '/': return _('Extend to root directory');\n            case '/overlay': return _('Expand overlay');\n            case '/opt': return _('Docker data disk');\n            case '/dev': return _('Normal mount');\n            default: return func;\n        }\n    },\n\n    getFormatTypeDescription: function(type) {\n        switch(type) {\n            case '0': return _('No formatting');\n            case 'ext4': return _('EXT4');\n            case 'btrfs': return _('Btrfs');\n            case 'ntfs': return _('NTFS');\n            default: return type;\n        }\n    },\n\n    handleSaveApply: null,\n    handleSave: null,\n    handleReset: null\n});"
  },
  {
    "path": "luci-app-partexp/htdocs/luci-static/resources/view/partexp.js",
    "content": "/*\n *  Copyright (C) 2022-2025 Sirpdboy <herboy2008@gmail.com>\n *\n *  Licensed to the public under the Apache License 2.0\n */\n\n'use strict';\n\n'require form';\n'require fs';\n'require rpc';\n'require uci';\n'require ui';\n'require view';\n\n// 声明 RPC 接口\nvar callPartExpAutopart = rpc.declare({\n    object: 'partexp',\n    method: 'autopart'\n});\n\nvar callPartExpGetLog = rpc.declare({\n    object: 'partexp',\n    method: 'get_log',\n    params: ['position']\n});\n\nvar callPartExpGetDevices = rpc.declare({\n    object: 'partexp',\n    method: 'get_devices'\n});\n\nvar callPartExpGetStatus = rpc.declare({\n    object: 'partexp',\n    method: 'get_status'\n});\n\n// 添加保存配置的 RPC 声明\nvar callPartExpSaveConfig = rpc.declare({\n    object: 'partexp',\n    method: 'save_config',\n    params: ['target_function', 'target_disk', 'keep_config', 'format_type']\n});\n\nreturn view.extend({\n    load: function() {\n        return Promise.all([\n            L.resolveDefault(fs.stat('/usr/bin/partexp'), null),\n            L.resolveDefault(fs.stat('/tmp/partexp.log'), null)\n        ]);\n    },\n\n    render: function(data) {\n        var container = E('div', { class: 'cbi-map' });\n        var htmlParts = [\n            '<style>',\n            '.state-ctl .state { display: none !important; }',\n            '.state-ctl.state-ctl-ready .state.state-ready,',\n            '.state-ctl.state-ctl-executing .state.state-executing {',\n            '    display: block !important;',\n            '}',\n            '.progress-container {',\n            '    width: 100%;',\n            '    height: 20px;',\n            '    background: rgba(0,0,0,0.2);',\n            '    border-radius: 10px;',\n            '    display: inline-block;',\n            '    margin: 10px 0;',\n            '    vertical-align: middle;',\n            '    position: relative;',\n            '    overflow: hidden;',\n            '}',\n            '.progress-bar {',\n            '    height: 100%;',\n            '    background: linear-gradient(90deg, #4CAF50, #8BC34A);',\n            '    transition: width 0.3s ease-out;',\n            '    position: absolute;',\n            '    left: 0;',\n            '    top: 0;',\n            '}',\n            '.progress-text {',\n            '    position: absolute;',\n            '    width: 100%;',\n            '    text-align: center;',\n            '    line-height: 20px;',\n            '    font-size: 12px;',\n            '    font-weight: bold;',\n            '    color: #eee;',\n            '    z-index: 1;',\n            '    text-shadow: 1px 1px 2px rgba(0,0,0,0.5);',\n            '}',\n            '.error-message {',\n            '    color: #dc3545;',\n            '}',\n            '.info-note {',\n            '    padding: 10px;',\n            '    margin: 10px 0;',\n            '    border-radius: 4px;',\n            '}',\n            '.log-view {',\n            '    font-family: \"Courier New\", monospace;',\n            '    font-size: 12px;',\n            '    height: 300px;',\n            '    overflow-y: auto;',\n            '    white-space: pre-wrap;',\n            '}',\n        '</style>',\n        '<h2 name=\"content\">' + _('One click partition expansion mounting tool') + '</h2>',\n        '<div class=\"cbi-section-descr\">',\n        '    <div class=\"info-note\">',\n        '        ' + _('Automatically format and mount the target device partition. If there are multiple partitions, it is recommended to manually delete all partitions before using this tool.') + '<br>',\n        '        ' + _('For specific usage, see:') + ' ',\n        '        <a href=\"https://github.com/sirpdboy/luci-app-partexp.git\" target=\"_blank\">',\n        '            GitHub @partexp',\n        '        </a>',\n        '    </div>',\n            '</div>',\n            '<div class=\"state-ctl state-ctl-ready\" id=\"state-container\">',\n            '    <div class=\"cbi-section cbi-section-node\">',\n            '        <div class=\"state state-ready\">',\n            '            <form id=\"partexp-form\">',\n            '                <div class=\"cbi-value\">',\n            '                    <label class=\"cbi-value-title\" for=\"target_function\">' + _('Select function') + '</label>',\n            '                    <div class=\"cbi-value-field\">',\n            '                        <select class=\"cbi-input-select\" id=\"target_function\" name=\"target_function\">',\n            '                            <option value=\"/\">' + _('Used to extend to the root directory of EXT4 firmware(Ext4 /)') + '</option>',\n            '                            <option value=\"/overlay\">' + _('Expand application space overlay (/overlay)') + '</option>',\n            '                            <option value=\"/opt\">' + _('Used as Docker data disk (/opt)') + '</option>',\n            '                            <option value=\"/mnt\">' + _('Normal mount and use by device name(/mnt/x1)') + '</option>',\n            '                        </select>',\n            '                        <div class=\"cbi-value-description\">' + _('Select the function to be performed') + '</div>',\n            '                    </div>',\n            '                </div>',\n            '                <div class=\"cbi-value\">',\n            '                    <label class=\"cbi-value-title\" for=\"target_disk\">' + _('Destination hard disk') + '</label>',\n            '                    <div class=\"cbi-value-field\">',\n            '                        <select class=\"cbi-input-select\" id=\"target_disk\" name=\"target_disk\">',\n            '                            <option value=\"\">' + _('Loading devices...') + '</option>',\n            '                        </select>',\n            '                        <div class=\"cbi-value-description\">' + _('Select the hard disk device to operate') + '</div>',\n            '                    </div>',\n            '                </div>',\n            '                <div class=\"cbi-value\">',\n            '                    <label class=\"cbi-value-title\" for=\"keep_config\">' + _('Keep configuration') + '</label>',\n            '                    <div class=\"cbi-value-field\">',\n            '                        <input type=\"checkbox\" class=\"cbi-input-checkbox\" id=\"keep_config\" name=\"keep_config\" value=\"1\" />',\n            '                        <label for=\"keep_config\">' + _('Tick means to retain the settings') + '</label>',\n            '                    </div>',\n            '                </div>',\n            '                <div class=\"cbi-value\">',\n            '                    <label class=\"cbi-value-title\" for=\"format_type\">' + _('Format system type') + '</label>',\n            '                    <div class=\"cbi-value-field\">',\n            '                        <select class=\"cbi-input-select\" id=\"format_type\" name=\"format_type\">',\n            '                            <option value=\"0\">' + _('No formatting required') + '</option>',\n            '                            <option value=\"ext4\">' + _('Linux system partition(EXT4)') + '</option>',\n            '                            <option value=\"btrfs\">' + _('Large capacity storage devices(Btrfs)') + '</option>',\n            '                            <option value=\"ntfs\">' + _('Windows system partition(NTFS)') + '</option>',\n            '                        </select>',\n            '                    </div>',\n            '                </div>',\n            '                <div class=\"cbi-value cbi-value-last\">',\n            '                    <label class=\"cbi-value-title\">' + _('Perform operation') + '</label>',\n            '                    <div class=\"cbi-value-field\">',\n            '                        <button type=\"button\" class=\"cbi-button cbi-button-apply\" id=\"execute-btn\">',\n            '                            ' + _('Click to execute') + '',\n            '                        </button>',\n            '                    </div>',\n            '                </div>',\n            '            </form>',\n            '        </div>',\n            '        <div class=\"state state-executing\">',\n            '            <div class=\"cbi-value\">',\n            '                <label class=\"cbi-value-title\" id=\"execute_status\">' + _('Starting operation...') + '</label>',\n            '                <div class=\"cbi-value-field\">',\n            '                    <div class=\"progress-container\">',\n            '                        <div id=\"progress-bar\" class=\"progress-bar\" style=\"width: 0%\"></div>',\n            '                        <div id=\"progress-text\" class=\"progress-text\">0%</div>',\n            '                    </div>',\n            '                </div>',\n            '            </div>',\n            '        </div>',\n            '    </div>',\n            '    <div id=\"log-section\" style=\"display: block; margin-top: 20px;\">',\n            '        <div class=\"cbi-value\">',\n            '            <label class=\"cbi-value-title\">' + _('Operation Log') + '</label>',\n            '            <div class=\"cbi-value-field\">',\n            '                <textarea id=\"log-view\" class=\"log-view\" readonly=\"readonly\" rows=\"15\"></textarea>',\n            '            </div>',\n            '        </div>',\n            '    </div>',\n            '</div>'\n        ];\n        container.innerHTML = htmlParts.join('');\n\n        var self = this;\n        \n        var uci = self.uci || window.uci;\n        setTimeout(function() {\n            self.initDOM();\n            self.bindEvents();\n            self.loadDevices();\n            self.loadSavedConfig();\n            self.checkOperationStatus();\n            self.loadExistingLog();\n        }, 100);\n\n        return container;\n    },\n\n    initDOM: function() {\n        this.dom = {\n            stateContainer: document.querySelector('#state-container'),\n            targetFunction: document.querySelector('#target_function'),\n            targetDisk: document.querySelector('#target_disk'),\n            keepConfig: document.querySelector('#keep_config'),\n            formatType: document.querySelector('#format_type'),\n            executeBtn: document.querySelector('#execute-btn'),\n            logView: document.querySelector('#log-view'),\n            progressBar: document.querySelector('#progress-bar'),\n            progressText: document.querySelector('#progress-text'),\n            executeStatus: document.querySelector('#execute_status')\n        };\n        \n        this.logPosition = '0';\n        this.logPolling = null;\n        this.isRunning = false;\n        this.operationComplete = false;\n        this.pollErrorCount = 0;\n        this.pollingStartTime = 0;\n        this.lastPollTime = 0;\n        this.currentProgress = 0;\n        this.autoSaveTimer = null;\n        this.isNewOperation = false; // 标记是否是新操作\n    },\n\n    bindEvents: function() {\n        var self = this;\n        if (this.dom.executeBtn) {\n            this.dom.executeBtn.addEventListener('click', function(e) {\n                e.preventDefault();\n                self.executeOperation();\n            });\n        }\n        \n        [this.dom.targetFunction, this.dom.targetDisk, this.dom.formatType].forEach(function(element) {\n            if (element) {\n                element.addEventListener('change', function() {\n                    self.autoSaveConfig();\n                    self.updateFormVisibility();\n                });\n            }\n        });\n        \n        if (this.dom.keepConfig) {\n            this.dom.keepConfig.addEventListener('click', function() {\n                self.autoSaveConfig();\n            });\n        }\n        \n        if (this.dom.targetFunction) {\n            this.updateFormVisibility();\n        }\n    },\n    \nloadDevices: function() {\n    var self = this;\n    \n    if (self.dom.targetDisk) {\n        var loadingOption = document.createElement('option');\n        loadingOption.value = '';\n        loadingOption.textContent = _('Loading devices...');\n        loadingOption.disabled = true;\n        loadingOption.selected = true;\n        self.dom.targetDisk.innerHTML = '';\n        self.dom.targetDisk.appendChild(loadingOption);\n    }\n    function loadDevicesWithRetry(retryCount = 0) {\n        callPartExpGetDevices().then(function(response) {\n            if (!response) {\n                throw new Error('Empty response');\n            }\n            if (self.dom.targetDisk) {\n                self.dom.targetDisk.innerHTML = '';\n                if (response.devices && response.devices.length > 0) {\n                    response.devices.forEach(function(device) {\n                        var option = document.createElement('option');\n                        option.value = device.name;\n                        option.textContent = device.name + ' (' + device.dev + ', ' + device.size + ' MB)';\n                        self.dom.targetDisk.appendChild(option);\n                    });\n                } else {\n\t\t\n                    var noDeviceOption = document.createElement('option');\n                    noDeviceOption.value = '';\n                    noDeviceOption.textContent = _('no find device');\n                    noDeviceOption.disabled = true;\n                    noDeviceOption.selected = true;\n                    self.dom.targetDisk.appendChild(noDeviceOption);\n                }\n            }\n        }).catch(function(error) {\n            console.error('Failed to load devices:', error);\n            \n            if (retryCount < 3) {\n                setTimeout(function() {\n                    loadDevicesWithRetry(retryCount + 1);\n                }, 1000 * (retryCount + 1));\n            } else {\n                if (self.dom.targetDisk) {\n                    self.dom.targetDisk.innerHTML = '';\n                    var errorOption = document.createElement('option');\n                    errorOption.value = '';\n                    errorOption.textContent = _('load error');\n                    errorOption.disabled = true;\n                    errorOption.selected = true;\n                    self.dom.targetDisk.appendChild(errorOption);\n                }\n                \n                ui.addNotification({\n                    title: _('load device error'),\n                    text: _('Failed to load devices:'),\n                    type: 'error',\n                    delay: 5000\n                });\n            }\n        });\n    }\n\n    loadDevicesWithRetry();\n},\n\n\n    loadExistingLog: function() {\n        var self = this;\n        \n        callPartExpGetLog('0').then(function(response) {\n            if (response && response.log) {\n                var logContent = response.log.toString().trim();\n                if (logContent && self.dom.logView) {\n                    self.dom.logView.value = logContent;\n                    \n                    setTimeout(function() {\n                        if (self.dom.logView && self.dom.logView.value) {\n                            self.dom.logView.scrollTop = self.dom.logView.scrollHeight;\n                        }\n                    }, 100);\n                    \n                    if (response.position) {\n                        self.logPosition = response.position;\n                    }\n                    if (!self.isRunning && logContent.includes('正在执行') && !logContent.includes('操作完成')) {\n                        self.isRunning = true;\n                        self.switchState('executing');\n                        self.startLogPolling();\n                    }\n                }\n            }\n        }).catch(function(error) {\n            console.error('Failed to load existing log:', error);\n        });\n    },\n\n    loadSavedConfig: function() {\n        var self = this;\n        \n        return fs.read('/etc/config/partexp').then(function(content) {\n            if (!content) {\n                self.setDefaultConfig();\n                return;\n            }\n            \n            var lines = content.split('\\n');\n            var config = {};\n            \n            lines.forEach(function(line) {\n                line = line.trim();\n                if (line.startsWith('option')) {\n                    var parts = line.split(/\\s+/);\n                    if (parts.length >= 3) {\n                        var key = parts[1];\n                        var value = parts.slice(2).join(' ').replace(/^['\"]|['\"]$/g, '');\n                        config[key] = value;\n                    }\n                }\n            });\n            \n            if (self.dom.targetFunction) {\n                self.dom.targetFunction.value = config.target_function || '/opt';\n            }\n            if (self.dom.targetDisk && config.target_disk) {\n                setTimeout(function() {\n                    if (self.dom.targetDisk) {\n                        self.dom.targetDisk.value = config.target_disk;\n                    }\n                }, 500);\n            }\n            if (self.dom.keepConfig) {\n                self.dom.keepConfig.checked = (config.keep_config === '1');\n            }\n            if (self.dom.formatType) {\n                self.dom.formatType.value = config.format_type || '0';\n            }\n            \n            self.configCache = config;\n            \n            self.updateFormVisibility();\n            \n        }).catch(function(error) {\n            console.log('Failed to load config:', error);\n            self.setDefaultConfig();\n        });\n    },\n\n    setDefaultConfig: function() {\n        if (this.dom.targetFunction) {\n            this.dom.targetFunction.value = '/opt';\n        }\n        if (this.dom.formatType) {\n            this.dom.formatType.value = '0';\n        }\n        if (this.dom.keepConfig) {\n            this.dom.keepConfig.checked = false;\n        }\n        this.updateFormVisibility();\n        \n        this.configCache = {\n            target_function: '/opt',\n            target_disk: '',\n            keep_config: '0',\n            format_type: '0'\n        };\n    },\n\n    autoSaveConfig: function() {\n        var self = this;\n        \n        if (this.autoSaveTimer) {\n            clearTimeout(this.autoSaveTimer);\n        }\n        this.autoSaveTimer = setTimeout(function() {\n            self.saveCurrentConfig();\n        }, 1500);\n    },\n\n    saveCurrentConfig: function() {\n        var self = this;\n        \n        var targetFunction = this.dom.targetFunction ? this.dom.targetFunction.value : '/opt';\n        var targetDisk = this.dom.targetDisk ? this.dom.targetDisk.value : '';\n        var keepConfig = this.dom.keepConfig ? this.dom.keepConfig.checked : false;\n        var formatType = this.dom.formatType ? this.dom.formatType.value : '0';\n        if (callPartExpSaveConfig) {\n            return callPartExpSaveConfig(\n                targetFunction,\n                targetDisk,\n                keepConfig ? '1' : '0',\n                formatType\n            ).then(function(response) {\n                if (response && response.success) {\n\n                    self.configCache = {\n                        target_function: targetFunction,\n                        target_disk: targetDisk,\n                        keep_config: keepConfig ? '1' : '0',\n                        format_type: formatType\n                    };\n                    \n                    return true;\n                } else {\n                    console.warn('RPC save failed, falling back to file write');\n                    return self.saveConfigToFile(targetFunction, targetDisk, keepConfig, formatType);\n                }\n            }).catch(function(error) {\n                console.error('RPC save config error:', error);\n                return self.saveConfigToFile(targetFunction, targetDisk, keepConfig, formatType);\n            });\n        } else {\n            return self.saveConfigToFile(targetFunction, targetDisk, keepConfig, formatType);\n        }\n    },\n\n    saveConfigToFile: function(targetFunction, targetDisk, keepConfig, formatType) {\n        var configContent = [\n            '# Auto-generated by partexp',\n            '',\n            'config global global',\n            \"\\toption target_function '\" + targetFunction + \"'\",\n            \"\\toption target_disk '\" + targetDisk + \"'\",\n            \"\\toption keep_config '\" + (keepConfig ? '1' : '0') + \"'\",\n            \"\\toption format_type '\" + formatType + \"'\",\n            ''\n        ].join('\\n');\n        \n        return fs.write('/etc/config/partexp', configContent).then(function() {\n            console.log('Settings saved to file /etc/config/partexp');\n            return true;\n        }).catch(function(error) {\n            console.error('Failed to save settings to file:', error);\n            return false;\n        });\n    },\n\n    executeOperation: function() {\n        var self = this;\n        \n        this.saveCurrentConfig();\n        var target_function = this.dom.targetFunction.value;\n        var target_disk = this.dom.targetDisk.value;\n        \n        if (target_function !== '/' && (!target_disk || target_disk.trim() === '')) {\n            alert(_('Please select a target disk'));\n            return;\n        }\n        \n        var confirmMessage = _('Are you sure you want to execute partition expansion?') + '\\n\\n' +\n                           _('Function:') + ' ' + this.getFunctionDescription(target_function) + '\\n' +\n                           (target_function !== '/' ? _('Disk:') + ' ' + target_disk + '\\n' : '') +\n                           (target_function === '/' || target_function === '/overlay' ? \n                            _('Keep config:') + ' ' + (this.dom.keepConfig.checked ? _('Yes') : _('No')) + '\\n' : '') +\n                           (target_function === '/opt' || target_function === '/dev' ? \n                            _('Format type:') + ' ' + this.getFormatTypeDescription(this.dom.formatType.value) + '\\n' : '') +\n                           '\\n' + _('This operation may take several minutes.');\n        \n        if (!confirm(confirmMessage)) {\n            return;\n        }\n        \n        this.resetOperationState();\n        \n        this.isNewOperation = true;\n        \n        if (this.dom.logView) {\n            this.dom.logView.value = _('正在启动操作...');\n        }\n        \n        if (this.dom.executeBtn) {\n            this.dom.executeBtn.disabled = true;\n            this.dom.executeBtn.textContent = _('Executing...');\n        }\n        \n        this.switchState('executing');\n        \n        this.updateProgress(5, _('Starting operation...'));\n        \n        callPartExpAutopart()\n            .then(function(response) {\n                if (response && response.success) {\n                    self.isRunning = true;\n                    self.operationComplete = false;\n                    self.startLogPolling();\n                    \n                    if (self.dom.executeStatus) {\n                        self.dom.executeStatus.textContent = _('Operation started successfully');\n                    }\n                } else {\n                    var errorMsg = response && response.message ? response.message : _('Operation failed');\n                    self.handleOperationError(errorMsg);\n                }\n            })\n            .catch(function(error) {\n                console.error('Operation failed:', error);\n                self.handleOperationError(_('Failed to start operation:') + ' ' + (error.message || _('Unknown error')));\n            });\n    },\n\n    resetOperationState: function() {\n        this.logPosition = '0';\n        this.isRunning = true;\n        this.operationComplete = false;\n        this.pollErrorCount = 0;\n        this.pollingStartTime = Date.now();\n        this.lastPollTime = 0;\n        this.currentProgress = 0;\n        \n        this.updateProgress(0, _('Starting operation...'));\n    },\n\n    handleOperationError: function(errorMsg) {\n        alert(errorMsg);\n        if (this.dom.executeBtn) {\n            this.dom.executeBtn.disabled = false;\n            this.dom.executeBtn.textContent = _('Click to execute');\n        }\n        \n        this.switchState('ready');\n        this.stopLogPolling();\n        \n        if (this.dom.logView) {\n            var currentLog = this.dom.logView.value || '';\n            this.dom.logView.value = currentLog + '\\n\\n' + _('操作失败:') + ' ' + errorMsg;\n            setTimeout(() => {\n                if (this.dom.logView) {\n                    this.dom.logView.scrollTop = this.dom.logView.scrollHeight;\n                }\n            }, 100);\n        }\n    },\n\n    updateFormVisibility: function() {\n        if (!this.dom.targetFunction || !this.dom.targetDisk || \n            !this.dom.keepConfig || !this.dom.formatType) return;\n        \n        var func = this.dom.targetFunction.value;\n        var diskDiv = this.dom.targetDisk.closest('.cbi-value');\n        var keepDiv = this.dom.keepConfig.closest('.cbi-value');\n        var formatDiv = this.dom.formatType.closest('.cbi-value');\n        \n        if (!diskDiv || !keepDiv || !formatDiv) return;\n        \n        if (func === '/') {\n            diskDiv.style.display = 'none';\n            formatDiv.style.display = 'none';\n            keepDiv.style.display = 'block';\n        } else if (func === '/overlay') {\n            diskDiv.style.display = 'block';\n            formatDiv.style.display = 'none';\n            keepDiv.style.display = 'block';\n        } else {\n            diskDiv.style.display = 'block';\n            formatDiv.style.display = 'block';\n            keepDiv.style.display = 'none';\n        }\n    },\n\n    checkOperationStatus: function() {\n        var self = this;\n        \n        callPartExpGetStatus().then(function(response) {\n            if (response && response.running) {\n                self.isRunning = true;\n                self.switchState('executing');\n                self.startLogPolling();\n                \n                if (self.dom.executeBtn) {\n                    self.dom.executeBtn.disabled = true;\n                    self.dom.executeBtn.textContent = _('Operation in progress...');\n                }\n                \n                if (self.dom.executeStatus) {\n                    self.dom.executeStatus.textContent = _('Operation in progress...');\n                }\n            }\n        }).catch(function(error) {\n            console.error('Failed to check operation status:', error);\n        });\n    },\n\n    startLogPolling: function() {\n        var self = this;\n        \n        this.stopLogPolling();\n        \n        this.pollErrorCount = 0;\n        this.pollingStartTime = Date.now();\n        this.lastPollTime = 0;\n        \n        this.updateProgress(10, _('Operation in progress...'));\n        \n        this.logPolling = setInterval(function() {\n            if (Date.now() - self.pollingStartTime > 20 * 60 * 1000) {\n                console.error('Operation timeout');\n                self.stopLogPolling();\n                self.isRunning = false;\n                \n                if (self.dom.logView) {\n                    var currentLog = self.dom.logView.value || '';\n                    self.dom.logView.value = currentLog + '\\n\\n[超时] 操作超过20分钟未完成，请检查系统';\n                    setTimeout(() => {\n                        if (self.dom.logView) {\n                            self.dom.logView.scrollTop = self.dom.logView.scrollHeight;\n                        }\n                    }, 100);\n                }\n                \n                self.switchState('ready');\n                \n                if (self.dom.executeBtn) {\n                    self.dom.executeBtn.disabled = false;\n                    self.dom.executeBtn.textContent = _('Click to execute');\n                }\n                return;\n            }\n            \n            self.pollLog();\n        }, 3000); // 每3秒轮询一次，减少频率\n    },\n\n    pollLog: function() {\n        var self = this;\n        \n        if (!this.isRunning) {\n            this.stopLogPolling();\n            return;\n        }\n        \n        var pollStartTime = Date.now();\n        \n        callPartExpGetLog('0').then(function(response) {\n            if (!response) {\n                console.error('No response from log polling');\n                return;\n            }\n            \n            if (pollStartTime < self.lastPollTime) {\n                return;\n            }\n            \n            self.lastPollTime = pollStartTime;\n            \n            if (response.log !== undefined) {\n                var logContent = response.log.toString().trim();\n                \n                if (response.position) {\n                    self.logPosition = response.position;\n                }\n                \n                if (self.dom.logView) {\n                    if (logContent !== '') {\n                        self.dom.logView.value = logContent;\n                        \n                        setTimeout(function() {\n                            if (self.dom.logView && self.dom.logView.value) {\n                                self.dom.logView.scrollTop = self.dom.logView.scrollHeight;\n                            }\n                        }, 50);\n                    }\n                }\n                \n                self.parseAndUpdateProgress(logContent);\n                \n                if (self.checkOperationComplete(logContent)) {\n                    self.handleOperationComplete();\n                }\n            }\n            \n            if (response.complete) {\n                self.handleOperationComplete();\n            }\n            \n            self.pollErrorCount = 0;\n            \n        }).catch(function(error) {\n            console.error('Log polling error:', error);\n            \n            self.pollErrorCount = (self.pollErrorCount || 0) + 1;\n            if (self.pollErrorCount > 5) {\n                console.error('Too many polling errors, stopping');\n                self.stopLogPolling();\n                self.isRunning = false;\n                self.switchState('ready');\n                \n                if (self.dom.executeBtn) {\n                    self.dom.executeBtn.disabled = false;\n                    self.dom.executeBtn.textContent = _('Click to execute');\n                }\n                if (self.dom.logView) {\n                    var currentLog = self.dom.logView.value || '';\n                    self.dom.logView.value = currentLog + '\\n\\n[错误] 日志轮询失败，请刷新页面查看最新状态';\n                    setTimeout(() => {\n                        if (self.dom.logView) {\n                            self.dom.logView.scrollTop = self.dom.logView.scrollHeight;\n                        }\n                    }, 100);\n                }\n            }\n        });\n    },\n\n    checkOperationComplete: function(logText) {\n        if (!logText) return false;\n        \n        var completeMarkers = [\n            '重启设备',\n            '操作完成'\n        ];\n        \n        for (var i = 0; i < completeMarkers.length; i++) {\n            if (logText.includes(completeMarkers[i])) {\n                return true;\n            }\n        }\n        \n        return false;\n    },\n\n    handleOperationComplete: function() {\n        if (this.operationComplete) {\n            return;\n        }\n        \n        this.operationComplete = true;\n        this.isRunning = false;\n        this.isNewOperation = false;\n        \n        this.stopLogPolling();\n        if (this.dom.logView) {\n            var currentLog = this.dom.logView.value || '';\n            if (!currentLog.includes('操作完成')) {\n                this.dom.logView.value = currentLog;\n                setTimeout(() => {\n                    if (this.dom.logView) {\n                        this.dom.logView.scrollTop = this.dom.logView.scrollHeight;\n                    }\n                }, 100);\n            }\n        }\n        \n        this.updateProgress(100, _('Operation completed'));\n        \n        setTimeout(() => {\n            if (this.dom.executeBtn) {\n                this.dom.executeBtn.disabled = false;\n                this.dom.executeBtn.textContent = _('Click to execute');\n            }\n            \n            setTimeout(() => {\n                this.switchState('ready');\n            }, 3000);\n        }, 2000);\n    },\n\n    parseAndUpdateProgress: function(logText) {\n        if (!logText || !this.dom.executeStatus) return;\n        \n        var percent = 0;\n        var statusMessage = _('Operation in progress...');\n        \n        if (logText.includes('100%') || logText.includes('操作完成') || logText.includes('扩容成功')) {\n            percent = 100;\n            statusMessage = _('Operation completed');\n        } else if ( logText.includes('错误') || logText.includes('error')) {\n            return;\n        } else if (logText.includes('分区扩容和挂载到') || logText.includes('正在挂载')) {\n            percent = 90;\n            statusMessage = _('Getting device information');\n        } else if (logText.includes('检测设备')) {\n            percent = 60;\n            statusMessage = _('Checking partition format');\n        } else if (logText.includes('开始检测目标')) {\n            percent = 50;\n            statusMessage = _('Checking target device');\n        } else if (logText.includes('定位到操作目标设备分区')) {\n            percent = 40;\n            statusMessage = _('Locating target partition');\n        } else if (logText.includes('目标盘') && logText.includes('有剩余空间')) {\n            percent = 30;\n            statusMessage = _('Checking free space');\n        } else if (logText.includes('操作功能')) {\n            percent = 20;\n            statusMessage = _('Starting operation');\n        } else if (logText.includes('开始执行') || logText.includes('Starting')) {\n            percent = 10;\n            statusMessage = _('Initializing...');\n        }\n        \n        if (percent > 0) {\n            this.currentProgress = Math.max(this.currentProgress || 0, percent);\n        } else {\n            this.currentProgress = Math.min(90, (this.currentProgress || 0) + 1);\n        }\n        \n        this.updateProgress(this.currentProgress, statusMessage);\n    },\n\n    updateProgress: function(percent, message) {\n        if (!this.dom.progressBar || !this.dom.progressText || !this.dom.executeStatus) {\n            return;\n        }\n        \n        percent = Math.max(0, Math.min(100, percent));\n        \n        this.dom.progressBar.style.width = percent + '%';\n        \n        this.dom.progressText.textContent = percent + '%';\n        \n        this.dom.executeStatus.textContent = message;\n    },\n\n    stopLogPolling: function() {\n        if (this.logPolling) {\n            clearInterval(this.logPolling);\n            this.logPolling = null;\n        }\n    },\n\n    // 切换状态\n    switchState: function(to) {\n        if (!this.dom.stateContainer) return;\n        \n        this.dom.stateContainer.classList.remove(\n            'state-ctl-ready',\n            'state-ctl-executing'\n        );\n        \n        this.dom.stateContainer.classList.add('state-ctl-' + to);\n    },\n\n    getFunctionDescription: function(func) {\n        switch(func) {\n            case '/': return _('Extend to root directory');\n            case '/overlay': return _('Expand overlay');\n            case '/opt': return _('Docker data disk');\n            case '/dev': return _('Normal mount');\n            default: return func;\n        }\n    },\n\n    getFormatTypeDescription: function(type) {\n        switch(type) {\n            case '0': return _('No formatting');\n            case 'ext4': return _('EXT4');\n            case 'btrfs': return _('Btrfs');\n            case 'ntfs': return _('NTFS');\n            default: return type;\n        }\n    },\n\n    handleSaveApply: null,\n    handleSave: null,\n    handleReset: null\n});"
  },
  {
    "path": "luci-app-partexp/po/templates/partexp.po",
    "content": "# Translation file for partexp.js\n# Copyright (C) 2022-2025 Sirpdboy <herboy2008@gmail.com>\n# Licensed to the public under the Apache License 2.0\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: partexp\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"Last-Translator: \\n\"\n\"Language-Team: Chinese (Simplified)\\n\"\n\"Language: zh_Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Generated from partexp.js\\n\"\n\n#: JavaScript UI strings\n\nmsgid \"One click partition expansion mounting tool\"\nmsgstr \"\"  \n\nmsgid \"Automatically format and mount the target device partition. If there are multiple partitions, it is recommended to manually delete all partitions before using this tool.\"\nmsgstr \"\"  \n\nmsgid \"For specific usage, see:\"\nmsgstr \"\"  \n\nmsgid \"Select function\"\nmsgstr \"\"  \n\nmsgid \"Used to extend to the root directory of EXT4 firmware(Ext4 /)\"\nmsgstr \"\"  \n\nmsgid \"Expand application space overlay (/overlay)\"\nmsgstr \"\"  \n\nmsgid \"Used as Docker data disk (/opt)\"\nmsgstr \"\"  \n\nmsgid \"Normal mount and use by device name(/mnt/x1)\"\nmsgstr \"\"  \n\nmsgid \"Select the function to be performed\"\nmsgstr \"\"  \n\nmsgid \"Destination hard disk\"\nmsgstr \"\"  \n\nmsgid \"Loading devices...\"\nmsgstr \"\"  \n\nmsgid \"Select the hard disk device to operate\"\nmsgstr \"\"  \n\nmsgid \"Keep configuration\"\nmsgstr \"\"  \n\nmsgid \"Tick means to retain the settings\"\nmsgstr \"\"  \n\nmsgid \"Format system type\"\nmsgstr \"\"  \n\nmsgid \"No formatting required\"\nmsgstr \"\"  \n\nmsgid \"Linux system partition(EXT4)\"\nmsgstr \"\"  \n\nmsgid \"Large capacity storage devices(Btrfs)\"\nmsgstr \"\"  \n\nmsgid \"Windows system partition(NTFS)\"\nmsgstr \"\"  \n\nmsgid \"Perform operation\"\nmsgstr \"\"  \n\nmsgid \"Click to execute\"\nmsgstr \"\"  \n\nmsgid \"Starting operation...\"\nmsgstr \"\"  \n\nmsgid \"Operation Log\"\nmsgstr \"\"  \n\nmsgid \"Are you sure you want to execute partition expansion?\"\nmsgstr \"\"  \n\nmsgid \"Function:\"\nmsgstr \"\"  \n\nmsgid \"Disk:\"\nmsgstr \"\"  \n\nmsgid \"Keep config:\"\nmsgstr \"\"  \n\nmsgid \"Format type:\"\nmsgstr \"\"  \n\nmsgid \"This operation may take several minutes.\"\nmsgstr \"\"  \n\nmsgid \"Executing...\"\nmsgstr \"\"  \n\nmsgid \"Operation started successfully\"\nmsgstr \"\"  \n\nmsgid \"Operation failed\"\nmsgstr \"\"  \n\nmsgid \"Failed to start operation:\"\nmsgstr \"\"  \n\nmsgid \"Unknown error\"\nmsgstr \"\"  \n\nmsgid \"Operation in progress...\"\nmsgstr \"\"  \n\nmsgid \"Operation in progress...\"\nmsgstr \"\"  \n\nmsgid \"Operation in progress...\"\nmsgstr \"\"  \n\nmsgid \"Extend to root directory\"\nmsgstr \"\"  \n\nmsgid \"Expand overlay\"\nmsgstr \"\"  \n\nmsgid \"Docker data disk\"\nmsgstr \"\"  \n\nmsgid \"Normal mount\"\nmsgstr \"\"  \n\nmsgid \"No formatting\"\nmsgstr \"\"  \n\nmsgid \"Operation completed\"\nmsgstr \"\"  \n\nmsgid \"Getting device information\"\nmsgstr \"\"  \n\nmsgid \"Checking partition format\"\nmsgstr \"\"  \n\nmsgid \"Checking target device\"\nmsgstr \"\"  \n\nmsgid \"Locating target partition\"\nmsgstr \"\"  \n\nmsgid \"Checking free space\"\nmsgstr \"\"  \n\nmsgid \"Starting operation\"\nmsgstr \"\"  \n\nmsgid \"Initializing...\"\nmsgstr \"\"  \n\nmsgid \"Starting\"\nmsgstr \"\"  \n\n#: Device status messages\nmsgid \"Loading device list...\"\nmsgstr \"\"  \n\nmsgid \"No devices found\"\nmsgstr \"\"  \n\nmsgid \"Failed to load devices\"\nmsgstr \"\"  \n\nmsgid \"Please select a target disk\"\nmsgstr \"\"  \n\nmsgid \"Settings saved\"\nmsgstr \"\"  \n\nmsgid \"Failed to save settings\"\nmsgstr \"\"  \n\nmsgid \"Loading saved configuration...\"\nmsgstr \"\"  \n\nmsgid \"Configuration loaded\"\nmsgstr \"\"  \n\nmsgid \"Failed to load configuration\"\nmsgstr \"\"  "
  },
  {
    "path": "luci-app-partexp/po/zh_Hans/partexp.po",
    "content": "# Translation file for partexp.js\n# Copyright (C) 2022-2025 Sirpdboy <herboy2008@gmail.com>\n# Licensed to the public under the Apache License 2.0\n#\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: partexp\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"Last-Translator: \\n\"\n\"Language-Team: Chinese (Simplified)\\n\"\n\"Language: zh_Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Generated from partexp.js\\n\"\n\n#: JavaScript UI strings\n\nmsgid \"One click partition expansion mounting tool\"\nmsgstr \"一键分区扩容挂载工具\"\n\nmsgid \"Partition Expansion\"\nmsgstr \"分区扩容\"\n\nmsgid \"Automatically format and mount the target device partition. If there are multiple partitions, it is recommended to manually delete all partitions before using this tool.\"\nmsgstr \"自动格式化并挂载目标设备分区。如果有多个分区，建议在使用此工具前手动删除所有分区。\"\n\nmsgid \"For specific usage, see:\"\nmsgstr \"具体用法请参见：\"\n\nmsgid \"Select function\"\nmsgstr \"选择功能\"\n\nmsgid \"Used to extend to the root directory of EXT4 firmware(Ext4 /)\"\nmsgstr \"用于扩展到EXT4固件的根目录(Ext4 /)\"\n\nmsgid \"Expand application space overlay (/overlay)\"\nmsgstr \"扩展应用空间overlay (/overlay)\"\n\nmsgid \"Used as Docker data disk (/opt)\"\nmsgstr \"用作Docker数据盘 (/opt)\"\n\nmsgid \"Normal mount and use by device name(/mnt/x1)\"\nmsgstr \"普通挂载并按设备名称使用(/mnt/x1)\"\n\nmsgid \"Select the function to be performed\"\nmsgstr \"选择要执行的功能\"\n\nmsgid \"Destination hard disk\"\nmsgstr \"目标硬盘\"\n\nmsgid \"Loading devices...\"\nmsgstr \"正在加载设备...\"\n\nmsgid \"Select the hard disk device to operate\"\nmsgstr \"选择要操作的硬盘设备\"\n\nmsgid \"Keep configuration\"\nmsgstr \"保留配置\"\n\nmsgid \"Tick means to retain the settings\"\nmsgstr \"勾选表示保留设置\"\n\nmsgid \"Format system type\"\nmsgstr \"格式化系统类型\"\n\nmsgid \"No formatting required\"\nmsgstr \"无需格式化\"\n\nmsgid \"Linux system partition(EXT4)\"\nmsgstr \"Linux系统分区(EXT4)\"\n\nmsgid \"Large capacity storage devices(Btrfs)\"\nmsgstr \"大容量存储设备(Btrfs)\"\n\nmsgid \"Windows system partition(NTFS)\"\nmsgstr \"Windows系统分区(NTFS)\"\n\nmsgid \"Perform operation\"\nmsgstr \"执行操作\"\n\nmsgid \"Click to execute\"\nmsgstr \"点击执行\"\n\nmsgid \"Starting operation...\"\nmsgstr \"正在启动操作...\"\n\nmsgid \"Operation Log\"\nmsgstr \"操作日志\"\n\nmsgid \"Are you sure you want to execute partition expansion?\"\nmsgstr \"确定要执行分区扩容吗？\"\n\nmsgid \"Function:\"\nmsgstr \"功能：\"\n\nmsgid \"Disk:\"\nmsgstr \"磁盘：\"\n\nmsgid \"Keep config:\"\nmsgstr \"保留配置：\"\n\nmsgid \"Format type:\"\nmsgstr \"格式化类型：\"\n\nmsgid \"This operation may take several minutes.\"\nmsgstr \"此操作可能需要几分钟时间。\"\n\nmsgid \"Executing...\"\nmsgstr \"正在执行...\"\n\nmsgid \"Operation started successfully\"\nmsgstr \"操作启动成功\"\n\nmsgid \"Operation failed\"\nmsgstr \"操作失败\"\n\nmsgid \"Failed to start operation:\"\nmsgstr \"启动操作失败：\"\n\nmsgid \"Unknown error\"\nmsgstr \"未知错误\"\n\nmsgid \"Operation in progress...\"\nmsgstr \"操作正在进行中...\"\n\nmsgid \"Operation in progress...\"\nmsgstr \"操作正在进行中...\"\n\nmsgid \"Operation in progress...\"\nmsgstr \"操作正在进行中...\"\n\nmsgid \"Extend to root directory\"\nmsgstr \"扩展到根目录\"\n\nmsgid \"Expand overlay\"\nmsgstr \"扩展overlay\"\n\nmsgid \"Docker data disk\"\nmsgstr \"Docker数据盘\"\n\nmsgid \"Normal mount\"\nmsgstr \"普通挂载\"\n\nmsgid \"No formatting\"\nmsgstr \"不格式化\"\n\nmsgid \"Operation completed\"\nmsgstr \"操作完成\"\n\nmsgid \"Getting device information\"\nmsgstr \"正在获取设备信息\"\n\nmsgid \"Checking partition format\"\nmsgstr \"正在检查分区格式\"\n\nmsgid \"Checking target device\"\nmsgstr \"正在检查目标设备\"\n\nmsgid \"Locating target partition\"\nmsgstr \"正在定位目标分区\"\n\nmsgid \"Checking free space\"\nmsgstr \"正在检查可用空间\"\n\nmsgid \"Starting operation\"\nmsgstr \"正在开始操作\"\n\nmsgid \"Initializing...\"\nmsgstr \"正在初始化...\"\n\nmsgid \"Starting\"\nmsgstr \"开始\"\n\n#: Device status messages\nmsgid \"Loading device list...\"\nmsgstr \"正在加载设备列表...\"\n\nmsgid \"No devices found\"\nmsgstr \"未找到设备\"\n\nmsgid \"Failed to load devices\"\nmsgstr \"加载设备失败\"\n\nmsgid \"Please select a target disk\"\nmsgstr \"请选择目标磁盘\"\n\nmsgid \"Settings saved\"\nmsgstr \"设置已保存\"\n\nmsgid \"Failed to save settings\"\nmsgstr \"保存设置失败\"\n\nmsgid \"Loading saved configuration...\"\nmsgstr \"正在加载保存的配置...\"\n\nmsgid \"Configuration loaded\"\nmsgstr \"配置已加载\"\n\nmsgid \"Failed to load configuration\"\nmsgstr \"加载配置失败\""
  },
  {
    "path": "luci-app-partexp/root/etc/config/partexp",
    "content": "config global 'global'\r\n\toption target_function '/opt'\r\n\toption target_disk ''\r\n\toption keep_config '0'\r\n\toption format_type '0'\r\n"
  },
  {
    "path": "luci-app-partexp/root/etc/uci-defaults/zzz_luci-app-partexp",
    "content": "#!/bin/sh\n\nchmod +x /usr/bin/partexp /usr/libexec/rpcd/partexp\n/etc/init.d/rpcd restart\nrm -f /tmp/luci-indexcache\nexit 0\n"
  },
  {
    "path": "luci-app-partexp/root/usr/bin/partexp",
    "content": "#!/bin/sh\n\n#\n# Copyright (C) 2021-2026  sirpdboy  <herboy2008@gmail.com> https://github.com/sirpdboy/luci-app-partexp\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\nCONFIG=\"partexp\"\nLOCK=/var/lock/$CONFIG.lock\nLOGD=/var/$CONFIG\nLOG=$LOGD/bk$CONFIG.log\n\n[ -d \"$LOGD\" ] || mkdir -p $LOGD\n\n\ninit_env() {\n    [ ! -f \"$LOG\" ] && echo \" \" > $LOG\n}\n\ngen_log() {\n    log \" == 开始执行 == \" | tee -a $LOG\n}\n\nlog(){\n    echo -e \" $(date +'%Y-%m-%d %H:%M:%S') $*\" | tee -a $LOG\n}\n\nlogn(){\n    echo -e \" $*\" | tee -a $LOG\n}\n\nload_uci_config() {\n    if [ -f \"/etc/config/$CONFIG\" ]; then\n        target_function=$(uci -q get $CONFIG.global.target_function)\n        target_disk=$(uci -q get $CONFIG.global.target_disk)\n        keep_config=$(uci -q get $CONFIG.global.keep_config)\n        format_type=$(uci -q get $CONFIG.global.format_type)\n\n        target_function=\"${target_function:-/opt}\"\n        keep_config=\"${keep_config:-0}\"\n        format_type=\"${format_type:-0}\"\n        \n        return 0\n    else\n        log \"警告：配置文件不存在\"\n        return 1\n    fi\n}\n\nis_disk_mounted() {\n    DISK=$1\n    if mount | grep -q \"$DISK \"; then\n        return 0\n    else\n        return 1\n    fi\n}\n\nmount_device() {\n    local DEVICE=$1\n    local MOUNT_POINT=$2\n    local TYPE=$3\n    \n    if [ ! -e \"$DEVICE\" ]; then\n        log \"设备 $DEVICE 不存在\"\n        return 1\n    fi\n\n    if [ ! -d \"$MOUNT_POINT\" ]; then\n        log \"挂载点 $MOUNT_POINT 不存在，正在创建...\"\n        mkdir -p \"$MOUNT_POINT\"\n        if [ $? -ne 0 ]; then\n            log \"无法创建挂载点 $MOUNT_POINT\"\n            return 1\n        fi\n    fi\n\n    if mount | grep -q \"$DEVICE\"; then\n        log \"设备 $DEVICE 已挂载到其他位置\"\n        return 1\n    fi\n\n    if mount | grep -q \"$MOUNT_POINT\"; then\n        log \"挂载点 $MOUNT_POINT 已被其他设备占用\"\n        return 1\n    fi\n\n    log \"正在挂载 $DEVICE 到 $MOUNT_POINT...\"\n    \n    mount $TYPE \"$DEVICE\" \"$MOUNT_POINT\" >/dev/null 2> /dev/null\n    \n    if [ $? -eq 0 ]; then\n        log \"挂载成功: $DEVICE -> $MOUNT_POINT\"\n        return 0\n    else\n        log \"挂载失败: $DEVICE -> $MOUNT_POINT\"\n        return 1\n    fi\n}\n\n# 取消硬盘挂载\numount_disk() {\n    DISK=$1\n    MOUNT=''\n    eval $(block info \"$DISK\" | grep -o -e \"MOUNT=\\S*\")\n    if [ \"$MOUNT\" ]; then\n        umount $DISK 2>/dev/null\n        if [ $? -eq 0 ]; then\n            log \"取消挂载:$DISK成功\"\n        else\n            log \"取消挂载:$DISK失败,请手动操作\"\n        fi\n    else\n        log \"设备/dev/$DISK未挂载\"\n    fi\n}\n\n# 从 block info 中提取指定字段的值\nget_block() {\n    local DISK=$1\n    local TYPE=$2\n    local value\n    value=`mount | grep $DISK |awk -F $TYPE '{print $2}' |awk '{print $1}' | head -1`\n    echo $value\n}\n\n# 检查是否有共享挂载（如 Samba 或 NFS）\ncheck_shared_mount() {\n    DISK=$1\n    if [ -f /etc/config/samba ]; then\n        SHARED=$(grep -q \"/dev/$DISK\" /etc/config/samba)\n        if [ $? -eq 0 ]; then\n            log \"检测到 Samba 共享挂载: /dev/$DISK\"\n            return 0\n        fi\n    fi\n    \n    if [ -f /etc/exports ]; then\n        SHARED=$(grep -q \"/dev/$DISK\" /etc/exports)\n        if [ $? -eq 0 ]; then\n            log \"检测到 NFS 共享挂载: /dev/$DISK\"\n            return 0\n        fi\n    fi\n    return 1\n}\n\nusamba(){\n    s=$1\n    [ -e \"/etc/config/$s\" ] && {\n        msum=$(grep -c \"config sambashare\" /etc/config/$s)\n        for i in $(seq 0 $((msum)));do\n            pdev=`uci -q get $s.@sambashare[$i].path `\n            [ \"$pdev\" = \"$2\" ] && {\n                uci delete $s.@sambashare[$i] \n                uci commit $s\n                log \"分区/dev/$b被挂载$MOUNT共享使用，删除$s共享成功！\"  \n                sleep 5\n            }\n        done\n    }\n    \n    if [ -f /etc/config/$s ]; then\n        sed -i \"/\\/dev\\/$b/d\" /etc/config/$s\n        /etc/init.d/$s restart\n    fi\n    \n    if [ -f /etc/exports ]; then\n        sed -i \"/\\/dev\\/$b/d\" /etc/exports\n        /etc/init.d/nfs restart\n    fi\n}\n\nis_disk_partitioned() {\n    PARTITION_COUNT=$(fdisk -l /dev/$1 2>/dev/null | grep -E \"^/dev/$2\" | wc -l)\n    if [[ \"$PARTITION_COUNT\" -gt 0 ]]; then\n        echo 1 \n    else\n        echo 0 \n    fi\n}\n\npartednew(){\n    DISK=$1\n    parted -s /dev/$DISK mklabel gpt\n    parted -s /dev/$DISK mkpart primary ext4 1MiB -1\n}\n\nfdisknew(){\n    echo -e \"n\\np\\n\\n\\n\\nw\" | fdisk /dev/$1 >/dev/null 2> /dev/null\n}\n\nfdisksave(){\n    echo -e \"n\\w\" | fdisk /dev/$1 >/dev/null 2> /dev/null\n}\n\n# 格式化磁盘函数 DISK=/dev/sda1 ;TYPE=btrfs\nformat_disk() {   \n    local DISK=$1\n    local TYPE=$2\n    [[ $TYPE == '0' || $TYPE == '' ]] && TYPE=\"ext4\"\n    log \"正在格式化 $DISK \"\n    mkfs.$TYPE -F \"$DISK\" >/dev/null 2>/dev/null\n    if [ $? -eq 0 ]; then\n        log \"格式化 $TYPE 成功 $DISK\"\n        return 0\n    else\n        log \"格式化 $TYPE 失败 $DISK\"\n        return 1\n    fi\n}\n\n\n# 获取系统盘\nget_system_disk() {\n    rom_dev=$(df -h | grep boot | awk '{print $1}' | head -1 )\n    [ -z ${rom_dev} ] && rom_dev=`df -P /boot 2>/dev/null | awk 'NR==2 {print $1}'`\n    [ -z ${rom_dev} ] && rom_dev=`blkid -t TYPE=\"squashfs\" |awk -F : '{print $1}'`\n    [ -z ${rom_dev} ] && TDISK=`lsblk -l -o NAME,MOUNTPOINTS | grep -E '/rom'| grep -v '/rom/' | head -1 | awk '{print $1}'` && rom_dev=\"/dev/$TDISK\"\n    if [ -n \"$rom_dev\" ]; then\n        case \"$rom_dev\" in\n            /dev/sd[a-z][0-9]*)\n                disk=$(echo \"$rom_dev\" | sed 's/[0-9]*$//')\n                ;;\n            /dev/nvme[0-9]*n[0-9]*p[0-9]*)\n                disk=$(echo \"$rom_dev\" | sed 's/p[0-9]*$//')\n                ;;\n            /dev/mmcblk[0-9]*p[0-9]*)\n                disk=$(echo \"$rom_dev\" | sed 's/p[0-9]*$//')\n                ;;\n            /dev/vd[a-z][0-9]*)\n                disk=$(echo \"$rom_dev\" | sed 's/[0-9]*$//')\n                ;;\n            /dev/mtdblock*)\n                disk=\"$rom_dev\"\n                ;;\n            /dev/ubiblock*)\n                disk=\"$rom_dev\"\n                ;;\n            /dev/root)\n                # 特殊处理 /dev/root\n                disk=$(lsblk -no PKNAME / 2>/dev/null)\n                if [ -n \"$disk\" ]; then\n                    disk=\"/dev/$disk\"\n                fi\n                ;;\n            *)\n                # 尝试通用匹配\n                if echo \"$rom_dev\" | grep -qE '^/dev/[a-z]+[0-9]+'; then\n                    disk=$(echo \"$rom_dev\" | sed 's/[0-9]*$//')\n                fi\n                ;;\n        esac\n    fi\n    \n    if [ -n \"$disk\" ] && [ ! -b \"$disk\" ]; then\n        disk=\"\"\n    fi\n    \n    echo \"$disk\"\n}\n\nget_all_disks() {\n    DISKS=`find /dev -regex '.*/\\(sd[a-z]\\|mmcblk[0-9]\\+\\|sata[a-z]\\|nvme[0-9]\\+n[0-9]\\+\\|vd[a-z]\\)$'`\n    echo \"$DISKS\"\n}\n\ncheck_part_space() {\n    DISK=$1 \n    info=$(lsblk -no SIZE,FSTYPE,MOUNTPOINT \"$DISK\" | awk '{print $1}')\n    if [ -z \"$info\" ]; then\n        echo \"物理大小: 未知（可能是未格式化的裸分区）\"\n    else\n        echo $info |awk -F '.' '{print $1}' | sed 's/[A-Za-z]//g'\n    fi\n}\n\ncheck_free_space() {\n    DISK=$1 \n    PARTED_OUTPUT=$(parted -s /dev/$DISK unit GB print free 2>/dev/null)\n    FREE_SPACE=$(echo \"$PARTED_OUTPUT\" | awk '/Free Space/ {last=$3} END {print last}' | sed 's/GB$//')\n    echo $FREE_SPACE | cut -d'.' -f1\n}\n\nshow_partition_info() {\n    local partition=\"$1\" \n    if [ ! -e \"$partition\" ]; then\n        logn \"错误：分区 $partition 不存在！\"\n        return 1\n    fi\n    logn \" === 分区信息 [$partition] ===\"\n    local lsblk_info=$(lsblk -no SIZE,FSTYPE,MOUNTPOINT \"$partition\" 2>/dev/null)\n    if [ -z \"$lsblk_info\" ]; then\n        logn \"物理大小: 未知（可能是未格式化的裸分区）\"\n    else\n        local size=$(echo \"$lsblk_info\" | awk '{print $1}')\n        local fstype=$(echo \"$lsblk_info\" | awk '{print $2}')\n        local mountpoint=$(echo \"$lsblk_info\" | awk '{print $3}')\n        logn \"物理大小: $size    文件系统: ${fstype:-未知}  挂载点: ${mountpoint:-未挂载}\"\n    fi\n    if df \"$partition\" &>/dev/null; then\n        local df_info=$(df -h \"$partition\" | tail -n 1  | awk 'NR=2 {print $2,$3,$4,$5}')\n        logn \"[已挂载] 空间使用情况:\"\n        logn \"总容量: $(echo \"$df_info\" | awk '{print $1}')  已用: $(echo \"$df_info\" | awk '{print $2}') 剩余: $(echo \"$df_info\" | awk '{print $3}')    使用率: $(echo \"$df_info\" | awk '{print $4}')\"\n\n    else\n        logn \"[未挂载] 无法查询使用情况（需先挂载）\"\n    fi\n\n    local disk=\"${partition%[0-9]*}\" \n    local part_num=\"${partition##*[!0-9]}\"\n    logn \"分区表信息:\"\n    logn `parted -s \"$disk\" unit MiB print | grep -w \"^ $part_num\" | awk '{print \"起始: \" $2 \" MiB | 结束: \" $3 \" MiB | 类型: \" $5}'`\n    \n}\n\nget_next_partition_number() {\n    DISK=$1\n    PARTITIONS=$(fdisk -l /dev/$DISK 2>/dev/null | grep -v boot | grep -E \"^/dev/$DISK\" | awk '{print $1}' | sed 's/\\/dev\\/[a-z]*//g' | awk -F '[^0-9]+' '{print $NF}')\n    MAX_PARTITION=$(echo \"$PARTITIONS\" | sort -n | tail -n 1)\n    NEXT_PARTITION=$(awk -v n=\"$MAX_PARTITION\" 'BEGIN { print n + 1 }')\n    echo \"$NEXT_PARTITION\"\n}\n\nget_last_partition_number() {\n    DISK=$1\n    PARTITIONS=$(fdisk -l /dev/$DISK 2>/dev/null | grep -v boot | grep -E \"^/dev/$DISK\" | awk '{print $1}' | sed 's/\\/dev\\/[a-z]*//g' | awk -F '[^0-9]+' '{print $NF}')\n    MAX_PARTITION=$(echo \"$PARTITIONS\" | sort -n | tail -n 1)\n    echo \"$MAX_PARTITION\"\n}\n\nget_partition_number() {\n    DISK=$1\n    PARTITIONS=$(fdisk -l /dev/$DISK 2>/dev/null | grep -v boot | grep -E \"^/dev/$DISK\" | awk '{print $1}' | sed 's/\\/dev\\/[a-z]*//g' | wc -l)\n    echo \"$PARTITIONS\"\n}\n\nrootpt_resize() {\n    if [ ! -e /etc/rootpt-resize ]; then\n        log \"--->请稍侯，系统根分区扩展中<---\"\n        ROOTBLK=\"$(readlink -f /sys/dev/block/\"$(awk -e '$9=\"/dev/root\"{print $3}' /proc/self/mountinfo)\")\"\n        ROOTDISK=\"/dev/$(basename \"${ROOTBLK%/}\")\"\n        ROOTPART=\"${ROOTBLK##*[^0-9]}\"\n        partplace=$(fdisk -l 2>/dev/null | grep \"$ROOTDISK\" | awk '{print $5}' )\n        log \"--->根分区$ROOTDISK：$partplace <---\" \n        sleep 3\n        parted -f -s \"${ROOTDISK}\" resizepart \"${ROOTPART}\" 100%\n        mount_root done\n        touch /etc/rootpt-resize\n        sleep 3\n        log \"--->系统根分区扩展成功！<---\" \n        partplace=$(fdisk -l 2>/dev/null | grep \"$ROOTDISK\" | awk '{print $5}' )\n        log \"--->根分区$ROOTDISK扩展后容量：$partplace <---\" \n        log \"--->如果没生效，请重启设备<---\"\n        expquit 2\n    else\n        log \"已经扩展过或者挂载分区过，请删除分区或者重置重新操作或者联系作者sirpdboy！\"\n        expquit 1\n    fi\n}\n\nrootfs_resize() {\n    if [ ! -e /etc/rootfs-resize ] && [ -e /etc/rootpt-resize ]; then\n        log \"--->请稍侯，系统根分区扩展中<---\"\n        ROOTBLK=\"$(readlink -f /sys/dev/block/\"$(awk -e '$9=\"/dev/root\"{print $3}' /proc/self/mountinfo)\")\"\n        ROOTPART=\"${ROOTBLK##*[^0-9]}\"\n        ROOTDISK=\"/dev/$(basename \"${ROOTBLK%/}\")\"\n        partplace=$(fdisk -l 2>/dev/null | grep \"$ROOTDISK\" | awk '{print $5}' )\n        log \"--->根分区$ROOTDISK：$partplace <---\" \n        sleep 3\n        parted -f -s \"${ROOTDISK}\" resizepart \"${ROOTPART}\" 100%\n        mount_root done\n        touch /etc/rootpt-resize\n        sleep 3\n        log \"--->系统根分区扩展成功！<---\" \n        partplace=$(fdisk -l 2>/dev/null | grep \"$ROOTDISK\" | awk '{print $5}' )\n        log \"--->根分区$ROOTDISK扩展后容量：$partplace <---\" \n        log \"--->请稍侯，系统overlay扩展中<---\"\n        df -h /overlay | awk 'NR=2 {printf \" overlay扩展前: 总容量: %s 已用: %s 剩余: %s 使用率: %s\", $2, $3, $4, $5}'\n        LOOPDEV=\"$(awk -e '$5=\"/overlay\"{print $9}' /proc/self/mountinfo)\"\n        if [ -z \"${LOOPDEV}\" ]; then\n            LOOP_DEV=\"$(losetup -f)\"\n            losetup \"${LOOPDEV}\" \"${ROOTDEV}\"\n        fi\n        \n        FSTYPE=$(blkid -o value -s TYPE \"$LOOPDEV\" 2>/dev/null)\n        umount -l /overlay\n        mount -t tmpfs -o size=128M tmpfs /overlay\n        losetup -d /dev/loop0\n        losetup -fP ${ROOTDISK}\n        \n        case \"$FSTYPE\" in\n            f2fs)\n                umount /overlay || { log \"错误：无法卸载 /overlay\"; expquit 1; }\n                fsck.f2fs -f \"$LOOPDEV\" \n                resize.f2fs -f \"$LOOPDEV\" || { log \"错误：f2fs 调整大小失败\"; expquit 1; }\n                ;;\n            ext4)\n                resize2fs -f \"$LOOPDEV\" || { log \"错误：ext4 调整大小失败\"; expquit 1; }\n                ;;\n            *)\n                log \"--->分区格式 $FSTYPE 不识别，overlay 扩展失败！<---\"\n                expquit 1\n                ;;\n        esac\n        \n        mount_root done\n        touch /etc/rootfs-resize\n        sleep 3\n        log \"--->系统overlay扩展成功！<---\" \n        df -h /overlay | awk 'NR=2 {printf \" overlay扩展后: 总容量: %s 已用: %s 剩余: %s 使用率: %s\", $2, $3, $4, $5}'\n        log \"--->如果没生效，请重启设备<---\"\n        expquit 2\n    else\n        log \"已经扩展过或者挂载分区过，请删除分区或者重置重新操作或者联系作者sirpdboy！\"\n        expquit 1\n    fi\n}\n\n\n# 修改 fdiskB 函数，使用环境变量参数\nfdiskB() {\n    a=$1\n    b=$1$2\n    log \"开始检测目标$a信息\"\n    log \"检测/dev/$a是否需要分区和格式化\"\n    \n    block detect > /etc/config/fstab\n    uci -q set fstab.@global[0].anon_mount='0'\n    uci -q set fstab.@global[0].auto_mount='0'\n    uci commit fstab\n    \n    if [ \"$target_function\" = '/opt' ]; then\n        /etc/init.d/dockerd stop >/dev/null 2> /dev/null\n        amount=`mount |grep /opt | awk '{print $1}'`\n        if [ -n \"$amount\" ]; then\n            umount $amount >/dev/null 2> /dev/null\n            log \"取消/opt之前的挂载$amount成功！\"\n        fi\n        for OPT in $(mount |grep /opt | awk '{print $3}');do\n            umount $OPT >/dev/null 2> /dev/null\n            log \"取消/opt之前的挂载$OPT成功！\"\n        done\n    fi\n    \n    [ -d \"/mnt/$b\" ] || mkdir -p /mnt/$b\n    \n    if is_disk_mounted \"/dev/$b\"; then\n        log \"设备 /dev/$b 已挂载，尝试取消挂载...\"\n        if check_shared_mount $b; then\n            usamba samba4 $MOUNT\n            usamba samba $MOUNT\n            sleep 5\n        fi\n        umount_disk \"/dev/$b\" \n        [ $? -ne 0 ] || umount_disk \"/mnt/$b\"\n    else\n        log \"设备/dev/$b未挂载\"\n        isfdisk=0\n        isP=$(is_disk_partitioned $a $b)\n        if [ \"$isP\" = '0' ]; then\n            fdisksave $a  \n            fdisknew $a\n            sleep 2\n            isfdisk=1\n        fi\n        isP=$(is_disk_partitioned $a $b)\n        if [[ \"$isP\" = '1' && \"$isfdisk\" = 1 ]]; then\n            log \"分区$b建立成功！\"\n        elif [[ \"$isP\" = '1' && \"$isfdisk\" = 0 ]]; then\n            log \"检测目标分区$b已存在.\"\n        else\n            log \"分区$b建立失败，请检查$b硬盘空间！\"\n            expquit 1\n        fi\n        sleep 1\n    fi\n    \n    if is_disk_mounted \"/dev/$b\"; then\n        umount /dev/$b >/dev/null 2> /dev/null\n        [ $? -ne 0 ] && block umount /dev/$b >/dev/null 2> /dev/null\n    fi\n    sleep 5\n    if [[ \"$target_function\" = \"/\" || \"$target_function\" = \"/overlay\" ]]; then\n        format_disk \"/dev/$b\" $format_type\n    elif [[ \"$format_type\" != \"0\" || \"$isfdisk\" = \"1\" ]]; then\n        format_disk \"/dev/$b\" $format_type\n    else\n        log \"设备/dev/$b如果未格式化,可能无法正常使用.\"\n    fi\n\n    TYPE=''\n    eval $(blkid \"/dev/$b\" | grep -o -e \"TYPE=\\S*\")\n    log \"检测设备/dev/$b分区$TYPE格式！\"\n\n     sleep 1\n    if [ \"$TYPE\" = \"ntfs\" ]; then\n        if [ `which ntfs-3g` ]; then\n            if is_disk_mounted \"/mnt/$b\"; then\n                mount_device /dev/$b /mnt/$b \"-t ntfs-3g\"\n            fi\n        else \n            if is_disk_mounted \"/mnt/$b\"; then\n                mount_device /dev/$b /mnt/$b \"-t ntfs3\"\n            fi\n        fi\n    else\n        mount /dev/$b /mnt/$b >/dev/null 2> /dev/null\n    fi\n\n     sleep 1\n    UUID=''\n    eval $(block info /dev/$b | grep -o -e \"UUID=\\S*\")\n    if [ ! \"$UUID\" ]; then \n        log \"获取/dev/$b设备UUID信息失败!\"\n        expquit 1\n    else\n        log \"获取/dev/$b设备UUID信息成功!\" \n    fi\n\n     sleep 1\n    case \"$target_function\" in\n        \"/overlay\") \n            if [ \"$keep_config\" = \"1\" ]; then\n                tar -C /overlay -cvf - . | tar -C /mnt/$b/ -xf - || tar -C /rom/overlay -cvf - . | tar -C /mnt/$b/ -xf - \n                umount /dev/$b >/dev/null 2> /dev/null \n                [ $? -ne 0 ] && umount /mnt/$b >/dev/null 2> /dev/null \n                [ $? -ne 0 ] && block umount /dev/$b >/dev/null 2> /dev/null \n                block detect > /etc/config/fstab\n                OVERLAY=`uci -q get fstab.@mount[0].target`\n                if [[ \"$OVERLAY\" = \"/overlay\" || \"$OVERLAY\" = \"/dev/loop0\" ]]; then\n                    uci -q set fstab.@mount[0].uuid=\"${UUID}\"\n                    uci -q set fstab.@mount[0].target='/overlay'\n                    uci -q set fstab.@mount[0].enabled='0'\n                fi\n                msum=$(grep -c \"'mount'\" /etc/config/fstab)\n                for i in $(seq 0 $((msum-1)))\n                do\n                    zuuid=`uci -q get fstab.@mount[$i].uuid`\n                    [ $? -ne 0 ] && break\n                    if [ \"$zuuid\" = \"$UUID\" ]; then\n                        uci -q set fstab.@mount[$i].target=\"/overlay\"\n                        uci -q set fstab.@mount[$i].enabled='1'\n                    fi\n                done\n                uci set fstab.@global[0].delay_root=\"15\"\n                uci commit fstab\n                log \"保留数据overlay扩展/dev/$b成功！\"\n                eval $(block info /dev/$b | grep -o -e \"MOUNT=\\S*\")\n                echo $MOUNT $a> /etc/partexppath\n                log \"扩容成功！可直接【在线升级】扩容升级了！\"\n\t\tshow_partition_info /dev/$b\n                sleep 3\n\n                expquit 2\n            else\n                umount /dev/$b >/dev/null 2> /dev/null \n                [ $? -ne 0 ] && umount /mnt/$b >/dev/null 2> /dev/null \n                [ $? -ne 0 ] && block umount /dev/$b >/dev/null 2> /dev/null \n                block detect > /etc/config/fstab\n                OVERLAY=`uci -q get fstab.@mount[0].target`\n                if [[ \"$OVERLAY\" = \"/overlay\" || \"$OVERLAY\" = \"/dev/loop0\" ]]; then\n                    uci -q set fstab.@mount[0].uuid=\"${UUID}\"\n                    uci -q set fstab.@mount[0].target='/overlay'\n                    uci -q set fstab.@mount[0].enabled='0'\n                fi\n                msum=$(grep -c \"'mount'\" /etc/config/fstab)\n                for i in $(seq 0 $((msum-1)))\n                do\n                    zuuid=`uci -q get fstab.@mount[$i].uuid`\n                    [ $? -ne 0 ] && break\n                    if [ \"$zuuid\" = \"$UUID\" ]; then\n                        uci -q set fstab.@mount[$i].target=\"/overlay\"\n                        uci -q set fstab.@mount[$i].enabled='1'\n                    fi\n                done\n                uci set fstab.@global[0].delay_root=\"15\"\n                uci commit fstab\n                log \"不保留数据overlay扩展/dev/$b成功！\"\n                eval $(block info /dev/$b | grep -o -e \"MOUNT=\\S*\")\n                echo $MOUNT $a> /etc/partexppath\n                log \"扩容成功！可直接【在线升级】扩容升级了！\"\n\t\tshow_partition_info /dev/$b\n                sleep 3\n                expquit 2\n            fi\n            ;;\n        \"/opt\")  \n            umount /dev/$b >/dev/null 2> /dev/null \n            [ $? -ne 0 ] && umount /mnt/$b >/dev/null 2> /dev/null \n            [ $? -ne 0 ] && block umount /dev/$b >/dev/null 2> /dev/null \n            block detect > /etc/config/fstab\n            mkdir -p $target_function\n            msum=$(grep -c \"'mount'\" /etc/config/fstab)\n            mount_device /dev/$b \"$target_function\"\n            for i in $(seq 0 $((msum-1)))\n            do\n                zuuid=`uci -q get fstab.@mount[$i].uuid`\n                [ $? -ne 0 ] && break\n                if [ \"$zuuid\" = \"$UUID\" ]; then\n                    uci -q set fstab.@mount[$i].target=\"$target_function\"\n                    uci -q set fstab.@mount[$i].enabled='1'\n                fi\n            done\n            uci commit fstab\n            if is_disk_mounted \"/opt\"; then\n                log \"/dev/$b分区扩容和挂载到$target_function成功！\"\n                eval $(block info /dev/$b | grep -o -e \"MOUNT=\\S*\")\n                echo $MOUNT $a> /etc/partexppath\n                log \"扩容成功！可直接【在线升级】扩容升级了！\"\n\t\tshow_partition_info /dev/$b\n                expquit 2\n            else\n                log \"/dev/$b分区扩容和挂载到$target_function失败！\" \n            fi\n            ;;\n        \"/\")\n            ROOTBLK=\"$(readlink -f /sys/dev/block/\"$(awk '$9=\"/dev/root\"{print $3}' /proc/self/mountinfo)\")\"\n            [ -z \"$ROOTBLK\" ] && { log \"错误：无法获取根分区块设备\"; expquit 1; }\n            ROOTDISK=\"/dev/$(basename \"${ROOTBLK%/}\")\"\n            FSTYPE=$(blkid -o value -s TYPE \"$ROOTDISK\" 2>/dev/null)\n            if [[ \"$FSTYPE\" != \"squashfs\" && -n \"$FSTYPE\" ]]; then\n                if [ \"$target_function\" = '/' ]; then\n                    FREE_SPACE=$(check_free_space $(basename $DISK))\n                    log \"目标盘 $ROOT_PART $FSTYPE有剩余空间: $FREE_SPACE Gb\"\n                    if [[ \"$FREE_SPACE\" -gt 2 ]]; then\n                        rootpt_resize\n                        expquit 2\n                    else\n                        log \"目标盘 $SYSTEM_DISK $FSTYPE没有足够的剩余空间！\"\n                        expquit 1\n                    fi\n                fi\n                if [ \"$target_function\" = '/overlay' ]; then\n                    FREE_SPACE=$(check_free_space $(basename $DISK))\n                    log \"目标盘 $ROOT_PART $FSTYPE有剩余空间: $FREE_SPACE Gb\"\n                    if [[ \"$FREE_SPACE\" -gt 2 ]]; then\n                        rootfs_resize\n                        eval $(block info /dev/$b | grep -o -e \"MOUNT=\\S*\")\n                        log \"/dev/$b分区扩容和挂载到$target_function成功！\"\n                        echo $MOUNT $a> /etc/partexppath\n                        log \"扩容成功！可直接【在线升级】扩容升级了！\"\n\t\t\tshow_partition_info /dev/$b\n                        expquit 2\n                    else\n                        log \"目标盘 $SYSTEM_DISK $FSTYPE没有足够的剩余空间！\"\n                        expquit 1\n                    fi\n                fi\n            else\n                log \"目标硬盘不支持/根分区扩展！请换EXT4固件！\"\n            fi\n            sleep 3\n            expquit 2\n            ;;\n        *)\n            umount /dev/$b >/dev/null 2> /dev/null \n            [ $? -ne 0 ] && umount /mnt/$b >/dev/null 2> /dev/null \n            [ $? -ne 0 ] && block umount /dev/$b >/dev/null 2> /dev/null \n            block detect > /etc/config/fstab\n            mkdir -p /mnt/$b\n            msum=$(grep -c \"'mount'\" /etc/config/fstab)\n            mount_device /dev/$b /mnt/$b\n            for i in $(seq 0 $((msum-1)))\n            do\n                zuuid=`uci -q get fstab.@mount[$i].uuid`\n                [ $? -ne 0 ] && break\n                if [ \"$zuuid\" = \"$UUID\" ]; then\n                    uci -q set fstab.@mount[$i].target=\"/mnt/$b\"\n                    uci -q set fstab.@mount[$i].enabled='1'\n                fi\n            done\n            uci commit fstab\n            if is_disk_mounted /mnt/$b; then\n                log \"/dev/$b分区扩容和挂载到/mnt/$b成功！\" \n                eval $(block info /dev/$b | grep -o -e \"MOUNT=\\S*\")\n                echo $MOUNT $a> /etc/partexppath\n                log \"扩容成功！可直接【在线升级】扩容升级了！\"\n\t\tshow_partition_info /dev/$b\n                expquit 2\n            else\n                log \"/dev/$b分区扩容和挂载到/mnt/$b失败！\" \n            fi\n            ;;\n    esac\n}\n\nautopart() {\n\n    [ -f $LOCK ] && expquit 1\n    if [ -f \"/etc/config/$CONFIG\" ]; then\n        target_function=$(uci -q get partexp.global.target_function)\n        target_disk=$(uci -q get partexp.global.target_disk)\n        keep_config=$(uci -q get partexp.global.keep_config)\n        format_type=$(uci -q get partexp.global.format_type)\n        export target_function=\"${target_function:-/opt}\"\n        export keep_config=\"${keep_config:-0}\"\n        export format_type=\"${format_type:-0}\"\n        export target_disk=\"${target_disk:-sda}\"\n    fi\n    touch $LOCK\n    init_env\n    gen_log\n    \n    uci -q set fstab.@global[0].anon_mount='0'\n    uci -q set fstab.@global[0].auto_mount='0'\n    uci commit fstab\n    \n    [ -e \"/etc/config/dockerd\" ] && /etc/init.d/dockerd stop >/dev/null 2> /dev/null \n    \n    DISK=${target_disk}\n    NEXTPART=1\n    DISKSALL=$(get_all_disks)\n    DISK_COUNT=$(echo \"$DISKSALL\" | wc -l) \n    log \"系统中检测到的硬盘数量: $DISK_COUNT\"\n    log \"硬盘信息列表:\" $DISKSALL\n    \n    SYSTEM_DISK=$(get_system_disk)\n    log \"系统盘: \"$SYSTEM_DISK\n    \n    case \"$SYSTEM_DISK\" in\n        /dev/$DISK*) \n            fdisksave /dev/$DISK\n            log \"操作功能：$target_function ，系统盘：/dev/$DISK\"\n\n            PARTITIONSUM=$(get_partition_number $DISK)\n            log \"目标盘 $DISK 一共有分区数: $PARTITIONSUM个\"\n            \n            if [[ \"$PARTITIONSUM\" -gt 2 ]]; then\n                FREE_SPACE=$(check_free_space $(basename $DISK))\n                log \"目标盘 $DISK 有剩余空间: $FREE_SPACE Gb\"\n                if [[ \"$FREE_SPACE\" -gt 2 ]]; then\n                    NEXTPART=$(get_next_partition_number $DISK)\n                else\n                    NEXTPART=$(get_last_partition_number $DISK)\n                fi\n            else \n                FREE_SPACE=$(check_free_space $(basename $DISK))\n                log \"目标盘 $DISK 有剩余空间: $FREE_SPACE Gb\"\n                if [[ \"$FREE_SPACE\" -gt 2 ]]; then\n                    NEXTPART=$(get_next_partition_number $DISK)\n                else\n                    log \"目标盘 $SYSTEM_DISK 没有足够的剩余空间！\"\n                    expquit 1\n                fi\n            fi\n            ;;\n        *)\n            log \"操作功能：$target_function ，非系统盘：/dev/$DISK\"\n            PARTITIONSUM=$(get_partition_number $DISK)\n            log \"目标盘 $DISK 一共有分区数: $PARTITIONSUM个\"\n            \n            if [[ \"$PARTITIONSUM\" -gt 1 ]]; then\n                FREE_SPACE=$(check_free_space $(basename $DISK))\n                log \"目标盘 $DISK 有剩余空间: $FREE_SPACE Gb\"\n                [[ $FREE_SPACE -gt 2 ]] && NEXTPART=$(get_next_partition_number $DISK) || NEXTPART=$(get_last_partition_number $DISK)\n            else \n                NEXTPART=1\n            fi\n            ;;\n    esac\n    \n    log \"定位到操作目标设备分区:/dev/$DISK$NEXTPART\"\n    \n    case \"$DISK\" in\n        vd*|sd*) fdiskB $DISK $NEXTPART;;\n        nvme*|mmc*) fdiskB $DISK p$NEXTPART;;\n        # mtdblock*|ubiblock*) fdiskB $DISK $NEXTPART;;\n        *)\n            log \"目标设备/dev/$DISK暂不支持！请联系作者sirpdboy！\"\n            ;;\n    esac\n    expquit 1\n}\n\n\nstop() {\n    rm -f $LOCK 2>/dev/null\n}\n\nexpquit() {\n    rm -f $LOCK\n    uci -q set fstab.@global[0].anon_mount='1'\n    uci -q set fstab.@global[0].auto_mount='1'\n    uci commit fstab\n    [ -e \"/etc/config/dockerd\" ] && /etc/init.d/dockerd restart >/dev/null 2> /dev/null \n    [ \"$1\" = \"2\" ] && log \"如果没生效，请重启设备\"\n    sleep 1\n    log \"== 操作完成 ==\"\n    [ \"$1\" = \"3\" ] && log \"重启中...\\n\" && reboot \n    exit $1\n}\n\ncase \"$1\" in\n    autopart)\n        \"$1\"\n        ;;\n    *)\n        echo \"Usage: $0 {autopart}\"\n        exit 1\n        ;;\nesac"
  },
  {
    "path": "luci-app-partexp/root/usr/libexec/rpcd/partexp",
    "content": "#!/bin/sh\n. /usr/share/libubox/jshn.sh\n\n# 分区扩展服务\ncase \"$1\" in\n    list)\n        echo '{\n            \"autopart\": {\n                \"description\": \"Execute automatic partition expansion\"\n            },\n            \"get_log\": {\n                \"description\": \"Get operation log\",\n                \"arguments\": {\n                    \"position\": \"string\"\n                }\n            },\n            \"get_devices\": {\n                \"description\": \"Get available disk devices\"\n            },\n            \"get_status\": {\n                \"description\": \"Get operation status\"\n            },\n            \"save_config\": {\n                \"description\": \"Save configuration\",\n                \"arguments\": {\n                    \"target_function\": \"string\",\n                    \"target_disk\": \"string\",\n                    \"keep_config\": \"string\",\n                    \"format_type\": \"string\"\n                }\n            }\n        }'\n        ;;\n    call)\n        case \"$2\" in\n            autopart)\n                if [ -f \"/var/run/partexp.lock\" ]; then\n                    echo '{\"error\": \"Another operation is in progress\"}'\n                    return 1\n                fi\n                \n                # 检查配置文件是否存在\n                if [ ! -f \"/etc/config/partexp\" ]; then\n                    echo '{\"error\": \"Configuration file not found. Please save settings first.\"}'\n                    return 1\n                fi\n                \n                # 创建锁文件\n                touch /var/run/partexp.lock\n                \n                # 执行分区操作（后台异步执行）\n                {\n                    # 清空日志文件\n                    echo \"\" > /tmp/partexp.log\n                    \n                    # 调用原 partexp 脚本\n                    /usr/bin/partexp autopart > /tmp/partexp.log 2>&1\n                    \n                    # 清理锁文件\n                    rm -f /var/run/partexp.lock\n                } &\n                \n                echo '{\"success\": true, \"pid\": \"'$!'\", \"message\": \"Partition expansion started\"}'\n                ;;\n                \n            get_log)\n                # 获取操作日志\n                read input\n                json_load \"$input\"\n                json_get_vars position\n                \n                if [ ! -f \"/tmp/partexp.log\" ]; then\n                    echo '{\"log\": \"\", \"complete\": true}'\n                    return 0\n                fi\n                \n                if [ -z \"$position\" ] || [ \"$position\" = \"0\" ]; then\n                    # 从头读取\n                    log_content=$(cat /tmp/partexp.log 2>/dev/null | tail -c 2048000)\n                    new_position=$(stat -c%s /tmp/partexp.log 2>/dev/null || echo \"0\")\n                    \n                    json_init\n                    json_add_string \"log\" \"$log_content\"\n                    json_add_boolean \"complete\" false\n                    json_add_string \"position\" \"$new_position\"\n                    json_dump\n                else\n                    # 从指定位置读取\n                    position=${position:-0}\n                    file_size=$(stat -c%s /tmp/partexp.log 2>/dev/null || echo 0)\n                    \n                    if [ \"$position\" -lt \"$file_size\" ]; then\n                        log_content=$(tail -c +$((position + 1)) /tmp/partexp.log | head -c 2048000)\n                        new_position=$((position + ${#log_content}))\n                        \n                        json_init\n                        json_add_string \"log\" \"$log_content\"\n                        json_add_boolean \"complete\" false\n                        json_add_string \"position\" \"$new_position\"\n                        json_dump\n                    else\n                        json_init\n                        json_add_string \"log\" \"\"\n                        json_add_boolean \"complete\" true\n                        json_add_string \"position\" \"$position\"\n                        json_dump\n                    fi\n                fi\n                ;;\n                \n            get_devices)\n                # 获取可用设备列表 - 仅磁盘\n                json_init\n                json_add_array \"devices\"\n                \n                # 所有可能的磁盘设备模式\n                disk_patterns=\"\n                    ^sd[a-z]$\n                    ^mmcblk[0-9]+$\n                    ^nvme[0-9]+n[0-9]+$\n                    ^vd[a-z]$\n                    ^hd[a-z]$\n                    ^xvd[a-z]$\n                    ^ubd[a-z]+$\n                    ^dasd[a-z]+$\n                    ^cciss[0-9]+$\n                    ^ida[0-9]+$\n                    ^rd[0-9]+$\n                    ^mtdblock[0-9]+$\n                    ^nbd[0-9]+$\n                    ^zram[0-9]+$\n                \"\n                \n                for dev in /sys/class/block/*; do\n                    dev_name=$(basename \"$dev\")\n                    \n                    # 跳过分区、loop、dm 设备\n                    if [ -f \"$dev/partition\" ] || [ -d \"$dev/loop\" ] || [ -d \"$dev/dm\" ]; then\n                        continue\n                    fi\n                    \n                    # 检查是否为磁盘设备\n                    is_disk=0\n                    for pattern in $disk_patterns; do\n                        if echo \"$dev_name\" | grep -qE \"$pattern\"; then\n                            is_disk=1\n                            break\n                        fi\n                    done\n                    \n                    if [ $is_disk -eq 1 ]; then\n                        size=\"0\"\n                        if [ -f \"$dev/size\" ]; then\n                            size_sectors=$(cat \"$dev/size\")\n                            size=$((size_sectors / 2048))\n                        fi\n                        \n                        json_add_object\n                        json_add_string \"name\" \"$dev_name\"\n                        json_add_string \"dev\" \"/dev/$dev_name\"\n                        json_add_int \"size\" \"$size\"\n                        json_close_object\n                    fi\n                done\n                \n                json_close_array\n                json_dump\n                ;;\n\n                \n            get_status)\n                # 获取操作状态\n                if [ -f \"/var/run/partexp.lock\" ]; then\n                    echo '{\"running\": true}'\n                else\n                    echo '{\"running\": false}'\n                fi\n                ;;\n\n                \n            save_config)\n                # 保存配置\n                read input\n                json_load \"$input\"\n                json_get_vars target_function target_disk keep_config format_type\n                \n                # 验证参数\n                if [ -z \"$target_function\" ]; then\n                    echo '{\"error\": \"Missing target_function parameter\"}'\n                    return 1\n                fi\n                \n                # 设置默认值\n                target_disk=\"${target_disk:-}\"\n                keep_config=\"${keep_config:-0}\"\n                format_type=\"${format_type:-0}\"\n                \n                # 构建配置内容\n                CONFIG_FILE=\"/etc/config/partexp\"\n                mkdir -p \"$(dirname \"$CONFIG_FILE\")\"\n                \n                cat > \"$CONFIG_FILE\" << EOF\n# Auto-generated by partexp\n\nconfig global global\n\toption target_function '$target_function'\n\toption target_disk '$target_disk'\n\toption keep_config '$keep_config'\n\toption format_type '$format_type'\nEOF\n                \n                if [ $? -eq 0 ]; then\n                    echo '{\"success\": true, \"message\": \"Configuration saved\"}'\n                else\n                    echo '{\"error\": \"Failed to save configuration\"}'\n                    return 1\n                fi\n                ;;\n                \n            *)\n                echo '{\"error\": \"Method not found\"}'\n                ;;\n        esac\n        ;;\n    *)\n        echo '{\"error\": \"Invalid action\"}'\n        ;;\nesac"
  },
  {
    "path": "luci-app-partexp/root/usr/share/luci/menu.d/luci-app-partexp.json",
    "content": "{\n    \"admin/system/partexp\": {\n        \"title\": \"Partition Expansion\",\n        \"order\": 54,\n        \"action\": {\n            \"type\": \"view\",\n            \"path\": \"partexp\"\n        },\n        \"acl\": [\"luci-app-partexp\"],\n        \"depends\": {\n            \"acl\": [\"luci-app-partexp\"]\n        }\n    }\n}\n\n"
  },
  {
    "path": "luci-app-partexp/root/usr/share/rpcd/acl.d/luci-app-partexp.json",
    "content": "{\n    \"luci-app-partexp\": {\n        \"description\": \"Grant access for luci-app-partexp\",\n        \"read\": {\n            \"ubus\": {\n                \"file\": [\"exec\", \"list\", \"stat\", \"read\"],\n                \"uci\": [\"partexp\"],\n                \"partexp\": [\"get_devices\", \"get_log\", \"get_status\"]\n            }\n        },\n        \"write\": {\n            \"ubus\": {\n                \"partexp\": [\"autopart\", \"save_config\"],\n                \"file\": [\"write\"]\n            },\n            \"file\": {\n                \"/etc/config/partexp\": [\"write\"]\n            }\n        }\n    }\n}"
  },
  {
    "path": "luci-app-passwall/Makefile",
    "content": "# Copyright (C) 2018-2020 L-WRT Team\n# Copyright (C) 2021-2025 xiaorouji\n# Copyright (C) 2026 Openwrt-Passwall Organization\n#\n# This is free software, licensed under the GNU General Public License v3.\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-passwall\nPKG_VERSION:=26.5.3\nPKG_RELEASE:=1\nPKG_PO_VERSION:=$(PKG_VERSION)\n\nPKG_CONFIG_DEPENDS:= \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_Nftables_Transparent_Proxy \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Geoview \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Haproxy \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Client \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Server \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Server \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadow_TLS \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Simple_Obfs \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_SingBox \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_Geodata \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_Plugin \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Xray \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Xray_Plugin\n\nLUCI_TITLE:=LuCI support for PassWall\nLUCI_PKGARCH:=all\nLUCI_DEPENDS:=+coreutils +coreutils-base64 +coreutils-nohup +curl \\\n\t+chinadns-ng +dns2socks +dnsmasq-full +ip-full \\\n\t+libuci-lua +lua +luci-compat +luci-lib-jsonc \\\n\t+microsocks +resolveip +tcping +lyaml\n\ndefine Package/$(PKG_NAME)/config\nmenu \"Configuration\"\n\tdepends on PACKAGE_$(PKG_NAME)\n\nconfig PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy\n\tbool \"Iptables Transparent Proxy\"\n\tselect PACKAGE_ipset\n\tselect PACKAGE_ipt2socks\n\tselect PACKAGE_iptables\n\tselect PACKAGE_iptables-zz-legacy\n\tselect PACKAGE_iptables-mod-conntrack-extra\n\tselect PACKAGE_iptables-mod-iprange\n\tselect PACKAGE_iptables-mod-socket\n\tselect PACKAGE_iptables-mod-tproxy\n\tselect PACKAGE_kmod-ipt-nat\n\tdefault y if ! PACKAGE_firewall4\n\nconfig PACKAGE_$(PKG_NAME)_Nftables_Transparent_Proxy\n\tbool \"Nftables Transparent Proxy\"\n\tselect PACKAGE_ipt2socks\n\tselect PACKAGE_nftables\n\tselect PACKAGE_kmod-nft-socket\n\tselect PACKAGE_kmod-nft-tproxy\n\tselect PACKAGE_kmod-nft-nat\n\tdefault y if PACKAGE_firewall4\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Geoview\n\tbool \"Include Geoview\"\n\tselect PACKAGE_geoview\n\tdefault y if aarch64||arm||i386||x86_64\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Haproxy\n\tbool \"Include Haproxy\"\n\tselect PACKAGE_haproxy\n\tdefault y if aarch64||arm||i386||x86_64\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria\n\tbool \"Include Hysteria\"\n\tselect PACKAGE_hysteria\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy\n\tbool \"Include NaiveProxy\"\n\tdepends on !(arc||armeb||loongarch64||mips||mips64||powerpc||TARGET_gemini)\n\tselect PACKAGE_naiveproxy\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Client\n\tbool \"Include Shadowsocks Libev Client\"\n\tselect PACKAGE_shadowsocks-libev-ss-local\n\tselect PACKAGE_shadowsocks-libev-ss-redir\n\tdefault y\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Server\n\tbool \"Include Shadowsocks Libev Server\"\n\tselect PACKAGE_shadowsocks-libev-ss-server\n\tdefault y if aarch64||arm||i386||x86_64\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client\n\tbool \"Include Shadowsocks Rust Client\"\n\tdepends on !i386\n\tselect PACKAGE_shadowsocks-rust-sslocal\n\tdefault y if aarch64||x86_64\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server\n\tbool \"Include Shadowsocks Rust Server\"\n\tdepends on !i386\n\tselect PACKAGE_shadowsocks-rust-ssserver\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client\n\tbool \"Include ShadowsocksR Libev Client\"\n\tselect PACKAGE_shadowsocksr-libev-ssr-local\n\tselect PACKAGE_shadowsocksr-libev-ssr-redir\n\tdefault y\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Server\n\tbool \"Include ShadowsocksR Libev Server\"\n\tselect PACKAGE_shadowsocksr-libev-ssr-server\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadow_TLS\n\tbool \"Include Shadow-TLS\"\n\tselect PACKAGE_shadow-tls\n\tdepends on aarch64||arm||x86_64\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Simple_Obfs\n\tbool \"Include Simple-Obfs (Shadowsocks Plugin)\"\n\tselect PACKAGE_simple-obfs-client\n\tdefault y\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_SingBox\n\tbool \"Include Sing-Box\"\n\tselect PACKAGE_sing-box\n\tdefault y if aarch64||arm||i386||x86_64\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_Geodata\n\tbool \"Include V2ray_Geodata\"\n\tselect PACKAGE_v2ray-geoip\n\tselect PACKAGE_v2ray-geosite\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_Plugin\n\tbool \"Include V2ray-Plugin (Shadowsocks Plugin)\"\n\tselect PACKAGE_v2ray-plugin\n\tdefault y if aarch64||arm||i386||x86_64\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Xray\n\tbool \"Include Xray\"\n\tselect PACKAGE_xray-core\n\tselect PACKAGE_unzip\n\tdefault y if aarch64||arm||i386||x86_64\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Xray_Plugin\n\tbool \"Include Xray-Plugin (Shadowsocks Plugin)\"\n\tselect PACKAGE_xray-plugin\n\tdefault n\n\nendmenu\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/passwall\n/etc/config/passwall_server\n/usr/share/passwall/rules/direct_host\n/usr/share/passwall/rules/direct_ip\n/usr/share/passwall/rules/proxy_host\n/usr/share/passwall/rules/proxy_ip\n/usr/share/passwall/rules/block_host\n/usr/share/passwall/rules/block_ip\n/usr/share/passwall/rules/lanlist_ipv4\n/usr/share/passwall/rules/lanlist_ipv6\n/usr/share/passwall/rules/domains_excluded\nendef\n\ndefine Package/$(PKG_NAME)/postrm\n#!/bin/sh\nrm -f $${IPKG_INSTROOT}/usr/share/passwall/rules/*.nft\nexit 0\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-passwall/luasrc/controller/passwall.lua",
    "content": "-- Copyright (C) 2018-2020 L-WRT Team\n-- Copyright (C) 2021-2025 xiaorouji\n-- Copyright (C) 2026 Openwrt-Passwall Organization\n\nmodule(\"luci.controller.passwall\", package.seeall)\nlocal api = require \"luci.passwall.api\"\nlocal appname = \"passwall\"\t-- not available\nlocal uci = api.uci\t\t\t-- in funtion index()\nlocal fs = api.fs\nlocal http = require \"luci.http\"\nlocal util = require \"luci.util\"\nlocal i18n = require \"luci.i18n\"\nlocal jsonStringify = luci.jsonc.stringify\nlocal jsonParse = luci.jsonc.parse\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/passwall\") then\n\t\tif nixio.fs.access(\"/usr/share/passwall/0_default_config\") then\n\t\t\tluci.sys.call('cp -f /usr/share/passwall/0_default_config /etc/config/passwall')\n\t\telse return end\n\tend\n\tlocal api = require \"luci.passwall.api\"\n\tlocal appname = \"passwall\"\t-- global definitions not available\n\tlocal uci = api.uci\t\t\t-- in function index()\n\tlocal fs = api.fs\n\tentry({\"admin\", \"services\", appname}).dependent = true\n\tentry({\"admin\", \"services\", appname, \"reset_config\"}, call(\"reset_config\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"show\"}, call(\"show_menu\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"hide\"}, call(\"hide_menu\")).leaf = true\n\tlocal e\n\tif uci:get(appname, \"@global[0]\", \"hide_from_luci\") ~= \"1\" then\n\t\te = entry({\"admin\", \"services\", appname}, alias(\"admin\", \"services\", appname, \"settings\"), _(\"Pass Wall\"), -1)\n\telse\n\t\te = entry({\"admin\", \"services\", appname}, alias(\"admin\", \"services\", appname, \"settings\"), nil, -1)\n\tend\n\te.dependent = true\n\te.acl_depends = { \"luci-app-passwall\" }\n\t--[[ Client ]]\n\tentry({\"admin\", \"services\", appname, \"settings\"}, cbi(appname .. \"/client/global\"), _(\"Basic Settings\"), 1).dependent = true\n\tentry({\"admin\", \"services\", appname, \"node_list\"}, cbi(appname .. \"/client/node_list\"), _(\"Node List\"), 2).dependent = true\n\tentry({\"admin\", \"services\", appname, \"node_subscribe\"}, cbi(appname .. \"/client/node_subscribe\"), _(\"Node Subscribe\"), 3).dependent = true\n\tentry({\"admin\", \"services\", appname, \"other\"}, cbi(appname .. \"/client/other\", {autoapply = true}), _(\"Other Settings\"), 92).leaf = true\n\tif api.is_finded(\"haproxy\") then\n\t\tentry({\"admin\", \"services\", appname, \"haproxy\"}, cbi(appname .. \"/client/haproxy\"), _(\"Load Balancing\"), 93).leaf = true\n\tend\n\tentry({\"admin\", \"services\", appname, \"app_update\"}, cbi(appname .. \"/client/app_update\"), _(\"App Update\"), 95).leaf = true\n\tentry({\"admin\", \"services\", appname, \"rule\"}, cbi(appname .. \"/client/rule\"), _(\"Rule Manage\"), 96).leaf = true\n\tentry({\"admin\", \"services\", appname, \"rule_list\"}, cbi(appname .. \"/client/rule_list\", {autoapply = true}), _(\"Rule List\"), 97).leaf = true\n\tentry({\"admin\", \"services\", appname, \"node_subscribe_config\"}, cbi(appname .. \"/client/node_subscribe_config\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"node_config\"}, cbi(appname .. \"/client/node_config\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"shunt_rules\"}, cbi(appname .. \"/client/shunt_rules\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"socks_config\"}, cbi(appname .. \"/client/socks_config\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"acl\"}, cbi(appname .. \"/client/acl\"), _(\"Access control\"), 98).leaf = true\n\tentry({\"admin\", \"services\", appname, \"acl_config\"}, cbi(appname .. \"/client/acl_config\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"log\"}, form(appname .. \"/client/log\"), _(\"Watch Logs\"), 999).leaf = true\n\n\t--[[ Server ]]\n\tentry({\"admin\", \"services\", appname, \"server\"}, cbi(appname .. \"/server/index\"), _(\"Server-Side\"), 99).leaf = true\n\tentry({\"admin\", \"services\", appname, \"server_user\"}, cbi(appname .. \"/server/user\")).leaf = true\n\n\t--[[ API ]]\n\tentry({\"admin\", \"services\", appname, \"server_user_status\"}, call(\"server_user_status\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"server_user_log\"}, call(\"server_user_log\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"server_get_log\"}, call(\"server_get_log\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"server_clear_log\"}, call(\"server_clear_log\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"link_add_node\"}, call(\"link_add_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"socks_autoswitch_add_node\"}, call(\"socks_autoswitch_add_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"socks_autoswitch_remove_node\"}, call(\"socks_autoswitch_remove_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"gen_client_config\"}, call(\"gen_client_config\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"get_now_use_node\"}, call(\"get_now_use_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"get_redir_log\"}, call(\"get_redir_log\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"get_socks_log\"}, call(\"get_socks_log\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"get_chinadns_log\"}, call(\"get_chinadns_log\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"get_log\"}, call(\"get_log\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"clear_log\"}, call(\"clear_log\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"index_status\"}, call(\"index_status\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"haproxy_status\"}, call(\"haproxy_status\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"socks_status\"}, call(\"socks_status\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"connect_status\"}, call(\"connect_status\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"ping_node\"}, call(\"ping_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"urltest_node\"}, call(\"urltest_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"add_node\"}, call(\"add_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"update_node\"}, call(\"update_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"set_node\"}, call(\"set_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"copy_node\"}, call(\"copy_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"clear_all_nodes\"}, call(\"clear_all_nodes\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"delete_select_nodes\"}, call(\"delete_select_nodes\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"reassign_group\"}, call(\"reassign_group\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"get_node\"}, call(\"get_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"save_node_order\"}, call(\"save_node_order\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"save_node_list_opt\"}, call(\"save_node_list_opt\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"update_rules\"}, call(\"update_rules\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"rollback_rules\"}, call(\"rollback_rules\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"subscribe_del_node\"}, call(\"subscribe_del_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"subscribe_del_all\"}, call(\"subscribe_del_all\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"subscribe_manual\"}, call(\"subscribe_manual\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"subscribe_manual_all\"}, call(\"subscribe_manual_all\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"flush_set\"}, call(\"flush_set\")).leaf = true\n\n\t--[[rule_list]]\n\tentry({\"admin\", \"services\", appname, \"read_rulelist\"}, call(\"read_rulelist\")).leaf = true\n\n\t--[[Components update]]\n\tentry({\"admin\", \"services\", appname, \"check_passwall\"}, call(\"app_check\")).leaf = true\n\tlocal coms = require \"luci.passwall.com\"\n\tlocal com\n\tfor _, com in ipairs(coms.order) do\n\t\tentry({\"admin\", \"services\", appname, \"check_\" .. com}, call(\"com_check\", com)).leaf = true\n\t\tentry({\"admin\", \"services\", appname, \"update_\" .. com}, call(\"com_update\", com)).leaf = true\n\tend\n\n\t--[[Backup]]\n\tentry({\"admin\", \"services\", appname, \"create_backup\"}, call(\"create_backup\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"restore_backup\"}, call(\"restore_backup\")).leaf = true\n\n\t--[[geoview]]\n\tentry({\"admin\", \"services\", appname, \"geo_view\"}, call(\"geo_view\")).leaf = true\n\n\tentry({\"admin\", \"services\", appname, \"fetch_certsha256\"}, call(\"fetch_certsha256\")).leaf = true\nend\n\nlocal function http_write_json(content)\n\thttp.prepare_content(\"application/json\")\n\thttp.write(jsonStringify(content or {code = 1}))\nend\n\nlocal function http_write_json_ok(data)\n\thttp.prepare_content(\"application/json\")\n\thttp.write(jsonStringify({code = 1, data = data}))\nend\n\nlocal function http_write_json_error(data)\n\thttp.prepare_content(\"application/json\")\n\thttp.write(jsonStringify({code = 0, data = data}))\nend\n\nfunction reset_config()\n\tluci.sys.call('/etc/init.d/passwall stop')\n\tluci.sys.call('[ -f \"/usr/share/passwall/0_default_config\" ] && cp -f /usr/share/passwall/0_default_config /etc/config/passwall')\n\thttp.redirect(api.url())\nend\n\nfunction show_menu()\n\tapi.sh_uci_del(appname, \"@global[0]\", \"hide_from_luci\", true)\n\tluci.sys.call(\"rm -rf /tmp/luci-*\")\n\tluci.sys.call(\"/etc/init.d/rpcd restart >/dev/null\")\n\thttp.redirect(api.url())\nend\n\nfunction hide_menu()\n\tapi.sh_uci_set(appname, \"@global[0]\", \"hide_from_luci\", \"1\", true)\n\tluci.sys.call(\"rm -rf /tmp/luci-*\")\n\tluci.sys.call(\"/etc/init.d/rpcd restart >/dev/null\")\n\thttp.redirect(luci.dispatcher.build_url(\"admin\", \"status\", \"overview\"))\nend\n\nfunction link_add_node()\n\t-- 分片接收以突破uhttpd的限制\n\tlocal tmp_file = \"/tmp/links.conf\"\n\tlocal chunk = http.formvalue(\"chunk\")\n\tlocal chunk_index = tonumber(http.formvalue(\"chunk_index\"))\n\tlocal total_chunks = tonumber(http.formvalue(\"total_chunks\"))\n\tlocal group = http.formvalue(\"group\") or \"default\"\n\n\tif chunk and chunk_index ~= nil and total_chunks ~= nil then\n\t\t-- 按顺序拼接到文件\n\t\tlocal mode = \"a\"\n\t\tif chunk_index == 0 then\n\t\t\tmode = \"w\"\n\t\tend\n\t\tlocal f = io.open(tmp_file, mode)\n\t\tif f then\n\t\t\tf:write(chunk)\n\t\t\tf:close()\n\t\tend\n\t\t-- 如果是最后一片，才执行\n\t\tif chunk_index + 1 == total_chunks then\n\t\t\tluci.sys.call(\"lua /usr/share/passwall/subscribe.lua add \" .. group)\n\t\tend\n\tend\nend\n\nfunction socks_autoswitch_add_node()\n\tlocal id = http.formvalue(\"id\")\n\tlocal key = http.formvalue(\"key\")\n\tif id and id ~= \"\" and key and key ~= \"\" then\n\t\tuci:set(appname, id, \"enable_autoswitch\", \"1\")\n\t\tlocal new_list = uci:get(appname, id, \"autoswitch_backup_node\") or {}\n\t\tfor i = #new_list, 1, -1 do\n\t\t\tif (uci:get(appname, new_list[i], \"remarks\") or \"\"):find(key) then\n\t\t\t\ttable.remove(new_list, i)\n\t\t\tend\n\t\tend\n\t\tfor k, e in ipairs(api.get_valid_nodes()) do\n\t\t\tif e.node_type == \"normal\" and e[\"remark\"]:find(key) then\n\t\t\t\ttable.insert(new_list, e.id)\n\t\t\tend\n\t\tend\n\t\tuci:set_list(appname, id, \"autoswitch_backup_node\", new_list)\n\t\tapi.uci_save(uci, appname)\n\tend\n\thttp.redirect(api.url(\"socks_config\", id))\nend\n\nfunction socks_autoswitch_remove_node()\n\tlocal id = http.formvalue(\"id\")\n\tlocal key = http.formvalue(\"key\")\n\tif id and id ~= \"\" and key and key ~= \"\" then\n\t\tuci:set(appname, id, \"enable_autoswitch\", \"1\")\n\t\tlocal new_list = uci:get(appname, id, \"autoswitch_backup_node\") or {}\n\t\tfor i = #new_list, 1, -1 do\n\t\t\tif (uci:get(appname, new_list[i], \"remarks\") or \"\"):find(key) then\n\t\t\t\ttable.remove(new_list, i)\n\t\t\tend\n\t\tend\n\t\tuci:set_list(appname, id, \"autoswitch_backup_node\", new_list)\n\t\tapi.uci_save(uci, appname)\n\tend\n\thttp.redirect(api.url(\"socks_config\", id))\nend\n\n\nfunction gen_client_config()\n\tlocal id = http.formvalue(\"id\")\n\tlocal config_file = api.TMP_PATH .. \"/config_\" .. id\n\tluci.sys.call(string.format(\"/usr/share/passwall/app.sh run_socks flag=config_%s node=%s bind=127.0.0.1 socks_port=1080 config_file=%s no_run=1\", id, id, config_file))\n\tif nixio.fs.access(config_file) then\n\t\thttp.prepare_content(\"application/json\")\n\t\thttp.write(luci.sys.exec(\"cat \" .. config_file))\n\t\tluci.sys.call(\"rm -f \" .. config_file)\n\telse\n\t\thttp.redirect(api.url(\"node_list\"))\n\tend\nend\n\nfunction get_now_use_node()\n\tlocal path = \"/tmp/etc/passwall/acl/default\"\n\tlocal e = {}\n\tlocal tcp_node = api.get_cache_var(\"ACL_GLOBAL_TCP_node\")\n\tif tcp_node then\n\t\te[\"TCP\"] = tcp_node\n\tend\n\tlocal udp_node = api.get_cache_var(\"ACL_GLOBAL_UDP_node\")\n\tif udp_node then\n\t\te[\"UDP\"] = udp_node\n\tend\n\thttp_write_json(e)\nend\n\nfunction get_redir_log()\n\tlocal name = http.formvalue(\"name\")\n\tlocal proto = http.formvalue(\"proto\")\n\tlocal path = \"/tmp/etc/passwall/acl/\" .. name\n\tproto = proto:upper()\n\tif proto == \"UDP\" and (uci:get(appname, \"@global[0]\", \"udp_node\") or \"nil\") == \"tcp\" and not fs.access(path .. \"/\" .. proto .. \".log\") then\n\t\tproto = \"TCP\"\n\tend\n\tif fs.access(path .. \"/\" .. proto .. \".log\") then\n\t\tlocal content = luci.sys.exec(\"tail -n 19999 \".. path .. \"/\" .. proto .. \".log\")\n\t\tcontent = content:gsub(\"\\n\", \"<br />\")\n\t\thttp.write(content)\n\telse\n\t\thttp.write(string.format(\"<script>alert('%s');window.close();</script>\", i18n.translate(\"Not enabled log\")))\n\tend\nend\n\nfunction get_socks_log()\n\tlocal name = http.formvalue(\"name\")\n\tlocal path = \"/tmp/etc/passwall/SOCKS_\" .. name .. \".log\"\n\tif fs.access(path) then\n\t\tlocal content = luci.sys.exec(\"cat \".. path)\n\t\tcontent = content:gsub(\"\\n\", \"<br />\")\n\t\thttp.write(content)\n\telse\n\t\thttp.write(string.format(\"<script>alert('%s');window.close();</script>\", i18n.translate(\"Not enabled log\")))\n\tend\nend\n\nfunction get_chinadns_log()\n\tlocal flag = http.formvalue(\"flag\")\n\tlocal path = \"/tmp/etc/passwall/acl/\" .. flag .. \"/chinadns_ng.log\"\n\tif fs.access(path) then\n\t\tlocal content = luci.sys.exec(\"tail -n 5000 \".. path)\n\t\tcontent = content:gsub(\"\\n\", \"<br />\")\n\t\thttp.write(content)\n\telse\n\t\thttp.write(string.format(\"<script>alert('%s');window.close();</script>\", i18n.translate(\"Not enabled log\")))\n\tend\nend\n\nfunction get_log()\n\t-- luci.sys.exec(\"[ -f /tmp/log/passwall.log ] && sed '1!G;h;$!d' /tmp/log/passwall.log > /tmp/log/passwall_show.log\")\n\thttp.write(luci.sys.exec(\"[ -f '/tmp/log/passwall.log' ] && cat /tmp/log/passwall.log\"))\nend\n\nfunction clear_log()\n\tluci.sys.call(\"echo '' > /tmp/log/passwall.log\")\nend\n\nfunction index_status()\n\tlocal e = {}\n\tlocal dns_shunt = uci:get(appname, \"@global[0]\", \"dns_shunt\") or \"dnsmasq\"\n\tif dns_shunt == \"smartdns\" then\n\t\te.dns_mode_status = luci.sys.call(\"pidof smartdns >/dev/null\") == 0\n\telseif dns_shunt == \"chinadns-ng\" then\n\t\te.dns_mode_status = luci.sys.call(\"/bin/busybox top -bn1 | grep -v 'grep' | grep '/tmp/etc/passwall/bin/' | grep 'default' | grep 'chinadns_ng' >/dev/null\") == 0\n\telse\n\t\te.dns_mode_status = luci.sys.call(\"netstat -apn | grep ':15353 ' >/dev/null\") == 0\n\tend\n\n\te.haproxy_status = \"-1\"\n\tif api.is_finded(\"haproxy\") then\n\t\te.haproxy_status = (luci.sys.call(string.format(\"/bin/busybox top -bn1 | grep -v grep | grep '%s/bin/' | grep haproxy >/dev/null\", appname)) == 0) and \"0\" or \"1\"\n\tend\n\n\te[\"tcp_node_status\"] = luci.sys.call(\"/bin/busybox top -bn1 | grep -v 'grep' | grep '/tmp/etc/passwall/bin/' | grep 'default' | grep 'TCP' >/dev/null\") == 0\n\n\tif (uci:get(appname, \"@global[0]\", \"udp_node\") or \"nil\") == \"tcp\" then\n\t\te[\"udp_node_status\"] = e[\"tcp_node_status\"]\n\telse\n\t\te[\"udp_node_status\"] = luci.sys.call(\"/bin/busybox top -bn1 | grep -v 'grep' | grep '/tmp/etc/passwall/bin/' | grep 'default' | grep 'UDP' >/dev/null\") == 0\n\tend\n\thttp_write_json(e)\nend\n\nfunction haproxy_status()\n\tlocal e = {}\n\te[\"status\"] = luci.sys.call(string.format(\"/bin/busybox top -bn1 | grep -v grep | grep '%s/bin/' | grep haproxy >/dev/null\", appname)) == 0\n\thttp_write_json(e)\nend\n\nfunction socks_status()\n\tlocal e = {}\n\tlocal index = http.formvalue(\"index\")\n\tlocal id = http.formvalue(\"id\")\n\te.index = index\n\te.socks_status = luci.sys.call(string.format(\"/bin/busybox top -bn1 | grep -v 'grep' | grep '/tmp/etc/passwall/bin/' | grep -v '_acl_' | grep '%s' | grep 'SOCKS_' > /dev/null\", id)) == 0\n\tlocal use_http = uci:get(appname, id, \"http_port\") or 0\n\te.use_http = 0\n\tif tonumber(use_http) > 0 then\n\t\te.use_http = 1\n\t\te.http_status = luci.sys.call(string.format(\"/bin/busybox top -bn1 | grep -v 'grep' | grep '/tmp/etc/passwall/bin/' | grep -v '_acl_' | grep '%s' | grep -E 'HTTP_|HTTP2SOCKS' > /dev/null\", id)) == 0\n\tend\n\thttp_write_json(e)\nend\n\nfunction connect_status()\n\tlocal e = {}\n\te.use_time = \"\"\n\tlocal url = http.formvalue(\"url\")\n\tlocal aliyun = string.find(url, \"aliyun\")\n\tlocal chn_list = uci:get(appname, \"@global[0]\", \"chn_list\") or \"direct\"\n\tlocal gfw_list = uci:get(appname, \"@global[0]\", \"use_gfw_list\") or \"1\"\n\tlocal proxy_mode = uci:get(appname, \"@global[0]\", \"tcp_proxy_mode\") or \"proxy\"\n\tlocal localhost_proxy = uci:get(appname, \"@global[0]\", \"localhost_proxy\") or \"1\"\n\tlocal socks_server = (localhost_proxy == \"0\") and api.get_cache_var(\"GLOBAL_TCP_SOCKS_server\") or \"\"\n\turl = \"-w %{http_code}:%{time_pretransfer} \" .. url\n\tif socks_server and socks_server ~= \"\" then\n\t\tif (chn_list == \"proxy\" and gfw_list == \"0\" and proxy_mode ~= \"proxy\" and aliyun ~= nil) or (chn_list == \"0\" and gfw_list == \"0\" and proxy_mode == \"proxy\") then\n\t\t-- 中国列表+阿里 or 全局\n\t\t\turl = \"-x socks5h://\" .. socks_server .. \" \" .. url\n\t\telseif aliyun == nil then\n\t\t-- 其他代理模式+阿里以外网站\n\t\t\turl = \"-x socks5h://\" .. socks_server .. \" \" .. url\n\t\tend\n\tend\n\tlocal result = luci.sys.exec('/usr/bin/curl --connect-timeout 3 --max-time 5 -o /dev/null -I -sk ' .. url)\n\tlocal code = tonumber(luci.sys.exec(\"echo -n '\" .. result .. \"' | awk -F ':' '{print $1}'\") or \"0\")\n\tif code ~= 0 then\n\t\tlocal use_time_str = luci.sys.exec(\"echo -n '\" .. result .. \"' | awk -F ':' '{print $2}'\")\n\t\tlocal use_time = tonumber(use_time_str)\n\t\tif use_time then\n\t\t\tif use_time_str:find(\"%.\") then\n\t\t\t\te.use_time = string.format(\"%.2f\", use_time * 1000)\n\t\t\telse\n\t\t\t\te.use_time = string.format(\"%.2f\", use_time / 1000)\n\t\t\tend\n\t\t\te.ping_type = \"curl\"\n\t\tend\n\tend\n\thttp_write_json(e)\nend\n\nfunction ping_node()\n\tlocal index = http.formvalue(\"index\")\n\tlocal address = http.formvalue(\"address\")\n\tlocal port = http.formvalue(\"port\")\n\tlocal type = http.formvalue(\"type\") or \"icmp\"\n\tlocal e = {}\n\te.index = index\n\tif type == \"tcping\" and luci.sys.exec(\"echo -n $(command -v tcping)\") ~= \"\" then\n\t\tif api.is_ipv6(address) then\n\t\t\taddress = api.get_ipv6_only(address)\n\t\tend\n\t\te.ping = luci.sys.exec(string.format(\"echo -n $(tcping -q -c 1 -i 1 -t 2 -p %s %s 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print $2}') 2>/dev/null\", port, address))\n\telse\n\t\te.ping = luci.sys.exec(\"echo -n $(ping -c 1 -W 1 %q 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print $2}') 2>/dev/null\" % address)\n\tend\n\thttp_write_json(e)\nend\n\nfunction urltest_node()\n\tlocal index = http.formvalue(\"index\")\n\tlocal id = http.formvalue(\"id\")\n\tlocal e = {}\n\te.index = index\n\tlocal result = luci.sys.exec(string.format(\"/usr/share/passwall/test.sh url_test_node %s %s\", id, \"urltest_node\"))\n\tlocal code = tonumber(luci.sys.exec(\"echo -n '\" .. result .. \"' | awk -F ':' '{print $1}'\") or \"0\")\n\tif code ~= 0 then\n\t\tlocal use_time_str = luci.sys.exec(\"echo -n '\" .. result .. \"' | awk -F ':' '{print $2}'\")\n\t\tlocal use_time = tonumber(use_time_str)\n\t\tif use_time then\n\t\t\tif use_time_str:find(\"%.\") then\n\t\t\t\te.use_time = string.format(\"%.2f\", use_time * 1000)\n\t\t\telse\n\t\t\t\te.use_time = string.format(\"%.2f\", use_time / 1000)\n\t\t\tend\n\t\tend\n\tend\n\thttp_write_json(e)\nend\n\nfunction add_node()\n\tlocal redirect = http.formvalue(\"redirect\")\n\n\tlocal uuid = api.gen_short_uuid()\n\tuci:section(appname, \"nodes\", uuid)\n\n\tlocal group = http.formvalue(\"group\")\n\tif group and group ~= \"default\" then\n\t\tuci:set(appname, uuid, \"group\", group)\n\tend\n\n\tuci:set(appname, uuid, \"type\", \"Socks\")\n\n\tif redirect == \"1\" then\n\t\tapi.uci_save(uci, appname)\n\t\thttp.redirect(api.url(\"node_config\", uuid))\n\telse\n\t\tapi.uci_save(uci, appname, true, true)\n\t\thttp_write_json({result = uuid})\n\tend\nend\n\nfunction update_node()\n\tlocal id = http.formvalue(\"id\") -- Node id\n\tlocal data = http.formvalue(\"data\") -- json new Data\n\tif id and data then\n\t\tlocal data_t = jsonParse(data) or {}\n\t\tif next(data_t) then\n\t\t\tfor k, v in pairs(data_t) do\n\t\t\t\tuci:set(appname, id, k, v)\n\t\t\tend\n\t\t\tapi.uci_save(uci, appname)\n\t\t\thttp_write_json_ok()\n\t\t\treturn\n\t\tend\n\tend\n\thttp_write_json_error()\nend\n\nfunction set_node()\n\tlocal protocol = http.formvalue(\"protocol\")\n\tlocal section = http.formvalue(\"section\")\n\tuci:set(appname, \"@global[0]\", protocol .. \"_node\", section)\n\tif protocol == \"tcp\" then\n\t\tlocal node_protocol = uci:get(appname, section, \"protocol\")\n\t\tif node_protocol == \"_shunt\" then\n\t\t\tlocal type = uci:get(appname, section, \"type\")\n\t\t\tlocal dns_shunt = uci:get(appname, \"@global[0]\", \"dns_shunt\")\n\t\t\tlocal dns_key = (dns_shunt == \"smartdns\") and \"smartdns_dns_mode\" or \"dns_mode\"\n\t\t\tlocal dns_mode = uci:get(appname, \"@global[0]\", dns_key)\n\t\t\tlocal new_dns_mode = (type == \"Xray\") and \"xray\" or \"sing-box\"\n\t\t\tif dns_mode ~= new_dns_mode then\n\t\t\t\tuci:set(appname, \"@global[0]\", dns_key, new_dns_mode)\n\t\t\t\tuci:set(appname, \"@global[0]\", \"v2ray_dns_mode\", \"tcp\")\n\t\t\tend\n\t\tend\n\tend\n\tapi.uci_save(uci, appname, true, true)\n\thttp.redirect(api.url(\"log\"))\nend\n\nfunction copy_node()\n\tlocal section = http.formvalue(\"section\")\n\tlocal uuid = api.gen_short_uuid()\n\tuci:section(appname, \"nodes\", uuid)\n\tfor k, v in pairs(uci:get_all(appname, section)) do\n\t\tif not k:match(\"^%.\") and k ~= \"group\" then\n\t\t\tif k == \"remarks\" then v = (v or \"\") .. \"(1)\" end\n\t\t\tuci:set(appname, uuid, k, v)\n\t\tend\n\tend\n\tuci:set(appname, uuid, \"add_mode\", 1)\n\tapi.uci_save(uci, appname)\n\thttp.redirect(api.url(\"node_config\", uuid))\nend\n\nfunction clear_all_nodes()\n\tuci:set(appname, '@global[0]', \"enabled\", \"0\")\n\tuci:set(appname, '@global[0]', \"socks_enabled\", \"0\")\n\tuci:set(appname, '@haproxy_config[0]', \"balancing_enable\", \"0\")\n\tuci:delete(appname, '@global[0]', \"tcp_node\")\n\tuci:delete(appname, '@global[0]', \"udp_node\")\n\tuci:foreach(appname, \"socks\", function(t)\n\t\tuci:delete(appname, t[\".name\"])\n\t\tuci:set_list(appname, t[\".name\"], \"autoswitch_backup_node\", {})\n\tend)\n\tuci:foreach(appname, \"haproxy_config\", function(t)\n\t\tuci:delete(appname, t[\".name\"])\n\tend)\n\tuci:foreach(appname, \"acl_rule\", function(t)\n\t\tuci:delete(appname, t[\".name\"], \"tcp_node\")\n\t\tuci:delete(appname, t[\".name\"], \"udp_node\")\n\tend)\n\tuci:foreach(appname, \"nodes\", function(node)\n\t\tuci:delete(appname, node['.name'])\n\tend)\n\tuci:foreach(appname, \"subscribe_list\", function(t)\n\t\tuci:delete(appname, t[\".name\"], \"md5\")\n\t\tuci:delete(appname, t[\".name\"], \"chain_proxy\")\n\t\tuci:delete(appname, t[\".name\"], \"preproxy_node\")\n\t\tuci:delete(appname, t[\".name\"], \"to_node\")\n\tend)\n\n\tapi.uci_save(uci, appname, true, true)\nend\n\nfunction delete_select_nodes()\n\tlocal ids = http.formvalue(\"ids\")\n\tlocal redirect = http.formvalue(\"redirect\")\n\tstring.gsub(ids, '[^' .. \",\" .. ']+', function(w)\n\t\tlocal socks\n\t\tuci:foreach(appname, \"socks\", function(t)\n\t\t\tif t[\"node\"] == w then\n\t\t\t\tuci:delete(appname, t[\".name\"])\n\t\t\t\tsocks = \"Socks_\" .. t[\".name\"]\n\t\t\tend\n\t\t\tlocal changed = false\n\t\t\tlocal auto_switch_node_list = uci:get(appname, t[\".name\"], \"autoswitch_backup_node\") or {}\n\t\t\tfor i = #auto_switch_node_list, 1, -1 do\n\t\t\t\tif w == auto_switch_node_list[i] then\n\t\t\t\t\ttable.remove(auto_switch_node_list, i)\n\t\t\t\t\tchanged = true\n\t\t\t\tend\n\t\t\tend\n\t\t\tif changed then\n\t\t\t\tuci:set_list(appname, t[\".name\"], \"autoswitch_backup_node\", auto_switch_node_list)\n\t\t\tend\n\t\tend)\n\t\tlocal tcp_node = uci:get(appname, \"@global[0]\", \"tcp_node\") or \"\"\n\t\tif tcp_node == w or tcp_node == socks then\n\t\t\tuci:delete(appname, '@global[0]', \"tcp_node\")\n\t\tend\n\t\tlocal udp_node = uci:get(appname, \"@global[0]\", \"udp_node\") or \"\"\n\t\tif udp_node == w or udp_node == socks then\n\t\t\tuci:delete(appname, '@global[0]', \"udp_node\")\n\t\tend\n\t\tuci:foreach(appname, \"haproxy_config\", function(t)\n\t\t\tif t[\"lbss\"] == w then\n\t\t\t\tuci:delete(appname, t[\".name\"])\n\t\t\tend\n\t\tend)\n\t\tuci:foreach(appname, \"acl_rule\", function(t)\n\t\t\tif t[\"tcp_node\"] == w or t[\"tcp_node\"] == socks then\n\t\t\t\tuci:delete(appname, t[\".name\"], \"tcp_node\")\n\t\t\tend\n\t\t\tif t[\"udp_node\"] == w or t[\"udp_node\"] == socks then\n\t\t\t\tuci:delete(appname, t[\".name\"], \"udp_node\")\n\t\t\tend\n\t\tend)\n\t\tuci:foreach(appname, \"nodes\", function(t)\n\t\t\tif t[\"preproxy_node\"] == w then\n\t\t\t\tuci:delete(appname, t[\".name\"], \"preproxy_node\")\n\t\t\t\tuci:delete(appname, t[\".name\"], \"chain_proxy\")\n\t\t\tend\n\t\t\tif t[\"to_node\"] == w then\n\t\t\t\tuci:delete(appname, t[\".name\"], \"to_node\")\n\t\t\t\tuci:delete(appname, t[\".name\"], \"chain_proxy\")\n\t\t\tend\n\t\t\tlocal list_name = t[\"urltest_node\"] and \"urltest_node\" or (t[\"balancing_node\"] and \"balancing_node\")\n\t\t\tif list_name then\n\t\t\t\tlocal nodes = uci:get_list(appname, t[\".name\"], list_name)\n\t\t\t\tif nodes then\n\t\t\t\t\tlocal changed = false\n\t\t\t\t\tlocal new_nodes = {}\n\t\t\t\t\tfor _, node in ipairs(nodes) do\n\t\t\t\t\t\tif node ~= w and node ~= socks then\n\t\t\t\t\t\t\ttable.insert(new_nodes, node)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tchanged = true\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tif changed then\n\t\t\t\t\t\tuci:set_list(appname, t[\".name\"], list_name, new_nodes)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif t[\"fallback_node\"] == w or t[\"fallback_node\"] == socks then\n\t\t\t\tuci:delete(appname, t[\".name\"], \"fallback_node\")\n\t\t\tend\n\t\tend)\n\t\tuci:foreach(appname, \"subscribe_list\", function(t)\n\t\t\tif t[\"preproxy_node\"] == w then\n\t\t\t\tuci:delete(appname, t[\".name\"], \"preproxy_node\")\n\t\t\t\tuci:delete(appname, t[\".name\"], \"chain_proxy\")\n\t\t\tend\n\t\t\tif t[\"to_node\"] == w then\n\t\t\t\tuci:delete(appname, t[\".name\"], \"to_node\")\n\t\t\t\tuci:delete(appname, t[\".name\"], \"chain_proxy\")\n\t\t\tend\n\t\tend)\n\t\tif (uci:get(appname, w, \"add_mode\") or \"0\") == \"2\" then\n\t\t\tlocal group = uci:get(appname, w, \"group\") or \"\"\n\t\t\tif group ~= \"\" then\n\t\t\t\tuci:foreach(appname, \"subscribe_list\", function(t)\n\t\t\t\t\tif t[\"remark\"] == group then\n\t\t\t\t\t\tuci:delete(appname, t[\".name\"], \"md5\")\n\t\t\t\t\tend\n\t\t\t\tend)\n\t\t\tend\n\t\tend\n\t\tuci:delete(appname, w)\n\tend)\n\tif redirect == \"1\" then\n\t\tapi.uci_save(uci, appname)\n\t\thttp.redirect(api.url(\"node_list\"))\n\telse\n\t\tapi.uci_save(uci, appname, true, true)\n\tend\nend\n\nfunction get_node()\n\tlocal id = http.formvalue(\"id\")\n\tlocal result = {}\n\tlocal show_node_info = api.uci_get_type(\"global_other\", \"show_node_info\", \"0\")\n\n\tlocal function add_is_ipv6_key(o)\n\t\tif o and o.address and show_node_info == \"1\" then\n\t\t\tlocal f = api.get_ipv6_full(o.address)\n\t\t\tif f ~= \"\" then\n\t\t\t\to.ipv6 = true\n\t\t\t\to.full_address = f\n\t\t\tend\n\t\tend\n\tend\n\n\tif id then\n\t\tresult = uci:get_all(appname, id)\n\t\tadd_is_ipv6_key(result)\n\telse\n\t\tlocal default_nodes = {}\n\t\tlocal other_nodes = {}\n\t\tuci:foreach(appname, \"nodes\", function(t)\n\t\t\tadd_is_ipv6_key(t)\n\t\t\tif not t.group or t.group == \"\" then\n\t\t\t\tdefault_nodes[#default_nodes + 1] = t\n\t\t\telse\n\t\t\t\tother_nodes[#other_nodes + 1] = t\n\t\t\tend\n\t\tend)\n\t\tfor i = 1, #default_nodes do result[#result + 1] = default_nodes[i] end\n\t\tfor i = 1, #other_nodes do result[#result + 1] = other_nodes[i] end\n\tend\n\thttp_write_json(result)\nend\n\nfunction save_node_order()\n\tlocal ids = http.formvalue(\"ids\") or \"\"\n\tlocal new_order = {}\n\tfor id in ids:gmatch(\"([^,]+)\") do\n\t\tnew_order[#new_order + 1] = id\n\tend\n\tfor idx, name in ipairs(new_order) do\n\t\tluci.sys.call(string.format(\"uci -q reorder %s.%s=%d\", appname, name, idx - 1))\n\tend\n\tapi.sh_uci_commit(appname)\n\thttp_write_json({ status = \"ok\" })\nend\n\nfunction reassign_group()\n\tlocal ids = http.formvalue(\"ids\") or \"\"\n\tlocal group = http.formvalue(\"group\") or \"default\"\n\tfor id in ids:gmatch(\"([^,]+)\") do\n\t\tif group ~=\"\" and group ~= \"default\" then\n\t\t\tapi.sh_uci_set(appname, id, \"group\", group)\n\t\telse\n\t\t\tapi.sh_uci_del(appname, id, \"group\")\n\t\tend\n\tend\n\tapi.sh_uci_commit(appname)\n\thttp_write_json({ status = \"ok\" })\nend\n\nfunction save_node_list_opt()\n\tlocal option = http.formvalue(\"option\") or \"\"\n\tlocal value = http.formvalue(\"value\") or \"\"\n\tif option ~= \"\" then\n\t\tapi.sh_uci_set(appname, \"@global_other[0]\", option, value, true)\n\tend\n\thttp_write_json({ status = \"ok\" })\nend\n\nfunction update_rules()\n\tlocal update = http.formvalue(\"update\") or \"\"\n\tif update == \"\" then\n\t\thttp_write_json_error({ message = \"missing update target\" })\n\t\treturn\n\tend\n\tluci.sys.call(\"lua /usr/share/passwall/rule_update.lua log '\" .. update .. \"' > /dev/null 2>&1 &\")\n\thttp_write_json()\nend\n\nfunction rollback_rules()\n\tlocal arg_type = http.formvalue(\"type\")\n\tlocal rules = http.formvalue(\"rules\") or \"\"\n\tif arg_type ~= \"geoip\" and arg_type ~= \"geosite\" then\n\t\thttp_write_json_error()\n\t\treturn\n\tend\n\tlocal bak_dir = \"/tmp/bak_v2ray/\"\n\tlocal geo_dir = (uci:get(appname, \"@global_rules[0]\", \"v2ray_location_asset\") or \"/usr/share/v2ray/\")\n\tlocal geo2rule = uci:get(appname, \"@global_rules[0]\", \"geo2rule\") or \"0\"\n\tfs.move(bak_dir .. arg_type .. \".dat\", geo_dir .. arg_type .. \".dat\")\n\tfs.rmdir(bak_dir)\n\tif geo2rule == \"1\" and rules ~= \"\" then\n\t\tluci.sys.call(\"lua /usr/share/passwall/rule_update.lua log '\" .. rules .. \"' rollback > /dev/null\")\n\tend\n\thttp_write_json_ok()\nend\n\nfunction server_user_status()\n\tlocal e = {}\n\te.index = http.formvalue(\"index\")\n\te.status = luci.sys.call(string.format(\"/bin/busybox top -bn1 | grep -v 'grep' | grep '%s/bin/' | grep -i '%s' >/dev/null\", appname .. \"_server\", http.formvalue(\"id\"))) == 0\n\thttp_write_json(e)\nend\n\nfunction server_user_log()\n\tlocal id = http.formvalue(\"id\")\n\tif fs.access(\"/tmp/etc/passwall_server/\" .. id .. \".log\") then\n\t\tlocal content = luci.sys.exec(\"cat /tmp/etc/passwall_server/\" .. id .. \".log\")\n\t\tcontent = content:gsub(\"\\n\", \"<br />\")\n\t\thttp.write(content)\n\telse\n\t\thttp.write(string.format(\"<script>alert('%s');window.close();</script>\", i18n.translate(\"Not enabled log\")))\n\tend\nend\n\nfunction server_get_log()\n\thttp.write(luci.sys.exec(\"[ -f '/tmp/log/passwall_server.log' ] && cat /tmp/log/passwall_server.log\"))\nend\n\nfunction server_clear_log()\n\tluci.sys.call(\"echo '' > /tmp/log/passwall_server.log\")\nend\n\nfunction app_check()\n\tlocal json = api.to_check_self()\n\thttp_write_json(json)\nend\n\nfunction com_check(comname)\n\tlocal json = api.to_check(\"\",comname)\n\thttp_write_json(json)\nend\n\nfunction com_update(comname)\n\tlocal json = nil\n\tlocal task = http.formvalue(\"task\")\n\tif task == \"extract\" then\n\t\tjson = api.to_extract(comname, http.formvalue(\"file\"), http.formvalue(\"subfix\"))\n\telseif task == \"move\" then\n\t\tjson = api.to_move(comname, http.formvalue(\"file\"))\n\telse\n\t\tjson = api.to_download(comname, http.formvalue(\"url\"), http.formvalue(\"size\"))\n\tend\n\n\thttp_write_json(json)\nend\n\nfunction read_rulelist()\n\tlocal rule_type = http.formvalue(\"type\")\n\tlocal rule_path\n\tif rule_type == \"gfw\" then\n\t\trule_path = \"/usr/share/passwall/rules/gfwlist\"\n\telseif rule_type == \"chn\" then\n\t\trule_path = \"/usr/share/passwall/rules/chnlist\"\n\telseif rule_type == \"chnroute\" then\n\t\trule_path = \"/usr/share/passwall/rules/chnroute\"\n\telse\n\t\thttp.status(400, \"Invalid rule type\")\n\t\treturn\n\tend\n\tif fs.access(rule_path) then\n\t\thttp.prepare_content(\"text/plain\")\n\t\thttp.write(fs.readfile(rule_path))\n\tend\nend\n\nlocal backup_files = {\n    \"/etc/config/passwall\",\n    \"/etc/config/passwall_server\",\n    \"/usr/share/passwall/rules/block_host\",\n    \"/usr/share/passwall/rules/block_ip\",\n    \"/usr/share/passwall/rules/direct_host\",\n    \"/usr/share/passwall/rules/direct_ip\",\n    \"/usr/share/passwall/rules/proxy_host\",\n    \"/usr/share/passwall/rules/proxy_ip\"\n}\n\nfunction create_backup()\n\tlocal date = os.date(\"%y%m%d%H%M\")\n\tlocal tar_file = \"/tmp/passwall-\" .. date .. \"-backup.tar.gz\"\n\tfs.remove(tar_file)\n\tlocal cmd = \"tar -czf \" .. tar_file .. \" \" .. table.concat(backup_files, \" \")\n\tluci.sys.call(cmd)\n\thttp.header(\"Content-Disposition\", \"attachment; filename=passwall-\" .. date .. \"-backup.tar.gz\")\n\thttp.header(\"X-Backup-Filename\", \"passwall-\" .. date .. \"-backup.tar.gz\")\n\thttp.prepare_content(\"application/octet-stream\")\n\thttp.write(fs.readfile(tar_file))\n\tfs.remove(tar_file)\nend\n\nfunction restore_backup()\n\tlocal result = { status = \"error\", message = \"unknown error\" }\n\tlocal ok, err = pcall(function()\n\t\tlocal filename = http.formvalue(\"filename\")\n\t\tlocal chunk = http.formvalue(\"chunk\")\n\t\tlocal chunk_index = tonumber(http.formvalue(\"chunk_index\") or \"-1\")\n\t\tlocal total_chunks = tonumber(http.formvalue(\"total_chunks\") or \"-1\")\n\t\tif not filename then\n\t\t\tresult = { status = \"error\", message = \"Missing filename\" }\n\t\t\treturn\n\t\tend\n\t\tif not chunk then\n\t\t\tresult = { status = \"error\", message = \"Missing chunk data\" }\n\t\t\treturn\n\t\tend\n\t\tlocal file_path = \"/tmp/\" .. filename\n\t\tlocal decoded = nixio.bin.b64decode(chunk)\n\t\tif not decoded then\n\t\t\tresult = { status = \"error\", message = \"Base64 decode failed\" }\n\t\t\treturn\n\t\tend\n\t\tlocal fp = io.open(file_path, \"a+\")\n\t\tif not fp then\n\t\t\tresult = { status = \"error\", message = \"Failed to open file: \" .. file_path }\n\t\t\treturn\n\t\tend\n\t\tfp:write(decoded)\n\t\tfp:close()\n\t\tif chunk_index + 1 == total_chunks then\n\t\t\tluci.sys.call(\"echo '' > /tmp/log/passwall.log\")\n\t\t\tapi.log(\" * PassWall 配置文件上传成功…\")\n\t\t\tlocal temp_dir = '/tmp/passwall_bak'\n\t\t\tluci.sys.call(\"mkdir -p \" .. temp_dir)\n\t\t\tif luci.sys.call(\"tar -xzf \" .. file_path .. \" -C \" .. temp_dir) == 0 then\n\t\t\t\tfor _, backup_file in ipairs(backup_files) do\n\t\t\t\t\tlocal temp_file = temp_dir .. backup_file\n\t\t\t\t\tif fs.access(temp_file) then\n\t\t\t\t\t\tluci.sys.call(\"cp -f \" .. temp_file .. \" \" .. backup_file)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tapi.log(\" * PassWall 配置还原成功…\")\n\t\t\t\tapi.log(\" * 重启 PassWall 服务中…\\n\")\n\t\t\t\tluci.sys.call('/etc/init.d/passwall restart > /dev/null 2>&1 &')\n\t\t\t\tluci.sys.call('/etc/init.d/passwall_server restart > /dev/null 2>&1 &')\n\t\t\t\tresult = { status = \"success\", message = \"Upload completed\", path = file_path }\n\t\t\telse\n\t\t\t\tapi.log(\" * PassWall 配置文件解压失败，请重试！\")\n\t\t\t\tresult = { status = \"error\", message = \"Decompression failed\" }\n\t\t\tend\n\t\t\tluci.sys.call(\"rm -rf \" .. temp_dir)\n\t\t\tfs.remove(file_path)\n\t\telse\n\t\t\tresult = { status = \"success\", message = \"Chunk received\" }\n\t\tend\n\tend)\n\tif not ok then\n\t\tresult = { status = \"error\", message = tostring(err) }\n\tend\n\thttp_write_json(result)\nend\n\nfunction geo_view()\n\tlocal action = http.formvalue(\"action\")\n\tlocal value = http.formvalue(\"value\")\n\tif not value or value == \"\" then\n\t\thttp.prepare_content(\"text/plain\")\n\t\thttp.write(i18n.translate(\"Please enter query content!\"))\n\t\treturn\n\tend\n\tlocal function get_rules(str, type)\n\t\tlocal rules_id = {}\n\t\tuci:foreach(appname, \"shunt_rules\", function(s)\n\t\t\tlocal list\n\t\t\tif type == \"geoip\" then list = s.ip_list else list = s.domain_list end\n\t\t\tfor line in string.gmatch((list or \"\"), \"[^\\r\\n]+\") do\n\t\t\t\tif line ~= \"\" and not line:find(\"#\") then\n\t\t\t\t\tlocal prefix, main = line:match(\"^(.-):(.*)\")\n\t\t\t\t\tif not main then main = line end\n\t\t\t\t\tif type == \"geoip\" and (api.datatypes.ipaddr(str) or api.datatypes.ip6addr(str)) then\n\t\t\t\t\t\tif main:find(str, 1, true) then rules_id[#rules_id + 1] = s[\".name\"] end\n\t\t\t\t\telse\n\t\t\t\t\t\tif main == str then rules_id[#rules_id + 1] = s[\".name\"] end\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend)\n\t\treturn rules_id\n\tend\n\tlocal geo_dir = (uci:get(appname, \"@global_rules[0]\", \"v2ray_location_asset\") or \"/usr/share/v2ray/\"):match(\"^(.*)/\")\n\tlocal geosite_path = geo_dir .. \"/geosite.dat\"\n\tlocal geoip_path = geo_dir .. \"/geoip.dat\"\n\tlocal geo_type, file_path, cmd\n\tlocal geo_string = \"\"\n\tlocal bin = api.finded_com(\"geoview\")\n\tif action == \"lookup\" then\n\t\tif api.datatypes.ipaddr(value) or api.datatypes.ip6addr(value) then\n\t\t\tgeo_type, file_path = \"geoip\", geoip_path\n\t\telse\n\t\t\tgeo_type, file_path = \"geosite\", geosite_path\n\t\tend\n\t\tcmd = string.format(\"%q -type %q -action lookup -input %q -value %q -lowmem=true\", bin, geo_type, file_path, value)\n\t\tgeo_string = luci.sys.exec(cmd):lower()\n\t\tif geo_string ~= \"\" then\n\t\t\tlocal lines, rules, seen = {}, {}, {}\n\t\t\tfor line in geo_string:gmatch(\"([^\\n]+)\") do\n\t\t\t\tlines[#lines + 1] = geo_type .. \":\" .. line\n\t\t\t\tfor _, r in ipairs(get_rules(line, geo_type) or {}) do\n\t\t\t\t\tif not seen[r] then seen[r] = true; rules[#rules + 1] = r end\n\t\t\t\tend\n\t\t\tend\n\t\t\tfor _, r in ipairs(get_rules(value, geo_type) or {}) do\n\t\t\t\tif not seen[r] then seen[r] = true; rules[#rules + 1] = r end\n\t\t\tend\n\t\t\tgeo_string = table.concat(lines, \"\\n\")\n\t\t\tif #rules > 0 then\n\t\t\t\tgeo_string = geo_string .. \"\\n--------------------\\n\"\n\t\t\t\tgeo_string = geo_string .. i18n.translate(\"Rules containing this value:\") .. \"\\n\"\n\t\t\t\tgeo_string = geo_string .. table.concat(rules, \"\\n\")\n\t\t\tend\n\t\tend\n\telseif action == \"extract\" then\n\t\tlocal prefix, list = value:match(\"^(geoip:)(.*)$\")\n\t\tif not prefix then\n\t\t\tprefix, list = value:match(\"^(geosite:)(.*)$\")\n\t\tend\n\t\tif prefix and list and list ~= \"\" then\n\t\t\tgeo_type = prefix:sub(1, -2)\n\t\t\tfile_path = (geo_type == \"geoip\") and geoip_path or geosite_path\n\t\t\tcmd = string.format(\"%q -type %q -action extract -input %q -list %q -lowmem=true\", bin, geo_type, file_path, list)\n\t\t\tgeo_string = luci.sys.exec(cmd)\n\t\tend\n\tend\n\thttp.prepare_content(\"text/plain\")\n\tif geo_string and geo_string ~=\"\" then\n\t\thttp.write(geo_string)\n\telse\n\t\thttp.write(i18n.translate(\"No results were found!\"))\n\tend\nend\n\nfunction subscribe_del_node()\n\tlocal remark = http.formvalue(\"remark\")\n\tif remark and remark ~= \"\" then\n\t\tluci.sys.call(\"lua /usr/share/\" .. appname .. \"/subscribe.lua truncate \" .. luci.util.shellquote(remark) .. \" > /dev/null 2>&1\")\n\tend\n\thttp.status(200, \"OK\")\nend\n\nfunction subscribe_del_all()\n\tluci.sys.call(\"lua /usr/share/\" .. appname .. \"/subscribe.lua truncate > /dev/null 2>&1\")\n\thttp.status(200, \"OK\")\nend\n\nfunction subscribe_manual()\n\tlocal section = http.formvalue(\"section\") or \"\"\n\tlocal current_url = http.formvalue(\"url\") or \"\"\n\tif section == \"\" or current_url == \"\" then\n\t\thttp_write_json({ success = false, msg = \"Missing section or URL, skip.\" })\n\t\treturn\n\tend\n\tlocal uci_url = api.sh_uci_get(appname, section, \"url\")\n\tif not uci_url or uci_url == \"\" then\n\t\thttp_write_json({ success = false, msg = i18n.translate(\"Please save and apply before manually subscribing.\") })\n\t\treturn\n\tend\n\tif uci_url ~= current_url then\n\t\tapi.sh_uci_set(appname, section, \"url\", current_url, true)\n\tend\n\tluci.sys.call(\"lua /usr/share/\" .. appname .. \"/subscribe.lua start \" .. section .. \" manual >/dev/null 2>&1 &\")\n\thttp_write_json({ success = true, msg = \"Subscribe triggered.\" })\nend\n\nfunction subscribe_manual_all()\n\tlocal sections = http.formvalue(\"sections\") or \"\"\n\tlocal urls = http.formvalue(\"urls\") or \"\"\n\tif sections == \"\" or urls == \"\" then\n\t\thttp_write_json({ success = false, msg = \"Missing section or URL, skip.\" })\n\t\treturn\n\tend\n\tlocal section_list = util.split(sections, \",\")\n\tlocal url_list = util.split(urls, \",\")\n\t-- 检查是否存在未保存配置\n\tfor i, section in ipairs(section_list) do\n\t\tlocal uci_url = api.sh_uci_get(appname, section, \"url\")\n\t\tif not uci_url or uci_url == \"\" then\n\t\t\thttp_write_json({ success = false, msg = i18n.translate(\"Please save and apply before manually subscribing.\") })\n\t\t\treturn\n\t\tend\n\tend\n\t-- 保存有变动的url\n\tfor i, section in ipairs(section_list) do\n\t\tlocal current_url = url_list[i] or \"\"\n\t\tlocal uci_url = api.sh_uci_get(appname, section, \"url\")\n\t\tif current_url ~= \"\" and uci_url ~= current_url then\n\t\t\tapi.sh_uci_set(appname, section, \"url\", current_url, true)\n\t\tend\n\tend\n\tluci.sys.call(\"lua /usr/share/\" .. appname .. \"/subscribe.lua start all manual >/dev/null 2>&1 &\")\n\thttp_write_json({ success = true, msg = \"Subscribe triggered.\" })\nend\n\nfunction flush_set()\n\tlocal redirect = http.formvalue(\"redirect\") or \"0\"\n\tlocal reload = http.formvalue(\"reload\") or \"0\"\n\tif reload == \"1\" then\n\t\tuci:set(appname, '@global[0]', \"flush_set\", \"1\")\n\t\tapi.uci_save(uci, appname, true, true)\n\telse\n\t\tapi.sh_uci_set(appname, \"@global[0]\", \"flush_set\", \"1\", true)\n\tend\n\tif redirect == \"1\" then\n\t\thttp.redirect(api.url(\"log\"))\n\tend\nend\n\nfunction fetch_certsha256()\n\tlocal id = http.formvalue(\"id\") or \"\"\n\tlocal address = (id ~= \"\") and uci:get(appname, id, \"address\") or \"\"\n\tlocal port = (id ~= \"\") and uci:get(appname, id, \"port\") or 0\n\tif id == \"\" or address == \"\" or not api.datatypes.hostname(address) or port == 0 then\n\t\thttp_write_json_error()\n\t\treturn\n\tend\n\tlocal data = api.fetch_cert_sha256(address, port, 5)\n\thttp_write_json(data ~= \"\" and { code = 1, data = data } or { code = 0 })\nend\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/acl.lua",
    "content": "local api = require \"luci.passwall.api\"\nlocal appname = \"passwall\"\nlocal sys = api.sys\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\ns = m:section(TypedSection, \"global\", translate(\"ACLs\"), \"<font color='red'>\" .. translate(\"ACLs is a tools which used to designate specific IP proxy mode.\") .. \"</font>\")\ns.anonymous = true\n\no = s:option(Flag, \"acl_enable\", translate(\"Main switch\"))\no.rmempty = false\no.default = false\n\n-- [[ ACLs Settings ]]--\ns = m:section(TypedSection, \"acl_rule\")\ns.template = \"cbi/tblsection\"\ns.sortable = true\ns.anonymous = true\ns.addremove = true\ns.extedit = api.url(\"acl_config\", \"%s\")\nfunction s.create(e, t)\n\tt = TypedSection.create(e, t)\n\tluci.http.redirect(e.extedit:format(t))\nend\nfunction s.remove(e, t)\n\tsys.call(\"rm -rf /tmp/etc/passwall_tmp/dns_\" .. t .. \"*\")\n\tTypedSection.remove(e, t)\nend\n\n---- Enable\no = s:option(Flag, \"enabled\", translate(\"Enable\"))\no.default = 1\no.rmempty = false\n\n---- Remarks\no = s:option(Value, \"remarks\", translate(\"Remarks\"))\no.rmempty = true\n\nlocal mac_t = {}\nsys.net.mac_hints(function(e, t)\n\tmac_t[e] = {\n\t\tip = t,\n\t\tmac = e\n\t}\nend)\n\no = s:option(DummyValue, \"sources\", translate(\"Source\"))\no.rawhtml = true\no.cfgvalue = function(t, n)\n\tlocal e = ''\n\tlocal v = Value.cfgvalue(t, n) or '-'\n\tstring.gsub(v, '[^' .. \" \" .. ']+', function(w)\n\t\tlocal a = w\n\t\tif mac_t[w] then\n\t\t\ta = a .. ' (' .. mac_t[w].ip .. ')'\n\t\tend\n\t\tif #e > 0 then\n\t\t\te = e .. \"<br />\"\n\t\tend\n\t\te = e .. a\n\tend)\n\treturn e\nend\n\no = s:option(DummyValue, \"interface\", translate(\"Source Interface\"))\no.cfgvalue = function(t, n)\n\tlocal v = Value.cfgvalue(t, n) or '-'\n\treturn v\nend\n\n--[[\n---- TCP No Redir Ports\no = s:option(Value, \"tcp_no_redir_ports\", translate(\"TCP No Redir Ports\"))\no.default = \"default\"\no:value(\"disable\", translate(\"No patterns are used\"))\no:value(\"default\", translate(\"Default\"))\no:value(\"1:65535\", translate(\"All\"))\n\n---- UDP No Redir Ports\no = s:option(Value, \"udp_no_redir_ports\", translate(\"UDP No Redir Ports\"))\no.default = \"default\"\no:value(\"disable\", translate(\"No patterns are used\"))\no:value(\"default\", translate(\"Default\"))\no:value(\"1:65535\", translate(\"All\"))\n\n---- TCP Redir Ports\no = s:option(Value, \"tcp_redir_ports\", translate(\"TCP Redir Ports\"))\no.default = \"default\"\no:value(\"default\", translate(\"Default\"))\no:value(\"1:65535\", translate(\"All\"))\no:value(\"80,443\", \"80,443\")\no:value(\"80:65535\", \"80 \" .. translate(\"or more\"))\no:value(\"1:443\", \"443 \" .. translate(\"or less\"))\n\n---- UDP Redir Ports\no = s:option(Value, \"udp_redir_ports\", translate(\"UDP Redir Ports\"))\no.default = \"default\"\no:value(\"default\", translate(\"Default\"))\no:value(\"1:65535\", translate(\"All\"))\no:value(\"53\", \"53\")\n]]--\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/acl_config.lua",
    "content": "local api = require \"luci.passwall.api\"\nlocal appname = \"passwall\"\n\nm = Map(appname)\nm.redirect = api.url(\"acl\")\napi.set_apply_on_parse(m)\n\nif not arg[1] or not m:get(arg[1]) then\n\tluci.http.redirect(m.redirect)\nend\n\nm:append(Template(appname .. \"/cbi/nodes_listvalue_com\"))\n\nlocal fs = api.fs\nlocal sys = api.sys\nlocal has_singbox = api.finded_com(\"sing-box\")\nlocal has_xray = api.finded_com(\"xray\")\nlocal has_gfwlist = fs.access(\"/usr/share/passwall/rules/gfwlist\")\nlocal has_chnlist = fs.access(\"/usr/share/passwall/rules/chnlist\")\nlocal has_chnroute = fs.access(\"/usr/share/passwall/rules/chnroute\")\n\nlocal port_validate = function(self, value, t)\n\treturn value:gsub(\"-\", \":\")\nend\n\nlocal nodes_table = {}\nfor _, e in ipairs(api.get_valid_nodes()) do\n\tnodes_table[#nodes_table + 1] = e\nend\n\nlocal normal_list = {}\nfor _, v in pairs(nodes_table) do\n\tif v.node_type == \"normal\" then\n\t\tnormal_list[#normal_list + 1] = v\n\tend\nend\n\nlocal socks_list = {}\nm.uci:foreach(appname, \"socks\", function(s)\n\tif s.enabled == \"1\" and s.node then\n\t\tsocks_list[#socks_list + 1] = {\n\t\t\tid = \"Socks_\" .. s[\".name\"],\n\t\t\tremark = translate(\"Socks Config\") .. \" \" .. string.format(\"[%s %s]\", s.port, translate(\"Port\")),\n\t\t\tgroup = \"Socks\"\n\t\t}\n\tend\nend)\n\nlocal dynamicList_write = function(self, section, value)\n\tlocal t = {}\n\tlocal t2 = {}\n\tif type(value) == \"table\" then\n\t\tlocal x\n\t\tfor _, x in ipairs(value) do\n\t\t\tif x and #x > 0 then\n\t\t\t\tif not t2[x] then\n\t\t\t\t\tt2[x] = x\n\t\t\t\t\tt[#t+1] = x\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\telse\n\t\tt = { value }\n\tend\n\tt = table.concat(t, \" \")\n\treturn DynamicList.write(self, section, t)\nend\n\n-- [[ ACLs Settings ]]--\ns = m:section(NamedSection, arg[1], translate(\"ACLs\"), translate(\"ACLs\"))\ns.addremove = false\ns.dynamic = false\n\n---- Enable\no = s:option(Flag, \"enabled\", translate(\"Enable\"))\no.default = 1\no.rmempty = false\n\n---- Remarks\no = s:option(Value, \"remarks\", translate(\"Remarks\"))\no.default = arg[1]\no.rmempty = false\n\no = s:option(Value, \"interface\", translate(\"Source Interface\"))\no:value(\"\", translate(\"All\"))\n-- Populate with actual kernel network devices instead of UCI interface names,\n-- because the backend (nftables iifname / iptables -i) matches kernel device names.\ndo\n\tlocal nfs = require \"nixio.fs\"\n\tlocal _cursor = require(\"luci.model.uci\").cursor()\n\tlocal _sysnet = \"/sys/class/net/\"\n\n\t-- Map UCI interface names to their device names and vice versa\n\tlocal _iface_to_dev = {}\n\tlocal _dev_to_ifaces = {}\n\tlocal _iface_proto = {}\n\t_cursor:foreach(\"network\", \"interface\", function(sec)\n\t\tlocal name = sec[\".name\"]\n\t\tif name ~= \"loopback\" then\n\t\t\t_iface_proto[name] = sec.proto\n\t\t\tif sec.device then\n\t\t\t\t_iface_to_dev[name] = sec.device\n\t\t\t\t_dev_to_ifaces[sec.device] = _dev_to_ifaces[sec.device] or {}\n\t\t\t\ttable.insert(_dev_to_ifaces[sec.device], name)\n\t\t\tend\n\t\tend\n\tend)\n\n\t-- Classify device type using sysfs attributes\n\tlocal function classify_sysfs(dev)\n\t\tif nfs.stat(_sysnet .. dev .. \"/bridge\", \"type\") == \"dir\" then\n\t\t\treturn translate(\"Bridge\")\n\t\telseif nfs.stat(_sysnet .. dev .. \"/wireless\", \"type\") == \"dir\" then\n\t\t\treturn translate(\"Wireless Adapter\")\n\t\telseif dev:match(\"^tun\") or dev:match(\"^tap\") or dev:match(\"^wg\") or dev:match(\"^ppp\") then\n\t\t\treturn translate(\"Tunnel Interface\")\n\t\telse\n\t\t\treturn translate(\"Ethernet Adapter\")\n\t\tend\n\tend\n\n\t-- Classify offline UCI interfaces by config hints\n\tlocal function classify_uci(dev_name, proto)\n\t\tif dev_name and dev_name:match(\"^br%-\") then\n\t\t\treturn translate(\"Bridge\")\n\t\telseif proto == \"wireguard\" or proto == \"pppoe\" or proto == \"pptp\" or proto == \"l2tp\" then\n\t\t\treturn translate(\"Tunnel Interface\")\n\t\telse\n\t\t\treturn translate(\"Interface\")\n\t\tend\n\tend\n\n\tlocal _seen = {}\n\tlocal _devices = {}\n\n\t-- Active kernel devices from /sys/class/net/.\n\t-- Skip bridge member ports (/master) and DSA master devices (/dsa) because\n\t-- nftables iifname matches the parent bridge for routed traffic, not\n\t-- individual member ports. Also skip internal virtual devices.\n\tlocal _iter = nfs.dir(_sysnet)\n\tif _iter then\n\t\tfor dev in _iter do\n\t\t\tif dev ~= \"lo\"\n\t\t\t\tand not dev:match(\"^veth\")\n\t\t\t\tand not dev:match(\"^ifb\")\n\t\t\t\tand not dev:match(\"^gre\")\n\t\t\t\tand not dev:match(\"^sit\")\n\t\t\t\tand not dev:match(\"^ip6tnl\")\n\t\t\t\tand not dev:match(\"^erspan\")\n\t\t\t\tand not nfs.stat(_sysnet .. dev .. \"/master\", \"type\")\n\t\t\t\tand not nfs.stat(_sysnet .. dev .. \"/dsa\", \"type\")\n\t\t\tthen\n\t\t\t\tlocal dtype = classify_sysfs(dev)\n\t\t\t\tlocal label = dtype .. ': \"' .. dev .. '\"'\n\t\t\t\tif _dev_to_ifaces[dev] then\n\t\t\t\t\tlabel = label .. \" (\" .. table.concat(_dev_to_ifaces[dev], \", \") .. \")\"\n\t\t\t\tend\n\t\t\t\t_devices[#_devices + 1] = { name = dev, label = label, sort = dtype .. \":\" .. dev }\n\t\t\t\t_seen[dev] = true\n\t\t\tend\n\t\tend\n\tend\n\n\t-- UCI interfaces whose device does not currently exist (down tunnels, VPNs, etc.).\n\t-- Stored by UCI name since the kernel device is not available yet.\n\t-- Dedup by device: if two interfaces share a device, only one is shown.\n\tfor iface, dev in pairs(_iface_to_dev) do\n\t\tif not _seen[dev] then\n\t\t\tlocal dtype = classify_uci(dev, _iface_proto[iface])\n\t\t\tlocal label = dtype .. ': \"' .. iface .. '\"'\n\t\t\t-- Sort offline entries after active devices\n\t\t\t_devices[#_devices + 1] = { name = iface, label = label, sort = \"zzz:\" .. iface }\n\t\t\t_seen[dev] = true\n\t\tend\n\tend\n\n\ttable.sort(_devices, function(a, b) return a.sort < b.sort end)\n\tfor _, d in ipairs(_devices) do\n\t\to:value(d.name, d.label)\n\tend\nend\n\no.validate = function(self, value, section)\n\tif value == \"\" or value:match(\"^[a-zA-Z0-9][a-zA-Z0-9%.%_%-]*$\") then\n\t\treturn value\n\tend\n\treturn nil, translate(\"Invalid interface name\")\nend\n\nlocal mac_t = {}\nsys.net.mac_hints(function(e, t)\n\tmac_t[#mac_t + 1] = {\n\t\tip = t,\n\t\tmac = e\n\t}\nend)\ntable.sort(mac_t, function(a,b)\n\tif #a.ip < #b.ip then\n\t\treturn true\n\telseif #a.ip == #b.ip then\n\t\tif a.ip < b.ip then\n\t\t\treturn true\n\t\telse\n\t\t\treturn #a.ip < #b.ip\n\t\tend\n\tend\n\treturn false\nend)\n\n---- Source\nsources = s:option(DynamicList, \"sources\", translate(\"Source\"))\nsources.description = \"<ul><li>\" .. translate(\"Example:\")\n.. \"</li><li>\" .. translate(\"MAC\") .. \": 00:00:00:FF:FF:FF\"\n.. \"</li><li>\" .. translate(\"IP\") .. \": 192.168.1.100\"\n.. \"</li><li>\" .. translate(\"IP CIDR\") .. \": 192.168.1.0/24\"\n.. \"</li><li>\" .. translate(\"IP range\") .. \": 192.168.1.100-192.168.1.200\"\n.. \"</li><li>\" .. translate(\"IPSet\") .. \": ipset:lanlist\"\n.. \"</li></ul>\"\nsources.cast = \"string\"\nfor _, key in pairs(mac_t) do\n\tsources:value(key.mac, \"%s (%s)\" % {key.mac, key.ip})\nend\nsources.cfgvalue = function(self, section)\n\tlocal value\n\tif self.tag_error[section] then\n\t\tvalue = self:formvalue(section)\n\telse\n\t\tvalue = self.map:get(section, self.option)\n\t\tif type(value) == \"string\" then\n\t\t\tlocal value2 = {}\n\t\t\tstring.gsub(value, '[^' .. \" \" .. ']+', function(w) table.insert(value2, w) end)\n\t\t\tvalue = value2\n\t\tend\n\tend\n\treturn value\nend\nsources.validate = function(self, value, t)\n\tlocal err = {}\n\tfor _, v in ipairs(value) do\n\t\tlocal flag = false\n\t\tif v:find(\"ipset:\") and v:find(\"ipset:\") == 1 then\n\t\t\tlocal ipset = v:gsub(\"ipset:\", \"\")\n\t\t\tif ipset and ipset ~= \"\" then\n\t\t\t\tflag = true\n\t\t\tend\n\t\tend\n\n\t\tif flag == false and datatypes.macaddr(v) then\n\t\t\tflag = true\n\t\tend\n\n\t\tif flag == false and datatypes.ip4addr(v) then\n\t\t\tflag = true\n\t\tend\n\n\t\tif flag == false and api.iprange(v) then\n\t\t\tflag = true\n\t\tend\n\n\t\tif flag == false then\n\t\t\terr[#err + 1] = v\n\t\tend\n\tend\n\n\tif #err > 0 then\n\t\tself:add_error(t, \"invalid\", translate(\"Not true format, please re-enter!\"))\n\t\tfor _, v in ipairs(err) do\n\t\t\tself:add_error(t, \"invalid\", v)\n\t\tend\n\tend\n\n\treturn value\nend\nsources.write = dynamicList_write\n\n---- TCP No Redir Ports\nlocal TCP_NO_REDIR_PORTS = m:get(\"@global_forwarding[0]\", \"tcp_no_redir_ports\")\no = s:option(Value, \"tcp_no_redir_ports\", translate(\"TCP No Redir Ports\"))\no:value(\"\", translate(\"Use global config\") .. \"(\" .. TCP_NO_REDIR_PORTS .. \")\")\no:value(\"disable\", translate(\"No patterns are used\"))\no:value(\"1:65535\", translate(\"All\"))\no.validate = port_validate\n\n---- UDP No Redir Ports\nlocal UDP_NO_REDIR_PORTS = m:get(\"@global_forwarding[0]\", \"udp_no_redir_ports\")\no = s:option(Value, \"udp_no_redir_ports\", translate(\"UDP No Redir Ports\"),\n\t\"<font color='red'>\" .. \n\t\ttranslate(\"Fill in the ports you don't want to be forwarded by the agent, with the highest priority.\") ..\n\t\"</font>\")\no:value(\"\", translate(\"Use global config\") .. \"(\" .. UDP_NO_REDIR_PORTS .. \")\")\no:value(\"disable\", translate(\"No patterns are used\"))\no:value(\"1:65535\", translate(\"All\"))\no.validate = port_validate\n\no = s:option(DummyValue, \"_hide_node_option\", \"\")\no.template = \"passwall/cbi/hidevalue\"\no.value = \"1\"\no:depends({ tcp_no_redir_ports = \"1:65535\", udp_no_redir_ports = \"1:65535\" })\nif TCP_NO_REDIR_PORTS == \"1:65535\" and UDP_NO_REDIR_PORTS == \"1:65535\" then\n\to:depends({ tcp_no_redir_ports = \"\", udp_no_redir_ports = \"\" })\nend\n\no = s:option(Flag, \"use_global_config\", translatef(\"Use global config\"))\no.default = \"0\"\no.rmempty = false\no:depends({ _hide_node_option = \"1\",  ['!reverse'] = true })\n\no = s:option(ListValue, \"tcp_node\", \"<a style='color: red'>\" .. translate(\"TCP Node\") .. \"</a>\")\no.default = \"\"\no:depends({ _hide_node_option = false, use_global_config = false })\no.template = appname .. \"/cbi/nodes_listvalue\"\no.group = {}\no.remove = function(self, section)\n\tm:del(section, self.option)\n\tm:del(section, \"udp_node\")\nend\n\no = s:option(DummyValue, \"_tcp_node_bool\", \"\")\no.template = \"passwall/cbi/hidevalue\"\no.value = \"1\"\no:depends({ tcp_node = \"\",  ['!reverse'] = true })\n\no = s:option(ListValue, \"udp_node\", \"<a style='color: red'>\" .. translate(\"UDP Node\") .. \"</a>\")\no.default = \"\"\no:value(\"\", translate(\"Close\"))\no:value(\"tcp\", translate(\"Same as the tcp node\"))\no:depends({ _tcp_node_bool = \"1\", _node_sel_other = \"1\" })\no.template = appname .. \"/cbi/nodes_listvalue\"\no.group = {\"\",\"\"}\no.remove = function(self, section)\n\tlocal v = s.fields[\"shunt_udp_node\"]:formvalue(section)\n\tif not v then\n\t\treturn m:del(section, self.option)\n\tend\nend\n\no = s:option(ListValue, \"shunt_udp_node\", \"<a style='color: red'>\" .. translate(\"UDP Node\") .. \"</a>\")\no:value(\"close\", translate(\"Close\"))\no:value(\"tcp\", translate(\"Same as the tcp node\"))\no:depends({ _tcp_node_bool = \"1\", _node_sel_shunt = \"1\" })\no.cfgvalue = function(self, section)\n\tlocal v = m:get(section, \"udp_node\") or \"\"\n\tif v == \"\" then v = \"close\" end\n\tif v ~= \"close\" and v ~= \"tcp\" then v = \"tcp\" end\n\treturn v\nend\no.write = function(self, section, value)\n\tif value == \"close\" then value = \"\" end\n\treturn m:set(section, \"udp_node\", value)\nend\n\no = s:option(DummyValue, \"_udp_node_bool\", \"\")\no.template = \"passwall/cbi/hidevalue\"\no.value = \"1\"\no:depends({ udp_node = \"\",  ['!reverse'] = true })\no:depends({ shunt_udp_node = \"tcp\" })\n\n---- TCP Proxy Drop Ports\nlocal TCP_PROXY_DROP_PORTS = m:get(\"@global_forwarding[0]\", \"tcp_proxy_drop_ports\")\no = s:option(Value, \"tcp_proxy_drop_ports\", translate(\"TCP Proxy Drop Ports\"))\no:value(\"\", translate(\"Use global config\") .. \"(\" .. TCP_PROXY_DROP_PORTS .. \")\")\no:value(\"disable\", translate(\"No patterns are used\"))\no.validate = port_validate\no:depends({ use_global_config = true })\no:depends({ _tcp_node_bool = \"1\" })\n\n---- UDP Proxy Drop Ports\nlocal UDP_PROXY_DROP_PORTS = m:get(\"@global_forwarding[0]\", \"udp_proxy_drop_ports\")\no = s:option(Value, \"udp_proxy_drop_ports\", translate(\"UDP Proxy Drop Ports\"))\no:value(\"\", translate(\"Use global config\") .. \"(\" .. UDP_PROXY_DROP_PORTS .. \")\")\no:value(\"disable\", translate(\"No patterns are used\"))\no:value(\"443\", translate(\"QUIC\"))\no.validate = port_validate\no:depends({ use_global_config = true })\no:depends({ _tcp_node_bool = \"1\" })\n\n---- TCP Redir Ports\nlocal TCP_REDIR_PORTS = m:get(\"@global_forwarding[0]\", \"tcp_redir_ports\")\no = s:option(Value, \"tcp_redir_ports\", translate(\"TCP Redir Ports\"), translatef(\"Only work with using the %s node.\", \"TCP\"))\no:value(\"\", translate(\"Use global config\") .. \"(\" .. TCP_REDIR_PORTS .. \")\")\no:value(\"1:65535\", translate(\"All\"))\no:value(\"80,443\", \"80,443\")\no:value(\"80:65535\", \"80 \" .. translate(\"or more\"))\no:value(\"1:443\", \"443 \" .. translate(\"or less\"))\no.validate = port_validate\no:depends({ use_global_config = true })\no:depends({ _tcp_node_bool = \"1\" })\n\n---- UDP Redir Ports\nlocal UDP_REDIR_PORTS = m:get(\"@global_forwarding[0]\", \"udp_redir_ports\")\no = s:option(Value, \"udp_redir_ports\", translate(\"UDP Redir Ports\"), translatef(\"Only work with using the %s node.\", \"UDP\"))\no:value(\"\", translate(\"Use global config\") .. \"(\" .. UDP_REDIR_PORTS .. \")\")\no:value(\"1:65535\", translate(\"All\"))\no:value(\"53\", \"53\")\no.validate = port_validate\no:depends({ use_global_config = true })\no:depends({ _udp_node_bool = \"1\" })\n\no = s:option(DummyValue, \"tips\", \"　\")\no.rawhtml = true\no.cfgvalue = function(t, n)\n\treturn string.format('<font color=\"red\">%s</font>',\n\ttranslate(\"The port settings support single ports and ranges.<br>Separate multiple ports with commas (,).<br>Example: 21,80,443,1000:2000.\"))\nend\no:depends({ use_global_config = true })\no:depends({ _tcp_node_bool = \"1\" })\n\no = s:option(Flag, \"use_direct_list\", translatef(\"Use %s\", translate(\"Direct List\")))\no.default = \"1\"\no:depends({ _tcp_node_bool = \"1\" })\n\no = s:option(Flag, \"use_proxy_list\", translatef(\"Use %s\", translate(\"Proxy List\")))\no.default = \"1\"\no:depends({ _tcp_node_bool = \"1\" })\n\no = s:option(Flag, \"use_block_list\", translatef(\"Use %s\", translate(\"Block List\")))\no.default = \"1\"\no:depends({ _tcp_node_bool = \"1\" })\n\nif has_gfwlist then\n\to = s:option(Flag, \"use_gfw_list\", translatef(\"Use %s\", translate(\"GFW List\")))\n\to.default = \"1\"\n\to:depends({ _tcp_node_bool = \"1\" })\nend\n\nif has_chnlist or has_chnroute then\n\to = s:option(ListValue, \"chn_list\", translate(\"China List\"))\n\to:value(\"0\", translate(\"Close(Not use)\"))\n\to:value(\"direct\", translate(\"Direct Connection\"))\n\to:value(\"proxy\", translate(\"Proxy\"))\n\to.default = \"direct\"\n\to:depends({ _tcp_node_bool = \"1\" })\nend\n\no = s:option(ListValue, \"tcp_proxy_mode\", \"TCP \" .. translate(\"Proxy Mode\"))\no:value(\"disable\", translate(\"No Proxy\"))\no:value(\"proxy\", translate(\"Proxy\"))\no:depends({ _tcp_node_bool = \"1\" })\n\no = s:option(ListValue, \"udp_proxy_mode\", \"UDP \" .. translate(\"Proxy Mode\"))\no:value(\"disable\", translate(\"No Proxy\"))\no:value(\"proxy\", translate(\"Proxy\"))\no:depends({ _udp_node_bool = \"1\" })\n\no = s:option(DummyValue, \"switch_mode\", \" \")\no.template = appname .. \"/global/proxy\"\no:depends({ _tcp_node_bool = \"1\" })\n\n-- Node → DNS Depends Settings\no = s:option(DummyValue, \"_node_sel_shunt\", \"\")\no.template = appname .. \"/cbi/hidevalue\"\no.value = \"1\"\no:depends({ tcp_node = \"__always__\" })\n\no = s:option(DummyValue, \"_node_sel_other\", \"\")\no.template = appname .. \"/cbi/hidevalue\"\no.value = \"1\"\no:depends({ _node_sel_shunt = \"1\",  ['!reverse'] = true })\n\n---- DNS\no = s:option(ListValue, \"dns_shunt\", \"DNS \" .. translate(\"Shunt\"))\no.default = \"chinadns-ng\"\no:value(\"dnsmasq\", \"Dnsmasq\")\no:value(\"chinadns-ng\", translate(\"ChinaDNS-NG (recommended)\"))\no:depends({ _tcp_node_bool = \"1\" })\n\no = s:option(DummyValue, \"view_chinadns_log\", \" \")\no.template = appname .. \"/acl/view_chinadns_log\"\n\no = s:option(Flag, \"filter_proxy_ipv6\", translate(\"Filter Proxy Host IPv6\"), translate(\"Experimental feature.\"))\no.default = \"0\"\no:depends({ _tcp_node_bool = \"1\" })\n\n---- DNS Forward Mode\no = s:option(ListValue, \"dns_mode\", translate(\"Filter Mode\"))\nif api.is_finded(\"dns2socks\") then\n\to:value(\"dns2socks\", \"dns2socks\")\nend\nif has_singbox then\n\to:value(\"sing-box\", \"Sing-Box\")\nend\nif has_xray then\n\to:value(\"xray\", \"Xray\")\nend\no:depends({ _tcp_node_bool = \"1\", _node_sel_other = \"1\" })\no.remove = function(self, section)\n\tlocal f = s.fields[\"tcp_node\"]\n\tlocal id_val = f and f:formvalue(section) or \"\"\n\tif id_val == \"\" then\n\t\treturn m:del(section, self.option)\n\tend\n\tfor _, v in pairs(nodes_table) do\n\t\tif v.id == id_val then\n\t\t\tlocal new_val = (v.type == \"Xray\") and \"xray\" or \"sing-box\"\n\t\t\tm:set(section, self.option, new_val)\n\n\t\t\tlocal dns_field = s.fields[v.type == \"Xray\" and \"xray_dns_mode\" or \"singbox_dns_mode\"]\n\t\t\tlocal v2ray_dns_mode = dns_field and dns_field:formvalue(section)\n\t\t\tif v2ray_dns_mode then\n\t\t\t\tm:set(section, \"v2ray_dns_mode\", v2ray_dns_mode)\n\t\t\tend\n\n\t\t\tbreak\n\t\tend\n\tend\nend\n\no = s:option(ListValue, \"xray_dns_mode\", translate(\"Request protocol\"))\no.default = \"tcp\"\no:value(\"tcp\", \"TCP\")\no:value(\"udp\", \"UDP\")\no:value(\"doh\", \"DoH\")\no:depends(\"dns_mode\", \"xray\")\no.cfgvalue = function(self, section)\n\treturn m:get(section, \"v2ray_dns_mode\")\nend\no.write = function(self, section, value)\n\tif s.fields[\"dns_mode\"]:formvalue(section) == \"xray\" then\n\t\treturn m:set(section, \"v2ray_dns_mode\", value)\n\tend\nend\n\no = s:option(ListValue, \"singbox_dns_mode\", translate(\"Request protocol\"))\no.default = \"tcp\"\no:value(\"tcp\", \"TCP\")\no:value(\"udp\", \"UDP\")\no:value(\"doh\", \"DoH\")\no:value(\"http3\", \"HTTP3(DoH3)\")\no:depends(\"dns_mode\", \"sing-box\")\no.cfgvalue = function(self, section)\n\treturn m:get(section, \"v2ray_dns_mode\")\nend\no.write = function(self, section, value)\n\tif s.fields[\"dns_mode\"]:formvalue(section) == \"sing-box\" then\n\t\treturn m:set(section, \"v2ray_dns_mode\", value)\n\tend\nend\n\n---- DNS Forward\no = s:option(Value, \"remote_dns\", translate(\"Remote DNS\"))\no.default = \"1.1.1.1\"\no:value(\"1.1.1.1\", \"1.1.1.1 (CloudFlare)\")\no:value(\"1.1.1.2\", \"1.1.1.2 (CloudFlare-Security)\")\no:value(\"8.8.4.4\", \"8.8.4.4 (Google)\")\no:value(\"8.8.8.8\", \"8.8.8.8 (Google)\")\no:value(\"9.9.9.9\", \"9.9.9.9 (Quad9-Recommended)\")\no:value(\"149.112.112.112\", \"149.112.112.112 (Quad9-Recommended)\")\no:value(\"208.67.220.220\", \"208.67.220.220 (OpenDNS)\")\no:value(\"208.67.222.222\", \"208.67.222.222 (OpenDNS)\")\no:depends({dns_mode = \"dns2socks\"})\no:depends({xray_dns_mode = \"udp\"})\no:depends({xray_dns_mode = \"tcp\"})\no:depends({singbox_dns_mode = \"udp\"})\no:depends({singbox_dns_mode = \"tcp\"})\n\no = s:option(Value, \"remote_dns_doh\", translate(\"Remote DNS DoH\"))\no.description = translate(\"Format: URL[,IP] (optional IP to map the domain in the URL)\")\no:value(\"https://1.1.1.1/dns-query\", \"1.1.1.1 (CloudFlare)\")\no:value(\"https://1.1.1.2/dns-query\", \"1.1.1.2 (CloudFlare-Security)\")\no:value(\"https://8.8.4.4/dns-query\", \"8.8.4.4 (Google)\")\no:value(\"https://8.8.8.8/dns-query\", \"8.8.8.8 (Google)\")\no:value(\"https://9.9.9.9/dns-query\", \"9.9.9.9 (Quad9)\")\no:value(\"https://149.112.112.112/dns-query\", \"149.112.112.112 (Quad9)\")\no:value(\"https://208.67.222.222/dns-query\", \"208.67.222.222 (OpenDNS)\")\no:value(\"https://dns.adguard.com/dns-query,94.140.14.14\", \"94.140.14.14 (AdGuard)\")\no:value(\"https://doh.libredns.gr/dns-query,116.202.176.26\", \"116.202.176.26 (LibreDNS)\")\no:value(\"https://doh.libredns.gr/ads,116.202.176.26\", \"116.202.176.26 (LibreDNS-NoAds)\")\no.default = o.keylist[1]\no.validate = function(self, value, t)\n\tif value ~= \"\" then\n\t\tvalue = api.trim(value)\n\t\tlocal flag = 0\n\t\tlocal util = require \"luci.util\"\n\t\tlocal val = util.split(value, \",\")\n\t\tlocal url = val[1]\n\t\tval[1] = nil\n\t\tfor i = 1, #val do\n\t\t\tlocal v = val[i]\n\t\t\tif v then\n\t\t\t\tif not api.datatypes.ipmask4(v) then\n\t\t\t\t\tflag = 1\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif flag == 0 then\n\t\t\treturn value\n\t\tend\n\tend\n\treturn nil, translate(\"DoH request address\") .. \" \" .. translate(\"Format must be:\") .. \" URL,IP\"\nend\no:depends({xray_dns_mode = \"doh\"})\no:depends({singbox_dns_mode = \"doh\"})\no:depends({singbox_dns_mode = \"http3\"})\n\no = s:option(Value, \"remote_dns_client_ip\", translate(\"EDNS Client Subnet\"))\no.description = translate(\"Notify the DNS server when the DNS query is notified, the location of the client (cannot be a private IP address).\") .. \"<br />\" ..\n\t\ttranslate(\"This feature requires the DNS server to support the Edns Client Subnet (RFC7871).\")\no.datatype = \"ipaddr\"\no:depends({dns_mode = \"sing-box\"})\no:depends({dns_mode = \"xray\"})\no:depends({_node_sel_shunt = \"1\"})\n\no = s:option(Flag, \"remote_fakedns\", \"FakeDNS\", translate(\"Use FakeDNS work in the domain that proxy.\"))\no.default = \"0\"\no.rmempty = false\no:depends({dns_mode = \"sing-box\"})\no:depends({dns_mode = \"xray\"})\no.validate = function(self, value, t)\n\tif value and value == \"1\" then\n\t\tlocal _dns_mode = s.fields[\"dns_mode\"]:formvalue(t)\n\t\tlocal _tcp_node = s.fields[\"tcp_node\"]:formvalue(t)\n\t\tif _dns_mode and _tcp_node then\n\t\t\tif (m:get(_tcp_node, \"type\") or \"\"):lower() ~= _dns_mode and not _tcp_node:find(\"Socks_\") then\n\t\t\t\treturn nil, translatef(\"TCP node must be '%s' type to use FakeDNS.\", _dns_mode)\n\t\t\tend\n\t\tend\n\tend\n\treturn value\nend\n\no = s:option(ListValue, \"chinadns_ng_default_tag\", translate(\"Default DNS\"))\no.default = \"none\"\no:value(\"gfw\", translate(\"Remote DNS\"))\no:value(\"chn\", translate(\"Direct DNS\"))\no:value(\"none\", translate(\"Smart, Do not accept no-ip reply from Direct DNS\"))\no:value(\"none_noip\", translate(\"Smart, Accept no-ip reply from Direct DNS\"))\nlocal desc = \"<ul>\"\n\t\t.. \"<li>\" .. translate(\"When not matching any domain name list:\") .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"Remote DNS: Can avoid more DNS leaks, but some domestic domain names maybe to proxy!\") .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"Direct DNS: Internet experience may be better, but DNS will be leaked!\") .. \"</li>\"\no.description = desc\n\t\t.. \"<li>\" .. translate(\"Smart: Forward to both direct and remote DNS, if the direct DNS resolution result is a mainland China IP, then use the direct result, otherwise use the remote result.\") .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"In smart mode, no-ip reply from Direct DNS:\") .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"Do not accept: Wait and use Remote DNS Reply.\") .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"Accept: Trust the Reply, using this option can improve DNS resolution speeds for some mainland IPv4-only sites.\") .. \"</li>\"\n\t\t.. \"</ul>\"\no:depends({dns_shunt = \"chinadns-ng\", tcp_proxy_mode = \"proxy\", chn_list = \"direct\"})\n\no = s:option(Flag, \"force_https_soa\", translate(\"Force HTTPS SOA\"), translate(\"Force queries with qtype 65 to respond with an SOA record.\"))\no.default = \"0\"\no.rmempty = false\no:depends({dns_shunt = \"chinadns-ng\"})\n\no = s:option(ListValue, \"use_default_dns\", translate(\"Default DNS\"))\no.default = \"direct\"\no:value(\"remote\", translate(\"Remote DNS\"))\no:value(\"direct\", translate(\"Direct DNS\"))\no.description = desc .. \"</ul>\"\no:depends({dns_shunt = \"dnsmasq\", tcp_proxy_mode = \"proxy\", chn_list = \"direct\"})\n\nlocal tcp = s.fields[\"tcp_node\"]\nlocal udp = s.fields[\"udp_node\"]\nfor k, v in pairs(socks_list) do\n\ttcp:value(v.id, v[\"remark\"])\n\ttcp.group[#tcp.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\tudp:value(v.id, v[\"remark\"])\n\tudp.group[#udp.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\nend\nfor k, v in pairs(nodes_table) do\n\tif #normal_list == 0 then\n\t\ts.fields[\"dns_mode\"]:depends({ _tcp_node_bool = \"1\" })\n\t\tbreak\n\tend\n\tif v.protocol == \"_shunt\" then\n\t\tif v.type == \"Xray\" and has_xray then\n\t\t\ttcp:value(v.id, v[\"remark\"])\n\t\t\ttcp.group[#tcp.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\t\t\tudp:value(v.id, v[\"remark\"])\n\t\t\tudp.group[#udp.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\n\t\t\ts.fields[\"xray_dns_mode\"]:depends({ _tcp_node_bool = \"1\", tcp_node = v.id })\n\t\t\ts.fields[\"_node_sel_shunt\"]:depends({ tcp_node = v.id })\n\t\tend\n\t\tif v.type == \"sing-box\" and has_singbox then\n\t\t\ttcp:value(v.id, v[\"remark\"])\n\t\t\ttcp.group[#tcp.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\t\t\tudp:value(v.id, v[\"remark\"])\n\t\t\tudp.group[#udp.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\n\t\t\ts.fields[\"singbox_dns_mode\"]:depends({ _tcp_node_bool = \"1\", tcp_node = v.id })\n\t\t\ts.fields[\"_node_sel_shunt\"]:depends({ tcp_node = v.id })\n\t\tend\n\telse\n\t\ttcp:value(v.id, v[\"remark\"])\n\t\ttcp.group[#tcp.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\t\tudp:value(v.id, v[\"remark\"])\n\t\tudp.group[#udp.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\tend\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/app_update.lua",
    "content": "local api = require \"luci.passwall.api\"\nlocal appname = \"passwall\"\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\n-- [[ App Settings ]]--\ns = m:section(TypedSection, \"global_app\", translate(\"App Update\"),\n\t\t\t\t\"<font color='red'>\" ..\n\t\t\t\ttranslate(\"Please confirm that your firmware supports FPU.\") ..\n\t\t\t\t\"</font>\")\ns.anonymous = true\ns:append(Template(appname .. \"/app_update/app_version\"))\n\nlocal k, v\nlocal com = require \"luci.passwall.com\"\nfor _, k in ipairs(com.order) do\n\tv = com[k]\n\tif k ~= \"chinadns-ng\" then\n\t\to = s:option(Value, k:gsub(\"%-\",\"_\") .. \"_file\", translatef(\"%s App Path\", v.name))\n\t\to.default = v.default_path or (\"/usr/bin/\" .. k)\n\t\to.rmempty = false\n\tend\nend\n\no = s:option(DummyValue, \"tips\", \"　\")\no.rawhtml = true\no.cfgvalue = function(t, n)\n\treturn string.format('<font color=\"red\">%s</font>', translate(\"if you want to run from memory, change the path, /tmp beginning then save the application and update it manually.\"))\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/global.lua",
    "content": "api = require \"luci.passwall.api\"\nappname = \"passwall\"\ndatatypes = api.datatypes\nlocal fs = api.fs\nhas_singbox = api.finded_com(\"sing-box\")\nhas_xray = api.finded_com(\"xray\")\nlocal has_gfwlist = fs.access(\"/usr/share/passwall/rules/gfwlist\")\nlocal has_chnlist = fs.access(\"/usr/share/passwall/rules/chnlist\")\nlocal has_chnroute = fs.access(\"/usr/share/passwall/rules/chnroute\")\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\nm:append(Template(appname .. \"/cbi/nodes_listvalue_com\"))\n\nlocal nodes_table = {}\nfor _, e in ipairs(api.get_valid_nodes()) do\n\tnodes_table[#nodes_table + 1] = e\nend\n\nlocal normal_list = {}\nlocal balancing_list = {}\nlocal urltest_list = {}\nlocal shunt_list = {}\nlocal iface_list = {}\nfor _, v in pairs(nodes_table) do\n\tif v.node_type == \"normal\" then\n\t\tnormal_list[#normal_list + 1] = v\n\tend\n\tif v.protocol and v.protocol == \"_balancing\" then\n\t\tbalancing_list[#balancing_list + 1] = v\n\tend\n\tif v.protocol and v.protocol == \"_urltest\" then\n\t\turltest_list[#urltest_list + 1] = v\n\tend\n\tif v.protocol and v.protocol == \"_shunt\" then\n\t\tshunt_list[#shunt_list + 1] = v\n\tend\n\tif v.protocol and v.protocol == \"_iface\" then\n\t\tiface_list[#iface_list + 1] = v\n\tend\nend\n\nlocal socks_list = {}\n\nlocal tcp_socks_server = \"127.0.0.1\" .. \":\" .. (m:get(\"@global[0]\", \"tcp_node_socks_port\") or \"1070\")\nlocal socks_table = {}\nsocks_table[#socks_table + 1] = {\n\tid = tcp_socks_server,\n\tremark = tcp_socks_server .. \" - \" .. translate(\"TCP Node\")\n}\nm.uci:foreach(appname, \"socks\", function(s)\n\tif s.enabled == \"1\" and s.node then\n\t\tlocal id, remark\n\t\tfor k, n in pairs(nodes_table) do\n\t\t\tif (s.node == n.id) then\n\t\t\t\tremark = n[\"remark\"]; break\n\t\t\tend\n\t\tend\n\t\tid = \"127.0.0.1\" .. \":\" .. s.port\n\t\tsocks_table[#socks_table + 1] = {\n\t\t\tid = id,\n\t\t\tremark = id .. \" - \" .. (remark or translate(\"Misconfigured\"))\n\t\t}\n\t\tsocks_list[#socks_list + 1] = {\n\t\t\tid = \"Socks_\" .. s[\".name\"],\n\t\t\tremark = translate(\"Socks Config\") .. \" \" .. string.format(\"[%s %s]\", s.port, translate(\"Port\")),\n\t\t\tgroup = \"Socks\"\n\t\t}\n\tend\nend)\n\nlocal doh_validate = function(self, value, t)\n\tvalue = value:gsub(\"%s+\", \"\")\n\tif value ~= \"\" then\n\t\tlocal flag = 0\n\t\tlocal util = require \"luci.util\"\n\t\tlocal val = util.split(value, \",\")\n\t\tlocal url = val[1]\n\t\tval[1] = nil\n\t\tfor i = 1, #val do\n\t\t\tlocal v = val[i]\n\t\t\tif v then\n\t\t\t\tif not datatypes.ipmask4(v) and not datatypes.ipmask6(v) then\n\t\t\t\t\tflag = 1\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif flag == 0 then\n\t\t\treturn value\n\t\tend\n\tend\n\treturn nil, translatef(\"%s request address\",\"DoH\") .. \" \" .. translate(\"Format must be:\") .. \" URL,IP\"\nend\n\nm:append(Template(appname .. \"/global/status\"))\n\nglobal_cfgid = m:get(\"@global[0]\")[\".name\"]\n\ns = m:section(TypedSection, \"global\")\ns.anonymous = true\ns.addremove = false\n\ns:tab(\"Main\", translate(\"Main\"))\n\n-- [[ Global Settings ]]--\no = s:taboption(\"Main\", Flag, \"enabled\", translate(\"Main switch\"))\no.rmempty = false\n\n---- TCP Node\no = s:taboption(\"Main\", ListValue, \"tcp_node\", \"<a style='color: red'>\" .. translate(\"TCP Node\") .. \"</a>\")\no.template = appname .. \"/cbi/nodes_listvalue\"\no:value(\"\", translate(\"Close\"))\no.group = {\"\"}\n\n---- UDP Node\no = s:taboption(\"Main\", ListValue, \"udp_node\", \"<a style='color: red'>\" .. translate(\"UDP Node\") .. \"</a>\")\no.template = appname .. \"/cbi/nodes_listvalue\"\no:value(\"\", translate(\"Close\"))\no:value(\"tcp\", translate(\"Same as the tcp node\"))\no.group = {\"\",\"\"}\no:depends(\"_node_sel_other\", \"1\")\no.remove = function(self, section)\n\tlocal v = s.fields[\"shunt_udp_node\"]:formvalue(section)\n\tif not v then\n\t\treturn m:del(section, self.option)\n\tend\nend\n\no = s:taboption(\"Main\", ListValue, \"shunt_udp_node\", \"<a style='color: red'>\" .. translate(\"UDP Node\") .. \"</a>\")\no:value(\"close\", translate(\"Close\"))\no:value(\"tcp\", translate(\"Same as the tcp node\"))\no:depends(\"_node_sel_shunt\", \"1\")\no.cfgvalue = function(self, section)\n\tlocal v = m:get(section, \"udp_node\") or \"\"\n\tif v == \"\" then v = \"close\" end\n\tif v ~= \"close\" and v ~= \"tcp\" then v = \"tcp\" end\n\treturn v\nend\no.write = function(self, section, value)\n\tif value == \"close\" then value = \"\" end\n\treturn m:set(section, \"udp_node\", value)\nend\n\n-- Shunt Start\nif (has_singbox or has_xray) and #nodes_table > 0 then\n\tif #normal_list > 0 or #iface_list > 0 then\n\t\tcurrent_node_id = m.uci:get(appname, global_cfgid, \"tcp_node\")\n\t\tcurrent_node = current_node_id and m.uci:get_all(appname, current_node_id) or {}\n\t\tif current_node.protocol == \"_shunt\" then\n\t\t\tlocal shunt_lua = loadfile(\"/usr/lib/lua/luci/model/cbi/passwall/client/include/shunt_options.lua\")\n\t\t\tsetfenv(shunt_lua, getfenv(1))(m, s, {\n\t\t\t\tnode_id = current_node_id,\n\t\t\t\tnode = current_node,\n\t\t\t\tsocks_list = socks_list,\n\t\t\t\turltest_list = urltest_list,\n\t\t\t\tbalancing_list = balancing_list,\n\t\t\t\tiface_list = iface_list,\n\t\t\t\tnormal_list = normal_list,\n\t\t\t\tverify_option = s.fields[\"tcp_node\"],\n\t\t\t\ttab = \"Shunt\",\n\t\t\t\ttab_desc = translate(\"Shunt Rule\")\n\t\t\t})\n\t\tend\n\telse\n\t\tlocal tips = s:taboption(\"Main\", DummyValue, \"tips\", \"　\")\n\t\ttips.rawhtml = true\n\t\ttips.cfgvalue = function(t, n)\n\t\t\treturn string.format('<a style=\"color: red\">%s</a>', translate(\"There are no available nodes, please add or subscribe nodes first.\"))\n\t\tend\n\t\ttips:depends({ tcp_node = \"\", [\"!reverse\"] = true })\n\t\tfor k, v in pairs(shunt_list) do\n\t\t\ttips:depends(\"tcp_node\", v.id)\n\t\tend\n\t\tfor k, v in pairs(balancing_list) do\n\t\t\ttips:depends(\"tcp_node\", v.id)\n\t\tend\n\tend\nend\n\no = s:taboption(\"Main\", Value, \"tcp_node_socks_port\", translate(\"TCP Node\") .. \" Socks \" .. translate(\"Listen Port\"))\no.default = 1070\no.datatype = \"port\"\no:depends({ tcp_node = \"\", [\"!reverse\"] = true })\n--[[\nif has_singbox or has_xray then\n\to = s:taboption(\"Main\", Value, \"tcp_node_http_port\", translate(\"TCP Node\") .. \" HTTP \" .. translate(\"Listen Port\") .. \" \" .. translate(\"0 is not use\"))\n\to.default = 0\n\to.datatype = \"port\"\nend\n]]--\no = s:taboption(\"Main\", Flag, \"tcp_node_socks_bind_local\", translate(\"TCP Node\") .. \" Socks \" .. translate(\"Bind Local\"), translate(\"When selected, it can only be accessed localhost.\"))\no.default = \"1\"\no:depends({ tcp_node = \"\", [\"!reverse\"] = true })\n\n-- Node → DNS Depends Settings\no = s:taboption(\"Main\", DummyValue, \"_node_sel_shunt\", \"\")\no.template = appname .. \"/cbi/hidevalue\"\no.value = \"1\"\no:depends({ tcp_node = \"__always__\" })\n\no = s:taboption(\"Main\", DummyValue, \"_node_sel_other\", \"\")\no.template = appname .. \"/cbi/hidevalue\"\no.value = \"1\"\no:depends({ _node_sel_shunt = \"1\",  ['!reverse'] = true })\n\n-- [[ DNS Settings ]]--\ns:tab(\"DNS\", translate(\"DNS\"))\n\no = s:taboption(\"DNS\", ListValue, \"dns_shunt\", \"DNS \" .. translate(\"Shunt\"))\no:value(\"dnsmasq\", \"Dnsmasq\")\no:value(\"chinadns-ng\", translate(\"ChinaDNS-NG (recommended)\"))\nif api.is_finded(\"smartdns\") then\n\to:value(\"smartdns\", \"SmartDNS\")\n\to.write = function(self, section, value)\n\t\tif value ~= \"smartdns\" then\n\t\t\tm:del(section, \"group_domestic\")\n\t\tend\n\t\treturn ListValue.write(self, section, value)\n\tend\n\n\to = s:taboption(\"DNS\", Value, \"group_domestic\", translate(\"Domestic group name\"))\n\to.placeholder = \"local\"\n\to.rmempty = false\n\to:depends(\"dns_shunt\", \"smartdns\")\n\to.description = translate(\"You only need to configure domestic DNS packets in SmartDNS, and fill in the domestic DNS group name here.\")\n\to.validate = function(self, value, section)\n\t\tvalue = api.trim(value)\n\t\tif value == \"\" then\n\t\t\treturn nil, translatef(\"%s cannot be empty.\", \"SmartDNS \" .. translate(\"Domestic group name\"))\n\t\tend\n\t\treturn value\n\tend\nend\n\no = s:taboption(\"DNS\", ListValue, \"direct_dns_mode\", translate(\"Direct DNS\") .. \" \" .. translate(\"Request protocol\"))\no:value(\"\", translate(\"Auto\"))\no:value(\"udp\", translatef(\"Requery DNS By %s\", \"UDP\"))\no:value(\"tcp\", translatef(\"Requery DNS By %s\", \"TCP\"))\no:depends({dns_shunt = \"dnsmasq\"})\no:depends({dns_shunt = \"chinadns-ng\"})\n\no = s:taboption(\"DNS\", Value, \"direct_dns\", translate(\"Direct DNS\"))\no.datatype = \"or(ipaddr,ipaddrport)\"\no.default = \"223.5.5.5\"\no:value(\"223.5.5.5\")\no:value(\"223.6.6.6\")\no:value(\"180.184.1.1\")\no:value(\"180.184.2.2\")\no:value(\"114.114.114.114\")\no:value(\"114.114.115.115\")\no:value(\"119.28.28.28\")\no:depends(\"direct_dns_mode\", \"udp\")\no:depends(\"direct_dns_mode\", \"tcp\")\n\no = s:taboption(\"DNS\", Flag, \"filter_proxy_ipv6\", translate(\"Filter Proxy Host IPv6\"))\no.default = \"0\"\n\n-- TCP分流时dns过滤模式保存逻辑\nfunction dns_mode_save(section)\n\tlocal f = s.fields[\"tcp_node\"]\n\tlocal id_val = f and f:formvalue(section) or \"\"\n\tif id_val == \"\" then\n\t\treturn\n\tend\n\tfor _, v in pairs(shunt_list) do\n\t\tif v.id == id_val then\n\t\t\tlocal type_val = v.type\n\t\t\tif type_val and (type_val == \"Xray\" or type_val == \"sing-box\") then\n\t\t\t\tlocal dns_shunt_val = s.fields[\"dns_shunt\"]:formvalue(section)\n\t\t\t\tlocal dns_mode_val = (dns_shunt_val ~= \"smartdns\") and \"dns_mode\" or \"smartdns_dns_mode\"\n\t\t\t\tlocal current_val = m:get(section, dns_mode_val) or \"\"\n\t\t\t\tlocal new_val = (type_val == \"Xray\") and \"xray\" or \"sing-box\"\n\n\t\t\t\tif current_val ~= new_val then\n\t\t\t\t\tm:set(section, dns_mode_val, new_val)\n\t\t\t\t\tm:del(section, (dns_mode_val == \"dns_mode\") and \"smartdns_dns_mode\" or \"dns_mode\")\n\t\t\t\tend\n\n\t\t\t\tlocal dns_field = s.fields[type_val == \"Xray\" and \"xray_dns_mode\" or \"singbox_dns_mode\"]\n\t\t\t\tlocal v2ray_dns_mode = dns_field and dns_field:formvalue(section)\n\t\t\t\tif v2ray_dns_mode and m:get(section, \"v2ray_dns_mode\") ~= v2ray_dns_mode then\n\t\t\t\t\tm:set(section, \"v2ray_dns_mode\", v2ray_dns_mode)\n\t\t\t\tend\n\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\tend\nend\n\n---- DNS Forward Mode\no = s:taboption(\"DNS\", ListValue, \"dns_mode\", translate(\"Filter Mode\"))\no.default = \"tcp\"\no:value(\"udp\", translatef(\"Requery DNS By %s\", \"UDP\"))\no:value(\"tcp\", translatef(\"Requery DNS By %s\", \"TCP\"))\nif api.is_finded(\"dns2socks\") then\n\to:value(\"dns2socks\", \"dns2socks\")\nend\nif has_singbox then\n\to:value(\"sing-box\", \"Sing-Box\")\nend\nif has_xray then\n\to:value(\"xray\", \"Xray\")\nend\no:depends({ dns_shunt = \"chinadns-ng\", _node_sel_other = \"1\" })\no:depends({ dns_shunt = \"dnsmasq\", _node_sel_other = \"1\" })\no.remove = function(self, section)\n\tlocal f = s.fields[\"smartdns_dns_mode\"]\n\tif f and f:formvalue(section) then\n\t\treturn m:del(section, self.option)\n\tend\n\tdns_mode_save(section)\nend\n\n---- SmartDNS Forward Mode\nif api.is_finded(\"smartdns\") then\n\to = s:taboption(\"DNS\", ListValue, \"smartdns_dns_mode\", translate(\"Filter Mode\"))\n\to:value(\"socks\", \"Socks\")\n\tif has_singbox then\n\t\to:value(\"sing-box\", \"Sing-Box\")\n\tend\n\tif has_xray then\n\t\to:value(\"xray\", \"Xray\")\n\tend\n\to:depends({ dns_shunt = \"smartdns\", _node_sel_other = \"1\" })\n\to.remove = function(self, section)\n\t\tlocal f = s.fields[\"dns_mode\"]\n\t\tif f and f:formvalue(section) then\n\t\t\treturn m:del(section, self.option)\n\t\tend\n\t\tdns_mode_save(section)\n\tend\n\n\to = s:taboption(\"DNS\", DynamicList, \"smartdns_remote_dns\", translate(\"Remote DNS\"))\n\to:value(\"tcp://1.1.1.1\")\n\to:value(\"tcp://8.8.4.4\")\n\to:value(\"tcp://8.8.8.8\")\n\to:value(\"tcp://9.9.9.9\")\n\to:value(\"tcp://208.67.222.222\")\n\to:value(\"tls://1.1.1.1\")\n\to:value(\"tls://8.8.4.4\")\n\to:value(\"tls://8.8.8.8\")\n\to:value(\"tls://9.9.9.9\")\n\to:value(\"tls://208.67.222.222\")\n\to:value(\"https://1.1.1.1/dns-query\")\n\to:value(\"https://8.8.4.4/dns-query\")\n\to:value(\"https://8.8.8.8/dns-query\")\n\to:value(\"https://9.9.9.9/dns-query\")\n\to:value(\"https://208.67.222.222/dns-query\")\n\to:value(\"https://dns.adguard.com/dns-query,94.140.14.14\")\n\to:value(\"https://doh.libredns.gr/dns-query,116.202.176.26\")\n\to:value(\"https://doh.libredns.gr/ads,116.202.176.26\")\n\to:depends({ dns_shunt = \"smartdns\", smartdns_dns_mode = \"socks\" })\n\to.cfgvalue = function(self, section)\n\t\treturn m:get(section, self.option) or {\"tcp://1.1.1.1\"}\n\tend\n\tfunction o.write(self, section, value)\n\t\tlocal t = {}\n\t\tlocal t2 = {}\n\t\tif type(value) == \"table\" then\n\t\t\tlocal x\n\t\t\tfor _, x in ipairs(value) do\n\t\t\t\tif x and #x > 0 then\n\t\t\t\t\tif not t2[x] then\n\t\t\t\t\t\tt2[x] = x\n\t\t\t\t\t\tt[#t+1] = x\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tt = { value }\n\t\tend\n\t\treturn DynamicList.write(self, section, t)\n\tend\nend\n\no = s:taboption(\"DNS\", ListValue, \"xray_dns_mode\", translate(\"Remote DNS\") .. \" \" .. translate(\"Request protocol\"))\no.default = \"tcp\"\no:value(\"tcp\", \"TCP\")\no:value(\"udp\", \"UDP\")\no:value(\"doh\", \"DoH\")\no:depends(\"dns_mode\", \"xray\")\no:depends(\"smartdns_dns_mode\", \"xray\")\no.cfgvalue = function(self, section)\n\treturn m:get(section, \"v2ray_dns_mode\")\nend\no.write = function(self, section, value)\n\tlocal f = s.fields[\"smartdns_dns_mode\"]\n\tif s.fields[\"dns_mode\"]:formvalue(section) == \"xray\" or (f and f:formvalue(section) == \"xray\") then\n\t\treturn m:set(section, \"v2ray_dns_mode\", value)\n\tend\nend\n\no = s:taboption(\"DNS\", ListValue, \"singbox_dns_mode\", translate(\"Remote DNS\") .. \" \" .. translate(\"Request protocol\"))\no.default = \"tcp\"\no:value(\"tcp\", \"TCP\")\no:value(\"udp\", \"UDP\")\no:value(\"doh\", \"DoH\")\no:value(\"http3\", \"HTTP3(DoH3)\")\no:depends(\"dns_mode\", \"sing-box\")\no:depends(\"smartdns_dns_mode\", \"sing-box\")\no.cfgvalue = function(self, section)\n\treturn m:get(section, \"v2ray_dns_mode\")\nend\no.write = function(self, section, value)\n\tlocal f = s.fields[\"smartdns_dns_mode\"]\n\tif s.fields[\"dns_mode\"]:formvalue(section) == \"sing-box\" or (f and f:formvalue(section) == \"sing-box\") then\n\t\treturn m:set(section, \"v2ray_dns_mode\", value)\n\tend\nend\n\no = s:taboption(\"DNS\", Value, \"socks_server\", translate(\"Socks Server\"), translate(\"Make sure socks service is available on this address.\"))\nfor k, v in pairs(socks_table) do o:value(v.id, v.remark) end\no.default = socks_table[1].id\no.validate = function(self, value, t)\n\tif not datatypes.ipaddrport(value) then\n\t\treturn nil, translate(\"Socks Server\") .. \" \" .. translate(\"Not valid IP format, please re-enter!\")\n\tend\n\treturn value\nend\no:depends({dns_mode = \"dns2socks\"})\n\n---- DNS Forward\no = s:taboption(\"DNS\", Value, \"remote_dns\", translate(\"Remote DNS\"))\no.datatype = \"or(ipaddr,ipaddrport)\"\no.default = \"1.1.1.1\"\no:value(\"1.1.1.1\", \"1.1.1.1 (CloudFlare)\")\no:value(\"1.1.1.2\", \"1.1.1.2 (CloudFlare-Security)\")\no:value(\"8.8.4.4\", \"8.8.4.4 (Google)\")\no:value(\"8.8.8.8\", \"8.8.8.8 (Google)\")\no:value(\"9.9.9.9\", \"9.9.9.9 (Quad9)\")\no:value(\"149.112.112.112\", \"149.112.112.112 (Quad9)\")\no:value(\"208.67.220.220\", \"208.67.220.220 (OpenDNS)\")\no:value(\"208.67.222.222\", \"208.67.222.222 (OpenDNS)\")\no:depends({dns_mode = \"dns2socks\"})\no:depends({dns_mode = \"tcp\"})\no:depends({dns_mode = \"udp\"})\no:depends({xray_dns_mode = \"udp\"})\no:depends({xray_dns_mode = \"tcp\"})\no:depends({singbox_dns_mode = \"udp\"})\no:depends({singbox_dns_mode = \"tcp\"})\n\n---- DoH\no = s:taboption(\"DNS\", Value, \"remote_dns_doh\", translate(\"Remote DNS DoH\"))\no.description = translate(\"Format: URL[,IP] (optional IP to map the domain in the URL)\")\no.default = o.keylist[1]\no:value(\"https://1.1.1.1/dns-query\", \"1.1.1.1 (CloudFlare)\")\no:value(\"https://1.1.1.2/dns-query\", \"1.1.1.2 (CloudFlare-Security)\")\no:value(\"https://8.8.4.4/dns-query\", \"8.8.4.4 (Google)\")\no:value(\"https://8.8.8.8/dns-query\", \"8.8.8.8 (Google)\")\no:value(\"https://9.9.9.9/dns-query\", \"9.9.9.9 (Quad9)\")\no:value(\"https://149.112.112.112/dns-query\", \"149.112.112.112 (Quad9)\")\no:value(\"https://208.67.222.222/dns-query\", \"208.67.222.222 (OpenDNS)\")\no:value(\"https://dns.adguard.com/dns-query,94.140.14.14\", \"94.140.14.14 (AdGuard)\")\no:value(\"https://doh.libredns.gr/dns-query,116.202.176.26\", \"116.202.176.26 (LibreDNS)\")\no:value(\"https://doh.libredns.gr/ads,116.202.176.26\", \"116.202.176.26 (LibreDNS-NoAds)\")\no.validate = doh_validate\no:depends({xray_dns_mode = \"doh\"})\no:depends({singbox_dns_mode = \"doh\"})\no:depends({singbox_dns_mode = \"http3\"})\n\no = s:taboption(\"DNS\", Value, \"remote_dns_client_ip\", translate(\"EDNS Client Subnet\"))\no.description = translate(\"Notify the DNS server when the DNS query is notified, the location of the client (cannot be a private IP address).\") .. \"<br />\" ..\n\t\ttranslate(\"This feature requires the DNS server to support the Edns Client Subnet (RFC7871).\")\no.datatype = \"ipaddr\"\no:depends({dns_mode = \"sing-box\"})\no:depends({dns_mode = \"xray\"})\no:depends(\"dns_shunt\", \"smartdns\")\no:depends(\"_node_sel_shunt\", \"1\")\n\no = s:taboption(\"DNS\", Flag, \"remote_fakedns\", \"FakeDNS\", translate(\"Use FakeDNS work in the domain that proxy.\"))\no.default = \"0\"\no:depends({dns_mode = \"sing-box\", dns_shunt = \"dnsmasq\"})\no:depends({dns_mode = \"sing-box\", dns_shunt = \"chinadns-ng\"})\no:depends({smartdns_dns_mode = \"sing-box\", dns_shunt = \"smartdns\"})\no:depends({dns_mode = \"xray\", dns_shunt = \"dnsmasq\"})\no:depends({dns_mode = \"xray\", dns_shunt = \"chinadns-ng\"})\no:depends({smartdns_dns_mode = \"xray\", dns_shunt = \"smartdns\"})\n--o:depends(\"_node_sel_shunt\", \"1\")\no.validate = function(self, value, t)\n\tif value and value == \"1\" then\n\t\tlocal _dns_mode = s.fields[\"dns_mode\"]:formvalue(t)\n\t\tif not _dns_mode and s.fields[\"smartdns_dns_mode\"] then\n\t\t\t_dns_mode = s.fields[\"smartdns_dns_mode\"]:formvalue(t)\n\t\tend\n\t\tlocal _tcp_node = s.fields[\"tcp_node\"]:formvalue(t)\n\t\tif _dns_mode and _tcp_node then\n\t\t\tif (m:get(_tcp_node, \"type\") or \"\"):lower() ~= _dns_mode and not _tcp_node:find(\"Socks_\") then\n\t\t\t\treturn nil, translatef(\"TCP node must be '%s' type to use FakeDNS.\", _dns_mode)\n\t\t\tend\n\t\tend\n\tend\n\treturn value\nend\n\no = s:taboption(\"DNS\", ListValue, \"chinadns_ng_default_tag\", translate(\"Default DNS\"))\no.default = \"none\"\no:value(\"gfw\", translate(\"Remote DNS\"))\no:value(\"chn\", translate(\"Direct DNS\"))\no:value(\"none\", translate(\"Smart, Do not accept no-ip reply from Direct DNS\"))\no:value(\"none_noip\", translate(\"Smart, Accept no-ip reply from Direct DNS\"))\nlocal desc = \"<ul>\"\n\t\t.. \"<li>\" .. translate(\"When not matching any domain name list:\") .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"Remote DNS: Can avoid more DNS leaks, but some domestic domain names maybe to proxy!\") .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"Direct DNS: Internet experience may be better, but DNS will be leaked!\") .. \"</li>\"\no.description = desc\n\t\t.. \"<li>\" .. translate(\"Smart: Forward to both direct and remote DNS, if the direct DNS resolution result is a mainland China IP, then use the direct result, otherwise use the remote result.\") .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"In smart mode, no-ip reply from Direct DNS:\") .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"Do not accept: Wait and use Remote DNS Reply.\") .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"Accept: Trust the Reply, using this option can improve DNS resolution speeds for some mainland IPv4-only sites.\") .. \"</li>\"\n\t\t.. \"</ul>\"\no:depends({dns_shunt = \"chinadns-ng\", tcp_proxy_mode = \"proxy\", chn_list = \"direct\"})\n\no = s:taboption(\"DNS\", ListValue, \"use_default_dns\", translate(\"Default DNS\"))\no.default = \"direct\"\no:value(\"remote\", translate(\"Remote DNS\"))\no:value(\"direct\", translate(\"Direct DNS\"))\no.description = desc .. \"</ul>\"\no:depends({dns_shunt = \"dnsmasq\", tcp_proxy_mode = \"proxy\", chn_list = \"direct\"})\nif api.is_finded(\"smartdns\") then\n\to:depends({dns_shunt = \"smartdns\", tcp_proxy_mode = \"proxy\", chn_list = \"direct\"})\nend\n\no = s:taboption(\"DNS\", Flag, \"force_https_soa\", translate(\"Force HTTPS SOA\"), translate(\"Force queries with qtype 65 to respond with an SOA record.\"))\no.default = \"0\"\no:depends({dns_shunt = \"chinadns-ng\"})\nif api.is_finded(\"smartdns\") then\n\to:depends({dns_shunt = \"smartdns\"})\nend\n\no = s:taboption(\"DNS\", Flag, \"dns_redirect\", translate(\"DNS Redirect\"), translate(\"Force special DNS server to need proxy devices.\"))\no.default = \"1\"\no.rmempty = false\n\nlocal prefer_nft = m:get(\"@global_forwarding[0]\", \"prefer_nft\") == \"1\"\nlocal set_title = api.i18n.translate(prefer_nft and \"Clear NFTSET on Reboot\" or \"Clear IPSET on Reboot\")\no = s:taboption(\"DNS\", Flag, \"flush_set_on_reboot\", set_title, translate(\"Clear IPSET/NFTSET on service reboot. This may increase reboot time.\"))\no.default = \"0\"\n\nset_title = api.i18n.translate(prefer_nft and \"Clear NFTSET\" or \"Clear IPSET\")\no = s:taboption(\"DNS\", DummyValue, \"clear_ipset\", set_title, translate(\"Try this feature if the rule modification does not take effect.\"))\no.rawhtml = true\nfunction o.cfgvalue(self, section)\n\treturn string.format(\n\t\t[[<button type=\"button\" class=\"cbi-button cbi-button-remove\" onclick=\"location.href='%s'\">%s</button>]],\n\t\tapi.url(\"flush_set\") .. \"?redirect=1&reload=1\", set_title)\nend\n\ns:tab(\"Proxy\", translate(\"Mode\"))\n\no = s:taboption(\"Proxy\", Flag, \"use_direct_list\", translatef(\"Use %s\", translate(\"Direct List\")))\no.default = \"1\"\n\no = s:taboption(\"Proxy\", Flag, \"use_proxy_list\", translatef(\"Use %s\", translate(\"Proxy List\")))\no.default = \"1\"\n\no = s:taboption(\"Proxy\", Flag, \"use_block_list\", translatef(\"Use %s\", translate(\"Block List\")))\no.default = \"1\"\n\nif has_gfwlist then\n\to = s:taboption(\"Proxy\", Flag, \"use_gfw_list\", translatef(\"Use %s\", translate(\"GFW List\")))\n\to.default = \"1\"\nend\n\nif has_chnlist or has_chnroute then\n\to = s:taboption(\"Proxy\", ListValue, \"chn_list\", translate(\"China List\"))\n\to:value(\"0\", translate(\"Close(Not use)\"))\n\to:value(\"direct\", translate(\"Direct Connection\"))\n\to:value(\"proxy\", translate(\"Proxy\"))\n\to.default = \"direct\"\nend\n\n---- TCP Default Proxy Mode\no = s:taboption(\"Proxy\", ListValue, \"tcp_proxy_mode\", \"TCP \" .. translate(\"Default Proxy Mode\"))\no:value(\"disable\", translate(\"No Proxy\"))\no:value(\"proxy\", translate(\"Proxy\"))\no.default = \"proxy\"\n\n---- UDP Default Proxy Mode\no = s:taboption(\"Proxy\", ListValue, \"udp_proxy_mode\", \"UDP \" .. translate(\"Default Proxy Mode\"))\no:value(\"disable\", translate(\"No Proxy\"))\no:value(\"proxy\", translate(\"Proxy\"))\no.default = \"proxy\"\n\no = s:taboption(\"Proxy\", DummyValue, \"switch_mode\", \" \")\no.template = appname .. \"/global/proxy\"\n\n---- Check the transparent proxy component\nlocal handle = io.popen(\"lsmod\")\nlocal mods = \"\"\nif handle then\n\tmods = handle:read(\"*a\") or \"\"\n\thandle:close()\nend\n\nif (mods:find(\"REDIRECT\") and mods:find(\"TPROXY\")) or (mods:find(\"nft_redir\") and mods:find(\"nft_tproxy\")) then\n\to = s:taboption(\"Proxy\", Flag, \"localhost_proxy\", translate(\"Localhost Proxy\"), translate(\"When selected, localhost can transparent proxy.\"))\n\to.default = \"1\"\n\to.rmempty = false\n\n\to = s:taboption(\"Proxy\", Flag, \"client_proxy\", translate(\"Client Proxy\"), translate(\"When selected, devices in LAN can transparent proxy. Otherwise, it will not be proxy. But you can still use access control to allow the designated device to proxy.\"))\n\to.default = \"1\"\n\to.rmempty = false\nelse\n\tlocal html = string.format([[<div class=\"cbi-checkbox\"><input class=\"cbi-input-checkbox\" type=\"checkbox\" disabled></div><div class=\"cbi-value-description\"><font color=\"red\">%s</font></div>]], translate(\"Missing components, transparent proxy is unavailable.\"))\n\to = s:taboption(\"Proxy\", DummyValue, \"localhost_proxy\", translate(\"Localhost Proxy\"))\n\to.rawhtml = true\n\tfunction o.cfgvalue(self, section)\n\t\treturn html\n\tend\n\n\to = s:taboption(\"Proxy\", DummyValue, \"client_proxy\", translate(\"Client Proxy\"))\n\to.rawhtml = true\n\tfunction o.cfgvalue(self, section)\n\t\treturn html\n\tend\nend\n\no = s:taboption(\"Proxy\", DummyValue, \"_proxy_tips\", \"　\")\no.rawhtml = true\no.cfgvalue = function(t, n)\n\treturn string.format('<a style=\"color: red\" href=\"%s\">%s</a>', api.url(\"acl\"), translate(\"Want different devices to use different proxy modes/ports/nodes? Please use access control.\"))\nend\n\ns:tab(\"log\", translate(\"Log\"))\no = s:taboption(\"log\", Flag, \"log_tcp\", translate(\"Enable\") .. \" \" .. translatef(\"%s Node Log\", \"TCP\"))\no.default = \"0\"\no.rmempty = false\n\no = s:taboption(\"log\", Flag, \"log_udp\", translate(\"Enable\") .. \" \" .. translatef(\"%s Node Log\", \"UDP\"))\no.default = \"0\"\no.rmempty = false\n\no = s:taboption(\"log\", ListValue, \"loglevel\", \"Sing-Box/Xray \" .. translate(\"Log Level\"))\no.default = \"warning\"\no:value(\"debug\")\no:value(\"info\")\no:value(\"warning\")\no:value(\"error\")\n\no = s:taboption(\"log\", Flag, \"advanced_log_feature\", translate(\"Advanced log feature\"), translate(\"For professionals only.\"))\no.default = \"0\"\no = s:taboption(\"log\", Flag, \"sys_log\", translate(\"Logging to system log\"), translate(\"Logging to the system log for more advanced functions. For example, send logs to a dedicated log server.\"))\no:depends(\"advanced_log_feature\", \"1\")\no.default = \"0\"\no = s:taboption(\"log\", Value, \"persist_log_path\", translate(\"Persist log file directory\"), translate(\"The path to the directory used to store persist log files, the \\\"/\\\" at the end can be omitted. Leave it blank to disable this feature.\"))\no:depends({ [\"advanced_log_feature\"] = 1, [\"sys_log\"] = 0 })\no = s:taboption(\"log\", Value, \"log_event_filter\", translate(\"Log Event Filter\"), translate(\"Support regular expression.\"))\no:depends(\"advanced_log_feature\", \"1\")\no = s:taboption(\"log\", Value, \"log_event_cmd\", translate(\"Shell Command\"), translate(\"Shell command to execute, replace log content with %s.\"))\no:depends(\"advanced_log_feature\", \"1\")\n\no = s:taboption(\"log\", Flag, \"log_chinadns_ng\", translate(\"Enable\") .. \" ChinaDNS-NG \" .. translate(\"Log\"))\no.default = \"0\"\no.rmempty = false\n\no = s:taboption(\"log\", DummyValue, \"_log_tips\", \"　\")\no.rawhtml = true\no.cfgvalue = function(t, n)\n\treturn string.format('<font color=\"red\">%s</font>', translate(\"It is recommended to disable logging during regular use to reduce system overhead.\"))\nend\n\ns:tab(\"faq\", \"FAQ\")\no = s:taboption(\"faq\", DummyValue, \"\")\no.template = appname .. \"/global/faq\"\n\ns:tab(\"maintain\", translate(\"Maintain\"))\no = s:taboption(\"maintain\", DummyValue, \"\")\no.template = appname .. \"/global/backup\"\n\n-- [[ Socks Server ]]--\no = s:taboption(\"Main\", Flag, \"socks_enabled\", \"Socks \" .. translate(\"Main switch\"))\no.rmempty = false\n\ns2 = m:section(TypedSection, \"socks\", translate(\"Socks Config\"))\ns2.template = \"cbi/tblsection\"\ns2.anonymous = true\ns2.addremove = true\ns2.extedit = api.url(\"socks_config\", \"%s\")\nfunction s2.create(e, t)\n\tlocal uuid = api.gen_short_uuid()\n\tt = uuid\n\tTypedSection.create(e, t)\n\tluci.http.redirect(e.extedit:format(t))\nend\nfunction s2.remove(e, t)\n\tlocal socks = \"Socks_\" .. t\n\tlocal new_node = \"\"\n\tlocal node0 = m:get(\"@nodes[0]\") or nil\n\tif node0 then\n\t\tnew_node = node0[\".name\"]\n\tend\n\tif (m:get(\"@global[0]\", \"tcp_node\") or \"\") == socks then\n\t\tm:set('@global[0]', \"tcp_node\", new_node)\n\tend\n\tif (m:get(\"@global[0]\", \"udp_node\") or \"\") == socks then\n\t\tm:set('@global[0]', \"udp_node\", new_node)\n\tend\n\tm.uci:foreach(appname, \"acl_rule\", function(s)\n\t\tif s[\"tcp_node\"] and s[\"tcp_node\"] == socks then\n\t\t\tm:set(s[\".name\"], \"tcp_node\", \"default\")\n\t\tend\n\t\tif s[\"udp_node\"] and s[\"udp_node\"] == socks then\n\t\t\tm:set(s[\".name\"], \"udp_node\", \"default\")\n\t\tend\n\tend)\n\tm.uci:foreach(appname, \"nodes\", function(s)\n\t\tlocal list_name = s[\"urltest_node\"] and \"urltest_node\" or (s[\"balancing_node\"] and \"balancing_node\")\n\t\tif list_name then\n\t\t\tlocal nodes = m.uci:get_list(appname, s[\".name\"], list_name)\n\t\t\tif nodes then\n\t\t\t\tlocal changed = false\n\t\t\t\tlocal new_nodes = {}\n\t\t\t\tfor _, node in ipairs(nodes) do\n\t\t\t\t\tif node ~= socks then\n\t\t\t\t\t\ttable.insert(new_nodes, node)\n\t\t\t\t\telse\n\t\t\t\t\t\tchanged = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif changed then\n\t\t\t\t\tm.uci:set_list(appname, s[\".name\"], list_name, new_nodes)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif s[\"fallback_node\"] == socks then\n\t\t\tm:del(s[\".name\"], \"fallback_node\")\n\t\tend\n\tend)\n\tTypedSection.remove(e, t)\nend\n\no = s2:option(DummyValue, \"status\", translate(\"Status\"))\no.rawhtml = true\no.cfgvalue = function(t, n)\n\treturn string.format('<div class=\"_status\" socks_id=\"%s\"></div>', n)\nend\n\n---- Enable\no = s2:option(Flag, \"enabled\", translate(\"Enable\"))\no.default = 1\no.rmempty = false\n\no = s2:option(ListValue, \"node\", translate(\"Socks Node\"))\no.template = appname .. \"/cbi/nodes_listvalue\"\no.group = {}\n\no = s2:option(DummyValue, \"now_node\", translate(\"Current Node\"))\no.rawhtml = true\no.cfgvalue = function(_, n)\n\tlocal current_node = api.get_cache_var(\"socks_\" .. n)\n\tif current_node then\n\t\tlocal node = m:get(current_node)\n\t\tif node then\n\t\t\treturn (api.get_node_remarks(node) or \"\"):gsub(\"(：)%[\", \"%1<br>[\")\n\t\tend\n\tend\nend\n\nlocal n = 1\nm.uci:foreach(appname, \"socks\", function(s)\n\tif s[\".name\"] == section then\n\t\treturn false\n\tend\n\tn = n + 1\nend)\n\no = s2:option(Value, \"port\", \"Socks \" .. translate(\"Listen Port\"))\no.default = n + 1080\no.datatype = \"port\"\no.rmempty = false\n\nif has_singbox or has_xray then\n\to = s2:option(Value, \"http_port\", \"HTTP \" .. translate(\"Listen Port\"))\n\to.default = 0\n\to.datatype = \"port\"\nend\n\nlocal tcp = s.fields[\"tcp_node\"]\nlocal udp = s.fields[\"udp_node\"]\nlocal socks = s2.fields[\"node\"]\nfor k, v in pairs(socks_list) do\n\ttcp:value(v.id, v[\"remark\"])\n\ttcp.group[#tcp.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\tudp:value(v.id, v[\"remark\"])\n\tudp.group[#udp.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\nend\nfor k, v in pairs(nodes_table) do\n\tif #normal_list == 0 and #iface_list == 0 then\n\t\tbreak\n\tend\n\tif v.protocol == \"_shunt\" then\n\t\tif has_singbox or has_xray then\n\t\t\ttcp:value(v.id, v[\"remark\"])\n\t\t\ttcp.group[#tcp.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\t\t\tudp:value(v.id, v[\"remark\"])\n\t\t\tudp.group[#udp.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\n\t\t\ts.fields[\"_node_sel_shunt\"]:depends({ tcp_node = v.id })\n\t\t\tif m:get(v.id, \"type\") == \"Xray\" then\n\t\t\t\ts.fields[\"xray_dns_mode\"]:depends({ tcp_node = v.id })\n\t\t\telse\n\t\t\t\ts.fields[\"singbox_dns_mode\"]:depends({ tcp_node = v.id })\n\t\t\tend\n\t\tend\n\telse\n\t\ttcp:value(v.id, v[\"remark\"])\n\t\ttcp.group[#tcp.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\t\tudp:value(v.id, v[\"remark\"])\n\t\tudp.group[#udp.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\tend\n\tif v.type == \"Socks\" then\n\t\tif has_singbox or has_xray then\n\t\t\tsocks:value(v.id, v[\"remark\"])\n\t\t\tsocks.group[#socks.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\t\tend\n\telse\n\t\tsocks:value(v.id, v[\"remark\"])\n\t\tsocks.group[#socks.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\tend\nend\n\nlocal footer = Template(appname .. \"/global/footer\")\nfooter.api = api\nfooter.global_cfgid = global_cfgid\nfooter.shunt_list = api.jsonc.stringify(shunt_list)\nm:append(footer)\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/haproxy.lua",
    "content": "local api = require \"luci.passwall.api\"\nlocal appname = api.appname\nlocal datatypes = api.datatypes\nlocal net = require \"luci.model.network\".init()\n\nlocal nodes_table = {}\nfor k, e in ipairs(api.get_valid_nodes()) do\n\tif e.node_type == \"normal\" then\n\t\tnodes_table[#nodes_table + 1] = {\n\t\t\tid = e[\".name\"],\n\t\t\tobj = e,\n\t\t\tremarks = e[\"remark\"],\n\t\t\tgroup = e[\"group\"]\n\t\t}\n\tend\nend\n\nm = Map(appname, \"HAPROXY \" .. translate(\"Load Balancing\"))\napi.set_apply_on_parse(m)\n\nm:append(Template(appname .. \"/cbi/nodes_value_com\"))\n\n-- [[ Haproxy Settings ]]--\ns = m:section(TypedSection, \"global_haproxy\", translate(\"Basic Settings\"))\ns.anonymous = true\n\ns:append(Template(appname .. \"/haproxy/status\"))\n\n---- Balancing Enable\no = s:option(Flag, \"balancing_enable\", translate(\"Enable Load Balancing\"))\no.rmempty = false\no.default = false\n\n---- Console Login Auth\no = s:option(Flag, \"console_auth\", translate(\"Console Login Auth\"))\no.default = false\no:depends(\"balancing_enable\", true)\n\n---- Console Username\no = s:option(Value, \"console_user\", translate(\"Console Username\"))\no.default = \"\"\no:depends(\"console_auth\", true)\n\n---- Console Password\no = s:option(Value, \"console_password\", translate(\"Console Password\"))\no.password = true\no.default = \"\"\no:depends(\"console_auth\", true)\n\n---- Console Port\no = s:option(Value, \"console_port\", translate(\"Console Port\"), translate(\"In the browser input routing IP plus port access, such as:192.168.1.1:1188\"))\no.datatype = \"port\"\no.default = 1188\no:depends(\"balancing_enable\", true)\n\no = s:option(Flag, \"bind_local\", translate(\"Haproxy Port\") .. \" \" .. translate(\"Bind Local\"), translate(\"When selected, it can only be accessed localhost.\"))\no.default = \"0\"\no:depends(\"balancing_enable\", true)\n\no = s:option(ListValue, \"balancingStrategy\", translate(\"Balancing Strategy\"))\no:value(\"roundrobin\", \"roundRobin\")\no:value(\"random\", \"random\")\no:value(\"leastconn\", \"leastConn\")\no:value(\"source\", \"source\")\no.default = \"roundrobin\"\no:depends(\"balancing_enable\", true)\n\n---- Health Check Type\no = s:option(ListValue, \"health_check_type\", translate(\"Health Check Type\"))\no.default = \"passwall_logic\"\no:value(\"tcp\", \"TCP\")\no:value(\"passwall_logic\", translate(\"URL Test\") .. string.format(\"(passwall %s)\", translate(\"Inner implement\")))\no:depends(\"balancing_enable\", true)\n\n---- Passwall Inner implement Probe URL\no = s:option(Value, \"health_probe_url\", translate(\"Probe URL\"))\no:value(\"https://cp.cloudflare.com/\", \"Cloudflare\")\no:value(\"https://www.gstatic.com/generate_204\", \"Gstatic\")\no:value(\"https://www.google.com/generate_204\", \"Google\")\no:value(\"https://www.youtube.com/generate_204\", \"YouTube\")\no:value(\"https://connect.rom.miui.com/generate_204\", \"MIUI (CN)\")\no:value(\"https://connectivitycheck.platform.hicloud.com/generate_204\", \"HiCloud (CN)\")\no.default = o.keylist[3]\no.description = translate(\"The URL used to detect the connection status.\")\no:depends(\"health_check_type\", \"passwall_logic\")\n\n---- Health Check Inter\no = s:option(Value, \"health_check_inter\", translate(\"Health Check Inter\"))\no.datatype = \"min(20)\"\no.default = 60\no:depends(\"balancing_enable\", true)\no.description = translate(\"Units:seconds\") .. \" ( ≥ 20s )<br>\" ..\n\t\ttranslate(\"Note: Frequent health checks increase CPU usage; an interval ≥ 60 seconds is recommended.\")\n\no = s:option(DummyValue, \"health_check_tips\", \"　\")\no.rawhtml = true\no.cfgvalue = function(t, n)\n\treturn string.format('<span style=\"color: red\">%s</span>', translate(\"When the URL test is used, the load balancing node will be converted into a Socks node. when node list set customizing, must be a Socks node, otherwise the health check will be invalid.\"))\nend\no:depends(\"health_check_type\", \"passwall_logic\")\n\n-- [[ Balancing Settings ]]--\ns = m:section(TypedSection, \"haproxy_config\", translate(\"Node List\"))\ns.description = \"<font color='red'>\" ..\n\t\ttranslate(\"Add a node, Export Of Multi WAN Only support Multi Wan. Load specific gravity range 1-256. Multiple primary servers can be load balanced, standby will only be enabled when the primary server is offline! Multiple groups can be set, Haproxy port same one for each group.\") .. \"<br>\" ..\n\t\ttranslate(\"Note that the node configuration parameters for load balancing must be consistent when use TCP health check type, otherwise it cannot be used normally!\") .. \"</font>\"\ns.template = \"cbi/tblsection\"\ns.sortable = true\ns.anonymous = true\ns.addremove = true\n\ns.create = function(e, t)\n\tTypedSection.create(e, api.gen_short_uuid())\nend\n\ns.remove = function(self, section)\n\tfor k, v in pairs(self.children) do\n\t\tv.rmempty = true\n\t\tv.validate = nil\n\tend\n\tTypedSection.remove(self, section)\nend\n\n---- Enable\no = s:option(Flag, \"enabled\", translate(\"Enable\"))\no.default = 1\no.rmempty = false\n\n---- Node Address\no = s:option(Value, \"lbss\", translate(\"Node Address\"))\no.template = appname .. \"/cbi/nodes_value\"\no.group = {}\nfor k, v in pairs(nodes_table) do\n\to:value(v.id, v.remarks)\n\to.group[#o.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\nend\no.rmempty = false\no.validate = function(self, value)\n\tif not value then return nil, translate(\"Node address cannot be empty.\") end\n\tlocal t = m:get(value) or nil\n\tif t and t[\".type\"] == \"nodes\" then\n\t\treturn value\n\tend\n\tif datatypes.hostport(value) or datatypes.ip4addrport(value) then\n\t\treturn value\n\tend\n\tif api.is_ipv6addrport(value) then\n\t\treturn value\n\tend\n\treturn nil, translate(\"Not valid IP format, please re-enter!\") .. \" (IP:Port)\"\nend\n\n---- Haproxy Port\no = s:option(Value, \"haproxy_port\", translate(\"Haproxy Port\"))\no.datatype = \"port\"\no.default = 1181\no.rmempty = false\n\n---- Node Weight\no = s:option(Value, \"lbweight\", translate(\"Node Weight\"))\no.datatype = \"min(1)\"\no.default = 5\no.rmempty = false\n\n---- Export\no = s:option(ListValue, \"export\", translate(\"Export Of Multi WAN\"))\no:value(0, translate(\"Auto\"))\nlocal wa = require \"luci.tools.webadmin\"\nwa.cbi_add_networks(o)\no.default = 0\no.rmempty = false\n\n---- Mode\no = s:option(ListValue, \"backup\", translate(\"Mode\"))\no:value(0, translate(\"Primary\"))\no:value(1, translate(\"Standby\"))\no.rmempty = false\n\nm:append(Template(appname .. \"/haproxy/js\"))\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/include/shunt_options.lua",
    "content": "local m, s, data = ...\n\nif not data.node_id or not data.node then\n\treturn\nend\n\nlocal current_node_id = data.node_id\nlocal node_list = data.node_list or api.get_node_list()\n\nlocal function get_cfgvalue()\n\treturn function(self, section)\n\t\treturn m:get(current_node_id, self.option)\n\tend\nend\nlocal function get_write()\n\treturn function(self, section, value)\n\t\tif data.verify_option then\n\t\t\tif data.verify_option:formvalue(section) == current_node_id then\n\t\t\t\tm:set(current_node_id, self.option, value)\n\t\t\tend\n\t\telse\n\t\t\tm:set(current_node_id, self.option, value)\n\t\tend\n\tend\nend\nlocal function get_remove()\n\treturn function(self, section)\n\t\tif data.verify_option then\n\t\t\tif data.verify_option:formvalue(section) == current_node_id then\n\t\t\t\tm:del(current_node_id, self.option)\n\t\t\tend\n\t\telse\n\t\t\tm:del(current_node_id, self.option)\n\t\tend\n\tend\nend\n\nif data.tab then\n\ts:tab(data.tab, data.tab_desc)\nend\n\nlocal function add_option(class, option_name, option_title, option_desc)\n\tlocal a\n\tif data.tab then\n\t\ta = s:taboption(data.tab, class, option_name, option_title)\n\telse\n\t\ta = s:option(class, option_name, option_title)\n\tend\n\tif a then\n\t\tif option_desc then\n\t\t\ta.description = option_desc\n\t\tend\n\t\ta.cfgvalue = get_cfgvalue()\n\t\ta.write = get_write()\n\t\ta.remove = get_remove()\n\tend\n\tif data.verify_option then\n\t\ta:depends(data.verify_option.option, current_node_id)\n\tend\n\treturn a\nend\n\nlocal function add_depends(o, deps)\n\tif #o.deps > 0 then\n\t\tfor index, value in ipairs(o.deps) do\n\t\t\tfor k, v in pairs(deps) do\n\t\t\t\to.deps[index][k] = v\n\t\t\tend\n\t\tend\n\telse\n\t\to:depends(deps)\n\tend\nend\n\nif data.node.type == \"Xray\" then\n\to = add_option(ListValue, \"domainStrategy\", translate(\"Domain Strategy\"))\n\to:value(\"AsIs\")\n\to:value(\"IPIfNonMatch\")\n\to:value(\"IPOnDemand\")\n\to.default = \"IPOnDemand\"\n\to.description = \"<br /><ul><li>\" .. translate(\"'AsIs': Only use domain for routing. Default value.\")\n\t\t.. \"</li><li>\" .. translate(\"'IPIfNonMatch': When no rule matches current domain, resolves it into IP addresses (A or AAAA records) and try all rules again.\")\n\t\t.. \"</li><li>\" .. translate(\"'IPOnDemand': As long as there is a IP-based rule, resolves the domain into IP immediately.\")\n\t\t.. \"</li></ul>\"\n\n\to = add_option(ListValue, \"domainMatcher\", translate(\"Domain matcher\"))\n\to:value(\"hybrid\")\n\to:value(\"linear\")\nend\n\no = add_option(Flag, \"fakedns\", '<a style=\"color:#FF8C00\">FakeDNS</a>' .. \" \" .. translate(\"Main switch\"), translate(\"Use FakeDNS work in the domain that proxy.\") .. \"<br>\" ..\n\ttranslate(\"Suitable scenarios for let the node servers get the target domain names.\") .. \"<br>\" ..\n\ttranslate(\"Such as: DNS unlocking of streaming media, reducing DNS query latency, etc.\"))\n\nlocal shunt_rules = {}\nm.uci:foreach(appname, \"shunt_rules\", function(e)\n\te.id = e[\".name\"]\n\te.remarks = e.remarks or e[\".name\"]\n\te[\"_node_option\"] = e[\".name\"]\n\te[\"_node_default\"] = \"\"\n\te[\"_fakedns_option\"] = e[\".name\"] .. \"_fakedns\"\n\te[\"_proxy_tag_option\"] = e[\".name\"] .. \"_proxy_tag\"\n\ttable.insert(shunt_rules, e)\nend)\ntable.insert(shunt_rules, {\n\tid = \".default\",\n\tremarks = translate(\"Default\"),\n\t_node_option = \"default_node\",\n\t_node_default = \"_direct\",\n\t_fakedns_option = \"default_fakedns\",\n\t_proxy_tag_option = \"default_proxy_tag\",\n})\n\ns2 = m:section(Table, shunt_rules, \" \")\ns2.config = appname\ns2.sectiontype = \"shunt_option_list\"\n\no = s2:option(DummyValue, \"remarks\", translate(\"Rule\"))\no.rawhtml = true\no.cfgvalue = function(self, section)\n\tif shunt_rules[section].id == \".default\" then\n\t\treturn string.format('<font style=\"color: red\">%s</font>', shunt_rules[section].remarks)\n\telse\n\t\treturn string.format('<a href=\"%s\" target=\"_blank\">%s</a>', api.url(\"shunt_rules\", shunt_rules[section].id), shunt_rules[section].remarks)\n\tend\nend\n\n_node = s2:option(Value, \"_node\", translate(\"Node\"))\n_node.template = appname .. \"/cbi/nodes_listvalue\"\n_node.group = {\"\",\"\",\"\",\"\"}\n_node:value(\"\", translate(\"Close (Not use)\"))\n_node:value(\"_default\", translate(\"Use default node\"))\n_node:value(\"_direct\", translate(\"Direct Connection\"))\n_node:value(\"_blackhole\", translate(\"Blackhole (Block)\"))\n_node.cfgvalue = function(self, section)\n\treturn m:get(current_node_id, shunt_rules[section][\"_node_option\"]) or shunt_rules[section][\"_node_default\"]\nend\n_node.write = function(self, section, value)\n\treturn m:set(current_node_id, shunt_rules[section][\"_node_option\"], value)\nend\n_node.remove = function(self, section)\n\treturn m:del(current_node_id, shunt_rules[section][\"_node_option\"])\nend\n\no = s2:option(Flag, \"_fakedns\", string.format('<a style=\"color:#FF8C00\" title=\"%s\">FakeDNS</a>', translate(\"Use FakeDNS work in the domain that proxy.\") .. \"\\n\" ..\n\ttranslate(\"Suitable scenarios for let the node servers get the target domain names.\") .. \"\\n\" ..\n\ttranslate(\"Such as: DNS unlocking of streaming media, reducing DNS query latency, etc.\")))\no.cfgvalue = function(self, section)\n\treturn m:get(current_node_id, shunt_rules[section][\"_fakedns_option\"])\nend\no.write = function(self, section, value)\n\treturn m:set(current_node_id, shunt_rules[section][\"_fakedns_option\"], value)\nend\no.remove = function(self, section)\n\treturn m:del(current_node_id, shunt_rules[section][\"_fakedns_option\"])\nend\n\nproxy_tag_node = s2:option(ListValue, \"_proxy_tag\", string.format('<a style=\"color:red\" title=\"%s\">%s</a>',\n\ttranslate(\"Set the node to be used as a pre-proxy.\") .. \"\\n\" .. translate(\"Each rule has a separate switch that controls whether this rule uses the pre-proxy or not.\"),\n\ttranslate(\"Preproxy\")))\nproxy_tag_node.template = appname .. \"/cbi/nodes_listvalue\"\nproxy_tag_node.group = {\"\"}\nproxy_tag_node:value(\"\", translate(\"Close (Not use)\"))\nproxy_tag_node.cfgvalue = function(self, section)\n\treturn m:get(current_node_id, shunt_rules[section][\"_proxy_tag_option\"])\nend\nproxy_tag_node.write = function(self, section, value)\n\treturn m:set(current_node_id, shunt_rules[section][\"_proxy_tag_option\"], value)\nend\nproxy_tag_node.remove = function(self, section)\n\treturn m:del(current_node_id, shunt_rules[section][\"_proxy_tag_option\"])\nend\n\nfor k1, v1 in pairs(node_list) do\n\tif k1 ~= \"shunt_list\" then\n\t\tfor i, v in ipairs(v1) do\n\t\t\t_node:value(v.id, v.remark)\n\t\t\t_node.group[#_node.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\n\t\t\tproxy_tag_node:value(v.id, v.remark)\n\t\t\tproxy_tag_node.group[#proxy_tag_node.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\t\tend\n\tend\nend\n\nlocal footer = Template(appname .. \"/include/shunt_options\")\nfooter.api = api\nfooter.id = current_node_id\nfooter.normal_list = api.jsonc.stringify(node_list.normal_list)\nm:append(footer)\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/log.lua",
    "content": "local api = require \"luci.passwall.api\"\nlocal appname = \"passwall\"\n\nf = SimpleForm(appname)\nf.reset = false\nf.submit = false\nf:append(Template(appname .. \"/log/log\"))\nreturn f\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/node_config.lua",
    "content": "api = require \"luci.passwall.api\"\nappname = \"passwall\"\n\nm = Map(appname, translate(\"Node Config\"))\nm.redirect = api.url(\"node_list\")\napi.set_apply_on_parse(m)\n\nif not arg[1] or not m:get(arg[1]) then\n\tluci.http.redirect(m.redirect)\nend\n\nfs = require \"nixio.fs\"\nformvalue_key = \"cbid.\" .. appname .. \".\" .. arg[1] .. \".\"\n\nlocal header = Template(appname .. \"/node_config/header\")\nheader.api = api\nheader.section = arg[1]\nm:append(header)\n\nm:append(Template(appname .. \"/cbi/nodes_multivalue_com\"))\nm:append(Template(appname .. \"/cbi/nodes_listvalue_com\"))\n\ngroups = {}\nm.uci:foreach(appname, \"nodes\", function(s)\n\tif s[\".name\"] ~= arg[1] then\n\t\tif s.group and s.group ~= \"\" then\n\t\t\tgroups[s.group] = true\n\t\tend\n\tend\nend)\n\ns = m:section(NamedSection, arg[1], \"nodes\", \"\")\ns.addremove = false\ns.dynamic = false\n\no = s:option(DummyValue, \"passwall\", \"　\")\no.rawhtml  = true\no.template = \"passwall/node_config/link_share_man\"\no.value = arg[1]\n\no = s:option(Value, \"remarks\", translate(\"Node Remarks\"))\no.default = translate(\"Remarks\")\no.rmempty = false\n\no = s:option(Value, \"group\", translate(\"Group Name\"))\no.default = \"\"\no:value(\"\", translate(\"default\"))\nfor k, v in pairs(groups) do\n\to:value(k)\nend\no.write = function(self, section, value)\n\tvalue = api.trim(value)\n\tlocal lower = value:lower()\n\n\tif lower == \"\" or lower == \"default\" then\n\t\treturn m:del(section, self.option)\n\tend\n\n\tfor _, v in ipairs(self.keylist or {}) do\n\t\tif v:lower() == lower then\n\t\t\treturn m:set(section, self.option, v)\n\t\tend\n\tend\n\tm:set(section, self.option, value)\nend\n\nlocal types_dir = \"/usr/lib/lua/luci/model/cbi/passwall/client/type/\"\ns.val = {}\ns.val[\"type\"] = m.uci:get(appname, arg[1], \"type\")\ns.val[\"protocol\"] = m.uci:get(appname, arg[1], \"protocol\")\n\nif luci.http.formvalue(\"cbi.submit\") == \"1\" then\n\tlocal formvalue_type = luci.http.formvalue(formvalue_key .. \"type\")\n\tif formvalue_type then\n\t\ts.val[\"type\"] = formvalue_type\n\tend\nend\n\no = s:option(ListValue, \"type\", translate(\"Type\"))\n\nif api.is_finded(\"ipt2socks\") then\n\ts.fields[\"type\"]:value(\"Socks\", translate(\"Socks\"))\n\n\tif s.val[\"type\"] == \"Socks\" then\n\t\tlocal function _n(name)\n\t\t\treturn \"socks_\" .. name\n\t\tend\n\t\to = s:option(ListValue, _n(\"del_protocol\"), \"　\") --始终隐藏，用于删除 protocol\n\t\to:depends({ [_n(\"__hide\")] = \"1\" })\n\t\to.rewrite_option = \"protocol\"\n\n\t\to = s:option(Value, _n(\"address\"), translate(\"Address (Support Domain Name)\"))\n\n\t\to = s:option(Value, _n(\"port\"), translate(\"Port\"))\n\t\to.datatype = \"port\"\n\n\t\to = s:option(Value, _n(\"username\"), translate(\"Username\"))\n\n\t\to = s:option(Value, _n(\"password\"), translate(\"Password\"))\n\t\to.password = true\n\n\t\tapi.luci_types(arg[1], m, s, \"Socks\", \"socks_\")\n\tend\n\nend\n\nlocal type_table = {}\nfor filename in fs.dir(types_dir) do\n\ttable.insert(type_table, filename)\nend\ntable.sort(type_table)\n\nfor index, value in ipairs(type_table) do\n\tlocal p_func = loadfile(types_dir .. value)\n\tsetfenv(p_func, getfenv(1))(m, s)\nend\n\nlocal footer = Template(appname .. \"/node_config/footer\")\nfooter.api = api\nfooter.section = arg[1]\n\nm:append(footer)\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/node_list.lua",
    "content": "local api = require \"luci.passwall.api\"\nlocal appname = \"passwall\"\nlocal sys = api.sys\nlocal datatypes = api.datatypes\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\n-- [[ Other Settings ]]--\ns = m:section(TypedSection, \"global_other\")\ns.anonymous = true\n\no = s:option(ListValue, \"auto_detection_time\", translate(\"Automatic detection delay\"))\no:value(\"0\", translate(\"Close\"))\no:value(\"icmp\", \"Ping\")\no:value(\"tcping\", \"TCP Ping\")\n\no = s:option(Flag, \"show_node_info\", translate(\"Show server address and port\"))\no.default = \"0\"\n\no = s:option(Value, \"url_test_url\", translate(\"URL Test Address\"))\no:value(\"https://cp.cloudflare.com/\", \"Cloudflare\")\no:value(\"https://www.gstatic.com/generate_204\", \"Gstatic\")\no:value(\"https://www.google.com/generate_204\", \"Google\")\no:value(\"https://www.youtube.com/generate_204\", \"YouTube\")\no:value(\"https://connect.rom.miui.com/generate_204\", \"MIUI (CN)\")\no:value(\"https://connectivitycheck.platform.hicloud.com/generate_204\", \"HiCloud (CN)\")\no.default = o.keylist[3]\n\n-- [[ Add the node via the link ]]--\ns:append(Template(appname .. \"/node_list/link_add_node\"))\n\nm:append(Template(appname .. \"/node_list/node_list\"))\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe.lua",
    "content": "local api = require \"luci.passwall.api\"\nlocal uci = api.uci\nlocal appname = \"passwall\"\nlocal has_ss = api.is_finded(\"ss-redir\")\nlocal has_ss_rust = api.is_finded(\"sslocal\")\nlocal has_singbox = api.finded_com(\"sing-box\")\nlocal has_xray = api.finded_com(\"xray\")\nlocal has_hysteria2 = api.finded_com(\"hysteria\")\nlocal ss_type = {}\nlocal trojan_type = {}\nlocal vmess_type = {}\nlocal vless_type = {}\nlocal hysteria2_type = {}\nlocal xray_version = api.get_app_version(\"xray\")\nif has_ss then\n\tlocal s = \"shadowsocks-libev\"\n\ttable.insert(ss_type, s)\nend\nif has_ss_rust then\n\tlocal s = \"shadowsocks-rust\"\n\ttable.insert(ss_type, s)\nend\nif has_singbox then\n\tlocal s = \"sing-box\"\n\ttable.insert(trojan_type, s)\n\ttable.insert(ss_type, s)\n\ttable.insert(vmess_type, s)\n\ttable.insert(vless_type, s)\n\ttable.insert(hysteria2_type, s)\nend\nif has_xray then\n\tlocal s = \"xray\"\n\ttable.insert(trojan_type, s)\n\ttable.insert(ss_type, s)\n\ttable.insert(vmess_type, s)\n\ttable.insert(vless_type, s)\n\tif api.compare_versions(xray_version, \">=\", \"26.1.13\") then\n\t\ttable.insert(hysteria2_type, s)\n\tend\nend\nif has_hysteria2 then\n\tlocal s = \"hysteria2\"\n\ttable.insert(hysteria2_type, s)\nend\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\nfunction m.on_before_save(self)\n\tif self.no_commit then\n\t\treturn\n\tend\n\tself.uci:foreach(appname, \"subscribe_list\", function(e)\n\t\tself:del(e[\".name\"], \"md5\")\n\tend)\nend\n\n-- [[ Subscribe Settings ]]--\ns = m:section(TypedSection, \"global_subscribe\", \"\")\ns.anonymous = true\n\no = s:option(ListValue, \"filter_keyword_mode\", translate(\"Filter keyword Mode\"))\no:value(\"0\", translate(\"Close\"))\no:value(\"1\", translate(\"Discard List\"))\no:value(\"2\", translate(\"Keep List\"))\no:value(\"3\", translate(\"Discard List,But Keep List First\"))\no:value(\"4\", translate(\"Keep List,But Discard List First\"))\n\no = s:option(DynamicList, \"filter_discard_list\", translate(\"Discard List\"))\n\no = s:option(DynamicList, \"filter_keep_list\", translate(\"Keep List\"))\n\nif #ss_type > 0 then\n\to = s:option(ListValue, \"ss_type\", translatef(\"%s Node Use Type\", \"Shadowsocks\"))\n\to:value(\"\", translate(\"Auto\"))\n\tfor key, value in pairs(ss_type) do\n\t\to:value(value)\n\tend\nend\n\nif #trojan_type > 0 then\n\to = s:option(ListValue, \"trojan_type\", translatef(\"%s Node Use Type\", \"Trojan\"))\n\to:value(\"\", translate(\"Auto\"))\n\tfor key, value in pairs(trojan_type) do\n\t\to:value(value)\n\tend\nend\n\nif #vmess_type > 0 then\n\to = s:option(ListValue, \"vmess_type\", translatef(\"%s Node Use Type\", \"VMess\"))\n\to:value(\"\", translate(\"Auto\"))\n\tfor key, value in pairs(vmess_type) do\n\t\to:value(value)\n\tend\nend\n\nif #vless_type > 0 then\n\to = s:option(ListValue, \"vless_type\", translatef(\"%s Node Use Type\", \"VLESS\"))\n\to:value(\"\", translate(\"Auto\"))\n\tfor key, value in pairs(vless_type) do\n\t\to:value(value)\n\tend\nend\n\nif #hysteria2_type > 0 then\n\to = s:option(ListValue, \"hysteria2_type\", translatef(\"%s Node Use Type\", \"Hysteria2\"))\n\to:value(\"\", translate(\"Auto\"))\n\tfor key, value in pairs(hysteria2_type) do\n\t\to:value(value)\n\tend\nend\n\nif #ss_type > 0 or #trojan_type > 0 or #vmess_type > 0 or #vless_type > 0 or #hysteria2_type > 0 then\n\to.description = string.format(\"<font color='red'>%s</font>\",\n\t\t\ttranslate(\"The configured type also applies to the core specified when manually importing nodes.\"))\nend\n\n---- Subscribe Delete All\no = s:option(DummyValue, \"_stop\", translate(\"Delete All Subscribe Node\"))\no.rawhtml = true\nfunction o.cfgvalue(self, section)\n\treturn string.format(\n\t\t[[<input type=\"button\" class=\"btn cbi-button cbi-button-remove\" onclick=\"return confirmDeleteAll()\" value=\"%s\" />]],\n\t\ttranslate(\"Delete All Subscribe Node\"))\nend\n\no = s:option(DummyValue, \"_update\", translate(\"Manual subscription All\"))\no.rawhtml = true\no.cfgvalue = function(self, section)\n    return string.format([[\n        <input type=\"button\" class=\"btn cbi-button cbi-button-apply\" onclick=\"ManualSubscribeAll()\" value=\"%s\" />]],\n\t translate(\"Manual subscription All\"))\nend\n\ns = m:section(TypedSection, \"subscribe_list\", \"\", \"<font color='red'>\" .. translate(\"When adding a new subscription, please save and apply before manually subscribing. If you only change the subscription URL, you can subscribe manually, and the system will save it automatically.\") .. \"</font>\")\ns.addremove = true\ns.anonymous = true\ns.sortable = true\ns.template = \"cbi/tblsection\"\ns.extedit = api.url(\"node_subscribe_config\", \"%s\")\nfunction s.create(e, t)\n\tm.no_commit = true\n\tlocal id = TypedSection.create(e, t)\n\tluci.http.redirect(e.extedit:format(id))\nend\n\no = s:option(Value, \"remark\", translate(\"Remarks\"))\no.width = \"auto\"\no.rmempty = false\no.validate = function(self, value, section)\n\tvalue = api.trim(value)\n\tif value == \"\" then\n\t\treturn nil, translate(\"Remark cannot be empty.\")\n\tend\n\tlocal duplicate = false\n\tm.uci:foreach(appname, \"subscribe_list\", function(e)\n\t\tif e[\".name\"] ~= section and e[\"remark\"] and e[\"remark\"]:lower() == value:lower() then\n\t\t\tduplicate = true\n\t\t\treturn false\n\t\tend\n\tend)\n\tif duplicate or value:lower() == \"default\" then\n\t\treturn nil, translate(\"This remark already exists, please change a new remark.\")\n\tend\n\treturn value\nend\no.write = function(self, section, value)\n\tlocal old = m:get(section, self.option) or \"\"\n\tif old ~= value then\n\t\tm.uci:foreach(appname, \"nodes\", function(e)\n\t\t\tif e[\"group\"] and e[\"group\"]:lower() == old:lower() then\n\t\t\t\tm.uci:set(appname, e[\".name\"], \"group\", value)\n\t\t\tend\n\t\t\tif e[\"protocol\"] and (e[\"protocol\"] == \"_balancing\" or e[\"protocol\"] == \"_urltest\") and e[\"node_group\"] then\n\t\t\t\tlocal gs = \"\"\n\t\t\t\tfor g in e[\"node_group\"]:gmatch(\"%S+\") do\n\t\t\t\t\tif api.UrlEncode(old) == g then\n\t\t\t\t\t\tgs = gs .. \" \" .. api.UrlEncode(value)\n\t\t\t\t\telse\n\t\t\t\t\t\tgs = gs .. \" \" .. g\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tgs = api.trim(gs)\n\t\t\t\tm.uci:set(appname, e[\".name\"], \"node_group\", gs)\n\t\t\tend\n\t\tend)\n\tend\n\treturn Value.write(self, section, value)\nend\n\no = s:option(DummyValue, \"_node_count\", translate(\"Subscribe Info\"))\no.rawhtml = true\no.cfgvalue = function(t, n)\n\tlocal remark = m:get(n, \"remark\") or \"\"\n\tlocal str = m:get(n, \"rem_traffic\") or \"\"\n\tlocal expired_date = m:get(n, \"expired_date\") or \"\"\n\tif expired_date ~= \"\" then\n\t\tstr = str .. (str ~= \"\" and \"/\" or \"\") .. expired_date\n\tend\n\tstr = str ~= \"\" and \"<br>\" .. str or \"\"\n\tlocal num = 0\n\tm.uci:foreach(appname, \"nodes\", function(s)\n\t\tif s[\"group\"] and s[\"group\"]:lower() == remark:lower() then\n\t\t\tnum = num + 1\n\t\tend\n\tend)\n\treturn string.format(\"%s%s\", translate(\"Node num\") .. \": \" .. num, str)\nend\n\no = s:option(Value, \"url\", translate(\"Subscribe URL\"))\no.width = \"auto\"\no.rmempty = false\n\no = s:option(DummyValue, \"_remove\", translate(\"Delete the subscribed node\"))\no.rawhtml = true\nfunction o.cfgvalue(self, section)\n\tlocal remark = m:get(section, \"remark\") or \"\"\n\treturn string.format(\n\t\t[[<input type=\"button\" class=\"btn cbi-button cbi-button-remove\" onclick=\"return confirmDeleteNode('%s')\" value=\"%s\" />]],\n\t\tremark, translate(\"Delete the subscribed node\"))\nend\n\no = s:option(DummyValue, \"_update\", translate(\"Manual subscription\"))\no.rawhtml = true\no.cfgvalue = function(self, section)\n    return string.format([[\n        <input type=\"button\" class=\"btn cbi-button cbi-button-apply\" onclick=\"ManualSubscribe('%s')\" value=\"%s\" />]],\n\tsection, translate(\"Manual subscription\"))\nend\n\nm:append(Template(appname .. \"/node_subscribe/js\"))\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/node_subscribe_config.lua",
    "content": "local api = require \"luci.passwall.api\"\nlocal uci = api.uci\nlocal appname = \"passwall\"\n\nm = Map(appname)\nm.redirect = api.url(\"node_subscribe\")\napi.set_apply_on_parse(m)\n\nif not arg[1] or not m:get(arg[1]) then\n\tluci.http.redirect(m.redirect)\nend\n\nfunction m.on_before_save(self)\n\tself:del(arg[1], \"md5\")\nend\n\nm:append(Template(appname .. \"/cbi/nodes_listvalue_com\"))\n\nlocal has_ss = api.is_finded(\"ss-redir\")\nlocal has_ss_rust = api.is_finded(\"sslocal\")\nlocal has_singbox = api.finded_com(\"sing-box\")\nlocal has_xray = api.finded_com(\"xray\")\nlocal has_hysteria2 = api.finded_com(\"hysteria\")\nlocal ss_type = {}\nlocal trojan_type = {}\nlocal vmess_type = {}\nlocal vless_type = {}\nlocal hysteria2_type = {}\nlocal xray_version = api.get_app_version(\"xray\")\nif has_ss then\n\tlocal s = \"shadowsocks-libev\"\n\ttable.insert(ss_type, s)\nend\nif has_ss_rust then\n\tlocal s = \"shadowsocks-rust\"\n\ttable.insert(ss_type, s)\nend\nif has_singbox then\n\tlocal s = \"sing-box\"\n\ttable.insert(trojan_type, s)\n\ttable.insert(ss_type, s)\n\ttable.insert(vmess_type, s)\n\ttable.insert(vless_type, s)\n\ttable.insert(hysteria2_type, s)\nend\nif has_xray then\n\tlocal s = \"xray\"\n\ttable.insert(trojan_type, s)\n\ttable.insert(ss_type, s)\n\ttable.insert(vmess_type, s)\n\ttable.insert(vless_type, s)\n\tif api.compare_versions(xray_version, \">=\", \"26.1.13\") then\n\t\ttable.insert(hysteria2_type, s)\n\tend\nend\nif has_hysteria2 then\n\tlocal s = \"hysteria2\"\n\ttable.insert(hysteria2_type, s)\nend\nlocal nodes_table = {}\nfor k, e in ipairs(api.get_valid_nodes()) do\n\tif e.node_type == \"normal\" then\n\t\tnodes_table[#nodes_table + 1] = {\n\t\t\tid = e[\".name\"],\n\t\t\tremark = e[\"remark\"],\n\t\t\ttype = e[\"type\"],\n\t\t\tadd_mode = e[\"add_mode\"],\n\t\t\tchain_proxy = e[\"chain_proxy\"],\n\t\t\tgroup = e[\"group\"]\n\t\t}\n\tend\nend\n\ns = m:section(NamedSection, arg[1])\ns.addremove = false\ns.dynamic = false\n\no = s:option(Value, \"remark\", translate(\"Subscribe Remark\"))\no.rmempty = false\no.validate = function(self, value, section)\n\tvalue = api.trim(value)\n\tif value == \"\" then\n\t\treturn nil, translate(\"Remark cannot be empty.\")\n\tend\n\tlocal duplicate = false\n\tm.uci:foreach(appname, \"subscribe_list\", function(e)\n\t\tif e[\".name\"] ~= section and e[\"remark\"] and e[\"remark\"]:lower() == value:lower() then\n\t\t\tduplicate = true\n\t\t\treturn false\n\t\tend\n\tend)\n\tif duplicate or value:lower() == \"default\" then\n\t\treturn nil, translate(\"This remark already exists, please change a new remark.\")\n\tend\n\treturn value\nend\no.write = function(self, section, value)\n\tlocal old = m:get(section, self.option) or \"\"\n\tif old ~= value then\n\t\tm.uci:foreach(appname, \"nodes\", function(e)\n\t\t\tif e[\"group\"] and e[\"group\"]:lower() == old:lower() then\n\t\t\t\tm.uci:set(appname, e[\".name\"], \"group\", value)\n\t\t\tend\n\t\t\tif e[\"protocol\"] and (e[\"protocol\"] == \"_balancing\" or e[\"protocol\"] == \"_urltest\") and e[\"node_group\"] then\n\t\t\t\tlocal gs = \"\"\n\t\t\t\tfor g in e[\"node_group\"]:gmatch(\"%S+\") do\n\t\t\t\t\tif api.UrlEncode(old) == g then\n\t\t\t\t\t\tgs = gs .. \" \" .. api.UrlEncode(value)\n\t\t\t\t\telse\n\t\t\t\t\t\tgs = gs .. \" \" .. g\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tgs = api.trim(gs)\n\t\t\t\tm.uci:set(appname, e[\".name\"], \"node_group\", gs)\n\t\t\tend\n\t\tend)\n\tend\n\treturn Value.write(self, section, value)\nend\n\no = s:option(TextValue, \"url\", translate(\"Subscribe URL\"))\no.rows = 5\no.rmempty = false\no.validate = function(self, value)\n\tif not value or value == \"\" then\n\t\treturn nil, translate(\"URL cannot be empty.\")\n\tend\n\treturn value:gsub(\"%s+\", \"\"):gsub(\"%z\", \"\")\nend\n\no = s:option(ListValue, \"domain_resolver\", translate(\"Domain DNS Resolve\"))\no.description = translate(\"If the node address is a domain name, this DNS will be used for resolution.\") .. \"<br>\" ..\n\t\ttranslate(\"Supports only Xray or Sing-box node types.\") .. \"<br>\" .. string.format('<font color=\"red\">%s</font>',\n\t\ttranslate(\"Note: For node-specific DNS only. Keep Auto to avoid extra overhead.\"))\no:value(\"\", translate(\"Auto\"))\no:value(\"tcp\", \"TCP\")\no:value(\"udp\", \"UDP\")\no:value(\"https\", \"DoH\")\n\no = s:option(Value, \"domain_resolver_dns\", \"DNS\")\no.datatype = \"or(ipaddr,ipaddrport)\"\no:value(\"114.114.114.114\")\no:value(\"223.5.5.5:53\")\no.default = o.keylist[1]\no:depends({ domain_resolver = \"tcp\" })\no:depends({ domain_resolver = \"udp\" })\n\no = s:option(Value, \"domain_resolver_dns_https\", \"DNS\")\no:value(\"https://120.53.53.53/dns-query\", \"DNSPod\")\no:value(\"https://223.5.5.5/dns-query\", \"AliDNS\")\no.default = o.keylist[1]\no:depends({ domain_resolver = \"https\" })\n\no = s:option(ListValue, \"domain_strategy\", translate(\"Domain Strategy\"), translate(\"If is domain name, The requested domain name will be resolved to IP before connect.\"))\no.default = \"\"\no:value(\"\", translate(\"Auto\"))\no:value(\"UseIPv4v6\", translate(\"Prefer IPv4\"))\no:value(\"UseIPv6v4\", translate(\"Prefer IPv6\"))\no:value(\"UseIPv4\", translate(\"IPv4 Only\"))\no:value(\"UseIPv6\", translate(\"IPv6 Only\"))\n\no = s:option(Flag, \"allowInsecure\", translate(\"allowInsecure\"))\no.default = \"0\"\no.rmempty = false\no.description = translate(\"Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.\") .. \"<br>\" ..\n\t\ttranslate(\"Used when the node link does not include this parameter.\")\n\no = s:option(ListValue, \"filter_keyword_mode\", translate(\"Filter keyword Mode\"))\no.default = \"5\"\no:value(\"0\", translate(\"Close\"))\no:value(\"1\", translate(\"Discard List\"))\no:value(\"2\", translate(\"Keep List\"))\no:value(\"3\", translate(\"Discard List,But Keep List First\"))\no:value(\"4\", translate(\"Keep List,But Discard List First\"))\no:value(\"5\", translate(\"Use global config\"))\n\no = s:option(DynamicList, \"filter_discard_list\", translate(\"Discard List\"))\no:depends(\"filter_keyword_mode\", \"1\")\no:depends(\"filter_keyword_mode\", \"3\")\no:depends(\"filter_keyword_mode\", \"4\")\n\no = s:option(DynamicList, \"filter_keep_list\", translate(\"Keep List\"))\no:depends(\"filter_keyword_mode\", \"2\")\no:depends(\"filter_keyword_mode\", \"3\")\no:depends(\"filter_keyword_mode\", \"4\")\n\nif #ss_type > 0 then\n\to = s:option(ListValue, \"ss_type\", translatef(\"%s Node Use Type\", \"Shadowsocks\"))\n\to.default = \"global\"\n\to:value(\"global\", translate(\"Use global config\"))\n\tfor key, value in pairs(ss_type) do\n\t\to:value(value)\n\tend\nend\n\nif #trojan_type > 0 then\n\to = s:option(ListValue, \"trojan_type\", translatef(\"%s Node Use Type\", \"Trojan\"))\n\to.default = \"global\"\n\to:value(\"global\", translate(\"Use global config\"))\n\tfor key, value in pairs(trojan_type) do\n\t\to:value(value)\n\tend\nend\n\nif #vmess_type > 0 then\n\to = s:option(ListValue, \"vmess_type\", translatef(\"%s Node Use Type\", \"VMess\"))\n\to.default = \"global\"\n\to:value(\"global\", translate(\"Use global config\"))\n\tfor key, value in pairs(vmess_type) do\n\t\to:value(value)\n\tend\nend\n\nif #vless_type > 0 then\n\to = s:option(ListValue, \"vless_type\", translatef(\"%s Node Use Type\", \"VLESS\"))\n\to.default = \"global\"\n\to:value(\"global\", translate(\"Use global config\"))\n\tfor key, value in pairs(vless_type) do\n\t\to:value(value)\n\tend\nend\n\nif #hysteria2_type > 0 then\n\to = s:option(ListValue, \"hysteria2_type\", translatef(\"%s Node Use Type\", \"Hysteria2\"))\n\to.default = \"global\"\n\to:value(\"global\", translate(\"Use global config\"))\n\tfor key, value in pairs(hysteria2_type) do\n\t\to:value(value)\n\tend\nend\n\no = s:option(Flag, \"boot_update\", translate(\"Update Once on Boot\"), translate(\"Updates the subscription the first time PassWall runs automatically after each system boot.\"))\no.default = 0\n\n---- Enable auto update subscribe\no = s:option(Flag, \"auto_update\", translate(\"Enable auto update subscribe\"))\no.default = 0\no.rmempty = false\n\n---- Week Update\no = s:option(ListValue, \"week_update\", translate(\"Update Mode\"))\no:value(8, translate(\"Loop Mode\"))\no:value(7, translate(\"Every day\"))\no:value(1, translate(\"Every Monday\"))\no:value(2, translate(\"Every Tuesday\"))\no:value(3, translate(\"Every Wednesday\"))\no:value(4, translate(\"Every Thursday\"))\no:value(5, translate(\"Every Friday\"))\no:value(6, translate(\"Every Saturday\"))\no:value(0, translate(\"Every Sunday\"))\no.default = 7\no:depends(\"auto_update\", true)\no.rmempty = true\n\n---- Time Update\no = s:option(ListValue, \"time_update\", translate(\"Update Time(every day)\"))\nfor t = 0, 23 do o:value(t, t .. \":00\") end\no.default = 0\no:depends(\"week_update\", \"0\")\no:depends(\"week_update\", \"1\")\no:depends(\"week_update\", \"2\")\no:depends(\"week_update\", \"3\")\no:depends(\"week_update\", \"4\")\no:depends(\"week_update\", \"5\")\no:depends(\"week_update\", \"6\")\no:depends(\"week_update\", \"7\")\no.rmempty = true\n\n---- Interval Update\no = s:option(ListValue, \"interval_update\", translate(\"Update Interval(hour)\"))\nfor t = 1, 24 do o:value(t, t .. \" \" .. translate(\"hour\")) end\no.default = 2\no:depends(\"week_update\", \"8\")\no.rmempty = true\n\no = s:option(ListValue, \"access_mode\", translate(\"Subscribe URL Access Method\"))\no.default = \"\"\no:value(\"\", translate(\"Auto\"))\no:value(\"direct\", translate(\"Direct Connection\"))\no:value(\"proxy\", translate(\"Proxy\"))\n\no = s:option(Value, \"user_agent\", translate(\"User-Agent\"))\no.default = \"passwall\"\no:value(\"passwall\", \"PassWall\")\no:value(\"v2rayN/9.99\", \"v2rayN\")\no:value(\"clash.meta\", \"Clash.Meta\")\no:value(\"Clash\", \"Clash\")\no:value(\"curl\", \"Curl\")\no:value(\"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0\", \"Edge for Linux\")\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0\", \"Edge for Windows\")\n\no = s:option(ListValue, \"chain_proxy\", translate(\"Chain Proxy\"))\no:value(\"\", translate(\"Close(Not use)\"))\no:value(\"1\", translate(\"Preproxy Node\"))\no:value(\"2\", translate(\"Landing Node\"))\n\nlocal descrStr = \"Chained proxy works only with Xray or Sing-box nodes.<br>\"\ndescrStr = descrStr .. \"You can only use manual or imported nodes as chained nodes.\"\ndescrStr = translate(descrStr) .. \"<br>\" .. translate(\"Only support a layer of proxy.\")\n\no1 = s:option(ListValue, \"preproxy_node\", translate(\"Preproxy Node\"))\no1:depends({ [\"chain_proxy\"] = \"1\" })\no1.description = descrStr\no1.template = appname .. \"/cbi/nodes_listvalue\"\no1.group = {}\n\no2 = s:option(ListValue, \"to_node\", translate(\"Landing Node\"))\no2:depends({ [\"chain_proxy\"] = \"2\" })\no2.description = descrStr\no2.template = appname .. \"/cbi/nodes_listvalue\"\no2.group = {}\n\nfor k, v in pairs(nodes_table) do\n\tif (v.type == \"Xray\" or v.type == \"sing-box\") and (not v.chain_proxy or v.chain_proxy == \"\") and v.add_mode ~= \"2\" then\n\t\to1:value(v.id, v.remark)\n\t\to1.group[#o1.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\t\to2:value(v.id, v.remark)\n\t\to2.group[#o2.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\tend\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/other.lua",
    "content": "local api = require \"luci.passwall.api\"\nlocal appname = \"passwall\"\nlocal fs = api.fs\nlocal has_singbox = api.finded_com(\"sing-box\")\nlocal has_xray = api.finded_com(\"xray\")\n\nlocal port_validate = function(self, value, t)\n\treturn value:gsub(\"-\", \":\")\nend\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\n-- [[ Delay Settings ]]--\ns = m:section(TypedSection, \"global_delay\", translate(\"Delay Settings\"))\ns.anonymous = true\ns.addremove = false\n\n---- Open and close Daemon\no = s:option(Flag, \"start_daemon\", translate(\"Open and close Daemon\"))\no.default = 1\no.rmempty = false\n\n---- Delay Start\no = s:option(Value, \"start_delay\", translate(\"Delay Start\"), translate(\"Units:seconds\"))\no.default = \"1\"\no.rmempty = true\n\nfor index, value in ipairs({\"stop\", \"start\", \"restart\"}) do\n\to = s:option(ListValue, value .. \"_week_mode\", translate(value .. \" automatically mode\"))\n\to:value(\"\", translate(\"Disable\"))\n\to:value(8, translate(\"Loop Mode\"))\n\to:value(7, translate(\"Every day\"))\n\to:value(1, translate(\"Every Monday\"))\n\to:value(2, translate(\"Every Tuesday\"))\n\to:value(3, translate(\"Every Wednesday\"))\n\to:value(4, translate(\"Every Thursday\"))\n\to:value(5, translate(\"Every Friday\"))\n\to:value(6, translate(\"Every Saturday\"))\n\to:value(0, translate(\"Every Sunday\"))\n\to = s:option(ListValue, value .. \"_time_mode\", translate(value .. \" Time(Every day)\"))\n\tfor t = 0, 23 do o:value(t, t .. \":00\") end\n\to.default = 0\n\to:depends(value .. \"_week_mode\", \"0\")\n\to:depends(value .. \"_week_mode\", \"1\")\n\to:depends(value .. \"_week_mode\", \"2\")\n\to:depends(value .. \"_week_mode\", \"3\")\n\to:depends(value .. \"_week_mode\", \"4\")\n\to:depends(value .. \"_week_mode\", \"5\")\n\to:depends(value .. \"_week_mode\", \"6\")\n\to:depends(value .. \"_week_mode\", \"7\")\n\to = s:option(ListValue, value .. \"_interval_mode\", translate(value .. \" Interval(Hour)\"))\n\tfor t = 1, 24 do o:value(t, t .. \" \" .. translate(\"Hour\")) end\n\to.default = 2\n\to:depends(value .. \"_week_mode\", \"8\")\nend\n\n-- [[ Forwarding Settings ]]--\ns = m:section(TypedSection, \"global_forwarding\", translate(\"Forwarding Settings\"))\ns.anonymous = true\ns.addremove = false\n\n---- TCP No Redir Ports\no = s:option(Value, \"tcp_no_redir_ports\", translate(\"TCP No Redir Ports\"))\no.default = \"disable\"\no:value(\"disable\", translate(\"No patterns are used\"))\no:value(\"1:65535\", translate(\"All\"))\no.validate = port_validate\n\n---- UDP No Redir Ports\no = s:option(Value, \"udp_no_redir_ports\", translate(\"UDP No Redir Ports\"),\n\t\t\t \"<font color='red'>\" .. translate(\n\t\t\t\t \"Fill in the ports you don't want to be forwarded by the agent, with the highest priority.\") ..\n\t\t\t\t \"</font>\")\no.default = \"disable\"\no:value(\"disable\", translate(\"No patterns are used\"))\no:value(\"1:65535\", translate(\"All\"))\no.validate = port_validate\n\n---- TCP Proxy Drop Ports\no = s:option(Value, \"tcp_proxy_drop_ports\", translate(\"TCP Proxy Drop Ports\"))\no.default = \"disable\"\no:value(\"disable\", translate(\"No patterns are used\"))\no.validate = port_validate\n\n---- UDP Proxy Drop Ports\no = s:option(Value, \"udp_proxy_drop_ports\", translate(\"UDP Proxy Drop Ports\"))\no.default = \"443\"\no:value(\"disable\", translate(\"No patterns are used\"))\no:value(\"443\", translate(\"QUIC\"))\no.validate = port_validate\n\n---- TCP Redir Ports\no = s:option(Value, \"tcp_redir_ports\", translate(\"TCP Redir Ports\"))\no:value(\"1:65535\", translate(\"All\"))\no:value(\"22,25,53,80,143,443,465,587,853,873,993,995,5222,8080,8443,9418\", translate(\"Common Use\"))\no:value(\"80,443\", translate(\"Only Web\"))\no.default = o.keylist[2]\no.validate = port_validate\n\n---- UDP Redir Ports\no = s:option(Value, \"udp_redir_ports\", translate(\"UDP Redir Ports\"))\no.default = \"1:65535\"\no:value(\"1:65535\", translate(\"All\"))\no:value(\"53\", \"DNS\")\no.validate = port_validate\n\no = s:option(DummyValue, \"tips\", \"　\")\no.rawhtml = true\no.cfgvalue = function(t, n)\n\treturn string.format('<font color=\"red\">%s</font>',\n\ttranslate(\"The port settings support single ports and ranges.<br>Separate multiple ports with commas (,).<br>Example: 21,80,443,1000:2000.\"))\nend\n\n---- Use nftables\no = s:option(ListValue, \"prefer_nft\", translate(\"Prefer firewall tools\"))\no.default = \"1\"\no:value(\"0\", \"Iptables\")\no:value(\"1\", \"Nftables\")\n\n---- Check the transparent proxy component\nlocal handle = io.popen(\"lsmod\")\nlocal mods = \"\"\nif handle then\n\tmods = handle:read(\"*a\") or \"\"\n\thandle:close()\nend\n\nif (mods:find(\"REDIRECT\") and mods:find(\"TPROXY\")) or (mods:find(\"nft_redir\") and mods:find(\"nft_tproxy\")) then\n\to = s:option(ListValue, \"tcp_proxy_way\", translate(\"TCP Proxy Way\"))\n\to.default = \"redirect\"\n\to:value(\"redirect\", \"REDIRECT\")\n\to:value(\"tproxy\", \"TPROXY\")\n\to:depends(\"ipv6_tproxy\", false)\n\to.remove = function(self, section)\n\t\t-- 禁止在隐藏时删除\n\tend\n\n\to = s:option(ListValue, \"_tcp_proxy_way\", translate(\"TCP Proxy Way\"))\n\to.default = \"tproxy\"\n\to:value(\"tproxy\", \"TPROXY\")\n\to:depends(\"ipv6_tproxy\", true)\n\to.write = function(self, section, value)\n\t\tself.map:set(section, \"tcp_proxy_way\", value)\n\tend\n\n\tif mods:find(\"ip6table_mangle\") or mods:find(\"nft_tproxy\") then\n\t\t---- IPv6 TProxy\n\t\to = s:option(Flag, \"ipv6_tproxy\", translate(\"IPv6 TProxy\"),\n\t\t\t\t\t\"<font color='red'>\" .. translate(\n\t\t\t\t\t\t\"Experimental feature. Make sure that your node supports IPv6.\") ..\n\t\t\t\t\t\t\"</font>\")\n\t\to.default = 0\n\t\to.rmempty = false\n\tend\nend\n\no = s:option(Flag, \"accept_icmp\", translate(\"Hijacking ICMP (PING)\"))\no.default = 0\n\no = s:option(Flag, \"accept_icmpv6\", translate(\"Hijacking ICMPv6 (IPv6 PING)\"))\no:depends(\"ipv6_tproxy\", true)\no.default = 0\n\nif has_xray then\n\ts_xray = m:section(TypedSection, \"global_xray\", \"Xray \" .. translate(\"Settings\"))\n\ts_xray.anonymous = true\n\ts_xray.addremove = false\n\n\to = s_xray:option(Flag, \"fragment\", translate(\"Fragment\"), translate(\"TCP fragments, which can deceive the censorship system in some cases, such as bypassing SNI blacklists.\"))\n\to.default = 0\n\n\to = s_xray:option(ListValue, \"fragment_packets\", translate(\"Fragment Packets\"), translate(\"\\\"1-3\\\" is for segmentation at TCP layer, applying to the beginning 1 to 3 data writes by the client. \\\"tlshello\\\" is for TLS client hello packet fragmentation.\"))\n\to.default = \"tlshello\"\n\to:value(\"tlshello\", \"tlshello\")\n\to:value(\"1-1\", \"1-1\")\n\to:value(\"1-2\", \"1-2\")\n\to:value(\"1-3\", \"1-3\")\n\to:value(\"1-5\", \"1-5\")\n\to:depends(\"fragment\", true)\n\n\to = s_xray:option(Value, \"fragment_length\", translate(\"Fragment Length\"), translate(\"Fragmented packet length (byte)\"))\n\to.datatype = \"or(uinteger,portrange)\"\n\to.default = \"100-200\"\n\to:depends(\"fragment\", true)\n\n\to = s_xray:option(Value, \"fragment_delay\", translate(\"Fragment Delay\"), translate(\"Fragmentation interval (ms)\"))\n\to.datatype = \"or(uinteger,portrange)\"\n\to.default = \"10-20\"\n\to:depends(\"fragment\", true)\n\n\to = s_xray:option(Value, \"fragment_maxSplit\", translate(\"Max Split\"), translate(\"Limit the maximum number of splits.\"))\n\to.datatype = \"or(uinteger,portrange)\"\n\to.default = \"100-200\"\n\to:depends(\"fragment\", true)\n\n\to = s_xray:option(Flag, \"noise\", translate(\"Noise\"), translate(\"UDP noise, Under some circumstances it can bypass some UDP based protocol restrictions.\"))\n\to.default = 0\n\n\to = s_xray:option(Flag, \"sniffing_override_dest\", translate(\"Override the connection destination address\"))\n\to.default = 0\n\to.description = translate(\"Override the connection destination address with the sniffed domain.<br />Otherwise use sniffed domain for routing only.<br />If using shunt nodes, configure the domain shunt rules correctly.\")\n\n\tlocal domains_excluded = string.format(\"/usr/share/%s/rules/domains_excluded\", appname)\n\to = s_xray:option(TextValue, \"excluded_domains\", translate(\"Excluded Domains\"), translate(\"If the traffic sniffing result is in this list, the destination address will not be overridden.\"))\n\to.rows = 15\n\to.wrap = \"off\"\n\to.cfgvalue = function(self, section) return fs.readfile(domains_excluded) or \"\" end\n\to.write = function(self, section, value) fs.writefile(domains_excluded, value:gsub(\"\\r\\n\", \"\\n\")) end\n\to:depends({sniffing_override_dest = true})\n\n\to = s_xray:option(Value, \"buffer_size\", translate(\"Buffer Size\"), translate(\"Buffer size for every connection (kB)\"))\n\to.datatype = \"uinteger\"\n\n\ts_xray_noise = m:section(TypedSection, \"xray_noise_packets\", translate(\"Xray Noise Packets\"),\"<font color='red'>\" .. translate(\"To send noise packets, select \\\"Noise\\\" in Xray Settings.\") .. \"</font>\")\n\ts_xray_noise.template = \"cbi/tblsection\"\n\ts_xray_noise.sortable = true\n\ts_xray_noise.anonymous = true\n\ts_xray_noise.addremove = true\n\n\ts_xray_noise.create = function(e, t)\n\t\tTypedSection.create(e, api.gen_short_uuid())\n\tend\n\n\ts_xray_noise.remove = function(self, section)\n\t\tfor k, v in pairs(self.children) do\n\t\t\tv.rmempty = true\n\t\t\tv.validate = nil\n\t\tend\n\t\tTypedSection.remove(self, section)\n\tend\n\n\to = s_xray_noise:option(Flag, \"enabled\", translate(\"Enable\"))\n\to.default = 1\n\to.rmempty = false\n\n\to = s_xray_noise:option(ListValue, \"type\", translate(\"Type\"))\n\to:value(\"rand\", \"rand\")\n\to:value(\"array\", \"array\")\n\to:value(\"str\", \"str\")\n\to:value(\"hex\", \"hex\")\n\to:value(\"base64\", \"base64\")\n\n\to = s_xray_noise:option(Value, \"packet\", translate(\"Packet | Rand Length\"))\n\to.datatype = \"minlength(1)\"\n\to.rmempty = false\n\n\to = s_xray_noise:option(Value, \"delay\", translate(\"Delay (ms)\"))\n\to.datatype = \"or(uinteger,portrange)\"\n\to.rmempty = false\nend\n\nif has_singbox then\n\ts = m:section(TypedSection, \"global_singbox\", \"Sing-Box \" .. translate(\"Settings\"))\n\ts.anonymous = true\n\ts.addremove = false\n\n\to = s:option(Flag, \"record_fragment\", \"TLS Record \" .. translate(\"Fragment\"),\n\t\ttranslate(\"Split handshake data into multiple TLS records for better censorship evasion. Low overhead. Recommended to enable first.\"))\n\to.default = 0\n\n\to = s:option(Flag, \"fragment\", \"TLS TCP \" .. translate(\"Fragment\"),\n\t\ttranslate(\"Split handshake into multiple TCP segments. Enhances obfuscation. May increase delay. Use only if needed.\"))\n\to.default = 0\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/rule.lua",
    "content": "local api = require \"luci.passwall.api\"\nlocal appname = \"passwall\"\nlocal has_xray = api.finded_com(\"xray\")\nlocal has_singbox = api.finded_com(\"sing-box\")\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\n-- [[ Rule Settings ]]--\ns = m:section(TypedSection, \"global_rules\", translate(\"Rule status\"))\ns.anonymous = true\n\n--[[\no = s:option(Flag, \"adblock\", translate(\"Enable adblock\"))\no.rmempty = false\n]]--\n\n---- gfwlist URL\no = s:option(DynamicList, \"gfwlist_url\", translate(\"GFW domains(gfwlist) Update URL\"))\no:depends(\"geo2rule\", false)\no:value(\"https://cdn.jsdelivr.net/gh/YW5vbnltb3Vz/domain-list-community@release/gfwlist.txt\", translate(\"v2fly/domain-list-community\"))\no:value(\"https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/gfw.txt\", translate(\"Loyalsoldier/v2ray-rules-dat\"))\no:value(\"https://cdn.jsdelivr.net/gh/Loukky/gfwlist-by-loukky/gfwlist.txt\", translate(\"Loukky/gfwlist-by-loukky\"))\no:value(\"https://cdn.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt\", translate(\"gfwlist/gfwlist\"))\no.default = o.keylist[2]\n\n----chnroute  URL\no = s:option(DynamicList, \"chnroute_url\", translate(\"China IPs(chnroute) Update URL\"))\no:depends(\"geo2rule\", false)\no:value(\"https://cdn.jsdelivr.net/gh/gaoyifan/china-operator-ip@ip-lists/china.txt\", translate(\"gaoyifan/china-operator-ip/china\"))\no:value(\"https://ispip.clang.cn/all_cn.txt\", translate(\"Clang.CN\"))\no:value(\"https://cdn.jsdelivr.net/gh/soffchen/GeoIP2-CN@release/CN-ip-cidr.txt\", translate(\"soffchen/GeoIP2-CN\"))\no:value(\"https://cdn.jsdelivr.net/gh/Hackl0us/GeoIP2-CN@release/CN-ip-cidr.txt\", translate(\"Hackl0us/GeoIP2-CN\"))\no:value(\"https://cdn.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/ChinaMax/ChinaMax_IP_No_IPv6.txt\", translate(\"ios_rule_script/ChinaMax_IP_No_IPv6\"))\n\n----chnroute6 URL\no = s:option(DynamicList, \"chnroute6_url\", translate(\"China IPv6s(chnroute6) Update URL\"))\no:depends(\"geo2rule\", false)\no:value(\"https://cdn.jsdelivr.net/gh/gaoyifan/china-operator-ip@ip-lists/china6.txt\", translate(\"gaoyifan/china-operator-ip/china6\"))\no:value(\"https://ispip.clang.cn/all_cn_ipv6.txt\", translate(\"Clang.CN.IPv6\"))\no:value(\"https://cdn.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/ChinaMax/ChinaMax_IP.txt\", translate(\"ios_rule_script/ChinaMax_IP\"))\n\n----chnlist URL\no = s:option(DynamicList, \"chnlist_url\", translate(\"China List(Chnlist) Update URL\"))\no:depends(\"geo2rule\", false)\no:value(\"https://cdn.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/accelerated-domains.china.conf\", translate(\"felixonmars/domains.china\"))\no:value(\"https://cdn.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/apple.china.conf\", translate(\"felixonmars/apple.china\"))\no:value(\"https://cdn.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/google.china.conf\", translate(\"felixonmars/google.china\"))\no:value(\"https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/china-list.txt\", translate(\"Loyalsoldier/china-list\"))\no:value(\"https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/apple-cn.txt\", translate(\"Loyalsoldier/apple-cn\"))\no:value(\"https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/google-cn.txt\", translate(\"Loyalsoldier/google-cn\"))\no:value(\"https://cdn.jsdelivr.net/gh/blackmatrix7/ios_rule_script@master/rule/Clash/ChinaMax/ChinaMax_Domain.txt\", translate(\"ios_rule_script/ChinaMax_Domain\"))\n\nif has_xray or has_singbox then\n\to = s:option(Value, \"geoip_url\", translate(\"GeoIP Update URL\"))\n\to:value(\"https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip.dat\", translate(\"Loyalsoldier/geoip\"))\n\to:value(\"https://github.com/MetaCubeX/meta-rules-dat/releases/latest/download/geoip.dat\", translate(\"MetaCubeX/geoip\"))\n\to:value(\"https://cdn.jsdelivr.net/gh/Loyalsoldier/geoip@release/geoip.dat\", translate(\"Loyalsoldier/geoip (CDN)\"))\n\to:value(\"https://cdn.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat\", translate(\"MetaCubeX/geoip (CDN)\"))\n\to.default = o.keylist[1]\n\n\to = s:option(Value, \"geosite_url\", translate(\"Geosite Update URL\"))\n\to:value(\"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat\", translate(\"Loyalsoldier/geosite\"))\n\to:value(\"https://github.com/MetaCubeX/meta-rules-dat/releases/latest/download/geosite.dat\", translate(\"MetaCubeX/geosite\"))\n\to:value(\"https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat\", translate(\"Loyalsoldier/geosite (CDN)\"))\n\to:value(\"https://cdn.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat\", translate(\"MetaCubeX/geosite (CDN)\"))\n\to.default = o.keylist[1]\n\n\to = s:option(Value, \"v2ray_location_asset\", translate(\"Location of Geo rule files\"), translate(\"This variable specifies a directory where geoip.dat and geosite.dat files are.\"))\n\to.default = \"/usr/share/v2ray/\"\n\to.placeholder = \"/usr/share/v2ray/\"\n\to.rmempty = false\n\n\tif api.is_finded(\"geoview\") then\n\t\to = s:option(Flag, \"geo2rule\", translate(\"Generate Rule List from Geo\"))\n\t\to.default = 0\n\t\to.rmempty = false\n\t\to.description = translate(\"Generate rule lists such as GFW, China domains, and China IP ranges based on Geo files.\") .. \"<br><font color='red'>\" ..\n\t\t\ttranslate(\"When manually updating with this option enabled, rules will be regenerated from existing Geo files even if no new version is available.\") .. \"</font>\"\n\n\t\to = s:option(Flag, \"enable_geoview\", translate(\"Enable Geo Data Parsing\"))\n\t\to.default = 0\n\t\to.rmempty = false\n\t\to.description = \"<ul>\"\n\t\t\t.. \"<li>\" .. translate(\"Experimental feature.\") .. \"</li>\"\n\t\t\t.. \"<li>\" .. \"1.\" .. translate(\"Analyzes and preloads GeoIP/Geosite data to enhance the shunt performance of Sing-box/Xray.\") .. \"</li>\"\n\t\t\t.. \"<li>\" .. \"2.\" .. translate(\"Once enabled, the rule list can support GeoIP/Geosite rules.\") .. \"</li>\"\n\t\t\t.. \"<li>\" .. translate(\"Note: Increases resource usage; Geosite analysis is only supported in ChinaDNS-NG and SmartDNS modes.\") .. \"</li>\"\n\t\t\t.. \"</ul>\"\n\t\tfunction o.write(self, section, value)\n\t\t\tlocal old = m:get(section, self.option) or \"0\"\n\t\t\tif old ~= value then\n\t\t\t\tm:set(\"@global[0]\", \"flush_set\", \"1\")\n\t\t\tend\n\t\t\treturn Flag.write(self, section, value)\n\t\tend\n\tend\nend\n\n---- Auto Update\no = s:option(Flag, \"auto_update\", translate(\"Enable auto update rules\"))\no.default = 0\no.rmempty = false\n\n---- Week Update\no = s:option(ListValue, \"week_update\", translate(\"Update Mode\"))\no:value(8, translate(\"Loop Mode\"))\no:value(7, translate(\"Every day\"))\no:value(1, translate(\"Every Monday\"))\no:value(2, translate(\"Every Tuesday\"))\no:value(3, translate(\"Every Wednesday\"))\no:value(4, translate(\"Every Thursday\"))\no:value(5, translate(\"Every Friday\"))\no:value(6, translate(\"Every Saturday\"))\no:value(0, translate(\"Every Sunday\"))\no.default = 7\no:depends(\"auto_update\", true)\no.rmempty = true\n\n---- Time Update\no = s:option(ListValue, \"time_update\", translate(\"Update Time(every day)\"))\nfor t = 0, 23 do o:value(t, t .. \":00\") end\no.default = 0\no:depends(\"week_update\", \"0\")\no:depends(\"week_update\", \"1\")\no:depends(\"week_update\", \"2\")\no:depends(\"week_update\", \"3\")\no:depends(\"week_update\", \"4\")\no:depends(\"week_update\", \"5\")\no:depends(\"week_update\", \"6\")\no:depends(\"week_update\", \"7\")\no.rmempty = true\n\n---- Interval Update\no = s:option(ListValue, \"interval_update\", translate(\"Update Interval(hour)\"))\nfor t = 1, 24 do o:value(t, t .. \" \" .. translate(\"hour\")) end\no.default = 2\no:depends(\"week_update\", \"8\")\no.rmempty = true\n\n---- 更新选项，始终被js隐藏\nlocal flags = {\n\t\"gfwlist_update\", \"chnroute_update\", \"chnroute6_update\",\n\t\"chnlist_update\", \"geoip_update\", \"geosite_update\"\n}\nfor _, f in ipairs(flags) do\n\to = s:option(Flag, f)\n\to.rmempty = false\nend\n\ns:append(Template(appname .. \"/rule/rule_version\"))\n\nif has_xray or has_singbox then\n\ts = m:section(TypedSection, \"shunt_rules\", \"Sing-Box/Xray \" .. translate(\"Shunt Rule\"), \"<a style='color: red'>\" .. translate(\"Please note attention to the priority, the higher the order, the higher the priority.\") .. \"</a>\")\n\ts.template = \"cbi/tblsection\"\n\ts.anonymous = false\n\ts.addremove = true\n\ts.sortable = true\n\ts.extedit = api.url(\"shunt_rules\", \"%s\")\n\tfunction s.create(e, t)\n\t\tTypedSection.create(e, t)\n\t\tluci.http.redirect(e.extedit:format(t))\n\tend\n\tfunction s.remove(e, t)\n\t\tm.uci:foreach(appname, \"nodes\", function(s)\n\t\t\tif s[\"protocol\"] and s[\"protocol\"] == \"_shunt\" then\n\t\t\t\tm:del(s[\".name\"], t)\n\t\t\tend\n\t\tend)\n\t\tTypedSection.remove(e, t)\n\tend\n\n\to = s:option(DummyValue, \"remarks\", translate(\"Remarks\"))\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/rule_list.lua",
    "content": "local api = require \"luci.passwall.api\"\nlocal appname = \"passwall\"\nlocal fs = api.fs\nlocal sys = api.sys\nlocal uci = api.uci\nlocal datatypes = api.datatypes\nlocal path = string.format(\"/usr/share/%s/rules/\", appname)\nlocal gfwlist_path = \"/usr/share/passwall/rules/gfwlist\"\nlocal chnlist_path = \"/usr/share/passwall/rules/chnlist\"\nlocal chnroute_path = \"/usr/share/passwall/rules/chnroute\"\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\nfunction clean_text(text)\n\tlocal nbsp = string.char(0xC2, 0xA0) -- 不间断空格（U+00A0）\n\tlocal fullwidth_space = string.char(0xE3, 0x80, 0x80) -- 全角空格（U+3000）\n\treturn text\n\t\t:gsub(\"\\t\", \" \")\n\t\t:gsub(nbsp, \" \")\n\t\t:gsub(fullwidth_space, \" \")\n\t\t:gsub(\"^%s+\", \"\")\n\t\t:gsub(\"%s+$\", \"\\n\")\n\t\t:gsub(\"\\r\\n\", \"\\n\")\n\t\t:gsub(\"[ \\t]*\\n[ \\t]*\", \"\\n\")\nend\n\n-- [[ Rule List Settings ]]--\ns = m:section(TypedSection, \"global_rules\")\ns.anonymous = true\n\ns:tab(\"direct_list\", translate(\"Direct List\"))\ns:tab(\"proxy_list\", translate(\"Proxy List\"))\ns:tab(\"block_list\", translate(\"Block List\"))\ns:tab(\"lan_ip_list\", translate(\"Lan IP List\"))\ns:tab(\"route_hosts\", translate(\"Route Hosts\"))\n\n---- Direct Hosts\nlocal direct_host = path .. \"direct_host\"\no = s:taboption(\"direct_list\", TextValue, \"direct_host\", \"\", \"<font color='red'>\" .. translate(\"Join the direct hosts list of domain names will not proxy.\") .. \"</font>\")\no.rows = 15\no.wrap = \"off\"\no.cfgvalue = function(self, section)\n\treturn fs.readfile(direct_host) or \"\"\nend\no.write = function(self, section, value)\n\tfs.writefile(direct_host, value:gsub(\"\\r\\n\", \"\\n\"))\n\tsys.call(\"rm -rf /tmp/etc/passwall_tmp/dns_*\")\nend\no.remove = function(self, section, value)\n\tfs.writefile(direct_host, \"\")\n\tsys.call(\"rm -rf /tmp/etc/passwall_tmp/dns_*\")\nend\no.validate = function(self, value)\n\tlocal hosts= {}\n\tvalue = clean_text(value)\n\tstring.gsub(value, '[^' .. \"\\r\\n\" .. ']+', function(w) table.insert(hosts, api.trim(w)) end)\n\tfor index, host in ipairs(hosts) do\n\t\tif host ~= \"\" and not host:find(\"^#\") and not host:find(\"^geosite:\") then\n\t\t\tif not datatypes.hostname(host) then\n\t\t\t\treturn nil, host .. \" \" .. translate(\"Not valid domain name, please re-enter!\")\n\t\t\tend\n\t\tend\n\tend\n\treturn value\nend\n\n---- Direct IP\nlocal direct_ip = path .. \"direct_ip\"\no = s:taboption(\"direct_list\", TextValue, \"direct_ip\", \"\", \"<font color='red'>\" .. translate(\"These had been joined ip addresses will not proxy. Please input the ip address or ip address segment,every line can input only one ip address. For example: 192.168.0.0/24 or 223.5.5.5.\") .. \"</font>\")\no.rows = 15\no.wrap = \"off\"\no.cfgvalue = function(self, section)\n\treturn fs.readfile(direct_ip) or \"\"\nend\no.write = function(self, section, value)\n\tfs.writefile(direct_ip, value:gsub(\"\\r\\n\", \"\\n\"))\nend\no.remove = function(self, section, value)\n\tfs.writefile(direct_ip, \"\")\nend\no.validate = function(self, value)\n\tlocal ipmasks= {}\n\tvalue = clean_text(value)\n\tstring.gsub(value, '[^' .. \"\\r\\n\" .. ']+', function(w) table.insert(ipmasks, api.trim(w)) end)\n\tfor index, ipmask in ipairs(ipmasks) do\n\t\tif ipmask ~= \"\" and not ipmask:find(\"^#\") and not ipmask:find(\"^geoip:\") then\n\t\t\tif not ( datatypes.ipmask4(ipmask) or datatypes.ipmask6(ipmask) ) then\n\t\t\t\treturn nil, ipmask .. \" \" .. translate(\"Not valid IP format, please re-enter!\")\n\t\t\tend\n\t\tend\n\tend\n\treturn value\nend\n\n---- Proxy Hosts\nlocal proxy_host = path .. \"proxy_host\"\no = s:taboption(\"proxy_list\", TextValue, \"proxy_host\", \"\", \"<font color='red'>\" .. translate(\"These had been joined websites will use proxy. Please input the domain names of websites, every line can input only one website domain. For example: google.com.\") .. \"</font>\")\no.rows = 15\no.wrap = \"off\"\no.cfgvalue = function(self, section)\n\treturn fs.readfile(proxy_host) or \"\"\nend\no.write = function(self, section, value)\n\tfs.writefile(proxy_host, value:gsub(\"\\r\\n\", \"\\n\"))\n\tsys.call(\"rm -rf /tmp/etc/passwall_tmp/dns_*\")\nend\no.remove = function(self, section, value)\n\tfs.writefile(proxy_host, \"\")\n\tsys.call(\"rm -rf /tmp/etc/passwall_tmp/dns_*\")\nend\no.validate = function(self, value)\n\tlocal hosts= {}\n\tvalue = clean_text(value)\n\tstring.gsub(value, '[^' .. \"\\r\\n\" .. ']+', function(w) table.insert(hosts, api.trim(w)) end)\n\tfor index, host in ipairs(hosts) do\n\t\tif host ~= \"\" and not host:find(\"^#\") and not host:find(\"^geosite:\") then\n\t\t\tif not datatypes.hostname(host) then\n\t\t\t\treturn nil, host .. \" \" .. translate(\"Not valid domain name, please re-enter!\")\n\t\t\tend\n\t\tend\n\tend\n\treturn value\nend\n\n---- Proxy IP\nlocal proxy_ip = path .. \"proxy_ip\"\no = s:taboption(\"proxy_list\", TextValue, \"proxy_ip\", \"\", \"<font color='red'>\" .. translate(\"These had been joined ip addresses will use proxy. Please input the ip address or ip address segment, every line can input only one ip address. For example: 35.24.0.0/24 or 8.8.4.4.\") .. \"</font>\")\no.rows = 15\no.wrap = \"off\"\no.cfgvalue = function(self, section)\n\treturn fs.readfile(proxy_ip) or \"\"\nend\no.write = function(self, section, value)\n\tfs.writefile(proxy_ip, value:gsub(\"\\r\\n\", \"\\n\"))\nend\no.remove = function(self, section, value)\n\tfs.writefile(proxy_ip, \"\")\nend\no.validate = function(self, value)\n\tlocal ipmasks= {}\n\tvalue = clean_text(value)\n\tstring.gsub(value, '[^' .. \"\\r\\n\" .. ']+', function(w) table.insert(ipmasks, api.trim(w)) end)\n\tfor index, ipmask in ipairs(ipmasks) do\n\t\tif ipmask ~= \"\" and not ipmask:find(\"^#\") and not ipmask:find(\"^geoip:\") then\n\t\t\tif not ( datatypes.ipmask4(ipmask) or datatypes.ipmask6(ipmask) ) then\n\t\t\t\treturn nil, ipmask .. \" \" .. translate(\"Not valid IP format, please re-enter!\")\n\t\t\tend\n\t\tend\n\tend\n\treturn value\nend\n\n---- Block Hosts\nlocal block_host = path .. \"block_host\"\no = s:taboption(\"block_list\", TextValue, \"block_host\", \"\", \"<font color='red'>\" .. translate(\"These had been joined websites will be block. Please input the domain names of websites, every line can input only one website domain. For example: twitter.com.\") .. \"</font>\")\no.rows = 15\no.wrap = \"off\"\no.cfgvalue = function(self, section)\n\treturn fs.readfile(block_host) or \"\"\nend\no.write = function(self, section, value)\n\tfs.writefile(block_host, value:gsub(\"\\r\\n\", \"\\n\"))\nend\no.remove = function(self, section, value)\n\tfs.writefile(block_host, \"\")\nend\no.validate = function(self, value)\n\tlocal hosts= {}\n\tvalue = clean_text(value)\n\tstring.gsub(value, '[^' .. \"\\r\\n\" .. ']+', function(w) table.insert(hosts, api.trim(w)) end)\n\tfor index, host in ipairs(hosts) do\n\t\tif host ~= \"\" and not host:find(\"^#\") and not host:find(\"^geosite:\") then\n\t\t\tif not datatypes.hostname(host) then\n\t\t\t\treturn nil, host .. \" \" .. translate(\"Not valid domain name, please re-enter!\")\n\t\t\tend\n\t\tend\n\tend\n\treturn value\nend\n\n---- Block IP\nlocal block_ip = path .. \"block_ip\"\no = s:taboption(\"block_list\", TextValue, \"block_ip\", \"\", \"<font color='red'>\" .. translate(\"These had been joined ip addresses will be block. Please input the ip address or ip address segment, every line can input only one ip address.\") .. \"</font>\")\no.rows = 15\no.wrap = \"off\"\no.cfgvalue = function(self, section)\n\treturn fs.readfile(block_ip) or \"\"\nend\no.write = function(self, section, value)\n\tfs.writefile(block_ip, value:gsub(\"\\r\\n\", \"\\n\"))\nend\no.remove = function(self, section, value)\n\tfs.writefile(block_ip, \"\")\nend\no.validate = function(self, value)\n\tlocal ipmasks= {}\n\tvalue = clean_text(value)\n\tstring.gsub(value, '[^' .. \"\\r\\n\" .. ']+', function(w) table.insert(ipmasks, api.trim(w)) end)\n\tfor index, ipmask in ipairs(ipmasks) do\n\t\tif ipmask ~= \"\" and not ipmask:find(\"^#\") and not ipmask:find(\"^geoip:\") then\n\t\t\tif not ( datatypes.ipmask4(ipmask) or datatypes.ipmask6(ipmask) ) then\n\t\t\t\treturn nil, ipmask .. \" \" .. translate(\"Not valid IP format, please re-enter!\")\n\t\t\tend\n\t\tend\n\tend\n\treturn value\nend\n\n---- Lan IPv4\nlocal lanlist_ipv4 = path .. \"lanlist_ipv4\"\no = s:taboption(\"lan_ip_list\", TextValue, \"lanlist_ipv4\", \"\", \"<font color='red'>\" .. translate(\"The list is the IPv4 LAN IP list, which represents the direct connection IP of the LAN. If you need the LAN IP in the proxy list, please clear it from the list. Do not modify this list by default.\") .. \"</font>\")\no.rows = 15\no.wrap = \"off\"\no.cfgvalue = function(self, section)\n\treturn fs.readfile(lanlist_ipv4) or \"\"\nend\no.write = function(self, section, value)\n\tfs.writefile(lanlist_ipv4, value:gsub(\"\\r\\n\", \"\\n\"))\nend\no.remove = function(self, section, value)\n\tfs.writefile(lanlist_ipv4, \"\")\nend\no.validate = function(self, value)\n\tlocal ipmasks= {}\n\tvalue = clean_text(value)\n\tstring.gsub(value, '[^' .. \"\\r\\n\" .. ']+', function(w) table.insert(ipmasks, api.trim(w)) end)\n\tfor index, ipmask in ipairs(ipmasks) do\n\t\tif ipmask ~= \"\" and not ipmask:find(\"^#\") then\n\t\t\tif not datatypes.ipmask4(ipmask) then\n\t\t\t\treturn nil, ipmask .. \" \" .. translate(\"Not valid IPv4 format, please re-enter!\")\n\t\t\tend\n\t\tend\n\tend\n\treturn value\nend\n\n---- Lan IPv6\nlocal lanlist_ipv6 = path .. \"lanlist_ipv6\"\no = s:taboption(\"lan_ip_list\", TextValue, \"lanlist_ipv6\", \"\", \"<font color='red'>\" .. translate(\"The list is the IPv6 LAN IP list, which represents the direct connection IP of the LAN. If you need the LAN IP in the proxy list, please clear it from the list. Do not modify this list by default.\") .. \"</font>\")\no.rows = 15\no.wrap = \"off\"\no.cfgvalue = function(self, section)\n\treturn fs.readfile(lanlist_ipv6) or \"\"\nend\no.write = function(self, section, value)\n\tfs.writefile(lanlist_ipv6, value:gsub(\"\\r\\n\", \"\\n\"))\nend\no.remove = function(self, section, value)\n\tfs.writefile(lanlist_ipv6, \"\")\nend\no.validate = function(self, value)\n\tlocal ipmasks= {}\n\tvalue = clean_text(value)\n\tstring.gsub(value, '[^' .. \"\\r\\n\" .. ']+', function(w) table.insert(ipmasks, api.trim(w)) end)\n\tfor index, ipmask in ipairs(ipmasks) do\n\t\tif ipmask ~= \"\" and not ipmask:find(\"^#\") then\n\t\t\tif not datatypes.ipmask6(ipmask) then\n\t\t\t\treturn nil, ipmask .. \" \" .. translate(\"Not valid IPv6 format, please re-enter!\")\n\t\t\tend\n\t\tend\n\tend\n\treturn value\nend\n\n---- Route Hosts\nlocal hosts = \"/etc/hosts\"\no = s:taboption(\"route_hosts\", TextValue, \"hosts\", \"\", \"<font color='red'>\" .. translate(\"Configure routing etc/hosts file, if you don't know what you are doing, please don't change the content.\") .. \"</font>\")\no.rows = 15\no.wrap = \"off\"\no.cfgvalue = function(self, section)\n\treturn fs.readfile(hosts) or \"\"\nend\no.write = function(self, section, value)\n\tfs.writefile(hosts, clean_text(value))\nend\no.remove = function(self, section, value)\n\tfs.writefile(hosts, \"\")\nend\n\nif fs.access(gfwlist_path) then\n\ts:tab(\"gfw_list\", translate(\"GFW List\"))\n\to = s:taboption(\"gfw_list\", DummyValue, \"_gfw_fieldset\")\n\to.rawhtml = true\n\to.default = string.format([[\n\t\t<div style=\"display: flex; align-items: center;\">\n\t\t\t<input class=\"btn cbi-button cbi-button-add\" type=\"button\" onclick=\"read_gfw()\" value=\"%s\" />\n\t\t\t<label id=\"gfw_total_lines\" style=\"margin-left: auto; margin-right: 10px;\"></label>\n\t\t</div>\n\t\t<textarea id=\"gfw_textarea\" class=\"cbi-input-textarea\" style=\"width: 100%%; margin-top: 10px;\" rows=\"40\" wrap=\"off\" readonly=\"readonly\"></textarea>\n\t]], translate(\"Read List\"))\nend\n\nif fs.access(chnlist_path) then\n\ts:tab(\"chn_list\", translate(\"China List\") .. \"(\" .. translate(\"Domain\") .. \")\")\n\to = s:taboption(\"chn_list\", DummyValue, \"_chn_fieldset\")\n\to.rawhtml = true\n\to.default = string.format([[\n\t\t<div style=\"display: flex; align-items: center;\">\n\t\t\t<input class=\"btn cbi-button cbi-button-add\" type=\"button\" onclick=\"read_chn()\" value=\"%s\" />\n\t\t\t<label id=\"chn_total_lines\" style=\"margin-left: auto; margin-right: 10px;\"></label>\n\t\t</div>\n\t\t<textarea id=\"chn_textarea\" class=\"cbi-input-textarea\" style=\"width: 100%%; margin-top: 10px;\" rows=\"40\" wrap=\"off\" readonly=\"readonly\"></textarea>\n\t]], translate(\"Read List\"))\nend\n\nif fs.access(chnroute_path) then\n\ts:tab(\"chnroute_list\", translate(\"China List\") .. \"(IP)\")\n\to = s:taboption(\"chnroute_list\", DummyValue, \"_chnroute_fieldset\")\n\to.rawhtml = true\n\to.default = string.format([[\n\t\t<div style=\"display: flex; align-items: center;\">\n\t\t\t<input class=\"btn cbi-button cbi-button-add\" type=\"button\" onclick=\"read_chnroute()\" value=\"%s\" />\n\t\t\t<label id=\"chnroute_total_lines\" style=\"margin-left: auto; margin-right: 10px;\"></label>\n\t\t</div>\n\t\t<textarea id=\"chnroute_textarea\" class=\"cbi-input-textarea\" style=\"width: 100%%; margin-top: 10px;\" rows=\"40\" wrap=\"off\" readonly=\"readonly\"></textarea>\n\t]], translate(\"Read List\"))\nend\n\nm:append(Template(appname .. \"/rule_list/js\"))\n\nlocal geo_dir = (uci:get(appname, \"@global_rules[0]\", \"v2ray_location_asset\") or \"/usr/share/v2ray/\"):match(\"^(.*)/\")\nlocal geosite_path = geo_dir .. \"/geosite.dat\"\nlocal geoip_path = geo_dir .. \"/geoip.dat\"\nif api.finded_com(\"geoview\") and fs.access(geosite_path) and fs.access(geoip_path) then\n\tif api.compare_versions(api.get_app_version(\"geoview\"), \">=\", \"0.1.0\") then\n\t\ts:tab(\"geoview\", translate(\"Geo View\"))\n\t\to = s:taboption(\"geoview\", DummyValue, \"_geoview_fieldset\")\n\t\to.rawhtml = true\n\t\to.template = appname .. \"/rule_list/geoview\"\n\tend\nend\n\nm.on_before_save = function(self)\n\tm:set(\"@global[0]\", \"flush_set\", \"1\")\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/shunt_rules.lua",
    "content": "local api = require \"luci.passwall.api\"\nlocal appname = \"passwall\"\nlocal datatypes = api.datatypes\n\nm = Map(appname, \"Sing-Box/Xray \" .. translate(\"Shunt Rule\"))\nm.redirect = api.url(\"rule\")\napi.set_apply_on_parse(m)\n\nif not arg[1] or not m:get(arg[1]) then\n\tluci.http.redirect(m.redirect)\nend\n\nm.on_before_save = function(self)\n\tm:set(\"@global[0]\", \"flush_set\", \"1\")\nend\n\n-- Add inline CSS to map description\nm.description = (m.description or \"\") .. \"\\n\" .. [[\n\t<style>\n\t\tdiv[id^=\"cbid.passwall.\"] .cbi-value-field {\n\t\t\tdisplay: flex;\n\t\t\tflex-wrap: wrap;\n\t\t\tgap: 1em;\n\t\t}\n\t\tdiv[id^=\"cbid.passwall.\"] .cbi-checkbox {\n\t\t\tdisplay: inline-flex;\n\t\t\talign-items: center;\n\t\t}\n\t</style>\n]]\n\nfunction clean_text(text)\n\tlocal nbsp = string.char(0xC2, 0xA0) -- 不间断空格（U+00A0）\n\tlocal fullwidth_space = string.char(0xE3, 0x80, 0x80) -- 全角空格（U+3000）\n\treturn text\n\t\t:gsub(\"\\t\", \" \")\n\t\t:gsub(nbsp, \" \")\n\t\t:gsub(fullwidth_space, \" \")\n\t\t:gsub(\"^%s+\", \"\")\n\t\t:gsub(\"%s+$\", \"\\n\")\n\t\t:gsub(\"\\r\\n\", \"\\n\")\n\t\t:gsub(\"[ \\t]*\\n[ \\t]*\", \"\\n\")\nend\n\ns = m:section(NamedSection, arg[1], \"shunt_rules\", \"\")\ns.addremove = false\ns.dynamic = false\n\nremarks = s:option(Value, \"remarks\", translate(\"Remarks\"))\nremarks.default = arg[1]\nremarks.rmempty = false\nremarks.validate = function(self, value, section)\n\tvalue = api.trim(value)\n\tif value == \"\" then\n\t\treturn nil, translate(\"Remark cannot be empty.\")\n\tend\n\treturn value\nend\n\nprotocol = s:option(MultiValue, \"protocol\", translate(\"Protocol\"))\nprotocol:value(\"http\")\nprotocol:value(\"tls\")\nprotocol:value(\"quic\")\nprotocol:value(\"bittorrent\")\nprotocol.widget = \"checkbox\"\nprotocol.default = nil\n\no = s:option(MultiValue, \"inbound\", translate(\"Inbound Tag\"))\no:value(\"tproxy\", translate(\"Transparent proxy\"))\no:value(\"socks\", \"Socks\")\no.widget = \"checkbox\"\no.default = nil\n\nnetwork = s:option(ListValue, \"network\", translate(\"Network\"))\nnetwork:value(\"tcp,udp\", \"TCP UDP\")\nnetwork:value(\"tcp\", \"TCP\")\nnetwork:value(\"udp\", \"UDP\")\n\nsource = s:option(DynamicList, \"source\", translate(\"Source\"))\nsource.description = \"<ul><li>\" .. translate(\"Example:\")\n.. \"</li><li>\" .. translate(\"IP\") .. \": 192.168.1.100\"\n.. \"</li><li>\" .. translate(\"IP CIDR\") .. \": 192.168.1.0/24\"\n.. \"</li><li>\" .. translate(\"GeoIP\") .. \": geoip:private\"\n.. \"</li></ul>\"\nsource.cast = \"string\"\nsource.cfgvalue = function(self, section)\n\tlocal value\n\tif self.tag_error[section] then\n\t\tvalue = self:formvalue(section)\n\telse\n\t\tvalue = self.map:get(section, self.option)\n\t\tif type(value) == \"string\" then\n\t\t\tlocal value2 = {}\n\t\t\tstring.gsub(value, '[^' .. \" \" .. ']+', function(w) table.insert(value2, w) end)\n\t\t\tvalue = value2\n\t\tend\n\tend\n\treturn value\nend\nsource.validate = function(self, value, t)\n\tlocal err = {}\n\tfor _, v in ipairs(value) do\n\t\tlocal flag = false\n\t\tif datatypes.ip4addr(v) then\n\t\t\tflag = true\n\t\tend\n\n\t\tif flag == false and v:find(\"geoip:\") and v:find(\"geoip:\") == 1 then\n\t\t\tflag = true\n\t\tend\n\n\t\tif flag == false then\n\t\t\terr[#err + 1] = v\n\t\tend\n\tend\n\n\tif #err > 0 then\n\t\tself:add_error(t, \"invalid\", translate(\"Not true format, please re-enter!\"))\n\t\tfor _, v in ipairs(err) do\n\t\t\tself:add_error(t, \"invalid\", v)\n\t\tend\n\tend\n\n\treturn value\nend\n\nlocal dynamicList_write = function(self, section, value)\n\tlocal t = {}\n\tlocal t2 = {}\n\tif type(value) == \"table\" then\n\t\tlocal x\n\t\tfor _, x in ipairs(value) do\n\t\t\tif x and #x > 0 then\n\t\t\t\tif not t2[x] then\n\t\t\t\t\tt2[x] = x\n\t\t\t\t\tt[#t+1] = x\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\telse\n\t\tt = { value }\n\tend\n\tt = table.concat(t, \" \")\n\treturn DynamicList.write(self, section, t)\nend\n\nsource.write = dynamicList_write\n\n--[[\n-- Too low usage rate, hidden\nsourcePort = s:option(Value, \"sourcePort\", translate(\"Source port\"))\n]]--\n\nport = s:option(Value, \"port\", translate(\"port\"))\n\ndomain_list = s:option(TextValue, \"domain_list\", translate(\"Domain\"))\ndomain_list.rows = 10\ndomain_list.wrap = \"off\"\ndomain_list.validate = function(self, value)\n\tlocal hosts= {}\n\tvalue = clean_text(value)\n\tstring.gsub(value, \"[^\\r\\n]+\", function(w) table.insert(hosts, w) end)\n\tfor index, host in ipairs(hosts) do\n\t\tlocal flag = 1\n\t\tlocal tmp_host = host\n\t\tif not host:find(\"#\") and host:find(\"%s\") then\n\t\telseif host:find(\"regexp:\") and host:find(\"regexp:\") == 1 then\n\t\t\tflag = 0\n\t\telseif host:find(\"domain:.\") and host:find(\"domain:.\") == 1 then\n\t\t\ttmp_host = host:gsub(\"domain:\", \"\")\n\t\telseif host:find(\"full:.\") and host:find(\"full:.\") == 1 then\n\t\t\ttmp_host = host:gsub(\"full:\", \"\")\n\t\telseif host:find(\"geosite:\") and host:find(\"geosite:\") == 1 then\n\t\t\tflag = 0\n\t\telseif host:find(\"ext:\") and host:find(\"ext:\") == 1 then\n\t\t\tflag = 0\n\t\telseif host:find(\"rule-set:\", 1, true) == 1 or host:find(\"rs:\") == 1 then\n\t\t\tlocal w = host:sub(host:find(\":\") + 1, #host)\n\t\t\tif w:find(\"local:\") == 1 or w:find(\"remote:\") == 1 then\n\t\t\t\tflag = 0\n\t\t\tend\n\t\telseif host:find(\"#\") and host:find(\"#\") == 1 then\n\t\t\tflag = 0\n\t\tend\n\t\tif flag == 1 then\n\t\t\tif not datatypes.hostname(tmp_host) then\n\t\t\t\treturn nil, tmp_host .. \" \" .. translate(\"Not valid domain name, please re-enter!\")\n\t\t\tend\n\t\tend\n\tend\n\treturn value\nend\ndomain_list.description = \"<br /><ul>\"\n.. \"<li>\" .. translate(\"Plaintext: If this string matches any part of the targeting domain, this rule takes effet. Example: rule 'sina.com' matches targeting domain 'sina.com', 'sina.com.cn' and 'www.sina.com', but not 'sina.cn'.\") .. \"</li>\"\n.. \"<li>\" .. translate(\"Regular expression: Begining with 'regexp:', the rest is a regular expression. When the regexp matches targeting domain, this rule takes effect. Example: rule 'regexp:\\\\.goo.*\\\\.com$' matches 'www.google.com' and 'fonts.googleapis.com', but not 'google.com'.\") .. \"</li>\"\n.. \"<li>\" .. translate(\"Subdomain (recommended): Begining with 'domain:' and the rest is a domain. When the targeting domain is exactly the value, or is a subdomain of the value, this rule takes effect. Example: rule 'domain:v2ray.com' matches 'www.v2ray.com', 'v2ray.com', but not 'xv2ray.com'.\") .. \"</li>\"\n.. \"<li>\" .. translate(\"Full domain: Begining with 'full:' and the rest is a domain. When the targeting domain is exactly the value, the rule takes effect. Example: rule 'domain:v2ray.com' matches 'v2ray.com', but not 'www.v2ray.com'.\") .. \"</li>\"\n.. \"<li>\" .. translate(\"Pre-defined domain list: Begining with 'geosite:' and the rest is a name, such as geosite:google or geosite:cn.\") .. \"</li>\"\n.. \"<li>\"\n\t.. translate(\"Sing-Box is compatible with Geo rules and rule-set. rule-set begin with 'rule-set:remote:' or 'rule-set:local:'.\")\n\t.. \"<ul>\"\n\t\t.. \"<li>\" .. translate(\"Such as:\") .. \"'rule-set:remote:https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-cn.srs'\" .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"Such as:\") .. \"'rule-set:local:/usr/share/sing-box/geosite-cn.srs'\" .. \"</li>\"\n\t.. \"</ul>\"\n.. \"</li>\"\n.. \"<li>\" .. translate(\"Annotation: Begining with #\") .. \"</li>\"\n.. \"</ul>\"\nip_list = s:option(TextValue, \"ip_list\", \"IP\")\nip_list.rows = 10\nip_list.wrap = \"off\"\nip_list.validate = function(self, value)\n\tlocal ipmasks= {}\n\tvalue = clean_text(value)\n\tstring.gsub(value, \"[^\\r\\n]+\", function(w) table.insert(ipmasks, w) end)\n\tfor index, ipmask in ipairs(ipmasks) do\n\t\tif ipmask:find(\"geoip:\") and ipmask:find(\"geoip:\") == 1 and not ipmask:find(\"%s\") then\n\t\telseif ipmask:find(\"ext:\") and ipmask:find(\"ext:\") == 1 and not ipmask:find(\"%s\") then\n\t\telseif ipmask:find(\"rule-set:\", 1, true) == 1 or ipmask:find(\"rs:\") == 1 then\n\t\t\tlocal w = ipmask:sub(ipmask:find(\":\") + 1, #ipmask)\n\t\t\tif w:find(\"local:\") == 1 or w:find(\"remote:\") == 1 then\n\t\t\t\tflag = 0\n\t\t\tend\n\t\telseif ipmask:find(\"#\") and ipmask:find(\"#\") == 1 then\n\t\telse\n\t\t\tif not (datatypes.ipmask4(ipmask) or datatypes.ipmask6(ipmask)) then\n\t\t\t\treturn nil, ipmask .. \" \" .. translate(\"Not valid IP format, please re-enter!\")\n\t\t\tend\n\t\tend\n\tend\n\treturn value\nend\nip_list.description = \"<br /><ul>\"\n.. \"<li>\" .. translate(\"IP: such as '127.0.0.1'.\") .. \"</li>\"\n.. \"<li>\" .. translate(\"CIDR: such as '127.0.0.0/8'.\") .. \"</li>\"\n.. \"<li>\" .. translate(\"GeoIP: such as 'geoip:cn'. It begins with geoip: (lower case) and followed by two letter of country code.\") .. \"</li>\"\n.. \"<li>\"\n\t.. translate(\"Sing-Box is compatible with Geo rules and rule-set. rule-set begin with 'rule-set:remote:' or 'rule-set:local:'.\")\n\t.. \"<ul>\"\n\t\t.. \"<li>\" .. translate(\"Such as:\") .. \"'rule-set:remote:https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs'\" .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"Such as:\") .. \"'rule-set:local:/usr/share/sing-box/geoip-cn.srs'\" .. \"</li>\"\n\t.. \"</ul>\"\n.. \"</li>\"\n.. \"<li>\" .. translate(\"Annotation: Begining with #\") .. \"</li>\"\n.. \"</ul>\"\n\no = s:option(Flag, \"invert\", \"Invert\", translate(\"Invert match result.\") .. \" \" .. translate(\"Only support Sing-Box.\"))\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/socks_config.lua",
    "content": "local api = require \"luci.passwall.api\"\nlocal appname = \"passwall\"\n\nm = Map(appname)\nm.redirect = api.url()\napi.set_apply_on_parse(m)\n\nif not arg[1] or not m:get(arg[1]) then\n\tluci.http.redirect(m.redirect)\nend\n\nm:append(Template(appname .. \"/cbi/nodes_dynamiclist_com\"))\nm:append(Template(appname .. \"/cbi/nodes_listvalue_com\"))\n\nlocal has_singbox = api.finded_com(\"sing-box\")\nlocal has_xray = api.finded_com(\"xray\")\n\nlocal nodes_table = {}\nfor k, e in ipairs(api.get_valid_nodes()) do\n\tnodes_table[#nodes_table + 1] = e\nend\n\ns = m:section(NamedSection, arg[1], translate(\"Socks Config\"), translate(\"Socks Config\"))\ns.addremove = false\ns.dynamic = false\n\n---- Enable\no = s:option(Flag, \"enabled\", translate(\"Enable\"))\no.default = 1\no.rmempty = false\n\nlocal auto_switch_tip\nlocal current_node = api.get_cache_var(\"socks_\" .. arg[1])\nif current_node then\n\tlocal n = m:get(current_node)\n\tif n then\n\t\tif tonumber(m:get(arg[1], \"enable_autoswitch\") or 0) == 1 then\n\t\t\tif n then\n\t\t\t\tlocal remarks = api.get_node_remarks(n)\n\t\t\t\tlocal url = api.url(\"node_config\", n[\".name\"])\n\t\t\t\tauto_switch_tip = translatef(\"Current node: %s\", string.format('<a href=\"%s\">%s</a>', url, remarks)) .. \"<br />\"\n\t\t\tend\n\t\tend\n\tend\nend\n\nsocks_node = s:option(ListValue, \"node\", translate(\"Node\"))\nif auto_switch_tip then\n\tsocks_node.description = auto_switch_tip\nend\nsocks_node.template = appname .. \"/cbi/nodes_listvalue\"\nsocks_node.group = {}\n\no = s:option(Flag, \"bind_local\", translate(\"Bind Local\"), translate(\"When selected, it can only be accessed localhost.\"))\no.default = \"0\"\n\nlocal n = 1\nm.uci:foreach(appname, \"socks\", function(s)\n\tif s[\".name\"] == section then\n\t\treturn false\n\tend\n\tn = n + 1\nend)\n\no = s:option(Value, \"port\", \"Socks \" .. translate(\"Listen Port\"))\no.default = n + 1080\no.datatype = \"port\"\no.rmempty = false\n\nif has_singbox or has_xray then\n\to = s:option(Value, \"http_port\", \"HTTP \" .. translate(\"Listen Port\") .. \" \" .. translate(\"0 is not use\"))\n\to.default = 0\n\to.datatype = \"port\"\nend\n\no = s:option(Flag, \"log\", translate(\"Enable\") .. \" \" .. translate(\"Log\"))\no.default = 1\no.rmempty = false\n\no = s:option(Flag, \"enable_autoswitch\", translate(\"Auto Switch\"))\no.default = 0\no.rmempty = false\n\no = s:option(Value, \"autoswitch_testing_time\", translate(\"How often to test\"), translate(\"Units:seconds\"))\no.datatype = \"min(10)\"\no.default = 30\no:depends(\"enable_autoswitch\", true)\n\no = s:option(Value, \"autoswitch_connect_timeout\", translate(\"Timeout seconds\"), translate(\"Units:seconds\"))\no.datatype = \"min(1)\"\no.default = 3\no:depends(\"enable_autoswitch\", true)\n\no = s:option(Value, \"autoswitch_retry_num\", translate(\"Timeout retry num\"))\no.datatype = \"min(1)\"\no.default = 1\no:depends(\"enable_autoswitch\", true)\n\t\no = s:option(DynamicList, \"autoswitch_backup_node\", translate(\"List of backup nodes\"))\no:depends(\"enable_autoswitch\", true)\no.template = appname .. \"/cbi/nodes_dynamiclist\"\no.group = {}\no.write = function(self, section, value)\n\tlocal n = s.fields[\"node\"]:formvalue(section)\n\tlocal v = type(value) == \"table\" and value or { value }\n\tlocal t = {}\n\tfor _, x in ipairs(v) do\n\t\tif x and x ~= n then t[#t+1] = x end\n\tend\n\treturn DynamicList.write(self, section, t)\nend\nfor i, v in pairs(nodes_table) do\n\tif v.protocol ~= \"_shunt\" then\n\t\to:value(v.id, v.remark)\n\t\to.group[#o.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\t\ts.fields[\"enable_autoswitch\"]:depends({ node = v.id })\n\tend\n\tsocks_node:value(v.id, v[\"remark\"])\n\tsocks_node.group[#socks_node.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\nend\n\no = s:option(Flag, \"autoswitch_restore_switch\", translate(\"Restore Switch\"), translate(\"When detects main node is available, switch back to the main node.\"))\no:depends(\"enable_autoswitch\", true)\n\no = s:option(Value, \"autoswitch_probe_url\", translate(\"Probe URL\"), translate(\"The URL used to detect the connection status.\"))\no:value(\"https://cp.cloudflare.com/\", \"Cloudflare\")\no:value(\"https://www.gstatic.com/generate_204\", \"Gstatic\")\no:value(\"https://www.google.com/generate_204\", \"Google\")\no:value(\"https://www.youtube.com/generate_204\", \"YouTube\")\no:value(\"https://connect.rom.miui.com/generate_204\", \"MIUI (CN)\")\no:value(\"https://connectivitycheck.platform.hicloud.com/generate_204\", \"HiCloud (CN)\")\no.default = o.keylist[3]\no:depends(\"enable_autoswitch\", true)\n\no = s:option(DummyValue, \"btn\")\no.template = appname .. \"/socks_auto_switch/btn\"\no:depends(\"enable_autoswitch\", true)\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/type/hysteria2.lua",
    "content": "local m, s = ...\r\n\r\nif not api.finded_com(\"hysteria\") then\r\n\treturn\r\nend\r\n\r\ntype_name = \"Hysteria2\"\r\n\r\n-- [[ Hysteria2 ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"Hysteria2\")\r\n\r\nif s.val[\"type\"] ~= type_name then\r\n\treturn\r\nend\r\n\r\nlocal option_prefix = \"hysteria2_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\no = s:option(ListValue, _n(\"protocol\"), translate(\"Protocol\"))\r\no:value(\"udp\", \"UDP\")\r\n\r\no = s:option(Value, _n(\"address\"), translate(\"Address (Support Domain Name)\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\n\r\no = s:option(Value, _n(\"hop\"), translate(\"Port hopping range\"))\r\no.description = translate(\"Format as 1000:2000 or 1000-2000 Multiple groups are separated by commas (,).\")\r\no.rewrite_option = o.option\r\n\r\no = s:option(Value, _n(\"hop_interval\"), translate(\"Hop Interval(second)\"), translate(\"Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5.\"))\r\no.datatype = \"or(uinteger,portrange)\"\r\no.placeholder = \"30\"\r\no.default = \"30\"\r\no.rewrite_option = o.option\r\n\r\no = s:option(Value, _n(\"obfs\"), translate(\"Obfs Password\"))\r\no.rewrite_option = o.option\r\n\r\no = s:option(Value, _n(\"auth_password\"), translate(\"Auth Password\"))\r\no.password = true\r\no.rewrite_option = o.option\r\n\r\no = s:option(Flag, _n(\"fast_open\"), translate(\"Fast Open\"))\r\no.default = \"0\"\r\n\r\no = s:option(Value, _n(\"tls_serverName\"), translate(\"Domain\"))\r\n\r\no = s:option(Flag, _n(\"tls_allowInsecure\"), translate(\"allowInsecure\"), translate(\"Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.\"))\r\no.default = \"0\"\r\n\r\no = s:option(Value, _n(\"tls_pinSHA256\"), translate(\"PinSHA256\"),translate(\"Certificate fingerprint\"))\r\n\r\no = s:option(Value, _n(\"up_mbps\"), translate(\"Max upload Mbps\"))\r\no.rewrite_option = o.option\r\n\r\no = s:option(Value, _n(\"down_mbps\"), translate(\"Max download Mbps\"))\r\no.rewrite_option = o.option\r\n\r\no = s:option(Value, _n(\"recv_window\"), translate(\"QUIC stream receive window\"))\r\no.rewrite_option = o.option\r\n\r\no = s:option(Value, _n(\"recv_window_conn\"), translate(\"QUIC connection receive window\"))\r\no.rewrite_option = o.option\r\n\r\no = s:option(Value, _n(\"idle_timeout\"), translate(\"Idle Timeout\"), translate(\"Example:\") .. \"30s (4s~120s)\")\r\no.rewrite_option = o.option\r\n\r\no = s:option(Value, _n(\"keep_alive_period\"), translate(\"QUIC KeepAlive interval\"), translate(\"Example:\") .. \"10s (2s~60s)\")\r\no.rewrite_option = o.option\r\n\r\no = s:option(Flag, _n(\"disable_mtu_discovery\"), translate(\"Disable MTU detection\"))\r\no.default = \"0\"\r\no.rewrite_option = o.option\r\n\r\no = s:option(Flag, _n(\"lazy_start\"), translate(\"Lazy Start\"))\r\no.default = \"0\"\r\no.rewrite_option = o.option\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/type/naive.lua",
    "content": "local m, s = ...\r\n\r\nif not api.is_finded(\"naive\") then\r\n\treturn\r\nend\r\n\r\ntype_name = \"Naiveproxy\"\r\n\r\n-- [[ Naive ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"NaiveProxy\")\r\n\r\nif s.val[\"type\"] ~= type_name then\r\n\treturn\r\nend\r\n\r\nlocal option_prefix = \"naive_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\no = s:option(ListValue, _n(\"protocol\"), translate(\"Protocol\"))\r\no:value(\"https\", translate(\"HTTPS\"))\r\no:value(\"quic\", translate(\"QUIC\"))\r\n\r\no = s:option(Value, _n(\"address\"), translate(\"Address (Support Domain Name)\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\n\r\no = s:option(Value, _n(\"username\"), translate(\"Username\"))\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/type/ray.lua",
    "content": "local m, s = ...\r\n\r\nif not api.finded_com(\"xray\") then\r\n\treturn\r\nend\r\n\r\nlocal jsonc = api.jsonc\r\n\r\ntype_name = \"Xray\"\r\n\r\n-- [[ Xray ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"Xray\")\r\nif not s.fields[\"type\"].default then\r\n\ts.fields[\"type\"].default = type_name\r\nend\r\n\r\nif s.val[\"type\"] ~= type_name then\r\n\treturn\r\nend\r\n\r\nlocal option_prefix = \"xray_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal formvalue_proto = luci.http.formvalue(formvalue_key .. _n(\"protocol\"))\r\n\r\nif formvalue_proto then s.val[\"protocol\"] = formvalue_proto end\r\n\r\nlocal arg_select_proto = luci.http.formvalue(\"select_proto\") or \"\"\r\n\r\nlocal ss_method_list = {\r\n\t\"none\", \"plain\", \"aes-128-gcm\", \"aes-256-gcm\", \"chacha20-poly1305\", \"chacha20-ietf-poly1305\", \"xchacha20-poly1305\", \"xchacha20-ietf-poly1305\", \"2022-blake3-aes-128-gcm\", \"2022-blake3-aes-256-gcm\", \"2022-blake3-chacha20-poly1305\"\r\n}\r\n\r\nlocal security_list = { \"none\", \"auto\", \"aes-128-gcm\", \"chacha20-poly1305\", \"zero\" }\r\n\r\nlocal header_type_list = {\r\n\t\"none\", \"srtp\", \"utp\", \"wechat-video\", \"dtls\", \"wireguard\", \"dns\"\r\n}\r\n\r\nlocal xray_version = api.get_app_version(\"xray\")\r\n\r\no = s:option(ListValue, _n(\"protocol\"), translate(\"Protocol\"))\r\no:value(\"vmess\", translate(\"Vmess\"))\r\no:value(\"vless\", translate(\"VLESS\"))\r\no:value(\"http\", translate(\"HTTP\"))\r\no:value(\"socks\", translate(\"Socks\"))\r\no:value(\"shadowsocks\", translate(\"Shadowsocks\"))\r\no:value(\"trojan\", translate(\"Trojan\"))\r\no:value(\"wireguard\", translate(\"WireGuard\"))\r\nif api.compare_versions(xray_version, \">=\", \"26.1.13\") then\r\n\to:value(\"hysteria2\", translate(\"Hysteria2\"))\r\nend\r\nif api.compare_versions(xray_version, \">=\", \"1.8.12\") then\r\n\to:value(\"_balancing\", translate(\"Balancing\"))\r\nend\r\no:value(\"_shunt\", translate(\"Shunt\"))\r\no:value(\"_iface\", translate(\"Custom Interface\"))\r\nfunction o.custom_cfgvalue(self, section)\r\n\tif arg_select_proto ~= \"\" then\r\n\t\treturn arg_select_proto\r\n\telse\r\n\t\treturn m:get(section, self.option:sub(1 + #option_prefix))\r\n\tend\r\nend\r\n\r\nlocal load_balancing_options = s.val[\"protocol\"] == \"_balancing\" or arg_select_proto == \"_balancing\"\r\nlocal load_shunt_options = s.val[\"protocol\"] == \"_shunt\" or arg_select_proto == \"_shunt\"\r\nlocal load_iface_options = s.val[\"protocol\"] == \"_iface\" or arg_select_proto == \"_iface\"\r\nlocal load_normal_options = true\r\nif load_balancing_options or load_shunt_options or load_iface_options then\r\n\tload_normal_options = nil\r\nend\r\nif not arg_select_proto:find(\"_\") then\r\n\tload_normal_options = true\r\nend\r\n\r\nlocal node_list = api.get_node_list()\r\nlocal fallback_list = {}\r\nlocal is_balancer = nil\r\nfor k, e in ipairs(node_list.balancing_list or {}) do\r\n\tif e.id ~= arg[1] then\r\n\t\tfallback_list[#fallback_list + 1] = {\r\n\t\t\tid = e[\"id\"],\r\n\t\t\tremark = e[\"remark\"],\r\n\t\t\tgroup = e[\"group\"],\r\n\t\t\tfallback = e.o[\"fallback_node\"],\r\n\t\t}\r\n\telse\r\n\t\tis_balancer = true\r\n\tend\r\nend\r\n\r\nif load_balancing_options then -- [[ Load balancing Start ]]\r\n\to = s:option(ListValue, _n(\"node_add_mode\"), translate(\"Node Addition Method\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_balancing\" })\r\n\to.default = \"manual\"\r\n\to:value(\"manual\", translate(\"Manual\"))\r\n\to:value(\"batch\", translate(\"Batch\"))\r\n\r\n\to = s:option(MultiValue, _n(\"balancing_node\"), translate(\"Load balancing node list\"), translate(\"Load balancing node list, <a target='_blank' href='https://xtls.github.io/config/routing.html#balancerobject'>document</a>\"))\r\n\to:depends({ [_n(\"node_add_mode\")] = \"manual\" })\r\n\to.widget = \"checkbox\"\r\n\to.template = appname .. \"/cbi/nodes_multivalue\"\r\n\to.group = {}\r\n\tfor k1, v1 in pairs(node_list) do\r\n\t\tif k1 == \"socks_list\" or k1 == \"normal_list\" then\r\n\t\t\tfor i, v in ipairs(v1) do\r\n\t\t\t\to:value(v.id, v.remark)\r\n\t\t\t\to.group[#o.group+1] = v.group or \"\"\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\n\t-- 读取旧 DynamicList\r\n\tfunction o.cfgvalue(self, section)\r\n\t\treturn m.uci:get_list(appname, section, \"balancing_node\") or {}\r\n\tend\r\n\t-- 写入保持 DynamicList\r\n\tfunction o.custom_write(self, section, value)\r\n\t\tlocal old = m.uci:get_list(appname, section, \"balancing_node\") or {}\r\n\t\tlocal new, set = {}, {}\r\n\t\tfor v in value:gmatch(\"%S+\") do\r\n\t\t\tnew[#new + 1] = v\r\n\t\t\tset[v] = 1\r\n\t\tend\r\n\t\tfor _, v in ipairs(old) do\r\n\t\t\tif not set[v] then\r\n\t\t\t\tm.uci:set_list(appname, section, \"balancing_node\", new)\r\n\t\t\t\treturn\r\n\t\t\tend\r\n\t\t\tset[v] = nil\r\n\t\tend\r\n\t\tfor _ in pairs(set) do\r\n\t\t\tm.uci:set_list(appname, section, \"balancing_node\", new)\r\n\t\t\treturn\r\n\t\tend\r\n\tend\r\n\r\n\to = s:option(MultiValue, _n(\"node_group\"), translate(\"Select Group\"))\r\n\to:depends({ [_n(\"node_add_mode\")] = \"batch\" })\r\n\to.widget = \"checkbox\"\r\n\to:value(\"default\", translate(\"default\"))\r\n\tfor k, v in pairs(groups) do\r\n\t\to:value(api.UrlEncode(k), k)\r\n\tend\r\n\r\n\to = s:option(Value, _n(\"node_match_rule\"), translate(\"Node Matching Rules\"))\r\n\to:depends({ [_n(\"node_add_mode\")] = \"batch\" })\r\n\tlocal descrStr = \"Example: <code>^A && B && !C && D$</code><br>\"\r\n\tdescrStr = descrStr .. \"This means the node remark must start with A (^), include B, exclude C (!), and end with D ($).<br>\"\r\n\tdescrStr = descrStr .. \"Conditions are joined by <code>&&</code>, and their order does not affect the result.\"\r\n\to.description = translate(descrStr) .. string.format(\"<br><font color='red'>%s</font>\",\r\n\t\t\ttranslate(\"Keep the match scope small. Too many nodes can impact router performance.\"))\r\n\r\n\to = s:option(ListValue, _n(\"balancingStrategy\"), translate(\"Balancing Strategy\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_balancing\" })\r\n\to:value(\"random\")\r\n\to:value(\"roundRobin\")\r\n\to:value(\"leastPing\")\r\n\to:value(\"leastLoad\")\r\n\to.default = \"random\"\r\n\r\n\t-- Fallback Node\r\n\to = s:option(ListValue, _n(\"fallback_node\"), translate(\"Fallback Node\"))\r\n\to.group = {\"\",\"\"}\r\n\to:value(\"\", translate(\"Close(Not use)\"))\r\n\to:value(\"_direct\", translate(\"Direct Connection\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_balancing\" })\r\n\to.template = appname .. \"/cbi/nodes_listvalue\"\r\n\t-- 最大 fallback 套娃层数\r\n\tlocal MAX_FALLBACK_DEPTH = 3\r\n\t-- 检查是否会形成回环\r\n\tlocal function will_loop(start_id, target_id, depth)\r\n\t\tdepth = depth or 0\r\n\t\t-- 超过最大深度后停止递归\r\n\t\tif depth >= MAX_FALLBACK_DEPTH then\r\n\t\t\treturn false\r\n\t\tend\r\n\t\tfor _, v in ipairs(fallback_list) do\r\n\t\t\tif v.id == target_id then\r\n\t\t\t\tlocal fb = v.fallback\r\n\t\t\t\t-- 没有 fallback\r\n\t\t\t\tif not fb or fb == \"\" or fb == \"_direct\" then\r\n\t\t\t\t\treturn false\r\n\t\t\t\tend\r\n\t\t\t\t-- 检测到回环\r\n\t\t\t\tif fb == start_id then\r\n\t\t\t\t\treturn true\r\n\t\t\t\tend\r\n\t\t\t\t-- 继续递归检查\r\n\t\t\t\treturn will_loop(start_id, fb, depth + 1)\r\n\t\t\tend\r\n\t\tend\r\n\t\treturn false\r\n\tend\r\n\t-- 获取 fallback 链深度\r\n\tlocal function get_fallback_depth(id, depth)\r\n\t\tdepth = depth or 0\r\n\t\tif depth >= MAX_FALLBACK_DEPTH then\r\n\t\t\treturn depth\r\n\t\tend\r\n\t\tfor _, v in ipairs(fallback_list) do\r\n\t\t\tif v.id == id then\r\n\t\t\t\tlocal fb = v.fallback\r\n\t\t\t\tif not fb or fb == \"\" or fb == \"_direct\" then\r\n\t\t\t\t\treturn depth\r\n\t\t\t\tend\r\n\t\t\t\treturn get_fallback_depth(fb, depth + 1)\r\n\t\t\tend\r\n\t\tend\r\n\t\treturn depth\r\n\tend\r\n\tfor _, v in ipairs(fallback_list) do\r\n\t\tlocal depth = get_fallback_depth(v.id)\r\n\t\t-- 超过最大套娃层数后，不允许继续选择 balancer\r\n\t\tif depth < MAX_FALLBACK_DEPTH\r\n\t\t\tand not will_loop(arg[1], v.id)\r\n\t\tthen\r\n\t\t\to:value(v.id, v.remark)\r\n\t\t\to.group[#o.group + 1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\r\n\t\tend\r\n\tend\r\n\tfor k1, v1 in pairs(node_list) do\r\n\t\tif k1 == \"socks_list\" or k1 == \"normal_list\" or k1 == \"urltest_list\" then\r\n\t\t\tfor i, v in ipairs(v1) do\r\n\t\t\t\to:value(v.id, v.remark)\r\n\t\t\t\to.group[#o.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\n\r\n\t-- 探测地址\r\n\to = s:option(Flag, _n(\"useCustomProbeUrl\"), translate(\"Use Custom Probe URL\"), translate(\"By default the built-in probe URL will be used, enable this option to use a custom probe URL.\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_balancing\" })\r\n\r\n\to = s:option(Value, _n(\"probeUrl\"), translate(\"Probe URL\"))\r\n\to:depends({ [_n(\"useCustomProbeUrl\")] = true })\r\n\to:value(\"https://cp.cloudflare.com/\", \"Cloudflare\")\r\n\to:value(\"https://www.gstatic.com/generate_204\", \"Gstatic\")\r\n\to:value(\"https://www.google.com/generate_204\", \"Google\")\r\n\to:value(\"https://www.youtube.com/generate_204\", \"YouTube\")\r\n\to:value(\"https://connect.rom.miui.com/generate_204\", \"MIUI (CN)\")\r\n\to:value(\"https://connectivitycheck.platform.hicloud.com/generate_204\", \"HiCloud (CN)\")\r\n\to.default = o.keylist[3]\r\n\to.description = translate(\"The URL used to detect the connection status.\")\r\n\r\n\t-- 探测间隔\r\n\to = s:option(Value, _n(\"probeInterval\"), translate(\"Probe Interval\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_balancing\" })\r\n\to.default = \"1m\"\r\n\to.placeholder = \"1m\"\r\n\to.description = translate(\"The interval between initiating probes.\") .. \"<br>\" ..\r\n\t\t\ttranslate(\"The time format is numbers + units, such as '10s', '2h45m', and the supported time units are <code>s</code>, <code>m</code>, <code>h</code>, which correspond to seconds, minutes, and hours, respectively.\") .. \"<br>\" ..\r\n\t\t\ttranslate(\"When the unit is not filled in, it defaults to seconds.\")\r\n\r\n\to = s:option(Value, _n(\"expected\"), translate(\"Preferred Node Count\"))\r\n\to:depends({ [_n(\"balancingStrategy\")] = \"leastLoad\" })\r\n\to.datatype = \"uinteger\"\r\n\to.default = \"2\"\r\n\to.placeholder = \"2\"\r\n\to.description = translate(\"The load balancer selects the optimal number of nodes, and traffic is randomly distributed among them.\")\r\nend  -- [[ 负载均衡 End ]]\r\n\r\nif load_iface_options then -- [[ 自定义接口 Start ]]\r\n\to = s:option(Value, _n(\"iface\"), translate(\"Interface\"))\r\n\to.default = \"eth1\"\r\n\to:depends({ [_n(\"protocol\")] = \"_iface\" })\r\nend -- [[ 自定义接口 End ]]\r\n\r\n\r\nif load_normal_options then\r\n\r\no = s:option(Value, _n(\"address\"), translate(\"Address (Support Domain Name)\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\n\r\no = s:option(Value, _n(\"uuid\"), translate(\"ID\"))\r\no.password = true\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\n\r\no = s:option(Value, _n(\"username\"), translate(\"Username\"))\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\no = s:option(ListValue, _n(\"security\"), translate(\"Encrypt Method\"))\r\nfor a, t in ipairs(security_list) do o:value(t) end\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\n\r\no = s:option(Value, _n(\"encryption\"), translate(\"Encrypt Method\") .. \" (encryption)\")\r\no.default = \"none\"\r\no.placeholder = \"none\"\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no.validate = function(self, value)\r\n\tvalue = api.trim(value)\r\n\treturn (value == \"\" and \"none\" or value)\r\nend\r\n\r\no = s:option(ListValue, _n(\"ss_method\"), translate(\"Encrypt Method\"))\r\no.rewrite_option = \"method\"\r\nfor a, t in ipairs(ss_method_list) do o:value(t) end\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(Flag, _n(\"iv_check\"), translate(\"IV Check\"))\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\", [_n(\"ss_method\")] = \"aes-128-gcm\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\", [_n(\"ss_method\")] = \"aes-256-gcm\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\", [_n(\"ss_method\")] = \"chacha20-poly1305\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\", [_n(\"ss_method\")] = \"xchacha20-poly1305\" })\r\n\r\no = s:option(Flag, _n(\"uot\"), translate(\"UDP over TCP\"))\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(ListValue, _n(\"flow\"), translate(\"flow\"))\r\no.default = \"\"\r\no:value(\"\", translate(\"Disable\"))\r\no:value(\"xtls-rprx-vision\")\r\no:value(\"xtls-rprx-vision-udp443\")\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\n\r\n---- [[hysteria2]]\r\no = s:option(Value, _n(\"hysteria2_hop\"), translate(\"Port hopping range\"))\r\no.description = translate(\"Format as 1000:2000 or 1000-2000 Multiple groups are separated by commas (,).\")\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(Value, _n(\"hysteria2_hop_interval\"), translate(\"Hop Interval(second)\"), translate(\"Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5.\"))\r\no.datatype = \"or(uinteger,portrange)\"\r\no.placeholder = \"30\"\r\no.default = \"30\"\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(Value, _n(\"hysteria2_up_mbps\"), translate(\"Max upload Mbps\"))\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(Value, _n(\"hysteria2_down_mbps\"), translate(\"Max download Mbps\"))\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(ListValue, _n(\"hysteria2_obfs_type\"), translate(\"Obfs Type\"))\r\no:value(\"\", translate(\"Disable\"))\r\no:value(\"salamander\")\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(Value, _n(\"hysteria2_obfs_password\"), translate(\"Obfs Password\"))\r\no:depends({ [_n(\"hysteria2_obfs_type\")] = \"salamander\" })\r\n\r\no = s:option(Value, _n(\"hysteria2_auth_password\"), translate(\"Auth Password\"))\r\no.password = true\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\n\r\no = s:option(Value, _n(\"hysteria2_idle_timeout\"), translate(\"Idle Timeout\"), translate(\"Example:\") .. \"30s (4s~120s)\")\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\n\r\no = s:option(Value, _n(\"hysteria2_keep_alive_period\"), translate(\"QUIC KeepAlive interval\"), translate(\"Example:\") .. \"10s (2s~60s)\")\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\n\r\no = s:option(Flag, _n(\"hysteria2_disable_mtu_discovery\"), translate(\"Disable MTU detection\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\n---- [[hysteria2 end]]\r\n\r\no = s:option(Flag, _n(\"tls\"), translate(\"TLS\"))\r\no.default = 0\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(Flag, _n(\"reality\"), translate(\"REALITY\"), translate(\"Only recommend to use with VLESS-TCP-XTLS-Vision.\"))\r\no.default = 0\r\no:depends({ [_n(\"tls\")] = true, [_n(\"transport\")] = \"raw\" })\r\no:depends({ [_n(\"tls\")] = true, [_n(\"transport\")] = \"ws\" })\r\no:depends({ [_n(\"tls\")] = true, [_n(\"transport\")] = \"grpc\" })\r\no:depends({ [_n(\"tls\")] = true, [_n(\"transport\")] = \"httpupgrade\" })\r\no:depends({ [_n(\"tls\")] = true, [_n(\"transport\")] = \"xhttp\" })\r\n\r\no = s:option(ListValue, _n(\"alpn\"), translate(\"alpn\"))\r\no.default = \"default\"\r\no:value(\"default\", translate(\"Default\"))\r\no:value(\"h3\")\r\no:value(\"h2\")\r\no:value(\"h3,h2\")\r\no:value(\"http/1.1\")\r\no:value(\"h2,http/1.1\")\r\no:value(\"h3,h2,http/1.1\")\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\n-- o = s:option(Value, _n(\"minversion\"), translate(\"minversion\"))\r\n-- o.default = \"1.3\"\r\n-- o:value(\"1.3\")\r\n-- o:depends({ [_n(\"tls\")] = true })\r\n\r\no = s:option(Value, _n(\"tls_serverName\"), \"SNI \" .. translate(\"Domain\"))\r\no:depends({ [_n(\"tls\")] = true })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\nif api.compare_versions(os.date(\"%Y.%m.%d\"), \"<\", \"2026.6.1\") then\r\n\to = s:option(Flag, _n(\"tls_allowInsecure\"), translate(\"allowInsecure\"), translate(\"Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.\"))\r\n\to.default = \"0\"\r\n\to:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\nend\r\n\r\nif api.compare_versions(xray_version, \">=\", \"26.1.31\") then\r\n\to = s:option(Value, _n(\"tls_pinSHA256\"), translate(\"TLS Chain Fingerprint (SHA256)\"))\r\n\to:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\to.description = translate(\"Once set, connects only when the server’s chain fingerprint matches.\") ..\r\n\t\t\tstring.format(\"<a href='javascript:void(0)' onclick='javascript:fetchCertSha256(this)'>%s</a>\", \"→ \" .. translate(\"Fetch Manually\"))\r\n\r\n\to = s:option(Value, _n(\"tls_CertByName\"), translate(\"TLS Certificate Name (CertName)\"), translate(\"TLS is used to verify the leaf certificate name.\"))\r\n\to:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\nend\r\n\r\no = s:option(Flag, _n(\"ech\"), translate(\"ECH\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(TextValue, _n(\"ech_config\"), translate(\"ECH Config\"))\r\no.default = \"\"\r\no.rows = 5\r\no.wrap = \"soft\"\r\no:depends({ [_n(\"ech\")] = true })\r\no.validate = function(self, value)\r\n\treturn api.trim(value:gsub(\"[\\r\\n]\", \"\"))\r\nend\r\n\r\n-- [[ REALITY部分 ]] --\r\no = s:option(Value, _n(\"reality_publicKey\"), translate(\"Public Key\"))\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = true })\r\n\r\no = s:option(Value, _n(\"reality_shortId\"), translate(\"Short Id\"))\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = true })\r\n\r\no = s:option(Value, _n(\"reality_spiderX\"), translate(\"Spider X\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = true })\r\n\r\no = s:option(Flag, _n(\"utls\"), translate(\"uTLS\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\n\r\no = s:option(ListValue, _n(\"fingerprint\"), translate(\"Finger Print\"))\r\no:value(\"chrome\")\r\no:value(\"firefox\")\r\no:value(\"edge\")\r\no:value(\"safari\")\r\no:value(\"360\")\r\no:value(\"qq\")\r\no:value(\"ios\")\r\no:value(\"android\")\r\no:value(\"random\")\r\no:value(\"randomized\")\r\no.default = \"chrome\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"utls\")] = true })\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = true })\r\n\r\no = s:option(Flag, _n(\"use_mldsa65Verify\"), translate(\"ML-DSA-65\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = true })\r\n\r\no = s:option(TextValue, _n(\"reality_mldsa65Verify\"), \"ML-DSA-65 \" .. translate(\"Public key\"))\r\no.default = \"\"\r\no.rows = 5\r\no.wrap = \"soft\"\r\no:depends({ [_n(\"use_mldsa65Verify\")] = true })\r\no.validate = function(self, value)\r\n\treturn api.trim(value:gsub(\"[\\r\\n]\", \"\"))\r\nend\r\n\r\no = s:option(ListValue, _n(\"transport\"), translate(\"Transport\"))\r\no:value(\"raw\", \"RAW (TCP)\")\r\no:value(\"mkcp\", \"mKCP\")\r\no:value(\"ws\", \"WebSocket\")\r\no:value(\"grpc\", \"gRPC\")\r\no:value(\"httpupgrade\", \"HttpUpgrade\")\r\no:value(\"xhttp\", \"XHTTP\")\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\no = s:option(Value, _n(\"wireguard_public_key\"), translate(\"Public Key\"))\r\no:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\no = s:option(Value, _n(\"wireguard_secret_key\"), translate(\"Private Key\"))\r\no:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\no = s:option(Value, _n(\"wireguard_preSharedKey\"), translate(\"Pre shared key\"))\r\no:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\no = s:option(DynamicList, _n(\"wireguard_local_address\"), translate(\"Local Address\"))\r\no:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\no = s:option(Value, _n(\"wireguard_mtu\"), translate(\"MTU\"))\r\no.default = \"1420\"\r\no:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\nif api.compare_versions(xray_version, \">=\", \"1.8.0\") then\r\n\to = s:option(Value, _n(\"wireguard_reserved\"), translate(\"Reserved\"), translate(\"Decimal numbers separated by \\\",\\\" or Base64-encoded strings.\"))\r\n\to:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\nend\r\n\r\no = s:option(Value, _n(\"wireguard_keepAlive\"), translate(\"Keep Alive\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\n-- [[ RAW部分 ]]--\r\n\r\n-- TCP伪装\r\no = s:option(ListValue, _n(\"tcp_guise\"), translate(\"Camouflage Type\"))\r\no:value(\"none\", \"none\")\r\no:value(\"http\", \"http\")\r\no:depends({ [_n(\"transport\")] = \"raw\" })\r\n\r\n-- HTTP域名\r\no = s:option(DynamicList, _n(\"tcp_guise_http_host\"), translate(\"HTTP Host\"))\r\no:depends({ [_n(\"tcp_guise\")] = \"http\" })\r\n\r\n-- HTTP路径\r\no = s:option(DynamicList, _n(\"tcp_guise_http_path\"), translate(\"HTTP Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"tcp_guise\")] = \"http\" })\r\n\r\n-- [[ mKCP部分 ]]--\r\n\r\no = s:option(ListValue, _n(\"mkcp_guise\"), translate(\"Camouflage Type\"), translate('<br />none: default, no masquerade, data sent is packets with no characteristics.<br />srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime).<br />utp: packets disguised as uTP will be recognized as bittorrent downloaded data.<br />wechat-video: packets disguised as WeChat video calls.<br />dtls: disguised as DTLS 1.2 packet.<br />wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)<br />dns: Disguising traffic as DNS requests.'))\r\nfor a, t in ipairs(header_type_list) do o:value(t) end\r\no:depends({ [_n(\"transport\")] = \"mkcp\" })\r\n\r\no = s:option(Value, _n(\"mkcp_domain\"), translate(\"Camouflage Domain\"), translate(\"Use it together with the DNS disguised type. You can fill in any domain.\"))\r\no:depends({ [_n(\"mkcp_guise\")] = \"dns\" })\r\n\r\no = s:option(Value, _n(\"mkcp_mtu\"), translate(\"KCP MTU\"))\r\no.datatype = \"uinteger\"\r\no.default = 1350\r\no:depends({ [_n(\"transport\")] = \"mkcp\" })\r\n\r\no = s:option(Value, _n(\"mkcp_seed\"), translate(\"KCP Seed\"))\r\no:depends({ [_n(\"transport\")] = \"mkcp\" })\r\n\r\n-- [[ WebSocket部分 ]]--\r\no = s:option(Value, _n(\"ws_host\"), translate(\"WebSocket Host\"))\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\no = s:option(Value, _n(\"ws_path\"), translate(\"WebSocket Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\no = s:option(Value, _n(\"ws_heartbeatPeriod\"), translate(\"HeartbeatPeriod(second)\"))\r\no.datatype = \"integer\"\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\n-- [[ gRPC部分 ]]--\r\no = s:option(Value, _n(\"grpc_serviceName\"), \"ServiceName\")\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\no = s:option(ListValue, _n(\"grpc_mode\"), \"gRPC \" .. translate(\"Transfer mode\"))\r\no:value(\"gun\")\r\no:value(\"multi\")\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\no = s:option(Flag, _n(\"grpc_health_check\"), translate(\"Health check\"))\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\no = s:option(Value, _n(\"grpc_idle_timeout\"), translate(\"Idle timeout\"))\r\no.default = \"10\"\r\no:depends({ [_n(\"grpc_health_check\")] = true })\r\n\r\no = s:option(Value, _n(\"grpc_health_check_timeout\"), translate(\"Health check timeout\"))\r\no.default = \"20\"\r\no:depends({ [_n(\"grpc_health_check\")] = true })\r\n\r\no = s:option(Flag, _n(\"grpc_permit_without_stream\"), translate(\"Permit without stream\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"grpc_health_check\")] = true })\r\n\r\no = s:option(Value, _n(\"grpc_initial_windows_size\"), translate(\"Initial Windows Size\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\n-- [[ HttpUpgrade部分 ]]--\r\no = s:option(Value, _n(\"httpupgrade_host\"), translate(\"HttpUpgrade Host\"))\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\n\r\no = s:option(Value, _n(\"httpupgrade_path\"), translate(\"HttpUpgrade Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\n\r\n-- [[ XHTTP部分 ]]--\r\no = s:option(ListValue, _n(\"xhttp_mode\"), \"XHTTP \" .. translate(\"Mode\"))\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\no.default = \"auto\"\r\no:value(\"auto\")\r\no:value(\"packet-up\")\r\no:value(\"stream-up\")\r\no:value(\"stream-one\")\r\n\r\no = s:option(Value, _n(\"xhttp_host\"), translate(\"XHTTP Host\"))\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\n\r\no = s:option(Value, _n(\"xhttp_path\"), translate(\"XHTTP Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\n\r\no = s:option(Flag, _n(\"use_xhttp_extra\"), translate(\"XHTTP Extra\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\n\r\no = s:option(TextValue, _n(\"xhttp_extra\"), \"　\", translate(\"An XHttpObject in JSON format, used for sharing.\"))\r\no:depends({ [_n(\"use_xhttp_extra\")] = true })\r\no.rows = 10\r\no.wrap = \"off\"\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal raw = m:get(section, \"xhttp_extra\")\r\n\tif raw then\r\n\t\treturn api.base64Decode(raw)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"xhttp_extra\", api.base64Encode(value) or \"\")\r\n\tlocal success, data = pcall(jsonc.parse, value)\r\n\tif success and data then\r\n\t\tlocal address = (data.extra and data.extra.downloadSettings and data.extra.downloadSettings.address)\r\n\t\t\tor (data.downloadSettings and data.downloadSettings.address)\r\n\t\tif address and address ~= \"\" then\r\n\t\t\taddress = address:gsub(\"^%[\", \"\"):gsub(\"%]$\", \"\")\r\n\t\t\tm:set(section, \"download_address\", address)\r\n\t\telse\r\n\t\t\tm:del(section, \"download_address\")\r\n\t\tend\r\n\telse\r\n\t\tm:del(section, \"download_address\")\r\n\tend\r\nend\r\no.validate = function(self, value)\r\n\tvalue = api.trim(value):gsub(\"\\r\\n\", \"\\n\"):gsub(\"^[ \\t]*\\n\", \"\"):gsub(\"\\n[ \\t]*$\", \"\"):gsub(\"\\n[ \\t]*\\n\", \"\\n\")\r\n\tif api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, \"XHTTP Extra \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\no.custom_remove = function(self, section, value)\r\n\tm:del(section, \"xhttp_extra\")\r\n\tm:del(section, \"download_address\")\r\nend\r\n\r\n-- [[ User-Agent ]]--\r\no = s:option(Value, _n(\"user_agent\"), translate(\"User-Agent\"))\r\no.default = \"\"\r\no:value(\"\", translate(\"default\"))\r\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36\", \"chrome\")\r\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0\", \"firefox\")\r\no:value(\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15\", \"safari\")\r\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.70\", \"edge\")\r\no:value(\"Go-http-client/1.1\", \"golang\")\r\no:value(\"curl/7.68.0\", \"curl\")\r\no:depends({ [_n(\"tcp_guise\")] = \"http\" })\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\n-- [[ Mux.Cool ]]--\r\no = s:option(Flag, _n(\"mux\"), \"Mux\", translate(\"Enable Mux.Cool\"))\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"transport\")] = \"raw\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"transport\")] = \"ws\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"transport\")] = \"grpc\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"transport\")] = \"httpupgrade\" })\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\no = s:option(Value, _n(\"mux_concurrency\"), translate(\"Mux concurrency\"))\r\no.default = -1\r\no:depends({ [_n(\"mux\")] = true })\r\n\r\no = s:option(Value, _n(\"xudp_concurrency\"), translate(\"XUDP Mux concurrency\"))\r\no.default = 8\r\no:depends({ [_n(\"mux\")] = true })\r\n\r\n--[[FinalMask]]\r\no = s:option(Flag, _n(\"use_finalmask\"), \"FinalMask\")\r\no.default = \"0\"\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(TextValue, _n(\"finalmask\"), \"　\")\r\no:depends({ [_n(\"use_finalmask\")] = true })\r\no.rows = 10\r\no.wrap = \"off\"\r\no.description = translate(\"An FinalMaskObject in JSON format, used for sharing.\") .. \"<br>\" ..\r\n\t\ttranslate(\"Custom finalmask overrides mkcp, hysteria2, fragment, noise, and related settings.\")\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal raw = m:get(section, \"finalmask\")\r\n\tif raw then\r\n\t\treturn api.base64Decode(raw)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"finalmask\", api.base64Encode(value) or \"\")\r\nend\r\no.validate = function(self, value)\r\n\tvalue = api.trim(value):gsub(\"\\r\\n\", \"\\n\"):gsub(\"^[ \\t]*\\n\", \"\"):gsub(\"\\n[ \\t]*$\", \"\"):gsub(\"\\n[ \\t]*\\n\", \"\\n\")\r\n\tif api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, \"FinalMask \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\n\r\n--[[Fast Open]]\r\no = s:option(Flag, _n(\"tcp_fast_open\"), \"TCP \" .. translate(\"Fast Open\"), translate(\"Need node support required\"))\r\no.default = 0\r\n\r\n--[[tcpMptcp]]\r\no = s:option(Flag, _n(\"tcpMptcp\"), \"tcpMptcp\", translate(\"Enable Multipath TCP, need to be enabled in both server and client configuration.\"))\r\no.default = 0\r\n\r\no = s:option(Value, _n(\"preconns\"), translate(\"Pre-connections\"), translate(\"Number of early established connections to reduce latency.\"))\r\no.datatype = \"uinteger\"\r\no.placeholder = 0\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\n\r\no = s:option(ListValue, _n(\"domain_resolver\"), translate(\"Domain DNS Resolve\"))\r\no.description = translate(\"If the node address is a domain name, this DNS will be used for resolution.\") .. \"<br>\" .. string.format('<font color=\"red\">%s</font>',\r\n\t\ttranslate(\"Note: For node-specific DNS only. Keep Auto to avoid extra overhead.\"))\r\no:value(\"\", translate(\"Auto\"))\r\no:value(\"tcp\", \"TCP\")\r\no:value(\"udp\", \"UDP\")\r\no:value(\"https\", \"DoH\")\r\n\r\no = s:option(Value, _n(\"domain_resolver_dns\"), \"DNS\")\r\no.datatype = \"or(ipaddr,ipaddrport)\"\r\no:value(\"114.114.114.114\")\r\no:value(\"223.5.5.5:53\")\r\no.default = o.keylist[1]\r\no:depends({ [_n(\"domain_resolver\")] = \"tcp\" })\r\no:depends({ [_n(\"domain_resolver\")] = \"udp\" })\r\n\r\no = s:option(Value, _n(\"domain_resolver_dns_https\"), \"DNS\")\r\no:value(\"https://120.53.53.53/dns-query\", \"DNSPod\")\r\no:value(\"https://223.5.5.5/dns-query\", \"AliDNS\")\r\no.default = o.keylist[1]\r\no:depends({ [_n(\"domain_resolver\")] = \"https\" })\r\n\r\no = s:option(ListValue, _n(\"domain_strategy\"), translate(\"Domain Strategy\"), translate(\"If is domain name, The requested domain name will be resolved to IP before connect.\"))\r\no.default = \"\"\r\no:value(\"\", translate(\"Auto\"))\r\no:value(\"UseIPv4v6\", translate(\"Prefer IPv4\"))\r\no:value(\"UseIPv6v4\", translate(\"Prefer IPv6\"))\r\no:value(\"UseIPv4\", translate(\"IPv4 Only\"))\r\no:value(\"UseIPv6\", translate(\"IPv6 Only\"))\r\n\r\nlocal protocols = s.fields[_n(\"protocol\")].keylist\r\nif #protocols > 0 then\r\n\tfor i, v in ipairs(protocols) do\r\n\t\tif not v:find(\"^_\") then\r\n\t\t\ts.fields[_n(\"address\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\t\ts.fields[_n(\"port\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\t\ts.fields[_n(\"domain_resolver\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\t\ts.fields[_n(\"domain_strategy\")]:depends({ [_n(\"protocol\")] = v })\r\n\r\n\t\t\tif v ~= \"hysteria2\" then\r\n\t\t\t\ts.fields[_n(\"tcp_fast_open\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\t\t\ts.fields[_n(\"tcpMptcp\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\nend\r\nend\r\n-- [[ Normal single node End ]]\r\n\r\nif not load_shunt_options then\r\n\to = s:option(ListValue, _n(\"chain_proxy\"), translate(\"Chain Proxy\"))\r\n\to:value(\"\", translate(\"Close(Not use)\"))\r\n\tif not (load_iface_options or load_balancing_options) then\r\n\t\t-- Special node cannot be use pre-proxy.\r\n\t\to:value(\"1\", translate(\"Preproxy Node\"))\r\n\tend\r\n\to:value(\"2\", translate(\"Landing Node\"))\r\n\r\n\to1 = s:option(ListValue, _n(\"preproxy_node\"), translate(\"Preproxy Node\"), translate(\"Only support a layer of proxy.\"))\r\n\to1:depends({ [_n(\"chain_proxy\")] = \"1\" })\r\n\to1.template = appname .. \"/cbi/nodes_listvalue\"\r\n\to1.group = {}\r\n\r\n\to2 = s:option(ListValue, _n(\"to_node\"), translate(\"Landing Node\"), translate(\"Only support a layer of proxy.\"))\r\n\to2:depends({ [_n(\"chain_proxy\")] = \"2\" })\r\n\to2.template = appname .. \"/cbi/nodes_listvalue\"\r\n\to2.group = {}\r\n\r\n\tfor k1, v1 in pairs(node_list) do\r\n\t\tif k1 ~= \"shunt_list\" and k1 ~= \"iface_list\" then\r\n\t\t\tfor i, v in ipairs(v1) do\r\n\t\t\t\tif v.id ~= arg[1] then\r\n\t\t\t\t\to1:value(v.id, v.remark)\r\n\t\t\t\t\to1.group[#o1.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\r\n\t\t\t\t\tif k1 == \"normal_list\" then\r\n\t\t\t\t\t\t-- Landing Node not support use special node.\r\n\t\t\t\t\t\to2:value(v.id, v.remark)\r\n\t\t\t\t\t\to2.group[#o2.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\r\n\t\t\t\t\tend\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\nend\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n\r\nif load_shunt_options then\r\n\tlocal current_node = m.uci:get_all(appname, arg[1]) or {}\r\n\tlocal shunt_lua = loadfile(\"/usr/lib/lua/luci/model/cbi/passwall/client/include/shunt_options.lua\")\r\n\tsetfenv(shunt_lua, getfenv(1))(m, s, {\r\n\t\tnode_id = arg[1],\r\n\t\tnode = current_node,\r\n\t\tnode_list = node_list,\r\n\t})\r\nend\r\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/type/sing-box.lua",
    "content": "local m, s = ...\r\n\r\nlocal singbox_bin = api.finded_com(\"sing-box\")\r\n\r\nif not singbox_bin then\r\n\treturn\r\nend\r\n\r\ntype_name = \"sing-box\"\r\n\r\n-- [[ sing-box ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"Sing-Box\")\r\nif not s.fields[\"type\"].default then\r\n\ts.fields[\"type\"].default = type_name\r\nend\r\n\r\nif s.val[\"type\"] ~= type_name then\r\n\treturn\r\nend\r\n\r\nlocal option_prefix = \"singbox_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal formvalue_proto = luci.http.formvalue(formvalue_key .. _n(\"protocol\"))\r\n\r\nif formvalue_proto then s.val[\"protocol\"] = formvalue_proto end\r\n\r\nlocal arg_select_proto = luci.http.formvalue(\"select_proto\") or \"\"\r\n\r\nlocal ss_method_new_list = {\r\n\t\"none\", \"aes-128-gcm\", \"aes-192-gcm\", \"aes-256-gcm\", \"chacha20-ietf-poly1305\", \"xchacha20-ietf-poly1305\", \"2022-blake3-aes-128-gcm\", \"2022-blake3-aes-256-gcm\", \"2022-blake3-chacha20-poly1305\"\r\n}\r\n\r\nlocal ss_method_old_list = {\r\n\t\"aes-128-ctr\", \"aes-192-ctr\", \"aes-256-ctr\", \"aes-128-cfb\", \"aes-192-cfb\", \"aes-256-cfb\", \"rc4-md5\", \"chacha20-ietf\", \"xchacha20\",\r\n}\r\n\r\nlocal security_list = { \"none\", \"auto\", \"aes-128-gcm\", \"chacha20-poly1305\", \"zero\" }\r\n\r\nlocal singbox_tags = luci.sys.exec(singbox_bin .. \" version  | grep 'Tags:' | awk '{print $2}'\")\r\n\r\no = s:option(ListValue, _n(\"protocol\"), translate(\"Protocol\"))\r\no:value(\"socks\", \"Socks\")\r\no:value(\"http\", \"HTTP\")\r\no:value(\"shadowsocks\", \"Shadowsocks\")\r\no:value(\"vmess\", \"Vmess\")\r\no:value(\"trojan\", \"Trojan\")\r\nif singbox_tags:find(\"with_wireguard\") then\r\n\to:value(\"wireguard\", \"WireGuard\")\r\nend\r\nif singbox_tags:find(\"with_quic\") then\r\n\to:value(\"hysteria\", \"Hysteria\")\r\nend\r\no:value(\"vless\", \"VLESS\")\r\nif singbox_tags:find(\"with_quic\") then\r\n\to:value(\"tuic\", \"TUIC\")\r\nend\r\nif singbox_tags:find(\"with_quic\") then\r\n\to:value(\"hysteria2\", \"Hysteria2\")\r\nend\r\no:value(\"anytls\", \"AnyTLS\")\r\no:value(\"ssh\", \"SSH\")\r\nif singbox_tags:find(\"with_naive_outbound\") then\r\n\to:value(\"naive\", \"NaïveProxy\")\r\nend\r\no:value(\"_urltest\", translate(\"URLTest\"))\r\no:value(\"_shunt\", translate(\"Shunt\"))\r\no:value(\"_iface\", translate(\"Custom Interface\"))\r\nfunction o.custom_cfgvalue(self, section)\r\n\tif arg_select_proto ~= \"\" then\r\n\t\treturn arg_select_proto\r\n\telse\r\n\t\treturn m:get(section, self.option:sub(1 + #option_prefix))\r\n\tend\r\nend\r\n\r\nlocal load_urltest_options = s.val[\"protocol\"] == \"_urltest\" or arg_select_proto == \"_urltest\"\r\nlocal load_shunt_options = s.val[\"protocol\"] == \"_shunt\" or arg_select_proto == \"_shunt\"\r\nlocal load_iface_options = s.val[\"protocol\"] == \"_iface\" or arg_select_proto == \"_iface\"\r\nlocal load_normal_options = true\r\nif load_urltest_options or load_shunt_options or load_iface_options then\r\n\tload_normal_options = nil\r\nend\r\nif not arg_select_proto:find(\"_\") then\r\n\tload_normal_options = true\r\nend\r\n\r\nlocal node_list = api.get_node_list()\r\n\r\nif load_urltest_options then -- [[ URLTest Start ]]\r\n\to = s:option(ListValue, _n(\"node_add_mode\"), translate(\"Node Addition Method\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_urltest\" })\r\n\to.default = \"manual\"\r\n\to:value(\"manual\", translate(\"Manual\"))\r\n\to:value(\"batch\", translate(\"Batch\"))\r\n\r\n\to = s:option(MultiValue, _n(\"urltest_node\"), translate(\"URLTest node list\"), translate(\"List of nodes to test, <a target='_blank' href='https://sing-box.sagernet.org/configuration/outbound/urltest'>document</a>\"))\r\n\to:depends({ [_n(\"node_add_mode\")] = \"manual\" })\r\n\to.widget = \"checkbox\"\r\n\to.template = appname .. \"/cbi/nodes_multivalue\"\r\n\to.group = {}\r\n\tfor k1, v1 in pairs(node_list) do\r\n\t\tif k1 == \"socks_list\" or k1 == \"normal_list\" then\r\n\t\t\tfor i, v in ipairs(v1) do\r\n\t\t\t\to:value(v.id, v.remark)\r\n\t\t\t\to.group[#o.group+1] = v.group or \"\"\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\n\t-- 读取旧 DynamicList\r\n\tfunction o.cfgvalue(self, section)\r\n\t\treturn m.uci:get_list(appname, section, \"urltest_node\") or {}\r\n\tend\r\n\t-- 写入保持 DynamicList\r\n\tfunction o.custom_write(self, section, value)\r\n\t\tlocal old = m.uci:get_list(appname, section, \"urltest_node\") or {}\r\n\t\tlocal new, set = {}, {}\r\n\t\tfor v in value:gmatch(\"%S+\") do\r\n\t\t\tnew[#new + 1] = v\r\n\t\t\tset[v] = 1\r\n\t\tend\r\n\t\tfor _, v in ipairs(old) do\r\n\t\t\tif not set[v] then\r\n\t\t\t\tm.uci:set_list(appname, section, \"urltest_node\", new)\r\n\t\t\t\treturn\r\n\t\t\tend\r\n\t\t\tset[v] = nil\r\n\t\tend\r\n\t\tfor _ in pairs(set) do\r\n\t\t\tm.uci:set_list(appname, section, \"urltest_node\", new)\r\n\t\t\treturn\r\n\t\tend\r\n\tend\r\n\r\n\to = s:option(MultiValue, _n(\"node_group\"), translate(\"Select Group\"))\r\n\to:depends({ [_n(\"node_add_mode\")] = \"batch\" })\r\n\to.widget = \"checkbox\"\r\n\to:value(\"default\", translate(\"default\"))\r\n\tfor k, v in pairs(groups) do\r\n\t\to:value(api.UrlEncode(k), k)\r\n\tend\r\n\r\n\to = s:option(Value, _n(\"node_match_rule\"), translate(\"Node Matching Rules\"))\r\n\to:depends({ [_n(\"node_add_mode\")] = \"batch\" })\r\n\tlocal descrStr = \"Example: <code>^A && B && !C && D$</code><br>\"\r\n\tdescrStr = descrStr .. \"This means the node remark must start with A (^), include B, exclude C (!), and end with D ($).<br>\"\r\n\tdescrStr = descrStr .. \"Conditions are joined by <code>&&</code>, and their order does not affect the result.\"\r\n\to.description = translate(descrStr) .. string.format(\"<br><font color='red'>%s</font>\",\r\n\t\t\ttranslate(\"Keep the match scope small. Too many nodes can impact router performance.\"))\r\n\r\n\to = s:option(Value, _n(\"urltest_url\"), translate(\"Probe URL\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_urltest\" })\r\n\to:value(\"https://cp.cloudflare.com/\", \"Cloudflare\")\r\n\to:value(\"https://www.gstatic.com/generate_204\", \"Gstatic\")\r\n\to:value(\"https://www.google.com/generate_204\", \"Google\")\r\n\to:value(\"https://www.youtube.com/generate_204\", \"YouTube\")\r\n\to:value(\"https://connect.rom.miui.com/generate_204\", \"MIUI (CN)\")\r\n\to:value(\"https://connectivitycheck.platform.hicloud.com/generate_204\", \"HiCloud (CN)\")\r\n\to.default = o.keylist[3]\r\n\to.description = translate(\"The URL used to detect the connection status.\")\r\n\r\n\to = s:option(Value, _n(\"urltest_interval\"), translate(\"Test interval\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_urltest\" })\r\n\to.default = \"3m\"\r\n\to.placeholder = \"3m\"\r\n\to.description = translate(\"The interval between initiating probes.\") .. \"<br>\" ..\r\n\t\t\ttranslate(\"The time format is numbers + units, such as '10s', '2h45m', and the supported time units are <code>s</code>, <code>m</code>, <code>h</code>, which correspond to seconds, minutes, and hours, respectively.\") .. \"<br>\" ..\r\n\t\t\ttranslate(\"When the unit is not filled in, it defaults to seconds.\") .. \"<br>\" ..\r\n\t\t\ttranslate(\"Test interval must be less or equal than idle timeout.\")\r\n\r\n\to = s:option(Value, _n(\"urltest_tolerance\"), translate(\"Test tolerance\"), translate(\"The test tolerance in milliseconds.\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_urltest\" })\r\n\to.datatype = \"uinteger\"\r\n\to.placeholder = \"50\"\r\n\to.default = \"50\"\r\n\r\n\to = s:option(Value, _n(\"urltest_idle_timeout\"), translate(\"Idle timeout\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_urltest\" })\r\n\to.placeholder = \"30m\"\r\n\to.default = \"30m\"\r\n\to.description = translate(\"The idle timeout.\") .. \"<br>\" ..\r\n\t\t\ttranslate(\"The time format is numbers + units, such as '10s', '2h45m', and the supported time units are <code>s</code>, <code>m</code>, <code>h</code>, which correspond to seconds, minutes, and hours, respectively.\") .. \"<br>\" ..\r\n\t\t\ttranslate(\"When the unit is not filled in, it defaults to seconds.\")\r\n\r\n\to = s:option(Flag, _n(\"urltest_interrupt_exist_connections\"), translate(\"Interrupt existing connections\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_urltest\" })\r\n\to.default = \"0\"\r\n\to.description = translate(\"Interrupt existing connections when the selected outbound has changed.\") \r\nend -- [[ URLTest End ]]\r\n\r\nif load_iface_options then -- [[ 自定义接口 Start ]]\r\n\to = s:option(Value, _n(\"iface\"), translate(\"Interface\"))\r\n\to.default = \"eth1\"\r\n\to:depends({ [_n(\"protocol\")] = \"_iface\" })\r\nend\r\n\r\n\r\nif load_normal_options then\r\n\r\no = s:option(Value, _n(\"address\"), translate(\"Address (Support Domain Name)\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\n\r\no = s:option(Value, _n(\"uuid\"), translate(\"ID\"))\r\no.password = true\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\no = s:option(Value, _n(\"username\"), translate(\"Username\"))\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"ssh\" })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"anytls\" })\r\no:depends({ [_n(\"protocol\")] = \"ssh\" })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\n\r\no = s:option(ListValue, _n(\"security\"), translate(\"Encrypt Method\"))\r\nfor a, t in ipairs(security_list) do o:value(t) end\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\n\r\no = s:option(ListValue, _n(\"ss_method\"), translate(\"Encrypt Method\"))\r\no.rewrite_option = \"method\"\r\nfor a, t in ipairs(ss_method_new_list) do o:value(t) end\r\nfor a, t in ipairs(ss_method_old_list) do o:value(t) end\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(Flag, _n(\"uot\"), translate(\"UDP over TCP\"))\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\n\r\no = s:option(Value, _n(\"alter_id\"), \"Alter ID\")\r\no.datatype = \"uinteger\"\r\no.default = \"0\"\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\n\r\no = s:option(Flag, _n(\"global_padding\"), \"global_padding\", translate(\"Protocol parameter. Will waste traffic randomly if enabled.\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\n\r\no = s:option(Flag, _n(\"authenticated_length\"), \"authenticated_length\", translate(\"Protocol parameter. Enable length block encryption.\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\n\r\no = s:option(ListValue, _n(\"flow\"), translate(\"flow\"))\r\no.default = \"\"\r\no:value(\"\", translate(\"Disable\"))\r\no:value(\"xtls-rprx-vision\")\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"tls\")] = true })\r\n\r\nif singbox_tags:find(\"with_quic\") then\r\n\to = s:option(Value, _n(\"hysteria_hop\"), translate(\"Port hopping range\"))\r\n\to.description = translate(\"Format as 1000:2000 or 1000-2000 Multiple groups are separated by commas (,).\")\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_hop_interval\"), translate(\"Hop Interval(second)\"), translate(\"Example:\") .. \"30 (≥5)\")\r\n\to.datatype = \"uinteger\"\r\n\to.placeholder = \"30\"\r\n\to.default = \"30\"\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_obfs\"), translate(\"Obfs Password\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(ListValue, _n(\"hysteria_auth_type\"), translate(\"Auth Type\"))\r\n\to:value(\"disable\", translate(\"Disable\"))\r\n\to:value(\"string\", translate(\"STRING\"))\r\n\to:value(\"base64\", translate(\"BASE64\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_auth_password\"), translate(\"Auth Password\"))\r\n\to.password = true\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\", [_n(\"hysteria_auth_type\")] = \"string\"})\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\", [_n(\"hysteria_auth_type\")] = \"base64\"})\r\n\r\n\to = s:option(Value, _n(\"hysteria_up_mbps\"), translate(\"Max upload Mbps\"))\r\n\to.default = \"10\"\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_down_mbps\"), translate(\"Max download Mbps\"))\r\n\to.default = \"50\"\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_recv_window_conn\"), translate(\"QUIC stream receive window\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_recv_window\"), translate(\"QUIC connection receive window\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Flag, _n(\"hysteria_disable_mtu_discovery\"), translate(\"Disable MTU detection\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\nend\r\n\r\nif singbox_tags:find(\"with_quic\") then\r\n\to = s:option(ListValue, _n(\"tuic_congestion_control\"), translate(\"Congestion control algorithm\"))\r\n\to.default = \"cubic\"\r\n\to:value(\"bbr\", translate(\"BBR\"))\r\n\to:value(\"cubic\", translate(\"CUBIC\"))\r\n\to:value(\"new_reno\", translate(\"New Reno\"))\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\n\to = s:option(ListValue, _n(\"tuic_udp_relay_mode\"), translate(\"UDP relay mode\"))\r\n\to.default = \"native\"\r\n\to:value(\"native\", translate(\"native\"))\r\n\to:value(\"quic\", translate(\"QUIC\"))\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\n\t--[[\r\n\to = s:option(Flag, _n(\"tuic_udp_over_stream\"), translate(\"UDP over stream\"))\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\t]]--\r\n\r\n\to = s:option(Flag, _n(\"tuic_zero_rtt_handshake\"), translate(\"Enable 0-RTT QUIC handshake\"))\r\n\to.default = 0\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\n\to = s:option(Value, _n(\"tuic_heartbeat\"), translate(\"Heartbeat interval(second)\"))\r\n\to.datatype = \"uinteger\"\r\n\to.default = \"3\"\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\n\to = s:option(ListValue, _n(\"tuic_alpn\"), translate(\"QUIC TLS ALPN\"))\r\n\to.default = \"default\"\r\n\to:value(\"default\", translate(\"Default\"))\r\n\to:value(\"h3\")\r\n\to:value(\"h2\")\r\n\to:value(\"h3,h2\")\r\n\to:value(\"http/1.1\")\r\n\to:value(\"h2,http/1.1\")\r\n\to:value(\"h3,h2,http/1.1\")\r\n\to:value(\"spdy/3.1\")\r\n\to:value(\"h3,spdy/3.1\")\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\nend\r\n\r\nif singbox_tags:find(\"with_quic\") then\r\n\to = s:option(Value, _n(\"hysteria2_hop\"), translate(\"Port hopping range\"))\r\n\to.description = translate(\"Format as 1000:2000 or 1000-2000 Multiple groups are separated by commas (,).\")\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria2_hop_interval\"), translate(\"Hop Interval(Second)\"), translate(\"Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5.\"))\r\n\to.datatype = \"or(uinteger,portrange)\"\r\n\to.placeholder = \"30\"\r\n\to.default = \"30\"\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria2_up_mbps\"), translate(\"Max upload Mbps\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria2_down_mbps\"), translate(\"Max download Mbps\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\n\to = s:option(ListValue, _n(\"hysteria2_obfs_type\"), translate(\"Obfs Type\"))\r\n\to:value(\"\", translate(\"Disable\"))\r\n\to:value(\"salamander\")\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria2_obfs_password\"), translate(\"Obfs Password\"))\r\n\to:depends({ [_n(\"hysteria2_obfs_type\")] = \"salamander\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria2_auth_password\"), translate(\"Auth Password\"))\r\n\to.password = true\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\nend\r\n\r\n-- [[ SSH config start ]] --\r\no = s:option(TextValue, _n(\"ssh_priv_key\"), translate(\"Private Key\"))\r\no.rows = 5\r\no.wrap = \"off\"\r\no:depends({ [_n(\"protocol\")] = \"ssh\" })\r\no.validate = function(self, value)\r\n\tvalue = api.trim(value):gsub(\"\\r\\n\", \"\\n\"):gsub(\"[ \\t]*\\n[ \\t]*\", \"\\n\"):gsub(\"\\n+\", \"\\n\")\r\n\treturn value\r\nend\r\n\r\no = s:option(Value, _n(\"ssh_priv_key_pp\"), translate(\"Private Key Passphrase\"))\r\no.password = true\r\no:depends({ [_n(\"protocol\")] = \"ssh\" })\r\n\r\no = s:option(DynamicList, _n(\"ssh_host_key\"), translate(\"Host Key\"), translate(\"Accept any if empty.\"))\r\no:depends({ [_n(\"protocol\")] = \"ssh\" })\r\n\r\no = s:option(DynamicList, _n(\"ssh_host_key_algo\"), translate(\"Host Key Algorithms\"))\r\no:depends({ [_n(\"protocol\")] = \"ssh\" })\r\n\r\no = s:option(Value, _n(\"ssh_client_version\"), translate(\"Client Version\"), translate(\"Random version will be used if empty.\"))\r\no:depends({ [_n(\"protocol\")] = \"ssh\" })\r\n-- [[ SSH config end ]] --\r\n\r\n-- [[ naive start ]] --\r\no = s:option(Value, _n(\"naive_insecure_concurrency\"), translate(\"Concurrent Tunnels\"))\r\no.datatype = \"uinteger\"\r\no.placeholder = \"0\"\r\no.default = \"0\"\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\n\r\no = s:option(Flag, _n(\"naive_quic\"), translate(\"QUIC\"))\r\no.default = 0\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\n\r\no = s:option(ListValue, _n(\"naive_congestion_control\"), translate(\"Congestion control algorithm\"))\r\no.default = \"bbr\"\r\no:value(\"bbr\", translate(\"BBR\"))\r\no:value(\"bbr2\", translate(\"BBRv2\"))\r\no:value(\"cubic\", translate(\"CUBIC\"))\r\no:value(\"reno\", translate(\"New Reno\"))\r\no:depends({ [_n(\"naive_quic\")] = \"1\" })\r\n-- [[ naive end ]] --\r\n\r\no = s:option(Flag, _n(\"tls\"), translate(\"TLS\"))\r\no.default = 0\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"anytls\" })\r\n\r\no = s:option(ListValue, _n(\"alpn\"), translate(\"ALPN\"))\r\no.default = \"default\"\r\no:value(\"default\", translate(\"Default\"))\r\no:value(\"h3\")\r\no:value(\"h2\")\r\no:value(\"h3,h2\")\r\no:value(\"http/1.1\")\r\no:value(\"h2,http/1.1\")\r\no:value(\"h3,h2,http/1.1\")\r\no:depends({ [_n(\"tls\")] = true })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\no = s:option(Flag, _n(\"tls_disable_sni\"), translate(\"Disable SNI\"), translate(\"Do not send server name in ClientHello.\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"tls\")] = true })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\"})\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(Value, _n(\"tls_serverName\"), \"SNI \" .. translate(\"Domain\"))\r\no:depends({ [_n(\"tls\")] = true })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\"})\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\n\r\no = s:option(Flag, _n(\"tls_allowInsecure\"), translate(\"allowInsecure\"), translate(\"Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"tls\")] = true })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\"})\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(Flag, _n(\"ech\"), translate(\"ECH\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"flow\")] = \"\", [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\n\r\no = s:option(TextValue, _n(\"ech_config\"), translate(\"ECH Config\"))\r\no.default = \"\"\r\no.rows = 5\r\no.wrap = \"off\"\r\no:depends({ [_n(\"ech\")] = true })\r\no.validate = function(self, value)\r\n\tvalue = api.trim(value):gsub(\"\\r\\n\", \"\\n\"):gsub(\"[ \\t]*\\n[ \\t]*\", \"\\n\"):gsub(\"\\n+\", \"\\n\")\r\n\treturn value\r\nend\r\n\r\no = s:option(Value, _n(\"ech_query_server_name\"), translate(\"ECH Query Domain\"), translate(\"Overrides the domain name used for ECH HTTPS record queries.\"))\r\no:depends({ [_n(\"ech\")] = true })\r\n\r\nif singbox_tags:find(\"with_utls\") then\r\n\to = s:option(Flag, _n(\"utls\"), translate(\"uTLS\"))\r\n\to.default = \"0\"\r\n\to:depends({ [_n(\"tls\")] = true })\r\n\r\n\to = s:option(ListValue, _n(\"fingerprint\"), translate(\"Finger Print\"))\r\n\to:value(\"chrome\")\r\n\to:value(\"firefox\")\r\n\to:value(\"edge\")\r\n\to:value(\"safari\")\r\n\to:value(\"360\")\r\n\to:value(\"qq\")\r\n\to:value(\"ios\")\r\n\to:value(\"android\")\r\n\to:value(\"random\")\r\n\to:value(\"randomized\")\r\n\to.default = \"chrome\"\r\n\to:depends({ [_n(\"utls\")] = true })\r\n\r\n\t-- [[ REALITY部分 ]] --\r\n\to = s:option(Flag, _n(\"reality\"), translate(\"REALITY\"))\r\n\to.default = 0\r\n\to:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"vmess\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"shadowsocks\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"socks\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"trojan\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"anytls\", [_n(\"tls\")] = true })\r\n\t\r\n\to = s:option(Value, _n(\"reality_publicKey\"), translate(\"Public Key\"))\r\n\to:depends({ [_n(\"reality\")] = true })\r\n\t\r\n\to = s:option(Value, _n(\"reality_shortId\"), translate(\"Short Id\"))\r\n\to:depends({ [_n(\"reality\")] = true })\r\nend\r\n\r\no = s:option(ListValue, _n(\"transport\"), translate(\"Transport\"))\r\no:value(\"tcp\", \"TCP\")\r\no:value(\"http\", \"HTTP\")\r\no:value(\"ws\", \"WebSocket\")\r\no:value(\"httpupgrade\", \"HTTPUpgrade\")\r\nif singbox_tags:find(\"with_quic\") then\r\n\to:value(\"quic\", \"QUIC\")\r\nend\r\nif singbox_tags:find(\"with_grpc\") then\r\n\to:value(\"grpc\", \"gRPC\")\r\nelse o:value(\"grpc\", \"gRPC-lite\")\r\nend\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\nif singbox_tags:find(\"with_wireguard\") then\r\n\to = s:option(Value, _n(\"wireguard_public_key\"), translate(\"Public Key\"))\r\n\to:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\n\to = s:option(Value, _n(\"wireguard_secret_key\"), translate(\"Private Key\"))\r\n\to:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\n\to = s:option(Value, _n(\"wireguard_preSharedKey\"), translate(\"Pre shared key\"))\r\n\to:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\n\to = s:option(DynamicList, _n(\"wireguard_local_address\"), translate(\"Local Address\"))\r\n\to:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\n\to = s:option(Value, _n(\"wireguard_mtu\"), translate(\"MTU\"))\r\n\to.default = \"1420\"\r\n\to:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\n\to = s:option(Value, _n(\"wireguard_reserved\"), translate(\"Reserved\"), translate(\"Decimal numbers separated by \\\",\\\" or Base64-encoded strings.\"))\r\n\to:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\nend\r\n\r\n-- [[ TCP部分（模拟） ]]--\r\no = s:option(ListValue, _n(\"tcp_guise\"), translate(\"Camouflage Type\"))\r\no:value(\"none\", \"none\")\r\no:value(\"http\", \"http\")\r\no:depends({ [_n(\"transport\")] = \"tcp\" })\r\n\r\no = s:option(DynamicList, _n(\"tcp_guise_http_host\"), translate(\"HTTP Host\"))\r\no:depends({ [_n(\"tcp_guise\")] = \"http\" })\r\n\r\no = s:option(DynamicList, _n(\"tcp_guise_http_path\"), translate(\"HTTP Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"tcp_guise\")] = \"http\" })\r\n\r\n-- [[ HTTP部分 ]]--\r\no = s:option(DynamicList, _n(\"http_host\"), translate(\"HTTP Host\"))\r\no:depends({ [_n(\"transport\")] = \"http\" })\r\n\r\no = s:option(Value, _n(\"http_path\"), translate(\"HTTP Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"transport\")] = \"http\" })\r\n\r\no = s:option(Flag, _n(\"http_h2_health_check\"), translate(\"Health check\"))\r\no:depends({ [_n(\"tls\")] = true, [_n(\"transport\")] = \"http\" })\r\n\r\no = s:option(Value, _n(\"http_h2_read_idle_timeout\"), translate(\"Idle timeout\"))\r\no.default = \"10\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"transport\")] = \"http\", [_n(\"http_h2_health_check\")] = true })\r\n\r\no = s:option(Value, _n(\"http_h2_health_check_timeout\"), translate(\"Health check timeout\"))\r\no.default = \"15\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"transport\")] = \"http\", [_n(\"http_h2_health_check\")] = true })\r\n\r\n-- [[ WebSocket部分 ]]--\r\no = s:option(Value, _n(\"ws_host\"), translate(\"WebSocket Host\"))\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\no = s:option(Value, _n(\"ws_path\"), translate(\"WebSocket Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\no = s:option(Flag, _n(\"ws_enableEarlyData\"), translate(\"Enable early data\"))\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\no = s:option(Value, _n(\"ws_maxEarlyData\"), translate(\"Early data length\"))\r\no.default = \"1024\"\r\no:depends({ [_n(\"ws_enableEarlyData\")] = true })\r\n\r\no = s:option(Value, _n(\"ws_earlyDataHeaderName\"), translate(\"Early data header name\"), translate(\"Recommended value: Sec-WebSocket-Protocol\"))\r\no:depends({ [_n(\"ws_enableEarlyData\")] = true })\r\n\r\n-- [[ HTTPUpgrade部分 ]]--\r\no = s:option(Value, _n(\"httpupgrade_host\"), translate(\"HTTPUpgrade Host\"))\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\n\r\no = s:option(Value, _n(\"httpupgrade_path\"), translate(\"HTTPUpgrade Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\n\r\n-- [[ gRPC部分 ]]--\r\no = s:option(Value, _n(\"grpc_serviceName\"), \"ServiceName\")\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\no = s:option(Flag, _n(\"grpc_health_check\"), translate(\"Health check\"))\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\no = s:option(Value, _n(\"grpc_idle_timeout\"), translate(\"Idle timeout\"))\r\no.default = \"10\"\r\no:depends({ [_n(\"grpc_health_check\")] = true })\r\n\r\no = s:option(Value, _n(\"grpc_health_check_timeout\"), translate(\"Health check timeout\"))\r\no.default = \"20\"\r\no:depends({ [_n(\"grpc_health_check\")] = true })\r\n\r\no = s:option(Flag, _n(\"grpc_permit_without_stream\"), translate(\"Permit without stream\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"grpc_health_check\")] = true })\r\n\r\n-- [[ User-Agent ]]--\r\no = s:option(Value, _n(\"user_agent\"), translate(\"User-Agent\"))\r\no.default = \"\"\r\no:value(\"\", translate(\"default\"))\r\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36\", \"chrome\")\r\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0\", \"firefox\")\r\no:value(\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15\", \"safari\")\r\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.70\", \"edge\")\r\no:value(\"Go-http-client/1.1\", \"golang\")\r\no:value(\"curl/7.68.0\", \"curl\")\r\no:depends({ [_n(\"tcp_guise\")] = \"http\" })\r\no:depends({ [_n(\"transport\")] = \"http\" })\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\n\r\n-- [[ Mux ]]--\r\no = s:option(Flag, _n(\"mux\"), translate(\"Mux\"))\r\no.rmempty = false\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"flow\")] = \"\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\", [_n(\"uot\")] = \"\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\no = s:option(ListValue, _n(\"mux_type\"), translate(\"Mux\"))\r\no:value(\"smux\")\r\no:value(\"yamux\")\r\no:value(\"h2mux\")\r\no:depends({ [_n(\"mux\")] = true })\r\n\r\no = s:option(Value, _n(\"mux_concurrency\"), translate(\"Mux concurrency\"))\r\no.default = 4\r\no:depends({ [_n(\"mux\")] = true, [_n(\"tcpbrutal\")] = false })\r\n\r\no = s:option(Flag, _n(\"mux_padding\"), translate(\"Padding\"))\r\no.default = 0\r\no:depends({ [_n(\"mux\")] = true })\r\n\r\n-- [[ TCP Brutal ]]--\r\no = s:option(Flag, _n(\"tcpbrutal\"), translate(\"TCP Brutal\"))\r\no.default = 0\r\no:depends({ [_n(\"mux\")] = true })\r\n\r\no = s:option(Value, _n(\"tcpbrutal_up_mbps\"), translate(\"Max upload Mbps\"))\r\no.default = \"10\"\r\no:depends({ [_n(\"tcpbrutal\")] = true })\r\n\r\no = s:option(Value, _n(\"tcpbrutal_down_mbps\"), translate(\"Max download Mbps\"))\r\no.default = \"50\"\r\no:depends({ [_n(\"tcpbrutal\")] = true })\r\n\r\no = s:option(Flag, _n(\"shadowtls\"), \"ShadowTLS\")\r\no.default = 0\r\no:depends({ [_n(\"protocol\")] = \"vmess\", [_n(\"tls\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\", [_n(\"tls\")] = false })\r\n\r\no = s:option(ListValue, _n(\"shadowtls_version\"), \"ShadowTLS \" .. translate(\"Version\"))\r\no.default = \"1\"\r\no:value(\"1\", \"ShadowTLS v1\")\r\no:value(\"2\", \"ShadowTLS v2\")\r\no:value(\"3\", \"ShadowTLS v3\")\r\no:depends({ [_n(\"shadowtls\")] = true })\r\n\r\no = s:option(Value, _n(\"shadowtls_password\"), \"ShadowTLS \" .. translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"shadowtls\")] = true, [_n(\"shadowtls_version\")] = \"2\" })\r\no:depends({ [_n(\"shadowtls\")] = true, [_n(\"shadowtls_version\")] = \"3\" })\r\n\r\no = s:option(Value, _n(\"shadowtls_serverName\"), \"ShadowTLS \" .. translate(\"Domain\"))\r\no:depends({ [_n(\"shadowtls\")] = true })\r\n\r\nif singbox_tags:find(\"with_utls\") then\r\n\to = s:option(Flag, _n(\"shadowtls_utls\"), \"ShadowTLS \" .. translate(\"uTLS\"))\r\n\to.default = \"0\"\r\n\to:depends({ [_n(\"shadowtls\")] = true })\r\n\r\n\to = s:option(ListValue, _n(\"shadowtls_fingerprint\"), \"ShadowTLS \" .. translate(\"Finger Print\"))\r\n\to:value(\"chrome\")\r\n\to:value(\"firefox\")\r\n\to:value(\"edge\")\r\n\to:value(\"safari\")\r\n\t-- o:value(\"360\")\r\n\to:value(\"qq\")\r\n\to:value(\"ios\")\r\n\t-- o:value(\"android\")\r\n\to:value(\"random\")\r\n\t-- o:value(\"randomized\")\r\n\to.default = \"chrome\"\r\n\to:depends({ [_n(\"shadowtls\")] = true, [_n(\"shadowtls_utls\")] = true })\r\nend\r\n\r\n-- [[ SIP003 plugin ]]--\r\no = s:option(Flag, _n(\"plugin_enabled\"), translate(\"plugin\"))\r\no.default = 0\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(ListValue, _n(\"plugin\"), \"SIP003 \" .. translate(\"plugin\"))\r\no.default = \"obfs-local\"\r\no:depends({ [_n(\"plugin_enabled\")] = true })\r\no:value(\"obfs-local\")\r\no:value(\"v2ray-plugin\")\r\n\r\no = s:option(Value, _n(\"plugin_opts\"), translate(\"opts\"))\r\no:depends({ [_n(\"plugin_enabled\")] = true })\r\n\r\no = s:option(ListValue, _n(\"domain_resolver\"), translate(\"Domain DNS Resolve\"))\r\no.description = translate(\"If the node address is a domain name, this DNS will be used for resolution.\") .. \"<br>\" .. string.format('<font color=\"red\">%s</font>',\r\n\t\ttranslate(\"Note: For node-specific DNS only. Keep Auto to avoid extra overhead.\"))\r\no:value(\"\", translate(\"Auto\"))\r\no:value(\"tcp\", \"TCP\")\r\no:value(\"udp\", \"UDP\")\r\no:value(\"https\", \"DoH\")\r\n\r\no = s:option(Value, _n(\"domain_resolver_dns\"), \"DNS\")\r\no.datatype = \"or(ipaddr,ipaddrport)\"\r\no:value(\"114.114.114.114\")\r\no:value(\"223.5.5.5:53\")\r\no.default = o.keylist[1]\r\no:depends({ [_n(\"domain_resolver\")] = \"tcp\" })\r\no:depends({ [_n(\"domain_resolver\")] = \"udp\" })\r\n\r\no = s:option(Value, _n(\"domain_resolver_dns_https\"), \"DNS\")\r\no:value(\"https://120.53.53.53/dns-query\", \"DNSPod\")\r\no:value(\"https://223.5.5.5/dns-query\", \"AliDNS\")\r\no.default = o.keylist[1]\r\no:depends({ [_n(\"domain_resolver\")] = \"https\" })\r\n\r\no = s:option(ListValue, _n(\"domain_strategy\"), translate(\"Domain Strategy\"), translate(\"If is domain name, The requested domain name will be resolved to IP before connect.\"))\r\no.default = \"\"\r\no:value(\"\", translate(\"Auto\"))\r\no:value(\"prefer_ipv4\", translate(\"Prefer IPv4\"))\r\no:value(\"prefer_ipv6\", translate(\"Prefer IPv6\"))\r\no:value(\"ipv4_only\", translate(\"IPv4 Only\"))\r\no:value(\"ipv6_only\", translate(\"IPv6 Only\"))\r\n\r\n\r\nlocal protocols = s.fields[_n(\"protocol\")].keylist\r\nif #protocols > 0 then\r\n\tfor i, v in ipairs(protocols) do\r\n\t\tif not v:find(\"^_\") then\r\n\t\t\ts.fields[_n(\"address\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\t\ts.fields[_n(\"port\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\t\ts.fields[_n(\"domain_resolver\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\t\ts.fields[_n(\"domain_strategy\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\tend\r\n\tend\r\nend\r\nend\r\n-- [[ Normal single node End ]]\r\n\r\nif not load_shunt_options then\r\n\to = s:option(ListValue, _n(\"chain_proxy\"), translate(\"Chain Proxy\"))\r\n\to:value(\"\", translate(\"Close(Not use)\"))\r\n\tif not (load_iface_options or load_urltest_options) then\r\n\t\t-- Special node cannot be use pre-proxy.\r\n\t\to:value(\"1\", translate(\"Preproxy Node\"))\r\n\tend\r\n\to:value(\"2\", translate(\"Landing Node\"))\r\n\r\n\to1 = s:option(ListValue, _n(\"preproxy_node\"), translate(\"Preproxy Node\"), translate(\"Only support a layer of proxy.\"))\r\n\to1:depends({ [_n(\"chain_proxy\")] = \"1\" })\r\n\to1.template = appname .. \"/cbi/nodes_listvalue\"\r\n\to1.group = {}\r\n\r\n\to2 = s:option(ListValue, _n(\"to_node\"), translate(\"Landing Node\"), translate(\"Only support a layer of proxy.\"))\r\n\to2:depends({ [_n(\"chain_proxy\")] = \"2\" })\r\n\to2.template = appname .. \"/cbi/nodes_listvalue\"\r\n\to2.group = {}\r\n\r\n\tfor k1, v1 in pairs(node_list) do\r\n\t\tif k1 ~= \"shunt_list\" and k1 ~= \"iface_list\" then\r\n\t\t\tfor i, v in ipairs(v1) do\r\n\t\t\t\tif v.id ~= arg[1] then\r\n\t\t\t\t\to1:value(v.id, v.remark)\r\n\t\t\t\t\to1.group[#o1.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\r\n\t\t\t\t\tif k1 == \"normal_list\" then\r\n\t\t\t\t\t\t-- Landing Node not support use special node.\r\n\t\t\t\t\t\to2:value(v.id, v.remark)\r\n\t\t\t\t\t\to2.group[#o2.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\r\n\t\t\t\t\tend\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\nend\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n\r\nif load_shunt_options then\r\n\tlocal current_node = m.uci:get_all(appname, arg[1]) or {}\r\n\tlocal shunt_lua = loadfile(\"/usr/lib/lua/luci/model/cbi/passwall/client/include/shunt_options.lua\")\r\n\tsetfenv(shunt_lua, getfenv(1))(m, s, {\r\n\t\tnode_id = arg[1],\r\n\t\tnode = current_node,\r\n\t\tnode_list = node_list,\r\n\t})\r\nend\r\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/type/ss-rust.lua",
    "content": "local m, s = ...\r\n\r\nif not api.is_finded(\"sslocal\") then\r\n\treturn\r\nend\r\n\r\ntype_name = \"SS-Rust\"\r\n\r\n-- [[ Shadowsocks Rust ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"Shadowsocks Rust\")\r\n\r\nif s.val[\"type\"] ~= type_name then\r\n\treturn\r\nend\r\n\r\nlocal option_prefix = \"ssrust_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal ssrust_encrypt_method_list = {\r\n\t\"none\", \"plain\",\r\n\t\"aes-128-gcm\", \"aes-256-gcm\", \"chacha20-ietf-poly1305\",\r\n\t\"2022-blake3-aes-128-gcm\", \"2022-blake3-aes-256-gcm\", \"2022-blake3-chacha20-poly1305\"\r\n}\r\n\r\no = s:option(ListValue, _n(\"del_protocol\")) --始终隐藏，用于删除 protocol\r\no:depends({ [_n(\"__hide\")] = \"1\" })\r\no.rewrite_option = \"protocol\"\r\n\r\no = s:option(Value, _n(\"address\"), translate(\"Address (Support Domain Name)\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\n\r\no = s:option(Value, _n(\"method\"), translate(\"Encrypt Method\"))\r\nfor a, t in ipairs(ssrust_encrypt_method_list) do o:value(t) end\r\n\r\no = s:option(Value, _n(\"timeout\"), translate(\"Connection Timeout\"))\r\no.datatype = \"uinteger\"\r\no.default = 300\r\n\r\no = s:option(Flag, _n(\"tcp_fast_open\"), \"TCP \" .. translate(\"Fast Open\"), translate(\"Need node support required\"))\r\no.default = 0\r\n\r\no = s:option(Flag, _n(\"plugin_enabled\"), translate(\"plugin\"))\r\no.default = 0\r\n\r\no = s:option(Value, _n(\"plugin\"), \"SIP003 \" .. translate(\"plugin\"), translate(\"Supports custom SIP003 plugins, Make sure the plugin is installed.\"))\r\no.default = \"none\"\r\no:value(\"none\", translate(\"none\"))\r\nif api.is_finded(\"xray-plugin\") then o:value(\"xray-plugin\") end\r\nif api.is_finded(\"v2ray-plugin\") then o:value(\"v2ray-plugin\") end\r\nif api.is_finded(\"obfs-local\") then o:value(\"obfs-local\") end\r\nif api.is_finded(\"shadow-tls\") then o:value(\"shadow-tls\") end\r\no:depends({ [_n(\"plugin_enabled\")] = true })\r\no.validate = function(self, value, t)\r\n\tif value and value ~= \"\" and value ~= \"none\" then\r\n\t\tif not api.is_finded(value) then\r\n\t\t\treturn nil, value .. \": \" .. translate(\"Can't find this file!\")\r\n\t\telse\r\n\t\t\treturn value\r\n\t\tend\r\n\tend\r\n\treturn nil\r\nend\r\n\r\no = s:option(Value, _n(\"plugin_opts\"), translate(\"opts\"))\r\no:depends({ [_n(\"plugin_enabled\")] = true })\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/type/ss.lua",
    "content": "local m, s = ...\r\n\r\nif not api.is_finded(\"ss-local\") and not api.is_finded(\"ss-redir\") then\r\n\treturn\r\nend\r\n\r\ntype_name = \"SS\"\r\n\r\n-- [[ Shadowsocks Libev ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"Shadowsocks Libev\")\r\n\r\nif s.val[\"type\"] ~= type_name then\r\n\treturn\r\nend\r\n\r\nlocal option_prefix = \"ss_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal ss_encrypt_method_list = {\r\n\t\"rc4-md5\", \"aes-128-cfb\", \"aes-192-cfb\", \"aes-256-cfb\", \"aes-128-ctr\",\r\n\t\"aes-192-ctr\", \"aes-256-ctr\", \"bf-cfb\", \"salsa20\", \"chacha20\", \"chacha20-ietf\",\r\n\t\"aes-128-gcm\", \"aes-192-gcm\", \"aes-256-gcm\", \"chacha20-ietf-poly1305\",\r\n\t\"xchacha20-ietf-poly1305\"\r\n}\r\n\r\no = s:option(ListValue, _n(\"del_protocol\")) --始终隐藏，用于删除 protocol\r\no:depends({ [_n(\"__hide\")] = \"1\" })\r\no.rewrite_option = \"protocol\"\r\n\r\no = s:option(Value, _n(\"address\"), translate(\"Address (Support Domain Name)\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\n\r\no = s:option(Value, _n(\"method\"), translate(\"Encrypt Method\"))\r\nfor a, t in ipairs(ss_encrypt_method_list) do o:value(t) end\r\n\r\no = s:option(Value, _n(\"timeout\"), translate(\"Connection Timeout\"))\r\no.datatype = \"uinteger\"\r\no.default = 300\r\n\r\no = s:option(Flag, _n(\"tcp_fast_open\"), \"TCP \" .. translate(\"Fast Open\"), translate(\"Need node support required\"))\r\no.default = 0\r\n\r\no = s:option(Flag, _n(\"plugin_enabled\"), translate(\"plugin\"))\r\no.default = 0\r\n\r\no = s:option(ListValue, _n(\"plugin\"), \"SIP003 \" .. translate(\"plugin\"))\r\no.default = \"none\"\r\no:value(\"none\", translate(\"none\"))\r\nif api.is_finded(\"xray-plugin\") then o:value(\"xray-plugin\") end\r\nif api.is_finded(\"v2ray-plugin\") then o:value(\"v2ray-plugin\") end\r\nif api.is_finded(\"obfs-local\") then o:value(\"obfs-local\") end\r\no:depends({ [_n(\"plugin_enabled\")] = true })\r\n\r\no = s:option(Value, _n(\"plugin_opts\"), translate(\"opts\"))\r\no:depends({ [_n(\"plugin_enabled\")] = true })\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/client/type/ssr.lua",
    "content": "local m, s = ...\r\n\r\nif not api.is_finded(\"ssr-local\") and not api.is_finded(\"ssr-redir\")then\r\n\treturn\r\nend\r\n\r\ntype_name = \"SSR\"\r\n\r\n-- [[ ShadowsocksR Libev ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"ShadowsocksR Libev\")\r\n\r\nif s.val[\"type\"] ~= type_name then\r\n\treturn\r\nend\r\n\r\nlocal option_prefix = \"ssr_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal ssr_encrypt_method_list = {\r\n\t\"none\", \"table\", \"rc2-cfb\", \"rc4\", \"rc4-md5\", \"rc4-md5-6\", \"aes-128-cfb\",\r\n\t\"aes-192-cfb\", \"aes-256-cfb\", \"aes-128-ctr\", \"aes-192-ctr\", \"aes-256-ctr\",\r\n\t\"bf-cfb\", \"camellia-128-cfb\", \"camellia-192-cfb\", \"camellia-256-cfb\",\r\n\t\"cast5-cfb\", \"des-cfb\", \"idea-cfb\", \"seed-cfb\", \"salsa20\", \"chacha20\",\r\n\t\"chacha20-ietf\"\r\n}\r\n\r\nlocal ssr_protocol_list = {\r\n\t\"origin\", \"verify_simple\", \"verify_deflate\", \"verify_sha1\", \"auth_simple\",\r\n\t\"auth_sha1\", \"auth_sha1_v2\", \"auth_sha1_v4\", \"auth_aes128_md5\",\r\n\t\"auth_aes128_sha1\", \"auth_chain_a\", \"auth_chain_b\", \"auth_chain_c\",\r\n\t\"auth_chain_d\", \"auth_chain_e\", \"auth_chain_f\"\r\n}\r\nlocal ssr_obfs_list = {\r\n\t\"plain\", \"http_simple\", \"http_post\", \"random_head\", \"tls_simple\",\r\n\t\"tls1.0_session_auth\", \"tls1.2_ticket_auth\"\r\n}\r\n\r\no = s:option(Value, _n(\"address\"), translate(\"Address (Support Domain Name)\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\n\r\no = s:option(ListValue, _n(\"method\"), translate(\"Encrypt Method\"))\r\nfor a, t in ipairs(ssr_encrypt_method_list) do o:value(t) end\r\n\r\no = s:option(ListValue, _n(\"protocol\"), translate(\"Protocol\"))\r\nfor a, t in ipairs(ssr_protocol_list) do o:value(t) end\r\n\r\no = s:option(Value, _n(\"protocol_param\"), translate(\"Protocol_param\"))\r\n\r\no = s:option(ListValue, _n(\"obfs\"), translate(\"Obfs\"))\r\nfor a, t in ipairs(ssr_obfs_list) do o:value(t) end\r\n\r\no = s:option(Value, _n(\"obfs_param\"), translate(\"Obfs_param\"))\r\n\r\no = s:option(Value, _n(\"timeout\"), translate(\"Connection Timeout\"))\r\no.datatype = \"uinteger\"\r\no.default = 300\r\n\r\no = s:option(Flag, _n(\"tcp_fast_open\"), \"TCP \" .. translate(\"Fast Open\"), translate(\"Need node support required\"))\r\no.default = 0\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/server/index.lua",
    "content": "local api = require \"luci.passwall.api\"\n\nm = Map(\"passwall_server\", translate(\"Server-Side\"))\napi.set_apply_on_parse(m)\n\nt = m:section(NamedSection, \"global\", \"global\")\nt.anonymous = true\nt.addremove = false\n\ne = t:option(Flag, \"enable\", translate(\"Enable\"))\ne.rmempty = false\n\nt = m:section(TypedSection, \"user\", translate(\"Users Manager\"))\nt.anonymous = true\nt.addremove = true\nt.sortable = true\nt.template = \"cbi/tblsection\"\nt.extedit = api.url(\"server_user\", \"%s\")\nfunction t.create(e, t)\n\tlocal uuid = api.gen_uuid()\n\tt = uuid\n\tTypedSection.create(e, t)\n\tluci.http.redirect(e.extedit:format(t))\nend\nfunction t.remove(e, t)\n\te.map.proceed = true\n\te.map:del(t)\n\tluci.http.redirect(api.url(\"server\"))\nend\n\ne = t:option(Flag, \"enable\", translate(\"Enable\"))\ne.width = \"5%\"\ne.rmempty = false\n\ne = t:option(DummyValue, \"status\", translate(\"Status\"))\ne.rawhtml = true\ne.cfgvalue = function(t, n)\n\treturn string.format('<font class=\"_users_status\">%s</font>', translate(\"Collecting data...\"))\nend\n\ne = t:option(DummyValue, \"remarks\", translate(\"Remarks\"))\ne.width = \"15%\"\n\ne = t:option(DummyValue, \"type\", translate(\"Type\"))\ne.width = \"20%\"\ne.rawhtml = true\ne.cfgvalue = function(t, n)\n\tlocal str = \"\"\n\tlocal type = m:get(n, \"type\") or \"\"\n\tif type == \"sing-box\" or type == \"Xray\" then\n\t\tlocal protocol = m:get(n, \"protocol\") or \"\"\n\t\tif protocol == \"vmess\" then\n\t\t\tprotocol = \"VMess\"\n\t\telseif protocol == \"vless\" then\n\t\t\tprotocol = \"VLESS\"\n\t\telseif protocol == \"shadowsocks\" then\n\t\t\tprotocol = \"SS\"\n\t\telseif protocol == \"shadowsocksr\" then\n\t\t\tprotocol = \"SSR\"\n\t\telseif protocol == \"wireguard\" then\n\t\t\tprotocol = \"WG\"\n\t\telseif protocol == \"hysteria\" then\n\t\t\tprotocol = \"HY\"\n\t\telseif protocol == \"hysteria2\" then\n\t\t\tprotocol = \"HY2\"\n\t\telseif protocol == \"anytls\" then\n\t\t\tprotocol = \"AnyTLS\"\n\t\telse\n\t\t\tprotocol = protocol:gsub(\"^%l\",string.upper)\n\t\t\tlocal custom = m:get(n, \"custom\") or \"0\"\n\t\t\tif custom == \"1\" then\n\t\t\t\tprotocol = translate(\"Custom Config\")\n\t\t\tend\n\t\tend\n\t\tif type == \"sing-box\" then type = \"Sing-Box\" end\n\t\ttype = type .. \" \" .. protocol\n\tend\n\tstr = str .. translate(type)\n\treturn str\nend\n\ne = t:option(DummyValue, \"port\", translate(\"Port\"))\n\ne = t:option(Flag, \"log\", translate(\"Log\"))\ne.default = \"1\"\ne.rmempty = false\n\nm:append(Template(\"passwall/server/log\"))\n\nm:append(Template(\"passwall/server/users_list_status\"))\nreturn m\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/server/type/hysteria2.lua",
    "content": "local m, s = ...\r\n\r\nlocal api = require \"luci.passwall.api\"\r\n\r\nif not api.finded_com(\"hysteria\") then\r\n\treturn\r\nend\r\n\r\nlocal fs = api.fs\r\n\r\nlocal type_name = \"Hysteria2\"\r\n\r\nlocal option_prefix = \"hysteria2_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\n-- [[ Hysteria2 ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"Hysteria2\")\r\n\r\no = s:option(Flag, _n(\"custom\"), translate(\"Use Custom Config\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Listen Port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"obfs\"), translate(\"Obfs Password\"))\r\no.rewrite_option = o.option\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"auth_password\"), translate(\"Auth Password\"))\r\no.password = true\r\no.rewrite_option = o.option\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"udp\"), translate(\"UDP\"))\r\no.default = \"1\"\r\no.rewrite_option = o.option\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"up_mbps\"), translate(\"Max upload Mbps\"))\r\no.rewrite_option = o.option\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"down_mbps\"), translate(\"Max download Mbps\"))\r\no.rewrite_option = o.option\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"ignoreClientBandwidth\"), translate(\"ignoreClientBandwidth\"))\r\no.default = \"0\"\r\no.rewrite_option = o.option\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(FileUpload, _n(\"tls_certificateFile\"), translate(\"Public key absolute path\"), translate(\"as:\") .. \"/etc/ssl/fullchain.pem\")\r\no.default = m:get(s.section, \"tls_certificateFile\") or \"/etc/config/ssl/\" .. arg[1] .. \".pem\"\r\nif o and o:formvalue(arg[1]) then o.default = o:formvalue(arg[1]) end\r\no.validate = function(self, value, t)\r\n\tif value and value ~= \"\" then\r\n\t\tif not fs.access(value) then\r\n\t\t\treturn nil, translate(\"Can't find this file!\")\r\n\t\telse\r\n\t\t\treturn value\r\n\t\tend\r\n\tend\r\n\treturn nil\r\nend\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(FileUpload, _n(\"tls_keyFile\"), translate(\"Private key absolute path\"), translate(\"as:\") .. \"/etc/ssl/private.key\")\r\no.default = m:get(s.section, \"tls_keyFile\") or \"/etc/config/ssl/\" .. arg[1] .. \".key\"\r\nif o and o:formvalue(arg[1]) then o.default = o:formvalue(arg[1]) end\r\no.validate = function(self, value, t)\r\n\tif value and value ~= \"\" then\r\n\t\tif not fs.access(value) then\r\n\t\t\treturn nil, translate(\"Can't find this file!\")\r\n\t\telse\r\n\t\t\treturn value\r\n\t\tend\r\n\tend\r\n\treturn nil\r\nend\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(TextValue, _n(\"custom_config\"), translate(\"Custom Config\"))\r\no.rows = 10\r\no.wrap = \"off\"\r\no:depends({ [_n(\"custom\")] = true })\r\no.validate = function(self, value, t)\r\n\tif value and api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, translate(\"Custom Config\") .. \" \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal config_str = m:get(section, \"config_str\")\r\n\tif config_str then\r\n\t\treturn api.base64Decode(config_str)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"config_str\", api.base64Encode(value) or \"\")\r\nend\r\n\r\no = s:option(Flag, _n(\"log\"), translate(\"Log\"))\r\no.default = \"1\"\r\no.rmempty = false\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/server/type/ray.lua",
    "content": "local m, s = ...\r\n\r\nlocal api = require \"luci.passwall.api\"\r\n\r\nif not api.finded_com(\"xray\") then\r\n\treturn\r\nend\r\n\r\nlocal fs = api.fs\r\n\r\nlocal type_name = \"Xray\"\r\n\r\nlocal option_prefix = \"xray_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal x_ss_method_list = {\r\n\t\"none\", \"plain\", \"aes-128-gcm\", \"aes-256-gcm\", \"chacha20-poly1305\", \"xchacha20-poly1305\", \"2022-blake3-aes-128-gcm\", \"2022-blake3-aes-256-gcm\", \"2022-blake3-chacha20-poly1305\"\r\n}\r\n\r\nlocal header_type_list = {\r\n\t\"none\", \"srtp\", \"utp\", \"wechat-video\", \"dtls\", \"wireguard\", \"dns\"\r\n}\r\n\r\n-- [[ Xray ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"Xray\")\r\n\r\no = s:option(Flag, _n(\"custom\"), translate(\"Use Custom Config\"))\r\n\r\no = s:option(ListValue, _n(\"protocol\"), translate(\"Protocol\"))\r\no:value(\"vmess\", \"Vmess\")\r\no:value(\"vless\", \"VLESS\")\r\no:value(\"http\", \"HTTP\")\r\no:value(\"socks\", \"Socks\")\r\no:value(\"shadowsocks\", \"Shadowsocks\")\r\no:value(\"trojan\", \"Trojan\")\r\no:value(\"hysteria2\", translate(\"Hysteria2\"))\r\no:value(\"dokodemo-door\", \"dokodemo-door\")\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Listen Port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"auth\"), translate(\"Auth\"))\r\no.validate = function(self, value, t)\r\n\tif value and value == \"1\" then\r\n\t\tlocal user_v = s.fields[_n(\"username\")] and s.fields[_n(\"username\")]:formvalue(t) or \"\"\r\n\t\tlocal pass_v = s.fields[_n(\"password\")] and s.fields[_n(\"password\")]:formvalue(t) or \"\"\r\n\t\tif user_v == \"\" or pass_v == \"\" then\r\n\t\t\treturn nil, translate(\"Username and Password must be used together!\")\r\n\t\tend\r\n\tend\r\n\treturn value\r\nend\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\n\r\no = s:option(Value, _n(\"username\"), translate(\"Username\"))\r\no:depends({ [_n(\"auth\")] = true })\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"auth\")] = true })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(ListValue, _n(\"d_protocol\"), translate(\"Destination protocol\"))\r\no:value(\"tcp\", \"TCP\")\r\no:value(\"udp\", \"UDP\")\r\no:value(\"tcp,udp\", \"TCP,UDP\")\r\no:depends({ [_n(\"protocol\")] = \"dokodemo-door\" })\r\n\r\no = s:option(Value, _n(\"d_address\"), translate(\"Destination address\"))\r\no:depends({ [_n(\"protocol\")] = \"dokodemo-door\" })\r\n\r\no = s:option(Value, _n(\"d_port\"), translate(\"Destination port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"protocol\")] = \"dokodemo-door\" })\r\n\r\no = s:option(Value, _n(\"decryption\"), translate(\"Encrypt Method\") .. \" (decryption)\")\r\no.default = \"none\"\r\no.placeholder = \"none\"\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no.validate = function(self, value)\r\n\tvalue = api.trim(value)\r\n\treturn (value == \"\" and \"none\" or value)\r\nend\r\n\r\no = s:option(ListValue, _n(\"x_ss_method\"), translate(\"Encrypt Method\"))\r\no.rewrite_option = \"method\"\r\nfor a, t in ipairs(x_ss_method_list) do o:value(t) end\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(Flag, _n(\"iv_check\"), translate(\"IV Check\"))\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(ListValue, _n(\"ss_network\"), translate(\"Transport\"))\r\no.default = \"tcp,udp\"\r\no:value(\"tcp\", \"TCP\")\r\no:value(\"udp\", \"UDP\")\r\no:value(\"tcp,udp\", \"TCP,UDP\")\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(Flag, _n(\"udp_forward\"), translate(\"UDP Forward\"))\r\no.default = \"1\"\r\no.rmempty = false\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\n\r\no = s:option(DynamicList, _n(\"uuid\"), translate(\"ID\") .. \"/\" .. translate(\"Password\"))\r\nfor i = 1, 3 do\r\n\to:value(api.gen_uuid(1))\r\nend\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\no = s:option(ListValue, _n(\"flow\"), translate(\"flow\"))\r\no.default = \"\"\r\no:value(\"\", translate(\"Disable\"))\r\no:value(\"xtls-rprx-vision\")\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\n\r\n---- [[ hysteria2 ]]\r\no = s:option(Value, _n(\"hysteria2_auth_password\"), translate(\"Auth Password\"))\r\no.password = true\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\n\r\no = s:option(Flag, _n(\"hysteria2_ignore_client_bandwidth\"), translate(\"Client BBR Flow Control\"))\r\no.default = 0\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(Value, _n(\"hysteria2_up_mbps\"), translate(\"Max upload Mbps\"))\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\", [_n(\"hysteria2_ignore_client_bandwidth\")] = false })\r\n\r\no = s:option(Value, _n(\"hysteria2_down_mbps\"), translate(\"Max download Mbps\"))\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\", [_n(\"hysteria2_ignore_client_bandwidth\")] = false })\r\n\r\no = s:option(ListValue, _n(\"hysteria2_obfs_type\"), translate(\"Obfs Type\"))\r\no:value(\"\", translate(\"Disable\"))\r\no:value(\"salamander\")\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(Value, _n(\"hysteria2_obfs_password\"), translate(\"Obfs Password\"))\r\no:depends({ [_n(\"hysteria2_obfs_type\")] = \"salamander\" })\r\n\r\n---- [[ TLS ]]\r\no = s:option(Flag, _n(\"tls\"), translate(\"TLS\"))\r\no.default = 0\r\no.validate = function(self, value, t)\r\n\tif value then\r\n\t\tlocal reality = s.fields[_n(\"reality\")] and s.fields[_n(\"reality\")]:formvalue(t) or nil\r\n\t\tif reality and reality == \"1\" then return value end\r\n\t\tif value == \"1\" then\r\n\t\t\tlocal ca = s.fields[_n(\"tls_certificateFile\")] and s.fields[_n(\"tls_certificateFile\")]:formvalue(t) or \"\"\r\n\t\t\tlocal key = s.fields[_n(\"tls_keyFile\")] and s.fields[_n(\"tls_keyFile\")]:formvalue(t) or \"\"\r\n\t\t\tif ca == \"\" or key == \"\" then\r\n\t\t\t\treturn nil, translate(\"Public key and Private key path can not be empty!\")\r\n\t\t\tend\r\n\t\tend\r\n\t\treturn value\r\n\tend\r\nend\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\n-- [[ REALITY部分 ]] --\r\no = s:option(Flag, _n(\"reality\"), translate(\"REALITY\"))\r\no.default = 0\r\no:depends({ [_n(\"tls\")] = true })\r\n\r\no = s:option(Value, _n(\"reality_private_key\"), translate(\"Private Key\"))\r\no:depends({ [_n(\"reality\")] = true })\r\n\r\no = s:option(DynamicList, _n(\"reality_shortId\"), translate(\"Short Id\"))\r\no:depends({ [_n(\"reality\")] = true })\r\n\r\no = s:option(Value, _n(\"reality_dest\"), translate(\"Dest\"))\r\no.default = \"google.com:443\"\r\no:depends({ [_n(\"reality\")] = true })\r\n\r\no = s:option(DynamicList, _n(\"reality_serverNames\"), translate(\"serverNames\"))\r\no:depends({ [_n(\"reality\")] = true })\r\nfunction o.write(self, section, value)\r\n\tlocal t = {}\r\n\tlocal t2 = {}\r\n\tif type(value) == \"table\" then\r\n\t\tlocal x\r\n\t\tfor _, x in ipairs(value) do\r\n\t\t\tif x and #x > 0 then\r\n\t\t\t\tif not t2[x] then\r\n\t\t\t\t\tt2[x] = x\r\n\t\t\t\t\tt[#t+1] = x\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\telse\r\n\t\tt = { value }\r\n\tend\r\n\treturn DynamicList.write(self, section, t)\r\nend\r\n\r\no = s:option(ListValue, _n(\"alpn\"), translate(\"alpn\"))\r\no.default = \"h2,http/1.1\"\r\no:value(\"h3\")\r\no:value(\"h2\")\r\no:value(\"h3,h2\")\r\no:value(\"http/1.1\")\r\no:value(\"h2,http/1.1\")\r\no:value(\"h3,h2,http/1.1\")\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\n\r\no = s:option(Flag, _n(\"use_mldsa65Seed\"), translate(\"ML-DSA-65\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"reality\")] = true })\r\n\r\no = s:option(TextValue, _n(\"reality_mldsa65Seed\"), \"ML-DSA-65 \" .. translate(\"Private Key\"))\r\no.default = \"\"\r\no.rows = 5\r\no.wrap = \"soft\"\r\no:depends({ [_n(\"use_mldsa65Seed\")] = true })\r\no.validate = function(self, value)\r\n\treturn api.trim(value:gsub(\"[\\r\\n]\", \"\"))\r\nend\r\n\r\n-- o = s:option(Value, _n(\"minversion\"), translate(\"minversion\"))\r\n-- o.default = \"1.3\"\r\n-- o:value(\"1.3\")\r\n--o:depends({ [_n(\"tls\")] = true })\r\n\r\n-- [[ TLS部分 ]] --\r\n\r\no = s:option(FileUpload, _n(\"tls_certificateFile\"), translate(\"Public key absolute path\"), translate(\"as:\") .. \"/etc/ssl/fullchain.pem\")\r\no.default = m:get(s.section, \"tls_certificateFile\") or \"/etc/config/ssl/\" .. arg[1] .. \".pem\"\r\nif o and o:formvalue(arg[1]) then o.default = o:formvalue(arg[1]) end\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\no.validate = function(self, value, t)\r\n\tif value and value ~= \"\" then\r\n\t\tif not fs.access(value) then\r\n\t\t\treturn nil, translate(\"Can't find this file!\")\r\n\t\telse\r\n\t\t\treturn value\r\n\t\tend\r\n\tend\r\n\treturn nil\r\nend\r\n\r\no = s:option(FileUpload, _n(\"tls_keyFile\"), translate(\"Private key absolute path\"), translate(\"as:\") .. \"/etc/ssl/private.key\")\r\no.default = m:get(s.section, \"tls_keyFile\") or \"/etc/config/ssl/\" .. arg[1] .. \".key\"\r\nif o and o:formvalue(arg[1]) then o.default = o:formvalue(arg[1]) end\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\no.validate = function(self, value, t)\r\n\tif value and value ~= \"\" then\r\n\t\tif not fs.access(value) then\r\n\t\t\treturn nil, translate(\"Can't find this file!\")\r\n\t\telse\r\n\t\t\treturn value\r\n\t\tend\r\n\tend\r\n\treturn nil\r\nend\r\n\r\no = s:option(Flag, _n(\"ech\"), translate(\"ECH\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\n\r\no = s:option(TextValue, _n(\"ech_key\"), translate(\"ECH Key\"))\r\no.default = \"\"\r\no.rows = 5\r\no.wrap = \"soft\"\r\no:depends({ [_n(\"ech\")] = true })\r\no.validate = function(self, value)\r\n\treturn api.trim(value:gsub(\"[\\r\\n]\", \"\"))\r\nend\r\n\r\no = s:option(ListValue, _n(\"transport\"), translate(\"Transport\"))\r\no:value(\"raw\", \"RAW\")\r\no:value(\"mkcp\", \"mKCP\")\r\no:value(\"ws\", \"WebSocket\")\r\no:value(\"grpc\", \"gRPC\")\r\no:value(\"httpupgrade\", \"HttpUpgrade\")\r\no:value(\"xhttp\", \"XHTTP\")\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\n-- [[ WebSocket部分 ]]--\r\n\r\no = s:option(Value, _n(\"ws_host\"), translate(\"WebSocket Host\"))\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\no = s:option(Value, _n(\"ws_path\"), translate(\"WebSocket Path\"))\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\n-- [[ HttpUpgrade部分 ]]--\r\no = s:option(Value, _n(\"httpupgrade_host\"), translate(\"HttpUpgrade Host\"))\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\n\r\no = s:option(Value, _n(\"httpupgrade_path\"), translate(\"HttpUpgrade Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\n\r\n-- [[ XHTTP部分 ]]--\r\no = s:option(Value, _n(\"xhttp_host\"), translate(\"XHTTP Host\"))\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\n\r\no = s:option(Value, _n(\"xhttp_path\"), translate(\"XHTTP Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\n\r\no = s:option(Value, _n(\"xhttp_maxuploadsize\"), translate(\"maxUploadSize\"))\r\no.default = \"1000000\"\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\n\r\no = s:option(Value, _n(\"xhttp_maxconcurrentuploads\"), translate(\"maxConcurrentUploads\"))\r\no.default = \"10\"\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\n\r\n-- [[ TCP部分 ]]--\r\n\r\n-- TCP伪装\r\no = s:option(ListValue, _n(\"tcp_guise\"), translate(\"Camouflage Type\"))\r\no:value(\"none\", \"none\")\r\no:value(\"http\", \"http\")\r\no:depends({ [_n(\"transport\")] = \"raw\" })\r\n\r\n-- HTTP域名\r\no = s:option(DynamicList, _n(\"tcp_guise_http_host\"), translate(\"HTTP Host\"))\r\no:depends({ [_n(\"tcp_guise\")] = \"http\" })\r\n\r\n-- HTTP路径\r\no = s:option(DynamicList, _n(\"tcp_guise_http_path\"), translate(\"HTTP Path\"))\r\no:depends({ [_n(\"tcp_guise\")] = \"http\" })\r\n\r\n-- [[ mKCP部分 ]]--\r\n\r\no = s:option(ListValue, _n(\"mkcp_guise\"), translate(\"Camouflage Type\"), translate('<br />none: default, no masquerade, data sent is packets with no characteristics.<br />srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime).<br />utp: packets disguised as uTP will be recognized as bittorrent downloaded data.<br />wechat-video: packets disguised as WeChat video calls.<br />dtls: disguised as DTLS 1.2 packet.<br />wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)<br />dns: Disguising traffic as DNS requests.'))\r\nfor a, t in ipairs(header_type_list) do o:value(t) end\r\no:depends({ [_n(\"transport\")] = \"mkcp\" })\r\n\r\no = s:option(Value, _n(\"mkcp_domain\"), translate(\"Camouflage Domain\"), translate(\"Use it together with the DNS disguised type. You can fill in any domain.\"))\r\no:depends({ [_n(\"mkcp_guise\")] = \"dns\" })\r\n\r\no = s:option(Value, _n(\"mkcp_mtu\"), translate(\"KCP MTU\"))\r\no.datatype = \"uinteger\"\r\no.default = 1350\r\no:depends({ [_n(\"transport\")] = \"mkcp\" })\r\n\r\no = s:option(Value, _n(\"mkcp_seed\"), translate(\"KCP Seed\"))\r\no:depends({ [_n(\"transport\")] = \"mkcp\" })\r\n\r\n-- [[ gRPC部分 ]]--\r\no = s:option(Value, _n(\"grpc_serviceName\"), \"ServiceName\")\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\n--[[FinalMask]]\r\no = s:option(Flag, _n(\"use_finalmask\"), \"FinalMask\")\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false, [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"custom\")] = false, [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"custom\")] = false, [_n(\"protocol\")] = \"trojan\" })\r\no:depends({ [_n(\"custom\")] = false, [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"custom\")] = false, [_n(\"protocol\")] = \"wireguard\" })\r\no:depends({ [_n(\"custom\")] = false, [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(TextValue, _n(\"finalmask\"), \"FinalMask JSON\")\r\no:depends({ [_n(\"use_finalmask\")] = true })\r\no.rows = 10\r\no.wrap = \"off\"\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal raw = m:get(section, \"finalmask\")\r\n\tif raw then\r\n\t\treturn api.base64Decode(raw)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"finalmask\", api.base64Encode(value) or \"\")\r\nend\r\no.validate = function(self, value)\r\n\tvalue = api.trim(value):gsub(\"\\r\\n\", \"\\n\"):gsub(\"^[ \\t]*\\n\", \"\"):gsub(\"\\n[ \\t]*$\", \"\"):gsub(\"\\n[ \\t]*\\n\", \"\\n\")\r\n\tif api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, \"FinalMask \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\n\r\n--[[acceptProxyProtocol]]\r\no = s:option(Flag, _n(\"acceptProxyProtocol\"), translate(\"acceptProxyProtocol\"), translate(\"Whether to receive PROXY protocol, when this node want to be fallback or forwarded by proxy, it must be enable, otherwise it cannot be used.\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\n--[[Fast Open]]\r\no = s:option(Flag, _n(\"tcp_fast_open\"), \"TCP \" .. translate(\"Fast Open\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"protocol\")] = \"vmess\", [_n(\"custom\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"custom\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\", [_n(\"custom\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"trojan\", [_n(\"custom\")] = false })\r\n\r\n-- [[ Fallback部分 ]]--\r\no = s:option(Flag, _n(\"fallback\"), translate(\"Fallback\"))\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"transport\")] = \"raw\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\", [_n(\"transport\")] = \"raw\" })\r\n\r\n--[[\r\no = s:option(Value, _n(\"fallback_alpn\"), \"Fallback alpn\")\r\no:depends({ [_n(\"fallback\")] = true })\r\n\r\no = s:option(Value, _n(\"fallback_path\"), \"Fallback path\")\r\no:depends({ [_n(\"fallback\")] = true })\r\n\r\no = s:option(Value, _n(\"fallback_dest\"), \"Fallback dest\")\r\no:depends({ [_n(\"fallback\")] = true })\r\n\r\no = s:option(Value, _n(\"fallback_xver\"), \"Fallback xver\")\r\no.default = 0\r\no:depends({ [_n(\"fallback\")] = true })\r\n]]--\r\n\r\no = s:option(DynamicList, _n(\"fallback_list\"), \"Fallback\", translate(\"format: dest,path,xver\"))\r\no:depends({ [_n(\"fallback\")] = true })\r\n\r\no = s:option(Flag, _n(\"bind_local\"), translate(\"Bind Local\"), translate(\"When selected, it can only be accessed localhost.\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"accept_lan\"), translate(\"Accept LAN Access\"), translate(\"When selected, it can accessed lan , this will not be safe!\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\nlocal nodes_table = {}\r\nfor k, e in ipairs(api.get_valid_nodes()) do\r\n\tif e.node_type == \"normal\" and e.type == type_name then\r\n\t\tnodes_table[#nodes_table + 1] = {\r\n\t\t\tid = e[\".name\"],\r\n\t\t\tremarks = e[\"remark\"],\r\n\t\t\tgroup = e[\"group\"]\r\n\t\t}\r\n\tend\r\nend\r\n\r\no = s:option(ListValue, _n(\"outbound_node\"), translate(\"outbound node\"))\r\no:value(\"\", translate(\"Close\"))\r\no:value(\"_socks\", translate(\"Custom Socks\"))\r\no:value(\"_http\", translate(\"Custom HTTP\"))\r\no:value(\"_iface\", translate(\"Custom Interface\"))\r\no.template = api.appname .. \"/cbi/nodes_listvalue\"\r\no.group = {\"\",\"\",\"\",\"\"}\r\nfor k, v in pairs(nodes_table) do\r\n\to:value(v.id, v.remarks)\r\n\to.group[#o.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\r\nend\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"outbound_node_address\"), translate(\"Address (Support Domain Name)\"))\r\no:depends({ [_n(\"outbound_node\")] = \"_socks\"})\r\no:depends({ [_n(\"outbound_node\")] = \"_http\"})\r\n\r\no = s:option(Value, _n(\"outbound_node_port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"outbound_node\")] = \"_socks\"})\r\no:depends({ [_n(\"outbound_node\")] = \"_http\"})\r\n\r\no = s:option(Value, _n(\"outbound_node_username\"), translate(\"Username\"))\r\no:depends({ [_n(\"outbound_node\")] = \"_socks\"})\r\no:depends({ [_n(\"outbound_node\")] = \"_http\"})\r\n\r\no = s:option(Value, _n(\"outbound_node_password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"outbound_node\")] = \"_socks\"})\r\no:depends({ [_n(\"outbound_node\")] = \"_http\"})\r\n\r\no = s:option(Value, _n(\"outbound_node_iface\"), translate(\"Interface\"))\r\no.default = \"eth1\"\r\no:depends({ [_n(\"outbound_node\")] = \"_iface\"})\r\n\r\no = s:option(TextValue, _n(\"custom_config\"), translate(\"Custom Config\"))\r\no.rows = 10\r\no.wrap = \"off\"\r\no:depends({ [_n(\"custom\")] = true })\r\no.validate = function(self, value, t)\r\n\tif value and api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, translate(\"Custom Config\") .. \" \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal config_str = m:get(section, \"config_str\")\r\n\tif config_str then\r\n\t\treturn api.base64Decode(config_str)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"config_str\", api.base64Encode(value) or \"\")\r\nend\r\n\r\no = s:option(Flag, _n(\"log\"), translate(\"Log\"))\r\no.default = \"1\"\r\no.rmempty = false\r\n\r\no = s:option(ListValue, _n(\"loglevel\"), translate(\"Log Level\"))\r\no.default = \"warning\"\r\no:value(\"debug\")\r\no:value(\"info\")\r\no:value(\"warning\")\r\no:value(\"error\")\r\no:depends({ [_n(\"log\")] = true })\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/server/type/sing-box.lua",
    "content": "local m, s = ...\r\n\r\nlocal api = require \"luci.passwall.api\"\r\n\r\nlocal singbox_bin = api.finded_com(\"sing-box\")\r\n\r\nif not singbox_bin then\r\n\treturn\r\nend\r\n\r\nlocal fs = api.fs\r\n\r\nlocal singbox_tags = luci.sys.exec(singbox_bin .. \" version  | grep 'Tags:' | awk '{print $2}'\")\r\n\r\nlocal type_name = \"sing-box\"\r\n\r\nlocal option_prefix = \"singbox_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal ss_method_list = {\r\n\t\"none\", \"aes-128-gcm\", \"aes-192-gcm\", \"aes-256-gcm\", \"chacha20-ietf-poly1305\", \"xchacha20-ietf-poly1305\",\r\n\t\"2022-blake3-aes-128-gcm\", \"2022-blake3-aes-256-gcm\", \"2022-blake3-chacha20-poly1305\"\r\n}\r\n\r\n-- [[ Sing-Box ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"Sing-Box\")\r\n\r\no = s:option(Flag, _n(\"custom\"), translate(\"Use Custom Config\"))\r\n\r\no = s:option(ListValue, _n(\"protocol\"), translate(\"Protocol\"))\r\no:value(\"mixed\", \"Mixed\")\r\no:value(\"socks\", \"Socks\")\r\no:value(\"http\", \"HTTP\")\r\no:value(\"shadowsocks\", \"Shadowsocks\")\r\no:value(\"vmess\", \"Vmess\")\r\no:value(\"vless\", \"VLESS\")\r\no:value(\"trojan\", \"Trojan\")\r\no:value(\"naive\", \"Naive\")\r\nif singbox_tags:find(\"with_quic\") then\r\n\to:value(\"hysteria\", \"Hysteria\")\r\nend\r\nif singbox_tags:find(\"with_quic\") then\r\n\to:value(\"tuic\", \"TUIC\")\r\nend\r\nif singbox_tags:find(\"with_quic\") then\r\n\to:value(\"hysteria2\", \"Hysteria2\")\r\nend\r\no:value(\"anytls\", \"AnyTLS\")\r\no:value(\"direct\", \"Direct\")\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Listen Port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"auth\"), translate(\"Auth\"))\r\no.validate = function(self, value, t)\r\n\tif value and value == \"1\" then\r\n\t\tlocal user_v = s.fields[_n(\"username\")] and s.fields[_n(\"username\")]:formvalue(t) or \"\"\r\n\t\tlocal pass_v = s.fields[_n(\"password\")] and s.fields[_n(\"password\")]:formvalue(t) or \"\"\r\n\t\tif user_v == \"\" or pass_v == \"\" then\r\n\t\t\treturn nil, translate(\"Username and Password must be used together!\")\r\n\t\tend\r\n\tend\r\n\treturn value\r\nend\r\no:depends({ [_n(\"protocol\")] = \"mixed\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\n\r\no = s:option(Value, _n(\"username\"), translate(\"Username\"))\r\no:depends({ [_n(\"auth\")] = true })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\no:depends({ [_n(\"protocol\")] = \"anytls\" })\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"auth\")] = true })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"anytls\" })\r\n\r\nif singbox_tags:find(\"with_quic\") then\r\n\to = s:option(Value, _n(\"hysteria_up_mbps\"), translate(\"Max upload Mbps\"))\r\n\to.default = \"100\"\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_down_mbps\"), translate(\"Max download Mbps\"))\r\n\to.default = \"100\"\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_obfs\"), translate(\"Obfs Password\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(ListValue, _n(\"hysteria_auth_type\"), translate(\"Auth Type\"))\r\n\to:value(\"disable\", translate(\"Disable\"))\r\n\to:value(\"string\", translate(\"STRING\"))\r\n\to:value(\"base64\", translate(\"BASE64\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_auth_password\"), translate(\"Auth Password\"))\r\n\to.password = true\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\", [_n(\"hysteria_auth_type\")] = \"string\"})\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\", [_n(\"hysteria_auth_type\")] = \"base64\"})\r\n\r\n\to = s:option(Value, _n(\"hysteria_recv_window_conn\"), translate(\"QUIC stream receive window\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_recv_window_client\"), translate(\"QUIC connection receive window\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_max_conn_client\"), translate(\"QUIC concurrent bidirectional streams\"))\r\n\to.default = \"1024\"\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Flag, _n(\"hysteria_disable_mtu_discovery\"), translate(\"Disable MTU detection\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\nend\r\n\r\nif singbox_tags:find(\"with_quic\") then\r\n\to = s:option(ListValue, _n(\"tuic_congestion_control\"), translate(\"Congestion control algorithm\"))\r\n\to.default = \"cubic\"\r\n\to:value(\"bbr\", translate(\"BBR\"))\r\n\to:value(\"cubic\", translate(\"CUBIC\"))\r\n\to:value(\"new_reno\", translate(\"New Reno\"))\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\n\to = s:option(Flag, _n(\"tuic_zero_rtt_handshake\"), translate(\"Enable 0-RTT QUIC handshake\"))\r\n\to.default = 0\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\n\to = s:option(Value, _n(\"tuic_heartbeat\"), translate(\"Heartbeat interval(second)\"))\r\n\to.datatype = \"uinteger\"\r\n\to.default = \"3\"\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\n\to = s:option(ListValue, _n(\"tuic_alpn\"), translate(\"QUIC TLS ALPN\"))\r\n\to.default = \"default\"\r\n\to:value(\"default\", translate(\"Default\"))\r\n\to:value(\"h3\")\r\n\to:value(\"h2\")\r\n\to:value(\"h3,h2\")\r\n\to:value(\"http/1.1\")\r\n\to:value(\"h2,http/1.1\")\r\n\to:value(\"h3,h2,http/1.1\")\r\n\to:value(\"spdy/3.1\")\r\n\to:value(\"h3,spdy/3.1\")\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\nend\r\n\r\nif singbox_tags:find(\"with_quic\") then\r\n\to = s:option(Value, _n(\"hysteria2_auth_password\"), translate(\"Auth Password\"))\r\n\to.password = true\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\n\r\n\to = s:option(Flag, _n(\"hysteria2_ignore_client_bandwidth\"), translate(\"Client BBR Flow Control\"), translate(\"Commands the client to use the BBR flow control algorithm\"))\r\n\to.default = 0\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria2_up_mbps\"), translate(\"Max upload Mbps\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\", [_n(\"hysteria2_ignore_client_bandwidth\")] = false })\r\n\r\n\to = s:option(Value, _n(\"hysteria2_down_mbps\"), translate(\"Max download Mbps\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\", [_n(\"hysteria2_ignore_client_bandwidth\")] = false })\r\n\r\n\to = s:option(ListValue, _n(\"hysteria2_obfs_type\"), translate(\"Obfs Type\"))\r\n\to:value(\"\", translate(\"Disable\"))\r\n\to:value(\"salamander\")\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria2_obfs_password\"), translate(\"Obfs Password\"))\r\n\to:depends({ [_n(\"hysteria2_obfs_type\")] = \"salamander\" })\r\nend\r\n\r\no = s:option(ListValue, _n(\"d_protocol\"), translate(\"Destination protocol\"))\r\no:value(\"tcp\", \"TCP\")\r\no:value(\"udp\", \"UDP\")\r\no:value(\"tcp,udp\", \"TCP,UDP\")\r\no:depends({ [_n(\"protocol\")] = \"direct\" })\r\n\r\no = s:option(Value, _n(\"d_address\"), translate(\"Destination address\"))\r\no:depends({ [_n(\"protocol\")] = \"direct\" })\r\n\r\no = s:option(Value, _n(\"d_port\"), translate(\"Destination port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"protocol\")] = \"direct\" })\r\n\r\no = s:option(Value, _n(\"decryption\"), translate(\"Encrypt Method\"))\r\no.default = \"none\"\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\n\r\no = s:option(ListValue, _n(\"ss_method\"), translate(\"Encrypt Method\"))\r\no.rewrite_option = \"method\"\r\nfor a, t in ipairs(ss_method_list) do o:value(t) end\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(DynamicList, _n(\"uuid\"), translate(\"ID\") .. \"/\" .. translate(\"Password\"))\r\nfor i = 1, 3 do\r\n\to:value(api.gen_uuid(1))\r\nend\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\no = s:option(ListValue, _n(\"flow\"), translate(\"flow\"))\r\no.default = \"\"\r\no:value(\"\", translate(\"Disable\"))\r\no:value(\"xtls-rprx-vision\")\r\no:depends({ [_n(\"protocol\")] = \"vless\" , [_n(\"tls\")] = true })\r\n\r\no = s:option(Flag, _n(\"tls\"), translate(\"TLS\"))\r\no.default = 0\r\no.validate = function(self, value, t)\r\n\tif value then\r\n\t\tlocal reality = s.fields[_n(\"reality\")] and s.fields[_n(\"reality\")]:formvalue(t) or nil\r\n\t\tif reality and reality == \"1\" then return value end\r\n\t\tif value == \"1\" then\r\n\t\t\tlocal ca = s.fields[_n(\"tls_certificateFile\")] and s.fields[_n(\"tls_certificateFile\")]:formvalue(t) or \"\"\r\n\t\t\tlocal key = s.fields[_n(\"tls_keyFile\")] and s.fields[_n(\"tls_keyFile\")]:formvalue(t) or \"\"\r\n\t\t\tif ca == \"\" or key == \"\" then\r\n\t\t\t\treturn nil, translate(\"Public key and Private key path can not be empty!\")\r\n\t\t\tend\r\n\t\tend\r\n\t\treturn value\r\n\tend\r\nend\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\no:depends({ [_n(\"protocol\")] = \"anytls\" })\r\n\r\n-- https://github.com/SagerNet/sing-box/commit/d2a04c4e41e6cef0937331cb6d10211f431caaab\r\nif singbox_tags:find(\"with_utls\") then\r\n\t-- [[ REALITY部分 ]] --\r\n\to = s:option(Flag, _n(\"reality\"), translate(\"REALITY\"))\r\n\to.default = 0\r\n\to:depends({ [_n(\"protocol\")] = \"http\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"vmess\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"trojan\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"anytls\", [_n(\"tls\")] = true })\r\n\r\n\to = s:option(Value, _n(\"reality_private_key\"), translate(\"Private Key\"))\r\n\to:depends({ [_n(\"reality\")] = true })\r\n\r\n\to = s:option(Value, _n(\"reality_shortId\"), translate(\"Short Id\"))\r\n\to:depends({ [_n(\"reality\")] = true })\r\n\r\n\to = s:option(Value, _n(\"reality_handshake_server\"), translate(\"Handshake Server\"))\r\n\to.default = \"google.com\"\r\n\to:depends({ [_n(\"reality\")] = true })\r\n\r\n\to = s:option(Value, _n(\"reality_handshake_server_port\"), translate(\"Handshake Server Port\"))\r\n\to.datatype = \"port\"\r\n\to.default = \"443\"\r\n\to:depends({ [_n(\"reality\")] = true })\r\nend\r\n\r\no = s:option(ListValue, _n(\"alpn\"), translate(\"ALPN\"))\r\no.default = \"default\"\r\no:value(\"default\", translate(\"Default\"))\r\no:value(\"h3\")\r\no:value(\"h2\")\r\no:value(\"h3,h2\")\r\no:value(\"http/1.1\")\r\no:value(\"h2,http/1.1\")\r\no:value(\"h3,h2,http/1.1\")\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n-- [[ TLS部分 ]] --\r\n\r\no = s:option(FileUpload, _n(\"tls_certificateFile\"), translate(\"Public key absolute path\"), translate(\"as:\") .. \"/etc/ssl/fullchain.pem\")\r\no.default = m:get(s.section, \"tls_certificateFile\") or \"/etc/config/ssl/\" .. arg[1] .. \".pem\"\r\nif o and o:formvalue(arg[1]) then o.default = o:formvalue(arg[1]) end\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\no.validate = function(self, value, t)\r\n\tif value and value ~= \"\" then\r\n\t\tif not fs.access(value) then\r\n\t\t\treturn nil, translate(\"Can't find this file!\")\r\n\t\telse\r\n\t\t\treturn value\r\n\t\tend\r\n\tend\r\n\treturn nil\r\nend\r\n\r\no = s:option(FileUpload, _n(\"tls_keyFile\"), translate(\"Private key absolute path\"), translate(\"as:\") .. \"/etc/ssl/private.key\")\r\no.default = m:get(s.section, \"tls_keyFile\") or \"/etc/config/ssl/\" .. arg[1] .. \".key\"\r\nif o and o:formvalue(arg[1]) then o.default = o:formvalue(arg[1]) end\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\no.validate = function(self, value, t)\r\n\tif value and value ~= \"\" then\r\n\t\tif not fs.access(value) then\r\n\t\t\treturn nil, translate(\"Can't find this file!\")\r\n\t\telse\r\n\t\t\treturn value\r\n\t\tend\r\n\tend\r\n\treturn nil\r\nend\r\n\r\no = s:option(Flag, _n(\"ech\"), translate(\"ECH\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"flow\")] = \"\", [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(TextValue, _n(\"ech_key\"), translate(\"ECH Key\"))\r\no.default = \"\"\r\no.rows = 5\r\no.wrap = \"off\"\r\no:depends({ [_n(\"ech\")] = true })\r\no.validate = function(self, value)\r\n\tvalue = value:gsub(\"^%s+\", \"\"):gsub(\"%s+$\",\"\\n\"):gsub(\"\\r\\n\",\"\\n\"):gsub(\"[ \\t]*\\n[ \\t]*\", \"\\n\")\r\n\tvalue = value:gsub(\"^%s*\\n\", \"\")\r\n\tif value:sub(-1) == \"\\n\" then  \r\n\t\tvalue = value:sub(1, -2)  \r\n\tend\r\n\treturn value\r\nend\r\n\r\no = s:option(ListValue, _n(\"transport\"), translate(\"Transport\"))\r\no:value(\"tcp\", \"TCP\")\r\no:value(\"http\", \"HTTP\")\r\no:value(\"ws\", \"WebSocket\")\r\no:value(\"httpupgrade\", \"HTTPUpgrade\")\r\no:value(\"quic\", \"QUIC\")\r\no:value(\"grpc\", \"gRPC\")\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\n-- [[ HTTP部分 ]]--\r\n\r\no = s:option(DynamicList, _n(\"http_host\"), translate(\"HTTP Host\"))\r\no:depends({ [_n(\"transport\")] = \"http\" })\r\n\r\no = s:option(Value, _n(\"http_path\"), translate(\"HTTP Path\"))\r\no:depends({ [_n(\"transport\")] = \"http\" })\r\n\r\n-- [[ WebSocket部分 ]]--\r\n\r\no = s:option(Value, _n(\"ws_host\"), translate(\"WebSocket Host\"))\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\no = s:option(Value, _n(\"ws_path\"), translate(\"WebSocket Path\"))\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\n-- [[ HTTPUpgrade部分 ]]--\r\n\r\no = s:option(Value, _n(\"httpupgrade_host\"), translate(\"HTTPUpgrade Host\"))\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\n\r\no = s:option(Value, _n(\"httpupgrade_path\"), translate(\"HTTPUpgrade Path\"))\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\n\r\n-- [[ gRPC部分 ]]--\r\no = s:option(Value, _n(\"grpc_serviceName\"), \"ServiceName\")\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\n-- [[ Mux ]]--\r\no = s:option(Flag, _n(\"mux\"), translate(\"Mux\"))\r\no.rmempty = false\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"flow\")] = \"\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\n-- [[ TCP Brutal ]]--\r\no = s:option(Flag, _n(\"tcpbrutal\"), translate(\"TCP Brutal\"))\r\no.default = 0\r\no:depends({ [_n(\"mux\")] = true })\r\n\r\no = s:option(Value, _n(\"tcpbrutal_up_mbps\"), translate(\"Max upload Mbps\"))\r\no.default = \"10\"\r\no:depends({ [_n(\"tcpbrutal\")] = true })\r\n\r\no = s:option(Value, _n(\"tcpbrutal_down_mbps\"), translate(\"Max download Mbps\"))\r\no.default = \"50\"\r\no:depends({ [_n(\"tcpbrutal\")] = true })\r\n\r\no = s:option(Flag, _n(\"bind_local\"), translate(\"Bind Local\"), translate(\"When selected, it can only be accessed localhost.\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"accept_lan\"), translate(\"Accept LAN Access\"), translate(\"When selected, it can accessed lan , this will not be safe!\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\nlocal nodes_table = {}\r\nfor k, e in ipairs(api.get_valid_nodes()) do\r\n\tif e.node_type == \"normal\" and e.type == type_name then\r\n\t\tnodes_table[#nodes_table + 1] = {\r\n\t\t\tid = e[\".name\"],\r\n\t\t\tremarks = e[\"remark\"],\r\n\t\t\tgroup = e[\"group\"]\r\n\t\t}\r\n\tend\r\nend\r\n\r\no = s:option(ListValue, _n(\"outbound_node\"), translate(\"outbound node\"))\r\no:value(\"\", translate(\"Close\"))\r\no:value(\"_socks\", translate(\"Custom Socks\"))\r\no:value(\"_http\", translate(\"Custom HTTP\"))\r\no:value(\"_iface\", translate(\"Custom Interface\"))\r\no.template = api.appname .. \"/cbi/nodes_listvalue\"\r\no.group = {\"\",\"\",\"\",\"\"}\r\nfor k, v in pairs(nodes_table) do\r\n\to:value(v.id, v.remarks)\r\n\to.group[#o.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\r\nend\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"outbound_node_address\"), translate(\"Address (Support Domain Name)\"))\r\no:depends({ [_n(\"outbound_node\")] = \"_socks\" })\r\no:depends({ [_n(\"outbound_node\")] = \"_http\" })\r\n\r\no = s:option(Value, _n(\"outbound_node_port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"outbound_node\")] = \"_socks\" })\r\no:depends({ [_n(\"outbound_node\")] = \"_http\" })\r\n\r\no = s:option(Value, _n(\"outbound_node_username\"), translate(\"Username\"))\r\no:depends({ [_n(\"outbound_node\")] = \"_socks\" })\r\no:depends({ [_n(\"outbound_node\")] = \"_http\" })\r\n\r\no = s:option(Value, _n(\"outbound_node_password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"outbound_node\")] = \"_socks\" })\r\no:depends({ [_n(\"outbound_node\")] = \"_http\" })\r\n\r\no = s:option(Value, _n(\"outbound_node_iface\"), translate(\"Interface\"))\r\no.default = \"eth1\"\r\no:depends({ [_n(\"outbound_node\")] = \"_iface\" })\r\n\r\no = s:option(TextValue, _n(\"custom_config\"), translate(\"Custom Config\"))\r\no.rows = 10\r\no.wrap = \"off\"\r\no:depends({ [_n(\"custom\")] = true })\r\no.validate = function(self, value, t)\r\n\tif value and api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, translate(\"Custom Config\") .. \" \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal config_str = m:get(section, \"config_str\")\r\n\tif config_str then\r\n\t\treturn api.base64Decode(config_str)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"config_str\", api.base64Encode(value) or \"\")\r\nend\r\n\r\no = s:option(Flag, _n(\"log\"), translate(\"Log\"))\r\no.default = \"1\"\r\no.rmempty = false\r\n\r\no = s:option(ListValue, _n(\"loglevel\"), translate(\"Log Level\"))\r\no.default = \"info\"\r\no:value(\"debug\")\r\no:value(\"info\")\r\no:value(\"warn\")\r\no:value(\"error\")\r\no:depends({ [_n(\"log\")] = true })\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/server/type/socks.lua",
    "content": "local m, s = ...\r\n\r\nlocal api = require \"luci.passwall.api\"\r\n\r\nif not api.is_finded(\"microsocks\") then\r\n\treturn\r\nend\r\n\r\nlocal type_name = \"Socks\"\r\n\r\nlocal option_prefix = \"socks_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\n-- [[ microsocks ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"Socks\")\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Listen Port\"))\r\no.datatype = \"port\"\r\n\r\no = s:option(Flag, _n(\"auth\"), translate(\"Auth\"))\r\no.validate = function(self, value, t)\r\n\tif value and value == \"1\" then\r\n\t\tlocal user_v = s.fields[_n(\"username\")] and s.fields[_n(\"username\")]:formvalue(t) or \"\"\r\n\t\tlocal pass_v = s.fields[_n(\"password\")] and s.fields[_n(\"password\")]:formvalue(t) or \"\"\r\n\t\tif user_v == \"\" or pass_v == \"\" then\r\n\t\t\treturn nil, translate(\"Username and Password must be used together!\")\r\n\t\tend\r\n\tend\r\n\treturn value\r\nend\r\n\r\no = s:option(Value, _n(\"username\"), translate(\"Username\"))\r\no:depends({ [_n(\"auth\")] = true })\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"auth\")] = true })\r\n\r\no = s:option(Flag, _n(\"log\"), translate(\"Log\"))\r\no.default = \"1\"\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/server/type/ss-rust.lua",
    "content": "local m, s = ...\r\n\r\nlocal api = require \"luci.passwall.api\"\r\n\r\nif not api.is_finded(\"ssserver\") then\r\n\treturn\r\nend\r\n\r\nlocal type_name = \"SS-Rust\"\r\n\r\nlocal option_prefix = \"ssrust_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal ssrust_encrypt_method_list = {\r\n\t\"plain\", \"none\",\r\n\t\"aes-128-gcm\", \"aes-256-gcm\", \"chacha20-ietf-poly1305\",\r\n\t\"2022-blake3-aes-128-gcm\", \"2022-blake3-aes-256-gcm\", \"2022-blake3-chacha20-poly1305\"\r\n}\r\n\r\n-- [[ Shadowsocks Rust ]]\r\n\r\ns.fields[\"type\"]:value(type_name, translate(\"Shadowsocks Rust\"))\r\n\r\no = s:option(Flag, _n(\"custom\"), translate(\"Use Custom Config\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Listen Port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(ListValue, _n(\"method\"), translate(\"Encrypt Method\"))\r\nfor a, t in ipairs(ssrust_encrypt_method_list) do o:value(t) end\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"timeout\"), translate(\"Connection Timeout\"))\r\no.datatype = \"uinteger\"\r\no.default = 300\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"tcp_fast_open\"), \"TCP \" .. translate(\"Fast Open\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(TextValue, _n(\"custom_config\"), translate(\"Custom Config\"))\r\no.rows = 10\r\no.wrap = \"off\"\r\no:depends({ [_n(\"custom\")] = true })\r\no.validate = function(self, value, t)\r\n\tif value and api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, translate(\"Custom Config\") .. \" \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal config_str = m:get(section, \"config_str\")\r\n\tif config_str then\r\n\t\treturn api.base64Decode(config_str)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"config_str\", api.base64Encode(value) or \"\")\r\nend\r\n\r\no = s:option(Flag, _n(\"log\"), translate(\"Log\"))\r\no.default = \"1\"\r\no.rmempty = false\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/server/type/ss.lua",
    "content": "local m, s = ...\r\n\r\nlocal api = require \"luci.passwall.api\"\r\n\r\nif not api.is_finded(\"ss-server\") then\r\n\treturn\r\nend\r\n\r\nlocal type_name = \"SS\"\r\n\r\nlocal option_prefix = \"ss_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal ss_encrypt_method_list = {\r\n\t\"rc4-md5\", \"aes-128-cfb\", \"aes-192-cfb\", \"aes-256-cfb\", \"aes-128-ctr\",\r\n\t\"aes-192-ctr\", \"aes-256-ctr\", \"bf-cfb\", \"camellia-128-cfb\",\r\n\t\"camellia-192-cfb\", \"camellia-256-cfb\", \"salsa20\", \"chacha20\",\r\n\t\"chacha20-ietf\", -- aead\r\n\t\"aes-128-gcm\", \"aes-192-gcm\", \"aes-256-gcm\", \"chacha20-ietf-poly1305\",\r\n\t\"xchacha20-ietf-poly1305\"\r\n}\r\n\r\n-- [[ Shadowsocks ]]\r\n\r\ns.fields[\"type\"]:value(type_name, translate(\"Shadowsocks\"))\r\n\r\no = s:option(Flag, _n(\"custom\"), translate(\"Use Custom Config\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Listen Port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(ListValue, _n(\"method\"), translate(\"Encrypt Method\"))\r\nfor a, t in ipairs(ss_encrypt_method_list) do o:value(t) end\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"timeout\"), translate(\"Connection Timeout\"))\r\no.datatype = \"uinteger\"\r\no.default = 300\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"tcp_fast_open\"), \"TCP \" .. translate(\"Fast Open\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(TextValue, _n(\"custom_config\"), translate(\"Custom Config\"))\r\no.rows = 10\r\no.wrap = \"off\"\r\no:depends({ [_n(\"custom\")] = true })\r\no.validate = function(self, value, t)\r\n\tif value and api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, translate(\"Custom Config\") .. \" \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal config_str = m:get(section, \"config_str\")\r\n\tif config_str then\r\n\t\treturn api.base64Decode(config_str)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"config_str\", api.base64Encode(value) or \"\")\r\nend\r\n\r\no = s:option(Flag, _n(\"log\"), translate(\"Log\"))\r\no.default = \"1\"\r\no.rmempty = false\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/server/type/ssr.lua",
    "content": "local m, s = ...\r\n\r\nlocal api = require \"luci.passwall.api\"\r\n\r\nif not api.is_finded(\"ssr-server\") then\r\n\treturn\r\nend\r\n\r\nlocal type_name = \"SSR\"\r\n\r\nlocal option_prefix = \"ssr_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal ssr_encrypt_method_list = {\r\n\t\"none\", \"table\", \"rc2-cfb\", \"rc4\", \"rc4-md5\", \"rc4-md5-6\", \"aes-128-cfb\",\r\n\t\"aes-192-cfb\", \"aes-256-cfb\", \"aes-128-ctr\", \"aes-192-ctr\", \"aes-256-ctr\",\r\n\t\"bf-cfb\", \"camellia-128-cfb\", \"camellia-192-cfb\", \"camellia-256-cfb\",\r\n\t\"cast5-cfb\", \"des-cfb\", \"idea-cfb\", \"seed-cfb\", \"salsa20\", \"chacha20\",\r\n\t\"chacha20-ietf\"\r\n}\r\n\r\nlocal ssr_protocol_list = {\r\n\t\"origin\", \"verify_simple\", \"verify_deflate\", \"verify_sha1\", \"auth_simple\",\r\n\t\"auth_sha1\", \"auth_sha1_v2\", \"auth_sha1_v4\", \"auth_aes128_md5\",\r\n\t\"auth_aes128_sha1\", \"auth_chain_a\", \"auth_chain_b\", \"auth_chain_c\",\r\n\t\"auth_chain_d\", \"auth_chain_e\", \"auth_chain_f\"\r\n}\r\nlocal ssr_obfs_list = {\r\n\t\"plain\", \"http_simple\", \"http_post\", \"random_head\", \"tls_simple\",\r\n\t\"tls1.0_session_auth\", \"tls1.2_ticket_auth\"\r\n}\r\n\r\n-- [[ ShadowsocksR ]]\r\n\r\ns.fields[\"type\"]:value(type_name, translate(\"ShadowsocksR\"))\r\n\r\no = s:option(Flag, _n(\"custom\"), translate(\"Use Custom Config\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Listen Port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(ListValue, _n(\"method\"), translate(\"Encrypt Method\"))\r\nfor a, t in ipairs(ssr_encrypt_method_list) do o:value(t) end\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(ListValue, _n(\"protocol\"), translate(\"Protocol\"))\r\nfor a, t in ipairs(ssr_protocol_list) do o:value(t) end\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"protocol_param\"), translate(\"Protocol_param\"))\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(ListValue, _n(\"obfs\"), translate(\"Obfs\"))\r\nfor a, t in ipairs(ssr_obfs_list) do o:value(t) end\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"obfs_param\"), translate(\"Obfs_param\"))\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"timeout\"), translate(\"Connection Timeout\"))\r\no.datatype = \"uinteger\"\r\no.default = 300\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"tcp_fast_open\"), \"TCP \" .. translate(\"Fast Open\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(TextValue, _n(\"custom_config\"), translate(\"Custom Config\"))\r\no.rows = 10\r\no.wrap = \"off\"\r\no:depends({ [_n(\"custom\")] = true })\r\no.validate = function(self, value, t)\r\n\tif value and api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, translate(\"Custom Config\") .. \" \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal config_str = m:get(section, \"config_str\")\r\n\tif config_str then\r\n\t\treturn api.base64Decode(config_str)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"config_str\", api.base64Encode(value) or \"\")\r\nend\r\n\r\no = s:option(Flag, _n(\"udp_forward\"), translate(\"UDP Forward\"))\r\no.default = \"1\"\r\no.rmempty = false\r\n\r\no = s:option(Flag, _n(\"log\"), translate(\"Log\"))\r\no.default = \"1\"\r\no.rmempty = false\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall/luasrc/model/cbi/passwall/server/user.lua",
    "content": "local api = require \"luci.passwall.api\"\nlocal appname = api.appname\nlocal fs = api.fs\nlocal types_dir = \"/usr/lib/lua/luci/model/cbi/\" .. appname .. \"/server/type/\"\n\nm = Map(\"passwall_server\", translate(\"Server Config\"))\nm.redirect = api.url(\"server\")\napi.set_apply_on_parse(m)\n\nif not arg[1] or not m:get(arg[1]) then\n\tluci.http.redirect(m.redirect)\nend\n\nm:append(Template(appname .. \"/cbi/nodes_listvalue_com\"))\n\ns = m:section(NamedSection, arg[1], \"user\", \"\")\ns.addremove = false\ns.dynamic = false\n\no = s:option(Flag, \"enable\", translate(\"Enable\"))\no.default = \"1\"\no.rmempty = false\n\no = s:option(Value, \"remarks\", translate(\"Remarks\"))\no.default = translate(\"Remarks\")\no.rmempty = false\n\no = s:option(ListValue, \"type\", translate(\"Type\"))\n\nlocal type_table = {}\nfor filename in fs.dir(types_dir) do\n\ttable.insert(type_table, filename)\nend\ntable.sort(type_table)\n\nfor index, value in ipairs(type_table) do\n\tlocal p_func = loadfile(types_dir .. value)\n\tsetfenv(p_func, getfenv(1))(m, s)\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall/luasrc/passwall/api.lua",
    "content": "module(\"luci.passwall.api\", package.seeall)\nlocal com = require \"luci.passwall.com\"\nnixio = require \"nixio\"\nfs = require \"nixio.fs\"\nsys = require \"luci.sys\"\nuci = require \"luci.model.uci\".cursor()\nutil = require \"luci.util\"\ndatatypes = require \"luci.cbi.datatypes\"\njsonc = require \"luci.jsonc\"\ni18n = require \"luci.i18n\"\n\nappname = \"passwall\"\ncurl_args = { \"-skfL\", \"--connect-timeout 3\", \"--retry 3\" }\ncommand_timeout = 300\nOPENWRT_ARCH = nil\nDISTRIB_ARCH = nil\nOPENWRT_BOARD = nil\n\nCACHE_PATH = \"/tmp/etc/\" .. appname .. \"_tmp\"\nLOG_FILE = \"/tmp/log/\" .. appname .. \".log\"\nTMP_PATH = \"/tmp/etc/\" .. appname\nTMP_IFACE_PATH = TMP_PATH .. \"/iface\"\n\nfunction log(...)\n\tlocal result = os.date(\"%Y-%m-%d %H:%M:%S: \") .. table.concat({...}, \" \")\n\tlocal f, err = io.open(LOG_FILE, \"a\")\n\tif f and err == nil then\n\t\tf:write(result .. \"\\n\")\n\t\tf:close()\n\tend\nend\n\nfunction is_js_luci()\n\treturn sys.call('[ -f \"/www/luci-static/resources/uci.js\" ]') == 0\nend\n\nfunction is_old_uci()\n\treturn sys.call(\"grep -E 'require[ \\t]*\\\"uci\\\"' /usr/lib/lua/luci/model/uci.lua >/dev/null 2>&1\") == 0\nend\n\nfunction uci_save(cursor, config, commit, apply)\n\tif is_old_uci() then\n\t\tcursor:save(config)\n\t\tif commit then\n\t\t\tcursor:commit(config)\n\t\t\tif apply then\n\t\t\t\tsys.call(\"/etc/init.d/\" .. config .. \" reload > /dev/null 2>&1 &\")\n\t\t\tend\n\t\tend\n\telse\n\t\tcommit = true\n\t\tif commit then\n\t\t\tif apply then\n\t\t\t\tcursor:commit(config)\n\t\t\telse\n\t\t\t\tsh_uci_commit(config)\n\t\t\tend\n\t\tend\n\tend\nend\n\nfunction sh_uci_get(config, section, option)\n\tlocal _, val = exec_call(string.format(\"uci -q get %s.%s.%s\", config, section, option))\n\treturn val\nend\n\nfunction sh_uci_set(config, section, option, val, commit)\n\texec_call(string.format(\"uci -q set %s.%s.%s=\\\"%s\\\"\", config, section, option, val))\n\tif commit then sh_uci_commit(config) end\nend\n\nfunction sh_uci_del(config, section, option, commit)\n\texec_call(string.format(\"uci -q delete %s.%s.%s\", config, section, option))\n\tif commit then sh_uci_commit(config) end\nend\n\nfunction sh_uci_add_list(config, section, option, val, commit)\n\texec_call(string.format(\"uci -q del_list %s.%s.%s=\\\"%s\\\"\", config, section, option, val))\n\texec_call(string.format(\"uci -q add_list %s.%s.%s=\\\"%s\\\"\", config, section, option, val))\n\tif commit then sh_uci_commit(config) end\nend\n\nfunction sh_uci_commit(config)\n\texec_call(string.format(\"uci -q commit %s\", config))\nend\n\nfunction set_cache_var(key, val)\n\tsys.call(string.format('. /usr/share/passwall/utils.sh ; set_cache_var %s \"%s\"', key, val))\nend\n\nfunction get_cache_var(key)\n\tlocal val = sys.exec(string.format('. /usr/share/passwall/utils.sh ; echo -n $(get_cache_var %s)', key))\n\tif val == \"\" then val = nil end\n\treturn val\nend\n\nfunction get_new_port()\n\tlocal cmd_format = \". /usr/share/passwall/utils.sh ; echo -n $(get_new_port %s tcp,udp)\"\n\treturn tonumber(sys.exec(string.format(cmd_format, \"auto\")))\nend\n\nfunction exec_call(cmd)\n\tmath.randomseed(os.time())\n\tlocal tag = \"\\x01__RC__\" .. tostring(math.random(100000, 999999)) .. \"\\x01\"\n\tlocal f = io.popen('(' .. cmd .. '); printf \"\\\\n' .. tag .. '%d\" \"$?\"')\n\tlocal out = f:read(\"*a\") or \"\"\n\tf:close()\n\tlocal rc = out:match(tag .. \"(%d+)%s*$\")\n\tif not rc then\n\t\treturn 255, trim(out)\n\tend\n\tout = out:gsub(\"\\n?\" .. tag .. \"%d+%s*$\", \"\")\n\treturn tonumber(rc), trim(out)\nend\n\nfunction base64Decode(text)\n\tif not text then return '' end\n\tlocal encoded = text:gsub(\"%z\", \"\"):gsub(\"%c\", \"\"):gsub(\"_\", \"/\"):gsub(\"-\", \"+\")\n\tlocal mod4 = #encoded % 4\n\tencoded = encoded .. string.sub('====', mod4 + 1)\n\tlocal result = nixio.bin.b64decode(encoded)\n\tif result then\n\t\treturn result:gsub(\"%z\", \"\")\n\telse\n\t\treturn text\n\tend\nend\n\nfunction base64Encode(text)\n\tif not text then return nil end\n\treturn nixio.bin.b64encode(text)\nend\n\nfunction UrlEncode(szText)\n\treturn szText:gsub(\"([^%w%-_%.%~])\", function(c)\n\t\treturn string.format(\"%%%02X\", string.byte(c))\n\tend)\nend\n\nfunction UrlDecode(szText)\n\treturn szText and szText:gsub(\"%+\", \" \"):gsub(\"%%(%x%x)\", function(h)\n\t\treturn string.char(tonumber(h, 16))\n\tend) or nil\nend\n\n--提取URL中的域名和端口(no ip)\nfunction get_domain_port_from_url(url)\n\tlocal scheme, domain, port = string.match(url, \"^(https?)://([%w%.%-]+):?(%d*)\")\n\tif not domain then\n\t\tscheme, domain, port = string.match(url, \"^(https?)://(%b[])([^:/]*)/?\")\n\tend\n\tif not domain then return nil, nil end\n\tif domain:sub(1, 1) == \"[\" then domain = domain:sub(2, -2) end\n\tport = port ~= \"\" and tonumber(port) or (scheme == \"https\" and 443 or 80)\n\tif datatypes.ipaddr(domain) or datatypes.ip6addr(domain) then return nil, nil end\n\treturn domain, port\nend\n\n--解析域名\nfunction domainToIPv4(domain, dns)\n\tlocal Dns = dns or \"223.5.5.5\"\n\tlocal IPs = luci.sys.exec('nslookup %s %s | awk \\'/^Name:/{getline; if ($1 == \"Address:\") print $2}\\'' % { domain, Dns })\n\tfor IP in string.gmatch(IPs, \"%S+\") do\n\t\tif datatypes.ipaddr(IP) and not datatypes.ip6addr(IP) then return IP end\n\tend\n\treturn nil\nend\n\nfunction curl_base(url, file, args)\n\tif not args then args = {} end\n\tif file then\n\t\targs[#args + 1] = \"-o \" .. file\n\tend\n\tlocal cmd = string.format('curl %s \"%s\"', table_join(args), url)\n\treturn exec_call(cmd)\nend\n\nfunction curl_proxy(url, file, args)\n\t--使用代理\n\tlocal socks_server = get_cache_var(\"GLOBAL_TCP_SOCKS_server\")\n\tif socks_server and socks_server ~= \"\" then\n\t\tif not args then args = {} end\n\t\tlocal tmp_args = clone(args)\n\t\ttmp_args[#tmp_args + 1] = \"-x socks5h://\" .. socks_server\n\t\treturn curl_base(url, file, tmp_args)\n\tend\n\treturn nil, nil\nend\n\nfunction curl_logic(url, file, args)\n\tlocal return_code, result = curl_proxy(url, file, args)\n\tif not return_code or return_code ~= 0 then\n\t\treturn_code, result = curl_base(url, file, args)\n\tend\n\treturn return_code, result\nend\n\nfunction curl_direct(url, file, args)\n\t--直连访问\n\tlocal chn_list = uci:get(appname, \"@global[0]\", \"chn_list\") or \"direct\"\n\tlocal Dns = (chn_list == \"proxy\") and \"1.1.1.1\" or \"223.5.5.5\"\n\tif not args then args = {} end\n\tlocal tmp_args = clone(args)\n\tlocal domain, port = get_domain_port_from_url(url)\n\tif domain then\n\t\tlocal ip = domainToIPv4(domain, Dns)\n\t\tif ip then\n\t\t\ttmp_args[#tmp_args + 1] = \"--resolve \" .. domain .. \":\" .. port .. \":\" .. ip\n\t\tend\n\tend\n\treturn curl_base(url, file, tmp_args)\nend\n\nfunction curl_auto(url, file, args)\n\tlocal localhost_proxy = uci:get(appname, \"@global[0]\", \"localhost_proxy\") or \"1\"\n\tif localhost_proxy == \"1\" then\n\t\treturn curl_base(url, file, args) -- 当路由器本机开启代理时，采用passwall规则进行访问\n\telse\n\t\tlocal return_code, result = curl_proxy(url, file, args)\n\t\tif not return_code or return_code ~= 0 then\n\t\t\treturn_code, result = curl_direct(url, file, args)\n\t\tend\n\t\treturn return_code, result\n\tend\nend\n\nfunction url(...)\n\tlocal url = string.format(\"admin/services/%s\", appname)\n\tlocal args = { ... }\n\tfor i, v in pairs(args) do\n\t\tif v ~= \"\" then\n\t\t\turl = url .. \"/\" .. v\n\t\tend\n\tend\n\treturn require \"luci.dispatcher\".build_url(url)\nend\n\nfunction trim(s)\n\tif type(s) ~= \"string\" then return \"\" end\n\tlocal i, j = 1, #s\n\twhile i <= j and s:byte(i) <= 32 do i = i + 1 end\n\twhile j >= i and s:byte(j) <= 32 do j = j - 1 end\n\tif i > j then return \"\" end\n\treturn s:sub(i, j)\nend\n\n-- 分割字符串\nfunction split(full, sep)\n\tif full then\n\t\tfull = full:gsub(\"%z\", \"\") -- 这里不是很清楚 有时候结尾带个\\0\n\t\tlocal off, result = 1, {}\n\t\twhile true do\n\t\t\tlocal nStart, nEnd = full:find(sep, off)\n\t\t\tif not nEnd then\n\t\t\t\tlocal res = string.sub(full, off, string.len(full))\n\t\t\t\tif #res > 0 then -- 过滤掉 \\0\n\t\t\t\t\ttable.insert(result, res)\n\t\t\t\tend\n\t\t\t\tbreak\n\t\t\telse\n\t\t\t\ttable.insert(result, string.sub(full, off, nStart - 1))\n\t\t\t\toff = nEnd + 1\n\t\t\tend\n\t\tend\n\t\treturn result\n\tend\n\treturn {}\nend\n\nfunction is_exist(table, value)\n\tfor index, k in ipairs(table) do\n\t\tif k == value then\n\t\t\treturn true\n\t\tend\n\tend\n\treturn false\nend\n\nfunction repeat_exist(table, value)\n\tlocal count = 0\n\tfor index, k in ipairs(table) do\n\t\tif k:find(\"-\") and k == value then\n\t\t\tcount = count + 1\n\t\tend\n\tend\n\tif count > 1 then\n\t\treturn true\n\tend\n\treturn false\nend\n\nfunction remove(...)\n\tfor index, value in ipairs({...}) do\n\t\tif value and #value > 0 and value ~= \"/\" then\n\t\t\tsys.call(string.format(\"rm -rf %s\", value))\n\t\tend\n\tend\nend\n\nfunction is_install(package)\n\tif package and #package > 0 then\n\t\tlocal file_path = \"/usr/lib/opkg/info\"\n\t\tlocal file_ext = \".control\"\n\t\tlocal has = sys.call(\"[ -d \" .. file_path .. \" ]\")\n\t\tif has ~= 0 then\n\t\t\tfile_path = \"/lib/apk/packages\"\n\t\t\tfile_ext = \".list\"\n\t\tend\n\t\treturn sys.call(string.format('[ -s \"%s/%s%s\" ]', file_path, package, file_ext)) == 0\n\tend\n\treturn false\nend\n\nfunction get_args(arg)\n\tlocal var = {}\n\tfor i, arg_k in pairs(arg) do\n\t\tif i > 0 then\n\t\t\tlocal v = arg[i + 1]\n\t\t\tif v then\n\t\t\t\tif repeat_exist(arg, v) == false then\n\t\t\t\t\tvar[arg_k] = v\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\treturn var\nend\n\nfunction get_function_args(arg)\n\tlocal var = nil\n\tif arg and #arg > 1 then\n\t\tlocal param = {}\n\t\tfor i = 2, #arg do\n\t\t\tparam[#param + 1] = arg[i]\n\t\tend\n\t\tvar = get_args(param)\n\tend\n\treturn var\nend\n\nfunction strToTable(str)\n\tif str == nil or type(str) ~= \"string\" then\n\t\treturn {}\n\tend\n\n\treturn loadstring(\"return \" .. str)()\nend\n\nfunction is_normal_node(e)\n\tif e and e.type and e.protocol and (e.protocol == \"_balancing\" or e.protocol == \"_shunt\" or e.protocol == \"_iface\" or e.protocol == \"_urltest\") then\n\t\treturn false\n\tend\n\treturn true\nend\n\nfunction is_special_node(e)\n\treturn is_normal_node(e) == false\nend\n\nfunction is_ip(val)\n\tlocal str = val:match(\"%[(.-)%]\") or val\n\treturn datatypes.ipaddr(str) or false\nend\n\nfunction is_ipv6(val)\n\tlocal str = val:match(\"%[(.-)%]\") or val\n\treturn datatypes.ip6addr(str) or false\nend\n\nfunction is_local_ip(ip)\n\tip = trim(ip):lower()\n\tip = ip:gsub(\"^[%w%d]+://\", \"\")   -- 去掉协议头\n\t\t:gsub(\"/.*$\", \"\")          -- 去掉路径\n\t\t:gsub(\"^%[\", \"\"):gsub(\"%]$\", \"\") -- 去掉IPv6方括号\n\t\t:gsub(\":%d+$\", \"\")         -- 去掉端口\n\treturn ip:match(\"^127%.\") or ip:match(\"^10%.\") or\n\t\tip:match(\"^172%.1[6-9]%.\") or ip:match(\"^172%.2[0-9]%.\") or\n\t\tip:match(\"^172%.3[0-1]%.\") or ip:match(\"^192%.168%.\") or\n\t\tip == \"::1\" or ip:match(\"^f[cd]\") or ip:match(\"^fe[89ab]\")\nend\n\nfunction is_ipv6addrport(val)\n\tlocal address, port = val:match(\"%[(.-)%]:([0-9]+)$\")\n\tif address and datatypes.ip6addr(address) and datatypes.port(port) then\n\t\treturn true\n\tend\n\treturn false\nend\n\nfunction get_ipv6_only(val)\n\tlocal result = \"\"\n\tlocal inner = val:match(\"%[(.-)%]\") or val\n\tif datatypes.ip6addr(inner) then\n\t\tresult = inner\n\tend\n\treturn result\nend\n\nfunction get_ipv6_full(val)\n\tlocal result = \"\"\n\tif is_ipv6(val) then\n\t\tresult = val\n\t\tif not val:match(\"%[.-%]\") then\n\t\t\tresult = \"[\" .. result .. \"]\"\n\t\tend\n\tend\n\treturn result\nend\n\nfunction get_ip_type(val)\n\tif is_ipv6(val) then\n\t\treturn \"6\"\n\telseif datatypes.ip4addr(val) then\n\t\treturn \"4\"\n\tend\n\treturn \"\"\nend\n\nfunction is_mac(val)\n\treturn datatypes.macaddr(val)\nend\n\nfunction ip_or_mac(val)\n\tif val then\n\t\tif get_ip_type(val) == \"4\" then\n\t\t\treturn \"ip\"\n\t\tend\n\t\tif is_mac(val) then\n\t\t\treturn \"mac\"\n\t\tend\n\tend\n\treturn \"\"\nend\n\nfunction iprange(val)\n\tif val then\n\t\tlocal ipStart, ipEnd = val:match(\"^([^/]+)-([^/]+)$\")\n\t\tif (ipStart and datatypes.ip4addr(ipStart)) and (ipEnd and datatypes.ip4addr(ipEnd)) then\n\t\t\treturn true\n\t\tend\n\tend\n\treturn false\nend\n\nfunction get_domain_from_url(url)\n\tlocal domain = string.match(url, \"//([^/]+)\")\n\tif domain then\n\t\treturn domain\n\tend\n\treturn url\nend\n\nfunction get_valid_nodes()\n\tlocal show_node_info = uci_get_type(\"global_other\", \"show_node_info\", \"0\")\n\tlocal nodes = {}\n\tlocal default_nodes = {}\n\tlocal other_nodes = {}\n\tuci:foreach(appname, \"nodes\", function(e)\n\t\te.id = e[\".name\"]\n\t\tif e.type and e.remarks then\n\t\t\tlocal type_name = e.type\n\t\t\tif e.type == \"sing-box\" then type_name = \"Sing-Box\" end\n\t\t\tif e.protocol and (e.protocol == \"_balancing\" or e.protocol == \"_shunt\" or e.protocol == \"_iface\" or e.protocol == \"_urltest\") then\n\t\t\t\te[\"remark\"] = trim(\"%s：[%s]\" % {type_name .. \" \" .. i18n.translatef(e.protocol), e.remarks})\n\t\t\t\te[\"node_type\"] = \"special\"\n\t\t\t\tif not e.group or e.group == \"\" then\n\t\t\t\t\tdefault_nodes[#default_nodes + 1] = e\n\t\t\t\telse\n\t\t\t\t\tother_nodes[#other_nodes + 1] = e\n\t\t\t\tend\n\t\t\tend\n\t\t\tlocal port = e.port or e.hysteria_hop or e.hysteria2_hop\n\t\t\tif port and e.address then\n\t\t\t\tlocal address = e.address\n\t\t\t\tif is_ip(address) or datatypes.hostname(address) then\n\t\t\t\t\tif (e.type == \"sing-box\" or e.type == \"Xray\") and e.protocol then\n\t\t\t\t\t\tlocal protocol = e.protocol\n\t\t\t\t\t\tif protocol == \"vmess\" then\n\t\t\t\t\t\t\tprotocol = \"VMess\"\n\t\t\t\t\t\telseif protocol == \"vless\" then\n\t\t\t\t\t\t\tprotocol = \"VLESS\"\n\t\t\t\t\t\telseif protocol == \"shadowsocks\" then\n\t\t\t\t\t\t\tprotocol = \"SS\"\n\t\t\t\t\t\telseif protocol == \"shadowsocksr\" then\n\t\t\t\t\t\t\tprotocol = \"SSR\"\n\t\t\t\t\t\telseif protocol == \"wireguard\" then\n\t\t\t\t\t\t\tprotocol = \"WG\"\n\t\t\t\t\t\telseif protocol == \"hysteria\" then\n\t\t\t\t\t\t\tprotocol = \"HY\"\n\t\t\t\t\t\telseif protocol == \"hysteria2\" then\n\t\t\t\t\t\t\tprotocol = \"HY2\"\n\t\t\t\t\t\telseif protocol == \"anytls\" then\n\t\t\t\t\t\t\tprotocol = \"AnyTLS\"\n\t\t\t\t\t\telseif protocol == \"ssh\" then\n\t\t\t\t\t\t\tprotocol = \"SSH\"\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tprotocol = protocol:gsub(\"^%l\",string.upper)\n\t\t\t\t\t\tend\n\t\t\t\t\t\ttype_name = type_name .. \" \" .. protocol\n\t\t\t\t\tend\n\t\t\t\t\tif is_ipv6(address) then address = get_ipv6_full(address) end\n\t\t\t\t\te[\"remark\"] = trim(\"%s：[%s]\" % {type_name, e.remarks})\n\t\t\t\t\tif show_node_info == \"1\" then\n\t\t\t\t\t\tport = port:gsub(\":\", \"-\")\n\t\t\t\t\t\te[\"remark\"] = trim(\"%s：[%s] %s:%s\" % {type_name, e.remarks, address, port})\n\t\t\t\t\tend\n\t\t\t\t\te.node_type = \"normal\"\n\t\t\t\t\tif not e.group or e.group == \"\" then\n\t\t\t\t\t\tdefault_nodes[#default_nodes + 1] = e\n\t\t\t\t\telse\n\t\t\t\t\t\tother_nodes[#other_nodes + 1] = e\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\n\tfor i = 1, #default_nodes do nodes[#nodes + 1] = default_nodes[i] end\n\tfor i = 1, #other_nodes do nodes[#nodes + 1] = other_nodes[i] end\n\treturn nodes\nend\n\nfunction get_node_list()\n\tlocal node_list = {\n\t\tsocks_list = {},\n\t\tnormal_list = {},\n\t}\n\tuci:foreach(appname, \"socks\", function(s)\n\t\tif s.enabled == \"1\" and s.node then\n\t\t\tnode_list.socks_list[#node_list.socks_list + 1] = {\n\t\t\t\tid = \"Socks_\" .. s[\".name\"],\n\t\t\t\tremark = i18n.translate(\"Socks Config\") .. \" [\" .. s.port .. i18n.translate(\"Port\") .. \"]\",\n\t\t\t\tgroup = \"Socks\"\n\t\t\t}\n\t\tend\n\tend)\n\tfor k, e in ipairs(get_valid_nodes()) do\n\t\tif e.node_type == \"normal\" then\n\t\t\tnode_list.normal_list[#node_list.normal_list + 1] = {\n\t\t\t\tid = e[\".name\"],\n\t\t\t\tremark = e[\"remark\"],\n\t\t\t\ttype = e[\"type\"],\n\t\t\t\tchain_proxy = e[\"chain_proxy\"],\n\t\t\t\tgroup = e[\"group\"]\n\t\t\t}\n\t\tend\n\t\tif e.protocol and e.protocol:find(\"^_\") then\n\t\t\tlocal proto = e.protocol:sub(2)\n\t\t\tif not node_list[proto .. \"_list\"] then\n\t\t\t\tnode_list[proto .. \"_list\"] = {}\n\t\t\tend\n\t\t\tnode_list[proto .. \"_list\"][#node_list[proto .. \"_list\"] + 1] = {\n\t\t\t\tid = e[\".name\"],\n\t\t\t\tremark = e[\"remark\"],\n\t\t\t\tgroup = e[\"group\"],\n\t\t\t\to = e,\n\t\t\t}\n\t\tend\n\tend\n\treturn node_list\nend\n\nfunction get_node_remarks(n)\n\tlocal remarks = \"\"\n\tif n then\n\t\tlocal type_name = n.type\n\t\tif n.type == \"sing-box\" then type_name = \"Sing-Box\" end\n\t\tif n.protocol and (n.protocol == \"_balancing\" or n.protocol == \"_shunt\" or n.protocol == \"_iface\" or n.protocol == \"_urltest\") then\n\t\t\tremarks = trim(\"%s：[%s]\" % {type_name .. \" \" .. i18n.translatef(n.protocol), n.remarks})\n\t\telse\n\t\t\tif (n.type == \"sing-box\" or n.type == \"Xray\") and n.protocol then\n\t\t\t\tlocal protocol = n.protocol\n\t\t\t\tif protocol == \"vmess\" then\n\t\t\t\t\tprotocol = \"VMess\"\n\t\t\t\telseif protocol == \"vless\" then\n\t\t\t\t\tprotocol = \"VLESS\"\n\t\t\t\telseif protocol == \"shadowsocks\" then\n\t\t\t\t\tprotocol = \"SS\"\n\t\t\t\telseif protocol == \"shadowsocksr\" then\n\t\t\t\t\tprotocol = \"SSR\"\n\t\t\t\telseif protocol == \"wireguard\" then\n\t\t\t\t\tprotocol = \"WG\"\n\t\t\t\telseif protocol == \"hysteria\" then\n\t\t\t\t\tprotocol = \"HY\"\n\t\t\t\telseif protocol == \"hysteria2\" then\n\t\t\t\t\tprotocol = \"HY2\"\n\t\t\t\telseif protocol == \"anytls\" then\n\t\t\t\t\tprotocol = \"AnyTLS\"\n\t\t\t\telseif protocol == \"ssh\" then\n\t\t\t\t\tprotocol = \"SSH\"\n\t\t\t\telse\n\t\t\t\t\tprotocol = protocol:gsub(\"^%l\",string.upper)\n\t\t\t\tend\n\t\t\t\ttype_name = type_name .. \" \" .. protocol\n\t\t\tend\n\t\t\tremarks = trim(\"%s：[%s]\" % {type_name, n.remarks})\n\t\tend\n\tend\n\treturn remarks\nend\n\nfunction get_full_node_remarks(n)\n\tlocal remarks = get_node_remarks(n)\n\tif #remarks > 0 then\n\t\tlocal port = n.port or n.hysteria_hop or n.hysteria2_hop\n\t\tif n.address and port then\n\t\t\tport = port:gsub(\":\", \"-\")\n\t\t\tremarks = remarks .. \" \" .. n.address .. \":\" .. port\n\t\tend\n\tend\n\treturn remarks\nend\n\nfunction gen_uuid(format)\n\tlocal uuid = sys.exec(\"echo -n $(cat /proc/sys/kernel/random/uuid)\")\n\tif format == nil then\n\t\tuuid = string.gsub(uuid, \"-\", \"\")\n\tend\n\treturn uuid\nend\n\nfunction gen_short_uuid()\n\treturn sys.exec(\"echo -n $(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8)\")\nend\n\nfunction uci_get_type(type, config, default)\n\tlocal value = uci:get_first(appname, type, config, default) or sys.exec(\"echo -n $(uci -q get \" .. appname .. \".@\" .. type ..\"[0].\" .. config .. \")\")\n\tif (value == nil or value == \"\") and (default and default ~= \"\") then\n\t\tvalue = default\n\tend\n\treturn value\nend\n\nfunction uci_get_type_id(id, config, default)\n\tlocal value = uci:get(appname, id, config, default) or sys.exec(\"echo -n $(uci -q get \" .. appname .. \".\" .. id .. \".\" .. config .. \")\")\n\tif (value == nil or value == \"\") and (default and default ~= \"\") then\n\t\tvalue = default\n\tend\n\treturn value\nend\n\nlocal function chmod_755(file)\n\tif file and file ~= \"\" then\n\t\tif not fs.access(file, \"rwx\", \"rx\", \"rx\") then\n\t\t\tfs.chmod(file, 755)\n\t\tend\n\tend\nend\n\nfunction get_customed_path(e)\n\treturn uci_get_type(\"global_app\", e .. \"_file\")\nend\n\nfunction finded_com(e)\n\tlocal bin = get_app_path(e)\n\tif not bin then return end\n\tlocal s = luci.sys.exec('echo -n $(type -t -p \"%s\" | head -n1)' % { bin })\n\tif s == \"\" then\n\t\ts = nil\n\tend\n\treturn s\nend\n\nfunction finded(e)\n\treturn luci.sys.exec('echo -n $(type -t -p \"/bin/%s\" -p \"/usr/bin/%s\" \"%s\" | head -n1)' % {e, e, e})\nend\n\nfunction is_finded(e)\n\treturn finded(e) ~= \"\" and true or false\nend\n\nfunction clone(org)\n\tlocal function copy(org, res)\n\t\tfor k,v in pairs(org) do\n\t\t\tif type(v) ~= \"table\" then\n\t\t\t\tres[k] = v;\n\t\t\telse\n\t\t\t\tres[k] = {};\n\t\t\t\tcopy(v, res[k])\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal res = {}\n\tcopy(org, res)\n\treturn res\nend\n\nfunction get_bin_version_cache(file, cmd)\n\tsys.call(\"mkdir -p /tmp/etc/passwall_tmp\")\n\tif fs.access(file) then\n\t\tchmod_755(file)\n\t\tlocal md5 = sys.exec(\"echo -n $(md5sum \" .. file .. \" | awk '{print $1}')\")\n\t\tif fs.access(\"/tmp/etc/passwall_tmp/\" .. md5) then\n\t\t\treturn sys.exec(\"echo -n $(cat /tmp/etc/passwall_tmp/%s)\" % md5)\n\t\telse\n\t\t\tlocal version = sys.exec(string.format(\"echo -n $(%s %s)\", file, cmd))\n\t\t\tif version and version ~= \"\" then\n\t\t\t\tsys.call(\"echo '\" .. version .. \"' > \" .. \"/tmp/etc/passwall_tmp/\" .. md5)\n\t\t\t\treturn version\n\t\t\tend\n\t\tend\n\tend\n\treturn \"\"\nend\n\nfunction get_app_path(app_name)\n\tif com[app_name] then\n\t\tlocal def_path = com[app_name].default_path\n\t\tlocal path = uci_get_type(\"global_app\", app_name:gsub(\"%-\",\"_\") .. \"_file\")\n\t\tpath = path and (#path>0 and path or def_path) or def_path\n\t\treturn path\n\tend\nend\n\nfunction get_app_version(app_name, file)\n\tif file == nil then file = get_app_path(app_name) end\n\treturn get_bin_version_cache(file, com[app_name].cmd_version)\nend\n\nlocal function is_file(path)\n\tif path and #path > 1 then\n\t\tif sys.exec('[ -f \"%s\" ] && echo -n 1' % path) == \"1\" then\n\t\t\treturn true\n\t\tend\n\tend\n\treturn nil\nend\n\nlocal function is_dir(path)\n\tif path and #path > 1 then\n\t\tif sys.exec('[ -d \"%s\" ] && echo -n 1' % path) == \"1\" then\n\t\t\treturn true\n\t\tend\n\tend\n\treturn nil\nend\n\nlocal function get_final_dir(path)\n\tif is_dir(path) then\n\t\treturn path\n\telse\n\t\treturn get_final_dir(fs.dirname(path))\n\tend\nend\n\nlocal function get_free_space(dir)\n\tif dir == nil then dir = \"/\" end\n\tif sys.call(\"df -k \" .. dir .. \" >/dev/null 2>&1\") == 0 then\n\t\treturn tonumber(sys.exec(\"echo -n $(df -k \" .. dir .. \" | awk 'NR>1' | awk '{print $4}')\"))\n\tend\n\treturn 0\nend\n\nlocal function get_file_space(file)\n\tif file == nil then return 0 end\n\tif fs.access(file) then\n\t\treturn tonumber(sys.exec(\"echo -n $(du -k \" .. file .. \" | awk '{print $1}')\"))\n\tend\n\treturn 0\nend\n\nfunction _unpack(t, i)\n\ti = i or 1\n\tif t[i] ~= nil then return t[i], _unpack(t, i + 1) end\nend\n\nfunction table_join(t, s)\n\tif not s then\n\t\ts = \" \"\n\tend\n\tlocal str = \"\"\n\tfor index, value in ipairs(t) do\n\t\tstr = str .. t[index] .. (index == #t and \"\" or s)\n\tend\n\treturn str\nend\n\nlocal function exec(cmd, args, writer, timeout)\n\tlocal os = require \"os\"\n\tlocal nixio = require \"nixio\"\n\n\tlocal fdi, fdo = nixio.pipe()\n\tlocal pid = nixio.fork()\n\n\tif pid > 0 then\n\t\tfdo:close()\n\n\t\tif writer or timeout then\n\t\t\tlocal starttime = os.time()\n\t\t\twhile true do\n\t\t\t\tif timeout and os.difftime(os.time(), starttime) >= timeout then\n\t\t\t\t\tnixio.kill(pid, nixio.const.SIGTERM)\n\t\t\t\t\treturn 1\n\t\t\t\tend\n\n\t\t\t\tif writer then\n\t\t\t\t\tlocal buffer = fdi:read(2048)\n\t\t\t\t\tif buffer and #buffer > 0 then\n\t\t\t\t\t\twriter(buffer)\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\tlocal wpid, stat, code = nixio.waitpid(pid, \"nohang\")\n\n\t\t\t\tif wpid and stat == \"exited\" then return code end\n\n\t\t\t\tif not writer and timeout then nixio.nanosleep(1) end\n\t\t\tend\n\t\telse\n\t\t\tlocal wpid, stat, code = nixio.waitpid(pid)\n\t\t\treturn wpid and stat == \"exited\" and code\n\t\tend\n\telseif pid == 0 then\n\t\tnixio.dup(fdo, nixio.stdout)\n\t\tfdi:close()\n\t\tfdo:close()\n\t\tnixio.exece(cmd, args, nil)\n\t\tnixio.stdout:close()\n\t\tos.exit(1)\n\tend\nend\n\nfunction compare_versions(ver1, comp, ver2)\n\tlocal table = table\n\n\tif not ver1 then ver1 = \"\" end\n\tif not ver2 then ver2 = \"\" end\n\n\tlocal av1 = util.split(ver1, \"[%.%-]\", nil, true)\n\tlocal av2 = util.split(ver2, \"[%.%-]\", nil, true)\n\n\tlocal max = table.getn(av1)\n\tlocal n2 = table.getn(av2)\n\tif (max < n2) then max = n2 end\n\n\tfor i = 1, max, 1 do\n\t\tlocal s1 = tonumber(av1[i] or 0) or 0\n\t\tlocal s2 = tonumber(av2[i] or 0) or 0\n\n\t\tif comp == \"~=\" and (s1 ~= s2) then return true end\n\t\tif (comp == \"<\" or comp == \"<=\") and (s1 < s2) then return true end\n\t\tif (comp == \">\" or comp == \">=\") and (s1 > s2) then return true end\n\t\tif (s1 ~= s2) then return false end\n\tend\n\n\treturn not (comp == \"<\" or comp == \">\")\nend\n\nlocal function auto_get_arch()\n\tlocal arch = nixio.uname().machine or \"\"\n\tif not OPENWRT_ARCH and fs.access(\"/usr/lib/os-release\") then\n\t\tOPENWRT_ARCH = sys.exec(\"echo -n $(grep 'OPENWRT_ARCH' /usr/lib/os-release | awk -F '[\\\\042\\\\047]' '{print $2}')\")\n\t\tOPENWRT_BOARD = sys.exec(\"echo -n $(grep 'OPENWRT_BOARD' /usr/lib/os-release | awk -F '[\\\\042\\\\047]' '{print $2}')\")\n\t\tif OPENWRT_ARCH == \"\" then OPENWRT_ARCH = nil end\n\t\tif OPENWRT_BOARD == \"\" then OPENWRT_BOARD = nil end\n\tend\n\tif not DISTRIB_ARCH and fs.access(\"/etc/openwrt_release\") then\n\t\tDISTRIB_ARCH = sys.exec(\"echo -n $(grep 'DISTRIB_ARCH' /etc/openwrt_release | awk -F '[\\\\042\\\\047]' '{print $2}')\")\n\t\tif DISTRIB_ARCH == \"\" then DISTRIB_ARCH = nil end\n\tend\n\n\tif arch:match(\"^i[%d]86$\") then\n\t\tarch = \"x86\"\n\telseif arch:match(\"armv5\") then  -- armv5l\n\t\tarch = \"armv5\"\n\telseif arch:match(\"armv6\") then\n\t\tarch = \"armv6\"\n\telseif arch:match(\"armv7\") then  -- armv7l\n\t\tarch = \"armv7\"\n\tend\n\n\tif OPENWRT_ARCH or DISTRIB_ARCH then\n\t\tif arch == \"mips\" then\n\t\t\tif OPENWRT_ARCH and OPENWRT_ARCH:match(\"mipsel\") == \"mipsel\"\n\t\t\tor DISTRIB_ARCH and DISTRIB_ARCH:match(\"mipsel\") == \"mipsel\" then\n\t\t\t\tarch = \"mipsel\"\n\t\t\tend\n\t\telseif arch == \"armv7\" then\n\t\t\tif OPENWRT_ARCH and not OPENWRT_ARCH:match(\"vfp\") and not OPENWRT_ARCH:match(\"neon\")\n\t\t\tor DISTRIB_ARCH and not DISTRIB_ARCH:match(\"vfp\") and not DISTRIB_ARCH:match(\"neon\") then\n\t\t\t\tarch = \"armv5\"\n\t\t\tend\n\t\tend\n\tend\n\n\tif arch == \"aarch64\" and OPENWRT_BOARD and OPENWRT_BOARD:match(\"rockchip\") ~= nil then\n\t\tarch = \"rockchip\"\n\tend\n\n\treturn trim(arch)\nend\n\nfunction parseURL(url_str)\n\tlocal res = {}\n\n\t-- 1. Get Scheme (http://)\n\tlocal rest = url_str\n\tlocal scheme, s_rest = url_str:match(\"^([%w%.%-%+]+)://(.+)$\")\n\tif scheme then\n\t\tres.protocol = scheme\n\t\trest = s_rest\n\tend\n\n\t-- 2. Get Authority (user:pass@host:port) and Path\n\tlocal authority, path = rest:match(\"^([^/]+)(.*)$\")\n\tif path and path ~= \"\" then\n\t\tres.pathname = path:match(\"^([^?#]*)\")\n\tend\n\n\t-- 3. Process Auth info (user:pass@)\n\t-- Use [^@]+ to match the content before the leftmost @.\n\tlocal user_info, host_port = authority:match(\"^([^@]+)@(.+)$\")\n\tif user_info then\n\t\tlocal u, p = user_info:match(\"^([^:]+):?(.*)$\")\n\t\tres.username = u or \"\"\n\t\tres.password = p or \"\"\n\telse\n\t\thost_port = authority\n\tend\n\n\t-- 4. Handles Host and Port (IPv6 compatible)\n\t-- First look for square brackets [], if not found, then look for regular colons.\n\tlocal ipv6_host, ipv6_port = host_port:match(\"^%[(.+)%]:(%d+)$\")\n\tif ipv6_host then\n\t\tres.hostname = ipv6_host\n\t\tres.port = tonumber(ipv6_port)\n\telse\n\t\t-- Check if it's an IPv6 address with parentheses but no port number: [2001:db8::1]\n\t\tlocal pure_ipv6 = host_port:match(\"^%[(.+)%]$\")\n\t\tif pure_ipv6 then\n\t\t\tres.hostname = pure_ipv6\n\t\telse\n\t\t\t-- IPv4 or hostname match\n\t\t\tlocal h, p = host_port:match(\"^([^:]+):(%d+)$\")\n\t\t\tif h and p then\n\t\t\t\tres.hostname = h\n\t\t\t\tres.port = tonumber(p)\n\t\t\telse\n\t\t\t\tres.hostname = host_port\n\t\t\tend\n\t\tend\n\tend\n\n\tres.host = host_port\n\treturn res\nend\n\nfunction parseDoH(doh_str)\n\tdoh_str = trim(doh_str)\n\tif doh_str == \"\" then return nil end\n\n\tlocal url_part, ip_part\n\tif doh_str:find(\",\", 1, true) then\n\t\turl_part, ip_part = doh_str:match(\"^([^,]+),(.+)$\")\n\telse\n\t\turl_part = doh_str\n\tend\n\n\tlocal res = parseURL(url_part)\n\tif not res then return nil end\n\n\tres.url = url_part\n\tif ip_part and ip_part ~= \"\" and is_ip(ip_part) then\n\t\tres.hostip = ip_part\n\tend\n\n\treturn res\nend\n\nlocal default_file_tree = {\n\tx86_64  = \"amd64\",\n\tx86     = \"386\",\n\taarch64 = \"arm64\",\n\trockchip = \"arm64\",\n\tmips    = \"mips\",\n\tmips64  = \"mips64\",\n\tmipsel  = \"mipsel\",\n\tmips64el = \"mips64el\",\n\tarmv5   = \"arm.*5\",\n\tarmv6   = \"arm.*6[^4]*\",\n\tarmv7   = \"arm.*7\",\n\tarmv8   = \"arm64\",\n\triscv64 = \"riscv64\"\n}\n\nlocal function get_api_json(url)\n\tlocal jsonc = require \"luci.jsonc\"\n\tlocal return_code, content = curl_auto(url, nil, curl_args)\n\tif return_code ~= 0 or content == \"\" then return {} end\n\treturn jsonc.parse(content) or {}\nend\n\nlocal function check_path(app_name)\n\tlocal path = get_app_path(app_name) or \"\"\n\tif path == \"\" then\n\t\treturn {\n\t\t\tcode = 1,\n\t\t\terror = i18n.translatef(\"You did not fill in the %s path. Please save and apply then update manually.\", app_name)\n\t\t}\n\tend\n\treturn {\n\t\tcode = 0,\n\t\tapp_path = path\n\t}\nend\n\nfunction to_check(arch, app_name)\n\tlocal result = check_path(app_name)\n\tif result.code ~= 0 then\n\t\treturn result\n\tend\n\n\tif not arch or arch == \"\" then arch = auto_get_arch() end\n\n\tlocal file_tree = com[app_name].file_tree[arch] or default_file_tree[arch] or \"\"\n\n\tif file_tree == \"\" then\n\t\treturn {\n\t\t\tcode = 1,\n\t\t\terror = i18n.translate(\"Can't determine ARCH, or ARCH not supported.\")\n\t\t}\n\tend\n\n\tlocal local_version = get_app_version(app_name)\n\tlocal match_file_name = string.format(com[app_name].match_fmt_str, file_tree)\n\tlocal json = get_api_json(com[app_name]:get_url())\n\n\tif #json > 0 then\n\t\tjson = json[1]\n\tend\n\n\tif json.tag_name == nil then\n\t\treturn {\n\t\t\tcode = 1,\n\t\t\terror = i18n.translate(\"Get remote version info failed.\")\n\t\t}\n\tend\n\n\tlocal remote_version = json.tag_name\n\tif com[app_name].remote_version_str_replace then\n\t\tremote_version = remote_version:gsub(com[app_name].remote_version_str_replace, \"\")\n\tend\n\tlocal has_update = compare_versions(local_version:match(\"[^v]+\"), \"<\", remote_version:match(\"[^v]+\"))\n--[[\n\tif not has_update then\n\t\treturn {\n\t\t\tcode = 0,\n\t\t\tlocal_version = local_version,\n\t\t\tremote_version = remote_version\n\t\t}\n\tend\n]]--\n\tlocal asset = {}\n\tfor _, v in ipairs(json.assets) do\n\t\tif v.name and v.name:match(match_file_name) then\n\t\t\tasset = v\n\t\t\tbreak\n\t\tend\n\tend\n\tif not asset.browser_download_url then\n\t\treturn {\n\t\t\tcode = 1,\n\t\t\tlocal_version = local_version,\n\t\t\tremote_version = remote_version,\n\t\t\thtml_url = json.html_url,\n\t\t\tdata = asset,\n\t\t\terror = i18n.translate(\"New version found, but failed to get new version download url.\")\n\t\t}\n\tend\n\n\treturn {\n\t\tcode = 0,\n\t\thas_update = has_update,\n\t\tlocal_version = local_version,\n\t\tremote_version = remote_version,\n\t\thtml_url = json.html_url,\n\t\tdata = asset\n\t}\nend\n\nfunction to_download(app_name, url, size)\n\tlocal result = check_path(app_name)\n\tif result.code ~= 0 then\n\t\treturn result\n\tend\n\n\tif not url or url == \"\" then\n\t\treturn {code = 1, error = i18n.translate(\"Download url is required.\")}\n\tend\n\n\tsys.call(\"/bin/rm -f /tmp/\".. app_name ..\"_download.*\")\n\n\tlocal tmp_file = trim(util.exec(\"mktemp -u -t \".. app_name ..\"_download.XXXXXX\"))\n\n\tif size then\n\t\tlocal kb1 = get_free_space(\"/tmp\")\n\t\tif tonumber(size) > tonumber(kb1) then\n\t\t\treturn {code = 1, error = i18n.translatef(\"%s not enough space.\", \"/tmp\")}\n\t\tend\n\tend\n\n\tlocal _curl_args = clone(curl_args)\n\ttable.insert(_curl_args, \"--speed-limit 51200 --speed-time 15 --max-time 300\")\n\n\tlocal return_code, result = curl_auto(url, tmp_file, _curl_args)\n\tresult = return_code == 0\n\n\tif not result then\n\t\texec(\"/bin/rm\", {\"-f\", tmp_file})\n\t\treturn {\n\t\t\tcode = 1,\n\t\t\terror = i18n.translatef(\"File download failed or timed out: %s\", url)\n\t\t}\n\tend\n\n\treturn {code = 0, file = tmp_file, zip = com[app_name].zipped }\nend\n\nfunction to_extract(app_name, file, subfix)\n\tlocal result = check_path(app_name)\n\tif result.code ~= 0 then\n\t\treturn result\n\tend\n\n\tif not file or file == \"\" or not fs.access(file) then\n\t\treturn {code = 1, error = i18n.translate(\"File path required.\")}\n\tend\n\n\tlocal tools_name\n\tif com[app_name].zipped then\n\t\tif not com[app_name].zipped_suffix or com[app_name].zipped_suffix == \"zip\" then\n\t\t\ttools_name = \"unzip\"\n\t\tend\n\t\tif com[app_name].zipped_suffix and com[app_name].zipped_suffix == \"tar.gz\" then\n\t\t\ttools_name = \"tar\"\n\t\tend\n\t\tif tools_name then\n\t\t\tif sys.exec(\"echo -n $(command -v %s)\" % { tools_name }) == \"\" then\n\t\t\t\texec(\"/bin/rm\", {\"-f\", file})\n\t\t\t\treturn {\n\t\t\t\t\tcode = 1,\n\t\t\t\t\terror = i18n.translate(\"Not installed %s, Can't unzip!\" % { tools_name })\n\t\t\t\t}\n\t\t\tend\n\t\tend\n\tend\n\n\tsys.call(\"/bin/rm -rf /tmp/\".. app_name ..\"_extract.*\")\n\n\tlocal new_file_size = get_file_space(file)\n\tlocal tmp_free_size = get_free_space(\"/tmp\")\n\tif tmp_free_size <= 0 or tmp_free_size <= new_file_size then\n\t\treturn {code = 1, error = i18n.translatef(\"%s not enough space.\", \"/tmp\")}\n\tend\n\n\tlocal tmp_dir = trim(util.exec(\"mktemp -d -t \".. app_name ..\"_extract.XXXXXX\"))\n\n\tlocal output = {}\n\n\tif tools_name then\n\t\tif tools_name == \"unzip\" then\n\t\t\tlocal bin = sys.exec(\"echo -n $(command -v unzip)\")\n\t\t\texec(bin, {\"-o\", file, app_name, \"-d\", tmp_dir}, function(chunk) output[#output + 1] = chunk end)\n\t\telseif tools_name == \"tar\" then\n\t\t\tlocal bin = sys.exec(\"echo -n $(command -v tar)\")\n\t\t\tif com[app_name].zipped_suffix == \"tar.gz\" then\n\t\t\t\texec(bin, {\"-zxf\", file, \"-C\", tmp_dir}, function(chunk) output[#output + 1] = chunk end)\n\t\t\t\tsys.call(\"/bin/mv -f \" .. tmp_dir .. \"/*/\" .. com[app_name].name:lower() .. \" \" .. tmp_dir)\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal files = util.split(table.concat(output))\n\n\texec(\"/bin/rm\", {\"-f\", file})\n\n\treturn {code = 0, file = tmp_dir}\nend\n\nfunction to_move(app_name,file)\n\tlocal result = check_path(app_name)\n\tif result.code ~= 0 then\n\t\treturn result\n\tend\n\n\tlocal app_path = result.app_path\n\tlocal bin_path = file\n\tlocal cmd_rm_tmp = \"/bin/rm -rf /tmp/\" .. app_name .. \"_download.*\"\n\tif fs.stat(file, \"type\") == \"dir\" then\n\t\tbin_path = file .. \"/\" .. com[app_name].name:lower()\n\t\tcmd_rm_tmp = \"/bin/rm -rf /tmp/\" .. app_name .. \"_extract.*\"\n\tend\n\n\tif not file or file == \"\" then\n\t\tsys.call(cmd_rm_tmp)\n\t\treturn {code = 1, error = i18n.translate(\"Client file is required.\")}\n\tend\n\n\tlocal new_version = get_app_version(app_name, bin_path)\n\tif new_version == \"\" then\n\t\tsys.call(cmd_rm_tmp)\n\t\treturn {\n\t\t\tcode = 1,\n\t\t\terror = i18n.translate(\"The client file is not suitable for current device.\") .. app_name .. \"__\" .. bin_path\n\t\t}\n\tend\n\n\tlocal flag = sys.call('pgrep -af \"passwall/.*'.. app_name ..'\" >/dev/null')\n\tif flag == 0 then\n\t\tsys.call(\"/etc/init.d/passwall stop\")\n\tend\n\n\tlocal old_app_size = 0\n\tif fs.access(app_path) then\n\t\told_app_size = get_file_space(app_path)\n\tend\n\tlocal new_app_size = get_file_space(bin_path)\n\tlocal final_dir = get_final_dir(app_path)\n\tlocal final_dir_free_size = get_free_space(final_dir)\n\tif final_dir_free_size > 0 then\n\t\tfinal_dir_free_size = final_dir_free_size + old_app_size\n\t\tif new_app_size > final_dir_free_size then\n\t\t\tsys.call(cmd_rm_tmp)\n\t\t\treturn {code = 1, error = i18n.translatef(\"%s not enough space.\", final_dir)}\n\t\tend\n\tend\n\n\tresult = exec(\"/bin/mv\", { \"-f\", bin_path, app_path }, nil, command_timeout) == 0\n\n\tsys.call(cmd_rm_tmp)\n\tif flag == 0 then\n\t\tsys.call(\"/etc/init.d/passwall restart >/dev/null 2>&1 &\")\n\tend\n\n\tif not result or not fs.access(app_path) then\n\t\treturn {\n\t\t\tcode = 1,\n\t\t\terror = i18n.translatef(\"Can't move new file to path: %s\", app_path)\n\t\t}\n\tend\n\n\treturn {code = 0}\nend\n\nfunction get_version()\n\tlocal version = sys.exec(\"opkg list-installed luci-app-passwall 2>/dev/null | awk '{print $3}'\")\n\tif not version or #version == 0 then\n\t\tversion = sys.exec(\"apk list luci-app-passwall 2>/dev/null | awk '/installed/ {print $1}' | cut -d'-' -f4-\")\n\tend\n\treturn (version or \"\"):gsub(\"\\n\", \"\"):match(\"^([^-]+)\")\nend\n\nfunction to_check_self()\n\tlocal url = \"https://raw.githubusercontent.com/Openwrt-Passwall/openwrt-passwall/main/luci-app-passwall/Makefile\"\n\tlocal tmp_file = \"/tmp/passwall_makefile\"\n\tlocal return_code, result = curl_auto(url, tmp_file, curl_args)\n\tresult = return_code == 0\n\tif not result then\n\t\texec(\"/bin/rm\", {\"-f\", tmp_file})\n\t\treturn {\n\t\t\tcode = 1,\n\t\t\terror = i18n.translatef(\"Failed\")\n\t\t}\n\tend\n\tlocal local_version  = get_version()\n\tlocal remote_version = sys.exec(\"echo -n $(grep '^PKG_VERSION' /tmp/passwall_makefile | head -n 1 | awk -F '=' '{print $2}')\")\n\texec(\"/bin/rm\", {\"-f\", tmp_file})\n\n\tlocal has_update = compare_versions(local_version, \"<\", remote_version)\n\tif not has_update then\n\t\treturn {\n\t\t\tcode = 0,\n\t\t\tlocal_version = local_version,\n\t\t\tremote_version = remote_version\n\t\t}\n\tend\n\treturn {\n\t\tcode = 1,\n\t\thas_update = true,\n\t\tlocal_version = local_version,\n\t\tremote_version = remote_version,\n\t\terror = i18n.translatef(\"The latest version: %s, currently does not support automatic update, if you need to update, please compile or download the ipk and then manually install.\", remote_version)\n\t}\nend\n\nfunction luci_types(id, m, s, type_name, option_prefix)\n\tlocal rewrite_option_table = {}\n\tfor key, value in pairs(s.fields) do\n\t\tif key:find(option_prefix) == 1 then\n\t\t\tif not s.fields[key].not_rewrite then\n\t\t\t\tif s.fields[key].rewrite_option then\n\t\t\t\t\tif not rewrite_option_table[s.fields[key].rewrite_option] then\n\t\t\t\t\t\trewrite_option_table[s.fields[key].rewrite_option] = 1\n\t\t\t\t\telse\n\t\t\t\t\t\trewrite_option_table[s.fields[key].rewrite_option] = rewrite_option_table[s.fields[key].rewrite_option] + 1\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\ts.fields[key].cfgvalue = function(self, section)\n\t\t\t\t\t-- 添加自定义 custom_cfgvalue 属性，如果有自定义的 custom_cfgvalue 函数，则使用自定义的 cfgvalue 逻辑\n\t\t\t\t\tif self.custom_cfgvalue then\n\t\t\t\t\t\treturn self:custom_cfgvalue(section)\n\t\t\t\t\telse\n\t\t\t\t\t\tif self.rewrite_option then\n\t\t\t\t\t\t\treturn m:get(section, self.rewrite_option)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif self.option:find(option_prefix) == 1 then\n\t\t\t\t\t\t\t\treturn m:get(section, self.option:sub(1 + #option_prefix))\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\ts.fields[key].write = function(self, section, value)\n\t\t\t\t\tif s.fields[\"type\"]:formvalue(id) == type_name then\n\t\t\t\t\t\t-- 添加自定义 custom_write 属性，如果有自定义的 custom_write 函数，则使用自定义的 write 逻辑\n\t\t\t\t\t\tif self.custom_write then\n\t\t\t\t\t\t\tself:custom_write(section, value)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif self.rewrite_option then\n\t\t\t\t\t\t\t\tm:set(section, self.rewrite_option, value)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif self.option:find(option_prefix) == 1 then\n\t\t\t\t\t\t\t\t\tm:set(section, self.option:sub(1 + #option_prefix), value)\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\ts.fields[key].remove = function(self, section)\n\t\t\t\t\tif s.fields[\"type\"]:formvalue(id) == type_name then\n\t\t\t\t\t\t-- 添加自定义 custom_remove 属性，如果有自定义的 custom_remove 函数，则使用自定义的 remove 逻辑\n\t\t\t\t\t\tif self.custom_remove then\n\t\t\t\t\t\t\tself:custom_remove(section)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif self.rewrite_option and rewrite_option_table[self.rewrite_option] == 1 then\n\t\t\t\t\t\t\t\tm:del(section, self.rewrite_option)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif self.option:find(option_prefix) == 1 then\n\t\t\t\t\t\t\t\t\tm:del(section, self.option:sub(1 + #option_prefix))\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tlocal deps = s.fields[key].deps\n\t\t\tif #deps > 0 then\n\t\t\t\tfor index, value in ipairs(deps) do\n\t\t\t\t\tdeps[index][\"type\"] = type_name\n\t\t\t\tend\n\t\t\telse\n\t\t\t\ts.fields[key]:depends({ type = type_name })\n\t\t\tend\n\t\tend\n\tend\nend\n\nfunction get_std_domain(domain)\n\tdomain = trim(domain)\n\tif domain == \"\" then return \"\" end\n\t-- 含 # → \"\"\n\tfor i = 1, #domain do\n\t\tif domain:byte(i) == 35 then return \"\" end -- '#'\n\tend\n\tlocal len = #domain\n\tlocal si, ei = 1, len\n\t-- 去前缀 '.'\n\twhile si <= len and domain:byte(si) == 46 do si = si + 1 end\n\t-- 去后缀 '.'\n\twhile ei >= si and domain:byte(ei) == 46 do ei = ei - 1 end\n\tif si > ei then return \"\" end\n\tdomain = domain:sub(si, ei)\n\tlen = #domain\n\t-- 是否有 '*'\n\tlocal star = false\n\tfor i = 1, len do\n\t\tif domain:byte(i) == 42 then star = true break end\n\tend\n\tif not star then return domain end\n\t-- 切割 label\n\tlocal parts, pstart = {}, 1\n\tfor i = 1, len + 1 do\n\t\tlocal b = (i <= len) and domain:byte(i) or 46 -- '.' 作为结束\n\t\tif b == 46 then\n\t\t\tparts[#parts + 1] = domain:sub(pstart, i - 1)\n\t\t\tpstart = i + 1\n\t\tend\n\tend\n\t-- 从右向左找含 '*' ,并删除包含 '*' 的部分及其左边部分\n\tfor i = #parts, 1, -1 do\n\t\tlocal s = parts[i]\n\t\tlocal has = false\n\t\tfor j = 1, #s do\n\t\t\tif s:byte(j) == 42 then has = true break end\n\t\tend\n\t\tif has then\n\t\t\tif i == #parts then return \"\" end\n\t\t\tlocal out = parts[i + 1]\n\t\t\tfor k = i + 2, #parts do\n\t\t\t\tout = out .. \".\" .. parts[k]\n\t\t\tend\n\t\t\treturn out\n\t\tend\n\tend\n\treturn domain\nend\n\nfunction format_go_time(input)\n\tinput = input and trim(input)\n\tlocal N = 0\n\tif input and input:match(\"^%d+$\") then\n\t\tN = tonumber(input)\n\telseif input and input ~= \"\" then\n\t\tfor value, unit in input:gmatch(\"(%d+)%s*([hms])\") do\n\t\t\tvalue = tonumber(value)\n\t\t\tif unit == \"h\" then\n\t\t\t\tN = N + value * 3600\n\t\t\telseif unit == \"m\" then\n\t\t\t\tN = N + value * 60\n\t\t\telseif unit == \"s\" then\n\t\t\t\tN = N + value\n\t\t\tend\n\t\tend\n\tend\n\tif N <= 0 then\n\t\treturn \"0s\"\n\tend\n\tlocal result = \"\"\n\tlocal h = math.floor(N / 3600)\n\tlocal m = math.floor(N % 3600 / 60)\n\tlocal s = N % 60\n\tif h > 0 then result = result .. h .. \"h\" end\n\tif m > 0 then result = result .. m .. \"m\" end\n\tif s > 0 or result == \"\" then result = result .. s .. \"s\" end\n\treturn result\nend\n\nfunction set_apply_on_parse(map)\n\tif not map then return end\n\tif is_js_luci() then\n\t\tapply_redirect(map)\n\t\tlocal old = map.on_after_save\n\t\tmap.on_after_save = function(self)\n\t\t\tif old then old(self) end\n\t\t\tmap:set(\"@global[0]\", \"timestamp\", os.time())\n\t\tend\n\t\t-- 优化页面\n\t\tlocal cbi = require \"luci.cbi\"\n\t\tmap:append(cbi.Template(appname .. \"/cbi/optimize_cbi_ui\"))\n\tend\nend\n\nfunction apply_redirect(m)\n\tlocal tmp_uci_file = \"/etc/config/\" .. appname .. \"_redirect\"\n\tif m.redirect and m.redirect ~= \"\" then\n\t\tif fs.access(tmp_uci_file) then\n\t\t\tlocal redirect\n\t\t\tfor line in io.lines(tmp_uci_file) do\n\t\t\t\tredirect = line:match(\"option%s+url%s+['\\\"]([^'\\\"]+)['\\\"]\")\n\t\t\t\tif redirect and redirect ~= \"\" then break end\n\t\t\tend\n\t\t\tif redirect and redirect ~= \"\" then\n\t\t\t\tsys.call(\"/bin/rm -f \" .. tmp_uci_file)\n\t\t\t\tluci.http.redirect(redirect)\n\t\t\tend\n\t\telse\n\t\t\tfs.writefile(tmp_uci_file, \"config redirect\\n\")\n\t\tend\n\t\tm.on_after_save = function(self)\n\t\t\tlocal redirect = self.redirect\n\t\t\tif redirect and redirect ~= \"\" then\n\t\t\t\tuci:set(appname .. \"_redirect\", \"@redirect[0]\", \"url\", redirect)\n\t\t\tend\n\t\tend\n\telse\n\t\tsys.call(\"/bin/rm -f \" .. tmp_uci_file)\n\tend\nend\n\nfunction match_node_rule(name, rule)\n\tif not name then return false end\n\tif not rule or rule == \"\" then return true end\n\t-- split rule by &&\n\tlocal function split_and(expr)\n\t\tlocal t = {}\n\t\tfor part in expr:gmatch(\"[^&]+\") do\n\t\t\tpart = part:gsub(\"^%s+\", \"\"):gsub(\"%s+$\", \"\")\n\t\t\tif part ~= \"\" then\n\t\t\t\ttable.insert(t, part)\n\t\t\tend\n\t\tend\n\t\treturn t\n\tend\n\t-- match single condition\n\tlocal function match_cond(str, cond)\n\t\tif cond == \"\" then\n\t\t\treturn true\n\t\tend\n\t\t-- exclude: !xxx\n\t\tif cond:sub(1, 1) == \"!\" then\n\t\t\tlocal k = cond:sub(2)\n\t\t\tif k == \"\" then return true end\n\t\t\treturn not str:find(k, 1, true)\n\t\tend\n\t\t-- prefix: ^xxx\n\t\tif cond:sub(1, 1) == \"^\" then\n\t\t\tlocal k = cond:sub(2)\n\t\t\treturn str:sub(1, #k) == k\n\t\tend\n\t\t-- suffix: xxx$\n\t\tif cond:sub(-1) == \"$\" then\n\t\t\tlocal k = cond:sub(1, -2)\n\t\t\treturn str:sub(-#k) == k\n\t\tend\n\t\t-- contains\n\t\treturn str:find(cond, 1, true) ~= nil\n\tend\n\t-- AND logic\n\tfor _, cond in ipairs(split_and(rule)) do\n\t\tif not match_cond(name, cond) then\n\t\t\treturn false\n\t\tend\n\tend\n\treturn true\nend\n\nfunction get_core(field, candidates)\n\tlocal v = uci:get(appname, \"@global_subscribe[0]\", field)\n\tif v and v ~= \"\" then\n\t\tfor _, c in ipairs(candidates) do\n\t\t\tif c[2] == v and c[1] then\n\t\t\t\treturn v\n\t\t\tend\n\t\tend\n\tend\n\tfor _, c in ipairs(candidates) do\n\t\tif c[1] then return c[2] end\n\tend\n\treturn nil\nend\n\nfunction cleanEmptyTables(t)\n\tif type(t) ~= \"table\" then return nil end\n\tfor k, v in pairs(t) do\n\t\tif type(v) == \"table\" then\n\t\t\tt[k] = cleanEmptyTables(v)\n\t\tend\n\tend\n\treturn next(t) and t or nil\nend\n\nfunction fetch_cert_sha256(host, port, timeout)\n\tif not host or not datatypes.hostname(host) then return \"\" end\n\tport = tonumber(port) or 443\n\ttimeout = tonumber(timeout) or 5\n\tlocal xray = finded_com(\"xray\")\n\tlocal cmd\n\tif xray then\n\t\tcmd = string.format(\n\t\t\t\"timeout %d %q tls ping %s:%d 2>/dev/null \" ..\n\t\t\t\"| awk 'tolower($0) ~ /without sni/ {f=1} tolower($0) ~ /with sni/ {f=0} \" ..\n\t\t\t\"f && tolower($0) ~ /cert.*leaf.*sha256/ {sub(/.*:/,\\\"\\\"); gsub(/[[:space:]]/,\\\"\\\"); print; exit}'\",\n\t\t\ttimeout, xray, host, port\n\t\t)\n\telse\n\t\tcmd = string.format(\n\t\t\t\"timeout %d openssl s_client -connect %s:%d -servername %s -showcerts </dev/null 2>/dev/null \" ..\n\t\t\t\"| awk 'BEGIN{c=0}/BEGIN CERT/{c++} c==1{print} /END CERT/{if(c==1)exit}' \" ..\n\t\t\t\"| openssl x509 -outform der 2>/dev/null \" ..\n\t\t\t\"| sha256sum 2>/dev/null\",\n\t\t\ttimeout, host, port, host\n\t\t)\n\tend\n\tlocal out = trim(sys.exec(cmd))\n\tlocal fp = out:match(\"^([0-9a-fA-F]+)\")\n\tif not fp then return \"\" end\n\treturn fp:upper()\nend\n\nfunction vps_domain_exclude(domain)\n\tif trim(domain) == \"\" then return true end\n\tlocal map = {\n\t\t[\"engage.cloudflareclient.com\"] = 1,\n\t\t[\"google.com\"] = 1, [\"www.google.com\"] = 1,\n\t\t[\"youtube.com\"] = 1, [\"www.youtube.com\"] = 1,\n\t\t[\"github.com\"] = 1, [\"telegram.org\"] = 1,\n\t\t[\"cloudflare.com\"] = 1, [\"www.cloudflare.com\"] = 1,\n\t\t[\"bing.com\"] = 1, [\"www.bing.com\"] = 1, [\"x.com\"] = 1\n\t}\n\tif map[domain] then return true end\n\treturn false\nend\n"
  },
  {
    "path": "luci-app-passwall/luasrc/passwall/com.lua",
    "content": "local _M = {}\n\nlocal function gh_release_url(self)\n\t--return \"https://api.github.com/repos/\" .. self.repo .. \"/releases/latest\"\n\treturn \"https://github.com/Openwrt-Passwall/openwrt-passwall-packages/releases/download/api-cache/\" .. string.lower(self.name) .. \"-release-api.json\"\nend\n\nlocal function gh_pre_release_url(self)\n\t--return \"https://api.github.com/repos/\" .. self.repo .. \"/releases?per_page=1\"\n\treturn \"https://github.com/Openwrt-Passwall/openwrt-passwall-packages/releases/download/api-cache/\" .. string.lower(self.name) .. \"-pre-release-api.json\"\nend\n\n-- 排序顺序定义\n_M.order = {\n\t\"geoview\",\n\t\"chinadns-ng\",\n\t\"xray\",\n\t\"sing-box\",\n\t\"hysteria\"\n}\n\n_M.hysteria = {\n\tname = \"Hysteria\",\n\trepo = \"HyNetwork/hysteria\",\n\tget_url = gh_release_url,\n\tcmd_version = \"version | awk '/^Version:/ {print $2}'\",\n\tremote_version_str_replace = \"app/\",\n\tzipped = false,\n\tdefault_path = \"/usr/bin/hysteria\",\n\tmatch_fmt_str = \"linux%%-%s$\",\n\tfile_tree = {\n\t\tarmv6 = \"arm\",\n\t\tarmv7 = \"arm\",\n\t\tmipsel = \"mipsle\"\n\t}\n}\n\n_M[\"sing-box\"] = {\n\tname = \"Sing-Box\",\n\trepo = \"SagerNet/sing-box\",\n\tget_url = gh_release_url,\n\tcmd_version = \"version | awk '{print $3}' | sed -n 1P\",\n\tzipped = true,\n\tzipped_suffix = \"tar.gz\",\n\tdefault_path = \"/usr/bin/sing-box\",\n\tmatch_fmt_str = \"linux%%-%s\",\n\tfile_tree = {\n\t\tx86_64 = \"amd64%-musl\",\n\t\tx86     = \"386%-musl\",\n\t\taarch64 = \"arm64%-musl\",\n\t\trockchip = \"arm64%-musl\",\n\t\tmips    = \"mips%-softfloat\",\n\t\tmips64  = \"mips64%-softfloat\",\n\t\tmipsel  = \"mipsle%-softfloat%-musl\",\n\t\tmips64el = \"mips64le%-softfloat\",\n\t\tarmv7   = \"armv7%-musl\",\n\t\tarmv8   = \"arm64%-musl\",\n\t\triscv64 = \"riscv64%-musl\"\n\t}\n}\n\n_M.xray = {\n\tname = \"Xray\",\n\trepo = \"XTLS/Xray-core\",\n\tget_url = gh_pre_release_url,\n\tcmd_version = \"version | awk '{print $2}' | sed -n 1P\",\n\tzipped = true,\n\tdefault_path = \"/usr/bin/xray\",\n\tmatch_fmt_str = \"linux%%-%s\",\n\tfile_tree = {\n\t\tx86_64 = \"64\",\n\t\tx86    = \"32\",\n\t\tmips   = \"mips32\",\n\t\tmipsel = \"mips32le\",\n\t\tmips64el = \"mips64le\"\n\t}\n}\n\n_M[\"chinadns-ng\"] = {\n\tname = \"ChinaDNS-NG\",\n\trepo = \"zfl9/chinadns-ng\",\n\tget_url = gh_release_url,\n\tcmd_version = \"-V | awk '{print $2}'\",\n\tzipped = false,\n\tdefault_path = \"/usr/bin/chinadns-ng\",\n\tmatch_fmt_str = \"%s\",\n\tfile_tree = {\n\t\tx86_64  = \"wolfssl@x86_64.*x86_64@\",\n\t\tx86     = \"wolfssl@i386.*i686\",\n\t\tmips    = \"wolfssl@mips%-.*mips32%+soft_float@\",\n\t\tmips64  = \"wolfssl@mips64%-.*mips64%+soft_float@\",\n\t\tmipsel  = \"wolfssl@mipsel.*mips32%+soft_float@\",\n\t\tmips64el = \"wolfssl@mips64el%-.*mips64%+soft_float@\",\n\t\taarch64 = \"wolfssl_noasm@aarch64.*v8a\",\n\t\trockchip = \"wolfssl@aarch64.*v8a\",\n\t\tarmv5   = \"wolfssl@arm.*v5te\",\n\t\tarmv6   = \"wolfssl@arm.*v6t2\",\n\t\tarmv7   = \"wolfssl@arm.*eabihf.*v7a\",\n\t\tarmv8   = \"wolfssl_noasm@aarch64.*v8a\",\n\t\triscv64 = \"wolfssl@riscv64.*\"\n\t}\n}\n\n_M.geoview = {\n\tname = \"Geoview\",\n\trepo = \"snowie2000/geoview\",\n\tget_url = gh_release_url,\n\tcmd_version = '-version 2>/dev/null | awk \\'NR==1 && $1==\"Geoview\" {print $2}\\'',\n\tzipped = false,\n\tdefault_path = \"/usr/bin/geoview\",\n\tmatch_fmt_str = \"linux%%-%s\",\n\tfile_tree = {\n\t\tmipsel = \"mipsle\",\n\t\tmips64el = \"mips64le\"\n\t}\n}\n\nreturn _M\n"
  },
  {
    "path": "luci-app-passwall/luasrc/passwall/server_app.lua",
    "content": "#!/usr/bin/lua\n\nlocal action = arg[1]\nlocal api = require \"luci.passwall.api\"\nlocal sys = api.sys\nlocal uci = api.uci\nlocal jsonc = api.jsonc\n\nlocal CONFIG = \"passwall_server\"\nlocal CONFIG_PATH = \"/tmp/etc/\" .. CONFIG\nlocal NFT_INCLUDE_FILE = CONFIG_PATH .. \"/\" .. CONFIG .. \".nft\"\nlocal LOG_APP_FILE = \"/tmp/log/\" .. CONFIG .. \".log\"\nlocal TMP_BIN_PATH = CONFIG_PATH .. \"/bin\"\nlocal require_dir = \"luci.passwall.\"\n\nlocal ipt_bin = sys.exec(\"echo -n $(/usr/share/passwall/iptables.sh get_ipt_bin)\")\nlocal ip6t_bin = sys.exec(\"echo -n $(/usr/share/passwall/iptables.sh get_ip6t_bin)\")\n\nlocal nft_flag = api.is_finded(\"fw4\") and \"1\" or \"0\"\n\nlocal function log(...)\n\tlocal f, err = io.open(LOG_APP_FILE, \"a\")\n\tif f and err == nil then\n\t\tlocal str = os.date(\"%Y-%m-%d %H:%M:%S: \") .. table.concat({...}, \" \")\n\t\tf:write(str .. \"\\n\")\n\t\tf:close()\n\tend\nend\n\nlocal function cmd(cmd)\n\tsys.call(cmd)\nend\n\nlocal function ipt(arg)\n\tif ipt_bin and #ipt_bin > 0 then\n\t\tcmd(ipt_bin .. \" -w \" .. arg)\n\tend\nend\n\nlocal function ip6t(arg)\n\tif ip6t_bin and #ip6t_bin > 0 then\n\t\tcmd(ip6t_bin .. \" -w \" .. arg)\n\tend\nend\n\nlocal function ln_run(s, d, command, output)\n\tif not output then\n\t\toutput = \"/dev/null\"\n\tend\n\td = TMP_BIN_PATH .. \"/\" .. d\n\tcmd(string.format('[ ! -f \"%s\" ] && ln -s %s %s 2>/dev/null', d, s, d))\n\treturn string.format(\"%s >%s 2>&1 &\", d .. \" \" .. command, output)\nend\n\nlocal function gen_include()\n\tcmd(string.format(\"echo '#!/bin/sh' > /tmp/etc/%s.include\", CONFIG))\n\tlocal function extract_rules(n, a)\n\t\tlocal _ipt = ipt_bin\n\t\tif n == \"6\" then\n\t\t\t_ipt = ip6t_bin\n\t\tend\n\t\tlocal result = \"*\" .. a\n\t\tresult = result .. \"\\n\" .. sys.exec(_ipt .. '-save -t ' .. a .. ' | grep \"PSW-SERVER\" | sed -e \"s/^-A \\\\(INPUT\\\\)/-I \\\\1 1/\"')\n\t\tresult = result .. \"COMMIT\"\n\t\treturn result\n\tend\n\tlocal f, err = io.open(\"/tmp/etc/\" .. CONFIG .. \".include\", \"a\")\n\tif f and err == nil then\n\t\tif nft_flag == \"0\" then\n\t\t\tf:write(ipt_bin .. '-save -c | grep -v \"PSW-SERVER\" | ' .. ipt_bin .. '-restore -c' .. \"\\n\")\n\t\t\tf:write(ipt_bin .. '-restore -n <<-EOT' .. \"\\n\")\n\t\t\tf:write(extract_rules(\"4\", \"filter\") .. \"\\n\")\n\t\t\tf:write(\"EOT\" .. \"\\n\")\n\t\t\tf:write(ip6t_bin .. '-save -c | grep -v \"PSW-SERVER\" | ' .. ip6t_bin .. '-restore -c' .. \"\\n\")\n\t\t\tf:write(ip6t_bin .. '-restore -n <<-EOT' .. \"\\n\")\n\t\t\tf:write(extract_rules(\"6\", \"filter\") .. \"\\n\")\n\t\t\tf:write(\"EOT\" .. \"\\n\")\n\t\t\tf:close()\n\t\telse\n\t\t\tf:write(\"nft -f \" .. NFT_INCLUDE_FILE .. \"\\n\")\n\t\t\tf:close()\n\t\tend\n\tend\nend\n\nlocal function start()\n\tlocal enabled = tonumber(uci:get(CONFIG, \"@global[0]\", \"enable\") or 0)\n\tif enabled == nil or enabled == 0 then\n\t\treturn\n\tend\n\tcmd(string.format(\"mkdir -p %s %s\", CONFIG_PATH, TMP_BIN_PATH))\n\tcmd(string.format(\"touch %s\", LOG_APP_FILE))\n\tif nft_flag == \"0\" then\n\t\tipt(\"-N PSW-SERVER\")\n\t\tipt(\"-I INPUT -j PSW-SERVER\")\n\t\tip6t(\"-N PSW-SERVER\")\n\t\tip6t(\"-I INPUT -j PSW-SERVER\")\n\telse\n\t\tnft_file, err = io.open(NFT_INCLUDE_FILE, \"w\")\n\t\tnft_file:write('#!/usr/sbin/nft -f\\n')\n\t\tnft_file:write('add chain inet fw4 PSW-SERVER\\n')\n\t\tnft_file:write('flush chain inet fw4 PSW-SERVER\\n')\n\t\tnft_file:write('insert rule inet fw4 input position 0 jump PSW-SERVER comment \"PSW-SERVER\"\\n')\n\tend\n\tuci:foreach(CONFIG, \"user\", function(user)\n\t\tlocal id = user[\".name\"]\n\t\tlocal enable = user.enable\n\t\tif enable and tonumber(enable) == 1 then\n\t\t\tlocal enable_log = user.log\n\t\t\tlocal log_path = nil\n\t\t\tif enable_log and enable_log == \"1\" then\n\t\t\t\tlog_path = CONFIG_PATH .. \"/\" .. id .. \".log\"\n\t\t\telse\n\t\t\t\tlog_path = nil\n\t\t\tend\n\t\t\tlocal remarks = user.remarks\n\t\t\tlocal port = tonumber(user.port)\n\t\t\tlocal bin\n\t\t\tlocal config = {}\n\t\t\tlocal config_file = CONFIG_PATH .. \"/\" .. id .. \".json\"\n\t\t\tlocal udp_forward = 1\n\t\t\tlocal type = user.type or \"\"\n\t\t\tif type == \"Socks\" then\n\t\t\t\tlocal auth = \"\"\n\t\t\t\tif user.auth and user.auth == \"1\" then\n\t\t\t\t\tlocal username = user.username or \"\"\n\t\t\t\t\tlocal password = user.password or \"\"\n\t\t\t\t\tif username ~= \"\" and password ~= \"\" then\n\t\t\t\t\t\tusername = \"-u \" .. username\n\t\t\t\t\t\tpassword = \"-P \" .. password\n\t\t\t\t\t\tauth = username .. \" \" .. password\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tbin = ln_run(\"/usr/bin/microsocks\", \"microsocks_\" .. id, string.format(\"-i :: -p %s %s\", port, auth), log_path)\n\t\t\telseif type == \"SS\" or type == \"SSR\" then\n\t\t\t\tif user.custom == \"1\" and user.config_str then\n\t\t\t\t\tconfig = jsonc.parse(api.base64Decode(user.config_str))\n\t\t\t\telse\n\t\t\t\t\tconfig = require(require_dir .. \"util_shadowsocks\").gen_config_server(user)\n\t\t\t\tend\n\t\t\t\tlocal udp_param = \"\"\n\t\t\t\tudp_forward = tonumber(user.udp_forward) or 1\n\t\t\t\tif udp_forward == 1 then\n\t\t\t\t\tudp_param = \"-u\"\n\t\t\t\tend\n\t\t\t\ttype = type:lower()\n\t\t\t\tbin = ln_run(\"/usr/bin/\" .. type .. \"-server\", type .. \"-server\", \"-c \" .. config_file .. \" \" .. udp_param, log_path)\n\t\t\telseif type == \"SS-Rust\" then\n\t\t\t\tif user.custom == \"1\" and user.config_str then\n\t\t\t\t\tconfig = jsonc.parse(api.base64Decode(user.config_str))\n\t\t\t\telse\n\t\t\t\t\tconfig = require(require_dir .. \"util_shadowsocks\").gen_config_server(user)\n\t\t\t\tend\n\t\t\t\tbin = ln_run(\"/usr/bin/ssserver\", \"ssserver\", \"-c \" .. config_file, log_path)\n\t\t\telseif type == \"Xray\" then\n\t\t\t\tif user.custom == \"1\" and user.config_str then\n\t\t\t\t\tconfig = jsonc.parse(api.base64Decode(user.config_str))\n\t\t\t\t\tif log_path then\n\t\t\t\t\t\tif not config.log then\n\t\t\t\t\t\t\tconfig.log = {}\n\t\t\t\t\t\tend\n\t\t\t\t\t\tconfig.log.loglevel = user.loglevel\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tconfig = require(require_dir .. \"util_xray\").gen_config_server(user)\n\t\t\t\tend\n\t\t\t\tbin = ln_run(api.get_app_path(\"xray\"), \"xray\", \"run -c \" .. config_file, log_path)\n\t\t\telseif type == \"sing-box\" then\n\t\t\t\tif user.custom == \"1\" and user.config_str then\n\t\t\t\t\tconfig = jsonc.parse(api.base64Decode(user.config_str))\n\t\t\t\t\tif log_path then\n\t\t\t\t\t\tif not config.log then\n\t\t\t\t\t\t\tconfig.log = {}\n\t\t\t\t\t\tend\n\t\t\t\t\t\tconfig.log.timestamp = true\n\t\t\t\t\t\tconfig.log.disabled = false\n\t\t\t\t\t\tconfig.log.level = user.loglevel\n\t\t\t\t\t\tconfig.log.output = log_path\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tconfig = require(require_dir .. \"util_sing-box\").gen_config_server(user)\n\t\t\t\tend\n\t\t\t\tbin = ln_run(api.get_app_path(\"sing-box\"), \"sing-box\", \"run -c \" .. config_file, log_path)\n\t\t\telseif type == \"Hysteria2\" then\n\t\t\t\tif user.custom == \"1\" and user.config_str then\n\t\t\t\t\tconfig = jsonc.parse(api.base64Decode(user.config_str))\n\t\t\t\telse\n\t\t\t\t\tconfig = require(require_dir .. \"util_hysteria2\").gen_config_server(user)\n\t\t\t\tend\n\t\t\t\tbin = ln_run(api.get_app_path(\"hysteria\"), \"hysteria\", \"-c \" .. config_file .. \" server\", log_path)\n\t\t\tend\n\n\t\t\tif next(config) then\n\t\t\t\tlocal f, err = io.open(config_file, \"w\")\n\t\t\t\tif f and err == nil then\n\t\t\t\t\tf:write(jsonc.stringify(config, 1))\n\t\t\t\t\tf:close()\n\t\t\t\tend\n\t\t\t\tlog(string.format(\"%s 生成配置文件并运行 - %s\", remarks, config_file))\n\t\t\tend\n\n\t\t\tif bin then\n\t\t\t\tcmd(bin)\n\t\t\tend\n\n\t\t\tlocal bind_local = user.bind_local or 0\n\t\t\tif bind_local and tonumber(bind_local) ~= 1 and port then\n\t\t\t\tif nft_flag == \"0\" then\n\t\t\t\t\tipt(string.format('-A PSW-SERVER -p tcp --dport %s -m comment --comment \"%s\" -j ACCEPT', port, remarks))\n\t\t\t\t\tip6t(string.format('-A PSW-SERVER -p tcp --dport %s -m comment --comment \"%s\" -j ACCEPT', port, remarks))\n\t\t\t\t\tif udp_forward == 1 then\n\t\t\t\t\t\tipt(string.format('-A PSW-SERVER -p udp --dport %s -m comment --comment \"%s\" -j ACCEPT', port, remarks))\n\t\t\t\t\t\tip6t(string.format('-A PSW-SERVER -p udp --dport %s -m comment --comment \"%s\" -j ACCEPT', port, remarks))\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tnft_file:write(string.format('add rule inet fw4 PSW-SERVER meta l4proto tcp tcp dport {%s} counter accept comment \"%s\"\\n', port, remarks))\n\t\t\t\t\tif udp_forward == 1 then\n\t\t\t\t\t\tnft_file:write(string.format('add rule inet fw4 PSW-SERVER meta l4proto udp udp dport {%s} counter accept comment \"%s\"\\n', port, remarks))\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\n\tif nft_flag == \"1\" then\n\t\tnft_file:write(\"add rule inet fw4 PSW-SERVER return\\n\")\n\t\tnft_file:close()\n\t\tcmd(\"nft -f \" .. NFT_INCLUDE_FILE)\n\tend\n\tgen_include()\nend\n\nlocal function stop()\n\tcmd(string.format(\"/bin/busybox top -bn1 | grep -v 'grep' | grep '%s/' | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1\", CONFIG_PATH))\n\tif nft_flag == \"0\" then\n\t\tipt(\"-D INPUT -j PSW-SERVER 2>/dev/null\")\n\t\tipt(\"-F PSW-SERVER 2>/dev/null\")\n\t\tipt(\"-X PSW-SERVER 2>/dev/null\")\n\t\tip6t(\"-D INPUT -j PSW-SERVER 2>/dev/null\")\n\t\tip6t(\"-F PSW-SERVER 2>/dev/null\")\n\t\tip6t(\"-X PSW-SERVER 2>/dev/null\")\n\telse\n\t\tlocal nft_cmd = \"handles=$(nft -a list chain inet fw4 input | grep -E \\\"PSW-SERVER\\\" | awk -F '# handle ' '{print$2}')\\n for handle in $handles; do\\n nft delete rule inet fw4 input handle ${handle} 2>/dev/null\\n done\"\n\t\tcmd(nft_cmd)\n\t\tcmd(\"nft flush chain inet fw4 PSW-SERVER 2>/dev/null\")\n\t\tcmd(\"nft delete chain inet fw4 PSW-SERVER 2>/dev/null\")\n\tend\n\tcmd(string.format(\"rm -rf %s %s /tmp/etc/%s.include\", CONFIG_PATH, LOG_APP_FILE, CONFIG))\nend\n\nif action then\n\tif action == \"start\" then\n\t\tstart()\n\telseif action == \"stop\" then\n\t\tstop()\n\tend\nend\n"
  },
  {
    "path": "luci-app-passwall/luasrc/passwall/util_hysteria2.lua",
    "content": "module(\"luci.passwall.util_hysteria2\", package.seeall)\nlocal api = require \"luci.passwall.api\"\nlocal uci = api.uci\nlocal jsonc = api.jsonc\n\nfunction gen_config_server(node)\n\tlocal config = {\n\t\tlisten = \":\" .. node.port,\n\t\ttls = {\n\t\t\tcert = node.tls_certificateFile,\n\t\t\tkey = node.tls_keyFile,\n\t\t},\n\t\tobfs = (node.hysteria2_obfs) and {\n\t\t\ttype = \"salamander\",\n\t\t\tsalamander = {\n\t\t\t\tpassword = node.hysteria2_obfs\n\t\t\t}\n\t\t} or nil,\n\t\tauth = {\n\t\t\ttype = \"password\",\n\t\t\tpassword = node.hysteria2_auth_password\n\t\t},\n\t\tbandwidth = (node.hysteria2_up_mbps or node.hysteria2_down_mbps) and {\n\t\t\tup = node.hysteria2_up_mbps and node.hysteria2_up_mbps .. \" mbps\" or nil,\n\t\t\tdown = node.hysteria2_down_mbps and node.hysteria2_down_mbps .. \" mbps\" or nil\n\t\t} or nil,\n\t\tignoreClientBandwidth = (node.hysteria2_ignoreClientBandwidth == \"1\") and true or false,\n\t\tdisableUDP = (node.hysteria2_udp == \"0\") and true or false,\n\t}\n\treturn config\nend\n\nfunction gen_config(var)\n\tlocal node_id = var[\"node\"]\n\tif not node_id then\n\t\tprint(\"node 不能为空\")\n\t\treturn\n\tend\n\tlocal node = uci:get_all(\"passwall\", node_id)\n\tlocal local_tcp_redir_port = var[\"local_tcp_redir_port\"]\n\tlocal local_udp_redir_port = var[\"local_udp_redir_port\"]\n\tlocal local_socks_address = var[\"local_socks_address\"] or \"0.0.0.0\"\n\tlocal local_socks_port = var[\"local_socks_port\"]\n\tlocal local_socks_username = var[\"local_socks_username\"]\n\tlocal local_socks_password = var[\"local_socks_password\"]\n\tlocal local_http_address = var[\"local_http_address\"] or \"0.0.0.0\"\n\tlocal local_http_port = var[\"local_http_port\"]\n\tlocal local_http_username = var[\"local_http_username\"]\n\tlocal local_http_password = var[\"local_http_password\"]\n\tlocal tcp_proxy_way = var[\"tcp_proxy_way\"]\n\tlocal server_host = var[\"server_host\"] or (node.address or \"\"):lower()\n\tlocal server_port = var[\"server_port\"] or node.port\n\n\tif api.is_ipv6(server_host) then\n\t\tserver_host = api.get_ipv6_full(server_host)\n\tend\n\tlocal server = server_host .. \":\" .. server_port\n\n\tif (node.hysteria2_hop) then\n\t\tserver = server .. \",\" .. string.gsub(node.hysteria2_hop, \":\", \"-\")\n\tend\n\n\tlocal config = {\n\t\tserver = server,\n\t\ttransport = {\n\t\t\ttype = \"udp\",\n\t\t\tudp = node.hysteria2_hop and (function()\n\t\t\t\tlocal udp = {}\n\t\t\t\tlocal t = node.hysteria2_hop_interval\n\t\t\t\tif not t then return nil end\n\t\t\t\tif t:find(\"-\", 1, true) then\n\t\t\t\t\tlocal min, max = t:match(\"^(%d+)%-(%d+)$\")\n\t\t\t\t\tmin = tonumber(min)\n\t\t\t\t\tmax = tonumber(max)\n\t\t\t\t\tif min and max then\n\t\t\t\t\t\tmin = (min >= 5) and min or 5\n\t\t\t\t\t\tmax = (max >= min) and max or min\n\t\t\t\t\t\tudp.minHopInterval = min .. \"s\"\n\t\t\t\t\t\tudp.maxHopInterval = max .. \"s\"\n\t\t\t\t\t\treturn udp\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tt = tonumber((t or \"30\"):match(\"^%d+\"))\n\t\t\t\tt = (t and t >= 5) and t or 30\n\t\t\t\tudp.hopInterval = t .. \"s\"\n\t\t\t\treturn udp\n\t\t\tend)() or nil\n\t\t},\n\t\tobfs = (node.hysteria2_obfs) and {\n\t\t\ttype = \"salamander\",\n\t\t\tsalamander = {\n\t\t\t\tpassword = node.hysteria2_obfs\n\t\t\t}\n\t\t} or nil,\n\t\tauth = node.hysteria2_auth_password,\n\t\ttls = {\n\t\t\tsni = node.tls_serverName,\n\t\t\tinsecure = (node.tls_allowInsecure == \"1\") and true or false,\n\t\t\tpinSHA256 = (node.tls_pinSHA256) and node.tls_pinSHA256 or nil,\n\t\t},\n\t\tquic = {\n\t\t\tinitStreamReceiveWindow = (node.hysteria2_recv_window) and tonumber(node.hysteria2_recv_window) or nil,\n\t\t\tinitConnReceiveWindow = (node.hysteria2_recv_window_conn) and tonumber(node.hysteria2_recv_window_conn) or nil,\n\t\t\tmaxIdleTimeout = (function(t)\n\t\t\t\tt = tonumber(tostring(t or \"30\"):match(\"^%d+\"))\n\t\t\t\treturn (t and t >= 4 and t <= 120) and t .. \"s\" or \"30s\"\n\t\t\tend)(node.hysteria2_idle_timeout),\n\t\t\tkeepAlivePeriod = (function(t)\n\t\t\t\tt = tonumber(tostring(t or \"0\"):match(\"^%d+\"))\n\t\t\t\treturn (t and t >= 2 and t <= 60) and t .. \"s\" or nil\n\t\t\tend)(node.hysteria2_keep_alive_period),\n\t\t\tdisablePathMTUDiscovery = (node.hysteria2_disable_mtu_discovery) and true or false,\n\t\t},\n\t\tbandwidth = (node.hysteria2_up_mbps or node.hysteria2_down_mbps) and {\n\t\t\tup = node.hysteria2_up_mbps and node.hysteria2_up_mbps .. \" mbps\" or nil,\n\t\t\tdown = node.hysteria2_down_mbps and node.hysteria2_down_mbps .. \" mbps\" or nil\n\t\t} or nil,\n\t\tfast_open = (node.fast_open == \"1\") and true or false,\n\t\tlazy = (node.hysteria2_lazy_start == \"1\") and true or false,\n\t\tsocks5 = (local_socks_address and local_socks_port) and {\n\t\t\tlisten = local_socks_address .. \":\" .. local_socks_port,\n\t\t\tusername = (local_socks_username and local_socks_password) and local_socks_username or nil,\n\t\t\tpassword = (local_socks_username and local_socks_password) and local_socks_password or nil,\n\t\t\tdisableUDP = false,\n\t\t} or nil,\n\t\thttp = (local_http_address and local_http_port) and {\n\t\t\tlisten = local_http_address .. \":\" .. local_http_port,\n\t\t\tusername = (local_http_username and local_http_password) and local_http_username or nil,\n\t\t\tpassword = (local_http_username and local_http_password) and local_http_password or nil,\n\t\t} or nil,\n\t\ttcpRedirect = (\"redirect\" == tcp_proxy_way and local_tcp_redir_port) and {\n\t\t\tlisten = \"0.0.0.0:\" .. local_tcp_redir_port\n\t\t} or nil,\n\t\ttcpTProxy = (\"tproxy\" == tcp_proxy_way and local_tcp_redir_port) and {\n\t\t\tlisten = \"0.0.0.0:\" .. local_tcp_redir_port\n\t\t} or nil,\n\t\tudpTProxy = (local_udp_redir_port) and {\n\t\t\tlisten = \"0.0.0.0:\" .. local_udp_redir_port\n\t\t} or nil\n\t}\n\n\treturn jsonc.stringify(config, 1)\nend\n\n_G.gen_config = gen_config\n\nif arg[1] then\n\tlocal func =_G[arg[1]]\n\tif func then\n\t\tlocal var = nil\n\t\tif arg[2] then\n\t\t\tvar = jsonc.parse(arg[2])\n\t\tend\n\t\tprint(func(var))\n\tend\nend\n"
  },
  {
    "path": "luci-app-passwall/luasrc/passwall/util_naiveproxy.lua",
    "content": "module(\"luci.passwall.util_naiveproxy\", package.seeall)\nlocal api = require \"luci.passwall.api\"\nlocal uci = api.uci\nlocal jsonc = api.jsonc\n\nfunction gen_config(var)\n\tlocal node_id = var[\"node\"]\n\tif not node_id then\n\t\tprint(\"node 不能为空\")\n\t\treturn\n\tend\n\tlocal node = uci:get_all(\"passwall\", node_id)\n\tlocal run_type = var[\"run_type\"]\n\tlocal local_addr = var[\"local_addr\"]\n\tlocal local_port = var[\"local_port\"]\n\tlocal server_host = var[\"server_host\"] or (node.address or \"\"):lower()\n\tlocal server_port = var[\"server_port\"] or node.port\n\n\tif api.is_ipv6(server_host) then\n\t\tserver_host = api.get_ipv6_full(server_host)\n\tend\n\tlocal server = server_host .. \":\" .. server_port\n\n\tlocal config = {\n\t\tlisten = run_type .. \"://\" .. local_addr .. \":\" .. local_port,\n\t\tproxy = node.protocol .. \"://\" .. node.username .. \":\" .. node.password .. \"@\" .. server\n\t}\n\n\treturn jsonc.stringify(config, 1)\nend\n\n_G.gen_config = gen_config\n\nif arg[1] then\n\tlocal func =_G[arg[1]]\n\tif func then\n\t\tlocal var = nil\n\t\tif arg[2] then\n\t\t\tvar = jsonc.parse(arg[2])\n\t\tend\n\t\tprint(func(var))\n\tend\nend\n"
  },
  {
    "path": "luci-app-passwall/luasrc/passwall/util_shadowsocks.lua",
    "content": "module(\"luci.passwall.util_shadowsocks\", package.seeall)\nlocal api = require \"luci.passwall.api\"\nlocal uci = api.uci\nlocal jsonc = api.jsonc\n\nfunction gen_config_server(node)\n\tlocal config = {}\n\tconfig.server_port = tonumber(node.port)\n\tconfig.password = node.password\n\tconfig.timeout = tonumber(node.timeout)\n\tconfig.fast_open = (node.tcp_fast_open and node.tcp_fast_open == \"1\") and true or false\n\tconfig.method = node.method\n\n\tif node.type == \"SS-Rust\" then\n\t\tconfig.server = \"::\"\n\t\tconfig.mode = \"tcp_and_udp\"\n\telse\n\t\tconfig.server = {\"[::0]\", \"0.0.0.0\"}\n\tend\n\n\tif node.type == \"SSR\" then\n\t\tconfig.protocol = node.protocol\n\t\tconfig.protocol_param = node.protocol_param\n\t\tconfig.obfs = node.obfs\n\t\tconfig.obfs_param = node.obfs_param\n\tend\n\n\treturn config\nend\n\nlocal plugin_sh, plugin_bin\n\nfunction gen_config(var)\n\tlocal node_id = var[\"node\"]\n\tif not node_id then\n\t\tprint(\"node 不能为空\")\n\t\treturn\n\tend\n\tlocal node = uci:get_all(\"passwall\", node_id)\n\tlocal server_host = var[\"server_host\"] or (node.address or \"\"):lower()\n\tlocal server_port = var[\"server_port\"] or node.port\n\tlocal local_addr = var[\"local_addr\"]\n\tlocal local_port = var[\"local_port\"]\n\tlocal mode = var[\"mode\"]\n\tlocal local_socks_address = var[\"local_socks_address\"] or \"0.0.0.0\"\n\tlocal local_socks_port = var[\"local_socks_port\"]\n\tlocal local_socks_username = var[\"local_socks_username\"]\n\tlocal local_socks_password = var[\"local_socks_password\"]\n\tlocal local_http_address = var[\"local_http_address\"] or \"0.0.0.0\"\n\tlocal local_http_port = var[\"local_http_port\"]\n\tlocal local_http_username = var[\"local_http_username\"]\n\tlocal local_http_password = var[\"local_http_password\"]\n\tlocal local_tcp_redir_port = var[\"local_tcp_redir_port\"]\n\tlocal local_tcp_redir_address = var[\"local_tcp_redir_address\"] or \"0.0.0.0\"\n\tlocal local_udp_redir_port = var[\"local_udp_redir_port\"]\n\tlocal local_udp_redir_address = var[\"local_udp_redir_address\"] or \"0.0.0.0\"\n\n\tif api.is_ipv6(server_host) then\n\t\tserver_host = api.get_ipv6_only(server_host)\n\tend\n\tlocal server = server_host\n\n\tlocal plugin_file\n\tif node.plugin and node.plugin ~= \"\" and node.plugin ~= \"none\" then\n\t\tplugin_sh = var[\"plugin_sh\"] or \"\"\n\t\tplugin_file = (plugin_sh ~=\"\") and plugin_sh or node.plugin\n\t\tplugin_bin = node.plugin\n\tend\n\n\tlocal config = {\n\t\tserver = server,\n\t\tserver_port = tonumber(server_port),\n\t\tlocal_address = local_addr,\n\t\tlocal_port = tonumber(local_port),\n\t\tpassword = node.password,\n\t\tmethod = node.method,\n\t\ttimeout = tonumber(node.timeout),\n\t\tfast_open = (node.tcp_fast_open and node.tcp_fast_open == \"1\") and true or false,\n\t\treuse_port = true,\n\t\ttcp_tproxy = var[\"tcp_tproxy\"] and true or nil\n\t}\n\n\tif node.type == \"SS\" then\n\t\tconfig.plugin = plugin_file or nil\n\t\tconfig.plugin_opts = (plugin_file) and node.plugin_opts or nil\n\t\tconfig.mode = mode\n\telseif node.type == \"SSR\" then\n\t\tconfig.protocol = node.protocol\n\t\tconfig.protocol_param = node.protocol_param\n\t\tconfig.obfs = node.obfs\n\t\tconfig.obfs_param = node.obfs_param\n\telseif node.type == \"SS-Rust\" then\n\t\tconfig = {\n\t\t\tservers = {\n\t\t\t\t{\n\t\t\t\t\taddress = server,\n\t\t\t\t\tport = tonumber(server_port),\n\t\t\t\t\tmethod = node.method,\n\t\t\t\t\tpassword = node.password,\n\t\t\t\t\ttimeout = tonumber(node.timeout),\n\t\t\t\t\tplugin = plugin_file or nil,\n\t\t\t\t\tplugin_opts = (plugin_file) and node.plugin_opts or nil\n\t\t\t\t}\n\t\t\t},\n\t\t\tlocals = {},\n\t\t\tfast_open = (node.tcp_fast_open and node.tcp_fast_open == \"1\") and true or false\n\t\t}\n\t\tif local_socks_address and local_socks_port then\n\t\t\ttable.insert(config.locals, {\n\t\t\t\tlocal_address = local_socks_address,\n\t\t\t\tlocal_port = tonumber(local_socks_port),\n\t\t\t\tmode = \"tcp_and_udp\"\n\t\t\t})\n\t\tend\n\t\tif local_http_address and local_http_port then\n\t\t\ttable.insert(config.locals, {\n\t\t\t\tprotocol = \"http\",\n\t\t\t\tlocal_address = local_http_address,\n\t\t\t\tlocal_port = tonumber(local_http_port)\n\t\t\t})\n\t\tend\n\t\tif local_tcp_redir_address and local_tcp_redir_port then\n\t\t\ttable.insert(config.locals, {\n\t\t\t\tprotocol = \"redir\",\n\t\t\t\tmode = \"tcp_only\",\n\t\t\t\ttcp_redir = var[\"tcp_tproxy\"] and \"tproxy\" or nil,\n\t\t\t\tlocal_address = local_tcp_redir_address,\n\t\t\t\tlocal_port = tonumber(local_tcp_redir_port)\n\t\t\t})\n\t\tend\n\t\tif local_udp_redir_address and local_udp_redir_port then\n\t\t\ttable.insert(config.locals, {\n\t\t\t\tprotocol = \"redir\",\n\t\t\t\tmode = \"udp_only\",\n\t\t\t\tlocal_address = local_udp_redir_address,\n\t\t\t\tlocal_port = tonumber(local_udp_redir_port)\n\t\t\t})\n\t\tend\n\tend\n\n\treturn jsonc.stringify(config, 1)\nend\n\n_G.gen_config = gen_config\n\nif arg[1] then\n\tlocal func =_G[arg[1]]\n\tif func then\n\t\tlocal var = nil\n\t\tif arg[2] then\n\t\t\tvar = jsonc.parse(arg[2])\n\t\tend\n\t\tprint(func(var))\n\t\tif plugin_sh and plugin_sh ~=\"\" and plugin_bin then\n\t\t\tlocal f = io.open(plugin_sh, \"w\")\n\t\t\tf:write(\"#!/bin/sh\\n\")\n\t\t\tf:write(\"export PATH=/usr/sbin:/usr/bin:/sbin:/bin:/root/bin:$PATH\\n\")\n\t\t\tf:write(plugin_bin .. \" $@ &\\n\")\n\t\t\tf:write(\"echo $! > \" .. plugin_sh:gsub(\"%.sh$\", \".pid\") .. \"\\n\")\n\t\t\tf:write(\"wait\\n\")\n\t\t\tf:close()\n\t\t\tluci.sys.call(\"chmod +x \" .. plugin_sh)\n\t\tend\n\tend\nend\n"
  },
  {
    "path": "luci-app-passwall/luasrc/passwall/util_sing-box.lua",
    "content": "module(\"luci.passwall.util_sing-box\", package.seeall)\nlocal api = require \"luci.passwall.api\"\nlocal uci = api.uci\nlocal sys = api.sys\nlocal jsonc = api.jsonc\nlocal appname = \"passwall\"\nlocal fs = api.fs\nlocal split = api.split\nlocal ech_domain = {}\n\nlocal local_version = api.get_app_version(\"sing-box\"):match(\"[^v]+\")\nlocal version_ge_1_14_0 = api.compare_versions(local_version, \">=\", \"1.14.0\")\n\nlocal GLOBAL = {\n\tDNS_SERVER = {},\n\tDNS_HOSTNAME = {},\n\tVPS_EXCLUDE = {}\n}\n\nlocal GEO_VAR = {\n\tOK = nil,\n\tDIR = nil,\n\tSITE_PATH = nil,\n\tIP_PATH = nil,\n\tSITE_TAGS = {},\n\tIP_TAGS = {},\n\tTO_SRS_PATH = \"/tmp/etc/\" .. appname ..\"_tmp/singbox_srss/\"\n}\n\nfunction check_geoview()\n\tif not GEO_VAR.OK then\n\t\t-- Only get once\n\t\tGEO_VAR.OK = (api.finded_com(\"geoview\") and api.compare_versions(api.get_app_version(\"geoview\"), \">=\", \"0.1.10\")) and 1 or 0\n\tend\n\tif GEO_VAR.OK == 0 then\n\t\tapi.log(\"！！！注意：缺少 Geoview 组件或版本过低，Sing-Box 分流无法启用！\")\n\telse\n\t\tGEO_VAR.DIR = GEO_VAR.DIR or (uci:get(appname, \"@global_rules[0]\", \"v2ray_location_asset\") or \"/usr/share/v2ray/\"):match(\"^(.*)/\")\n\t\tGEO_VAR.SITE_PATH = GEO_VAR.SITE_PATH or (GEO_VAR.DIR .. \"/geosite.dat\")\n\t\tGEO_VAR.IP_PATH = GEO_VAR.IP_PATH or (GEO_VAR.DIR .. \"/geoip.dat\")\n\t\tif not fs.access(GEO_VAR.TO_SRS_PATH) then\n\t\t\tfs.mkdir(GEO_VAR.TO_SRS_PATH)\n\t\tend\n\tend\n\treturn GEO_VAR.OK\nend\n\nfunction geo_convert_srs(var)\n\tif check_geoview() ~= 1 then\n\t\treturn\n\tend\n\tlocal geo_path = var[\"geo_path\"]\n\tlocal prefix = var[\"prefix\"]\n\tlocal rule_name = var[\"rule_name\"]\n\tlocal output_srs_file = GEO_VAR.TO_SRS_PATH .. prefix .. \"-\" .. rule_name .. \".srs\"\n\tlocal bin = api.finded_com(\"geoview\")\n\tif not fs.access(output_srs_file) and bin then\n\t\tlocal cmd = string.format(\"%q -type %q -action convert -input %q -list %q -output %q -lowmem=true\",\n\t\t\tbin, prefix, geo_path, rule_name, output_srs_file)\n\t\tsys.call(cmd)\n\t\tlocal status = fs.access(output_srs_file) and \"success.\" or \"failed!\"\n\t\tif status == \"failed!\" then\n\t\t\tapi.log(string.format(\"  - %s:%s 转换为srs格式：%s\", prefix, rule_name, status))\n\t\tend\n\tend\nend\n\nlocal function convert_geofile()\n\tif check_geoview() ~= 1 then\n\t\treturn\n\tend\n\tlocal function convert(file_path, prefix, tags)\n\t\tif next(tags) and fs.access(file_path) then\n\t\t\tlocal md5_file = GEO_VAR.TO_SRS_PATH .. prefix .. \".dat.md5\"\n\t\t\tlocal new_md5 = sys.exec(\"md5sum \" .. file_path .. \" 2>/dev/null | awk '{print $1}'\"):gsub(\"\\n\", \"\")\n\t\t\tlocal old_md5 = sys.exec(\"[ -f \" .. md5_file .. \" ] && head -n 1 \" .. md5_file .. \" | tr -d ' \\t\\n' || echo ''\")\n\t\t\tif new_md5 ~= \"\" and new_md5 ~= old_md5 then\n\t\t\t\tsys.call(\"printf '%s' \" .. new_md5 .. \" > \" .. md5_file)\n\t\t\t\tsys.call(\"rm -rf \" .. GEO_VAR.TO_SRS_PATH .. prefix .. \"-*.srs\" )\n\t\t\tend\n\t\t\tfor k in pairs(tags) do\n\t\t\t\tgeo_convert_srs({[\"geo_path\"] = file_path, [\"prefix\"] = prefix, [\"rule_name\"] = k})\n\t\t\tend\n\t\tend\n\tend\n\t--api.log(\"Sing-Box 规则集转换：\")\n\tconvert(GEO_VAR.SITE_PATH, \"geosite\", GEO_VAR.SITE_TAGS)\n\tconvert(GEO_VAR.IP_PATH, \"geoip\", GEO_VAR.IP_TAGS)\nend\n\nfunction gen_outbound(flag, node, tag, proxy_table)\n\tlocal result = nil\n\tif node then\n\t\tlocal node_id = node[\".name\"]\n\t\tif tag == nil then\n\t\t\ttag = node_id\n\t\tend\n\t\tlocal remarks = node.remarks\n\n\t\tlocal proxy_tag = nil\n\t\tlocal fragment = nil\n\t\tlocal record_fragment = nil\n\t\tlocal run_socks_instance = true\n\t\tif proxy_table ~= nil and type(proxy_table) == \"table\" then\n\t\t\tproxy_tag = proxy_table.tag or nil\n\t\t\tfragment = proxy_table.fragment or nil\n\t\t\trecord_fragment = proxy_table.record_fragment or nil\n\t\t\trun_socks_instance = proxy_table.run_socks_instance\n\t\tend\n\n\t\tif node.type ~= \"sing-box\" then\n\t\t\tlocal relay_port = node.port\n\t\t\tlocal new_port = api.get_new_port()\n\t\t\tlocal config_file = string.format(\"%s_%s_%s.json\", flag, tag, new_port)\n\t\t\tif tag and node_id and not tag:find(node_id) then\n\t\t\t\tconfig_file = string.format(\"%s_%s_%s_%s.json\", flag, tag, node_id, new_port)\n\t\t\tend\n\t\t\tif run_socks_instance then\n\t\t\t\tsys.call(string.format('/usr/share/%s/app.sh run_socks \"%s\"> /dev/null',\n\t\t\t\t\tappname,\n\t\t\t\t\tstring.format(\"flag=%s node=%s bind=%s socks_port=%s config_file=%s relay_port=%s\",\n\t\t\t\t\t\tnew_port, --flag\n\t\t\t\t\t\tnode_id, --node\n\t\t\t\t\t\t\"127.0.0.1\", --bind\n\t\t\t\t\t\tnew_port, --socks port\n\t\t\t\t\t\tconfig_file, --config file\n\t\t\t\t\t\t(proxy_tag and relay_port) and tostring(relay_port) or \"\" --relay port\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\tend\n\t\t\tnode = {\n\t\t\t\tprotocol = \"socks\",\n\t\t\t\taddress = \"127.0.0.1\",\n\t\t\t\tport = new_port\n\t\t\t}\n\t\t\tproxy_tag = \"socks <- \" .. node_id\n\t\telse\n\t\t\tif proxy_tag then\n\t\t\t\tnode.detour = proxy_tag\n\t\t\tend\n\t\tend\n\n\t\tif remarks then\n\t\t\ttag = tag .. \":\" .. remarks\n\t\tend\n\n\t\tnode.address = (node.address or \"\"):lower()\n\n\t\tresult = {\n\t\t\t_id = node_id,\n\t\t\t_flag = flag,\n\t\t\t_flag_proxy_tag = proxy_tag,\n\t\t\ttag = tag,\n\t\t\ttype = node.protocol,\n\t\t\tserver = node.address,\n\t\t\tserver_port = tonumber(node.port),\n\t\t\tdomain_resolver = {\n\t\t\t\tserver = \"direct\",\n\t\t\t\tstrategy = node.domain_strategy\n\t\t\t},\n\t\t\tdetour = node.detour,\n\t\t}\n\n\t\tif api.datatypes.hostname(node.address) and node.domain_resolver and (node.domain_resolver_dns or node.domain_resolver_dns_https) then\n\t\t\tlocal dns_proto = node.domain_resolver\n\t\t\tlocal server_address\n\t\t\tlocal server_port\n\t\t\tlocal server_path\n\t\t\tif dns_proto == \"https\" then\n\t\t\t\tlocal _a = api.parseDoH(node.domain_resolver_dns_https)\n\t\t\t\tif _a then\n\t\t\t\t\tserver_address = _a.hostname\n\t\t\t\t\tserver_port = _a.port or 443\n\t\t\t\t\tserver_path = _a.pathname or \"\"\n\t\t\t\t\tif _a.hostname and api.datatypes.hostname(_a.hostname) then\n\t\t\t\t\t\tGLOBAL.DNS_HOSTNAME[_a.hostname] = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tserver_address = node.domain_resolver_dns\n\t\t\t\tserver_port = 53\n\t\t\t\tlocal split = api.split(server_address, \":\")\n\t\t\t\tif #split > 1 then\n\t\t\t\t\tserver_address = split[1]\n\t\t\t\t\tserver_port = tonumber(split[#split])\n\t\t\t\tend\n\t\t\tend\n\t\t\tlocal dns_key = dns_proto .. \"|\" .. tostring(server_address) .. \"|\" .. tostring(server_port) .. \"|\" .. tostring(server_path or \"\")\n\t\t\tif not GLOBAL.DNS_SERVER[dns_key] then\n\t\t\t\tGLOBAL.DNS_SERVER[dns_key] = {\n\t\t\t\t\tserver = {\n\t\t\t\t\t\ttag = \"dns-node-\" .. api.gen_short_uuid(),\n\t\t\t\t\t\ttype = dns_proto,\n\t\t\t\t\t\tserver = server_address,\n\t\t\t\t\t\tserver_port = server_port,\n\t\t\t\t\t\tpath = server_path,\n\t\t\t\t\t\tdomain_resolver = \"direct\",\n\t\t\t\t\t\tdetour = \"direct\"\n\t\t\t\t\t},\n\t\t\t\t\tdomain = {}\n\t\t\t\t}\n\t\t\tend\n\t\t\tlocal exists\n\t\t\tfor _, d in ipairs(GLOBAL.DNS_SERVER[dns_key].domain) do\n\t\t\t\tif d == node.address then exists = true; break end\n\t\t\tend\n\t\t\tif not exists then table.insert(GLOBAL.DNS_SERVER[dns_key].domain, node.address) end\n\t\t\tresult.domain_resolver.server = GLOBAL.DNS_SERVER[dns_key].server.tag\n\t\t\tGLOBAL.VPS_EXCLUDE[node.address] = true\n\t\tend\n\n\t\tlocal tls = nil\n\t\tif node.protocol == \"hysteria\" or node.protocol == \"hysteria2\" or node.protocol == \"tuic\" or node.protocol == \"naive\" then\n\t\t\tnode.tls = \"1\"\n\t\tend\n\t\tif node.tls == \"1\" then\n\t\t\tlocal alpn = nil\n\t\t\tif node.alpn and node.alpn ~= \"default\" then\n\t\t\t\talpn = {}\n\t\t\t\tstring.gsub(node.alpn, '[^' .. \",\" .. ']+', function(w)\n\t\t\t\t\ttable.insert(alpn, w)\n\t\t\t\tend)\n\t\t\tend\n\t\t\ttls = {\n\t\t\t\tenabled = true,\n\t\t\t\tdisable_sni = (node.tls_disable_sni == \"1\") and true or false, --不要在 ClientHello 中发送服务器名称.\n\t\t\t\tserver_name = node.tls_serverName, --用于验证返回证书上的主机名，除非设置不安全。它还包含在 ClientHello 中以支持虚拟主机，除非它是 IP 地址。\n\t\t\t\tinsecure = (node.tls_allowInsecure == \"1\") and true or false, --接受任何服务器证书。\n\t\t\t\talpn = alpn, --支持的应用层协议协商列表，按优先顺序排列。如果两个对等点都支持 ALPN，则选择的协议将是此列表中的一个，如果没有相互支持的协议则连接将失败。\n\t\t\t\t--min_version = \"1.2\",\n\t\t\t\t--max_version = \"1.3\",\n\t\t\t\tfragment = fragment,\n\t\t\t\trecord_fragment = record_fragment,\n\t\t\t\tech = (node.ech == \"1\") and (function()\n\t\t\t\t\tlocal function get_ech_domain(s) --兼容xray \"域名+DNS\" 格式ech\n\t\t\t\t\t\tlocal domain, dns = s:match(\"^([^+]+)%+(.+)$\")\n\t\t\t\t\t\tif not domain or not dns then return nil end\n\t\t\t\t\t\tif not (dns:match(\"^https?://\") or dns:match(\"^tcp://\") or dns:match(\"^udp://\") or dns:match(\"^h2c://\")) then\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif not domain:match(\"^[%w%-%.]+%.[%a]+$\") then return nil end\n\t\t\t\t\t\treturn domain\n\t\t\t\t\tend\n\t\t\t\t\tlocal ech = { enabled = true }\n\t\t\t\t\tlocal config = node.ech_config\n\t\t\t\t\tlocal qname = node.ech_query_server_name\n\t\t\t\t\tif config and not qname then\n\t\t\t\t\t\tqname = get_ech_domain(config)\n\t\t\t\t\t\tif not qname and not (config:match(\"%-+%s*BEGIN\") and config:match(\"%-+%s*END\")) then\n\t\t\t\t\t\t\tconfig = \"-----BEGIN ECH CONFIGS-----\\n\" .. config:gsub(\"%s+\", \"\") .. \"\\n-----END ECH CONFIGS-----\"\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tif qname then\n\t\t\t\t\t\tech.query_server_name = qname\n\t\t\t\t\t\tech_domain[qname] = true\n\t\t\t\t\telseif config then\n\t\t\t\t\t\tech.config = { config }\n\t\t\t\t\telseif node.tls_serverName and node.tls_serverName ~= \"\" then\n\t\t\t\t\t\tech_domain[node.tls_serverName] = true\n\t\t\t\t\tend\n\t\t\t\t\treturn ech\n\t\t\t\tend)() or nil,\n\t\t\t\tutls = (node.utls == \"1\" or node.reality == \"1\") and {\n\t\t\t\t\tenabled = true,\n\t\t\t\t\tfingerprint = node.fingerprint or \"chrome\"\n\t\t\t\t} or nil,\n\t\t\t\treality = (node.reality == \"1\") and {\n\t\t\t\t\tenabled = true,\n\t\t\t\t\tpublic_key = node.reality_publicKey,\n\t\t\t\t\tshort_id = node.reality_shortId\n\t\t\t\t} or nil\n\t\t\t}\n\t\tend\n\n\t\tlocal mux = nil\n\t\tif node.mux == \"1\" then\n\t\t\tmux = {\n\t\t\t\tenabled = true,\n\t\t\t\tprotocol = node.mux_type or \"h2mux\",\n\t\t\t\tmax_connections = ( (node.tcpbrutal == \"1\") and 1 ) or tonumber(node.mux_concurrency) or 4,\n\t\t\t\tpadding = (node.mux_padding == \"1\") and true or false,\n\t\t\t\t--min_streams = 4,\n\t\t\t\t--max_streams = 0,\n\t\t\t\tbrutal = {\n\t\t\t\t\tenabled = (node.tcpbrutal == \"1\") and true or false,\n\t\t\t\t\tup_mbps = tonumber(node.tcpbrutal_up_mbps) or 10,\n\t\t\t\t\tdown_mbps = tonumber(node.tcpbrutal_down_mbps) or 50,\n\t\t\t\t},\n\t\t\t}\n\t\tend\n\n\t\tlocal v2ray_transport = nil\n\n\t\tif node.transport == \"tcp\" and node.tcp_guise == \"http\" and (node.tcp_guise_http_host or \"\") ~= \"\" then  --模拟xray raw(tcp)传输\n\t\t\tv2ray_transport = {\n\t\t\t\ttype = \"http\",\n\t\t\t\thost = node.tcp_guise_http_host,\n\t\t\t\tpath = node.tcp_guise_http_path and (function()\n\t\t\t\t\t\tlocal first = node.tcp_guise_http_path[1]\n\t\t\t\t\t\treturn (first == \"\" or not first) and \"/\" or first\n\t\t\t\t\tend)() or \"/\",\n\t\t\t\theaders = node.user_agent and {\n\t\t\t\t\t[\"User-Agent\"] = node.user_agent\n\t\t\t\t} or nil,\n\t\t\t\tidle_timeout = (node.http_h2_health_check == \"1\") and node.http_h2_read_idle_timeout or nil,\n\t\t\t\tping_timeout = (node.http_h2_health_check == \"1\") and node.http_h2_health_check_timeout or nil,\n\t\t\t}\n\t\t\t--不强制执行 TLS。如果未配置 TLS，将使用纯 HTTP 1.1。\n\t\tend\n\n\t\tif node.transport == \"http\" then\n\t\t\tv2ray_transport = {\n\t\t\t\ttype = \"http\",\n\t\t\t\thost = node.http_host or {},\n\t\t\t\tpath = node.http_path or \"/\",\n\t\t\t\theaders = node.user_agent and {\n\t\t\t\t\t[\"User-Agent\"] = node.user_agent\n\t\t\t\t} or nil,\n\t\t\t\tidle_timeout = (node.http_h2_health_check == \"1\") and node.http_h2_read_idle_timeout or nil,\n\t\t\t\tping_timeout = (node.http_h2_health_check == \"1\") and node.http_h2_health_check_timeout or nil,\n\t\t\t}\n\t\t\t--不强制执行 TLS。如果未配置 TLS，将使用纯 HTTP 1.1。\n\t\tend\n\n\t\tif node.transport == \"ws\" then\n\t\t\tv2ray_transport = {\n\t\t\t\ttype = \"ws\",\n\t\t\t\tpath = node.ws_path or \"/\",\n\t\t\t\theaders = (node.ws_host or node.user_agent) and {\n\t\t\t\t\tHost = node.ws_host,\n\t\t\t\t\t[\"User-Agent\"] = node.user_agent\n\t\t\t\t} or nil,\n\t\t\t\tmax_early_data = tonumber(node.ws_maxEarlyData) or nil,\n\t\t\t\tearly_data_header_name = (node.ws_earlyDataHeaderName) and node.ws_earlyDataHeaderName or nil --要与 Xray-core 兼容，请将其设置为 Sec-WebSocket-Protocol。它需要与服务器保持一致。\n\t\t\t}\n\t\tend\n\n\t\tif node.transport == \"httpupgrade\" then\n\t\t\tv2ray_transport = {\n\t\t\t\ttype = \"httpupgrade\",\n\t\t\t\thost = node.httpupgrade_host,\n\t\t\t\tpath = node.httpupgrade_path or \"/\",\n\t\t\t\theaders = node.user_agent and {\n\t\t\t\t\t[\"User-Agent\"] = node.user_agent\n\t\t\t\t} or nil\n\t\t\t}\n\t\tend\n\n\t\tif node.transport == \"quic\" then\n\t\t\tv2ray_transport = {\n\t\t\t\ttype = \"quic\"\n\t\t\t}\n\t\t\t--没有额外的加密支持： 它基本上是重复加密。 并且 Xray-core 在这里与 v2ray-core 不兼容。\n\t\tend\n\n\t\tif node.transport == \"grpc\" then\n\t\t\tv2ray_transport = {\n\t\t\t\ttype = \"grpc\",\n\t\t\t\tservice_name = node.grpc_serviceName,\n\t\t\t\tidle_timeout = tonumber(node.grpc_idle_timeout) or nil,\n\t\t\t\tping_timeout = tonumber(node.grpc_health_check_timeout) or nil,\n\t\t\t\tpermit_without_stream = (node.grpc_permit_without_stream == \"1\") and true or nil,\n\t\t\t}\n\t\tend\n\n\t\tlocal protocol_table = nil\n\n\t\tif node.protocol == \"socks\" then\n\t\t\tprotocol_table = {\n\t\t\t\tversion = \"5\",\n\t\t\t\tusername = (node.username and node.password) and node.username or nil,\n\t\t\t\tpassword = (node.username and node.password) and node.password or nil,\n\t\t\t\tudp_over_tcp = node.uot == \"1\" and {\n\t\t\t\t\tenabled = true,\n\t\t\t\t\tversion = 2\n\t\t\t\t} or nil,\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"http\" then\n\t\t\tprotocol_table = {\n\t\t\t\tusername = (node.username and node.password) and node.username or nil,\n\t\t\t\tpassword = (node.username and node.password) and node.password or nil,\n\t\t\t\tpath = nil,\n\t\t\t\theaders = nil,\n\t\t\t\ttls = tls\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"shadowsocks\" then\n\t\t\tprotocol_table = {\n\t\t\t\tmethod = node.method or nil,\n\t\t\t\tpassword = node.password or \"\",\n\t\t\t\tplugin = (node.plugin_enabled and node.plugin) or nil,\n\t\t\t\tplugin_opts = (node.plugin_enabled and node.plugin_opts) or nil,\n\t\t\t\tudp_over_tcp = node.uot == \"1\" and {\n\t\t\t\t\tenabled = true,\n\t\t\t\t\tversion = 2\n\t\t\t\t} or nil,\n\t\t\t\tmultiplex = mux,\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"trojan\" then\n\t\t\tprotocol_table = {\n\t\t\t\tpassword = node.password,\n\t\t\t\ttls = tls,\n\t\t\t\tmultiplex = mux,\n\t\t\t\ttransport = v2ray_transport\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"vmess\" then\n\t\t\tprotocol_table = {\n\t\t\t\tuuid = node.uuid,\n\t\t\t\tsecurity = node.security,\n\t\t\t\talter_id = (node.alter_id) and tonumber(node.alter_id) or 0,\n\t\t\t\tglobal_padding = (node.global_padding == \"1\") and true or false,\n\t\t\t\tauthenticated_length = (node.authenticated_length == \"1\") and true or false,\n\t\t\t\ttls = tls,\n\t\t\t\tpacket_encoding = \"\", --UDP 包编码。(空)：禁用\tpacketaddr：由 v2ray 5+ 支持\txudp：由 xray 支持\n\t\t\t\tmultiplex = mux,\n\t\t\t\ttransport = v2ray_transport,\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"vless\" then\n\t\t\tprotocol_table = {\n\t\t\t\tuuid = node.uuid,\n\t\t\t\tflow = (node.tls == '1' and node.flow) and node.flow or nil,\n\t\t\t\ttls = tls,\n\t\t\t\tpacket_encoding = \"xudp\", --UDP 包编码。(空)：禁用\tpacketaddr：由 v2ray 5+ 支持\txudp：由 xray 支持\n\t\t\t\tmultiplex = mux,\n\t\t\t\ttransport = v2ray_transport,\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"wireguard\" then\n\t\t\tif node.wireguard_reserved then\n\t\t\t\tlocal bytes = {}\n\t\t\t\tif not node.wireguard_reserved:match(\"[^%d,]+\") then\n\t\t\t\t\tnode.wireguard_reserved:gsub(\"%d+\", function(b)\n\t\t\t\t\t\tbytes[#bytes + 1] = tonumber(b)\n\t\t\t\t\tend)\n\t\t\t\telse\n\t\t\t\t\tlocal result = api.base64Decode(node.wireguard_reserved)\n\t\t\t\t\tfor i = 1, #result do\n\t\t\t\t\t\tbytes[i] = result:byte(i)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tnode.wireguard_reserved = #bytes > 0 and bytes or nil\n\t\t\tend\n\t\t\tprotocol_table = {\n\t\t\t\tsystem_interface = nil,\n\t\t\t\tinterface_name = nil,\n\t\t\t\tlocal_address = node.wireguard_local_address,\n\t\t\t\tprivate_key = node.wireguard_secret_key,\n\t\t\t\tpeer_public_key = node.wireguard_public_key,\n\t\t\t\tpre_shared_key = node.wireguard_preSharedKey,\n\t\t\t\treserved = node.wireguard_reserved,\n\t\t\t\tmtu = tonumber(node.wireguard_mtu),\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"hysteria\" then\n\t\t\tlocal server_ports = {}\n\t\t\tif node.hysteria_hop then\n\t\t\t\tnode.hysteria_hop = string.gsub(node.hysteria_hop, \"-\", \":\")\n\t\t\t\tfor range in node.hysteria_hop:gmatch(\"([^,]+)\") do\n\t\t\t\t\tif range:match(\"^%d+:%d+$\") then\n\t\t\t\t\t\ttable.insert(server_ports, range)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tprotocol_table = {\n\t\t\t\tserver_ports = next(server_ports) and server_ports or nil,\n\t\t\t\thop_interval = (function()\n\t\t\t\t\t\t\tif not next(server_ports) then return nil end\n\t\t\t\t\t\t\tlocal v = tonumber((node.hysteria_hop_interval or \"30\"):match(\"^%d+\"))\n\t\t\t\t\t\t\treturn (v and v >= 5) and (v .. \"s\") or \"30s\"\n\t\t\t\t\t\tend)(),\n\t\t\t\tup_mbps = tonumber(node.hysteria_up_mbps),\n\t\t\t\tdown_mbps = tonumber(node.hysteria_down_mbps),\n\t\t\t\tobfs = node.hysteria_obfs,\n\t\t\t\tauth = (node.hysteria_auth_type == \"base64\") and node.hysteria_auth_password or nil,\n\t\t\t\tauth_str = (node.hysteria_auth_type == \"string\") and node.hysteria_auth_password or nil,\n\t\t\t\trecv_window_conn = tonumber(node.hysteria_recv_window_conn),\n\t\t\t\trecv_window = tonumber(node.hysteria_recv_window),\n\t\t\t\tdisable_mtu_discovery = (node.hysteria_disable_mtu_discovery == \"1\") and true or false,\n\t\t\t\ttls = tls\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"shadowtls\" then\n\t\t\tprotocol_table = {\n\t\t\t\tversion = tonumber(node.shadowtls_version),\n\t\t\t\tpassword = (node.shadowtls_version == \"2\" or node.shadowtls_version == \"3\") and node.password or nil,\n\t\t\t\ttls = tls,\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"tuic\" then\n\t\t\tprotocol_table = {\n\t\t\t\tuuid = node.uuid,\n\t\t\t\tpassword = node.password,\n\t\t\t\tcongestion_control = node.tuic_congestion_control or \"cubic\",\n\t\t\t\tudp_relay_mode = node.tuic_udp_relay_mode or \"native\",\n\t\t\t\tudp_over_stream = false,\n\t\t\t\tzero_rtt_handshake = (node.tuic_zero_rtt_handshake == \"1\") and true or false,\n\t\t\t\theartbeat = (tonumber(node.tuic_heartbeat) or 3) .. \"s\",\n\t\t\t\ttls = tls\n\t\t\t}\n\t\t\tnode.tuic_alpn = (node.tuic_alpn and node.tuic_alpn ~= \"default\") and node.tuic_alpn or \"h3\"\n\t\t\tlocal alpn = {}\n\t\t\tstring.gsub(node.tuic_alpn, '[^,]+', function(w)\n\t\t\t\ttable.insert(alpn, w)\n\t\t\tend)\n\t\t\tif #alpn > 0 then protocol_table.tls.alpn = alpn end\n\t\tend\n\n\t\tif node.protocol == \"hysteria2\" then\n\t\t\tlocal server_ports = {}\n\t\t\tif node.hysteria2_hop then\n\t\t\t\tnode.hysteria2_hop = string.gsub(node.hysteria2_hop, \"-\", \":\")\n\t\t\t\tfor range in node.hysteria2_hop:gmatch(\"([^,]+)\") do\n\t\t\t\t\tif range:match(\"^%d+:%d+$\") then\n\t\t\t\t\t\ttable.insert(server_ports, range)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tlocal interval, interval_max\n\t\t\tif next(server_ports) then\n\t\t\t\tinterval = \"30s\"\n\t\t\t\tlocal t = node.hysteria2_hop_interval or \"30s\"\n\t\t\t\tif t:find(\"-\", 1, true) then\n\t\t\t\t\tlocal min, max = t:match(\"^(%d+)%-(%d+)$\")\n\t\t\t\t\tmin = tonumber(min)\n\t\t\t\t\tmax = tonumber(max)\n\t\t\t\t\tif min and max then\n\t\t\t\t\t\tmin = (min >= 5) and min or 5\n\t\t\t\t\t\tmax = (max >= min) and max or min\n\t\t\t\t\t\tinterval = min .. \"s\"\n\t\t\t\t\t\tinterval_max = max .. \"s\"\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tt = tonumber(t:match(\"^%d+\"))\n\t\t\t\t\tt = (t and t >= 5) and t or 30\n\t\t\t\t\tinterval = t .. \"s\"\n\t\t\t\tend\n\t\t\tend\n\t\t\tprotocol_table = {\n\t\t\t\tserver_ports = next(server_ports) and server_ports or nil,\n\t\t\t\thop_interval = interval,\n\t\t\t\thop_interval_max = interval_max,\n\t\t\t\tup_mbps = (node.hysteria2_up_mbps and tonumber(node.hysteria2_up_mbps)) and tonumber(node.hysteria2_up_mbps) or nil,\n\t\t\t\tdown_mbps = (node.hysteria2_down_mbps and tonumber(node.hysteria2_down_mbps)) and tonumber(node.hysteria2_down_mbps) or nil,\n\t\t\t\tobfs = node.hysteria2_obfs_type and {\n\t\t\t\t\ttype = node.hysteria2_obfs_type,\n\t\t\t\t\tpassword = node.hysteria2_obfs_password\n\t\t\t\t} or nil,\n\t\t\t\tpassword = node.hysteria2_auth_password or nil,\n\t\t\t\ttls = tls\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"anytls\" then\n\t\t\tprotocol_table = {\n\t\t\t\tpassword = (node.password and node.password ~= \"\") and node.password or \"\",\n\t\t\t\tidle_session_check_interval = \"30s\",\n\t\t\t\tidle_session_timeout = \"30s\",\n\t\t\t\tmin_idle_session = 5,\n\t\t\t\ttls = tls\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"ssh\" then\n\t\t\tprotocol_table = {\n\t\t\t\tuser = (node.username and node.username ~= \"\") and node.username or \"root\",\n\t\t\t\tpassword = (node.password and node.password ~= \"\") and node.password or \"\",\n\t\t\t\tprivate_key = node.ssh_priv_key,\n\t\t\t\tprivate_key_passphrase = node.ssh_priv_key_pp,\n\t\t\t\thost_key = node.ssh_host_key,\n\t\t\t\thost_key_algorithms = node.ssh_host_key_algo,\n\t\t\t\tclient_version = node.ssh_client_version\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"naive\" then\n\t\t\tprotocol_table = {\n\t\t\t\tusername = (node.username and node.username ~= \"\") and node.username or \"\",\n\t\t\t\tpassword = (node.password and node.password ~= \"\") and node.password or \"\",\n\t\t\t\tinsecure_concurrency = tonumber(node.naive_insecure_concurrency or 0) > 0 and tonumber(node.naive_insecure_concurrency) or 0,\n\t\t\t\tudp_over_tcp = node.uot == \"1\" and {\n\t\t\t\t\tenabled = true,\n\t\t\t\t\tversion = 2\n\t\t\t\t} or false,\n\t\t\t\textra_headers = node.user_agent and {\n\t\t\t\t\t[\"User-Agent\"] = node.user_agent\n\t\t\t\t} or nil,\n\t\t\t\tquic = node.naive_quic == \"1\" and true or false,\n\t\t\t\tquic_congestion_control = (node.naive_quic == \"1\" and node.naive_congestion_control) and node.naive_congestion_control or nil,\n\t\t\t\ttls = tls\n\t\t\t}\n\t\tend\n\n\t\tif protocol_table then\n\t\t\tfor key, value in pairs(protocol_table) do\n\t\t\t\tresult[key] = value\n\t\t\tend\n\t\tend\n\tend\n\treturn result\nend\n\nfunction gen_config_server(node)\n\tlocal outbounds = {\n\t\t{ type = \"direct\", tag = \"direct\" }\n\t}\n\n\tlocal tls = {\n\t\tenabled = true,\n\t\tcertificate_path = node.tls_certificateFile,\n\t\tkey_path = node.tls_keyFile,\n\t\talpn = (node.alpn and node.alpn ~= \"default\") and (function()\n\t\t\tlocal alpn = {}\n\t\t\tstring.gsub(node.alpn, '[^,]+', function(w)\n\t\t\t\ttable.insert(alpn, w)\n\t\t\tend)\n\t\t\tif #alpn > 0 then return alpn end\n\t\t\treturn nil\n\t\tend)() or nil\n\t}\n\n\tif node.tls == \"1\" and node.reality == \"1\" then\n\t\ttls.certificate_path = nil\n\t\ttls.key_path = nil\n\t\ttls.server_name = node.reality_handshake_server\n\t\ttls.reality = {\n\t\t\tenabled = true,\n\t\t\tprivate_key = node.reality_private_key,\n\t\t\tshort_id = {\n\t\t\t\tnode.reality_shortId\n\t\t\t},\n\t\t\thandshake = {\n\t\t\t\tserver = node.reality_handshake_server,\n\t\t\t\tserver_port = tonumber(node.reality_handshake_server_port)\n\t\t\t}\n\t\t}\n\tend\n\n\tif node.tls == \"1\" and node.ech == \"1\" then\n\t\ttls.ech = {\n\t\t\tenabled = true,\n\t\t\tkey = node.ech_key and { node.ech_key } or nil\n\t\t}\n\tend\n\n\tlocal mux = nil\n\tif node.mux == \"1\" then\n\t\tmux = {\n\t\t\tenabled = true,\n\t\t\tpadding = (node.mux_padding == \"1\") and true or false,\n\t\t\tbrutal = {\n\t\t\t\tenabled = (node.tcpbrutal == \"1\") and true or false,\n\t\t\t\tup_mbps = tonumber(node.tcpbrutal_up_mbps) or 10,\n\t\t\t\tdown_mbps = tonumber(node.tcpbrutal_down_mbps) or 50,\n\t\t\t},\n\t\t}\n\tend\n\n\tlocal v2ray_transport = nil\n\n\tif node.transport == \"http\" then\n\t\tv2ray_transport = {\n\t\t\ttype = \"http\",\n\t\t\thost = node.http_host or {},\n\t\t\tpath = node.http_path or \"/\",\n\t\t}\n\tend\n\n\tif node.transport == \"ws\" then\n\t\tv2ray_transport = {\n\t\t\ttype = \"ws\",\n\t\t\tpath = node.ws_path or \"/\",\n\t\t\theaders = (node.ws_host ~= nil) and { Host = node.ws_host } or nil,\n\t\t\tearly_data_header_name = (node.ws_earlyDataHeaderName) and node.ws_earlyDataHeaderName or nil --要与 Xray-core 兼容，请将其设置为 Sec-WebSocket-Protocol。它需要与服务器保持一致。\n\t\t}\n\tend\n\n\tif node.transport == \"httpupgrade\" then\n\t\tv2ray_transport = {\n\t\t\ttype = \"httpupgrade\",\n\t\t\thost = node.httpupgrade_host,\n\t\t\tpath = node.httpupgrade_path or \"/\",\n\t\t}\n\tend\n\n\tif node.transport == \"quic\" then\n\t\tv2ray_transport = {\n\t\t\ttype = \"quic\"\n\t\t}\n\t\t--没有额外的加密支持： 它基本上是重复加密。 并且 Xray-core 在这里与 v2ray-core 不兼容。\n\tend\n\n\tif node.transport == \"grpc\" then\n\t\tv2ray_transport = {\n\t\t\ttype = \"grpc\",\n\t\t\tservice_name = node.grpc_serviceName,\n\t\t}\n\tend\n\n\tlocal inbound = {\n\t\ttype = node.protocol,\n\t\ttag = \"inbound\",\n\t\tlisten = (node.bind_local == \"1\") and \"127.0.0.1\" or \"::\",\n\t\tlisten_port = tonumber(node.port),\n\t}\n\n\tlocal protocol_table = nil\n\n\tif node.protocol == \"mixed\" then\n\t\tprotocol_table = {\n\t\t\tusers = (node.auth == \"1\") and {\n\t\t\t\t{\n\t\t\t\t\tusername = node.username,\n\t\t\t\t\tpassword = node.password\n\t\t\t\t}\n\t\t\t} or nil,\n\t\t\tset_system_proxy = false\n\t\t}\n\tend\n\n\tif node.protocol == \"socks\" then\n\t\tprotocol_table = {\n\t\t\tusers = (node.auth == \"1\") and {\n\t\t\t\t{\n\t\t\t\t\tusername = node.username,\n\t\t\t\t\tpassword = node.password\n\t\t\t\t}\n\t\t\t} or nil\n\t\t}\n\tend\n\n\tif node.protocol == \"http\" then\n\t\tprotocol_table = {\n\t\t\tusers = (node.auth == \"1\") and {\n\t\t\t\t{\n\t\t\t\t\tusername = node.username,\n\t\t\t\t\tpassword = node.password\n\t\t\t\t}\n\t\t\t} or nil,\n\t\t\ttls = (node.tls == \"1\") and tls or nil,\n\t\t}\n\tend\n\n\tif node.protocol == \"shadowsocks\" then\n\t\tprotocol_table = {\n\t\t\tmethod = node.method,\n\t\t\tpassword = node.password,\n\t\t\tmultiplex = mux,\n\t\t}\n\tend\n\n\tif node.protocol == \"vmess\" then\n\t\tif node.uuid then\n\t\t\tlocal users = {}\n\t\t\tfor i = 1, #node.uuid do\n\t\t\t\tusers[i] = {\n\t\t\t\t\tname = node.uuid[i],\n\t\t\t\t\tuuid = node.uuid[i],\n\t\t\t\t\talterId = 0,\n\t\t\t\t}\n\t\t\tend\n\t\t\tprotocol_table = {\n\t\t\t\tusers = users,\n\t\t\t\ttls = (node.tls == \"1\") and tls or nil,\n\t\t\t\tmultiplex = mux,\n\t\t\t\ttransport = v2ray_transport,\n\t\t\t}\n\t\tend\n\tend\n\n\tif node.protocol == \"vless\" then\n\t\tif node.uuid then\n\t\t\tlocal users = {}\n\t\t\tfor i = 1, #node.uuid do\n\t\t\t\tusers[i] = {\n\t\t\t\t\tname = node.uuid[i],\n\t\t\t\t\tuuid = node.uuid[i],\n\t\t\t\t\tflow = node.flow,\n\t\t\t\t}\n\t\t\tend\n\t\t\tprotocol_table = {\n\t\t\t\tusers = users,\n\t\t\t\ttls = (node.tls == \"1\") and tls or nil,\n\t\t\t\tmultiplex = mux,\n\t\t\t\ttransport = v2ray_transport,\n\t\t\t}\n\t\tend\n\tend\n\n\tif node.protocol == \"trojan\" then\n\t\tif node.uuid then\n\t\t\tlocal users = {}\n\t\t\tfor i = 1, #node.uuid do\n\t\t\t\tusers[i] = {\n\t\t\t\t\tname = node.uuid[i],\n\t\t\t\t\tpassword = node.uuid[i],\n\t\t\t\t}\n\t\t\tend\n\t\t\tprotocol_table = {\n\t\t\t\tusers = users,\n\t\t\t\ttls = (node.tls == \"1\") and tls or nil,\n\t\t\t\tfallback = nil,\n\t\t\t\tfallback_for_alpn = nil,\n\t\t\t\tmultiplex = mux,\n\t\t\t\ttransport = v2ray_transport,\n\t\t\t}\n\t\tend\n\tend\n\n\tif node.protocol == \"naive\" then\n\t\tprotocol_table = {\n\t\t\tusers = {\n\t\t\t\t{\n\t\t\t\t\tusername = node.username,\n\t\t\t\t\tpassword = node.password\n\t\t\t\t}\n\t\t\t},\n\t\t\ttls = tls,\n\t\t}\n\tend\n\n\tif node.protocol == \"hysteria\" then\n\t\tprotocol_table = {\n\t\t\tup = node.hysteria_up_mbps .. \" Mbps\",\n\t\t\tdown = node.hysteria_down_mbps .. \" Mbps\",\n\t\t\tup_mbps = tonumber(node.hysteria_up_mbps),\n\t\t\tdown_mbps = tonumber(node.hysteria_down_mbps),\n\t\t\tobfs = node.hysteria_obfs,\n\t\t\tusers = {\n\t\t\t\t{\n\t\t\t\t\tname = \"user1\",\n\t\t\t\t\tauth = (node.hysteria_auth_type == \"base64\") and node.hysteria_auth_password or nil,\n\t\t\t\t\tauth_str = (node.hysteria_auth_type == \"string\") and node.hysteria_auth_password or nil,\n\t\t\t\t}\n\t\t\t},\n\t\t\trecv_window_conn = node.hysteria_recv_window_conn and tonumber(node.hysteria_recv_window_conn) or nil,\n\t\t\trecv_window_client = node.hysteria_recv_window_client and tonumber(node.hysteria_recv_window_client) or nil,\n\t\t\tmax_conn_client = node.hysteria_max_conn_client and tonumber(node.hysteria_max_conn_client) or nil,\n\t\t\tdisable_mtu_discovery = (node.hysteria_disable_mtu_discovery == \"1\") and true or false,\n\t\t\ttls = tls\n\t\t}\n\tend\n\n\tif node.protocol == \"tuic\" then\n\t\tif node.uuid then\n\t\t\tlocal users = {}\n\t\t\tfor i = 1, #node.uuid do\n\t\t\t\tusers[i] = {\n\t\t\t\t\tname = node.uuid[i],\n\t\t\t\t\tuuid = node.uuid[i],\n\t\t\t\t\tpassword = node.password\n\t\t\t\t}\n\t\t\tend\n\t\t\ttls.alpn = (node.tuic_alpn and node.tuic_alpn ~= \"default\") and (function()\n\t\t\t\tlocal alpn = {}\n\t\t\t\tstring.gsub(node.tuic_alpn, '[^,]+', function(w)\n\t\t\t\t\ttable.insert(alpn, w)\n\t\t\t\tend)\n\t\t\t\tif #alpn > 0 then return alpn end\n\t\t\t\treturn nil\n\t\t\tend)() or nil\n\t\t\tprotocol_table = {\n\t\t\t\tusers = users,\n\t\t\t\tcongestion_control = node.tuic_congestion_control or \"cubic\",\n\t\t\t\tzero_rtt_handshake = (node.tuic_zero_rtt_handshake == \"1\") and true or false,\n\t\t\t\theartbeat = (tonumber(node.tuic_heartbeat) or 3) .. \"s\",\n\t\t\t\ttls = tls\n\t\t\t}\n\t\tend\n\tend\n\n\tif node.protocol == \"hysteria2\" then\n\t\tprotocol_table = {\n\t\t\tup_mbps = (node.hysteria2_ignore_client_bandwidth ~= \"1\" and node.hysteria2_up_mbps and tonumber(node.hysteria2_up_mbps)) and tonumber(node.hysteria2_up_mbps) or nil,\n\t\t\tdown_mbps = (node.hysteria2_ignore_client_bandwidth ~= \"1\" and node.hysteria2_down_mbps and tonumber(node.hysteria2_down_mbps)) and tonumber(node.hysteria2_down_mbps) or nil,\n\t\t\tobfs = node.hysteria2_obfs_type and {\n\t\t\t\ttype = node.hysteria2_obfs_type,\n\t\t\t\tpassword = node.hysteria2_obfs_password\n\t\t\t} or nil,\n\t\t\tusers = {\n\t\t\t\t{\n\t\t\t\t\tname = \"user1\",\n\t\t\t\t\tpassword = node.hysteria2_auth_password or nil,\n\t\t\t\t}\n\t\t\t},\n\t\t\tignore_client_bandwidth = (node.hysteria2_ignore_client_bandwidth == \"1\") and true or false,\n\t\t\ttls = tls\n\t\t}\n\tend\n\n\tif node.protocol == \"anytls\" then\n\t\tprotocol_table = {\n\t\t\tusers = {\n\t\t\t\t{\n\t\t\t\t\tname = (node.username and node.username ~= \"\") and node.username or \"sekai\",\n\t\t\t\t\tpassword = node.password\n\t\t\t\t}\n\t\t\t},\n\t\t\ttls = tls,\n\t\t}\n\tend\n\n\tif node.protocol == \"direct\" then\n\t\tprotocol_table = {\n\t\t\tnetwork = (node.d_protocol ~= \"TCP,UDP\") and node.d_protocol or nil,\n\t\t\toverride_address = node.d_address,\n\t\t\toverride_port = tonumber(node.d_port)\n\t\t}\n\tend\n\n\tif protocol_table then\n\t\tfor key, value in pairs(protocol_table) do\n\t\t\tinbound[key] = value\n\t\tend\n\tend\n\n\tlocal route = {\n\t\trules = {\n\t\t\t{\n\t\t\t\tip_is_private = true,\n\t\t\t\taction = node.accept_lan == \"1\" and \"route\" or \"reject\",\n\t\t\t\toutbound = node.accept_lan == \"1\" and \"direct\" or nil\n\n\t\t\t}\n\t\t}\n\t}\n\n\tif node.outbound_node then\n\t\tlocal outbound = nil\n\t\tif node.outbound_node == \"_iface\" and node.outbound_node_iface then\n\t\t\toutbound = {\n\t\t\t\ttype = \"direct\",\n\t\t\t\ttag = \"outbound\",\n\t\t\t\tbind_interface = node.outbound_node_iface,\n\t\t\t\trouting_mark = 255,\n\t\t\t}\n\t\t\tsys.call(string.format(\"mkdir -p %s && touch %s/%s\", api.TMP_IFACE_PATH, api.TMP_IFACE_PATH, node.outbound_node_iface))\n\t\telse\n\t\t\tlocal outbound_node_t = uci:get_all(\"passwall\", node.outbound_node)\n\t\t\tif node.outbound_node == \"_socks\" or node.outbound_node == \"_http\" then\n\t\t\t\toutbound_node_t = {\n\t\t\t\t\ttype = node.type,\n\t\t\t\t\tprotocol = node.outbound_node:gsub(\"_\", \"\"),\n\t\t\t\t\taddress = node.outbound_node_address,\n\t\t\t\t\tport = tonumber(node.outbound_node_port),\n\t\t\t\t\tusername = (node.outbound_node_username and node.outbound_node_username ~= \"\") and node.outbound_node_username or nil,\n\t\t\t\t\tpassword = (node.outbound_node_password and node.outbound_node_password ~= \"\") and node.outbound_node_password or nil,\n\t\t\t\t}\n\t\t\tend\n\t\t\toutbound = require(\"luci.passwall.util_sing-box\").gen_outbound(nil, outbound_node_t, \"outbound\")\n\t\tend\n\t\tif outbound then\n\t\t\troute.final = outbound.tag\n\t\t\ttable.insert(outbounds, 1, outbound)\n\t\tend\n\tend\n\n\tlocal config = {\n\t\tlog = {\n\t\t\tdisabled = (not node or node.log == \"0\") and true or false,\n\t\t\tlevel = node.loglevel or \"info\",\n\t\t\ttimestamp = true,\n\t\t\t--output = logfile,\n\t\t},\n\t\tdns = {\n\t\t\tservers = {{\n\t\t\t\ttype = \"local\",\n\t\t\t\ttag = \"direct\"\n\t\t\t}}\n\t\t},\n\t\tinbounds = { inbound },\n\t\toutbounds = outbounds,\n\t\troute = route\n\t}\n\n\tfor index, value in ipairs(config.outbounds) do\n\t\tfor k, v in pairs(config.outbounds[index]) do\n\t\t\tif k:find(\"_\") == 1 then\n\t\t\t\tconfig.outbounds[index][k] = nil\n\t\t\tend\n\t\tend\n\tend\n\n\treturn config\nend\n\nfunction gen_config(var)\n\tlocal flag = var[\"flag\"]\n\tlocal log = var[\"log\"] or \"0\"\n\tlocal loglevel = var[\"loglevel\"] or \"warn\"\n\tlocal logfile = var[\"logfile\"] or \"/dev/null\"\n\tlocal node_id = var[\"node\"]\n\tlocal server_host = var[\"server_host\"]\n\tlocal server_port = var[\"server_port\"]\n\tlocal tcp_proxy_way = var[\"tcp_proxy_way\"]\n\tlocal tcp_redir_port = var[\"tcp_redir_port\"]\n\tlocal udp_redir_port = var[\"udp_redir_port\"]\n\tlocal local_socks_address = var[\"local_socks_address\"] or \"0.0.0.0\"\n\tlocal local_socks_port = var[\"local_socks_port\"]\n\tlocal local_socks_username = var[\"local_socks_username\"]\n\tlocal local_socks_password = var[\"local_socks_password\"]\n\tlocal local_http_address = var[\"local_http_address\"] or \"0.0.0.0\"\n\tlocal local_http_port = var[\"local_http_port\"]\n\tlocal local_http_username = var[\"local_http_username\"]\n\tlocal local_http_password = var[\"local_http_password\"]\n\tlocal dns_listen_port = var[\"dns_listen_port\"]\n\tlocal direct_dns_port = var[\"direct_dns_port\"]\n\tlocal direct_dns_udp_server = var[\"direct_dns_udp_server\"]\n\tlocal direct_dns_tcp_server = var[\"direct_dns_tcp_server\"]\n\tlocal direct_dns_query_strategy = var[\"direct_dns_query_strategy\"]\n\tlocal remote_dns_udp_server = var[\"remote_dns_udp_server\"]\n\tlocal remote_dns_udp_port = var[\"remote_dns_udp_port\"]\n\tlocal remote_dns_tcp_server = var[\"remote_dns_tcp_server\"]\n\tlocal remote_dns_tcp_port = var[\"remote_dns_tcp_port\"]\n\tlocal remote_dns_doh = var[\"remote_dns_doh\"]\n\tlocal remote_dns_http3 = var[\"remote_dns_http3\"]\n\tlocal remote_dns_client_ip = var[\"remote_dns_client_ip\"]\n\tlocal remote_dns_query_strategy = var[\"remote_dns_query_strategy\"]\n\tlocal remote_dns_fake = var[\"remote_dns_fake\"]\n\tlocal dns_cache = var[\"dns_cache\"]\n\tlocal dns_socks_address = var[\"dns_socks_address\"]\n\tlocal dns_socks_port = var[\"dns_socks_port\"]\n\tlocal no_run = var[\"no_run\"]\n\n\tlocal dns_domain_rules = {}\n\tlocal dns = nil\n\tlocal inbounds = {}\n\tlocal outbounds = {}\n\tlocal rule_set_table = {}\n\tlocal COMMON = {}\n\n\tlocal singbox_settings = uci:get_all(appname, \"@global_singbox[0]\") or {}\n\n\tlocal route = {\n\t\trules = {}\n\t}\n\n\tlocal experimental = nil\n\n\tfunction add_rule_set(tab)\n\t\tif tab and next(tab) and tab.tag and not rule_set_table[tab.tag]then\n\t\t\trule_set_table[tab.tag] = tab\n\t\tend\n\tend\n\n\tfunction parse_rule_set(w, rs)\n\t\t-- Format: remote:https://raw.githubusercontent.com/lyc8503/sing-box-rules/rule-set-geosite/geosite-netflix.srs'\n\t\t-- Format: local:/usr/share/sing-box/geosite-netflix.srs'\n\t\tlocal result = nil\n\t\tif w and #w > 0 then\n\t\t\tif w:find(\"local:\") == 1 or w:find(\"remote:\") == 1 then\n\t\t\t\tlocal _type = w:sub(1, w:find(\":\") - 1) -- \"local\" or \"remote\"\n\t\t\t\tw = w:sub(w:find(\":\") + 1, #w)\n\t\t\t\tlocal format = nil\n\t\t\t\tlocal filename = w:sub(-w:reverse():find(\"/\") + 1) -- geosite-netflix.srs\n\t\t\t\tlocal suffix = \"\"\n\t\t\t\tlocal find_doc = filename:reverse():find(\"%.\")\n\t\t\t\tif find_doc then\n\t\t\t\t\tsuffix = filename:sub(-find_doc + 1) -- \"srs\" or \"json\"\n\t\t\t\tend\n\t\t\t\tif suffix == \"srs\" then\n\t\t\t\t\tformat = \"binary\"\n\t\t\t\telseif suffix == \"json\" then\n\t\t\t\t\tformat = \"source\"\n\t\t\t\tend\n\t\t\t\tif format then\n\t\t\t\t\tlocal rule_set_tag = filename:sub(1, filename:find(\"%.\") - 1) --geosite-netflix\n\t\t\t\t\tif rule_set_tag and #rule_set_tag > 0 then\n\t\t\t\t\t\tif rs then\n\t\t\t\t\t\t\trule_set_tag = \"rs_\" .. rule_set_tag\n\t\t\t\t\t\tend\n\t\t\t\t\t\tresult = {\n\t\t\t\t\t\t\ttype = _type,\n\t\t\t\t\t\t\ttag = rule_set_tag,\n\t\t\t\t\t\t\tformat = format,\n\t\t\t\t\t\t\tpath = _type == \"local\" and w or nil,\n\t\t\t\t\t\t\turl = _type == \"remote\" and w or nil,\n\t\t\t\t\t\t\t--download_detour = _type == \"remote\" and \"\",\n\t\t\t\t\t\t\t--update_interval = _type == \"remote\" and \"\",\n\t\t\t\t\t\t}\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\treturn result\n\tend\n\n\tfunction geo_rule_set(prefix, rule_name)\n\t\tlocal output_srs_file = \"local:\" .. GEO_VAR.TO_SRS_PATH .. prefix .. \"-\" .. rule_name .. \".srs\"\n\t\treturn parse_rule_set(output_srs_file)\n\tend\n\n\tif node_id then\n\t\tlocal node = uci:get_all(appname, node_id)\n\t\tif node then\n\t\t\tif server_host and server_port then\n\t\t\t\tnode.address = server_host\n\t\t\t\tnode.port = server_port\n\t\t\tend\n\t\tend\n\n\t\tif local_socks_port then\n\t\t\tlocal inbound = {\n\t\t\t\ttype = \"socks\",\n\t\t\t\ttag = \"socks-in\",\n\t\t\t\tlisten = local_socks_address,\n\t\t\t\tlisten_port = tonumber(local_socks_port),\n\t\t\t}\n\t\t\tif local_socks_username and local_socks_password and local_socks_username ~= \"\" and local_socks_password ~= \"\" then\n\t\t\t\tinbound.users = {\n\t\t\t\t\t{\n\t\t\t\t\t\tusername = local_socks_username,\n\t\t\t\t\t\tpassword = local_socks_password\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tend\n\t\t\ttable.insert(inbounds, inbound)\n\t\t\ttable.insert(route.rules, {\n\t\t\t\taction = \"sniff\",\n\t\t\t\tinbound = inbound.tag\n\t\t\t})\n\t\tend\n\n\t\tif local_http_port then\n\t\t\tlocal inbound = {\n\t\t\t\ttype = \"http\",\n\t\t\t\ttag = \"http-in\",\n\t\t\t\tlisten = local_http_address,\n\t\t\t\tlisten_port = tonumber(local_http_port)\n\t\t\t}\n\t\t\tif local_http_username and local_http_password and local_http_username ~= \"\" and local_http_password ~= \"\" then\n\t\t\t\tinbound.users = {\n\t\t\t\t\t{\n\t\t\t\t\t\tusername = local_http_username,\n\t\t\t\t\t\tpassword = local_http_password\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tend\n\t\t\ttable.insert(inbounds, inbound)\n\t\tend\n\n\t\tif tcp_redir_port then\n\t\t\tlocal inbound\n\t\t\tif tcp_proxy_way ~= \"tproxy\" then\n\t\t\t\tinbound = {\n\t\t\t\t\ttype = \"redirect\",\n\t\t\t\t\ttag = \"redirect_tcp\",\n\t\t\t\t\tlisten = \"::\",\n\t\t\t\t\tlisten_port = tonumber(tcp_redir_port)\n\t\t\t\t}\n\t\t\telse\n\t\t\t\tinbound = {\n\t\t\t\t\ttype = \"tproxy\",\n\t\t\t\t\ttag = \"tproxy_tcp\",\n\t\t\t\t\tnetwork = \"tcp\",\n\t\t\t\t\tlisten = \"::\",\n\t\t\t\t\tlisten_port = tonumber(tcp_redir_port)\n\t\t\t\t}\n\t\t\tend\n\t\t\ttable.insert(inbounds, inbound)\n\t\t\ttable.insert(route.rules, {\n\t\t\t\taction = \"sniff\",\n\t\t\t\tinbound = inbound.tag\n\t\t\t})\n\t\tend\n\n\t\tif udp_redir_port then\n\t\t\tlocal inbound = {\n\t\t\t\ttype = \"tproxy\",\n\t\t\t\ttag = \"tproxy_udp\",\n\t\t\t\tnetwork = \"udp\",\n\t\t\t\tlisten = \"::\",\n\t\t\t\tlisten_port = tonumber(udp_redir_port)\n\t\t\t}\n\t\t\ttable.insert(inbounds, inbound)\n\t\t\ttable.insert(route.rules, {\n\t\t\t\taction = \"sniff\",\n\t\t\t\tinbound = inbound.tag\n\t\t\t})\n\t\tend\n\n\t\tfunction gen_socks_config_node(node_id, socks_id, remarks)\n\t\t\tif node_id then\n\t\t\t\tsocks_id = node_id:sub(1 + #\"Socks_\")\n\t\t\tend\n\t\t\tlocal result\n\t\t\tlocal socks_node = uci:get_all(appname, socks_id) or nil\n\t\t\tif socks_node then\n\t\t\t\tif not remarks then\n\t\t\t\t\tremarks = socks_node.port\n\t\t\t\tend\n\t\t\t\tresult = {\n\t\t\t\t\t[\".name\"] = \"Socksid_\" .. socks_id,\n\t\t\t\t\tremarks = remarks,\n\t\t\t\t\ttype = \"sing-box\",\n\t\t\t\t\tprotocol = \"socks\",\n\t\t\t\t\taddress = \"127.0.0.1\",\n\t\t\t\t\tport = socks_node.port,\n\t\t\t\t\tuot = \"1\"\n\t\t\t\t}\n\t\t\tend\n\t\t\treturn result\n\t\tend\n\n\t\tlocal nodes_list = {}\n\t\tfunction get_urltest_batch_nodes(_node)\n\t\t\tif #nodes_list == 0 then\n\t\t\t\tfor k, e in ipairs(api.get_valid_nodes()) do\n\t\t\t\t\tif e.node_type == \"normal\" and (not e.chain_proxy or e.chain_proxy == \"\") then\n\t\t\t\t\t\tnodes_list[#nodes_list + 1] = {\n\t\t\t\t\t\t\tid = e[\".name\"],\n\t\t\t\t\t\t\tremarks = e[\"remarks\"],\n\t\t\t\t\t\t\tgroup = e[\"group\"]\n\t\t\t\t\t\t}\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif not _node.node_group or _node.node_group == \"\" then return {} end\n\t\t\tlocal nodes = {}\n\t\t\tfor g in _node.node_group:gmatch(\"%S+\") do\n\t\t\t\tg = api.UrlDecode(g)\n\t\t\t\tfor k, v in pairs(nodes_list) do\n\t\t\t\t\tlocal gn = (v.group and v.group ~= \"\") and v.group or \"default\"\n\t\t\t\t\tif gn:lower() == g:lower() and api.match_node_rule(v.remarks, _node.node_match_rule) then\n\t\t\t\t\t\tnodes[#nodes + 1] = v.id\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\treturn nodes\n\t\tend\n\t\n\t\tfunction get_node_by_id(node_id)\n\t\t\tif not node_id or node_id == \"\" or node_id == \"nil\" then return nil end\n\t\t\tif node_id:find(\"Socks_\") then\n\t\t\t\treturn gen_socks_config_node(node_id)\n\t\t\telse\n\t\t\t\treturn uci:get_all(appname, node_id)\n\t\t\tend\n\t\tend\n\n\t\tfunction gen_urltest_outbound(_node)\n\t\t\tlocal urltest_id = _node[\".name\"]\n\t\t\tlocal urltest_tag = \"urltest-\" .. urltest_id\n\t\t\t-- existing urltest\n\t\t\tfor _, v in ipairs(outbounds) do\n\t\t\t\tif v.tag == urltest_tag then\n\t\t\t\t\treturn v, true\n\t\t\t\tend\n\t\t\tend\n\t\t\t-- new urltest\n\t\t\tlocal ut_nodes\n\t\t\tif _node.node_add_mode and _node.node_add_mode == \"batch\" then\n\t\t\t\tut_nodes = get_urltest_batch_nodes(_node)\n\t\t\telse\n\t\t\t\tut_nodes = _node.urltest_node\n\t\t\tend\n\t\t\tlocal valid_nodes = {}\n\t\t\tfor i = 1, #(ut_nodes or {}) do\n\t\t\t\tlocal ut_node_id = ut_nodes[i]\n\t\t\t\tlocal ut_node_tag = \"ut-\" .. ut_node_id\n\t\t\t\tlocal is_new_ut_node = true\n\t\t\t\tfor _, outbound in ipairs(outbounds) do\n\t\t\t\t\tif string.sub(outbound.tag, 1, #ut_node_tag) == ut_node_tag then\n\t\t\t\t\t\tis_new_ut_node = false\n\t\t\t\t\t\tvalid_nodes[#valid_nodes + 1] = outbound.tag\n\t\t\t\t\t\tbreak\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif is_new_ut_node then\n\t\t\t\t\tlocal outboundTag = gen_outbound_get_tag(flag, ut_node_id, ut_node_tag, { fragment = singbox_settings.fragment == \"1\" or nil, record_fragment = singbox_settings.record_fragment == \"1\" or nil, run_socks_instance = not no_run })\n\t\t\t\t\tif outboundTag then\n\t\t\t\t\t\tvalid_nodes[#valid_nodes + 1] = outboundTag\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif #valid_nodes == 0 then return nil end\n\t\t\tlocal outbound = {\n\t\t\t\ttype = \"urltest\",\n\t\t\t\ttag = urltest_tag,\n\t\t\t\toutbounds = valid_nodes,\n\t\t\t\turl = _node.urltest_url or \"https://www.gstatic.com/generate_204\",\n\t\t\t\tinterval = (api.format_go_time(_node.urltest_interval) ~= \"0s\") and api.format_go_time(_node.urltest_interval) or \"3m\",\n\t\t\t\ttolerance = (_node.urltest_tolerance and tonumber(_node.urltest_tolerance) > 0) and tonumber(_node.urltest_tolerance) or 50,\n\t\t\t\tidle_timeout = (api.format_go_time(_node.urltest_idle_timeout) ~= \"0s\") and api.format_go_time(_node.urltest_idle_timeout) or \"30m\",\n\t\t\t\tinterrupt_exist_connections = (_node.urltest_interrupt_exist_connections == \"true\" or _node.urltest_interrupt_exist_connections == \"1\") and true or false\n\t\t\t}\n\t\t\treturn outbound\n\t\tend\n\n\t\tfunction set_outbound_detour(node, outbound, outbounds_table)\n\t\t\tif not node or not outbound or not outbounds_table then return nil end\n\t\t\tlocal default_outTag = outbound.tag\n\t\t\tlocal last_insert_outbound\n\n\t\t\tif node.shadowtls == \"1\" then\n\t\t\t\tlocal _node = {\n\t\t\t\t\ttype = \"sing-box\",\n\t\t\t\t\tprotocol = \"shadowtls\",\n\t\t\t\t\tshadowtls_version = node.shadowtls_version,\n\t\t\t\t\tpassword = (node.shadowtls_version == \"2\" or node.shadowtls_version == \"3\") and node.shadowtls_password or nil,\n\t\t\t\t\taddress = node.address,\n\t\t\t\t\tport = node.port,\n\t\t\t\t\ttls = \"1\",\n\t\t\t\t\ttls_serverName = node.shadowtls_serverName,\n\t\t\t\t\tutls = node.shadowtls_utls,\n\t\t\t\t\tfingerprint = node.shadowtls_fingerprint\n\t\t\t\t}\n\t\t\t\tlocal shadowtls_outbound = gen_outbound(nil, _node, outbound.tag .. \"_shadowtls\")\n\t\t\t\tif shadowtls_outbound then\n\t\t\t\t\tlast_insert_outbound = shadowtls_outbound\n\t\t\t\t\toutbound.detour = outbound.tag .. \"_shadowtls\"\n\t\t\t\t\toutbound.server = nil\n\t\t\t\t\toutbound.server_port = nil\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif node.chain_proxy == \"1\" and node.preproxy_node then\n\t\t\t\tif outbound[\"_flag_proxy_tag\"] then\n\t\t\t\t\t--Ignore\n\t\t\t\telse\n\t\t\t\t\tlocal preproxy_node = get_node_by_id(node.preproxy_node)\n\t\t\t\t\tif preproxy_node then\n\t\t\t\t\t\tlocal preproxy_outbound, exist\n\t\t\t\t\t\tif preproxy_node.protocol == \"_urltest\" then\n\t\t\t\t\t\t\tpreproxy_outbound, exist = gen_urltest_outbound(preproxy_node)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpreproxy_outbound = gen_outbound(node[\".name\"], preproxy_node)\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif preproxy_outbound then\n\t\t\t\t\t\t\toutbound.tag = preproxy_outbound.tag .. \" -> \" .. outbound.tag\n\t\t\t\t\t\t\toutbound.detour = preproxy_outbound.tag\n\t\t\t\t\t\t\tif not exist then\n\t\t\t\t\t\t\t\tlast_insert_outbound = preproxy_outbound\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tdefault_outTag = outbound.tag\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif node.chain_proxy == \"2\" and node.to_node then\n\t\t\t\tlocal to_node = get_node_by_id(node.to_node)\n\t\t\t\tif to_node then\n\t\t\t\t\t-- Landing Node not support use special node.\n\t\t\t\t\tif to_node.protocol:find(\"^_\") then\n\t\t\t\t\t\tto_node = nil\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif to_node then\n\t\t\t\t\tlocal to_outbound\n\t\t\t\t\tif to_node.type ~= \"sing-box\" then\n\t\t\t\t\t\tlocal tag = to_node[\".name\"]\n\t\t\t\t\t\tlocal new_port = api.get_new_port()\n\t\t\t\t\t\ttable.insert(inbounds, {\n\t\t\t\t\t\t\ttype = \"direct\",\n\t\t\t\t\t\t\ttag = tag,\n\t\t\t\t\t\t\tlisten = \"127.0.0.1\",\n\t\t\t\t\t\t\tlisten_port = new_port,\n\t\t\t\t\t\t\toverride_address = to_node.address,\n\t\t\t\t\t\t\toverride_port = tonumber(to_node.port),\n\t\t\t\t\t\t})\n\t\t\t\t\t\ttable.insert(rules, 1, {\n\t\t\t\t\t\t\taction = \"route\",\n\t\t\t\t\t\t\tinbound = {tag},\n\t\t\t\t\t\t\toutbound = outbound.tag,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif to_node.tls_serverName == nil then\n\t\t\t\t\t\t\tto_node.tls_serverName = to_node.address\n\t\t\t\t\t\tend\n\t\t\t\t\t\tto_node.address = \"127.0.0.1\"\n\t\t\t\t\t\tto_node.port = new_port\n\t\t\t\t\t\tto_outbound = gen_outbound(node[\".name\"], to_node, tag, {\n\t\t\t\t\t\t\ttag = tag,\n\t\t\t\t\t\t\trun_socks_instance = not no_run\n\t\t\t\t\t\t})\n\t\t\t\t\telse\n\t\t\t\t\t\tto_outbound = gen_outbound(node[\".name\"], to_node)\n\t\t\t\t\tend\n\t\t\t\t\tif to_outbound then\n\t\t\t\t\t\tto_outbound.tag = outbound.tag .. \" -> \" .. to_outbound.tag\n\t\t\t\t\t\tif to_node.type == \"sing-box\" then\n\t\t\t\t\t\t\tto_outbound.detour = outbound.tag\n\t\t\t\t\t\tend\n\t\t\t\t\t\ttable.insert(outbounds_table, to_outbound)\n\t\t\t\t\t\tdefault_outTag = to_outbound.tag\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\treturn default_outTag, last_insert_outbound\n\t\tend\n\n\t\tfunction gen_outbound_get_tag(flag, node_id, tag, proxy_table)\n\t\t\tif not node_id or node_id == \"nil\" then return nil end\n\t\t\tlocal node\n\t\t\tif type(node_id) == \"string\" then\n\t\t\t\tnode = get_node_by_id(node_id)\n\t\t\telseif type(node_id) == \"table\" then\n\t\t\t\tnode = node_id\n\t\t\tend\n\t\t\tif not tag then tag = node[\".name\"] end\n\t\t\tif node then\n\t\t\t\tif proxy_table.chain_proxy == \"1\" or proxy_table.chain_proxy == \"2\" then\n\t\t\t\t\tnode.chain_proxy = proxy_table.chain_proxy\n\t\t\t\t\tnode.preproxy_node = proxy_table.chain_proxy == \"1\" and proxy_table.preproxy_node\n\t\t\t\t\tnode.to_node = proxy_table.chain_proxy == \"2\" and proxy_table.to_node\n\t\t\t\t\tproxy_table.chain_proxy = nil\n\t\t\t\t\tproxy_table.preproxy_node = nil\n\t\t\t\t\tproxy_table.to_node = nil\n\t\t\t\tend\n\t\t\t\tlocal outbound, exist\n\t\t\t\tif node.protocol == \"_urltest\" then\n\t\t\t\t\toutbound, exist = gen_urltest_outbound(node)\n\t\t\t\t\tif exist then\n\t\t\t\t\t\treturn outbound.tag\n\t\t\t\t\tend\n\t\t\t\telseif node.protocol == \"_iface\" then\n\t\t\t\t\tif node.iface then\n\t\t\t\t\t\toutbound = {\n\t\t\t\t\t\t\ttag = tag,\n\t\t\t\t\t\t\ttype = \"direct\",\n\t\t\t\t\t\t\tbind_interface = node.iface,\n\t\t\t\t\t\t\trouting_mark = 255,\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsys.call(string.format(\"mkdir -p %s && touch %s/%s\", api.TMP_IFACE_PATH, api.TMP_IFACE_PATH, node.iface))\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tfor _, _outbound in ipairs(outbounds) do\n\t\t\t\t\t\t-- Avoid generating duplicate nested processes\n\t\t\t\t\t\tif _outbound[\"_flag_proxy_tag\"] and _outbound[\"_flag_proxy_tag\"]:find(\"socks <- \" .. node[\".name\"], 1, true) then\n\t\t\t\t\t\t\toutbound = api.clone(_outbound)\n\t\t\t\t\t\t\toutbound.tag = tag\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tif not outbound then\n\t\t\t\t\t\toutbound = gen_outbound(flag, node, tag, proxy_table)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif outbound then\n\t\t\t\t\tlocal default_outbound_tag, last_insert_outbound = set_outbound_detour(node, outbound, outbounds)\n\t\t\t\t\ttable.insert(outbounds, outbound)\n\t\t\t\t\tif last_insert_outbound then\n\t\t\t\t\t\ttable.insert(outbounds, last_insert_outbound)\n\t\t\t\t\tend\n\t\t\t\t\treturn default_outbound_tag\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\trules = {}\n\n\t\tif node and node.protocol == \"_shunt\" then\n\t\t\tinner_fakedns = node.fakedns or \"0\"\n\n\t\t\tlocal function gen_shunt_node(rule_name, _node_id)\n\t\t\t\tif not rule_name then return nil, nil end\n\t\t\t\tif not _node_id then _node_id = node[rule_name] end\n\t\t\t\tif _node_id == \"_direct\" then\n\t\t\t\t\treturn \"direct\"\n\t\t\t\telseif _node_id == \"_blackhole\" then\n\t\t\t\t\treturn \"block\"\n\t\t\t\telseif _node_id == \"_default\" and rule_name ~= \"default\" then\n\t\t\t\t\treturn \"default\"\n\t\t\t\telseif _node_id then\n\t\t\t\t\tlocal proxy_table = {\n\t\t\t\t\t\tfragment = singbox_settings.fragment == \"1\",\n\t\t\t\t\t\trecord_fragment = singbox_settings.record_fragment == \"1\",\n\t\t\t\t\t\trun_socks_instance = not no_run,\n\t\t\t\t\t}\n\t\t\t\t\tlocal preproxy_node_id = node[rule_name .. \"_proxy_tag\"]\n\t\t\t\t\tif preproxy_node_id == _node_id then preproxy_node_id = nil end\n\t\t\t\t\tif preproxy_node_id then\n\t\t\t\t\t\tproxy_table.chain_proxy = \"2\"\n\t\t\t\t\t\tproxy_table.to_node = _node_id\n\t\t\t\t\t\treturn gen_outbound_get_tag(flag, preproxy_node_id, rule_name, proxy_table)\n\t\t\t\t\telse\n\t\t\t\t\t\treturn gen_outbound_get_tag(flag, _node_id, rule_name, proxy_table)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\treturn nil\n\t\t\tend\n\n\t\t\t--default_node\n\t\t\tlocal default_node_id = node.default_node or \"_direct\"\n\t\t\tCOMMON.default_outbound_tag = gen_shunt_node(\"default\", default_node_id)\n\n\t\t\tif inner_fakedns == \"1\" and node[\"default_fakedns\"] == \"1\" then\n\t\t\t\tremote_dns_fake = true\n\t\t\tend\n\n\t\t\t--shunt rule\n\t\t\tuci:foreach(appname, \"shunt_rules\", function(e)\n\t\t\t\tlocal outboundTag = gen_shunt_node(e[\".name\"])\n\t\t\t\tif outboundTag and e.remarks then\n\t\t\t\t\tif outboundTag == \"default\" then\n\t\t\t\t\t\toutboundTag = COMMON.default_outbound_tag\n\t\t\t\t\tend\n\t\t\t\t\tlocal protocols = nil\n\t\t\t\t\tif e[\"protocol\"] and e[\"protocol\"] ~= \"\" then\n\t\t\t\t\t\tprotocols = {}\n\t\t\t\t\t\tstring.gsub(e[\"protocol\"], '[^' .. \" \" .. ']+', function(w)\n\t\t\t\t\t\t\ttable.insert(protocols, w)\n\t\t\t\t\t\tend)\n\t\t\t\t\tend\n\n\t\t\t\t\tlocal inboundTag = nil\n\t\t\t\t\tif e[\"inbound\"] and e[\"inbound\"] ~= \"\" then\n\t\t\t\t\t\tinboundTag = {}\n\t\t\t\t\t\tif e[\"inbound\"]:find(\"tproxy\") then\n\t\t\t\t\t\t\tif tcp_redir_port then\n\t\t\t\t\t\t\t\tif tcp_proxy_way == \"tproxy\" then\n\t\t\t\t\t\t\t\t\ttable.insert(inboundTag, \"tproxy_tcp\")\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\ttable.insert(inboundTag, \"redirect_tcp\")\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tif udp_redir_port then\n\t\t\t\t\t\t\t\ttable.insert(inboundTag, \"tproxy_udp\")\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif e[\"inbound\"]:find(\"socks\") then\n\t\t\t\t\t\t\tif local_socks_port then\n\t\t\t\t\t\t\t\ttable.insert(inboundTag, \"socks-in\")\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\t\n\t\t\t\t\tlocal rule = {\n\t\t\t\t\t\taction = \"route\",\n\t\t\t\t\t\tinbound = inboundTag,\n\t\t\t\t\t\toutbound = outboundTag,\n\t\t\t\t\t\tprotocol = protocols\n\t\t\t\t\t}\n\n\t\t\t\t\tif outboundTag == \"block\" then\n\t\t\t\t\t\trule.action = \"reject\"\n\t\t\t\t\t\trule.outbound = nil\n\t\t\t\t\tend\n\n\t\t\t\t\tif e.network then\n\t\t\t\t\t\tlocal network = {}\n\t\t\t\t\t\tstring.gsub(e.network, '[^' .. \",\" .. ']+', function(w)\n\t\t\t\t\t\t\ttable.insert(network, w)\n\t\t\t\t\t\tend)\n\t\t\t\t\t\trule.network = network\n\t\t\t\t\tend\n\n\t\t\t\t\tif e.source then\n\t\t\t\t\t\tlocal source_ip_cidr = {}\n\t\t\t\t\t\tlocal is_private = false\n\t\t\t\t\t\tstring.gsub(e.source, '[^' .. \" \" .. ']+', function(w)\n\t\t\t\t\t\t\tif w:find(\"geoip\") == 1 then\n\t\t\t\t\t\t\t\tlocal _geoip = w:sub(1 + #\"geoip:\")     --适配srs\n\t\t\t\t\t\t\t\tif _geoip == \"private\" then\n\t\t\t\t\t\t\t\t\tis_private = true\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\ttable.insert(source_ip_cidr, w)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend)\n\t\t\t\t\t\trule.source_ip_is_private = is_private and true or nil\n\t\t\t\t\t\trule.source_ip_cidr = #source_ip_cidr > 0 and source_ip_cidr or nil\n\t\t\t\t\t\tif is_private or #source_ip_cidr > 0 then rule.rule_set_ip_cidr_match_source = true end\n\t\t\t\t\tend\n\n\t\t\t\t\t--[[\n\t\t\t\t\t-- Too low usage rate, hidden\n\t\t\t\t\tif e.sourcePort then\n\t\t\t\t\t\tlocal source_port = {}\n\t\t\t\t\t\tlocal source_port_range = {}\n\t\t\t\t\t\tstring.gsub(e.sourcePort, '[^' .. \",\" .. ']+', function(w)\n\t\t\t\t\t\t\tif tonumber(w) and tonumber(w) >= 1 and tonumber(w) <= 65535 then\n\t\t\t\t\t\t\t\ttable.insert(source_port, tonumber(w))\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\ttable.insert(source_port_range, w)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend)\n\t\t\t\t\t\trule.source_port = #source_port > 0 and source_port or nil\n\t\t\t\t\t\trule.source_port_range = #source_port_range > 0 and source_port_range or nil\n\t\t\t\t\tend\n\t\t\t\t\t]]--\n\n\t\t\t\t\tif e.port then\n\t\t\t\t\t\tlocal port = {}\n\t\t\t\t\t\tlocal port_range = {}\n\t\t\t\t\t\tstring.gsub(e.port, '[^' .. \",\" .. ']+', function(w)\n\t\t\t\t\t\t\tif tonumber(w) and tonumber(w) >= 1 and tonumber(w) <= 65535 then\n\t\t\t\t\t\t\t\ttable.insert(port, tonumber(w))\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\ttable.insert(port_range, w)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend)\n\t\t\t\t\t\trule.port = #port > 0 and port or nil\n\t\t\t\t\t\trule.port_range = #port_range > 0 and port_range or nil\n\t\t\t\t\tend\n\n\t\t\t\t\tlocal rule_set = {}\n\n\t\t\t\t\tif e.domain_list then\n\t\t\t\t\t\tlocal domain_table = {\n\t\t\t\t\t\t\tshunt_tag = e[\".name\"],\n\t\t\t\t\t\t\toutboundTag = outboundTag,\n\t\t\t\t\t\t\tdomain = {},\n\t\t\t\t\t\t\tdomain_suffix = {},\n\t\t\t\t\t\t\tdomain_keyword = {},\n\t\t\t\t\t\t\tdomain_regex = {},\n\t\t\t\t\t\t\trule_set = {},\n\t\t\t\t\t\t\tfakedns = nil,\n\t\t\t\t\t\t\tinvert = e.invert == \"1\" and true or nil\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstring.gsub(e.domain_list, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\t\t\t\tif w:find(\"#\") == 1 then return end\n\t\t\t\t\t\t\tif w:find(\"geosite:\") == 1 then\n\t\t\t\t\t\t\t\tlocal _geosite = w:sub(1 + #\"geosite:\")  --适配srs\n\t\t\t\t\t\t\t\tlocal t = geo_rule_set(\"geosite\", _geosite)\n\t\t\t\t\t\t\t\tif t then\n\t\t\t\t\t\t\t\t\tGEO_VAR.SITE_TAGS[_geosite] = true\n\t\t\t\t\t\t\t\t\tadd_rule_set(t)\n\t\t\t\t\t\t\t\t\ttable.insert(rule_set, t.tag)\n\t\t\t\t\t\t\t\t\ttable.insert(domain_table.rule_set, t.tag)\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\telseif w:find(\"regexp:\") == 1 then\n\t\t\t\t\t\t\t\ttable.insert(domain_table.domain_regex, w:sub(1 + #\"regexp:\"))\n\t\t\t\t\t\t\telseif w:find(\"full:\") == 1 then\n\t\t\t\t\t\t\t\ttable.insert(domain_table.domain, w:sub(1 + #\"full:\"))\n\t\t\t\t\t\t\telseif w:find(\"domain:\") == 1 then\n\t\t\t\t\t\t\t\ttable.insert(domain_table.domain_suffix, w:sub(1 + #\"domain:\"))\n\t\t\t\t\t\t\telseif w:find(\"rule-set:\", 1, true) == 1 or w:find(\"rs:\") == 1 then\n\t\t\t\t\t\t\t\tw = w:sub(w:find(\":\") + 1, #w)\n\t\t\t\t\t\t\t\tlocal t = parse_rule_set(w, true)\n\t\t\t\t\t\t\t\tif t then\n\t\t\t\t\t\t\t\t\tadd_rule_set(t)\n\t\t\t\t\t\t\t\t\ttable.insert(rule_set, t.tag)\n\t\t\t\t\t\t\t\t\ttable.insert(domain_table.rule_set, t.tag)\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\ttable.insert(domain_table.domain_keyword, w)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend)\n\t\t\t\t\t\trule.domain = #domain_table.domain > 0 and domain_table.domain or nil\n\t\t\t\t\t\trule.domain_suffix = #domain_table.domain_suffix > 0 and domain_table.domain_suffix or nil\n\t\t\t\t\t\trule.domain_keyword = #domain_table.domain_keyword > 0 and domain_table.domain_keyword or nil\n\t\t\t\t\t\trule.domain_regex = #domain_table.domain_regex > 0 and domain_table.domain_regex or nil\n\t\t\t\t\t\trule.rule_set = #domain_table.rule_set > 0 and domain_table.rule_set or nil\n\t\t\t\t\t\tif inner_fakedns == \"1\" and node[e[\".name\"] .. \"_fakedns\"] == \"1\" then\n\t\t\t\t\t\t\tdomain_table.fakedns = true\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tif outboundTag then\n\t\t\t\t\t\t\ttable.insert(dns_domain_rules, api.clone(domain_table))\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\n\t\t\t\t\tif e.ip_list then\n\t\t\t\t\t\tlocal ip_cidr = {}\n\t\t\t\t\t\tlocal is_private = false\n\t\t\t\t\t\tstring.gsub(e.ip_list, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\t\t\t\tif w:find(\"#\") == 1 then return end\n\t\t\t\t\t\t\tif w:find(\"geoip:\") == 1 then\n\t\t\t\t\t\t\t\tlocal _geoip = w:sub(1 + #\"geoip:\")     --适配srs\n\t\t\t\t\t\t\t\tif _geoip == \"private\" then\n\t\t\t\t\t\t\t\t\tis_private = true\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tlocal t = geo_rule_set(\"geoip\", _geoip)\n\t\t\t\t\t\t\t\t\tif t then\n\t\t\t\t\t\t\t\t\t\tGEO_VAR.IP_TAGS[_geoip] = true\n\t\t\t\t\t\t\t\t\t\tadd_rule_set(t)\n\t\t\t\t\t\t\t\t\t\ttable.insert(rule_set, t.tag)\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\telseif w:find(\"rule-set:\", 1, true) == 1 or w:find(\"rs:\") == 1 then\n\t\t\t\t\t\t\t\tw = w:sub(w:find(\":\") + 1, #w)\n\t\t\t\t\t\t\t\tlocal t = parse_rule_set(w, true)\n\t\t\t\t\t\t\t\tif t then\n\t\t\t\t\t\t\t\t\tadd_rule_set(t)\n\t\t\t\t\t\t\t\t\ttable.insert(rule_set, t.tag)\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\ttable.insert(ip_cidr, w)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend)\n\n\t\t\t\t\t\trule.ip_is_private = is_private and true or nil\n\t\t\t\t\t\trule.ip_cidr = #ip_cidr > 0 and ip_cidr or nil\n\t\t\t\t\tend\n\n\t\t\t\t\trule.rule_set = #rule_set > 0 and rule_set or nil --适配srs\n\t\t\t\t\trule.invert = e.invert == \"1\" and true or nil\n\n\t\t\t\t\ttable.insert(rules, rule)\n\t\t\t\tend\n\t\t\tend)\n\t\telse\n\t\t\tCOMMON.default_outbound_tag = gen_outbound_get_tag(flag, node or node_id, nil, {\n\t\t\t\tfragment = singbox_settings.fragment == \"1\" or nil,\n\t\t\t\trecord_fragment = singbox_settings.record_fragment == \"1\" or nil,\n\t\t\t\trun_socks_instance = not no_run\n\t\t\t})\n\t\tend\n\n\t\tfor index, value in ipairs(rules) do\n\t\t\ttable.insert(route.rules, rules[index])\n\t\tend\n\tend\n\n\tif COMMON.default_outbound_tag then\n\t\troute.final = COMMON.default_outbound_tag\n\tend\n\n\tif dns_listen_port then\n\t\tdns = {\n\t\t\tservers = {},\n\t\t\trules = {},\n\t\t\tdisable_cache = (dns_cache and dns_cache == \"0\") and true or false,\n\t\t\tdisable_expire = false, --禁用 DNS 缓存过期。\n\t\t\tindependent_cache = false, --使每个 DNS 服务器的缓存独立，以满足特殊目的。如果启用，将轻微降低性能。\n\t\t\treverse_mapping = true, --在响应 DNS 查询后存储 IP 地址的反向映射以为路由目的提供域名。\n\t\t}\n\n\t\tlocal default_outTag = COMMON.default_outbound_tag\n\n\t\tif dns_socks_address and dns_socks_port then\n\t\t\tdefault_outTag = \"dns_socks_out\"\n\t\t\ttable.insert(outbounds, 1, {\n\t\t\t\ttype = \"socks\",\n\t\t\t\ttag = default_outTag,\n\t\t\t\tserver = dns_socks_address,\n\t\t\t\tserver_port = tonumber(dns_socks_port)\n\t\t\t})\n\t\tend\n\n\t\tremote_strategy = \"prefer_ipv6\"\n\t\tif remote_dns_query_strategy == \"UseIPv4\" then\n\t\t\tremote_strategy = \"ipv4_only\"\n\t\telseif remote_dns_query_strategy == \"UseIPv6\" then\n\t\t\tremote_strategy = \"ipv6_only\"\n\t\tend\n\n\t\tlocal remote_server = {\n\t\t\ttag = \"remote\",\n\t\t\tdomain_resolver = \"direct\",\n\t\t\tdetour = default_outTag,\n\t\t}\n\n\t\tif remote_dns_udp_server then\n\t\t\tlocal server_port = tonumber(remote_dns_udp_port) or 53\n\t\t\tremote_server.type = \"udp\"\n\t\t\tremote_server.server = remote_dns_udp_server\n\t\t\tremote_server.server_port = server_port\n\n\t\telseif remote_dns_tcp_server then\n\t\t\tlocal server_port = tonumber(remote_dns_tcp_port) or 53\n\t\t\tremote_server.type = \"tcp\"\n\t\t\tremote_server.server = remote_dns_tcp_server\n\t\t\tremote_server.server_port = server_port\n\n\t\telseif remote_dns_doh then\n\t\t\tlocal _a = api.parseDoH(remote_dns_doh)\n\t\t\tif _a then\n\t\t\t\tremote_server.type = \"https\"\n\t\t\t\tif remote_dns_http3 then\n\t\t\t\t\tremote_server.type = \"h3\"\n\t\t\t\tend\n\t\t\t\tremote_server.server = _a.hostname\n\t\t\t\tremote_server.server_port = _a.port or 443\n\t\t\t\tremote_server.path = _a.pathname or \"\"\n\n\t\t\t\tif api.datatypes.hostname(_a.hostname) then\n\t\t\t\t\tif _a.hostip then\n\t\t\t\t\t\tif not hosts_predefined then hosts_predefined = {} end\n\t\t\t\t\t\thosts_predefined[_a.hostname] = _a.hostip\n\t\t\t\t\t\tremote_server_domain_resolver = \"hosts\"\n\t\t\t\t\telse\n\t\t\t\t\t\tGLOBAL.DNS_HOSTNAME[_a.hostname] = true\n\t\t\t\t\t\tremote_server_domain_resolver = \"direct\"\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tif api.is_local_ip(remote_server.server) then  --dns为本地ip，不走代理\n\t\t\tremote_server.detour = \"direct\"\n\t\tend\n\n\t\tif remote_server_domain_resolver then\n\t\t\tremote_server.domain_resolver = remote_server_domain_resolver\n\t\tend\n\n\t\ttable.insert(dns.servers, remote_server)\n\n\t\tfakedns_tag = \"remote_fakeip\"\n\t\tif remote_dns_fake or inner_fakedns == \"1\" then\t\t\n\t\t\ttable.insert(dns.servers, {\n\t\t\t\ttag = fakedns_tag,\n\t\t\t\ttype = \"fakeip\",\n\t\t\t\tinet4_range = \"198.18.0.0/15\",\n\t\t\t\tinet6_range = \"fc00::/18\",\n\t\t\t})\n\n\t\t\tif not experimental then\n\t\t\t\texperimental = {}\n\t\t\tend\n\t\t\texperimental.cache_file = {\n\t\t\t\tenabled = true,\n\t\t\t\tstore_fakeip = true,\n\t\t\t\tpath = api.CACHE_PATH .. \"/singbox_\" .. flag .. \".db\"\n\t\t\t}\n\t\tend\n\n\t\tif direct_dns_udp_server or direct_dns_tcp_server then\n\t\t\tlocal domain = {}\n\t\t\tlocal nodes_domain_text = sys.exec([[uci show passwall | sed -n \"s/.*\\.address='\\([^']*\\)'/\\1/p\" | sort -u]])\n\t\t\tstring.gsub(nodes_domain_text, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\tw = (w or \"\"):lower()\n\t\t\t\tif not api.vps_domain_exclude(w) and api.datatypes.hostname(w) and not GLOBAL.VPS_EXCLUDE[w] then\n\t\t\t\t\ttable.insert(domain, w)\n\t\t\t\tend\n\t\t\tend)\n\t\t\tif #domain > 0 then\n\t\t\t\ttable.insert(dns_domain_rules, 1, {\n\t\t\t\t\toutboundTag = \"direct\",\n\t\t\t\t\tdomain = domain\n\t\t\t\t})\n\t\t\tend\n\n\t\t\tdirect_strategy = \"prefer_ipv6\"\n\t\t\tif direct_dns_query_strategy == \"UseIPv4\" then\n\t\t\t\tdirect_strategy = \"ipv4_only\"\n\t\t\telseif direct_dns_query_strategy == \"UseIPv6\" then\n\t\t\t\tdirect_strategy = \"ipv6_only\"\n\t\t\tend\n\n\t\t\tlocal direct_dns_server, port, type\n\t\t\tif direct_dns_udp_server then\n\t\t\t\tport = tonumber(direct_dns_port) or 53\n\t\t\t\tdirect_dns_server = direct_dns_udp_server\n\t\t\t\ttype = \"udp\"\n\t\t\telseif direct_dns_tcp_server then\n\t\t\t\tport = tonumber(direct_dns_port) or 53\n\t\t\t\tdirect_dns_server = direct_dns_tcp_server\n\t\t\t\ttype = \"tcp\"\n\t\t\tend\n\n\t\t\ttable.insert(dns.servers, {\n\t\t\t\ttag = \"direct\",\n\t\t\t\ttype = type,\n\t\t\t\tserver = direct_dns_server,\n\t\t\t\tserver_port = port,\n\t\t\t\tdetour = \"direct\",\n\t\t\t})\n\t\tend\n\n\t\tlocal default_dns_flag = \"remote\"\n\t\tif dns_socks_address and dns_socks_port then\n\t\telse\n\t\t\tif node_id and (tcp_redir_port or udp_redir_port) then\n\t\t\t\tlocal node = get_node_by_id(node_id)\n\t\t\t\tif node.protocol == \"_shunt\" then\n\t\t\t\t\tif node.default_node == \"_direct\" then\n\t\t\t\t\t\tdefault_dns_flag = \"direct\"\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telse default_dns_flag = \"direct\"\n\t\t\tend\n\t\tend\n\t\tif default_dns_flag == \"remote\" then\n\t\t\tif remote_dns_fake then\n\t\t\t\ttable.insert(dns.rules, {\n\t\t\t\t\tquery_type = { \"A\", \"AAAA\" },\n\t\t\t\t\tserver = fakedns_tag,\n\t\t\t\t\tdisable_cache = true,\n\t\t\t\t\trewrite_ttl = 30,\n\t\t\t\t\tstrategy = remote_strategy\n\t\t\t\t})\n\t\t\tend\n\t\tend\n\t\tdns.final = default_dns_flag\n\n\t\t--按分流顺序DNS\n\t\tif dns_domain_rules and #dns_domain_rules > 0 then\n\t\t\tfor index, value in ipairs(dns_domain_rules) do\n\t\t\t\tif value.outboundTag and (value.domain or value.domain_suffix or value.domain_keyword or value.domain_regex or value.rule_set) then\n\t\t\t\t\tlocal dns_rule = {\n\t\t\t\t\t\taction = \"route\",\n\t\t\t\t\t\tserver = value.outboundTag,\n\t\t\t\t\t\tdomain = (value.domain and #value.domain > 0) and value.domain or nil,\n\t\t\t\t\t\tdomain_suffix = (value.domain_suffix and #value.domain_suffix > 0) and value.domain_suffix or nil,\n\t\t\t\t\t\tdomain_keyword = (value.domain_keyword and #value.domain_keyword > 0) and value.domain_keyword or nil,\n\t\t\t\t\t\tdomain_regex = (value.domain_regex and #value.domain_regex > 0) and value.domain_regex or nil,\n\t\t\t\t\t\trule_set = (value.rule_set and #value.rule_set > 0) and value.rule_set or nil,  --适配srs\n\t\t\t\t\t\tdisable_cache = false,\n\t\t\t\t\t\tinvert = value.invert,\n\t\t\t\t\t}\n\t\t\t\t\tif value.outboundTag == \"block\" then\n\t\t\t\t\t\tdns_rule.action = \"predefined\"\n\t\t\t\t\t\tdns_rule.rcode = \"NOERROR\"\n\t\t\t\t\t\tdns_rule.server = nil\n\t\t\t\t\t\tdns_rule.disable_cache = nil\n\t\t\t\t\tend\n\t\t\t\t\tif value.outboundTag == \"direct\" then\n\t\t\t\t\t\tdns_rule.strategy = direct_strategy\n\t\t\t\t\tend\n\t\t\t\t\tif value.outboundTag ~= \"block\" and value.outboundTag ~= \"direct\" then\n\t\t\t\t\t\tdns_rule.server = \"remote\"\n\t\t\t\t\t\tdns_rule.rewrite_ttl = 30\n\t\t\t\t\t\tdns_rule.strategy = remote_strategy\n\t\t\t\t\t\tdns_rule.client_subnet = remote_dns_client_ip\n\t\t\t\t\t\tif value.outboundTag ~= COMMON.default_outbound_tag and (remote_server.address or remote_server.server) then\n\t\t\t\t\t\t\tlocal remote_dns_server = api.clone(remote_server)\n\t\t\t\t\t\t\tremote_dns_server.tag = value.shunt_tag\n\t\t\t\t\t\t\tlocal is_local = (remote_server.address and api.is_local_ip(remote_server.address)) or\n\t\t\t\t\t\t\t\t\t (remote_server.server and api.is_local_ip(remote_server.server))  --dns为本地ip，不走代理\n\t\t\t\t\t\t\tremote_dns_server.detour = is_local and \"direct\" or value.outboundTag\n\t\t\t\t\t\t\ttable.insert(dns.servers, remote_dns_server)\n\t\t\t\t\t\t\tdns_rule.server = remote_dns_server.tag\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif value.fakedns then\n\t\t\t\t\t\t\tlocal fakedns_dns_rule = api.clone(dns_rule)\n\t\t\t\t\t\t\tfakedns_dns_rule.query_type = {\n\t\t\t\t\t\t\t\t\"A\", \"AAAA\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfakedns_dns_rule.server = fakedns_tag\n\t\t\t\t\t\t\tfakedns_dns_rule.disable_cache = true\n\t\t\t\t\t\t\ttable.insert(dns.rules, fakedns_dns_rule)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\ttable.insert(dns.rules, dns_rule)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tlocal dns_in_inbound = {\n\t\t\ttype = \"direct\",\n\t\t\ttag = \"dns-in\",\n\t\t\tlisten = \"127.0.0.1\",\n\t\t\tlisten_port = tonumber(dns_listen_port),\n\t\t}\n\t\ttable.insert(inbounds, dns_in_inbound)\n\t\ttable.insert(route.rules, {\n\t\t\taction = \"sniff\",\n\t\t\tinbound = dns_in_inbound.tag\n\t\t})\n\t\ttable.insert(route.rules, 1, {\n\t\t\taction = \"hijack-dns\",\n\t\t\tinbound = dns_in_inbound.tag\n\t\t})\n\tend\n\n\tif not dns then\n\t\tdns = {\n\t\t\tservers = {{\n\t\t\t\ttype = \"local\",\n\t\t\t\ttag = \"direct\"\n\t\t\t}}\n\t\t}\n\tend\n\n\tif not dns.rules then dns.rules = {} end\n\n\tfor i, v in pairs(GLOBAL.DNS_SERVER) do\n\t\ttable.insert(dns.servers, v.server)\n\t\ttable.insert(dns.rules, 1, {\n\t\t\taction = \"route\",\n\t\t\tserver = v.server.tag,\n\t\t\tdisable_cache = false,\n\t\t\tdomain = v.domain,\n\t\t})\n\tend\n\tif next(GLOBAL.DNS_HOSTNAME) then\n\t\tlocal hostname = {}\n\t\tfor line, _ in pairs(GLOBAL.DNS_HOSTNAME) do\n\t\t\ttable.insert(hostname, line)\n\t\tend\n\t\ttable.insert(dns.rules, 1, {\n\t\t\tquery_type = { \"A\", \"AAAA\" },\n\t\t\tdomain = hostname,\n\t\t\tserver = \"direct\"\n\t\t})\n\tend\n\n\tif next(ech_domain) ~= nil then\n\t\ttable.insert(dns.servers, {\n\t\t\ttag = \"ech-dns\",\n\t\t\ttype = \"https\",\n\t\t\tserver = \"223.5.5.5\"\n\t\t})\n\t\tlocal domain = {}\n\t\tfor line, _ in pairs(ech_domain) do domain[#domain+1] = line end\n\t\ttable.insert(dns.rules, 1, {\n\t\t\tdomain = domain,\n\t\t\tserver = \"ech-dns\"\n\t\t})\n\tend\n\n\ttable.insert(dns.servers, {\n\t\ttag = \"hosts\",\n\t\ttype = \"hosts\",\n\t\tpredefined = (hosts_predefined and next(hosts_predefined) ~= nil) and hosts_predefined or nil\n\t})\n\tif not version_ge_1_14_0 then\n\t\ttable.insert(dns.rules, 1, {\n\t\t\tip_accept_any = true,\n\t\t\tserver = \"hosts\"\n\t\t})\n\telse\n\t\ttable.insert(dns.rules, 1, {\n\t\t\taction = \"evaluate\",\n\t\t\tserver = \"hosts\"\n\t\t})\n\t\ttable.insert(dns.rules, 2, {\n\t\t\tmatch_response = true,\n\t\t\tip_accept_any = true,\n\t\t\taction = \"respond\"\n\t\t})\n\tend\n\n\tif COMMON.default_outbound_tag == \"block\" then\n\t\troute.final = nil\n\t\ttable.insert(route.rules, {\n\t\t\taction = \"reject\"\n\t\t})\n\tend\n\n\tif next(rule_set_table) then\n\t\troute.rule_set = {}\n\t\tfor k, v in pairs(rule_set_table) do\n\t\t\ttable.insert(route.rule_set, v)\n\t\tend\n\tend\n\t\n\tif inbounds or outbounds then\n\t\tlocal config = {\n\t\t\tlog = {\n\t\t\t\tdisabled = log == \"0\" and true or false,\n\t\t\t\tlevel = loglevel,\n\t\t\t\ttimestamp = true,\n\t\t\t\toutput = logfile,\n\t\t\t},\n\t\t\t-- DNS\n\t\t\tdns = dns,\n\t\t\t-- 传入连接\n\t\t\tinbounds = inbounds,\n\t\t\t-- 传出连接\n\t\t\toutbounds = outbounds,\n\t\t\t-- 路由\n\t\t\troute = route,\n\t\t\t--实验性\n\t\t\texperimental = experimental,\n\t\t}\n\t\ttable.insert(outbounds, {\n\t\t\ttype = \"direct\",\n\t\t\ttag = \"direct\",\n\t\t\trouting_mark = 255,\n\t\t\tdomain_resolver = {\n\t\t\t\tserver = \"direct\",\n\t\t\t\tstrategy = \"prefer_ipv6\"\n\t\t\t}\n\t\t})\n\t\tfor index, value in ipairs(config.outbounds) do\n\t\t\tif not value[\"_flag_proxy_tag\"] and not value.detour and value[\"_id\"] and value.server and (value.server_port or value.server_ports) and not no_run then\n\t\t\t\tsys.call(string.format(\"echo '%s' >> %s\", value[\"_id\"], api.TMP_PATH .. \"/direct_node_list\"))\n\t\t\tend\n\t\t\tif not value.detour and value.server then\n\t\t\t\tvalue.detour = \"direct\"\n\t\t\tend\n\t\t\tif value.server and not api.datatypes.hostname(value.server) then\n\t\t\t\tvalue.domain_resolver = nil\n\t\t\tend\n\t\t\tfor k, v in pairs(config.outbounds[index]) do\n\t\t\t\tif k:find(\"_\") == 1 then\n\t\t\t\t\tconfig.outbounds[index][k] = nil\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif true then\n\t\t\tlocal endpoints = {}\n\t\t\tfor i = #config.outbounds, 1, -1 do\n\t\t\t\tlocal value = config.outbounds[i]\n\t\t\t\tif value.type == \"wireguard\" then\n\t\t\t\t\t-- https://sing-box.sagernet.org/migration/#migrate-wireguard-outbound-to-endpoint\n\t\t\t\t\tlocal endpoint = {\n\t\t\t\t\t\ttype = \"wireguard\",\n\t\t\t\t\t\ttag = value.tag,\n\t\t\t\t\t\tsystem = value.system_interface,\n\t\t\t\t\t\tname = value.interface_name,\n\t\t\t\t\t\tmtu = value.mtu,\n\t\t\t\t\t\taddress = value.local_address,\n\t\t\t\t\t\tprivate_key = value.private_key,\n\t\t\t\t\t\tpeers = {\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\taddress = value.server,\n\t\t\t\t\t\t\t\tport = value.server_port,\n\t\t\t\t\t\t\t\tpublic_key = value.peer_public_key,\n\t\t\t\t\t\t\t\tpre_shared_key = value.pre_shared_key,\n\t\t\t\t\t\t\t\tallowed_ips = {\"0.0.0.0/0\"},\n\t\t\t\t\t\t\t\treserved = value.reserved\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdomain_resolver = {\n\t\t\t\t\t\t\tserver = \"direct\",\n\t\t\t\t\t\t\tstrategy = value.domain_strategy\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdetour = value.detour\n\t\t\t\t\t}\n\t\t\t\t\tendpoints[#endpoints + 1] = endpoint\n\t\t\t\t\ttable.remove(config.outbounds, i)\n\t\t\t\tend\n\t\t\tend\n\t\t\tif #endpoints > 0 then\n\t\t\t\tconfig.endpoints = endpoints\n\t\t\tend\n\t\tend\n\t\treturn jsonc.stringify(config, 1)\n\tend\nend\n\nfunction gen_proto_config(var)\n\tlocal local_socks_address = var[\"local_socks_address\"] or \"0.0.0.0\"\n\tlocal local_socks_port = var[\"local_socks_port\"]\n\tlocal local_socks_username = var[\"local_socks_username\"]\n\tlocal local_socks_password = var[\"local_socks_password\"]\n\tlocal local_http_address = var[\"local_http_address\"] or \"0.0.0.0\"\n\tlocal local_http_port = var[\"local_http_port\"]\n\tlocal local_http_username = var[\"local_http_username\"]\n\tlocal local_http_password = var[\"local_http_password\"]\n\tlocal server_proto = var[\"server_proto\"]\n\tlocal server_address = var[\"server_address\"]\n\tlocal server_port = var[\"server_port\"]\n\tlocal server_username = var[\"server_username\"]\n\tlocal server_password = var[\"server_password\"]\n\n\tlocal inbounds = {}\n\tlocal outbounds = {}\n\n\tif local_socks_address and local_socks_port then\n\t\tlocal inbound = {\n\t\t\ttype = \"socks\",\n\t\t\ttag = \"socks-in\",\n\t\t\tlisten = local_socks_address,\n\t\t\tlisten_port = tonumber(local_socks_port),\n\t\t}\n\t\tif local_socks_username and local_socks_password and local_socks_username ~= \"\" and local_socks_password ~= \"\" then\n\t\t\tinbound.users = {\n\t\t\t\tusername = local_socks_username,\n\t\t\t\tpassword = local_socks_password\n\t\t\t}\n\t\tend\n\t\ttable.insert(inbounds, inbound)\n\tend\n\n\tif local_http_address and local_http_port then\n\t\tlocal inbound = {\n\t\t\ttype = \"http\",\n\t\t\ttag = \"http-in\",\n\t\t\ttls = nil,\n\t\t\tlisten = local_http_address,\n\t\t\tlisten_port = tonumber(local_http_port),\n\t\t}\n\t\tif local_http_username and local_http_password and local_http_username ~= \"\" and local_http_password ~= \"\" then\n\t\t\tinbound.users = {\n\t\t\t\t{\n\t\t\t\t\tusername = local_http_username,\n\t\t\t\t\tpassword = local_http_password\n\t\t\t\t}\n\t\t\t}\n\t\tend\n\t\ttable.insert(inbounds, inbound)\n\tend\n\n\tif server_proto ~= \"nil\" and server_address ~= \"nil\" and server_port ~= \"nil\" then\n\t\tlocal outbound = {\n\t\t\ttype = server_proto,\n\t\t\ttag = \"out\",\n\t\t\tserver = server_address,\n\t\t\tserver_port = tonumber(server_port),\n\t\t\tusername = (server_username and server_password) and server_username or nil,\n\t\t\tpassword = (server_username and server_password) and server_password or nil,\n\t\t}\n\t\tif outbound then table.insert(outbounds, outbound) end\n\tend\n\t\n\tlocal config = {\n\t\tlog = {\n\t\t\tdisabled = true,\n\t\t\tlevel = \"warn\",\n\t\t\ttimestamp = true,\n\t\t},\n\t\t-- 传入连接\n\t\tinbounds = inbounds,\n\t\t-- 传出连接\n\t\toutbounds = outbounds,\n\t}\n\treturn jsonc.stringify(config, 1)\nend\n\n_G.gen_config = gen_config\n_G.gen_proto_config = gen_proto_config\n_G.geo_convert_srs = geo_convert_srs\n\nif arg[1] then\n\tlocal func =_G[arg[1]]\n\tif func then\n\t\tlocal var = nil\n\t\tif arg[2] then\n\t\t\tvar = jsonc.parse(arg[2])\n\t\tend\n\t\tprint(func(var))\n\t\tif (next(GEO_VAR.SITE_TAGS) or next(GEO_VAR.IP_TAGS)) and not no_run then\n\t\t\tconvert_geofile()\n\t\tend\n\tend\nend\n"
  },
  {
    "path": "luci-app-passwall/luasrc/passwall/util_xray.lua",
    "content": "module(\"luci.passwall.util_xray\", package.seeall)\nlocal api = require \"luci.passwall.api\"\nlocal uci = api.uci\nlocal sys = api.sys\nlocal jsonc = api.jsonc\nlocal appname = \"passwall\"\nlocal fs = api.fs\n\nlocal GLOBAL = {\n\tDNS_SERVER = {},\n\tDNS_HOSTNAME = {},\n\tVPS_EXCLUDE = {}\n}\n\nlocal xray_version = api.get_app_version(\"xray\")\n\nlocal function get_domain_excluded()\n\tlocal path = string.format(\"/usr/share/%s/rules/domains_excluded\", appname)\n\tlocal content = fs.readfile(path)\n\tif not content then return nil end\n\tlocal hosts = {}\n\tstring.gsub(content, '[^' .. \"\\n\" .. ']+', function(w)\n\t\tlocal s = api.trim(w)\n\t\tif s == \"\" then return end\n\t\tif s:find(\"#\") and s:find(\"#\") == 1 then return end\n\t\tif not s:find(\"#\") or s:find(\"#\") ~= 1 then table.insert(hosts, s) end\n\tend)\n\tif #hosts == 0 then hosts = nil end\n\treturn hosts\nend\n\nfunction gen_outbound(flag, node, tag, proxy_table)\n\tlocal result = nil\n\tif node then\n\t\tlocal node_id = node[\".name\"]\n\t\tif tag == nil then\n\t\t\ttag = node_id\n\t\tend\n\t\tlocal remarks = node.remarks\n\n\t\tlocal proxy_tag = nil\n\t\tlocal fragment = nil\n\t\tlocal noise = nil\n\t\tlocal run_socks_instance = true\n\t\tif proxy_table ~= nil and type(proxy_table) == \"table\" then\n\t\t\tproxy_tag = proxy_table.tag or nil\n\t\t\tfragment = proxy_table.fragment or nil\n\t\t\tnoise = proxy_table.noise or nil\n\t\t\trun_socks_instance = proxy_table.run_socks_instance\n\t\tend\n\n\t\tif node.type ~= \"Xray\" then\n\t\t\tif node.type == \"Socks\" then\n\t\t\t\tnode.protocol = \"socks\"\n\t\t\t\tnode.transport = \"tcp\"\n\t\t\telse\n\t\t\t\tlocal relay_port = node.port\n\t\t\t\tlocal new_port = api.get_new_port()\n\t\t\t\tlocal config_file = string.format(\"%s_%s_%s.json\", flag, tag, new_port)\n\t\t\t\tif tag and node_id and not tag:find(node_id) then\n\t\t\t\t\tconfig_file = string.format(\"%s_%s_%s_%s.json\", flag, tag, node_id, new_port)\n\t\t\t\tend\n\t\t\t\tif run_socks_instance then\n\t\t\t\t\tsys.call(string.format('/usr/share/%s/app.sh run_socks \"%s\"> /dev/null',\n\t\t\t\t\t\tappname,\n\t\t\t\t\t\tstring.format(\"flag=%s node=%s bind=%s socks_port=%s config_file=%s relay_port=%s\",\n\t\t\t\t\t\t\tnew_port, --flag\n\t\t\t\t\t\t\tnode_id, --node\n\t\t\t\t\t\t\t\"127.0.0.1\", --bind\n\t\t\t\t\t\t\tnew_port, --socks port\n\t\t\t\t\t\t\tconfig_file, --config file\n\t\t\t\t\t\t\t(proxy_tag and relay_port) and tostring(relay_port) or \"\" --relay port\n\t\t\t\t\t\t)\n\t\t\t\t\t))\n\t\t\t\tend\n\t\t\t\tnode = {}\n\t\t\t\tnode.protocol = \"socks\"\n\t\t\t\tnode.transport = \"tcp\"\n\t\t\t\tnode.address = \"127.0.0.1\"\n\t\t\t\tnode.port = new_port\n\t\t\tend\n\t\t\tnode.stream_security = \"none\"\n\t\t\tproxy_tag = \"socks <- \" .. node_id\n\t\telse\n\t\t\tif proxy_tag then\n\t\t\t\tnode.proxySettings = {\n\t\t\t\t\ttag = proxy_tag,\n\t\t\t\t\ttransportLayer = true\n\t\t\t\t}\n\t\t\tend\n\t\tend\n\n\t\tif node.type == \"Xray\" then\n\t\t\tif node.tls and node.tls == \"1\" then\n\t\t\t\tnode.stream_security = \"tls\"\n\t\t\t\tif node.type == \"Xray\" and node.reality and node.reality == \"1\" then\n\t\t\t\t\tnode.stream_security = \"reality\"\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tif node.protocol == \"wireguard\" and node.wireguard_reserved then\n\t\t\tlocal bytes = {}\n\t\t\tif not node.wireguard_reserved:match(\"[^%d,]+\") then\n\t\t\t\tnode.wireguard_reserved:gsub(\"%d+\", function(b)\n\t\t\t\t\tbytes[#bytes + 1] = tonumber(b)\n\t\t\t\tend)\n\t\t\telse\n\t\t\t\tlocal result = api.base64Decode(node.wireguard_reserved)\n\t\t\t\tfor i = 1, #result do\n\t\t\t\t\tbytes[i] = result:byte(i)\n\t\t\t\tend\n\t\t\tend\n\t\t\tnode.wireguard_reserved = #bytes > 0 and bytes or nil\n\t\tend\n\n\t\tif node.protocol == \"hysteria2\" then\n\t\t\tnode.protocol = \"hysteria\"\n\t\t\tnode.transport = \"hysteria\"\n\t\t\tnode.stream_security = \"tls\"\n\t\tend\n\n\t\tif remarks then\n\t\t\ttag = tag .. \":\" .. remarks\n\t\tend\n\n\t\tnode.address = (node.address or \"\"):lower()\n\n\t\tresult = {\n\t\t\t_id = node_id,\n\t\t\t_flag = flag,\n\t\t\t_flag_proxy_tag = proxy_tag,\n\t\t\ttag = tag,\n\t\t\tproxySettings = node.proxySettings or nil,\n\t\t\tprotocol = node.protocol,\n\t\t\tmux = {\n\t\t\t\tenabled = (node.mux == \"1\") and true or false,\n\t\t\t\tconcurrency = (node.mux == \"1\" and ((node.mux_concurrency) and tonumber(node.mux_concurrency) or -1)) or nil,\n\t\t\t\txudpConcurrency = (node.mux == \"1\" and ((node.xudp_concurrency) and tonumber(node.xudp_concurrency) or 8)) or nil\n\t\t\t} or nil,\n\t\t\t-- 底层传输配置\n\t\t\tstreamSettings = (node.streamSettings or node.protocol == \"vmess\" or node.protocol == \"vless\" or node.protocol == \"socks\" or node.protocol == \"shadowsocks\" or node.protocol == \"trojan\" or node.protocol == \"hysteria\") and {\n\t\t\t\tsockopt = {\n\t\t\t\t\tmark = 255,\n\t\t\t\t\tdomainStrategy = node.domain_strategy or \"UseIP\",\n\t\t\t\t\ttcpFastOpen = (node.tcp_fast_open == \"1\") and true or nil,\n\t\t\t\t\ttcpMptcp = (node.tcpMptcp == \"1\") and true or nil\n\t\t\t\t},\n\t\t\t\tnetwork = node.transport,\n\t\t\t\tsecurity = node.stream_security,\n\t\t\t\ttlsSettings = (node.stream_security == \"tls\") and {\n\t\t\t\t\tserverName = node.tls_serverName,\n\t\t\t\t\tallowInsecure = (function()\n\t\t\t\t\t\t\t\tif node.tls_pinSHA256 and node.tls_pinSHA256 ~= \"\" then return nil end\n\t\t\t\t\t\t\t\tif api.compare_versions(os.date(\"%Y.%m.%d\"), \"<\", \"2026.6.1\") and node.tls_allowInsecure == \"1\" then return true end\n\t\t\t\t\t\t\tend)(),\n\t\t\t\t\tfingerprint = (node.type == \"Xray\" and node.utls == \"1\" and node.fingerprint and node.fingerprint ~= \"\") and node.fingerprint or nil,\n\t\t\t\t\tpinnedPeerCertSha256 = (function()\n\t\t\t\t\t\t\t\tif api.compare_versions(xray_version, \"<\", \"26.1.31\") then return nil end\n\t\t\t\t\t\t\t\tif not node.tls_pinSHA256 then return \"\" end\n\t\t\t\t\t\t\t\treturn node.tls_pinSHA256\n\t\t\t\t\t\t\tend)(),\n\t\t\t\t\tverifyPeerCertByName = (function()\n\t\t\t\t\t\t\t\tif api.compare_versions(xray_version, \"<\", \"26.1.31\") then return nil end\n\t\t\t\t\t\t\t\tif not node.tls_CertByName then return \"\" end\n\t\t\t\t\t\t\t\treturn node.tls_CertByName\n\t\t\t\t\t\t\tend)(),\n\t\t\t\t\techConfigList = (node.ech == \"1\") and node.ech_config or nil\n\t\t\t\t} or nil,\n\t\t\t\trealitySettings = (node.stream_security == \"reality\") and {\n\t\t\t\t\tserverName = node.tls_serverName,\n\t\t\t\t\tpublicKey = node.reality_publicKey,\n\t\t\t\t\tshortId = node.reality_shortId or \"\",\n\t\t\t\t\tspiderX = node.reality_spiderX or \"/\",\n\t\t\t\t\tfingerprint = (node.type == \"Xray\" and node.fingerprint and node.fingerprint ~= \"\") and node.fingerprint or \"chrome\",\n\t\t\t\t\tmldsa65Verify = (node.use_mldsa65Verify == \"1\") and node.reality_mldsa65Verify or nil\n\t\t\t\t} or nil,\n\t\t\t\trawSettings = ((node.transport == \"raw\" or node.transport == \"tcp\") and node.protocol ~= \"socks\" and (node.tcp_guise and node.tcp_guise ~= \"none\")) and {\n\t\t\t\t\theader = {\n\t\t\t\t\t\ttype = node.tcp_guise,\n\t\t\t\t\t\trequest = (node.tcp_guise == \"http\") and {\n\t\t\t\t\t\t\tpath = node.tcp_guise_http_path and (function()\n\t\t\t\t\t\t\t\t\tlocal t, r = node.tcp_guise_http_path, {}\n\t\t\t\t\t\t\t\t\tfor _, v in ipairs(t) do\n\t\t\t\t\t\t\t\t\t\tr[#r + 1] = (v == \"\" and \"/\" or v)\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\treturn r\n\t\t\t\t\t\t\t\tend)() or {\"/\"},\n\t\t\t\t\t\t\theaders = (node.tcp_guise_http_host or node.user_agent) and {\n\t\t\t\t\t\t\t\tHost = node.tcp_guise_http_host,\n\t\t\t\t\t\t\t\t[\"User-Agent\"] = node.user_agent and {node.user_agent} or nil\n\t\t\t\t\t\t\t} or nil\n\t\t\t\t\t\t} or nil\n\t\t\t\t\t}\n\t\t\t\t} or nil,\n\t\t\t\tkcpSettings = (node.transport == \"mkcp\") and {\n\t\t\t\t\tmtu = (node.mkcp_mtu and node.mkcp_mtu ~= \"\") and tonumber(node.mkcp_mtu) or 1350,\n\t\t\t\t\ttti = 50,\n\t\t\t\t\tuplinkCapacity = 12,\n\t\t\t\t\tdownlinkCapacity = 100,\n\t\t\t\t\tCwndMultiplier = 1,\n\t\t\t\t\tMaxSendingWindow = 2 * 1024 * 1024\n\t\t\t\t} or nil,\n\t\t\t\twsSettings = (node.transport == \"ws\") and {\n\t\t\t\t\tpath = node.ws_path or \"/\",\n\t\t\t\t\thost = node.ws_host,\n\t\t\t\t\theaders = node.user_agent and {\n\t\t\t\t\t\t[\"User-Agent\"] = node.user_agent\n\t\t\t\t\t} or nil,\n\t\t\t\t\tmaxEarlyData = tonumber(node.ws_maxEarlyData) or nil,\n\t\t\t\t\tearlyDataHeaderName = (node.ws_earlyDataHeaderName) and node.ws_earlyDataHeaderName or nil,\n\t\t\t\t\theartbeatPeriod = tonumber(node.ws_heartbeatPeriod) or nil\n\t\t\t\t} or nil,\n\t\t\t\tgrpcSettings = (node.transport == \"grpc\") and {\n\t\t\t\t\tserviceName = node.grpc_serviceName,\n\t\t\t\t\tmultiMode = (node.grpc_mode == \"multi\") and true or false,\n\t\t\t\t\tidle_timeout = node.grpc_idle_timeout and (tonumber(node.grpc_idle_timeout) < 10 and 10 or tonumber(node.grpc_idle_timeout)) or nil,\n\t\t\t\t\thealth_check_timeout = tonumber(node.grpc_health_check_timeout) or nil,\n\t\t\t\t\tpermit_without_stream = (node.grpc_permit_without_stream == \"1\") and true or false,\n\t\t\t\t\tinitial_windows_size = node.grpc_initial_windows_size and tonumber(node.grpc_initial_windows_size) or 0,\n\t\t\t\t\tuser_agent = node.user_agent\n\t\t\t\t} or nil,\n\t\t\t\thttpupgradeSettings = (node.transport == \"httpupgrade\") and {\n\t\t\t\t\tpath = node.httpupgrade_path or \"/\",\n\t\t\t\t\thost = node.httpupgrade_host,\n\t\t\t\t\theaders =  node.user_agent and {\n\t\t\t\t\t\t[\"User-Agent\"] = node.user_agent\n\t\t\t\t\t} or nil\n\t\t\t\t} or nil,\n\t\t\t\txhttpSettings = (node.transport == \"xhttp\") and {\n\t\t\t\t\tmode = node.xhttp_mode or \"auto\",\n\t\t\t\t\tpath = node.xhttp_path or \"/\",\n\t\t\t\t\thost = node.xhttp_host,\n\t\t\t\t\textra = (function()\n\t\t\t\t\t\tlocal extra = {}\n\t\t\t\t\t\tif node.xhttp_extra then\n\t\t\t\t\t\t\tlocal ok, parsed = pcall(jsonc.parse, api.base64Decode(node.xhttp_extra))\n\t\t\t\t\t\t\tif ok and type(parsed) == \"table\" then\n\t\t\t\t\t\t\t\textra = parsed.extra or parsed\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\t-- 处理 User-Agent\n\t\t\t\t\t\tif node.user_agent and node.user_agent ~= \"\" then\n\t\t\t\t\t\t\textra.headers = extra.headers or {}\n\t\t\t\t\t\t\tif not extra.headers[\"User-Agent\"] and not extra.headers[\"user-agent\"] then\n\t\t\t\t\t\t\t\textra.headers[\"User-Agent\"] = node.user_agent\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\treturn api.cleanEmptyTables(extra)\n\t\t\t\t\tend)()\n\t\t\t\t} or nil,\n\t\t\t\thysteriaSettings = (node.transport == \"hysteria\") and {\n\t\t\t\t\tversion = 2,\n\t\t\t\t\tauth = node.hysteria2_auth_password\n\t\t\t\t} or nil,\n\t\t\t\tfinalmask = (function()\n\t\t\t\t\tlocal finalmask = {}\n\t\t\t\t\tlocal TP = node.transport\n\t\t\t\t\tif TP == \"mkcp\" then\n\t\t\t\t\t\tlocal map = {none = \"none\", srtp = \"header-srtp\", utp = \"header-utp\", [\"wechat-video\"] = \"header-wechat\",\n\t\t\t\t\t\t\tdtls = \"header-dtls\", wireguard = \"header-wireguard\", dns = \"header-dns\"}\n\t\t\t\t\t\tlocal udp = {}\n\t\t\t\t\t\tif node.mkcp_guise and node.mkcp_guise ~= \"none\" then\n\t\t\t\t\t\t\tlocal g = { type = map[node.mkcp_guise] }\n\t\t\t\t\t\t\tif node.mkcp_guise == \"dns\" and node.mkcp_domain and node.mkcp_domain ~= \"\" then\n\t\t\t\t\t\t\t\tg.settings = { domain = node.mkcp_domain }\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tudp[#udp+1] = g\n\t\t\t\t\t\tend\n\t\t\t\t\t\tlocal c = { type = (node.mkcp_seed and node.mkcp_seed ~= \"\") and \"mkcp-aes128gcm\" or \"mkcp-original\" }\n\t\t\t\t\t\tif node.mkcp_seed and node.mkcp_seed ~= \"\" then\n\t\t\t\t\t\t\tc.settings = { password = node.mkcp_seed }\n\t\t\t\t\t\tend\n\t\t\t\t\t\tudp[#udp+1] = c\n\t\t\t\t\t\tfinalmask.udp = udp\n\t\t\t\t\telseif TP == \"hysteria\" then\n\t\t\t\t\t\tif node.hysteria2_obfs_type and node.hysteria2_obfs_type ~= \"\" then\n\t\t\t\t\t\t\tfinalmask.udp = {{\n\t\t\t\t\t\t\t\ttype = node.hysteria2_obfs_type,\n\t\t\t\t\t\t\t\tsettings = node.hysteria2_obfs_password and {\n\t\t\t\t\t\t\t\t\tpassword = node.hysteria2_obfs_password\n\t\t\t\t\t\t\t\t} or nil\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\tend\n\t\t\t\t\t\tlocal up = tonumber(node.hysteria2_up_mbps) or 0\n\t\t\t\t\t\tlocal down = tonumber(node.hysteria2_down_mbps) or 0\n\t\t\t\t\t\tfinalmask.quicParams = {\n\t\t\t\t\t\t\tcongestion = (up <= 0 and down <= 0) and \"bbr\" or \"brutal\",\n\t\t\t\t\t\t\tbrutalUp = up > 0 and (up .. \"mbps\") or nil,\n\t\t\t\t\t\t\tbrutalDown = down > 0 and (down .. \"mbps\") or nil,\n\t\t\t\t\t\t\tudpHop = (node.hysteria2_hop) and {\n\t\t\t\t\t\t\t\tports = string.gsub(node.hysteria2_hop, \":\", \"-\"),\n\t\t\t\t\t\t\t\tinterval = (function(v)\n\t\t\t\t\t\t\t\t\tif not v then return 30 end\n\t\t\t\t\t\t\t\t\tif v:find(\"-\", 1, true) then\n\t\t\t\t\t\t\t\t\t\tlocal min, max = v:match(\"^(%d+)%-(%d+)$\")\n\t\t\t\t\t\t\t\t\t\tmin = tonumber(min)\n\t\t\t\t\t\t\t\t\t\tmax = tonumber(max)\n\t\t\t\t\t\t\t\t\t\tif min and max then\n\t\t\t\t\t\t\t\t\t\t\tmin = (min >= 5) and min or 5\n\t\t\t\t\t\t\t\t\t\t\tmax = (max >= min) and max or min\n\t\t\t\t\t\t\t\t\t\t\treturn min .. \"-\" .. max\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\t\treturn 30\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\tv = tonumber((v or \"30\"):match(\"^%d+\"))\n\t\t\t\t\t\t\t\t\treturn (v and v >= 5) and v or 30\n\t\t\t\t\t\t\t\tend)(node.hysteria2_hop_interval)\n\t\t\t\t\t\t\t} or nil,\n\t\t\t\t\t\t\tmaxIdleTimeout = (function(t)\n\t\t\t\t\t\t\t\tt = tonumber(tostring(t or \"30\"):match(\"^%d+\"))\n\t\t\t\t\t\t\t\treturn (t and t >= 4 and t <= 120) and t or 30\n\t\t\t\t\t\t\tend)(node.hysteria2_idle_timeout),\n\t\t\t\t\t\t\tkeepAlivePeriod = (function(t)\n\t\t\t\t\t\t\t\tt = tonumber(tostring(t or \"0\"):match(\"^%d+\"))\n\t\t\t\t\t\t\t\treturn (t and t >= 2 and t <= 60) and t or nil\n\t\t\t\t\t\t\tend)(node.hysteria2_keep_alive_period),\n\t\t\t\t\t\t\tdisablePathMTUDiscovery = tonumber(node.hysteria2_disable_mtu_discovery) == 1\n\t\t\t\t\t\t}\n\t\t\t\t\tend\n\t\t\t\t\tif fragment and fragment_table and ({raw=1, ws=1, httpupgrade=1, grpc=1, xhttp=1})[TP] then\n\t\t\t\t\t\tfinalmask.tcp = finalmask.tcp or {}\n\t\t\t\t\t\tfinalmask.tcp[#finalmask.tcp+1] = api.clone(fragment_table)\n\t\t\t\t\tend\n\t\t\t\t\tif noise and noise_table and (TP == \"mkcp\" or (TP == \"xhttp\" and node.alpn == \"h3\")) then\n\t\t\t\t\t\tfinalmask.udp = finalmask.udp or {}\n\t\t\t\t\t\tfinalmask.udp[#finalmask.udp+1] = api.clone(noise_table)\n\t\t\t\t\tend\n\t\t\t\t\tif node.finalmask and node.finalmask ~= \"\" then\n\t\t\t\t\t\tlocal ok, fm = pcall(jsonc.parse, api.base64Decode(node.finalmask))\n\t\t\t\t\t\tif ok and type(fm) == \"table\" then\n\t\t\t\t\t\t\tfinalmask = fm\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\treturn api.cleanEmptyTables(finalmask)\n\t\t\t\tend)()\n\t\t\t} or nil,\n\t\t\tsettings = {\n\t\t\t\tvnext = (node.protocol == \"vmess\" or node.protocol == \"vless\") and {\n\t\t\t\t\t{\n\t\t\t\t\t\taddress = node.address,\n\t\t\t\t\t\tport = tonumber(node.port),\n\t\t\t\t\t\tusers = {\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid = node.uuid,\n\t\t\t\t\t\t\t\tlevel = 0,\n\t\t\t\t\t\t\t\tsecurity = (node.protocol == \"vmess\") and node.security or nil,\n\t\t\t\t\t\t\t\ttestpre = (node.protocol == \"vless\") and tonumber(node.preconns) or nil,\n\t\t\t\t\t\t\t\tencryption = (node.protocol == \"vless\") and ((node.encryption and node.encryption ~= \"\") and node.encryption or \"none\") or nil,\n\t\t\t\t\t\t\t\tflow = (node.protocol == \"vless\"\n\t\t\t\t\t\t\t\t\tand (node.tls == \"1\" or (node.encryption and node.encryption ~= \"\" and node.encryption ~= \"none\"))\n\t\t\t\t\t\t\t\t\tand node.flow and node.flow ~= \"\") and node.flow or nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} or nil,\n\t\t\t\tservers = (node.protocol == \"socks\" or node.protocol == \"http\" or node.protocol == \"shadowsocks\" or node.protocol == \"trojan\") and {\n\t\t\t\t\t{\n\t\t\t\t\t\taddress = node.address,\n\t\t\t\t\t\tport = tonumber(node.port),\n\t\t\t\t\t\tmethod = (node.method == \"chacha20-ietf-poly1305\" and \"chacha20-poly1305\") or\n\t\t\t\t\t\t\t(node.method == \"xchacha20-ietf-poly1305\" and \"xchacha20-poly1305\") or\n\t\t\t\t\t\t\t(node.method ~= \"\" and node.method) or nil,\n\t\t\t\t\t\tivCheck = (node.protocol == \"shadowsocks\") and node.iv_check == \"1\" or nil,\n\t\t\t\t\t\tuot = (node.protocol == \"shadowsocks\") and node.uot == \"1\" or nil,\n\t\t\t\t\t\tpassword = node.password or \"\",\n\t\t\t\t\t\tusers = (node.username and node.password) and {\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tuser = node.username,\n\t\t\t\t\t\t\t\tpass = node.password\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} or nil\n\t\t\t\t\t}\n\t\t\t\t} or nil,\n\t\t\t\taddress = (node.protocol == \"wireguard\" and node.wireguard_local_address) or (node.protocol == \"hysteria\" and node.address) or nil,\n\t\t\t\tsecretKey = (node.protocol == \"wireguard\") and node.wireguard_secret_key or nil,\n\t\t\t\tpeers = (node.protocol == \"wireguard\") and {\n\t\t\t\t\t{\n\t\t\t\t\t\tpublicKey = node.wireguard_public_key,\n\t\t\t\t\t\tendpoint = node.address .. \":\" .. node.port,\n\t\t\t\t\t\tpreSharedKey = node.wireguard_preSharedKey,\n\t\t\t\t\t\tkeepAlive = node.wireguard_keepAlive and tonumber(node.wireguard_keepAlive) or nil\n\t\t\t\t\t}\n\t\t\t\t} or nil,\n\t\t\t\tmtu = (node.protocol == \"wireguard\" and node.wireguard_mtu) and tonumber(node.wireguard_mtu) or nil,\n\t\t\t\treserved = (node.protocol == \"wireguard\" and node.wireguard_reserved) and node.wireguard_reserved or nil,\n\t\t\t\tport = (node.protocol == \"hysteria\" and node.port) and tonumber(node.port) or nil,\n\t\t\t\tversion = node.protocol == \"hysteria\" and 2 or nil\n\t\t\t}\n\t\t}\n\n\t\tif node.protocol == \"wireguard\" then\n\t\t\tresult.settings.kernelMode = false\n\t\tend\n\n\t\tlocal alpn = {}\n\t\tif node.alpn and node.alpn ~= \"default\" then\n\t\t\tstring.gsub(node.alpn, '[^' .. \",\" .. ']+', function(w)\n\t\t\t\ttable.insert(alpn, w)\n\t\t\tend)\n\t\tend\n\t\tif alpn and #alpn > 0 then\n\t\t\tif result.streamSettings.tlsSettings then\n\t\t\t\tresult.streamSettings.tlsSettings.alpn = alpn\n\t\t\tend\n\t\tend\n\n\t\tif api.datatypes.hostname(node.address) and node.domain_resolver and (node.domain_resolver_dns or node.domain_resolver_dns_https) then\n\t\t\tlocal dns_proto = node.domain_resolver\n\t\t\tlocal config_address\n\t\t\tlocal config_port\n\t\t\tif dns_proto == \"https\" then\n\t\t\t\tlocal _a = api.parseDoH(node.domain_resolver_dns_https)\n\t\t\t\tif _a then\n\t\t\t\t\tconfig_address = _a.url\n\t\t\t\t\tconfig_port = _a.port or 443\n\t\t\t\t\tif _a.hostname and api.datatypes.hostname(_a.hostname) then\n\t\t\t\t\t\tGLOBAL.DNS_HOSTNAME[_a.hostname] = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tlocal server_address = node.domain_resolver_dns\n\t\t\t\tconfig_port = 53\n\t\t\t\tlocal split = api.split(server_address, \":\")\n\t\t\t\tif #split > 1 then\n\t\t\t\t\tserver_address = split[1]\n\t\t\t\t\tconfig_port = tonumber(split[#split])\n\t\t\t\tend\n\t\t\t\tconfig_address = server_address\n\t\t\t\tif dns_proto == \"tcp\" then\n\t\t\t\t\tconfig_address = dns_proto .. \"://\" .. server_address .. \":\" .. config_port\n\t\t\t\tend\n\t\t\tend\n\t\t\tlocal dns_key = dns_proto .. \"|\" .. config_address .. \"|\" .. tostring(config_port)\n\t\t\tif not GLOBAL.DNS_SERVER[dns_key] then\n\t\t\t\tGLOBAL.DNS_SERVER[dns_key] = {\n\t\t\t\t\ttag = \"dns-node-\" .. api.gen_short_uuid(),\n\t\t\t\t\t-- queryStrategy = node.domain_strategy or \"UseIP\",\n\t\t\t\t\taddress = config_address,\n\t\t\t\t\tport = config_port,\n\t\t\t\t\tfinalQuery = true,\n\t\t\t\t\tdisableCache = false,\n\t\t\t\t\tserveStale = true,\n\t\t\t\t\tdomains = {}\n\t\t\t\t}\n\t\t\tend\n\t\t\tlocal exists\n\t\t\tlocal domain = \"full:\" .. node.address\n\t\t\tfor _, d in ipairs(GLOBAL.DNS_SERVER[dns_key].domains) do\n\t\t\t\tif d == domain then exists = true; break end\n\t\t\tend\n\t\t\tif not exists then table.insert(GLOBAL.DNS_SERVER[dns_key].domains, domain) end\n\t\t\tGLOBAL.VPS_EXCLUDE[node.address] = true\n\t\tend\n\tend\n\treturn result\nend\n\nfunction gen_config_server(node)\n\tlocal settings = nil\n\tlocal routing = nil\n\tlocal outbounds = {\n\t\t{ protocol = \"freedom\", tag = \"direct\", settings = { finalRules = {{ action = \"allow\" }}}}, { protocol = \"blackhole\", tag = \"blocked\" }\n\t}\n\n\tif node.protocol == \"vmess\" or node.protocol == \"vless\" then\n\t\tif node.uuid then\n\t\t\tlocal clients = {}\n\t\t\tfor i = 1, #node.uuid do\n\t\t\t\tclients[i] = {\n\t\t\t\t\tid = node.uuid[i],\n\t\t\t\t\tflow = (node.protocol == \"vless\"\n\t\t\t\t\tand (node.tls == \"1\" or (node.decryption and node.decryption ~= \"\" and node.decryption ~= \"none\")) \n\t\t\t\t\tand node.flow and node.flow ~= \"\") and node.flow or nil\n\t\t\t\t}\n\t\t\tend\n\t\t\tsettings = {\n\t\t\t\tclients = clients,\n\t\t\t\tdecryption = (node.protocol == \"vless\") and ((node.decryption and node.decryption ~= \"\") and node.decryption or \"none\") or nil\n\t\t\t}\n\t\tend\n\telseif node.protocol == \"socks\" then\n\t\tsettings = {\n\t\t\tudp = (\"1\" == node.udp_forward) and true or false,\n\t\t\tauth = (\"1\" == node.auth) and \"password\" or \"noauth\",\n\t\t\taccounts = (\"1\" == node.auth) and {\n\t\t\t\t{\n\t\t\t\t\tuser = node.username,\n\t\t\t\t\tpass = node.password\n\t\t\t\t}\n\t\t\t} or nil\n\t\t}\n\telseif node.protocol == \"http\" then\n\t\tsettings = {\n\t\t\tallowTransparent = false,\n\t\t\taccounts = (\"1\" == node.auth) and {\n\t\t\t\t{\n\t\t\t\t\tuser = node.username,\n\t\t\t\t\tpass = node.password\n\t\t\t\t}\n\t\t\t} or nil\n\t\t}\n\t\tnode.transport = \"tcp\"\n\t\tnode.tcp_guise = \"none\"\n\telseif node.protocol == \"shadowsocks\" then\n\t\tsettings = {\n\t\t\tmethod = node.method,\n\t\t\tpassword = node.password,\n\t\t\tivCheck = (\"1\" == node.iv_check) and true or false,\n\t\t\tnetwork = node.ss_network or \"TCP,UDP\"\n\t\t}\n\telseif node.protocol == \"trojan\" then\n\t\tif node.uuid then\n\t\t\tlocal clients = {}\n\t\t\tfor i = 1, #node.uuid do\n\t\t\t\tclients[i] = {\n\t\t\t\t\tpassword = node.uuid[i],\n\t\t\t\t}\n\t\t\tend\n\t\t\tsettings = {\n\t\t\t\tclients = clients\n\t\t\t}\n\t\tend\n\telseif node.protocol == \"hysteria2\" then\n\t\tsettings = {\n\t\t\tversion = 2,\n\t\t\tclients = node.hysteria2_auth_password and {\n\t\t\t\t{ auth = node.hysteria2_auth_password }\n\t\t\t}\n\t\t}\n\telseif node.protocol == \"dokodemo-door\" then\n\t\tsettings = {\n\t\t\tnetwork = node.d_protocol,\n\t\t\taddress = node.d_address,\n\t\t\tport = tonumber(node.d_port)\n\t\t}\n\tend\n\n\tif node.fallback and node.fallback == \"1\" then\n\t\tlocal fallbacks = {}\n\t\tfor i = 1, #node.fallback_list do\n\t\t\tlocal fallbackStr = node.fallback_list[i]\n\t\t\tif fallbackStr then\n\t\t\t\tlocal tmp = {}\n\t\t\t\tstring.gsub(fallbackStr, '[^,]+', function(w)\n\t\t\t\t\ttable.insert(tmp, w)\n\t\t\t\tend)\n\t\t\t\tlocal dest = tmp[1] or \"\"\n\t\t\t\tlocal path = tmp[2]\n\t\t\t\tlocal xver = tonumber(tmp[3])\n\t\t\t\tif not dest:find(\"%.\") then\n\t\t\t\t\tdest = tonumber(dest)\n\t\t\t\tend\n\t\t\t\tfallbacks[i] = {\n\t\t\t\t\tpath = path,\n\t\t\t\t\tdest = dest,\n\t\t\t\t\txver = xver\n\t\t\t\t}\n\t\t\tend\n\t\tend\n\t\tsettings.fallbacks = fallbacks\n\tend\n\n\trouting = {\n\t\tdomainStrategy = \"IPOnDemand\",\n\t\trules = {\n\t\t\t{\n\t\t\t\tip = {\"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"},\n\t\t\t\toutboundTag = (node.accept_lan == nil or node.accept_lan == \"0\") and \"blocked\" or \"direct\"\n\t\t\t}\n\t\t}\n\t}\n\n\tif node.outbound_node then\n\t\tlocal outbound = nil\n\t\tif node.outbound_node == \"_iface\" and node.outbound_node_iface then\n\t\t\toutbound = {\n\t\t\t\tprotocol = \"freedom\",\n\t\t\t\ttag = \"outbound\",\n\t\t\t\tstreamSettings = {\n\t\t\t\t\tsockopt = {\n\t\t\t\t\t\tmark = 255,\n\t\t\t\t\t\tinterface = node.outbound_node_iface\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsettings = {\n\t\t\t\t\tfinalRules = {{ action = \"allow\" }}\n\t\t\t\t}\n\t\t\t}\n\t\t\tsys.call(string.format(\"mkdir -p %s && touch %s/%s\", api.TMP_IFACE_PATH, api.TMP_IFACE_PATH, node.outbound_node_iface))\n\t\telse\n\t\t\tlocal outbound_node_t = uci:get_all(\"passwall\", node.outbound_node)\n\t\t\tif node.outbound_node == \"_socks\" or node.outbound_node == \"_http\" then\n\t\t\t\toutbound_node_t = {\n\t\t\t\t\ttype = node.type,\n\t\t\t\t\tprotocol = node.outbound_node:gsub(\"_\", \"\"),\n\t\t\t\t\ttransport = \"tcp\",\n\t\t\t\t\taddress = node.outbound_node_address,\n\t\t\t\t\tport = node.outbound_node_port,\n\t\t\t\t\tusername = (node.outbound_node_username and node.outbound_node_username ~= \"\") and node.outbound_node_username or nil,\n\t\t\t\t\tpassword = (node.outbound_node_password and node.outbound_node_password ~= \"\") and node.outbound_node_password or nil,\n\t\t\t\t}\n\t\t\tend\n\t\t\toutbound = require(\"luci.passwall.util_xray\").gen_outbound(nil, outbound_node_t, \"outbound\")\n\t\tend\n\t\tif outbound then\n\t\t\ttable.insert(outbounds, 1, outbound)\n\t\tend\n\tend\n\n\tif node.protocol == \"hysteria2\" then\n\t\tnode.protocol = \"hysteria\"\n\t\tnode.transport = \"hysteria\"\n\t\tnode.tls = \"1\"\n\tend\n\n\tlocal config = {\n\t\tlog = {\n\t\t\t-- error = \"/tmp/etc/passwall_server/log/\" .. user[\".name\"] .. \".log\",\n\t\t\tloglevel = (\"1\" == node.log) and node.loglevel or \"none\"\n\t\t},\n\t\t-- 传入连接\n\t\tinbounds = {\n\t\t\t{\n\t\t\t\tlisten = (node.bind_local == \"1\") and \"127.0.0.1\" or nil,\n\t\t\t\tport = tonumber(node.port),\n\t\t\t\tprotocol = node.protocol,\n\t\t\t\tsettings = settings,\n\t\t\t\tstreamSettings = {\n\t\t\t\t\tnetwork = node.transport,\n\t\t\t\t\tsecurity = \"none\",\n\t\t\t\t\ttlsSettings = (\"1\" == node.tls) and {\n\t\t\t\t\t\tdisableSystemRoot = false,\n\t\t\t\t\t\tcertificates = {\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcertificateFile = node.tls_certificateFile,\n\t\t\t\t\t\t\t\tkeyFile = node.tls_keyFile\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\techServerKeys = (node.ech == \"1\") and node.ech_key or nil\n\t\t\t\t\t} or nil,\n\t\t\t\t\trawSettings = (node.transport == \"raw\" or node.transport == \"tcp\") and {\n\t\t\t\t\t\theader = {\n\t\t\t\t\t\t\ttype = node.tcp_guise,\n\t\t\t\t\t\t\trequest = (node.tcp_guise == \"http\") and {\n\t\t\t\t\t\t\t\tpath = node.tcp_guise_http_path and (function()\n\t\t\t\t\t\t\t\t\t\tlocal t, r = node.tcp_guise_http_path, {}\n\t\t\t\t\t\t\t\t\t\tfor _, v in ipairs(t) do\n\t\t\t\t\t\t\t\t\t\t\tr[#r + 1] = (v == \"\" and \"/\" or v)\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\t\treturn r\n\t\t\t\t\t\t\t\t\tend)() or {\"/\"},\n\t\t\t\t\t\t\t\theaders = {\n\t\t\t\t\t\t\t\t\tHost = node.tcp_guise_http_host or {}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} or nil\n\t\t\t\t\t\t}\n\t\t\t\t\t} or nil,\n\t\t\t\t\tkcpSettings = (node.transport == \"mkcp\") and {\n\t\t\t\t\t\tmtu = (node.mkcp_mtu and node.mkcp_mtu ~= \"\") and tonumber(node.mkcp_mtu) or 1350,\n\t\t\t\t\t\ttti = 50,\n\t\t\t\t\t\tuplinkCapacity = 12,\n\t\t\t\t\t\tdownlinkCapacity = 100,\n\t\t\t\t\t\tCwndMultiplier = 1,\n\t\t\t\t\t\tMaxSendingWindow = 2 * 1024 * 1024\n\t\t\t\t\t} or nil,\n\t\t\t\t\twsSettings = (node.transport == \"ws\") and {\n\t\t\t\t\t\thost = node.ws_host or nil,\n\t\t\t\t\t\tpath = node.ws_path\n\t\t\t\t\t} or nil,\n\t\t\t\t\tgrpcSettings = (node.transport == \"grpc\" and node.grpc_serviceName) and {\n\t\t\t\t\t\tserviceName = node.grpc_serviceName\n\t\t\t\t\t} or nil,\n\t\t\t\t\thttpupgradeSettings = (node.transport == \"httpupgrade\") and {\n\t\t\t\t\t\tpath = node.httpupgrade_path or \"/\",\n\t\t\t\t\t\thost = node.httpupgrade_host\n\t\t\t\t\t} or nil,\n\t\t\t\t\txhttpSettings = (node.transport == \"xhttp\") and {\n\t\t\t\t\t\tpath = node.xhttp_path or \"/\",\n\t\t\t\t\t\thost = node.xhttp_host,\n\t\t\t\t\t\tmaxUploadSize = node.xhttp_maxuploadsize,\n\t\t\t\t\t\tmaxConcurrentUploads = node.xhttp_maxconcurrentuploads\n\t\t\t\t\t} or nil,\n\t\t\t\t\thysteriaSettings = (node.transport == \"hysteria\") and {\n\t\t\t\t\t\tversion = 2\n\t\t\t\t\t} or nil,\n\t\t\t\t\tfinalmask = (function()\n\t\t\t\t\t\tlocal finalmask = {}\n\t\t\t\t\t\tif node.transport == \"mkcp\" then\n\t\t\t\t\t\t\tlocal map = {none = \"none\", srtp = \"header-srtp\", utp = \"header-utp\", [\"wechat-video\"] = \"header-wechat\",\n\t\t\t\t\t\t\t\tdtls = \"header-dtls\", wireguard = \"header-wireguard\", dns = \"header-dns\"}\n\t\t\t\t\t\t\tlocal udp = {}\n\t\t\t\t\t\t\tif node.mkcp_guise and node.mkcp_guise ~= \"none\" then\n\t\t\t\t\t\t\t\tlocal g = { type = map[node.mkcp_guise] }\n\t\t\t\t\t\t\t\tif node.mkcp_guise == \"dns\" and node.mkcp_domain and node.mkcp_domain ~= \"\" then\n\t\t\t\t\t\t\t\t\tg.settings = { domain = node.mkcp_domain }\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tudp[#udp+1] = g\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tlocal c = { type = (node.mkcp_seed and node.mkcp_seed ~= \"\") and \"mkcp-aes128gcm\" or \"mkcp-original\" }\n\t\t\t\t\t\t\tif node.mkcp_seed and node.mkcp_seed ~= \"\" then\n\t\t\t\t\t\t\t\tc.settings = { password = node.mkcp_seed }\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tudp[#udp+1] = c\n\t\t\t\t\t\t\tfinalmask.udp = udp\n\t\t\t\t\t\telseif node.transport == \"hysteria\" then\n\t\t\t\t\t\t\tif node.hysteria2_obfs_type and node.hysteria2_obfs_type ~= \"\" then\n\t\t\t\t\t\t\t\tfinalmask.udp = {{\n\t\t\t\t\t\t\t\t\ttype = node.hysteria2_obfs_type,\n\t\t\t\t\t\t\t\t\tsettings = node.hysteria2_obfs_password and {\n\t\t\t\t\t\t\t\t\t\tpassword = node.hysteria2_obfs_password\n\t\t\t\t\t\t\t\t\t} or nil\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tlocal ignore = tonumber(node.hysteria2_ignore_client_bandwidth) == 1\n\t\t\t\t\t\t\tlocal up = (not ignore) and tonumber(node.hysteria2_up_mbps) or 0\n\t\t\t\t\t\t\tlocal down = (not ignore) and tonumber(node.hysteria2_down_mbps) or 0\n\t\t\t\t\t\t\tfinalmask.quicParams = {\n\t\t\t\t\t\t\t\tcongestion = (up <= 0 and down <= 0) and \"bbr\" or \"brutal\",\n\t\t\t\t\t\t\t\tbrutalUp = up > 0 and (up .. \"mbps\") or nil,\n\t\t\t\t\t\t\t\tbrutalDown = down > 0 and (down .. \"mbps\") or nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif node.finalmask and node.finalmask ~= \"\" then\n\t\t\t\t\t\t\tlocal ok, fm = pcall(jsonc.parse, api.base64Decode(node.finalmask))\n\t\t\t\t\t\t\tif ok and type(fm) == \"table\" then\n\t\t\t\t\t\t\t\tfinalmask = fm\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\treturn api.cleanEmptyTables(finalmask)\n\t\t\t\t\tend)(),\n\t\t\t\t\tsockopt = {\n\t\t\t\t\t\ttcpFastOpen = (node.tcp_fast_open == \"1\") and true or nil,\n\t\t\t\t\t\tacceptProxyProtocol = (node.acceptProxyProtocol and node.acceptProxyProtocol == \"1\") and true or false\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\t-- 传出连接\n\t\toutbounds = outbounds,\n\t\trouting = routing\n\t}\n\n\tlocal alpn = {}\n\tif node.alpn then\n\t\tstring.gsub(node.alpn, '[^' .. \",\" .. ']+', function(w)\n\t\t\ttable.insert(alpn, w)\n\t\tend)\n\tend\n\tif alpn and #alpn > 0 then\n\t\tif config.inbounds[1].streamSettings.tlsSettings then\n\t\t\tconfig.inbounds[1].streamSettings.tlsSettings.alpn = alpn\n\t\tend\n\tend\n\n\tif \"1\" == node.tls then\n\t\tconfig.inbounds[1].streamSettings.security = \"tls\"\n\t\tif \"1\" == node.reality then\n\t\t\tconfig.inbounds[1].streamSettings.tlsSettings = nil\n\t\t\tconfig.inbounds[1].streamSettings.security = \"reality\"\n\t\t\tconfig.inbounds[1].streamSettings.realitySettings = {\n\t\t\t\tshow = false,\n\t\t\t\tdest = node.reality_dest,\n\t\t\t\tserverNames = node.reality_serverNames or {},\n\t\t\t\tprivateKey = node.reality_private_key,\n\t\t\t\tshortIds = node.reality_shortId or \"\",\n\t\t\t\tmldsa65Seed = (node.use_mldsa65Seed == \"1\") and node.reality_mldsa65Seed or nil\n\t\t\t} or nil\n\t\tend\n\tend\n\n\tfor index, value in ipairs(config.outbounds) do\n\t\tfor k, v in pairs(config.outbounds[index]) do\n\t\t\tif k and k:find(\"_\") == 1 then\n\t\t\t\tconfig.outbounds[index][k] = nil\n\t\t\tend\n\t\tend\n\tend\n\n\treturn config\nend\n\nfunction gen_config(var)\n\tlocal flag = var[\"flag\"]\n\tlocal node_id = var[\"node\"]\n\tlocal server_host = var[\"server_host\"]\n\tlocal server_port = var[\"server_port\"]\n\tlocal tcp_proxy_way = var[\"tcp_proxy_way\"] or \"redirect\"\n\tlocal tcp_redir_port = var[\"tcp_redir_port\"]\n\tlocal udp_redir_port = var[\"udp_redir_port\"]\n\tlocal local_socks_address = var[\"local_socks_address\"] or \"0.0.0.0\"\n\tlocal local_socks_port = var[\"local_socks_port\"]\n\tlocal local_socks_username = var[\"local_socks_username\"]\n\tlocal local_socks_password = var[\"local_socks_password\"]\n\tlocal local_http_address = var[\"local_http_address\"] or \"0.0.0.0\"\n\tlocal local_http_port = var[\"local_http_port\"]\n\tlocal local_http_username = var[\"local_http_username\"]\n\tlocal local_http_password = var[\"local_http_password\"]\n\tlocal dns_listen_port = var[\"dns_listen_port\"]\n\tlocal dns_cache = var[\"dns_cache\"]\n\tlocal direct_dns_port = var[\"direct_dns_port\"]\n\tlocal direct_dns_udp_server = var[\"direct_dns_udp_server\"]\n\tlocal direct_dns_tcp_server = var[\"direct_dns_tcp_server\"]\n\tlocal direct_dns_query_strategy = var[\"direct_dns_query_strategy\"]\n\tlocal remote_dns_udp_server = var[\"remote_dns_udp_server\"]\n\tlocal remote_dns_udp_port = var[\"remote_dns_udp_port\"]\n\tlocal remote_dns_tcp_server = var[\"remote_dns_tcp_server\"]\n\tlocal remote_dns_tcp_port = var[\"remote_dns_tcp_port\"]\n\tlocal remote_dns_doh = var[\"remote_dns_doh\"]\n\tlocal remote_dns_client_ip = var[\"remote_dns_client_ip\"]\n\tlocal remote_dns_fake = var[\"remote_dns_fake\"]\n\tlocal remote_dns_query_strategy = var[\"remote_dns_query_strategy\"]\n\tlocal dns_socks_address = var[\"dns_socks_address\"]\n\tlocal dns_socks_port = var[\"dns_socks_port\"]\n\tlocal loglevel = var[\"loglevel\"] or \"warning\"\n\tlocal no_run = var[\"no_run\"]\n\n\tlocal dns_domain_rules = {}\n\tlocal dns = nil\n\tlocal fakedns = nil\n\tlocal routing = nil\n\tlocal observatory = nil\n\tlocal burstObservatory = nil\n\tlocal strategy = nil\n\tlocal inbounds = {}\n\tlocal outbounds = {}\n\tlocal COMMON = {}\n\n\tlocal xray_settings = uci:get_all(appname, \"@global_xray[0]\") or {}\n\n\tif xray_settings.fragment == \"1\" then\n\t\tlocal delay = xray_settings.fragment_delay\n\t\tfragment_table = {\n\t\t\ttype = \"fragment\",\n\t\t\tsettings = {\n\t\t\t\tpackets = xray_settings.fragment_packets,\n\t\t\t\tlength = xray_settings.fragment_length,\n\t\t\t\tdelay = delay and (delay:find(\"-\", 1, true) and delay or tonumber(delay)) or nil,\n\t\t\t\tmaxSplit = xray_settings.fragment_maxSplit\n\t\t\t}\n\t\t}\n\tend\n\n\tif xray_settings.noise == \"1\" then\n\t\tlocal noises = {}\n\t\tuci:foreach(appname, \"xray_noise_packets\", function(n)\n\t\t\tif n.enabled == \"1\" then\n\t\t\t\tlocal noise = {\n\t\t\t\t\trand = (n.type == \"rand\" and n.packet) and (n.packet:find(\"-\", 1, true) and n.packet or tonumber(n.packet)) or nil,\n\t\t\t\t\ttype = (n.type ~= \"rand\") and n.type or nil,\n\t\t\t\t\tpacket = (n.type ~= \"rand\") and n.packet or nil,\n\t\t\t\t\tdelay = n.delay and (n.delay:find(\"-\", 1, true) and n.delay or tonumber(n.delay)) or nil\n\t\t\t\t}\n\t\t\t\ttable.insert(noises, noise)\n\t\t\tend\n\t\tend)\n\t\tnoise_table = #noises > 0 and {\n\t\t\ttype = \"noise\",\n\t\t\tsettings = { reset = 0, noise = noises }\n\t\t} or nil\n\tend\n\n\tif node_id then\n\t\tlocal node = uci:get_all(appname, node_id)\n\t\tlocal balancers = {}\n\t\tlocal rules = {}\n\t\tif node then\n\t\t\tif server_host and server_port then\n\t\t\t\tnode.address = server_host\n\t\t\t\tnode.port = server_port\n\t\t\tend\n\t\tend\n\t\tif local_socks_port then\n\t\t\tlocal inbound = {\n\t\t\t\ttag = \"socks-in\",\n\t\t\t\tlisten = local_socks_address,\n\t\t\t\tport = tonumber(local_socks_port),\n\t\t\t\tprotocol = \"socks\",\n\t\t\t\tsettings = {auth = \"noauth\", udp = true},\n\t\t\t\tsniffing = {\n\t\t\t\t\tenabled = (xray_settings.sniffing_override_dest == \"1\") or (node and node.protocol == \"_shunt\") or false\n\t\t\t\t}\n\t\t\t}\n\t\t\tif inbound.sniffing.enabled == true then\n\t\t\t\tinbound.sniffing.destOverride = {\"http\", \"tls\", \"quic\"}\n\t\t\t\tinbound.sniffing.routeOnly = xray_settings.sniffing_override_dest ~= \"1\" or nil\n\t\t\t\tinbound.sniffing.domainsExcluded = xray_settings.sniffing_override_dest == \"1\" and get_domain_excluded() or nil\n\t\t\tend\n\t\t\tif local_socks_username and local_socks_password and local_socks_username ~= \"\" and local_socks_password ~= \"\" then\n\t\t\t\tinbound.settings.auth = \"password\"\n\t\t\t\tinbound.settings.accounts = {\n\t\t\t\t\t{\n\t\t\t\t\t\tuser = local_socks_username,\n\t\t\t\t\t\tpass = local_socks_password\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tend\n\t\t\ttable.insert(inbounds, inbound)\n\t\tend\n\t\tif local_http_port then\n\t\t\tlocal inbound = {\n\t\t\t\tlisten = local_http_address,\n\t\t\t\tport = tonumber(local_http_port),\n\t\t\t\tprotocol = \"http\",\n\t\t\t\tsettings = {allowTransparent = false}\n\t\t\t}\n\t\t\tif local_http_username and local_http_password and local_http_username ~= \"\" and local_http_password ~= \"\" then\n\t\t\t\tinbound.settings.accounts = {\n\t\t\t\t\t{\n\t\t\t\t\t\tuser = local_http_username,\n\t\t\t\t\t\tpass = local_http_password\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tend\n\t\t\ttable.insert(inbounds, inbound)\n\t\tend\n\n\n\t\tfunction gen_socks_config_node(node_id, socks_id, remarks)\n\t\t\tif node_id then\n\t\t\t\tsocks_id = node_id:sub(1 + #\"Socks_\")\n\t\t\tend\n\t\t\tlocal result\n\t\t\tlocal socks_node = uci:get_all(appname, socks_id) or nil\n\t\t\tif socks_node then\n\t\t\t\tif not remarks then\n\t\t\t\t\tremarks = socks_node.port\n\t\t\t\tend\n\t\t\t\tresult = {\n\t\t\t\t\t[\".name\"] = \"Socksid_\" .. socks_id,\n\t\t\t\t\tremarks = remarks,\n\t\t\t\t\ttype = \"Xray\",\n\t\t\t\t\tprotocol = \"socks\",\n\t\t\t\t\taddress = \"127.0.0.1\",\n\t\t\t\t\tport = socks_node.port,\n\t\t\t\t\ttransport = \"tcp\",\n\t\t\t\t\tstream_security = \"none\"\n\t\t\t\t}\n\t\t\tend\n\t\t\treturn result\n\t\tend\n\n\t\tfunction get_node_by_id(node_id)\n\t\t\tif not node_id or node_id == \"\" or node_id == \"nil\" then return nil end\n\t\t\tif node_id:find(\"Socks_\") then\n\t\t\t\treturn gen_socks_config_node(node_id)\n\t\t\telse\n\t\t\t\treturn uci:get_all(appname, node_id)\n\t\t\tend\n\t\tend\n\n\t\tlocal nodes_list = {}\n\t\tfunction get_balancer_batch_nodes(_node)\n\t\t\tif #nodes_list == 0 then\n\t\t\t\tfor k, e in ipairs(api.get_valid_nodes()) do\n\t\t\t\t\tif e.node_type == \"normal\" and (not e.chain_proxy or e.chain_proxy == \"\") then\n\t\t\t\t\t\tnodes_list[#nodes_list + 1] = {\n\t\t\t\t\t\t\tid = e[\".name\"],\n\t\t\t\t\t\t\tremarks = e[\"remarks\"],\n\t\t\t\t\t\t\tgroup = e[\"group\"]\n\t\t\t\t\t\t}\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif not _node.node_group or _node.node_group == \"\" then return {} end\n\t\t\tlocal nodes = {}\n\t\t\tfor g in _node.node_group:gmatch(\"%S+\") do\n\t\t\t\tg = api.UrlDecode(g)\n\t\t\t\tfor k, v in pairs(nodes_list) do\n\t\t\t\t\tlocal gn = (v.group and v.group ~= \"\") and v.group or \"default\"\n\t\t\t\t\tif gn:lower() == g:lower() and api.match_node_rule(v.remarks, _node.node_match_rule) then\n\t\t\t\t\t\tnodes[#nodes + 1] = v.id\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\treturn nodes\n\t\tend\n\n\t\tfunction gen_loopback(outbound_tag, loopback_dst)\n\t\t\tif not outbound_tag or outbound_tag == \"\" then return nil end\n\t\t\tlocal inbound_tag = loopback_dst and \"lo-to-\" .. loopback_dst or outbound_tag .. \"-lo\"\n\t\t\tlocal loopback_outbound = {\n\t\t\t\tprotocol = \"loopback\",\n\t\t\t\ttag = outbound_tag,\n\t\t\t\tsettings = { inboundTag = inbound_tag }\n\t\t\t}\n\t\t\tlocal insert_index = #outbounds + 1\n\t\t\tif outbound_tag == \"default\" then\n\t\t\t\tinsert_index = 1\n\t\t\tend\n\t\t\ttable.insert(outbounds, insert_index, loopback_outbound)\n\t\t\treturn loopback_outbound\n\t\tend\n\n\t\tfunction gen_balancer(_node, loopback_tag)\n\t\t\tlocal balancer_id = _node[\".name\"]\n\t\t\tlocal balancer_tag = \"balancer-\" .. balancer_id\n\t\t\tlocal loopback_dst = balancer_id -- route destination for the loopback outbound\n\t\t\tif not loopback_tag or loopback_tag == \"\" then loopback_tag = balancer_id end\n\t\t\t-- existing balancer\n\t\t\tfor _, v in ipairs(balancers) do\n\t\t\t\tif v.tag == balancer_tag then\n\t\t\t\t\tlocal loopback_outbound = gen_loopback(loopback_tag, loopback_dst)\n\t\t\t\t\treturn balancer_tag, loopback_outbound\n\t\t\t\tend\n\t\t\tend\n\t\t\t-- new balancer\n\t\t\tlocal blc_nodes\n\t\t\tif _node.node_add_mode and _node.node_add_mode == \"batch\" then\n\t\t\t\tblc_nodes = get_balancer_batch_nodes(_node)\n\t\t\telse\n\t\t\t\tblc_nodes = _node.balancing_node\n\t\t\tend\n\t\t\tlocal valid_nodes = {}\n\t\t\tfor i = 1, #(blc_nodes or {}) do\n\t\t\t\tlocal blc_node_id = blc_nodes[i]\n\t\t\t\tlocal blc_node_tag = \"blc-\" .. blc_node_id\n\t\t\t\tlocal is_new_blc_node = true\n\t\t\t\tfor _, outbound in ipairs(outbounds) do\n\t\t\t\t\tif string.sub(outbound.tag, 1, #blc_node_tag) == blc_node_tag then\n\t\t\t\t\t\tis_new_blc_node = false\n\t\t\t\t\t\tvalid_nodes[#valid_nodes + 1] = outbound.tag\n\t\t\t\t\t\tbreak\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif is_new_blc_node then\n\t\t\t\t\tlocal outboundTag = gen_outbound_get_tag(flag, blc_node_id, blc_node_tag, { fragment = xray_settings.fragment == \"1\" or nil, noise = xray_settings.noise == \"1\" or nil, run_socks_instance = not no_run })\n\t\t\t\t\tif outboundTag then\n\t\t\t\t\t\tvalid_nodes[#valid_nodes + 1] = outboundTag\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif #valid_nodes == 0 then return nil end\n\n\t\t\t-- fallback node\n\t\t\tlocal fallback_node_id = _node.fallback_node\n\t\t\tfallback_node_id = (fallback_node_id and fallback_node_id ~= \"\") and fallback_node_id or nil\n\t\t\tlocal fallback_node_tag = (fallback_node_id == \"_direct\") and \"direct\" or \"blackhole\"\n\t\t\tif fallback_node_id and fallback_node_id ~= \"_direct\" then\n\t\t\t\tlocal is_new_node = true\n\t\t\t\tfor _, outbound in ipairs(outbounds) do\n\t\t\t\t\tif string.sub(outbound.tag, 1, #fallback_node_id) == fallback_node_id then\n\t\t\t\t\t\tis_new_node = false\n\t\t\t\t\t\tfallback_node_tag = outbound.tag\n\t\t\t\t\t\tbreak\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif is_new_node then\n\t\t\t\t\tlocal fallback_node = get_node_by_id(fallback_node_id)\n\t\t\t\t\tif fallback_node then\n\t\t\t\t\t\tif fallback_node.protocol ~= \"_balancing\" then\n\t\t\t\t\t\t\tlocal outboundTag = gen_outbound_get_tag(flag, fallback_node, fallback_node_id, { fragment = xray_settings.fragment == \"1\" or nil, noise = xray_settings.noise == \"1\" or nil, run_socks_instance = not no_run })\n\t\t\t\t\t\t\tif outboundTag then\n\t\t\t\t\t\t\t\tfallback_node_tag = outboundTag\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif gen_balancer(fallback_node) then\n\t\t\t\t\t\t\t\tfallback_node_tag = fallback_node_id\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif _node.balancingStrategy == \"leastLoad\" then\n\t\t\t\tstrategy = {\n\t\t\t\t\ttype = _node.balancingStrategy,\n\t\t\t\t\tsettings = {\n\t\t\t\t\t\texpected = _node.expected and tonumber(_node.expected) and tonumber(_node.expected) or 2,\n\t\t\t\t\t\tmaxRTT = \"1s\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\telse\n\t\t\t\tstrategy = { type = _node.balancingStrategy or \"random\" }\n\t\t\tend\n\t\t\ttable.insert(balancers, {\n\t\t\t\ttag = balancer_tag,\n\t\t\t\tselector = api.clone(valid_nodes),\n\t\t\t\tfallbackTag = fallback_node_tag,\n\t\t\t\tstrategy = strategy\n\t\t\t})\n\t\t\tif _node.balancingStrategy == \"leastPing\" or _node.balancingStrategy == \"leastLoad\" or fallback_node_tag then\n\t\t\t\tlocal t = api.format_go_time(_node.probeInterval)\n\t\t\t\tif t == \"0s\" then\n\t\t\t\t\tt = \"60s\"\n\t\t\t\telseif not t:find(\"[hm]\") and tonumber(t:match(\"%d+\")) < 10 then\n\t\t\t\t\tt = \"10s\"\n\t\t\t\tend\n\t\t\t\tif _node.balancingStrategy == \"leastLoad\" then\n\t\t\t\t\tburstObservatory = burstObservatory or {\n\t\t\t\t\t\tsubjectSelector = { \"blc-\" },\n\t\t\t\t\t\tpingConfig = {\n\t\t\t\t\t\t\tdestination = _node.useCustomProbeUrl and _node.probeUrl or nil,\n\t\t\t\t\t\t\tinterval = t,\n\t\t\t\t\t\t\tsampling = 3,\n\t\t\t\t\t\t\ttimeout = \"5s\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tobservatory = observatory or {\n\t\t\t\t\t\tsubjectSelector = { \"blc-\" },\n\t\t\t\t\t\tprobeUrl = _node.useCustomProbeUrl and _node.probeUrl or nil,\n\t\t\t\t\t\tprobeInterval = t,\n\t\t\t\t\t\tenableConcurrency = true\n\t\t\t\t\t}\n\t\t\t\tend\n\t\t\tend\n\t\t\tlocal loopback_outbound = gen_loopback(loopback_tag, loopback_dst)\n\t\t\tlocal inbound_tag = loopback_outbound.settings.inboundTag\n\t\t\ttable.insert(rules, { inboundTag = { inbound_tag }, balancerTag = balancer_tag })\n\t\t\treturn balancer_tag, loopback_outbound\n\t\tend\n\n\t\tfunction set_outbound_detour(node, outbound, outbounds_table)\n\t\t\tif not node or not outbound or not outbounds_table then return nil end\n\t\t\tlocal default_outTag = outbound.tag\n\t\t\tlocal last_insert_outbound\n\n\t\t\tif node.chain_proxy == \"1\" and node.preproxy_node then\n\t\t\t\tif outbound[\"_flag_proxy_tag\"] then\n\t\t\t\t\t--Ignore\n\t\t\t\telse\n\t\t\t\t\tlocal preproxy_node = get_node_by_id(node.preproxy_node)\n\t\t\t\t\tif preproxy_node then\n\t\t\t\t\t\tlocal preproxy_outbound, exist\n\t\t\t\t\t\tif preproxy_node.protocol == \"_balancing\" then\n\t\t\t\t\t\t\tlocal balancer_tag, loopback_outbound = gen_balancer(preproxy_node)\n\t\t\t\t\t\t\tif loopback_outbound then\n\t\t\t\t\t\t\t\tpreproxy_outbound = loopback_outbound\n\t\t\t\t\t\t\t\texist = true\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpreproxy_outbound = gen_outbound(node[\".name\"], preproxy_node)\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif preproxy_outbound then\n\t\t\t\t\t\t\toutbound.tag = preproxy_outbound.tag .. \" -> \" .. outbound.tag\n\t\t\t\t\t\t\toutbound.proxySettings = {\n\t\t\t\t\t\t\t\ttag = preproxy_outbound.tag,\n\t\t\t\t\t\t\t\ttransportLayer = true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tif not exist then\n\t\t\t\t\t\t\t\tlast_insert_outbound = preproxy_outbound\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tdefault_outTag = outbound.tag\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif node.chain_proxy == \"2\" and node.to_node then\n\t\t\t\tlocal to_node = get_node_by_id(node.to_node)\n\t\t\t\tif to_node then\n\t\t\t\t\t-- Landing Node not support use special node.\n\t\t\t\t\tif to_node.protocol and to_node.protocol:find(\"^_\") then\n\t\t\t\t\t\tto_node = nil\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif to_node then\n\t\t\t\t\tlocal to_outbound\n\t\t\t\t\tif to_node.type ~= \"Xray\" then\n\t\t\t\t\t\tlocal in_tag = \"inbound_\" .. to_node[\".name\"] .. \"_\" .. tostring(outbound.tag)\n\t\t\t\t\t\tlocal new_port = api.get_new_port()\n\t\t\t\t\t\ttable.insert(inbounds, {\n\t\t\t\t\t\t\ttag = in_tag,\n\t\t\t\t\t\t\tlisten = \"127.0.0.1\",\n\t\t\t\t\t\t\tport = new_port,\n\t\t\t\t\t\t\tprotocol = \"dokodemo-door\",\n\t\t\t\t\t\t\tsettings = {network = \"tcp,udp\", address = to_node.address, port = tonumber(to_node.port)}\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif to_node.tls_serverName == nil then\n\t\t\t\t\t\t\tto_node.tls_serverName = to_node.address\n\t\t\t\t\t\tend\n\t\t\t\t\t\tto_node.address = \"127.0.0.1\"\n\t\t\t\t\t\tto_node.port = new_port\n\t\t\t\t\t\ttable.insert(rules, 1, {\n\t\t\t\t\t\t\tinboundTag = {in_tag},\n\t\t\t\t\t\t\toutboundTag = outbound.tag\n\t\t\t\t\t\t})\n\t\t\t\t\t\tto_outbound = gen_outbound(node[\".name\"], to_node, to_node[\".name\"], {\n\t\t\t\t\t\t\ttag = to_node[\".name\"],\n\t\t\t\t\t\t\trun_socks_instance = not no_run\n\t\t\t\t\t\t})\n\t\t\t\t\telse\n\t\t\t\t\t\tto_outbound = gen_outbound(node[\".name\"], to_node)\n\t\t\t\t\tend\n\t\t\t\t\tif to_outbound then\n\t\t\t\t\t\tto_outbound.tag = outbound.tag .. \" -> \" .. to_outbound.tag\n\t\t\t\t\t\tif to_node.type == \"Xray\" then\n\t\t\t\t\t\t\tto_outbound.proxySettings = {\n\t\t\t\t\t\t\t\ttag = outbound.tag,\n\t\t\t\t\t\t\t\ttransportLayer = true\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tend\n\t\t\t\t\t\ttable.insert(outbounds_table, to_outbound)\n\t\t\t\t\t\tdefault_outTag = to_outbound.tag\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\treturn default_outTag, last_insert_outbound\n\t\tend\n\n\t\tfunction gen_outbound_get_tag(flag, node_id, tag, proxy_table)\n\t\t\tif not node_id or node_id == \"\" or node_id == \"nil\" then return nil end\n\t\t\tlocal node\n\t\t\tif type(node_id) == \"string\" then\n\t\t\t\tnode = get_node_by_id(node_id)\n\t\t\telseif type(node_id) == \"table\" then\n\t\t\t\tnode = node_id\n\t\t\tend\n\t\t\tif not tag then tag = node[\".name\"] end\n\t\t\tif node then\n\t\t\t\tif proxy_table.chain_proxy == \"1\" or proxy_table.chain_proxy == \"2\" then\n\t\t\t\t\tnode.chain_proxy = proxy_table.chain_proxy\n\t\t\t\t\tnode.preproxy_node = proxy_table.chain_proxy == \"1\" and proxy_table.preproxy_node\n\t\t\t\t\tnode.to_node = proxy_table.chain_proxy == \"2\" and proxy_table.to_node\n\t\t\t\t\tproxy_table.chain_proxy = nil\n\t\t\t\t\tproxy_table.preproxy_node = nil\n\t\t\t\t\tproxy_table.to_node = nil\n\t\t\t\tend\n\t\t\t\tlocal outbound, has_add_outbound\n\t\t\t\tfor _, _outbound in ipairs(outbounds) do\n\t\t\t\t\t-- Avoid generating duplicate nested processes\n\t\t\t\t\tif _outbound[\"_flag_proxy_tag\"] and _outbound[\"_flag_proxy_tag\"]:find(\"socks <- \" .. node[\".name\"], 1, true) then\n\t\t\t\t\t\toutbound = api.clone(_outbound)\n\t\t\t\t\t\toutbound.tag = tag\n\t\t\t\t\t\tbreak\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif node.protocol == \"_balancing\" then\n\t\t\t\t\tlocal balancer_tag, loopback_outbound = gen_balancer(node, tag)\n\t\t\t\t\tif loopback_outbound then\n\t\t\t\t\t\toutbound = loopback_outbound\n\t\t\t\t\t\tnode[\".name\"] = outbound.tag\n\t\t\t\t\t\thas_add_outbound = true\n\t\t\t\t\tend\n\t\t\t\telseif node.protocol == \"_iface\" then\n\t\t\t\t\tif node.iface then\n\t\t\t\t\t\toutbound = {\n\t\t\t\t\t\t\ttag = tag,\n\t\t\t\t\t\t\tprotocol = \"freedom\",\n\t\t\t\t\t\t\tstreamSettings = {\n\t\t\t\t\t\t\t\tsockopt = {\n\t\t\t\t\t\t\t\t\tmark = 255,\n\t\t\t\t\t\t\t\t\tinterface = node.iface\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t},\n\t\t\t\t\t\t\tsettings = {\n\t\t\t\t\t\t\t\tfinalRules = {{ action = \"allow\" }}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsys.call(string.format(\"mkdir -p %s && touch %s/%s\", api.TMP_IFACE_PATH, api.TMP_IFACE_PATH, node.iface))\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif not outbound then\n\t\t\t\t\toutbound = gen_outbound(flag, node, tag, proxy_table)\n\t\t\t\tend\n\t\t\t\tif outbound then\n\t\t\t\t\tlocal default_outbound_tag, last_insert_outbound = set_outbound_detour(node, outbound, outbounds)\n\t\t\t\t\tif not has_add_outbound then\n\t\t\t\t\t\tlocal insert_index = #outbounds + 1\n\t\t\t\t\t\tif tag == \"default\" then\n\t\t\t\t\t\t\tinsert_index = 1\n\t\t\t\t\t\tend\n\t\t\t\t\t\ttable.insert(outbounds, insert_index, outbound)\n\t\t\t\t\tend\n\t\t\t\t\tif last_insert_outbound then\n\t\t\t\t\t\ttable.insert(outbounds, last_insert_outbound)\n\t\t\t\t\tend\n\t\t\t\t\treturn default_outbound_tag\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tif node and node.protocol == \"_shunt\" then\n\t\t\tinner_fakedns = node.fakedns or \"0\"\n\n\t\t\tlocal function gen_shunt_node(rule_name, _node_id)\n\t\t\t\tif not rule_name then return nil end\n\t\t\t\tif not _node_id then _node_id = node[rule_name] end\n\t\t\t\tif _node_id == \"_direct\" then\n\t\t\t\t\treturn \"direct\"\n\t\t\t\telseif _node_id == \"_blackhole\" then\n\t\t\t\t\treturn \"blackhole\"\n\t\t\t\telseif _node_id == \"_default\" and rule_name ~= \"default\" then\n\t\t\t\t\treturn \"default\"\n\t\t\t\telseif _node_id then\n\t\t\t\t\tlocal proxy_table = {\n\t\t\t\t\t\tfragment = xray_settings.fragment == \"1\",\n\t\t\t\t\t\tnoise = xray_settings.noise == \"1\",\n\t\t\t\t\t\trun_socks_instance = not no_run,\n\t\t\t\t\t}\n\t\t\t\t\tlocal preproxy_node_id = node[rule_name .. \"_proxy_tag\"]\n\t\t\t\t\tif preproxy_node_id == _node_id then preproxy_node_id = nil end\n\t\t\t\t\tif preproxy_node_id then\n\t\t\t\t\t\tproxy_table.chain_proxy = \"2\"\n\t\t\t\t\t\tproxy_table.to_node = _node_id\n\t\t\t\t\t\treturn gen_outbound_get_tag(flag, preproxy_node_id, rule_name, proxy_table)\n\t\t\t\t\telse\n\t\t\t\t\t\treturn gen_outbound_get_tag(flag, _node_id, rule_name, proxy_table)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\treturn nil\n\t\t\tend\n\n\t\t\t--default_node\n\t\t\tlocal default_node_id = node.default_node or \"_direct\"\n\t\t\tlocal default_outboundTag = gen_shunt_node(\"default\", default_node_id)\n\t\t\tCOMMON.default_outbound_tag = default_outboundTag\n\n\t\t\tif inner_fakedns == \"1\" and node[\"default_fakedns\"] == \"1\" then\n\t\t\t\tremote_dns_fake = true\n\t\t\tend\n\n\t\t\t--shunt rule\n\t\t\tuci:foreach(appname, \"shunt_rules\", function(e)\n\t\t\t\tlocal outbound_tag = gen_shunt_node(e[\".name\"])\n\t\t\t\tif outbound_tag and e.remarks then\n\t\t\t\t\tif outbound_tag == \"default\" then\n\t\t\t\t\t\toutbound_tag = default_outboundTag\n\t\t\t\t\tend\n\t\t\t\t\tlocal protocols = nil\n\t\t\t\t\tif e[\"protocol\"] and e[\"protocol\"] ~= \"\" then\n\t\t\t\t\t\tprotocols = {}\n\t\t\t\t\t\tstring.gsub(e[\"protocol\"], '[^' .. \" \" .. ']+', function(w)\n\t\t\t\t\t\t\ttable.insert(protocols, w)\n\t\t\t\t\t\tend)\n\t\t\t\t\tend\n\t\t\t\t\tlocal inbound_tag = nil\n\t\t\t\t\tif e[\"inbound\"] and e[\"inbound\"] ~= \"\" then\n\t\t\t\t\t\tinbound_tag = {}\n\t\t\t\t\t\tif e[\"inbound\"]:find(\"tproxy\") then\n\t\t\t\t\t\t\tif tcp_redir_port then\n\t\t\t\t\t\t\t\ttable.insert(inbound_tag, \"tcp_redir\")\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tif udp_redir_port then\n\t\t\t\t\t\t\t\ttable.insert(inbound_tag, \"udp_redir\")\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif e[\"inbound\"]:find(\"socks\") then\n\t\t\t\t\t\t\tif local_socks_port then\n\t\t\t\t\t\t\t\ttable.insert(inbound_tag, \"socks-in\")\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tlocal domains = nil\n\t\t\t\t\tif e.domain_list then\n\t\t\t\t\t\tlocal domain_table = {\n\t\t\t\t\t\t\tshunt_rule_name = e[\".name\"],\n\t\t\t\t\t\t\toutboundTag = outbound_tag,\n\t\t\t\t\t\t\tdomain = {},\n\t\t\t\t\t\t\tfakedns = nil,\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdomains = {}\n\t\t\t\t\t\tstring.gsub(e.domain_list, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\t\t\t\tif w:find(\"#\") == 1 then return end\n\t\t\t\t\t\t\tif w:find(\"rule-set:\", 1, true) == 1 or w:find(\"rs:\") == 1 then return end\n\t\t\t\t\t\t\ttable.insert(domains, w)\n\t\t\t\t\t\t\ttable.insert(domain_table.domain, w)\n\t\t\t\t\t\tend)\n\t\t\t\t\t\tif inner_fakedns == \"1\" and node[e[\".name\"] .. \"_fakedns\"] == \"1\" and #domains > 0 then\n\t\t\t\t\t\t\tdomain_table.fakedns = true\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif outbound_tag then\n\t\t\t\t\t\t\ttable.insert(dns_domain_rules, api.clone(domain_table))\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif #domains == 0 then domains = nil end\n\t\t\t\t\tend\n\t\t\t\t\tlocal ip = nil\n\t\t\t\t\tif e.ip_list then\n\t\t\t\t\t\tip = {}\n\t\t\t\t\t\tstring.gsub(e.ip_list, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\t\t\t\tif w:find(\"#\") == 1 then return end\n\t\t\t\t\t\t\tif w:find(\"rule-set:\", 1, true) == 1 or w:find(\"rs:\") == 1 then return end\n\t\t\t\t\t\t\ttable.insert(ip, w)\n\t\t\t\t\t\tend)\n\t\t\t\t\t\tif #ip == 0 then ip = nil end\n\t\t\t\t\tend\n\t\t\t\t\tlocal source = nil\n\t\t\t\t\tif e.source then\n\t\t\t\t\t\tsource = {}\n\t\t\t\t\t\tstring.gsub(e.source, '[^' .. \" \" .. ']+', function(w)\n\t\t\t\t\t\t\ttable.insert(source, w)\n\t\t\t\t\t\tend)\n\t\t\t\t\tend\n\t\t\t\t\tlocal rule = {\n\t\t\t\t\t\truleTag = e.remarks,\n\t\t\t\t\t\tinboundTag = inbound_tag,\n\t\t\t\t\t\toutboundTag = outbound_tag,\n\t\t\t\t\t\tnetwork = e[\"network\"] or \"tcp,udp\",\n\t\t\t\t\t\tsource = source,\n\t\t\t\t\t\t--sourcePort = e[\"sourcePort\"] ~= \"\" and e[\"sourcePort\"] or nil,\n\t\t\t\t\t\tport = e[\"port\"] ~= \"\" and e[\"port\"] or nil,\n\t\t\t\t\t\tprotocol = protocols\n\t\t\t\t\t}\n\t\t\t\t\tif domains then\n\t\t\t\t\t\tlocal _rule = api.clone(rule)\n\t\t\t\t\t\t_rule.ruleTag = _rule.ruleTag .. \" Domains\"\n\t\t\t\t\t\t_rule.domains = domains\n\t\t\t\t\t\ttable.insert(rules, _rule)\n\t\t\t\t\tend\n\t\t\t\t\tif ip then\n\t\t\t\t\t\tlocal _rule = api.clone(rule)\n\t\t\t\t\t\t_rule.ruleTag = _rule.ruleTag .. \" IP\"\n\t\t\t\t\t\t_rule.ip = ip\n\t\t\t\t\t\ttable.insert(rules, _rule)\n\t\t\t\t\tend\n\t\t\t\t\tif not domains and not ip and protocols then\n\t\t\t\t\t\ttable.insert(rules, rule)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend)\n\n\t\t\tif default_outboundTag then\n\t\t\t\tlocal rule = {\n\t\t\t\t\t_flag = \"default\",\n\t\t\t\t\ttype = \"field\",\n\t\t\t\t\toutboundTag = default_outboundTag\n\t\t\t\t}\n\t\t\t\tif node.domainStrategy == \"IPIfNonMatch\" then\n\t\t\t\t\trule.ip = { \"0.0.0.0/0\", \"::/0\" }\n\t\t\t\telse\n\t\t\t\t\trule.network = \"tcp,udp\"\n\t\t\t\tend\n\t\t\t\ttable.insert(rules, rule)\n\t\t\tend\n\n\t\t\trouting = {\n\t\t\t\tdomainStrategy = node.domainStrategy or \"AsIs\",\n\t\t\t\tdomainMatcher = node.domainMatcher or \"hybrid\",\n\t\t\t\tbalancers = #balancers > 0 and balancers or nil,\n\t\t\t\trules = rules\n\t\t\t}\n\t\telse\n\t\t\tCOMMON.default_outbound_tag = gen_outbound_get_tag(flag, node or node_id, nil, {\n\t\t\t\tfragment = xray_settings.fragment == \"1\" or nil,\n\t\t\t\tnoise = xray_settings.noise == \"1\" or nil,\n\t\t\t\trun_socks_instance = not no_run\n\t\t\t})\n\t\t\tif COMMON.default_outbound_tag then\n\t\t\t\trouting = {\n\t\t\t\t\tdomainStrategy = \"AsIs\",\n\t\t\t\t\tdomainMatcher = \"hybrid\",\n\t\t\t\t\tbalancers = #balancers > 0 and balancers or nil,\n\t\t\t\t\trules = rules\n\t\t\t\t}\n\t\t\t\ttable.insert(routing.rules, {\n\t\t\t\t\truleTag = \"default\",\n\t\t\t\t\tnetwork = \"tcp,udp\",\n\t\t\t\t\toutboundTag = COMMON.default_outbound_tag\n\t\t\t\t})\n\t\t\tend\n\t\tend\n\n\t\tif tcp_redir_port or udp_redir_port then\n\t\t\tlocal inbound = {\n\t\t\t\tprotocol = \"dokodemo-door\",\n\t\t\t\tsettings = {network = \"tcp,udp\", followRedirect = true},\n\t\t\t\tstreamSettings = {sockopt = {tproxy = \"tproxy\"}},\n\t\t\t\tsniffing = {\n\t\t\t\t\tenabled = (xray_settings.sniffing_override_dest == \"1\") or (node and node.protocol == \"_shunt\") or false\n\t\t\t\t}\n\t\t\t}\n\t\t\tif inbound.sniffing.enabled == true then\n\t\t\t\tinbound.sniffing.destOverride = {\"http\", \"tls\", \"quic\"}\n\t\t\t\tinbound.sniffing.metadataOnly = false\n\t\t\t\tinbound.sniffing.routeOnly = xray_settings.sniffing_override_dest ~= \"1\" or nil\n\t\t\t\tinbound.sniffing.domainsExcluded = xray_settings.sniffing_override_dest == \"1\" and get_domain_excluded() or nil\n\t\t\tend\n\t\t\tif remote_dns_fake or inner_fakedns == \"1\" then\n\t\t\t\tinbound.sniffing.enabled = true\n\t\t\t\tif not inbound.sniffing.destOverride then\n\t\t\t\t\tinbound.sniffing.destOverride = {\"fakedns\"}\n\t\t\t\t\tinbound.sniffing.metadataOnly = true\n\t\t\t\telse\n\t\t\t\t\ttable.insert(inbound.sniffing.destOverride, \"fakedns\")\n\t\t\t\t\tinbound.sniffing.metadataOnly = false\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif tcp_redir_port then\n\t\t\t\tlocal tcp_inbound = api.clone(inbound)\n\t\t\t\ttcp_inbound.tag = \"tcp_redir\"\n\t\t\t\ttcp_inbound.settings.network = \"tcp\"\n\t\t\t\ttcp_inbound.port = tonumber(tcp_redir_port)\n\t\t\t\ttcp_inbound.streamSettings.sockopt.tproxy = tcp_proxy_way\n\t\t\t\ttable.insert(inbounds, tcp_inbound)\n\t\t\tend\n\n\t\t\tif udp_redir_port then\n\t\t\t\tlocal udp_inbound = api.clone(inbound)\n\t\t\t\tudp_inbound.tag = \"udp_redir\"\n\t\t\t\tudp_inbound.settings.network = \"udp\"\n\t\t\t\tudp_inbound.port = tonumber(udp_redir_port)\n\t\t\t\ttable.insert(inbounds, udp_inbound)\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal node_dns = {}\n\tfor i, v in pairs(GLOBAL.DNS_SERVER) do\n\t\ttable.insert(node_dns, {\n\t\t\tserver = v,\n\t\t\toutboundTag = \"direct\"\n\t\t})\n\tend\n\n\tif (remote_dns_udp_server and remote_dns_udp_port) or (remote_dns_tcp_server and remote_dns_tcp_port) or remote_dns_doh or #node_dns > 0 then\n\t\tif not routing then\n\t\t\trouting = {\n\t\t\t\tdomainStrategy = \"IPOnDemand\",\n\t\t\t\trules = {}\n\t\t\t}\n\t\tend\n\n\t\tdns = {\n\t\t\ttag = \"dns-global\",\n\t\t\thosts = {},\n\t\t\tdisableCache = (dns_cache and dns_cache == \"0\") and true or false,\n\t\t\tdisableFallback = true,\n\t\t\tdisableFallbackIfMatch = true,\n\t\t\tservers = {},\n\t\t\tclientIp = (remote_dns_client_ip and remote_dns_client_ip ~= \"\") and remote_dns_client_ip or nil,\n\t\t\tqueryStrategy = \"UseIP\",\n\t\t\tuseSystemHosts = true\n\t\t}\n\n\t\tlocal _direct_dns = {}\n\n\t\tdirect_dns_udp_server = (direct_dns_udp_server and direct_dns_udp_server ~= \"\") and direct_dns_udp_server or nil\n\n\t\tif direct_dns_udp_server or direct_dns_tcp_server then\n\t\t\t_direct_dns.tag = \"dns-global-direct\"\n\t\t\t_direct_dns.queryStrategy = (direct_dns_query_strategy and direct_dns_query_strategy ~= \"\") and direct_dns_query_strategy or \"UseIP\"\n\n\t\t\tif direct_dns_udp_server then\n\t\t\t\tlocal port = tonumber(direct_dns_port) or 53\n\t\t\t\t_direct_dns.port = port\n\t\t\t\t_direct_dns.address = direct_dns_udp_server\n\t\t\telseif direct_dns_tcp_server then\n\t\t\t\tlocal port = tonumber(direct_dns_port) or 53\n\t\t\t\t_direct_dns.address = \"tcp://\" .. direct_dns_tcp_server .. \":\" .. port\n\t\t\tend\n\n\t\t\tif COMMON.default_outbound_tag == \"direct\" then\n\t\t\t\ttable.insert(dns.servers, _direct_dns)\n\t\t\tend\n\t\tend\n\t\tif dns_listen_port and next(_direct_dns) then\n\t\t\tlocal domain = {}\n\t\t\tlocal nodes_domain_text = sys.exec([[uci show passwall | sed -n \"s/.*\\.\\(address\\|download_address\\)='\\([^']*\\)'/\\2/p\" | sort -u]])\n\t\t\tstring.gsub(nodes_domain_text, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\tw = (w or \"\"):lower()\n\t\t\t\tif not api.vps_domain_exclude(w) and api.datatypes.hostname(w) and not GLOBAL.VPS_EXCLUDE[w] then\n\t\t\t\t\ttable.insert(domain, \"full:\" .. w)\n\t\t\t\tend\n\t\t\tend)\n\t\t\tif #domain > 0 then\n\t\t\t\ttable.insert(dns_domain_rules, 1, {\n\t\t\t\t\tshunt_rule_name = \"logic-vpslist\",\n\t\t\t\t\toutboundTag = \"direct\",\n\t\t\t\t\tdomain = domain\n\t\t\t\t})\n\t\t\tend\n\t\tend\n\n\t\tlocal _remote_dns = {}\n\n\t\tif remote_dns_udp_server then\n\t\t\t_remote_dns.address = remote_dns_udp_server\n\t\t\t_remote_dns.port = tonumber(remote_dns_udp_port) or 53\n\n\t\telseif remote_dns_tcp_server then\n\t\t\t_remote_dns.address = \"tcp://\" .. remote_dns_tcp_server .. \":\" .. tonumber(remote_dns_tcp_port) or 53\n\n\t\telseif remote_dns_doh then\n\t\t\tlocal _a = api.parseDoH(remote_dns_doh)\n\t\t\tif _a then\n\t\t\t\t_remote_dns.address = _a.url\n\t\t\t\t_remote_dns.port = _a.port or 443\n\n\t\t\t\tif api.datatypes.hostname(_a.hostname) then\n\t\t\t\t\tif _a.hostip then\n\t\t\t\t\t\tdns.hosts[_a.hostname] = _a.hostip\n\t\t\t\t\telse\n\t\t\t\t\t\tGLOBAL.DNS_HOSTNAME[_a.hostname] = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tif next(_remote_dns) then\n\t\t\t-- _remote_dns.tag = \"dns-global-remote\"\n\t\t\t_remote_dns.queryStrategy = (remote_dns_query_strategy and remote_dns_query_strategy ~= \"\") and remote_dns_query_strategy or \"UseIPv4\"\n\t\t\ttable.insert(dns.servers, _remote_dns)\n\t\tend\n\n\t\tlocal _remote_fakedns = {\n\t\t\t--tag = \"dns-global-remote-fakedns\",\n\t\t\taddress = \"fakedns\",\n\t\t}\n\n\t\tif remote_dns_fake or inner_fakedns == \"1\" then\n\t\t\tfakedns = {}\n\t\t\tlocal fakedns4 = {\n\t\t\t\tipPool = \"198.18.0.0/15\",\n\t\t\t\tpoolSize = 65535\n\t\t\t}\n\t\t\tlocal fakedns6 = {\n\t\t\t\tipPool = \"fc00::/18\",\n\t\t\t\tpoolSize = 65535\n\t\t\t}\n\t\t\tif remote_dns_query_strategy == \"UseIP\" then\n\t\t\t\ttable.insert(fakedns, fakedns4)\n\t\t\t\ttable.insert(fakedns, fakedns6)\n\t\t\telseif remote_dns_query_strategy == \"UseIPv4\" then\n\t\t\t\ttable.insert(fakedns, fakedns4)\n\t\t\telseif remote_dns_query_strategy == \"UseIPv6\" then\n\t\t\t\ttable.insert(fakedns, fakedns6)\n\t\t\tend\n\t\t\tif remote_dns_fake and inner_fakedns ~= \"1\" then\n\t\t\t\ttable.insert(dns.servers, 1, _remote_fakedns)\n\t\t\tend\n\t\tend\n\n\t\tlocal dns_outbound_tag = \"direct\"\n\t\tif dns_socks_address and dns_socks_port then\n\t\t\tdns_outbound_tag = \"out\"\n\t\t\ttable.insert(outbounds, 1, {\n\t\t\t\ttag = dns_outbound_tag,\n\t\t\t\tprotocol = \"socks\",\n\t\t\t\tstreamSettings = {\n\t\t\t\t\tnetwork = \"tcp\",\n\t\t\t\t\tsecurity = \"none\",\n\t\t\t\t\tsockopt = {\n\t\t\t\t\t\tmark = 255\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsettings = {\n\t\t\t\t\tservers = {\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taddress = dns_socks_address,\n\t\t\t\t\t\t\tport = tonumber(dns_socks_port)\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t})\n\t\telse\n\t\t\tif COMMON.default_outbound_tag then\n\t\t\t\tdns_outbound_tag = COMMON.default_outbound_tag\n\t\t\tend\n\t\tend\n\n\t\tlocal dns_rule_position = 1\n\t\tlocal remote_dns_outbound\n\t\tif dns_listen_port then\n\t\t\ttable.insert(inbounds, {\n\t\t\t\tlisten = \"127.0.0.1\",\n\t\t\t\tport = tonumber(dns_listen_port),\n\t\t\t\tprotocol = \"dokodemo-door\",\n\t\t\t\ttag = \"dns-in\",\n\t\t\t\tsettings = {\n\t\t\t\t\taddress = \"0.0.0.0\",\n\t\t\t\t\tnetwork = \"tcp,udp\"\n\t\t\t\t}\n\t\t\t})\n\n\t\t\t-- remote dns outbound\n\t\t\tlocal chn_list = uci:get(appname, \"@global[0]\", \"chn_list\") or \"direct\"\n\t\t\tremote_dns_outbound = {\n\t\t\t\ttag = \"dns-out\",\n\t\t\t\tprotocol = \"dns\",\n\t\t\t\tproxySettings = dns_outbound_tag and {\n\t\t\t\t\ttag = (dns_outbound_tag ~= \"blackhole\") and dns_outbound_tag or \"direct\"\n\t\t\t\t} or nil,\n\t\t\t\tsettings = {\n\t\t\t\t\taddress = (chn_list ~= \"proxy\") and \"8.8.8.8\" or \"223.5.5.5\",\n\t\t\t\t\tport = 53,\n\t\t\t\t\tnetwork = \"tcp\",\n\t\t\t\t\tnonIPQuery = (api.compare_versions(xray_version, \"<\", \"26.4.25\")) and \"reject\" or nil, -- Todo is to remove it\n\t\t\t\t\trules = (api.compare_versions(xray_version, \">\", \"26.4.17\")) and {} or nil\n\t\t\t\t}\n\t\t\t}\n\n\t\t\ttable.insert(routing.rules, 1, {\n\t\t\t\tinboundTag = {\n\t\t\t\t\t\"dns-in\"\n\t\t\t\t},\n\t\t\t\toutboundTag = \"dns-out\"\n\t\t\t})\n\t\t\tdns_rule_position = dns_rule_position + 1\n\t\tend\n\n\t\tif not COMMON.default_outbound_tag or COMMON.default_outbound_tag == \"direct\" then\n\t\t\tif direct_dns_udp_server or direct_dns_tcp_server then\n\t\t\t\ttable.insert(routing.rules, dns_rule_position, {\n\t\t\t\t\tinboundTag = {\n\t\t\t\t\t\t\"dns-global-direct\"\n\t\t\t\t\t},\n\t\t\t\t\toutboundTag = \"direct\"\n\t\t\t\t})\n\t\t\t\tdns_rule_position = dns_rule_position + 1\n\t\t\tend\n\t\tend\n\n\t\t--按分流顺序DNS\n\t\tlocal remote_dns_out_rules = {}\n\t\tif dns_domain_rules and #dns_domain_rules > 0 then\n\t\t\tfor index, value in ipairs(dns_domain_rules) do\n\t\t\t\tif value.domain and value.outboundTag then\n\t\t\t\t\tlocal dns_server = nil\n\t\t\t\t\tif value.outboundTag == \"direct\" and _direct_dns.address then\n\t\t\t\t\t\tdns_server = api.clone(_direct_dns)\n\t\t\t\t\telse\n\t\t\t\t\t\tif value.fakedns then\n\t\t\t\t\t\t\tdns_server = api.clone(_remote_fakedns)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tdns_server = api.clone(_remote_dns)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tlocal outboundTag\n\t\t\t\t\tif dns_server then\n\t\t\t\t\t\tif not api.is_local_ip(dns_server.address) or value.outboundTag == \"blackhole\" then\n\t\t\t\t\t\t\toutboundTag = value.outboundTag\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\toutboundTag = \"direct\" --dns为本地ip，走直连\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\t--[[\n\t\t\t\t\tlocal dns_block_mode = \"host\"\n\t\t\t\t\tif dns_block_mode == \"host\" and outboundTag == \"blackhole\" then\n\t\t\t\t\t\tfor d_i, d_k in ipairs(value.domain) do\n\t\t\t\t\t\t\tdns.hosts[d_k] = \"0.0.0.0\"\n\t\t\t\t\t\tend\n\t\t\t\t\t\tdns_server = nil\n\t\t\t\t\tend\n\t\t\t\t\t]]--\n\n\t\t\t\t\t-- remote dns outbound rules\n\t\t\t\t\tif value.outboundTag == \"blackhole\" then\n\t\t\t\t\t\ttable.insert(remote_dns_out_rules, {\n\t\t\t\t\t\t\taction = \"reject\",\n\t\t\t\t\t\t\tdomain = api.clone(value.domain)\n\t\t\t\t\t\t})\n\t\t\t\t\telse\n\t\t\t\t\t\ttable.insert(remote_dns_out_rules, {\n\t\t\t\t\t\t\taction = \"hijack\",\n\t\t\t\t\t\t\tqtype = \"1,28\",\n\t\t\t\t\t\t\tdomain = api.clone(value.domain)\n\t\t\t\t\t\t})\n\t\t\t\t\tend\n\n\t\t\t\t\tif dns_server then\n\t\t\t\t\t\t--dns_server.finalQuery = true\n\t\t\t\t\t\tdns_server.domains = value.domain\n\t\t\t\t\t\tif value.shunt_rule_name then\n\t\t\t\t\t\t\tdns_server.tag = \"dns-in-\" .. value.shunt_rule_name\n\t\t\t\t\t\t\tif value.shunt_rule_name == \"logic-vpslist\" then\n\t\t\t\t\t\t\t\tdns_server.finalQuery = true\n\t\t\t\t\t\t\t\tdns_server.disableCache = false\n\t\t\t\t\t\t\t\tdns_server.serveStale = true\n\t\t\t\t\t\t\t\tdns_server.serveExpiredTTL = 30\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\ttable.insert(dns.servers, dns_server)\n\t\t\t\t\t\ttable.insert(routing.rules, dns_rule_position, {\n\t\t\t\t\t\t\tinboundTag = { dns_server.tag },\n\t\t\t\t\t\t\toutboundTag = outboundTag\n\t\t\t\t\t\t})\n\t\t\t\t\t\tdns_rule_position = dns_rule_position + 1\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tlocal _outboundTag\n\t\tif _remote_dns.address and not api.is_local_ip(_remote_dns.address) or dns_outbound_tag == \"blackhole\" then --dns为本地ip，不走代理\n\t\t\t_outboundTag = dns_outbound_tag\n\t\telse\n\t\t\t_outboundTag = \"direct\"\n\t\tend\n\t\ttable.insert(routing.rules, dns_rule_position, {\n\t\t\tinboundTag = { \"dns-global\" },\n\t\t\toutboundTag = _outboundTag\n\t\t})\n\t\tdns_rule_position = dns_rule_position + 1\n\n\t\tlocal default_rule_index = nil\n\t\tfor index, value in ipairs(routing.rules) do\n\t\t\tif value.ruleTag == \"default\" then\n\t\t\t\tdefault_rule_index = index\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\t\tif default_rule_index then\n\t\t\tlocal default_rule = api.clone(routing.rules[default_rule_index])\n\t\t\ttable.remove(routing.rules, default_rule_index)\n\t\t\ttable.insert(routing.rules, default_rule)\n\t\tend\n\n\t\tlocal dns_hosts_len = 0\n\t\tfor key, value in pairs(dns.hosts) do\n\t\t\tdns_hosts_len = dns_hosts_len + 1\n\t\tend\n\n\t\tif dns_hosts_len == 0 then\n\t\t\tdns.hosts = nil\n\t\tend\n\n\t\t-- remote dns outbound\n\t\tif remote_dns_outbound then\n\t\t\tif remote_dns_outbound.settings.rules then\n\t\t\t\ttable.insert(remote_dns_out_rules, {\n\t\t\t\t\taction = \"hijack\",\n\t\t\t\t\tqtype = \"1,28\"\n\t\t\t\t})\n\t\t\t\ttable.insert(remote_dns_out_rules, {\n\t\t\t\t\taction = \"direct\"\n\t\t\t\t})\n\t\t\t\tremote_dns_outbound.settings.rules = remote_dns_out_rules\n\t\t\tend\n\t\t\ttable.insert(outbounds, remote_dns_outbound)\n\t\tend\n\n\t\t-- 自定义节点 DNS\n\t\tif #node_dns > 0 and #dns.servers < 1 then\n\t\t\tdns.servers = { \"localhost\" }\n\t\tend\n\t\tlocal idx = dns_listen_port and 2 or 1\n\t\tfor i = #node_dns, 1, -1 do\n\t\t\tlocal value = node_dns[i]\n\t\t\ttable.insert(routing.rules, idx, {\n\t\t\t\tinboundTag = {\n\t\t\t\t\tvalue.server.tag\n\t\t\t\t},\n\t\t\t\toutboundTag = value.outboundTag,\n\t\t\t})\n\t\t\ttable.insert(dns.servers, 2, value.server)\n\t\tend\n\t\tif next(GLOBAL.DNS_HOSTNAME) then\n\t\t\tlocal hostname = {}\n\t\t\tfor line, _ in pairs(GLOBAL.DNS_HOSTNAME) do\n\t\t\t\ttable.insert(hostname, line)\n\t\t\tend\n\t\t\tlocal new_dns_server = next(_direct_dns) and api.clone(_direct_dns) or { address = \"localhost\" }\n\t\t\tnew_dns_server.tag = \"dns-in-bootstrap\"\n\t\t\tnew_dns_server.domains = hostname\n\t\t\ttable.insert(dns.servers, 2, new_dns_server)\n\t\t\ttable.insert(routing.rules, idx, {\n\t\t\t\tinboundTag = { \"dns-in-bootstrap\" },\n\t\t\t\toutboundTag = \"direct\"\n\t\t\t})\n\t\tend\n\tend\n\n\tif inbounds or outbounds then\n\t\tlocal config = {\n\t\t\tlog = {\n\t\t\t\t-- error = string.format(\"/tmp/etc/%s/%s.log\", appname, node[\".name\"]),\n\t\t\t\tloglevel = loglevel\n\t\t\t},\n\t\t\t-- DNS\n\t\t\tdns = dns,\n\t\t\tfakedns = fakedns,\n\t\t\t-- 传入连接\n\t\t\tinbounds = inbounds,\n\t\t\t-- 传出连接\n\t\t\toutbounds = outbounds,\n\t\t\t-- 连接观测\n\t\t\tobservatory = (not burstObservatory) and observatory or nil,\n\t\t\tburstObservatory = burstObservatory,\n\t\t\t-- 路由\n\t\t\trouting = routing,\n\t\t\t-- 本地策略\n\t\t\tpolicy = {\n\t\t\t\tlevels = {\n\t\t\t\t\t[0] = {\n\t\t\t\t\t\t-- handshake = 4,\n\t\t\t\t\t\t-- connIdle = 300,\n\t\t\t\t\t\t-- uplinkOnly = 2,\n\t\t\t\t\t\t-- downlinkOnly = 5,\n\t\t\t\t\t\tbufferSize = xray_settings.buffer_size and tonumber(xray_settings.buffer_size) or nil,\n\t\t\t\t\t\tstatsUserUplink = false,\n\t\t\t\t\t\tstatsUserDownlink = false\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t-- system = {\n\t\t\t\t--     statsInboundUplink = false,\n\t\t\t\t--     statsInboundDownlink = false\n\t\t\t\t-- }\n\t\t\t}\n\t\t}\n\n\t\tlocal direct_outbound = {\n\t\t\tprotocol = \"freedom\",\n\t\t\ttag = \"direct\",\n\t\t\tsettings = {\n\t\t\t\tdomainStrategy = (direct_dns_query_strategy and direct_dns_query_strategy ~= \"\") and direct_dns_query_strategy or \"UseIP\",\n\t\t\t\tfinalRules = (api.compare_versions(xray_version, \">\", \"26.4.25\")) and {{ action = \"allow\" }} or nil  -- Todo: Remove version check\n\t\t\t},\n\t\t\tstreamSettings = {\n\t\t\t\tsockopt = {\n\t\t\t\t\tmark = 255\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif COMMON.default_outbound_tag == \"direct\" then\n\t\t\ttable.insert(outbounds, 1, direct_outbound)\n\t\telse\n\t\t\ttable.insert(outbounds, direct_outbound)\n\t\tend\n\n\t\tlocal blackhole_outbound = {\n\t\t\tprotocol = \"blackhole\",\n\t\t\ttag = \"blackhole\"\n\t\t}\n\t\tif COMMON.default_outbound_tag == \"blackhole\" then\n\t\t\ttable.insert(outbounds, 1, blackhole_outbound)\n\t\telse\n\t\t\ttable.insert(outbounds, blackhole_outbound)\n\t\tend\n\t\tfor index, value in ipairs(config.outbounds) do\n\t\t\tlocal pt = value.protocol\n\t\t\tlocal exclude = { blackhole=1, dns=1, freedom=1, loopback=1 }\n\t\t\tif not value[\"_flag_proxy_tag\"] and value[\"_id\"] and pt and not exclude[pt] and not no_run then\n\t\t\t\tsys.call(string.format(\"echo '%s' >> %s\", value[\"_id\"], api.TMP_PATH .. \"/direct_node_list\"))\n\t\t\tend\n\t\t\tfor k, v in pairs(config.outbounds[index]) do\n\t\t\t\tif k:find(\"_\") == 1 then\n\t\t\t\t\tconfig.outbounds[index][k] = nil\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\treturn jsonc.stringify(config, 1)\n\tend\nend\n\nfunction gen_proto_config(var)\n\tlocal local_socks_address = var[\"local_socks_address\"] or \"0.0.0.0\"\n\tlocal local_socks_port = var[\"local_socks_port\"]\n\tlocal local_socks_username = var[\"local_socks_username\"]\n\tlocal local_socks_password = var[\"local_socks_password\"]\n\tlocal local_http_address = var[\"local_http_address\"] or \"0.0.0.0\"\n\tlocal local_http_port = var[\"local_http_port\"]\n\tlocal local_http_username = var[\"local_http_username\"]\n\tlocal local_http_password = var[\"local_http_password\"]\n\tlocal server_proto = var[\"server_proto\"]\n\tlocal server_address = var[\"server_address\"]\n\tlocal server_port = var[\"server_port\"]\n\tlocal server_username = var[\"server_username\"]\n\tlocal server_password = var[\"server_password\"]\n\n\tlocal inbounds = {}\n\tlocal outbounds = {}\n\tlocal routing = nil\n\n\tif local_socks_address and local_socks_port then\n\t\tlocal inbound = {\n\t\t\tlisten = local_socks_address,\n\t\t\tport = tonumber(local_socks_port),\n\t\t\tprotocol = \"socks\",\n\t\t\tsettings = {\n\t\t\t\tudp = true,\n\t\t\t\tauth = \"noauth\"\n\t\t\t}\n\t\t}\n\t\tif local_socks_username and local_socks_password and local_socks_username ~= \"\" and local_socks_password ~= \"\" then\n\t\t\tinbound.settings.auth = \"password\"\n\t\t\tinbound.settings.accounts = {\n\t\t\t\t{\n\t\t\t\t\tuser = local_socks_username,\n\t\t\t\t\tpass = local_socks_password\n\t\t\t\t}\n\t\t\t}\n\t\tend\n\t\ttable.insert(inbounds, inbound)\n\tend\n\n\tif local_http_address and local_http_port then\n\t\tlocal inbound = {\n\t\t\tlisten = local_http_address,\n\t\t\tport = tonumber(local_http_port),\n\t\t\tprotocol = \"http\",\n\t\t\tsettings = {\n\t\t\t\tallowTransparent = false\n\t\t\t}\n\t\t}\n\t\tif local_http_username and local_http_password and local_http_username ~= \"\" and local_http_password ~= \"\" then\n\t\t\tinbound.settings.accounts = {\n\t\t\t\t{\n\t\t\t\t\tuser = local_http_username,\n\t\t\t\t\tpass = local_http_password\n\t\t\t\t}\n\t\t\t}\n\t\tend\n\t\ttable.insert(inbounds, inbound)\n\tend\n\n\tif server_proto ~= \"nil\" and server_address ~= \"nil\" and server_port ~= \"nil\" then\n\t\tlocal outbound = {\n\t\t\tprotocol = server_proto,\n\t\t\tstreamSettings = {\n\t\t\t\tnetwork = \"tcp\",\n\t\t\t\tsecurity = \"none\"\n\t\t\t},\n\t\t\tsettings = {\n\t\t\t\tservers = {\n\t\t\t\t\t{\n\t\t\t\t\t\taddress = server_address,\n\t\t\t\t\t\tport = tonumber(server_port),\n\t\t\t\t\t\tusers = (server_username and server_password) and {\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tuser = server_username,\n\t\t\t\t\t\t\t\tpass = server_password\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} or nil\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif outbound then table.insert(outbounds, outbound) end\n\tend\n\n\t-- 额外传出连接\n\ttable.insert(outbounds, {\n\t\tprotocol = \"freedom\", tag = \"direct\", settings = {finalRules = {{ action = \"allow\" }}}, sockopt = {mark = 255}\n\t})\n\n\tlocal config = {\n\t\tlog = {\n\t\t\tloglevel = \"warning\"\n\t\t},\n\t\t-- 传入连接\n\t\tinbounds = inbounds,\n\t\t-- 传出连接\n\t\toutbounds = outbounds,\n\t\t-- 路由\n\t\trouting = routing\n\t}\n\treturn jsonc.stringify(config, 1)\nend\n\n_G.gen_config = gen_config\n_G.gen_proto_config = gen_proto_config\n\nif arg[1] then\n\tlocal func =_G[arg[1]]\n\tif func then\n\t\tlocal var = nil\n\t\tif arg[2] then\n\t\t\tvar = jsonc.parse(arg[2])\n\t\tend\n\t\tprint(func(var))\n\tend\nend\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/acl/view_chinadns_log.htm",
    "content": "<%\nlocal api = require \"luci.passwall.api\"\n-%>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\t(function () {\n\t\tconst startTime = Date.now();\n\t\tconst TIMEOUT = 3000;\n\n\t\tconst waitForDnsSelect = () => {\n\t\t\tconst dns_select = document.querySelector(\"select[id*='dns_shunt']\");\n\t\t\tif (dns_select) {\n\t\t\t\tinitDnsSelect(dns_select);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (Date.now() - startTime >= TIMEOUT) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\trequestAnimationFrame(waitForDnsSelect);\n\t\t};\n\t\twaitForDnsSelect();\n\n\t\tconst initDnsSelect = (dns_select) => {\n\t\t\tif (dns_select.value === \"chinadns-ng\") {\n\t\t\t\taddLogLink(dns_select);\n\t\t\t}\n\t\t\tif (dns_select._dnsLogBinded) return;\n\t\t\tdns_select._dnsLogBinded = true;\n\n\t\t\tdns_select.addEventListener(\"change\", () => {\n\t\t\t\tconst existingLogLink = dns_select.parentElement.querySelector(\"a.dns-log-link\");\n\t\t\t\tif (existingLogLink) {\n\t\t\t\t\texistingLogLink.remove();\n\t\t\t\t}\n\t\t\t\tif (dns_select.value === \"chinadns-ng\") {\n\t\t\t\t\taddLogLink(dns_select);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tconst addLogLink = (select) => {\n\t\t\tif (select.parentElement.querySelector(\"a.dns-log-link\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst logLink = document.createElement(\"a\");\n\t\t\tlogLink.innerHTML = \"<%:Log%>\";\n\t\t\tlogLink.href = \"#\";\n\t\t\tlogLink.className = \"dns-log-link\";\n\t\t\tlogLink.style.marginLeft = \"10px\";\n\t\t\tlogLink.setAttribute(\"onclick\", \"window.open('\" + '<%=api.url(\"get_chinadns_log\") .. \"?flag=\" .. section%>' + \"', '_blank')\");\n\t\t\tselect.insertAdjacentElement(\"afterend\", logLink);\n\t\t};\n\t})();\n\t//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/app_update/app_version.htm",
    "content": "<%\nlocal api = require \"luci.passwall.api\"\nlocal com = require \"luci.passwall.com\"\nlocal version = {}\n-%>\n\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tvar appInfoList = new Array();\n\tvar inProgressCount = 0;\n\tvar tokenStr = '<%=token%>';\n\tvar checkUpdateText = '<%:Check update%>';\n\tvar forceUpdateText = '<%:Force update%>';\n\tvar retryText = '<%:Retry%>';\n\tvar noUpdateText = '<%:It is the latest version%>';\n\tvar updateSuccessText = '<%:Update successful%>';\n\tvar clickToUpdateText = '<%:Click to update%>';\n\tvar inProgressText = '<%:Updating...%>';\n\tvar unexpectedErrorText = '<%:Unexpected error%>';\n\tvar updateInProgressNotice = '<%:Updating, are you sure to close?%>';\n\tvar downloadingText = '<%:Downloading...%>';\n\tvar decompressioningText = '<%:Unpacking...%>';\n\tvar movingText = '<%:Moving...%>';\n\n\t//window.onload = function () {};\n\n\tfunction addPageNotice() {\n\t\tif (inProgressCount === 0) {\n\t\t\twindow.onbeforeunload = function (e) {\n\t\t\t\te.returnValue = updateInProgressNotice;\n\t\t\t\treturn updateInProgressNotice;\n\t\t\t};\n\t\t}\n\t\tinProgressCount++;\n\t}\n\n\tfunction removePageNotice() {\n\t\tinProgressCount--;\n\t\tif (inProgressCount === 0) {\n\t\t\twindow.onbeforeunload = undefined;\n\t\t}\n\t}\n\n\tfunction onUpdateSuccess(btn) {\n\t\tif (btn) {\n\t\t\tbtn.value = updateSuccessText;\n\t\t\tbtn.placeholder = updateSuccessText;\n\t\t\tbtn.disabled = true;\n\t\t}\n\n\t\tif (inProgressCount === 0) {\n\t\t\twindow.setTimeout(function () {\n\t\t\t\twindow.location.reload();\n\t\t\t}, 1000);\n\t\t}\n\t}\n\n\tfunction onRequestError(btn, errorMessage) {\n\t\tbtn.disabled = false;\n\t\tbtn.value = retryText;\n\n\t\tvar ckeckDetailElm = document.getElementById(btn.id + '-detail');\n\t\tif (errorMessage && ckeckDetailElm) {\n\t\t\tckeckDetailElm.textContent = errorMessage\n\t\t}\n\t}\n\n\tfunction onBtnClick(btn, app) {\n\t\tif (appInfoList[app] === undefined) {\n\t\t\tcheckUpdate(btn, app);\n\t\t} else {\n\t\t\tdoUpdate(btn, app);\n\t\t}\n\t}\n\n\tfunction checkUpdate(btn, app) {\n\t\tbtn.disabled = true;\n\t\tbtn.value = inProgressText;\n\n\t\taddPageNotice();\n\n\t\tvar ckeckDetailElm = document.getElementById(btn.id + '-detail');\n\t\tif (ckeckDetailElm) {\n\t\t\tckeckDetailElm.textContent = \"\";\n\t\t}\n\t\tXHR.get('<%=api.url(\"check_\")%>' + app, {\n\t\t\ttoken: tokenStr,\n\t\t\tarch: ''\n\t\t}, function (x, json) {\n\t\t\tremovePageNotice();\n\t\t\tif (json.code) {\n\t\t\t\tappInfoList[app] = undefined;\n\t\t\t\tonRequestError(btn, json.error);\n\t\t\t} else {\n\t\t\t\tappInfoList[app] = json;\n\t\t\t\tif (json.has_update) {\n\t\t\t\t\tbtn.disabled = false;\n\t\t\t\t\tbtn.value = clickToUpdateText;\n\t\t\t\t\tbtn.placeholder = clickToUpdateText;\n\n\t\t\t\t\tif (ckeckDetailElm) {\n\t\t\t\t\t\tvar urlNode = '';\n\t\t\t\t\t\tif (json.remote_version) {\n\t\t\t\t\t\t\turlNode = '<em style=\"color:red;\">' + json.remote_version + '</em>';\n\t\t\t\t\t\t\tif (json.html_url) {\n\t\t\t\t\t\t\t\turlNode = '<a href=\"' + json.html_url + '\" target=\"_blank\">' + urlNode + '</a>';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tckeckDetailElm.innerHTML = urlNode;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tbtn.disabled = true;\n\t\t\t\t\tbtn.value = noUpdateText;\n\t\t\t\t\tvar forceBtn = document.getElementById('_' + app + '-force_btn');\n\t\t\t\t\tif (forceBtn) {\n\t\t\t\t\t\tforceBtn.style.display = \"inline\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, 300);\n\t}\n\n\tfunction doUpdate(btn, app) {\n\t\tbtn.disabled = true;\n\t\tbtn.value = downloadingText;\n\n\t\taddPageNotice();\n\n\t\tvar appUpdateUrl = '<%=api.url(\"update_\")%>' + app;\n\t\tvar appInfo = appInfoList[app];\n\t\t// Download file\n\t\tXHR.get(appUpdateUrl, {\n\t\t\ttoken: tokenStr,\n\t\t\turl: appInfo ? appInfo.data.browser_download_url : '',\n\t\t\tsize: appInfo ? appInfo.data.size / 1024 : null\n\t\t}, function (x, json) {\n\t\t\tif (json.code) {\n\t\t\t\tremovePageNotice();\n\t\t\t\tonRequestError(btn, json.error);\n\t\t\t} else if (json.zip) {\n\t\t\t\tbtn.value = decompressioningText;\n\n\t\t\t\t// Extract file\n\t\t\t\tXHR.get(appUpdateUrl, {\n\t\t\t\t\ttoken: tokenStr,\n\t\t\t\t\ttask: 'extract',\n\t\t\t\t\tfile: json.file,\n\t\t\t\t\tsubfix: appInfo ? appInfo.type : ''\n\t\t\t\t}, function (x, json) {\n\t\t\t\t\tif (json.code) {\n\t\t\t\t\t\tremovePageNotice();\n\t\t\t\t\t\tonRequestError(btn, json.error);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmove(btn, appUpdateUrl, json.file);\n\t\t\t\t\t}\n\t\t\t\t}, 300)\n\t\t\t} else {\n\t\t\t\tmove(btn, appUpdateUrl, json.file);\n\t\t\t}\n\t\t}, 300)\n\t}\n\n\tfunction move(btn, url, file) {\n\t\tbtn.value = movingText;\n\n\t\t// Move file to target dir\n\t\tXHR.get(url, {\n\t\t\ttoken: tokenStr,\n\t\t\ttask: 'move',\n\t\t\tfile: file\n\t\t}, function (x, json) {\n\t\t\tremovePageNotice();\n\t\t\tif (json.code) {\n\t\t\t\tonRequestError(btn, json.error);\n\t\t\t} else {\n\t\t\t\tonUpdateSuccess(btn);\n\t\t\t}\n\t\t}, 300)\n\t}\n//]]>\n</script>\n\n<div class=\"cbi-value\">\n\t<label class=\"cbi-value-title\">Passwall <%:Version%></label>\n\t<div class=\"cbi-value-field\">\n\t\t<!--div class=\"cbi-value-description\"-->\n\t\t\t<span>【 <%=api.get_version()%> 】</span>\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" id=\"passwall-check_btn\"\n\t\t\t\tonclick=\"onBtnClick(this,'passwall');\" value=\"<%:Check update%>\" />\n\t\t\t<span id=\"passwall-check_btn-detail\"></span>\n\t\t<!--/div-->\n\t</div>\n</div>\n\n<%for _, k in ipairs(com.order) do\n\tlocal v = com[k]\n\tversion[k] = api.get_app_version(k)%>\n<div class=\"cbi-value\">\n\t<label class=\"cbi-value-title\"><%=v.name%>\n\t\t<%:Version%>\n\t</label>\n\t<div class=\"cbi-value-field\">\n\t\t<!--div class=\"cbi-value-description\"-->\n\t\t\t<span>【 <%=version[k] ~=\"\" and version[k] or translate(\"Null\") %> 】</span>\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" id=\"_<%=k%>-check_btn\"\n\t\t\t\tonclick=\"onBtnClick(this,'<%=k%>');\" value=\"<%:Check update%>\" />\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" id=\"_<%=k%>-force_btn\"\n\t\t\t\tonclick=\"doUpdate(this,'<%=k%>');\" value=\"<%:Force update%>\" style=\"display:none\"/>\n\t\t\t<span id=\"_<%=k%>-check_btn-detail\"></span>\n\t\t<!--/div-->\n\t</div>\n</div>\n<%end%>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/cbi/hidevalue.htm",
    "content": "<div id=\"cbi-<%=self.config..\"-\"..section..\"-\"..self.option%>\" data-index=\"<%=self.index%>\" data-depends=\"<%=pcdata(self:deplist2json(section))%>\" style=\"display: none !important\">\n\t<input type=\"hidden\" id=\"<%=cbid%>\" name=\"<%=cbid%>\" value=\"<%=pcdata(self:cfgvalue(section) or self.default or \"\")%>\" />\n</div>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/cbi/nodes_dynamiclist.htm",
    "content": "<%+cbi/valueheader%>\n<%\n--\tTemplate Developers:\n--\t\t- lwb1978\n--\t\t- snowie2000\n--\tCopyright: copyright(c)2025–2027\n--\tDescription: Passwall(2) UI template\n\nlocal json = require \"luci.jsonc\"\n\n-- 读取值（keylist/vallist/group）\nlocal values = {}\nfor i, key in pairs(self.keylist) do\n\tvalues[#values + 1] = {\n\t\tkey = key,\n\t\tlabel = self.vallist[i] or key,\n\t\tgroup = self.group and self.group[i] or nil\n\t}\nend\n\n-- 获取当前配置值\nlocal current_key = {}\nlocal cval = self:cfgvalue(section)\nif type(cval) == \"table\" then\n\tfor _, v in ipairs(cval) do\n\t\tfor item in string.gmatch(v, \"[^,]+\") do\n\t\t\tcurrent_key[#current_key+1] = item\n\t\tend\n\tend\nelseif type(cval) == \"string\" then\n\tfor item in string.gmatch(cval, \"[^,]+\") do\n\t\tcurrent_key[#current_key+1] = item\n\tend\nend\n\n-- 分离无组节点（ungrouped）与有组节点（grouped），并保持原有顺序\nlocal ungrouped = {}\nlocal groups = {}\nlocal group_order = {}\nfor _, item in ipairs(values) do\n\tif not item.group or item.group == \"\" then\n\t\ttable.insert(ungrouped, item)\n\telse\n\t\tlocal g = item.group\n\t\tif not groups[g] then\n\t\t\tgroups[g] = {}\n\t\t\ttable.insert(group_order, g)\n\t\tend\n\t\ttable.insert(groups[g], item)\n\tend\nend\n\n-- 打包数据给 JS\nlocal dropdown_data = {\n\tcurrent_key = current_key,\n\tungrouped = ungrouped,\n\tgroups = groups,\n\tgroup_order = group_order,\n\tcbid = cbid,\n}\n%>\n<script>\nwindow.dl_dropdown_data = window.dl_dropdown_data || {};\nwindow.dl_dropdown_data[\"<%=cbid%>\"] = <%=json.stringify(dropdown_data)%>;\n</script>\n\n<div id=\"<%=cbid%>.main\" class=\"dl-dropdown-container\">\n\t<select id=\"<%=cbid%>.ref\" class=\"cbi-input-select\" style=\"display:none !important;\">\n\t\t<option value>placeholder</option>\n\t</select>\n\n\t<!-- 已选节点显示区 -->\n\t<div id=\"<%=cbid%>.selected\" class=\"dl-selected-list\"></div>\n\n\t<!-- 模拟 listvalue 控件外观 -->\n\t<div class=\"cbi-input-value cbi-input-select dl-dropdown-display\" id=\"<%=cbid%>.display\" tabindex=\"0\">\n\t\t<span id=\"<%=cbid%>.label\" class=\"dl-dropdown-label\">\n\t\t\t<%=translate(\"-- Please choose --\")%>\n\t\t</span>\n\t\t<span class=\"dl-arrow-down\"></span>\n\t</div>\n\t<!-- 下拉面板 -->\n\t<div id=\"<%=cbid%>.panel\" class=\"cbi-dynamiclist-panel dl-dropdown-panel\" style=\"display:none;\">\n\t\t<!-- 搜索框 -->\n\t\t<div style=\"padding:8px;border-bottom:1px solid #f0f0f0;\">\n\t\t\t<input id=\"<%=cbid%>.search\" class=\"cbi-input-text dl-dropdown-search\" type=\"text\" placeholder=\"🔍 <%:Search nodes...%>\" inputmode=\"search\" enterkeyhint=\"done\" />\n\t\t</div>\n\t\t<!-- 列表容器 -->\n\t\t<div id=\"<%=cbid%>.list\" style=\"padding:8px;\">\n\t\t\t<!-- 首次点击 display 时由 JS 填充 -->\n\t\t</div>\n\t</div>\n</div>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n(function(){\n\tconst cbid = \"<%=cbid%>\";\n\tconst panel = document.getElementById(cbid + \".panel\");\n\tconst display = document.getElementById(cbid + \".display\");\n\tconst labelSpan = document.getElementById(cbid + \".label\");\n\tconst searchInput = document.getElementById(cbid + \".search\");\n\tconst listContainer = document.getElementById(cbid + \".list\");\n\n\tfunction init(){\n\t\tconst hidden = document.getElementById(cbid + \".hidden\");\n\t\tconst data = window.dl_dropdown_data[cbid];\n\t\tlet arr = data.current_key;\n\t\tif (!arr || arr.length === 0) return;\n\t\tarr.forEach(key=>{\n\t\t\tlet label = \"\";\n\t\t\tdata.ungrouped.concat(...Object.values(data.groups)).forEach(v=>{\n\t\t\t\tif (v.key == key) label = v.label;\n\t\t\t});\n\t\t\tif (label)\n\t\t\t\tdl_add_item(cbid, key, label);\n\t\t});\n\t}\n\n\t// 点击 display\n\tdisplay.addEventListener(\"click\", function(e){\n\t\te.stopPropagation();\n\t\tdl_render_dropdown_list(cbid,panel,listContainer,labelSpan,searchInput,display);\n\t\tdocument.querySelectorAll(\".cbi-dynamiclist-panel\").forEach(p=>{\n\t\t\tif (p !== panel) p.style.display = \"none\";\n\t\t});\n\t\tif (panel.style.display !== \"none\") {\n\t\t\tdl_closePanel(cbid,panel,listContainer,searchInput);\n\t\t} else {\n\t\t\tdl_openPanel(cbid,display,panel,listContainer,searchInput);\n\t\t}\n\t});\n\n\tdl_registerAdaptive(cbid);\n\n\tinit();\n\n\tnew Sortable(document.getElementById(cbid + \".selected\"), {\n\t\tanimation: 150,\n\t\tghostClass: \"dragging-row\",\n\t\tonEnd: function(){\n\t\t\tdl_update_hidden(cbid);\n\t\t}\n\t});\n})();\n//]]>\n</script>\n\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/cbi/nodes_dynamiclist_com.htm",
    "content": "<%\n--\tTemplate Developers:\n--\t\t- lwb1978\n--\t\t- snowie2000\n--\tCopyright: copyright(c)2025–2027\n--\tDescription: Passwall(2) UI template\n-- It is the common part of the template and cannot be used independently\n%>\n<script src=\"<%=resource%>/view/passwall/Sortable.min.js\"></script>\n<style>\n/* 主下拉按钮的下箭头 */\n.dl-arrow-down {\n\twidth: 0;\n\theight: 0;\n\tborder-left: 5px solid transparent;\n\tborder-right: 5px solid transparent;\n\tborder-top: 6px solid #666;\n\tmargin-left: 6px;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 组标题的右箭头（折叠） */\n.dl-arrow-right {\n\twidth: 0;\n\theight: 0;\n\tborder-top: 4px solid transparent;\n\tborder-bottom: 4px solid transparent;\n\tborder-left: 5px solid #555;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 组标题的下箭头（展开） */\n.dl-arrow-down-small {\n\twidth: 0;\n\theight: 0;\n\tborder-left: 4px solid transparent;\n\tborder-right: 4px solid transparent;\n\tborder-top: 5px solid #555;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 基础列表项样式 */\n.cbi-dynamiclist-panel li[data-key] {\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tcursor: pointer;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\ttransition: background-color 0.15s ease;\n}\n/* 鼠标悬停效果 - 使用透明度避免覆盖问题 */\n.cbi-dynamiclist-panel li[data-key]:hover {\n\tbackground-color: rgba(0, 123, 255, 0.1);\n}\n\n.dl-dropdown-container {\n\tdisplay: inline-block;\n\tposition: relative;\n\tmin-width: 220px;\n\twhite-space: nowrap;\n}\n@media (max-width: 1152px) {\n\t.dl-dropdown-container {\n\t\twhite-space: normal;\n\t}\n}\n@media (max-width: 600px) {\n\t.dl-dropdown-container {\n\t\tdisplay: block;\n\t\twhite-space: normal;\n\t}\n}\n\n.dl-dropdown-display {\n\tcursor: pointer;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tbox-sizing: border-box;\n}\n.dl-dropdown-label,\n.dl-selected-label {\n\tdisplay: inline-block;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\twidth: 100%;\n\ttext-align: left;\n}\n.dl-dropdown-panel {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tz-index: 2147483647;\n\tborder: 1px solid #dcdcdc;\n\tborder-radius: 4px;\n\tbox-shadow: 0 6px 18px rgba(0,0,0,0.08);\n\tmax-height: 50vh;\n\toverflow: auto;\n\toverscroll-behavior: contain;\n}\n.dl-dropdown-search {\n\twidth: 100%;\n\tmax-width: 100% !important;\n\tmin-width: 0 !important;\n\tbox-sizing: border-box;\n\tpadding: 6px;\n\tborder: 1px solid #e0e0e0;\n\tborder-radius: 4px;\n}\n.dl-group-title {\n\tcursor: pointer;\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tdisplay: flex;\n\talign-items: center;\n\tline-height: normal;\n\twhite-space: nowrap;\n}\n.dl-group-list {\n\tlist-style: none;\n\tmargin: 6px 0 0 8px;\n\tpadding: 0;\n}\n.dl-group-item {\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tcursor: pointer;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\ttext-align: left !important;\n}\n.dl-selected-list {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 5px;\n}\n.dl-remove {\n\tmargin-left: 8px;\n\tcursor: pointer;\n\tcolor: red;\n}\n.dragging-row {\n\tbackground-color: rgba(131, 191, 255, 0.7) !important;\n\tbox-shadow: 0 4px 6px rgba(0,0,0,0.1);\n}\n</style>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n\t// css helper functions\n\tfunction dl_camelToKebab(str) {\n\t\treturn str.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2').toLowerCase()\n\t}\n\n\tfunction dl_style2Css(styleDeclaration, properties) {\n\t\tconst cssRules = properties.map(prop => {\n\t\t\tconst kebabCaseProp = dl_camelToKebab(prop);[1, 5]\n\t\t\tconst value = styleDeclaration[prop]\n\t\t\tif (value) {\n\t\t\t\treturn `${kebabCaseProp}: ${value};`\n\t\t\t}\n\t\t\treturn ''\n\t\t})\n\t\t// Filter out any empty strings and join the rules\n\t\treturn cssRules.filter(Boolean).join(' ')\n\t}\n\n\tconst dl_parseColorToRgba = (function() {\n\t\t// Create canvas and context once (Closure)\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = 1;\n\t\tcanvas.height = 1;\n\t\tconst ctx = canvas.getContext('2d', { willReadFrequently: true });\n\t\treturn function(colorStr) {\n\t\t\tif (!colorStr)\n\t\t\t   return null;\n\t\t\tctx.clearRect(0, 0, 1, 1);\n\t\t\t// 2. Apply the color\n\t\t\tctx.fillStyle = colorStr;\n\t\t\t// 3. Fill a single pixel\n\t\t\tctx.fillRect(0, 0, 1, 1);\n\t\t\t// 4. Extract pixel data [R, G, B, A]\n\t\t\tconst data = ctx.getImageData(0, 0, 1, 1).data;\n\t\t\treturn {\n\t\t\t\tr: data[0],\n\t\t\t\tg: data[1],\n\t\t\t\tb: data[2],\n\t\t\t\t// Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places)\n\t\t\t\ta: Math.round((data[3] / 255) * 1000) / 1000\n\t\t\t};\n\t\t};\n\t})();\n\n\t// Helper to convert back to Hex (for output consistency)\n\tfunction dl_rgbToHex(r, g, b) {\n\t\tconst toHex = (n) => {\n\t\t\tconst hex = Math.max(0, Math.min(255, n)).toString(16)\n\t\t\treturn hex.length === 1 ? '0' + hex : hex\n\t\t}\n\t\treturn `#${toHex(r)}${toHex(g)}${toHex(b)}`\n\t}\n\n\tfunction dl_isTransparent(color) {\n\t\tconst cleanColor = dl_parseColorToRgba(color);\n\t\t// check #RRGGBBAA for transparency\n\t\treturn !cleanColor || (cleanColor.a !== undefined && !cleanColor.a);\n\t}\n\n\tfunction dl_getColorSchema(color) {\n\t\tconst rgb = dl_parseColorToRgba(color);\n\t\tif (!rgb) return 'unknown'; // Handle invalid colors\n\t\t// Calculate YIQ brightness (human eye perception)\n\t\tconst brightness = ((rgb.r * 299) + (rgb.g * 587) + (rgb.b * 114)) / 1000;\n\t\t\n\t\treturn brightness > 128 ? 'light' : 'dark';\n\t}\n\n\tfunction dl_lighter(color, amount) {\n\t\tconst rgb = dl_parseColorToRgba(color);\n\t\tif (!rgb) return color;\n\t\t// Add amount to each channel\n\t\tconst r = rgb.r + amount;\n\t\tconst g = rgb.g + amount;\n\t\tconst b = rgb.b + amount;\n\t\t// Convert back to Hex (clamping happens inside rgbToHex)\n\t\treturn dl_rgbToHex(r, g, b);\n\t}\n\n\tfunction dl_darker(color, amount) {\n\t\tconst rgb = dl_parseColorToRgba(color);\n\t\tif (!rgb) return color;\n\t\t// Subtract amount from each channel\n\t\tconst r = rgb.r - amount;\n\t\tconst g = rgb.g - amount;\n\t\tconst b = rgb.b - amount;\n\n\t\treturn dl_rgbToHex(r, g, b);\n\t}\n\n\t// copy select styles\n\tfunction dl_adaptiveStyle(cbid) {\n\t\tconst display = document.getElementById(cbid + \".display\");\n\t\tconst hiddenRef = document.getElementById(cbid + \".ref\");\n\t\tconst panel = document.getElementById(cbid + \".panel\");\n\t\tif (hiddenRef && display) {\n\t\t\tconst elOption = hiddenRef.getElementsByTagName(\"option\")[0]\n\t\t\tconst styleSelect = window.getComputedStyle(hiddenRef)\n\t\t\tconst styleOption = window.getComputedStyle(elOption)\n\t\t\tconst styleBody = window.getComputedStyle(document.body)\n\n\t\t\tconst styleNode = document.createElement('style')\n\t\t\tconst styleNames = [\"width\", \"color\", \"height\", \"padding\", \"margin\", \"lineHeight\", \"border\", \"borderRadius\", \"minWidth\", \"minHeight\"]\n\t\t\tif (styleSelect.borderBottomStyle !== \"none\") {\n\t\t\t\tstyleNames.push(\"borderBottomWidth\", \"borderBottomStyle\", \"borderBottomColor\");\n\t\t\t}\n\t\t\tdocument.head.appendChild(styleNode)\n\t\t\t// trace back from option -> select -> body for background color\n\t\t\tconst panelRadius = styleSelect.borderRadius;\n\t\t\tconst optionColor = !dl_isTransparent(styleOption.backgroundColor) ? styleOption.backgroundColor : !dl_isTransparent(styleSelect.backgroundColor) ? styleSelect.backgroundColor : styleBody.backgroundColor\n\t\t\tconst titleColor = dl_getColorSchema(optionColor) === \"light\" ? dl_darker(optionColor, 30) : dl_lighter(optionColor, 30)\n\t\t\tconst selectStyleCSS = [`#${CSS.escape(cbid + \".display\")}, .dl-selected-item {`, dl_style2Css(styleSelect, styleNames), dl_style2Css(styleSelect, [\"backgroundColor\"]), \"}\"]\n\t\t\tconst optionStyleCSS = [`#${CSS.escape(cbid + \".panel\")}  {`, dl_style2Css(styleOption, styleNames), `background-color: ${optionColor};`, `border-radius: ${panelRadius};`, \"}\"]\n\t\t\tconst titleStyleCSS = [`#${CSS.escape(cbid + \".panel\")} .dl-group-title  {`, `background-color: ${titleColor} !important;`, \"}\"]\n\t\t\tstyleNode.textContent = [].concat(selectStyleCSS, optionStyleCSS, titleStyleCSS).join(\"\\n\")\n\t\t}\n\t}\n\n\tfunction dl_idSafe(id) {\n\t\treturn id\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, \"-\")\n\t\t\t.replace(/[\\x00-\\x1F\\x7F]/g, \"\");\n\t}\n\n\t// 更新组内选中计数\n\tfunction dl_updateGroupCounts(cbid, listContainer, searchInput) {\n\t\tconst groups = listContainer.querySelectorAll(\".dl-group\");\n\t\tconst isSearching = searchInput.value.trim() !== \"\";\n\t\tgroups.forEach(group => {\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst items = group.querySelectorAll(\"li[data-key]\");\n\t\t\tconst span = document.getElementById(\"group-count-\" + cbid + \"-\" + gname);\n\t\t\tif (!span) return;\n\t\t\tif (isSearching) {\n\t\t\t\t// 搜索状态：显示匹配数量\n\t\t\t\tlet matchCount = 0;\n\t\t\t\titems.forEach(li => {\n\t\t\t\t\tif (li.style.display !== \"none\") matchCount++;\n\t\t\t\t});\n\t\t\t\tspan.textContent = \"(\" + matchCount + \"/\" + items.length + \")\";\n\t\t\t\tif (matchCount > 0) {\n\t\t\t\t\tspan.style.color = \"#28a745\";\n\t\t\t\t\tspan.style.fontWeight = \"600\";\n\t\t\t\t} else {\n\t\t\t\t\tspan.style.color = \"#dc3545\";\n\t\t\t\t\tspan.style.fontWeight = \"normal\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// 默认状态\n\t\t\t\tspan.textContent = \"(\" + items.length + \")\";\n\t\t\t\tspan.style.color = \"\";\n\t\t\t\tspan.style.fontWeight = \"normal\";\n\t\t\t}\n\t\t});\n\t}\n\n\t//搜索过滤器：按 name 或 label 做模糊匹配，搜索时自动展开所有组并隐藏不匹配条目\n\tfunction dl_filterList(keyword, cbid, listContainer, searchInput) {\n\t\tkeyword = (keyword || \"\").toLowerCase().trim();\n\t\tconst topItems = listContainer.querySelectorAll(\"ul li[data-key]\");\n\t\ttopItems.forEach(li=>{\n\t\t\tconst name = (li.getAttribute(\"data-node-name\") || \"\").toLowerCase();\n\t\t\tif (!keyword || name.indexOf(keyword) !== -1) {\n\t\t\t\tli.style.display = \"block\";\n\t\t\t} else {\n\t\t\t\tli.style.display = \"none\";\n\t\t\t}\n\t\t});\n\t\tconst groups = listContainer.querySelectorAll(\".dl-group\");\n\t\tgroups.forEach(group=>{\n\t\t\tconst items = group.querySelectorAll(\"li[data-key]\");\n\t\t\tlet matchCount = 0;\n\t\t\titems.forEach(li=>{\n\t\t\t\tconst name = (li.getAttribute(\"data-node-name\") || \"\").toLowerCase();\n\t\t\t\tif (!keyword || name.indexOf(keyword) !== -1) {\n\t\t\t\t\tli.style.display = \"block\";\n\t\t\t\t\tmatchCount++;\n\t\t\t\t} else {\n\t\t\t\t\tli.style.display = \"none\";\n\t\t\t\t}\n\t\t\t});\n\t\t\tgroup.style.display = (matchCount === 0 && keyword !== \"\") ? \"none\" : \"block\";\n\t\t\tconst ul = group.querySelector(\".dl-group-list\");\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst arrow = document.getElementById(\"arrow-\" + cbid + \"-\" + gname);\n\t\t\tif (keyword) {\n\t\t\t\tif (ul) ul.style.display = (matchCount > 0 ? \"block\" : \"none\");\n\t\t\t\tif (arrow) arrow.className = (matchCount > 0 ? \"dl-arrow-down-small\" : \"dl-arrow-right\");\n\t\t\t} else {\n\t\t\t\tif (ul) ul.style.display = \"none\";\n\t\t\t\tif (arrow) arrow.className = \"dl-arrow-right\";\n\t\t\t}\n\t\t});\n\t\tdl_updateGroupCounts(cbid, listContainer, searchInput);\n\t}\n\n\t// 切换单个组（点击组标题）\n\tfunction dl_toggleGroup(listContainer, cbid, g) {\n\t\tg = dl_idSafe(g);\n\t\tconst group = listContainer.querySelector(\".dl-group[data-group='\" + g + \"']\");\n\t\tif (!group) return;\n\t\tconst ul = group.querySelector(\".dl-group-list\");\n\t\tconst arrow = document.getElementById(\"arrow-\" + cbid + \"-\" + g);\n\t\tif (!ul) return;\n\t\tconst searchInput = document.getElementById(cbid + \".search\");\n\t\tconst isSearching = searchInput?.value.trim() !== \"\";\n\t\tconst isExpanded = ul.style.display !== \"none\";\n\n\t\tif (isExpanded) {\n\t\t\tul.style.display = \"none\";\n\t\t\tif (arrow) arrow.className = \"dl-arrow-right\";\n\t\t} else {\n\t\t\tul.style.display = \"block\";\n\t\t\tif (arrow) arrow.className = \"dl-arrow-down-small\";\n\n\t\t\tif (!isSearching) {\n\t\t\t\tconst allGroups = listContainer.querySelectorAll(\".dl-group\");\n\t\t\t\tallGroups.forEach(otherGroup => {\n\t\t\t\t\tif (otherGroup !== group) {\n\t\t\t\t\t\tconst otherUl = otherGroup.querySelector(\".dl-group-list\");\n\t\t\t\t\t\tconst otherGname = otherGroup.getAttribute(\"data-group\");\n\t\t\t\t\t\tconst otherArrow = document.getElementById(\"arrow-\" + cbid + \"-\" + otherGname);\n\t\t\t\t\t\tif (otherUl) otherUl.style.display = \"none\";\n\t\t\t\t\t\tif (otherArrow) otherArrow.className = \"dl-arrow-right\";\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// 计算panel位置\n\tfunction dl_repositionPanel(panel, display) {\n\t\tif (!panel || panel.style.display === \"none\") return;\n\t\tconst rect = display.getBoundingClientRect();\n\t\tconst viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n\t\tpanel.style.visibility = \"hidden\";\n\t\tpanel.style.display = \"block\";\n\t\tpanel.style.minHeight = \"100px\";\n\t\tpanel.style.maxHeight = Math.min(0.5*viewportHeight, 550) + \"px\";\n\t\tconst panelHeight = panel.offsetHeight;\n\t\tconst spaceBelow = viewportHeight - rect.bottom;\n\t\tconst spaceAbove = rect.top;\n\t\tlet top, isUp = false;\n\t\tif (spaceBelow >= panelHeight) {\n\t\t\ttop = rect.bottom + 2;\n\t\t\tisUp = false;\n\t\t} else if (spaceAbove >= panelHeight) {\n\t\t\ttop = rect.top - panelHeight - 2;\n\t\t\tisUp = true;\n\t\t} else {\n\t\t\tif (spaceBelow >= spaceAbove) {\n\t\t\t\ttop = Math.max(rect.bottom - 2, viewportHeight - panelHeight - 2);\n\t\t\t\tisUp = false;\n\t\t\t} else {\n\t\t\t\ttop = Math.min(rect.top - panelHeight + 2, 2);\n\t\t\t\tisUp = true;\n\t\t\t}\n\t\t}\n\t\tpanel.style.left = rect.left + \"px\";\n\t\tpanel.style.top = top + \"px\";\n\t\tconst panelRect = panel.getBoundingClientRect();\n\t\tconst displayWidth = rect.width;\n\t\tconst remainingWidth = window.innerWidth - panelRect.left - 12;\n\t\tconst maxWidth = Math.max(displayWidth, Math.floor(remainingWidth));\n\t\tpanel.style.maxWidth = maxWidth + \"px\";\n\t\tpanel.style.minWidth = displayWidth + \"px\";\n\t\tpanel.style.width = \"auto\";\n\t\tpanel.style.visibility = \"\";\n\t}\n\n\t// 打开/关闭面板\n\tfunction dl_openPanel(cbid, display, panel, listContainer, searchInput) {\n\t\tif (!panel._moved) {\n\t\t\tdocument.body.appendChild(panel);\n\t\t\tpanel._moved = true;\n\t\t}\n\t\tpanel.style.display = \"block\";\n\t\tdl_repositionPanel(panel, display);\n\t\t// 失焦监听\n\t\tconst handler = function(e){\n\t\t\tconst target = e.target;\n\t\t\tif (panel.style.display !== \"none\") {\n\t\t\t\tif (!panel.contains(target) && !display.contains(target)) {\n\t\t\t\t\tdl_closePanel(cbid, panel, listContainer, searchInput, display);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tpanel._docClickHandler = handler;\n\t\tdocument.addEventListener(\"click\", handler);\n\t\t// 滚动 / resize 自动 reposition\n\t\tlet ticking = false;\n\t\tconst repositionHandler = function () {\n\t\t\tif (ticking) return;\n\t\t\tticking = true;\n\t\t\trequestAnimationFrame(function () {\n\t\t\t\tticking = false;\n\t\t\t\tdl_repositionPanel(panel, display);\n\t\t\t});\n\t\t};\n\t\tpanel._repositionHandler = repositionHandler;\n\t\twindow.addEventListener(\"scroll\", repositionHandler, true);\n\t\twindow.addEventListener(\"resize\", repositionHandler);\n\t}\n\tfunction dl_closePanel(cbid, panel, listContainer, searchInput) {\n\t\tpanel.style.display = \"none\";\n\t\tsearchInput.value = \"\";\n\t\tdl_filterList(\"\", cbid, listContainer, searchInput);\n\t\t// document click\n\t\tif (panel._docClickHandler) {\n\t\t\tdocument.removeEventListener(\"click\", panel._docClickHandler);\n\t\t\tpanel._docClickHandler = null;\n\t\t}\n\t\t// scroll / resize\n\t\tif (panel._repositionHandler) {\n\t\t\twindow.removeEventListener(\"scroll\", panel._repositionHandler, true);\n\t\t\twindow.removeEventListener(\"resize\", panel._repositionHandler);\n\t\t\tpanel._repositionHandler = null;\n\t\t}\n\t}\n\n\tfunction dl_add_item(cbid, key, label) {\n\t\tconst container = document.getElementById(cbid + \".selected\");\n\t\tconst hidden = document.getElementById(cbid + \".hidden\");\n\t\tif (container.querySelector(`[data-key=\"${key}\"]`)) return;\n\t\tconst item = document.createElement(\"div\");\n\t\titem.className = \"cbi-input-value cbi-input-select dl-dropdown-display dl-selected-item\";\n\t\titem.setAttribute(\"data-key\", key);\n\t\titem.innerHTML = `\n\t\t\t<span class=\"dl-selected-label\" style=\"cursor:grab;\" title=\"${label}\">${label}</span>\n\t\t\t<span class=\"dl-remove\">×</span>\n\t\t`;\n\t\titem.querySelector(\".dl-remove\").onclick = function(){\n\t\t\titem.remove();\n\t\t\tdl_update_hidden(cbid);\n\t\t};\n\t\tcontainer.appendChild(item);\n\t\tdl_update_hidden(cbid);\n\t}\n\n\tfunction dl_update_hidden(cbid) {\n\t\tconst main = document.getElementById(cbid + \".main\");\n\t\tconst container = document.getElementById(cbid + \".selected\");\n\t\tmain.querySelectorAll(`input[type=\"hidden\"][name=\"${cbid}\"]`).forEach(el => el.remove());\n\t\tlet items = container.querySelectorAll(\".dl-selected-item\");\n\t\titems.forEach(el => {\n\t\t\tlet key = el.getAttribute(\"data-key\");\n\t\t\tlet input = document.createElement(\"input\");\n\t\t\tinput.type = \"hidden\";\n\t\t\tinput.name = cbid;\n\t\t\tinput.value = key;\n\t\t\tmain.insertBefore(input, container);\n\t\t});\n\t}\n\n\t// 动态生成下拉框\n\twindow.dl_dropdown_rendered = {};\n\tfunction dl_escape_html(s) {\n\t\treturn s.replace(/[&<>\"']/g, c => ({\n\t\t\t\"&\":\"&amp;\", \"<\":\"&lt;\", \">\":\"&gt;\", '\"':\"&quot;\", \"'\":\"&#39;\"\n\t\t}[c]));\n\t}\n\n\tfunction dl_render_dropdown_list(cbid, panel, listContainer, labelSpan, searchInput, display) {\n\t\tif (window.dl_dropdown_rendered[cbid]) return;\n\t\tconst data = window.dl_dropdown_data[cbid];\n\t\tif (!data) return;\n\t\tif (!listContainer) return;\n\n\t\tlet html = \"\";\n\n\t\t// 无组项\n\t\tif (data.ungrouped && data.ungrouped.length > 0) {\n\t\t\thtml += `<ul style=\"list-style:none;padding:0;margin:0 0 8px 0;\">`;\n\n\t\t\tdata.ungrouped.forEach(item => {\n\t\t\t\thtml += `\n\t\t\t\t\t<li data-key=\"${item.key}\"\n\t\t\t\t\t\tdata-node-name=\"${dl_escape_html(item.label.toLowerCase())}\"\n\t\t\t\t\t\tclass=\"list-item\">\n\t\t\t\t\t\t<span class=\"dl-item-label\" style=\"margin-left:12px;\">\n\t\t\t\t\t\t\t${dl_escape_html(item.label)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</li>`;\n\t\t\t});\n\n\t\t\thtml += `</ul>`;\n\t\t}\n\n\t\t// 分组项\n\t\tdata.group_order.forEach(gname => {\n\t\t\tconst items = data.groups[gname];\n\n\t\t\thtml += `\n\t\t\t<div class=\"dl-group\" data-group=\"${dl_idSafe(gname)}\" style=\"margin-bottom:8px;\">\n\t\t\t\t<div class=\"dl-group-title\" data-group-name=\"${dl_idSafe(gname)}\">\n\t\t\t\t\t<span class=\"dl-arrow-right\" id=\"arrow-${cbid}-${dl_idSafe(gname)}\"></span>\n\t\t\t\t\t<b style=\"margin-left:6px;\">${dl_escape_html(gname)}</b>\n\t\t\t\t\t<span id=\"group-count-${cbid}-${dl_idSafe(gname)}\"\n\t\t\t\t\t\tstyle=\"margin-left:8px;\">(${items.length})</span>\n\t\t\t\t</div>\n\t\t\t\t<ul id=\"group-${cbid}-${dl_idSafe(gname)}\" class=\"dl-group-list\" style=\"display:none\">\n\t\t\t`;\n\n\t\t\titems.forEach(item => {\n\t\t\t\thtml += `\n\t\t\t\t<li data-key=\"${item.key}\"\n\t\t\t\t\tdata-node-name=\"${dl_escape_html(item.label.toLowerCase())}\"\n\t\t\t\t\tclass=\"dl-group-item\">\n\t\t\t\t\t<span class=\"dl-item-label\" title=\"${dl_escape_html(item.label)}\">\n\t\t\t\t\t\t${dl_escape_html(item.label)}\n\t\t\t\t\t</span>\n\t\t\t\t</li>`;\n\t\t\t});\n\n\t\t\thtml += `\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t\t`;\n\t\t});\n\n\t\tlistContainer.innerHTML = html;\n\n\t\twindow.dl_dropdown_rendered[cbid] = true;\n\n\t\tdl_adaptiveStyle(cbid);\n\n\t\t// 点击项（无组与组内项都使用 li[data-key]）\n\t\tlistContainer.addEventListener(\"click\", function(e){\n\t\t\tlet li = e.target;\n\t\t\twhile(li && li !== listContainer && !li.hasAttribute('data-key')) li = li.parentNode;\n\t\t\tif(!li || li === listContainer) return;\n\t\t\tconst key = li.getAttribute('data-key') || \"\";\n\t\t\tconst text = li.querySelector(\".dl-item-label\")?.textContent || li.textContent || key;\n\t\t\t//改值\n\t\t\tdl_add_item(cbid, key, text);\n\t\t\tlabelSpan.innerText = \"<%=translate(\"-- Please choose --\")%>\";\n\t\t\tdl_closePanel(cbid,panel,listContainer,searchInput);\n\t\t});\n\n\t\t// 搜索功能\n\t\tsearchInput.addEventListener(\"input\", function() {\n\t\t\tdl_filterList(this.value, cbid, listContainer, searchInput);\n\t\t\tdl_repositionPanel(panel, display);\n\t\t});\n\t\tsearchInput.addEventListener('keydown', function(e) {\n\t\t\tconst isEnter = e.key === \"Enter\" || e.keyCode === 13;\n\t\t\tif (!isEnter) return;\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tsearchInput.blur();\n\t\t});\n\n\t\t// 切换组\n\t\tlistContainer.querySelectorAll(\".dl-group-title\").forEach(title => {\n\t\t\ttitle.addEventListener(\"click\", function() {\n\t\t\t\tconst g = this.closest(\".dl-group\")?.getAttribute(\"data-group\");\n\t\t\t\tif (g) {\n\t\t\t\t\tdl_toggleGroup(listContainer, cbid, g);\n\t\t\t\t\tdl_repositionPanel(panel, display);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t// 防止 panel 惯性滚动穿透\n\t\tpanel.addEventListener('wheel', function (e) {\n\t\t\tconst deltaY = e.deltaY;\n\t\t\tconst scrollTop = panel.scrollTop;\n\t\t\tconst scrollHeight = panel.scrollHeight;\n\t\t\tconst clientHeight = panel.clientHeight;\n\t\t\tconst isAtTop = scrollTop === 0;\n\t\t\tconst isAtBottom = scrollTop + clientHeight >= scrollHeight;\n\t\t\tif (deltaY < 0 && isAtTop) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (deltaY > 0 && isAtBottom) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.stopPropagation();\n\t\t}, { passive: false });\n\t}\n\n\tconst dl_adaptiveControls = new Set();\n\tfunction dl_registerAdaptive(cbid) {\n\t\tdl_adaptiveControls.add(cbid);\n\t\tdl_adaptiveStyle(cbid);\n\t}\n\tlet dl_adaptiveTicking = false;\n\twindow.addEventListener(\"resize\", () => {\n\t\tif (!dl_adaptiveTicking) {\n\t\t\tdl_adaptiveTicking = true;\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tdl_adaptiveControls.forEach(cbid => {\n\t\t\t\t\tdl_adaptiveStyle(cbid);\n\t\t\t\t});\n\t\t\t\tdl_adaptiveTicking = false;\n\t\t\t});\n\t\t}\n\t});\n//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/cbi/nodes_listvalue.htm",
    "content": "<%+cbi/valueheader%>\n<%\n--\tTemplate Developers:\n--\t\t- lwb1978\n--\t\t- snowie2000\n--\tCopyright: copyright(c)2025–2027\n--\tDescription: Passwall(2) UI template\n\nlocal json = require \"luci.jsonc\"\n\n-- 读取值（keylist/vallist/group）\nlocal values = {}\nfor i, key in pairs(self.keylist) do\n\tvalues[#values + 1] = {\n\t\tkey = key,\n\t\tlabel = self.vallist[i] or key,\n\t\tgroup = self.group and self.group[i] or nil\n\t}\nend\n\n-- 获取当前配置值（单值）\nlocal current_key = nil\nlocal cval = self:cfgvalue(section)\nif type(cval) == \"table\" then\n\t-- 若意外为table，取第一个\n\tfor k,_ in pairs(cval) do\n\t\tcurrent_key = k\n\t\tbreak\n\tend\nelseif type(cval) == \"string\" then\n\tcurrent_key = (cval:match(\"%S+\")) -- 取第一个 token\nend\n\n-- 分离无组节点（ungrouped）与有组节点（grouped），并保持原有顺序\nlocal ungrouped = {}\nlocal groups = {}\nlocal group_order = {}\nfor _, item in ipairs(values) do\n\tif not item.group or item.group == \"\" then\n\t\ttable.insert(ungrouped, item)\n\telse\n\t\tlocal g = item.group\n\t\tif not groups[g] then\n\t\t\tgroups[g] = {}\n\t\t\ttable.insert(group_order, g)\n\t\tend\n\t\ttable.insert(groups[g], item)\n\tend\nend\n\n-- 如果没有配置值，默认取第一个（优先无组第一项，否则第一组第一项）\nif not current_key then\n\tif #ungrouped > 0 then\n\t\tcurrent_key = ungrouped[1].key\n\telse\n\t\t-- 找到 group_order 第一个有节点的项\n\t\tfor _, g in ipairs(group_order) do\n\t\t\tif groups[g] and #groups[g] > 0 then\n\t\t\t\tcurrent_key = groups[g][1].key\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\tend\nend\n\n-- 获取当前 label（用于主控件显示）\nlocal function find_label_by_key(k)\n\tif not k then return \"\" end\n\tfor _, v in ipairs(values) do\n\t\tif v.key == k then return v.label end\n\tend\n\treturn \"\"\nend\nlocal current_label = find_label_by_key(current_key) or \"\"\n\n-- 打包数据给 JS\nlocal dropdown_data = {\n\tcurrent_key = current_key,\n\tcurrent_label = current_label,\n\tungrouped = ungrouped,\n\tgroups = groups,\n\tgroup_order = group_order,\n\tcbid = cbid,\n}\n%>\n<script>\nwindow.lv_dropdown_data = window.lv_dropdown_data || {};\nwindow.lv_dropdown_data[\"<%=cbid%>\"] = <%=json.stringify(dropdown_data)%>;\n</script>\n\n<div id=\"<%=cbid%>.main\" class=\"lv-dropdown-container\">\n\t<!-- 隐藏 select（保存实际配置值） -->\n\t<select id=\"<%=cbid%>\" name=\"<%=cbid%>\" class=\"cbi-input-select\" data-update=\"change\" style=\"display:none !important;\">\n\t\t<option value=\"<%=current_key%>\" selected=\"selected\">placeholder</option>\n\t</select>\n\t<!-- 模拟 ListValue 控件外观 -->\n\t<div class=\"cbi-input-value cbi-input-select lv-dropdown-display\" id=\"<%=cbid%>.display\" tabindex=\"0\">\n\t\t<span id=\"<%=cbid%>.label\" class=\"lv-dropdown-label\" title=\"<%=pcdata(current_label)%>\">\n\t\t\t<%=pcdata(\"(\"..translate(\"Not set\")..\")\")%>\n\t\t</span>\n\t\t<span class=\"lv-arrow-down\"></span>\n\t</div>\n\t<!-- 下拉面板 -->\n\t<div id=\"<%=cbid%>.panel\" class=\"cbi-listvalue-panel lv-dropdown-panel\" style=\"display:none;\">\n\t\t<!-- 搜索框 -->\n\t\t<div style=\"padding:8px;border-bottom:1px solid #f0f0f0;\">\n\t\t\t<input id=\"<%=cbid%>.search\" class=\"cbi-input-text lv-dropdown-search\" type=\"text\" placeholder=\"🔍 <%:Search nodes...%>\" inputmode=\"search\" enterkeyhint=\"done\" />\n\t\t</div>\n\t\t<!-- 列表容器 -->\n\t\t<div id=\"<%=cbid%>.list\" style=\"padding:8px;\">\n\t\t\t<!-- 首次点击 display 时由 JS 填充 -->\n\t\t</div>\n\t</div>\n</div>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n(function(){\n\tconst cbid = \"<%=cbid%>\";\n\tconst hiddenSelect = document.getElementById(cbid);\n\tconst panel = document.getElementById(cbid + \".panel\");\n\tconst display = document.getElementById(cbid + \".display\");\n\tconst labelSpan = document.getElementById(cbid + \".label\");\n\tconst searchInput = document.getElementById(cbid + \".search\");\n\tconst listContainer = document.getElementById(cbid + \".list\");\n\n\t// 点击 display\n\tdisplay.addEventListener(\"click\", function(e){\n\t\te.stopPropagation();\n\t\tlv_render_dropdown_list(cbid,panel,listContainer,hiddenSelect,labelSpan,searchInput,display);\n\t\tdocument.querySelectorAll(\".cbi-listvalue-panel\").forEach(p=>{\n\t\t\tif (p !== panel) p.style.display = \"none\";\n\t\t});\n\t\tif (panel.style.display !== \"none\") {\n\t\t\tlv_closePanel(cbid,panel,listContainer,hiddenSelect,searchInput);\n\t\t} else {\n\t\t\tlv_openPanel(cbid,display,panel,listContainer,hiddenSelect,searchInput);\n\t\t}\n\t});\n\tlv_registerAdaptive(cbid);\n\tsetTimeout(() => {\n\t\tlabelSpan.textContent = lv_ellipsisByWidth(cbid, '<%=pcdata(current_label ~= \"\" and current_label or (\"(\"..translate(\"Not set\")..\")\"))%>');\n\t}, 100);\n})();\n//]]>\n</script>\n\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/cbi/nodes_listvalue_com.htm",
    "content": "<%\n--\tTemplate Developers:\n--\t\t- lwb1978\n--\t\t- snowie2000\n--\tCopyright: copyright(c)2025–2027\n--\tDescription: Passwall(2) UI template\n-- It is the common part of the template and cannot be used independently\n%>\n<style>\n/* 主下拉按钮的下箭头 */\n.lv-arrow-down {\n\twidth: 0;\n\theight: 0;\n\tborder-left: 5px solid transparent;\n\tborder-right: 5px solid transparent;\n\tborder-top: 6px solid #666;\n\tmargin-left: 6px;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 组标题的右箭头（折叠） */\n.lv-arrow-right {\n\twidth: 0;\n\theight: 0;\n\tborder-top: 4px solid transparent;\n\tborder-bottom: 4px solid transparent;\n\tborder-left: 5px solid #555;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 组标题的下箭头（展开） */\n.lv-arrow-down-small {\n\twidth: 0;\n\theight: 0;\n\tborder-left: 4px solid transparent;\n\tborder-right: 4px solid transparent;\n\tborder-top: 5px solid #555;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 基础列表项样式 */\n.cbi-listvalue-panel li[data-key] {\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tcursor: pointer;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\ttransition: background-color 0.15s ease;\n}\n/* 鼠标悬停效果 - 使用透明度避免覆盖问题 */\n.cbi-listvalue-panel li[data-key]:hover {\n\tbackground-color: rgba(0, 123, 255, 0.1);\n}\n/* 选中项样式 - 使用更高优先级 */\n.cbi-listvalue-panel li[data-key].is-selected {\n\tbackground-color: #007bff !important;\n\tcolor: white !important;\n\tfont-weight: 600 !important;\n}\n/* 选中项悬停时保持主色调 */\n.cbi-listvalue-panel li[data-key].is-selected:hover {\n\tbackground-color: #0056b3 !important;\n}\n\n.lv-dropdown-container {\n\tdisplay: inline-block;\n\tposition: relative;\n\tmin-width: 220px;\n\twhite-space: nowrap;\n}\n@media (max-width: 1152px) {\n\t.lv-dropdown-container {\n\t\twhite-space: normal;\n\t}\n}\n@media (max-width: 600px) {\n\t.lv-dropdown-container {\n\t\tdisplay: block;\n\t\twhite-space: normal;\n\t}\n}\n\n.lv-dropdown-display {\n\tcursor: pointer;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tbox-sizing: border-box;\n}\n.lv-dropdown-label {\n\tdisplay: inline-block;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\twidth: 100%;\n\ttext-align: left;\n}\n.lv-dropdown-panel {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tz-index: 2147483647;\n\tborder: 1px solid #dcdcdc;\n\tborder-radius: 4px;\n\tbox-shadow: 0 6px 18px rgba(0,0,0,0.08);\n\tmax-height: 50vh;\n\toverflow: auto;\n\toverscroll-behavior: contain;\n}\n.lv-dropdown-search {\n\twidth: 100%;\n\tmax-width: 100% !important;\n\tmin-width: 0 !important;\n\tbox-sizing: border-box;\n\tpadding: 6px;\n\tborder: 1px solid #e0e0e0;\n\tborder-radius: 4px;\n}\n.lv-group-title {\n\tcursor: pointer;\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tdisplay: flex;\n\talign-items: center;\n\tline-height: normal;\n\twhite-space: nowrap;\n}\n.lv-group-list {\n\tlist-style: none;\n\tmargin: 6px 0 0 8px;\n\tpadding: 0;\n}\n.lv-group-item {\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tcursor: pointer;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\ttext-align: left !important;\n}\n</style>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n\t// css helper functions\n\tfunction lv_camelToKebab(str) {\n\t\treturn str.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2').toLowerCase()\n\t}\n\n\tfunction lv_style2Css(styleDeclaration, properties) {\n\t\tconst cssRules = properties.map(prop => {\n\t\t\tconst kebabCaseProp = lv_camelToKebab(prop);[1, 5]\n\t\t\tconst value = styleDeclaration[prop]\n\t\t\tif (value) {\n\t\t\t\treturn `${kebabCaseProp}: ${value};`\n\t\t\t}\n\t\t\treturn ''\n\t\t})\n\t\t// Filter out any empty strings and join the rules\n\t\treturn cssRules.filter(Boolean).join(' ')\n\t}\n\n\tconst lv_parseColorToRgba = (function() {\n\t\t// Create canvas and context once (Closure)\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = 1;\n\t\tcanvas.height = 1;\n\t\tconst ctx = canvas.getContext('2d', { willReadFrequently: true });\n\t\treturn function(colorStr) {\n\t\t\tif (!colorStr)\n\t\t\t   return null;\n\t\t\tctx.clearRect(0, 0, 1, 1);\n\t\t\t// 2. Apply the color\n\t\t\tctx.fillStyle = colorStr;\n\t\t\t// 3. Fill a single pixel\n\t\t\tctx.fillRect(0, 0, 1, 1);\n\t\t\t// 4. Extract pixel data [R, G, B, A]\n\t\t\tconst data = ctx.getImageData(0, 0, 1, 1).data;\n\t\t\treturn {\n\t\t\t\tr: data[0],\n\t\t\t\tg: data[1],\n\t\t\t\tb: data[2],\n\t\t\t\t// Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places)\n\t\t\t\ta: Math.round((data[3] / 255) * 1000) / 1000\n\t\t\t};\n\t\t};\n\t})();\n\n\t// Helper to convert back to Hex (for output consistency)\n\tfunction lv_rgbToHex(r, g, b) {\n\t\tconst toHex = (n) => {\n\t\t\tconst hex = Math.max(0, Math.min(255, n)).toString(16)\n\t\t\treturn hex.length === 1 ? '0' + hex : hex\n\t\t}\n\t\treturn `#${toHex(r)}${toHex(g)}${toHex(b)}`\n\t}\n\n\tfunction lv_isTransparent(color) {\n\t\tconst cleanColor = lv_parseColorToRgba(color);\n\t\t// check #RRGGBBAA for transparency\n\t\treturn !cleanColor || (cleanColor.a !== undefined && !cleanColor.a);\n\t}\n\n\tfunction lv_getColorSchema(color) {\n\t\tconst rgb = lv_parseColorToRgba(color);\n\t\tif (!rgb) return 'unknown'; // Handle invalid colors\n\t\t// Calculate YIQ brightness (human eye perception)\n\t\tconst brightness = ((rgb.r * 299) + (rgb.g * 587) + (rgb.b * 114)) / 1000;\n\t\t\n\t\treturn brightness > 128 ? 'light' : 'dark';\n\t}\n\n\tfunction lv_lighter(color, amount) {\n\t\tconst rgb = lv_parseColorToRgba(color);\n\t\tif (!rgb) return color;\n\t\t// Add amount to each channel\n\t\tconst r = rgb.r + amount;\n\t\tconst g = rgb.g + amount;\n\t\tconst b = rgb.b + amount;\n\t\t// Convert back to Hex (clamping happens inside rgbToHex)\n\t\treturn lv_rgbToHex(r, g, b);\n\t}\n\n\tfunction lv_darker(color, amount) {\n\t\tconst rgb = lv_parseColorToRgba(color);\n\t\tif (!rgb) return color;\n\t\t// Subtract amount from each channel\n\t\tconst r = rgb.r - amount;\n\t\tconst g = rgb.g - amount;\n\t\tconst b = rgb.b - amount;\n\n\t\treturn lv_rgbToHex(r, g, b);\n\t}\n\n\t// copy select styles\n\tfunction lv_adaptiveStyle(cbid) {\n\t\tconst display = document.getElementById(cbid + \".display\");\n\t\tconst hiddenSelect = document.getElementById(cbid);\n\t\tconst panel = document.getElementById(cbid + \".panel\");\n\t\tif (hiddenSelect && display) {\n\t\t\tconst elOption = hiddenSelect.getElementsByTagName(\"option\")[0]\n\t\t\tconst styleSelect = window.getComputedStyle(hiddenSelect)\n\t\t\tconst styleOption = window.getComputedStyle(elOption)\n\t\t\tconst styleBody = window.getComputedStyle(document.body)\n\n\t\t\tconst styleNode = document.createElement('style')\n\t\t\tconst styleNames = [\"width\", \"color\", \"height\", \"padding\", \"margin\", \"lineHeight\", \"border\", \"borderRadius\", \"minWidth\", \"minHeight\"]\n\t\t\tif (styleSelect.borderBottomStyle !== \"none\") {\n\t\t\t\tstyleNames.push(\"borderBottomWidth\", \"borderBottomStyle\", \"borderBottomColor\");\n\t\t\t}\n\t\t\tdocument.head.appendChild(styleNode)\n\t\t\t// trace back from option -> select -> body for background color\n\t\t\tconst panelRadius = styleSelect.borderRadius;\n\t\t\tconst optionColor = !lv_isTransparent(styleOption.backgroundColor) ? styleOption.backgroundColor : !lv_isTransparent(styleSelect.backgroundColor) ? styleSelect.backgroundColor : styleBody.backgroundColor\n\t\t\tconst titleColor = lv_getColorSchema(optionColor) === \"light\" ? lv_darker(optionColor, 30) : lv_lighter(optionColor, 30)\n\t\t\tconst selectStyleCSS = [`#${CSS.escape(cbid + \".display\")} {`, lv_style2Css(styleSelect, styleNames), lv_style2Css(styleSelect, [\"backgroundColor\"]), \"}\"]\n\t\t\tconst optionStyleCSS = [`#${CSS.escape(cbid + \".panel\")}  {`, lv_style2Css(styleOption, styleNames), `background-color: ${optionColor};`, `border-radius: ${panelRadius};`, \"}\"]\n\t\t\tconst titleStyleCSS = [`#${CSS.escape(cbid + \".panel\")} .lv-group-title  {`, `background-color: ${titleColor} !important;`, \"}\"]\n\t\t\tstyleNode.textContent = [].concat(selectStyleCSS, optionStyleCSS, titleStyleCSS).join(\"\\n\")\n\t\t}\n\t}\n\n\tfunction lv_idSafe(id) {\n\t\treturn id\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, \"-\")\n\t\t\t.replace(/[\\x00-\\x1F\\x7F]/g, \"\");\n\t}\n\n\t// 高亮当前选中的项\n\tfunction lv_highlightSelectedItem(listContainer, hiddenSelect) {\n\t\tconst allItems = listContainer.querySelectorAll(\"li[data-key]\");\n\t\tconst currentKey = hiddenSelect.options[0].value;\n\t\tallItems.forEach(item => {\n\t\t\titem.classList.remove(\"is-selected\");\n\t\t\tif (item.getAttribute('data-key') === currentKey) {\n\t\t\t\titem.classList.add(\"is-selected\");\n\t\t\t}\n\t\t});\n\t}\n\n\t// 更新组内选中计数\n\tfunction lv_updateGroupCounts(cbid, listContainer, hiddenSelect, searchInput) {\n\t\tconst groups = listContainer.querySelectorAll(\".lv-group\");\n\t\tconst currentKey = hiddenSelect.options[0].value;\n\t\tconst isSearching = searchInput.value.trim() !== \"\";\n\t\tgroups.forEach(group => {\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst items = group.querySelectorAll(\"li[data-key]\");\n\t\t\tconst span = document.getElementById(\"group-count-\" + cbid + \"-\" + gname);\n\t\t\tif (!span) return;\n\t\t\tif (isSearching) {\n\t\t\t\t// 搜索状态：显示匹配数量\n\t\t\t\tlet matchCount = 0;\n\t\t\t\titems.forEach(li => {\n\t\t\t\t\tif (li.style.display !== \"none\") matchCount++;\n\t\t\t\t});\n\t\t\t\tspan.textContent = \"(\" + matchCount + \"/\" + items.length + \")\";\n\t\t\t\tif (matchCount > 0) {\n\t\t\t\t\tspan.style.color = \"#28a745\";\n\t\t\t\t\tspan.style.fontWeight = \"600\";\n\t\t\t\t} else {\n\t\t\t\t\tspan.style.color = \"#dc3545\";\n\t\t\t\t\tspan.style.fontWeight = \"normal\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// 默认状态：显示选中项数量\n\t\t\t\tlet selectedCount = 0;\n\t\t\t\titems.forEach(li => {\n\t\t\t\t\tif (li.getAttribute('data-key') === currentKey) {\n\t\t\t\t\t\tselectedCount = 1;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tspan.textContent = \"(\" + selectedCount + \"/\" + items.length + \")\";\n\t\t\t\tif (selectedCount > 0) {\n\t\t\t\t\tspan.style.color = \"#007bff\";\n\t\t\t\t\tspan.style.fontWeight = \"600\";\n\t\t\t\t} else {\n\t\t\t\t\tspan.style.color = \"\";\n\t\t\t\t\tspan.style.fontWeight = \"normal\";\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t//搜索过滤器：按 name 或 label 做模糊匹配，搜索时自动展开所有组并隐藏不匹配条目\n\tfunction lv_filterList(keyword, cbid, listContainer, hiddenSelect, searchInput) {\n\t\tkeyword = (keyword || \"\").toLowerCase().trim();\n\t\tconst topItems = listContainer.querySelectorAll(\"ul li[data-key]\");\n\t\ttopItems.forEach(li=>{\n\t\t\tconst name = (li.getAttribute(\"data-node-name\") || \"\").toLowerCase();\n\t\t\tif (!keyword || name.indexOf(keyword) !== -1) {\n\t\t\t\tli.style.display = \"block\";\n\t\t\t} else {\n\t\t\t\tli.style.display = \"none\";\n\t\t\t}\n\t\t});\n\t\tconst groups = listContainer.querySelectorAll(\".lv-group\");\n\t\tgroups.forEach(group=>{\n\t\t\tconst items = group.querySelectorAll(\"li[data-key]\");\n\t\t\tlet matchCount = 0;\n\t\t\titems.forEach(li=>{\n\t\t\t\tconst name = (li.getAttribute(\"data-node-name\") || \"\").toLowerCase();\n\t\t\t\tif (!keyword || name.indexOf(keyword) !== -1) {\n\t\t\t\t\tli.style.display = \"block\";\n\t\t\t\t\tmatchCount++;\n\t\t\t\t} else {\n\t\t\t\t\tli.style.display = \"none\";\n\t\t\t\t}\n\t\t\t});\n\t\t\tgroup.style.display = (matchCount === 0 && keyword !== \"\") ? \"none\" : \"block\";\n\t\t\tconst ul = group.querySelector(\".lv-group-list\");\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst arrow = document.getElementById(\"arrow-\" + cbid + \"-\" + gname);\n\t\t\tif (keyword) {\n\t\t\t\tif (ul) ul.style.display = (matchCount > 0 ? \"block\" : \"none\");\n\t\t\t\tif (arrow) arrow.className = (matchCount > 0 ? \"lv-arrow-down-small\" : \"lv-arrow-right\");\n\t\t\t} else {\n\t\t\t\tif (ul) ul.style.display = \"none\";\n\t\t\t\tif (arrow) arrow.className = \"lv-arrow-right\";\n\t\t\t}\n\t\t});\n\t\tlv_updateGroupCounts(cbid, listContainer, hiddenSelect, searchInput);\n\t\tlv_highlightSelectedItem(listContainer, hiddenSelect);\n\t}\n\n\t// 切换单个组（点击组标题）\n\tfunction lv_toggleGroup(listContainer, cbid, g) {\n\t\tg = lv_idSafe(g);\n\t\tconst group = listContainer.querySelector(\".lv-group[data-group='\" + g + \"']\");\n\t\tif (!group) return;\n\t\tconst ul = group.querySelector(\".lv-group-list\");\n\t\tconst arrow = document.getElementById(\"arrow-\" + cbid + \"-\" + g);\n\t\tif (!ul) return;\n\t\tconst searchInput = document.getElementById(cbid + \".search\");\n\t\tconst isSearching = searchInput?.value.trim() !== \"\";\n\t\tconst isExpanded = ul.style.display !== \"none\";\n\n\t\tif (isExpanded) {\n\t\t\tul.style.display = \"none\";\n\t\t\tif (arrow) arrow.className = \"lv-arrow-right\";\n\t\t} else {\n\t\t\tul.style.display = \"block\";\n\t\t\tif (arrow) arrow.className = \"lv-arrow-down-small\";\n\n\t\t\tif (!isSearching) {\n\t\t\t\tconst allGroups = listContainer.querySelectorAll(\".lv-group\");\n\t\t\t\tallGroups.forEach(otherGroup => {\n\t\t\t\t\tif (otherGroup !== group) {\n\t\t\t\t\t\tconst otherUl = otherGroup.querySelector(\".lv-group-list\");\n\t\t\t\t\t\tconst otherGname = otherGroup.getAttribute(\"data-group\");\n\t\t\t\t\t\tconst otherArrow = document.getElementById(\"arrow-\" + cbid + \"-\" + otherGname);\n\t\t\t\t\t\tif (otherUl) otherUl.style.display = \"none\";\n\t\t\t\t\t\tif (otherArrow) otherArrow.className = \"lv-arrow-right\";\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// 展开包含当前 hiddenSelect 值的组（初始化或打开面板时使用）\n\tfunction lv_expandGroupOfCurrent(cbid, listContainer, hiddenSelect) {\n\t\tconst key = hiddenSelect.options[0].value;\n\t\tif (!key) return;\n\t\tconst targetLi = listContainer.querySelector(\"li[data-key='\" + key.replace(/'/g,\"\\\\'\") + \"']\");\n\t\tif (!targetLi) return;\n\t\tlet parentGroup = targetLi.closest(\".lv-group\");\n\t\tif (parentGroup) {\n\t\t\tconst ul = parentGroup.querySelector(\".lv-group-list\");\n\t\t\tconst gname = parentGroup.getAttribute(\"data-group\");\n\t\t\tconst arrow = document.getElementById(\"arrow-\" + cbid + \"-\" + gname);\n\t\t\tif (ul) ul.style.display = \"block\";\n\t\t\tif (arrow) arrow.className = \"lv-arrow-down-small\";\n\t\t\tconst allGroups = listContainer.querySelectorAll(\".lv-group\");\n\t\t\tallGroups.forEach(gp=>{\n\t\t\t\tif (gp !== parentGroup) {\n\t\t\t\t\tconst gul = gp.querySelector(\".lv-group-list\");\n\t\t\t\t\tconst otherGname = gp.getAttribute(\"data-group\");\n\t\t\t\t\tconst gar = document.getElementById(\"arrow-\" + cbid + \"-\" + otherGname);\n\t\t\t\t\tif (gul) gul.style.display = \"none\";\n\t\t\t\t\tif (gar) gar.className = \"lv-arrow-right\";\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tconst allGroups = listContainer.querySelectorAll(\".lv-group\");\n\t\t\tallGroups.forEach(gp=>{\n\t\t\t\tconst gul = gp.querySelector(\".lv-group-list\");\n\t\t\t\tconst gname = gp.getAttribute(\"data-group\");\n\t\t\t\tconst gar = document.getElementById(\"arrow-\" + cbid + \"-\" + gname);\n\t\t\t\tif (gul) gul.style.display = \"none\";\n\t\t\t\tif (gar) gar.className = \"lv-arrow-right\";\n\t\t\t});\n\t\t}\n\t\tif (targetLi) {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\ttargetLi.scrollIntoView({ block: \"nearest\" });\n\t\t\t});\n\t\t}\n\t}\n\n\t// 计算panel位置\n\tfunction lv_repositionPanel(panel, display) {\n\t\tif (!panel || panel.style.display === \"none\") return;\n\t\tconst rect = display.getBoundingClientRect();\n\t\tconst viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n\t\tpanel.style.visibility = \"hidden\";\n\t\tpanel.style.display = \"block\";\n\t\tpanel.style.minHeight = \"100px\";\n\t\tpanel.style.maxHeight = Math.min(0.5*viewportHeight, 550) + \"px\";\n\t\tconst panelHeight = panel.offsetHeight;\n\t\tconst spaceBelow = viewportHeight - rect.bottom;\n\t\tconst spaceAbove = rect.top;\n\t\tlet top, isUp = false;\n\t\tif (spaceBelow >= panelHeight) {\n\t\t\ttop = rect.bottom + 2;\n\t\t\tisUp = false;\n\t\t} else if (spaceAbove >= panelHeight) {\n\t\t\ttop = rect.top - panelHeight - 2;\n\t\t\tisUp = true;\n\t\t} else {\n\t\t\tif (spaceBelow >= spaceAbove) {\n\t\t\t\ttop = Math.max(rect.bottom - 2, viewportHeight - panelHeight - 2);\n\t\t\t\tisUp = false;\n\t\t\t} else {\n\t\t\t\ttop = Math.min(rect.top - panelHeight + 2, 2);\n\t\t\t\tisUp = true;\n\t\t\t}\n\t\t}\n\t\tpanel.style.left = rect.left + \"px\";\n\t\tpanel.style.top = top + \"px\";\n\t\tconst panelRect = panel.getBoundingClientRect();\n\t\tconst displayWidth = rect.width;\n\t\tconst remainingWidth = window.innerWidth - panelRect.left - 12;\n\t\tconst maxWidth = Math.max(displayWidth, Math.floor(remainingWidth));\n\t\tpanel.style.maxWidth = maxWidth + \"px\";\n\t\tpanel.style.minWidth = displayWidth + \"px\";\n\t\tpanel.style.width = \"auto\";\n\t\tpanel.style.visibility = \"\";\n\t}\n\n\t// 打开/关闭面板\n\tfunction lv_openPanel(cbid, display, panel, listContainer, hiddenSelect, searchInput) {\n\t\tif (!panel._moved) {\n\t\t\tdocument.body.appendChild(panel);\n\t\t\tpanel._moved = true;\n\t\t}\n\t\tlv_expandGroupOfCurrent(cbid, listContainer, hiddenSelect);\n\t\tlv_highlightSelectedItem(listContainer, hiddenSelect);\n\t\tpanel.style.display = \"block\";\n\t\tlv_repositionPanel(panel, display);\n\t\t// 失焦监听\n\t\tconst handler = function(e){\n\t\t\tconst target = e.target;\n\t\t\tif (panel.style.display !== \"none\") {\n\t\t\t\tif (!panel.contains(target) && !display.contains(target)) {\n\t\t\t\t\tlv_closePanel(cbid, panel, listContainer, hiddenSelect, searchInput, display);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tpanel._docClickHandler = handler;\n\t\tdocument.addEventListener(\"click\", handler);\n\t\t// 滚动 / resize 自动 reposition\n\t\tlet ticking = false;\n\t\tconst repositionHandler = function () {\n\t\t\tif (ticking) return;\n\t\t\tticking = true;\n\t\t\trequestAnimationFrame(function () {\n\t\t\t\tticking = false;\n\t\t\t\tlv_repositionPanel(panel, display);\n\t\t\t});\n\t\t};\n\t\tpanel._repositionHandler = repositionHandler;\n\t\twindow.addEventListener(\"scroll\", repositionHandler, true);\n\t\twindow.addEventListener(\"resize\", repositionHandler);\n\t}\n\tfunction lv_closePanel(cbid, panel, listContainer, hiddenSelect, searchInput) {\n\t\tpanel.style.display = \"none\";\n\t\tsearchInput.value = \"\";\n\t\tlv_filterList(\"\", cbid, listContainer, hiddenSelect, searchInput);\n\t\t// document click\n\t\tif (panel._docClickHandler) {\n\t\t\tdocument.removeEventListener(\"click\", panel._docClickHandler);\n\t\t\tpanel._docClickHandler = null;\n\t\t}\n\t\t// scroll / resize\n\t\tif (panel._repositionHandler) {\n\t\t\twindow.removeEventListener(\"scroll\", panel._repositionHandler, true);\n\t\t\twindow.removeEventListener(\"resize\", panel._repositionHandler);\n\t\t\tpanel._repositionHandler = null;\n\t\t}\n\t}\n\n\t// 动态生成下拉框\n\twindow.lv_dropdown_rendered = {};\n\tfunction lv_escape_html(s) {\n\t\treturn s.replace(/[&<>\"']/g, c => ({\n\t\t\t\"&\":\"&amp;\", \"<\":\"&lt;\", \">\":\"&gt;\", '\"':\"&quot;\", \"'\":\"&#39;\"\n\t\t}[c]));\n\t}\n\t\n\tfunction lv_change(cbid, listContainer, hiddenSelect, labelSpan, searchInput, new_key, new_text) {\n\t\t//改值\n\t\thiddenSelect.options[0].value = new_key;\n\t\thiddenSelect.options[0].text = new_key;\n\t\thiddenSelect.value = new_key;\n\t\tlabelSpan.textContent = lv_ellipsisByWidth(cbid, new_text);\n\t\tlabelSpan.title = new_text;\n\t\tlv_highlightSelectedItem(listContainer, hiddenSelect);\n\t\tlv_updateGroupCounts(cbid, listContainer, hiddenSelect, searchInput);\n\t}\n\t\n\tfunction lv_render_dropdown_list(cbid, panel, listContainer, hiddenSelect, labelSpan, searchInput, display) {\n\t\tif (window.lv_dropdown_rendered[cbid]) return;\n\t\tconst data = window.lv_dropdown_data[cbid];\n\t\tif (!data) return;\n\t\tif (!listContainer) return;\n\n\t\tlet html = \"\";\n\n\t\t// 无组项\n\t\tif (data.ungrouped && data.ungrouped.length > 0) {\n\t\t\thtml += `<ul style=\"list-style:none;padding:0;margin:0 0 8px 0;\">`;\n\n\t\t\tdata.ungrouped.forEach(item => {\n\t\t\t\thtml += `\n\t\t\t\t\t<li data-key=\"${item.key}\"\n\t\t\t\t\t\tdata-node-name=\"${lv_escape_html(item.label.toLowerCase())}\"\n\t\t\t\t\t\tclass=\"list-item\">\n\t\t\t\t\t\t<span class=\"lv-item-label\" style=\"margin-left:12px;\">\n\t\t\t\t\t\t\t${lv_escape_html(item.label)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</li>`;\n\t\t\t});\n\n\t\t\thtml += `</ul>`;\n\t\t}\n\n\t\t// 分组项\n\t\tdata.group_order.forEach(gname => {\n\t\t\tconst items = data.groups[gname];\n\n\t\t\thtml += `\n\t\t\t<div class=\"lv-group\" data-group=\"${lv_idSafe(gname)}\" style=\"margin-bottom:8px;\">\n\t\t\t\t<div class=\"lv-group-title\" data-group-name=\"${lv_idSafe(gname)}\">\n\t\t\t\t\t<span class=\"lv-arrow-right\" id=\"arrow-${cbid}-${lv_idSafe(gname)}\"></span>\n\t\t\t\t\t<b style=\"margin-left:6px;\">${lv_escape_html(gname)}</b>\n\t\t\t\t\t<span id=\"group-count-${cbid}-${lv_idSafe(gname)}\"\n\t\t\t\t\t\tstyle=\"margin-left:8px;\">(0/${items.length})</span>\n\t\t\t\t</div>\n\t\t\t\t<ul id=\"group-${cbid}-${lv_idSafe(gname)}\" class=\"lv-group-list\" style=\"display:none\">\n\t\t\t`;\n\n\t\t\titems.forEach(item => {\n\t\t\t\thtml += `\n\t\t\t\t<li data-key=\"${item.key}\"\n\t\t\t\t\tdata-node-name=\"${lv_escape_html(item.label.toLowerCase())}\"\n\t\t\t\t\tclass=\"lv-group-item\">\n\t\t\t\t\t<span class=\"lv-item-label\" title=\"${lv_escape_html(item.label)}\">\n\t\t\t\t\t\t${lv_escape_html(item.label)}\n\t\t\t\t\t</span>\n\t\t\t\t</li>`;\n\t\t\t});\n\n\t\t\thtml += `\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t\t`;\n\t\t});\n\n\t\tlistContainer.innerHTML = html;\n\n\t\twindow.lv_dropdown_rendered[cbid] = true;\n\n\t\tlv_adaptiveStyle(cbid);\n\t\tlv_updateGroupCounts(cbid, listContainer, hiddenSelect, searchInput);\n\n\t\t// 点击项（无组与组内项都使用 li[data-key]）\n\t\tlistContainer.addEventListener(\"click\", function(e){\n\t\t\tlet li = e.target;\n\t\t\twhile(li && li !== listContainer && !li.hasAttribute('data-key')) li = li.parentNode;\n\t\t\tif(!li || li === listContainer) return;\n\t\t\tconst key = li.getAttribute('data-key') || \"\";\n\t\t\tconst text = li.querySelector(\".lv-item-label\")?.textContent || li.textContent || key;\n\n\t\t\tconst changed = key !== hiddenSelect.value;\n\t\t\tif (changed) {\n\t\t\t\t//改值\n\t\t\t\tlv_change(cbid, listContainer, hiddenSelect, labelSpan, searchInput, key, text);\n\t\t\t}\n\t\t\tlv_closePanel(cbid,panel,listContainer,hiddenSelect,searchInput);\n\t\t\tif (changed) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\thiddenSelect.dispatchEvent(new Event('change', { bubbles: true }));\n\t\t\t\t}, 0);\n\t\t\t}\n\t\t});\n\n\t\t// 搜索功能\n\t\tsearchInput.addEventListener(\"input\", function() {\n\t\t\tlv_filterList(this.value, cbid, listContainer, hiddenSelect, searchInput);\n\t\t\tlv_repositionPanel(panel, display);\n\t\t});\n\t\tsearchInput.addEventListener('keydown', function(e) {\n\t\t\tconst isEnter = e.key === \"Enter\" || e.keyCode === 13;\n\t\t\tif (!isEnter) return;\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tsearchInput.blur();\n\t\t});\n\n\t\t// 切换组\n\t\tlistContainer.querySelectorAll(\".lv-group-title\").forEach(title => {\n\t\t\ttitle.addEventListener(\"click\", function() {\n\t\t\t\tconst g = this.closest(\".lv-group\")?.getAttribute(\"data-group\");\n\t\t\t\tif (g) {\n\t\t\t\t\tlv_toggleGroup(listContainer, cbid, g);\n\t\t\t\t\tlv_repositionPanel(panel, display);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t// 防止 panel 惯性滚动穿透\n\t\tpanel.addEventListener('wheel', function (e) {\n\t\t\tconst deltaY = e.deltaY;\n\t\t\tconst scrollTop = panel.scrollTop;\n\t\t\tconst scrollHeight = panel.scrollHeight;\n\t\t\tconst clientHeight = panel.clientHeight;\n\t\t\tconst isAtTop = scrollTop === 0;\n\t\t\tconst isAtBottom = scrollTop + clientHeight >= scrollHeight;\n\t\t\tif (deltaY < 0 && isAtTop) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (deltaY > 0 && isAtBottom) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.stopPropagation();\n\t\t}, { passive: false });\n\t}\n\n\t//截断display字符长度\n\twindow.lv_labelSpan_maxWidth = {};\n\tfunction lv_ellipsisByWidth(cbid, text) {\n\t\tconst el = document.getElementById(cbid + \".label\");\n\t\tif (!el || !text) return text;\n\t\ttext = text.trim();\n\t\tconst maxWidth = el.clientWidth;\n\t\twindow.lv_labelSpan_maxWidth[cbid] = maxWidth;\n\t\tif (maxWidth <= 0) return text;\n\t\tconst style = window.getComputedStyle(el);\n\t\tconst font = [\n\t\t\tstyle.fontStyle,\n\t\t\tstyle.fontVariant,\n\t\t\tstyle.fontWeight,\n\t\t\tstyle.fontSize || '16px',\n\t\t\tstyle.fontFamily || 'sans-serif'\n\t\t].join(\" \").replace(/\\s+/g, ' ');\n\t\tconst canvas = lv_ellipsisByWidth._canvas || (lv_ellipsisByWidth._canvas = document.createElement(\"canvas\"));\n\t\tconst ctx = canvas.getContext(\"2d\");\n\t\tctx.font = font;\n\t\tif (ctx.measureText(text).width <= maxWidth) {\n\t\t\treturn text;\n\t\t}\n\t\tconst ellipsis = \"...\";\n\t\tconst ellipsisWidth = ctx.measureText(ellipsis).width;\n\t\tconst minChars = 15;\n\t\tconst probe = text.slice(0, minChars);\n\t\tconst probeWidth = ctx.measureText(probe).width;\n\t\tif (probeWidth + ellipsisWidth > maxWidth) {\n\t\t\treturn text;\n\t\t}\n\t\tlet left = 0;\n\t\tlet right = text.length;\n\t\tlet result = ellipsis;\n\t\twhile (left <= right) {\n\t\t\tconst mid = (left + right) >> 1;\n\t\t\tconst substr = text.slice(0, mid);\n\t\t\tconst w = ctx.measureText(substr).width;\n\t\t\tif (w + ellipsisWidth <= maxWidth) {\n\t\t\t\tresult = substr + ellipsis;\n\t\t\t\tleft = mid + 1;\n\t\t\t} else {\n\t\t\t\tright = mid - 1;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tconst lv_adaptiveControls = new Set();\n\tfunction lv_registerAdaptive(cbid) {\n\t\tlv_adaptiveControls.add(cbid);\n\t\tlv_adaptiveStyle(cbid);\n\t}\n\tfunction lv_labelSpanResize(cbid) {\n\t\tconst el = document.getElementById(cbid + \".label\");\n\t\tif (!el) return;\n\t\tconst maxWidth = el.clientWidth;\n\t\tif (window.lv_labelSpan_maxWidth[cbid] == maxWidth) return;\n\t\tlet text = el.title;\n\t\tel.textContent = lv_ellipsisByWidth(cbid, text);\n\t}\n\tlet lv_adaptiveTicking = false;\n\twindow.addEventListener(\"resize\", () => {\n\t\tif (!lv_adaptiveTicking) {\n\t\t\tlv_adaptiveTicking = true;\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tlv_adaptiveControls.forEach(cbid => {\n\t\t\t\t\tlv_adaptiveStyle(cbid);\n\t\t\t\t\tlv_labelSpanResize(cbid);\n\t\t\t\t});\n\t\t\t\tlv_adaptiveTicking = false;\n\t\t\t});\n\t\t}\n\t});\n//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/cbi/nodes_multivalue.htm",
    "content": "<%+cbi/valueheader%>\n<%\n--\tTemplate Developers:\n--\t\t- lwb1978\n--\tCopyright: copyright(c)2025–2027\n--\tDescription: Passwall(2) UI template\nlocal json = require \"luci.jsonc\"\nlocal cbid = \"cbid.\" .. self.config .. \".\" .. section .. \".\" .. self.option\n\n-- 读取 MultiValue\nlocal values = {}\nfor i, key in pairs(self.keylist) do\n\tvalues[#values + 1] = {\n\t\tkey = key,\n\t\tlabel = self.vallist[i] or key,\n\t\tgroup = self.group and self.group[i] or nil\n\t}\nend\n\n-- 获取选中值\nlocal selected = {}\nlocal cval = self:cfgvalue(section)\nif type(cval) == \"table\" then\n\tfor _, v in pairs(cval) do\n\t\tselected[v] = true\n\tend\nelseif type(cval) == \"string\" then\n\tfor v in cval:gmatch(\"%S+\") do\n\t\tselected[v] = true\n\tend\nend\n\n-- 按原顺序分组\nlocal groups = {}\nlocal group_order = {}\nfor _, item in ipairs(values) do\n\tlocal g = item.group\n\tif not g or g == \"\" then \n\t\tg = translate(\"default\") \n\tend\n\tif not groups[g] then \n\t\tgroups[g] = {}\n\t\ttable.insert(group_order, g)\n\tend\n\ttable.insert(groups[g], item)\nend\n\nlocal total_count = #values\nlocal selected_count = 0\nfor _, item in ipairs(values) do\n\tif selected[item.key] then\n\t\tselected_count = selected_count + 1\n\tend\nend\n\nlocal function idSafe(id)\n\treturn (id\n\t\t:gsub(\"^%s+\", \"\")\n\t\t:gsub(\"%s+$\", \"\")\n\t\t:gsub(\"%s+\", \"-\")\n\t\t:gsub(\"[%z\\1-\\31\\127]\", \"\")\n\t)\nend\n%>\n\n<div id=\"<%=cbid%>\" class=\"cbi-input-select\" style=\"display:inline-block;\">\n\t<select id=\"<%=cbid%>.ref\" class=\"cbi-input-select\" style=\"display:none !important;\">\n\t\t<option value>placeholder</option>\n\t</select>\n\t<!-- 搜索框 -->\n\t<input type=\"text\" id=\"<%=cbid%>.search\"\n\t\tclass=\"mv_search_input cbi-input-text\"\n\t\tplaceholder=\"🔍 <%:Search nodes...%>\" inputmode=\"search\" enterkeyhint=\"done\" />\n\t<!-- 主容器 -->\n\t<div class=\"mv_list_container\" id=\"<%=cbid%>.panel\">\n\t\t<ul class=\"cbi-multi mv_node_list\" id=\"<%=cbid%>.node_list\">\n\t\t\t<% for _, gname in ipairs(group_order) do local items = groups[gname] %>\n\t\t\t<li class=\"group-block\" data-group=\"<%=idSafe(gname)%>\">\n\t\t\t\t<!-- 组标题 -->\n\t\t\t\t<div class=\"group-title\">\n\t\t\t\t\t<span id=\"arrow-<%=self.option%>-<%=idSafe(gname)%>\" class=\"mv-arrow-right\"></span>\n\t\t\t\t\t<b style=\"margin-left:8px;\"><%=pcdata(gname)%></b>\n\t\t\t\t\t<%\n\t\t\t\t\t\tlocal g_selected = 0\n\t\t\t\t\t\tfor _, it in ipairs(items) do\n\t\t\t\t\t\t\tif selected[it.key] then\n\t\t\t\t\t\t\t\tg_selected = g_selected + 1\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t%>\n\t\t\t\t\t<span id=\"group-count-<%=self.option%>-<%=idSafe(gname)%>\" style=\"margin-left:8px;\">\n\t\t\t\t\t\t(<%=g_selected%>/<%=#items%>)\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<!-- 组内容 -->\n\t\t\t\t<ul id=\"group-<%=self.option%>-<%=idSafe(gname)%>\" class=\"group-items\" style=\"display:none;\"\n\t\t\t\t\tdata-items='<%=json.stringify(items)%>'\n\t\t\t\t\tdata-selected='<%=json.stringify(selected)%>'>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t\t<% end %>\n\t\t</ul>\n\t</div>\n\t<!-- 底部控制栏 -->\n\t<div class=\"mv-controls\">\n\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" onclick=\"mv_selectAll('<%=cbid%>','<%=self.option%>',true)\" value=\"<%:Select all%>\">\n\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" onclick=\"mv_selectAll('<%=cbid%>','<%=self.option%>',false)\" value=\"<%:DeSelect all%>\">\n\t\t<span id=\"count-<%=self.option%>\" style=\"color:#666;\"><%:Selected:%> <span style='color:red;'><%=selected_count%>/<%=total_count%></span></span>\n\t</div>\n</div>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n(function(){\n\tconst cbid = \"<%=cbid%>\";\n\tconst opt = \"<%=self.option%>\";\n\tconst searchInput = document.getElementById(cbid + \".search\");\n\tconst nodeList = document.getElementById(cbid + \".node_list\");\n\n\tnodeList.querySelectorAll(\".group-title\").forEach(title => {\n\t\ttitle.addEventListener(\"click\", function() {\n\t\t\tconst g = this.closest(\".group-block\")?.getAttribute(\"data-group\");\n\t\t\tif (g) mv_toggleGroup(opt, nodeList, searchInput, g);\n\t\t});\n\t});\n\n\tmv_multivalue_init(cbid, opt, nodeList, searchInput)\n})();\n//]]>\n</script>\n\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/cbi/nodes_multivalue_com.htm",
    "content": "<%\n--\tTemplate Developers:\n--\t\t- lwb1978\n--\tCopyright: copyright(c)2025–2027\n--\tDescription: Passwall(2) UI template\n%>\n\n<style>\n/* 组标题的右箭头 */\n.mv-arrow-right {\n\twidth: 0;\n\theight: 0;\n\tborder-top: 4px solid transparent;\n\tborder-bottom: 4px solid transparent;\n\tborder-left: 5px solid #555;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 组标题的下箭头 */\n.mv-arrow-down-small {\n\twidth: 0;\n\theight: 0;\n\tborder-left: 4px solid transparent;\n\tborder-right: 4px solid transparent;\n\tborder-top: 5px solid #555;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n.mv_search_input {\n\twidth: 100%;\n\tbox-sizing: border-box;\n\tpadding: 6px;\n\tmargin-bottom: 8px;\n\tborder: 1px solid #ccc;\n\tborder-radius: 4px;\n\tmax-height: 36px;\n}\n.mv_list_container {\n\tmax-height: 300px;\n\toverflow: auto;\n\tmargin-bottom: 8px;\n\twhite-space: nowrap;\n}\n.mv_node_list {\n\twidth: 100%;\n\tbox-sizing: border-box;\n\tpadding: 0 !important;\n\tmargin: 0 !important;\n}\n.mv_node_list li.group-block {\n\tlist-style: none;\n\tpadding: 0;\n\tmargin: 0 0 8px 0;\n}\n.mv_node_list .group-title {\n\tcursor: pointer;\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 6px;\n\tmargin-bottom: 4px;\n\tborder-radius: 4px;\n\twhite-space: nowrap;\n}\n.mv_node_list ul.group-items {\n\tmargin: 0 0 8px 16px;\n\tpadding: 0;\n\tlist-style: none;\n}\n.mv_node_list ul.group-items li.node-item {\n\tlist-style: none;\n\tpadding: 0;\n\tmargin: 0;\n\twhite-space: nowrap;\n\ttext-align: left;\n}\n.mv-node-row {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tvertical-align: middle;\n}\n.mv-node-checkbox {\n\tmargin: 0;\n\tvertical-align: middle;\n\tmargin-right: 6px;\n}\n.mv-node-label {\n\tmargin: 0;\n\tpadding: 0;\n\tvertical-align: middle;\n\tcursor: pointer;\n}\n.mv-controls {\n\tmargin-top: 4px;\n\tdisplay: flex;\n\tgap: 4px;\n\talign-items: center;\n}\n</style>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n\t// css helper functions\n\tfunction mv_camelToKebab(str) {\n\t\treturn str.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2').toLowerCase()\n\t}\n\n\tfunction mv_style2Css(styleDeclaration, properties) {\n\t\tconst cssRules = properties.map(prop => {\n\t\t\tconst kebabCaseProp = mv_camelToKebab(prop);[1, 5]\n\t\t\tconst value = styleDeclaration[prop]\n\t\t\tif (value) {\n\t\t\t\treturn `${kebabCaseProp}: ${value};`\n\t\t\t}\n\t\t\treturn ''\n\t\t})\n\t\t// Filter out any empty strings and join the rules\n\t\treturn cssRules.filter(Boolean).join(' ')\n\t}\n\n\tconst mv_parseColorToRgba = (function() {\n\t\t// Create canvas and context once (Closure)\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = 1;\n\t\tcanvas.height = 1;\n\t\tconst ctx = canvas.getContext('2d', { willReadFrequently: true });\n\t\treturn function(colorStr) {\n\t\t\tif (!colorStr)\n\t\t\t   return null;\n\t\t\tctx.clearRect(0, 0, 1, 1);\n\t\t\t// 2. Apply the color\n\t\t\tctx.fillStyle = colorStr;\n\t\t\t// 3. Fill a single pixel\n\t\t\tctx.fillRect(0, 0, 1, 1);\n\t\t\t// 4. Extract pixel data [R, G, B, A]\n\t\t\tconst data = ctx.getImageData(0, 0, 1, 1).data;\n\t\t\treturn {\n\t\t\t\tr: data[0],\n\t\t\t\tg: data[1],\n\t\t\t\tb: data[2],\n\t\t\t\t// Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places)\n\t\t\t\ta: Math.round((data[3] / 255) * 1000) / 1000\n\t\t\t};\n\t\t};\n\t})();\n\n\t// Helper to convert back to Hex (for output consistency)\n\tfunction mv_rgbToHex(r, g, b) {\n\t\tconst toHex = (n) => {\n\t\t\tconst hex = Math.max(0, Math.min(255, n)).toString(16)\n\t\t\treturn hex.length === 1 ? '0' + hex : hex\n\t\t}\n\t\treturn `#${toHex(r)}${toHex(g)}${toHex(b)}`\n\t}\n\n\tfunction mv_isTransparent(color) {\n\t\tconst cleanColor = mv_parseColorToRgba(color);\n\t\t// check #RRGGBBAA for transparency\n\t\treturn !cleanColor || (cleanColor.a !== undefined && !cleanColor.a);\n\t}\n\n\tfunction mv_getColorSchema(color) {\n\t\tconst rgb = mv_parseColorToRgba(color);\n\t\tif (!rgb) return 'unknown'; // Handle invalid colors\n\t\t// Calculate YIQ brightness (human eye perception)\n\t\tconst brightness = ((rgb.r * 299) + (rgb.g * 587) + (rgb.b * 114)) / 1000;\n\t\t\n\t\treturn brightness > 128 ? 'light' : 'dark';\n\t}\n\n\tfunction mv_lighter(color, amount) {\n\t\tconst rgb = mv_parseColorToRgba(color);\n\t\tif (!rgb) return color;\n\t\t// Add amount to each channel\n\t\tconst r = rgb.r + amount;\n\t\tconst g = rgb.g + amount;\n\t\tconst b = rgb.b + amount;\n\t\t// Convert back to Hex (clamping happens inside rgbToHex)\n\t\treturn mv_rgbToHex(r, g, b);\n\t}\n\n\tfunction mv_darker(color, amount) {\n\t\tconst rgb = mv_parseColorToRgba(color);\n\t\tif (!rgb) return color;\n\t\t// Subtract amount from each channel\n\t\tconst r = rgb.r - amount;\n\t\tconst g = rgb.g - amount;\n\t\tconst b = rgb.b - amount;\n\n\t\treturn mv_rgbToHex(r, g, b);\n\t}\n\n\t// copy select styles\n\tfunction mv_adaptiveStyle(cbid) {\n\t\tconst mainDiv = document.getElementById(cbid);\n\t\tconst hiddenRef = document.getElementById(cbid + \".ref\");\n\t\tconst panel = document.getElementById(cbid + \".panel\");\n\t\tif (hiddenRef && mainDiv) {\n\t\t\tconst elOption = hiddenRef.getElementsByTagName(\"option\")[0]\n\t\t\tconst styleSelect = window.getComputedStyle(hiddenRef)\n\t\t\tconst styleOption = window.getComputedStyle(elOption)\n\t\t\tconst styleBody = window.getComputedStyle(document.body)\n\n\t\t\tconst styleNode = document.createElement('style')\n\t\t\tconst styleNames = [\"width\", \"color\", \"height\", \"margin\", \"lineHeight\", \"borderRadius\", \"minWidth\", \"minHeight\"]\n\n\t\t\tdocument.head.appendChild(styleNode)\n\t\t\t// trace back from option -> select -> body for background color\n\t\t\tconst panelRadius = styleSelect.borderRadius;\n\t\t\tconst optionColor = !mv_isTransparent(styleOption.backgroundColor) ? styleOption.backgroundColor : !mv_isTransparent(styleSelect.backgroundColor) ? styleSelect.backgroundColor : styleBody.backgroundColor\n\t\t\tconst titleColor = mv_getColorSchema(optionColor) === \"light\" ? mv_darker(optionColor, 30) : mv_lighter(optionColor, 30)\n\t\t\tconst selectStyleCSS = [`#${CSS.escape(cbid)} {`, mv_style2Css(styleSelect, styleNames), \"}\"]\n\t\t\tconst optionStyleCSS = [`#${CSS.escape(cbid + \".panel\")}  {`, mv_style2Css(styleOption, styleNames), `background-color: ${optionColor};`, `border-radius: ${panelRadius};`, \"}\"]\n\t\t\tconst titleStyleCSS = [`#${CSS.escape(cbid + \".panel\")} .group-title  {`, `background-color: ${titleColor} !important;`, \"}\"]\n\t\t\tstyleNode.textContent = [].concat(selectStyleCSS, optionStyleCSS, titleStyleCSS).join(\"\\n\")\n\t\t}\n\t}\n\n\tfunction mv_idSafe(id) {\n\t\treturn id\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, \"-\")\n\t\t\t.replace(/[\\x00-\\x1F\\x7F]/g, \"\");\n\t}\n\n\t// 折叠组\n\tfunction mv_toggleGroup(opt, nodeList, searchInput, g) {\n\t\tg = mv_idSafe(g);\n\t\tconst ul = document.getElementById(\"group-\" + opt + \"-\" + g);\n\t\tconst arrow = document.getElementById(\"arrow-\" + opt + \"-\" + g);\n\t\tif (!ul) return;\n\t\t// 判断是否在搜索状态\n\t\tconst keyword = searchInput.value.trim().toLowerCase();\n\t\tconst isSearching = keyword.length > 0;\n\t\t// 搜索状态下，仅切换当前组，不处理其他组\n\t\tif (isSearching){\n\t\t\tul.style.display = ul.style.display === \"none\" ? \"block\" : \"none\";\n\t\t\tif (arrow) arrow.className = ul.style.display === \"none\" ? \"mv-arrow-right\" : \"mv-arrow-down-small\";\n\t\t\treturn;\n\t\t}\n\t\t// 非搜索模式：先折叠其他组\n\t\tnodeList.querySelectorAll(\".group-block\").forEach(group=>{\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst gul = document.getElementById(\"group-\" + opt + \"-\" + gname);\n\t\t\tconst garrow = document.getElementById(\"arrow-\" + opt + \"-\" + gname);\n\t\t\tif (gname !== g) {\n\t\t\t\tif (gul) gul.style.display = \"none\";\n\t\t\t\tif (garrow) garrow.className = \"mv-arrow-right\";\n\t\t\t}\n\t\t});\n\t\tnodeList.parentNode.scrollTop = 0;\n\t\t// 切换当前组\n\t\tul.style.display = ul.style.display === \"none\" ? \"block\" : \"none\";\n\t\tif (arrow) arrow.className = ul.style.display === \"none\" ? \"mv-arrow-right\" : \"mv-arrow-down-small\";\n\t};\n\n\t// 计数\n\tfunction mv_updateCount(opt, nodeList, searchInput) {\n\t\tconst keyword = searchInput.value.trim().toLowerCase();\n\t\tconst isSearching = keyword.length > 0;\n\t\t// 当前实例下的所有 checkbox\n\t\tconst cbs = isSearching \n\t\t\t? Array.from(nodeList.querySelectorAll(\"input[type=checkbox]\")).filter(cb => cb.closest(\"li\").style.display !== \"none\")\n\t\t\t: nodeList.querySelectorAll(\"input[type=checkbox]\");\n\t\tlet checked = 0;\n\t\tcbs.forEach(cb => { if(cb.checked) checked++; });\n\t\t// 更新总计\n\t\tconst totalSpan = document.getElementById(\"count-\" + opt);\n\t\tif (totalSpan) {\n\t\t\ttotalSpan.innerHTML = \"<%:Selected:%> <span style='color:red;'>\" + checked + \"/\" + cbs.length + \"</span>\";\n\t\t}\n\t\t// 更新每个组计数\n\t\tnodeList.querySelectorAll(\".group-block\").forEach(group => {\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst groupCbs = group.querySelectorAll(\"li[data-node-name] input[type=checkbox]\");\n\t\t\tlet groupChecked = 0;\n\t\t\tlet totalCount = 0;\n\t\t\tgroupCbs.forEach(cb => {\n\t\t\t\tconst li = cb.closest(\"li\");\n\t\t\t\t// 搜索时只统计可见节点\n\t\t\t\tif (!isSearching || li.style.display !== \"none\") {\n\t\t\t\t\ttotalCount++;\n\t\t\t\t\tif (cb.checked) groupChecked++;\n\t\t\t\t}\n\t\t\t});\n\t\t\tconst span = document.getElementById(\"group-count-\" + opt + \"-\" + gname);\n\t\t\tif(span) span.textContent = \"(\" + groupChecked + \"/\" + totalCount + \")\";\n\t\t});\n\t}\n\n\t// 搜索\n\tfunction mv_filterGroups(searchInput, opt, nodeList) {\n\t\tconst keyword = searchInput.value.trim().toLowerCase();\n\t\tnodeList.querySelectorAll(\".group-block\").forEach(group => {\n\t\t\tconst items = group.querySelectorAll(\"li[data-node-name]\");\n\t\t\tlet matchCount = 0;\n\t\t\titems.forEach(li => {\n\t\t\t\tconst name = li.getAttribute(\"data-node-name\");\n\t\t\t\tif (!keyword || name.indexOf(keyword) !== -1) {\n\t\t\t\t\tli.style.display = \"\";\n\t\t\t\t\tmatchCount++;\n\t\t\t\t} else {\n\t\t\t\t\tli.style.display = \"none\";\n\t\t\t\t}\n\t\t\t});\n\t\t\t// 搜索时自动展开组\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst ul = document.getElementById(\"group-\" + opt + \"-\" + gname);\n\t\t\tconst arrow = document.getElementById(\"arrow-\" + opt + \"-\" + gname);\n\n\t\t\tif (matchCount === 0 && keyword !== \"\") {\n\t\t\t\tgroup.style.display = \"none\";\n\t\t\t} else {\n\t\t\t\tgroup.style.display = \"\";\n\t\t\t\tif (keyword && ul && arrow) {\n\t\t\t\t\tul.style.display = \"\";\n\t\t\t\t\tarrow.className = \"mv-arrow-down-small\";\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tmv_updateCount(opt, nodeList, searchInput);\n\t\t// 清空搜索后恢复全部折叠\n\t\tif (!keyword) {\n\t\t\tmv_collapseAllGroups(opt, nodeList);\n\t\t}\n\t}\n\n\t// 折叠所有组\n\tfunction mv_collapseAllGroups(opt, nodeList) {\n\t\tnodeList.querySelectorAll(\".group-block\").forEach(group => {\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst ul = document.getElementById(\"group-\" + opt + \"-\" + gname);\n\t\t\tconst arrow = document.getElementById(\"arrow-\" + opt + \"-\" + gname);\n\t\t\tif (ul) ul.style.display = \"none\";\n\t\t\tif (arrow) arrow.className = \"mv-arrow-right\";\n\t\t});\n\t}\n\n\twindow.mv_nodeitem_rendered = {};\n\tfunction mv_render_multivalue_list(cbid, opt, nodeList, searchInput) {\n\t\tif (window.mv_nodeitem_rendered[cbid]) return;\n\t\tconst root = document.getElementById(cbid);\n\t\tif (!root) return;\n\t\t// 遍历所有组\n\t\troot.querySelectorAll(\".group-items\").forEach(function(ul) {\n\t\t\t// 组名\n\t\t\tconst gname = ul.id.replace(\"group-\" + opt + \"-\", \"\");\n\t\t\t// 解析 Lua 注入的数据\n\t\t\tconst items    = JSON.parse(ul.dataset.items || \"[]\");\n\t\t\tconst selected = JSON.parse(ul.dataset.selected || \"{}\");\n\t\t\t// 清空\n\t\t\tul.innerHTML = \"\";\n\t\t\t// 列表渲染\n\t\t\titems.forEach(function(item) {\n\t\t\t\t// li\n\t\t\t\tlet li = document.createElement(\"li\");\n\t\t\t\tli.className = \"node-item\";\n\t\t\t\tli.setAttribute(\"data-node-name\", item.label.toLowerCase());\n\t\t\t\tli.title = item.label;\n\t\t\t\t// row div\n\t\t\t\tlet row = document.createElement(\"div\");\n\t\t\t\trow.className = \"mv-node-row\";\n\t\t\t\t// checkbox\n\t\t\t\tlet checkboxId = cbid + \".\" + item.key;\n\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\tcheckbox.type = \"checkbox\";\n\t\t\t\tcheckbox.className = \"cbi-input-checkbox mv-node-checkbox\";\n\t\t\t\tcheckbox.id = checkboxId;\n\t\t\t\tcheckbox.name = cbid;\n\t\t\t\tcheckbox.value = item.key;\n\t\t\t\tif (selected[item.key]) checkbox.checked = true;\n\t\t\t\t// label\n\t\t\t\tlet label = document.createElement(\"label\");\n\t\t\t\tlabel.className = \"mv-node-label\";\n\t\t\t\tlabel.htmlFor = checkboxId;\n\t\t\t\tlabel.textContent = item.label;\n\t\t\t\t// 组装\n\t\t\t\trow.appendChild(checkbox);\n\t\t\t\trow.appendChild(label);\n\t\t\t\tli.appendChild(row);\n\t\t\t\tul.appendChild(li);\n\t\t\t});\n\t\t});\n\t\twindow.mv_nodeitem_rendered[cbid] = true;\n\t\tsearchInput.addEventListener(\"input\", function() {\n\t\t\tmv_filterGroups(searchInput, opt, nodeList);\n\t\t});\n\t\tsearchInput.addEventListener('keydown', function(e) {\n\t\t\tconst isEnter = e.key === \"Enter\" || e.keyCode === 13;\n\t\t\tif (!isEnter) return;\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tsearchInput.blur();\n\t\t});\n\t\t// checkbox 改变时更新计数\n\t\tnodeList.addEventListener(\"change\", () => {\n\t\t\tmv_updateCount(opt, nodeList, searchInput);\n\t\t});\n\t}\n\n\t// 全选 / 全不选\n\tfunction mv_selectAll(cbid, opt, flag) {\n\t\tif (!window.mv_nodeitem_rendered[cbid]) return;\n\t\tconst nodeList = document.getElementById(cbid + \".node_list\");\n\t\tconst searchInput = document.getElementById(cbid + \".search\");\n\t\tconst cbs = nodeList.querySelectorAll(\"input[type=checkbox]\");\n\t\tcbs.forEach(cb=>{\n\t\t\tif (cb.offsetParent !== null) cb.checked = flag;\n\t\t});\n\t\tmv_updateCount(opt, nodeList, searchInput);\n\t};\n\n\n\tfunction mv_onControlVisible(cbid, cb) {\n\t\tvar root = document.getElementById(cbid);\n\t\tif (!root) return;\n\t\tvar container = root.closest(\".cbi-value\");\n\t\tif (!container) return;\n\t\tif (container.offsetParent !== null) {\n\t\t\tcb();\n\t\t\treturn;\n\t\t}\n\t\tvar observer = new MutationObserver(function () {\n\t\t\tif (container.offsetParent !== null) {\n\t\t\t\tobserver.disconnect();\n\t\t\t\tcb();\n\t\t\t}\n\t\t});\n\t\tobserver.observe(container, {\n\t\t\tattributes: true,\n\t\t\tattributeFilter: [\"style\", \"class\"]\n\t\t});\n\t}\n\n\tfunction mv_multivalue_init(cbid, opt, nodeList, searchInput) {\n\t\tmv_onControlVisible(cbid, function () {\n\t\t\tvar root = document.getElementById(cbid);\n\t\t\tif (!root || root.dataset.rendered) return;\n\t\t\troot.dataset.rendered = \"1\";\n\t\t\tmv_render_multivalue_list(cbid, opt, nodeList, searchInput)\n\t\t});\n\t\tmv_registerAdaptive(cbid);\n\t}\n\n\tconst mv_adaptiveControls = new Set();\n\tfunction mv_registerAdaptive(cbid) {\n\t\tmv_adaptiveControls.add(cbid);\n\t\tmv_adaptiveStyle(cbid);\n\t}\n\tlet mv_adaptiveTicking = false;\n\twindow.addEventListener(\"resize\", () => {\n\t\tif (!mv_adaptiveTicking) {\n\t\t\tmv_adaptiveTicking = true;\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tmv_adaptiveControls.forEach(cbid => mv_adaptiveStyle(cbid));\n\t\t\t\tmv_adaptiveTicking = false;\n\t\t\t});\n\t\t}\n\t});\n//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/cbi/nodes_value.htm",
    "content": "<%+cbi/valueheader%>\n<%\n--\tTemplate Developers:\n--\t\t- lwb1978\n--\tCopyright: copyright(c)2025–2027\n--\tDescription: Passwall(2) UI template\n\nlocal json = require \"luci.jsonc\"\n\n-- 读取值（keylist/vallist/group）\nlocal values = {{key = \"\", label = translate(\"-- Please choose --\")}}\nfor i, key in pairs(self.keylist) do\n\tif key and key ~= \"\" then\n\t\tvalues[#values + 1] = {\n\t\t\tkey = key,\n\t\t\tlabel = self.vallist[i] or key,\n\t\t\tgroup = self.group and self.group[i] or nil\n\t\t}\n\tend\nend\n\n-- 获取当前配置值（单值）\nlocal current_key = nil\nlocal cval = self:cfgvalue(section)\nif type(cval) == \"table\" then\n\t-- 若意外为table，取第一个\n\tfor k,_ in pairs(cval) do\n\t\tcurrent_key = k\n\t\tbreak\n\tend\nelseif type(cval) == \"string\" then\n\tcurrent_key = (cval:match(\"%S+\")) -- 取第一个 token\nend\n\n-- 分离无组节点（ungrouped）与有组节点（grouped），并保持原有顺序\nlocal ungrouped = {}\nlocal groups = {}\nlocal group_order = {}\nlocal current_key_added = false\nfor _, item in ipairs(values) do\n\tif not current_key_added and current_key and current_key ~= \"\" and item.key == current_key then\n\t\tcurrent_key_added = true\n\tend\n\tif not item.group or item.group == \"\" then\n\t\ttable.insert(ungrouped, item)\n\telse\n\t\tlocal g = item.group\n\t\tif not groups[g] then\n\t\t\tgroups[g] = {}\n\t\t\ttable.insert(group_order, g)\n\t\tend\n\t\ttable.insert(groups[g], item)\n\tend\nend\nif not current_key_added and current_key and current_key ~= \"\" then\n\ttable.insert(ungrouped, {key = current_key, label = current_key})\nend\n\n-- 如果没有配置值，默认取第一个（优先无组第一项，否则第一组第一项）\nif not current_key then\n\tif #ungrouped > 0 then\n\t\tcurrent_key = ungrouped[1].key\n\telse\n\t\t-- 找到 group_order 第一个有节点的项\n\t\tfor _, g in ipairs(group_order) do\n\t\t\tif groups[g] and #groups[g] > 0 then\n\t\t\t\tcurrent_key = groups[g][1].key\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\tend\nend\n\n-- 获取当前 label（用于主控件显示）\nlocal function find_label_by_key(k)\n\tif not k then return \"\" end\n\tfor _, v in ipairs(values) do\n\t\tif v.key == k then return v.label end\n\tend\n\treturn \"\"\nend\nlocal current_label = find_label_by_key(current_key) or \"\"\n\n-- 打包数据给 JS\nlocal dropdown_data = {\n\tcurrent_key = current_key,\n\tcurrent_label = current_label,\n\tungrouped = ungrouped,\n\tgroups = groups,\n\tgroup_order = group_order,\n\tcbid = cbid,\n}\n%>\n<script>\nwindow.v_dropdown_data = window.v_dropdown_data || {};\nwindow.v_dropdown_data[\"<%=cbid%>\"] = <%=json.stringify(dropdown_data)%>;\n</script>\n\n<div id=\"<%=cbid%>.v-main\" class=\"v-dropdown-container\">\n\t<select id=\"<%=cbid%>.ref\" class=\"cbi-input-select\" style=\"display:none !important;\">\n\t\t<option value>placeholder</option>\n\t</select>\n\t<!-- 隐藏 input（保存实际配置值） -->\n \t<input type=\"text\" id=\"<%=cbid%>\" name=\"<%=cbid%>\" value=\"<%=current_key%>\" data-update=\"change\" style=\"display:none !important;\" />\n\t<!-- 模拟 ListValue 控件外观 -->\n\t<div class=\"cbi-input-value cbi-input-select v-dropdown-display\" id=\"<%=cbid%>.display\" tabindex=\"0\">\n\t\t<span id=\"<%=cbid%>.label\" class=\"v-dropdown-label\" title=\"<%=pcdata(current_label)%>\">\n\t\t\t<%=pcdata(translate(\"-- Please choose --\"))%>\n\t\t</span>\n\t\t<span class=\"v-arrow-down\"></span>\n\t</div>\n\t<!-- 下拉面板 -->\n\t<div id=\"<%=cbid%>.panel\" class=\"cbi-listvalue-panel v-dropdown-panel\" style=\"display:none;\">\n\t\t<!-- 搜索框 -->\n\t\t<div style=\"padding:8px;border-bottom:1px solid #f0f0f0;\">\n\t\t\t<input id=\"<%=cbid%>.search\" class=\"cbi-input-text v-dropdown-search\" type=\"text\" placeholder=\"🔍 <%:Search nodes...%>\" inputmode=\"search\" enterkeyhint=\"done\" />\n\t\t</div>\n\t\t<!-- 列表容器 -->\n\t\t<div id=\"<%=cbid%>.list\" style=\"padding:8px;padding-bottom:0;\">\n\t\t\t<!-- 首次点击 display 时由 JS 填充 -->\n\t\t</div>\n\t\t<!-- 自定义 -->\n\t\t<div style=\"padding:8px;padding-top:0;margin-top:0;\">\n\t\t\t<input id=\"<%=cbid%>.custom\" class=\"cbi-input-text v-dropdown-custom\" type=\"text\" placeholder=\"<%=translate(\"-- custom --\")%>\" inputmode=\"text\" enterkeyhint=\"done\" />\n\t\t</div>\n\t</div>\n</div>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n(function(){\n\tconst cbid = \"<%=cbid%>\";\n\tconst hiddenInput = document.getElementById(cbid);\n\tconst panel = document.getElementById(cbid + \".panel\");\n\tconst display = document.getElementById(cbid + \".display\");\n\tconst labelSpan = document.getElementById(cbid + \".label\");\n\tconst searchInput = document.getElementById(cbid + \".search\");\n\tconst listContainer = document.getElementById(cbid + \".list\");\n\tconst customInput = document.getElementById(cbid + \".custom\");\n\n\t// 点击 display\n\tdisplay.addEventListener(\"click\", function(e){\n\t\te.stopPropagation();\n\t\tv_render_dropdown_list(cbid,panel,listContainer,hiddenInput,labelSpan,searchInput,display,customInput);\n\t\tdocument.querySelectorAll(\".cbi-listvalue-panel\").forEach(p=>{\n\t\t\tif (p !== panel) p.style.display = \"none\";\n\t\t});\n\t\tif (panel.style.display !== \"none\") {\n\t\t\tv_closePanel(cbid,panel,listContainer,hiddenInput,searchInput,customInput);\n\t\t} else {\n\t\t\tv_openPanel(cbid,display,panel,listContainer,hiddenInput,searchInput,customInput);\n\t\t}\n\t});\n\tv_registerAdaptive(cbid);\n\tsetTimeout(() => {\n\t\tlabelSpan.textContent = v_ellipsisByWidth(cbid, '<%=pcdata(current_label ~= \"\" and current_label or current_key)%>');\n\t}, 100);\n})();\n//]]>\n</script>\n\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/cbi/nodes_value_com.htm",
    "content": "<%\n--\tTemplate Developers:\n--\t\t- lwb1978\n--\tCopyright: copyright(c)2025–2027\n--\tDescription: Passwall(2) UI template\n-- It is the common part of the template and cannot be used independently\n%>\n<style>\n/* 主下拉按钮的下箭头 */\n.v-arrow-down {\n\twidth: 0;\n\theight: 0;\n\tborder-left: 5px solid transparent;\n\tborder-right: 5px solid transparent;\n\tborder-top: 6px solid #666;\n\tmargin-left: 6px;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 组标题的右箭头（折叠） */\n.v-arrow-right {\n\twidth: 0;\n\theight: 0;\n\tborder-top: 4px solid transparent;\n\tborder-bottom: 4px solid transparent;\n\tborder-left: 5px solid #555;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 组标题的下箭头（展开） */\n.v-arrow-down-small {\n\twidth: 0;\n\theight: 0;\n\tborder-left: 4px solid transparent;\n\tborder-right: 4px solid transparent;\n\tborder-top: 5px solid #555;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 基础列表项样式 */\n.cbi-listvalue-panel li[data-key] {\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tcursor: pointer;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\ttransition: background-color 0.15s ease;\n}\n/* 鼠标悬停效果 - 使用透明度避免覆盖问题 */\n.cbi-listvalue-panel li[data-key]:hover {\n\tbackground-color: rgba(0, 123, 255, 0.1);\n}\n/* 选中项样式 - 使用更高优先级 */\n.cbi-listvalue-panel li[data-key].is-selected {\n\tbackground-color: #007bff !important;\n\tcolor: white !important;\n\tfont-weight: 600 !important;\n}\n/* 选中项悬停时保持主色调 */\n.cbi-listvalue-panel li[data-key].is-selected:hover {\n\tbackground-color: #0056b3 !important;\n}\n\n.v-dropdown-container {\n\tdisplay: inline-block;\n\tposition: relative;\n\twhite-space: nowrap;\n\tmin-width: 220px;\n}\n@media (max-width: 600px) {\n\t.v-dropdown-container {\n\t\tdisplay: block;\n\t\twhite-space: normal;\n\t}\n}\n\n.v-dropdown-display {\n\tcursor: pointer;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tbox-sizing: border-box;\n\twidth: 100%;\n}\n.v-dropdown-label {\n\tdisplay: inline-block;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\twidth: 100%;\n\ttext-align: left;\n}\n.v-dropdown-panel {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tz-index: 2147483647;\n\tborder: 1px solid #dcdcdc;\n\tborder-radius: 4px;\n\tbox-shadow: 0 6px 18px rgba(0,0,0,0.08);\n\tmax-height: 50vh;\n\toverflow: auto;\n\toverscroll-behavior: contain;\n}\n.v-dropdown-search, .v-dropdown-custom {\n\twidth: 100%;\n\tmax-width: 100% !important;\n\tmin-width: 0 !important;\n\tbox-sizing: border-box;\n\tpadding: 6px;\n\tborder: 1px solid #e0e0e0;\n\tborder-radius: 4px;\n}\n.v-group-title {\n\tcursor: pointer;\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tdisplay: flex;\n\talign-items: center;\n\tline-height: normal;\n\twhite-space: nowrap;\n}\n.v-group-list {\n\tlist-style: none;\n\tmargin: 6px 0 0 8px;\n\tpadding: 0;\n}\n.v-group-item {\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tcursor: pointer;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\ttext-align: left !important;\n}\n</style>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n\t// css helper functions\n\tfunction v_camelToKebab(str) {\n\t\treturn str.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2').toLowerCase()\n\t}\n\n\tfunction v_style2Css(styleDeclaration, properties) {\n\t\tconst cssRules = properties.map(prop => {\n\t\t\tconst kebabCaseProp = v_camelToKebab(prop);[1, 5]\n\t\t\tconst value = styleDeclaration[prop]\n\t\t\tif (value) {\n\t\t\t\treturn `${kebabCaseProp}: ${value};`\n\t\t\t}\n\t\t\treturn ''\n\t\t})\n\t\t// Filter out any empty strings and join the rules\n\t\treturn cssRules.filter(Boolean).join(' ')\n\t}\n\n\tconst v_parseColorToRgba = (function() {\n\t\t// Create canvas and context once (Closure)\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = 1;\n\t\tcanvas.height = 1;\n\t\tconst ctx = canvas.getContext('2d', { willReadFrequently: true });\n\t\treturn function(colorStr) {\n\t\t\tif (!colorStr)\n\t\t\t   return null;\n\t\t\tctx.clearRect(0, 0, 1, 1);\n\t\t\t// 2. Apply the color\n\t\t\tctx.fillStyle = colorStr;\n\t\t\t// 3. Fill a single pixel\n\t\t\tctx.fillRect(0, 0, 1, 1);\n\t\t\t// 4. Extract pixel data [R, G, B, A]\n\t\t\tconst data = ctx.getImageData(0, 0, 1, 1).data;\n\t\t\treturn {\n\t\t\t\tr: data[0],\n\t\t\t\tg: data[1],\n\t\t\t\tb: data[2],\n\t\t\t\t// Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places)\n\t\t\t\ta: Math.round((data[3] / 255) * 1000) / 1000\n\t\t\t};\n\t\t};\n\t})();\n\n\t// Helper to convert back to Hex (for output consistency)\n\tfunction v_rgbToHex(r, g, b) {\n\t\tconst toHex = (n) => {\n\t\t\tconst hex = Math.max(0, Math.min(255, n)).toString(16)\n\t\t\treturn hex.length === 1 ? '0' + hex : hex\n\t\t}\n\t\treturn `#${toHex(r)}${toHex(g)}${toHex(b)}`\n\t}\n\n\tfunction v_isTransparent(color) {\n\t\tconst cleanColor = v_parseColorToRgba(color);\n\t\t// check #RRGGBBAA for transparency\n\t\treturn !cleanColor || (cleanColor.a !== undefined && !cleanColor.a);\n\t}\n\n\tfunction v_getColorSchema(color) {\n\t\tconst rgb = v_parseColorToRgba(color);\n\t\tif (!rgb) return 'unknown'; // Handle invalid colors\n\t\t// Calculate YIQ brightness (human eye perception)\n\t\tconst brightness = ((rgb.r * 299) + (rgb.g * 587) + (rgb.b * 114)) / 1000;\n\t\t\n\t\treturn brightness > 128 ? 'light' : 'dark';\n\t}\n\n\tfunction v_lighter(color, amount) {\n\t\tconst rgb = v_parseColorToRgba(color);\n\t\tif (!rgb) return color;\n\t\t// Add amount to each channel\n\t\tconst r = rgb.r + amount;\n\t\tconst g = rgb.g + amount;\n\t\tconst b = rgb.b + amount;\n\t\t// Convert back to Hex (clamping happens inside rgbToHex)\n\t\treturn v_rgbToHex(r, g, b);\n\t}\n\n\tfunction v_darker(color, amount) {\n\t\tconst rgb = v_parseColorToRgba(color);\n\t\tif (!rgb) return color;\n\t\t// Subtract amount from each channel\n\t\tconst r = rgb.r - amount;\n\t\tconst g = rgb.g - amount;\n\t\tconst b = rgb.b - amount;\n\n\t\treturn v_rgbToHex(r, g, b);\n\t}\n\n\t// copy select styles\n\tfunction v_adaptiveStyle(cbid) {\n\t\tconst display = document.getElementById(cbid + \".display\");\n\t\tconst hiddenRef = document.getElementById(cbid + \".ref\");\n\t\tconst panel = document.getElementById(cbid + \".panel\");\n\t\tif (hiddenRef && display) {\n\t\t\tconst elOption = hiddenRef.getElementsByTagName(\"option\")[0]\n\t\t\tconst styleSelect = window.getComputedStyle(hiddenRef)\n\t\t\tconst styleOption = window.getComputedStyle(elOption)\n\t\t\tconst styleBody = window.getComputedStyle(document.body)\n\n\t\t\tconst styleNode = document.createElement('style')\n\t\t\tconst styleNames = [\"color\", \"height\", \"padding\", \"margin\", \"lineHeight\", \"border\", \"borderRadius\", \"minWidth\",\"minHeight\"]\n\t\t\tif (styleSelect.borderBottomStyle !== \"none\") {\n\t\t\t\tstyleNames.push(\"borderBottomWidth\", \"borderBottomStyle\", \"borderBottomColor\");\n\t\t\t}\n\t\t\tdocument.head.appendChild(styleNode)\n\t\t\t// trace back from option -> select -> body for background color\n\t\t\tconst panelRadius = styleSelect.borderRadius;\n\t\t\tconst optionColor = !v_isTransparent(styleOption.backgroundColor) ? styleOption.backgroundColor : !v_isTransparent(styleSelect.backgroundColor) ? styleSelect.backgroundColor : styleBody.backgroundColor\n\t\t\tconst titleColor = v_getColorSchema(optionColor) === \"light\" ? v_darker(optionColor, 30) : v_lighter(optionColor, 30)\n\t\t\tconst selectStyleCSS = [`#${CSS.escape(cbid + \".display\")} {`, v_style2Css(styleSelect, styleNames), v_style2Css(styleSelect, [\"backgroundColor\"]), \"}\"]\n\t\t\tconst optionStyleCSS = [`#${CSS.escape(cbid + \".panel\")}  {`, v_style2Css(styleOption, styleNames), `background-color: ${optionColor};`, `border-radius: ${panelRadius};`, \"}\"]\n\t\t\tconst titleStyleCSS = [`#${CSS.escape(cbid + \".panel\")} .v-group-title  {`, `background-color: ${titleColor} !important;`, \"}\"]\n\t\t\tstyleNode.textContent = [].concat(selectStyleCSS, optionStyleCSS, titleStyleCSS).join(\"\\n\")\n\t\t}\n\t}\n\n\tfunction v_idSafe(id) {\n\t\treturn id\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, \"-\")\n\t\t\t.replace(/[\\x00-\\x1F\\x7F]/g, \"\");\n\t}\n\n\t// 高亮当前选中的项\n\tfunction v_highlightSelectedItem(listContainer, hiddenInput) {\n\t\tconst allItems = listContainer.querySelectorAll(\"li[data-key]\");\n\t\tconst currentKey = hiddenInput.value;\n\t\tallItems.forEach(item => {\n\t\t\titem.classList.remove(\"is-selected\");\n\t\t\tif (item.getAttribute('data-key') === currentKey) {\n\t\t\t\titem.classList.add(\"is-selected\");\n\t\t\t}\n\t\t});\n\t}\n\n\t// 更新组内选中计数\n\tfunction v_updateGroupCounts(cbid, listContainer, hiddenInput, searchInput) {\n\t\tconst groups = listContainer.querySelectorAll(\".v-group\");\n\t\tconst currentKey = hiddenInput.value;\n\t\tconst isSearching = searchInput.value.trim() !== \"\";\n\t\tgroups.forEach(group => {\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst items = group.querySelectorAll(\"li[data-key]\");\n\t\t\tconst span = document.getElementById(\"group-count-\" + cbid + \"-\" + gname);\n\t\t\tif (!span) return;\n\t\t\tif (isSearching) {\n\t\t\t\t// 搜索状态：显示匹配数量\n\t\t\t\tlet matchCount = 0;\n\t\t\t\titems.forEach(li => {\n\t\t\t\t\tif (li.style.display !== \"none\") matchCount++;\n\t\t\t\t});\n\t\t\t\tspan.textContent = \"(\" + matchCount + \"/\" + items.length + \")\";\n\t\t\t\tif (matchCount > 0) {\n\t\t\t\t\tspan.style.color = \"#28a745\";\n\t\t\t\t\tspan.style.fontWeight = \"600\";\n\t\t\t\t} else {\n\t\t\t\t\tspan.style.color = \"#dc3545\";\n\t\t\t\t\tspan.style.fontWeight = \"normal\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// 默认状态：显示选中项数量\n\t\t\t\tlet selectedCount = 0;\n\t\t\t\titems.forEach(li => {\n\t\t\t\t\tif (li.getAttribute('data-key') === currentKey) {\n\t\t\t\t\t\tselectedCount = 1;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tspan.textContent = \"(\" + selectedCount + \"/\" + items.length + \")\";\n\t\t\t\tif (selectedCount > 0) {\n\t\t\t\t\tspan.style.color = \"#007bff\";\n\t\t\t\t\tspan.style.fontWeight = \"600\";\n\t\t\t\t} else {\n\t\t\t\t\tspan.style.color = \"\";\n\t\t\t\t\tspan.style.fontWeight = \"normal\";\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t//搜索过滤器：按 name 或 label 做模糊匹配，搜索时自动展开所有组并隐藏不匹配条目\n\tfunction v_filterList(keyword, cbid, listContainer, hiddenInput, searchInput) {\n\t\tkeyword = (keyword || \"\").toLowerCase().trim();\n\t\tconst topItems = listContainer.querySelectorAll(\"ul li[data-key]\");\n\t\ttopItems.forEach((li, index)=>{\n\t\t\tif (index === 0) {\n\t\t\t\tli.style.display = \"block\";\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst name = (li.getAttribute(\"data-node-name\") || \"\").toLowerCase();\n\t\t\tif (!keyword || name.indexOf(keyword) !== -1) {\n\t\t\t\tli.style.display = \"block\";\n\t\t\t} else {\n\t\t\t\tli.style.display = \"none\";\n\t\t\t}\n\t\t});\n\t\tconst groups = listContainer.querySelectorAll(\".v-group\");\n\t\tgroups.forEach(group=>{\n\t\t\tconst items = group.querySelectorAll(\"li[data-key]\");\n\t\t\tlet matchCount = 0;\n\t\t\titems.forEach(li=>{\n\t\t\t\tconst name = (li.getAttribute(\"data-node-name\") || \"\").toLowerCase();\n\t\t\t\tif (!keyword || name.indexOf(keyword) !== -1) {\n\t\t\t\t\tli.style.display = \"block\";\n\t\t\t\t\tmatchCount++;\n\t\t\t\t} else {\n\t\t\t\t\tli.style.display = \"none\";\n\t\t\t\t}\n\t\t\t});\n\t\t\tgroup.style.display = (matchCount === 0 && keyword !== \"\") ? \"none\" : \"block\";\n\t\t\tconst ul = group.querySelector(\".v-group-list\");\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst arrow = document.getElementById(\"arrow-\" + cbid + \"-\" + gname);\n\t\t\tif (keyword) {\n\t\t\t\tif (ul) ul.style.display = (matchCount > 0 ? \"block\" : \"none\");\n\t\t\t\tif (arrow) arrow.className = (matchCount > 0 ? \"v-arrow-down-small\" : \"v-arrow-right\");\n\t\t\t} else {\n\t\t\t\tif (ul) ul.style.display = \"none\";\n\t\t\t\tif (arrow) arrow.className = \"v-arrow-right\";\n\t\t\t}\n\t\t});\n\t\tv_updateGroupCounts(cbid, listContainer, hiddenInput, searchInput);\n\t\tv_highlightSelectedItem(listContainer, hiddenInput);\n\t}\n\n\t// 切换单个组（点击组标题）\n\tfunction v_toggleGroup(listContainer, cbid, g) {\n\t\tg = v_idSafe(g);\n\t\tconst group = listContainer.querySelector(\".v-group[data-group='\" + g + \"']\");\n\t\tif (!group) return;\n\t\tconst ul = group.querySelector(\".v-group-list\");\n\t\tconst arrow = document.getElementById(\"arrow-\" + cbid + \"-\" + g);\n\t\tif (!ul) return;\n\t\tconst searchInput = document.getElementById(cbid + \".search\");\n\t\tconst isSearching = searchInput?.value.trim() !== \"\";\n\t\tconst isExpanded = ul.style.display !== \"none\";\n\n\t\tif (isExpanded) {\n\t\t\tul.style.display = \"none\";\n\t\t\tif (arrow) arrow.className = \"v-arrow-right\";\n\t\t} else {\n\t\t\tul.style.display = \"block\";\n\t\t\tif (arrow) arrow.className = \"v-arrow-down-small\";\n\n\t\t\tif (!isSearching) {\n\t\t\t\tconst allGroups = listContainer.querySelectorAll(\".v-group\");\n\t\t\t\tallGroups.forEach(otherGroup => {\n\t\t\t\t\tif (otherGroup !== group) {\n\t\t\t\t\t\tconst otherUl = otherGroup.querySelector(\".v-group-list\");\n\t\t\t\t\t\tconst otherGname = otherGroup.getAttribute(\"data-group\");\n\t\t\t\t\t\tconst otherArrow = document.getElementById(\"arrow-\" + cbid + \"-\" + otherGname);\n\t\t\t\t\t\tif (otherUl) otherUl.style.display = \"none\";\n\t\t\t\t\t\tif (otherArrow) otherArrow.className = \"v-arrow-right\";\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// 展开包含当前 hiddenInput 值的组（初始化或打开面板时使用）\n\tfunction v_expandGroupOfCurrent(cbid, listContainer, hiddenInput) {\n\t\tconst key = hiddenInput.value;\n\t\tif (!key) return;\n\t\tconst targetLi = listContainer.querySelector(\"li[data-key='\" + key.replace(/'/g,\"\\\\'\") + \"']\");\n\t\tif (!targetLi) return;\n\t\tlet parentGroup = targetLi.closest(\".v-group\");\n\t\tif (parentGroup) {\n\t\t\tconst ul = parentGroup.querySelector(\".v-group-list\");\n\t\t\tconst gname = parentGroup.getAttribute(\"data-group\");\n\t\t\tconst arrow = document.getElementById(\"arrow-\" + cbid + \"-\" + gname);\n\t\t\tif (ul) ul.style.display = \"block\";\n\t\t\tif (arrow) arrow.className = \"v-arrow-down-small\";\n\t\t\tconst allGroups = listContainer.querySelectorAll(\".v-group\");\n\t\t\tallGroups.forEach(gp=>{\n\t\t\t\tif (gp !== parentGroup) {\n\t\t\t\t\tconst gul = gp.querySelector(\".v-group-list\");\n\t\t\t\t\tconst otherGname = gp.getAttribute(\"data-group\");\n\t\t\t\t\tconst gar = document.getElementById(\"arrow-\" + cbid + \"-\" + otherGname);\n\t\t\t\t\tif (gul) gul.style.display = \"none\";\n\t\t\t\t\tif (gar) gar.className = \"v-arrow-right\";\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tconst allGroups = listContainer.querySelectorAll(\".v-group\");\n\t\t\tallGroups.forEach(gp=>{\n\t\t\t\tconst gul = gp.querySelector(\".v-group-list\");\n\t\t\t\tconst gname = gp.getAttribute(\"data-group\");\n\t\t\t\tconst gar = document.getElementById(\"arrow-\" + cbid + \"-\" + gname);\n\t\t\t\tif (gul) gul.style.display = \"none\";\n\t\t\t\tif (gar) gar.className = \"v-arrow-right\";\n\t\t\t});\n\t\t}\n\t\tif (targetLi) {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\ttargetLi.scrollIntoView({ block: \"nearest\" });\n\t\t\t});\n\t\t}\n\t}\n\n\t// 计算panel位置\n\tfunction v_repositionPanel(panel, display) {\n\t\tif (!panel || panel.style.display === \"none\") return;\n\t\tconst rect = display.getBoundingClientRect();\n\t\tconst viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n\t\tpanel.style.visibility = \"hidden\";\n\t\tpanel.style.display = \"block\";\n\t\tpanel.style.minHeight = \"100px\";\n\t\tpanel.style.maxHeight = Math.min(0.48*viewportHeight, 500) + \"px\";\n\t\tconst panelHeight = panel.offsetHeight;\n\t\tconst spaceBelow = viewportHeight - rect.bottom;\n\t\tconst spaceAbove = rect.top;\n\t\tlet top, isUp = false;\n\t\tif (spaceBelow >= panelHeight) {\n\t\t\ttop = rect.bottom + 2;\n\t\t\tisUp = false;\n\t\t} else if (spaceAbove >= panelHeight) {\n\t\t\ttop = rect.top - panelHeight - 2;\n\t\t\tisUp = true;\n\t\t} else {\n\t\t\tif (spaceBelow >= spaceAbove) {\n\t\t\t\ttop = Math.max(rect.bottom - 2, viewportHeight - panelHeight - 2);\n\t\t\t\tisUp = false;\n\t\t\t} else {\n\t\t\t\ttop = Math.min(rect.top - panelHeight + 2, 2);\n\t\t\t\tisUp = true;\n\t\t\t}\n\t\t}\n\t\tpanel.style.left = rect.left + \"px\";\n\t\tpanel.style.top = top + \"px\";\n\t\tconst panelRect = panel.getBoundingClientRect();\n\t\tconst displayWidth = rect.width;\n\t\tconst remainingWidth = window.innerWidth - panelRect.left - 12;\n\t\tconst maxWidth = Math.max(displayWidth, Math.floor(remainingWidth));\n\t\tpanel.style.maxWidth = maxWidth + \"px\";\n\t\tpanel.style.minWidth = Math.max(displayWidth, 240) + \"px\";\n\t\tpanel.style.width = \"auto\";\n\t\tpanel.style.visibility = \"\";\n\t}\n\n\t// 打开/关闭面板\n\tfunction v_openPanel(cbid, display, panel, listContainer, hiddenInput, searchInput, customInput) {\n\t\tif (!panel._moved) {\n\t\t\tdocument.body.appendChild(panel);\n\t\t\tpanel._moved = true;\n\t\t}\n\t\tv_expandGroupOfCurrent(cbid, listContainer, hiddenInput);\n\t\tv_highlightSelectedItem(listContainer, hiddenInput);\n\t\tpanel.style.display = \"block\";\n\t\tv_repositionPanel(panel, display);\n\t\t// 失焦监听\n\t\tconst handler = function(e){\n\t\t\tconst target = e.target;\n\t\t\tif (panel.style.display !== \"none\") {\n\t\t\t\tif (!panel.contains(target) && !display.contains(target)) {\n\t\t\t\t\tv_closePanel(cbid, panel, listContainer, hiddenInput, searchInput, display, customInput);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tpanel._docClickHandler = handler;\n\t\tdocument.addEventListener(\"click\", handler);\n\t\t// 滚动 / resize 自动 reposition\n\t\tlet ticking = false;\n\t\tconst repositionHandler = function () {\n\t\t\tif (ticking) return;\n\t\t\tticking = true;\n\t\t\trequestAnimationFrame(function () {\n\t\t\t\tticking = false;\n\t\t\t\tv_repositionPanel(panel, display);\n\t\t\t});\n\t\t};\n\t\tpanel._repositionHandler = repositionHandler;\n\t\twindow.addEventListener(\"scroll\", repositionHandler, true);\n\t\twindow.addEventListener(\"resize\", repositionHandler);\n\t}\n\tfunction v_closePanel(cbid, panel, listContainer, hiddenInput, searchInput, customInput) {\n\t\tpanel.style.display = \"none\";\n\t\tsearchInput.value = \"\";\n\t\tcustomInput.value = \"\";\n\t\tv_filterList(\"\", cbid, listContainer, hiddenInput, searchInput);\n\t\t// document click\n\t\tif (panel._docClickHandler) {\n\t\t\tdocument.removeEventListener(\"click\", panel._docClickHandler);\n\t\t\tpanel._docClickHandler = null;\n\t\t}\n\t\t// scroll / resize\n\t\tif (panel._repositionHandler) {\n\t\t\twindow.removeEventListener(\"scroll\", panel._repositionHandler, true);\n\t\t\twindow.removeEventListener(\"resize\", panel._repositionHandler);\n\t\t\tpanel._repositionHandler = null;\n\t\t}\n\t}\n\n\t//自定义框\n\tfunction v_customEnter(cbid, labelSpan, hiddenInput, searchInput, panel, listContainer, customInput) {\n\t\tlet inputValue = customInput.value.trim();\n    \tif (!inputValue) {\n\t\t\treturn;\n\t\t}\n\t\tconst existingItems = listContainer.querySelectorAll('li[data-key=\"' + inputValue + '\"]');\n\t\tif (existingItems.length <= 0) {\n\t\t\tlet newLi = document.createElement('li');\n\t\t\tnewLi.setAttribute('data-key', inputValue);\n\t\t\tnewLi.setAttribute('data-node-name', inputValue.toLowerCase());\n\t\t\tnewLi.className = 'list-item';\n\n\t\t\tlet newSpan = document.createElement('span');\n\t\t\tnewSpan.className = 'v-item-label';\n\t\t\tnewSpan.style.marginLeft = '12px';\n\t\t\tnewSpan.textContent = inputValue;\n\t\t\tnewLi.appendChild(newSpan);\n\n\t\t\tconst ungroupedList = listContainer.querySelector('ul');\n\t\t\tif (ungroupedList) {\n\t\t\t\tungroupedList.appendChild(newLi);\n\t\t\t}\n\t\t}\n\t\tconst changed = inputValue !== hiddenInput.value;\n\t\tif (changed) {\n\t\t\t//改值\n\t\t\thiddenInput.value = inputValue;\n\t\t\tlabelSpan.textContent = v_ellipsisByWidth(cbid, inputValue);\n\t\t\tlabelSpan.title = inputValue;\n\t\t\tv_highlightSelectedItem(listContainer, hiddenInput);\n\t\t\tv_updateGroupCounts(cbid, listContainer, hiddenInput, searchInput);\n\t\t}\n\t\tv_closePanel(cbid,panel,listContainer,hiddenInput,searchInput,customInput);\n\t}\n\n\t// 动态生成下拉框\n\twindow.v_dropdown_rendered = {};\n\tfunction v_escape_html(s) {\n\t\treturn s.replace(/[&<>\"']/g, c => ({\n\t\t\t\"&\":\"&amp;\", \"<\":\"&lt;\", \">\":\"&gt;\", '\"':\"&quot;\", \"'\":\"&#39;\"\n\t\t}[c]));\n\t}\n\tfunction v_render_dropdown_list(cbid, panel, listContainer, hiddenInput, labelSpan, searchInput, display, customInput) {\n\t\tif (window.v_dropdown_rendered[cbid]) return;\n\t\tconst data = window.v_dropdown_data[cbid];\n\t\tif (!data) return;\n\t\tif (!listContainer) return;\n\n\t\tlet html = \"\";\n\n\t\t// 无组项\n\t\tif (data.ungrouped && data.ungrouped.length > 0) {\n\t\t\thtml += `<ul style=\"list-style:none;padding:0;margin:0 0 8px 0;\">`;\n\n\t\t\tdata.ungrouped.forEach((item, index) => {\n\t\t\t\tconst liStyle = index === 0 ? 'text-align:center;' : '';\n\t\t\t\tconst spanStyle = index === 0 ? 'margin-left:0px;' : 'margin-left:12px;';\n\t\t\t\thtml += `\n\t\t\t\t\t<li data-key=\"${item.key}\"\n\t\t\t\t\t\tdata-node-name=\"${v_escape_html(item.label.toLowerCase())}\"\n\t\t\t\t\t\tclass=\"list-item\" style=\"${liStyle}\">\n\t\t\t\t\t\t<span class=\"v-item-label\" style=\"${spanStyle}\">\n\t\t\t\t\t\t\t${v_escape_html(item.label)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</li>`;\n\t\t\t});\n\n\t\t\thtml += `</ul>`;\n\t\t}\n\n\t\t// 分组项\n\t\tdata.group_order.forEach(gname => {\n\t\t\tconst items = data.groups[gname];\n\n\t\t\thtml += `\n\t\t\t<div class=\"v-group\" data-group=\"${v_idSafe(gname)}\" style=\"margin-bottom:8px;\">\n\t\t\t\t<div class=\"v-group-title\" data-group-name=\"${v_idSafe(gname)}\">\n\t\t\t\t\t<span class=\"v-arrow-right\" id=\"arrow-${cbid}-${v_idSafe(gname)}\"></span>\n\t\t\t\t\t<b style=\"margin-left:6px;\">${v_escape_html(gname)}</b>\n\t\t\t\t\t<span id=\"group-count-${cbid}-${v_idSafe(gname)}\"\n\t\t\t\t\t\tstyle=\"margin-left:8px;\">(0/${items.length})</span>\n\t\t\t\t</div>\n\t\t\t\t<ul id=\"group-${cbid}-${v_idSafe(gname)}\" class=\"v-group-list\" style=\"display:none\">\n\t\t\t`;\n\n\t\t\titems.forEach(item => {\n\t\t\t\thtml += `\n\t\t\t\t<li data-key=\"${item.key}\"\n\t\t\t\t\tdata-node-name=\"${v_escape_html(item.label.toLowerCase())}\"\n\t\t\t\t\tclass=\"v-group-item\">\n\t\t\t\t\t<span class=\"v-item-label\" title=\"${v_escape_html(item.label)}\">\n\t\t\t\t\t\t${v_escape_html(item.label)}\n\t\t\t\t\t</span>\n\t\t\t\t</li>`;\n\t\t\t});\n\n\t\t\thtml += `\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t\t`;\n\t\t});\n\n\t\tlistContainer.innerHTML = html;\n\n\t\twindow.v_dropdown_rendered[cbid] = true;\n\n\t\tv_adaptiveStyle(cbid);\n\t\tv_updateGroupCounts(cbid, listContainer, hiddenInput, searchInput);\n\n\t\t// 点击项（无组与组内项都使用 li[data-key]）\n\t\tlistContainer.addEventListener(\"click\", function(e){\n\t\t\tlet li = e.target;\n\t\t\twhile(li && li !== listContainer && !li.hasAttribute('data-key')) li = li.parentNode;\n\t\t\tif(!li || li === listContainer) return;\n\t\t\tconst key = li.getAttribute('data-key') || \"\";\n\t\t\tconst text = li.querySelector(\".v-item-label\")?.textContent || li.textContent || key;\n\n\t\t\tconst changed = key !== hiddenInput.value;\n\t\t\tif (changed) {\n\t\t\t\t//改值\n\t\t\t\thiddenInput.value = key;\n\t\t\t\tlabelSpan.textContent = v_ellipsisByWidth(cbid, text);\n\t\t\t\tlabelSpan.title = text;\n\t\t\t\tv_highlightSelectedItem(listContainer, hiddenInput);\n\t\t\t\tv_updateGroupCounts(cbid, listContainer, hiddenInput, searchInput);\n\t\t\t}\n\t\t\tv_closePanel(cbid,panel,listContainer,hiddenInput,searchInput,customInput);\n\t\t});\n\n\t\t// 搜索功能\n\t\tsearchInput.addEventListener(\"input\", function() {\n\t\t\tv_filterList(this.value, cbid, listContainer, hiddenInput, searchInput);\n\t\t\tv_repositionPanel(panel, display);\n\t\t});\n\t\tsearchInput.addEventListener('keydown', function(e) {\n\t\t\tconst isEnter = e.key === \"Enter\" || e.keyCode === 13;\n\t\t\tif (!isEnter) return;\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tsearchInput.blur();\n\t\t});\n\n\t\t// 切换组\n\t\tlistContainer.querySelectorAll(\".v-group-title\").forEach(title => {\n\t\t\ttitle.addEventListener(\"click\", function() {\n\t\t\t\tconst g = this.closest(\".v-group\")?.getAttribute(\"data-group\");\n\t\t\t\tif (g) {\n\t\t\t\t\tv_toggleGroup(listContainer, cbid, g);\n\t\t\t\t\tv_repositionPanel(panel, display);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t//自定义框\n\t\tcustomInput.addEventListener(\"keydown\", function(e){\n\t\t\tconst isEnter = e.key === \"Enter\" || e.keyCode === 13;\n\t\t\tif (!isEnter) return;\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tv_customEnter(cbid, labelSpan, hiddenInput, searchInput, panel, listContainer, customInput);\n\t\t});\n\n\t\t// 防止 panel 惯性滚动穿透\n\t\tpanel.addEventListener('wheel', function (e) {\n\t\t\tconst deltaY = e.deltaY;\n\t\t\tconst scrollTop = panel.scrollTop;\n\t\t\tconst scrollHeight = panel.scrollHeight;\n\t\t\tconst clientHeight = panel.clientHeight;\n\t\t\tconst isAtTop = scrollTop === 0;\n\t\t\tconst isAtBottom = scrollTop + clientHeight >= scrollHeight;\n\t\t\tif (deltaY < 0 && isAtTop) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (deltaY > 0 && isAtBottom) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.stopPropagation();\n\t\t}, { passive: false });\n\t}\n\n\t//截断display字符长度\n\twindow.v_labelSpan_maxWidth = {};\n\tfunction v_ellipsisByWidth(cbid, text) {\n\t\tconst el = document.getElementById(cbid + \".label\");\n\t\tif (!el || !text) return text;\n\t\ttext = text.trim();\n\t\tconst maxWidth = el.clientWidth;\n\t\twindow.v_labelSpan_maxWidth[cbid] = maxWidth;\n\t\tif (maxWidth <= 0) return text;\n\t\tconst style = window.getComputedStyle(el);\n\t\tconst font = [\n\t\t\tstyle.fontStyle,\n\t\t\tstyle.fontVariant,\n\t\t\tstyle.fontWeight,\n\t\t\tstyle.fontSize || '16px',\n\t\t\tstyle.fontFamily || 'sans-serif'\n\t\t].join(\" \").replace(/\\s+/g, ' ');\n\t\tconst canvas = v_ellipsisByWidth._canvas || (v_ellipsisByWidth._canvas = document.createElement(\"canvas\"));\n\t\tconst ctx = canvas.getContext(\"2d\");\n\t\tctx.font = font;\n\t\tif (ctx.measureText(text).width <= maxWidth) {\n\t\t\treturn text;\n\t\t}\n\t\tconst ellipsis = \"...\";\n\t\tconst ellipsisWidth = ctx.measureText(ellipsis).width;\n\t\tconst minChars = 15;\n\t\tconst probe = text.slice(0, minChars);\n\t\tconst probeWidth = ctx.measureText(probe).width;\n\t\tif (probeWidth + ellipsisWidth > maxWidth) {\n\t\t\treturn text;\n\t\t}\n\t\tlet left = 0;\n\t\tlet right = text.length;\n\t\tlet result = ellipsis;\n\t\twhile (left <= right) {\n\t\t\tconst mid = (left + right) >> 1;\n\t\t\tconst substr = text.slice(0, mid);\n\t\t\tconst w = ctx.measureText(substr).width;\n\t\t\tif (w + ellipsisWidth <= maxWidth) {\n\t\t\t\tresult = substr + ellipsis;\n\t\t\t\tleft = mid + 1;\n\t\t\t} else {\n\t\t\t\tright = mid - 1;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tconst v_adaptiveControls = new Set();\n\tfunction v_registerAdaptive(cbid) {\n\t\tv_adaptiveControls.add(cbid);\n\t\tv_adaptiveStyle(cbid);\n\t}\n\tfunction v_labelSpanResize(cbid) {\n\t\tconst el = document.getElementById(cbid + \".label\");\n\t\tif (!el) return;\n\t\tconst maxWidth = el.clientWidth;\n\t\tif (window.v_labelSpan_maxWidth[cbid] == maxWidth) return;\n\t\tlet text = el.title;\n\t\tel.textContent = v_ellipsisByWidth(cbid, text);\n\t}\n\tlet v_adaptiveTicking = false;\n\twindow.addEventListener(\"resize\", () => {\n\t\tif (!v_adaptiveTicking) {\n\t\t\tv_adaptiveTicking = true;\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tv_adaptiveControls.forEach(cbid => {\n\t\t\t\t\tv_adaptiveStyle(cbid);\n\t\t\t\t\tv_labelSpanResize(cbid);\n\t\t\t\t});\n\t\t\t\tv_adaptiveTicking = false;\n\t\t\t});\n\t\t}\n\t});\n//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/cbi/optimize_cbi_ui.htm",
    "content": "<script type=\"text/javascript\">\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t\tsetTimeout(updateElements, 200);\n\t\tfunction updateElements() {\n\t\t\t//修正上移、下移按钮名称\n\t\t\tdocument.querySelectorAll(\"input.btn.cbi-button.cbi-button-up\").forEach(function(btn) {\n\t\t\t\tbtn.value = \"<%:Move up%>\";\n\t\t\t});\n\t\t\tdocument.querySelectorAll(\"input.btn.cbi-button.cbi-button-down\").forEach(function(btn) {\n\t\t\t\tbtn.value = \"<%:Move down%>\";\n\t\t\t});\n\t\t\t//删除控件和说明之间的多余换行\n\t\t\tdocument.querySelectorAll(\"div.cbi-value-description\").forEach(function(descDiv) {\n\t\t\t\tvar prev = descDiv.previousSibling;\n\t\t\t\twhile (prev && prev.nodeType === Node.TEXT_NODE && prev.textContent.trim() === \"\") {\n\t\t\t\t\tprev = prev.previousSibling;\n\t\t\t\t}\n\t\t\t\tif (prev && prev.nodeType === Node.ELEMENT_NODE && prev.tagName === \"BR\") {\n\t\t\t\t\tprev.remove();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/global/backup.htm",
    "content": "<%\nlocal api = require \"luci.passwall.api\"\n-%>\n\n<div class=\"cbi-section\">\n\t<h3><%:Backup and Restore%></h3>\n\t<div class=\"cbi-section-descr\">\n\t\t<%:Backup or Restore Client and Server Configurations.%>\n\t\t<br>\n\t\t<font color=\"red\"><%:Note: Restoring configurations across different versions may cause compatibility issues.%></font>\n\t</div>\n</div>\n\n<div class=\"cbi-value\" id=\"_backup_div\">\n\t<label class=\"cbi-value-title\"><%:Create Backup File%></label>\n\t<div class=\"cbi-value-field\">\n\t\t<input class=\"btn cbi-button cbi-button-save\" type=\"button\" onclick=\"dl_backup()\" value=\"<%:DL Backup%>\" />\n\t</div>\n</div>\n\n<div class=\"cbi-value\" id=\"_upload_div\">\n\t<label class=\"cbi-value-title\"><%:Restore Backup File%></label>\n\t<div class=\"cbi-value-field\">\n\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" onclick=\"show_upload_win()\" value=\"<%:RST Backup%>\" />\n\t</div>\n</div>\n\n<div class=\"cbi-value\" id=\"_reset_div\">\n\t<label class=\"cbi-value-title\"><%:Restore to default configuration%></label>\n\t<div class=\"cbi-value-field\">\n\t\t<input class=\"btn cbi-button cbi-button-reset\" type=\"button\" onclick=\"do_reset()\" value=\"<%:Do Reset%>\" />\n\t</div>\n</div>\n\n<div class=\"cbi-value\"></div>\n\n<div id=\"upload-modal\" class=\"up-modal\" style=\"display:none;\">\n\t<div class=\"up-modal-content\">\n\t\t<h3><%:Restore Backup File%></h3>\n\t\t<div class=\"up-cbi-value-field\">\n\t\t\t<input class=\"cbi-input-file\" type=\"file\" id=\"ulfile\" accept=\".tar.gz\" />\n\t\t</div>\n\t\t<div class=\"up-button-container\">\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" id=\"upload-btn\" onclick=\"do_upload()\" value=\"<%:UL Restore%>\" />\n\t\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"close_upload_win()\" value=\"<%:CLOSE WIN%>\" />\n\t\t</div>\n\t</div>\n</div>\n\n<style>\n\t.up-modal {\n\t\tposition: fixed;\n\t\tleft: 50%;\n\t\ttop: 50%;\n\t\ttransform: translate(-50%, -50%);\n\t\tbackground: white;\n\t\tpadding: 20px;\n\t\tborder: 2px solid #ccc;\n\t\tborder-radius: 5px;\n\t\tbox-shadow: 0 0 10px rgba(0,0,0,0.5);\n\t\tz-index: 1000;\n\t\twidth: 90%;\n\t\tmax-width: 400px;\n\t}\n\n\t.up-modal-content {\n\t\twidth: 100%;\n\t\tmax-width: 400px;\n\t\ttext-align: center;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t}\n\n\t.up-button-container {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\twidth: 100%;\n\t\tmax-width: 250px;\n\t}\n\n\t.up-cbi-value-field {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\twidth: 100%;\n\t\tmargin-top: 15px;\n\t\tmargin-bottom: 30px;\n\t}\n\n\t.up-modal h3 {\n\t\tbackground: inherit;\n\t}\n</style>\n\n<script>\n\tfunction getBg(el) {\n\t\tif (!el) return null;\n\t\tconst style = getComputedStyle(el);\n\t\tconst bgImage = style.backgroundImage;\n\t\tconst bgColor = style.backgroundColor;\n\t\treturn (bgImage !== 'none' || !/rgba\\([^,]+,[^,]+,[^,]+,\\s*0\\)/.test(bgColor) && bgColor !== 'transparent')\n\t\t\t? style.background\n\t\t\t: null;\n\t};\n\n\tfunction show_upload_win(btn) {\n\t\tconst uploadDiv = document.getElementById(\"upload-modal\");\n\t\tuploadDiv.style.background = getBg(document.querySelector('.cbi-section')) || getBg(document.body) || '';\n\t\tuploadDiv.style.display = \"block\";\n\t\tdocument.getElementById(\"ulfile\").focus();\n\t}\n\n\tfunction close_upload_win(btn) {\n\t\tdocument.getElementById(\"ulfile\").value = \"\";\n\t\tdocument.getElementById(\"upload-modal\").style.display = \"none\";\n\t}\n\n\tfunction dl_backup(btn) {\n\t\tfetch('<%= api.url(\"create_backup\") %>', {\n\t\t\tmethod: 'POST'\n\t\t})\n\t\t.then(response => {\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(\"备份失败！\");\n\t\t\t}\n\t\t\tconst filename = response.headers.get(\"X-Backup-Filename\");\n\t\t\tif (!filename) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn response.blob().then(blob => ({ blob, filename }));\n\t\t})\n\t\t.then(result => {\n\t\t\tif (!result) return;\n\t\t\tconst { blob, filename } = result;\n\t\t\tconst url = window.URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement(\"a\");\n\t\t\ta.href = url;\n\t\t\ta.download = filename;\n\t\t\tdocument.body.appendChild(a);\n\t\t\ta.click();\n\t\t\ta.remove();\n\t\t\twindow.URL.revokeObjectURL(url);\n\t\t})\n\t\t.catch(error => alert(error.message));\n\t}\n\n\tfunction do_reset(btn) {\n\t\tif (confirm(\"<%: Do you want to restore the client to default settings?%>\")) {\n\t\t\tsetTimeout(function () {\n\t\t\t\tif (confirm(\"<%: Are you sure you want to restore the client to default settings?%>\")) {\n\t\t\t\t\tvar xhr1 = new XMLHttpRequest();\n\t\t\t\t\txhr1.open(\"GET\",'<%= api.url(\"clear_log\") %>', false);\n\t\t\t\t\txhr1.send(); \n\t\t\t\t\tvar xhr2 = new XMLHttpRequest();\n\t\t\t\t\txhr2.open(\"GET\",'<%= api.url(\"reset_config\") %>', false);\n\t\t\t\t\txhr2.send(); \n\t\t\t\t\twindow.location.href = '<%= api.url(\"log\") %>'\n\t\t\t\t}\n\t\t\t}, 1000);\n\t\t}\n\t}\n\n\tfunction do_upload(btn) {\n\t\tconst fileInput = document.getElementById(\"ulfile\");\n\t\tconst file = fileInput.files[0];\n\t\tif (!file) {\n\t\t\talert(\"<%:Please select a file first.%>\");\n\t\t\treturn;\n\t\t}\n\t\tif (!file.name.endsWith(\".tar.gz\")) {\n\t\t\talert(\"<%:Invalid file type. Please upload a .tar.gz file.%>\");\n\t\t\tfileInput.value = \"\";\n\t\t\treturn;\n\t\t}\n\t\tconst maxSize = 10 * 1024 * 1024; // 10MB\n\t\tif (file.size > maxSize) {\n\t\t\talert(\"<%:File size exceeds 10MB limit.%>\");\n\t\t\tfileInput.value = \"\";\n\t\t\treturn;\n\t\t}\n\n\t\tconst reader = new FileReader();\n\t\treader.onload = function (e) {\n\t\t\tconst binaryString = e.target.result; // ArrayBuffer\n\t\t\tconst binary = new Uint8Array(binaryString);\n\t\t\tlet binaryText = \"\";\n\t\t\tfor (let i = 0; i < binary.length; i++) {\n\t\t\t\tbinaryText += String.fromCharCode(binary[i]);\n\t\t\t}\n\n\t\t\tconst base64Data = btoa(binaryText);\n\n\t\t\tconst targetByteSize = 64 * 1024; // 分片大小 64KB\n\t\t\tlet chunkSize = Math.floor(targetByteSize * 4 / 3);\n\t\t\tchunkSize = chunkSize + (4 - (chunkSize % 4)) % 4;\n\t\t\tconst totalChunks = Math.ceil(base64Data.length / chunkSize);\n\t\t\tlet currentChunk = 0;\n\n\t\t\tfunction sendNextChunk() {\n\t\t\t\tif (currentChunk < totalChunks) {\n\t\t\t\t\tconst chunk = base64Data.substring(currentChunk * chunkSize, (currentChunk + 1) * chunkSize);\n\t\t\t\t\tconst xhr = new XMLHttpRequest();\n\t\t\t\t\txhr.open(\"POST\", '<%= api.url(\"restore_backup\") %>', true);\n\t\t\t\t\txhr.onreadystatechange = function () {\n\t\t\t\t\t\tif (xhr.readyState === 4) {\n\t\t\t\t\t\t\tif (xhr.status === 200) {\n\t\t\t\t\t\t\t\tconst resp = JSON.parse(xhr.responseText);\n\t\t\t\t\t\t\t\tif (resp.status === \"success\") {\n\t\t\t\t\t\t\t\t\tcurrentChunk++;\n\t\t\t\t\t\t\t\t\tdocument.getElementById(\"upload-btn\").value = \"Uploading... \" + Math.floor((currentChunk / totalChunks) * 100) + \"%\";\n\t\t\t\t\t\t\t\t\tsendNextChunk();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\talert(\"Upload error: \" + resp.message);\n\t\t\t\t\t\t\t\t\tdocument.getElementById(\"upload-btn\").value = \"<%:UL Restore%>\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\talert(\"Upload failed with status \" + xhr.status);\n\t\t\t\t\t\t\t\tdocument.getElementById(\"upload-btn\").value = \"<%:UL Restore%>\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tconst formData = new FormData();\n\t\t\t\t\tformData.append(\"filename\", file.name);\n\t\t\t\t\tformData.append(\"chunk\", chunk);\n\t\t\t\t\tformData.append(\"chunk_index\", currentChunk);\n\t\t\t\t\tformData.append(\"total_chunks\", totalChunks);\n\t\t\t\t\txhr.send(formData);\n\t\t\t\t} else {\n\t\t\t\t\t//alert(\"Upload completed.\");\n\t\t\t\t\tdocument.getElementById(\"upload-btn\").value = \"<%:UL Restore%>\";\n\t\t\t\t\twindow.location.href = '<%= api.url(\"log\") %>'\n\t\t\t\t}\n\t\t\t}\n\t\t\tsendNextChunk();\n\t\t};\n\t\treader.readAsArrayBuffer(file);\n\t}\n\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/global/faq.htm",
    "content": "<%\nlocal api = require \"luci.passwall.api\"\n-%>\n<style>\n    .dns-con {\n      padding: 1rem;\n    }\n    .faq-title {\n      color: var(--primary);\n      font-weight: bolder;\n      margin-bottom: 0.5rem;\n      display: inline-block;\n    }\n    .reset-title {\n     color: var(--primary)；\n     font-weight: bolder;\n     margin-bottom: 0.3rem;\n     display: inline-block;\n     margin-top: 1.2rem;\n     text-decoration: underline;\n    }\n    .dns-item {\n     margin-bottom: 0.8rem;\n     line-height:1.2rem;\n    }\n    .dns-list {\n\t\ttext-indent:1rem;\n\t\tline-height: 1.2rem;\n}\n</style>\n<div class=\"dns-con\">\n\t<div id=\"faq_dns\">\n\t\t<ul>\n            <b class=\"faq-title\"><%:DNS related issues:%></b>\n\t\t\t<li class=\"dns-item\">1. <span><%:Certain browsers such as Chrome have built-in DNS service, which may affect DNS resolution settings. You can go to 'Settings -> Privacy and security -> Use secure DNS' menu to turn it off.%></span></li>\n\t\t\t<li class=\"dns-item\">2. <span><%:If you are unable to access the internet after reboot, please try clearing the cache of your terminal devices (make sure to close all open browser application windows first, this step is especially important):%></span>\n\t\t\t    <ul><li class=\"dns-list\"> ◦ <span><%:For Windows systems, open Command Prompt and run the command 'ipconfig /flushdns'.%></span></li>\n\t\t\t        <li class=\"dns-list\"> ◦ <span><%:For Mac systems, open Terminal and run the command 'sudo killall -HUP mDNSResponder'.%></span></li>\n\t\t\t        <li class=\"dns-list\"> ◦ <span><%:For mobile devices, you can clear it by reconnecting to the network, such as toggling Airplane Mode and reconnecting to WiFi.%></span></li>\n\t\t\t    </ul>\n\t\t\t</li>\n\t\t\t<li class=\"dns-item\">3. <span><%:Please make sure your device's network settings point both the DNS server and default gateway to this router, to ensure DNS queries are properly routed.%></span></li>\n\t\t</ul>\n\t</div>\n\t<div id=\"faq_reset\"></div>\n</div>\n\n<script>\n\tvar origin = window.location.origin;\n\tvar hide_url = origin + \"<%=api.url(\"hide\")%>\";\n\tvar show_url = origin + \"<%=api.url(\"show\")%>\";\n\t\n\tfunction hide(url) {\n\t\tif (confirm('<%:Are you sure to hide?%>') == true) {\n\t\t\twindow.location.href = hide_url;\n\t\t}\n\t}\n\t\n\tvar dom = document.getElementById(\"faq_reset\");\n    if (dom) {\n\t\tvar li = \"\";\n\t\tli += \"<a href='#' class='reset-title' onclick='hide()'>\" + \"<%: Hide in main menu:%>\"+ \"</a>\" + \"<br />\" + \"<%: Browser access: %>\" + \"<a href='#' onclick='hide()'>\" + hide_url + \"</a>\" + \"<br />\";\n\t\tli += \"<a href='#' class='reset-title'>\" + \"<%: Show in main menu:%>\"+ \"</a>\" + \"<br />\" +\"<%: Browser access: %>\" + \"<a href='#'>\" + show_url + \"</a>\" + \"<br />\";\n\t\tdom.innerHTML = li;\n\t}\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/global/footer.htm",
    "content": "<%\nlocal api = self.api\nlocal appname = api.appname\n-%>\n<style>\n #cbi-<%=appname%>-socks .td.cbi-value-field > div { \n\twhite-space: nowrap;\n}\n@media (max-width: 1152px) {\n\t #cbi-<%=appname%>-socks .td.cbi-value-field > div {\n\t\twhite-space: normal;\n\t}\n}\n\n.shunt-tab-hidden {\n\tdisplay: none !important;\n\tvisibility: hidden !important;\n}\n\n@media screen and (max-width: 1152px) {\n\t#cbi-<%=appname%>-socks .cbi-section-table-titles {\n\t\tdisplay: none !important;\n\t}\n}\n\n@media screen and (min-width: 1152px) {\n\t#cbi-<%=appname%>-socks input[id*=\".<%=appname%>.\"][id$=\".port\"],\n\t#cbi-<%=appname%>-socks input[id*=\".<%=appname%>.\"][id$=\".http_port\"] {\n\t\twidth: 100px !important;\n\t\tmin-width: unset !important;\n\t\tmax-width: unset !important;\n\t\ttext-align: center !important;\n\t}\n}\n</style>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tvar shunt_list = JSON.parse('<%=self.shunt_list%>');\n\n\tfunction to_edit_node(btn) {\n\t\tif (!btn) return;\n\t\tconst idReg = /^cbid\\.<%=appname%>\\..*node$/;\n\t\tlet hidden_select = null;\n\t\tconst container = btn.closest('#cbi-<%=appname%>-global') || btn.closest('#cbi-<%=appname%>-socks');\n\t\tif (!container) return null;\n\t\tconst selects = container.querySelectorAll('select[id^=\"cbid.<%=appname%>.\"]');\n\t\tfor (const sel of selects) {\n\t\t\tif ( idReg.test(sel.id) && getComputedStyle(sel).display === \"none\" && (sel.compareDocumentPosition(btn) & Node.DOCUMENT_POSITION_FOLLOWING)) {\n\t\t\t\thidden_select = sel;\n\t\t\t}\n\t\t}\n\t\tif (!hidden_select) return;\n\t\tlet node_select_value = hidden_select ? hidden_select.options[0].value : \"\";\n\t\tlet to_url = '<%=api.url(\"node_config\")%>/' + node_select_value;\n\t\tif (node_select_value.indexOf(\"Socks_\") === 0) {\n\t\t\tto_url = '<%=api.url(\"socks_config\")%>/' + node_select_value.substring(\"Socks_\".length);\n\t\t}\n\t\tlocation.href = to_url;\n\t}\n\n\tfunction go() {\n\t\tvar _status = document.getElementsByClassName('_status');\n\t\tfor (var i = 0; i < _status.length; i++) {\n\t\t\tvar id = _status[i].getAttribute(\"socks_id\");\n\t\t\tXHR.get('<%=api.url(\"socks_status\")%>', {\n\t\t\t\t\tindex: i,\n\t\t\t\t\tid: id\n\t\t\t\t},\n\t\t\t\tfunction(x, result) {\n\t\t\t\t\tvar index = result.index;\n\t\t\t\t\tvar div = '';\n\t\t\t\t\tvar div1 = '<font style=\"font-weight:bold;\" color=\"green\">✓</font>&nbsp';\n\t\t\t\t\tvar div2 = '<font style=\"font-weight:bold;\" color=\"red\">X</font>&nbsp';\n\n\t\t\t\t\tif (result.socks_status) {\n\t\t\t\t\t\tdiv += div1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdiv += div2;\n\t\t\t\t\t}\n\t\t\t\t\tif (result.use_http) {\n\t\t\t\t\t\tif (result.http_status) {\n\t\t\t\t\t\t\tdiv += div1;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdiv += div2;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t_status[index].innerHTML = div;\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tvar global_id = null;\n\t\tvar global = document.getElementById(\"cbi-<%=appname%>-global\");\n\t\tif (global) {\n\t\t\tvar node = global.getElementsByClassName(\"cbi-section-node\")[0];\n\t\t\tvar node_id = node.getAttribute(\"id\");\n\t\t\tglobal_id = node_id;\n\t\t\tvar all_node = node.querySelectorAll(\"[id]\");\n\t\t\t//var reg1 = /^cbid\\..*node\\.main$/;\n\t\t\tvar reg1 = /^cbid\\..*\\.(tcp_node|udp_node)\\.main$/;\n\n\t\t\tfor (var i = 0; i < all_node.length; i++) {\n\t\t\t\tvar el = all_node[i];\n\t\t\t\tif (!reg1.test(el.id)) continue;\n\n\t\t\t\tvar node_select = el;\n\t\t\t\tif (!node_select) continue;\n\t\t\t\tvar cbid = el.id.replace(/\\.main$/, \"\");\n\t\t\t\tvar hidden_select = document.getElementById(cbid);\n\t\t\t\tvar node_select_value = hidden_select ? hidden_select.options[0].value : \"\";\n\t\t\t\tif (!node_select_value || node_select_value === \"\" || node_select_value.indexOf(\"tcp\") === 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tvar html = '<a href=\"#\" onclick=\"return to_edit_node(this);\"><%:Edit%></a>';\n\n\t\t\t\tvar m = cbid.match(/\\.(tcp|udp)_node$/);\n\t\t\t\tif (m && (m[1] === \"tcp\" || m[1] === \"udp\")) {\n\t\t\t\t\thtml += '<a href=\"#\" onclick=\"window.open(\\'' + '<%=api.url(\"get_redir_log\")%>?name=default&proto=' + m[1] + '\\', \\'_blank\\')\"><%:Log%></a>';\n\t\t\t\t}\n\n\t\t\t\tnode_select.insertAdjacentHTML(\"beforeend\",\n\t\t\t\t\t'<div class=\"node-actions\" style=\"display:inline-flex; align-items:center; gap:4px; flex-wrap:wrap; margin-left:4px;\">'  \n\t\t\t\t\t+ html + '</div>'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tvar socks = document.getElementById(\"cbi-<%=appname%>-socks\");\n\t\tif (socks) {\n\t\t\tvar socks_enabled_dom = document.getElementById(global_id + \"-socks_enabled\");\n\t\t\tsocks_enabled_dom.parentNode.removeChild(socks_enabled_dom);\n\t\t\tvar descr = socks.getElementsByClassName(\"cbi-section-descr\")[0];\n\t\t\tdescr.outerHTML = socks_enabled_dom.outerHTML;\n\t\t\trows = socks.getElementsByClassName(\"cbi-section-table-row\");\n\t\t\tfor (var i = 0; i < rows.length; i++) {\n\t\t\t\ttry {\n\t\t\t\t\tvar row = rows[i];\n\t\t\t\t\tvar id = row.id;\n\t\t\t\t\tif (!id) continue;\n\t\t\t\t\tvar dom_id = id + \"-node\";\n\t\t\t\t\tvar cbid = dom_id.replace(\"cbi-\", \"cbid-\").replace(new RegExp(\"-\", 'g'), \".\");\n\t\t\t\t\tdom_id = cbid + \".main\";\n\t\t\t\t\tvar node_select = document.getElementById(dom_id);\n\t\t\t\t\tif (!node_select) continue;\n\n\t\t\t\t\tvar html = '<a href=\"#\" onclick=\"return to_edit_node(this);\"><%:Edit%></a>';\n\t\t\t\t\thtml += '<a href=\"#\" onclick=\"window.open(\\'' + '<%=api.url(\"get_socks_log\")%>?name=' + id.replace(\"cbi-<%=appname%>-\", \"\") + '\\', \\'_blank\\')\"><%:Log%></a>';\n\n\t\t\t\t\tnode_select.insertAdjacentHTML(\"afterend\",\n\t\t\t\t\t\t'<div class=\"node-actions\" style=\"display:inline-flex; align-items:center; gap:4px; flex-wrap:wrap; margin-left:4px;\">'  \n\t\t\t\t\t\t+ html + '</div>'\n\t\t\t\t\t);\n\t\t\t\t} catch(err) {\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\t(function () {\n\t\tlet lastCount = 0;\n\t\tlet stableTimes = 0;\n\t\tconst STABLE_THRESHOLD = 5;\n\t\tfunction waitStable() {\n\t\t\tconst list = document.querySelectorAll('[id^=\"cbid.<%=appname%>.\"][id$=\"node.main\"]');\n\t\t\tconst count = list.length;\n\t\t\tif (count === lastCount && count > 0) {\n\t\t\t\tstableTimes++;\n\t\t\t} else {\n\t\t\t\tstableTimes = 0;\n\t\t\t\tlastCount = count;\n\t\t\t}\n\t\t\tif (stableTimes >= STABLE_THRESHOLD) {\n\t\t\t\tgo();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\trequestAnimationFrame(waitStable);\n\t\t}\n\t\twaitStable();\n\t})();\n\n\t(function () {\n\t\tconst startTime = Date.now();\n\t\tconst TIMEOUT = 3000;\n\n\t\tconst waitForDnsSelect = () => {\n\t\t\tconst dns_select = document.querySelector(\"select[id*='dns_shunt']\");\n\t\t\tif (dns_select) {\n\t\t\t\tinitDnsSelect(dns_select);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (Date.now() - startTime >= TIMEOUT) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\trequestAnimationFrame(waitForDnsSelect);\n\t\t};\n\t\twaitForDnsSelect();\n\n\t\tconst initDnsSelect = (dns_select) => {\n\t\t\tif (dns_select.value === \"chinadns-ng\") {\n\t\t\t\taddLogLink(dns_select);\n\t\t\t}\n\t\t\tif (dns_select._dnsLogBinded) return;\n\t\t\tdns_select._dnsLogBinded = true;\n\n\t\t\tdns_select.addEventListener(\"change\", () => {\n\t\t\t\tconst existingLogLink = dns_select.parentElement.querySelector(\"a.dns-log-link\");\n\t\t\t\tif (existingLogLink) {\n\t\t\t\t\texistingLogLink.remove();\n\t\t\t\t}\n\t\t\t\tif (dns_select.value === \"chinadns-ng\") {\n\t\t\t\t\taddLogLink(dns_select);\n\t\t\t\t}\n\t\t\t});\n\t\t};\n\n\t\tconst addLogLink = (select) => {\n\t\t\tif (select.parentElement.querySelector(\"a.dns-log-link\")) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst logLink = document.createElement(\"a\");\n\t\t\tlogLink.innerHTML = \"<%:Log%>\";\n\t\t\tlogLink.href = \"#\";\n\t\t\tlogLink.className = \"dns-log-link\";\n\t\t\tlogLink.style.marginLeft = \"10px\";\n\t\t\tlogLink.setAttribute(\"onclick\", \"window.open('\" + '<%=api.url(\"get_chinadns_log\")%>' + \"?flag=default', '_blank')\");\n\t\t\tselect.insertAdjacentElement(\"afterend\", logLink);\n\t\t};\n\t})();\n\n\tdocument.addEventListener(\"DOMContentLoaded\", () => setTimeout(() => {\n\t\tconst hiddenSelect = document.getElementById(\"cbid.<%=appname%>.<%=self.global_cfgid%>.tcp_node\");\n\t\tlet o_val = hiddenSelect.value\n\t\tconst o_hasItem = shunt_list.find(element => element.id == o_val);\n\t\thiddenSelect.addEventListener(\"change\", function(el){\n\t\t\tlet new_val = el.target.value\n\t\t\tconst new_hasItem = shunt_list.find(element => element.id == new_val);\n\t\t\tif (new_hasItem) {\n\t\t\t\tXHR.get('<%=api.url(\"update_node\")%>', {\n\t\t\t\t\tid: \"<%=self.global_cfgid%>\",\n\t\t\t\t\tdata: JSON.stringify({\n\t\t\t\t\t\ttcp_node: new_val\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tfunction(x, data) {\n\t\t\t\t\tif (x && x.status == 200 && data.code == 1) {\n\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\talert(\"<%:Error%>\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tdocument.getElementById(\"tab.<%=appname%>.<%=self.global_cfgid%>.Shunt\").classList.add('shunt-tab-hidden');\n\t\t\t\t\tdocument.getElementById(\"tab.<%=appname%>.<%=self.global_cfgid%>.Shunt\").style.display = \"none\";\n\t\t\t\t} catch (error) {}\n\t\t\t\ttry {\n\t\t\t\t\tdocument.querySelector('li[data-tab*=\"Shunt\"]').classList.add('shunt-tab-hidden');\n\t\t\t\t\tdocument.querySelector('li[data-tab*=\"Shunt\"]').style.display = \"none\";\n\t\t\t\t} catch (error) {}\n\t\t\t}\n\t\t});\n\t\tlet shunt_taboption = document.getElementById(\"container.<%=appname%>.<%=self.global_cfgid%>.Shunt\");\n\t\tif (shunt_taboption) {\n\t\t\tlet shunt_option_list = document.getElementById(\"cbi-<%=appname%>-shunt_option_list\");\n\t\t\tif (shunt_option_list) {\n\t\t\t\tshunt_taboption.appendChild(shunt_option_list);\n\t\t\t}\n\t\t}\n\t}, 100));\n\t//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/global/proxy.htm",
    "content": "<div class=\"cbi-value\" id=\"cbi-<%=self.config..\"-\"..section..\"-\"..self.option%>\" data-index=\"<%=self.index%>\" data-depends=\"<%=pcdata(self:deplist2json(section))%>\">\n\t<label class=\"cbi-value-title\">\n\t\t<%:Switch Mode%>\n\t</label>\n\t<div class=\"cbi-value-field\">\n\t\t<div>\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" onclick=\"switch_gfw_mode()\" value=\"<%:GFW List%>\" />\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" onclick=\"switch_chnroute_mode()\" value=\"<%:Not China List%>\" />\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" onclick=\"switch_returnhome_mode()\" value=\"<%:China List%>\" />\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" onclick=\"switch_global_mode()\" value=\"<%:Global Proxy%>\" />\n\t\t</div>\n\t</div>\n</div>\n\n<script>\n\tvar opt = {\n\t\tbase: 'cbid.passwall.<%=self.cfgid or section%>',\n\t\tclient: true,\n\t\tget: function (opt) {\n\t\t\tvar obj;\n\t\t\tvar id = this.base + '.' + opt;\n\t\t\tobj = document.getElementsByName(id)[0] || document.getElementById(id);\n\t\t\tif (obj) {\n\t\t\t\tvar combobox = document.getElementById('cbi.combobox.' + id);\n\t\t\t\tif (combobox) {\n\t\t\t\t\tobj.combobox = combobox;\n\t\t\t\t}\n\t\t\t\tvar div = document.getElementById(id);\n\t\t\t\tif (div && div.getElementsByTagName(\"li\").length > 0) {\n\t\t\t\t\tobj = div;\n\t\t\t\t}\n\t\t\t\treturn obj;\n\t\t\t} else {\n\t\t\t\treturn null;\n\t\t\t}\n\t\t},\n\t\tset: function (opt, val) {\n\t\t\tvar obj;\n\t\t\tobj = this.get(opt);\n\t\t\tif (obj) {\n\t\t\t\tvar event = document.createEvent(\"HTMLEvents\");\n\t\t\t\tevent.initEvent(\"change\", true, true);\n\t\t\t\tif (obj.type === 'checkbox') {\n\t\t\t\t\tobj.checked = val;\n\t\t\t\t} else {\n\t\t\t\t\tobj.value = val;\n\t\t\t\t\tif (obj.combobox) {\n\t\t\t\t\t\tobj.combobox.value = val;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar list = obj.getElementsByTagName(\"li\");\n\t\t\t\t\tif (list.length > 0) {\n\t\t\t\t\t\tfor (var i = 0; i < list.length; i++) {\n\t\t\t\t\t\t\tvar li = list[i];\n\t\t\t\t\t\t\tvar data = li.getAttribute(\"data-value\");\n\t\t\t\t\t\t\tli.removeAttribute(\"selected\");\n\t\t\t\t\t\t\tli.removeAttribute(\"display\");\n\t\t\t\t\t\t\tif (data && data == val) {\n\t\t\t\t\t\t\t\tli.setAttribute(\"selected\", true);\n\t\t\t\t\t\t\t\tli.setAttribute(\"display\", \"0\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar input = document.getElementsByName(obj.id)[0];\n\t\t\t\t\t\tif (input) {\n\t\t\t\t\t\t\tinput.value = val;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar input = document.createElement(\"input\");\n\t\t\t\t\t\t\tinput.setAttribute(\"type\", \"hidden\");\n\t\t\t\t\t\t\tinput.setAttribute(\"name\", obj.id);\n\t\t\t\t\t\t\tinput.setAttribute(\"value\", val);\n\t\t\t\t\t\t\tobj.appendChild(input);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttry {\n\t\t\t\t\tobj.dispatchEvent(event);\n\t\t\t\t} catch (err) {\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\tfunction switch_gfw_mode() {\n\t\topt.set(\"use_gfw_list\", true);\n\t\topt.set(\"chn_list\", \"0\");\n\t\topt.set(\"tcp_proxy_mode\", \"disable\");\n\t\topt.set(\"udp_proxy_mode\", \"disable\");\n\t}\n\t\n\tfunction switch_chnroute_mode() {\n\t\topt.set(\"use_gfw_list\", true);\n\t\topt.set(\"chn_list\", \"direct\");\n\t\topt.set(\"tcp_proxy_mode\", \"proxy\");\n\t\topt.set(\"udp_proxy_mode\", \"proxy\");\n\t}\n\t\n\tfunction switch_returnhome_mode() {\n\t\topt.set(\"use_gfw_list\", false);\n\t\topt.set(\"chn_list\", \"proxy\");\n\t\topt.set(\"tcp_proxy_mode\", \"disable\");\n\t\topt.set(\"udp_proxy_mode\", \"disable\");\n\t}\n\t\n\tfunction switch_global_mode() {\n\t\topt.set(\"use_gfw_list\", false);\n\t\topt.set(\"chn_list\", \"0\");\n\t\topt.set(\"tcp_proxy_mode\", \"proxy\");\n\t\topt.set(\"udp_proxy_mode\", \"proxy\");\n\t}\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/global/status.htm",
    "content": "<%\nlocal api = require \"luci.passwall.api\"\n-%>\n\n<style>\n/*!\nPure v1.0.1\nCopyright 2013 Yahoo!\nLicensed under the BSD License.\nhttps://github.com/pure-css/pure/blob/master/LICENSE.md\n*/\n.pure-g{letter-spacing:-.31em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,\"Droid Sans\",Helvetica,Arial,sans-serif;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-align-content:flex-start;-ms-flex-line-pack:start;align-content:flex-start}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active) {table .pure-g{display:block}}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class*=pure-u]{font-family:-apple-system,BlinkMacSystemFont,sans-serif}.pure-u-1,.pure-u-1-1,.pure-u-1-12,.pure-u-1-2,.pure-u-1-24,.pure-u-1-3,.pure-u-1-4,.pure-u-1-5,.pure-u-1-6,.pure-u-1-8,.pure-u-10-24,.pure-u-11-12,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-2-24,.pure-u-2-3,.pure-u-2-5,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24,.pure-u-3-24,.pure-u-3-4,.pure-u-3-5,.pure-u-3-8,.pure-u-4-24,.pure-u-4-5,.pure-u-5-12,.pure-u-5-24,.pure-u-5-5,.pure-u-5-6,.pure-u-5-8,.pure-u-6-24,.pure-u-7-12,.pure-u-7-24,.pure-u-7-8,.pure-u-8-24,.pure-u-9-24{display:inline-block;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%}.pure-u-1-12,.pure-u-2-24{width:8.3333%}.pure-u-1-8,.pure-u-3-24{width:12.5%}.pure-u-1-6,.pure-u-4-24{width:16.6667%}.pure-u-1-5{width:20%}.pure-u-5-24{width:20.8333%}.pure-u-1-4,.pure-u-6-24{width:25%}.pure-u-7-24{width:29.1667%}.pure-u-1-3,.pure-u-8-24{width:33.3333%}.pure-u-3-8,.pure-u-9-24{width:37.5%}.pure-u-2-5{width:40%}.pure-u-10-24,.pure-u-5-12{width:41.6667%}.pure-u-11-24{width:45.8333%}.pure-u-1-2,.pure-u-12-24{width:50%}.pure-u-13-24{width:54.1667%}.pure-u-14-24,.pure-u-7-12{width:58.3333%}.pure-u-3-5{width:60%}.pure-u-15-24,.pure-u-5-8{width:62.5%}.pure-u-16-24,.pure-u-2-3{width:66.6667%}.pure-u-17-24{width:70.8333%}.pure-u-18-24,.pure-u-3-4{width:75%}.pure-u-19-24{width:79.1667%}.pure-u-4-5{width:80%}.pure-u-20-24,.pure-u-5-6{width:83.3333%}.pure-u-21-24,.pure-u-7-8{width:87.5%}.pure-u-11-12,.pure-u-22-24{width:91.6667%}.pure-u-23-24{width:95.8333%}.pure-u-1,.pure-u-1-1,.pure-u-24-24,.pure-u-5-5{width:100%}\n\t.block {\n\t\tmargin: 0.5rem;\n\t\tpadding: 0;\n\t\tfont-weight: normal;\n\t\tfont-style: normal;\n\t\tline-height: 1;\n\t\tfont-family: inherit;\n\t\tmin-width: inherit;\n\t\toverflow-x: auto;\n\t\toverflow-y: hidden;\n\t\tborder: 1px solid rgba(0,0,0,.05);\n\t\tborder-radius: .375rem;\n\t\tbox-shadow: 0 0 2rem 0 rgba(136,152,170,.15);\n\t}\n\t.img-con {\n\t\tmargin: 1rem;\n\n\t}\n\t.green {\n\t\tfont-size:.9rem;\n\t\tcolor: #2dce89;\n\t}\n\t.red {\n\t\tfont-size:.9rem;\n\t\tcolor: #fb6340;\n\t}\n\t.yellow {\n\t\tfont-size:.9rem;\n\t\tcolor: #fb9a05;\n\t}\n\t.block img {\n\t\twidth: 48px;\n\t\theight: auto;\n\t\t/* float:right; */\n\t}\n\t.block h4 {\n\t\tfont-size: .8125rem;\n\t\tfont-weight: 600;\n\t\tmargin: 1rem 0rem 1rem 1rem;\n\t\tcolor:#8898aa!important;\n\t\tline-height: 1.8em;\n\t\tmin-height: 48px;\n\t\tborder-radius: 12.375px;\n\t}\n\n\t.check {\n\t\tcursor: pointer;\n\t}\n\n\t@media screen and (max-width: 720px) {\n\t\t.block {\n\t\t\tmargin: 0.2rem;\n\t\t}\n\t\t.pure-u-1-4 {\n\t\t\twidth: 50%;\n\t\t}\n\t\t.pure-u-1-2 {\n\t\t\twidth: 100%;\n\t\t}\n\t\t.block h4 {\n\t\t\tmargin: 1rem 0rem 1rem 0.5rem;\n\t\t}\n\t}\n\n\t@media screen and (max-width: 480px) {\n\t\t.img-con {\n\t\t\tmargin: 1.5rem 0.5rem;\n\t\t}\n\t\t.block img {\n\t\t\twidth: 36px;\n\t\t}\n\t}\n\n</style>\n\n<fieldset id=\"_passwall_status_fieldset\" class=\"cbi-section\">\n\t<legend>\n\t\t<%:Running Status%>\n\t</legend>\n\t<div class=\"pure-g status\">\n\t\t<div class=\"pure-u-1-4\">\n\t\t\t<div class=\"block pure-g\">\n\t\t\t\t<div class=\"pure-u-1-3\">\n\t\t\t\t\t<div class=\"img-con\">\n\t\t\t\t\t\t<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATEAAAExCAYAAAAUZZVoAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAADIAAAAyABj+uetAAAikklEQVR42u3de5gddZ3n8XeSTggEcidcZAZZLFZXShwV2V0ccBSFclwvICpyWW+4OnlW5wFl5DKjQmYVkHUBFxEFBYRhNg94G6ZACCAQkNvDpRJCqFwMIZ10Ounu9DV93z+qOlRO+pw+p05VfX9V9X09j4/Q6T71PSfhk9+p8/39vtNQqgbL9aYDs4ADgfnAQmAJcHD4v8OARcDi8H8HAfOAOeHPzQLGgTFgFOgF+oAeYCfQAbQD28P/bwv/uSP89W5gABj2HVv65VAGmiZdgJJnud5MgnB6E3A08A7gncAJBEFlCg94BngBeAXYSBB6fb5jj0kXp2RoiJVIuKpaQBBUfwWcDHyUYPWUd88DDwBPAquALb5jD0gXpdKnIVZQlusBzAWOAU4EPkkQWmXSC9xJEG7PEgTbsHRRKlkaYgURhtYighXWx4DzgdnSdRnoKeB24BFgne/Yg9IFqeZoiOWY5XpzCO5ffQK4EJghXVMOrQR+AawAXtN7a/mjIZYj4WrrcOBDwN8B75WuqYB+AvwKeF7vqeWDhpjhLNebBhwFnAH8E0Grg8rGvwM/Blb6jt0tXYyanIaYgcIV15HAp4GrpOtRADwIXAM85jt2n3Qx6g0aYgaxXG8hwU35qwkaR5WZ7gSuA571HXtUupiy0xATZrleC/CfgcuAU6XrUQ27BLjNd+wt0oWUlYaYEMv1lgDnEay6VP49SfAX0aO+Y49IF1MmGmIZCu91vRP4LvBx6XpUar4O3OE7dod0IWWgIZaB8C3jacDNBJunVTncCFztO/YG6UKKTEMsRZbrHQCcBfxcuhYl6gHgIuAFPYkjeRpiKbBc7yCCbT/XSNeijLKK4M/FnzTMkqMhlqAwvL6K9nap2tYTfKjzhIZZ8zTEEmC53v7Alwl6h5Sq12rg875jPytdSJ5piDUhvGH/WYJTEZSK62Hga75jr5UuJI80xGIIWyVOIbhhq1RSbgEu9h17u3QheaIh1iDL9d4G3Aa8R7oWVVjfAq7Xs87qoyFWJ8v15gGXEzQyKpUFB7hPb/7XpiE2hfAonDOBf5WuRZXSo8B5vmNvki7EVBpiNViuZwH3AMdK16JK71vAtTojYF8aYpMIR5hdAPxAuhalIgaBE33Hfk66EJNoiFWwXO84ghMJ9peuRakqrgK+q8dnBzTEQuHq6xKCEyaUyoPjtVFWQwwAy/XeSjD1ZqF0LUo16ArgijLfKyt1iIWfPH6F4MgUpfJqO8G9snXShUgobYhZrrcYWA68X7oWpRJyHnB72frKShliluudCDwuXYdSKVgOfMl37B7pQrJSqhAL3z5ehLZOqOI71nfs1dJFZGG6dAFZsVxvPsHsQA0wVQarLNf7nHQRWSjFSsxyvbcTnKqpVNlcD1xY5E8vCx9ilut9kmDrkFJl9TJwsu/YO6QLSUNhQyy8/3UpQR+NUgps37EL946kkCFmud5s4A7gdOlalDLMR3zHdqWLSFLhQizs/3oK+A/StShlqKW+Y98gXURSChVilusdDZSya1mpBl0N/IPv2OPShTSrMCFmud67gdJvhlWqAXcDn/Mde0i6kGYUIsQs1/sgQQ+YUqoxTwMf8B27T7qQuHIfYtpCoVTTWgk6/DulC4kj1yFmud65BJOHlFLNGQT+Mo/j4nK77chyvfPRAFMqKfsBbZbrHS5dSKNyGWKW6/0dcJN0HUoV0BbL9Y6QLqIRuXs7GQbY/5WuQ6mCO8J37C3SRdQjVyEWvoXUFZhS2Tjcd+yt0kVMJTchpjfxlRJxsOkbx3MRYtpGoZSYLuDNvmPvki6kGuNv7IeNrBpgSsmYDzxjuZ6xc1iNDrFwK5F24islywJ+b7lei3QhkzE2xMLN3LoXUikzfBC4yXI96Tr2YWSIhcfp6GkUSpnlCwQHjRrFuBv74YGGq9HzwJQy1Tm+Y98hXcQEo1Zi4ZHSd6ABppTJfhXObjWCUSFGsFTVI6WVMt/jlusdJV0EGPR20nK9TwC/lq5DKVW3YWCh79i9kkUYsRIL50JqgCmVLzOB5eFtIDHiIRZO5i7cGCmlSuI04CLJAkQTNEzwB4EPSNahlGrah3zHFmlMl16JXYQGmFJF8IDlem+SuLDYSiz8iPZxqesrpRK3Hnir79gjWV5UZCUWduRrgClVLEcD38v6opmvxML7YCuAv8n62kqpTHzAd+yHs7qYxErsK2iAKVVkD1mutyiri2W6ErNc763AmiyvqZQScT9wmu/YqV8os5WY5XozgZVZXU8pJepU4JwsLpTl28lLgIUZXk8pJev2LMa/ZfJ20nK944AXsriWUsoozwHH+449ntYFUl+JhW8jn0z7OkopI70bODfNC2TxdvICwNghA0qp1N1qud5haT14qm8nLdezgFfTvIZSKhdS+7QytZVY2NSqo9aUUhB8WnlaGg+c5tvJTwPHpvj4Sql8cS3Xm5P0g6YSYpbrzQPuSv0lUUrlzcVJP2BaK7HLU34hlFLA3Jkz+MF/XMxVx2S2y6dZl1qu95YkHzDxG/uW670NeDmzl0SpEpo7cwafP3IRZy+exfg4fOLFNrbtHpYuq16PA3+d1E3+RFdi4XTg27J/TZQqh7kzZ7D06CX86f3H8Mk5Y4yOjdE2Y3aeAgzgfSR4GGrSbydPAd6T6cuhVAlMhNezH3wb/+Mv5rF1WxuzZs5k8cKF/Mhvky4vjhWW67Uk8UCJPAhAWNADYi+JUgU0d+YMzv3LRXzDWgLAru4eunt6mDVrFosXBVuRn9wpOjGtGWcDtzb7IEmuxD4r91ooVSzRldc3rCWMjY3Rtr2d7p4eZra0sGTxIqZNm8Ztm3YyOJbatsS0/TKJlotEVmKW6+0P3C79iiiVd5UrL4ChoSHa2ncAMGPGDA5ZcjDTpgWfyd35Wod0yc1aClzVzAMktRL7svQroVSeVa68JvT29u0JsGnTpnFoJMC6h0fZ0DcoXXqzrrRcr6kjuppeiVmudxBwnfQroVQeTbbyAhgbH6ejo5OB3bv3fO3wQw9h+vQ31h3LXtkqXX5SLgAui/vDSazEvir9CiiVN9VWXgDDwyNsad1aM8AAVrT1SD+NpFwaTkCLpamVWLgKa+r9rFJlUm3lNaG/f4CdnZ17fe2wQw9hxowZe33t/m3d9IyMSj+dJF1IzC1Jza7Ezpd+5krlQa2VF8D4+DidXV37BtghS2ipCDCAn21sl35KSft23HtjsVdilusdAFwj/cyVMtlUKy+AkdFR2ra3MzY2ttfXD12yhJaWyf8TXdU9IP3U0rAUuKLRH2pmJXaW9DNWylRTrbwm7N49yNZtbfsE2CFLDmbmzMkD7Mq128hva1hNl1uud2CjPxRrJRZ25/9c+hkrZZp6Vl4TJrrvKy05eDGzZs6s+nO/a+2SfpppOhv4aSM/EHcllsoJjUrlVb0rL2Cv7vtKSxYvYr9Zs6r+7Itd/bQPjkg/3TTdGA4XqlvDK7HwpIqbpZ+pUiZoZOUFe3ffVzp40UL222+/mj9/7brt0k85Cx8G7q33m+O8nXwnUN/vmFIF1Wh4QdB937lr16S/tnjhQmbPnj3lYzzd0Sf91LNwk+V6b6r3vLE4IfZd6WeolJQ44TVZ933UwgUL2H//qQPs5o07GCroHf0KhwM24NXzzQ2FmOV6S4CPSz9DpbIWJ7wg6L7ftr36W8AF8+cz54D6xrLetTn3m70bcTHwuXq+sdEb++dJPzOlstTIDftK/f0DNQNs/rx5HDjngLoeq31whE39Q9IvR5bOqrf5te6VWNhWcbX0M1MqC3FXXhB033ft2kVvX3/V75k39yAOOrD+o7S+X5zN3o04kzraLeoeFGK53vuAx6SflVJpaia8oHr3/V7XOOhA5s2d29DjvuvBl+kdGWvoZwpiuu/YNW8ENnJPLPZRGUqZrtnwgqD7vn3nzprfc+CcOQ0H2O9bu8oaYADHAS/U+oa6Qix8b3qq9LNRKmlJhBdU776PmnPAASyYP6/hx77lzzsb/pkC+TrwxVrfUO+N/Y9JPxOlktTMDfuoWt33UfvvP5uFC+bHusaankJu9q7XF8LDJqqaciUWdujrDX1VCEmtvKB2933U7P32Y/HCeCcwL1uztaibvRtxMuBW+8V63k4eCcQ+dVEpEyQZXlC7+z4qOlotjnu3Tn2NEriYJkPs09LPQKm4kg6vqbrvo6Kj1eJ4pqOPnUOF3uxdr7+2XG+B79idk/1izRCzXG8aevy0yqGkwwum7r6PqhytFsf160ux2btepwDLJ/uFqVZiR0lXrlQj0ggvmPzs+2oqR6vF9Vxnf1M/XzDfJmaInSFduVL1SCu86um+rzTZZKJG3bihnWG9ox/1Lsv15vuO3VX5C1VDLPxU8p+kK1eqlrTCC+rrvq+URIABLN9c36qvZE4Cflf5xVorscOBhs+7VioLaYYX1Nd9X2my0WpxvD4wxOaBUm32rtdSGgyxU6QrVqpS2uEF9XXfV6o2Wi2Oq9a2pfbccu7DluvN9h17r4+Ga4XYUumKlZqQRXiNjY3RvmMnQ8PDDf1crdFqcTzaXpjJ3mk4Dngq+oVJX3nL9eYA75WuVqkswgvq776vVGu0Whx3b+mkf7S0m73r8SkqQqzaHch3SFeqyi2pvY316O3tixVgU41Wi+PWcm/2rsc3ww8d96j2V8gnpCtV5ZTVygsa676vNNVotbjW9jReSwkdBuw5JXKfEAtT7pvSVapyyTK8oLHu+0r1jFaL4zurW9HOsLqcAPxm4l8mW4ktIv5QXaUaknV4QWPd95XqHa0Wx31tutm7Tp8lEmKThdVfSVeoii/Le14TxsfH6ezqih1g9Y5Wi2Pljl46h0YzeR0K4DOW6+3JrslWYnoAokqNxMoL4nXfRzUyWi2OG9a3Z/p6FMChQCtUhFh4P+x86epU8UiFF8Trvo9qZLRaXM936WbvBr2HsHu/ciU2F0hnvaxKSTK8IF73fVSjo9XiuG7ddkbG9ZZ+gz5KGGKV98SOka5MFYPEPa+oes++r/kcDjqQuQcdlHqt92zRzd4xfGGiX6xyJXaidGUq36RXXhC/+z4qzmi1ODb0DdI60Ng2JwUE2TUX6K4MsdOlK1P5ZEJ4Qf1n39cSd7RaHD/Uzd7NOAp4cU+IhR9ZniRdlcoXU8Krme77qGZGq8WxcmdvZtcqoOOJhhiwQLoilR+mhBc0130f1cxotTju2tzBgG72boYD/DwaYkdLV6TMZ1J4QXPd91HNjlaL4/ZNutm7SadbrrfXjX3t1FdVmRZecc6+r6bZ0WpxDI6Ns653MLPrFdgB0RB7v3Q1yjymhRc0330flcRotTguf1k3eyfksGiI/a10NcocJoYXNN99H5XUaLU4/tDWnfk1C8pqAbBcbyaQflefMp6p4QXNd99XSmoyUaMe2t7DrmHd7J2Qd0+sxLK9o6mMY3J4xT37vhapAAP46Qbd7J2gEydC7HDpSpQMk8MLkum+r5TUaLW4Xto1IHbtAjplIsTeIl2Jypbp4QXJdN9XSnK0WhzXvNrGqG72TtKeMS06GKQk8hBeSXXfV0p6tFocv23tEr1+EU38jr5TuhCVrjyEFyTXfV8p6dFqcazp2c223brZO2kTv6snSBei0pGX8ILkuu8rpTFaLY4fvaqbvdPQEm78Pli6EJWsPIVXkt33ldIarRbHk7rZOxUtgBm/wyoReQovSLb7vlJao9XiuG3TTgbH9IZ+GlrQJtdCyFt4QbLd95XSHK0Wx52vdUiXUFgtQDanv6lU5DG8IPnu+6g0R6vF0T08yoY+3eydlha0Wz+X8hpeaXTfR6U9Wi2OZa9slS6h0FqAfP1XUHJ5DS9Ip/s+KovRanGsaEtnxakCLegnk7mQ5/CCdLrvo7IYrRbH/du66RnRzd5p0pWY4fIeXml130dlNVotjp9t1M3eaWshGAeuDJP38IL0uu+jshqtFteqbt3snbYWYJF0EeoNRQgvSK/7PirL0WpxXLl2G9oalr4WYLF0Eao44ZVm931U1qPV4vidbvbOhK7EhBUlvCDd7vuorEerxfFiVz/tgyPSZZTCxChwlbEihRek230fJTFaLY5r16V7L1C9QTv2M1a08IJ0u++jJEarxfV0R590CaXRApjXHVhARQyvtLvvo6RGq8Vx88YdDOkd/cy0AGZs8y+oIoYXpN99HyU5Wi2OuzbrZu8s6VE8KSlqeEH63feVJCcTNap9cIRN/UPSZZRKC+gg4iQVObyy6L6vlKcAA/i+bvbOXAswBsiNfymIIocXZNN9X0l6tFocj7TrZu+stQCjgPwB5DlV9PCCbLrvK0mPVovj961d9I6k2yOn9tUC9ALmnCCXE2UIr6y67yuZMFotjlv+nH6fnNpXC9CHbj2qWxnCC7Lrvq9kwmi1uNb06GZvCS1At3QReVCW8ILsuu8rmTJaLY5la7bqZm8hLYA2tdRQpvCC7LrvK5k0Wi2Oe7dm13Ki9qYhVkXZwivL7vtKJo1Wi+OZjj52DulmbyktgB49GVG28IJsu+8rmTZaLY7r1+tmb0ktgP4OUM7wguy776NMG60W13Od2X56q/ZW+pVYWcNLovs+ysTRanHcuKGdYb2jL6oFaJMuQsr0afDwycdwUEu+miqbJdF9H2XqaLU4lm/OtglY7Ws6JX47OTYOJ6x4hf/9anlyvL9/QDTATB2tFsfrA0NsHtDN3tKmU/JPJ0fGx7lxQzt/+/i6Qs8HHB8fp7OrK/PtQ1Emj1aL46q15fnLz2TTAd0rAfi9uwu7KhsZHaV1W1vm24eiTB+tFsejutnbCNMB/Z0IFXFVtnv3IFu3tWW+fSjK9NFqcdy9pZP+Ud3sbYLpgH4+XKEoq7Jd3T0i24ei8jBaLY5bdbO3MaYD2bdo50CeV2VjY2O0bW8X2T4UlYfRanGt7ZFpTVH7mu47NoAnXYip8rYqGxoaYsvWbSLbh6LyMlotju+sbtXjkA0yce7v09KFmCwvq7Le3j6x7UNReRqtFsd9bbrZ2yQTIfaidCF5YOqqbGx8nB07O8S2D0XlabRaHCt39NI5ZO5fZGU0EWJrpQvJC9NWZcPDI2xp3Sq2fSgqb6PV4rhhfal36RlpIsQ2SBeSNyasyqS77yvlbTJRHM936Yf5hlk/8SfOrPdHOSG1KjOh+75SGQLsunXbGRnXW/qGeWjiT12fdCV5luWqzITu+0p5HK0Wxz1bzPlLQ+3x1HQA37HHgOelq8mzLFZlJnTfV8rjaLU4NvQN0jqgLZUGWhVd/z8gXU0RpLUqM6H7vlJeR6vF8UPd7G2qjdEQe1K6mqJIclVmSvd9pTyPVotj5c5e6RLU5DqiIbZKupqiaXZVZkr3faU8j1aL467NHQzoZm8Tveo79kg0xLZIV1REcVdlpnTfV8r7aLU4bt9k1tt4tcdv4Y0+MXzHHgB0zZySeldlJnXfV8r7aLU4BsfGWdc7KF2GmtyjEAmx0J3SVRXZVKsyk7rvKxVhtFocl7+sm70N9iLsG2L6CWUGJluVmdZ9H1WU0Wpx/KGtW7oEVd022DfEnpWuqiyiq7LtnWZ130cVZbRaHA9t72HXsPz+WDWp533HHoZ9Q0xv7mfM793Nxa+aeeO4SKPV4vjpBt3sbbA9t772CrEw2f4kXV3ZPNY5wMB0s3quijRaLa6Xdg1Il6Cqe2TiHybbsfsr6erK6MrXzGlmLdpotTiuebWNUd3sbbJXJv5hshB7RLq6MjJlNVbE0Wpx/La1S7oEVV2r79h72sEmC7F10hWWlfRqrIij1eJY07ObbbvN2iWh9nJT9F/2CTHfsQeBJ6SrLCPJ1VhRR6vF8SPDjh9X+/i36L9UO8XuFukqy0piNVbk0WpxPKmbvU33cvRfqoXYCukqyyrr1ViRR6vFcdumnQyO6Q19gz0TbpHco1qIvSZdaZlltRor+mi1OO58rUO6BFXbDZVfmDTEwpNeb5jy4VQqsliNFX20Whzdw6Ns6NPN3obb511irckOd0hXW2ZprsbKMFotjmWvbJUuQU3t9cov1AoxPXNfUJqrsTJMJopjRZs5DcdqUst8x97nhmXVP8nhzbN/l666zNJYjWmATe7+bd1GDENWNS2f7ItT/Wn+sXTVZZb0aqwso9Xi+NlG3eydA6sn++JUIbZSuuqyS2o1VpbRanGt6tbN3oa7znfsSZfKNUPMd+xu4EHp6sssidVYmUarxXHl2m1oa5jxflntF+q5OXKNdPVl18xqrGyj1eL4nW72zoOXqv1CPSH2mHT1ZdfMamzT5tfZ9LqedVnNi139tA+OSJeharuy2ltJqCPEfMfuQweIiGtmNdbZ1cWLq1/WMJvEtevMnGug9lJzL3e9n7VfJ/0syq7Ze2Pj4+MaZpN4uqNPugRV2wDwaq1vqDfEdICIAZL4pFLD7A03b9zBkN7RN93f+45d8xvqCrHw/egl0s+m7JLsG9Mwg7s262bvHLh7qm9opHX7Nulno5Lv4i9rmLUPjrCpf0i6DFWb6zv2lKPA6g4x37G3AE9KP6uyS2tPZdnC7Pu62TsPLq/nmxrdRHeZ9LNS6Z5wUZYwe6RdN3vnwNP1fFOjIfao9LNS2Zw3VuQw+31rF70jY9JlqNq+Fp5rOKWGQsx37BHg69LPTmV3+utEmP2XB1fzrZdeb/4BDXDLn82cuK728i/1fmOcM1n0sEQDZHkW//mt4+wcGee3rV28/Q/5D7M1PbrZ23A/9R17V73f3HCI+Y7dAdwo/SxVNqux81vH2RVZ1A+P5TvMlq3Zqpu9zXdVI98c93S8q6WfpUp/NVYZYFF5DbN7t9b9F7yS8UffsTc08gOxQiy8yAPSz1altxqrFWBReQqzZzr62Dmkm70N961Gf6CZc4ovkn62Kp3VWL0BFpWHMLt+vW72NtxG4JlGf6iZEHsB8KSftUp2NRYnwKJMDrPnOvulS1C1fXmqfZKTiR1i4cW+Iv2sVXKrsWYDLMq0MLtxQzvDekffZLuAh+P8YLNjb/4ErJd+9qr51ViSARZlSpgt39wpdm1Vl89MNo6tHk2FWLgaO0/62avmVmNpBViUZJi9PjDE5gHd7G2wHpr4oDCJAYRPUGWUkspWnNVYFgEWJRFmV61ty+4JqjhOr3eL0WSaDrFwNfZ56VdBNb4ayzrAorIMs0d1s7fJtgArmnmAREZB+479LDFvyqlk1bsakwywqLTD7O4tnfSPGvBEVTVnxr0XNiHJefZfE34xFPWtxkwJsKi0wuxW3extsid8x276jMLEQsx37LVMMZVEZaPWaszEAItKOszW9uyWfkqqui8l8SBJrsQALhZ4IVSFaqsx0wMsKokw+87qVrQzzFg/9x37lSQeKNEQ8x17OzH2PqnkVa7G8hRgUc2E2X1tutnbYIkNHkp6JQZwfYYvhKrisc4BhmcEq7G8BlhUo2G2ckcvnUOjdTyyEvA/fcduT+rBpqVRoeV6pwFuZi+JmtSHFs5m2+AoXt+wdCmJmzl9Gh85dB5Xv+OISX/97Kc28kynDsY11CzfsRP7Q5lWiAH8ETgpoxdFlVS1MPtP969mZFzviBnoZN+xE53VkUqIAViu92aCozWUSl00zK5bt50fr9Njdwx0j+/YZyT9oKmFGIDlet9ET4FVGZo5fRot06YxoA2uJjrUd+zE94ClcWM/6lpgMOVrKLXH8Ni4BpiZ/nsaAQYph1h48+7ENK+hlDLey8DtaT142isxfMd+Dn1LqVSZ/bdm90fWknqIhb6T0XWUUmZZ2uj0okZlEmK+Yw8Ax2dxLaWUMVaTwYzarFZiE8f1XJHV9ZRS4j7SzGGH9cosxEJXANrAo1TxneM79mtZXCjTENNPK5Uqhd8Ad2R1sVSbXauxXO9c4DaJayulUrfAd+yurC6W9dvJCbcDy4WurZRKz3uzDDAQWokBWK53IMGoJqVUMVzgO/aPsr6o1EoM37F7gWOlrq+UStT9wP+RuLDYSmyC5XqfI8ObgEqpVMz3HVvkKF2xldgE37HvRE+DVSrPjpUKMDAgxEIXEmwSVUrlyxm+Y6+WLMCIEAv7x06WrkMp1ZDv+Y59j3QRRoQYgO/YOwBbug6lVF3uBb4nXQQYcGO/kg4ZUcp424GjfMfuly4EDFqJTfAd+z5gqXQdSqmqjjMlwMDAEAPwHfsG9CBFpUz0dt+xt0kXEWVkiIX+ARC/aaiU2uMk37GN6yIw7p5YlOV6s4DHgPdK16JUyZ3uO/avpYuYjNEhBmC53hzgVeBw6VqUKqkv+o79C+kiqjH57SQAvmP3Eeyx1NFvSmXvApMDDHIQYgC+Y3cCR0rXoVTJ/KPEqRSNykWIAYSDN98kXYdSJfHPwDLpIuqRmxAD8B27FfgL6TqUKrj/BVzmO/nYQJOrEAPwHft14AjpOpQqqGXApXkJMMjBp5PVWK53GNAqXYdSBfKPwLI8BRjkOMQALNdbDPjAfOlalMo5kaOlk5C7t5NR4ckXbyYIMqVUPF/Ka4BBzkMMIDxR8jhghXQtSuXQJ33HvkW6iGbkPsQAfMceAE4DjG7KU8owJ/mO/RvpIppViBAD8B17BPgicJl0LUrlwNt9x35Muogk5PrGfjWW650N/Eq6DqUMtAOwTTtOpxmFWYlF+Y59B/A+6TqUMsy/AUcWKcCgoCEG4Dv2SuAoYFi6FqUMcDnwMZNOZE1KId9ORlmudyCwnODGv1JlZOxZYEkofIgBWK43DbgI+IF0LUpl7FjpuZBpK0WITbBc7xTgAek6lMrAA8CnfMfuli4kbYW9JzYZ37EfJNg8vl66FqVS9PfAqWUIMCjZSmyC5XotBIM/L5GuRamEneA79tPSRWSplCE2wXK9vwEekq5DqQT8Bvh8uA2vVEr1drKS79gPA4uB+6VrUaoJZxPsgSxdgEHJV2ITLNcDOAe4XboWpRqwBnB8x94kXYgkDbEIy/WOIFiWv1u6FqWmsBS40XfsMelCpGmIVQh7ys4FbpWuRalJrAI+7jv2BulCTKEhVkV4/PUvgFOla1Eq9AXgVt+xx6ULMYmGWA3hvbLTAFe6FlVq9wBf8x17u3QhJtIQq4PlenOAi4FLpWtRpXOy79iPShdhMg2xBliu9xaCt5h6zI9K2zeAn/iOraewTEFDrEHhW8wPoGf6q3TcDFzsO3a7dCF5oSEWU7h16Wzgl9K1qEJYCXzZd+xXpAvJGw2xJoX3y5YCV0rXonLpNeAs37GfkC4krzTEEmK53kLgAvTmv6pPN/Ap4EFtmWiOhljCwqnkFwLflq5FGakHOBN4QLvtk6EhlpJwZbaU4GxzpTYRNKs+oiuvZGmIpSw84/8c4CfStSgRfwS+CTzrO7Z0LYWkIZYRy/VmAh8GbgIOl65Hpe4nwA91j2P6NMQyFvaZ2QQ7AM6Srkcl7qvAv/qO3SVdSFloiAkK75udCdwoXYtqyr3APwNP6c367GmIGSA8/uc44OsEN3+V+foJBnLc4zv2TuliykxDzDCW6x0AnEwwxET3aJrn+wRnza3VG/Vm0BAzmOV6C4BTCHrO3iVdT4ldSxBcL/mOPSpdjNqbhlhOWK43HziJoPfsw9L1lMAy4P8Ba3zHHpEuRlWnIZZDluvNJriH9imCHiTVvGcI2iIeBF7XhtT80BDLubBl4zDgBOCzwGeka8qJVoJPhe8DVvmOPSBdkIpHQ6xgLNebDhwKvAf4KMGnnS3SdRngeeBfCIYlr/Udu1e6IJUMDbGCC1dqc4GjgOMJZgacIV1XytYBvwYeIZgOtFVPSC0uDbESCoPtAIK3oRbBqu2/EnwSOlO6vgasI9ib+CRBWG0EOvRGfLn8f+GUFkYW510jAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA5LTE3VDE1OjIxOjMyKzA4OjAwR74VGwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wMi0yNFQxODo0NDo0NyswODowMM5zM3oAAABNdEVYdHNvZnR3YXJlAEltYWdlTWFnaWNrIDcuMC4xLTYgUTE2IHg4Nl82NCAyMDE2LTA5LTE3IGh0dHA6Ly93d3cuaW1hZ2VtYWdpY2sub3Jn3dmlTgAAAGN0RVh0c3ZnOmNvbW1lbnQAIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTcuMS4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgbjvP9wAAABh0RVh0VGh1bWI6OkRvY3VtZW50OjpQYWdlcwAxp/+7LwAAABh0RVh0VGh1bWI6OkltYWdlOjpIZWlnaHQAMzA1DH+L0QAAABd0RVh0VGh1bWI6OkltYWdlOjpXaWR0aAAzMDWfjtuMAAAAGXRFWHRUaHVtYjo6TWltZXR5cGUAaW1hZ2UvcG5nP7JWTgAAABd0RVh0VGh1bWI6Ok1UaW1lADE0MjQ3NzQ2ODfo5GxtAAAAEnRFWHRUaHVtYjo6U2l6ZQAxNS4yS0J7Sgm2AAAAX3RFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vaG9tZS93d3dyb290L3NpdGUvd3d3LmVhc3lpY29uLm5ldC9jZG4taW1nLmVhc3lpY29uLmNuL3NyYy8xMTg1MS8xMTg1MTUzLnBuZx52BOUAAAAASUVORK5CYII=\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"pure-u-2-3\">\n\t\t\t\t\t<h4 id=\"status_tcp_node\">TCP<br /><span class=\"red\"><%:NOT RUNNING%></span></h4>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"pure-u-1-4\">\n\t\t\t<div class=\"block pure-g\">\n\t\t\t\t<div class=\"pure-u-1-3\">\n\t\t\t\t\t<div class=\"img-con\">\n\t\t\t\t\t\t<img src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4NCjwhLS0gR2VuZXJhdG9yOiBBZG9iZSBJbGx1c3RyYXRvciAyMy4wLjEsIFNWRyBFeHBvcnQgUGx1Zy1JbiAuIFNWRyBWZXJzaW9uOiA2LjAwIEJ1aWxkIDApICAtLT4NCjxzdmcgdmVyc2lvbj0iMS4xIiBpZD0i5Zu+5bGCXzEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgeG1sbnM6eGxpbms9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkveGxpbmsiIHg9IjBweCIgeT0iMHB4Ig0KCSB2aWV3Qm94PSIwIDAgMTAwIDEwMCIgc3R5bGU9ImVuYWJsZS1iYWNrZ3JvdW5kOm5ldyAwIDAgMTAwIDEwMDsiIHhtbDpzcGFjZT0icHJlc2VydmUiPg0KPHN0eWxlIHR5cGU9InRleHQvY3NzIj4NCgkuc3Qwe2ZpbGw6I0ZCQjE0MDt9DQoJLnN0MXtmaWxsOiNGRkZGRkY7fQ0KPC9zdHlsZT4NCjxjaXJjbGUgY2xhc3M9InN0MCIgY3g9IjUwIiBjeT0iNTAiIHI9IjUwIi8+DQo8cGF0aCBjbGFzcz0ic3QxIiBkPSJNODYuOCw0Ny42QzgzLjYsMzMsNzQuOCwyMi41LDY2LjUsMjNoLTAuM2MtMy4zLDAtNi41LDEuMi04LjksMy4zYy0xLjgsMi00LjQsMy4yLTcuMSwzLjINCgljLTIuNiwwLTUuMS0xLjEtNi45LTNjLTIuNS0yLjMtNS44LTMuNS05LjEtMy41aC0wLjRjLTguMi0wLjUtMTcuMSwxMC0yMC4zLDI0LjZjLTMuNSwxNS41LDAuOCwyOS44LDkuNSwzMS45DQoJYzYuMywxLjYsMTMuMy0zLjksMTcuOS0xM2gxOC43YzQuNyw5LjEsMTEuNiwxNC42LDE3LjksMTNDODYsNzcuNCw5MC4yLDYzLjEsODYuOCw0Ny42TDg2LjgsNDcuNnogTTQyLjksNDguNUgzNnY3LjJoLTUuNnYtNy4yDQoJaC02Ljl2LTUuOGg2Ljl2LTcuMkgzNnY3LjJoNi45TDQyLjksNDguNXogTTYyLjcsNDkuMmMtMiwwLjEtMy43LTEuNC0zLjgtMy40Yy0wLjEtMiwxLjQtMy43LDMuNC0zLjhjMi0wLjEsMy43LDEuNCwzLjgsMy40DQoJYzAsMC4xLDAsMC4xLDAsMC4yQzY2LjIsNDcuNSw2NC43LDQ5LjEsNjIuNyw0OS4yQzYyLjcsNDkuMiw2Mi43LDQ5LjIsNjIuNyw0OS4yeiBNNzMuNyw0OS4yYy0yLDAuMS0zLjctMS40LTMuOC0zLjQNCgljLTAuMS0yLDEuNC0zLjcsMy40LTMuOGMyLTAuMSwzLjcsMS40LDMuOCwzLjRjMCwwLjEsMCwwLjEsMCwwLjJjMC4xLDEuOS0xLjQsMy41LTMuMywzLjZINzMuN3oiLz4NCjwvc3ZnPg0K\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"pure-u-2-3\">\n\t\t\t\t\t<h4 id=\"status_udp_node\">UDP<br /><span class=\"red\"><%:NOT RUNNING%></span></h4>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"pure-u-1-4\">\n\t\t\t<div class=\"block pure-g\">\n\t\t\t\t<div class=\"pure-u-1-3\">\n\t\t\t\t\t<div class=\"img-con\">\n\t\t\t\t\t\t<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAMAAADDpiTIAAAARVBMVEVHcEwAAQICBQcCBwowdKoYZqRNpOkfdLdRrPX////D2ux4q9QvnfQrm/QomfMlmPMilvMfj+ggjOIhidshgtAgfMUcZ6LUtOjpAAAACXRSTlMADR8zZaKn+vzLxsICAABO4klEQVR42uydy5brqBJEjezlpUGiOv//tfeWqfaGSuthEgnkIqSS5TPoQUcS+QRfOjo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6Ojo6PgVu9tH/33wm3e7XNfO4PN66IXwE5/CuMEe/i2zAcXV7OCMcb/pKSeYtsgX1n+vKcCq5j3mH6XCHj4vjjTt8/r6gv+tBs8CJ8w2evy/on8UF48AUfocJXQwag4P2VAFYzWC43W73Gdxut8H9AKmIZaBHiS0CYmLHHhM/BNLHbVC2kFhBzxfa8/jJqncZvC+aApZAyHhxvXhQG06t/Vjvr7dZ4mWU1xhllDlDuF0RA6ytm0Bd9uGBIN45qN9EO/CPB9agzSCIwSV2Cj03qMO+zu9+1r2mHVp5A8D/gH/AEsBTC9IssevA0fTDPgtfU69496zzAO/lcSUQEWxBMAOkwAXgDboQ7A+yexZ+wC3lXgAsc70B8RIbQioFUVBwcb2ldGzkB/1DsvJf+/b0khc8LwNZSMzgfr9iA64nhrvCEfhRzhtY+nCv2NfXz+2FNe43QgIiIRiimLC7gl0dP9Kvlv4G8rlY95kIQQRCMET1ok7/bmFfvPav9yTc8y+5XxOASAbeRyoEwRmQFPQ2cmH6uWD/AcU83If71QXe5356Xp6YIIkKH1dvGRVP+d3lV8Sv03pyPL/Mv4Q7wwam9BUhwAYurptAYfqR/vt6zBcemyQAT5ChAOE1QNCB4SkDfYrEBje/+GUGPvzFCvCS/Yz1D/+8hef0fwST066gFwayQTbF4l+kP13yWIPXl0UAkIDnx/RtBB4b+CUD3QYytZ/2rlr8ayawrADJ/V4ZANXn8xvBCrx40TLQTSDX9ZPyw/42+ldiAAOQgEgBHrcPVuB9KgMX99CyTn/elMf3PUD/GqCch3b/3Ly9qQC8BNqn8PG4cAWRCbheGdgChFL1eQRsUQDeIugQIF8AMIIJDfi5qQ4824a9TfBO4I/432B/K/+pFWgFYPHzZTvgHvYnr25s4H57sN87xm8G/k65/gwTUA4/sQKFvEDwBf8hMBTBEzzQQ4E1pHnf/V32Nf/LTSBBC94lf+JSCgAwgRAK9EBgmXoSv/foB17fAAVIdV8yBADMKUAA8SA14p4VvAYjfor+kgoAJJ/8Kb40/Qk8JhD47+wv7NY1rf5X9AMUoIQAAKoAfPzCf/FgVCHuAQFgzCuHfuD5Wy0BEf9nhAAzAsC7sgAfm0Dfcj4jADOJn8EHiPhVCZCMJCAB6q/Xv44Hb+6BnhJG1MO+jX6iwHUFgPuMMsA0kwTwAFoFbj0SeJ0AMOkjmfCrMYDqBpsFQFUBw2NJBcL0WE8Kn8wz5GmjX9/6SjkXowDg9xeDQB0NDq6fPvNAHPtDf0ELmBcAL0UEAOGPngvwcSjwp/MBl5Z9b2XoX1eAtPiX0Qt8JQC8hudGE/jboQDRn1L/3RWAb2aQAeAGwFw0SIcAR/gXU39i/2L0b4oBROUAdgXgHWwQgb+qAWrKX2zQreCFJCCm3wjo53MDPCLw9+JBB/vfgP5yFrA0Di56ItQuAFkm8IdLgyR/V6X+5hCQN68gqg9kBORTBtgGEUm3kuAb/0juX3D5s+65lzYFKY9wnAKArwkR+Evz4+T+F4I/OygFowIacG8MA7AIbQIb8fX1UAEywnB/PvnlvD/w2yRAMW5WAD6who34+j+IBL7xFzwAyd9QevnrFFBBeAm3kX/VBgyP7QbwFYLBkA4QHn/4fg9Kf1IMfkMVANqBmAWAUOBdBQjwXqgNf/iBY+R+A/IvYxn2dR1wFsJtFAAUgJLwmwYwTV6eDaLPLQ7T9Si//FEARGDm0pyLXQHeX/3wH0yAWJBU4OMbf0XpV/d8CEAuaHUAKfXvJwFg+txYEJeG/C/TPxqW/3oSQDGwZAyIDOQoAOnAwOz4x9b+L6n8j6VTAPifQbk6MF6ftwwFULEgQ9KfJ/7IP9zb4WVbHVBLv10BknmwDAUAHjdAEPBhJhCi/3LiTwCwXQEyK8FwLtEzNoJcBQCUBJCBzyr+XWP5Ly4Aqwqguc+aB+QRfcuNAbUIXOkOuY9Z/7r4M7Lmi9cBZIFgMceAkyAAeijYZAATgQBHjH0C+WR/Uh5eVwKX1j/c53qAOObjNisACeEdL/A56x/3v77w7VngHLdiTQJlCgqg+TdkgSoboCwY7rPv9if7N8CwH0D1AiV7HDA8MAHVETAZAIHAgAR8QvRP+DcKWK0G2LcFAyg3CcAz+xMWPbZg559A4NzJANU/xv4NGZ9lHJhLB4GSoQAEAqg/XsBqAAQCt5PzT/UP/ouTD/FbcgAdBr7JPypAJ9DzalUA4EXQgJAM9PDf3gfADEzDQEEAJF793HYDQAM4Vuas63+J/3EPBYB+DZ0AiiEG4I5fixkAFkAucELtT9O/cZX2sVAOuJYHvI3Y8Ut4aPqL5ADAp3XhswH+A/2a6IoKkDUNROgvUJ8/EbyOiXTw5zpX/m9P/+0nA3HZasEEf+iADgAKegDcwHBGCaD7e92ffq82BS7kAMLXrPn/YAS/m0F8LWYAWMD1RAUB8n+d/m0IA8qfDMRlPR4wTQFC5sc/FSoDaoR0MOQC50gGYR/+VzCaBYDPTY1Ayd4WroKAb3hzI2C9IBAS6rOQ/5v/ce8IYH0a2H46dOL9WfiwX9wAqAvfznWm1Or6H0tHALEHWEsBJGNLwKSygHRjaPksUJeFTzEqRvIP/3C+QzHI632BC7NAuTKA+vOR8r6DAAAfNwZO4gTm9X/cLQXYMAsUYBAAcgEV/meMA+ZYQONW4HT776gawEoEgAuwhgBK9/cKAcAUxwHNN4AM7T+LAKznADyyZ0Ek8B39WuB+SYDWAEzANX3eP/yD1QrAaDwSYnsOINkRgKcXoMOA3TwAGtB0X8D9PKj/gRYEgJWfdUI8gyAhBEjDv4wyYKYGsIG4df9vEP/y+4Hg3nwuxMvwb58kUGvAlVzgVP2/0tGA3g+0lAIAqM+tAjINqhVgnxAA0BcgDmitAOjgX6F4OuhlYw6gxD9rGDCQPZcC7icAwEuzw8IuLgCi/7unADxWIgC4NyqAh3Wo3zcHAHSHiQMaUgB2/0oGrBsCVwXAPA8+U//LGAe0WMCdIbEm5//hf6vij8YIYGsKgB1klQFRAEEGDOOAWZiCBdAaak8Bbuj/rl6ACGBLDQDuc0cBJFJ61n/mOKDJAp7N4SZ7QLdj9f8tATBNAuAIZBJItw2EGwpCnDDeSAXQHTIAAPD+qwrAnQMCQGJ9yD9MAYBvrCToZgoA6P+hNaAFZJ8NCNnyCAA81B+XA4CkIOQacf/wv46xvAKsRwA2BaASkD68YRzQZAFDG5vGyACWE8BxFwV4owuACWQqgMR/iL+hE2iAT1OB+g4A/uF7N/lHAbZGAKZKcFoEZPHj9WH/IAPAAi6uFQXISgDGQtuB4H95/ZtOh/bsCCAmMJ8LYE8G6zoBl+4AMTJefkMgms9f9jAgowDUAApsCbJ1BuunAi7pAOjO33jgdrB1SKYDwAzSE2EOrgKAf34c1ZBg7eOfBYwHFoLWawBmFyDMAgmkmw6Hs2sAR4k1cgCgHASc/tYIwHo89NwsqGFDgB0itU8RcqoDYFj5lpMB/cogkDkFELpBKvw7WgFAUhOuPwIkugK4vwIsHwokljYg/McnwyH8lj2B5cKAAQ2omgHcRwPd9hhgRQDw/tkKkOwKMh4MU1ID7jV/Y0Q7AMvCL38wqFj7gInSTzoI4FHJALxU+flpwj8qAIr7cfdWQLhRgEUBEIMA4PsF0rmrCAAWcK3nBMgAbZTafx7K8ltQ6/yTBvAVETDkAMVzQVdj/VMBAOOuzSB1JMSsAkh8W4YBhYlANQtcQwGAYAG1KwA851D+N4KxBi/7VAFZ4eEf8AG81DEAnECd7UKOTQByMHQBYIsAmE6F8ZOo7cBIQRX+yQUrSICrFABoBfAoQGHAfiT7yQsxYEUDwAmgAMdsAyUDRP+rKYCWgN++X4xVYOFoQDSgVgQA/v37SseEXY0SoMHvGzNAPfehIZYqMD0AXQKqWASA/39fPjpL0h3Ifi0HkGSAWgF0FyD/ZMh4Rwi2oHrBdQ0AJ3BQT8ilx4BV0P9w8wnZCrEPMCgAnPMMj9oe4BvTwQVBFGAY6wiAUv9XAmDyAaoEJHylEdSCB8AJHCgB9RwA4o8NQHgKHRrYBUC5/9oeIIBMABPYfwp4uFYQAMRfLfoFARDjsWDhJiggNWzAA4Qw4EomcIACIABVFYDcjjeAIWRHAAwBcKt50BYMYCIOfFxHJADDbX7oczxOAVj0wqt6GopAEm8GaUMB4B8JOHK/ICWA6goAyWL9bSCgBv51A5BHVQEAXsbhPx8Q7h0FIPCPA6hlAakCaAGwh4A80h0BkN+IAYRiAKnAcVNAB9cBU/cPw1oBxBADEgIiBnPnw9b3ADiBfUeEmQJYcADjcfPAXLgBg+8H+rdBiAC4fRshIJiEEdFDfgpE7LALQADfVARgEgA/kQwq8qG/GQO4uZ01gPWvBGA8MgKYV4CCEQAVgPCifie4Ff5xAjvXA12VMUCwtBFICwAQ6yDAbBLQmAFMUT1wRweAAFQrA6prVgDEJgAEgVBOT6C2AhwtAY4UoGYKCOdACwIwRwCa+5rbAcA/jTQVdDvwTw2wBla3AdoFgOXODwPIyzmQdjwA2LUvDP/O7gDsIeCSAoh9FBiWZSUBrC8AwMt9GHACe20EqCUAagaAC1ADEHsfmFXPTVO4KQNAAnbzAZXGQICqAAJRXyRPAKL1zyxY2gdq1ANQDcIEyicAugkwNhIC2MM/RgGZAtS1Xz4aEwBGQwYU4JMEAAsAmmp7BkisL+QAeAPMoiUDAKSCbpd9IMNCCjgew/+yACTfDBbgOQqMdc+jMQEAX0ECOE2+vABINWykFQkwpABaAWKDaE4AwEQUgBMowT4RQC34tRAA2u3bwST1/TwMKcABBoAElBQA14IAbCZX+MtNAfiFYP6FQmCrHgAJKN0VhH4EoKH1L1DPp9hrAPLUfKUGTRoAEjBwknTpGHBse/1jDpn0o/0S2Eb8eTTKv5YAVzwCvI/trn/1Zh0DkHT+D/bb9QBIAIlAyS7gMLbu/3kYBYD9YLDPawsh4GGJAGMAFQVgSxFQPQ3nAUC8agK2LgBIQHEBcNX43wLYt0UAZAPJO86gZQEonwigAEO1OQD/pgDYIoBJIhXgL/YC7RvArdxsED8KN9xbDgCwAUsJ4PWxwL7tPpCG3BkRL3YiOALQ4PpnHigPevpP1D6Q5quAwEcS4Ao4ANpAba9/sfaAOBpadYHgv3ED0BLgykwCXsd21z9fpNCZcKKbv4+3xvlHAq5DOQVAABpd/zb201A/jADh+/H+7XsAMJWRAJfsBahA//r61/IvhjmgUAGEbh0CNs8/gyHMBZx0LwA8ZwiAYQ4oZZwNQifyAEiA1QaeEeBQgX+/oAAzAmA0AOFnAZB8PjMcQA0DQALsLsDVmwX3hwgAnl7PfUyK//YFAIy3ErUA2gAV+D9YADgHLB0PV/Q3LwBkgkYJcJU8AOnf7gIA/cH/0xBQA2HnEAAwDoMygZNUAUn/1pc/AmAzAIrADygZCM/2BQAI1UDzmbCuAv9vSQBmYN8J5n1COa8nM4Bkl5Cz5QC3sVb8J+raRwCUFSj5P4sAABoCBbaDHUo/8d++IcD0SwBIAhMvcL4QkDCQCXGX3wUYhrGC/L8lAGIVAIyAUhCPc9UAmAyKo0DboYAV5B++i0OXADgLTFj96ljIkxnAJJQCDMPgw6GTIMh/gFr+pSMAr8Q/PPMWP/zXNwB8QOAyXwCu4+HdH5jfAnsJGLVHGOD/ZCEgGIecniACcPR2IJgUqOUqLACTzgE4END/j7or2m0YhIHLOkV5gAP+/2en5BrdLGttQ+qiGA8zXs8+Y+Ix0QDtxQhAVwHf3XWAMsC45o/4+FcXECzmlgEuSQAlzaKAfga4LeOaP54TwNn4F8w7C9h92ssRgOqAPvhtK9C45o+P5f+se2DhLje4qgMk0xw69b0LPA/s/ZIjvPcE4LrA/T8D43RJ/CV5zwFn/iR8Gdr7GSE++XPkbBN/WPzHO4DqgElfBLo+A33/fIj+JZ4B3kwALvnTFzqehB5CAAGfBIe2ghDjQQSgleV/wwXXJYCa5p6ugOmTrSAKZ6p/Bz6UABLAVXbxD5r3EEClxuPv74I668DgVhAf69R4AoAhAMMDBvgzCQDFCKrWNdoBfB1A6foOEJUBBLCQB63xhZPlH+xwBMDZ3gBq6hFBBhpUMPbXQfirNqIdQHUAIe14F24JAF+BLvCxrjlLKegmer+VYQjgbuCegnHAUp/iDwU9KjZjicCAXqPxVx1wDP0v1QBLHPuDuPOXhH0YDwD3jhGAqjo7fBM4TeJJQIzgwNf6wAkAFQ1oaCib1m0WGWy2xjmA6oDDx0CVgXPMeT9Bug+/hWTwx6HI32Ocev8xOV65H3hw79csAXD1AH7GPVpBAwr3NwXnVgoadCisNQp/nwMOwB/SC8RYz0JZiGsyXkClEyS8Ev+QDwBpV935SFUJWkfw0qhEn3P51wEY99ypDP+/o6wbKCQFol8rbYQD2BwwvQS/PgROtyUg9QttuUFbFTTApln4ayPhSfhrkgNpCf/wkyv9jeTm6YD4F0gY4wx8EsQvb9ei5aYOA0/anoaAI5DJ7v9/6q08iIFmjViOe2WHR56bzmj0MLu1uwre8Ho8jKl2qnYHFQDzn+A/pp/fvi6IlwL8+hf/7SOR1+Sg70wTeCCJk+PUVT6Am7DznPAv3r+rAWh2pybB9j0kAM4Vfgi8HYgu7u3P1rEMwQ2PToIMwEIBa4K2BGAS8N1WQNuLwej+784PsBV7DuCfkookfeMCJX5vDPtMIIqVNyOwKwN4RhXg09Q2omWv6xAqgO/cxRH4JxHE/idegJCP4cejPU+nUUecs0RsiT+TgCALDNqALd3fkRdKfrGctpbtXHSJDCLOEqAKiKtVHvyZ2AP9stuae/3fNYE/RPD3CqDUAB8kgvIZZcfwP2IWCijPRwXqdjwVpJsQoN4MPG03/kJIS/dnmpeEWp+x8aEggT9gwyZc0mWbG5rLOSlmG6OZuMRIUZV9KAiavsokMG0RJgUQAHj/KFQN7EaMcmyn5UxsYynjAjMp0Ap/xgAWAmf1v30EKHsP/eLIZvAAG3XgcYQHsBPPC5KX9Nzs3d8VoLyEH6Nr0qGuDvU/Aa54HUEVXV6n76mA7VTK3oHfYi+p64ah74d+GLquSwsTgLtCBwD/NGHbnAC/mQWeLQSaXgvC4A9VP2si4mxQZ4hQBqgCzobkyV/tQ6AGIgwIgH2Pv2tIxZgMKF3/qeNWKyD1qRv6x5v1/dCJTjpqkQDcRFEQYDbFfxq5IhjDfwP8bbsACP4Ydjg8IuM/VZfEXRj0ESIkRJ8KAInvHl9aV5yZWWXFzN+lr/xQOpanPJ0DbqMQftHU9YdfrUs6KaKArlBvZkMCTOl7SQC7AL9a+b9HfeCTQIDT1hsLXM23WZrs+n5M/rVKgEd+SwXfLCkyxKHy02Q6O7vD5T7iD/Sjr2VuDwqUYYRoiz9XBM9Xgrf2XQCkf6z8awoQeAz8HzRwrF0BIP9AtMT5GgGGrOJMopEOzP+rCjBnHaEArvk4YOLHDw9sMBlAIoAq0LZ7BkwN7HnyV8TIgYY5IJt/nvWLKcAF6+0tshNpgYoKsAjAIhVVDNKsolAJZTZI81qhStP+BQY46jD1uh8ffdp6UaUG6DSJUgOAf9MkwMb/vRDw9AJwpcDwuGhJBFmhejgB6gz+gqqxzrF+LgzQSgqgaXkT0ToBjAFbp/dpo/s2r40BWpaHJtsKEwESoGkn4Hb2FwJ+dq3gx/SKDOhcs84gKpMyzoCwZoq5jsNQGCB4h738e30KJtQJAA1wCqRt6tdf+U66CoAUDWAUmNpY+kEJiPW/4fXAXP7BSHTPq9Z3aug46NgJ4deUQYCqvYwBoni17Wg4AZZ6RIB5dgZgu3/JJREYFQ1BlbUeaEeAbRJwa9YFiNHfNgAX788kwEXrl+4ABotC7xkLCVDVcFcAQE5b3/UoBLyoARALH3D/awwoHPDe4OTlAKxFEsA14Qj8Vjkg0McANE4BEuCiDS4C7AzApdEysNEdvbwwAMZAwqACPa/B2Rf8XQOIPhoHV61T9QZhkQCBBrTigBHgvAK0yAGBvm236g/8mV9f9xhJGSog+xVFuzMiwONVGGDD1w1EuEqlIqEC2AADOB60iwywktBQV9GprQJ4EnC2CGAKcF37seH1X45PTnNMgLgkVFlqAQW/eFo+ZDh8NRgAZ8frhK1+xchHCuAaQP8n/hetQxBACiijCqBrmwRQA+IiAAS4rv2Uf+FKDwSa6Fy3Tu2N81oR4GMgMVmgAFWbXQOE+SN0wP0/HykANaAg1gR/aMC6augxoJE90QuMQgDhZwpw0fm5TZIgz0Af7tmGATmJ2kzsFJ/8iBcYAP8XQ585ARw65xoBPgx+ZwCeHeR/J620FyZdrhilBLRKAmBn+4AoAq6g72N7ASjgtwkFaGFDlqRUABzlMnTugteuDIAl5RaI5lQnQGEAwoCqPfnZ4huhyVzSANsJ4W9CgBskACNcCrSnd9fQd9tJALDBhG81sC7r4sIrDUABzRYCIgnwKLAtI9yhNR0qACjggUTR/mvDAISAyW5KDjRbECT6IQV+pucF9PcSsL8IwPI/wwdVQBMNYD3vWQYGFSBiABd1KQA5aaAAmzwgq+ijkXVz9mJAlG2gNgSIFADGhYBfV9F322WBSNcMHFQB7TSAUYAxZs4hAWZqgJsmUQxTgDlSADJgeLQyazChtDD0FZlg0wXBSADCKjBGP3G4AOz8s+U/2Fw0gMVAxshzLMqAsUQRVxHCrzlWgNlv+dHM+nnOWCGeRkhAwzLgViTAZtwFOtcIfn6NPi2BBB4AcjMFYE2WVZD9Ef5TCsCWrmxNU8kANc2BApAC4dfphz/2MRSLJWDOCAKQgGbtQK4Im91CBYgIQF+vSwAFwOU5UoCe4zsMWNE/oQC0bqcB7ABpeYesMQFAgddxnnL/3NvQBxIwb9cFpoZlANPAoA3EIiDw/EgBwAE2AhCe61XA5182DH0MIzQgbxUGIhNzZ6cBipuqZMnHOQCDgNlwBP/nF3bvoza1TmrBX5duQKvrAj0LPNMHsiLgiuf/XQfIrkeDMuAMAWhDBKMzwG7LR8yhAqAZYOYMQHNZDH+jUZQE0upw9ivksM97/J2Gl2uAYkG4VR34k+tBYQT48XUj+Bl6PqmBE/o/HTTPc0SA86JJBhD/fDrNYENPVJQxoLxDnQBFAmh1LIH9x87uIMGjaugvTbhMbAF/bJgFhgrAIoC2q+ti+U8YXAQSSHTUp73DaLEKIJ3PQN8lhu4bqgcX98UVwHl6QICdHfn/fcXdptshA7zHPKkBL9pIAkasBhwoAB7Y54B05i26URggX5gDblOAuU6ADwxMG06C/hBGMmBW+4CIANRbMgCloI2sOSDARxgBoGcO/II96fDnofrPhJVGrwbHRhLw+2wv0KtABxGDx0Q7TgIkba8F8XGgAEAdOwwXzT5o6inwx+10t7nA7xqwwO8SECSBEQGGzzsRpy138gtVJGBWQ19tNjH9jV5goAE3KgDxfsOevh4rQJlQAKTogQI47hy2sTAQre059nTfs5WATWdAhgAECkAOfPRVAaDT06gB90fFCiHRDlj/npjNFgoQpwCsAt/Fn4c8CHMAsbkRgDlUAIzNDBnwcg3QzAB+zl5upgGTZwCFR4cEAAOMCdUMAD99jQT3qgTMzgAsC7ZeDUAlGCwE/bFUgR7Hvg+qAJFkQ7kWPKc5zgEAOqfdLAoEyZwWEcjVNKMeP8rI+l97Z8LYNo5D4XVsr2Zz2KaO/P+fuqPA7FcIgkCpTNS0BmlZztF25oEPD+ChcS5+tLZIA8hlcAtAw7K5KuCf8V8z9nYEny2DNeYDpRIQjH+ZC3TIH5dwGUDVALIEuGT8GVvWGvDP2MMCzaJyFg9o2+61W8EAFAPy8g4pJwQaQFov7wsOIN2xpvF+U/4xwgGyV6CGvR3j7UHkAE8nBTd3wOtTADZdDipVugIGQDfjAu/vTVTSEe6m1LCGAsQDxjAy+tEiA+ACMQNscADBP3uACIEaeaDeHhTEgJMO59wx8h0KGF/AnzdwpXIG0PCTRi8pZyHkMZCvEYHEDzggFWiAAQLwHcAZ/VizPEuFB1Syk0oDIgb4rwn83CkKWGQA9gRTqV/SAJDm5Cangz4FiAt06xgA+uhkaq/LVYA4CxgIAc6PYfzKeHe3ZnHZMRxQyxQDHLzxLyZZoEn7dCTACP6YFgEpx4CAASAADC/wlfPLB/7iAejMQoMBRh2R/5HdMgPk5jtAo+HHBbK5DtDhAW09DlCFAJ8CDAOAMPc0HSC0cWQThcAyBrAW6cAclD88oNgBoACcoIVEIg0wXtw6QG/Q7yc+sMAA2VrhgHS9VS4FHsKHRSq8Fe7GvK9CAaV1gIWAKdelGCAE23egV+4BrO8ZdYRIyUUHyAEAGN0YoAtH/OISAyACRg6ozwDRvuCxDmSzPp8BZuHnzBaSgA8CWGQA16Qe1LiaK1Ny3/FXlFoPBWQl2ZWFAGB0PICikVAA+A8fE8TSfrZBGAAHqOQBHYUAGMBdEupT/grLAYDVACED4AIMFQwK8LPzDw/oWQ+wZlJIrAtEoPKAhh/zfjK7ACZs9T5vzT0LwAVSDQ+4UAp0c0AkwJMHeKE3SJrAieB4wNJcAOCjl/vCAqpgIr/SrWAAKklYV6IB8t+HS3o/quEnG5AFIgD/DgOgAetxwCv4BwRQkQFeLzAAhYDYAfL/3+wHJAMvfgzAB0BvTTEAEuiCQhAUQDbn/qvAH7sLyOxL/FdmKTp2fKAKB1z+xV8tCbDwg//RBTx2AzRDDgBqRWDIAGBPK6if3X+ul77GAQgCWBcwAK1Z3ojcgb+y4d5xdwwCkNZW4YBrXhQG/N4h4aMDbCcAflPGv84CQgYAf0ZKXyIC1FByUfFsAk5fLAKH9+hMmx4zLqBbhl+5gFhKFRwg7w6a1QB6WxDIrzMEAIVAxQCxBsgZNhHz5/JZ87yACy7Qe3BEQQAXWBaBwNc8h/sCXBdATaAUQL+yB5xgAEcFsCb8pEq/W4w6gGgA5oMjBtBZs1yWCqioQDSjy8vRjCLI9GWFIKJSEAkEWmzgHfhhANDvxo4H1JgM8OsAEwbAthCAygIkBRgpIGCA3hHOQwDtgHZcYICFZSXDRKGVhoBB/szIXrp5BjDw6xxQwK/CActPDjlMGOCX7TVnAfd9dxQCYwboDR/HY7svYoBgWQnI+A6Ak0pDl0T27KsBTPDHAaRX8IArDEAMcJLAp/MvIs9koJy+xLr9QAMgh4xgCtMAgoDPAEsLslVg7mMGWEUBxALHhgy+dDX+63DA2awJ8mPAf2uM/1wJVKXAZQ0gEIo5QWDBAXABlwGapbWFAmvMADD32ChPrfUBkPcjgPQaHvAGA+AC3lTA+Zegz8YBrnkqONAAWgK8fFzFCALNUh4YMkDTLASBlzv2gQNYD4BWfokHukkJCOy7Gh5wDuoAuMAvM8CrdI5zlRwg0gDDaEYBvBAEYgZAA/gO0PgUALWvYAA8YGvlicGPC1AI7upEgbfzSACUAi38VTQACoAndyYObwjmArIAYEiYIOAyAPAvMsBSEHgG1IgBJkEAr9pEAxCAkwFU8ADmg8HfKQRW0ABIQFGBLLYNsgBdElGpM4UAnwEyID4DLC4v/kf+gJABdIUi9oC4QtRNhn9LUyIAD9gUAoIFARwPUoEANAOwc6uQAbrMiRMVuFgKjBkg8IDsQTEDaBdw/9CyOnFnCYDx300pIG1lgLgQUIUBmAscWYBKkGQBKzRAd29iGRmPAZAAAQMs6kDKyZEIVOs72LmyIRBo+MG/UhSAAYgBAriB/z9ogBqmNYBEgMV9AQMZABRwvxQxQJwFRBTQDzEDzCzx2eoBLEjTKcBU/hEA8IDNDHCIp4Pra4A2t26ZAUxVVOnAgAHEIgYYlnXgaItpIJmq0gH8sWsNBjAeYELAdh1wJQvwNAALgv5bhwEkBCRpEgECBsABOpoWAb+oAYYwCIRZgDdT8b6VBJ5tCYAiEMAbHbCVAf4TMEClEEAZAA0QMoDyAKMB+hoM0AxREAgcwC7ygwPem60kMPZsiH87+NEBqxmABQEO/KSBNRmALKBIA2j+lxv+N1dgAOGAYDVvwABenZoDbVaaooBWuucFeMBmBpBuZWBdEYgIyAzQljNAp1o1DTDIIQRBEBhiDWB9YLsLsCvc14BJx4ANUUA0gLskiCzgUC8LuDMAIqAt0wAWfDzgf7/KAMIBCyiFDIChBFm0ttEF/iEPxAPGbr1AXiltSANhAEcDMBlUjQAkCShgAK0AKjMAh5CEFPAch4DBW+eLCzyv9wA9DQj4KEAIYLUSfIMBcIFPrgPcSwGXLAGi8wGUB9AsA2yvAwy5LelAfCjQAJ3RgbjA+oyg6zwVmLjwJThgVQjwywCVGYA1YWwO7coZQDd4FgfYxAB4QBQEyo6KFaMuhAusp4HnjrWABAEr/6StzQbfcggINYCsCaxVChwtqbkgnwGcCDB21gSEDhAzwNiDYkAhAygOMCyw1geeXQrQClD6WiV4ggHc+eBaItDuDicNiCqBLgP0NRhgGOgLOXuBCKRQHflAs0YImi0hmvjpazngGjAA+FdkgEwAMEAXM4CTBjJLuzgdXMoABIF5mJvIAWCAbiIEMU67LfQAlQliKgDontJaBvCzgMohAAK4sCSokAG63mMA13vKGEAdPbWAy0sYAohPigF8H3guWjze9QI/FID6S7/kAScYwJOBFRkADxAJUMQA/ZwI6IB/bM8utOs0gGDjs3MTi0CcAMMBsCZ8UgCmN4WxLwjtP+MCNRiAqYC6IYBHhqzTAOCvKgFD6AB9zAAcOrJUEfYcwEYpuRgSUMbB55EKUC5gw4DtKW1hAH9fSO0sgDWB4e7g3mpA0A/KAOUMMMABS8WAZ58B/ETFugCGCxSoAJsCMvw3KsGjNxuIC7A9/FKPAaRlD1iZBUwkQHQwY7wqeHr4WICHwwB4gF20gAvYWFBQJ+707nA3C1ifDR71bODBWw9Q0wEkD8hPdJE64AIDeBEA+P0kIGYA0kBsaVqwpBDUOT4weDzQRHrwhUQQ8+N/eUkwwQCg764LT1UXBPx8UmRhFiDT41kDQgGBBCjXAACyhQGslxpj6zfGfGFEASwKifAv5YD2SURgWAf4sK4OA4gL8FTHMQYUrgiC/seGBAiQjRlAWxwEfA3QyTvFAMBXxeE5F3gpywN0LSjZTotPCfPWA5AFQgF9NQIYZwLGSystXA+gx9ZUBHaxBChkgDgIxGmg968BfpqyJQ9QEgD8A/hDDrj0I/5oAGuCP4sCK0mAVzUVEO4M6vEAFCAU4EbOTQywZU/HMz7qOkDnhIIo8nBaOBRQzQPOigGC50UczzXXA6ACVmYBRgT2YQSINcD2IEAlMGIAbDCpIX+p6wBQQIx/7AFMBpZXAp/OtVcFUwlclwXozUH+I7pAf5EBOIRGBYH1DCAWOADgWxd4Xzgu3lKAD7/ygIgBRnipA/gysPJ0YNFsIOi4+Pe9S5vrGQA4iikABih3AL9K/L6wRryMAWgFHHCFAfydYZWnA6kErmIASwHkgP46j7JTwgR4TujjANKaDvBS4AFN8Ngw7QIO/KalYCogeGoUGuB0qTL+2Rq4ngFsfcWfvH2fhvXgr+DxDfDxmixggwPYdWPPSw8zBP6CHJDmc0A6wQBOKViVAlNdDcBcQBkD4AOkAL0LysABc7kv6Uza+IkgUI0BnnvfA2IHGPQhIUUMQEtxIRD0fQ1wbOulAcwESBbQxVkA8GODT9PvzYD1AQMw/qW5R3zEq4KHJRbHgZ1pouelEGAKwkX4i80XAo9P0ZMD0QC1KkHMBVzEBdqIAUiyzfkQ/JYnATOlxwzACQ8UA8odgBMFowNgcAFLAY0fYzgoct34XxKCvcAfEAATwud6cwEQQAkDUAngDfw9AsADYgaQxoBEB65mgJfokbR0qwR9B5iNAQ7+zBMn6fMucGmkxg8B+AsCqARVEQFqLqBUA4B9jP+LOEAv4BYxwGhQAEGgzAE4yLjxKcDZ4Mhf6S9uzDFAwJcrWCvwaXQcwCkE8uDA4KjIanUAnQR0a04K5RndMQGgAgMGoD6nNvWVOgARpAm2+1odMLC/wXeAricPZDlAJP9yhwPsmuCngmcHC1WcLjXrALIkoI0YwMKP2o4JQOAPKoHwNwPSCQLxGUEIOT8ISJvKgIWcdjBpYBn8uMBsLuAdE4mp5wYeT6kaA1AFGFsJAwzh8MeeUQC0gAEwakJUhMsZgAVKrgegAnQQ6P4XOEDvFAI8/OmzYSCdmAx0ZgJIA6vlgZcPwwNSVAkUAlfWBeOyyQRACyqBvUsBL+UMIH14D05+mV0yyO4GxwGIAKUMoLp8xWSBIQPo6aC+ggKUEPCa4ICQATQFvDwDf0QAauY9ZgDrAzycOHAAOIB0IwoDMADPIog0oI4BCn/uDfzUA2wW+FT24MinKmnAZWxCAJcyBnjRJmhE+EsVWJ/dGWgAp0JvK8Lxs4OH9+AcQEgAWySaZo4BDOS6TQiAojDWPEWVQMkNKk0IA/99HuCiNUA1a1AA4L/AAP4zvAgCJSEgpgD2F/zT9dhr5NeNywDJNOCfEIDlgHMBA7A5jOmg7eDjAh9BoL0zQFvJAcgAYH+gLGMAjIrwOg1QnjuMVvKTQyNxw9EABRIAp9AOUPjsaOYD02bwgX98QQHUAerhP8kc5G6ZAQZnb3dAARTqkBtQQC17H3AAkwXMNs0A8sJIAnQZ4LBYCj6QBqxF3zCAcEBKNRkAAdAAPz6wzABizo4+BnRRCMBnKtnQDFMCQAbYBufbrhygIwlYGP96XWi/YeSL9gd/ygB1NQD4awIINYBdcmIygcIsABUw/kY1lx5y4sBJcYv4zwMvJrc5CYABokqQPDoSFVgEvpgmgAsMoOcCKuKvSwdDKQOQnXfgTxAIswAauUMFa5rBkQAO/rYbR7hLgKPgv4IBzqsGPo3bN7IAvR6gPv7SUfSFDNB3Hb4DBZSJQHTgUE3TsBzK0wAkhC72YnyYaEBpAQOQBhQNfC8HkI0hVALzvoAa/6+kAmAObo3qAN7WboJAU64BsgfU4jQIQGySAQSjX/DO38PQgGQBjqk8sA2UPneWAJCAJAEwQFX87cGtRQxgd5+XBQFOC4dvZJ9PBU7j36bPCSrgf8sAfLy1siAwrAOrWvCx97Dnw1Ie+Hqhm/MBthkgoP+kaREQM0CnG2ASBIIQMHlWwFAFfwhgWgeMwj/Y8yWsJwkgAITbw5oZVNVHjwDyHVNBr8k5H2Dj/6qMv1vajyuBducR5aCmbDYwX2SzXw1Ng3fiAjEByGtJBJyPJAFRAGA+8HzJgs6hgIAAxjfmAqrVAZ5fwN87tNVnANC3HhAXA8gC+Mt4Ykw9/NkWlAlgKf3j4jEAheDlSrA+I+CUQJW2wAC2BEAdwMwGbo/+ZvxvYQDgl1aSCaABsEE6G3632csH/tMcgBBAkzc/9nPDbYcEOAC/e1po1gDHDtSN9o/GPy5AGlChDvBs4bcuEDNAhn408A8rwjCAdrccBTaTwLvGX2yyMXB2BphbPuIPSIBwPRgkQB74NAAsLSAAbjMD8NCYCzuDtsJv8F/NAIpnZw+iCk4Pc1QHzwvZRGqNSlCNAPDK/5bxueMrzbFgKojNQYgAAMWKCEDQFx0oJvjDAFvJH/itAGAc+w7A6SOKASyWvgMY9BUJNJu8mmKm3Rlq8bcUgCPMVQJEAwYKgB2irAxOQFvSMvb3D3cv4KFRMMAW9MWGwYn/asVN5AA96OcruSBBoJwBcByOgyyD/4M38OYOEejgb+G3GkBbd34qrQPpQsCxhQEKbFoKuhtnBQqZwQDlur/J8ItRjANOucYMYCUAzQkCAQMgBHhaxEpS00cj+YuBrM6fin9kIdafZCYgkIBUgygFbSGANzUXwJLAdJFEAAcowl7Az+SvAoCYXXYbM4Cgj4E/mf1QcFKoMuUCTbyi7aX5Gf5Bx3+9LywgALxglgWGoz4cBCdwdwcJ/k8NoMZGBeg1rwVhSeBdBORSYIENID9aA/SEf5AwR8p6f+rkAKr8xm9TDFj6I2aPB+2njwrACaxf49U4s1WAVgKqHqT/SgJEDGAPDEYElI5/5B9TQReTBnQ90JZZk092NfADxaSq/z5vhAA4IN/z65LYOwZYsI55fFzDv31c3vrDXv6Ffnjnm/zXTJjJmQf01n7JFQmoJcCRCIALlIiAU1dOAHhCvv7Q/6QBl3a0fmjKsZehD/o2/+vskYLe39DAAOAut0YFgNOEifRcouMC+IBrjS5muLvCaZMO+osE0KsyUEwBP3vAsJYA7n2mFni58OjAru/l6Y1jm7XxOzLuBfrGUX8AryHMv9iI5T8Loa0IYC4dFBAx/gh7UKxZXhw6QWM92Y5/OxGku/UEfUcVAA8ogf8/iIDznc5jE9zlDQaAA0QFph/7A7t+CE2pPj/5J5zbsv74BiZaaHPRHMDSUvt3E0JM7HF+M3u69PFD/hf1avgzOeHrP9MtA1hrVRUAB4hrgbIm4BJRgCANB3ARAhD4c/ugADygkTbecJu/gXnZn7R8EUTM6jCFHZLRmoHS9TyQ906L55etIzqVbH1IsJgf/w3/E/+1dafjMdgTgMEAeTpA0A93/73B/dxRBiANyFudO8UBjb41Yd/M/RsPsC4ADr2CD+2vzP910LdRxzIPvyjdgC69n3Vl1gHZFGC2xwSQhqAO7D87ShJBlwIwoEcHoAHIA/Kp8XCAWAMXONCz9m8GfQcKarQ4jq8A+HPsWAYyz/GMGMzN3kiXC6biv1MEMt0Mee6NBIABIhGgS0HnZChAQT/PANAApingtcse0MxRQBH8gAB69mGOoG8UgDHv+S89RvzPZjzPRgIgp42mSck5HTRj7MYA5CCmkkCFf2yEAEkEoYCLZ4x6ucMPqAWqxcGBEnQj/7AIPx80/NI1ffsGlJhdSyzdBg87QyB3DvqG/v3tYKrzphMAa71IAMb/2EMOQAT04OgbuCs3wAOggHTJjw0o8ADD4FhnYzk4aCRs3BCDcBX4YGmw9xzIBoJhogjofBt/gpJa84QIf/9PLACIABwOVM4AwgHNpRR+1D+3UMDFMMDrkgcAPAvwHO032rIScH5R8JcL1kt3DAXROy6QbX7OEC+wHmX1v1oA5Mk/9cHaOZAAwWFhx3O3xgOQA6wJYTrg8mNSOL3+EALMpGm+10PHgmBh0EIALAz8WDvrArlhCitHQOBcEew+m7QO/tYFUAbLDNCfw9VA/jERMiNYjn/mf/po1ALG/m9LrZQD5D+yQ6fJhWaG0XQul4uigvHq4W8iLkEAXK2un9R9jCEHaK7ZUgLqHwN+b/cP/O/bcEQCUAgOTImAtTFA99epCMgyILFb3HgAIZSrGTQGB/yBSr2F3oZ/ebWzOSGSAvg9s385Fg5+O/6tAKTz0j5hrUUCFDLAYSoCzm0R/nPwT9OA8TZdxANSzgdT6nTxLh40ARBaB3BgH037gEUfGBmkhv8JHMFv4wz2v2H+8TAcCwbKXhkQcyNAeRaIC8AAhTHAgf9NMwAckItCXRIPMMAPLoFr7ueOeyAz/78n4EvPTVtPs+LRUAemPEaHDp+LvOOgeKOLad/wI4DGvzwCsCqkkABsfyMICAPIjdCArBBMH5eui8OlgSEiYnyAC84C9HIDmohJ7kzMgT6EuV0ecvyIPw9Pmj4eBugLyoB+BPCPCI7XBEgxsF0rAaQRAQT7zP9v6UdFIKXXNMaC1HaFzD8Fol8MAtKN15AB0sdm0gHeUZ3Ea35TuuOEduD37fgOhRjxp/SfxwB6J6AfAY7lVQAyQbU0tC+GHylAGUAvDhNLuQkHpFfHAwx/xzLMAgcOCsKWsQ8R2Cgwby20Lb8qb44ocD9b9W9nAJw0APgxNwKQBZbHAELAsUmFZUClBTB4QF7jVaSAtLE2cPcAJ1zqUSyXQI5PdYFBX4mADKKPIW94D+AD/2wwoGPa+bAE/mmGATB+YikCHL0F4bEKHH9LVoV0Mf7S8sUzu0gw4Qld1mz5NYn5vJWZ/gUr3jUBSIfNtWnobBstfwgM+Bn98/hrBjBkAPpRDuDCHxcCSmOAlv7WWBqUyAflHj6YqjY+8I0V1jt8YPlfOl+Ul2NEbZDTf4z7yyra8GeoyR+56GV+YI/pakCcA5QXAqEA8oAUEkCM/eQjLJCjAh5AU/qbS2Bx0LUjWH3kpxz4FfPjBviVqw7RD9AO+MMAi/s+821gXUMZ0GeA+LCg46kPQ0CpkRQkioP5i6klWCoqCIBn5BaYifsMRAWqpQIYA+i4dnLPnwH8rWryQw780h0GAPLYBW4jAZwmEeBQLAH0ooDjUAn+N4oB8pJP6f7+4QE28Csu8IwcLoZfNxDUzUR0oxlUAIfOtZdIw90U9u4DgRwGwCMWjZngY4kEjB4gdqQU8EuW3qwg+AG9tNSuFn0MrLUEIA0cgYymfpbBTezmnT+BO+MwcrG/mZZn/wzi0IJv3XlLGRAdAAUQA+rYa+JewOc7RIGCjJxoTUkmdBar/sALrNQPSndcBSiB1QLNb4gFjwPTHW+IgScCNKegDFi+NJRSQC0mYH3AXQLkLh4ABZTGf17BD3MBQMYzLqCgpynXwRTuc/kBZpV/Av64AIgEiMvAdjHQhkyQUsCX2Jt4QJG1dvRPMFOmIbXw8xEtp/xFoazNjwa+gb6G3ykAqo/x+E/D+Z4DrKsCIgMVBQzX6lAn3tObUAJKMLIMLrCrWyfgg3u+GAaQC4TNJ4ghhLfYDdL8BmDLABr0Ih0IASABtwQBZOCnW04L2iD4G3DNLYhLn4//oC0vrqbIC/zSKxi4S88f5xhgFQHckIBBFhjCTx5w6qsCzc117tttiLwOAhpoyJ83OvTPsOdC5KbxU3hBHcMDFP8bBjCoxzFAFwFAf6sKqCMDqR0I8vJ2Hdt4wdqI+q365zO4ZdlnANVSj6uGnI9aH1TxAX3qH/gbBrAU0EbjnyogzwhYj77OA851M8Frfn20dMEN4IBA/NF1IOCiJ/28vJxhD7oKcxKEOthHzwAGa/0RC+AXCQj+MMBKO6hqYKqH/RUf4KtjkzfhABd6TwMogc9FQ68ufAJ0uADQ67F+yi9aqfzje5HdyAFVEcD3gXiP4NOxQiYIyvldbjQvuLlAq+5M4PdowFRmrZAHYpsEYFBGMLSVMcpD+OVCt/IvRp6JYLUWCOxXagBkIJngdvS5VV9i5MMNb6kN8j8NP18EesA3zcg9dZtf89M+seEEoE732+IZUGtCQTscJwywPg00HlCRArgBd7nPFziAwe6PfEP5XCakr3Wgm7mbH+Auxj1xQefrLq3w8U+ryj9XCEDQNxJgcx5w+lUKQPlDAbxpBnA5wNZ48AYTDUz0N/MytgG/MhghdALu1zAAg952rC0Sgu1wogq4OQKgAnIm2NajgOu98TYaLjDa5cqInyKvq76uALTQK5AxQKarTyH6CfgN6D7+fG2h/s93wvhPDqiKAFspgBgwKop6meCVO+sZ481VewDkL1etAcDaHf/ckcz50oAbrKSuz03MAIYAlur/pSYRQAjgyS8CbFwWUo0C5Dq9gwKuWEoZdd4he6P/yjJAhJ4y9U18YZ0bAD7YxwHA2f5fmgUQ/yEAHhaOAtjMANkF6lCAwtsWAq6ZAeR7ScGvdnBwR5tQAY0LUDrRH/j5VBoBcAFH/3nNgx/gy204B9sBykWAYoCnShQA3NxlNYjdnSC1rQ4ACmO7JMQOf5vi8Y51hgGKBz+gW+QD+R8wgFxjBripGAABIAE3mQkClSgA1aelf8Y82/27raA7x/56tVZHB39LAhpQvqmJAeDXVfnM6n5v9OMKDgNwLTIiwBDNA25dHVwlEdB5n0ZfuACTMJASg9ysAUID2hxgbv7HVH519Lfgx3P6lvl9BUjj4zwDgP6K+G8VwHb8EYJVKUDX/EgEDfT5K5SECPcWfqMALPbcWwqYsj6U0G3IAwA4Dv8OAyD+1icBrARyIsA2BqhOAUQBxfvWB/LcoFz0S6PPjcLe0Dwf4X3NDta6gPkNG5R5ACibEjDwF8V/WwMA/s0MwNHBFSmAcS9XH36TC2iJr30gxN7Gd6UInUHP11eM/yX4QwYA7ZXx/4oCwAW2BwCODq6tAhzZ57vANV0mOb8Y8Ju3xeIf3+UzXd2G2Cde+Vo6+v3jX7gpj/9ODSCCv3xtWFUVAPX7hjIY5wVSCwMYxA0DgKmd/wdT5QcQwUYrjf98Jcj+eC81owAoAmyE/9MSAUTekl1IBlOarvQD76UAoFneAq8rA1ojxiSQeDH617I/XQ983kvi/3VOAVAErlMKOH5QwLUC+lgAf75/TQm0SQY87ldvYG9yP2B2pgJKCSGK/74AtI9/gAHKw3+eBhwJABcQ+OqEAGYEurroxwwg70lXhUHdjwCwgaZ7kOcnAbsY+2RebvnXnQB2qv98oWD8Yz0rweoQAE8RggPOw7U6+jEFXEUHSDOwt9y7SwCy6bgA3VdY9x9M/0cLAIAcCoiHPyYEIBKwGgEgAlABXUXwy10ADoD/o+lfvQOYD9oVQD/IAIPx7zIAjduZnuLcH7spJ5DL0MD/1QjAnhhzGtLno08egL2lRCrohACaU9BTvuBrvVIa2LAAyFn9B/pbrftYBzA5HLqiDIQC+urgxwYHQADAbhIAGheaYf3Jrv7YUqgBYv1H1+t/6EH+z/CnBlRhGjBYHDhSQPv54EP+hgMcCaBivivvNOPPS3+CxJYEoGj+xzIArrDaqAGZMvChAvZj04kAqWB98GMOAHTowC3/ADSN+L90bkO3lgPoKdz8YxkAw0FW6P+rmgZ+UvAf6lCATgV3AB8OMCmfuwUArnfjPz+0Bvtkxr+PPzc+A3AfG6DzkhQwK4C6EeCgJoWlGjSkrwcfDsADyAlMzAdfoOeDDQLb9n/YTQBtSfg3SSBWHv8XUkCqwHVVABTQ74A9HKDrQA77w/aGG3ABwOd9rSWHAWjVGcDaMKcA6lIA6wLQgYXY1+cAGvCbG/DVXG82gJZLP2DWQ3/b/J8p+BXO/9kI0DUsBdcKsCoF4AHNcP1a6K0OsOk/HAC+VhME8q+QCeLtX36jJx0Tysv/VycAmMdE16oEaQ+QIGCg34EDAJZm8AV7M+3PC54ozgBghDj9d/P//Mq2Uv8zCaAOBKii//0j5D90YAsiO3GAHf+82RV+dAdq7sszAPC26T/38QOgt5QBiACdWQgorSL8eAAUcNsLf+oBYG7frf4DfODnpsQR0vzav2ABeAC/3QkY639iAJMAciDAEwvBqpopB52GbkcHEA8wBGCyPZMVmiKAGF/YPP+v4Y88YK3+wygAEwBOUwVwqI29TQTGYsB1R7t7gEn/NMzOqUDccxMZIMMFQB4ygMF+rfy7eZ5AAIAAqlMAa0PwgKa/7miXK/jS8AGbGHDLPWSxsvKvx39cAYoJgE9R0LclgEopQLxTFA4gCOzJAfP7P+YSQuDm1loXjn8sOQxQoADMAZCxArw5QUAFgMOn4S+qQqsAMoH9cgGDNd07FgQXKU/9MGfGL1oD7MAP5msMDiAAmCLQp8hAfYL0npmArQlOhf48/J0R/5vGvwbcwd5P//T2P3rh/D9uQAAINgPVKwnxNDFZGbCfDLhJMmATACjeOR9uffkXS9zR4/zP6D7etxsBgHVAo30i/HqXCEFgN7uhA6QDsMn/goFfPP4t65ef/Yk7rFr/4whBMoDjp8KPD1gXaIa0NweAt3pzF4FpjthkPv4xA0yPBMU2ZAAtk4CsBP1EH7DFgOPQ7wf/aOliM76JMzhLv8oLQIlX2gC/7pr6+Ykg/s9PCA3NCf4PMoDKUYByULcvBVxHDlCw6z5bLf4VS4EHBPArBsA28UDfnCGAqgowfpbQYd+C4I23dAFVqwhhAF7rdgAnXgH/2+k/r/DDW2H+b1kAASAKINgOXH952P6zQjfSwTvqdmfI7FcwfCC2WP/Z5pz9q+DfEvyvCAAhACTg54pAtTBg11zwpnWApwRBOIC6ePyXwO/HAPvQn1j/+wHgpOFHAXwiD5jdosiAfXyAuUE10o32N4+I5KufuP83eVVAvrwm+mM3EQCkgEEGUH1aEBUw5oLtbhpA1wRt6qfdoMIm4BThHz8ArhT1G9Bb61gEEDwZqLbNyoC0x/i/3W9utyscoHnArA1bLfjNZwd+Z/+PMw1UTgBXrldeMwJghCUg//pLhJEBt13k34j9za4PAHBUnyr/0tfpANv92I/qM1gXPvnFN6kAkAF8KQOwRHgvGQAD3HQUsBJQXtzbCFCpAGCbVgHekwCL4z5GBSBeCV4fe+nEgB1kANw/NmxuXiAo9RdvANhU/0tWCZQ/+s+JAXYVKPB/mR1MQfBLJwUAf+yYzgW4UdPEG2JAiicAguNfeDeTAmsTAAQgBCAmuHwF+gQBdOAoA9LXoU8EsOsE6ZN37jdYWqcAcAGHArhdMf+PADxBAKwD3oEA1KRAf/tqAsDgAEDnbksAoK+P/kAO/GLqW1ttoALAHMCXuoA9N0Y8YCf2NzrAnP6EbTsKqhx/KkDAHMz/hvP/DH8EIPB/ZQZgc0FVDdh3kSgcQOBf/8h3AOca4O8TgC4HrNwAQATwE4DD2L6qBAz8UACZAB6ws90SwV76luc/gX7h+Dfoe5Xf4uf/2egv+Oc1IMf1i0DqzwzjAzskg054IBeYngik3roq/B/MAOAGZv1/hQRghxQQ9M1jBUc7mWRwlwpx8s6Gx+LxH0SAOfCtAOSmeP2vBZ/b24j/qcIisKrrAw8mGdyZAq4pgb4mgNVSYGUGYFJA4N68/I+7nAAyBfgE/Pu5AJMCkgqk3yEKZOzXI5/ggNX5v2IAA35buP7X94rWJIAmAOyXCuABt30d4F8bo4DGfq0l3jc+/8esBSof/q4ABH+1DFS6sR0mhvGAHeEXByAKlKo/AFcfVh//7h32jz8Unv8zdozxjwDYlwCk4wKkAv1+8Av+wgHbDv836JfiL93qf+42GW7QN83RCgAS8z0ZgFRAygG3veDHBVIKYkDpAuDy+p8pAmFwQln93zoB+E8ygD3hxwcIA+IBO8GPA+R5AWx9NTDAn28z8BXQ7m6Q2OxRMMPA+FeLAK3tMi+8c0nwZk1ygRjzzl38J684/zc1H2esl+p/pB+feoV/3TWg9feLnfCAneDPuQAwA3UdBqAB/fxUAF/bXP9PPQUAQwB7esFBrw/CA4ah3Q1+LCUz2tcs/g22/9Lo+IAZ+nH89wNBLgBq+HfFnkkhIwPwgH3hZ2Zo7fjfsgCccW4nBDYIf8C/Mf6nAQDw9xYCesOglAOGbkf4qQdEkd+W/xMSIJb/wGzRB3n56S37/xj/6H+2ge3sAaQCigLwgH3hl0VDqbwCZAlg/SPArA+sDv5XfUn9jwLg0WwD290FzEnCmgN2Qd/UA0qN8e8zgI3/PgMwF7B5/T/47y8A4g2DVgd0+8CPZQ7oSs794isbd4AS8B34Y7s6+JtF4L8T+LkmzDJhPGBn+Ms5IBntt6b+DwPgEvlDoP9NDLjyydF/lAD2Bz+/uxxw2wF9TH44bdwR4uNPC57/FBvIB/k/AjCO/jutDUAGsESov+0FP5ZSDDc46zvpcfyn29vt8Z/xD/9/4irQms+ZfsIDdkA/9oBYFITxP7Xh+d/Fw58oQPrf9g34x0tA9hcB4gGWA9KO8FsP6BTWSv7HDECb8wC7BaD8+T/WJ9pB4/8xuArD//4zQ0wP4wE7oI+l0uM/IwEYHP+xlgDA3JZ/miP4swkomAHYVwYYDhAPaPeAP44CyXAA+WC8/ZMLHVnAK6r/UwHy8If9tx8EtcPJAawSIxnYBf2YA/ynP0Spv8EfL1hvJIGk/4z/eBPw/hHAPlQAD9gZfssBdu4fyAuLv9zyqSwBuFkNyCeL/0HJ/9/XiAOGA/rbnujHHJCcWaBi+LEiArDgY+0E/7XngO28OsBMDUpJqE87om85IKlX6fYvPwAw+Iv0v2fI/x0WgNU+REqMdLDdC30sVdgBDtDbCwBQvp3961T6Z2aAfm8RqB8upJMBhMBO8MMBybwC+HnTDMCbKgvG+t//Xi/yXx0BA/y/9dgnDJh6AEJgR/Rxge2jvwVpupkI3HgOOOEf+NkCtEP8r3Si9M8ekPZCHwdYM/xt441uSgCl6/+5IfyDP/EfBfAd4KccgA8gBNrbPuj7HLAWf7ifbiLBtt0/PfKP8Q/6lbcBf8mjZSgIIAT2AN/ngFL8HRcAcdYDler/qx/+7fT/98gBrAuQDBAG9kLfcoDcePhz7yYAoI+1a1YActP1g6b/75UBYnpuEA7AA9rbLuhbDlipABwGMMeCbdL/nQn/OvrL5duYzwEnwsAe4MMBW/B3ov+mBQDwwHUS/hn+34f/wZ1EAA8wQkBIAEB24gCvDpgCBtD8z9fD/N8/+4nwj/oz7H/4lhyACyAERhLY19JSBJAWPf/dYt5umPe/SvIP/XMEoOA/9m8HvTRTFSYMjFpwZwcQYIuf/+WDz1cKz//gneF/OrqzP9/S7GJhqwW7vTkgDv40hwEqPAKc4Q/+wC/tW4pAaREJ7KwD0poCoO7x8T/x+R9Xhr9Rf38CATA1pGcGIIH0O+iAjet/IYGtw5/o74//7+4CZvc4LnCSdGB3HRCPf3cFKN+I1/9YJwiGP8z/HZE3j5pECCgSIA7srwPc4u/i+u9Su/KKhn+w/+N7FwUJA5DAdWcdEJ8AAvamAlSo/zFKP2r42/H/pxhScHxNlQBicC8OiPP/8DHQsdlH/0/E/9HiDwV8Y/CnOuCAELhbgxjchwMKnwBGFyM7LD7/Q16G/Qn/k/Tvu4PPna0KKhLYtSiQyg+AxRsggG2n/uvoPxv+sW9PAbYujBZEDLY7ckDpAbD5zkiA4vof8PvqD+b8c2SANHxgTgz2aT8XKDj8h74hCcAfupH930+W/nMAgP3/HPidJ02pjHBHKfAz/lzcTf/xHjDwnkv9GP5G/KvNn3+cE5APmgWje0uBGQYAfggA0DcyQA/7T+kf+Qf8fxwF4AKBFNiNA2h0PEB7wdrn/9ngb5N/aX+q4QGOGDw1+7mAfwKsjfjlIoAI0HaDDv5PM1O/gfb79tmA4QDPBXbngDkKWPn8TyP9Kfzp3B/TqfMfaVSFtBrEzru5QBwBqAGt8IQ8+mF/lfuPXdX+/ugQgAeY2YE9XYBk0ME/yPqD+O/Bb2d+/gJDC0ICYtYF0j4coFCffMANilcA9gZ+gj8ewOD/c5Ev1YK4QJd2KQjRuVvFAMT/dgK/3fQB+/P6o72AVQJOINjZBdpw+W95JOiA38Mf8f/XmJkcWGaBLxUDyfMALjH2tyX4OfPRrf39ZUoAErAscMIFduWAdUeAoPzI+336d2p/f0kYQAuyeUS7wHn42kgAw7vzP2H9n9AP/Krwl43cD2r8q8KAIQE/EnxdTrAEf3HFH+63i36kUfv5y7C3zxlwtQAuIDTQ7sEB4M68cIHws/DPkL8j/P+2YGBYAC1AJBAa6NLXccDq7E+oH+53Yj/qn/zv7/aAw/z8gKUBQsFXFgSK9/+0ZvAT++3o/7vBR/mamsDBzBFBA1/mA5nwLfAx+nbwU/dj0Y9Q/8MO+YoL2JwQO58HfOCrKYAPlvkz+gx+8Dfwo/3/XgWI8X/D5oSzPtB8iQ8kjAnBxbjfvAv6HvvbVR8P8M0GIkjAqQvgA5+sCWeZv7XEn9FvFtE/zKB/eIDv1AbFnpxIgA98MhFMCMDC3/Uj+gPMP6V+PeeHBzziv9GCRg4SCNhFYvVAJoI2fSoJUAUwQx/0Dfxa+RP7H7wfPHlqXg86PtB8phNoBgB7AR/Nvwi/nvV5ZP4lgQDDA3CBr3MCewJUK7TfMPQt+ib0g/5D9pVFBKcwQG3AFgiyE3x4QapfFpaB3zPyGfo28mf8zbTPwwti9MkIrBrABaydRibAC2qRQUpAz8gHfGUK/IMC/yH6yw0toMVAFAsIB5DBL7KBiD0Z9j74cL8b+h/af5sXGBcgK/CdQLwAN+g7HGHlsCfgg30MvrAW8D9gXwu9vKS5oQAe8N0A68W60RnamaqeHB3d/WvygwM2Qg/2ke6TpvB/qP812HPrRoKYB9AFIg+19dKwQRoWQw/4LvMfNOiP0u8GOchkMaZ5YHxFdhJHaIZCawR4kA/Q9+CX9ogBNTxBkYAvCGJXOJ2x93Pz0bBTjLot9qD6sQfu9ecKNQmUO0F9A310nyn6kM8+qH8z9n5eiA9gtZ0gZn2m+R+D/xPlIC6w7ATH/PbJA1+J/hz3H4P/c/2AxFDpAcMDUEF16O3IZ+gD/qPg84nrxmACbehC6wf1sSfbn8LP6H8kfZ/oBLZA5LoAC4y34A7yNtdzRP+D9L+gSOiJQqjAN4HVB93HHfDBfoq+vB4LPT/ZrCYEfPos+tsNmjl4Q/8R+z+d/hECaEJPElA53m6EeyK+Rf+xzus3mzMiQ+QiUK7H/cDFAf+xv29nNTBeaDMGbz/lJt0gLp0ggg8s8P5jmm8X9DFwcHwA7HmXbn6Cbr5tUv3cH1N9+7sCqUHkBpoWdIsM8DX2j9RvRwN7bqjEVjIg//nusbVnfzuYDwB0QB78Ovq0x3j/RvMGuAHRocgU2KbC9wj9v61Bz0qp0WAFv8Ef4xt53mOO97dOCAvnkQqbruuB+2N13zcxXZ0BUr5vXkBu4Bd77Of/A/SBDgO8axeANCzYj31d33Fpuf1OPKgPfwvZ/x+x1SzgIzSqFgAAAABJRU5ErkJggg==\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"pure-u-2-3\">\n\t\t\t\t\t<h4 id=\"status_dns\">DNS<br /><span class=\"red\"><%:NOT RUNNING%></span></h4>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"pure-u-1-4\">\n\t\t\t<div class=\"block pure-g\">\n\t\t\t\t<div class=\"pure-u-1-3\">\n\t\t\t\t\t<div class=\"img-con\">\n\t\t\t\t\t\t<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEECAMAAADwPRpCAAAAAXNSR0IArs4c6QAAAIpQTFRFR3BMJUVjJURiJUNiJURiJURiJURiI1qBJkZlJUVkJURjJFyEJ0pqJ0lpE5nQBaXZD5/WDaDYFZnUDZ/VDaDYEJ/XDqDXKXOtLna1KXWwMHm8CqLXFprVLXWzE5rSJW2kKEpqJ2+oKEprKEpqJm6lAKjaKEtrLHu7JGyfM3e7JW6lM3i8FpvWAKjaFM8leAAAACp0Uk5TAGUrW1FGPA0WITQFdYQtu9xDHK11XImCQZq7mPFVzOjFz/ils+rgaWvlYxD5IwAAGzVJREFUeNrtnQl72roShrUvlg0Bwp5QAk3CPfee///3LgaTqZClsQ1uac/52qZ5EgPWq5nRaDX5yRptnp7e39//HpErTf4+6v3vd03+bE3/PqkeQCn3TwUwvAD41wL+tQBPzv2mBR2WmkymxNcIAxCzjPFvWtPThhagNwgA/YcAGA2HT8Ph5umVeDJ8sl6vJ8cvfyoAUKbKAgtFCIhRe8ZAyJ8PQFhSSglDKsH33Pz5ABz9qnVWub+U7kKC/fkArAS/V+f/MvilIH9KfjB9ej8l/QAgrGQnhT67P5hHUM71ZH3UcP27ATD0ZLNSEVDo5owKYfwAEbyPOWFT5DeTPNu1E4yAgkCvaZF5v2aKeHKcVaZhyINqXPnoMykVOLOhNl5CwzOIgAEfz4KYIJ5mw7NGDwNg5hu6/ULBtVcie936Z9zGPIQoCc7BfADVxw4e0wIyuHGoO4hyfutvKfNiJIhxuNpwVwfg11uABgvwIqBfjWE7p4V0V9/CBRAAQUo9ogUAgDWDQkvfXEUGpcjA/QlIcROaiAbfuI6DJps8HgDJubLOq8WwJNyA+4MgLYSGELhd+ZJm5SetHw7ArKwXQUVmIAIGtqw5uL8n6B0xFZg8xEFnFeeS6UdyATccDjeb4XBKSpV3WORME1+L5fNJs/L/UeXzvpwSejw9/rq6dDl314xkceJ70uzprAcAcMnvobozycXZGyrp4f9+0Ms8I3VidPK/H3XJosHu/T40deRB5AOQjIA3nDXeeCX7JPUym1oAYPfOyxIoeRgZUdPQwX2T8ZNXslHMmHwLeCZA0ouDEE8eQMG9cOtbLhXKpgGArgBUr3ZeHATqDwTAUW/AC1TVYd7JApal/QTtifPM7idrVIlci3o5YKCOFkBqpBQEHuT+7id8+oo6iIChXNcYEAriICQMoOr2hj8fANcQAfu1AIiDWfbrAJBrCQMRMJS7IwAwMsUeCIC0EAH7tQAIM9I+FAC4tX4tAOJg2J2QPw2ANMFQLxgnbgEHUi+9wQFAl5Kbq+Jz9tMAMA6dVghITJCI/FT4aV5/oc09C3iJAmCiCrx+8YkDAP3lAfPpUWW4r3IyNy01L3+8fJ6OSb2e15PJZDOcnPSsBTUkkCrYaLaezY49we/Px7cbRd7MPZ/faTMpNb0U/3x/x7so7683ORiwsecPHTWzWj0ej4vxSdoRkhUZ8eV+hCIVcYQ0cpSNI0bRDHqm1PWe9ILZ0cz5AGYkLpN75i5986eSgDJB4tJPnj+VxXdegOi73wcq2R8aA2A8VuNgEQErHAAUHxqk3nv+IH1AXQDsOvB5UimICYVrDECHeVKPChPw5i5AoWp8NzBUINd6cj4AQAUNUo9SWQQAbgGFDocRuCaEFSpqLTiAjQurqD+FHuYQAIhfq5zJ3JJAmWhsATp00p4U5p+GKbEMAeAxEJTtC43QQgBQLhSz2gvT9x7/GAT9Xm2ZFJTLzE4TAHCrtrnkvI5A4RpbgDZMSV7eDDPuvkOFz+EyF0qMzSSnQjHTLgZQVusBhNT6ALUtXcCV9yVKcyis9ruH7+/DGwGMLp/BZHGqdg3X+BawJFHlmoTJ3+lnLG8VBU0qBmjDCgHmUBXgdgC6qnbFHQGFAFbCoTEwTAYNFa5xFMyKF6/LpOvC1MUc7gRg/lXtTJJ0Myhzi8fAMPmDlyFRUAtqhn4zGG+otLkTgKmLZxnj2amjd9bLlLBc4jEwTP4Y4EhEwfO7D6YnLT/LLuOAxJeh3dEF4M3RLE9zakgoDq+E5M//CRYFwVDgChdJVvsCIGyDCKeKDLkC6jtqEyKMgtYPFSJDuysOBYDnAaWljbwAU6eCgGqDms4jFRmJChAFo1yVRDusbj1cn9R9/MMRK/AZaZ3X2epiBXr7z6oS0RyakqCKCVlVOr4AtCCGc9OsodD8evzUkZskGQChsTuvi1av/62T3+qHw0K1L/rMCoW0KyDqzSR2ET4fid+L5rQeQM5IQqqofdGc2ub9Ba695aqdhM9H4taovteWRZOkbD2ABn4XBirL7zUOGJmPRBLXQ21ZCKLaF72SFh0maWExwX3EZF0agLZIrz0DyE3EYhnM1N5JwqYHHLntH0DzHmOWwV3dSZan04Dc/HQAeCbE5P1X/3ONJIK3A3AYALzLbMT9dxhoqhNpgCtqf9oXADwTuv8eE60k5FhNW+TPXgDgmZCjVZXdcwfUZrM5z0eu15NxmAj2DeBgXA13Gt7oZH3Uqvw3mcw6IBgMz5oRTzN/BWeiKmB0Li9qE6H/YLZWnwjlRX4alTEumQn56xAG7XfZDGr3v5Dn9AIPJashw3PBcypOt4pYQBsAi9NAtBIc3r02E/LXJA8IssvmPgC0oVTysuBXI/Sft1sAAKjkgdhLa1x7AAkLcF8AXMIFRtd3UlDFDBS8TwAeiIKCveEAXBsLmFDKhZQqY9YY7XwL+MzA0plxkJL1CiA2zKZtpr5uZ+MDcNpYyzIlBeeUThoAGH25gPfa7x6AZeWESCLYDYCJAEAyoQqED2BOuRBftdgqBjwTzAXwbln/AJRMB8FR+yA42myeSs0QAFgi2B3AuAUAxtsBwHfZQDeyDQCT/yQAeAI2CQB4orpV7xe0DgHgiSBZzCt9f/v67tscC4Jv3+aVll/fzcfNxmKdD+AzMq6BKLjQiFUSQCZIWkUB326RSuBwgf0giIq0BcyFDSoWU7jUTCvO0i6gMLB7CnW036eNb8fgk3cEUa7TLmC51DWujStT8C3NMBeQiqS1lQS0TRFgO0ZAO8xlqQ0B+Dea0cx1WD+mqaugcWlOoelLg4LV5CNpfWQEZLYFicnuuPe64I3RT5Y53Kq+GPClUK1HgIwMvcZlFKmHUDtDQPO/Sn3769uX3r69VTp+rwloq/Db9GUKQzxBKdqNkBh+sf5QXGGeCAp92ZUAEvIABE6LRR8aFBLsmOp282GMKx1pfCyWCPpiXjRfIgDqg2ezCRnFYxdSlUnSRlkhTPR39AoIBnNLCAizgKD5BGGZkC2i9+zUvg0Ap3huSFRCIiNTvvi+owXk3gvxwUiapVhBQEPFqHKQDGFOwDjWWncAEJLDh6OlSM9xWyENwVVdl4wZLHdtEsG8BQAX8R08E7KpYKzppWYJIi15YgtcCBtPBN2edgSQfTSYtgUYDE/tnKLRqyDxg2QoKpczbIYKtJUdAVg0F+asmQOAPZuyggPN3k96WnCpkZ0Hob3hiSDrCMAhAAA+eCXevbNCrs/FhZGBy5EsB+snQ42cgBo0EWwBIHhlUkqGJol38NmqKm8AYNCi90izhomg2ZFuAMB28ExIyDZDPGsEAN59XJxHdy6q1oAZJBFsDWAbK9bn6qTl6m151vf5fP6ZagM9zZIAQNykAIQaN0gEXRsA+5gXzus+fpVoAztZAGGyM4B4OvO9DYBYlr1sASDsB+pJDEDOgsajDQCDDIi1doGi6AggWQxGQwCTo4aT4UBIHaYP3QGE1cjUWxoAVxbrDOAAUoaspTDrsrhHjesSIeaPDLUBAPCuHdkqURTb7W73sf2WBlBetNtui0IpTXhbAHgbaDmStxnPCCS7CYBWqih2lyIJZdEY8O1sJrzCtdsXuVJNAeBtoAtPcUsbgeGdACiVF/vtx7ncO+5RxAGA6EcO78MVQwCgbaDlAUzMCIRtAUB91dwWag7SufYAzA4s6UgCLKkFAE2h+qEbgBtBaD/4CriL7waF6AQgHBiHWPJXcwCZQqofMQJumluAQxLB9gA+7I1BENpAqP4WRqAHo8/DqNIYtQCHJIIdANSHbFcLYElA40Gl18NofK7+8O5wI/DXG4w7AaD71gDwgfEVYgHTpxdvhgiqv50R+BvVYdZSLpsDKIobAOxpCxd4k/ZrOZC/pkdIR7rI1AAwGS+obLEVYJ/fAKDI21iApAXPTLigYWlJR/nH/2jHZJ4Lpj0XQAHwWwAUGAA/BmgmTncYrOzsqKud+gVVtvVC8K28AQDdtwNQyiherHoBABPNCIDkqM5bGwBi2xJApR4sAIIgCiCdy7zOSy3ny0rfl99/FPGk6gHob30AwIMgthWAx0cEQS6xk9GlsiiQ2bYDMDekrZxhSlARAEivhN9ByEImNxClV8mwXYG5wLPfCoivEy9Ag1Lj8Zgcx8dLDUklB0dkxF3ALBaH5etJnxfN53q7J4NFqWwwYMc/1o75dmyM0aVcw0LPf9Bf82st+Acv/Qi8aLVcrd5Wq9VnDMC0rNCqUOHZiO+wwVpXZbcGiQHBWgx3VPkG2y025IfLpt/hOywjClYGRAGU8ikAgOr/TSY4HA+CA4h0rfbfkCCPa5wGEOkf0QwF4FMIAEDZQcFpHZFFEu1bue4WMI8E7EIT0Cx2tAtQ2ACA6BkDbDkrtT5qstnMIg7QLs/BNUgDOJB6Ke4/2vXlqdJkeFAk1BAHkHEdLAkAB+gNAMMBoE7gxofD4KIxkSoK4D0OIBM6XBcDtB/NAohNrJaQMsxxLhYwGZ60MenyE5dbzwEezgKIFL45pAgY+lzpq/Wn1nep8Gwj6jnAw1kAcZTFTVRJv/xhWwIEguvBCeDdHwoA2D00CSGBWFmBCotYDCwOAwfoD0CGAkCdgKroYgoofyjDWbz84ARckQezAFDOEiaqhIPyJwnIWBG5QhyAuNsBLG4AYHOXMNHsRMDSuAVrkRHiRFh+CP/w7vV6+zUuAE4AJlpLAMofIwDlr5Hi8O5dXOCtNwsAJ8hoAq5gyJouJ4oM3/7T3QJ6B8DywpK4xN6SpDSnqSo2RWEQAH1bwCsBta4ixhXk97EwKCWJiirFfy0A3AJylii/IYzrZPkjSRCkQDR7ZAtwuWV5NAJwXVGIyFAWpMHBKJAt9AMDkAIy1kjvLk7AUguXxjucUjwkAMgDXG6j5QcCkfKDscSHHCh7SABwa4zGsqBKjJp4+QFS6ACAuT8AriMAMM7ACQK3DrIhgJIgQDP4nD4t4LUrAAhPOrdh+WPV/VTJIEQU9/ocjwgAqiij2PZmuykLvXnawLxA3CeCTjDLHw8AVFHoBEp2GhS19HM9u2g1eSYgIR8JQFhF48kb3PpaStIJADEvkVNpoKUJ9C09rdMjAK6ik6OkAYCNYsalV4gMmkyMfOvbAhaJ/az4zBDM/QYTI0yJ82ldAQCwANwJ+F+/yAJ0YRoAgPlPFs4LwG+/pgiHUQsgurbXWex6d4HIPiIuCcgFAKpqhzoGFxhW8uzjDMkEFoA4wX6rF0e9XnR4Pcw/DmfND/P5/ECayelSxpgPNbZjO2DldHu2KEV3dQQYTc0OXyqWwfwnlDsU8PLXCI0IRNn5/PP78vOkqrDHcm+3unwltsYDFywl2elg3Qj/4O5qz1b5Z7VaRCdHeVmbkQ9JahM7lmfw3zrt8SUyuPBXZzuKHDaEBMGu6wRRAGN02yScIPHNO0IDpBvYT7ZFALh7Abh6Zjpz6K4xfJkcfoACvkrMYhaw7gXAJy94phEA6ELJZRsAYtvhzD0r8lVPLuCYyKkyrQDs6Q0A6L4tAHu6w9ldAFheFwStzHP52njbnCuKGwAURasz96wsS3+vxdKK2/Wx2Me/5Z8XaAWIUQUGAJTvWwFwPoC8xZFzh6r01wBeXoXUpK0MV46Mnp9ny+fpUeUTxxxUa4t9g/wWAHvaBgBUwGi2rrRaz2aaZNy2r35/z5DrunFSbW8AsBUdDx10uhJnGjZBtdku4yK7xlpbgP24AcBH1gUACArQyggyapFHmNYHwdN2Qa6Y9mDtWgGI7hrDAQzSRwPiRlBzoeGkBQCmeLXT84RCKHtKBW03AOFae5vJ8gOOn9Dm4FFFSCsjyCiLPGK0+bY5zST/2vS621ORGdcFgNk5KHSJteRKhVq0sABHdVC3ePXDi9sAqOloGSY/9uXtl0axL6hk+GpqXVfoyxCFa+sCUIlgBHj1g/l0AxA2Zc5mgpZG8VdaUGgqM74lN8UAcGPECGZHPR//HKQOAkgXAKlsDrGAzGp8y9CgBQDYPg5G8FwpOELjNWxCbgdAu58hQvfdAKSLYcQEP0QF2sCbHx4htp0BFMUtAKLPyHPrGIBx6Dy3A8g+Wi0kxLsC+HgMdqAyDgDC5+2nZptdVwBuz7sBwI7UniEAoA2MabFalWORoAQAt3PtAOAnSenL0POhGpidlydJ6fRheiAWjQGvwasickQK5OkCoA/bFcBH1vQssSwHyshRUkaIqAsIzpA2MNxAgh+nt1WdAViSlpTBmgWkJdSSs9Di9VHjo+AoZWg80FNFRYadKCm6AtjppucJIqvXDPcOjByfNXCRE0WhDYxJyDZnq+cdAeBzCtx6s+PYgYJwVjJypqwGZpGMud3p+h0B4LNKuQluKt4SGiEMaSKX0SzWBoaw8Qdb0n1HAGpLEBWagIRI2krp/KggUsBbY7s0LUVPlu4IQGybniuMhwFaZKSNZC5s9He83dHa7KMjAIqfLN3waG3GZe5IG3FjuTTI/jz8cPUwljkEAN4VCLwPDQNWCOP5NC4rqmiYPlIYz4TC1uytBYAczYMSrZPX8kNUxwVtoFOVV7nxeHDRgSMPWEDmR5ffYDL4ODEMAgCxrgD+0E2dv8KOWX2J6NASNpXhPr3RsFxUeP67CR64KFibo6X3KcfWWx68Ds+DQNPNS3Wjx39rDS1/NLNDh9GMEJbMbnvIyp57q2hIXI7teIuuALXpBy6Wzo/k9qBoP9BymZ5sVbL58fI59pwhtlPNuwK5SU5nH7hNjnAivUcQWyUBMF6PcbyotNwvKs13C5KWPuwOi0q7xUUxsi4F4OU1rFdEMVtJW4ClnQ79u/28Wp2jKzvRER58EBFfc2Ty3gHoyBafNIBxGNsxPb+fNWoDwBW/CADjrQDMJsNJ+VjeUQpA+FxSbSxbegDm1w8YzXXvAPA8SNvrhY0vVCpmjXaNH7gI14y0qZ63SbmQygew5JdHfFYkqOkdQDQP0vCwXy4z3wIWlp2KcCoDswAAt4A5r57VqSMu4IzNlKhIFIIZfScAr00AVJ9fFOXHw8N+Yy7gtClRTFpYABYD/DvJc88m+rEAMHR5+bRCGtcwBriWLjBAAARDk2ATQOKeFmAsGPpXheemeRDsC0AYjIDEG3LkWwsAp6daZ9a4IA+6N4Dy0Kijvq6BU2pfLoI1w0gquLqfBTg0D4Kzv0DXAN7PGpD2Gi/mg8FgcTh1M9MJCWh5PwtI50Gg8ajU8vhvOh8NyB0lU2MKOu/bAvA8COQ0r+64pfCxJ0eRTkkAoFcLyEQilYfaul0wmkId1i3tHwA+DsEUPI/zTmIVa66xgYn+AeAjUVlWhQhHULXsHwsT+T27FwCHAsDHIhWD3u99lElkzYxUd7OAz+Z9gVwn/ZVoqsldBG+UAVN8UEzWJkJvliQ1rwWQMxKqwJYEZYrcRUpho2pMhNQ4r7eAInlX8nvt4huWS6zxBVEXPI+xu/xgYiVp+Bz8LFcRFzBUJD5KRJZfaU5Nk5E4v7Fm8l45UCUjknN0IJnbeAwQsYphuYovv1JFhuVB4U1yc58cCOy60SytpcKl7DWDsgTUgGlIWSCBB8z0TiZwOnybLsbwE5p8+iuUD7nC1rk05zpdv05Q2ywPghIcFuNSpJNgg/VRSCZkoCCCGjRVcHCRxwQpnoeWJ/KgSrA1/nYAsUzIjQZHzc9zkiNNIF6nj3VVfsumChYHBjJn53KlqHXORSZ2ewMgbVD+07a6y9+ZhHIlQhZUORgEluVAoFi/gMLBfyLM3QHASJ8Kijf1hiBW4CNoqw1Ob6nELgexPHKqAbgpDEvdC4AS/DwWF6bXIw/AGnlKdlCb4NmIwYDMU3L+y+TV7ZbVdkcXcKeR5bw4DUIbFwEwQx4SHTb8kBYk2jh8AhAGjHkBo+Tu7jHAiupjqjFKBAAa1g2lVDgEFwLgPDfCL/MDkAcBgAnppudKYSZ0mZChYo4AQIya7QuLDrEk58APUBlBHuSgBHdROCjmzGdTACavj+kQASIxELGAhQvyoP4EPa32MYAUur4dMFQgvat2iwAY6VPCdAZAbSwTCMOgkp0BSNsvANsZgFRBLhjNAwXrDEAY0p9CA7PzaB6ATKBBtYMxhDEQD4I5C/KgvhQOihkhXhtbgMl98w/CQaR7jVmA5MwP072KKX8N6pULJBvcwqV6zDJnDRegP109CNQAAmioexG0srCOdvw0LB/kXX5ZrScjUq/B81GrWan1ZArmf50Wjp6npebz8siOmC2vN5tN+VSUYfllUlIFBJAH9aJjKZbHf1N3vZJaMRg9r5F+8ax2LiILdOc/XvcS9SfDnW/rFYLy/mazI0PSkyA3Zldr6SVLxu7Bi5+8kYgO3nXRDF4wSEk8BJD69wxACFvX+BreDMCARDRqBICJ+nBv5E8DwCL5kcpuAzB9agDAcRMb8f1pAIgnqA1NTf8AlALoDwIA/JHJ2wDgLgDzNNI+EgCITzcAcNP/4QAkg2+u5H4ZAM3T65HHTS0Az6qYCLPycPyjL122DsXPKXE1cVCzw0vkbM7kqvSNYDq+lB+y8vCZ86Q3OWQ6LoyDJhNULkoAoFFDC7CKc2ViezmYIr9Y+HScKUtggxgwahYDJhd+1kEE1N6HPoqYCvvyziouMgMxAAdA5nUxQDNJBTMQ+B4LQOiOhp9vWoIHa78Hm8cW9yxjgwv2bEpW+H73EAoDsuCV2YJGy8+qm3f8MrI8I6GclIPZZDjcbIalNqtREEwK5bym5zE0HmvBtHOX++S0CFPlzKs1LWRNFy87b1Gl47OkCjhTSS9eNRpNl9Njx5T8elWPqHgihFRuz2RsjNPRipMSmnhi1F7HE8HCxVoXZyBPkPM8CoBTrNJ1t86Eg0HV+mPdMm6CUV1z1aLKDJxBPiAAyVyQGEFBgnbcUvaj+zuwEQDHXWStjmOPB2BDQF4+6DirDd1GKHD/+sYtk9ER+YcFEOaDfjCjOqh3RlmsQZGZB+PhAYCYjNy4ZL7nV18iw/qaW0D64ACG9XM7luvE3CWjTEqX2N1qqQZbeFAAz7OzajuImtrk/l2257HODnR/IQKCBqOTBuRhpTIwhOjWdEszoZJzj0Qq+PnDKzyz8H0cSZshBiihUxNbk81wMhluJpr8XprAgW3RuSUpdYUBfhl9I/17WkAIQFPIA4KcSDIEwB9gAUSYIBM0XEGW8IcB0AQEWSLYvZcTGUH+fADVzzeaeFJz2Lhe+0bu9waAj91//mEA1pV007H7aQTA8P0sR35r4RYwAgB/ssAC/gXgy/1TAOh/ugXodSXiyw2Gp2OOZgPyr/7Vz9T/AVnly+6BiC1CAAAAAElFTkSuQmCC\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"pure-u-2-3\">\n\t\t\t\t\t<h4 id=\"status_haproxy\">HAPROXY<br /><span class=\"red\">N/A</span></h4>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"pure-u-1-4 check\" onclick=\"check_connect('aliyun', 'https://www.aliyun.com')\" title=\"<%:TLS handshake test, latency for reference only%>\">\n\t\t\t<div class=\"block pure-g\">\n\t\t\t\t<div class=\"pure-u-1-3\">\n\t\t\t\t\t<div class=\"img-con\">\n\t\t\t\t\t\t<img src=\"data:image/svg+xml;base64,PHN2ZyB4bWxuczp4bGluaz0iaHR0cDovL3d3dy53My5vcmcvMTk5OS94bGluayIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiBoZWlnaHQ9IjQwMCIgd2lkdGg9IjQwMCIgdmVyc2lvbj0iMS4xIiB2aWV3Qm94PSIwIDAgMTY1MyAxNjUzIiBjbGFzcz0iaWNvbiIgcHJlc2VydmVBc3BlY3RSYXRpbz0ieE1pZFlNaWQgbWVldCI+Cgk8cmVjdCB3aWR0aD0iMTY1MyIgaGVpZ2h0PSIxNjUzIiBmaWxsPSJ0cmFuc3BhcmVudCIvPgoJPGcgdHJhbnNmb3JtPSJ0cmFuc2xhdGUoMCwgMzE0LjUpIj4KCQk8cGF0aCBmaWxsPSIjRjc2RTA1IiBkPSJNMjk1LjYzMzQ4OCA3ODMuNjMyODE3YTc0Ljg5ODIxNiA3NC44OTgyMTYgMCAwIDEtNTkuNzIwNjA0LTcyLjU4ODU4di0zOTkuMjM3MTg4YTc3LjUzNzgwMSA3Ny41Mzc4MDEgMCAwIDEgNTkuNzIwNjA0LTcyLjU4ODU4bDM3MC42OTY2NzktODAuMzQyMzYgMzguOTMzODc0LTE1OC44NzAwMDVIMjc0Ljg0Njc1OUEyNzIuODY3MDcgMjcyLjg2NzA3IDAgMCAwIDAuMTY0OTc0IDI3Mi44NzMxNzR2NDcxLjgyNTc2OGEyNzYuNjYxNDczIDI3Ni42NjE0NzMgMCAwIDAgMjc0LjY4MTc4NSAyNzQuODQ2NzU5aDQzMC40MTcyODJsLTM4LjkzMzg3NC0xNTguMjEwMTA5ek0xMzc0LjIzMzc5MyAwLjAwNjEwNEg5NDAuNTE3MDI5bDM5LjU5Mzc3MSAxNTguODcwMDA1IDM3MC42OTY2NzkgODAuMzQyMzZhNzUuMDYzMTkgNzUuMDYzMTkgMCAwIDEgNTkuNzIwNjA0IDcyLjU4ODU4djM5OS4yMzcxODhhNzcuODY3NzQ5IDc3Ljg2Nzc0OSAwIDAgMS01OS43MjA2MDQgNzIuNTg4NThsLTM3MC42OTY2NzkgODAuMzQyMzYtMzkuNTkzNzcxIDE1OC44NzAwMDVIMTM3NC4yMzM3OTNhMjc1LjAxMTczMyAyNzUuMDExNzMzIDAgMCAwIDI3NS42NzE2MjktMjc1LjUwNjY1NVYyNzIuODczMTc0QTI3Ni4xNjY1NTEgMjc2LjE2NjU1MSAwIDAgMCAxMzc0LjIzMzc5MyAwLjAwNjEwNHoiLz4KCQk8cGF0aCBmaWxsPSIjRjc2RTA1IiBkPSJNNjY2LjMzMDE2NyA0OTAuNjM4OTEzaDMxNi4yNTUyNDR2MzguOTMzODc1SDY2Ni4zMzAxNjd6Ii8+Cgk8L2c+Cjwvc3ZnPg==\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"pure-u-2-3\">\n\t\t\t\t\t<h4 id=\"status_aliyun\"><%:AliCloud Conn.%><br /><span id=\"_aliyun_status\" class=\"red\"><%:Touch Check%></span></h4>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"pure-u-1-4 check\" onclick=\"check_connect('google', 'https://www.google.com/generate_204')\" title=\"<%:TLS handshake test, latency for reference only%>\">\n\t\t\t<div class=\"block pure-g\">\n\t\t\t\t<div class=\"pure-u-1-3\">\n\t\t\t\t\t<div class=\"img-con\">\n\t\t\t\t\t\t<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAgAElEQVR4nOzdeXxU9b3/8ffnzEwWEsKaBHFB3AC1bknYVAxJQMEdCFqt1qW2t7Z166KC2vTn0tra9rb3ardb8bqyuFRtrYUkREURAu6AClVE2RIIS/ZZzuf3B9prNSEzyTnzPWfm/Xw8fNQHzJx5WR/y/eR7lhEQkS9pUVFo54CMAkW4UCGFIjLYFuRBpb+InQcbeRDpD0WeyGd/r7kKhPB/fwW7+PsgABtABED4S38pwpB/+7VOgbYqrCYRbVJFk0CbVK0mO6BNlmpT1I41hTr7NeW//HJzsv9/IqKuiekAIvqyhtKSYXbQOjRgx0aqJSNg63CIFAAoBHTfgg8Mgv/+G44AaAKwDcAmAJtU9CNR2aSQTQENbBoyaflWqYJtNpMo9fntDw+ilKCVx2Rs35N9lBXDaKh1uFj2oapyKBSHQjACQLbpRoMiADYD2CSfDghq4z1LA2sjudF1w59d3WY6kCgVcAAgctG2qcflBCLZo22JHS0iYwRytELHADgcQMB0nw/ZAD4CdK0AaxTWWrGwJiYd64YtfqvVdByRn3AAIHLIltKioYFgoEjULoJKEQQnARgB/neWDCqQTSpYA+jbCqwMRq2VQ+pWfGI6jMir+AcTUS9snXZifqAzUAxLiqA4SYEiAQ4x3UVfsgXACghWilorNNZSX1C3psV0FJEXcAAgikPDlHFHImafApFTAD0FwFGmm6hXbAHWKWSFiK6wY7Ki4LSVb/OiQ0pHHACIvkArKwM7dmw6ARI7VUVOAXAygGGmu8gdCjSJok4FNRakOr9m5fumm4iSgQMAEYDtFSWHATjdUp2qkMkABphuImM+AVCjqjVWIFaTv+T1LaaDiNzAAYDS0s5p4/KiYS2zVKeqYCr2XZVP9GWKdyGoUUi11RGq4cOMKFVwAKC0saNi/BgbsXOhciag47HviXdEcVMgLECtQP+iMXm6oK5+m+kmot7iAEApSwFpKCuZYImeq5BzAYwy3UQpRQGsUMhTYslTBUtWrDcdRJQIDgCUUtZPOyJzQMfAchU5TwRngxfvUdLoOkD+Yqn+ZUjtqnrZNyAQeRYHAPI9rawMNDZtnCIiF6nqeQD6m26itLcZgkVi2w/l165+zXQMUVc4AJBvbS8rmSiCiwBUAigw3UPUFQXWiuChgIVHhiyu/9h0D9FnOACQr2ydXHJMwMLFAC4EMNJ0D1ECbEBfgMpD0pnxOO8mINM4AJDnNVUUDYiodbEAVwI4yXQPkQPaATwNWx/K19zFUlcXNR1E6YcDAHlWQ/nYUwH7G4BUIr2/HpdS23Yo5kUR/f3w2tc/Mh1D6YMDAHnKtqkTC8QOf11UrgRv26P0YgP4G4D78mvq/8G7CMhtHADIExoqik4BrGugOA9AyHQPkVEiG0T196HOzPsHLlu2y3QOpSYOAGSMVh6T0bAr50JRvRY8t0/UlXYI5kvMujd/6YrVpmMotXAAoKRrKC0ZpgF8W4BvASg03UPkE/UC/GZoLGcBLxokJ3AAoKRpnDyuCJZ9nQ3MFiDDdA+RT22E6i8720N/Pnj58nbTMeRfHADIdY3l4yYD9hwFKky3EKUMRSMs/DYUjfz3oLo3dpvOIf/hAECuUEB2TC4+Wy25GcB40z1EKaxZgT9aVvRX+Ute32I6hvyDAwA5SisrAzuaNl6oipsgONZ0D1G62PdVxfqQwPp5fs3K9033kPdxACBHaFFRaMdAuUIhPwJwmOkeojRmQ/CEhcCPh1a/us50DHkXBwDqE62sDDTu3HgJBLeBz+Yn8pIYgIdjsUDVAXWvbjQdQ97DAYB6RQFpLC+ZDeAn4BP7iDxr36kB/Akx3FFQV7/NdA95BwcASljj5OJz1MLtgBxnuoWI4tYGwX9ldGTezacLEsABgBKwbUpJudi4S4CxpluIqNd2Q+UeO9jxn8MWv9VqOobM4QBAPdpRMX6MDfseqE433UJEjmmAyB350X6/45MF0xMHAOrW1mkn5gc7gz9RwVUAgqZ7iMgNuk41cF1h7YrFpksouTgA0Jesn3ZEZl548LUCnQNggOkeInKfCp6Bbd9QWLv6n6ZbKDk4ANC/aSgvuQDAzwAcajiFiJJMgbAIfo1o2x0FdWtaTPeQuzgAEABg6+SSYwIW7gMwyXQLERm3VUVuKqhe+ZAAajqG3MEBIM1tm3pcTiCW9WOFXgcgZLqHiLxDRFaIbV8ztHbVStMt5DwOAGlse0XJDFH8J4CDTbcQkWcpIPMyOjN+wOcHpBYOAGloe0XJYQL5L97WR0QJ2A7g2oKa+gWmQ8gZHADSyL4v7LFuUmAOgCzTPUTkS38NBHD1kMX1H5sOob7hAJAmGsuKTlKReXx8LxE5oBmqc/InrbpPqmCbjqHe4QCQ4tZPOyJzQHjQjwH8EHyYDxE565UArKuG1KxYazqEEscBIIVtqxg33tLY/YCMMd1CRKlJgTCAnxUMbrtTFq0Jm+6h+HEASEEfT5iQndEvcodArgNgme4honSg68SyLs1fsnKV6RKKDweAFLO9fOwEgf4vgCNNtxBR2olC8JP8QYf+VBYtipmOof3jAJAitLQ02BBovVWAuQACpnuIKK29ooJLCqvrPzAdQt3jAJACtpcVHS5iPQxgvOkWIqJPNUNxbUFt/TzTIdQ1DgA+11BRfAXU+g2guaZbiIi68EQY8q2DalbuNB1C/44DgE99Uj52SIbqHyGYYbqFiKgHW1WtywprVyw2HUL/hwOADzWWj5ussB8GMNx0CxFRnBSq/91q5/5oZF1dh+kY4gDgKwrIjvKSWxT4MXihHxH50xuq9qzC2tX/NB2S7jgA+MSW0qKhwYD1MIDTTbcQEfXRHoVcVliz8i+mQ9IZBwAf2F5WMlEECwAcZLqFiMgpCvyyIJZzk9TVRU23pCMOAB63vazkByL4KfgcfyJKSbJMrMgF+Ute32K6JN1wAPCopoqiARFYD4riHNMtREQu226pXDS0dmWt6ZB0wufEe1Dj5OJRUbVWcvEnojRRaIsubigbO1f5g2nS8P9oj2mYXDwdljwKYIDpFiKipBN5LqMj42sDly3bZTol1XEA8JCGsrE3QvQucGeGiNLbeoGclV+z8n3TIamMA4AHfDxhQnZGdvR/RHCR6RYiIo/YrYLKwur6atMhqYoDgGE7S8cdFAvaf4GiyHQLEZHHRAG9rqBm1b2mQ1IRBwCDGqeMLVZbnwUwzHQLEZGH3Zcfy7mWzwtwFgcAQxrLSs5WwXwA/Uy3EBF5nQDVoc7M2bw40DkcAAzYXl5ytQC/BZ/nT0SUiPcFcjYvDnQGrzZPIgWksXzszwW4F1z8iYgSdZSKvrq9oqTCdEgq4ONlk2T9tCMyGzsHPQjobNMtRES+pcgFJNd0RirgKYAk2HP6hMGd0djTgJ5iuoWIyMciCpnNbxF0BgcAlzVOOXG4bQeXCHC06RYiIh/j4u8wDgAu2l5WdLiItQTASNMtREQ+FrFFK4dVr3radEgq4UWALtk2tfhYEWsZuPgTEfUFF3+XcABwwbbJReMkJi+AD/ghIuoLLv4u4q1oDts2paTcgvWc8Nv8iIj6IiK2ziqsXfWM6ZBUxR0AB22rKD7XsvE3QHmLChFRLykQFltn5S/l4u8mXgTokIby4lmAPAY+W4GIqNcUCFu2VnLxdx8HAAdw8Sci6jsu/snFawD6aHtF8UyBzAcXfyKiXlMgbClm5S9d9azplnTBHYA+2F5RPFOUiz8RUV/8a/Gvrefin0QcAHppe0XJDFEsABd/IqJe4+JvDu8C6IVPF3/+5E9E1AcKhC3ITC7+ZnAHIEGN5WPPUuiTAEKmW4iI/Opfi3/Nyr+abklXHAAS0Dil5DS18TyALNMtRER+xcXfGzgAxKmxrOgkFWspgDzTLUREfqVA2BKZkV+98m+mW9IdB4A4NE4uHqUiL0GQb7qFiMivuPh7Cy8C7EFTRdEhaskSLv5ERH3SycXfW/ggoP3YNnVigdq6FMBhpluIiHysU0RmcvH3Fg4A3dg5bVweorFqAMeabiEi8jEu/h7FUwBd0NLSYCwSWwTgRNMtREQ+1glbue3vURwAutAYaPk9VKaa7iAi8rFO2DqjYOmq50yHUNf4JLsvaCgbOxfQK013EBH5WCdUzy9YuurvpkOoe7wN8HMay0suVuBh0x1ERD62b/Gv5eLvdRwAPtVYUVxqq/xDgAzTLUREPsXF30c4AADYUTF+jK2xVwAMNN1CRORTXPx9Ju1vA/ykfOwQC3YdgANMtxAR+VQngPMKalc9bzqE4pfWdwFoaWkwBF0IYKTpFiIin9q3+NfUc/H3mbQeABqtll8JUGa6g4jIp7j4+1jaXgPQUFZyOQT3m+4gIvIpLv4+l5YDwLaKceMttesAZJpuISLyoQ4VOa+weuU/TIdQ76XdANA45cThagdXgRf9ERH1Bhf/FJFW1wCsn3ZEpm0HnwIXfyKi3uDin0LS6lHAeeFBvxVgrOkOIiIf6lC1zi2sWbHYdAg5I21OAfAxv0REvbZv8a/l4p9K0mIA2DG1aLQds1YByDHdQkTkM1z8U1TKXwOw5eyifnbUWgQu/kREieLin8JS/hqAYJt1LwTHmu4gIvKZDoWeU1i7YonpEHJHSu8ANJSVXA7gMtMdREQ+067QcwprVnHxT2Epew3AtqnFx1oxWQkg23QLkcdEAezZ95d2AohAJAJFBEBEgYgAFhQhFYQEyBAgpEBIIJkKHQBgAFL4z480167Qc7n4p76UPAXwYWlpViDWOl+5+FP62AvgQwBbAdkCsbeqyhaobIVgW0Cs3SqdeyJZ1u7hz65u6+uHaRWsPdWnDOjM6hxk2fbAWMAaFLA131Y5SAQHA//66yAAheCw4Bdc/NNISv5H2VBe8hsA15juIHJYFMA6AGug2KCWrIetGzQY2jBs8SsNpuO6o5XHZDQ15R4RFXu0qI4WsUar6hgAowD0N91H/9KugnMKq+urTYdQcqTcALC9Yuzpovp3pOA/G6WVZiheg+ANKN6EpW/sCe1ee+TfN3SaDnPSlrITRwQQOkksuwgqRVAUQZBvuisNcfFPQym1SH5SPnZIBvRt8FG/5D/vA1gu0OU2AssLTl3xjlTBNh1lws6pJQdHo1Islk6C4jQAxyPFL1g2jIt/mkqpAaChvORJAOeb7iCKw0ZVLBHIkqgdWzq8bvUO00Fetav0hIFRK3SqLThNBKVQnAgOBE5pty2cPWxJfY3pEEq+lBkAGiqKr4DKn013EHWjVaBLbJHFEo0tKah7bYPpIL/aNnVigRWLTgNwFqBTAeSZbvIpLv5pLiUGgO1lRYeLBN4ANNd0C9HnbAfwrECebon1qx5ZV9dhOijVaFFRaPtga5LE5ExLMEOhI0w3+QQXf/L/AKCANJaPfRHQU0y3EEHRCAuPqI1FBZPqX03X8/imbC8fO0GgFwCoBDDcdI9HtVsqZw2tXVlrOoTM8v0A0FBW/F2I/JfpDkprUYH8zQYeKNgd+5usXh0xHZTutArWjmXFk2y1LhTR2VAMMt3kEVz86V98PQBsKTtxRFBC73Drnwx5W0TnxayMR7x8H366+7C0NCs32DZD1f4GIKXw+Z97fdBmqZzNxZ8+4+v/EBrKSxYDmGK6g9KHAk0i8qjE5IH8pStWm+6hxHx6vdAVgF6G9DpFwMWfvsS3A0BDWcnlENxvuoPSgwDVqvLHPZlNz6Taw3jSkVZWBhp3fjQDojcAGG+6x2Vc/KlLvhwAGk8vOkCj1loAA023UEqzIXhCbPtn+bWrXzMdQ+7YVjFuvGXb10MwE0DAdI/D2gTWWfk1K5aaDiHv8ecAUF78lELOM91BKatTgf+VWOwXvF8/fTRVFB0SUesaAf4DQI7pHgdw8af98t0A0FBePAuQRaY7KCXtFejvNSa/Lqir32Y6hszYUlo0NBiwbgDwXfj3y4q4+FOPfDUANJQek4tAv3cBHGi6hVLKdgC/CYp93+Dq1XtMx5A37D7llEGdmZ3XCXAtgAGmexLQJqJn5levqjMdQt7mqwFge3nJPQJ833QHpYzNKrizLZozj0/po+40VRQNiKh1w6d/9nj91AAXf4qbbwaAbVOLj7Vi8jqAoOkW8r02FflFLDv28+HPrm4zHUP+0FBaMkwDUiXQK+HNP4e4+FNCfDMANJSXvABgkukO8jUV4BErZt08pG7FJ6ZjyJ8aJxePgoWfeexC5DaxMD1/Sf0LpkPIP3wxAGwvK75ERB403UG+ttxSvW5o7aqVpkMoNTRUFJ0Cte4D8BXDKVz8qVc8PwA0VRQNiKr1HoBC0y3kPwpssqA35tesmm+6hVKPFhWFGgdaPwBwG4AsAwmtYuFMLv7UG5bpgJ5EEbgDXPwpYdIClVvaYjmjuPiTW2T16khBTf1PVe1jBahO8sdz8ac+8fQOwKcX/r2B1Hs6F7lrgQTt6/P/sXqr6RBKL9srxl4qqr8EMNTlj2qFYnpBbf2LLn8OpTBP7wBYMbkHXPwpfjsArSyoqb+Qiz+ZUFi98sFozB4DqJvXLHHxJ0d4dgdge8XY00X1edMd5BtP2YHQf/Breckrtk0pKbdUfg/VIxw8LBd/cownB4B939S18Q0IjjXdQh4n2CWK7+XX1D9iOoXoiz4sLc3KCbTdCugPAYT6eDgu/uQoTw4AjRUlV6nij6Y7yONEnhOJXJW/5PUtplOI9qdxythitXUhgJG9PEQrINMKala+5GQXpTfPDQCfPu9/A3jlP3VvL0SvL6hedb/pEKJ4NVUUDYja1v0QzEjwrVz8yRXeuwjQ6ncjuPhTNwSoDor9FS7+5DeDq1fvKaitnwngWgXC8b1LWrj4k1s8tQOws3TcQbGA/T6AbNMt5Dm2AFVDa+rvEEBNxxD1RXynBKQFwHQu/uQWT+0ARAP2reDiT1+2G7aenV9TfzsXf0oF+UtWrgqKfSIUT3b9CmmBxPiTP7nKMzsA2ytKDhPFu+j7lbKUQgRYo7HYeQV1r20w3ULkhobykmsU+IUAGft+5dPFv3r1MrNllOo8swMgqj8GF3/6N/K4xtrGc/GnVFZQU/9by5KTAXzIxZ+SyRM7ADumFo22Y9Y74FP/aB8bKnMKalfebTqEKFmaKooGRCGHFVSvet10C6UHTwwADWUlCyCYbbqDzFOgCWp9tbB2xWLTLUREqcz4ALC9fNxxAvsNL7SQcW/aATl/2OKVH5oOISJKdcavAbCg/w9c/An6t2g/eyIXfyKi5DA6ALTceeAJCj3dZAOZp4pH82O55w1/dnWb6RYionRh9CfvSHVoYfTjfl9pfvTIHNhysMkWMube/Jr67/H+fiKi5DI2AHTUZB4eUPs9AAHtCO5pvn/Uu7E9oXGmeij5FLi9sKb+NtMdRETpyNgpgKDaN+DT2/4kKzog7+o14zKOb3oBQNRUEyWNAriOiz8RkTlGdgB0KYZGY6FN6OKxv5EP+r/VsvDwQii/EChFRVXkysLqlQ+aDiEiSmdGdgCidvA76OaZ/6HDmo/L+97agPSL8GEYqafTFp3FxZ+IyLyk7wDoK8iOtoU2ARjaw0vtlicOfTHy/sDTwNsEU0GzwDo3v2bFUtMhRERkYAcg0ha6HD0v/gBg5c7cWJpz7qbVImhyu4tc1aaKM7j4ExF5R1Kfva9VsHBI4FEAg+N9TyC/fXjGcU27Im8N/khjVoGLeeSOiIqcV1hTX2c6hIiI/k9SdwBip2TMUODwRN9n5YWHD7j2nVHBg1tedKOLXGML9NLC6pX/MB1CRET/Lqnn1iPVoRUAxvblGB2rhrzavuTgYwD0d6aK3KKCqwur639nuoOIiL4saQNAZHHwNFhS58Sx7J1ZG/fOOyqsEesoJ45HzhPgtvya+ttNdxARUdeSdwrAsn7o2KGGdBw64Np3Dg4Uti9z6pjkqN9w8Sci8rak7AB0LskYY4mucePzOl4atqx92bAidPNcAUouAR4eWlN/KZ/tT0TkbUnZAbCg34RLw0bWqdtOyfv6+x8jYG904/iUkL8OjeVczsWfiMj7XN8B0OeQGc0IbQYwxNXP6Qw0771/1Bp7d8Z4Nz+HuqF4ubM9OOXg5cvbTacQEVHPXN8BiGVknA+XF38AkMxY/wHfXjs+q2jHCwAibn8e/ZvNKtZMLv5ERP7h+gCgot9w+zM+L3vqJ6f1v+if70F0SzI/N10pELbFmlVYs2K76RYiIoqfq6cAOqqzDgsgtsHtz+mKtoea9vzpqA+1NVSU7M9OJ6ry7cLalb833UFERIlxdQcgAPtKGPoiH8mODB54zZoTM47eXQfANtGQ+uR+Lv5ERP7k2uKsCxGIDg5uAmS4W58Rr/C7A19rfWrEIYDE8yVEFJ/6PRm7Tj3y7xs6TYcQEVHiXNsBiA3NPNMLiz8AZIzefVLed9fGJDP2lumWlKBoDAQwk4s/EZF/uTYAqB1L6sV/PQn0jxQOvO6do0OHNb9gusXnYhbkwiGL6z82HUJERL3nyikAXdxveNSKbEKSv244Xp1vDV7R9twho6EYYLrFb1T0R4XVq35huoOIiPrGlR2AaCB8OTy6+ANA5nFN4/KuWrtXQva7plt8RbCIiz8RUWpwfABQhYjKFU4f12mBIeGDB1z/9sjAAW0vmW7xiS2haOSbpiOIiMgZjp8CiCwOlsOSaqeP66b25QUvd9QNPwFAjukWz7L1zIKlq54znUFERM5wfgfAkkucPqbbsic0nJx3xXvbENAPTLd4kmAeF38iotTi6ACgqxAS4Bwnj5ksgcL2wwde93ZhYGj4FdMtHvNxEPb1piOIiMhZjg4A0V3BMgCDnDxmMkmGnZN31dqJWeMaX1QgbLrHC1StbwyuXr3HdAcRETnL0QFARGY5eTxTsss2Txpw8YYNEtBPTLeYpIo/FdauWGy6g4iInOfYAKALEVDgPKeOZ1rgkJajB3x3ba7khetNt5igwCarM+P7pjuIiMgdjg0A0YHBUgAp9ax96RcZOPDqtcUZx+16AUDMdE8SqVq4Iv/ll5tNhxARkTscGwBSZfv/SwSSc+ZHp+VUfvgOLDSYzkkGEf3DsCX1NaY7iIjIPY4MAFoFSwXnO3Esr8o4Ys/xA69eC8mOvmG6xWUfa7T9h6YjiIjIXY4MANGJwVMBFDpxLC+T/uGCgdeu+UroyL0vAFDTPW4QkZsK6ta0mO4gIiJ3OTIApOz2f1dEA7mzPjgt5+yPV0Gwy3SOk0RkxdDqlY+Z7iAiIvf1eQBQhajoDCdi/CTj2J0l/b+1tk0y7DWmW5xiK66XFN3ZICKif9fnASBaG5wAyHAnYvwmOCh84MDr3z4yeHDri6ZbHLCgsGblctMRRESUHA6cAkij7f+uWJrR/2vrJ2VXbF4OoNV0Ti91RDV6o+kIIiJKHidOAaTd9n9XskoaJ+R9490GBO0Nplt64dfDa1//yHQEERElT58GgM7qjKMFGOFUjN8F8jtGDrr+neGBoe0vm25JwHbpyPip6QgiIkquPg0AAq1wKiRlBO1+eVe9d3LWyduXAegwndMTUbmFT/wjIko/HABckj1p6yl5l76/UQK6yXTLfrw5dNLK+01HEBFR8klv36hLEYzGQjsB5DnYk3K0M7B37/2j1tm7M8aZbvkiFUwprK6vNt1BRETJ1+sdgKgdHAsu/j2SzFjegG+vHZd1YtMLAKKmez5nORd/IqL01ZdTAFMcq0gD2WdsOi3ngn+ug+g20y0AYIvebbqBiIjM6f0AoMLz/wnKOKz5KwOuWRuSnOhrZkt0XWH1qmfMNhARkUm9GgB0KXIBeO6cth9Y/SJDBl7zzgmhMbvrANhGIlR+wUf+EhGlt14NALFo4DQAIYdb0omVe97G0pxzN70ugqYkf/Yn+Xvsh5P8mURE5DG92wGAxe1/B2Qc3VSU9+21nVZW7O1kfaZAfi2rV0eS9XlERORNvbsGQHgBoFOsAeEDBlzzzujgiJYXXP8wwS6Ntf7R9c8hIiLPS3gA0KUYBuAYF1rSV0BD/S/acFr2tI9fBeDiU/n0voK6NS3uHZ+IiPwi4QEgFsvg9r9Lsk7YOX7AN9Y2IWS/78LhO2wr47cuHJeIiHyoF6cAtNz5DPqMlR8eMfC6dw4JHNC2zMnjimLesMWvNDh5TCIi8q/ETwEAE90Iof8jQTsr77L3T8k+ddsyAO0OHFLVjv3KgeMQEVGKSOi7AHQJBkQltCvR91HvRbdlr29+8MgQYtahfTjMSwU19ZOcaiIiIv9LaAcgagWLwMU/qYLD2o8ceM2aoYFBnct7fRDRB5wrIiKiVJDoKYASVypovyQrlpv3H+smZJTseFGBcIJvb5P2zEWuhBERkW8lNgAoil3qoDjkVHwyKe/CDeth6ZZ43yPAk/kvv+zirYVERORHCQ0ACuEOgGHBkS3HDLp2bbaVG1kVz+tjFh5wOYmIiHwo7vP5uhRDo7FQo5sxlACFtj576IvhNQNPARDo+iXYVFBTfyi/+IeIiL4o7h2AmB3gT/9eIpCcczaeljtj41uwtMvBTBQPcvEnIqKuxD0AqArP/3tQaNTuEwd+Z50t2dE3v/Sbdux/DSQREZEPJHINAHcAPEpyw4UDr11zbOjwvS/gs5/4FS8X1L22wWwZERF5VQIDgMUdAC8TDeTO/uC0nOmb6iHYI5AHTCcREZF3xTUAaE32gYAe4HYM9V3G8U1j8765bic6QwtMtxARkXcF43lRTGPc/veRwODOD3jvP/VW6c9bhlkR/MB0BxElRlU/WHpL//vifX1cA4AqivkAYD/Rv5suIB+L6FBAvm86g4gSIyI7AMQ9AMR3DYDghN4GUfLZMes50w1ERJR0Q0t/2n5ovC+OawAQ6NG9zqGkEuDDzNPD75ruICKi5LNi0bhP2fc4AOgryFZgRN+SKIm4/U9ElKZE4n9kf48DQKQlNCqe15FHqM3tfyKiNGVL/M/s6VqdqzcAACAASURBVHFhtwIypm85lEQdgY7YUtMRRERkhiiKqqo0rh/aez4FoOAA4BvygpyNNtMVRERkTP9lgZZR8bwwjinB5gDgEwrl9j8RUZqLWfFdB9DzACAyus81lBS2bfECQCKiNBfvhYA9DwCKw/pcQ64TxYasqZ3rTXcQEZFhqn0fAHQphgHo50gQuUtQZzqBiIg84YSiP2iopxftdwCIxoIjneshN9mK5aYbiIjIEzL77+j5QsD9DgACi9v/PqG2vGK6gYiIvCEg6PH6vf2fAlCbOwD+0JQxNfye6QgiIvIGW60e7+DrYQdAuAPgByqvikBNZxARkTcItI87AALuAPiBZXP7n4iIPq9vA4AAhzjXQm4R6GumG4iIyFNGQVX294L97wAABzjbQ24IxDLfNN1ARESekjP1zvaD9veCbgcAXYqBALIdTyJnCRplatsW0xlEROQt0cD+H+Xf7QAQjmUMdz6HHKfgT/9ERPQlGtv/hYDdDgAWbA4A/sABgIiIvkTE6t0AICocAHxAhAMAERF1pZc7AGopLwD0ARvgA4CIiOhLpIdbAbu/C8CWYY7XkONCVuR90w1EROQ9Cgzb35cCdb8DAAxxJ4kctEMmY7fpCCIi8iQZ0tje7Q/z3V8DAOEA4H3rTQcQEZF3RffzPJ/9PAhIOQB4nALc/iciom6Jpd1e0N/9ACAY7EoNOUZUN5huICIi71LYvdkB4DUAXiciH5tuICIiD7OR2A6AVsECMNC1IHKEQvkIYCIi6pZCEtwBGI+B3f4eeYZtWRwAiIioWyIJ7gB0ZGbluZdDTsmQ8GbTDURE5F2S6F0Alto57uWQQ9r4DAAiItofTXQHQFQ5AHicAFtNNxARkccp8kurNNjVb3EA8CkFmkw3EBGR54kVbC/s6je6HgDAAcAHuP1PREQ9Eis2oKtf7+ZK/wAHAM/TPaYLiIjI+2wE+nf1610OADZPAXieQLgDQEREPbLU7vLOvq53ACz0c7WG+kwB7gAQEVGPbNUEBgCgyysGyUNUuQNAREQ9EkviHwAEXd8yQB4iaDedQEREPmB3fVq/6x0AmzsAXqeQiOkGIiLyPhUJdfXr3V0DEHC1hvpOwQGAiIh6ZAkSGAB4DYD3WRwAiIioZ6qJ7ADA4gDgcRZ3AIiIKC52AgOA8hSA5ymvASAiop6pJnYKgIiIiFJY1wOAIJbkDkqUaJcTHRER0eeJWOGufr2bHQA76mYM9Z3dzVWdREREn6fQRAYAcADwOpsDABER9cwCEhgAbJ4C8DzuABARURxs1S4vGu/uQUDcAfA4Ec0w3UBERN4nSOAaAIVwAPA6RbbpBCIi8j6VRE4B8BoAH5ABpguIiMj7RBI5BWCjzdUa6jMBBppuICIi7xM7gbsALJFWd3OorxTKAYCIiHqkCCRyCiDGAcDzeAqAiIh6ppLADoCCOwA+wB0AIiLqkVgJXAOgPAXgeQIMNt1ARETeZ0UT2QHgAOB5ChxguoGIiLzPTuQUgC0WBwDvy9aXMMh0BBEReZsEAvGfAsgKduxxN4ecEI5kDDfdQERE3iYR7ejq17u+C6AGewDYbgZR31m2zQGAiIj2K5pp7erq17scAKQKNoDdrhZRn4kKrwMgIqL96t+e3dTVr3f3KGAA2OlSCzlELT3YdAMREXlax7NV0uXTfTkA+JioHGG6gYiIvEuALrf/gf0NACpdbhmQd6jiSNMNRETkXSrodi3vdgBQKHcAvE44ABAR0X5o97v53Q4AwlMAflCgy9DfdAQREXmVJr4DAEu3udJCjop0hrgLQEREXRJ0fzp/PzsAssWdHHKSZcto0w1ERORNqr25BiCmHAB8QAXHmW4gIiJv6tVFgLZlbXUnhxx2vOkAIiLyJkt6cQogIxDmDoA/cAAgIqJu2L24C2AydgPo8ulB5CV6gD6HfNMVRETkPRrrxSkAABCApwF8IJoR5C4AERF9iW314hQAACiwyfkccpygyHQCERF5UNDa0d1v9bQD8KHzNeQ4xQTTCURE5DnR/JHZ3e7k738HQJUDgC8IBwAiIvqiLYtmS6y73+xhB8D6wPkeckFBx9JMfjMgERF93kf7+839DgA2lAOATwSj9kTTDURE5B0q+7+Ob78DQEgiPAXgFwIOAERE9C+W9mEAkApsB9DqaBG5QoEy0w1EROQdqtL7AeBTPA3gD0d21GQebjqCiIi8Qa0+7AB86l2HWshllm1PN91AREQeEbV7fxHgPrLOqRZyl4hMM91ARETeEM7s6NsOgAAcAHxDS/UVZJuuICIi43a/fGN+8/5e0OMAYFvKAcA/smPtgVLTEUREZFyPj/LvcQAISeQ9ALYjOZQEFk8DEBHRfs//A/GcApiMDgE2OpJD7lPwQkAiojSn2P8tgEB8dwFAIWv7nkPJoMDhHYszjzTdQURE5liizgwAAF7vYwslkWXZPA1ARJTG1LbW9/SauAYAsWRV33MoWQTC0wBERGksoJF3enpNXANAINxZ3/ccSpb19oDWk58+p7/pDiIiMqLj5FjeP3t6UXw7AGdgK6Bb+t5ELgv/qe2oP17aNKmsoz3jAtMxRESUfAK8W1UlPd69F+81AADAXQAPi0E2zd41eeH9baOvAjBQoJeZbiIiouRToMftfyCRAUA4AHjV5lhO7eSdZ27+ONb/awDk018++aSFlUeY7CIiIgMEa+J5WfwDgA1eCOg99qK2EfMqd5cfG1Frwhd/MxDTr5uIIiIig2yJawAIxnu8oERXRRHqfRA5SoGGq/ac+rc1kUFfRzeDnIpeCsVtEGiS88jHgoHIxxrLuMR0B3mbAnMAjDHdQV8WVCuuUwDS80v+T7Q69IECI3uXRE5p0qxXZzRVtHeqNbmn14pKRf1XH69JRhcRpQlVKburdQeAwaZT6Etaa+fk9IdIjz/4JXIRIGxeB2BcTefwR8/cOfXAeBZ/AFBeDEhEDqu4o2U0uPh71dp4Fn8gwQFAoBwAzNnz/T3j/nxLc3ElgIPjfpdgBp8JQEROsi3rZNMN1K24zv8DCQ4AvBDQjFaE3prSNG35K5HCK4GEL8To19kRqnSji4jSlOpE0wnUjTjvAAASHACC2dHV4FcDJ1V9eOhTFTun9WuxQ2f09hiiuMzBJCJKdwIOAB4lEt8zAIBETwGcgmYI3k88iXqh/c7WE/98zd6JZ0DRp/v5FTiFzwQgIieUVu0dCmCU6Q7qWiBmuXQKAIAoXk70PZSYDg1sOKtpyj/+2n7wlQCyHTikBGz7BgeOQ0RpTkLWVNMN1K0di2/p93G8L054AIAIbylz0XvRgc9X7JzeudPOPs/J4ypw+XEPnl/g5DGJKP2IotenI8ldAqxI5PUJDwCBaLgG4INlXBC5r230vMt2T5oYgxzjwvGzMjKsa1w4LhGlC1WBgDsAHqWQ5Ym8PvFTAKejAcDbib6PuhdRa3PlrrKnHmo76nIAeW59jgBXH7OwMtet4xNRaiu7q+1EAIWmO6hrCn01kdcnfgpgn+pevo++YFMs98WyndO3fBLLne32ZykwKMu2v+n25xBRahLh9r+H2eFg+8pE3tCrAUDE5gDQd/b8jpEPX9BUdkwUVkmyPlQE1xf94Zv8UgciSpiqcgDwKsGal2/Mb07kLXF/GdDnBaKxF6MBKwwgozfvT3cxWDuu2jPxH+sigy+C9HoXpncUB1kDmr4GYF5SP5eIfK305y3DEAGfAOhRoprQ+X+gtzsAp6MVQELnGmifhlj2qvKmae+uiwy+GL0/BdMnCv0RNLEvgiKi9GaFdRYM/ZlFPVORhNfkPvzLVJ4GSNDizoMWntc05cBOO3CK4ZTRxQtmnWO4gYj8RMT165So92zYydkB+BQHgPjtvW7P+Id+3HzSDBUcYDoGAKD2jaYTiMgfptzdOhzg9r+H7aq7uf97ib6p1wNAsCm6EsDe3r4/XeyxM9ZM2Tlt5YpIwSXo5TUXrhCZULJgZoXpDCLyvmjE5va/h6liRbxfAfx5vf4XKrMRg2pdb9+fDl4N5z87bdcZ/Vo05MmF1lbcg6oq/kdNRPslggtNN1D3LCuxBwD96319+VCF8DRA1zp+0nLSQ9fvnTBVFSNNx3RHgOOLRr9zhekOIvKuitubxwAywXQHdU8lsQcAfYYDgMPa7OAHZzVNrXm+46BLAGSa7umJAHec/PQ5/U13EJE3xQLyDdMNtF+2JeGEvgPgM30aADKnhNcpsLEvx0gl70QGVVc0TQvvtLPONN0SPy3saMu42XQFEXlPZZVmiOIS0x3UPQFeq75p8J7evLfP538FeLKvx0gB0f9uPfqRq/acOkEho03HJEpErz/xkRkjTHcQkbfsDLacCyDfdAd1z1Zd3Nv3OnABmD7e92P4V1itrZVNZX99pP2IiwHkmO7ppaxAQO42HUFEXsPtf68T4B99eG/fqEKiNcFNgBzU12P5zUd27ssX7yrNial1gukWJ1iWNXHl7EW9upqUiFLLlNv3HBmzAu+Ct/95WfOeoTlDVn9LIr15c99PAQgUkHQ7DaCPdh6x4KtNZUenyuIPALZt/5qPCCYiAIhZwevBxd/r6nq7+AOO/ctNn9MANmTn5XtOffy/mo+ercAg0z0OG1c0f8ZXTUcQkVmlVXuHAnqZ6Q7qQR/O/wMODQDBZdGXAdnmxLG8bHu03+tlO6ZveDcyqBIOnD7xIhH52TELK3NNdxCROYGMwNUAsk130P6J5YEBQKpgi+hTThzLq/7WfvBfzt9VcWAnAuNMt7js4Gw7do/pCCIyo7RKsxT6HdMd1KONNXPy3u/LARw7v6MpehpAgZZr90xYcEfriWeroMB0T3LIt4ofPX+K6QoiSj4JtV0KTZc/6/xL0Lef/gEHB4DgzugLEDQ6dTwv2G1nvjtlx7TXVkbyLwAQMN2TVJb1P+MevjjPdAYRJU9llWYIdK7pDuqZrfDOACCzERPgL04dz7SXo4V/n940NacVoUmmWww5JBbs+JXpCCJKnp3Blm8COMR0B/UoptFoTV8P4ugtHilyGqDztpaTFvxg97hyhRxsOsawK0sePf8M0xFE5L4Jv9JsEZljuoN6JtD6uqpBu/t6HEcHgKAVrQXQ5OQxk6kVwY/O3Dn1xSUdB10AIMN0jxfYlvU/Jzx13kDTHUTkruyO1u8ocIDpDuqZ9uHpf5/n6AAgkxEVxdNOHjNZ3ogMfmHqzumRJs3ixW+fI8CBwU7rN6Y7iMg9pVUNuVDcaLqD4mU948hRnDjI56mlDzt9TJfFft16zKJv7zllrK04wnSMN8mlJQtmnm26gojcEQj1mwNgqOkOiod+UDs35zUnjuT4ABAsiy4V4J9OH9cNnRrcPmtX+fML2w+vBB96sV8K/GHCwsrBpjuIyFllt+8+XIEbTHdQvGSRU0dyfAAQgSr0z04f12nrY3krpuw4Y8fmWM6Zplt8QXFAWPV/TGcQkbPECvwSQKbpDoqPWh4eAAAgGI0+ACDqxrEdoA+2H/XUpbtKx0TEOsZ0jJ+I6vlF82feZLqDiJxRfmfLFIWca7qD4qPAh0tvzlnt1PFcGQDkDGyF6nNuHLsvIgjs+vruSc/8rnX0+QD4kJteEOAOPiWQyP9KqzSoAC/w9ROFYz/9Ay5+1aNYAU9tF2+O5bw1ZecZH7wfHchpt28CEOuxEx+ZMcJ0CBH1npXR+gMAY0x3UPzUwfP/gIvfaKcLEYgODn4EyIFufUa8nu4c8de79x43QUWGmG5JIa/ltvc/ue7yBzpMhxBRYipubx5jW/I6eO7fNxT4cOnc3MOcPKZ7OwCzEYNaD7h1/HjYkNbv7pn41M+aj5/Oxd9xJzVnN//OdAQRJaaqSi21cD+4+PuKBTj+pF3XBgAAiNrWnwGom5/RnSbNen/qzmlvrY4MPR8u/3OmKwEuK5o/89umO4gofi8FW69TyHjTHZQgB6/+/4xrpwA+E6kJVUNR7vbnfF5d57Dqm5tLjgZkeDI/N02FLcsqXTl70XLTIUS0f6U/3XOEZQfeAp974jcba+fmjnT6oK7/ZCwqybwYMDy3uejJm5vHlnLxT5oM29bHxz16TqHpECLqXmmVBi078DC4+PuPOr/9DyRhAAiEw08B2On25+y1Qx9Pbzr9ldrOA2cACLr9efR5OjxmhZ6YsLCSf7AQeZQVar0DwDjTHZQ4CchCN47r/g7AdHRC8ZCbn/FaeOiyabumRXfZmaVufg7t18lR215YurSUwxeRx5Tf2TIFwI9Md1CvrK25OafejQMn5eI425Y/wJ2LAWO/bPnKX76zd2KxrXD8/AglRoGzWrYNmQd1/9oSIopP+Z0thQo8hCRc80XOE4Vrj9ZPygCQeXr4XUD+5uQx2zXYMGNXRe3jHSPPA5Dl5LGpDwRfK1k48z9NZxDRp7f8KR4EwGt0/Ckci9oPunXw5N0eJ/YvnDrUu9EBq6funNa0NdaPj6T1IFVcU/TYrFtNdxCluxdDrXdBMNV0B/WSyNN1VXk73Dp80gaAUHn0RShW9PU497ePevby3aeNikJGO9FF7hDR/1cyf9bVpjuI0tXkO1suAnCj6Q7qA3H3G1iTek4ouiRjpor26naGMKzdV+yatPyfsbxpTneRa2xALl514ePzTYcQpZPJP20tEltfAm/587ONtXNyDoOIaw/TS+oT8gIvh58SxYZE37cplrtm6o7pm7j4+44F6IMlj55/hukQonRR+vOWYWLrX8DF39dEZJ6biz+Q5AFAqmDbwK8Sec+T7SP+cWFT2fBOWMe51UWuCqllPVHy2KyJpkOIUt3UX2iOFcHTAA4y3UJ9Ygdsmef2hyT9thBdiqyoHdoERf7+XmdD2q7ZPbF2dXTImeDtK6mgWUXPXX3Bk0tNhxClotIqDUqw9VkRcMfN51Tx/NJbcl3f8U76l+TIZHRA9b/395pGO/uDqTvOWLs6OuQscPFPFf1F5e/F82edazqEKOWoihVsvZ+Lf6pw9+K/zxj5lrwgovcCaOvq96rDw+vObarIaUWoOMlZ5L5MQJ8oWjDz66ZDiFJJ2Z2tP4fgEtMd5ABBw9783GeS8VFGBgCpwE4B/u38hgKROc3Ff711b/GpCuFDK1JXQBTziufPuM50CFEqKL+r5UcQ/MB0BznExoOrvyWRZHyUkQEAACKxwC8BxABgt2ZsPrPpjJVLO4efBSBgqomSRgD5dcljs243HULkZ+V3tfxIFXeb7iDH2FYg+LtkfZjR8+vhmtCC+nD+IdfvHX+grXKwyRYyRHDvqtlPfA/iyndFEKWssjtbbgTwM9Md5ByBPFEzN2dW8j7PoHv/euyYeS2jXgeQabKDzBLg0ZzCnV+vm1wXNd1C5Adld7XcBMVPTXeQs1Ss8Uvn9OvzE3PjZewUAAB856x31qnIcyYbyDwFLmrZPuTpomfP7me6hcjryu5sncvFPxXJy8lc/AHDAwAAiMZuA2Cb7iDjpktrxvKSR2YeZjqEyJNUpfyult8AeofpFHKeCO5J9mcaHwBWXfjUO4AuNN1BnnAcAlh10oKZp5sOIfKSyirNmPzT1sdUcY3pFnLF+6eG+yXl1r/PMz4AAIAF/TE+vSOA0psCgyzFcyULZtxsuoXIC06+u7H/zlDrc6K4wHQLuUTl11VVkvSdcM88Za9o/sx5AlxmuoM85cl2y/r6mtmLWkyHEJlQenfbQVbEfgaCE023kGt2tGfnHLL8BmlP9gd7YgcAAEIa+wmApDz8gHxjRpZtrxg7//yjTIcQJVvZHXsnWhG7not/alPV+0ws/oCHBoBXv/qXjVD82XQHeYsAR9uwVpYsmHm26RaiZCm/q/VKiLUUgmGmW8hVHVEL+/1uHDd5ZgAAgBgit6Ob7wigtDZAFU8XPzarCuqd01ZETiut0mDZXa3/par/AyDDdA+5S6APvjSnf6Opz/fUAPD6V5/ZIqK/NN1BniQQ/XHJwlnVJz4yY4TpGCKnld7ddpAVaq2F6ndNt1BSqG3rr0wGeGoAAIA2CfwcwDbTHeRNqloWCMjbJQtmXmW6hcgpk+9qPceK2m8CONV0CyWJYP7SW/PeM5vgQUXzZ31DoH8y3UEeJ/J8SOQby2cv2mw6hag3pv1WMzub234B6PdMt1BSxQJ2bMySWwesNxnhuR0AAFj97rH3A3jbdAd5nOoZEdt+p/ixGfwedPKditubx4SbW1/l4p+GFA+aXvwBj+4AAEDR/FlTBfoP0x3kG08H7Mi3Vlz0zHbTIUT7U7lQAzvXt/4AwE/AL0JLR2Fo4KjaW7I/Mh3i2QEAAErmz3xeAT4WluKkO0TkO/UXPMFHS5MnVdzePMa2ZB6AcaZbyAyB3FczN+c7pjsAj54C+IzC/gH4iGCKmwxVxYKix2YuKHpoxgGma4g+U7mwMjD5rr0/si15HVz801l7GPDMlzl5egDY90VB+J3pDvIXEcyWkKwvWjDjlgkLK7NN91B6K1kws+JD236jI/+BmRDtMN1DRt330tycraYjPuPpUwAAULSwcoDY+h6ghaZbyJc2QXDTqgueeMx0CKWXkxZWHmGp/hKq53z2a1b4gE25n/ykA5rJx1unHWmxI7GRdVV5O0yXfMbzAwAAFD824xKIPGi6g3xMdblCrl/91SdWmE6h1Fa0sHKAZeutuu/q/i8/zU8z2nM337ra6jzklOTXkTGqd9Te0v9W0xmf54sBAACK5898AcAk0x3ka6rQR4NR3LTia09+YjqGUkxVlVUy+u1vQHC7Kgp6enlm08xlmbvOKQHvBEgHu6xAeGT1TYP3mA75PB8NAOcfC1ivAwiabiHfa1PgHuSE71599rP87gnqs+LHZpWq6H8KcHwi7wt2jFrXb8uP+kODB7nVRuaJyNyaOTl3me74It8MAABQMn/WPQr9vukOSg0KbAZwZ//2/vPqLn+AF2dRwoofm1UKC3OgOqW3xxA7Z3fOpjvXW7FBJU62kWdsDmbkjFr8Q2k1HfJFvhoAjllYmZtl2+8KcKDpFkodImhQW36jAbl39exFntqiIw9SSPH8GWeLyM0KjHfmoKLZDf/xQqh5/CR4/O4sSowCFy+dm/uo6Y6u+GoAAIDix2bMgsgi0x2UkvYC+ING9NerL3nSM7fqkDdULqwMbFT7q6q4EcCxbnxGqHnsa9kNVx8KyGA3jk/JpZBlS+fmePYLnnw3AABA0YJZT4rq+aY7KGV1quLBoI1frLj4CePP6yazSuddltWc3Xy5AD8EMNLtzwtEC7b0+/j/7RI7+xi3P4tcZdtAUd3c3DdMh3THlwNAycLKYbDttQoMMt1CKc2GyJOq9k9XX/jka6ZjKLmKHppxgAStyyH6PQDDkvnZosFw9pabXg12HMk7n3xKoX9YOrf/f5ju2B9fDgAAUPLYjMtUZJ7pDkob1SL4067+bU9vmP73TtMx5I6iP3wzFMjbcZaKXKHANAABkz0Ze6a/krXjguMB5JjsoIQ1idhH1czJ22k6ZH98OwAA/LIgMqIJgscsGw+s/OoTq0zHkDNOmn/+mAACV0L0knju4U+mQOeIDf023xYQDbp++oGcIdDv1sztf6/pjp74egAoWlh5iNj2OwD6m26htPS2Ag9EwvbDb136VIPpGErMyU+f0z/cEboQiiucu5rfJXZWS+7Ht79jRQu83UkA8NaQI3NOWjRbPP9Fdr4eAACgZP6sqxXq+UmLUloUIs9Ztv1AbO/Qv67+1h8jpoOoa8csrMzNVvt0KM4FMAM+21rPbrz0xdDe8ongA9E8S0VLl87p/4Lpjnj4fgCAQooXzKwDHxNM3tAIyCMQ+/FV645bjqoq23RQuit57NyDFcFzRHC2AqXw+aN3Q61feSt72w2FgMUvSPMYFSxYOif3QtMd8fL/AABg7MLKkbZtvwEgz3QL0WdE0KCKZ0XwdE5b/yV82mCSKGTs/JlFauk5tso5iT6e1w8kNrAx55M7N1vR3BNMt9C/tNlBa1Tdjf188z0jKTEAAEDRgplfF8UDpjuIutEGYIlAFlsxXcLnCzhrwsLKA6Nqn6yKckDOAnS46Sb3WbHsLdcvC7Ufd5rpEgIg+GHtnNx7TGckImUGAAAomT9zoQKVpjuI4vARgGpRXRINBGpfn72o0XSQX1QurAx8YMeOF8hEQE8GZCKAQ0x3mZK5d/KKzMavjwGEO6CGCPTVUyO5J1dVia9O+aXUADBhYeXgsG2/xe8KIB/aAGC5Assty1p+KPD2otmLPH8VcTIULawcYEWjExCQiYB1sqqOBZBrustLApEDPsr5+PZOaOgo0y1pqNOy9cTqW/uvMx2SqJQaAACgZMHMClUsRgr+s1FaaQHwGiBvQvQNW6w39+a2vJPKDyEqevSrQ1UiYwKWjlbFaABjAIwGMAL8gpyeaUZ77ie3vWaFDz7ZdEpaEdxcOyf3Z6YzeiMlF8ni+bN+Deh1pjuIHBYF8B6gbwPyTxWsF+iGQCy6YcVFz2w3HRePooWVAwJ2tNAW6whVjLagY/Yt9jIGgiGm+1JBZtMFL2Xumj4WPr/bwSfqhxyZM8EP9/x3JSUHgCOem5Y5cG+/egBfMd1ClCR7AWwUYKtCt0CwFbZsEZGtUGyzArLbAva0dmTtfuvShxz5XvKiP3wzlDVsW1ZHa06mBqMDLY0VAjJMVAoh9jBVKYTIMKgWYt+z9AsBZDnx2bR/gY7R63I2/zAPCPJ0qHvCGtOTlt7Wf43pkN5KyQEAAMYtrDw6Ztsr4bMHfRAlQRT7BoY9ADoBRP71l2oEIhEAAahmqUim7Fu0s7DvJ8rP/jcT3Jb3NCuWu6vfx3f804oNKjbdkprkltq5OXearuiLlB0AAKB4/qxLAf1f0x1ERCYIxM5quPrFUPPYSeDA5qTX7EjOuLoqiZoO6Quj33Tlti2Pr31z+MyjD4HgRNMtREQGSDSn/lDN2vZasKU4C5Bs00EpICLAmUtvy9xqOqSvUn4ieFl8lQAAEDlJREFUDAWs7wJ423QHEZEp4X6vFrWO+GGHBjp8e77aO+TOmrm5b5mucELKDwDLZy9qh2VVYt9tVUREaSkWbBzeMuI7R8ayNrxkusW3FK/vGdrvLtMZTknpUwCf2bJo7c4DZo75SERmmm4hIjJG7EAk78URkOjLwfZjhgIImU7ykeaAxqYsuyErZZ7amRYDAABsfWLd28NnHT0cQJHpFiIik2LZ7x8SzXnjo1DzpL0Ca6DpHl9QXF5za54vvuY3Xil/CuDzdue1XQNghekOIiLTYpkbj2gZ8Z0hdnDHq6ZbvE4Vf669Jfcx0x1OS6sBYMP0v3fGNDIDAt9fvUlE1FcaaO/fMuL74yN5L7yAfc+HoC8SrOnol/M90xluSOnnAHTnpPkzxluQOvBRmUREAIBg6wlv9tt+3QFQKTDd4iFtIlpSM6f/WtMhbkirHYDPvHbhk68K5NumO4iIvCKa88bxLSOuhwZa3zTd4hUK+V6qLv5AGl0E+EVbHl/7xvBZxwwBMM50CxGRF6jVkRMe8PzQQMdhL1nRwkNN9xj28NK5ubeZjnBTWu4AfCa3cMcNIlJruoOIyDMkFmwbfs9pHfn/+6pCm03nGPK+HWlL+V3itLwG4PPGPnn+EDts1QMYabqFiMhLAuEDN+Zs/kkEduhI0y1J1GkD4+vm5r5hOsRtab0DAAArZzy1U21MF2CX6RYiIi+JZWw+tPnQ7x5oZ2x+2XRLsijkmnRY/AHuAPxLycLK09S2FwPIMN1CROQ1mTsveClz9/RxSOE/IxVy79K5Od813ZEsab8D8Jn62YtegOAyAGq6hYjIazqHLDi1dfjP1gOxLaZbXFKjkX7XmY5IprS9C6ArWx5f986BlWPCgJSbbiEi8hoN7SgID6iNZDSfvFY0a7jpHufIhrAVnfrirdltpkuSiQPAF2x5fN2yA2YefaAIvzOAiOhLrHB2ZODzw6zI8BcD4QNHwP+nkvfYYpe/OGfAJ6ZDko0DQBdG/f/27j04ysJe4/jzezebkGQTKKZitR0R8RwQi4VNAqcN3toyg1ZKLhuSYO0wRdvxnNFSz5weE0vR6pzWqdNWp7U6VqgtuScIVO3xWJJWRiDJptapBa1FR4JUrAS55bLZ99c/0M5pqUDC7v7ed/f5zDDDBMh+hxnYZ959L/8x7enR4/mlAGZatxAReZCMhXqnu9kHolnHw7kCybUOmqC4OKjoqi/IyOch+H25Jc2c1kgoz3W7lU8PJCL6QE7s3H2hgbsPw82dbd0yXgp8rash9D3rDiscAKcQbqwtEmf0OQCzrFuIiLxKEBzJ21ffExiesci65Uyp4iddd4ZWWXdY4lUApxCta/qL6NhiAG9YtxAReZUilnPsgrsWjZ7TuQ3AkHXP6ShkW9FY/i3WHdZ4BOAMlDaX/4sLZxuAD1u3EBF5WWDk4lfyBxpygMCF1i0f4PWYaOlz9QVvW4dY4wA4Q8VNlfMg6AZQaN1CRORl4uYeDg3cs0tiRV572NrbIm7Zr+oLX7EO8QIOgHEoaam4QlV+CcCvZ7wSEaWIaO6BL/0meGRRGbxxxdkRdeTqrjvyo9YhXsEBME7hporrRGQjgKB1CxGR1wWPznth0lu3XSAQy49QR+DqtVu/UcCnv/4/HAATUNpUUe6KtIAjgIjotCQ+9a3QG/e+JW7eXIOXj6todVd9QafBa3saB8AEcQQQEY2DBsby3rz9+azhOVek9oXlpq0N+Y+m9jX9gQPgLHAEEBGNT/bhz+yYdOCGyyASSvqLCe7YWh/6dtJfx6c4AM4SRwAR0fg4Ixe8FnrzrjjcYDJvt37/1obQfybx+/seB0ACcAQQEY2P6KRjeQNrfhcYveCTif7eqvhpV0P+Sojw8e6nwDsBJkBPbedGR3U5gJh1CxGRH6gM5x/7WP0nRyb/728AjCbwO2/WsfxVfPM/PR4BSKD5zVWfc6BtACZZtxAR+UXW8ct+n7//9nMUzkfO5vsIdNPUWKi6ba0kcFCkLw6ABCtuqroKopsBFFi3EBH5hcQLDob23vu6xCfPn9Cfh3QcKsqrjX5ZeCT2DPEjgATrq23vFuinoXjHuoWIyC80cGTq0em3fSKWF/01gPEevm+Nx/Jq+OY/PjwCkCQljZVz1JFnAD3fuoWIyE+CR8p6cw+sugSQKaf7vSrYUDQz/4tt1RJPRVs64RGAJOmt63hJ4roIwGvWLUREfhIr2FZy5ML/PqoyvPs0v3X9laP5N/LNf2J4BCDJ5jUtPd+R4P8JcKl1CxGRnwiCI3kDDb2BkYvKTv5VfXRrfehmnu0/cRwAKfDxDXUfmhQY2aTAIusWIiK/yTm4bFvOYHkYf3sSqzy0tT7v3/nmf3Y4AFJk5lNLcqYczl0PSI11CxGR3zhDF78c2t+QC83atLUh/1brnnTAAZBKCilprfwfVXzdOoWIyG/ELfxmb926u6070gUHgIHi5qovA/pDAAHrFiIiH4gLcEtvTccj1iHphAPASHFz1RJAWwEk/4lYRET+dUxVl0drO5+0Dkk3HACGipsq50HkF7xXABHRyURwQFxc11Pb0Wfdko44AIzNa1p6fkCCnQAWWLcQEXnIKxLHkt4VHXusQ9IVB4AHvHeFwCOA3GjdQkTkAc872e7SnoqNvKV6EnEAeEi4ufJrAtwHnhxIRJmrMzRUsKJ75fph65B0xwHgMeHmqsUCbQFw2ntgExGlExE80Lvr46uxdq1r3ZIJOAA8aMGGykviAWwCMNu6hYgoBUYguKVvecdj1iGZhA8D8qCdKzr+GBibtBBAp3ULEVEyKbBPFVfyzT/1eATA44qbK74KyH0AgtYtREQJpbotoGNVO+s2v2Wdkol4BMDj+mo6v+9CrwCw17qFiChRBHhIDxddwzd/OzwC4BOlneXnuKPOzwAssW4hIjoL/LzfIzgA/EQhxc1Vd0D0bvBSQSLyGQX2QVEZre3Yad1CHAC+FG6puFrU+TlvIUxEvsHP+z2H5wD4UHR5Z5eTHZ8LXiVARN7niso9ofMOXs03f2/hEQCfK2muWqnQB8CnChKR1wgGRJwbeqvbfm2dQifjAEgD4eZlFzsI/FyBhdYtREQAoCIbs0VWba9uO2jdQv8cB0CauKrrqqyjfy66E6J3gicIEpGdIUBW99W0P2wdQqfGAZBm5jdXLBTI4wJcYt1CRBnnRRduTX/Nxl3WIXR6PAkwzfTXdO7IdpzLBXI/AD5Qg4hSQgQPHCo8Xso3f//gEYA0Fm6qXCCCdeBDhYgoWQT71dWborWdT1qn0PhwAKS5mU8tyZlyJHcNVP4LQJZ1DxGlEcVjY5Pit79Q/sQh6xQaPw6ADBFurpgPyGMCXG7dQkT+psDrjuCm3uUdz1q30MTxHIAMEa3p7Me755So6DcADFv3EJEvuSJ4IDaadxnf/P2PRwAyUMmGyhkawIMArrVuISLf2CUqq3pr25+3DqHE4ADIYKVNFeWuyA8AfMy6hYg8awzAdw4VHv/Wq9c+PWIdQ4nDAZDh5j7+hfzs7KE1gK4GELTuISJP6XPgruqp2fg76xBKPA4AAgAsaI1cGo/HfwSRK61biMiWCA6oq/V9L89dh7VreT+RNMUBQH+npKWyWhXfBnCRdQsRpVwMwIPqOHdHq9vetY6h5OIAoJPMfGpJzpTDebcCaAAw2bqHiFJA5Jca19XRuo7d1imUGhwA9IHCjbVFcEbuEsjN4E2EiNLVqy5kdX9N+y+sQyi1OADotMKNlbMkIN+F6nXWLUSUMEcges+QBL7/UnXbqHUMpR4HAJ2xkqaqT6vovQAWWLcQ0YSNCXS9G8Oa6Bc691vHkB0OABq3kpbK613Ft3hbYSJfUUBbAnFZs3NFxx+tY8geBwBNjEJKWisjqrgLwCzrHCI6pS2uizv76zpetA4h7+AAoLMSaY0E9qh7gyi+CV46SOQ1XS60vr+mc4d1CHkPBwAlRPjhm4PO5HdWKvB1ADOse4gymmqPONLAB/bQqXAAUEJFWiOBPfH4chG5A8Bl1j1EGeYFQNb21bRvsg4h7+MAoOQ4cY7A56CoV2ChdQ5RmvuVQu6L1rQ/Yx1C/sEBQElX3FR1FRzUQ/Wz1i1EaSQOoF2h90VrOvutY8h/OAAoZcLNFfMF8lUAywFkW/cQ+dSQQtc5cbm/d0XHHusY8i8OAEq5ktbIeRrXr0DwFUCnWfcQ+YLiHRX8EG72g9G6pr9Y55D/cQCQmTmtkezcEycM3qZA2LqHyKNeguIhDY2ui16/5bh1DKUPDgDyhOKWik+pK7eKoBxA0LqHyNiIAB1xlR/317Y/Zx1D6YkDgDxl7uPl5+YEAzeq6JfAOwxS5nkVwCPqZq/jYX5KNg4A8qxwa6TMiburVBABkGfdQ5QkYwA2w3V/3Fe78VkI1DqIMgMHAHleuDUyGa5bJ8AqAPOte4gS5DUB1o9p7NHf1m5+0zqGMg8HAPlKSWPlHA1oHVRqwWcPkP+8DaDFcZzGnuq27dYxlNk4AMi3Slsj/+a6bp0IqlVxrnUP0Qc4CmCjuG5j/kcGn+2+unvMOogI4ACgNBBpjQT+pO5nHNU6QMoBFFg3UcaLQeRpcd3GrEBg8/bqtiHrIKJ/xAFAaWXmU0typhzOvwbQZQCWAjjPuokyxgiArQI8keU47dur2w5aBxGdCgcApS+FlLZFFqq6n1fFMgD/ap1E6UUEB1T1SUexZTiW/8yLN/7smHUT0ZniAKCMEW6snAUHy0T1OogsBJBl3US+9HtV2RIIyJaeP8zZibVrXesgoongAKCM9KlNSwtGhrKvUbiLBbIYwEzrJvKsYQDbVLElEHC29FS3vWYdRJQIHABEAEo2VM5ws7AYkMWieg2AydZNZGYEwHaIdgvQNVgwtPPVa58esY4iSjQOAKJ/EGmNBPa48csdyCIVKYNqGXgyYTobBbBDgW5R6QoNh3Z0r1w/bB1FlGwcAERnYH5rZGYgHi9TkTIAZeAJhb4lwKACUVHZAaA7KyDP8zI9ykQcAEQTEG6sLXIwXKyOE8aJ2xOHAVxonEUnOwLVfhGnD+r2uuL2RWue+JN1FJEXcAAQJUi4sbYITmy+I25YVd4fBtPBf2epchTAiyLoU1f7VKU3WtvxMh+uQ/TP8T8moiQKb7k+D8eCsxyRSxU6GyqXApgN4GLwMsSJEeyHYrdCdwHY7YjscmK6e+cNnQPWaUR+wgFAZGBOayQ7b8y9REVnw8EMUZmuJ44WvP8j17LPmAJyQKADrsgbDvQVF9gFF7sRcHZHq9vetQ4kSgccAEQetKBx6bQxCU4XkYtUcaHj6Pmqei4g0xSYJoppEEyF//4NKxQHIdgLYK8AAxDdC8heiLMXMXfv4IeO7+Nld0TJ57f/PIjoPeGHbw66hX/+cADBaaLuNFdkKhwpFEWBqBTC0UJVLQCkECKFolqgQAhA8G8/BFlQDQISxImPJN7/NRcnLo8bBTCqwKic+Hns/a/Je1+HyIioHnIVh0RkUKGDAhkU0UGNu4OOOINxiQ9mO8HBjwLvtlW3xU3+wojo7/wVWJvziRnusY0AAAAASUVORK5CYII=\" alt=\"\"/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"pure-u-2-3\">\n\t\t\t\t\t<h4 id=\"status_google\"><%:Google Conn.%><br /><span id=\"_google_status\" class=\"red\"><%:Touch Check%></span></h4>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"pure-u-1-4 check\" onclick=\"check_connect('github', 'https://github.com')\" title=\"<%:TLS handshake test, latency for reference only%>\">\n\t\t\t<div class=\"block pure-g\">\n\t\t\t\t<div class=\"pure-u-1-3\">\n\t\t\t\t\t<div class=\"img-con\">\n\t\t\t\t\t\t<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAHgAAAB4CAYAAAA5ZDbSAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAABx0RVh0U29mdHdhcmUAQWRvYmUgRmlyZXdvcmtzIENTNui8sowAAAAodEVYdGRhdGU6dGltZXN0YW1wADIwMjYtMDEtMzBUMTg6NDI6MjcrMDA6MDAo/9aaAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDI2LTAxLTMwVDE4OjQyOjI3KzAwOjAwDrdP+QAAACV0RVh0ZGF0ZTptb2RpZnkAMjAyNi0wMS0zMFQxODo0MjoyNyswMDowMH/q90UAACAASURBVHic3X17nN1Vde93/c45k0kmjwmQkISEDG8JCAMBRaQwtFKRagXb2tvez0eC1dvSViX1em9tez+E2l78+GhAW4sPINy2aq+2ERUQUDOItbwCAeSZgEMgAwmBTDLJZOac89vr/rHXWnvtc84kAcLDuzXMOb/H3muvx3c99v79DuH/k7ZyYE0fgP4iYDFx6EMoexFCLwG9zNwHStcWABg0AmCEiwJgDHGVngpFdaiJ5lAV1XXLB88eeX1msn8b7f2SN167fOCmvm50D1TK5oncLAeKUPYhhF4KgcEMyLwIYKaWOTIYBALLVSzXxRuIqQAVFQ4VbEdRWYeisq6sVG8DMPjLKPRfCgGvHFjT20Szf0ojvJfL8vwihD4KJSMwAIDB2TyISATJBKYoUGnM7M6DmOUPmPxxuRggAogQKhVwpbaOK9XBRiVc/4nBcwZfQxa87PaGFvBnz7h1oBbKC6lsnl+UzV4wQKxWGYVLHIVjN1E6RiAGACaQ2KgJ038mkAnb9wOOdu7vAQCuVIBKZSjUaoONCl33Rhb2G07AKwfW9BX1+oXM5SVFo96LwMbrFrQ1UwScsbUIXJE4dkIiQVERlj5buaByFuymDocF5pkrFQq12hBRsWKsFm775OC7hvYbM/ZDe8MI+LNn3DpQ4/LSot44C2UzWSgR2FmfXs+Jz2aFKgtKwmO13mSleh4GA97Co73G7mO/qjvEjEB2MwBCwWLmRACHWo1CV/eq8Ubjsk/e8cYQ9Osu4M+ecetAVQRLoSmM9j5RcDKDVvgYyUkVDDABzlLdOUGCzLqLKHO4+6Rb/e77SLQoHKjSKS0AEGo14q7uVeOVxmWvt0W/bgL+zOm39NcorKR6faAom1ChqGAzfyiNhNoOp+y8mnFUEzCI2oIwIDN/d0zRAPK3cOjQ7rcjrYkmcnMAAK52cVnruq5elq+bRb/mAl4xsLp3RmPqpZV6/RIqm3Zcg1oINqKIqQwBHDQQEpOBCAD21cnTrNBsO2/JmdsFHfx7PC2KpvAO7tyVBOydOgEADtXqU6FWvfLj/3HeFS+DZa+ovaYC/tyv3Hh+MVFeWzTrvcTEER8ZrRZLTMzEpH879ZWsJRo2I6GrCpldpA1K3939mbKAYxrcjh6u3wjORhN5JYBarwdsaUUFodo1NAE6+7W05tdEwCsGVvfOnOheXdQnzgKXNInJZCzRdKhTgNtZ4jQJdjs/ap2IAu2p74xGg+7oesnBdpY3C+bYhclfW7eVKkKte8XHf/bOyzpNY3+3V13Al59x08CUemM1NRu9EerY/J7X8yhQJoVcBijlvJ2adEUuC/LnDFGT2Cj/xjFoEp+vdLgAyu7RODrPmqyXhNMm5w4+X8YjEIgQalOG6ihedWsuXs3OP/+2H6ycsnt8DTUbvZG1mlWk8iDpQZUsAUGDFGUcgOz+eHlW8HCXMVJk7HNfDYIRmMEIpFCrvTIzWC+ScRhqfykdSvNgsCTeLPgd4Z2FHvUikPFShayoj/d1lY37Pvf2my98VZgv7VWx4BUDq3unj09ZXTTGB8AhDkRRcsrUrDqULDpZpECh9tnZK7qT5M+5qFdRQK5JFkeGGK2+OYuSvf9md42LETzSJARKKR0cKkhkTxqYBSIKXVNXfOKOd70qkL3fBXz5aTf1dYXGGjQm+qglCrU6MJCUO33nCF55Jcr5uvS5zXm6flxfk/5tuS4fU3ymAKrNoc1jdwgGO8QWcdqR+OSjWyC8KNCsdX+nNmXiouWDF+zXBY39KuDPnH5Lf6UcX031+uKWAMkKR4KqVpoCXDxjXioCeJul+CiWoYYAszjHXO04+VjLsbQcQt7vOz8b78zirfQpK4WaSsSxBR3AnPy6m63RDQjtmhIi0lPWuoZKqu1Xv7zfBPyZ02/pLxpja6hs9qYiL4xVvlYMxMkSiANLsYAdjNn3eGXGSP9dLK+l/Ng+s0xc5A5qLwqppDgcP5uliZj0u9BKRMxerdStsMeUlnl412OoFCcHBspa11BZdO03Ie8XAX/m9Fv6qb5rDZWNXg1D1J8mSzIfxYxgtWPSLDalsVm0alGUrQo47kVGw64lRUlgxvxpmLWgBzPmTwMAdM/oQq2nAhBh9NkxAMCOZ8dQH21gx/AuHh9tSB9uYpzrjDEtEajgG48LPT5tSrTBbFmwor0SJh2Gam2orEzZL0J+xQL+zKm39BN2raFmc5b0SIlaWCkh1YO9GXsfHEOQKDeBT4FrX/CQ7qLvlOBm4dI5mHP0LBx45EwsPHkOZsyfisDoWO5sY4CM39jVwNb1O7D18e3YdO/z2Pr4dmwfHlMwd8Ga6VtED6GJUIgfllBKCx46/3Qs/+uWM9J1QKjWntofQn5FAv7Mqbf0g3f9uCibvb5Wm+W6vkhvAUu8UiNTb8XkIS1DASsXcveMGg4fWECHn7UA8088AF0zauDQydZefiMivLB+O4bvewGP3rCRNz+2LQv8gJTveij2EXiUb5pn4ge8C2tfi5brykrXUKi8Mrh+2Sy5/LSb+opyYk3RrC9u7ScFrSrUkEXPGjxlF6ZbHeghy4cWLp2D0z58LA44ciZqPdW9T05LoMndJoanETtzwR0vigjrd1/9GJ5Z+zy2D+8yC84iezeOzST1ZmckS7PgLuvLBWIAEKpd63b38NkrXmZ0/bIEHIU7vqZoNhbrMQPhxEHSmZnf9Wu7trwHQ21lPLfUc497dx9O/C9H4MAjZyWB7Svl+3ht2wrWJPcVRHj0xo2482uPYPvwmPhhvytE0VanRknDMlC2qp0580SLSztAKLumXPfnd/7mRfs443xeL+emT5/6nTVFc2IgdkCcqWoHPzXJ0Ewt1yei4n3HvbsPb/nQm9Azd+rklL4UYfsx9iTQDn1maEDx+2Mm6F3I/K76F51bdC9Ay9JjFmFLxCUq7oIwAoNQVrtXfPKu91z2kuf5Um+4/C3fu7TSGL8UCGahGQO0Uwbrarpaq0aNzEgVpZb7GMCipXNw5vITksXuj9ZJEV6qcnQSPAh3X/Mo7vvmekzsaPiKVqpmWcEnx2q0fdfqWYo9bPZUoN7Vffb/uuM9gy+B4pcm4E+97bvnd02Mr45FiJSgt6Y2QjmnjGlPLXFtyowa3vahY3HC7x4Zg6Y9UKg+vaMC7Elwrec6cfxlIMKuzeO48+pH8PD3hji5GOuaJajMArX4PR9Q4duyENdCURuZqNFJK+64YGhf6ars64WXn3ZTX9Gof4NCmdKhZIhsnzWRj57VnY+TtqDRtuRE37Vw6UG44IozsPCtc9Og5qJyjnu4pGIyDWj5nvKZ9uuo5Xun1iJ42+8nx7p6qjj8zAXonlmj5x56EeVEsCVJVXKXaSDzwfmSYlrJytJDYnA5tUK1/h8Nf/O6Sahsa/u+mlROXEqh0ccFdBWGvbASrUpjHjQxy/VuC43UaPG2/3Ys3vcPZ6Ln4KmQGzKLSrU++eOse7I68Z5aezF7n27KWltaJjHjCe8/Av/1n8/BzAXTWoJMv3BifAND+AOdHrGlYVKmtQoeg4tm/az/fcp3L3mZZHduf3vqDcsqzV3XMEpykaEz25R7+OqVlptyzmgwwTRlRg0Dy/vxpvMOTVDrhDvZ3qw9T6glDXolTWnZF9hugfr6ziZ++Lf3YP3gpqRQzrf67u2+PKOD8ReAle6YwUV1pB6qJ61Yt3eo3itEr+hf3VelxrXg5mwd1q2Gk0V8Ue72JIGkgilUELxiYmIwzVrQg/dd8StY5CF5H3JS/c7I0omX5DdTAY3S98n6oPxv68JV2zH5W+kqcPQ5i1AUBZ6+53kfrpMuksREwmuQc3F6nOR/5soJBO6marX/x8P/uleo3itEVyt0KZX1xcwCqeIXdFEeKjQrXYmWUVa8j8flnlnzp/PvfOkszD5iZpYhMTguuMtYNmYH4SZd1wgvddRq9e0gwGlhXvPWbOw0LnM6l98LiwPsGCndsZ8QAt7ywTfh7X94XHRr4txC5JgBHdsHLQBmuXMM0Dw/wKiUjbM+tXT1+XuT3x71fkX/6r4uaj5JKBNSIM0JhPaNcaxMp1wSUtGduWAavf9LZ6Hn4Kmd4XeSvVWt67J5GZsnvW+Pk3d9+gJMp88vt5GEUndd+yj+4ysPCcGiC4RsMrFimS9F6vXCeHZ0EYquoXooTlqxbvIq1x4tuFaUlwJNW3QFgKCfpX5qwlWtButap86E1DHOmD+V3v+lszBtbvfkjPOlRZ0ckFmN1rP1sx9fGbAvTRXDgjY3jhs6+YOX0ZgZITBOvehYnPJ7R0t3gmUs/zMXHYg15GKwm1/8jIiCqTTa6KMq9hhwTUr1ilNWD3SV9R8zl3n1hZAveseDcacht9dS4Sz4A//06zjgiJnw0Bip78w/RedW/poMqH0C5ik6+MlOx/dlzMnoaLuPWubSEitUCsItf7sWP//eL9KNnp+dArosRTHb0qiduOgaaZaVwyaz4kktuMrlpYyStCOhF0DaFJdySJb/s9vG4IgB6Ozl/Zh9xAwwB+f/2i0nN2y2/r1/9Fz1Pq/d93ofkVu93qPXZfdTEor30Z4O7bcdiVL/LjQCAJSBceZH3oxZC3rsuBmFD9JYDVnq2/q/eJ4CAgWBciobs/ZkxR31ccUpqweq5fgacDBfmlb0rMrC0CI7cq+bpUoAlv7+0fQrH3lzZ9/2Mnxn+xS4w+d97VuiV0uvNHq12eydgiKH+TR8Zx8+tnkc133gVtRHG8YvHZqgJPs5KaJD80CN/6Igiq6RMlQ7WnHHNbcihAt1N2RsorVKCMtQoPhYiUyEgfTAGBFAoFnzp+HMj7wZYbIot4UBRMBPv/hzbH58G5iBQ5fOxSH9B+GQkw7qyCyJD0yj8pP7ojjxmsCc99Hi0/3YjV0lnrh9E7Zu2I7nHx/B+GgDx7+7j49/3+GtjiFLwbSLaQd34+zlJ+IHf323ZcVWTnCokyqAkBwTBh8s/AcRITR6Ua1eAmBF6+zaBLyif3UfeGIZd5iY34Kqq/BogUYpqrNuPHv/lwZQBm73iY6X3tft3DKOu7/+uKgI8ca1WwgAehf04O0fPh6H9B+EnoO7k69zLsEbYCdsUuto9ZWqruysCO7aEBgFETbdvxW/uP1ZPPC9J3litGEOBIhbgt78W0fAGUMWK5hJyKE3nXsonvjJs3h88BnPFNvSKzhNutwo0XV6plVqEDpYUTY+hn0RMIpwKYVSQ7fYnzxHFDjtE1aL1Dq0R0d5WAxv//BxmDZnikya4K8xPwdvLIxN926Bbn3h1C+PDO+iGy67E7MO6cEJ7zmcj3nnIpo+t7uFk4DFfq5PyzHMz2jg76SNFH2zSlcsauz5cdz8qXv4qbWbdfWLLNCRe4fWbqbmWBOVqRWHs1mCAfNZQs85f7kUG9du4fHRCSlVMhVcWABrHMiMWvf0pAAnzrrZu+KU1QMr7rlgcI8CLrg+wNneIcBHxhZIJeEaQ/Q7EdGs+T14y0XHxNdoBE7d6eS5s3fbeN/W5KthDIyazMD24V10+1UP4sHvPsmnfWgJLXnXYgTxf0VRoLGriY33bkF9ZxM7nhvDjuGdGB9tYGJXIxune3oXuqbXMGv+NMw5uhdTemqYc9RMdPXUbPzmWBP3fesJ/PQrDxqfSRmraY46SWasv20T3nTuIkVVt/Df2uKx2rQKTv/wEvrR391n/Ay2wuSi62wnpnzIH5IjcABxeSmAyQX8V0u/fT5CvQ+6GC/DaDAlGVpGjBqhrpBoAPa2Dy2hEJLqCRUWtwE5TEYpEnY8u8ugSnNFjqYU9VcY/OLwTtx02V284Seb6NCT5uL5J7Zj4z2bMTK8qwNDja9+/7J5XCKYRRx8zGzMPbIXi0+Zi59+9SEeGd5p1qX8JdZHWpEZwujmMaiwFa1aw79Wz3Hibx+B9bcNY+PazUiGpf5Vb/YGZ5UvJxtEh1g2z1rRv7rXB1uZgKtleC8jiPwUWuIW14BgHsSFUT4fjqAUmA89ZS4teddilKU+tiJG69MG76coMWFkeKfuV5KqjiwzSsIGreRGBaD1azbx44ObjG+ekW22Q95t2/ZdoSGO89xj2/DcY9vwwA2/gKYI8riJztaSGqlR2OrG9uFd6YFynW/LPH3soRB/+oeWiICjCsWTgRKOQXGa5QoC0gYCRiAKxIwSZaW5DIA9h9ySBzfP19G1ggKLyrVZHSZzfQotTExv/9BxKMuQlxKVPIHn5KeSmhdE2Da8E1KT1Yq8Rspso6cPLIsX6Tv8Vfov3R79WqqL+7Ok5+WfCYUENg1RlB6JMSVPzf2+zsuZMbtj8U6AGfNPOACHLp1rHjoKr2DoPjVBDAYoGLh61yw0EqMI5Xu9RE3Af9X/7fMB7uWMPcI8GcQIkERck28PPYtPORjzTzwgMcgRndmUj7xlsoEZ3TO6YEKDWQl0LJKdh1nyr+flvly0KV4BLEgwazKFkfnGLsmYq08bhrQSINbp7TOeSipDHeYOC/tzZInXvu0PjnW8iIiZ6FEUkUxGBSCQbnONnwYu6b+2t03AFTTfCwTTKnL2APVd0llwj17qtTrIknctRqm+t7XqoxNqnaTT8CnTq+mAywnTtW3A29bYjcaCKpq7AQAHraYZjxONYt3ZAorvWfoihtaH1TJ5yvSajWnBiackmYhTvnjF/BMOwuKlB+cMoTQmW+0/oSkZ5+UuAhGXPAM9tsrkIJoHDNhBHNxyX6CkMZloBO/0SO+C6VjyrsWGPsY4N1NbYksIZa0MjIOPOQAGTV7NBEFCeq7H2OXP62NRroLPHFgDH/X2CTdbTTh1l0TDimAymkKmMF34QzPnTW31OtlcwRZyazfGA2bGUWcuQJpjJKzUbpjtH0y5Qtr+oZ0TUwGclQn4z/u/0cco+4JGycoIUsCR1EulIcMHRI0PwpOFJx1kgVWKclSbPUT7qpEyMX4/9OQ5Kcgy3yZabI6UBTKJgwqF0isZdKzALG6EGEaD+TOzbgYjiMsJTokZQBBo1LmqlTvkN2NceNKcbE4K4G3z9GmE04I3nbsI3TO67AiAuB4rlBNRogXgICxRgoMu9XFzIBNwUVYG4tPZOpSJQ5jIFnRxUkA4tUbgQCe//8h0J2tP0OqWm4w8Za/jJS+Chf1zlAZRdkrDSa7GqkDERMQUOFBgIIibNHLJwYtTDA2IWVBP0jXq5FLMCapSqPWwe+4XQPf0Lp57VK/JLYPvbO5sBOo8dKzqtCoOPnq2ozeBXxSsGaCMG4gZHIgpiMMODAZC39+cdMPiJOBKs1+G955XBO38gT5cpRGw1tHA1LtgOg46wk/QrD/77u3Yr9syACoK3PA3d9r3aD1xM1BgA+FUZFD9TWxLkyfXs+44IRKmST8cJA0DMweopRtS5T4zyZ8owqNTnLHRCfrPVY9ETSF3kzDPzz0TuWcMYgzjhJqYl8hh5pAhrGGRygYBY81dZ5uAwThRhjM8N6uylMIRyYKLEjsygKPOXAjmkFMvQ8NN2P9zAAcAuOu6R/HcYyO20E26/cfGIYURCzeSJbidmg6DDGwFoi23JRGUWpBm20guJVq4DEYsmzM4Pfep85L8/rYvP4Dh+19wZpc0w3/v+Flc2pFnzDcDZ1Fgh4UElshZtE0X4Q0JWOkJ/U7AYcALImkmoJPJhEEOOuWeo85cgKRBHhedMFsa2X+A3VsncNuXHxBBKozDrFM6M6tJxQMX7crnoKmx0GgTNzNXRFGYcQrM6drUt07WOKPRH5uCiZbd9Dd3cWMsveANcPcp8zPmpBkyGNWeKg475WDAl4tJSWhRZtMd4xCDmAIzU9HsA4DiL5b83/62oFLdY+yGghEAThWuWKpToR54xMxEq+JZcJGfTVQAktmgsCgI3//rO80StBvKl8HdOoL5ME5/zbIVdcCu+ubYSKkPm4+BMetoPnXySuLvTZ91Vtj27E6679sbXPrNOc3qIDKMEcSV1buDjpyZEiTA7oHupVbSkyuSuDuxiwKfAABFKMpeHVYiRrmNKfdFLPcljFV7Wrz0YNSmVU2wxiAnHq00JuuQrgNjx+YxPHXv5kwZ1FqTbpvtmpCy5lXAFIo4BiLGzsgI0QKQFuzdDlF4eEwyh9HhDDZKBawJtvR39zcf50pRZBS3AZgc040GahAAsOikua5oonGGuEoSc4YLfi1jCVoVIRAddkn/tb1FhblfttLJRJNmJ1oE6mQTgIk4mjTPPbLXCabDZID8fMs1P7v6YWiAI/KxRWVuF7R9Z8EtCTBEd7LAOdEaBWA+O92rc2HnEjJ/LjFIXKTlhCNxMw0Hl+/HDnbvnKBn1j0PZArbQhQlerzCgxFTxUQbA5wFdHlXcerOfcQZcEDPxMxZBVfKXte9aDenUDoutQg5DssTqNOMeVORQIrTZNl9dhL1tlEUhKfu2wIJ+SP70jt+vfMwyWUscatC5rPse1Ch6NzM0v1SXhojZCVSN0lvhGyKwDqmhnDJL2+4fbiD0TqBc84XL7jq1Aq6Z9TITNypqQmeFUhSNB/ACEE8IzE3qhMnFQzqyyfEujXTka25qO22Mi0HgLlH9ma45QXYUbBIkxt9bje2De9kTgG881PIXjObfJ8LMhRIwMSSF6qPYidwYZaZRB4QZgsPGTh6BSFLwsyak7XD+AwG8OhtT9sDaq4ClQRtfVKbIQRmzF4w3XiaImldF2aX3USaRTgWgBGYipJ6CzAWt2ptbBqKq9a5RN9dz2B0SQ3WSTJXfXcsG4OBHVvGYHDnJm6Et1qZeyJAYwVTPJLzVvVy1S+dD9JcOs0pGytDBI9Q5Im0PhN9xNuGd6JaaXkyiLKbTPjmQ11cMufo3qzvxHRi/xrV4AhvM6Zq6CusCyDbOMW+U0payvLgt9IIAAcf1dsuUD8XdjLn/Jrtz+1yPiwnVrU2txSk4w7WLJxWXqnlu1TH0cN+DIvWDQxjEMPuIfcW5pEJns31puxDzm1/tmXzASOfPzmetDC1u6eGjvEEhaT0nDINhziIRRhihIACFHrt1pAKbJGHSVXjsZAxuYW0lrlkHjkd9XDEjO3DO00BdLzMllyq4yAaGoJkDIY4QDkeK2W2epVCEfImmBCCXZ9qUu4zM3xuLtcpYgCarFiOPD5azzjA2f+g6ab7zuYWu+KqmjlJRavoysQBFbA6NVLeDNsgR8XiKgOCBVryo7gJiOOyBLN79UBUbL+qSb0LpqMsQ1ILbW3b+9Pe4ywStCJKfDQi0aB27f2oVm5gqxGR3GhURMkaWRbgY2BFbmOTwrMGR3EuZAdU9qwVL1t1T5UZnT3bk9yiHS5zZxrf2bA5Z/pk+0r8MRGTpEqz5vcoXZkiJpqhft0WjXUOrCASGEXiNTsNjASaIGTXj9aiTWdaHFfWLAFJ59tSBt1PzREd7HfLUioE9p/1vDDUhic4Hx4VBNyaZji4lpiihVy1J/KAzNZ/Kn0oLYgWp8Ue8v0AwKx501JwlU3dGYOXmwif9TvSrWbxPvoXSbqKXyKRmBgBBTyTOk4YHGQdymqjqsAW4XpCOJ8Po+V8mg+YMWt+TzQwn0uy8s/jgmMmkAVTCabJ0hQdJ1XD3EaDfNHBhObhso0W2PWCgy6jUKYrdqR7MhmyO+AlYtbo/wb/4AEyXnCGMhGYsgqZW1qtQsN0hR/7bL0IpNsaqEsplEAVncUqMBPKQkQFEjUidkklnJIpkjpEcRyK9Mb+7NkZATT9TEhCJPVgCdIlPxHmKLP0vNsKZNdrTdjQDMkHs5HH3ld29VSdAaQ4wscUtrvRLNfVPNIFUsaU+3UZVOWhdHt3JmhVGKRFxsV9jH4N1uGcwaSbvzML/Q7TNY8rTp81uAAR5sgaKlrVRhfXndlbtcuuzfYAiMBl1cf5paS3LcpJqXiiKZbOjcVMoSxLCMNqcdypP/k4dWaNuntqyELlVhelhKtPtiCP48tltFIGqTUmxFLWmm0IcmVuIlC5vWDmoczfCqFIi+s5WbrQLMS9ODxKlUqhI6S5tE5CFUWlJn975/e0XOvHU6kZQ53eMJiDBhWkjPGwan6Z3VUaqTJYCiEuDoBb4AdnlS22KFtDVC9bDsonoWH+MQegDHHvRc6TPMBi91/vJEeGd0UVVsvOx1e+SCAY3YU9L6fBVihGCgJGJABkIPk06SMKOrI0RZOOOAYwvrOR0cctf8ldSyas+L3aXYlVG/ValISVfJpgoVuxsG04JlDhoVii8lo4kdDHn7CAklyKZtRTAiZVLreDUa7UwFCje+1vxtyptmsl44lZTWKldeqsaWJXPaOmPWVVWWkNXfNjoZUZYBopQsnbhVwKcqMxGao1Or5jprOz8dG6WU8rFLWCUh5JM8oQ0HfywZDgTQ3A0N1KCkloDk5tvur8MwgDGLYFwfehimPWGTkV2LLobF1KxiEL2JzfTgrpembG4pPmIuFfKw5yy399SBa/bXt2l/ncxFu7J982oiVaZMNwaGKkAGGITfl1WkBiUvoq649ZAR8EbNkw4nwUEno5n5JUFBZBa+9zDp8lzPHTdOwwpQwtrMhplPHSAoUVMF0gpACSJT12sQmINRpioxpBPb0hXtqXZQ5EZrGof24rfe5bK5PJCAPHgKq+s8FqUP4OjUGC8CJGGX4TvCotqKiUQwWFypBzkVqHAbtviEUhB9+ybUSEt2PzmFmNPabiuOzH9lqm1y05d3GKRTIKGCGIHStEaYpjc1eBSnmRzPTiqooikaGRzsXDJ4Nt3dhUgVRYRDB0E6ay3gMQZ/VgZhxxynxMn9PtFbQthsx4bhfEVq1UsOnxremI8sZkYGrjYoxUBVQRUYmRIoRyhDr+pEima6K9qQab/gKbN7xonzMkUuLzubV9r02t4LCT57FfE1YavFXpXxaBx2s0ThaaTPq5gkbrIp2LGU07PamaFqSMF7fmpj1h0p/z2T6aJj7+3D6UIWRzNEMVzWttXuDPrd+G3TvqCh6qFr4kvAAAGMxJREFU8KquRl/21/IItRvGZ9dftK4oC6wTFbRABARwcIGLsDtpSAo2GOBnH9+GwsNui4mar2sTrV7GOGPZEkqlyuRPnAVKMMF5oCbv/EhQGCEzCd1KheorGYrmmZAcZeapNW0KzueaUHXEJFwGz17QQ0vOWeTP279W5c98NJJujz43pnenVDEpq8gk0WTWnegh4mIdABRXPHrREAcaUeGyRsvJR5EnEqaxZgUYfuwFNHeHhM+J1TaPNBktT6bAAQDmH38ADls6z0E7o5UG3UFoQgI4pToKyek7GzOEDI59OA4L45PbDmD5ZbR43H4UWikxJCFPafw/Mf3KB98cN/8z4N0APA+8MWgBw/X21P3PtyiIydv4YfN0/4OgFMAIHJ4CZFclEa0TfVHfmhaT2euYQoJaj8IfsPH+LcmqHP2+pXvcMWfl7/ofp6B7Rg3mXdnFbDo2JXjMrMctdPvvKuEEqQl59LM9rt+KLsoPTigCrZZR6k950HfyPCx5x6LMvqG8IMp4E/vIX5EhwRuG7ttstprTnjl7+ZwKecpfjuFBtGAACE3cb8xyAwbTiEwkbjC9lnjj/VvRqaVApnOzHJmBnoOm4Df/4jR3baQptEKwfQbby8MYcctoBmPpeu0idaWWTBwQ4mMuqTpr97bSkvpNQAQAsxdMx7s/+VYpbrRMmJMi57xxzJGPY1snMPzYCxnNflwTaJHijuiZ3fo9iEKzGIyXAeBmGFR/l6VBLmLzkCfxlmMg033f34BKUSQYyrAJTtL+fK6RAKHvrQfjvD87lTL1IV0oyHdXmJCY3BZbyiSgDLCCjaQZCTf0KYG05UcrYLGFLKqHRw8JAmcvmI4Lv/gOTDvA72zxLih3Rx2cscHUxvu3xJEMxTRuUH8cbIO0ZgmRJAPc+IKkJpIFo6wMpo0ajnFWeOcEeW4Fw00FY6N1fubBrR4CU2+e2Ox8J4hinPCePrzzo0sBsDzQqkDtwptUM2YgbvH1wQ/bqg8gzxFZipeX/CjntivbeguK3yWydmPMnj+dP/CFX0NXbzVFyWz8bgkAW3jCrYJkPHDTL4QOyEKKq+cIoqppWDxBKSYSOtddMXTRiAn4iqGLRphpXcbs7F/azWAa7n0zg5kDrf/ppoxXrf6WWv761AfIY7ST3ns4lv/bBThgwfS8hJhcj0WPZpWmQLYokfyxi6yZ/bX5VqDsc6rHI+tH2tLfOBIf/No5NGV2La/dtHxWMjvxxLfdL9bxxNpn4caMS2G2HAjEbbpxP4S3cPcZKHGb9mnPB4dGuI0laTdBgk14IgC3jJbWZpUBa294kpu783XMNOPEQCpI4Dw7nWYlk+nqreLifzkPF/zl6WmXoV8EETptM77uNckt0L6Y46FsaLDNU+SSROqoS58PWzoPH/jiO/DOj5+MSnfFup9s3sLJjt35EOeZB16AuhO5kMC6mV1vUIqDxB1ynUfZkr+jfdpLWAqm7zDzx0Ccvy/K72IE4jtQGLK9hpjlVeBg8O7RCTz8w4044T19Muk0E31m84EbnsK6G58AAHT3TOETzzsMS35tEZXuqXu/96BZljjm7AVY8o5FeOiHG/HgzUPYcPdwWg+1YFZ/ilQXwGNXDs5TlM0AiLTi6NaeXZzioZuJp86cguPPOpSO+/XFWHD8bDCnpxBj+pXgx3ogSnxLB5FCwHgLEaEoCvz46nVIa9ZCkwvt9CW+DJ0x7MEzaC2mpJErN3x4sE3AV2z48ODHjv3qCKplrws02f4ThShPEctpKdVRpJ8IjMd++gz3v/dwKkt9Nh3pMVEijO+s45lHX7B7Nqx9lgevmY5lX3gHpsyuJR+m98p9ZQh409mH4NhfW4idz4/j6Qe2YmjdFmzZsI02PfoiB9a3k9nCgxIJZRT7+fhfDbVNAAmup83ookOOOQBzDu/FsWcuxIF9M1HpLkwobVDb6rCRX8PuOv+LMfo80sM/3IgXh0ct2kgxgtws+hN1M34PzAmrRR7UrFzvachfhBbCKgZfor2Qhd5R64Uwe30ekBMKAOvvHqbnHt6GOcfMdISliZ72+8egIKJbvnyvTC7Qi8Oj+MeLbsCyL5yDWYum5UwyjkpfgTHtwCk45uxDcMzZh6AoCNVKlbZs2Ibhh7fh+s/d0YqHUZfcK5mMfe46IlD3jC789v96Ow7sm4mZc6eiDAGh5MwSAXT8nUSn9X5dNr/ABV52mBmVSoHbrnkwoiFA/ocdlP9mZ1KLJ4LV1PV5VwJRWS8yAWevUSoniutRFkqQW1jwhMUoKxjOpPxZzw9e+2D+8JUfowxY+jtH4uP/9j7MXjDdosKxHXW+9iO3Ynxbo+2e1mK8z7hCYNQbDXRN78LtX/+5cFgt2So+BnTBGMZZ8MXM2L1jAg//5GlMO7AbjWaJUDJSaTIfu51I+avC5Q7Xe7Vznx/64UZsHR4VmyEb00f70V2S+eggKawaAAPgEkN/P/Sh78C1TMB/P/ThQZS0TgZwFSMdQAlj3fnQFo4AwPq7h/HIj55uq5H4NKk2q4KLvnAOumdMsch89846vvvpO1AUCQrbmCPjm7KJYv30/zyEF4Z3SjQZn9b3eavDgJRquL40U7jne+sx/NALNpR3GUnB82OyAJIL0BGs5/19Wk+vFAUGr3kQipKweQl5pLSndee4BqKySbECS3HDt7YXgocGX+8eImznLcExR6Er/jflrIFuuPJuNMeDhaapapOK6l29VVzwydN0dyQYjA33PIt11z+RCdAKHS2WrG33i3Xc/f31smHOqM4qT45yLWKwMixdH/u/fdXPI/5lqOG6aTum/OEOCuFiEH+tnPvPrz+KF4d3GJ1qNFAcUsRxKaSOFZtsKwpMZb1xZes4bQKuhq4ruMRI0nrWQVnLbWRM8o+xsFATFXFsdAI/++eHxRrbGaF12MPeMhdHnDzfLW6Av3/FXXjukW0dGZmV96TF4ryeBwsNrJvmzOoA2CMvqYiQ7EvSzfVrh9HcXcJqGhn5k2H05K1NEeT77hfruPWr9wGyHUnhN59jXtFhNxfLCwBwkwa/NPQn61rHbhPwFUMXjaBJ19n7KOJIFp0ak5IRpym3bP6+/RsP4dmHtjmf2e6EyhDwnv/5Fuqe3iXWGv3LNR+5Ffd99xeoFO0/7WQxnrTNG0Zc/369WitxkeaUM7Zeq9xIhYynH3jexkmIZZreTo/72+lzSrITNF//6TsiL31NQf96QUJ5zBmsMMdsmBkIE8V1bYzCJD+MdfLM33iUKrgEhUsOif2+ABeRKgmFvr2a0koO8VP3b6GTzjsCVAF09T6lB7Gr6tQCzbESG3/+vBMe0/o7h/npB5+neYfOxuwFM+y1wdVKgcbuJjY/vh33Xv8E7r3xCTTqjRSdpLq0oZ05GIlAOV3nUj22qxe9eQ7mHW1vBIzH3SMn6WXpngedG0nI66+745uP494bNkDDevOnyRP4Rcq0uzJe6kTBhHpl6EtP/OFFncbu+Er/q4YuHvrjo/5xFVWxzDEivvY+m5BRw3Hjl+QeLA8wFaCtm0b5+5+9i37r0tPRdMWMVis4/K3z8ZOv/9xYolWMJ+99Dl+59wcAgIXHHMTTZk6hF4ZH8cKmHZ1IZ48i8XdaAaIgabdCM6zqZbS7LkCEidF6e+dOoNn1cAKXS/zb8tlDAQH17SV++LV17n6fbkbD8aNwSt3T81ssfA9EXOfLOjED2MOvroQGLuMGHGVpagmms50dRpDuLeaoEXjotqfwn994NMct5F8XHn8glpy1WKeUJicjM4CnH9tKj98zjK2bdghsEjN7GtJ+LunD0ISzdC/Kn7PjFPtTtPQBVk51jtnysfXd2O01ZwYI2PXCBK756K0ZANtnqzGzbbOI/BRqsgUe+degoS8NXbwKk7RJBXzV0MVDNIErE7vyiaoPsyivxXdAAhn147d+9T48uuaZTKhaEGAWX/zfT8WBh8y0uCjhRIq82R2NAOv9qDNEtzfa9yNAbRDnFh0ACpSWBxMjpR/7q1sL7Dh1uIbze5mBiV1NfOvSn+KF4R2stLbu3EpWy9YlQ17SZvTKPQGEOia1XmBvv3wWJi7jCRqxGKFNK5EqVbZmK5aVmMdq2zd+cS22PzPmgo70xA4YKKYU+MDf/Sp6508XKE3j6YZZNlgl658tO9Hnl1uUQEZgtofJk6JkYZblx2xBkYWTmrIJktmv0pgyw2OZHtd0r1opMPjVB/DMY1sBwVZmKza7iDgZCrJeZe+zv66OdXuyXmAvvz56x8jN46fO+o0J1PhcqfiAkKopLAGLrfOR+j6JHWRJXHnVnCjx4JohWvL2Q9E9M3/tQzQEQm1qBaf99jE4aOFMbHlyO8ZGJzpQli0QOGgDLBKMRfj42lkBOPtkrlSv0QUKUtjBESfPo0OOPwgtGmC3p5Z32WlO1UoFN/7dWr77+xsg0RMl+Sk+yVx0scFV4NxQKbANBB4v3nbPyA2T/m5hom4v7eKj/uE+dHO/rzkrjFo91IV9htYS1vtBmImnzeyiD1756+hdOFX7icTohUTgwKhWK9j5/Dg2P7ENm5/cjvFddYzvbOCA+T2oTa2he3oNC446AF//y0G8MDwaYUxSLXMdVDBYNs4xOP0gpavjdmDEOX/Qj1N/9+h9Y5DOzX0m4UO1UsGNK+/BPTest/TR06D8svq1yzA8P/W8ZiHYWVx51dCf7PWHojtG0W2E7y6Wo1quQVX2CBOUAr8mzHDGaxqpBGnUSqCxHRN8zUdvpnP/dCmOPXtRO5Pkd5aaZYnuA2pYPHsuFp8615iWTaBSAdsYaZMcZCmNONj6G/SHeyW6VlMRJkY1TQt0beNlm0b1pF9ZcAkGg1GOB1z/+Tvx4G1DLm9Ly4DGFzIrTjxAzEYUd1Q5mAio01PdmLZiX2S3Tz/xftUzFw9igq6M8mFTL7aqEckvUzqHGJnOeo1yQCPYXaN1/vdP/wx3f2s9qpXCJX3J37VH3fEctfg7m3zOEBkyIU5KW8h2SlgfFF9NLARbQOOz1IwcH1HpCC6eH9/WxD99YjAKl6IymeKrbybll+zcdLFL2tAvvlzXBkoG7abluiVnb22fBAwAVz35J5fwBK0TjEEK63WDuMbOlELeFOKQClsqS/oXN3/1Xty4ci0au0tZQKckFIuRcmH7qpD2L7spZYelKpTsr9JlT9LgiHX7UYqDIHyUyDzJLQU9WQSfNc6ObHl8O1b92Q81oLJzrS9XdWGU8Mm/JliDQaFAYgYa4y/849N/nK0Y7ants4ABgBqVC7hOIypKVXZWqrQ0qFEoGJx2JaYKV9YpcOf3H8NXLr4ZzVF5ntZFuLplNktB5Fa1F4lAOUGZewKhdcSonKTXQHaRukl49nsy5VQuTHZXVioV3HbNQ/jyn/4AWzftALIdIvJMlCgisj7Yqg0mfM02VdwMRh1PXTX0kb36Xd9ekoCvGrp4iHeH5Vz66St/BLZlMhDohv2DQbdZvJkP8QubRvnTv/VtvufbT0S/qpLUf1mk5v6awNO+YDZB6zAKseIfEkIkisxihK/kUj2GM/Pkah0i47lHRvDVP74FP/nXn0MFa+/ZElBx8UoaS+avf1PQqlonFE5gO402zn4p8gL2kiZ1avfuuGnd0p7zCDUMWA1IUqW0PAYL6SWfiTaWrpE8wFZRTHwb1g7Tgz8awszZPTj4cH3JaSskAsrmoiDctfpx7N5ZB8SM5TFY/1nOydDOhaQNAa5GCNDhJ82jRccfmI3YqmcAUE4wfvYvj+DfP/sz7Hhht/ahntsigbyLtI/Z8Qi2XcP4I7MsgepY9feuGv7oHZNLpnN7yQIGgLUjNw0u7Tmvn6bg2ER81ECDaiDfhemF5HcNitOTfggAxkbreOj2jXj2kRE+cMFMmnVwTywFkuOU3FEUBe5c/TjGrHacAuO8f/tsBLkMTn2fVfSPOHk+DjnuABvLtpXJpaHOuPPfNuBbn7od69cOo0X0lMaPVEfkcGOl7vy17X0EEO2my7688U+vwsto+5QmdWp1NC+q7ar2YVp8dTw0d9OHtTi++VSml6Ym2JZSlORFtalVPXbPM/TY3U/j6FMX4sRzDsNxv7oIzWbpFuOjBe8encgjgRiqGh1yhs1SIr36agjEkFFD73hdRATLVy0GKOsBd1+/Af/xrYcwtmMio5ojkEmFSseKFKmyk+T4gnCy+S8tFaUMgEGBiMbosq8MfWTFy5VTe9DzEtofzVvZV84o1vAUWiyTdP0l6FMTyAoQylvAV7+itP2it2sHHTITZ/zOEhx12gLMOKgbDMY9330C37vyLsmdWFWIdHLsxmmlLY3rzgiDDzpkFv/ByndQd28XumpVDD2wBXeufgwb1j4rCgWRqY5L+byycTuO1wnxHYWEMMrXXb3xY8v2QRSTtlckYCAJOUzhPitjsrnXzvMFI77BySmEiqalROewNXJErjvokJkAGFs3jbbdo/f5L2m2iceew21+T+g95i0L8fQjz2NstC4Ti1dTK/1+XPW07b7C+EOFuoNc+AwGAkBjdN3Xhl6ZcG3Kr7T90byVfY0ZxRo4ITNTMidFRyscpfOumIQ8mKKW7+mYW2yPrMwLQdDNCfkOErLF7AgoiSZTzHbj6iDEtH1VpdlGj1PyNmY5PqgigTXYlN534bqr94NwlWP7pS2bt7Kv6KE16EafVm78i8cy7JTPaElUbcOHWVk7TGd9iHt1NV1OSuCs0Z4WADR4hyye5zQ5mlOxBK5QDLNLI008rVue9LCv8YTdYlDm6+bimpgJO/m6qzcuX7bvnN9z228CBqKQK1NpNU9FPxVpQhmz4c3ZPYPaiuMMpoKIA9v9KY6BXAILcXMM6LASIzs3xMC8z25puctm+28Hb+K/+zlogGd0tCKJOHq3IkcBwE6+8uqNy19SIWNv7WWlSZO1dTtvHjkR7/zXgjCVq3QaCtYwWqDRflwKgE4u5skpdwZg9+gZdnLMYNSWt7IFDRNccgeWcitWU7rGW53Wg5HodP3IEGm7j/WfAo64gmVuIKaOFMcxgccJxuUPQpO4GOW/vvrp5X++P+WhlL8q7YMLV67gHlwKeSODioxsWFfy89DZqTmUdJ7LG0yKkdxaqliW6YtlZ6I3rEqiCpH2kuvism06TGVGtMe/ci2g9+nx5K/TvWlhBgRgnEaKXXzR1c8u3+f68ktp+9WCfbtvx82D/ZVz7yfCaVSjXgFWLSfaEhjp6o8GLoAyOpUAEOEaACx31UtVeeD6MJR1LlYQwoTlAjCnEaRaIxE7ya6TVJpp8fuRPl2OVHKh+J+HEmL9cf0DhDGs4zGcfe1zy19yhWpf26tmwdqWzVvZR1NxLXdjAIWynpNFqYY735WCKDVdRly4j/Dr6wJWgTArNXM3PUgWCBfkpHt9bVr6as3rdIgkvdZ73a2JNKXNdcMMKgHspCt5J1asGlm+T8t+L7e96gLWtmzh51egmy5FtysbJswUJHRECUzqWnNmBUDyh267Dfl7tObMtsqUJk3J/8e+9N60GK/9xCFlidPAQCtzyTxj2pc/ApjQXWhiJhqnIR7DRaueWz746nA6b6+ZgIFozZiGlZjC56NiTE8miEBA4VKaZMCdsia/pcVdq143ioic5mSNveXCUDo3tnwXh/SZ+tf91vGQvYq4lXaAqQHCGF2J18BqfXtNBaxt2ZzPL8MMupS70WdrPJGcVMN1kk2pYx6wAfn36C+TazTfCiT/m1w27B4pVMhaA1OCdqdYvn6uxxlEBdJP/ulyn6uFl2Aaw23YVV62ausnBl9t3ra210XA2pYt+PwK7qELuYv7Ol/hEc9XjNwV2YLCnu9P1paidX8uq5W3jDHZ+JPRTQzCOIaoXl606pnXXrBGyes1sLZl81b2oWgu457KhaEr9EULbBdE1tS3djzf+bg5fh8p6QmHu537oMxt7GlMYgJ28xDVcdmqTR9ftcfJvwbtdRewtmXzVvahFga4oEt5KvdxxaczMRYit16rgRO5z/ABWZsAdWUr7y5e4rE4q15ay32xEcESchMaANV5kHby6wLFk7U3jIB9W3bg587nabiQu3A+psoTDO7Bq2QxSShpUV7r39FfEgEhaMTskcFbaRJqXkt2hZBcwrH/ANAEtlMTq2gsXP9GEqy2N6SAtS2bd3kf0DXQnMIXUg0D6MrFClis45LQtP5sxfx4Kaf6A5AWG3I4tpTGFh20bi3nA4Bx3o46vsMTfF21uWvdqpEVr1lU/FLbG1rAvi3rvbyvrFQGeBoNUAVnoUZ9qE3ipTukVFm92WoYHRYDpAO7nhnUIFAT60I93IYJ+s4bXai+/dIIuLUt6728r1mp9aM7DFBRnIgK+rnKvSDEjUiFqz0jFacm3YxQAogv8QSVGAJoXajzbVSnoWq5c/CXRaCt7ZdWwJ3ast4VvXVM6yuqZS9xpY9r3IeiAFVoMRAQAlAUQAgAAo8QYztxMYImjzDRULPZHPrmyCeHXu957M/2/wD7haegQPMWBwAAAABJRU5ErkJggg==\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"pure-u-2-3\">\n\t\t\t\t\t<h4 id=\"status_github\"><%:GitHub Conn.%><br /><span id=\"_github_status\" class=\"red\"><%:Touch Check%></span></h4>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"pure-u-1-4 check\" onclick=\"check_connect('youtube', 'https://www.youtube.com')\" title=\"<%:TLS handshake test, latency for reference only%>\">\n\t\t\t<div class=\"block pure-g\">\n\t\t\t\t<div class=\"pure-u-1-3\">\n\t\t\t\t\t<div class=\"img-con\">\n\t\t\t\t\t\t<img src=\"data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcKICAgeG1sOnNwYWNlPSJwcmVzZXJ2ZSIKICAgd2lkdGg9IjMwMCIKICAgaGVpZ2h0PSIzMDAiCiAgIHZlcnNpb249IjEuMSIKICAgaWQ9InN2ZzYiCiAgIHNvZGlwb2RpOmRvY25hbWU9IllvdVR1YmVfc29jaWFsX3JlZF9jaXJjbGVfKDIwMjQpLnN2ZyIKICAgaW5rc2NhcGU6dmVyc2lvbj0iMS4yLjIgKGIwYTg0ODY1NDEsIDIwMjItMTItMDEpIgogICB4bWxuczppbmtzY2FwZT0iaHR0cDovL3d3dy5pbmtzY2FwZS5vcmcvbmFtZXNwYWNlcy9pbmtzY2FwZSIKICAgeG1sbnM6c29kaXBvZGk9Imh0dHA6Ly9zb2RpcG9kaS5zb3VyY2Vmb3JnZS5uZXQvRFREL3NvZGlwb2RpLTAuZHRkIgogICB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCiAgIHhtbG5zOnN2Zz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjxkZWZzCiAgIGlkPSJkZWZzMTAiIC8+PHNvZGlwb2RpOm5hbWVkdmlldwogICBpZD0ibmFtZWR2aWV3OCIKICAgcGFnZWNvbG9yPSIjZmZmZmZmIgogICBib3JkZXJjb2xvcj0iIzAwMDAwMCIKICAgYm9yZGVyb3BhY2l0eT0iMC4yNSIKICAgaW5rc2NhcGU6c2hvd3BhZ2VzaGFkb3c9IjIiCiAgIGlua3NjYXBlOnBhZ2VvcGFjaXR5PSIwLjAiCiAgIGlua3NjYXBlOnBhZ2VjaGVja2VyYm9hcmQ9IjAiCiAgIGlua3NjYXBlOmRlc2tjb2xvcj0iI2QxZDFkMSIKICAgc2hvd2dyaWQ9ImZhbHNlIgogICBpbmtzY2FwZTp6b29tPSIxLjI1IgogICBpbmtzY2FwZTpjeD0iMTQyLjQiCiAgIGlua3NjYXBlOmN5PSIxNTAuOCIKICAgaW5rc2NhcGU6d2luZG93LXdpZHRoPSIxMTg3IgogICBpbmtzY2FwZTp3aW5kb3ctaGVpZ2h0PSI1ODIiCiAgIGlua3NjYXBlOndpbmRvdy14PSIwIgogICBpbmtzY2FwZTp3aW5kb3cteT0iMCIKICAgaW5rc2NhcGU6d2luZG93LW1heGltaXplZD0iMSIKICAgaW5rc2NhcGU6Y3VycmVudC1sYXllcj0ic3ZnNiIgLz4KICA8cmVjdAogICB3aWR0aD0iMzAwIgogICBoZWlnaHQ9IjMwMCIKICAgZmlsbD0iI2ZmZiIKICAgcnk9IjE1MCIKICAgaWQ9InJlY3QyIgogICBzdHlsZT0iZmlsbDojZmYwMDMzO2ZpbGwtb3BhY2l0eToxIiAvPgogIDxwYXRoCiAgIGZpbGw9InJlZCIKICAgZD0iTTE0OS45Mzc1MDU4NyA3OS4yMjI2NzM2NHMtNjMuMjE4ODUuMDAwMDU5LTc5LjA4NTkzOTI2IDQuMTIzMDQ3MDdjLTguNDk1Nzg3MTQgMi4zNzM4MDIwNC0xNS40OTE0MDgyNSA5LjM2OTUwMDE1LTE3Ljg2NTIzNDI5IDE3Ljk5MDIzNzI5LTQuMTIyOTUzMDYgMTUuODY3MTAwMjUtNC4xMjMwNDcwNiA0OC43MjY1NjA3OC00LjEyMzA0NzA2IDQ4LjcyNjU2MDc4cy4wMDAwOTQgMzIuOTg0MjAwNTIgNC4xMjMwNDcwNiA0OC42MDE1NjA3N2MyLjM3MzgyNjA0IDguNjIwNjIwMTQgOS4yNDQ1MDYxNSAxNS40OTEzODAyNSAxNy44NjUyMzQyOSAxNy44NjUyNDAyOSAxNS45OTIwMzAyNSA0LjI0Nzg4MDA3IDc5LjA4NTkzOTI2IDQuMjQ4MDQwMDcgNzkuMDg1OTM5MjYgNC4yNDgwNDAwN3M2My4zNDQxODEwMS0uMDAwMDUgNzkuMjEwOTQxMjctNC4xMjMwNDAwN2M4LjYyMDc5MDE0LTIuMzczODEwMDQgMTUuNDkxMzMwMjUtOS4xMTk2NjAxNSAxNy43NDAyMzAyOC0xNy44NjUyNDAyOSA0LjI0NzkzMDA3LTE1Ljc0MjMyMDI1IDQuMjQ4MDUwMDctNDguNjAxNTYwNzcgNC4yNDgwNTAwNy00OC42MDE1NjA3N3MuMTI0ODQtMzIuOTg0NDYwNTMtNC4yNDgwNTAwNy00OC44NTE1NjA3OGMtMi4yNDg5MDAwMy04LjYyMDczNzE0LTkuMTE5NDQwMTQtMTUuNDkxMzM0MjUtMTcuNzQwMjMwMjgtMTcuNzQwMjM3MjktMTUuODY2NzYwMjYtNC4zNzI4NDcwNy03OS4yMTA5NDEyNy00LjM3MzA0NzA3LTc5LjIxMDk0MTI3LTQuMzczMDQ3MDd6bS0yMC4xMTUyMzAzMiA0MC40ODA0NjQ2NSA1Mi41OTk2MTA4NCAzMC4zNTkzODA0OS01Mi41OTk2MTA4NCAzMC4yMzQzODA0OHYtNjAuNTkzNzYwOTd6IgogICBpZD0icGF0aDQiCiAgIHN0eWxlPSJmaWxsOiNmZmZmZmY7ZmlsbC1vcGFjaXR5OjEiIC8+Cjwvc3ZnPg==\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"pure-u-2-3\">\n\t\t\t\t\t<h4 id=\"status_youtube\"><%:YouTube Conn.%><br /><span id=\"_youtube_status\" class=\"red\"><%:Touch Check%></span></h4>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t  </div>\n\t<script>\n\t\t//<![CDATA[\n\t\tvar imgs = document.getElementsByTagName('img');\n\t\tfor (var i = 0 ; i < imgs.length; i++) {\n\t\t\tdocument.getElementsByTagName('img')[i].setAttribute(\"oncontextmenu\",\"return false;\");\n\t\t\tdocument.getElementsByTagName('img')[i].setAttribute(\"ondragstart\",\"return false;\");\n\t\t}\n\t\tXHR.poll(5, '<%=api.url(\"index_status\")%>', null,\n\t\t\tfunction (x, data) {\n\t\t\t\tvar status_dns = document.getElementById('status_dns');\n\t\t\t\tvar status_haproxy = document.getElementById('status_haproxy');\n\t\t\t\tif (data) {\n\t\t\t\t\tif (true) {\n\t\t\t\t\t\tvar status_tcp_node = document.getElementById('status_tcp_node');\n\t\t\t\t\t\tif (status_tcp_node) {\n\t\t\t\t\t\t\tvar text = 'TCP<br />';\n\t\t\t\t\t\t\tif (data[\"tcp_node_status\"])\n\t\t\t\t\t\t\t\ttext += '<span class=\"green\"><%:RUNNING%></span>';\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\ttext += '<span class=\"red\"><%:NOT RUNNING%></span>';\n\t\t\t\t\t\t\tstatus_tcp_node.innerHTML = text;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (true) {\n\t\t\t\t\t\tvar status_udp_node = document.getElementById('status_udp_node');\n\t\t\t\t\t\tif (status_udp_node) {\n\t\t\t\t\t\t\tvar text = 'UDP<br />';\n\t\t\t\t\t\t\tif (data[\"udp_node_status\"])\n\t\t\t\t\t\t\t\ttext += '<span class=\"green\"><%:RUNNING%></span>';\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\ttext += '<span class=\"red\"><%:NOT RUNNING%></span>';\n\t\t\t\t\t\t\tstatus_udp_node.innerHTML = text;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (data.dns_mode_status) {\n\t\t\t\t\t\tstatus_dns.innerHTML = 'DNS<br /><span class=\"green\"><%:RUNNING%></span>';\n\t\t\t\t\t} else {\n\t\t\t\t\t\tstatus_dns.innerHTML = 'DNS<br /><span class=\"red\"><%:NOT RUNNING%></span>';\n\t\t\t\t\t}\n\t\t\t\t\tif (status_haproxy) {\n\t\t\t\t\t\tif (data.haproxy_status === \"-1\") {\n\t\t\t\t\t\t\tstatus_haproxy.innerHTML = 'HAPROXY<br /><span class=\"red\"><%:UNINSTALLED%></span>';\n\t\t\t\t\t\t} else if (data.haproxy_status === \"0\") {\n\t\t\t\t\t\t\tstatus_haproxy.innerHTML = 'HAPROXY<br /><span class=\"green\"><%:RUNNING%></span>';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tstatus_haproxy.innerHTML = 'HAPROXY<br /><span class=\"red\"><%:NOT RUNNING%></span>';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\n\t\tfunction check_connect(type, url) {\n\t\t\tvar s = document.getElementById('_' + type + '_status');\n\t\t\tif (s) {\n\t\t\t\tvar div = s.parentNode.parentNode.parentNode.parentNode;\n\t\t\t\tdiv.removeAttribute('onclick');\n\t\t\t\ts.innerHTML = '<%:Check...%>';\n\t\t\t\tvar sendDate = (new Date()).getTime();\n\t\t\t\tXHR.get('<%=api.url(\"connect_status\")%>', {\n\t\t\t\t\t\ttype: type,\n\t\t\t\t\t\turl : url\n\t\t\t\t\t},\n\t\t\t\t\tfunction(x, rv) {\n\t\t\t\t\t\tif (rv.ping_type && rv.ping_type == \"curl\") {\n\t\t\t\t\t\t\tvar use_time = rv.use_time;\n\t\t\t\t\t\t\tif (use_time < 1000) {\n\t\t\t\t\t\t\t\ts.className=\"green\";\n\t\t\t\t\t\t\t} else if (use_time < 2000) {\n\t\t\t\t\t\t\t\ts.className=\"yellow\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ts.className=\"red\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ts.innerHTML = use_time + \" ms\";\n\t\t\t\t\t\t} else if (rv.status) {\n\t\t\t\t\t\t\ts.className=\"green\";\n\t\t\t\t\t\t\ts.innerHTML = \"<%:Working...%>\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\ts.className=\"red\";\n\t\t\t\t\t\t\ts.innerHTML = '<%:Problem detected!%>';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdiv.setAttribute('onclick','check_connect(\"' + type + '\",\"' + url + '\")');\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n//]]>\n\t</script>\n</fieldset>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/haproxy/js.htm",
    "content": "<%\nlocal api = require \"luci.passwall.api\"\nlocal appname = api.appname\n-%>\n<script src=\"<%=resource%>/view/<%=appname%>/Sortable.min.js?v=1.15.7\"></script>\n\n<style>\ntable .cbi-button-up,\ntable .cbi-button-down,\n.td.cbi-section-actions .cbi-button-up,\n.td.cbi-section-actions .cbi-button-down {\n\tdisplay: none !important;\n}\n\n.drag-handle {\n\tvertical-align: middle;\n\tcursor: grab !important;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tfont-size: 20px;\n\tfont-weight: 100;\n\tpadding: 0 !important;\n\tline-height: inherit;\n\tuser-select: none;\n\talign-self: stretch;\n\tbackground-color: transparent;\n}\n\n.drag-handle:hover {\n\tbackground: transparent;\n}\n\n.dragging-row {\n\tbackground-color: rgba(131, 191, 255, 0.7) !important;\n\tbox-shadow: 0 4px 6px rgba(0,0,0,0.1);\n}\n\n@media screen and (max-width: 1152px) {\n\t#cbi-<%=appname%>-haproxy_config .cbi-section-table-titles {\n\t\tdisplay: none !important;\n\t}\n}\n\n@media screen and (min-width: 1152px) {\n\t#cbi-<%=appname%>-haproxy_config input[id*=\".<%=appname%>.\"][id$=\".haproxy_port\"],\n\t#cbi-<%=appname%>-haproxy_config input[id*=\".<%=appname%>.\"][id$=\".lbweight\"] {\n\t\twidth: 100px !important;\n\t\tmin-width: unset !important;\n\t\tmax-width: unset !important;\n\t\ttext-align: center !important;\n\t}\n\n\t#cbi-<%=appname%>-haproxy_config select[id*=\".<%=appname%>.\"][id$=\".export\"] {\n\t\twidth: 130px !important;\n\t\tmin-width: unset !important;\n\t\tmax-width: unset !important;\n\t}\n\n\t#cbi-<%=appname%>-haproxy_config select[id*=\".<%=appname%>.\"][id$=\".backup\"] {\n\t\twidth: 100px !important;\n\t\tmin-width: unset !important;\n\t\tmax-width: unset !important;\n\t}\n}\n</style>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t\tlet monitorStartTime = Date.now();\n\n\t\tconst monitorInterval = setInterval(function () {\n\t\t\tif (Date.now() - monitorStartTime > 3000) {\n\t\t\t\tclearInterval(monitorInterval);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst rows = Array.from(document.querySelectorAll(\"tr.cbi-section-table-row\"))\n\t\t\t\t.filter(row => !row.classList.contains(\"placeholder\")); // 排除无配置行\n\n\t\t\tif (rows.length <= 1) return;\n\n\t\t\tconst lastRow = rows[rows.length - 1];\n\t\t\tconst secondLastRow = rows[rows.length - 2];\n\n\t\t\tconst lastInput = lastRow.querySelector(\"input[name$='.haproxy_port']\");\n\t\t\tconst secondLastInput = secondLastRow.querySelector(\"input[name$='.haproxy_port']\");\n\n\t\t\tif (!lastInput || !secondLastInput) return;\n\n\t\t\t// 如果还没绑定 change 事件，绑定一次\n\t\t\tif (!lastInput.dataset.bindChange) {\n\t\t\t\tlastInput.dataset.bindChange = \"1\";\n\t\t\t\tlastInput.addEventListener(\"input\", () => {\n\t\t\t\t\tlastInput.dataset.userModified = \"1\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// 如果用户手动修改过，就不再自动设置\n\t\t\tif (lastInput.dataset.userModified === \"1\") return;\n\n\t\t\tconst lastVal = lastInput.value.trim();\n\t\t\tconst secondLastVal = secondLastInput.value.trim();\n\n\t\t\tconst lbssHiddenInput = lastRow.querySelector(\"div.cbi-dropdown > div > input[type='hidden'][name$='.lbss']\");\n\t\t\tif (!lbssHiddenInput) {\n\t\t\t\tif (lastVal !== secondLastVal && secondLastVal !== \"\" && secondLastVal !== \"0\") {\n\t\t\t\t\tlastInput.value = secondLastVal;\n\t\t\t\t}\n\t\t\t}\n\t\t}, 300);\n\t});\n\n\t//节点列表添加拖拽排序\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t\tfunction initSortableForTable() {\n\t\t\tvar section = document.getElementById(\"cbi-<%=appname%>-haproxy_config\");\n\t\t\tif (!section) return;\n\n\t\t\thideSortColumn(section);\n\n\t\t\t// === 插入 drag handle ===\n\t\t\tvar rows = section.querySelectorAll(\"tr\");\n\t\t\trows.forEach(function(row) {\n\t\t\t\tvar btn = row.querySelector(\".cbi-button-remove:last-of-type\");\n\t\t\t\tif (!btn) return;\n\t\t\t\tif (btn.nextElementSibling && btn.nextElementSibling.classList.contains(\"drag-handle\")) return;\n\t\t\t\tvar handle = document.createElement(\"span\");\n\t\t\t\thandle.className = \"drag-handle center\";\n\t\t\t\thandle.title = \"<%:Drag to reorder%>\";\n\t\t\t\thandle.innerHTML = \"⠿\";\n\t\t\t\tbtn.after(handle);\n\t\t\t});\n\n\t\t\t// === 初始化 Sortable ===\n\t\t\tvar table = section.getElementsByTagName(\"table\")[0];\n\t\t\tif (!table) return;\n\t\t\tvar root = table.tBodies[0] || table;\n\t\t\tif (root._sortable_initialized) return root._sortable_instance;\n\t\t\troot._sortable_initialized = true;\n\n\t\t\t// 保存原始顺序\n\t\t\troot._origOrder = getCurrentOrder(root);\n\n\t\t\ttry {\n\t\t\t\troot._sortable_instance = Sortable.create(root, {\n\t\t\t\t\thandle: \".drag-handle\",\n\t\t\t\t\tdraggable: \"tr.cbi-section-table-row\",\n\t\t\t\t\tanimation: 150,\n\t\t\t\t\tghostClass: \"dragging-row\",\n\t\t\t\t\tfallbackOnBody: true,\n\t\t\t\t\tforceFallback: false,\n\t\t\t\t\tswapThreshold: 0.65,\n\t\t\t\t\tonEnd: function (evt) {\n\t\t\t\t\t\tupdateHiddenInput(root, section);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn root._sortable_instance;\n\t\t\t} catch (e) {\n\t\t\t\troot._sortable_initialized = false;\n\t\t\t\tconsole.error(\"Sortable init failed:\", e);\n\t\t\t}\n\t\t}\n\n\t\t// 获取 table 当前行顺序\n\t\tfunction getCurrentOrder(root) {\n\t\t\tvar order = [];\n\t\t\tvar rows = root.querySelectorAll(\"tr.cbi-section-table-row\");\n\t\t\trows.forEach(function (tr) {\n\t\t\t\tvar id = tr.id || \"\";\n\t\t\t\tif (id.startsWith(\"cbi-<%=appname%>-\"))\n\t\t\t\t\tid = id.replace(\"cbi-<%=appname%>-\", \"\");\n\t\t\t\torder.push(id);\n\t\t\t});\n\t\t\treturn order;\n\t\t}\n\n\t\t// 拖拽完成后更新 hidden input\n\t\tfunction updateHiddenInput(root, section) {\n\t\t\tvar newOrder = getCurrentOrder(root);\n\t\t\tvar changed = newOrder.join(\" \") !== root._origOrder.join(\" \");\n\t\t\tvar hiddenInput = section.querySelector('input[type=\"hidden\"][id^=\"cbi.sts.\"]');\n\t\t\tif (hiddenInput) {\n\t\t\t\thiddenInput.value = changed ? newOrder.join(\" \") : \"\";\n\t\t\t}\n\t\t}\n\n\t\t// 隐藏18.06 up/down 列\n\t\tfunction hideSortColumn(section) {\n\t\t\tvar table = section.querySelector(\"table\");\n\t\t\tif (!table) return;\n\t\t\tvar ths = Array.prototype.slice.call(table.querySelectorAll(\"tr.cbi-section-table-titles > th\"));\n\t\t\tvar dataRows = table.querySelectorAll(\"tr.cbi-section-table-row\");\n\t\t\tif (!ths.length || !dataRows.length) return;\n\t\t\tvar sortCol = -1;\n\t\t\tfor (var i = 0; i < ths.length; i++) {\n\t\t\t\tvar hasSort = false, invalid = false;\n\t\t\t\tdataRows.forEach(function(tr) {\n\t\t\t\t\tvar td = tr.querySelectorAll(\":scope > td\")[i];\n\t\t\t\t\tif (!td) return;\n\t\t\t\t\tif (td.querySelector(\".cbi-button-edit, .cbi-button-remove\")) invalid = true;\n\t\t\t\t\tif (td.querySelector(\".cbi-button-up, .cbi-button-down\")) hasSort = true;\n\t\t\t\t});\n\t\t\t\tif (!invalid && hasSort) { sortCol = i; break; }\n\t\t\t}\n\t\t\tif (sortCol === -1) return;\n\t\t\tvar rows = [table.querySelector(\"tr.cbi-section-table-titles\")].concat(\n\t\t\t\tArray.prototype.slice.call(dataRows),\n\t\t\t\tArray.prototype.slice.call(table.querySelectorAll(\"tr.cbi-section-table-descr\"))\n\t\t\t);\n\t\t\trows.forEach(function(tr) {\n\t\t\t\tvar cells = Array.prototype.filter.call(tr.children, function(el) {\n\t\t\t\t\treturn el.tagName === \"TH\" || el.tagName === \"TD\";\n\t\t\t\t});\n\t\t\t\tif (cells[sortCol]) cells[sortCol].style.display = \"none\";\n\t\t\t});\n\t\t}\n\n\t\t// === 等待 TypedSection 行稳定 ===\n\t\t(function waitStable() {\n\t\t\tvar last = 0, stable = 0;\n\t\t\tvar THRESHOLD = 5;\n\t\t\tfunction tick() {\n\t\t\t\tvar count = document.querySelectorAll(\"tr.cbi-section-table-row\").length;\n\t\t\t\tif (count && count === last) stable++;\n\t\t\t\telse stable = 0;\n\n\t\t\t\tlast = count;\n\t\t\t\tif (stable >= THRESHOLD)\n\t\t\t\t\tsetTimeout(initSortableForTable, 200);\n\t\t\t\telse\n\t\t\t\t\trequestAnimationFrame(tick);\n\t\t\t}\n\t\t\ttick();\n\t\t})();\n\t});\n\t//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/haproxy/status.htm",
    "content": "<%\nlocal api = require \"luci.passwall.api\"\nlocal haproxy_enable = api.uci_get_type(\"global_haproxy\", \"balancing_enable\", \"0\")\nlocal console_port = api.uci_get_type(\"global_haproxy\", \"console_port\", \"\")\n-%>\n<p id=\"_status\"></p>\n\n<script type=\"text/javascript\">//<![CDATA[\n\tconst haproxy_enable = \"<%=haproxy_enable%>\";\n\tif (haproxy_enable == \"1\") {\n\t\tfunction openwebui(){\n\t\t\tvar url = window.location.hostname + \":<%=console_port%>\";\n\t\t\twindow.open('http://' + url, 'target', '');\n\t\t}\n\t\tXHR.poll(5, '<%=api.url(\"haproxy_status\")%>', null,\n\t\t\tfunction(x, result) {\n\t\t\t\tif (x && x.status == 200) {\n\t\t\t\t\tvar _status = document.getElementById('_status');\n\t\t\t\t\tif (_status) {\n\t\t\t\t\t\tif (result.status) {\n\t\t\t\t\t\t\t_status.innerHTML = '<input type=\"button\" class=\"btn cbi-button cbi-button-apply\" value=\"<%:Enter interface%>\" onclick=\"openwebui()\" />';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t_status.innerHTML = '';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n//]]></script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/include/shunt_options.htm",
    "content": "<style>\n.hidden {\n\tdisplay: none !important;\n\tvisibility: hidden !important;\n}\n</style>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tconst normal_list = JSON.parse('<%=self.normal_list%>');\n\tfunction check_fakedns(id, val) {\n\t\tconst dom_id = \"cbid.table.\" + id + \".\";\n\t\tconst fakedns_dom = document.getElementById(dom_id + \"_fakedns\");\n\t\tif (!val) {\n\t\t\tconst selectNode = document.getElementById(dom_id + \"_node\");\n\t\t\tval = selectNode.value;\n\t\t}\n\t\tif (val == \"\" || val == \"_direct\") {\n\t\t\tfakedns_dom.value = 0;\n\t\t\tfakedns_dom.checked = false;\n\t\t\tfakedns_dom.classList.add('hidden');\n\t\t} else {\n\t\t\tfakedns_dom.classList.remove('hidden');\n\t\t}\n\t}\n\tfunction check_proxy_tag(id, val) {\n\t\tconst dom_id = \"cbid.table.\" + id + \".\";\n\t\tconst cbid = dom_id + \"_proxy_tag\";\n\t\tconst proxy_tag_dom = document.getElementById(cbid + \".main\");\n\t\tif (!val) {\n\t\t\tconst selectNode = document.getElementById(dom_id + \"_node\");\n\t\t\tval = selectNode.value;\n\t\t}\n\t\tif (val == \"\" || val.startsWith(\"_\") || val.startsWith(\"Socks_\") || !normal_list.find(element => element.id == val)) {\n\t\t\tconst hiddenSelect = document.getElementById(cbid);\n\t\t\tconst panel = document.getElementById(cbid + \".panel\");\n\t\t\tconst display = document.getElementById(cbid + \".display\");\n\t\t\tconst labelSpan = document.getElementById(cbid + \".label\");\n\t\t\tconst searchInput = document.getElementById(cbid + \".search\");\n\t\t\tconst listContainer = document.getElementById(cbid + \".list\");\n\t\t\tlv_change(cbid, listContainer, hiddenSelect, labelSpan, searchInput, \"\", \"<%:Close (Not use)%>\");\n\t\t\tproxy_tag_dom.classList.add('hidden');\n\t\t} else {\n\t\t\tproxy_tag_dom.classList.remove('hidden');\n\t\t}\n\t}\n\tfunction refresh_depends() {\n\t\tconst table_dom = document.getElementById(\"cbi-passwall-shunt_option_list\");\n\t\tif (table_dom) {\n\t\t\tconst trs = table_dom.getElementsByTagName(\"tr\");\n\t\t\tfor (let i = 1; i < trs.length;i++) {\n\t\t\t\tcheck_fakedns(i);\n\t\t\t\tcheck_proxy_tag(i);\n\t\t\t}\n\t\t}\n\t}\n\tdocument.addEventListener(\"DOMContentLoaded\", () => setTimeout(() => {\n\t\trefresh_depends();\n\t\tconst table_dom = document.getElementById(\"cbi-passwall-shunt_option_list\");\n\t\tif (table_dom) {\n\t\t\tconst trs = table_dom.getElementsByTagName(\"tr\");\n\t\t\tfor (let i = 1; i < trs.length;i++) {\n\t\t\t\tconst selectNode = document.getElementById(\"cbid.table.\" + i + \"._node.main\");\n\t\t\t\tselectNode.addEventListener(\"change\", function(el){\n\t\t\t\t\tlet new_val = el.target.value\n\t\t\t\t\tcheck_fakedns(i, new_val);\n\t\t\t\t\tcheck_proxy_tag(i, new_val);\n\t\t\t\t});\n\t\t\t\tif (i == trs.length - 1) {\n\t\t\t\t\tconst newArray = window.lv_dropdown_data[\"cbid.table.\" + i + \"._node\"].ungrouped.filter(item => item.key !== \"_default\");\n\t\t\t\t\twindow.lv_dropdown_data[\"cbid.table.\" + i + \"._node\"].ungrouped = newArray\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, 100));\n\t//]]>\n</script>"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/log/log.htm",
    "content": "<%\nlocal api = require \"luci.passwall.api\"\n-%>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tvar log_textarea = null;\n\tvar first_load_done = false;\n\n\tfunction scrollToBottom() {\n\t\tlog_textarea.scrollTop = log_textarea.scrollHeight;\n\t}\n\n\tfunction clearlog(btn) {\n\t\tXHR.get('<%=api.url(\"clear_log\")%>', null,\n\t\t\tfunction(x, data) {\n\t\t\t\tif(x && x.status == 200 && log_textarea) {\n\t\t\t\t\tlog_textarea.innerHTML = \"\";\n\t\t\t\t\tscrollToBottom();\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\tXHR.poll(5, '<%=api.url(\"get_log\")%>', null,\n\t\tfunction(x, data) {\n\t\t\tif(x && x.status == 200) {\n\t\t\t\tif (!log_textarea) log_textarea = document.getElementById('log_textarea');\n\t\t\t\tvar wasBottom = (log_textarea.scrollTop + log_textarea.clientHeight >= log_textarea.scrollHeight - 10);\n\t\t\t\tlog_textarea.innerHTML = x.responseText;\n\t\t\t\tif (!first_load_done) {\n\t\t\t\t\tscrollToBottom();\n\t\t\t\t\tfirst_load_done = true;\n\t\t\t\t}\n\t\t\t\telse if (wasBottom) {\n\t\t\t\t\tscrollToBottom();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t);\n\t//]]>\n</script>\n<fieldset class=\"cbi-section\" id=\"_log_fieldset\">\n\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"clearlog()\" value=\"<%:Clear logs%>\" />\n\t<textarea id=\"log_textarea\" class=\"cbi-input-textarea\" style=\"width: 100%;margin-top: 10px;\" data-update=\"change\" rows=\"40\" wrap=\"off\" readonly=\"readonly\"></textarea>\n</fieldset>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/node_config/footer.htm",
    "content": "<%\nlocal api = self.api\n-%>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t\twaitForElement('select[name*=\"<%=api.appname%>\"][name*=\"type\"]', function(el) {\n\t\t\tlet o_val = el.value;\n\t\t\tel.addEventListener(\"change\", () => {\n\t\t\t\tel.blur();\n\t\t\t\tif (o_val != el.value) {\n\t\t\t\t\tlet save = true;\n\t\t\t\t\tif (save) {\n\t\t\t\t\t\t//document.getElementsByClassName('cbi-button-save')[0].click();\n\t\t\t\t\t\tupdate_node({\n\t\t\t\t\t\t\tremarks: getOption(\"remarks\").value,\n\t\t\t\t\t\t\tgroup: getOption(\"group\").value,\n\t\t\t\t\t\t\ttype: getOption(\"type\").value,\n\t\t\t\t\t\t\t//protocol: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\twaitForElement('select[name*=\"<%=api.appname%>\"][name*=\"protocol\"]', function(el) {\n\t\t\tlet o_val = el.value;\n\t\t\tel.addEventListener(\"change\", () => {\n\t\t\t\tel.blur();\n\t\t\t\tif (el.value.startsWith(\"_\") || (o_val.startsWith(\"_\") && !el.value.startsWith(\"_\"))) {\n\t\t\t\t\tlet name_split = el.name.split(\".\");\n\t\t\t\t\tlet name = name_split[name_split.length - 1];\n\t\t\t\t\tlet save = true;\n\t\t\t\t\tif (save) {\n\t\t\t\t\t\t//document.getElementsByClassName('cbi-button-save')[0].click();\n\t\t\t\t\t\tupdate_node({\n\t\t\t\t\t\t\tremarks: getOption(\"remarks\").value,\n\t\t\t\t\t\t\tgroup: getOption(\"group\").value,\n\t\t\t\t\t\t\tprotocol: getOption(name).value\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\twindow.location.href = node_config_url + \"?select_proto=\" + el.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n\t//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/node_config/header.htm",
    "content": "<%\nlocal api = self.api\n-%>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tlet node_id = \"<%=self.section%>\";\n\tlet node_config_url = '<%=api.url(\"node_config\")%>/' + node_id;\n\n\tfunction waitForElement(selector, callback) {\n\t\tconst el = document.querySelector(selector);\n\t\tif (el) return callback(el);\n\t\tconst observer = new MutationObserver(() => {\n\t\t\tconst el = document.querySelector(selector);\n\t\t\tif (el) {\n\t\t\t\tobserver.disconnect();\n\t\t\t\tcallback(el);\n\t\t\t}\n\t\t});\n\t\tobserver.observe(document.body, { childList: true, subtree: true });\n\t}\n\n\tfunction getOption(opt) {\n\t\tvar obj;\n\t\tvar id = 'cbid.<%=api.appname%>.' + node_id + '.' + opt;\n\t\tobj = document.getElementsByName(id)[0] || document.getElementById(id);\n\t\tif (obj) {\n\t\t\tvar combobox = document.getElementById('cbi.combobox.' + id);\n\t\t\tif (combobox) {\n\t\t\t\tobj.combobox = combobox;\n\t\t\t}\n\t\t\tvar div = document.getElementById(id);\n\t\t\tif (div && div.getElementsByTagName(\"li\").length > 0) {\n\t\t\t\tobj = div;\n\t\t\t}\n\t\t\treturn obj;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tfunction update_node(data) {\n\t\tXHR.get('<%=api.url(\"update_node\")%>', {\n\t\t\tid: node_id,\n\t\t\tdata: JSON.stringify(data)\n\t\t},\n\t\tfunction(x, data) {\n\t\t\tif (x && x.status == 200 && data.code == 1) {\n\t\t\t\twindow.location.href = node_config_url;\n\t\t\t}\n\t\t\telse {\n\t\t\t\talert(\"<%:Error%>\");\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction fetchCertSha256(el) {\n\t\tif (el.getAttribute(\"data-loading\") === \"1\") return;\n\t\tel.setAttribute(\"data-loading\", \"1\");\n\t\tel.style.pointerEvents = \"none\";\n\t\tel.style.color = \"red\";\n\t\tXHR.get('<%=api.url(\"fetch_certsha256\")%>', { id: node_id }, function(x, res) {\n\t\t\tel.setAttribute(\"data-loading\", \"0\");\n\t\t\tel.style.pointerEvents = \"\";\n\t\t\tel.style.color = \"\";\n\t\t\tif (!x || x.status !== 200) {\n\t\t\t\talert(\"<%:Error%>\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (!res || res.code !== 1 || !res.data) {\n\t\t\t\talert(res && res.msg ? res.msg : \"<%:Fetch Failed%> !\");\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst inputs = document.querySelectorAll('input[id$=\".xray_tls_pinSHA256\"]');\n\t\t\tinputs.forEach(function(input) {\n\t\t\t\tinput.value = res.data;\n\t\t\t});\n\t\t});\n\t}\n\t//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/node_config/link_share_man.htm",
    "content": "<%+cbi/valueheader%>\n<%\nlocal api = require \"luci.passwall.api\"\nlocal appname = api.appname\nlocal map = self.map\n\nlocal has_ss = api.is_finded(\"ss-redir\")\nlocal has_ss_rust = api.is_finded(\"sslocal\")\nlocal has_singbox = api.finded_com(\"sing-box\")\nlocal has_xray = api.finded_com(\"xray\")\nlocal has_hysteria2 = api.finded_com(\"hysteria\")\n\nlocal ss_type = api.get_core(\"ss_type\", {{has_ss,\"shadowsocks-libev\"},{has_ss_rust,\"shadowsocks-rust\"},{has_singbox,\"sing-box\"},{has_xray,\"xray\"}})\nlocal trojan_type = api.get_core(\"trojan_type\", {{has_singbox,\"sing-box\"},{has_xray,\"xray\"}})\nlocal vmess_type = api.get_core(\"vmess_type\", {{has_xray,\"xray\"},{has_singbox,\"sing-box\"}})\nlocal vless_type = api.get_core(\"vless_type\", {{has_xray,\"xray\"},{has_singbox,\"sing-box\"}})\nlocal hysteria2_type = api.get_core(\"hysteria2_type\", {{has_hysteria2,\"hysteria2\"},{has_singbox,\"sing-box\"}, {has_xray,\"xray\"}})\n\nlocal current_node = map:get(section)\n-%>\n<script src=\"<%=resource%>/view/<%=appname%>/qrcode.min.js\"></script>\n<script type=\"text/javascript\">//<![CDATA[\n\tlet has_singbox = \"<%=has_singbox%>\"\n\tlet has_xray = \"<%=has_xray%>\"\n\tlet has_hysteria2 = \"<%=has_hysteria2%>\"\n\tlet ss_type = \"<%=ss_type%>\"\n\tlet trojan_type = \"<%=trojan_type%>\"\n\tlet vmess_type = \"<%=vmess_type%>\"\n\tlet vless_type = \"<%=vless_type%>\"\n\tlet hysteria2_type = \"<%=hysteria2_type%>\"\n\n\tfunction padright(str, cnt, pad) {\n\t\treturn str + Array(cnt + 1).join(pad);\n\t}\n\n\tfunction b64EncodeUnicode(str) {\n\t\treturn btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {\n\t\t\treturn String.fromCharCode('0x' + p1);\n\t\t}));\n\t}\n\n\tfunction b64encutf8safe(str) {\n\t\treturn b64EncodeUnicode(str).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, '');\n\t}\n\n\tfunction b64DecodeUnicode(str) {\n\t\treturn decodeURIComponent(Array.prototype.map.call(atob(str), function (c) {\n\t\t\treturn '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n\t\t}).join(''));\n\t}\n\n\tfunction b64decutf8safe(str) {\n\t\tvar l;\n\t\tstr = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\t\tl = str.length;\n\t\tl = (4 - l % 4) % 4;\n\t\tif (l)\n\t\t\tstr = padright(str, l, \"=\");\n\t\treturn b64DecodeUnicode(str);\n\t}\n\n\tfunction b64encsafe(str) {\n\t\treturn btoa(str).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, '')\n\t}\n\n\tfunction b64decsafe(str) {\n\t\tconst orig = str;\n\t\ttry {\n\t\t\tstr = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\t\t\tconst pad = (4 - str.length % 4) % 4;\n\t\t\tif (pad) str += \"=\".repeat(pad);\n\t\t\treturn atob(str);\n\t\t} catch (e) {\n\t\t\treturn orig;\n\t\t}\n\t}\n\n\tfunction dictvalue(d, key) {\n\t\tvar v = d[key];\n\t\tif (typeof (v) === 'undefined' || v === '')\n\t\t\treturn '';\n\t\treturn b64decsafe(v);\n\t}\n\n\tfunction parseNodeUrl(url) {\n\t\tlet protocol = url.substring(0, url.indexOf(\"://\")) + \":\"\n\t\tlet str = \"http\" + url.substring(url.indexOf(\"://\"))\n\t\tconst parsedUrl = new URL(str);\n\t\tvar r = {\n\t\t\thash: parsedUrl.hash, // #asd\n\t\t\thost: parsedUrl.host, // localhost:257\n\t\t\thostname: parsedUrl.hostname, // localhost\n\t\t\tport: parsedUrl.port, // 257\n\t\t\tsearch: parsedUrl.search, // ?asd=asd\n\t\t\tpasswd: parsedUrl.username || parsedUrl.password // username\n\t\t};\n\t\treturn r;\n\t}\n\t\n\tfunction genQrcode(btn, urlname, sid) {\n\t\tvar qrcode_div = document.getElementById(\"qrcode_div\");\n\t\tqrcode_div.style.display = null;\n\t\tdocument.getElementById(\"qrcode\").innerHTML = \"\";\n\t\tvar url = buildUrl(btn, urlname, sid);\n\t\tif (url) {\n\t\t\tvar qrcode = new QRCode(document.getElementById(\"qrcode\"), {\n\t\t\t\twidth: 150,\n\t\t\t\theight: 150\n\t\t\t});\n\t\t\tqrcode.makeCode(url);\n\t\t}\n\t}\n\n\tfunction buildUrl(btn, urlname, sid) {\n\t\tvar opt = {\n\t\t\tbase: \"cbid.<%=appname%>\",\n\t\t\tclient: true,\n\t\t\tget: function (opt) {\n\t\t\t\tvar id = this.base + \".\" + opt;\n\t\t\t\tvar obj = document.getElementsByName(id)[0] || document.getElementsByClassName(id)[0] || document.getElementById(id)\n\t\t\t\tif (obj) {\n\t\t\t\t\treturn obj;\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t},\n\t\t\tgetlist: function (opt) {\n\t\t\t\tvar id = this.base + \".\" + opt;\n\t\t\t\tvar objs = document.getElementsByName(id) || document.getElementsByClassName(id);\n\t\t\t\tvar ret = [];\n\t\t\t\tif (objs) {\n\t\t\t\t\tfor (var i = 0; i < objs.length; i++) {\n\t\t\t\t\t\tret[i] = objs[i].value;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\talert(\"<%:Faltal on get option, please help in debug: %>\" + opt);\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t},\n\t\t\tquery: function (param, src, default_value) {\n\t\t\t\tvar obj = this.get(src);\n\t\t\t\tif (obj) {\n\t\t\t\t\tvar ret = \"&\" + param + \"=\";\n\t\t\t\t\tif (obj.type === \"checkbox\") {\n\t\t\t\t\t\treturn ret + (obj.checked === true ? \"1\" : \"0\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar result = encodeURIComponent(obj.value);\n\t\t\t\t\t\tif (result == null || result.trim() == \"\") {\n\t\t\t\t\t\t\tif (default_value) {\n\t\t\t\t\t\t\t\treturn ret + default_value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn ret + result;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t}\n\t\topt.base = \"cbid.\" + urlname + \".\" + sid;\n\t\topt.client = urlname.indexOf(\"server\") === -1;\n\t\tvar v_type = opt.get(\"type\").value;\n\t\tvar v_alias = opt.get(\"remarks\");\n\n\t\tvar dom_prefix = null\n\t\tvar protocol = \"\"\n\t\tif (v_type === \"SS\") {\n\t\t\tdom_prefix = \"ss_\"\n\t\t\tprotocol = \"ss\"\n\t\t} else if (v_type === \"SS-Rust\") {\n\t\t\tdom_prefix = \"ssrust_\"\n\t\t\tprotocol = \"ss\"\n\t\t} else if (v_type === \"SSR\") {\n\t\t\tdom_prefix = \"ssr_\"\n\t\t\tprotocol = \"ssr\"\n\t\t} else if (v_type === \"Hysteria2\") {\n\t\t\tdom_prefix = \"hysteria2_\"\n\t\t\tprotocol = \"hysteria2\"\n\t\t} else if (v_type === \"Xray\") {\n\t\t\tdom_prefix = \"xray_\"\n\t\t} else if (v_type === \"sing-box\") {\n\t\t\tdom_prefix = \"singbox_\"\n\t\t}\n\t\tvar _address = \"\"\n\t\tif (dom_prefix && dom_prefix != null) {\n\t\t\ttry {\n\t\t\t\tvar v_server = opt.get(dom_prefix + \"address\");\n\t\t\t\tconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\n\t\t\t\tif (ipv6Regex.test(v_server.value)) {\n\t\t\t\t\t_address = \"[\" + v_server.value + \"]\"\n\t\t\t\t} else {\n\t\t\t\t\t_address = v_server.value\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t}\n\t\t}\n\t\tvar url = null;\n\t\tif (v_type === \"SS\" || v_type === \"SS-Rust\" || ((v_type === \"sing-box\" || v_type === \"Xray\") && opt.get(dom_prefix + \"protocol\").value === \"shadowsocks\")) {\n\t\t\tprotocol = \"ss\"\n\t\t\tvar v_port = opt.get(dom_prefix + \"port\");\n\t\t\tvar v_method = opt.get(dom_prefix + \"method\") || opt.get(dom_prefix + \"ss_method\");\n\t\t\tvar v_password = opt.get(dom_prefix + \"password\");\n\n\t\t\turl = b64encsafe(v_method.value + \":\" + v_password.value) + \"@\" +\n\t\t\t\t_address + \":\" +\n\t\t\t\tv_port.value + \"/?\";\n\t\t\t\n\t\t\tvar shadow_tls;\n\t\t\t//生成SS Shadow-TLS 插件参数\n\t\t\tconst generateShadowTLSBase64 = function(paramStr) {\n\t\t\t\ttry {\n\t\t\t\t\tlet obj = {};\n\t\t\t\t\tlet list = paramStr.split(\";\");\n\t\t\t\t\tfor (let i = 0; i < list.length; i++) {\n\t\t\t\t\t\tlet kv = list[i].split(\"=\");\n\t\t\t\t\t\tif (kv.length === 2) {\n\t\t\t\t\t\t\tlet k = kv[0].trim(), v = kv[1].trim();\n\t\t\t\t\t\t\tlet m = k.match(/^v(\\d+)$/);\n\t\t\t\t\t\t\tif (m && v === \"1\") obj.version = m[1];\n\t\t\t\t\t\t\telse if (k === \"passwd\") obj.password = v;\n\t\t\t\t\t\t\telse obj[k] = v;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn b64encsafe(JSON.stringify(obj));\n\t\t\t\t} catch (e) {\n\t\t\t\t\treturn \"\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar params = \"\";\n\n\t\t\topt.get(dom_prefix + \"tcp_fast_open\")?.checked && (params += \"&tfo=1\");\n\n\t\t\tvar v_plugin_dom = opt.get(dom_prefix + \"plugin\");\n\t\t\tif (v_plugin_dom) {\n\t\t\t\tvar v_plugin = v_plugin_dom.value;\n\t\t\t\tif (v_plugin && v_plugin != \"none\") {\n\t\t\t\t\tif (v_plugin == \"simple-obfs\" || v_plugin == \"obfs-local\") {\n\t\t\t\t\t\tv_plugin = \"obfs-local\";\n\t\t\t\t\t}\n\t\t\t\t\tvar v_plugin_opts = opt.get(dom_prefix + \"plugin_opts\").value;\n\t\t\t\t\tif (v_plugin_opts && v_plugin_opts != \"\") {\n\t\t\t\t\t\tv_plugin += \";\" + v_plugin_opts;\n\t\t\t\t\t}\n\t\t\t\t\tparams += \"&plugin=\" + encodeURIComponent(v_plugin);\n\n\t\t\t\t\tif (v_plugin_dom.value == \"shadow-tls\" && v_plugin_opts && v_plugin_opts != \"\") {\n\t\t\t\t\t\tparams = \"shadow-tls=\" + generateShadowTLSBase64(v_plugin_opts);\n\t\t\t\t\t\tshadow_tls = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (v_type === \"sing-box\" || v_type === \"Xray\") {\n\t\t\t\tvar v_transport = opt.get(dom_prefix + \"transport\").value;\n\t\t\t\tif (v_transport === \"ws\") {\n\t\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"ws_host\");\n\t\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"ws_path\");\n\t\t\t\t\tif (v_type == \"sing-box\" && opt.get(dom_prefix + \"ws_enableEarlyData\").checked) {\n\t\t\t\t\t\tvar ws_maxEarlyData = opt.get(dom_prefix + \"ws_maxEarlyData\").value;\n\t\t\t\t\t\tparams += \"?ed=\" + ws_maxEarlyData;\n\t\t\t\t\t}\n\t\t\t\t} else if (v_transport === \"http\") {\n\t\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"http_host\");\n\t\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"http_path\");\n\t\t\t\t} else if (v_transport === \"raw\" || v_transport === \"tcp\") {\n\t\t\t\t\tv_transport = \"tcp\";\n\t\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"tcp_guise\");\n\t\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"tcp_guise_http_host\");\n\t\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"tcp_guise_http_path\");\n\t\t\t\t} else if (v_transport === \"mkcp\") {\n\t\t\t\t\tv_transport = \"kcp\";\n\t\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"mkcp_guise\");\n\t\t\t\t\tparams += opt.query(\"seed\", dom_prefix + \"mkcp_seed\");\n\t\t\t\t} else if (v_transport === \"quic\") {\n\t\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"quic_guise\");\n\t\t\t\t\tparams += opt.query(\"key\", dom_prefix + \"quic_key\");\n\t\t\t\t\tparams += opt.query(\"quicSecurity\", dom_prefix + \"quic_security\");\n\t\t\t\t} else if (v_transport === \"grpc\") {\n\t\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"grpc_serviceName\");\n\t\t\t\t\tparams += opt.query(\"serviceName\", dom_prefix + \"grpc_serviceName\");\n\t\t\t\t\tparams += opt.query(\"mode\", dom_prefix + \"grpc_mode\");\n\t\t\t\t} else if (v_transport === \"xhttp\") {\n\t\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"xhttp_host\");\n\t\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"xhttp_path\");\n\t\t\t\t\tparams += opt.query(\"mode\", dom_prefix + \"xhttp_mode\");\n\t\t\t\t\tif (opt.get(dom_prefix + \"use_xhttp_extra\").checked) {\n\t\t\t\t\t\tparams += opt.query(\"extra\", dom_prefix + \"xhttp_extra\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tparams += \"&type=\" + v_transport;\n\n\t\t\t\tif (opt.get(dom_prefix + \"tls\").checked) {\n\t\t\t\t\tvar v_security = \"tls\";\n\t\t\t\t\tif (opt.get(dom_prefix + \"fingerprint\") && opt.get(dom_prefix + \"fingerprint\").value != \"\") {\n\t\t\t\t\t\tlet v_fp = opt.get(dom_prefix + \"fingerprint\").value;\n\t\t\t\t\t\tparams += \"&fp=\" + v_fp;\n\t\t\t\t\t}\n\t\t\t\t\tif (opt.get(dom_prefix + \"reality\") && opt.get(dom_prefix + \"reality\").checked) {\n\t\t\t\t\t\tv_security = \"reality\";\n\t\t\t\t\t\tparams += opt.query(\"pbk\", dom_prefix + \"reality_publicKey\");\n\t\t\t\t\t\tparams += opt.query(\"sid\", dom_prefix + \"reality_shortId\");\n\t\t\t\t\t\tparams += opt.query(\"spx\", dom_prefix + \"reality_spiderX\");\n\t\t\t\t\t\tparams += opt.query(\"pqv\", dom_prefix + \"reality_mldsa65Verify\");\n\t\t\t\t\t}\n\t\t\t\t\tparams += \"&security=\" + v_security;\n\t\t\t\t\tparams += opt.query(\"alpn\", dom_prefix + \"alpn\");\n\t\t\t\t\tparams += opt.query(\"sni\", dom_prefix + \"tls_serverName\");\n\t\t\t\t\tparams += opt.query(\"allowinsecure\", dom_prefix + \"tls_allowInsecure\");\n\t\t\t\t\tparams += opt.query(\"pcs\", dom_prefix + \"tls_pinSHA256\");\n\t\t\t\t\tparams += opt.query(\"vcn\", dom_prefix + \"tls_CertByName\");\n\t\t\t\t\tparams += opt.query(\"ech\", dom_prefix + \"ech_config\");\n\t\t\t\t}\n\n\t\t\t\topt.get(dom_prefix + \"uot\")?.checked && (params += \"&udp=1\");\n\t\t\t\tif (opt.get(dom_prefix + \"use_finalmask\")?.checked) {\n\t\t\t\t\tparams += opt.query(\"fm\", dom_prefix + \"finalmask\");\n\t\t\t\t}\n\n\t\t\t\tif (opt.get(dom_prefix + \"shadowtls\")?.checked) {\n\t\t\t\t\tlet st_plugin_str = \"\";\n\t\t\t\t\tlet st_version = opt.get(dom_prefix + \"shadowtls_version\")?.value;\n\t\t\t\t\tif (st_version) st_plugin_str += \"v\" + st_version + \"=1;\";\n\t\t\t\t\tlet st_password = opt.get(dom_prefix + \"shadowtls_password\")?.value;\n\t\t\t\t\tif (st_password) st_plugin_str += \"passwd=\" + st_password +\";\";\n\t\t\t\t\tlet st_host = opt.get(dom_prefix + \"shadowtls_serverName\")?.value;\n\t\t\t\t\tif (st_host) st_plugin_str += \"host=\" + st_host +\";\";\n\t\t\t\t\tif (opt.get(dom_prefix + \"shadowtls_utls\").checked) {\n\t\t\t\t\t\tlet st_fingerprint = opt.get(dom_prefix + \"shadowtls_fingerprint\")?.value;\n\t\t\t\t\t\tif (st_fingerprint) st_plugin_str += \"fingerprint=\" + st_fingerprint;\n\t\t\t\t\t}\n\t\t\t\t\tparams = \"shadow-tls=\" + generateShadowTLSBase64(st_plugin_str);\n\t\t\t\t\tshadow_tls = 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (shadow_tls) {\n\t\t\t\turl = b64encsafe(v_method.value + \":\" + v_password.value + \"@\" +\n\t\t\t\t\t_address + \":\" +\n\t\t\t\t\tv_port.value) + \"?\";\n\t\t\t} else {\n\t\t\t\tparams += \"&group=\"\n\t\t\t}\n\t\t\tparams += \"#\" + encodeURIComponent(v_alias.value);\n\t\t\tif (params[0] == \"&\") {\n\t\t\t\tparams = params.substring(1);\n\t\t\t}\n\t\t\turl += params;\n\t\t} else if (v_type === \"SSR\") {\n\t\t\tvar v_port = opt.get(dom_prefix + \"port\");\n\t\t\tvar v_protocol = opt.get(dom_prefix + \"protocol\");\n\t\t\tvar v_method = opt.get(dom_prefix + \"method\");\n\t\t\tvar v_obfs = opt.get(dom_prefix + \"obfs\");\n\t\t\tvar v_password = opt.get(dom_prefix + \"password\");\n\t\t\tvar v_obfs_param = opt.get(dom_prefix + \"obfs_param\");\n\t\t\tvar v_protocol_param = opt.get(dom_prefix + \"protocol_param\");\n\t\t\tvar ssr_str = _address + \":\" +\n\t\t\t\tv_port.value + \":\" +\n\t\t\t\tv_protocol.value + \":\" +\n\t\t\t\tv_method.value + \":\" +\n\t\t\t\tv_obfs.value + \":\" +\n\t\t\t\tb64encsafe(v_password.value) +\n\t\t\t\t\"/?obfsparam=\" + b64encsafe(v_obfs_param.value) +\n\t\t\t\t\"&protoparam=\" + b64encsafe(v_protocol_param.value) +\n\t\t\t\t\"&remarks=\" + b64encutf8safe(v_alias.value);\n\t\t\turl = b64encsafe(ssr_str);\n\t\t} else if ((v_type === \"sing-box\" || v_type === \"Xray\") && opt.get(dom_prefix + \"protocol\").value === \"vmess\") {\n\t\t\tprotocol = \"vmess\";\n\t\t\tvar info = {};\n\t\t\tinfo.v = \"2\";\n\t\t\tinfo.ps = v_alias.value;\n\t\t\tinfo.add = opt.get(dom_prefix + \"address\").value;\n\t\t\t//info.add = _address;\n\t\t\tinfo.port = opt.get(dom_prefix + \"port\").value;\n\t\t\tinfo.id = opt.get(dom_prefix + \"uuid\").value;\n\n\t\t\tvar v_transport = opt.get(dom_prefix + \"transport\").value;\n\t\t\tif (v_transport === \"ws\") {\n\t\t\t\tinfo.host = opt.get(dom_prefix + \"ws_host\").value;\n\t\t\t\tinfo.path = opt.get(dom_prefix + \"ws_path\").value;\n\t\t\t\tif (v_type == \"sing-box\" && opt.get(dom_prefix + \"ws_enableEarlyData\").checked) {\n\t\t\t\t\tvar ws_maxEarlyData = opt.get(dom_prefix + \"ws_maxEarlyData\").value;\n\t\t\t\t\tinfo.path = info.path + \"?ed=\" + ws_maxEarlyData;\n\t\t\t\t}\n\t\t\t} else if (v_transport === \"http\") {\n\t\t\t\tinfo.host = opt.get(dom_prefix + \"http_host\").value;\n\t\t\t\tinfo.path = opt.get(dom_prefix + \"http_path\").value;\n\t\t\t} else if (v_transport === \"raw\" || v_transport === \"tcp\") {\n\t\t\t\tv_transport = \"tcp\";\n\t\t\t\tinfo.type = opt.get(dom_prefix + \"tcp_guise\").value;\n\t\t\t\tif (info.type === \"http\") {\n\t\t\t\t\tinfo.host = opt.get(dom_prefix + \"tcp_guise_http_host\").value;\n\t\t\t\t\tinfo.path = opt.get(dom_prefix + \"tcp_guise_http_path\").value;\n\t\t\t\t}\n\t\t\t} else if (v_transport === \"mkcp\") {\n\t\t\t\tv_transport = \"kcp\";\n\t\t\t\tinfo.type = opt.get(dom_prefix + \"mkcp_guise\").value;\n\t\t\t\tinfo.seed = opt.get(dom_prefix + \"mkcp_seed\").value;\n\t\t\t} else if (v_transport === \"quic\") {\n\t\t\t\tinfo.type = opt.get(dom_prefix + \"quic_guise\")?.value;\n\t\t\t\tinfo.key = opt.get(dom_prefix + \"quic_key\")?.value;\n\t\t\t\tinfo.securty = opt.get(dom_prefix + \"quic_security\")?.value;\n\t\t\t} else if (v_transport === \"grpc\") {\n\t\t\t\tinfo.path = opt.get(dom_prefix + \"grpc_serviceName\").value;\n\t\t\t}\n\t\t\tinfo.net = v_transport;\n\n\t\t\tinfo.security = opt.get(dom_prefix + \"security\").value || \"auto\";\n\t\t\tinfo.scy = info.security;\n\t\t\tif (opt.get(dom_prefix + \"tls\").checked) {\n\t\t\t\tvar v_security = \"tls\";\n\t\t\t\tinfo.tls = \"tls\";\n\t\t\t\tinfo.sni = opt.get(dom_prefix + \"tls_serverName\").value;\n\t\t\t\tinfo.alpn = opt.get(dom_prefix + \"alpn\")?.value;\n\t\t\t\tif (info.alpn === \"default\") info.alpn = undefined;\n\t\t\t\tinfo.fp = opt.get(dom_prefix + \"fingerprint\")?.value;\n\t\t\t\tinfo.pcs = opt.get(dom_prefix + \"tls_pinSHA256\")?.value;\n\t\t\t\topt.get(dom_prefix + \"tls_allowInsecure\")?.checked && (info.insecure = \"1\");\n\t\t\t}\n\n\t\t\topt.get(dom_prefix + \"tcp_fast_open\")?.checked && (info.tfo = \"1\");\n\t\t\tif (opt.get(dom_prefix + \"use_finalmask\")?.checked) {\n\t\t\t\tinfo.fm = opt.get(dom_prefix + \"finalmask\").value;\n\t\t\t\tif (info.fm) info.fm = encodeURI(info.fm);\n\t\t\t}\n\n\t\t\turl = b64EncodeUnicode(JSON.stringify(info));\n\t\t} else if ((v_type === \"sing-box\" || v_type === \"Xray\") && opt.get(dom_prefix + \"protocol\").value === \"vless\") {\n\t\t\tprotocol = \"vless\";\n\t\t\tvar v_password = opt.get(dom_prefix + \"uuid\");\n\t\t\tvar v_port = opt.get(dom_prefix + \"port\");\n\t\t\turl = encodeURIComponent(v_password.value) +\n\t\t\t\t\"@\" + _address +\n\t\t\t\t\":\" + v_port.value + \"?\";\n\n\t\t\tvar params = \"\";\n\t\t\tvar v_transport = opt.get(dom_prefix + \"transport\").value;\n\t\t\tif (v_transport === \"ws\") {\n\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"ws_host\");\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"ws_path\");\n\t\t\t\tif (v_type == \"sing-box\" && opt.get(dom_prefix + \"ws_enableEarlyData\").checked) {\n\t\t\t\t\tvar ws_maxEarlyData = opt.get(dom_prefix + \"ws_maxEarlyData\").value;\n\t\t\t\t\tparams += encodeURIComponent(\"?ed=\" + ws_maxEarlyData);\n\t\t\t\t}\n\t\t\t} else if (v_transport === \"http\") {\n\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"http_host\");\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"http_path\");\n\t\t\t} else if (v_transport === \"raw\" || v_transport === \"tcp\") {\n\t\t\t\tv_transport = \"tcp\";\n\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"tcp_guise\");\n\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"tcp_guise_http_host\");\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"tcp_guise_http_path\");\n\t\t\t} else if (v_transport === \"mkcp\") {\n\t\t\t\tv_transport = \"kcp\";\n\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"mkcp_guise\");\n\t\t\t\tparams += opt.query(\"seed\", dom_prefix + \"mkcp_seed\");\n\t\t\t} else if (v_transport === \"quic\") {\n\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"quic_guise\");\n\t\t\t\tparams += opt.query(\"key\", dom_prefix + \"quic_key\");\n\t\t\t\tparams += opt.query(\"quicSecurity\", dom_prefix + \"quic_security\");\n\t\t\t} else if (v_transport === \"grpc\") {\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"grpc_serviceName\");\n\t\t\t\tparams += opt.query(\"serviceName\", dom_prefix + \"grpc_serviceName\");\n\t\t\t\tparams += opt.query(\"mode\", dom_prefix + \"grpc_mode\");\n\t\t\t} else if (v_transport === \"xhttp\") {\n\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"xhttp_host\");\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"xhttp_path\");\n\t\t\t\tparams += opt.query(\"mode\", dom_prefix + \"xhttp_mode\");\n\t\t\t\tif (opt.get(dom_prefix + \"use_xhttp_extra\").checked) {\n\t\t\t\t\tparams += opt.query(\"extra\", dom_prefix + \"xhttp_extra\");\n\t\t\t\t}\n\t\t\t} else if (v_transport === \"httpupgrade\") {\n\t\t\t\tv_transport = \"httpupgrade\";\n\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"httpupgrade_host\");\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"httpupgrade_path\");\n\t\t\t}\n\t\t\tparams += \"&type=\" + v_transport;\n\n\t\t\tif (v_type === \"sing-box\") {\n\t\t\t\tparams += \"&encryption=none\";\n\t\t\t} else {\n\t\t\t\tparams += opt.query(\"encryption\", dom_prefix + \"encryption\");\n\t\t\t}\n\n\t\t\tif (opt.get(dom_prefix + \"tls\").checked) {\n\t\t\t\tvar v_security = \"tls\";\n\t\t\t\tif (opt.get(dom_prefix + \"fingerprint\") && opt.get(dom_prefix + \"fingerprint\").value != \"\") {\n\t\t\t\t\tlet v_fp = opt.get(dom_prefix + \"fingerprint\").value;\n\t\t\t\t\tparams += \"&fp=\" + v_fp;\n\t\t\t\t}\n\t\t\t\tif (opt.get(dom_prefix + \"reality\") && opt.get(dom_prefix + \"reality\").checked) {\n\t\t\t\t\tv_security = \"reality\";\n\t\t\t\t\tparams += opt.query(\"pbk\", dom_prefix + \"reality_publicKey\");\n\t\t\t\t\tparams += opt.query(\"sid\", dom_prefix + \"reality_shortId\");\n\t\t\t\t\tparams += opt.query(\"spx\", dom_prefix + \"reality_spiderX\");\n\t\t\t\t\tparams += opt.query(\"pqv\", dom_prefix + \"reality_mldsa65Verify\");\n\t\t\t\t}\n\t\t\t\tif (opt.get(dom_prefix + \"flow\") && opt.get(dom_prefix + \"flow\").value) {\n\t\t\t\t\tlet v_flow = opt.get(dom_prefix + \"flow\").value;\n\t\t\t\t\tparams += \"&flow=\" + v_flow;\n\t\t\t\t}\n\t\t\t\tparams += \"&security=\" + v_security;\n\t\t\t\tparams += opt.query(\"alpn\", dom_prefix + \"alpn\");\n\t\t\t\tparams += opt.query(\"sni\", dom_prefix + \"tls_serverName\");\n\t\t\t\tparams += opt.query(\"allowinsecure\", dom_prefix + \"tls_allowInsecure\");\n\t\t\t\tparams += opt.query(\"pcs\", dom_prefix + \"tls_pinSHA256\");\n\t\t\t\tparams += opt.query(\"vcn\", dom_prefix + \"tls_CertByName\");\n\t\t\t\tparams += opt.query(\"ech\", dom_prefix + \"ech_config\");\n\t\t\t}\n\n\t\t\topt.get(dom_prefix + \"tcp_fast_open\")?.checked && (params += \"&tfo=1\");\n\t\t\tif (opt.get(dom_prefix + \"use_finalmask\")?.checked) {\n\t\t\t\tparams += opt.query(\"fm\", dom_prefix + \"finalmask\");\n\t\t\t}\n\n\t\t\tparams += \"#\" + encodeURI(v_alias.value);\n\t\t\tif (params[0] == \"&\") {\n\t\t\t\tparams = params.substring(1);\n\t\t\t}\n\t\t\turl += params;\n\t\t} else if ((v_type === \"sing-box\" || v_type === \"Xray\") && opt.get(dom_prefix + \"protocol\").value === \"trojan\") {\n\t\t\tprotocol = \"trojan\"\n\t\t\tvar v_password = opt.get(dom_prefix + \"password\");\n\t\t\tvar v_port = opt.get(dom_prefix + \"port\");\n\t\t\turl = encodeURIComponent(v_password.value) +\n\t\t\t\t\"@\" + _address +\n\t\t\t\t\":\" + v_port.value + \"/?\";\n\t\t\tvar params = \"\";\n\t\t\tvar v_transport = opt.get(dom_prefix + \"transport\").value;\n\t\t\tif (v_transport === \"ws\") {\n\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"ws_host\");\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"ws_path\");\n\t\t\t\tif (v_type == \"sing-box\" && opt.get(dom_prefix + \"ws_enableEarlyData\").checked) {\n\t\t\t\t\tvar ws_maxEarlyData = opt.get(dom_prefix + \"ws_maxEarlyData\").value;\n\t\t\t\t\tparams += \"?ed=\" + ws_maxEarlyData;\n\t\t\t\t}\n\t\t\t} else if (v_transport === \"http\") {\n\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"http_host\");\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"http_path\");\n\t\t\t} else if (v_transport === \"raw\" || v_transport === \"tcp\") {\n\t\t\t\tv_transport = \"tcp\";\n\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"tcp_guise\");\n\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"tcp_guise_http_host\");\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"tcp_guise_http_path\");\n\t\t\t} else if (v_transport === \"mkcp\") {\n\t\t\t\tv_transport = \"kcp\";\n\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"mkcp_guise\");\n\t\t\t\tparams += opt.query(\"seed\", dom_prefix + \"mkcp_seed\");\n\t\t\t} else if (v_transport === \"quic\") {\n\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"quic_guise\");\n\t\t\t\tparams += opt.query(\"key\", dom_prefix + \"quic_key\");\n\t\t\t\tparams += opt.query(\"quicSecurity\", dom_prefix + \"quic_security\");\n\t\t\t} else if (v_transport === \"grpc\") {\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"grpc_serviceName\");\n\t\t\t\tparams += opt.query(\"serviceName\", dom_prefix + \"grpc_serviceName\");\n\t\t\t\tparams += opt.query(\"mode\", dom_prefix + \"grpc_mode\");\n\t\t\t}\n\t\t\tparams += \"&type=\" + v_transport;\n\n\t\t\tif (opt.get(dom_prefix + \"tls\").checked) {\n\t\t\t\tvar v_security = \"tls\";\n\t\t\t\tif (opt.get(dom_prefix + \"fingerprint\") && opt.get(dom_prefix + \"fingerprint\").value != \"\") {\n\t\t\t\t\tlet v_fp = opt.get(dom_prefix + \"fingerprint\").value;\n\t\t\t\t\tparams += \"&fp=\" + v_fp;\n\t\t\t\t}\n\t\t\t\tif (opt.get(dom_prefix + \"reality\") && opt.get(dom_prefix + \"reality\").checked) {\n\t\t\t\t\tv_security = \"reality\";\n\t\t\t\t\tparams += opt.query(\"pbk\", dom_prefix + \"reality_publicKey\");\n\t\t\t\t\tparams += opt.query(\"sid\", dom_prefix + \"reality_shortId\");\n\t\t\t\t\tparams += opt.query(\"spx\", dom_prefix + \"reality_spiderX\");\n\t\t\t\t\tparams += opt.query(\"pqv\", dom_prefix + \"reality_mldsa65Verify\");\n\t\t\t\t}\n\t\t\t\tparams += \"&security=\" + v_security;\n\t\t\t\tparams += opt.query(\"alpn\", dom_prefix + \"alpn\");\n\t\t\t\tparams += opt.query(\"sni\", dom_prefix + \"tls_serverName\");\n\t\t\t\tparams += opt.query(\"allowinsecure\", dom_prefix + \"tls_allowInsecure\");\n\t\t\t\tparams += opt.query(\"pcs\", dom_prefix + \"tls_pinSHA256\");\n\t\t\t\tparams += opt.query(\"vcn\", dom_prefix + \"tls_CertByName\");\n\t\t\t\tparams += opt.query(\"ech\", dom_prefix + \"ech_config\");\n\t\t\t}\n\n\t\t\topt.get(dom_prefix + \"tcp_fast_open\")?.checked && (params += \"&tfo=1\");\n\t\t\tif (opt.get(dom_prefix + \"use_finalmask\")?.checked) {\n\t\t\t\tparams += opt.query(\"fm\", dom_prefix + \"finalmask\");\n\t\t\t}\n\n\t\t\tparams += \"#\" + encodeURI(v_alias.value);\n\t\t\tif (params[0] == \"&\") {\n\t\t\t\tparams = params.substring(1);\n\t\t\t}\n\t\t\turl += params;\n\t\t} else if ((v_type === \"Hysteria2\") || ((v_type === \"sing-box\" || v_type === \"Xray\") && opt.get(dom_prefix + \"protocol\").value === \"hysteria2\")) {\n\t\t\tprotocol = \"hysteria2\"\n\t\t\tvar v_port = opt.get(dom_prefix + \"port\");\n\t\t\tvar params = \"\";\n\t\t\tparams += opt.query(\"sni\", dom_prefix + \"tls_serverName\");\n\t\t\tparams += opt.query(\"insecure\", dom_prefix + \"tls_allowInsecure\");\n\t\t\tparams += opt.query(\"pinSHA256\", dom_prefix + \"tls_pinSHA256\");\n\t\t\tparams += opt.query(\"pcs\", dom_prefix + \"tls_pinSHA256\");\n\t\t\tparams += opt.query(\"vcn\", dom_prefix + \"tls_CertByName\");\n\t\t\t\n\t\t\tvar v_password = null;\n\t\t\t\n\t\t\tif (v_type === \"Hysteria2\") {\n\t\t\t\tv_password = opt.get(\"hysteria2_auth_password\");\n\t\t\t\tvar dom_obfs = opt.get(\"hysteria2_obfs\");\n\t\t\t\tif (dom_obfs && dom_obfs.value != \"\") {\n\t\t\t\t\tparams += \"&obfs=\" + \"salamander\";\n\t\t\t\t\tparams += opt.query(\"obfs-password\", \"hysteria2_obfs\");\n\t\t\t\t}\n\t\t\t\tparams += opt.query(\"mport\", \"hysteria2_hop\");\n\t\t\t} else {\n\t\t\t\tv_password = opt.get(dom_prefix + \"hysteria2_auth_password\");\n\t\t\t\tvar dom_obfs_type = opt.get(dom_prefix + \"hysteria2_obfs_type\");\n\t\t\t\tif (dom_obfs_type && dom_obfs_type.value != \"\") {\n\t\t\t\t\tparams += opt.query(\"obfs\", dom_prefix + \"hysteria2_obfs_type\");\n\t\t\t\t\tparams += opt.query(\"obfs-password\", dom_prefix + \"hysteria2_obfs_password\");\n\t\t\t\t}\n\t\t\t\tparams += opt.query(\"mport\", dom_prefix + \"hysteria2_hop\");\n\t\t\t\tif (opt.get(dom_prefix + \"use_finalmask\")?.checked) {\n\t\t\t\t\tparams += opt.query(\"fm\", dom_prefix + \"finalmask\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tparams = params.replace(/^&/, \"\");\n\t\t\turl =\n\t\t\t\t_address + \":\" +\n\t\t\t\tv_port.value + \"?\" +\n\t\t\t\tparams +\n\t\t\t\t\"#\" + encodeURI(v_alias.value);\n\t\t\tif (v_password) {\n\t\t\t\turl = encodeURIComponent(v_password.value) + \"@\" + url\n\t\t\t}\n\t\t} else if (v_type === \"sing-box\" && opt.get(dom_prefix + \"protocol\").value === \"tuic\") {\n\t\t\tprotocol = \"tuic\";\n\t\t\tvar v_username = opt.get(dom_prefix + \"uuid\");\n\t\t\tvar v_password = opt.get(dom_prefix + \"password\");\n\t\t\tvar v_port = opt.get(dom_prefix + \"port\");\n\t\t\turl = encodeURIComponent(v_username.value) +\n\t\t\t\t\":\" + encodeURIComponent(v_password.value) +\n\t\t\t\t\"@\" + _address +\n\t\t\t\t\":\" + v_port.value + \"?\";\n\n\t\t\tvar params = \"\";\n\t\t\tparams += opt.query(\"sni\", dom_prefix + \"tls_serverName\");\n\t\t\tparams += opt.query(\"disable_sni\", dom_prefix + \"tls_disable_sni\");\n\t\t\tparams += opt.query(\"alpn\", dom_prefix + \"tuic_alpn\");\n\t\t\tparams += opt.query(\"congestion_control\", dom_prefix + \"tuic_congestion_control\");\n\t\t\tparams += opt.query(\"udp_relay_mode\", dom_prefix + \"tuic_udp_relay_mode\");\n\t\t\tparams += opt.query(\"allowinsecure\", dom_prefix + \"tls_allowInsecure\");\n\n\t\t\tparams += \"#\" + encodeURI(v_alias.value);\n\t\t\tif (params[0] == \"&\") {\n\t\t\t\tparams = params.substring(1);\n\t\t\t}\n\t\t\turl += params;\n\t\t} else if (v_type === \"sing-box\" && opt.get(dom_prefix + \"protocol\").value === \"anytls\") {\n\t\t\tprotocol = \"anytls\";\n\t\t\tvar v_password = opt.get(dom_prefix + \"password\");\n\t\t\tvar v_port = opt.get(dom_prefix + \"port\");\n\t\t\turl = encodeURIComponent(v_password.value) +\n\t\t\t\t\"@\" + _address +\n\t\t\t\t\":\" + v_port.value + \"?\";\n\n\t\t\tvar params = \"\";\n\t\t\tif (opt.get(dom_prefix + \"tls\").checked) {\n\t\t\t\tvar v_security = \"tls\";\n\t\t\t\tif (opt.get(dom_prefix + \"fingerprint\") && opt.get(dom_prefix + \"fingerprint\").value != \"\") {\n\t\t\t\t\tlet v_fp = opt.get(dom_prefix + \"fingerprint\").value;\n\t\t\t\t\tparams += \"&fp=\" + v_fp;\n\t\t\t\t}\n\t\t\t\tif (opt.get(dom_prefix + \"reality\") && opt.get(dom_prefix + \"reality\").checked) {\n\t\t\t\t\tv_security = \"reality\";\n\t\t\t\t\tparams += opt.query(\"pbk\", dom_prefix + \"reality_publicKey\");\n\t\t\t\t\tparams += opt.query(\"sid\", dom_prefix + \"reality_shortId\");\n\t\t\t\t}\n\t\t\t\tparams += \"&security=\" + v_security;\n\t\t\t\tparams += opt.query(\"alpn\", dom_prefix + \"alpn\");\n\t\t\t\tparams += opt.query(\"sni\", dom_prefix + \"tls_serverName\");\n\t\t\t\tparams += opt.query(\"allowinsecure\", dom_prefix + \"tls_allowInsecure\");\n\t\t\t}\n\n\t\t\tparams += \"#\" + encodeURI(v_alias.value);\n\t\t\tif (params[0] == \"&\") {\n\t\t\t\tparams = params.substring(1);\n\t\t\t}\n\t\t\turl += params;\n\t\t} else if (v_type === \"sing-box\" && opt.get(dom_prefix + \"protocol\").value === \"naive\") {\n\t\t\tprotocol = \"naive+https\";\n\t\t\tvar v_username = opt.get(dom_prefix + \"username\");\n\t\t\tvar v_password = opt.get(dom_prefix + \"password\");\n\t\t\tvar v_port = opt.get(dom_prefix + \"port\");\n\t\t\turl = encodeURIComponent(v_username.value) +\n\t\t\t\t\":\" + encodeURIComponent(v_password.value) +\n\t\t\t\t\"@\" + _address +\n\t\t\t\t\":\" + v_port.value + \"?\";\n\n\t\t\tvar params = \"security=tls\";\n\t\t\tparams += opt.query(\"sni\", dom_prefix + \"tls_serverName\");\n\t\t\tparams += opt.query(\"insecure-concurrency\", dom_prefix + \"naive_insecure_concurrency\");\n\t\t\tparams += opt.query(\"ech\", dom_prefix + \"ech_config\");\n\t\t\tparams += opt.query(\"uot\", dom_prefix + \"uot\");\n\t\t\tif (opt.get(dom_prefix + \"naive_quic\")?.checked) {\n\t\t\t\tprotocol = \"naive+quic\";\n\t\t\t\tparams += opt.query(\"congestion_control\", dom_prefix + \"naive_congestion_control\");\n\t\t\t}\n\n\t\t\tparams += \"#\" + encodeURI(v_alias.value);\n\t\t\tif (params[0] == \"&\") {\n\t\t\t\tparams = params.substring(1);\n\t\t\t}\n\t\t\turl += params;\n\t\t}\n\t\tif (url) {\n\t\t\turl = protocol.toLowerCase() + \"://\" + url;\n\t\t\treturn url;\n\t\t} else {\n\t\t\talert(\"<%:Not a supported scheme:%> \" + v_type);\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction exportUrl(btn, urlname, sid) {\n\t\tvar url = buildUrl(btn, urlname, sid);\n\t\tif (url) {\n\t\t\tvar textarea = document.createElement(\"textarea\");\n\t\t\ttextarea.textContent = url;\n\t\t\ttextarea.style.position = \"fixed\";\n\t\t\tdocument.body.appendChild(textarea);\n\t\t\ttextarea.select();\n\t\t\ttry {\n\t\t\t\tvar s = document.getElementById(urlname + \"-status\");\n\t\t\t\tif (!s) {\n\t\t\t\t\talert(\"Never\");\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tdocument.execCommand(\"copy\"); // Security exception may be thrown by some browsers.\n\t\t\t\ts.innerHTML = \"<font color='green'><%:Share URL to clipboard successfully.%></font>\";\n\t\t\t} catch (ex) {\n\t\t\t\ts.innerHTML = \"<font color='red'><%:Share URL to clipboard unable.%></font>\";\n\t\t\t} finally {\n\t\t\t\tdocument.body.removeChild(textarea);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction unbracketIP(server) {\n\t\tif (!server) return '';\n\t\treturn server.replace(/^\\[/, '').replace(/\\]$/, '');\n\t}\n\n\tfunction fromUrl(btn, urlname, sid, cacheData) {\n\t\tvar opt = {\n\t\t\tbase: 'cbid.<%=appname%>',\n\t\t\tclient: true,\n\t\t\tget: function (opt) {\n\t\t\t\tvar obj;\n\t\t\t\tvar id = this.base + '.' + opt;\n\t\t\t\tobj = document.getElementsByName(id)[0] || document.getElementById(id);\n\t\t\t\tif (obj) {\n\t\t\t\t\tvar combobox = document.getElementById('cbi.combobox.' + id);\n\t\t\t\t\tif (combobox) {\n\t\t\t\t\t\tobj.combobox = combobox;\n\t\t\t\t\t}\n\t\t\t\t\tvar div = document.getElementById(id);\n\t\t\t\t\tif (div && div.getElementsByTagName(\"li\").length > 0) {\n\t\t\t\t\t\tobj = div;\n\t\t\t\t\t}\n\t\t\t\t\treturn obj;\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t},\n\t\t\tset: function (opt, val) {\n\t\t\t\tvar obj;\n\t\t\t\tobj = this.get(opt);\n\t\t\t\tif (obj) {\n\t\t\t\t\tvar event = document.createEvent(\"HTMLEvents\");\n\t\t\t\t\tevent.initEvent(\"change\", true, true);\n\t\t\t\t\tif (obj.type === 'checkbox') {\n\t\t\t\t\t\tobj.checked = val;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tobj.value = val;\n\t\t\t\t\t\tif (obj.combobox) {\n\t\t\t\t\t\t\tobj.combobox.value = val;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar list = obj.getElementsByTagName(\"li\");\n\t\t\t\t\t\tif (list.length > 0) {\n\t\t\t\t\t\t\tfor (var i = 0; i < list.length; i++) {\n\t\t\t\t\t\t\t\tvar li = list[i];\n\t\t\t\t\t\t\t\tvar data = li.getAttribute(\"data-value\");\n\t\t\t\t\t\t\t\tli.removeAttribute(\"selected\");\n\t\t\t\t\t\t\t\tli.removeAttribute(\"display\");\n\t\t\t\t\t\t\t\tif (data && data == val) {\n\t\t\t\t\t\t\t\t\tli.setAttribute(\"selected\", true);\n\t\t\t\t\t\t\t\t\tli.setAttribute(\"display\", \"0\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvar input = document.getElementsByName(obj.id)[0];\n\t\t\t\t\t\t\tif (input) {\n\t\t\t\t\t\t\t\tinput.value = val;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tvar input = document.createElement(\"input\");\n\t\t\t\t\t\t\t\tinput.setAttribute(\"type\", \"hidden\");\n\t\t\t\t\t\t\t\tinput.setAttribute(\"name\", obj.id);\n\t\t\t\t\t\t\t\tinput.setAttribute(\"value\", val);\n\t\t\t\t\t\t\t\tobj.appendChild(input);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tobj.dispatchEvent(event);\n\t\t\t\t\t} catch (err) {}\n\t\t\t\t} else {\n\t\t\t\t\t//alert('<%:Faltal on set option, please help in debug: %>' + opt + ' = ' + val);\n\t\t\t\t\t// 处理 DynamicList\n\t\t\t\t\tvar fullName = this.base + '.' + opt;\n\t\t\t\t\tvar lists = document.querySelectorAll('.cbi-dynlist');\n\t\t\t\t\tfor (var i = 0; i < lists.length; i++) {\n\t\t\t\t\t\tvar parent = lists[i].closest('.cbi-value');\n\t\t\t\t\t\tif (!parent) continue;\n\t\t\t\t\t\t// 尝试从 label 的 for 属性中提取 fullName\n\t\t\t\t\t\tvar label = parent.querySelector('label.cbi-value-title');\n\t\t\t\t\t\tvar labelFor = label?.getAttribute('for');\n\t\t\t\t\t\tif (labelFor === fullName) {\n\t\t\t\t\t\t\tvar input = lists[i].querySelector('input[type=\"text\"]');\n\t\t\t\t\t\t\tvar addBtn = lists[i].querySelector('.cbi-button-add');\n\t\t\t\t\t\t\tif (input && addBtn) {\n\t\t\t\t\t\t\t\tinput.value = val;\n\t\t\t\t\t\t\t\taddBtn.click();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tsetlist: function (opt, vlist) {\n\t\t\t\tvar id = this.base + \".\" + opt;\n\t\t\t\tvar objs = document.getElementsByName(id) || document.getElementsByClassName(id);\n\t\t\t\tif (objs) {\n\t\t\t\t\tvar values = \"\";\n\t\t\t\t\tfor (var i = 0; i < vlist.length; i++) {\n\t\t\t\t\t\tvalues += vlist[i] + \", \";\n\t\t\t\t\t}\n\t\t\t\t\talert(\"Manually input the option:\\n\" + opt + \"s:\\n[\" + values + \"]\");\n\t\t\t\t} else {\n\t\t\t\t\t//alert(\"<%:Faltal on set option, please help in debug: %>\" + opt);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar s = document.getElementById(urlname + '-status');\n\t\tif (!s) {\n\t\t\talert(\"Never\");\n\t\t\treturn false;\n\t\t}\n\t\topt.base = \"cbid.\" + urlname + \".\" + sid;\n\t\topt.client = urlname.indexOf(\"server\") === -1;\n\t\tvar ssrurl = null;\n\t\tif (cacheData) {\n\t\t\tssrurl = cacheData.ssrurl\n\t\t} else {\n\t\t\tssrurl = prompt('<%:Paste Share URL Here%>', '');\n\t\t\tif (ssrurl === null || ssrurl === \"\") {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tsessionStorage.setItem(\"fromUrl\", JSON.stringify({\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tsavetime: 60 * 1000,\n\t\t\t\turlname: urlname,\n\t\t\t\tsid: sid,\n\t\t\t\tssrurl: ssrurl\n\t\t\t}));\n\t\t}\n\t\tssrurl = ssrurl.replace(/&amp;/gi, '&').replace(/\\s*#\\s*/, '#').trim();  //一些奇葩的链接用\"&amp;\"当做\"&\"，\"#\"前后带空格\n\t\ts.innerHTML = \"\";\n\t\tvar ssu = ssrurl.split('://');\n\t\tvar event = document.createEvent(\"HTMLEvents\");\n\t\tevent.initEvent(\"change\", true, true);\n\n\t\tvar dom_prefix = null\n\n\t\tif (ssu[0] === \"ssr\") {\n\t\t\tdom_prefix = \"ssr_\"\n\t\t\t//var b64c = ssu[1].match(/([A-Za-z0-9_-]+)/);\n\t\t\tvar sstr = b64decsafe((ssu[1] || \"\").replace(/#.*/, \"\").trim());\n\t\t\tvar ploc = sstr.indexOf(\"/?\");\n\t\t\tvar url0 = \"\", param = \"\";\n\t\t\tif (ploc > 0) {\n\t\t\t\turl0 = sstr.substr(0, ploc);\n\t\t\t\tparam = sstr.substr(ploc + 2);\n\t\t\t} else {\n\t\t\t\tvar url0 = sstr;\n\t\t\t}\n\t\t\tvar ssm = url0.match(/^(.+):([^:]+):([^:]*):([^:]+):([^:]*):([^:]+)/);\n\t\t\tif (!ssm || ssm.length < 7) {\n\t\t\t\ts.innerHTML = \"<font color='red'><%:Invalid Share URL Format%></font>\";\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar pdict = {};\n\t\t\tif (param.length > 2) {\n\t\t\t\tvar a = param.split('&');\n\t\t\t\tfor (var i = 0; i < a.length; i++) {\n\t\t\t\t\tvar b = a[i].split('=');\n\t\t\t\t\tpdict[decodeURIComponent(b[0])] = decodeURIComponent(b[1] || '');\n\t\t\t\t}\n\t\t\t}\n\t\t\topt.set('type', \"SSR\");\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(ssm[1]));\n\t\t\topt.set(dom_prefix + 'port', ssm[2]);\n\t\t\topt.set(dom_prefix + 'protocol', ssm[3]);\n\t\t\topt.set(dom_prefix + 'method', ssm[4]);\n\t\t\topt.set(dom_prefix + 'obfs', ssm[5]);\n\t\t\topt.set(dom_prefix + 'password', b64decsafe(ssm[6]));\n\t\t\topt.set(dom_prefix + 'obfs_param', dictvalue(pdict, 'obfsparam'));\n\t\t\topt.set(dom_prefix + 'protocol_param', dictvalue(pdict, 'protoparam'));\n\t\t\tvar rem = pdict['remarks'];\n\t\t\tif (typeof (rem) !== 'undefined' && rem !== '' && rem.length > 0)\n\t\t\t\topt.set('remarks', b64decutf8safe(rem));\n\t\t}\n\t\tif (ssu[0] === \"ss\") {\n\t\t\tvar url0 = ssu[1] || \"\";\n\t\t\tparam = \"\";\n\n\t\t\tvar ploc = url0.indexOf(\"#\");\n\t\t\tif (ploc >= 0) {\n\t\t\t\tparam = url0.substr(ploc + 1);\n\t\t\t\turl0 = url0.substr(0, ploc);\n\t\t\t}\n\n\t\t\tvar queryIndex = (url0 = url0.replace('/?', '?')).indexOf(\"?\");\n\t\t\tvar queryStr = \"\";\n\t\t\tif (queryIndex >= 0) {\n\t\t\t\tqueryStr = url0.substr(queryIndex + 1);\n\t\t\t\turl0 = url0.substr(0, queryIndex);\n\t\t\t}\n\t\t\tvar queryParam = {};\n\t\t\tqueryParam = Object.fromEntries(new URLSearchParams(queryStr));\n\n\t\t\tvar server, port, method, password, plugin, pluginOpts;\n\t\t\tvar sipIndex = url0.indexOf(\"@\");\n\t\t\tif (sipIndex !== -1) {\n\t\t\t\t// SIP002 base64(method:pass)@host:port\n\t\t\t\tvar userInfo = b64decsafe(decodeURIComponent(url0.substr(0, sipIndex)));\n\t\t\t\tvar temp = url0.substr(sipIndex + 1);\n\t\t\t\tvar serverInfo = temp.split(\":\");\n\t\t\t\tserver = serverInfo[0];\n\t\t\t\tport = serverInfo[1];\n\t\t\t\tvar userInfoSplitIndex = userInfo.indexOf(\":\");\n\t\t\t\tif (userInfoSplitIndex !== -1) {\n\t\t\t\t\tmethod = userInfo.substr(0, userInfoSplitIndex);\n\t\t\t\t\tpassword = userInfo.substr(userInfoSplitIndex + 1);\n\t\t\t\t} else {\n\t\t\t\t\tpassword = url0.substr(0, sipIndex);  //一些链接用明文uuid做密码\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// base64(method:pass@host:port)\n\t\t\t\tvar sstr = b64decsafe(decodeURIComponent(url0));\n\t\t\t\tvar m2022 = sstr.match(/^([^:]+):([^:]+):([^@]+)@([^:]+):(\\d+)$/);\n\t\t\t\tvar mNormal = sstr.match(/^([^:]+):([^@]+)@([^:]+):(\\d+)$/);\n\t\t\t\tif (m2022) {\n\t\t\t\t\tmethod = m2022[1];\n\t\t\t\t\tpassword = m2022[2] + \":\" + m2022[3];\n\t\t\t\t\tserver = m2022[4];\n\t\t\t\t\tport = m2022[5];\n\t\t\t\t} else if (mNormal) {\n\t\t\t\t\tmethod = mNormal[1];\n\t\t\t\t\tpassword = mNormal[2];\n\t\t\t\t\tserver = mNormal[3];\n\t\t\t\t\tport = mNormal[4];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 判断密码是否经过url编码\n\t\t\tconst isURLEncodedPassword = function(pwd) {\n\t\t\t\tif (!/%[0-9A-Fa-f]{2}/.test(pwd)) return false;\n\t\t\t\ttry {\n\t\t\t\t\tconst decoded = decodeURIComponent(pwd.replace(/\\+/g, \"%20\"));\n\t\t\t\t\tconst reencoded = encodeURIComponent(decoded);\n\t\t\t\t\treturn reencoded === pwd;\n\t\t\t\t} catch (e) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpassword = isURLEncodedPassword(password) ? decodeURIComponent(password) : password;\n\n\t\t\tif (queryParam.plugin) {\n\t\t\t\tvar pluginParams = decodeURIComponent(queryParam.plugin).split(\";\");\n\t\t\t\tplugin = pluginParams.shift();\n\t\t\t\tpluginOpts = pluginParams.join(\";\");\n\t\t\t}\n\n\t\t\tconst needUpgrade = ss_type !== \"Xray\" && ss_type !== \"sing-box\" &&\n\t\t\t\t\tqueryParam.type && queryParam.type !== \"tcp\" &&\n\t\t\t\t\tqueryParam.headerType && queryParam.headerType !== \"none\";\n\t\t\tif (has_xray && (ss_type == \"xray\" || needUpgrade || queryParam.type === \"xhttp\")) {\n\t\t\t\tdom_prefix = \"xray_\"\n\t\t\t\topt.set('type', \"Xray\");\n\t\t\t\topt.set(dom_prefix + 'protocol', \"shadowsocks\");\n\t\t\t} else if (has_singbox && (ss_type == \"sing-box\" || needUpgrade)) {\n\t\t\t\tdom_prefix = \"singbox_\"\n\t\t\t\topt.set('type', \"sing-box\");\n\t\t\t\topt.set(dom_prefix + 'protocol', \"shadowsocks\");\n\t\t\t} else if (ss_type == \"shadowsocks-rust\") {\n\t\t\t\tdom_prefix = \"ssrust_\"\n\t\t\t\topt.set('type', \"SS-Rust\");\n\t\t\t} else {\n\t\t\t\tif ([\"2022-blake3-aes-128-gcm\", \"2022-blake3-aes-256-gcm\", \"2022-blake3-chacha20-poly1305\"].includes(method)) {\n\t\t\t\t\tdom_prefix = \"ssrust_\"\n\t\t\t\t\topt.set('type', \"SS-Rust\");\n\t\t\t\t} else {\n\t\t\t\t\tdom_prefix = \"ss_\"\n\t\t\t\t\topt.set('type', \"SS\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst _method = (method || \"none\").toLowerCase();\n\t\t\tconst mapping = {\n\t\t\t\t\"chacha20-poly1305\": \"chacha20-ietf-poly1305\",\n\t\t\t\t\"xchacha20-poly1305\": \"xchacha20-ietf-poly1305\",\n\t\t\t};\n\t\t\tmethod = mapping[_method] || _method;\n\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(server));\n\t\t\topt.set(dom_prefix + 'port', port);\n\t\t\topt.set(dom_prefix + 'password', password || \"\");\n\t\t\topt.set(dom_prefix + 'method', method || \"\");\n\t\t\topt.set(dom_prefix + 'ss_method', method || \"\");\n\t\t\topt.set(dom_prefix + 'tcp_fast_open', queryParam.tfo);\n\t\t\tif (plugin && plugin != \"none\") {\n\t\t\t\tplugin = (plugin === \"simple-obfs\") ? \"obfs-local\" : plugin;\n\t\t\t\topt.set(dom_prefix + 'plugin_enabled', true);\n\t\t\t\topt.set(dom_prefix + 'plugin', plugin || \"none\");\n\t\t\t\topt.set(dom_prefix + 'plugin_opts', pluginOpts || \"\");\n\t\t\t\t//obfs-local插件转换成xray支持的格式\n\t\t\t\tif (plugin == \"obfs-local\" && dom_prefix == \"xray_\") {\n\t\t\t\t\tvar obfs = pluginOpts.match(/obfs=([^;]+)/);\n\t\t\t\t\tvar obfs_host = pluginOpts.match(/obfs-host=([^;]+)/);\n\t\t\t\t\tobfs = obfs ? obfs[1] : \"\";\n\t\t\t\t\tobfs_host = obfs_host ? obfs_host[1] : \"\";\n\t\t\t\t\tif (obfs === \"http\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'transport', \"raw\");\n\t\t\t\t\t\topt.set(dom_prefix + 'tcp_guise', \"http\");\n\t\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_host', obfs_host || '');\n\t\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_path', '/');\n\t\t\t\t\t} else if (obfs === \"tls\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'tls', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'tls_serverName', obfs_host || '');\n\t\t\t\t\t\topt.set(dom_prefix + 'tls_allowInsecure', true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\topt.set(dom_prefix + 'plugin', \"none\");\n\t\t\t}\n\t\t\tif (param !== undefined) {\n\t\t\t\topt.set('remarks', decodeURIComponent(param));\n\t\t\t}\n\n\t\t\tif (Object.keys(queryParam).length > 0 && !queryParam.plugin) {\n\t\t\t\tif (queryParam.security) {\n\t\t\t\t\tif (queryParam.security == \"tls\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'tls', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'reality', false);\n\t\t\t\t\t\topt.set(dom_prefix + 'alpn', queryParam.alpn || 'default');\n\t\t\t\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || '');\n\t\t\t\t\t\topt.set(\n\t\t\t\t\t\t\tdom_prefix + 'tls_allowInsecure',\n\t\t\t\t\t\t\t!((queryParam.allowinsecure ?? '0') === '0' && (queryParam.allowInsecure ?? '0') === '0' && (queryParam.insecure ?? '0') === '0')\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (queryParam.fp && queryParam.fp.trim() != \"\") {\n\t\t\t\t\t\t\topt.set(dom_prefix + 'utls', true);\n\t\t\t\t\t\t\topt.set(dom_prefix + 'fingerprint', queryParam.fp);\n\t\t\t\t\t\t}\n\t\t\t\t\t\topt.set(dom_prefix + 'ech', !!queryParam.ech);\n\t\t\t\t\t\topt.set(dom_prefix + 'ech_config', queryParam.ech || '');\n\t\t\t\t\t\topt.set(dom_prefix + 'tls_pinSHA256', queryParam.pcs || '');\n\t\t\t\t\t\topt.set(dom_prefix + 'tls_CertByName', queryParam.vcn || '');\n\t\t\t\t\t}\n\n\t\t\t\t\tif (queryParam.security == \"reality\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'tls', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'reality', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'alpn', queryParam.alpn || 'default');\n\t\t\t\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || '');\n\t\t\t\t\t\tif (queryParam.fp && queryParam.fp.trim() != \"\") {\n\t\t\t\t\t\t\topt.set(dom_prefix + 'utls', true);\n\t\t\t\t\t\t\topt.set(dom_prefix + 'fingerprint', queryParam.fp);\n\t\t\t\t\t\t}\n\t\t\t\t\t\topt.set(dom_prefix + 'reality_publicKey', queryParam.pbk || '');\n\t\t\t\t\t\topt.set(dom_prefix + 'reality_shortId', queryParam.sid || '');\n\t\t\t\t\t\topt.set(dom_prefix + 'reality_spiderX', queryParam.spx || '');\n\t\t\t\t\t\topt.set(dom_prefix + 'use_mldsa65Verify', !!queryParam.pqv);\n\t\t\t\t\t\topt.set(dom_prefix + 'reality_mldsa65Verify', queryParam.pqv || '');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tqueryParam.type = queryParam.type?.toLowerCase();\n\t\t\t\tif (queryParam.type === \"kcp\") {\n\t\t\t\t\tqueryParam.type = \"mkcp\";\n\t\t\t\t}\n\t\t\t\tif (queryParam.type === \"h2\") {\n\t\t\t\t\tqueryParam.type = \"http\";\n\t\t\t\t}\n\t\t\t\tif (dom_prefix == \"singbox_\" && queryParam.type === \"raw\") {\n\t\t\t\t\tqueryParam.type = \"tcp\";\n\t\t\t\t} else if (dom_prefix == \"xray_\" && queryParam.type === \"tcp\") {\n\t\t\t\t\tqueryParam.type = \"raw\";\n\t\t\t\t}\n\t\t\t\tif (dom_prefix == \"xray_\" && queryParam.type === \"http\") {\n\t\t\t\t\topt.set(dom_prefix + 'transport', \"xhttp\");\n\t\t\t\t} else {\n\t\t\t\t\topt.set(dom_prefix + 'transport', queryParam.type);\n\t\t\t\t}\n\t\t\t\tif (queryParam.type === \"raw\" || queryParam.type === \"tcp\") {\n\t\t\t\t\topt.set(dom_prefix + 'tcp_guise', queryParam.headerType || \"none\");\n\t\t\t\t\tif (queryParam.headerType && queryParam.headerType != \"none\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_host', queryParam.host || \"\");\n\t\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_path', queryParam.path || \"\");\n\t\t\t\t\t}\n\t\t\t\t} else if (queryParam.type === \"ws\") {\n\t\t\t\t\topt.set(dom_prefix + 'ws_host', queryParam.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'ws_path', queryParam.path || \"\");\n\t\t\t\t\tif (dom_prefix == \"singbox_\" && queryParam.path && queryParam.path.length > 1) {\n\t\t\t\t\t\tvar ws_path_params = {};\n\t\t\t\t\t\tvar ws_path_dat = queryParam.path.split('?');\n\t\t\t\t\t\tvar ws_path = ws_path_dat[0];\n\t\t\t\t\t\tvar ws_path_params = {};\n\t\t\t\t\t\tvar ws_path_params_array = (ws_path_dat[1] || '').split('&');\n\t\t\t\t\t\tfor (i = 0; i < ws_path_params_array.length; i++) {\n\t\t\t\t\t\t\tvar kv = ws_path_params_array[i].split('=');\n\t\t\t\t\t\t\tws_path_params[decodeURIComponent(kv[0]).toLowerCase()] = decodeURIComponent(kv[1] || '');\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (ws_path_params.ed) {\n\t\t\t\t\t\t\topt.set(dom_prefix + 'ws_path', ws_path);\n\t\t\t\t\t\t\topt.set(dom_prefix + 'ws_enableEarlyData', true);\n\t\t\t\t\t\t\topt.set(dom_prefix + 'ws_maxEarlyData', ws_path_params.ed);\n\t\t\t\t\t\t\topt.set(dom_prefix + 'ws_earlyDataHeaderName', 'Sec-WebSocket-Protocol');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (queryParam.type === \"http\") {\n\t\t\t\t\tif (dom_prefix == \"xray_\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'xhttp_mode', \"stream-one\");\n\t\t\t\t\t\topt.set(dom_prefix + 'xhttp_host', queryParam.host || \"\");\n\t\t\t\t\t\topt.set(dom_prefix + 'xhttp_path', queryParam.path || \"\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\topt.set(dom_prefix + 'http_host', queryParam.host || \"\");\n\t\t\t\t\t\topt.set(dom_prefix + 'http_path', queryParam.path || \"\");\n\t\t\t\t\t}\n\t\t\t\t} else if (queryParam.type === \"quic\") {\n\t\t\t\t\topt.set(dom_prefix + 'quic_guise', queryParam.headerType || \"none\");\n\t\t\t\t\topt.set(dom_prefix + 'quic_security', queryParam.quicSecurity);\n\t\t\t\t\topt.set(dom_prefix + 'quic_key', queryParam.key);\n\t\t\t\t} else if (queryParam.type === \"mkcp\") {\n\t\t\t\t\topt.set(dom_prefix + 'mkcp_guise', queryParam.headerType || \"none\");\n\t\t\t\t\topt.set(dom_prefix + 'mkcp_seed', queryParam.seed || \"\");\n\t\t\t\t} else if (queryParam.type === \"grpc\") {\n\t\t\t\t\topt.set(dom_prefix + 'grpc_serviceName', (queryParam.serviceName || queryParam.path) || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'grpc_mode', queryParam.mode || \"gun\");\n\t\t\t\t} else if (queryParam.type === \"xhttp\") {\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_host', queryParam.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_path', queryParam.path || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_mode', queryParam.mode || \"auto\");\n\t\t\t\t\topt.set(dom_prefix + 'use_xhttp_extra', !!queryParam.extra);\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_extra', queryParam.extra || \"\");\n\t\t\t\t}\n\n\t\t\t\topt.set(dom_prefix + 'uot', queryParam.udp);\n\t\t\t\topt.set(dom_prefix + 'use_finalmask', !!queryParam.fm);\n\t\t\t\topt.set(dom_prefix + 'finalmask', queryParam.fm || \"\");\n\t\t\t\n\t\t\t\tif (queryParam[\"shadow-tls\"]) {\n\t\t\t\t\t//解析SS Shadow-TLS 插件参数\n\t\t\t\t\tconst parseShadowTLSParams = function(base64Str, outObj) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlet obj = JSON.parse(b64decsafe(base64Str));\n\t\t\t\t\t\t\tif (outObj && typeof outObj === \"object\") {\n\t\t\t\t\t\t\t\tfor (let k in obj) outObj[k] = obj[k];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlet out = [];\n\t\t\t\t\t\t\tif (obj.version) out.push(\"v\" + obj.version + \"=1\");\n\t\t\t\t\t\t\tif (obj.password) out.push(\"passwd=\" + obj.password);\n\t\t\t\t\t\t\tfor (let k in obj)\n\t\t\t\t\t\t\t\tif (k !== \"version\" && k !== \"password\")\n\t\t\t\t\t\t\t\t\tout.push(k + \"=\" + obj[k]);\n\t\t\t\t\t\t\treturn out.join(\";\");\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (dom_prefix === \"ssrust_\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'plugin_enabled', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'plugin', \"shadow-tls\");\n\t\t\t\t\t\tlet shadowtlsOpt = parseShadowTLSParams(queryParam[\"shadow-tls\"]);\n\t\t\t\t\t\topt.set(dom_prefix + 'plugin_opts', shadowtlsOpt || \"\");\n\t\t\t\t\t} else if (dom_prefix === \"singbox_\") {\n\t\t\t\t\t\tlet shadowtlsOpt = {};\n\t\t\t\t\t\tparseShadowTLSParams(queryParam[\"shadow-tls\"], shadowtlsOpt);\n\t\t\t\t\t\tif (Object.keys(shadowtlsOpt).length > 0) {\n\t\t\t\t\t\t\topt.set(dom_prefix + 'shadowtls', true);\n\t\t\t\t\t\t\topt.set(dom_prefix + 'shadowtls_version', shadowtlsOpt.version || \"1\");\n\t\t\t\t\t\t\topt.set(dom_prefix + 'shadowtls_password', shadowtlsOpt.password || \"\");\n\t\t\t\t\t\t\topt.set(dom_prefix + 'shadowtls_serverName', shadowtlsOpt.host || \"\");\n\t\t\t\t\t\t\tif (shadowtlsOpt.fingerprint) {\n\t\t\t\t\t\t\t\topt.set(dom_prefix + 'shadowtls_utls', true);\n\t\t\t\t\t\t\t\topt.set(dom_prefix + 'shadowtls_fingerprint', shadowtlsOpt.fingerprint || \"chrome\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (ssu[0] === \"trojan\") {\n\t\t\tif (trojan_type == \"sing-box\" && has_singbox) {\n\t\t\t\tdom_prefix = \"singbox_\"\n\t\t\t\topt.set('type', \"sing-box\");\n\t\t\t\topt.set(dom_prefix + 'protocol', \"trojan\");\n\t\t\t} else if (trojan_type == \"xray\" && has_xray) {\n\t\t\t\tdom_prefix = \"xray_\"\n\t\t\t\topt.set('type', \"Xray\");\n\t\t\t\topt.set(dom_prefix + 'protocol', \"trojan\");\n\t\t\t}\n\t\t\tvar m = parseNodeUrl(ssrurl);\n\t\t\tvar password = m.passwd;\n\t\t\tif (password === \"\") {\n\t\t\t\ts.innerHTML = \"<font color='red'><%:Invalid Share URL Format%></font>\";\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar queryParam = {};\n\t\t\tif (m.search.length > 1) {\n\t\t\t\tvar query = m.search.replace('/?', '?').split('?');\n\t\t\t\tvar queryParams = query[1];\n\t\t\t\tvar queryArray = queryParams.split('&');\n\t\t\t\tvar params;\n\t\t\t\tfor (var i = 0; i < queryArray.length; i++) {\n\t\t\t\t\tparams = queryArray[i].split('=');\n\t\t\t\t\tqueryParam[decodeURIComponent(params[0])] = decodeURIComponent(params[1] || '');\n\t\t\t\t}\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(m.hostname));\n\t\t\topt.set(dom_prefix + 'port', m.port || \"443\");\n\t\t\topt.set(dom_prefix + 'password', decodeURIComponent(password));\n\n\t\t\tqueryParam.type = queryParam.type ? queryParam.type.toLowerCase() : \"tcp\";\n\t\t\tif (queryParam.type === \"kcp\") {\n\t\t\t\tqueryParam.type = \"mkcp\";\n\t\t\t}\n\t\t\tif (queryParam.type === \"h2\") {\n\t\t\t\tqueryParam.type = \"http\";\n\t\t\t}\n\t\t\tif (dom_prefix == \"singbox_\" && queryParam.type === \"raw\") {\n\t\t\t\tqueryParam.type = \"tcp\";\n\t\t\t} else if (dom_prefix == \"xray_\" && queryParam.type === \"tcp\") {\n\t\t\t\tqueryParam.type = \"raw\";\n\t\t\t}\n\t\t\tif (dom_prefix == \"xray_\" && queryParam.type === \"http\") {\n\t\t\t\topt.set(dom_prefix + 'transport', \"xhttp\");\n\t\t\t} else {\n\t\t\t\topt.set(dom_prefix + 'transport', queryParam.type);\n\t\t\t}\n\t\t\tif (queryParam.type === \"raw\" || queryParam.type === \"tcp\") {\n\t\t\t\topt.set(dom_prefix + 'tcp_guise', queryParam.headerType || \"none\");\n\t\t\t\tif (queryParam.headerType && queryParam.headerType != \"none\") {\n\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_host', queryParam.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_path', queryParam.path || \"\");\n\t\t\t\t}\n\t\t\t} else if (queryParam.type === \"ws\") {\n\t\t\t\topt.set(dom_prefix + 'ws_host', queryParam.host || \"\");\n\t\t\t\topt.set(dom_prefix + 'ws_path', queryParam.path || \"\");\n\t\t\t\tif (dom_prefix == \"singbox_\" && queryParam.path && queryParam.path.length > 1) {\n\t\t\t\t\tvar ws_path_params = {};\n\t\t\t\t\tvar ws_path_dat = queryParam.path.split('?');\n\t\t\t\t\tvar ws_path = ws_path_dat[0];\n\t\t\t\t\tvar ws_path_params = {};\n\t\t\t\t\tvar ws_path_params_array = (ws_path_dat[1] || '').split('&');\n\t\t\t\t\tfor (i = 0; i < ws_path_params_array.length; i++) {\n\t\t\t\t\t\tvar kv = ws_path_params_array[i].split('=');\n\t\t\t\t\t\tws_path_params[decodeURIComponent(kv[0]).toLowerCase()] = decodeURIComponent(kv[1] || '');\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (ws_path_params.ed) {\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_path', ws_path);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_enableEarlyData', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_maxEarlyData', ws_path_params.ed);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_earlyDataHeaderName', 'Sec-WebSocket-Protocol');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (queryParam.type === \"http\") {\n\t\t\t\tif (dom_prefix == \"xray_\") {\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_mode', \"stream-one\");\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_host', queryParam.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_path', queryParam.path || \"\");\n\t\t\t\t} else {\n\t\t\t\t\topt.set(dom_prefix + 'http_host', queryParam.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'http_path', queryParam.path || \"\");\n\t\t\t\t}\n\t\t\t} else if (queryParam.type === \"quic\") {\n\t\t\t\topt.set(dom_prefix + 'quic_guise', queryParam.headerType || \"none\");\n\t\t\t\topt.set(dom_prefix + 'quic_security', queryParam.quicSecurity);\n\t\t\t\topt.set(dom_prefix + 'quic_key', queryParam.key);\n\t\t\t} else if (queryParam.type === \"mkcp\") {\n\t\t\t\topt.set(dom_prefix + 'mkcp_guise', queryParam.headerType || \"none\");\n\t\t\t\topt.set(dom_prefix + 'mkcp_seed', queryParam.seed || \"\");\n\t\t\t} else if (queryParam.type === \"grpc\") {\n\t\t\t\topt.set(dom_prefix + 'grpc_serviceName', (queryParam.serviceName || queryParam.path) || \"\");\n\t\t\t\topt.set(dom_prefix + 'grpc_mode', queryParam.mode || \"gun\");\n\t\t\t}\n\n\t\t\tqueryParam.security = queryParam.security || \"tls\";\n\t\t\topt.set(dom_prefix + 'tls', queryParam.security === \"tls\");\n\t\t\tif (queryParam.security === \"tls\") {\n\t\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.peer || queryParam.sni || \"\");\n\t\t\t\topt.set(dom_prefix + 'alpn', queryParam.alpn || 'default');\n\t\t\t\topt.set(dom_prefix + 'tls_pinSHA256', queryParam.pcs || '');\n\t\t\t\topt.set(dom_prefix + 'tls_CertByName', queryParam.vcn || '');\n\t\t\t}\n\t\t\topt.set(\n\t\t\t\tdom_prefix + 'tls_allowInsecure',\n\t\t\t\t!((queryParam.allowinsecure ?? '0') === '0' && (queryParam.allowInsecure ?? '0') === '0' && (queryParam.insecure ?? '0') === '0')\n\t\t\t);\n\t\t\topt.set(dom_prefix + 'tcp_fast_open', queryParam.tfo);\n\t\t\topt.set(dom_prefix + 'use_finalmask', !!queryParam.fm);\n\t\t\topt.set(dom_prefix + 'finalmask', queryParam.fm || \"\");\n\n\t\t\tif (m.hash) {\n\t\t\t\topt.set('remarks', decodeURIComponent(m.hash.substr(1)));\n\t\t\t}\n\t\t}\n\t\tif (ssu[0] === \"vmess\") {\n\t\t\tvar sstr = b64DecodeUnicode((ssu[1] || \"\").replace(/#.*/, \"\").trim());\n\t\t\tvar ploc = sstr.indexOf(\"/?\");\n\t\t\tif (vmess_type == \"sing-box\" && has_singbox) {\n\t\t\t\tdom_prefix = \"singbox_\"\n\t\t\t\topt.set('type', \"sing-box\");\n\t\t\t} else if (has_xray) {\n\t\t\t\tdom_prefix = \"xray_\"\n\t\t\t\topt.set('type', \"Xray\");\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'protocol', \"vmess\");\n\t\t\tvar url0, param = \"\";\n\t\t\tif (ploc > 0) {\n\t\t\t\turl0 = sstr.substr(0, ploc);\n\t\t\t\tparam = sstr.substr(ploc + 2);\n\t\t\t}\n\t\t\tvar ssm = JSON.parse(sstr);\n\t\t\topt.set('remarks', ssm.ps);\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(ssm.add));\n\t\t\topt.set(dom_prefix + 'port', ssm.port);\n\t\t\topt.set(dom_prefix + 'uuid', ssm.id);\n\t\t\topt.set(dom_prefix + 'security', ssm.security || ssm.scy || \"auto\");\n\t\t\topt.set(dom_prefix + 'tls', ssm.tls === \"tls\");\n\t\t\tif (ssm.tls === \"tls\") {\n\t\t\t\topt.set(dom_prefix + 'tls_serverName', ssm.sni || ssm.host);\n\t\t\t\topt.set(dom_prefix + 'alpn', ssm.alpn || \"default\");\n\t\t\t\tif (ssm.fp && ssm.fp !== \"\") {\n\t\t\t\t\topt.set(dom_prefix + 'utls', true);\n\t\t\t\t\topt.set(dom_prefix + 'fingerprint', ssm.fp);\n\t\t\t\t}\n\t\t\t\topt.set(dom_prefix + 'tls_pinSHA256', ssm.pcs || \"\");\n\t\t\t\topt.set(\n\t\t\t\t\tdom_prefix + 'tls_allowInsecure',\n\t\t\t\t\t!((ssm.allowinsecure ?? '0') === '0' && (ssm.allowInsecure ?? '0') === '0' && (ssm.insecure ?? '0') === '0')\n\t\t\t\t);\n\t\t\t}\n\t\t\tssm.net = ssm.net.toLowerCase();\n\t\t\tif (ssm.net === \"kcp\" || ssm.net === \"mkcp\")\n\t\t\t\tssm.net = \"mkcp\"\n\t\t\tif (dom_prefix == \"singbox_\" && ssm.net === \"raw\") {\n\t\t\t\tssm.net = \"tcp\";\n\t\t\t} else if (dom_prefix == \"xray_\" && ssm.net === \"tcp\") {\n\t\t\t\tssm.net = \"raw\";\n\t\t\t}\n\t\t\tif (ssm.net === \"h2\" || ssm.net === \"http\") {\n\t\t\t\tssm.net = \"http\";\n\t\t\t}\n\t\t\tif (dom_prefix == \"xray_\" && ssm.net === \"http\") {\n\t\t\t\topt.set(dom_prefix + 'transport', \"xhttp\");\n\t\t\t} else {\n\t\t\t\topt.set(dom_prefix + 'transport', ssm.net);\n\t\t\t}\n\t\t\tif (ssm.net === \"raw\" || ssm.net === \"tcp\") {\n\t\t\t\topt.set(dom_prefix + 'tcp_guise', (ssm.host && ssm.host != \"\") ? \"http\" : \"none\");\n\t\t\t\tif (ssm.host && ssm.host != \"\") {\n\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_host', ssm.host);\n\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_path', ssm.path || \"\");\n\t\t\t\t}\n\t\t\t} else if (ssm.net === \"ws\") {\n\t\t\t\topt.set(dom_prefix + 'ws_host', ssm.host);\n\t\t\t\topt.set(dom_prefix + 'ws_path', ssm.path);\n\t\t\t\tif (dom_prefix == \"singbox_\" && ssm.path && ssm.path.length > 1) {\n\t\t\t\t\tvar ws_path_params = {};\n\t\t\t\t\tvar ws_path_dat = ssm.path.split('?');\n\t\t\t\t\tvar ws_path = ws_path_dat[0];\n\t\t\t\t\tvar ws_path_params = {};\n\t\t\t\t\tvar ws_path_params_array = (ws_path_dat[1] || '').split('&');\n\t\t\t\t\tfor (i = 0; i < ws_path_params_array.length; i++) {\n\t\t\t\t\t\tvar kv = ws_path_params_array[i].split('=');\n\t\t\t\t\t\tws_path_params[decodeURIComponent(kv[0]).toLowerCase()] = decodeURIComponent(kv[1] || '');\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (ws_path_params.ed) {\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_path', ws_path);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_enableEarlyData', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_maxEarlyData', ws_path_params.ed);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_earlyDataHeaderName', 'Sec-WebSocket-Protocol');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (ssm.net === \"http\") {\n\t\t\t\tif (dom_prefix == \"xray_\") {\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_mode', \"stream-one\");\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_host', ssm.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_path', ssm.path || \"\");\n\t\t\t\t} else {\n\t\t\t\t\topt.set(dom_prefix + 'http_host', ssm.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'http_path', ssm.path || \"\");\n\t\t\t\t}\n\t\t\t} else if (ssm.net === \"quic\") {\n\t\t\t\topt.set(dom_prefix + 'quic_security', ssm.securty);\n\t\t\t\topt.set(dom_prefix + 'quic_key', ssm.key);\n\t\t\t} else if (ssm.net === \"kcp\" || ssm.net === \"mkcp\") {\n\t\t\t\topt.set(dom_prefix + 'mkcp_guise', ssm.type || \"none\");\n\t\t\t\topt.set(dom_prefix + 'mkcp_seed', ssm.seed || \"\");\n\t\t\t} else if (ssm.net === \"grpc\") {\n\t\t\t\topt.set(dom_prefix + 'grpc_serviceName', ssm.path);\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'tcp_fast_open', ssm.tfo);\n\t\t\topt.set(dom_prefix + 'use_finalmask', !!ssm.fm);\n\t\t\topt.set(dom_prefix + 'finalmask', ssm.fm || \"\");\n\t\t}\n\t\tif (ssu[0] === \"vless\") {\n\t\t\tif (vless_type == \"sing-box\" && has_singbox) {\n\t\t\t\tdom_prefix = \"singbox_\"\n\t\t\t\topt.set('type', \"sing-box\");\n\t\t\t} else if (has_xray) {\n\t\t\t\tdom_prefix = \"xray_\"\n\t\t\t\topt.set('type', \"Xray\");\n\t\t\t}\n\t\t\t\n\t\t\tvar m = parseNodeUrl(ssrurl);\n\t\t\tvar password = m.passwd;\n\t\t\tif (password === \"\") {\n\t\t\t\ts.innerHTML = \"<font color='red'><%:Invalid Share URL Format%></font>\";\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar queryParam = {};\n\t\t\tif (m.search.length > 1) {\n\t\t\t\tvar query = m.search.replace('/?', '?').split('?')\n\t\t\t\tvar queryParams = query[1];\n\t\t\t\tvar queryArray = queryParams.split('&');\n\t\t\t\tvar params;\n\t\t\t\tfor (i = 0; i < queryArray.length; i++) {\n\t\t\t\t\tparams = queryArray[i].split('=');\n\t\t\t\t\tqueryParam[decodeURIComponent(params[0])] = decodeURIComponent(params[1] || '');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tqueryParam.type = queryParam.type.toLowerCase();\n\t\t\tif ([\"xhttp\", \"kcp\", \"mkcp\"].includes(queryParam.type) && vless_type !== \"xray\" && has_xray) {\n\t\t\t\tdom_prefix = \"xray_\"\n\t\t\t\topt.set('type', \"Xray\");\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'protocol', \"vless\");\n\t\t\topt.set(dom_prefix + 'uuid', password);\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(m.hostname));\n\t\t\topt.set(dom_prefix + 'port', m.port || \"443\");\n\n\t\t\topt.set(dom_prefix + 'encryption', queryParam.encryption || \"none\");\n\t\t\topt.set(dom_prefix + 'flow', queryParam.flow || '');\n\t\t\tif (queryParam.security) {\n\t\t\t\tif (queryParam.security == \"tls\") {\n\t\t\t\t\topt.set(dom_prefix + 'tls', true);\n\t\t\t\t\topt.set(dom_prefix + 'reality', false);\n\t\t\t\t\topt.set(dom_prefix + 'alpn', queryParam.alpn || 'default');\n\t\t\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || '');\n\t\t\t\t\topt.set(\n\t\t\t\t\t\tdom_prefix + 'tls_allowInsecure',\n\t\t\t\t\t\t!((queryParam.allowinsecure ?? '0') === '0' && (queryParam.allowInsecure ?? '0') === '0' && (queryParam.insecure ?? '0') === '0')\n\t\t\t\t\t);\n\t\t\t\t\tif (queryParam.fp && queryParam.fp.trim() != \"\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'utls', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'fingerprint', queryParam.fp);\n\t\t\t\t\t}\n\t\t\t\t\topt.set(dom_prefix + 'ech', !!queryParam.ech);\n\t\t\t\t\topt.set(dom_prefix + 'ech_config', queryParam.ech || '');\n\t\t\t\t\topt.set(dom_prefix + 'tls_pinSHA256', queryParam.pcs || '');\n\t\t\t\t\topt.set(dom_prefix + 'tls_CertByName', queryParam.vcn || '');\n\t\t\t\t}\n\n\t\t\t\tif (queryParam.security == \"reality\") {\n\t\t\t\t\topt.set(dom_prefix + 'tls', true);\n\t\t\t\t\topt.set(dom_prefix + 'reality', true);\n\t\t\t\t\topt.set(dom_prefix + 'alpn', queryParam.alpn || 'default');\n\t\t\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || '');\n\t\t\t\t\tif (queryParam.fp && queryParam.fp.trim() != \"\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'utls', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'fingerprint', queryParam.fp);\n\t\t\t\t\t}\n\t\t\t\t\topt.set(dom_prefix + 'reality_publicKey', queryParam.pbk || '');\n\t\t\t\t\topt.set(dom_prefix + 'reality_shortId', queryParam.sid || '');\n\t\t\t\t\topt.set(dom_prefix + 'reality_spiderX', queryParam.spx || '');\n\t\t\t\t\topt.set(dom_prefix + 'use_mldsa65Verify', !!queryParam.pqv);\n\t\t\t\t\topt.set(dom_prefix + 'reality_mldsa65Verify', queryParam.pqv || '');\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif (queryParam.type === \"kcp\") {\n\t\t\t\tqueryParam.type = \"mkcp\";\n\t\t\t}\n\t\t\tif (queryParam.type === \"h2\") {\n\t\t\t\tqueryParam.type = \"http\";\n\t\t\t}\n\t\t\tif (dom_prefix == \"singbox_\" && queryParam.type === \"raw\") {\n\t\t\t\tqueryParam.type = \"tcp\";\n\t\t\t} else if (dom_prefix == \"xray_\" && queryParam.type === \"tcp\") {\n\t\t\t\tqueryParam.type = \"raw\";\n\t\t\t}\n\t\t\tif (dom_prefix == \"xray_\" && queryParam.type === \"http\") {\n\t\t\t\topt.set(dom_prefix + 'transport', \"xhttp\");\n\t\t\t} else {\n\t\t\t\topt.set(dom_prefix + 'transport', queryParam.type);\n\t\t\t}\n\t\t\tif (queryParam.type === \"raw\" || queryParam.type === \"tcp\") {\n\t\t\t\topt.set(dom_prefix + 'tcp_guise', queryParam.headerType || \"none\");\n\t\t\t\tif (queryParam.headerType && queryParam.headerType != \"none\") {\n\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_host', queryParam.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_path', queryParam.path || \"\");\n\t\t\t\t}\n\t\t\t} else if (queryParam.type === \"ws\") {\n\t\t\t\topt.set(dom_prefix + 'ws_host', queryParam.host || \"\");\n\t\t\t\topt.set(dom_prefix + 'ws_path', queryParam.path || \"\");\n\t\t\t\tif (dom_prefix == \"singbox_\" && queryParam.path && queryParam.path.length > 1) {\n\t\t\t\t\tvar ws_path_params = {};\n\t\t\t\t\tvar ws_path_dat = queryParam.path.split('?');\n\t\t\t\t\tvar ws_path = ws_path_dat[0];\n\t\t\t\t\tvar ws_path_params = {};\n\t\t\t\t\tvar ws_path_params_array = (ws_path_dat[1] || '').split('&');\n\t\t\t\t\tfor (i = 0; i < ws_path_params_array.length; i++) {\n\t\t\t\t\t\tvar kv = ws_path_params_array[i].split('=');\n\t\t\t\t\t\tws_path_params[decodeURIComponent(kv[0]).toLowerCase()] = decodeURIComponent(kv[1] || '');\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (ws_path_params.ed) {\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_path', ws_path);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_enableEarlyData', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_maxEarlyData', ws_path_params.ed);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_earlyDataHeaderName', 'Sec-WebSocket-Protocol');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (queryParam.type === \"h2\" || queryParam.type === \"http\") {\n\t\t\t\tif (dom_prefix == \"xray_\") {\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_mode', \"stream-one\");\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_host', queryParam.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_path', queryParam.path || \"\");\n\t\t\t\t} else {\n\t\t\t\t\topt.set(dom_prefix + 'http_host', queryParam.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'http_path', queryParam.path || \"\");\n\t\t\t\t}\n\t\t\t} else if (queryParam.type === \"quic\") {\n\t\t\t\topt.set(dom_prefix + 'quic_guise', queryParam.headerType || \"none\");\n\t\t\t\topt.set(dom_prefix + 'quic_security', queryParam.quicSecurity);\n\t\t\t\topt.set(dom_prefix + 'quic_key', queryParam.key);\n\t\t\t} else if (queryParam.type === \"kcp\" || queryParam.type === \"mkcp\") {\n\t\t\t\topt.set(dom_prefix + 'mkcp_guise', queryParam.headerType || \"none\");\n\t\t\t\topt.set(dom_prefix + 'mkcp_seed', queryParam.seed || \"\");\n\t\t\t} else if (queryParam.type === \"grpc\") {\n\t\t\t\topt.set(dom_prefix + 'grpc_serviceName', (queryParam.serviceName || queryParam.path) || \"\");\n\t\t\t\topt.set(dom_prefix + 'grpc_mode', queryParam.mode || \"gun\");\n\t\t\t} else if (queryParam.type === \"xhttp\") {\n\t\t\t\topt.set(dom_prefix + 'xhttp_host', queryParam.host || \"\");\n\t\t\t\topt.set(dom_prefix + 'xhttp_path', queryParam.path || \"\");\n\t\t\t\topt.set(dom_prefix + 'xhttp_mode', queryParam.mode || \"auto\");\n\t\t\t\topt.set(dom_prefix + 'use_xhttp_extra', !!queryParam.extra);\n\t\t\t\topt.set(dom_prefix + 'xhttp_extra', queryParam.extra || \"\");\n\t\t\t} else if (queryParam.type === \"httpupgrade\") {\n\t\t\t\topt.set(dom_prefix + 'httpupgrade_host', queryParam.host || \"\");\n\t\t\t\topt.set(dom_prefix + 'httpupgrade_path', queryParam.path || \"\");\n\t\t\t}\n\n\t\t\topt.set(dom_prefix + 'tcp_fast_open', queryParam.tfo);\n\t\t\topt.set(dom_prefix + 'use_finalmask', !!queryParam.fm);\n\t\t\topt.set(dom_prefix + 'finalmask', queryParam.fm || \"\");\n\n\t\t\tif (m.hash) {\n\t\t\t\topt.set('remarks', decodeURIComponent(m.hash.substr(1)));\n\t\t\t}\n\t\t}\n\t\tif (ssu[0] === \"hysteria2\" || ssu[0] === \"hy2\") {\n\t\t\tvar m = parseNodeUrl(ssrurl);\n\t\t\tvar password = m.passwd;\n\t\t\tif (password === \"\") {\n\t\t\t\ts.innerHTML = \"<font color='red'><%:Invalid Share URL Format%></font>\";\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar queryParam = {};\n\t\t\tif (m.search.length > 1) {\n\t\t\t\tvar query = m.search.replace('/?', '?').split('?')\n\t\t\t\tvar queryParams = query[1];\n\t\t\t\tvar queryArray = queryParams.split('&');\n\t\t\t\tvar params;\n\t\t\t\tfor (i = 0; i < queryArray.length; i++) {\n\t\t\t\t\tparams = queryArray[i].split('=');\n\t\t\t\t\tqueryParam[decodeURIComponent(params[0])] = decodeURIComponent(params[1] || '');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((hysteria2_type == \"sing-box\" && has_singbox) || (hysteria2_type == \"xray\" && has_xray)) {\n\t\t\t\tvar is_singbox = hysteria2_type == \"sing-box\" && has_singbox;\n\t\t\t\topt.set('type', is_singbox ? \"sing-box\" : \"Xray\");\n\t\t\t\tdom_prefix = is_singbox ? \"singbox_\" : \"xray_\";\n\t\t\t\topt.set(dom_prefix + 'protocol', \"hysteria2\");\n\t\t\t\topt.set(dom_prefix + 'hysteria2_auth_password', decodeURIComponent(password));\n\t\t\t\tif (queryParam[\"obfs-password\"] || queryParam[\"obfs_password\"]) {\n\t\t\t\t\topt.set(dom_prefix + 'hysteria2_obfs_type', \"salamander\");\n\t\t\t\t\topt.set(dom_prefix + 'hysteria2_obfs_password', queryParam[\"obfs-password\"] || queryParam[\"obfs_password\"]);\n\t\t\t\t}\n\t\t\t\topt.set(dom_prefix + 'hysteria2_hop', queryParam.mport || \"\");\n\t\t\t\topt.set(dom_prefix + 'use_finalmask', !!queryParam.fm);\n\t\t\t\topt.set(dom_prefix + 'finalmask', queryParam.fm || \"\");\n\t\t\t} else if (has_hysteria2) {\n\t\t\t\topt.set('type', \"Hysteria2\");\n\t\t\t\tdom_prefix = \"hysteria2_\"\n\t\t\t\topt.set(dom_prefix + 'auth_password', decodeURIComponent(password));\n\t\t\t\tif (queryParam[\"obfs-password\"] || queryParam[\"obfs_password\"]) {\n\t\t\t\t\topt.set(dom_prefix + 'obfs', queryParam[\"obfs-password\"] || queryParam[\"obfs_password\"]);\n\t\t\t\t}\n\t\t\t\topt.set(dom_prefix + 'hop', queryParam.mport || \"\");\n\t\t\t}\n\t\t\t\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(m.hostname));\n\t\t\topt.set(dom_prefix + 'port', m.port || \"443\");\n\t\t\t\n\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || \"\");\n\t\t\topt.set(\n\t\t\t\tdom_prefix + 'tls_allowInsecure',\n\t\t\t\t!((queryParam.allowinsecure ?? '0') === '0' && (queryParam.allowInsecure ?? '0') === '0' && (queryParam.insecure ?? '0') === '0')\n\t\t\t);\n\t\t\topt.set(dom_prefix + 'tls_pinSHA256', queryParam.pcs || queryParam.pinSHA256 || '');\n\t\t\topt.set(dom_prefix + 'tls_CertByName', queryParam.vcn || '');\n\t\t\tif (m.hash) {\n\t\t\t\topt.set('remarks', decodeURIComponent(m.hash.substr(1)));\n\t\t\t}\n\t\t}\n\t\tif (ssu[0] === \"tuic\") {\n\t\t\tif (has_singbox) {\n\t\t\t\tdom_prefix = \"singbox_\"\n\t\t\t\topt.set('type', \"sing-box\");\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'protocol', \"tuic\");\n\t\t\tvar _parsedUrl = new URL(\"http://\" + ssu[1]);\n\t\t\tvar username = _parsedUrl.username;\n\t\t\tvar password = _parsedUrl.password;\n\t\t\tvar hostname = _parsedUrl.hostname;\n\t\t\tvar port = _parsedUrl.port;\n\t\t\tvar search = _parsedUrl.search;\n\t\t\tvar hash = _parsedUrl.hash;\n\t\t\tif (!username || !password) {  //修正某些链接会把uuid和password之间的:进行编码\n\t\t\t\tconst decoded = decodeURIComponent(username || password || \"\");\n\t\t\t\tconst i = decoded.indexOf(\":\");\n\t\t\t\tif (i > -1) {\n\t\t\t\t\tusername = decoded.slice(0, i);\n\t\t\t\t\tpassword = decoded.slice(i + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'uuid', decodeURIComponent(username));\n\t\t\topt.set(dom_prefix + 'password', decodeURIComponent(password));\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(hostname));\n\t\t\topt.set(dom_prefix + 'port', port || \"443\");\n\t\t\tvar queryParam = {};\n\t\t\tif (search.length > 1) {\n\t\t\t\tvar query = search.split('?')\n\t\t\t\tvar queryParams = query[1];\n\t\t\t\tvar queryArray = queryParams.split('&');\n\t\t\t\tvar params;\n\t\t\t\tfor (i = 0; i < queryArray.length; i++) {\n\t\t\t\t\tparams = queryArray[i].split('=');\n\t\t\t\t\tqueryParam[decodeURIComponent(params[0]).toLowerCase()] = decodeURIComponent(params[1] || '');\n\t\t\t\t}\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'tuic_congestion_control', queryParam.congestion_control || 'cubic');\n\t\t\topt.set(dom_prefix + 'tuic_udp_relay_mode', queryParam.udp_relay_mode || 'native');\n\t\t\topt.set(dom_prefix + 'tuic_alpn', queryParam.alpn || 'h3');\n\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || '');\n\t\t\topt.set(dom_prefix + 'tls_disable_sni', queryParam.disable_sni === \"1\");\n\t\t\topt.set(\n\t\t\t\tdom_prefix + 'tls_allowInsecure',\n\t\t\t\t!((queryParam.allowinsecure ?? '0') === '0' && (queryParam.insecure ?? '0') === '0' && (queryParam.allow_insecure ?? '0') === '0')\n\t\t\t);\n\t\t\tif (hash) {\n\t\t\t\topt.set('remarks', decodeURIComponent(hash.substr(1)));\n\t\t\t}\n\t\t}\n\t\tif (ssu[0] === \"anytls\") {\n\t\t\tif (has_singbox) {\n\t\t\t\tdom_prefix = \"singbox_\"\n\t\t\t\topt.set('type', \"sing-box\");\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'protocol', \"anytls\");\n\t\t\tvar m = parseNodeUrl(ssrurl);\n\t\t\tvar password = m.passwd;\n\t\t\tif (password === \"\") {\n\t\t\t\ts.innerHTML = \"<font color='red'><%:Invalid Share URL Format%></font>\";\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'password', password);\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(m.hostname));\n\t\t\topt.set(dom_prefix + 'port', m.port || \"443\");\n\t\t\tvar queryParam = {};\n\t\t\tif (m.search.length > 1) {\n\t\t\t\tvar query = m.search.replace('/?', '?').split('?')\n\t\t\t\tvar queryParams = query[1];\n\t\t\t\tvar queryArray = queryParams.split('&');\n\t\t\t\tvar params;\n\t\t\t\tfor (i = 0; i < queryArray.length; i++) {\n\t\t\t\t\tparams = queryArray[i].split('=');\n\t\t\t\t\tqueryParam[decodeURIComponent(params[0]).toLowerCase()] = decodeURIComponent(params[1] || '');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!queryParam.security || queryParam.security == \"\") {\n\t\t\t\tqueryParam.security = \"tls\";\n\t\t\t}\n\t\t\tif (queryParam.security) {\n\t\t\t\tif (queryParam.security == \"tls\") {\n\t\t\t\t\topt.set(dom_prefix + 'tls', true);\n\t\t\t\t\topt.set(dom_prefix + 'reality', false);\n\t\t\t\t\topt.set(dom_prefix + 'alpn', queryParam.alpn || 'default');\n\t\t\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || '');\n\t\t\t\t\topt.set(dom_prefix + 'tls_allowInsecure', !((queryParam.allowinsecure ?? '0') === '0' && (queryParam.insecure ?? '0') === '0'));\n\t\t\t\t\tif (queryParam.fp && queryParam.fp.trim() != \"\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'utls', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'fingerprint', queryParam.fp);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (queryParam.security == \"reality\") {\n\t\t\t\t\topt.set(dom_prefix + 'tls', true);\n\t\t\t\t\topt.set(dom_prefix + 'reality', true);\n\t\t\t\t\topt.set(dom_prefix + 'alpn', queryParam.alpn || 'default');\n\t\t\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || '');\n\t\t\t\t\tif (queryParam.fp && queryParam.fp.trim() != \"\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'utls', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'fingerprint', queryParam.fp);\n\t\t\t\t\t}\n\t\t\t\t\topt.set(dom_prefix + 'reality_publicKey', queryParam.pbk || '');\n\t\t\t\t\topt.set(dom_prefix + 'reality_shortId', queryParam.sid || '');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (m.hash) {\n\t\t\t\topt.set('remarks', decodeURIComponent(m.hash.substr(1)));\n\t\t\t}\n\t\t}\n\t\tif (ssu[0] === \"naive+https\" || ssu[0] === \"naive+quic\") {\n\t\t\tif (has_singbox) {\n\t\t\t\tdom_prefix = \"singbox_\"\n\t\t\t\topt.set('type', \"sing-box\");\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'protocol', \"naive\");\n\t\t\tvar _parsedUrl = new URL(\"http://\" + ssu[1]);\n\t\t\tvar username = _parsedUrl.username;\n\t\t\tvar password = _parsedUrl.password;\n\t\t\tvar hostname = _parsedUrl.hostname;\n\t\t\tvar port = _parsedUrl.port;\n\t\t\tvar search = _parsedUrl.search;\n\t\t\tvar hash = _parsedUrl.hash;\n\t\t\tif (!username || !password) {  //某些链接会把username和password之间的:进行编码\n\t\t\t\tconst decoded = decodeURIComponent(username || password || \"\");\n\t\t\t\tconst i = decoded.indexOf(\":\");\n\t\t\t\tif (i > -1) {\n\t\t\t\t\tusername = decoded.slice(0, i);\n\t\t\t\t\tpassword = decoded.slice(i + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'username', decodeURIComponent(username));\n\t\t\topt.set(dom_prefix + 'password', decodeURIComponent(password));\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(hostname));\n\t\t\topt.set(dom_prefix + 'port', port || \"443\");\n\t\t\tvar queryParam = {};\n\t\t\tif (search.length > 1) {\n\t\t\t\tvar query = search.split('?')\n\t\t\t\tvar queryParams = query[1];\n\t\t\t\tvar queryArray = queryParams.split('&');\n\t\t\t\tvar params;\n\t\t\t\tfor (i = 0; i < queryArray.length; i++) {\n\t\t\t\t\tparams = queryArray[i].split('=');\n\t\t\t\t\tqueryParam[decodeURIComponent(params[0])] = decodeURIComponent(params[1] || '');\n\t\t\t\t}\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'naive_insecure_concurrency', queryParam['insecure-concurrency'] || '0');\n\t\t\topt.set(dom_prefix + 'uot', (queryParam.uot ?? '0') === '1');\n\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || '');\n\t\t\topt.set(dom_prefix + 'ech', !!queryParam.ech);\n\t\t\topt.set(dom_prefix + 'ech_config', queryParam.ech || '');\n\t\t\tif (ssu[0] === \"naive+quic\") {\n\t\t\t\topt.set(dom_prefix + 'naive_quic', true);\n\t\t\t\topt.set(dom_prefix + 'naive_congestion_control', queryParam.congestion_control || 'bbr');\n\t\t\t}\n\t\t\tif (hash) {\n\t\t\t\topt.set('remarks', decodeURIComponent(hash.substr(1)));\n\t\t\t}\n\t\t}\n\t\tif (dom_prefix && dom_prefix != null) {\n\t\t\tif (opt.get(dom_prefix + 'port').value) {\n\t\t\t\topt.get(dom_prefix + 'port').focus();\n\t\t\t\topt.get(dom_prefix + 'port').blur();\n\t\t\t}\n\t\t} else {\n\t\t\ts.innerHTML = \"<font color='red'><%:Invalid Share URL Format%></font>\";\n\t\t\tsessionStorage.removeItem(\"fromUrl\");\n\t\t\treturn false;\n\t\t}\n\t\ts.innerHTML = \"<font color='green'><%:Import Finished %></font>\";\n\t\tsessionStorage.removeItem(\"fromUrl\");\n\t\treturn true;\n\t}\n\n\tfunction exportConfigFile(btn, sid) {\n\t\twindow.open('<%=api.url(\"gen_client_config\")%>?id=' + sid, \"_blank\")\n\t}\n\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t\tsetTimeout(function () {\n\t\t\tconst fromUrlCache = JSON.parse(sessionStorage.getItem(\"fromUrl\"));\n\t\t\tif (fromUrlCache && fromUrlCache.savetime && (Date.now() - fromUrlCache.timestamp) < fromUrlCache.savetime) {\n\t\t\t\tfromUrl(null, fromUrlCache.urlname, fromUrlCache.sid, fromUrlCache)\n\t\t\t} else {\n\t\t\t\tsessionStorage.removeItem(\"fromUrl\");\n\t\t\t}\n\t\t}, 500);\n\t})\n\n//]]></script>\n<style>\n.share-toolbar {\n\tdisplay: inline-block;\n\ttext-align: center;\n\tpadding: 5px 0 5px;\n\twhite-space: nowrap;\n}\n@media screen and (max-width: 500px) {\n\t.share-toolbar {\n\t\twhite-space: normal;\n\t}\n}\n.toolbar-buttons .cbi-button {\n\tmargin-right: 2px;\n\tmargin-bottom: 2px;\n}\n.toolbar-buttons .cbi-button:last-child {\n\tmargin-right: 0;\n}\n.status-text {\n\tdisplay: none;\n}\n.status-text:not(:empty) {\n\tdisplay: inline-block;\n\tline-height: 1;\n\tpadding: 5px 0;\n}\n</style>\n<div class=\"share-toolbar\">\n\t<div class=\"toolbar-buttons\">\n\t\t<% if not current_node.protocol or not current_node.protocol:find(\"^_\") then -%>\n\t\t<input id=\"fromUrlBtn\" type=\"button\" class=\"btn cbi-button cbi-button-apply\" value='<%:From Share URL%>' onclick=\"return fromUrl(this, '<%=self.option%>', '<%=self.value%>')\" />\n\t\t<input id=\"exportUrlBtn\" type=\"button\" class=\"btn cbi-button cbi-button-apply\" value='<%:Build Share URL%>' onclick=\"return exportUrl(this, '<%=self.option%>', '<%=self.value%>')\" />\n\t\t<input id=\"genQrcodeBtn\" type=\"button\" class=\"btn cbi-button cbi-button-apply\" value='<%:Generate QRCode%>' onclick=\"return genQrcode(this, '<%=self.option%>', '<%=self.value%>')\" />\n\t\t<% end -%>\n\t\t<input id=\"exportConfigFileBtn\" type=\"button\" class=\"btn cbi-button cbi-button-apply\" value='<%:Export Config File%>' onclick=\"return exportConfigFile(this, '<%=self.value%>')\" />\n\t</div>\n\t<div id=\"qrcode_div\" style=\"padding:5px 0;display:none\">\n\t\t<div id=\"qrcode\" style=\"display:flex;justify-content:center;\"></div>\n\t</div>\n\t<div style=\"text-align:center;padding:0;min-height:0;line-height:1;\">\n\t\t<span id=\"<%=self.option%>-status\" class=\"status-text\"></span>\n\t</div>\n</div>\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/node_list/link_add_node.htm",
    "content": "<%\nlocal api = require \"luci.passwall.api\"\n-%>\n\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tfunction ajax_add_node(link, group) {\n\t\tconst dom = document.getElementById('modal-mask');\n\t\tdom.style.display = 'block';\n\t\tdom.innerHTML = '<div style=\"position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;\"><%:Processing, please wait…%></div>';\n\t\t\n\t\tconst chunkSize = 1000;  // 分片发送以突破uhttpd的限制，每块1000字符\n\t\tconst totalChunks = Math.ceil(link.length / chunkSize);\n\t\tlet currentChunk = 0;\n\n\t\tfunction sendNextChunk() {\n\t\t\tif (currentChunk < totalChunks) {\n\t\t\t\tconst chunk = link.substring(currentChunk * chunkSize, (currentChunk + 1) * chunkSize);\n\t\t\t\tconst xhr = new XMLHttpRequest();\n\t\t\t\txhr.open('POST', '<%=api.url(\"link_add_node\")%>', true);\n\t\t\t\txhr.onload = function () {\n\t\t\t\t\tif (xhr.status === 200) {\n\t\t\t\t\t\tcurrentChunk++;\n\t\t\t\t\t\tsendNextChunk();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdom.innerHTML = '';\n\t\t\t\t\t\tdom.style.display = 'none';\n\t\t\t\t\t\talert(\"<%:Error%>\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\txhr.onerror = function () {\n\t\t\t\t\tdom.innerHTML = '';\n\t\t\t\t\tdom.style.display = 'none';\n\t\t\t\t\talert(\"<%:Network Error%>\");\n\t\t\t\t\treturn;\n\t\t\t\t};\n\t\t\t\tconst formData = new FormData();\n\t\t\t\tformData.append(\"chunk\", chunk);\n\t\t\t\tformData.append(\"chunk_index\", currentChunk);\n\t\t\t\tformData.append(\"total_chunks\", totalChunks);\n\t\t\t\tformData.append(\"group\", group);\n\t\t\t\txhr.send(formData);\n\t\t\t} else {\n\t\t\t\twindow.location.href = '<%=api.url(\"node_list\")%>';\n\t\t\t}\n\t\t}\n\t\tsendNextChunk();\n\t}\n\n\tfunction decodeIfBase64(str) {\n\t\ttry {\n\t\t\tlet s = str.replace(/-/g, '+').replace(/_/g, '/');\n\t\t\twhile (s.length % 4) s += '=';\n\t\t\tconst decoded = decodeURIComponent(\n\t\t\t\tatob(s).split('').map(c =>\n\t\t\t\t\t'%' + c.charCodeAt(0).toString(16).padStart(2, '0')\n\t\t\t\t).join('')\n\t\t\t);\n\t\t\tif (btoa(unescape(encodeURIComponent(decoded))).replace(/=+$/, '') === s.replace(/=+$/, '')) {\n\t\t\t\treturn decoded;\n\t\t\t}\n\t\t} catch (e) {}\n\t\treturn str;\n\t}\n\n\tfunction getBg(el) {\n\t\tif (!el) return null;\n\t\tconst style = getComputedStyle(el);\n\t\tconst bgImage = style.backgroundImage;\n\t\tconst bgColor = style.backgroundColor;\n\t\treturn (bgImage !== 'none' || !/rgba\\([^,]+,[^,]+,[^,]+,\\s*0\\)/.test(bgColor) && bgColor !== 'transparent')\n\t\t\t? style.background\n\t\t\t: null;\n\t};\n\n\tfunction open_add_link_div() {\n\t\tdocument.body.classList.add('modal-open');\n\t\tdocument.getElementById('modal-mask').style.display = 'block';\n\t\tconst addLinkDiv = document.getElementById(\"add_link_div\");\n\t\taddLinkDiv.style.background = getBg(document.querySelector('.cbi-section')) || getBg(document.body) || '';\n\t\taddLinkDiv.style.display = \"block\";\n\t\tif (!addLinkDiv._dropdown_inited) {\n\t\t\taddLinkDiv._dropdown_inited = true;\n\t\t\tdropdown_list_fun(\"addlink_group_custom\");\n\t\t}\n\t\tdocument.getElementById(\"nodes_link\").focus();\n\t}\n\n\tfunction close_add_link_div() {\n\t\tdocument.getElementById('modal-mask').style.display = 'none';\n\t\tdocument.getElementById(\"add_link_div\").style.display = \"none\";\n\t\tdocument.body.classList.remove('modal-open');\n\t}\n\n\tfunction add_node() {\n\t\tlet nodes_link = document.getElementById(\"nodes_link\").value;\n\t\tconst group = (document.querySelector('#addlink_group_custom input[type=\"hidden\"]')?.value || \"default\");\n\t\tnodes_link = nodes_link.replace(/\\t/g, \"\").replace(/\\r\\n|\\r/g, \"\\n\").replace(/<[^>]*>/g, '').trim();\n\t\tif (nodes_link != \"\") {\n\t\t\tnodes_link = decodeIfBase64(nodes_link);\n\t\t\tlet s = nodes_link.split('://');\n\t\t\tif (s.length > 1) {\n\t\t\t\tclose_add_link_div();\n\t\t\t\tajax_add_node(nodes_link, group);\n\t\t\t} else {\n\t\t\t\talert(\"<%:Please enter the correct link.%>\");\n\t\t\t}\n\t\t} else {\n\t\t\tdocument.getElementById(\"nodes_link\").focus();\n\t\t}\n\t}\n\n\tfunction clear_all_nodes() {\n\t\tif (confirm('<%:Are you sure to clear all nodes?%>') == true){\n\t\t\tXHR.get('<%=api.url(\"clear_all_nodes\")%>', null,\n\t\t\tfunction(x, data) {\n\t\t\t\tif(x && x.status == 200) {\n\t\t\t\t\twindow.location.href = '<%=api.url(\"node_list\")%>';\n\t\t\t\t} else {\n\t\t\t\t\talert(\"<%:Error%>\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction open_reassign_group_div() {\n\t\tconst ids = [];\n\t\tconst visibleContainer = document.querySelector('#cbi-passwall-nodes > .cbi-tabcontainer[style*=\"display:block\"], #cbi-passwall-nodes > .cbi-tabcontainer[style*=\"display: block\"]');\n\t\tif (!visibleContainer) return;\n\t\tconst doms = visibleContainer.getElementsByClassName(\"nodes_select\");\n\t\tif (doms && doms.length > 0) {\n\t\t\tfor (let i = 0 ; i < doms.length; i++) {\n\t\t\t\tif (doms[i].checked) {\n\t\t\t\t\tids.push(doms[i].getAttribute(\"cbid\"))\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ids.length > 0) {\n\t\t\t\tdocument.body.classList.add('modal-open');\n\t\t\t\tdocument.getElementById('modal-mask').style.display = 'block';\n\t\t\t\tconst reassignGroupDiv = document.getElementById(\"reassign_group_div\");\n\t\t\t\treassignGroupDiv.style.background = getBg(document.querySelector('.cbi-section')) || getBg(document.body) || '';\n\t\t\t\treassignGroupDiv.style.display = \"block\";\n\t\t\t\tif (!reassignGroupDiv._dropdown_inited) {\n\t\t\t\t\treassignGroupDiv._dropdown_inited = true;\n\t\t\t\t\tdropdown_list_fun(\"reassign_group_custom\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\talert(\"<%:You no select nodes !%>\");\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction close_reassign_group_div() {\n\t\tdocument.getElementById('modal-mask').style.display = 'none';\n\t\tdocument.getElementById(\"reassign_group_div\").style.display = \"none\";\n\t\tdocument.body.classList.remove('modal-open');\n\t}\n\n\tfunction reassign_group() {\n\t\tconst ids = [];\n\t\tconst group = (document.querySelector('#reassign_group_custom input[type=\"hidden\"]')?.value || \"default\");\n\t\tconst visibleContainer = document.querySelector('#cbi-passwall-nodes > .cbi-tabcontainer[style*=\"display:block\"], #cbi-passwall-nodes > .cbi-tabcontainer[style*=\"display: block\"]');\n\t\tif (!visibleContainer) return;\n\t\tconst doms = visibleContainer.getElementsByClassName(\"nodes_select\");\n\t\tif (doms && doms.length > 0) {\n\t\t\tfor (let i = 0 ; i < doms.length; i++) {\n\t\t\t\tif (doms[i].checked) {\n\t\t\t\t\tids.push(doms[i].getAttribute(\"cbid\"))\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ids.length > 0) {\n\t\t\t\tXHR.get('<%=api.url(\"reassign_group\")%>', {\n\t\t\t\t\tgroup: group,\n\t\t\t\t\tids: ids.join(\",\")\n\t\t\t\t},\n\t\t\t\tfunction(x, data) {\n\t\t\t\t\tif (x && x.status == 200) {\n\t\t\t\t\t\twindow.location.href = '<%=api.url(\"node_list\")%>';\n\t\t\t\t\t} else {\n\t\t\t\t\t\talert(\"<%:Error%>\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t//自定义分组下拉列表事件\n\tfunction dropdown_list_fun(div_id) {\n\t\tconst dropdown = document.getElementById(div_id);\n\t\tif (!dropdown) return;\n\n\t\tconst display = dropdown.querySelector(\".selected-display\");\n\t\tconst displayText = display.querySelector(\".text\");\n\t\tconst list = dropdown.querySelector(\".dropdown-list\");\n\t\tconst hidden = dropdown.querySelector('input[type=\"hidden\"]');\n\t\tconst input = dropdown.querySelector(\".create-item-input\");\n\n\t\tdisplay.addEventListener(\"click\", function() {\n\t\t\tlist.style.display = list.style.display === \"none\" ? \"block\" : \"none\";\n\t\t\tinput.value = \"\";\n\t\t\t//input.focus();\n\t\t});\n\n\t\tfunction selectItem(li) {\n\t\t\tlist.querySelectorAll(\".dropdown-item\").forEach(function(el){\n\t\t\t\tel.classList.remove(\"selected\");\n\t\t\t});\n\t\t\tli.classList.add(\"selected\");\n\t\t\thidden.value = li.dataset.value;\n\t\t\tdisplayText.textContent = li.dataset.value || \"<%:default%>\";\n\t\t\tlist.style.display = \"none\";\n\t\t}\n\n\t\tlist.addEventListener(\"click\", function(e){\n\t\t\tconst li = e.target.closest(\".dropdown-item\");\n\t\t\tif (!li || li.classList.contains(\"custom-input\")) return;\n\t\t\tselectItem(li);\n\t\t});\n\n\t\tinput.addEventListener(\"keydown\", function(e){\n\t\t\tconst isEnter = e.key === \"Enter\" || e.keyCode === 13;\n\t\t\tif (!isEnter) return;\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\n\t\t\tconst val = input.value.trim();\n\t\t\tif (!val) return;\n\n\t\t\tif (val.toLowerCase() === \"default\") {\n\t\t\t\tconst emptyLi = Array.from(list.querySelectorAll(\".dropdown-item\"))\n\t\t\t\t\t.find(function(el){ return !el.dataset.value; });\n\t\t\t\tif (emptyLi) selectItem(emptyLi);\n\t\t\t\tinput.value = \"\";\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet li = Array.from(list.querySelectorAll(\".dropdown-item\")).find(function(el){\n\t\t\t\treturn el.dataset.value && el.dataset.value.toLowerCase() === val.toLowerCase();\n\t\t\t});\n\t\t\tif (!li) {\n\t\t\t\tli = document.createElement(\"li\");\n\t\t\t\tli.className = \"dropdown-item\";\n\t\t\t\tli.dataset.value = val;\n\t\t\t\tli.textContent = val;\n\t\t\t\tlist.insertBefore(li, input.parentNode); \n\t\t\t}\n\n\t\t\tinput.value = \"\";\n\t\t\tselectItem(li);\n\t\t});\n\t\t// 从tab中读取分组名称\n\t\tfunction InsertGroup(list, input) {\n\t\t\tconst tabs = document.querySelectorAll(\".cbi-tabmenu li\");\n\t\t\tif (!tabs.length) {\n\t\t\t\tsetTimeout(() => InsertGroup(list, input), 50);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttabs.forEach(function(li){\n\t\t\t\tconst group = li.id.split('.').pop();\n\t\t\t\tif(group === \"default\") return;\n\t\t\t\tif(Array.from(list.querySelectorAll(\".dropdown-item\")).some(el => el.dataset.value === group)) return;\n\t\t\t\tconst newLi = document.createElement(\"li\");\n\t\t\t\tnewLi.className = \"dropdown-item\";\n\t\t\t\tnewLi.dataset.value = group;\n\t\t\t\tnewLi.textContent = group;\n\t\t\t\tlist.insertBefore(newLi, input.parentNode);\n\t\t\t});\n\t\t}\n\t\tInsertGroup(list, input);\n\n\t\t// 点击外部时自动收起\n\t\tdocument.addEventListener(\"click\", function(e) {\n\t\t\tif (!dropdown.contains(e.target)) {\n\t\t\t\tlist.style.display = \"none\";\n\t\t\t}\n\t\t});\n\t}\n\t//]]>\n</script>\n\n<div id=\"modal-mask\"></div>\n\n<div id=\"add_link_div\">\n\t<div id=\"add_link_modal_container\">\n\t\t<h3><%:Add the node via the link%></h3>\n\t\t<div class=\"value-custom\">\n\t\t\t<textarea id=\"nodes_link\" rows=\"10\"></textarea>\n\t\t\t<p id=\"nodes_link_text\"><%:Enter share links, one per line. Subscription links are not supported!%></p>\n\t\t</div>\n\t\t<div class=\"value-custom\">\n\t\t\t<div class=\"value-field-custom\">\n\t\t\t\t<label class=\"value-title-custom\" for=\"addlink_group_custom\"><%:Group Name%></label>\n\t\t\t\t<div id=\"addlink_group_custom\" class=\"custom-dropdown\">\n\t\t\t\t\t<div class=\"selected-display\">\n\t\t\t\t\t\t<span class=\"text\"><%:default%></span>\n\t\t\t\t\t\t<span class=\"arrow-down-small\"></span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<ul class=\"dropdown-list\" style=\"display:none;\">\n\t\t\t\t\t\t<li class=\"dropdown-item selected\" data-value=\"\"><%:default%></li>\n\t\t\t\t\t\t<li class=\"dropdown-item custom-input\">\n\t\t\t\t\t\t\t<input type=\"text\" placeholder=\"-- <%:custom%> --\" class=\"create-item-input\" inputmode=\"text\" enterkeyhint=\"done\">\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t\t<input type=\"hidden\" name=\"addlink_group\" value=\"\">\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div id=\"add_link_button_container\">\n\t\t\t<input class=\"btn cbi-button cbi-button-add\" type=\"button\" onclick=\"add_node()\" value=\"<%:Add%>\" />\n\t\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"close_add_link_div()\" value=\"<%:Close%>\" />\n\t\t</div>\n\t</div>\n</div>\n\n<div id=\"reassign_group_div\">\n\t<div id=\"reassign_group_modal_container\">\n\t\t<h3><%:Reassign Node Group%></h3>\n\t\t<div class=\"value-custom\">\n\t\t\t<div class=\"value-field-custom\">\n\t\t\t\t<label class=\"value-title-custom\" for=\"reassign_group_custom\"><%:Group Name%></label>\n\t\t\t\t<div id=\"reassign_group_custom\" class=\"custom-dropdown\">\n\t\t\t\t\t<div class=\"selected-display\">\n\t\t\t\t\t\t<span class=\"text\"><%:default%></span>\n\t\t\t\t\t\t<span class=\"arrow-down-small\"></span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<ul class=\"dropdown-list\" style=\"display:none;\">\n\t\t\t\t\t\t<li class=\"dropdown-item selected\" data-value=\"\"><%:default%></li>\n\t\t\t\t\t\t<li class=\"dropdown-item custom-input\">\n\t\t\t\t\t\t\t<input type=\"text\" placeholder=\"-- <%:custom%> --\" class=\"create-item-input\" inputmode=\"text\" enterkeyhint=\"done\">\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t\t<input type=\"hidden\" name=\"to_group\" value=\"\">\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div id=\"reassign_group_button_container\">\n\t\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" onclick=\"reassign_group()\" value=\"<%:Save%>\" />\n\t\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"close_reassign_group_div()\" value=\"<%:Close%>\" />\n\t\t</div>\n\t</div>\n</div>\n\n\n\n<div class=\"pw-toolbar\">\n\t<div class=\"pw-toolbar-field\">\n\t\t<input class=\"btn cbi-button cbi-button-add\" type=\"button\" onclick=\"to_add_node()\" value=\"<%:Add%>\" />\n\t\t<input class=\"btn cbi-button cbi-button-add\" type=\"button\" onclick=\"open_add_link_div()\" value=\"<%:Add the node via the link%>\" />\n\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"clear_all_nodes()\" value=\"<%:Clear all nodes%>\" />\n\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"delete_select_nodes()\" value=\"<%:Delete select nodes%>\" />\n\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" id=\"select_all_btn\" onclick=\"checked_all_node(this)\" value=\"<%:Select all%>\" />\n\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" onclick=\"open_reassign_group_div()\" value=\"<%:Reassign Group%>\" />\n\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"submit\" name=\"cbi.apply\" value=\"<%:Save & Apply%>\" />\n\t\t<!--<input class=\"btn cbi-button cbi-button-save\" type=\"submit\" name=\"cbi.save\" value=\"<%:Save%>\" />-->\n\t\t<!--<input class=\"btn cbi-button cbi-button-reset\" type=\"button\" value=\"<%:Reset%>\" onclick=\"location.href='<%=REQUEST_URI%>'\" />-->\n\t</div>\n</div>\n\n<style>\n\t.pw-toolbar {\n\t\twidth: 100%;\n\t\ttext-align: center;\n\t}\n\n\t.pw-toolbar-field {\n\t\twidth: 100%;\n\t\ttext-align: center;\n\t\tdisplay: inline-block;\n\t\tpadding: 5px 0 5px;\n\t}\n\n\t#modal-mask {\n\t\tdisplay: none;\n\t\tposition: fixed;\n\t\tleft: 0;\n\t\ttop: 0;\n\t\twidth: 100vw;\n\t\theight: 100vh;\n\t\tbackground: rgba(0,0,0,0.4);\n\t\tz-index: 999;\n\t}\n\n\tbody.modal-open {\n\t\toverflow: hidden;\n\t\tpointer-events: none;\n\t}\n\n\tbody.modal-open #add_link_div,\n\tbody.modal-open #reassign_group_div {\n\t\tpointer-events: auto;\n\t}\n\n\t#add_link_div, #reassign_group_div {\n\t\tdisplay: none;\n\t\tposition: fixed;\n\t\tleft: 50%;\n\t\ttop: 50%;\n\t\ttransform: translate(-50%, -50%);\n\t\tbackground: white;\n\t\tpadding: 20px;\n\t\tborder: 2px solid #ccc;\n\t\tbox-shadow: 0 0 10px rgba(0,0,0,0.5);\n\t\tz-index: 1000;\n\t\twidth: 90%;\n\t\tmax-width: 500px;\n\t}\n\n\t#add_link_modal_container, #reassign_group_modal_container {\n\t\twidth: 100%;\n\t\ttext-align: center;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tpadding-bottom: 20px;\n\t}\n\n\t#nodes_link {\n\t\twidth: 100%;\n\t\theight: 180px;\n\t\tresize: vertical;\n\t\tfont-family: monospace;\n\t\tpadding: 5px;\n\t\tborder: 1px solid #ccc;\n\t\tborder-radius: 5px;\n\t}\n\n\t#add_link_div h3,\n\t#reassign_group_div h3 {\n\t\tbackground: inherit;\n\t}\n\n\t#nodes_link_text {\n\t\tcolor: red;\n\t\tfont-size: 14px;\n\t\tmargin-top: 5px;\n\t\ttext-align: center;\n\t\twidth: 100%;\n\t}\n\n\t#add_link_button_container, #reassign_group_button_container {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\twidth: 100%;\n\t\tmax-width: 300px;\n\t\tmargin-top: 10px;\n\t}\n\n\t.value-custom {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\twidth: 100%;\n\t\tmargin: 10px 0;\n\t\tpadding: 0px 5px 0px 5px;\n\t}\n\n\t.value-field-custom {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 10px;\n\t}\n\n\t.value-title-custom {\n\t\tfont-size: 13px;\n\t\tline-height: 28px;\n\t\twhite-space: nowrap;\n\t\ttext-align: right;\n\t}\n\n\t.custom-dropdown {\n\t\tposition: relative;\n\t\tborder: 1px solid #d9d9d9;\n\t\tborder-radius: 2px;\n\t\twidth: 180px;\n\t\theight: 28px;\n\t\tfont-size: 13px;\n\t\tbackground: #fff;\n\t\tcursor: pointer;\n\t\tbox-sizing: border-box;\n\t\tdisplay: block;\n\t}\n\n\t.selected-display {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\talign-items: center;\n\t\tpadding: 0 8px;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tbox-sizing: border-box;\n\t\tfont-size: 12px;\n\t\tcolor: #666;\n\t}\n\n\t.selected-display:hover {\n\t\tbackground-color: #f7f7f7;\n\t}\n\n\t.dropdown-list {\n\t\tposition: absolute;\n\t\ttop: calc(100% + 2px);\n\t\tleft: -1px;\n\t\twidth: calc(100% + 2px);\n\t\tborder: 1px solid #d9d9d9;\n\t\tborder-radius: 2px;\n\t\tborder-top: none;\n\t\tbox-shadow: 0 1px 3px rgba(0,0,0,0.15);\n\t\tbackground: #fff;\n\t\tlist-style: none;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tmax-height: 200px;\n\t\toverflow-y: auto;\n\t\toverflow-x: hidden;\n\t\tz-index: 100;\n\t\tbox-sizing: border-box;\n\t\tcolor: #666;\n\t}\n\n\t.dropdown-item {\n\t\tpadding: 4px 8px;\n\t\tline-height: 20px;\n\t\tcursor: pointer;\n\t}\n\n\t.dropdown-item.selected {\n\t\tbackground-color: #1e90ff;\n\t\tcolor: #fff;\n\t}\n\n\t.create-item-input::placeholder {\n\t\ttext-align: center;\n\t}\n\n\t.dropdown-item.custom-input input {\n\t\twidth: 100%;\n\t\tbox-sizing: border-box;\n\t\tpadding: 3px;\n\t\tfont-size: 13px;\n\t\tline-height: 20px;\n\t\tborder: 1px solid #ccc;\n\t\ttext-align: left;\n\t}\n\n\t.arrow-down-small {\n\t\twidth: 0;\n\t\theight: 0;\n\t\tborder-left: 4px solid transparent;\n\t\tborder-right: 4px solid transparent;\n\t\tborder-top: 5px solid #555;\n\t\tdisplay: inline-block;\n\t\tvertical-align: middle;\n\t}\n</style>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/node_list/node_list.htm",
    "content": "<%\nlocal api = require \"luci.passwall.api\"\nlocal appname = api.appname\n-%>\n<script src=\"<%=resource%>/view/<%=appname%>/Sortable.min.js?v=1.15.7\"></script>\n\n<style>\ntable th, .table .th {\n\ttext-align: center;\n}\n\ntable td, .table .td {\n\ttext-align: center;\n\t/* white-space: nowrap; */\n\tword-break: keep-all;\n}\n\n#set_node_div {\n\tdisplay: none;\n\twidth: 30rem;\n\tposition: fixed;\n\ttop:50%;\n\tpadding-top: 30px;\n\tz-index: 99;\n\ttext-align: center;\n\tbackground: white;\n\tbox-shadow: darkgrey 10px 10px 30px 5px;\n}\n\n._now_use_bg {\n\tbackground: #5e72e445 !important;\n}\n\n.ping a,\n.ping_value a,\n.tcping_value a {\n    text-decoration: none;\n    cursor: pointer;\n}\n\n@media (prefers-color-scheme: dark) {\n\t._now_use_bg {\n\t\tbackground: #4a90e2 !important;\n\t}\n}\n\n.td.cbi-section-actions {\n\ttext-align: right !important;\n}\n\n.node-wrapper {\n\talign-items: center;\n\tdisplay: inline-flex !important;\n\tgap: 4px;\n}\n\n.cbi-tabmenu > li {\n\tmargin-right: 2px !important;\n}\n\n.cbi-tabmenu > li:last-child {\n\tmargin-right: 0 !important;\n}\n\n.node-wrapper .drag-handle {\n\tcursor: grab !important;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tfont-size: 20px;\n\tfont-weight: 100;\n\tpadding: 0 !important;\n\tline-height: inherit;\n\tuser-select: none;\n\talign-self: stretch;\n\tbackground-color: transparent;\n}\n\n.node-wrapper .drag-handle:hover {\n\tbackground: transparent;\n}\n\n#cbi-<%=appname%>-nodes .pw-checkbox, #cbi-<%=appname%>-nodes th:nth-child(1) {\n\tpadding-right: 0px;\n}\n\n#select_all_btn {\n\tdisplay: none;\n}\n\n/* enable flex for small screens*/\n@media screen and (max-width: 1152px) {\n\t.cbi-section-table-row {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tflex-wrap: wrap;\n\t\tjustify-content: space-between;\n\t}\n\n\t#cbi-<%=appname%>-nodes-default-fieldset {\n\t\tmargin: 0;\n\t}\n\n\t.cbi-section-table-titles {\n\t\tdisplay: none !important;\n\t}\n\n\t/* meticulously control how each component occupies the limited space we have */\n\t#cbi-<%=appname%>-nodes .pw-checkbox, #cbi-<%=appname%>-nodes th:nth-child(1) {\n\t\tflex: 0 0 40px;\n\t\tmin-width: 0;\n\t}\n\n\t#cbi-<%=appname%>-nodes .pw-remark {\n\t\tflex: 1 1 30%;\n\t\tmin-width: 0;\n\t}\n\n\t#cbi-<%=appname%>-nodes .pw-ping, #cbi-<%=appname%>-nodes .pw-tcping, #cbi-<%=appname%>-nodes .pw-urltest {\n\t\tflex: 0 0 50px;\n\t\twhite-space: nowrap;\n\t\tmin-width: 0;\n\t}\n\n\t.pw-actions {\n\t\tpadding-top: 0 !important;\n\t\tborder-top-width: 0 !important;\n\t\tflex: 1 1 350px;\n\t}\n\n\t#select_all_btn {\n\t\tdisplay: inline-block !important;\n\t}\n}\n\n/* shrink actionbar even further for mobile devices */\n@media screen and (max-width: 500px) {\n\t.node-wrapper {\n\t\tgap: 0;\n\t}\n\n\t.cbi-button {\n\t\tmargin-left: 0 !important;\n\t\tmargin-right: 1px !important;\n\t}\n\n\t.pw-actions {\n\t\tpadding-left: 5px!important;\n\t\tpadding-right: 5px !important;\n\t}\n}\n\n.sortable-chosen {\n\tbackground-color: rgba(220, 235, 245, 0.4) !important;\n\topacity: 0.7;\n}\n\n.sortable-ghost {\n\tbackground: #cce5ff !important;\n\theight: 3px !important;\n}\n\n.dragging-row {\n\tbackground-color: rgba(131, 191, 255, 0.7) !important;\n\tbox-shadow: 0 4px 6px rgba(0,0,0,0.1);\n}\n</style>\n\n<% if api.is_js_luci() then -%>\n<script type=\"text/javascript\">\n\tvar cbi_t = [];\n\tfunction cbi_t_add(section, tab) {\n\t\tvar t = document.getElementById('tab.' + section + '.' + tab);\n\t\tvar c = document.getElementById('container.' + section + '.' + tab);\n\n\t\tif( t && c ) {\n\t\t\tcbi_t[section] = (cbi_t[section] || [ ]);\n\t\t\tcbi_t[section][tab] = { 'tab': t, 'container': c, 'cid': c.id };\n\t\t}\n\t}\n\n\tfunction cbi_t_switch(section, tab) {\n\t\tif( cbi_t[section] && cbi_t[section][tab] ) {\n\t\t\t//在切换选项卡之前，先取消当前激活选项卡的全选状态\n\t\t\tdechecked_all_node();\n\t\t\tvar o = cbi_t[section][tab];\n\t\t\tvar h = document.getElementById('tab.' + section);\n\t\t\tfor( var tid in cbi_t[section] ) {\n\t\t\t\tvar o2 = cbi_t[section][tid];\n\t\t\t\tif( o.tab.id != o2.tab.id ) {\n\t\t\t\t\to2.tab.className = o2.tab.className.replace(/(^| )cbi-tab( |$)/, \" cbi-tab-disabled \");\n\t\t\t\t\to2.container.style.display = 'none';\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif(h) h.value = tab;\n\t\t\t\t\to2.tab.className = o2.tab.className.replace(/(^| )cbi-tab-disabled( |$)/, \" cbi-tab \");\n\t\t\t\t\to2.container.style.display = 'block';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n</script>\n<%- else %>\n<script type=\"text/javascript\">\n\t(function() {\n\t\tif (typeof(cbi_t_switch) === \"function\") {\n\t\t\tvar old_switch = cbi_t_switch;\n\t\t\tcbi_t_switch = function(section, tab) {\n\t\t\t\tdechecked_all_node();\n\t\t\t\treturn old_switch(section, tab);\n\t\t\t};\n\t\t}\n\t})();\n</script>\n<%- end %>\n\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tlet auto_detection_time = \"<%=api.uci_get_type(\"global_other\", \"auto_detection_time\", \"0\")%>\"\n\tlet show_node_info = \"<%=api.uci_get_type(\"global_other\", \"show_node_info\", \"0\")%>\"\n\tvar ajaxList = [];\n\n\tvar ajax = {\n\t\tpost: function(url, data, fn_success, timeout, fn_timeout) {\n\t\t\tvar xhr = new XMLHttpRequest();\n\t\t\tvar code = ajax.encode(data);\n\t\t\txhr.open(\"POST\", url, true);\n\t\t\txhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n\n\t\t\tif (timeout && timeout > 1000) {\n\t\t\t\txhr.timeout = timeout;\n\t\t\t}\n\t\t\tif (fn_timeout) {\n\t\t\t\txhr.ontimeout = function() {\n\t\t\t\t\tfn_timeout(xhr);\n\t\t\t\t}\n\t\t\t}\n\t\t\txhr.onreadystatechange = function() {\n\t\t\t\tif(xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 304)) {\n\t\t\t\t\tvar json = null;\n\t\t\t\t\tif (xhr.getResponseHeader(\"Content-Type\") == \"application/json\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tjson = eval('(' + xhr.responseText + ')');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch(e) {\n\t\t\t\t\t\t\tjson = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfn_success(xhr, json);\n\t\t\t\t}\n\t\t\t};\n\t\t\tajaxList.push(xhr);\n\t\t\txhr.send(code);\n\t\t},\n\t\tencode: function(obj) {\n\t\t\tobj = obj ? obj : { };\n\t\t\tobj['_'] = Math.random();\n\n\t\t\tif (typeof obj == 'object')\n\t\t\t{\n\t\t\t\tvar code = '';\n\t\t\t\tvar self = this;\n\n\t\t\t\tfor (var k in obj)\n\t\t\t\t\tcode += (code ? '&' : '') +\n\t\t\t\t\t\tk + '=' + encodeURIComponent(obj[k]);\n\n\t\t\t\treturn code;\n\t\t\t}\n\n\t\t\treturn obj;\n\t\t}\n\t}\n\n\tfunction ajaxAbortAll() {\n\t\tajaxList.forEach(xhr => xhr.abort());\n\t\tajaxList = [];\n\t}\n\n\tfunction to_add_node() {\n\t\tajaxAbortAll();\n\t\tconst dom = document.getElementsByClassName(\"cbi-tab\")[0];\n\t\tconst current_group = dom ? (dom.getAttribute(\"group_name\") || \"default\") : \"default\";\n\t\twindow.location.href = '<%=api.url(\"add_node\")%>?redirect=1&group=' + current_group;\n\t}\n\n\tfunction to_edit_node(cbi_id) {\n\t\tajaxAbortAll();\n\t\tlocation.href='<%=api.url(\"node_config\")%>/' + cbi_id;\n\t}\n\n\tfunction copy_node(cbi_id) {\n\t\tajaxAbortAll();\n\t\twindow.location.href = '<%=api.url(\"copy_node\")%>' + \"?section=\" + cbi_id;\n\t}\n\n\tfunction del_node(cbi_id) {\n\t\tajaxAbortAll();\n\t\twindow.location.href = '<%=api.url(\"delete_select_nodes\")%>' + \"?redirect=1&ids=\" + cbi_id;\n\t}\n\n\tvar section = \"\";\n\tfunction open_set_node_div(cbi_id) {\n\t\tsection = cbi_id;\n\t\tdocument.getElementById(\"set_node_div\").style.display=\"block\";\n\t\tvar node_name = document.getElementById(\"cbid.<%=appname%>.\" + cbi_id + \".remarks\").value;\n\t\tdocument.getElementById(\"set_node_name\").innerHTML = node_name;\n\t}\n\n\tfunction close_set_node_div() {\n\t\tdocument.getElementById(\"set_node_div\").style.display=\"none\";\n\t\tdocument.getElementById(\"set_node_name\").innerHTML = \"\";\n\t}\n\n\tfunction row_top(btn, group) {\n\t\tconst row = btn.closest(\"tr\");\n\t\tif (!row) return;\n\t\tconst parent = row.parentNode;\n\t\tlet firstDataRow = parent.querySelector(\"tr:not(.cbi-section-table-titles)\");\n\t\tif (firstDataRow && firstDataRow !== row) {\n\t\t\tparent.insertBefore(row, firstDataRow);\n\t\t\tlet save_order_btn = document.getElementById(\"save_order_btn_\" + group);\n\t\t\tif (save_order_btn) {\n\t\t\t\tconst new_order = get_node_order(group);\n\t\t\t\tif (!arraysEqual(new_order, origin_group_node_order[group])) {\n\t\t\t\t\tsave_order_btn.style.display = null;\n\t\t\t\t} else {\n\t\t\t\t\tsave_order_btn.style.display = \"none\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction set_select_all_state(sectionChecked) {\n\t\tvar visibleContainer = document.querySelector('#cbi-<%=appname%>-nodes > .cbi-tabcontainer[style*=\"display:block\"], #cbi-<%=appname%>-nodes > .cbi-tabcontainer[style*=\"display: block\"]');\n\t\tif (!visibleContainer) return;\n\t\tvar nodes = visibleContainer.getElementsByClassName(\"nodes_select\");\n\t\tvar selectAllChk = visibleContainer.querySelector(\".nodes_select_all\");\n\t\tvar selectAllBtn = document.getElementById(\"select_all_btn\");\n\t\tfor (var i = 0; i < nodes.length; i++) {\n\t\t\tnodes[i].checked = sectionChecked;\n\t\t}\n\t\tif (selectAllChk) {\n\t\t\tselectAllChk.checked = sectionChecked;\n\t\t\tselectAllChk.title = sectionChecked ? \"<%:DeSelect all%>\" : \"<%:Select all%>\";\n\t\t\tselectAllChk.setAttribute(\"onclick\", sectionChecked ? \"dechecked_all_node(this)\" : \"checked_all_node(this)\");\n\t\t}\n\t\tif (selectAllBtn) {\n\t\t\tselectAllBtn.value = sectionChecked ? \"<%:DeSelect all%>\" : \"<%:Select all%>\";\n\t\t\tselectAllBtn.setAttribute(\"onclick\", sectionChecked ? \"dechecked_all_node(this)\" : \"checked_all_node(this)\");\n\t\t}\n\t}\n\n\tfunction checked_all_node(btn) {\n\t\tset_select_all_state(true);\n\t}\n\n\tfunction dechecked_all_node(btn) {\n\t\tset_select_all_state(false);\n\t}\n\n\tfunction update_select_state() {\n\t\tvar visibleContainer = document.querySelector('#cbi-<%=appname%>-nodes > .cbi-tabcontainer[style*=\"display:block\"], #cbi-<%=appname%>-nodes > .cbi-tabcontainer[style*=\"display: block\"]');\n\t\tif (!visibleContainer) return;\n\t\tvar nodes = visibleContainer.getElementsByClassName(\"nodes_select\");\n\t\tif (!nodes.length) return;\n\t\tvar selectAllChk = visibleContainer.querySelector(\".nodes_select_all\");\n\t\tvar selectAllBtn = document.getElementById(\"select_all_btn\");\n\t\tvar checkedCount = 0;\n\t\tfor (var i = 0; i < nodes.length; i++) {\n\t\t\tif (nodes[i].checked) checkedCount++;\n\t\t}\n\t\tvar allChecked = checkedCount === nodes.length;\n\t\tvar title = allChecked ? \"<%:DeSelect all%>\" : \"<%:Select all%>\";\n\t\tvar onclickFunc = allChecked ? \"dechecked_all_node(this)\" : \"checked_all_node(this)\";\n\n\t\tfunction updateElement(el) {\n\t\t\tif (!el) return;\n\t\t\tif (\"checked\" in el) el.checked = allChecked;\n\t\t\tif (\"title\" in el) el.title = title;\n\t\t\tif (\"value\" in el) el.value = title;\n\t\t\tel.setAttribute(\"onclick\", onclickFunc);\n\t\t}\n\n\t\tupdateElement(selectAllChk);\n\t\tupdateElement(selectAllBtn);\n\t}\n\n\tfunction delete_select_nodes() {\n\t\tvar ids = [];\n\t\tvar visibleContainer = document.querySelector('#cbi-<%=appname%>-nodes > .cbi-tabcontainer[style*=\"display:block\"], #cbi-<%=appname%>-nodes > .cbi-tabcontainer[style*=\"display: block\"]');\n\t\tif (!visibleContainer) return;\n\t\tvar doms = visibleContainer.getElementsByClassName(\"nodes_select\");\n\t\tif (doms && doms.length > 0) {\n\t\t\tfor (var i = 0 ; i < doms.length; i++) {\n\t\t\t\tif (doms[i].checked) {\n\t\t\t\t\tids.push(doms[i].getAttribute(\"cbid\"))\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ids.length > 0) {\n\t\t\t\tconst dom = document.getElementById('modal-mask');\n\t\t\t\tif (confirm('<%:Are you sure to delete select nodes?%>') == true) {\n\t\t\t\t\tdom.style.display = 'block';\n\t\t\t\t\tdom.innerHTML = '<div style=\"position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;\"><%:Processing, please wait…%></div>';\n\t\t\t\t\tXHR.get('<%=api.url(\"delete_select_nodes\")%>', {\n\t\t\t\t\t\tids: ids.join()\n\t\t\t\t\t},\n\t\t\t\t\tfunction(x, data) {\n\t\t\t\t\t\tdom.innerHTML = '';\n\t\t\t\t\t\tdom.style.display = 'none';\n\t\t\t\t\t\tif (x && x.status == 200) {\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tfor (var i = 0 ; i < ids.length; i++) {\n\t\t\t\t\t\t\t\tvar box = document.getElementById(\"cbi-<%=appname%>-\" + ids[i]);\n\t\t\t\t\t\t\t\tbox.remove();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\tajaxAbortAll();\n\t\t\t\t\t\t\twindow.location.href = '<%=api.url(\"node_list\")%>';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\talert(\"<%:Error%>\");\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (ids.length <= 0) {\n\t\t\talert(\"<%:You no select nodes !%>\");\n\t\t}\n\t}\n\n\tfunction set_node(protocol) {\n\t\tif (confirm('<%:Are you sure set to%> ' + protocol.toUpperCase() + '<%:the server?%>')==true){\n\t\t\tajaxAbortAll();\n\t\t\twindow.location.href = '<%=api.url(\"set_node\")%>?protocol=' + protocol + '&section=' + section;\n\t\t}\n\t}\n\n\tfunction get_address_full(id) {\n\t\tvar address = (document.getElementById(\"cbid.<%=appname%>.\" + id + \".address\") || {}).value || \"\";\n\t\tvar port = (document.getElementById(\"cbid.<%=appname%>.\" + id + \".port\") || {}).value || \"\";\n\t\t//判断是否含有汉字\n\t\tvar reg = /[\\u4E00-\\u9FFF]+/;\n\t\taddress = !reg.test(address) ? address : \"\";\n\t\treturn { address: address, port: port };\n\t}\n\n\tfunction get_node_order(group) {\n\t\tlet table = document.getElementById(\"cbi-<%=appname%>-nodes-\" + group + \"-table\");\n\t\tif (!table) {\n\t\t\treturn;\n\t\t}\n\t\tlet rows = table.querySelectorAll(\"tr.cbi-section-table-row\");\n\t\tif (!rows || rows.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tvar ids = [];\n\t\trows.forEach(function(row) {\n\t\t\tvar id = row.id.replace(\"cbi-<%=appname%>-\", \"\");\n\t\t\tids.push(id);\n\t\t});\n\t\treturn ids;\n\t}\n\n\tfunction save_current_page_order(group) {\n\t\tvar table = document.getElementById(\"cbi-<%=appname%>-nodes-\" + group + \"-table\");\n\t\tif (!table) {\n\t\t\talert(\"<%:No table!%>\");\n\t\t\treturn;\n\t\t}\n\t\tvar rows = table.querySelectorAll(\"tr.cbi-section-table-row\");\n\t\tif (!rows || rows.length === 0) {\n\t\t\talert(\"<%:No nodes!%>\");\n\t\t\treturn;\n\t\t}\n\t\tvar btn = document.getElementById(\"save_order_btn_\" + group);\n\t\tif (btn) {\n\t\t\tbtn.style.display = \"none\";\n\t\t\tbtn.disabled = true;\n\t\t}\n\t\tvar ids = [];\n\t\trows.forEach(function(row) {\n\t\t\tvar id = row.id.replace(\"cbi-<%=appname%>-\", \"\");\n\t\t\tids.push(id);\n\t\t});\n\t\tXHR.get('<%=api.url(\"save_node_order\")%>', {\n\t\t\t\tgroup: group,\n\t\t\t\tids: ids.join(\",\")\n\t\t\t},\n\t\t\tfunction(x, result) {\n\t\t\t\tif (btn) {\n\t\t\t\t\tbtn.style.display = null;\n\t\t\t\t\tbtn.disabled = false;\n\t\t\t\t}\n\t\t\t\tif (x && x.status === 200) {\n\t\t\t\t\torigin_group_node_order[group] = get_node_order(group);\n\t\t\t\t\talert(\"<%:Saved current page order successfully.%>\");\n\t\t\t\t\tif (btn) {\n\t\t\t\t\t\tbtn.style.display = \"none\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\talert(\"<%:Save failed!%>\");\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\t//获取当前使用的节点\n\tfunction get_now_use_node() {\n\t\tXHR.get('<%=api.url(\"get_now_use_node\")%>', null,\n\t\t\tfunction(x, result) {\n\t\t\t\tvar id = result[\"TCP\"];\n\t\t\t\tif (id) {\n\t\t\t\t\tvar dom = document.getElementById(\"cbi-<%=appname%>-\" + id);\n\t\t\t\t\tif (dom) {\n\t\t\t\t\t\tdom.title = '<%=api.i18n.translatef(\"Currently using %s node\", \"TCP\")%>';\n\t\t\t\t\t\tdom.classList.add(\"_now_use_bg\");\n\t\t\t\t\t\t//var v = \"<a style='color: red'>当前TCP节点：</a>\" + document.getElementById(\"cbid.<%=appname%>.\" + id + \".remarks\").value;\n\t\t\t\t\t\t//document.getElementById(\"cbi-<%=appname%>-\" + id + \"-remarks\").innerHTML = v;\n\t\t\t\t\t\tvar dom_remarks = dom.querySelector(\"td.pw-remark\");\n\t\t\t\t\t\tif (dom_remarks) {\n\t\t\t\t\t\t\tdom_remarks.style.color = 'red';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tid = result[\"UDP\"];\n\t\t\t\tif (id) {\n\t\t\t\t\tvar dom = document.getElementById(\"cbi-<%=appname%>-\" + id);\n\t\t\t\t\tif (dom) {\n\t\t\t\t\t\tif (result[\"TCP\"] == result[\"UDP\"]) {\n\t\t\t\t\t\t\tdom.title = '<%=api.i18n.translatef(\"Currently using %s node\", \"TCP/UDP\")%>';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdom.title = '<%=api.i18n.translatef(\"Currently using %s node\", \"UDP\")%>';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdom.classList.add(\"_now_use_bg\");\n\t\t\t\t\t\tvar dom_remarks = dom.querySelector(\"td.pw-remark\");\n\t\t\t\t\t\tif (dom_remarks) {\n\t\t\t\t\t\t\tdom_remarks.style.color = 'red';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\tfunction urltest_node(cbi_id, dom) {\n\t\tif (dom.dataset.busy == \"1\" || !cbi_id) return;\n\t\tdom.dataset.busy = \"1\";\n\t\tdom.style.color = \"\";\n\t\tdom.innerText = \"<%:Check...%>\";\n\t\tXHR.get('<%=api.url(\"urltest_node\")%>', {\n\t\t\t\tid: cbi_id\n\t\t\t},\n\t\t\tfunction(x, result) {\n\t\t\t\tlet color = \"red\";\n\t\t\t\tlet text = \"<%:Error%>\";\n\t\t\t\tif (x && x.status == 200) {\n\t\t\t\t\tif (result.use_time == null || result.use_time.trim() == \"\") {\n\t\t\t\t\t\ttext = \"<%:Timeout%>\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlet use_time = parseInt(result.use_time);\n\t\t\t\t\t\tif (use_time < 1000)\n\t\t\t\t\t\t\tcolor = \"green\";\n\t\t\t\t\t\telse if (use_time < 2000)\n\t\t\t\t\t\t\tcolor = \"#fb9a05\";\n\t\t\t\t\t\ttext = use_time + \" ms\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdom.innerText = text;\n\t\t\t\tdom.style.color = color;\n\t\t\t\tdom.dataset.busy = \"0\";\n\t\t\t}\n\t\t);\n\t}\n\n\tfunction ping_node(cbi_id, dom, type) {\n\t\tif (dom.dataset.busy == \"1\" || !cbi_id) return;\n\t\tconst full = get_address_full(cbi_id);\n\t\tif ((type == \"icmp\" && full.address != \"\" ) || (type == \"tcping\" && full.address != \"\" && full.port != \"\")) {\n\t\t\tdom.dataset.busy = \"1\";\n\t\t\tdom.style.color = \"\";\n\t\t\tdom.innerText = \"<%:Check...%>\";\n\t\t\tXHR.get('<%=api.url(\"ping_node\")%>', {\n\t\t\t\t\taddress: full.address,\n\t\t\t\t\tport: full.port,\n\t\t\t\t\ttype: type\n\t\t\t\t},\n\t\t\t\tfunction(x, result) {\n\t\t\t\t\tlet color = \"red\";\n\t\t\t\t\tlet text = \"<%:Error%>\";\n\t\t\t\t\tif(x && x.status == 200) {\n\t\t\t\t\t\tif (result.ping == null || result.ping.trim() == \"\") {\n\t\t\t\t\t\t\ttext = \"<%:Timeout%>\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar ping = parseInt(result.ping);\n\t\t\t\t\t\t\tif (ping < 100)\n\t\t\t\t\t\t\t\tcolor = \"green\";\n\t\t\t\t\t\t\telse if (ping < 200)\n\t\t\t\t\t\t\t\tcolor = \"#fb9a05\";\n\t\t\t\t\t\t\ttext = result.ping + \" ms\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdom.innerText = text;\n\t\t\t\t\tdom.style.color = color;\n\t\t\t\t\tdom.dataset.busy = \"0\";\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t}\n\n\t/* 自动Ping */\n\tfunction pingAllNodes() {\n\t\tif (auto_detection_time == \"icmp\" || auto_detection_time == \"tcping\") {\n\t\t\tconst now = Date.now();\n\t\t\tconst nodes = [];\n\t\t\tconst ping_value = document.getElementsByClassName(auto_detection_time == \"tcping\" ? 'tcping_value' : 'ping_value');\n\t\t\tfor (let i = 0; i < ping_value.length; i++) {\n\t\t\t\tconst cbi_id = ping_value[i].getAttribute(\"cbiid\");\n\t\t\t\tconst full = get_address_full(cbi_id);\n\t\t\t\tif ((auto_detection_time == \"icmp\" && full.address != \"\" ) || (auto_detection_time == \"tcping\" && full.address != \"\" && full.port != \"\")) {\n\t\t\t\t\tlet flag = false;\n\t\t\t\t\t// Merge duplicates\n\t\t\t\t\tfor (let j = 0; j < nodes.length; j++) {\n\t\t\t\t\t\tif (nodes[j].address == full.address && nodes[j].port == full.port) {\n\t\t\t\t\t\t\tnodes[j].indexs = nodes[j].indexs + \",\" + i;\n\t\t\t\t\t\t\tflag = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (flag)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tconst cacheData = JSON.parse(localStorage.getItem(auto_detection_time + \":\" + full.address + \":\" + full.port));\n\t\t\t\t\tif (cacheData && cacheData.savetime && (now - cacheData.timestamp) < cacheData.savetime) {\n\t\t\t\t\t\tconst a = ping_value[i].firstElementChild;\n\t\t\t\t\t\tlet color = \"red\";\n\t\t\t\t\t\tif (cacheData.value < 100)\n\t\t\t\t\t\t\tcolor = \"green\";\n\t\t\t\t\t\telse if (cacheData.value < 200)\n\t\t\t\t\t\t\tcolor = \"#fb9a05\";\n\t\t\t\t\t\ta.innerText = cacheData.value + \" ms\";\n\t\t\t\t\t\ta.style.color = color;\n\t\t\t\t\t\ta.onclick = function () {\n\t\t\t\t\t\t\tping_node(cbi_id, this, auto_detection_time);\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlocalStorage.removeItem(auto_detection_time + \":\" + full.address + \":\" + full.port);\n\t\t\t\t\t\tnodes.push({\n\t\t\t\t\t\t\tindexs: i + \"\",\n\t\t\t\t\t\t\taddress: full.address,\n\t\t\t\t\t\t\tport: full.port\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst _xhr = (index) => {\n\t\t\t\treturn new Promise((res) => {\n\t\t\t\t\tconst dom = nodes[index];\n\t\t\t\t\tif (!dom) res()\n\t\t\t\t\tajax.post('<%=api.url(\"ping_node\")%>', {\n\t\t\t\t\t\tindex: dom.indexs,\n\t\t\t\t\t\taddress: dom.address,\n\t\t\t\t\t\tport: dom.port,\n\t\t\t\t\t\ttype: auto_detection_time\n\t\t\t\t\t},\n\t\t\t\t\tfunction(x, result) {\n\t\t\t\t\t\tif (x && x.status == 200) {\n\t\t\t\t\t\t\tlet strs = dom.indexs.split(\",\");\n\t\t\t\t\t\t\tfor (let i = 0; i < strs.length; i++) {\n\t\t\t\t\t\t\t\tconst a = ping_value[strs[i]].firstElementChild;\n\t\t\t\t\t\t\t\tconst cbi_id = ping_value[strs[i]].getAttribute(\"cbiid\");\n\t\t\t\t\t\t\t\tlet color = \"red\";\n\t\t\t\t\t\t\t\tlet text = \"<%:Timeout%>\";\n\t\t\t\t\t\t\t\tif (result.ping !== null && result.ping.trim() !== \"\") {\n\t\t\t\t\t\t\t\t\tlet ping = parseInt(result.ping);\n\t\t\t\t\t\t\t\t\t//save to cache\n\t\t\t\t\t\t\t\t\tconst cache_data = {\n\t\t\t\t\t\t\t\t\t\tdom_id: strs[i],\n\t\t\t\t\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t\t\t\t\t\tsavetime: 60 * 1000,\n\t\t\t\t\t\t\t\t\t\tvalue: ping\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\ttext = result.ping + \" ms\";\n\t\t\t\t\t\t\t\t\tlocalStorage.setItem(auto_detection_time + \":\" + dom.address + \":\" + dom.port, JSON.stringify(cache_data));\n\t\t\t\t\t\t\t\t\tif (ping < 100)\n\t\t\t\t\t\t\t\t\t\tcolor = \"green\";\n\t\t\t\t\t\t\t\t\telse if (ping < 200)\n\t\t\t\t\t\t\t\t\t\tcolor = \"#fb9a05\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ta.innerText = text;\n\t\t\t\t\t\t\t\ta.style.color = color;\n\t\t\t\t\t\t\t\ta.onclick = function () {\n\t\t\t\t\t\t\t\t\tping_node(cbi_id, this, auto_detection_time);\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tres();\n\t\t\t\t\t},\n\t\t\t\t\t5000,\n\t\t\t\t\tfunction(x) {\n\t\t\t\t\t\tlet strs = dom.indexs.split(\",\");\n\t\t\t\t\t\tfor (let i = 0; i < strs.length; i++) {\n\t\t\t\t\t\t\tconst a = ping_value[strs[i]].firstElementChild;\n\t\t\t\t\t\t\tconst cbi_id = ping_value[strs[i]].getAttribute(\"cbiid\");\n\t\t\t\t\t\t\ta.innerText = \"<%:Timeout%>\";\n\t\t\t\t\t\t\ta.style.color = \"red\";\n\t\t\t\t\t\t\ta.onclick = function () {\n\t\t\t\t\t\t\t\tping_node(cbi_id, this, auto_detection_time);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tres();\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tlet task = -1;\n\t\t\tconst thread = () => {\n\t\t\t\ttask = task + 1\n\t\t\t\tif (nodes[task]) {\n\t\t\t\t\t_xhr(task).then(thread);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (let i = 0; i < 20; i++) {\n\t\t\t\tthread()\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction arraysEqual(a, b) {\n\t\tif (a === b) return true;\n\t\tif (a == null || b == null) return false;\n\t\tif (a.length !== b.length) return false;\n\t\tfor (let i = 0; i < a.length; i++) {\n\t\t\tif (a[i] !== b[i]) return false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t//列表拖动重排\n\tfunction initSortableForTable(table) {\n\t\tif (!table) return null;\n\t\tlet group = table.id.replace(\"cbi-<%=appname%>-nodes-\", \"\").replace(\"-table\", \"\")\n\t\tvar root = table.querySelector('tbody') || table;\n\t\tif (root._sortable_initialized) return root._sortable_instance;\n\t\troot._sortable_initialized = true;\n\t\tvar opts = {\n\t\t\thandle: \".drag-handle\",\n\t\t\tdraggable: \"tr.cbi-section-table-row\",\n\t\t\tanimation: 150,\n\t\t\tghostClass: \"dragging-row\",\n\t\t\tfallbackOnBody: true,\n\t\t\tforceFallback: false,\n\t\t\tswapThreshold: 0.65,\n\t\t\tonEnd: function (evt) {\n\t\t\t\t//save_current_page_order(group); // 自动提交保存\n\t\t\t\tlet save_order_btn = document.getElementById(\"save_order_btn_\" + group);\n\t\t\t\tif (save_order_btn) {\n\t\t\t\t\tconst new_order = get_node_order(group);\n\t\t\t\t\tif (!arraysEqual(new_order, origin_group_node_order[group])) {\n\t\t\t\t\t\tsave_order_btn.style.display = null;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsave_order_btn.style.display = \"none\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\ttry {\n\t\t\tvar instance = Sortable.create(root, opts);\n\t\t\troot._sortable_instance = instance;\n\t\t\treturn instance;\n\t\t} catch (err) {\n\t\t\troot._sortable_initialized = false;\n\t\t\tconsole.error(\"Sortable init failed:\", err);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tfunction initAllSortable(group_nodes) {\n\t\tif (typeof Sortable === 'undefined') {\n\t\t\tvar retries = 0;\n\t\t\tvar maxRetries = 25;\n\t\t\tvar t = setInterval(function () {\n\t\t\t\tretries++;\n\t\t\t\tif (typeof Sortable !== 'undefined') {\n\t\t\t\t\tclearInterval(t);\n\t\t\t\t\tfor (var group in group_nodes) {\n\t\t\t\t\t\tvar table = document.getElementById(\"cbi-<%=appname%>-nodes-\" + group + \"-table\");\n\t\t\t\t\t\tinitSortableForTable(table);\n\t\t\t\t\t}\n\t\t\t\t} else if (retries >= maxRetries) {\n\t\t\t\t\tclearInterval(t);\n\t\t\t\t}\n\t\t\t}, 200);\n\t\t} else {\n\t\t\tfor (var group in group_nodes) {\n\t\t\t\tvar table = document.getElementById(\"cbi-<%=appname%>-nodes-\" + group + \"-table\");\n\t\t\t\tinitSortableForTable(table);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction escape_html(s) {\n\t\treturn s.replace(/[&<>\"']/g, c => ({\n\t\t\t\"&\":\"&amp;\", \"<\":\"&lt;\", \">\":\"&gt;\", '\"':\"&quot;\", \"'\":\"&#39;\"\n\t\t}[c]));\n\t}\n</script>\n\n<script type=\"text/template\" id=\"nodes-table-template\">\n\t<fieldset class=\"cbi-section cbi-tblsection\" id=\"cbi-<%=appname%>-nodes-{{group}}-fieldset\">\n\t\t<table class=\"table cbi-section-table\" id=\"cbi-<%=appname%>-nodes-{{group}}-table\" style=\"\">\n\t\t\t<tr class=\"tr cbi-section-table-titles anonymous\">\n\t\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:20px\">\n\t\t\t\t\t<input class=\"cbi-input-checkbox nodes_select_all\" type=\"checkbox\" onclick=\"checked_all_node(this)\" title=\"<%:Select all%>\"/>\n\t\t\t\t</th>\n\t\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:40%\"><%:Remarks%></th>\n\t\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:8%\">Ping</th>\n\t\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:8%\">TCPing</th>\n\t\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:8%\"><%:URL Test%></th>\n\t\t\t\t<th class=\"th cbi-section-table-cell cbi-section-actions\"></th>\n\t\t\t</tr>\n\t\t\t{{node-tr}}\n\t\t</table>\n\t\t<div class=\"cbi-section-create cbi-tblsection-create\">\n\t\t\t<input class=\"cbi-button cbi-button-add\" type=\"button\" value=\"<%:Add%>\" onclick=\"to_add_node()\">\n\t\t\t<input class=\"cbi-button cbi-button-apply\" style=\"display: none\" type=\"button\" id=\"save_order_btn_{{group}}\" value=\"<%:Save Order%>\" onclick=\"save_current_page_order('{{group}}')\">\n\t\t</div>\n\t</fieldset>\n</script>\n\n<script type=\"text/template\" id=\"node-tr-template\">\n\t<tr class=\"tr cbi-section-table-row\" id=\"cbi-<%=appname%>-{{id}}\">\n\t\t<input class=\"hidden\" id=\"cbid.<%=appname%>.{{id}}.remarks\" value=\"{{remarks_val}}\"/>\n\t\t<input class=\"hidden\" id=\"cbid.<%=appname%>.{{id}}.address\" value=\"{{address_val}}\"/>\n\t\t<input class=\"hidden\" id=\"cbid.<%=appname%>.{{id}}.port\" value=\"{{port_val}}\"/>\n\t\t<td class=\"td cbi-value-field pw-checkbox\">\n\t\t\t<input class=\"cbi-input-checkbox nodes_select\" type=\"checkbox\" cbid=\"{{id}}\" onclick=\"update_select_state()\"/>\n\t\t</td>\n\t\t<td class=\"td cbi-value-field pw-remark\">{{remarks}}</td>\n\t\t<td class=\"td cbi-value-field pw-ping\">{{ping}}</td>\n\t\t<td class=\"td cbi-value-field pw-tcping\">{{tcping}}</td>\n\t\t<td class=\"td cbi-value-field pw-urltest\">{{url_test}}</td>\n\t\t<td class=\"td cbi-section-table-cell nowrap cbi-section-actions pw-actions\">\n\t\t\t<div class=\"node-wrapper\">\n\t\t\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" value=\"<%:To Top%>\" onclick=\"row_top(this, '{{group}}')\" title=\"<%:To Top%>\"/>\n\t\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" value=\"<%:Use%>\" id=\"apply_{{id}}\" onclick=\"open_set_node_div('{{id}}')\"/>\n\t\t\t\t<input class=\"btn cbi-button cbi-button-add\" type=\"button\" value=\"<%:Copy%>\" onclick=\"copy_node('{{id}}')\"/>\n\t\t\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" value=\"<%:Edit%>\" onclick=\"to_edit_node('{{id}}')\" alt=\"<%:Edit%>\" title=\"<%:Edit%>\">\n\t\t\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" value=\"<%:Delete%>\" onclick=\"del_node('{{id}}')\" alt=\"<%:Delete%>\" title=\"<%:Delete%>\">\n\t\t\t\t<span class=\"drag-handle center\" title=\"<%:Drag to reorder%>\">⠿</span>\n\t\t\t</div>\n\t\t</td>\n\t</tr>\n</script>\n\n<fieldset class=\"cbi-section\" id=\"node_list\">\n</fieldset>\n\n<script type=\"text/javascript\">\n\tfunction get_remarks_name(o) {\n\t\tlet str = \"\";\n\t\tlet remarks = o[\"remarks\"] || \"\";\n\t\tlet type = o[\"type\"] || \"\";\n\t\tstr += \"<input type='hidden' id='cbid.<%=appname%>.\" + o[\".name\"] + \".type' value='\" + type + \"'/>\";\n\t\tif (type == \"sing-box\" || type == \"Xray\") {\n\t\t\tlet protocol = o[\"protocol\"]\n\t\t\tlet p = \"\";\n\t\t\tif (protocol == \"_balancing\") {\n\t\t\t\tp = \"<%:Balancing%>\";\n\t\t\t} else if (protocol == \"_urltest\") {\n\t\t\t\tp = \"URLTest\";\n\t\t\t} else if (protocol == \"_shunt\") {\n\t\t\t\tp = \"<%:Shunt%>\";\n\t\t\t} else if (protocol == \"vmess\") {\n\t\t\t\tp = \"VMess\";\n\t\t\t} else if (protocol == \"vless\") {\n\t\t\t\tp = \"VLESS\";\n\t\t\t} else if (protocol == \"shadowsocks\") {\n\t\t\t\tp = \"SS\";\n\t\t\t} else if (protocol == \"shadowsocksr\") {\n\t\t\t\tp = \"SSR\";\n\t\t\t} else if (protocol == \"wireguard\") {\n\t\t\t\tp = \"WG\";\n\t\t\t} else if (protocol == \"hysteria\") {\n\t\t\t\tp = \"HY\";\n\t\t\t} else if (protocol == \"hysteria2\") {\n\t\t\t\tp = \"HY2\";\n\t\t\t} else if (protocol == \"anytls\") {\n\t\t\t\tp = \"AnyTLS\";\n\t\t\t} else if (protocol == \"ssh\") {\n\t\t\t\tp = \"SSH\";\n\t\t\t} else {\n\t\t\t\tif (protocol && protocol.length > 1) {\n\t\t\t\t\tp = protocol.charAt(0).toUpperCase() + protocol.slice(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (type == \"sing-box\") {\n\t\t\t\ttype = \"Sing-Box\";\n\t\t\t}\n\t\t\ttype += \" \" + p;\n\t\t}\n\t\tlet address = o[\"address\"] || \"\";\n\t\tlet port = o[\"port\"] || \"\";\n\t\tlet port_s = \"\";\n\t\tif (port != \"\") {\n\t\t\tport_s = port;\n\t\t} else {\n\t\t\tport_s = o[\"hysteria_hop\"] || o[\"hysteria2_hop\"];\n\t\t}\n\t\tstr += type + \"：\" + remarks;\n\t\treturn str;\n\t}\n\n\tfunction loadNodeList() {\n\t\tXHR.get('<%=api.url(\"get_node\")%>', null, function(x, result) {\n\t\t\tvar node_list = result\n\n\t\t\tvar group_nodes = {}\n\t\t\tfor (let i = 0; i < node_list.length; i++) {\n\t\t\t\tlet _node = node_list[i]\n\t\t\t\tif (!_node.group || _node.group === \"\") {\n\t\t\t\t\t_node.group = \"default\"\n\t\t\t\t}\n\t\t\t\tif (!group_nodes[_node.group]) {\n\t\t\t\t\tgroup_nodes[_node.group] = []\n\t\t\t\t}\n\t\t\t\tgroup_nodes[_node.group].push(_node)\n\t\t\t}\n\n\t\t\tvar tab_ul_html = '<ul class=\"cbi-tabmenu\">'\n\t\t\tvar tab_ul_li_html = ''\n\t\t\tvar tab_content_html = '<fieldset class=\"cbi-section-node cbi-section-node-tabbed\" id=\"cbi-<%=appname%>-nodes\">'\n\t\t\tvar nodes_table_template = document.getElementById(\"nodes-table-template\");\n\t\t\tvar node_template = document.getElementById(\"node-tr-template\");\n\t\t\tvar default_group = null\n\t\t\tfor (let group in group_nodes) {\n\t\t\t\tif (default_group == null)\n\t\t\t\t\tdefault_group = group\n\n\t\t\t\tvar table_html = \"\";\n\t\t\t\tif (true) {\n\t\t\t\t\t//Node List\n\t\t\t\t\tvar new_nodes_table_dom = nodes_table_template.cloneNode(true);\n\t\t\t\t\tvar _html = new_nodes_table_dom.innerHTML;\n\t\t\t\t\t_html = _html.split(\"{{group}}\").join(group);\n\t\t\t\t\tvar node_tr_html = \"\";\n\t\t\t\t\tfor (var i = 0; i < group_nodes[group].length; i++) {\n\t\t\t\t\t\tlet o = group_nodes[group][i]\n\t\t\t\t\t\tvar newDom = node_template.cloneNode(true);\n\t\t\t\t\t\tnewDom.classList.add(\"cbi-rowstyle-\" + (i % 2 + 1));\n\t\t\t\t\t\tvar innerHTML = newDom.innerHTML;\n\t\t\t\t\t\tif (auto_detection_time != \"icmp\" && o[\"address\"] && o[\"port\"]) {\n\t\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{ping}}\").join('<span class=\"ping\"><a href=\"javascript:void(0)\" onclick=\"javascript:ping_node(\\'{{id}}\\', this, \\'icmp\\')\"><%:Test%></a></span>');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{ping}}\").join('<span class=\"ping_value\" cbiid=\"{{id}}\"><a href=\"javascript:void(0)\" style=\"color:inherit\">---</a></span>');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (auto_detection_time != \"tcping\" && o[\"address\"] && o[\"port\"]) {\n\t\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{tcping}}\").join('<span class=\"ping\"><a href=\"javascript:void(0)\" onclick=\"javascript:ping_node(\\'{{id}}\\', this, \\'tcping\\')\"><%:Test%></a></span>');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{tcping}}\").join('<span class=\"tcping_value\" cbiid=\"{{id}}\"><a href=\"javascript:void(0)\" style=\"color:inherit\">---</a></span>');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (o[\"protocol\"] && o[\"protocol\"] === '_shunt') {\n\t\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{url_test}}\").join('<span class=\"ping\" cbiid=\"{{id}}\">---</span>');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{url_test}}\").join('<span class=\"ping\"><a href=\"javascript:void(0)\" onclick=\"javascript:urltest_node(\\'{{id}}\\', this)\" title=\"<%:TLS handshake test, latency for reference only%>\"><%:Test%></a></span>');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{id}}\").join(o[\".name\"]);\n\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{group}}\").join(o[\"group\"] || \"\");\n\t\t\t\t\t\tlet node_remarks = get_remarks_name(o);\n\t\t\t\t\t\tif (show_node_info == \"1\") {\n\t\t\t\t\t\t\tif (o[\"address\"] && o[\"port\"]) {\n\t\t\t\t\t\t\t\tlet _address = o[\"address\"]\n\t\t\t\t\t\t\t\tif (o[\"full_address\"])\n\t\t\t\t\t\t\t\t\t_address = o[\"full_address\"]\n\t\t\t\t\t\t\t\tnode_remarks += \"<br>\" + _address + \":\" + o[\"port\"]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{remarks}}\").join(node_remarks);\n\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{remarks_val}}\").join(o[\"remarks\"]);\n\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{address_val}}\").join(o[\"address\"] || \"\");\n\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{port_val}}\").join(o[\"port\"] || \"\");\n\n\t\t\t\t\t\tnode_tr_html += innerHTML\n\t\t\t\t\t}\n\t\t\t\t\t_html = _html.split(\"{{node-tr}}\").join(node_tr_html);\n\t\t\t\t\ttable_html = _html;\n\t\t\t\t}\n\n\t\t\t\tvar group_name = group\n\t\t\t\tif (group === \"default\") {\n\t\t\t\t\tgroup_name = \"<%:default%>\"\n\t\t\t\t}\n\n\t\t\t\ttab_ul_li_html +=\n\t\t\t\t\t'<li group_name=\"' + group + '\" id=\"tab.<%=appname%>.nodes.' + group + '\" class=\"cbi-tab\">' +\n\t\t\t\t\t\t'<a onclick=\"this.blur(); return cbi_t_switch(\\'<%=appname%>.nodes\\', \\'' + group + '\\')\" href=\"<%=REQUEST_URI%>?tab.<%=appname%>.nodes=' + group + '\">' + escape_html(group_name) + \" | \" + \"<font style='color: red'>\" + group_nodes[group].length + '</font></a>' +\n\t\t\t\t\t'</li>'\n\t\t\t\ttab_content_html +=\n\t\t\t\t\t'<div class=\"cbi-tabcontainer\" id=\"container.<%=appname%>.nodes.' + group + '\" style=\"display: none;\">' +\n\t\t\t\t\t'' + table_html +\n\t\t\t\t\t'</div>'\n\t\t\t}\n\n\t\t\ttab_ul_html += tab_ul_li_html + '</ul>'\n\t\t\ttab_content_html += '</fieldset>'\n\t\t\tvar tab_html = tab_ul_html + tab_content_html\n\n\t\t\tdocument.getElementById(\"node_list\").innerHTML = tab_html\n\n\t\t\tfor (let group in group_nodes) {\n\t\t\t\tcbi_t_add(\"<%=appname%>.nodes\", group)\n\t\t\t}\n\n\t\t\tif (default_group) {\n\t\t\t\tcbi_t_switch(\"<%=appname%>.nodes\", default_group)\n\t\t\t}\n\n\t\t\torigin_group_node_order = {};\n\t\t\tfor (let group in group_nodes) {\n\t\t\t\torigin_group_node_order[group] = get_node_order(group);\n\t\t\t}\n\n\t\t\tinitAllSortable(group_nodes);\n\n\t\t\t//clear expire data\n\t\t\tif (localStorage && localStorage.length > 0) {\n\t\t\t\tconst now = Date.now();\n\t\t\t\tfor (let i = 0; i < localStorage.length; i++) {\n\t\t\t\t\tlet key = localStorage.key(i);\n\t\t\t\t\tif (key && (key.startsWith(\"icmp\") || key.startsWith(\"tcping\"))) {\n\t\t\t\t\t\tlet value_str = localStorage.getItem(key);\n\t\t\t\t\t\tconst value = JSON.parse(value_str);\n\t\t\t\t\t\tif (!(value && value.savetime && (now - value.timestamp) < value.savetime)) {\n\t\t\t\t\t\t\tlocalStorage.removeItem(key);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tget_now_use_node();\n\n\t\t\tpingAllNodes();\n\t\t});\n\t}\n\n\tloadNodeList();\n\n\t//Node list option saving logic\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t\tfunction waitForElement(selector, callback) {\n\t\t\tconst el = document.querySelector(selector);\n\t\t\tif (el) return callback(el);\n\t\t\tconst observer = new MutationObserver(() => {\n\t\t\t\tconst el = document.querySelector(selector);\n\t\t\t\tif (el) {\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t\tcallback(el);\n\t\t\t\t}\n\t\t\t});\n\t\t\tobserver.observe(document.body, { childList: true, subtree: true });\n\t\t}\n\n\t\tfunction onChange(option, value) {\n\t\t\tXHR.get('<%=api.url(\"save_node_list_opt\")%>', {\n\t\t\t\toption: option,\n\t\t\t\tvalue: value\n\t\t\t}, function(x) {\n\t\t\t\tif (x && x.status == 200) {\n\t\t\t\t\tdocument.getElementById(\"node_list\").innerHTML = \"\";\n\t\t\t\t\tloadNodeList();\n\t\t\t\t} else {\n\t\t\t\t\talert(\"<%:Error%>\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\twaitForElement('input[type=\"checkbox\"][name*=\"<%=appname%>\"][name*=\"show_node_info\"]', function(el) {\n\t\t\tel.addEventListener(\"change\", () => {\n\t\t\t\tel.blur();\n\t\t\t\tshow_node_info = el.checked ? \"1\" : \"0\";\n\t\t\t\tonChange(\"show_node_info\", show_node_info);\n\t\t\t});\n\t\t});\n\n\t\twaitForElement('select[name*=\"<%=appname%>\"][name*=\"auto_detection_time\"]', function(el) {\n\t\t\tel.addEventListener(\"change\", () => {\n\t\t\t\tel.blur();\n\t\t\t\tauto_detection_time = el.value;\n\t\t\t\tonChange(\"auto_detection_time\", auto_detection_time);\n\t\t\t});\n\t\t});\n\t});\n\t//]]>\n</script>\n\n<div style=\"display: -webkit-flex; display: flex; -webkit-align-items: center; align-items: center; -webkit-justify-content: center; justify-content: center;\">\n\t<div id=\"set_node_div\" style=\"text-align: center;\">\n\t\t<div class=\"cbi-value\" style=\"display: flex; justify-content: center; align-items: center; margin: 8px 0;\">\n\t\t\t<font color=#666><%:You choose node is:%></font><a style=\"color: red\" id=\"set_node_name\"></a>\n\t\t</div>\n\t\t<div class=\"cbi-value\" style=\"display: flex; justify-content: center; gap: 8px; margin: 8px 0;\">\n\t\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" onclick=\"set_node('tcp')\" value=\"TCP\" />\n\t\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" onclick=\"set_node('udp')\" value=\"UDP\" />\n\t\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"close_set_node_div()\" value=\"<%:Close%>\" />\n\t\t</div>\n\t</div>\n</div>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/node_subscribe/js.htm",
    "content": "<%\nlocal api = require \"luci.passwall.api\"\n-%>\n<script src=\"<%=resource%>/view/<%=api.appname%>/Sortable.min.js?v=1.15.7\"></script>\n\n<style>\ntable .cbi-button-up,\ntable .cbi-button-down,\n.td.cbi-section-actions .cbi-button-up,\n.td.cbi-section-actions .cbi-button-down {\n\tdisplay: none !important;\n}\n\n.drag-handle {\n\tvertical-align: middle;\n\tcursor: grab !important;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tfont-size: 20px;\n\tfont-weight: 100;\n\tpadding: 0 !important;\n\tline-height: inherit;\n\tuser-select: none;\n\talign-self: stretch;\n\tbackground-color: transparent;\n}\n\n.drag-handle:hover {\n\tbackground: transparent;\n}\n\n.dragging-row {\n\tbackground-color: rgba(131, 191, 255, 0.7) !important;\n\tbox-shadow: 0 4px 6px rgba(0,0,0,0.1);\n}\n\n@media screen and (max-width: 1152px) {\n\t#cbi-<%=api.appname%>-subscribe_list .cbi-section-table-titles {\n\t\tdisplay: none !important;\n\t}\n}\n</style>\n\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tvar appname = \"<%= api.appname %>\"\n\n\tfunction confirmDeleteNode(remark) {\n\t\tif (!confirm(\"<%:Delete the subscribed node%>: \" + remark + \" ?\"))\n\t\t\treturn false;\n\n\t\tfetch('<%= api.url(\"subscribe_del_node\") %>?remark=' + encodeURIComponent(remark), {\n\t\t\tmethod: \"GET\"\n\t\t}).then(res => {\n\t\t\tif (res.ok) {\n\t\t\t\tlocation.reload();\n\t\t\t} else {\n\t\t\t\talert(\"<%:Failed to delete.%>\");\n\t\t\t}\n\t\t});\n\t\treturn false;\n\t}\n\n\tfunction confirmDeleteAll() {\n\t\tif (!confirm(\"<%:Are you sure you want to delete all subscribed nodes?%>\"))\n\t\t\treturn false;\n\n\t\tfetch('<%= api.url(\"subscribe_del_all\") %>', {\n\t\t\tmethod: \"GET\"\n\t\t}).then(res => {\n\t\t\tif (res.ok) {\n\t\t\t\tlocation.reload();\n\t\t\t} else {\n\t\t\t\talert(\"<%:Failed to delete.%>\");\n\t\t\t}\n\t\t});\n\t\treturn false;\n\t}\n\n\tfunction ManualSubscribe(sectionId) {\n\t\tvar urlInput = document.querySelector(\"input[name='cbid.\" + appname + \".\" + sectionId + \".url']\");\n\t\tvar currentUrl = urlInput ? urlInput.value.trim() : \"\";\n\t\tif (!currentUrl) {\n\t\t\talert(\"<%:Subscribe URL cannot be empty.%>\");\n\t\t\treturn;\n\t\t}\n\n\t\tfetch('<%= api.url(\"subscribe_manual\") %>?section='\n\t\t\t+ encodeURIComponent(sectionId)\n\t\t\t+ '&url='\n\t\t\t+ encodeURIComponent(currentUrl))\n\t\t.then(response => response.json())\n\t\t.then(data => {\n\t\t\tif (!data.success) {\n\t\t\t\talert(data.msg || \"Operation failed\");\n\t\t\t} else {\n\t\t\t\twindow.location.href = '<%= api.url(\"log\") %>'\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction ManualSubscribeAll() {\n\t\tvar sectionIds = [];\n\t\tvar urls = [];\n\n\t\tvar table = document.getElementById(\"cbi-\" + appname + \"-subscribe_list\");\n\t\tvar editBtns = table ? table.getElementsByClassName(\"cbi-button cbi-button-edit\") : [];\n\n\t\tfor (var i = 0; i < editBtns.length; i++) {\n\t\t\tvar btn = editBtns[i];\n\t\t\tvar onclickStr = btn.getAttribute(\"onclick\");\n\t\t\tif (!onclickStr) continue;\n\n\t\t\tvar id = onclickStr.substring(onclickStr.lastIndexOf('/') + 1, onclickStr.length - 1);\n\t\t\tif (!id) continue;\n\n\t\t\tvar urlInput = document.querySelector(\"input[name='cbid.\" + appname + \".\" + id + \".url']\");\n\t\t\tvar currentUrl = urlInput ? urlInput.value.trim() : \"\";\n\t\t\tif (!currentUrl) {\n\t\t\t\talert(\"<%:Subscribe URL cannot be empty.%>\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsectionIds.push(id);\n\t\t\turls.push(currentUrl);\n\t\t}\n\n\t\tif (sectionIds.length === 0) {\n\t\t\t//alert(\"No subscriptions found.\");\n\t\t\treturn;\n\t\t}\n\n\t\tvar params = new URLSearchParams();\n\t\tparams.append(\"sections\", sectionIds.join(\",\"));\n\t\tparams.append(\"urls\", urls.join(\",\"));\n\n\t\tfetch('<%= api.url(\"subscribe_manual_all\") %>', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: params\n\t\t})\n\t\t.then(response => response.json())\n\t\t.then(data => {\n\t\t\tif (!data.success) {\n\t\t\t\talert(data.msg || \"Operation failed\");\n\t\t\t} else {\n\t\t\t\twindow.location.href = '<%= api.url(\"log\") %>'\n\t\t\t}\n\t\t});\n\t}\n\n\t//订阅列表添加拖拽排序\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t\tfunction initSortableForTable() {\n\t\t\tvar section = document.getElementById(\"cbi-<%=api.appname%>-subscribe_list\");\n\t\t\tif (!section) return;\n\n\t\t\thideSortColumn(section);\n\n\t\t\t// === 插入 drag handle ===\n\t\t\tvar rows = section.querySelectorAll(\"tr\");\n\t\t\trows.forEach(function(row) {\n\t\t\t\tvar btn = row.querySelector(\".cbi-button-remove:last-of-type\");\n\t\t\t\tif (!btn) return;\n\t\t\t\tif (btn.nextElementSibling && btn.nextElementSibling.classList.contains(\"drag-handle\")) return;\n\t\t\t\tvar handle = document.createElement(\"span\");\n\t\t\t\thandle.className = \"drag-handle center\";\n\t\t\t\thandle.title = \"<%:Drag to reorder%>\";\n\t\t\t\thandle.innerHTML = \"⠿\";\n\t\t\t\tbtn.after(handle);\n\t\t\t});\n\n\t\t\t// === 初始化 Sortable ===\n\t\t\tvar table = section.getElementsByTagName(\"table\")[0];\n\t\t\tif (!table) return;\n\t\t\tvar root = table.tBodies[0] || table;\n\t\t\tif (root._sortable_initialized) return root._sortable_instance;\n\t\t\troot._sortable_initialized = true;\n\n\t\t\t// 保存原始顺序\n\t\t\troot._origOrder = getCurrentOrder(root);\n\n\t\t\ttry {\n\t\t\t\troot._sortable_instance = Sortable.create(root, {\n\t\t\t\t\thandle: \".drag-handle\",\n\t\t\t\t\tdraggable: \"tr.cbi-section-table-row\",\n\t\t\t\t\tanimation: 150,\n\t\t\t\t\tghostClass: \"dragging-row\",\n\t\t\t\t\tfallbackOnBody: true,\n\t\t\t\t\tforceFallback: false,\n\t\t\t\t\tswapThreshold: 0.65,\n\t\t\t\t\tonEnd: function (evt) {\n\t\t\t\t\t\tupdateHiddenInput(root, section);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn root._sortable_instance;\n\t\t\t} catch (e) {\n\t\t\t\troot._sortable_initialized = false;\n\t\t\t\tconsole.error(\"Sortable init failed:\", e);\n\t\t\t}\n\t\t}\n\n\t\t// 获取 table 当前行顺序\n\t\tfunction getCurrentOrder(root) {\n\t\t\tvar order = [];\n\t\t\tvar rows = root.querySelectorAll(\"tr.cbi-section-table-row\");\n\t\t\trows.forEach(function (tr) {\n\t\t\t\tvar id = tr.id || \"\";\n\t\t\t\tif (id.startsWith(\"cbi-<%=api.appname%>-\"))\n\t\t\t\t\tid = id.replace(\"cbi-<%=api.appname%>-\", \"\");\n\t\t\t\torder.push(id);\n\t\t\t});\n\t\t\treturn order;\n\t\t}\n\n\t\t// 拖拽完成后更新 hidden input\n\t\tfunction updateHiddenInput(root, section) {\n\t\t\tvar newOrder = getCurrentOrder(root);\n\t\t\tvar changed = newOrder.join(\" \") !== root._origOrder.join(\" \");\n\t\t\tvar hiddenInput = section.querySelector('input[type=\"hidden\"][id^=\"cbi.sts.\"]');\n\t\t\tif (hiddenInput) {\n\t\t\t\thiddenInput.value = changed ? newOrder.join(\" \") : \"\";\n\t\t\t}\n\t\t}\n\n\t\t// 隐藏18.06 up/down 列\n\t\tfunction hideSortColumn(section) {\n\t\t\tvar table = section.querySelector(\"table\");\n\t\t\tif (!table) return;\n\t\t\tvar ths = Array.prototype.slice.call(table.querySelectorAll(\"tr.cbi-section-table-titles > th\"));\n\t\t\tvar dataRows = table.querySelectorAll(\"tr.cbi-section-table-row\");\n\t\t\tif (!ths.length || !dataRows.length) return;\n\t\t\tvar sortCol = -1;\n\t\t\tfor (var i = 0; i < ths.length; i++) {\n\t\t\t\tvar hasSort = false, invalid = false;\n\t\t\t\tdataRows.forEach(function(tr) {\n\t\t\t\t\tvar td = tr.querySelectorAll(\":scope > td\")[i];\n\t\t\t\t\tif (!td) return;\n\t\t\t\t\tif (td.querySelector(\".cbi-button-edit, .cbi-button-remove\")) invalid = true;\n\t\t\t\t\tif (td.querySelector(\".cbi-button-up, .cbi-button-down\")) hasSort = true;\n\t\t\t\t});\n\t\t\t\tif (!invalid && hasSort) { sortCol = i; break; }\n\t\t\t}\n\t\t\tif (sortCol === -1) return;\n\t\t\tvar rows = [table.querySelector(\"tr.cbi-section-table-titles\")].concat(\n\t\t\t\tArray.prototype.slice.call(dataRows),\n\t\t\t\tArray.prototype.slice.call(table.querySelectorAll(\"tr.cbi-section-table-descr\"))\n\t\t\t);\n\t\t\trows.forEach(function(tr) {\n\t\t\t\tvar cells = Array.prototype.filter.call(tr.children, function(el) {\n\t\t\t\t\treturn el.tagName === \"TH\" || el.tagName === \"TD\";\n\t\t\t\t});\n\t\t\t\tif (cells[sortCol]) cells[sortCol].style.display = \"none\";\n\t\t\t});\n\t\t}\n\n\t\t// === 等待 TypedSection 行稳定 ===\n\t\t(function waitStable() {\n\t\t\tvar last = 0, stable = 0;\n\t\t\tvar THRESHOLD = 5;\n\t\t\tfunction tick() {\n\t\t\t\tvar count = document.querySelectorAll(\"tr.cbi-section-table-row\").length;\n\t\t\t\tif (count && count === last) stable++;\n\t\t\t\telse stable = 0;\n\n\t\t\t\tlast = count;\n\t\t\t\tif (stable >= THRESHOLD)\n\t\t\t\t\tsetTimeout(initSortableForTable, 200);\n\t\t\t\telse\n\t\t\t\t\trequestAnimationFrame(tick);\n\t\t\t}\n\t\t\ttick();\n\t\t})();\n\t});\n\t//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/rule/rule_version.htm",
    "content": "<%\nlocal api = require \"luci.passwall.api\"\nlocal fs = api.fs\nlocal has_old_geoip = fs.access(\"/tmp/bak_v2ray/geoip.dat\")\nlocal has_old_geosite = fs.access(\"/tmp/bak_v2ray/geosite.dat\")\n-%>\n<script src=\"<%=resource%>/view/<%=api.appname%>/Sortable.min.js?v=1.15.7\"></script>\n\n<style>\n\ttable .cbi-button-up,\n\ttable .cbi-button-down,\n\t.td.cbi-section-actions .cbi-button-up,\n\t.td.cbi-section-actions .cbi-button-down {\n\t\tdisplay: none !important;\n\t}\n\n\tdiv.cbi-value[id$=\"-gfwlist_update\"],\n\tdiv.cbi-value[id$=\"-chnroute_update\"],\n\tdiv.cbi-value[id$=\"-chnroute6_update\"],\n\tdiv.cbi-value[id$=\"-chnlist_update\"],\n\tdiv.cbi-value[id$=\"-geoip_update\"],\n\tdiv.cbi-value[id$=\"-geosite_update\"] {\n\t\tdisplay: none !important;\n\t}\n\n\t.drag-handle {\n\t\tvertical-align: middle;\n\t\tcursor: grab !important;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tfont-size: 20px;\n\t\tfont-weight: 100;\n\t\tpadding: 0 !important;\n\t\tline-height: inherit;\n\t\tuser-select: none;\n\t\talign-self: stretch;\n\t\tbackground-color: transparent;\n\t}\n\n\t.drag-handle:hover {\n\t\tbackground: transparent;\n\t}\n\n\t.dragging-row {\n\t\tbackground-color: rgba(131, 191, 255, 0.7) !important;\n\t\tbox-shadow: 0 4px 6px rgba(0,0,0,0.1);\n\t}\n</style>\n\n<div class=\"cbi-value\" id=\"_rule_div\">\n\t<label class=\"cbi-value-title\">\n\t\t<%:Update Options%>\n\t</label>\n\t<div class=\"cbi-value-field\">\n\t\t<div>\n\t\t\t<label>\n\t\t\t\t<input class=\"cbi-input-checkbox\" type=\"checkbox\" name=\"gfwlist\" value=\"1\" />\n\t\t\t\tgfwlist\n\t\t\t</label>\n\t\t\t<label>\n\t\t\t\t<input class=\"cbi-input-checkbox\" type=\"checkbox\" name=\"chnroute\" value=\"1\" />\n\t\t\t\tchnroute\n\t\t\t</label>\n\t\t\t<label>\n\t\t\t\t<input class=\"cbi-input-checkbox\" type=\"checkbox\" name=\"chnroute6\" value=\"1\" />\n\t\t\t\tchnroute6\n\t\t\t</label>\n\t\t\t<label>\n\t\t\t\t<input class=\"cbi-input-checkbox\" type=\"checkbox\" name=\"chnlist\" value=\"1\" />\n\t\t\t\tchnlist\n\t\t\t</label>\n\t\t\t<label>\n\t\t\t\t<input class=\"cbi-input-checkbox\" type=\"checkbox\" name=\"geoip\" value=\"1\" />\n\t\t\t\tgeoip\n\t\t\t</label>\n\t\t\t<label>\n\t\t\t\t<input class=\"cbi-input-checkbox\" type=\"checkbox\" name=\"geosite\" value=\"1\" />\n\t\t\t\tgeosite\n\t\t\t</label>\n\t\t\t<br><br>\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" id=\"update_rules_btn\" onclick=\"update_rules(this)\" value=\"<%:Manually update%>\" />\n\t\t\t<% if has_old_geoip then %>\n\t\t\t<input class=\"btn cbi-button cbi-button-reset\" type=\"button\" onclick=\"rollback_rules(this, 'geoip')\" value=\"<%:Rollback%> GeoIP\" />\n\t\t\t<% end %>\n\t\t\t<% if has_old_geosite then %>\n\t\t\t<input class=\"btn cbi-button cbi-button-reset\" type=\"button\" onclick=\"rollback_rules(this, 'geosite')\" value=\"<%:Rollback%> Geosite\" />\n\t\t\t<% end %>\n\t\t</div>\n\t</div>\n</div>\n\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tdocument.addEventListener('DOMContentLoaded', function () {\n\t\tconst flags = [\n\t\t\t\"gfwlist_update\",\"chnroute_update\",\"chnroute6_update\",\n\t\t\t\"chnlist_update\",\"geoip_update\",\"geosite_update\"\n\t\t];\n\t\tconst bindFlags = () => {\n\t\t\tlet allBound = true;\n\t\t\tflags.forEach(flag => {\n\t\t\t\tconst orig = Array.from(document.querySelectorAll(`input[name$=\".${flag}\"]`)).find(i => i.type === 'checkbox');\n\t\t\t\tif (!orig) { allBound = false; return; }\n\t\t\t\t// 隐藏最外层 div\n\t\t\t\tconst wrapper = orig.closest('.cbi-value');\n\t\t\t\tif (wrapper && wrapper.style.display !== 'none') {\n\t\t\t\t\twrapper.style.display = 'none';\n\t\t\t\t}\n\t\t\t\tconst custom = document.querySelector(`.cbi-input-checkbox[name=\"${flag.replace('_update','')}\"]`);\n\t\t\t\tif (!custom) { allBound = false; return; }\n\t\t\t\tcustom.checked = orig.checked;\n\t\t\t\t// 自定义选择框与原生Flag双向绑定\n\t\t\t\tif (!custom._binded) {\n\t\t\t\t\tcustom._binded = true;\n\t\t\t\t\torig.addEventListener('change', () => {\n\t\t\t\t\t\tcustom.checked = orig.checked;\n\t\t\t\t\t});\n\t\t\t\t\tcustom.addEventListener('change', () => {\n\t\t\t\t\t\torig.checked = custom.checked;\n\t\t\t\t\t\torig.dispatchEvent(new Event('change', { bubbles: true }));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn allBound;\n\t\t};\n\n\t\tconst geo2ruleFlag = () => {\n\t\t\tconst geoEl = document.querySelector('input[type=\"checkbox\"][name*=\"passwall\"][name*=\"geo2rule\"]');\n\t\t\tif (!geoEl) return;\n\t\t\tconst updateCheckboxes = (disabled) => {\n\t\t\t\tflags.filter(flag => !flag.includes('geo')).forEach(flag => {\n\t\t\t\t\tconst custom = document.querySelector(`.cbi-input-checkbox[name=\"${flag.replace('_update','')}\"]`);\n\t\t\t\t\tif (custom) {\n\t\t\t\t\t\t//if (disabled) custom.checked = true;\n\t\t\t\t\t\tcustom.parentElement.style.display = disabled ? 'none' : '';\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t};\n\t\t\tupdateCheckboxes(geoEl.checked);\n\t\t\tgeoEl.addEventListener(\"change\", () => {\n\t\t\t\tgeoEl.blur();\n\t\t\t\tupdateCheckboxes(geoEl.checked);\n\t\t\t});\n\t\t};\n\n\t\tconst bindAll = () => {\n\t\t\tbindFlags();\n\t\t\tgeo2ruleFlag();\n\t\t};\n\n\t\tconst target = document.querySelector('form') || document.body;\n\t\tconst observer = new MutationObserver(() => bindAll() ? observer.disconnect() : 0);\n\t\tobserver.observe(target, { childList: true, subtree: true });\n\t\tconst timer = setInterval(() => bindAll() ? (clearInterval(timer), observer.disconnect()) : 0, 300);\n\t\tsetTimeout(() => { clearInterval(timer); observer.disconnect(); }, 5000);\n\t});\n\n\tfunction update_rules(btn) {\n\t\tbtn.disabled = true;\n\t\tbtn.value = '<%:Updating...%>';\n\t\tvar div = document.getElementById('_rule_div');\n\t\tvar domList = div.getElementsByTagName('input');\n\t\tvar checkBoxList = [];\n\t\tvar len = domList.length;\n\t\twhile(len--) {\n\t\t\tvar dom = domList[len];　　\n\t\t\tif(dom.type == 'checkbox' && dom.checked) {\n\t\t\t\tcheckBoxList.push(dom.name);\n\t\t\t}\n\t\t}\n\t\tXHR.get('<%=api.url(\"update_rules\")%>', {\n\t\t\t\tupdate: checkBoxList.join(\",\")\n\t\t\t},\n\t\t\tfunction(x, data) {\n\t\t\t\tif(x && x.status == 200) {\n\t\t\t\t\twindow.location.href = '<%=api.url(\"log\")%>';\n\t\t\t\t} else {\n\t\t\t\t\talert(\"<%:Error%>\");\n\t\t\t\t\tbtn.disabled = false;\n\t\t\t\t\tbtn.value = '<%:Manually update%>';\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\tfunction rollback_rules(btn, type) {\n\t\tlet ori_val = btn.value;\n\t\tbtn.disabled = true;\n\t\tbtn.value = '<%:Rollbacking...%>';\n\t\tvar div = document.getElementById('_rule_div');\n\t\tvar domList = div.getElementsByTagName('input');\n\t\tvar checkBoxList = [];\n\t\tvar len = domList.length;\n\t\twhile(len--) {\n\t\t\tvar dom = domList[len];　　\n\t\t\tif(dom.type == 'checkbox' && dom.checked) {\n\t\t\t\tif(type == 'geoip' && (dom.name === 'chnroute' || dom.name === 'chnroute6')) {\n\t\t\t\t\tcheckBoxList.push(dom.name);\n\t\t\t\t}\n\t\t\t\tif(type == 'geosite' && (dom.name === 'gfwlist' || dom.name === 'chnlist')) {\n\t\t\t\t\tcheckBoxList.push(dom.name);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tXHR.get('<%=api.url(\"rollback_rules\")%>', {\n\t\t\ttype: type,\n\t\t\trules: checkBoxList.join(\",\")\n\t\t\t},\n\t\t\tfunction(x, data) {\n\t\t\t\tif(x && x.status == 200 && data.code == 1) {\n\t\t\t\t\talert(\"<%:Success%>\");\n\t\t\t\t\tbtn.style.display = \"none\";\n\t\t\t\t} else {\n\t\t\t\t\talert(\"<%:Error%>\");\n\t\t\t\t\tbtn.disabled = false;\n\t\t\t\t\tbtn.value = ori_val;\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\t//分流规则添加拖拽排序\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t\tfunction initSortableForTable() {\n\t\t\tvar section = document.getElementById(\"cbi-<%=api.appname%>-shunt_rules\");\n\t\t\tif (!section) return;\n\n\t\t\thideSortColumn(section);\n\n\t\t\t// === 插入 drag handle ===\n\t\t\tvar rows = section.querySelectorAll(\"tr\");\n\t\t\trows.forEach(function(row) {\n\t\t\t\tvar btn = row.querySelector(\".cbi-button-remove:last-of-type\");\n\t\t\t\tif (!btn) return;\n\t\t\t\tif (btn.nextElementSibling && btn.nextElementSibling.classList.contains(\"drag-handle\")) return;\n\t\t\t\tvar handle = document.createElement(\"span\");\n\t\t\t\thandle.className = \"drag-handle center\";\n\t\t\t\thandle.title = \"<%:Drag to reorder%>\";\n\t\t\t\thandle.innerHTML = \"⠿\";\n\t\t\t\tbtn.after(handle);\n\t\t\t});\n\n\t\t\t// === 初始化 Sortable ===\n\t\t\tvar table = section.getElementsByTagName(\"table\")[0];\n\t\t\tif (!table) return;\n\t\t\tvar root = table.tBodies[0] || table;\n\t\t\tif (root._sortable_initialized) return root._sortable_instance;\n\t\t\troot._sortable_initialized = true;\n\n\t\t\t// 保存原始顺序\n\t\t\troot._origOrder = getCurrentOrder(root);\n\n\t\t\ttry {\n\t\t\t\troot._sortable_instance = Sortable.create(root, {\n\t\t\t\t\thandle: \".drag-handle\",\n\t\t\t\t\tdraggable: \"tr.cbi-section-table-row\",\n\t\t\t\t\tanimation: 150,\n\t\t\t\t\tghostClass: \"dragging-row\",\n\t\t\t\t\tfallbackOnBody: true,\n\t\t\t\t\tforceFallback: false,\n\t\t\t\t\tswapThreshold: 0.65,\n\t\t\t\t\tonEnd: function (evt) {\n\t\t\t\t\t\tupdateHiddenInput(root, section);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn root._sortable_instance;\n\t\t\t} catch (e) {\n\t\t\t\troot._sortable_initialized = false;\n\t\t\t\tconsole.error(\"Sortable init failed:\", e);\n\t\t\t}\n\t\t}\n\n\t\t// 获取 table 当前行顺序\n\t\tfunction getCurrentOrder(root) {\n\t\t\tvar order = [];\n\t\t\tvar rows = root.querySelectorAll(\"tr.cbi-section-table-row\");\n\t\t\trows.forEach(function (tr) {\n\t\t\t\tvar id = tr.id || \"\";\n\t\t\t\tif (id.startsWith(\"cbi-<%=api.appname%>-\"))\n\t\t\t\t\tid = id.replace(\"cbi-<%=api.appname%>-\", \"\");\n\t\t\t\torder.push(id);\n\t\t\t});\n\t\t\treturn order;\n\t\t}\n\n\t\t// 拖拽完成后更新 hidden input\n\t\tfunction updateHiddenInput(root, section) {\n\t\t\tvar newOrder = getCurrentOrder(root);\n\t\t\tvar changed = newOrder.join(\" \") !== root._origOrder.join(\" \");\n\t\t\tvar hiddenInput = section.querySelector('input[type=\"hidden\"][id^=\"cbi.sts.\"]');\n\t\t\tif (hiddenInput) {\n\t\t\t\thiddenInput.value = changed ? newOrder.join(\" \") : \"\";\n\t\t\t}\n\t\t}\n\t\t\n\t\t// 隐藏18.06 up/down 列\n\t\tfunction hideSortColumn(section) {\n\t\t\tvar table = section.getElementsByTagName(\"table\")[0];\n\t\t\tif(!table) return;\n\t\t\tvar rows = table.querySelectorAll(\"tr.cbi-section-table-row\");\n\t\t\tif(!rows.length) return;\n\t\t\tvar colCount = rows[0].children.length, sortCol = -1;\n\t\t\tfor(var col=0; col<colCount; col++){\n\t\t\t\tvar hasSort=false, invalid=false;\n\t\t\t\trows.forEach(function(tr){\n\t\t\t\t\tvar td=tr.children[col]; if(!td) return;\n\t\t\t\t\tif(td.querySelector(\".cbi-button-edit, .cbi-button-remove\")) invalid=true;\n\t\t\t\t\tif(td.querySelector(\".cbi-button-up, .cbi-button-down\")) hasSort=true;\n\t\t\t\t});\n\t\t\t\tif(!invalid && hasSort){ sortCol=col; break; }\n\t\t\t}\n\t\t\tif(sortCol===-1) return;\n\t\t\ttable.querySelectorAll(\"tr\").forEach(function(tr){\n\t\t\t\tvar c=tr.children[sortCol]; if(c) c.style.display=\"none\";\n\t\t\t});\n\t\t}\n\n\t\t// === 等待 TypedSection 行稳定 ===\n\t\t(function waitStable() {\n\t\t\tvar last = 0, stable = 0;\n\t\t\tvar THRESHOLD = 5;\n\t\t\tfunction tick() {\n\t\t\t\tvar count = document.querySelectorAll(\"tr.cbi-section-table-row\").length;\n\t\t\t\tif (count && count === last) stable++;\n\t\t\t\telse stable = 0;\n\n\t\t\t\tlast = count;\n\t\t\t\tif (stable >= THRESHOLD)\n\t\t\t\t\tsetTimeout(initSortableForTable, 200);\n\t\t\t\telse\n\t\t\t\t\trequestAnimationFrame(tick);\n\t\t\t}\n\t\t\ttick();\n\t\t})();\n\t});\n\t//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/rule_list/geoview.htm",
    "content": "<%\nlocal api = require \"luci.passwall.api\"\n-%>\n\n<style>\n\t.faq-title {\n\t\tcolor: var(--primary);\n\t\tfont-weight: bolder;\n\t\tmargin-bottom: 0.5rem;\n\t\tdisplay: inline-block;\n\t}\n\t.faq-item {\n\t\tmargin-bottom: 0.8rem;\n\t\tline-height:1.2rem;\n\t}\n\n\t.geoview-search {\n\t\tdisplay: flex;\n\t\tgap: 2px;\n\t\talign-items: center;\n\t\twhite-space: nowrap;\n\t}\n</style>\n\n<div class=\"cbi-value\">\n\t<ul>\n\t\t<b class=\"faq-title\"><%:Tips:%></b>\n\t\t<li class=\"faq-item\">1. <span><%:By entering a domain or IP, you can query the Geo rule list they belong to.%></span></li>\n\t\t<li class=\"faq-item\">2. <span><%:By entering a GeoIP or Geosite, you can extract the domains/IPs they contain.%></span></li>\n\t\t<li class=\"faq-item\">3. <span><%:Use the GeoIP/Geosite query function to verify if the entered Geo rules are correct.%></span></li>\n\t</ul>\n</div>\n<div class=\"cbi-value\" id=\"cbi-passwall-geoview-lookup\">\n\t<label class=\"cbi-value-title\" for=\"geoview.lookup\"><%:Domain/IP Query%></label>\n\t<div class=\"cbi-value-field\">\n\t\t<div class=\"geoview-search\">\n\t\t\t<input type=\"text\" class=\"password-input cbi-input-text\" id=\"geoview.lookup\" name=\"geoview.lookup\" inputmode=\"search\" enterkeyhint=\"search\" />\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" id=\"lookup-view_btn\"\n\t\t\t\tonclick='do_geoview(this, \"lookup\", lookupInput.value)'\n\t\t\t\tvalue=\"<%:Query%>\" />\n\t\t</div>\n\t\t<div class=\"cbi-value-description\">\n\t\t\t<%:Enter a domain or IP to query the Geo rule list they belong to.%>\n\t\t</div>\n\t</div>\n</div>\n<div class=\"cbi-value\" id=\"cbi-passwall-geoview-extract\">\n\t<label class=\"cbi-value-title\" for=\"geoview.extract\"><%:GeoIP/Geosite Query%></label>\n\t<div class=\"cbi-value-field\">\n\t\t<div class=\"geoview-search\">\n\t\t\t<input type=\"text\" class=\"password-input cbi-input-text\" id=\"geoview.extract\" name=\"geoview.extract\" inputmode=\"search\" enterkeyhint=\"search\" />\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" id=\"extract-view_btn\"\n\t\t\t\tonclick='do_geoview(this, \"extract\", extractInput.value)'\n\t\t\t\tvalue=\"<%:Query%>\" />\n\t\t</div>\n\t\t<div class=\"cbi-value-description\">\n\t\t\t<%:Enter a GeoIP or Geosite to extract the domains/IPs they contain. Format: geoip:cn or geosite:gfw%>\n\t\t</div>\n\t</div>\n</div>\n<div class=\"cbi-value\">\n\t<textarea id=\"geoview_textarea\" class=\"cbi-input-textarea\" style=\"width: 100%; margin-top: 10px;\" rows=\"25\" wrap=\"off\" readonly=\"readonly\"></textarea>\n</div>\n\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tconst lookupInput = document.getElementById(\"geoview.lookup\");\n\tconst extractInput = document.getElementById(\"geoview.extract\");\n\tconst lookup_btn = document.getElementById(\"lookup-view_btn\");\n\tconst extract_btn = document.getElementById(\"extract-view_btn\");\n\n\tfunction do_geoview(btn,action,value) {\n\t\tvalue = value.trim();\n\t\tif (!value) {\n\t\t\talert(\"<%:Please enter query content!%>\");\n\t\t\treturn;\n        }\n\t\tlookup_btn.disabled = true;\n\t\textract_btn.disabled = true;\n\t\tbtn.value = '<%:Querying%>';\n\t\tconst textarea = document.getElementById('geoview_textarea');\n\t\ttextarea.textContent = \"\";\n\t\tfetch('<%= api.url(\"geo_view\") %>?action=' + action + '&value=' + encodeURIComponent(value))\n\t\t\t.then(response => response.text())\n\t\t\t.then(data => {\n\t\t\t\ttextarea.textContent = data;\n\t\t\t\tlookup_btn.disabled = false;\n\t\t\t\textract_btn.disabled = false;\n\t\t\t\tbtn.value = '<%:Query%>';\n\t\t\t})\n\t}\n\n\tlookupInput.addEventListener(\"keydown\", function(e) {\n\t\tconst isEnter = e.key === \"Enter\" || e.keyCode === 13;\n\t\tif (!isEnter) return;\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t\tlookupInput.blur();\n\t\tlookup_btn.click();\n\t});\n\n\textractInput.addEventListener(\"keydown\", function(e) {\n\t\tconst isEnter = e.key === \"Enter\" || e.keyCode === 13;\n\t\tif (!isEnter) return;\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t\textractInput.blur();\n\t\textract_btn.click();\n\t});\n\t//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/rule_list/js.htm",
    "content": "<%\nlocal api = require \"luci.passwall.api\"\nlocal translate = luci.i18n.translate\nlocal total_lines_text = translate(\"Total Lines\")\n-%>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tfunction read_gfw() {\n\t\tfetch('<%= api.url(\"read_rulelist\") %>?type=gfw')\n\t\t\t.then(response => response.text())\n\t\t\t.then(data => {\n\t\t\t\tvar total_lines = data.split(\"\\n\").filter(line => line.trim() !== \"\").length;\n\t\t\t\tvar textarea = document.getElementById('gfw_textarea');\n\t\t\t\ttextarea.innerHTML = data;\n\t\t\t\t//textarea.scrollTop = textarea.scrollHeight;\n\t\t\t\tvar totalLinesLabel = document.getElementById('gfw_total_lines');\n\t\t\t\ttotalLinesLabel.innerHTML = \"<%= total_lines_text %> \" + total_lines;\n\t\t\t})\n\t}\n\n\tfunction read_chn() {\n\t\tfetch('<%= api.url(\"read_rulelist\") %>?type=chn')\n\t\t\t.then(response => response.text())\n\t\t\t.then(data => {\n\t\t\t\tvar total_lines = data.split(\"\\n\").filter(line => line.trim() !== \"\").length;\n\t\t\t\tvar textarea = document.getElementById('chn_textarea');\n\t\t\t\ttextarea.innerHTML = data;\n\t\t\t\t//textarea.scrollTop = textarea.scrollHeight;\n\t\t\t\tvar totalLinesLabel = document.getElementById('chn_total_lines');\n\t\t\t\ttotalLinesLabel.innerHTML = \"<%= total_lines_text %> \" + total_lines;\n\t\t\t})\n\t}\n\n\tfunction read_chnroute() {\n\t\tfetch('<%= api.url(\"read_rulelist\") %>?type=chnroute')\n\t\t\t.then(response => response.text())\n\t\t\t.then(data => {\n\t\t\t\tvar total_lines = data.split(\"\\n\").filter(line => line.trim() !== \"\").length;\n\t\t\t\tvar textarea = document.getElementById('chnroute_textarea');\n\t\t\t\ttextarea.innerHTML = data;\n\t\t\t\t//textarea.scrollTop = textarea.scrollHeight;\n\t\t\t\tvar totalLinesLabel = document.getElementById('chnroute_total_lines');\n\t\t\t\ttotalLinesLabel.innerHTML = \"<%= total_lines_text %> \" + total_lines;\n\t\t\t})\n\t}\n\t//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/server/log.htm",
    "content": "<%\nlocal api = require \"luci.passwall.api\"\n-%>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tvar log_textarea = null;\n\tvar first_load_done = false;\n\n\tfunction scrollToBottom() {\n\t\tlog_textarea.scrollTop = log_textarea.scrollHeight;\n\t}\n\n\tfunction clear_log(btn) {\n\t\tXHR.get('<%=api.url(\"server_clear_log\")%>', null,\n\t\t\tfunction(x, data) {\n\t\t\t\tif(x && x.status == 200 && log_textarea) {\n\t\t\t\t\tlog_textarea.innerHTML = \"\";\n\t\t\t\t\tscrollToBottom();\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\tXHR.poll(3, '<%=api.url(\"server_get_log\")%>', null,\n\t\tfunction(x, data) {\n\t\t\tif(x && x.status == 200) {\n\t\t\t\tif (!log_textarea) log_textarea = document.getElementById('log_textarea');\n\t\t\t\tvar wasBottom = (log_textarea.scrollTop + log_textarea.clientHeight >= log_textarea.scrollHeight - 10);\n\t\t\t\tlog_textarea.innerHTML = x.responseText;\n\t\t\t\tif (!first_load_done) {\n\t\t\t\t\tscrollToBottom();\n\t\t\t\t\tfirst_load_done = true;\n\t\t\t\t}\n\t\t\t\telse if (wasBottom) {\n\t\t\t\t\tscrollToBottom();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t);\n\t//]]>\n</script>\n<fieldset class=\"cbi-section\" id=\"_log_fieldset\">\n\t<legend>\n\t\t<%:Logs%>\n\t</legend>\n\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"clear_log()\" value=\"<%:Clear logs%>\" />\n\t<textarea id=\"log_textarea\" class=\"cbi-input-textarea\" style=\"width: 100%;margin-top: 10px;\" data-update=\"change\" rows=\"20\" wrap=\"off\" readonly=\"readonly\"></textarea>\n</fieldset>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/server/users_list_status.htm",
    "content": "<%\nlocal api = require \"luci.passwall.api\"\n-%>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tvar _users_status = document.getElementsByClassName('_users_status');\n\tfor(var i = 0; i < _users_status.length; i++) {\n\t\tvar id = _users_status[i].parentElement.parentElement.parentElement.id;\n\t\tid = id.substr(id.lastIndexOf(\"-\") + 1);\n\t\tXHR.get('<%=api.url(\"server_user_status\")%>', {\n\t\t\t\tindex: i,\n\t\t\t\tid: id\n\t\t\t},\n\t\t\tfunction(x, result) {\n\t\t\t\t_users_status[result.index].setAttribute(\"style\",\"font-weight:bold;\");\n\t\t\t\t_users_status[result.index].setAttribute(\"color\",result.status ? \"green\":\"red\");\n\t\t\t\t_users_status[result.index].innerHTML = (result.status ? '✓' : 'X');\n\t\t\t}\n\t\t);\n\t}\n\n\tvar edit_btn = document.getElementById(\"cbi-passwall_server-user\").getElementsByClassName(\"cbi-button cbi-button-edit\");\n\tfor (var i = 0; i < edit_btn.length; i++) {\n\t\ttry {\n\t\t\tvar onclick_str = edit_btn[i].getAttribute(\"onclick\");\n\t\t\tvar id = onclick_str.substring(onclick_str.lastIndexOf('/') + 1, onclick_str.length - 1);\n\t\t\tvar td = edit_btn[i].parentNode;\n\t\t\tvar new_div = \"\";\n\t\t\t//添加\"日志\"按钮\n\t\t\tnew_div += '<input class=\"btn cbi-button cbi-button-add\" type=\"button\" value=\"<%:Log%>\" onclick=\"window.open(\\'' + '<%=api.url(\"server_user_log\")%>' + '?id=' + id + '\\', \\'_blank\\')\"/>&nbsp;&nbsp;';\n\t\t\ttd.innerHTML = new_div + td.innerHTML;\n\t\t}\n\t\tcatch(err) {\n\t\t\tconsole.error(err);\n\t\t}\n\t}\n\t//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall/luasrc/view/passwall/socks_auto_switch/btn.htm",
    "content": "<%\nlocal api = require \"luci.passwall.api\"\n-%>\n\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tlet socks_id = window.location.pathname.substring(window.location.pathname.lastIndexOf(\"/\") + 1)\n\tfunction add_node_by_key() {\n\t\tvar key = prompt(\"<%:Please enter the node keyword, pay attention to distinguish between spaces, uppercase and lowercase.%>\", \"\");\n\t\tif (key) {\n\t\t\twindow.location.href = '<%=api.url(\"socks_autoswitch_add_node\")%>' + \"?id=\" + socks_id + \"&key=\" + key;\n\t\t}\n\t}\n\tfunction remove_node_by_key() {\n\t\tvar key = prompt(\"<%:Please enter the node keyword, pay attention to distinguish between spaces, uppercase and lowercase.%>\", \"\");\n\t\tif (key) {\n\t\t\twindow.location.href = '<%=api.url(\"socks_autoswitch_remove_node\")%>' + \"?id=\" + socks_id + \"&key=\" + key;\n\t\t}\n\t}\n\t//]]>\n</script>\n<style>\n.key-btn-div {\n\tdisplay: table-cell;\n\tpadding: 5px 0 5px;\n}\n@media screen and (max-width: 600px) {\n\t.key-btn-div {\n\t\tdisplay: block;\n\t}\n\t.key-label {\n\t\tdisplay: none !important;\n\t}\n}\n.key-btn-div .cbi-button {\n\tmargin-bottom: 2px;\n}\n</style>\n<div class=\"cbi-value\" id=\"cbi-<%=self.config..\"-\"..section..\"-\"..self.option%>\" data-index=\"<%=self.index%>\" data-depends=\"<%=pcdata(self:deplist2json(section))%>\">\n\t<label class=\"cbi-value-title key-label\">　</label>\n\t<div class=\"key-btn-div\">\n\t\t<input class=\"btn cbi-button cbi-button-add\" type=\"button\" onclick=\"add_node_by_key()\" value=\"<%:Add nodes to the standby node list by keywords%>\" />\n\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"remove_node_by_key()\" value=\"<%:Delete nodes in the standby node list by keywords%>\" />\n\t</div>\n</div>\n"
  },
  {
    "path": "luci-app-passwall/po/zh_Hans/passwall.po",
    "content": "msgid \"Pass Wall\"\nmsgstr \"PassWall\"\n\nmsgid \"Auto\"\nmsgstr \"自动\"\n\nmsgid \"RUNNING\"\nmsgstr \"运行中\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\nmsgid \"UNINSTALLED\"\nmsgstr \"未安装\"\n\nmsgid \"Working...\"\nmsgstr \"连接正常\"\n\nmsgid \"Problem detected!\"\nmsgstr \"连接失败\"\n\nmsgid \"Touch Check\"\nmsgstr \"点我检测\"\n\nmsgid \"TLS handshake test, latency for reference only\"\nmsgstr \"TLS握手测试，延时仅供参考\"\n\nmsgid \"Kernel Unsupported\"\nmsgstr \"内核不支持\"\n\nmsgid \"Settings\"\nmsgstr \"设置\"\n\nmsgid \"Main Settings\"\nmsgstr \"节点选择\"\n\nmsgid \"Basic Settings\"\nmsgstr \"基本设置\"\n\nmsgid \"Node List\"\nmsgstr \"节点列表\"\n\nmsgid \"Other Settings\"\nmsgstr \"高级设置\"\n\nmsgid \"Load Balancing\"\nmsgstr \"负载均衡\"\n\nmsgid \"Enter interface\"\nmsgstr \"进入界面\"\n\nmsgid \"Rule Manage\"\nmsgstr \"规则管理\"\n\nmsgid \"Rule List\"\nmsgstr \"规则列表\"\n\nmsgid \"Access control\"\nmsgstr \"访问控制\"\n\nmsgid \"Watch Logs\"\nmsgstr \"查看日志\"\n\nmsgid \"Node Config\"\nmsgstr \"节点配置\"\n\nmsgid \"Shunt Policy Config\"\nmsgstr \"分流方案配置\"\n\nmsgid \"Running Status\"\nmsgstr \"运行状态\"\n\nmsgid \"AliCloud Conn.\"\nmsgstr \"阿里连接\"\n\nmsgid \"Google Conn.\"\nmsgstr \"谷歌连接\"\n\nmsgid \"GitHub Conn.\"\nmsgstr \"GitHub 连接\"\n\nmsgid \"YouTube Conn.\"\nmsgstr \"YouTube 连接\"\n\nmsgid \"Node Check\"\nmsgstr \"节点检测\"\n\nmsgid \"Check...\"\nmsgstr \"检测中...\"\n\nmsgid \"Clear\"\nmsgstr \"清除\"\n\nmsgid \"Main switch\"\nmsgstr \"主开关\"\n\nmsgid \"TCP Node\"\nmsgstr \"TCP 节点\"\n\nmsgid \"UDP Node\"\nmsgstr \"UDP 节点\"\n\nmsgid \"Edit Current Node\"\nmsgstr \"编辑当前节点\"\n\nmsgid \"Socks Config\"\nmsgstr \"Socks 配置\"\n\nmsgid \"Socks Node\"\nmsgstr \"Socks 节点\"\n\nmsgid \"Current Node\"\nmsgstr \"当前节点\"\n\nmsgid \"Listen Port\"\nmsgstr \"监听端口\"\n\nmsgid \"0 is not use\"\nmsgstr \"0 为不使用\"\n\nmsgid \"Same as the tcp node\"\nmsgstr \"与 TCP 节点相同\"\n\nmsgid \"Current node: %s\"\nmsgstr \"当前节点：%s\"\n\nmsgid \"DNS Shunt\"\nmsgstr \"DNS分流\"\n\nmsgid \"Domestic group name\"\nmsgstr \"国内分组名\"\n\nmsgid \"You only need to configure domestic DNS packets in SmartDNS, and fill in the domestic DNS group name here.\"\nmsgstr \"您只需要在SmartDNS配置好国内DNS分组，并在此处填入国内DNS分组名。\"\n\nmsgid \"%s cannot be empty.\"\nmsgstr \"%s 不能为空。\"\n\nmsgid \"Filter Mode\"\nmsgstr \"过滤模式\"\n\nmsgid \"TCP node must be '%s' type to use FakeDNS.\"\nmsgstr \"TCP 节点必须是 '%s' 类型才能使用 FakeDNS。\"\n\nmsgid \"Direct DNS\"\nmsgstr \"直连 DNS\"\n\nmsgid \"Remote DNS\"\nmsgstr \"远程 DNS\"\n\nmsgid \"Resolver For The List Proxied\"\nmsgstr \"解析被代理的域名列表\"\n\nmsgid \"Requery DNS By %s\"\nmsgstr \"通过 %s 请求 DNS\"\n\nmsgid \"Socks Server\"\nmsgstr \"Socks 服务器\"\n\nmsgid \"Misconfigured\"\nmsgstr \"配置不当\"\n\nmsgid \"Make sure socks service is available on this address.\"\nmsgstr \"请确保此 Socks 服务可用。\"\n\nmsgid \"%s request address\"\nmsgstr \"%s 请求地址\"\n\nmsgid \"Format must be:\"\nmsgstr \"格式必须为：\"\n\nmsgid \"Request protocol\"\nmsgstr \"请求协议\"\n\nmsgid \"Remote DNS DoH\"\nmsgstr \"远程 DNS DoH\"\n\nmsgid \"Format: URL[,IP] (optional IP to map the domain in the URL)\"\nmsgstr \"格式：URL[,IP]（IP 可选，用于绑定 URL 中的域名）\"\n\nmsgid \"Notify the DNS server when the DNS query is notified, the location of the client (cannot be a private IP address).\"\nmsgstr \"用于 DNS 查询时通知 DNS 服务器，客户端所在的地理位置（不能是私有 IP 地址）。\"\n\nmsgid \"This feature requires the DNS server to support the Edns Client Subnet (RFC7871).\"\nmsgstr \"此功能需要 DNS 服务器支持 EDNS Client Subnet（RFC7871）。\"\n\nmsgid \"The effect is better, recommend.\"\nmsgstr \"效果更好，推荐使用。\"\n\nmsgid \"ChinaDNS-NG (recommended)\"\nmsgstr \"ChinaDNS-NG (推荐)\"\n\nmsgid \"Default DNS\"\nmsgstr \"默认 DNS\"\n\nmsgid \"When not matching any domain name list:\"\nmsgstr \"当不匹配任何域名列表时：\"\n\nmsgid \"Remote DNS: Can avoid more DNS leaks, but some domestic domain names maybe to proxy!\"\nmsgstr \"远程 DNS：可以避免更多的 DNS 泄露，但会导致规则列表外的某些国内域名可能会走代理！\"\n\nmsgid \"Direct DNS: Internet experience may be better, but DNS will be leaked!\"\nmsgstr \"直连 DNS：上网体验可能会更佳，但是会泄露 DNS！\"\n\nmsgid \"Smart, Do not accept no-ip reply from Direct DNS\"\nmsgstr \"智能，不接受直连 DNS 空响应\"\n\nmsgid \"Smart, Accept no-ip reply from Direct DNS\"\nmsgstr \"智能，接受直连 DNS 空响应\"\n\nmsgid \"Smart: Forward to both direct and remote DNS, if the direct DNS resolution result is a mainland China IP, then use the direct result, otherwise use the remote result.\"\nmsgstr \"智能：同时转发给直连和远程 DNS，如果直连 DNS 解析结果是大陆 IP，则使用直连结果，否则使用远程结果。\"\n\nmsgid \"In smart mode, no-ip reply from Direct DNS:\"\nmsgstr \"使用智能模式，直连 DNS 返回空响应时:\"\n\nmsgid \"Do not accept: Wait and use Remote DNS Reply.\"\nmsgstr \"不接受：等待并使用远程 DNS 的响应。\"\n\nmsgid \"Accept: Trust the Reply, using this option can improve DNS resolution speeds for some mainland IPv4-only sites.\"\nmsgstr \"接受：信任空响应，使用此选项可以提升部分大陆仅 IPv4 站点的 DNS 解析速度。\"\n\nmsgid \"Filter Proxy Host IPv6\"\nmsgstr \"过滤代理域名 IPv6\"\n\nmsgid \"Experimental feature.\"\nmsgstr \"实验性功能。\"\n\nmsgid \"Use FakeDNS work in the domain that proxy.\"\nmsgstr \"需要代理的域名使用 FakeDNS。\"\n\nmsgid \"Suitable scenarios for let the node servers get the target domain names.\"\nmsgstr \"适合让节点服务器获取目标域名的场景。\"\n\nmsgid \"Such as: DNS unlocking of streaming media, reducing DNS query latency, etc.\"\nmsgstr \"例如：流媒体的 DNS 解锁、减少 DNS 查询延迟等。\"\n\nmsgid \"Redirect\"\nmsgstr \"重定向\"\n\nmsgid \"DNS Redirect\"\nmsgstr \"DNS 重定向\"\n\nmsgid \"Force special DNS server to need proxy devices.\"\nmsgstr \"强制需要代理的设备使用专用 DNS 服务器。\"\n\nmsgid \"Clear IPSET on Reboot\"\nmsgstr \"重启清空 IPSET\"\n\nmsgid \"Clear NFTSET on Reboot\"\nmsgstr \"重启清空 NFTSET\"\n\nmsgid \"Clear IPSET/NFTSET on service reboot. This may increase reboot time.\"\nmsgstr \"重启服务时清空 IPSET/NFTSET，可能会延长重启时间。\"\n\nmsgid \"Clear IPSET\"\nmsgstr \"清空 IPSET\"\n\nmsgid \"Clear NFTSET\"\nmsgstr \"清空 NFTSET\"\n\nmsgid \"Try this feature if the rule modification does not take effect.\"\nmsgstr \"如果修改规则后没有生效，请尝试此功能。\"\n\nmsgid \"Force HTTPS SOA\"\nmsgstr \"停用 HTTPS 记录解析\"\n\nmsgid \"Force queries with qtype 65 to respond with an SOA record.\"\nmsgstr \"强制使 qtype 65 查询返回 SOA。\"\n\nmsgid \"Are you sure to hide?\"\nmsgstr \"你确定要隐藏吗？\"\n\nmsgid \"DNS related issues:\"\nmsgstr \"DNS 相关问题：\"\n\nmsgid \"Certain browsers such as Chrome have built-in DNS service, which may affect DNS resolution settings. You can go to 'Settings -> Privacy and security -> Use secure DNS' menu to turn it off.\"\nmsgstr \"某些浏览器如 Chrome 等内置此功能，这会影响设置的 DNS 解析。您可以进入 '设置->私隐和安全->使用安全 DNS' 菜单,将其关闭。\"\n\nmsgid \"If you are unable to access the internet after reboot, please try clearing the cache of your terminal devices (make sure to close all open browser application windows first, this step is especially important):\"\nmsgstr \"如果在重启后无法上网，请尝试清除终端设备的缓存（先关闭所有正在使用的浏览器应用程序，这一步尤其重要）：\"\n\nmsgid \"For Windows systems, open Command Prompt and run the command 'ipconfig /flushdns'.\"\nmsgstr \"对于Windows系统，请在命令提示符中运行命令 'ipconfig /flushdns'.\"\n\nmsgid \"For Mac systems, open Terminal and run the command 'sudo killall -HUP mDNSResponder'.\"\nmsgstr \"对于Mac系统，在终端中运行命令 'sudo killall -HUP mDNSResponder'.\"\n\nmsgid \"For mobile devices, you can clear it by reconnecting to the network, such as toggling Airplane Mode and reconnecting to WiFi.\"\nmsgstr \"对于移动设备，可通过重新接入网络的方式清除。比如开关一次飞行模式，重新连接 WiFi。\"\n\nmsgid \"Please make sure your device's network settings point both the DNS server and default gateway to this router, to ensure DNS queries are properly routed.\"\nmsgstr \"请确认您设备的网络设置，客户端 DNS 服务器和默认网关应均指向本路由器，以确保 DNS 查询正确路由。\"\n\nmsgid \"Browser access:\"\nmsgstr \"浏览器访问：\"\n\nmsgid \"Hide in main menu:\"\nmsgstr \"在主菜单中隐藏：\"\n\nmsgid \"Show in main menu:\"\nmsgstr \"在主菜单中显示：\"\n\nmsgid \"DNS Export Of Multi WAN\"\nmsgstr \"国内 DNS 指定解析出口\"\n\nmsgid \"Node Export Of Multi WAN\"\nmsgstr \"节点指定出口\"\n\nmsgid \"Only support Multi Wan.\"\nmsgstr \"只有多线接入才有效。\"\n\nmsgid \"Not Specify\"\nmsgstr \"不指定\"\n\nmsgid \"custom\"\nmsgstr \"自定义\"\n\nmsgid \"Process\"\nmsgstr \"进程\"\n\nmsgid \"1 Process\"\nmsgstr \"单进程\"\n\nmsgid \"Use %s\"\nmsgstr \"使用 %s\"\n\nmsgid \"Close(Not use)\"\nmsgstr \"关闭（不使用）\"\n\nmsgid \"Proxy Mode\"\nmsgstr \"代理模式\"\n\nmsgid \"Default Proxy Mode\"\nmsgstr \"默认代理模式\"\n\nmsgid \"No Proxy\"\nmsgstr \"不代理\"\n\nmsgid \"Proxy\"\nmsgstr \"代理\"\n\nmsgid \"Global Proxy\"\nmsgstr \"全局代理\"\n\nmsgid \"GFW List\"\nmsgstr \"GFW 列表\"\n\nmsgid \"Not China List\"\nmsgstr \"中国列表以外\"\n\nmsgid \"China List\"\nmsgstr \"中国列表\"\n\nmsgid \"Localhost\"\nmsgstr \"本机\"\n\nmsgid \"Switch Mode\"\nmsgstr \"切换模式\"\n\nmsgid \"Localhost Proxy\"\nmsgstr \"路由器本机代理\"\n\nmsgid \"When selected, localhost can transparent proxy.\"\nmsgstr \"当勾选时，路由器本机可以透明代理。\"\n\nmsgid \"Client Proxy\"\nmsgstr \"客户端代理\"\n\nmsgid \"When selected, devices in LAN can transparent proxy. Otherwise, it will not be proxy. But you can still use access control to allow the designated device to proxy.\"\nmsgstr \"当勾选时，局域网内的设备可以透明代理。否则，将不代理。但您仍然可以使用访问控制允许指定的设备代理。\"\n\nmsgid \"Missing components, transparent proxy is unavailable.\"\nmsgstr \"缺少组件，透明代理不可用。\"\n\nmsgid \"Want different devices to use different proxy modes/ports/nodes? Please use access control.\"\nmsgstr \"希望不同设备使用不同的代理模式/端口/节点？请使用访问控制。\"\n\nmsgid \"Operation\"\nmsgstr \"操作\"\n\nmsgid \"Add Node\"\nmsgstr \"添加节点\"\n\nmsgid \"Add the node via the link\"\nmsgstr \"通过链接添加节点\"\n\nmsgid \"Enter share links, one per line. Subscription links are not supported!\"\nmsgstr \"输入分享链接，支持多个节点，每行一个。请勿输入订阅链接！\"\n\nmsgid \"Please enter the correct link.\"\nmsgstr \"请输入正确的链接。\"\n\nmsgid \"Clear all nodes\"\nmsgstr \"清空所有节点\"\n\nmsgid \"Are you sure to clear all nodes?\"\nmsgstr \"你确定要清空所有节点吗？\"\n\nmsgid \"Success\"\nmsgstr \"成功\"\n\nmsgid \"Error\"\nmsgstr \"错误\"\n\nmsgid \"Delete select nodes\"\nmsgstr \"删除选择的节点\"\n\nmsgid \"To Top\"\nmsgstr \"置顶\"\n\nmsgid \"Select\"\nmsgstr \"选择\"\n\nmsgid \"Selected:\"\nmsgstr \"已选：\"\n\nmsgid \"DeSelect\"\nmsgstr \"反选\"\n\nmsgid \"Select all\"\nmsgstr \"全选\"\n\nmsgid \"DeSelect all\"\nmsgstr \"全不选\"\n\nmsgid \"Are you sure to delete select nodes?\"\nmsgstr \"你确定要删除选择的节点吗？\"\n\nmsgid \"You no select nodes !\"\nmsgstr \"你没有选择任何节点！\"\n\nmsgid \"Are you sure set to\"\nmsgstr \"你确定要设为\"\n\nmsgid \"the server?\"\nmsgstr \"服务器吗？\"\n\nmsgid \"You choose node is:\"\nmsgstr \"你选择的节点是：\"\n\nmsgid \"Timeout\"\nmsgstr \"超时\"\n\nmsgid \"Node Remarks\"\nmsgstr \"节点备注\"\n\nmsgid \"Add Mode\"\nmsgstr \"添加方式\"\n\nmsgid \"Save Order\"\nmsgstr \"保存当前顺序\"\n\nmsgid \"Saved current page order successfully.\"\nmsgstr \"保存当前页面顺序成功。\"\n\nmsgid \"Drag to reorder\"\nmsgstr \"拖动以重排\"\n\nmsgid \"Type\"\nmsgstr \"类型\"\n\nmsgid \"_balancing\"\nmsgstr \"负载均衡\"\n\nmsgid \"_shunt\"\nmsgstr \"分流\"\n\nmsgid \"_iface\"\nmsgstr \"接口\"\n\nmsgid \"Balancing\"\nmsgstr \"负载均衡\"\n\nmsgid \"Node Addition Method\"\nmsgstr \"节点添加方式\"\n\nmsgid \"Manual\"\nmsgstr \"手动\"\n\nmsgid \"Batch\"\nmsgstr \"批量\"\n\nmsgid \"Select Group\"\nmsgstr \"选择分组\"\n\nmsgid \"Node Matching Rules\"\nmsgstr \"节点匹配规则\"\n\nmsgid \"\"\n\"Example: <code>^A && B && !C && D$</code><br>\"\n\"This means the node remark must start with A (^), include B, exclude C (!), and end with D ($).<br>\"\n\"Conditions are joined by <code>&&</code>, and their order does not affect the result.\"\nmsgstr \"\"\n\"示例：<code>^A && B && !C && D$</code><br>\"\n\"表示节点备注需同时满足：以 A 开头（^）、包含 B、不包含 C（!）、并以 D 结尾（$）。<br>\"\n\"多个条件使用 <code>&&</code> 连接，条件顺序不影响结果。\"\n\nmsgid \"Keep the match scope small. Too many nodes can impact router performance.\"\nmsgstr \"建议尽量缩小匹配范围，节点过多会增加路由器负载。\"\n\nmsgid \"Balancing Strategy\"\nmsgstr \"负载均衡策略\"\n\nmsgid \"Fallback Node\"\nmsgstr \"后备节点\"\n\nmsgid \"Use Custom Probe URL\"\nmsgstr \"使用自定义探测网址\"\n\nmsgid \"By default the built-in probe URL will be used, enable this option to use a custom probe URL.\"\nmsgstr \"默认使用内置的探测网址，启用此选项以使用自定义探测网址。\"\n\nmsgid \"Probe URL\"\nmsgstr \"探测网址\"\n\nmsgid \"The URL used to detect the connection status.\"\nmsgstr \"用于检测连接状态的网址。\"\n\nmsgid \"Probe Interval\"\nmsgstr \"探测间隔\"\n\nmsgid \"The interval between initiating probes.\"\nmsgstr \"发起探测的间隔。\"\n\nmsgid \"The time format is numbers + units, such as '10s', '2h45m', and the supported time units are <code>s</code>, <code>m</code>, <code>h</code>, which correspond to seconds, minutes, and hours, respectively.\"\nmsgstr \"时间格式为数字+单位，比如<code>&quot;10s&quot;</code>, <code>&quot;2h45m&quot;</code>，支持的时间单位有 <code>s</code>，<code>m</code>，<code>h</code>，分别对应秒、分、时。\"\n\nmsgid \"When the unit is not filled in, it defaults to seconds.\"\nmsgstr \"未填写单位时，默认为秒。\"\n\nmsgid \"Preferred Node Count\"\nmsgstr \"优选节点数量\"\n\nmsgid \"The load balancer selects the optimal number of nodes, and traffic is randomly distributed among them.\"\nmsgstr \"负载均衡器选出最优节点的个数，流量将在这几个节点中随机分配。\"\n\nmsgid \"Shunt\"\nmsgstr \"分流\"\n\nmsgid \"Preproxy\"\nmsgstr \"前置代理\"\n\nmsgid \"Preproxy Node\"\nmsgstr \"前置代理节点\"\n\nmsgid \"Set the node to be used as a pre-proxy.\"\nmsgstr \"设置用作前置代理的节点。\"\n\nmsgid \"Each rule has a separate switch that controls whether this rule uses the pre-proxy or not.\"\nmsgstr \"每条规则都有独立开关控制本规则是否使用前置代理。\"\n\nmsgid \"Close (Not use)\"\nmsgstr \"关闭（不使用）\"\n\nmsgid \"Use default node\"\nmsgstr \"使用默认节点\"\n\nmsgid \"Direct Connection\"\nmsgstr \"直连\"\n\nmsgid \"Blackhole (Block)\"\nmsgstr \"黑洞（屏蔽）\"\n\nmsgid \"There are no available nodes, please add or subscribe nodes first.\"\nmsgstr \"没有可用节点，请先添加或订阅节点。\"\n\nmsgid \"No shunt rules? Click me to go to add.\"\nmsgstr \"没有分流规则？点我前往去添加。\"\n\nmsgid \"When using, localhost will connect this node first and then use this node to connect the default node.\"\nmsgstr \"当使用时，本机将首先连接到此节点，然后再使用此节点连接到默认节点落地。\"\n\nmsgid \"Domain Strategy\"\nmsgstr \"域名解析策略\"\n\nmsgid \"Domain matcher\"\nmsgstr \"域名匹配算法\"\n\nmsgid \"'AsIs': Only use domain for routing. Default value.\"\nmsgstr \"AsIs：只使用域名进行路由选择。默认值。\"\n\nmsgid \"'IPIfNonMatch': When no rule matches current domain, resolves it into IP addresses (A or AAAA records) and try all rules again.\"\nmsgstr \"IPIfNonMatch：当域名没有匹配任何规则时，将域名解析成 IP（A 记录或 AAAA 记录）再次进行匹配。\"\n\nmsgid \"'IPOnDemand': As long as there is a IP-based rule, resolves the domain into IP immediately.\"\nmsgstr \"IPOnDemand：当匹配时碰到任何基于 IP 的规则，将域名立即解析为 IP 进行匹配。\"\n\nmsgid \"Prefer IPv4\"\nmsgstr \"IPv4 优先\"\n\nmsgid \"Prefer IPv6\"\nmsgstr \"IPv6 优先\"\n\nmsgid \"IPv4 Only\"\nmsgstr \"仅 IPv4\"\n\nmsgid \"IPv6 Only\"\nmsgstr \"仅 IPv6\"\n\nmsgid \"Load balancing node list\"\nmsgstr \"负载均衡节点列表\"\n\nmsgid \"Load balancing node list, <a target='_blank' href='https://xtls.github.io/config/routing.html#balancerobject'>document</a>\"\nmsgstr \"负载均衡节点列表，<a target='_blank' href='https://xtls.github.io/config/routing.html#balancerobject'>文档原理</a>\"\n\nmsgid \"From Share URL\"\nmsgstr \"导入分享URL\"\n\nmsgid \"Build Share URL\"\nmsgstr \"导出分享URL\"\n\nmsgid \"Generate QRCode\"\nmsgstr \"生成二维码\"\n\nmsgid \"Export Config File\"\nmsgstr \"导出配置文件\"\n\nmsgid \"Import Finished\"\nmsgstr \"导入完成：\"\n\nmsgid \"Not a supported scheme:\"\nmsgstr \"不支持这种样式的：\"\n\nmsgid \"Invalid Share URL Format\"\nmsgstr \"无效的分享URL信息\"\n\nmsgid \"Paste Share URL Here\"\nmsgstr \"在此处粘贴分享信息\"\n\nmsgid \"Share URL to clipboard unable.\"\nmsgstr \"无法分享URL到剪贴板。\"\n\nmsgid \"Share URL to clipboard successfully.\"\nmsgstr \"成功复制分享URL到剪贴板。\"\n\nmsgid \"Faltal on get option, please help in debug:\"\nmsgstr \"代码错误，请协助捉虫：\"\n\nmsgid \"Faltal on set option, please help in debug:\"\nmsgstr \"代码错误，请协助捉虫：\"\n\nmsgid \"Address\"\nmsgstr \"地址\"\n\nmsgid \"Address (Support Domain Name)\"\nmsgstr \"地址（支持域名）\"\n\nmsgid \"Trojan Verify Cert\"\nmsgstr \"验证证书\"\n\nmsgid \"Trojan Cert Path\"\nmsgstr \"证书路径\"\n\nmsgid \"Finger Print\"\nmsgstr \"指纹伪造\"\n\nmsgid \"Avoid using randomized, unless you have to.\"\nmsgstr \"避免使用 randomized , 除非你必须要。\"\n\nmsgid \"Original\"\nmsgstr \"原版\"\n\nmsgid \"Transport Plugin\"\nmsgstr \"传输层插件\"\n\nmsgid \"Shadowsocks secondary encryption\"\nmsgstr \"Shadowsocks 二次加密\"\n\nmsgid \"Obfs Type\"\nmsgstr \"混淆类型\"\n\nmsgid \"Obfs Password\"\nmsgstr \"混淆密码\"\n\nmsgid \"Auth Type\"\nmsgstr \"认证类型\"\n\nmsgid \"Auth Password\"\nmsgstr \"认证密码\"\n\nmsgid \"Client BBR Control\"\nmsgstr \"客户端 BBR 流控\"\n\nmsgid \"Commands the client to use the BBR flow control algorithm\"\nmsgstr \"命令客户端使用 BBR 流量控制算法\"\n\nmsgid \"PinSHA256\"\nmsgstr \"PinSHA256\"\n\nmsgid \"Certificate fingerprint\"\nmsgstr \"证书指纹\"\n\nmsgid \"Max upload Mbps\"\nmsgstr \"最大上行(Mbps)\"\n\nmsgid \"Max download Mbps\"\nmsgstr \"最大下行(Mbps)\"\n\nmsgid \"QUIC stream receive window\"\nmsgstr \"QUIC 流接收窗口\"\n\nmsgid \"QUIC connection receive window\"\nmsgstr \"QUIC 连接接收窗口\"\n\nmsgid \"QUIC concurrent bidirectional streams\"\nmsgstr \"QUIC 并发双向流的最大数量\"\n\nmsgid \"QUIC KeepAlive interval\"\nmsgstr \"QUIC KeepAlive 间隔\"\n\nmsgid \"Disable MTU detection\"\nmsgstr \"禁用 MTU 检测\"\n\nmsgid \"ignoreClientBandwidth\"\nmsgstr \"忽略客户端带宽设置\"\n\nmsgid \"Lazy Start\"\nmsgstr \"延迟启动\"\n\nmsgid \"Encrypt Method\"\nmsgstr \"加密方式\"\n\nmsgid \"Encrypt Key\"\nmsgstr \"加密密钥\"\n\nmsgid \"Latency\"\nmsgstr \"延迟\"\n\nmsgid \"Automatic detection delay\"\nmsgstr \"自动检测延迟\"\n\nmsgid \"Show server address and port\"\nmsgstr \"显示服务器地址和端口\"\n\nmsgid \"URL Test Address\"\nmsgstr \"URL 测试地址\"\n\nmsgid \"URL Test\"\nmsgstr \"URL 测试\"\n\nmsgid \"Test\"\nmsgstr \"测试\"\n\nmsgid \"Node num\"\nmsgstr \"节点数量\"\n\nmsgid \"Self add\"\nmsgstr \"自添\"\n\nmsgid \"Apply\"\nmsgstr \"应用\"\n\nmsgid \"Use\"\nmsgstr \"使用\"\n\nmsgid \"Copy\"\nmsgstr \"复制\"\n\nmsgid \"Delay Settings\"\nmsgstr \"定时配置\"\n\nmsgid \"Open and close Daemon\"\nmsgstr \"启动守护进程\"\n\nmsgid \"Delay Start\"\nmsgstr \"开机时延时启动\"\n\nmsgid \"Units:seconds\"\nmsgstr \"单位：秒\"\n\nmsgid \"Units:minutes\"\nmsgstr \"单位：分钟\"\n\nmsgid \"stop automatically mode\"\nmsgstr \"定时关闭模式\"\n\nmsgid \"stop Time(Every day)\"\nmsgstr \"关闭时间(每天)\"\n\nmsgid \"stop Interval(Hour)\"\nmsgstr \"关闭间隔(小时)\"\n\nmsgid \"start automatically mode\"\nmsgstr \"定时开启模式\"\n\nmsgid \"start Time(Every day)\"\nmsgstr \"开启时间(每天)\"\n\nmsgid \"start Interval(Hour)\"\nmsgstr \"开启间隔(小时)\"\n\nmsgid \"restart automatically mode\"\nmsgstr \"定时重启模式\"\n\nmsgid \"restart Time(Every day)\"\nmsgstr \"重启时间(每天)\"\n\nmsgid \"restart Interval(Hour)\"\nmsgstr \"重启间隔(小时)\"\n\nmsgid \"Forwarding Settings\"\nmsgstr \"转发配置\"\n\nmsgid \"TCP No Redir Ports\"\nmsgstr \"TCP 不转发端口\"\n\nmsgid \"UDP No Redir Ports\"\nmsgstr \"UDP 不转发端口\"\n\nmsgid \"Fill in the ports you don't want to be forwarded by the agent, with the highest priority.\"\nmsgstr \"填写你不希望被代理转发的端口，优先级最高。\"\n\nmsgid \"The port settings support single ports and ranges.<br>Separate multiple ports with commas (,).<br>Example: 21,80,443,1000:2000.\"\nmsgstr \"以上端口设置支持单端口和端口范围。<br>多个端口用英文逗号(,)隔开。<br>例：21,80,443,1000:2000。\"\n\nmsgid \"TCP Proxy Drop Ports\"\nmsgstr \"TCP 转发屏蔽端口\"\n\nmsgid \"UDP Proxy Drop Ports\"\nmsgstr \"UDP 转发屏蔽端口\"\n\nmsgid \"TCP Redir Ports\"\nmsgstr \"TCP 转发端口\"\n\nmsgid \"UDP Redir Ports\"\nmsgstr \"UDP 转发端口\"\n\nmsgid \"No patterns are used\"\nmsgstr \"不使用\"\n\nmsgid \"All\"\nmsgstr \"所有\"\n\nmsgid \"Common Use\"\nmsgstr \"常用的\"\n\nmsgid \"Only Web\"\nmsgstr \"仅网页\"\n\nmsgid \"default\"\nmsgstr \"默认\"\n\nmsgid \"Default\"\nmsgstr \"默认\"\n\nmsgid \"Close\"\nmsgstr \"关闭\"\n\nmsgid \"Hijacking ICMP (PING)\"\nmsgstr \"劫持ICMP (PING)\"\n\nmsgid \"Hijacking ICMPv6 (IPv6 PING)\"\nmsgstr \"劫持ICMPv6 (IPv6 PING)\"\n\nmsgid \"Sniffing\"\nmsgstr \"流量嗅探\"\n\nmsgid \"TCP Proxy Way\"\nmsgstr \"TCP 代理方式\"\n\nmsgid \"Proxy Settings\"\nmsgstr \"代理配置\"\n\nmsgid \"Auto Switch\"\nmsgstr \"自动切换\"\n\nmsgid \"How often to test\"\nmsgstr \"多久检测一次\"\n\nmsgid \"Timeout seconds\"\nmsgstr \"超时秒数\"\n\nmsgid \"Timeout retry num\"\nmsgstr \"超时重试次数\"\n\nmsgid \"Main node\"\nmsgstr \"主节点\"\n\nmsgid \"List of backup nodes\"\nmsgstr \"备用节点的列表\"\n\nmsgid \"Restore Switch\"\nmsgstr \"恢复切换\"\n\nmsgid \"When detects main node is available, switch back to the main node.\"\nmsgstr \"当检测到主节点可用时，切换回主节点。\"\n\nmsgid \"Add nodes to the standby node list by keywords\"\nmsgstr \"通过关键字添加节点到备用节点列表\"\n\nmsgid \"Delete nodes in the standby node list by keywords\"\nmsgstr \"通过关键字删除备用节点列表的节点\"\n\nmsgid \"Please enter the node keyword, pay attention to distinguish between spaces, uppercase and lowercase.\"\nmsgstr \"请输入节点关键字，注意区分空格、大写和小写。\"\n\nmsgid \"Configure this node with 127.0.0.1: this port\"\nmsgstr \"使用 127.0.0.1 和此端口配置节点\"\n\nmsgid \"Enable Load Balancing\"\nmsgstr \"开启负载均衡\"\n\nmsgid \"Console Login Auth\"\nmsgstr \"控制台登录认证\"\n\nmsgid \"Console Username\"\nmsgstr \"控制台账号\"\n\nmsgid \"Console Password\"\nmsgstr \"控制台密码\"\n\nmsgid \"Console Port\"\nmsgstr \"控制台端口\"\n\nmsgid \"In the browser input routing IP plus port access, such as:192.168.1.1:1188\"\nmsgstr \"在浏览器输入路由IP加端口访问，如：192.168.1.1:1188\"\n\nmsgid \"Haproxy Port\"\nmsgstr \"负载均衡端口\"\n\nmsgid \"Health Check Type\"\nmsgstr \"健康检查类型\"\n\nmsgid \"Inner implement\"\nmsgstr \"内置实现\"\n\nmsgid \"Health Check Inter\"\nmsgstr \"健康检查节点间隔时间\"\n\nmsgid \"Note: Frequent health checks increase CPU usage; an interval ≥ 60 seconds is recommended.\"\nmsgstr \"注意：检测过于频繁会增加 CPU 负载，建议间隔 ≥60 秒。\"\n\nmsgid \"When the URL test is used, the load balancing node will be converted into a Socks node. when node list set customizing, must be a Socks node, otherwise the health check will be invalid.\"\nmsgstr \"当使用 URL 测试时，负载均衡节点将转换成 Socks 节点。下面的节点列表自定义时必须为 Socks 节点，否则健康检查将无效。\"\n\nmsgid \"Add a node, Export Of Multi WAN Only support Multi Wan. Load specific gravity range 1-256. Multiple primary servers can be load balanced, standby will only be enabled when the primary server is offline! Multiple groups can be set, Haproxy port same one for each group.\"\nmsgstr \"添加节点，指定出口功能是为多 WAN 用户准备的。负载比重范围 1-256。多个主服务器可以负载均衡，备用只有在主服务器离线时才会启用！可以设置多个组，负载均衡端口相同则为一组。\"\n\nmsgid \"Note that the node configuration parameters for load balancing must be consistent when use TCP health check type, otherwise it cannot be used normally!\"\nmsgstr \"注意，当使用 TCP 健康检查时负载均衡的节点配置参数必须一致，否则无法正常使用！\"\n\nmsgid \"Node\"\nmsgstr \"节点\"\n\nmsgid \"Node Address\"\nmsgstr \"节点地址\"\n\nmsgid \"Node address cannot be empty.\"\nmsgstr \"节点地址不能为空。\"\n\nmsgid \"Node Port\"\nmsgstr \"节点端口\"\n\nmsgid \"Node Weight\"\nmsgstr \"负载比重\"\n\nmsgid \"Export Of Multi WAN\"\nmsgstr \"多 WAN 指定出口\"\n\nmsgid \"Main\"\nmsgstr \"主要\"\n\nmsgid \"Mode\"\nmsgstr \"模式\"\n\nmsgid \"Primary\"\nmsgstr \"主要\"\n\nmsgid \"Standby\"\nmsgstr \"备用\"\n\nmsgid \"Check update\"\nmsgstr \"检查更新\"\n\nmsgid \"Force update\"\nmsgstr \"强制更新\"\n\nmsgid \"Manually update\"\nmsgstr \"手动更新\"\n\nmsgid \"Rollback\"\nmsgstr \"回滚\"\n\nmsgid \"Rollbacking...\"\nmsgstr \"回滚中...\"\n\nmsgid \"Update Options\"\nmsgstr \"更新选项\"\n\nmsgid \"The latest version: %s, currently does not support automatic update, if you need to update, please compile or download the ipk and then manually install.\"\nmsgstr \"最新版本：%s，目前暂不支持自动更新，如需更新，请自行编译或下载 ipk 然后手动安装。\"\n\nmsgid \"Enable custom URL\"\nmsgstr \"启用自定义规则地址\"\n\nmsgid \"GFW domains(gfwlist) Update URL\"\nmsgstr \"防火墙域名列表(gfwlist)更新URL\"\n\nmsgid \"China IPs(chnroute) Update URL\"\nmsgstr \"中国IP段(chnroute)更新URL\"\n\nmsgid \"China IPv6s(chnroute6) Update URL\"\nmsgstr \"中国IPv6段(chnroute6)更新URL\"\n\nmsgid \"China List(Chnlist) Update URL\"\nmsgstr \"中国域名列表(Chnlist)更新URL\"\n\nmsgid \"Rule status\"\nmsgstr \"规则版本\"\n\nmsgid \"Enable auto update rules\"\nmsgstr \"开启自动更新规则\"\n\nmsgid \"Update Time(every day)\"\nmsgstr \"更新时间(每天)\"\n\nmsgid \"Update Interval(hour)\"\nmsgstr \"更新间隔(小时)\"\n\nmsgid \"Update Mode\"\nmsgstr \"更新模式\"\n\nmsgid \"Loop Mode\"\nmsgstr \"循环\"\n\nmsgid \"Every day\"\nmsgstr \"每天\"\n\nmsgid \"Every Monday\"\nmsgstr \"每周一\"\n\nmsgid \"Every Tuesday\"\nmsgstr \"每周二\"\n\nmsgid \"Every Wednesday\"\nmsgstr \"每周三\"\n\nmsgid \"Every Thursday\"\nmsgstr \"每周四\"\n\nmsgid \"Every Friday\"\nmsgstr \"每周五\"\n\nmsgid \"Every Saturday\"\nmsgstr \"每周六\"\n\nmsgid \"Every Sunday\"\nmsgstr \"每周日\"\n\nmsgid \"hour\"\nmsgstr \"小时\"\n\nmsgid \"Hour\"\nmsgstr \"小时\"\n\nmsgid \"GeoIP Update URL\"\nmsgstr \"GeoIP 更新URL\"\n\nmsgid \"Geosite Update URL\"\nmsgstr \"Geosite 更新URL\"\n\nmsgid \"Location of Geo rule files\"\nmsgstr \"Geo 规则文件目录\"\n\nmsgid \"This variable specifies a directory where geoip.dat and geosite.dat files are.\"\nmsgstr \"此变量指定 geoip.dat 和 geosite.dat 文件所在的目录。\"\n\nmsgid \"Generate Rule List from Geo\"\nmsgstr \"从 Geo 文件生成规则\"\n\nmsgid \"Generate rule lists such as GFW, China domains, and China IP ranges based on Geo files.\"\nmsgstr \"根据 Geo 文件生成规则列表，包括 GFW、中国域名和中国 IP 段等。\"\n\nmsgid \"When manually updating with this option enabled, rules will be regenerated from existing Geo files even if no new version is available.\"\nmsgstr \"启用此选项后手动更新时,即使没有新版本也会从现有 Geo 文件重新生成规则。\"\n\nmsgid \"Enable Geo Data Parsing\"\nmsgstr \"开启 Geo 数据解析\"\n\nmsgid \"Analyzes and preloads GeoIP/Geosite data to enhance the shunt performance of Sing-box/Xray.\"\nmsgstr \"分析和预加载 GeoIP/Geosite 数据，以增强 Sing-box/Xray 的分流效果。\"\n\nmsgid \"Once enabled, the rule list can support GeoIP/Geosite rules.\"\nmsgstr \"启用后，规则列表可以支持 GeoIP/Geosite 规则。\"\n\nmsgid \"Note: Increases resource usage; Geosite analysis is only supported in ChinaDNS-NG and SmartDNS modes.\"\nmsgstr \"注：会增加一些系统资源的开销，仅在 ChinaDNS-NG 和 SmartDNS 模式下支持分析 Geosite 。\"\n\nmsgid \"Shunt Rule\"\nmsgstr \"分流规则\"\n\nmsgid \"Please note attention to the priority, the higher the order, the higher the priority.\"\nmsgstr \"请注意优先级问题，排序越上面优先级越高。\"\n\nmsgid \"Update...\"\nmsgstr \"更新中\"\n\nmsgid \"It is the latest version\"\nmsgstr \"已是最新版本\"\n\nmsgid \"Update successful\"\nmsgstr \"更新成功\"\n\nmsgid \"Click to update\"\nmsgstr \"点击更新\"\n\nmsgid \"Updating...\"\nmsgstr \"更新中\"\n\nmsgid \"Retry\"\nmsgstr \"重试\"\n\nmsgid \"Unexpected error\"\nmsgstr \"意外错误\"\n\nmsgid \"Updating, are you sure to close?\"\nmsgstr \"正在更新，你确认要关闭吗？\"\n\nmsgid \"Downloading...\"\nmsgstr \"下载中\"\n\nmsgid \"Unpacking...\"\nmsgstr \"解压中\"\n\nmsgid \"Moving...\"\nmsgstr \"移动中\"\n\nmsgid \"App Update\"\nmsgstr \"组件更新\"\n\nmsgid \"Please confirm that your firmware supports FPU.\"\nmsgstr \"请确认你的固件支持 FPU。\"\n\nmsgid \"if you want to run from memory, change the path, /tmp beginning then save the application and update it manually.\"\nmsgstr \"如果你希望从内存中运行，请更改路径，/tmp 开头，然后保存应用后，再手动更新。\"\n\nmsgid \"Make sure there is enough space to install %s\"\nmsgstr \"确保有足够的空间安装 %s\"\n\nmsgid \"App Path\"\nmsgstr \"程序路径\"\n\nmsgid \"%s App Path\"\nmsgstr \"%s 程序路径\"\n\nmsgid \"%s Client App Path\"\nmsgstr \"%s 客户端程序路径\"\n\nmsgid \"alternate API URL for version checking\"\nmsgstr \"用于版本检查的 API URL\"\n\nmsgid \"Node Subscribe\"\nmsgstr \"节点订阅\"\n\nmsgid \"Subscribe Remark\"\nmsgstr \"订阅备注（机场）\"\n\nmsgid \"Subscribe Info\"\nmsgstr \"订阅信息\"\n\nmsgid \"Subscribe URL\"\nmsgstr \"订阅网址\"\n\nmsgid \"Subscribe URL Access Method\"\nmsgstr \"订阅网址访问方式\"\n\nmsgid \"When adding a new subscription, please save and apply before manually subscribing. If you only change the subscription URL, you can subscribe manually, and the system will save it automatically.\"\nmsgstr \"新增订阅请先保存并应用后再手动订阅；如仅修改订阅地址，可直接手动订阅，系统将自动保存。\"\n\nmsgid \"Please save and apply before manually subscribing.\"\nmsgstr \"请先保存并应用后再手动订阅。\"\n\nmsgid \"Subscribe URL cannot be empty.\"\nmsgstr \"订阅网址不能为空。\"\n\nmsgid \"Subscribe via proxy\"\nmsgstr \"通过代理订阅\"\n\nmsgid \"Update Once on Boot\"\nmsgstr \"开机更新一次\"\n\nmsgid \"Updates the subscription the first time PassWall runs automatically after each system boot.\"\nmsgstr \"路由每次启动后，首次自动运行 PassWall 时更新订阅。\"\n\nmsgid \"Enable auto update subscribe\"\nmsgstr \"开启自动更新订阅\"\n\nmsgid \"Manual subscription\"\nmsgstr \"手动订阅\"\n\nmsgid \"Delete All Subscribe Node\"\nmsgstr \"删除所有订阅节点\"\n\nmsgid \"Delete the subscribed node\"\nmsgstr \"删除已订阅的节点\"\n\nmsgid \"Are you sure you want to delete all subscribed nodes?\"\nmsgstr \"您确定要删除所有已订阅的节点吗？\"\n\nmsgid \"Manual subscription All\"\nmsgstr \"手动订阅全部链接\"\n\nmsgid \"This remark already exists, please change a new remark.\"\nmsgstr \"此备注已存在，请改一个新的备注。\"\n\nmsgid \"Remark cannot be empty.\"\nmsgstr \"备注不能为空。\"\n\nmsgid \"URL cannot be empty.\"\nmsgstr \"网址不能为空。\"\n\nmsgid \"Filter keyword Mode\"\nmsgstr \"过滤关键字模式\"\n\nmsgid \"Discard List\"\nmsgstr \"丢弃列表\"\n\nmsgid \"Keep List\"\nmsgstr \"保留列表\"\n\nmsgid \"Discard List,But Keep List First\"\nmsgstr \"丢弃列表，但保留列表优先\"\n\nmsgid \"Keep List,But Discard List First\"\nmsgstr \"保留列表，但丢弃列表优先\"\n\nmsgid \"Use global config\"\nmsgstr \"使用全局配置\"\n\nmsgid \"User-Agent\"\nmsgstr \"用户代理(User-Agent)\"\n\nmsgid \"Used when the node link does not include this parameter.\"\nmsgstr \"当节点链接未包含该参数时，将使用此设置。\"\n\nmsgid \"Add\"\nmsgstr \"添加\"\n\nmsgid \"ACLs\"\nmsgstr \"访问控制\"\n\nmsgid \"ACLs is a tools which used to designate specific IP proxy mode.\"\nmsgstr \"访问控制列表是用于指定特殊 IP 代理模式的工具。\"\n\nmsgid \"Example:\"\nmsgstr \"例：\"\n\nmsgid \"IP range\"\nmsgstr \"IP 范围\"\n\nmsgid \"Source Interface\"\nmsgstr \"源接口\"\n\nmsgid \"Bridge\"\nmsgstr \"网桥\"\n\nmsgid \"Wireless Adapter\"\nmsgstr \"无线适配器\"\n\nmsgid \"Ethernet Adapter\"\nmsgstr \"以太网适配器\"\n\nmsgid \"Tunnel Interface\"\nmsgstr \"隧道接口\"\n\nmsgid \"Invalid interface name\"\nmsgstr \"无效的接口名称\"\n\nmsgid \"Use Interface With ACLs\"\nmsgstr \"使用接口控制\"\n\nmsgid \"Remarks\"\nmsgstr \"备注\"\n\nmsgid \"Direct List\"\nmsgstr \"直连列表\"\n\nmsgid \"Proxy List\"\nmsgstr \"代理列表\"\n\nmsgid \"Block List\"\nmsgstr \"屏蔽列表\"\n\nmsgid \"Lan IP List\"\nmsgstr \"局域网 IP 列表\"\n\nmsgid \"Route Hosts\"\nmsgstr \"路由 Hosts 文件\"\n\nmsgid \"Join the direct hosts list of domain names will not proxy.\"\nmsgstr \"加入的域名不走代理，对所有模式有效。且优先级最高。\"\n\nmsgid \"These had been joined ip addresses will not proxy. Please input the ip address or ip address segment,every line can input only one ip address. For example: 192.168.0.0/24 or 223.5.5.5.\"\nmsgstr \"加入的 IP 段不走代理，对所有模式有效。且优先级最高。可输入 IP 地址或地址段，如：192.168.0.0/24 或 223.5.5.5，每个地址段一行。\"\n\nmsgid \"These had been joined websites will use proxy. Please input the domain names of websites, every line can input only one website domain. For example: google.com.\"\nmsgstr \"加入的域名将走代理。输入网站域名，如：google.com，每个地址段一行。\"\n\nmsgid \"These had been joined ip addresses will use proxy. Please input the ip address or ip address segment, every line can input only one ip address. For example: 35.24.0.0/24 or 8.8.4.4.\"\nmsgstr \"加入的 IP 段将走代理。可输入 IP 地址或地址段，如：35.24.0.0/24 或 8.8.4.4，每个地址段一行。\"\n\nmsgid \"These had been joined websites will be block. Please input the domain names of websites, every line can input only one website domain. For example: twitter.com.\"\nmsgstr \"加入的域名将屏蔽。输入网站域名，如：twitter.com，每个地址段一行。\"\n\nmsgid \"The list is the IPv4 LAN IP list, which represents the direct connection IP of the LAN. If you need the LAN IP in the proxy list, please clear it from the list. Do not modify this list by default.\"\nmsgstr \"列表中为 IPv4 的局域网 IP 列表，代表局域网直连 IP。如果需要代理列表中的局域网 IP，请将其在该列表中清除，并将其添加到代理列表中。默认情况下不要修改这个列表。\"\n\nmsgid \"The list is the IPv6 LAN IP list, which represents the direct connection IP of the LAN. If you need the LAN IP in the proxy list, please clear it from the list. Do not modify this list by default.\"\nmsgstr \"列表中为 IPv6 的局域网 IP 列表，代表局域网直连 IP。如果需要代理列表中的局域网 IP，请将其在该列表中清除，并将其添加到代理列表中。默认情况下不要修改这个列表。\"\n\nmsgid \"Configure routing etc/hosts file, if you don't know what you are doing, please don't change the content.\"\nmsgstr \"配置路由 etc/hosts 文件，如果你不知道自己在做什么，请不要改动内容。\"\n\nmsgid \"These had been joined ip addresses will be block. Please input the ip address or ip address segment, every line can input only one ip address.\"\nmsgstr \"加入的 IP 段将屏蔽。可输入 IP 地址或地址段，每个地址段一行。\"\n\nmsgid \"Inbound Tag\"\nmsgstr \"入站标签\"\n\nmsgid \"Transparent proxy\"\nmsgstr \"透明代理\"\n\nmsgid \"Not valid domain name, please re-enter!\"\nmsgstr \"不是有效域名，请重新输入！\"\n\nmsgid \"Not valid IP format, please re-enter!\"\nmsgstr \"不是有效 IP 格式，请重新输入！\"\n\nmsgid \"Not valid IPv4 format, please re-enter!\"\nmsgstr \"不是有效 IPv4 格式，请重新输入！\"\n\nmsgid \"Not valid IPv6 format, please re-enter!\"\nmsgstr \"不是有效 IPv6 格式，请重新输入！\"\n\nmsgid \"Not true format, please re-enter!\"\nmsgstr \"不是正确的格式，请重新输入！\"\n\nmsgid \"Plaintext: If this string matches any part of the targeting domain, this rule takes effet. Example: rule 'sina.com' matches targeting domain 'sina.com', 'sina.com.cn' and 'www.sina.com', but not 'sina.cn'.\"\nmsgstr \"纯字符串: 当此字符串匹配目标域名中任意部分，该规则生效。比如'sina.com'可以匹配'sina.com'、'sina.com.cn'和'www.sina.com'，但不匹配'sina.cn'。\"\n\nmsgid \"Regular expression: Begining with 'regexp:', the rest is a regular expression. When the regexp matches targeting domain, this rule takes effect. Example: rule 'regexp:\\\\.goo.*\\\\.com$' matches 'www.google.com' and 'fonts.googleapis.com', but not 'google.com'.\"\nmsgstr \"正则表达式: 由'regexp:'开始，余下部分是一个正则表达式。当此正则表达式匹配目标域名时，该规则生效。例如'regexp:\\\\.goo.*\\\\.com$'匹配'www.google.com'、'fonts.googleapis.com'，但不匹配'google.com'。\"\n\nmsgid \"Subdomain (recommended): Begining with 'domain:' and the rest is a domain. When the targeting domain is exactly the value, or is a subdomain of the value, this rule takes effect. Example: rule 'domain:v2ray.com' matches 'www.v2ray.com', 'v2ray.com', but not 'xv2ray.com'.\"\nmsgstr \"子域名 (推荐): 由'domain:'开始，余下部分是一个域名。当此域名是目标域名或其子域名时，该规则生效。例如'domain:v2ray.com'匹配'www.v2ray.com'、'v2ray.com'，但不匹配'xv2ray.com'。\"\n\nmsgid \"Full domain: Begining with 'full:' and the rest is a domain. When the targeting domain is exactly the value, the rule takes effect. Example: rule 'domain:v2ray.com' matches 'v2ray.com', but not 'www.v2ray.com'.\"\nmsgstr \"完整匹配: 由'full:'开始，余下部分是一个域名。当此域名完整匹配目标域名时，该规则生效。例如'full:v2ray.com'匹配'v2ray.com'但不匹配'www.v2ray.com'。\"\n\nmsgid \"Pre-defined domain list: Begining with 'geosite:' and the rest is a name, such as geosite:google or geosite:cn.\"\nmsgstr \"预定义域名列表：由'geosite:'开头，余下部分是一个名称，如geosite:google或者geosite:cn。\"\n\nmsgid \"Sing-Box is compatible with Geo rules and rule-set. rule-set begin with 'rule-set:remote:' or 'rule-set:local:'.\"\nmsgstr \"Sing-Box 可兼容 Geo 规则和规则集，规则集由 'rule-set:remote:' 或 'rule-set:local:' 开始。\"\n\nmsgid \"Such as:\"\nmsgstr \"例如：\"\n\nmsgid \"Annotation: Begining with #\"\nmsgstr \"注释: 由 # 开头\"\n\nmsgid \"Invert match result.\"\nmsgstr \"反选匹配结果。\"\n\nmsgid \"Only support Sing-Box.\"\nmsgstr \"只支持 Sing-Box。\"\n\nmsgid \"IP: such as '127.0.0.1'.\"\nmsgstr \"IP: 形如'127.0.0.1'。\"\n\nmsgid \"CIDR: such as '127.0.0.0/8'.\"\nmsgstr \"CIDR: 形如'10.0.0.0/8'.\"\n\nmsgid \"GeoIP: such as 'geoip:cn'. It begins with geoip: (lower case) and followed by two letter of country code.\"\nmsgstr \"GeoIP: 形如'geoip:cn'，必须以geoip:（小写）开头，后面跟双字符国家代码，支持几乎所有可以上网的国家。\"\n\nmsgid \"Clear logs\"\nmsgstr \"清空日志\"\n\nmsgid \"Only recommend to use with VLESS-TCP-XTLS-Vision.\"\nmsgstr \"只推荐与 VLESS-TCP-XTLS-Vision 搭配使用。\"\n\nmsgid \"Password\"\nmsgstr \"密码\"\n\nmsgid \"IV Check\"\nmsgstr \"IV 检查\"\n\nmsgid \"UDP over TCP\"\nmsgstr \"TCP 封装 UDP\"\n\nmsgid \"Connection Timeout\"\nmsgstr \"连接超时时间\"\n\nmsgid \"Local Port\"\nmsgstr \"本地端口\"\n\nmsgid \"Fast Open\"\nmsgstr \"快速打开\"\n\nmsgid \"Pre-connections\"\nmsgstr \"预连接\"\n\nmsgid \"Number of early established connections to reduce latency.\"\nmsgstr \"预连接的数量，用于降低延迟。\"\n\nmsgid \"Need node support required\"\nmsgstr \"需要节点支持\"\n\nmsgid \"plugin\"\nmsgstr \"插件\"\n\nmsgid \"Supports custom SIP003 plugins, Make sure the plugin is installed.\"\nmsgstr \"支持自定义 SIP003 插件，请确保插件已安装。\"\n\nmsgid \"opts\"\nmsgstr \"插件选项\"\n\nmsgid \"Protocol\"\nmsgstr \"协议名称\"\n\nmsgid \"Protocol_param\"\nmsgstr \"协议参数\"\n\nmsgid \"Obfs\"\nmsgstr \"混淆\"\n\nmsgid \"Obfs_param\"\nmsgstr \"混淆参数\"\n\nmsgid \"Plugin Name\"\nmsgstr \"插件名称\"\n\nmsgid \"Plugin Arguments\"\nmsgstr \"插件参数\"\n\nmsgid \"User Level\"\nmsgstr \"用户等级(level)\"\n\nmsgid \"Transport\"\nmsgstr \"传输方式\"\n\nmsgid \"Public Key\"\nmsgstr \"公钥\"\n\nmsgid \"Private Key\"\nmsgstr \"私钥\"\n\nmsgid \"Pre shared key\"\nmsgstr \"额外的对称加密密钥\"\n\nmsgid \"Local Address\"\nmsgstr \"本地地址\"\n\nmsgid \"Decimal numbers separated by \\\",\\\" or Base64-encoded strings.\"\nmsgstr \"用“,”隔开的十进制数字或 Base64 编码字符串。\"\n\nmsgid \"Camouflage Domain\"\nmsgstr \"伪装域名\"\n\nmsgid \"Camouflage Type\"\nmsgstr \"伪装类型\"\n\nmsgid \"Transport Layer Encryption\"\nmsgstr \"传输层加密\"\n\nmsgid \"Whether or not transport layer encryption is enabled, \\\"none\\\" for unencrypted, \\\"tls\\\" for using TLS, \\\"xtls\\\" for using XTLS.\"\nmsgstr \"是否启入传输层加密，支持的选项有 \\\"none\\\" 表示不加密，\\\"tls\\\" 表示使用 TLS，\\\"xtls\\\" 表示使用 XTLS。\"\n\nmsgid \"Transfer mode\"\nmsgstr \"传输模式\"\n\nmsgid \"Do not send server name in ClientHello.\"\nmsgstr \"不要在 ClientHello 中发送服务器名称。\"\n\nmsgid \"Domain\"\nmsgstr \"域名\"\n\nmsgid \"allowInsecure\"\nmsgstr \"允许不安全连接\"\n\nmsgid \"Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.\"\nmsgstr \"是否允许不安全连接。当勾选时，将跳过证书验证。\"\n\nmsgid \"%s Node Use Type\"\nmsgstr \"%s 节点使用类型\"\n\nmsgid \"UDP relay mode\"\nmsgstr \"UDP 中继模式\"\n\nmsgid \"Congestion control algorithm\"\nmsgstr \"拥塞控制算法\"\n\nmsgid \"Heartbeat interval(second)\"\nmsgstr \"保活心跳包发送间隔（单位：秒）\"\n\nmsgid \"Disable SNI\"\nmsgstr \"关闭 SNI 服务器名称指示\"\n\nmsgid \"Enable 0-RTT QUIC handshake\"\nmsgstr \"客户端启用 0-RTT QUIC 连接握手\"\n\nmsgid \"<br />none: default, no masquerade, data sent is packets with no characteristics.<br />srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime).<br />utp: packets disguised as uTP will be recognized as bittorrent downloaded data.<br />wechat-video: packets disguised as WeChat video calls.<br />dtls: disguised as DTLS 1.2 packet.<br />wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)<br />dns: Disguising traffic as DNS requests.\"\nmsgstr \"<br />none：默认值，不进行伪装，发送的数据是没有特征的数据包。<br />srtp：伪装成 SRTP 数据包，会被识别为视频通话数据（如 FaceTime）。<br />utp：伪装成 uTP 数据包，会被识别为 BT 下载数据。<br />wechat-video：伪装成微信视频通话的数据包。<br />dtls：伪装成 DTLS 1.2 数据包。<br />wireguard：伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)<br />dns：把流量伪装成 DNS 请求。\"\n\nmsgid \"Use it together with the DNS disguised type. You can fill in any domain.\"\nmsgstr \"配合伪装类型 DNS 使用，可随便填一个域名。\"\n\nmsgid \"Auth\"\nmsgstr \"身份认证\"\n\nmsgid \"Socks for authentication\"\nmsgstr \"Socks 认证方式\"\n\nmsgid \"Socks protocol authentication, support anonymous and password.\"\nmsgstr \"Socks 协议的认证方式，支持匿名方式和账号密码方式。\"\n\nmsgid \"anonymous\"\nmsgstr \"匿名\"\n\nmsgid \"User Password\"\nmsgstr \"账号密码\"\n\nmsgid \"Username and Password must be used together!\"\nmsgstr \"账号和密码必须同时使用！\"\n\nmsgid \"Node Number\"\nmsgstr \"节点数量\"\n\nmsgid \"You can only set up a maximum of %s nodes for the time being, Used for access control.\"\nmsgstr \"目前最多只能设置 %s 个节点，用于给访问控制使用。\"\n\nmsgid \"Prefer firewall tools\"\nmsgstr \"首选防火墙工具\"\n\nmsgid \"IPv6 TProxy\"\nmsgstr \"IPv6 透明代理(TProxy)\"\n\nmsgid \"Experimental feature. Make sure that your node supports IPv6.\"\nmsgstr \"实验特性，请确保你的节点支持IPv6\"\n\nmsgid \"Status info\"\nmsgstr \"状态信息\"\n\nmsgid \"Big icon\"\nmsgstr \"大图标\"\n\nmsgid \"Show node check\"\nmsgstr \"显示节点检测\"\n\nmsgid \"Show Show IP111\"\nmsgstr \"显示 IP111\"\n\nmsgid \"Destination protocol\"\nmsgstr \"目标协议\"\n\nmsgid \"Destination address\"\nmsgstr \"目标地址\"\n\nmsgid \"Destination port\"\nmsgstr \"目标端口\"\n\nmsgid \"Whether to receive PROXY protocol, when this node want to be fallback or forwarded by proxy, it must be enable, otherwise it cannot be used.\"\nmsgstr \"是否接收 PROXY protocol，当该节点要被回落或被代理转发时，必须启用，否则不能使用。\"\n\nmsgid \"outbound node\"\nmsgstr \"出站节点\"\n\nmsgid \"Custom Socks\"\nmsgstr \"自定义 Socks\"\n\nmsgid \"Custom HTTP\"\nmsgstr \"自定义 HTTP\"\n\nmsgid \"Custom Interface\"\nmsgstr \"自定义接口\"\n\nmsgid \"Interface\"\nmsgstr \"接口\"\n\nmsgid \"Bind Local\"\nmsgstr \"本机监听\"\n\nmsgid \"When selected, it can only be accessed localhost.\"\nmsgstr \"当勾选时，只能本机访问。\"\n\nmsgid \"Accept LAN Access\"\nmsgstr \"接受局域网访问\"\n\nmsgid \"When selected, it can accessed lan , this will not be safe!\"\nmsgstr \"当勾选时，可以直接访问局域网，这将不安全！（非特殊情况不建议开启）\"\n\nmsgid \"Enable Remote\"\nmsgstr \"启用转发\"\n\nmsgid \"You can forward to Nginx/Caddy/V2ray/Xray WebSocket and more.\"\nmsgstr \"您可以转发到 Nginx/Caddy/V2ray/Xray WebSocket 等。\"\n\nmsgid \"Remote Address\"\nmsgstr \"远程地址\"\n\nmsgid \"Remote Port\"\nmsgstr \"远程端口\"\n\nmsgid \"as:\"\nmsgstr \"如：\"\n\nmsgid \"Public key absolute path\"\nmsgstr \"公钥文件绝对路径\"\n\nmsgid \"Private key absolute path\"\nmsgstr \"私钥文件绝对路径\"\n\nmsgid \"Can't find this file!\"\nmsgstr \"找不到这个文件！\"\n\nmsgid \"Public key and Private key path can not be empty!\"\nmsgstr \"公钥和私钥文件路径不能为空！\"\n\nmsgid \"Server-Side\"\nmsgstr \"服务器端\"\n\nmsgid \"Server Config\"\nmsgstr \"服务器配置\"\n\nmsgid \"Users Manager\"\nmsgstr \"用户管理\"\n\nmsgid \"Logs\"\nmsgstr \"日志\"\n\nmsgid \"Log\"\nmsgstr \"日志\"\n\nmsgid \"%s Node Log\"\nmsgstr \"%s 节点日志\"\n\nmsgid \"Log Level\"\nmsgstr \"日志等级\"\n\nmsgid \"Advanced log feature\"\nmsgstr \"高级日志功能\"\n\nmsgid \"For professionals only.\"\nmsgstr \"仅限专业人士使用。\"\n\nmsgid \"Persist log file directory\"\nmsgstr \"持久性日志文件目录\"\n\nmsgid \"The path to the directory used to store persist log files, the \\\"/\\\" at the end can be omitted. Leave it blank to disable this feature.\"\nmsgstr \"用来存储持久性日志文件的目录路径，末尾的 “/” 可以省略。留空以禁用此功能。\"\n\nmsgid \"Logging to system log\"\nmsgstr \"记录到系统日志\"\n\nmsgid \"Logging to the system log for more advanced functions. For example, send logs to a dedicated log server.\"\nmsgstr \"将日志记录到系统日志，以实现更加高级的功能。例如，把日志发送到专门的日志服务器。\"\n\nmsgid \"Log Event Filter\"\nmsgstr \"日志事件过滤器\"\n\nmsgid \"Support regular expression.\"\nmsgstr \"支持正则表达式。\"\n\nmsgid \"Shell Command\"\nmsgstr \"Shell 命令\"\n\nmsgid \"Shell command to execute, replace log content with %s.\"\nmsgstr \"要执行的 Shell 命令，用 %s 代替日志内容。\"\n\nmsgid \"Not enabled log\"\nmsgstr \"未启用日志\"\n\nmsgid \"It is recommended to disable logging during regular use to reduce system overhead.\"\nmsgstr \"正常使用时建议关闭日志，以减少系统开销。\"\n\nmsgid \"UDP Forward\"\nmsgstr \"UDP 转发\"\n\nmsgid \"DNS Settings\"\nmsgstr \"DNS 设置\"\n\nmsgid \"Null\"\nmsgstr \"无\"\n\nmsgid \"You did not fill in the %s path. Please save and apply then update manually.\"\nmsgstr \"您没有填写 %s 路径。请保存应用后再手动更新。\"\n\nmsgid \"Not installed %s, Can't unzip!\"\nmsgstr \"未安装 %s，无法解压！\"\n\nmsgid \"Can't determine ARCH, or ARCH not supported.\"\nmsgstr \"无法确认ARCH架构，或是不支持。\"\n\nmsgid \"Get remote version info failed.\"\nmsgstr \"获取远程版本信息失败。\"\n\nmsgid \"New version found, but failed to get new version download url.\"\nmsgstr \"发现新版本，但未能获得新版本的下载地址。\"\n\nmsgid \"Download url is required.\"\nmsgstr \"请指定下载地址。\"\n\nmsgid \"File download failed or timed out: %s\"\nmsgstr \"文件下载失败或超时：%s\"\n\nmsgid \"File path required.\"\nmsgstr \"请指定文件路径。\"\n\nmsgid \"%s not enough space.\"\nmsgstr \"%s 空间不足。\"\n\nmsgid \"Can't find client in file: %s\"\nmsgstr \"无法在文件中找到客户端：%s\"\n\nmsgid \"Client file is required.\"\nmsgstr \"请指定客户端文件。\"\n\nmsgid \"The client file is not suitable for current device.\"\nmsgstr \"客户端文件不适合当前设备。\"\n\nmsgid \"Can't move new file to path: %s\"\nmsgstr \"无法移动新文件到：%s\"\n\nmsgid \"An XHttpObject in JSON format, used for sharing.\"\nmsgstr \"JSON 格式的 XHttpObject，用来实现分享。\"\n\nmsgid \"Enable Mux.Cool\"\nmsgstr \"启用 Mux.Cool\"\n\nmsgid \"Mux concurrency\"\nmsgstr \"最大并发连接数\"\n\nmsgid \"XUDP Mux concurrency\"\nmsgstr \"XUDP 最大并发连接数\"\n\nmsgid \"Padding\"\nmsgstr \"填充\"\n\nmsgid \"Enable early data\"\nmsgstr \"启用前置数据\"\n\nmsgid \"Early data length\"\nmsgstr \"前置数据最大长度\"\n\nmsgid \"Early data header name\"\nmsgstr \"前置数据 HTTP 头名\"\n\nmsgid \"Recommended value: Sec-WebSocket-Protocol\"\nmsgstr \"推荐值：Sec-WebSocket-Protocol\"\n\nmsgid \"Health check\"\nmsgstr \"健康检查\"\n\nmsgid \"Health check timeout\"\nmsgstr \"检查超时时间\"\n\nmsgid \"Permit without stream\"\nmsgstr \"无子连接时的健康检查\"\n\nmsgid \"Initial Windows Size\"\nmsgstr \"初始窗口大小\"\n\nmsgid \"Excluded Domains\"\nmsgstr \"排除域名\"\n\nmsgid \"If the traffic sniffing result is in this list, the destination address will not be overridden.\"\nmsgstr \"如果流量嗅探结果在此列表中，则不会覆盖目标地址。\"\n\nmsgid \"Buffer Size\"\nmsgstr \"缓冲区大小\"\n\nmsgid \"Buffer size for every connection (kB)\"\nmsgstr \"每一个连接的缓冲区大小（kB）\"\n\nmsgid \"Idle Timeout\"\nmsgstr \"空闲超时\"\n\nmsgid \"Hop Interval(second)\"\nmsgstr \"端口跳跃间隔（秒）\"\n\nmsgid \"Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5.\"\nmsgstr \"支持固定值或随机范围（如 30 或 5-30），最小 5 秒。\"\n\nmsgid \"HeartbeatPeriod(second)\"\nmsgstr \"心跳周期（单位：秒）\"\n\nmsgid \"Override the connection destination address\"\nmsgstr \"覆盖连接目标地址\"\n\nmsgid \"Handshake Server\"\nmsgstr \"握手服务器\"\n\nmsgid \"Handshake Server Port\"\nmsgstr \"握手服务器端口\"\n\nmsgid \"Override the connection destination address with the sniffed domain.<br />Otherwise use sniffed domain for routing only.<br />If using shunt nodes, configure the domain shunt rules correctly.\"\nmsgstr \"用探测出的域名覆盖连接目标地址。<br />否则仅将探测得到的域名用于路由。<br />如使用分流节点，请正确设置域名分流规则。\"\n\nmsgid \"Override the connection destination address with the sniffed domain.<br />When enabled, traffic will match only by domain, ignoring IP rules.<br />If using shunt nodes, configure the domain shunt rules correctly.\"\nmsgstr \"用探测出的域名覆盖连接目标地址。<br />启用后仅使用域名进行流量匹配，将忽略IP规则。<br />如使用分流节点，请正确设置域名分流规则。\"\n\nmsgid \"Protocol parameter. Will waste traffic randomly if enabled.\"\nmsgstr \"协议参数。如果启用会随机浪费流量。\"\n\nmsgid \"Protocol parameter. Enable length block encryption.\"\nmsgstr \"协议参数。启用长度块加密。\"\n\nmsgid \"TLS Chain Fingerprint (SHA256)\"\nmsgstr \"TLS 证书链指纹（SHA256）\"\n\nmsgid \"Once set, connects only when the server’s chain fingerprint matches.\"\nmsgstr \"设置后，仅在服务器证书链指纹匹配时连接。\"\n\nmsgid \"TLS Certificate Name (CertName)\"\nmsgstr \"TLS 证书名称（CertName）\"\n\nmsgid \"TLS is used to verify the leaf certificate name.\"\nmsgstr \"TLS 用于验证 leaf 证书的 name。\"\n\nmsgid \"Fetch Manually\"\nmsgstr \"手动获取\"\n\nmsgid \"Fetch Failed\"\nmsgstr \"获取失败\"\n\nmsgid \"ECH Config\"\nmsgstr \"ECH 配置\"\n\nmsgid \"ECH Key\"\nmsgstr \"ECH 密钥\"\n\nmsgid \"ECH Query Domain\"\nmsgstr \"ECH 查询域名\"\n\nmsgid \"Overrides the domain name used for ECH HTTPS record queries.\"\nmsgstr \"覆盖用于 ECH HTTPS 记录查询的域名。\"\n\nmsgid \"Enable Multipath TCP, need to be enabled in both server and client configuration.\"\nmsgstr \"启用 Multipath TCP，需在服务端和客户端配置中同时启用。\"\n\nmsgid \"An FinalMaskObject in JSON format, used for sharing.\"\nmsgstr \"JSON 格式的 FinalMaskObject，用来实现分享。\"\n\nmsgid \"Custom finalmask overrides mkcp, hysteria2, fragment, noise, and related settings.\"\nmsgstr \"自定义 finalmask 将覆盖 mkcp、hysteria2、fragment、noise 等相关配置。\"\n\nmsgid \"Fragment\"\nmsgstr \"分片\"\n\nmsgid \"TCP fragments, which can deceive the censorship system in some cases, such as bypassing SNI blacklists.\"\nmsgstr \"TCP 分片，在某些情况下可以欺骗审查系统，比如绕过 SNI 黑名单。\"\n\nmsgid \"Fragment Packets\"\nmsgstr \"分片方式\"\n\nmsgid \"\\\"1-3\\\" is for segmentation at TCP layer, applying to the beginning 1 to 3 data writes by the client. \\\"tlshello\\\" is for TLS client hello packet fragmentation.\"\nmsgstr \"\\\"1-3\\\" 是 TCP 的流切片，应用于客户端第 1 至第 3 次写数据。\\\"tlshello\\\" 是 TLS 握手包切片。\"\n\nmsgid \"Fragment Length\"\nmsgstr \"分片包长\"\n\nmsgid \"Fragmented packet length (byte)\"\nmsgstr \"分片包长 (byte)\"\n\nmsgid \"Fragment Delay\"\nmsgstr \"分片延迟\"\n\nmsgid \"Fragmentation interval (ms)\"\nmsgstr \"分片间隔（ms）\"\n\nmsgid \"Max Split\"\nmsgstr \"最大分片数\"\n\nmsgid \"Limit the maximum number of splits.\"\nmsgstr \"限制分片的最大数量。\"\n\nmsgid \"Split handshake data into multiple TLS records for better censorship evasion. Low overhead. Recommended to enable first.\"\nmsgstr \"将握手数据拆分为多个 TLS 记录，提升抗封锁能力，几乎不增加延迟，建议优先启用。\"\n\nmsgid \"Split handshake into multiple TCP segments. Enhances obfuscation. May increase delay. Use only if needed.\"\nmsgstr \"将 TLS 握手数据分为多个 TCP 包发送，提高伪装性，可能增加延迟，仅在封锁严重时使用。\"\n\nmsgid \"Noise\"\nmsgstr \"噪声\"\n\nmsgid \"UDP noise, Under some circumstances it can bypass some UDP based protocol restrictions.\"\nmsgstr \"UDP 噪声，在某些情况下可以绕过一些针对 UDP 协议的限制。\"\n\nmsgid \"To send noise packets, select \\\"Noise\\\" in Xray Settings.\"\nmsgstr \"在 Xray 设置中勾选 “噪声” 以发送噪声包。\"\n\nmsgid \"Xray Noise Packets\"\nmsgstr \"Xray 噪声数据包\"\n\nmsgid \"Packet | Rand Length\"\nmsgstr \"数据包 | Rand 长度\"\n\nmsgid \"Delay (ms)\"\nmsgstr \"延迟（ms）\"\n\nmsgid \"If is domain name, The requested domain name will be resolved to IP before connect.\"\nmsgstr \"如果是域名，域名将在请求发出之前解析为 IP。\"\n\nmsgid \"Domain DNS Resolve\"\nmsgstr \"域名 DNS 解析\"\n\nmsgid \"If the node address is a domain name, this DNS will be used for resolution.\"\nmsgstr \"如果节点地址是域名，则将使用此 DNS 进行解析。\"\n\nmsgid \"Note: For node-specific DNS only. Keep Auto to avoid extra overhead.\"\nmsgstr \"注意：仅用于节点专用 DNS，通常请保持自动，以免增加开销。\"\n\nmsgid \"Supports only Xray or Sing-box node types.\"\nmsgstr \"仅支持 Xray 或 Sing-box 类型节点。\"\n\nmsgid \"Chain Proxy\"\nmsgstr \"链式代理\"\n\nmsgid \"Landing Node\"\nmsgstr \"落地节点\"\n\nmsgid \"Only support a layer of proxy.\"\nmsgstr \"仅支持一层代理。\"\n\nmsgid \"\"\n\"Chained proxy works only with Xray or Sing-box nodes.<br>\"\n\"You can only use manual or imported nodes as chained nodes.\"\nmsgstr \"\"\n\"链式代理仅支持 Xray 或 Sing-box 节点。<br>\"\n\"仅支持手动添加或导入的节点用作链式节点。\"\n\nmsgid \"Only work with using the %s node.\"\nmsgstr \"与使用 %s 节点时生效。\"\n\nmsgid \"Total Lines\"\nmsgstr \"总行数：\"\n\nmsgid \"Read List\"\nmsgstr \"读取列表\"\n\nmsgid \"Maintain\"\nmsgstr \"维护\"\n\nmsgid \"Backup and Restore\"\nmsgstr \"备份还原\"\n\nmsgid \"Backup or Restore Client and Server Configurations.\"\nmsgstr \"备份或还原客户端及服务端配置。\"\n\nmsgid \"Note: Restoring configurations across different versions may cause compatibility issues.\"\nmsgstr \"注意：不同版本间的配置恢复可能会导致兼容性问题。\"\n\nmsgid \"Create Backup File\"\nmsgstr \"创建备份文件\"\n\nmsgid \"Restore Backup File\"\nmsgstr \"恢复备份文件\"\n\nmsgid \"DL Backup\"\nmsgstr \"下载备份\"\n\nmsgid \"RST Backup\"\nmsgstr \"恢复备份\"\n\nmsgid \"UL Restore\"\nmsgstr \"上传恢复\"\n\nmsgid \"CLOSE WIN\"\nmsgstr \"关闭窗口\"\n\nmsgid \"Restore to default configuration\"\nmsgstr \"恢复默认配置\"\n\nmsgid \"Do Reset\"\nmsgstr \"执行重置\"\n\nmsgid \"Please select a file first.\"\nmsgstr \"请先选择一个文件。\"\n\nmsgid \"Invalid file type. Please upload a .tar.gz file.\"\nmsgstr \"文件类型无效，请上传一个 .tar.gz 文件。\"\n\nmsgid \"File size exceeds 10MB limit.\"\nmsgstr \"文件大小超过 10MB 限制。\"\n\nmsgid \"Do you want to restore the client to default settings?\"\nmsgstr \"是否要恢复客户端默认配置？\"\n\nmsgid \"Are you sure you want to restore the client to default settings?\"\nmsgstr \"是否真的要恢复客户端默认配置？\"\n\nmsgid \"_urltest\"\nmsgstr \"URLTest\"\n\nmsgid \"URLTest node list\"\nmsgstr \"URLTest 节点列表\"\n\nmsgid \"List of nodes to test, <a target='_blank' href='https://sing-box.sagernet.org/configuration/outbound/urltest'>document</a>\"\nmsgstr \"要测试的节点列表，<a target='_blank' href='https://sing-box.sagernet.org/zh/configuration/outbound/urltest'>文档原理</a>\"\n\nmsgid \"Test interval\"\nmsgstr \"测试间隔\"\n\nmsgid \"Test interval must be less or equal than idle timeout.\"\nmsgstr \"测试间隔时间必须小于或等于空闲超时时间。\"\n\nmsgid \"Test tolerance\"\nmsgstr \"测试容差\"\n\nmsgid \"The test tolerance in milliseconds.\"\nmsgstr \"测试容差时间（单位：毫秒）。\"\n\nmsgid \"Idle timeout\"\nmsgstr \"空闲超时\"\n\nmsgid \"The idle timeout.\"\nmsgstr \"空闲超时时间。\"\n\nmsgid \"Interrupt existing connections\"\nmsgstr \"中断现有连接\"\n\nmsgid \"Interrupt existing connections when the selected outbound has changed.\"\nmsgstr \"当选择的出站发生变化时中断现有连接。\"\n\nmsgid \"Port hopping range\"\nmsgstr \"端口跳跃范围\"\n\nmsgid \"Format as 1000:2000 or 1000-2000 Multiple groups are separated by commas (,).\"\nmsgstr \"格式为：1000:2000 或 1000-2000 多组时用逗号(,)隔开。\"\n\nmsgid \"Use Custom Config\"\nmsgstr \"使用自定义配置\"\n\nmsgid \"Custom Config\"\nmsgstr \"自定义配置\"\n\nmsgid \"Must be JSON text!\"\nmsgstr \"必须是 JSON 文本内容！\"\n\nmsgid \"Geo View\"\nmsgstr \"Geo 查询\"\n\nmsgid \"Query\"\nmsgstr \"查询\"\n\nmsgid \"Querying\"\nmsgstr \"查询中\"\n\nmsgid \"Please enter query content!\"\nmsgstr \"请输入查询内容！\"\n\nmsgid \"No results were found!\"\nmsgstr \"未找到任何结果！\"\n\nmsgid \"Rules containing this value:\"\nmsgstr \"所在规则列表：\"\n\nmsgid \"Domain/IP Query\"\nmsgstr \"域名/IP 查询\"\n\nmsgid \"GeoIP/Geosite Query\"\nmsgstr \"GeoIP/Geosite 查询\"\n\nmsgid \"Enter a domain or IP to query the Geo rule list they belong to.\"\nmsgstr \"输入域名/IP，查询它们所在的 Geo 规则列表。\"\n\nmsgid \"Enter a GeoIP or Geosite to extract the domains/IPs they contain. Format: geoip:cn or geosite:gfw\"\nmsgstr \"输入 GeoIP/Geosite，提取它们所包含的域名/IP。格式：geoip:cn 或 geosite:gfw\"\n\nmsgid \"Tips:\"\nmsgstr \"小贴士：\"\n\nmsgid \"By entering a domain or IP, you can query the Geo rule list they belong to.\"\nmsgstr \"可以通过输入域名/IP，查询它们所在的 Geo 规则列表。\"\n\nmsgid \"By entering a GeoIP or Geosite, you can extract the domains/IPs they contain.\"\nmsgstr \"可以通过输入 GeoIP/Geosite，提取它们所包含的域名/IP。\"\n\nmsgid \"Use the GeoIP/Geosite query function to verify if the entered Geo rules are correct.\"\nmsgstr \"利用 GeoIP/Geosite 查询功能，可以验证输入的 Geo 规则是否正确。\"\n\nmsgid \"Private Key Passphrase\"\nmsgstr \"私钥指纹\"\n\nmsgid \"Host Key\"\nmsgstr \"主机密钥\"\n\nmsgid \"Accept any if empty.\"\nmsgstr \"留空则不校验。\"\n\nmsgid \"Host Key Algorithms\"\nmsgstr \"主机密钥算法\"\n\nmsgid \"Client Version\"\nmsgstr \"客户端版本\"\n\nmsgid \"Random version will be used if empty.\"\nmsgstr \"如留空，则使用随机版本。\"\n\nmsgid \"The configured type also applies to the core specified when manually importing nodes.\"\nmsgstr \"配置的类型同样适用于手动导入节点时所指定的核心程序。\"\n\nmsgid \"Group Name\"\nmsgstr \"分组名\"\n\nmsgid \"Reassign Group\"\nmsgstr \"调整分组\"\n\nmsgid \"Reassign Node Group\"\nmsgstr \"调整节点分组\"\n\nmsgid \"Currently using %s node\"\nmsgstr \"当前使用的 %s 节点\"\n\nmsgid \"Search nodes...\"\nmsgstr \"搜索节点…\"\n\nmsgid \"Concurrent Tunnels\"\nmsgstr \"并发隧道连接数\"\n\nmsgid \"Processing, please wait…\"\nmsgstr \"正在处理，请稍候…\"\n"
  },
  {
    "path": "luci-app-passwall/root/etc/config/passwall_server",
    "content": "\nconfig global 'global'\n\toption enable '0'\n\n"
  },
  {
    "path": "luci-app-passwall/root/etc/hotplug.d/iface/98-passwall",
    "content": "#!/bin/sh\n\n. /usr/share/passwall/utils.sh\n\n[ \"$ACTION\" = \"ifup\" ] || [ \"$ACTION\" = \"ifupdate\" ] || exit 0\n\n([ \"$(get_cache_var \"ENABLED_DEFAULT_ACL\")\" = \"1\" ] || [ \"$(get_cache_var \"ENABLED_ACLS\")\" = \"1\" ]) && [ -f ${LOCK_PATH}/${CONFIG}_ready.lock ] && {\n\n\tdefault_device=$(ip route show default 2>/dev/null | awk -F 'dev ' '{print $2}' | awk '{print $1}' | head -n1)\n\tdefault6_device=$(ip -6 route show default 2>/dev/null | awk -F 'dev ' '{print $2}' | awk '{print $1}' | head -n1)\n\t( [ \"$default_device\" = \"$DEVICE\" ] || [ \"$default6_device\" = \"$DEVICE\" ] ) && {\n\n\t\tif [ \"$ACTION\" = \"ifupdate\" ]; then\n\t\t\tUSE_TABLES=$(get_cache_var \"USE_TABLES\")\n\t\t\t[ -n \"$USE_TABLES\" ] && ${APP_PATH}/${USE_TABLES}.sh update_wan_sets >/dev/null 2>&1 &\n\t\t\texit 0\n\t\tfi\n\n\t\t[ ! -d ${LOCK_PATH} ] && mkdir -p ${LOCK_PATH}\n\t\tLOCK_FILE=\"${LOCK_PATH}/${CONFIG}_ifup.lock\"\n\t\tif [ -s ${LOCK_FILE} ]; then\n\t\t\tSPID=$(cat ${LOCK_FILE})\n\t\t\tif [ -e /proc/${SPID}/status ]; then\n\t\t\t\texit 1\n\t\t\tfi\n\t\t\tcat /dev/null > ${LOCK_FILE}\n\t\tfi\n\t\techo $$ > ${LOCK_FILE}\n\t\t\n\t\t/etc/init.d/${CONFIG} restart >/dev/null 2>&1 &\n\t\tlogger -p notice -t network -s \"${CONFIG}: restart when $INTERFACE ifup\"\n\t\t\n\t\trm -rf ${LOCK_FILE}\n\t}\n}\n"
  },
  {
    "path": "luci-app-passwall/root/etc/init.d/passwall",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=99\nSTOP=15\n\nROOT=\"${IPKG_INSTROOT:-}\"\n. \"$ROOT/usr/share/passwall/utils.sh\"\nAPP_FILE=${APP_PATH}/app.sh\nLOCK_FILE_DIR=/var/lock\nLOCK_FILE=${LOCK_FILE_DIR}/${CONFIG}.lock\n\nset_lock() {\n\t[ ! -d \"$LOCK_FILE_DIR\" ] && mkdir -p $LOCK_FILE_DIR\n\texec 999>\"$LOCK_FILE\"\n\tflock -xn 999\n}\n\nunset_lock() {\n\tflock -u 999\n\trm -rf \"$LOCK_FILE\"\n}\n\nunlock() {\n\tfailcount=1\n\twhile [ \"$failcount\" -le 10 ]; do\n\t\tif [ -f \"$LOCK_FILE\" ]; then\n\t\t\tlet \"failcount++\"\n\t\t\tsleep 1s\n\t\t\t[ \"$failcount\" -ge 10 ] && unset_lock\n\t\telse\n\t\t\tbreak\n\t\tfi\n\tdone\n}\n\nboot_func() {\n\tlocal delay=$(uci -q get ${CONFIG}.@global_delay[0].start_delay || echo 1)\n\tif [ \"$delay\" -gt 0 ]; then\n\t\techolog \"执行启动延时 $delay 秒后再启动!\"\n\t\tsleep $delay\n\tfi\n\trestart boot\n\ttouch ${LOCK_FILE_DIR}/${CONFIG}_ready.lock\n}\n\nboot() {\n\tboot_func >/dev/null 2>&1 &\n}\n\nstart() {\n\tset_lock\n\t[ $? == 1 ] && echolog \"脚本已经在运行，不重复运行，退出.\" && exit 0\n\t$APP_FILE start\n\tunset_lock\n}\n\nstop() {\n\tunlock\n\tset_lock\n\t[ $? == 1 ] && echolog \"停止脚本等待超时，不重复运行，退出.\" && exit 0\n\t$APP_FILE stop\n\tunset_lock\n}\n\nrestart() {\n\tset_lock\n\t[ $? == 1 ] && echolog \"脚本已经在运行，不重复运行，退出.\" && exit 0\n\trule_lock=${LOCK_FILE_DIR}/${CONFIG}_rule_update.lock\n\tsub_lock=${LOCK_FILE_DIR}/${CONFIG}_subscribe.lock\n\tfor i in $(seq 1 300); do\n\t\tif [ ! -f \"$rule_lock\" ] && [ ! -f \"$sub_lock\" ]; then\n\t\t\tbreak\n\t\tfi\n\t\tsleep 2\n\tdone\n\trm -f \"$rule_lock\" \"$sub_lock\"\n\t$APP_FILE stop\n\t$APP_FILE start $1\n\tunset_lock\n}\n\nreload() {\n\techo \"Warning: This service does not support configuration reloading\"\n\techo \"Performing full restart instead...\"\n\trestart\n}\n"
  },
  {
    "path": "luci-app-passwall/root/etc/init.d/passwall_server",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=99\n\nstart() {\n\tlua /usr/lib/lua/luci/passwall/server_app.lua start\n}\n\nstop() {\n\tlua /usr/lib/lua/luci/passwall/server_app.lua stop\n}\n\nrestart() {\n\tstop\n\tstart\n}\n\nreload() {\n\techo \"Warning: This service does not support configuration reloading\"\n\techo \"Performing full restart instead...\"\n\trestart\n}\n"
  },
  {
    "path": "luci-app-passwall/root/etc/uci-defaults/luci-passwall",
    "content": "#!/bin/sh\n\nif [ -e \"/etc/config/ucitrack\" ]; then\n    uci -q batch <<-EOF\n \t\tdelete ucitrack.@passwall[-1]\n\t\tadd ucitrack passwall\n\t\tset ucitrack.@passwall[-1].init=passwall\n\t\tdelete ucitrack.@passwall_server[-1]\n\t\tadd ucitrack passwall_server\n\t\tset ucitrack.@passwall_server[-1].init=passwall_server\n\t\tcommit ucitrack\nEOF\nfi\n\nuci -q batch <<-EOF\n\tdelete firewall.passwall\n\tset firewall.passwall=include\n\tset firewall.passwall.type='script'\n\tset firewall.passwall.path='/var/etc/passwall.include'\n\n\tdelete firewall.passwall_server\n\tset firewall.passwall_server=include\n\tset firewall.passwall_server.type='script'\n\tset firewall.passwall_server.path='/var/etc/passwall_server.include'\n\n\tset dhcp.@dnsmasq[0].localuse=1\n\tcommit dhcp\n\tset uhttpd.main.max_requests=50\n\tcommit uhttpd\nEOF\n\nif [ -x \"/sbin/fw3\" ]; then\n\tuci -q set firewall.passwall.reload='1'\n\tuci -q set firewall.passwall_server.reload='1'\nelse\n\tuci -q delete firewall.passwall.reload\n\tuci -q delete firewall.passwall.fw4_compatible\n\tuci -q delete firewall.passwall_server.reload\n\tuci -q delete firewall.passwall_server.fw4_compatible\nfi\nuci commit firewall\n\n[ ! -s \"/etc/config/passwall\" ] && cp -f /usr/share/passwall/0_default_config /etc/config/passwall\n\nchmod +x /usr/share/passwall/*.sh\n\n[ \"$(uci -q get passwall.@global_xray[0].sniffing)\" == \"1\" ] && [ \"$(uci -q get passwall.@global_xray[0].route_only)\" != \"1\" ] && uci -q set passwall.@global_xray[0].sniffing_override_dest=1\nuci -q delete passwall.@global_xray[0].sniffing\nuci -q delete passwall.@global_xray[0].route_only\nuci -q commit passwall\n\nsed -i \"s#add_from#group#g\" /etc/config/passwall 2>/dev/null\n\nrm -f /tmp/luci-indexcache /tmp/luci-indexcache.*\nrm -rf /tmp/luci-modulecache/\nkillall -HUP rpcd 2>/dev/null\n\nexit 0\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/0_default_config",
    "content": "\nconfig global\n\toption enabled '0'\n\toption socks_enabled '0'\n\toption tcp_node_socks_port '1070'\n\toption filter_proxy_ipv6 '1'\n\toption dns_shunt 'chinadns-ng'\n\toption dns_mode 'tcp'\n\toption remote_dns '1.1.1.1'\n\tlist smartdns_remote_dns 'https://1.1.1.1/dns-query'\n\toption use_default_dns 'direct'\n\toption chinadns_ng_default_tag 'none'\n\toption dns_redirect '1'\n\toption use_direct_list '1'\n\toption use_proxy_list '1'\n\toption use_block_list '1'\n\toption use_gfw_list '1'\n\toption chn_list 'direct'\n\toption tcp_proxy_mode 'proxy'\n\toption udp_proxy_mode 'proxy'\n\toption localhost_proxy '1'\n\toption client_proxy '1'\n\toption acl_enable '0'\n\toption log_tcp '0'\n\toption log_udp '0'\n\toption loglevel 'error'\n\toption log_chinadns_ng '0'\n\nconfig global_haproxy\n\toption balancing_enable '0'\n\nconfig global_delay\n\toption start_daemon '1'\n\toption start_delay '60'\n\nconfig global_forwarding\n\toption tcp_no_redir_ports 'disable'\n\toption udp_no_redir_ports 'disable'\n\toption tcp_proxy_drop_ports 'disable'\n\toption udp_proxy_drop_ports '443'\n\toption tcp_redir_ports '22,25,53,80,143,443,465,587,853,873,993,995,5222,8080,8443,9418'\n\toption udp_redir_ports '1:65535'\n\toption accept_icmp '0'\n\toption prefer_nft '1'\n\toption tcp_proxy_way 'redirect'\n\toption ipv6_tproxy '0'\n\nconfig global_xray\n\toption sniffing_override_dest '0'\n\nconfig global_singbox\n\nconfig global_other\n\toption auto_detection_time 'tcping'\n\toption show_node_info '0'\n\nconfig global_rules\n\toption auto_update '0'\n\toption chnlist_update '1'\n\toption chnroute_update '1'\n\toption chnroute6_update '1'\n\toption gfwlist_update '1'\n\toption geosite_update '0'\n\toption geoip_update '0'\n\tlist gfwlist_url 'https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/gfw.txt'\n\tlist chnroute_url 'https://ispip.clang.cn/all_cn.txt'\n\tlist chnroute_url 'https://cdn.jsdelivr.net/gh/gaoyifan/china-operator-ip@ip-lists/china.txt'\n\tlist chnroute6_url 'https://ispip.clang.cn/all_cn_ipv6.txt'\n\tlist chnroute6_url 'https://cdn.jsdelivr.net/gh/gaoyifan/china-operator-ip@ip-lists/china6.txt'\n\tlist chnlist_url 'https://cdn.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/accelerated-domains.china.conf'\n\tlist chnlist_url 'https://cdn.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/apple.china.conf'\n\toption v2ray_location_asset '/usr/share/v2ray/'\n\toption geoip_url 'https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip.dat'\n\toption geosite_url 'https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat'\n\nconfig global_app\n\toption geoview_file '/usr/bin/geoview'\n\toption sing_box_file '/usr/bin/sing-box'\n\toption xray_file '/usr/bin/xray'\n\toption hysteria_file '/usr/bin/hysteria'\n\nconfig global_subscribe\n\toption filter_keyword_mode '1'\n\tlist filter_discard_list '距离下次重置剩余'\n\tlist filter_discard_list '套餐到期'\n\tlist filter_discard_list '过期时间'\n\tlist filter_discard_list '剩余流量'\n\tlist filter_discard_list 'QQ群'\n\tlist filter_discard_list '官网'\n\nconfig nodes 'myshunt'\n\toption remarks '分流总节点'\n\toption type 'Xray'\n\toption protocol '_shunt'\n\toption DirectGame '_direct'\n\toption ProxyGame '_default'\n\toption AIGC '_default'\n\toption Streaming '_default'\n\toption Proxy '_default'\n\toption Direct '_direct'\n\toption default_node '_direct'\n\toption domainStrategy 'IPOnDemand'\n\nconfig shunt_rules 'DirectGame'\n\toption remarks 'DirectGame'\n\toption network 'tcp,udp'\n\toption domain_list '# steam直连域名获取国内CDN走国内线路下载\ncm.steampowered.com\nsteamserver.net\n\n# steam国内CDN华为云\nsteampipe.steamcontent.tnkjmec.com\n# steam国内CDN白山云\nst.dl.eccdnx.com\nst.dl.bscstorage.net\nst.dl.pinyuncloud.com\n# steam国内CDN新流云(原金山云)(支持ipv6)\ndl.steam.clngaa.com\n# steam国内CDN网宿\ncdn.mileweb.cs.steampowered.com.8686c.com\ncdn-ws.content.steamchina.com\n# steam国内CDN腾讯云 (蒸汽中国独占)\ncdn-qc.content.steamchina.com\n# steam国内CDN阿里云(支持ipv6)\ncdn-ali.content.steamchina.com\nxz.pphimalayanrt.com\nlv.queniujq.cn\nalibaba.cdn.steampipe.steamcontent.com\n\n# 国内游戏geosite域名\ngeosite:category-games@cn'\n\toption ip_list '# steam直连IP\n45.121.184.0/24\n103.10.124.0/23\n103.28.54.0/24\n146.66.152.0/24\n146.66.155.0/24\n153.254.86.0/24\n155.133.224.0/22\n155.133.230.0/24\n155.133.232.0/23\n155.133.234.0/24\n155.133.236.0/22\n155.133.240.0/23\n155.133.244.0/23\n155.133.246.0/24\n155.133.248.0/21\n162.254.192.0/21\n185.25.182.0/23\n190.217.32.0/22\n192.69.96.0/22\n205.196.6.0/24\n208.64.200.0/22\n208.78.164.0/22\n205.185.194.0/24'\n\nconfig shunt_rules 'ProxyGame'\n\toption remarks 'ProxyGame'\n\toption network 'tcp,udp'\n\toption domain_list '# steam 商店/客服/聊天/网页布局/API/二维码/Google云同步 代理URL\nsteamcommunity.com\nwww.steamcommunity.com\nstore.steampowered.com\ncheckout.steampowered.com\napi.steampowered.com\nhelp.steampowered.com\nlogin.steampowered.com\nstore.akamai.steamstatic.com\nsteambroadcast.akamaized.net\nsteamvideo-a.akamaihd.net\nsteamusercontent-a.akamaihd.net\nsteamstore-a.akamaihd.net\nsteamcommunity-a.akamaihd.net\nsteamcdn-a.akamaihd.net\nsteamuserimages-a.akamaihd.net\ncommunity.akamai.steamstatic.com\navatars.akamai.steamstatic.com\ncommunity.steamstatic.com\ncdn.akamai.steamstatic.com\navatars.steamstatic.com\nshared.akamai.steamstatic.com\nclan.akamai.steamstatic.com\ncdn.cloudflare.steamstatic.com\ncommunity.cloudflare.steamstatic.com\nstore.cloudflare.steamstatic.com\navatars.cloudflare.steamstatic.com\nclan.cloudflare.steamstatic.com\nshared.cloudflare.steamstatic.com\nsteam-chat.com\nsteamcloud-ugc.storage.googleapis.com\nsteamcloud-eu-ams.storage.googleapis.com\nsteamcloud-eu-fra.storage.googleapis.com\nsteamcloud-finland.storage.googleapis.com\nsteamcloud-saopaulo.storage.googleapis.com\nsteamcloud-singapore.storage.googleapis.com\nsteamcloud-sydney.storage.googleapis.com\nsteamcloud-taiwan.storage.googleapis.com\nsteamcloud-eu.storage.googleapis.com\ndomain:blizzard.com\ngeosite:category-games'\n\nconfig shunt_rules 'AIGC'\n\toption remarks 'AIGC'\n\toption network 'tcp,udp'\n\toption domain_list 'geosite:category-ai-!cn\ngeosite:apple-intelligence'\n\nconfig shunt_rules 'Streaming'\n\toption remarks 'Streaming'\n\toption network 'tcp,udp'\n\toption domain_list 'geosite:netflix\ngeosite:disney'\n\nconfig shunt_rules 'Proxy'\n\toption remarks 'Proxy'\n\toption network 'tcp,udp'\n\toption domain_list 'geosite:geolocation-!cn'\n\toption ip_list '149.154.160.0/20\n91.108.4.0/22\n91.108.56.0/24\n109.239.140.0/24\n67.198.55.0/24\n8.8.4.4\n8.8.8.8\n208.67.222.222\n208.67.220.220\n1.1.1.1\n1.1.1.2\n1.0.0.1\n9.9.9.9\n149.112.112.112\n2001:67c:4e8::/48\n2001:b28:f23c::/48\n2001:b28:f23d::/48\n2001:b28:f23f::/48\n2001:b28:f242::/48\n2001:4860:4860::8888\n2001:4860:4860::8844\n2606:4700:4700::1111\n2606:4700:4700::1001'\n\nconfig shunt_rules 'Direct'\n\toption remarks 'Direct'\n\toption network 'tcp,udp'\n\toption domain_list 'geosite:cn'\n\toption ip_list '223.5.5.5/32\n223.6.6.6/32\n119.29.29.29/32\n180.76.76.76/32\n114.114.114.114/32\n114.114.115.115/32\n1.12.12.12/32\n120.53.53.53/32\ngeoip:cn\ngeoip:private'\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/app.sh",
    "content": "#!/bin/sh\n# Copyright (C) 2018-2020 L-WRT Team\n# Copyright (C) 2021-2025 xiaorouji\n# Copyright (C) 2026 Openwrt-Passwall Organization\n\n. /lib/functions.sh\n. /lib/functions/service.sh\n. /usr/share/libubox/jshn.sh\n\n. /usr/share/passwall/utils.sh\nGLOBAL_ACL_PATH=${TMP_ACL_PATH}/default\nLUA_UTIL_PATH=/usr/lib/lua/luci/passwall\nUTIL_SINGBOX=$LUA_UTIL_PATH/util_sing-box.lua\nUTIL_SS=$LUA_UTIL_PATH/util_shadowsocks.lua\nUTIL_XRAY=$LUA_UTIL_PATH/util_xray.lua\nUTIL_NAIVE=$LUA_UTIL_PATH/util_naiveproxy.lua\nUTIL_HYSTERIA2=$LUA_UTIL_PATH/util_hysteria2.lua\nSINGBOX_BIN=$(first_type $(config_t_get global_app sing_box_file) sing-box)\nXRAY_BIN=$(first_type $(config_t_get global_app xray_file) xray)\n\ncheck_run_environment() {\n\tlocal prefer_nft=$(config_t_get global_forwarding prefer_nft 1)\n\tlocal dnsmasq_info=$(dnsmasq -v 2>/dev/null)\n\tlocal dnsmasq_ver=$(echo \"$dnsmasq_info\" | sed -n '1s/.*version \\([0-9.]*\\).*/\\1/p')\n\t# local dnsmasq_opts=$(echo \"$dnsmasq_info\" | grep -i \"Compile time options\")\n\tlocal dnsmasq_ipset=0; echo \"$dnsmasq_info\" | grep -qw \"ipset\" && dnsmasq_ipset=1\n\tlocal dnsmasq_nftset=0; echo \"$dnsmasq_info\" | grep -qw \"nftset\" && dnsmasq_nftset=1\n\tlocal has_ipt=0; { command -v iptables-legacy || command -v iptables; } >/dev/null && has_ipt=1\n\tlocal has_ipset=$(command -v ipset >/dev/null && echo 1 || echo 0)\n\tlocal has_fw4=$(command -v fw4 >/dev/null && echo 1 || echo 0)\n\tif [ \"$prefer_nft\" = \"1\" ]; then\n\t\tif [ \"$dnsmasq_nftset\" -eq 1 ] && [ \"$has_fw4\" -eq 1 ]; then\n\t\t\tUSE_TABLES=\"nftables\"\n\t\telif [ \"$has_ipset\" -eq 1 ] && [ \"$has_ipt\" -eq 1 ] && [ \"$dnsmasq_ipset\" -eq 1 ]; then\n\t\t\techolog \"警告：nftables (fw4) 应用环境不完整，切换至 iptables。(has_fw4:$has_fw4/dnsmasq_nftset:$dnsmasq_nftset)\"\n\t\t\tUSE_TABLES=\"iptables\"\n\t\tfi\n\telse\n\t\tif [ \"$has_ipset\" -eq 1 ] && [ \"$has_ipt\" -eq 1 ] && [ \"$dnsmasq_ipset\" -eq 1 ]; then\n\t\t\tUSE_TABLES=\"iptables\"\n\t\telif [ \"$dnsmasq_nftset\" -eq 1 ] && [ \"$has_fw4\" -eq 1 ]; then\n\t\t\techolog \"警告：iptables (fw3) 应用环境不完整，切换至 nftables。(has_ipt:$has_ipt/has_ipset:$has_ipset/dnsmasq_ipset:$dnsmasq_ipset)\"\n\t\t\tUSE_TABLES=\"nftables\"\n\t\tfi\n\tfi\n\n\tif [ -n \"$USE_TABLES\" ]; then\n\t\tlocal dep_list\n\t\tlocal file_path=\"/usr/lib/opkg/info\"\n\t\tlocal file_ext=\".control\"\n\t\t[ -d \"/lib/apk/packages\" ] && { file_path=\"/lib/apk/packages\"; file_ext=\".list\"; }\n\n\t\tif [ \"$USE_TABLES\" = \"iptables\" ]; then\n\t\t\tdep_list=\"iptables-mod-tproxy iptables-mod-socket iptables-mod-iprange iptables-mod-conntrack-extra kmod-ipt-nat\"\n\t\telse\n\t\t\tdep_list=\"kmod-nft-socket kmod-nft-tproxy kmod-nft-nat\"\n\t\t\tnftflag=1\n\t\t\tlocal v_num=$(echo \"$dnsmasq_ver\" | tr -cd '0-9')\n\t\t\tif [ \"${v_num:-0}\" -lt 290 ]; then\n\t\t\t\techolog \"提示：Dnsmasq ($dnsmasq_ver) 低于 2.90，建议升级以增强稳定性。\"\n\t\t\tfi\n\t\tfi\n\t\tlocal pkg\n\t\tfor pkg in $dep_list; do\n\t\t\tif [ ! -s \"${file_path}/${pkg}${file_ext}\" ]; then\n\t\t\t\techolog \"警告：${USE_TABLES} 透明代理缺失基础依赖 ${pkg}！\"\n\t\t\tfi\n\t\tdone\n\telse\n\t\techolog \"警告：不满足任何透明代理系统环境。(has_fw4:$has_fw4/has_ipt:$has_ipt/has_ipset:$has_ipset/dnsmasq_nftset:$dnsmasq_nftset/dnsmasq_ipset:$dnsmasq_ipset)\"\n\tfi\n}\n\nrun_ipt2socks() {\n\tlocal flag proto tcp_tproxy local_port socks_address socks_port socks_username socks_password log_file\n\tlocal _extra_param=\"\"\n\teval_set_val $@\n\t[ -n \"$log_file\" ] || log_file=\"/dev/null\"\n\tsocks_address=$(get_host_ip \"ipv4\" ${socks_address})\n\t[ -n \"$socks_username\" ] && [ -n \"$socks_password\" ] && _extra_param=\"${_extra_param} -a $socks_username -k $socks_password\"\n\t[ -n \"$tcp_tproxy\" ] || _extra_param=\"${_extra_param} -R\"\n\tcase \"$proto\" in\n\tUDP)\n\t\tflag=\"${flag}_UDP\"\n\t\t_extra_param=\"${_extra_param} -U\"\n\t;;\n\tTCP)\n\t\tflag=\"${flag}_TCP\"\n\t\t_extra_param=\"${_extra_param} -T\"\n\t;;\n\t*)\n\t\tflag=\"${flag}_TCP_UDP\"\n\t;;\n\tesac\n\t_extra_param=\"${_extra_param} -o 60 -n 65535 -v\"\n\tln_run \"$(first_type ipt2socks)\" \"ipt2socks_${flag}\" $log_file -l $local_port -b 0.0.0.0 -s $socks_address -p $socks_port ${_extra_param}\n}\n\nrun_singbox() {\n\tlocal flag type node tcp_redir_port tcp_proxy_way udp_redir_port socks_address socks_port socks_username socks_password http_address http_port http_username http_password\n\tlocal dns_listen_port direct_dns_query_strategy direct_dns_port direct_dns_udp_server direct_dns_tcp_server remote_dns_protocol remote_dns_udp_server remote_dns_tcp_server remote_dns_doh remote_dns_client_ip remote_fakedns remote_dns_query_strategy dns_cache dns_socks_address dns_socks_port\n\tlocal loglevel log_file config_file server_host server_port no_run\n\teval_set_val $@\n\t[ -z \"$type\" ] && {\n\t\ttype=$(echo $(config_n_get $node type) | tr 'A-Z' 'a-z')\n\t\t[ \"$type\" != \"sing-box\" ] && [ -n \"$SINGBOX_BIN\" ] && type=\"sing-box\"\n\t}\n\t[ -z \"$type\" ] && return 1\n\t[ -n \"$log_file\" ] || local log_file=\"/dev/null\"\n\tjson_init\n\tif [ \"$log_file\" = \"/dev/null\" ]; then\n\t\tjson_add_string \"log\" \"0\"\n\telse\n\t\tjson_add_string \"log\" \"1\"\n\t\tjson_add_string \"logfile\" \"${log_file}\"\n\tfi\n\t[ -z \"$loglevel\" ] && local loglevel=$(config_t_get global loglevel \"warn\")\n\t[ \"$loglevel\" = \"warning\" ] && loglevel=\"warn\"\n\tjson_add_string \"loglevel\" \"$loglevel\"\n\n\t[ -n \"$flag\" ] && json_add_string \"flag\" \"$flag\"\n\t[ -n \"$node\" ] && json_add_string \"node\" \"$node\"\n\t[ -n \"$server_host\" ] && json_add_string \"server_host\" \"$server_host\"\n\t[ -n \"$server_port\" ] && json_add_string \"server_port\" \"$server_port\"\n\t[ -n \"$tcp_redir_port\" ] && json_add_string \"tcp_redir_port\" \"$tcp_redir_port\"\n\t[ -n \"$tcp_proxy_way\" ] && json_add_string \"tcp_proxy_way\" \"$tcp_proxy_way\"\n\t[ -n \"$udp_redir_port\" ] && json_add_string \"udp_redir_port\" \"$udp_redir_port\"\n\t[ -n \"$socks_address\" ] && json_add_string \"local_socks_address\" \"$socks_address\"\n\t[ -n \"$socks_port\" ] && json_add_string \"local_socks_port\" \"$socks_port\"\n\t[ -n \"$socks_username\" ] && [ -n \"$socks_password\" ] && {\n\t\tjson_add_string \"local_socks_username\" \"$socks_username\"\n\t\tjson_add_string \"local_socks_password\" \"$socks_password\"\n\t}\n\t[ -n \"$http_address\" ] && json_add_string \"local_http_address\" \"$http_address\"\n\t[ -n \"$http_port\" ] && json_add_string \"local_http_port\" \"$http_port\"\n\t[ -n \"$http_username\" ] && [ -n \"$http_password\" ] && {\n\t\tjson_add_string \"local_http_username\" \"$http_username\"\n\t\tjson_add_string \"local_http_password\" \"$http_password\"\n\t}\n\t[ -n \"$dns_socks_address\" ] && [ -n \"$dns_socks_port\" ] && {\n\t\tjson_add_string \"dns_socks_address\" \"${dns_socks_address}\"\n\t\tjson_add_string \"dns_socks_port\" \"${dns_socks_port}\"\n\t}\n\t[ -n \"$dns_listen_port\" ] && json_add_string \"dns_listen_port\" \"${dns_listen_port}\"\n\t[ -n \"$dns_cache\" ] && json_add_string \"dns_cache\" \"${dns_cache}\"\n\n\tif [ -n \"$direct_dns_udp_server\" ]; then\n\t\tdirect_dns_port=$(echo ${direct_dns_udp_server} | awk -F '#' '{print $2}')\n\t\tjson_add_string \"direct_dns_udp_server\" \"$(echo ${direct_dns_udp_server} | awk -F '#' '{print $1}')\"\n\telif [ -n \"$direct_dns_tcp_server\" ]; then\n\t\tdirect_dns_port=$(echo ${direct_dns_tcp_server} | awk -F '#' '{print $2}')\n\t\tjson_add_string \"direct_dns_tcp_server\" \"$(echo ${direct_dns_tcp_server} | awk -F '#' '{print $1}')\"\n\telse\n\t\tlocal local_dns=$(echo -n $(echo \"${LOCAL_DNS}\" | sed \"s/,/\\n/g\" | head -n1) | tr \" \" \",\")\n\t\tjson_add_string \"direct_dns_udp_server\" \"$(echo ${local_dns} | awk -F '#' '{print $1}')\"\n\t\tdirect_dns_port=$(echo ${local_dns} | awk -F '#' '{print $2}')\n\tfi\n\tjson_add_string \"direct_dns_port\" \"${direct_dns_port:-53}\"\n\tdirect_dns_query_strategy=${direct_dns_query_strategy:-UseIP}\n\tjson_add_string \"direct_dns_query_strategy\" \"${direct_dns_query_strategy}\"\n\n\t[ -n \"$remote_dns_query_strategy\" ] && json_add_string \"remote_dns_query_strategy\" \"${remote_dns_query_strategy}\"\n\tcase \"$remote_dns_protocol\" in\n\t\tudp|tcp)\n\t\t\tlocal _proto=\"$remote_dns_protocol\"\n\t\t\tlocal _dns=$(get_first_dns remote_dns_${_proto}_server 53 | sed 's/#/:/g')\n\t\t\tlocal _dns_address=$(echo ${_dns} | awk -F ':' '{print $1}')\n\t\t\tlocal _dns_port=$(echo ${_dns} | awk -F ':' '{print $2}')\n\t\t\tjson_add_string \"remote_dns_${_proto}_server\" \"${_dns_address}\"\n\t\t\tjson_add_string \"remote_dns_${_proto}_port\" \"${_dns_port}\"\n\t\t;;\n\t\tdoh|http3)\n\t\t\tjson_add_string \"remote_dns_doh\" \"${remote_dns_doh}\"\n\t\t\t[ \"$remote_dns_protocol\" = \"http3\" ] && json_add_string \"remote_dns_http3\" \"1\"\n\t\t;;\n\tesac\n\n\t[ -n \"$remote_dns_client_ip\" ] && json_add_string \"remote_dns_client_ip\" \"${remote_dns_client_ip}\"\n\t[ \"$remote_fakedns\" = \"1\" ] && json_add_string \"remote_dns_fake\" \"1\"\n\t[ -n \"$no_run\" ] && json_add_string \"no_run\" \"1\"\n\tlocal _json_arg=\"$(json_dump)\"\n\tlua $UTIL_SINGBOX gen_config \"${_json_arg}\" > $config_file\n\t[ -n \"$no_run\" ] && return\n\n\tlocal test_log_file=$log_file\n\t[ \"$test_log_file\" = \"/dev/null\" ] && test_log_file=\"${TMP_PATH}/${config_file##*/}_test.log\"\n\t$SINGBOX_BIN check -c \"$config_file\" > $test_log_file 2>&1; local status=$?\n\tif [ \"${status}\" = 0 ]; then\n\t\tln_run \"$SINGBOX_BIN\" \"sing-box\" \"${log_file}\" run -c \"$config_file\"\n\telse\n\t\techolog \"Sing-box 配置文件 $config_file 校验有误，进程启动失败，错误信息：\"\n\t\tcat ${test_log_file} >> ${LOG_FILE}\n\tfi\n\t[ \"$test_log_file\" != \"$log_file\" ] && rm -f \"${test_log_file}\"\n}\n\nrun_xray() {\n\tlocal flag type node tcp_redir_port tcp_proxy_way udp_redir_port socks_address socks_port socks_username socks_password http_address http_port http_username http_password\n\tlocal dns_listen_port direct_dns_query_strategy direct_dns_port direct_dns_udp_server direct_dns_tcp_server remote_dns_protocol remote_dns_udp_server remote_dns_tcp_server remote_dns_doh remote_dns_client_ip remote_fakedns remote_dns_query_strategy dns_cache dns_socks_address dns_socks_port\n\tlocal loglevel log_file config_file server_host server_port no_run\n\teval_set_val $@\n\t[ -z \"$type\" ] && {\n\t\ttype=$(echo $(config_n_get $node type) | tr 'A-Z' 'a-z')\n\t\t[ \"$type\" != \"xray\" ] && [ -n \"$XRAY_BIN\" ] && type=\"xray\"\n\t}\n\t[ -z \"$type\" ] && return 1\n\tjson_init\n\t[ -n \"$log_file\" ] || local log_file=\"/dev/null\"\n\t[ -z \"$loglevel\" ] && local loglevel=$(config_t_get global loglevel \"warning\")\n\t[ -n \"$flag\" ] && json_add_string \"flag\" \"$flag\"\n\t[ -n \"$node\" ] && json_add_string \"node\" \"$node\"\n\t[ -n \"$server_host\" ] && json_add_string \"server_host\" \"$server_host\"\n\t[ -n \"$server_port\" ] && json_add_string \"server_port\" \"$server_port\"\n\t[ -n \"$tcp_redir_port\" ] && json_add_string \"tcp_redir_port\" \"$tcp_redir_port\"\n\t[ -n \"$tcp_proxy_way\" ] && json_add_string \"tcp_proxy_way\" \"$tcp_proxy_way\"\n\t[ -n \"$udp_redir_port\" ] && json_add_string \"udp_redir_port\" \"$udp_redir_port\"\n\t[ -n \"$socks_address\" ] && json_add_string \"local_socks_address\" \"$socks_address\"\n\t[ -n \"$socks_port\" ] && json_add_string \"local_socks_port\" \"$socks_port\"\n\t[ -n \"$socks_username\" ] && [ -n \"$socks_password\" ] && {\n\t\tjson_add_string \"local_socks_username\" \"$socks_username\"\n\t\tjson_add_string \"local_socks_password\" \"$socks_password\"\n\t}\n\t[ -n \"$http_address\" ] && json_add_string \"local_http_address\" \"$http_address\"\n\t[ -n \"$http_port\" ] && json_add_string \"local_http_port\" \"$http_port\"\n\t[ -n \"$http_username\" ] && [ -n \"$http_password\" ] && {\n\t\tjson_add_string \"local_http_username\" \"$http_username\"\n\t\tjson_add_string \"local_http_password\" \"$http_password\"\n\t}\n\t[ -n \"$dns_socks_address\" ] && [ -n \"$dns_socks_port\" ] && {\n\t\tjson_add_string \"dns_socks_address\" \"${dns_socks_address}\"\n\t\tjson_add_string \"dns_socks_port\" \"${dns_socks_port}\"\n\t}\n\t[ -n \"$dns_listen_port\" ] && json_add_string \"dns_listen_port\" \"${dns_listen_port}\"\n\t\n\tif [ -n \"$direct_dns_udp_server\" ]; then\n\t\tdirect_dns_port=$(echo ${direct_dns_udp_server} | awk -F '#' '{print $2}')\n\t\tjson_add_string \"direct_dns_udp_server\" \"$(echo ${direct_dns_udp_server} | awk -F '#' '{print $1}')\"\n\telif [ -n \"$direct_dns_tcp_server\" ]; then\n\t\tdirect_dns_port=$(echo ${direct_dns_tcp_server} | awk -F '#' '{print $2}')\n\t\tjson_add_string \"direct_dns_tcp_server\" \"$(echo ${direct_dns_tcp_server} | awk -F '#' '{print $1}')\"\n\telse\n\t\tlocal local_dns=$(echo -n $(echo \"${LOCAL_DNS}\" | sed \"s/,/\\n/g\" | head -n1) | tr \" \" \",\")\n\t\tjson_add_string \"direct_dns_udp_server\" \"$(echo ${local_dns} | awk -F '#' '{print $1}')\"\n\t\tdirect_dns_port=$(echo ${local_dns} | awk -F '#' '{print $2}')\n\tfi\n\tjson_add_string \"direct_dns_port\" \"${direct_dns_port:-53}\"\n\n\tdirect_dns_query_strategy=${direct_dns_query_strategy:-UseIP}\n\tjson_add_string \"direct_dns_query_strategy\" \"${direct_dns_query_strategy}\"\n\t[ -n \"$remote_dns_query_strategy\" ] && json_add_string \"remote_dns_query_strategy\" \"${remote_dns_query_strategy}\"\n\t[ -n \"$remote_dns_client_ip\" ] && json_add_string \"remote_dns_client_ip\" \"${remote_dns_client_ip}\"\n\t[ \"$remote_fakedns\" = \"1\" ] && json_add_string \"remote_dns_fake\" \"1\"\n\t[ -n \"$dns_cache\" ] && json_add_string \"dns_cache\" \"${dns_cache}\"\n\n\tcase \"$remote_dns_protocol\" in\n\t\tudp|tcp)\n\t\t\tlocal _proto=\"$remote_dns_protocol\"\n\t\t\tlocal _dns=$(get_first_dns remote_dns_${_proto}_server 53 | sed 's/#/:/g')\n\t\t\tlocal _dns_address=$(echo ${_dns} | awk -F ':' '{print $1}')\n\t\t\tlocal _dns_port=$(echo ${_dns} | awk -F ':' '{print $2}')\n\t\t\tjson_add_string \"remote_dns_${_proto}_server\" \"${_dns_address}\"\n\t\t\tjson_add_string \"remote_dns_${_proto}_port\" \"${_dns_port}\"\n\t\t;;\n\t\tdoh)\n\t\t\tjson_add_string \"remote_dns_doh\" \"${remote_dns_doh}\"\n\t\t;;\n\tesac\n\n\tjson_add_string \"loglevel\" \"$loglevel\"\n\t[ -n \"$no_run\" ] && json_add_string \"no_run\" \"1\"\n\tlocal _json_arg=\"$(json_dump)\"\n\tlua $UTIL_XRAY gen_config \"${_json_arg}\" > $config_file\n\t[ -n \"$no_run\" ] && return\n\n\tlocal test_log_file=$log_file\n\t[ \"$test_log_file\" = \"/dev/null\" ] && test_log_file=\"${TMP_PATH}/${config_file##*/}_test.log\"\n\t$XRAY_BIN run -test -c \"$config_file\" > $test_log_file; local status=$?\n\tif [ \"${status}\" = 0 ]; then\n\t\tln_run \"$XRAY_BIN\" \"xray\" \"${log_file}\" run -c \"$config_file\"\n\telse\n\t\techolog \"Xray 配置文件 $config_file 校验有误，进程启动失败，错误信息：\"\n\t\tcat ${test_log_file} >> ${LOG_FILE}\n\tfi\n\t[ \"$test_log_file\" != \"$log_file\" ] && rm -f \"${test_log_file}\"\n}\n\nrun_dns2socks() {\n\tlocal flag socks socks_address socks_port socks_username socks_password listen_address listen_port dns cache log_file\n\tlocal _extra_param=\"\"\n\teval_set_val $@\n\t[ -n \"$flag\" ] && flag=\"_${flag}\"\n\t[ -n \"$log_file\" ] || log_file=\"/dev/null\"\n\tdns=$(get_first_dns dns 53 | sed 's/#/:/g')\n\t[ -n \"$socks\" ] && {\n\t\tsocks=\"${socks//#/:}\"\n\t\tsocks_address=$(echo $socks | awk -F ':' '{print $1}')\n\t\tsocks_port=$(echo $socks | awk -F ':' '{print $2}')\n\t}\n\t[ -n \"$socks_username\" ] && [ -n \"$socks_password\" ] && _extra_param=\"${_extra_param} /u $socks_username /p $socks_password\"\n\t[ -z \"$cache\" ] && cache=1\n\t[ \"$cache\" = \"0\" ] && _extra_param=\"${_extra_param} /d\"\n\tln_run \"$(first_type dns2socks)\" \"dns2socks${flag}\" $log_file ${_extra_param} \"${socks_address}:${socks_port}\" \"${dns}\" \"${listen_address}:${listen_port}\"\n}\n\nrun_chinadns_ng() {\n\tlocal _flag _listen_port _dns_local _dns_trust _no_ipv6_trust _use_direct_list _use_proxy_list _gfwlist _chnlist _default_mode _default_tag _no_logic_log _tcp_node _remote_fakedns _filter_https\n\tlocal _extra_param=\"\"\n\teval_set_val $@\n\n\tlocal _CONF_FILE=$TMP_ACL_PATH/$_flag/chinadns_ng.conf\n\tlocal _LOG_FILE=\"/dev/null\"\n\t[ \"$(config_t_get global log_chinadns_ng \"0\")\" == \"1\" ] &&  _LOG_FILE=$TMP_ACL_PATH/$_flag/chinadns_ng.log\n\n\t_extra_param=\"-FLAG ${_flag} -TCP_NODE ${_tcp_node} -LISTEN_PORT ${_listen_port} -DNS_LOCAL ${_dns_local} -DNS_TRUST ${_dns_trust}\"\n\t_extra_param=\"${_extra_param} -USE_DIRECT_LIST ${_use_direct_list} -USE_PROXY_LIST ${_use_proxy_list} -USE_BLOCK_LIST ${_use_block_list}\"\n\t_extra_param=\"${_extra_param} -GFWLIST ${_gfwlist} -CHNLIST ${_chnlist} -NO_IPV6_TRUST ${_no_ipv6_trust} -DEFAULT_MODE ${_default_mode}\"\n\t_extra_param=\"${_extra_param} -DEFAULT_TAG ${_default_tag} -NFTFLAG ${nftflag} -NO_LOGIC_LOG ${_no_logic_log} -REMOTE_FAKEDNS ${_remote_fakedns}\"\n\t_extra_param=\"${_extra_param} -FILTER_HTTPS ${_filter_https} -LOG_FILE ${_LOG_FILE}\"\n\n\tlua $APP_PATH/helper_chinadns_add.lua ${_extra_param} > ${_CONF_FILE}\n\tln_run \"$(first_type chinadns-ng)\" chinadns-ng \"${_LOG_FILE}\" -C ${_CONF_FILE}\n}\n\nrun_socks() {\n\tlocal flag node bind socks_port config_file http_port http_config_file relay_port log_file no_run\n\teval_set_val $@\n\t[ -n \"$config_file\" ] && [ -z \"$(echo ${config_file} | grep $TMP_PATH)\" ] && config_file=$TMP_PATH/$config_file\n\t[ -n \"$http_port\" ] || http_port=0\n\t[ -n \"$http_config_file\" ] && [ -z \"$(echo ${http_config_file} | grep $TMP_PATH)\" ] && http_config_file=$TMP_PATH/$http_config_file\n\tif [ -n \"$log_file\" ] && [ -z \"$(echo ${log_file} | grep $TMP_PATH)\" ]; then\n\t\tlog_file=$TMP_PATH/$log_file\n\telse\n\t\tlog_file=\"/dev/null\"\n\tfi\n\n\tlocal node2socks_port=0\n\tlocal type remarks server_host server_port\n\tif is_socks_wrap \"$node\"; then\n\t\tnode2socks_port=$(config_n_get ${node#Socks_} port 0)\n\tfi\n\tif [ \"$node2socks_port\" = \"0\" ]; then\n\t\ttype=$(echo $(config_n_get $node type) | tr 'A-Z' 'a-z')\n\t\tremarks=$(config_n_get $node remarks)\n\t\tserver_host=$(config_n_get $node address)\n\t\tserver_port=$(config_n_get $node port)\n\telse\n\t\ttype=\"socks\"\n\t\tserver_host=\"127.0.0.1\"\n\t\tserver_port=$node2socks_port\n\t\tremarks=\"Socks 配置($server_port 端口)\"\n\tfi\n\n\t[ -n \"$relay_port\" ] && {\n\t\tserver_host=\"127.0.0.1\"\n\t\tserver_port=$relay_port\n\t}\n\tlocal error_msg tmp\n\n\tif [ -n \"$server_host\" ] && [ -n \"$server_port\" ]; then\n\t\tcheck_host $server_host\n\t\t[ $? != 0 ] && {\n\t\t\techolog \"  - Socks节点：[$remarks]${server_host} 是非法的服务器地址，无法启动！\"\n\t\t\treturn 1\n\t\t}\n\t\ttmp=\"${server_host}:${server_port}\"\n\telse\n\t\terror_msg=\"某种原因，此 Socks 服务的相关配置已失联，启动中止！\"\n\tfi\n\n\tif [ \"$type\" == \"sing-box\" ] || [ \"$type\" == \"xray\" ]; then\n\t\tlocal protocol=$(config_n_get $node protocol)\n\t\tif [ \"$protocol\" == \"_balancing\" ] || [ \"$protocol\" == \"_shunt\" ] || [ \"$protocol\" == \"_iface\" ] || [ \"$protocol\" == \"_urltest\" ]; then\n\t\t\tunset error_msg\n\t\tfi\n\tfi\n\n\t[ -n \"${error_msg}\" ] && {\n\t\t[ \"$bind\" != \"127.0.0.1\" ] && echolog \"  - Socks节点：[$remarks]${tmp}，启动中止 ${bind}:${socks_port} ${error_msg}\"\n\t\treturn 1\n\t}\n\t[ \"$bind\" != \"127.0.0.1\" ] && echolog \"  - Socks节点：[$remarks]${tmp}，启动 ${bind}:${socks_port}\"\n\n\tjson_init\n\tjson_add_string \"node\" \"${node}\"\n\tjson_add_string \"server_host\" \"${server_host}\"\n\tjson_add_string \"server_port\" \"${server_port}\"\n\tcase \"$type\" in\n\tsocks)\n\t\tlocal _socks_address _socks_port _socks_username _socks_password\n\t\tif [ \"$node2socks_port\" = \"0\" ]; then\n\t\t\t_socks_address=$(config_n_get $node address)\n\t\t\t_socks_port=$(config_n_get $node port)\n\t\t\t_socks_username=$(config_n_get $node username)\n\t\t\t_socks_password=$(config_n_get $node password)\n\t\telse\n\t\t\t_socks_address=\"127.0.0.1\"\n\t\t\t_socks_port=$node2socks_port\n\t\tfi\n\t\t[ \"$http_port\" != \"0\" ] && {\n\t\t\thttp_flag=1\n\t\t\tconfig_file=\"${config_file//SOCKS/HTTP_SOCKS}\"\n\t\t\tjson_add_string \"local_http_address\" \"$bind\"\n\t\t\tjson_add_string \"local_http_port\" \"$http_port\"\n\t\t}\n\t\tjson_add_null \"server_host\"\n\t\tjson_add_null \"server_port\"\n\t\tjson_add_string \"local_socks_address\" \"$bind\"\n\t\tjson_add_string \"local_socks_port\" \"$socks_port\"\n\t\tjson_add_string \"server_proto\" \"socks\"\n\t\tjson_add_string \"server_address\" \"${_socks_address}\"\n\t\tjson_add_string \"server_port\" \"${_socks_port}\"\n\t\tjson_add_string \"server_username\" \"${_socks_username}\"\n\t\tjson_add_string \"server_password\" \"${_socks_password}\"\n\t\tif [ -n \"${SINGBOX_BIN}\" ]; then\n\t\t\ttype=\"sing-box\"\n\t\t\tlocal bin=\"${SINGBOX_BIN}\"\n\t\t\tlocal util=\"${UTIL_SINGBOX}\"\n\t\telif [ -n \"${XRAY_BIN}\" ]; then\n\t\t\ttype=\"xray\"\n\t\t\tlocal bin=\"${XRAY_BIN}\"\n\t\t\tlocal util=\"${UTIL_XRAY}\"\n\t\tfi\n\t\t[ -n \"${bin}\" ] && [ -n \"${util}\" ] && {\n\t\t\tlua ${util} gen_proto_config \"$(json_dump)\" > $config_file\n\t\t\t[ -n \"$no_run\" ] || ln_run \"$bin\" $type $log_file run -c \"$config_file\"\n\t\t}\n\t\tunset bin util\n\t;;\n\tsing-box)\n\t\t[ \"$http_port\" != \"0\" ] && {\n\t\t\thttp_flag=1\n\t\t\tconfig_file=\"${config_file//SOCKS/HTTP_SOCKS}\"\n\t\t\tlocal _args=\"http_address=$bind http_port=$http_port\"\n\t\t}\n\t\t[ -n \"$relay_port\" ] && _args=\"${_args} server_host=$server_host server_port=$server_port\"\n\t\t[ -n \"$no_run\" ] && _args=\"${_args} no_run=1\"\n\t\trun_singbox flag=$flag node=$node socks_address=$bind socks_port=$socks_port config_file=$config_file log_file=$log_file ${_args}\n\t;;\n\txray)\n\t\t[ \"$http_port\" != \"0\" ] && {\n\t\t\thttp_flag=1\n\t\t\tconfig_file=\"${config_file//SOCKS/HTTP_SOCKS}\"\n\t\t\tlocal _args=\"http_address=$bind http_port=$http_port\"\n\t\t}\n\t\t[ -n \"$relay_port\" ] && _args=\"${_args} server_host=$server_host server_port=$server_port\"\n\t\t[ -n \"$no_run\" ] && _args=\"${_args} no_run=1\"\n\t\trun_xray flag=$flag node=$node socks_address=$bind socks_port=$socks_port config_file=$config_file log_file=$log_file ${_args}\n\t;;\n\tnaiveproxy)\n\t\tjson_add_string \"run_type\" \"socks\"\n\t\tjson_add_string \"local_addr\" \"$bind\"\n\t\tjson_add_string \"local_port\" \"$socks_port\"\n\t\tlua $UTIL_NAIVE gen_config \"$(json_dump)\" > $config_file\n\t\t[ -n \"$no_run\" ] || ln_run \"$(first_type naive)\" naive $log_file \"$config_file\"\n\t;;\n\tssr)\n\t\tjson_add_string \"local_addr\" \"$bind\"\n\t\tjson_add_string \"local_port\" \"$socks_port\"\n\t\tlua $UTIL_SS gen_config \"$(json_dump)\" > $config_file\n\t\t[ -n \"$no_run\" ] || ln_run \"$(first_type ssr-local)\" \"ssr-local\" $log_file -c \"$config_file\" -v -u\n\t;;\n\tss)\n\t\t[ -n \"$no_run\" ] || {\n\t\t\tlocal plugin_sh=\"${config_file%.json}_plugin.sh\"\n\t\t\tjson_add_string \"plugin_sh\" \"$plugin_sh\"\n\t\t}\n\t\tjson_add_string \"local_addr\" \"$bind\"\n\t\tjson_add_string \"local_port\" \"$socks_port\"\n\t\tjson_add_string \"mode\" \"tcp_and_udp\"\n\t\tlua $UTIL_SS gen_config \"$(json_dump)\" > $config_file\n\t\t[ -n \"$no_run\" ] || ln_run \"$(first_type ss-local)\" \"ss-local\" $log_file -c \"$config_file\" -v\n\t;;\n\tss-rust)\n\t\t[ \"$http_port\" != \"0\" ] && {\n\t\t\thttp_flag=1\n\t\t\tconfig_file=\"${config_file//SOCKS/HTTP_SOCKS}\"\n\t\t\tjson_add_string \"local_http_address\" \"$bind\"\n\t\t\tjson_add_string \"local_http_port\" \"$http_port\"\n\t\t}\n\t\t[ -n \"$no_run\" ] || {\n\t\t\tlocal plugin_sh=\"${config_file%.json}_plugin.sh\"\n\t\t\tjson_add_string \"plugin_sh\" \"$plugin_sh\"\n\t\t}\n\t\tjson_add_string \"local_socks_address\" \"$bind\"\n\t\tjson_add_string \"local_socks_port\" \"$socks_port\"\n\t\tlua $UTIL_SS gen_config \"$(json_dump)\" > $config_file\n\t\t[ -n \"$no_run\" ] || ln_run \"$(first_type sslocal)\" \"sslocal\" $log_file -c \"$config_file\" -v\n\t;;\n\thysteria2)\n\t\t[ \"$http_port\" != \"0\" ] && {\n\t\t\thttp_flag=1\n\t\t\tconfig_file=\"${config_file//SOCKS/HTTP_SOCKS}\"\n\t\t\tjson_add_string \"local_http_address\" \"$bind\"\n\t\t\tjson_add_string \"local_http_port\" \"$http_port\"\n\t\t}\n\t\tjson_add_string \"local_socks_address\" \"$bind\"\n\t\tjson_add_string \"local_socks_port\" \"$socks_port\"\n\t\tlua $UTIL_HYSTERIA2 gen_config \"$(json_dump)\" > $config_file\n\t\t[ -n \"$no_run\" ] || ln_run \"$(first_type $(config_t_get global_app hysteria_file))\" \"hysteria\" $log_file -c \"$config_file\" client\n\t;;\n\tesac\n\n\tset_cache_var \"node_${node}_socks_port\" \"${socks_port}\"\n\n\t# http to socks\n\t[ -z \"$http_flag\" ] && [ \"$http_port\" != \"0\" ] && [ -n \"$http_config_file\" ] && [ \"$type\" != \"sing-box\" ] && [ \"$type\" != \"xray\" ] && [ \"$type\" != \"socks\" ] && {\n\t\tjson_init\n\t\tjson_add_string \"local_http_address\" \"$bind\"\n\t\tjson_add_string \"local_http_port\" \"$http_port\"\n\t\tjson_add_string \"server_proto\" \"socks\"\n\t\tjson_add_string \"server_address\" \"127.0.0.1\"\n\t\tjson_add_string \"server_port\" \"$socks_port\"\n\t\tjson_add_string \"server_username\" \"$_username\"\n\t\tjson_add_string \"server_password\" \"$_password\"\n\t\tif [ -n \"${SINGBOX_BIN}\" ]; then\n\t\t\ttype=\"sing-box\"\n\t\t\tlocal bin=\"${SINGBOX_BIN}\"\n\t\t\tlocal util=\"${UTIL_SINGBOX}\"\n\t\telif [ -n \"${XRAY_BIN}\" ]; then\n\t\t\ttype=\"xray\"\n\t\t\tlocal bin=\"${XRAY_BIN}\"\n\t\t\tlocal util=\"${UTIL_XRAY}\"\n\t\tfi\n\t\t[ -n \"${bin}\" ] && [ -n \"${util}\" ] && {\n\t\t\tlua ${util} gen_proto_config \"$(json_dump)\" > $http_config_file\n\t\t\t[ -n \"$no_run\" ] || ln_run \"$bin\" $type /dev/null run -c \"$http_config_file\"\n\t\t}\n\t\tunset bin util\n\t}\n\tunset http_flag\n\n\t[ -z \"$no_run\" ] && [ \"${server_host}\" != \"127.0.0.1\" ] && [ \"$type\" != \"sing-box\" ] && [ \"$type\" != \"xray\" ] && echo \"${node}\" >> $TMP_PATH/direct_node_list\n}\n\nrun_redir() {\n\tlocal node proto bind local_port config_file log_file\n\teval_set_val $@\n\tlocal tcp_node_socks_flag tcp_node_http_flag\n\t[ -n \"$config_file\" ] && [ -z \"$(echo ${config_file} | grep $TMP_PATH)\" ] && config_file=${GLOBAL_ACL_PATH}/${config_file}\n\tif [ -n \"$log_file\" ] && [ -z \"$(echo ${log_file} | grep $TMP_PATH)\" ]; then\n\t\tlog_file=${GLOBAL_ACL_PATH}/${log_file}\n\telse\n\t\tlog_file=\"/dev/null\"\n\tfi\n\tlocal proto=$(echo $proto | tr 'A-Z' 'a-z')\n\tlocal PROTO=$(echo $proto | tr 'a-z' 'A-Z')\n\n\tlocal node2socks_port=0\n\tlocal type remarks server_host port\n\tif is_socks_wrap \"$node\"; then\n\t\tnode2socks_port=$(config_n_get ${node#Socks_} port 0)\n\tfi\n\tif [ \"$node2socks_port\" = \"0\" ]; then\n\t\ttype=$(echo $(config_n_get $node type) | tr 'A-Z' 'a-z')\n\t\tremarks=$(config_n_get $node remarks)\n\t\tserver_host=$(config_n_get $node address)\n\t\tport=$(config_n_get $node port)\n\telse\n\t\tif [ \"${DNS_MODE}\" = \"xray\" ]; then\n\t\t\ttype=\"xray\"\n\t\telif [ \"${DNS_MODE}\" = \"sing-box\" ]; then\n\t\t\ttype=\"sing-box\"\n\t\telse\n\t\t\ttype=\"socks\"\n\t\tfi\n\t\tserver_host=\"127.0.0.1\"\n\t\tport=$node2socks_port\n\t\tremarks=\"Socks 配置($port 端口)\"\n\tfi\n\n\tlocal enable_log=$(config_t_get global log_${proto} 1)\n\t[ \"$enable_log\" != \"1\" ] && log_file=\"/dev/null\"\n\t[ -n \"$server_host\" ] && [ -n \"$port\" ] && {\n\t\tcheck_host $server_host\n\t\t[ $? != 0 ] && {\n\t\t\techolog \"${PROTO}节点：[$remarks]${server_host} 是非法的服务器地址，无法启动！\"\n\t\t\treturn 1\n\t\t}\n\t}\n\t[ \"$bind\" != \"127.0.0.1\" ] && echolog \"${PROTO}节点：[$remarks]，监听端口：$local_port\"\n\n\tjson_init\n\tjson_add_string \"node\" \"${node}\"\n\tcase \"$PROTO\" in\n\tUDP)\n\t\tcase \"$type\" in\n\t\tsocks)\n\t\t\tlocal _socks_address _socks_port _socks_username _socks_password\n\t\t\tif [ \"$node2socks_port\" = \"0\" ]; then\n\t\t\t\t_socks_address=$(config_n_get $node address)\n\t\t\t\t_socks_port=$(config_n_get $node port)\n\t\t\t\t_socks_username=$(config_n_get $node username)\n\t\t\t\t_socks_password=$(config_n_get $node password)\n\t\t\telse\n\t\t\t\t_socks_address=\"127.0.0.1\"\n\t\t\t\t_socks_port=$node2socks_port\n\t\t\tfi\n\t\t\trun_ipt2socks flag=default proto=UDP local_port=${local_port} socks_address=${_socks_address} socks_port=${_socks_port} socks_username=${_socks_username} socks_password=${_socks_password} log_file=${log_file}\n\t\t;;\n\t\tsing-box)\n\t\t\tlocal protocol=$(config_n_get $node protocol)\n\t\t\t[ \"$protocol\" = \"_shunt\" ] && {\n\t\t\t\tlocal geoip_path=\"${V2RAY_LOCATION_ASSET%*/}/geoip.dat\"\n\t\t\t\tlocal geosite_path=\"${V2RAY_LOCATION_ASSET%*/}/geosite.dat\"\n\t\t\t\tif [ ! -s \"$geoip_path\" ] || [ ! -s \"$geosite_path\" ]; then\n\t\t\t\t\techolog \"* 缺少Geo规则文件，UDP Sing-Box分流节点无法正常使用！\"\n\t\t\t\tfi\n\t\t\t}\n\t\t\trun_singbox flag=UDP node=$node udp_redir_port=$local_port config_file=$config_file log_file=$log_file\n\t\t;;\n\t\txray)\n\t\t\tlocal protocol=$(config_n_get $node protocol)\n\t\t\t[ \"$protocol\" = \"_shunt\" ] && {\n\t\t\t\tlocal geoip_path=\"${V2RAY_LOCATION_ASSET%*/}/geoip.dat\"\n\t\t\t\tlocal geosite_path=\"${V2RAY_LOCATION_ASSET%*/}/geosite.dat\"\n\t\t\t\tif [ ! -s \"$geoip_path\" ] || [ ! -s \"$geosite_path\" ]; then\n\t\t\t\t\techolog \"* 缺少Geo规则文件，UDP Xray分流节点无法正常使用！\"\n\t\t\t\tfi\n\t\t\t}\n\t\t\trun_xray flag=UDP node=$node udp_redir_port=$local_port config_file=$config_file log_file=$log_file\n\t\t;;\n\t\tnaiveproxy)\n\t\t\techolog \"Naiveproxy不支持UDP转发！\"\n\t\t;;\n\t\tssr)\n\t\t\tjson_add_string \"local_addr\" \"0.0.0.0\"\n\t\t\tjson_add_string \"local_port\" \"$local_port\"\n\t\t\tlua $UTIL_SS gen_config \"$(json_dump)\" > $config_file\n\t\t\tln_run \"$(first_type ssr-redir)\" \"ssr-redir\" $log_file -c \"$config_file\" -v -U\n\t\t;;\n\t\tss)\n\t\t\tlocal plugin_sh=\"${config_file%.json}_plugin.sh\"\n\t\t\tjson_add_string \"plugin_sh\" \"$plugin_sh\"\n\t\t\tjson_add_string \"local_addr\" \"0.0.0.0\"\n\t\t\tjson_add_string \"local_port\" \"$local_port\"\n\t\t\tjson_add_string \"mode\" \"udp_only\"\n\t\t\tlua $UTIL_SS gen_config \"$(json_dump)\" > $config_file\n\t\t\tln_run \"$(first_type ss-redir)\" \"ss-redir\" $log_file -c \"$config_file\" -v\n\t\t;;\n\t\tss-rust)\n\t\t\tlocal plugin_sh=\"${config_file%.json}_plugin.sh\"\n\t\t\tjson_add_string \"plugin_sh\" \"$plugin_sh\"\n\t\t\tjson_add_string \"local_udp_redir_port\" \"$local_port\"\n\t\t\tlua $UTIL_SS gen_config \"$(json_dump)\" > $config_file\n\t\t\tln_run \"$(first_type sslocal)\" \"sslocal\" $log_file -c \"$config_file\" -v\n\t\t;;\n\t\thysteria2)\n\t\t\tjson_add_string \"local_udp_redir_port\" \"$local_port\"\n\t\t\tlua $UTIL_HYSTERIA2 gen_config \"$(json_dump)\" > $config_file\n\t\t\tln_run \"$(first_type $(config_t_get global_app hysteria_file))\" \"hysteria\" $log_file -c \"$config_file\" client\n\t\t;;\n\t\tesac\n\t;;\n\tTCP)\n\t\t[ \"$TCP_UDP\" = \"1\" ] && echolog \"UDP节点：与TCP节点相同\"\n\t\ttcp_node_socks=1\n\t\ttcp_node_socks_bind_local=$(config_t_get global tcp_node_socks_bind_local 1)\n\t\ttcp_node_socks_bind=\"127.0.0.1\"\n\t\t[ \"${tcp_node_socks_bind_local}\" != \"1\" ] && tcp_node_socks_bind=\"0.0.0.0\"\n\t\ttcp_node_socks_port=$(get_new_port $(config_t_get global tcp_node_socks_port 1070))\n\t\ttcp_node_http_port=$(config_t_get global tcp_node_http_port 0)\n\t\t[ \"$tcp_node_http_port\" != \"0\" ] && tcp_node_http=1\n\t\tif [ $PROXY_IPV6 == \"1\" ]; then\n\t\t\techolog \"开启实验性IPv6透明代理(TProxy)，请确认您的节点及类型支持IPv6！\"\n\t\tfi\n\n\t\tif [ \"${TCP_PROXY_WAY}\" = \"redirect\" ]; then\n\t\t\tcan_ipt=$(echo \"$REDIRECT_LIST\" | grep \"$type\")\n\t\telif [ \"${TCP_PROXY_WAY}\" = \"tproxy\" ]; then\n\t\t\tcan_ipt=$(echo \"$TPROXY_LIST\" | grep \"$type\")\n\t\tfi\n\t\t[ -z \"$can_ipt\" ] && type=\"socks\"\n\n\t\tcase \"$type\" in\n\t\tsocks)\n\t\t\t_socks_flag=1\n\t\t\tif [ \"$node2socks_port\" = \"0\" ]; then\n\t\t\t\t_socks_address=$(config_n_get $node address)\n\t\t\t\t_socks_port=$(config_n_get $node port)\n\t\t\t\t_socks_username=$(config_n_get $node username)\n\t\t\t\t_socks_password=$(config_n_get $node password)\n\t\t\telse\n\t\t\t\t_socks_address=\"127.0.0.1\"\n\t\t\t\t_socks_port=$node2socks_port\n\t\t\tfi\n\t\t\t[ -z \"$can_ipt\" ] && {\n\t\t\t\tlocal _config_file=$config_file\n\t\t\t\t_config_file=\"TCP_SOCKS_${node}.json\"\n\t\t\t\tlocal _port=$(get_new_port 3001)\n\t\t\t\trun_socks flag=\"TCP\" node=$node bind=127.0.0.1 socks_port=${_port} config_file=${_config_file}\n\t\t\t\t_socks_address=127.0.0.1\n\t\t\t\t_socks_port=${_port}\n\t\t\t\tunset _socks_username\n\t\t\t\tunset _socks_password\n\t\t\t}\n\t\t;;\n\t\tsing-box)\n\t\t\tlocal _flag=\"TCP\"\n\t\t\tlocal _args=\"\"\n\t\t\t[ \"$tcp_node_socks\" = \"1\" ] && {\n\t\t\t\ttcp_node_socks_flag=1\n\t\t\t\t_args=\"${_args} socks_address=${tcp_node_socks_bind} socks_port=${tcp_node_socks_port}\"\n\t\t\t\tconfig_file=\"${config_file//TCP/TCP_SOCKS}\"\n\t\t\t}\n\t\t\t[ \"$tcp_node_http\" = \"1\" ] && {\n\t\t\t\ttcp_node_http_flag=1\n\t\t\t\t_args=\"${_args} http_port=${tcp_node_http_port}\"\n\t\t\t\tconfig_file=\"${config_file//TCP/TCP_HTTP}\"\n\t\t\t}\n\t\t\t[ \"$TCP_UDP\" = \"1\" ] && {\n\t\t\t\tUDP_REDIR_PORT=$local_port\n\t\t\t\tunset UDP_NODE\n\t\t\t\t_flag=\"TCP_UDP\"\n\t\t\t\t_args=\"${_args} udp_redir_port=${UDP_REDIR_PORT}\"\n\t\t\t\tconfig_file=\"${config_file//TCP/TCP_UDP}\"\n\t\t\t}\n\n\t\t\tlocal protocol=$(config_n_get $node protocol)\n\t\t\tlocal v2ray_dns_mode=$(config_t_get global v2ray_dns_mode tcp)\n\t\t\t[ \"${DNS_MODE}\" != \"sing-box\" ] && [ \"$protocol\" = \"_shunt\" ] && {\n\t\t\t\tDNS_MODE=\"sing-box\"\n\t\t\t\t[ \"$v2ray_dns_mode\" = \"tcp+doh\" ] && v2ray_dns_mode=\"tcp\"\n\t\t\t}\n\n\t\t\t[ \"$protocol\" = \"_shunt\" ] && {\n\t\t\t\tlocal geoip_path=\"${V2RAY_LOCATION_ASSET%*/}/geoip.dat\"\n\t\t\t\tlocal geosite_path=\"${V2RAY_LOCATION_ASSET%*/}/geosite.dat\"\n\t\t\t\tif [ ! -s \"$geoip_path\" ] || [ ! -s \"$geosite_path\" ]; then\n\t\t\t\t\techolog \"* 缺少Geo规则文件，TCP Sing-Box分流节点无法正常使用！\"\n\t\t\t\tfi\n\t\t\t\t[ \"$(config_n_get $node fakedns)\" = \"1\" ] && {\n\t\t\t\t\tUSE_FAKEDNS=1\n\t\t\t\t\tGLOBAL_SHUNT_NODE_FAKEDNS=1\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t[ \"${DNS_MODE}\" = \"sing-box\" ] && {\n\t\t\t\tNO_PLUGIN_DNS=1\n\t\t\t\tconfig_file=\"${config_file//.json/_DNS.json}\"\n\t\t\t\t_args=\"${_args} remote_dns_query_strategy=${REMOTE_DNS_QUERY_STRATEGY}\"\n\t\t\t\tDNSMASQ_FILTER_PROXY_IPV6=0\n\t\t\t\tlocal _remote_dns_client_ip=$(config_t_get global remote_dns_client_ip)\n\t\t\t\t[ -n \"${_remote_dns_client_ip}\" ] && _args=\"${_args} remote_dns_client_ip=${_remote_dns_client_ip}\"\n\t\t\t\t[ \"${DNS_CACHE}\" == \"0\" ] && _args=\"${_args} dns_cache=0\"\n\t\t\t\tresolve_dns_port=${NEXT_DNS_LISTEN_PORT}\n\t\t\t\t_args=\"${_args} dns_listen_port=${resolve_dns_port}\"\n\n\t\t\t\tcase \"$(config_t_get global direct_dns_mode \"auto\")\" in\n\t\t\t\t\tudp)\n\t\t\t\t\t\t_args=\"${_args} direct_dns_udp_server=$(config_t_get global direct_dns 223.5.5.5 | sed -E 's/^\\[([^]]+)\\]:(.*)$/\\1#\\2/; t; s/^([^:]+):([0-9]+)$/\\1#\\2/')\"\n\t\t\t\t\t;;\n\t\t\t\t\ttcp)\n\t\t\t\t\t\t_args=\"${_args} direct_dns_tcp_server=$(config_t_get global direct_dns 223.5.5.5 | sed -E 's/^\\[([^]]+)\\]:(.*)$/\\1#\\2/; t; s/^([^:]+):([0-9]+)$/\\1#\\2/')\"\n\t\t\t\t\t;;\n\t\t\t\tesac\n\n\t\t\t\t_args=\"${_args} remote_dns_protocol=${v2ray_dns_mode}\"\n\t\t\t\tcase \"$v2ray_dns_mode\" in\n\t\t\t\t\tudp|tcp)\n\t\t\t\t\t\tlocal _proto=\"$v2ray_dns_mode\"\n\t\t\t\t\t\t_args=\"${_args} remote_dns_${_proto}_server=${REMOTE_DNS}\"\n\t\t\t\t\t\tresolve_dns_log=\"Sing-Box DNS(127.0.0.1#${resolve_dns_port}) -> ${_proto}://${REMOTE_DNS}\"\n\t\t\t\t\t;;\n\t\t\t\t\tdoh|http3)\n\t\t\t\t\t\tlocal remote_dns_doh=$(config_t_get global remote_dns_doh \"https://1.1.1.1/dns-query\")\n\t\t\t\t\t\t_args=\"${_args} remote_dns_doh=${remote_dns_doh}\"\n\t\t\t\t\t\tresolve_dns_log=\"Sing-Box DNS(127.0.0.1#${resolve_dns_port}) -> ${remote_dns_doh}\"\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\t\tlocal remote_fakedns=$(config_t_get global remote_fakedns 0)\n\t\t\t\t[ \"${remote_fakedns}\" = \"1\" ] && {\n\t\t\t\t\tREMOTE_FAKEDNS=1\n\t\t\t\t\t_args=\"${_args} remote_fakedns=1\"\n\t\t\t\t\tresolve_dns_log=\"${resolve_dns_log} + FakeDNS\"\n\t\t\t\t\tUSE_FAKEDNS=1\n\t\t\t\t}\n\t\t\t\tNEXT_DNS_LISTEN_PORT=$(expr $NEXT_DNS_LISTEN_PORT + 1)\n\t\t\t}\n\t\t\trun_singbox flag=$_flag node=$node tcp_redir_port=$local_port tcp_proxy_way=$TCP_PROXY_WAY config_file=$config_file log_file=$log_file ${_args}\n\t\t;;\n\t\txray)\n\t\t\tlocal _flag=\"TCP\"\n\t\t\tlocal _args=\"\"\n\t\t\t[ \"$tcp_node_socks\" = \"1\" ] && {\n\t\t\t\ttcp_node_socks_flag=1\n\t\t\t\t_args=\"${_args} socks_address=${tcp_node_socks_bind} socks_port=${tcp_node_socks_port}\"\n\t\t\t\tconfig_file=\"${config_file//TCP/TCP_SOCKS}\"\n\t\t\t}\n\t\t\t[ \"$tcp_node_http\" = \"1\" ] && {\n\t\t\t\ttcp_node_http_flag=1\n\t\t\t\t_args=\"${_args} http_port=${tcp_node_http_port}\"\n\t\t\t\tconfig_file=\"${config_file//TCP/TCP_HTTP}\"\n\t\t\t}\n\t\t\t[ \"$TCP_UDP\" = \"1\" ] && {\n\t\t\t\tUDP_REDIR_PORT=$local_port\n\t\t\t\tunset UDP_NODE\n\t\t\t\t_flag=\"TCP_UDP\"\n\t\t\t\t_args=\"${_args} udp_redir_port=${UDP_REDIR_PORT}\"\n\t\t\t\tconfig_file=\"${config_file//TCP/TCP_UDP}\"\n\t\t\t}\n\n\t\t\tlocal protocol=$(config_n_get $node protocol)\n\t\t\tlocal v2ray_dns_mode=$(config_t_get global v2ray_dns_mode tcp)\n\t\t\t[ \"${DNS_MODE}\" != \"xray\" ] && [ \"$protocol\" = \"_shunt\" ] && {\n\t\t\t\tDNS_MODE=\"xray\"\n\t\t\t\t[ \"$v2ray_dns_mode\" = \"http3\" ] && v2ray_dns_mode=\"tcp\"\n\t\t\t}\n\t\t\t#兼容旧模式，择机移除\n\t\t\t[ \"$v2ray_dns_mode\" = \"tcp+doh\" ] && v2ray_dns_mode=\"tcp\"\n\n\t\t\t[ \"$protocol\" = \"_shunt\" ] && {\n\t\t\t\tlocal geoip_path=\"${V2RAY_LOCATION_ASSET%*/}/geoip.dat\"\n\t\t\t\tlocal geosite_path=\"${V2RAY_LOCATION_ASSET%*/}/geosite.dat\"\n\t\t\t\tif [ ! -s \"$geoip_path\" ] || [ ! -s \"$geosite_path\" ]; then\n\t\t\t\t\techolog \"* 缺少Geo规则文件，TCP Xray分流节点无法正常使用！\"\n\t\t\t\tfi\n\t\t\t\t[ \"$(config_n_get $node fakedns)\" = \"1\" ] && {\n\t\t\t\t\tUSE_FAKEDNS=1\n\t\t\t\t\tGLOBAL_SHUNT_NODE_FAKEDNS=1\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t[ \"${DNS_MODE}\" = \"xray\" ] && {\n\t\t\t\tNO_PLUGIN_DNS=1\n\t\t\t\tconfig_file=\"${config_file//.json/_DNS.json}\"\n\t\t\t\t_args=\"${_args} remote_dns_query_strategy=${REMOTE_DNS_QUERY_STRATEGY}\"\n\t\t\t\tDNSMASQ_FILTER_PROXY_IPV6=0\n\t\t\t\tlocal _remote_dns_client_ip=$(config_t_get global remote_dns_client_ip)\n\t\t\t\t[ -n \"${_remote_dns_client_ip}\" ] && _args=\"${_args} remote_dns_client_ip=${_remote_dns_client_ip}\"\n\t\t\t\t[ \"${DNS_CACHE}\" == \"0\" ] && _args=\"${_args} dns_cache=0\"\n\t\t\t\tresolve_dns_port=${NEXT_DNS_LISTEN_PORT}\n\t\t\t\t_args=\"${_args} dns_listen_port=${resolve_dns_port}\"\n\n\t\t\t\tcase \"$(config_t_get global direct_dns_mode \"auto\")\" in\n\t\t\t\t\tudp)\n\t\t\t\t\t\t_args=\"${_args} direct_dns_udp_server=$(config_t_get global direct_dns 223.5.5.5 | sed -E 's/^\\[([^]]+)\\]:(.*)$/\\1#\\2/; t; s/^([^:]+):([0-9]+)$/\\1#\\2/')\"\n\t\t\t\t\t;;\n\t\t\t\t\ttcp)\n\t\t\t\t\t\t_args=\"${_args} direct_dns_tcp_server=$(config_t_get global direct_dns 223.5.5.5 | sed -E 's/^\\[([^]]+)\\]:(.*)$/\\1#\\2/; t; s/^([^:]+):([0-9]+)$/\\1#\\2/')\"\n\t\t\t\t\t;;\n\t\t\t\tesac\n\n\t\t\t\t_args=\"${_args} remote_dns_protocol=${v2ray_dns_mode}\"\n\t\t\t\tcase \"$v2ray_dns_mode\" in\n\t\t\t\t\tudp|tcp)\n\t\t\t\t\t\tlocal _proto=\"$v2ray_dns_mode\"\n\t\t\t\t\t\t_args=\"${_args} remote_dns_${_proto}_server=${REMOTE_DNS}\"\n\t\t\t\t\t\tresolve_dns_log=\"Xray DNS(127.0.0.1#${resolve_dns_port}) -> ${_proto}://${REMOTE_DNS}\"\n\t\t\t\t\t;;\n\t\t\t\t\tdoh)\n\t\t\t\t\t\tlocal remote_dns_doh=$(config_t_get global remote_dns_doh \"https://1.1.1.1/dns-query\")\n\t\t\t\t\t\t_args=\"${_args} remote_dns_doh=${remote_dns_doh}\"\n\t\t\t\t\t\tresolve_dns_log=\"Xray DNS(127.0.0.1#${resolve_dns_port}) -> ${remote_dns_doh}\"\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\t\tlocal remote_fakedns=$(config_t_get global remote_fakedns 0)\n\t\t\t\t[ \"${remote_fakedns}\" = \"1\" ] && {\n\t\t\t\t\tREMOTE_FAKEDNS=1\n\t\t\t\t\t_args=\"${_args} remote_fakedns=1\"\n\t\t\t\t\tresolve_dns_log=\"${resolve_dns_log} + FakeDNS\"\n\t\t\t\t\tUSE_FAKEDNS=1\n\t\t\t\t}\n\t\t\t\tNEXT_DNS_LISTEN_PORT=$(expr $NEXT_DNS_LISTEN_PORT + 1)\n\t\t\t}\n\t\t\trun_xray flag=$_flag node=$node tcp_redir_port=$local_port tcp_proxy_way=$TCP_PROXY_WAY config_file=$config_file log_file=$log_file ${_args}\n\t\t;;\n\t\tnaiveproxy)\n\t\t\tjson_add_string \"run_type\" \"redir\"\n\t\t\tjson_add_string \"local_addr\" \"0.0.0.0\"\n\t\t\tjson_add_string \"local_port\" \"$local_port\"\n\t\t\tlua $UTIL_NAIVE gen_config \"$(json_dump)\" > $config_file\n\t\t\tln_run \"$(first_type naive)\" naive $log_file \"$config_file\"\n\t\t;;\n\t\tssr)\n\t\t\t[ \"${TCP_PROXY_WAY}\" = \"tproxy\" ] && json_add_string \"tcp_tproxy\" \"true\"\n\t\t\tlocal _extra_param\n\t\t\t[ \"$TCP_UDP\" = \"1\" ] && {\n\t\t\t\tconfig_file=\"${config_file//TCP/TCP_UDP}\"\n\t\t\t\tUDP_REDIR_PORT=$TCP_REDIR_PORT\n\t\t\t\tunset UDP_NODE\n\t\t\t\t_extra_param=\"-u\"\n\t\t\t}\n\t\t\tjson_add_string \"local_addr\" \"0.0.0.0\"\n\t\t\tjson_add_string \"local_port\" \"$local_port\"\n\t\t\tlua $UTIL_SS gen_config \"$(json_dump)\" > $config_file\n\t\t\tln_run \"$(first_type ssr-redir)\" \"ssr-redir\" $log_file -c \"$config_file\" -v ${_extra_param}\n\t\t;;\n\t\tss)\n\t\t\t[ \"${TCP_PROXY_WAY}\" = \"tproxy\" ] && json_add_string \"tcp_tproxy\" \"true\"\n\t\t\tif [ \"$TCP_UDP\" = \"1\" ]; then\n\t\t\t\tconfig_file=\"${config_file//TCP/TCP_UDP}\"\n\t\t\t\tUDP_REDIR_PORT=$TCP_REDIR_PORT\n\t\t\t\tunset UDP_NODE\n\t\t\t\tjson_add_string \"mode\" \"tcp_and_udp\"\n\t\t\telse\n\t\t\t\tjson_add_string \"mode\" \"tcp_only\"\n\t\t\tfi\n\t\t\tlocal plugin_sh=\"${config_file%.json}_plugin.sh\"\n\t\t\tjson_add_string \"plugin_sh\" \"$plugin_sh\"\n\t\t\tjson_add_string \"local_addr\" \"0.0.0.0\"\n\t\t\tjson_add_string \"local_port\" \"$local_port\"\n\t\t\tlua $UTIL_SS gen_config \"$(json_dump)\" > $config_file\n\t\t\tln_run \"$(first_type ss-redir)\" \"ss-redir\" $log_file -c \"$config_file\" -v\n\t\t;;\n\t\tss-rust)\n\t\t\tjson_add_string \"local_tcp_redir_port\" \"$local_port\"\n\t\t\t[ \"${TCP_PROXY_WAY}\" = \"tproxy\" ] && json_add_string \"tcp_tproxy\" \"true\"\n\t\t\t[ \"$tcp_node_socks\" = \"1\" ] && {\n\t\t\t\ttcp_node_socks_flag=1\n\t\t\t\tconfig_file=\"${config_file//TCP/TCP_SOCKS}\"\n\t\t\t\tjson_add_string \"local_socks_address\" \"${tcp_node_socks_bind}\"\n\t\t\t\tjson_add_string \"local_socks_port\" \"${tcp_node_socks_port}\"\n\t\t\t}\n\t\t\t[ \"$tcp_node_http\" = \"1\" ] && {\n\t\t\t\ttcp_node_http_flag=1\n\t\t\t\tconfig_file=\"${config_file//TCP/TCP_HTTP}\"\n\t\t\t\tjson_add_string \"local_http_port\" \"${tcp_node_http_port}\"\n\t\t\t}\n\t\t\t[ \"$TCP_UDP\" = \"1\" ] && {\n\t\t\t\tconfig_file=\"${config_file//TCP/TCP_UDP}\"\n\t\t\t\tUDP_REDIR_PORT=$TCP_REDIR_PORT\n\t\t\t\tunset UDP_NODE\n\t\t\t\tjson_add_string \"local_udp_redir_port\" \"$local_port\"\n\t\t\t}\n\t\t\tlocal plugin_sh=\"${config_file%.json}_plugin.sh\"\n\t\t\tjson_add_string \"plugin_sh\" \"$plugin_sh\"\n\t\t\tlua $UTIL_SS gen_config \"$(json_dump)\" > $config_file\n\t\t\tln_run \"$(first_type sslocal)\" \"sslocal\" $log_file -c \"$config_file\" -v\n\t\t;;\n\t\thysteria2)\n\t\t\tjson_add_string \"local_tcp_redir_port\" \"$local_port\"\n\t\t\t[ \"$tcp_node_socks\" = \"1\" ] && {\n\t\t\t\ttcp_node_socks_flag=1\n\t\t\t\tconfig_file=\"${config_file//TCP/TCP_SOCKS}\"\n\t\t\t\tjson_add_string \"local_socks_address\" \"${tcp_node_socks_bind}\"\n\t\t\t\tjson_add_string \"local_socks_port\" \"${tcp_node_socks_port}\"\n\t\t\t}\n\t\t\t[ \"$tcp_node_http\" = \"1\" ] && {\n\t\t\t\ttcp_node_http_flag=1\n\t\t\t\tconfig_file=\"${config_file//TCP/TCP_HTTP}\"\n\t\t\t\tjson_add_string \"local_http_port\" \"${tcp_node_http_port}\"\n\t\t\t}\n\t\t\t[ \"$TCP_UDP\" = \"1\" ] && {\n\t\t\t\tconfig_file=\"${config_file//TCP/TCP_UDP}\"\n\t\t\t\tUDP_REDIR_PORT=$TCP_REDIR_PORT\n\t\t\t\tunset UDP_NODE\n\t\t\t\tjson_add_string \"local_udp_redir_port\" \"$local_port\"\n\t\t\t}\n\t\t\tjson_add_string \"tcp_proxy_way\" \"${TCP_PROXY_WAY}\"\n\t\t\tlua $UTIL_HYSTERIA2 gen_config \"$(json_dump)\" > $config_file\n\t\t\tln_run \"$(first_type $(config_t_get global_app hysteria_file))\" \"hysteria\" $log_file -c \"$config_file\" client\n\t\t;;\n\t\tesac\n\t\tif [ -n \"${_socks_flag}\" ]; then\n\t\t\tlocal _flag=\"TCP\"\n\t\t\t[ \"$TCP_UDP\" = \"1\" ] && {\n\t\t\t\t_flag=\"TCP_UDP\"\n\t\t\t\tUDP_REDIR_PORT=$TCP_REDIR_PORT\n\t\t\t\tunset UDP_NODE\n\t\t\t}\n\t\t\tlocal _socks_tproxy=\"\"\n\t\t\t[ \"${TCP_PROXY_WAY}\" = \"tproxy\" ] && _socks_tproxy=\"1\"\n\t\t\trun_ipt2socks flag=default proto=${_flag} tcp_tproxy=${_socks_tproxy} local_port=${local_port} socks_address=${_socks_address} socks_port=${_socks_port} socks_username=${_socks_username} socks_password=${_socks_password} log_file=${log_file}\n\t\tfi\n\n\t\t[ -z \"$tcp_node_socks_flag\" ] && {\n\t\t\t[ \"$tcp_node_socks\" = \"1\" ] && {\n\t\t\t\tlocal config_file=\"SOCKS_TCP.json\"\n\t\t\t\tlocal log_file=\"SOCKS_TCP.log\"\n\t\t\t\tlocal http_port=0\n\t\t\t\tlocal http_config_file=\"HTTP2SOCKS_TCP.json\"\n\t\t\t\t[ \"$tcp_node_http\" = \"1\" ] && [ -z \"$tcp_node_http_flag\" ] && {\n\t\t\t\t\thttp_port=$tcp_node_http_port\n\t\t\t\t}\n\t\t\t\trun_socks flag=TCP node=$node bind=$tcp_node_socks_bind socks_port=$tcp_node_socks_port config_file=$config_file http_port=$http_port http_config_file=$http_config_file\n\t\t\t}\n\t\t}\n\n\t\t[ \"$tcp_node_socks\" = \"1\" ] && {\n\t\t\tTCP_SOCKS_server=\"127.0.0.1:$tcp_node_socks_port\"\n\t\t\tset_cache_var \"GLOBAL_TCP_SOCKS_server\" \"${TCP_SOCKS_server}\"\n\t\t}\n\t;;\n\tesac\n\tunset tcp_node_socks_flag tcp_node_http_flag\n\t[ \"$type\" != \"sing-box\" ] && [ \"$type\" != \"xray\" ] && echo \"${node}\" >> $TMP_PATH/direct_node_list\n\t[ -n \"${redir_port}\" ] && set_cache_var \"node_${node}_${PROTO}_redir_port\" \"${local_port}\"\n}\n\nstart_redir() {\n\tlocal proto=${1}\n\teval node=\\$${proto}_NODE\n\tif [ -n \"$node\" ]; then\n\t\tTYPE=$(echo $(config_n_get $node type) | tr 'A-Z' 'a-z')\n\t\tlocal config_file=\"${proto}.json\"\n\t\tlocal log_file=\"${proto}.log\"\n\t\teval current_port=\\$${proto}_REDIR_PORT\n\t\tlocal port=$(echo $(get_new_port $current_port $proto))\n\t\teval ${proto}_REDIR_PORT=$port\n\t\trun_redir node=$node proto=${proto} bind=0.0.0.0 local_port=$port config_file=$config_file log_file=$log_file\n\t\tset_cache_var \"ACL_GLOBAL_${proto}_node\" \"${node}\"\n\t\tset_cache_var \"ACL_GLOBAL_${proto}_redir_port\" \"${port}\"\n\t\t[ \"$TCP_UDP\" = \"1\" ] && {\n\t\t\tset_cache_var \"ACL_GLOBAL_UDP_node\" \"${node}\"\n\t\t\tset_cache_var \"ACL_GLOBAL_UDP_redir_port\" \"${port}\"\n\t\t}\n\telse\n\t\t[ \"${proto}\" = \"UDP\" ] && [ \"$TCP_UDP\" = \"1\" ] && return\n\t\techolog \"${proto}节点没有选择或为空，不代理${proto}。\"\n\tfi\n}\n\nstart_socks() {\n\t[ \"$SOCKS_ENABLED\" = \"1\" ] && {\n\t\tlocal ids=$(uci show $CONFIG | grep \"=socks\" | awk -F '.' '{print $2}' | awk -F '=' '{print $1}')\n\t\t[ -n \"$ids\" ] && {\n\t\t\techolog \"分析 Socks 服务的节点配置...\"\n\t\t\tfor id in $ids; do\n\t\t\t\tlocal enabled=$(config_n_get $id enabled 0)\n\t\t\t\t[ \"$enabled\" == \"0\" ] && continue\n\t\t\t\tlocal node=$(config_n_get $id node)\n\t\t\t\t[ -z \"$node\" ] && continue\n\t\t\t\tlocal bind_local=$(config_n_get $id bind_local 0)\n\t\t\t\tlocal bind=\"0.0.0.0\"\n\t\t\t\t[ \"$bind_local\" = \"1\" ] && bind=\"127.0.0.1\"\n\t\t\t\tlocal port=$(config_n_get $id port)\n\t\t\t\tlocal config_file=\"SOCKS_${id}.json\"\n\t\t\t\tlocal log_file=\"SOCKS_${id}.log\"\n\t\t\t\tlocal log=$(config_n_get $id log 1)\n\t\t\t\t[ \"$log\" == \"0\" ] && log_file=\"\"\n\t\t\t\tlocal http_port=$(config_n_get $id http_port 0)\n\t\t\t\tlocal http_config_file=\"HTTP2SOCKS_${id}.json\"\n\t\t\t\tlocal enable_autoswitch=$(config_n_get $id enable_autoswitch 0)\n\t\t\t\t[ \"$enable_autoswitch\" = \"1\" ] && [ -z \"$(config_n_get $id autoswitch_backup_node)\" ] && enable_autoswitch=0\n\t\t\t\tlocal no_rec=0\n\t\t\t\t[ \"$enable_autoswitch\" = \"1\" ] && no_rec=1\n\t\t\t\tNO_REC_PROCESS=$no_rec $APP_PATH/app.sh run_socks flag=$id node=$node bind=$bind socks_port=$port config_file=$config_file http_port=$http_port http_config_file=$http_config_file log_file=$log_file\n\t\t\t\tset_cache_var \"socks_${id}\" \"$node\"\n\t\t\t\t#自动切换逻辑\n\t\t\t\t[ \"$enable_autoswitch\" = \"1\" ] && $APP_PATH/socks_auto_switch.sh ${id} > /dev/null 2>&1 &\n\t\t\tdone\n\t\t}\n\t}\n}\n\nsocks_node_switch() {\n\tlocal flag new_node\n\teval_set_val $@\n\t[ -n \"$flag\" ] && [ -n \"$new_node\" ] && {\n\t\tlocal prefix pf filename\n\t\t# 结束 SS 插件进程\n\t\tfor prefix in \"\" \"HTTP_\"; do\n\t\t\tpf=\"$TMP_PATH/${prefix}SOCKS_${flag}_plugin.pid\"\n\t\t\t[ -s \"$pf\" ] && kill -9 \"$(head -n1 \"$pf\")\" >/dev/null 2>&1\n\t\tdone\n\n\t\tpgrep -af \"$TMP_BIN_PATH\" | awk -v P1=\"${flag}\" 'BEGIN{IGNORECASE=1}$0~P1 && !/acl\\/|acl_/{print $1}' | xargs kill -9 >/dev/null 2>&1\n\t\tfor prefix in \"\" \"HTTP_\" \"HTTP2\"; do\n\t\t\trm -rf \"$TMP_PATH/${prefix}SOCKS_${flag}\"*\n\t\tdone\n\n\t\tfor filename in $(ls ${TMP_SCRIPT_FUNC_PATH}); do\n\t\t\tgrep -q \"${flag}\" \"${TMP_SCRIPT_FUNC_PATH}/${filename}\" && \\\n\t\t\t\trm -f \"${TMP_SCRIPT_FUNC_PATH}/${filename}\" \"${TMP_PATH}/script_rstats/${filename}.count\"\n\t\tdone\n\t\tlocal bind_local=$(config_n_get $flag bind_local 0)\n\t\tlocal bind=\"0.0.0.0\"\n\t\t[ \"$bind_local\" = \"1\" ] && bind=\"127.0.0.1\"\n\t\tlocal port=$(config_n_get $flag port)\n\t\tlocal config_file=\"SOCKS_${flag}.json\"\n\t\tlocal log_file=\"SOCKS_${flag}.log\"\n\t\tlocal log=$(config_n_get $flag log 1)\n\t\t[ \"$log\" == \"0\" ] && log_file=\"\"\n\t\tlocal http_port=$(config_n_get $flag http_port 0)\n\t\tlocal http_config_file=\"HTTP2SOCKS_${flag}.json\"\n\t\tLOG_FILE=\"/dev/null\"\n\t\trun_socks flag=$flag node=$new_node bind=$bind socks_port=$port config_file=$config_file http_port=$http_port http_config_file=$http_config_file log_file=$log_file\n\t\tset_cache_var \"socks_${flag}\" \"$new_node\"\n\t\tlocal ENABLED_DEFAULT_ACL=$(get_cache_var \"ENABLED_DEFAULT_ACL\")\n\t\tlocal ENABLED_ACLS=$(get_cache_var \"ENABLED_ACLS\")\n\t\t[ \"$ENABLED_DEFAULT_ACL\" != \"1\" -a \"$ENABLED_ACLS\" != \"1\" ] && return\n\t\tlocal USE_TABLES=$(get_cache_var \"USE_TABLES\")\n\t\t[ -n \"$USE_TABLES\" ] && source $APP_PATH/${USE_TABLES}.sh filter_direct_node_list\n\t}\n}\n\nclean_crontab() {\n\t[ -f \"${LOCK_PATH}/${CONFIG}_cron.lock\" ] && return\n\ttouch /etc/crontabs/root\n\t#sed -i \"/${CONFIG}/d\" /etc/crontabs/root >/dev/null 2>&1\n\tsed -i \"/$(echo \"/etc/init.d/${CONFIG}\" | sed 's#\\/#\\\\\\/#g')/d\" /etc/crontabs/root >/dev/null 2>&1\n\tsed -i \"/$(echo \"lua ${APP_PATH}/rule_update.lua log\" | sed 's#\\/#\\\\\\/#g')/d\" /etc/crontabs/root >/dev/null 2>&1\n\tsed -i \"/$(echo \"lua ${APP_PATH}/subscribe.lua start\" | sed 's#\\/#\\\\\\/#g')/d\" /etc/crontabs/root >/dev/null 2>&1\n\n\tpgrep -af \"${CONFIG}/\" | awk '/tasks\\.sh/{print $1}' | xargs kill -9 >/dev/null 2>&1\n\trm -f ${LOCK_PATH}/${CONFIG}_tasks.lock\n}\n\nstart_crontab() {\n\tlocal update_loop\n\n\tif [ \"$ENABLED_DEFAULT_ACL\" = \"1\" ] || [ \"$ENABLED_ACLS\" = \"1\" ]; then\n\t\tlocal start_daemon=$(config_t_get global_delay start_daemon 0)\n\t\t[ \"$start_daemon\" = \"1\" ] && $APP_PATH/monitor.sh >/dev/null 2>&1 &\n\tfi\n\n\tif [ -f \"${LOCK_PATH}/${CONFIG}_cron.lock\" ]; then\n\t\trm -f \"${LOCK_PATH}/${CONFIG}_cron.lock\"\n\t\techolog \"当前为计划任务自动运行，不重新配置定时任务。\"\n\t\treturn\n\tfi\n\n\tclean_crontab\n\n\tif [ \"$ENABLED\" != \"1\" ]; then\n\t\t/etc/init.d/cron restart\n\t\treturn\n\tfi\n\n\tbuild_time() {\n\t\tlocal w=\"$1\"\n\t\tlocal h=\"$2\"\n\t\tlocal expr=\"0 $h * * $w\"\n\t\t[ \"$w\" = \"7\" ] && expr=\"0 $h * * *\"\n\t\techo \"$expr\"\n\t}\n\n\tadd_service_cron() {\n\t\tlocal week=\"$1\"\n\t\tlocal hour=\"$2\"\n\t\tlocal action=\"$3\"\n\t\tlocal logmsg=\"$4\"\n\t\t[ -z \"$week\" ] && return\n\t\tlocal svr_t=$(build_time \"$week\" \"$hour\")\n\t\tif [ \"$week\" = \"8\" ]; then\n\t\t\tupdate_loop=1\n\t\telse\n\t\t\techo \"$svr_t /etc/init.d/$CONFIG $action > /dev/null 2>&1 &\" >>/etc/crontabs/root\n\t\tfi\n\t\techolog \"$logmsg\"\n\t}\n\n\t# ===== stop/start/restart =====\n\tadd_service_cron \"$(config_t_get global_delay stop_week_mode)\" \"$(config_t_get global_delay stop_time_mode)\" \"stop\" \"配置定时任务：自动关闭服务。\"\n\n\tadd_service_cron \"$(config_t_get global_delay start_week_mode)\" \"$(config_t_get global_delay start_time_mode)\" \"start\" \"配置定时任务：自动开启服务。\"\n\n\tadd_service_cron \"$(config_t_get global_delay restart_week_mode)\" \"$(config_t_get global_delay restart_time_mode)\" \"restart\" \"配置定时任务：自动重启服务。\"\n\n\t# ===== rule update =====\n\tlocal autoupdate=$(config_t_get global_rules auto_update)\n\tlocal weekupdate=$(config_t_get global_rules week_update)\n\tlocal dayupdate=$(config_t_get global_rules time_update)\n\tif [ \"$autoupdate\" = \"1\" ]; then\n\t\tlocal rule_t=$(build_time \"$weekupdate\" \"$dayupdate\")\n\t\tif [ \"$weekupdate\" = \"8\" ]; then\n\t\t\tupdate_loop=1\n\t\telse\n\t\t\techo \"$rule_t lua $APP_PATH/rule_update.lua log all cron > /dev/null 2>&1 &\" >>/etc/crontabs/root\n\t\tfi\n\t\techolog \"配置定时任务：自动更新规则。\"\n\tfi\n\n\t# ===== subscribe =====\n\tlocal TMP_SUB_PATH=$TMP_PATH/sub_crontabs\n\tmkdir -p \"$TMP_SUB_PATH\"\n\tlocal item cfgid remark week_update time_update\n\tfor item in $(uci show ${CONFIG} | grep \"=subscribe_list\" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do\n\t\tif [ \"$(config_n_get \"$item\" auto_update 0)\" = \"1\" ]; then\n\t\t\tcfgid=$(uci show ${CONFIG}.$item | head -n 1 | cut -d '.' -sf 2 | cut -d '=' -sf 1)\n\t\t\tremark=$(config_n_get \"$item\" remark)\n\t\t\tweek_update=$(config_n_get \"$item\" week_update)\n\t\t\ttime_update=$(config_n_get \"$item\" time_update)\n\t\t\techo \"$cfgid\" >> \"$TMP_SUB_PATH/${week_update}_${time_update}\"\n\t\t\techolog \"配置定时任务：自动更新【$remark】订阅。\"\n\t\tfi\n\tdone\n\tif [ -d \"$TMP_SUB_PATH\" ]; then\n\t\tlocal name cfgids\n\t\tfor name in $(ls \"$TMP_SUB_PATH\"); do\n\t\t\tweek_update=${name%_*}\n\t\t\ttime_update=${name#*_}\n\t\t\tcfgids=$(tr '\\n' ',' < \"$TMP_SUB_PATH/$name\" | sed 's/,$//')\n\t\t\tlocal sub_t=$(build_time \"$week_update\" \"$time_update\")\n\t\t\tif [ \"$week_update\" = \"8\" ]; then\n\t\t\t\tupdate_loop=1\n\t\t\telse\n\t\t\t\techo \"$sub_t lua $APP_PATH/subscribe.lua start $cfgids cron > /dev/null 2>&1 &\" >>/etc/crontabs/root\n\t\t\tfi\n\t\tdone\n\t\trm -rf \"$TMP_SUB_PATH\"\n\tfi\n\n\t# ===== loop =====\n\tif [ \"$ENABLED_DEFAULT_ACL\" = \"1\" ] || [ \"$ENABLED_ACLS\" = \"1\" ]; then\n\t\tif [ \"$update_loop\" = \"1\" ]; then\n\t\t\t$APP_PATH/tasks.sh >/dev/null 2>&1 &\n\t\t\techolog \"自动更新：启动循环更新进程。\"\n\t\tfi\n\telse\n\t\techolog \"运行于非代理模式，仅允许服务启停的定时任务。\"\n\tfi\n\n\t/etc/init.d/cron restart\n}\n\nstop_crontab() {\n\t[ -f \"${LOCK_PATH}/${CONFIG}_cron.lock\" ] && return\n\tclean_crontab\n\t/etc/init.d/cron restart\n\t#echolog \"清除定时执行命令。\"\n}\n\nstart_dns() {\n\techolog \"DNS域名解析：\"\n\n\tlocal china_ng_local_dns=$(IFS=','; set -- $LOCAL_DNS; [ \"${1%%[#:]*}\" = \"127.0.0.1\" ] && echo \"$1\" || ([ -n \"$2\" ] && echo \"$*\" || echo \"$1\"))\n\tlocal sing_box_local_dns=\n\tlocal direct_dns_mode=$(config_t_get global direct_dns_mode \"auto\")\n\n\t#获取访问控制节点所使用的DNS分流模式\n\tlocal ACL_RULE_DNSMASQ=0\n\tfor acl_section in $(uci show ${CONFIG} | grep \"=acl_rule\" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do\n\t\tif [ \"$(config_n_get $acl_section enabled)\" = \"1\" ] && \\\n\t\t   [ \"$(config_n_get $acl_section dns_shunt)\" = \"dnsmasq\" ]; then\n\t\t\tACL_RULE_DNSMASQ=1\n\t\t\tbreak\n\t\tfi\n\tdone\n\n\tcase \"$direct_dns_mode\" in\n\t\tudp)\n\t\t\tLOCAL_DNS=$(config_t_get global direct_dns 223.5.5.5 | sed -E 's/^\\[([^]]+)\\]:(.*)$/\\1#\\2/; t; s/^([^:]+):([0-9]+)$/\\1#\\2/')\n\t\t\tchina_ng_local_dns=${LOCAL_DNS}\n\t\t\tsing_box_local_dns=\"direct_dns_udp_server=${LOCAL_DNS}\"\n\t\t;;\n\t\ttcp)\t\n\t\t\tlocal DIRECT_DNS=$(config_t_get global direct_dns 223.5.5.5 | sed -E 's/^\\[([^]]+)\\]:(.*)$/\\1#\\2/; t; s/^([^:]+):([0-9]+)$/\\1#\\2/')\n\t\t\tchina_ng_local_dns=\"tcp://${DIRECT_DNS}\"\n\t\t\tsing_box_local_dns=\"direct_dns_tcp_server=${DIRECT_DNS}\"\n\n\t\t\t#当全局（包括访问控制节点）开启chinadns-ng时，不启动新进程。\n\t\t\t[ \"$DNS_SHUNT\" != \"chinadns-ng\" ] || [ \"$ACL_RULE_DNSMASQ\" = \"1\" ] && {\n\t\t\t\tLOCAL_DNS=\"127.0.0.1#${NEXT_DNS_LISTEN_PORT}\"\n\t\t\t\tlocal china_ng_c_dns=\"tcp://$(get_first_dns DIRECT_DNS 53 | sed -E 's/^\\[([^]]+)\\]:(.*)$/\\1#\\2/; t; s/^([^:]+):([0-9]+)$/\\1#\\2/')\"\n\t\t\t\tln_run \"$(first_type chinadns-ng)\" chinadns-ng \"/dev/null\" -b :: -l ${NEXT_DNS_LISTEN_PORT} -c ${china_ng_c_dns} -d chn\n\t\t\t\techolog \"  - ChinaDNS-NG(${LOCAL_DNS}) -> ${china_ng_c_dns}\"\n\t\t\t\techolog \"  * 请确保上游直连 DNS 支持 TCP 查询。\"\n\t\t\t\tNEXT_DNS_LISTEN_PORT=$(expr $NEXT_DNS_LISTEN_PORT + 1)\n\t\t\t}\n\t\t;;\n\t\tauto)\n\t\t\t#Automatic logic is already done by default\n\t\t\t:\n\t\t;;\n\tesac\n\n\t# 追加直连DNS到iptables/nftables\n\t[ \"$(config_t_get global_haproxy balancing_enable 0)\" != \"1\" ] && IPT_APPEND_DNS=\n\tadd_default_port() {\n\t\t[ -z \"$1\" ] && echo \"\" || echo \"$1\" | awk -F',' '{for(i=1;i<=NF;i++){if($i !~ /#/) $i=$i\"#53\";} print $0;}' OFS=','\n\t}\n\tLOCAL_DNS=$(add_default_port \"$LOCAL_DNS\")\n\tIPT_APPEND_DNS=$(add_default_port \"${IPT_APPEND_DNS:-$LOCAL_DNS}\")\n\techo \"$IPT_APPEND_DNS\" | grep -q -E \"(^|,)$LOCAL_DNS(,|$)\" || IPT_APPEND_DNS=\"${IPT_APPEND_DNS:+$IPT_APPEND_DNS,}$LOCAL_DNS\"\n\t[ -n \"$DIRECT_DNS\" ] && {\n\t\tDIRECT_DNS=$(add_default_port \"$DIRECT_DNS\")\n\t\techo \"$IPT_APPEND_DNS\" | grep -q -E \"(^|,)$DIRECT_DNS(,|$)\" || IPT_APPEND_DNS=\"${IPT_APPEND_DNS:+$IPT_APPEND_DNS,}$DIRECT_DNS\"\n\t}\n\t# 排除127.0.0.1的条目\n\tIPT_APPEND_DNS=$(echo \"$IPT_APPEND_DNS\" | awk -F',' '{for(i=1;i<=NF;i++) if($i !~ /^127\\.0\\.0\\.1/) printf (i>1?\",\":\"\") $i; print \"\"}' | sed 's/^,\\|,$//g')\n\n\tTUN_DNS=\"127.0.0.1#${NEXT_DNS_LISTEN_PORT}\"\n\t[ -n \"${NO_PLUGIN_DNS}\" ] && TUN_DNS=\"127.0.0.1#${resolve_dns_port}\"\n\n\tcase \"$DNS_MODE\" in\n\tdns2socks)\n\t\tlocal dns2socks_socks_server=$(echo $(config_t_get global socks_server 127.0.0.1:1080) | sed \"s/#/:/g\")\n\t\tlocal dns2socks_forward=$(get_first_dns REMOTE_DNS 53 | sed 's/#/:/g')\n\t\trun_dns2socks socks=$dns2socks_socks_server listen_address=127.0.0.1 listen_port=${NEXT_DNS_LISTEN_PORT} dns=$dns2socks_forward cache=$DNS_CACHE\n\t\techolog \"  - dns2socks(${TUN_DNS})，${dns2socks_socks_server} -> tcp://${dns2socks_forward}\"\n\t;;\n\tsing-box)\n\t\t[ -z \"${NO_PLUGIN_DNS}\" ] && {\n\t\t\tlocal config_file=$TMP_PATH/DNS.json\n\t\t\tlocal log_file=$TMP_PATH/DNS.log\n\t\t\tlocal log_file=/dev/null\n\t\t\tlocal _args=\"type=$DNS_MODE config_file=$config_file log_file=$log_file\"\n\t\t\t[ \"${DNS_CACHE}\" == \"0\" ] && _args=\"${_args} dns_cache=0\"\n\t\t\t_args=\"${_args} direct_dns_query_strategy=${DIRECT_DNS_QUERY_STRATEGY}\"\n\t\t\t_args=\"${_args} remote_dns_query_strategy=${REMOTE_DNS_QUERY_STRATEGY}\"\n\t\t\tDNSMASQ_FILTER_PROXY_IPV6=0\n\t\t\tlocal remote_fakedns=$(config_t_get global remote_fakedns 0)\n\t\t\t[ \"${remote_fakedns}\" = \"1\" ] && {\n\t\t\t\tREMOTE_FAKEDNS=1\n\t\t\t\t_args=\"${_args} remote_fakedns=1\"\n\t\t\t\tUSE_FAKEDNS=1\n\t\t\t}\n\t\t\tlocal _remote_dns_client_ip=$(config_t_get global remote_dns_client_ip)\n\t\t\t[ -n \"${_remote_dns_client_ip}\" ] && _args=\"${_args} remote_dns_client_ip=${_remote_dns_client_ip}\"\n\t\t\tTCP_PROXY_DNS=1\n\t\t\tlocal v2ray_dns_mode=$(config_t_get global v2ray_dns_mode tcp)\n\t\t\t_args=\"${_args} dns_listen_port=${NEXT_DNS_LISTEN_PORT}\"\n\t\t\t_args=\"${_args} remote_dns_protocol=${v2ray_dns_mode}\"\n\t\t\tcase \"$v2ray_dns_mode\" in\n\t\t\t\tudp|tcp)\n\t\t\t\t\tlocal _proto=\"$v2ray_dns_mode\"\n\t\t\t\t\t_args=\"${_args} remote_dns_${_proto}_server=${REMOTE_DNS}\"\n\t\t\t\t\techolog \"  - Sing-Box DNS(${TUN_DNS}) -> ${_proto}://${REMOTE_DNS}\"\n\t\t\t\t;;\n\t\t\t\tdoh|http3)\n\t\t\t\t\tlocal remote_dns_doh=$(config_t_get global remote_dns_doh \"https://1.1.1.1/dns-query\")\n\t\t\t\t\t_args=\"${_args} remote_dns_doh=${remote_dns_doh}\"\n\t\t\t\t\techolog \"  - Sing-Box DNS(${TUN_DNS}) -> ${remote_dns_doh}\"\n\t\t\t\t;;\n\t\t\tesac\n\t\t\t_args=\"${_args} dns_socks_address=127.0.0.1 dns_socks_port=${tcp_node_socks_port}\"\n\t\t\t[ -n \"${sing_box_local_dns}\" ] && _args=\"${_args} ${sing_box_local_dns}\"\n\t\t\trun_singbox ${_args}\n\t\t}\n\t;;\n\txray)\n\t\t[ -z \"${NO_PLUGIN_DNS}\" ] && {\n\t\t\tlocal config_file=$TMP_PATH/DNS.json\n\t\t\tlocal log_file=$TMP_PATH/DNS.log\n\t\t\tlocal log_file=/dev/null\n\t\t\tlocal _args=\"type=$DNS_MODE config_file=$config_file log_file=$log_file\"\n\t\t\t[ \"${DNS_CACHE}\" == \"0\" ] && _args=\"${_args} dns_cache=0\"\n\t\t\t_args=\"${_args} direct_dns_query_strategy=${DIRECT_DNS_QUERY_STRATEGY}\"\n\t\t\t_args=\"${_args} remote_dns_query_strategy=${REMOTE_DNS_QUERY_STRATEGY}\"\n\t\t\tDNSMASQ_FILTER_PROXY_IPV6=0\n\t\t\tlocal remote_fakedns=$(config_t_get global remote_fakedns 0)\n\t\t\t[ \"${remote_fakedns}\" = \"1\" ] && {\n\t\t\t\tREMOTE_FAKEDNS=1\n\t\t\t\t_args=\"${_args} remote_fakedns=1\"\n\t\t\t\tUSE_FAKEDNS=1\n\t\t\t}\n\t\t\tlocal _remote_dns_client_ip=$(config_t_get global remote_dns_client_ip)\n\t\t\t[ -n \"${_remote_dns_client_ip}\" ] && _args=\"${_args} remote_dns_client_ip=${_remote_dns_client_ip}\"\n\t\t\tTCP_PROXY_DNS=1\n\t\t\tlocal v2ray_dns_mode=$(config_t_get global v2ray_dns_mode tcp)\n\t\t\t#兼容旧模式，择机移除\n\t\t\t[ \"$v2ray_dns_mode\" = \"tcp+doh\" ] && v2ray_dns_mode=\"tcp\"\n\t\t\t_args=\"${_args} dns_listen_port=${NEXT_DNS_LISTEN_PORT}\"\n\t\t\t_args=\"${_args} remote_dns_protocol=${v2ray_dns_mode}\"\n\t\t\tcase \"$v2ray_dns_mode\" in\n\t\t\t\tudp|tcp)\n\t\t\t\t\tlocal _proto=\"$v2ray_dns_mode\"\n\t\t\t\t\t_args=\"${_args} remote_dns_${_proto}_server=${REMOTE_DNS}\"\n\t\t\t\t\techolog \"  - Xray DNS(${TUN_DNS}) -> ${_proto}://${REMOTE_DNS}\"\n\t\t\t\t;;\n\t\t\t\tdoh)\n\t\t\t\t\tlocal remote_dns_doh=$(config_t_get global remote_dns_doh \"https://1.1.1.1/dns-query\")\n\t\t\t\t\t_args=\"${_args} remote_dns_doh=${remote_dns_doh}\"\n\t\t\t\t\techolog \"  - Xray DNS(${TUN_DNS}) -> ${remote_dns_doh}\"\n\t\t\t\t;;\n\t\t\tesac\n\t\t\t_args=\"${_args} dns_socks_address=127.0.0.1 dns_socks_port=${tcp_node_socks_port}\"\n\t\t\trun_xray ${_args}\n\t\t}\n\t;;\n\tudp)\n\t\tUDP_PROXY_DNS=1\n\t\tlocal china_ng_listen_port=${NEXT_DNS_LISTEN_PORT}\n\t\tlocal china_ng_trust_dns=\"udp://$(get_first_dns REMOTE_DNS 53 | sed -E 's/^\\[([^]]+)\\]:(.*)$/\\1#\\2/; t; s/^([^:]+):([0-9]+)$/\\1#\\2/')\"\n\t\tif [ \"$DNS_SHUNT\" != \"chinadns-ng\" ] && [ \"$FILTER_PROXY_IPV6\" = \"1\" ]; then\n\t\t\tDNSMASQ_FILTER_PROXY_IPV6=0\n\t\t\tlocal no_ipv6_trust=\"-N\"\n\t\t\tln_run \"$(first_type chinadns-ng)\" chinadns-ng \"/dev/null\" -b :: -l ${china_ng_listen_port} -t ${china_ng_trust_dns} -d gfw ${no_ipv6_trust}\n\t\t\techolog \"  - ChinaDNS-NG(${TUN_DNS}) -> ${china_ng_trust_dns}\"\n\t\telse\n\t\t\tTUN_DNS=\"$(echo ${REMOTE_DNS} | sed 's/#/:/g' | sed -E 's/\\:([^:]+)$/#\\1/g')\"\n\t\t\techolog \"  - udp://${TUN_DNS}\"\n\t\tfi\n\t;;\n\ttcp)\n\t\tTCP_PROXY_DNS=1\n\t\tlocal china_ng_listen_port=${NEXT_DNS_LISTEN_PORT}\n\t\tlocal china_ng_trust_dns=\"tcp://$(get_first_dns REMOTE_DNS 53 | sed -E 's/^\\[([^]]+)\\]:(.*)$/\\1#\\2/; t; s/^([^:]+):([0-9]+)$/\\1#\\2/')\"\n\t\t[ \"$DNS_SHUNT\" != \"chinadns-ng\" ] && {\n\t\t\t[ \"$FILTER_PROXY_IPV6\" = \"1\" ] && DNSMASQ_FILTER_PROXY_IPV6=0 && local no_ipv6_trust=\"-N\"\n\t\t\tln_run \"$(first_type chinadns-ng)\" chinadns-ng \"/dev/null\" -b :: -l ${china_ng_listen_port} -t ${china_ng_trust_dns} -d gfw ${no_ipv6_trust}\n\t\t\techolog \"  - ChinaDNS-NG(${TUN_DNS}) -> ${china_ng_trust_dns}\"\n\t\t}\n\t;;\n\tesac\n\n\t[ -n \"${resolve_dns_log}\" ] && echolog \"  - ${resolve_dns_log}\"\n\n\t[ -n \"${TCP_PROXY_DNS}\" ] && echolog \"  * 请确认上游 DNS 支持 TCP/DoH 查询，如非直连地址，确保 TCP 代理打开，并且已经正确转发！\"\n\t[ -n \"${UDP_PROXY_DNS}\" ] && echolog \"  * 请确认上游 DNS 支持 UDP 查询并已使用 UDP 节点，如上游 DNS 非直连地址，确保 UDP 代理打开，并且已经正确转发！\"\n\n\tlocal china_ng_listen=0\n\t[ \"${DNS_SHUNT}\" = \"smartdns\" ] && {\n\t\tif command -v smartdns > /dev/null 2>&1; then\n\t\t\trm -rf $TMP_PATH2/dnsmasq_default*\n\t\t\tlocal group_domestic=$(config_t_get global group_domestic)\n\t\t\tlocal smartdns_remote_dns=$(config_t_get global smartdns_remote_dns)\n\t\t\tif [ -n \"${smartdns_remote_dns}\" -a \"${smartdns_remote_dns}\" != \"nil\" ]; then\n\t\t\t\tsmartdns_remote_dns=$(echo ${smartdns_remote_dns} | tr -s ' ' '|')\n\t\t\telse\n\t\t\t\tsmartdns_remote_dns=\"tcp://1.1.1.1\"\n\t\t\tfi\n\n\t\t\techolog \"  - 域名解析：使用SmartDNS，请确保配置正常。\"\n\t\t\tchina_ng_listen=\"127.0.0.1#${SMARTDNS_LISTEN_PORT}\"\n\t\t\techolog \"  - SmartDNS(127.0.0.1#${SMARTDNS_LOCAL_PORT}) -> 国内分组(${group_domestic:-null})，SmartDNS(${china_ng_listen}) -> Dnsmasq\"\n\t\t\tchina_ng_listen=\"${china_ng_listen},::1#${SMARTDNS_LISTEN_PORT}\"\n\n\t\t\tlocal subnet_ip=$(config_t_get global remote_dns_client_ip)\n\t\t\tlua $APP_PATH/helper_smartdns_add.lua -FLAG \"default\" -SMARTDNS_CONF \"/tmp/etc/smartdns/$CONFIG.conf\" \\\n\t\t\t\t-LISTEN_PORT ${SMARTDNS_LISTEN_PORT} -LOCAL_PORT ${SMARTDNS_LOCAL_PORT} \\\n\t\t\t\t-LOCAL_GROUP ${group_domestic:-null} -REMOTE_GROUP \"passwall_proxy\" -REMOTE_PROXY_SERVER ${TCP_SOCKS_server} -USE_DEFAULT_DNS \"${USE_DEFAULT_DNS:-direct}\" \\\n\t\t\t\t-REMOTE_DNS ${smartdns_remote_dns} -DNS_MODE ${DNS_MODE:-socks} -TUN_DNS ${TUN_DNS} -REMOTE_FAKEDNS ${REMOTE_FAKEDNS:-0} \\\n\t\t\t\t-USE_DIRECT_LIST \"${USE_DIRECT_LIST}\" -USE_PROXY_LIST \"${USE_PROXY_LIST}\" -USE_BLOCK_LIST \"${USE_BLOCK_LIST}\" -USE_GFW_LIST \"${USE_GFW_LIST}\" -CHN_LIST \"${CHN_LIST}\" \\\n\t\t\t\t-TCP_NODE ${TCP_NODE} -DEFAULT_PROXY_MODE \"${TCP_PROXY_MODE}\" -NO_PROXY_IPV6 ${FILTER_PROXY_IPV6:-0} -NFTFLAG ${nftflag:-0} \\\n\t\t\t\t-SUBNET ${subnet_ip:-0} -NO_LOGIC_LOG ${NO_LOGIC_LOG:-0}\n\t\t\tsource $APP_PATH/helper_smartdns.sh restart\n\n\t\t\tUSE_DEFAULT_DNS=\"chinadns_ng\"\n\t\telse\n\t\t\tDNS_SHUNT=\"dnsmasq\"\n\t\t\techolog \"  * 未安装SmartDNS，默认使用Dnsmasq进行域名解析！\"\n\t\tfi\n\t}\n\n\t[ \"${DNS_SHUNT}\" = \"chinadns-ng\" ] && [ -n \"$(first_type chinadns-ng)\" ] && {\n\t\tchinadns_ng_min=2024.04.13\n\t\tchinadns_ng_now=$($(first_type chinadns-ng) -V | grep -i \"ChinaDNS-NG \" | awk '{print $2}')\n\t\tif [ $(check_ver \"$chinadns_ng_now\" \"$chinadns_ng_min\") = 1 ]; then\n\t\t\techolog \"  * 注意：当前 ChinaDNS-NG 版本为[ $chinadns_ng_now ]，请更新到[ $chinadns_ng_min ]或以上版本，否则 DNS 有可能无法正常工作！\"\n\t\tfi\n\n\t\t[ \"$FILTER_PROXY_IPV6\" = \"1\" ] && DNSMASQ_FILTER_PROXY_IPV6=0\n\t\t[ -z \"${china_ng_listen_port}\" ] && local china_ng_listen_port=$(expr $NEXT_DNS_LISTEN_PORT + 1)\n\t\tchina_ng_listen=\"127.0.0.1#${china_ng_listen_port}\"\n\t\t[ -z \"${china_ng_trust_dns}\" ] && local china_ng_trust_dns=${TUN_DNS}\n\n\t\techolog \"  - ChinaDNS-NG(${china_ng_listen})：直连DNS：${china_ng_local_dns}，可信DNS：${china_ng_trust_dns}\"\n\n\t\tchina_ng_listen=\"${china_ng_listen},::1#${china_ng_listen_port}\"\n\n\t\trun_chinadns_ng \\\n\t\t\t_flag=\"default\" \\\n\t\t\t_listen_port=${china_ng_listen_port} \\\n\t\t\t_dns_local=${china_ng_local_dns} \\\n\t\t\t_dns_trust=${china_ng_trust_dns} \\\n\t\t\t_no_ipv6_trust=${FILTER_PROXY_IPV6} \\\n\t\t\t_use_direct_list=${USE_DIRECT_LIST} \\\n\t\t\t_use_proxy_list=${USE_PROXY_LIST} \\\n\t\t\t_use_block_list=${USE_BLOCK_LIST} \\\n\t\t\t_gfwlist=${USE_GFW_LIST} \\\n\t\t\t_chnlist=${CHN_LIST} \\\n\t\t\t_default_mode=${TCP_PROXY_MODE} \\\n\t\t\t_default_tag=$(config_t_get global chinadns_ng_default_tag smart) \\\n\t\t\t_no_logic_log=0 \\\n\t\t\t_tcp_node=${TCP_NODE} \\\n\t\t\t_remote_fakedns=${REMOTE_FAKEDNS:-0} \\\n\t\t\t_filter_https=$(config_t_get global force_https_soa 0)\n\n\t\tUSE_DEFAULT_DNS=\"chinadns_ng\"\n\t}\n\n\t[ \"$USE_DEFAULT_DNS\" = \"remote\" ] && {\n\t\tdnsmasq_version=$(dnsmasq -v | grep -i \"Dnsmasq version \" | awk '{print $3}')\n\t\t[ \"$(expr $dnsmasq_version \\>= 2.87)\" == 0 ] && echolog \"Dnsmasq版本低于2.87，有可能无法正常使用！！！\"\n\t}\n\n\tlocal DNSMASQ_TUN_DNS=$(get_first_dns TUN_DNS 53 | sed -E 's/^\\[([^]]+)\\]:(.*)$/\\1#\\2/; t; s/^([^:]+):([0-9]+)$/\\1#\\2/')\n\tlocal RUN_NEW_DNSMASQ=1\n\tRUN_NEW_DNSMASQ=${DNS_REDIRECT}\n\tif [ \"${RUN_NEW_DNSMASQ}\" == \"0\" ]; then\n\t\t#The old logic will be removed in the future.\n\t\t#Run a copy dnsmasq instance, DNS hijack that don't need a proxy devices.\n\t\t[ \"1\" = \"0\" ] && {\n\t\t\tDIRECT_DNSMASQ_PORT=$(get_new_port 11400)\n\t\t\tDIRECT_DNSMASQ_CONF=${GLOBAL_ACL_PATH}/direct_dnsmasq.conf\n\t\t\tDIRECT_DNSMASQ_CONF_PATH=${GLOBAL_ACL_PATH}/direct_dnsmasq.d\n\t\t\tmkdir -p ${DIRECT_DNSMASQ_CONF_PATH}\n\t\t\tlua $APP_PATH/helper_dnsmasq.lua copy_instance -LISTEN_PORT ${DIRECT_DNSMASQ_PORT} -DNSMASQ_CONF ${DIRECT_DNSMASQ_CONF} -TMP_DNSMASQ_PATH ${DIRECT_DNSMASQ_CONF_PATH}\n\t\t\tln_run \"$(first_type dnsmasq)\" \"dnsmasq_direct\" \"/dev/null\" -C ${DIRECT_DNSMASQ_CONF} -x ${GLOBAL_ACL_PATH}/direct_dnsmasq.pid\n\t\t\techo \"${DIRECT_DNSMASQ_PORT}\" > ${GLOBAL_ACL_PATH}/direct_dnsmasq_port\n\t\t}\n\t\t\n\t\t#Rewrite the default DNS service configuration\n\t\t#Modify the default dnsmasq service\n\t\tlua $APP_PATH/helper_dnsmasq.lua stretch\n\t\tlua $APP_PATH/helper_dnsmasq.lua add_rule -FLAG \"default\" -TMP_DNSMASQ_PATH ${GLOBAL_DNSMASQ_CONF_PATH} -DNSMASQ_CONF_FILE ${GLOBAL_DNSMASQ_CONF} \\\n\t\t\t-DEFAULT_DNS ${DEFAULT_DNS} -LOCAL_DNS ${LOCAL_DNS} -TUN_DNS ${DNSMASQ_TUN_DNS} \\\n\t\t\t-REMOTE_FAKEDNS ${REMOTE_FAKEDNS:-0} -USE_DEFAULT_DNS \"${USE_DEFAULT_DNS:-direct}\" -CHINADNS_DNS ${china_ng_listen:-0} \\\n\t\t\t-USE_DIRECT_LIST \"${USE_DIRECT_LIST}\" -USE_PROXY_LIST \"${USE_PROXY_LIST}\" -USE_BLOCK_LIST \"${USE_BLOCK_LIST}\" -USE_GFW_LIST \"${USE_GFW_LIST}\" -CHN_LIST \"${CHN_LIST}\" \\\n\t\t\t-TCP_NODE ${TCP_NODE} -DEFAULT_PROXY_MODE ${TCP_PROXY_MODE} -NO_PROXY_IPV6 ${DNSMASQ_FILTER_PROXY_IPV6:-0} -NFTFLAG ${nftflag:-0} \\\n\t\t\t-NO_LOGIC_LOG ${NO_LOGIC_LOG:-0}\n\t\tuci -q add_list dhcp.@dnsmasq[0].addnmount=${GLOBAL_DNSMASQ_CONF_PATH}\n\t\tuci -q commit dhcp\n\t\tlua $APP_PATH/helper_dnsmasq.lua logic_restart -LOG 1\n\telse\n\t\t#Run a copy dnsmasq instance, DNS hijack for that need proxy devices.\n\t\tGLOBAL_DNSMASQ_PORT=$(get_new_port 11400)\n\t\tGLOBAL_DNSMASQ_CONF=${GLOBAL_ACL_PATH}/dnsmasq.conf\n\t\tGLOBAL_DNSMASQ_CONF_PATH=${GLOBAL_ACL_PATH}/dnsmasq.d\n\t\tlua $APP_PATH/helper_dnsmasq.lua add_rule -FLAG \"default\" -TMP_DNSMASQ_PATH ${GLOBAL_DNSMASQ_CONF_PATH} -DNSMASQ_CONF_FILE ${GLOBAL_DNSMASQ_CONF} \\\n\t\t\t-LISTEN_PORT ${GLOBAL_DNSMASQ_PORT} -DEFAULT_DNS ${DEFAULT_DNS} -LOCAL_DNS ${LOCAL_DNS} -TUN_DNS ${DNSMASQ_TUN_DNS} \\\n\t\t\t-REMOTE_FAKEDNS ${REMOTE_FAKEDNS:-0} -USE_DEFAULT_DNS \"${USE_DEFAULT_DNS:-direct}\" -CHINADNS_DNS ${china_ng_listen:-0} \\\n\t\t\t-USE_DIRECT_LIST \"${USE_DIRECT_LIST}\" -USE_PROXY_LIST \"${USE_PROXY_LIST}\" -USE_BLOCK_LIST \"${USE_BLOCK_LIST}\" -USE_GFW_LIST \"${USE_GFW_LIST}\" -CHN_LIST \"${CHN_LIST}\" \\\n\t\t\t-TCP_NODE ${TCP_NODE} -DEFAULT_PROXY_MODE ${TCP_PROXY_MODE} -NO_PROXY_IPV6 ${DNSMASQ_FILTER_PROXY_IPV6:-0} -NFTFLAG ${nftflag:-0} \\\n\t\t\t-NO_LOGIC_LOG ${NO_LOGIC_LOG:-0}\n\t\tln_run \"$(first_type dnsmasq)\" \"dnsmasq_default\" \"/dev/null\" -C ${GLOBAL_DNSMASQ_CONF} -x ${GLOBAL_ACL_PATH}/dnsmasq.pid\n\t\tset_cache_var \"ACL_default_dns_port\" \"${GLOBAL_DNSMASQ_PORT}\"\n\t\tDNS_REDIRECT_PORT=${GLOBAL_DNSMASQ_PORT}\n\t\t#dhcp.leases to hosts\n\t\t$APP_PATH/lease2hosts.sh > /dev/null 2>&1 &\n\tfi\n}\n\nstart_haproxy() {\n\t[ \"$(config_t_get global_haproxy balancing_enable 0)\" != \"1\" ] && return\n\tlocal haproxy_ver=$($(first_type haproxy) -v 2>/dev/null | awk 'NR==1 {print $3}' | cut -d'-' -f1)\n\tif [ \"$(check_ver \"$haproxy_ver\" \"3.0.0\")\" = \"1\" ]; then\n\t\techolog \"* 注意：haproxy($haproxy_ver) 程序版本低，HAPROXY 负载均衡启动失败，请更新到 3.0 以上版本。\"\n\t\treturn\n\tfi\n\tlocal haproxy_path=$TMP_PATH/haproxy\n\tlocal haproxy_conf=\"config.cfg\"\n\tlua $APP_PATH/haproxy.lua -path ${haproxy_path} -conf ${haproxy_conf} -dns ${LOCAL_DNS}\n\tln_run \"$(first_type haproxy)\" haproxy \"/dev/null\" -f \"${haproxy_path}/${haproxy_conf}\"\n}\n\nacl_app() {\n\tlocal items=$(uci show ${CONFIG} | grep \"=acl_rule\" | cut -d '.' -sf 2 | cut -d '=' -sf 1)\n\t[ -n \"$items\" ] && {\n\t\tlocal item\n\t\tlocal socks_port redir_port dns_port dnsmasq_port chinadns_port\n\t\tlocal msg msg2\n\t\tsocks_port=11100\n\t\tredir_port=11200\n\t\tdns_port=11300\n\t\tdnsmasq_port=${GLOBAL_DNSMASQ_PORT:-11400}\n\t\tchinadns_port=11500\n\t\tfor item in $items; do\n\t\t\tlocal sid=$(uci -q show \"${CONFIG}.${item}\" | grep \"=acl_rule\" | awk -F '=' '{print $1}' | awk -F '.' '{print $2}')\n\t\t\t[ \"$(config_n_get $sid enabled)\" = \"1\" ] || continue\n\t\t\teval $(uci -q show \"${CONFIG}.${item}\" | cut -d'.' -sf 3-)\n\n\t\t\tif [ -n \"${sources}\" ]; then\n\t\t\t\tfor s in $sources; do\n\t\t\t\t\tlocal s2\n\t\t\t\t\tis_iprange=$(lua_api \"iprange(\\\"${s}\\\")\")\n\t\t\t\t\tif [ \"${is_iprange}\" = \"true\" ]; then\n\t\t\t\t\t\ts2=\"iprange:${s}\"\n\t\t\t\t\telif [ -n \"$(echo ${s} | grep '^ipset:')\" ]; then\n\t\t\t\t\t\ts2=\"ipset:${s}\"\n\t\t\t\t\telse\n\t\t\t\t\t\t_ip_or_mac=$(lua_api \"ip_or_mac(\\\"${s}\\\")\")\n\t\t\t\t\t\tif [ \"${_ip_or_mac}\" = \"ip\" ]; then\n\t\t\t\t\t\t\ts2=\"ip:${s}\"\n\t\t\t\t\t\telif [ \"${_ip_or_mac}\" = \"mac\" ]; then\n\t\t\t\t\t\t\ts2=\"mac:${s}\"\n\t\t\t\t\t\tfi\n\t\t\t\t\tfi\n\t\t\t\t\t[ -n \"${s2}\" ] && source_list=\"${source_list}\\n${s2}\"\n\t\t\t\t\tunset s2\n\t\t\t\tdone\n\t\t\telse\n\t\t\t\tsource_list=\"any\"\n\t\t\tfi\n\n\t\t\tlocal acl_path=${TMP_ACL_PATH}/$sid\n\t\t\tmkdir -p ${acl_path}\n\t\t\t[ -n \"${source_list}\" ] && echo -e \"${source_list}\" | sed '/^$/d' > ${acl_path}/source_list\n\n\t\t\tuse_global_config=${use_global_config:-0}\n\t\t\t[ \"${use_global_config}\" = \"1\" ] && {\n\t\t\t\ttcp_node=\"default\"\n\t\t\t\tudp_node=\"default\"\n\t\t\t}\n\t\t\ttcp_no_redir_ports=${tcp_no_redir_ports:-${TCP_NO_REDIR_PORTS}}\n\t\t\tudp_no_redir_ports=${udp_no_redir_ports:-${UDP_NO_REDIR_PORTS}}\n\t\t\tif has_1_65535 \"$tcp_no_redir_ports\" && has_1_65535 \"$udp_no_redir_ports\"; then\n\t\t\t\tunset use_global_config\n\t\t\t\tunset tcp_node\n\t\t\t\tunset udp_node\n\t\t\telse\n\t\t\t\tuse_direct_list=${use_direct_list:-1}\n\t\t\t\tuse_proxy_list=${use_proxy_list:-1}\n\t\t\t\tuse_block_list=${use_block_list:-1}\n\t\t\t\tuse_gfw_list=${use_gfw_list:-1}\n\t\t\t\tchn_list=${chn_list:-direct}\n\t\t\t\ttcp_proxy_mode=${tcp_proxy_mode:-proxy}\n\t\t\t\tudp_proxy_mode=${udp_proxy_mode:-proxy}\n\t\t\t\tfilter_proxy_ipv6=${filter_proxy_ipv6:-0}\n\t\t\t\tdnsmasq_filter_proxy_ipv6=${filter_proxy_ipv6}\n\t\t\t\tdns_shunt=${dns_shunt:-dnsmasq}\n\t\t\t\tdns_mode=${dns_mode:-dns2socks}\n\t\t\t\tremote_dns=${remote_dns:-1.1.1.1}\n\t\t\t\tuse_default_dns=${use_default_dns:-direct}\n\t\t\tfi\n\n\t\t\t[ -n \"$tcp_node\" ] && {\n\t\t\t\tlocal GLOBAL_TCP_NODE=$(get_cache_var \"ACL_GLOBAL_TCP_node\")\n\t\t\t\t[ -n \"${GLOBAL_TCP_NODE}\" ] && GLOBAL_TCP_redir_port=$(get_cache_var \"ACL_GLOBAL_TCP_redir_port\")\n\t\t\t\tif [ \"$tcp_node\" = \"default\" ]; then\n\t\t\t\t\tif [ -n \"${GLOBAL_TCP_NODE}\" ]; then\n\t\t\t\t\t\tset_cache_var \"ACL_${sid}_tcp_node\" \"${GLOBAL_TCP_NODE}\"\n\t\t\t\t\t\tset_cache_var \"ACL_${sid}_tcp_redir_port\" \"${GLOBAL_TCP_redir_port}\"\n\t\t\t\t\t\tset_cache_var \"ACL_${sid}_dns_port\" \"${GLOBAL_DNSMASQ_PORT}\"\n\t\t\t\t\t\tset_cache_var \"ACL_${sid}_tcp_default\" \"1\"\n\t\t\t\t\t\t[ \"$GLOBAL_SHUNT_NODE_FAKEDNS\" = \"1\" ] && use_fakedns=1\n\t\t\t\t\telse\n\t\t\t\t\t\techolog \"  - 全局节点未启用，跳过【${remarks}】\"\n\t\t\t\t\tfi\n\t\t\t\telse\n\t\t\t\t\t[ \"$(config_get_type $tcp_node)\" = \"nodes\" ] || [ \"$(config_get_type ${tcp_node#Socks_})\" = \"socks\" ] && {\n\t\t\t\t\t\tif [ -n \"${GLOBAL_TCP_NODE}\" ] && [ \"$tcp_node\" = \"${GLOBAL_TCP_NODE}\" ]; then\n\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_tcp_node\" \"${GLOBAL_TCP_NODE}\"\n\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_tcp_redir_port\" \"${GLOBAL_TCP_redir_port}\"\n\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_dns_port\" \"${GLOBAL_DNSMASQ_PORT}\"\n\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_tcp_default\" \"1\"\n\t\t\t\t\t\t\t[ \"$GLOBAL_SHUNT_NODE_FAKEDNS\" = \"1\" ] && use_fakedns=1\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tlocal type protocol\n\t\t\t\t\t\t\tif [ \"$(config_get_type ${tcp_node#Socks_})\" = \"socks\" ]; then\n\t\t\t\t\t\t\t\tif [ \"${dns_mode}\" = \"xray\" ]; then\n\t\t\t\t\t\t\t\t\ttype=\"xray\"\n\t\t\t\t\t\t\t\telif [ \"${dns_mode}\" = \"sing-box\" ]; then\n\t\t\t\t\t\t\t\t\ttype=\"sing-box\"\n\t\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\ttype=$(echo $(config_n_get $tcp_node type) | tr 'A-Z' 'a-z')\n\t\t\t\t\t\t\t\tprotocol=$(config_n_get $tcp_node protocol)\n\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\t#兼容旧模式，择机移除\n\t\t\t\t\t\t\t[ \"$v2ray_dns_mode\" = \"tcp+doh\" ] && v2ray_dns_mode=\"tcp\"\n\t\t\t\t\t\t\t([ \"$type\" = \"sing-box\" ] || [ \"$type\" = \"xray\" ]) && [ \"$protocol\" = \"_shunt\" ] && [ \"$type\" != \"$dns_mode\" ] && {\n\t\t\t\t\t\t\t\tdns_mode=$type\n\t\t\t\t\t\t\t\t[ \"$type\" = \"xray\" ] && [ \"$v2ray_dns_mode\" = \"http3\" ] && v2ray_dns_mode=\"tcp\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tdns_cache_key=\"${dns_mode}_${remote_dns}_${v2ray_dns_mode:-none}_${remote_dns_client_ip:-0}_${remote_fakedns:-0}\"\n\t\t\t\t\t\t\t([ \"$v2ray_dns_mode\" = \"doh\" ] || [ \"$v2ray_dns_mode\" = \"http3\" ]) && {\n\t\t\t\t\t\t\t\tdns_cache_key=\"${dns_mode}_${remote_dns_doh:-https://1.1.1.1/dns-query}_${v2ray_dns_mode:-doh}_${remote_dns_client_ip:-0}_${remote_fakedns:-0}\"\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif [ \"$remote_fakedns\" = \"1\" ] || ([ \"$protocol\" = \"_shunt\" ] && [ \"$(config_n_get $tcp_node fakedns)\" = \"1\" ]); then\n\t\t\t\t\t\t\t\tuse_fakedns=1\n\t\t\t\t\t\t\tfi\n\n\t\t\t\t\t\t\trun_dns() {\n\t\t\t\t\t\t\t\tlocal _dns_port\n\t\t\t\t\t\t\t\t[ -n $1 ] && _dns_port=$1\n\t\t\t\t\t\t\t\t[ -z ${_dns_port} ] && {\n\t\t\t\t\t\t\t\t\tdns_port=$(get_new_port $(expr $dns_port + 1))\n\t\t\t\t\t\t\t\t\t_dns_port=$dns_port\n\t\t\t\t\t\t\t\t\tif [ \"$dns_mode\" = \"dns2socks\" ]; then\n\t\t\t\t\t\t\t\t\t\trun_dns2socks flag=acl_${sid} socks_address=127.0.0.1 socks_port=$socks_port listen_address=0.0.0.0 listen_port=${_dns_port} dns=$remote_dns cache=1\n\t\t\t\t\t\t\t\t\telif [ \"$dns_mode\" = \"sing-box\" -o \"$dns_mode\" = \"xray\" ]; then\n\t\t\t\t\t\t\t\t\t\tconfig_file=$TMP_ACL_PATH/${tcp_node}_SOCKS_${socks_port}_DNS.json\n\t\t\t\t\t\t\t\t\t\tremote_dns_doh=${remote_dns_doh:-https://1.1.1.1/dns-query}\n\t\t\t\t\t\t\t\t\t\tlocal type=${dns_mode}\n\t\t\t\t\t\t\t\t\t\t[ \"${dns_mode}\" = \"sing-box\" ] && type=\"singbox\"\n\t\t\t\t\t\t\t\t\t\tdnsmasq_filter_proxy_ipv6=0\n\t\t\t\t\t\t\t\t\t\tremote_dns_query_strategy=\"UseIP\"\n\t\t\t\t\t\t\t\t\t\t[ \"$filter_proxy_ipv6\" = \"1\" ] && remote_dns_query_strategy=\"UseIPv4\"\n\t\t\t\t\t\t\t\t\t\trun_${type} flag=acl_${sid} type=$dns_mode dns_socks_address=127.0.0.1 dns_socks_port=$socks_port dns_listen_port=${_dns_port} remote_dns_protocol=${v2ray_dns_mode} remote_dns_udp_server=${remote_dns} remote_dns_tcp_server=${remote_dns} remote_dns_doh=\"${remote_dns_doh}\" remote_dns_query_strategy=${remote_dns_query_strategy} remote_dns_client_ip=${remote_dns_client_ip} config_file=$config_file\n\t\t\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\t\t\tset_cache_var \"node_${tcp_node}_$(echo -n \"${dns_cache_key}\" | md5sum | cut -d \" \" -f1)\" \"${_dns_port}\"\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\t[ \"$dns_shunt\" = \"chinadns-ng\" ] && [ -n \"$(first_type chinadns-ng)\" ] && {\n\t\t\t\t\t\t\t\t\tchinadns_ng_min=2024.04.13\n\t\t\t\t\t\t\t\t\tchinadns_ng_now=$($(first_type chinadns-ng) -V | grep -i \"ChinaDNS-NG \" | awk '{print $2}')\n\t\t\t\t\t\t\t\t\tif [ $(check_ver \"$chinadns_ng_now\" \"$chinadns_ng_min\") = 1 ]; then\n\t\t\t\t\t\t\t\t\t\techolog \"  * 注意：当前 ChinaDNS-NG 版本为[ $chinadns_ng_now ]，请更新到[ $chinadns_ng_min ]或以上版本，否则 DNS 有可能无法正常工作！\"\n\t\t\t\t\t\t\t\t\tfi\n\n\t\t\t\t\t\t\t\t\t[ \"$filter_proxy_ipv6\" = \"1\" ] && dnsmasq_filter_proxy_ipv6=0\n\t\t\t\t\t\t\t\t\tchinadns_port=$(expr $chinadns_port + 1)\n\t\t\t\t\t\t\t\t\t_china_ng_listen=\"127.0.0.1#${chinadns_port},::1#${chinadns_port}\"\n\n\t\t\t\t\t\t\t\t\t_chinadns_local_dns=$(IFS=','; set -- $LOCAL_DNS; [ \"${1%%[#:]*}\" = \"127.0.0.1\" ] && echo \"$1\" || ([ -n \"$2\" ] && echo \"$1,$2\" || echo \"$1\"))\n\t\t\t\t\t\t\t\t\t_direct_dns_mode=$(config_t_get global direct_dns_mode \"auto\")\n\t\t\t\t\t\t\t\t\tcase \"${_direct_dns_mode}\" in\n\t\t\t\t\t\t\t\t\t\tudp)\n\t\t\t\t\t\t\t\t\t\t\t_chinadns_local_dns=$(config_t_get global direct_dns 223.5.5.5 | sed -E 's/^\\[([^]]+)\\]:(.*)$/\\1#\\2/; t; s/^([^:]+):([0-9]+)$/\\1#\\2/')\n\t\t\t\t\t\t\t\t\t\t;;\n\t\t\t\t\t\t\t\t\t\ttcp)\n\t\t\t\t\t\t\t\t\t\t\t_chinadns_local_dns=\"tcp://$(config_t_get global direct_dns 223.5.5.5 | sed -E 's/^\\[([^]]+)\\]:(.*)$/\\1#\\2/; t; s/^([^:]+):([0-9]+)$/\\1#\\2/')\"\n\t\t\t\t\t\t\t\t\t\t;;\n\t\t\t\t\t\t\t\t\tesac\n\n\t\t\t\t\t\t\t\t\trun_chinadns_ng \\\n\t\t\t\t\t\t\t\t\t\t_flag=\"$sid\" \\\n\t\t\t\t\t\t\t\t\t\t_listen_port=${chinadns_port} \\\n\t\t\t\t\t\t\t\t\t\t_dns_local=${_chinadns_local_dns} \\\n\t\t\t\t\t\t\t\t\t\t_dns_trust=127.0.0.1#${_dns_port} \\\n\t\t\t\t\t\t\t\t\t\t_no_ipv6_trust=${filter_proxy_ipv6} \\\n\t\t\t\t\t\t\t\t\t\t_use_direct_list=${use_direct_list} \\\n\t\t\t\t\t\t\t\t\t\t_use_proxy_list=${use_proxy_list} \\\n\t\t\t\t\t\t\t\t\t\t_use_block_list=${use_block_list} \\\n\t\t\t\t\t\t\t\t\t\t_gfwlist=${use_gfw_list} \\\n\t\t\t\t\t\t\t\t\t\t_chnlist=${chn_list} \\\n\t\t\t\t\t\t\t\t\t\t_default_mode=${tcp_proxy_mode} \\\n\t\t\t\t\t\t\t\t\t\t_default_tag=${chinadns_ng_default_tag:-smart} \\\n\t\t\t\t\t\t\t\t\t\t_no_logic_log=1 \\\n\t\t\t\t\t\t\t\t\t\t_tcp_node=${tcp_node} \\\n\t\t\t\t\t\t\t\t\t\t_remote_fakedns=${remote_fakedns:-0} \\\n\t\t\t\t\t\t\t\t\t\t_filter_https=${force_https_soa:-0}\n\n\t\t\t\t\t\t\t\t\tuse_default_dns=\"chinadns_ng\"\n\t\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\t\tdnsmasq_port=$(get_new_port $(expr $dnsmasq_port + 1))\n\t\t\t\t\t\t\t\tlocal dnsmasq_conf=${acl_path}/dnsmasq.conf\n\t\t\t\t\t\t\t\tlocal dnsmasq_conf_path=${acl_path}/dnsmasq.d\n\t\t\t\t\t\t\t\tlua $APP_PATH/helper_dnsmasq.lua add_rule -FLAG ${sid} -TMP_DNSMASQ_PATH ${dnsmasq_conf_path} -DNSMASQ_CONF_FILE ${dnsmasq_conf} \\\n\t\t\t\t\t\t\t\t\t-LISTEN_PORT ${dnsmasq_port} -DEFAULT_DNS ${DEFAULT_DNS} -LOCAL_DNS $LOCAL_DNS \\\n\t\t\t\t\t\t\t\t\t-USE_DIRECT_LIST \"${use_direct_list}\" -USE_PROXY_LIST \"${use_proxy_list}\" -USE_BLOCK_LIST \"${use_block_list}\" -USE_GFW_LIST \"${use_gfw_list}\" -CHN_LIST \"${chn_list}\" \\\n\t\t\t\t\t\t\t\t\t-TUN_DNS \"127.0.0.1#${_dns_port}\" -REMOTE_FAKEDNS ${remote_fakedns:-0} -USE_DEFAULT_DNS \"${use_default_dns:-direct}\" -CHINADNS_DNS ${_china_ng_listen:-0} \\\n\t\t\t\t\t\t\t\t\t-TCP_NODE $tcp_node -DEFAULT_PROXY_MODE ${tcp_proxy_mode} -NO_PROXY_IPV6 ${dnsmasq_filter_proxy_ipv6:-0} -NFTFLAG ${nftflag:-0} \\\n\t\t\t\t\t\t\t\t\t-NO_LOGIC_LOG 1\n\t\t\t\t\t\t\t\tln_run \"$(first_type dnsmasq)\" \"dnsmasq_${sid}\" \"/dev/null\" -C ${dnsmasq_conf} -x ${acl_path}/dnsmasq.pid\n\t\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_dns_port\" \"${dnsmasq_port}\"\n\t\t\t\t\t\t\t\tset_cache_var \"node_${tcp_node}_$(echo -n \"${tcp_proxy_mode}_${dns_cache_key}\" | md5sum | cut -d \" \" -f1)\" \"${dnsmasq_port}\"\n\t\t\t\t\t\t\t\t#dhcp.leases to hosts\n\t\t\t\t\t\t\t\t$APP_PATH/lease2hosts.sh > /dev/null 2>&1 &\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t_redir_port=$(get_cache_var \"node_${tcp_node}_redir_port\")\n\t\t\t\t\t\t\t_socks_port=$(get_cache_var \"node_${tcp_node}_socks_port\")\n\t\t\t\t\t\t\tif [ -n \"${_socks_port}\" ] && [ -n \"${_redir_port}\" ]; then\n\t\t\t\t\t\t\t\tsocks_port=${_socks_port}\n\t\t\t\t\t\t\t\ttcp_port=${_redir_port}\n\t\t\t\t\t\t\t\t_dnsmasq_port=$(get_cache_var \"node_${tcp_node}_$(echo -n \"${tcp_proxy_mode}_${dns_cache_key}\" | md5sum | cut -d \" \" -f1)\")\n\t\t\t\t\t\t\t\tif [ -z \"${_dnsmasq_port}\" ]; then\n\t\t\t\t\t\t\t\t\t_dns_port=$(get_cache_var \"node_${tcp_node}_$(echo -n \"${dns_cache_key}\" | md5sum | cut -d \" \" -f1)\")\n\t\t\t\t\t\t\t\t\trun_dns ${_dns_port}\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t[ -n \"${_dnsmasq_port}\" ] && set_cache_var \"ACL_${sid}_dns_port\" \"${_dnsmasq_port}\"\n\t\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tsocks_port=$(get_new_port $(expr $socks_port + 1))\n\t\t\t\t\t\t\t\tset_cache_var \"node_${tcp_node}_socks_port\" \"${socks_port}\"\n\t\t\t\t\t\t\t\tredir_port=$(get_new_port $(expr $redir_port + 1))\n\t\t\t\t\t\t\t\tset_cache_var \"node_${tcp_node}_redir_port\" \"${redir_port}\"\n\t\t\t\t\t\t\t\ttcp_port=$redir_port\n\n\t\t\t\t\t\t\t\tif [ \"${type}\" = \"sing-box\" ] || [ \"${type}\" = \"xray\" ]; then\n\t\t\t\t\t\t\t\t\tconfig_file=\"acl/${tcp_node}_TCP_${redir_port}.json\"\n\t\t\t\t\t\t\t\t\t_extra_param=\"socks_address=127.0.0.1 socks_port=$socks_port\"\n\t\t\t\t\t\t\t\t\t[ \"${type}\" = \"${dns_mode}\" ] && {\n\t\t\t\t\t\t\t\t\t\tdns_port=$(get_new_port $(expr $dns_port + 1))\n\t\t\t\t\t\t\t\t\t\t_dns_port=$dns_port\n\t\t\t\t\t\t\t\t\t\tconfig_file=\"${config_file//TCP_/DNS_${_dns_port}_TCP_}\"\n\t\t\t\t\t\t\t\t\t\tdnsmasq_filter_proxy_ipv6=0\n\t\t\t\t\t\t\t\t\t\tremote_dns_query_strategy=\"UseIP\"\n\t\t\t\t\t\t\t\t\t\t[ \"$filter_proxy_ipv6\" = \"1\" ] && remote_dns_query_strategy=\"UseIPv4\"\n\t\t\t\t\t\t\t\t\t\tremote_dns_doh=${remote_dns_doh:-https://1.1.1.1/dns-query}\n\t\t\t\t\t\t\t\t\t\t_extra_param=\"${_extra_param} dns_listen_port=${_dns_port} remote_dns_protocol=${v2ray_dns_mode} remote_dns_udp_server=${remote_dns} remote_dns_tcp_server=${remote_dns}\"\n\t\t\t\t\t\t\t\t\t\t_extra_param=\"${_extra_param} remote_dns_doh=${remote_dns_doh} remote_dns_query_strategy=${remote_dns_query_strategy} remote_fakedns=${remote_fakedns:-0} remote_dns_client_ip=${remote_dns_client_ip}\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t_extra_param=\"${_extra_param} tcp_proxy_way=$TCP_PROXY_WAY\"\n\t\t\t\t\t\t\t\t\t[ -n \"$udp_node\" ] && ([ \"$udp_node\" = \"tcp\" ] || [ \"$udp_node\" = \"$tcp_node\" ]) && {\n\t\t\t\t\t\t\t\t\t\tconfig_file=\"${config_file//TCP_/TCP_UDP_}\"\n\t\t\t\t\t\t\t\t\t\t_extra_param=\"${_extra_param} udp_redir_port=$redir_port\"\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\tconfig_file=\"$TMP_PATH/$config_file\"\n\t\t\t\t\t\t\t\t\t[ \"${type}\" = \"sing-box\" ] && type=\"singbox\"\n\t\t\t\t\t\t\t\t\trun_${type} flag=$tcp_node node=$tcp_node tcp_redir_port=$redir_port ${_extra_param} config_file=$config_file\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tconfig_file=\"acl/${tcp_node}_SOCKS_${socks_port}.json\"\n\t\t\t\t\t\t\t\t\trun_socks flag=$tcp_node node=$tcp_node bind=127.0.0.1 socks_port=$socks_port config_file=$config_file\n\t\t\t\t\t\t\t\t\tlocal log_file=$TMP_ACL_PATH/ipt2socks_${tcp_node}_${redir_port}.log\n\t\t\t\t\t\t\t\t\tlog_file=\"/dev/null\"\n\t\t\t\t\t\t\t\t\trun_ipt2socks flag=acl_${tcp_node} tcp_tproxy=${is_tproxy} local_port=$redir_port socks_address=127.0.0.1 socks_port=$socks_port log_file=$log_file\n\t\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\t\trun_dns ${_dns_port}\n\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_tcp_node\" \"${tcp_node}\"\n\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_tcp_redir_port\" \"${tcp_port}\"\n\t\t\t\t\t\tfi\n\t\t\t\t\t}\n\t\t\t\tfi\n\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && set_cache_var \"ACL_${sid}_fakedns\" \"1\"\n\t\t\t}\n\t\t\t[ -n \"$udp_node\" ] && {\n\t\t\t\t[ -n \"$tcp_node\" ] && {\n\t\t\t\t\tlocal protocol=$(config_n_get $tcp_node protocol)\n\t\t\t\t\t[ \"$protocol\" = \"_shunt\" ] && [ \"$udp_node\" != \"default\" ] && {\n\t\t\t\t\t\tudp_node=\"tcp\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif [ \"$udp_node\" = \"default\" ]; then\n\t\t\t\t\tlocal GLOBAL_UDP_NODE=$(get_cache_var \"ACL_GLOBAL_UDP_node\")\n\t\t\t\t\t[ -n \"${GLOBAL_UDP_NODE}\" ] && GLOBAL_UDP_redir_port=$(get_cache_var \"ACL_GLOBAL_UDP_redir_port\")\n\t\t\t\t\tif [ -n \"${GLOBAL_UDP_NODE}\" ]; then\n\t\t\t\t\t\tset_cache_var \"ACL_${sid}_udp_node\" \"${GLOBAL_UDP_NODE}\"\n\t\t\t\t\t\tset_cache_var \"ACL_${sid}_udp_redir_port\" \"${GLOBAL_UDP_redir_port}\"\n\t\t\t\t\t\tset_cache_var \"ACL_${sid}_udp_default\" \"1\"\n\t\t\t\t\telse\n\t\t\t\t\t\techolog \"  - 全局节点未启用，跳过【${remarks}】\"\n\t\t\t\t\tfi\n\t\t\t\telif [ \"$udp_node\" = \"tcp\" ] || [ \"$udp_node\" = \"$tcp_node\" ]; then\n\t\t\t\t\tudp_node=$(get_cache_var \"ACL_${sid}_tcp_node\")\n\t\t\t\t\tudp_port=$(get_cache_var \"ACL_${sid}_tcp_redir_port\")\n\t\t\t\t\tset_cache_var \"ACL_${sid}_udp_node\" \"${udp_node}\"\n\t\t\t\t\tset_cache_var \"ACL_${sid}_udp_redir_port\" \"${udp_port}\"\n\t\t\t\telse\n\t\t\t\t\t[ \"$(config_get_type $udp_node)\" = \"nodes\" ] || [ \"$(config_get_type ${udp_node#Socks_})\" = \"socks\" ] && {\n\t\t\t\t\t\tif [ -n \"${GLOBAL_UDP_NODE}\" ] && [ \"$udp_node\" = \"${GLOBAL_UDP_NODE}\" ]; then\n\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_udp_node\" \"${GLOBAL_UDP_NODE}\"\n\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_udp_redir_port\" \"${GLOBAL_UDP_redir_port}\"\n\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_udp_default\" \"1\"\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\t_redir_port=$(get_cache_var \"node_${udp_node}_redir_port\")\n\t\t\t\t\t\t\t_socks_port=$(get_cache_var \"node_${udp_node}_socks_port\")\n\t\t\t\t\t\t\tif [ -n \"${_socks_port}\" ] && [ -n \"${_redir_port}\" ]; then\n\t\t\t\t\t\t\t\tsocks_port=${_socks_port}\n\t\t\t\t\t\t\t\tudp_port=${_redir_port}\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tsocks_port=$(get_new_port $(expr $socks_port + 1))\n\t\t\t\t\t\t\t\tset_cache_var \"node_${udp_node}_socks_port\" \"${socks_port}\"\n\t\t\t\t\t\t\t\tredir_port=$(get_new_port $(expr $redir_port + 1))\n\t\t\t\t\t\t\t\tset_cache_var \"node_${udp_node}_redir_port\" \"${redir_port}\"\n\t\t\t\t\t\t\t\tudp_port=$redir_port\n\n\t\t\t\t\t\t\t\tlocal type\n\t\t\t\t\t\t\t\tif [ \"$(config_get_type ${udp_node#Socks_})\" = \"socks\" ]; then\n\t\t\t\t\t\t\t\t\tif [ \"${dns_mode}\" = \"xray\" ]; then\n\t\t\t\t\t\t\t\t\t\ttype=\"xray\"\n\t\t\t\t\t\t\t\t\telif [ \"${dns_mode}\" = \"sing-box\" ]; then\n\t\t\t\t\t\t\t\t\t\ttype=\"sing-box\"\n\t\t\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\ttype=$(echo $(config_n_get $udp_node type) | tr 'A-Z' 'a-z')\n\t\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\t\tif [ -n \"${type}\" ] && ([ \"${type}\" = \"sing-box\" ] || [ \"${type}\" = \"xray\" ]); then\n\t\t\t\t\t\t\t\t\tconfig_file=\"acl/${udp_node}_UDP_${redir_port}.json\"\n\t\t\t\t\t\t\t\t\tconfig_file=\"$TMP_PATH/$config_file\"\n\t\t\t\t\t\t\t\t\t[ \"${type}\" = \"sing-box\" ] && type=\"singbox\"\n\t\t\t\t\t\t\t\t\trun_${type} flag=$udp_node node=$udp_node udp_redir_port=$redir_port config_file=$config_file\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tconfig_file=\"acl/${udp_node}_SOCKS_${socks_port}.json\"\n\t\t\t\t\t\t\t\t\trun_socks flag=$udp_node node=$udp_node bind=127.0.0.1 socks_port=$socks_port config_file=$config_file\n\t\t\t\t\t\t\t\t\tlocal log_file=$TMP_ACL_PATH/ipt2socks_${udp_node}_${redir_port}.log\n\t\t\t\t\t\t\t\t\tlog_file=\"/dev/null\"\n\t\t\t\t\t\t\t\t\trun_ipt2socks flag=acl_${udp_node} local_port=$redir_port socks_address=127.0.0.1 socks_port=$socks_port log_file=$log_file\n\t\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_udp_node\" \"${udp_node}\"\n\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_udp_redir_port\" \"${udp_port}\"\n\t\t\t\t\t\tfi\n\t\t\t\t\t}\n\t\t\t\tfi\n\t\t\t}\n\t\t\tunset enabled sid remarks sources interface tcp_no_redir_ports udp_no_redir_ports use_global_config tcp_node udp_node use_direct_list use_proxy_list use_block_list use_gfw_list chn_list tcp_proxy_mode udp_proxy_mode filter_proxy_ipv6 dns_mode remote_dns v2ray_dns_mode remote_dns_doh remote_dns_client_ip\n\t\t\tunset _ip _mac _iprange _ipset _ip_or_mac source_list tcp_port udp_port config_file _extra_param dns_cache_key\n\t\t\tunset _china_ng_listen _chinadns_local_dns _direct_dns_mode chinadns_ng_default_tag dnsmasq_filter_proxy_ipv6 remote_fakedns force_https_soa use_fakedns\n\t\tdone\n\t\tunset socks_port redir_port dns_port dnsmasq_port chinadns_port\n\t}\n}\n\nstart() {\n\tmkdir -p /tmp/etc /tmp/log $TMP_PATH $TMP_BIN_PATH $TMP_SCRIPT_FUNC_PATH $TMP_ROUTE_PATH $TMP_ACL_PATH $TMP_PATH2\n\tget_config\n\texport V2RAY_LOCATION_ASSET=$(config_t_get global_rules v2ray_location_asset \"/usr/share/v2ray/\")\n\texport XRAY_LOCATION_ASSET=$V2RAY_LOCATION_ASSET\n\texport ENABLE_DEPRECATED_GEOSITE=true\n\texport ENABLE_DEPRECATED_GEOIP=true\n\texport SS_SYSTEM_DNS_RESOLVER_FORCE_BUILTIN=1\n\tulimit -n 65535\n\tstart_haproxy\n\tstart_socks\n\tnftflag=0\n\tUSE_TABLES=\"\"\n\tcheck_run_environment\n\tif [ \"$ENABLED_DEFAULT_ACL\" == 1 ] || [ \"$ENABLED_ACLS\" == 1 ]; then\n\t\t[ \"$(uci -q get dhcp.@dnsmasq[0].dns_redirect)\" == \"1\" ] && {\n\t\t\tuci -q set ${CONFIG}.@global[0].dnsmasq_dns_redirect='1'\n\t\t\tuci -q commit ${CONFIG}\n\t\t\tuci -q set dhcp.@dnsmasq[0].dns_redirect='0'\n\t\t\tuci -q commit dhcp\n\t\t\tlua $APP_PATH/helper_dnsmasq.lua restart -LOG 0\n\t\t}\n\tfi\n\t[ \"$ENABLED_DEFAULT_ACL\" == 1 ] && {\n\t\tmkdir -p ${GLOBAL_ACL_PATH}\n\t\tstart_redir TCP\n\t\tstart_redir UDP\n\t\tstart_dns\n\t}\n\t[ -n \"$USE_TABLES\" ] && source $APP_PATH/${USE_TABLES}.sh start\n\tset_cache_var \"USE_TABLES\" \"$USE_TABLES\"\n\tif [ \"$ENABLED_DEFAULT_ACL\" == 1 ] || [ \"$ENABLED_ACLS\" == 1 ]; then\n\t\tbridge_nf_ipt=$(sysctl -e -n net.bridge.bridge-nf-call-iptables)\n\t\tset_cache_var \"bak_bridge_nf_ipt\" \"$bridge_nf_ipt\"\n\t\tsysctl -w net.bridge.bridge-nf-call-iptables=0 >/dev/null 2>&1\n\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\tbridge_nf_ip6t=$(sysctl -e -n net.bridge.bridge-nf-call-ip6tables)\n\t\t\tset_cache_var \"bak_bridge_nf_ip6t\" \"$bridge_nf_ip6t\"\n\t\t\tsysctl -w net.bridge.bridge-nf-call-ip6tables=0 >/dev/null 2>&1\n\t\t}\n\tfi\n\t\n\tstart_crontab\n\techolog \"运行完成！\\n\"\n\n\t[ \"$ENABLED\" = 1 ] && [ \"$1\" = \"boot\" ] && {\n\t\tlocal cfgids item\n\t\tfor item in $(uci show ${CONFIG} | grep \"=subscribe_list\" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do\n\t\t\tif [ \"$(config_n_get \"$item\" boot_update 0)\" = \"1\" ]; then\n\t\t\t\tlocal cfgid=$(uci show ${CONFIG}.$item | head -n 1 | cut -d '.' -sf 2 | cut -d '=' -sf 1)\n\t\t\t\tcfgids=\"${cfgids:+$cfgids,}$cfgid\"\n\t\t\tfi\n\t\tdone\n\t\t[ -n \"$cfgids\" ] && {\n\t\t\tsleep 5\n\t\t\tlua $APP_PATH/subscribe.lua start $cfgids cron > /dev/null 2>&1 &\n\t\t}\n\t}\n}\n\nstop() {\n\tclean_log\n\teval_cache_var\n\t[ -n \"$USE_TABLES\" ] && source $APP_PATH/${USE_TABLES}.sh stop\n\tdelete_ip2route\n\t# 结束 SS 插件进程\n\t# kill_all xray-plugin v2ray-plugin obfs-local shadow-tls\n\tlocal pid_file pid\n\tfind \"$TMP_PATH\" -type f -name '*_plugin.pid' 2>/dev/null | while read -r pid_file; do\n\t\tread -r pid < \"$pid_file\"\n\t\tif [ -n \"$pid\" ]; then\n\t\t\tkill -9 \"$pid\" >/dev/null 2>&1\n\t\tfi\n\tdone\n\tpgrep -f \"sleep.*(6s|9s|58s)\" | xargs kill -9 >/dev/null 2>&1\n\tpgrep -af \"${CONFIG}/\" | awk '! /app\\.sh|subscribe\\.lua|rule_update\\.lua|tasks\\.sh|server_app\\.lua|ujail/{print $1}' | xargs kill -9 >/dev/null 2>&1\n\tunset V2RAY_LOCATION_ASSET\n\tunset XRAY_LOCATION_ASSET\n\tunset SS_SYSTEM_DNS_RESOLVER_FORCE_BUILTIN\n\tstop_crontab\n\tsource $APP_PATH/helper_smartdns.sh del\n\trm -rf $GLOBAL_DNSMASQ_CONF\n\trm -rf $GLOBAL_DNSMASQ_CONF_PATH\n\t[ \"1\" = \"1\" ] && {\n\t\t#restore logic\n\t\tbak_dnsmasq_dns_redirect=$(config_t_get global dnsmasq_dns_redirect)\n\t\t[ -n \"${bak_dnsmasq_dns_redirect}\" ] && {\n\t\t\tuci -q set dhcp.@dnsmasq[0].dns_redirect=\"${bak_dnsmasq_dns_redirect}\"\n\t\t\tuci -q commit dhcp\n\t\t\tuci -q delete ${CONFIG}.@global[0].dnsmasq_dns_redirect\n\t\t\tuci -q commit ${CONFIG}\n\t\t}\n\t\tif [ -z \"${ACL_default_dns_port}\" ] || [ -n \"${bak_dnsmasq_dns_redirect}\" ]; then\n\t\t\tuci -q del_list dhcp.@dnsmasq[0].addnmount=\"${GLOBAL_DNSMASQ_CONF_PATH}\"\n\t\t\tuci -q commit dhcp\n\t\t\tlua $APP_PATH/helper_dnsmasq.lua restart -LOG 0\n\t\tfi\n\t\t[ -n \"${bak_bridge_nf_ipt}\" ] && sysctl -w net.bridge.bridge-nf-call-iptables=${bak_bridge_nf_ipt} >/dev/null 2>&1\n\t\t[ -n \"${bak_bridge_nf_ip6t}\" ] && sysctl -w net.bridge.bridge-nf-call-ip6tables=${bak_bridge_nf_ip6t} >/dev/null 2>&1\n\t}\n\trm -rf $TMP_PATH\n\trm -f ${LOCK_PATH}/${CONFIG}_socks_auto_switch*\n\trm -f ${LOCK_PATH}/${CONFIG}_lease2hosts*\n\trm -f ${LOCK_PATH}/${CONFIG}_monitor*\n\techolog \"清空并关闭相关程序和缓存完成。\"\n\texit 0\n}\n\nget_config() {\n\tENABLED_DEFAULT_ACL=0\n\tTCP_REDIR_PORT=1041\n\tUDP_REDIR_PORT=1051\n\tENABLED=$(config_t_get global enabled 0)\n\tSOCKS_ENABLED=$(config_t_get global socks_enabled 0)\n\tTCP_NODE=$(config_t_get global tcp_node)\n\tUDP_NODE=$(config_t_get global udp_node)\n\tTCP_UDP=0\n\tif [ \"$UDP_NODE\" = \"tcp\" ]; then\n\t\tUDP_NODE=$TCP_NODE\n\t\tTCP_UDP=1\n\telif [ \"$UDP_NODE\" = \"$TCP_NODE\" ]; then\n\t\tTCP_UDP=1\n\tfi\n\t[ -n \"$TCP_NODE\" ] && {\n\t\tlocal protocol=$(config_n_get $TCP_NODE protocol)\n\t\t[ \"$protocol\" = \"_shunt\" ] && [ -n \"$UDP_NODE\" ] && {\n\t\t\tUDP_NODE=$TCP_NODE\n\t\t\tTCP_UDP=1\n\t\t}\n\t}\n\t[ \"$ENABLED\" = 1 ] && {\n\t\tlocal _node\n\t\tfor _node in \"$TCP_NODE\" \"$UDP_NODE\"; do\n\t\t\t[ -n \"$_node\" ] && case \"$_node\" in\n\t\t\t\tSocks_*) [ \"$(config_get_type \"${_node#Socks_}\")\" = \"socks\" ] && ENABLED_DEFAULT_ACL=1 ;;\n\t\t\t\t*)       [ \"$(config_get_type \"$_node\")\" = \"nodes\" ] && ENABLED_DEFAULT_ACL=1 ;;\n\t\t\tesac\n\t\tdone\n\t}\n\tENABLED_ACLS=$(config_t_get global acl_enable 0)\n\t[ \"$ENABLED_ACLS\" = 1 ] && {\n\t\t[ \"$(uci show ${CONFIG} | grep \"@acl_rule\" | grep \"enabled='1'\" | wc -l)\" == 0 ] && ENABLED_ACLS=0\n\t}\n\tset_cache_var ENABLED_DEFAULT_ACL $ENABLED_DEFAULT_ACL\n\tset_cache_var ENABLED_ACLS $ENABLED_ACLS\n\n\tTCP_PROXY_WAY=$(config_t_get global_forwarding tcp_proxy_way redirect)\n\tPROXY_IPV6=$(config_t_get global_forwarding ipv6_tproxy 0)\n\tTCP_REDIR_PORTS=$(config_t_get global_forwarding tcp_redir_ports '80,443')\n\tUDP_REDIR_PORTS=$(config_t_get global_forwarding udp_redir_ports '1:65535')\n\tTCP_NO_REDIR_PORTS=$(config_t_get global_forwarding tcp_no_redir_ports 'disable')\n\tUDP_NO_REDIR_PORTS=$(config_t_get global_forwarding udp_no_redir_ports 'disable')\n\tTCP_PROXY_DROP_PORTS=$(config_t_get global_forwarding tcp_proxy_drop_ports 'disable')\n\tUDP_PROXY_DROP_PORTS=$(config_t_get global_forwarding udp_proxy_drop_ports '80,443')\n\tUSE_DIRECT_LIST=$(config_t_get global use_direct_list 1)\n\tUSE_PROXY_LIST=$(config_t_get global use_proxy_list 1)\n\tUSE_BLOCK_LIST=$(config_t_get global use_block_list 1)\n\tUSE_GFW_LIST=$(config_t_get global use_gfw_list 1)\n\tCHN_LIST=$(config_t_get global chn_list direct)\n\tTCP_PROXY_MODE=$(config_t_get global tcp_proxy_mode proxy)\n\tUDP_PROXY_MODE=$(config_t_get global udp_proxy_mode proxy)\n\t[ \"${TCP_PROXY_MODE}\" != \"disable\" ] && TCP_PROXY_MODE=\"proxy\"\n\t[ \"${UDP_PROXY_MODE}\" != \"disable\" ] && UDP_PROXY_MODE=\"proxy\"\n\tLOCALHOST_PROXY=$(config_t_get global localhost_proxy 1)\n\t[ \"${LOCALHOST_PROXY}\" == 1 ] && {\n\t\tLOCALHOST_TCP_PROXY_MODE=$TCP_PROXY_MODE\n\t\tLOCALHOST_UDP_PROXY_MODE=$UDP_PROXY_MODE\n\t}\n\tCLIENT_PROXY=$(config_t_get global client_proxy 1)\n\tDNS_SHUNT=$(config_t_get global dns_shunt dnsmasq)\n\t[ -z \"$(first_type $DNS_SHUNT)\" ] && DNS_SHUNT=\"dnsmasq\"\n\tDNS_MODE=$(config_t_get global dns_mode tcp)\n\t[ \"$DNS_SHUNT\" = \"smartdns\" ] && DNS_MODE=$(config_t_get global smartdns_dns_mode socks)\n\tREMOTE_DNS=$(config_t_get global remote_dns 1.1.1.1:53 | sed 's/#/:/g' | sed -E 's/\\:([^:]+)$/#\\1/g')\n\tUSE_DEFAULT_DNS=$(config_t_get global use_default_dns direct)\n\tFILTER_PROXY_IPV6=$(config_t_get global filter_proxy_ipv6 0)\n\tDNS_REDIRECT=$(config_t_get global dns_redirect 1)\n\n\tREDIRECT_LIST=\"socks ss ss-rust ssr sing-box xray naiveproxy hysteria2\"\n\tTPROXY_LIST=\"socks ss ss-rust ssr sing-box xray hysteria2\"\n\n\tNEXT_DNS_LISTEN_PORT=15353\n\tTUN_DNS=\"127.0.0.1#${NEXT_DNS_LISTEN_PORT}\"\n\tDNS_CACHE=0\n\tDIRECT_DNS_QUERY_STRATEGY=\"UseIP\"\n\tREMOTE_DNS_QUERY_STRATEGY=\"UseIP\"\n\t[ \"$FILTER_PROXY_IPV6\" = \"1\" ] && REMOTE_DNS_QUERY_STRATEGY=\"UseIPv4\"\n\tDNSMASQ_FILTER_PROXY_IPV6=${FILTER_PROXY_IPV6}\n\n\tIPT_APPEND_DNS=${LOCAL_DNS}\n\n\tDNSMASQ_CONF_DIR=/tmp/dnsmasq.d\n\tDEFAULT_DNSMASQ_CFGID=\"$(uci -q show \"dhcp.@dnsmasq[0]\" | awk 'NR==1 {split($0, conf, /[.=]/); print conf[2]}')\"\n\tif [ -f \"/tmp/etc/dnsmasq.conf.$DEFAULT_DNSMASQ_CFGID\" ]; then\n\t\tDNSMASQ_CONF_DIR=\"$(awk -F '=' '/^conf-dir=/ {print $2}' \"/tmp/etc/dnsmasq.conf.$DEFAULT_DNSMASQ_CFGID\")\"\n\t\tif [ -n \"$DNSMASQ_CONF_DIR\" ]; then\n\t\t\tDNSMASQ_CONF_DIR=${DNSMASQ_CONF_DIR%*/}\n\t\telse\n\t\t\tDNSMASQ_CONF_DIR=\"/tmp/dnsmasq.d\"\n\t\tfi\n\tfi\n\tset_cache_var GLOBAL_DNSMASQ_CONF ${DNSMASQ_CONF_DIR}/dnsmasq-${CONFIG}.conf\n\tset_cache_var GLOBAL_DNSMASQ_CONF_PATH ${GLOBAL_ACL_PATH}/dnsmasq.d\n\n\tSMARTDNS_LOCAL_PORT=0\n\tSMARTDNS_LISTEN_PORT=0\n\t[ \"${DNS_SHUNT}\" = \"smartdns\" ] && {\n\t\tNEXT_DNS_LISTEN_PORT=$(expr $NEXT_DNS_LISTEN_PORT + 1)\n\t\tSMARTDNS_LOCAL_PORT=${NEXT_DNS_LISTEN_PORT}\n\t\tNEXT_DNS_LISTEN_PORT=$(expr $NEXT_DNS_LISTEN_PORT + 1)\n\t\tSMARTDNS_LISTEN_PORT=${NEXT_DNS_LISTEN_PORT}\n\t\tNEXT_DNS_LISTEN_PORT=$(expr $NEXT_DNS_LISTEN_PORT + 1)\n\t\tLOCAL_DNS=\"127.0.0.1#${SMARTDNS_LOCAL_PORT}\"\n\t}\n}\n\nget_local_dns() {\n\tRESOLVFILE=/tmp/resolv.conf.d/resolv.conf.auto\n\t[ -f \"${RESOLVFILE}\" ] && [ -s \"${RESOLVFILE}\" ] || RESOLVFILE=/tmp/resolv.conf.auto\n\n\tISP_DNS=$(cat $RESOLVFILE 2>/dev/null | grep -E -o \"[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+\" | grep -v -E '^(0\\.0\\.0\\.0|127\\.0\\.0\\.1)$' | awk '!seen[$0]++')\n\tISP_DNS6=$(cat $RESOLVFILE 2>/dev/null | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | awk -F % '{print $1}' | awk -F \" \" '{print $2}' | grep -v -Fx ::1 | grep -v -Fx :: | awk '!seen[$0]++')\n\n\tDEFAULT_DNS=$(uci show dhcp.@dnsmasq[0] | grep \"\\.server=\" | awk -F '=' '{print $2}' | sed \"s/'//g\" | tr ' ' '\\n' | grep -v \"\\/\" | sed ':label;N;s/\\n/,/;b label')\n\t[ -z \"${DEFAULT_DNS}\" ] && [ \"$(echo $ISP_DNS | tr ' ' '\\n' | wc -l)\" -ge 1 ] && DEFAULT_DNS=$(echo -n $ISP_DNS | tr ' ' '\\n' | tr '\\n' ',' | sed 's/,$//')\n\tLOCAL_DNS=\"${DEFAULT_DNS:-119.29.29.29,223.5.5.5}\"\n}\n\nget_local_dns\n\narg1=$1\nshift\ncase $arg1 in\nrun_socks)\n\trun_socks $@\n\t;;\nsocks_node_switch)\n\tsocks_node_switch $@\n\t;;\nstart)\n\tstart $@\n\t;;\nstop)\n\tstop\n\t;;\nesac\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/clash_subconverter.lua",
    "content": "#!/usr/bin/lua\n\n-- Copyright(c): lwb1978 2025–2027\n\nlocal api = require(\"luci.passwall.api\")\nlocal urlencode = api.UrlEncode\nlocal base64 = api.base64Encode\nlocal json = api.jsonc\n\nlocal function host_format(host)\n\tif not host then return \"\" end\n\tlocal str = host:match(\"%[(.-)%]\") or host\n\tif api.datatypes.ip6addr(str) then\n\t\treturn \"[\" .. str .. \"]\"\n\tend\n\treturn host\nend\n\nlocal function build_alpn(alpn)   -- 排序+去重\n\tif not alpn then return nil end\n\n\tlocal seen = {}\n\tlocal order = { \"h3\", \"h2\", \"http/1.1\" }\n\n\tif type(alpn) == \"table\" then\n\t\tfor _, v in ipairs(alpn) do\n\t\t\tif v then seen[v] = true end\n\t\tend\n\telse\n\t\tseen[tostring(alpn)] = true\n\tend\n\n\tlocal t = {}\n\tfor _, v in ipairs(order) do\n\t\tif seen[v] then table.insert(t, v) end\n\tend\n\n\tif #t == 0 then return nil end\n\treturn table.concat(t, \",\")\nend\n\nlocal function build_common(node)\n\tlocal o = {}\n\n\to.server = host_format(node.server)\n\to.port = node.port\n\to.name = node.name\n\n\t-- ===== TLS =====\n\to.tls = {}\n\n\tif node[\"reality-opts\"] then\n\t\to.tls.security = \"reality\"\n\t\to.tls.pbk = node[\"reality-opts\"][\"public-key\"]\n\t\to.tls.sid = node[\"reality-opts\"][\"short-id\"]\n\telseif node.tls then\n\t\to.tls.security = \"tls\"\n\tend\n\n\to.tls.sni = node.servername or node.sni\n\to.tls.fp = node[\"client-fingerprint\"]\n\to.tls.pcs = node.fingerprint\n\to.tls.insecure = node[\"skip-cert-verify\"] == true\n\n\to.tls.alpn = build_alpn(node.alpn)\n\n\tlocal ech_opts = node[\"ech-opts\"]\n\tif ech_opts and ech_opts.enable == true then\n\t\tif ech_opts.config then\n\t\t\to.tls.ech = ech_opts.config\n\t\telseif ech_opts[\"query-server-name\"] then\n\t\t\to.tls.ech = ech_opts[\"query-server-name\"] .. \"+https://223.5.5.5/dns-query\"\n\t\tend\n\tend\n\n\t-- ===== transport =====\n\to.transport = {}\n\tlocal net = node.network or \"tcp\"\n\to.transport.type = net\n\n\tlocal function get_first(v)\n\t\tif type(v) == \"table\" then return v[1] end\n\t\treturn v\n\tend\n\n\tif net == \"ws\" then\n\t\tlocal opts = node[\"ws-opts\"]\n\t\tif opts then\n\t\t\to.transport.path = opts.path\n\t\t\to.transport.host = opts.headers and opts.headers.Host\n\t\tend\n\n\telseif net == \"grpc\" then\n\t\tlocal opts = node[\"grpc-opts\"]\n\t\tif opts then\n\t\t\to.transport.serviceName = opts[\"grpc-service-name\"]\n\t\tend\n\n\telseif net == \"http\" then\n\t\tlocal opts = node[\"http-opts\"]\n\t\tif opts then\n\t\t\to.transport.host = get_first(opts.host)\n\t\t\to.transport.path = get_first(opts.path)\n\t\tend\n\n\telseif net == \"h2\" then\n\t\tlocal opts = node[\"h2-opts\"]\n\t\tif opts then\n\t\t\to.transport.host = get_first(opts.host)\n\t\t\to.transport.path = opts.path\n\t\tend\n\n\telseif net == \"xhttp\" then\n\t\tlocal opts = node[\"xhttp-opts\"]\n\t\tif opts then\n\t\t\to.transport.host = opts.host\n\t\t\to.transport.path = opts.path\n\t\t\to.transport.mode = opts.mode\n\n\t\t\tlocal extra = {}\n\n\t\t\t-- headers\n\t\t\tif opts.headers then\n\t\t\t\textra.headers = opts.headers\n\t\t\tend\n\n\t\t\tif opts[\"x-padding-bytes\"] then\n\t\t\t\textra.xPaddingBytes = opts[\"x-padding-bytes\"]\n\t\t\tend\n\n\t\t\tif opts[\"no-grpc-header\"] ~= nil then\n\t\t\t\textra.noGRPCHeader = opts[\"no-grpc-header\"]\n\t\t\tend\n\n\t\t\tif opts[\"sc-max-each-post-bytes\"] then\n\t\t\t\textra.scMaxEachPostBytes = opts[\"sc-max-each-post-bytes\"]\n\t\t\tend\n\n\t\t\tif opts[\"sc-min-posts-interval-ms\"] then\n\t\t\t\textra.scMinPostsIntervalMs = opts[\"sc-min-posts-interval-ms\"]\n\t\t\tend\n\n\t\t\t-- xmux\n\t\t\tif opts[\"reuse-settings\"] then\n\t\t\t\tlocal r = opts[\"reuse-settings\"]\n\t\t\t\tlocal xmux = {}\n\n\t\t\t\tif r[\"max-concurrency\"] then xmux.maxConcurrency = r[\"max-concurrency\"] end\n\t\t\t\tif r[\"max-connections\"] then xmux.maxConnections = tonumber(r[\"max-connections\"]) end\n\t\t\t\tif r[\"c-max-reuse-times\"] then xmux.cMaxReuseTimes = tonumber(r[\"c-max-reuse-times\"]) end\n\t\t\t\tif r[\"h-max-request-times\"] then xmux.hMaxRequestTimes = r[\"h-max-request-times\"] end\n\t\t\t\tif r[\"h-max-reusable-secs\"] then xmux.hMaxReusableSecs = r[\"h-max-reusable-secs\"] end\n\t\t\t\tif r[\"h-keep-alive-period\"] then xmux.hKeepAlivePeriod = tonumber(r[\"h-keep-alive-period\"]) end\n\n\t\t\t\tif next(xmux) then extra.xmux = xmux end\n\t\t\tend\n\n\t\t\t-- download-settings\n\t\t\tif opts[\"download-settings\"] then\n\t\t\t\tlocal d = opts[\"download-settings\"]\n\t\t\t\tlocal ds = {}\n\n\t\t\t\tif d.server then ds.address = d.server end\n\t\t\t\tif d.port then ds.port = d.port end\n\n\t\t\t\tds.network = \"xhttp\"\n\n\t\t\t\t-- TLS\n\t\t\t\tif d.tls then\n\t\t\t\t\tds.security = \"tls\"\n\t\t\t\t\tds.tlsSettings = {}\n\n\t\t\t\t\tif d.servername then\n\t\t\t\t\t\tds.tlsSettings.serverName = d.servername\n\t\t\t\t\tend\n\t\t\t\t\tif d[\"skip-cert-verify\"] == true then\n\t\t\t\t\t\tds.tlsSettings.allowInsecure = true\n\t\t\t\t\tend\n\t\t\t\t\tif d[\"client-fingerprint\"] then\n\t\t\t\t\t\tds.tlsSettings.fingerprint = d[\"client-fingerprint\"]\n\t\t\t\t\tend\n\t\t\t\t\tif d.fingerprint then\n\t\t\t\t\t\tds.tlsSettings.pinnedPeerCertSha256 = d.fingerprint\n\t\t\t\t\tend\n\t\t\t\t\tif d.alpn then\n\t\t\t\t\t\tds.tlsSettings.alpn = d.alpn\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\t-- xhttpSettings\n\t\t\t\tlocal xs = {}\n\n\t\t\t\tif d.path then xs.path = d.path end\n\t\t\t\tif d.host then xs.host = d.host end\n\n\t\t\t\tif next(xs) then\n\t\t\t\t\tds.xhttpSettings = xs\n\t\t\t\tend\n\n\t\t\t\textra.downloadSettings = ds\n\t\t\tend\n\n\t\t\tif next(extra) then\n\t\t\t\to.transport.extra = json.stringify(extra)\n\t\t\tend\n\t\tend\n\tend\n\n\treturn o\nend\n\n-- VLESS\nlocal function encode_vless(node)\n\tlocal o = build_common(node)\n\n\tlocal link = \"vless://\" .. node.uuid .. \"@\" .. o.server .. \":\" .. o.port\n\tlocal p = {}\n\n\tif node.flow then table.insert(p, \"flow=\" .. urlencode(node.flow)) end\n\tif node.encryption then table.insert(p, \"encryption=\" .. urlencode(node.encryption)) end\n\n\t-- TLS\n\tif o.tls.security then table.insert(p, \"security=\" .. o.tls.security) end\n\tif o.tls.pbk then table.insert(p, \"pbk=\" .. urlencode(o.tls.pbk)) end\n\tif o.tls.sid then table.insert(p, \"sid=\" .. urlencode(o.tls.sid)) end\n\tif o.tls.sni then table.insert(p, \"sni=\" .. urlencode(o.tls.sni)) end\n\tif o.tls.fp then table.insert(p, \"fp=\" .. urlencode(o.tls.fp)) end\n\tif o.tls.alpn then table.insert(p, \"alpn=\" .. urlencode(o.tls.alpn)) end\n\tif o.tls.ech then table.insert(p, \"ech=\" .. urlencode(o.tls.ech)) end\n\tif o.tls.pcs then table.insert(p, \"pcs=\" .. urlencode(o.tls.pcs)) end\n\ttable.insert(p, \"allowInsecure=\" .. (o.tls.insecure and \"1\" or \"0\"))\n\n\t-- transport\n\ttable.insert(p, \"type=\" .. o.transport.type)\n\tif o.transport.host then table.insert(p, \"host=\" .. urlencode(o.transport.host)) end\n\tif o.transport.path then table.insert(p, \"path=\" .. urlencode(o.transport.path)) end\n\tif o.transport.serviceName then table.insert(p, \"serviceName=\" .. urlencode(o.transport.serviceName)) end\n\tif o.transport.mode then table.insert(p, \"mode=\" .. urlencode(o.transport.mode)) end\n\tif o.transport.extra then table.insert(p, \"extra=\" .. urlencode(o.transport.extra)) end\n\n\tif #p > 0 then\n\t\tlink = link .. \"?\" .. table.concat(p, \"&\")\n\tend\n\n\treturn link .. \"#\" .. urlencode(o.name or \"\")\nend\n\n-- Trojan\nlocal function encode_trojan(node)\n\tlocal o = build_common(node)\n\n\tlocal link = \"trojan://\" .. node.password .. \"@\" .. o.server .. \":\" .. o.port\n\tlocal p = {}\n\n\tif o.tls.security then table.insert(p, \"security=\" .. o.tls.security) end\n\tif o.tls.pbk then table.insert(p, \"pbk=\" .. urlencode(o.tls.pbk)) end\n\tif o.tls.sid then table.insert(p, \"sid=\" .. urlencode(o.tls.sid)) end\n\tif o.tls.sni then table.insert(p, \"sni=\" .. urlencode(o.tls.sni)) end\n\tif o.tls.fp then table.insert(p, \"fp=\" .. urlencode(o.tls.fp)) end\n\tif o.tls.alpn then table.insert(p, \"alpn=\" .. urlencode(o.tls.alpn)) end\n\tif o.tls.pcs then table.insert(p, \"pcs=\" .. urlencode(o.tls.pcs)) end\n\ttable.insert(p, \"allowInsecure=\" .. (o.tls.insecure and \"1\" or \"0\"))\n\n\ttable.insert(p, \"type=\" .. o.transport.type)\n\tif o.transport.host then table.insert(p, \"host=\" .. urlencode(o.transport.host)) end\n\tif o.transport.path then table.insert(p, \"path=\" .. urlencode(o.transport.path)) end\n\tif o.transport.serviceName then table.insert(p, \"serviceName=\" .. urlencode(o.transport.serviceName)) end\n\n\tif #p > 0 then\n\t\tlink = link .. \"?\" .. table.concat(p, \"&\")\n\tend\n\n\treturn link .. \"#\" .. urlencode(o.name or \"\")\nend\n\n-- VMess\nlocal function encode_vmess(node)\n\tlocal o = build_common(node)\n\n\tlocal obj = {\n\t\tv = \"2\",\n\t\tps = o.name,\n\t\tadd = node.server,\n\t\tport = tostring(node.port),\n\t\tid = node.uuid,\n\t\taid = tostring(node.alterId or 0),\n\t\tnet = o.transport.type,\n\t\tsecurity = node.cipher,\n\t\tscy = node.cipher,\n\t\ttype = \"none\",\n\t\thost = o.transport.host or \"\",\n\t\tpath = o.transport.path or \"\",\n\t\ttls = o.tls.security == \"tls\" and \"tls\" or \"\",\n\t\tsni = o.tls.sni,\n\t\talpn = o.tls.alpn,\n\t\tfp = o.tls.fp,\n\t\tpcs = o.tls.pcs,\n\t\tinsecure = o.tls.insecure and \"1\" or \"0\",\n\t\ttfo = node.tfo and \"1\" or \"0\"\n\t}\n\n\tif o.transport.type == \"grpc\" then\n\t\tobj.path = o.transport.serviceName or \"\"\n\tend\n\n\treturn \"vmess://\" .. base64(json.stringify(obj))\nend\n\n-- SS\nlocal function encode_ss(node)\n\tlocal userinfo = node.cipher .. \":\" .. node.password\n\tlocal base = userinfo .. \"@\" .. host_format(node.server) .. \":\" .. node.port\n\tlocal link = \"ss://\" .. base64(base)\n\n\tlocal p = {}\n\n\tif node.udp then table.insert(p, \"udp=1\") end\n\tif node[\"udp-over-tcp\"] then table.insert(p, \"uot=1\") end\n\n\tif node.plugin then\n\t\tlocal plugin = node.plugin\n\t\tif node[\"plugin-opts\"] then\n\t\t\tlocal opts = {}\n\t\t\tfor k, v in pairs(node[\"plugin-opts\"]) do\n\t\t\t\ttable.insert(opts, k .. \"=\" .. v)\n\t\t\tend\n\t\t\tplugin = plugin .. \";\" .. table.concat(opts, \";\")\n\t\tend\n\t\ttable.insert(p, \"plugin=\" .. urlencode(plugin))\n\tend\n\n\tif #p > 0 then\n\t\tlink = link .. \"?\" .. table.concat(p, \"&\")\n\tend\n\n\treturn link .. \"#\" .. urlencode(node.name or \"\")\nend\n\n-- Hysteria\nlocal function encode_hysteria2(node)\n\tlocal link = \"hysteria://\" .. host_format(node.server) .. \":\" .. (node.port or \"\")\n\tlocal p = {}\n\n\tif node[\"auth-str\"] then table.insert(p, \"auth=\" .. node[\"auth-str\"]) end\n\tif node[\"ports\"] then table.insert(p, \"mport=\" .. node[\"ports\"]) end\n\tif node.obfs then table.insert(p, \"obfsParam=\" .. node.obfs) end\n\tif node.sni then table.insert(p, \"sni=\" .. node.sni) end\n\tif node.up then table.insert(p, \"upmbps=\" .. node.up) end\n\tif node.down then table.insert(p, \"downmbps=\" .. node.down) end\n\tif node[\"skip-cert-verify\"] then table.insert(p, \"insecure=1\") end\n\tif node[\"fingerprint\"] then table.insert(p, \"pinSHA256=\" .. urlencode(node[\"fingerprint\"])) end\n\n\tif node.alpn then\n\t\ttable.insert(p, \"alpn=\" .. urlencode(build_alpn(node.alpn)))\n\tend\n\n\tif #p > 0 then\n\t\tlink = link .. \"?\" .. table.concat(p, \"&\")\n\tend\n\n\treturn link .. \"#\" .. urlencode(node.name or \"\")\nend\n\n-- Hysteria2\nlocal function encode_hysteria2(node)\n\tlocal link = \"hysteria2://\" .. (node.password or \"\") .. \"@\" .. host_format(node.server) .. \":\" .. (node.port or \"\")\n\tlocal p = {}\n\n\tif node[\"ports\"] then table.insert(p, \"mport=\" .. urlencode(node[\"ports\"])) end\n\tif node.obfs then table.insert(p, \"obfs=\" .. node.obfs) end\n\tif node[\"obfs-password\"] then table.insert(p, \"obfs-password=\" .. node[\"obfs-password\"]) end\n\tif node.up then table.insert(p, \"upmbps=\" .. node.up) end\n\tif node.down then table.insert(p, \"downmbps=\" .. node.down) end\n\n\tif node.sni then table.insert(p, \"sni=\" .. urlencode(node.sni)) end\n\tif node[\"skip-cert-verify\"] then table.insert(p, \"insecure=1\") end\n\tif node[\"fingerprint\"] then table.insert(p, \"pinSHA256=\" .. urlencode(node[\"fingerprint\"])) end\n\n\tif #p > 0 then\n\t\tlink = link .. \"?\" .. table.concat(p, \"&\")\n\tend\n\n\treturn link .. \"#\" .. urlencode(node.name or \"\")\nend\n\n-- TUIC\nlocal function encode_tuic(node)\n\tlocal link = \"tuic://\" .. node.uuid .. \":\" .. node.password .. \"@\" .. host_format(node.server) .. \":\" .. node.port\n\tlocal p = {}\n\n\tif node[\"congestion-controller\"] then\n\t\ttable.insert(p, \"congestion_control=\" .. node[\"congestion-controller\"])\n\tend\n\n\tif node.alpn then\n\t\ttable.insert(p, \"alpn=\" .. urlencode(build_alpn(node.alpn)))\n\tend\n\n\tif node.sni then table.insert(p, \"sni=\" .. urlencode(node.sni)) end\n\tif node[\"disable-sni\"] then table.insert(p, \"disable_sni=1\") end\n\tif node[\"skip-cert-verify\"] then table.insert(p, \"allowInsecure=1\") end\n\tif node[\"udp-relay-mode\"] then table.insert(p, \"udp_relay_mode=\" .. node[\"udp-relay-mode\"]) end\n\t\n\n\tif #p > 0 then\n\t\tlink = link .. \"?\" .. table.concat(p, \"&\")\n\tend\n\n\treturn link .. \"#\" .. urlencode(node.name or \"\")\nend\n\n-- AnyTLS\nlocal function encode_anytls(node)\n\tlocal link = \"anytls://\" .. (node.password or \"\") .. \"@\" .. host_format(node.server) .. \":\" .. node.port\n\tlocal p = {}\n\n\tif node.sni then table.insert(p, \"sni=\" .. urlencode(node.sni)) end\n\tif node[\"skip-cert-verify\"] then table.insert(p, \"allowInsecure=1\") end\n\n\tif node.alpn then\n\t\ttable.insert(p, \"alpn=\" .. urlencode(build_alpn(node.alpn)))\n\tend\n\n\tif #p > 0 then\n\t\tlink = link .. \"?\" .. table.concat(p, \"&\")\n\tend\n\n\treturn link .. \"#\" .. urlencode(node.name or \"\")\nend\n\n-- SSR\nlocal function encode_ssr(node)\n\tlocal link = host_format(node.server) .. \":\" .. node.port .. \":\" .. (node.protocol or \"\") .. \":\" ..\n\t\t\t(node.cipher or \"\") .. \":\" .. (node.obfs or \"\") .. \":\" .. base64(node.password)\n\tlocal p = {}\n\n\tif node[\"obfs-param\"] then table.insert(p, \"obfsparam=\" .. base64(node[\"obfs-param\"])) end\n\tif node[\"protocol-param\"] then table.insert(p, \"protoparam=\" .. base64(node[\"protocol-param\"])) end\n\ttable.insert(p, \"remarks=\" .. base64(node.name))\n\n\tif #p > 0 then\n\t\tlink = link .. \"?\" .. table.concat(p, \"&\")\n\tend\n\n\treturn \"ssr://\" .. base64(link)\nend\n\nlocal function encode_node(node)\n\tif (not node.type) or (not node.name) then return nil end\n\n\tlocal t = node.type\n\n\tif t == \"vless\" then return encode_vless(node)\n\telseif t == \"trojan\" then return encode_trojan(node)\n\telseif t == \"vmess\" then return encode_vmess(node)\n\telseif t == \"ss\" then return encode_ss(node)\n\telseif t == \"hysteria\" then return encode_hysteria(node)\n\telseif t == \"hysteria2\" then return encode_hysteria2(node)\n\telseif t == \"tuic\" then return encode_tuic(node)\n\telseif t == \"anytls\" then return encode_anytls(node)\n\telseif t == \"ssr\" then return encode_ssr(node)\n\telse api.log(\"订阅转换 → 丢弃不支持的节点：\" .. node.name .. \"，节点类型：\" .. t)\n\tend\nend\n\nfunction parseClashNode(raw, remark)\n\tif not raw then return \"\" end \n\tlocal ok, lyaml = pcall(require, \"lyaml\")\n\tif not ok then return raw end\n\n\tlocal data = lyaml.load(raw)\n\tif not data or type(data) ~= \"table\" then return raw end\n\tif not data.proxies then return \"\" end\n\n\tapi.log('检测到 Clash 订阅，正在进行转换 ...')\n\n\tlocal links = {}\n\tfor _, node in ipairs(data.proxies) do\n\t\tlocal link = encode_node(node)\n\t\tif link then\n\t\t\ttable.insert(links, link)\n\t\tend\n\tend\n\n\treturn #links > 0 and table.concat(links, \"\\n\") or \"\"\nend\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/haproxy.lua",
    "content": "#!/usr/bin/lua\n\nlocal api = require (\"luci.passwall.api\")\nlocal appname = api.appname\nlocal fs = api.fs\nlocal jsonc = api.jsonc\nlocal uci = api.uci\nlocal sys = api.sys\n\nlocal log = function(...)\n\tapi.log(...)\nend\n\nfunction get_ip_port_from(str)\n\tlocal result_port = sys.exec(\"echo -n \" .. str .. \" | sed -n 's/^.*[:#]\\\\([0-9]*\\\\)$/\\\\1/p'\")\n\tlocal result_ip = sys.exec(string.format(\"__host=%s;__varport=%s;\", str, result_port) .. \"echo -n ${__host%%${__varport:+[:#]${__varport}*}}\")\n\treturn result_ip, result_port\nend\n\nlocal var = api.get_args(arg)\nlocal haproxy_path = var[\"-path\"]\nlocal haproxy_conf = var[\"-conf\"]\nlocal haproxy_dns = var[\"-dns\"] or \"119.29.29.29:53,223.5.5.5:53\"\n\nlocal cpu_thread = sys.exec('echo -n $(cat /proc/cpuinfo | grep \"processor\" | wc -l)') or \"1\"\nlocal health_check_type = uci:get(appname, \"@global_haproxy[0]\", \"health_check_type\") or \"tcp\"\nlocal health_check_inter = uci:get(appname, \"@global_haproxy[0]\", \"health_check_inter\") or \"20\"\nlocal balancingStrategy = uci:get(appname, \"@global_haproxy[0]\", \"balancingStrategy\") or \"roundrobin\"\nlocal console_port = uci:get(appname, \"@global_haproxy[0]\", \"console_port\")\nlocal bind_local = uci:get(appname, \"@global_haproxy[0]\", \"bind_local\") or \"0\"\nlocal bind_address = \"0.0.0.0\"\nif bind_local == \"1\" then bind_address = \"127.0.0.1\" end\n\nlog(\"HAPROXY 负载均衡：\")\nlog(string.format(\"  * 控制台端口：%s\", console_port))\nfs.mkdir(haproxy_path)\nlocal haproxy_file = haproxy_path .. \"/\" .. haproxy_conf\n\nlocal f_out = io.open(haproxy_file, \"a\")\n\nlocal haproxy_config = [[\nglobal\n\tdaemon\n\tlog 127.0.0.1 local2\n\tmaxconn 60000\n\tstats socket {{path}}/haproxy.sock\n\tnbthread {{nbthread}}\n\texternal-check\n\tinsecure-fork-wanted\n\tspread-checks 50\n\ttune.max-checks-per-thread 5\n\ndefaults\n\tmode tcp\n\tlog global\n\toption tcplog\n\toption dontlognull\n\toption http-server-close\n\t#option forwardfor except 127.0.0.0/8\n\toption redispatch\n\tretries 2\n\ttimeout http-request 10s\n\ttimeout queue 1m\n\ttimeout connect 10s\n\ttimeout client 1m\n\ttimeout server 1m\n\ttimeout http-keep-alive 10s\n\ttimeout check 10s\n\tmaxconn 3000\n\nresolvers mydns\n\tresolve_retries 1\n\ttimeout resolve 5s\n\thold valid 600s\n{{dns}}\n]]\n\nhaproxy_config = haproxy_config:gsub(\"{{path}}\",  haproxy_path)\nhaproxy_config = haproxy_config:gsub(\"{{nbthread}}\",  cpu_thread)\n\nlocal mydns = \"\"\nlocal index = 0\nstring.gsub(haproxy_dns, '[^' .. \",\" .. ']+', function(w)\n\tindex = index + 1\n\tlocal s = w:gsub(\"#\", \":\")\n\tif not s:find(\":\") then\n\t\ts = s .. \":53\"\n\tend\n\tmydns = mydns .. (index > 1 and \"\\n\" or \"\") .. \"\t\" .. string.format(\"nameserver dns%s %s\", index, s)\nend)\nhaproxy_config = haproxy_config:gsub(\"{{dns}}\",  mydns)\n\nf_out:write(haproxy_config)\n\nlocal listens = {}\n\nuci:foreach(appname, \"haproxy_config\", function(t)\n\tif t.enabled == \"1\" then\n\t\tlocal server_remark\n\t\tlocal server_address\n\t\tlocal server_port\n\t\tlocal lbss = t.lbss\n\t\tlocal listen_port = tonumber(t.haproxy_port) or 0\n\t\tlocal server_node = uci:get_all(appname, lbss)\n\t\tlocal hop = (health_check_type == \"passwall_logic\") and (server_node.hysteria_hop or server_node.hysteria2_hop) or nil\n\t\thop = hop and hop:gsub(\":\", \"-\") or nil\n\t\tif server_node and server_node.address and (server_node.port or hop) then\n\t\t\tserver_remark = server_node.address .. \":\" .. (server_node.port or hop)\n\t\t\tserver_address = server_node.address\n\t\t\tserver_port = server_node.port or hop\n\t\t\tt.origin_address = server_address\n\t\t\tt.origin_port = server_port\n\t\t\tif health_check_type == \"passwall_logic\" then\n\t\t\t\tif server_node.type ~= \"Socks\" then\n\t\t\t\t\tlocal relay_port = server_node.port\n\t\t\t\t\tlocal new_port = api.get_new_port()\n\t\t\t\t\tlocal config_file = string.format(\"haproxy_%s_%s.json\", t[\".name\"], new_port)\n\t\t\t\t\tsys.call(string.format('/usr/share/%s/app.sh run_socks \"%s\"> /dev/null',\n\t\t\t\t\t\tappname,\n\t\t\t\t\t\tstring.format(\"flag=%s node=%s bind=%s socks_port=%s config_file=%s\",\n\t\t\t\t\t\t\tnew_port, --flag\n\t\t\t\t\t\t\tserver_node[\".name\"], --node\n\t\t\t\t\t\t\t\"127.0.0.1\", --bind\n\t\t\t\t\t\t\tnew_port, --socks port\n\t\t\t\t\t\t\tconfig_file --config file\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t\tserver_address = \"127.0.0.1\"\n\t\t\t\t\tserver_port = new_port\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tserver_address, server_port = get_ip_port_from(lbss)\n\t\t\tserver_remark = server_address .. \":\" .. server_port\n\t\t\tt.origin_address = server_address\n\t\t\tt.origin_port = server_port\n\t\tend\n\t\tif server_address and server_port and listen_port > 0 then\n\t\t\tif not listens[listen_port] then\n\t\t\t\tlistens[listen_port] = {}\n\t\t\tend\n\t\t\tt.server_remark = server_remark\n\t\t\tt.server_address = server_address\n\t\t\tt.server_port = server_port\n\t\t\ttable.insert(listens[listen_port], t)\n\t\telse\n\t\t\tlog(\"  - 丢弃1个明显无效的节点\")\n\t\tend\n\tend\nend)\n\nlocal inter = tonumber((health_check_inter or \"20\"):match(\"^%d+\"))\ninter = (inter and inter >= 20) and inter or 20\nlocal inter_arg = \"inter \" .. inter .. \"s fastinter \" .. inter / 2 .. \"s downinter \" .. inter * 1.5 .. \"s\"\n\nlocal sortTable = {}\nfor i in pairs(listens) do\n\tif i ~= nil then\n\t\ttable.insert(sortTable, i)\n\tend\nend\ntable.sort(sortTable, function(a,b) return (a < b) end)\n\nfor i, port in pairs(sortTable) do\n\tlog(\"  +  入口 %s:%s\" % {bind_address, port})\n\n\tf_out:write(\"\\n\" .. string.format([[\nlisten %s\n\tbind %s:%s\n\tmode tcp\n\tbalance %s\n]], port, bind_address, port, balancingStrategy))\n\n\tif health_check_type == \"passwall_logic\" then\n\t\tf_out:write(string.format([[\n\toption external-check\n\texternal-check command \"/usr/share/%s/haproxy_check.sh\"\n]], appname))\n\tend\n\n\tlocal count_M, count_B = 1, 1\n\tfor i, o in ipairs(listens[port]) do\n\t\tlocal remark = o.server_remark or \"\"\n\t\t-- 防止重名导致无法运行\n\t\tif tostring(o.backup) ~= \"1\" then\n\t\t\tremark = \"M\" .. count_M .. \"-\" .. remark\n\t\t\tcount_M = count_M + 1\n\t\telse\n\t\t\tremark = \"B\" .. count_B .. \"-\" .. remark\n\t\t\tcount_B = count_B + 1\n\t\tend\n\t\tlocal server = o.server_address .. \":\" .. o.server_port\n\t\tlocal server_conf = \"server {{remark}} {{server}} weight {{weight}} {{resolvers}} check {{inter_arg}} rise 2 fall 2 {{backup}}\"\n\t\tserver_conf = server_conf:gsub(\"{{remark}}\", remark)\n\t\tserver_conf = server_conf:gsub(\"{{server}}\", server)\n\t\tserver_conf = server_conf:gsub(\"{{weight}}\", o.lbweight)\n\t\tlocal resolvers = \"resolvers mydns\"\n\t\tif api.is_ip(o.server_address) then\n\t\t\tresolvers = \"\"\n\t\tend\n\t\tserver_conf = server_conf:gsub(\"{{resolvers}}\", resolvers)\n\t\tserver_conf = server_conf:gsub(\"{{inter_arg}}\", inter_arg)\n\t\tserver_conf = server_conf:gsub(\"{{backup}}\", tostring(o.backup) == \"1\" and \"backup\" or \"\")\n\n\t\tf_out:write(\"\t\" .. api.trim(server_conf) .. \"\\n\")\n\n\t\tif o.export ~= \"0\" then\n\t\t\tsys.call(string.format(\". /usr/share/%s/utils.sh ; add_ip2route %s %s\", appname, o.origin_address, o.export))\n\t\tend\n\n\t\tlog(string.format(\"  | - 出口节点：%s:%s，权重：%s\", o.origin_address, o.origin_port, o.lbweight))\n\tend\nend\n\n--控制台配置\nlocal console_user = uci:get(appname, \"@global_haproxy[0]\", \"console_user\")\nlocal console_password = uci:get(appname, \"@global_haproxy[0]\", \"console_password\")\nlocal str = [[\nlisten console\n\tbind 0.0.0.0:%s\n\tmode http\n\tstats refresh 30s\n\tstats uri /\n\tstats admin if TRUE\n\t%s\n]]\nf_out:write(\"\\n\" .. string.format(str, console_port, (console_user and console_user ~= \"\" and console_password and console_password ~= \"\") and \"stats auth \" .. console_user .. \":\" .. console_password or \"\"))\n\nf_out:close()\n\n--passwall内置健康检查URL\nif health_check_type == \"passwall_logic\" then\n\tlocal probeUrl = uci:get(appname, \"@global_haproxy[0]\", \"health_probe_url\") or \"https://www.google.com/generate_204\"\n\tlocal f_url = io.open(haproxy_path .. \"/Probe_URL\", \"w\")\n\tf_url:write(probeUrl)\n\tf_url:close()\nend\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/haproxy_check.sh",
    "content": "#!/bin/sh\n\nexport PATH=/usr/sbin:/usr/bin:/sbin:/bin:/root/bin\nCONFIG=passwall\n\nlisten_address=$1\nlisten_port=$2\nserver_address=$3\nserver_port=$4\n\npgrep -af \"${CONFIG}/\" | grep -E 'app\\.sh.*(start|stop)|nftables\\.sh|iptables\\.sh|subscribe\\.lua' >/dev/null && {\n\t# 特定任务执行中不检测\n\texit 0\n}\n\nprobe_file=\"/tmp/etc/passwall/haproxy/Probe_URL\"\nprobeUrl=\"https://www.google.com/generate_204\"\nif [ -f \"$probe_file\" ]; then\n\tfirstLine=$(head -n 1 \"$probe_file\" | tr -d ' \\t\\n')\n\t[ -n \"$firstLine\" ] && probeUrl=\"$firstLine\"\nfi\n\nextra_params=\"-x socks5h://${server_address}:${server_port}\"\nif /usr/bin/curl --help all | grep -q \"\\-\\-retry-all-errors\"; then\n\textra_params=\"${extra_params} --retry-all-errors\"\nfi\n\nstatus=$(/usr/bin/curl -I -o /dev/null -skL ${extra_params} --connect-timeout 3 --retry 1 --max-time 6 -w \"%{http_code}\" \"${probeUrl}\")\n\ncase \"$status\" in\n\t200|204)\n\t\texit 0\n\t;;\n\t*)\n\t\texit 1\n\t;;\nesac\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/helper_chinadns_add.lua",
    "content": "local api = require \"luci.passwall.api\"\nlocal appname = api.appname\n\nlocal var = api.get_args(arg)\nlocal FLAG = var[\"-FLAG\"]\nlocal LISTEN_PORT = var[\"-LISTEN_PORT\"]\nlocal DNS_LOCAL = var[\"-DNS_LOCAL\"]\nlocal DNS_TRUST = var[\"-DNS_TRUST\"]\nlocal USE_DIRECT_LIST = var[\"-USE_DIRECT_LIST\"]\nlocal USE_PROXY_LIST = var[\"-USE_PROXY_LIST\"]\nlocal USE_BLOCK_LIST = var[\"-USE_BLOCK_LIST\"]\nlocal GFWLIST = var[\"-GFWLIST\"]\nlocal CHNLIST = var[\"-CHNLIST\"]\nlocal NO_IPV6_TRUST = var[\"-NO_IPV6_TRUST\"]\nlocal DEFAULT_MODE = var[\"-DEFAULT_MODE\"]\nlocal DEFAULT_TAG = var[\"-DEFAULT_TAG\"]\nlocal NO_LOGIC_LOG = var[\"-NO_LOGIC_LOG\"]\nlocal TCP_NODE = var[\"-TCP_NODE\"]\nlocal NFTFLAG = var[\"-NFTFLAG\"]\nlocal REMOTE_FAKEDNS = var[\"-REMOTE_FAKEDNS\"]\nlocal FILTER_HTTPS = var[\"-FILTER_HTTPS\"]\nlocal LOG_FILE = var[\"-LOG_FILE\"]\n\nlocal uci = api.uci\nlocal sys = api.sys\nlocal fs = api.fs\nlocal datatypes = api.datatypes\n\nlocal TMP_PATH = \"/tmp/etc/\" .. appname\nlocal TMP_ACL_PATH = TMP_PATH .. \"/acl\"\nlocal RULES_PATH = \"/usr/share/\" .. appname .. \"/rules\"\nlocal FLAG_PATH = TMP_ACL_PATH .. \"/\" .. FLAG\nlocal config_lines = {}\nlocal tmp_lines = {}\nlocal USE_GEOVIEW = uci:get(appname, \"@global_rules[0]\", \"enable_geoview\")\nlocal IS_SHUNT_NODE = uci:get(appname, TCP_NODE, \"protocol\") == \"_shunt\"\n\nif IS_SHUNT_NODE then\n\tREMOTE_FAKEDNS = uci:get(appname, TCP_NODE, \"fakedns\") or \"0\"\nend\n\nlocal function log(...)\n\tif NO_LOGIC_LOG == \"1\" then\n\t\treturn\n\tend\n\tapi.log(...)\nend\n\nlocal function is_file_nonzero(path)\n\tif path and #path > 1 then\n\t\tif sys.exec('[ -s \"%s\" ] && echo -n 1' % path) == \"1\" then\n\t\t\treturn true\n\t\tend\n\tend\n\treturn nil\nend\n\nlocal function insert_unique(dest_table, value, lookup_table)\n\tif not lookup_table[value] then\n\t\ttable.insert(dest_table, value)\n\t\tlookup_table[value] = true\n\tend\nend\n\nlocal function merge_array(array1, array2)\n\tfor i, line in ipairs(array2) do\n\t\ttable.insert(array1, #array1 + 1, line)\n\tend\nend\n\nlocal function insert_array_before(array1, array2, target) --将array2插入到array1的target前面，target不存在则追加\n\tfor i, line in ipairs(array1) do\n\t\tif line == target then\n\t\t\tfor j = #array2, 1, -1 do\n\t\t\t\ttable.insert(array1, i, array2[j])\n\t\t\tend\n\t\t\treturn\n\t\tend\n\tend\n\tmerge_array(array1, array2)\nend\n\nlocal function insert_array_after(array1, array2, target) --将array2插入到array1的target后面，target不存在则追加\n\tfor i, line in ipairs(array1) do\n\t\tif line == target then\n\t\t\tfor j = 1, #array2 do\n\t\t\t\ttable.insert(array1, i + j, array2[j])\n\t\t\tend\n\t\t\treturn\n\t\tend\n\tend\n\tmerge_array(array1, array2)\nend\n\nlocal function get_geosite(list_arg, out_path)\n\tlocal geosite_path = uci:get(appname, \"@global_rules[0]\", \"v2ray_location_asset\") or \"/usr/share/v2ray/\"\n\tgeosite_path = geosite_path:match(\"^(.*)/\") .. \"/geosite.dat\"\n\tif not is_file_nonzero(geosite_path) then return 1 end\n\tlocal bin = api.finded_com(\"geoview\")\n\tif bin and list_arg and out_path then\n\t\tlocal cmd = string.format(\"%q -type geosite -append=true -input %q -list %q -output %q -lowmem=true\",\n\t\t\tbin, geosite_path, list_arg, out_path)\n\t\tsys.call(cmd)\n\t\treturn 0\n\tend\n\treturn 1\nend\n\nif not fs.access(FLAG_PATH) then\n\tfs.mkdir(FLAG_PATH)\nend\n\nlocal setflag = (NFTFLAG == \"1\") and \"inet@passwall@\" or \"\"\n\nlocal only_global = (DEFAULT_MODE == \"proxy\" and CHNLIST == \"0\" and GFWLIST == \"0\") and 1\n\nconfig_lines = {\n\tLOG_FILE ~= \"/dev/null\" and \"verbose\" or \"\",\n\t\"bind-addr ::\",\n\t\"bind-port \" .. LISTEN_PORT,\n\t\"china-dns \" .. DNS_LOCAL,\n\t\"trust-dns \" .. DNS_TRUST,\n\ttonumber(FILTER_HTTPS) == 1 and \"filter-qtype 65\" or \"\"\n}\n\nfor i = 1, 6 do\n\ttable.insert(config_lines, \"#--\" .. i)\nend\n\n--自定义规则组，后声明的组具有更高优先级\n--屏蔽列表\nlocal file_block_host = TMP_ACL_PATH .. \"/block_host\"\nif USE_BLOCK_LIST == \"1\" and not fs.access(file_block_host) then\n\tlocal block_domain, lookup_block_domain = {}, {}\n\tlocal geosite_arg = \"\"\n\tfor line in io.lines(RULES_PATH .. \"/block_host\") do\n\t\tif not line:find(\"#\") and line:find(\"geosite:\") then\n\t\t\tline = string.match(line, \":([^:]+)$\")\n\t\t\tgeosite_arg = geosite_arg .. (geosite_arg ~= \"\" and \",\" or \"\") .. line\n\t\telse\n\t\t\tline = api.get_std_domain(line)\n\t\t\tif line ~= \"\" and not line:find(\"#\") then\n\t\t\t\tinsert_unique(block_domain, line, lookup_block_domain)\n\t\t\tend\n\t\tend\n\tend\n\tif #block_domain > 0 then\n\t\tlocal f_out = io.open(file_block_host, \"w\")\n\t\tfor i = 1, #block_domain do\n\t\t\tf_out:write(block_domain[i] .. \"\\n\")\n\t\tend\n\t\tf_out:close()\n\tend\n\tif USE_GEOVIEW == \"1\" and geosite_arg ~= \"\" and api.is_finded(\"geoview\") then\n\t\tif get_geosite(geosite_arg, file_block_host) == 0 then\n\t\t\tlog(\"  * 解析[屏蔽列表] Geosite 到屏蔽域名表(blocklist)完成\")\n\t\telse\n\t\t\tlog(\"  * 解析[屏蔽列表] Geosite 到屏蔽域名表(blocklist)失败！\")\n\t\tend\n\tend\nend\nif USE_BLOCK_LIST == \"1\" and is_file_nonzero(file_block_host) then\n\ttmp_lines = {\n\t\t\"group null\",\n\t\t\"group-dnl \" .. file_block_host\n\t}\n\tinsert_array_after(config_lines, tmp_lines, \"#--5\")\nend\n\n--始终用国内DNS解析节点域名\nlocal file_vpslist = TMP_ACL_PATH .. \"/vpslist\"\nif not is_file_nonzero(file_vpslist) then\n\tlocal f_out = io.open(file_vpslist, \"w\")\n\tlocal written_domains = {}\n\tlocal function process_address(address)\n\t\taddress = (address or \"\"):lower()\n\t\tif api.vps_domain_exclude(address) then return end\n\t\tif datatypes.hostname(address) and not written_domains[address] then\n\t\t\tf_out:write(address .. \"\\n\")\n\t\t\twritten_domains[address] = true\n\t\tend\n\tend\n\tuci:foreach(appname, \"nodes\", function(t)\n\t\tprocess_address(t.address)\n\t\tprocess_address(t.download_address)\n\tend)\n\tuci:foreach(appname, \"subscribe_list\", function(t)  --订阅链接\n\t\tlocal url, _ = api.get_domain_port_from_url(t.url or \"\")\n\t\tif url and url ~= \"\" then\n\t\t\tprocess_address(url)\n\t\tend\n\tend)\n\tf_out:close()\nend\nif is_file_nonzero(file_vpslist) then\n\tlocal sets = {\n\t\tsetflag .. \"passwall_vps\",\n\t\tsetflag .. \"passwall_vps6\"\n\t}\n\ttmp_lines = {\n\t\t\"group vpslist\",\n\t\t\"group-dnl \" .. file_vpslist,\n\t\t\"group-upstream \" .. DNS_LOCAL,\n\t\t\"group-ipset \" .. table.concat(sets, \",\")\n\t}\n\tinsert_array_after(config_lines, tmp_lines, \"#--6\")\n\tlog(string.format(\"  - 节点列表中的域名(vpslist)：%s\", DNS_LOCAL or \"默认\"))\nend\n\n--直连（白名单）列表\nlocal file_direct_host = TMP_ACL_PATH .. \"/direct_host\"\nif USE_DIRECT_LIST == \"1\" and not fs.access(file_direct_host) then\n\tlocal direct_domain, lookup_direct_domain = {}, {}\n\tlocal geosite_arg = \"\"\n\tfor line in io.lines(RULES_PATH .. \"/direct_host\") do\n\t\tif not line:find(\"#\") and line:find(\"geosite:\") then\n\t\t\tline = string.match(line, \":([^:]+)$\")\n\t\t\tgeosite_arg = geosite_arg .. (geosite_arg ~= \"\" and \",\" or \"\") .. line\n\t\telse\n\t\t\tline = api.get_std_domain(line)\n\t\t\tif line ~= \"\" and not line:find(\"#\") then\n\t\t\t\tinsert_unique(direct_domain, line, lookup_direct_domain)\n\t\t\tend\n\t\tend\n\tend\n\tif #direct_domain > 0 then\n\t\tlocal f_out = io.open(file_direct_host, \"w\")\n\t\tfor i = 1, #direct_domain do\n\t\t\tf_out:write(direct_domain[i] .. \"\\n\")\n\t\tend\n\t\tf_out:close()\n\tend\n\tif USE_GEOVIEW == \"1\" and geosite_arg ~= \"\" and api.is_finded(\"geoview\") then\n\t\tif get_geosite(geosite_arg, file_direct_host) == 0 then\n\t\t\tlog(\"  * 解析[直连列表] Geosite 到域名白名单(whitelist)完成\")\n\t\telse\n\t\t\tlog(\"  * 解析[直连列表] Geosite 到域名白名单(whitelist)失败！\")\n\t\tend\n\tend\nend\nif USE_DIRECT_LIST == \"1\" and is_file_nonzero(file_direct_host) then\n\tlocal sets = {\n\t\tsetflag .. \"passwall_white\",\n\t\tsetflag .. \"passwall_white6\"\n\t}\n\ttmp_lines = {\n\t\t\"group directlist\",\n\t\t\"group-dnl \" .. file_direct_host,\n\t\t\"group-upstream \" .. DNS_LOCAL,\n\t\t\"group-ipset \" .. table.concat(sets, \",\")\n\t}\n\tinsert_array_after(config_lines, tmp_lines, \"#--4\")\n\tlog(string.format(\"  - 域名白名单(whitelist)：%s\", DNS_LOCAL or \"默认\"))\nend\n\n--代理（黑名单）列表\nlocal file_proxy_host = TMP_ACL_PATH .. \"/proxy_host\"\nif USE_PROXY_LIST == \"1\" and not fs.access(file_proxy_host) then\n\tlocal proxy_domain, lookup_proxy_domain = {}, {}\n\tlocal geosite_arg = \"\"\n\tfor line in io.lines(RULES_PATH .. \"/proxy_host\") do\n\t\tif not line:find(\"#\") and line:find(\"geosite:\") then\n\t\t\tline = string.match(line, \":([^:]+)$\")\n\t\t\tgeosite_arg = geosite_arg .. (geosite_arg ~= \"\" and \",\" or \"\") .. line\n\t\telse\n\t\t\tline = api.get_std_domain(line)\n\t\t\tif line ~= \"\" and not line:find(\"#\") then\n\t\t\t\tinsert_unique(proxy_domain, line, lookup_proxy_domain)\n\t\t\tend\n\t\tend\n\tend\n\tif #proxy_domain > 0 then\n\t\tlocal f_out = io.open(file_proxy_host, \"w\")\n\t\tfor i = 1, #proxy_domain do\n\t\t\tf_out:write(proxy_domain[i] .. \"\\n\")\n\t\tend\n\t\tf_out:close()\n\tend\n\tif USE_GEOVIEW == \"1\" and geosite_arg ~= \"\" and api.is_finded(\"geoview\") then\n\t\tif get_geosite(geosite_arg, file_proxy_host) == 0 then\n\t\t\tlog(\"  * 解析[代理列表] Geosite 到代理域名表(blacklist)完成\")\n\t\telse\n\t\t\tlog(\"  * 解析[代理列表] Geosite 到代理域名表(blacklist)失败！\")\n\t\tend\n\tend\nend\nif USE_PROXY_LIST == \"1\" and is_file_nonzero(file_proxy_host) then\n\tlocal sets = {\n\t\tsetflag .. \"passwall_black\",\n\t\tsetflag .. \"passwall_black6\"\n\t}\n\tif FLAG ~= \"default\" then\n\t\tsets = {\n\t\t\tsetflag .. \"passwall_\" .. FLAG .. \"_black\",\n\t\t\tsetflag .. \"passwall_\" .. FLAG .. \"_black6\"\n\t\t}\n\tend\n\ttmp_lines = {\n\t\t\"group proxylist\",\n\t\t\"group-dnl \" .. file_proxy_host,\n\t\t\"group-upstream \" .. DNS_TRUST,\n\t\tREMOTE_FAKEDNS ~= \"1\" and \"group-ipset \" .. table.concat(sets, \",\") or \"\"\n\t}\n\tif NO_IPV6_TRUST == \"1\" then table.insert(tmp_lines, \"no-ipv6 tag:proxylist\") end\n\tinsert_array_after(config_lines, tmp_lines, \"#--3\")\n\tlog(string.format(\"  - 代理域名表(blacklist)：%s\", DNS_TRUST or \"默认\"))\nend\n\n--内置组(chn/gfw)优先级在自定义组后\n--GFW列表\nif GFWLIST == \"1\" and is_file_nonzero(RULES_PATH .. \"/gfwlist\") then\n\tlocal sets = {\n\t\tsetflag .. \"passwall_gfw\",\n\t\tsetflag .. \"passwall_gfw6\"\n\t}\n\tif FLAG ~= \"default\" then\n\t\tsets = {\n\t\t\tsetflag .. \"passwall_\" .. FLAG .. \"_gfw\",\n\t\t\tsetflag .. \"passwall_\" .. FLAG .. \"_gfw6\"\n\t\t}\n\tend\n\ttmp_lines = {\n\t\t\"gfwlist-file \" .. RULES_PATH .. \"/gfwlist\",\n\t\tREMOTE_FAKEDNS ~= \"1\" and \"add-taggfw-ip \" .. table.concat(sets, \",\") or \"\"\n\t}\n\tif NO_IPV6_TRUST == \"1\" then table.insert(tmp_lines, \"no-ipv6 tag:gfw\") end\n\tmerge_array(config_lines, tmp_lines)\n\tlog(string.format(\"  - 防火墙域名表(gfwlist)：%s\", DNS_TRUST or \"默认\"))\nend\n\n--中国列表\nif CHNLIST ~= \"0\" and is_file_nonzero(RULES_PATH .. \"/chnlist\") then\n\tif CHNLIST == \"direct\" then\n\t\ttmp_lines = {\n\t\t\t\"chnlist-file \" .. RULES_PATH .. \"/chnlist\",\n\t\t\t\"ipset-name4 \" .. setflag .. \"passwall_chn\",\n\t\t\t\"ipset-name6 \" .. setflag .. \"passwall_chn6\",\n\t\t\t\"add-tagchn-ip\",\n\t\t\t\"chnlist-first\"\n\t\t}\n\t\tmerge_array(config_lines, tmp_lines)\n\t\tlog(string.format(\"  - 中国域名表(chnroute)：%s\", DNS_LOCAL or \"默认\"))\n\tend\n\n\t--回中国模式\n\tif CHNLIST == \"proxy\" then\n\t\tlocal sets = {\n\t\t\tsetflag .. \"passwall_chn\",\n\t\t\tsetflag .. \"passwall_chn6\"\n\t\t}\n\t\ttmp_lines = {\n\t\t\t\"group chn_proxy\",\n\t\t\t\"group-dnl \" .. RULES_PATH .. \"/chnlist\",\n\t\t\t\"group-upstream \" .. DNS_TRUST,\n\t\t\tREMOTE_FAKEDNS ~= \"1\" and \"group-ipset \" .. table.concat(sets, \",\") or \"\"\n\t\t}\n\t\tif NO_IPV6_TRUST == \"1\" then table.insert(tmp_lines, \"no-ipv6 tag:chn_proxy\") end\n\t\tinsert_array_after(config_lines, tmp_lines, \"#--1\")\n\t\tlog(string.format(\"  - 中国域名表(chnroute)：%s\", DNS_TRUST or \"默认\"))\n\tend\nend\n\n--分流规则\nif IS_SHUNT_NODE then\n\tlocal white_domain, lookup_white_domain = {}, {}\n\tlocal shunt_domain, lookup_shunt_domain = {}, {}\n\tlocal file_white_host = FLAG_PATH .. \"/shunt_direct_host\"\n\tlocal file_shunt_host = FLAG_PATH .. \"/shunt_proxy_host\"\n\tlocal geosite_white_arg, geosite_shunt_arg = \"\", \"\"\n\n\tlocal t = uci:get_all(appname, TCP_NODE)\n\tlocal default_node_id = t[\"default_node\"] or \"_direct\"\n\tuci:foreach(appname, \"shunt_rules\", function(s)\n\t\tlocal _node_id = t[s[\".name\"]]\n\t\tif _node_id and _node_id ~= \"_blackhole\" then\n\t\t\tif _node_id == \"_default\" then\n\t\t\t\t_node_id = default_node_id\n\t\t\tend\n\n\t\t\tlocal domain_list = s.domain_list or \"\"\n\t\t\tfor line in string.gmatch(domain_list, \"[^\\r\\n]+\") do\n\t\t\t\tif line ~= \"\" and not line:find(\"#\") and not line:find(\"regexp:\") and not line:find(\"ext:\") then\n\t\t\t\t\tif line:find(\"geosite:\") then\n\t\t\t\t\t\tline = string.match(line, \":([^:]+)$\")\n\t\t\t\t\t\tif _node_id == \"_direct\" then\n\t\t\t\t\t\t\tgeosite_white_arg = geosite_white_arg .. (geosite_white_arg ~= \"\" and \",\" or \"\") .. line\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tgeosite_shunt_arg = geosite_shunt_arg .. (geosite_shunt_arg ~= \"\" and \",\" or \"\") .. line\n\t\t\t\t\t\tend\n\t\t\t\t\telse\n\t\t\t\t\t\tif line:find(\"domain:\") or line:find(\"full:\") then\n\t\t\t\t\t\t\tline = string.match(line, \":([^:]+)$\")\n\t\t\t\t\t\tend\n\t\t\t\t\t\tline = api.get_std_domain(line)\n\t\t\t\t\t\tif line ~= \"\" and not line:find(\"#\") then\n\t\t\t\t\t\t\tif _node_id == \"_direct\" then\n\t\t\t\t\t\t\t\tinsert_unique(white_domain, line, lookup_white_domain)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tinsert_unique(shunt_domain, line, lookup_shunt_domain)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif _node_id ~= \"_direct\" then\n\t\t\t\tlog(string.format(\"  - Sing-Box/Xray分流规则(%s)：%s\", s.remarks, DNS_TRUST or \"默认\"))\n\t\t\tend\n\t\tend\n\tend)\n\n\tif is_file_nonzero(file_white_host) == nil then\n\t\tif #white_domain > 0 then\n\t\t\tlocal f_out = io.open(file_white_host, \"w\")\n\t\t\tfor i = 1, #white_domain do\n\t\t\t\tf_out:write(white_domain[i] .. \"\\n\")\n\t\t\tend\n\t\t\tf_out:close()\n\t\tend\n\tend\n\n\tif is_file_nonzero(file_shunt_host) == nil then\n\t\tif #shunt_domain > 0 then\n\t\t\tlocal f_out = io.open(file_shunt_host, \"w\")\n\t\t\tfor i = 1, #shunt_domain do\n\t\t\t\tf_out:write(shunt_domain[i] .. \"\\n\")\n\t\t\tend\n\t\t\tf_out:close()\n\t\tend\n\tend\n\n\tif GFWLIST == \"1\" and CHNLIST == \"0\" and USE_GEOVIEW == \"1\" and api.is_finded(\"geoview\") then  --仅GFW模式解析geosite\n\t\tlocal return_white, return_shunt\n\t\tif geosite_white_arg ~= \"\" then\n\t\t\treturn_white = get_geosite(geosite_white_arg, file_white_host)\n\t\tend\n\t\tif geosite_shunt_arg ~= \"\" then\n\t\t\treturn_shunt = get_geosite(geosite_shunt_arg, file_shunt_host)\n\t\tend\n\t\tif (return_white == nil or return_white == 0) and (return_shunt == nil or return_shunt == 0) then\n\t\t\tlog(\"  * 解析[分流节点] Geosite 完成\")\n\t\telse\n\t\t\tlog(\"  * 解析[分流节点] Geosite 失败！\")\n\t\tend\n\tend\n\n\tlocal sets = {\n\t\tsetflag .. \"passwall_shunt\",\n\t\tsetflag .. \"passwall_shunt6\"\n\t}\n\tif FLAG ~= \"default\" then\n\t\tsets = {\n\t\t\tsetflag .. \"passwall_\" .. FLAG .. \"_shunt\",\n\t\t\tsetflag .. \"passwall_\" .. FLAG .. \"_shunt6\"\n\t\t}\n\tend\n\n\tif is_file_nonzero(file_white_host) then\n\t\tif USE_DIRECT_LIST == \"1\" then\n\t\t\t--当白名单启用时，添加到白名单组一同处理\n\t\t\tfor i, v in ipairs(config_lines) do\n\t\t\t\tif v == \"group-dnl \" .. file_direct_host then\n\t\t\t\t\tconfig_lines[i] = \"group-dnl \" .. file_direct_host .. \",\" .. file_white_host\n\t\t\t\t\tbreak\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\t--当白名单不启用时，创建新组，ipset到shuntlist\n\t\t\ttmp_lines = {\n\t\t\t\t\"group whitelist\",\n\t\t\t\t\"group-dnl \" .. file_white_host,\n\t\t\t\t\"group-upstream \" .. DNS_LOCAL,\n\t\t\t\t\"group-ipset \" .. table.concat(sets, \",\")\n\t\t\t}\n\t\t\tinsert_array_after(config_lines, tmp_lines, \"#--4\")\n\t\tend\n\t\t\n\tend\n\n\tif is_file_nonzero(file_shunt_host) then\n\t\ttmp_lines = {\n\t\t\t\"group shuntlist\",\n\t\t\t\"group-dnl \" .. file_shunt_host,\n\t\t\t\"group-upstream \" .. DNS_TRUST,\n\t\t\t(not only_global and REMOTE_FAKEDNS == \"1\") and \"\" or (\"group-ipset \" .. table.concat(sets, \",\"))\n\t\t}\n\t\tif NO_IPV6_TRUST == \"1\" then table.insert(tmp_lines, \"no-ipv6 tag:shuntlist\") end\n\t\tinsert_array_after(config_lines, tmp_lines, \"#--2\")\n\tend\n\nend\n\n--只使用gfwlist模式，GFW列表以外的域名及默认使用本地DNS\nif GFWLIST == \"1\" and CHNLIST == \"0\" then DEFAULT_TAG = \"chn\" end\n\n--回中国模式，中国列表以外的域名及默认使用本地DNS\nif CHNLIST == \"proxy\" then DEFAULT_TAG = \"chn\" end\n\n--全局模式，默认使用远程DNS\nif only_global then\n\tDEFAULT_TAG = \"gfw\"\n\tif NO_IPV6_TRUST == \"1\" and not IS_SHUNT_NODE then \n\t\ttable.insert(config_lines, \"no-ipv6\")\n\tend\nend\n\n--是否接受直连 DNS 空响应\nif DEFAULT_TAG == \"none_noip\" then table.insert(config_lines, \"noip-as-chnip\") end\n\nif DEFAULT_TAG == nil or DEFAULT_TAG == \"smart\" or DEFAULT_TAG == \"none_noip\" then DEFAULT_TAG = \"none\" end\n\ntable.insert(config_lines, \"default-tag \" .. DEFAULT_TAG)\n\nif DEFAULT_TAG == \"none\" then\n\ttable.insert(config_lines, \"verdict-cache 5000\")\nend\n\ntable.insert(config_lines, \"hosts\")\n\nif DEFAULT_TAG == \"chn\" then\n\tlog(string.format(\"  - 默认 DNS ：%s\", DNS_LOCAL))\nelseif  DEFAULT_TAG == \"gfw\" then\n\tlog(string.format(\"  - 默认 DNS ：%s\", DNS_TRUST))\nelse\n\tlog(string.format(\"  - 默认 DNS ：%s\", \"智能匹配\"))\nend\n\n--输出配置文件\nif #config_lines > 0 then\n\tfor i = 1, #config_lines do\n\t\tline = config_lines[i]\n\t\tif line ~= \"\" and not line:find(\"^#--\") then\n\t\t\tprint(line)\n\t\tend\n\tend\nend\n\nlog(\"  - ChinaDNS-NG已作为Dnsmasq上游，如果你自行配置了错误的DNS流程，将会导致域名(直连/代理域名)分流失效！！！\")\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/helper_dnsmasq.lua",
    "content": "local api = require \"luci.passwall.api\"\r\nlocal appname = \"passwall\"\r\nlocal uci = api.uci\r\nlocal sys = api.sys\r\nlocal fs = api.fs\r\nlocal datatypes = api.datatypes\r\nlocal TMP = {}\r\n\r\nlocal function tinsert(table_name, val)\r\n\tif table_name and type(table_name) == \"table\" then\r\n\t\tif not TMP[table_name] then\r\n\t\t\tTMP[table_name] = {}\r\n\t\tend\r\n\t\tif TMP[table_name][val] then\r\n\t\t\treturn false\r\n\t\tend\r\n\t\ttable.insert(table_name, val)\r\n\t\tTMP[table_name][val] = true\r\n\t\treturn true\r\n\tend\r\n\treturn false\r\nend\r\n\r\nlocal function backup_servers()\r\n\tlocal DNSMASQ_DNS = uci:get(\"dhcp\", \"@dnsmasq[0]\", \"server\")\r\n\tif DNSMASQ_DNS and #DNSMASQ_DNS > 0 then\r\n\t\tuci:set(appname, \"@global[0]\", \"dnsmasq_servers\", DNSMASQ_DNS)\r\n\t\tapi.uci_save(uci, appname, true)\r\n\tend\r\nend\r\n\r\nlocal function restore_servers()\r\n\tlocal dns_table = {}\r\n\tlocal DNSMASQ_DNS = uci:get(\"dhcp\", \"@dnsmasq[0]\", \"server\")\r\n\tif DNSMASQ_DNS and #DNSMASQ_DNS > 0 then\r\n\t\tfor k, v in ipairs(DNSMASQ_DNS) do\r\n\t\t\ttinsert(dns_table, v)\r\n\t\tend\r\n\tend\r\n\tlocal OLD_SERVER = uci:get(appname, \"@global[0]\", \"dnsmasq_servers\")\r\n\tif OLD_SERVER and #OLD_SERVER > 0 then\r\n\t\tfor k, v in ipairs(OLD_SERVER) do\r\n\t\t\ttinsert(dns_table, v)\r\n\t\tend\r\n\t\tuci:delete(appname, \"@global[0]\", \"dnsmasq_servers\")\r\n\t\tapi.uci_save(uci, appname, true)\r\n\tend\r\n\tif dns_table and #dns_table > 0 then\r\n\t\tuci:set_list(\"dhcp\", \"@dnsmasq[0]\", \"server\", dns_table)\r\n\t\tapi.uci_save(uci, \"dhcp\", true)\r\n\tend\r\nend\r\n\r\nfunction stretch()\r\n\tlocal dnsmasq_server = uci:get(\"dhcp\", \"@dnsmasq[0]\", \"server\")\r\n\tlocal dnsmasq_noresolv = uci:get(\"dhcp\", \"@dnsmasq[0]\", \"noresolv\")\r\n\tlocal _flag\r\n\tif dnsmasq_server and #dnsmasq_server > 0 then\r\n\t\tfor k, v in ipairs(dnsmasq_server) do\r\n\t\t\tif not v:find(\"/\") then\r\n\t\t\t\t_flag = true\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\n\tif not _flag and dnsmasq_noresolv == \"1\" then\r\n\t\tuci:delete(\"dhcp\", \"@dnsmasq[0]\", \"noresolv\")\r\n\t\tlocal RESOLVFILE = \"/tmp/resolv.conf.d/resolv.conf.auto\"\r\n\t\tlocal file = io.open(RESOLVFILE, \"r\")\r\n\t\tif not file then\r\n\t\t\tRESOLVFILE = \"/tmp/resolv.conf.auto\"\r\n\t\telse\r\n\t\t\tlocal size = file:seek(\"end\")\r\n\t\t\tfile:close()\r\n\t\t\tif size == 0 then\r\n\t\t\t\tRESOLVFILE = \"/tmp/resolv.conf.auto\"\r\n\t\t\tend\r\n\t\tend\r\n\t\tuci:set(\"dhcp\", \"@dnsmasq[0]\", \"resolvfile\", RESOLVFILE)\r\n\t\tapi.uci_save(uci, \"dhcp\", true)\r\n\tend\r\nend\r\n\r\nfunction restart(var)\r\n\tlocal LOG = var[\"-LOG\"]\r\n\tsys.call(\"/etc/init.d/dnsmasq restart >/dev/null 2>&1\")\r\n\tif LOG == \"1\" then\r\n\t\tapi.log(\"重启 dnsmasq 服务\")\r\n\tend\r\nend\r\n\r\nfunction logic_restart(var)\r\n\tlocal LOG = var[\"-LOG\"]\r\n\tlocal DEFAULT_DNS = api.get_cache_var(\"DEFAULT_DNS\")\r\n\tif DEFAULT_DNS then\r\n\t\tbackup_servers()\r\n\t\t--sys.call(\"sed -i '/list server/d' /etc/config/dhcp >/dev/null 2>&1\")\r\n\t\tlocal dns_table = {}\r\n\t\tlocal dnsmasq_server = uci:get(\"dhcp\", \"@dnsmasq[0]\", \"server\")\r\n\t\tif dnsmasq_server and #dnsmasq_server > 0 then\r\n\t\t\tfor k, v in ipairs(dnsmasq_server) do\r\n\t\t\t\tif v:find(\"/\") then\r\n\t\t\t\t\ttinsert(dns_table, v)\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\t\tuci:set_list(\"dhcp\", \"@dnsmasq[0]\", \"server\", dns_table)\r\n\t\t\tapi.uci_save(uci, \"dhcp\", true)\r\n\t\tend\r\n\t\tsys.call(\"/etc/init.d/dnsmasq restart >/dev/null 2>&1\")\r\n\t\trestore_servers()\r\n\telse\r\n\t\tsys.call(\"/etc/init.d/dnsmasq restart >/dev/null 2>&1\")\r\n\tend\r\n\tif LOG == \"1\" then\r\n\t\tapi.log(\"重启 dnsmasq 服务\")\r\n\tend\r\nend\r\n\r\nfunction copy_instance(var)\r\n\tlocal LISTEN_PORT = var[\"-LISTEN_PORT\"]\r\n\tlocal TMP_DNSMASQ_PATH = var[\"-TMP_DNSMASQ_PATH\"]\r\n\tlocal conf_lines = {}\r\n\tlocal DEFAULT_DNSMASQ_CFGID = sys.exec(\"echo -n $(uci -q show dhcp.@dnsmasq[0] | awk 'NR==1 {split($0, conf, /[.=]/); print conf[2]}')\")\r\n\tfor line in io.lines(\"/tmp/etc/dnsmasq.conf.\" .. DEFAULT_DNSMASQ_CFGID) do\r\n\t\tlocal filter\r\n\t\tif line:find(\"passwall\") then filter = true end\r\n\t\tif line:find(\"ubus\") then filter = true end\r\n\t\tif line:find(\"dhcp\") then filter = true end\r\n\t\tif line:find(\"server=\") == 1 then filter = true end\r\n\t\tif line:find(\"port=\") == 1 then filter = true end\r\n\t\tif line:find(\"conf%-dir=\") == 1 then\r\n\t\t\tfilter = true\r\n\t\t\tif TMP_DNSMASQ_PATH then\r\n\t\t\t\tlocal tmp_path = line:sub(1 + #\"conf-dir=\")\r\n\t\t\t\tsys.call(string.format(\"cp -r %s/* %s/ 2>/dev/null\", tmp_path, TMP_DNSMASQ_PATH))\r\n\t\t\tend\r\n\t\tend\r\n\t\tif line:find(\"address=\") == 1 or (line:find(\"server=\") == 1 and line:find(\"/\")) then filter = nil end\r\n\t\tif not filter then\r\n\t\t\ttinsert(conf_lines, line)\r\n\t\tend\r\n\tend\r\n\ttinsert(conf_lines, \"port=\" .. LISTEN_PORT)\r\n\tif TMP_DNSMASQ_PATH then\r\n\t\tsys.call(\"rm -rf \" .. TMP_DNSMASQ_PATH .. \"/*passwall*\")\r\n\tend\r\n\tif var[\"-return\"] == \"1\" then\r\n\t\treturn conf_lines\r\n\tend\r\n\tif #conf_lines > 0 then\r\n\t\tlocal DNSMASQ_CONF = var[\"-DNSMASQ_CONF\"]\r\n\t\tlocal conf_out = io.open(DNSMASQ_CONF, \"a\")\r\n\t\tconf_out:write(table.concat(conf_lines, \"\\n\"))\r\n\t\tconf_out:write(\"\\n\")\r\n\t\tconf_out:close()\r\n\tend\r\nend\r\n\r\nfunction add_rule(var)\r\n\tlocal FLAG = var[\"-FLAG\"]\r\n\tlocal TMP_DNSMASQ_PATH = var[\"-TMP_DNSMASQ_PATH\"]\r\n\tlocal DNSMASQ_CONF_FILE = var[\"-DNSMASQ_CONF_FILE\"]\r\n\tlocal LISTEN_PORT = var[\"-LISTEN_PORT\"]\r\n\tlocal DEFAULT_DNS = var[\"-DEFAULT_DNS\"]\r\n\tlocal LOCAL_DNS = var[\"-LOCAL_DNS\"]\r\n\tlocal TUN_DNS = var[\"-TUN_DNS\"]\r\n\tlocal REMOTE_FAKEDNS = var[\"-REMOTE_FAKEDNS\"]\r\n\tlocal USE_DEFAULT_DNS = var[\"-USE_DEFAULT_DNS\"]\r\n\tlocal CHINADNS_DNS = var[\"-CHINADNS_DNS\"]\r\n\tlocal TCP_NODE = var[\"-TCP_NODE\"]\r\n\tlocal USE_DIRECT_LIST = var[\"-USE_DIRECT_LIST\"]\r\n\tlocal USE_PROXY_LIST = var[\"-USE_PROXY_LIST\"]\r\n\tlocal USE_BLOCK_LIST = var[\"-USE_BLOCK_LIST\"]\r\n\tlocal USE_GFW_LIST = var[\"-USE_GFW_LIST\"]\r\n\tlocal CHN_LIST = var[\"-CHN_LIST\"]\r\n\tlocal DEFAULT_PROXY_MODE = var[\"-DEFAULT_PROXY_MODE\"]\r\n\tlocal NO_PROXY_IPV6 = var[\"-NO_PROXY_IPV6\"]\r\n\tlocal NO_LOGIC_LOG = var[\"-NO_LOGIC_LOG\"]\r\n\tlocal NFTFLAG = var[\"-NFTFLAG\"]\r\n\tlocal CACHE_PATH = api.CACHE_PATH\r\n\tlocal CACHE_FLAG = \"dnsmasq_\" .. FLAG\r\n\tlocal CACHE_DNS_PATH = CACHE_PATH .. \"/\" .. CACHE_FLAG\r\n\tlocal CACHE_TEXT_FILE = CACHE_DNS_PATH .. \".txt\"\r\n\tlocal USE_CHINADNS_NG = \"0\"\r\n\tlocal IS_SHUNT_NODE = uci:get(appname, TCP_NODE, \"protocol\") == \"_shunt\"\r\n\r\n\tif IS_SHUNT_NODE then\r\n\t\tREMOTE_FAKEDNS = uci:get(appname, TCP_NODE, \"fakedns\") or \"0\"\r\n\tend\r\n\r\n\tlocal list1 = {}\r\n\tlocal excluded_domain = {}\r\n\r\n\tlocal function log(...)\r\n\t\tif NO_LOGIC_LOG == \"1\" then\r\n\t\t\treturn\r\n\t\tend\r\n\t\tapi.log(...)\r\n\tend\r\n\r\n\tlocal function check_dns(domain, dns)\r\n\t\tif domain == \"\" or domain:find(\"#\") then\r\n\t\t\treturn false\r\n\t\tend\r\n\t\tif not dns then\r\n\t\t\treturn\r\n\t\tend\r\n\t\tfor k,v in ipairs(list1[domain].dns) do\r\n\t\t\tif dns == v then\r\n\t\t\t\treturn true\r\n\t\t\tend\r\n\t\tend\r\n\t\treturn false\r\n\tend\r\n\r\n\tlocal function check_ipset(domain, ipset)\r\n\t\tif domain == \"\" or domain:find(\"#\") then\r\n\t\t\treturn false\r\n\t\tend\r\n\t\tif not ipset then\r\n\t\t\treturn\r\n\t\tend\r\n\t\tfor k,v in ipairs(list1[domain].ipsets) do\r\n\t\t\tif ipset == v then\r\n\t\t\t\treturn true\r\n\t\t\tend\r\n\t\tend\r\n\t\treturn false\r\n\tend\r\n\r\n\tlocal function set_domain_address(domain, address)\r\n\t\tif domain == \"\" or domain:find(\"#\") then\r\n\t\t\treturn\r\n\t\tend\r\n\t\tif not list1[domain] then\r\n\t\t\tlist1[domain] = {\r\n\t\t\t\tdns = {},\r\n\t\t\t\tipsets = {}\r\n\t\t\t}\r\n\t\tend\r\n\t\tif not list1[domain].address then\r\n\t\t\tlist1[domain].address = address\r\n\t\tend\r\n\tend\r\n\r\n\tlocal function set_domain_dns(domain, dns)\r\n\t\tif domain == \"\" or domain:find(\"#\") then\r\n\t\t\treturn\r\n\t\tend\r\n\t\tif not dns then\r\n\t\t\treturn\r\n\t\tend\r\n\t\tif not list1[domain] then\r\n\t\t\tlist1[domain] = {\r\n\t\t\t\tdns = {},\r\n\t\t\t\tipsets = {}\r\n\t\t\t}\r\n\t\tend\r\n\t\tfor line in string.gmatch(dns, '[^' .. \",\" .. ']+') do\r\n\t\t\tif not check_dns(domain, line) then\r\n\t\t\t\ttable.insert(list1[domain].dns, line)\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\n\r\n\tlocal function set_domain_ipset(domain, ipset)\r\n\t\tif domain == \"\" or domain:find(\"#\") then\r\n\t\t\treturn\r\n\t\tend\r\n\t\tif not ipset then\r\n\t\t\treturn\r\n\t\tend\r\n\t\tif not list1[domain] then\r\n\t\t\tlist1[domain] = {\r\n\t\t\t\tdns = {},\r\n\t\t\t\tipsets = {}\r\n\t\t\t}\r\n\t\tend\r\n\t\tfor line in string.gmatch(ipset, '[^' .. \",\" .. ']+') do\r\n\t\t\tif not check_ipset(domain, line) then\r\n\t\t\t\ttable.insert(list1[domain].ipsets, line)\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\n\r\n\tlocal function add_excluded_domain(domain)\r\n\t\tif domain == \"\" or domain:find(\"#\") then\r\n\t\t\treturn\r\n\t\tend\r\n\t\texcluded_domain[domain] = true\r\n\tend\r\n\r\n\tlocal function check_excluded_domain(domain)\r\n\t\tif domain == \"\" or domain:find(\"#\") then\r\n\t\t\treturn false\r\n\t\tend\r\n\t\tif excluded_domain[domain] then\r\n\t\t\treturn true\r\n\t\tend\r\n\t\tlocal pos = domain:find(\".\", 1, true)\r\n\t\twhile pos do\r\n\t\t\tif excluded_domain[domain:sub(pos + 1)] then\r\n\t\t\t\treturn true\r\n\t\t\tend\r\n\t\t\tpos = domain:find(\".\", pos + 1, true)\r\n\t\tend\r\n\t\treturn false\r\n\tend\r\n\r\n\tlocal cache_text = \"\"\r\n\tlocal nodes_address_md5 = sys.exec(\"echo -n $(uci show passwall | grep '\\\\.address') | md5sum\")\r\n\tlocal new_rules = sys.exec(\"echo -n $(find /usr/share/passwall/rules -type f | xargs md5sum)\")\r\n\tlocal new_text = TMP_DNSMASQ_PATH .. DNSMASQ_CONF_FILE .. DEFAULT_DNS .. LOCAL_DNS .. TUN_DNS .. REMOTE_FAKEDNS .. USE_DEFAULT_DNS .. CHINADNS_DNS .. USE_DIRECT_LIST .. USE_PROXY_LIST .. USE_BLOCK_LIST .. USE_GFW_LIST .. CHN_LIST .. DEFAULT_PROXY_MODE .. NO_PROXY_IPV6 .. nodes_address_md5 .. new_rules .. NFTFLAG\r\n\tif fs.access(CACHE_TEXT_FILE) then\r\n\t\tfor line in io.lines(CACHE_TEXT_FILE) do\r\n\t\t\tcache_text = line\r\n\t\tend\r\n\tend\r\n\r\n\tif cache_text ~= new_text then\r\n\t\tapi.remove(CACHE_DNS_PATH .. \"*\")\r\n\tend\r\n\r\n\tlocal dnsmasq_default_dns\r\n\tif USE_DEFAULT_DNS ~= \"nil\" then\r\n\t\tif USE_DEFAULT_DNS == \"direct\" then\r\n\t\t\tdnsmasq_default_dns = LOCAL_DNS\r\n\t\tend\r\n\t\tif USE_DEFAULT_DNS == \"remote\" then\r\n\t\t\tdnsmasq_default_dns = TUN_DNS\r\n\t\tend\r\n\t\tif USE_DEFAULT_DNS == \"remote\" and CHN_LIST == \"direct\" then\r\n\t\t\tdnsmasq_default_dns = TUN_DNS\r\n\t\tend\r\n\tend\r\n\r\n\tlocal only_global\r\n\tif DEFAULT_PROXY_MODE == \"proxy\" and CHN_LIST == \"0\" and USE_GFW_LIST == \"0\" then\r\n\t\t--没有启用中国列表和GFW列表时\r\n\t\tdnsmasq_default_dns = TUN_DNS\r\n\t\tonly_global = 1\r\n\tend\r\n\tif USE_DEFAULT_DNS == \"chinadns_ng\" and CHINADNS_DNS ~= \"0\" then\r\n\t\tdnsmasq_default_dns = CHINADNS_DNS\r\n\t\tUSE_CHINADNS_NG = \"1\"\r\n\tend\r\n\r\n\tlocal setflag_4= (NFTFLAG == \"1\") and \"4#inet#passwall#\" or \"\"\r\n\tlocal setflag_6= (NFTFLAG == \"1\") and \"6#inet#passwall#\" or \"\"\r\n\r\n\tif not fs.access(CACHE_DNS_PATH) then\r\n\t\tfs.mkdir(CACHE_DNS_PATH)\r\n\r\n\t\t--屏蔽列表\r\n\t\tif USE_CHINADNS_NG == \"0\" then\r\n\t\t\tif USE_BLOCK_LIST == \"1\" then\r\n\t\t\t\tfor line in io.lines(\"/usr/share/passwall/rules/block_host\") do\r\n\t\t\t\t\tline = api.get_std_domain(line)\r\n\t\t\t\t\tif line ~= \"\" and not line:find(\"#\") and not line:find(\":\") then\r\n\t\t\t\t\t\tset_domain_address(line, \"\")\r\n\t\t\t\t\tend\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\r\n\t\tlocal fwd_dns\r\n\t\tlocal no_ipv6\r\n\r\n\t\t--始终用国内DNS解析节点域名\r\n\t\tif true then\r\n\t\t\tfwd_dns = LOCAL_DNS\r\n\t\t\tif USE_CHINADNS_NG == \"1\" then\r\n\t\t\t\tfwd_dns = nil\r\n\t\t\telse\r\n\t\t\t\tlocal sets = {\r\n\t\t\t\t\tsetflag_4 .. \"passwall_vps\",\r\n\t\t\t\t\tsetflag_6 .. \"passwall_vps6\"\r\n\t\t\t\t}\r\n\t\t\t\tlocal function process_address(address)\r\n\t\t\t\t\taddress = (address or \"\"):lower()\r\n\t\t\t\t\tif api.vps_domain_exclude(address) then return end\r\n\t\t\t\t\tif datatypes.hostname(address) then\r\n\t\t\t\t\t\tset_domain_dns(address, fwd_dns)\r\n\t\t\t\t\t\tset_domain_ipset(address, table.concat(sets, \",\"))\r\n\t\t\t\t\tend\r\n\t\t\t\tend\r\n\t\t\t\tuci:foreach(appname, \"nodes\", function(t)\r\n\t\t\t\t\tprocess_address(t.address)\r\n\t\t\t\t\tprocess_address(t.download_address)\r\n\t\t\t\tend)\r\n\t\t\t\tuci:foreach(appname, \"subscribe_list\", function(t)  --订阅链接\r\n\t\t\t\t\tlocal url, _ = api.get_domain_port_from_url(t.url or \"\")\r\n\t\t\t\t\tif url and url ~= \"\" then\r\n\t\t\t\t\t\tprocess_address(url)\r\n\t\t\t\t\tend\r\n\t\t\t\tend)\r\n\t\t\t\tlog(string.format(\"  - 节点列表中的域名(vpslist)：%s\", fwd_dns or \"默认\"))\r\n\t\t\tend\r\n\t\tend\r\n\r\n\t\t--直连（白名单）列表\r\n\t\tif USE_DIRECT_LIST == \"1\" then\r\n\t\t\tif fs.access(\"/usr/share/passwall/rules/direct_host\") then\r\n\t\t\t\tfwd_dns = LOCAL_DNS\r\n\t\t\t\tif USE_CHINADNS_NG == \"1\" then\r\n\t\t\t\t\tfwd_dns = nil\r\n\t\t\t\tend\r\n\t\t\t\tif fwd_dns then\r\n\t\t\t\t\tlocal sets = {\r\n\t\t\t\t\t\tsetflag_4 .. \"passwall_white\",\r\n\t\t\t\t\t\tsetflag_6 .. \"passwall_white6\"\r\n\t\t\t\t\t}\r\n\t\t\t\t\t--始终用国内DNS解析直连（白名单）列表\r\n\t\t\t\t\tfor line in io.lines(\"/usr/share/passwall/rules/direct_host\") do\r\n\t\t\t\t\t\tline = api.get_std_domain(line)\r\n\t\t\t\t\t\tif line ~= \"\" and not line:find(\"#\") and not line:find(\":\") then\r\n\t\t\t\t\t\t\tadd_excluded_domain(line)\r\n\t\t\t\t\t\t\tset_domain_dns(line, fwd_dns)\r\n\t\t\t\t\t\t\tset_domain_ipset(line, table.concat(sets, \",\"))\r\n\t\t\t\t\t\tend\r\n\t\t\t\t\tend\r\n\t\t\t\t\tlog(string.format(\"  - 域名白名单(whitelist)：%s\", fwd_dns or \"默认\"))\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\r\n\t\t--代理（黑名单）列表\r\n\t\tif USE_PROXY_LIST == \"1\" then\r\n\t\t\tif fs.access(\"/usr/share/passwall/rules/proxy_host\") then\r\n\t\t\t\tfwd_dns = TUN_DNS\r\n\t\t\t\tif USE_CHINADNS_NG == \"1\" then\r\n\t\t\t\t\tfwd_dns = nil\r\n\t\t\t\tend\r\n\t\t\t\tif fwd_dns then\r\n\t\t\t\t\tlocal set_name = \"passwall_black\"\r\n\t\t\t\t\tlocal set6_name = \"passwall_black6\"\r\n\t\t\t\t\tif FLAG ~= \"default\" then\r\n\t\t\t\t\t\tset_name = \"passwall_\" .. FLAG .. \"_black\"\r\n\t\t\t\t\t\tset6_name = \"passwall_\" .. FLAG .. \"_black6\"\r\n\t\t\t\t\tend\r\n\t\t\t\t\tlocal sets = {\r\n\t\t\t\t\t\tsetflag_4 .. set_name\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif NO_PROXY_IPV6 ~= \"1\" then\r\n\t\t\t\t\t\ttable.insert(sets, setflag_6 .. set6_name)\r\n\t\t\t\t\tend\r\n\t\t\t\t\tif REMOTE_FAKEDNS == \"1\" then\r\n\t\t\t\t\t\tsets = {}\r\n\t\t\t\t\tend\r\n\t\t\t\t\t--始终使用远程DNS解析代理（黑名单）列表\r\n\t\t\t\t\tfor line in io.lines(\"/usr/share/passwall/rules/proxy_host\") do\r\n\t\t\t\t\t\tline = api.get_std_domain(line)\r\n\t\t\t\t\t\tif line ~= \"\" and not line:find(\"#\") and not line:find(\":\") then\r\n\t\t\t\t\t\t\tadd_excluded_domain(line)\r\n\t\t\t\t\t\t\tif NO_PROXY_IPV6 == \"1\" then\r\n\t\t\t\t\t\t\t\tset_domain_address(line, \"::\")\r\n\t\t\t\t\t\t\tend\r\n\t\t\t\t\t\t\tset_domain_dns(line, fwd_dns)\r\n\t\t\t\t\t\t\tset_domain_ipset(line, table.concat(sets, \",\"))\r\n\t\t\t\t\t\tend\r\n\t\t\t\t\tend\r\n\t\t\t\t\tlog(string.format(\"  - 代理域名表(blacklist)：%s\", fwd_dns or \"默认\"))\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\r\n\t\t--GFW列表\r\n\t\tif USE_GFW_LIST == \"1\" then\r\n\t\t\tif fs.access(\"/usr/share/passwall/rules/gfwlist\") then\r\n\t\t\t\tfwd_dns = TUN_DNS\r\n\t\t\t\tif USE_CHINADNS_NG == \"1\" then\r\n\t\t\t\t\tfwd_dns = nil\r\n\t\t\t\tend\r\n\t\t\t\tif fwd_dns then\r\n\t\t\t\t\tlocal set_name = \"passwall_gfw\"\r\n\t\t\t\t\tlocal set6_name = \"passwall_gfw6\"\r\n\t\t\t\t\tif FLAG ~= \"default\" then\r\n\t\t\t\t\t\tset_name = \"passwall_\" .. FLAG .. \"_gfw\"\r\n\t\t\t\t\t\tset6_name = \"passwall_\" .. FLAG .. \"_gfw6\"\r\n\t\t\t\t\tend\r\n\t\t\t\t\tlocal sets = {\r\n\t\t\t\t\t\tsetflag_4 .. set_name\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif NO_PROXY_IPV6 ~= \"1\" then\r\n\t\t\t\t\t\ttable.insert(sets, setflag_6 .. set6_name)\r\n\t\t\t\t\tend\r\n\t\t\t\t\tif REMOTE_FAKEDNS == \"1\" then\r\n\t\t\t\t\t\tsets = {}\r\n\t\t\t\t\tend\r\n\t\t\t\t\tfor line in io.lines(\"/usr/share/passwall/rules/gfwlist\") do\r\n\t\t\t\t\t\tif line ~= \"\" and not line:find(\"#\") and not check_excluded_domain(line) then\r\n\t\t\t\t\t\t\tif NO_PROXY_IPV6 == \"1\" then\r\n\t\t\t\t\t\t\t\tset_domain_address(line, \"::\")\r\n\t\t\t\t\t\t\tend\r\n\t\t\t\t\t\t\tif dnsmasq_default_dns == fwd_dns then\r\n\t\t\t\t\t\t\t\tfwd_dns = nil\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\tset_domain_dns(line, fwd_dns)\r\n\t\t\t\t\t\t\tend\r\n\t\t\t\t\t\t\tset_domain_ipset(line, table.concat(sets, \",\"))\r\n\t\t\t\t\t\tend\r\n\t\t\t\t\tend\r\n\t\t\t\t\tlog(string.format(\"  - 防火墙域名表(gfwlist)：%s\", fwd_dns or \"默认\"))\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\r\n\t\t--中国列表\r\n\t\tif CHN_LIST ~= \"0\" then\r\n\t\t\tif fs.access(\"/usr/share/passwall/rules/chnlist\") then\r\n\t\t\t\tfwd_dns = nil\r\n\t\t\t\tif CHN_LIST == \"direct\" then\r\n\t\t\t\t\tfwd_dns = LOCAL_DNS\r\n\t\t\t\tend\r\n\t\t\t\tif CHN_LIST == \"proxy\" then\r\n\t\t\t\t\tfwd_dns = TUN_DNS\r\n\t\t\t\tend\r\n\t\t\t\tif USE_CHINADNS_NG == \"1\" then\r\n\t\t\t\t\tfwd_dns = nil\r\n\t\t\t\tend\r\n\t\t\t\tif fwd_dns then\r\n\t\t\t\t\tlocal sets = {\r\n\t\t\t\t\t\tsetflag_4 .. \"passwall_chn\",\r\n\t\t\t\t\t\tsetflag_6 .. \"passwall_chn6\"\r\n\t\t\t\t\t}\r\n\t\t\t\t\tif CHN_LIST == \"proxy\" then\r\n\t\t\t\t\t\tif NO_PROXY_IPV6 == \"1\" then\r\n\t\t\t\t\t\t\tsets = {\r\n\t\t\t\t\t\t\t\tsetflag_4 .. \"passwall_chn\"\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\tend\r\n\t\t\t\t\t\tif REMOTE_FAKEDNS == \"1\" then\r\n\t\t\t\t\t\t\tsets = {}\r\n\t\t\t\t\t\tend\r\n\t\t\t\t\tend\r\n\t\t\t\t\tfor line in io.lines(\"/usr/share/passwall/rules/chnlist\") do\r\n\t\t\t\t\t\tif line ~= \"\" and not line:find(\"#\") and not check_excluded_domain(line) then\r\n\t\t\t\t\t\t\tif CHN_LIST == \"proxy\" and NO_PROXY_IPV6 == \"1\" then\r\n\t\t\t\t\t\t\t\tset_domain_address(line, \"::\")\r\n\t\t\t\t\t\t\tend\r\n\t\t\t\t\t\t\tif dnsmasq_default_dns == fwd_dns then\r\n\t\t\t\t\t\t\t\tfwd_dns = nil\r\n\t\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\t\tset_domain_dns(line, fwd_dns)\r\n\t\t\t\t\t\t\tend\r\n\t\t\t\t\t\t\tset_domain_ipset(line, table.concat(sets, \",\"))\r\n\t\t\t\t\t\tend\r\n\t\t\t\t\tend\r\n\t\t\t\t\tlog(string.format(\"  - 中国域名表(chnroute)：%s\", fwd_dns or \"默认\"))\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\r\n\t\t--分流规则\r\n\t\tif IS_SHUNT_NODE and USE_CHINADNS_NG == \"0\" then\r\n\t\t\tlocal t = uci:get_all(appname, TCP_NODE)\r\n\t\t\tlocal default_node_id = t[\"default_node\"] or \"_direct\"\r\n\t\t\tuci:foreach(appname, \"shunt_rules\", function(s)\r\n\t\t\t\tlocal _node_id = t[s[\".name\"]]\r\n\t\t\t\tif _node_id and _node_id ~= \"_blackhole\" then\r\n\t\t\t\t\tif _node_id == \"_default\" then\r\n\t\t\t\t\t\t_node_id = default_node_id\r\n\t\t\t\t\tend\r\n\r\n\t\t\t\t\tfwd_dns = nil\r\n\t\t\t\t\tno_ipv6 = nil\r\n\r\n\t\t\t\t\tlocal sets = {}\r\n\r\n\t\t\t\t\tif _node_id == \"_direct\" then\r\n\t\t\t\t\t\tfwd_dns = LOCAL_DNS\r\n\t\t\t\t\t\tif USE_DIRECT_LIST == \"1\" then\r\n\t\t\t\t\t\t\ttable.insert(sets, setflag_4 .. \"passwall_white\")\r\n\t\t\t\t\t\t\ttable.insert(sets, setflag_6 .. \"passwall_white6\")\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tlocal set_name = \"passwall_shunt\"\r\n\t\t\t\t\t\t\tlocal set6_name = \"passwall_shunt6\"\r\n\t\t\t\t\t\t\tif FLAG ~= \"default\" then\r\n\t\t\t\t\t\t\t\tset_name = \"passwall_\" .. FLAG .. \"_shunt\"\r\n\t\t\t\t\t\t\t\tset6_name = \"passwall_\" .. FLAG .. \"_shunt6\"\r\n\t\t\t\t\t\t\tend\r\n\t\t\t\t\t\t\ttable.insert(sets, setflag_4 .. set_name)\r\n\t\t\t\t\t\t\ttable.insert(sets, setflag_6 .. set6_name)\r\n\t\t\t\t\t\tend\r\n\t\t\t\t\telse\r\n\t\t\t\t\t\tlocal set_name = \"passwall_shunt\"\r\n\t\t\t\t\t\tlocal set6_name = \"passwall_shunt6\"\r\n\t\t\t\t\t\tif FLAG ~= \"default\" then\r\n\t\t\t\t\t\t\tset_name = \"passwall_\" .. FLAG .. \"_shunt\"\r\n\t\t\t\t\t\t\tset6_name = \"passwall_\" .. FLAG .. \"_shunt6\"\r\n\t\t\t\t\t\tend\r\n\t\t\t\t\t\tfwd_dns = TUN_DNS\r\n\t\t\t\t\t\ttable.insert(sets, setflag_4 .. set_name)\r\n\t\t\t\t\t\tif NO_PROXY_IPV6 ~= \"1\" then\r\n\t\t\t\t\t\t\ttable.insert(sets, setflag_6 .. set6_name)\r\n\t\t\t\t\t\telse\r\n\t\t\t\t\t\t\tno_ipv6 = true\r\n\t\t\t\t\t\tend\r\n\t\t\t\t\t\tif not only_global then\r\n\t\t\t\t\t\t\tif REMOTE_FAKEDNS == \"1\" then\r\n\t\t\t\t\t\t\t\tsets = {}\r\n\t\t\t\t\t\t\tend\r\n\t\t\t\t\t\tend\r\n\t\t\t\t\tend\r\n\r\n\t\t\t\t\tlocal domain_list = s.domain_list or \"\"\r\n\t\t\t\t\tfor line in string.gmatch(domain_list, \"[^\\r\\n]+\") do\r\n\t\t\t\t\t\tif line ~= \"\" and not line:find(\"#\") and not line:find(\"regexp:\") and not line:find(\"geosite:\") and not line:find(\"ext:\") then\r\n\t\t\t\t\t\t\tif line:find(\"domain:\") or line:find(\"full:\") then\r\n\t\t\t\t\t\t\t\tline = string.match(line, \":([^:]+)$\")\r\n\t\t\t\t\t\t\tend\r\n\t\t\t\t\t\t\tline = api.get_std_domain(line)\r\n\t\t\t\t\t\t\tadd_excluded_domain(line)\r\n\r\n\t\t\t\t\t\t\tif no_ipv6 then\r\n\t\t\t\t\t\t\t\tset_domain_address(line, \"::\")\r\n\t\t\t\t\t\t\tend\r\n\t\t\t\t\t\t\tset_domain_dns(line, fwd_dns)\r\n\t\t\t\t\t\t\tset_domain_ipset(line, table.concat(sets, \",\"))\r\n\t\t\t\t\t\tend\r\n\t\t\t\t\tend\r\n\t\t\t\t\tif _node_id ~= \"_direct\" then\r\n\t\t\t\t\t\tlog(string.format(\"  - Sing-Box/Xray分流规则(%s)：%s\", s.remarks, fwd_dns or \"默认\"))\r\n\t\t\t\t\tend\r\n\t\t\t\tend\r\n\t\t\tend)\r\n\t\telseif only_global == 1 and NO_PROXY_IPV6 == \"1\" then\r\n\t\t\t--节点：固定节点\r\n\t\t\t--代理模式：全局模式\r\n\t\t\t--过滤代理域名 IPv6：启用\r\n\t\t\t--禁止解析所有IPv6记录\r\n\t\t\tlist1[\"#\"] = {\r\n\t\t\t\tdns = {},\r\n\t\t\t\tipsets = {},\r\n\t\t\t\taddress = \"::\"\r\n\t\t\t}\r\n\t\tend\r\n\r\n\t\tif list1 and next(list1) then\r\n\t\t\tlocal address_out = io.open(CACHE_DNS_PATH .. \"/000-address.conf\", \"a\")\r\n\t\t\tlocal server_out = io.open(CACHE_DNS_PATH .. \"/001-server.conf\", \"a\")\r\n\t\t\tlocal ipset_out = io.open(CACHE_DNS_PATH .. \"/ipset.conf\", \"a\")\r\n\t\t\tlocal set_name = \"ipset\"\r\n\t\t\tif NFTFLAG == \"1\" then\r\n\t\t\t\tset_name = \"nftset\"\r\n\t\t\tend\r\n\t\t\tfor key, value in pairs(list1) do\r\n\t\t\t\tif value.address then\r\n\t\t\t\t\tlocal domain = \".\" .. key\r\n\t\t\t\t\tif key == \"#\" then\r\n\t\t\t\t\t\tdomain = key\r\n\t\t\t\t\tend\r\n\t\t\t\t\taddress_out:write(string.format(\"address=/%s/%s\", domain, value.address) .. \"\\n\")\r\n\t\t\t\tend\r\n\t\t\t\tif value.dns and #value.dns > 0 then\r\n\t\t\t\t\tfor i, dns in ipairs(value.dns) do\r\n\t\t\t\t\t\tserver_out:write(string.format(\"server=/.%s/%s\", key, dns) .. \"\\n\")\r\n\t\t\t\t\tend\r\n\t\t\t\tend\r\n\t\t\t\tif value.ipsets and #value.ipsets > 0 then\r\n\t\t\t\t\tlocal ipsets_str = \"\"\r\n\t\t\t\t\tfor i, ipset in ipairs(value.ipsets) do\r\n\t\t\t\t\t\tipsets_str = ipsets_str .. ipset .. \",\"\r\n\t\t\t\t\tend\r\n\t\t\t\t\tipsets_str = ipsets_str:sub(1, #ipsets_str - 1)\r\n\t\t\t\t\tipset_out:write(string.format(\"%s=/.%s/%s\", set_name, key, ipsets_str) .. \"\\n\")\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\t\taddress_out:close()\r\n\t\t\tserver_out:close()\r\n\t\t\tipset_out:close()\r\n\t\tend\r\n\r\n\t\tlocal f_out = io.open(CACHE_TEXT_FILE, \"a\")\r\n\t\tf_out:write(new_text)\r\n\t\tf_out:close()\r\n\tend\r\n\r\n\tif USE_CHINADNS_NG == \"0\" then\r\n\t\tapi.remove(TMP_DNSMASQ_PATH)\r\n\t\tfs.symlink(CACHE_DNS_PATH, TMP_DNSMASQ_PATH)\r\n\tend\r\n\r\n\tif DNSMASQ_CONF_FILE ~= \"nil\" then\r\n\t\tlocal conf_lines = {}\r\n\t\tif LISTEN_PORT then\r\n\t\t\t--Copy dnsmasq instance\r\n\t\t\tconf_lines = copy_instance({[\"-LISTEN_PORT\"] = LISTEN_PORT, [\"-TMP_DNSMASQ_PATH\"] = TMP_DNSMASQ_PATH, [\"-return\"] = \"1\"})\r\n\t\t\t--dhcp.leases to hosts\r\n\t\t\tlocal hosts = \"/tmp/etc/\" .. appname .. \"_tmp/dhcp-hosts\"\r\n\t\t\tsys.call(\"touch \" .. hosts)\r\n\t\t\ttinsert(conf_lines, \"addn-hosts=\" .. hosts)\r\n\t\telse\r\n\t\t\t--Modify the default dnsmasq service\r\n\t\tend\r\n\t\tif USE_CHINADNS_NG == \"0\" then\r\n\t\t\ttinsert(conf_lines, string.format(\"conf-dir=%s\", TMP_DNSMASQ_PATH))\r\n\t\tend\r\n\t\tif dnsmasq_default_dns then\r\n\t\t\tfor s in string.gmatch(dnsmasq_default_dns, '[^' .. \",\" .. ']+') do\r\n\t\t\t\ttinsert(conf_lines, string.format(\"server=%s\", s))\r\n\t\t\tend\r\n\t\t\ttinsert(conf_lines, \"all-servers\")\r\n\t\t\ttinsert(conf_lines, \"no-poll\")\r\n\t\t\ttinsert(conf_lines, \"no-resolv\")\r\n\t\t\tif USE_CHINADNS_NG == \"0\" then\r\n\t\t\t\tlog(string.format(\"  - 默认：%s\", dnsmasq_default_dns))\r\n\t\t\tend\r\n\r\n\t\t\tif FLAG == \"default\" then\r\n\t\t\t\tapi.set_cache_var(\"DEFAULT_DNS\", DEFAULT_DNS)\r\n\t\t\tend\r\n\t\tend\r\n\t\tif #conf_lines > 0 then\r\n\t\t\tlocal conf_out = io.open(DNSMASQ_CONF_FILE, \"a\")\r\n\t\t\tconf_out:write(table.concat(conf_lines, \"\\n\"))\r\n\t\t\tconf_out:write(\"\\n\")\r\n\t\t\tconf_out:close()\r\n\t\tend\r\n\tend\r\n\r\n\tif USE_CHINADNS_NG == \"0\" then\r\n\t\tlog(\"  - PassWall必须依赖于Dnsmasq，如果你自行配置了错误的DNS流程，将会导致域名(直连/代理域名)分流失效！！！\")\r\n\tend\r\nend\r\n\r\n_G.stretch = stretch\r\n_G.restart = restart\r\n_G.logic_restart = logic_restart\r\n_G.copy_instance = copy_instance\r\n_G.add_rule = add_rule\r\n\r\nif arg[1] then\r\n\tlocal func =_G[arg[1]]\r\n\tif func then\r\n\t\tfunc(api.get_function_args(arg))\r\n\tend\r\nend\r\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/helper_smartdns.sh",
    "content": "#!/bin/sh\n\nrestart() {\n\tlocal no_log\n\teval_set_val $@\n\t_LOG_FILE=$LOG_FILE\n\t[ -n \"$no_log\" ] && LOG_FILE=\"/dev/null\"\n\trm -rf /tmp/smartdns.cache\n\t/etc/init.d/smartdns reload >/dev/null 2>&1\n\tLOG_FILE=${_LOG_FILE}\n}\n\ndel() {\n\trm -rf /tmp/etc/smartdns/passwall.conf\n\tsed -i \"/passwall/d\" /etc/smartdns/custom.conf >/dev/null 2>&1\n\trm -rf /tmp/smartdns.cache\n\t/etc/init.d/smartdns reload >/dev/null 2>&1\n}\n\narg1=$1\nshift\ncase $arg1 in\ndel)\n\tdel $@\n\t;;\nrestart)\n\trestart $@\n\t;;\n*) ;;\nesac\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/helper_smartdns_add.lua",
    "content": "local api = require \"luci.passwall.api\"\nlocal appname = api.appname\n\nlocal var = api.get_args(arg)\nlocal FLAG = var[\"-FLAG\"]\nlocal SMARTDNS_CONF = var[\"-SMARTDNS_CONF\"]\nlocal LOCAL_GROUP = var[\"-LOCAL_GROUP\"]\nlocal REMOTE_GROUP = var[\"-REMOTE_GROUP\"]\nlocal REMOTE_PROXY_SERVER = var[\"-REMOTE_PROXY_SERVER\"]\nlocal USE_DEFAULT_DNS = var[\"-USE_DEFAULT_DNS\"]\nlocal REMOTE_DNS = var[\"-REMOTE_DNS\"]\nlocal TUN_DNS = var[\"-TUN_DNS\"]\nlocal DNS_MODE = var[\"-DNS_MODE\"]\nlocal REMOTE_FAKEDNS = var[\"-REMOTE_FAKEDNS\"]\nlocal TCP_NODE = var[\"-TCP_NODE\"]\nlocal USE_DIRECT_LIST = var[\"-USE_DIRECT_LIST\"]\nlocal USE_PROXY_LIST = var[\"-USE_PROXY_LIST\"]\nlocal USE_BLOCK_LIST = var[\"-USE_BLOCK_LIST\"]\nlocal USE_GFW_LIST = var[\"-USE_GFW_LIST\"]\nlocal CHN_LIST = var[\"-CHN_LIST\"]\nlocal DEFAULT_PROXY_MODE = var[\"-DEFAULT_PROXY_MODE\"]\nlocal NO_PROXY_IPV6 = var[\"-NO_PROXY_IPV6\"]\nlocal NO_LOGIC_LOG = var[\"-NO_LOGIC_LOG\"]\nlocal NFTFLAG = var[\"-NFTFLAG\"]\nlocal SUBNET = var[\"-SUBNET\"]\nlocal LISTEN_PORT = var[\"-LISTEN_PORT\"]\nlocal LOCAL_PORT = var[\"-LOCAL_PORT\"]\n\nlocal uci = api.uci\nlocal sys = api.sys\nlocal fs = api.fs\nlocal datatypes = api.datatypes\n\nlocal TMP_PATH = \"/tmp/etc/\" .. appname\nlocal TMP_ACL_PATH = TMP_PATH .. \"/acl\"\nlocal RULES_PATH = \"/usr/share/\" .. appname .. \"/rules\"\nlocal FLAG_PATH = TMP_ACL_PATH .. \"/\" .. FLAG\nlocal TMP_CONF_FILE = FLAG_PATH .. \"/smartdns.conf\"\nlocal config_lines = {}\nlocal tmp_lines = {}\nlocal USE_GEOVIEW = uci:get(appname, \"@global_rules[0]\", \"enable_geoview\")\nlocal IS_SHUNT_NODE = uci:get(appname, TCP_NODE, \"protocol\") == \"_shunt\"\n\nif IS_SHUNT_NODE then\n\tREMOTE_FAKEDNS = uci:get(appname, TCP_NODE, \"fakedns\") or \"0\"\nend\n\nlocal function log(...)\n\tif NO_LOGIC_LOG == \"1\" then\n\t\treturn\n\tend\n\tapi.log(...)\nend\n\nlocal function is_file_nonzero(path)\n\tif path and #path > 1 then\n\t\tif sys.exec('[ -s \"%s\" ] && echo -n 1' % path) == \"1\" then\n\t\t\treturn true\n\t\tend\n\tend\n\treturn nil\nend\n\nlocal function insert_unique(dest_table, value, lookup_table)\n\tif not lookup_table[value] then\n\t\ttable.insert(dest_table, value)\n\t\tlookup_table[value] = true\n\tend\nend\n\nlocal function merge_array(array1, array2)\n\tfor i, line in ipairs(array2) do\n\t\ttable.insert(array1, #array1 + 1, line)\n\tend\nend\n\nlocal function insert_array_before(array1, array2, target) --将array2插入到array1的target前面，target不存在则追加\n\tfor i, line in ipairs(array1) do\n\t\tif line == target then\n\t\t\tfor j = #array2, 1, -1 do\n\t\t\t\ttable.insert(array1, i, array2[j])\n\t\t\tend\n\t\t\treturn\n\t\tend\n\tend\n\tmerge_array(array1, array2)\nend\n\nlocal function insert_array_after(array1, array2, target) --将array2插入到array1的target后面，target不存在则追加\n\tfor i, line in ipairs(array1) do\n\t\tif line == target then\n\t\t\tfor j = 1, #array2 do\n\t\t\t\ttable.insert(array1, i + j, array2[j])\n\t\t\tend\n\t\t\treturn\n\t\tend\n\tend\n\tmerge_array(array1, array2)\nend\n\nlocal function get_geosite(list_arg, out_path)\n\tlocal geosite_path = uci:get(appname, \"@global_rules[0]\", \"v2ray_location_asset\") or \"/usr/share/v2ray/\"\n\tgeosite_path = geosite_path:match(\"^(.*)/\") .. \"/geosite.dat\"\n\tif not is_file_nonzero(geosite_path) then return 1 end\n\tlocal bin = api.finded_com(\"geoview\")\n\tif bin and list_arg and out_path then\n\t\tlocal cmd = string.format(\"%q -type geosite -append=true -input %q -list %q -output %q -lowmem=true\",\n\t\t\tbin, geosite_path, list_arg, out_path)\n\t\tsys.call(cmd)\n\t\treturn 0\n\tend\n\treturn 1\nend\n\nif not fs.access(FLAG_PATH) then\n\tfs.mkdir(FLAG_PATH)\nend\n\nlocal LOCAL_EXTEND_ARG = \"\"\nif LOCAL_GROUP == \"null\" or LOCAL_GROUP == \"\" then\n\tlog(\"  * 注意：SmartDNS 国内分组名未设置，DNS 将无法正常工作！！！\")\n\tos.exit(1)\nelse\n\t--从smartdns配置中读取参数\n\tlocal custom_conf_path = \"/etc/smartdns/custom.conf\"\n\tlocal options = {\n\t\t{key = \"dualstack_ip_selection\", config_key = \"dualstack-ip-selection\", yes_no = true, arg_yes = \"-d yes\", arg_no = \"-d no\", default = \"yes\"},\n\t\t{key = \"speed_check_mode\", config_key = \"speed-check-mode\", prefix = \"-c \", default = \"ping,tcp:80,tcp:443\"},\n\t\t{key = \"serve_expired\", config_key = \"serve-expired\", yes_no = true, arg_yes = \"\", arg_no = \"-no-serve-expired\", default = \"yes\"},\n\t\t{key = \"response_mode\", config_key = \"response-mode\", prefix = \"-r \", default = \"first-ping\"},\n\t\t{key = \"rr_ttl\", config_key = \"rr-ttl\", prefix = \"-rr-ttl \"},\n\t\t{key = \"rr_ttl_min\", config_key = \"rr-ttl-min\", prefix = \"-rr-ttl-min \"},\n\t\t{key = \"rr_ttl_max\", config_key = \"rr-ttl-max\", prefix = \"-rr-ttl-max \"},\n\t\t{key = \"rr_ttl_reply_max\", config_key = \"rr-ttl-reply-max\", prefix = \"-rr-ttl-reply-max \"},\n\t\t{\n\t\t\tkey = \"force_aaaa_soa\",\n\t\t\tconfig_key = \"force-qtype-SOA\",\n\t\t\tprefix = \"-address \",\n\t\t\tget_value = function(custom_config)\n\t\t\t\tlocal soa = custom_config[\"force-qtype-SOA\"]\n\t\t\t\treturn ((soa and soa:match(\"(^|%s)28(%s|$)\"))\n\t\t\t\t\tor custom_config[\"force-AAAA-SOA\"] == \"yes\"\n\t\t\t\t\tor uci:get(\"smartdns\", \"@smartdns[0]\", \"force_aaaa_soa\") == \"1\")\n\t\t\t\t\tand \"#6\" or \"-6\"\n\t\t\tend\n\t\t}\n\t}\n\t-- 从 custom.conf 中读取值，以最后出现的值为准\n\tlocal custom_config = {}\n\tlocal f_in = io.open(custom_conf_path, \"r\")\n\tif f_in then\n\t\tfor line in f_in:lines() do\n\t\t\tline = api.trim(line)\n\t\t\tif line ~= \"\" and not line:match(\"^#\") then\n\t\t\t\tlocal param, value = line:match(\"^(%S+)%s+(.+)$\")\n\t\t\t\tif param and value then custom_config[param] = value end\n\t\t\tend\n\t\tend\n\t\tf_in:close()\n\tend\n\t-- 从 smartdns 配置中读取值，优先级以 custom.conf 为准\n\tfor _, opt in ipairs(options) do\n\t\tlocal val\n\t\tif opt.get_value then\n\t\t\tval = opt.get_value(custom_config)\n\t\telse\n\t\t\tval = custom_config[opt.config_key] or uci:get(\"smartdns\", \"@smartdns[0]\", opt.key) or opt.default\n\t\tend\n\t\tif val == \"yes\" then val = \"1\" elseif val == \"no\" then val = \"0\" end\n\t\tif opt.yes_no then\n\t\t\tlocal arg = (val == \"1\" and opt.arg_yes or opt.arg_no)\n\t\t\tif arg and arg ~= \"\" then\n\t\t\t\tLOCAL_EXTEND_ARG = LOCAL_EXTEND_ARG .. (LOCAL_EXTEND_ARG ~= \"\" and \" \" or \"\") .. arg\n\t\t\tend\n\t\telse\n\t\t\tif val and (not opt.value or (opt.invert and val ~= opt.value) or (not opt.invert and val == opt.value)) then\n\t\t\t\tLOCAL_EXTEND_ARG = LOCAL_EXTEND_ARG .. (LOCAL_EXTEND_ARG ~= \"\" and \" \" or \"\") .. (opt.prefix or \"\") .. (opt.arg or val)\n\t\t\tend\n\t\tend\n\tend\nend\n\nif not REMOTE_GROUP or REMOTE_GROUP == \"nil\" then\n\tREMOTE_GROUP = \"passwall_proxy\"\n\tif REMOTE_DNS then\n\t\tREMOTE_DNS = REMOTE_DNS:gsub(\"#\", \":\")\n\tend\n\tsys.call('sed -i \"/passwall/d\" /etc/smartdns/custom.conf >/dev/null 2>&1')\nend\n\nlocal force_https_soa = uci:get(appname, \"@global[0]\", \"force_https_soa\") or 0\nlocal proxy_server_name = \"passwall-proxy-server\"\nconfig_lines = {\n\ttonumber(LISTEN_PORT) ~= 0 and \"bind [::]:\" .. LISTEN_PORT .. \"@lo\" or \"\",\n\t(tonumber(LOCAL_PORT) ~= 0 and LOCAL_GROUP) and \"bind [::]:\" .. LOCAL_PORT .. \"@lo -group \" ..  LOCAL_GROUP or \"\",\n\ttonumber(force_https_soa) == 1 and \"force-qtype-SOA 65\" or \"force-qtype-SOA -,65\",\n\t\"server 114.114.114.114 -bootstrap-dns\",\n\tis_file_nonzero(\"/etc/hosts\") and \"hosts-file /etc/hosts\" or \"\",\n\tDNS_MODE == \"socks\" and string.format(\"proxy-server socks5://%s -name %s\", REMOTE_PROXY_SERVER, proxy_server_name) or \"\"\n}\nif DNS_MODE == \"socks\" then\n\tfor w in string.gmatch(REMOTE_DNS, '[^|]+') do\n\t\tlocal server_dns = api.trim(w)\n\t\tlocal server_param\n\n\t\tlocal dnsType = string.match(server_dns, \"^(.-)://\")\n\t\tdnsType = dnsType and string.lower(dnsType) or nil\n\t\tlocal dnsServer = string.match(server_dns, \"://(.+)\") or server_dns\n\n\t\tif dnsType and dnsType ~= \"\" and dnsType ~= \"udp\" then\n\t\t\tif dnsType == \"tcp\" then\n\t\t\t\tserver_param = \"server-tcp \" .. dnsServer\n\t\t\telseif dnsType == \"tls\" then\n\t\t\t\tserver_param = \"server-tls \" .. dnsServer\n\t\t\telseif dnsType == \"quic\" then\n\t\t\t\tserver_param = \"server-quic \" .. dnsServer\n\t\t\telseif dnsType == \"https\" or dnsType == \"h3\" then\n\t\t\t\tlocal http_host = nil\n\t\t\t\tlocal url = w\n\t\t\t\tlocal port = 443\n\t\t\t\tlocal s = api.split(w, \",\")\n\t\t\t\tif s and #s > 1 then\n\t\t\t\t\turl = s[1]\n\t\t\t\t\tlocal dns_ip = s[2]\n\t\t\t\t\tlocal host_port = api.get_domain_from_url(s[1])\n\t\t\t\t\tif host_port and #host_port > 0 then\n\t\t\t\t\t\thttp_host = host_port\n\t\t\t\t\t\tlocal s2 = api.split(host_port, \":\")\n\t\t\t\t\t\tif s2 and #s2 > 1 then\n\t\t\t\t\t\t\thttp_host = s2[1]\n\t\t\t\t\t\t\tport = s2[2]\n\t\t\t\t\t\tend \n\t\t\t\t\t\turl = url:gsub(http_host, dns_ip)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tserver_dns = url\n\t\t\t\tif http_host then\n\t\t\t\t\tserver_dns = server_dns .. \" -http-host \" .. http_host\n\t\t\t\tend\n\t\t\t\tserver_param = (dnsType == \"https\" and \"server-https \" or \"server-h3 \") .. server_dns\n\t\t\tend\n\t\telse\n\t\t\tserver_param = \"server \" .. dnsServer\n\n\t\tend\n\n\t\tif not api.is_local_ip(w) then\n\t\t\tserver_param = server_param .. \" -proxy \" .. proxy_server_name\n\t\tend\n\n\t\tserver_param = server_param .. \" -group \" .. REMOTE_GROUP .. \" -exclude-default-group\"\n\t\tif SUBNET and SUBNET ~= \"\" and SUBNET ~= \"0\" then\n\t\t\tserver_param = server_param .. \" -subnet \" .. SUBNET\n\t\tend\n\t\ttable.insert(config_lines, server_param)\n\tend\n\tif not IS_SHUNT_NODE then REMOTE_FAKEDNS = \"0\" end\nelse\n\tlocal server_param = string.format(\"server %s -group %s -exclude-default-group\", TUN_DNS:gsub(\"#\", \":\"), REMOTE_GROUP)\n\ttable.insert(config_lines, server_param)\n\tlog(\"  - \" .. DNS_MODE:gsub(\"^%l\",string.upper) .. \" \" .. TUN_DNS .. \" -> \" .. REMOTE_GROUP)\nend\n\n--设置默认 DNS 分组(托底组)\nlocal DEFAULT_DNS_GROUP = (USE_DEFAULT_DNS == \"direct\" and LOCAL_GROUP) or\n                          (USE_DEFAULT_DNS == \"remote\" and REMOTE_GROUP)\nlocal only_global = (DEFAULT_PROXY_MODE == \"proxy\" and CHN_LIST == \"0\" and USE_GFW_LIST == \"0\") and 1 --没有启用中国列表和GFW列表时(全局)\nif only_global == 1 then\n\tDEFAULT_DNS_GROUP = REMOTE_GROUP\nend\nif DEFAULT_DNS_GROUP then\n\tlocal domain_rules_str = \"domain-rules /./ -nameserver \" .. DEFAULT_DNS_GROUP\n\tif DEFAULT_DNS_GROUP == REMOTE_GROUP then\n\t\tdomain_rules_str = domain_rules_str .. \" -speed-check-mode none -d no -no-serve-expired\"\n\t\tdomain_rules_str = domain_rules_str .. \" -address \" .. (NO_PROXY_IPV6 == \"1\" and \"#6\" or \"-6\")\n\telseif DEFAULT_DNS_GROUP == LOCAL_GROUP then\n\t\tdomain_rules_str = domain_rules_str .. (LOCAL_EXTEND_ARG ~= \"\" and \" \" .. LOCAL_EXTEND_ARG or \"\")\n\tend\n\ttable.insert(config_lines, domain_rules_str)\nend\n\nlocal setflag = (NFTFLAG == \"1\") and \"inet#passwall#\" or \"\"\nlocal set_type = (NFTFLAG == \"1\") and \"-nftset\" or \"-ipset\"\n\n--预设排序标签(越往后优先级越高)\nfor i = 1, 8 do\n\ttable.insert(config_lines, \"#--\" .. i)\nend\n\n--屏蔽列表\nlocal file_block_host = TMP_ACL_PATH .. \"/block_host\"\nif USE_BLOCK_LIST == \"1\" and not fs.access(file_block_host) then\n\tlocal block_domain, lookup_block_domain = {}, {}\n\tlocal geosite_arg = \"\"\n\tfor line in io.lines(RULES_PATH .. \"/block_host\") do\n\t\tif not line:find(\"#\") and line:find(\"geosite:\") then\n\t\t\tline = string.match(line, \":([^:]+)$\")\n\t\t\tgeosite_arg = geosite_arg .. (geosite_arg ~= \"\" and \",\" or \"\") .. line\n\t\telse\n\t\t\tline = api.get_std_domain(line)\n\t\t\tif line ~= \"\" and not line:find(\"#\") then\n\t\t\t\tinsert_unique(block_domain, line, lookup_block_domain)\n\t\t\tend\n\t\tend\n\tend\n\tif #block_domain > 0 then\n\t\tlocal f_out = io.open(file_block_host, \"w\")\n\t\tfor i = 1, #block_domain do\n\t\t\tf_out:write(block_domain[i] .. \"\\n\")\n\t\tend\n\t\tf_out:close()\n\tend\n\tif USE_GEOVIEW == \"1\" and geosite_arg ~= \"\" and api.is_finded(\"geoview\") then\n\t\tif get_geosite(geosite_arg, file_block_host) == 0 then\n\t\t\tlog(\"  * 解析[屏蔽列表] Geosite 到屏蔽域名表(blocklist)完成\")\n\t\telse\n\t\t\tlog(\"  * 解析[屏蔽列表] Geosite 到屏蔽域名表(blocklist)失败！\")\n\t\tend\n\tend\nend\nif USE_BLOCK_LIST == \"1\" and is_file_nonzero(file_block_host) then\n\tlocal domain_set_name = \"passwall-block\"\n\ttmp_lines = {\n\t\tstring.format(\"domain-set -name %s -file %s\", domain_set_name, file_block_host),\n\t\tstring.format(\"domain-rules /domain-set:%s/ -a #\", domain_set_name)\n\t}\n\tinsert_array_after(config_lines, tmp_lines, \"#--7\")\nend\n\n--始终用国内DNS解析节点域名\nlocal file_vpslist = TMP_ACL_PATH .. \"/vpslist\"\nif not is_file_nonzero(file_vpslist) then\n\tlocal f_out = io.open(file_vpslist, \"w\")\n\tlocal written_domains = {}\n\tlocal function process_address(address)\n\t\taddress = (address or \"\"):lower()\n\t\tif api.vps_domain_exclude(address) then return end\n\t\tif datatypes.hostname(address) and not written_domains[address] then\n\t\t\tf_out:write(address .. \"\\n\")\n\t\t\twritten_domains[address] = true\n\t\tend\n\tend\n\tuci:foreach(appname, \"nodes\", function(t)\n\t\tprocess_address(t.address)\n\t\tprocess_address(t.download_address)\n\tend)\n\tuci:foreach(appname, \"subscribe_list\", function(t)  --订阅链接\n\t\tlocal url, _ = api.get_domain_port_from_url(t.url or \"\")\n\t\tif url and url ~= \"\" then\n\t\t\tprocess_address(url)\n\t\tend\n\tend)\n\tf_out:close()\nend\nif is_file_nonzero(file_vpslist) then\n\tlocal domain_set_name = \"passwall-vpslist\"\n\ttmp_lines = {\n\t\tstring.format(\"domain-set -name %s -file %s\", domain_set_name, file_vpslist)\n\t}\n\tlocal sets = {\n\t\t\"#4:\" .. setflag .. \"passwall_vps\",\n\t\t\"#6:\" .. setflag .. \"passwall_vps6\"\n\t}\n\tlocal domain_rules_str = string.format('domain-rules /domain-set:%s/ %s', domain_set_name, LOCAL_GROUP and \"-nameserver \" .. LOCAL_GROUP or \"\")\n\tdomain_rules_str = domain_rules_str .. \" \" .. set_type .. \" \" .. table.concat(sets, \",\")\n\tdomain_rules_str = domain_rules_str .. (LOCAL_EXTEND_ARG ~= \"\" and \" \" .. LOCAL_EXTEND_ARG or \"\")\n\ttable.insert(tmp_lines, domain_rules_str)\n\tinsert_array_after(config_lines, tmp_lines, \"#--8\")\n\tlog(string.format(\"  - 节点列表中的域名(vpslist)使用分组：%s\", LOCAL_GROUP or \"默认\"))\nend\n\n--直连（白名单）列表\nlocal file_direct_host = TMP_ACL_PATH .. \"/direct_host\"\nif USE_DIRECT_LIST == \"1\" and not fs.access(file_direct_host) then\n\tlocal direct_domain, lookup_direct_domain = {}, {}\n\tlocal geosite_arg = \"\"\n\tfor line in io.lines(RULES_PATH .. \"/direct_host\") do\n\t\tif not line:find(\"#\") and line:find(\"geosite:\") then\n\t\t\tline = string.match(line, \":([^:]+)$\")\n\t\t\tgeosite_arg = geosite_arg .. (geosite_arg ~= \"\" and \",\" or \"\") .. line\n\t\telse\n\t\t\tline = api.get_std_domain(line)\n\t\t\tif line ~= \"\" and not line:find(\"#\") then\n\t\t\t\tinsert_unique(direct_domain, line, lookup_direct_domain)\n\t\t\tend\n\t\tend\n\tend\n\tif #direct_domain > 0 then\n\t\tlocal f_out = io.open(file_direct_host, \"w\")\n\t\tfor i = 1, #direct_domain do\n\t\t\tf_out:write(direct_domain[i] .. \"\\n\")\n\t\tend\n\t\tf_out:close()\n\tend\n\tif USE_GEOVIEW == \"1\" and geosite_arg ~= \"\" and api.is_finded(\"geoview\") then\n\t\tif get_geosite(geosite_arg, file_direct_host) == 0 then\n\t\t\tlog(\"  * 解析[直连列表] Geosite 到域名白名单(whitelist)完成\")\n\t\telse\n\t\t\tlog(\"  * 解析[直连列表] Geosite 到域名白名单(whitelist)失败！\")\n\t\tend\n\tend\nend\nif USE_DIRECT_LIST == \"1\" and is_file_nonzero(file_direct_host) then\n\tlocal domain_set_name = \"passwall-directlist\"\n\ttmp_lines = {\n\t\tstring.format(\"domain-set -name %s -file %s\", domain_set_name, file_direct_host)\n\t}\n\tlocal sets = {\n\t\t\"#4:\" .. setflag .. \"passwall_white\",\n\t\t\"#6:\" .. setflag .. \"passwall_white6\"\n\t}\n\tlocal domain_rules_str = string.format('domain-rules /domain-set:%s/ %s', domain_set_name, LOCAL_GROUP and \"-nameserver \" .. LOCAL_GROUP or \"\")\n\tdomain_rules_str = domain_rules_str .. \" \" .. set_type .. \" \" .. table.concat(sets, \",\")\n\tdomain_rules_str = domain_rules_str .. (LOCAL_EXTEND_ARG ~= \"\" and \" \" .. LOCAL_EXTEND_ARG or \"\")\n\ttable.insert(tmp_lines, domain_rules_str)\n\tinsert_array_after(config_lines, tmp_lines, \"#--6\")\n\tlog(string.format(\"  - 域名白名单(whitelist)使用分组：%s\", LOCAL_GROUP or \"默认\"))\nend\n\n--代理（黑名单）列表\nlocal file_proxy_host = TMP_ACL_PATH .. \"/proxy_host\"\nif USE_PROXY_LIST == \"1\" and not fs.access(file_proxy_host) then\n\tlocal proxy_domain, lookup_proxy_domain = {}, {}\n\tlocal geosite_arg = \"\"\n\tfor line in io.lines(RULES_PATH .. \"/proxy_host\") do\n\t\tif not line:find(\"#\") and line:find(\"geosite:\") then\n\t\t\tline = string.match(line, \":([^:]+)$\")\n\t\t\tgeosite_arg = geosite_arg .. (geosite_arg ~= \"\" and \",\" or \"\") .. line\n\t\telse\n\t\t\tline = api.get_std_domain(line)\n\t\t\tif line ~= \"\" and not line:find(\"#\") then\n\t\t\t\tinsert_unique(proxy_domain, line, lookup_proxy_domain)\n\t\t\tend\n\t\tend\n\tend\n\tif #proxy_domain > 0 then\n\t\tlocal f_out = io.open(file_proxy_host, \"w\")\n\t\tfor i = 1, #proxy_domain do\n\t\t\tf_out:write(proxy_domain[i] .. \"\\n\")\n\t\tend\n\t\tf_out:close()\n\tend\n\tif USE_GEOVIEW == \"1\" and geosite_arg ~= \"\" and api.is_finded(\"geoview\") then\n\t\tif get_geosite(geosite_arg, file_proxy_host) == 0 then\n\t\t\tlog(\"  * 解析[代理列表] Geosite 到代理域名表(blacklist)完成\")\n\t\telse\n\t\t\tlog(\"  * 解析[代理列表] Geosite 到代理域名表(blacklist)失败！\")\n\t\tend\n\tend\nend\nif USE_PROXY_LIST == \"1\" and is_file_nonzero(file_proxy_host) then\n\tlocal domain_set_name = \"passwall-proxylist\"\n\ttmp_lines = {\n\t\tstring.format(\"domain-set -name %s -file %s\", domain_set_name, file_proxy_host)\n\t}\n\tlocal domain_rules_str = string.format('domain-rules /domain-set:%s/ -nameserver %s', domain_set_name, REMOTE_GROUP)\n\tdomain_rules_str = domain_rules_str .. \" -speed-check-mode none\"\n\tdomain_rules_str = domain_rules_str .. \" -no-serve-expired\"\n\tlocal sets = {\n\t\t\"#4:\" .. setflag .. \"passwall_black\"\n\t}\n\tif NO_PROXY_IPV6 == \"1\" then\n\t\tdomain_rules_str = domain_rules_str .. \" -address #6\"\n\t\tdomain_rules_str = REMOTE_FAKEDNS ~= \"1\" and (domain_rules_str .. \" \" .. set_type .. \" \" .. table.concat(sets, \",\")) or domain_rules_str\n\telse\n\t\tdomain_rules_str = domain_rules_str .. \" -address -6\"\n\t\ttable.insert(sets, \"#6:\" .. setflag .. \"passwall_black6\")\n\t\tdomain_rules_str = REMOTE_FAKEDNS ~= \"1\" and (domain_rules_str .. \" -d no \" .. set_type .. \" \" .. table.concat(sets, \",\")) or domain_rules_str\n\tend\n\ttable.insert(tmp_lines, domain_rules_str)\n\tinsert_array_after(config_lines, tmp_lines, \"#--5\")\n\tlog(string.format(\"  - 代理域名表(blacklist)使用分组：%s\", REMOTE_GROUP or \"默认\"))\nend\n\n--GFW列表\nif USE_GFW_LIST == \"1\" and is_file_nonzero(RULES_PATH .. \"/gfwlist\") then\n\tlocal domain_set_name = \"passwall-gfwlist\"\n\ttmp_lines = {\n\t\tstring.format(\"domain-set -name %s -file %s\", domain_set_name, RULES_PATH .. \"/gfwlist\")\n\t}\n\tlocal domain_rules_str = string.format('domain-rules /domain-set:%s/ -nameserver %s', domain_set_name, REMOTE_GROUP)\n\tdomain_rules_str = domain_rules_str .. \" -speed-check-mode none\"\n\tdomain_rules_str = domain_rules_str .. \" -no-serve-expired\"\n\tlocal sets = {\n\t\t\"#4:\" .. setflag .. \"passwall_gfw\"\n\t}\n\tif NO_PROXY_IPV6 == \"1\" then\n\t\tdomain_rules_str = domain_rules_str .. \" -address #6\"\n\t\tdomain_rules_str = REMOTE_FAKEDNS ~= \"1\" and (domain_rules_str .. \" \" .. set_type .. \" \" .. table.concat(sets, \",\")) or domain_rules_str\n\telse\n\t\tdomain_rules_str = domain_rules_str .. \" -address -6\"\n\t\ttable.insert(sets, \"#6:\" .. setflag .. \"passwall_gfw6\")\n\t\tdomain_rules_str = REMOTE_FAKEDNS ~= \"1\" and (domain_rules_str .. \" -d no \" .. set_type .. \" \" .. table.concat(sets, \",\")) or domain_rules_str\n\tend\n\ttable.insert(tmp_lines, domain_rules_str)\n\tinsert_array_after(config_lines, tmp_lines, \"#--1\")\n\tlog(string.format(\"  - 防火墙域名表(gfwlist)使用分组：%s\", REMOTE_GROUP or \"默认\"))\nend\n\n--中国列表\nif CHN_LIST ~= \"0\" and is_file_nonzero(RULES_PATH .. \"/chnlist\") then\n\tlocal domain_set_name = \"passwall-chnlist\"\n\ttmp_lines = {\n\t\tstring.format(\"domain-set -name %s -file %s\", domain_set_name, RULES_PATH .. \"/chnlist\")\n\t}\n\n\tif CHN_LIST == \"direct\" then\n\t\tlocal sets = {\n\t\t\t\"#4:\" .. setflag .. \"passwall_chn\",\n\t\t\t\"#6:\" .. setflag .. \"passwall_chn6\"\n\t\t}\n\t\tlocal domain_rules_str = string.format('domain-rules /domain-set:%s/ %s', domain_set_name, LOCAL_GROUP and \"-nameserver \" .. LOCAL_GROUP or \"\")\n\t\tdomain_rules_str = domain_rules_str .. \" \" .. set_type .. \" \" .. table.concat(sets, \",\")\n\t\tdomain_rules_str = domain_rules_str .. (LOCAL_EXTEND_ARG ~= \"\" and \" \" .. LOCAL_EXTEND_ARG or \"\")\n\t\ttable.insert(tmp_lines, domain_rules_str)\n\t\tinsert_array_after(config_lines, tmp_lines, \"#--2\")\n\t\tlog(string.format(\"  - 中国域名表(chnroute)使用分组：%s\", LOCAL_GROUP or \"默认\"))\n\tend\n\n\t--回中国模式\n\tif CHN_LIST == \"proxy\" then\n\t\tlocal domain_rules_str = string.format('domain-rules /domain-set:%s/ -nameserver %s', domain_set_name, REMOTE_GROUP)\n\t\tdomain_rules_str = domain_rules_str .. \" -speed-check-mode none\"\n\t\tdomain_rules_str = domain_rules_str .. \" -no-serve-expired\"\n\t\tlocal sets = {\n\t\t\t\"#4:\" .. setflag .. \"passwall_chn\"\n\t\t}\n\t\tif NO_PROXY_IPV6 == \"1\" then\n\t\t\tdomain_rules_str = domain_rules_str .. \" -address #6\"\n\t\t\tdomain_rules_str = REMOTE_FAKEDNS ~= \"1\" and (domain_rules_str .. \" \" .. set_type .. \" \" .. table.concat(sets, \",\")) or domain_rules_str\n\t\telse\n\t\t\tdomain_rules_str = domain_rules_str .. \" -address -6\"\n\t\t\ttable.insert(sets, \"#6:\" .. setflag .. \"passwall_chn6\")\n\t\t\tdomain_rules_str = REMOTE_FAKEDNS ~= \"1\" and (domain_rules_str .. \" -d no \" .. set_type .. \" \" .. table.concat(sets, \",\")) or domain_rules_str\n\t\tend\n\t\ttable.insert(tmp_lines, domain_rules_str)\n\t\tinsert_array_after(config_lines, tmp_lines, \"#--2\")\n\t\tlog(string.format(\"  - 中国域名表(chnroute)使用分组：%s\", REMOTE_GROUP or \"默认\"))\n\tend\nend\n\n--分流规则\nif IS_SHUNT_NODE then\n\tlocal white_domain, lookup_white_domain = {}, {}\n\tlocal shunt_domain, lookup_shunt_domain = {}, {}\n\tlocal file_white_host = FLAG_PATH .. \"/shunt_direct_host\"\n\tlocal file_shunt_host = FLAG_PATH .. \"/shunt_proxy_host\"\n\tlocal geosite_white_arg, geosite_shunt_arg = \"\", \"\"\n\n\tlocal t = uci:get_all(appname, TCP_NODE)\n\tlocal default_node_id = t[\"default_node\"] or \"_direct\"\n\tuci:foreach(appname, \"shunt_rules\", function(s)\n\t\tlocal _node_id = t[s[\".name\"]]\n\t\tif _node_id and _node_id ~= \"_blackhole\" then\n\t\t\tif _node_id == \"_default\" then\n\t\t\t\t_node_id = default_node_id\n\t\t\tend\n\n\t\t\tlocal domain_list = s.domain_list or \"\"\n\t\t\tfor line in string.gmatch(domain_list, \"[^\\r\\n]+\") do\n\t\t\t\tif line ~= \"\" and not line:find(\"#\") and not line:find(\"regexp:\") and not line:find(\"ext:\") then\n\t\t\t\t\tif line:find(\"geosite:\") then\n\t\t\t\t\t\tline = string.match(line, \":([^:]+)$\")\n\t\t\t\t\t\tif _node_id == \"_direct\" then\n\t\t\t\t\t\t\tgeosite_white_arg = geosite_white_arg .. (geosite_white_arg ~= \"\" and \",\" or \"\") .. line\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tgeosite_shunt_arg = geosite_shunt_arg .. (geosite_shunt_arg ~= \"\" and \",\" or \"\") .. line\n\t\t\t\t\t\tend\n\t\t\t\t\telse\n\t\t\t\t\t\tif line:find(\"domain:\") or line:find(\"full:\") then\n\t\t\t\t\t\t\tline = string.match(line, \":([^:]+)$\")\n\t\t\t\t\t\tend\n\t\t\t\t\t\tline = api.get_std_domain(line)\n\t\t\t\t\t\tif line ~= \"\" and not line:find(\"#\") then\n\t\t\t\t\t\t\tif _node_id == \"_direct\" then\n\t\t\t\t\t\t\t\tinsert_unique(white_domain, line, lookup_white_domain)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tinsert_unique(shunt_domain, line, lookup_shunt_domain)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif _node_id ~= \"_direct\" then\n\t\t\t\tlog(string.format(\"  - Sing-Box/Xray分流规则(%s)使用分组：%s\", s.remarks, REMOTE_GROUP or \"默认\"))\n\t\t\tend\n\t\tend\n\tend)\n\n\tif is_file_nonzero(file_white_host) == nil then\n\t\tif #white_domain > 0 then\n\t\t\tlocal f_out = io.open(file_white_host, \"w\")\n\t\t\tfor i = 1, #white_domain do\n\t\t\t\tf_out:write(white_domain[i] .. \"\\n\")\n\t\t\tend\n\t\t\tf_out:close()\n\t\tend\n\tend\n\n\tif is_file_nonzero(file_shunt_host) == nil then\n\t\tif #shunt_domain > 0 then\n\t\t\tlocal f_out = io.open(file_shunt_host, \"w\")\n\t\t\tfor i = 1, #shunt_domain do\n\t\t\t\tf_out:write(shunt_domain[i] .. \"\\n\")\n\t\t\tend\n\t\t\tf_out:close()\n\t\tend\n\tend\n\n\tif USE_GFW_LIST == \"1\" and CHN_LIST == \"0\" and USE_GEOVIEW == \"1\" and api.is_finded(\"geoview\") then  --仅GFW模式解析geosite\n\t\tlocal return_white, return_shunt\n\t\tif geosite_white_arg ~= \"\" then\n\t\t\treturn_white = get_geosite(geosite_white_arg, file_white_host)\n\t\tend\n\t\tif geosite_shunt_arg ~= \"\" then\n\t\t\treturn_shunt = get_geosite(geosite_shunt_arg, file_shunt_host)\n\t\tend\n\t\tif (return_white == nil or return_white == 0) and (return_shunt == nil or return_shunt == 0) then\n\t\t\tlog(\"  * 解析[分流节点] Geosite 完成\")\n\t\telse\n\t\t\tlog(\"  * 解析[分流节点] Geosite 失败！\")\n\t\tend\n\tend\n\n\tif is_file_nonzero(file_white_host) then\n\t\tlocal domain_set_name = \"passwall-whitehost\"\n\t\ttmp_lines = {\n\t\t\tstring.format(\"domain-set -name %s -file %s\", domain_set_name, file_white_host)\n\t\t}\n\t\tlocal domain_rules_str = string.format('domain-rules /domain-set:%s/ %s', domain_set_name, LOCAL_GROUP and \"-nameserver \" .. LOCAL_GROUP or \"\")\n\t\tif USE_DIRECT_LIST == \"1\" then\n\t\t\tlocal sets = {\n\t\t\t\t\"#4:\" .. setflag .. \"passwall_white\",\n\t\t\t\t\"#6:\" .. setflag .. \"passwall_white6\"\n\t\t\t}\n\t\t\tdomain_rules_str = domain_rules_str .. \" \" .. set_type .. \" \" .. table.concat(sets, \",\")\n\t\telse\n\t\t\tlocal sets = {\n\t\t\t\t\"#4:\" .. setflag .. \"passwall_shunt\",\n\t\t\t\t\"#6:\" .. setflag .. \"passwall_shunt6\"\n\t\t\t}\n\t\t\tdomain_rules_str = domain_rules_str .. \" \" .. set_type .. \" \" .. table.concat(sets, \",\")\n\t\tend\n\t\tdomain_rules_str = domain_rules_str .. (LOCAL_EXTEND_ARG ~= \"\" and \" \" .. LOCAL_EXTEND_ARG or \"\")\n\t\ttable.insert(tmp_lines, domain_rules_str)\n\t\tinsert_array_after(config_lines, tmp_lines, \"#--4\")\n\tend\n\n\tif is_file_nonzero(file_shunt_host) then\n\t\tlocal domain_set_name = \"passwall-shuntlist\"\n\t\ttmp_lines = {\n\t\t\tstring.format(\"domain-set -name %s -file %s\", domain_set_name, file_shunt_host)\n\t\t}\n\t\tlocal domain_rules_str = string.format('domain-rules /domain-set:%s/ -nameserver %s', domain_set_name, REMOTE_GROUP)\n\t\tdomain_rules_str = domain_rules_str .. \" -speed-check-mode none\"\n\t\tdomain_rules_str = domain_rules_str .. \" -no-serve-expired\"\n\t\tlocal sets = {\n\t\t\t\"#4:\" .. setflag .. \"passwall_shunt\"\n\t\t}\n\t\tif NO_PROXY_IPV6 == \"1\" then\n\t\t\tdomain_rules_str = domain_rules_str .. \" -address #6\"\n\t\t\tdomain_rules_str = (not only_global and REMOTE_FAKEDNS == \"1\")\n\t\t\t\t\tand domain_rules_str\n\t\t\t\t\tor (domain_rules_str .. \" \" .. set_type .. \" \" .. table.concat(sets, \",\"))\n\t\telse\n\t\t\tdomain_rules_str = domain_rules_str .. \" -address -6\"\n\t\t\ttable.insert(sets, \"#6:\" .. setflag .. \"passwall_shunt6\")\n\t\t\tdomain_rules_str = (not only_global and REMOTE_FAKEDNS == \"1\")\n\t\t\t\t\tand domain_rules_str\n\t\t\t\t\tor (domain_rules_str .. \" -d no \" .. set_type .. \" \" .. table.concat(sets, \",\"))\n\t\tend\n\t\ttable.insert(tmp_lines, domain_rules_str)\n\t\tinsert_array_after(config_lines, tmp_lines, \"#--3\")\n\tend\n\nend\n\nif #config_lines > 0 then\n\tlocal f_out = io.open(TMP_CONF_FILE, \"w\")\n\tfor i = 1, #config_lines do\n\t\tline = config_lines[i]\n\t\tif line ~= \"\" and not line:find(\"^#--\") then\n\t\t\tf_out:write(line .. \"\\n\")\n\t\tend\n\tend\n\tf_out:close()\nend\n\nif DEFAULT_DNS_GROUP then\n\tlog(string.format(\"  - 默认 DNS 分组：%s\", DEFAULT_DNS_GROUP))\nend\n\nfs.symlink(TMP_CONF_FILE, SMARTDNS_CONF)\nsys.call(string.format('echo \"conf-file %s\" >> /etc/smartdns/custom.conf', string.gsub(SMARTDNS_CONF, appname, appname .. \"*\")))\nlog(\"  - SmartDNS已作为Dnsmasq上游，如果你自行配置了错误的DNS流程，将会导致域名(直连/代理域名)分流失效！！！\")\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/iptables.sh",
    "content": "#!/bin/sh\n\nDIR=\"$(cd \"$(dirname \"$0\")\" && pwd)\"\nMY_PATH=$DIR/iptables.sh\nUTILS_PATH=$DIR/utils.sh\nIPSET_LOCAL=\"passwall_local\"\nIPSET_WAN=\"passwall_wan\"\nIPSET_LAN=\"passwall_lan\"\nIPSET_VPS=\"passwall_vps\"\nIPSET_SHUNT=\"passwall_shunt\"\nIPSET_GFW=\"passwall_gfw\"\nIPSET_CHN=\"passwall_chn\"\nIPSET_BLACK=\"passwall_black\"\nIPSET_WHITE=\"passwall_white\"\nIPSET_BLOCK=\"passwall_block\"\n\nIPSET_LOCAL6=\"passwall_local6\"\nIPSET_WAN6=\"passwall_wan6\"\nIPSET_LAN6=\"passwall_lan6\"\nIPSET_VPS6=\"passwall_vps6\"\nIPSET_SHUNT6=\"passwall_shunt6\"\nIPSET_GFW6=\"passwall_gfw6\"\nIPSET_CHN6=\"passwall_chn6\"\nIPSET_BLACK6=\"passwall_black6\"\nIPSET_WHITE6=\"passwall_white6\"\nIPSET_BLOCK6=\"passwall_block6\"\n\nUSE_SHUNT_TCP=0\nUSE_SHUNT_UDP=0\n\n# ASCII code for PSW1.Use whatever,just not the same.\nFWMARK=\"0x50535731\"\n\nipt=$(command -v iptables-legacy || command -v iptables)\nip6t=$(command -v ip6tables-legacy || command -v ip6tables)\n\nipt_n=\"$ipt -t nat -w\"\nipt_m=\"$ipt -t mangle -w\"\nip6t_n=\"$ip6t -t nat -w\"\nip6t_m=\"$ip6t -t mangle -w\"\n[ -z \"$ip6t\" -o -z \"$(lsmod | grep 'ip6table_nat')\" ] && ip6t_n=\"eval #$ip6t_n\"\n[ -z \"$ip6t\" -o -z \"$(lsmod | grep 'ip6table_mangle')\" ] && ip6t_m=\"eval #$ip6t_m\"\nFWI=$(uci -q get firewall.passwall.path 2>/dev/null)\nFAKE_IP=\"198.18.0.0/15\"\nFAKE_IP_6=\"fc00::/18\"\n\nfactor() {\n\tif [ -z \"$1\" ] || [ -z \"$2\" ]; then\n\t\techo \"\"\n\telif [ \"$1\" == \"1:65535\" ]; then\n\t\techo \"\"\n\telse\n\t\techo \"$2 $1\"\n\tfi\n}\n\ndst() {\n\techo \"-m set $2 --match-set $1 dst\"\n}\n\ncomment() {\n\tlocal name=$(echo $1 | sed 's/ /_/g')\n\techo \"-m comment --comment \"${name}\"\"\n}\n\n#解决端口超过15个ipt无效，支持单端口、端口范围\nadd_port_rules() {\n\tlocal ipt_cmd=\"$1\"\n\tlocal port_list=\"$2\"\n\tlocal target=\"$3\"\n\techo \"$port_list\" | grep -vq '[0-9]' && return\n\tport_list=$(echo \"$port_list\" | tr -d ' ' | sed 's/-/:/g' | tr ',' '\\n' | awk '!a[$0]++' | grep -v '^$')\n\t[ -z \"$port_list\" ] && return\n\tif echo \"$port_list\" | grep -q '^1:65535$'; then\n\t\teval \"$ipt_cmd $target\"\n\t\treturn\n\tfi\n\tlocal multiport_ports=\"\"\n\tlocal range_ports=\"\"\n\tlocal count=0\n\tlocal port\n\tfor port in $port_list; do\n\t\tif echo \"$port\" | grep -q ':'; then\n\t\t\trange_ports=\"$range_ports $port\"\n\t\telse\n\t\t\tmultiport_ports=\"$multiport_ports,$port\"\n\t\t\tcount=$((count + 1))\n\t\t\tif [ \"$count\" -eq 15 ]; then\n\t\t\t\teval \"$ipt_cmd -m multiport --dport ${multiport_ports#,} $target\"\n\t\t\t\tmultiport_ports=\"\"\n\t\t\t\tcount=0\n\t\t\tfi\n\t\tfi\n\tdone\n\tif [ -n \"$multiport_ports\" ]; then\n\t\teval \"$ipt_cmd -m multiport --dport ${multiport_ports#,} $target\"\n\tfi\n\tfor port in $range_ports; do\n\t\teval \"$ipt_cmd --dport $port $target\"\n\tdone\n}\n\ndestroy_ipset() {\n\tfor i in \"$@\"; do\n\t\tipset -q -F $i\n\t\tipset -q -X $i\n\tdone\n}\n\ninsert_rule_before() {\n\t[ $# -ge 3 ] || {\n\t\treturn 1\n\t}\n\tlocal ipt_tmp=\"${1}\"; shift\n\tlocal chain=\"${1}\"; shift\n\tlocal keyword=\"${1}\"; shift\n\tlocal rule=\"${1}\"; shift\n\tlocal default_index=\"${1}\"; shift\n\tdefault_index=${default_index:-0}\n\tlocal _index=$($ipt_tmp -n -L $chain --line-numbers 2>/dev/null | grep \"$keyword\" | head -n 1 | awk '{print $1}')\n\tif [ -z \"${_index}\" ] && [ \"${default_index}\" = \"0\" ]; then\n\t\t$ipt_tmp -A $chain $rule\n\telse\n\t\tif [ -z \"${_index}\" ]; then\n\t\t\t_index=${default_index}\n\t\tfi\n\t\t$ipt_tmp -I $chain $_index $rule\n\tfi\n}\n\ninsert_rule_after() {\n\t[ $# -ge 3 ] || {\n\t\treturn 1\n\t}\n\tlocal ipt_tmp=\"${1}\"; shift\n\tlocal chain=\"${1}\"; shift\n\tlocal keyword=\"${1}\"; shift\n\tlocal rule=\"${1}\"; shift\n\tlocal default_index=\"${1}\"; shift\n\tdefault_index=${default_index:-0}\n\tlocal _index=$($ipt_tmp -n -L $chain --line-numbers 2>/dev/null | grep \"$keyword\" | awk 'END {print}' | awk '{print $1}')\n\tif [ -z \"${_index}\" ] && [ \"${default_index}\" = \"0\" ]; then\n\t\t$ipt_tmp -A $chain $rule\n\telse\n\t\tif [ -n \"${_index}\" ]; then\n\t\t\t_index=$((_index + 1))\n\t\telse\n\t\t\t_index=${default_index}\n\t\tfi\n\t\t$ipt_tmp -I $chain $_index $rule\n\tfi\n}\n\nRULE_LAST_INDEX() {\n\t[ $# -ge 3 ] || {\n\t\techolog \"索引列举方式不正确（iptables），终止执行！\"\n\t\treturn 1\n\t}\n\tlocal ipt_tmp=\"${1}\"; shift\n\tlocal chain=\"${1}\"; shift\n\tlocal list=\"${1}\"; shift\n\tlocal default=\"${1:-0}\"; shift\n\tlocal _index=$($ipt_tmp -n -L $chain --line-numbers 2>/dev/null | grep \"$list\" | head -n 1 | awk '{print $1}')\n\techo \"${_index:-${default}}\"\n}\n\nREDIRECT() {\n\tlocal s=\"-j REDIRECT\"\n\t[ -n \"$1\" ] && {\n\t\tlocal s=\"$s --to-ports $1\"\n\t\t[ \"$2\" == \"TPROXY\" ] && {\n\t\t\tlocal mark=\"-m mark --mark ${FWMARK}\"\n\t\t\ts=\"${mark} -j TPROXY --on-port $1\"\n\t\t}\n\t}\n\techo \"$s\"\n}\n\nget_jump_ipt() {\n\tcase \"$1\" in\n\tdirect)\n\t\tlocal s=\"\"\n\t\tlocal mark=\"-m mark ! --mark ${FWMARK}\"\n\t\ts=\"${mark} -j RETURN\"\n\t\techo $s\n\t\t;;\n\tproxy)\n\t\tif [ -n \"$2\" ] && [ -n \"$(echo $2 | grep \"^-\")\" ]; then\n\t\t\techo \"$2\"\n\t\telse\n\t\t\techo \"$(REDIRECT $2 $3)\"\n\t\tfi\n\t\t;;\n\tesac\n}\n\nload_acl() {\n\t([ \"$ENABLED_ACLS\" == 1 ] || ([ \"$ENABLED_DEFAULT_ACL\" == 1 ] && [ \"$CLIENT_PROXY\" == 1 ])) && echolog \"  - 访问控制：\"\n\t[ \"$ENABLED_ACLS\" == 1 ] && {\n\t\tacl_app\n\t\tfor sid in $(ls -F ${TMP_ACL_PATH} | grep '/$' | awk -F '/' '{print $1}' | grep -v 'default'); do\n\t\t\teval $(uci -q show \"${CONFIG}.${sid}\" | cut -d'.' -sf 3-)\n\n\t\t\ttcp_no_redir_ports=${tcp_no_redir_ports:-default}\n\t\t\tudp_no_redir_ports=${udp_no_redir_ports:-default}\n\t\t\tuse_global_config=${use_global_config:-0}\n\t\t\ttcp_proxy_drop_ports=${tcp_proxy_drop_ports:-default}\n\t\t\tudp_proxy_drop_ports=${udp_proxy_drop_ports:-default}\n\t\t\ttcp_redir_ports=${tcp_redir_ports:-default}\n\t\t\tudp_redir_ports=${udp_redir_ports:-default}\n\t\t\tuse_direct_list=${use_direct_list:-1}\n\t\t\tuse_proxy_list=${use_proxy_list:-1}\n\t\t\tuse_block_list=${use_block_list:-1}\n\t\t\tuse_gfw_list=${use_gfw_list:-1}\n\t\t\tchn_list=${chn_list:-direct}\n\t\t\ttcp_proxy_mode=${tcp_proxy_mode:-proxy}\n\t\t\tudp_proxy_mode=${udp_proxy_mode:-proxy}\n\t\t\t[ \"$tcp_no_redir_ports\" = \"default\" ] && tcp_no_redir_ports=$TCP_NO_REDIR_PORTS\n\t\t\t[ \"$udp_no_redir_ports\" = \"default\" ] && udp_no_redir_ports=$UDP_NO_REDIR_PORTS\n\t\t\t[ \"$tcp_proxy_drop_ports\" = \"default\" ] && tcp_proxy_drop_ports=$TCP_PROXY_DROP_PORTS\n\t\t\t[ \"$udp_proxy_drop_ports\" = \"default\" ] && udp_proxy_drop_ports=$UDP_PROXY_DROP_PORTS\n\t\t\t[ \"$tcp_redir_ports\" = \"default\" ] && tcp_redir_ports=$TCP_REDIR_PORTS\n\t\t\t[ \"$udp_redir_ports\" = \"default\" ] && udp_redir_ports=$UDP_REDIR_PORTS\n\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_tcp_node\")\" ] && tcp_node=$(get_cache_var \"ACL_${sid}_tcp_node\")\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_tcp_redir_port\")\" ] && tcp_port=$(get_cache_var \"ACL_${sid}_tcp_redir_port\")\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_udp_node\")\" ] && udp_node=$(get_cache_var \"ACL_${sid}_udp_node\")\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_udp_redir_port\")\" ] && udp_port=$(get_cache_var \"ACL_${sid}_udp_redir_port\")\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_dns_port\")\" ] && dns_redirect_port=$(get_cache_var \"ACL_${sid}_dns_port\")\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_fakedns\")\" ] && use_fakedns=$(get_cache_var \"ACL_${sid}_fakedns\")\n\t\t\t[ -n \"$tcp_node\" ] && {\n\t\t\t\tif is_socks_wrap \"$tcp_node\"; then\n\t\t\t\t\ttcp_node_remark=\"Socks 配置($(config_n_get ${tcp_node#Socks_} port) 端口)\"\n\t\t\t\telse\n\t\t\t\t\ttcp_node_remark=$(config_n_get $tcp_node remarks)\n\t\t\t\tfi\n\t\t\t}\n\t\t\t[ -n \"$udp_node\" ] && {\n\t\t\t\tif is_socks_wrap \"$udp_node\"; then\n\t\t\t\t\tudp_node_remark=\"Socks 配置($(config_n_get ${udp_node#Socks_} port) 端口)\"\n\t\t\t\telse\n\t\t\t\t\tudp_node_remark=$(config_n_get $udp_node remarks)\n\t\t\t\tfi\n\t\t\t}\n\n\t\t\tuse_shunt_tcp=0\n\t\t\tuse_shunt_udp=0\n\t\t\t[ -n \"$tcp_node\" ] && [ \"$(config_n_get $tcp_node protocol)\" = \"_shunt\" ] && use_shunt_tcp=1\n\t\t\t[ -n \"$udp_node\" ] && [ \"$(config_n_get $udp_node protocol)\" = \"_shunt\" ] && use_shunt_udp=1\n\n\t\t\t[ \"${use_global_config}\" = \"1\" ] && {\n\t\t\t\tif is_socks_wrap \"$TCP_NODE\"; then\n\t\t\t\t\ttcp_node_remark=\"Socks 配置($(config_n_get ${TCP_NODE#Socks_} port) 端口)\"\n\t\t\t\telse\n\t\t\t\t\ttcp_node_remark=$(config_n_get $TCP_NODE remarks)\n\t\t\t\tfi\n\t\t\t\tif is_socks_wrap \"$UDP_NODE\"; then\n\t\t\t\t\tudp_node_remark=\"Socks 配置($(config_n_get ${UDP_NODE#Socks_} port) 端口)\"\n\t\t\t\telse\n\t\t\t\t\tudp_node_remark=$(config_n_get $UDP_NODE remarks)\n\t\t\t\tfi\n\t\t\t\tuse_direct_list=${USE_DIRECT_LIST}\n\t\t\t\tuse_proxy_list=${USE_PROXY_LIST}\n\t\t\t\tuse_block_list=${USE_BLOCK_LIST}\n\t\t\t\tuse_gfw_list=${USE_GFW_LIST}\n\t\t\t\tchn_list=${CHN_LIST}\n\t\t\t\ttcp_proxy_mode=${TCP_PROXY_MODE}\n\t\t\t\tudp_proxy_mode=${UDP_PROXY_MODE}\n\t\t\t\tuse_shunt_tcp=${USE_SHUNT_TCP}\n\t\t\t\tuse_shunt_udp=${USE_SHUNT_UDP}\n\t\t\t\tdns_redirect_port=${DNS_REDIRECT_PORT}\n\t\t\t\tblack_set_name=${IPSET_BLACK}\n\t\t\t\tblack6_set_name=${IPSET_BLACK6}\n\t\t\t\tgfw_set_name=${IPSET_GFW}\n\t\t\t\tgfw6_set_name=${IPSET_GFW6}\n\t\t\t\tshunt_set_name=${IPSET_SHUNT}\n\t\t\t\tshunt6_set_name=${IPSET_SHUNT6}\n\t\t\t\tuse_fakedns=${USE_FAKEDNS}\n\t\t\t}\n\n\t\t\t_acl_list=${TMP_ACL_PATH}/${sid}/source_list\n\n\t\t\tfor i in $(cat $_acl_list); do\n\t\t\t\tlocal _ipt_source _ipv4\n\t\t\t\tlocal msg\n\t\t\t\tif [ -n \"${interface}\" ]; then\n\t\t\t\t\tlocal gateway device\n\t\t\t\t\tnetwork_get_gateway gateway \"${interface}\"\n\t\t\t\t\tnetwork_get_device device \"${interface}\"\n\t\t\t\t\t# network_get_device returns empty for non-UP interfaces (e.g. auto='0').\n\t\t\t\t\t# Try ubus directly, then check if the name is a kernel device.\n\t\t\t\t\t[ -z \"${device}\" ] && device=$(ubus call \"network.interface.${interface}\" status 2>/dev/null | jsonfilter -e '@.device' 2>/dev/null)\n\t\t\t\t\t[ -z \"${device}\" ] && [ -d \"/sys/class/net/${interface}\" ] && device=\"${interface}\"\n\t\t\t\t\t[ -z \"${device}\" ] && device=\"${interface}\"\n\t\t\t\t\t_ipt_source=\"-i ${device} \"\n\t\t\t\t\tmsg=\"源接口【${device}】，\"\n\t\t\t\telse\n\t\t\t\t\tmsg=\"源接口【所有】，\"\n\t\t\t\tfi\n\t\t\t\tif [ -n \"$(echo ${i} | grep '^iprange:')\" ]; then\n\t\t\t\t\t_iprange=$(echo ${i} | sed 's#iprange:##g')\n\t\t\t\t\t_ipt_source=$(factor ${_iprange} \"${_ipt_source}-m iprange --src-range\")\n\t\t\t\t\tmsg=\"${msg}IP range【${_iprange}】，\"\n\t\t\t\t\t_ipv4=\"1\"\n\t\t\t\t\tunset _iprange\n\t\t\t\telif [ -n \"$(echo ${i} | grep '^ipset:')\" ]; then\n\t\t\t\t\t_ipset=$(echo ${i} | sed 's#ipset:##g')\n\t\t\t\t\tmsg=\"${msg}IPset【${_ipset}】，\"\n\t\t\t\t\tipset -q list ${_ipset} >/dev/null\n\t\t\t\t\tif [ $? -eq 0 ]; then\n\t\t\t\t\t\t_ipt_source=\"${_ipt_source}-m set --match-set ${_ipset} src\"\n\t\t\t\t\t\tunset _ipset\n\t\t\t\t\telse\n\t\t\t\t\t\techolog \"  - 【$remarks】，${msg}不存在，忽略。\"\n\t\t\t\t\t\tunset _ipset\n\t\t\t\t\t\tcontinue\n\t\t\t\t\tfi\n\t\t\t\telif [ -n \"$(echo ${i} | grep '^ip:')\" ]; then\n\t\t\t\t\t_ip=$(echo ${i} | sed 's#ip:##g')\n\t\t\t\t\t_ipt_source=$(factor ${_ip} \"${_ipt_source}-s\")\n\t\t\t\t\tmsg=\"${msg}IP【${_ip}】，\"\n\t\t\t\t\t_ipv4=\"1\"\n\t\t\t\t\tunset _ip\n\t\t\t\telif [ -n \"$(echo ${i} | grep '^mac:')\" ]; then\n\t\t\t\t\t_mac=$(echo ${i} | sed 's#mac:##g')\n\t\t\t\t\t_ipt_source=$(factor ${_mac} \"${_ipt_source}-m mac --mac-source\")\n\t\t\t\t\tmsg=\"${msg}MAC【${_mac}】，\"\n\t\t\t\t\tunset _mac\n\t\t\t\telif [ -n \"$(echo ${i} | grep '^any')\" ]; then\n\t\t\t\t\tmsg=\"${msg}所有设备，\"\n\t\t\t\telse\n\t\t\t\t\tcontinue\n\t\t\t\tfi\n\t\t\t\tmsg=\"【$remarks】，${msg}\"\n\t\t\t\t\n\t\t\t\tipt_tmp=$ipt_n\n\t\t\t\t[ -n \"${is_tproxy}\" ] && ipt_tmp=$ipt_m\n\n\t\t\t\t[ \"$tcp_no_redir_ports\" != \"disable\" ] && {\n\t\t\t\t\tif ! has_1_65535 \"$tcp_no_redir_ports\"; then\n\t\t\t\t\t\t[ \"$_ipv4\" != \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") ${_ipt_source} -p tcp\" $tcp_no_redir_ports \"-j RETURN\" 2>/dev/null\n\t\t\t\t\t\tadd_port_rules \"$ipt_tmp -A PSW $(comment \"$remarks\") ${_ipt_source} -p tcp\" $tcp_no_redir_ports \"-j RETURN\"\n\t\t\t\t\t\techolog \"     - ${msg}不代理 TCP 端口[${tcp_no_redir_ports}]\"\n\t\t\t\t\telse\n\t\t\t\t\t\t#结束时会return，无需加多余的规则。\n\t\t\t\t\t\tunset tcp_port\n\t\t\t\t\t\techolog \"     - ${msg}不代理所有 TCP 端口\"\n\t\t\t\t\tfi\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t[ \"$udp_no_redir_ports\" != \"disable\" ] && {\n\t\t\t\t\tif ! has_1_65535 \"$udp_no_redir_ports\"; then\n\t\t\t\t\t\t[ \"$_ipv4\" != \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") ${_ipt_source} -p udp\" $udp_no_redir_ports \"-j RETURN\" 2>/dev/null\n\t\t\t\t\t\tadd_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") ${_ipt_source} -p udp\" $udp_no_redir_ports \"-j RETURN\"\n\t\t\t\t\t\techolog \"     - ${msg}不代理 UDP 端口[${udp_no_redir_ports}]\"\n\t\t\t\t\telse\n\t\t\t\t\t\t#结束时会return，无需加多余的规则。\n\t\t\t\t\t\tunset udp_port\n\t\t\t\t\t\techolog \"     - ${msg}不代理所有 UDP 端口\"\n\t\t\t\t\tfi\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tlocal dns_redirect\n\t\t\t\t[ $(config_t_get global dns_redirect \"1\") = \"1\" ] && dns_redirect=53\n\t\t\t\tif ([ -n \"$tcp_port\" ] && [ -n \"${tcp_proxy_mode}\" ]) || ([ -n \"$udp_port\" ] && [ -n \"${udp_proxy_mode}\" ]); then\n\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && {\n\t\t\t\t\t\t[ \"${use_global_config}\" = \"0\" ] && {\n\t\t\t\t\t\t\tblack_set_name=\"passwall_${sid}_black\"\n\t\t\t\t\t\t\tblack6_set_name=\"passwall_${sid}_black6\"\n\t\t\t\t\t\t\tipset -! create $black_set_name nethash maxelem 1048576 timeout 172800\n\t\t\t\t\t\t\tipset -! create $black6_set_name nethash family inet6 maxelem 1048576 timeout 172800\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && {\n\t\t\t\t\t\t[ \"${use_global_config}\" = \"0\" ] && {\n\t\t\t\t\t\t\tgfw_set_name=\"passwall_${sid}_gfw\"\n\t\t\t\t\t\t\tgfw6_set_name=\"passwall_${sid}_gfw6\"\n\t\t\t\t\t\t\tipset -! create $gfw_set_name nethash maxelem 1048576 timeout 172800\n\t\t\t\t\t\t\tipset -! create $gfw6_set_name nethash family inet6 maxelem 1048576 timeout 172800\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t[ \"${use_shunt_tcp}\" = \"1\" -o \"${use_shunt_udp}\" = \"1\" ] && {\n\t\t\t\t\t\t[ \"${use_global_config}\" = \"0\" ] && {\n\t\t\t\t\t\t\tshunt_set_name=\"passwall_${sid}_shunt\"\n\t\t\t\t\t\t\tshunt6_set_name=\"passwall_${sid}_shunt6\"\n\t\t\t\t\t\t\tipset -! create $shunt_set_name nethash maxelem 1048576 timeout 172800\n\t\t\t\t\t\t\tipset -! create $shunt6_set_name nethash family inet6 maxelem 1048576 timeout 172800\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t[ -n \"${dns_redirect_port}\" ] && dns_redirect=${dns_redirect_port}\n\t\t\t\telse\n\t\t\t\t\t[ -n \"${DIRECT_DNSMASQ_PORT}\" ] && dns_redirect=${DIRECT_DNSMASQ_PORT}\n\t\t\t\tfi\n\t\t\t\tif [ -n \"${dns_redirect}\" ]; then\n\t\t\t\t\t$ipt_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source} --dport 53 -j RETURN\n\t\t\t\t\t[ \"$_ipv4\" != \"1\" ] && $ip6t_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source} --dport 53 -j RETURN 2>/dev/null\n\t\t\t\t\t$ipt_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source} --dport 53 -j RETURN\n\t\t\t\t\t[ \"$_ipv4\" != \"1\" ] && $ip6t_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source} --dport 53 -j RETURN 2>/dev/null\n\t\t\t\t\t$ipt_n -A PSW_DNS $(comment \"$remarks\") -p udp ${_ipt_source} --dport 53 -j REDIRECT --to-ports ${dns_redirect}\n\t\t\t\t\t[ \"$_ipv4\" != \"1\" ] && $ip6t_n -A PSW_DNS $(comment \"$remarks\") -p udp ${_ipt_source} --dport 53 -j REDIRECT --to-ports ${dns_redirect} 2>/dev/null\n\t\t\t\t\t$ipt_n -A PSW_DNS $(comment \"$remarks\") -p tcp ${_ipt_source} --dport 53 -j REDIRECT --to-ports ${dns_redirect}\n\t\t\t\t\t[ \"$_ipv4\" != \"1\" ] && $ip6t_n -A PSW_DNS $(comment \"$remarks\") -p tcp ${_ipt_source} --dport 53 -j REDIRECT --to-ports ${dns_redirect} 2>/dev/null\n\t\t\t\t\t[ -z \"$(get_cache_var \"ACL_${sid}_tcp_default\")\" ] && echolog \"     - ${msg}使用与全局配置不相同节点，已将DNS强制重定向到专用 DNS 服务器。\"\n\t\t\t\tfi\n\n\t\t\t\t[ -n \"$tcp_port\" -o -n \"$udp_port\" ] && {\n\t\t\t\t\t[ \"${use_block_list}\" = \"1\" ] && $ipt_m -A PSW $(comment \"$remarks\") ${_ipt_source} $(dst $IPSET_BLOCK) -j DROP\n\t\t\t\t\t[ \"${use_direct_list}\" = \"1\" ] && $ipt_tmp -A PSW $(comment \"$remarks\") ${_ipt_source} $(dst $IPSET_WHITE) -j RETURN\n\t\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && [ \"$_ipv4\" != \"1\" ] && {\n\t\t\t\t\t\t[ \"${use_block_list}\" = \"1\" ] && $ip6t_m -A PSW $(comment \"$remarks\") ${_ipt_source} $(dst $IPSET_BLOCK6) -j DROP 2>/dev/null\n\t\t\t\t\t\t[ \"${use_direct_list}\" = \"1\" ] && $ip6t_m -A PSW $(comment \"$remarks\") ${_ipt_source} $(dst $IPSET_WHITE6) -j RETURN 2>/dev/null\n\t\t\t\t\t}\n\n\t\t\t\t\t[ \"$tcp_proxy_drop_ports\" != \"disable\" ] && {\n\t\t\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && [ \"$_ipv4\" != \"1\" ] && {\n\t\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_proxy_drop_ports \"-d $FAKE_IP_6 -j DROP\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_proxy_drop_ports \"$(dst $black6_set_name) -j DROP\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_proxy_drop_ports \"$(dst $gfw6_set_name) -j DROP\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_proxy_drop_ports \"$(dst $IPSET_CHN6) $(get_jump_ipt ${chn_list} \"-j DROP\")\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_shunt_tcp}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_proxy_drop_ports \"$(dst $shunt6_set_name) -j DROP\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${tcp_proxy_mode}\" != \"disable\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_proxy_drop_ports \"-j DROP\" 2>/dev/null\n\t\t\t\t\t\t}\n\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_proxy_drop_ports \"-d $FAKE_IP -j DROP\"\n\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_proxy_drop_ports \"$(dst $black_set_name) -j DROP\"\n\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_proxy_drop_ports \"$(dst $gfw_set_name) -j DROP\"\n\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_proxy_drop_ports \"$(dst $IPSET_CHN) $(get_jump_ipt ${chn_list} \"-j DROP\")\"\n\t\t\t\t\t\t[ \"${use_shunt_tcp}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_proxy_drop_ports \"$(dst $shunt_set_name) -j DROP\"\n\t\t\t\t\t\t[ \"${tcp_proxy_mode}\" != \"disable\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_proxy_drop_ports \"-j DROP\"\n\t\t\t\t\t\techolog \"     - ${msg}屏蔽代理 TCP 端口[${tcp_proxy_drop_ports}]\"\n\t\t\t\t\t}\n\n\t\t\t\t\t[ \"$udp_proxy_drop_ports\" != \"disable\" ] && {\n\t\t\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && [ \"$_ipv4\" != \"1\" ] && {\n\t\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_proxy_drop_ports \"-d $FAKE_IP_6 -j DROP\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_proxy_drop_ports \"$(dst $black6_set_name) -j DROP\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_proxy_drop_ports \"$(dst $gfw6_set_name) -j DROP\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_proxy_drop_ports \"$(dst $IPSET_CHN6) $(get_jump_ipt ${chn_list} \"-j DROP\")\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_shunt_udp}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_proxy_drop_ports \"$(dst $shunt6_set_name) -j DROP\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${udp_proxy_mode}\" != \"disable\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_proxy_drop_ports \"-j DROP\" 2>/dev/null\n\t\t\t\t\t\t}\n\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_proxy_drop_ports \"-d $FAKE_IP -j DROP\"\n\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_proxy_drop_ports \"$(dst $black_set_name) -j DROP\"\n\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_proxy_drop_ports \"$(dst $gfw_set_name) -j DROP\"\n\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_proxy_drop_ports \"$(dst $IPSET_CHN) $(get_jump_ipt ${chn_list} \"-j DROP\")\"\n\t\t\t\t\t\t[ \"${use_shunt_udp}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_proxy_drop_ports \"$(dst $shunt_set_name) -j DROP\"\n\t\t\t\t\t\t[ \"${udp_proxy_mode}\" != \"disable\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_proxy_drop_ports \"-j DROP\"\n\t\t\t\t\t\techolog \"     - ${msg}屏蔽代理 UDP 端口[${udp_proxy_drop_ports}]\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t[ -n \"$tcp_port\" ] && {\n\t\t\t\t\tif [ -n \"${tcp_proxy_mode}\" ]; then\n\t\t\t\t\t\tmsg2=\"${msg}使用 TCP 节点[$tcp_node_remark]\"\n\t\t\t\t\t\tif [ -n \"${is_tproxy}\" ]; then\n\t\t\t\t\t\t\tmsg2=\"${msg2}(TPROXY:${tcp_port})\"\n\t\t\t\t\t\t\tipt_tmp=$ipt_m\n\t\t\t\t\t\t\tipt_j=\"-j PSW_RULE\"\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tmsg2=\"${msg2}(REDIRECT:${tcp_port})\"\n\t\t\t\t\t\t\tipt_j=\"$(REDIRECT $tcp_port)\"\n\t\t\t\t\t\tfi\n\t\t\t\t\t\t\n\t\t\t\t\t\t[ \"$accept_icmp\" = \"1\" ] && {\n\t\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && $ipt_n -A PSW $(comment \"$remarks\") -p icmp ${_ipt_source} -d $FAKE_IP $(REDIRECT)\n\t\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && $ipt_n -A PSW $(comment \"$remarks\") -p icmp ${_ipt_source} $(dst $black_set_name) $(REDIRECT)\n\t\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && $ipt_n -A PSW $(comment \"$remarks\") -p icmp ${_ipt_source} $(dst $gfw_set_name) $(REDIRECT)\n\t\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && $ipt_n -A PSW $(comment \"$remarks\") -p icmp ${_ipt_source} $(dst $IPSET_CHN) $(get_jump_ipt ${chn_list})\n\t\t\t\t\t\t\t[ \"${use_shunt_tcp}\" = \"1\" ] && $ipt_n -A PSW $(comment \"$remarks\") -p icmp ${_ipt_source} $(dst $shunt_set_name) $(REDIRECT)\n\t\t\t\t\t\t\t[ \"${tcp_proxy_mode}\" != \"disable\" ] && $ipt_n -A PSW $(comment \"$remarks\") -p icmp ${_ipt_source} $(REDIRECT)\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t[ \"$accept_icmpv6\" = \"1\" ] && [ \"$PROXY_IPV6\" == \"1\" ] && [ \"$_ipv4\" != \"1\" ] && {\n\t\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && $ip6t_n -A PSW $(comment \"$remarks\") -p ipv6-icmp ${_ipt_source} -d $FAKE_IP_6 $(REDIRECT) 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && $ip6t_n -A PSW $(comment \"$remarks\") -p ipv6-icmp ${_ipt_source} $(dst $black6_set_name) $(REDIRECT) 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && $ip6t_n -A PSW $(comment \"$remarks\") -p ipv6-icmp ${_ipt_source} $(dst $gfw6_set_name) $(REDIRECT) 2>/dev/null\n\t\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && $ip6t_n -A PSW $(comment \"$remarks\") -p ipv6-icmp ${_ipt_source} $(dst $IPSET_CHN6) $(get_jump_ipt ${chn_list}) 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_shunt_tcp}\" = \"1\" ] && $ip6t_n -A PSW $(comment \"$remarks\") -p ipv6-icmp ${_ipt_source} $(dst $shunt6_set_name) $(REDIRECT) 2>/dev/null\n\t\t\t\t\t\t\t[ \"${tcp_proxy_mode}\" != \"disable\" ] && $ip6t_n -A PSW $(comment \"$remarks\") -p ipv6-icmp ${_ipt_source} $(REDIRECT) 2>/dev/null\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && $ipt_tmp -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source} -d $FAKE_IP ${ipt_j}\n\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && add_port_rules \"$ipt_tmp -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_redir_ports \"$(dst $black_set_name) ${ipt_j}\"\n\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && add_port_rules \"$ipt_tmp -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_redir_ports \"$(dst $gfw_set_name) ${ipt_j}\"\n\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && add_port_rules \"$ipt_tmp -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_redir_ports \"$(dst $IPSET_CHN) $(get_jump_ipt ${chn_list} \"${ipt_j}\")\"\n\t\t\t\t\t\t[ \"${use_shunt_tcp}\" = \"1\" ] && add_port_rules \"$ipt_tmp -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_redir_ports \"$(dst $shunt_set_name) ${ipt_j}\"\n\t\t\t\t\t\t[ \"${tcp_proxy_mode}\" != \"disable\" ] && add_port_rules \"$ipt_tmp -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_redir_ports \"${ipt_j}\"\n\t\t\t\t\t\t[ -n \"${is_tproxy}\" ] && $ipt_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source} $(REDIRECT $tcp_port TPROXY)\n\n\t\t\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && [ \"$_ipv4\" != \"1\" ] && {\n\t\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && $ip6t_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source} -d $FAKE_IP_6 -j PSW_RULE 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_redir_ports \"$(dst $black6_set_name) -j PSW_RULE\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_redir_ports \"$(dst $gfw6_set_name) -j PSW_RULE\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_redir_ports \"$(dst $IPSET_CHN6) $(get_jump_ipt ${chn_list} \"-j PSW_RULE\")\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_shunt_tcp}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_redir_ports \"$(dst $shunt6_set_name) -j PSW_RULE\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${tcp_proxy_mode}\" != \"disable\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_redir_ports \"-j PSW_RULE\" 2>/dev/null\n\t\t\t\t\t\t\t$ip6t_m -A PSW $(comment \"$remarks\") -p tcp ${_ipt_source} $(REDIRECT $tcp_port TPROXY) 2>/dev/null\n\t\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tmsg2=\"${msg}不代理 TCP\"\n\t\t\t\t\tfi\n\t\t\t\t\techolog \"     - ${msg2}\"\n\t\t\t\t}\n\n\t\t\t\t[ \"$_ipv4\" != \"1\" ] && $ip6t_m -A PSW $(comment \"$remarks\") ${_ipt_source} -p tcp -j RETURN 2>/dev/null\n\t\t\t\t$ipt_tmp -A PSW $(comment \"$remarks\") ${_ipt_source} -p tcp -j RETURN\n\n\t\t\t\t[ -n \"$udp_port\" ] && {\n\t\t\t\t\tif [ -n \"${udp_proxy_mode}\" ]; then\n\t\t\t\t\t\tmsg2=\"${msg}使用 UDP 节点[$udp_node_remark]\"\n\t\t\t\t\t\tmsg2=\"${msg2}(TPROXY:${udp_port})\"\n\n\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && $ipt_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source} -d $FAKE_IP -j PSW_RULE\n\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_redir_ports \"$(dst $black_set_name) -j PSW_RULE\"\n\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_redir_ports \"$(dst $gfw_set_name) -j PSW_RULE\"\n\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_redir_ports \"$(dst $IPSET_CHN) $(get_jump_ipt ${chn_list} \"-j PSW_RULE\")\"\n\t\t\t\t\t\t[ \"${use_shunt_udp}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_redir_ports \"$(dst $shunt_set_name) -j PSW_RULE\"\n\t\t\t\t\t\t[ \"${udp_proxy_mode}\" != \"disable\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_redir_ports \"-j PSW_RULE\"\n\t\t\t\t\t\t$ipt_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source} $(REDIRECT $udp_port TPROXY)\n\n\t\t\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && [ \"$_ipv4\" != \"1\" ] && {\n\t\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && $ip6t_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source} -d $FAKE_IP_6 -j PSW_RULE 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_redir_ports \"$(dst $black6_set_name) -j PSW_RULE\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_redir_ports \"$(dst $gfw6_set_name) -j PSW_RULE\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_redir_ports \"$(dst $IPSET_CHN6) $(get_jump_ipt ${chn_list} \"-j PSW_RULE\")\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_shunt_udp}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_redir_ports \"$(dst $shunt6_set_name) -j PSW_RULE\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${udp_proxy_mode}\" != \"disable\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_redir_ports \"-j PSW_RULE\" 2>/dev/null\n\t\t\t\t\t\t\t$ip6t_m -A PSW $(comment \"$remarks\") -p udp ${_ipt_source} $(REDIRECT $udp_port TPROXY) 2>/dev/null\n\t\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tmsg2=\"${msg}不代理 UDP\"\n\t\t\t\t\tfi\n\t\t\t\t\techolog \"     - ${msg2}\"\n\t\t\t\t}\n\t\t\t\t[ \"$_ipv4\" != \"1\" ] && $ip6t_m -A PSW $(comment \"$remarks\") ${_ipt_source} -p udp -j RETURN 2>/dev/null\n\t\t\t\t$ipt_m -A PSW $(comment \"$remarks\") ${_ipt_source} -p udp -j RETURN\n\t\t\t\tunset ipt_tmp ipt_j _ipt_source msg msg2 _ipv4\n\t\t\tdone\n\t\t\tunset enabled sid remarks sources use_global_config use_direct_list use_proxy_list use_block_list use_gfw_list chn_list tcp_proxy_mode udp_proxy_mode dns_redirect_port tcp_no_redir_ports udp_no_redir_ports tcp_proxy_drop_ports udp_proxy_drop_ports tcp_redir_ports udp_redir_ports tcp_node udp_node interface\n\t\t\tunset tcp_port udp_port tcp_node_remark udp_node_remark _acl_list use_shunt_tcp use_shunt_udp dns_redirect use_fakedns\n\t\tdone\n\t}\n\t\n\t[ \"$ENABLED_DEFAULT_ACL\" == 1 ] && [ \"$CLIENT_PROXY\" == 1 ] && {\n\t\tmsg=\"【默认】，\"\n\t\tlocal ipt_tmp=$ipt_n\n\t\t[ -n \"${is_tproxy}\" ] && ipt_tmp=$ipt_m\n\n\t\t[ \"$TCP_NO_REDIR_PORTS\" != \"disable\" ] && {\n\t\t\tadd_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p tcp\" $TCP_NO_REDIR_PORTS \"-j RETURN\"\n\t\t\tadd_port_rules \"$ipt_tmp -A PSW $(comment \"默认\") -p tcp\" $TCP_NO_REDIR_PORTS \"-j RETURN\"\n\t\t\tif ! has_1_65535 \"$TCP_NO_REDIR_PORTS\"; then\n\t\t\t\techolog \"     - ${msg}不代理 TCP 端口[${TCP_NO_REDIR_PORTS}]\"\n\t\t\telse\n\t\t\t\tunset TCP_PROXY_MODE\n\t\t\t\techolog \"     - ${msg}不代理所有 TCP 端口\"\n\t\t\tfi\n\t\t}\n\t\t\n\t\t[ \"$UDP_NO_REDIR_PORTS\" != \"disable\" ] && {\n\t\t\tadd_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p udp\" $UDP_NO_REDIR_PORTS \"-j RETURN\"\n\t\t\tadd_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p udp\" $UDP_NO_REDIR_PORTS \"-j RETURN\"\n\t\t\tif ! has_1_65535 \"$UDP_NO_REDIR_PORTS\"; then\n\t\t\t\techolog \"     - ${msg}不代理 UDP 端口[${UDP_NO_REDIR_PORTS}]\"\n\t\t\telse\n\t\t\t\tunset UDP_PROXY_MODE\n\t\t\t\techolog \"     - ${msg}不代理所有 UDP 端口\"\n\t\t\tfi\n\t\t}\n\t\t\n\t\tlocal DNS_REDIRECT\n\t\t[ $(config_t_get global dns_redirect \"1\") = \"1\" ] && DNS_REDIRECT=53\n\t\tif ([ -n \"$TCP_NODE\" ] && [ -n \"${TCP_PROXY_MODE}\" ]) || ([ -n \"$UDP_NODE\" ] && [ -n \"${UDP_PROXY_MODE}\" ]); then\n\t\t\t[ -n \"${DNS_REDIRECT_PORT}\" ] && DNS_REDIRECT=${DNS_REDIRECT_PORT}\n\t\telse\n\t\t\t[ -n \"${DIRECT_DNSMASQ_PORT}\" ] && DNS_REDIRECT=${DIRECT_DNSMASQ_PORT}\n\t\tfi\n\t\t\n\t\tif [ -n \"${DNS_REDIRECT}\" ]; then\n\t\t\t$ipt_m -A PSW $(comment \"默认\") -p udp --dport 53 -j RETURN\n\t\t\t$ip6t_m -A PSW $(comment \"默认\") -p udp --dport 53 -j RETURN 2>/dev/null\n\t\t\t$ipt_m -A PSW $(comment \"默认\") -p tcp --dport 53 -j RETURN\n\t\t\t$ip6t_m -A PSW $(comment \"默认\") -p tcp --dport 53 -j RETURN 2>/dev/null\n\t\t\t$ipt_n -A PSW_DNS $(comment \"默认\") -p udp --dport 53 -j REDIRECT --to-ports ${DNS_REDIRECT}\n\t\t\t$ip6t_n -A PSW_DNS $(comment \"默认\") -p udp --dport 53 -j REDIRECT --to-ports ${DNS_REDIRECT} 2>/dev/null\n\t\t\t$ipt_n -A PSW_DNS $(comment \"默认\") -p tcp --dport 53 -j REDIRECT --to-ports ${DNS_REDIRECT}\n\t\t\t$ip6t_n -A PSW_DNS $(comment \"默认\") -p tcp --dport 53 -j REDIRECT --to-ports ${DNS_REDIRECT} 2>/dev/null\n\t\tfi\n\n\t\t[ -n \"${TCP_PROXY_MODE}\" -o -n \"${UDP_PROXY_MODE}\" ] && {\n\t\t\t[ \"${USE_BLOCK_LIST}\" = \"1\" ] && $ipt_m -A PSW $(comment \"默认\") $(dst $IPSET_BLOCK) -j DROP\n\t\t\t[ \"${USE_DIRECT_LIST}\" = \"1\" ] && $ipt_tmp -A PSW $(comment \"默认\") $(dst $IPSET_WHITE) -j RETURN\n\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t[ \"${USE_BLOCK_LIST}\" = \"1\" ] && $ip6t_m -A PSW $(comment \"默认\") $(dst $IPSET_BLOCK6) -j DROP 2>/dev/null\n\t\t\t\t[ \"${USE_DIRECT_LIST}\" = \"1\" ] && $ip6t_m -A PSW $(comment \"默认\") $(dst $IPSET_WHITE6) -j RETURN 2>/dev/null\n\t\t\t}\n\t\t\t\n\t\t\t[ \"$TCP_PROXY_DROP_PORTS\" != \"disable\" ] && {\n\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p tcp\" $TCP_PROXY_DROP_PORTS \"-d $FAKE_IP_6 -j DROP\"\n\t\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p tcp\" $TCP_PROXY_DROP_PORTS \"$(dst $IPSET_BLACK6) -j DROP\"\n\t\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p tcp\" $TCP_PROXY_DROP_PORTS \"$(dst $IPSET_GFW6) -j DROP\"\n\t\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p tcp\" $TCP_PROXY_DROP_PORTS \"$(dst $IPSET_CHN6) $(get_jump_ipt ${CHN_LIST} \"-j DROP\")\"\n\t\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && $ip6t_m -A PSW $(comment \"默认\") -p tcp $TCP_PROXY_DROP_PORTS \"$(dst $IPSET_SHUNT6) -j DROP\"\n\t\t\t\t\t[ \"${TCP_PROXY_MODE}\" != \"disable\" ] && $ip6t_m -A PSW $(comment \"默认\") -p tcp $TCP_PROXY_DROP_PORTS \"-j DROP\"\n\t\t\t\t}\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p tcp\" $TCP_PROXY_DROP_PORTS \"-d $FAKE_IP -j DROP\"\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p tcp\" $TCP_PROXY_DROP_PORTS \"$(dst $IPSET_BLACK) -j DROP\"\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p tcp\" $TCP_PROXY_DROP_PORTS \"$(dst $IPSET_GFW) -j DROP\"\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p tcp\" $TCP_PROXY_DROP_PORTS \"$(dst $IPSET_CHN) $(get_jump_ipt ${CHN_LIST} \"-j DROP\")\"\n\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p tcp\" $TCP_PROXY_DROP_PORTS $(dst $IPSET_SHUNT) \"-j DROP\"\n\t\t\t\t[ \"${TCP_PROXY_MODE}\" != \"disable\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p tcp\" $TCP_PROXY_DROP_PORTS \"-j DROP\"\n\t\t\t\techolog \"     - ${msg}屏蔽代理 TCP 端口[${TCP_PROXY_DROP_PORTS}]\"\n\t\t\t}\n\t\t\t\n\t\t\t[ \"$UDP_PROXY_DROP_PORTS\" != \"disable\" ] && {\n\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p udp\" $UDP_PROXY_DROP_PORTS \"-d $FAKE_IP_6 -j DROP\"\n\t\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p udp\" $UDP_PROXY_DROP_PORTS \"$(dst $IPSET_BLACK6) -j DROP\"\n\t\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p udp\" $UDP_PROXY_DROP_PORTS \"$(dst $IPSET_GFW6) -j DROP\"\n\t\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p udp\" $UDP_PROXY_DROP_PORTS \"$(dst $IPSET_CHN6) $(get_jump_ipt ${CHN_LIST} \"-j DROP\")\"\n\t\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p udp\" $UDP_PROXY_DROP_PORTS \"$(dst $IPSET_SHUNT6) -j DROP\"\n\t\t\t\t\t[ \"${UDP_PROXY_MODE}\" != \"disable\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p udp\" $UDP_PROXY_DROP_PORTS \"-j DROP\"\n\t\t\t\t}\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p udp\" $UDP_PROXY_DROP_PORTS \"-d $FAKE_IP -j DROP\"\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p udp\" $UDP_PROXY_DROP_PORTS \"$(dst $IPSET_BLACK) -j DROP\"\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p udp\" $UDP_PROXY_DROP_PORTS \"$(dst $IPSET_GFW) -j DROP\"\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p udp\" $UDP_PROXY_DROP_PORTS \"$(dst $IPSET_CHN) $(get_jump_ipt ${CHN_LIST} \"-j DROP\")\"\n\t\t\t\t[ \"${USE_SHUNT_UDP}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p udp\" $UDP_PROXY_DROP_PORTS \"$(dst $IPSET_SHUNT) -j DROP\"\n\t\t\t\t[ \"${UDP_PROXY_MODE}\" != \"disable\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p udp\" $UDP_PROXY_DROP_PORTS \"-j DROP\"\n\t\t\t\techolog \"     - ${msg}屏蔽代理 UDP 端口[${UDP_PROXY_DROP_PORTS}]\"\n\t\t\t}\n\t\t}\n\n\t\t#  加载TCP默认代理模式\n\t\tif [ -n \"${TCP_PROXY_MODE}\" ]; then\n\t\t\t[ -n \"$TCP_NODE\" ] && {\n\t\t\t\tif is_socks_wrap \"$TCP_NODE\"; then\n\t\t\t\t\tmsg2=\"${msg}使用 TCP 节点[Socks 配置($(config_n_get ${TCP_NODE#Socks_} port) 端口)]\"\n\t\t\t\telse\n\t\t\t\t\tmsg2=\"${msg}使用 TCP 节点[$(config_n_get $TCP_NODE remarks)]\"\n\t\t\t\tfi\n\t\t\t\tif [ -n \"${is_tproxy}\" ]; then\n\t\t\t\t\tmsg2=\"${msg2}(TPROXY:${TCP_REDIR_PORT})\"\n\t\t\t\t\tipt_j=\"-j PSW_RULE\"\n\t\t\t\telse\n\t\t\t\t\tmsg2=\"${msg2}(REDIRECT:${TCP_REDIR_PORT})\"\n\t\t\t\t\tipt_j=\"$(REDIRECT $TCP_REDIR_PORT)\"\n\t\t\t\tfi\n\t\t\t\t\n\t\t\t\t[ \"$accept_icmp\" = \"1\" ] && {\n\t\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && $ipt_n -A PSW $(comment \"默认\") -p icmp -d $FAKE_IP $(REDIRECT)\n\t\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && $ipt_n -A PSW $(comment \"默认\") -p icmp $(dst $IPSET_BLACK) $(REDIRECT)\n\t\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && $ipt_n -A PSW $(comment \"默认\") -p icmp $(dst $IPSET_GFW) $(REDIRECT)\n\t\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && $ipt_n -A PSW $(comment \"默认\") -p icmp $(dst $IPSET_CHN) $(get_jump_ipt ${CHN_LIST})\n\t\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && $ipt_n -A PSW $(comment \"默认\") -p icmp $(dst $IPSET_SHUNT) $(REDIRECT)\n\t\t\t\t\t[ \"${TCP_PROXY_MODE}\" != \"disable\" ] && $ipt_n -A PSW $(comment \"默认\") -p icmp $(REDIRECT)\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t[ \"$accept_icmpv6\" = \"1\" ] && [ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && $ip6t_n -A PSW $(comment \"默认\") -p ipv6-icmp -d $FAKE_IP_6 $(REDIRECT)\n\t\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && $ip6t_n -A PSW $(comment \"默认\") -p ipv6-icmp $(dst $IPSET_BLACK6) $(REDIRECT)\n\t\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && $ip6t_n -A PSW $(comment \"默认\") -p ipv6-icmp $(dst $IPSET_GFW6) $(REDIRECT)\n\t\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && $ip6t_n -A PSW $(comment \"默认\") -p ipv6-icmp $(dst $IPSET_CHN6) $(get_jump_ipt ${CHN_LIST})\n\t\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && $ip6t_n -A PSW $(comment \"默认\") -p ipv6-icmp $(dst $IPSET_SHUNT6) $(REDIRECT)\n\t\t\t\t\t[ \"${TCP_PROXY_MODE}\" != \"disable\" ] && $ip6t_n -A PSW $(comment \"默认\") -p ipv6-icmp $(REDIRECT)\n\t\t\t\t}\n\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && $ipt_tmp -A PSW $(comment \"默认\") -p tcp -d $FAKE_IP ${ipt_j}\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && add_port_rules \"$ipt_tmp -A PSW $(comment \"默认\") -p tcp\" $TCP_REDIR_PORTS \"$(dst $IPSET_BLACK) ${ipt_j}\"\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && add_port_rules \"$ipt_tmp -A PSW $(comment \"默认\") -p tcp\" $TCP_REDIR_PORTS \"$(dst $IPSET_GFW) ${ipt_j}\"\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && add_port_rules \"$ipt_tmp -A PSW $(comment \"默认\") -p tcp\" $TCP_REDIR_PORTS \"$(dst $IPSET_CHN) $(get_jump_ipt ${CHN_LIST} \"${ipt_j}\")\"\n\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && add_port_rules \"$ipt_tmp -A PSW $(comment \"默认\") -p tcp\" $TCP_REDIR_PORTS \"$(dst $IPSET_SHUNT) ${ipt_j}\"\n\t\t\t\t[ \"${TCP_PROXY_MODE}\" != \"disable\" ] && add_port_rules \"$ipt_tmp -A PSW $(comment \"默认\") -p tcp\" $TCP_REDIR_PORTS \"${ipt_j}\"\n\t\t\t\t[ -n \"${is_tproxy}\" ]&& $ipt_tmp -A PSW $(comment \"默认\") -p tcp $(REDIRECT $TCP_REDIR_PORT TPROXY)\n\n\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && $ip6t_m -A PSW $(comment \"默认\") -p tcp -d $FAKE_IP_6 -j PSW_RULE\n\t\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p tcp\" $TCP_REDIR_PORTS \"$(dst $IPSET_BLACK6) -j PSW_RULE\"\n\t\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p tcp\" $TCP_REDIR_PORTS \"$(dst $IPSET_GFW6) -j PSW_RULE\"\n\t\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p tcp\" $TCP_REDIR_PORTS \"$(dst $IPSET_CHN6) $(get_jump_ipt ${CHN_LIST} \"-j PSW_RULE\")\"\n\t\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p tcp\" $TCP_REDIR_PORTS \"$(dst $IPSET_SHUNT6) -j PSW_RULE\"\n\t\t\t\t\t[ \"${TCP_PROXY_MODE}\" != \"disable\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p tcp\" $TCP_REDIR_PORTS \"-j PSW_RULE\"\n\t\t\t\t\t$ip6t_m -A PSW $(comment \"默认\") -p tcp $(REDIRECT $TCP_REDIR_PORT TPROXY)\n\t\t\t\t}\n\n\t\t\t\techolog \"     - ${msg2}\"\n\t\t\t}\n\t\tfi\n\t\t$ipt_n -A PSW $(comment \"默认\") -p tcp -j RETURN\n\t\t$ipt_m -A PSW $(comment \"默认\") -p tcp -j RETURN\n\t\t$ip6t_m -A PSW $(comment \"默认\") -p tcp -j RETURN\n\n\t\t#  加载UDP默认代理模式\n\t\tif [ -n \"${UDP_PROXY_MODE}\" ]; then\n\t\t\t[ -n \"$UDP_NODE\" -o \"$TCP_UDP\" = \"1\" ] && {\n\t\t\t\tif is_socks_wrap \"$UDP_NODE\"; then\n\t\t\t\t\tmsg2=\"${msg}使用 UDP 节点[Socks 配置($(config_n_get ${UDP_NODE#Socks_} port) 端口)](TPROXY:${UDP_REDIR_PORT})\"\n\t\t\t\telse\n\t\t\t\t\tmsg2=\"${msg}使用 UDP 节点[$(config_n_get $UDP_NODE remarks)](TPROXY:${UDP_REDIR_PORT})\"\n\t\t\t\tfi\n\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && $ipt_m -A PSW $(comment \"默认\") -p udp -d $FAKE_IP -j PSW_RULE\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p udp\" $UDP_REDIR_PORTS \"$(dst $IPSET_BLACK) -j PSW_RULE\"\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p udp\" $UDP_REDIR_PORTS \"$(dst $IPSET_GFW) -j PSW_RULE\"\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p udp\" $UDP_REDIR_PORTS \"$(dst $IPSET_CHN) $(get_jump_ipt ${CHN_LIST} \"-j PSW_RULE\")\"\n\t\t\t\t[ \"${USE_SHUNT_UDP}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p udp\" $UDP_REDIR_PORTS \"$(dst $IPSET_SHUNT) -j PSW_RULE\"\n\t\t\t\t[ \"${UDP_PROXY_MODE}\" != \"disable\" ] && add_port_rules \"$ipt_m -A PSW $(comment \"默认\") -p udp\" $UDP_REDIR_PORTS \"-j PSW_RULE\"\n\t\t\t\t$ipt_m -A PSW $(comment \"默认\") -p udp $(REDIRECT $UDP_REDIR_PORT TPROXY)\n\n\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && $ip6t_m -A PSW $(comment \"默认\") -p udp -d $FAKE_IP_6 -j PSW_RULE\n\t\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p udp\" $UDP_REDIR_PORTS \"$(dst $IPSET_BLACK6) -j PSW_RULE\"\n\t\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p udp\" $UDP_REDIR_PORTS \"$(dst $IPSET_GFW6) -j PSW_RULE\"\n\t\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p udp\" $UDP_REDIR_PORTS \"$(dst $IPSET_CHN6) $(get_jump_ipt ${CHN_LIST} \"-j PSW_RULE\")\"\n\t\t\t\t\t[ \"${USE_SHUNT_UDP}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p udp\" $UDP_REDIR_PORTS \"$(dst $IPSET_SHUNT6) -j PSW_RULE\"\n\t\t\t\t\t[ \"${UDP_PROXY_MODE}\" != \"disable\" ] && add_port_rules \"$ip6t_m -A PSW $(comment \"默认\") -p udp\" $UDP_REDIR_PORTS \"-j PSW_RULE\"\n\t\t\t\t\t$ip6t_m -A PSW $(comment \"默认\") -p udp $(REDIRECT $UDP_REDIR_PORT TPROXY)\n\t\t\t\t}\n\n\t\t\t\techolog \"     - ${msg2}\"\n\t\t\t}\n\t\tfi\n\t\t$ipt_m -A PSW $(comment \"默认\") -p udp -j RETURN\n\t\t$ip6t_m -A PSW $(comment \"默认\") -p udp -j RETURN\n\t}\n}\n\nfilter_haproxy() {\n\tfor item in ${haproxy_items}; do\n\t\tlocal ip=$(get_host_ip ipv4 $(echo $item | awk -F \":\" '{print $1}') 1)\n\t\tipset -q add $IPSET_VPS $ip\n\tdone\n\techolog \"  - [$?]加入负载均衡的节点到ipset[$IPSET_VPS]直连完成\"\n}\n\nfilter_vpsip() {\n\tuci show $CONFIG | grep -E \"(.address=|.download_address=)\" | cut -d \"'\" -f 2 | grep -E \"([0-9]{1,3}[\\.]){3}[0-9]{1,3}\" | grep -v \"^127\\.0\\.0\\.1$\" | sed -e \"/^$/d\" | sed -e \"s/^/add $IPSET_VPS &/g\" | awk '{print $0} END{print \"COMMIT\"}' | ipset -! -R\n\techolog \"  - [$?]加入所有IPv4节点到ipset[$IPSET_VPS]直连完成\"\n\tuci show $CONFIG | grep -E \"(.address=|.download_address=)\" | cut -d \"'\" -f 2 | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | sed -e \"/^$/d\" | sed -e \"s/^/add $IPSET_VPS6 &/g\" | awk '{print $0} END{print \"COMMIT\"}' | ipset -! -R\n\techolog \"  - [$?]加入所有IPv6节点到ipset[$IPSET_VPS6]直连完成\"\n\t#订阅方式为直连时\n\tget_subscribe_host | grep -E \"([0-9]{1,3}[\\.]){3}[0-9]{1,3}\" | grep -v \"^127\\.0\\.0\\.1$\" | sed -e \"/^$/d\" | sed -e \"s/^/add $IPSET_VPS &/g\" | awk '{print $0} END{print \"COMMIT\"}' | ipset -! -R\n\tget_subscribe_host | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | sed -e \"/^$/d\" | sed -e \"s/^/add $IPSET_VPS6 &/g\" | awk '{print $0} END{print \"COMMIT\"}' | ipset -! -R\n}\n\nfilter_server_port() {\n\tlocal address=\"$1\"\n\tlocal port=$(echo \"$2\" | tr '-' ':' | tr -d ' ')\n\tlocal stream=$(echo \"$3\" | tr 'A-Z' 'a-z')\n\tlocal ipt_tmp=\"$ipt_n\" _is_tproxy _ipt_cmd _ver multi_ports p ports\n\t[ \"$(config_t_get global_forwarding tcp_proxy_way redirect)\" = \"tproxy\" ] && _is_tproxy=\"TPROXY\"\n\t[ \"$stream\" = \"udp\" ] && _is_tproxy=\"TPROXY\"\n\t[ -n \"$_is_tproxy\" ] && ipt_tmp=\"$ipt_m\"\n\tfor _ver in 4 6; do\n\t\t[ \"$_ver\" = \"4\" ] && _ipt_cmd=\"$ipt_tmp\"\n\t\t[ \"$_ver\" = \"6\" ] && _ipt_cmd=\"$ip6t_m\"\n\t\tmulti_ports=\"\"\n\t\tfor p in $(echo \"$port\" | tr ',' ' '); do\n\t\t\tcase \"$p\" in\n\t\t\t\t*:* )\n\t\t\t\t\t$_ipt_cmd -n -L PSW_OUTPUT 2>/dev/null | grep -q \"${address}:${p}:${stream}\" || \\\n\t\t\t\t\t$_ipt_cmd -I PSW_OUTPUT $(comment \"${address}:${p}:${stream}\") -p \"$stream\" -d \"$address\" --dport \"$p\" -j RETURN 2>/dev/null\n\t\t\t\t\t;;\n\t\t\t\t* )\n\t\t\t\t\tmulti_ports=\"${multi_ports},$p\"\n\t\t\t\t\t;;\n\t\t\tesac\n\t\tdone\n\t\tif [ -n \"$multi_ports\" ]; then\n\t\t\tports=$(printf \"%s\\n\" \"${multi_ports#,}\" | tr ',' '\\n' | sort -n | tr '\\n' ',' | sed 's/,$//')\n\t\t\t$_ipt_cmd -n -L PSW_OUTPUT 2>/dev/null | grep -q \"${address}:${ports}:${stream}\" || \\\n\t\t\t$_ipt_cmd -I PSW_OUTPUT $(comment \"${address}:${ports}:${stream}\") -p \"$stream\" -d \"$address\" -m multiport --dports \"$ports\" -j RETURN 2>/dev/null\n\t\tfi\n\tdone\n}\n\nfilter_node() {\n\tlocal node=\"$1\" stream=\"$2\"\n\t[ -z \"$node\" ] && return 1\n\tlocal address=$(config_n_get \"$node\" address)\n\tlocal port=$(config_n_get \"$node\" port)\n\tlocal hop=$(config_n_get \"$node\" hysteria2_hop)\n\t[ -n \"$hop\" ] && port=\"${port:+$port,}$hop\" \n\t[ -z \"$address\" -o -z \"$port\" ] && return 1\n\tfilter_server_port \"$address\" \"$port\" \"$stream\"\n}\n\nfilter_direct_node_list() {\n\t[ ! -s \"$TMP_PATH/direct_node_list\" ] && return\n\tawk '!seen[$0]++' \"$TMP_PATH/direct_node_list\" | while read -r _node_id; do\n\t\tfilter_node \"$_node_id\" TCP\n\t\tfilter_node \"$_node_id\" UDP\n\t\tunset _node_id\n\tdone\n}\n\nupdate_wan_sets() {\n\tlocal log=$1\n\n\t[ -z \"$(command -v get_wan_ips)\" ] && . \"$UTILS_PATH\"\n\n\tlocal WAN_IP=$(get_wan_ips ip4)\n\t[ -n \"$WAN_IP\" ] && {\n\t\tipset -F \"$IPSET_WAN\"\n\t\tfor wan_ip in $WAN_IP; do\n\t\t\tipset -! add \"$IPSET_WAN\" \"$wan_ip\"\n\t\tdone\n\t\t[ \"$log\" = \"log\" ] && {\n\t\t\tlocal wan_ip\n\t\t\tfor wan_ip in $WAN_IP; do\n\t\t\t\techolog \"  - [$?]加入WAN IPv4到ipset[$IPSET_WAN]：${wan_ip}\"\n\t\t\tdone\n\t\t}\n\t}\n\n\tlocal WAN6_IP=$(get_wan_ips ip6)\n\t[ -n \"$WAN6_IP\" ] && {\n\t\tipset -F \"$IPSET_WAN6\"\n\t\tfor wan6_ip in $WAN6_IP; do\n\t\t\tipset -! add \"$IPSET_WAN6\" \"$wan6_ip\"\n\t\tdone\n\t\t[ \"$log\" = \"log\" ] && {\n\t\t\tlocal wan6_ip\n\t\t\tfor wan6_ip in $WAN6_IP; do\n\t\t\t\techolog \"  - [$?]加入WAN IPv6到ipset[$IPSET_WAN6]：${wan6_ip}\"\n\t\t\tdone\n\t\t}\n\t}\n}\n\nadd_firewall_rule() {\n\techolog \"开始加载 iptables 防火墙规则...\"\n\tipset -! create $IPSET_LOCAL nethash maxelem 1048576\n\tipset -! create $IPSET_WAN nethash maxelem 1048576\n\tipset -! create $IPSET_LAN nethash maxelem 1048576\n\tipset -! create $IPSET_VPS nethash maxelem 1048576\n\tipset -! create $IPSET_SHUNT nethash maxelem 1048576 timeout 172800\n\tipset -! create $IPSET_GFW nethash maxelem 1048576 timeout 172800\n\tipset -! create $IPSET_CHN nethash maxelem 1048576 timeout 172800\n\tipset -! create $IPSET_BLACK nethash maxelem 1048576 timeout 172800\n\tipset -! create $IPSET_WHITE nethash maxelem 1048576 timeout 172800\n\tipset -! create $IPSET_BLOCK nethash maxelem 1048576 timeout 172800\n\n\tipset -! create $IPSET_LOCAL6 nethash family inet6 maxelem 1048576\n\tipset -! create $IPSET_WAN6 nethash family inet6 maxelem 1048576\n\tipset -! create $IPSET_LAN6 nethash family inet6 maxelem 1048576\n\tipset -! create $IPSET_VPS6 nethash family inet6 maxelem 1048576\n\tipset -! create $IPSET_SHUNT6 nethash family inet6 maxelem 1048576 timeout 172800\n\tipset -! create $IPSET_GFW6 nethash family inet6 maxelem 1048576 timeout 172800\n\tipset -! create $IPSET_CHN6 nethash family inet6 maxelem 1048576 timeout 172800\n\tipset -! create $IPSET_BLACK6 nethash family inet6 maxelem 1048576 timeout 172800\n\tipset -! create $IPSET_WHITE6 nethash family inet6 maxelem 1048576 timeout 172800\n\tipset -! create $IPSET_BLOCK6 nethash family inet6 maxelem 1048576 timeout 172800\n\n\tcat $RULES_PATH/chnroute | tr -s '\\n' | grep -v \"^#\" | sed -e \"/^$/d\" | sed -e \"s/^/add $IPSET_CHN &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\tcat $RULES_PATH/chnroute6 | tr -s '\\n' | grep -v \"^#\" | sed -e \"/^$/d\" | sed -e \"s/^/add $IPSET_CHN6 &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\n\t#导入规则列表、分流规则中的IP列表\n\tlocal USE_SHUNT_NODE=0\n\tlocal USE_PROXY_LIST_ALL=${USE_PROXY_LIST}\n\tlocal USE_DIRECT_LIST_ALL=${USE_DIRECT_LIST}\n\tlocal USE_BLOCK_LIST_ALL=${USE_BLOCK_LIST}\n\tlocal _TCP_NODE=$(config_t_get global tcp_node)\n\tlocal _UDP_NODE=$(config_t_get global udp_node)\n\tlocal USE_GEOVIEW=$(config_t_get global_rules enable_geoview)\n\t[ -z \"$(first_type $(config_t_get global_app geoview_file) geoview)\" ] && USE_GEOVIEW=0\n\n\t[ -n \"$_TCP_NODE\" ] && [ \"$(config_n_get $_TCP_NODE protocol)\" = \"_shunt\" ] && USE_SHUNT_TCP=1 && USE_SHUNT_NODE=1\n\t[ -n \"$_UDP_NODE\" ] && [ \"$(config_n_get $_UDP_NODE protocol)\" = \"_shunt\" ] && USE_SHUNT_UDP=1 && USE_SHUNT_NODE=1\n\t[ \"$_UDP_NODE\" = \"tcp\" ] && USE_SHUNT_UDP=$USE_SHUNT_TCP\n\n\tfor acl_section in $(uci show ${CONFIG} | grep \"=acl_rule\" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do\n\t\t[ \"$(config_n_get $acl_section enabled)\" != \"1\" ] && continue\n\t\t[ \"$(config_n_get $acl_section use_global_config 0)\" != \"1\" ] && {\n\t\t\t[ \"$(config_n_get $acl_section use_direct_list 1)\" = \"1\" ] && USE_PROXY_LIST_ALL=1\n\t\t\t[ \"$(config_n_get $acl_section use_proxy_list 1)\" = \"1\" ] && USE_DIRECT_LIST_ALL=1\n\t\t\t[ \"$(config_n_get $acl_section use_block_list 1)\" = \"1\" ] && USE_BLOCK_LIST_ALL=1\n\t\t}\n\t\tfor _node in $(config_n_get $acl_section tcp_node) $(config_n_get $acl_section udp_node); do\n\t\t\tlocal node_protocol=$(config_n_get $_node protocol)\n\t\t\t[ \"$node_protocol\" = \"_shunt\" ] && { USE_SHUNT_NODE=1; break; }\n\t\tdone\n\tdone\n\n\t#直连列表\n\t[ \"$USE_DIRECT_LIST_ALL\" = \"1\" ] && {\n\t\tcat $RULES_PATH/direct_ip | tr -s \"\\r\\n\" \"\\n\" | grep -v \"^#\" | sed -e \"/^$/d\" | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | sed -e \"s/^/add $IPSET_WHITE &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\t\tcat $RULES_PATH/direct_ip | tr -s \"\\r\\n\" \"\\n\" | grep -v \"^#\" | sed -e \"/^$/d\" | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | sed -e \"s/^/add $IPSET_WHITE6 &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\t\t[ \"$USE_GEOVIEW\" = \"1\" ] && {\n\t\t\tlocal GEOIP_CODE=$(cat $RULES_PATH/direct_ip | tr -s \"\\r\\n\" \"\\n\" | sed -e \"/^$/d\" | grep -E \"^geoip:\" | grep -v \"^geoip:private\" | sed -E 's/^geoip:(.*)/\\1/' | sed ':a;N;$!ba;s/\\n/,/g')\n\t\t\tif [ -n \"$GEOIP_CODE\" ]; then\n\t\t\t\tget_geoip $GEOIP_CODE ipv4 | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | sed -e \"s/^/add $IPSET_WHITE &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\t\t\t\tget_geoip $GEOIP_CODE ipv6 | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | sed -e \"s/^/add $IPSET_WHITE6 &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\t\t\t\techolog \"  - [$?]解析并加入[直连列表] GeoIP 到 IPSET 完成\"\n\t\t\tfi\n\t\t}\n\t}\n\n\t#代理列表\n\t[ \"$USE_PROXY_LIST_ALL\" = \"1\" ] && {\n\t\tcat $RULES_PATH/proxy_ip | tr -s \"\\r\\n\" \"\\n\" | grep -v \"^#\" | sed -e \"/^$/d\" | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | sed -e \"s/^/add $IPSET_BLACK &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\t\tcat $RULES_PATH/proxy_ip | tr -s \"\\r\\n\" \"\\n\" | grep -v \"^#\" | sed -e \"/^$/d\" | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | sed -e \"s/^/add $IPSET_BLACK6 &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\t\t[ \"$USE_GEOVIEW\" = \"1\" ] && {\n\t\t\tlocal GEOIP_CODE=$(cat $RULES_PATH/proxy_ip | tr -s \"\\r\\n\" \"\\n\" | sed -e \"/^$/d\" | grep -E \"^geoip:\" | grep -v \"^geoip:private\" | sed -E 's/^geoip:(.*)/\\1/' | sed ':a;N;$!ba;s/\\n/,/g')\n\t\t\tif [ -n \"$GEOIP_CODE\" ]; then\n\t\t\t\tget_geoip $GEOIP_CODE ipv4 | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | sed -e \"s/^/add $IPSET_BLACK &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\t\t\t\tget_geoip $GEOIP_CODE ipv6 | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | sed -e \"s/^/add $IPSET_BLACK6 &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\t\t\t\techolog \"  - [$?]解析并加入[代理列表] GeoIP 到 IPSET 完成\"\n\t\t\tfi\n\t\t}\n\t}\n\n\t#屏蔽列表\n\t[ \"$USE_BLOCK_LIST_ALL\" = \"1\" ] && {\n\t\tcat $RULES_PATH/block_ip | tr -s \"\\r\\n\" \"\\n\" | grep -v \"^#\" | sed -e \"/^$/d\" | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | sed -e \"s/^/add $IPSET_BLOCK &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\t\tcat $RULES_PATH/block_ip | tr -s \"\\r\\n\" \"\\n\" | grep -v \"^#\" | sed -e \"/^$/d\" | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | sed -e \"s/^/add $IPSET_BLOCK6 &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\t\t[ \"$USE_GEOVIEW\" = \"1\" ] && {\n\t\t\tlocal GEOIP_CODE=$(cat $RULES_PATH/block_ip | tr -s \"\\r\\n\" \"\\n\" | sed -e \"/^$/d\" | grep -E \"^geoip:\" | grep -v \"^geoip:private\" | sed -E 's/^geoip:(.*)/\\1/' | sed ':a;N;$!ba;s/\\n/,/g')\n\t\t\tif [ -n \"$GEOIP_CODE\" ]; then\n\t\t\t\tget_geoip $GEOIP_CODE ipv4 | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | sed -e \"s/^/add $IPSET_BLOCK &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\t\t\t\tget_geoip $GEOIP_CODE ipv6 | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | sed -e \"s/^/add $IPSET_BLOCK6 &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\t\t\t\techolog \"  - [$?]解析并加入[屏蔽列表] GeoIP 到 IPSET 完成\"\n\t\t\tfi\n\t\t}\n\t}\n\n\t#分流列表\n\t[ \"$USE_SHUNT_NODE\" = \"1\" ] && {\n\t\tlocal GEOIP_CODE=\"\"\n\t\tlocal shunt_ids=$(uci show $CONFIG | grep \"=shunt_rules\" | awk -F '.' '{print $2}' | awk -F '=' '{print $1}')\n\t\tfor shunt_id in $shunt_ids; do\n\t\t\tconfig_n_get $shunt_id ip_list | tr -s \"\\r\\n\" \"\\n\" | grep -v \"^#\" | sed -e \"/^$/d\" | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | sed -e \"s/^/add $IPSET_SHUNT &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\t\t\tconfig_n_get $shunt_id ip_list | tr -s \"\\r\\n\" \"\\n\" | grep -v \"^#\" | sed -e \"/^$/d\" | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | sed -e \"s/^/add $IPSET_SHUNT6 &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\t\t\t[ \"$USE_GEOVIEW\" = \"1\" ] && {\n\t\t\t\tlocal geoip_code=$(config_n_get $shunt_id ip_list | tr -s \"\\r\\n\" \"\\n\" | sed -e \"/^$/d\" | grep -E \"^geoip:\" | grep -v \"^geoip:private\" | sed -E 's/^geoip:(.*)/\\1/' | sed ':a;N;$!ba;s/\\n/,/g')\n\t\t\t\t[ -n \"$geoip_code\" ] && GEOIP_CODE=\"${GEOIP_CODE:+$GEOIP_CODE,}$geoip_code\"\n\t\t\t}\n\t\tdone\n\t\tif [ -n \"$GEOIP_CODE\" ]; then\n\t\t\tget_geoip $GEOIP_CODE ipv4 | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | sed -e \"s/^/add $IPSET_SHUNT &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\t\t\tget_geoip $GEOIP_CODE ipv6 | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | sed -e \"s/^/add $IPSET_SHUNT6 &/g\" -e \"s/$/ timeout 0/g\" | ipset -! -R\n\t\t\techolog \"  - [$?]解析并加入[分流节点] GeoIP 到 IPSET 完成\"\n\t\tfi\n\t}\n\t\n\tget_local_ips ip4 | sed \"s/^/add $IPSET_LOCAL /\" | ipset -! -R\n\tget_local_ips ip6 | sed \"s/^/add $IPSET_LOCAL6 /\" | ipset -! -R\n\n\t#局域网IP列表\n\tipset -! -R <<-EOF\n\t\t$(gen_lanlist | sed -e \"s/^/add $IPSET_LAN /\")\n\tEOF\n\n\tipset -! -R <<-EOF\n\t\t$(gen_lanlist_6 | sed -e \"s/^/add $IPSET_LAN6 /\")\n\tEOF\n\n\t# 忽略特殊IP段\n\tlocal lan_ifname lan_ip\n\tlan_ifname=$(uci -q -p /tmp/state get network.lan.ifname)\n\t[ -n \"$lan_ifname\" ] && {\n\t\tlan_ip=$(ip address show $lan_ifname | grep -w \"inet\" | awk '{print $2}')\n\t\tlan_ip6=$(ip address show $lan_ifname | grep -w \"inet6\" | awk '{print $2}')\n\t\t#echolog \"本机IPv4网段互访直连：${lan_ip}\"\n\t\t#echolog \"本机IPv6网段互访直连：${lan_ip6}\"\n\n\t\t[ -n \"$lan_ip\" ] && ipset -! -R <<-EOF\n\t\t\t$(echo $lan_ip | sed -e \"s/ /\\n/g\" | sed -e \"s/^/add $IPSET_LAN /\")\n\t\tEOF\n\n\t\t[ -n \"$lan_ip6\" ] && ipset -! -R <<-EOF\n\t\t\t$(echo $lan_ip6 | sed -e \"s/ /\\n/g\" | sed -e \"s/^/add $IPSET_LAN6 /\")\n\t\tEOF\n\t}\n\n\tupdate_wan_sets \"log\"\n\n\t[ -n \"$ISP_DNS\" ] && {\n\t\t#echolog \"处理 ISP DNS 例外...\"\n\t\tfor ispip in $ISP_DNS; do\n\t\t\tipset -! add $IPSET_WHITE $ispip timeout 0\n\t\t\techolog \"  - [$?]追加ISP IPv4 DNS到白名单：${ispip}\"\n\t\tdone\n\t}\n\n\t[ -n \"$ISP_DNS6\" ] && {\n\t\t#echolog \"处理 ISP IPv6 DNS 例外...\"\n\t\tfor ispip6 in $ISP_DNS6; do\n\t\t\tipset -! add $IPSET_WHITE6 $ispip6 timeout 0\n\t\t\techolog \"  - [$?]追加ISP IPv6 DNS到白名单：${ispip6}\"\n\t\tdone\n\t}\n\n\t#  过滤所有节点IP\n\tfilter_vpsip > /dev/null 2>&1 &\n\t# filter_haproxy > /dev/null 2>&1 &\n\n\taccept_icmp=$(config_t_get global_forwarding accept_icmp 0)\n\taccept_icmpv6=$(config_t_get global_forwarding accept_icmpv6 0)\n\n\tif [ \"${TCP_PROXY_WAY}\" = \"redirect\" ]; then\n\t\tunset is_tproxy\n\telif [ \"${TCP_PROXY_WAY}\" = \"tproxy\" ]; then\n\t\tis_tproxy=\"TPROXY\"\n\tfi\n\n\t$ipt_n -N PSW\n\t$ipt_n -A PSW $(dst $IPSET_LAN) -j RETURN\n\t$ipt_n -A PSW $(dst $IPSET_VPS) -j RETURN\n\n\t$ipt_n -A PSW $(comment \"WAN_IP_RETURN\") $(dst $IPSET_WAN) -j RETURN\n\n\t[ \"$accept_icmp\" = \"1\" ] && insert_rule_after \"$ipt_n\" \"PREROUTING\" \"prerouting_rule\" \"-p icmp -j PSW\"\n\t[ -z \"${is_tproxy}\" ] && insert_rule_after \"$ipt_n\" \"PREROUTING\" \"prerouting_rule\" \"-p tcp -j PSW\"\n\n\t$ipt_n -N PSW_OUTPUT\n\t$ipt_n -A PSW_OUTPUT $(dst $IPSET_LAN) -j RETURN\n\t$ipt_n -A PSW_OUTPUT $(dst $IPSET_VPS) -j RETURN\n\t[ \"${USE_DIRECT_LIST}\" = \"1\" ] && $ipt_n -A PSW_OUTPUT $(dst $IPSET_WHITE) -j RETURN\n\t$ipt_n -A PSW_OUTPUT -m mark --mark 255 -j RETURN\n\n\t$ipt_n -N PSW_DNS\n\tif [ $(config_t_get global dns_redirect \"1\") = \"0\" ]; then\n\t\t#Only hijack when dest address is local IP\n\t\t$ipt_n -I PREROUTING -m set --match-set $IPSET_LAN src $(dst $IPSET_LOCAL) -j PSW_DNS\n\telse\n\t\t$ipt_n -I PREROUTING -m set --match-set $IPSET_LAN src -j PSW_DNS\n\tfi\n\n\t$ipt_m -N PSW_DIVERT\n\t$ipt_m -A PSW_DIVERT -j MARK --set-mark ${FWMARK}\n\t$ipt_m -A PSW_DIVERT -j ACCEPT\n\n\t$ipt_m -N PSW_RULE\n\t$ipt_m -A PSW_RULE -j CONNMARK --restore-mark\n\t$ipt_m -A PSW_RULE -m mark --mark ${FWMARK} -j RETURN\n\t$ipt_m -A PSW_RULE -p tcp -m tcp --syn -j MARK --set-xmark ${FWMARK}\n\t$ipt_m -A PSW_RULE -p udp -m conntrack --ctstate NEW,RELATED -j MARK --set-xmark ${FWMARK}\n\t$ipt_m -A PSW_RULE -j CONNMARK --save-mark\n\n\t$ipt_m -N PSW\n\t$ipt_m -A PSW $(dst $IPSET_LAN) -j RETURN\n\t$ipt_m -A PSW $(dst $IPSET_VPS) -j RETURN\n\t$ipt_m -A PSW -m conntrack --ctdir REPLY -j RETURN\n\n\t$ipt_m -A PSW $(comment \"WAN_IP_RETURN\") $(dst $IPSET_WAN) -j RETURN\n\n\tinsert_rule_before \"$ipt_m\" \"PREROUTING\" \"mwan3\" \"-j PSW\"\n\t# Only TCP, UDP Invalid.\n\tinsert_rule_before \"$ipt_m\" \"PREROUTING\" \"PSW\" \"-p tcp -m socket -j PSW_DIVERT\"\n\n\t$ipt_m -N PSW_OUTPUT\n\t$ipt_m -A PSW_OUTPUT $(dst $IPSET_LAN) -j RETURN\n\t$ipt_m -A PSW_OUTPUT $(dst $IPSET_VPS) -j RETURN\n\t[ -n \"$IPT_APPEND_DNS\" ] && {\n\t\tlocal local_dns dns_address dns_port\n\t\tfor local_dns in $(echo $IPT_APPEND_DNS | tr ',' ' '); do\n\t\t\tdns_address=$(echo \"$local_dns\" | sed -E 's/(@|\\[)?([0-9a-fA-F:.]+)(@|#|$).*/\\2/')\n\t\t\tdns_port=$(echo \"$local_dns\" | sed -nE 's/.*#([0-9]+)$/\\1/p')\n\t\t\tif echo \"$dns_address\" | grep -q -v ':'; then\n\t\t\t\t$ipt_m -A PSW_OUTPUT -p udp -d ${dns_address} --dport ${dns_port:-53} -j RETURN\n\t\t\t\t$ipt_m -A PSW_OUTPUT -p tcp -d ${dns_address} --dport ${dns_port:-53} -j RETURN\n\t\t\t\techolog \"  - [$?]追加直连DNS到iptables：${dns_address}:${dns_port:-53}\"\n\t\t\telse\n\t\t\t\t$ip6t_m -A PSW_OUTPUT -p udp -d ${dns_address} --dport ${dns_port:-53} -j RETURN\n\t\t\t\t$ip6t_m -A PSW_OUTPUT -p tcp -d ${dns_address} --dport ${dns_port:-53} -j RETURN\n\t\t\t\techolog \"  - [$?]追加直连DNS到iptables：[${dns_address}]:${dns_port:-53}\"\n\t\t\tfi\n\t\tdone\n\t}\n\n\t[ \"${USE_BLOCK_LIST}\" = \"1\" ] && $ipt_m -A PSW_OUTPUT $(dst $IPSET_BLOCK) -j DROP\n\t[ \"${USE_DIRECT_LIST}\" = \"1\" ] && $ipt_m -A PSW_OUTPUT $(dst $IPSET_WHITE) -j RETURN\n\t$ipt_m -A PSW_OUTPUT -m conntrack --ctdir REPLY -j RETURN\n\t$ipt_m -A PSW_OUTPUT -m mark --mark 255 -j RETURN\n\n\tip rule add fwmark ${FWMARK} table 999 priority 999\n\tip route add local 0.0.0.0/0 dev lo table 999\n\n\t[ \"$accept_icmpv6\" = \"1\" ] && {\n\t\t$ip6t_n -N PSW\n\t\t$ip6t_n -A PSW $(dst $IPSET_LAN6) -j RETURN\n\t\t$ip6t_n -A PSW $(dst $IPSET_VPS6) -j RETURN\n\t\t$ip6t_n -A PREROUTING -p ipv6-icmp -j PSW\n\n\t\t$ip6t_n -N PSW_OUTPUT\n\t\t$ip6t_n -A PSW_OUTPUT $(dst $IPSET_LAN6) -j RETURN\n\t\t$ip6t_n -A PSW_OUTPUT $(dst $IPSET_VPS6) -j RETURN\n\t\t[ \"${USE_DIRECT_LIST}\" = \"1\" ] && $ip6t_n -A PSW_OUTPUT $(dst $IPSET_WHITE6) -j RETURN\n\t\t$ip6t_n -A PSW_OUTPUT -m mark --mark 255 -j RETURN\n\t}\n\n\t$ip6t_n -N PSW_DNS\n\tif [ $(config_t_get global dns_redirect \"1\") = \"0\" ]; then\n\t\t#Only hijack when dest address is local IP\n\t\t$ip6t_n -I PREROUTING -m set --match-set $IPSET_LAN6 src $(dst $IPSET_LOCAL6) -j PSW_DNS\n\telse\n\t\t$ip6t_n -I PREROUTING -m set --match-set $IPSET_LAN6 src -j PSW_DNS\n\tfi\n\n\t$ip6t_m -N PSW_DIVERT\n\t$ip6t_m -A PSW_DIVERT -j MARK --set-mark ${FWMARK}\n\t$ip6t_m -A PSW_DIVERT -j ACCEPT\n\n\t$ip6t_m -N PSW_RULE\n\t$ip6t_m -A PSW_RULE -j CONNMARK --restore-mark\n\t$ip6t_m -A PSW_RULE -m mark --mark ${FWMARK} -j RETURN\n\t$ip6t_m -A PSW_RULE -p tcp -m tcp --syn -j MARK --set-xmark ${FWMARK}\n\t$ip6t_m -A PSW_RULE -p udp -m conntrack --ctstate NEW,RELATED -j MARK --set-xmark ${FWMARK}\n\t$ip6t_m -A PSW_RULE -j CONNMARK --save-mark\n\n\t$ip6t_m -N PSW\n\t$ip6t_m -A PSW $(dst $IPSET_LAN6) -j RETURN\n\t$ip6t_m -A PSW $(dst $IPSET_VPS6) -j RETURN\n\t$ip6t_m -A PSW -m conntrack --ctdir REPLY -j RETURN\n\n\t$ip6t_m -A PSW $(comment \"WAN6_IP_RETURN\") $(dst $IPSET_WAN6) -j RETURN\n\n\tinsert_rule_before \"$ip6t_m\" \"PREROUTING\" \"mwan3\" \"-j PSW\"\n\t# Only TCP, UDP Invalid.\n\tinsert_rule_before \"$ip6t_m\" \"PREROUTING\" \"PSW\" \"-p tcp -m socket -j PSW_DIVERT\"\n\n\t$ip6t_m -N PSW_OUTPUT\n\t$ip6t_m -A PSW_OUTPUT -m mark --mark 255 -j RETURN\n\t$ip6t_m -A PSW_OUTPUT $(dst $IPSET_LAN6) -j RETURN\n\t$ip6t_m -A PSW_OUTPUT $(dst $IPSET_VPS6) -j RETURN\n\t[ \"${USE_BLOCK_LIST}\" = \"1\" ] && $ip6t_m -A PSW_OUTPUT $(dst $IPSET_BLOCK6) -j DROP\n\t[ \"${USE_DIRECT_LIST}\" = \"1\" ] && $ip6t_m -A PSW_OUTPUT $(dst $IPSET_WHITE6) -j RETURN\n\t$ip6t_m -A PSW_OUTPUT -m conntrack --ctdir REPLY -j RETURN\n\n\tip -6 rule add fwmark ${FWMARK} table 999 priority 999\n\tip -6 route add local ::/0 dev lo table 999\n\n\t[ \"$TCP_UDP\" = \"1\" ] && [ -z \"$UDP_NODE\" ] && UDP_NODE=$TCP_NODE\n\n\t[ \"$ENABLED_DEFAULT_ACL\" == 1 ] && {\n\t\tlocal ipt_tmp=$ipt_n\n\t\tif [ -n \"${is_tproxy}\" ]; then\n\t\t\tipt_tmp=$ipt_m\n\t\t\tipt_j=\"-j PSW_RULE\"\n\t\telse\n\t\t\tipt_j=\"$(REDIRECT $TCP_REDIR_PORT)\"\n\t\tfi\n\t\t\n\t\tmsg=\"【路由器本机】，\"\n\t\t[ \"$TCP_NO_REDIR_PORTS\" != \"disable\" ] && {\n\t\t\tadd_port_rules \"$ipt_tmp -A PSW_OUTPUT -p tcp\" $TCP_NO_REDIR_PORTS \"-j RETURN\"\n\t\t\tadd_port_rules \"$ip6t_m -A PSW_OUTPUT -p tcp\" $TCP_NO_REDIR_PORTS \"-j RETURN\"\n\t\t\tif ! has_1_65535 \"$TCP_NO_REDIR_PORTS\"; then\n\t\t\t\techolog \"  - ${msg}不代理 TCP 端口[${TCP_NO_REDIR_PORTS}]\"\n\t\t\telse\n\t\t\t\tunset LOCALHOST_TCP_PROXY_MODE\n\t\t\t\techolog \"  - ${msg}不代理所有 TCP 端口\"\n\t\t\tfi\n\t\t}\n\t\t\n\t\t[ \"$UDP_NO_REDIR_PORTS\" != \"disable\" ] && {\n\t\t\tadd_port_rules \"$ipt_m -A PSW_OUTPUT -p udp\" $UDP_NO_REDIR_PORTS \"-j RETURN\"\n\t\t\tadd_port_rules \"$ip6t_m -A PSW_OUTPUT -p udp\" $UDP_NO_REDIR_PORTS \"-j RETURN\"\n\t\t\tif ! has_1_65535 \"$UDP_NO_REDIR_PORTS\"; then\n\t\t\t\techolog \"  - ${msg}不代理 UDP 端口[${UDP_NO_REDIR_PORTS}]\"\n\t\t\telse\n\t\t\t\tunset LOCALHOST_UDP_PROXY_MODE\n\t\t\t\techolog \"  - ${msg}不代理所有 UDP 端口\"\n\t\t\tfi\n\t\t}\n\n\t\tif ([ -n \"$TCP_NODE\" ] && [ -n \"${LOCALHOST_TCP_PROXY_MODE}\" ]) || ([ -n \"$UDP_NODE\" ] && [ -n \"${LOCALHOST_UDP_PROXY_MODE}\" ]); then\n\t\t\t[ -n \"$DNS_REDIRECT_PORT\" ] && {\n\t\t\t\t$ipt_n -A OUTPUT $(comment \"PSW_DNS\") -p udp -o lo --dport 53 -j REDIRECT --to-ports $DNS_REDIRECT_PORT\n\t\t\t\t$ip6t_n -A OUTPUT $(comment \"PSW_DNS\") -p udp -o lo --dport 53 -j REDIRECT --to-ports $DNS_REDIRECT_PORT 2>/dev/null\n\t\t\t\t$ipt_n -A OUTPUT $(comment \"PSW_DNS\") -p tcp -o lo --dport 53 -j REDIRECT --to-ports $DNS_REDIRECT_PORT\n\t\t\t\t$ip6t_n -A OUTPUT $(comment \"PSW_DNS\") -p tcp -o lo --dport 53 -j REDIRECT --to-ports $DNS_REDIRECT_PORT 2>/dev/null\n\t\t\t}\n\t\tfi\n\n\t\t[ -n \"${LOCALHOST_TCP_PROXY_MODE}\" -o -n \"${LOCALHOST_UDP_PROXY_MODE}\" ] && {\n\t\t\t[ \"$TCP_PROXY_DROP_PORTS\" != \"disable\" ] && {\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW_OUTPUT -p tcp\" $TCP_PROXY_DROP_PORTS \"-d $FAKE_IP -j DROP\"\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW_OUTPUT -p tcp\" $TCP_PROXY_DROP_PORTS \"$(dst $IPSET_BLACK) -j DROP\"\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW_OUTPUT -p tcp\" $TCP_PROXY_DROP_PORTS \"$(dst $IPSET_GFW) -j DROP\"\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && add_port_rules \"$ipt_m -A PSW_OUTPUT -p tcp\" $TCP_PROXY_DROP_PORTS \"$(dst $IPSET_CHN) $(get_jump_ipt ${CHN_LIST} \"-j DROP\")\"\n\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW_OUTPUT -p tcp\" $TCP_PROXY_DROP_PORTS \"$(dst $IPSET_SHUNT) -j DROP\"\n\t\t\t\t[ \"${LOCALHOST_TCP_PROXY_MODE}\" != \"disable\" ] && add_port_rules \"$ipt_m -A PSW_OUTPUT -p tcp\" $TCP_PROXY_DROP_PORTS \"-j DROP\"\n\t\t\t\techolog \"  - ${msg}屏蔽代理 TCP 端口[${TCP_PROXY_DROP_PORTS}]\"\n\t\t\t}\n\t\t\t\n\t\t\t[ \"$UDP_PROXY_DROP_PORTS\" != \"disable\" ] && {\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW_OUTPUT -p udp\" $UDP_PROXY_DROP_PORTS \"-d $FAKE_IP -j DROP\"\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW_OUTPUT -p udp\" $UDP_PROXY_DROP_PORTS \"$(dst $IPSET_BLACK) -j DROP\"\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW_OUTPUT -p udp\" $UDP_PROXY_DROP_PORTS \"$(dst $IPSET_GFW) -j DROP\"\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && add_port_rules \"$ipt_m -A PSW_OUTPUT -p udp\" $UDP_PROXY_DROP_PORTS \"$(dst $IPSET_CHN) $(get_jump_ipt ${CHN_LIST} \"-j DROP\")\"\n\t\t\t\t[ \"${USE_SHUNT_UDP}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW_OUTPUT -p udp\" $UDP_PROXY_DROP_PORTS \"$(dst $IPSET_SHUNT) -j DROP\"\n\t\t\t\t[ \"${LOCALHOST_UDP_PROXY_MODE}\" != \"disable\" ] && add_port_rules \"$ipt_m -A PSW_OUTPUT -p udp\" $UDP_PROXY_DROP_PORTS \"-j DROP\"\n\t\t\t\techolog \"  - ${msg}屏蔽代理 UDP 端口[${UDP_PROXY_DROP_PORTS}]\"\n\t\t\t}\n\t\t}\n\n\t\t# 加载路由器自身代理 TCP\n\t\tif [ -n \"$TCP_NODE\" ]; then\n\t\t\t_proxy_tcp_access() {\n\t\t\t\t[ -n \"${2}\" ] || return 0\n\t\t\t\tif echo \"${2}\" | grep -q -v ':'; then\n\t\t\t\t\tipset -q test $IPSET_LAN ${2}\n\t\t\t\t\t[ $? -eq 0 ] && {\n\t\t\t\t\t\techolog \"  - 上游 DNS 服务器 ${2} 已在直接访问的列表中，不强制向 TCP 代理转发对该服务器 TCP/${3} 端口的访问\"\n\t\t\t\t\t\treturn 0\n\t\t\t\t\t}\n\t\t\t\t\tif [ -z \"${is_tproxy}\" ]; then\n\t\t\t\t\t\t$ipt_n -I PSW_OUTPUT -p tcp -d ${2} --dport ${3} $(REDIRECT $TCP_REDIR_PORT)\n\t\t\t\t\telse\n\t\t\t\t\t\t$ipt_m -I PSW_OUTPUT -p tcp -d ${2} --dport ${3} -j PSW_RULE\n\t\t\t\t\t\t$ipt_m -I PSW $(comment \"本机\") -p tcp -i lo -d ${2} --dport ${3} $(REDIRECT $TCP_REDIR_PORT TPROXY)\n\t\t\t\t\tfi\n\t\t\t\t\techolog \"  - [$?]将上游 DNS 服务器 ${2}:${3} 加入到路由器自身代理的 TCP 转发链\"\n\t\t\t\telse\n\t\t\t\t\tipset -q test $IPSET_LAN6 ${2}\n\t\t\t\t\t[ $? -eq 0 ] && {\n\t\t\t\t\t\techolog \"  - 上游 DNS 服务器 ${2} 已在直接访问的列表中，不强制向 TCP 代理转发对该服务器 TCP/${3} 端口的访问\"\n\t\t\t\t\t\treturn 0\n\t\t\t\t\t}\n\t\t\t\t\t$ip6t_m -I PSW_OUTPUT -p tcp -d ${2} --dport ${3} -j PSW_RULE\n\t\t\t\t\t$ip6t_m -I PSW $(comment \"本机\") -p tcp -i lo -d ${2} --dport ${3} $(REDIRECT $TCP_REDIR_PORT TPROXY)\n\t\t\t\t\techolog \"  - [$?]将上游 DNS 服务器 [${2}]:${3} 加入到路由器自身代理的 TCP 转发链，请确保您的节点支持IPv6，并开启IPv6透明代理！\"\n\t\t\t\tfi\n\t\t\t}\n\t\t\t[ -n \"${TCP_PROXY_DNS}\" ] && hosts_foreach REMOTE_DNS _proxy_tcp_access 53\n\n\t\t\t[ \"$accept_icmp\" = \"1\" ] && {\n\t\t\t\t$ipt_n -A OUTPUT -p icmp -j PSW_OUTPUT\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && $ipt_n -A PSW_OUTPUT -p icmp -d $FAKE_IP $(REDIRECT)\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && $ipt_n -A PSW_OUTPUT -p icmp $(dst $IPSET_BLACK) $(REDIRECT)\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && $ipt_n -A PSW_OUTPUT -p icmp $(dst $IPSET_GFW) $(REDIRECT)\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && $ipt_n -A PSW_OUTPUT -p icmp $(dst $IPSET_CHN) $(get_jump_ipt ${CHN_LIST})\n\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && $ipt_n -A PSW_OUTPUT -p icmp $(dst $IPSET_SHUNT) $(REDIRECT)\n\t\t\t\t[ -n \"${LOCALHOST_TCP_PROXY_MODE}\" ] && [ \"${LOCALHOST_TCP_PROXY_MODE}\" != \"disable\" ] && $ipt_n -A PSW_OUTPUT -p icmp $(REDIRECT)\n\t\t\t}\n\n\t\t\t[ \"$accept_icmpv6\" = \"1\" ] && {\n\t\t\t\t$ip6t_n -A OUTPUT -p ipv6-icmp -j PSW_OUTPUT\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && $ip6t_n -A PSW_OUTPUT -p ipv6-icmp -d $FAKE_IP_6 $(REDIRECT)\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && $ip6t_n -A PSW_OUTPUT -p ipv6-icmp $(dst $IPSET_BLACK6) $(REDIRECT)\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && $ip6t_n -A PSW_OUTPUT -p ipv6-icmp $(dst $IPSET_GFW6) $(REDIRECT)\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && $ip6t_n -A PSW_OUTPUT -p ipv6-icmp $(dst $IPSET_CHN6) $(get_jump_ipt ${CHN_LIST})\n\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && $ip6t_n -A PSW_OUTPUT -p ipv6-icmp $(dst $IPSET_SHUNT6) $(REDIRECT)\n\t\t\t\t[ -n \"${LOCALHOST_TCP_PROXY_MODE}\" ] && [ \"${LOCALHOST_TCP_PROXY_MODE}\" != \"disable\" ] && $ip6t_n -A PSW_OUTPUT -p ipv6-icmp $(REDIRECT)\n\t\t\t}\n\n\t\t\t[ -n \"${LOCALHOST_TCP_PROXY_MODE}\" ] && {\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && $ipt_tmp -A PSW_OUTPUT -p tcp -d $FAKE_IP ${ipt_j}\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && add_port_rules \"$ipt_tmp -A PSW_OUTPUT -p tcp\" $TCP_REDIR_PORTS \"$(dst $IPSET_BLACK) ${ipt_j}\"\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && add_port_rules \"$ipt_tmp -A PSW_OUTPUT -p tcp\" $TCP_REDIR_PORTS \"$(dst $IPSET_GFW) ${ipt_j}\"\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && add_port_rules \"$ipt_tmp -A PSW_OUTPUT -p tcp\" $TCP_REDIR_PORTS \"$(dst $IPSET_CHN) $(get_jump_ipt ${CHN_LIST} \"${ipt_j}\")\"\n\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && add_port_rules \"$ipt_tmp -A PSW_OUTPUT -p tcp\" $TCP_REDIR_PORTS \"$(dst $IPSET_SHUNT) ${ipt_j}\"\n\t\t\t\t[ \"${LOCALHOST_TCP_PROXY_MODE}\" != \"disable\" ] && add_port_rules \"$ipt_tmp -A PSW_OUTPUT -p tcp\" $TCP_REDIR_PORTS \"${ipt_j}\"\n\t\t\t\t[ -n \"${is_tproxy}\" ] && $ipt_m -A PSW $(comment \"本机\") -p tcp -i lo $(REDIRECT $TCP_REDIR_PORT TPROXY)\n\t\t\t}\n\t\t\t[ -z \"${is_tproxy}\" ] && $ipt_n -A OUTPUT -p tcp -j PSW_OUTPUT\n\t\t\t[ -n \"${is_tproxy}\" ] && {\n\t\t\t\t$ipt_m -A PSW $(comment \"本机\") -p tcp -i lo -j RETURN\n\t\t\t\tinsert_rule_before \"$ipt_m\" \"OUTPUT\" \"mwan3\" \"$(comment mangle-OUTPUT-PSW) -p tcp -j PSW_OUTPUT\"\n\t\t\t}\n\n\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t[ -n \"${LOCALHOST_TCP_PROXY_MODE}\" ] && {\n\t\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && $ip6t_m -A PSW_OUTPUT -p tcp -d $FAKE_IP_6 -j PSW_RULE\n\t\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW_OUTPUT -p tcp\" $TCP_REDIR_PORTS \"$(dst $IPSET_BLACK6) -j PSW_RULE\"\n\t\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW_OUTPUT -p tcp\" $TCP_REDIR_PORTS \"$(dst $IPSET_GFW6) -j PSW_RULE\"\n\t\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && add_port_rules \"$ip6t_m -A PSW_OUTPUT -p tcp\" $TCP_REDIR_PORTS \"$(dst $IPSET_CHN6) $(get_jump_ipt ${CHN_LIST} \"-j PSW_RULE\")\"\n\t\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW_OUTPUT -p tcp\" $TCP_REDIR_PORTS \"$(dst $IPSET_SHUNT6) -j PSW_RULE\"\n\t\t\t\t\t[ \"${LOCALHOST_TCP_PROXY_MODE}\" != \"disable\" ] && add_port_rules \"$ip6t_m -A PSW_OUTPUT -p tcp\" $TCP_REDIR_PORTS \"-j PSW_RULE\"\n\t\t\t\t\t$ip6t_m -A PSW $(comment \"本机\") -p tcp -i lo $(REDIRECT $TCP_REDIR_PORT TPROXY)\n\t\t\t\t}\n\t\t\t\t$ip6t_m -A PSW $(comment \"本机\") -p tcp -i lo -j RETURN\n\t\t\t\tinsert_rule_before \"$ip6t_m\" \"OUTPUT\" \"mwan3\" \"$(comment mangle-OUTPUT-PSW) -p tcp -j PSW_OUTPUT\"\n\t\t\t}\n\t\tfi\n\n\t\t# 加载路由器自身代理 UDP\n\t\tif [ -n \"$UDP_NODE\" -o \"$TCP_UDP\" = \"1\" ]; then\n\t\t\t_proxy_udp_access() {\n\t\t\t\t[ -n \"${2}\" ] || return 0\n\t\t\t\tif echo \"${2}\" | grep -q -v ':'; then\n\t\t\t\t\tipset -q test $IPSET_LAN ${2}\n\t\t\t\t\t[ $? == 0 ] && {\n\t\t\t\t\t\techolog \"  - 上游 DNS 服务器 ${2} 已在直接访问的列表中，不强制向 UDP 代理转发对该服务器 UDP/${3} 端口的访问\"\n\t\t\t\t\t\treturn 0\n\t\t\t\t\t}\n\t\t\t\t\t$ipt_m -I PSW_OUTPUT -p udp -d ${2} --dport ${3} -j PSW_RULE\n\t\t\t\t\t$ipt_m -I PSW $(comment \"本机\") -p udp -i lo -d ${2} --dport ${3} $(REDIRECT $UDP_REDIR_PORT TPROXY)\n\t\t\t\t\techolog \"  - [$?]将上游 DNS 服务器 ${2}:${3} 加入到路由器自身代理的 UDP 转发链\"\n\t\t\t\telse\n\t\t\t\t\tipset -q test $IPSET_LAN6 ${2}\n\t\t\t\t\t[ $? == 0 ] && {\n\t\t\t\t\t\techolog \"  - 上游 DNS 服务器 ${2} 已在直接访问的列表中，不强制向 UDP 代理转发对该服务器 UDP/${3} 端口的访问\"\n\t\t\t\t\t\treturn 0\n\t\t\t\t\t}\n\t\t\t\t\t$ip6t_m -I PSW_OUTPUT -p udp -d ${2} --dport ${3} -j PSW_RULE\n\t\t\t\t\t$ip6t_m -I PSW $(comment \"本机\") -p udp -i lo -d ${2} --dport ${3} $(REDIRECT $UDP_REDIR_PORT TPROXY)\n\t\t\t\t\techolog \"  - [$?]将上游 DNS 服务器 [${2}]:${3} 加入到路由器自身代理的 UDP 转发链，请确保您的节点支持IPv6，并开启IPv6透明代理！\"\n\t\t\t\tfi\n\t\t\t}\n\t\t\t[ -n \"${UDP_PROXY_DNS}\" ] && hosts_foreach REMOTE_DNS _proxy_udp_access 53\n\t\t\t[ -n \"${LOCALHOST_UDP_PROXY_MODE}\" ] && {\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && $ipt_m -A PSW_OUTPUT -p udp -d $FAKE_IP -j PSW_RULE\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW_OUTPUT -p udp\" $UDP_REDIR_PORTS \"$(dst $IPSET_BLACK) -j PSW_RULE\"\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW_OUTPUT -p udp\" $UDP_REDIR_PORTS \"$(dst $IPSET_GFW) -j PSW_RULE\"\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && add_port_rules \"$ipt_m -A PSW_OUTPUT -p udp\" $UDP_REDIR_PORTS \"$(dst $IPSET_CHN) $(get_jump_ipt ${CHN_LIST} \"-j PSW_RULE\")\"\n\t\t\t\t[ \"${USE_SHUNT_UDP}\" = \"1\" ] && add_port_rules \"$ipt_m -A PSW_OUTPUT -p udp\" $UDP_REDIR_PORTS \"$(dst $IPSET_SHUNT) -j PSW_RULE\"\n\t\t\t\t[ \"${LOCALHOST_UDP_PROXY_MODE}\" != \"disable\" ] && add_port_rules \"$ipt_m -A PSW_OUTPUT -p udp\" $UDP_REDIR_PORTS \"-j PSW_RULE\"\n\t\t\t\t$ipt_m -A PSW $(comment \"本机\") -p udp -i lo $(REDIRECT $UDP_REDIR_PORT TPROXY)\n\t\t\t}\n\t\t\t$ipt_m -A PSW $(comment \"本机\") -p udp -i lo -j RETURN\n\t\t\tinsert_rule_before \"$ipt_m\" \"OUTPUT\" \"mwan3\" \"$(comment mangle-OUTPUT-PSW) -p udp -j PSW_OUTPUT\"\n\n\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t[ -n \"$LOCALHOST_UDP_PROXY_MODE\" ] && {\n\t\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && $ip6t_m -A PSW_OUTPUT -p udp -d $FAKE_IP_6 -j PSW_RULE\n\t\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW_OUTPUT -p udp\" $UDP_REDIR_PORTS \"$(dst $IPSET_BLACK6) -j PSW_RULE\"\n\t\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW_OUTPUT -p udp\" $UDP_REDIR_PORTS \"$(dst $IPSET_GFW6) -j PSW_RULE\"\n\t\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && add_port_rules \"$ip6t_m -A PSW_OUTPUT -p udp\" $UDP_REDIR_PORTS \"$(dst $IPSET_CHN6) $(get_jump_ipt ${CHN_LIST} \"-j PSW_RULE\")\"\n\t\t\t\t\t[ \"${USE_SHUNT_UDP}\" = \"1\" ] && add_port_rules \"$ip6t_m -A PSW_OUTPUT -p udp\" $UDP_REDIR_PORTS \"$(dst $IPSET_SHUNT6) -j PSW_RULE\"\n\t\t\t\t\t[ \"${LOCALHOST_UDP_PROXY_MODE}\" != \"disable\" ] && add_port_rules \"$ip6t_m -A PSW_OUTPUT -p udp\" $UDP_REDIR_PORTS \"-j PSW_RULE\"\n\t\t\t\t\t$ip6t_m -A PSW $(comment \"本机\") -p udp -i lo $(REDIRECT $UDP_REDIR_PORT TPROXY)\n\t\t\t\t}\n\t\t\t\t$ip6t_m -A PSW $(comment \"本机\") -p udp -i lo -j RETURN\n\t\t\t\tinsert_rule_before \"$ip6t_m\" \"OUTPUT\" \"mwan3\" \"$(comment mangle-OUTPUT-PSW) -p udp -j PSW_OUTPUT\"\n\t\t\t}\n\t\tfi\n\n\t\t$ipt_m -I OUTPUT $(comment \"mangle-OUTPUT-PSW\") -o lo -j RETURN\n\t\tinsert_rule_before \"$ipt_m\" \"OUTPUT\" \"mwan3\" \"$(comment mangle-OUTPUT-PSW) -m mark --mark ${FWMARK} -j RETURN\"\n\t\t\n\t\t$ip6t_m -I OUTPUT $(comment \"mangle-OUTPUT-PSW\") -o lo -j RETURN\n\t\tinsert_rule_before \"$ip6t_m\" \"OUTPUT\" \"mwan3\" \"$(comment mangle-OUTPUT-PSW) -m mark --mark ${FWMARK} -j RETURN\"\n\t}\n\n\t#  加载ACLS\n\tload_acl\n\n\t[ -d \"${TMP_IFACE_PATH}\" ] && {\n\t\tfor iface in $(ls ${TMP_IFACE_PATH}); do\n\t\t\t$ipt_n -A PSW_OUTPUT -o $iface -j RETURN\n\t\t\t$ipt_m -A PSW_OUTPUT -o $iface -j RETURN\n\t\tdone\n\t}\n\n\t$ipt_n -I PREROUTING $(comment \"PSW\") -m mark --mark ${FWMARK} -j RETURN\n\t$ip6t_n -I PREROUTING $(comment \"PSW\") -m mark --mark ${FWMARK} -j RETURN\n\n\tfilter_direct_node_list > /dev/null 2>&1 &\n\n\techolog \"防火墙规则加载完成！\"\n}\n\ndel_firewall_rule() {\n\tfor ipt in \"$ipt_n\" \"$ipt_m\" \"$ip6t_n\" \"$ip6t_m\"; do\n\t\tfor chain in \"PREROUTING\" \"OUTPUT\"; do\n\t\t\tfor i in $(seq 1 $($ipt -nL $chain | grep -c PSW)); do\n\t\t\t\tlocal index=$($ipt --line-number -nL $chain | grep PSW | head -1 | awk '{print $1}')\n\t\t\t\t$ipt -D $chain $index 2>/dev/null\n\t\t\tdone\n\t\tdone\n\t\tfor chain in \"PSW\" \"PSW_OUTPUT\" \"PSW_DIVERT\" \"PSW_DNS\" \"PSW_RULE\"; do\n\t\t\t$ipt -F $chain 2>/dev/null\n\t\t\t$ipt -X $chain 2>/dev/null\n\t\tdone\n\tdone\n\n\tip rule del fwmark ${FWMARK} 2>/dev/null\n\tip route del local 0.0.0.0/0 dev lo table 999 2>/dev/null\n\n\tip -6 rule del fwmark ${FWMARK} 2>/dev/null\n\tip -6 route del local ::/0 dev lo table 999 2>/dev/null\n\n\tdestroy_ipset $IPSET_LOCAL\n\tdestroy_ipset $IPSET_WAN\n\tdestroy_ipset $IPSET_LAN\n\tdestroy_ipset $IPSET_VPS\n\t#destroy_ipset $IPSET_SHUNT\n\t#destroy_ipset $IPSET_GFW\n\t#destroy_ipset $IPSET_CHN\n\t#destroy_ipset $IPSET_BLACK\n\tdestroy_ipset $IPSET_BLOCK\n\tdestroy_ipset $IPSET_WHITE\n\n\tdestroy_ipset $IPSET_LOCAL6\n\tdestroy_ipset $IPSET_WAN6\n\tdestroy_ipset $IPSET_LAN6\n\tdestroy_ipset $IPSET_VPS6\n\t#destroy_ipset $IPSET_SHUNT6\n\t#destroy_ipset $IPSET_GFW6\n\t#destroy_ipset $IPSET_CHN6\n\t#destroy_ipset $IPSET_BLACK6\n\tdestroy_ipset $IPSET_BLOCK6\n\tdestroy_ipset $IPSET_WHITE6\n\n\techolog \"删除 iptables 规则完成。\"\n}\n\nflush_ipset() {\n\techolog \"清空 IPSet。\"\n\tfor _name in $(ipset list | grep \"Name: \" | grep \"passwall_\" | awk '{print $2}'); do\n\t\tdestroy_ipset ${_name}\n\tdone\n}\n\nflush_include() {\n\techo '#!/bin/sh' >$FWI\n}\n\ngen_include() {\n\tflush_include\n\textract_rules() {\n\t\tlocal _ipt=\"${ipt}\"\n\t\t[ \"$1\" == \"6\" ] && _ipt=\"${ip6t}\"\n\t\t[ -z \"${_ipt}\" ] && return\n\n\t\techo \"*$2\"\n\t\t${_ipt}-save -t $2 | grep \"PSW\" | grep -v \"\\-j PSW$\" | grep -v \"mangle\\-OUTPUT\\-PSW\" | grep -v \"socket \\-j PSW_DIVERT$\" | sed -e \"s/^-A \\(OUTPUT\\|PREROUTING\\)/-I \\1 1/\"\n\t\techo 'COMMIT'\n\t}\n\tlocal __ipt=\"\"\n\t[ -n \"${ipt}\" ] && {\n\t\t__ipt=$(cat <<- EOF\n\n\t\t\t${MY_PATH} update_wan_sets\n\n\t\t\tmangle_output_psw=\\$(${ipt}-save -t mangle | grep \"PSW\" | grep \"mangle\\-OUTPUT\\-PSW\" | sed \"s#-A OUTPUT ##g\")\n\t\t\t$ipt-save -c | grep -v \"PSW\" | $ipt-restore -c\n\t\t\t$ipt-restore -n <<-EOT\n\t\t\t$(extract_rules 4 nat)\n\t\t\t$(extract_rules 4 mangle)\n\t\t\tEOT\n\n\t\t\techo \"\\${mangle_output_psw}\" | while read line; do\n\t\t\t\t\\$(${MY_PATH} insert_rule_before \"$ipt_m\" \"OUTPUT\" \"mwan3\" \"\\${line}\")\n\t\t\tdone\n\n\t\t\t[ \"$accept_icmp\" = \"1\" ] && \\$(${MY_PATH} insert_rule_after \"$ipt_n\" \"PREROUTING\" \"prerouting_rule\" \"-p icmp -j PSW\")\n\t\t\t[ -z \"${is_tproxy}\" ] && \\$(${MY_PATH} insert_rule_after \"$ipt_n\" \"PREROUTING\" \"prerouting_rule\" \"-p tcp -j PSW\")\n\n\t\t\t\\$(${MY_PATH} insert_rule_before \"$ipt_m\" \"PREROUTING\" \"mwan3\" \"-j PSW\")\n\t\t\t\\$(${MY_PATH} insert_rule_before \"$ipt_m\" \"PREROUTING\" \"PSW\" \"-p tcp -m socket -j PSW_DIVERT\")\n\t\tEOF\n\t\t)\n\t}\n\tlocal __ip6t=\"\"\n\t[ -n \"${ip6t}\" ] && {\n\t\t__ip6t=$(cat <<- EOF\n\t\t\tmangle_output_psw=\\$(${ip6t}-save -t mangle | grep \"PSW\" | grep \"mangle\\-OUTPUT\\-PSW\" | sed \"s#-A OUTPUT ##g\")\n\t\t\t$ip6t-save -c | grep -v \"PSW\" | $ip6t-restore -c\n\t\t\t$ip6t-restore -n <<-EOT\n\t\t\t$(extract_rules 6 nat)\n\t\t\t$(extract_rules 6 mangle)\n\t\t\tEOT\n\n\t\t\techo \"\\${mangle_output_psw}\" | while read line; do\n\t\t\t\t\\$(${MY_PATH} insert_rule_before \"$ip6t_m\" \"OUTPUT\" \"mwan3\" \"\\${line}\")\n\t\t\tdone\n\n\t\t\t[ \"$accept_icmpv6\" = \"1\" ] && $ip6t_n -A PREROUTING -p ipv6-icmp -j PSW\n\n\t\t\t\\$(${MY_PATH} insert_rule_before \"$ip6t_m\" \"PREROUTING\" \"mwan3\" \"-j PSW\")\n\t\t\t\\$(${MY_PATH} insert_rule_before \"$ip6t_m\" \"PREROUTING\" \"PSW\" \"-p tcp -m socket -j PSW_DIVERT\")\n\t\tEOF\n\t\t)\n\t}\n\tcat <<-EOF >> $FWI\n\t\t${__ipt}\n\n\t\t${__ip6t}\n\n\t\treturn 0\n\tEOF\n\treturn 0\n}\n\nget_ipt_bin() {\n\techo $ipt\n}\n\nget_ip6t_bin() {\n\techo $ip6t\n}\n\nstart() {\n\t[ \"$ENABLED_DEFAULT_ACL\" == 0 -a \"$ENABLED_ACLS\" == 0 ] && return\n\tadd_firewall_rule\n\tgen_include\n}\n\nstop() {\n\t[ -z \"$(command -v echolog)\" ] && . \"$UTILS_PATH\"\n\tdel_firewall_rule\n\t[ $(config_t_get global flush_set_on_reboot \"0\") = \"1\" -o $(config_t_get global flush_set \"0\") = \"1\" ] && {\n\t\tuci -q delete ${CONFIG}.@global[0].flush_set\n\t\tuci -q commit ${CONFIG}\n\t\tflush_ipset\n\t\trm -rf $TMP_PATH2/singbox*\n\t\trm -rf $TMP_PATH2/dnsmasq*\n\t\trm -rf $TMP_PATH2/geo_output\n\t}\n\tflush_include\n}\n\narg1=$1\nshift\ncase $arg1 in\nRULE_LAST_INDEX)\n\tRULE_LAST_INDEX \"$@\"\n\t;;\ninsert_rule_before)\n\tinsert_rule_before \"$@\"\n\t;;\ninsert_rule_after)\n\tinsert_rule_after \"$@\"\n\t;;\nget_ipt_bin)\n\tget_ipt_bin\n\t;;\nget_ip6t_bin)\n\tget_ip6t_bin\n\t;;\nfilter_direct_node_list)\n\tfilter_direct_node_list\n\t;;\nupdate_wan_sets)\n\tupdate_wan_sets \"$@\"\n\t;;\nstop)\n\tstop\n\t;;\nstart)\n\tstart\n\t;;\n*) ;;\nesac\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/lease2hosts.sh",
    "content": "#!/bin/sh\n\n# dhcp.leases to hosts\n\n. /usr/share/passwall/utils.sh\nLOCK_FILE=${LOCK_PATH}/${CONFIG}_lease2hosts.lock\nLEASE_FILE=\"/tmp/dhcp.leases\"\nHOSTS_FILE=\"$TMP_PATH2/dhcp-hosts\"\nTMP_FILE=\"/tmp/dhcp-hosts.tmp\"\n\nexec 99>\"$LOCK_FILE\"\nflock -n 99\nif [ \"$?\" != 0 ]; then\n\texit 0\nfi\n\nreload_dnsmasq_pids() {\n\tlocal pidfile pid\n\tfind $TMP_PATH/acl -type f -name 'dnsmasq.pid' 2>/dev/null | while read pidfile; do\n\t\tif [ -s \"$pidfile\" ]; then\n\t\t\tread pid < \"$pidfile\"\n\t\t\tif [ -n \"$pid\" ] && kill -0 \"$pid\" 2>/dev/null; then\n\t\t\t\tkill -HUP \"$pid\"\n\t\t\tfi\n\t\tfi\n\tdone\n}\n\nwhile true; do\n\n\tif [ -f \"$LEASE_FILE\" ]; then\n\t\tawk 'NF >= 4 && $4 != \"*\" {print $3\" \"$4}' \"$LEASE_FILE\" | sort > \"$TMP_FILE\"\n\t\tif [ -s \"$TMP_FILE\" ]; then\n\t\t\tif [ ! -f \"$HOSTS_FILE\" ] || ! cmp -s \"$TMP_FILE\" \"$HOSTS_FILE\"; then\n\t\t\t\tmv \"$TMP_FILE\" \"$HOSTS_FILE\"\n\t\t\t\treload_dnsmasq_pids\n\t\t\telse\n\t\t\t\trm -f \"$TMP_FILE\"\n\t\t\tfi\n\t\telse\n\t\t\tif [ -s \"$HOSTS_FILE\" ]; then\n\t\t\t\t: > \"$HOSTS_FILE\"\n\t\t\t\treload_dnsmasq_pids\n\t\t\tfi\n\t\t\trm -f \"$TMP_FILE\"\n\t\tfi\n\tfi\n\n\tsleep 60\n\ndone 2>/dev/null\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/monitor.sh",
    "content": "#!/bin/sh\n\nDIR=\"$(cd \"$(dirname \"$0\")\" && pwd)\"\n. $DIR/utils.sh\nLOCK_FILE=${LOCK_PATH}/${CONFIG}_monitor.lock\n\nMAX_RESTART_COUNT=10\nRESTART_STATS_DIR=\"${TMP_PATH}/script_rstats\"\nmkdir -p \"$RESTART_STATS_DIR\"\n\nsleep 58s\nlast_cleanup_date=$(date +%Y%m%d)\nwhile [ 1 -eq 1 ]; do\n\t[ -f \"$LOCK_FILE\" ] && {\n\t\tsleep 6s\n\t\tcontinue\n\t}\n\ttouch $LOCK_FILE\n\n\tfor file in \"$TMP_SCRIPT_FUNC_PATH\"/*; do\n\t\t[ -f \"$file\" ] || continue\n\t\tIFS= read -r cmd < \"$file\"\n\t\t[ -z \"$cmd\" ] && continue\n\t\tcmd_check=$(printf '%s' \"$cmd\" | sed 's/>.*$//;s/[[:space:]]*$//')\n\t\t\n\t\tcase \"$cmd_check\" in\n\t\t\t*dns2socks*) cmd_check=${cmd_check//:/ } ;;\n\t\tesac\n\n\t\tfilename=$(basename \"$file\")\n\t\tstats_file=\"${RESTART_STATS_DIR}/${filename}.count\"\n\t\tif [ -s \"$stats_file\" ]; then\n\t\t\tread restart_count < \"$stats_file\"\n\t\t\t[ -z \"$restart_count\" ] && restart_count=0\n\t\telse\n\t\t\trestart_count=0\n\t\tfi\n\t\t# 检查是否超过最大重启次数\n\t\t[ \"$restart_count\" -ge \"$MAX_RESTART_COUNT\" ] && continue\n\n\t\tif ! pgrep -f \"$cmd_check\" >/dev/null; then\n\t\t\trestart_count=$((restart_count + 1))\n\t\t\techo \"$restart_count\" > \"$stats_file\"\n\t\t\t#echo \"${cmd} 进程挂掉，重启\" >> /tmp/log/passwall.log\n\t\t\tsh -c \"nohup $cmd 2>&1 &\"\n\t\t\tsleep 1\n\t\tfi\n\tdone\n\n\t# 每天清理一次统计文件（跨天后执行一次）\n\tcurrent_date=$(date +%Y%m%d)\n\tif [ \"$current_date\" != \"$last_cleanup_date\" ]; then\n\t\trm -f \"${RESTART_STATS_DIR:?}\"/* 2>/dev/null\n\t\tlast_cleanup_date=\"$current_date\"\n\tfi\n\n\trm -f $LOCK_FILE\n\tsleep 58s\ndone\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/nftables.sh",
    "content": "#!/bin/sh\n\nDIR=\"$(cd \"$(dirname \"$0\")\" && pwd)\"\nMY_PATH=$DIR/nftables.sh\nUTILS_PATH=$DIR/utils.sh\nNFTABLE_NAME=\"inet passwall\"\nNFTSET_LOCAL=\"passwall_local\"\nNFTSET_WAN=\"passwall_wan\"\nNFTSET_LAN=\"passwall_lan\"\nNFTSET_VPS=\"passwall_vps\"\nNFTSET_SHUNT=\"passwall_shunt\"\nNFTSET_GFW=\"passwall_gfw\"\nNFTSET_CHN=\"passwall_chn\"\nNFTSET_BLACK=\"passwall_black\"\nNFTSET_WHITE=\"passwall_white\"\nNFTSET_BLOCK=\"passwall_block\"\n\nNFTSET_LOCAL6=\"passwall_local6\"\nNFTSET_WAN6=\"passwall_wan6\"\nNFTSET_LAN6=\"passwall_lan6\"\nNFTSET_VPS6=\"passwall_vps6\"\nNFTSET_SHUNT6=\"passwall_shunt6\"\nNFTSET_GFW6=\"passwall_gfw6\"\nNFTSET_CHN6=\"passwall_chn6\"\nNFTSET_BLACK6=\"passwall_black6\"\nNFTSET_WHITE6=\"passwall_white6\"\nNFTSET_BLOCK6=\"passwall_block6\"\n\nUSE_SHUNT_TCP=0\nUSE_SHUNT_UDP=0\n\n# ASCII code for PSW1.Use whatever,just not the same.\nFWMARK=\"0x50535731\"\n\nFWI=$(uci -q get firewall.passwall.path 2>/dev/null)\nFAKE_IP=\"198.18.0.0/15\"\nFAKE_IP_6=\"fc00::/18\"\n\nfactor() {\n\tlocal ports=\"$1\"\n\tif [ -z \"$1\" ] || [ -z \"$2\" ] || [ \"$ports\" = \"1:65535\" ]; then\n\t\techo \"\"\n\t# acl mac address\n\telif echo \"$1\" | grep -qE '([A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2}'; then\n\t\techo \"$2 {$1}\"\n\telse\n\t\tports=$(echo \"$ports\" | tr -d ' ' | sed 's/:/-/g' | tr ',' '\\n' | awk '!a[$0]++' | grep -v '^$')\n\t\t[ -z \"$ports\" ] && { echo \"\"; return; }\n\t\tif echo \"$ports\" | grep -q '^1-65535$'; then\n\t\t\techo \"\"\n\t\t\treturn\n\t\tfi\n\t\tlocal port\n\t\tlocal port_list=\"\"\n\t\tfor port in $ports; do\n\t\t\tport_list=\"${port_list},$port\"\n\t\tdone\n\t\tport_list=\"${port_list#,}\"\n\t\techo \"$2 {$port_list}\"\n\tfi\n}\n\ninsert_rule_before() {\n\t[ $# -ge 4 ] || {\n\t\treturn 1\n\t}\n\tlocal table_name=\"${1}\"; shift\n\tlocal chain_name=\"${1}\"; shift\n\tlocal keyword=\"${1}\"; shift\n\tlocal rule=\"${1}\"; shift\n\tlocal default_index=\"${1}\"; shift\n\tdefault_index=${default_index:-0}\n\tlocal _index=$(nft -a list chain $table_name $chain_name 2>/dev/null | grep \"$keyword\" | awk -F '# handle ' '{print$2}' | head -n 1 | awk '{print $1}')\n\tif [ -z \"${_index}\" ] && [ \"${default_index}\" = \"0\" ]; then\n\t\tnft \"add rule $table_name $chain_name $rule\"\n\telse\n\t\tif [ -z \"${_index}\" ]; then\n\t\t\t_index=${default_index}\n\t\tfi\n\t\tnft \"insert rule $table_name $chain_name position $_index $rule\"\n\tfi\n}\n\ninsert_rule_after() {\n\t[ $# -ge 4 ] || {\n\t\treturn 1\n\t}\n\tlocal table_name=\"${1}\"; shift\n\tlocal chain_name=\"${1}\"; shift\n\tlocal keyword=\"${1}\"; shift\n\tlocal rule=\"${1}\"; shift\n\tlocal default_index=\"${1}\"; shift\n\tdefault_index=${default_index:-0}\n\tlocal _index=$(nft -a list chain $table_name $chain_name 2>/dev/null | grep \"$keyword\" | awk -F '# handle ' '{print$2}' | head -n 1 | awk '{print $1}')\n\tif [ -z \"${_index}\" ] && [ \"${default_index}\" = \"0\" ]; then\n\t\tnft \"add rule $table_name $chain_name $rule\"\n\telse\n\t\tif [ -n \"${_index}\" ]; then\n\t\t\t_index=$((_index + 1))\n\t\telse\n\t\t\t_index=${default_index}\n\t\tfi\n\t\tnft \"insert rule $table_name $chain_name position $_index $rule\"\n\tfi\n}\n\nRULE_LAST_INDEX() {\n\t[ $# -ge 3 ] || {\n\t\techolog \"索引列举方式不正确（nftables），终止执行！\"\n\t\treturn 1\n\t}\n\tlocal table_name=\"${1}\"; shift\n\tlocal chain_name=\"${1}\"; shift\n\tlocal keyword=\"${1}\"; shift\n\tlocal default=\"${1:-0}\"; shift\n\tlocal _index=$(nft -a list chain $table_name $chain_name 2>/dev/null | grep \"$keyword\" | awk -F '# handle ' '{print$2}' | head -n 1 | awk '{print $1}')\n\techo \"${_index:-${default}}\"\n}\n\nREDIRECT() {\n\tlocal s=\"counter redirect\"\n\t[ -n \"$1\" ] && {\n\t\tlocal s=\"$s to :$1\"\n\t\t[ \"$2\" == \"TPROXY\" ] && {\n\t\t\ts=\"counter meta mark ${FWMARK} tproxy to :$1\"\n\t\t}\n\t\t[ \"$2\" == \"TPROXY4\" ] && {\n\t\t\ts=\"counter meta mark ${FWMARK} tproxy ip to :$1\"\n\t\t}\n\t\t[ \"$2\" == \"TPROXY6\" ] && {\n\t\t\ts=\"counter meta mark ${FWMARK} tproxy ip6 to :$1\"\n\t\t}\n\t}\n\techo $s\n}\n\ndestroy_nftset() {\n\tfor i in \"$@\"; do\n\t\tnft flush set $NFTABLE_NAME $i 2>/dev/null\n\t\tnft delete set $NFTABLE_NAME $i 2>/dev/null\n\tdone\n}\n\ngen_nft_tables() {\n\tif ! nft list table \"$NFTABLE_NAME\" >/dev/null 2>&1; then\n\t\tnft -f - <<-EOF\n\t\ttable $NFTABLE_NAME {\n\t\t\tchain dstnat {\n\t\t\t\ttype nat hook prerouting priority dstnat - 1; policy accept;\n\t\t\t}\n\t\t\tchain mangle_prerouting {\n\t\t\t\ttype filter hook prerouting priority mangle - 1; policy accept;\n\t\t\t}\n\t\t\tchain mangle_output {\n\t\t\t\ttype route hook output priority mangle - 1; policy accept;\n\t\t\t}\n\t\t\tchain nat_output {\n\t\t\t\ttype nat hook output priority -1; policy accept;\n\t\t\t}\n\t\t}\n\t\tEOF\n\tfi\n}\n\ninsert_nftset() {\n\tlocal nftset_name=\"${1}\"; shift\n\tlocal timeout_argument=\"${1}\"; shift\n\tlocal default_timeout=\"365d\"\n\tlocal suffix=\"\"\n\n\tif [ -n \"$nftset_name\" ] && { [ $# -gt 0 ] || [ ! -t 0 ]; }; then\n\t\tcase \"$timeout_argument\" in\n\t\t\t\"-1\") suffix=\"\" ;;\n\t\t\t \"0\") suffix=\" timeout $default_timeout\" ;;\n\t\t\t   *) suffix=\" timeout $timeout_argument\" ;;\n\t\tesac\n\t\t{\n\t\t\tif [ $# -gt 0 ]; then\n\t\t\t\tprintf \"%s\\n\" \"$@\"\n\t\t\telse\n\t\t\t\tcat\n\t\t\tfi | tr -s ' \\t' '\\n' | awk -v s=\"$suffix\" -v n=\"$nftset_name\" -v t=\"$NFTABLE_NAME\" '\n\t\t\t\t{\n\t\t\t\t\tgsub(/^[ \\t\\r]+|[ \\t\\r]+$/, \"\");\n\t\t\t\t}\n\t\t\t\t$0 != \"\" {\n\t\t\t\t\tif (first == 0) {\n\t\t\t\t\t\tprintf \"add element %s %s { \\n\", t, n;\n\t\t\t\t\t\tfirst = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprintf \",\\n\";\n\t\t\t\t\t}\n\t\t\t\t\tprintf \"%s%s\", $0, s;\n\t\t\t\t}\n\t\t\t\tEND {\n\t\t\t\t\tif (first == 1) printf \"\\n }\\n\";\n\t\t\t\t}\n\t\t\t'\n\t\t} | nft -f -\n\tfi\n}\n\ngen_nftset() {\n\tlocal nftset_name=\"${1}\"; shift\n\tlocal ip_type=\"${1}\"; shift\n\t#  0 - don't set defalut timeout\n\tlocal timeout_argument_set=\"${1}\"; shift\n\t#  0 - don't let element timeout(365 days) when set's timeout parameters be seted\n\t# -1 - follow the set's timeout parameters\n\tlocal timeout_argument_element=\"${1}\"; shift\n\tlocal gc_interval_time=\"1h\"\n\n\tif ! nft list set $NFTABLE_NAME $nftset_name >/dev/null 2>&1; then\n\t\tif [ \"$timeout_argument_set\" == \"0\" ]; then\n\t\t\tnft \"add set $NFTABLE_NAME $nftset_name { type $ip_type; flags interval, timeout; auto-merge; }\"\n\t\telse\n\t\t\tnft \"add set $NFTABLE_NAME $nftset_name { type $ip_type; flags interval, timeout; timeout $timeout_argument_set; gc-interval $gc_interval_time; auto-merge; }\"\n\t\tfi\n\tfi\n\t[ $# -gt 0 ] || [ ! -t 0 ] && insert_nftset \"$nftset_name\" \"$timeout_argument_element\" \"$@\"\n}\n\nget_jump_nft() {\n\tcase \"$1\" in\n\tdirect)\n\t\techo \"mark != ${FWMARK} counter return\"\n\t\t;;\n\tproxy)\n\t\tif [ -n \"$2\" ] && [ -n \"$(echo $2 | grep \"^counter\")\" ]; then\n\t\t\techo \"$2\"\n\t\telse\n\t\t\techo \"$(REDIRECT $2 $3)\"\n\t\tfi\n\t\t;;\n\tesac\n}\n\nload_acl() {\n\t([ \"$ENABLED_ACLS\" == 1 ] || ([ \"$ENABLED_DEFAULT_ACL\" == 1 ] && [ \"$CLIENT_PROXY\" == 1 ])) && echolog \"  - 访问控制：\"\n\t[ \"$ENABLED_ACLS\" == 1 ] && {\n\t\tacl_app\n\t\tfor sid in $(ls -F ${TMP_ACL_PATH} | grep '/$' | awk -F '/' '{print $1}' | grep -v 'default'); do\n\t\t\teval $(uci -q show \"${CONFIG}.${sid}\" | cut -d'.' -sf 3-)\n\n\t\t\ttcp_no_redir_ports=${tcp_no_redir_ports:-default}\n\t\t\tudp_no_redir_ports=${udp_no_redir_ports:-default}\n\t\t\tuse_global_config=${use_global_config:-0}\n\t\t\ttcp_proxy_drop_ports=${tcp_proxy_drop_ports:-default}\n\t\t\tudp_proxy_drop_ports=${udp_proxy_drop_ports:-default}\n\t\t\ttcp_redir_ports=${tcp_redir_ports:-default}\n\t\t\tudp_redir_ports=${udp_redir_ports:-default}\n\t\t\tuse_direct_list=${use_direct_list:-1}\n\t\t\tuse_proxy_list=${use_proxy_list:-1}\n\t\t\tuse_block_list=${use_block_list:-1}\n\t\t\tuse_gfw_list=${use_gfw_list:-1}\n\t\t\tchn_list=${chn_list:-direct}\n\t\t\ttcp_proxy_mode=${tcp_proxy_mode:-proxy}\n\t\t\tudp_proxy_mode=${udp_proxy_mode:-proxy}\n\t\t\t[ \"$tcp_no_redir_ports\" = \"default\" ] && tcp_no_redir_ports=$TCP_NO_REDIR_PORTS\n\t\t\t[ \"$udp_no_redir_ports\" = \"default\" ] && udp_no_redir_ports=$UDP_NO_REDIR_PORTS\n\t\t\t[ \"$tcp_proxy_drop_ports\" = \"default\" ] && tcp_proxy_drop_ports=$TCP_PROXY_DROP_PORTS\n\t\t\t[ \"$udp_proxy_drop_ports\" = \"default\" ] && udp_proxy_drop_ports=$UDP_PROXY_DROP_PORTS\n\t\t\t[ \"$tcp_redir_ports\" = \"default\" ] && tcp_redir_ports=$TCP_REDIR_PORTS\n\t\t\t[ \"$udp_redir_ports\" = \"default\" ] && udp_redir_ports=$UDP_REDIR_PORTS\n\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_tcp_node\")\" ] && tcp_node=$(get_cache_var \"ACL_${sid}_tcp_node\")\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_tcp_redir_port\")\" ] && tcp_port=$(get_cache_var \"ACL_${sid}_tcp_redir_port\")\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_udp_node\")\" ] && udp_node=$(get_cache_var \"ACL_${sid}_udp_node\")\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_udp_redir_port\")\" ] && udp_port=$(get_cache_var \"ACL_${sid}_udp_redir_port\")\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_dns_port\")\" ] && dns_redirect_port=$(get_cache_var \"ACL_${sid}_dns_port\")\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_fakedns\")\" ] && use_fakedns=$(get_cache_var \"ACL_${sid}_fakedns\")\n\t\t\t[ -n \"$tcp_node\" ] && {\n\t\t\t\tif is_socks_wrap \"$tcp_node\"; then\n\t\t\t\t\ttcp_node_remark=\"Socks 配置($(config_n_get ${tcp_node#Socks_} port) 端口)\"\n\t\t\t\telse\n\t\t\t\t\ttcp_node_remark=$(config_n_get $tcp_node remarks)\n\t\t\t\tfi\n\t\t\t}\n\t\t\t[ -n \"$udp_node\" ] && {\n\t\t\t\tif is_socks_wrap \"$udp_node\"; then\n\t\t\t\t\tudp_node_remark=\"Socks 配置($(config_n_get ${udp_node#Socks_} port) 端口)\"\n\t\t\t\telse\n\t\t\t\t\tudp_node_remark=$(config_n_get $udp_node remarks)\n\t\t\t\tfi\n\t\t\t}\n\t\t\tuse_shunt_tcp=0\n\t\t\tuse_shunt_udp=0\n\t\t\t[ -n \"$tcp_node\" ] && [ \"$(config_n_get $tcp_node protocol)\" = \"_shunt\" ] && use_shunt_tcp=1\n\t\t\t[ -n \"$udp_node\" ] && [ \"$(config_n_get $udp_node protocol)\" = \"_shunt\" ] && use_shunt_udp=1\n\n\t\t\t[ \"${use_global_config}\" = \"1\" ] && { \n\t\t\t\tif is_socks_wrap \"$TCP_NODE\"; then\n\t\t\t\t\ttcp_node_remark=\"Socks 配置($(config_n_get ${TCP_NODE#Socks_} port) 端口)\"\n\t\t\t\telse\n\t\t\t\t\ttcp_node_remark=$(config_n_get $TCP_NODE remarks)\n\t\t\t\tfi\n\t\t\t\tif is_socks_wrap \"$UDP_NODE\"; then\n\t\t\t\t\tudp_node_remark=\"Socks 配置($(config_n_get ${UDP_NODE#Socks_} port) 端口)\"\n\t\t\t\telse\n\t\t\t\t\tudp_node_remark=$(config_n_get $UDP_NODE remarks)\n\t\t\t\tfi\n\t\t\t\tuse_direct_list=${USE_DIRECT_LIST}\n\t\t\t\tuse_proxy_list=${USE_PROXY_LIST}\n\t\t\t\tuse_block_list=${USE_BLOCK_LIST}\n\t\t\t\tuse_gfw_list=${USE_GFW_LIST}\n\t\t\t\tchn_list=${CHN_LIST}\n\t\t\t\ttcp_proxy_mode=${TCP_PROXY_MODE}\n\t\t\t\tudp_proxy_mode=${UDP_PROXY_MODE}\n\t\t\t\tuse_shunt_tcp=${USE_SHUNT_TCP}\n\t\t\t\tuse_shunt_udp=${USE_SHUNT_UDP}\n\t\t\t\tdns_redirect_port=${DNS_REDIRECT_PORT}\n\t\t\t\tblack_set_name=${NFTSET_BLACK}\n\t\t\t\tblack6_set_name=${NFTSET_BLACK6}\n\t\t\t\tgfw_set_name=${NFTSET_GFW}\n\t\t\t\tgfw6_set_name=${NFTSET_GFW6}\n\t\t\t\tshunt_set_name=${NFTSET_SHUNT}\n\t\t\t\tshunt6_set_name=${NFTSET_SHUNT6}\n\t\t\t\tuse_fakedns=${USE_FAKEDNS}\n\t\t\t}\n\n\t\t\t_acl_list=${TMP_ACL_PATH}/${sid}/source_list\n\n\t\t\tfor i in $(cat $_acl_list); do\n\t\t\t\tlocal _ipt_source _ipv4\n\t\t\t\tlocal msg\n\t\t\t\tif [ -n \"${interface}\" ]; then\n\t\t\t\t\tlocal gateway device\n\t\t\t\t\tnetwork_get_gateway gateway \"${interface}\"\n\t\t\t\t\tnetwork_get_device device \"${interface}\"\n\t\t\t\t\t# network_get_device returns empty for non-UP interfaces (e.g. auto='0').\n\t\t\t\t\t# Try ubus directly, then check if the name is a kernel device.\n\t\t\t\t\t[ -z \"${device}\" ] && device=$(ubus call \"network.interface.${interface}\" status 2>/dev/null | jsonfilter -e '@.device' 2>/dev/null)\n\t\t\t\t\t[ -z \"${device}\" ] && [ -d \"/sys/class/net/${interface}\" ] && device=\"${interface}\"\n\t\t\t\t\t[ -z \"${device}\" ] && device=\"${interface}\"\n\t\t\t\t\t_ipt_source=\"iifname ${device} \"\n\t\t\t\t\tmsg=\"源接口【${device}】，\"\n\t\t\t\telse\n\t\t\t\t\tmsg=\"源接口【所有】，\"\n\t\t\t\tfi\n\t\t\t\tif [ -n \"$(echo ${i} | grep '^iprange:')\" ]; then\n\t\t\t\t\t_iprange=$(echo ${i} | sed 's#iprange:##g')\n\t\t\t\t\t_ipt_source=$(factor ${_iprange} \"${_ipt_source}ip saddr\")\n\t\t\t\t\tmsg=\"${msg}IP range【${_iprange}】，\"\n\t\t\t\t\t_ipv4=\"1\"\n\t\t\t\t\tunset _iprange\n\t\t\t\telif [ -n \"$(echo ${i} | grep '^ipset:')\" ]; then\n\t\t\t\t\t_ipset=$(echo ${i} | sed 's#ipset:##g')\n\t\t\t\t\t_ipt_source=\"${_ipt_source}ip saddr @${_ipset}\"\n\t\t\t\t\tmsg=\"${msg}NFTset【${_ipset}】，\"\n\t\t\t\t\tunset _ipset\n\t\t\t\telif [ -n \"$(echo ${i} | grep '^ip:')\" ]; then\n\t\t\t\t\t_ip=$(echo ${i} | sed 's#ip:##g')\n\t\t\t\t\t_ipt_source=$(factor ${_ip} \"${_ipt_source}ip saddr\")\n\t\t\t\t\tmsg=\"${msg}IP【${_ip}】，\"\n\t\t\t\t\t_ipv4=\"1\"\n\t\t\t\t\tunset _ip\n\t\t\t\telif [ -n \"$(echo ${i} | grep '^mac:')\" ]; then\n\t\t\t\t\t_mac=$(echo ${i} | sed 's#mac:##g')\n\t\t\t\t\t_ipt_source=$(factor ${_mac} \"${_ipt_source}ether saddr\")\n\t\t\t\t\tmsg=\"${msg}MAC【${_mac}】，\"\n\t\t\t\t\tunset _mac\n\t\t\t\telif [ -n \"$(echo ${i} | grep '^any')\" ]; then\n\t\t\t\t\tmsg=\"${msg}所有设备，\"\n\t\t\t\telse\n\t\t\t\t\tcontinue\n\t\t\t\tfi\n\t\t\t\tmsg=\"【$remarks】，${msg}\"\n\t\t\t\t\n\t\t\t\t[ \"$tcp_no_redir_ports\" != \"disable\" ] && {\n\t\t\t\t\tif ! has_1_65535 \"$tcp_no_redir_ports\"; then\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME $nft_prerouting_chain ${_ipt_source} ip protocol tcp $(factor $tcp_no_redir_ports \"tcp dport\") counter return comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ \"$_ipv4\" != \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 ${_ipt_source} meta l4proto tcp $(factor $tcp_no_redir_ports \"tcp dport\") counter return comment \\\"$remarks\\\"\"\n\t\t\t\t\t\techolog \"     - ${msg}不代理 TCP 端口[${tcp_no_redir_ports}]\"\n\t\t\t\t\telse\n\t\t\t\t\t\t#结束时会return，无需加多余的规则。\n\t\t\t\t\t\tunset tcp_port\n\t\t\t\t\t\techolog \"     - ${msg}不代理所有 TCP 端口\"\n\t\t\t\t\tfi\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t[ \"$udp_no_redir_ports\" != \"disable\" ] && {\n\t\t\t\t\tif ! has_1_65535 \"$udp_no_redir_ports\"; then\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_no_redir_ports \"udp dport\") counter return comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ \"$_ipv4\" != \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_no_redir_ports \"udp dport\") counter return comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\techolog \"     - ${msg}不代理 UDP 端口[${udp_no_redir_ports}]\"\n\t\t\t\t\telse\n\t\t\t\t\t\t#结束时会return，无需加多余的规则。\n\t\t\t\t\t\tunset udp_port\n\t\t\t\t\t\techolog \"     - ${msg}不代理所有 UDP 端口\"\n\t\t\t\t\tfi\n\t\t\t\t}\n\n\t\t\t\tlocal dns_redirect\n\t\t\t\t[ $(config_t_get global dns_redirect \"1\") = \"1\" ] && dns_redirect=53\n\t\t\t\tif ([ -n \"$tcp_port\" ] && [ -n \"${tcp_proxy_mode}\" ]) || ([ -n \"$udp_port\" ] && [ -n \"${udp_proxy_mode}\" ]); then\n\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && {\n\t\t\t\t\t\t[ \"${use_global_config}\" = \"0\" ] && {\n\t\t\t\t\t\t\tblack_set_name=\"passwall_${sid}_black\"\n\t\t\t\t\t\t\tblack6_set_name=\"passwall_${sid}_black6\"\n\t\t\t\t\t\t\tgen_nftset $black_set_name ipv4_addr \"2d\" 0\n\t\t\t\t\t\t\tgen_nftset $black6_set_name ipv6_addr \"2d\" 0\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && {\n\t\t\t\t\t\t[ \"${use_global_config}\" = \"0\" ] && {\n\t\t\t\t\t\t\tgfw_set_name=\"passwall_${sid}_gfw\"\n\t\t\t\t\t\t\tgfw6_set_name=\"passwall_${sid}_gfw6\"\n\t\t\t\t\t\t\tgen_nftset $gfw_set_name ipv4_addr \"2d\" 0\n\t\t\t\t\t\t\tgen_nftset $gfw6_set_name ipv6_addr \"2d\" 0\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t[ \"${use_shunt_tcp}\" = \"1\" -o \"${use_shunt_udp}\" = \"1\" ] && {\n\t\t\t\t\t\t[ \"${use_global_config}\" = \"0\" ] && {\n\t\t\t\t\t\t\tshunt_set_name=\"passwall_${sid}_shunt\"\n\t\t\t\t\t\t\tshunt6_set_name=\"passwall_${sid}_shunt6\"\n\t\t\t\t\t\t\tgen_nftset $shunt_set_name ipv4_addr \"2d\" 0\n\t\t\t\t\t\t\tgen_nftset $shunt6_set_name ipv6_addr \"2d\" 0\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t[ -n \"${dns_redirect_port}\" ] && dns_redirect=${dns_redirect_port}\n\t\t\t\telse\n\t\t\t\t\t[ -n \"${DIRECT_DNSMASQ_PORT}\" ] && dns_redirect=${DIRECT_DNSMASQ_PORT}\n\t\t\t\tfi\n\t\t\t\tif [ -n \"${dns_redirect}\" ]; then\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} udp dport 53 counter return comment \\\"$remarks\\\"\"\n\t\t\t\t\t[ \"$_ipv4\" != \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} udp dport 53 counter return comment \\\"$remarks\\\"\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol tcp ${_ipt_source} tcp dport 53 counter return comment \\\"$remarks\\\"\"\n\t\t\t\t\t[ \"$_ipv4\" != \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} tcp dport 53 counter return comment \\\"$remarks\\\"\"\n\t\t\t\t\t#nft \"add rule $NFTABLE_NAME PSW_DNS ip protocol udp ${_ipt_source} udp dport 53 counter redirect to :${dns_redirect} comment \\\"$remarks\\\"\"\n\t\t\t\t\t#nft \"add rule $NFTABLE_NAME PSW_DNS ip protocol tcp ${_ipt_source} tcp dport 53 counter redirect to :${dns_redirect} comment \\\"$remarks\\\"\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_DNS meta l4proto udp ${_ipt_source} udp dport 53 counter redirect to :${dns_redirect} comment \\\"$remarks\\\"\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_DNS meta l4proto tcp ${_ipt_source} tcp dport 53 counter redirect to :${dns_redirect} comment \\\"$remarks\\\"\"\n\t\t\t\t\t[ -z \"$(get_cache_var \"ACL_${sid}_tcp_default\")\" ] && echolog \"     - ${msg}使用与全局配置不相同节点，已将DNS强制重定向到专用 DNS 服务器。\"\n\t\t\t\tfi\n\n\t\t\t\t[ -n \"$tcp_port\" -o -n \"$udp_port\" ] && {\n\t\t\t\t\t[ \"${use_block_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ${_ipt_source} ip daddr @$NFTSET_BLOCK counter drop comment \\\"$remarks\\\"\"\n\t\t\t\t\t[ \"${use_block_list}\" = \"1\" ] && [ -z \"${is_tproxy}\" ] && nft \"add rule $NFTABLE_NAME PSW_NAT ${_ipt_source} ip daddr @$NFTSET_BLOCK counter drop comment \\\"$remarks\\\"\"\n\t\t\t\t\t[ \"${use_direct_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ${_ipt_source} ip daddr @$NFTSET_WHITE counter return comment \\\"$remarks\\\"\"\n\t\t\t\t\t[ \"${use_direct_list}\" = \"1\" ] && [ -z \"${is_tproxy}\" ] && nft \"add rule $NFTABLE_NAME PSW_NAT ${_ipt_source} ip daddr @$NFTSET_WHITE counter return comment \\\"$remarks\\\"\"\n\t\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && [ \"$_ipv4\" != \"1\" ] && {\n\t\t\t\t\t\t[ \"${use_block_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 ${_ipt_source} ip6 daddr @$NFTSET_BLOCK6 counter drop comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ \"${use_direct_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 ${_ipt_source} ip6 daddr @$NFTSET_WHITE6 counter return comment \\\"$remarks\\\"\"\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t[ \"$tcp_proxy_drop_ports\" != \"disable\" ] && {\n\t\t\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && [ \"$_ipv4\" != \"1\" ] && {\n\t\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports \"tcp dport\") ip6 daddr $FAKE_IP_6 counter drop comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports \"tcp dport\") ip6 daddr @$black6_set_name counter drop comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports \"tcp dport\") ip6 daddr @$gfw6_set_name counter drop comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports \"tcp dport\") ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${chn_list} \"counter drop\") comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_shunt_tcp}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports \"tcp dport\") ip6 daddr @$shunt6_set_name counter drop comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${tcp_proxy_mode}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports \"tcp dport\") counter drop comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t}\n\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports \"tcp dport\") ip daddr $FAKE_IP counter drop comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports \"tcp dport\") ip daddr @$black_set_name counter drop comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports \"tcp dport\") ip daddr @$gfw_set_name counter drop comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports \"tcp dport\") ip daddr @$NFTSET_CHN $(get_jump_nft ${chn_list} \"counter drop\") comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ \"${use_shunt_tcp}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports \"tcp dport\") ip daddr @$shunt_set_name counter drop comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ \"${tcp_proxy_mode}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp ${_ipt_source} $(factor $tcp_proxy_drop_ports \"tcp dport\") counter drop comment \\\"$remarks\\\"\"\n\t\t\t\t\t\techolog \"     - ${msg}屏蔽代理 TCP 端口[${tcp_proxy_drop_ports}]\"\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t[ \"$udp_proxy_drop_ports\" != \"disable\" ] && {\n\t\t\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && [ \"$_ipv4\" != \"1\" ] && {\n\t\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_proxy_drop_ports \"udp dport\") ip6 daddr $FAKE_IP_6 counter drop comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_proxy_drop_ports \"udp dport\") ip6 daddr @$black6_set_name counter drop comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_proxy_drop_ports \"udp dport\") ip6 daddr @$gfw6_set_name counter drop comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_proxy_drop_ports \"udp dport\") ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${chn_list} \"counter drop\") comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_shunt_udp}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_proxy_drop_ports \"udp dport\") ip6 daddr @$shunt6_set_name counter drop comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${udp_proxy_mode}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_proxy_drop_ports \"udp dport\") counter drop comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t}\n\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports \"udp dport\") ip daddr $FAKE_IP counter drop comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports \"udp dport\") ip daddr @$black_set_name counter drop comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports \"udp dport\") ip daddr @$gfw_set_name counter drop comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports \"udp dport\") ip daddr @$NFTSET_CHN $(get_jump_nft ${chn_list} \"counter drop\") comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t[ \"${use_shunt_udp}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports \"udp dport\") ip daddr @$shunt_set_name counter drop comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t[ \"${udp_proxy_mode}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_proxy_drop_ports \"udp dport\") counter drop comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\techolog \"     - ${msg}屏蔽代理 UDP 端口[${udp_proxy_drop_ports}]\"\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t[ -n \"$tcp_port\" ] && {\n\t\t\t\t\tif [ -n \"${tcp_proxy_mode}\" ]; then\n\t\t\t\t\t\tmsg2=\"${msg}使用 TCP 节点[$tcp_node_remark]\"\n\t\t\t\t\t\tif [ -n \"${is_tproxy}\" ]; then\n\t\t\t\t\t\t\tmsg2=\"${msg2}(TPROXY:${tcp_port})\"\n\t\t\t\t\t\t\tnft_chain=\"PSW_MANGLE\"\n\t\t\t\t\t\t\tnft_j=\"counter jump PSW_RULE\"\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tmsg2=\"${msg2}(REDIRECT:${tcp_port})\"\n\t\t\t\t\t\t\tnft_chain=\"PSW_NAT\"\n\t\t\t\t\t\t\tnft_j=\"$(REDIRECT $tcp_port)\"\n\t\t\t\t\t\tfi\n\t\t\t\t\t\t\n\t\t\t\t\t\t[ \"$accept_icmp\" = \"1\" ] && {\n\t\t\t\t\t\t\t[ \"${use_direct_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ${_ipt_source} ip daddr @$NFTSET_WHITE counter return comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ${_ipt_source} ip daddr $FAKE_IP $(REDIRECT) comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ${_ipt_source} ip daddr @$black_set_name $(REDIRECT) comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ${_ipt_source} ip daddr @$gfw_set_name $(REDIRECT) comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ${_ipt_source} ip daddr @$NFTSET_CHN $(get_jump_nft ${chn_list}) comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t\t[ \"${use_shunt_tcp}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ${_ipt_source} ip daddr @$shunt_set_name $(REDIRECT) comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t\t[ \"${tcp_proxy_mode}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ${_ipt_source} $(REDIRECT) comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ${_ipt_source} return comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t[ \"$accept_icmpv6\" = \"1\" ] && [ \"$PROXY_IPV6\" == \"1\" ] && [ \"$_ipv4\" != \"1\" ] && {\n\t\t\t\t\t\t\t[ \"${use_direct_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} ip6 daddr @$NFTSET_WHITE6 counter return comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} ip6 daddr $FAKE_IP_6 $(REDIRECT) comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} ip6 daddr @$black6_set_name $(REDIRECT) comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} ip6 daddr @$gfw6_set_name $(REDIRECT) comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${chn_list}) comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_shunt_tcp}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} ip6 daddr @$shunt6_set_name $(REDIRECT) comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${tcp_proxy_mode}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} $(REDIRECT) comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} return comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} ip daddr $FAKE_IP ${nft_j} comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports \"tcp dport\") ip daddr @$black_set_name ${nft_j} comment \\\"$remarks\\\" \"\n\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports \"tcp dport\") ip daddr @$gfw_set_name ${nft_j} comment \\\"$remarks\\\" \"\n\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports \"tcp dport\") ip daddr @$NFTSET_CHN $(get_jump_nft ${chn_list} \"${nft_j}\") comment \\\"$remarks\\\" \"\n\t\t\t\t\t\t[ \"${use_shunt_tcp}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports \"tcp dport\") ip daddr @$shunt_set_name ${nft_j} comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ \"${tcp_proxy_mode}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports \"tcp dport\") ${nft_j} comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ -n \"${is_tproxy}\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} $(REDIRECT $tcp_port TPROXY4) comment \\\"$remarks\\\"\"\n\n\t\t\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && [ \"$_ipv4\" != \"1\" ] && {\n\t\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} ip6 daddr $FAKE_IP_6 counter jump PSW_RULE comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports \"tcp dport\") ip6 daddr @$black6_set_name counter jump PSW_RULE comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports \"tcp dport\") ip6 daddr @$gfw6_set_name counter jump PSW_RULE comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports \"tcp dport\") ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${chn_list} \"counter jump PSW_RULE\") comment \\\"$remarks\\\" \"\n\t\t\t\t\t\t\t[ \"${use_shunt_tcp}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports \"tcp dport\") ip6 daddr @$shunt6_set_name counter jump PSW_RULE comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${tcp_proxy_mode}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports \"tcp dport\") counter jump PSW_RULE comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(REDIRECT $tcp_port TPROXY) comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tmsg2=\"${msg}不代理 TCP\"\n\t\t\t\t\tfi\n\t\t\t\t\techolog \"     - ${msg2}\"\n\t\t\t\t}\n\n\t\t\t\tnft \"add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp ${_ipt_source} counter return comment \\\"$remarks\\\"\"\n\t\t\t\t[ \"$_ipv4\" != \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ${_ipt_source} counter return comment \\\"$remarks\\\"\" 2>/dev/null\n\n\t\t\t\t[ -n \"$udp_port\" ] && {\n\t\t\t\t\tif [ -n \"${udp_proxy_mode}\" ]; then\n\t\t\t\t\t\tmsg2=\"${msg}使用 UDP 节点[$udp_node_remark]\"\n\t\t\t\t\t\tmsg2=\"${msg2}(TPROXY:${udp_port})\"\n\n\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} ip daddr $FAKE_IP counter jump PSW_RULE comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_redir_ports \"udp dport\") ip daddr @$black_set_name counter jump PSW_RULE comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_redir_ports \"udp dport\") ip daddr @$gfw_set_name counter jump PSW_RULE comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_redir_ports \"udp dport\") ip daddr @$NFTSET_CHN $(get_jump_nft ${chn_list} \"counter jump PSW_RULE\") comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ \"${use_shunt_udp}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_redir_ports \"udp dport\") ip daddr @$shunt_set_name counter jump PSW_RULE comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ \"${udp_proxy_mode}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_redir_ports \"udp dport\") counter jump PSW_RULE comment \\\"$remarks\\\"\"\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} $(REDIRECT $udp_port TPROXY4) comment \\\"$remarks\\\"\"\n\n\t\t\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && [ \"$_ipv4\" != \"1\" ] && {\n\t\t\t\t\t\t\t[ \"${use_fakedns}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} ip6 daddr $FAKE_IP_6 counter jump PSW_RULE comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t\t[ \"${use_proxy_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports \"udp dport\") ip6 daddr @$black6_set_name counter jump PSW_RULE comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_gfw_list}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports \"udp dport\") ip6 daddr @$gfw6_set_name counter jump PSW_RULE comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${chn_list}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports \"udp dport\") ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${chn_list} \"counter jump PSW_RULE\") comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${use_shunt_udp}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports \"udp dport\") ip6 daddr @$shunt6_set_name counter jump PSW_RULE comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\t[ \"${udp_proxy_mode}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports \"udp dport\") counter jump PSW_RULE comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} $(REDIRECT $udp_port TPROXY) comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\t}\n\t\t\t\t\telse\n\t\t\t\t\t\tmsg2=\"${msg}不代理 UDP\"\n\t\t\t\t\tfi\n\t\t\t\t\techolog \"     - ${msg2}\"\n\t\t\t\t}\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ${_ipt_source} counter return comment \\\"$remarks\\\"\"\n\t\t\t\t[ \"$_ipv4\" != \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ${_ipt_source} counter return comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\tunset nft_chain nft_j _ipt_source msg msg2 _ipv4\n\t\t\tdone\n\t\t\tunset enabled sid remarks sources use_global_config use_direct_list use_proxy_list use_block_list use_gfw_list chn_list tcp_proxy_mode udp_proxy_mode dns_redirect_port tcp_no_redir_ports udp_no_redir_ports tcp_proxy_drop_ports udp_proxy_drop_ports tcp_redir_ports udp_redir_ports tcp_node udp_node interface\n\t\t\tunset tcp_port udp_port tcp_node_remark udp_node_remark _acl_list use_shunt_tcp use_shunt_udp dns_redirect use_fakedns\n\t\tdone\n\t}\n\n\t[ \"$ENABLED_DEFAULT_ACL\" == 1 ] && [ \"$CLIENT_PROXY\" == 1 ] && {\n\t\tmsg=\"【默认】，\"\n\t\t[ \"$TCP_NO_REDIR_PORTS\" != \"disable\" ] && {\n\t\t\tnft \"add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp $(factor $TCP_NO_REDIR_PORTS \"tcp dport\") counter return comment \\\"默认\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_NO_REDIR_PORTS \"tcp dport\") counter return comment \\\"默认\\\"\"\n\t\t\tif ! has_1_65535 \"$TCP_NO_REDIR_PORTS\"; then\n\t\t\t\techolog \"     - ${msg}不代理 TCP 端口[${TCP_NO_REDIR_PORTS}]\"\n\t\t\telse\n\t\t\t\tunset TCP_PROXY_MODE\n\t\t\t\techolog \"     - ${msg}不代理所有 TCP 端口\"\n\t\t\tfi\n\t\t}\n\n\t\t[ \"$UDP_NO_REDIR_PORTS\" != \"disable\" ] && {\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_NO_REDIR_PORTS \"udp dport\") counter return comment \\\"默认\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_NO_REDIR_PORTS \"udp dport\") counter return comment \\\"默认\\\"\"\n\t\t\tif ! has_1_65535 \"$UDP_NO_REDIR_PORTS\"; then\n\t\t\t\techolog \"     - ${msg}不代理 UDP 端口[${UDP_NO_REDIR_PORTS}]\"\n\t\t\telse\n\t\t\t\tunset UDP_PROXY_MODE\n\t\t\t\techolog \"     - ${msg}不代理所有 UDP 端口\"\n\t\t\tfi\n\t\t}\n\n\t\tlocal DNS_REDIRECT\n\t\t[ $(config_t_get global dns_redirect \"1\") = \"1\" ] && DNS_REDIRECT=53\n\t\tif ([ -n \"$TCP_NODE\" ] && [ -n \"${TCP_PROXY_MODE}\" ]) || ([ -n \"$UDP_NODE\" ] && [ -n \"${UDP_PROXY_MODE}\" ]); then\n\t\t\t[ -n \"${DNS_REDIRECT_PORT}\" ] && DNS_REDIRECT=${DNS_REDIRECT_PORT}\n\t\telse\n\t\t\t[ -n \"${DIRECT_DNSMASQ_PORT}\" ] && DNS_REDIRECT=${DIRECT_DNSMASQ_PORT}\n\t\tfi\n\n\t\tif [ -n \"${DNS_REDIRECT}\" ]; then\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp udp dport 53 counter return comment \\\"默认\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp udp dport 53 counter return comment \\\"默认\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol tcp tcp dport 53 counter return comment \\\"默认\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp tcp dport 53 counter return comment \\\"默认\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_DNS ip protocol udp udp dport 53 counter redirect to :${DNS_REDIRECT} comment \\\"默认\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_DNS ip protocol tcp tcp dport 53 counter redirect to :${DNS_REDIRECT} comment \\\"默认\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_DNS meta l4proto udp udp dport 53 counter redirect to :${DNS_REDIRECT} comment \\\"默认\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_DNS meta l4proto tcp tcp dport 53 counter redirect to :${DNS_REDIRECT} comment \\\"默认\\\"\"\n\t\tfi\n\n\t\t[ -n \"${TCP_PROXY_MODE}\" -o -n \"${UDP_PROXY_MODE}\" ] && {\n\t\t\t[ \"${USE_BLOCK_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip daddr @$NFTSET_BLOCK counter drop comment \\\"默认\\\"\"\n\t\t\t[ \"${USE_BLOCK_LIST}\" = \"1\" ] && [ -z \"${is_tproxy}\" ] && nft \"add rule $NFTABLE_NAME PSW_NAT ip daddr @$NFTSET_BLOCK counter drop comment \\\"默认\\\"\"\n\t\t\t[ \"${USE_DIRECT_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip daddr @$NFTSET_WHITE counter return comment \\\"默认\\\"\"\n\t\t\t[ \"${USE_DIRECT_LIST}\" = \"1\" ] && [ -z \"${is_tproxy}\" ] && nft \"add rule $NFTABLE_NAME PSW_NAT ip daddr @$NFTSET_WHITE counter return comment \\\"默认\\\"\"\n\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t[ \"${USE_BLOCK_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 ip6 daddr @$NFTSET_BLOCK6 counter drop comment \\\"默认\\\"\"\n\t\t\t\t[ \"${USE_DIRECT_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 ip6 daddr @$NFTSET_WHITE6 counter return comment \\\"默认\\\"\"\n\t\t\t}\n\t\t\t\n\t\t\t[ \"$TCP_PROXY_DROP_PORTS\" != \"disable\" ] && {\n\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") ip6 daddr $FAKE_IP_6 counter drop comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") ip6 daddr @$NFTSET_BLACK6 counter drop comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") ip6 daddr @$NFTSET_GFW6 counter drop comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${CHN_LIST} \"counter drop\") comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") ip6 daddr @$NFTSET_SHUNT6 counter drop comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${TCP_PROXY_MODE}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") counter drop comment \\\"默认\\\"\"\n\t\t\t\t}\n\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") ip daddr $FAKE_IP counter drop comment \\\"默认\\\"\"\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") ip daddr @$NFTSET_BLACK counter drop comment \\\"默认\\\"\"\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") ip daddr @$NFTSET_GFW counter drop comment \\\"默认\\\"\"\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") ip daddr @$NFTSET_CHN $(get_jump_nft ${CHN_LIST} \"counter drop\") comment \\\"默认\\\"\"\n\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") ip daddr @$NFTSET_SHUNT counter drop comment \\\"默认\\\"\"\n\t\t\t\t[ \"${TCP_PROXY_MODE}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") counter drop comment \\\"默认\\\"\"\n\t\t\t\techolog \"     - ${msg}屏蔽代理 TCP 端口[${TCP_PROXY_DROP_PORTS}]\"\n\t\t\t}\n\t\t\t\n\t\t\t[ \"$UDP_PROXY_DROP_PORTS\" != \"disable\" ] && {\n\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") ip6 daddr $FAKE_IP_6 counter drop comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") ip6 daddr @$NFTSET_BLACK6 counter drop comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") ip6 daddr @$NFTSET_GFW6 counter drop comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${CHN_LIST} \"counter drop\") comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_SHUNT_UDP}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") ip6 daddr @$NFTSET_SHUNT6 counter drop comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${UDP_PROXY_MODE}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") counter drop comment \\\"默认\\\"\"\n\t\t\t\t}\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") ip daddr $FAKE_IP counter drop comment \\\"默认\\\"\"\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") ip daddr @$NFTSET_BLACK counter drop comment \\\"默认\\\"\"\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") ip daddr @$NFTSET_GFW counter drop comment \\\"默认\\\"\"\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") ip daddr @$NFTSET_CHN $(get_jump_nft ${CHN_LIST} \"counter drop\") comment \\\"默认\\\"\"\n\t\t\t\t[ \"${USE_SHUNT_UDP}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") ip daddr @$NFTSET_SHUNT counter drop comment \\\"默认\\\"\"\n\t\t\t\t[ \"${UDP_PROXY_MODE}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") counter drop comment \\\"默认\\\"\"\n\t\t\t\techolog \"     - ${msg}屏蔽代理 UDP 端口[${UDP_PROXY_DROP_PORTS}]\"\n\t\t\t}\n\t\t}\n\n\t\t#  加载TCP默认代理模式\n\t\tif [ -n \"${TCP_PROXY_MODE}\" ]; then\n\t\t\t[ -n \"$TCP_NODE\" ] && {\n\t\t\t\tif is_socks_wrap \"$TCP_NODE\"; then\n\t\t\t\t\tmsg2=\"${msg}使用 TCP 节点[Socks 配置($(config_n_get ${TCP_NODE#Socks_} port) 端口)]\"\n\t\t\t\telse\n\t\t\t\t\tmsg2=\"${msg}使用 TCP 节点[$(config_n_get $TCP_NODE remarks)]\"\n\t\t\t\tfi\n\t\t\t\tif [ -n \"${is_tproxy}\" ]; then\n\t\t\t\t\tmsg2=\"${msg2}(TPROXY:${TCP_REDIR_PORT})\"\n\t\t\t\t\tnft_chain=\"PSW_MANGLE\"\n\t\t\t\t\tnft_j=\"counter jump PSW_RULE\"\n\t\t\t\telse\n\t\t\t\t\tmsg2=\"${msg2}(REDIRECT:${TCP_REDIR_PORT})\"\n\t\t\t\t\tnft_chain=\"PSW_NAT\"\n\t\t\t\t\tnft_j=\"$(REDIRECT $TCP_REDIR_PORT)\"\n\t\t\t\tfi\n\t\t\t\t\n\t\t\t\t[ \"$accept_icmp\" = \"1\" ] && {\n\t\t\t\t\t[ \"${USE_DIRECT_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip daddr @$NFTSET_WHITE counter return comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ip daddr $FAKE_IP $(REDIRECT) comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ip daddr @$NFTSET_BLACK $(REDIRECT) comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ip daddr @$NFTSET_GFW $(REDIRECT) comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ip daddr @$NFTSET_CHN $(get_jump_nft ${CHN_LIST}) comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp ip daddr @$NFTSET_SHUNT $(REDIRECT) comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${TCP_PROXY_MODE}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp $(REDIRECT) comment \\\"默认\\\"\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip protocol icmp return comment \\\"默认\\\"\"\n\t\t\t\t}\n\n\t\t\t\t[ \"$accept_icmpv6\" = \"1\" ] && [ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t\t[ \"${USE_DIRECT_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip6 daddr @$NFTSET_WHITE6 counter return comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ip6 daddr $FAKE_IP_6 $(REDIRECT) comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ip6 daddr @$NFTSET_BLACK6 $(REDIRECT) comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ip6 daddr @$NFTSET_GFW6 $(REDIRECT) comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${CHN_LIST}) comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 ip6 daddr @$NFTSET_SHUNT6 $(REDIRECT) comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${TCP_PROXY_MODE}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 $(REDIRECT) comment \\\"默认\\\"\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT meta l4proto icmpv6 return comment \\\"默认\\\"\"\n\t\t\t\t}\n\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp ip daddr $FAKE_IP ${nft_j} comment \\\"默认\\\"\"\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") ip daddr @$NFTSET_BLACK ${nft_j} comment \\\"默认\\\"\"\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") ip daddr @$NFTSET_GFW ${nft_j} comment \\\"默认\\\"\"\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") ip daddr @$NFTSET_CHN $(get_jump_nft ${CHN_LIST} \"${nft_j}\") comment \\\"默认\\\"\"\n\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") ip daddr @$NFTSET_SHUNT ${nft_j} comment \\\"默认\\\"\"\n\t\t\t\t[ \"${TCP_PROXY_MODE}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") ${nft_j} comment \\\"默认\\\"\"\n\t\t\t\t[ -n \"${is_tproxy}\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(REDIRECT $TCP_REDIR_PORT TPROXY4) comment \\\"默认\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp counter return comment \\\"默认\\\"\"\n\n\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp ip6 daddr $FAKE_IP_6 counter jump PSW_RULE comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") ip6 daddr @$NFTSET_BLACK6 counter jump PSW_RULE comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") ip6 daddr @$NFTSET_GFW6 counter jump PSW_RULE comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${CHN_LIST} \"counter jump PSW_RULE\") comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") ip6 daddr @$NFTSET_SHUNT6 counter jump PSW_RULE comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${TCP_PROXY_MODE}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") counter jump PSW_RULE comment \\\"默认\\\"\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp $(REDIRECT $TCP_REDIR_PORT TPROXY) comment \\\"默认\\\"\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp counter return comment \\\"默认\\\"\"\n\t\t\t\t}\n\n\t\t\t\techolog \"     - ${msg2}\"\n\t\t\t}\n\t\tfi\n\n\t\t#  加载UDP默认代理模式\n\t\tif [ -n \"${UDP_PROXY_MODE}\" ]; then\n\t\t\t[ -n \"$UDP_NODE\" -o \"$TCP_UDP\" = \"1\" ] && {\n\t\t\t\tif is_socks_wrap \"$UDP_NODE\"; then\n\t\t\t\t\tmsg2=\"${msg}使用 UDP 节点[Socks 配置($(config_n_get ${UDP_NODE#Socks_} port) 端口)](TPROXY:${UDP_REDIR_PORT})\"\n\t\t\t\telse\n\t\t\t\t\tmsg2=\"${msg}使用 UDP 节点[$(config_n_get $UDP_NODE remarks)](TPROXY:${UDP_REDIR_PORT})\"\n\t\t\t\tfi\n\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp ip daddr $FAKE_IP counter jump PSW_RULE comment \\\"默认\\\"\"\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_REDIR_PORTS \"udp dport\") ip daddr @$NFTSET_BLACK counter jump PSW_RULE comment \\\"默认\\\"\"\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_REDIR_PORTS \"udp dport\") ip daddr @$NFTSET_GFW counter jump PSW_RULE comment \\\"默认\\\"\"\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_REDIR_PORTS \"udp dport\") ip daddr @$NFTSET_CHN $(get_jump_nft ${CHN_LIST} \"counter jump PSW_RULE\") comment \\\"默认\\\"\"\n\t\t\t\t[ \"${USE_SHUNT_UDP}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_REDIR_PORTS \"udp dport\") ip daddr @$NFTSET_SHUNT counter jump PSW_RULE comment \\\"默认\\\"\"\n\t\t\t\t[ \"${UDP_PROXY_MODE}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(factor $UDP_REDIR_PORTS \"udp dport\") counter jump PSW_RULE comment \\\"默认\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp $(REDIRECT $UDP_REDIR_PORT TPROXY4) comment \\\"默认\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp counter return comment \\\"默认\\\"\"\n\n\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp ip6 daddr $FAKE_IP_6 counter jump PSW_RULE comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_REDIR_PORTS \"udp dport\") ip6 daddr @$NFTSET_BLACK6 counter jump PSW_RULE comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_REDIR_PORTS \"udp dport\") ip6 daddr @$NFTSET_GFW6 counter jump PSW_RULE comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_REDIR_PORTS \"udp dport\") ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${CHN_LIST} \"counter jump PSW_RULE\") comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${USE_SHUNT_UDP}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_REDIR_PORTS \"udp dport\") ip6 daddr @$NFTSET_SHUNT6 counter jump PSW_RULE comment \\\"默认\\\"\"\n\t\t\t\t\t[ \"${UDP_PROXY_MODE}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(factor $UDP_REDIR_PORTS \"udp dport\") counter jump PSW_RULE comment \\\"默认\\\"\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp $(REDIRECT $UDP_REDIR_PORT TPROXY) comment \\\"默认\\\"\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp counter return comment \\\"默认\\\"\"\n\t\t\t\t}\n\n\t\t\t\techolog \"     - ${msg2}\"\n\t\t\t}\n\t\tfi\n\t}\n}\n\nfilter_haproxy() {\n\tfor item in ${haproxy_items}; do\n\t\tget_host_ip ipv4 $(echo $item | awk -F \":\" '{print $1}') 1\n\tdone | insert_nftset $NFTSET_VPS \"-1\"\n\techolog \"  - [$?]加入负载均衡的节点到nftset[$NFTSET_VPS]直连完成\"\n}\n\nfilter_vps_addr() {\n\tfor server_host in \"$@\"; do\n\t\tget_host_ip \"ipv4\" ${server_host}\n\tdone | insert_nftset $NFTSET_VPS \"-1\"\n\n\tfor server_host in \"$@\"; do\n\t\tget_host_ip \"ipv6\" ${server_host}\n\tdone | insert_nftset $NFTSET_VPS6 \"-1\"\n}\n\nfilter_vpsip() {\n\tuci show $CONFIG | grep -E \"(.address=|.download_address=)\" | cut -d \"'\" -f 2 | grep -E \"([0-9]{1,3}[\\.]){3}[0-9]{1,3}\" | grep -v \"^127\\.0\\.0\\.1$\" | insert_nftset $NFTSET_VPS \"-1\"\n\techolog \"  - [$?]加入所有IPv4节点到nftset[$NFTSET_VPS]直连完成\"\n\tuci show $CONFIG | grep -E \"(.address=|.download_address=)\" | cut -d \"'\" -f 2 | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | insert_nftset $NFTSET_VPS6 \"-1\"\n\techolog \"  - [$?]加入所有IPv6节点到nftset[$NFTSET_VPS6]直连完成\"\n\t#订阅方式为直连时\n\tget_subscribe_host | grep -E \"([0-9]{1,3}[\\.]){3}[0-9]{1,3}\" | grep -v \"^127\\.0\\.0\\.1$\" | sed -e \"/^$/d\" | insert_nftset $NFTSET_VPS \"-1\"\n\tget_subscribe_host | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | sed -e \"/^$/d\" | insert_nftset $NFTSET_VPS6 \"-1\"\n}\n\nfilter_server_port() {\n\tlocal address=\"$1\"\n\tlocal port=$(echo \"$2\" | tr ':' '-' | tr -d ' ')\n\tlocal stream=$(echo \"$3\" | tr 'A-Z' 'a-z')\n\tlocal _ip_type _port_expr _ver _is_tproxy\n\tlocal _nft_output_chain=\"PSW_OUTPUT_NAT\"\n\t[ \"$(config_t_get global_forwarding tcp_proxy_way redirect)\" = \"tproxy\" ] && _is_tproxy=\"TPROXY\"\n\t[ \"$stream\" = \"udp\" ] && _is_tproxy=\"TPROXY\"\n\t[ -n \"$_is_tproxy\" ] && _nft_output_chain=\"PSW_OUTPUT_MANGLE\"\n\tcase \"$port\" in\n\t\t*,*) _port_expr=\"{ $port }\" ;;\n\t\t*)   _port_expr=\"$port\" ;;\n\tesac\n\tfor _ver in 4 6; do\n\t\t[ \"$_ver\" = \"4\" ] && _ip_type=\"ip\"\n\t\t[ \"$_ver\" = \"6\" ] && _ip_type=\"ip6\" && _nft_output_chain=\"PSW_OUTPUT_MANGLE_V6\"\n\t\tnft list chain \"$NFTABLE_NAME\" \"$_nft_output_chain\" 2>/dev/null | grep -q \"comment \\\"${address}:${port}:${stream}\\\"\" || \\\n\t\tnft insert rule \"$NFTABLE_NAME\" \"$_nft_output_chain\" meta l4proto \"$stream\" $_ip_type daddr \"$address\" \"$stream\" dport $_port_expr return comment \"\\\"${address}:${port}:${stream}\\\"\" 2>/dev/null\n\tdone\n}\n\nfilter_node() {\n\tlocal node=\"$1\" stream=\"$2\"\n\t[ -z \"$node\" ] && return 1\n\tlocal address=$(config_n_get \"$node\" address)\n\tlocal port=$(config_n_get \"$node\" port)\n\tlocal hop=$(config_n_get \"$node\" hysteria2_hop)\n\t[ -n \"$hop\" ] && port=\"${port:+$port,}$hop\" \n\t[ -z \"$address\" -o -z \"$port\" ] && return 1\n\tfilter_server_port \"$address\" \"$port\" \"$stream\"\n}\n\nfilter_direct_node_list() {\n\t[ ! -s \"$TMP_PATH/direct_node_list\" ] && return\n\tawk '!seen[$0]++' \"$TMP_PATH/direct_node_list\" | while read -r _node_id; do\n\t\tfilter_node \"$_node_id\" TCP\n\t\tfilter_node \"$_node_id\" UDP\n\t\tunset _node_id\n\tdone\n}\n\n\ndel_script_mwan3() {\n\t[ -s \"/etc/init.d/mwan3\" ] && sed -i \"/${CONFIG}/d\" /etc/init.d/mwan3 >/dev/null 2>&1\n}\n\nadd_script_mwan3() {\n\tdel_script_mwan3\n\t[ -s \"/etc/init.d/mwan3\" ] && {\n\t\tsed -i '/start_service()/,/}/ s/^}/    \\/usr\\/share\\/passwall\\/nftables.sh mwan3_start\\n}/' /etc/init.d/mwan3\n\t\tsed -i '/stop_service().*{/a \\    \\/usr\\/share\\/passwall\\/nftables.sh mwan3_stop' /etc/init.d/mwan3\n\t}\n}\n\nmwan3_stop() {\n\tlocal handles=$(nft -a list chain ip mangle mwan3_hook 2>/dev/null | grep \"${FWMARK}\" | awk -F '# handle ' '{print$2}')\n\tfor handle in $handles; do\n\t\tnft delete rule ip mangle mwan3_hook handle ${handle} 2>/dev/null\n\tdone\n}\n\nmwan3_start() {\n\tmwan3_stop\n\tnft list chain ip mangle mwan3_hook >/dev/null 2>&1 && nft insert rule ip mangle mwan3_hook ct mark ${FWMARK} counter return >/dev/null 2>&1\n}\n\nupdate_wan_sets() {\n\tlocal log=$1\n\n\t[ -z \"$(command -v get_wan_ips)\" ] && . \"$UTILS_PATH\"\n\n\tlocal WAN_IP=$(get_wan_ips ip4)\n\t[ -n \"$WAN_IP\" ] && {\n\t\tnft flush set $NFTABLE_NAME $NFTSET_WAN\n\t\techo \"$WAN_IP\" | insert_nftset $NFTSET_WAN \"-1\"\n\t\t[ \"$log\" = \"log\" ] && {\n\t\t\tlocal wan_ip\n\t\t\tfor wan_ip in $WAN_IP; do\n\t\t\t\techolog \"  - [$?]加入WAN IPv4到nftset[$NFTSET_WAN]：${wan_ip}\"\n\t\t\tdone\n\t\t}\n\t}\n\n\tlocal WAN6_IP=$(get_wan_ips ip6)\n\t[ -n \"${WAN6_IP}\" ] && {\n\t\tnft flush set $NFTABLE_NAME $NFTSET_WAN6\n\t\techo \"$WAN6_IP\" | insert_nftset $NFTSET_WAN6 \"-1\"\n\t\t[ \"$log\" = \"log\" ] && {\n\t\t\tlocal wan6_ip\n\t\t\tfor wan6_ip in $WAN6_IP; do\n\t\t\t\techolog \"  - [$?]加入WAN IPv6到nftset[$NFTSET_WAN6]：${wan6_ip}\"\n\t\t\tdone\n\t\t}\n\t}\n}\n\nadd_firewall_rule() {\n\techolog \"开始加载 nftables 防火墙规则...\"\n\tgen_nft_tables\n\tadd_script_mwan3\n\tmwan3_start\n\tgen_nftset $NFTSET_WAN ipv4_addr 0 \"-1\"\n\tgen_nftset $NFTSET_VPS ipv4_addr 0 \"-1\"\n\tgen_nftset $NFTSET_GFW ipv4_addr \"2d\" 0\n\tgen_nftset $NFTSET_LOCAL ipv4_addr 0 \"-1\"\n\tgen_nftset $NFTSET_LAN ipv4_addr 0 \"-1\" $(gen_lanlist)\n\tif [ -f $RULES_PATH/chnroute.nft ] && [ -s $RULES_PATH/chnroute.nft ] && [ $(awk 'END{print NR}' $RULES_PATH/chnroute.nft) -ge 8 ]; then\n\t\t#echolog \"使用缓存加载chnroute...\"\n\t\tnft -f $RULES_PATH/chnroute.nft\n\telse\n\t\tcat $RULES_PATH/chnroute | tr -s '\\n' | grep -v \"^#\" | gen_nftset $NFTSET_CHN ipv4_addr \"2d\" 0 \n\tfi\n\tgen_nftset $NFTSET_BLACK ipv4_addr \"2d\" 0\n\tgen_nftset $NFTSET_WHITE ipv4_addr \"2d\" 0\n\tgen_nftset $NFTSET_BLOCK ipv4_addr \"2d\" 0\n\tgen_nftset $NFTSET_SHUNT ipv4_addr \"2d\" 0\n\n\tgen_nftset $NFTSET_WAN6 ipv6_addr 0 \"-1\"\n\tgen_nftset $NFTSET_VPS6 ipv6_addr 0 \"-1\"\n\tgen_nftset $NFTSET_GFW6 ipv6_addr \"2d\" 0\n\tgen_nftset $NFTSET_LOCAL6 ipv6_addr 0 \"-1\"\n\tgen_nftset $NFTSET_LAN6 ipv6_addr 0 \"-1\" $(gen_lanlist_6)\n\tif [ -f $RULES_PATH/chnroute6.nft ] && [ -s $RULES_PATH/chnroute6.nft ] && [ $(awk 'END{print NR}' $RULES_PATH/chnroute6.nft) -ge 8 ]; then\n\t\t#echolog \"使用缓存加载chnroute6...\"\n\t\tnft -f $RULES_PATH/chnroute6.nft\n\telse\n\t\tcat $RULES_PATH/chnroute6 | tr -s '\\n' | grep -v \"^#\" | gen_nftset $NFTSET_CHN6 ipv6_addr \"2d\" 0\n\tfi\n\tgen_nftset $NFTSET_BLACK6 ipv6_addr \"2d\" 0\n\tgen_nftset $NFTSET_WHITE6 ipv6_addr \"2d\" 0\n\tgen_nftset $NFTSET_BLOCK6 ipv6_addr \"2d\" 0\n\tgen_nftset $NFTSET_SHUNT6 ipv6_addr \"2d\" 0\n\n\t#导入规则列表、分流规则中的IP列表\n\tlocal USE_SHUNT_NODE=0\n\tlocal USE_PROXY_LIST_ALL=${USE_PROXY_LIST}\n\tlocal USE_DIRECT_LIST_ALL=${USE_DIRECT_LIST}\n\tlocal USE_BLOCK_LIST_ALL=${USE_BLOCK_LIST}\n\tlocal _TCP_NODE=$(config_t_get global tcp_node)\n\tlocal _UDP_NODE=$(config_t_get global udp_node)\n\tlocal USE_GEOVIEW=$(config_t_get global_rules enable_geoview)\n\t[ -z \"$(first_type $(config_t_get global_app geoview_file) geoview)\" ] && USE_GEOVIEW=0\n\n\t[ -n \"$_TCP_NODE\" ] && [ \"$(config_n_get $_TCP_NODE protocol)\" = \"_shunt\" ] && USE_SHUNT_TCP=1 && USE_SHUNT_NODE=1\n\t[ -n \"$_UDP_NODE\" ] && [ \"$(config_n_get $_UDP_NODE protocol)\" = \"_shunt\" ] && USE_SHUNT_UDP=1 && USE_SHUNT_NODE=1\n\t[ \"$_UDP_NODE\" = \"tcp\" ] && USE_SHUNT_UDP=$USE_SHUNT_TCP\n\n\tfor acl_section in $(uci show ${CONFIG} | grep \"=acl_rule\" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do\n\t\t[ \"$(config_n_get $acl_section enabled)\" != \"1\" ] && continue\n\t\t[ \"$(config_n_get $acl_section use_global_config 0)\" != \"1\" ] && {\n\t\t\t[ \"$(config_n_get $acl_section use_direct_list 1)\" = \"1\" ] && USE_PROXY_LIST_ALL=1\n\t\t\t[ \"$(config_n_get $acl_section use_proxy_list 1)\" = \"1\" ] && USE_DIRECT_LIST_ALL=1\n\t\t\t[ \"$(config_n_get $acl_section use_block_list 1)\" = \"1\" ] && USE_BLOCK_LIST_ALL=1\n\t\t}\n\t\tfor _node in $(config_n_get $acl_section tcp_node) $(config_n_get $acl_section udp_node); do\n\t\t\tlocal node_protocol=$(config_n_get $_node protocol)\n\t\t\t[ \"$node_protocol\" = \"_shunt\" ] && { USE_SHUNT_NODE=1; break; }\n\t\tdone\n\tdone\n\n\t#直连列表\n\t[ \"$USE_DIRECT_LIST_ALL\" = \"1\" ] && {\n\t\tcat $RULES_PATH/direct_ip | grep -v \"^#\" | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | insert_nftset $NFTSET_WHITE \"0\"\n\t\tcat $RULES_PATH/direct_ip | grep -v \"^#\" | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | insert_nftset $NFTSET_WHITE6 \"0\"\n\t\t[ \"$USE_GEOVIEW\" = \"1\" ] && {\n\t\t\tlocal GEOIP_CODE=$(cat $RULES_PATH/direct_ip | tr -s \"\\r\\n\" \"\\n\" | sed -e \"/^$/d\" | grep -E \"^geoip:\" | grep -v \"^geoip:private\" | sed -E 's/^geoip:(.*)/\\1/' | sed ':a;N;$!ba;s/\\n/,/g')\n\t\t\tif [ -n \"$GEOIP_CODE\" ]; then\n\t\t\t\tget_geoip $GEOIP_CODE ipv4 | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | insert_nftset $NFTSET_WHITE \"0\"\n\t\t\t\tget_geoip $GEOIP_CODE ipv6 | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | insert_nftset $NFTSET_WHITE6 \"0\"\n\t\t\t\techolog \"  - [$?]解析并加入[直连列表] GeoIP 到 NFTSET 完成\"\n\t\t\tfi\n\t\t}\n\t}\n\n\t#代理列表\n\t[ \"$USE_PROXY_LIST_ALL\" = \"1\" ] && {\n\t\tcat $RULES_PATH/proxy_ip | grep -v \"^#\" | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | insert_nftset $NFTSET_BLACK \"0\"\n\t\tcat $RULES_PATH/proxy_ip | grep -v \"^#\" | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | insert_nftset $NFTSET_BLACK6 \"0\"\n\t\t[ \"$USE_GEOVIEW\" = \"1\" ] && {\n\t\t\tlocal GEOIP_CODE=$(cat $RULES_PATH/proxy_ip | tr -s \"\\r\\n\" \"\\n\" | sed -e \"/^$/d\" | grep -E \"^geoip:\" | grep -v \"^geoip:private\" | sed -E 's/^geoip:(.*)/\\1/' | sed ':a;N;$!ba;s/\\n/,/g')\n\t\t\tif [ -n \"$GEOIP_CODE\" ]; then\n\t\t\t\tget_geoip $GEOIP_CODE ipv4 | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | insert_nftset $NFTSET_BLACK \"0\"\n\t\t\t\tget_geoip $GEOIP_CODE ipv6 | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | insert_nftset $NFTSET_BLACK6 \"0\"\n\t\t\t\techolog \"  - [$?]解析并加入[代理列表] GeoIP 到 NFTSET 完成\"\n\t\t\tfi\n\t\t}\n\t}\n\n\t#屏蔽列表\n\t[ \"$USE_BLOCK_LIST_ALL\" = \"1\" ] && {\n\t\tcat $RULES_PATH/block_ip | grep -v \"^#\" | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | insert_nftset $NFTSET_BLOCK \"0\"\n\t\tcat $RULES_PATH/block_ip | grep -v \"^#\" | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | insert_nftset $NFTSET_BLOCK6 \"0\"\n\t\t[ \"$USE_GEOVIEW\" = \"1\" ] && {\n\t\t\tlocal GEOIP_CODE=$(cat $RULES_PATH/block_ip | tr -s \"\\r\\n\" \"\\n\" | sed -e \"/^$/d\" | grep -E \"^geoip:\" | grep -v \"^geoip:private\" | sed -E 's/^geoip:(.*)/\\1/' | sed ':a;N;$!ba;s/\\n/,/g')\n\t\t\tif [ -n \"$GEOIP_CODE\" ]; then\n\t\t\t\tget_geoip $GEOIP_CODE ipv4 | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | insert_nftset $NFTSET_BLOCK \"0\"\n\t\t\t\tget_geoip $GEOIP_CODE ipv6 | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | insert_nftset $NFTSET_BLOCK6 \"0\"\n\t\t\t\techolog \"  - [$?]解析并加入[屏蔽列表] GeoIP 到 NFTSET 完成\"\n\t\t\tfi\n\t\t}\n\t}\n\n\t#分流列表\n\t[ \"$USE_SHUNT_NODE\" = \"1\" ] && {\n\t\tlocal GEOIP_CODE=\"\"\n\t\tlocal shunt_ids=$(uci show $CONFIG | grep \"=shunt_rules\" | awk -F '.' '{print $2}' | awk -F '=' '{print $1}')\n\t\tfor shunt_id in $shunt_ids; do\n\t\t\tconfig_n_get $shunt_id ip_list | grep -v \"^#\" | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | insert_nftset $NFTSET_SHUNT \"0\"\n\t\t\tconfig_n_get $shunt_id ip_list | grep -v \"^#\" | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | insert_nftset $NFTSET_SHUNT6 \"0\"\n\t\t\t[ \"$USE_GEOVIEW\" = \"1\" ] && {\n\t\t\t\tlocal geoip_code=$(config_n_get $shunt_id ip_list | tr -s \"\\r\\n\" \"\\n\" | sed -e \"/^$/d\" | grep -E \"^geoip:\" | grep -v \"^geoip:private\" | sed -E 's/^geoip:(.*)/\\1/' | sed ':a;N;$!ba;s/\\n/,/g')\n\t\t\t\t[ -n \"$geoip_code\" ] && GEOIP_CODE=\"${GEOIP_CODE:+$GEOIP_CODE,}$geoip_code\"\n\t\t\t}\n\t\tdone\n\t\tif [ -n \"$GEOIP_CODE\" ]; then\n\t\t\tget_geoip $GEOIP_CODE ipv4 | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | insert_nftset $NFTSET_SHUNT \"0\"\n\t\t\tget_geoip $GEOIP_CODE ipv6 | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | insert_nftset $NFTSET_SHUNT6 \"0\"\n\t\t\techolog \"  - [$?]解析并加入[分流节点] GeoIP 到 NFTSET 完成\"\n\t\tfi\n\t}\n\n\tget_local_ips ip4 | insert_nftset $NFTSET_LOCAL \"-1\"\n\tget_local_ips ip6 | insert_nftset $NFTSET_LOCAL6 \"-1\"\n\n\t# 忽略特殊IP段\n\tlocal lan_ifname lan_ip\n\tlan_ifname=$(uci -q -p /tmp/state get network.lan.ifname)\n\t[ -n \"$lan_ifname\" ] && {\n\t\tlan_ip=$(ip address show $lan_ifname | grep -w \"inet\" | awk '{print $2}')\n\t\tlan_ip6=$(ip address show $lan_ifname | grep -w \"inet6\" | awk '{print $2}')\n\t\t#echolog \"本机IPv4网段互访直连：${lan_ip}\"\n\t\t#echolog \"本机IPv6网段互访直连：${lan_ip6}\"\n\n\t\t[ -n \"$lan_ip\" ] && echo $lan_ip | insert_nftset $NFTSET_LAN \"-1\"\n\t\t[ -n \"$lan_ip6\" ] && echo $lan_ip6 | insert_nftset $NFTSET_LAN6 \"-1\"\n\t}\n\n\tupdate_wan_sets \"log\"\n\n\t[ -n \"$ISP_DNS\" ] && {\n\t\t#echolog \"处理 ISP DNS 例外...\"\n\t\techo \"$ISP_DNS\" | insert_nftset $NFTSET_WHITE 0\n\t\tfor ispip in $ISP_DNS; do\n\t\t\techolog \"  - [$?]追加ISP IPv4 DNS到白名单：${ispip}\"\n\t\tdone\n\t}\n\n\t[ -n \"$ISP_DNS6\" ] && {\n\t\t#echolog \"处理 ISP IPv6 DNS 例外...\"\n\t\techo $ISP_DNS6 | insert_nftset $NFTSET_WHITE6 0\n\t\tfor ispip6 in $ISP_DNS6; do\n\t\t\techolog \"  - [$?]追加ISP IPv6 DNS到白名单：${ispip6}\"\n\t\tdone\n\t}\n\n\t#  过滤所有节点IP\n\tfilter_vpsip > /dev/null 2>&1 &\n\t# filter_haproxy > /dev/null 2>&1 &\n\t# Prevent some conditions\n\tfilter_vps_addr $(config_n_get $TCP_NODE address) $(config_n_get $UDP_NODE address) > /dev/null 2>&1 &\n\tfilter_vps_addr $(config_n_get $TCP_NODE download_address) $(config_n_get $UDP_NODE download_address) > /dev/null 2>&1 &\n\n\taccept_icmp=$(config_t_get global_forwarding accept_icmp 0)\n\taccept_icmpv6=$(config_t_get global_forwarding accept_icmpv6 0)\n\n\tif [ \"${TCP_PROXY_WAY}\" = \"redirect\" ]; then\n\t\tunset is_tproxy\n\t\tnft_prerouting_chain=\"PSW_NAT\"\n\t\tnft_output_chain=\"PSW_OUTPUT_NAT\"\n\telif [ \"${TCP_PROXY_WAY}\" = \"tproxy\" ]; then\n\t\tis_tproxy=\"TPROXY\"\n\t\tnft_prerouting_chain=\"PSW_MANGLE\"\n\t\tnft_output_chain=\"PSW_OUTPUT_MANGLE\"\n\tfi\n\n\tnft \"add chain $NFTABLE_NAME PSW_DIVERT\"\n\tnft \"flush chain $NFTABLE_NAME PSW_DIVERT\"\n\t# Only TCP, UDP Invalid.\n\tnft \"add rule $NFTABLE_NAME PSW_DIVERT meta l4proto tcp socket transparent 1 mark set ${FWMARK} counter accept\"\n\n\tnft \"add chain $NFTABLE_NAME PSW_DNS\"\n\tnft \"flush chain $NFTABLE_NAME PSW_DNS\"\n\tif [ $(config_t_get global dns_redirect \"1\") = \"0\" ]; then\n\t\t#Only hijack when dest address is local IP\n\t\tnft \"insert rule $NFTABLE_NAME dstnat ip saddr @${NFTSET_LAN} ip daddr @${NFTSET_LOCAL} jump PSW_DNS\"\n\t\tnft \"insert rule $NFTABLE_NAME dstnat ip6 saddr @${NFTSET_LAN6} ip6 daddr @${NFTSET_LOCAL6} jump PSW_DNS\"\n\telse\n\t\tnft \"insert rule $NFTABLE_NAME dstnat ip saddr @${NFTSET_LAN} jump PSW_DNS\"\n\t\tnft \"insert rule $NFTABLE_NAME dstnat ip6 saddr @${NFTSET_LAN6} jump PSW_DNS\"\n\tfi\n\n\t# for ipv4 ipv6 tproxy mark\n\tnft \"add chain $NFTABLE_NAME PSW_RULE\"\n\tnft \"flush chain $NFTABLE_NAME PSW_RULE\"\n\tnft \"add rule $NFTABLE_NAME PSW_RULE counter meta mark set ct mark\"\n\tnft \"add rule $NFTABLE_NAME PSW_RULE meta mark ${FWMARK} counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW_RULE tcp flags & (fin|syn|rst|ack) == syn counter meta mark set ${FWMARK}\"\n\tnft \"add rule $NFTABLE_NAME PSW_RULE meta l4proto udp ct state { new, related } counter meta mark set ${FWMARK}\"\n\tnft \"add rule $NFTABLE_NAME PSW_RULE counter ct mark set mark\"\n\n\t#ipv4 tproxy mode and udp\n\tnft \"add chain $NFTABLE_NAME PSW_MANGLE\"\n\tnft \"flush chain $NFTABLE_NAME PSW_MANGLE\"\n\tnft \"add rule $NFTABLE_NAME PSW_MANGLE ip daddr @$NFTSET_LAN counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW_MANGLE ip daddr @$NFTSET_VPS counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW_MANGLE ct direction reply counter return\"\n\n\tnft \"add chain $NFTABLE_NAME PSW_OUTPUT_MANGLE\"\n\tnft \"flush chain $NFTABLE_NAME PSW_OUTPUT_MANGLE\"\n\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip daddr @$NFTSET_LAN counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip daddr @$NFTSET_VPS counter return\"\n\t[ \"${USE_BLOCK_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip daddr @$NFTSET_BLOCK counter drop\"\n\t[ \"${USE_DIRECT_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip daddr @$NFTSET_WHITE counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ct direction reply counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE meta mark 255 counter return\"\n\n\t# jump chains\n\tnft \"add rule $NFTABLE_NAME mangle_prerouting counter jump PSW_DIVERT\"\n\tnft \"add rule $NFTABLE_NAME mangle_prerouting ip protocol udp counter jump PSW_MANGLE\"\n\t[ -n \"${is_tproxy}\" ] && nft \"add rule $NFTABLE_NAME mangle_prerouting ip protocol tcp counter jump PSW_MANGLE\"\n\n\t#ipv4 tcp redirect mode\n\t[ -z \"${is_tproxy}\" ] && {\n\t\tnft \"add chain $NFTABLE_NAME PSW_NAT\"\n\t\tnft \"flush chain $NFTABLE_NAME PSW_NAT\"\n\t\tnft \"add rule $NFTABLE_NAME PSW_NAT ip daddr @$NFTSET_LAN counter return\"\n\t\tnft \"add rule $NFTABLE_NAME PSW_NAT ip daddr @$NFTSET_VPS counter return\"\n\t\tnft \"add rule $NFTABLE_NAME dstnat ip protocol tcp counter jump PSW_NAT\"\n\n\t\tnft \"add chain $NFTABLE_NAME PSW_OUTPUT_NAT\"\n\t\tnft \"flush chain $NFTABLE_NAME PSW_OUTPUT_NAT\"\n\t\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_NAT ip daddr @$NFTSET_LAN counter return\"\n\t\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_NAT ip daddr @$NFTSET_VPS counter return\"\n\t\t[ \"${USE_BLOCK_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_NAT ip daddr @$NFTSET_BLOCK counter drop\"\n\t\t[ \"${USE_DIRECT_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_NAT ip daddr @$NFTSET_WHITE counter return\"\n\t\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_NAT meta mark 255 counter return\"\n\t}\n\n\t#icmp ipv6-icmp redirect\n\tif [ \"$accept_icmp\" = \"1\" ]; then\n\t\tnft \"add chain $NFTABLE_NAME PSW_ICMP_REDIRECT\"\n\t\tnft \"flush chain $NFTABLE_NAME PSW_ICMP_REDIRECT\"\n\t\tnft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip daddr @$NFTSET_LAN counter return\"\n\t\tnft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip daddr @$NFTSET_VPS counter return\"\n\n\t\t[ \"$accept_icmpv6\" = \"1\" ] && {\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip6 daddr @$NFTSET_LAN6 counter return\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT ip6 daddr @$NFTSET_VPS6 counter return\"\n\t\t}\n\n\t\tnft \"add rule $NFTABLE_NAME dstnat meta l4proto {icmp,icmpv6} counter jump PSW_ICMP_REDIRECT\"\n\t\tnft \"add rule $NFTABLE_NAME nat_output meta l4proto {icmp,icmpv6} counter jump PSW_ICMP_REDIRECT\"\n\tfi\n\n\t#ipv4 wan_ip\n\t[ -z \"${is_tproxy}\" ] && nft \"add rule $NFTABLE_NAME PSW_NAT ip daddr @$NFTSET_WAN counter return comment \\\"WAN_IP_RETURN\\\"\"\n\tnft \"add rule $NFTABLE_NAME PSW_MANGLE ip daddr @$NFTSET_WAN counter return comment \\\"WAN_IP_RETURN\\\"\"\n\n\tip rule add fwmark ${FWMARK} table 999 priority 999\n\tip route add local 0.0.0.0/0 dev lo table 999\n\n\t#ipv6 tproxy mode and udp\n\tnft \"add chain $NFTABLE_NAME PSW_MANGLE_V6\"\n\tnft \"flush chain $NFTABLE_NAME PSW_MANGLE_V6\"\n\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 ip6 daddr @$NFTSET_LAN6 counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 ip6 daddr @$NFTSET_VPS6 counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 ct direction reply counter return\"\n\n\tnft \"add chain $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6\"\n\tnft \"flush chain $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6\"\n\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 ip6 daddr @$NFTSET_LAN6 counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 ip6 daddr @$NFTSET_VPS6 counter return\"\n\t[ \"${USE_BLOCK_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 ip6 daddr @$NFTSET_BLOCK6 counter drop\"\n\t[ \"${USE_DIRECT_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 ip6 daddr @$NFTSET_WHITE6 counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 ct direction reply counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta mark 255 counter return\"\n\n\t[ -n \"$IPT_APPEND_DNS\" ] && {\n\t\tlocal local_dns dns_address dns_port\n\t\tfor local_dns in $(echo $IPT_APPEND_DNS | tr ',' ' '); do\n\t\t\tdns_address=$(echo \"$local_dns\" | sed -E 's/(@|\\[)?([0-9a-fA-F:.]+)(@|#|$).*/\\2/')\n\t\t\tdns_port=$(echo \"$local_dns\" | sed -nE 's/.*#([0-9]+)$/\\1/p')\n\t\t\tif echo \"$dns_address\" | grep -q -v ':'; then\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr ${dns_address} $(factor ${dns_port:-53} \"udp dport\") counter return\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol tcp ip daddr ${dns_address} $(factor ${dns_port:-53} \"tcp dport\") counter return\"\n\t\t\t\techolog \"  - [$?]追加直连DNS到nftables：${dns_address}:${dns_port:-53}\"\n\t\t\telse\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto udp ip6 daddr ${dns_address} $(factor ${dns_port:-53} \"udp dport\") counter return\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto tcp ip6 daddr ${dns_address} $(factor ${dns_port:-53} \"tcp dport\") counter return\"\n\t\t\t\techolog \"  - [$?]追加直连DNS到nftables：[${dns_address}]:${dns_port:-53}\"\n\t\t\tfi\n\t\tdone\n\t}\n\n\t# jump chains\n\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\tnft \"add rule $NFTABLE_NAME mangle_prerouting meta nfproto {ipv6} counter jump PSW_MANGLE_V6\"\n\t\tnft \"add rule $NFTABLE_NAME mangle_output meta nfproto {ipv6} counter jump PSW_OUTPUT_MANGLE_V6 comment \\\"PSW_OUTPUT_MANGLE\\\"\"\n\n\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 ip6 daddr @$NFTSET_WAN6 counter return comment \\\"WAN6_IP_RETURN\\\"\"\n\n\t\tip -6 rule add fwmark ${FWMARK} table 999 priority 999\n\t\tip -6 route add local ::/0 dev lo table 999\n\t}\n\n\t[ \"$TCP_UDP\" = \"1\" ] && [ -z \"$UDP_NODE\" ] && UDP_NODE=$TCP_NODE\n\n\t[ \"$ENABLED_DEFAULT_ACL\" == 1 ] && {\n\t\tmsg=\"【路由器本机】，\"\n\t\t\n\t\t[ \"$TCP_NO_REDIR_PORTS\" != \"disable\" ] && {\n\t\t\tnft \"add rule $NFTABLE_NAME $nft_output_chain ip protocol tcp $(factor $TCP_NO_REDIR_PORTS \"tcp dport\") counter return\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto tcp $(factor $TCP_NO_REDIR_PORTS \"tcp dport\") counter return\"\n\t\t\tif ! has_1_65535 \"$TCP_NO_REDIR_PORTS\"; then\n\t\t\t\techolog \"  - ${msg}不代理 TCP 端口[${TCP_NO_REDIR_PORTS}]\"\n\t\t\telse\n\t\t\t\tunset LOCALHOST_TCP_PROXY_MODE\n\t\t\t\techolog \"  - ${msg}不代理所有 TCP 端口\"\n\t\t\tfi\n\t\t}\n\t\t\n\t\t[ \"$UDP_NO_REDIR_PORTS\" != \"disable\" ] && {\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp $(factor $UDP_NO_REDIR_PORTS \"udp dport\") counter return\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto udp $(factor $UDP_NO_REDIR_PORTS \"udp dport\") counter return\"\n\t\t\tif ! has_1_65535 \"$UDP_NO_REDIR_PORTS\"; then\n\t\t\t\techolog \"  - ${msg}不代理 UDP 端口[${UDP_NO_REDIR_PORTS}]\"\n\t\t\telse\n\t\t\t\tunset LOCALHOST_UDP_PROXY_MODE\n\t\t\t\techolog \"  - ${msg}不代理所有 UDP 端口\"\n\t\t\tfi\n\t\t}\n\n\t\tif ([ -n \"$TCP_NODE\" ] && [ -n \"${LOCALHOST_TCP_PROXY_MODE}\" ]) || ([ -n \"$UDP_NODE\" ] && [ -n \"${LOCALHOST_UDP_PROXY_MODE}\" ]); then\n\t\t\t[ -n \"$DNS_REDIRECT_PORT\" ] && {\n\t\t\t\tnft \"add rule $NFTABLE_NAME nat_output ip protocol udp oif lo udp dport 53 counter redirect to :$DNS_REDIRECT_PORT comment \\\"PSW_DNS\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME nat_output ip protocol tcp oif lo tcp dport 53 counter redirect to :$DNS_REDIRECT_PORT comment \\\"PSW_DNS\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME nat_output meta l4proto udp oif lo udp dport 53 counter redirect to :$DNS_REDIRECT_PORT comment \\\"PSW_DNS\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME nat_output meta l4proto tcp oif lo tcp dport 53 counter redirect to :$DNS_REDIRECT_PORT comment \\\"PSW_DNS\\\"\"\n\t\t\t}\n\t\tfi\n\n\t\t[ -n \"${LOCALHOST_TCP_PROXY_MODE}\" -o -n \"${LOCALHOST_UDP_PROXY_MODE}\" ] && {\n\t\t\t[ \"$TCP_PROXY_DROP_PORTS\" != \"disable\" ] && {\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft add rule $NFTABLE_NAME $nft_output_chain ip protocol tcp ip daddr $FAKE_IP $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") counter drop\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft add rule $NFTABLE_NAME $nft_output_chain ip protocol tcp ip daddr @$NFTSET_BLACK $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") counter drop\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft add rule $NFTABLE_NAME $nft_output_chain ip protocol tcp ip daddr @$NFTSET_GFW $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") counter drop\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft add rule $NFTABLE_NAME $nft_output_chain ip protocol tcp ip daddr @$NFTSET_CHN $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") $(get_jump_nft ${CHN_LIST} \"counter drop\")\n\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && nft add rule $NFTABLE_NAME $nft_output_chain ip protocol tcp ip daddr @$NFTSET_SHUNT $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") counter drop\n\t\t\t\t[ \"${LOCALHOST_TCP_PROXY_MODE}\" != \"disable\" ] && nft add rule $NFTABLE_NAME $nft_output_chain ip protocol tcp $(factor $TCP_PROXY_DROP_PORTS \"tcp dport\") counter drop\n\t\t\t\techolog \"  - ${msg}屏蔽代理 TCP 端口[${TCP_PROXY_DROP_PORTS}]\"\n\t\t\t}\n\t\t\t\n\t\t\t[ \"$UDP_PROXY_DROP_PORTS\" != \"disable\" ] && {\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr $FAKE_IP $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") counter drop\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr @$NFTSET_BLACK $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") counter drop\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr @$NFTSET_GFW $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") counter drop\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr @$NFTSET_CHN $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") $(get_jump_nft ${CHN_LIST} \"counter drop\")\n\t\t\t\t[ \"${USE_SHUNT_UDP}\" = \"1\" ] && nft add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr @$NFTSET_SHUNT $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") counter drop\n\t\t\t\t[ \"${LOCALHOST_UDP_PROXY_MODE}\" != \"disable\" ] && nft add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp $(factor $UDP_PROXY_DROP_PORTS \"udp dport\") counter drop\n\t\t\t\techolog \"  - ${msg}屏蔽代理 UDP 端口[${UDP_PROXY_DROP_PORTS}]\"\n\t\t\t}\n\t\t}\n\n\t\t# 加载路由器自身代理 TCP\n\t\tif [ -n \"$TCP_NODE\" ]; then\n\t\t\t_proxy_tcp_access() {\n\t\t\t\t[ -n \"${2}\" ] || return 0\n\t\t\t\tif echo \"${2}\" | grep -q -v ':'; then\n\t\t\t\t\tnft \"get element $NFTABLE_NAME $NFTSET_LAN {${2}}\" &>/dev/null\n\t\t\t\t\t[ $? -eq 0 ] && {\n\t\t\t\t\t\techolog \"  - 上游 DNS 服务器 ${2} 已在直接访问的列表中，不强制向 TCP 代理转发对该服务器 TCP/${3} 端口的访问\"\n\t\t\t\t\t\treturn 0\n\t\t\t\t\t}\n\t\t\t\t\tif [ -z \"${is_tproxy}\" ]; then\n\t\t\t\t\t\tnft insert rule $NFTABLE_NAME PSW_OUTPUT_NAT ip protocol tcp ip daddr ${2} tcp dport ${3} $(REDIRECT $TCP_REDIR_PORT)\n\t\t\t\t\telse\n\t\t\t\t\t\tnft insert rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol tcp ip daddr ${2} tcp dport ${3} counter jump PSW_RULE\n\t\t\t\t\t\tnft insert rule $NFTABLE_NAME PSW_MANGLE ip protocol tcp iif lo tcp dport ${3} ip daddr ${2} $(REDIRECT $TCP_REDIR_PORT TPROXY4) comment \\\"本机\\\"\n\t\t\t\t\tfi\n\t\t\t\t\techolog \"  - [$?]将上游 DNS 服务器 ${2}:${3} 加入到路由器自身代理的 TCP 转发链\"\n\t\t\t\telse\n\t\t\t\t\tnft \"get element $NFTABLE_NAME $NFTSET_LAN6 {${2}}\" &>/dev/null\n\t\t\t\t\t[ $? -eq 0 ] && {\n\t\t\t\t\t\techolog \"  - 上游 DNS 服务器 ${2} 已在直接访问的列表中，不强制向 TCP 代理转发对该服务器 TCP/${3} 端口的访问\"\n\t\t\t\t\t\treturn 0\n\t\t\t\t\t}\n\t\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto tcp ip6 daddr ${2} tcp dport ${3} counter jump PSW_RULE\"\n\t\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp iif lo tcp dport ${3} ip6 daddr ${2} $(REDIRECT $TCP_REDIR_PORT TPROXY6) comment \\\"本机\\\"\"\n\t\t\t\t\techolog \"  - [$?]将上游 DNS 服务器 [${2}]:${3} 加入到路由器自身代理的 TCP 转发链，请确保您的节点支持IPv6，并开启IPv6透明代理！\"\n\t\t\t\tfi\n\t\t\t}\n\t\t\t[ \"$TCP_PROXY_DNS\" == 1 ] && hosts_foreach REMOTE_DNS _proxy_tcp_access 53\n\n\t\t\t[ \"$accept_icmp\" = \"1\" ] && {\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo ip protocol icmp ip daddr $FAKE_IP counter redirect\"\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo ip protocol icmp ip daddr @$NFTSET_BLACK counter redirect\"\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo ip protocol icmp ip daddr @$NFTSET_GFW counter redirect\"\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo ip protocol icmp ip daddr @$NFTSET_CHN $(get_jump_nft ${CHN_LIST})\"\n\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo ip protocol icmp ip daddr @$NFTSET_SHUNT counter redirect\"\n\t\t\t\t[ -n \"${LOCALHOST_TCP_PROXY_MODE}\" ] && [ \"${LOCALHOST_TCP_PROXY_MODE}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo ip protocol icmp counter redirect\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo ip protocol icmp counter return\"\n\t\t\t}\n\n\t\t\t[ \"$accept_icmpv6\" = \"1\" ] && {\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo meta l4proto icmpv6 ip6 daddr $FAKE_IP_6 counter redirect\"\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo meta l4proto icmpv6 ip6 daddr @$NFTSET_BLACK6 counter redirect\"\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo meta l4proto icmpv6 ip6 daddr @$NFTSET_GFW6 counter redirect\"\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo meta l4proto icmpv6 ip6 daddr @$NFTSET_CHN6 $(get_jump_nft ${CHN_LIST})\"\n\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo meta l4proto icmpv6 ip6 daddr @$NFTSET_SHUNT6 counter redirect\"\n\t\t\t\t[ -n \"${LOCALHOST_TCP_PROXY_MODE}\" ] && [ \"${LOCALHOST_TCP_PROXY_MODE}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo meta l4proto icmpv6 counter redirect\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_ICMP_REDIRECT oif lo meta l4proto icmpv6 counter return\"\n\t\t\t}\n\n\t\t\tif [ -n \"${is_tproxy}\" ]; then\n\t\t\t\tnft_chain=\"PSW_OUTPUT_MANGLE\"\n\t\t\t\tnft_j=\"counter jump PSW_RULE\"\n\t\t\telse\n\t\t\t\tnft_chain=\"PSW_OUTPUT_NAT\"\n\t\t\t\tnft_j=\"$(REDIRECT $TCP_REDIR_PORT)\"\n\t\t\tfi\n\n\t\t\t[ -n \"${LOCALHOST_TCP_PROXY_MODE}\" ] && {\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp ip daddr $FAKE_IP ${nft_j}\"\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp ip daddr @$NFTSET_BLACK $(factor $TCP_REDIR_PORTS \"tcp dport\") ${nft_j}\"\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp ip daddr @$NFTSET_GFW $(factor $TCP_REDIR_PORTS \"tcp dport\") ${nft_j}\"\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp ip daddr @$NFTSET_CHN $(factor $TCP_REDIR_PORTS \"tcp dport\") $(get_jump_nft ${CHN_LIST} \"${nft_j}\")\"\n\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp ip daddr @$NFTSET_SHUNT $(factor $TCP_REDIR_PORTS \"tcp dport\") ${nft_j}\"\n\t\t\t\t[ \"${LOCALHOST_TCP_PROXY_MODE}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") ${nft_j}\"\n\t\t\t\t[ -n \"${is_tproxy}\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol tcp iif lo $(REDIRECT $TCP_REDIR_PORT TPROXY4) comment \\\"本机\\\"\"\n\t\t\t}\n\t\t\t[ -n \"${is_tproxy}\" ] && nft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol tcp iif lo counter return comment \\\"本机\\\"\"\n\t\t\t[ -n \"${is_tproxy}\" ] && nft \"add rule $NFTABLE_NAME mangle_output ip protocol tcp counter jump PSW_OUTPUT_MANGLE comment \\\"PSW_OUTPUT_MANGLE\\\"\"\n\t\t\t[ -z \"${is_tproxy}\" ] && nft \"add rule $NFTABLE_NAME nat_output ip protocol tcp counter jump PSW_OUTPUT_NAT\"\n\n\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t[ -n \"${LOCALHOST_TCP_PROXY_MODE}\" ] && {\n\t\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto tcp ip6 daddr $FAKE_IP_6 counter jump PSW_RULE\"\n\t\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto tcp ip6 daddr @$NFTSET_BLACK6 $(factor $TCP_REDIR_PORTS \"tcp dport\") counter jump PSW_RULE\"\n\t\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto tcp ip6 daddr @$NFTSET_GFW6 $(factor $TCP_REDIR_PORTS \"tcp dport\") counter jump PSW_RULE\"\n\t\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto tcp ip6 daddr @$NFTSET_CHN6 $(factor $TCP_REDIR_PORTS \"tcp dport\") $(get_jump_nft ${CHN_LIST} \"counter jump PSW_RULE\")\"\n\t\t\t\t\t[ \"${USE_SHUNT_TCP}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto tcp ip6 daddr @$NFTSET_SHUNT6 $(factor $TCP_REDIR_PORTS \"tcp dport\") counter jump PSW_RULE\"\n\t\t\t\t\t[ \"${LOCALHOST_TCP_PROXY_MODE}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") counter jump PSW_RULE\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp iif lo $(REDIRECT $TCP_REDIR_PORT TPROXY) comment \\\"本机\\\"\"\n\t\t\t\t}\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto tcp iif lo counter return comment \\\"本机\\\"\"\n\t\t\t}\n\t\tfi\n\n\t\t# 加载路由器自身代理 UDP\n\t\tif [ -n \"$UDP_NODE\" -o \"$TCP_UDP\" = \"1\" ]; then\n\t\t\t_proxy_udp_access() {\n\t\t\t\t[ -n \"${2}\" ] || return 0\n\t\t\t\tif echo \"${2}\" | grep -q -v ':'; then\n\t\t\t\t\tnft \"get element $NFTABLE_NAME $NFTSET_LAN {${2}}\" &>/dev/null\n\t\t\t\t\t[ $? == 0 ] && {\n\t\t\t\t\t\techolog \"  - 上游 DNS 服务器 ${2} 已在直接访问的列表中，不强制向 UDP 代理转发对该服务器 UDP/${3} 端口的访问\"\n\t\t\t\t\t\treturn 0\n\t\t\t\t\t}\n\t\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr ${2} udp dport ${3} counter jump PSW_RULE\"\n\t\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW_MANGLE ip protocol udp iif lo ip daddr ${2} $(REDIRECT $UDP_REDIR_PORT TPROXY4) comment \\\"本机\\\"\"\n\t\t\t\t\techolog \"  - [$?]将上游 DNS 服务器 ${2}:${3} 加入到路由器自身代理的 UDP 转发链\"\n\t\t\t\telse\n\t\t\t\t\tnft \"get element $NFTABLE_NAME $NFTSET_LAN6 {${2}}\" &>/dev/null\n\t\t\t\t\t[ $? == 0 ] && {\n\t\t\t\t\t\techolog \"  - 上游 DNS 服务器 ${2} 已在直接访问的列表中，不强制向 UDP 代理转发对该服务器 UDP/${3} 端口的访问\"\n\t\t\t\t\t\treturn 0\n\t\t\t\t\t}\n\t\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto udp ip6 daddr ${2} udp dport ${3} counter jump PSW_RULE\"\n\t\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp iif lo ip6 daddr ${2} $(REDIRECT $UDP_REDIR_PORT TPROXY6) comment \\\"本机\\\"\"\n\t\t\t\t\techolog \"  - [$?]将上游 DNS 服务器 [${2}]:${3} 加入到路由器自身代理的 UDP 转发链，请确保您的节点支持IPv6，并开启IPv6透明代理！\"\n\t\t\t\tfi\n\t\t\t}\n\t\t\t[ -n \"${UDP_PROXY_DNS}\" ] && hosts_foreach REMOTE_DNS _proxy_udp_access 53\n\t\t\t[ -n \"${LOCALHOST_UDP_PROXY_MODE}\" ] && {\n\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr $FAKE_IP counter jump PSW_RULE\"\n\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr @$NFTSET_BLACK $(factor $UDP_REDIR_PORTS \"udp dport\") counter jump PSW_RULE\"\n\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr @$NFTSET_GFW $(factor $UDP_REDIR_PORTS \"udp dport\") counter jump PSW_RULE\"\n\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr @$NFTSET_CHN $(factor $UDP_REDIR_PORTS \"udp dport\") $(get_jump_nft ${CHN_LIST} \"counter jump PSW_RULE\")\"\n\t\t\t\t[ \"${USE_SHUNT_UDP}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp ip daddr @$NFTSET_SHUNT $(factor $UDP_REDIR_PORTS \"udp dport\") counter jump PSW_RULE\"\n\t\t\t\t[ \"${LOCALHOST_UDP_PROXY_MODE}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE ip protocol udp $(factor $UDP_REDIR_PORTS \"udp dport\") counter jump PSW_RULE\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp iif lo $(REDIRECT $UDP_REDIR_PORT TPROXY4) comment \\\"本机\\\"\"\n\t\t\t}\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE ip protocol udp iif lo counter return comment \\\"本机\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME mangle_output ip protocol udp counter jump PSW_OUTPUT_MANGLE comment \\\"PSW_OUTPUT_MANGLE\\\"\"\n\n\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t[ -n \"${LOCALHOST_UDP_PROXY_MODE}\" ] && {\n\t\t\t\t\t[ \"${USE_FAKEDNS}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto udp ip6 daddr $FAKE_IP_6 counter jump PSW_RULE\"\n\t\t\t\t\t[ \"${USE_PROXY_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto udp ip6 daddr @$NFTSET_BLACK6 $(factor $UDP_REDIR_PORTS \"udp dport\") counter jump PSW_RULE\"\n\t\t\t\t\t[ \"${USE_GFW_LIST}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto udp ip6 daddr @$NFTSET_GFW6 $(factor $UDP_REDIR_PORTS \"udp dport\") counter jump PSW_RULE\"\n\t\t\t\t\t[ \"${CHN_LIST}\" != \"0\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto udp ip6 daddr @$NFTSET_CHN6 $(factor $UDP_REDIR_PORTS \"udp dport\") $(get_jump_nft ${CHN_LIST} \"counter jump PSW_RULE\")\"\n\t\t\t\t\t[ \"${USE_SHUNT_UDP}\" = \"1\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto udp ip6 daddr @$NFTSET_SHUNT6 $(factor $UDP_REDIR_PORTS \"udp dport\") counter jump PSW_RULE\"\n\t\t\t\t\t[ \"${LOCALHOST_UDP_PROXY_MODE}\" != \"disable\" ] && nft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 meta l4proto udp $(factor $UDP_REDIR_PORTS \"udp dport\") counter jump PSW_RULE\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp iif lo $(REDIRECT $UDP_REDIR_PORT TPROXY) comment \\\"本机\\\"\"\n\t\t\t\t}\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW_MANGLE_V6 meta l4proto udp iif lo counter return comment \\\"本机\\\"\"\n\t\t\t}\n\t\tfi\n\n\t\tnft \"add rule $NFTABLE_NAME mangle_output oif lo counter return comment \\\"PSW_OUTPUT_MANGLE\\\"\"\n\t\tnft \"add rule $NFTABLE_NAME mangle_output meta mark ${FWMARK} counter return comment \\\"PSW_OUTPUT_MANGLE\\\"\"\n\t}\n\n\t#  加载ACLS\n\tload_acl\n\n\t[ -d \"${TMP_IFACE_PATH}\" ] && {\n\t\tfor iface in $(ls ${TMP_IFACE_PATH}); do\n\t\t\tnft \"add rule $NFTABLE_NAME $nft_output_chain oif $iface counter return\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW_OUTPUT_MANGLE_V6 oif $iface counter return\"\n\t\tdone\n\t}\n\n\tfilter_direct_node_list > /dev/null 2>&1 &\n\n\techolog \"防火墙规则加载完成！\"\n}\n\ndel_firewall_rule() {\n\tfor nft in \"dstnat\" \"srcnat\" \"nat_output\" \"mangle_prerouting\" \"mangle_output\"; do\n        local handles=$(nft -a list chain $NFTABLE_NAME ${nft} 2>/dev/null | grep -E \"PSW_\" | awk -F '# handle ' '{print$2}')\n\t\tfor handle in $handles; do\n\t\t\tnft delete rule $NFTABLE_NAME ${nft} handle ${handle} 2>/dev/null\n\t\tdone\n\tdone\n\n\tfor handle in $(nft -a list chains | grep -E \"chain PSW_\" | grep -v \"PSW_RULE\" | awk -F '# handle ' '{print$2}'); do\n\t\tnft delete chain $NFTABLE_NAME handle ${handle} 2>/dev/null\n\tdone\n\n\t# Need to be removed at the end, otherwise it will show \"Resource busy\"\n\tnft delete chain $NFTABLE_NAME handle $(nft -a list chains | grep -E \"PSW_RULE\" | awk -F '# handle ' '{print$2}') 2>/dev/null\n\n\tip rule del fwmark ${FWMARK} 2>/dev/null\n\tip route del local 0.0.0.0/0 dev lo table 999 2>/dev/null\n\n\tip -6 rule del fwmark ${FWMARK} 2>/dev/null\n\tip -6 route del local ::/0 dev lo table 999 2>/dev/null\n\n\tdestroy_nftset $NFTSET_LOCAL\n\tdestroy_nftset $NFTSET_WAN\n\tdestroy_nftset $NFTSET_LAN\n\tdestroy_nftset $NFTSET_VPS\n\t#destroy_nftset $NFTSET_SHUNT\n\t#destroy_nftset $NFTSET_GFW\n\t#destroy_nftset $NFTSET_CHN\n\t#destroy_nftset $NFTSET_BLACK\n\tdestroy_nftset $NFTSET_BLOCK\n\tdestroy_nftset $NFTSET_WHITE\n\n\tdestroy_nftset $NFTSET_LOCAL6\n\tdestroy_nftset $NFTSET_WAN6\n\tdestroy_nftset $NFTSET_LAN6\n\tdestroy_nftset $NFTSET_VPS6\n\t#destroy_nftset $NFTSET_SHUNT6\n\t#destroy_nftset $NFTSET_GFW6\n\t#destroy_nftset $NFTSET_CHN6\n\t#destroy_nftset $NFTSET_BLACK6\n\tdestroy_nftset $NFTSET_BLOCK6\n\tdestroy_nftset $NFTSET_WHITE6\n\n\tdel_script_mwan3\n\n\techolog \"删除 nftables 规则完成。\"\n}\n\nflush_nftset() {\n\techolog \"清空 NFTSet。\"\n\tfor _name in $(nft -a list sets | grep -E \"passwall_\" | awk -F 'set ' '{print $2}' | awk '{print $1}'); do\n\t\tdestroy_nftset ${_name}\n\tdone\n}\n\nflush_table() {\n\tnft flush table $NFTABLE_NAME\n\tnft delete table $NFTABLE_NAME\n}\n\nflush_include() {\n\techo '#!/bin/sh' >$FWI\n}\n\ngen_include() {\n\tflush_include\n\tlocal nft_chain_file=$TMP_PATH/PSW_RULE.nft\n\techo '#!/bin/sh' > $nft_chain_file\n\tnft list table $NFTABLE_NAME >> $nft_chain_file\n\n\tlocal __nft=\" \"\n\t__nft=$(cat <<- EOF\n\n\t\t[ -z \"\\$(nft list chain $NFTABLE_NAME mangle_prerouting | grep PSW_DIVERT)\" ] && nft -f ${nft_chain_file}\n\n\t\t${MY_PATH} update_wan_sets\n\tEOF\n\t)\n\n\tcat <<-EOF >> $FWI\n\t${__nft}\n\n\treturn 0\n\tEOF\n\treturn 0\n}\n\nstart() {\n\t[ \"$ENABLED_DEFAULT_ACL\" == 0 -a \"$ENABLED_ACLS\" == 0 ] && return\n\tadd_firewall_rule\n\tgen_include\n}\n\nstop() {\n\t[ -z \"$(command -v echolog)\" ] && . \"$UTILS_PATH\"\n\tdel_firewall_rule\n\t[ $(config_t_get global flush_set_on_reboot \"0\") = \"1\" -o $(config_t_get global flush_set \"0\") = \"1\" ] && {\n\t\tuci -q delete ${CONFIG}.@global[0].flush_set\n\t\tuci -q commit ${CONFIG}\n\t\t#flush_table\n\t\tflush_nftset\n\t\trm -rf $TMP_PATH2/singbox*\n\t\trm -rf $TMP_PATH2/dnsmasq*\n\t\trm -rf $TMP_PATH2/geo_output\n\t}\n\tflush_include\n}\n\narg1=$1\nshift\ncase $arg1 in\ninsert_nftset)\n\tinsert_nftset \"$@\"\n\t;;\nfilter_direct_node_list)\n\tfilter_direct_node_list\n\t;;\nmwan3_start)\n\tmwan3_start\n\t;;\nmwan3_stop)\n\tmwan3_stop\n\t;;\nupdate_wan_sets)\n\tupdate_wan_sets \"$@\"\n\t;;\nstop)\n\tstop\n\t;;\nstart)\n\tstart\n\t;;\n*) ;;\nesac\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/rule_update.lua",
    "content": "#!/usr/bin/lua\n\nlocal api = require (\"luci.passwall.api\")\nlocal name = api.appname\nlocal uci = api.uci\nlocal sys = api.sys\nlocal jsonc = api.jsonc\nlocal fs = api.fs\n\nlocal arg1 = arg[1]\nlocal arg2 = arg[2]\nlocal arg3 = arg[3]\n\nlocal nftable_name = \"inet passwall\"\nlocal rule_path = \"/usr/share/\" .. name .. \"/rules\"\nlocal reboot = 0\nlocal gfwlist_update = \"0\"\nlocal chnroute_update = \"0\"\nlocal chnroute6_update = \"0\"\nlocal chnlist_update = \"0\"\nlocal geoip_update = \"0\"\nlocal geosite_update = \"0\"\n\nlocal excluded_domain = {\"apple.com\",\"sina.cn\",\"sina.com.cn\",\"baidu.com\",\"byr.cn\",\"jlike.com\",\"weibo.com\",\"zhongsou.com\",\"youdao.com\",\"sogou.com\",\"so.com\",\"soso.com\",\"aliyun.com\",\"taobao.com\",\"jd.com\",\"qq.com\",\"bing.com\"}\n\nlocal gfwlist_url = uci:get(name, \"@global_rules[0]\", \"gfwlist_url\") or {\"https://fastly.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/gfw.txt\"}\nlocal chnroute_url = uci:get(name, \"@global_rules[0]\", \"chnroute_url\") or {\"https://ispip.clang.cn/all_cn.txt\"}\nlocal chnroute6_url = uci:get(name, \"@global_rules[0]\", \"chnroute6_url\") or {\"https://ispip.clang.cn/all_cn_ipv6.txt\"}\nlocal chnlist_url = uci:get(name, \"@global_rules[0]\", \"chnlist_url\") or {\"https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/accelerated-domains.china.conf\",\"https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/apple.china.conf\",\"https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/google.china.conf\"}\nlocal geoip_url = uci:get(name, \"@global_rules[0]\", \"geoip_url\") or \"https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip.dat\"\nlocal geosite_url = uci:get(name, \"@global_rules[0]\", \"geosite_url\") or \"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat\"\nlocal asset_location = uci:get(name, \"@global_rules[0]\", \"v2ray_location_asset\") or \"/usr/share/v2ray/\"\nlocal geo2rule = uci:get(name, \"@global_rules[0]\", \"geo2rule\") or \"0\"\nlocal geoip_update_ok, geosite_update_ok = false, false\nasset_location = asset_location:match(\"/$\") and asset_location or (asset_location .. \"/\")\nlocal backup_path = \"/tmp/bak_v2ray/\"\nlocal rollback = false\n\nif arg3 == \"cron\" then\n\targ2 = nil\nelseif arg3 == \"rollback\" then\n\trollback, geoip_update_ok, geosite_update_ok = true, true, true\nend\n\nlocal log = function(...)\n\tif arg1 then\n\t\tif arg1 == \"log\" then\n\t\t\tapi.log(...)\n\t\telseif arg1 == \"print\" then\n\t\t\tlocal result = os.date(\"%Y-%m-%d %H:%M:%S: \") .. table.concat({...}, \" \")\n\t\t\tprint(result)\n\t\tend\n\tend\nend\n\n--gen cache for nftset from file\nlocal function gen_cache(set_name, ip_type, input_file, output_file)\n\tlocal tmp_set_name = set_name .. \"_tmp_\" .. os.time()\n\tlocal f_in = io.open(input_file, \"r\")\n\tif not f_in then return false end\n\tlocal nft_pipe = io.popen(\"nft -f -\", \"w\")\n\tif not nft_pipe then\n\t\tf_in:close()\n\t\treturn false\n\tend\n\tnft_pipe:write('#!/usr/sbin/nft -f\\n')\n\tnft_pipe:write(string.format('add table %s\\n', nftable_name))\n\tnft_pipe:write(string.format('add set %s %s { type %s; flags interval, timeout; timeout 2d; gc-interval 1h; auto-merge; }\\n', nftable_name, tmp_set_name, ip_type))\n\tnft_pipe:write(string.format('add element %s %s { ', nftable_name, tmp_set_name))\n\tlocal count = 0\n\tlocal batch_size = 500\n\tfor line in f_in:lines() do\n\t\tlocal ip = line:match(\"^%s*(.-)%s*$\")\n\t\tif ip and ip ~= \"\" then\n\t\t\tnft_pipe:write(ip, \"timeout 365d, \")\n\t\t\tcount = count + 1\n\t\t\tif count % batch_size == 0 then\n\t\t\t\tnft_pipe:write(\"}\\n\")\n\t\t\t\tnft_pipe:write(string.format('add element %s %s { ', nftable_name, tmp_set_name))\n\t\t\tend\n\t\tend\n\tend\n\tnft_pipe:write(\"}\\n\")\n\tf_in:close()\n\n\tlocal success = nft_pipe:close()\n\tif not (success == true or success == 0) then\n\t\tos.execute(string.format('nft delete set %s %s 2>/dev/null', nftable_name, tmp_set_name))\n\t\treturn false\n\tend\n\tos.execute(string.format('nft list set %s %s | sed \"s/%s/%s/g\" > %s', nftable_name, tmp_set_name, tmp_set_name, set_name, output_file))\n\tos.execute(string.format('nft delete set %s %s 2>/dev/null', nftable_name, tmp_set_name))\nend\n\n-- curl\nlocal function curl(url, file)\n\tlocal http_code = 0\n\tlocal header_str = \"\"\n\tlocal args = {\n\t\t\"-fskL\",\n\t\t\"--retry 3\",\n\t\t\"--connect-timeout 3\",\n\t\t\"--max-time 300\",\n\t\t\"--speed-limit 51200 --speed-time 15\",\n\t\t'-A \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36\"',\n\t\t\"--dump-header -\",\n\t\t\"-w '\\\\n%{http_code}'\"\n\t}\n\tif file then\n\t\targs[#args + 1] = \"-o \" .. file\n\tend\n\tlocal return_code, result = api.curl_auto(url, nil, args)\n\tif result and result ~= \"\" then\n\t\tlocal body, code = result:match(\"^(.-)%s*([0-9]+)$\")\n\t\tif code then\n\t\t\thttp_code = tonumber(code) or 0\n\t\t\theader_str = body\n\t\telse\n\t\t\thttp_code = tonumber(result:match(\"(%d+)%s*$\")) or 0\n\t\tend\n\tend\n\tif header_str ~= \"\" then\n\t\theader_str = header_str:gsub(\"\\r\", \"\")\n\tend\n\treturn return_code, http_code, header_str\nend\n\n--check excluded domain\nlocal excluded_map = {}\nfor _, d in ipairs(excluded_domain) do\n\texcluded_map[d] = true\nend\nlocal function check_excluded_domain(value)\n\tif not value or value == \"\" then return false end\n\tvalue = value:lower()\n\tlocal eq_pos = value:find(\"=\", 1, true)\n\tif eq_pos then\n\t\tvalue = value:sub(eq_pos + 1)\n\tend\n\tif value:sub(1,1) == \"/\" then\n\t\tvalue = value:sub(2)\n\tend\n\tlocal slash_pos = value:find(\"/\", 1, true)\n\tlocal colon_pos = value:find(\":\", 1, true)\n\tlocal cut_pos\n\tif slash_pos and colon_pos then\n\t\tcut_pos = (slash_pos < colon_pos) and slash_pos or colon_pos\n\telse\n\t\tcut_pos = slash_pos or colon_pos\n\tend\n\tif cut_pos then\n\t\tvalue = value:sub(1, cut_pos - 1)\n\tend\n\tvalue = value:gsub(\"^%.*\", \"\"):gsub(\"%.*$\", \"\")\n\twhile value do\n\t\tif excluded_map[value] then\n\t\t\treturn true\n\t\tend\n\t\tlocal dot_pos = value:find(\".\", 1, true)\n\t\tif not dot_pos then\n\t\t\tbreak\n\t\tend\n\t\tvalue = value:sub(dot_pos + 1)\n\tend\n\treturn false\nend\n\n-- 替代 string.find 查找 \"^[#!\\\\[@]+\"\nlocal function is_comment_line(s)\n\tif not s or s == \"\" then return false end\n\tlocal b = s:byte(1)\n\t-- '#' = 35, '!' = 33, '\\' = 92, '[' = 91, '@' = 64\n\tif b == 35 or b == 33 or b == 92 or b == 91 or b == 64 then\n\t\treturn true\n\tend\n\treturn false\nend\n\n-- IPv4 检测，替代 string.find \"^%d+%.%d+%.%d+%.%d+\"\n-- IPv4 cidr检测，替代 string.find \"^%d+%.%d+%.%d+%.%d+[%/][%d]+$\"\nlocal function is_ipv4(s, check_cidr)\n\tlocal dot = 0\n\tlocal seg_start = 1\n\tlocal len = #s\n\tlocal mask_start = nil\n\tlocal i = 1\n\twhile i <= len do\n\t\tlocal b = s:byte(i)\n\t\tif b >= 48 and b <= 57 then\n\t\t\t-- 数字，继续\n\t\telseif b == 46 then  -- \".\"\n\t\t\tdot = dot + 1\n\t\t\tif dot > 3 or i == seg_start then return false end\n\t\t\tlocal seg = tonumber(s:sub(seg_start, i - 1))\n\t\t\tif not seg or seg > 255 then return false end\n\t\t\tseg_start = i + 1\n\t\telseif b == 47 then  -- \"/\"\n\t\t\tif not check_cidr then return false end\n\t\t\tif dot ~= 3 or i == seg_start then return false end\n\t\t\tlocal seg = tonumber(s:sub(seg_start, i - 1))\n\t\t\tif not seg or seg > 255 then return false end\n\t\t\tmask_start = i + 1\n\t\t\tbreak\n\t\telse\n\t\t\treturn false\n\t\tend\n\t\ti = i + 1\n\tend\n\t-- 如果没有 CIDR，则检查最后一段即可\n\tif not check_cidr or not mask_start then\n\t\tif dot ~= 3 or seg_start > len then return false end\n\t\tlocal seg = tonumber(s:sub(seg_start))\n\t\treturn seg and seg <= 255 or false\n\tend\n\t-- CIDR 掩码检查\n\tif mask_start > len then return false end\n\tlocal mask = tonumber(s:sub(mask_start))\n\treturn mask and mask >= 0 and mask <= 32 or false\nend\n\nlocal function is_ipv4_cidr(s)\n\treturn is_ipv4(s, true)\nend\n\nlocal function is_ipv6(s, check_cidr)\n\tlocal first = s:byte(1)\n\tlocal last = s:byte(#s)\n\tif first == 91 and last == 93 then  -- \"[\" and \"]\"\n\t\ts = s:sub(2, -2)\n\tend\n\tlocal len = #s\n\tlocal i = 1\n\tlocal seg_len = 0\n\tlocal segs = 0\n\tlocal saw_dc = false  -- 是否出现 \"::\"\n\tlocal b\n\twhile i <= len do\n\t\tb = s:byte(i)\n\t\t-- CIDR 部分\n\t\tif b == 47 then  -- '/'\n\t\t\tif not check_cidr then\n\t\t\t\treturn false\n\t\t\tend\n\t\t\t-- 处理 \"/\" 之前的段\n\t\t\tif seg_len > 0 then segs = segs + 1 end\n\t\t\tif (not saw_dc and segs ~= 8) or (saw_dc and segs > 8) then return false end\n\t\t\t-- 解析掩码\n\t\t\ti = i + 1\n\t\t\tif i > len then return false end\n\t\t\tlocal mask = 0\n\t\t\twhile i <= len do\n\t\t\t\tb = s:byte(i)\n\t\t\t\tif b < 48 or b > 57 then return false end\n\t\t\t\tmask = mask * 10 + (b - 48)\n\t\t\t\tif mask > 128 then return false end\n\t\t\t\ti = i + 1\n\t\t\tend\n\t\t\t-- CIDR 解析成功\n\t\t\treturn true\n\t\tend\n\t\t-- 冒号处理（: 或 ::）\n\t\tif b == 58 then\n\t\t\tlocal nextb = (i+1 <= len) and s:byte(i+1) or 0\n\t\t\t-- \"::\"\n\t\t\tif nextb == 58 then\n\t\t\t\tif saw_dc then return false end\n\t\t\t\tsaw_dc = true\n\t\t\t\tif seg_len > 0 then segs = segs + 1 end\n\t\t\t\tseg_len = 0\n\t\t\t\ti = i + 2\n\t\t\telse\n\t\t\t\t-- 普通 \":\"\n\t\t\t\tif seg_len == 0 then return false end\n\t\t\t\tsegs = segs + 1\n\t\t\t\tseg_len = 0\n\t\t\t\ti = i + 1\n\t\t\tend\n\t\telse\n\t\t\t-- hex 数字\n\t\t\tlocal is_hex =\n\t\t\t\t(b >= 48 and b <= 57) or   -- 0-9\n\t\t\t\t(b >= 65 and b <= 70) or   -- A-F\n\t\t\t\t(b >= 97 and b <= 102)     -- a-f\n\t\t\tif not is_hex then return false end\n\t\t\tseg_len = seg_len + 1\n\t\t\tif seg_len > 4 then return false end\n\t\t\ti = i + 1\n\t\tend\n\tend\n\tif seg_len > 0 then segs = segs + 1 end\n\tif not saw_dc then return segs == 8 end\n\treturn segs <= 8\nend\n\n-- IPv6 cidr检测，替代 string.find \":-[%x]+%:+[%x]-[%/][%d]+$\"\nlocal function is_ipv6_cidr(s)\n\treturn is_ipv6(s, true)\nend\n\n-- 检测是否含有冒号，替代 string.find(line, \":\")\nlocal function has_colon(s)\n\tfor i = 1, #s do\n\t\tif s:byte(i) == 58 then  -- ':'\n\t\t\treturn true\n\t\tend\n\tend\n\treturn false\nend\n\n-- 域名提取，替代 string.match \"([%w%-]+%.[%w%.%-]+)[%/%*]*\"\nlocal function extract_domain(s)\n\tif not s or s == \"\" then return nil end\n\tlocal len = #s\n\tlocal start = nil\n\tlocal last_dot = nil\n\tfor i = 1, len do\n\t\tlocal b = s:byte(i)\n\t\t-- 允许的域名字符：a-zA-Z0-9.- \n\t\tif (b >= 48 and b <= 57) or (b >= 65 and b <= 90) or (b >= 97 and b <= 122) or b == 45 or b == 46 then\n\t\t\tif not start then start = i end\n\t\t\tif b == 46 then last_dot = i end\n\t\telse\n\t\t\tif start then\n\t\t\t\tif last_dot and last_dot > start then\n\t\t\t\t\tlocal domain = s:sub(start, i - 1)\n\t\t\t\t\twhile domain:byte(1) == 46 do\n\t\t\t\t\t\tdomain = domain:sub(2)\n\t\t\t\t\tend\n\t\t\t\t\treturn domain\n\t\t\t\telse\n\t\t\t\t\tstart = nil\n\t\t\t\t\tlast_dot = nil\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\tif start and last_dot and last_dot > start then\n\t\tlocal domain = s:sub(start)\n\t\twhile domain:byte(1) == 46 do\n\t\t\tdomain = domain:sub(2)\n\t\tend\n\t\treturn domain\n\tend\n\treturn nil\nend\n\nlocal function non_file_check(file_path, header_content)\n\tlocal remote_file_size = nil\n\tlocal local_file_size = tonumber(fs.stat(file_path, \"size\") or 0)\n\tif local_file_size == 0 then\n\t\tlog(\"下载文件为空或读取出错。\")\n\t\treturn true\n\tend\n\tif header_content and header_content ~= \"\" then\n\t\tfor size in header_content:gmatch(\"[Cc]ontent%-[Ll]ength:%s*(%d+)\") do\n\t\t\tlocal s = tonumber(size)\n\t\t\tif s and s > 0 then\n\t\t\t\tremote_file_size = s\n\t\t\tend\n\t\tend\n\tend\n\tif remote_file_size and remote_file_size ~= local_file_size then\n\t\tlog(string.format(\"校验出错：远程 %dB, 下载 %dB\", remote_file_size, local_file_size))\n\t\treturn true\n\tend\n\treturn false\nend\n\nlocal function GeoToRule(rule_name, rule_type, out_path)\n\tlocal bin = api.finded_com(\"geoview\")\n\tif not (bin and api.compare_versions(api.get_app_version(\"geoview\"), \">=\", \"0.1.10\")) then\n\t\tlog(\"[警告] Geoview 组件缺失或版本过低，规则生成流程已被跳过。\")\n\t\treturn false\n\tend\n\tlocal geosite_path = asset_location .. \"geosite.dat\"\n\tlocal geoip_path = asset_location .. \"geoip.dat\"\n\tlocal file_path = (rule_type == \"domain\") and geosite_path or geoip_path\n\tlocal geo_arg\n\tif rule_type == \"domain\" then\n\t\tif rule_name == \"gfwlist\" then\n\t\t\tgeo_arg = \"-type geosite -list gfw\"\n\t\telse\n\t\t\tgeo_arg = \"-type geosite -list cn\"\n\t\tend\n\telseif rule_type == \"ip4\" then\n\t\tgeo_arg = \"-type geoip -list cn -ipv6=false\"\n\telseif rule_type == \"ip6\" then\n\t\tgeo_arg = \"-type geoip -list cn -ipv4=false\"\n\tend\n\tlocal cmd = string.format(bin .. \" -input '%s' %s -lowmem=true -output '%s'\", file_path, geo_arg, out_path)\n\tsys.exec(cmd)\n\tlocal local_file_size = tonumber(fs.stat(out_path, \"size\") or 0)\n\tif local_file_size == 0 then\n\t\tos.remove(out_path)\n\t\tlog(rule_name .. \" 生成失败，请确保 Geo 文件正确且包含目标规则。\")\n\t\treturn false\n\tend\n\treturn true\nend\n\n--fetch rule\nlocal function fetch_rule(rule_name, rule_type, url, exclude_domain, max_retries)\n\tlocal sret = 0\n\tlocal max_attempts = max_retries or 2\n\tlocal rule_dataset = {}\n\tlocal file_tmp = \"/tmp/\" .. rule_name .. \"_tmp\"\n\tlocal rule_final_path = rule_path .. \"/\" .. rule_name\n\tif geo2rule == \"1\" then\n\t\turl = {\"geo2rule\"}\n\t\tlog(rule_name.. \" 开始生成...\")\n\telse\n\t\tlog(rule_name.. \" 开始更新...\")\n\tend\n\n\tfor k, v in ipairs(url) do\n\t\tlocal current_file = \"/tmp/\" .. rule_name .. \"_dl\" .. k\n\t\tlocal success = false\n\n\t\tif v ~= \"geo2rule\" then\n\t\t\tfor i = 1, max_attempts do\n\t\t\t\tlocal return_code, http_code, header = curl(v, current_file)\n\t\t\t\tif return_code == 0 and not non_file_check(current_file, header) then\n\t\t\t\t\tsuccess = true\n\t\t\t\t\tbreak\n\t\t\t\tend\n\t\t\t\tos.remove(current_file)\n\t\t\t\tlog(string.format(\"%s 第%d条规则下载失败 (HTTP:%s)，正在进行第%d次尝试...\", rule_name, k, tostring(http_code), i))\n\t\t\tend\n\t\telse\n\t\t\tif not GeoToRule(rule_name, rule_type, current_file) then return 1 end\n\t\t\tsuccess = true\n\t\tend\n\n\t\tif success then\n\t\t\tlocal f = io.open(current_file, \"r\")\n\t\t\tif f then\n\t\t\t\tif rule_name == \"gfwlist\" and geo2rule == \"0\" then\n\t\t\t\t\tlocal decode = api.base64Decode(f:read(\"*all\"))\n\t\t\t\t\tfor line in string.gmatch(decode, \"[^\\r\\n]+\") do\n\t\t\t\t\t\tline = line:gsub(\"full:\", \"\")\n\t\t\t\t\t\tif not (is_comment_line(line) or is_ipv4(line) or has_colon(line) or (exclude_domain and check_excluded_domain(line))) then\n\t\t\t\t\t\t\tlocal match = extract_domain(line)\n\t\t\t\t\t\t\tif match and not is_ipv4(match) then\n\t\t\t\t\t\t\t\trule_dataset[match] = true\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tfor line in f:lines() do\n\t\t\t\t\t\tif rule_type == \"domain\" then\n\t\t\t\t\t\t\tline = line:gsub(\"full:\", \"\")\n\t\t\t\t\t\t\tif not (is_comment_line(line) or is_ipv4(line) or has_colon(line) or (exclude_domain and check_excluded_domain(line))) then\n\t\t\t\t\t\t\t\tlocal match = extract_domain(line)\n\t\t\t\t\t\t\t\tif match and not is_ipv4(match) then\n\t\t\t\t\t\t\t\t\trule_dataset[match] = true\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\telseif rule_type == \"ip4\" then\n\t\t\t\t\t\t\tlocal function is_0dot(s) -- \"^0%..*\"\n\t\t\t\t\t\t\t\treturn s and s:byte(1)==48 and s:byte(2)==46\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tif is_ipv4_cidr(line) and not is_0dot(line) then\n\t\t\t\t\t\t\t\trule_dataset[line] = true\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\telseif rule_type == \"ip6\" then\n\t\t\t\t\t\t\tlocal function is_double_colon_cidr(s) -- \"^::(/%d+)?$\"\n\t\t\t\t\t\t\tif not s or s:byte(1)~=58 or s:byte(2)~=58 then return false end\n\t\t\t\t\t\t\t\tlocal l = #s\n\t\t\t\t\t\t\t\tif l==2 then return true end\n\t\t\t\t\t\t\t\tif l==3 or s:byte(3)~=47 then return false end\n\t\t\t\t\t\t\t\tfor i=4,l do\n\t\t\t\t\t\t\t\t\tlocal b=s:byte(i)\n\t\t\t\t\t\t\t\t\tif b<48 or b>57 then return false end\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\treturn true\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tif is_ipv6_cidr(line) and not is_double_colon_cidr(line) then\n\t\t\t\t\t\t\t\trule_dataset[line] = true\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tf:close()\n\t\t\tend\n\t\telse\n\t\t\tsret = 1\n\t\t\tlog(string.format(\"%s 第%d条规则: %s 下载失败！\", rule_name, k, v))\n\t\tend\n\t\tos.remove(current_file)\n\tend\n\n\tif sret == 0 then\n\t\tlocal result_list = {}\n\t\tfor line, _ in pairs(rule_dataset) do table.insert(result_list, line) end\n\t\ttable.sort(result_list)\n\n\t\tlocal out = io.open(file_tmp, \"w\")\n\t\tif out then\n\t\t\tfor _, line in ipairs(result_list) do out:write(line .. \"\\n\") end\n\t\t\tout:close()\n\t\tend\n\n\t\tlocal old_md5 = sys.exec(string.format(\"md5sum %s 2>/dev/null | awk '{print $1}'\", rule_final_path)):gsub(\"\\n\", \"\")\n\t\tlocal new_md5 = sys.exec(string.format(\"md5sum %s 2>/dev/null | awk '{print $1}'\", file_tmp)):gsub(\"\\n\", \"\")\n\n\t\tif old_md5 ~= new_md5 then\n\t\t\tif api.is_finded(\"fw4\") and (rule_type == \"ip4\" or rule_type == \"ip6\") then\n\t\t\t\tlocal nft_file = file_tmp .. \".nft\"\n\t\t\t\tlocal set_name = \"passwall_\" .. rule_name\n\t\t\t\tif rule_name == \"chnroute\" then set_name = \"passwall_chn\"\n\t\t\t\telseif rule_name == \"chnroute6\" then set_name = \"passwall_chn6\" end\n                \n\t\t\t\tlocal addr_type = (rule_type == \"ip4\") and \"ipv4_addr\" or \"ipv6_addr\"\n\t\t\t\tgen_cache(set_name, addr_type, file_tmp, nft_file)\n\t\t\t\tos.execute(string.format(\"mv -f %s %s.nft\", nft_file, rule_final_path))\n\t\t\tend\n\t\t\tos.execute(string.format(\"mv -f %s %s\", file_tmp, rule_final_path))\n\t\t\tif not rollback then reboot = 1 end\n\t\t\tlog(string.format(\"%s 更新成功，总规则数 %d 条。\", rule_name, #result_list))\n\t\telse\n\t\t\tlog(rule_name .. \" 版本一致，无需更新。\")\n\t\t\tos.remove(file_tmp)\n\t\tend\n\telse\n\t\tlog(rule_name .. \" 更新失败（部分或全部资源无法下载）。\")\n\t\tos.remove(file_tmp)\n\tend\n\treturn 0\nend\n\nlocal function fetch_geofile(geo_name, geo_type, url)\n\tlocal tmp_path = \"/tmp/\" .. geo_name\n\tlocal asset_path = asset_location .. geo_name\n\tlocal down_filename = url:match(\"^.*/([^/?#]+)\")\n\tlocal sha_url = url:gsub(down_filename, down_filename .. \".sha256sum\")\n\tlocal sha_path = tmp_path .. \".sha256sum\"\n\n\tlocal function verify_sha256(sha_file)\n\t\treturn sys.call(\"sha256sum -c \" .. sha_file .. \" > /dev/null 2>&1\") == 0\n\tend\n\n\tlocal sha_verify = select(1, curl(sha_url, sha_path)) == 0\n\tif sha_verify then\n\t\tlocal f = io.open(sha_path, \"r\")\n\t\tif f then\n\t\t\tlocal content = f:read(\"*l\")\n\t\t\tf:close()\n\t\t\tif content then\n\t\t\t\tcontent = content:gsub(\"(%x+)%s+.+\", \"%1  \" .. tmp_path)\n\t\t\t\tf = io.open(sha_path, \"w\")\n\t\t\t\tif f then\n\t\t\t\t\tf:write(content)\n\t\t\t\t\tf:close()\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif fs.access(asset_path) then\n\t\t\tsys.call(string.format(\"cp -f %s %s\", asset_path, tmp_path))\n\t\t\tif verify_sha256(sha_path) then\n\t\t\t\tlog(geo_type .. \" 版本一致，无需更新。\")\n\t\t\t\treturn 0\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal sret_tmp, _, header = curl(url, tmp_path)\n\tif sret_tmp == 0 and non_file_check(tmp_path, header) then\n\t\tlog(geo_type .. \" 下载文件过程出错，尝试重新下载。\")\n\t\tos.remove(tmp_path)\n\t\tsret_tmp, _, header= curl(url, tmp_path)\n\t\tif sret_tmp == 0 and non_file_check(tmp_path, header) then\n\t\t\tsret_tmp = 1\n\t\t\tlog(geo_type .. \" 下载文件过程出错，请检查网络或下载链接后重试！\")\n\t\tend\n\tend\n\tif sret_tmp == 0 then\n\t\tif sha_verify then\n\t\t\tif verify_sha256(sha_path) then\n\t\t\t\tsys.call(string.format(\"mkdir -p %s && mv -f %s %s\", backup_path, asset_path, backup_path))\n\t\t\t\tsys.call(string.format(\"mkdir -p %s && mv -f %s %s\", asset_location, tmp_path, asset_path))\n\t\t\t\treboot = 1\n\t\t\t\tlog(geo_type .. \" 更新成功。\")\n\t\t\t\tif geo_type == \"geoip\" then\n\t\t\t\t\tgeoip_update_ok = true\n\t\t\t\telse\n\t\t\t\t\tgeosite_update_ok = true\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tlog(geo_type .. \" 更新失败，请稍后重试或更换更新URL。\")\n\t\t\t\treturn 1\n\t\t\tend\n\t\telse\n\t\t\tif fs.access(asset_path) and sys.call(string.format(\"cmp -s %s %s\", tmp_path, asset_path)) == 0 then\n\t\t\t\tlog(geo_type .. \" 版本一致，无需更新。\")\n\t\t\t\treturn 0\n\t\t\tend\n\t\t\tsys.call(string.format(\"mkdir -p %s && mv -f %s %s\", backup_path, asset_path, backup_path))\n\t\t\tsys.call(string.format(\"mkdir -p %s && mv -f %s %s\", asset_location, tmp_path, asset_path))\n\t\t\treboot = 1\n\t\t\tlog(geo_type .. \" 更新成功。\")\n\t\t\tif geo_type == \"geoip\" then\n\t\t\t\tgeoip_update_ok = true\n\t\t\telse\n\t\t\t\tgeosite_update_ok = true\n\t\t\tend\n\t\tend\n\telse\n\t\tlog(geo_type .. \" 更新失败，请稍后重试或更换更新URL。\")\n\t\treturn 1\n\tend\n\treturn 0\nend\n\nlocal function fetch_gfwlist()\n\tfetch_rule(\"gfwlist\",\"domain\",gfwlist_url,true)\nend\n\nlocal function fetch_chnroute()\n\tfetch_rule(\"chnroute\",\"ip4\",chnroute_url,false)\nend\n\nlocal function fetch_chnroute6()\n\tfetch_rule(\"chnroute6\",\"ip6\",chnroute6_url,false)\nend\n\nlocal function fetch_chnlist()\n\tfetch_rule(\"chnlist\",\"domain\",chnlist_url,false)\nend\n\nlocal function fetch_geoip()\n\tfetch_geofile(\"geoip.dat\",\"geoip\",geoip_url)\nend\n\nlocal function fetch_geosite()\n\tfetch_geofile(\"geosite.dat\",\"geosite\",geosite_url)\nend\n\nif arg2 then\n\tstring.gsub(arg2, '[^' .. \",\" .. ']+', function(w)\n\t\tif w == \"gfwlist\" then\n\t\t\tgfwlist_update = \"1\"\n\t\tend\n\t\tif w == \"chnroute\" then\n\t\t\tchnroute_update = \"1\"\n\t\tend\n\t\tif w == \"chnroute6\" then\n\t\t\tchnroute6_update = \"1\"\n\t\tend\n\t\tif w == \"chnlist\" then\n\t\t\tchnlist_update = \"1\"\n\t\tend\n\t\tif w == \"geoip\" then\n\t\t\tgeoip_update = \"1\"\n\t\tend\n\t\tif w == \"geosite\" then\n\t\t\tgeosite_update = \"1\"\n\t\tend\n\tend)\n\tif rollback then arg2 = nil end\nelse\n\tgfwlist_update = uci:get(name, \"@global_rules[0]\", \"gfwlist_update\") or \"1\"\n\tchnroute_update = uci:get(name, \"@global_rules[0]\", \"chnroute_update\") or \"1\"\n\tchnroute6_update = uci:get(name, \"@global_rules[0]\", \"chnroute6_update\") or \"1\"\n\tchnlist_update = uci:get(name, \"@global_rules[0]\", \"chnlist_update\") or \"1\"\n\tgeoip_update = uci:get(name, \"@global_rules[0]\", \"geoip_update\") or \"1\"\n\tgeosite_update = uci:get(name, \"@global_rules[0]\", \"geosite_update\") or \"1\"\nend\nif geo2rule ~= \"1\" and gfwlist_update == \"0\" and chnroute_update == \"0\" and chnroute6_update == \"0\" and chnlist_update == \"0\" and geoip_update == \"0\" and geosite_update == \"0\" then\n\tos.exit(0)\nend\n\nlocal function check_instance(action)\n\tlocal rule_lock = \"/var/lock/\" .. name .. \"_rule_update.lock\"\n\tlocal sub_lock = \"/var/lock/\" .. name .. \"_subscribe.lock\"\n\n\tif action == \"start\" then\n\t\tmath.randomseed(os.time() + math.floor(os.clock() * 1000))\n\t\tapi.nixio.nanosleep(0, math.random(100, 1000) * 1000000)\n\t\tif fs.access(rule_lock) then\n\t\t\tlog(\"有[规则更新]实例正在运行，请稍后再试...\\n\")\n\t\t\tos.exit(0)\n\t\telse\n\t\t\tluci.sys.call(\"touch \" .. rule_lock)\n\t\tend\n\telseif action == \"end\" then\n\t\tluci.sys.call(\"rm -f \" .. rule_lock)\n\t\treturn\n\tend\n\n\tif fs.access(sub_lock) then\n\t\tlog(\"[订阅]实例正在运行，[规则更新]进入队列等待...\\n\")\n\tend\n\twhile fs.access(sub_lock) do\n\t\tapi.nixio.nanosleep(2, 0)\n\tend\nend\n\ncheck_instance(\"start\")\n\nlog(\"开始更新规则...\")\nlocal function safe_call(func, err_msg)\n\txpcall(func, function(e)\n\t\tlog(e)\n\t\tlog(debug.traceback())\n\t\tlog(err_msg)\n\tend)\nend\n\nlocal function remove_tmp_geofile(name)\n\tos.remove(\"/tmp/\" .. name .. \".dat\")\n\tos.remove(\"/tmp/\" .. name .. \".dat.sha256sum\")\nend\n\nif geo2rule == \"1\" then\n\tif geoip_update == \"1\" and not rollback then\n\t\tlog(\"geoip 开始更新...\")\n\t\tsafe_call(fetch_geoip, \"更新geoip发生错误...\")\n\t\tremove_tmp_geofile(\"geoip\")\n\tend\n\n\tif geosite_update == \"1\" and not rollback then\n\t\tlog(\"geosite 开始更新...\")\n\t\tsafe_call(fetch_geosite, \"更新geosite发生错误...\")\n\t\tremove_tmp_geofile(\"geosite\")\n\tend\n\n\t-- 如果是手动更新(arg2存在)始终生成规则\n\tif arg2 then geoip_update_ok, geosite_update_ok = true, true end\n\tchnroute_update, chnroute6_update, gfwlist_update, chnlist_update = \"1\", \"1\", \"1\", \"1\"\n\n\tif geoip_update_ok then\n\t\tif fs.access(asset_location .. \"geoip.dat\") then\n\t\t\tsafe_call(fetch_chnroute, \"生成chnroute发生错误...\")\n\t\t\tsafe_call(fetch_chnroute6, \"生成chnroute6发生错误...\")\n\t\telse\n\t\t\tlog(\"geoip.dat 文件不存在,跳过规则生成。\")\n\t\tend\n\tend\n\n\tif geosite_update_ok then\n\t\tif fs.access(asset_location .. \"geosite.dat\") then\n\t\t\tsafe_call(fetch_gfwlist, \"生成gfwlist发生错误...\")\n\t\t\tsafe_call(fetch_chnlist, \"生成chnlist发生错误...\")\n\t\telse\n\t\t\tlog(\"geosite.dat 文件不存在,跳过规则生成。\")\n\t\tend\n\tend\nelse\n\tif gfwlist_update == \"1\" then\n\t\tsafe_call(fetch_gfwlist, \"更新gfwlist发生错误...\")\n\tend\n\n\tif chnroute_update == \"1\" then\n\t\tsafe_call(fetch_chnroute, \"更新chnroute发生错误...\")\n\tend\n\n\tif chnroute6_update == \"1\" then\n\t\tsafe_call(fetch_chnroute6, \"更新chnroute6发生错误...\")\n\tend\n\n\tif chnlist_update == \"1\" then\n\t\tsafe_call(fetch_chnlist, \"更新chnlist发生错误...\")\n\tend\n\n\tif geoip_update == \"1\" then\n\t\tlog(\"geoip 开始更新...\")\n\t\tsafe_call(fetch_geoip, \"更新geoip发生错误...\")\n\t\tremove_tmp_geofile(\"geoip\")\n\tend\n\n\tif geosite_update == \"1\" then\n\t\tlog(\"geosite 开始更新...\")\n\t\tsafe_call(fetch_geosite, \"更新geosite发生错误...\")\n\t\tremove_tmp_geofile(\"geosite\")\n\tend\nend\n\nif not rollback then\n\tuci:set(name, \"@global_rules[0]\", \"gfwlist_update\", gfwlist_update)\n\tuci:set(name, \"@global_rules[0]\", \"chnroute_update\", chnroute_update)\n\tuci:set(name, \"@global_rules[0]\", \"chnroute6_update\", chnroute6_update)\n\tuci:set(name, \"@global_rules[0]\", \"chnlist_update\", chnlist_update)\n\tuci:set(name, \"@global_rules[0]\", \"geoip_update\", geoip_update)\n\tuci:set(name, \"@global_rules[0]\", \"geosite_update\", geosite_update)\n\tapi.uci_save(uci, name, true)\nend\n\nif reboot == 1 then\n\tif arg3 == \"cron\" then\n\t\tif not fs.access(\"/var/lock/\" .. name .. \".lock\") then\n\t\t\tsys.call(\"touch /tmp/lock/\" .. name .. \"_cron.lock\")\n\t\tend\n\tend\n\n\tlog(\"重启服务，应用新的规则。\")\n\tuci:set(name, \"@global[0]\", \"flush_set\", \"1\")\n\tapi.uci_save(uci, name, true, true)\nend\nlog(\"规则更新完毕...\\n\")\n\ncheck_instance(\"end\")\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/rules/block_host",
    "content": ""
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/rules/block_ip",
    "content": ""
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/rules/chnlist",
    "content": "0.zone\n00.net\n000.link\n000000.net\n0000001.xin\n000001.xin\n00000qpqp00000.com\n0000550xtz2.shop\n0000552bb0.shop\n0000552bb1.shop\n0000552bb2.shop\n0000552bb3.shop\n0000552bb4.shop\n0000f0deb5f4e6c3.com\n0000wb.com\n0001.xin\n000114.com\n00012023.com\n0001700.xin\n0002.xin\n0003399xtz1.shop\n0003399xtz2.shop\n00042.com\n00058.com\n0006111xtz2.shop\n0006266.com\n00063.xin\n000678.xin\n0006fc9541020.beer\n000700.com\n000714.xyz\n000793.com\n0007999ab0.shop\n0007999ab1.shop\n0007999ab2.shop\n0007999ab3.shop\n0007999ab4.shop\n0007999ab5.shop\n0007999ab6.shop\n0007999ab7.shop\n0007999ab8.shop\n0007999ab9.shop\n0008.xin\n00086.net\n000868adh1.shop\n000868agl1.shop\n000868atz2.shop\n0008bet.com\n0009.xin\n00091.xin\n000b0fb9410281.beer\n000e.com\n000pc.net\n001.com\n001019.xin\n001060.com\n00117163.xyz\n001d628661009.beer\n001daima.com\n001fzc.com\n001jm.com\n001job.com\n001jp.com\n001kd.com\n001km.com\n001pp.com\n001pt.com\n001sj.net\n001tudou.com\n001u.com\n001u2.xin\n001wifi.com\n001win5.cc\n002.xin\n002049.com\n00257.com\n002574.com\n0028.xin\n0033.com\n00333118.com\n0037wan.com\n00394.net\n003caixukun.xin\n004.xin\n0044696.com\n004678.com\n004837963.xyz\n005.tv\n0056.com\n00563.com\n0058.com\n005854.xin\n00615.net\n00653.xin\n0066.com\n00665ba1f014ee0e.com\n00666.xin\n006shipin.org\n007.pub\n0073.com\n00772229.com\n00791.com\n007card.vip\n007gameapp10.com\n007manhua.com\n007shoes.com\n007swz.com\n007szx.com\n007yx.com\n008.bet\n00817.com\n00847.xin\n0086l.com\n0086org.com\n008n0l12145.xin\n008sport.com\n009.xin\n0098118.com\n009job.com\n009y.com\n00bx.com\n00cdn.com\n00cf.com\n00cha.com\n00cha.net\n00ef6bce51ccd47d.com\n00fkh408382.xin\n00hh.com\n00hzx.xin\n00i1xg5s3s.xin\n00ic.com\n00it.net\n00lfoo16454.xin\n00mi.com\n00o5nm18258.xin\n00plri7b.xin\n00r9fexyub.xin\n00shu.com\n00shu.la\n00tera.com\n00tu.com\n00ukkgtc5.xin\n00ve1bg9.xin\n00wv.com\n00xu.com\n00y9334535.com\n01-2--3.xin\n01-cf.com\n010.cc\n010123456.com\n010155.net\n0101cdn.com\n0101e.com\n0101game.online\n0101semi.com\n0101ssd.com\n010203.com\n010237.com\n01058511989.com\n01095113.com\n010b.com\n010bianhu.com\n010bjzs.com\n010cb.com\n010cns.com\n010dell.com\n010dh.com\n010dsmzyy.com\n010fang.net\n010gaokao.com\n010huaer.com\n010huashi.com\n010jianzhan.com\n010lf.com\n010p.cc\n010shangpu.com\n010time.com\n010xiongdi.com\n010zaixian.com\n011.com\n011.xin\n011a4460e391a7f4.com\n0121.xin\n012233.com\n0123.xin\n0123401234.com\n0123456789.com\n0123f.xin\n0127.xin\n01291.xin\n01317.org\n01350.work\n0135135.com\n01368.com\n0138.com\n014.cc\n014.xin\n01401.com\n0142f5348f8cd094.com\n0143.xin\n014929.com\n014cbd7e810301.beer\n014esw24222.xin\n015.xin\n0158f80.com\n016.xin\n016sf.com\n018.xin\n018yun.xin\n019.xin\n01975cf969f20191.com\n019jb0sc.xin\n01a7d69861013.beer\n01be6bfabbd3024a.com\n01bzw.us\n01bzw.xyz\n01caijing.com\n01d55251a10241.beer\n01dou.com\n01f438bf710301.beer\n01ffa63e710261.beer\n01home.com\n01hour.com\n01hr.com\n01hub.com\n01isp.com\n01isp.net\n01jinhua.com\n01jzw.com\n01ki.com\n01p.com\n01p6xc08451.xin\n01pxzw0737.xin\n01rv.com\n01skjj.com\n01studio.cc\n01teacher.com\n01wb.com\n01ww.xin\n01x13k30.xin\n01yo.com\n01yuanma.com\n01yun.com\n01zenith.net\n01zhuanche.com\n01zk.com\n01zph.com\n02-89910011.com\n020.com\n020.net\n0200.xin\n02000.xin\n02017.com\n0208.com\n020883.com\n020910.com\n020banjia.net\n020bdqn.net\n020gzjx.com\n020h.com\n020job.com\n020trvl.com\n020xue.com\n020ym.com\n020zp.net\n020ztc.com\n021-116114.com\n021.com\n021.net\n0214.com\n02156506666.net\n02163.com\n0217.xin\n021a5f9841009.beer\n021bolang.com\n021byb.com\n021dianyuan.com\n021dzjx.com\n021east.com\n021gjhb.com\n021huamei.com\n021huaying.com\n021images.com\n021images.vip\n021ja.com\n021jgyy.com\n021jingwei.com\n021kd.com\n021lawfirm.com\n021phone.com\n021ren.com\n021sports.com\n021tk.com\n021van.com\n021wfz.com\n021ye.com\n021yongzhuo.com\n021zhuang.com\n021zsb.com\n022003.com\n0222.xin\n0229.xin\n022china.com\n022meishu.com\n022s.com\n022shui.com\n022sunny.com\n022v.com\n023086.com\n023bc5v99h.xin\n023cj.com\n023cq.cc\n023dir.com\n023dns.com\n023fyy.com\n023gmdk.com\n023up.com\n023xfyy.com\n023xiaoyuan.com\n023yts.com\n023yy95.net\n023yynk.net\n023zhang.xin\n023zp.com\n02405.com\n024365.com\n0245.cc\n0245.net\n02456789.com\n0246b05e23a644b5.com\n024888.net\n024bj.com\n024eps.com\n024f9wrcm.xin\n024frde.com\n024fuchan.com\n024fuwu.com\n024heyi.com\n024hh.com\n024huada.com\n024jsq.com\n024zxw.com\n025.com\n025002.com\n02516.com\n025ct.com\n025kaiyi.com\n025nj.com\n025njtf.com\n025sc.com\n025tffs.com\n025tongfeng.com\n025tuanjian.com\n025tuopan.com\n025xl.com\n025zp.com\n0264032a252fcf53.com\n026hao.com\n026idc.com\n0270.cc\n027119.xin\n02712122.com\n02727.com\n02766667777.com\n0279.net\n027965888.net\n027accp.com\n027aige.com\n027ar51848.xin\n027art.com\n027chuxun.com\n027chwl.com\n027chx.com\n027cloud.com\n027eat.com\n027g3nkf40.com\n027hhl.com\n027hpedu.com\n027hpit.com\n027htxt.com\n027hxzy.com\n027hy.com\n027idc.com\n027jsxh.com\n027one.com\n027qjxh.com\n027qyy.com\n027tianlong.com\n027tytpf.com\n027wcbyy.com\n027yx.com\n027zb.com\n027zikao.com\n027zpw.com\n028-xhxgt.com\n0283home.com\n0289kh1448.xin\n028csc.com\n028desite.com\n028f.com\n028hema.com\n028kuaidai.com\n028ltzx.com\n028office.com\n028px.com\n028pxw.com\n028sh.com\n028sjkj.com\n028yyyy.com\n029200.com\n02924.com\n029558.com\n029900.com\n029gl.com\n029jiuda.com\n029judao.com\n029k.com\n029lvwo.com\n029shw.com\n029taihe.com\n029wsw.com\n029xxw.com\n029yjy.com\n029zp.com\n02a5ji7vso.com\n02b5c31e511032.beer\n02bjmbzoat.xin\n02d.com\n02fb56599d46ae7d.com\n02hm.com\n02lb.com\n02lu.com\n02pew65z89.com\n02shu.com\n02tf6d18201.xin\n02u21a0lka.xin\n02wan.com\n02wq.com\n02yc.com\n02z97426404.xin\n03.com\n030.xin\n030303.com\n030hag5r91.xin\n030mall.com\n030yo.xin\n0310it.com\n0311.cc\n031130.xyz\n03118888.com\n0311hd.com\n0311led.com\n0311wifi.com\n0315.center\n0316.cc\n0316366.com\n03167.com\n0316yun.com\n0320.work\n0321.xin\n03241119.xyz\n03256.xin\n0328.com\n032ab0b0a10292.beer\n033033.com\n0333.xin\n03369709d10301.beer\n0349.xin\n035110000.com\n0351data.com\n0351fdc.com\n0352fang.com\n0354rcw.com\n0355fk.com\n0356.com\n0356f.com\n0357dc382faf80f5.com\n0357hz.com\n0359tv.com\n0368.com\n036yx.com\n0370-2221999.net\n0371jixie.com\n0371lianghao.com\n0371sou.com\n0371wang.com\n037398.com\n03770e40910272.beer\n0377auto.com\n0377ny.xin\n0378zz.com\n0379home.com\n0379wan.com\n037lcq08115.xin\n038d0addd10241.beer\n0391fc.com\n03964.com\n039r93jevs.xin\n03b2ef6fe1960045.com\n03bcyh2069.xin\n03cl.xin\n03cz8604316.xin\n03d882c8810271.beer\n03dq.com\n03f99b91610271.beer\n03fcw.com\n03fdcw.com\n03fugu.xin\n03k.org\n03m7pa17g.xin\n03ssif8zb.xin\n03supin.com\n03tc.com\n03u.com\n03wy.com\n03xs.com\n040.xin\n04052.xin\n04075k2xgr.com\n04085o08379.xin\n0411.com\n041101.com\n0411ct.com\n0411cxd.com\n0411e.com\n0411gh.com\n0411hd.com\n0411king.com\n0411xslvshi.com\n0411zssy.com\n0415123.com\n0415t.com\n0416job.com\n041799.com\n0421wcbzk.com\n0427.com\n0429f95301011.beer\n0430.com\n0431cn.com\n0434.cc\n0437.com\n043j8118366.xin\n0444.xin\n0452e.com\n0453.com\n0453bc39456389ff.com\n0454.cc\n0455tv.com\n0455zd.com\n0456yun.com\n046.xin\n0460.com\n0470a.com\n0472.com\n04763.work\n0476vip.com\n048.xin\n0484.xin\n048o9ml5x3.xin\n049.com\n049.xin\n04a1to24453.xin\n04adca98c1022.beer\n04apr5bl.xin\n04be22jjkv.xin\n04c01e0ad4c891d7.com\n04db11e1ea504cf2.com\n04ip.com\n04l68n18142.xin\n04n1ns24180.xin\n04qfw7m68o.com\n04r0e3w2ac.com\n04vfkt24311.xin\n05.gd\n050.xin\n0502.xin\n050400.com\n050504.xin\n0507c.xin\n0509.xin\n051058.com\n0510gcw.com\n0510gtgc.com\n0510syedu.com\n0510zyw.com\n0513.net\n0513.org\n0513011.com\n0513zs.com\n0514.com\n0514.net\n05148.cc\n0514gcw.com\n051591.com\n0515kf.com\n0515smw.com\n0515yc.com\n0515yy.com\n0516ds.com\n0516k.com\n0517.net\n0517cw.com\n0517man.com\n0517w.com\n0518home.com\n0518yy.com\n0523114.com\n05236.com\n052360.com\n0523bbs.net\n0523tx.net\n0523zp.com\n0523zz.com\n0527.xin\n05273.com\n0527zp.com\n0527zz.com\n05280.xin\n0529.xin\n052yx.com\n0531.com\n053135.com\n0531soso.com\n0531wt.com\n0532.com\n053217.com\n0532eu.com\n0533.net\n0534.com\n0534888.com\n0535-0411.com\n0535cp.com\n0535you.com\n05366196.com\n0536job.net\n0536qz.com\n0536weixin.com\n0537love.com\n0537ys.com\n0537yz.com\n0539fc.com\n053c.com\n0540.xin\n0543.xin\n0543bbs.com\n0543hr.com\n0544.xin\n054400.com\n0545.xin\n0546.xin\n0546fdc.com\n0549.xin\n0550.com\n055110.com\n055178.com\n0551wl.com\n0552jie.com\n0553zsw.com\n0554news.com\n0554qd.xin\n0554shdz.com\n0554zp.com\n0555fc.com\n0557100.com\n0558job.com\n0559hs.com\n0559jqdq.com\n055dq.xin\n055e8qn69j.com\n0564abc.com\n0564shw.com\n0566job.com\n057.com\n057.xin\n0570fc.com\n0570zs.com\n057191.com\n0571crm.com\n0571gszc.com\n0571nh.com\n0571pu.com\n0571zp.com\n0572h.com\n0572home.com\n0572zpw.com\n0573fang.com\n0573ol.com\n0573ren.com\n0574bbs.com\n0574nbjg.com\n0575.host\n057555.com\n0575bbs.com\n0575jb.com\n0575life.com\n0575qs.com\n0575zhuji.com\n0576qq.com\n0577-it.com\n0577365.net\n0577cnw.com\n0577gyy.com\n0577home.net\n0577hr.com\n0577job.com\n0577qiche.com\n0578rencai.com\n05790.com\n0579818.com\n0579com.com\n0579fw.com\n057x.com\n05880a57e1022.beer\n058a2a0741016.beer\n058e001fc10251.beer\n058ed0543d61b235.com\n058idc.com\n05927.com\n0592dsw.com\n0592jj.com\n0592ui.com\n0592xl.com\n0594.com\n0594.work\n0594fake.com\n0594hyw.com\n0594sneaker.com\n0595.com\n0595a74c711012.beer\n0595job.com\n0595qz.com\n0595rc.com\n0596fc.com\n0597kk.com\n0597music.com\n0597ok.com\n0597seo.com\n0598777.com\n0598yu.com\n0599yx.com\n05bf51fa911012.beer\n05bq.com\n05by3k248.xin\n05cc8c4cc1023.beer\n05e44607310271.beer\n05idc.com\n05info.com\n05ja1g16464.xin\n05n2azbp.xin\n05p9uj1253.xin\n05rjxqsp5i.xin\n05sun.com\n05vauwva3.xin\n05vm.com\n05wan.com\n05wang.com\n05youxi.com\n060.xin\n0603.xin\n0605.com\n0609.com\n061.xin\n0616.xin\n0616a9dbe68fac9c.com\n0618.com\n0618.xin\n06192.com\n0623.xin\n062wfly8z.xin\n0631.xin\n063108.com\n0631rc.com\n0632.xin\n0632idc.com\n0633.xin\n0634.com\n0634.xin\n0635.com\n0635.xin\n064.xin\n065201.com\n065423cd010311.beer\n06555.com\n0660hf.com\n0663.net\n06639.xin\n0663job.com\n0666.xin\n0668.com\n06681.com\n0668gz.com\n067555.com\n06888.work\n068rolbmiz.xin\n069.xin\n0693f784d1023.beer\n06abc.com\n06b8ziwxjf.xin\n06climate.com\n06dc36591a49441c.com\n06ee1860c1015.beer\n06game.com\n06ik7744n.xin\n06ps.com\n06tn.com\n06z8mzlma.xin\n07.cc\n07.la\n070725.xyz\n07073.com\n07073h5.com\n07073vr.com\n0708.com\n0712f.com\n0712fang.com\n0714.com\n0714110.xin\n0715fc.com\n0715rc.com\n0715zp.com\n0716fw.com\n0716mr.com\n07177.com\n0718.cc\n0718qp.com\n0718xf.com\n072.xin\n0722fc.com\n0722zs.com\n0724c.com\n0725.com\n0728f.com\n0730188.com\n0730news.com\n073122.com\n0731777.com\n0731a.com\n0731cfw.com\n0731fdc.com\n0731hds.com\n0731i.com\n0731job.com\n0731mcw.com\n0731pgy.com\n0731tg.com\n0731wan.com\n0733news.com\n0734zpw.com\n0735.com\n07358.com\n0735jz.com\n0735zx.com\n0735zz.com\n0736fdc.com\n0736zp.com\n0736zz.com\n0738.cc\n0738rc.com\n073980.com\n0739qq.com\n0739tt.com\n073e5367a10292.beer\n073img.com\n073pic.com\n07430743.com\n0743fd8231024.beer\n0744114.com\n0744tv.com\n0746job.com\n0746news.com\n0750.xin\n0750rc.com\n0751.cc\n075238.com\n0752qc.com\n0753zz.com\n0755.net\n07551.com\n07551.net\n0755400.com\n075577777.com\n0755888.com\n0755910.com\n0755bdqn.com\n0755bzf.com\n0755caibao.com\n0755cts.com\n0755fm.com\n0755gty.com\n0755hao.com\n0755haoyu.com\n0755hj.com\n0755hz.com\n0755jz.net\n0755sszx.net\n0755yf.net\n0755zb.com\n0756fang.com\n0756idc.com\n0756tong.com\n0756zx.com\n0757fc.com\n0757info.com\n0757p.com\n0757rc.com\n0758net.com\n0759.pw\n0759home.com\n0759job.com\n0759k.com\n0759yc.com\n076.xin\n0760.com\n0760bw.com\n0760rc.com\n07629.org\n076299.com\n076299.net\n0762uu.com\n0763f.com\n076650.com\n07666.com\n0768000.com\n0769auto.com\n0769che.com\n0769king.xin\n0769net.com\n0769pf.com\n0769sun.com\n0769sx.com\n0769web.net\n0769yp.com\n076t0uhtl9.xin\n077.xin\n0771.com\n0771.tv\n07712008.com\n07715555555.com\n0771cts.com\n0771cyts.com\n0771fukang.com\n0771rc.com\n0772fang.com\n0772gcw.com\n0772job.com\n0772lou.com\n07743988888.com\n07752267777.com\n07754255555.com\n0775fcw.com\n0775jzw.com\n0775qc.com\n0775yzf.com\n0776.cool\n07761.com\n0776hr.com\n0779-2678999.com\n078.xin\n078079.com\n07890.com\n078bdd796e8b4b12.com\n07908.com\n0791abc.com\n0791br.com\n0791fuwu.com\n0791look.com\n0791qzw.com\n0792jj.net\n0792ju.com\n0792lsly.com\n0792u.com\n0793.tv\n07938.com\n0794zp.com\n0797122.com\n0797auto.com\n0797ayzp.com\n0797rs.com\n0797tuan.com\n0797zz.com\n0798.cc\n0799z.com\n079mxd.com\n07ba0de711020.beer\n07bmss01426.xin\n07cn.com\n07cn.net\n07e12xs2io.xin\n07f0798569af4d70.com\n07fe8668211012.beer\n07fea775dffd96d4.com\n07jfrv01301.xin\n07k6np0378.xin\n07kacm20339.xin\n07net01.com\n07ozikk8w3.xin\n07ren.com\n07sh.com\n07swz.com\n07u82t16391.xin\n07w97p18164.xin\n07zk7z26405.xin\n080.xin\n0800c988e1010.beer\n0801.xin\n0804.org\n080e068141ea500e.com\n081.com\n081.xin\n0813fs.com\n0817.net\n0817ch.com\n0817tv.com\n0818tuan.com\n0818tuangou.com\n082.xin\n0820.xin\n0827ug.com\n0830bbs.com\n0831.app\n0831home.com\n0832mh.com\n0835.com\n0835meiya.com\n0838.com\n0838che.com\n0839zp.com\n08424b74011032.beer\n0843d5944883e752.com\n085.com\n0852diaoyu.com\n0853rc.com\n0856st.com\n0857job.com\n0859job.com\n0859qp.com\n0859sy.com\n0860.xin\n086019.com\n08644.com\n0871aaa.com\n0873js.com\n0877zp.com\n0890.com\n08952.com\n08958e44r8.com\n0898.net\n089858.com\n0898888.com\n0898hq.com\n0898mmf.com\n0898uf.com\n089u.com\n08an.com\n08ar.com\n08b68dbbbf876114.com\n08c6.com\n08c8b537f1021.beer\n08c9f63d31021.beer\n08cms.com\n08fc8f0ee3f2768a.com\n08ky.com\n08px.com\n08qx.com\n08wojia.com\n08x1am20483.xin\n08zf.com\n0904.cool\n090901.xin\n090expo.com\n0912158.com\n0912app.com\n0912fdj.com\n0913ss.com\n0915531111.xin\n0916001.com\n0917.com\n0917888.com\n0917e.com\n0918f5dadde012c3.com\n0919123.com\n092394.com\n093.com\n0935e.com\n0937.cc\n0937.com\n0937.net\n0937js.com\n09388.xin\n0938edu.com\n0938net.com\n0939.net\n0939.xin\n093nd9.com\n094.xin\n09451.com\n0945a5ee91011.beer\n094j35.com\n095.xin\n095196555.com\n0951job.com\n09527.xin\n0952xh.com\n0959930d71015.beer\n096.xin\n0962xb24260.xin\n0963d9712a525457.com\n096663.com\n0972xxg.com\n0979.xin\n0990fc0011011.beer\n0991dj.com\n0991net.com\n0992.cc\n09928.xin\n09946.center\n09948.xin\n099913.com\n099b127ae166d8f1.com\n09aag016266.xin\n09b3045664731d42.com\n09c5062ea1020.beer\n09e12x16370.xin\n09ea354bd9542ba7.com\n09game.com\n09iatm1z.xin\n09lc5d12399.xin\n09mhncdop.xin\n09p9z7d1h8.com\n09pay.xin\n09pj75gs09.xin\n09pzq024240.xin\n09rrqh7s62.xin\n09shijue.com\n09vvme1l.xin\n09xx5a24352.xin\n09z7wy3k.xin\n0a0fx7vz1l.xin\n0a2d.com\n0a2g5a04175.xin\n0a32mt201.xin\n0a64qa16273.xin\n0a6ri001390.xin\n0a8a112e8bb5045e.com\n0acrdtuhed.xin\n0ag8kg01470.xin\n0ape4t08268.xin\n0aq4hxqs.xin\n0ax2rjo3od.xin\n0axoa626262.xin\n0b145c21210e933c.com\n0b4xq91061.xin\n0b6e0659811021.beer\n0b8ky116130.xin\n0barrfplp.xin\n0bb261a6a46d766a.com\n0bb875c361022.beer\n0bbd0e535194e7f7.com\n0bddiq9a0q.xin\n0bdfe52341114.beer\n0bef0493410272.beer\n0bjasw18181.xin\n0bke7a16362.xin\n0bmfo404187.xin\n0bqa9826122.xin\n0bw82f20390.xin\n0bxed90150.xin\n0c3bjz070.xin\n0c449995810292.beer\n0c9a2959d10311.beer\n0c9b8639d1024.beer\n0car0.com\n0cname.com\n0cokid18352.xin\n0cq9hzrz.xin\n0cqpj504251.xin\n0d.work\n0d00.xin\n0d06e627dbe6654a.com\n0d263788316151cb.com\n0d3lnlkylu.xin\n0d49f571e1017.beer\n0daily.com\n0day.xin\n0ddvic16247.xin\n0de41y26132.xin\n0dian8.org\n0dm.com\n0dmhu412466.xin\n0dou490764.xin\n0dt83e18342.xin\n0du.net\n0du4br04412.xin\n0duw.com\n0duxs.com\n0dxkge0412.xin\n0e0c2e9e94622290.com\n0e38e883511032.beer\n0e706b6c62da3920.com\n0e76427381016.beer\n0e7o6216306.xin\n0e91wut86c.com\n0easy.com\n0ecff3e99dce5b33.com\n0ee18d4c192243b3.com\n0efef58c41014.beer\n0egh661666.xin\n0eghje0112.xin\n0ek4sg08401.xin\n0emvvs04229.xin\n0en6hz2u.xin\n0ew4p6fb1.xin\n0f0lj908444.xin\n0f602h26461.xin\n0f63e6089d80dffe.com\n0fbcjwr4x2.xin\n0fbs03i1i.xin\n0fc45y3sbr.xin\n0fe5d43561011.beer\n0fe7e0a941011.beer\n0fep69v3.xin\n0fj5qx12422.xin\n0fl1j80347.xin\n0flnis04328.xin\n0fnkjai21b.xin\n0g13wzk4pj.xin\n0g1s.com\n0g5q5hrcbo.xin\n0g9l08zbsc.xin\n0ggt51agn0.xin\n0ggw7u16311.xin\n0gklqj5hal.xin\n0gmu6zwf87.xin\n0gouche.com\n0gps2ppnu9.xin\n0gtsz9jw.xin\n0gyyc924408.xin\n0h3lfj12415.xin\n0hbgmcs5gb.xin\n0he0.com\n0hgame.com\n0hl5ntdm0i.xin\n0hq7006r07.xin\n0hzxwa2471.xin\n0i-i0.com\n0i6js716143.xin\n0i71r4qg.xin\n0im9f31630.xin\n0iq8q8163.xin\n0iwgt324206.xin\n0j1oul247.xin\n0j3h9616299.xin\n0j4wdc8bs8.xin\n0j783008494.xin\n0jb520030.xin\n0jl3h724403.xin\n0k2u4didtd.xin\n0k6dm96.xin\n0ka.com\n0kdmutnc.xin\n0kee.com\n0kfq5e16254.xin\n0kkkkkt.com\n0km5ip01196.xin\n0kmny96j9gtb.xin\n0koxpnwfx.xin\n0krmre24376.xin\n0kt0nm0380.xin\n0l23f6i4e8.com\n0l2nf218236.xin\n0l7mqk1284.xin\n0leb5s268.xin\n0lircg1235.xin\n0lw1ib2sa.xin\n0lzamwtu.xin\n0m7eaq04292.xin\n0m93wwr0.xin\n0mbvyf1437.xin\n0me14c18373.xin\n0mfbac1gsj.xin\n0mfqi124198.xin\n0mk9ht2449.xin\n0moju716460.xin\n0mrzee12192.xin\n0ms.one\n0ms65u0s8t.xin\n0mu4f8xw0k.xin\n0n469e12312.xin\n0n5hylf79s.xin\n0n663xtw.xin\n0nc13z04356.xin\n0nejoqlu3.xin\n0nelddmoha.xin\n0nk5dhsp.xin\n0nnk3nxyu3.xin\n0np1ydukvn.com\n0npkjexon.xin\n0nqxhrpw30.xin\n0nw2sq2622.xin\n0nzk4t3lrn.xin\n0o0o.xin\n0o1djo20199.xin\n0o6wqk24113.xin\n0o8lgn20118.xin\n0obhhr12439.xin\n0okm1a12139.xin\n0olgbi04133.xin\n0olut8.com\n0one.xin\n0oo70c26213.xin\n0or1h40327.xin\n0p21iz0729.xin\n0p2wrugphn.xin\n0p4ips24224.xin\n0p5i7dxr6y.xin\n0p901yay.xin\n0plpxp1898.xin\n0poho720169.xin\n0ptf4g04404.xin\n0pxrom71q8.xin\n0q5stv04123.xin\n0q9y3z18365.xin\n0qd9dnzon9.xin\n0qm88r0891.xin\n0qqczcn8l8.xin\n0r8ag0y7di.xin\n0range5.xin\n0rg.xin\n0rgojh0146.xin\n0rgu7ha3p.xin\n0rl.cc\n0rljmz01274.xin\n0rz.ltd\n0s73o26p67.com\n0s8s.com\n0sm.com\n0snd.cc\n0u.com\n0voice.com\n0x3.com\n0x3.me\n0x6.me\n0x7.me\n0x9.me\n0xaa55.com\n0xff000000.com\n0xffffff.org\n0xiao.com\n0xjqlun2.work\n0xsky.com\n0xue.com\n0z.gs\n0zn5mg.asia\n1-123.com\n1-b.tc\n1-cs.net\n1-du.net\n1-fss24-s0.streamhoster.com\n1-luxury.com\n1-yuan.net\n1.biz\n1.cc\n100-tong.com\n100.com\n100.me\n100.travel\n10000.com\n100000w.com\n10000gd.tech\n10000idc.net\n10000job.com\n10000link.com\n10000post.com\n10000shequ.com\n10000tc.com\n10000yao.com\n10001wan.com\n100024.xyz\n1000360.com\n10006.info\n1000coco.com\n1000fun.com\n1000my.com\n1000phone.com\n1000phone.net\n1000plan.org\n1000qm.vip\n1000qs.com\n1000thinktank.com\n1000tuan.com\n1000uc.com\n1000xuexi.com\n1000xun.com\n1000zhu.com\n10010.com\n10010.net\n10010.team\n10010400.net\n10010hb.net\n10010js.com\n10010ll.com\n10010mx.com\n10010nm.com\n1001g.com\n1001hw.com\n1001p.com\n100248.com\n10029.com\n10034.com\n100520.com\n100580.com\n1008011.com\n1008120.com\n10086.com\n10086.games\n10086.world\n1008656.com\n10086kuaixiu.com\n100allin.com\n100alpha.com\n100ask.net\n100ask.org\n100audio.com\n100bt.com\n100chou.com\n100chui.com\n100cjc.com\n100credit.com\n100cup.com\n100d3.com\n100data.com\n100du.com\n100e.com\n100eby.com\n100eshu.com\n100exam.com\n100fang.com\n100font.com\n100guoji.com\n100hsl.com\n100incense.com\n100inn.cc\n100intlschool.com\n100ip.net\n100jg.com\n100jiapu.com\n100kk.com\n100ksw.com\n100lake.com\n100lbj.com\n100legend.com\n100loujia.com\n100market.net\n100md.com\n100mian.com\n100mmedia.net\n100nets.com\n100njz.com\n100nong.com\n100offer.com\n100old.com\n100pd.com\n100pei.com\n100ppi.com\n100puzzles.com\n100qu.net\n100run.com\n100shop.com\n100shuai.com\n100skin.com\n100stone.com\n100sucai.com\n100szy.com\n100t.com\n100tal.com\n100tiao1.net\n100tmt.com\n100top1.com\n100try.com\n100tv.com\n100txy.com\n100vr.com\n100wa.com\n100web.store\n100weidu.com\n100wen.com\n100wsanguo.com\n100xgj.com\n100xhs.com\n100xiao.com\n100xin.com\n100xuexi.com\n100yangsheng.com\n100ycdn.com\n100ye.com\n100ye.net\n100yigui.com\n100yingcai.com\n100yiyao.net\n100zd.com\n100zhuang.com\n100zp.com\n101.com\n1010-0000.com\n10100.com\n10100000.com\n10101111.com\n10101111cdn.com\n1010gamer.com\n1010jiajiao.com\n1010jz.com\n1010pic.com\n1010sh.com\n1010t.com\n101505.com\n10155.com\n1015600.com\n10185.com\n101hair.com\n101hr.com\n101jiajiao.com\n101weiqi.com\n1024.ink\n1024fuli.com\n1024g.com\n1024ie.com\n1024nic.com\n1024ss.com\n1024tools.com\n1024wl.com\n1024zx.com\n1026jz.com\n10284.com\n102no.com\n102pay.com\n103153.com\n10333.com\n10349.com\n10479.org\n1050qm.com\n105mr.com\n10625fffd42119ce.com\n10636.pro\n10639888.com\n1065m.com\n10666114.net\n1073.com\n1088hg41.com\n108addf0811012.beer\n108ai.com\n108mir.com\n108pk.com\n108qi.com\n108sq.com\n108tian.com\n109.com\n109360.com\n10966.net\n109876543210.com\n109ya.com\n10bests.com\n10c5a16c51015.beer\n10de7e1f17f512b2.com\n10ec4a74b10281.beer\n10fang.com\n10gjkj.com\n10gt.com\n10guoying.com\n10huan.com\n10idc.com\n10isp.com\n10moons.com\n10p07v10o5.com\n10pkpk.com\n10qq.com\n10r1.com\n10s1.com\n10sea.com\n10soo.com\n10tianqi.com\n10urzr3jk.icu\n10vps.com\n10yan.com\n110.com\n11000011.com\n1108cd985e95ad39.com\n110ask.com\n110clwz.com\n110disk.net\n110route.com\n110tm.com\n111.com\n111111111.com\n1111lm.com\n111237.com\n1113.cc\n1114.com\n11159.com\n11160066.com\n1116fad134.info\n1116fad135.info\n1116fad158.info\n1116fad167.info\n1116fad176.info\n11172222.com\n111867.com\n111com.net\n111wo.com\n111yao.com\n111zyw.com\n112112.com\n112192.com\n1122.com\n11222.com\n112682.com\n1128job.com\n112998.xyz\n112seo.com\n112wan.com\n11315.com\n11343.com\n113989.com\n113dh.com\n113ya.com\n114-91.com\n1145858.com\n11467.com\n11478.com\n114837322.xyz\n114auto.com\n114best.com\n114blog.com\n114cbd.com\n114chn.com\n114db.com\n114dev.com\n114dg.com\n114dns.com\n114dns.net\n114dnss.com\n114gh.com\n114guoshu.com\n114hyw.com\n114hzw.com\n114ic.com\n114ic.net\n114jcw.com\n114menhu.com\n114mo.com\n114my.com\n114my.net\n114naliyou.com\n114oc.com\n114photo.com\n114piaowu.com\n114pinpai.com\n114qy.com\n114s.com\n114sf.com\n114shouji.com\n114study.com\n114ttg.com\n114ups.com\n114yygh.com\n114zhibo.com\n114zpw.com\n114zw.org\n115.com\n115155.xyz\n1156.com\n1156dns.com\n115800.com\n115cdn.com\n115cdn.de\n115cdn.net\n115cloud.com\n115cloud.net\n115img.com\n115meta.com\n115seo.com\n115vod.com\n115wg.com\n115zb.com\n1163.com\n1166.com\n1168.tv\n11684.com\n116968.com\n116cd.com\n116cd.net\n116daohang.com\n116kj.com\n116yx.com\n11714ae0b1014.beer\n117915.com\n117a6af992d4208e.com\n117trip.com\n117y.com\n1181.com\n118114.net\n118360.com\n1188fc.com\n118cy.com\n118inns.com\n118jm.com\n118pan.com\n118ttc.com\n118wa.com\n1190119.com\n119120.org\n11951.com\n11992169.xyz\n119958.com\n119bid.com\n119lora.com\n119tx.com\n119you.com\n11bao.com\n11bz.com\n11cda806e11012.beer\n11cdn.cc\n11dmh.com\n11dns.com\n11fdj.com\n11fldxn.com\n11flow.com\n11g.com\n11gai.com\n11haoka.com\n11job.com\n11job.net\n11ka.com\n11lx.com\n11meigui.com\n11pdf.com\n11player.com\n11rain.com\n11slotvip.cc\n11space.com\n11sun.com\n11wow.com\n11xotn7p.com\n11yinyuan.com\n11zhang.com\n120.net\n1204cm.com\n120918.com\n120ask.com\n120askimages.com\n120bid.com\n120btc.com\n120cihui.com\n120fd.com\n120it.com\n120jg.com\n120jhccz.com\n120jinyi.com\n120jxxh.com\n120kid.com\n120kq.com\n120naotan.com\n120scp.com\n120sg.com\n120shgc.com\n120spd.com\n120sun.com\n120top.com\n120x.net\n120ym.com\n121121.net\n12114rc.com\n1212.com\n12120.net\n12123.com\n121314.com\n121588.com\n121ask.com\n121down.com\n121ghs.com\n121mai.com\n121mu.com\n121wty.com\n122521.com\n12260808.xyz\n12272.vip\n1228xbdz7m.cfd\n122bid.com\n122c3e52810272.beer\n122cha.com\n122cn.net\n122law.com\n122w.net\n123-789.com\n123.cc\n12301.cc\n1230539.com\n12306.com\n12306bypass.com\n12308.com\n12308com.com\n1230t.com\n123123.net\n12315.com\n12316cn.com\n12317.com\n12317wan.com\n1231818.com\n123242.com\n123245.com\n123254.com\n123294.com\n123295.com\n123326.com\n12333.com\n12333.org\n12333si.com\n12333tc.com\n123366.xyz\n1233dns.com\n1234.me\n12341288.com\n1234567.com\n123456edu.com\n123456wz.com\n12345b.com\n12345good.com\n12345good.net\n12348.net\n12349.net\n1234biao.com\n1234i.com\n1234n.com\n1234sy.com\n1234wu.com\n1234wu.net\n1234ye.com\n1234yes.com\n12354.com\n12355.net\n123624.com\n123635.com\n123641.com\n123652.com\n12365auto.com\n12366.com\n12366.net\n12366cn.com\n123684.com\n12369zb.com\n123773.com\n123842.com\n123860.com\n123865.com\n123888222.com\n123912.com\n123952.com\n123957.com\n123aa.com\n123aoe.com\n123baofeng.com\n123bo.com\n123boligang.com\n123du.cc\n123ems.com\n123fc.com\n123fh.com\n123haitao.com\n123haiwai.com\n123hao.com\n123hdp.com\n123huaiyun.com\n123juzi.com\n123kanfang.com\n123langlang.com\n123meiyan.com\n123menpiao.com\n123nice.net\n123ox.com\n123pan.com\n123panpay.com\n123pans.com\n123qibu.com\n123qy.com\n123shopee.com\n123si.org\n123slg.com\n123ths.com\n123u.com\n123v.net\n123webgame.com\n123wk.com\n123xfw.com\n123xueshu.com\n123yiche.com\n123ypw.com\n123yx.com\n124866.xyz\n125.la\n125180.com\n12530.com\n12533.com\n1256789.xyz\n12580.com\n12580.tv\n12580life.com\n12590d0ff10272.beer\n125cn.net\n125edu.com\n125job.com\n125p.com\n125school.com\n125visa.com\n125y.com\n125yan.com\n126.am\n126.com\n126.fm\n126.link\n126.net\n126blog.com\n126disk.com\n126doc.com\n126job.net\n126qiye.com\n127.com\n127.net\n1278721.com\n127cdn.com\n127xx.com\n127z.com\n128456.com\n1288.tv\n12880.com\n128d3a16610271.beer\n128qd.com\n128sy.com\n128uu.com\n12988.net\n129t.com\n12dzx.com\n12e6824e11013.beer\n12ef916d92d482fa.com\n12gang.com\n12h5.com\n12ha.com\n12kanshu.com\n12ketang.com\n12ky.com\n12miao.com\n12pk.com\n12py879p9p.com\n12sporting.com\n12yao.com\n12ym.com\n13.gs\n130.org\n130014.xyz\n130158.com\n131.com\n13100455400.com\n13112.com\n1312.vip\n13124.com\n13131313131.com\n1314.io\n1314520sz.com\n1314gl.com\n1314h.com\n1314study.com\n1314tkd.com\n1314wallet.com\n1314zf.com\n1314zhilv.com\n131cc.com\n1322.com\n13233.org\n132lawyer.com\n1330.net\n1332vp.com\n133300.com\n13377608388.com\n13384.com\n133998.com\n13482896776.com\n1350135.com\n135031.com\n135139.net\n135309.com\n135650.com\n13567.com\n1356789.com\n1357vip.com\n135958.com\n135995.com\n135bianjiqi.com\n135e.com\n135editor.com\n135edu.com\n135plat.com\n135yuedu.com\n136.com\n1360.com\n136136.com\n1362-rfwi.cc\n13636.com\n1366.com\n13667703999.com\n136bet.app\n136fc.com\n136hr.com\n136pic.com\n13707.net\n137139.com\n13720.com\n13726936178.com\n137365.com\n1374.com\n13793085458.com\n13793277711.com\n137home.com\n137y.com\n138.net\n13800.net\n13800100.co\n13800100.com\n1380898.com\n138379.com\n138gzs.com\n138job.com\n138pet.com\n138top.com\n138vps.com\n139.com\n139000.com\n13901559172.com\n1391.com\n13910.com\n139130.com\n139135.com\n1392189.com\n13937180868.com\n13980.com\n1399vip.com\n139cm.com\n139ee.com\n139erp.com\n139game.com\n139game.net\n139play.com\n139shop.com\n139talk.com\n139wanke.com\n139y.com\n139zhuti.com\n13a.com\n13c283b0710281.beer\n13cr.com\n13e7.com\n13ejob.com\n13freight.com\n13gm.com\n13jue.com\n13lm.com\n13q19b8wgb.com\n13qh.com\n13s.co\n13th.tech\n13ww.net\n13xiaoshuo.com\n13yx.com\n14033.live.streamtheworld.com\n140414.com\n1404c4ce1d63a0d7.com\n1415926.com\n1415926.mobi\n141799c86c1ba267.com\n142857.red\n14294.com\n143614.xyz\n14498.com\n1451cn.com\n14565cabd1011.beer\n146368.com\n14776ac8e1022.beer\n147seo.com\n148-law.com\n1488.com\n148com.com\n148la.com\n14944.net\n14f99ce2609c0071.com\n14hj.com\n14play.net\n14xd.com\n14ygame.com\n150100.com\n150170.com\n150ce9517a529b73.com\n150cn.com\n151.hk\n1510game.com\n15111223344.com\n15140.com\n1515.website\n15153.com\n15166.com\n151733.com\n1518.com\n151m.net\n151rs.com\n151top.com\n151web.com\n15201.com\n15211223344.com\n152500.com\n1527ego.com\n153.com\n15311223344.com\n153332.xyz\n153g.net\n15426.org\n15440.org\n1545ts.com\n155.com\n155155155.xyz\n1556.net\n1559.com\n155idc.com\n156186.com\n156669.com\n156pay.com\n156zy.suyunbo.tv\n157110.com\n157300.net\n157seo.com\n158566.com\n1588.tv\n158c.com\n158wf.com\n159.com\n15982.com\n159shouji.com\n15beipk.com\n15bl.com\n15gg.com\n15gift.com\n15hr.com\n15hr.net\n15job.com\n15kuaixiu.com\n15lu.com\n15ms.com\n15scsc.com\n15sn.com\n15tqw.com\n15wkd6i45lq3.com\n15xdd.com\n15yl.com\n15yunmall.com\n160.com\n1601sy4ge0.com\n1606c348011042.beer\n160c7443c1019.beer\n160dyf.com\n160job.com\n160yx.com\n16109.com\n161580.com\n1616.net\n16163.com\n1616n.com\n16177.net\n1617k.com\n1618.com\n1626.com\n163.cm\n163.com\n163.fm\n163.gg\n163.link\n163.lu\n163.net\n163110.com\n1633.com\n1633.store\n1633d.com\n163501.xyz\n163663.com\n1637.com\n163888.net\n1639f577b1022.beer\n163adl.com\n163cdn.com\n163cms.com\n163cn.link\n163cn.tv\n163cp.com\n163cs.com\n163fen.com\n163guangdong.com\n163guoqi.com\n163gz.com\n163henan.com\n163hot.net\n163hubei.com\n163hunan.com\n163img.com\n163industry.com\n163jiasu.com\n163k.cc\n163k.com\n163kada.com\n163lady.com\n163liao.com\n163mail.cc\n163mail.com\n163mail.net\n163nasa.com\n163nos.com\n163ns.com\n163pinglun.com\n163py.com\n163qb.com\n163qikanlunwen.com\n163qiyukf.com\n163wh.com\n163yu.com\n163yun.com\n164580.com\n16466.com\n165123.com\n16537.ru\n16587.com\n165image.com\n165image.vip\n165zhuji.com\n166.com\n166.net\n16612.cc\n166161.com\n166511.com\n1665213d91017.beer\n1666.com\n1668.net\n1668hk.com\n166cai.com\n166cdn.com\n166dns.com\n16757.com\n16768.com\n168-hx.com\n16816.com\n168267xz.com\n168338.com\n16835.com\n16838.com\n1686888.com\n1688.com\n16885.com\n16886000.com\n168866.com\n16888.com\n1688988.com\n1688b2b.com\n1688du.com\n1688e.com\n1688eric.com\n1688la.com\n1688lucky.com\n1688ru.com\n1688s.com\n1688tsw.com\n1688zhuce.com\n16899168.com\n168auto.com\n168chaogu.com\n168dc.com\n168dmj.com\n168dns.com\n168hs.com\n168job.com\n168kaifu.com\n168kk.com\n168kn.com\n168lyq.com\n168mlj.com\n168moliao.com\n168rcw.com\n168tea.com\n168tex.com\n168trucker.com\n168xiezi.com\n168zcw.com\n169.com\n169163.com\n16925500.xyz\n169369.com\n16949pcb.com\n1696.com\n169666.xyz\n169700.com\n16988.com\n16999.com\n169it.com\n169jk.com\n169ol.com\n16app.tv\n16boke.com\n16bus.net\n16buzhi.com\n16c1.com\n16ceshi.com\n16ds.com\n16fan.com\n16fc0df828e1570e.com\n16first.com\n16game.net\n16hyt.com\n16kang.com\n16ker.com\n16lao.com\n16map.com\n16p.com\n16pic.com\n16rd.com\n16sucai.com\n16type.com\n16tz.com\n16wl.cc\n16xx8.com\n17.com\n170.com\n170066.com\n17025.org\n170601.xyz\n17083731a1019.beer\n170hi.com\n170mv.com\n170tao.com\n171026.com\n17167.com\n17173-inc.com\n17173.com\n17173.net\n17173cdn.com\n17173gc.com\n17173ie.com\n17173v.com\n17173vr.com\n17173vr.net\n17173yx.com\n17178.com\n1717pk.com\n1718china.com\n1718world.com\n171tax.com\n171win.net\n17207.com\n17293879b10261.beer\n172haoka.vip\n172l.com\n172mix.com\n172tt.com\n172xiaoyuan.com\n173.com\n173.hk\n173.tv\n1732.com\n1732.net\n17345.com\n17350.com\n17351.com\n17365h5.com\n17365pc.com\n1739705934745550.com\n173cs.com\n173eg.com\n173fahao.com\n173fc.com\n173fh.com\n173funny.com\n173ie.com\n173ie.net\n173kan.com\n173kw.com\n173kz.com\n173on.com\n173shouyou.com\n173shouyou.net\n173sy.com\n173tuku.com\n173uu.com\n173yeyou.com\n173yeyou.net\n173zb.com\n173zy.com\n1744.cc\n17495.com\n175045d8e62848be.com\n1755.com\n17566.com\n1758.com\n175aa.com\n175cinemas.com\n175club.com\n175game.com\n175ha.com\n175hd.com\n175kh.com\n175pt.com\n175pt.net\n175sf.com\n175wan.com\n175yo.com\n17666.mobi\n1766bbs.com\n17673.com\n1768.com\n176quan.com\n176web.net\n1773.com\n1778.com\n177xfb.com\n178.com\n178.net\n178198.com\n178448.com\n1787.ink\n178768.com\n178800.cc\n178871.xyz\n17888.com\n178du.com\n178hui.com\n178linux.com\n178rw.com\n178yy.com\n178zhaopin.com\n179.com\n179179.com\n1797.cc\n17986.net\n17989.com\n179cy.com\n179e.com\n17admob.com\n17ai.me\n17aifun.com\n17b.net\n17bang.ren\n17bdc.com\n17beijiang.com\n17bianji.com\n17biao.com\n17bigu.com\n17biying.net\n17bt.com\n17byh.com\n17c13ae4a36b8862.com\n17c8d205dbcbc534.com\n17cdn.com\n17ce.com\n17chacha.com\n17chdd.com\n17cma.com\n17coding.info\n17d.co\n17dao.com\n17dap.com\n17dawan.com\n17dc.com\n17ditu.com\n17dm.com\n17donor.com\n17dp.com\n17duu.com\n17emarketing.com\n17et.com\n17ex.com\n17f.co\n17fandai.com\n17fee.com\n17feia.com\n17fengguo.com\n17fengyou.com\n17fifa.com\n17font.com\n17foreign.com\n17forex.com\n17fpv.com\n17g.com\n17game.com\n17gaoda.com\n17getfun.com\n17golang.com\n17guagua.com\n17gwx.com\n17haibao.com\n17hc.com\n17house.com\n17hpl.com\n17huahua.com\n17huang.com\n17huayuan.com\n17huo.com\n17huodong.com\n17ic.com\n17itou.com\n17ivr.com\n17jc.net\n17jiaoyu.com\n17jiedu.org\n17jita.com\n17jzt.com\n17k.com\n17kan.cc\n17kgk.com\n17kjs.com\n17koko.com\n17kouyu.com\n17kqh.com\n17kss.com\n17kuxun.com\n17kxgame.com\n17kzy.com\n17l18w9s1z.com\n17lai.org\n17lai.site\n17lele.net\n17lewan.net\n17lht.com\n17liuxue.com\n17ll.com\n17look.com\n17m3.com\n17meb.com\n17meiwen.com\n17mqw.com\n17ms.com\n17neo.com\n17oh.com\n17ok.com\n17only.net\n17p.co\n17p2mz326p.world\n17pa.com\n17palyba.com\n17popo.com\n17pr.com\n17pw.com\n17python.com\n17qcc.com\n17qiche.com\n17qiqu.com\n17qread.com\n17qzx.com\n17rd.com\n17rd.net\n17read.com\n17relax.com\n17roco.com\n17sfc.com\n17shanyuan.com\n17shenqi.com\n17smart.net\n17sort.com\n17startup.com\n17sucai.com\n17suzao.com\n17swan.com\n17syi.com\n17sysj.com\n17t.co\n17tanwan.com\n17taoca.com\n17taotaoa.com\n17taotaob.com\n17taotaoba.com\n17taotaoc.com\n17tcw.com\n17tigan.com\n17tiku.com\n17toushi.com\n17track.net\n17ttt.com\n17tx.com\n17u.com\n17u.net\n17u1u.com\n17u7.com\n17ugo.com\n17uhui.com\n17uhui.net\n17uoo.com\n17usoft.com\n17usoft.net\n17utt.com\n17uxi.com\n17v5.com\n17van.com\n17vin.com\n17vsell.com\n17wan7.com\n17wanba.com\n17wangdan.com\n17wansf.com\n17wanxiao.com\n17wclass.com\n17weike.com\n17wendao.com\n17whz.com\n17win.com\n17ww.cc\n17xianwan.com\n17xing.com\n17xsj.com\n17xueaoshu.com\n17xueba.com\n17xueshe.com\n17xuexi.com\n17xxl.com\n17xxw.com\n17y.com\n17ya.com\n17yaoqu.com\n17ym.org\n17you.com\n17yund.com\n17yunlian.net\n17yunzhijiao.com\n17yunzhijiao.net\n17yy.com\n17zhiliao.com\n17zhuangxiu.com\n17ziti.com\n17zjh.com\n17zub.com\n17zuoye.com\n17zuoye.net\n17zuqiu.com\n17zwd.com\n17zyxy.com\n17zyxy.net\n18.cm\n18000000001.com\n1800zz.com\n18023.com\n18095.com\n18095.work\n180disk.com\n180qt.com\n180yy.com\n1811d2af81022.beer\n181709bd610271.beer\n18176631811.com\n18183.com\n18183g.com\n18183sf.com\n181855.com\n1818hm.com\n181b5f7e71011.beer\n181ps.com\n181ue.com\n18251.org\n18263.vip\n182682.xyz\n182yg.org\n18318.com\n18375.com\n183me.com\n183post.com\n183read.cc\n183read.com\n1845p3hr95.com\n18488.com\n185185.com\n1857qc.net\n185c72b7d750569a.com\n1860sf.com\n1866.tv\n18665348887.com\n186688.com\n18713d3521023.beer\n1872001.com\n1873game.com\n1874.cool\n18778450600.com\n187997.com\n188.com\n188.net\n188.vip\n188158.com\n188187.xyz\n188188.org\n18837331771.com\n18856.com\n188628.com\n1888.com.mo\n18888.com\n188bifen.com\n188bio.com\n188cdn.com\n188hi.com\n188lanxi.com\n188mb.com\n188pi.com\n188soft.com\n188wan.com\n188yd.com\n189002.com\n1892139.com\n18937777777.com\n18999666.xyz\n189cha.com\n189che.com\n189cube.com\n189ebuy.com\n189jxt.com\n189qas.com\n189read.com\n189sec.com\n189smarthome.com\n189store.com\n189works.com\n189young.com\n18aa28dfd1020.beer\n18art.art\n18av.com\n18d9535531011.beer\n18dao.info\n18daxue.com\n18db5cd8710292.beer\n18dx.com\n18ebank.com\n18fd54f1b1114.beer\n18fzl.com\n18guanjia.com\n18imall.com\n18inet.com\n18ishop.com\n18istore.com\n18join.com\n18juyou.com\n18l.net\n18ladys.com\n18link.com\n18ph.com\n18q.co\n18qh.com\n18qiang.com\n18qingqu.com\n18snf.com\n18t0f515a3.com\n18touch.com\n18wk.com\n18yl.com\n18zhongyao.com\n18zhuanqian.com\n18zn.com\n18zp.com\n18zw.com\n19.com\n190.vip\n1900.live\n19000yy.com\n1900m.com\n1903beer.com\n1903it.com\n1904bus.com\n1905.com\n190757.com\n190cai.com\n19183.live.streamtheworld.com\n19196.com\n19197a01ee502e4c.com\n1919game.net\n191game.com\n192ly.com\n192sm.com\n1931.com\n1934xjzy.com\n1937china.com\n1937cn.com\n1937nanjing.org\n193839.com\n193sihu.com\n194610.xyz\n1947.cc\n1949idc.com\n194nb.com\n195155.com\n195268032591463.icu\n195idc.com\n196b7adb23969e39.com\n196g.com\n196r.gg\n197.cc\n197.com\n197232.vip\n1977088.com\n197784.com\n197854.com\n19789.com\n197924.com\n19799.com\n198358.com\n19840423.com\n198434.com\n198503.xyz\n198526.com\n1985cd.com\n1985qg.com\n1987619.com\n1987cn.com\n1987yp.com\n1988.tv\n19888.tv\n198game.net\n1990i.com\n199238.vip\n1993sc.com\n199508.com\n199604.com\n1997sty.com\n1998mall.com\n1998n.com\n1998r.com\n1999year.com\n199it.com\n199u2.com\n199yt.com\n19adulttoys.shop\n19c8.com\n19call.com\n19call.net\n19cntv.com\n19d1341dfd0a74d4.com\n19ed5ce761013.beer\n19lou.com\n19mini.com\n19mro.com\n19pay.net\n19ued.com\n19where.com\n19x19.com\n19yxw.com\n19zhan.com\n1a22.com\n1a4a282fe1010.beer\n1aa071e45acb08d2.com\n1aab715d01015.beer\n1ac6404321019.beer\n1afaecefe1014.beer\n1amen.com\n1ang.com\n1aq.com\n1auto.net\n1b0dbdb5310311.beer\n1b0y8tocaz24.com\n1b17.com\n1b1tech.com\n1b22e3a337fe5542.com\n1b3e11b2e88c6129.com\n1baf107ed1014.beer\n1blx503444.com\n1boshu1.com\n1browser.net\n1bus.net\n1c0d1n1f0l1y.cc\n1c38.com\n1c767ba9310272.beer\n1c96b435fa52e4bf.com\n1cae.com\n1caifu.com\n1caitong.com\n1card1.com\n1cdakj.com\n1cent.xyz\n1checker.com\n1chong.com\n1cloudsp.com\n1cnmedia.com\n1cno.com\n1d0b8b3d1800debe.com\n1d1d100.com\n1d21653941c21219.com\n1d9z.com\n1dao99.com\n1date1cake.com\n1dcdp4.com\n1de6de84b1017.beer\n1der-ad.com\n1diaocha.com\n1diary.me\n1drv.ws\n1dw9r53h79.com\n1e44f70c510272.beer\n1e9d98e731024.beer\n1ed3277798d157ac.com\n1f11.com\n1f1bc1d5310272.beer\n1f371be461017.beer\n1f6cd3ca611032.beer\n1f71060e75b35349.com\n1fangchan.com\n1fenlei.com\n1flash.net\n1foo.com\n1fooai.com\n1g31.com\n1gaifang.com\n1gbru.com\n1gcat.com\n1gdoutian.com\n1gesem.com\n1ggame.com\n1gow.net\n1haigtm.com\n1haitao.com\n1hangye.com\n1haogu.com\n1hdru-hls-otcnet.cdnvideo.ru\n1hkt.com\n1hourlife.com\n1hshop.com\n1huamu.com\n1huizhan.com\n1hwz.com\n1ij6ut.com\n1iptv.com\n1j1x.com\n1jbest.com\n1jh3a5806i.com\n1jiesong.com\n1jkbie336689.com\n1ju.com\n1juhao.com\n1juzi.com\n1k100.com\n1k2k.com\n1ka123.com\n1kapp.com\n1ke.net\n1kic.com\n1kkk.com\n1kmxc.com\n1kuang.com\n1kx.me\n1kxun.com\n1kyx.com\n1law.vip\n1liantu.com\n1ljx.com\n1lou.com\n1lzs.com\n1m.net\n1m3d.com\n1m85.com\n1mall.com\n1maoshua.com\n1mdoutian.com\n1menjin.com\n1mfg.com\n1miba.com\n1mishu.com\n1mit.com\n1mjz.com\n1mmbie336689.com\n1mmed.com\n1more.com\n1ms.run\n1mushroom.com\n1mutian.com\n1mxian.com\n1n1v97c96h.com\n1nami.com\n1nfinite.ai\n1nmob.com\n1nongjing.com\n1note.life\n1nyz.com\n1o1o.xyz\n1paibao.net\n1plas.com\n1pm2.com\n1ppt.com\n1pxs.com\n1q2q.com\n1qfa.com\n1qia.com\n1qianbao.com\n1qianbao.net\n1qirun.com\n1qishu.com\n1qit.com\n1qsf.com\n1r0zwootq4.com\n1r1g.com\n1renshi.com\n1safety.cc\n1sapp.com\n1shangbiao.com\n1shoucang.com\n1sj.tv\n1skp.com\n1smart.org\n1sohu.com\n1speaking.com\n1st56.com\n1stacks.net\n1stchip.com\n1styan.com\n1sw12mvkbp.com\n1szq.com\n1t.gs\n1t1t.com\n1tai.com\n1tdw.com\n1textile.com\n1ting.com\n1tjob.com\n1tong.com\n1toon.com\n1tu-design.com\n1tu.com\n1tuikem.com\n1uuc.com\n1w1w314c71.com\n1wang.com\n1xbet88.com\n1xinzulin.com\n1xlala.cc\n1xmb.com\n1y.com\n1y0g.com\n1y2y.com\n1yabc.com\n1yangai.com\n1yaoda.com\n1yb.co\n1ycdn.com\n1yd.me\n1ydt.com\n1yinian.com\n1ysh.com\n1yunhui.com\n1yyg.com\n1zhangdan.com\n1zhanshou.com\n1zhao.org\n1zhe.com\n1zhengji.com\n1zhixue.com\n1zj.com\n1zjob.com\n1zu.com\n2-33.com\n2-class.com\n2-mm.net\n2.biz\n20001104.com\n2000200.com\n200022.xyz\n2000888.com\n2000dns.com\n2000new.com\n2000y.net\n20021002.xyz\n2003996ab2b800ac.com\n2003n.cc\n2003n.com\n2006q.com\n20087.com\n2008php.com\n2008red.com\n2008zwe.com\n200call.com\n200rtu04.bar\n200wan.com\n200y.com\n200zi.com\n201061.com\n201201.com\n2012jh.com\n20130123.com\n201314520.net\n2014.mobi\n20150.net\n201551.com\n2016os.com\n2016ruanwen.com\n2016win10.com\n20170228.com\n20171117.com\n2017338.com\n20174555.com\n20188.com\n2018zjjly.com\n20191209.xyz\n2019cdac.com\n201g.com\n202014.xyz\n202030.com\n2022.work\n202271.xyz\n2022cdnpl.com\n2023.com\n2023game.com\n2024qq.com\n2025.net\n202wan.com\n203328.com\n2048ai.net\n2048sj.com\n2049baby.com\n204cloud.com\n2050life.com\n2052ce12d523062f.com\n206zz.com\n207xz.com\n2080ly.com\n2093hd.com\n2099xs.com\n20e2554096acf2c6.com\n20fl.com\n20images10.com\n20images21.com\n20images25.com\n20images7.com\n20ju.com\n20kf.com\n20on.com\n20planet.com\n20qu.com\n20xs.org\n20xue.com\n20xy.cc\n20yy.com\n20z.com\n21-sun.com\n210997.com\n210d6afa17b4823f.com\n210z.com\n2113.com\n2114.com\n2115.com\n211600.com\n21168.org\n21191.vip\n2119915.com\n211cad.com\n211d2977a10301.beer\n211hr.com\n211ic.com\n211zph.com\n212200.com\n212300.com\n212313.com\n2125.com\n212512124156.icu\n21263.net\n2128673cd1013.beer\n2130453ff61f34c1.com\n21322.org\n2133.com\n2133bbs.com\n21373.com\n2144.com\n2144gy.com\n215489736524785.icu\n2155.com\n215soft.com\n2165588.com\n216tt.com\n217.net\n21713.org\n2177s.com\n217wo.com\n21826aafe2a48426.com\n218318.com\n21869.org\n218996.com\n2189cok.com\n21ask.com\n21bcr.com\n21beats.com\n21bowu.com\n21bx.com\n21cake.com\n21cbr.com\n21cccc.com\n21ccnn.com\n21ccvn.com\n21cd.com\n21cloudbox.com\n21cn.com\n21cn.net\n21cnentmail.com\n21cnev.com\n21cnhr.com\n21cnimg.com\n21cnjy.com\n21cnjy.net\n21cnsales.com\n21cnsungate.com\n21cntx.com\n21cos.com\n21cp.cc\n21cp.com\n21ctest.com\n21cto.com\n21dagong.com\n21datasheet.com\n21deal.com\n21dianyuan.com\n21dida.com\n21dtv.com\n21ejob.com\n21eline.com\n21epub.com\n21etm.com\n21fid.com\n21food.com\n21fv52efm1.com\n21gold.org\n21good.com\n21hifi.com\n21hospital.com\n21hyzs.com\n21ic.com\n21icsearch.com\n21ido.com\n21jiao.net\n21jingji.com\n21js.com\n21kan.com\n21ks.net\n21kunpeng.com\n21ld.com\n21maoyi.com\n21mcu.com\n21mmo.com\n21mould.net\n21na.com\n21our.com\n21qa.net\n21qphr.com\n21qupu.com\n21rv.com\n21shhr.com\n21shipin.com\n21shte.net\n21sjmg.com\n21sla.com\n21so.com\n21softs.com\n21spv.com\n21tb.com\n21teacher.com\n21tjsports.com\n21tx.com\n21tyn.com\n21uv.com\n21van.com\n21viacloud.com\n21vianet.com\n21voa.com\n21wecan.com\n21wenda.com\n21wenju.com\n21xc.com\n21xcx.com\n21xfbd.com\n21xianhua.com\n21xl.info\n21xuema.com\n21yangjie.com\n21yibiao.com\n21yq.com\n21ytv.com\n21zbs.com\n22.com\n220840.com\n220c.com\n221234.xyz\n221400job.com\n22145.com\n2217.com\n221700.com\n222.com\n22221111.com\n222579.com\n22283.live.streamtheworld.com\n222abc999abc.com\n222bz.com\n222i.net\n222pcb.com\n2233488aa7.shop\n22336699.xyz\n2238202.com\n2239.com\n22393.live.streamtheworld.com\n2243.com\n22442400.com\n2247.com\n224700.com\n224837439.xyz\n224m.com\n225.cc\n2255039.com\n2258.com\n2259.com\n225f360dca52f6cf.com\n225image.com\n225image.vip\n2265.com\n226500.com\n226531.com\n226969.xyz\n226yzy.com\n2280.com\n2281wa.ren\n2288.org\n2288116ab4.shop\n228job.com\n229.com\n2295.com\n2298.com\n22ba.com\n22baobei.com\n22bw.com\n22cc0971910251.beer\n22dm.com\n22edu.com\n22hd.com\n22lianmeng.com\n22lrc.com\n22mt.in\n22n.com\n22net.com\n22plc.com\n22pq.com\n22shop.com\n22tianbo.com\n22tj.com\n22vape.com\n22vd.com\n2305.org\n230890.com\n231083.com\n231122.com\n2317.com\n231e3dffa1010.beer\n2321111.com\n232232.xyz\n2323u.com\n2323wan.com\n232485.com\n2329.com\n233.com\n2330.com\n233000.com\n2333333333333.com\n2333u.com\n23356.com\n233863.com\n2339.com\n233id.com\n233leyuan.com\n233lyly.com\n233netcloud.com\n233netpre.com\n233netpro.com\n233py.com\n233xyx.com\n2344.com\n2345.gd\n2345.net\n23456789.xyz\n23456v.com\n2345cdn.com\n2345cdn.net\n2345download.com\n2345ff.com\n2345ii.com\n2345mbrowser.com\n2345soso.com\n234du.com\n234f.com\n234f0188110291.beer\n234fang.com\n2354b5daa10311.beer\n236306.com\n236400.com\n236501.xyz\n2366.com\n23673.com\n236z.com\n2375.org\n2375sj.com\n238000.net\n238090.com\n238e22bf310251.beer\n2392fe36a1019.beer\n239300.net\n23bei.com\n23book.com\n23class.com\n23cube.com\n23dns.com\n23do.com\n23du.com\n23e489f9600657c1.com\n23e4cb2581013.beer\n23img.com\n23job.net\n23ks.com\n23luke.com\n23mofang.com\n23qb.com\n23qb.net\n23qcw.com\n23sk.com\n23txt.com\n23us.so\n23us23us.com\n23uswx.com\n23uswx.info\n23uswx.net\n23wow.com\n23wx.cc\n23wx.io\n23xsw.cc\n23ye.com\n23yy.com\n23zw.com\n240yx.com\n24198ef3f855c8ff.com\n24331.org\n24335.org\n246546.com\n246b35da610272.beer\n246ys.com\n2478.com\n248.com\n2486.org\n248xyx.com\n249m.com\n24av.com\n24bb0cd0c3b8480d.com\n24biao.com\n24dab50b3223e582.com\n24dq.com\n24geban.com\n24haowan.com\n24hmb.com\n24jiankong.com\n24k99.com\n24kplus.com\n24maker.com\n24money.com\n24om.com\n24shi.cc\n24th.com\n24timemap.com\n24u7tos.com\n24zbw.com\n250.cc\n2500.tv\n25000li.com\n2500city.com\n2500sz.com\n250340.com\n250a3526251.xin\n2512124740355.icu\n251400.com\n2523.com\n25285577.com\n253.com\n25395.vip\n253952.com\n253u.com\n2541.com\n254254.com\n254game.com\n2551aa29811031.beer\n255616.com\n2559e5f081017.beer\n255star.com\n256app.com\n256cha.com\n25752.com\n258.com\n258288.com\n25847.com\n25892.com\n258ch.com\n258en.com\n258fuwu.com\n258sd.com\n258weishi.com\n25992.com\n25az.com\n25dddaa6f10261.beer\n25dir.com\n25dx.com\n25fe391eb68e3f9c.com\n25game.com\n25nc.com\n25pp.com\n25pyg.com\n25q7ekcc67.com\n25rk.com\n25tmw.com\n25un.com\n25wy.com\n25xg.com\n25xianbao.com\n25xm.com\n25xz.com\n25yi.com\n25yz.com\n260.net\n260068.com\n26210.org\n2628liao.com\n2629.com\n263-mail.net\n263.com\n263.net\n26330a8c11017.beer\n263cv.net\n263em.com\n263fc.com\n263idc.com\n263idc.net\n263live.net\n263vps.com\n263xmail.com\n263y.com\n264006.com\n264321.com\n264400.com\n265.com\n26582.vip\n26595.com\n265g.com\n265h.com\n265xh.com\n266.com\n266.la\n266fbded61019.beer\n266wan.com\n2671111.net\n26779.org\n2677dl.com\n2678.com\n26785.org\n267pd1841t.com\n2686.com\n2688.com\n268v.com\n269.net\n26923.com\n26a9118418e77c84.com\n26c23b9f311042.beer\n26ce3e05310251.beer\n26d124fdb11032.beer\n26duc.com\n26e02ca8210272.beer\n26f4a1f8f10271.beer\n26host.com\n26joy.com\n26ks.cc\n26s.com\n26youxi.com\n270326012f82.icu\n270che.com\n270top.com\n27195.vip\n272500.com\n27270.com\n27399.com\n273u.com\n2743b3ed63ebb546.com\n27492.com\n275.com\n27512.org\n2755005.com\n277sy.com\n277t.com\n27813000.com\n2789a91661019.beer\n278wan.com\n279love.com\n279tt.com\n27al.com\n27cat.com\n27d7c9e9b3a34696.com\n27daili.com\n27l.com\n27tj.com\n27ws.com\n27xuexiao.com\n28.bet\n28.com\n281010.com\n28126.cc\n281669.vip\n281826.vip\n282626.xyz\n2827.com\n28283.com\n282g.com\n283d.com\n2848168.com\n28493.com\n2850.com\n28517.org\n2858999.com\n28715.vip\n288idc.com\n289.com\n2896.ro\n2898.com\n28beiduo.com\n28ce6d14004bae01.com\n28d4cc3671024.beer\n28d7baa3e1013.beer\n28e4cd79f1023.beer\n28eb96ed4da91317.com\n28gl.com\n28gua.com\n28ka.com\n28khy.com\n28qp.com\n28rv.com\n28sog.com\n28tui.com\n28yt.com\n28z9.com\n28zhe.com\n29029.com\n2903866.net\n291315.com\n2918.com\n29227e5771014.beer\n2925.com\n292775.com\n29293.com\n293.net\n29592.net\n296u.com\n29736.org\n29797.com\n2980.com\n29888.org\n299906.com\n29c17146910271.beer\n29c385dc5e75af06.com\n29ca702351014.beer\n29dnue.com\n29nh.com\n29xf.com\n2a965464310251.beer\n2agi.net\n2ai2.com\n2ai2.net\n2amok.com\n2apzhfa.xyz\n2av7.com\n2b079fbcd1009.beer\n2b71f0159d3b2d42.com\n2b7a44c2110251.beer\n2bbd099f5dc4d3aa.com\n2bkw.com\n2broear.com\n2bulu.com\n2bzq.com\n2c5bf25c11b8dc3e.com\n2c71b194031fc683.com\n2c883aeffbeef6c7.com\n2caipiao.com\n2ccc.com\n2chcn.com\n2cloo.com\n2cname.com\n2cq.com\n2cshop.com\n2cto.com\n2cubeglobal.com\n2cycd.com\n2cycomic.com\n2cyxw.com\n2cyzx.com\n2d1a542c1e340653.com\n2d261b4e6e641e43.com\n2d3d5d.net\n2d6cd83bf10261.beer\n2d8f1726e1d61d69.com\n2danji.com\n2db3d5c761abe51b.com\n2dcode.biz\n2df.me\n2dffbc61dea7ca0a.com\n2dfire.com\n2dfire.info\n2dmaker.com\n2dph.com\n2du.net\n2dyou.com\n2e30175771022.beer\n2e30a72a21023.beer\n2e56m039tk.com\n2ea31935add3d6b0.com\n2eb4189e6451af49.com\n2ed1fefd710272.beer\n2ed5d.com\n2ed7d8ec410271.beer\n2ee8565103abf121.com\n2eka.cloud\n2emai.com\n2f.com\n2f24ad2dc10261.beer\n2facb31bb10272.beer\n2fda37d4c10292.beer\n2fz1.com\n2gdt.com\n2gei.com\n2haha.com\n2haitao.com\n2handsmt.com\n2haohr.com\n2heng.xin\n2hu.net\n2hua.com\n2i1i.com\n2ibook.com\n2ic.cc\n2ita.com\n2itcn.com\n2j88.com\n2jianli.com\n2k27cny7hx.cfd\n2k2k.com\n2kb.com\n2kfb.com\n2kk.cc\n2kka.com\n2kno.com\n2ktq.com\n2kxs.info\n2kxs.org\n2kxy.com\n2kzw.info\n2l4938221x.com\n2lian.com\n2liang.net\n2ll.co\n2loveyou.com\n2m2j.com\n2m3m.com\n2ma2.com\n2mcnxs.cc\n2mdn-cn.net\n2mjob.com\n2mould.com\n2mpq9iu440.com\n2muslim.com\n2o.cx\n2or3m.com\n2p.biz\n2p.com\n2pcdn.com\n2q10.com\n2qsc.com\n2qupu.com\n2r3r.com\n2rich.net\n2sdx.com\n2sey.com\n2sjc.com\n2sonar.com\n2sx.net\n2t58.com\n2taobao2jd.com\n2tianxin.com\n2tt.net\n2tubaobao.xyz\n2tx.com\n2umj.com\n2urch0.info\n2urg1y.info\n2urk3j.shop\n2uroz.info\n2v8d.com\n2v9t3xf9z2.com\n2vfun.com\n2w.com\n2w.ma\n2weima.com\n2xiazai.com\n2y9y.com\n2ychem.com\n2yq.org\n2yuanyy.com\n2yup.com\n2yx8.com\n2z96vx20bx.com\n2zhan.com\n2zhk.com\n2zimu.com\n2zzt.com\n3-3.me\n3-hospital-cqmu.com\n3.biz\n30.net\n3000.com\n300033.info\n30006124.xyz\n3000api.com\n3000idc.com\n3000soft.net\n3000test.com\n3000ways.com\n3000xs.cc\n3001.net\n300113.com\n300280.com\n300624.com\n3008268.com\n300hu.com\n300ppt.com\n300zi.com\n3011.net\n3016.com\n301688.com\n301mba.com\n3023.com\n302302.xyz\n302423a641021.beer\n303c.com\n3044.com\n30583a8b910261.beer\n3062d65271020.beer\n306t.com\n3072ccba588e48d0.com\n308.app\n308.tv\n30888.com\n3099.net\n30aitool.com\n30c.org\n30cgy.com\n30daydo.com\n30fun.com\n30gaokao.com\n30ka.com\n30play.com\n30post.com\n30sche.com\n30th-feb.com\n30vps.com\n30w.co\n31062gs7f9.com\n310game.com\n310s-2520.com\n310tv.com\n310v.com\n310v.net\n310win.com\n311.biz\n311100.com\n311wan.com\n312000.net\n31260939.com\n31264.org\n312green.com\n313033.com\n313515.com\n314pay.com\n315008.com\n3150315.com\n3152018.com\n3158.com\n3158bbs.com\n315958.com\n315banzhao.com\n315che.com\n315code.com\n315dian.com\n315fangwei.com\n315hyw.com\n315i.com\n315img.com\n315mro.com\n315online.com\n315rx.com\n315tech.com\n315tsz.com\n31609.com\n31668.com\n316watches.com\n3171688.com\n317608.com\n31793.com\n317hu.com\n318595.xyz\n3188.la\n318ek.com\n318jskyycq.com\n318yishu.com\n3198.com\n31998a86110251.beer\n319d3741ad1da914.com\n31amjs.com\n31b081b851019.beer\n31b675a9cce68585.com\n31bzjx.com\n31cg.com\n31d.net\n31doc.com\n31expo.com\n31fabu.com\n31food.com\n31games.com\n31gamestudio.com\n31huiyi.com\n31i9ti.com\n31idc.com\n31jf.com\n31jgj.com\n31knit.com\n31m49.com\n31maque.com\n31meijia.com\n31ml.com\n31mold.com\n31ns.info\n31pump.com\n31rent.com\n31sf.com\n31travel.com\n31wj.com\n31xj.com\n31yarn.com\n31yr.com\n320921.com\n320g.com\n321.net\n321002.com\n321009.com\n32109.com\n321274.com\n321321321.vip\n321a6d50a1009.beer\n321ba.com\n321cad.com\n321cy.com\n321fenx.com\n321go.com\n321key.com\n321mh.com\n321sq.com\n321tips.com\n321zou.com\n3223.com\n322799.com\n322h.com\n322wl.com\n3230.com\n32331.vip\n3234.com\n3235587.com\n3237.com\n32495fe5f11042.beer\n325802.net\n3259.com\n325999.com\n3259b95be11032.beer\n3269.org\n32768k.net\n327aa34f510311.beer\n3280.com\n32800.com\n3283773e9dc5cde5.com\n3286.cc\n328f.com\n328vip.com\n3290.com\n32974z0361.com\n32a5d6351989b210.com\n32cd.com\n32ka.com\n32kan.com\n32r.com\n32rsoft.com\n32us.com\n32wan.com\n32xp.com\n33.com\n3304399.com\n3304399.net\n330d5ba0e1024.beer\n33105.com\n331234.xyz\n3320.net\n3321.com\n3322.cc\n3322.net\n3322.org\n3322032.com\n33226163.xyz\n3323.com\n33230.org\n3323399.com\n332831.com\n333-555.com\n333.com\n33315.com\n333232.xyz\n333333.com\n333333.org\n3335665.com\n33360.com\n333666999.club\n3336683.com\n3337726.com\n3337756.com\n3337782.com\n33380xl.com\n333915.com\n3339999.net\n3339auto.com\n333a51.app\n333a58.app\n333bbb777kkk.com\n333cn.com\n333com85.app\n333com89.app\n333f.com\n333iy.com\n333job.com\n333ku.com\n333rh.com\n333y3.com\n334433.xyz\n3344u.com\n334837632.xyz\n33519.com\n3356666.com\n3359.com\n33591.com\n3361.com\n33655.net\n3366.com\n3366.net\n336685.com\n336688.net\n3366886633.com\n3366img.com\n3366ok.com\n336cfe9101009.beer\n336woool.com\n337000.com\n3377577c.app\n3377751e.app\n3377999c.app\n337y.com\n3387.com\n338888.net\n3389dh.com\n33988.net\n33aml.com\n33app.net\n33bus.com\n33dy.cc\n33erwo.com\n33fang.com\n33ip.com\n33iq.com\n33jianzhi.com\n33lc.com\n33ly.com\n33map.com\n33map.net\n33oncall.com\n33out.com\n33oz.com\n33subs.com\n33tool.com\n33trip.com\n33yq.com\n34.com\n340888.com\n3419e2cbf10261.beer\n341d88b04156e9d3.com\n342200.com\n342jinbo.com\n34347.com\n343480.com\n345123.xyz\n3454.com\n3456-1.vip\n3456.cc\n3456.com\n3456.tv\n34563686.work\n34580.com\n345fk.com\n345huishou.com\n345idc.com\n3464.com\n346888.com\n346g4247o9.world\n348b60ac51011.beer\n34a14155f1016.beer\n34c5fe453528e605.com\n34f04e8d410291.beer\n34lou.com\n34wl.com\n34xian.com\n35.com\n35.net\n350.com\n350.net\n3500.com\n350200.com\n350211.net\n3503.com\n3504cde7b76a2cc9.com\n35091.cc\n350abc.net\n350c.com\n3516w.com\n35195.vip\n352.com\n3520.net\n352200.com\n3525.com\n3527.net\n353233.com\n3533.com\n35335.com\n3536.com\n35463.org\n354d7967c11032.beer\n3551.com\n3558b3020217b9a3.com\n355xx.com\n356123.com\n35617.vip\n35667.com\n3566t.com\n356884.com\n357.com\n357global.com\n358.com\n359203.com\n35941.com\n3595.com\n359798114.xyz\n35app.com\n35ba.com\n35d1.com\n35db4d2761021.beer\n35dxs.com\n35e0510ae11032.beer\n35go.net\n35inter.com\n35jk.com\n35lz.com\n35nic.com\n35pic.com\n35sf.com\n35xss.com\n35zww.com\n36-7.com\n36.cc\n36.la\n360-g.net\n360-game.net\n360-jr.com\n360.com\n360.net\n3600.net\n3600d.com\n360114.com\n360118.com\n360424.com\n360500.com\n3608.com\n360abc.com\n360adlab.com\n360adlab.net\n360adlab.org\n360aiyi.com\n360anyu.com\n360boclub.com\n360bsafe.com\n360buy.com\n360buyimg.com\n360buyinternational.com\n360byd.com\n360bzl.com\n360caifu.com\n360cdn.com\n360changshi.com\n360che.com\n360chezhan.com\n360chou.com\n360cloudwaf.com\n360daikuan.com\n360ddj.com\n360dlcdn.com\n360doc.com\n360doc.net\n360doc1.net\n360doc11.net\n360doc18.net\n360doc2.net\n360doc21.net\n360doc22.net\n360doc25.net\n360doc30.net\n360doc33.net\n360doc35.net\n360doc36.net\n360doc37.net\n360doc4.net\n360doc7.net\n360docs.net\n360doo.com\n360down.com\n360drm.com\n360eol.com\n360gann.com\n360gem.com\n360gogreen.com\n360gongju.com\n360gongkao.com\n360gtm.com\n360guanai.com\n360hapi.com\n360hifi.com\n360hitao.com\n360hqb.com\n360humi.com\n360huzhubao.com\n360hx.com\n360hy.com\n360hyzj.com\n360ic.com\n360imgcdn.com\n360insurancemall.com\n360jianzhu.com\n360jie.com\n360jinrong.net\n360jk.com\n360jq.com\n360jrjietiao.com\n360jrkt.com\n360kan.com\n360kcsj.com\n360kj.net\n360ksbd.com\n360kuai.com\n360kuaixiao.com\n360kuaixue.com\n360kxr.com\n360lion.com\n360lj.com\n360lnk.com\n360loushi.com\n360midi.com\n360mkt.com\n360os.com\n360panyun.com\n360panyun.net\n360powder.com\n360qc.com\n360qd.com\n360qhcdn.com\n360qikan.com\n360qikan.net\n360qnw.com\n360qws.com\n360qyaq.com\n360safe.com\n360safedns.com\n360sdn.com\n360shouji.com\n360shouzhuan.com\n360shuke.com\n360shuoshuo.com\n360sides.com\n360sides.net\n360simg.com\n360sjrom.com\n360sky.com\n360so.com\n360so.net\n360sok.com\n360sou.com\n360sou.net\n360soucha.com\n360sousou.com\n360sportwatches.com\n360src.com\n360sres.com\n360stamp.com\n360taojin.com\n360tianma.com\n360timg.com\n360tong.net\n360top.com\n360totalsecurity.com\n360tpcdn.com\n360tres.com\n360tuan.com\n360u9.com\n360underwear.com\n360uu.com\n360vcloud.com\n360vcloud.net\n360vrzy.com\n360webcache.com\n360wenmi.com\n360worldcare.com\n360wscdn.com\n360wulian.net\n360wyw.com\n360wzb.com\n360wzws.com\n360xh.com\n360xiaos.com\n360xiehui.com\n360xinyongka.com\n360xkw.com\n360xlab.com\n360xlab.net\n360xlab.org\n360xyws.com\n360yao.com\n360ybj.com\n360yijia.com\n360youtu.com\n360yuanshuo.com\n360yuxue.com\n360zebra.com\n360zhileng.com\n360zhushou.com\n360zhyx.com\n360zmr.com\n360zqaq.com\n360zqf.com\n360zuowen.com\n360zuqiu.com\n36130.com\n361757.com\n3618med.com\n361cv.com\n361dai.com\n361mogame.com\n361sport.com\n361zhao.com\n362.cc\n36267.vip\n363.com\n363.hk\n363.net\n363120.com\n363322014.com\n3636.tech\n363635.com\n363u.com\n364000.com\n36410.org\n36476.work\n365.com\n365.hk\n36500.net\n365128.com\n365135.com\n3652.com\n36524hua.com\n36543.com\n365500.com\n3656.com\n36578.com\n365960.com\n365autogo.com\n365azw.com\n365bh.cc\n365bj.com\n365bmc.com\n365bmw.com\n365book.net\n365cego.com\n365cgw.com\n365chanlun.com\n365chiji.com\n365css.com\n365cyd.com\n365cyd.net\n365daan.com\n365daygo.com\n365dhw.com\n365diandao.com\n365digitalonline.com\n365ditu.com\n365editor.com\n365eme.com\n365essay.com\n365f.com\n365fanyi.com\n365gangqin.com\n365gcd.net\n365gongchang.com\n365good.cc\n365heart.com\n365hele.com\n365hf.com\n365htk.com\n365huaer.com\n365huangjin.com\n365ibuy.com\n365icl.com\n365ime.com\n365j.com\n365jia.com\n365jiankang.com\n365jilin.com\n365jq.com\n365jw.com\n365jz.com\n365kan.tv\n365kandian.com\n365key.com\n365kl.net\n365liye.com\n365master.com\n365matrix.com\n365mmjg.com\n365mx.com\n365nongye.com\n365pcbuy.com\n365pingxuan.com\n365pk.com\n365pp.com\n365pr.net\n365pub.com\n365qipai365.com\n365rili.com\n365sec.com\n365sf89.com\n365shequ.com\n365sky.com\n365sydc.com\n365ta.com\n365time.com\n365ting.com\n365tkt.com\n365ttcz.com\n365tvip.com\n365vip.com\n365world.com\n365xiazai.com\n365xs.la\n365xuet.com\n365yarn.com\n365yg.com\n365you.com\n365yyf.com\n365zhaopin.com\n365zhuanrang.com\n365zmw.com\n365zsw.net\n365zzx.com\n3660bf60ab32baab.com\n36612345.com\n3663.com\n366300.com\n366666.net\n36683.com\n3669yx.com\n366club.com\n366ec.com\n366ec.net\n366kmpf.com\n366translation.com\n36706.com\n3673.com\n367edu.com\n36838.org\n36840.com\n36885.vip\n3688km.com\n368mall.com\n368tea.com\n369110.xyz\n36932.com\n36939.net\n369785.com\n3699.cc\n3699.co\n3699wan.com\n369cha.com\n369hui.com\n36ab8227e10311.beer\n36aw.com\n36dianping.com\n36dj.com\n36dong.com\n36hjob.com\n36jr.com\n36kr.com\n36kr.net\n36krcdn.com\n36krcnd.com\n36pnes36t0qs.com\n36qp.com\n36rv3j3.shop\n36tw.com\n36ve.net\n36yc.com\n36zpp.com\n37.com\n37021.com\n37051.cc\n370fd.com\n371.com\n371.net\n3710167.com\n37163.com\n371bus.com\n371love.com\n37201.com\n3721.vip\n3721520.com\n3722.com\n37274.com\n372951b2210301.beer\n3733.com\n3733game.com\n3737.com\n3737k.com\n373a5e2a6f8a3f9a.com\n373c0f3771021.beer\n373f.com\n373net.com\n373yx.com\n37439.com\n3761.com\n3768.org\n377466.com\n3774cd2332503d45.com\n379.com\n37937.com\n3794b0fa67e5f83b.com\n379art.com\n379bst.com\n37a15fd3b16897ba.com\n37biao.com\n37bjw.com\n37cbca02a1019.beer\n37cos.com\n37cu.com\n37dh.com\n37game2.com\n37gjw.com\n37gogo.com\n37hr.com\n37k.com\n37laboratory.com\n37med.com\n37pps.com\n37su.com\n37swan.com\n37tang.com\n37tgy.com\n37wan.net\n37wan.one\n37wanimg.com\n37wanwan.com\n37wanwancdn.com\n37women.com\n37www.com\n37wxwl.com\n37x4kf0q4n.com\n37yzy.com\n37zone.com\n37zp.com\n3800920.com\n3800j.com\n380852.com\n380871.com\n38109222.com\n3816.net\n3817.com\n38198.org\n381pk.com\n3822edf4d1022.beer\n38387.app\n3839.com\n38393.org\n3839apk.com\n3839app.com\n3839app.net\n3839img.com\n3839pay.com\n3839pic.com\n3839vc.com\n3839video.com\n383k.com\n383yun.com\n3851120.com\n3856.cc\n38566.org\n385k.cc\n38711.cc\n38735.vip\n388g.com\n3892222.com\n38999h.vip\n38a9018e44a7da0f.com\n38b06119b10271.beer\n38blog.com\n38ejed.com\n38film.com\n38hack.com\n38hot.net\n38hp.com\n38hzt.com\n38mhw.com\n38xs.com\n38zp.com\n39.com\n39.net\n390seo.com\n391065.com\n3911.com\n3913.com\n391k.com\n392766.net\n393.com\n3937.com\n3939339.com\n394394.com\n3949006e510272.beer\n394afb34a1020.beer\n39507037133f.icu\n39655.com\n3975ad.com\n3975ad.xyz\n3975app.com\n3975cdn.com\n3977s.com\n398423277d755d82.com\n3987.com\n3993.com\n399s.com\n39amjs.com\n39ask.net\n39b86269e11031.beer\n39b8fe8f4c6f9dee.com\n39bfe802d10292.beer\n39center.com\n39clean.com\n39cs.com\n39d83s.com\n39dg.com\n39ej7e.com\n39f6e28d71009.beer\n39fei.com\n39fengliao.com\n39h83s.com\n39hd.com\n39health.com\n39jks.com\n39kan.com\n39kf.com\n39meitu.com\n39nj8382uq.com\n39shubao.com\n39shuwu.com\n39sk.com\n39txt.com\n39yst.com\n3a2dc2bd21023.beer\n3a2studio.com\n3a4.net\n3a4b5c.com\n3afbda6f11015.beer\n3ait.com\n3alv.com\n3aok.com\n3apz.com\n3aqj.com\n3avox.com\n3b13795054e3ac5a.com\n3b1aj.info\n3b1bm3f.shop\n3b1bvrwc.info\n3b1fcl.info\n3b1xgp.shop\n3b2479faf10301.beer\n3b2o.com\n3bag.ru\n3bf.cc\n3bfc4d6861010.beer\n3bu.com\n3c1bddb4110301.beer\n3c2p.com\n3c324f3ae10241.beer\n3c3t.com\n3c4c142e21021.beer\n3c5a7b25910281.beer\n3c6a1a5d01015.beer\n3c9035c3bd9e7599.com\n3cb106206b814b15.com\n3cf6c871511032.beer\n3chongmen.com\n3cjob.com\n3conline.com\n3cpp.org\n3ct.cc\n3d-apollo.com\n3d-chips.com\n3d-gold.com\n3d-medicines.com\n3d-stereovision.com\n3d2000.com\n3d2848f7811042.beer\n3d503a99384e0d4c.com\n3d66.com\n3d7ce8a16c0f8781.com\n3d9r.com\n3daima.com\n3dbody.com\n3dbt.com\n3dbuyu.com\n3dbuyu.net\n3dcat.live\n3ddaz.com\n3ddl.net\n3ddl.org\n3deazer.com\n3debut.com\n3ded4c0f310311.beer\n3dfcs.com\n3dgali.com\n3dgenomics.org\n3dhao.com\n3dhoo.com\n3dinlife.com\n3djulebu.com\n3dkunshan.com\n3dllc.cc\n3dllc.com\n3dly.com\n3dmaxvip.com\n3dmgame.com\n3dmgame.hk\n3dmgame.net\n3dmjiasu.com\n3dmomoda.com\n3dmxku.com\n3dnew.com\n3doe.com\n3drrr.com\n3dsdce.com\n3dsjw.com\n3dsnail.com\n3dtakers.com\n3dtank.com\n3dtoo.com\n3dwebyx.com\n3dwhere.com\n3dxt.com\n3dxy.net\n3dzyw.com\n3e.net\n3e089a2bd1011.beer\n3e1f90ccd1016.beer\n3e306b2a010272.beer\n3e38c7206c1beb1a.com\n3e5da509e10271.beer\n3e6dfbe90c676f1d.com\n3ec933de211031.beer\n3echemical.com\n3edns.com\n3edu.net\n3efda91b710311.beer\n3elife.net\n3etimes.com\n3eyes.org\n3f20c121e6032c50.com\n3f4155b1310311.beer\n3f496850f89e7809.com\n3f5348d2ff43ee00.com\n3f73dbae64fefabb.com\n3f9b37df0629ada1.com\n3fahudong.com\n3fang.com\n3fantizi.com\n3fb762d23d09f297.com\n3fc5960c0be056ce.com\n3fcl8.net\n3fda.com\n3feb063cbf96bd40.com\n3fzipper.com\n3g-edu.org\n3g368.com\n3g48.com\n3g567.com\n3gbizhi.com\n3gcj.com\n3gdisk.com\n3gifs.com\n3glasses.com\n3gmfw.com\n3gogogo.com\n3gosc.com\n3gpk.net\n3gqqw.com\n3gsou.com\n3gwoool.com\n3gxk.net\n3h.com\n3h1i.com\n3h3.com\n3h77.com\n3haovip.com\n3healthcare.com\n3heyun.com\n3hhinvestment.com\n3hmedicalgroup.com\n3hmlg.com\n3incloud.com\n3ins.net\n3j3f.com\n3jdh.com\n3jhuyu.com\n3jidi.com\n3jlm.com\n3jrx.com\n3jzh.com\n3k.com\n3k3cn.com\n3ke.cc\n3kew.com\n3kid.com\n3kismet.com\n3kjs.com\n3kk.com\n3kmq.com\n3ko.com\n3kr.com\n3kyi.com\n3kzhushou.com\n3labtest.com\n3laohu.com\n3lbrand.com\n3lengjing.com\n3lmeter.com\n3lsoft.com\n3m099cey43.com\n3mbang.com\n3mh0yvx.com\n3miao.net\n3miko.xyz\n3mtw.com\n3mu.me\n3muzn.com\n3n1b.com\n3nbb.com\n3nfood.com\n3ny8.com\n3piaochong.com\n3png.com\n3polar.com\n3poo.com\n3pw.net\n3q2008.com\n3qdu.com\n3qdu.net\n3qdu.org\n3qdus.com\n3qhouse.com\n3qit.com\n3qj.com\n3qled.com\n3qqq.net\n3quan.com\n3qwe.com\n3qxsw.com\n3qzone.cc\n3r.work\n3r5y.com\n3rcd.com\n3renhe.net\n3renwx.com\n3richman.com\n3rotber.com\n3rroll.com\n3s-guojian.com\n3s.work\n3s001.com\n3s78.com\n3scard.com\n3sjt.com\n3slift.com\n3snews.net\n3songshu.com\n3sribu.com\n3srobotics.com\n3stl.com\n3sunway.com\n3swg.com\n3t3.org\n3thiku.com\n3tilabs.com\n3tinkers.com\n3tmall.com\n3treesgroup.com\n3tstore.com\n3u.com\n3ukkht3yn3.work\n3unshine.com\n3uol.com\n3us.com\n3uww.cc\n3uww.com\n3v.do\n3vjia.com\n3vjuyuan.com\n3vsheji.com\n3wcoffee.com\n3wen.com\n3wfocus.com\n3wft.com\n3wka.com\n3wmm.com\n3wyk.com\n3x6gr4f829.com\n3x7.com\n3xgd.com\n3xiaoniao.com\n3xiazai.com\n3xinhome.com\n3xyg.com\n3y1.com\n3y7h.com\n3yakj.com\n3yoqu.com\n3yt.com\n3yt.la\n3yun.net\n3ywepvs8n1.com\n3yx.com\n3zbsy.com\n3zhijk.com\n3zhm.com\n3zmuseum.com\n3zonegame.com\n4-xiang.com\n4.biz\n4.plus\n400-lighting.com\n400.com\n40000-30000.com\n4000011520.com\n4000022282.com\n4000034168.com\n4000066666.com\n4000156651.com\n4000278400.com\n4000286188.com\n4000500521.com\n4000730138.com\n4000773040.com\n400078.com\n4000892990.com\n4000979797.com\n4000kbpe.bar\n4001006666.com\n4001113900.com\n4001180057.com\n400123.com\n4001581581.com\n4001817899.com\n4001890001.com\n4001961200.com\n400301.com\n400332.com\n40035.com\n400388.com\n4006055885.com\n4006216888.com\n4006300457.com\n4006339177.com\n4006510600.com\n4006631958.com\n4006695539.com\n4006758160.com\n4006787252.com\n4006800660.com\n4006806555.com\n4006906600.com\n4007051668.com\n4007108885.net\n4007112366.com\n4007123123.com\n4007777958.com\n4008-197-197.com\n4008000000.com\n4008005216.com\n4008075595.com\n4008100800.com\n4008103103.com\n4008107107.com\n4008109886.com\n4008117117.com\n4008123123.com\n4008258399.com\n4008338788.com\n4008600011.com\n4008618618.com\n4008787706.com\n4008800016.com\n4008824365.com\n4008863456.com\n4008880999.com\n4008880999.net\n4008885818.com\n4008cn.com\n4009.com\n4009515151.com\n4009870870.com\n4009991000.com\n400cx.com\n400dianhua.com\n400gb.com\n400ja.com\n400kaoyan.vip\n400lyw.com\n400num.com\n400qikan.com\n400taocan.com\n400vv.com\n400web.com\n4020.la\n40407.com\n404886.com\n404mzk.com\n404wan.com\n404youxi.com\n405400.com\n407wan.com\n4080517.com\n408399.com\n408399.net\n4087b09ee4632bb5.com\n408cf42720d8be86.com\n408ec542b10281.beer\n409a1957110311.beer\n409c27e4c1015.beer\n409d0a7b710241.beer\n40bw71.ren\n40c53fc1d11021.beer\n40cb.com\n40images15.com\n40images16.com\n40le.com\n40sishi.com\n40xk.com\n411-hospital.com\n41113.com\n41163.org\n41188.com\n41188844.com\n411au.com\n4132c3c4011021.beer\n413cd5ac210291.beer\n413xkyd.com\n414500.net\n416548ebbf96c1b9.com\n4166.net\n41739b0aa10301.beer\n417628.org\n4177.com\n41818.net\n419600.com\n419g.com\n41game.com\n41gw.com\n41huiyi.com\n41ms.com\n41wan.com\n41xt.com\n420d586841024.beer\n42144.com\n421db96b91011.beer\n42224b3c51016.beer\n422425.xyz\n422877.com\n4234.org\n4234cdn.com\n4234q.com\n42353.com\n423down.com\n4243.net\n425300.co\n425yx.com\n426.ltd\n42736c12558acabf.com\n4275.com\n429006.com\n42ed983e61019.beer\n42how.com\n42trip.com\n42verse.shop\n42xz.com\n430d6eba715dabb4.com\n4311.com\n432.com\n432520.com\n432b4376611021.beer\n43439g.com\n435000.com\n435200.com\n4355.com\n43578.com\n436400.com\n4366.com\n4366aa.com\n4366ga.com\n4366game.com\n4366pk.com\n4377.com\n437zhifu.com\n43803a8c410261.beer\n4393ce88a10272.beer\n4395e6c8b10291.beer\n4399-xyx.com\n4399.com\n4399.net\n43999yx.com\n4399api.com\n4399api.net\n4399biule.com\n4399data.com\n4399dmw.com\n4399doc.com\n4399er.com\n4399hdhh.com\n4399hhh.com\n4399i.net\n4399inc.com\n4399j.com\n4399mail.com\n4399pk.com\n4399sj.com\n4399swf.com\n4399sy.com\n4399wanju.com\n4399xyx.com\n4399youpai.com\n4399youxi.com\n4399yyy.com\n4399zmxy.com\n439f2bbb180aecab.com\n43cv.com\n43ns.com\n43xs.com\n43yl.com\n43zhubao.com\n4417.com\n44290f2c9bce56ed.com\n4444.cc\n44440fd0d212bb76.com\n4444448.com\n4445156.com\n44460.com\n44481.org\n444888qq.com\n4450044.com\n4450055.com\n4451199.com\n4451818.com\n44552003.com\n446dca1e17538cf6.com\n44719.org\n44749.net\n4480.cc\n4484.win\n44878s.com\n4488e4460a95a041.com\n448cee8738b7860d.com\n449393.vet\n44971.com\n44983.com\n4499.com\n44ff56d11fa53a9a.com\n44h.co\n44hr.com\n44iuno85gr.com\n44jj.com\n44pq.cc\n44vs.com\n4502512122531.icu\n4506ecebe10292.beer\n45077.one\n450926731.xyz\n451057365.xyz\n451f46bd110281.beer\n453400.com\n453600.net\n45451.com\n4546.org\n455522.com\n45560ll.com\n45575.com\n45592.com\n455a525cfff81301.com\n456.net\n45656666.com\n456jy.com\n456ss.com\n456tt.com\n457.com\n457557.com\n4587.com\n4587c00611011.beer\n458kq.com\n459.org\n45app.com\n45fan.com\n45inst.com\n45io.com\n45it.com\n45ns.com\n45r.com\n45te.com\n45win.com\n45xie.com\n45yx.com\n461000.net\n462.com\n46245fb7d43c13a3.com\n46412.com\n4644440.vip\n46576.org\n46644.com\n46721.org\n46771313.com\n46809.org\n4687794fd9.com\n46940.vip\n4694393.com\n46ab3da510d4ccaf.com\n46cdn.vip\n46d7940171014.beer\n46eadc71881fb97a.com\n46mlsv.com\n46ny920931.com\n46ps.com\n46xs.com\n4714da8871019.beer\n471f94eab9784273.com\n47295.com\n472ac621b11032.beer\n4735.com\n47365.com\n473787.com\n4738.com\n47462.org\n47473.com\n474b.com\n4765.com\n47787.com\n4779.com\n47819.com\n478bc6c1c10301.beer\n47964154c11021.beer\n479d8573510301.beer\n47daili.com\n47e17a13ee18fa43.com\n47gs.com\n47oupy0408.com\n47rq.com\n47zu.com\n480.cc\n480.hk\n4805555.com\n480e7c558d3d8aaa.com\n48251413f10281.beer\n48267.com\n48455m.com\n4846.com\n4848360.com\n48575.com\n48670.vip\n4869.cc\n487.com\n4871.org\n4888.com\n4888033.com\n4888777a14.shop\n4888g.vip\n48905.com\n48cdn.vip\n48hao.net\n48log.com\n49.com\n491.com\n4916a68576d64a34.com\n492288.com\n492f2622e64c138e.com\n4930.com\n49333g.com\n49333j.com\n49358.com\n493601.com\n49363.com\n49377.work\n4937711.com\n495.cc\n495495.com\n49568009.com\n4957b5fd7265b790.com\n496db29b7745a79c.com\n497-img.com\n497.com\n498.net\n499-img.com\n499n.com\n499youxi.com\n49app.com\n49e7fb6261023.beer\n49eb891471010.beer\n49ko.com\n49ms.net\n49pic.com\n49r5eoqrd2.com\n49vps.com\n49xia.com\n49you.com\n49yu.com\n49zz1110002a4.shop\n4a38863a11017.beer\n4a4779c371024.beer\n4abb.com\n4ading.com\n4anet.com\n4apx.com\n4aqq.com\n4b036c92244f5b1b.com\n4b145a7b110292.beer\n4b4d913d9b6506e9.com\n4b784b66f10311.beer\n4b9953f631024.beer\n4ba69ed8e10292.beer\n4bf85b0f61014.beer\n4c28539c4f10ad16.com\n4c37ebc131010.beer\n4c43edd99cd8bb40.com\n4c4866d8179d6f70.com\n4c55033b91010.beer\n4c5p021888.com\n4c645708fabd0e13.com\n4ccd82a0d11031.beer\n4ci.cc\n4cm.cc\n4cnzz.com\n4cun.com\n4d2bc4d7311031.beer\n4d458710811011.beer\n4d64c7aff11031.beer\n4dai.com\n4db.com\n4de7ab130011974d.com\n4dec3cfc0794efb4.com\n4do71q84l1.com\n4dwan.com\n4e0e47ea71022.beer\n4e6fe7920a044f98.com\n4e7e414fd1015.beer\n4ebf1036c1010.beer\n4ee.ee\n4ef06207210281.beer\n4ef870db01022.beer\n4eglwkq.com\n4everdns.com\n4ewriting.com\n4f0b987b410311.beer\n4f411973f14e0f10.com\n4f61.com\n4f68340f5b6c21a9.com\n4f89.com\n4f9bf1e673931484.com\n4fang.net\n4fd4969ff1022.beer\n4fe55e9f6c893405.com\n4ggogo.com\n4gh6.com\n4glte.org\n4gqp.com\n4gtoefl.com\n4h6s.com\n4hgame.com\n4hii.net\n4hmodel.com\n4hpy.com\n4inlook.com\n4jplus.com\n4k123.com\n4kbizhi.com\n4kdesk.com\n4kgood.com\n4kgou.com\n4kya.com\n4l.hk\n4lzr.com\n4ndwc.com\n4o.org\n4pf6hb.com\n4pis.com\n4pnt.com\n4portun.com\n4px.com\n4pyun.com\n4q5q.com\n4qx.net\n4s4c0dw764.com\n4sai.com\n4sender.com\n4sender.net\n4sjob.com\n4sscrm.com\n4startime.com\n4tdf.com\n4thetooth.com\n4thworkshop.com\n4to66.com\n4u1mx79nlw.com\n4u4v.net\n4w8.net\n4xiaoshuo.info\n4xiaoshuo.org\n4xseo.com\n4xx.me\n4y4.net\n4ye.cc\n4yt.net\n4yx.com\n4zt.com\n5-link.com\n5.biz\n50-jia.com\n500.com\n5000.com\n50004.com\n5000yan.com\n50011114.com\n50014455.com\n50016666.com\n50018.com\n50027.com\n500cache.com\n500d.me\n500doc.com\n500du.com\n500fd.com\n500gm.com\n500hj.com\n500px.me\n500talk.com\n500tb.com\n500wan.com\n500wancache.com\n500zhongcai.com\n5011.net\n501h.com\n501wan.com\n502258.com\n50257e08d1015.beer\n5026p06ot6.com\n503118.com\n50331.net\n5033333.com\n503b2f379abaf979.com\n503error.com\n505035.com\n5054399.com\n5054399.net\n505uu.com\n5066.com\n506u5nf5j5.com\n50747.com\n507c7d240b2eae97.com\n5087.com\n508hdsys.com\n508mallsys.com\n508sys.com\n50915.org\n50970.com\n50bangzh.com\n50cnnet.com\n50dacaaf86cda9cb85ee95577c9a522bf.com\n50pk.com\n50sht.com\n50vm.com\n50xiao.com\n50yc.com\n50yu.com\n50zi.com\n50zw.co\n50zw.net\n51-cf.com\n51-jia.com\n51-visa.com\n51.am\n51.com\n51.net\n5100.net\n51015kid.shop\n51056.org\n510560.com\n510erp.com\n510hb.com\n510xds.com\n510you.com\n51110.com\n51119.com\n5117.com\n511718.com\n5117sell.com\n5118.com\n5118img.com\n5119.net\n511m.com\n511mv.com\n511wan.com\n511wh.com\n511wx.com\n511yj.com\n512.vip\n5120.com\n5120bb.com\n51230.com\n51234g7.com\n51269017.com\n51298888.com\n512test.com\n512wx.com\n512youxi.com\n5132.com\n513337.com\n5137.cc\n51386.com\n5138zhuan.com\n513zp.com\n513zz.com\n514193.com\n514200.com\n5144wan.com\n51508.com\n51511.com\n5151888.xyz\n5151app.com\n5151sc.com\n5153.com\n51555.net\n51569.com\n5156lunwen.com\n5156xz.com\n51589.com\n5158wan.com\n515app.com\n515car.com\n515fa.com\n515ppt.com\n51643.com\n51656582.com\n51658042.com\n5166.info\n51661182.com\n5166ys.com\n516edu.com\n516ly.com\n516lyw.com\n5170d.com\n5173.com\n5173cdn.com\n51766.com\n5177cq.com\n517best.com\n517cdn.com\n517dv.com\n517ee.com\n517gf.com\n517hotel.com\n517huwai.com\n517idc.com\n517japan.com\n517job.com\n517la.com\n517la.net\n517lppz.com\n517mh.net\n517ming.com\n517mr.com\n517na.com\n517office.com\n517sc.com\n517tez.com\n517xc.com\n51802.com\n5184.com\n5184pass.com\n5185.cc\n51864.com\n51870.com\n5187g.com\n5188.com\n518doc.com\n518h48fwg6.com\n518yp.com\n51926.org\n51969.com\n51985.net\n5199.cc\n5199.com\n51990d860a03b055.com\n5199yx.com\n51a.co\n51aiclk.com\n51aimei.com\n51aiwan.com\n51app.com\n51art.com\n51ask.org\n51asm.com\n51asp.net\n51aspx.com\n51auto.com\n51autocar.net\n51autogo.com\n51awifi.com\n51b2b.com\n51babybuy.com\n51baigong.com\n51banban.com\n51banka.net\n51baocan.com\n51baoshui.com\n51bbcy.com\n51bbmm.com\n51bbo.com\n51besttea.com\n51bi.com\n51biaoqing.com\n51bidlive.com\n51bike.com\n51biz.com\n51bjrc.com\n51bmb.com\n51bokao.com\n51bonli.com\n51book.com\n51boshi.net\n51bras.com\n51bsi.com\n51bushou.com\n51buy.com\n51bxg.com\n51bzi.com\n51caiyou.com\n51callcenter.com\n51callu.net\n51camel.com\n51caocao.net\n51ccd.com\n51ccdn.com\n51cck.com\n51ccn.com\n51cdn.com\n51cdngo.com\n51cfm.com\n51cg.com\n51chang.com\n51changdu.com\n51changdu.xyz\n51changxie.com\n51chaoshang.com\n51chost.com\n51chouqian.com\n51chuanpiao.com\n51chuli.com\n51cir.com\n51cjyy.com\n51ckjr.com\n51clc.com\n51cmm.com\n51cnhr.com\n51cocoa.com\n51code.com\n51coma.com\n51comp.com\n51company.com\n51cosmo.com\n51cpm.com\n51create.center\n51credit.com\n51csr.com\n51cto.com\n51cube.com\n51cunzheng.com\n51cxsoft.com\n51czapp.com\n51dai.com\n51daifu.com\n51daima.com\n51daka.com\n51dangpu.com\n51daxueedu.com\n51dc.com\n51dcgg.com\n51dcw.com\n51device.com\n51dfc.com\n51diangu.com\n51diantang.com\n51diaocha.com\n51din.com\n51dingxiao.com\n51ditu.com\n51diyring.com\n51dmq.com\n51dns.com\n51docs.com\n51dojoy.com\n51dpub.com\n51drv.com\n51dszn.com\n51dugou.com\n51dz.com\n51dzrc.com\n51dzt.com\n51dzw.com\n51ean.com\n51ean.xin\n51easymaster.com\n51eb0685c11021.beer\n51ebo.com\n51ebooks.com\n51eduline.com\n51eim.com\n51eins.com\n51ejz.com\n51ekt.com\n51ele.net\n51emin.com\n51emo.com\n51en.com\n51epei.com\n51eshop.com\n51etong.com\n51etr.com\n51f.com\n51facai.com\n51fangan.com\n51fangfu.com\n51fanli.com\n51fanli.net\n51fbpay.com\n51feibao.com\n51feitu.com\n51feiyu.com\n51fiber.net\n51finace.com\n51findwork.com\n51fire.xyz\n51fl.com\n51fpg.com\n51fsw.com\n51fubei.com\n51fucai.com\n51fund.com\n51fxkj.com\n51fxzq.com\n51fytx.com\n51g3.com\n51g3.net\n51g4.com\n51gaifang.com\n51gamecard.com\n51ganjie.com\n51gaoji.com\n51gaoxiao.com\n51garlic.com\n51gdrc.com\n51gh.net\n51give.org\n51gjie.com\n51gjj.com\n51golife.com\n51gonggui.com\n51goods.vip\n51gouke.com\n51gowan.com\n51gox.com\n51gran.com\n51grb.com\n51grfy.com\n51growup.com\n51gszr.com\n51guanhuai.com\n51guoji.com\n51gzgk.com\n51h.co\n51h5.com\n51hailang.com\n51hanghai.com\n51hangkong.com\n51haojob.com\n51hbjob.com\n51hchc.com\n51hcw.com\n51hei.com\n51hejia.com\n51hgtg.com\n51hhjy.com\n51hicard.com\n51hika.com\n51hjk.com\n51hlife.com\n51hlife.net\n51homemoney.com\n51hosting.com\n51hostonline.com\n51houniao.com\n51hr.com\n51huaji.com\n51huanhuan.com\n51hunningtu.com\n51huoyou.com\n51hwzy.com\n51ibm.com\n51idc.com\n51ideal.com\n51ifind.com\n51ifonts.com\n51ima.com\n51img1.com\n51img2.com\n51img3.com\n51img5.com\n51img6.com\n51img7.com\n51img9.com\n51imo.com\n51ipc.com\n51ischool.com\n51itapp.com\n51itstudy.com\n51iwifi.com\n51ixuejiao.com\n51jb.com\n51jiabo.com\n51jiameng.com\n51jiang.com\n51jianxie.com\n51jiaoxi.com\n51jiecai.com\n51jiemeng.com\n51jingying.com\n51jinkang.com\n51jishu.com\n51jiuhuo.com\n51job.com\n51jobapp.com\n51jobcdn.com\n51jobdns.com\n51js.com\n51jt.com\n51jucaimi.com\n51juhe.com\n51jujibao.com\n51julebu.com\n51junde.com\n51junshi.com\n51kanmanhua.com\n51kanong.com\n51kaola.net\n51kaxun.com\n51kehui.com\n51kf100.com\n51kids.com\n51kik.com\n51kim.com\n51kshen.com\n51kt.com\n51kuaizhuan.com\n51kupin.com\n51kywang.com\n51la.ink\n51labour.com\n51laibei.com\n51laiqiang.com\n51langtu.com\n51laohe.com\n51ldb.com\n51ldzx.com\n51lepai.com\n51lesheng.com\n51lg.com\n51lingji.com\n51liucheng.com\n51losangeles.com\n51lstt.com\n51lucy.com\n51lxrc.com\n51lzr.com\n51mag.com\n51maiquan.com\n51marryyou.com\n51mch.com\n51mdd.com\n51mdq.com\n51meeting.com\n51meigu.com\n51meiliao.com\n51meishu.com\n51miaoxin.com\n51microshop.com\n51miduoduo.com\n51miit.com\n51minsheng.com\n51miz.com\n51mmt.com\n51mnq.com\n51mo.com\n51mochu.com\n51mockup.com\n51mokao.com\n51mole.com\n51moot.net\n51mpa.net\n51mrp.com\n51msc.com\n51mta.com\n51nearby.com\n51newsapp.com\n51niux.com\n51nod.com\n51nwt.com\n51offer.com\n51open.net\n51opone.com\n51ops.com\n51p.co\n51panhuo.com\n51papers.com\n51passion.com\n51peptide.com\n51pgzs.com\n51photo.vip\n51php.com\n51piao.com\n51piaohua.com\n51pibu.com\n51pigai.com\n51ping.com\n51pinwei.com\n51pla.com\n51pocket.com\n51pocket.net\n51poll.com\n51pos.com\n51pot.com\n51poweron.com\n51pptmoban.com\n51psj.com\n51puer.com\n51qc.com\n51qc.net\n51qianduan.com\n51qianguo.com\n51qianvisa.com\n51qicheng.com\n51qingjiao.com\n51qixing.net\n51qqt.com\n51qtg.com\n51qub.com\n51qudao888.com\n51qumi.com\n51quzhe.com\n51race.com\n51rc.com\n51read.site\n51recovery.com\n51relaw.com\n51rencai.com\n51render.com\n51renpin.com\n51rich.net\n51rong.com\n51room.com\n51rp.com\n51rry.com\n51rumo.com\n51rxzc.com\n51rz.org\n51sai.com\n51sanhu.com\n51sao.net\n51school.com\n51scw.net\n51sdj.com\n51sdx.com\n51search.net\n51seer.com\n51select.com\n51self.com\n51selling.com\n51sgg.cc\n51share.net\n51shashiji.com\n51shebao.com\n51shengxue.com\n51shenzhouyun.com\n51sheyuan.com\n51shizhi.com\n51shop.ink\n51shoubei.com\n51shoufei.net\n51shoushi.com\n51shubiao.com\n51shuobo.com\n51shyc.com\n51signing.com\n51sjht.com\n51sjm.com\n51sjsj.com\n51sjyx.com\n51sole.com\n51soulou.com\n51speeds.com\n51spjx.com\n51ssl.com\n51ste.com\n51sucaiyuan.com\n51suitui.com\n51sutong.com\n51sytx.com\n51szhk.com\n51talk.com\n51talkenglish.com\n51tanbao.com\n51tao.com\n51taonan.com\n51taoshi.com\n51taoshi.org\n51taowei.com\n51taoyang.com\n51tas.com\n51tb.me\n51tbox.com\n51test.net\n51testing.com\n51testing.net\n51testing.org\n51tgb.com\n51tiancai.com\n51tiangou.com\n51tie.com\n51tietu.net\n51tijian.com\n51tingyi.com\n51tiqianle.com\n51tjhr.com\n51togic.com\n51tonglu.com\n51tools.info\n51touch.com\n51toufang.com\n51tour.com\n51touxiang.com\n51toys.store\n51tra.com\n51tracking.com\n51trust.com\n51tuiyi.com\n51tunhuo.com\n51tv.com\n51tv.net\n51tvbao.com\n51tvrom.com\n51txapp.com\n51tys.com\n51tyty.com\n51tz.com\n51u.co\n51uc.com\n51ukf.com\n51uyi.com\n51vhost.net\n51vimeo.com\n51vip.biz\n51vv.com\n51vv.net\n51vv2.com\n51w.co\n51wangdai.com\n51wangming.com\n51wangpi.com\n51wanquan.com\n51wanxue.com\n51wcad.com\n51wcity.com\n51web.com\n51weblove.com\n51websec.com\n51weihu.com\n51weishi.com\n51weitao.net\n51wendang.com\n51wenzy.com\n51wf.com\n51wincai.com\n51windows.net\n51wj.com\n51wnl-cq.com\n51wnl.com\n51world.win\n51wp.com\n51wtp.com\n51wxjz.com\n51wydj.com\n51wyfl.com\n51wzg.com\n51wzxz.com\n51xbx.com\n51xcr.com\n51xcrc.com\n51xiancheng.com\n51xianwan.com\n51xiaolu.com\n51xingjy.com\n51xinhu.com\n51xinyuan.com\n51xnj.com\n51xuanmu.com\n51xuanxiao.com\n51xuanzhu.com\n51xue8.com\n51xuediannao.com\n51xuetang.com\n51xuetongxin.com\n51xuexiaoyi.com\n51xxsp.com\n51y5.com\n51yabei.com\n51yajk.com\n51yanwang.com\n51yey.com\n51yhdai.com\n51yhgj.com\n51yidun.com\n51yilu.com\n51ying.net\n51yip.com\n51ykb.com\n51ym.me\n51ymxc.com\n51ynedu.com\n51yonggao.com\n51you.com\n51youdian.com\n51yougo.com\n51youpin.com\n51youth.com\n51ys.com\n51ytg.com\n51yuansu.com\n51yuepin.com\n51yueqian.com\n51yugou.com\n51yund.com\n51yundong.me\n51ywx.com\n51yxcyy.com\n51yxky.com\n51yxwz.com\n51zan.com\n51zd.net\n51zghbh.com\n51zhangdan.com\n51zhantai.com\n51zheduoduo.com\n51zhi.com\n51zhishang.com\n51zhituwang.com\n51zhizhao.com\n51zhucai.com\n51zixiu.com\n51zjedu.com\n51zjxm.com\n51zmt.net\n51znt.com\n51znyx.com\n51zr.com\n51zsb.net\n51zsjc.com\n51ztzj.com\n51zwd.com\n51zx.com\n51zxw.net\n51zywl.com\n51zyzy.com\n51zzl.com\n51zzyjs.com\n52-ic.com\n52.vip\n520.com\n520.net\n5200tv.com\n520101.com\n520520520520520.com\n520730.com\n520740.com\n520810.xyz\n52091w.com\n520cc.com\n520cfc.com\n520chs.com\n520code.net\n520diandu.com\n520gexing.com\n520hello.com\n520hhht.com\n520homo.com\n520hspfb.com\n520im.com\n520it.com\n520lbl.com\n520link.com\n520love520.com\n520lpy.com\n520mingmei.com\n520mojing.com\n520ok.net\n520qr.net\n520switch.com\n520touxiang.com\n520txtba.com\n520way.com\n520xiazai.com\n520xp.com\n520xy8.com\n520yidui.com\n520zc.com\n520zg.net\n5210601.com\n52112.com\n5211game.com\n521251212122.icu\n52161.org\n52177.com\n521799.xyz\n521dayu.com\n521g.com\n521led.com\n521logo.com\n521qw.com\n521szlx.com\n521u.com\n521up.com\n521watch.com\n521xunlei.com\n52237377.com\n522de.com\n522gg.com\n523333.com\n52372.com\n5238333.com\n52393.com\n523c8cb891010.beer\n523touzi.com\n52419.net\n524399game.com\n525.life\n525069.com\n5251yx.com\n52524118.com\n5252b.com\n5253.com\n525566.com\n5258.net\n5258da.com\n525zb.com\n526183.com\n526266.com\n526537.xyz\n52676.com\n526net.com\n527100.com\n52733999.com\n5277.com\n527fgame.com\n527ice.com\n527meeting.com\n527ss.com\n528045.com\n5281.net\n52841819.com\n528500.com\n528529.com\n52892.com\n528day.com\n52969.com\n52ai.com\n52ali88.com\n52alipay.com\n52aoteman.com\n52appok.com\n52asus.com\n52audio.com\n52bar.com\n52bishe.com\n52bjd.com\n52bji.com\n52bjy.com\n52blog.net\n52bluetooth.com\n52bus.com\n52bwg.com\n52by.com\n52caiyuan.com\n52car.net\n52ce.com\n52ch.net\n52cha.com\n52che.com\n52cik.com\n52ckd.com\n52click.net\n52cmajor.com\n52cnp.com\n52cnw.net\n52code.store\n52codes.net\n52cv.com\n52da.com\n52dangong.com\n52debug.net\n52design.com\n52desk.com\n52dian.com\n52dianbo.com\n52digua.com\n52dmtp.com\n52doc.com\n52dsy.com\n52dtv.com\n52dus.com\n52duzhe.com\n52dy.tv\n52dyy.com\n52dzxy.com\n52edns.com\n52edy.com\n52enku.com\n52eshu.com\n52etf.site\n52fangzi.com\n52fanxing.com\n52feijuba.com\n52fzwg.com\n52gaoge.com\n52gaoxiao.com\n52gg.com\n52ggd.com\n52gongju.net\n52grz.com\n52guzhuang.com\n52gvim.com\n52hardware.com\n52hb.com\n52hbl.com\n52hejia.com\n52help.net\n52hotel.net\n52hrtt.com\n52hrttpic.com\n52huaqiao.com\n52hwl.com\n52hxw.com\n52hyjs.com\n52ig.net\n52im.net\n52investing.com\n52inwet.com\n52ios.xyz\n52itstyle.vip\n52jdyy.com\n52jianpan.com\n52jiaoshi.com\n52jiaozhou.com\n52jiawei.com\n52jingsai.com\n52jinhu.com\n52jisu.com\n52jj.net\n52jrjy.com\n52js8.com\n52jscn.com\n52jubensha.com\n52juqingba.com\n52jxrc.com\n52jxt.com\n52kan.vip\n52kanxiaoshuo.com\n52kd.com\n52kejian.com\n52kfly.com\n52leho.com\n52liaoshen.com\n52liezheng.com\n52life.cc\n52linglong.com\n52lion.com\n52luohu.com\n52lvyou.com\n52m.co\n52mac.com\n52magic.net\n52maicong.com\n52mba.com\n52meirong.com\n52mengdong.com\n52met.com\n52mhw.com\n52miji.com\n52mip.com\n52ml.net\n52mqbiao.com\n52mtc.com\n52muban.com\n52muyou.com\n52mvp.com\n52nantong.net\n52niuka.com\n52njl.com\n52nyg.com\n52pcfree.com\n52photo.com\n52pht.com\n52pi.com\n52pi.net\n52pictu.com\n52pk.com\n52pk.net\n52pkvr.com\n52playgame.com\n52pojie.com\n52post.com\n52ppt.com\n52qixiang.com\n52qmct.com\n52qqba.com\n52queji.com\n52qumao.com\n52qupu.com\n52ra3.com\n52ranwen.net\n52rd.com\n52rental.com\n52rsjy.com\n52ruodian.com\n52samsung.com\n52shanghe.com\n52shangou.com\n52shehua.com\n52shici.com\n52shihu.com\n52shipping.com\n52shuw.cc\n52shuxue.com\n52solution.com\n52songshu.com\n52souluo.com\n52suda.com\n52survey.com\n52svip.cc\n52swine.com\n52t1.com\n52tc.co\n52tc.info\n52tesla.com\n52tgfc.com\n52thing.com\n52tian.net\n52tiny.com\n52tong.com\n52toolbox.com\n52toys.com\n52tps.com\n52tt.com\n52tup.com\n52tzs.com\n52udl.com\n52uhs.com\n52vps.com\n52w.co\n52wana.com\n52wanh5.cc\n52wenku.com\n52wlw.com\n52wmb.com\n52wower.com\n52wubi.com\n52xcyx.com\n52xianbao.com\n52xiaoshuowang.com\n52xie.com\n52xitong.com\n52xiuxian.com\n52xsj.com\n52xuexi.net\n52xydl.com\n52xz.com\n52yawa.com\n52ybcj.com\n52yh.com\n52yitian.com\n52ykjob.com\n52youbian.com\n52youju.com\n52youpiao.com\n52youtu.com\n52yq.com\n52yushi.com\n52yuwan.com\n52ywan.com\n52yxyx.com\n52yyxk.com\n52z.com\n52zhaopin.com\n52zhifu.com\n52zixue.com\n52zjkj.com\n52zx.cc\n52zx.net\n52zxw.com\n52zy.com\n5306.com\n5308999.com\n53155.vip\n531pool.com\n532106.com\n53233.org\n532588.com\n533.com\n53326.com\n5334.com\n5338.org\n533y.com\n53431.com\n5345.com\n53471.com\n534d73a9411032.beer\n535fs.com\n535v.com\n5366.com\n5367.com\n5368111.com\n537300.com\n53797.vip\n537images20.com\n537images22.com\n537images41.com\n537images42.com\n537images45.com\n537images47.com\n5385s.com\n538618.com\n538a9b8b890bff34.com\n53920.net\n5395.com\n53957.tw\n53981.org\n539831.vip\n53af08566e5d84ef.com\n53ai.com\n53c0083250a165d1.com\n53chewu.com\n53dns.com\n53dns.net\n53dns.org\n53ee.com\n53info.com\n53iq.com\n53miji.com\n53museum.org\n53nic.com\n53q517g14c.world\n53shop.com\n53shubiao.com\n53site.com\n53wan.com\n53win555.com\n53wy.com\n53xjd.com\n53yu.com\n53zaixian.com\n53zw.net\n54.com\n54.net\n5401da8c911031.beer\n5406622.com\n5406633.com\n540734621.xyz\n54114.com\n5414050.com\n5414900.com\n54268.com\n5433.com\n54391.com\n54406c82bf7d5705.com\n5442.com\n544521.xyz\n544e5adac11012.beer\n54540333.com\n54543.org\n545c.com\n546709.cc\n5467b.vip\n54780.org\n54948888.vip\n5499.com\n5499ok.com\n54ak.com\n54b03611f10271.beer\n54banana.com\n54benniao.com\n54doctor.net\n54doctors.net\n54dr.com\n54hcz.com\n54heb.com\n54im.com\n54jkw.com\n54job.com\n54ks.com\n54lol.com\n54maimai.com\n54md.com\n54mdown.com\n54op.com\n54pictu.com\n54traveler.com\n54tup.com\n54watch.com\n54xiaoshuo.com\n54young.com\n54youshi.com\n54yt.net\n54yuqing.com\n55.cc\n55.com\n5500w.com\n550400.com\n550416.com\n5508.net\n5509.cc\n550d93f291021.beer\n5510928.com\n55114008.com\n551144.com\n55188.com\n55188.net\n551d811bb4ddf283.com\n5525game.com\n553356.com\n55344.com\n554030cc.com\n554488.com\n5548.net\n554baad62c869a7b.com\n55555.ink\n55555.io\n55555432.com\n55555558.com\n5555622ab0.shop\n5559000ab0.shop\n5559000ab7.shop\n555abc222abc.com\n555abc777abc.com\n555edu.net\n555tg6s98w9d8sw.com\n555yst.com\n5566.net\n5566292.com\n5566362.com\n5566592.com\n5566596.com\n5566752.com\n5566975.com\n5567.me\n556z.com\n557.net\n55706.com\n55749.net\n557666a.com\n5577.com\n5577169.com\n5577199.com\n5577292.com\n5577375.com\n5577408.com\n5577411.com\n5577552.com\n5577690.com\n5577758.com\n5577860.com\n5577865.com\n5577937.com\n5577943.com\n5577956.com\n558.com\n5588.tv\n5588124.com\n5588294.com\n5588492.com\n5588bet.com\n558idc.com\n559.cc\n55935.vip\n5595.cc\n5599.com\n5599.net\n5599276.com\n5599785.com\n55b5f319e26f3e37.com\n55bbs.com\n55d0548671023.beer\n55d32c2b010271.beer\n55dai.com\n55dian.com\n55doc.com\n55duanzi.com\n55dushu.com\n55e5.com\n55g.cc\n55haitao.com\n55hike.com\n55hl.com\n55hl.net\n55ht5hn.shop\n55i8.com\n55idc.com\n55it.com\n55jisu.com\n55kantu.com\n55la.com\n55r5.com\n55shantao.com\n55tour.com\n55tuan.com\n55y.cc\n55y5.com\n55zhoucheng.com\n55zs.com\n56.com\n560.im\n56015.com\n5606968d01021.beer\n56099443.com\n560e.com\n560wf.com\n5611.com\n56114.com\n56135.com\n56156.com\n5618.co\n5629.com\n56360.com\n564.cc\n564253a9b11042.beer\n56456c9fa1013.beer\n5648.cc\n56506666.com\n5654.com\n565656.com\n56597.vip\n566job.com\n566zhibo.com\n567.org\n567030.com\n56711.com\n567909.xyz\n567fafafaf.com\n567idc.com\n568.com\n5684.com\n5684t.net\n56851.net\n56885.net\n569.com\n5694.com\n56a.com\n56ad2ddadaebfb59.com\n56ads.com\n56beijing.org\n56bid.com\n56c.co\n56care.com\n56che.com\n56cheng.com\n56cheng.vip\n56china.com\n56clte.org\n56dagong.com\n56dichan.com\n56dq.com\n56dr.com\n56dr.net\n56dt.com\n56dz.com\n56ggb.com\n56gk.com\n56hb.com\n56home.org\n56idc.com\n56img.com\n56img.net\n56imgs.com\n56jg.com\n56join.com\n56kad.com\n56laile.com\n56linked.com\n56md.com\n56ml.com\n56mp.com\n56nb6oo06g.com\n56products.com\n56qq.com\n56shangpu.com\n56show.com\n56shuku.org\n56sing.com\n56steel.com\n56tchr.com\n56tim.com\n56tj.com\n56tv.org\n56uu.com\n56xiniao.com\n56ye.net\n56yun.com\n56zhibo.com\n57.net\n57017.work\n57023.com\n5707777.com\n571400.net\n571xz.com\n57273vy9x0.com\n57357.vip\n574e313cc10272.beer\n5755.com\n576.com\n57608.com\n5760x.com\n57648.com\n57665.com\n57676.com\n576tv.com\n57781.vip\n57781057.com\n577job.com\n57821.com\n57875.vip\n579666.com\n579idc.com\n57auto.com\n57bm.com\n57class.net\n57df3696bffd3eb4.com\n57dp.com\n57go.com\n57mail.com\n57px.com\n57qy.com\n57sh.com\n57tbs.com\n57tc.net\n57tibet.com\n57tuan.com\n57us.com\n57uu.com\n57www.com\n57yy.site\n57zhe.com\n58.com\n5800.com\n580114.com\n580168.com\n580590.com\n5805c102b11021.beer\n58091.xyz\n580ban.com\n580dns.com\n580eda.net\n580jz.net\n580k.com\n580tequan.com\n5811x.com\n58142404237055.icu\n58153.xyz\n58188.com\n58199.com\n582116.com\n58232.vip\n582hr.com\n583316.com\n583go.com\n58416.org\n5858.com\n5858xs.com\n58611.net\n58620888.com\n5866.com\n5867yh.com\n586jz.com\n587.cc\n58738.org\n587image.com\n5884.com\n5888.tv\n588fb105cf2606b5.com\n588ku.com\n588tao.com\n588z.com\n5898yun.com\n58abb.com\n58antenna.com\n58auv.com\n58bd0ad4222284cf.com\n58bh.com\n58buy.com\n58chaiyou.com\n58che.com\n58cloud.com\n58coin.com\n58corp.com\n58dadi.com\n58daojia.com\n58demo.com\n58display.com\n58dns.me\n58dns.org\n58eventer.com\n58fkb.com\n58food.com\n58game.com\n58ganji-corp.com\n58ganji.com\n58ghost.com\n58hua.com\n58ib.com\n58iclick.com\n58insure.com\n58iwan.com\n58izl.com\n58jb.com\n58jixie.com\n58jmw.com\n58kad.com\n58kuaipai.com\n58kuku.com\n58lingshi.com\n58lovepet.com\n58meeting.com\n58mhg.com\n58moto.com\n58peilian.com\n58pic.com\n58pxe.com\n58q.org\n58q8.com\n58qz.com\n58shangban.com\n58supin.com\n58trz.com\n58ubk.com\n58uxd.com\n58wan.com\n58wangwei.com\n58wanwan.com\n58wuji.com\n58wzd.com\n58xinghuo.com\n58xinrui.com\n58xs.com\n58xs.la\n58xueche.com\n58xuexi.com\n58yaoji.com\n58yiji.com\n58youtui.com\n58youxi.com\n58yuesao.com\n58z.net\n59.com\n5909.net\n590m.com\n59120.com\n591237.com\n59139.com\n59168.net\n59178.com\n5918656.com\n5918dyw.com\n591918.com\n591con.com\n591hx.com\n591master.com\n591moto.com\n591moto.net\n591mrzx.com\n591syd.com\n591wsh.com\n591wy.com\n591yhw.com\n592163.com\n59220ab771010.beer\n59232.org\n5923d.com\n592bet5.com\n592zn.com\n59370.com\n5945i.com\n595.bet\n595.cc\n59519.com\n5956777.com\n595818.com\n5959.vip\n5959068.com\n5959366.com\n5959510.com\n5959536.com\n5959540.com\n5959690.com\n59598.com\n595dlxzbanone.com\n595image.vip\n595led.com\n596fc.com\n597.com\n597guilin.com\n597mm.com\n597rcw.com\n59852.vip\n59888888.xyz\n599.com\n59958b.com\n5999.tv\n59b1a9d9d1010.beer\n59b2b.com\n59baike.com\n59bf02cb03a7fbbb.com\n59dead1ce10301.beer\n59dun.com\n59ec5453559f0.streamlock.net\n59f086f4910311.beer\n59f35373bf3f8e7d.com\n59ff599661017.beer\n59hi.com\n59iedu.com\n59iwh.com\n59jt.com\n59med.com\n59ni.com\n59pk.net\n59rj.com\n59store.com\n59w.net\n59wanmei.com\n59wj.com\n59yx.com\n5a1eacf0110241.beer\n5a6fed2321010.beer\n5a8.org\n5a828d12510272.beer\n5a8878b99c8f9160.com\n5a8a3d1d111021.beer\n5a9bf3726d2b09fa.com\n5aa212657a354b3e.com\n5aaa.com\n5acbd.com\n5adanci.com\n5adanhao.com\n5afc70ef010251.beer\n5ag.net\n5aivideo.com\n5aixia.com\n5aiyoo.com\n5ajob.com\n5any.com\n5aq.net\n5auto.net\n5axxw.com\n5b1c73dc010311.beer\n5b2b697bd748d07b.com\n5b39c2f791014.beer\n5b3znjecy.cfd\n5b529d4e711021.beer\n5ba6319c311011.beer\n5baike.com\n5ber.com\n5bite.com\n5biying.com\n5bjm.com\n5c3639aa99149.streamlock.net\n5c407acb510301.beer\n5c554118a1021.beer\n5c84i.net\n5cb69e8045837fa9.com\n5ccic.com\n5cda.com\n5ce.com\n5ce08adc68995a7a.com\n5ceimg.com\n5cgo.com\n5cpod.com\n5d.ink\n5d116d676087d0e8.com\n5d170bdbce0cbe9b.com\n5d2ede2.com\n5d6d.com\n5d6d.net\n5d770c50c1016.beer\n5d7bcbb1a1022.beer\n5dao.cc\n5dashi.com\n5dc0af35081be08e.com\n5ddd.com\n5dfp.com\n5dfsd2.com\n5dgbgv941b.com\n5dgz.com\n5ding.com\n5dmail.net\n5dplay.net\n5ds.com\n5e17f526411011.beer\n5e17fc2cca2967e2.com\n5e2fd110b10301.beer\n5e40004d710251.beer\n5eaf8fd6c1024.beer\n5earena.com\n5earenacdn.com\n5eplay.com\n5eplaycdn.com\n5er0.com\n5etz.com\n5ewin.com\n5f28dfaae1016.beer\n5f36b4f39ba574b7.com\n5f52903c110251.beer\n5f69826526db4f44.com\n5f9e6b1603f69b9b.com\n5fa26ed6d1024.beer\n5fen.com\n5fo.org\n5fun.com\n5fwan.com\n5g-smart.com\n5gcdnx.com\n5gh.com\n5gimos.com\n5gjoy.com\n5guanjianci.com\n5gwan.com\n5gxsd.com\n5gxt.com\n5gy.com\n5gzm.net\n5h.com\n5had0w.com\n5hoom.com\n5i.com\n5i366.com\n5i591.com\n5i5aj.com\n5i5j.com\n5i5t.com\n5i65.com\n5i9u.com\n5iag.com\n5iag.net\n5iape.com\n5ibear.com\n5ibug.net\n5icbs.com\n5ich.net\n5ichecker.com\n5ichong.com\n5icool.com\n5idc.com\n5idev.com\n5idhl.com\n5idream.net\n5iec.com\n5iecity.com\n5iexpress.com\n5ifapiao.com\n5ifit.com\n5iflying.com\n5ifund.com\n5igcc.com\n5igcw.com\n5iggci.com\n5igupiao.com\n5igzw.com\n5ihuish.com\n5iidea.com\n5ijk.net\n5ikang.com\n5iliao.com\n5ilog.com\n5ilr.com\n5ilrc.com\n5iluying.com\n5imeishi.com\n5imomo.com\n5imusic.com\n5imx.com\n5imxbbs.com\n5iops.com\n5ipatent.com\n5ipkwan.com\n5isanguo.com\n5isohu.com\n5iucn.com\n5iweix.com\n5iximai.com\n5ixuexiwang.com\n5iyoule.com\n5iyq.com\n5iyuyan.com\n5izzy.com\n5jingcai.com\n5jinzhishu.com\n5jjdw.com\n5jli.com\n5jue.com\n5jwl.com\n5k.work\n5k58.com\n5k5m.com\n5ka30l5885.com\n5kaixin.net\n5kbox.com\n5kcrm.com\n5kcrm.net\n5kda.com\n5khouse.com\n5kmw.com\n5kwuke.com\n5lanren.com\n5lu.com\n5lux.com\n5m5m5m.com\n5mapk.com\n5mu.com\n5nd.com\n5nexus.com\n5nnj.com\n5o.com\n5ooq.com\n5opzl.com\n5opzl.net\n5pao.com\n5pb.net\n5pk.com\n5plus1.net\n5q.com\n5qwan.com\n5qzone.net\n5r1.net\n5radar.com\n5rc.com\n5read.com\n5rfh44h5.cc\n5ring.com\n5ritt.com\n5rs.me\n5s4f.com\n5s5j.com\n5s886.com\n5seals.com\n5see.com\n5sem.com\n5sha.com\n5shubook.com\n5snow.com\n5sw.com\n5t6t.com\n5tangs.com\n5teacher.com\n5th.zone\n5thhospital.com\n5thspace.net\n5tjps9c62j.com\n5tmobi.com\n5tmovice.com\n5tqjogo.com\n5u18.com\n5u3d.com\n5u5u5u5u.com\n5uchina.com\n5uec9e3sj2.com\n5ul.com\n5umao.com\n5upm.com\n5usport.com\n5uu8.com\n5uyk.com\n5v13.com\n5w123.com\n5w5.com\n5w52.com\n5w5w.com\n5waihui.com\n5wanpk.com\n5web.site\n5wx.org\n5wxw.com\n5wyxi.com\n5x54.com\n5xcg.com\n5xiaobo.com\n5xini.com\n5xmjm.com\n5xyouse.com\n5y6s.com\n5yang.cc\n5ydj.com\n5yhua.org\n5ykj.com\n5you.cc\n5you.com\n5youchou.com\n5zai.com\n5zd.com\n5zg.com\n5zhr.com\n5zls.com\n5zw.com\n6-china.com\n6-u.com\n6.biz\n6.mms.vlog.xuite.net\n60.net\n600064.com\n600083.com\n600086.com\n6000f6l4n8.com\n6000feet.com\n600146.net\n600200.com\n600208.net\n600216.com\n6002255.com\n600280.com\n600282.net\n600496.com\n600576.com\n6006.xin\n600689.com\n600711.com\n600822sh.com\n600895.com\n600df970611031.beer\n600yj.com\n601book.com\n602.com\n602ab6ff810251.beer\n602img.com\n60301c31eca86940.com\n603027.com\n603603b.com\n603603d.com\n603966.com\n603ee.com\n60414.agency\n6044faac164dbe06.com\n6046.net\n605-zy.com\n605276655648.icu\n60582ce6688bd14e.com\n60593.com\n605dns.com\n605f40b0b174f4ea.com\n605zy.co\n60606161.com\n60623.org\n6066888.com\n606b558d310281.beer\n6073168.com\n607images15.com\n607images16.com\n607images36.com\n607images40.com\n608.vip\n6080d.com\n60951.my\n60dj.com\n60kan.com\n60mil.com\n60nm.com\n60oa.com\n60qc.com\n60wr.com\n60yp.com\n61.com\n610115.com\n610213.net\n61029.com\n6103g.com\n6104.tv\n6112.com\n611qk.com\n611res.com\n6122cec31dfe86dd.com\n612345.com\n612459.com\n614e697c5fb7c42a.com\n6153.cc\n61611.net\n616167.com\n6164.com\n61658.com\n6168511.com\n6169966.com\n616a191f21009.beer\n616pic.com\n616wan.com\n6186.com\n6187wo.com\n6188.net\n6188cnc.com\n618bg.com\n618cj.com\n618day.com\n618hr.com\n618ky.com\n618tech.com\n618waihui.com\n61916.com\n61916.net\n61977.center\n61baobao.com\n61bb.com\n61bbw.com\n61cloud.net\n61diy.com\n61draw.com\n61ertong.com\n61gequ.com\n61hd.net\n61hr.com\n61ic.com\n61info.com\n61k.com\n61kezhan.com\n61mc.com\n61ok.com\n61psy.com\n61sheji.com\n61sou.com\n61tg.com\n61thi77ewg.com\n62.vip\n6202.com\n62115.com\n62126tt.com\n62212366.com\n6222251.com\n62456e3303420792.com\n624down.com\n62609e25011021.beer\n6266.cc\n62669.com\n626x.com\n628.com\n6285s.com\n62923.vip\n629973.com\n62ca01745cf46371.com\n62d6797ca064d36c.com\n62ddccc8810301.beer\n62dns.com\n62game.com\n62l.net\n62wy.com\n6300.net\n630book.cc\n630book.co\n630book.com\n630read.com\n630zw.org\n631r.xyz\n632121d3c4f46e67.com\n63243.com\n632news.com\n63329.pet\n6333.tv\n6334x.com\n633586c05c8f4543.com\n634.ag\n634d.com\n634image.com\n634image.vip\n6360.com\n6373.com\n63744c3e410292.beer\n637600.com\n6380.org\n6383.com\n638300.com\n6385844.com\n63860.vip\n639311.com\n63936b71f3e4ab6a.com\n6397869a4eb51a13.com\n63a795836312c99d.com\n63b4ff1aeff2818d.com\n63cj.com\n63fl.com\n63pe.com\n63u.net\n63yx.com\n63yy.com\n6406.org\n640640.com\n641.com\n642online.com\n64365.com\n64504.com\n645250.net\n6453.net\n64538.net\n646000.com\n6463.com\n64644444.com\n64783333.com\n648sy.com\n64dns.com\n64foot.com\n64gua.com\n64ma.com\n64mv.com\n64oak78y99.com\n64pay.com\n64ptd74095.com\n6501111.com\n65119.com\n651700.com\n652ebb57a11021.beer\n653697e101020.beer\n654320.com\n6543210.com\n654321wan.com\n655u.com\n655yx.com\n65601111.com\n656126.com\n65650000.com\n65656564.com\n656gate.com\n658.com\n65875.com\n659595.com\n65993zubo26633.com\n65b01705c10261.beer\n65bb2d6d81010.beer\n65box.com\n65dataranking.com\n65ec0ea7f04562ad.com\n65liuxue.com\n65mhxy.com\n6600.org\n66016.com\n660378.com\n6605oo.com\n66083797.com\n660pp.com\n66123123.com\n66152.com\n66168.net\n6617.com\n66173yx.com\n662city.com\n662p.com\n66301cc.com\n6633102.com\n6633488.com\n6633696.com\n663661.com\n6636yy.com\n66378.com\n66388.net\n663jx.com\n66445.org\n66446200.com\n66460.com\n664e4037310291.beer\n6655.com\n6655.la\n6655304.com\n66580.com\n665888j.com\n665888s.com\n6660333.com\n666127.xyz\n666291.xyz\n6665.com\n666532.xyz\n666546.xyz\n666548.xyz\n66661s.com\n6666343ac4.shop\n6666519.net\n66665s.com\n66666.host\n666666.host\n6666m.vip\n6666ppt.com\n6666sa.com\n6666xsw.com\n6668dns.com\n6669832.com\n666bos.com\n666gps.com\n666idc.com\n666kuaishou.com\n666kuaishou.net\n666pic.com\n666post.com\n666scly.com\n666shuwu.com\n666wan.com\n666wan.net\n666wx.cc\n666xinxin.com\n66701288.com\n66747.org\n6677243.com\n667744.com\n6677954.com\n6677cq.com\n667f46342ace5437.com\n66825.com\n6686.com\n6686a9.com\n6686x5.com\n6686x8.com\n6688.com\n668app.com\n668cdn.cc\n668cdn.xyz\n668lw.com\n668map.com\n668wan.com\n669167d4fc316421.com\n66930909.com\n669322.com\n6695.com\n66988.tv\n6699.fun\n66990000.xyz\n6699129.com\n6699301.com\n6699343.com\n6699407.com\n6699408.com\n6699484.com\n6699496.com\n6699497.com\n6699758.com\n6699784.com\n6699804.com\n6699811.com\n6699848.com\n6699873.com\n669cd3a3ea61d96f.com\n669pic.com\n669play.com\n669ye.com\n669zw.com\n66brl.com\n66c970e7e1011.beer\n66call.com\n66ddf809c0cc0fb1.com\n66ds.net\n66good.com\n66han.com\n66huigo.com\n66ika.com\n66in.net\n66jiedai.com\n66l.cc\n66laws.com\n66mi.com\n66mobi.com\n66money.com\n66mz8.com\n66n.co\n66nao.com\n66nh.com\n66park.net\n66perfect.com\n66play.com\n66rjz.com\n66rom.com\n66rou.com\n66rpg.com\n66ruian.com\n66shouyou.com\n66sj.com\n66sy.com\n66team.com\n66to.net\n66ui.com\n66v.net\n66wc.com\n66web.com\n66weiyou.com\n66wmw.com\n66wz.com\n66xue.com\n66y.com\n66you.com\n66yyba.com\n66zhang.com\n66zhizu.com\n66zhuang.com\n67.com\n67017.com\n670e13a8f11042.beer\n6711img.com\n671845093759368.icu\n671992tc08.com\n672m1z9ogj.world\n67318n.com\n674da9a521017.beer\n6758169ad1020.beer\n67623.com\n676z.com\n677.com\n677.vip\n6771112.com\n678119.com\n678301.com\n6786666.com\n6787.com\n67876.com\n678820.com\n6788888.net\n6789che.com\n6789g.com\n6789sm.com\n678cn.com\n678edu.net\n678ie.com\n678py.com\n678vr.com\n67921547311681.icu\n67a38421b10281.beer\n67a4488e31017.beer\n67az.com\n67cha.com\n67f4951a0c77434d.com\n67it.com\n67joy.com\n67mo.com\n67tool.com\n67wanwan.com\n67wx.com\n67y.com\n68.com\n68.gy\n68.vip\n680.com\n68120120.com\n681314.com\n6816.com\n682.com\n68211.com\n6822.com\n682ff8a9c89d5d88.com\n6832123.com\n6840011.com\n6844.com\n685462.com\n68596e90010311.beer\n68606060.com\n68659061.com\n6868shop.com\n6868yx.com\n68716871.com\n68792999.com\n688539.com\n6887cc57c10251.beer\n6888.ee\n6888.tv\n688dns.com\n688wz.net\n68955.com\n68978.net\n6899wan.com\n68apk.com\n68bbq.com\n68china.net\n68design.net\n68e5fc2c1344afb8.com\n68ecshop.com\n68gainian.com\n68h5.com\n68hanchen.com\n68hlw.com\n68hr.com\n68jcw.com\n68ke.com\n68mall.com\n68play.com\n68sign.com\n68team.com\n68u.co\n68web.net\n68websoft.com\n68zhan.net\n69090.com\n6912s.com\n6917.com\n69216.blog\n69260.com\n692657.com\n693.com\n6934.net\n693975.com\n69478.com\n695157.com\n695175.com\n69525.com\n695275.com\n695828.com\n695ljg.com\n696.cool\n696157.com\n69698689.com\n696b333851010.beer\n697e43da249f79cd.com\n698wan.com\n69916666.com\n699333.xyz\n69981.com\n699h5.com\n699pic.com\n69fd4a3dbd02f66c.com\n69g.com\n69hr.com\n69mok.com\n69shu.org\n69shuba.cc\n69tianqi.com\n69xiu.com\n69yc.com\n69ys.com\n69zw.com\n6a221afdbbe2d2e5.com\n6a2e6e54178e45a3.com\n6a3ad24293be062d.com\n6a4126ebcf94c39d.com\n6a8a.com\n6aas.com\n6ab81d83f7d83dbe.com\n6adj.com\n6an8.com\n6api.net\n6apt.com\n6b1813f5210261.beer\n6b3b.com\n6b3cfa277bae3b4b.com\n6b786q3e.work\n6bac9d15d10271.beer\n6bbk.com\n6bdns.com\n6c0f63385ed13b89.com\n6c6c.com\n6c7ccba3e11031.beer\n6cit.com\n6cmap.com\n6cnzz.com\n6d4d5.com\n6d4g.com\n6d576388add270c5.com\n6d7d.com\n6d888.com\n6dan.com\n6dbx.com\n6dcg.com\n6de7eb04410311.beer\n6dfefa7039812445.com\n6diy.com\n6ds.me\n6du.in\n6duoyu.com\n6e212121910292.beer\n6e8a225320471153.com\n6e8fe57151019.beer\n6eat.com\n6edigital.com\n6ef102d0210261.beer\n6f25df38a10291.beer\n6f7b51b741014.beer\n6f8b82f9fbb439db.com\n6fast.com\n6fcsj.com\n6fe7c9d291017.beer\n6ff6313e475a7a32.com\n6g5fd1a.com\n6gh4.com\n6ght.com\n6glz.com\n6gz6h1ze8r.com\n6h979.com\n6hd0hoc.com\n6hgame.com\n6hudong.com\n6huo.com\n6hwan.com\n6ict.com\n6ie6.com\n6ifang.com\n6juzi.com\n6jz.com\n6k11.com\n6k6g.com\n6k9k.com\n6ke.com\n6kw.com\n6kxz.com\n6laohu.com\n6li.com\n6lk.net\n6ll.com\n6lrt.com\n6ls.cc\n6m5m.com\n6miu.com\n6miu.net\n6my575.com\n6niu.com\n6nm6.com\n6our.com\n6p667.com\n6p7q8c3oa4.com\n6pen.art\n6pifa.net\n6puppy.xyz\n6pzftj.com\n6r6992xeq1jho.cyou\n6ren.com\n6rencn.com\n6renyou.com\n6rooms.com\n6s4qki.com\n6s54.com\n6sfg.com\n6sq.net\n6t.com\n6t12.com\n6tcc.com\n6tennis.com\n6thhosp.com\n6tiantian.com\n6tie.com\n6tktrd.com\n6tt.com\n6tu.com\n6twrte12ft.com\n6u9muvn94m.com\n6uudy.com\n6v.com\n6v6.work\n6vdyg.com\n6wan.com\n6wtx.com\n6wwww.com\n6wz.co\n6x.studio\n6x69f31vso.com\n6xcdn.com\n6xd.com\n6xiu.com\n6xw.com\n6yoo.com\n6young.site\n6yso.com\n6yxk.com\n6yxs.com\n6yygh.site\n6yyy7.com\n6z.net\n6z6z.com\n6za0l6fjl0.com\n6ze.net\n6ziz.com\n6zu.com\n6zy37f4df2.com\n7-11bj.com\n7-che.com\n7-meeting.com\n7-mi.net\n7-vk.com\n7-wx.com\n70.cc\n70.net\n700618.com\n70098.com\n700chat.com\n700kan.com\n700live.com\n700megs.com\n700mh.com\n701.com\n703804.com\n70392.com\n70392.org\n70524.com\n706net.com\n707598.xyz\n707e518c610291.beer\n7080edu.com\n70822.com\n7089899.com\n7089dd.com\n7089gg.com\n70cq.com\n70dir.com\n70gm27345d.com\n70jj.com\n70ka.com\n70pf2fj3sd.com\n70ppt.com\n70soft.com\n70ym.com\n70yx.com\n71.am.com\n71.net\n7114.com\n7116.com\n7116dns.com\n711hospital.com\n711pr.com\n7120.com\n71360.com\n7139.com\n71390.com\n714.com\n714a0ffa611031.beer\n714b5653f10292.beer\n715083.com\n715288.com\n715300.com\n71556v.com\n71683.com\n71714.com\n7172737.com\n71757ae5f10241.beer\n7176.com\n717c.com\n717down.com\n718991.com\n71908.com\n7192.com\n719400.com\n719f06caf1017.beer\n71acg.com\n71acg.net\n71b394ce11114.beer\n71baomu.com\n71baomu.net\n71big.net\n71caigou.com\n71d7f1e121019.beer\n71dm.com\n71e.com\n71edge.com\n71edge.net\n71edge.work\n71elink.com\n71f68cc351015.beer\n71go.com\n71k.com\n71lady.com\n71p.net\n71tao.com\n71tech.com\n71txt.com\n71wl.com\n71wx.net\n71xe.com\n71xk.com\n72.com\n72017.net\n720582.com\n720health.com\n720static.com\n720think.com\n720ui.com\n720yes.com\n720yun.com\n720yuntu.com\n7210.com\n7211.com\n7214fa7e11011.beer\n72177.com\n7217kf2961.com\n721888.xyz\n72242s.com\n72257c.com\n72257e.com\n72257j.com\n72258q.com\n72287c.com\n72287h.com\n72287o.xyz\n7230.com\n7239ll.net\n723e7a5a510261.beer\n7245f7d6211012.beer\n724pride.com\n724pridecryogenics.com\n724pridetech.com\n72535276268b14e0.com\n7265a5ef31011.beer\n726p.com\n7273.com\n727380.com\n727d5e6cb1011.beer\n7280.com\n7291v.com\n7298.com\n72byte.com\n72ce.com\n72crm.com\n72crm.net\n72crm.org\n72d3bb672f4a6997.com\n72dj.com\n72dns.com\n72dns.net\n72e.net\n72en.com\n72g.com\n72gu.com\n72h6hn4r3e.com\n72home.com\n72kjmb.com\n72la.com\n72max.com\n72qq.com\n72r.net\n72swk.com\n72whys.com\n72xit.com\n72xuan.com\n72y.co\n72yce.com\n72yun.com\n72zhan.com\n730d60bec10281.beer\n731.tv\n73110010.com\n7315297af11011.beer\n73232yx.com\n73261825f768447d.com\n732732.com\n7337pay.com\n734969.com\n73573dd6a1023.beer\n7366cba131014.beer\n73676699.com\n737.com\n737698.xyz\n73789.com\n73850.org\n73864.org\n738888.xyz\n73925.work\n73980.org\n7399.com\n73bc.com\n73bt.com\n73card.com\n73d1708e01022.beer\n73ea00c7710272.beer\n73so.com\n73zw8.com\n74.com\n7415.com\n741b0fca410271.beer\n7428.net\n743forever.com\n7441a334d13a0000.com\n74478fd3b9cca85f.com\n744zy.com\n745998.xyz\n74615ee887a99dd7.com\n7474.com\n7477.com\n747wan.com\n749333.xyz\n74955.net\n74966.net\n74977.net\n74ad7537d1014.beer\n74cms.com\n74da6ad581020.beer\n74dns.com\n74f11ac633122c20.com\n74hao.com\n75.team\n75111.com\n75111.net\n75122d9a05f7a5a7.com\n751257.vip\n75184.com\n75271.com\n752d7cf9a8cd3341.com\n7534w8m16e.com\n75367.com\n7543c79b410291.beer\n75510010.com\n756u.com\n7574.com\n75757.com\n757dy.com\n7580.ltd\n7597af9ac1010.beer\n75982.com\n75a8f8759fc99775.com\n75b58faf61014.beer\n75d31e3ac62e6e53.com\n75g.co\n75ll.com\n75n474.com\n75pk.com\n75team.com\n75ww.com\n75xn.com\n76120.org\n7618.com\n761a.com\n7633sqw.com\n76474cf781f10d61.com\n7651.com\n766.com\n7663.com\n76676.com\n766899d4f1011.beer\n766app.com\n766er.com\n766test.com\n766vd.com\n766z.com\n767qkdj34u.com\n767stock.com\n76831.org\n76868.com\n7688.net\n7689.site\n76963.com\n769car.com\n76ab.com\n76baobao.com\n76bb.com\n76c9c1aa27766f1d.com\n76dongdong.com\n76ju.com\n76mz.com\n76pay.com\n76pf.com\n76y.com\n76zu.com\n77005163.xyz\n770539.com\n7711.com\n77112007.com\n77119159.com\n771633.com\n77169.com\n77169.net\n7717wan.com\n7722wx.com\n7723.com\n7723img.com\n7724.com\n7724yx.com\n7725.com\n77304.com\n77304y.com\n77313.com\n7733320.com\n7733352.com\n7733577.com\n7733706.com\n7733728.com\n7735.net\n77381v.com\n7744wan.com\n77521.com\n77545.com\n7755028.com\n7755056.com\n7755078.com\n7755267.com\n7755302.com\n7755306.com\n7755330.com\n7755360.com\n7756.org\n775jia.net\n776577.com\n7766.info\n7766.org\n7766060.com\n7766073.com\n7766081.com\n7766090.com\n7766300.com\n7766362.com\n7766380.com\n7766396.com\n7766398.com\n77670.org\n77745.com\n7777733.com\n777biubiu.com\n777dd.life\n777e.store\n777eee888eee.com\n777haoka.com\n777lala.com\n777moban.com\n777sy.com\n777yh.am\n7788.com\n7788310.com\n7788610.com\n7788js.com\n7789.com\n778buy.com\n77991.com\n7799358.com\n7799378.com\n77994008.com\n7799520.com\n779wan.com\n77bh.com\n77bike.com\n77bx.com\n77cr0ip236.com\n77dd23.com\n77de.com\n77dushu.com\n77dyy.net\n77ebooks.com\n77ed699516ed5193.com\n77ee6f16b1011.beer\n77eye.com\n77fanwen.com\n77gog.com\n77hd.com\n77hudong.com\n77itv.com\n77l.com\n77lux.com\n77music.com\n77nn.net\n77nt.com\n77nt.info\n77piano.com\n77pin.net\n77shu.com\n77shuku.la\n77shuku.org\n77shw.com\n77socks.com\n77tianqi.com\n77vcd.com\n77xmd.com\n77yx.com\n77zhangh.com\n77zhanghao.com\n77zn.com\n78.link\n78104.org\n78110.org\n781203.com\n78126dh.com\n7829t.com\n782e2u6m99.com\n78302.com\n785836.com\n785956.com\n78654321.com\n78665.vip\n786e7138b09934b3.com\n78785z.com\n7881.com\n7888.com\n788899.com\n788v.com\n7890.net\n78901.net\n7899.cc\n789hi.com\n789hsw.com\n789win07.com\n78bar.com\n78dian.com\n78diy.com\n78dm.net\n78ee.com\n78fz.com\n78gk.com\n78h34.com\n78hr.com\n78md.com\n78oa.com\n78os.com\n78plat.com\n78tp.com\n78v.com\n78yx.net\n79.biz\n790.com\n79008500.xyz\n790a8f76c10301.beer\n7928a82f311032.beer\n79332.agency\n793360.com\n793688.com\n79432.com\n7951ee2a510281.beer\n79521.cc\n7979u.com\n797sun.com\n7988.com\n798com.com\n798edu.com\n798ydh.com\n798zb.tv\n799.net\n79979.loan\n7997v.com\n7999.tv\n79999.net\n799job.com\n79abc.com\n79bb57f37108d1b9.com\n79ecb629691d165f.com\n79f9bf9e410292.beer\n79jr.com\n79tao.com\n79yougame.com\n79yx.com\n7a.cm\n7a1dd6b621020.beer\n7a1f7ba4211042.beer\n7a31jmf.com\n7a8k.com\n7a9b89eb3d333f2c.com\n7ade93e381021.beer\n7ahr.com\n7analytics.com\n7b2.com\n7b6466e191019.beer\n7b761738c10261.beer\n7bess.com\n7bip9h1k5s.com\n7c.com\n7c5ba8e2b10281.beer\n7c637ea6d10271.beer\n7c644b8a21013.beer\n7caiyun.com\n7capp.com\n7ccj.com\n7cdfad1816def43d.com\n7cgw.org\n7chacha.com\n7ci.com\n7cname.com\n7cnv.com\n7cv.com\n7cxk.com\n7cyn.com\n7d4b19ab710241.beer\n7d5y.com\n7d604703e1023.beer\n7d8fc91771017.beer\n7d9c2005e1015.beer\n7dc0d8dad10281.beer\n7dc20a92cc1da04d.com\n7didc.com\n7do.net\n7down.com\n7down.net\n7dsw.com\n7e.hk\n7e051eec511021.beer\n7e9dba1891021.beer\n7east.com\n7ed.net\n7edown.com\n7ee.com\n7eo8cc932r.com\n7f0107332e0db161.com\n7f36600721781324.com\n7f416cfd411012.beer\n7f86a2a17fcd5a5d.com\n7fa19203510241.beer\n7fa973f8c7bdcddb.com\n7fei.com\n7fff5701c5415d77.com\n7fgame.com\n7flowers.com\n7forz.com\n7fresh.com\n7glb.com\n7gongzhu.net\n7grandcross.com\n7gugu.com\n7h1fg6b6kd.com\n7hcn.com\n7head.icu\n7help.net\n7ho.com\n7hon.com\n7hua.com\n7icp.com\n7il.co\n7ipr.com\n7its.com\n7jia.com\n7jia2.com\n7jiaqi.com\n7jjjj.com\n7jk.com\n7juju.com\n7k35.com\n7k7k.com\n7k8k.com\n7ka.co\n7kk.com\n7kla.com\n7kla.net\n7ko.com\n7kww.net\n7littlemen.com\n7lk.com\n7luohu.com\n7lw.com\n7mah2.com\n7moor-fs2.com\n7moor-zx.com\n7moor.com\n7msj.com\n7mx.com\n7mz3a.com\n7nepal.com\n7net.cc\n7oh.net\n7pa.com\n7paiqun.com\n7piq.com\n7po.com\n7q5.com\n7qile.com\n7quw.com\n7r7z.com\n7rdao.com\n7road.com\n7road.net\n7ronggame.com\n7runto.com\n7rz37dp998.com\n7sef.com\n7sfashion.com\n7sodu.net\n7souti.com\n7sown.com\n7soyo.com\n7su.com\n7syc.com\n7t9.com\n7tapp.com\n7tenet.net\n7tgame.com\n7tnt.com\n7tou.com\n7tqy.com\n7tui.net\n7ugl.com\n7usa.net\n7uv.com\n7v6.net\n7vd7.com\n7vk.com\n7vyou.com\n7wan.com\n7wate.com\n7wee.com\n7wenta.com\n7wenyi.com\n7wnews.com\n7wsh.com\n7wsh.net\n7wx3675l72.com\n7x24cc.com\n7x688.com\n7xdown.com\n7xiuxing.com\n7xm.net\n7xz.com\n7y5.net\n7y7.com\n7yc.com\n7yigame.com\n7youxi.com\n7yuki.com\n7yun.com\n7yun.org\n7yundns.com\n7yylucky.com\n7yz.com\n7yzone.com\n7z4bz6e2cp.world\n7zgame.com\n7zhan.com\n7zhou.com\n7zkj.com\n7zm.com\n7zz6.com\n7zzy.com\n8-008.com\n8.biz\n8.xyz\n80.hk\n80000.cc\n800423.com\n800507.com\n8006506.com\n8006511.com\n8006tu.com\n800713.com\n800820.net\n8008202191.com\n8008205555.com\n80088886.com\n8009900800.com\n800app.com\n800bamboo.com\n800best.com\n800best.net\n800bestapi.com\n800bestapp.com\n800bestex.com\n800book.net\n800buy.com\n800cdn.com\n800du.com\n800hr.com\n800jcw.com\n800li.net\n800lie.com\n800lj.com\n800mei.net\n800pharm.com\n800pifa.com\n800tu.com\n800tuan.com\n800tzw.com\n800vod.com\n800wen.com\n800xiaoshuo.com\n800xs.net\n800you.com\n800youhuo.com\n80166.com\n802203.com\n8025edaf81019.beer\n80351.com\n804c3f72a13dad45.com\n805481.com\n80585.com\n805a8702410281.beer\n8065f8f0f10261.beer\n807.com\n807d286522a4a453.com\n807df2a0610272.beer\n80800.vip\n8080bl.com\n8080i.com\n8081.net\n80811daa56184e5f.com\n8082audio.com\n8087sss.com\n8087vvv.com\n80899999.com\n808c6f532d08909b.com\n808xs.com\n8090.com\n8090.pk\n809090.xyz\n8090app.com\n8090cdn.com\n8090mt.com\n8090st.com\n8090vision.com\n8090yx.com\n8090yxs.com\n80982.org\n80a2a140710301.beer\n80baicai.biz\n80bi.com\n80c189b091016.beer\n80cz.net\n80data.net\n80day.com\n80dd7626911042.beer\n80den.com\n80dongli.com\n80host.com\n80kongjian.com\n80kuku.com\n80lou.com\n80paper.com\n80s.im\n80shihua.com\n80sjy.net\n80srz.com\n80test.com\n80txt.cc\n80txt.com\n80txt.la\n80vps.com\n80wifi.cc\n80x.co\n80xg.com\n80xs.la\n80zw.info\n81007.work\n8100ab16d11021.beer\n810840.com\n81138183c1024.beer\n81182479.com\n811sisp.com\n81241g43cj.world\n81257.com\n81265.com\n81265.net\n812813.com\n8130088.com\n81312.com\n81366j.com\n815.pub\n815008.com\n8158.com\n81593.com\n815ybw.com\n81629.com\n8162t.com\n81663344.com\n81677.com\n816798.net\n8169.com\n81730450affbad30.com\n817398.com\n81761.com\n818.com\n81813.com\n8181xw.com\n8181zx.com\n81835.com\n8185t.com\n8188.cc\n818cq.com\n818it.com\n818long.com\n818ps.com\n818tu.com\n818u.com\n818watch.com\n81988888.com\n81999.org\n81999999.com\n81art.com\n81book.com\n81comdns.com\n81ek.com\n81gfchina.com\n81guofang.com\n81hongshi.com\n81it.com\n81kx.com\n81lcd.com\n81man.com\n81pan.com\n81rzqh.cfd\n81tech.com\n81tt.net\n81xy.com\n81zhongwenx.com\n81zw.com\n81zw.la\n8203app.com\n8207hh.net\n8207uu.net\n82137777.com\n82158.com\n82250856.com\n822644.com\n8228.tv\n822ef055f1017.beer\n823238fa910271.beer\n82335966.com\n8243d76487f3a834.com\n8246.net\n8254ce48211021.beer\n8264.com\n82676666.com\n82686677.com\n82686699.com\n826pc.com\n826wan.com\n828385vip.com\n82859.com\n8289880.com\n828g.com\n828i.com\n82920.com\n8295099d311031.beer\n8295dc6e7e797638.com\n82987977.com\n829e30d07853f4fd.com\n82d5d0e4f10291.beer\n82e0dd98d1edbbb1.com\n82flex.com\n82ip.com\n82ky.com\n82l.net\n82pk.com\n8303.org\n83047.work\n83124.com\n83133.com\n83133.vip\n83152222.com\n8325.com\n8329607.com\n833006.net\n8333dhz.com\n8336.com\n833k5u23mb.com\n83480900.com\n834834002.com\n834834009.com\n834834vip4.com\n835444.cc\n835images48.com\n835images55.com\n835images61.com\n835images73.com\n835images76.com\n835images83.com\n83661111.net\n83666.com\n83753751.com\n8379888.com\n8383.vip\n838413.com\n838dz.com\n83934.com\n83990567.com\n83edu.net\n83h87d.com\n83iiq501o2.com\n83kxs.com\n83mo7n9giq.com\n83x.cc\n84.com\n84.vc\n84008.com\n84185858.com\n8421.com\n84308.com\n84399.com\n84460yhh7t.com\n844wan.com\n84560262.xyz\n845de4aca1019.beer\n845e4a87610292.beer\n846645d29f0aa91f.com\n84684.net\n8475.org\n8477.com\n848.com\n848.tv\n84d8388721016.beer\n84fk.com\n84ju.com\n84ke.com\n84ktv.com\n84ny.com\n84zcb.com\n850088.com\n850718.xyz\n8521.org\n85229666.com\n85253000.com\n85384.com\n853lab.com\n854255.com\n8543c0ee3b9082b5.com\n8558.org\n85657777.com\n85679999.com\n85791df5e89bcda6.com\n8579s.com\n857yx.com\n857zb1.tv\n85814.com\n85880234.com\n858game.com\n85c531cb9c14f457.com\n85f46a104256c205.com\n85jk.com\n85kf.com\n85sc.com\n85wp.com\n85xt.com\n86-import.com\n860029.com\n860527.com\n860598.com\n86079898.com\n8613.org\n861718.com\n86175.com\n861817.com\n86215.com\n86262.com\n863.cc\n863soft.com\n86516edu.com\n865211.com\n86586222.com\n86590.com\n866.com\n86656.net\n866ds.com\n8671099.com\n8673h.com\n86754.org\n867867jh.com\n8682.cc\n8684.com\n8686c.com\n8688g.com\n86933.com\n869d.com\n869v.com\n86a92644807597fa.com\n86amsdy.com\n86bdada6e1019.beer\n86bus.com\n86crk.com\n86ditu.com\n86dk.com\n86eh.com\n86eye.com\n86fis.com\n86fsp.com\n86game.com\n86gc.net\n86hcdnsuv.com\n86hh.com\n86hk.vip\n86hr.com\n86huoche.com\n86jg.com\n86joy.com\n86kang.com\n86kl.com\n86kongqi.com\n86lawyer.com\n86mai.com\n86mama.com\n86mdo.com\n86nb.com\n86office.com\n86pla.com\n86pm25.com\n86ps.net\n86rexian.com\n86sb.com\n86tec.com\n86tree.com\n86ty.com\n86uuu.com\n86wind.com\n86wol.com\n86xq.com\n86y.org\n86yqy.com\n87.vip\n870.com\n870818.com\n870q.com\n87111111.com\n87130000.com\n87131.vip\n87161.vip\n871659.org\n87188718.com\n872.cc\n872872.com\n8732365.com\n8733777251212.icu\n87388v.com\n875296.org\n8756s.com\n875902.vip\n8765043b5db2cbcb.com\n87654321.xyz\n8767.com\n8769d53.com\n876dns.com\n876web.com\n8770000.com\n87739b0fc18fe40a.com\n8775.com\n87753.net\n877771.xyz\n8779.com\n8782.org\n87870.com\n87872277.com\n878998.net\n87929796a10271.beer\n87949.cc\n8799.com\n87a37933611021.beer\n87b041a2019314d7.com\n87bc16a2fc6c4036.com\n87e1ed649c57575b.com\n87g.com\n87money.com\n87pk.com\n87vr.com\n87yy.com\n88-z.com\n88.com\n880.net\n8800.org\n880022.com\n8801.net\n880303.xyz\n880331.net\n88077777.com\n88090.com\n880sy.com\n880you.com\n88106.com\n88116008.com\n8811777.com\n881794d571016.beer\n881812c.com\n88183322.com\n88183355.com\n881ac9cfd560166d.com\n8821.com\n8822304.com\n88239001.com\n8825.com\n8828y.com\n88303887.com\n8831.app\n8831398.com\n88321268.com\n88360.com\n8838sl.com\n883dai.com\n884358.com\n8844.com\n88453392.com\n8848.com\n8848phone.com\n8848y.com\n885.com\n8850006.com\n885210.net\n88582.com\n8860.net\n8864.com\n8866.org\n886623.com\n8866316aav.work\n8866316apt.work\n8866886688.com\n8867556d88.net\n8868.com\n88682089.app\n8868a16.app\n8868vip130.app\n886966.com\n886abc.com\n886cdead210292.beer\n886vps.com\n887367.com\n88737v.com\n88765.com\n887777.com\n887w.com\n888-8.com\n8880666.com\n888132.com\n8882258ab4.shop\n888484.xyz\n888608.xyz\n8886664ad2.shop\n88880809.com\n88887777.com\n8888800000.com\n8889997777.com\n888ban.com\n888chem.com\n888eee777eee.com\n888jiagong.com\n888pic.com\n888ppt.com\n888rj.com\n888twt.com\n888win12.com\n8890.com\n8890tu.com\n8896.com\n88966.net\n8899.net\n88995799.com\n8899yyy.vip\n889d9745511021.beer\n88adb49761022.beer\n88bank.com\n88bx.com\n88c3eaa9f1015.beer\n88caijing.com\n88cdn.com\n88dushu.com\n88fang.com\n88fe6607b11011.beer\n88gogo.com\n88h3.com\n88hom.com\n88ht.com\n88icon.com\n88ipa.com\n88k.site\n88koo.com\n88la.cc\n88la.la\n88lan.com\n88laser.com\n88lmtupian.com\n88lot.com\n88meishi.com\n88mf.com\n88ming.net\n88order.com\n88pets.com\n88sup.com\n88sus.com\n88tang.com\n88tph.com\n88ttv.com\n88wbet.me\n88xiaoshuo.com\n88xr.org\n88y5.com\n88ysg.com\n88zha.com\n88zjzy.com\n89006006.com\n890bf715220716f3.com\n8910.io\n89178.com\n8926174358102.icu\n8928.org\n892qipai.com\n89303.com\n89438.com\n894994.com\n89538777.com\n89567.cc\n89609335.com\n8961zx.com\n896de44003a72c48.com\n896qipai.com\n89713742a93610e3.com\n897cdb929ebd7ee2.com\n898.travel\n89801133.com\n89808222.com\n8980cc.com\n8989118.com\n8989jt.com\n8999.cc\n89b12b5e3ff8085c.com\n89dj.com\n89doc.com\n89ds.com\n89f0e4a1603d3372.com\n89f9ee46410292.beer\n89qw.com\n89uu.com\n8a.hk\n8a10847841cdf19b.com\n8a53ccb021015.beer\n8ab113871fb000b2.com\n8ah.cc\n8aza.com\n8b0dead347366514.com\n8b2.net\n8b3efd3d91017.beer\n8b753196c6c34891.com\n8b92b52bd10301.beer\n8badedce210292.beer\n8bb.com\n8bcd9.com\n8bce394a2cdc5541.com\n8bd02a5c35c9ab25.com\n8bo.com\n8btc-ops.com\n8btc.com\n8btm.com\n8c657a4ba5616b4f.com\n8ce7bc1173775468.com\n8cname.com\n8cnet.com\n8d36745b85e5711c.com\n8d6a9a22611032.beer\n8d7c51ca60de7bc5.com\n8d8215f2d2278f42.com\n8d99e9f8b690b895.com\n8ddbf947e1020.beer\n8dei.com\n8dexpress.com\n8dn.com\n8dol.com\n8dou.com\n8dt.com\n8dudata.com\n8dus.com\n8dwww.com\n8e5da0c5911031.beer\n8e8z.com\n8eda52911f4518b6.com\n8ee1834c110272.beer\n8eeea09bc1009.beer\n8europe.com\n8f72500e910271.beer\n8faa7.com\n8fe.com\n8fenxiang.com\n8ft6h20ivn.com\n8ggq.com\n8gl.com\n8gn2i0i5fc.com\n8gov.com\n8gui.com\n8gyu.com\n8h15725mm7.com\n8hgame.com\n8hsleep.com\n8hy7q32i4q.com\n8i8b.com\n8jdns.net\n8jie8.com\n8jxn.com\n8jzw.cc\n8k5lu58221.com\n8k7k.com\n8kana.com\n8kjl34x2gj08.com\n8kkcny.click\n8kmm.com\n8kwebs.com\n8kzw.com\n8l8e.com\n8lag.com\n8lhx.com\n8liuxing.com\n8lj.cc\n8llp.com\n8lun.com\n8m8t.com\n8mcn.com\n8mhh.com\n8mi.tech\n8minzk.com\n8miu.com\n8miu.net\n8mkt.com\n8moom.com\n8mpaoche.com\n8ms.xyz\n8n2.com\n8n6n.com\n8njy.com\n8o9o.com\n8pig.com\n8pingce.com\n8pu.com\n8qwe5.com\n8qzy.com\n8rlq38736p.com\n8rn4u.com\n8rs8i.com\n8s123.com\n8shop.cc\n8so.net\n8tennis.com\n8tgh.com\n8tool.club\n8tupian.com\n8tupian.net\n8u18.com\n8u58.com\n8u7q5l9gox.com\n8uid.com\n8uyx.com\n8wan.com\n8win.com\n8win.net\n8wiu.com\n8wq.com\n8wss.com\n8wym.com\n8x6x.com\n8xs.org\n8xz8.com\n8yao2hds35sv.com\n8ydsp.com\n8ym8.com\n8ytech.com\n8yx.com\n8z.net\n8zhuayu.cc\n8ziben.com\n8zntx.com\n8zy.com\n9-xin.com\n9-zhuce.com\n9.biz\n9.xyz\n90.cc\n900.la\n900.vc\n9000wy.com\n900112.com\n900501.xyz\n900cha.com\n900d8ac6110261.beer\n900php.com\n900ppt.com\n900yi.com\n90123.com\n9018.net\n90231611e4973cbb.com\n904e0d2ba10241.beer\n9056b8f915baba58.com\n90576.com\n90686.com\n906you.com\n90747.pro\n9090cdndns.com\n90a7597f835b14bd.com\n90ao.com\n90b5d42ca1016.beer\n90c6.com\n90dao.com\n90ers.com\n90game.bet\n90ko.net\n90kuai.net\n90lhd.com\n90qh.com\n90sheji.com\n90sjimg.com\n90tank.com\n90vm.com\n90wmoyu.com\n90yang.com\n90yk.com\n90zm.net\n91-box.com\n91.com\n91.plus\n9100.ink\n9105.cc\n9105.com\n91084.com\n910app.com\n910play.com\n911.vip\n91103d3a31014.beer\n9111.tv\n91118.com\n91160.com\n911zy.com\n912355.com\n912366.com\n9125flying.com\n912688.com\n912hf.com\n912k.com\n912yx.com\n91300.com\n9133.com\n9136.com\n91360.com\n91378.com\n913aefac85f5bf8f.com\n913pc.com\n913vr.com\n913you.com\n9149df3441020.beer\n915.tv\n9154wan.com\n91558.com\n915658.com\n91583.com\n91588kf.org\n915d.tv\n916360.net\n9166yx.com\n916m.com\n917.com\n9170.com\n917st.com\n91827364592013.icu\n91827364592018.icu\n9186.com\n9188.com\n9188.work\n918canyin.com\n918dxs.com\n918fg.com\n918ka.cc\n918rc.com\n919.com\n9191mr.com\n9191net.com\n9191steel.com\n9191zx.com\n9193.com\n91985.com\n9199.com\n919watch.com\n91ac.com\n91act.com\n91ajs.com\n91all.net\n91anjian.com\n91art.net\n91baby.com\n91boshi.net\n91boshuo.com\n91bushou.com\n91carnet.com\n91cdkey.com\n91cha.com\n91changxie.com\n91chengguo.com\n91convert.com\n91ctc.com\n91cy.app\n91cy.cc\n91czxs.com\n91daizhang.com\n91danji.com\n91datong.com\n91dba.com\n91dbb.com\n91dbq.com\n91ddcc.com\n91ddedu.com\n91dict.com\n91dnso.com\n91doujin.com\n91dub.com\n91duba.com\n91duobaoyu.com\n91em.com\n91es.com\n91exam.org\n91exiu.com\n91facts.com\n91fangan.com\n91fifa.com\n91fyt.com\n91game.com\n91goodschool.com\n91haigui.com\n91haiju.com\n91haoka.com\n91haoke.com\n91health.net\n91hecheng.com\n91hmi.com\n91https.com\n91huayi.com\n91huayi.net\n91huifu.com\n91huoke.com\n91huola.com\n91hy.com\n91idc.gg\n91ifx.com\n91ios.com\n91ios.fun\n91jbz.com\n91jf.com\n91jiabohui.com\n91jiafang.com\n91jianguo.com\n91jin.com\n91jinjindai.com\n91jinrong.com\n91jinshu.com\n91jiujige.com\n91jkj.com\n91jkys.com\n91jlb.com\n91jm.com\n91jmw.com\n91job.com\n91join.com\n91jtg.com\n91k7.com\n91kami.com\n91kq.com\n91kw.net\n91laihama.com\n91laiz.com\n91ld.com\n91lda.com\n91leju.net\n91lewei.com\n91listen.com\n91lsf.com\n91lx.com\n91m.co\n91maibiao.com\n91maths.com\n91meitu.com\n91miaoshou.com\n91muou.icu\n91muzhi.com\n91ninthpalace.com\n91nzh.com\n91pandian.com\n91pdf.com\n91petct.com\n91php.com\n91post.com\n91pusi.com\n91q.com\n91quce.com\n91qycl.com\n91rjz.com\n91ronghui.com\n91ruyu.com\n91saishi.com\n91sd.com\n91sem.cc\n91sfdj.com\n91shenfan.com\n91short.com\n91shouce.com\n91smart.net\n91soer.com\n91soker.com\n91sotu.com\n91soumu.com\n91sph.com\n91sst.com\n91strategy.com\n91student.com\n91suan.com\n91suke.com\n91switch.com\n91syun.com\n91taoke.com\n91ting.net\n91tm45tzyb.com\n91toolbox.com\n91tty.com\n91tvb.cc\n91tw.net\n91up.com\n91vpn.com\n91vps.com\n91vrchat.com\n91vst.com\n91waijiao.com\n91waitang.com\n91wangcai.com\n91wangyx.com\n91way.com\n91weimai.com\n91wenmi.com\n91wenwen.net\n91wllm.com\n91wujia.com\n91wutong.com\n91wzg.com\n91x.org\n91xch.com\n91xcm.com\n91xfw.com\n91xiake.com\n91xiazai.com\n91xinshang.com\n91xjcs.com\n91xsj.com\n91xunyou.com\n91xxt.com\n91xy.com\n91y.com\n91yao.com\n91yinpin.com\n91yixun.com\n91yk.com\n91yong.com\n91you.com\n91youban.com\n91youchai.com\n91youxi.com\n91yoyo.net\n91yu.com\n91yuedu.com\n91yunxiao.com\n91yunying.com\n91yxbox.com\n91yxl.com\n91zhongkao.com\n91zhuti.com\n91znyx.com\n91zxw.com\n92.net\n920uc.com\n921.com\n9211.com\n9217fdb98dcc13a8.com\n9217web.com\n92220556.com\n92220558.com\n92220577.com\n92220668.com\n92220701.com\n92220760.com\n92224i.net\n92224s.com\n922997xtz2.shop\n923f92a4e1df1753.com\n924747.com\n925g.com\n925ps.com\n926kf.com\n92751437c39b61ee.com\n927927.com\n927953.com\n927game.com\n928.sale\n928vbi.com\n928xpj.com\n92913.com\n929825.com\n92987.com\n9299.net\n929g.com\n929vip.shop\n92anycall.com\n92ay.com\n92bbs.net\n92bce178d60f5a3e.com\n92cf4088b1014.beer\n92cloud.com\n92demo.com\n92dp.com\n92dpw.com\n92dydh.com\n92e483231a9103f8.com\n92fa.com\n92fox.com\n92gyw.com\n92hidc.net\n92jzh.com\n92kaifa.com\n92kk.com\n92le.com\n92lm.com\n92lucky.com\n92mp.com\n92nas.com\n92ni.com\n92oz46nne1.com\n92scj.com\n92shuoshuo.com\n92sucai.com\n92to.com\n92txt.cc\n92u93e.com\n92wan.com\n92wudao.com\n92wx.com\n92wx.la\n92wy.com\n92xygame.com\n92y.co\n92yanqing.com\n92yo.com\n92zc.com\n92zhiqu.com\n92zuqu.com\n930a48879eaa652b.com\n930hh.com\n9312.net\n93126.org\n93135.com\n931931jh.com\n933.moe\n933332.xyz\n93376v.com\n934dsw.com\n934hd.com\n93636.com\n936u.com\n9377a.com\n9377d.com\n9377df.com\n9377g.com\n9377j.com\n9377ja.com\n9377z.com\n9378.com\n93913.com\n939397.vet\n93966.com\n93977v.com\n93984.org\n93e8209f610272.beer\n93eu.com\n93fbf3a7f10281.beer\n93gaokao.com\n93hdw9.com\n93jiang.com\n93jx.net\n93kk.com\n93land.com\n93lh.com\n93njf0.com\n93pk.com\n93sdk.com\n93sem.com\n93soso.com\n93trf.com\n93tyy.com\n93wgames.com\n93yo.com\n93you.com\n93zp.com\n94001.com\n94001.vip\n940177.com\n940304.xyz\n94113162.xyz\n94117.net\n941adu.com\n941gb.com\n942mc.com\n94362.com\n9437803d210271.beer\n944.com\n94445.com\n9453job.com\n945d3447ed068dbd.com\n945n48.com\n946000.com\n9466.com\n947fd9a0011042.beer\n94831.com\n9486483.com\n948hj.com\n949047l1jr.com\n9495.com\n94994.com\n949949.com\n94ad.com\n94afx.com\n94beb5b921021.beer\n94cb.com\n94cto.com\n94fcb6f5810241.beer\n94gan.net\n94goo.com\n94he38.com\n94i5.com\n94kuai.com\n94mxd.com\n94php.com\n94q.com\n94qy.com\n94rmb.com\n94rp.com\n94te.com\n94xy.com\n94you.net\n94ys.com\n95-1.vip\n95.com\n95001111.com\n95007.com\n95013.com\n95021.com\n950901.com\n95095.com\n950c6df3c6ee90b1.com\n95105105.com\n95105369.com\n95105555.com\n95105888.com\n95105899.com\n9512.net\n951280.com\n951368.com\n95158.com\n95169.com\n95191.com\n95195.com\n951dns.com\n95262.com\n9527cha.com\n9527cloud.com\n9527dns.com\n9527g.com\n95303.com\n95311.com\n9533.org\n953yx.com\n95408.com\n9540f8f83e1e7a8c.com\n95447.com\n95504.net\n95504test.com\n95508.com\n95516.com\n95516.net\n95526.mobi\n95528.com\n9553.com\n9557.com\n95572.com\n95579.com\n95580.net\n95588.com\n95598pay.com\n95599.hk\n955yes.com\n9560.cc\n95600.vip\n9564.com\n95659.org\n9567.com\n95684f80222b921a.com\n957431860395659.icu\n9574528ue9.com\n95779.com\n958358.com\n9588.com\n95890.com\n959.com\n9595111.vip\n95a.co\n95b.co\n95bd.com\n95dns.cc\n95dushu.com\n95dushu.net\n95e.co\n95en.com\n95epay.com\n95fenapp.com\n95ib.com\n95ip.com\n95jizhang.com\n95k.com\n95links.com\n95ns.net\n95px.com\n95shubao.info\n95to59.com\n95xiu.com\n95ye.com\n95yijing.com\n95zh.com\n96005656.com\n960123.com\n960638.com\n96090090.com\n96096kp.com\n960rc.com\n9610.com\n96110.org\n9611111.com\n96160.cc\n96189.com\n96189.tv\n9618968.com\n96192.com\n962.net\n962007.com\n962168.com\n962222.net\n96225.com\n962360.com\n962518.com\n962600.com\n96262.com\n96335.com\n96355.com\n96369.net\n963695.com\n963999.com\n96459.com\n964yx.com\n965.one\n96519.org\n96528.com\n96533.com\n965373.com\n96558.com\n9655bcfbe1022.beer\n96567.com\n96590.net\n9663.com\n9665.com\n966599.com\n9665yx.com\n9666666.com\n9666sr.com\n966zlnfjuza4oloh2bk.app\n96804.com\n96811.com\n96811.net\n96822.com\n968309.com\n968550.com\n96856.org\n9686000.com\n96877.net\n968816.com\n9688896.com\n968pk.com\n969009.com\n9692bc70da600f84.com\n969368.com\n96966.com\n969g.com\n96ac893dd11011.beer\n96b25c0edb71ca11.com\n96caifu.com\n96cc09c581022.beer\n96ce3cebe11042.beer\n96daa24471013.beer\n96dp.com\n96eaa004b05872ae.com\n96f2d.com\n96flw.com\n96hq.com\n96kaifa.com\n96lh.net\n96lou.com\n96ni.net\n96pk.com\n96sdk.com\n96sir.com\n96weixin.com\n96yx.com\n96zxue.com\n97.biz\n97.cc\n970mhz.com\n97111.work\n9718.com\n9718game.com\n972.com\n9724.com\n9736s.com\n97576.com\n97616.net\n97654.com\n97665.com\n97775.com\n9778.com\n977k.com\n977zy.com\n97866.com\n9787.com\n978clouds.com\n978s.com\n97936.com\n97971166.com\n97971188.com\n97972209.com\n97973.com\n97973309.com\n97973399.com\n97975508.com\n97976608.com\n9797cp2.com\n9797ly.com\n9797x4.com\n9797x7.com\n9799.com\n9799251212480.icu\n97a12bb360b26d1c.com\n97add.com\n97bacdab676db530.com\n97ce6cbd010292.beer\n97d9f793c1022.beer\n97doc.com\n97f6185064157973.com\n97gg.net\n97go.com\n97jiayou.com\n97jindianzi.com\n97jz.com\n97kid.com\n97kks.com\n97lp.com\n97lpw.com\n97lrf0l3xa.com\n97ol.com\n97rp.com\n97rx.com\n97ting.com\n97ui.com\n97uimg.com\n97wd.com\n97wyw.com\n97xdj.net\n97zm.com\n98.com\n98.ma\n98030.center\n980512.com\n980cje.com\n981.ee\n98182.com\n98187411.com\n9823f7b9o6.com\n98388fafafa.com\n984g.com\n985.so\n985900.com\n985dh.com\n985hezi.com\n985ks.com\n985ks.net\n985sy.com\n98612.com\n9862ad1f310292.beer\n98654.com\n987.com\n9873.com\n9876game.com\n9877.com\n987app.com\n987dns.com\n987you.com\n98809.com\n988848a9d1013.beer\n98892.com\n988sl.com\n9891.com\n9891760ee2389285.com\n989198.com\n98945.org\n9898049.com\n98982201.com\n98982202.com\n98982288.com\n98982601.com\n98983355.com\n98984422.com\n98986688.com\n9898758.com\n98987729.com\n9898jh2.com\n98b8cd6b21011.beer\n98cloud.com\n98d4c586f11012.beer\n98du.com\n98e774f505d78b1a.com\n98ep.com\n98eye.com\n98k4.com\n98lm.com\n98mc.cc\n98mp.com\n98nice.com\n98one.com\n98t.la\n98t.net\n98tang.com\n98tsg.com\n98w.co\n98weixin.com\n98xiaoshuo.com\n98xz.com\n98yl.com\n98zhibo.com\n98znz.com\n98zw.com\n99.com\n99113guoji.com\n99114.com\n99118.com\n9911yx.com\n99166.com\n9917.com\n9918.tv\n99193.com\n991fd1ce91009.beer\n991kang.com\n991quka.com\n9928.tv\n99357b59811012.beer\n9935china-air.com\n9939.com\n993937.com\n99394.com\n993h.com\n9942.org\n99442.com\n9944wb.com\n99469.com\n994t7px765.com\n994wan.com\n9950air.com\n9951.cc\n995120.net\n99520.love\n996.com\n996007.icu\n9963.org\n996404.xyz\n9965dns.com\n9966.com\n9966.org\n9966333.com\n9966886699.com\n996996.com\n996a.com\n996box.com\n996dns.com\n996pic.com\n996sdk.com\n9973.com\n997788.com\n998.com\n9981ypk.com\n9982.com\n998231.com\n998274.com\n99844666.com\n99887w.com\n998917.com\n99895.org\n998jk.com\n998jx.com\n998law.com\n998tool.com\n9991.com\n999120.net\n999125.com\n999136.xyz\n999178.com\n999765.xyz\n999777.com\n9998.tv\n99988866.xyz\n9999224xtz1.shop\n99999dns.com\n999abc333abc.com\n999ask.com\n999brain.com\n999d743c51022.beer\n999inandon.com\n999mywine.com\n999shengqian.com\n999tea.com\n999welder.com\n999wx.com\n99aiji.net\n99aly.com\n99bdf.com\n99biaozhun.com\n99bill.com\n99bo.cc\n99box.com\n99brand.com\n99bs.club\n99caiba.com\n99cc.com\n99cfw.com\n99cha.com\n99cloud.net\n99corley.com\n99count.com\n99danji.com\n99dingding.com\n99down.com\n99dushu.com\n99dushuzu.com\n99dw.com\n99eo.com\n99eyao.com\n99fang.com\n99fei.net\n99fenlei.com\n99fund.com\n99fund.org\n99haoche.com\n99haoling.com\n99hdf.com\n99hkjf.com\n99huodong.xyz\n99ielts.com\n99inf.com\n99inn.cc\n99jee.com\n99jianzhu.com\n99jiasu.com\n99jiasu.net\n99jrk.com\n99kf.com\n99kt.com\n99ku.cc\n99ku.vip\n99kypay.com\n99leidun.com\n99max.me\n99mc.com\n99meihua.com\n99meiju.tv\n99mk.info\n99mk.la\n99mk.net\n99mssj.com\n99mst.com\n99music.net\n99n.me\n99nets.me\n99pdf.com\n99ppt.com\n99qh.com\n99qibang.com\n99qimingzi.com\n99qumingzi.com\n99read.com\n99shi.com\n99shou.com\n99sj.com\n99sky.com\n99sun.com\n99sushe.com\n99sy.co\n99thz.com\n99tianji.com\n99tongxuelu.com\n99uri.com\n99weiqi.com\n99wj.com\n99wuxian.com\n99xr.com\n99xueshu.com\n99youmeng.com\n99ys.com\n99yunshi.com\n99yx.com\n99zihua.com\n99zzw.com\n9a04d8da811031.beer\n9a9m.com\n9aca7ec4f5ae25e5.com\n9ailai.com\n9aimai.com\n9air.com\n9amts.com\n9aoduo.com\n9aola.com\n9b09eea7810251.beer\n9b11b109-ab3d-4193-ac60-79cc19b3e76d.link\n9b37f3cc81011.beer\n9bb4cf93e10261.beer\n9bianli.com\n9c0c0433602d188a.com\n9c67282f22796ac6.com\n9c941a3b41021.beer\n9ca4b8eca1019.beer\n9cao9.com\n9cb.com\n9ccapital.com\n9ce69ea6b10272.beer\n9cfa10ad910291.beer\n9che.com\n9chew.com\n9clive.com\n9conn.net\n9d19.com\n9d47e2c251009.beer\n9d86072bbc545262.com\n9d87bc4302122ef4.com\n9damao.com\n9damao.net\n9day.cc\n9db.cc\n9ddm.com\n9de3c7ffb10291.beer\n9deli.com\n9dfb917ee1019.beer\n9dfx.com\n9dian.info\n9dida.net\n9dinn.com\n9douyu.com\n9droom.com\n9duw.com\n9dwork.com\n9e707bdb763386bf.com\n9eacc080d10291.beer\n9ead.com\n9eae58cbc333acf8.com\n9earth.com\n9efca2b9a1009.beer\n9eip.com\n9ele.com\n9etravel.com\n9f113d434f8c49f0.com\n9f7ef6acd10291.beer\n9fapi.com\n9fav.com\n9fb8d5b6bff66a4d.com\n9fbank.com\n9fe3e7d4c10311.beer\n9fh5.com\n9first.com\n9flb.com\n9fmk.com\n9fo.com\n9fonecard.com\n9fpuhui.com\n9fs.com\n9fzt.com\n9fzt.net\n9g8g.com\n9gg.cc\n9ghao.com\n9gt.net\n9he.com\n9hier.com\n9host.org\n9hou.com\n9ht.com\n9huadian.net\n9i0i.com\n9icad.com\n9icode.net\n9icy.com\n9idudu.com\n9igcw.com\n9ihb.com\n9ihome.com\n9ijf.com\n9ilrc.com\n9ilu.com\n9imobi.com\n9inx.com\n9ioldgame.com\n9iphp.com\n9ishe.com\n9ist.com\n9iwanwan.com\n9iwz.net\n9ixf.com\n9ixiuxiu.com\n9j9y.com\n9ji.com\n9juewu.com\n9jx.com\n9k01.com\n9k9k.com\n9ka.vip\n9kcs.com\n9kd.com\n9khc0iv5n7.com\n9kkk.xyz\n9kld.com\n9kus.com\n9laidu.net\n9linux.com\n9liuda.com\n9ljr84.xyz\n9longe.net\n9m7v44974i.com\n9man.com\n9mayi.com\n9miao.com\n9mic.com\n9nali.com\n9newlive.com\n9ngames.com\n9niu.com\n9nj563358x.com\n9now.net\n9ok.com\n9om.com\n9omj.com\n9one.cc\n9open.com\n9orange.com\n9p.net\n9pinke.com\n9pk.net\n9qd0wul789.com\n9qu.com\n9ria.com\n9sb.net\n9sgx.com\n9shadow.com\n9skb.com\n9skm.com\n9sky.com\n9slab.com\n9sleep.org\n9sug.com\n9syw.com\n9t-tech.com\n9taobao.com\n9taohao.com\n9tax.com\n9to.com\n9tong.com\n9tonglian.com\n9tov.com\n9u8u.com\n9upk.com\n9vf.com\n9w1an.com\n9w9.com\n9wee.net\n9wuli.com\n9wwx.com\n9xdb.com\n9xgame.com\n9xic.com\n9xinli.com\n9xiu.com\n9xiuzb.com\n9xo9.com\n9xs.org\n9xun.com\n9ya.net\n9yao.com\n9yaocn.com\n9yc.com\n9ye.com\n9yiban.com\n9you.com\n9you.net\n9yread.com\n9yue.com\n9yuntu.com\n9yuonline.com\n9yz.com\n9zas5.com\n9zhen.com\n9znet.com\n9zx.com\na-b.cc\na-du.net\na-isv.org\na-jazz.com\na-liai.com\na-map.co\na-map.link\na-map.vip\na-startech.com\na-sy.com\na-xun.com\na.xttv.top\na0318.com\na049636971024.beer\na04d48409e40ca3f.com\na0598.com\na0770.com\na0bi.com\na0d73230f9d52dfb.com\na0fca7a55be096ef.com\na135.net\na142b5e7511011.beer\na1789.com\na18.ltd\na1891cc2258a919b.com\na1a22678d1019.beer\na1coin.xyz\na1t2w1lzfr.com\na21fs.com\na29e2657018e645b.com\na2dongman.com\na2e1c81dce0fd3ce.com\na2gu2.com\na30437f3510292.beer\na32bd427dd.skin\na335cb802c120705.com\na33a8c8c81011.beer\na40dc409e2ea86b1.com\na42c6d113874e1f3.com\na44aeaeac1016.beer\na45e4f5fd10272.beer\na465a95641016.beer\na490cce2411032.beer\na4da96ae511032.beer\na4s6.com\na4size.net\na5.net\na5089302099a537e.com\na5380a8e41016.beer\na5399.com\na549543886.asia\na5600.com\na58cd776cc.baby\na5b.cc\na5idc.com\na5idc.net\na5j.cc\na5lt.com\na5xiazai.com\na5y.net\na61cee76f4df41b1.com\na632079.me\na6562752811032.beer\na6h8.com\na6ksw.net\na7.com\na700in.ren\na7479032d1014.beer\na74be6c3e1021.beer\na756716251017.beer\na75d755806b1095d.com\na7647e3f151b4a5d.com\na766.com\na789.org\na7a13fde51022.beer\na7c6e291d10292.beer\na7d4bd3ce10281.beer\na7dcb6d9011032.beer\na8.com\na83c8524b88a06ae.com\na87807b4811031.beer\na87f34a60cf36893.com\na88b9f894719c3d8.com\na88dc138be.run\na8f947.com\na8tg.com\na8u.net\na8z8.com\na909ed7022b1ecc1.com\na9188.com\na963.com\na96b32e2b1015.beer\na9998f7ed11042.beer\na9c7f491710251.beer\na9market.com\na9vg.com\na9x9.com\naa-lsk.com\naa08072678.xyz\naa152.com\naa360.net\naa433d1b51013.beer\naa43z7.com\naa4491.com\naa50b44761011.beer\naa56238652.com\naa5c82aeb10271.beer\naa5d.com\naa65535.com\naa6666.com\naa6f0397a3cf50d7.com\naa76858896.com\naa77kk.com\naa84c23fc4aa335a.com\naaalawfirm.com\naaalogisticsgroup.com\naaareplicawatch.com\naaawz.cc\naaayu.com\naaayun.com\naabooo.com\naabqn.com\naac3442de07869c0.com\naacoptics.com\naactp.net\naad5.com\naadcloud.com\naadongman.com\naads-cng.net\naafxw.com\naai07251mu.com\naai07260mu.com\naakss.com\naaltosemi.com\naamets.com\naamev.com\naamgame.com\naamgame.mobi\naamgame.net\naamsmart.com\naamyoe.com\naanroute.net\naap5.com\naapinche.org\naaplimg.com\naardio.com\naarkpbkc.com\naaronlam.xyz\naaspt.net\naastartups.com\naatccn.com\naatcmdvi.com\naateda.com\naauc.net\naaucwbe.com\naavisa.com\naawvw.com\naaxinwen.net\naaygw.com\naaym.net\naayu.today\naayun.icu\naazao.com\nab-sm.com\nab126.com\nab173.com\nab1989.com\nab365.com\nab839c2562b8ae05.com\nabaa.cc\nabacaipu.com\nabackup.com\nabaizx.com\nabang.com\nabaoge.com\nabatour.com\nabbbio.com\nabbisko.com\nabbooa.com\nabbreviat.com\nabbyschoice.net\nabc-ca.com\nabc-love.com\nabc119.tv\nabc12366.com\nabc151.com\nabc188.com\nabc369.net\nabc4game.com\nabc56692388.com\nabc59783718.com\nabc7722.com\nabcache.com\nabcbank.shop\nabcdd10006.icu\nabcdd10032.icu\nabcdd10034.icu\nabcdd10046.icu\nabcdocker.com\nabcdv.net\nabcerikk8.com\nabcfintech.com\nabcgonglue.com\nabchina.com\nabchinalife.com\nabcjiaoyu.com\nabckantu.com\nabcleasing.com\nabclive2-lh.akamaihd.net\nabclogs.com\nabcpost.com.au\nabcrcw.com\nabcs8.com\nabcsbank.com\nabctime.com\nabcve.com\nabcxb.com\nabcxx.net\nabcxyzkk.xyz\nabcydia.com\nabd007.com\nabddn.com\nabdf002.com\nabe-sz.com\nabe-tech.com\nabedu.net\nabef6142010291.beer\nabercrombie.com\nabesmoke.com\nabhouses.com\nabiechina.com\nabifsey.com\nabitcg.com\nabite.com\nabiz.com\nabkou.com\nable-elec.com\nablejeans.com\nablesci.com\nablesky.com\nabletive.com\nablman.com\nabloz.com\nably.fan\nabmjc.com\nabnen.com\nabnotebook.com\naboatedu.com\naboboo.com\naboilgame.com\nabond.net\naboutcg.com\naboutcg.net\naboutcg.org\naboutgk.com\naboutmy.name\naboutnew.net\naboutyun.com\naboveyunbo.com\nabox.plus\nabpuvw.com\nabreader.com\nabslw.com\nabsoloop.com\nabsst.com\nabtd.net\nabtnetworks.com\nabtpaper.com\nabtt266.com\nabublue.com\nabundancen.com\nabuquant.com\nabusi.net\nabusky.com\nabuyun.com\naby.pub\nabykt.com\nabyssdawn.com\nac.fun\nac268.com\nac3ba49731016.beer\nac57.com\nac6891953e265977.com\nac78416978de6213.com\nacabridge.net\nacachina.com\nacademygkusa.com\nacademypublication.com\nacadn.com\nacb365.com\nacbiot.com\nacc3.net\nacc5.com\naccdisplay.com\naccelerateg.com\nacceleratet.com\naccelink.com\nacceptablt.com\naccessads.net\naccessgood.com\naccessibility-union.com\naccessibility-union.net\naccessibility-union.org\naccessibilityunion.com\naccessibilityunion.net\naccessibilityunion.org\naccessicp.com\naccessoft.com\naccesspath.com\naccgame.com\naccio.com\nacclb.com\nacclb.net\nacconsys.com\naccopower.com\naccount.htcvive.com\naccr.cc\naccsh.org\nacctdns.com\nacctdns.net\naccu.cc\naccuramed.com\naccurate-china.com\naccurate520.com\naccxiaoheihe.com\nacdianyuan.com\nacdnrvh.com\nace-info.com\nace-pow.com\nace-rubber.com\nace06a98610272.beer\nace113.com\nacejoy.com\nacelamicro.com\naceoo.com\nacepanel.net\nacesheep.com\nacetace.com\nacetaffy.club\nacetar.com\nacewill.net\nacexpress.org\nacfechina.org\nacflow.com\nacftu.org\nacfun.com\nacfun.net\nacfun.tv\nacfunchina.com\nacfunchina.net\nacg.gd\nacg.tv\nacg.xin\nacg169.com\nacg17.com\nacg183.com\nacg18s.com\nacg4.com\nacg6.com\nacgdb.com\nacggit.com\nacgist.com\nacglivefan.com\nacgmc.com\nacgorg.com\nacgpic.net\nacgpp.net\nacgrenwu.com\nacgres.com\nacgsan.com\nacgsky.win\nacgtofe.com\nacgtubao.com\nacguxhda.com\nacgvideo.com\nacgvr.com\nacgwolf.com\nacgzc.com\nacgzyj.com\nachiming.com\nachizi.com\nacing.com\nacingame.com\nacirclea.com\nacirno.com\nacjw.net\nackjled.com\nacloudbaas.com\nacloudrender.com\nacm.org\nacmcoder.com\nacmec-e.com\nacmemob.com\nacmetranslation.com\nacmoba.com\nacmsearch.com\nacmturc.com\nacnow.net\naco-musical.com\nacoloo.com\nacoolread.com\nacpf-cn.org\nacplay.net\nacq42.com\nacqiche.com\nacqyjg.com\nacrel-eem.com\nacrel-microgrid.com\nacrel-znyf.com\nacrossmetals.com\nacroview.com\nacs.org\nacshoes.com\nacsrq.com\nact-telecom.com\nactacams.com\nactamath.com\nactbbs.com\nactcn.net\nacthao.com\nacthd123.com\nactime.net\nactions-semi.com\nactionsky.com\nactivate.activation-v2.kaspersky.com\nactivation-gp.com\nactivation-v2.kaspersky.com\nactiveclub.net\nactivepower.net\nactivity-dy.com\nactivity-wbsj.com\nactivity-zhendingtech.com\nactivity01.com\nactivity02.com\nactivity03.com\nactivity04.com\nactivity05.com\nactivitybyte.com\nactoys.com\nactoys.net\nactranslation.com\nactself.me\nactuive.com\nacuangle.net\nacumoxj.com\nacwapowercn.com\nacwifi.net\nacwing.com\nacwlkj.com\nacxk.net\nacxxg.com\nad-cn.net\nad-diamond.com\nad-gone.com\nad-goods.com\nad-squirrel.com\nad-young.com\nad110.com\nad22b2e021014.beer\nad2b0298510251.beer\nad321.cc\nad5.com\nad518.com\nad77.com\nad778.com\nada-post.com\nadamahf.com\nadamcdn.com\nadamcoder.com\nadamerck.net\nadanachina.com\nadapay.tech\nadas.com\nadbgz.com\nadbiding.com\nadbvllc.cfd\nadc-expo.com\nadcdn.com\nadcomeon.com\nadcotechina.com\naddaad.com\naddchina.com\naddgog.com\naddimmar168.com\naddinghome.com\naddnewer.com\naddog.vip\naddoom.com\naddpcn.com\naddpv.com\naddww.com\naddx.live\nade8.com\nadeasyx.com\nadebang.com\nadebibi.com\nadeccogroupcn.com\nadellock.com\nadesk.com\nadeskpro.com\nadexplain.com\nadfaith.com\nadfortest.com\nadfuns.com\nadfyt.com\nadg-dental.com\nadguardprivate.com\nadhei.com\nadhimalayandi.com\nadhubbj.xyz\nadhudong.com\nadi-whatsepp.com\nadianshi.com\nadiexpress.com\nadigifactory.com\nadiic.com\nadinju.com\nadipman.net\nadjdds.com\nadjucai.com\nadjuz.com\nadjyc.com\nadkjpx.com\nadl163.com\nadl888.com\nadlainortye.com\nadlefei.com\nadlo.net\nadluckin.com\nadm88888.com\nadm999.com\nadmai.com\nadmaimai.com\nadmama.com\nadmamax.com\nadmbucket.com\nadmile.xyz\nadmin04.com\nadmin10000.com\nadmin345.com\nadmin5.net\nadmin88.com\nadmincdn.com\nadmintony.com\nadminxe.com\nadminxy.com\nadmob-cn.com\nadmobclick.com\nadmobile.mobi\nadmonitor.org\nadmqr.com\nadmsger.com\nadmsidea.com\nadmtvs.com\nadmunan.com\nadmxh.com\nadnineplus.com\nadnrhy.com\nadobe-tool.com\nadobeae.com\nadobeedu.com\nadobesc.com\nadoebike.com\nadonest.com\nadongyu.com\nadoregeek.com\nadoutu.com\nadparticle.com\nadpchina.com\nadpfm513.com\nadplusx.com\nadpsh.com\nadqtt.net\nads66.com\nadsalecdn.com\nadsalecprj.com\nadsame.com\nadscover.com\nadsctl.com\nadseye.com\nadseyeservice.com\nadsfancy.com\nadshonor.net\nadshuju.com\nadsjdy.com\nadslr.com\nadsmogo.com\nadsmogo.mobi\nadsmogo.net\nadssaas.com\nadssap.com\nadsspr.com\nadstarcharm.com\nadsue.com\nadsuni.com\nadtaipo.com\nadtchrome.com\nadtianmai.com\nadtime.com\nadtmm.com\naduan.cc\nadubest.com\naduer.com\nadult-stem-cells.com\nadunicorn.com\nadunimax.com\nadunioncode.com\naduspot.com\nadutou.com\nadvanced-microsemi.com\nadvanced-pneumatics.com\nadventsoft.org\nadvertcn.com\nadvich.com\nadvisionhorizon.com\nadvlion.com\nadvuser.com\nadwanji.com\nadwebcloud.com\nadwep.com\nadwery.com\nadwintech.com\nadwke.com\nadwork.net\nadx.pw\nadxflow.com\nadxiuqia.com\nadxliangmei.com\nadxmax.com\nadxmq.com\nadxqd.com\nadxwork.com\nadxyun.com\nadyoc.com\nadyounger.com\nadyuedong.com\nadzhongdian.com\nadzhp.cc\nadzhp.net\nadzhp.site\nadznb.com\nadzshd.com\nae-inbr.xin\nae0f9d6cf11021.beer\nae1234.com\nae224e62eb93c42a.com\nae256.com\nae3a6d6e09359c15.com\nae58c58c051aacd9.com\nae5de9f6f1021.beer\nae60.com\nae7b5112dd1be127.com\naebell.com\naebiz.net\naec188.com\naecbattery.com\naecc-mall.com\naecichina.com\naecname.com\naecsian.com\naeec9b62d1016.beer\naeenergy.com\naeenets.com\naeespace.com\naegcar.com\naegis-env.com\naegisafe.com\naegisx.net\naegonthtf.com\naehyok.com\naeicei.com\naeink.com\naeinsen.com\naekyungnb.com\naemedia.org\naemoban.com\naeneag.xyz\naeo-cctv.com\naeolustyre.com\naeonbuy.com\naeonmall-china.com\naeonmed.com\naeoto.net\naepku.com\naerchs.com\naerdai.com\naerfaying.com\naerivon.net\naero-shenyang.com\naerochina.net\naerocityholding.com\naerofugia.com\naes-beijing.org\naesimka.com\naesoftland.com\naestheticbutler.xyz\naesucai.com\naevit.xyz\naexpec.com\naf122.com\naf165fa2910261.beer\naf26a21252823cc6.com\naf36.com\naf360.com\naf4bfc60f11011.beer\naf8d4587126e00c0.com\nafaisouth.com\nafang.com\nafanti100.com\nafarway.com\nafbd4a3905a4a9a5.com\nafca-asia.org\nafca6b82c11032.beer\nafcec.com\nafcfsf.xyz\nafcs.dell.com\nafdian.com\nafdian.net\nafdiancdn.com\nafdsc.com\nafdvr.cc\nafdvr.com\nafe-whatsepp.com\nafea4f9221023.beer\nafeica.com\nafengblog.com\nafengsoft.com\nafenxi.com\naffann.com\naffluenze.com\nafgame.com\nafhao.com\nafirstsoft.com\nafjk.com\nafjob88.com\naflink.com\naflytec.com\nafp.adchina.com\nafpchinesesports.com\nafrican-styles.com\nafriendx.com\nafrindex.com\nafshanghai.org\nafszc.com\naft1v1.com\naft56.com\naftersale-amazon.com\naftersales.cc\naftvc.com\nafudan.com\nafunapp.com\nafuvip.com\nafzhan.com\nag03.com\nag8.com\nagcen.com\nagcloudcs.com\nagconnect.link\nage.tv\nage06.com\nage6000.com\naged100.com\nagedm.app\nagefans.com\nagel-tech.com\nagelocer.com\nagenge.com\nagenow.com\nagentyun.com\naghcdn.com\nagi360.xyz\nagile-china.com\nagileex.com\naginomoto.com\nagiquery.com\nagiso.com\nagitationi.com\nagitekservice.com\naglory.com\nagmos012.com\nagnaw.com\nagoow.com\nagora.io\nagoralab.co\nagpolis.com\nagriotcloud.com\nagrittex.com\nagrochemshow.com\nagrodt.com\nagrofairs.com\nagrosg.com\nagrowingchina.com\nagstt.com\nagtech.ltd\nagucn.com\nagui.cc\nagumd.com\nagv-amr.com\nagvag.com\nagxs.net\nah-inter.com\nah-suuwaa.com\nah-zl.com\nah12333.com\nah163.com\nah163.net\nah3c.com\nah788.com\nah7907.com\nah8.cc\nah9yu.com\nahacpp.com\nahaec.com\nahaiba.com\nahaiba.net\nahalei.com\nahanxun.com\nahaohao.com\nahaoyw.com\nahatjt.com\nahauto.com\nahbagy.org\nahbanker.com\nahbb.cc\nahbbsun.com\nahbbtv.com\nahbrt.com\nahbsxh.com\nahbxgwy.com\nahbys.com\nahbzgs.com\nahbztv.com\nahbzxnykj.com\nahbzyy.com\nahc.ink\nahcaijing.com\nahcaw.com\nahceisc.com\nahcfrc.com\nahchanye.com\nahcnb.com\nahcoating.com\nahcsdz.com\nahcyfc.com\nahczqy.com\nahczwater.com\nahd.so\nahdaer.com\nahdahda.com\nahdbsst.com\nahdci.com\nahdf56.com\nahdfjt.com\nahdhf.com\nahdjbh.com\nahdngj.com\nahdohpiechei.com\nahdsez.com\nahdxj.com\nahdzfp.com\naheading.com\nahetyy.com\nahfda.com\nahfeixi.com\nahfensitong.com\nahfg.net\nahfgb.com\nahfszx.com\nahfytx.com\nahgae.com\nahgkw.org\nahglj.com\nahgssh.com\nahguangbo.com\nahgyrn.com\nahgzedu.com\nahhaige.com\nahhanmi.com\nahhaoze.com\nahhbxh.com\nahhcbiotech.com\nahhdb.com\nahhhjx.com\nahhkedu.com\nahhngsjt.com\nahhnsz.net\nahhome.com\nahhouse.com\nahhsxyy.com\nahhtzx.com\nahhwdp.com\nahhyzn.com\nahhzi.com\nahianzhang.com\nahiib.com\nahinv.com\nahipi.com\nahitv.com\nahjdq.com\nahjgxy.com\nahjiankong.com\nahjinyu.com\nahjixi.com\nahjk.com\nahjk34.com\nahjkjt.com\nahjlcd.com\nahjoe.com\nahjpgroup.com\nahjsedu.net\nahjsexam.com\nahjszls.com\nahjtxx.com\nahjyec.com\nahjzjy.com\nahjzw.com\nahjzzs.com\nahkds.com\nahkemi.com\nahkende.com\nahkjksw.com\nahkjwx.com\nahkxsoft.com\nahlca.org\nahlib.com\nahlife.com\nahljnews.com\nahlqgs.com\nahlsm1.com\nahltgroup.com\nahluqiao.com\nahlxb.com\nahlyjt.com\nahlzgd.com\nahmif.com\nahmky.com\nahmwgroup.com\nahnanfang.com\nahnec.com\nahnluh.com\nahnmc.com\nahno-tool.com\nahnxs.com\nahohai.com\nahome365.com\nahomezc.com\nahougn.com\nahpdkj.com\nahphi.com\nahplm.com\nahqian.com\nahqmdq.com\nahqxsw.com\nahrccp.com\nahrcu.com\nahrcw.com\nahread.com\nahrenji.com\nahrenkun.com\nahrsksw.net\nahrunzi.com\nahs.pub\nahsalt.com\nahscl.com\nahscxyy.com\nahsea.com\nahsfdxrmyy.com\nahshbszyyy.com\nahsj-group.com\nahsjxjy.com\nahsjyxh.com\nahspxh.com\nahsqjt.com\nahssgs.com\nahssnews.com\nahsthzx.com\nahswyz.com\nahsxkyb.com\nahsxscsw.com\nahsyj.com\nahsylsy.com\nahsz.tv\nahszbx.com\nahteacher.com\nahtelit.com\nahtlbyby.com\nahtongyuan.com\nahtrq.com\nahtxyyjt.com\nahtypg.com\nahuano.com\nahubbs.com\nahudows.com\nahuyi.com\nahwater.net\nahwbkf.com\nahwjnews.com\nahwjxx.com\nahwmw.com\nahwmyy.com\nahwnqzs.com\nahwnwl.com\nahwwnews.com\nahwwx.com\nahwxcs.com\nahwxhr.com\nahxcyy.com\nahxmgk.com\nahxunbu.com\nahxwkj.com\nahxyol.com\nahydnet.com\nahyessoft.com\nahyijiali.com\nahyiqing.com\nahyouchengedu.com\nahyouth.com\nahyqx.com\nahysxh.com\nahyuning.com\nahyx.cc\nahyx.net\nahyyxh.com\nahyzzx.com\nahzcw.cc\nahzp.com\nahzs10000.com\nahzssw.com\nahztsh.com\nahzxy.com\nahzyw.com\nai-abc.com\nai-anchor.com\nai-augmented.com\nai-cai.com\nai-cctv.com\nai-classes.com\nai-cool.com\nai-daxue.com\nai-factory.com\nai-indestry.com\nai-qingchang.com\nai-rtc.com\nai-start.com\nai-test.com\nai-thinker.com\nai-vip.net\nai-ways.com\nai-yuanjing.com\nai.cc\nai.run\nai012.com\nai0513.com\nai257.com\nai572.com\nai7.com\nai7.org\naiaa.org\naiacfo.org\naiacgn.com\naiagain.com\naiagain.net\naiage.com\naiaigame.com\naiaigu168.com\naiaitie.com\naialbb.com\naianno.com\naiaor.com\naiappx.com\naiba.com\naibaimm.com\naibang.com\naibang.run\naibangbaoxian.net\naibanges.com\naibank.com\naibank.link\naibao.com\naibaocloud.com\naibaogao.com\naibaohu.com\naibaov.com\naibaoxian.com\naibase.com\naibeike.com\naibiaomei.com\naibiaow.com\naibing.cc\naibll.com\naibo123.com\naiboce.com\naiboco.com\naibookba.com\naibreeno.com\naibrm.com\naibwz.asia\naic707.com\naicai.com\naicaicdn.com\naicailang.com\naicairen.com\naicait.com\naicccloud.com\naicdn.com\naicdn.work\naicdn2.com\naicdn3.com\naicdn4.com\naicdn5.com\naichagu.com\naichaicp.com\naichan.info\naichangbaishan.com\naichaoxing.com\naichat.net\naichat1234.com\naichehome.com\naichi-zhe.com\naichinaw.com\naichunjing.com\naiclicash.com\naicloud.com\naicoauto.com\naicode.cc\naicoinstorge.com\naiconn.com\naicsemi.com\naicsuk.net\naicthink.com\naicu8.com\naicunfu.com\naicunxibao.com\naida64.cc\naida64cn.com\naidabest.com\naidai.com\naidaijia.com\naidaily.com\naidaiz.com\naidalan.com\naidangbao.com\naidanji.com\naidapeid.com\naidaxing.com\naidaxue.com\naidcgroup.net\naidcstore.net\naideep.com\naidenleong.com\naidianji.net\naidiao.com\naidien.fun\naidigong.com\naidimedia.com\naidjyun.com\naidlearning.net\naidlux.com\naidoctor.world\naidoczh.com\naidog.com\naidong-ai.com\naidong.me\naidonghai.com\naidoor.net\naidouzuji.com\naidpaper.com\naidream.website\naidrive.com\naidubuluo.com\naidugame.com\naiduoka.com\naidusk.com\naidusk.org\naiduwenxue.com\naidynamic.com\naidytt.com\naiec-alliance.com\naieco.org\naiecoms.com\naiegde.com\naiegle.com\naiema.com\naiemy.com\naieok.com\naier020.com\naier021.com\naier0431.com\naier0755.com\naier0771.com\naier0775.com\naierchina.com\naierfano.com\naierhb.com\naierhs.com\naierlz.com\naieryk.com\naierzy.com\naievsge.com\naieye8.com\naiezu.com\naifabu.com\naifacelab.com\naifamu.com\naifanfan.com\naifang.com\naifanyi.net\naifcdn.com\naifei.com\naifei.info\naifengjie.com\naifengkeji.com\naifenlei.com\naifont.com\naifooler.com\naifoxtech.com\naifu10.com\naifu360.com\naifuturex.com\naifuwus.com\naifuxi.com\naigame.com\naigame100.com\naiganggu.com\naigc-cloud.com\naigc369.com\naigcarena.com\naigccdn.com\naigclsp.com\naigcxm.com\naige010.com\naigei.com\naigewc.com\naigexing.com\naigexing.net\naigo.com\naigobook.com\naigodiy.com\naigodlike.com\naigou.com\naigrammar.net\naigtek.com\naiguhuishou.com\naiguilai.com\naiguo.tech\naigupiao.com\naihaisi.com\naihala.com\naihanfu.com\naihanfu.net\naihangtian.com\naihao.org\naihecong.com\naihehuo.com\naihelp.net\naihelpcn.net\naihero100.com\naihke.com\naihoge.com\naihotel.com\naihst8.com\naihua1998.com\naihuajia.com\naihuaju.com\naihuau.com\naihuazhou.com\naihubs.net\naihuhua.com\naihuishou.com\naii-alliance.org\naiibii.com\naiig.cc\naiihu.com\naiijournal.com\naiimg.com\naiimooc.com\naiioii.com\naiit.me\naiitec.com\naiiup.com\naiji66.com\naijiajiankang.com\naijianji.com\naijiatui.com\naijiayou.com\naijingu.com\naijishu.com\naijiuku.com\naijizhang.net\naijuhome.com\naik.com\naikaixin.com\naikaiyuan.com\naikan669.com\naikan8.com\naikanba.cc\naikang.com\naikanggroup.com\naikeapp.com\naikep.com\naiketour.com\naikf.com\naikgmgre.com\naikonchem.com\naikucun.com\nail-online.moe\nailaba.com\nailabs.xin\nailai6.com\nailbaba.me\nailemon.net\nailete.com\nailewan.com\naileyun.net\nailiao360.com\nailibang.com\nailibi.com\nailinglei.com\nailingmao.com\nailinux.net\nailinzhou.com\nailipu.com\nailite.com\nailiyun.com\nailom.com\nailongmiao.com\nailuckyboy.com\nailugroup.com\nailuluz.com\nailuntan.com\nailvxing.com\naim-ec.com\naimaker.space\naimap.com\naimatech.com\naimatrix.ai\naimcx.com\naimeas.com\naimeideni.com\naimeifen.vip\naimeike.tv\naimeilid.com\naimengang.com\naimergroup.com\naimeter.com\naimgroupcn.com\naimicron.com\naimilebc.com\naimin1979.com\naimingmed.com\naimingtai.com\naimipay.net\naimiplay.com\naimo.work\naimo2o.com\naimoeart.com\naimoge.com\naimoneshoes.com\naimsen.com\naimu-app.com\nainas.cc\nainiapp.com\nainirobot.com\nainiseo.com\nainiu.net\nainixing.com\nainm.cc\nainol.com\nainuoedu.com\nainyi.com\naioclinic.com\naioexpress.com\naiops.com\naioptics.com\naiotoolbox.com\naip-gz.com\naip.net\naip.org\naipage.com\naipai.com\naipaike.com\naipaixt.asia\naipaiyinghua.com\naipark.com\naiparkvip.com\naipay.cloud\naipcc-gz.com\naipedu.net\naipenglai.com\naipgy.com\naiphz.com\naipiaxi.com\naipingxiang.com\naipintuan.com\naipiwu.com\naippt.com\naiprose.com\naipu-waton.com\naipuo.com\naipz.com\naiqfd.com\naiqgy.com\naiqi-pharma.com\naiqiangua.com\naiqianxq.com\naiqibaba.com\naiqicha.com\naiqiche.com\naiqin.com\naiqingyu1314.com\naiqisoft.com\naiqiye.cc\naiqiyi.com\naiqiyicloud-mgmt.com\naiqiyicloud.com\naiqiyicloud.net\naiqiyivip.com\naiqle.com\naiqu.com\naiqu.design\naiquxs.com\naiqygogo.com\nair-level.com\nair-matters.com\nair-matters.io\nair-world.com\nair.cc\nairacm.com\nairbft.com\nairboo.com\nairchangan.com\nairchina.com\nairchinacargo.com\nairchinagroup.com\nairchinaim.com\nairchinamedia.com\naircourses.com\naircx.bid\nairdali.com\nairdoc.com\nairdropin.com\nairenche.com\nairepay.net\nairfex.net\nairguilin.com\nairj.website\nairjd.com\nairkunming.com\nairland1966.com\nairleaderchina.com\nairmart.vip\nairmate-china.com\nairmb.com\nairmobyte.com\nairnut.com\nairoha.com.tw\nairpipetech.com\nairpointshop.com\nairportcip.com\nairportcn.com\nairsavvi.com\nairshipads.ru\nairspa.net\nairstar-finance.com\nairstar.com\nairstarfinance.com\nairstarfinance.net\nairtac.com\nairtofly.com\nairtu.me\nairwh.com\nairworksoft.com\naisaohuo.com\naisbeijing.com\naise.chat\naisecurius.com\naisee.tv\naiseeking.com\naiseminar.com\naisenseinc.com\naishangba.info\naishangba.org\naishangyangyu.com\naisharenet.com\naishengji.com\naishenhua.com\naishenqi.net\naishuge.cc\naishuge.la\naishukong.com\naishuola.com\naishushu3.com\naishuttler.com\naisidi.com\naisila.com\naisilipu.com\naisin-sh.com\naisino.com\naisinogd.com\naisinogz.com\naisitool.com\naisixiang.com\naiskr.com\naisky.cc\naiskycn.com\naislharrow.com\naisnogames.com\naisojie.com\naisou.club\naisoutv.com\naispeech.com\naisportsapp.com\naispreadtech.com\naistar.site\naistar666.com\naistudio-app.com\naisx.cc\naisy.com\naitangyou.com\naitaotu.com\naitcfw.com\naite.xyz\naitecar.com\naitecc.com\naitechforsafety.com\naitemall.com\naiterent.com\naitesu.com\naitetech.com\naitiancheng.com\naitielu.com\naiting.com\naitists.com\naititia.com\naitiyu.com\naitkcn.com\naitntnews.com\naito.auto\naitoolwang.com\naitrans.net\naitransfy.com\naitsnet.com\naituan.com\naituanche.com\naitutor100.com\naitutu.cc\naitype.net\naiufida.com\naiutdns.com\naiuxdesign.com\naiuxian.com\naiuxstudio.com\naiv5.cc\naiveola.com\naivivo.com\naiviy.com\naiviysoft.com\naivote.com\naiwaly.com\naiwan4399.com\naiwan91.com\naiwanba.net\naiwatchs.com\naiwebsec.com\naiwei365.net\naiweibang.com\naiweibk.com\naiweline.com\naiwenyi.com\naiwisland.com\naiworkspace.com\naiwuzhou.com\naiwvegax.com\naiww.com\naixag.com\naixcoder.com\naixiangtan.com\naixiaoduo.com\naixiaoka.net\naixiaola.com\naixiaomedia.com\naixiashu.com\naixiashu.info\naixiashu.net\naixiatxt.com\naixiawx.com\naixiaxs.com\naixiaxsw.com\naixiezuobao.com\naixifan.com\naixigua.com\naixin-ins.com\naixin-life.com\naixin-life.net\naixinhaitun.com\naixinmusic.com\naixinwechat.com\naixinwu.org\naixiu.net\naixiuyingyu.com\naixq.com\naixs.info\naixs.org\naixue.net\naixuebanban.com\naixueche.com\naixuedai.com\naixuejun.com\naixuekku.com\naixuesheng.net\naixuetang.com\naixuexi.com\naixyy.com\naixzu.com\naiya.live\naiya8.com\naiyaapp.com\naiyamax.com\naiyangedu.com\naiyanqing.com\naiyaopai.com\naiyecdn.com\naiyewj.com\naiyewjc.com\naiyichuan.com\naiyidu.com\naiyinghun.com\naiyingli.com\naiyingshi.com\naiyinteli.com\naiyishu.com\naiyisoft.com\naiyituo.com\naiyjs.com\naiykj.com\naiyo99.com\naiyong.work\naiyongaiwan.com\naiyou.com\naiyoumi.com\naiyouxi.com\naiyouzj.com\naiyoweia.com\naiysm.com\naiyue520.com\naiyuke.com\naiyunxiao.com\naiyy.org\naizaoqi.com\naizgtc.com\naizhan.com\naizhanzhe.com\naizhengli.com\naizhet.com\naizhibo.net\naizhishang.com\naizhugong.com\naizools.com\naizuna.com\naizuopin.com\naizusheng.com\najbcloud.com\najbtv.com\najcass.com\najcctv.com\najclass.com\najedu.com\najfcxx.com\najgts.com\najhchem.com\najhimalayanqf.com\najiang.net\najihuo.com\najinga.com\najiu.xin\najiuqian.com\najkcdn.com\najkdns2.com\najkfc.com\najkimg.com\najkinclude.com\najlty.com\najmide.com\najpysz.com\najrcb.com\najs-app.com\najs17.com\najtmy.com\najuhao.com\najutwatch.com\najwang.com\najxhgy.com\najyg.com\najzq.com\nak-medical.net\nak.cc\nak0.tw\nak03220hou.com\nak03230hou.com\nak1ak1.com\nak47ids.com\naka-amd-njpwworld-hls-enlive.akamaized.net\naka700.com\naka700.net\nakadns88.net\nakadns99.net\nakaifa.com\nakailibrary.com\nakamai.com\nakashadata.com\nakashic.cc\nakaxin.com\nakbchina.com\nakbe.com\nakbing.com\nakbkgame.com\nakcomemetals.com\nakdns.net\nakeeps.com\nakesobio.com\nakey.im\nakey.me\nakey.work\nakeyun.com\nakgjgs.com\nakhlwyy.com\nakhtm.com\nakhy.com\naki-game.com\naki-game.net\naki-game2.com\naki-game2.net\nakile.net\nakjianding.com\nakkogear.com\naklyw.com\nakng.net\nakniu.com\nakoeva.com\nakomr.com\nakoo0509uis.com\nakpig.com\nakplayer.com\nakppt.net\nakptfe.com\nakr-developers.com\nakru.plus\nakscan.com\nakspeedy.com\nakswjt.com\naksxw.com\naku.pub\nakuziti.com\nakylq.com\nakymmzs.com\nal-jin.com\nal8l.com\nalabmed.com\nalaboshuiyan.com\nalacun.com\naladdin-assets.com\naladdin-e.com\naladdin-reagent.com\naladdinedu.com\naladdinnet.com\nalafy.com\nalai.net\nalameal.com\nalanyhq.com\nalavr.com\nalayanew.com\nalayu.com\nalayunchina.com\nalazv.com\nalbeche.com\nalbertaz.com\nalc-iot.com\nalcasset.com\nalcatel-home.com\nalcatelmobile.com\nalcha.com\nalcty.com\nalcy.cc\naldeee.com\naldf.online\naldgo.com\naldnew.com\naldsd.com\naldtop.com\naldwx.com\naledeco-hk.com\naleenote.com\nalenable.com\nalertover.com\nalevelwx.com\nalexhaohao.com\nalexinea.com\nalexpad.fun\nalexyan.cc\nalfa-x.sbs\nalfachemar.com\nalfafull.com\nalfingfuda.com\nalgkfd.com\nalgogear.com\nalgorithmart.com\nalh6.com\nalhug.com\nalhywj.com\nali-api-test.net\nali-cdn.com\nali-expo.com\nali-gtm-01.net\nali-gtm-pressure.com\nali-health.com\nali-restore.net\nali-star.com\nali213.com\nali213.net\nali37.net\naliadvance.com\naliajj.com\nalialipay.com\nalianhome.com\naliapp-inc.com\naliapp.com\naliappcdn.com\nalibaba-inc.com\nalibaba.cdn.steampipe.steamcontent.com\nalibaba.com\nalibaba.net\nalibabacapital.com\nalibabachengdun.com\nalibabachengdun.net\nalibabacloud.co.in\nalibabacloud.com\nalibabacloud.com.au\nalibabacloud.com.hk\nalibabacloud.com.my\nalibabacloud.com.sg\nalibabacloud.com.tw\nalibabacorp.com\nalibabadesign-enable.com\nalibabadesign.com\nalibabadns.com\nalibabadoctor.com\nalibabafonts.com\nalibabafoundation.com\nalibabafuturehotel.com\nalibabagroup.com\nalibabainno.com\nalibabaonline.com\nalibabapictures.com\nalibabaplanet.com\nalibabastars.com\nalibabatech.org\nalibabatechqa.com\nalibabaued.com\nalibabausercontent.com\nalibabawood.com\nalibench.com\nalibjyun.com\nalibjyun.net\nalibole.com\nalibtc.com\nalibtrip.com\nalibuybuy.com\nalic.com\nalicache.com\nalicall.com\nalicaptcha.com\nalicdm.com\nalicdn.com\nalicdn.net\nalicloud.com\nalicloudapi-inner.com\nalicloudapi.com\nalicloudcc.com\nalicloudccp.com\nalicloudddos.com\nalicloudlayer.com\nalicloudsec.com\nalicloudwaf.com\nalicontainer.com\nalictf.com\nalidata.org\nalidayu.com\naliddmall.com\nalidns.com\nalidns.net\nalidz.net\naliedge.com\nalienfans.net\naliensidea.com\nalientek.com\naliexpress-media.com\naliexpress.com\naliexpress.ru\naliexpress.us\nalifabu.com\nalifanyi.com\nalifejk.com\nalifenxiao.com\naligames.com\naligaofang.com\naligenie.com\naligfcc.com\naligfddos.com\naligfwaf.com\nalighting.com\nalihd.net\nalihealth.hk\nalihealth.net\nalihh.com\nalihuahua.com\naliimg.com\naliiotapp.com\nalijijinhui.org\nalijk.com\nalikmd.com\nalikunlun.com\nalikunlun.net\nalili.tech\naliliying.com\naliloan.com\naliluya.com\nalimamaframe.com\nalimaomall.com\nalime.ai\nalimebot.com\nalimei.com\nalimmdn.com\nalinx.com\nalinx.vip\naliog.com\nalionexpo.com\nalipan.com\nalipansou.com\nalipay-corp.com\nalipay-eco.com\nalipay-inc.com\nalipay-traffic.com\nalipay.com\nalipay.hk\nalipay.net\nalipayauto.com\nalipaycs.com\nalipaydesign.com\nalipaydev.com\nalipaydns.com\nalipayeshop.com\nalipayhk.com\nalipaymo.com\nalipayobjects.com\nalipayplus.com\nalipcsec.com\naliplay.com\naliplus.com\nalippm.com\naliqiche.com\naliqq.cc\naliresearch-internal.com\naliresearch.com\nalirtc.com\nalirui.com\nalisealing-pre.com\nalisealing-sit.com\nalisealing-uat.com\nalisealing.com\nalishine.net\naliso.cc\nalisoft.com\nalisolarlight.com\nalisports.com\nalitchina.com\nalitelecom.com\nalithefox.net\nalithon.com\nalitianji.com\nalitrip.com\nalitrip.hk\nalittle-tea.com\nalittlesoldier.com\naliued.com\naliunicorn.com\naliuv.com\nalivcr.com\nalivecdn.com\nalivv.com\naliway.com\naliwd.com\naliwears.com\naliwork.com\naliwx.net\nalixiaomi.com\nalixiaoyouhui.com\nalixixi.com\nalixox.com\nalixueyuan.net\naliyiyao.com\naliyizhan.com\naliypc.com\naliyue.net\naliyun-esa.net\naliyun-inc.com\naliyun-iot-share.com\naliyun-znfhq.net\naliyun.com\naliyun.org\naliyun.xin\naliyunbaas.com\naliyunbaike.com\naliyuncc.com\naliyuncdn.com\naliyuncdn.net\naliyunceng.com\naliyuncname.xyz\naliyuncs.com\naliyuncsslb.com\naliyuncsslbintl.com\naliyunddos0002.com\naliyunddos0003.com\naliyunddos0005.com\naliyunddos0006.com\naliyunddos0007.com\naliyunddos0010.com\naliyunddos0011.com\naliyunddos0012.com\naliyunddos0014.com\naliyunddos0015.com\naliyunddos0017.com\naliyunddos0018.com\naliyunddos0019.com\naliyunddos0020.com\naliyunddos0023.com\naliyunddos0024.com\naliyunddos0025.com\naliyunddos0026.com\naliyunddos0027.com\naliyunddos0029.com\naliyunddos0030.com\naliyunddos1001.com\naliyunddos1002.com\naliyunddos1003.com\naliyunddos1004.com\naliyunddos1005.com\naliyunddos1006.com\naliyunddos1007.com\naliyunddos1008.com\naliyunddos1009.com\naliyunddos1010.com\naliyunddos1011.com\naliyunddos1012.com\naliyunddos1013.com\naliyunddos1014.com\naliyunddos1015.com\naliyunddos1016.com\naliyunddos1017.com\naliyunddos1018.com\naliyunddos1019.com\naliyunddos1020.com\naliyunddos1021.com\naliyunddos1022.com\naliyunddos1023.com\naliyunddos1024.com\naliyunddos1025.com\naliyunddos1026.com\naliyunddos1027.com\naliyunddos1028.com\naliyunddos1029.com\naliyunddos1030.com\naliyundrive.cloud\naliyundrive.com\naliyundrive.net\naliyunduncc.com\naliyundunddos.com\naliyundunwaf.com\naliyunedu.net\naliyunfile.com\naliyunfuwuqi.com\naliyunga.com\naliyunga0004.com\naliyunga0005.com\naliyunga0006.com\naliyunga0007.com\naliyunga0008.com\naliyunga0009.com\naliyunga0010.com\naliyunga0011.com\naliyunga0012.com\naliyunga0013.com\naliyunga0014.com\naliyunga0015.com\naliyunga0016.com\naliyunga0017.com\naliyunga0018.com\naliyunga0019.com\naliyunga0020.com\naliyunga0021.com\naliyunga0022.com\naliyunga0023.com\naliyunga0024.com\naliyunga0025.com\naliyunga0026.com\naliyunga0027.com\naliyunga0028.com\naliyunga0029.com\naliyunga0030.com\naliyunga0031.com\naliyunga0032.com\naliyunga0033.com\naliyunga0034.com\naliyunga0035.com\naliyunga0036.com\naliyunga0037.com\naliyunga0038.com\naliyunga0039.com\naliyunga0040.com\naliyunga0041.com\naliyunga0042.com\naliyunga0043.com\naliyunga0044.com\naliyunga0045.com\naliyunga0046.com\naliyunga0047.com\naliyunga0048.com\naliyunga0049.com\naliyunga0050.com\naliyunga860004.com\naliyunga8601.com\naliyunga8602.com\naliyunga8603.com\naliyungf.com\naliyungrtn.com\naliyunhelp.com\naliyunhn.com\naliyunidaas.com\naliyuniot.com\naliyunj.com\naliyunjiasu.cloud\naliyunlive.com\naliyunlivetest.com\naliyunos.com\naliyunparking.com\naliyunpds.com\naliyunqifu.com\naliyunrtc.com\naliyunssl3.com\naliyunvpc.com\naliyunwaf.com\naliyunwaf1.com\naliyunwaf2.com\naliyunwaf3.com\naliyunwaf4.com\naliyunwaf5.com\naliyunx.com\nalizhaopin.com\nalizhizhu.com\nalizila.com\naljazeera-eng-hd-live.hls.adaptive.level3.net\nalkpharm.com\nalkuyi.com\nall-in-data.com\nall3c.com\nall4seiya.net\nallapp.link\nallawnfs.com\nallawno.com\nallawntech.com\nallbrightlaw.com\nallchips.com\nallcitygo.com\nallcitysz.net\nalldobetter.com\nalldragon.com\nalleadprint.com\nallenmarket.com\nallfang.com\nallfootballapp.com\nallfunnies.com\nallgamesky.com\nallhistory.com\nalliancebrh.com\nallianz360.com\nallicdata.com\nallied-corp.com\nalliedrongda.com\nallinbots.com\nallinfinance.com\nallinpay.com\nallinpaygx.com\nallinpayhb.com\nallinpaysz.com\nallinso.com\nalllandnet.com\nalllget.com\nalllook.tv\nallmaga.net\nallmed-china.com\nallmei.com\nallnow.com\nalloyteam.com\nallpay.xin\nallpayx.com\nallpku.com\nallposs.com\nallrace.com\nallred.vip\nallsafeip.com\nallsaintsmusic.com\nallschool.com\nallschoolcdn.com\nallsenseww.com\nallshiping.com\nallshopwatch.com\nallspark-cn.com\nallstack.net\nallstatics.com\nallstor.org\nalltechmed.com\nalltion-cn.com\nalltoall.net\nalltobid.com\nalltosun.com\nalltuu.cc\nalltuu.com\nallvalue.com\nallwellsports.com\nallweyes.com\nallwin368.com\nallwinnertech.com\nallwinso.com\nallyes.net\nallyfurn.com\nallystar.com\nallyvn.com\nalminecn.com\nalmondoy.com\nalnan.com\nalo7.com\naloha-ukulele.com\nalonemonkey.com\nalong96.com\nalongsky.com\nalookweb.com\nalpha-browser.com\nalpha-star.org\nalphabiopharma.com\nalphabole.com\nalphassl.com\nalphay.com\nalrailpha.com\nalskbc.com\nalsolife.com\nalsovalue.com\nalszxyy.com\naltamob.com\naltratek.com\naltstory.com\naltwavehub.cfd\naltxw.com\nalu-ledprofile.com\naluaa.com\naluminiumchina.com\naluntan.com\nalwaysnb.com\nalwayzev.com\nalwindoor.com\nalxw.com\nalyasset.com\nalyisheng.com\nalypw.com\nalyzq.com\nalzls.com\nalzscl.com\nam-sino.com\nam1116.com\nam774.com\nam810.net\nam89.com\namaiche.com\namallb2b.com\namalrob.com\namantang.com\namanyi.com\namap.com\namapauto.com\namarsoft.com\namassfreight.com\namasswww.com\namaxchina.com\namayad.com\namazfit.com\namazingsys.com\namazom-update.com\nambassadorchina.com\namberbj.com\namberedu.com\namberhotelsgroup.com\namberknit.com\nambier.net\nambition-soft.com\nambow.com\namcarebsh.com\namcaresz.com\namcarewl.com\namcfortune.com\namchamchina.org\namcvoyages.com\namd.com\namdlive-ch01.ctnd.com.edgesuite.net\namdlive-ch03-ctnd-com.akamaized.net\namdlive-ch03.ctnd.com.edgesuite.net\namdlive.ctnd.com.edgesuite.net\namdotibet.com\namec-inc.com\namegroups.org\nameisx.com\namemv.com\namemv.net\nameow.xyz\namericachineselife.com\namethystum.com\namexpressnetwork.com\nameya360.com\namflowbikes.com\namflower.com\namgbs.com\namgepic.com\namh.sh\namhimalayanet.com\namhl.net\namiao.co\namicc.com\namijiaoyu.com\namindbox.com\naminglinux.com\namishii.com\namishow.com\namivian.com\namiyabot.com\namo-solar.com\namo9.com\namobbs.com\namoe.cc\namonxu.com\namoydxmed.com\namp-intl.com\nampcn.com\namperobots.com\namphenol-auto.com\namphenol-industrial.com\namphenol-jet.com\namphibiachina.org\namplesky.com\namplly.com\nampmake.com\nampxl.com\namqyl.com\nams-aigc.com\nams.org\namsky.cc\namsoveasea.com\namssro.net\namswater.com\namtbbs.org\namtf18.com\namtjt.com\namtron-ic.com\namuletj.com\namuletor.com\namuluze.com\namunion.com\namusic.shop\namyart360.com\namymx.org\namyroutes.com\namysql.com\namyxun.com\namz123.com\namz520.com\namz800.com\namzcaptain.com\namzcfo.com\namzdh.com\namzkeys.com\namzmm.com\namzndns-cn.biz\namzndns-cn.com\namzndns-cn.net\namzqazc.com\nan1health.com\nan2.net\nan68.com\nanalog.com\nanalogfoundries.com\nanalysysdata.com\nanalytics.strava.com\nanan123.vip\nanan666.com\nanandoor.com\nanandzhang.com\nananlighting.com\nananpet.com\nanao.vip\nanatuprak.com\nanav.com\nanbang-life.com\nanbanggroup.com\nanbaool.com\nanbokeji.net\nancbk.com\nancda.com\nancdwqob.asia\nancesours.com\nanchnet.com\nancii.com\nancun.com\nanda-cn.com\nanda-tech.com\nandaike.com\nandakc.com\nandan.me\nandazr.com\nandcaifu.com\nandemed.com\nandertechs.com\nandes.tech\nandesbrain.com\nandeshengtec.com\nandfx.net\nandgele.com\nandhj.com\nandpay.me\nandreader.com\nandroid-doc.com\nandroid-studio.org\nandroidesk.com\nandroidga.com\nandroidgo.duapp.com\nandroidinvest.com\nandroidmi.com\nandroidmov.com\nandroidonline.net\nandroidperformance.com\nandroidtea.com\nandtosi.com\nandwi.com\nandygcj.com\nandyx.net\nane56.com\naneasystone.com\nanestcang.com\nanetuo.com\nanf-z.com\nanfan.com\nanfangnews.com\nanfangzb.com\nanfensi.com\nanfine-healthcare.com\nanfipet.com\nangeeks.com\nangel-game.net\nangel-hospital.com\nangel-medical.net\nangel-usa.com\nangelacon.com\nangelakillian.com\nangelarabbit.com\nangelcrunch.com\nangelhome.org\nangeljjangnara.com\nangell-studio.com\nangelmom.org\nangeltranslation.com\nangelyeast.com\nangelyeast.ru\nangelyeast.xyz\nangine.tech\nangleebeauty.com\nanglo-chinese.com\nangogotech.net\nangrymailer.com\nangrymiao.com\nangui.org\nanguilasia.com\nanguomob.com\nangustar.com\nangwei.net\nanhei2.com\nanhei3.net\nanheng.com\nanhengcloud.com\nanheyu.com\nanhkgg.com\nanhouse.com\nanhuaedu.com\nanhuanjia.com\nanhui-expressway.net\nanhui365.net\nanhuiaia.com\nanhuicta.com\nanhuigaokao.com\nanhuihr.com\nanhuihuayun.com\nanhuijszp.com\nanhuilife.com\nanhuimeijia.com\nanhuimobile.com\nanhuinews.com\nanhuiry.com\nanhuisjx.com\nanhuisuya.com\nanhuiwine.com\nanhuiyun.com\nanhuizk.com\nani-sh.com\naniccw.net\naniceapp.com\nanicoga.com\nanictdns.store\nanijue.com\nanileyehospital.org\nanimalchina.com\nanimate.art\nanimationcritics.com\nanimebytes.tv\nanimetamashi.com\nanimetaste.net\nanimetorrents.me\nanischools.com\nanitama.net\naniu.com\naniu.so\naniu.tv\naniworld.tv\nanjgas.com\nanji-ceva.com\nanji-logistics.com\nanji-tonghui.com\nanji66.net\nanjia.com\nanjiala.com\nanjialaw.com\nanjian.com\nanjianghu.net\nanjiangshi.com\nanjiechem.com\nanjiecorp.com\nanjifood.com\nanjilog.com\nanjimicro.com\nanjismart.com\nanjixg.com\nanjoyfood.com\nanjubao.com\nanjujituan.com\nanjuke.com\nanjukestatic.com\nankai.com\nankang.net\nankang06.org\nankangfulu.com\nankangtong.com\nankangwang.com\nankaotong.com\nankebio.com\nankelife.com\nankeni.net\nanker-in.com\nankerjiedian.com\nankevip.com\nankeyunda.com\nankianki.com\nankichina.net\nankki.com\nankobot.com\nankogroup.com\nankuai.net\nanl-cn.com\nanlai.com\nanlaiye.com\nanlewo.com\nanlian.co\nanliantest.com\nanlibaby.com\nanlilaw.com\nanlink.com\nanlitai.com\nanlogic.com\nanlu.net\nanlu114.com\nanlusy.com\nanmco8.com\nanmeisheng.com\nanmo.com\nanmobc.com\nanmpserver.com\nanmumchina.com\nann9.com\nannabelz.com\nannainj.com\nannearkham.com\nanneijun.com\nannelhair.com\nannhe.net\nanniekids.net\nannil.com\nannoron.com\nannto.com\nannualreviews.org\nannuoxun.com\nanoah.com\nanonym-hi.com\nanosmcloud.com\nanoyi.com\nanpig.com\nanpsk.org\nanpu119.com\nanpush.com\nanpuzx.com\nanqingonline.com\nanqingwt.com\nanqingzhiyun.com\nanqn.com\nanqu.com\nanquan.info\nanquanbao.com\nanquanjs.com\nanquanke.com\nanquanone.com\nanquanssl.com\nanquantong.com\nanquanzhao.com\nanran233.com\nanrangas.com\nanranhs.com\nanrayer.com\nanren.org\nanrenmind.com\nanrenxmed.com\nanrlm.com\nanruan.com\nanruichina.com\nansendun.com\nanshahouse.com\nanshibuff.com\nanshiduo.com\nanshig.com\nanshinko.com\nanshism.com\nanshunfiber.com\nanshunholdinggroup.com\nanshuntech.ltd\nansiding.com\nansimeter.com\nansky.com\nansteelgroup.com\nansucai.com\nansuner.com\nansxtech.com\nant-biz.com\nant-cloud.net\nant-financial.com\nant-open.com\nanta.com\nantaifans.com\nantaiib.com\nantairui.net\nantangbusiness.com\nantao.hk\nantaq.com\nantbank.hk\nantbuyhot.com\nantchina.com\nantcloud-miniprogram.com\nantcut.com\nantdigital.com\nantebao.com\nantebo.com\nantekoptics.net\nantespace.com\nantewer.com\nantfans.com\nantfin-inc.com\nantfin.com\nantfinancial-corp.com\nantforecast.com\nantfortune.com\nantgroup.com\nantgv.com\nantibanads.com\nantibodychina.com\nanticheatexpert.com\nantiquelearn.com\nantiviruspcsuite.com\nantiy.com\nantiy.net\nantiycloud.com\nantmoe.com\nantom.com\nantpcdn.com\nantpedia.com\nantping.com\nantplay888.com\nantriver.com\nantrol.com\nantsdaq.com\nantso.com\nantsoo.com\nantspainter.org\nantto.cc\nantuan.com\nantuan365.com\nantuni.com\nantuofh.com\nantutu.com\nantutu.net\nantvlive.ab5c6921.cdnviet.com\nantvr.com\nantwork.link\nantyikangih.com\nanw.red\nanweilan.com\nanweishi.com\nanweizhi.com\nanwen.cc\nanwfm.com\nanwha-auto.com\nanxia.com\nanxiangkeji.net\nanxiaoer.com\nanxin.com\nanxin.link\nanxin168.com\nanxin360.com\nanxin360.net\nanxinapk.com\nanxinbianmei.com\nanxindavisa.com\nanxinfloor.com\nanxinfloors.com\nanxinlirong.com\nanxinmai.com\nanxinssl.com\nanxintrust.com\nanxinwangdun.com\nanxinyisheng.com\nanxinzhonghui.com\nanxiu.com\nanxiw.com\nanxjm.com\nanxunshihui.com\nany123.com\nany8.com\nanyan.com\nanyang100.com\nanyangedu.com\nanyant.com\nanybeen.com\nanybox.com\nanychem.com\nanycoh.com\nanycross.com\nanycubic.com\nanye.xyz\nanyelse.com\nanyew.com\nanyforprint.com\nanyforweb.com\nanygame.info\nanyihua.com\nanyimai.com\nanyizn.com\nanyka.com\nanyknew.com\nanyline.org\nanymcu.com\nanymetre.com\nanyni.com\nanynote.org\nanyolife.com\nanyong.net\nanyoy.com\nanyrtc.io\nanyrui.win\nanysafer.com\nanyscdn.com\nanyskygame.com\nanysql.net\nanystandards.com\nanytesting.com\nanytocopy.com\nanyun100.com\nanyunjianzhan.com\nanyv.net\nanyview.net\nanyway.fm\nanyway.red\nanywlan.com\nanywood.com\nanyxz.com\nanzerclub.com\nanzext.com\nanzhen.org\nanzhengshipin.com\nanzhi.com\nanzhiguolv.com\nanzhitan.com\nanzhixun.com\nanzhuauto.com\nanzhuo.com\nanzhuo.me\nanzhuoapk.com\nanzhuoe.com\nanzhuoshouzhuan.com\nanzmy.com\nanzogame.com\nanzow.com\nao-di.com\nao-hua.com\nao3yiqag7zc8za.com\naoao365.com\naoaob.com\naoasign.com\naobacore.com\naobaishi.com\naobanghb.com\naoboor.com\naobosoft.com\naocde.com\naocdn.com\naoch.com\naochengcdn.com\naocslb.com\naocter.net\naodabo.tech\naodaliyaqianzheng.com\naodbw.com\naoddoll.com\naode8.com\naodeline.com\naodeng.cc\naodianyun.com\naodingsy.com\naoecq.com\naoedi.com\naoerdz.com\naoetech.com\naofanxx.com\naofeida.com\naofenghuanjing.com\naofenglu.com\naofs.vip\naogocorp.com\naograph.com\naoguan.com\naoguansteel.com\naoguanwns.com\naohaosiyq.com\naohuasports.com\naohuatextiles.com\naojauto.com\naojia-oil.com\naojiahuashare.com\naojiamarly.com\naojian.net\naojian2.net\naojiaostudio.com\naojiyingyu.com\naojiyouxue.com\naoju.net\naokang.com\naokangsports.com\naolai.com\naolaigo.com\naoligei.site\naolijsj.com\naolinjy.com\naolinpharma.com\naoliongame.com\naolvyou.com\naolylcd.com\naomao.com\naomeikeji.com\naomolit.com\naomygodstatic.com\naonaotu.com\naoni.cc\naoofu.com\naoogee.com\naoohu.com\naoongmob.com\naooooz.com\naopayun.com\naoqiangtc.com\naorankj.com\naoratec.com\naoscdn.com\naoscom.net\naosenm.com\naosens.com\naoseo.com\naoserp.com\naoshine.com\naoshitang.com\naoshite.net\naoshowsh.com\naoshu.com\naosikazyimage.com\naosong.com\naosoo.com\naoswtc.com\naotaidianqi.com\naotchina.com\naotian.com\naoto.com\naotoso.com\naotrip.net\naotuzuche.com\naotxland.com\naoun.ltd\naovud.com\naowei-sh.com\naowei.com\naowenmarketing.com\naoxiang100.com\naoxingrelang.com\naoxintong.com\naoxsb.com\naoy-power.com\naoya-hk.com\naoyanchang.com\naoyangzg.com\naoyanwl.com\naoye.com\naoyige.com\naoyii.com\naoyiluoad.com\naoyor.com\naoyotech.com\naoyou.cc\naoyou.com\naoyou365.com\naoyoulife.com\naoyoux.com\naoyu100.com\naoyuanlives.com\naoyunque.com\naozare-acemak.com\naozare-avernai.com\naozhanls.com\naozhougoufang.com\nap-china.com\nap1983.com\nap4r.com\nap88.com\nap8888.com\napaas-zone-test.com\napabi.com\napad.pro\napartments-bj.com\napass.com\napayun.com\napbiao.com\napcc2.com\napcdns.com\napcdns.net\napclc.com\napcso.com\napcta.com\napcups.org\napcupse.com\napdcdn.com\napdcdn.net\nape8.com\napearth.com\napecloud.ltd\napecn.com\napecome.com\napehorse.com\napeloa.com\napesk.com\napet.vip\napetdog.com\napetops.com\napevolo.com\napexhuntingau.com\napexmic.com\napexquartzstone.com\napextechnik.com\napeyun.com\napfeien.com\napgoview.com\naphidic.com\napi-expo.com\napi-forwards.com\napi-m.com\napi-vod-qcloud.com\napi.anythinktech.com\napi.crisp.chat\napi.so\napiairasia.com\napiandroid.com\napicase.io\napicgate.com\napichina.com\napickup.com\napicloud.com\napifabric.net\napifox.com\napifoxmock.com\napigateway.info\napigwtencent.com\napilyzy.com\napim.work\napimkt.net\napipost.net\napiqecz.com\napira.org\napirc.org\napiseven.com\napispace.com\napistd.com\napitask.com\napitd.net\napitutu.com\napiunion.com\napiview.com\napizl.com\napizza.cc\napizza.net\napjingsi.com\napk3.com\napk4399.com\napk8.com\napkbus.com\napkdv.com\napkevery.com\napkhot.com\napkj.com\napkpackagesys.com\napkplug.com\napkrj.com\napkxz.com\napkyx.com\napkzu.com\naplaybox.com\naplnk.com\naplum-inc.com\naplum.com\naplus100.com\napluscap.com\naplusda.org\naplusunion.com\napmarry.com\napmbooth.com\napme-magnetics.com\napmengfan.com\napmgmedical.com\napmsecbg.com\napmvista.com\napnring.com\napodaenvi.com\napollo-platform.com\napollo-share.com\napollo.auto\napolloon-group.com\napollopump.com\napollotop.com\napous.com\napowo.com\napowogame.com\napoyl.com\napp-analytics-services.com\napp-measurement-cn.com\napp-measurement.com\napp-router.com\napp.so\napp001.com\napp0772.com\napp111.com\napp111.org\napp1116.app\napp16688.com\napp168.cc\napp17.com\napp178.com\napp2006.com\napp2pixel.com\napp86.com\napp887.com\nappbi.com\nappbk.com\nappbocai.com\nappbsl.com\nappbw.com\nappbz.info\nappbza.com\nappchina.com\nappchizi.com\nappcms.org\nappcoo.com\nappcool.com\nappcpx.com\nappcup.com\nappdao.com\nappdi.com\nappdown.info\nappdp.com\nappeasou.com\nappeeres.com\nappfeng.com\nappfenxiang.com\nappfimo.com\nappganhuo.com\nappgenuine.com\nappgrub.com\nappia.vip\nappicad.net\nappicplay.com\nappidfx.com\nappifan.com\nappinn.com\nappkaifa.com\nappkefu.com\napplausefz.com\napplinzi.com\napplm.com\napplogcdn.com\napplogo.net\napplon.net\napplysquare.com\napplysquare.net\nappmifile.com\nappmiu.com\nappnode.com\nappol.com\nappollochina.com\nappotronics.com\nappqv.com\napprovebook.com\napps-solayer.org\napps121.com\napps5.oingo.com\nappscan.io\nappsecurity.top\nappsflower.com\nappsflyer-cn.com\nappshike.com\nappshop.cc\nappsimg.com\nappsina.com\nappso.com\nappsolution.cc\napptao.com\napptaxi.net\napptrackerlink.com\nappubang.com\nappublisher.com\nappurl.cc\nappurl.me\nappvipshop.com\nappweb1.com\nappweiyuan.com\nappwill.com\nappwuhan.com\nappwuhan.net\nappxzz.com\nappyao.com\nappying.com\nappykt.com\nappyouni.com\nappzhigong.com\nappzhonghua.com\naprche.net\napriltq.com\naprunchuang.com\naps.org\napsdai.com\napsfon.com\napsgo.com\napsoto.com\napspharm.com\naptchina.com\naptchip.com\naptdn.net\naptenon.com\napubond.com\napusic.com\napwuyou.com\naq2y.com\naqara.com\naqawzxeg.com\naqb.so\naqbxcdn9.com\naqbz.org\naqc100.com\naqcmgvxk.com\naqd-tv.com\naqdcdn.com\naqdesk.com\naqdlt.net\naqdstatic.com\naqee.net\naqfen.com\naqgygc.com\naqhospital.com\naqidb.org\naqigxaxv.com\naqioo.com\naqisite.com\naqjx.com\naqjz.net\naqlife.com\naqniu.com\naqpta.com\naqqcx.com\naqrose.com\naqrsblg.com\naqsc.org\naqsiqauto.com\naqtd.com\naqtowngas.com\naqtwpc.com\naqtwwx.net\naqtwwxemail.com\naqtxt.net\naqua-worth.com\naquabk.com\naquacity-tj.com\naquair-china.com\naquanliang.com\naquanutriera.com\naquanyou.com\naquapipetech.com\naquaterramail.com\naquathlondenice.com\naquaticowatch.com\naquayee.com\naquazhuhai.com\naqueck.com\naqumon.com\naqviwv.com\naqvx8mcr392mv7.com\naqxx.org\naqyqqy.com\naqyun.com\naqyzm.com\naqzpw.com\naqzt.com\naqzyzx.com\nar-max.com\nar0101.com\narabsquash.com\naragexpo.com\naraldite2014.com\naranya.cc\narapp.online\naray1981.com\narayzou.com\narbays.com\narc-uds.com\narcas-da.com\narcdmi.com\narchaeuscapital.com\narchcollege.com\narchcookie.com\narchcy.com\narchermind.com\narcheros.com\narchgo.com\narchgrid.xyz\narchi-motive.com\narchiant.com\narchina.com\narchiname.com\narchio.pro\narchiposition.com\narchitbang.com\narchrd.net\narchsummit.com\narco.design\narcsoftai.com\narcstack.club\narcteryx-log.com\narctic007.com\narcticray.com\narctiler.com\narctime.org\nard-china.com\nardmon.com\nardsec.com\nareader.com\narebz.com\narefly.com\narenabreakoutcn.com\narerberte.com\nareweloongyet.com\narextecn.com\narglasses.work\nargylehotels.com\narhoo.com\nariacraft.net\narielcosmetic.com\narin-elec.com\narinchina.com\narisastar.com\nark301.com\narkfeng.xyz\narkfwq.com\narkid.cc\narkid.org\narkntools.app\narkoo.com\narkrdigital.com\narkread.com\narksz.com\narliki.com\narlmy.me\narm9.net\narm9home.net\narmaf.org\narmbbs.net\narmchina.com\narmdesigner.com\narmfly.com\narmin.cc\narmourtires.com\narmracolostrumes.site\narmsrock.com\narmsword.com\narmvm.com\narmystar.com\narnstbearing.com\narocmag.com\naroseks.com\narowanahome.com\narp.cc\narpbox.com\narpun.com\narqinge.com\narrbid.com\narromaxinc.com\narrow-sh.com\narrow-tower.com\narrowceramic.com\narrowos.net\narrowwardrobe.com\nars-china.com\narswp.com\narswz.com\nart-ba-ba.com\nart-child.com\nart-coding.com\nart138.com\nart238.com\nartacode.com\nartaime.com\nartbookinchina.com\nartcg.design\nartcool.com\nartcto.com\nartdata.net\nartebuy.com\nartech-graphite.com\nartemedhospital.com\narterytek.com\nartexamcq.com\nartfinace.com\nartfoxlive.com\nartgogo.com\narthals.ink\narthing.org\narthome163.com\narthubdam.com\narthurchiao.art\narthurpharma.com\narticclothes.com\narticle.cool\nartimg.net\nartinchip.com\nartisan-cloud.com\nartisan-tek.com\nartistry-club.com\nartistrylab.net\nartlianhe.com\nartlinkart.com\nartlnk.com\nartmuseumonline.org\nartnchina.com\nartop-sh.com\nartopgroup.com\nartopia-group.com\nartp.cc\nartpangu.com\nartpro.com\nartpro.vip\nartproglobal.com\nartrade.com\nartrobot.com\nartron.net\nartronartdata.com\nartronimages.com\nartrus.net\narts-nj.com\nartsbuy.com\nartshanghaifair.com\nartsoa.com\nartverse.work\nartvisioncg.com\nartwaker.com\nartwe.com\nartwun.com\nartww.com\nartxun.com\narvato-ocs.com\narvinhk.com\naryasec.com\nas-doll.com\nas-hitech.com\nas-hls-ww-live.akamaized.net\nas.mr\nas16.com\nas3f.com\nas5.com\nas66588.com\nasa-asia.com\nasasd.online\nasatiles.com\nasattitude.com\nasbazainville.org\nasc-events.org\nasc-wines.com\nascelibrary.org\nascend-bio.com\nascendgene.com\nascendgz.com\nascenpower.com\nascentawits.com\naschina.org\naschip.com\naschtj.com\nasciima.com\nasczwa.com\nasczxcefsv.com\nasd.red\nasd868.com\nasdbfjoiug.com\nasdeshan.com\nasdf-bj.net\nasdf010.com\nasdlkjf.com\nasdx.io\nasean-china-center.org\naseann.com\naseanparts.com\nasemi360.com\nasemi99.net\nasen-pharm.com\naseoc.com\naseoe.com\nasf4asgfrxc.com\nasfuwu.com\nasfzl.net\nasgezhi.com\nashan.org\nashgdf.com\nashidc.com\nashining.com\nashoucang.com\nashqgpxy.com\nashsilent.com\nashvsash.net\nasi-midea.com\nasia-cdn.com\nasia-dns.com\nasia-sh.com\nasiabt.com\nasiaci.com\nasiacold.com\nasiacool.com\nasiacorp.net\nasiadvb.net\nasiae.com\nasiaeap.com\nasiaecs.com\nasiafactor.com\nasiafm.hk\nasiafm.net\nasiagreenfund.com\nasiaidc.net\nasiainfo-sec.com\nasiainfo.com\nasiainfo.org\nasiainfodata.com\nasiametallurgical.com\nasianev.com\nasianewsphoto.com\nasianmetal.com\nasiarobot.net\nasiaseiki.com\nasiasymbol.com\nasiatelco.com\nasiayun.com\nasiet.net\nasifadeaway.com\nasilu.com\nasim-emc.com\nasimi8.com\nasit.cc\nasjnu.com\naskbrisk.com\naskci.com\naskdd.org\naskdiandian.com\naskemq.com\nasketchup.com\naskk.cc\nasklib.com\nasklink.com\naskpanda.cc\naskququ.com\naskraste.com\nasktao.com\nasktempo.com\nasktug.com\naskxt.org\nasleyu.com\naslk2018.com\nasls.space\nasm.org\nasm64.com\nasmasm.com\nasme.org\nasmlc.com\nasmr.gay\nasmr.red\nasnlab.com\nasnlab.org\nasnowsz.com\naso.ink\naso100.com\naso114.com\naso120.com\nasoasm.com\nasosde.com\nasosoaiid.com\nasp168.com\nasp300.com\nasp300.net\nasp8php.com\naspbc.com\naspcms.com\naspiration-cn.com\naspirationtesting.com\naspire-info.com\naspirecn.com\naspiresun.com\naspnet.tech\naspqypmw.com\naspsky.net\naspx.cc\naspxhome.com\nasq-qm.org\nasqhr.com\nasqql.com\nasr-cn.com\nasrmicro.com\nassassinscreedcodenamejade.com\nassemblydragon.com\nasset-us-store.msi.com\nasset-vendor-event.msi.com\nasset.msi.com\nassets-global.viveport.com\nassrt.net\nassyrb.com\nastbbs.com\nasterfusion.com\nasteriavs.com\nastestech.com\nastfc.com\nasthis.net\nastipaint.com\nastm.org\nastra-biotech.com\nastraintel.com\nastral-vector.com\nastro1.rastream.com\nastroai-in.com\nastroaio.com\nastron.ac\nastronergy.com\nastropulsion.com\nastrostanleystudio.com\nasty664.com\nasujp.com\nasurada.zone\nasus-sh.com\nasussmart.com\nasusw.net\nasvm.net\naswetalk.net\nasxrpcb.com\nasxw.net\nasxzcn.com\nasyzonline.com\naszhuyuan.com\nat-e.com\nat0086.net\nat188.com\nat317.com\nat58.com\nat7790s887.com\nat78.com\nata-edu.com\nata-test.net\natacchina.com\natanyu.com\natatech.org\natats.shop\natb.so\natbug.com\natc-sh.com\natcc360.com\natchip.com\natcloudbox.com\natcontainer.com\natcpu.com\naterminal.net\natfeng.com\natgbiotechnology.com\natguigu.com\natguigu.org\nathaitao.com\nathensgamulch.com\nathmapp.com\nathub.com\natianqi.com\natidesoft.com\natido.com\natimeli.com\nating.info\natjoqgi.com\natk-film.com\natk.pro\natk.store\natkgear.com\natlab.ai\natlaslovestravel.com\natlhb.com\natlmall.com\natlxm.com\natmbox.com\natmcu.com\natmlimited.com\natmob.com\natob100.com\natobo.com\natollbath.com\natom-hitech.com\natomgameteam.com\natomgit.com\natomgit.net\natomhike-en.com\natomic-art.com\natomlife.net\natomlock.com\natrenew.com\natri.ink\natriptech.com\natrustdns.com\nats6355866.com\natshph.com\natstudy.com\natsws.com\nattacker.fit\nattainsgroup.com\nattendees.link\natticus.vip\nattomotion.com\nattop.com\nattri.mobi\nattribuly.com\natukjhesk.com\natum-tech.net\natuoyi.com\natwbz.com\natwtech.net\natyomi.com\natyun.com\natyun.net\natzjg.net\natzlinux.com\natzuche.com\nau-daiwa.shop\naube-archi.com\naubemobile.com\naubor-ind.com\naubye.com\naucanlink.com\nauchexpo.com\naucnln.com\naudan2011.com\naudatex.ch\naudatex.com\naudatex.net\naudio-gd.com\naudio-technica-hz.com\naudio-y.com\naudio160.com\naudiobuy.cc\naudiocn.com\naudiocn.net\naudiocn.org\naudiofamily.net\naudiotop.net\naudiowell.com\naudiowell.net\naudiowellzq.com\naudioxj.com\nauditcn.com\naudlabs.com\naudtools.com\naufewb.com\naugix.me\naugsky.com\naugurit.com\naugustcn.com\nauiou.com\naulacn.com\nauldey.com\naumantruck.com\naunapi.com\nauniontech.com\naunload.com\nauoda.net\nauok.run\nauozzjs.lol\naupu.net\nauqscfmk.com\nauqsipfm.com\naura-el.com\nauroapi.com\naurogon.com\nauromcs.com\naurora-jy.com\naurora-oa.com\naurorauo.com\naurumdriver.vip\naus.cc\nausaview.com\nausbio.com\nausca-oils.com\nausdn.com\nausdream.org\naushinelyn.com\naushy.com\nausner.net\nausnutria.com\nausny.com\nausperbio.com\nauspous.com\naussino.net\naustargroup.com\naustarstudy.com\naustraliaxy.com\nausunpharm.com\nauthbus.com\nauthing-inc.co\nauthing.co\nauthing.com\nauto-ccpit.org\nauto-changchun.com\nauto-ekontrol.com\nauto-expos.com\nauto-learning.com\nauto-made.com\nauto-mooc.com\nauto-purify.com\nauto-testing.net\nauto-union.net\nauto-wo.com\nauto1768.com\nauto18.com\nauto318.com\nauto328.com\nauto510.com\nauto6s.com\nautoahk.com\nautoai.com\nautobaidu.com\nautobaojun.com\nautobit.xyz\nautobizreview.com\nautocamel.com\nautochinashow.org\nautochinazh.com\nautochips.com\nautochongqing.com\nautodl.com\nautodmp.com\nautodnsv1.com\nautodnsv1.net\nautodwg.com\nautoecosystems.com\nautoengine.com\nautoesd.com\nautofull.net\nautogslb.com\nautohao.com\nautohenan.com\nautoho.com\nautohome.com\nautohome.tel\nautohr.org\nautohunan.com\nautoij.com\nautoitx.com\nautojiaoyi.com\nautojingji.com\nautojs.org\nautomall365.com\nautomsen.com\nautonavi.com\nautoparts-yoto.com\nautopartsdk.com\nautopeitao.com\nautophagy.net\nautoqingdao.com\nautosey.com\nautoshafa.com\nautoshanghai.org\nautosmt.net\nautostreets.com\nautosup.com\nautothinker.net\nautounicom.com\nautovideo.club\nautovolke.com\nautowelds.com\nautowise.ai\nautoz.net\nautozi.com\nautumndesires.com\nauwincmc.com\naux-home.com\nauxgroup.com\nauy07161km.com\nauy07230km.com\nauyou.com\nav-ic.com\nav199.com\nav2.me\nav269.com\nav380.net\nav77.org\navadairy.com\navalon233.com\navanpa.com\navanzacorp.com\navaryholding.com\navatamveda.com\navatarmind.com\navatarmobi.com\navatr.com\navaya.hk\navc-mr.com\navc-ott.com\navdgw.com\navec6ua79dc6.com\navemaria.fun\naves.art\navfline.com\navgh5.com\navgnati.com\navgnatii.com\navgroft.com\naviationsnip.com\navic-acs.com\navic-apc.com\navic.com\navichina.com\navicnews.com\navicsec.com\navicsgt.com\navicui.com\navilive.com\navinex.com\navischina.com\navivaqueen.com\navl-hitec.com\navlinsight.com\navlsec.com\navlyun.com\navlyun.net\navlyun.org\navnpc.com\navoscloud.com\navp76.com\navp76.net\navpic.xyz\navptec.com\navq360.com\navrvi.com\navstar4.com\navt-cn.com\navtechcn.com\navtt830.com\navuejs.com\naw-ol.com\naw.cc\nawaker.net\nawaliwa.com\nawardsequence.com\nawc618.com\nawcloud.com\nawcn.cc\nawehunt.com\nawemeughun.com\nawemeuglang.com\nawemeugsoul.com\nawemeugwave.com\naweray.com\nawesome-hd.me\nawfggc.com\nawhouse.art\nawi-intl.com\nawinic.com\nawmote.com\naword.net\nawotuan.com\nawoyun.com\nawsamazonlab.com\nawsdns-cn-00.com\nawsdns-cn-00.net\nawsdns-cn-01.biz\nawsdns-cn-01.net\nawsdns-cn-02.biz\nawsdns-cn-02.net\nawsdns-cn-03.biz\nawsdns-cn-04.net\nawsdns-cn-05.biz\nawsdns-cn-05.net\nawsdns-cn-06.com\nawsdns-cn-06.net\nawsdns-cn-07.biz\nawsdns-cn-07.com\nawsdns-cn-07.net\nawsdns-cn-09.biz\nawsdns-cn-09.com\nawsdns-cn-09.net\nawsdns-cn-10.com\nawsdns-cn-11.biz\nawsdns-cn-11.com\nawsdns-cn-12.biz\nawsdns-cn-12.net\nawsdns-cn-14.biz\nawsdns-cn-14.com\nawsdns-cn-15.net\nawsdns-cn-16.biz\nawsdns-cn-16.net\nawsdns-cn-17.biz\nawsdns-cn-17.com\nawsdns-cn-17.net\nawsdns-cn-18.biz\nawsdns-cn-18.net\nawsdns-cn-19.biz\nawsdns-cn-19.net\nawsdns-cn-20.biz\nawsdns-cn-20.com\nawsdns-cn-20.net\nawsdns-cn-21.biz\nawsdns-cn-21.net\nawsdns-cn-22.com\nawsdns-cn-22.net\nawsdns-cn-23.com\nawsdns-cn-23.net\nawsdns-cn-24.biz\nawsdns-cn-24.com\nawsdns-cn-24.net\nawsdns-cn-25.com\nawsdns-cn-25.net\nawsdns-cn-26.com\nawsdns-cn-27.biz\nawsdns-cn-27.com\nawsdns-cn-28.biz\nawsdns-cn-28.net\nawsdns-cn-29.biz\nawsdns-cn-31.net\nawsdns-cn-33.biz\nawsdns-cn-33.net\nawsdns-cn-34.com\nawsdns-cn-34.net\nawsdns-cn-35.biz\nawsdns-cn-35.net\nawsdns-cn-36.biz\nawsdns-cn-36.com\nawsdns-cn-36.net\nawsdns-cn-37.biz\nawsdns-cn-37.com\nawsdns-cn-37.net\nawsdns-cn-38.net\nawsdns-cn-39.biz\nawsdns-cn-39.com\nawsdns-cn-39.net\nawsdns-cn-40.biz\nawsdns-cn-40.com\nawsdns-cn-40.net\nawsdns-cn-41.biz\nawsdns-cn-41.com\nawsdns-cn-41.net\nawsdns-cn-42.biz\nawsdns-cn-42.com\nawsdns-cn-43.biz\nawsdns-cn-44.biz\nawsdns-cn-44.com\nawsdns-cn-44.net\nawsdns-cn-45.biz\nawsdns-cn-45.com\nawsdns-cn-45.net\nawsdns-cn-46.biz\nawsdns-cn-46.com\nawsdns-cn-46.net\nawsdns-cn-47.biz\nawsdns-cn-47.com\nawsdns-cn-47.net\nawsdns-cn-48.biz\nawsdns-cn-48.com\nawsdns-cn-48.net\nawsdns-cn-49.biz\nawsdns-cn-50.biz\nawsdns-cn-50.net\nawsdns-cn-51.biz\nawsdns-cn-51.com\nawsdns-cn-52.biz\nawsdns-cn-52.com\nawsdns-cn-52.net\nawsdns-cn-53.com\nawsdns-cn-54.biz\nawsdns-cn-54.net\nawsdns-cn-55.biz\nawsdns-cn-55.com\nawsdns-cn-55.net\nawsdns-cn-56.biz\nawsdns-cn-56.net\nawsdns-cn-57.com\nawsdns-cn-58.biz\nawsdns-cn-58.com\nawsdns-cn-58.net\nawsdns-cn-59.biz\nawsdns-cn-59.net\nawsdns-cn-60.biz\nawsdns-cn-60.com\nawsdns-cn-60.net\nawsdns-cn-61.biz\nawsdns-cn-62.biz\nawsdns-cn-62.com\nawsdns-cn-62.net\nawsdns-cn-63.biz\nawsdns-cn-63.com\nawsdns-cn-63.net\nawsdns-vip.com\nawsok.com\nawsonamazon.com\nawspaas.com\nawspony.com\nawstar.net\nawtmt.com\nawuming.com\nawx1.com\nawyerwu.com\nawyx.xyz\nax196.com\nax2nc4.ren\nax8dm212f0.com\naxa123.com\naxatp.com\naxbsec.com\naxbur.com\naxcf.com\naxentbath.com\naxera-tech.com\naxfys.com\naxhimalayancc.com\naxhjfobr.shop\naxhub.im\naxiang.com\naxiaoxin.com\naxic6906.com\naxilone-shunhua.com\naxinsur.com\naxisfluid.com\naxjm-ex.com\naxjsw.com\naxjx.com\naxmro.com\naxmw.com\naxnsc.com\naxoij.com\naxq66.com\naxqqq.com\naxqswm.net\naxs8.com\naxshuyuan.com\naxuer.com\naxuexiw.com\naxunyou.com\naxure.us\naxureshop.com\naxureux.com\naxxsw.org\naxybio.com\naxyxt.com\naxzchou.com\nay-china.com\nay-health.com\nay001.com\nay001.net\nay2fy.com\nay57.com\nay5y.com\nay99.net\nayalm.com\nayatuan.com\naybwg.org\naycav.com\naycgu.com\naychfy.com\nayctgy.com\naydaojia.com\naye.ink\nayeucefm.com\nayfdc.com\nayfy.com\nayfyfy.com\nayguge.com\nayhmjy.com\nayhuowan.com\nayhyxg.com\nayi800.com\nayibang.com\nayidada.com\nayijx.com\nayilaile.com\nayilian.com\nayjewelry.com\nayjs.net\naykj.net\nayklgas.com\naymym.com\naynchem.com\nayoushu.com\nayqy.net\nayrbs.com\nayrc.cc\nayrc.net\nayrmt.com\nayrq.com\naysbxxh.com\nayshq.com\naysjhod.xyz\naysjyjjh.com\nayudasalud.com\nayump.com\nayunlian.com\nayuren.com\nayuyun.com\nayw.ink\nayxz.com\nayzzxx.com\naz009.com\nazad.asia\nazbingxin.com\nazbq.org\nazchcdna.com\nazchcdnb.com\nazchcdnc.com\nazchcdnd.com\nazchcdne.com\nazchcdnf.com\nazchcdng.com\nazchcdnh.com\nazchcdni.com\nazchcdnj.com\nazchcdnk.com\nazchcdnl.com\nazchcdnm.com\nazchcdnn.com\nazchcdno.com\nazchcdnp.com\nazchcdnq.com\nazchcdnr.com\nazchcdns.com\nazetac.com\nazf010.com\nazhimalayanvh.com\nazhituo.com\nazhubaby.com\nazjy88.com\nazmcode.com\nazmtszpk.com\nazonete.com\nazooo.com\nazoyacdn.com\nazoyagroup.com\nazp315.com\nazpdl.com\nazpdl.net\nazt365.com\nazuiblc.com\nazure-wave.com\nazure.cc\nazureflying.com\nazuremigrate.download.prss.microsoft.com\nazuremigratetest.download.prss.microsoft.com\nazurestackhub.download.prss.microsoft.com\nazurestackhubuat.download.prss.microsoft.com\nazuretouch.net\nazurew.com\nazureyun.com\nazxdiy.com\nazy288.com\nazycjd.com\nazyfy.com\nazz.net\nazzdm.com\nb-chem.com\nb-cro.com\nb-eurochina.com\nb-fairy.com\nb-k-automation.com\nb-raymedia.com\nb.biz\nb01.net\nb02f0d7f3745ba7c.com\nb041e427810281.beer\nb07cceaf011012.beer\nb08.com\nb082392de1024.beer\nb13075593271.com\nb13bc577fd.run\nb18e55f8a1010.beer\nb19a352d2336941a.com\nb1bj.com\nb1cjcgy8s2.com\nb1n.net\nb1qg.com\nb214bd8861009.beer\nb2216419b1013.beer\nb22fb6d6d1015.beer\nb23.tv\nb230756fa1114.beer\nb230ed9d61010.beer\nb262a49751023.beer\nb27ceaa1053.skin\nb287f400810291.beer\nb29f45a5b10271.beer\nb29gj.com\nb2b-builder.com\nb2b.biz\nb2b123.com\nb2b168.com\nb2b168.net\nb2b168.org\nb2b3.com\nb2b6.com\nb2b818.com\nb2bdq.com\nb2bgo.com\nb2bic.com\nb2bkk.com\nb2bname.com\nb2bvip.com\nb2bvip.net\nb2byao.com\nb2c-28loops.com\nb2c.biz\nb2cedu.com\nb2clouds.com\nb2jiaxiao.com\nb2q.com\nb2star.com\nb3198a37310281.beer\nb3727743007e8b15.com\nb384f2fff3e6d159.com\nb3b97f52c55246d7.com\nb3inside.com\nb3log.org\nb3logfile.com\nb40e80b301022.beer\nb44fd0fd51014.beer\nb4ca25f717d58cac.com\nb5.com\nb510qh.shop\nb5232b4da6e285b2.com\nb53358ed31009.beer\nb555b.com\nb55weik1d4.com\nb5669d7a0a.vip\nb5a3f14042830b91.com\nb5b6.com\nb5b6308ab4859018.com\nb5csgo.plus\nb5esports.me\nb5m.com\nb5nngc6zmt.com\nb6098130711042.beer\nb612.me\nb612.net\nb612kaji.com\nb643bce461009.beer\nb6522.com\nb670bffdf1021.beer\nb68f0a844eec7fff.com\nb6a531b371011.beer\nb6cc0921b1024.beer\nb6r.com\nb71ea195f05f569c.com\nb71ef13941015.beer\nb75c5da009ac3871.com\nb76ad11181024.beer\nb7av.com\nb7e314d4810241.beer\nb7eeeb26810241.beer\nb812824ed173a8c0.com\nb83d11444463a621.com\nb883481331023.beer\nb8e4d120a10271.beer\nb8kk.com\nb8yx.com\nb9127b1b510292.beer\nb93a0ccdfcd1d26c.com\nb93df4bea4666064.com\nb963aae3c10272.beer\nb9a3e87f01023.beer\nb9ad.com\nb9bdc7d62dfb0e5e.com\nb9noqayb1s.work\nba-li.com\nba08e2f96f675d22.com\nba1400.com\nba20db47708bc51f.com\nba7jcm.live\nbaacloud32.com\nbaae91ac810311.beer\nbaalchina.net\nbaaniarts.com\nbaba-blog.com\nbaba12.com\nbababian.com\nbababus.com\nbabady.com\nbabai.cc\nbabaicai.com\nbabaike.com\nbabaimi.com\nbaballs.com\nbabao.com\nbabapi.com\nbabawar.com\nbabaxiong.com\nbabedy.com\nbabeijiu.com\nbabeword.com\nbabifood.com\nbabiguoguo.com\nbabolchina.com\nbaboshan.com\nbabsoft.net\nbabuxiang2005.com\nbaby-bus.com\nbaby-joy.com\nbaby577.com\nbaby611.com\nbaby7blog.com\nbaby868.com\nbabybus.com\nbabybus.org\nbabycdn.com\nbabymoro.com\nbabymozart.cc\nbabyqiming.com\nbabytree.com\nbabytreeimg.com\nbacaizi.com\nbacaola.com\nbacaoo.com\nbacaosh.com\nbacic5i5j.com\nbackaudio.com\nbackdata.net\nbackendman.com\nbackmany.com\nbackoffice-cms.com\nbackupdesktopcloud.com\nbacninhlocalguide.com\nbacocis.com\nbacts.com\nbacyfzjt.com\nbadambiz.com\nbadazhou.com\nbademeiji.com\nbadmintoncn.com\nbadmintone.com\nbadong.net\nbadou.com\nbadouxueyuan.com\nbadu.com\nbadudns.cc\nbaduziyuan.com\nbadwe.com\nbaeapps.com\nbaertt.com\nbaetyl.tech\nbaf566dfd40e3413.com\nbafangjuhe.com\nbafangwy.com\nbag198.com\nbagb2b.com\nbagevent.com\nbags163.com\nbagsnet.com\nbagstory.net\nbagtree.com\nbaguichong.com\nbaguilingyun.com\nbagxs.com\nbahealpharma.com\nbahecloud.com\nbahens.com\nbahepark.com\nbai.com\nbaian-group.com\nbaiao.com\nbaibaipei.com\nbaibaoyun.com\nbaibm.com\nbaibo8.com\nbaibomedia.com\nbaibu.com\nbaic-group.com\nbaicai.asia\nbaicai.com\nbaicaijie09.com\nbaicaio.com\nbaicaiyouxuan.com\nbaicaolu.net\nbaicaosoft.com\nbaiccapital.com\nbaiccl.com\nbaicdnx.com\nbaicells.com\nbaicfc.com\nbaicheng.com\nbaichengtax.com\nbaichengyuehua.com\nbaichuan-ai.com\nbaichuan.tech\nbaichuanhd.com\nbaichuanhudong.com\nbaichuannet.vip\nbaichuanweb.com\nbaicizhan.com\nbaicizhan.org\nbaiclouds.com\nbaicmotor.com\nbaicmotorsales.com\nbaicrx.com\nbaicuoa.com\nbaidajob.com\nbaidao.com\nbaideled.com\nbaidenafu.com\nbaidesz.com\nbaidevalve.com\nbaideye.com\nbaidiapp.com\nbaidinet.com\nbaidu-bank.com\nbaidu-cdn.com\nbaidu-cdn.net\nbaidu-int.com\nbaidu-itm.com\nbaidu-mgame.com\nbaidu-nj.com\nbaidu-tech.com\nbaidu-wenxue.com\nbaidu.cc\nbaidu.com\nbaidu.com.hk\nbaidu.hk\nbaidu.mobi\nbaidu120.cc\nbaidu123.com\nbaiduads.com\nbaiduapp.com\nbaidubaidubaidu.net\nbaidubce.com\nbaidubcr.com\nbaidubos.com\nbaiducloudapi.com\nbaiducontent.com\nbaidudaquan.com\nbaidudw.com\nbaidufe.com\nbaidufree.com\nbaiduhtml5.com\nbaiduhui.com\nbaidujinshu.com\nbaidulook.com\nbaiduor.com\nbaidupan.com\nbaidupcs.com\nbaidupcs.net\nbaidupeixun.com\nbaidusmartapps.com\nbaidusx.cc\nbaidusx.com\nbaidutab.com\nbaidutieba.com\nbaidutt.com\nbaiduux.com\nbaiduwaf.com\nbaiduwebgame.com\nbaiduwpan.com\nbaiduxiaodai.com\nbaiduxiaoshuo.com\nbaiduyangguang.org\nbaiduyun.com\nbaiduyun.wiki\nbaiduyuncdn.com\nbaiduyuncdn.net\nbaiduyundns.com\nbaiduyundns.net\nbaiduyunsousou.com\nbaiduyunwaf.com\nbaiduzjn.com\nbaieryk.com\nbaifae.com\nbaifang.in\nbaifangdianqi.com\nbaifangzh.com\nbaifeiyue.com\nbaifubao.com\nbaigebao.com\nbaigebg.com\nbaigehuidi.com\nbaigeseo.com\nbaigo.net\nbaigolf.com\nbaigongbao.com\nbaigougou.com\nbaigouwanggong.com\nbaiguitang.com\nbaihangbao.com\nbaihangdai.com\nbaihaocha.com\nbaihe.com\nbaiheee.com\nbaihelove.com\nbaihemedical.com\nbaihemob.com\nbaihezi.com\nbaihong.com\nbaihongsoft.com\nbaihuayan.com\nbaihui.com\nbaihui.live\nbaihui168.com\nbaihuibio.com\nbaihuillq.com\nbaihuiyaoye.com\nbaiila.com\nbaiinfo.com\nbaijia.com\nbaijiacloud.com\nbaijiahulian.com\nbaijiantest.com\nbaijiasheping.com\nbaijiaxingwang.com\nbaijiayun.com\nbaijiayuncdn.com\nbaijiegroup.com\nbaijiexiu.com\nbaijii.com\nbaijincdn.com\nbaijingapp.com\nbaijiudl.com\nbaijob.com\nbaijunjz.com\nbaijunyao.com\nbaijus.net\nbaijuyi.com\nbaikaigroup.com\nbaikalasia.com\nbaikalminer.com\nbaikalyq.com\nbaikangyun.com\nbaike.com\nbaikecs.com\nbaiked.com\nbaikehuanjing.com\nbaikemy.com\nbaikemy.net\nbaikeshiji.com\nbaikeshijie.com\nbaikevod.com\nbaikewenda.com\nbaikexueshe.com\nbaikezh.com\nbailb.com\nbailepin.com\nbailiaijia.com\nbailiangroup.com\nbailiann.com\nbailiban.com\nbailiguangmang.com\nbailing.online\nbailing88.com\nbailingdanci.com\nbailingjk.net\nbailinsi.net\nbailitech.com\nbailitools.com\nbailitop.com\nbailizw.com\nbailucloud.com\nbailvanquan.xyz\nbaima.com\nbaimao-expo.com\nbaimao.com\nbaimaohui.net\nbaimatech.com\nbaimda.com\nbaimei.com\nbaimeidashu.com\nbaimiao.tech\nbaimiaoapp.com\nbaimin.com\nbaina.com\nbainaben.com\nbainaruibusiness.com\nbaineng.cc\nbainmedical.net\nbainus.com\nbaiousen.com\nbaiozhuntuixing.com\nbaipin.pw\nbaipu365.com\nbaiqian.com\nbaiqiangart.com\nbaiqiangyl.com\nbaiqianxin.com\nbaiqiaogame.com\nbaiqishi.com\nbaiqiso.com\nbaiqiyaoye.com\nbaiquefahuasi.com\nbairenzbg.org\nbairoe.com\nbaironginc.com\nbairuitech.com\nbaisainuo.com\nbaise.cc\nbaise123.vip\nbaise1314.com\nbaisecn.com\nbaiselife.com\nbaiselyw.com\nbaiseshiyu.com\nbaiseylj.com\nbaiseyun.com\nbaisha.com\nbaishan-cloud.com\nbaishan-cloud.net\nbaishan-gateway.com\nbaishan.com\nbaishancdnx.com\nbaishancdnx.net\nbaishancdnx.top\nbaishancloud.com\nbaishancloud.org\nbaishandnsx.com\nbaishandnsx.net\nbaishandnsx.top\nbaishangeek.com\nbaishanyun.com\nbaishicha.com\nbaishimeipai.com\nbaishinetwork.com\nbaishishuju.com\nbaishixi.xyz\nbaishuku.la\nbaishulou.net\nbaishunet.com\nbaishuyun.com\nbaishuzhai.cc\nbaishuzhai.com\nbaisihan.com\nbaisiterzh.com\nbaisiweiting.com\nbaisu.cc\nbaisuizhixiang.com\nbaitahe.net\nbaitaihuge.com\nbaitanheichang.com\nbaitdu.com\nbaite666.com\nbaithu.com\nbaitianinfo.com\nbaitiao.com\nbaitomould.com\nbaitongplastics.com\nbaitongwang.com\nbaitu.com\nbaituibao.com\nbaiu.com\nbaiven.com\nbaiwandz.com\nbaiwang.com\nbaiwangjs.com\nbaiwen100.com\nbaiwenbao.com\nbaiwujt.com\nbaiwulin.com\nbaiwushi168.com\nbaiwutong.com\nbaixiangfood.com\nbaixiangnews.com\nbaixiaosheng.net\nbaixiaoxs.com\nbaixihuang.com\nbaixing.com\nbaixing.net\nbaixingjob.com\nbaixingyllh.com\nbaixiong.info\nbaixiu.org\nbaiyang.com\nbaiyangseo.com\nbaiyaohy.com\nbaiycap.net\nbaiye5.com\nbaiyewang.com\nbaiyi.shop\nbaiyi181.com\nbaiyiba.com\nbaiyikc.com\nbaiying.com\nbaiyinggd.com\nbaiyintouzi.com\nbaiyishequ.com\nbaiyizg.com\nbaiyjk.com\nbaiyou100.com\nbaiyu.tech\nbaiyujingfeng.com\nbaiyumedia.com\nbaiyun-hotel.com\nbaiyunairport.com\nbaiyunholding.com\nbaiyunhuojia.com\nbaiyunmh.com\nbaiyunpump.com\nbaiyunxitong.com\nbaiyuyu.com\nbaiyyy.com\nbaizengtech.com\nbaizhan.net\nbaizhanke.com\nbaizhanlive.com\nbaizhouniao.com\nbaizlink.com\nbajasaechina.com\nbajie1.com\nbajiebofang.com\nbajiexinxi.net\nbajintech.com\nbaka.im\nbaka.plus\nbakaxl.com\nbakbitionb.com\nbakclass.com\nbakerdavid.shop\nbakingerp.com\nbaklib.com\nbakpower.com\nbakshifen.com\nbakstotre.com\nbala.cc\nbalance-net.com\nbalancer-sh.com\nbaldc.com\nbaldor-tech.com\nbaletu.com\nbalift.com\nbalihe.com\nbalijieji.com\nbalimtoy.com\nbalingtxt.com\nballgametime.com\nballpure.com\nballtv.cc\nbaltamatica.com\nbaltamatica.net\nbama-supercon.com\nbamaiwo.com\nbamalifelong.com\nbamaol.cc\nbamaol.com\nbamashenspring.com\nbamatea.com\nbamaying.com\nbamboofactorychina.com\nbambooolab.com\nbambu-lab.com\nbambulab.com\nbamengame.com\nbamensq.com\nbamenzhushou.com\nbamuwu.com\nbamuyu.com\nbananafather.com\nbananain.com\nbananalighter.com\nbananau.com\nbananaumbrella.com\nbananaunder.com\nbanban.work\nbanbang.com\nbanbanjia8.com\nbanbao22.com\nbanbijiang.com\nbancai.com\nbancheng08.fun\nbanchengyun.com\nbanchuan.net\nbanciyuan.me\nbandainamcoshanghai.com\nbandao.com\nbandaoapp.com\nbandari.net\nbandayun.com\nbandcevent.com\nbandcoder.com\nbandeyu.com\nbandianli.com\nbandoristation.com\nbandvr.com\nbanfubbs.com\nbangandi.com\nbangbang.com\nbangbang93.com\nbangbanghuoyun.com\nbangbendi.com\nbangboss.com\nbangbuy.com\nbangcaiwu.com\nbangcheng0769.com\nbangchengchem.com\nbangcle.com\nbangcn.com\nbangdao-tech.com\nbanggeen.com\nbanggo.com\nbanghaiwai.com\nbangivf.com\nbangjiantong.com\nbangjigroup.com\nbangju.net\nbangkaixin.com\nbangkao.com\nbangkaow.com\nbangkebao.com\nbangkehui.com\nbanglianai.com\nbangmai.com\nbangninji.com\nbangnixia.com\nbangnizexiao.com\nbangongtuku.com\nbangongyi.com\nbangongziyuan.com\nbangqi66.com\nbangqike.com\nbangqu.com\nbangrong.com\nbangsee.com\nbangshouwang.com\nbangtaixcl.com\nbangthink.com\nbangtukj.com\nbanguanjiabc.com\nbangwo8.com\nbangwo8.net\nbangwoting.com\nbangxuetang.com\nbangyike.com\nbangzechem.com\nbangzhuta.com\nbanji.org\nbanji001.com\nbanjia1680.com\nbanjiajia.com\nbanjiang.cc\nbanjiekuaiji.com\nbanjing.com\nbanjixiaoguanjia.com\nbanjuanshu.com\nbanjunxingkeji.com\nbank-139.com\nbank-of-china.com\nbank-of-tianjin.com\nbankalliance.net\nbankcomm.com\nbankcomm.com.au\nbankcomm.com.mo\nbankcomm.com.tw\nbankcz.com\nbankgz.com\nbankhr.com\nbankksw.com\nbanklilv.com\nbankofbbg.com\nbankofchangsha.com\nbankofchina.com\nbankofdl.com\nbankofshanghai.com\nbankofshanghai.net\nbankofsv.com\nbankoftianjin.com\nbankoftieling.com\nbankofvolc.com\nbankofyk.com\nbanksteel.com\nbankyellowriver.com\nbanlikanban.com\nbanma.com\nbanmaaike.com\nbanmacdn.com\nbanmadayuwen.com\nbanmaedu.com\nbanmaerp.com\nbanmagushi.com\nbanmajsq.com\nbanmajz.net\nbanmasiwei.com\nbanmasrf.com\nbanmasusuan.com\nbanmayingyu.com\nbanmi.mobi\nbannei.com\nbanner668.com.hk\nbanqumusic.com\nbansha.com\nbanshangong.com\nbanshier.com\nbantangapp.com\nbantangbuy.com\nbantouyan.com\nbanwagong.men\nbanwagongcn.com\nbanwagongzw.com\nbanwo365.com\nbanwoo.net\nbanwoyo.net\nbanwugongsi.com\nbanxiaomazaojiao.com\nbanxiayue.com\nbanye.tech\nbanyiyi.com\nbanyuetan.org\nbanyuetanapp.com\nbanyuetanedu.com\nbanyuetanxcx.com\nbanyunjuhe.com\nbanzhe.xyz\nbanzhuti.com\nbanzou.name\nbanzouzhizuo.com\nbao-fang.com\nbao-hulu.com\nbao12333.com\nbao265.com\nbao315.com\nbao369.com\nbaoanchina.com\nbaob123.com\nbaobanli.com\nbaobao001.com\nbaobao88.com\nbaobaobang.com\nbaobaoqiming.site\nbaobaoshu.com\nbaobei360.com\nbaobeicang.com\nbaobeigezi.com\nbaobeihr.com\nbaobeihuijia.com\nbaobeio.com\nbaobeita.com\nbaobeituan.com\nbaobeiy.com\nbaobianli.net\nbaocdn.com\nbaochaojianghu.com\nbaochunyiran.com\nbaocps.com\nbaocuicoin.com\nbaodan100.com\nbaodan360.com\nbaodaohealth.com\nbaodaren.net\nbaodery.com\nbaodian.com\nbaodigs.com\nbaodu.com\nbaoduys.com\nbaofeng.com\nbaofeng.la\nbaofeng.mobi\nbaofeng.net\nbaofeng365.com\nbaofengtv.com\nbaofon.com\nbaofoo.com\nbaofoo.net\nbaofu.art\nbaofu.com\nbaofu.info\nbaofull.com\nbaofumuye.com\nbaogang.info\nbaogao.com\nbaogao.store\nbaogaobox.com\nbaogaoku.com\nbaogaoting.com\nbaoge.net\nbaogebei.com\nbaoguangtai.com\nbaoguogroup.com\nbaohanghr.com\nbaohebao.com\nbaohongbao.net\nbaohua-pec.com\nbaohuagroup.com\nbaohuatravel.com\nbaohuaxia.com\nbaohuiming.net\nbaoimg.net\nbaoinsurance.com\nbaoji-marathon.com\nbaoji3g.com\nbaojia.com\nbaojiagaiye.com\nbaojian.com\nbaojiazhijia.com\nbaojiegy.com\nbaojijob.com\nbaojinews.com\nbaojinling.com\nbaojule.com\nbaojun.net\nbaojunev.com\nbaokan.tv\nbaokang.com\nbaokanhuicui.com\nbaokao.net\nbaokaodaxue.com\nbaoke-cn.com\nbaoku.com\nbaokuaishou.com\nbaokuandi.com\nbaokutreasury.com\nbaolansz.com\nbaoliannet.com\nbaolijuyuan.org\nbaolizx.com\nbaolong.biz\nbaolong.com\nbaoltx.com\nbaolu.store\nbaomaxs.com\nbaomei.tv\nbaomi.com\nbaomi365.com\nbaomidou.com\nbaomihua.com\nbaoming.com\nbaoming.work\nbaomingge.com\nbaomitu.com\nbaoneng.com\nbaoqin.com\nbaoqingvip.com\nbaor.work\nbaoruan.com\nbaoruisi.com\nbaoshe.net\nbaoshe01.com\nbaoshengcable.com\nbaoshengele.com\nbaoshenggroup.com\nbaoshuanglong.com\nbaoshuiguoji.com\nbaoshuiguoji.net\nbaoshuo.ren\nbaoshuo.xyz\nbaosight.com\nbaosiwushidhex.work\nbaosteel.com\nbaosteel.info\nbaosteelpackaging.com\nbaostock.com\nbaotadns.com\nbaotaiclad.com\nbaotaikonggu.com\nbaotang5.com\nbaotime.com\nbaotoo.com\nbaotoulawyer.com\nbaotounews.com\nbaotoushizx.com\nbaotuba.com\nbaotuo.cc\nbaowu.com\nbaowuenergy.com\nbaowugroup.com\nbaoxian.com\nbaoxian72.com\nbaoxianhai.com\nbaoxianjie.net\nbaoxianqi.com\nbaoxianshichang.com\nbaoxiaobar.com\nbaoxiaohe.com\nbaoxiaoke.com\nbaoxinchewang.com\nbaoxingmuye.com\nbaoxinleasing.com\nbaoxins.com\nbaoxiu.com\nbaoxiu.net\nbaoxuexi.com\nbaoxuexiedu.com\nbaoyagroup.com\nbaoyang1.com\nbaoyang888.com\nbaoyegroup.com\nbaoyehb.com\nbaoyejs.com\nbaoying.com\nbaoyizn.com\nbaoyt.com\nbaoyuanchem.com\nbaoyueai.com\nbaoyuekj.com\nbaoyuncm.com\nbaoyung.com\nbaoyuntong.com\nbaoz.net\nbaozang.com\nbaozengzhang.com\nbaozhenart.com\nbaozheng.cc\nbaozhenlu.com\nbaozhilin.com\nbaozhuang.biz\nbaozhuangren.com\nbaozi.fun\nbaozi178.com\nbaozijishu.com\nbaozipu.com\nbaozou.com\nbaozoudi.com\nbaozoumanhua.com\nbaozugongkeji.com\nbaozun.com\nbaozy.com\nbapengpc.com\nbaping.com\nbaqi28.com\nbaqiu.com\nbarhuta.com\nbarjiang.com\nbarlosi.com\nbarman.vip\nbaron-bj.com\nbaronyhotels.com\nbaronzhang.com\nbarretlee.com\nbartistar.online\nbartymedical.com\nbasechem.org\nbasecity.com\nbased-edu.com\nbaseopendev.com\nbasequan.com\nbasestonedata.com\nbashan.com\nbashigao.com\nbashuhuapai.com\nbashuku.com\nbasiccat.org\nbasicfinder.com\nbasischina.com\nbastcn.com\nbasunlighting.com\nbat-sz.com\nbatchat.com\nbatengtiyu1.com\nbatian.net\nbatman.plus\nbatmanit.com\nbatmsg.com\nbatplay.com\nbattery-cert.com\nbattery-expo.com\nbattery8.com\nbatterydir.com\nbatterykey.com\nbattle-fsd.com\nbattlecare.net\nbattleofballs.com\nbatupian.net\nbaufortune.com\nbauschlombchina.com\nbawagon.com\nbawanglongbengye.com\nbawjxt.net\nbawu.net\nbaxiami.com\nbaxichina.com\nbaxisuye.com\nbaydn.com\nbaye.tech\nbayee.cc\nbayinh.com\nbaykee.net\nbaynoe.com\nbayucar.com\nbayuche.com\nbayuegua.com\nbayueju.com\nbayunhome.com\nbayuxuexiao.net\nbayzedhealthcare.com\nbazaarjewelrychina.com\nbazai.com\nbazhan.com\nbazhepu.com\nbazhong.com\nbazhongol.com\nbazhua.me\nbazhuay.com\nbazhuayu.cc\nbazhuayu.com\nbazhuayukeji.com\nbazi.cloud\nbazi.run\nbazi.xin\nbazi5.com\nbaziguwen.com\nbazizeri.com\nbb-game.com\nbb-hy.com\nbb-pco.com\nbb06.com\nbb361a58c1015.beer\nbb39977653.com\nbb3a14ca57af4d81.com\nbb52e27c75560d3f.com\nbb730b04b6cc8c57.com\nbbanp.com\nbbaod.com\nbbaqw.com\nbbb1415.com\nbbbaaa.com\nbbbao.com\nbbbb.com\nbbbcdns.com\nbbbmq.com\nbbbms.com\nbbbtgo.com\nbbc54c1281125042.com\nbbcagroup.com\nbbcayy.com\nbbchin.com\nbbctop.cc\nbbctop.com\nbbdj.com\nbbdservice.com\nbbdup.com\nbbecpsc.com\nbbef-tech.com\nbbef.com\nbbeshop.com\nbbez.com\nbbfkjkh.com\nbbfoxgame.com\nbbfstore.com\nbbfytsn.com\nbbgdex.com\nbbgsite.com\nbbguangcai.com\nbbhou.com\nbbicn.com\nbbioo.com\nbbjgr.com\nbbk.com\nbbk000.com\nbbkantu.com\nbbkys.com\nbblcdn.com\nbblmw.com\nbblops.com\nbbmuwwxyk.com\nbbmy.net\nbbobo.com\nbbonfire.com\nbbosu.com\nbbpph.com\nbbpu.com\nbbqcdn.com\nbbqe.com\nbbqk.com\nbbqk.net\nbbqming.com\nbbqseo.com\nbbqwhg.com\nbbrmedia.com\nbbrtv.com\nbbs-alsontech.com\nbbs0415.com\nbbs0551.com\nbbs1x.net\nbbscloud.com\nbbsds.com\nbbsls.net\nbbsmc.net\nbbsnet.com\nbbstv.clouducs.com\nbbsufida.com\nbbsut.com\nbbsxp.com\nbbszjj.com\nbbtang.info\nbbtcaster.com\nbbteapress.com\nbbtengfeizaixian.com\nbbthy.net\nbbtkid.com\nbbtpress.com\nbbtwatch.com\nbbugifts.com\nbbunion.com\nbbw-portnet.com\nbbwcec.com\nbbwcq.com\nbbwfish.com\nbbwgw.com\nbbwhy.com\nbbwict.com\nbbwoils.com\nbbwotc.com\nbbwport.com\nbbwport.net\nbbwrc.com\nbbwse.com\nbbwunisco.com\nbbxarq.com\nbbxinwen.com\nbbxinwen.net\nbbxstjx.com\nbbydsol.com\nbbzhh.com\nbbzhi.com\nbbzhsw.com\nbbzxky.fun\nbc150.com\nbc4785bd211012.beer\nbc5539.com\nbc754c518ef6127a.com\nbc966.com\nbcaacademy.org\nbcactc.com\nbcb5.com\nbcbjjy.com\nbcbksbx.com\nbcbpm.com\nbcbvi.com\nbccastle.com\nbccn.net\nbccnsoft.com\nbccoder.com\nbccv.com\nbcdaren.com\nbcdnx.com\nbcdy.net\nbce-cdn.com\nbce-cdn.net\nbce0619341023.beer\nbceapp.com\nbcebos.com\nbcedns.com\nbcedns.net\nbcedocument.com\nbcegc.com\nbcehost.com\nbcehosts.com\nbceidaas.com\nbceimg.com\nbcelive.com\nbcevod.com\nbcewaf.com\nbcf1ef2511022.beer\nbcfmglobal.com\nbcfy188.com\nbcgf.cc\nbcghotel.com\nbchdemo.site\nbchlkj.com\nbchrt.com\nbcisz.org\nbcitb.com\nbcjkcloud.com\nbcjp.net\nbclcraft.com\nbcmcdn.com\nbcmonomial.xyz\nbcn.cc\nbcpcn.com\nbcpgame.com\nbcpharma.com\nbcplab.com\nbcpmdata.com\nbcreat.com\nbcrjl.com\nbcrmtzx.com\nbcryo.com\nbcsfoong.com\nbcshipgo.com\nbcsloong.com\nbcsytv.com\nbctdtx.com\nbctest.com\nbctts.com\nbcty365.com\nbcvbw.com\nbcvdmovie.com\nbcwangluo.net\nbcxgame.com\nbcxgps.com\nbcxww.com\nbcy.net\nbcyimg.com\nbczcdn.com\nbczyyy.com\nbd-caict.com\nbd-gti.com\nbd-union.com\nbd001.net\nbd0afb0887.xin\nbd3be95d910301.beer\nbd682bc7d22322eb.com\nbd689.com\nbd7kzs.site\nbdactivity.com\nbdaenviro.com\nbdajob.com\nbdall.com\nbdapark.com\nbdatu.com\nbdbae.com\nbdc-rays.com\nbdcb.cc\nbdcgz.com\nbdchangtujs.com\nbdchina.com\nbdcloudapi.com\nbdclouddns.com\nbdcn-media.com\nbddhospital.com\nbddlm.com\nbde5fc098b5291bf.com\nbdebid.com\nbdeceimg.com\nbdegnine.com\nbdf2.com\nbdfczx.com\nbdfmj.com\nbdfmkj.com\nbdfyy999.com\nbdfzcd.net\nbdfzkyy.com\nbdg-brain.com\nbdgamelive.com\nbdgp.cc\nbdgqx.com\nbdgslb.com\nbdgw.cc\nbdhdtv.com\nbdhengding.com\nbdhhg.com\nbdhhome.com\nbdhulanwang.com\nbdimg.com\nbdinfo.net\nbdispatch.com\nbdispatch.net\nbdjz.vip\nbdkyr.com\nbdlcqjw.com\nbdmozon.com\nbdmyandex.com\nbdns-api-test.net\nbdns-boe.com\nbdns-boe.net\nbdns-gtm-01.net\nbdns-gtm-pressure.com\nbdns-restore.net\nbdns-test.com\nbdns-test.net\nbdo-dahua.com\nbdpan.com\nbdpnt.com\nbdppe.net\nbdqn027.com\nbdqn666.com\nbdqnwh.com\nbds-cn.com\nbds666.com\nbdsagslb.com\nbdsagslbtest.com\nbdsana.com\nbdsd.design\nbdsgx.com\nbdshengce.com\nbdshuang.com\nbdsimg.com\nbdsj.net\nbdspacetime.com\nbdstar.com\nbdstatic.cc\nbdstatic.com\nbdsytime.com\nbdszh.vip\nbdtianchang.com\nbdtic.com\nbdtjrcv.com\nbdtm.net\nbdtsc.com\nbduapp.com\nbdurl.net\nbdvending.com\nbdwater.com\nbdwhyscjh.com\nbdwkxz.com\nbdwm.net\nbdwork.com\nbdxc.com\nbdxdgs.com\nbdxiguaimg.com\nbdxigualive.com\nbdxiguastatic.com\nbdxiguavod.com\nbdxpa.com\nbdxx.net\nbdxyykj.com\nbdxyz.com\nbdycdn.com\nbdycdn.net\nbdydns.com\nbdydns.net\nbdyhhb.com\nbdylzbyy.com\nbdymkt.com\nbdysc.com\nbdysite.com\nbdysites.com\nbdyz.xyz\nbdzhipin.com\nbdzjdsagslb.com\nbe-xx.com\nbe1775.com\nbe1dbb20578c1b79.com\nbe20e436e111e1f7.com\nbe30d71aea370488.com\nbe7076f2b2ff2953.com\nbe79d8d36f962bd6.com\nbe84433f5ce02a66.com\nbe896b364b76c6df.com\nbe90.com\nbeacons.gcp.gvt2.com\nbeacons.gvt2.com\nbeacons2.gvt2.com\nbeacons3.gvt2.com\nbeadwallet.com\nbeamweldingmachine.com\nbeancomm.com\nbeantechyun.com\nbear20.com\nbearead.com\nbeargoo.com\nbearingclub.com\nbearrental.com\nbearsing.com\nbearyboard.com\nbearychat.com\nbeastush.com\nbeasure.com\nbeatbeatone.com\nbeats-digital.com\nbeatsbydre.com\nbeaucare.org\nbeautifulbank.com\nbeautifulcarrot.com\nbeautifullinux.com\nbeautifulzzzz.com\nbeaverbio.com\nbeb688d9cad7d208.com\nbebhmongb.com\nbechangedt.com\nbecker-china.com\nbeckwai.com\nbeckyroom.com\nbecod.com\nbecomingcelia.com\nbecominggroup.com\nbecukwai.com\nbeduu.com\nbee-core.com\nbee-net.com\nbee-station.com\nbee3d.com\nbeebeepop.com\nbeebeeto.com\nbeecook.com\nbeedancing.com\nbeeeeego.com\nbeeflower-cn.com\nbeegoedu.com\nbeejoygames.com\nbeelink.com\nbeep365.com\nbeeplay123.com\nbeeshow.tv\nbeespal.com\nbeestor.com\nbeeui.com\nbeeweart.com\nbefar.com\nbegcl.com\nbegeel.com\nbegindcc.com\nbego.cc\nbegoto.com\nbegowin.com\nbehake.com\nbehao.net\nbehaviac.com\nbehrenswatches.com\nbehrenswatches.shop\nbei1688.com\nbeiamp.net\nbeianw.com\nbeibaobang.com\nbeibaozq.com\nbeibei.com\nbeibenkc.com\nbeicaiyuan.com\nbeicdn.com\nbeichende.com\nbeicity.com\nbeidasoft.com\nbeidd.com\nbeidian.com\nbeidisi.com\nbeidoou.com\nbeidou.org\nbeidou66.com\nbeidouchong.com\nbeidouedu.net\nbeidouone.com\nbeidousafety.org\nbeidouxingxueche.com\nbeiduolab.com\nbeierbio.com\nbeierchina.net\nbeierjin.net\nbeieryouxi.com\nbeifa.com\nbeifang.net\nbeifangfoshifen.com\nbeifangjiaoyu.com\nbeifeng.com\nbeifuni.com\nbeigangyouxuan.com\nbeigonggroup.com\nbeiguorc.com\nbeihai365.com\nbeihai97.com\nbeihaidc.com\nbeihaigame.com\nbeihailihe.com\nbeihaimayi.com\nbeihaiqiuzhi.com\nbeihaireexpo.com\nbeihaiwuyeguanli.com\nbeihaiwz.com\nbeihan.net\nbeihansoft.com\nbeihuasoft.com\nbeihuo.net\nbeiing.net\nbeijin100.com\nbeijing-air.com\nbeijing-chopard.com\nbeijing-girardperregaux.com\nbeijing-halfmarathon.com\nbeijing-hmo.com\nbeijing-hualian.com\nbeijing-kids.com\nbeijing-lipin.com\nbeijing-marathon.com\nbeijing-office.com\nbeijing-time.org\nbeijing-tokyo.com\nbeijing101.com\nbeijing120.com\nbeijing518.com\nbeijingaierfei.com\nbeijingapt.com\nbeijingbang.com\nbeijingbaomu.com\nbeijingbio.tech\nbeijingcenterforthearts.com\nbeijingcustoms.com\nbeijingfenxiangkeji.com\nbeijingfire.com\nbeijingfojiao.com\nbeijinggobroadhospital.com\nbeijingguoyitang.com\nbeijinghopemedcare.com\nbeijinghuafu.com\nbeijinghuiyizhongxin.com\nbeijinglandbridge.com\nbeijingnongjiayuan.com\nbeijingnorthstar.com\nbeijingrc.com\nbeijingrc.net\nbeijingrenyi.com\nbeijingsanchi.com\nbeijingtaixie.com\nbeijingtoon.com\nbeijingtrucks.com\nbeijingwatch.com\nbeijingxiantour.com\nbeijingxinzhuoyue.com\nbeijingyouxi.com\nbeijingyuanxin.com\nbeijingzc.com\nbeijingzoo.com\nbeijinxuetang.com\nbeijiu.ink\nbeijzc.com\nbeikeba.com\nbeikeiot.com\nbeikeread.com\nbeikongyun.com\nbeilayl.com\nbeileike.com\nbeileimaoedu.com\nbeiletoys.com\nbeilewh.com\nbeilianjd.com\nbeilile.com\nbeilin.ltd\nbeilinbox.com\nbeiliufuyang.com\nbeimai.com\nbeimeihongfeng.com\nbeimeizhijia.com\nbeimeizhiying.com\nbeinglab.com\nbeingmate.com\nbeipenggroup.com\nbeipy.com\nbeiqujy.com\nbeirangroup.com\nbeiren-tech.com\nbeiren.cc\nbeiren.com\nbeironsign.com\nbeirunjie.com\nbeise.com\nbeisen.com\nbeisenapp.com\nbeisencloud.com\nbeisencorp.com\nbeisenpaas.com\nbeisenyl.com\nbeismei.com\nbeitaguoguo.com\nbeitaichufang.com\nbeitao8.com\nbeitown.com\nbeitre.com\nbeiwaibest.com\nbeiwaiclass.com\nbeiwaiguoji.com\nbeiwaionline.com\nbeiwaiqingshao.com\nbeiwo.com\nbeiww.com\nbeixibaobao.com\nbeixingmh.com\nbeiyijt.com\nbeiyinqi.com\nbeiyiskjc.com\nbeiyongzhan.com\nbeiyuwangxiao.com\nbeizhua.com\nbeiziman.com\nbej9.com\nbejirog.com\nbejson.com\nbekko.com\nbelarusvisacenter.com\nbelfone.com\nbelgiumvisacenterd.com\nbeliefbiomed.com\nbeliefy.com\nbelimked.com\nbelle8.com\nbelletrip.com\nbellinlaser.com\nbelllan.com\nbelloai.com\nbeloj.com\nbelray-coffee.com\nbeltandroadforum.org\nbeltxman.com\nbelverra.com\nbemanicn.com\nbemfa.com\nbemhome.com\nbenbenlong.com\nbenber-tech.com\nbenber.com\nbenbun.com\nbencaopu.com\nbendan.website\nbendi5.com\nbendibao.com\nbendijin.net\nbendis.cc\nbendiso.com\nbendiw.cc\nbendizhidao.com\nbenduo.net\nbenewake.com\nbenfuip.com\nbengbufan.com\nbengden.com\nbengfa.biz\nbenghuai.com\nbengku.com\nbengou.com\nbengrong.com\nbengtie.com\nbengyechina.com\nbengzhanc.com\nbenhs.com\nbeniao.com\nbenjamin.fun\nbenkejieye.com\nbenkua.com\nbenlai.com\nbenlailife.com\nbenlaisy.com\nbenling-sh.com\nbenliuxinwen.com\nbenlizu.com\nbenlkjc.com\nbenlong.vip\nbenma.com\nbenmi.com\nbenmu-health.com\nbennybu.fun\nbenpsbp.com\nbenqhospital.com\nbenqmedicalcenter.com\nbenqmedicalcentersz.com\nbensewang.com\nbenshouji.com\nbensiea.com\nbenweitang.com\nbenweng.com\nbenxiang.com\nbenyh.com\nbenyouhui.com\nbenyuannet.com\nbenzhb.com\nbenzhibbs.com\nbenzhiwangluo.com\nbenztto.com\nbeodesj.com\nbeony.com\nbeook.com\nbepal.pro\nbepurestandards.com\nbequ6.com\nbequ6.org\nbequgew.com\nbequgexs.com\nbequgezw.com\nbequw.com\nbequwx.org\nberchina.com\nberens-china.com\nberfen.com\nbergerda.com\nberlin8.org\nberlinchan.com\nberlinix.com\nbernouly.com\nberrydigi.com\nberrygenomics.com\nbersella-ai.cc\nbersilion.com\nbertadata.com\nberui.com\nberylbot.com\nbes.ren\nbesbranding.com\nbescar.com\nbeschannels.com\nbescity.com\nbescloud.com\nbesclouds.com\nbescn.com\nbesg-bee.com\nbesget.com\nbeshtech.com\nbesile.com\nbesino.com\nbesonchina.com\nbessystem.com\nbest-display.com\nbest-inc.com\nbest-intl-school.com\nbest-lookstone.com\nbest1.com\nbest198.com\nbest66.me\nbest73.com\nbestadprof.com\nbestapp.wiki\nbestarzx.com\nbestatic.com\nbestb2b.com\nbestbeibao.com\nbestblower.com\nbestcdn.vip\nbestcem.com\nbestchoiceco.com\nbestcloudcdn.com\nbestclouddns.com\nbestcood.com\nbestcovered.com\nbestcrossborder.com\nbestdataclub.com\nbestdo.com\nbestdon.net\nbestdosas.com\nbestechnic.com\nbestedm.net\nbesteduchina.com\nbester-cn.com\nbestexpresser.com\nbestfood517.com\nbestfuturevip.com\nbestgo.com\nbesthairextensions.com\nbesthub.tech\nbesticity.com\nbestincapi.com\nbestincapp.com\nbestjy.net\nbestkids.net\nbestlec.com\nbestlee.net\nbestlosslessmusic.com\nbestmate.net\nbestmoban.com\nbestomro.com\nbestone.com\nbestone.vip\nbestopview.com\nbestpay.net\nbestpeng.com\nbestqliang.com\nbestraylaser.com\nbestreplicheitalia.com\nbestrhy.com\nbestsdwan.com\nbestshinhwa.com\nbestsign.info\nbestsign.tech\nbestsignuniversal.com\nbestsrc.com\nbeststeel-sh.com\nbestsungas.com\nbestsuppliers.com\nbestswifter.com\nbesttrav.com\nbestugali.com\nbestv6.com\nbestvcdn.com\nbestvcdn.net\nbestviewstock.com\nbestwa.com\nbestwatch.cc\nbestwatchaaa.com\nbestwaysh.com\nbestwehotel.com\nbestweshop.com\nbestwesternfelicityshenzhen.com\nbestzone.org\nbestzumo.com\nbet007.com\nbet2268.com\nbet2396.com\nbet33040.com\nbet365uo.com\nbet3739.com\nbet505.app\nbet5993.com\nbet6598.com\nbet6737.com\nbet6755.com\nbet8.cm\nbeta-dns.com\nbetaband.net\nbetadance.net\nbetaenv.com\nbetaflare.com\nbetahub.tech\nbetaidc.com\nbetamao.me\nbetaquantity.com\nbetasmart.tech\nbetavolt.tech\nbetawm.com\nbetazixun.com\nbetcctv.com\nbetely.com\nbethh777.com\nbetokapp.com\nbetop-cn.com\nbetop365.com\nbetophall.com\nbettapharma.com\nbettbio.com\nbetter-cn.com\nbetter365.com\nbetterclyde.com\nbetteredu.net\nbetteryeah.com\nbetwayasia.org\nbeuyinm.com\nbeva.com\nbevol.com\nbewellbio.com\nbewg.net\nbewgnn.com\nbeyebe.com\nbeyond-perfection.com\nbeyondbit.com\nbeyondcomparepro.com\nbeyondfund.com\nbeyondh.com\nbeyonditsm.com\nbeyondq.com\nbeyonds.com\nbeyondsungroup.com\nbeyoner.net\nbeyotime.com\nbezbzsyf.com\nbf-jxqc.com\nbf-z.com\nbf-zhengzhou.com\nbf07e33c810281.beer\nbf35.com\nbf99.com\nbfcdnbf.com\nbfcdnrd.com\nbfcdnsc.com\nbfchayuan.com\nbfcmovie.com\nbfdcloud.com\nbfe-networks.com\nbfe-networks.net\nbffengshi.com\nbffyun.com\nbffzb.com\nbfgho.com\nbfhdp1120.com\nbfhmj.com\nbfhmq.com\nbfhzmj.com\nbfikuncdn.com\nbfimg.com\nbfjr.com\nbfjxmajiang.com\nbfjxmj.com\nbfklyhuan.com\nbflschayuan.com\nbfnbgame.com\nbfningbo.com\nbfqh.com\nbfqifu.com\nbfqqsg.com\nbfqtchayuan.com\nbfqzmyq.com\nbfscoc.com\nbfsea.xyz\nbfsmy.com\nbfssj.com\nbfsu-artery.net\nbfsutw.com\nbfsxmj.com\nbft-robot.com\nbftq.com\nbftv.com\nbfvvs.com\nbfw.wiki\nbfxiuxianqipai.com\nbfxpj888.com\nbfypq.com\nbfyx.com\nbfyx.net\nbfzhan.com\nbfzzmj.com\nbg.v4.a.dl.ws.microsoft.com\nbg4.v4.a.dl.ws.microsoft.com\nbg45.com\nbg7ywl.com\nbgbfds.com\nbgbk.org\nbgbluesky.com\nbgccn.com\nbgctv.com\nbgdeco.com\nbgdzsw.com\nbgfl.net\nbggd.com\nbghc.net\nbghgw.com\nbghmj.com\nbgi-graphene.com\nbgi.com\nbgic.com\nbgici.com\nbgigc.com\nbgjbq.com\nbgk100.com\nbgkj.pro\nbgl88.com\nbglmzm.com\nbgmfans.com\nbgmrecord.com\nbgnyl.com\nbgosp.com\nbgrdh.com\nbgri.com\nbgrimm.com\nbgrwgglz.com\nbgs123.com\nbgsdk.net\nbgsdyz.com\nbgsyb.com\nbgteach.com\nbgtwater.com\nbgucu.com\nbgv888.com\nbgvalve.com\nbgwcsz.com\nbgwl.net\nbgwxc.com\nbgxcl.com\nbgxu.com\nbgyfhh.com\nbgyfhyx.com\nbgyhotel.com\nbgyhotels.com\nbgypc.com\nbgypsc.com\nbgyshop.com\nbgyvfs.net\nbgzchina.com\nbgzx365.com\nbh-lay.com\nbh-mangrove.com\nbh-med.com\nbh-xhhd.com\nbh1t.com\nbh3.com\nbh5.com\nbh568.com\nbh8cg18i96.com\nbh8sel.com\nbhabb.com\nbhbd-alliance.org\nbhccn.com\nbhcd.net\nbhcgky.com\nbhcpu.com\nbhcyhotel.com\nbhcyts.cc\nbhcyy.com\nbhczxx.com\nbhdata.com\nbhdl520.com\nbhdns.com\nbhdxfsyy.com\nbhdyjs.com\nbhecard.com\nbheyy.com\nbhfc.net\nbhfeiyang.com\nbhfz114.com\nbhghy.com\nbhgjjy.com\nbhgmarketplace.com\nbhgroups.com\nbhgsb.com\nbhhfsc.com\nbhhospital.com\nbhhsx.com\nbhhthl.com\nbhhzjt.com\nbhidi.com\nbhiv.pro\nbhjcsc.com\nbhjinghao.com\nbhjjj360.com\nbhjuxian.com\nbhkyxy.com\nbhlib.com\nbhlietu.com\nbhlqjt.com\nbhluoer.com\nbhlyw.net\nbhnet.net\nbhnge.com\nbhnsh.com\nbhpcc.com\nbhpiano.com\nbhpiston.com\nbhqd6688.com\nbhqzyy.com\nbhrencai.com\nbhrssp.com\nbhsanfan.com\nbhsbdcdjzx.com\nbhsence.com\nbhsgnk.com\nbhshtksp.com\nbhshunhui.com\nbhshyy.com\nbhsr.com\nbhszyyy.com\nbhtv.cc\nbhuitong.com\nbhuvgy.com\nbhwzdnweys.com\nbhxww.com\nbhxx.net\nbhxxpt.com\nbhxz.net\nbhybskq.com\nbhyby.com\nbhyintan.com\nbhyueda.com\nbhzck.club\nbhzck.xyz\nbhzd88.com\nbhzdzx.net\nbhzhu203.com\nbhzp.net\nbhzpw.com\nbhzw.com\nbhzyxy.net\nbi-ci.com\nbi-sage.site\nbi4sight.com\nbi5u.com\nbi8brp.com\nbian-fengwei.com\nbianbao.net\nbianbu.xyz\nbiancheng.net\nbiancui.com\nbiandangroup.com\nbiandiantong.com\nbiandouyun.com\nbiandown.com\nbianews.com\nbianfeng.com\nbianfengkuailai.com\nbianhaiyun.com\nbianjianzen.com\nbianjiebao.com\nbianjiqi.net\nbianjiyi.com\nbianju.me\nbianlifeng.com\nbianlun.net\nbianmachaxun.com\nbianminwang.com\nbianpingyou.com\nbianquchina.com\nbianquzyk.com\nbiantaishuo.com\nbiantongzixun.com\nbianwa.com\nbianwanjia.com\nbianxiazai.com\nbianyifang.com\nbianyuandaigou.com\nbianzhia.com\nbianzhile.com\nbianzhirensheng.com\nbiao12.com\nbiaobaini.com\nbiaoceo.com\nbiaoda.me\nbiaodan.info\nbiaodan100.com\nbiaodiancloud.com\nbiaodiandichan.com\nbiaodianfu.com\nbiaofaw.com\nbiaoge.com\nbiaoge.me\nbiaohs.com\nbiaoju01.com\nbiaomi.com\nbiaopan8.com\nbiaopeibao.com\nbiaopu.cloud\nbiaoqing.com\nbiaoqing888.com\nbiaoqingjia.com\nbiaoqingwen.com\nbiaoshixinyi.com\nbiaoshula.com\nbiaosucdn.com\nbiaotianxia.com\nbiaotuan.com\nbiaotukeji.com\nbiaoyi.com\nbiaozhaozhao.com\nbiaozhiku.com\nbiaozhun.org\nbiaozhun8.com\nbiaozhuns.com\nbib0.com\nbibaodao.com\nbibenet.com\nbibibi.net\nbibigpt.co\nbibiku.com\nbible.vip\nbicido.com\nbicobrand.com\nbicoin.info\nbicomoptics.com\nbicpaedu.com\nbicredit.xin\nbicv.com\nbicyc.com\nbid-view.com\nbidchance.com\nbidemi.com\nbidepharm.com\nbidepharmatech.com\nbidgojp.com\nbidianbao.com\nbidianer.com\nbidingxing.com\nbidizhaobiao.com\nbidns.net\nbiduo.cc\nbiduobao.com\nbiduoxs.com\nbiduwenxue.com\nbidwhy.com\nbie-plc.com\nbiec.com\nbiechila.com\nbiede.com\nbiedoul.com\nbiekanle.com\nbiema.com\nbiept.com\nbieshu.com\nbietongfeng.com\nbieyangapp.com\nbieyelighting.com\nbifabu.com\nbifengxia.com\nbifiv.com\nbiftsce.com\nbig-bit.com\nbig-shanghai.com\nbig5network.com\nbigaaa.net\nbigaka.com\nbigan.net\nbigbaicai.com\nbigballbiz.club\nbigbangux.com\nbigbenmeng.com\nbigbigai.com\nbigbigsun.com\nbigbigwon.com\nbigbigwork.com\nbigbrosci.com\nbigbrx.com\nbigcakegame.com\nbigcat.com\nbigcloud.click\nbigda.com\nbigdata-expo.org\nbigdata.ren\nbigdatacq.com\nbigdatasafe.org\nbigdatastudy.net\nbigdatawuhan.com\nbigddg.com\nbige0.com\nbigecko.com\nbigehudong.com\nbigemao.com\nbigemap.com\nbigerdata.com\nbigerwall.com\nbigeshuju.com\nbigesj.com\nbigeyes.com\nbiggaming.online\nbiggerlens.com\nbiggeryun.com\nbigherdsman.com\nbigjpg.com\nbigniu.com\nbignox.com\nbigo.sg\nbigo.tv\nbigogm.com\nbigoledog.com\nbigolive.tv\nbigops.com\nbigplayers.com\nbigpt8.com\nbigqiao.com\nbigquant.com\nbigrnet.com\nbigtide.com\nbiguiyuan.net\nbiguo100.com\nbiguolunwen.com\nbiguotk.com\nbigwayseo.com\nbigwh.com\nbigwinepot.com\nbigwww.com\nbigxiao.com\nbigyulin.com\nbigzhong.com\nbihe0832.com\nbihongbo.com\nbihoo.com\nbihu.com\nbihu.work\nbihuatuku.net\nbihubao.com\nbihuoji.com\nbiikan.com\nbiioii.com\nbiji.com\nbijiago.com\nbijiagou.com\nbijianzw.com\nbijiao.org\nbijiasso.com\nbijiatu.com\nbijienetworks.com\nbijingdi.com\nbijirim.com\nbijixia.net\nbijsc.com\nbikeceo.com\nbikecool.com\nbikehome.cc\nbikehome.net\nbiketo.com\nbiketour-giant.com\nbiking-m.com\nbilalipay.com\nbilandtech.com\nbilezu.com\nbilfinance.com\nbiliapi.com\nbiliapi.net\nbilibil.com\nbilibili.cc\nbilibili.co\nbilibili.com\nbilibili.li\nbilibili.net\nbilibili.tv\nbilibili996.com\nbilibiligame.co\nbilibiligame.net\nbilibilihelper.com\nbilibilipay.com\nbilibiliq.com\nbilicdn1.com\nbilicdn2.com\nbilicdn3.com\nbilicdn4.com\nbilicdn5.com\nbilicomic.com\nbilicomics.com\nbiligame.co\nbiligame.com\nbiligame.net\nbiligo.com\nbiligx.com\nbilihot.com\nbiliimg.com\nbiliintl.co\nbiliintl.com\nbilimanga.net\nbilinl.com\nbilinovel.com\nbiliplus.com\nbiliui.com\nbilive.com\nbilivideo.com\nbilivideo.net\nbiliyu.com\nbill-jc.com\nbillchn.com\nbillionaireboard.com\nbillionbottle.com\nbillionconnect.com\nbillionseo.com\nbillowlink.com\nbillu.cc\nbillwang.net\nbilnn.com\nbim-times.com\nbimant.com\nbimawen.com\nbimface.com\nbimfmchina.com\nbimhuite.com\nbimige.net\nbimiwu.com\nbimjoy.com\nbimsa.net\nbinancezh.kim\nbinancezh.link\nbinary-semi.com\nbinaryai.net\nbinaryai.tech\nbinbinbiji.com\nbinbinyl.com\nbincailiuxue.com\nbinfang.com\nbinfenniao.com\nbinfenquzu.com\nbinfenshikong.com\nbinfenyeke.com\nbinfenyingyu.com\nbinfenzhilv.com\nbing400.com\nbingchenvacuum.com\nbingd.com\nbingdian01.com\nbingdoc.com\nbingdou.site\nbingfan.com\nbingganqy.com\nbinggo.com\nbingguner.com\nbinghelengmei.com\nbingjo.com\nbingjun.cc\nbinglai.net\nbinglanggu.com\nbinglianhuajianzhan.com\nbingliekeji.com\nbinglixue.com\nbingninglaowu.com\nbingo321.com\nbingocinemas.com\nbingoenglish.com\nbingolink.biz\nbingosci.com\nbingqipu.net\nbingquan.com\nbingshandashu.com\nbingsin.com\nbingtuannet.com\nbinguo.me\nbingxs.com\nbingyan.net\nbingyandianqi.com\nbingyongjin.vip\nbingyuanhb.com\nbingzunkeji.com\nbinhaiinv.com\nbinhaiwater.com\nbinhangtech.com\nbinjie.fun\nbinjie.site\nbinligzj.com\nbinliwatch.com\nbinmt.cc\nbinmtplus.com\nbinnong.com\nbinpang.me\nbinqsoft.com\nbinstream.live\nbinuoniu.com\nbinxin.com\nbinzc.com\nbinzhi.com\nbinzhikeji.com\nbinzhouw.com\nbinzz.com\nbio-dxzf.com\nbio-equip.com\nbio-fount.com\nbio-fuyang.com\nbio-info-trainee.com\nbio-island.com\nbio-protocol.org\nbio-review.com\nbio1000.com\nbio360.net\nbio4p.com\nbiobiopha.com\nbiobw.org\nbiocause.com\nbiocellcharger.com\nbioceltech.com\nbiochemsafebuy.com\nbiocloud.net\nbiocome.com\nbiocompounds.com\nbiodiscover.com\nbiodiscover.net\nbiodx.com\nbioeast.com\nbiogeeker.com\nbiogo.net\nbiogot.com\nbioguoke.com\nbiohf.com\nbiohong.com\nbiohuaxing.com\nbiohyalux.com\nbiohymn.com\nbioinfo-scrounger.com\nbiokangtai.com\nbiokerun.com\nbioktech.com\nbiolab.xyz\nbioligo.com\nbiolihe.com\nbiome-expo.com\nbiomedicchina.com\nbiominhai.com\nbionav.cc\nbionovapharma.com\nbioon.com\nbioon.net\nbiopotentia.com\nbiorule.com\nbioscenepharma.com\nbiosci-cq.com\nbioscienceres.com\nbioshineking.com\nbiosmelt.com\nbiosrepair.com\nbiosschina.com\nbiostar-pharm.com\nbiostatistic.net\nbiosune.com\nbiotanon.com\nbiotecan.com\nbiotech-meds.com\nbiotechina.com\nbiotechwell.com\nbiothink.tech\nbioustar.com\nbiovector.net\nbiovip.com\nbioway-pku.com\nbioxtime.com\nbipaihang.com\nbipvcn.com\nbiqg8.com\nbiqige.cc\nbiqiuge.com\nbiqu.ge\nbiqu6.com\nbiquan8.com\nbiqubao.com\nbiqubao10.com\nbiqubu.com\nbiqudu.com\nbiqudu.tv\nbiqufu.com\nbiqugao.cc\nbiquge.info\nbiquge.la\nbiquge123.com\nbiquge8.com\nbiquge9.cc\nbiquge99.cc\nbiqugeg.com\nbiqugena.com\nbiquges.com\nbiqugesk.org\nbiqugex.com\nbiqugexs.com\nbiqugexs.la\nbiqugexsapp.com\nbiqugexsw.com\nbiqugezw.us\nbiqugg.org\nbiqugo.net\nbiqugu.cc\nbiqukai.com\nbiqukan.com\nbiquke.com\nbiquke.la\nbiquke.me\nbiquku.la\nbiqukun.com\nbiqukun.la\nbiquluo.com\nbiqupai.com\nbiqusa.com\nbiqushu.com\nbiqusk.com\nbiqusoso.com\nbiquw.com\nbiquw.info\nbiquw.la\nbiquwo.com\nbiquwo.net\nbiquwx.la\nbiquxs.com\nbiquyue.com\nbiquzw.info\nbiqwo.com\nbiransign.com\nbird.art\nbird4d.com\nbirdback.org\nbirdol.com\nbirdotech.com\nbirdwork.com\nbirentech.com\nbisairi.com\nbisco777.bet\nbisenaccess.com\nbisenet.com\nbisenpark.com\nbisgz.com\nbishen.ink\nbishengoffice.com\nbishengyuan.com\nbisheziliao.com\nbishijie.com\nbishuiwan.com\nbisjigang.com\nbison-technologies.com\nbisonglighting.com\nbisonscm.com\nbisp.com\nbistream.net\nbit-coin-cash.asia\nbitahub.com\nbitauto.com\nbitautoimg.com\nbitautotech.com\nbitbe.at\nbitbrowser.net\nbitcar.com\nbitcron.com\nbitdave.fun\nbitdefender-cn.com\nbiteabc.com\nbitech-automotive-wuhu.com\nbitecoin.com\nbiteedu.com\nbitekou.com\nbitell.com\nbitenn.com\nbitett.com\nbitgo.cc\nbitgo.net\nbitguai.com\nbithosts.net\nbitiful.com\nbitiful.net\nbitintelligence.net\nbitjd.com\nbitjia.com\nbitky.cc\nbitlib.cc\nbitmain.vip\nbitmingw.com\nbitmoe.com\nbitol.net\nbitongtech.com\nbitonloop.com\nbitosscdn.com\nbitqiu.com\nbitscn.com\nbitsde.com\nbitse.com\nbitvh.com\nbitzsoft.com\nbiubiu.tv\nbiubiu001.com\nbiuged.com\nbiulie.com\nbiusoft.com\nbiwangxiao.com\nbiwuke.com\nbixiaxs.net\nbixishang.com\nbixu.cc\nbixu.me\nbixuecrm.com\nbixueke.com\nbiya.ltd\nbiyabi.com\nbiyan8.com\nbiyangwang.com\nbiyao.com\nbiye.net\nbiyehome.net\nbiyele.com\nbiyelunwenjiance.com\nbiyequna.com\nbiyequnar.com\nbiyezheng8.com\nbiyi.net\nbiyidc.com\nbiyingniao.com\nbiyinjishi.com\nbiyong007.com\nbiyork.com\nbiyou.tech\nbiyouxue.com\nbiyuandi.com\nbiyuansh.com\nbiyuanshuiwu.com\nbiyuwu.cc\nbiyuzg.com\nbiz-abroad.com\nbiz-east.com\nbiz-email.net\nbiz178.com\nbiz72.com\nbizatmobile.com\nbizcent.com\nbizchallenge.net\nbizcharts.net\nbizcn-test.com\nbizcn.com\nbizcn.net\nbizcn666.com\nbizconfstreaming.com\nbizhi360.com\nbizhi88.com\nbizhigq.com\nbizhimiao.com\nbizhiquan.com\nbizhiwang.com\nbizhixia.com\nbizhizj.com\nbizhizu.com\nbizhongchou.com\nbizmoto.com\nbiznewscn.com\nbizopsmall.com\nbizpai.com\nbizsmooth.com\nbizsmooth.org\nbizsn.com\nbizsofts.com\nbizvane.com\nbj-big.com\nbj-brother.com\nbj-brsf.com\nbj-bts.com\nbj-byjz.com\nbj-cronda.com\nbj-dahon.com\nbj-dsmzyy.com\nbj-fm.com\nbj-fxh.com\nbj-git.com\nbj-hengdeli.com\nbj-ipcf.org\nbj-jzgg.com\nbj-klws.com\nbj-kpn.com\nbj-nego.com\nbj-pr.com\nbj-px.com\nbj-sea.com\nbj-syc.com\nbj-sydc.com\nbj-tencentclb.cloud\nbj-tencentclb.com\nbj-tencentclb.net\nbj-tencentclb.work\nbj-tvart.com\nbj-tygy.com\nbj-win.com\nbj-wjh.com\nbj-yt.com\nbj-zkhb.com\nbj003.com\nbj0yx.com\nbj1.api.bing.com\nbj1000e.com\nbj148.org\nbj159zx.com\nbj1777.com\nbj17z.com\nbj2scmm.com\nbj315.org\nbj35.com\nbj360.com\nbj42195.com\nbj51.org\nbj520.com\nbj597.com\nbj5i5j.com\nbj7z.com\nbj80.com\nbj918.com\nbj96007.com\nbjadks.com\nbjadmix.com\nbjadn.net\nbjagro.com\nbjaja.com\nbjango.com\nbjanjili.com\nbjartmuseum.com\nbjatv.com\nbjbaidianfeng.com\nbjbalb.com\nbjbaodao.net\nbjbb.com\nbjbeichen.com\nbjbeifangjx.com\nbjbfdt.com\nbjbkwy.com\nbjblackhole.com\nbjbna.com\nbjbpi.com\nbjbrew.com\nbjbtfu.com\nbjbus.com\nbjbywx.com\nbjbzc.com\nbjbzszxy.com\nbjc-ent.com\nbjcae.com\nbjcag.com\nbjcancer.org\nbjcankao.com\nbjcapital.com\nbjcatzgroup.com\nbjcdc.org\nbjcdomain.com\nbjceis.com\nbjcgtrain.com\nbjchengjiu.com\nbjchishengkeji.com\nbjchunxin.com\nbjcjl.net\nbjcjyt.com\nbjckkj.com\nbjclover.com\nbjcls.net\nbjcma.com\nbjcoco.com\nbjcomic.net\nbjcomm.com\nbjcomparison.com\nbjconrad.com\nbjcontinent.com\nbjcorona.com\nbjcpjzhyxh.com\nbjcrg.com\nbjcsfx.com\nbjcshy.com\nbjcsyg.com\nbjcta.net\nbjcxdf.com\nbjcxqd.com\nbjcycg.com\nbjcyjt.com\nbjcymt.com\nbjcymyy.com\nbjcyzg.com\nbjd-mc.com\nbjdcfy.com\nbjdclib.com\nbjddtm.com\nbjdf110.com\nbjdfrw.com\nbjdfxj.com\nbjdhwy.com\nbjdiaoyu.com\nbjdjc.com\nbjdllti.com\nbjdongxin.com\nbjdp2p.com\nbjdragon.com\nbjdsppa.com\nbjdth.com\nbjdw.org\nbjdwl.net\nbjdxfsxx.com\nbjdxzxy.com\nbjdyhsy.com\nbjdyyc.com\nbjeasycom.com\nbjebc.com\nbjeesa.org\nbjef.com\nbjei.com\nbjent.org\nbjepea.com\nbjesg.com\nbjesound.com\nbjewaytek.com\nbjexmail.com\nbjexx.com\nbjfc.cc\nbjflc.com\nbjfmart.com\nbjfpw.com\nbjfqy.com\nbjfriendshiphotel.com\nbjfsali.com\nbjftfy.com\nbjfzst.com\nbjgas.com\nbjgasgh.com\nbjgastx.com\nbjgcl.com\nbjgdkn.com\nbjgdzx.com\nbjgfa.com\nbjggk.com\nbjggxh.com\nbjgjjcapital.com\nbjgjjmxy.com\nbjgjtjk.com\nbjgk.com\nbjglxf.com\nbjglxt.com\nbjgongteng.com\nbjgongyu.com\nbjgoodwill.com\nbjgree.net\nbjgujibaohu.com\nbjgumu.com\nbjguodu.com\nbjgxs.com\nbjgymq.com\nbjgyzjw.com\nbjgyzs.com\nbjgzc.com\nbjhaiguang.com\nbjhaijixing.com\nbjhanlin.com\nbjhdcp.com\nbjhdhm.com\nbjhdnet.com\nbjhdrx.com\nbjhee.com\nbjhengchi.com\nbjhengjia.net\nbjhenson.com\nbjherbest.com\nbjhgbjgs.com\nbjhlgw.com\nbjhmcm.com\nbjhmyq.com\nbjhouse.com\nbjhrha.com\nbjhsyk.com\nbjhsyuntai.com\nbjhszp.com\nbjhtlckj.com\nbjhtzsgs.com\nbjhuaxin.com\nbjhuiqi.net\nbjhuizhu.com\nbjhwbr.com\nbjhwtx.com\nbjhwxy.com\nbjhx110.com\nbjhxqh.com\nbjhxzlyy.com\nbjhytjxjg.com\nbjhzkq.com\nbjhzzs.com\nbjiab.com\nbjiae.net\nbjiaep.com\nbjicpark.com\nbjicrm.com\nbjidc.net\nbjidit.com\nbjinfobank.com\nbjipwqzx.com\nbjitic.com\nbjiwex.com\nbjjbbayy.com\nbjjbls.com\nbjjchf.com\nbjjdwx.com\nbjjfsd.com\nbjjgyy.com\nbjjhhft.com\nbjjhhn.com\nbjjhsw.com\nbjjihui.com\nbjjingdong.com\nbjjinl.com\nbjjinming.com\nbjjinsong.com\nbjjiuhe.com\nbjjizhun.com\nbjjjst.com\nbjjk66.com\nbjjkglxh.org\nbjjkw.net\nbjjmzh.com\nbjjnrl.com\nbjjnzf.com\nbjjqe.com\nbjjqzyy.com\nbjjr-tencentclb.cloud\nbjjr-tencentclb.com\nbjjr-tencentclb.net\nbjjr-tencentclb.work\nbjjsj.com\nbjjsschool.net\nbjjstyyzzyy.com\nbjjsyy.com\nbjjszyyy.com\nbjjtat.com\nbjjubao.org\nbjjuli.com\nbjjzjt.com\nbjjzjxhyxh.com\nbjjzsc.com\nbjjzzpt.com\nbjk30.com\nbjkaihua.com\nbjkaihua.net\nbjkcsj.com\nbjkdhy.com\nbjkdvm.com\nbjkeyscin.com\nbjkgedu.com\nbjknrt.com\nbjkqj.com\nbjkqyx.com\nbjkrtwl.com\nbjkswy.com\nbjktaz.com\nbjktwe.com\nbjkxgroup.com\nbjl777.com\nbjlacc.com\nbjlangbo.com\nbjlanqiao.com\nbjlaw995.com\nbjlcs-tech.com\nbjlevsoft.com\nbjlg.com\nbjljzw888.com\nbjlkhd.net\nbjllsy.com\nbjlmg.com\nbjlongview.com\nbjlot.com\nbjltsj.com\nbjltwp.com\nbjltxk.com\nbjlyjszx.com\nbjlysy001.com\nbjlyw.com\nbjmailqq.com\nbjmama.com\nbjmama.net\nbjmamiai.com\nbjmania.com\nbjmda.com\nbjmeikao.com\nbjmerson.com\nbjmjm.com\nbjmslp.com\nbjmti.com\nbjmts.net\nbjmxkn.com\nbjmxxh.com\nbjmxy.net\nbjmylike.com\nbjmzdx.org\nbjmzw.com\nbjn2ms.net\nbjnai.net\nbjnaxl.com\nbjnhsw.com\nbjnja.com\nbjnkzx.com\nbjnsr.com\nbjnxgbyy.com\nbjota.com\nbjp321.com\nbjpag.com\nbjpcyd.com\nbjpfh.com\nbjpifu.com\nbjpinweixuan.com\nbjpmhyxh.com\nbjpowernode.com\nbjppa.com\nbjpryk.com\nbjqcjdcj.com\nbjqh.org\nbjqhgjj.com\nbjqichezl.com\nbjqingyang.com\nbjqlg.com\nbjqtbase.com\nbjqtfifthbase.com\nbjqtforthbase.com\nbjqtsecbase.com\nbjqtthirdbase.com\nbjqtti.com\nbjqyjjlb.com\nbjqykc.com\nbjqzhd.com\nbjraee.com\nbjrc.com\nbjrcb.com\nbjrdhx.com\nbjretech.com\nbjreview.com\nbjrjgj.com\nbjrjtdkj.com\nbjrjyy.com\nbjrlzyw.com\nbjrock.com\nbjrqjt.com\nbjrtcdn.com\nbjrtjt.com\nbjrun.com\nbjrussia-art.com\nbjrwdx.com\nbjry.com\nbjsasc.com\nbjsava.com\nbjsbnet.com\nbjscfl.com\nbjscszh.com\nbjscyxh.com\nbjsdcm.net\nbjsdeyy.com\nbjsdfz.com\nbjsdgroup.com\nbjsdr.org\nbjsfdr.com\nbjsfrj.com\nbjsftzxyjhyy.com\nbjsgzgs.com\nbjshaet.com\nbjshdjy.com\nbjsheng.com\nbjshgzzxh.com\nbjshowinfilm.com\nbjsiasun.com\nbjsinglewindow.com\nbjsj5.com\nbjsjds.com\nbjsjgyy.com\nbjsjsch12333.com\nbjsjstxyy.com\nbjsjsyly.com\nbjsjwl.com\nbjskjzs.com\nbjsoho.com\nbjsound.com\nbjsoyo.com\nbjsptf.com\nbjspw.com\nbjsrc.com\nbjsrmyy.com\nbjsryc.com\nbjssjsyy.com\nbjsskdn.com\nbjstcc.com\nbjstjy.com\nbjsubway.cc\nbjsubway.com\nbjsuewin.com\nbjsxdgzc.com\nbjsxjt.com\nbjsxt.com\nbjsydq.com\nbjsyhy.org\nbjsyqw.com\nbjsytv.com\nbjsyzy.com\nbjszhd.net\nbjszlsjt.com\nbjtaihua.com\nbjtcf.com\nbjtcy.com\nbjtdhkj.com\nbjtelecom.net\nbjtieke.com\nbjtitle.com\nbjtjhn.com\nbjtjw.net\nbjtjzx.com\nbjtkyy.com\nbjtmjr.com\nbjtndao.org\nbjtobacco.com\nbjtonghui.com\nbjtongjian.com\nbjtopli.com\nbjtqcy.com\nbjtradestar.com\nbjtth.org\nbjttsf.com\nbjtvnews.com\nbjtxc.com\nbjtysj.com\nbjtyzh.org\nbjtzeduyun.com\nbjtzfy.com\nbjtzzg.com\nbju-flo.com\nbjucd.com\nbjun.tech\nbjunionstar.net\nbjuri.com\nbjvps.net\nbjvtc.com\nbjweizhifu.com\nbjwenchen.com\nbjwenyu.com\nbjwftd.com\nbjwfz.com\nbjwhds.com\nbjwhmedia.com\nbjwig.com\nbjwkhotel.com\nbjwkzl.com\nbjwpjs.com\nbjwqxh.com\nbjwt.com\nbjwwhc.com\nbjwyseo.com\nbjxa.com\nbjxchjxx.com\nbjxcloud.com\nbjxcsy.net\nbjxdfk.com\nbjxf315.com\nbjxhly.com\nbjximei.com\nbjxingma.com\nbjxingzheng.com\nbjxinku.com\nbjxinyou.com\nbjxjyy666.com\nbjxjzyy.com\nbjxku.com\nbjxtjmsb.com\nbjxtkj.com\nbjxueche.net\nbjxwcq.com\nbjxwx.com\nbjxx.vip\nbjxx8.com\nbjxxw.com\nbjxyjf.com\nbjxyjy.com\nbjxzlou.com\nbjxzxw.com\nbjyah.com\nbjyald.com\nbjyc.online\nbjycwa.com\nbjycxh.com\nbjyczb.com\nbjydzy.com\nbjyestar.com\nbjyhjt.net\nbjyhwy.com\nbjyingge.com\nbjyingyun.com\nbjyirui.com\nbjyizhimei.com\nbjylhyxh.com\nbjyme.com\nbjyn.com\nbjyouth.net\nbjypw.com\nbjyqsj.com\nbjysxh.com\nbjysyunsheng.com\nbjyszb.com\nbjythd.com\nbjyuantong.com\nbjyubing.com\nbjyueshenzj.com\nbjyujinxiang.com\nbjywt.com\nbjyxl.com\nbjyyb.net\nbjyyun.com\nbjyzfjj.com\nbjzalaw.com\nbjzaxy.com\nbjzbb.com\nbjzbkj.com\nbjzcha.com\nbjzcth.com\nbjzg.com\nbjzgh.org\nbjzgh12351.org\nbjzghd.com\nbjzhaxikj.net\nbjzhiborui.com\nbjzhishi.com\nbjzhongyi.com\nbjzhsx.com\nbjzkgc.com\nbjzkgr.com\nbjzkhs.com\nbjzklk.com\nbjzklp.com\nbjzmdlsxs.com\nbjzmkm.com\nbjzmqj.com\nbjznkq.net\nbjznnt.com\nbjzph.com\nbjzqw.com\nbjzrzc.com\nbjzs.cc\nbjzs114.com\nbjzsxccm.com\nbjzunlaotang.com\nbjzwbc.com\nbjzwhz.com\nbjzwx.com\nbjzwzx.com\nbjzxcp.com\nbjzxsf.net\nbjzxyy.com\nbjzy360.com\nbjzybaoan.com\nbjzybc.com\nbjzyjt.com\nbjzyrxgs.com\nbjzysx.com\nbjzzcb.com\nbjzzdb.com\nbjzzrx.com\nbjzzschool.com\nbk-cdn.com\nbk-cdn01.com\nbk3r.com\nbk41.net\nbk5u.com\nbkaivl2daed.com\nbkapigw.com\nbkapps.com\nbkbgame.com\nbkbyxa.com\nbkcipbewruo.com\nbkcloud.cc\nbkclouds.cc\nbkcode.net\nbkdou.com\nbkeconomy.com\nbkiije.com\nbkill.com\nbkill.net\nbkjia.com\nbkjk-inc.com\nbkjk.com\nbkjk123.com\nbkjpress.com\nbkjsemi.com\nbkkchina.com\nbkn.cc\nbkneng.com\nbknzdh.com\nbkpcn.com\nbkqq.com\nbkrgame.com\nbkscc.com\nbktencent.com\nbktsj.com\nbkuax.com\nbkweek.com\nbkzzy.com\nbl.com\nbl0757.com\nbl91.com\nblack-unique.com\nblackberry.com\nblackbirdsport.com\nblackdir.com\nblackdragon.com\nblackeep.com\nblackh4t.org\nblackint3.com\nblackluxury.com\nblackshark.com\nblackswancake.com\nblackxl.org\nblazefire.com\nblazefire.net\nblazingnight.cfd\nblazor.zone\nblbilibili.com\nblbl.online\nblbx.com\nblctsy.com\nbld365.com\nbldaea.store\nbldimg.com\nbldlive.com\nbldpharm.com\nbldybbb.com\nbldz.com\nbldzlsb.com\nbleege.com\nblemall.com\nblendercn.org\nblessedbin.com\nblestech.com\nblgl8.com\nblgxhn.com\nblhdazhe.com\nbliao.com\nblibao.com\nblibee.com\nblibee.net\nblicube.com\nblimage.com\nbliner.me\nbling.link\nblingabc.com\nblinghour.com\nblingoffice.com\nblissmall.net\nblizzardcn.com\nblju.com\nblksails.net\nbllsbz.com\nblm.net\nblmpb.com\nblockchain.hk\nblockchain123.com\nblockchainlabs.org\nblockmeta.com\nblockob.com\nblocrepresents.com\nblog.htc.com\nblog.htcvive.com\nblog.vive.com\nblog120.com\nblogcdn-dns.net\nblogchina.com\nblogchina.org\nblogchinese.com\nblogcn.co\nblogfeng.com\nbloggern.com\nbloghub.fun\nblogjava.net\nblogofmusic.com\nblogou.com\nblogqun.com\nblogturn.com\nblogways.net\nblogwe.com\nblogxuan.com\nbloom-powder.com\nbloomage.com\nbloomagebiotech.com\nbloomchiic.com\nbloomgamer.com\nbloomtoursvip.com\nbloqp.com\nblossomwed.com\nbloves.com\nblovestorm.com\nblowawards.com\nblowing-mould.com\nblowmoldmachines.com\nblpack.com\nblqugex.cc\nblqx.com\nblqy.com\nblr206.com\nblschain.com\nblshthb.com\nblskye.com\nblsw.cc\nblsweda.com\nblsx.com\nblszf.hk\nblszhifa.com\nblszyy.com\nbltyyls.com\nbltzw.com\nblue-city.com\nblue-skylandscape.com\nblue-zero.com\nblue0123.com\nbluearchive-cn.com\nbluebeebox.com\nbluebellalingerie.com\nbluebellls.com\nbluebirdme.com\nblueboxasia.com\nbluebridge-amc.com\nbluebullcn.com\nbluebungalow-au.com\nbluecardpay.com\nbluecardsoft.com\nbluecardsoft.net\nbluecatyun.com\nbluecefa.com\nbluecity.com\nblued.com\nbluedarti.com\nbluedgames.com\nbluedhealth.com\nbluedimg.com\nbluedon.com\nbluedoorindex.com\nbluedotcc.com\nbluefite.com\nbluefocus.com\nbluefocusgroup.com\nblueglass.vip\nbluegogo.com\nbluegoon.com\nbluehn.com\nblueidea.com\nbluek.org\nbluelettercn.org\nbluelightfuse.com\nbluelive.me\nbluenotechina.com\nblueocean-china.net\nblueplus.cc\nbluepoch.com\nbluesdream.com\nblueseaict.com\nbluesharkinfo.com\nblueshow.net\nblueskykong.com\nblueskyschool.net\nblueskystudy.com\nblueskyxn.com\nblueslc.tech\nbluesoleil.com\nbluestep.cc\nbluetime.com\nbluetowngroup.com\nbluetrum.com\nbluewhaleremote.com\nbluezz.net\nblurdev.com\nblw.moe\nblwire.com\nblxfc.com\nblxs.info\nblxs.la\nblycctv.com\nblyun.com\nblzddist1-a.akamaihd.net\nblzls.xyz\nblzpw.net\nblzsjx.com\nbm-inv.com\nbm-mc.com\nbm001.com\nbm0392.com\nbm12166.org\nbm369.net\nbm50ue2uwnj7.com\nbm8.tv\nbmbios.com\nbmbn100.com\nbmbqwater.com\nbmc-medical.com\nbmcedu.net\nbmcx.com\nbmdbr.com\nbmdxcx.com\nbme-assemble.com\nbme-clock.com\nbme-grow.com\nbme-introduce.com\nbme-invite.com\nbme-mp.com\nbme-wx.com\nbmeicn.com\nbmema.org\nbmeol.com\nbmfsm.com\nbmh1958.com\nbmimage.com\nbmj.com\nbmjet.com\nbmjzkj.com\nbml365.com\nbmlink.com\nbmlxkj.com\nbmm-assemble.com\nbmm-clock.com\nbmm-grow.com\nbmm-introduce.com\nbmm-invite.com\nbmm-mp.com\nbmm-wx.com\nbmmmd.com\nbmmsteel.com\nbmob.site\nbmobapp.com\nbmobcloud.com\nbmobpay.com\nbmolive.help\nbmoook.com\nbmosecuritylogin.com\nbmp.ovh\nbmpj.net\nbmrtech.com\nbmrtjt.com\nbms16.com\nbmser.com\nbmshow.com\nbmtrip.com\nbmw8033.com\nbmwallpaper.com\nbmwchina.cloud\nbmwnc.com\nbmxinfang.com\nbmyl2.com\nbmzxw.com\nbn21.com\nbnacg.com\nbnbba.com\nbnbcamp.com\nbnblogs.cc\nbnbtrip.com\nbnc66.com\nbnchina.com\nbncp.xyz\nbncwork.com\nbncyh.com\nbndsfc.com\nbnhelm.com\nbnhshiguan.com\nbnjyks.com\nbnk-jaoptions.com\nbnncn.com\nbnnd.net\nbnnnk.com\nbnocode.com\nbntyh.com\nbnup.com\nbnupg.com\nbnwin.com\nbnxf.online\nbnysq.com\nbnyy.com\nbnzone.com\nbo-blog.com\nbo0s.com\nbo56.com\nboadge.com\nboai.com\nboai120.com\nboaigx.com\nboaihospital.com\nboairl.com\nboaiswgs.com\nboanits.com\nboao.press\nboaoforum.org\nbob-cardif.com\nbob-leasing.com\nbob.com\nbobaow.com\nbobbns.com\nbobcare.com\nbobcfc.com\nbobcoder.cc\nbobdirectbank.com\nbobdog.com\nboblog.com\nbobmao.com\nbobo2008.com\nbobo91.com\nbobobird.com\nbobohome.store\nbobopic.com\nboboyq.com\nbobswatchstore.com\nbobtranslate.com\nboc-leasing.com\nbocai.life\nbocaicms.com\nbocaiwawa.com\nbocamchina.com\nbocaviation.com\nboccfc.cc\nboce.com\nboce003.com\nbocep2c.com\nbocetest.com\nbocfullertonbank.com\nbocgi.com\nbocgins.com\nbochaai.com\nbochengmed.com\nbochk.com\nbochkonline.com\nbochyun.com\nbocichina.com\nbocifco.com\nbocifunds.com\nbocigroup.com\nbociim.com\nbocim.com\nbocins.com\nbocohz.com\nbocomcc.com\nbocommleasing.com\nbocommlife.com\nbocommtrust.com\nbocondalian.com\nbocsolution.com\nbodaedu.net\nbodahu.com\nbodatek.net\nbode-e.com\nbodestone.com\nbodiantrading.com\nboditechgx.com\nbodoai.com\nbodocn.com\nbodu.com\nboduhappiness.com\nbodyguard007.com\nboe.com\nboendejc.com\nboerchina.com\nboerzg.com\nbof98.com\nbofangw.com\nbofyou.com\nbog.ac\nbogaochem.com\nbogokj.com\nboguanpaimai.com\nbogute.com\nboguub.com\nbohaiadx.com\nbohaigs.com\nbohaileasing.com\nbohailife.net\nbohaishibei.com\nbohaisports.com\nbohaiyun.com\nbohaoclub.com\nbohe.com\nbohejiasuqi.com\nbohewangluo.com\nbohu.co\nbohua.com\nbohuanchina.com\nbohuasanhe.com\nbohui-tech.com\nbohuigk.com\nbohuihe.com\nbohuitalent.com\nboilerinfo.net\nboill.com\nboilmc.com\nboincdn.live\nboiots.com\nbojianger.com\nbojiaojituan.com\nbojicdmo.com\nbojie.bid\nbojolight.com\nbojoy.net\nbojun-import.com\nboka.vc\nbokaishi.com\nbokao2o.com\nboke.com\nboke.one\nboke.pw\nboke112.com\nboke8.net\nbokecc.com\nbokecs.net\nbokee.com\nbokee.net\nbokesoft.com\nbokesoftware.com\nbokexia.com\nbokeyz.com\nboktour.com\nbokunwatch.com\nbolaa.com\nbolan.net\nbolaninfo.com\nbolanjr.com\nboldfrontierdesign.com\nboldseas.com\nbole-china.com\nbole.com\nbole.name\nbole766.com\nbolead.com\nboledir.com\nbolegs.com\nbolehu.net\nbolei99.com\nboleihg.com\nbolejiang.com\nbolejiaoxue.com\nbolelink.com\nbolexiaozhao.com\nbolin1688.com\nbolink.club\nbolken.com\nbolo.me\nbolo.video\nbolongxm.com\nbolq.com\nboltp.com\nboluogouwu.com\nboluomee.com\nboluomeet.com\nboluomi01.com\nboluoyun.com\nboluoyunyu.com\nboluozaixian.com\nbom.ai\nbom2buy.com\nbomanair.com\nbomeeting.net\nbomin-china.com\nbominelec.com\nboming-sc.com\nbomman.com\nbomyg.com\nbon-top.com\nbon-wine.com\nbonan.vip\nbonbonbongame.com\nbond120.com\nbond520.com\nbondent.com\nbondlady.com\nboneboat.com\nbonepuppy.com\nbonestgattiwatch.com\nbongm.com\nbongmi.com\nbongv.com\nbongwell.com\nboningad.xyz\nbonjour.bio\nbonkee.net\nbonkgb.com\nbonree.com\nboobooke.com\nboodo.com\nbooea.com\nbooen.co\nbooeoo.com\nboohee.com\nbook118.com\nbook1993.com\nbookabc.net\nbookapka.com\nbookask.com\nbookdao.com\nbookdown.net\nbookedu.com\nbookersea.com\nbookfedex.com\nbookfeel.com\nbooking001.com\nbookingtee.com\nbookinlife.net\nbooknest.net\nbookof.com\nbookqi.com\nbooks51.com\nbookschina.com\nbooksgoo.com\nbookshadow.com\nbookshi.com\nbookshoptw.com\nbookshuku.com\nbooksky.cc\nbookskys.com\nbooksn.com\nbooksos.net\nbooktxt.com\nbooktxt.net\nbookuu.com\nbookxnote.com\nboolan.com\nboolaw.com\nboole-tech.com\nboolv.com\nboomallha.com\nboonew.com\nboonoo.net\nboooba.com\nboooming.com\nboooog.net\nbooop.net\nboopwater.com\nboosj.com\nboost77.com\nboostsolar.com\nboosyi.com\nbootmb.com\nbootstrapmb.com\nboox.com\nbooyu-import.com\nbooz88.com\nbopai.com\nbopaisemi.com\nbopinquwei.online\nbopuyun.com\nboqianpvm.com\nboqii.com\nboqiicdn.com\nboqugew.com\nboracaybestdeals.com\nborain.com\nborcci.com\nborderlessbd.com\nborenhospital.com\nborlonclan.com\nborn-tw.com\nborn123.com\nborninsummer.com\nboroyf.com\nborpor.com\nborscon.com\nborui-group.com\nborui1001.com\nboruipinggu.com\nboruiqin.com\nboruisx.com\nboruixun.com\nboruiyanjiu.com\nborun-sun.com\nboruntong.com\nboryou.com\nbos.xin\nboscuser.com\nbosdsoft.com\nboseclub.com\nboseip.com\nbosen-fuji.com\nbosenrui.com\nbosera.com\nbosera.com.hk\nboshgame.com\nboshi.tv\nboshihoujob.com\nboshijob.com\nboshika.com\nboshixitong.com\nboshungame.com\nbosi12315.com\nbosibest.com\nbosidata.com\nbosideng.com\nbosideng.me\nbosideng.net\nbosigame.com\nbosikj.com\nboslon.com\nbosmaa.com\nbosmarter.com\nbosmia.com\nbosomchina.com\nbosondata.net\nbosong.online\nbosonnlp.com\nbosonshop.com\nboss-young.com\nbosscdn.com\nbossco.cc\nbosscome.com\nbossgoo.com\nbossgy.com\nbosshr.com\nbossincom.com\nbosszhipin.com\nbostonis.org\nbosunman.com\nbotaogroup.com\nbotaoo.com\nbotaopac.com\nbote777.org\nbotemotor.com\nbotnet.cc\nbotny.com\nbotocard.com\nboton-tech.com\nbotongr.com\nbotorange.com\nbotsfy.com\nbotslab.com\nbottlekj.com\nbouffalolab.com\nbountech.com\nbountyteam.com\nboway.com\nboweifeng.com\nbowerp.com\nbowok.com\nbowu66.com\nbowuzhi.fm\nbox-anchor.com\nbox-z.com\nbox3.fun\nboxdouyin.com\nboxgu.com\nboxiaole.com\nboxilink.com\nboxim.online\nboxisign.com\nboxmoe.com\nboxuegu.com\nboxueio.com\nboxui.com\nboxunyt.com\nboxz.com\nboy-toy.net\nboya300.com\nboyaa.com\nboyaapoker.com\nboyaastar.com\nboyaceo.com\nboyais.com\nboyamedia.com\nboyamicro.com\nboyaobang.com\nboyasoftware.com\nboyaxun.com\nboydwang.com\nboyi.co\nboyikang.com\nboyingsj.com\nboyinhotel.com\nboyishu.me\nboylondonchina.com\nboyoucy.com\nboyouquan.com\nboysky.com\nboyuan-pharma.com\nboyuan.com\nboyuan.net\nboyuanchemical.com\nboyuanjiaxin.com\nboyue.com\nboyuecasting.com\nboyueedu.com\nboyuemobile.com\nboyuesh.com\nboyunso.com\nboyuntu.com\nboyuonline.com\nbozhong.com\nbozifs.com\nbp1w.com\nbpaykwai.com\nbpec.com\nbpgjuice.net\nbpimg.com\nbpmlt.com\nbpmuseum.com\nbppan.com\nbpqwxsh.com\nbpsemi.com\nbpteach.com\nbpxxfw.com\nbpxxvo.com\nbq04.com\nbqb.xyz\nbqbh.org\nbqfy.com\nbqg8.cc\nbqg8.la\nbqgjt.work\nbqgwap.com\nbqgxsw.com\nbqjeep212.com\nbqlcev.com\nbqpoint.com\nbqq8.com\nbqqpx.com\nbqrdh.com\nbqsnn.com\nbqtalk.com\nbqteng.com\nbqu123.com\nbqyhb.com\nbr-cn.com\nbr737.com\nbra-cdche.com\nbrabus-china.com\nbragood.com\nbrain1981.com\nbrainmed.com\nbrainqaf.com\nbrand-isv.com\nbrand24k.com\nbrand4x4.com\nbrandcn.com\nbrandpano.com\nbrandsitejp.com\nbrandvista.com\nbrasaude.com\nbrasilcn.com\nbraveybelief.com\nbravognss.com\nbrazzaleqingdao.com\nbrcpower.com\nbre-line56.com\nbre-linex.com\nbreadtrip.com\nbreathfilm.com\nbreenomeet.cc\nbreeze-chem.com\nbrentron.com\nbrewbeerwiki.org\nbrewersmix.com\nbrgame.app\nbrgame.vip\nbrick4.com\nbrickmachinery.net\nbricksball.com\nbricktou.com\nbricsgo.com\nbridge-image.com\nbridgee.net\nbridgelawfirm.com\nbrighost.com\nbright-gene.com\nbright-trend.com\nbright21cn.com\nbrightdairy.com\nbrightdecolighting.com\nbrightfood.com\nbrightliao.com\nbrightmeat.com\nbrilliance-auto.com\nbrilliant-optoelectronics.com\nbringbuys.com\nbringspring.com\nbrire.com\nbritesemi.com\nbrlinked.com\nbrlmed.com\nbrmnq.com\nbrmyx.com\nbroad-ocean.com\nbroad.com\nbroad.org\nbroadair.net\nbroadbio.com\nbroadcasthe.net\nbroadcom-wuxi.com\nbroadcredit.org\nbroadex-tech.com\nbroadon.net\nbroadskytech.com\nbroadview-auto.com\nbrochef.com\nbronzesoft.com\nbroqiang.com\nbrosmed.com\nbrother-bsh.com\nbrother-cn.net\nbrother-movie.com\nbrotherchem.com\nbrowserleaks.com\nbrowurl.com\nbrpcb.com\nbrsiee.com\nbrsnzp.com\nbrtbeacon.com\nbrtbeacon.net\nbrtn.org\nbrtpawn.com\nbrttc.com\nbrtvcloud.com\nbrunoxu.com\nbrxjzp.com\nbrxtal.com\nbryzq.com\nbs-56.com\nbs-dolfin.net\nbs-lab.com\nbs-marathon.com\nbs-yc.com\nbs008.com\nbs2005.com\nbsagit.com\nbsbgjj.com\nbsbkjt.com\nbsbydd.com\nbscabank.com\nbsccdn.com\nbsccdn.net\nbscdns.com\nbscdnweb.com\nbscea.org\nbscedge.com\nbscgslb.com\nbsclink.com\nbscomc.com\nbscsjsn.com\nbscstorage.com\nbscstorage.net\nbsctg.com\nbscxypx.com\nbsd-lifescience.com\nbsd4fz.com\nbsdcdsy.com\nbsdexp.com\nbsdfyyls.com\nbsdongxin.com\nbsdt1688.com\nbsehk.com\nbseqp.com\nbserc.com\nbsgcnc.com\nbsgoal.com\nbsgsgl.com\nbsgslb.com\nbsgz.com\nbsh-safety.com\nbsh-tech.com\nbsh.com\nbshare.com\nbshark.com\nbshdmotor.com\nbshgem.com\nbshmzx.com\nbshsrl.com\nbshu.com\nbsida.com\nbsidu.com\nbsitcn.com\nbsjhlx.com\nbsjyjt.com\nbskrt.com\nbskuav.com\nbslongyin.com\nbsmatrix.com\nbsmjdjzx.com\nbsmy.cc\nbsnljt.com\nbsnniubi.com\nbspapp.com\nbsping.com\nbsquant.com\nbsrczpw.com\nbsrmyy.com\nbsrse.com\nbssfy.com\nbssgnkyy.com\nbst-lab.com\nbstatic.com\nbstatics.com\nbstbattery.com\nbstchemical.com\nbsteel.net\nbstgjg777.com\nbstinfo.com\nbstj.com\nbstjiaoyu.com\nbstjt.com\nbstzcs.com\nbsurl.cc\nbswtan.com\nbswxw.com\nbsxhly.com\nbsxiaoshuo.com\nbsxldl.com\nbsxyzsdec.com\nbsybx.com\nbsydns.com\nbsydns.net\nbsyjrb.com\nbsyjt.com\nbsyxx.com\nbsyyjt.com\nbsz666.com\nbszhly.com\nbszip.me\nbszxtl.com\nbszyqc.com\nbt-club.com\nbt6.club\nbt66.tv\nbtaxwy.com\nbtb8.com\nbtbat.com\nbtbctex.com\nbtc-precisionmedical.com\nbtc114.com\nbtc38.com\nbtc789.com\nbtcbbs.com\nbtcbca.com\nbtcbtc.tech\nbtcc886.com\nbtccjt.com\nbtcfans.com\nbtcha.com\nbtclass.net\nbtcqingbao.com\nbtcside.com\nbtcwatch.com\nbtcxue.com\nbtd56.com\nbtdad.live\nbtdad17.xyz\nbtdair.com\nbtdog.com\nbtdos.com\nbtdy.com\nbtechina.com\nbtei6pis99.com\nbtgame.com\nbtgcjs.com\nbtgdt.com\nbtgljt.com\nbtgtravel.com\nbth.vip\nbthhotels.com\nbthlt.com\nbthome.com\nbthuifu.com\nbthxjd.com\nbthyhb.com\nbtiii.com\nbtime.com\nbtjhcc.com\nbtjtfz.com\nbtjy.net\nbtjzgc.com\nbtl-cn.com\nbtltl.com\nbtmayi.cc\nbtmeiju.com\nbtnotes.com\nbtophr.com\nbtorange.com\nbtosolar.com\nbtp-pharm.com\nbtpig.com\nbtplay.net\nbtpxbf.com\nbtropdi.xyz\nbtsemi.com\nbtshidai.com\nbtspreads.com\nbtsteel.com\nbtten.com\nbttiantang.cc\nbttiantang.com\nbtttg.com\nbttzy.com\nbtv.org\nbtvcd.net\nbtvcloud.com\nbtwater.com\nbtwmw.net\nbtwoa.com\nbtwob.net\nbtxintong.com\nbtydjxc.com\nbtyhkj.com\nbtyijiaxueyuan.com\nbtytgj.com\nbtzbjt.com\nbtzgamepkg.com\nbtzhcc.com\nbtzthb.com\nbtzyc.com\nbuaaer.com\nbubaigei.com\nbubalusplus.com\nbubbb.com\nbubugao.com\nbubuko.com\nbubuol.com\nbubuying.net\nbubuyouqian.com\nbubuzheng.com\nbubuzou.com\nbucg.com\nbucg6.com\nbuchang.com\nbuchaq.com\nbuchina.net\nbucid.com\nbuckydrop.com\nbucuo100.com\nbucuoba.com\nbudao.com\nbudao24.com\nbudhano.com\nbudiankj.com\nbudikeji.com\nbuding.tv\nbudingmore.com\nbudingscan.com\nbudiot.com\nbudou.com\nbudui.com\nbueryx.com\nbufan.com\nbuff8.com\nbuffaloex.com\nbuffst.com\nbufpay.com\nbughz.com\nbugjump.net\nbugku.com\nbugnull.com\nbugscan.net\nbugscaner.com\nbugu120.com\nbugua.com\nbuguangdeng.com\nbugukj.com\nbugutime.com\nbugxia.com\nbuhuyo.com\nbuickcare.net\nbuidea.com\nbuild-decor.com\nbuild.microsoft.com\nbuild8.com\nbuild9s.io\nbuilddecor.org\nbuildface.com\nbuildhr.com\nbuilding9s.io\nbuildjob.net\nbuildnewapp.com\nbuildwaterexpo.com\nbuixz.cfd\nbuka365.com\nbuke999.com\nbukesiyi8.com\nbukeyi.net\nbulaisi.com\nbulaoge.net\nbulapingc.com\nbulbsquare.com\nbulejie.com\nbullcome.com\nbullmachinery.com\nbullvet.net\nbuluanmai.com\nbululusexdoll.com\nbumenkeji.com\nbumiu.com\nbundor.com\nbundpic.com\nbundsummit.org\nbungba.com\nbunze.com\nburead.com\nburgud.com\nburnelltek.com\nburningvocabulary.com\nburongyi.com\nbus365.com\nbus6e.com\nbus84.com\nbusbaoche.com\nbushangban.com\nbushi123.com\nbusilinq.com\nbusinessconnectchina.com\nbusinesssaga.com\nbusinessweekchina.com\nbusionline.com\nbusituzi.com\nbusnc.com\nbustoprint.com\nbustruckexpo.com\nbut7.com\nbutair.com\nbutao.com\nbutel.com\nbutian.net\nbutiao.com\nbutjx.com\nbutongshe.com\nbutterapis.com\nbutton-nt.com\nbuxia.net\nbuxian8.com\nbuxiuga.com\nbuy-bar.com\nbuy-copi888.com\nbuy-copys888.com\nbuy0596.com\nbuyanshufa.com\nbuyaocha.com\nbuycoor.com\nbuydeem.com\nbuydouke.com\nbuyfine.net\nbuyhot.vip\nbuyi9.com\nbuyiju.com\nbuyjingxi.com\nbuyjk.com\nbuylabel.com\nbuyoudao.com\nbuysun.net\nbuysweet.com\nbuyu1314.com\nbuyueyuyun.com\nbuyun.co\nbuzao.net\nbuzhi.com\nbuzhibushi.com\nbva68.com\nbvfcdn.com\nbvfcdn2.com\nbvgv.com\nbvmc.cc\nbvseo.com\nbw1006.com\nbw30yun.com\nbw40.net\nbw8848.com\nbwae.org\nbwangel.me\nbwave.cc\nbwbeer.com\nbwbot.org\nbwchinese.com\nbwcj.com\nbwcjxt.com\nbwda.net\nbwell-tec.com\nbweyi.com\nbwfapiao.com\nbwfhmall.com\nbwgqwea.com\nbwgrt.com\nbwhero.com\nbwhgsb.com\nbwie.net\nbwjf.com\nbwlc.net\nbwmelon.com\nbwoer.com\nbwokai.com\nbwpx.com\nbwsm.org\nbwsoft.net\nbwtlab.com\nbwton.com\nbwxsj.com\nbwxxw.com\nbwzhcs.com\nbx0byte.com\nbx169.com\nbx1k.com\nbx24k.com\nbxbest.net\nbxcc.vip\nbxd365.com\nbxdaka.com\nbxdbf.com\nbxdlkj.com\nbxfish360.net\nbxgcb.com\nbxgdl.com\nbxgdunhua.com\nbxgkzy.com\nbxgmmw.com\nbxgshengwang.com\nbxgt.com\nbxgycfsb.com\nbxhaibao.com\nbxjob.net\nbxjyxx.net\nbxkejian.com\nbxktv.com\nbxldz.com\nbxltw.com\nbxmd51.com\nbxnfsy.com\nbxnjmj.com\nbxpedia.com\nbxr.im\nbxrfund.com\nbxshopya.com\nbxshscc.xyz\nbxwatch.com\nbxwljt.com\nbxwst.com\nbxwx.cc\nbxwx.io\nbxwx.tv\nbxxhtsw.com\nbxxy.com\nbxyuer.com\nbxzc123.com\nbxzczx.com\nbxzhiku.com\nbxzxw.com\nby-health.com\nby-leasing.com\nby56.com\nby6.app\nby6sx.com\nby899.com\nbyai.com\nbybieyang.com\nbybily.com\nbyboai.com\nbybon.com\nbybutter.com\nbyc168.com\nbyclean.net\nbyd.auto\nbyd.com\nbydauto.com\nbydglobal.com\nbydhaiyang.com\nbydit.com\nbydmax.com\nbydoceanauto.com\nbydpcic.com\nbydq.com\nbydsfy.com\nbydyhos.com\nbyefy.com\nbyf.com\nbyfen.com\nbyfen.net\nbyfunds.com\nbygamesdk.com\nbygpu.com\nbygqlsj.xyz\nbyguitar.com\nbygw.net\nbyhao.net\nbyhiv.com\nbyhlds.com\nbyhlds.net\nbyhua.com\nbyi.pw\nbyjd.com\nbykszb.com\nbylw.com\nbylwcc.com\nbylwjc.com\nbymygf.com\nbymz.net\nbynesyy.com\nbynezyy.com\nbynmc.com\nbynonco.com\nbynrnews.com\nbynsyh.com\nbyodonline.com\nbypanghu.xyz\nbypbn.com\nbypos.net\nbyqsc.net\nbyr-navi.com\nbyr.cc\nbyr.wiki\nbyread.com\nbyrhkj.com\nbys120.com\nbysb.net\nbyshf.com\nbyshjg.com\nbyshr.com\nbysocket.com\nbyspharm.com\nbystack.com\nbystatic.com\nbysxfz.com\nbyszc.com\nbytapp.com\nbytcm.com\nbyte-dns.com\nbyte-dns.net\nbyte-edge.com\nbyte-edgeworker.com\nbyte-gslb.com\nbyte-test.com\nbyte-test.net\nbyte-ticket.com\nbyte.online\nbyte00.com\nbyte00.net\nbyte000.com\nbyte008.com\nbyteac.com\nbyteacct.com\nbyteacctimg.com\nbyteactivity.com\nbyteactivity11.com\nbyteactivity12.com\nbyteadverts.com\nbyteapi.com\nbyteapk.com\nbytecdn.com\nbytecdn.net\nbytecdntp.com\nbytecho.net\nbytecimg.com\nbytecloud.com\nbyted-dast.com\nbyted-edu.com\nbyted-static.com\nbyted-ug.com\nbyted.org\nbytedance-boe.net\nbytedance.com\nbytedance.net\nbytedance.org\nbytedanceapi.com\nbytedancehermestest.com\nbytedanceoss.net\nbytedancevod.com\nbytedcdn.com\nbytedeliver.com\nbytedgames.com\nbytedns.com\nbytedns.net\nbytedns1.com\nbytedns2.com\nbytedns3.com\nbytedns4.com\nbytedns5.com\nbytedns6.com\nbytedns7.com\nbytednsdoc.com\nbytedsocial.com\nbyteedu.com\nbyteeffecttos.com\nbytefae.com\nbytefast.net\nbytefcdn.com\nbytefcdnrd.com\nbytegecko.com\nbytegeckoext.com\nbytegle.site\nbytegle.tech\nbytegoofy.com\nbytegrowth.com\nbytegslb.com\nbytehwm.com\nbyteics.com\nbyteics.net\nbyteimg.com\nbyteimgc.com\nbyteinspire.com\nbyteintl.net\nbyteisland.com\nbytelb.net\nbytelb000.net\nbytell.net\nbytemaimg.com\nbytemastatic.com\nbytemedi.com\nbytemelody.com\nbytenew.com\nbytenewst.com\nbyteoc.com\nbyteorg.com\nbyteorge.com\nbyteox.com\nbytepoker.fun\nbyteq8u.net\nbytescm.com\nbytesfield.com\nbytesim.com\nbytesmanager.com\nbytespeech.com\nbytesslb.net\nbytesus.com\nbytesyscdn.com\nbytetcc.com\nbytetech.info\nbytetos.com\nbytetraffic.net\nbytetstatic.com\nbytetstatic.net\nbyteug.com\nbytevalk.com\nbytevcloudvod.com\nbytevdn-boe.com\nbytevdn.com\nbytewars.cc\nbytewebservice.com\nbyteww.com\nbytexns.com\nbytexns.net\nbytexservice.com\nbytezhi.com\nbythealthy.com\nbythewayer.com\nbytianshankd.com\nbyts.com\nbytter.com\nbytzjt.com\nbyvast.com\nbyw.lol\nbyxrmyy.net\nbyxsnzg.com\nbyxtzn.com\nbyxue.com\nbyxx.com\nbyxy.com\nbyyapp.com\nbyyc.net\nbyydkj.net\nbyyfy.net\nbyytfy.com\nbyzhihuo.com\nbyzjbyq.com\nbyzkj.com\nbyzoro.com\nbyzp.com\nbyzsyy.com\nbyzt.net\nbyzxy.com\nbz-e.com\nbz01.com\nbz55.com\nbz889.com\nbzbgr.com\nbzbs.net\nbzbyzk.com\nbzchaxun.com\nbzcjw.com\nbzcm.net\nbzcm88.com\nbzcw8.com\nbzd6688.com\nbzddrive.com\nbzfar.com\nbzfpms.com\nbzfwq.com\nbzfwy.com\nbzfwzs.com\nbzfxb.com\nbzfxw.com\nbzgd.com\nbzglyfjq.com\nbzgwl.com\nbzhou.cc\nbzhslyj.com\nbzjsjt.com\nbzjulihg.com\nbzjw.com\nbzkad.com\nbzko.com\nbzlxzl.com\nbzmfxz.com\nbzmhm.com\nbzname.com\nbzonl.com\nbzqmz.com\nbzrb.net\nbzrqfd.com\nbzsanguo.com\nbzsanyuan.com\nbzsb.info\nbzsoso.com\nbzszxyy.com\nbzszyjx.com\nbzszyy.com\nbzszyy123.com\nbzt120.com\nbztdxxl.com\nbzvtc.com\nbzwater.com\nbzwz.com\nbzwzw.com\nbzxinwen.com\nbzxz.net\nbzxzk.net\nbzy.net\nbzy2015.com\nbzzpw.com\nbzzxq.com\nc-119.com\nc-3.moe\nc-abc.site\nc-ame.com\nc-banner.com\nc-c.com\nc-canyin.com\nc-china.com\nc-cpp.com\nc-ctrip.com\nc-discover.com\nc-estbon.com\nc-fehong.com\nc-fol.net\nc-jet.com\nc-lodop.com\nc-markaudio.com\nc-nin.com\nc-ps.net\nc-rst.com\nc-snd.com\nc-sz.com\nc-t.work\nc-thme.com\nc-vcc.com\nc-wms.com\nc-yl.com\nc.admob.com\nc.pki.goog\nc03b92b501009.beer\nc052kzyp55.com\nc098d113b11031.beer\nc0c0b511e1009.beer\nc0f1lk250w.com\nc114.net\nc122e63a111031.beer\nc133.com\nc1a0.com\nc1a2.com\nc1a3.com\nc1a8330703dc6f12.com\nc1ass.com\nc1channel.com\nc1el.com\nc1km1.com\nc1km4.com\nc1s.com\nc2427457b16e03ea.com\nc27619fb01019.beer\nc2ax1yu599.com\nc2h4.org\nc360dn.com\nc369a0f0611031.beer\nc3806.com\nc3810.com\nc39cb900df.run\nc3acg.com\nc3b9cd3fb10311.beer\nc3crm.com\nc3pool.org\nc3x.me\nc4006.com\nc4008.com\nc400c.cc\nc402f6df11021.beer\nc4190cb63e65819b.com\nc41b1d28472ea27c.com\nc437dfd45f96b488.com\nc43c3cb111011.beer\nc469f14b911012.beer\nc4752e8a51.vip\nc47cb27580c5de6b.com\nc49.com\nc495f3eb10d6cf13.com\nc4c6c49a6453534d.com\nc4d.com\nc4d.live\nc4datc.com\nc4dcn.com\nc4dco.com\nc4dpro.com\nc4dsky.com\nc4hcdn.com\nc4sy726by8.com\nc4ys.com\nc4yx.com\nc50forum.com\nc516b5c2510272.beer\nc53c4e56510281.beer\nc54sauo3y85m2g.com\nc558624c4b6f5f42.com\nc578801be1009.beer\nc57e6607c10292.beer\nc57fbfc585.skin\nc5a13eec21010.beer\nc5a7e584ed460dcd.com\nc5b27c7c01019.beer\nc5b3c3db298ea985.com\nc5b6bpoq7q.world\nc5bf2b35337761f4.com\nc5game.com\nc5iot.com\nc6133f7f98120d7f.com\nc631dlc0br.com\nc658e6a643fe3a95.com\nc659e27c366ae634.com\nc6a0cbdfa0be06e6.com\nc6bad2ad01020.beer\nc6c.com\nc6n708.ren\nc7.net\nc7032.com\nc705e5bdb71ae01d.com\nc7197.com\nc7200.com\nc7233.com\nc72a775z36.com\nc73567b858ce4908.com\nc7526.com\nc77200.com\nc77c.com\nc7878.com\nc7bc68c2811032.beer\nc7c1jx3ikk.bar\nc7c8.com\nc7fffvip16.com\nc7fffvip29.com\nc7g.com\nc7games.org\nc7vvv.com\nc7y.com\nc835249c31017.beer\nc837c4e951009.beer\nc8571e9ad7689b0a.com\nc88a8ae86f58a489.com\nc8a8b0af81014.beer\nc8f8537d91013.beer\nc8uixr96iv79.com\nc9018.com\nc919.sbs\nc944748d38bcc258.com\nc953b5d8b1013.beer\nc969.com\nc9b5b03e0ef62dc0.com\nc9c855b3da9b3b66.com\nc9d1d314b98f8fe3.com\nc9e8e19a411012.beer\nc9ec9c2f0c2de043.com\nc9o8nlanfm.work\nca-aicc.com\nca-sme.org\nca-smefs.com\nca-tencentclb.cloud\nca-tencentclb.com\nca-tencentclb.net\nca-tencentclb.work\nca001.com\nca002.com\nca003.com\nca0d7b2da10271.beer\nca163.net\nca168.com\nca2e9ea18bedfdf2.com\nca315.com\nca39.com\nca5d4ce601013.beer\nca800.com\nca91a5eb7ed4495e.com\nca9ce6rv872ce1.com\ncaa830d2710251.beer\ncaa86.org\ncaaa-spacechina.com\ncaaad.com\ncaacbook.com\ncaacchina.org\ncaacsri.com\ncaagei.com\ncaagov.com\ncaakee.com\ncaaladi.com\ncaanb.com\ncaapa.org\ncaasai.com\ncaasbuy.com\ncaasse.com\ncaayee.com\ncab346ef31016.beer\ncabbagebox.com\ncabbeen.com\ncabc-online.com\ncabee.org\ncabhr.com\ncabinetbuy.com\ncableabc.com\ncabletiegun.com\ncabling-system.com\ncabplink.com\ncabr-fire.com\ncac-citc.com\ncac2667b8c265fb8.com\ncacakp.com\ncacc-sf.org\ncacfo.com\ncacfo.net\ncache4ever.com\ncache666.com\ncachekit.com\ncachemoment.com\ncachiyeung.com\ncackui.com\ncacpp.com\ncacre.org\ncacs-summit.com\ncacsec.com\ncacter.com\ncactiapi.com\ncactifans.com\ncactmc.com\ncad1688.com\ncad2688.com\ncad5.com\ncad8.net\ncad888.com\ncada.cc\ncaddcc.com\ncadenzayueqi.com\ncadforex.com\ncadict.net\ncadmon.net\ncadreg.com\ncadrolift.com\ncadzhuan.com\ncadzj.com\ncadzxw.com\ncaecc.com\ncaeda-cxrh.com\ncaeef787f1694f47.com\ncaeerr.com\ncaeete.net\ncaefa.org\ncaein.com\ncaeri-te.com\ncaes.store\ncaexpo.com\ncaexpo.org\ncafachine.com\ncafagame.com\ncafamuseum.org\ncaffci.org\ncagentle.com\ncagetest.com\ncageystone.com\ncagoe.com\ncahkms.org\ncai-ba.com\ncai110.com\ncai58t.com\ncai88.com\ncaiacn.com\ncaiair.com\ncaian.net\ncaibangzi.com\ncaibaojian.com\ncaibaopay.com\ncaibaotao.com\ncaibeike.com\ncaibihui.com\ncaibowen.net\ncaicao.net\ncaidan2.com\ncaidao1.com\ncaidao8.com\ncaidaocloud.com\ncaidian.com\ncaidian365.com\ncaidianqu.com\ncaiens.com\ncaifei.net\ncaifengprinting.com\ncaifu.com\ncaifu500.net\ncaifupai.com\ncaifuxingketang.com\ncaifuxingmingxue.com\ncaifuzhongwen.com\ncaigaowang.com\ncaigeqiu.vip\ncaigou2003.com\ncaigou365.com\ncaigoubao.cc\ncaigoutong.net\ncaiguayun.com\ncaiguu.com\ncaih.com\ncaihanlin.com\ncaihcloud.com\ncaihcom.com\ncaihdata.com\ncaiheht.com\ncaihong.com\ncaihong5g.com\ncaihong8888.com\ncaihongbashi.net\ncaihongche.com\ncaihongduoduo.com\ncaihongjia.com\ncaihongjianzhan.com\ncaihongmeng.com\ncaihongqi.com\ncaihongsheying.com\ncaihongto.com\ncaihongx.com\ncaihoo.com\ncaihuapak.com\ncaihuicloud.com\ncaihuoxia.com\ncaiips.com\ncaij100.com\ncaijing365.com\ncaijingche.com\ncaijingmobile.com\ncaijingnews.net\ncaijingwu.com\ncaijinyuan.com\ncaijiruanjian.com\ncaijj.com\ncaike.com\ncaiku.cc\ncaiku.com\ncaikuai91.com\ncaikuaitoutiao.com\ncaikuo.com\ncailele.com\ncailianpress.com\ncailiao.com\ncailiaoniu.com\ncailiaoren.com\ncailutong.com\ncaimaiba.com\ncaimei365.com\ncaimitech.com\ncaimogu.cc\ncaimogu.net\ncaimomo.com\ncainachina.com\ncaing.com\ncainiao-inc.com\ncainiao-inc.net\ncainiao.com\ncainiaobaoka.com\ncainiaocc.com\ncainiaojc.com\ncainiaojiaocheng.com\ncainiaoxueyuan.com\ncainiaoya.com\ncainiaoyizhan.com\ncainongnet.com\ncainuan365.com\ncaipiaogu.com\ncaipintu.com\ncaipopo.com\ncaipucaipu.com\ncaiqizhe.com\ncairenhui.com\ncairongquan.com\ncairot.com\ncairuijun.com\ncaisan.io\ncaishen.ai\ncaishenpo.com\ncaishenyy.com\ncaishuiedu.com\ncaisixiang.com\ncaistc.com\ncaistv.com\ncait.com\ncait1981.com\ncaitaimg2.com\ncaitaw.com\ncaitun.com\ncaituyou.com\ncaiu8.com\ncaiwan.com\ncaiweiming.com\ncaiwennews.com\ncaiwu51.com\ncaiwuchina.com\ncaixadirectaanalisar.com\ncaixin.com\ncaixinfoundation.org\ncaixinmedia.com\ncaixinonline.com\ncaiyicloud.com\ncaiyiduo.com\ncaiyu.com\ncaiyuemedical.com\ncaiyun.com\ncaiyunai.com\ncaiyunapp.com\ncaiyuncdn.com\ncaiyunhub.com\ncaiyunyi.com\ncaizhaowang.com\ncaizhihr.com\ncaj11.com\ncake400.com\ncake6.com\ncalatopia.com\ncalawei.com\ncalb-tech.com\ncalccn.com\ncaldigit.net\ncaledoniancable.com\ncalendar520.com\ncalgoncarbon-china.com\ncali-light.com\ncali999.net\ncallbei.com\ncallcenter88.com\ncallergen.com\ncallmekeji.com\ncallmysoft.com\ncallrui.com\ncaloinfo.com\ncalorietech.com\ncalt.com\ncalterah.com\ncalvinneo.com\ncamartsphotography.com\ncambm.com\ncambodiafang.com\ncambricon.com\ncambridge.org\ncamc.cc\ncamcap.us\ncamcard.com\ncamce-rc.com\ncamdihg.com\ncame-online.org\ncamera360.com\ncameraunion.net\ncamhen.com\ncamilliar.com\ncamir.org\ncamnpr.com\ncamoryapps.com\ncampanilechina.com\ncampari1987.com\ncampbicycle.com\ncampgreenbox.com\ncampingcn.com\ncampiu.com\ncampus-app.net\ncampuschina.org\ncampushoy.com\ncampusphere.net\ncampusplus.com\ncamreizuxphd.com\ncamscanner.com\ncamsnetec.com\ncamyu.net\ncan-dao.com\ncan-gas.com\ncan-lead.com\ncan.tv\ncana.space\ncanaan-creative.com\ncanaanmt.com\ncanadaae.net\ncanalmuseum.net\ncanasy.com\ncanature.com\ncanbaojin.com\ncancda.net\ncancer361.com\ncandiabiotech.com\ncandou.com\ncandybook.com\ncandyhaw.com\ncandylab.net\ncandypay.com\ncandystars.net\ncanet.com\ncanevent.com\ncanfire.net\ncang-jia.net\ncang.com\ncangdu.org\ncangfengzhe.com\ncanghaiip.com\ncanghaimachine.com\ncangjie-lang.net\ncanglanghospital.com\ncangmang.xyz\ncangoonline.com\ncangowin.com\ncangpie.com\ncangqiang.com\ncangqiongkanshu.com\ncangshui.net\ncangshutun.com\ncangxiaoer.com\ncangxitianli.com\ncangya.com\ncangzhouhd.com\ncanhighcenter.com\ncanhot.net\ncaniculab.com\ncanidc.com\ncanjio.com\ncankao100.com\ncankaoshouce.com\ncankaoxiaoxi.com\ncankaoxx.com\ncanlanjy.com\ncannelton.org\ncanonpumps.com\ncanpdu.com\ncanpoint.net\ncanpopo.com\ncanrill.com\ncansee.net\ncansemitech.com\ncansine.com\ncantoge.com\ncantonbio.com\ncantonde.com\ncantonfairad.com\ncantontower.com\ncanvcan.com\ncanway.net\ncanwayit.com\ncanwaysoft.com\ncanxingmedia.com\ncanyin.cc\ncanyin.com\ncanyin168.com\ncanyin2017.com\ncanyin375.com\ncanyin88.com\ncanyincha.com\ncanyinzixun.com\ncanyouchina.com\ncanyousoftware.com\ncanyuanzs.com\ncaoanhospital.com\ncaobao.com\ncaocaobusiness.cc\ncaocaocustomer.cc\ncaocaoglobal.com\ncaocaojourney.cc\ncaocaokeji.net\ncaocaomarketing.cc\ncaocaomedia.cc\ncaocaoproduct.cc\ncaocaopromotion.cc\ncaocaoservice.cc\ncaocaosx.com\ncaocaotravel.cc\ncaocaotrip.cc\ncaocaotrip.com\ncaochai.com\ncaochai.net\ncaochen.net\ncaogen.com\ncaogenb2b.com\ncaogong.org\ncaohai.com\ncaohaifeng.com\ncaohejing.com\ncaohua.com\ncaoke.net\ncaoliao.net\ncaomall.net\ncaomei.wiki\ncaomeipai.com\ncaomeishuma.com\ncaoniang.com\ncaonmp.com\ncaos-china.org\ncaoshiyabo.com\ncaotama.com\ncaotianmiao.com\ncaotu66.com\ncaovan.com\ncaoxianfc.com\ncaoxie.com\ncaoxudong.info\ncaoyudong.com\ncapablist.com\ncapatue.com\ncapellahotelsanya.com\ncapitalcloud.net\ncapitaleco-pro.com\ncapitalip.org\ncapitalonline.net\ncapitaltoday.com\ncapjfx.club\ncapjoy.com\ncappdr.org\ncaps-china.org\ncapsuleshanghai.com\ncaptain-cro.com\ncapturetheflag.fun\ncapvision.com\ncapwhale.com\ncaqzlsgs.com\ncar-metaverse.com\ncar0575.com\ncar2sharechina.com\ncar369.com\ncar388.com\ncarapk.com\ncarben.me\ncarbinpower.com\ncarbonbiking.com\ncarbononegroup.com\ncarbonscn.com\ncarbonxprogram.com\ncarcav.com\ncarcdn.com\ncardaudio.com\ncardbaobao.com\ncardcmb.com\ncardcn.com\ncardinfolink.com\ncardlan.com\ncardlogroup.com\ncardniu.com\ncardniudai.com\ncardplus.work\ncardqu.com\ncardyang.com\ncare-challenge.com\ncare110.com\ncaredear.com\ncareduka.com\ncareerchina.com\ncareerexe.com\ncareerintlinc.com\ncareerqihang.com\ncareersky.org\ncarefiber.work\ncareked.com\ncarelifefood.com\ncarellicpa.com\ncarertec.com\ncareuc.com\ncarezb.com\ncargai.com\ncargeer.com\ncargo001.com\ncargodiscovery.com\ncargofee.com\ncargosmart.com\ncaribgalaxy.com\ncarimg.com\ncarisen.com\ncarivisa.com\ncarking001.com\ncarlinkin.com\ncarmov.com\ncarmucn.com\ncarnegiebj.com\ncarnoc.com\ncarodpiano.com\ncarp56.com\ncarpoly.com\ncarrotchou.blog\ncarrotchou.com\ncarry6.com\ncarry6.net\ncarrydj.com\ncars001.com\ncarschina.com\ncarsmp3.com\ncart-med.com\ncartaocontinente-ptssta.cfd\ncartech8.com\ncartersda.com\ncarthane.com\ncartimen.com\ncartoonwin.com\ncarutoo.com\ncarxinwen.com\ncarxoo.com\ncaryoud.com\ncarzd.com\ncarzenplus.com\ncarzone365.com\ncarzyuncle.com\ncas.org\ncas01.com\ncasarocinante.com\ncasarte.com\ncasbin.com\ncasbin.org\ncasboc.com\ncascadepharm.com\ncasctcp.com\ncasdoor.com\ncasdoor.org\ncase-platformhealth.com\ncase91.com\ncasear.net\ncasece.org\ncaseinnoo.com\ncasemic.com\ncashbackok.com\ncashbus.com\ncashcatads.com\ncashtoutiao.com\ncashwaytech.com\ncasia.com\ncasibase.com\ncasic-addsino.com\ncasic-t.com\ncasic.com\ncasic304.com\ncasic3s.com\ncasicloud.com\ncasicyber.com\ncasis.work\ncasjob.com\ncaslease.com\ncasmeit.com\ncasmita.com\ncasmn.com\ncasnb.com\ncasp.hk\ncaspte.com\ncasqy.com\ncasszzy.com\ncast.news98.com.tw\ncast.uforadio.com.tw\ncastbd.com\ncastelu.com\ncastiron-bathtub.com\ncastlepeakhospital.moe\ncastyum.com\ncasvino.com\ncasvisor.com\ncasvm.com\ncasystar.com\ncasyueda.com\ncat-cn.com\ncat898.com\ncatalike.com\ncatalyst-loading.com\ncatcat321.com\ncatchingdoll.com\ncatchyrime.com\ncatering-shizuoka.com\ncatfish-cms.com\ncatguo.com\ncathassist.org\ncathayagroup.com\ncatia-china.com\ncatic-dde.com\ncaticgz.com\ncaticol.com\ncatjc.com\ncatl.com\ncato-chem.com\ncato-travel.com\ncatofes.com\ncattsoft.com\ncattsp.com\ncatugbio.com\ncatus.xyz\ncatuscdn.xyz\ncatv.net\ncatv114.com\ncatweiqi.com\ncatyun.cc\ncaua1988.com\ncaua99.com\ncaup.net\ncaupd.com\ncaupdbj.com\ncauvet.com\ncav-ad.com\ncavca.org\ncawae.net\ncaxa.com\ncaxx.net\ncayzlh.com\ncazpw.com\ncazx.net\ncb-h.com\ncb07fef6ccb66c8e.com\ncb6037f1b10261.beer\ncb8888.shop\ncb8a5dff61011.beer\ncb8e405b81014.beer\ncbaleague.com\ncbbn.net\ncbc32120f1014.beer\ncbca.net\ncbcechina.com\ncbcgroup.net\ncbcie.com\ncbcloud123.com\ncbcsnote.com\ncbcuri.com\ncbd-china.com\ncbd0512.com\ncbd263.com\ncbdcn.com\ncbdd9912fb913294.com\ncbdio.com\ncbdstest.download.prss.microsoft.com\ncbdz13.com\ncbe21.com\ncbea.com\ncbec365.com\ncbecok.com\ncbecx.com\ncbeeexpo.com\ncbes21.com\ncbex.com\ncbf92cea38c259ee.com\ncbfau.com\ncbgcloud.com\ncbhb.biz\ncbi360.net\ncbiachina.com\ncbiao.com\ncbice.com\ncbiec.com\ncbiec.net\ncbigame.com\ncbinews.com\ncbismb.com\ncbitft.com\ncbivisa.com\ncbj1998.com\ncbjq.com\ncbjuice.com\ncbjy520.com\ncbjzw.org\ncbmexpo.com\ncbmf.org\ncbminfo.com\ncbmsci.com\ncbmwz.net\ncbn.me\ncbndata.com\ncbndata.org\ncbnri.org\ncbnweek.com\ncboad.com\ncbquan.com\ncbsbearing.com\ncbsnewshd-lh.akamaihd.net\ncbsrc.com\ncbtgc.com\ncbtimer.com\ncburi.com\ncbvac.com\ncbvvt.com\ncbvx8.com\ncbxs.net\ncby.me\ncbzr.com\ncc-airshow.com\ncc-honor.com\ncc-image.com\ncc-pharming.com\ncc-q.com\ncc-uavia.com\ncc.cd\ncc.co\ncc06040d408f65b1.com\ncc0808.com\ncc11bh.com\ncc1588.com\ncc55k.com\ncc707.com\ncc7m.com\ncc8.cc\ncc86.com\ncc89aba4a2ccad27.com\ncca135.com\nccabchina.com\nccai.cc\nccall.cc\nccamc.co\nccaon.com\nccapbook.com\nccapedu.com\nccartd.com\nccarting.com\nccasn.com\nccasy.com\nccatcloud.com\nccatnet.com\nccawz.com\nccb.com\nccbb6be551024.beer\nccbcos.com\nccbec-shenzhen.com\nccbecexpo.com\nccbflift.com\nccbft.com\nccbfund.com\nccbfutures.com\nccbhome.net\nccbiam.com\nccbintl.com.hk\nccbleasing.com\nccbnd.com\nccbookfair.com\nccbpcn.com\nccbpension.com\nccbride.com\nccbseoul.com\nccbxt.com\nccc-ch.com\nccc-chn.com\ncccamtop.com\ncccbs.net\ncccc-capital.com\ncccc-sdc.com\ncccc-sjer.com\ncccc58.com\ncccc8cccccc.cc\nccccccccccc.cc\ncccclc-gd.com\ncccclc.com\nccccoe.cc\nccccoe.com\nccccsg.com\ncccdun.com\ncccdzxw.com\ncccf-cloud.com\ncccitu.com\ncccity.cc\ncccking.com\nccckq.com\ncccm-em120.com\ncccmat.com\ncccmii.com\ncccmtf.com\ncccnec.com\ncccovvv.com\ncccpan.com\ncccppp.com\ncccsql.com\nccctspm.org\ncccwaf.com\ncccyun.cc\nccd86.com\nccddb877c1024.beer\nccdma.org\nccdol.com\ncce-china.com\ncce0bd02011032.beer\nccea.pro\ncceato.com\nccebbs.com\nccedia.com\nccedisp.com\nccedpw.com\nccedtu.com\nccee.com\ncceea.net\ncceep.com\nccement.com\nccen.net\nccepc.com\ncces2006.org\nccesda.com\nccets.com\nccfddl.com\nccfeb.com\nccflow.org\nccfourth.com\nccfta.com\nccgaa.com\nccgdc.com\nccgff.com\nccgfie.com\nccggd.com\nccgim.com\nccgjbus.com\nccgogogo.com\nccgoyi.com\nccgs120.net\nccgslb.com\nccgslb.net\nccgxk.com\ncchaosheng.com\ncchc-hyd.com\ncchccc.com\ncchcch.com\ncchengr.com\ncchezhan.com\ncchfound.org\ncchlgame.com\ncchorse.com\ncchorse.net\ncchoubo.com\ncchpu.com\ncci-intervention.com\nccia-cleaning.org\nccia.xin\ncciaiot.org\ncciatv.com\nccic-8.com\nccic-auto.com\nccic-lab.com\nccic-set.com\nccic.com\nccic2.com\ncciccloud.com\nccice.com\nccicgd.com\nccicgx.com\nccicsd.com\nccidcom.com\nccidconsulting.com\ncciddata.com\ncciddesign.com\nccidedu.com\nccidexpo.com\nccidgroup.com\nccidnet.com\nccidreport.com\nccidsmart.com\nccidthinktank.com\nccidwise.com\ncciea.com\nccieh3c.com\nccifc.org\nccig.com\nccigchina.com\nccinchina.com\nccip.ren\nccipp.org\nccirm.org\nccit360.com\nccita.net\nccitimes.com\nccitu.com\ncciup.com\nccj88.com\nccjec.com\nccjhdljs.com\nccjkncdc.com\nccjkwjjedu.com\nccjoo.com\nccjoy.com\nccjoyland.com\nccjs120.com\nccjt.com\nccjxcn.com\nccjytv.com\nccjzzj.com\ncckbyi.com\ncckefu1.com\ncckefu3.com\ncckggroup.com\nccknbc.cc\ncckyedu.com\ncclawer.com\ncclawnet.com\ncclbook.com\ncclcn.com\nccle5.com\nccler.com\ncclexpo.com\ncclgpx.com\ncclimg.com\ncclinux.org\ncclndx.com\ncclolcc.com\ncclqme.xyz\nccluster.net\ncclyun.com\nccm-1.com\nccm-hardware.com\nccm99.com\nccmama.com\nccmcgc.com\nccmdl.adobe.com\nccmdls.adobe.com\nccme.cc\nccmfcm.com\nccmicroera.com\nccmn.net\nccmodel.com\nccmw.net\nccn.ren\nccn360.com\nccnbdh.com\nccnee.com\nccnew.com\nccngx.com\nccnovel.com\nccnovo.com\nccnpic.com\nccnt.com\nccoalnews.com\nccoaonline.com\nccoco.vip\nccode.cc\nccoi.ren\ncconn.cc\nccoop.net\nccoopg.com\nccops.net\nccopyright.com\nccostm.com\nccotcm.com\nccoymc.com\nccp3060.com\nccpaie.com\nccpc.io\nccpc360.com\nccpgssd.com\nccpit-academy.org\nccpit-sichuan.org\nccpit-sx.org\nccpit-tga.org\nccpit.org\nccpitbj.org\nccpitbm.org\nccpitbuild.org\nccpitcft.com\nccpitcq.org\nccpitecc.com\nccpitfujian.org\nccpitgs.com\nccpitgx.org\nccpithebei.com\nccpithn.org\nccpitjinan.org\nccpitjs.org\nccpitlight.org\nccpitln.org\nccpitnb.org\nccpitsd.com\nccpittex.com\nccpittj.org\nccpitxiamen.org\nccpitxian.org\nccplay.cc\nccplay.com\nccpnt.org\nccpod.com\nccprec.com\nccproxy.com\nccps56.com\nccqctg.com\nccqf.com\nccqg.com\nccqtgb.com\nccqtm.com\nccqyj.com\nccrate.cc\nccrc.com\nccrfmed.com\nccrgt.com\nccrici.com\nccrjk.com\nccrjkf.com\nccrjw.com\nccsacacasfdghh.com\nccschangsha.com\nccscrbyy.com\nccsedqrmyy.com\nccsfuchan.com\nccskqyy.com\nccsngqyy.com\nccsnpower.com\nccsp365.com\nccssmm.com\nccst.cc\nccsuu.com\nccswuhan.com\nccsx.net\nccsxlyy.com\ncct-g.com\ncct-lab.com\ncct365.net\ncctalent.com\ncctalk.com\ncctalk.net\ncctash.com\ncctaw.com\ncctbn.com\ncctc.cc\ncctcce.com\ncctcct.com\ncctcdn.com\ncctek.com\ncctheze.com\ncctime.com\ncction.com\ncctlife.com\ncctmt.com\ncctocloud.com\ncctpgm.com\ncctpress.com\ncctry.com\ncctsz.com\ncctu.org\ncctv-19.com\ncctv-caijing.com\ncctv-peiyin.com\ncctv-star.com\ncctv.com\ncctv0002.com\ncctv13cctv13.com\ncctv18.com\ncctv4g.com\ncctv5bo.com\ncctvcdn.net\ncctvcj.com\ncctvctpc.com\ncctvdyt.com\ncctvfendou.com\ncctvfinance.com\ncctvjingji.com\ncctvmall.com\ncctvpic.com\ncctvplus.com\ncctvsdyxl.com\ncctvse.net\ncctvweishi.com\ncctvxftx365.com\ncctw.cc\ncctypx.com\ncctzz.net\nccughc.net\nccutchi.com\nccv160.com\nccv168.com\nccview.net\nccvui.com\nccwcw.com\nccwcyw.com\nccwifi.cc\nccwl.net\nccwonline.com\nccwonline.net\nccwork.com\nccwow.cc\nccwqtv.com\nccwto.net\nccxcn.com\nccxcredit.com\nccxhfk.com\nccybeta.cc\nccydkj.com\nccygmy.com\nccyia.com\nccynice.com\nccyts.com\nccyunmai.com\nccyyxx.com\ncczel.com\ncczjyy.com\ncczk.com\ncczkdmkj.com\ncczq.com\ncczq.net\ncczxyjhyy.com\ncd-cxh.com\ncd-estt.com\ncd-hk.net\ncd-hss.com\ncd-kc.com\ncd-motorshow.com\ncd-ox.com\ncd-pa.com\ncd-psychologist.com\ncd-rail.com\ncd-sd.com\ncd-tencentclb.cloud\ncd-tencentclb.com\ncd-tencentclb.net\ncd-tencentclb.work\ncd-web.org\ncd-wx.com\ncd-wx.net\ncd-zc.com\ncd00c44f211031.beer\ncd120.com\ncd12371.com\ncd1958.com\ncd20.net\ncd2120.com\ncd23f.com\ncd3120.com\ncd365689f11012.beer\ncd37wan.com\ncd3hospital.com\ncd42195.com\ncd58.com\ncd6.com\ncd658ad6a610b9a5.com\ncd7a871ab11011.beer\ncd7yy.com\ncdabon.com\ncdacz.com\ncdadata.com\ncdadsj.com\ncdairport.com\ncdajcx.com\ncdajzp.com\ncdamdi.com\ncdanet.org\ncdangel.com\ncdapex.com\ncdaten.com\ncdb-leasing.com\ncdbaidu.com\ncdbdsec.com\ncdbfb.net\ncdbokon.com\ncdborz.com\ncdbsdyk.com\ncdbsfund.com\ncdc80b3514292771.com\ncdcbj.com\ncdcbn.com\ncdcc.ink\ncdccic.com\ncdccpit.org\ncdcea.org\ncdcgames.net\ncdchjyy.com\ncdchuandong.com\ncdcitypark.com\ncdcoslm.com\ncdcxhl.com\ncdcyts.com\ncddayun.com\ncddc56.com\ncddengji.com\ncddgg.com\ncddgg.net\ncddjip.com\ncddlhx.com\ncddlkj.net\ncddq120.com\ncddscj.com\ncddsgk.com\ncde-os.com\ncdea4d2cb10261.beer\ncdeaa.com\ncded23c0b11011.beer\ncdedu.com\ncdeledu.com\ncdenvironment.com\ncdfanmu.com\ncdfcjg.com\ncdfcn.com\ncdfeimi.com\ncdfer.com\ncdfgsanya.com\ncdfgt.com\ncdfhnmall.com\ncdfhnms.com\ncdfinger.com\ncdfmembers.com\ncdfortis.com\ncdfsunrise.com\ncdfuwuqi.com\ncdgas.com\ncdgdad.com\ncdgdp.com\ncdggq.com\ncdggzy.com\ncdgjbus.com\ncdgmgd.com\ncdgoufang.com\ncdgowell.com\ncdgql.com\ncdgrf.com\ncdgtw.net\ncdgxfz.com\ncdgxsyzx.com\ncdgxxy.net\ncdh3c.com\ncdhaiguang.com\ncdhfund.com\ncdhglsc.com\ncdhgr.com\ncdhjsw.com\ncdhke.com\ncdhkxy.com\ncdhld.com\ncdhr.net\ncdhrsip.org\ncdhsgb.com\ncdhtgroup.com\ncdhtgs.com\ncdhtrq.com\ncdhuaying.com\ncdhxdq.com\ncdii-leasing.com\ncdirs.com\ncditv.tv\ncdjcow.com\ncdjfwy.com\ncdjhqczl.com\ncdjiaoan.com\ncdjingfeng.com\ncdjituan.com\ncdjnrc.com\ncdjsjlxh.com\ncdjsjx.com\ncdjtzhtc.com\ncdjxjy.com\ncdjzso.com\ncdjzw.com\ncdjzzg.com\ncdkeynogap.com\ncdkf.com\ncdkjbg.com\ncdkjw.org\ncdks.run\ncdkyfc.com\ncdlaobing.com\ncdlbmy.com\ncdlbyl.com\ncdlchd.com\ncdlgp.com\ncdliangwang.com\ncdlingsou.com\ncdlinux.net\ncdlsym.com\ncdlvbao.com\ncdlxqn.com\ncdmcaac.com\ncdmddyf.com\ncdmfund.org\ncdmgiml.com\ncdmhwh.com\ncdmjwater.com\ncdms-china.com\ncdn-build.com\ncdn-build.net\ncdn-cba.com\ncdn-cdn.net\ncdn-dodo.com\ncdn-gw-dv.net\ncdn-hotels.com\ncdn-speed.com\ncdn-static.farfetch-contents.com\ncdn-uc.cc\ncdn-v.com\ncdn-videos.akamaized.net\ncdn.ampproject.org\ncdn.angruo.com\ncdn.fun\ncdn.globalsigncdn.com.cdn.cloudflare.net\ncdn.hkdtmb.com\ncdn.ist\ncdn.jetbrains.com\ncdn.lilyemby.com\ncdn.marketplaceimages.windowsphone.com\ncdn.samsung.com\ncdn.shanghai.nyu.edu\ncdn.show\ncdn.vin\ncdn.zampdsp.com\ncdn000.com\ncdn08.com\ncdn1.vip\ncdn1008.com\ncdn1218.com\ncdn16.com\ncdn20.com\ncdn20.info\ncdn20.org\ncdn2000.com\ncdn2020.com\ncdn30.com\ncdn30.info\ncdn30.org\ncdn3344.com\ncdn35.com\ncdn365gnlc.vip\ncdn365lc.vip\ncdn40.com\ncdn50.com\ncdn56.com\ncdn60.com\ncdn86.com\ncdn86.net\ncdn90.com\ncdn90.net\ncdn90.org\ncdn99.com\ncdnb.net\ncdnbbb.net\ncdnbuild.com\ncdnbuild.net\ncdnbye.com\ncdnc.org\ncdncache.com\ncdncache.net\ncdncdncdn.com\ncdncenter.com\ncdncg.com\ncdnchatgpt.com\ncdnchushou.com\ncdncl.net\ncdnclouds.net\ncdncode.com\ncdnczydwl.com\ncdnddd.com\ncdnddd.net\ncdndm.com\ncdndm5.com\ncdndm5.net\ncdndns.vip\ncdndns1.com\ncdndns2.com\ncdndns2.net\ncdndo.com\ncdndoctor.com\ncdndu.com\ncdnet110.com\ncdnetdns.net\ncdnetgdns.com\ncdnetworks.net\ncdnexus.com\ncdnf.cc\ncdngia.com\ncdngot.com\ncdngslb.com\ncdngslb8.com\ncdngtm.com\ncdnhhh.net\ncdnhub.net\ncdnhwc1.com\ncdnhwc10.com\ncdnhwc2.com\ncdnhwc3.com\ncdnhwc4.com\ncdnhwc5.com\ncdnhwc6.com\ncdnhwc7.com\ncdnhwc8.com\ncdnhwc9.com\ncdnhwcajk17.com\ncdnhwcatq08.com\ncdnhwcbni108.com\ncdnhwcbqs106.com\ncdnhwcbzj102.com\ncdnhwcchh18.com\ncdnhwccmz121.com\ncdnhwcead111.com\ncdnhwcedi10.com\ncdnhwcedt124.com\ncdnhwcggk22.com\ncdnhwcgnc118.com\ncdnhwcgqa21.com\ncdnhwchcg02.com\ncdnhwcibv122.com\ncdnhwcick110.com\ncdnhwcjlg112.com\ncdnhwcjog12.com\ncdnhwcjsb120.com\ncdnhwckfz116.com\ncdnhwckon103.com\ncdnhwcljk104.com\ncdnhwcllh11.com\ncdnhwclxu105.com\ncdnhwclxw05.com\ncdnhwcoem01.com\ncdnhwcohm19.com\ncdnhwcoph123.com\ncdnhwcprh113.com\ncdnhwcpsd13.com\ncdnhwcqgw115.com\ncdnhwcqir15.com\ncdnhwcqve117.com\ncdnhwcqwg14.com\ncdnhwctnm107.com\ncdnhwctxz24.com\ncdnhwcuim119.com\ncdnhwcupf06.com\ncdnhwcurq03.com\ncdnhwcvix16.com\ncdnhwcxcy07.com\ncdnhwczba04.com\ncdnhwczjt20.com\ncdnhwczks109.com\ncdnhwczmn114.com\ncdnhwczth23.com\ncdnhwcztu09.com\ncdnhwczxh101.com\ncdnidc.net\ncdnjs8888.com\ncdnjson.com\ncdnjtzy.com\ncdnkxy.com\ncdnle.com\ncdnle.net\ncdnlinkcloud.com\ncdnlinking.com\ncdnmama.com\ncdnmg.com\ncdnnx.com\ncdnok.com\ncdnoutcheck.com\ncdnpe.com\ncdnqttdispatcher01.com\ncdnsvc.com\ncdntip.com\ncdntipbak.com\ncdntips.com\ncdntips.net\ncdntxt.com\ncdnudns.com\ncdnunion.com\ncdnvp.com\ncdnvpn.net\ncdnvue.com\ncdnwaf.net\ncdnxcrpl.vip\ncdnyoyun.com\ncdnyt69.com\ncdnyyds999.com\ncdoers.com\ncdpgroupltd.com\ncdqcnt.com\ncdqcp.com\ncdqcw.net\ncdqcxy.com\ncdqczx.com\ncdqmw.net\ncdqph.com\ncdqsng.com\ncdqss.com\ncdqszz.com\ncdqzcz.com\ncdrbs.net\ncdrcb.com\ncdren.net\ncdrich.com\ncdrjob.com\ncdronghai.com\ncdrqxh.com\ncdrsigc.com\ncdrtvu.com\ncdruzhu.com\ncds-seal.com\ncdsb.com\ncdsb.mobi\ncdscdscdn.com\ncdsenfa.com\ncdsgsz.com\ncdshangceng.com\ncdshishi.net\ncdshx.com\ncdsixun.com\ncdsjjy.com\ncdsjtech.com\ncdskdxyy.com\ncdsledu.net\ncdslsxh.com\ncdslsxh.org\ncdsme.com\ncdsns.com\ncdsnzx.com\ncdspace.net\ncdsslz.net\ncdsuns.com\ncdswjs.com\ncdswx.net\ncdsxdd.com\ncdsxlc.com\ncdt-ec.com\ncdt-md.com\ncdt-re.com\ncdtcxh.org\ncdtianda.com\ncdtkdw.com\ncdtlev.com\ncdtlxx.net\ncdtnrq.com\ncdtszn.net\ncdtyxx999.com\ncdtz.net\ncduncname.com\ncdvcloud.com\ncdvisor.com\ncdwulian.com\ncdxdyy.com\ncdxrdz.com\ncdxsxbx.com\ncdxw.net\ncdxwcx.com\ncdxwxy.com\ncdxydb.com\ncdydlx.com\ncdyee.com\ncdyestar.com\ncdyfy.com\ncdygdq.com\ncdyj56.com\ncdylzx.net\ncdynt.com\ncdyouhui.com\ncdyrjygs.com\ncdysxx.com\ncdysxy.com\ncdyushun.com\ncdyywz.com\ncdyzhotel.com\ncdzdgw.com\ncdzgh.com\ncdzgzs.com\ncdzhuoyu.com\ncdzimo.com\ncdzixun.net\ncdzjryb.com\ncdzk.com\ncdzk.net\ncdzk.org\ncdzls.net\ncdzongtian.com\ncdzp8.com\ncdzrjdgc.com\ncdzs.org\ncdzuche.com\ncdzvan.com\ncdzxy.com\ncdzzhn.com\nce-air.com\nce04.com\nce2293.com\nce247ce247.shop\ncea45b9f61023.beer\nceacq.com\nceair.com\nceairdutyfree.com\nceairgroup.com\nceaj.org\nceamg.com\nceawgez.com\nceba.tech\ncebbank.com\ncebcn.com\ncebike.com\nceblease.com\ncebpubservice.com\ncebu.vip\ncecafdb.org\ncecb2b.com\ncecbh.com\ncecc-cx.com\nceccen.com\ncecdc.com\ncece-mall.com\ncece.com\ncece.la\ncecesat.com\ncecewu.com\ncecgw.com\ncecgx.com\ncechoice.com\ncecisp.com\ncecloud.com\ncecloudcs.com\ncecmath.com\ncecom.cc\nceconline.com\nceconlinebbs.com\ncecport.cc\ncecport.com\ncecxtal.com\nceda-fluid.com\ncedachina.org\ncedarhd.com\ncedfxub.org\ncediy.com\ncedock.com\nceeger.com\nceegpower.com\nceeia.com\nceeji.net\nceepower.com\nceepsp.com\nceeunion.com\ncef114.com\nceggd.com\ncehiy.com\ncehome.com\ncehuan.com\ncehuashen.com\ncehui8.com\ncei1958.com\nceiaec.org\nceibs.edu\nceibsonline.com\nceic.com\nceice.org\nceicloud.com\nceicsz.net\nceiea.com\nceigd.com\nceinettgt.com\nceitcl.com\ncekeis.com\ncekid.com\ncelebpalace.com\ncelebritywallpapershq.com\ncelgenpharm.com\ncelhr.com\nceliang.net\ncelinlawyers.com\nceliss.com\ncell-gene.com\ncell-origin.com\ncellcook.com\ncellixsoft.com\ncellocation.com\ncellprobio.com\ncellprotek.com\ncells-net.com\ncells-net.net\ncellwise-semi.com\ncelucasn.com\ncelwk.com\ncemat-asia.com\ncematsh.com\ncement365.com\ncementren.com\ncemho.com\ncemni.com\ncemodule.com\ncemsurveys.com\ncemsurveys.net\ncemyun.com\ncen-li.com\ncenano-china.com\ncenbel.com\ncenbest.com\ncenboomh.com\ncencimeter.com\ncencs.com\ncendes-arch.com\ncengceng.chat\ncengcloud.net\nceniiat.com\ncenjiasu.com\ncenkersz.com\ncenn.com\ncennjt.com\ncenray-ic.com\ncensh.com\ncentainfo.com\ncentaland.com\ncentanet.com\ncentauriglobal.com\ncentbrowser.net\ncentec.com\ncententcymbals.com\ncenterm.com\ncentit.com\ncentong.com\ncentos.bz\ncentralchina.com\ncentralsolomon.com\ncentrechina.com\ncentricsoftwarechina.com\ncentrincloud.com\ncentrixlink.com\ncentrmus.com\ncentroidtec.com\ncentrostuditaliani.com\ncentury-carrier.com\ncentury-cn.com\ncentury21cn.com\ncenturycreation.com\ncenturyenglish.com\ncenturystar.net\ncenturytrip.com\ncenuan.com\ncenvan.net\ncenvandns.com\ncenwan.com\ncenwaymaterials.com\ncenwor.com\ncenwoy.com\ncenxilm.com\ncenxinews.com\ncenya.com\nceobiao.com\nceoeo.com\nceoim.com\nceolaws.net\nceolearn.com\nceook.com\nceotx.com\nceowww.com\nceoxq.com\nceozero.com\ncepark.com\ncepea.com\ncepeta.com\ncepin.com\nceping.com\nceping365.com\ncepmh.com\nceppea.net\nceppedu.com\nceprei.com\nceprei.org\ncer.net\nceracdn.net\nceradir.com\ncerambath.org\nceramicschina.com\nceramsoc.com\ncercg.com\ncere.cc\ncerestools.com\ncernet.com\ncernet.net\ncernet2.net\ncersign.com\ncersp.com\ncerticn.com\ncertificatey.com\nces-transaction.com\ncese2.com\ncesfn.com\ncesfutures.com\nceshanmi.com\nceshi.com\nceshi112.com\nceshigo.com\nceshigu.com\nceshiren.com\ncesinet.com\ncesipc.com\ncesko-dl.com\ncespc.com\ncestco.com\ncesu.net\ncetanfa.wiki\ncetc33.com\ncetc52.com\ncetc55.com\ncetccloud.com\ncetceg.com\ncetcio.com\ncetcmotor.com\ncetcssi.com\ncetgps.com\ncethik.com\ncetkmh.com\ncetsteam.com\ncetzig.com\nceultimate.com\nceve-market.org\ncevsn.com\ncewud.com\nceydz.com\nceyice.net\nceyige.com\ncezhu.net\ncf-china.info\ncf-ns.com\ncf-ns.net\ncf-ns.site\ncf-ns.tech\ncf01e170e475757b.com\ncf115.com\ncf69.com\ncf6ea43741014.beer\ncf8587a521017.beer\ncfachina.org\ncfanlost.com\ncfb30e2181013.beer\ncfbond.com\ncfc365.com\ncfca-c.org\ncfccd.com\ncfcf1958.com\ncfchem.com\ncfchi.com\ncfchint.com\ncfcpn.com\ncfd-china.com\ncfd163.com\ncfdp.org\ncfdwater.com\ncfecq.com\ncfedu.net\ncfei.net\ncfej.net\ncfeks.com\ncffote.com\ncfgbj.com\ncfgfr.com\ncfgjwl.com\ncfgpu.com\ncfgyp.com\ncfhfz.com\ncfhi.com\ncfhpc.org\ncfhuodong.cc\ncfhuodong.com\ncfido.com\ncfiec.net\ncfimg.com\ncfishsoft.com\ncfjbqc.com\ncfjqr.com\ncfjzyxh.com\ncfkjgx.com\ncflab.net\ncfldcn.com\ncflm.com\ncflpla.com\ncfluid.com\ncfm119.com\ncfmcc.com\ncfmeutencent.com\ncfmmc.com\ncfmna-tencent.com\ncfmoto.com\ncfmseatencent.com\ncfnotes.com\ncfoft.online\ncfogc.com\ncfogc.net\ncfpa.team\ncfrlr.com\ncfsbcn.com\ncfscar.com\ncfsggjt.com\ncfsino.com\ncfss.cc\ncfsuper.com\ncftcredit.com\ncftea.com\ncftecgroup.com\ncftest7.com\ncftest8.com\ncftsupport.com\ncftzqinzhou.com\ncfucn.com\ncfunctions.com\ncfund108.com\ncfuture.shop\ncfvvv.com\ncfxydefsyy.com\ncfxyfsyy.com\ncfxyjy.com\ncfyedu.com\ncfyy.cc\ncfyygf.com\ncfyzs.com\ncfzpw.com\ncfzq.com\ncfztq.com\ncg-ku.com\ncg-orz.com\ncg-schools.com\ncg009.com\ncg100iii.com\ncg1993.com\ncg3da.com\ncg98.com\ncg99.com\ncgacar.com\ncgadmob.com\ncgahz.com\ncgames.com\ncgangs.com\ncgboo.com\ncgbtek.com\ncgc.press\ncgcable.com\ncgcss.com\ncgdbia.com\ncgdeuvip.com\ncgdg.com\ncgdown.com\ncgebio.com\ncgebook.com\ncgeinc.com\ncgejournal.com\ncger.com\ncgguy.com\ncggygs.com\ncghhospital.org\ncghospital.com\ncgicop.com\ncgiia.com\ncgiumuo.xyz\ncgjoy.com\ncgjoy.net\ncgke.com\ncgkjvip.com\ncgksw.com\ncgktudr.xyz\ncgl.cc\ncglw.com\ncglzw.net\ncgmama.com\ncgmantou.com\ncgmao.com\ncgmcc.net\ncgmjh.com\ncgmodel.com\ncgmol.com\ncgmxw.com\ncgnei.com\ncgnjy.com\ncgnmc.com\ncgnne.com\ncgntv-glive.ofsdelivery.net\ncgoec-tencentclb.cloud\ncgoec-tencentclb.com\ncgoec-tencentclb.net\ncgoec-tencentclb.work\ncgonet.com\ncgowater.com\ncgown.com\ncgpbatech.com\ncgplayer.com\ncgplusplus.com\ncgreentown.com\ncgris.net\ncgrpark.com\ncgrzzl.com\ncgsec.com\ncgsfusion.com\ncgsoft.net\ncgtblog.com\ncgtn.com\ncgtsg.com\ncgtsj.com\ncgtsj.org\ncgtyhk.com\ncgtz.com\ncguardian.com\ncgufo.com\ncguiw.com\ncgutech.com\ncgvoo.com\ncgwang.com\ncgwenjian.com\ncgwic.com\ncgws.com\ncgxcig.net\ncgxdm.com\ncgxia.com\ncgxlzdm.com\ncgxm.net\ncgylke.com\ncgylw.com\ncgyou.com\ncgyouxi.com\ncgyu.com\ncgzair.com\ncgzj.com\ncgzy.net\ncgzyw.com\nch-auto.com\nch-chip.com\nch-gk.com\nch-guerrant.com\nch-tools.com\nch-water.com\nch.com\nch028.net\nch12333.com\nch6k5zd77f.com\nch9888.com\nch999.com\nch999img.com\ncha-china.org\ncha-tm.com\ncha127.com\ncha138.com\nchaba123.com\nchabansheng.com\nchabeichong.com\nchacd.com\nchacewang.com\nchacha.com\nchachaba.com\nchachawenshu.com\nchache-cn.com\nchache808.com\nchacheku.com\nchachengji.com\nchacihai.com\nchacuo.net\nchadianhua.net\nchadoc.com\nchaej.com\nchafanhou.com\nchafei.net\nchagee.com\nchaguan.center\nchahua.org\nchahui.com\nchahuo.com\nchaic.com\nchaichefang.com\nchaiderl.com\nchaiding.com\nchaidongpower.com\nchaihezi.com\nchaijing.com\nchaimage.com\nchain.cc\nchain56.com\nchaincar.com\nchaincatcher.com\nchaindd.com\nchainedbox.com\nchainhd.com\nchainknow.com\nchainlinkpcp.com\nchainlinkwork.com\nchainnode.com\nchainpharm.com\nchainsql.net\nchaint.net\nchainwinlaw.com\nchaiqian88.com\nchaishiguan.com\nchaitin.com\nchaizz.com\nchajiage.com\nchajian5.com\nchajiandaquan.com\nchajianxw.com\nchajiayuan.com\nchajie.com\nchajn.org\nchakahao.com\nchakahui.com\nchakonghao.com\nchakuaizhao.com\nchalaili.com\nchalangautozone.com\nchalaoshi.de\nchalcochem.com\nchalieco.com\nchallenge-21c.com\nchallenge-design.com\nchalwin.com\nchamcfae.com\nchamei.com\nchameiwang.com\nchamfond.com\nchamiji.com\nchampconsult.com\nchampion-ic.com\nchampionasia.hk\nchampionmkt.com\nchampionunion.com\nchampsely.com\nchan.ink\nchancel.ltd\nchandao.net\nchandashi.com\nchandi.biz\nchandixiu.com\nchanfine.com\nchang-xiang.com\nchangan.biz\nchangancap.com\nchanganfunds.com\nchanganren.com\nchangantaihe.com\nchangba-ktv.com\nchangba.com\nchangbaapi.com\nchangbaapp.com\nchangbaimg.com\nchangbalive.com\nchangbiyuan.com\nchangchun-ccpit.com\nchangchunmarathon.com\nchangchunwater.com\nchangda.life\nchangdaore.com\nchangdunovel.com\nchangergroup.com\nchangfa.com\nchangfaproperties.com\nchangfaqifu.com\nchangfengpacking.com\nchangfengsteeltube.com\nchangfon.com\nchanghaigfrp.com\nchanghe-suzuki.com\nchanghe.com\nchanghe.tech\nchangheauto.com\nchanghedayun.com\nchangheng88.com\nchanghong-network.com\nchanghong.com\nchanghongit.com\nchanghongnetwork.net\nchanghu12333.com\nchanghualaw.com\nchanghuist.com\nchangingie.com\nchangingtek.com\nchangjiangdata.com\nchangjiangjin.com\nchangjiangtimes.com\nchangjianxy.com\nchangjingtong.com\nchangjiulogistics.com\nchangjiuqiche.com\nchangker.com\nchangkezhe.com\nchanglipeixun.com\nchangliuabc.com\nchangloong.com\nchangloong.net\nchangmengyun.com\nchangning.net\nchangpingquzhongxiyijieheyiyuan.com\nchangpu3d.com\nchangqingshu.net\nchangqu.cc\nchangshabdc.com\nchangshang.com\nchangshaship.com\nchangshatong.com\nchangshazrkj.com\nchangshengmobi.com\nchangshengshangye.com\nchangshengyiliao.com\nchangshiban.com\nchangshizu.com\nchangshouchemgroup.com\nchangshu-marathon.com\nchangshunhuojia.com\nchangtong2800.com\nchangtounet.com\nchangtubus.com\nchanguanjia.com\nchangwang.com\nchangwankeji.com\nchangwei.asia\nchangx.com\nchangxianchem.com\nchangxiao.co\nchangxiaow.com\nchangxie.com\nchangxingyun.com\nchangxuew.com\nchangyan.com\nchangyegroup.com\nchangyifan.com\nchangyin-lab.com\nchangying.com\nchangyizu.com\nchangyonggame.com\nchangyou.com\nchangyoyo.com\nchangyuangroup.com\nchangyudz.com\nchangyushengwu.com\nchangzhinews.com\nchanjet.com\nchanjue.net\nchanluntan.com\nchanmama.com\nchannelbeyond.com\nchannellive.leshantv.net\nchanningsun.bid\nchanpay.com\nchanpin100.com\nchanpindashi.com\nchansemt.com\nchanshi.vip\nchanway.net\nchanwind.com\nchanxuan.com\nchanxuehezuo.com\nchanzhi.org\nchao-cn.com\nchao-fan.com\nchaoan.chaoantv.com\nchaoart.com\nchaobohui.com\nchaodamould.com\nchaodavalves.com\nchaodu123.com\nchaofan.com\nchaofanlin.com\nchaofanshuma.com\nchaofantian.com\nchaoge.press\nchaogejiaoyu.com\nchaogu1688.com\nchaohuatech.com\nchaohuishou.com\nchaoji.com\nchaojibiaodan.com\nchaojibiaoge.com\nchaojibuy.com\nchaojicdn.com\nchaojifan.com\nchaojihetong.com\nchaojijianli.com\nchaojiping.homes\nchaojituzi.net\nchaojiying.com\nchaojiyun.com\nchaokaixin.net\nchaolean.com\nchaoliangkj.com\nchaoliuguan.com\nchaolongbus.com\nchaoluoluo.com\nchaonanclub.com\nchaonanrc.com\nchaonei.com\nchaopaiyizu.com\nchaopx.com\nchaoren.com\nchaoschina.com\nchaosec.com\nchaoshanren.com\nchaoshen.cc\nchaoshengboliuliangji.com\nchaoshengxin.com\nchaoshi168.com\nchaosqh.com\nchaosw.com\nchaov.com\nchaowanjoy.com\nchaoweb.com\nchaowei-machine.com\nchaoxibiao.net\nchaoxin.com\nchaoxing.cc\nchaoxing.com\nchaoxingv.com\nchaoyang.com\nchaoyi996.com\nchaoyinjiu.com\nchaoyuesd.com\nchaozhenht.com\nchaozhoudaily.com\nchaozhouyin.com\nchaozuo.com\nchapangzhan.com\nchapaofan.com\nchaping.tv\nchappell1811.com\nchar123.com\ncharcaius.com\ncharge-mobile.com\nchargedot.com\nchargerlab.com\nchargerlink.com\nchariotpharm.com\ncharlinserver.online\ncharllena.com\ncharlottedaviesrmt.com\ncharlsdata.com\ncharmdeer.com\ncharmingglobe.com\ncharmkeytextile.com\ncharmsunfund.com\nchartboost-china.com\nchase-secure55.wiki\nchasedorisu.com\nchaseyanyu.net\nchashebao.com\nchashudi.com\nchat12m.cfd\nchat14da.cfd\nchat2db-ai.com\nchat778.com\nchatairc.com\nchatanywhere.tech\nchatartpro.com\nchateaustarriver.com\nchatglm.site\nchatgptboke.com\nchatm.com\nchatmindai.net\nchatnos.com\nchatqp.net\nchatvgx.com\nchatyygpt.com\nchawo.com\nchaxiaow.com\nchaxinyu.net\nchaxun.biz\nchaxunchina.com\nchaxunfapiao.com\nchaxunjiao.com\nchayanfamily.com\nchayangge.com\nchaye.com\nchayeo.com\nchayu.com\nchayueshebao.com\nchayuqing.com\nchaz.fun\nchazhengla.com\nchazidian.com\nchaziyu.com\nchazuo.com\nchazuo.net\nchazuowang.com\nchbcnet.com\nchbdunt.com\nchblt.com\nchbml.com\nchbpp.com\nchce-expo.com\nchcedo.com\nchceg.com\nchceshi001.com\nchcmu.com\nchcnav.com\nchcoin.com\nchcompass.com\nchcontrol.com\nchcpay.com\nchda.net\nchdajob.com\nchdelphin.com\nchdies.com\nchdmc.com\nchdqyy.com\nchdtp.com\nche-shijie.com\nche-youhui.com\nche.com\nche0.com\nche101.com\nche168.com\nche168.net\nche2.com\nche300.com\nche314.com\nche777.com\ncheaa.com\ncheaa.org\ncheaca.org\ncheapdoma.com\ncheaphost.me\ncheapreplicawatch.com\ncheapviagraws.com\ncheapyou.com\ncheari.com\ncheasa.org\ncheatmaker.org\nchebaba.com\nchebada.com\nchebaipishu.com\nchebianjie.com\nchebianjie.net\nchebiao.cc\nchebiao.net\nchebrake.com\nchecar.mobi\nchechakj.com\nchechaoxue.com\nchecheng.com\nchechong.com\nchechuan.com\ncheci.org\ncheck.cc\ncheckaigc.com\ncheckip.pw\ncheckmath.net\ncheckoo.com\ncheckpass.net\ncheckzeit.com\ncheckzoo.com\nchecom.net\nchediandian.com\nchedongxi.com\ncheduo.com\ncheegu.com\ncheerfun.dev\ncheerjoy.com\ncheersee.com\ncheersofa.com\ncheerspublishing.com\ncheersson.com\ncheertech.ltd\ncheerycouture.com\ncheetahfun.com\ncheetahgames.com\ncheetahgo.net\ncheetahmobile.com\nchefafa.com\nchefugao.com\ncheguo.com\nchegva.com\nchehang168.com\nchehejia.com\nchehui.com\ncheil.site\nchejianding.com\nchejingjie.com\nchekuaipai.com\nchelajanitorial.com\nchelangauto.com\nchelifang.com\nchelink.com\nchellex.com\nchelun.com\nchem-stone.com\nchem17.com\nchem234.com\nchem31.com\nchem36.com\nchem365.net\nchem366.com\nchem960.com\nchem99.com\nchemalink.net\nchemao.com\nchembeango.com\nchembible.com\nchembk.com\nchemcd.com\nchemchina.com\nchemcp.com\nchemcyber.com\nchemdodgen.com\nchemdrug.com\nchememall.com\nchemfish.com\nchemgogo.com\nchemi-tech.com\nchemicalbook.com\nchemicalreagent.com\nchemingpian.com\nchemishequ.com\nchemm.com\nchemmade.com\nchemmerce.com\nchemmuseum.com\nchemnet.com\nchemourscg.com\nchempacific-china.com\nchemptc.com\nchemrc.com\nchemsrc.com\nchemtour.com\nchemwells.com\nchemwith.com\nchemyouth.com\nchemyq.com\nchen-design.com\nchen.fun\nchenag.com\nchenall.net\nchenapp.com\nchenbo.info\nchenduaomei.com\nchener.net\nchenfan.info\ncheng-sen.com\ncheng.xin\nchengaizixun.com\nchengan-web.com\nchengan.tech\nchengbanggroup.com\nchengcai.net\nchengchuanren.com\nchengde-jz.com\nchengdebank.com\nchengdegj.com\nchengdegroup.com\nchengdewater.com\nchengdu-expat.com\nchengduair.com\nchengdubao.com\nchengdufanyi.com\nchengdun.com\nchengdurail.com\nchengduzhishang.com\nchengegeya.com\nchenger0711.com\nchengezhao.com\nchengfankj.com\nchengfeilong.com\nchengfengboli.com\nchengfengerlai.com\nchenggnet.com\nchenggongguiji.com\nchenghai.cc\nchenghct.com\nchenghen.com\nchenghua888.com\nchenghuijituan.com\nchenghuiqian.xyz\nchengji-inc.com\nchengjianjituan.com\nchengjing.com\nchengjinholdinggroup.com\nchengkao365.com\nchenglang.net\nchenglangyun.com\nchenglil.com\nchenglin.name\nchenglinpak.com\nchenglispv.com\nchengliwang.com\nchengloongcishan.org\nchenglou.net\nchengmei.games\nchengmeiyouxuan.com\nchengpeiquan.com\nchengrang.com\nchengrengaokaobaoming.com\nchengrenjiaoyu1.com\nchengruide.com\nchengshan.com\nchengshidingxiang.com\nchengshiguanjia.com\nchengshijun.com\nchengshu.com\nchengsmart.com\nchengtaijiaju.com\nchengtay.com\nchengtianxiajy.com\nchengtiexinxi.com\nchengtongjz.com\nchengtu.com\nchengwei.com\nchengweitx.com\nchengxiangqian.com\nchengxiangzhineng.com\nchengxiaoliu.com\nchengxingjicj.com\nchengxinyouxuan.com\nchengxua.com\nchengxuan.com\nchengyangyang.com\nchengye-capital.com\nchengyi.press\nchengyitex.com\nchengyouyun.com\nchengyuanwenquan.com\nchengyucidian.net\nchengyun.com\nchengyuwan.com\nchengzhaoxi.xyz\nchengzhinj.com\nchengzijianzhan.com\nchengzivr.com\nchenhe.cc\nchenhe.me\nchenhr.com\nchenhuangxun.com\nchenhui.org\nchenjia.me\nchenjiehua.me\nchenjinghealth.com\nchenjt.com\nchenkeiot.com\nchenksoft.com\nchenlb.com\nchenlianfu.com\nchenliangroup.com\nchenlinux.com\nchenlinzuwu.com\nchenlong.com\nchenmingpaper.com\nchenmomo.com\nchennianyoupin.com\nchenpe.com\nchenplus.com\nchenpon.com\nchenpot.com\nchenroot.com\nchenruixuan.com\nchenruo.net\nchens.life\nchenshipin.com\nchensuyang.com\nchenva.com\nchenwenwl.com\nchenxiao.cc\nchenxin99.com\nchenxinghb.com\nchenxingweb.com\nchenxisoft.com\nchenxm.cc\nchenxuehu.com\nchenxuhou.com\nchenxunyun.com\ncheny.org\nchenyang.com\nchenyanghg.com\nchenyea.com\nchenyifaer67373.com\nchenyistyle.com\nchenyongqi.com\nchenyou123.com\nchenyu.me\nchenyudong.com\nchenyuemz.com\nchenyuwulian.com\nchenyuxia.com\nchenyyds.com\nchenzao.com\nchenzhicheng.com\nchenzhongkj.com\nchenzhongtech.com\ncheonhyeong.com\ncheoo.com\ncheoz.com\ncherentec.com\ncheriexsky.love\ncherry-ai.com\nchervonauto.com\nchervongroup.com\ncheryholding.com\ncheryjaguarlandrover.com\ncherylalopes.com\ncherymanuals.com\ncheshenghuo.com\ncheshi-img.com\ncheshi.com\ncheshi111.com\ncheshi18.com\ncheshijie.com\ncheshipin.com\ncheshirex.com\ncheshizh.com\nchesicc.com\nchesicc.net\nchesir.com\nchesir.net\nchesono.com\nchessease.net\nchestercharles.com\nchesthospital.com\nchesudi.com\nchetiansi.com\nchetodeng.com\nchetuanwang.net\nchetuobang.com\nchetx.com\nchetxia.com\nchetxt.com\nchevip.com\nchevlen.com\ncheweiguanjia.com\nchewen.com\nchewulin.com\nchexian9.com\nchexiancha.com\nchexiang.com\nchexiaoliang.net\nchexinmeng.com\nchexiu.com\nchextx.com\nchexun.com\nchexun.net\ncheyaoshi.com\ncheyian.com\ncheyipai.com\ncheyishang.com\ncheyisou.com\ncheyou123.com\ncheyuan.com\ncheyun.com\ncheyuu.com\nchezhanri.com\nchezhibao.com\nchezhubidu.com\nchezhutech.com\nchezhuzhinan.com\nchezizhu.com\nchezvi.com\nchfsmartad.com\nchgcw.com\nchghouse.org\nchgi.net\nchgie.com\nchglmp.com\nchgreenway.com\nchgry.com\nchgzfls.com\nchhqtest.com\nchhua.com\nchhuc.org\nchhw.com\nchhzm.com\nchi2ko.com\nchi588.com\nchi86.com\nchianbaohan.com\nchibanting.com\nchichuang.com\nchickfrp.com\nchiconysquare.com\nchicopharm.com\nchida.org\nchidafeiji.com\nchidaolian.com\nchidaoni.com\nchidaoni.net\nchidaotv.com\nchidd.net\nchidowl.com\nchidudata.com\nchidutech.com\nchiefmore.com\nchiefpharma.com\nchieftin.org\nchietom.com\nchihao.com\nchihe.so\nchihealbio.com\nchiheba.com\nchiheshan.com\nchihkao.com\nchihm.com\nchiji-h5.com\nchiji.app\nchildjia.com\nchildlib.org\nchildrentheatre.org\nchileaf.com\nchili3d.com\nchillyroom.com\nchilwee.com\nchimboon.com\nchimbusco.com\nchimelong.com\nchimezi.com\nchimoph.com\nchin-fine.com\nchina-10.com\nchina-3.com\nchina-315.com\nchina-aa.org\nchina-ah.com\nchina-anhe.com\nchina-asahi.com\nchina-aseanbis.com\nchina-audit.com\nchina-autotech.com\nchina-b.com\nchina-baiyun.com\nchina-bdh.com\nchina-bee.com\nchina-bicycle.com\nchina-biding.com\nchina-bluestar.com\nchina-bme.com\nchina-borun.com\nchina-boy.org\nchina-boya.com\nchina-caihua.com\nchina-cale.com\nchina-capsule.com\nchina-cas.org\nchina-cba.net\nchina-cbn.com\nchina-cbs.com\nchina-ccc.org\nchina-ccie.com\nchina-ccii.com\nchina-ccw.com\nchina-cdig.com\nchina-cdt.com\nchina-ceco.com\nchina-ced.com\nchina-ceec-cooperation.com\nchina-cet.com\nchina-cfa.org\nchina-chair.com\nchina-channel.com\nchina-chca.org\nchina-chigo.com\nchina-cicc.org\nchina-citytour.com\nchina-clearing.com\nchina-cloud.com\nchina-cmca.org\nchina-cmd.org\nchina-cnic.com\nchina-co.com\nchina-coc.org\nchina-consulate.org\nchina-core.com\nchina-cotton.org\nchina-cpu.co\nchina-cpu.com\nchina-cri.com\nchina-csm.org\nchina-cssc.org\nchina-denox.com\nchina-designer.com\nchina-dingjie.com\nchina-drama.com\nchina-drm.net\nchina-dt.com\nchina-dtv.com\nchina-eaea.com\nchina-ecee.com\nchina-eia.com\nchina-embassy.org\nchina-engine.net\nchina-entercom.com\nchina-enterprise.com\nchina-epa.com\nchina-erzhong.com\nchina-fangyuan.com\nchina-fei.com\nchina-feininger.com\nchina-fire.com\nchina-fishery.com\nchina-flash.com\nchina-flower.com\nchina-futian.com\nchina-g.com\nchina-galaxy-inv.com\nchina-gehang.com\nchina-genius.com\nchina-gg.com\nchina-giant.com\nchina-gnd.com\nchina-goffen.com\nchina-gold.com\nchina-goldcard.com\nchina-greenfund.com\nchina-greenlighting.com\nchina-gwy.com\nchina-hechang.com\nchina-hengyuan.com\nchina-hhsj.com\nchina-highway.com\nchina-holiday.com\nchina-hongfei.com\nchina-house.com\nchina-hp.com\nchina-hrg.com\nchina-htdl.com\nchina-huamin.com\nchina-huazhou.com\nchina-hulong.com\nchina-hushan.com\nchina-hxzb.com\nchina-hzd.com\nchina-iace.com\nchina-ida.com\nchina-inse.com\nchina-invests.net\nchina-ipif.com\nchina-isotope.com\nchina-j.com\nchina-jianan.com\nchina-jinlong.com\nchina-jit.com\nchina-jlt.com\nchina-jm.org\nchina-jxcf.com\nchina-kaidiwt.com\nchina-kaihua.com\nchina-kaoshi.com\nchina-key.com\nchina-khgroup.com\nchina-kids-expo.com\nchina-kids-fair.com\nchina-kingmold.com\nchina-knobs.com\nchina-lantu.com\nchina-latv.com\nchina-lawoffice.com\nchina-led.net\nchina-light-guides.com\nchina-lithium.com\nchina-liye.com\nchina-logistics.com\nchina-longgong.com\nchina-lottery.net\nchina-lsh.com\nchina-m2m.com\nchina-mcc.com\nchina-mile.com\nchina-moutai.com\nchina-mt.org\nchina-mx.net\nchina-nengyuan.com\nchina-nlp.com\nchina-nns.com\nchina-norbin.com\nchina-npa.org\nchina-nsftz.com\nchina-obgyn.net\nchina-office-solutions.com\nchina-orientgroup.com\nchina-oulu.com\nchina-pa.org\nchina-packcon.com\nchina-payments.com\nchina-pcba.com\nchina-pengye.com\nchina-pharmacy.com\nchina-pinyuan.com\nchina-planet.com\nchina-pub.com\nchina-qiao.com\nchina-qjbz.org\nchina-radiology.com\nchina-re.net\nchina-refrigerants.com\nchina-ric.com\nchina-riscv.com\nchina-russia.org\nchina-sand.com\nchina-sce.com\nchina-sea.net\nchina-season.com\nchina-security.com\nchina-see.com\nchina-seeq.com\nchina-sfc.com\nchina-shancun.com\nchina-shimo.com\nchina-shjyx.com\nchina-shufan.com\nchina-shugaung.net\nchina-sites.com\nchina-slate.com\nchina-smartech.com\nchina-sorsa.org\nchina-soyea.com\nchina-spirulina.net\nchina-springs.com\nchina-sss.com\nchina-stainless.com\nchina-sunshine.com\nchina-sz.com\nchina-thk.com\nchina-tin.com\nchina-tisense.com\nchina-tje.com\nchina-tongyu.com\nchina-topplus.com\nchina-tops.com\nchina-tower.com\nchina-toy-expo.com\nchina-train.net\nchina-tsac.com\nchina-uju.com\nchina-up.com\nchina-valve.com\nchina-vcom.com\nchina-vision.org\nchina-vn.com\nchina-vo.org\nchina-wanlin.com\nchina-warping.com\nchina-waste.com\nchina-weldnet.com\nchina-whwaterexpo.com\nchina-ws.org\nchina-wss.com\nchina-xb.com\nchina-xcsy.com\nchina-xian.com\nchina-xiba.com\nchina-xiuzheng.com\nchina-xzgec.com\nchina-xzkg.com\nchina-yaguang.com\nchina-yansheng.com\nchina-yd.com\nchina-yiang.com\nchina-yida.com\nchina-yinda.com\nchina-yintai.com\nchina-yongfeng.com\nchina-yt-expo.com\nchina-yuanfang.com\nchina-yuli.com\nchina-yxt.com\nchina-zbycg.com\nchina-zeiss.com\nchina-zhongda.net\nchina-zikao.com\nchina-zjj.net\nchina-zrg.com\nchina-zysj.com\nchina.com\nchina.mintel.com\nchina000799.com\nchina001.com\nchina12345.net\nchina12365.com\nchina124.com\nchina17.net\nchina1baogao.com\nchina1f.com\nchina2000.org\nchina3-15.com\nchina30s.com\nchina35.com\nchina356.com\nchina3gpp.com\nchina4a.org\nchina5e.com\nchina60.com\nchina6688.com\nchina724.com\nchina777.org\nchina918.org\nchina95.com\nchina95.net\nchina95.xyz\nchina9y.com\nchinaab.com\nchinaacc.com\nchinaacme.net\nchinaacryl.com\nchinaadec.com\nchinaadren.com\nchinaadvance.com\nchinaaeri.com\nchinaaet.com\nchinaagrisci.com\nchinaags.net\nchinaagv.com\nchinaahth.com\nchinaairer.com\nchinaamc.com\nchinaant.com\nchinaant.net\nchinaarabcf.org\nchinaaris.com\nchinaartificialstone.com\nchinaasaservice.com\nchinaasc.org\nchinaaseanenv.org\nchinaaseanfertilizer.com\nchinaasic.com\nchinaath.com\nchinaautoms.com\nchinaautoregs.com\nchinaautosupplier.com\nchinaave.org\nchinaaviationdaily.com\nchinab4c.com\nchinababy365.com\nchinabac.com\nchinabaike.com\nchinabaiker.com\nchinabancai.com\nchinabaoan.com\nchinabaogao.com\nchinabashan.com\nchinabattery.org\nchinabbtravel.com\nchinabdh.com\nchinabeego.com\nchinabeer.net\nchinabencaogangmu.com\nchinabenson.com\nchinabesteasy.com\nchinabeston.com\nchinabeverage.org\nchinabgao.com\nchinabge.com\nchinabid315.com\nchinabidding.cc\nchinabidding.com\nchinabiddingzb.com\nchinabigdata.com\nchinabigwin.com\nchinabike.net\nchinabim.com\nchinabird.org\nchinablackcat.com\nchinablowers.com\nchinabmi.com\nchinabn.org\nchinabooktrading.com\nchinaboyun.com\nchinabreed.com\nchinabrightstone.com\nchinabsb.com\nchinabuildingcentre.com\nchinabulk.com\nchinabus.info\nchinabuses.com\nchinabuy1002.com\nchinabxwx.com\nchinabym.com\nchinabyte.com\nchinabzp.com\nchinac.com\nchinac3.com\nchinacable.com\nchinacace.org\nchinacache.com\nchinacache.net\nchinacacm.org\nchinacaj.net\nchinacamel.com\nchinacapac.com\nchinacapg.com\nchinacarbide.com\nchinacars.com\nchinacasa.org\nchinacatel.com\nchinacba.org\nchinaccia.com\nchinaccm.com\nchinaccsi.com\nchinacct.org\nchinacdc.com\nchinacdnb2b.com\nchinacelacforum.org\nchinacenn.com\nchinacentrifuge.com\nchinaceot.com\nchinaceotv.com\nchinacfa.com\nchinacfi.net\nchinacfo.net\nchinacft.org\nchinacge.com\nchinachangbo.com\nchinachangfang.com\nchinachant.com\nchinachaoyang.com\nchinacharityfederation.org\nchinachemnet.com\nchinachild.org\nchinachina.net\nchinachugui.com\nchinachuntian.com\nchinacib.com\nchinacid.org\nchinacie.org\nchinacil.com\nchinacir.com\nchinacity.net\nchinacitywater.org\nchinacld.com\nchinaclean.org\nchinacleanexpo.com\nchinacljt.com\nchinacma.org\nchinacmo.com\nchinacoal.com\nchinacoatingnet.com\nchinacoffee.vip\nchinacomix.com\nchinaconch.com\nchinacondiment.com\nchinaconsulatesf.org\nchinaconsun.com\nchinaconveyor.com\nchinacordblood.org\nchinacosco.com\nchinacourt.org\nchinacpda.com\nchinacpda.org\nchinacqme.com\nchinacqpgx.com\nchinacqsb.com\nchinacraa.org\nchinacrane.net\nchinacrankshaft.com\nchinacreator.com\nchinacrops.org\nchinacrosspoint.com\nchinacrt.com\nchinacses.org\nchinacsf.com\nchinactv.com\nchinaculture.org\nchinacustomsdata.com\nchinacxjs.org\nchinacyx.com\nchinadachi.com\nchinadafen.com\nchinadafeng.com\nchinadaily.net\nchinadailyglobal.com\nchinadais.net\nchinadaja.com\nchinadance.com\nchinadart.com\nchinadas.net\nchinadatapay.com\nchinadatatrading.com\nchinadbs.com\nchinaddn.com\nchinaddos.com\nchinadds.net\nchinadentalshow.com\nchinadep.com\nchinadewei.com\nchinadforce.com\nchinadianji.com\nchinadianming.com\nchinadidao.com\nchinadipl.com\nchinadjba.com\nchinadkec.com\nchinadmoz.org\nchinadns.com\nchinadns.org\nchinadongchu.com\nchinadougong.com\nchinadra.com\nchinadrtv.com\nchinadrum.net\nchinadsl.net\nchinaduo.com\nchinadyt.com\nchinadz.com\nchinadzfp.com\nchinadzyl.com\nchinae.net\nchinaeastlaw.com\nchinaebizal.com\nchinaebr.com\nchinaecnet.com\nchinaeda.org\nchinaedu.com\nchinaedu.net\nchinaedunet.com\nchinaedunewsw.com\nchinaefu.net\nchinaega.com\nchinaehs.net\nchinaeia.org\nchinaeinet.com\nchinaeinv.com\nchinaejiao.com\nchinaembassy.at\nchinaepoxy.com\nchinaepu.com\nchinaequity.net\nchinaerdos.com\nchinaerospace.com\nchinaesf.net\nchinaeshare.com\nchinaesm.com\nchinaet.net\nchinaev100.com\nchinaeve.com\nchinaexam.org\nchinaexpo365.com\nchinaexpressair.com\nchinafa.org\nchinafangxing.com\nchinafarad.com\nchinafarming.com\nchinafashionbao.com\nchinafasten.com\nchinafastpcb.com\nchinafbdq.com\nchinafcx.com\nchinafeiting.com\nchinafert-gov.com\nchinaffmpeg.com\nchinafga.org\nchinafiber.com\nchinafic.org\nchinafilm.com\nchinafilmhy.com\nchinafilms.net\nchinafinancenet.com\nchinafinanceonline.com\nchinafininfo.com\nchinafishtv.com\nchinafix.com\nchinaflashmarket.com\nchinaflier.com\nchinafolklore.org\nchinafoma.com\nchinafoodj.com\nchinafoodsltd.com\nchinaforklift.com\nchinafpd.net\nchinafph.com\nchinafpma.org\nchinafranchiseexpo.com\nchinafruitime.com\nchinafsl.com\nchinaftat.org\nchinafuda.com\nchinafudaoban.com\nchinafumao.com\nchinafxd.com\nchinafxkj.com\nchinag.pro\nchinagames.net\nchinagayles.com\nchinagb.net\nchinagb.org\nchinagba.com\nchinagcl.com\nchinagdda.com\nchinagdn.com\nchinaghwl.com\nchinagiftsfair.com\nchinaglassnet.com\nchinagoldcoin.net\nchinagoldgroup.com\nchinagongcheng.com\nchinagoods.com\nchinagosun.com\nchinagp.net\nchinagpay.com\nchinagps.cc\nchinagrandauto.com\nchinagrandinc.com\nchinagrazia.com\nchinagreenbio.com\nchinagreentown.com\nchinagrid.net\nchinagrowthcapital.com\nchinagslb.com\nchinagslb.net\nchinagsrc.com\nchinagungho.org\nchinaguohuan.com\nchinaguyao.com\nchinagwy.com\nchinagwy.net\nchinagwy.org\nchinagwyw.org\nchinagzn.com\nchinahacker.com\nchinahaixun.com\nchinaham.com\nchinahanang.com\nchinahao.com\nchinahaochuan.com\nchinaharp.com\nchinahazelnut.com\nchinahbj.com\nchinahbjob.com\nchinahengying.com\nchinahho.com\nchinahhxh.com\nchinahighnew.com\nchinahightech.com\nchinahighto.com\nchinahighway.com\nchinahiron.com\nchinahiron.ltd\nchinahiyou.com\nchinahj.club\nchinahkidc.net\nchinahky.com\nchinahnjs.com\nchinahongdu.net\nchinahonghui.net\nchinahongying.com\nchinahorologe.com\nchinahorse.org\nchinahosesupply.com\nchinahotelgz.com\nchinahpa.org\nchinahqjjw.com\nchinahr.com\nchinahrd.net\nchinahrt.com\nchinahsdp.com\nchinahte.com\nchinahtz.com\nchinahualai.com\nchinahuashan.com\nchinahuaxicun.com\nchinahuaxue.com\nchinahuben.com\nchinahudong.com\nchinahugong.com\nchinahuizhanjie.com\nchinahumo.com\nchinahvacr.com\nchinahw.net\nchinahylq.com\nchinahyyj.com\nchinahzkj.com\nchinaiat.com\nchinaiatb.org\nchinaidcnet.com\nchinaidcnet.net\nchinaido.com\nchinaidr.com\nchinaief.net\nchinaielts.org\nchinaiern.com\nchinaiia.org\nchinaiiss.org\nchinainfoseek.com\nchinainout.com\nchinainput.net\nchinainsbrokers.com\nchinaiol.com\nchinaiprlaw.com\nchinairn.com\nchinairport.net\nchinait.vip\nchinaitcapital.com\nchinaitlab.com\nchinaiut.com\nchinajan.com\nchinajcz.com\nchinajeweler.com\nchinajfj.com\nchinajienuo.com\nchinajierda.com\nchinajinguo.com\nchinajinlong.com\nchinajinsheng.com\nchinajinzhan.com\nchinajinzhou.com\nchinajiuquan.com\nchinajj.org\nchinajjz.com\nchinajnhb.com\nchinajoiner.net\nchinajorson.net\nchinajoy.net\nchinajs120.com\nchinajsc.com\nchinajsjmxh.com\nchinajsxx.com\nchinajungong.com\nchinajuva.com\nchinajyhj.com\nchinajyjxh.com\nchinajyxdh.com\nchinajyy.net\nchinajzqc.com\nchinakab.com\nchinakangping.com\nchinakangyue.com\nchinakaoyan.com\nchinakeon.com\nchinakewei.com\nchinakidville.com\nchinakiln.net\nchinakingho.com\nchinakingland.com\nchinakingo.com\nchinakinzo.com\nchinaklb.com\nchinakong.com\nchinakongzi.org\nchinakqn.com\nchinakshx.com\nchinaksi.com\nchinakuangshi.com\nchinakyzl.com\nchinalabexpo.com\nchinalabs.com\nchinalahigh.com\nchinalancoo.com\nchinalandpress.com\nchinalanhua.com\nchinalao.com\nchinalaobao.com\nchinalawbook.com\nchinalawedu.com\nchinalawinfo.com\nchinalawyer.co\nchinalawyeryn.com\nchinaleather.com\nchinaleather.org\nchinaledger.com\nchinalep.org\nchinalibs.net\nchinalicensing.org\nchinalicensingexpo.com\nchinalifang.com\nchinalims.net\nchinalingshan.com\nchinalink.tv\nchinalions.com\nchinaliriver.com\nchinalive.com\nchinaliyou.com\nchinalm.org\nchinalonghu.com\nchinalowcarb.com\nchinalpharm.com\nchinalsjt.com\nchinalubricant.com\nchinalulutong.com\nchinalure.com\nchinalushan.com\nchinaluxury.net\nchinalww.com\nchinalxnet.com\nchinamadas.com\nchinamae.com\nchinamags.org\nchinamani.com\nchinamaohong.com\nchinamap.com\nchinamaven.com\nchinambn.com\nchinamca.com\nchinamcache.com\nchinamcloud.com\nchinamea.org\nchinameat.net\nchinamedicinej.com\nchinamendu.com\nchinamenwang.com\nchinamerger.com\nchinametro.net\nchinameyer.com\nchinamie.org\nchinamingyan.net\nchinamining.com\nchinamission.be\nchinamissun.com\nchinamobile.com\nchinamobiledevice.com\nchinamobileltd.com\nchinamost.net\nchinamotian.com\nchinamsa.org\nchinamssp.com\nchinamuscle.org\nchinamusical.net\nchinamwh.com\nchinamworld.com\nchinamypp.com\nchinananda.com\nchinananyang.com\nchinanbb.com\nchinanet-sh.com\nchinanet.cc\nchinanet88.com\nchinanetcenter.com\nchinanetidc.com\nchinanetsun-dns.com\nchinanetsun.com\nchinanev.net\nchinaneweast.com\nchinanewera.com\nchinanewkey.com\nchinanews.com\nchinanim.com\nchinaningbo.com\nchinanmi.com\nchinanrb.com\nchinanums.com\nchinanwa.com\nchinaobp.com\nchinaoceanwide.com\nchinaoct.com\nchinaoly.com\nchinaomp.com\nchinaonebuild.com\nchinaonstreetparking.com\nchinaonward.net\nchinaopc.org\nchinaopen.com\nchinaopticsvalley.com\nchinaore.com\nchinaorff.com\nchinaorff.org\nchinaorganicchem.com\nchinaorientgroup.com\nchinaott.com\nchinaott.net\nchinapag.com\nchinapandi.com\nchinapanocean.com\nchinapantheum.com\nchinapantom.com\nchinapaper.net\nchinaparking.org\nchinapastel.com\nchinapay.com\nchinapayhongkong.com\nchinapbw.com\nchinapcd.com\nchinape168.com\nchinapearlk.com\nchinapeier.com\nchinapelletizer.com\nchinapeople.com\nchinapet.com\nchinapet.net\nchinapharm.net\nchinaphp.com\nchinaphper.com\nchinapilotage.org\nchinapipe.net\nchinapiston.com\nchinaplasonline.com\nchinaplat.com\nchinapm.org\nchinapnr.com\nchinaportrait.org\nchinaports.com\nchinapost-life.com\nchinapoto.com\nchinapower.org\nchinapowerbi.com\nchinapp.com\nchinapp.net\nchinapsy.com\nchinapubmed.net\nchinapuleather.com\nchinapusirui.com\nchinapv.org\nchinaqcb.com\nchinaqfc.com\nchinaqi.net\nchinaqigong.com\nchinaqikan.com\nchinaqingtian.com\nchinaqipeihui.com\nchinaqjydxh.com\nchinaql.org\nchinaqoe.net\nchinaquickpcb.com\nchinaqunsheng.com\nchinaqw.com\nchinaray-oled.com\nchinarayying.com\nchinarca.com\nchinardr.com\nchinardr.net\nchinaredstar.com\nchinaredsun.com\nchinareform.net\nchinarem.org\nchinaren.com\nchinarenzhi.com\nchinaresin.com\nchinarespiratory.org\nchinarjw.com\nchinarta.com\nchinartlaw.com\nchinaruiji.com\nchinarun.com\nchinarunau.com\nchinarzfh.com\nchinasaat.com\nchinasalestore.com\nchinasanbai.com\nchinasanc.com\nchinasantian.com\nchinasareview.com\nchinasatcom.com\nchinasbm-eet.com\nchinasbm.com\nchinasciencejournal.com\nchinascope.com\nchinascopefinancial.com\nchinascpjy.com\nchinascrap.com\nchinascsoft.com\nchinasecuritization.org\nchinaseed114.com\nchinasexq.com\nchinasg.com\nchinashadt.com\nchinashenglu.com\nchinashengmao.com\nchinashj.com\nchinashop.cc\nchinashpp.com\nchinashunyi.com\nchinasia.org\nchinasie.com\nchinasigma.com\nchinasiia.com\nchinasilk.com\nchinasilkmuseum.com\nchinasilver.hk\nchinasinew.com\nchinasinging.com\nchinasiwei.com\nchinaslc.com\nchinasmartpay.com\nchinasmcc.com\nchinasmp.com\nchinasnow.net\nchinasnto.com\nchinasnw.com\nchinaso.com\nchinasoftbank.com\nchinasofti.com\nchinasoftinc.com\nchinasoftosg.com\nchinasooa.com\nchinasoushang.com\nchinaspringtown.com\nchinasrg.com\nchinasrif.com\nchinassbc.com\nchinassl.com\nchinassl.net\nchinasspp.com\nchinastarlogistics.com\nchinastationeryfair.com\nchinasti.com\nchinastoneforest.com\nchinasufa.com\nchinasunglow.com\nchinasuntree.com\nchinasupercloud.com\nchinasuperwool.com\nchinaswa.org\nchinaswim.com\nchinaswimmer.com\nchinasws.com\nchinasydw.org\nchinaszma.com\nchinataa.org\nchinatai.com\nchinatairun.com\nchinataitan.com\nchinataiwan.org\nchinatalent.org\nchinatalentgroup.com\nchinatat.com\nchinatechie.com\nchinatechie.net\nchinatechinsights.com\nchinatelecom-h.com\nchinatelecom.com.hk\nchinatelecom.com.mo\nchinatelecomglobal.com\nchinatelecomhk.com\nchinatelecomiot.com\nchinatelling.com\nchinatet.com\nchinatex.com\nchinatex.net\nchinatex.org\nchinatg.com\nchinathinksbig.com\nchinatianyin.com\nchinatibetnews.com\nchinaticket.com\nchinatikfans.com\nchinatimber.org\nchinatimes.cc\nchinatiner.com\nchinatiredealer.com\nchinatla.com\nchinatle.com\nchinatlzm.com\nchinatmco.com\nchinatongjia.com\nchinatopbrands.net\nchinatoplon.com\nchinatourguide.com\nchinatpm.com\nchinatpm.net\nchinatrace.org\nchinatranslation.net\nchinatravel.net\nchinatravelacademy.com\nchinatraveldepot.com\nchinatruck.org\nchinatrucks.com\nchinatsi.com\nchinatsp.com\nchinatt.com\nchinattas.com\nchinattl.com\nchinatungsten.com\nchinatupai.com\nchinatv-net.com\nchinatyco.com\nchinatypical.com\nchinau.cc\nchinaufo.com\nchinaui.com\nchinauidesign.com\nchinauma.com\nchinaums.com\nchinaun.net\nchinaunicom-a.com\nchinaunicom.com\nchinaunicom.com.hk\nchinaunicomglobal.com\nchinaunionpay.com\nchinaunionpay.net\nchinauniversalasset.com\nchinaunix.com\nchinaunix.net\nchinaunix.org\nchinauo.com\nchinauos.com\nchinauos.net\nchinaups.com\nchinaus.com\nchinauwei.com\nchinava.net\nchinavalin.com\nchinavas.com\nchinavcpe.com\nchinavfx.net\nchinavid.com\nchinavideo.org\nchinavideos.net\nchinaviewstone.com\nchinaviolin.net\nchinavipsoft.com\nchinavisual.com\nchinavivers.com\nchinaviwon.com\nchinavr.net\nchinawanbang.com\nchinawanda.com\nchinawanlitrans.com\nchinawatchnet.com\nchinawaterexpo.com\nchinawatertech.com\nchinawch.com\nchinawebber.com\nchinawebmap.com\nchinaweiyu.com\nchinaweizheng.com\nchinawepon.com\nchinawerewolf.com\nchinawie.com\nchinawindnews.com\nchinawinjoy.com\nchinawiserv.com\nchinawitmedia.com\nchinawr.net\nchinaws.net\nchinawssdxh.com\nchinawudang.com\nchinawulong.com\nchinawutong.com\nchinawutong.net\nchinawuyuan.com\nchinawxfoundry.com\nchinaxiaokang.com\nchinaxidian.com\nchinaxinge.com\nchinaxingye.com\nchinaxinhuaair.com\nchinaxinport.com\nchinaxintu.com\nchinaxinzhi.com\nchinaxiuqi.com\nchinaxiv.com\nchinaxiv.net\nchinaxiv.org\nchinaxpp.com\nchinaxq.com\nchinaxqf.com\nchinaxuchuan.com\nchinaxuehang.com\nchinaxueqian.com\nchinaxwcb.com\nchinaxy.com\nchinaxzrc.com\nchinayacht.org\nchinayadea.com\nchinayanghe.com\nchinayanming.com\nchinayaojiang.com\nchinayarn.com\nchinaybx.com\nchinaygj.com\nchinayigui.com\nchinayikangyaoye.com\nchinayinyi.com\nchinayis.com\nchinayishuhua.com\nchinaymc.com\nchinayms.com\nchinayongfa.com\nchinayoubang.com\nchinayounao.com\nchinayouthpower.org\nchinays.com\nchinayuanwang.com\nchinayucai.com\nchinayulin.com\nchinayunlang.com\nchinayuns.com\nchinayuqiu.com\nchinayyhg.com\nchinayyjx.com\nchinaz.com\nchinaz.net\nchinazbd.com\nchinazbj.com\nchinazh.net\nchinazhifu.com\nchinazhijiang.com\nchinazhz.com\nchinazikao.com\nchinazipper.org\nchinazjgc.com\nchinazjph.com\nchinazjy.com\nchinazkjc.com\nchinazmhb.com\nchinaznj.com\nchinazns.com\nchinaznyj.com\nchinazov.com\nchinazsgroup.com\nchinaztg.com\nchinazwds.com\nchinazxjc.com\nchinazxt.com\nchinazy.org\nchinca.org\nchindices.com\nchine-info.com\nchinee.com\nchinemiss.com\nchinese-no1.com\nchinese315.org\nchineseacc.com\nchineseafs.org\nchineseall.com\nchinesechip.com\nchinesecio.com\nchineseconsulate.org\nchineseembassy.org\nchinesehongker.com\nchinesejk.com\nchineselaw.com\nchineselighting.org\nchinesemale.com\nchinesemedical.net\nchinesemeter.com\nchinesemooc.org\nchinesemoocs.org\nchinesepaper-cut.com\nchineserose.com\nchinesetown.net\nchingan.com\nchingkun.com\nchingli.com\nchingmi.com\nchinjpd.com\nchinlingo.com\nchinrt.com\nchinsc.com\nchint.com\nchint.net\nchintanneng.com\nchintautomation.com\nchintautoparts.com\nchintcable.com\nchintim.com\nchinulture.com\nchip37.com\nchipcoo.com\nchipcreation.com\nchipdance.com\nchipdebug.com\nchipeasy.com\nchiphell.com\nchiphometek.com\nchiplayout.net\nchipmanufacturing.org\nchiponeic.com\nchipown.com\nchippacking.com\nchipsbank.com\nchipsec.com\nchipsgo.com\nchipsir.com\nchipup.com\nchipwing.com\nchipyun.com\nchiralquest.com\nchisage.com\nchisai.tech\nchisc.net\nchishine3d.com\nchishoes.com\nchitic.com\nchitu.com\nchitudexiaozhi.com\nchitus.com\nchivast.com\nchivox.com\nchivoxapp.com\nchiway-repton.com\nchiwayedu.com\nchiwayind.com\nchiwigogo.com\nchixia.com\nchixm.com\nchixuyun.com\nchiyanjiasu.com\nchiyekeji.com\nchiyifen.com\nchiyufeng.com\nchizao.com\nchizhou.cc\nchizhoubus.com\nchizhouchacha.com\nchizhouhospital.com\nchizhoujob.com\nchizhouren.com\nchiznews.com\nchj-care.com\nchjchina.com\nchjgg.com\nchjiye.com\nchjso.com\nchjyw.org\nchkee.com\nchkschool.com\nchlingkong.com\nchlmfm.com\nchlmiao.com\nchloe99.com\nchlxj.com\nchmc.cc\nchmecc.org\nchmed.net\nchmgames.com\nchmia.org\nchmod0777kk.com\nchmti.com\nchn-cstc.com\nchn-das.com\nchn-new-9sport.com\nchn0769.com\nchn112.com\nchn168.com\nchnart.com\nchnau99999.com\nchnbook.org\nchnboxing.com\nchnbsg.com\nchnchi.com\nchncia.org\nchncomic.com\nchncon.com\nchncopper.com\nchncpa.org\nchncwds.com\nchndaqi.com\nchndeli.com\nchndesign.com\nchndoi.com\nchndoi.net\nchndoi.org\nchnews.net\nchnfi.com\nchnfund.com\nchngalaxy.com\nchngc.net\nchngsl.com\nchnjet.com\nchnlanker.com\nchnmed.com\nchnmodel.com\nchnmus.net\nchnmusic.org\nchnpac.com\nchnpec.com\nchnppmuseum.com\nchnpush.com\nchnqiang.com\nchnqifeng.com\nchnqsedu.com\nchnrailway.com\nchnroad.com\nchnso.com\nchnsuv.com\nchntel.com\nchnxw.com\nchocei.com\nchofei.com\nchofn.com\nchofn.net\nchofn.org\nchofnipr.com\nchoiceform.com\nchomixbiotech.com\nchong4.net\nchongbuluo.com\nchongchi.com\nchongdawang.com\nchongdeedu.com\nchongdiantou.com\nchongdk.net\nchongdugou.net\nchonger.org\nchongfabianli.com\nchongguanglawfirm.com\nchongjisyj.com\nchongjiyashiji.com\nchongkongwang999.com\nchongmingzhuce.com\nchongnengjihua.com\nchongqingbbs.com\nchongqingdongjin.com\nchongqingrenpin.com\nchongqingyoupin.com\nchongqu.com\nchongso.com\nchongsoft.com\nchongwenwen.com\nchongwu.cc\nchongwudian.com\nchongwujiaoyi.com\nchongwunet.com\nchongya.vip\nchongyejia.com\nchongyike.com\nchongyitang.org\nchongyunpowu.com\nchongzhi.com\nchongzuo.club\nchonka.com\nchontdoled.com\nchonton.com\nchoosepickhere.com\nchoositon.com\nchooway.com\nchopetto.com\nchosign.com\nchoubag.com\nchouchoujiang.com\nchouchoumao.com\nchoujue.net\nchoukang.com\nchoupangxia.com\nchouqu.com\nchouti.com\nchoututech.com\nchowtaiseng.com\nchplayer.com\nchq360.com\nchrent.com\nchrice.net\nchrieschina.com\nchristophero.xyz\nchrmn.com\nchroad.com\nchrome64.com\nchrome666.com\nchromecj.com\nchromedownloads.net\nchromefor.com\nchromegw.com\nchromeliulanqi.com\nchromezj.com\nchronusartcenter.org\nchrstatic.com\nchs.pub\nchs5e.com\nchsbs.com\nchsdl.com\nchsdpharma.com\nchsgw.com\nchshcms.com\nchshsaas.com\nchsmarttv.com\nchsndt.org\nchspra.com\nchspv.com\nchste.com\nchszzy.com\nchtcmotor.com\nchtf.com\nchtfund.com\nchtgc.com\nchtjf.com\nchtmxp.com\nchtpe.com\nchtwm.com\nchu-ying.com\nchu0.com\nchu110.com\nchu21.com\nchu58.com\nchua.pro\nchuairan.com\nchuaizhe.com\nchualamdimsum.com\nchuan-s.com\nchuanbojiang.com\nchuanboyi.com\nchuandaizc.com\nchuandasolar.com\nchuandong.com\nchuang-fan.com\nchuang-pin.com\nchuangansou.com\nchuangcache.com\nchuangcdn.com\nchuangchangnet.com\nchuangchenwangluo.com\nchuangcifang.com\nchuangdaxx.com\nchuangduyouyue.com\nchuangen.com\nchuangfeixin.com\nchuanggallery.com\nchuanghe.net\nchuanghui-cn.com\nchuangjiangx.com\nchuangjie.com\nchuangjing.com\nchuangkem.com\nchuangkeup.com\nchuangkit.com\nchuanglan.com\nchuangli.net\nchuanglian.net\nchuanglinggame.com\nchuangliukeji.com\nchuangluo.com\nchuangmaoshanghai.com\nchuangmei8.com\nchuangongsi.com\nchuangseo.com\nchuangshiwl.com\nchuangshiyuli.com\nchuangtie.com\nchuangtoo.com\nchuangx.org\nchuangxin.com\nchuangxinapi.com\nchuangxinbateng.com\nchuangxinoa.com\nchuangxuan.xyz\nchuangyebaba.com\nchuangyehai.com\nchuangyejia.com\nchuangyetv.com\nchuangyijisu.com\nchuangyimao.com\nchuangyiqifu.com\nchuangyisai.com\nchuangyiwh.com\nchuangyouqi.com\nchuangyuan.ltd\nchuangyuejoy.com\nchuangzaoshi.com\nchuangzuoniu.com\nchuanhai.net\nchuanhuan.com\nchuanjiaoban.com\nchuanke.com\nchuanloo.com\nchuanmeixing.com\nchuannan.net\nchuanpuyun.com\nchuanqi.com\nchuanqiart.com\nchuanqibbs.com\nchuanshanjia.work\nchuanshanqundao.com\nchuansong.me\nchuansongme.com\nchuantangjitrade.com\nchuantec.com\nchuantiegroup.com\nchuantu88.com\nchuanxincao.net\nchuanye.com\nchuanyejinxuan.xyz\nchuanyifu.com\nchuanyinet.com\nchuanying365.com\nchuanying520.com\nchuanyuanbang.com\nchuanyuapp.com\nchuanzhen.com\nchuapp.com\nchuasu.com\nchuban.cc\nchubanyun.me\nchubaohui.com\nchucheng.wiki\nchuchujie.com\nchuchur.com\nchufaba.me\nchufw.com\nchuge8.com\nchugou360.com\nchuguo.tech\nchuguo78.com\nchuguohao.com\nchuguoqu.com\nchuhai.group\nchuhaige.com\nchuhailiqi.com\nchuimg.com\nchuinet.com\nchuisax.com\nchuishen.xyz\nchuixue.com\nchuiyue.com\nchujian.xyz\nchujing-electric.com\nchujingapp.com\nchujuan.net\nchujunkeji.com\nchukong-inc.com\nchukonggame.com\nchukou1.com\nchukouplus.com\nchuleg.com\nchumenwenwen.com\nchun-wang.com\nchun-xiang.com\nchunbo.com\nchunboimg.com\nchundi.com\nchundi.org\nchunengauto.com\nchunfengapp.com\nchunfengxing.com\nchungkwong.cc\nchunhaijx.com\nchunhingplasticbags.com\nchunhuinongye.com\nchunjiangvalve.com\nchunjingban.net\nchunlan.com\nchunliangpai.com\nchunliao.net\nchunloo.com\nchunmen.com\nchunmi.com\nchunqiuhong.com\nchunsheng.com\nchunshuitang.com\nchunshuizhijia.com\nchunsuns.com\nchuntaoyisheng.com\nchuntsuan.com\nchunxing-group.com\nchunxuanmao.com\nchunxudianqi.com\nchunyiscdk.com\nchunyu.me\nchunyu.mobi\nchunyuyisheng.com\nchunzuo.com\nchuoemg.work\nchuolitech.com\nchuquan.me\nchurenjixie.com\nchuruisy.com\nchusan.com\nchusenscm.com\nchuseo.com\nchushan.com\nchushang027.com\nchushi.cool\nchushihome.com\nchushiji.com\nchushixiu.com\nchushou.tv\nchushu.org\nchushu123.com\nchutianlaser.com\nchutianzhinu.com\nchuxindata.com\nchuxingpay.com\nchuxingyouhui.com\nchuxinhd.com\nchuxinhudong.com\nchuxinvip.com\nchuxueyun.com\nchuyaer.com\nchuyigao.com\nchuyu.me\nchuzhaobiao.com\nchvacuum.com\nchvoice.com\nchw818.com\nchwang.com\nchwedu.com\nchwlsq.com\nchxchips.com\nchxent.com\nchxin-oil.com\nchxq.org\nchxyl.com\nchxyq.com\nchyitech.com\nchysoft.net\nchyw.pub\nchyxx.com\nchyyyygl.com\nchz.cc\nchzhkeji.com\nchzhsw.com\nchzhw.com\nchzpw.com\nchzsks.com\nchzwater.com\nchzybj.com\nci-cn.com\nci-du.com\nci-ele.com\nci-xing.com\nci123.com\nci800.com\nciaie.com\ncialisrxmsn.com\nciallo.cc\nciaoca.com\nciapst.org\nciaxkzxy.com\ncibaike.com\ncibawl.com\ncibfintech.com\ncibia.org\ncibn-intl.com\ncibn.cc\ncibn.com\ncibnlive.com\ncibnott.net\ncibntv.net\ncibnvst.com\nciboedu.org\ncibonet.com\ncibresearch.com\ncibuser.com\ncic-js.com\ncicadayun.com\ncicaf.com\ncicba.net\ncicc.com\nciccfund.com\ncicconline.com\nciccphoto.com\nciccwargame.com\nciccwm.com\nciceme.com\ncicfexpo.com\ncicg.tech\nciciec.com\ncicihappy.com\ncicmag.com\ncicnn.com\ncicoe.net\ncicphoto.com\ncict.com\ncidf.net\ncidi.ai\ncidianbao.com\ncidiancn.com\ncidianso.com\nciding.cc\ncidschina.com\nciduw.com\ncie-lgr.com\ncieaast.com\nciec-expo.com\nciec.com\nciect.com\nciecte.com\nciecworld.com\nciedata.com\ncieet.com\nciepe.com\ncietac-hb.org\ncietac-sc.org\ncietac.org\nciezn.com\ncifa-china.com\ncifalshanghai.org\ncifco.net\nciff-gz.com\ncifm.com\ncifnews.com\ncifoo.com\nciftis.org\ncig-cq.com\ncigadesign.com\ncigarambassador.com\ncigh.com\ncignacmb-ipmi.com\ncignacmb.com\ncignacmbamc.com\ncignacmbuser.com\ncigtech.com\nciguang.com\ncih-index.com\ncihai123.com\ncihexpo.com\ncihua.net\nciiccq.com\nciicgat.com\nciichr.com\nciicjs.com\nciicsh.com\nciidoo.com\nciie.org\nciif-expo.com\nciiip.com\nciiplat.com\ncijiasu.com\ncijiyun.com\ncikelink.com\ncilgroup.org\nciliba.life\ncilin.org\ncilishenqi.cc\ncilogo.com\ncim2025.net\ncimamotor.com\ncimc-tianda.com\ncimc.com\ncimccity.com\ncimcdlem.com\ncimcjm.com\ncimclogistics.com\ncimcreefertrailer.com\ncimcvehiclesgroup.com\ncimen.club\ncimic.com\ncimicgroup.com\ncimictiles.com\nciming-bj.com\nciming-sh.com\nciming.com\ncimingaoya.com\ncimingbj.com\ncimingsy.com\ncimsic.com\ncimtshow.com\ncinacom.net\ncinasoft.com\ncindaflc.com\ncindasc.com\ncindasoft.com\ncinehello.com\ncineplexsn.com\ncingta.com\nciniao.me\ncinic.com\ncinsee.com\ncinsos.com\ncio114.com\ncio360.net\ncioage.com\ncioln.help\nciomp-cggc.com\nciopharma.com\nciotimes.com\nciotour.com\nciou.com\ncioxom-top.com\ncip.cc\ncipgtrans.com\ncipherupcloud.com\nciplawyer.com\ncippe.net\nciprun.com\ncipscom.com\ncipukj.com\ncipunited.com\ncircday.com\ncircleharmonyhealth.com\ncirclelog.com\ncircuitboardchips.com\ncirmall.com\ncirrowings.com\ncirs-ck.com\ncirs-group.com\ncirs-reach.com\ncirscn.com\ncisbeijing.com\nciscon.org\ncisdish.com\ncisgz.com\ncisia.org\ncismef.com\ncisskwt.com\ncistds.org\ncistsports.com\ncisuntech.com\ncit168.com\ncitahub.com\ncitaq.com\nciteaexample.com\ncitegalleries.com\ncitexpo.org\ncitgc.com\ncitiais.com\ncitic-wealth.com\ncitic.com\nciticbank.com\nciticbankuser.com\nciticcapital.com\nciticcard.com\nciticdameng.com\nciticenvirotech.com\nciticfunds.com\nciticguoanbn.com\ncitichmc.com\nciticiam.com\nciticifh.com\nciticleasing.com\nciticnetworks.com\ncitics.com\ncitics.com.hk\nciticsf.com\nciticsinfo.com\nciticsteel.com\ncitie-gd.com\ncitiraise.com\ncitisa.org\ncitiz.net\ncitizenmech.com\ncitreport.com\ncits-jl.com\ncits-sz.net\ncitsbj.com\ncitscq.com\ncitscsc.com\ncitsgbt.com\ncitsgs.com\ncitsguilin.com\ncitshq.com\ncitsp.net\ncitsqd.net\ncitssh.com\ncitswx.com\ncitsxa.com\ncitsyn.com\ncitszz.com\ncitvc.com\ncity12580.com\ncity199.com\ncity8.com\ncity8090.com\ncitybrain.com\ncitygf.com\ncityhui.com\ncityhuitech.com\ncitylinker.com\ncityoncenter.com\ncityos.com\ncitypaly.com\ncitys114.com\ncitysbs.com\ncitysz.net\ncitytogo.com\ncityup.org\ncitywy.com\nciunofor.com\ncivicswarm.com\ncivigas.com\ncivilizec.com\ncivilness.com\nciviw.com\nciweek.com\nciweekforum.com\nciweekly.com\nciwei.net\nciweimao.com\nciweishixi.com\nciweiyuedui.com\nciwong.com\nciwong.net\nciwork.net\ncixcomputing.com\ncixibank.com\ncixiedu.net\ncixtech.com\ncixuanfuw.com\nciyagroup.com\nciyew.com\nciyitech.com\nciyocon.com\nciyoga.org\nciyuan.men\nciyuanji.com\nciyuans.com\nciyun.link\nciyynodegroup.cyou\ncizip.com\ncj0515.com\ncj120.com\ncj5bs.com\ncj5bs.net\ncj8.ren\ncjaljs.com\ncjasen.com\ncjavapy.com\ncjbeng.com\ncjbjedu.com\ncjbxt.com\ncjccb.com\ncjchina.net\ncjcn.com\ncjdcw.com\ncjdg.com\ncjdropshipping.com\ncjdsp.com\ncjeduw.com\ncjftb.com\ncjhospital.com\ncjhxfund.com\ncjhydrogen.com\ncjia.com\ncjiahome.com\ncjienc.com\ncjiit.com\ncjitri.com\ncjj365.cc\ncjjd01.com\ncjjd02.com\ncjjd03.com\ncjjd04.com\ncjjd05.com\ncjjd06.com\ncjjd07.com\ncjjd08.com\ncjjd09.com\ncjjd10.com\ncjjd11.com\ncjjd12.com\ncjjd13.com\ncjjd14.com\ncjjd15.com\ncjjd16.com\ncjjd17.com\ncjjd18.com\ncjjd19.com\ncjjd20.com\ncjjhb.com\ncjjhk.com\ncjjjs.com\ncjjnff.com\ncjk3d.net\ncjkhd.com\ncjkihgroup.com\ncjkjks.com\ncjkt.com\ncjkz.com\ncjlap.com\ncjlulu.com\ncjm.so\ncjmit.com\ncjmr.org\ncjmx.com\ncjmxhedu.com\ncjn.com\ncjnas.com\ncjnis.com\ncjol.com\ncjrcsc.com\ncjs-lwh.love\ncjsc.com\ncjsgegs.com\ncjshipin.net\ncjsic.com\ncjslcg.com\ncjspd.com\ncjsy.net\ncjsyedu.com\ncjtl.com\ncjtmsp.com\ncjtouzi.com\ncjveg.com\ncjwcjyy.com\ncjwlb.com\ncjww.com\ncjx2.com\ncjxqjt.com\ncjxz.com\ncjycode.com\ncjys.net\ncjyun.org\ncjyy6789.com\ncjyyw.com\ncjzcb.com\ncjzcgl.com\ncjzsy.com\ncjzww.com\ncjzx.net\ncjzzc.com\nck-coinmcap.lol\nck0771.com\nck100.com\nck180.net\nck586.com\nck830.com\nck921.com\nckair.com\nckan.tv\nckbv165.org\nckd-mbd.com\nckd.im\nckd.so\nckd8.com\nckdzb.com\nckefu.com\nckernel.org\nckeyan17.com\nckeyan17.net\nckeyedu.com\nckfxx.com\nckhdvt.com\nckia.org\nckimg.com\nckj100.com\nckj1000.com\nckjr001.com\nckjryy.com\nckpharm.com\nckplayer.com\nckqjyjq.xyz\ncksct.com\ncksic.com\ncksschool.com\ncksx.org\ncktqeiau.com\ncktshare.com\nckuai.com\nckvmrtfg.com\nckw205.com\nckweax9zn5.com\nckxx.net\nckzcc.com\nckzhaoyaojing.com\nckzhijiaedu.com\ncl-acg.com\ncl-kongtiao.com\ncl-power.com\ncl0438.com\ncl0579.com\ncl2009.com\ncl868.com\nclady.cc\nclam-itc.com\nclamc.com\nclamptek.com\nclangcn.com\nclangtx.com\nclanzx.net\nclapreptile.com\nclaritywallpaper.com\nclarivate.com\nclashroyaleapp.com\nclassa-z.com\nclasscms.com\nclassic023.com\nclassinpaas.com\nclassix-unlimited.co.uk\nclassmateer.com\nclasspassincn.com\nclasspod.com\nclasspodcdn.com\nclaviercn.com\nclawchat.com\nclawhub-mirror.com\nclay-wangzhi.com\nclayidols.com\nclb6.net\nclboss.com\nclbu.club\nclbug.com\nclbz666.com\nclcgq.com\nclcindex.com\nclclibrary.com\nclcoolyun.com\nclcs.cc\nclcwwyj.com\nclcz.com\ncldfsv.com\ncldisk.com\nclean-cn.com\ncleandfd.com\ncleanupsys.com\nclear-sz.com\nclear888.com\nclearaki.com\nclearcrane.com\ncleargrass.com\nclearmediatech.com\nclearofchina.com\nclearsky360.com\ncleartone.club\nclevercn.net\ncleveroom.com\nclewm.net\nclfcgc.com\nclfdked.icu\nclfile.com\nclfzsn.com\nclgcxs.com\nclgslc.com\nclhimalayanxx.com\nclhqcyx.com\ncli.im\nclianjie.com\nclickfuntech.com\nclicksdiy.com\nclickserve.cc-dt.com\nclicksun.net\nclickwifi.net\nclidone.com\nclient.amplifi.com\nclient51.com\nclientperipherals.dell.com\nclifford-hospital.org\ncliffordtrading.com\ncliim.com\ncliim.net\nclijc.com\nclimedic.com\nclinbrain.com\nclivia.fun\nclj178.com\ncljport.com\ncljtscd.com\ncljtwr.com\ncljtzycw.com\nclk1.top\nclled.com\ncllk.net\nclloz.com\nclmpg.com\nclngaa.com\ncloopen.com\ncloopen.net\ncloopm.com\ncloseli.work\nclosertb.site\nclothes178.com\nclothinggg.store\nclothjob.com\nclothr.com\nclotliu.com\nclouclip.com\ncloud-b2b.com\ncloud-beijing.com\ncloud-control.top\ncloud-dahua.com\ncloud-dns.net\ncloud-frame.com\ncloud-hebi.com\ncloud-hub.co\ncloud-industry-delivery.site\ncloud-link.com\ncloud-links.net\ncloud-neofussvr.sslcs.cdngc.net\ncloud-ningbo.com\ncloud-ordos.com\ncloud-rtc.com\ncloud-rtc.net\ncloud-scdn-ns.net\ncloud-scdn-ns.tech\ncloud-scdn.com\ncloud-shenzhen.com\ncloud-shiyan.com\ncloud-sun.com\ncloud-wuhan.com\ncloud-xian.com\ncloud-xm.com\ncloud-zhaoqing.com\ncloud-zhongwei.com\ncloud21cn.com\ncloud301.net\ncloud56.net\ncloud887325.com\nclouda.com\ncloudacc1.com\ncloudacc1.net\ncloudajs.org\ncloudangelfunds.com\ncloudanqing.com\ncloudappl.com\ncloudbaoshan.com\ncloudbase.net\ncloudbeibei.com\ncloudbility.com\ncloudbinzhou.com\ncloudbool.com\ncloudcachetci.com\ncloudcc.com\ncloudcdn.net\ncloudcdns.com\ncloudcdns.net\ncloudcdnvip.com\ncloudcflare.com\ncloudchangde.com\ncloudchangsha.com\ncloudchangzhou.com\ncloudchaozhou.com\ncloudchengde.com\ncloudchengdu.com\ncloudchinese.com\ncloudchuzhou.com\ncloudcross.com\ncloudcsp.com\ncloudczs.com\nclouddalian.com\nclouddatong.com\nclouddcs.com\nclouddiffuse.xyz\nclouddig.com\nclouddn.com\nclouddongying.com\nclouddream.net\ncloudencent.com\ncloudflare-cn.com\ncloudflare.fun\ncloudflareanycast.net\ncloudflarecn.net\ncloudflareglobal.net\ncloudflareinsights-cn.com\ncloudflareip.com\ncloudflareperf.com\ncloudflareprod.com\ncloudflarestaging.com\ncloudflarestoragegw.com\ncloudfoshan.com\ncloudfront-cn.net\ncloudfuqing.com\ncloudganzhou.com\ncloudgap.net\ncloudgfw.com\ncloudgfw.net\ncloudgoing.com\ncloudguangzhou.com\ncloudguarding.com\ncloudgx.net\ncloudhaidong.com\ncloudhefei.com\ncloudhengshui.com\ncloudhin.com\ncloudhlo.com\ncloudhost.link\ncloudhua.com\ncloudhuaihua.com\ncloudhuizhou.com\ncloudhvacr.com\ncloudidaas.com\ncloudinnov.com\ncloudinward.com\ncloudiplc.com\ncloudjinan.com\ncloudjinchang.com\ncloudjingzhou.com\ncloudjining.com\ncloudjiujiang.com\ncloudkirin.com\ncloudkunming.com\ncloudleshan.com\ncloudlijiang.com\ncloudlishui.com\ncloudluohe.com\ncloudluoyang.com\ncloudlvs.com\ncloudmarket-apigw.com\ncloudmaster.hk\ncloudmeishan.com\ncloudmes.io\ncloudminds.com\ncloudmob.vip\ncloudmob.xyz\ncloudmountainproducts.com\ncloudnanan.com\ncloudnanjing.com\ncloudnanning.com\ncloudnantong.com\ncloudnapps.com\ncloudnet.world\ncloudnetb2b.com\ncloudouc.com\ncloudp.cc\ncloudpense.com\ncloudpnr.com\ncloudquanzhou.com\ncloudrmt.com\ncloudroom.com\nclouds1000.com\ncloudsanya.com\ncloudsation.com\ncloudsconverge.com\ncloudsec1.com\ncloudsec1.net\ncloudsee.com\ncloudsee.net\ncloudseeplus.com\ncloudseetech.com\ncloudserver01.com\ncloudses.com\ncloudsgis.com\ncloudshanghai.com\ncloudshaoyang.com\ncloudshenfuxingqu.com\ncloudsigma.com\ncloudsiping.com\ncloudsite.vip\ncloudskysec.com\ncloudstencent.com\ncloudstudio-app.net\ncloudstudio.club\ncloudstudio.net\ncloudstudio.run\ncloudstudio.work\ncloudsuqian.com\ncloudswift.cloud\ncloudtalkers.com\ncloudtangshan.com\ncloudtencents.com\ncloudtianjin.com\ncloudtomicro.com\ncloudtongchuan.com\ncloudtongliang.com\ncloudtopo.com\ncloudtrans.com\ncloudtui.com\ncloudv.cdnetworks.com\ncloudvast.com\ncloudvdn.com\ncloudvogue.com\ncloudvse.com\ncloudwalk.com\ncloudweinan.com\ncloudwise.ai\ncloudwise.com\ncloudxiangtan.com\ncloudxianyou.com\ncloudxining.com\ncloudxns.com\ncloudxns.net\ncloudyanan.com\ncloudyancheng.com\ncloudyantai.com\ncloudyee.com\ncloudyinchuan.com\ncloudyo.net\ncloudyouku.com\ncloudytrace.com\ncloudytrace.org\ncloudyueyang.com\ncloudyuncheng.com\ncloudyuxi.com\ncloudzhongshan.com\ncloudzhuhai.com\nclpcdn.com\nclpga.org\nclqccy.com\nclqcgsgw.com\nclqctxc.com\nclqrmyy.com\nclroi.com\ncls-a.com\ncls-c.com\ncls.cc\nclsa.com\nclsbhs.com\nclsgd.com\nclshanghai.com\nclsj.com\nclsshare.com\nclssn.com\nclssnews.com\nclsz-group.com\nclto.cc\ncltt.org\nclub-pc.com\nclubcarev.com\nclubhy.com\nclubske.com\ncluerich.com\nclx360.com\nclxlb.com\nclxsbj.com\nclxsczx.com\nclyiyuan.com\nclz.me\nclzd.com\nclzd.fun\nclzqm.com\nclzqxp.com\nclzt.com\nclzyqche.com\ncm-health.com\ncm-inv.com\ncm-iov.com\ncm-worklink.com\ncm.fancyapi.com\ncm.ipinyou.com\ncm233.com\ncm3721.com\ncm442.com\ncmacredit.org\ncmaif.com\ncmaifz.com\ncmakaoj.com\ncmandroid.com\ncmanuf.com\ncmastd.com\ncmb-leasing.com\ncmbajia.com\ncmbchina.biz\ncmbchina.com\ncmbchina.net\ncmbchinawm.com\ncmbi.com.hk\ncmbimg.com\ncmbuat.com\ncmbwinglungbank.com\ncmbwlb.com\ncmbyc.com\ncmca-view.com\ncmcc.in\ncmccb2b.com\ncmcconenet.com\ncmccsim.com\ncmcgd.com\ncmcha.org\ncmcink.com\ncmcloud.org\ncmclound.com\ncmcm.com\ncmcmadmin.com\ncmcmapp.com\ncmcmcdn.com\ncmcmcmai.com\ncmcmiot.com\ncmcmpc.com\ncmcmsecurity.com\ncmcmserv.com\ncmcmtrans.com\ncmco-cn.com\ncmcrcw.com\ncmct.tv\ncmct22.com\ncmctea.net\ncmd.tw\ncmd5.com\ncmd5.la\ncmd5.org\ncmd8.com\ncmda-ccs.com\ncmda.net\ncmdcxls.com\ncmdpe.com\ncmdschool.org\ncmdsir.com\ncmdw.vip\ncme-am.com\ncme-cq.com\ncme021.com\ncmea-crtc.com\ncmec.com\ncmechina.net\ncmedia360.com\ncmedns.com\ncmeii.com\ncmejob.com\ncmenergyshipping.com\ncmer-ningbo.com\ncmer.com\ncmerdi.com\ncmersz.com\ncmes.org\ncmf.biz\ncmf.ltd\ncmfchina.com\ncmfish.com\ncmfspay.com\ncmft.com\ncmfu.com\ncmfwiper.com\ncmgadx.com\ncmgame.com\ncmgchengdu.com\ncmgdb.com\ncmge.com\ncmgemooc.com\ncmgn.cc\ncmgos.com\ncmgrasp.com\ncmhello.com\ncmhijs.com\ncmhk.com\ncmic.site\ncmicapm.com\ncmidc.net\ncming.com\ncmiotcd.com\ncmiyu.com\ncmjz.net\ncmlog.com\ncmltzz.com\ncmmaap.com\ncmmchn.com\ncmmim.com\ncmnetech.com\ncmnxt.com\ncmo2o.com\ncmoc.com\ncmodel.com\ncmodes.com\ncmol.com\ncmpay.com\ncmpe360.com\ncmpedu.com\ncmpo1914.com\ncmr-co.com\ncmread.com\ncmreltd.com\ncmri.cc\ncmrid.com\ncms1924.org\ncms258.com\ncmschina.com\ncmscmc.org\ncmseasy.cc\ncmsfg.com\ncmsjournal.net\ncmsk1979.com\ncmskchp.com\ncmskcrm.com\ncmsta.org\ncmstop.com\ncmstp.com\ncmswin.com\ncmt1993.com\ncmt7.com\ncmtauto.com\ncmtdi.com\ncmtopdr.com\ncmtrq.com\ncmtv1.com\ncmu1h.com\ncmudental.com\ncmugx.com\ncmuliang.com\ncmviking.com\ncmvtc.com\ncmwb.com\ncmwin.com\ncmxrcw.com\ncmykjx.net\ncmypsc.com\ncmys.cc\ncmyunerp.com\ncmyynet.com\ncmzd.com\ncmzi.com\ncmzj.net\ncmzyk.com\ncn-5.com\ncn-833.org\ncn-ab.com\ncn-aci.com\ncn-bldc.com\ncn-bowei.com\ncn-boxing.com\ncn-c114.net\ncn-caa.com\ncn-cav.com\ncn-cddc.com\ncn-cdn1.skymansion.net\ncn-ceramic.com\ncn-cg.com\ncn-chenguang.com\ncn-comfort.com\ncn-cr.com\ncn-elite.com\ncn-em.com\ncn-ferment.com\ncn-food.net\ncn-ghtube.com\ncn-goldeneagle.com\ncn-hbs.com\ncn-healthcare.com\ncn-healthclass.com\ncn-heipa.com\ncn-huaguang.com\ncn-huar.com\ncn-hw.net\ncn-immunotech.com\ncn-kanghong.com\ncn-lance.net\ncn-lcd.com\ncn-lingte.com\ncn-lq.net\ncn-mingda.com\ncn-msedge.net\ncn-mw.com\ncn-natural.com\ncn-only.com\ncn-psy.com\ncn-railway.net\ncn-rcqc.com\ncn-roofexpert.com\ncn-school.com\ncn-sdf.com\ncn-shine.com\ncn-soft.com\ncn-tf.com\ncn-tom.com\ncn-truck.com\ncn-unitech.com\ncn-vending.com\ncn-visa.com\ncn-weida.com\ncn-wisely.com\ncn-witmed.com\ncn-xsl.com\ncn-zhentai.com\ncn-zhongrui.com\ncn.bing.com\ncn.bing.net\ncn.download.nvidia.com\ncn.eset.com\ncn.mm.bing.net\ncn.net\ncn.online.standardchartered.com\ncn.pool.ntp.org\ncn.sc.com\ncn.vc\ncn.widevine.com\ncn.windowssearch.com\ncn0-6.com\ncn006.com\ncn010w.com\ncn0434.com\ncn0577.net\ncn0713.com\ncn0851.com\ncn0917.com\ncn11185.com\ncn12365.org\ncn156.com\ncn168.com\ncn18k.com\ncn2030.com\ncn22.net\ncn2che.com\ncn2rv.com\ncn314.com\ncn357.com\ncn360cn.com\ncn365a.com\ncn365c.com\ncn365d.com\ncn365e.com\ncn3wm.com\ncn486.com\ncn49.com\ncn4e.com\ncn51.com\ncn5135.com\ncn6szx.com\ncn88.net\ncn880.com\ncn939.com\ncn99.com\ncnaaa.com\ncnaaa.net\ncnaaa6.com\ncnaaa7.com\ncnaaa8.com\ncnaaa9.com\ncnaai.com\ncnaca.org\ncnacg.cc\ncnacgc.com\ncnaction.com\ncnad.com\ncnaf.com\ncnafc.org\ncnagcoin.com\ncnaidc.com\ncnaifm.com\ncnain.online\ncnaio.net\ncnaiplus.com\ncnair.com\ncnaja.com\ncnal.com\ncnalu.com\ncnambition.com\ncname-cdn.com\ncname-syd.com\ncname123.net\ncname88.com\ncnamegslb.com\ncnameip.xyz\ncnamexingzuoy.com\ncnamico.com\ncnanzhi.com\ncnaomeng.com\ncnatom.com\ncnats.com\ncnautofinance.com\ncnautonews.com\ncnautotool.com\ncnb.cool\ncnb.run\ncnb.space\ncnbabylon.com\ncnball.net\ncnbang.net\ncnbaosi.com\ncnbaowen.net\ncnbct.org\ncnbeinuo.com\ncnbeta.com\ncnbetacdn.com\ncnbfjt.com\ncnbidding.com\ncnbio.net\ncnbiocell.com\ncnbis.com\ncnbis.org\ncnbizmedia.com\ncnbjx.com\ncnbksy.com\ncnbkw.com\ncnblogs.com\ncnblogs.vip\ncnblower.com\ncnbm-njks.com\ncnbmltd.com\ncnbmtech.com\ncnbmys.com\ncnbnl.com\ncnboat.com\ncnbonly.com\ncnbooking.net\ncnbooks.org\ncnbp.net\ncnbrass.com\ncnbsm.com\ncnbugs.com\ncnbuses.com\ncnbysc.com\ncnbzol.com\ncnbzs.com\ncnc-bga-oca.com\ncnc-gd.net\ncnc-school.com\ncnca.net\ncncad.net\ncncaifu.com\ncncame.com\ncncanghai.com\ncncapital.net\ncncapital.org\ncncbinternational.com\ncncbpc.com\ncncc.bingj.com\ncnccac.com\ncnccchina.com\ncnccdn.com\ncnccea.com\ncncdh2.com\ncncdn.com\ncncdnx.com\ncncdomain.com\ncncecci.com\ncncecsci.com\ncncecyc.com\ncncfans.com\ncncflux.com\ncncgdns.com\ncncgdns.net\ncncgw.org\ncnchainnet.com\ncnchangyi.com\ncnchaowei.com\ncnchemmy.com\ncncheng.com\ncnchezhan.com\ncnchospital.com\ncnchu.com\ncncico.com\ncncjichuang.com\ncncjishu.com\ncncjj.com\ncncjmjg.com\ncnclead.com\ncncljt.com\ncncloud.com\ncncma.org\ncncmrn.com\ncncms.com\ncncmun.com\ncncn.com\ncncn.net\ncncnbd.com\ncncncn.com\ncncnet.net\ncncnki.com\ncncolour.com\ncncompute.com\ncncoolm.com\ncncopter.com\ncncosmic.com\ncncotton.com\ncncourt.org\ncncovs.com\ncncqcloud.com\ncncqcy.com\ncncqsw.com\ncncqti.com\ncncr-it.com\ncncrk.com\ncncrony.com\ncncruise.com\ncncrypt.com\ncncsen.com\ncncsj.net\ncncsparetools.com\ncnctg.net\ncnction.com\ncnctrip.com\ncncwkj.com\ncncxjyu.com\ncndailu.com\ncndao.com\ncndata.com\ncndatacom.com\ncndbl.com\ncndc-pl.com\ncndcpta.com\ncndds.com\ncndelong.com\ncndesign.com\ncndesk.com\ncndezhong.com\ncndf.net\ncndfdt.com\ncndfele.com\ncndfilm.com\ncndhl.com\ncndhotels.com\ncndi-bj.com\ncndi.com\ncndids.com\ncndingli.com\ncndingxi.com\ncndits.com\ncndl.vip\ncndledu.com\ncndmaterial.com\ncndns.com\ncndns5.com\ncndnscn.com\ncndoct.com\ncndog.net\ncndongrun.com\ncndongxiao.com\ncndoornet.com\ncndoors.com\ncndqjc.com\ncndrealty.com\ncndsnet.com\ncndtour.com\ncndw.com\ncndy.org\ncndzh.com\ncndzq.com\ncndzys.com\ncne-motor.com\ncne-om.com\ncne.com\ncnean.com\ncnecc.com\ncnechc.com\ncnecport.com\ncnedulaw.net\ncneeex.com\ncnegood.com\ncnegov.com\ncnegov.org\ncnelc.com\ncnelecom.net\ncnelite.org\ncneln.net\ncnemb.com\ncnena.com\ncneol-dns.net\ncneonl.com\ncnep001.com\ncnepaper.com\ncnepaper.net\ncnepub.com\ncnerlang.com\ncnetea.net\ncnetec.com\ncnetsec.com\ncnexp.net\ncnexpo.com\ncnexps.com\ncneyoo.com\ncnezsoft.com\ncnfanews.com\ncnfantasia.com\ncnfarasia.com\ncnfashion.net\ncnfca.com\ncnfce.net\ncnfcyy.com\ncnfczn.com\ncnfczy.com\ncnfeat.com\ncnfeol.com\ncnfeol.net\ncnfg.cc\ncnfia.com\ncnfiberhome.com\ncnfin.com\ncnfina.com\ncnfirst.net\ncnfish.com\ncnfisher.com\ncnfjwz.com\ncnfla.com\ncnflyinghorse.com\ncnfol.com\ncnfolimg.com\ncnfood.com\ncnforever.com\ncnforex.com\ncnfosale.com\ncnfpc.com\ncnfpia.org\ncnfpzz.com\ncnfq.com\ncnfrag.com\ncnfrey.com\ncnfrp.com\ncnfrp.net\ncnfruit.com\ncnfth.com\ncnfuhuaqi.com\ncnfuyin.org\ncnfxc.com\ncnfxj.org\ncnfyyj.com\ncnfzflw.com\ncngal.org\ncnganen.com\ncngaosu.com\ncngaoxiu.com\ncngb.org\ncngba.com\ncngbdl.com\ncngbol.net\ncngdhl.com\ncngin.com\ncngjtx.com\ncngma.com\ncngold.org\ncngoldres.com\ncngolf.tv\ncngongfu.com\ncngrain.com\ncngreatop.com\ncngreenfield.com\ncngsda.net\ncngsf.com\ncngslb.com\ncngslb.net\ncnguangxing.com\ncnguibao.com\ncnguibie.com\ncngulu.com\ncngwv.com\ncngwzj.com\ncngxbj.com\ncngxjy.com\ncngxsmj.com\ncngyff.com\ncngyi.com\ncnh5.net\ncnhacker.com\ncnhaifan.com\ncnhalo.net\ncnhanjia.com\ncnhantide.com\ncnhanxing.com\ncnhaomen.com\ncnhaoshengyi.com\ncnhbql.com\ncnhbstock.com\ncnhbtc.com\ncnhcb.com\ncnhd.com\ncnheader.com\ncnhemiao.com\ncnhenda.com\ncnhengkai.com\ncnhhgjx.com\ncnhhl.com\ncnhiger.com\ncnhiker.com\ncnhis.cc\ncnhis.com\ncnhli.com\ncnhls.com\ncnhlsxe.com\ncnhnb.com\ncnhongke.org\ncnhonker.com\ncnhow.net\ncnhqt.com\ncnhsjz.com\ncnhsw.net\ncnhszx.com\ncnhuafag.com\ncnhuafas.com\ncnhuanya.com\ncnhubei.com\ncnhuoche.com\ncnhvacrnet.com\ncnhwjt.com\ncnhyc.com\ncnhyjt.com\ncnhyky.com\ncnhzsc.com\ncnhzz.com\ncniao5.com\ncnibx.com\ncniceberg.com\ncnicif.com\ncnielts.com\ncniiib.com\ncnimg.elex.com\ncnimporter.com\ncninfo.net\ncninj.com\ncninnovatel.com\ncninsure.net\ncninternetdownloadmanager.com\ncnios.net\ncnipa-gd.com\ncnipa-hb.com\ncnipa-pesc.com\ncnipa-sc.com\ncnipa-tj.com\ncnipai.com\ncnipr.com\ncnirtrade.com\ncnispgroup.com\ncnitblog.com\ncniteyes.com\ncniti.com\ncnitom.com\ncnitpm.com\ncnitv.net\ncnix.cc\ncnjccrusher.com\ncnjdz.net\ncnjecc.com\ncnjf.com\ncnjffb.com\ncnjfsilk.com\ncnjgtec.com\ncnjhyg.com\ncnjiajun.com\ncnjiali.com\ncnjiaolian.com\ncnjingchu.com\ncnjingtong.com\ncnjingyigroup.com\ncnjiuze.com\ncnjiwang.com\ncnjj.com\ncnjjwb.com\ncnjkzxw.com\ncnjlc.com\ncnjnsb.com\ncnjob.com\ncnjournals.com\ncnjournals.net\ncnjournals.org\ncnjp-exp.com\ncnjpetr.org\ncnjrna.com\ncnjsdz.com\ncnjsun.com\ncnjunhe.com\ncnjunnet.com\ncnjunzilan.com\ncnjurry.com\ncnjurui.com\ncnjxl.com\ncnjxol.com\ncnjyky.com\ncnjyw.net\ncnjzb.com\ncnjzgroup.com\ncnk8.com\ncnkaile.com\ncnkang.com\ncnkanshu.com\ncnkefa.com\ncnkeg.com\ncnkesai.com\ncnkeyboard.com\ncnkgraph.com\ncnkh.com\ncnki.net\ncnki.vip\ncnkicheck.info\ncnkidoi.com\ncnkidoi.net\ncnkidoi.org\ncnkinect.com\ncnkingjoy.com\ncnkis.net\ncnkivip.net\ncnkix.com\ncnkizw.com\ncnklog.com\ncnkly.com\ncnknowledge.com\ncnkosun.com\ncnkpgs.com\ncnkuai.com\ncnky.net\ncnkyz.com\ncnlampholder.com\ncnlandport.com\ncnlang.org\ncnlanhui.com\ncnlanling.com\ncnlaunch.com\ncnlaw.net\ncnlawweb.net\ncnlcg.com\ncnldedu.com\ncnldzc.com\ncnledw.com\ncnlianjie.com\ncnliequan.com\ncnlight.com\ncnlightnet.com\ncnlinka.com\ncnlishuai.com\ncnlist.com\ncnlist.org\ncnlive.com\ncnliveimg.com\ncnljxh.com\ncnlng.com\ncnlongkou.net\ncnlot.net\ncnlso.com\ncnluan.com\ncnlubadd.com\ncnluolun.com\ncnlushan.com\ncnlwg.com\ncnmagtec.com\ncnmanhua.com\ncnmansi.com\ncnmarathon.net\ncnmarinefan.com\ncnmattson.com\ncnmcl.net\ncnmdy.com\ncnmec.biz\ncnmeiwei.com\ncnmf.net\ncnmhg.com\ncnmhh.work\ncnmia.org\ncnmie.com\ncnmill.com\ncnmineqs.net\ncnminiorange.com\ncnmjcn.com\ncnmjcn.cyou\ncnmjcn.net\ncnmjin.net\ncnmla.com\ncnmmsc.org\ncnmo.com\ncnmobile.net\ncnmods.net\ncnmods.org\ncnmoershu.com\ncnmooc.org\ncnmp3.com\ncnmsl.net\ncnmsn.com\ncnmsn.net\ncnmstl.net\ncnmtpt.com\ncnmuseum.com\ncnmysoft.com\ncnn-wali.com\ncnn100.com\ncnnaihuo.com\ncnnb.com\ncnnbfdc.com\ncnnbsa.com\ncnncbhy.com\ncnncguilin.com\ncnndns.com\ncnnetsec.com\ncnneweragx.com\ncnnfootballclub.com\ncnnic.net\ncnnice.com\ncnnmol.com\ncnnorge.com\ncnnorip.org\ncnnosolar.com\ncnnot.com\ncnnpz.com\ncnns.net\ncnntzr.com\ncnnuo.com\ncnnx.net\ncnnyye.org\ncnobin.org\ncnod.net\ncnoddt.com\ncnoic.com\ncnoil.com\ncnolnic.com\ncnolnic.net\ncnolnic.org\ncnonjx.com\ncnonline.org\ncnoocengineering.com\ncnoocltd.com\ncnool.net\ncnopendata.com\ncnops.xyz\ncnoptec.com\ncnork.com\ncnosr.com\ncnoswiki.com\ncnoutdoor.com\ncnovirt.com\ncnovtec-chamber.com\ncnpaf.net\ncnpaiwei.com\ncnpaiwo.com\ncnpanda.net\ncnparking.org\ncnpatent.com\ncnpatrickstar.com\ncnpcbidding.com\ncnpcgas.com\ncnpcmall.com\ncnpdccutter.com\ncnpenjing.com\ncnpereading.com\ncnpfjt.com\ncnpghouse.com\ncnpgjt.com\ncnphar.net\ncnpharm.com\ncnphotec.com\ncnphotos.net\ncnpickleball.com\ncnpickups.com\ncnpicl.com\ncnpiecgb.com\ncnpiecsb.com\ncnpkm.com\ncnpl-ltl.com\ncnplanetary.com\ncnplugins.com\ncnpmjs.org\ncnpoli.com\ncnponer.com\ncnpot.com\ncnpou.com\ncnpoultry.com\ncnpowdernet.com\ncnpowdertech.com\ncnpp100.com\ncnppa.org\ncnpressphoto.com\ncnprofit.com\ncnprs.com\ncnpsec.com\ncnpubc.com\ncnpubg.com\ncnpv.com\ncnpxyy.com\ncnpython.com\ncnqc.com\ncnqcc.com\ncnqd.net\ncnqiang.com\ncnqichun.com\ncnqifeng88.com\ncnqjw.com\ncnqr.org\ncnquanjing.com\ncnqwt.com\ncnradio.com\ncnraksmart.com\ncnrancher.com\ncnrceo.com\ncnrcloudfm.com\ncnrdm.com\ncnrdn.com\ncnreagent.com\ncnree.com\ncnrencai.com\ncnrepair.com\ncnrepark.com\ncnrft.com\ncnrhwq.com\ncnricc.com\ncnrih.com\ncnrj45.com\ncnrmall.com\ncnrmc.com\ncnrmobile.com\ncnrotech.com\ncnrouter.com\ncnrsj.com\ncnrubbermachinery.com\ncnrunda.com\ncnrunlin.com\ncnrust.com\ncnrv.io\ncns.hk\ncnsaes.org\ncnsal.com\ncnsanf.com\ncnsantech.com\ncnsav.com\ncnsb.org\ncnsbjy.com\ncnsc8.com\ncnsce.net\ncnscee.com\ncnsciedu.com\ncnscn.com\ncnscnet.com\ncnscore.com\ncnsdb.com\ncnsdjxw.com\ncnseay.com\ncnseeq.com\ncnsesan.com\ncnsetsail.com\ncnsfk.com\ncnshende.com\ncnshexinji.com\ncnshiri.com\ncnshjy.com\ncnshuizu.com\ncnshzm.com\ncnside.com\ncnsihai.com\ncnsikao.com\ncnsilkworm.com\ncnsimeng.com\ncnsimin.com\ncnsiwu.com\ncnskg.com\ncnskyit.com\ncnsleep.org\ncnslpa.com\ncnsnpj.com\ncnsnvc.com\ncnso.org\ncnsoc.org\ncnsoftbei.com\ncnsoftnews.com\ncnsolarwind.com\ncnsolomo.com\ncnsorl.com\ncnspeed.com\ncnsphoto.com\ncnsrack.com\ncnssr.org\ncnssssl.com\ncnste.org\ncnstock.com\ncnsudong.com\ncnsug.com\ncnsun.net\ncnsunbird.com\ncnsundin.com\ncnsuning.com\ncnsuv.com\ncnsuzi.com\ncnswds.com\ncnswy.net\ncnsynews.com\ncnsz.org\ncnszjlt.com\ncnszxw.com\ncnszyzz.com\ncnta.com\ncntagore.com\ncntaiping.com\ncntally.com\ncntan.net\ncntangka.com\ncntapp.com\ncntaz.com\ncntc.com\ncntech.com\ncnten.com\ncnteno.com\ncntex-ian.org\ncntexjob.com\ncntexnet.com\ncntgol.com\ncntheory.com\ncnthinkers.com\ncntjq.net\ncntle.com\ncntlfs.com\ncntofu.com\ncntopgear.com\ncntoplead.com\ncntour365.com\ncntplus.com\ncntrades.com\ncntranslators.com\ncntries.com\ncntronics.com\ncntslawfirm.com\ncntuw.com\ncntv.com\ncntvan.com\ncntwg.com\ncntyjt.com\ncntywhcm.com\ncnu.cc\ncnuninet.net\ncnuozu.com\ncnur.com\ncnuschool.org\ncnutcon.com\ncnuuu.com\ncnvcs.com\ncnvf.com\ncnvfq.com\ncnvn.net\ncnvps.com\ncnvtech.com\ncnwa.com\ncnwaci.com\ncnwaishi.com\ncnwaking.com\ncnwansun.com\ncnwaternews.com\ncnwb.net\ncnwbwb.com\ncnwear.com\ncnweblog.com\ncnwebshow.com\ncnweiju.com\ncnweiming.com\ncnweisou.com\ncnwest.com\ncnwhc.com\ncnwindows.com\ncnwinenews.com\ncnwood-ipp.org\ncnwsgj.com\ncnwtn.com\ncnwutong.com\ncnww1985.com\ncnww9.com\ncnwxw.com\ncnwzd.com\ncnwzhd.com\ncnxcjt.com\ncnxclm.com\ncnxct.com\ncnxds.com\ncnxdw.com\ncnxfans.com\ncnxhacker.com\ncnxhyp.com\ncnxiangyan.com\ncnxiantao.com\ncnxianzai.com\ncnxiaobai.com\ncnxiaoyuan.com\ncnxibu.com\ncnxieku.com\ncnxile.com\ncnxincai.com\ncnxingoplastics.com\ncnxishui.net\ncnxk.com\ncnxklm.com\ncnxmxf.com\ncnxnmy.com\ncnxos.com\ncnxox.com\ncnxulong.com\ncnxunren.com\ncnxuntu.com\ncnxyk.com\ncnxzm.com\ncnyada.net\ncnyanglao.com\ncnyce.com\ncnydgroup.com\ncnyeig.com\ncnyings.com\ncnyipu.com\ncnyixun.com\ncnyouhao.com\ncnypa.org\ncnypbx.com\ncnys.com\ncnytgy.com\ncnyw.net\ncnywinfo.com\ncnyydj.com\ncnzcn.net\ncnzdfm.com\ncnzdhg.com\ncnzgc.com\ncnzgcec.com\ncnzhanting.com\ncnzhanzhang.com\ncnzhengmu.com\ncnzhepai.com\ncnzhhy.com\ncnzhiyuanhui.com\ncnzhjk.com\ncnzhongcha.com\ncnzhongzhuan.com\ncnzici.com\ncnzjdd.com\ncnzjj.com\ncnzjol.com\ncnzkzg.com\ncnznfy.com\ncnzps.com\ncnzrc.com\ncnzscx.com\ncnzskj.com\ncnzsqh.com\ncnzsrf.com\ncnzsyz.com\ncnzweal.com\ncnzxsoft.com\ncnzxwh.com\ncnzy56.com\ncnzyao.com\ncnzzla.com\ncnzznz.com\nco-effort.com\nco-farming.com\nco-inclusion.org\nco-mall.net\nco-mens.com\nco-plant.com\nco-sail.com\nco-trust.com\nco188.com\nco188cdn.com\nco1in.me\nco2coin.org\ncoach-edu.com\ncoach-japanese.com\ncoahr.net\ncoalcloud.net\ncoalstudy.com\ncoantec.com\ncoaoo.com\ncoastalcitycinema.com\ncoatingol.com\ncobenet.com\ncobetterfiltration.com\ncobioer.com\ncoboak.com\ncobuy.net\ncobvgroup.com\ncocas.cc\ncocav.com\ncocfan.com\ncochemist.com\ncochicon.com\ncocia.org\ncoco413.com\ncocoachina.com\ncocodiy.com\ncocogoat.work\ncocohealthcare.com\ncocololo.com\ncoconuet.com\ncocoon-data.com\ncocophp.com\ncocoren.com\ncocos.com\ncocos.org\ncocos2d-x.org\ncocos2d.org\ncocos2dx.net\ncocosgame.net\ncocostudio.org\ncocozq.com\ncocss.com\ncodante.org\ncode-abc.com\ncode-by.org\ncode369.com\ncode666.com\ncode84.com\ncodeachange.com\ncodeages.work\ncodeaha.com\ncodebaoku.com\ncodebe.org\ncodebuddy.info\ncodebuddy.net\ncodebuddy.pro\ncodebuddy.work\ncodebus.net\ncodebye.com\ncodechina.net\ncodecomeon.com\ncodedefault.com\ncodeeeee.com\ncodeflying.net\ncodeforge.com\ncodehy.com\ncodeidc.com\ncodeios.com\ncodekissyoung.com\ncodekk.com\ncodelife.cc\ncodemart.com\ncodenews.cc\ncodeofchina.com\ncodepku.com\ncodeplayer.vip\ncodeplaygames.com\ncodeprj.com\ncodepub.com\ncoder.work\ncoder100.com\ncoder4.com\ncoder55.com\ncoderbee.net\ncoderclock.com\ncodercto.com\ncoderhuo.tech\ncoderli.com\ncodernav.com\ncoderplanets.com\ncoderprepares.com\ncodersec.net\ncodersrc.com\ncoderyuan.com\ncoderzh.com\ncodes51.com\ncodesdq.com\ncodesoft.hk\ncodess.cc\ncodetop.cc\ncodewd.com\ncodeweblog.com\ncodeweixin.com\ncodewoody.com\ncodex-watch.com\ncodezh.com\ncodezyw.com\ncodigoscript.com\ncoding-io.com\ncoding-newsletter.com\ncoding-pages.com\ncoding.love\ncoding.me\ncoding.net\ncoding3min.com\ncodingapp.com\ncodingchangeworld.com\ncodingcorp.net\ncodingdao.com\ncodingke.com\ncodingsky.com\ncodingwhy.com\ncodingyang.com\ncodj.net\ncodm.com\ncodming.com\ncodmwest.com\ncodoon.com\ncodooncdn.com\ncoelmont.com\ncoeusssyp.com\ncofco-capital.com\ncofco-trust.com\ncofco.com\ncofcoet.com\ncofcofuturesintl.com\ncofcoko.com\ncofcosp.com\ncofcotrading.com\ncofeed.com\ncoffee-hdl.com\ncoffee-iot.com\ncoffee-script.org\ncoffee08.com\ncoffeecdn.com\ncoffeejp.com\ncoffeeofchina.com\ncoffeeteaimagazine.com\ncofferxm.com\ncofile.net\ncofly.com\ncofool.com\ncofortest.com\ncogcpa.org\ncogdelschool.com\ncogitosoft.com\ncognizepower.com\ncogobuy.com\ncogolinks.com\ncogonline.com\ncogskl.com\ncohim.com\ncohl.com\ncohuatech.com\ncoicjs.org\ncoin007.com\ncoin163.com\ncoinabc.com\ncoinall.live\ncoinall.ltd\ncoincsd.com\ncoindog.com\ncoinglo.store\ncoinhaven.store\ncoinnice.com\ncoinrobotics.com\ncoins-carnival.com\ncoinsky.com\ncoinvs.com\ncoinyue.com\ncokll.com\ncokutau.com\ncolahotpot.com\ncolasmart.com\ncoldextrusion.com\ncoldfunction.com\ncoldlake1.com\ncoldlar.com\ncoli688.com\ncolineapp.com\ncolinker.com\ncolipu.com\ncollaborate.download.prss.microsoft.com\ncollaborateppe.download.prss.microsoft.com\ncollect-med.com\ncollect-v6-51.la\ncollege-ing.com\ncollt.org\ncolly-pink.com\ncollycn.com\ncolobu.com\ncolocess.com\ncolor-measure.com\ncolor365.com\ncolorbird.com\ncolorfulclouds.net\ncolorfulltech.net\ncolorimeter.com\ncoloros.com\ncoloros.net\ncolortechchina.com\ncolorv.com\ncoloryr.com\ncolosseo7143.xyz\ncolourlife.com\ncolumbia-china.com\ncolumbia-kaiyuan.com\ncolumbia-wuxi.com\ncom-hs-hkdy.com\ncom.fi\ncom.mp\ncom.tv\ncom4loves.com\ncomac.cc\ncomake.online\ncombestlogistics.com\ncombiosz.com\ncombocn.com\ncombofin.com\ncombomen.com\ncombosm.com\ncombpm.com\ncombss.com\ncomdeep.com\ncome-bio.com\ncomebond.com\ncomebt.com\ncomefilm.com\ncomeken.com\ncomeorg.com\ncomestuff.com\ncomet.cc\ncomeyes.com\ncomflowy.com\ncomfylink.com\ncomiai.com\ncomic520.com\ncomicdd.com\ncomicer.com\ncomicfans.net\ncomicv.com\ncomicyu.com\ncomiis.com\ncominbio.com\ncomingchina.com\ncomlan.com\ncomlbs.com\ncommchina.net\ncomme.work\ncommunicatte.com\ncomnergy.com\ncomocloud.net\ncompal.com\ncompanydns.com\ncompassedu.hk\ncompevt.com\ncompgoo.com\ncomplant.com\ncomplemeny.com\ncomplexstudio.net\ncomponentcn.com\ncomposolder.com\ncompoundsemiconductorchina.net\ncomprame.com\ncomputeinit.com\ncomputer26.com\ncomra.org\ncomsazms.com\ncomsenz.com\ncomseoer.com\ncomsharp.com\ncomway-mro.com\ncomweixin.com\ncomwin-sh.com\ncon-star.com\ncon.sh\ncon3c.com\nconan06.com\nconantoptical.com\nconbagroup.com\nconceptan.com\nconchdate.com\nconchdesktop.com\nconco-esd.com\nconcordiashanghai.org\nconcordmedical.com\nconcox.net\nconcretehr.com\nconda-group.com\ncondorchina.com\ncone-x.com\nconele.com\nconergas.net\nconew.com\nconextweb.com\nconfluxrpc.com\nconghua.com\ncongmiqq.com\ncongratulatiy.com\ncongresobolivariano.org\ncongrongfund.com\ncongtoo.com\ncongtoukaishi.com\ncongwuku.com\ncongyicn.com\ncongzao.com\ncongzhi.com\nconhagroup.com\nconlerpharm.com\nconodmedical.com\nconoha.vip\nconpak.com\nconpak.com.hk\nconquerom.com\nconquerore.com\nconshow.com\nconslive.com\nconsmation.com\nconsole-integration.cdnetworks.com\nconsole.cdnetworks.com\nconstao.com\nconstar-gd.com\nconstgroup.com\ncontent4ads.com\ncontentchina.com\ncontentstore.htcvive.com\ncontrolinai.com\nconuo.com\nconvertlab.com\nconvoypayments.com\ncony-tech.com\nconyedit.com\nconyli.cc\ncoo1read.com\ncoobar.com\ncoobos.com\ncooboys.com\ncooc-china.com\ncoocaa.com\ncoocare.com\ncoocent.net\ncoodesker.com\ncoodir.com\ncoodove.com\ncoofandy.com\ncoofans.com\ncooffee.net\ncooh5.com\ncoohua.com\ncooioo.com\ncookcai.com\ncookicut.com\ncookie4you.com\ncookiezhong.com\ncool-admin.com\ncool-de.com\ncool-play.com\ncoolact.net\ncoolaf.com\ncoolapk.com\ncoolapkmarket.com\ncoolapkmarket.net\ncoolaw.com\ncoolban.com\ncoolbcloud.com\ncoolbuy.com\ncoolcar.cc\ncoolccloud.com\ncoolcode.org\ncoolcode.tech\ncoolcou.com\ncooldock.com\ncooldu.com\ncooleasy.net\ncoolecho.net\ncoolecloud.com\ncoolexe.com\ncoolfd.com\ncoolgaga.com\ncoolgamebox.com\ncoolgua.net\ncoolight.cool\ncoolkaba.com\ncoolkit.cc\ncoolkk.net\ncoolku.cc\ncoollf.com\ncoolmitech.com\ncoolnull.com\ncoolook.org\ncoolool.com\ncoolpad.com\ncoolping.com\ncoolqi.com\ncoolsdream.com\ncoolshark.com\ncoolsite.vip\ncoolsite360.com\ncoolsphoto.com\ncooltechsh.com\ncooltuku.com\ncooluc.com\ncoolwarmsy.com\ncoolweb.work\ncoolwei.com\ncoolxcloud.com\ncoolxigua.com\ncoolyun.com\ncoolzcloud.com\ncoomix.net\ncoomo99.com\ncoomodel.com\ncoonote.com\ncooole.com\ncoooolfan.com\ncoooz.com\ncoopcc.com\ncooperningbo.com\ncoor.work\ncoordsx.com\ncootek.com\ncootekos.com\ncootekservice.com\ncoovee.com\ncoovee.net\ncoowor.com\ncooyun.com\ncop.cdnetworks.com\ncopl.com.hk\ncopperalliance.asia\ncopperhome.net\ncopyedu.com\ncopyfuture.com\ncopythelink.com\ncopywatchstyle.com\ncor-games.com\ncoralset.com\ncorari.com\ncore-biopharma.com\ncorebai.com\ncoreesports.net\ncorehalo.com\ncoremakingsolutions.com\ncorerain.com\ncorex-design.com\ncorgichina.com\ncorlercar888.com\ncoros.com\ncorp-email.com\ncorp.cc\ncorpallies.com\ncorpautohome.com\ncorpease.net\ncorpize.com\ncorpring.com\ncorreoc.asia\ncoryes.com\ncos-beauty.com\ncos-show.com\ncos126.com\ncosbuluo.com\ncoschat.com\ncosco-logisticsqd.com\ncosco.com\ncoscon.com\ncoscoshipping.com\ncoscoshippingenergy.com\ncosdnsresolve-wxzf.com\ncosdnsresolve.com\ncosedm.com\ncosen.net\ncoshelper.com\ncoshin.com\ncoship.com\ncosideabl.com\ncosinedu.com\ncosineg.com\ncosize.com\ncosjiang.com\ncoslinic.com\ncosmileonly.com\ncosmo-lady.com\ncosmoplat.com\ncosmoschem.com\ncosmosource.com\ncosmx.com\ncosoar.com\ncosofteck.com\ncosplay8.com\ncosplayla.com\ncostku.com\ncostuan.com\ncosunter.com\ncosxu.com\ncosyjoy.com\ncosz.com\ncotek-robotics.com\ncotong.com\ncotticoffee.com\ncottonchina.org\ncotv.tv\ncouns.com\ncouplefish.com\ncouponover.info\ncouqiao.net\ncourage-magnet.com\ncoursegraph.com\ncourtesya.com\ncousz-gd.com\ncovcec.com\ncoverequire.com\ncoverweb.cc\ncovinda.com\ncovoart.com\ncovtv.com\ncowarobot.com\ncowcs.com\ncowealth.com\ncowellhealth.com\ncowlevel.net\ncowrycare.com\ncowtransfer.com\ncoyigroup.com\ncoyis.com\ncoyotebio-lab.com\ncoyuk.com\ncoyuns.net\ncoz9uiesr5zv6.com\ncozdyez2ap.com\ncoze.site\ncozonenet.com\ncp-keji.com\ncp0556.com\ncp121.com\ncp2804.com\ncp365.org\ncpa51.com\ncpaddress.com\ncpaed.org\ncpajia.com\ncpakg.com\ncpass.com\ncpbao.com\ncpcaauto.com\ncpcadata.com\ncpcccac.com\ncpcell.com\ncpcep.com\ncpciei.org\ncpcni.net\ncpcphone.com\ncpcw.com\ncpdad.com\ncpdaily.com\ncpdasoft.com\ncpdhd.com\ncpdyj.com\ncpe-fund.com\ncpecc.net\ncpeccgx.net\ncpema.org\ncpeol.net\ncpepgc.com\ncpfia.org\ncpfwzs.com\ncpg-motor.com\ncphfgg.com\ncphiic.com\ncphoto.net\ncphoto.org\ncphu.org\ncpiano.com\ncpiaoju.com\ncpiccdn.com\ncpicfiber.com\ncpicfunds.com\ncpidi.com\ncpihualai.com\ncpitsh.org\ncpixe.com\ncpjltx.com\ncplamc.com\ncplotus.com\ncpm1000.com\ncpmiao.net\ncpmrc.org\ncpnalb.org\ncpo.xyz\ncpo2o.com\ncpolar.com\ncpolive.com\ncpooo.com\ncposchool.com\ncpp-prog.com\ncpp114.com\ncpp32.com\ncppb-wg.com\ncppblog.com\ncppc123.com\ncppdebug.com\ncppfoto.com\ncpph.com\ncppinfo.com\ncpplay.com\ncppoly.com\ncpppf.org\ncppszw.com\ncpqrmyy.com\ncpro.baidustatic.com\ncproton.com\ncps1688.com\ncps800.com\ncpsbeijing.org\ncpse.com\ncpsenglish.com\ncpt-world.com\ncpt123.com\ncpt564.com\ncptae.com\ncptc56.com\ncptmcp.com\ncptn.tv\ncptv2018.com\ncpu114.com\ncpu668.com\ncpu7.com\ncpubbs.com\ncpuchaopin.com\ncpudj.com\ncpuh2.com\ncpury.com\ncpuxn.com\ncpvatgkx.com\ncpwlx.com\ncpwnews.com\ncpwzb.com\ncpzls.com\ncpzst.com\ncpzyrj.com\ncq-cable.com\ncq-city.com\ncq-ct.com\ncq-ct.tech\ncq-eatge.com\ncq-gyw.com\ncq-md.com\ncq-ns.com\ncq-pf.com\ncq-qqcg.com\ncq-rongjia.com\ncq-sound.com\ncq-tencentclb.cloud\ncq-tencentclb.com\ncq-tencentclb.net\ncq-tencentclb.work\ncq-wnl.com\ncq-yj.com\ncq-yt.com\ncq168.com\ncq315house.com\ncq3a.com\ncq5135.com\ncq556.com\ncq6.com\ncq69.com\ncq6969.com\ncq8.com\ncq96868.com\ncq9yuan.com\ncqaaa.com\ncqace.com\ncqaflopack.com\ncqai.vip\ncqaihua.com\ncqaky.com\ncqallcure.com\ncqange.com\ncqangel.com\ncqanmei.com\ncqapg.com\ncqaso.com\ncqatec.com\ncqbafumen.com\ncqbayy.com\ncqbbzyy.com\ncqbdfeng.com\ncqbfc.com\ncqbm2007.com\ncqbnedu.com\ncqbnjsjt.com\ncqbnrc.com\ncqbntv.com\ncqbode.com\ncqbondrite.com\ncqbosai.com\ncqbshyy.com\ncqbwjc.net\ncqbys.com\ncqc-ts.com\ncqc.so\ncqcartest.com\ncqcasin.com\ncqcatr.com\ncqcb.com\ncqcbank.com\ncqcbd-jbc.com\ncqcbl.com\ncqccci.com\ncqccn.com\ncqccsic.com\ncqcdbs.com\ncqcdc.org\ncqcdxl.com\ncqcfe.com\ncqchinabase.com\ncqchuangjing.com\ncqcico.com\ncqcig.com\ncqciig.com\ncqcitymedia.com\ncqcjnj.com\ncqcjxx.com\ncqcklib.com\ncqcmi.com\ncqcmxy.com\ncqcoal.com\ncqcp.net\ncqcpt.com\ncqcrane.com\ncqcrossmobil.com\ncqcsic.com\ncqcssk120.com\ncqcsskyy.com\ncqcy.com\ncqcyhuagong.com\ncqcyxyxh.com\ncqczx.com\ncqdahan.com\ncqdai.com\ncqdailynews.com\ncqdaming.com\ncqdashun.com\ncqdayou.com\ncqdc.com\ncqdcg.com\ncqdcgj.com\ncqddpaint.com\ncqddyl.com\ncqddzx.com\ncqdent.com\ncqdggs.com\ncqdianxin.com\ncqdic.com\ncqdingqi.com\ncqdingyan.com\ncqdj.cc\ncqdjzyy.com\ncqdkj.com\ncqdky.com\ncqdongnanhospital.com\ncqdongyang.com\ncqdpt.com\ncqdting.com\ncqduoliu.com\ncqe.cc\ncqeca.org\ncqedo.com\ncqedu.online\ncqeec.com\ncqelyy.com\ncqem.net\ncqemme.com\ncqenergy.com\ncqest.com\ncqetcvip.com\ncqeyeyy.com\ncqfdcxy.com\ncqfesco.com\ncqfic.com\ncqfind.com\ncqfire.com\ncqfjly.com\ncqflct.com\ncqfmbank.com\ncqfus.com\ncqfuyou.com\ncqfygzfw.com\ncqgaoke.com\ncqgc.com\ncqgdcy.com\ncqgdkf.com\ncqgearbox.com\ncqgewerv.com\ncqggwx.com\ncqggx.com\ncqggzy.com\ncqgh.org\ncqgj.net\ncqglcj.com\ncqglion.com\ncqgmfw.com\ncqgnhg.com\ncqgrain.com\ncqgreat.com\ncqgsdb.com\ncqgtjt.com\ncqguangren.com\ncqguangrong.com\ncqguli.com\ncqguohua.com\ncqguorui.com\ncqgwd.com\ncqgwy.org\ncqgwzx.com\ncqgxjscy.com\ncqgxqsmartedu.com\ncqgyjsxy.com\ncqgyjt.com\ncqgymsxx.com\ncqgyzone.com\ncqgz.com\ncqgzdlgc.com\ncqgzf.net\ncqh2o.com\ncqhac.com\ncqhansa.com\ncqhaofeng.com\ncqhasin.com\ncqhbcy.net\ncqhbzh.com\ncqhejuda.com\ncqhengbogroup.com\ncqhengding.com\ncqhengr.com\ncqhewin.com\ncqhhm.com\ncqhimalayanky.com\ncqhjj.com\ncqhjjt.com\ncqhjyzl.com\ncqhkcdns.com\ncqhkyy.com\ncqhma.com\ncqhnbsb.com\ncqhncd.com\ncqhongshuangda.com\ncqhouse.net\ncqhrjd.com\ncqhsjs.com\ncqhtu.com\ncqhushan.com\ncqhwr.com\ncqhwzs.com\ncqhxdbj666.com\ncqhxeye.com\ncqhxf.com\ncqhxfk.com\ncqhxgf.com\ncqhxyy.com\ncqhxzz.net\ncqhyd.com\ncqhydraulic.com\ncqhyjtss.com\ncqhyky.com\ncqhylab.com\ncqhyyy120.com\ncqhz510.com\ncqhzjy.com\ncqiic.com\ncqiivc.com\ncqindex.com\ncqink.com\ncqinstinct.com\ncqioe.com\ncqios.com\ncqiot.cc\ncqipa.com\ncqipc.net\ncqirobot.com\ncqiss.com\ncqit.com\ncqiter.com\ncqiti.com\ncqitic.com\ncqivc.com\ncqj.net\ncqjat.com\ncqjbrc.com\ncqjchg.com\ncqjdc.com\ncqjdgc.com\ncqjdgyx.com\ncqjdjczx.com\ncqjet.com\ncqjgx.com\ncqjhfk.com\ncqjhgczx.com\ncqjhsy.com\ncqjhtxy.com\ncqjiangxue.com\ncqjiaxian.com\ncqjieli.com\ncqjiexun.com\ncqjingyu.com\ncqjizhi.com\ncqjj.net\ncqjjnet.com\ncqjkhb.com\ncqjlyy.net\ncqjnjs.com\ncqjnkgjt.com\ncqjnw.org\ncqjob.com\ncqjpyg.com\ncqjsaq.com\ncqjsd.com\ncqjtedu.com\ncqjtsn.com\ncqjunan.com\ncqjx.net\ncqjy.com\ncqjyfcyy.com\ncqjyhuida.com\ncqjyn.com\ncqjyxh.com\ncqjzxy.com\ncqjzy.com\ncqkangshan.com\ncqkaogu.com\ncqkbjd.com\ncqkcyy.com\ncqkdtui1.com\ncqkeguan.com\ncqkejufu.com\ncqkepu.com\ncqkerui.com\ncqkexun.com\ncqkeye.com\ncqkfb.com\ncqkhjt.cc\ncqkjb.com\ncqkjwx.com\ncqkjzyxy.com\ncqknls.com\ncqkqinfo.com\ncqkqjt.com\ncqkundian.com\ncqkx.com\ncqkxhospital.com\ncqkytech.com\ncqkytq.com\ncqlaifu.com\ncqlandtower.com\ncqlba.com\ncqlbjg.com\ncqld.com\ncqlfn.com\ncqlhyy.com\ncqlibo.com\ncqlilan.com\ncqlincom.com\ncqlinrui.com\ncqliving.com\ncqljhr.com\ncqljjrjd.com\ncqljjt.com\ncqljmjs.com\ncqljzp.com\ncqlkuav.com\ncqllfood.com\ncqlonghoo.com\ncqloway.com\ncqlp.com\ncqlpa.com\ncqls.work\ncqlummy.com\ncqlxzjzx.com\ncqlyckj.com\ncqlydc.com\ncqlys.com\ncqlyy.com\ncqlzz.com\ncqmaika.com\ncqmama.net\ncqmanzhong.com\ncqmarathon.com\ncqmas.com\ncqmbkq.com\ncqmbyy.com\ncqmcu.com\ncqmeidoing.com\ncqmeiyuan.com\ncqmiaoa.com\ncqmiaochi.com\ncqminghua.com\ncqmlmh.com\ncqmmgo.com\ncqmmjt.com\ncqmpf.com\ncqmsdq.com\ncqmstech.com\ncqmtek.com\ncqmtswkj.com\ncqmva.com\ncqmw.com\ncqmylike.com\ncqmzj.com\ncqnc.cc\ncqncnews.com\ncqndl.com\ncqnetcn.com\ncqnews.net\ncqnhn.com\ncqnht.com\ncqnkhz4j8nmhqp.com\ncqnongzi.com\ncqntdq.com\ncqnurse.com\ncqnx.com\ncqnydb.com\ncqooc.com\ncqpac.com\ncqpartek.com\ncqpbx.com\ncqpearlriver.com\ncqpeidu.com\ncqpeixin.com\ncqpet120.com\ncqpfh.com\ncqpfjt.com\ncqpfmz.com\ncqph.com\ncqphar.com\ncqpix.com\ncqpost.com\ncqpump.com\ncqpwt.com\ncqpwy.com\ncqpwz.com\ncqpx.cc\ncqpzjc.com\ncqqcjzsj.com\ncqqgsafe.com\ncqqgx.com\ncqqianggu.com\ncqqiujing.com\ncqqiyi.com\ncqqjyy.com\ncqqnb.net\ncqqnjt.com\ncqqp.com\ncqqsys.com\ncqqsyy.com\ncqqttk.com\ncqqxxny.com\ncqrafk.com\ncqrailway.com\ncqranxie.com\ncqrc.net\ncqrcb.com\ncqrcdsc.com\ncqrcfl.com\ncqrfym.com\ncqrig.com\ncqrksw.com\ncqrm.com\ncqrmb.com\ncqrmrq.com\ncqrqdx.com\ncqrwys.com\ncqryxfp.com\ncqs-hm.com\ncqsaea.com\ncqsamr.com\ncqscmy.net\ncqsdei.com\ncqsdzy.com\ncqsfqcpj.com\ncqsfybjy.com\ncqsgczjxx.org\ncqshenou.com\ncqshic.com\ncqship.com\ncqshoucheng.com\ncqshrq.com\ncqshulan.com\ncqshyzx.com\ncqsifang.com\ncqsj365.com\ncqsjb.com\ncqsjbc.com\ncqsjd.xyz\ncqsjky.com\ncqsjnzx.com\ncqsjsyy.com\ncqslhjx.com\ncqslim.com\ncqslim.net\ncqsms.net\ncqsoft.org\ncqsongshan.com\ncqspx.com\ncqsq.com\ncqssgf.com\ncqstgxy.com\ncqstjt.com\ncqstjzx.com\ncqstudents.com\ncqsuoqi.com\ncqswah.com\ncqswjjx.com\ncqswxcy.com\ncqsx.net\ncqsxdb.com\ncqsxedu.com\ncqsxhb.com\ncqsxjsj.com\ncqsxrj.com\ncqsxsl.com\ncqsyjq.com\ncqsyjz.com\ncqsymj.com\ncqsyz.com\ncqszfy.com\ncqsznyy.com\ncqsztech.com\ncqszyy.com\ncqszyyhyxh.com\ncqszzs.com\ncqt-top.com\ncqtalent.com\ncqtally.co\ncqtally.com\ncqtanlaoda.com\ncqtaotan.com\ncqtbyy.com\ncqtctech.com\ncqtea.com\ncqtfjs.com\ncqtiantai.com\ncqtieba.com\ncqtkjj.com\ncqtkyy.com\ncqtl.org\ncqtlskj.com\ncqtn.com\ncqtnfs.com\ncqtqzx.com\ncqtrans.com\ncqtransit.com\ncqtrend.com\ncqtresearch.com\ncqtrvl.com\ncqttech.com\ncqtuoda.com\ncqtxyy.com\ncqtyanglao.com\ncqtynpx.com\ncquae.com\ncquc.net\ncqud.net\ncqudp.com\ncqukf.com\ncqulit.com\ncquni.com\ncqvantai.com\ncqvavo.com\ncqvcet.com\ncqvip.com\ncqvip.vip\ncqvist.net\ncqw.cc\ncqwanli.com\ncqwanshang.com\ncqwater.net\ncqwbdq.com\ncqwbgg.com\ncqweh.com\ncqwenbo.com\ncqwest.com\ncqwin.com\ncqwlg.com\ncqwlzz.com\ncqwsnews.net\ncqwsrmyy.com\ncqwszjs.com\ncqwtqc.com\ncqwtqx.com\ncqwulong.net\ncqwuxi.com\ncqwxnews.net\ncqwzax.com\ncqwzwh.com\ncqwzwl.com\ncqxayl.com\ncqxcx.net\ncqxdfpr.com\ncqxdjgxx.com\ncqxdnzyy.com\ncqxdyy.com\ncqxfxh.com\ncqxh120.com\ncqxhdc.com\ncqxhyz.com\ncqxianfeng.com\ncqxiheng.com\ncqxinge.com\ncqxingyun.com\ncqxinhua.com\ncqxinshuo.com\ncqxitou.com\ncqxj-hospital.com\ncqxjr.net\ncqxm-group.com\ncqxnyy.com\ncqxpxt.com\ncqxqz.com\ncqxshs.com\ncqxsxt.com\ncqxszx.net\ncqxtcx.com\ncqxwdb.com\ncqxwtx.com\ncqxxly.net\ncqxxt.com\ncqxyfl.com\ncqxygf.com\ncqxyjc.com\ncqxzxy.com\ncqybhr.com\ncqybxl.com\ncqyc.com\ncqyc.net\ncqycqzyy.com\ncqydgz.com\ncqydxy.com\ncqyestar.com\ncqyfjs.com\ncqyfkgjt.com\ncqyfsk.com\ncqygfm.com\ncqyhpx.com\ncqyhss.com\ncqyhyq.com\ncqyingang.com\ncqyisen.com\ncqyixiao.com\ncqyljgxx.com\ncqym120.com\ncqynzz.com\ncqyongfeng.com\ncqyouloft.com\ncqyqjz.com\ncqysgyy.com\ncqysp.com\ncqysxx.com\ncqysxy.com\ncqyti.com\ncqytjt.com\ncqytsw.com\ncqytu.com\ncqytyk.com\ncqyu.com\ncqyuanjing.com\ncqyuhong.com\ncqyunshi.com\ncqyuxing.com\ncqyuzhoujx.com\ncqyx999.com\ncqyxlx.com\ncqyxzz.com\ncqyygz.com\ncqyyjc.com\ncqyysx.com\ncqyyzy.com\ncqyznews.com\ncqzbcg.com\ncqzcjw.com\ncqzct.com\ncqzdrl.com\ncqzgl.com\ncqzgzdh.com\ncqzhihaolaw.com\ncqzhongxingyuan.com\ncqzhqyjt.com\ncqzikao.com\ncqzike.com\ncqzk.net\ncqzkjs.com\ncqzls.com\ncqzoan.com\ncqzq6.com\ncqzql.com\ncqzrsh.com\ncqzskj.com\ncqzuxia.com\ncqzww.com\ncqzxmoto.com\ncqzxrmyy.com\ncqzxwx.com\ncqzxzlyy.com\ncqzyktqxxh.com\ncqzymj.com\ncqzyx.net\ncqzyyd.com\ncqzyzs.com\ncqzz.net\ncqzzcd.com\ncr-artisan.com\ncr-cts.com\ncr-expo.com\ncr-leasing.com\ncr-newenergy.com\ncr-power.com\ncr11gcsgd.com\ncr15g.com\ncr173.com\ncr175.com\ncr18g.com\ncr19gj.com\ncr20g.com\ncr6868.com\ncr8gc.com\ncrabchina.com\ncracmedu.org\ncraer.com\ncraftcontact.com\ncraftria.com\ncraftsb2b.com\ncraigmaher.net\ncraim.net\ncrandom.com\ncrane-china.cc\ncrane-net.com\ncranewh.com\ncrash.work\ncravatar.com\ncrazepony.com\ncrazybig.fun\ncrazyenglish.com\ncrazyflasher.com\ncrazyjs.org\ncrazyming.com\ncrazymoneys.com\ncrazyones.world\ncrazyphper.com\ncrazypm.com\ncrazyrtc.com\ncrazywong.com\ncrbbg.com\ncrbc.com\ncrbeverage.com\ncrbiopharm.com\ncrc-bj.com\ncrc.com.hk\ncrc.hk\ncrc81.com\ncrcapm.com\ncrcccl.com\ncrccfl.com\ncrccig.com\ncrcctc.com\ncrcebg.com\ncrcegsd.com\ncrcement.com\ncrcgas.com\ncrchi.com\ncrclogistics.com\ncrcrfsp.com\ncrcsz.com\ncrct.com\ncrctrust.com\ncrdyf.com\ncre.net\ncread.com\ncreality.com\ncrealitycloud.com\ncreatby.com\ncreatecdigital.com\ncreatepoint.qti.qualcomm.com\ncreatew.com\ncreatewf.com\ncreati5.com\ncreation-bj.com\ncreationventure.com\ncreative-micro.com\ncreativityeco.com\ncreator-sh.com\ncreatreme.com\ncreatunion.com\ncreavidia.com\ncrec4.com\ncrec4mc.com\ncrecexpo.com\ncrecg-jt.com\ncrecg.com\ncrecgi.com\ncrechan.com\ncrecohe.com\ncrecshif.com\ncrectgroup.com\ncrecu.com\ncred.com\ncredibleglass.com\ncredit100.com\ncreditcn.com\ncredithc.com\ncreditrepairjournal.com\ncreditsailing.com\ncreditzuji.com\ncreegc.com\ncreflux.net\ncreia.net\ncreo-support.com\ncrep-led.com\ncrepcrep.com\ncreplus.net\ncrestv.com\ncret-bio.com\ncrewcn.com\ncrfchina.com\ncrfsdi.com\ncrgdpharm.com\ncrgecent.com\ncrggcn.com\ncrgkxl.com\ncrgy.com\ncrhealthcare.com.hk\ncri-grandera.com\ncri-on.com\ncriankara.com\ncriarabic.com\ncriberlin.com\ncribsas.com\ncric.com\ncric2009.com\ncricbigdata.com\ncricchina.com\ncrieasyfm.com\ncrienglish.com\ncriezfm.com\ncrifan.org\ncrifst.com\ncrilondon.com\ncrimoon.net\ncrimoscow.com\ncrinductance.com\ncrinihaochina.com\ncririo.com\ncriseoul.com\ncrisydney.com\ncritokyo.com\ncriwashington.com\ncrjfw.com\ncrl.globalsign.net\ncrl.kaspersky.com\ncrl.pki.goog\ncrlf0710.com\ncrlg.com\ncrlintex.com\ncrls.pki.goog\ncrm.cc\ncrm1001.com\ncrmch.com\ncrmclick.com\ncrmeb.com\ncrmeb.net\ncrmicro.com\ncrmip.com\ncrmyy.com\ncrnews.net\ncrodigy.com\ncrodigynat.com\ncroot.com\ncroplifechina.org\ncross-border-public.com\ncross-zone.com\ncrossborderlion.com\ncrossingstar.com\ncrossingstarstudio.com\ncrossmo.com\ncrosswaycn.com\ncrov.com\ncrown-chain.com\ncrowndth.com\ncrowya.com\ncrpaas.com\ncrpcg.com\ncrpharm.com\ncrracelve.com\ncrrcgc.cc\ncrrjz.com\ncrs811.com\ncrsc.cc\ncrscm.com\ncrsky.com\ncrsn168.com\ncrtc-hr.com\ncrtdri.com\ncrtg.com\ncrtrcloud.com\ncrtrust.com\ncrtyhr.com\ncrucg.com\ncruelcoding.com\ncrukings.com\ncrvc.com\ncrvic.org\ncrwnt.com\ncrx4.com\ncrxdl.com\ncrxsoso.com\ncry33.com\ncrysound.com\ncrystaledu.com\ncrystalskeleton.com\ncryuantafund.com\ncs-air.com\ncs-airport.com\ncs-cjl.com\ncs-cydq.com\ncs-eval.com\ncs-jinwei.com\ncs-pos.com\ncs-video.com\ncs-xf.com\ncs0799.com\ncs090.com\ncs12333.com\ncs2-aipn.com\ncs27.com\ncs2c.com\ncs2ccloud.com\ncs2pw.com\ncs30.net\ncs451.com\ncs48.com\ncs528.com\ncs53.com\ncs6zhong.com\ncsair.com\ncsairdutyfree.com\ncsairholiday.com\ncsairshop.com\ncsapa.org\ncsarw.org\ncsaspx.com\ncsau.com\ncsbes.com\ncsbme.org\ncsbtv.com\ncsbyjy.com\ncsc100.com\ncsc108.com\ncsc86.com\ncscac.net\ncscan.co\ncscatv.com\ncscdf.org\ncscec.com\ncscec1b-bj.com\ncscec1b.net\ncscec7b.com\ncscec81.com\ncscec8bud.com\ncscecbjadi.com\ncscecparking.com\ncsci.hk\ncscjedu.com\ncsclc.com\ncscmgg.com\ncsct-china.com\ncscxsemi.com\ncsd568.com\ncsdc.info\ncsdczx.com\ncsdeshang.com\ncsdewater.com\ncsdh.com\ncsdhe.com\ncsdhxx.com\ncsdiy.wiki\ncsdk.com\ncsdn.com\ncsdn.net\ncsdn.work\ncsdyjs.net\ncsdyx.com\ncse-bidding.com\ncsea1991.org\ncsebank.com\ncsec-tencentclb.cloud\ncsec-tencentclb.com\ncsec-tencentclb.net\ncsec-tencentclb.work\ncsemc.com\ncseptc.net\ncserveriip.com\ncserwen.com\ncseve.com\ncsflgg.com\ncsflwl.com\ncsfounder.com\ncsfreezer.com\ncsftyy.com\ncsfudu.com\ncsfybjy.com\ncsgasgroup.com\ncsgcjxxh.com\ncsgcyy.com\ncsgdjtxy.com\ncsgfjc.com\ncsghy.com\ncsgjhzzx.com\ncsgjjgxx.com\ncsgjjt.com\ncsgkjt.com\ncsgocn.net\ncsgongshui.com\ncsgpc.org\ncsgwexpo.com\ncsgxyl.com\ncshaodu.com\ncsharpkit.com\ncshbl.com\ncshbxy.com\ncshcp.com\ncshijian.com\ncshixi.com\ncshltx.com\ncshnac.com\ncshnkj.com\ncshrzc.com\ncshslf.com\ncshst.com\ncshuanyu.com\ncshufanyi.com\ncshxdc.com\ncshxschool.com\ncshypg.com\ncshzywkj.com\ncsiamd.com\ncsic-711.com\ncsic612.com\ncsic6801.com\ncsic76.com\ncsicmakers.com\ncsicpl.com\ncsictec.net\ncsiea.net\ncsig158.com\ncsiic.com\ncsilp.com\ncsimcc.com\ncsisolar.com\ncsj-stcloud.com\ncsjcs.com\ncsjdeveloper.com\ncsjgwy.com\ncsjiexin.com\ncsjitian.com\ncsjkjs.com\ncsjkjt.com\ncsjmould.com\ncsjmzy.com\ncsjqfz.com\ncsjsdz.com\ncsjtys.net\ncsjtz.com\ncsjunwei.com\ncsjvision.com\ncsjwang.com\ncskaoyan.com\ncskefu.com\ncskjgc.com\ncskliz.com\ncskrl.com\ncsksoft.net\ncskx.com\ncskxjk.com\ncslbbs.net\ncslfans.com\ncslgfd.com\ncslkjt.com\ncslou.com\ncslxzx.com\ncslyrc.com\ncsmadik.com\ncsmall.com\ncsmama.net\ncsmar.com\ncsmbcx.com\ncsmc-cloud.com\ncsmedlab.com\ncsmh-semi.com\ncsmjzs.com\ncsmscon.com\ncsmxh.com\ncsmzxy.com\ncsnbgsh.com\ncsnhjyxx.com\ncsnhszjy.com\ncsnhw.com\ncsnzxl.com\ncsoly.com\ncsomdmyxy.com\ncsomick.com\ncspasz.org\ncspbj.com\ncspcbaike.com\ncspda.net\ncspengyuan.com\ncspiii.com\ncspmk.com\ncspplaza.com\ncspro.org\ncspruc.com\ncsptia.org\ncsqsg.com\ncsrcare.com\ncsrcbank.com\ncsrcsc.com\ncsrda.com\ncsres.com\ncsrgm.com\ncsrlzyw.com\ncsrunhe.com\ncss-js.com\ncss3er.com\ncss6.com\ncss88.com\ncssaaa.com\ncssbe.com\ncssbkj.com\ncssbyy.com\ncssccq.com\ncsscia.com\ncsscmall.com\ncssdsyy.com\ncsseplastic.com\ncssf.cc\ncssf.com\ncssf.net\ncssforest.org\ncssfybjy.com\ncssg-ahi.com\ncsshenda.com\ncsshenyu.com\ncsshjdxh.com\ncsshuobo.com\ncssjzy.com\ncsslcloud.net\ncssmagic.net\ncssmoban.com\ncssqt.com\ncssthxx.com\ncsstoday.net\ncssuez.com\ncssywgy.com\ncsszone.net\ncst119.com\ncst6.com\ncstccloud.org\ncstcloud.net\ncstcq.com\ncsteamian.work\ncstech.ltd\ncsteelnews.com\ncstexun.com\ncsthxx.com\ncstianye.com\ncstimer.net\ncsto.com\ncstonepharma.com\ncstong.net\ncstparking.com\ncstriker1407.info\ncstuotian.net\ncstxgz.com\ncsuboy.com\ncsuct.com\ncsudgroup.com\ncsuedu.com\ncsundec.com\ncsunews.com\ncsur.fun\ncsvii.com\ncsvw.com\ncsw333.com\ncswamp.com\ncswef.org\ncsweigou.com\ncsweiwei.com\ncswqvzh.com\ncswszy.com\ncsxbank.com\ncsxdf.com\ncsxiangfeng.com\ncsxingfutemple.org\ncsxingya.com\ncsxinhua.com\ncsxinshun.com\ncsxinxu.com\ncsxjedu.com\ncsxjzx.com\ncsxsjc.com\ncsxsrcw.com\ncsxww.com\ncsy17.com\ncsyamei.com\ncsyestar.com\ncsygz5c6qk.best\ncsykgs.com\ncsylxy.com\ncsylzx.net\ncsyrtcs.com\ncsysgz.com\ncsytv.com\ncsyunkj.com\ncsyuwei.com\ncszec.com\ncszhgjzx.com\ncszhjt.com\ncszhonghui.com\ncszhxf119.com\ncszit.com\ncszjgj.com\ncszjzx.com\ncszkzn.com\ncszlgs.com\ncszn120.com\ncszpra.com\ncszsjy.com\ncsztv.com\ncszuxing.com\ncszx.com\ncszyedu.com\ncszyjsxx.com\ncszykt.com\nct-cdm.com\nct-emall.com\nct-laser.com\nct-parking.com\nct108.com\nct52.com\ncta613.org\nctaca.com\nctags.net\nctalive.com\nctans.com\nctaweb.org\nctb50.com\nctbcdn.com\nctbcleasing.com\nctbjia888.com\nctbpsp.com\nctbyq.net\nctc-ctc.com\nctc-zj.com\nctc.lol\nctc100.com\nctcai.com\nctcdn.com\nctcdn.net\nctcdn.org\nctcdnov.net\nctce8.com\nctcefive.com\nctcisz.com\nctcloudmeeting.com\nctcmo.com\nctcnj.net\nctcnn.com\nctcnpa.com\nctcontents.com\nctcsci.com\nctcsz.com\nctcwri.org\nctcxzgs.com\nctdatacare.com\nctdcdn.com\nctdcn.com\nctdisk.com\nctdns.net\nctdns.org\nctdsb.com\nctdsb.net\nctdzsk.com\nctea-ctea.org\ncteaw.com\ncteb.com\nctecdcs.com\nctech-alpha.com\ncteic.com\nctex.org\nctexcel.ca\nctexcel.com\nctexcel.com.hk\nctexcel.fr\nctexcel.us\nctexw.com\nctfhub.com\nctfile.com\nctfile.net\nctfmall.com\nctfo.com\nctftools.com\nctfund.com\nctgapp.com\nctgcdn.com\nctghealthy.com\nctghr.com\nctghro.com\nctgia.com\nctgne.com\ncthcdn.com\ncthcdn.net\ncthgjx.com\ncthh9mnv.com\ncthhmu.com\ncthj-co.com\ncthuwork.com\ncthuwork.net\ncthy.com\ncti-cert.com\nctibet.com\nctic-lab.com\nctic-labs.com\nctiea.com\nctiforum.com\nctiku.com\nctils.com\nctimall.com\nctime.com\nctiot.info\nctipckcx.com\nctis-cn.com\nctjin.com\nctjituan.com\nctjl.net\nctjsoft.com\nctkon.com\nctkq.com\nctlcdn.com\nctlcdn.net\nctlife.tv\nctma.net\nctmcdn.com\nctmcdn.net\nctmcq.com\nctmgid.com\nctmon.com\nctmwow.com\nctn1986.com\nctnma.com\nctntech.com\nctnyypt.com\nctnz.net\nctocio.com\nctoclub.com\nctongonline.com\nctoutiao.com\nctovcdn.com\nctpdd.com\nctrcw.net\nctrender.com\nctrip-ttd.hk\nctrip.co.id\nctrip.co.kr\nctrip.co.th\nctrip.com\nctrip.com.hk\nctrip.my\nctrip.sg\nctripbiz.com\nctripbuy.hk\nctripc.com\nctripgslb.com\nctripins.com\nctripqa.com\nctripteam.com\ncts010.com\nctsbw.com\nctsec.com\nctsfreight.com\nctsgx.com\nctshk.com\nctsho.com\nctsitravel.com\nctsmed.com\nctsscs.com\nctssd.com\nctsto.com\nctszh.com\nctszs.com\ncttbj.com\ncttgd.com\ncttip.org\ncttms.com\ncttpptrs-pt.cfd\ncttptru-pt.icu\ncttq.com\ncttsd.com\ncttv.co\nctuaa.com\nctv56.org\nctvpost.com\nctvrd.org\nctvwx.com\nctwx.net\nctwxc.com\nctxcdn.com\nctxcdn.net\nctxcpa.com\nctxirang.com\ncty9.com\nctycdn.com\nctycdn.net\nctycdn.org\nctyny.com\nctyo.com\nctyun.net\nctyun.online\nctyuncdn.com\nctyuncdn.net\nctyuninner.com\nctyunwaf.com\nctyunwaf1.com\nctzb.com\nctzcdn.com\nctzcdn.net\nctzg.com\ncu-air.com\ncu5gaia.com\ncuaa.net\ncuahmap.com\ncuav.net\ncubavcenter.com\ncubead.com\ncubegoal.com\ncubejoy.com\ncubespace.city\ncubestation.com\ncubicise.com\ncubie.cc\ncubing.com\ncubox.pro\ncucdc.com\ncuchost.com\ncucldk.com\ncuctv.com\ncueber.com\ncuebzzy.com\ncuelog.com\ncufeyk.com\ncugala.com\ncuggw.com\ncugroup.com\ncugstore.com\ncuhnj.com\ncui1000.com\ncuihuan.net\ncuijiahua.com\ncuilai.com\ncuiniaoedu.com\ncuiniuhui.com\ncuiqingcai.com\ncuiru123.com\ncuiruo.com\ncuirushi.com\ncuiuc.com\ncuiv.com\ncuixingreen.com\ncuixueshe.com\ncuiyongjian.com\ncuiyouxuan.com\ncujs.com\ncuketest.com\ncul-studies.com\nculaiwan.com\nculdata.com\nculia.org\nculiangwang.org\nculturemagasin.com\ncumboly.com\ncumen.fun\ncummins-cq.com\ncumtenn.com\ncumulon.com\ncunan.com\ncuncunle.com\ncuncwg.com\ncunfang.com\ncunhao.net\ncunliangtech.com\ncunnar.com\ncunshao.com\ncunylyu.work\ncunyoulu.com\ncunzhen.vip\ncunzj.com\ncuobiezi.net\ncuonc.com\ncuopen.net\ncuour-edu.com\ncuour.com\ncuour.org\ncuoxin.com\ncupdapp.com\ncupdata.com\ncupddns.com\ncupddns.net\ncupdns.com\ncupfox.com\ncupinn.com\ncuplayer.com\ncuplayer.net\ncupmcn.com\ncuppot.com\ncurlc.com\ncurrent.vc\ncursor.zone\ncurtisasia.com\ncusdvs.com\ncusdvs.net\ncusteel.com\ncustomization-cdn.dell.com\ncustomizedfasteners.com\ncustomsapp.com\ncustomskh.org\ncustouch.com\ncustpref.com\ncutemidi.com\ncuteng.com\ncutepet-hk.com\ncutieshop153.com\ncutowallpaper.com\ncutv.com\ncuuhn.com\ncuumo.com\ncux.cc\ncuz.cx\ncuzz.site\ncvc898cvc.com\ncvchome.com\ncvcri.com\ncvftc.net\ncvicse.com\ncvicseks.com\ncvillazc.com\ncvmart.net\ncvmassageocs.com\ncvn-china.com\ncvoazsxs.cfd\ncvoesnzau.cfd\ncvoit.com\ncvonet.com\ncvoon.com\ncvpyqih.com\ncvrobot.net\ncvszavosz.icu\ncvtapi.com\ncvte.com\ncvtestatic.com\ncvtvcn.com\ncwag.com\ncwbaike.com\ncwbgp.space\ncwbpsi.com\ncwcec.com\ncwdma.org\ncwdtf.com\ncwems.com\ncwestc.com\ncweun.org\ncwewater.com\ncwfls.com\ncwgarnet.com\ncwgsdl.com\ncwhnh.com\ncwiaj.com\ncwitxoakk98d.com\ncwjedu.com\ncwjt.com\ncwlchina.com\ncwliupaotea.com\ncwmcs.com\ncwmtn.com\ncwmzyyy.com\ncwouzcmp.com\ncwq.com\ncwst.net\ncwtc.com\ncwun.org\ncwxzx.com\ncwyan.com\ncwz12123.com\ncwzdgroup.com\ncwzww.com\ncx-smarthome.com\ncx.cc\ncx001.com\ncx312.com\ncx368.com\ncx580.com\ncx930.net\ncxacg.com\ncxas.com\ncxbbattery.com\ncxbiji.com\ncxbio.com\ncxbsx.com\ncxbz958.com\ncxc233.com\ncxcc.me\ncxcentury.com\ncxcijiedu.com\ncxcyds.com\ncxdm-tech.com\ncxdqkj.com\ncxdz2000.com\ncxf1999.com\ncxfccs.com\ncxfuwu.com\ncxgame.net\ncxgaugrv.com\ncxgeo.com\ncxgj56.com\ncxglmc.com\ncxglys.com\ncxgw.com\ncxh99.com\ncxhan.com\ncxhl365.net\ncxhr.com\ncxhuoyun.com\ncxhyy.com\ncxic.com\ncximg.com\ncxisc.com\ncxjrh.com\ncxjt.net\ncxju.com\ncxkfwn.com\ncxkjjy.com\ncxkyz.com\ncxlyzj.com\ncxmld.com\ncxmoe.com\ncxmt.com\ncxmtc.net\ncxnyjt.com\ncxnykjy.com\ncxory.com\ncxpharm.com\ncxqex.com\ncxql.net\ncxrczpw.com\ncxsdszx.com\ncxsk.work\ncxsm.com\ncxstar.com\ncxsteel.com\ncxstgc.com\ncxsw3d.com\ncxta.com\ncxthhhhh.com\ncxtld.com\ncxtrip.cc\ncxtuku.com\ncxumol.com\ncxvlog.com\ncxw.com\ncxwl.com\ncxwyf.net\ncxxjs.com\ncxy521.com\ncxy61.com\ncxy7.com\ncxybattery.com\ncxycsx.vip\ncxydh.xyz\ncxydw.net\ncxyfjd.com\ncxylfc.com\ncxylx.com\ncxyob.com\ncxytiandi.com\ncxyule.com\ncxyxiaowu.com\ncxyxwl.com\ncxyyls.com\ncxyym.com\ncxz.com\ncxzg.com\ncxzntc.com\ncxzw.com\ncxzyjt.com\ncy-cdn.com\ncy-coo.com\ncy-credit.com\ncy-email.com\ncy-isp.com\ncy-isp.net\ncy-jg.com\ncy-jm.com\ncy-mmm.com\ncy-pharm.com\ncy-scm.com\ncy-ymtw.com\ncy.com\ncy2009.com\ncy365.com\ncy580.com\ncy88.com\ncyagen.com\ncyalarm.com\ncyanhillcapital.com\ncyanpeach.com\ncyb-bot.com\ncyb800.com\ncybaojian.com\ncyberspace.com\ncybertogether.net\ncyberway-china.net\ncybstar.com\ncybtc.com\ncyc2018.xyz\ncychaiqian.com\ncyclemixcn.com\ncyclewell.com\ncyclingchina.net\ncyclone-robotics.com\ncyclonemoto.com\ncycnet.com\ncycoo.com\ncyctapp.com\ncyd5918.com\ncydiaa.com\ncydiakk.com\ncydow.com\ncyegushi.com\ncyfeng.com\ncyfengchao.com\ncyflscb.com\ncyfyydyfy.com\ncygbdst.com\ncygia.com\ncygs.com\ncygse.com\ncyhazyy.com\ncyhlwhb.com\ncyhlwmt.com\ncyhm.com\ncyhone.com\ncyhx98.com\ncyicts.com\ncyida.com\ncyie.com\ncyikao.com\ncyimking.com\ncyjcloud.com\ncyjhfm.com\ncyjiasu.com\ncyjjw.net\ncyjlighting.com\ncyjoycity.com\ncyjsh.com\ncyjysb.com\ncyjyxxw.com\ncyjzzd.com\ncyk-cable.com\ncyktqdrp.com\ncylaowu.com\ncylh.com\ncylink.bond\ncylong.com\ncymcgs.com\ncynee.net\ncynovan.com\ncyo.cc\ncyol.com\ncyol.net\ncyou-inc.com\ncyoupic.com\ncyouzai.com\ncypatent.com\ncypharma.com\ncyphouse.com\ncypmedia.com\ncypresstel.com\ncyprestar.com\ncyqyfyxh.com\ncyr168.com\ncyruc.com\ncyrx.com\ncys.world\ncysq.com\ncystool.com\ncyswkj.com\ncyswxa.com\ncysy-cn.com\ncysygroup.com\ncyszxyy.com\ncyt369.com\ncytcard.com\ncytoniche.com\ncytosinlab.com\ncyts.com\ncytsdl.com\ncytslinkage.com\ncytsls.com\ncytsonline.com\ncytstibet.com\ncytuig.com\ncyuandao.com\ncyudun.net\ncyuew.com\ncyuntech.com\ncyuyin.com\ncyvalve.com\ncywetc.com\ncywl.org\ncywlxy.com\ncywyjj.com\ncyxh.org\ncyxigua.com\ncyxny.net\ncyxshop.com\ncyy18.com\ncyyangqiguan.com\ncyycdn.com\ncyyo.vip\ncyypscl.com\ncyyself.name\ncyyvip.com\ncyzl.com\ncyzm.net\ncyzs97.com\ncyzwb.com\ncyzywl.com\ncyzzzz.com\ncz-toshiba.com\ncz-yk.com\ncz121.com\ncz128.com\ncz88.net\ncz89.com\nczb365.com\nczbanbantong.com\nczbank.com\nczbcpaint.com\nczbq.net\nczbtv.com\nczbx18.com\nczcarbon.com\nczcdt.com\nczcgewater.com\nczchuanlin.com\nczchyz.com\nczcia.com\nczcid.com\nczclzc.com\nczcqly.com\nczctech.com\nczdaiwei.com\nczddbearing.com\nczdingming.com\nczdlj.com\nczdqyy.com\nczdsfy.com\nczduxinban.com\nczdyrmyy.com\nczech-visacenter.com\nczedu.com\nczepb.com\nczey.com\nczfangshuo.com\nczfcdp.com\nczfcw.com\nczfdc.com\nczfesco-mg.com\nczfhdmls.com\nczfph.com\nczgcsb.com\nczgd.tv\nczgdly.com\nczgjj.com\nczgjj.net\nczgmjsj.com\nczgongzuo.com\nczgtjt.com\nczguangfu.org\nczhaobiao.com\nczhbgx.com\nczhjs.com\nczhmjx.com\nczhtff.com\nczhuayuansuye.com\nczie.net\nczifi.org\nczinfo.net\nczitc.com\nczjake.com\nczjdgz.com\nczjdjt.com\nczjdu.com\nczjfa.com\nczjiangteng.com\nczjilijia.com\nczjju.com\nczjlsb.com\nczjoel.com\nczjpw.com\nczjsy.com\nczjyzx.net\nczkbdq.net\nczkctl.com\nczkingdee.com\nczlgj.com\nczlingke.com\nczlkgy.com\nczlsgz.com\nczlskj.com\nczlxgc.net\nczmarathon.net\nczmc.com\nczmh.com\nczmstt.com\nczmw.com\nczmypx.com\ncznengshuo.com\ncznewcom.com\nczolgame.com\nczongyi.com\nczopen.com\nczpbxc.com\nczpoly.com\nczpv.net\nczqingzhifeng.com\nczqqkj.com\nczrcw.com\nczrjh.com\nczrmyy.com\nczrsymt.com\nczsafjx.com\nczsbtjx.com\nczsfy.com\nczsldy.com\nczsmk.com\nczsrc.com\nczsrmyy.com\nczsshb.com\nczstx.net\nczswdx.com\ncztaojiu.com\ncztour.com\ncztrjs.com\ncztv.cc\ncztv.com\ncztv.tv\ncztvcdn.com\ncztvcloud.com\ncztzkg.com\nczur.com\nczvv.net\nczwie.com\nczws.com\nczwsg5.com\nczwxbyq.com\nczwxtz.com\nczxiu.com\nczxixi.com\nczxixigu.com\nczxr.net\nczxthmls.com\nczxuexi.com\nczxxp.com\nczxxw.com\nczxy.com\nczyabo.com\nczybjz.com\nczyefy.com\nczyfxd.com\nczyl.cc\nczyongfeng.com\nczypcb.com\nczyuxing.com\nczyxba.com\nczzqp.com\nczzsw.com\nczzy-edu.com\nczzyc.com\nczzyvideo.com\nczzzbwg.com\nd-controls.com\nd-ctrip.com\nd-d.design\nd-heaven.com\nd-innovation.com\nd-long.com\nd-robotics.cc\nd-stars.net\nd-techs.com\nd-wolves.com\nd.cg\nd.design\nd00.net\nd03jd.com\nd05512bf210292.beer\nd0be5a65855b67f1.com\nd0bf4234011011.beer\nd0ff97cf35c6a919.com\nd10a.com\nd11180a781015.beer\nd11a.com\nd1226c9c010311.beer\nd13fa03a1909beae.com\nd163.net\nd17.cc\nd1be4a4fdf902c14.com\nd1c73dbb1de91850.com\nd1cm.com\nd1com.com\nd1cy.com\nd1dengju.com\nd1dytt.com\nd1ev.com\nd1f20dc1910272.beer\nd1f25004011021.beer\nd1f41d7b74d2717d.com\nd1ld.com\nd1lx.com\nd1miao.com\nd1mm.com\nd1net.com\nd1rcw.com\nd1sm.net\nd1xf.net\nd1xn.com\nd1xny.com\nd1y.cc\nd20d0896ac7f79d3.com\nd22a.com\nd22fa4e66e2dbda2.com\nd23c41a0511031.beer\nd27c2e00d10251.beer\nd2940a1d3924e37f.com\nd2core.com\nd2film.com\nd2kdi2ss.com\nd2scdn.com\nd2shost.com\nd2ty.com\nd2ziran.com\nd30c8d2641021.beer\nd3490d69fd4b2039.com\nd3581247411021.beer\nd37hw752kt.com\nd3bc311b910311.beer\nd3ch.com\nd3cn.net\nd3e5f7g9.work\nd3eurostreet.com\nd3f.com\nd3games.com\nd3iz9md.com\nd3tt.com\nd3zone.com\nd4000.com\nd406dc73a1016.beer\nd475a937d0e92b96.com\nd48c3443110281.beer\nd4cd5439c1009.beer\nd4ctech.com\nd4z1onkegyrs5.cloudfront.net\nd54a00143de85b64.com\nd56c84cfb4a786f7.com\nd58.net\nd5a18ed7b2f74e45.com\nd5h.net\nd5power.com\nd5render.com\nd5xs.net\nd65d6.com\nd65fee3222cbaf80.com\nd6861213910261.beer\nd6ffdb55d1009.beer\nd7585a05210281.beer\nd777.com\nd7e29629277.luxe\nd7ftpecw.work\nd7vg.com\nd7w.net\nd837c367d34d7bb5.com\nd8e8664c05df452c.com\nd8fb1ffab10251.beer\nd8th.com\nd90eeacb0ed722f9.com\nd920c164caf0ebba.com\nd959fb95dd5cc433.com\nd9741b1859dfcfee.com\nd99net.net\nd9af5a60.edmonst.net\nd9b5cc7f82ccfc18.com\nd9j8.com\nd9js.com\nd9k99.com\nd9ym.com\nda-mai.com\nda-quan.net\nda.anythinktech.com\nda.biz\nda01.com\nda3h.com\nda563c3c21010.beer\nda88.net\ndaai.fun\ndaanbar.com\ndaanche.com\ndaangene.com\ndaanjiexi.com\ndaanwang.com\ndaanwo.com\ndaanxi.com\ndaas-auto.com\ndaba.com\ndabai4.com\ndabaicai.org\ndabaidaojia.com\ndabaise.com\ndabangong.com\ndabangsoft.com\ndabanke.com\ndabao123.com\ndabao22.com\ndabaoge.host\ndabapiao.com\ndabaqian.com\ndabeiduo.com\ndabiaoji.info\ndabiaojituan.com\ndabieshu.com\ndabin69.com\ndabingseo.com\ndabjy.com\ndaboluo.net\ndabusi.com\ndacai.com\ndacang.ltd\ndacankao.com\ndacankao.net\ndacaomei.com\ndacbiotech.com\ndaccc.com\ndaccf.com\ndachanet.com\ndachao.com\ndachaokn.com\ndachaoshan.org\ndachengbiochemical.com\ndachengge.com\ndachenglaw.com\ndachengsh.com\ndachengshuiwu.com\ndachengzi.net\ndachkj.com\ndachuanchina.com\ndachuizichan.com\ndachun.tv\ndachushicai.com\ndad86b446ac9f8b7.com\ndada114.net\ndada360.com\ndadaabc.com\ndadagame.com\ndadagem.xyz\ndadajiasu.com\ndadaogroup.com\ndadaojiayuan.com\ndadaqipai.com\ndadasasa.com\ndadasou.com\ndadateach.com\ndadayou.com\ndadclab.com\ndaddybaby.com\ndaddymami.net\ndaddysweety.com\ndadeedu.com\ndadetong.com\ndadicinema.com\ndadighost.com\ndadikid.net\ndadisalt.com\ndadiwang.com\ndadiyimao.com\ndadongwu.com\ndadou.com\ndaduoduo.com\ndaduofa.com\ndadushixiecheng.com\ndaeac4faf10292.beer\ndaerzhu.com\ndaeshin-china.com\ndaf-rs.com\ndaf30622c1010.beer\ndafaji.com\ndafang24.com\ndafangtour.net\ndafangya.com\ndafanshu.com\ndafaun.com\ndafenghk.com\ndafenghk.net\ndafmgroup.com\ndafork.com\ndafosi.org\ndagangcheng.com\ndagongcredit.com\ndagongnet.com\ndagongtech.com\ndaguan.com\ndaguangnews.com\ndagufood.com\ndaguiot.com\ndaguipc.com\ndagun.net\ndaguzhe.com\ndagyujt.com\ndahachuxing.com\ndahai96.com\ndahainan.com\ndahaiwater.com\ndahaiyang.com\ndahan-sports.com\ndahanghaiol.com\ndahangroup.com\ndahangsky.com\ndahangzhou.com\ndahantc.com\ndahanyinbang.com\ndahanyu.com\ndahao-dahao.com\ndahaoexpo.com\ndaheapp.com\ndahecube.com\ndahei.com\ndaheng-image.com\ndaheng-imaging.com\ndaheng-imavision.com\ndahengit.com\ndahepiao.com\ndahetest.com\ndahongba.net\ndahongtec.com\ndahongtool.com\ndahouduan.com\ndahua-cpa.com\ndahua-ferrules.com\ndahuaab.com\ndahuabloc.com\ndahuaddns.com\ndahuagong.com\ndahualan.com\ndahuap2p.com\ndahuap2pcloud.com\ndahuasurvey.com\ndahuatech.com\ndahuawang.com\ndahuhg.com\ndahuifuwu.com\ndahuodong.com\ndai-shi.com\ndai361.com\ndaiaotech.com\ndaiban0571.com\ndaibanke.com\ndaibi.com\ndaicelchina.com\ndaicuo.cc\ndaicuo.net\ndaidaicp.com\ndaidaipu.com\ndaidongxi.com\ndaigege.com\ndaigou.com\ndaigraphia.com\ndaihaobiao.com\ndaihing.com\ndaijuchuang.net\ndaijun.com\ndaikandq.com\ndaikuan.com\ndaili321.com\ndailianmama.com\ndailianqun.com\ndailiantong.com\ndailianzj.com\ndailiba.com\ndailijizhang.cc\ndailiweishang.com\ndailugou.com\ndailybing.com\ndailygn.com\ndailyqd.com\ndaimafans.com\ndaimagongfang.com\ndaimami.com\ndaimao.work\ndaimawang.com\ndaimay.com\ndaimg.com\ndainiter.com\ndairao.net\ndaishangqian.com\ndaishanmarathon.com\ndaishu.com\ndaishucha.com\ndaishujiankang.com\ndaishutijian.com\ndaisyfin.com\ndaita.red\ndaittotrade.com\ndaivc.com\ndaiwofly.com\ndaiwoqu.com\ndaixiaji.net\ndaixiaobao.com\ndaixiaomi.com\ndaixiaorui.com\ndaixiehyl.com\ndaiyanbao.com\ndaiyanmama.com\ndaiyinzi.com\ndaizitouxiang.com\ndajan.com\ndajiabao.com\ndajiachou.com\ndajiadou6.com\ndajiadu8.com\ndajiaka.com\ndajialaikan.com\ndajialawyer.com\ndajianet.com\ndajiang365.com\ndajiangsai.org\ndajiangtai.com\ndajianhui.com\ndajianyouju.com\ndajiashequ.com\ndajiashuo.com\ndajiazhao.com\ndajiazhongyi.com\ndajiazulin.com\ndajibacdn.com\ndajibapass.com\ndajie.com\ndajieimg.com\ndajilin.com\ndajinan.com\ndajingdiao.com\ndajingmed.com\ndajixie.com\ndajke.com\ndajudeng.com\ndajuntech.com\ndajuyuan.net\ndaka.net\ndakage.com\ndakahr.com\ndakamao8.com\ndakangchem.com\ndakangmedical.com\ndakao100.com\ndakao8.com\ndakao8.net\ndakapath.com\ndakaruanwen.com\ndakasi.com\ndakedakedu.com\ndakejie.com\ndakekj.com\ndakele.com\ndakw.xyz\ndalaba.com\ndalanyouxi.com\ndalao.net\ndalaosz.com\ndaleigroup.com\ndalelingtea.com\ndali-group.com\ndalian-chuanpiao.com\ndalianair-china.com\ndalianbus.com\ndaliancs.com\ndalianiso.com\ndalianjiaojing.com\ndalianshengmi.com\ndaliansky.net\ndaliantyre.com\ndalianwater.com\ndalianxianting.com\ndaliaolaser.com\ndaliapp.net\ndalidaily.com\ndalidm.com\ndalifa.com\ndaliha.com\ndalipan.com\ndalisanta.com\ndalongkeji.com\ndalongyun.com\ndaltonbio.com\ndalu.net\ndaluma.com\ndaluo.com\ndaluom.com\ndaluwang.net\ndaluxinxi.com\ndalvhe.com\ndalvlaw.com\ndalwiaavieru.com\ndalwiaebulon.com\ndalwiakieyne.com\ndalwiaresham.com\ndalwl.work\ndalyfeds.com\ndamai.com\ndamaicheng.com\ndamaimed.com\ndamao.city\ndamatu1.com\ndamddos.com\ndameisheng.com\ndameiweb.com\ndameng.com\ndamiercapital.com\ndamijing.com\ndamingweb.com\ndamiw.com\ndamixs.biz\ndamndigital.com\ndamo-academy.com\ndamodel.com\ndamonroller.com\ndamostar.com\ndamotu.com\ndamoyang.com\ndamuchong.com\ndamuite.com\ndan-my.com\ndan-sing.com\ndan8gui.com\ndanale.com\ndanaleplatform.com\ndanaonao.org\ndanaqsy.com\ndanatlas.com\ndanbagui.com\ndanbaodan.com\ndance365.com\ndanceinchina.org\ndancf.com\ndanchuangglobal.com\ndancihu.com\ndancingcg.com\ndancizhan.com\ndandaiqh.com\ndandan818.com\ndandang.org\ndandanhou.net\ndandanjiang.tv\ndandanman.com\ndandanplay.com\ndandanplayer.com\ndandantang.com\ndandanvoice.com\ndandanz.com\ndandanzan.com\ndandanzkw.com\ndanding.com\ndanding.fun\ndandinghuayi.com\ndandongbank.com\ndandou.com\ndanews.cc\ndang-jian.com\ndang3.com\ndangaocn.com\ndangaoss.com\ndangbei.com\ndangbei.net\ndangbeiprojector.com\ndangbiao.com\ndangcdn.com\ndangdaiyiyao.com\ndangdang.com\ndangdj.com\ndangguai.com\ndanghongyun.com\ndanghuan.com\ndangjian.com\ndangjianwang.com\ndangjinguiping.com\ndangpu.com\ndangtianle.com\ndangwan.com\ndangzhi.com\ndangzhi.net\ndangzhu.net\ndangzhuntianqi.com\ndanhao51.com\ndanhaowang.org\ndanhuaer.com\ndanhuangyun.com\ndaniao.org\ndanilelxp.com\ndaningcenter.com\ndaningdaning.com\ndaningtv.com\ndaniopack.com\ndaniuguwang.com\ndaniuit.com\ndaniujiaoyu.com\ndaniushiwan.com\ndaniuwangxiao.com\ndanji100.com\ndanji6.com\ndanji8.com\ndanji9.com\ndanjiang.com\ndanjuanapp.com\ndanjuanfunds.com\ndanjuantaxi.com\ndanjuantec.com\ndanke.com\ndankegongyu.com\ndankexiaoyuan.com\ndanlan.org\ndanlancare.com\ndanlanlove.com\ndanlingfuyou.com\ndanlirencomedy.com\ndanlu.net\ndanmaku.live\ndanmaku.tv\ndanmakupie.com\ndanmi.com\ndanming-ic.com\ndanmo.com\ndanmofun.com\ndanmoshui.com\ndanmu.com\ndanniao.com\ndanotest.com\ndanpin.com\ndanqi.com\ndanten.org\ndanteng.me\ndantengge.org\ndantin.com\ndantins.com\ndantuvc.com\ndanwukeji.com\ndanxia.com\ndanxin.net\ndanyang.com\ndanzhaoedu.com\ndanzhou8.com\ndao-fu.com\ndao123.com\ndao3.fun\ndao42.com\ndao50.com\ndaoapp.io\ndaoapp.me\ndaoboime.com\ndaochen.com\ndaocloud.io\ndaocloud.vip\ndaocloudapp.com\ndaodao.com\ndaodaojizhang.com\ndaodaozz.com\ndaodejing.org\ndaodian100.com\ndaodianfu.com\ndaodoc.com\ndaododo.com\ndaoduoduo.com\ndaofengdj.com\ndaoguo.com\ndaohang198.com\ndaohang4.com\ndaohang88.com\ndaohangtx.com\ndaohu123.com\ndaohui.net\ndaohuo.shop\ndaoiqi.com\ndaoisms.org\ndaojia-inc.com\ndaojia.com\ndaojiale.com\ndaojialianmeng.com\ndaojishiqi.com\ndaojishiwang.com\ndaokers.com\ndaokeyuedu.com\ndaokoudai.com\ndaomengad.com\ndaomengren.com\ndaomicfo.com\ndaomuol.com\ndaonong.com\ndaopei.net\ndaopub.com\ndaoqin.net\ndaoran.tv\ndaoru.in\ndaoruimi.com\ndaoscript.org\ndaoshui.com\ndaotin.com\ndaotour.com\ndaotudashi.com\ndaovay.com\ndaovoice.io\ndaoxiangcun.com\ndaoxila.com\ndaoxila.net\ndaoyu.fun\ndaoyu.me\ndaoyu8.com\ndaoyumiao.com\ndaozhao.com\ndapai8.com\ndapan.com\ndapei.cc\ndapenggangguanchang.com\ndapenti.com\ndapingshidai.com\ndapiniu.com\ndappdiscover.com\ndapustor.com\ndaqi.com\ndaqiao.host\ndaqiguanli.com\ndaqihui.com\ndaqing8080.com\ndaqiso.com\ndaqizhong.com\ndaqo.com\ndaqqd.com\ndaqsoft.com\ndaquan.com\ndaquan.la\ndaquangroup.com\ndaquncnc.com\ndaraz.lk\ndaraz.pk\ndarczpw.com\ndare-auto.com\ndarehui.com\ndaren.today\ndarenfund.com\ndarenjiazu.com\ndarensky.com\ndareu.com\ndarewayhealth.com\ndarkcloudpiece.com\ndarkmi.com\ndarknight.games\ndarmao.com\ndarongcheng.com\ndarryring.com\ndartchina.com\ndartou.com\ndartsearch-cn.net\ndartzon.com\ndaruan.com\ndarwinlearns.com\ndasctf.com\ndasfbio.com\ndasfjd.com\ndashanghaizhuce.com\ndashangu.com\ndashen520.com\ndashen8.com\ndashengji.com\ndashengpan.com\ndashengshan.com\ndashengzuji.com\ndashenquan.com\ndashentv.com\ndashenw.com\ndashgame.com\ndashi518.com\ndashichang.work\ndashigame.com\ndashikou.com\ndashisx.com\ndashitech.com\ndashiyou.com\ndashu.com\ndashubaba.com\ndashuju123.com\ndasiyingyu.com\ndasong108.com\ndasoujia.com\ndassm.com\ndasuan110.com\ndasuanwang.com\ndasung.com\ndasungtech.com\ndat881.com\ndata-speaker.com\ndata380.com\ndata4h.com\ndata5u.com\ndata86.com\ndata86.net\ndata985.com\ndataarobotics.com\ndatacanvas.com\ndatacname.com\ndatacomo.com\ndatacvg.com\ndatadragon.net\ndataduoduo.com\ndataesb.com\ndataeye.com\ndatafun.vip\ndatag.vip\ndatagear.tech\ndatagrand.com\ndatahome2026.com\ndatahubtrack.com\ndatahuif.com\ndataie.com\ndataing.com\ndatang.com\ndatang.net\ndatangnxp.com\ndatangweishi.com\ndatangyouxi-inc.com\ndatangyouxia.com\ndatangyouxib.com\ndatangyouxic.com\ndatangyouxie.com\ndatangzww.com\ndataodu.com\ndataojo.com\ndataoke.com\ndatarelab.com\ndatarj.com\ndatasheet.hk\ndatasheet5.com\ndatastoragesummit.com\ndatatang.com\ndatatech-info.com\ndatatist.com\ndatatocn.com\ndatatool.vip\ndatauseful.com\ndataxcrm.com\ndatayes.com\ndatazt.com\ndatealive.com\ndatebao.com\ndatepj.com\ndatesdata.com\ndatia-inspect.com\ndatianmen.com\ndatk.anythinktech.com\ndatong.info\ndatongjianshe.com\ndatongtaxi.com\ndatuc.com\ndaugres.com\ndauteen.com\ndav01.com\ndavdian.com\ndavidlovezoe.club\ndavincimotor.com\ndavinfo.com\ndavost.com\ndavycloud.com\ndawangling.com\ndawawa.com\ndaweiai.com\ndaweijita.com\ndaweisoft.com\ndaweiyishu.com\ndawenbo.com\ndawenling.com\ndawenming.com\ndawensk.com\ndawenxue.net\ndawenxue.org\ndawhcm.com\ndawnarc.com\ndawndiy.com\ndawnjs.com\ndawnlab.me\ndawnled.net\ndawntech.net\ndawuhanapp.com\ndawurencai.com\ndawuyu.com\ndawx.com\ndawx.net\ndaxfix.com\ndaxia.com\ndaxiang91.com\ndaxianghuyu.com\ndaxiangkeji.com\ndaxianglingke.com\ndaxianglink.com\ndaxiangqun.net\ndaxiangshouche.com\ndaxianzuji.com\ndaxicn.com\ndaxiit.com\ndaxiongxueyixue.com\ndaxishi.com\ndaxitouzi.com\ndaxue52.com\ndaxuecidian.com\ndaxuecn.com\ndaxueit.com\ndaxuejiayou.com\ndaxuelu.com\ndaxuepc.com\ndaxuesoutijiang.com\ndaxuetian.com\ndaxuewang.com\ndayaguqin.com\ndayainfo.com\ndayang.group\ndayangjt.com\ndayangliangyou.com\ndayangmotorcycle.com\ndayangmuye.com\ndayangshop.com\ndayangsz.com\ndayanmei.com\ndayanyanglao.com\ndayanzai.me\ndayapress.com\ndayayu.com\ndayclover.com\ndaydao.com\ndayday.plus\ndaydaymap.com\ndaydays.com\ndaydaytest.com\ndaydayup123.com\ndaydx.com\ndaye.hk\ndayee.com\ndayehome.com\ndayesmart.com\ndayezheng.com\ndayhao.com\ndayhellohotel.com\ndayhr.com\ndayi100.com\ndayichang.com\ndayifund.org\ndayihangqing.com\ndayila.net\ndayilive.com\ndayima.com\ndayin.com\ndayin.la\ndayin8.com\ndayinhu.com\ndayinjiqudong.com\ndayinmao.com\ndayinpai.com\ndayinpiano.com\ndayirc.com\ndayishengwu.com\ndayitea.com\ndayiwater.com\ndayong.name\ndayoo.com\ndayrui.com\ndayscamera.com\ndaysou.com\ndayspringpharma.com\ndayss.com\ndaysview.com\ndayu-group.com\ndayu-valve.com\ndayu.com\ndayu.work\ndayuanqy.com\ndayuansouti.com\ndayuanzong.com\ndayucdn.com\ndayucdntip.com\ndayue.com\ndayue8.com\ndayugame.net\ndayugf.com\ndayugslb.com\ndayukaoshi.com\ndayukeji.com\ndayulego.com\ndayulegobak.com\ndayungroup.com\ndayuntongzhou.com\ndayup.org\ndayustudy.com\ndayutukun.com\ndayuzy.com\ndaza168.com\ndazanggui.org\ndazhangfang.com\ndazhangqiu.com\ndazhe5.com\ndazheda.com\ndazhengtop.com\ndazhenzimiao.com\ndazhewa.com\ndazhicorp.com\ndazhistudy.com\ndazhitech.com\ndazhixue.com\ndazhong-valve.com\ndazhong.com\ndazhongbanben.com\ndazhonghr.com\ndazhongkanche.com\ndazhoumzj.com\ndazhoushan.com\ndazhouwater.com\ndazhu1988.com\ndazhuangwang.com\ndazhuangyan.com\ndazibo.com\ndazidazi.com\ndazijia.com\ndaziya.com\ndazizhuanqian.net\ndazoread.com\ndazpin.com\ndaztoutiao.com\ndazuhang.com\ndazui.com\ndazuichazi.com\ndazzle-fashion.com\ndb-cache.com\ndb.ci\ndb162.com\ndb23bc6de1024.beer\ndb2b0d032aefa755.com\ndb5f9bf125415ac9.com\ndb6bfe859b7825fc.com\ndb6f227cfb009078.com\ndb9w.com\ndb9x.com\ndba95a0a82447ac3.com\ndbank.com\ndbankcdn.com\ndbankcdn.ru\ndbankcloud.asia\ndbankcloud.com\ndbankcloud.eu\ndbankcloud.ru\ndbankedge.asia\ndbankedge.net\ndbanote.com\ndbaobao.com\ndbatmb.com\ndbbqb.com\ndbc2000.net\ndbcdh.com\ndbcsq.com\ndbdna.com\ndbe5c181b58111e2.com\ndbf71743f55a8ff4.com\ndbh123.net\ndbjsjt.com\ndbkan.com\ndbkuaizi.com\ndblgf.com\ndbljj.com\ndbmailserver.com\ndbmall.com\ndbmeta.net\ndbnuo.com\ndbpan.com\ndbparking.com\ndbqf.xyz\ndbqgg.com\ndbs724.com\ndbscar.com\ndbshop.net\ndbss360.com\ndbtclub.com\ndbyun.net\ndbzy5.com\ndc-cn.com\ndc0792.com\ndc168cc6a2fe73d3.com\ndc568.com\ndc5febe781010.beer\ndc625.com\ndc8c1b13e8a9a886.com\ndcarapi.com\ndcarimg.com\ndcarlive.com\ndcarstatic.com\ndcarvod.com\ndcatgame.com\ndcb-group.com\ndcb123.com\ndcccji.com\ndcdapp.com\ndcdkjx.com\ndcdnx.com\ndceb32e758290eed.com\ndcef3671664fa11b.com\ndcement.com\ndcexport.work\ndcf365.com\ndcg.microsoft.com\ndcg123.com\ndcgqt.com\ndcgsi.com\ndcgstd.com\ndchotel.net\ndcic-china.com\ndcits.com\ndckgjt.com\ndckj19.com\ndckygroup.com\ndcloud.io\ndcloud.xin\ndcloudlive.com\ndcloudlive.net\ndclouds.cloud\ndcloudsp.com\ndcloudsp.net\ndcloudstc.com\ndcloudstc.net\ndcloudvod.com\ndcloudvod.net\ndclygroup.com\ndcmagcn.com\ndcmk17.com\ndcn01.ps4.update.playstation.net\ndcn01.ps5.update.playstation.net\ndcpc.com\ndcpfb.com\ndcqsq.com\ndcsapi.com\ndcshow.com\ndcsjw.com\ndcsme.org\ndcsq.com\ndcstack.org\ndct-cloud.com\ndcutp.com\ndcwucu.com\ndcxnews.com\ndcxx.vip\ndcxzmxa.com\ndcybkj.com\ndcyiyao.com\ndcyjc.com\ndcyz.com\ndcyzq.com\ndczcsc.com\ndczkj.com\ndczy168.com\ndd-advisor.com\ndd-gz.com\ndd-img.com\ndd.ci\ndd.ma\ndd001.net\ndd01.com\ndd0415.net\ndd0513702337fb4b.com\ndd0d7e15310311.beer\ndd128.com\ndd2007.com\ndd208.com\ndd369.com\ndd373.com\ndd4.com\ndd536adb110272.beer\ndd666mir.com\ndd903b8fbe36755d.com\nddadaal.me\nddahr.net\nddbiquge.cc\nddbiquge.com\nddbiu.com\nddblquge.cc\nddbqgtxt.cc\nddcdn.com\nddcheshi.com\nddchong.com\nddcits.com\nddcorp.net\nddcsjw.com\nddcwl.com\nddd-china.com\ndddazhe.com\nddddns.net\nddddocr.com\nddddyres.com\ndddfe.com\ndddgong.com\ndddja.com\ndddki.com\ndddkq.com\ndddwan.com\ndde-desktop.org\nddedush.com\nddfans.com\nddfchina.com\nddfresh.net\nddfzb.com\nddguanhuai.com\nddhly.com\nddhy.com\nddiaas.com\nddianle.com\nddimg.mobi\nddimg.net\ndding.net\nddiqbh.com\nddj123.com\nddjjzz.com\nddjk.com\nddjs-cn.com\nddjsyx.com\nddkanqiu.cc\nddkanqiu.net\nddkanqu.com\nddkids.com\nddkt365.com\nddky.com\nddle.cc\nddlequ.com\nddmaicai.net\nddmap.com\nddmc.mobi\nddmer.com\nddmogo.com\nddnddn.com\nddnscn.com\nddnspod.com\nddnsto.com\nddnx.com\nddong.com\nddonplan.com\nddooo.com\nddoor.net\nddos.com\nddos567.net\nddosc.com\nddosendns.com\nddosfh.com\nddoshy.com\nddosjq.xyz\nddove.com\nddpai.com\nddpoc.com\nddqcw.com\ndds.dell.com\nddsaas.com\nddsiojf.xyz\nddsk.la\nddsm.com\nddstarapp.com\nddsy.com\nddtk.vip\nddtsg.com\nddtugame.com\nddtxgame.com\nddun.com\nddunyun.com\nddurl.to\ndduser.mobi\ndduwork.com\nddvaj.com\nddweilai.com\nddwgame.com\nddwhm.com\nddwjs.com\nddxhx.com\nddxhyl.com\nddxq.mobi\nddxs.vip\nddxsku.com\nddxstxt8.com\nddyjapp.com\nddyqh.com\nddyun.com\nddyun123.com\nddyylczz.com\nddyylczzs.com\nddz.com\nddzf.cc\nddzhj.com\nddzl.net\nddzls.net\nddzn.tech\nddznzj.com\nddztv.com\nddzui.com\nddzuqin.com\nddzuwu.com\nde-ele.com\nde-moe.org\nde-tencentclb.cloud\nde-tencentclb.com\nde-tencentclb.net\nde-tencentclb.work\nde0.cc\nde1000.com\nde123.net\nde1919.com\nde2edec3011032.beer\nde56.com\nde83cc01111.xin\nde9745f491023.beer\ndeaconhousewuxi.com\ndeadnine.com\ndeafchina.com\ndeahu.com\ndealsbank.com\ndealsmake.com\ndeansys.com\ndear520dear.com\ndearclick.com\ndearda.com\ndearedu.com\ndearisland.com\ndeartree.com\ndearxuan.com\ndeasun.com\ndeathearth.com\ndeau-cable.com\ndeb1c7bad11031.beer\ndebao.com\ndebao123.com\ndebaochina.com\ndebbe32e10b635a7.com\ndeben.me\ndebug.moe\ndebugdump.com\ndebugo.com\ndebuycn.com\ndecansmd.com\ndecard.com\ndecd5279411012.beer\ndecent-china.com\ndecentcapital.com\ndecerp.cc\ndechang-chem.com\ndechingroup.com\ndechlogi.com\ndechong.site\ndechua.com\ndeckmanager.net\ndeclous.com\ndecohome.cc\ndecoration.ltd\ndecorcn.com\ndecwhy.com\ndeczh.com\ndede-zj.com\ndede168.com\ndedeadmin.com\ndedebiz.com\ndedecms.com\ndedecms8.com\ndedecmsmuban.com\ndedecmsplus.com\ndedeeims.com\ndedegg.com\ndedejs.com\ndedemao.com\ndedesos.com\ndedezhuji.com\ndeebio.com\ndeeceal.com\ndeehon.com\ndeemos.com\ndeep-os.com\ndeep56.com\ndeepblog.net\ndeepcloudsdp.com\ndeepcoin.red\ndeepcool.com\ndeepdone.work\ndeepepg.com\ndeepermobile.com\ndeepfast.com\ndeepin-ai.com\ndeepin.com\ndeepin.io\ndeepin.org\ndeepinghost.com\ndeepinmind.com\ndeepinos.org\ndeepinout.com\ndeepinstall.com\ndeepleaper.com\ndeeplearn.me\ndeeplearn.work\ndeepmd.net\ndeepoon.com\ndeeprouter.org\ndeepseapioneer.com\ndeepseek.com\ndeepseeksvc.com\ndeepsheet.net\ndeeptechchina.com\ndeeptrain.net\ndeeptrip.com\ndeepvinci.tech\ndeepvps.com\ndeer-express.com\ndeerex.com\ndeerfieldbch.com\ndeerhappy.com\ndeerjet.com\ndeerma.com\ndeernice.com\ndeexchina.com\ndef5feeaeb220776.com\ndefair.online\ndefcoding.com\ndefeng999.com\ndefineabc.com\ndefoen.com\ndefofy.com\ndefoile.com\ndefuv.com\ndefvul.com\ndegitec-jiangyin.com\ndeguoguanjia.com\ndehe99.com\ndeheheng.com\ndeheng.com\ndehengclinic.com\ndehenglaw.com\ndehsm.com\ndehua.net\ndehuaca.com\ndehuigroup.com\ndehuisk.com\ndehuiyuan.com\ndehumidifierchina.com\ndeifgs.com\ndeikuo.com\ndejia-shijiebei1.com\ndejiart.com\ndejiplaza.com\ndekeego.com\ndekekc.com\ndekls.com\ndekonglife.com\ndektw.com\ndekuncn.com\ndekunyy.com\ndekyy.com\ndel.pub\ndelaiyun.cloud\ndelanauto.com\ndele.com\ndeli-tools.com\ndelib2b.com\ndelibao.com\ndelicacyup.com\ndelicloud.com\ndelilegal.com\ndelin-sh.com\ndelingkeji.com\ndelinklab.com\ndelipu.cc\ndelishi.com\ndeliworld.com\ndelixi-electric.com\ndelixi.com\ndelixidrive.com\ndeliyun.com\ndell-alw.com\ndell-brand.com\ndell027.com\ndellecs.com\ndellemc-solution.com\ndellenglish.com\ndellfuwuqi.com\ndellhpibm.com\ndellrsm.com\ndellzj.com\ndelong-group.com\ndelonggou.com\ndelonix.group\ndelovabio.com\ndelphi-connect.com\ndelphijiaocheng.com\ndeltaverse.net\ndelun-group.com\ndelunyk.com\ndeluxewatchbox.com\ndeluxworld.com\ndeluya.com\ndemanmedical.com\ndemark-jgkj.com\ndemaxmedical.com\ndemingzi.com\ndemix.cc\ndemixc.com\ndemizhongbao.com\ndemlution.com\ndemo-15.work\ndemo1024.com\ndemo8.com\ndemodashi.com\ndemogic.com\ndemon.tw\ndemonlee.tech\ndemososo.com\ndenachina.com\ndenaircompressor.com\ndeng88.com\ndenganliang.com\ndengbaogonggao.com\ndengbi8.com\ndengbiao.com\ndengdingsheng.com\ndengfengwater.com\ndengguobi.com\ndenghao.org\ndenghaoxuan.com\ndenghuo.com\ndengkanwen.com\ndengmoe.com\ndengni.org\ndengta120.com\ndengtabao.com\ndengtacj.com\ndengtadaka.com\ndengxiaolong.com\ndengxiaopingnet.com\ndeniulor.com\ndenon-proaudio.com\ndenopark.com\ndenson168.com\ndentistshow.com\ndenverokie.com\ndenza.cloud\ndenzacloud.com\ndeosen.com\ndeosin.com\ndep-star.com\ndepailed.com\ndepamu.com\ndependdns.com\ndephir.com\ndeppon.com\ndepthlink.com\ndepuchem.com\ndeqingbank.com\ndercase.com\nderekchou.com\nderenbs.com\nderlook.com\nderucci.com\nderun-env.com\nderunbao.com\nderunss.com\nderuxi.com\nderzh.com\ndes8.com\ndesano.com\ndesay.com\ndesaysv.com\ndeserts.io\ndeshaus.com\ndesheng-edu.com\ndesheng-school.com\ndesheng.net\ndeshengdachem.com\ndeshenghonglan.com\ndeshengtea.com\ndeshengzj.com\ndeshicheng.com\ndesign-engine.org\ndesign006.com\ndesignjiaoshi.com\ndesignkit.com\ndesignmoma.com\ndesignshidai.com\ndesignsketchskill.com\ndesignuuu.com\ndesignwithlove.org\ndesignyunasai.com\ndesk-site.com\ndeskcar.com\ndeskcity.com\ndeskcity.org\ndeskguanjia.com\ndeskpool.com\ndesktop-calculator.com\ndesktopcal.com\ndeskwc.com\ndesnerboats.com\ndesoonproduct.com\ndestoon.com\ndesunpv.com\ndesuntech.com\ndeswfggabc.work\ndetaisy.com\ndeteufelde.shop\ndetion.com\ndetonfan.com\ndetonger.com\ndetu.com\ndev-dh.com\ndev59.com\ndevashen.com\ndevask.net\ndevbean.net\ndevblogs.microsoft.com\ndevclub.cc\ndevdir.biz\ndevedu.net\ndeveloper.htcvive.com\ndeveloper.microsoft.com\ndeveloper.vive.com\ndevelopers.pub\ndevelopwechat.com\ndevelopweixin.com\ndevelpress.com\ndevemi.com\ndevework.com\ndevexel-tech.com\ndevexel.com\ndevexpresscn.com\ndevicewell.com\ndevil0629.com\ndevio.org\ndevops-dev.com\ndevotiongroup.com\ndevourad.com\ndevpss.com\ndevsapp.net\ndevsiki.com\ndevskyr.com\ndevtang.com\ndevui.design\ndevweixin.com\ndevzeng.com\ndeweier.com\ndeweisi.net\ndewmobile.net\ndewu.com\ndewu.net\ndewucdn.com\ndewumall.com\ndewx.net\ndexejhyxh.com\ndexi009.com\ndexian.mobi\ndexingroup.com\ndexingrv.com\ndexinhr.com\ndexinmobi.com\ndexinquan.com\ndexinrq.com\ndexinsg.com\ndexiya.com\ndextercai.com\ndexuee.com\ndexueedu.com\ndexunyun.com\ndexxg.com\ndeyangbk.com\ndeyatech.com\ndeyayk.com\ndeyecloud.com\ndeyeehome.com\ndeyerchem.com\ndeyi.com\ndeyi.net\ndeyicc.com\ndeyijijin.org\ndeyiso.com\ndeyle-electric.com\ndeyouec.com\ndeyoulife.com\ndeyuan.fun\ndeyuantextile.com\ndeyun.fun\ndezhanyigou.com\ndezhongmobi.com\ndezhoudaily.com\ndezhoulawyer.com\ndezhuyun.com\ndezstia.com\ndf-1912.com\ndf-college.com\ndf-gd.com\ndf-nissanfc.com\ndf-nissanfl.com\ndf0535.com\ndf321b81208721f1.com\ndf33.com\ndf81.com\ndf9377.com\ndf962388.com\ndfb232ce910241.beer\ndfcfs.com\ndfcfw.com\ndfcms.net\ndfcx-bj.com\ndfdaily.com\ndfdd-toubiaole.com\ndfdinsin.com\ndfdtt.com\ndfebda0512.vip\ndfedu.com\ndfeeb7ee91022.beer\ndfev.net\ndffcw.net\ndfgiso.com\ndfgsb.com\ndfgsz.com\ndfham.com\ndfhog.com\ndfhon.com\ndfhr.com\ndfhrc.com\ndfhy888.com\ndfig0.com\ndfine.tech\ndfjyun.com\ndfkhgj.com\ndfkj.cc\ndflmtc.com\ndflzm.com\ndflzmxs.com\ndfmc.com\ndfmcastrol.com\ndfmingya.com\ndfnzhp.com\ndfpost.com\ndfpz.net\ndfqcmy.com\ndfqy.com\ndfratings.com\ndfrcb.com\ndfs168.com\ndfshurufa.com\ndfshw.com\ndfshysw.com\ndfsjsoft.com\ndfsmw.com\ndfsouth.com\ndfss-club.com\ndfstw.com\ndfsyjm.com\ndftcdq.com\ndftryy.com\ndftyyls.com\ndftzj.com\ndfwl.net\ndfwlg.com\ndfxq.com\ndfxqc.com\ndfxwdc.com\ndfxy.net\ndfxyw.com\ndfy027.com\ndfyanyi.com\ndfyapp.com\ndfyl-luxgen.com\ndfyne.cz\ndfynet.com\ndfyoo.com\ndfysgs.com\ndfysscy.com\ndfysw.net\ndfyuan.com\ndfyyc.com\ndfyzx.com\ndfzbsh.com\ndfzk.com\ndfzmzyc.com\ndfzxvip.com\ndfzyxy.net\ndg-360lhx.com\ndg-dns.com\ndg-dx.com\ndg-hanxin.com\ndg-mall.com\ndg-niuniu.com\ndg-paas.com\ndg-tcm.com\ndg11185.com\ndg121.com\ndg456.com\ndg688.com\ndgaefi.org\ndgaiia.com\ndgbaineng.com\ndgbgw.com\ndgbia.com\ndgbyxny.com\ndgbzy.com\ndgcct.com\ndgchenghe.com\ndgcia.com\ndgcpkl.com\ndgddh.xyz\ndgdq1688.com\ndgdqw.com\ndgdydd.com\ndgegbj.com\ndgeia.com\ndgg.net\ndggcyy.com\ndggdk.com\ndgggs.com\ndgghy.com\ndggjqw.com\ndggjyy.com\ndggosungroup.com\ndggq.com\ndggxxh.com\ndggywx.com\ndghgzm.com\ndghjt.com\ndghobo17.com\ndghonggao.net\ndghqmotor.com\ndghuafuli.com\ndginfo.com\ndgjijiagong668.com\ndgjiuqi.com\ndgjoy.co\ndgjwsy.com\ndgjx.net\ndgjxmk.com\ndgjy.net\ndgk2n.com\ndgkj888.com\ndglpool.com\ndglyjx.com\ndglyyun.com\ndglzd.com\ndgmama.net\ndgn.cc\ndgndf.com\ndgnekon.com\ndgnet.net\ndgnkj.com\ndgobch.com\ndgod.net\ndgouyijiance.com\ndgovp.com\ndgpenghao.com\ndgphospital.com\ndgpp.com\ndgprj.com\ndgpump86.com\ndgqczz.com\ndgqianguan.com\ndgqjj.com\ndgqzxx.net\ndgrbcj.com\ndgrcw.com\ndgrsa.org\ndgruizhi.com\ndgrunhe.com\ndgs-td2.com\ndgsbtjx.com\ndgsfweb.com\ndgshifeng.com\ndgshunjin.com\ndgsltx.com\ndgsme.org\ndgspk.com\ndgswhg.com\ndgsztyy.com\ndgt-factory.com\ndgtianbao.xin\ndgtle.com\ndgtn1718.org\ndgtpcj.com\ndgtungwah.com\ndgtuoyue.com\ndgtzjt.com\ndgw888.com\ndgweierwj.com\ndgweitian.com\ndgwia.com\ndgwlhj.com\ndgwtrl.com\ndgxbjg.com\ndgxinde.net\ndgxue.com\ndgxxz.com\ndgxzxjj.com\ndgyanda.com\ndgyejia.com\ndgyhsb.com\ndgyian.com\ndgyibiao.com\ndgykz.com\ndgylec.com\ndgyq-water.com\ndgysdx.com\ndgytdz.com\ndgyuanyi.com\ndgyw.cc\ndgzaixing.com\ndgzcsy.net\ndgzhihongjx.com\ndgzhisen.com\ndgzj.com\ndgzp.com\ndgzx.net\ndgzz1.com\ndh.cx\ndh01.com\ndh0580.com\ndh08126.net\ndh33660.com\ndh3t.com\ndh5a.com\ndh5idnf.com\ndh7373.com\ndh7999.com\ndh818.com\ndh9191.com\ndh978.com\ndhaitun.com\ndhasgf.com\ndhb.hk\ndhb168.com\ndhboy.com\ndhbs86.com\ndhchain.com\ndhcooker.com\ndhdly.com\ndhg858a07.shop\ndhgfhgsfg.com\ndhgsqjcnd.com\ndhgsqjcnj.com\ndhgsqjcnm.com\ndhguanye.com\ndhgz.com\ndhh-gz.com\ndhhqfw.com\ndhidcw.com\ndhimavision.com\ndhj3413.com\ndhjt.com\ndhkm.vip\ndhkq120.com\ndhkqyy.com\ndhl-online.com\ndhl-y.info\ndhl8o3x5.bond\ndhlfki.shop\ndhlijg.bond\ndhlvux.asia\ndhlzhif.asia\ndhmeri.com\ndhmsnyy.com\ndhppa.com\ndhqfz.com\ndhqtech.com\ndhrcbank.com\ndhrest.com\ndhrest2.com\ndhs-sports.com\ndhsrmyy.com\ndhszyy.net\ndht5867.com\ndhtest.com\ndhtopology.com\ndhtv.tv\ndhuili.com\ndhvisiontech.com\ndhw-wiremesh.com\ndhw22.com\ndhwooden.com\ndhxx.com\ndhyct.com\ndhyjaqa.com\ndhyz.net\ndhzfgm.com\ndhznib.com\ndi1k.com\ndi28nl.com\ndi3ke.com\ndi7cn.net\ndi88.net\ndiablohu.com\ndiact.com\ndiaidi.com\ndiaigame.com\ndialoguechinefrance.com\ndiamondfavour.net\ndiamondfsd.com\ndiamondinnovations.cfd\ndian-ai.com\ndian-stable.com\ndian.so\ndian123.com\ndian234.com\ndian5.com\ndian68.net\ndianapp.com\ndianbaobao.com\ndianbb.com\ndianbio.com\ndianbo.org\ndianbobao.com\ndianbucuo.com\ndiancang.xyz\ndianchacha.com\ndianchizhijia.com\ndianchouapp.com\ndiandanbao.com\ndiandao.org\ndiandaxia.com\ndiandeng.tech\ndiandian.com\ndiandian.net\ndiandianchong.com\ndiandianmeijia.com\ndiandiannuo.com\ndiandianqi.com\ndiandianshu.com\ndiandianwaimai.com\ndiandianys.com\ndiandianzhe.com\ndiandong.com\ndiandongche.biz\ndianfanyingyu.com\ndianfengcms.com\ndianfuji.com\ndiangan.org\ndiangeapp.com\ndiangong8.com\ndiangongbao.com\ndiangongjiang.com\ndiangongwu.com\ndianhen.com\ndianhong.com\ndianhou.com\ndianji007.com\ndianjianggame.com\ndianjiangrcw.com\ndianjiangxin.cc\ndianjihr.com\ndianjin123.com\ndianjinghu.com\ndianjingzhe.com\ndianjipinpai.com\ndianjiqi.com\ndiankeji.com\ndianlanbao.com\ndianlanyibiao.com\ndianli.com\ndianli08.com\ndianli100.com\ndianlinet.com\ndianlut.com\ndianlut.net\ndianmi365.com\ndiannaoban.com\ndiannaodiy.net\ndiannaoxianka.com\ndianopen.com\ndianou.com\ndianpifa.com\ndianping.com\ndianpingba.com\ndianpushuo.com\ndianqikaiguan.com\ndianqizazhi.com\ndianqugame.com\ndianranart.com\ndianremo1688.com\ndianrong.com\ndianru.net\ndians.net\ndiansan.com\ndianshanchina.com\ndianshang.com\ndianshangmulu.com\ndianshangyi.com\ndianshi.com\ndianshihome.com\ndianshijia.com\ndianshu119.com\ndiansu-cdn.net\ndiantads.com\ndiantangzuyi.com\ndiantonghudong.com\ndiantoushi.com\ndiantui.net\ndianwanhezi.com\ndianwannan.com\ndianwanshidai.com\ndianwantu.com\ndianwo98.com\ndianwoba.com\ndianwoda.com\ndianwolf.com\ndianwoyou.com\ndianxian.net\ndianxian8.com\ndianxiandianlanchang.com\ndianxiaobao.net\ndianxiaomi.com\ndianxin.net\ndianxinnews.com\ndianxinos.com\ndianyacloud.com\ndianyingshow.com\ndianyingwenxue.com\ndianyong123.com\ndianyongqi.com\ndianyuan.com\ndianzhanggui.net\ndianzhangzhipin.com\ndianzheli.com\ndianzhenkeji.com\ndianzhentan.com\ndianzhi.com\ndianzhong.com\ndianzi6.com\ndianziaihaozhe.com\ndianzihetong.net\ndianzixuexi.com\ndianzizhao.com\ndiaoben.com\ndiaochapai.com\ndiaochapai.net\ndiaochatong.com\ndiaocnc.com\ndiaoding.biz\ndiaojiang.com\ndiaokeji.net\ndiaosaas.com\ndiaosi.net\ndiaosiweb.net\ndiaosu9.com\ndiaosu98.com\ndiaosunet.com\ndiaosuoju.net\ndiaox2.com\ndiaoy.com\ndiaoyan001.com\ndiaoyou.com\ndiaoyoupai.com\ndiaoyu.com\ndiaoyu123.com\ndiaoyu365.com\ndiaoyuren.com\ndiaoyuwang.com\ndiaoyuweng.com\ndiary365.net\ndiaxue.com\ndiazha.com\ndibaifang.com\ndibang18.com\ndibaotong.com\ndibchina.com\ndibcn.com\ndiboot.com\ndibunet.com\ndic123.com\ndicastal.com\ndichan.com\ndichan.net\ndichanlao.com\ndichanren.com\ndichanw.com\ndichedai.com\ndicila-china.com\ndicksflashsale-vip.com\ndicom365.com\ndictall.com\ndida110.com\ndida365.com\ndidabds.com\ndidacar.com\ndidachuxing.com\ndidamall.com\ndidao.com\ndidaoshidai.com\ndidapaper.com\ndidapinche.com\ndidatravel.com\ndidatxt.com\ndidctf.com\ndideu.com\ndidi-food.com\ndidi-trip.com\ndidi.xin\ndidialift.com\ndidiapp.com\ndidiaustralia.blog\ndidibuluo.com\ndidichuxing.com\ndididadidi.com\ndididapiao.com\ndididi88.com\ndidiglobal.com\ndidimobility.co.jp\ndidimobility.com\ndidiopenapi.com\ndidipai.com\ndidiqiche.com\ndidishijie.com\ndidispace.com\ndidistatic.com\ndiditaxi.com\ndidiwuxian.com\ndidixk.com\ndidiyun.com\ndidiyun.org\ndidiyunapi.com\ndiducoder.com\ndiebian.net\ndieclock.com\ndiemoe.net\ndieniao.com\ndieqiu.com\ndiershoubing.com\ndietfd.com\ndiexuan.net\ndiexun.com\ndieyanli.com\ndifanapp.com\ndifersports.com\ndiffir.com\ndiffusefuture.com\ndiffusenetwork.com\ndig-gy.com\ndigcredit.com\ndigeeker.com\ndigi-wo.com\ndigigd.com\ndigihail.com\ndigihuman.com\ndigiic.com\ndigiinfr.com\ndigimons.net\ndigirepub.com\ndigisky.com\ndigit3ds.com\ndigital-hangzhou.com\ndigital-ren.com\ndigitalchina.com\ndigitalchinahealth.org\ndigitalcloudshield.com\ndigitalcnzz.com\ndigitalcq.com\ndigitaldrew.net\ndigitalfiles.org\ndigitaling.com\ndigitaljx.com\ndigitalmanu.com\ndigitalvolvo.com\ndigitalwuhan.com\ndigitalwuhan.net\ndigitalyili.com\ndigitclouds.com\ndigitguangdong.com\ndigitimetech.com\ndigitlink.net\ndigitser.net\ndigitwater.com\ndigiwin.com\ndigiwoods.com\ndigiwork.com\ndigod.com\ndigoexpress.com\ndigsur.com\ndigu.com\ndigu.plus\ndigu365.com\ndigua.com\ndiguage.com\ndiguazu.com\ndihaobedding.com\ndihaopipe.com\ndihaowa.com\ndihuaikeji.com\ndiiqu.com\ndijianggroup.com\ndijingchao.com\ndijiuban.com\ndikalon.com\ndikeqc.com\ndili360.com\ndili365.com\ndilidili.com\ndiliy.com\ndima-industry.com\ndimei88.com\ndimeng.vip\ndimensi-9.com\ndimensionalzone.com\ndimenspace.com\ndimocap.com\ndimolabel.com\ndimsmary.tech\ndimsolo.com\ndimtown.com\ndinais.com\ndinarspeculator.com\ndindin.com\nding-chuang.com\nding-liang.com\ndingbang99.com\ndingcaicai.com\ndingcooltech.com\ndingdachuxing.com\ndingdandao.com\ndingdangchem.com\ndingdanggj.com\ndingdangjia.net\ndingdangnao.com\ndingdanxia.com\ndingdatech.com\ndingdd.com\ndingdean.com\ndingdi.com\ndingdian001.com\ndingdiange.org\ndingdiann.com\ndingdiann.net\ndingdiansk.com\ndingdianxs.la\ndingdianzw.com\ndingding.com\ndingding.xin\ndingdingdan.com\ndingdingdoctor.com\ndingdingkaike.com\ndingdingtingche.com\ndingdingzn.com\ndingdone.com\ndingdongcloud.com\ndingdongebusiness.com\ndingdongmao.com\ndingdongxiaoqu.com\ndingdx.com\ndingefactory.com\ndingertai.com\ndingfubang.com\ndinggebaojian.com\ndinggou.org\ndinggu.net\ndinghaiec.com\ndinghantech.com\ndinghengjc.com\ndinghu.com\ndinghuakuai.com\ndinghuaren.com\ndinghui.org\ndinghuo123.com\ndinghuo365.com\ndinghuoche.com\ndinghuovip.com\ndingjiwangluo.com\ndingkeji.com\ndinglia.com\ndingliangame.com\ndinglianhuanbao.com\ndinglicom.com\ndinglipin.net\ndinglongchem.com\ndinglongjx.com\ndinglutang.com\ndingoa.com\ndingqiao.cc\ndingqiaoks.com\ndingqibao.com\ndingqidong.com\ndingqingyun.com\ndingrongxd.com\ndingrtc.com\ndingruxin.com\ndingsheng.com\ndingso.com\ndingtalent.com\ndingtalk.com\ndingtalk.net\ndingtalkapps.com\ndingtalkcloud.com\ndingtangzqx.com\ndingteam.com\ndingtoo.com\ndingwei.link\ndingweilishi.com\ndingwenacademy.com\ndingxiang-inc.com\ndingxikeji.com\ndingxinwen.com\ndingxiushipin.com\ndingxutonghui.com\ndingyang.com\ndingyanqf.com\ndingyantec.com\ndingyao17.com\ndingyue-ele.com\ndingyueads.com\ndingzhijl.com\ndingzhoudaily.com\ndingzhourencai.com\ndiningcity.asia\ndinju.com\ndinpay.com\ndinsense.com\ndinte.work\ndinyocasa.com\ndinzd.com\ndiodecy.com\ndioenglish.com\ndiomasce.com\ndionly.com\ndiopic.net\ndious-f.com\ndipephoto.com\ndipont.com\ndippstar.com\ndiqiuw.com\ndiqua.com\ndir001.com\ndir28.com\ndirectui.com\ndis9.net\ndisccrds.com\ndiscount-polska.store\ndiscourse-studies.com\ndiscoversources.com\ndiscoveryriflescope.com\ndiscrepancye.com\ndiscuz.chat\ndiscuz.com\ndiscuz.net\ndiscuz.org\ndiscuz.vip\ndiscuzfans.net\ndiscuzlab.com\ndisenjn.com\ndishanhuanbao.com\ndishen.com\ndishuge.com\ndishuizhijia.com\ndisimy.com\ndislux.com\ndislytegame.com\ndismall.com\ndistantmeaning.com\ndistinctclinic.com\nditai.fun\nditan.com\nditan360.com\nditian-tech.com\nditianshanhe.com\nditiefuli.com\nditiezu.com\nditiezu.net\nditrit.com\nditu.live.com\ndituhui.com\ndituw.net\ndituwuyou.com\ndituyi.com\ndiugai.com\ndiuta.com\ndiuut.com\ndivcss5.com\ndivepai.com\ndiving-fish.com\ndivizg.com\ndivoiotcloud.com\ndiwork.com\ndiwuyuan.com\ndixinkj.com\ndixintong.com\ndiy10.com\ndiyahz.com\ndiybcq.com\ndiydiymall.com\ndiygogogo.com\ndiygw.com\ndiyhi.com\ndiyibox.com\ndiyicai.com\ndiyidan.com\ndiyidan.net\ndiyidanhao.com\ndiyiedu.com\ndiyifanwen.com\ndiyifanwen.net\ndiyigaokao.com\ndiyihuifu.com\ndiyiliuxue.com\ndiyinews.com\ndiyishijian.com\ndiyixiazai.com\ndiyixin.com\ndiyiyou.com\ndiyiyt.com\ndiyiyunshi.com\ndiyiziti.com\ndiyleyuan.com\ndiymianmo.com\ndiymysite.com\ndiynova.com\ndiyosl.com\ndiypda.com\ndiyring.cc\ndiyyh.com\ndiyzhen.com\ndizalpharma.com\ndizgslb.com\ndizh.net\ndizhimei.com\ndizhu.org\ndizhuche.com\ndiziguiwang.com\ndizishu.com\ndizzylab.net\ndj-dj.net\ndj.net\ndj.tc\ndj10.com\ndj134.com\ndj16.com\ndj175.com\ndj193.com\ndj63.com\ndj89.com\ndj92.cc\ndj92cc.com\ndj96.com\ndj97.com\ndj99.com\ndjbh.net\ndjbhjg.net\ndjbx.com\ndjc8888.com\ndjcc.com\ndjcp099.com\ndjcscs.com\ndjcx.cc\ndjdjapp.com\ndjdkk.com\ndjdsh.com\ndjduoduo.com\ndjdyqn.com\ndjec.net\ndjeconomic.com\ndjf.com\ndjf313.com\ndjfensi.com\ndjfrj.com\ndjgy.com\ndjhxn.com\ndji.com\ndji.ink\ndji.net\ndjiang.net\ndjiavip.com\ndjicdn.com\ndjigate.com\ndjiits.com\ndjiops.com\ndjiservice.org\ndjjgj.com\ndjjlseo.com\ndjjw.com\ndjjyzly.com\ndjkgongshui.com\ndjkhgy2.com\ndjkk.com\ndjkpai.com\ndjksh.com\ndjksq.com\ndjkxl.com\ndjlcom.net\ndjlmvip.com\ndjlsoft.net\ndjm-bj.com\ndjmillison.com\ndjrhf0.com\ndjserver.center\ndjsh5.com\ndjstechpc.com\ndjstg.com\ndjtpf.com\ndjtpt.com\ndjtt.com\ndjttw.com\ndjtz.net\ndju8.com\ndjunf.com\ndjuu.com\ndjwjsj.com\ndjxcable.com\ndjxww.com\ndjy517.com\ndjye.com\ndjyg.shop\ndjyinyue.com\ndjyjob.com\ndjymjsw.com\ndjyule.com\ndjzhj.com\ndjzr88.com\ndjzyg.com\ndk-lexus.com\ndk8s.com\ndkashop.com\ndkcloudlive.com\ndkdangle.com\ndkdgroup.com\ndkdsfrwety.xyz\ndkewl.com\ndkfinancing.com\ndkgyw.com\ndkhg23.com\ndkhs.com\ndkjiaoyang.com\ndkjmy.com\ndkjmyq.com\ndklogs.net\ndkmol.net\ndknsankf.com\ndkntgc.com\ndksgames.com\ndkskcloud.com\ndktad.com\ndktzjt.com\ndku51.com\ndky.cc\ndkybpc.com\ndkykyt5516.vip\ndkzt.com\ndkzx.net\ndl-hf.com\ndl-hr.com\ndl-kg.com\ndl-meitu.com\ndl-rc.com\ndl.delivery.mp.microsoft.com\ndl.dell.com\ndl0728.com\ndl23zx.com\ndl2link.com\ndl56.net\ndl8z.com\ndlairport.com\ndlbaohuang.com\ndlbbdk.com\ndlbbs.com\ndlbh.net\ndlbiotech.com\ndlcaic.com\ndlcsos.com\ndld56.com\ndldlsw.com\ndldm.com\ndledu.com\ndler.cloud\ndlfederal.com\ndlfeyljt.com\ndlfy-metalparts.com\ndlg-expo.com\ndlgouji.com\ndlgslb.net\ndlgwbn.com\ndlgxbl.com\ndlhaibaobio.com\ndlhope.com\ndlhospital.com\ndlhuayang.com\ndlhwjq.com\ndljczb.com\ndljdy.com\ndljianbing.com\ndljierui.com\ndljlxx.com\ndljrw.com\ndljs.net\ndljsjt.com\ndlkldz.com\ndlkykycc55.com\ndllawyers.org\ndllzj.com\ndlmeasure.com\ndlmianshuiche.com\ndlmonita.com\ndlmyzf.com\ndlmzk.com\ndlnel.com\ndlnel.org\ndlnyzb.com\ndlonng.com\ndlosri.com\ndlphoschem.com\ndlpuwan.com\ndlqcgz.com\ndlrkb.com\ndls88.com\ndlsccn.com\ndlsgs.com\ndlshian.com\ndlsjyy.com\ndlsqb.com\ndlssa.com\ndlsstax.com\ndlsunworld.com\ndlszywz.com\ndlteacher.com\ndltm.net\ndltobacco.com\ndltubu.com\ndlvalve.com\ndlw-lighting.com\ndlw360.com\ndlw666.com\ndlwang.vip\ndlwjdh.com\ndlwmkj.com\ndlwx369.com\ndlxgjy.com\ndlxk.com\ndlxmicro.com\ndlxww.com\ndly56.com\ndlyy365.com\ndlzb.com\ndlzbxx.com\ndlzj.net\ndlzs-audio.com\ndlztb.com\ndlzxyy.com\ndlzyc.com\ndm-hr.net\ndm004.net\ndm0775.com\ndm21.com\ndm300.com\ndm456.co\ndm5.com\ndm591.com\ndm5u.com\ndm67.com\ndm9.com\ndma13.org\ndmacg.net\ndmaking.com\ndmall.com\ndmallcdn.com\ndmallovo.com\ndmaow.com\ndmb168.com\ndmcdn.com\ndmd968.com\ndmdaili.com\ndmeg88.com\ndmeiti.com\ndmeiti.net\ndmeng.net\ndmentt.help\ndmgapp.com\ndmgeek.com\ndmggb.com\ndmgpark.com\ndmguo.com\ndmgyta.com\ndmgytb.com\ndmhlj.com\ndmhmusic.com\ndmhy.com\ndmicrobe.com\ndmiug.com\ndmjk120.com\ndmjnb.com\ndmjvip.com\ndmm.ink\ndmmaterial.com\ndmooo.com\ndmpdmp.com\ndmpdsp.com\ndmplugin.net\ndmqhyadmin.com\ndmqst.com\ndmqwl.com\ndmread.com\ndmrta.com\ndms365.com\ndmssc.net\ndmtemp.com\ndmtg.com\ndmtgy.com\ndmu-1.com\ndmvideo.mobi\ndmvideo.net\ndmvideo.org\ndmvvv.com\ndmxs.net\ndmyouxi.com\ndmyy.cc\ndmzfa.com\ndmzgame.com\ndmzj.com\ndmzlcn.com\ndmzx.com\ndmzzbjb.net\ndmzzkz.com\ndn.com\ndn23.com\ndn580.com\ndn8188.com\ndnake-park.com\ndnatupu.com\ndnbbn.com\ndnbbs.com\ndnbiz.com\ndncable.com\ndndc.cloud\ndnettvbox.com\ndnfziliao.com\ndngswin7.com\ndngz.net\ndnhcc.com\ndningbo.com\ndnion.com\ndnjd.com\ndnjsb.com\ndnlunwen.com\ndnmall.com\ndnmcn.com\ndnnunion.com\ndnole.com\ndnparking.com\ndnpz.net\ndnqc.com\ndnrenfang.com\ndns-diy.com\ndns-dns.net\ndns-sky.com\ndns-url.com\ndns-waf.com\ndns.com\ndns.la\ndns.pub\ndns002.com\ndns0755.net\ndns100.net\ndns110.com\ndns123.net\ndns12345.com\ndns200.net\ndns2008.com\ndns567.com\ndns6132.com\ndns666.com\ndns6868.com\ndns800.com\ndnsabc.com\ndnsany.com\ndnsapi12.com\ndnsbbzj.com\ndnsbubu.com\ndnsce.com\ndnscnc.com\ndnsdaquan.com\ndnsddos.com\ndnsdizhi.com\ndnse0.com\ndnse0.net\ndnse1.com\ndnse1.net\ndnse2.com\ndnse2.net\ndnse3.com\ndnse3.net\ndnse4.com\ndnse4.net\ndnse5.com\ndnse5.net\ndnse6.com\ndnse6.net\ndnse7.com\ndnse7.net\ndnse8.com\ndnse8.net\ndnse9.com\ndnse9.net\ndnsfamily.com\ndnsfast.online\ndnsff.com\ndnsfox.net\ndnsgtm.com\ndnsguest.com\ndnsgulf.net\ndnsh6666.com\ndnshe.com\ndnsidentity.com\ndnsinside.net\ndnsip.com\ndnsip.net\ndnsis.net\ndnsjia.com\ndnsjiasu001.com\ndnslin.com\ndnsmeasurement.com\ndnsmsn.com\ndnsng.net\ndnsns5.com\ndnsns6.com\ndnsnut.com\ndnsnw.com\ndnso.fun\ndnsoe1.com\ndnsoe2.com\ndnsoe3.com\ndnsoe4.com\ndnsoe5.com\ndnsoe6.com\ndnsoray.net\ndnsour.com\ndnspai.com\ndnspig.com\ndnspod.com\ndnspod.mobi\ndnspod.net\ndnspod.org\ndnspood.net\ndnsppdd.com\ndnspro.icu\ndnsrw.com\ndnss.vip\ndnssina.com\ndnstest.vip\ndnstx88.cc\ndnsurl.net\ndnsv1.com\ndnsv1.net\ndnsv2.com\ndnsv2.net\ndnsv20.com\ndnsv3.com\ndnsv3.net\ndnsv4.com\ndnsv4.net\ndnsv5.com\ndnsv5.net\ndnsv8.net\ndnsvcache.com\ndnsvhost.com\ndnsvip1.net\ndnsw7777.com\ndnswa.com\ndnswhk.com\ndnswind.net\ndnsx9.cc\ndnsxdp.com\ndnsxv1.com\ndnsxv1.net\ndnsxv2.com\ndnsxv2.net\ndnsxv3.com\ndnsxv3.net\ndnsxv4.com\ndnsxv4.net\ndnsxv5.com\ndnsxv5.net\ndnsy8888.com\ndnsyy.net\ndnszftp.com\ndnszh.com\ndnszw.com\ndnurse.com\ndnv-group.com\ndnwxwww.com\ndnxtc.net\ndnxttech.com\ndny123.com\ndny8.com\ndnyywl.com\ndnzh.org\ndnzhuti.com\ndnzjds.com\ndnzp.com\ndo-won.com\ndo123.net\ndo1618.com\ndo1999.com\ndo35.com\ndoabit.com\ndoata.net\ndobe-game.com\ndobechina.com\ndobest.com\ndobosc.com\ndobunkan.com\ndoc-baidu.org\ndoc163.com\ndoc361.net\ndoc88.com\ndoccamera.com\ndocer.com\ndocexcel.net\ndocin.com\ndocin.net\ndockerinfo.net\ndockerone.com\ndockerpull.pw\ndockone.io\ndockx.app\ndoclass.com\ndocn.net\ndocodgroup.com\ndocoi.cc\ndocpe.com\ndocs.cdnetworks.com\ndocs.microsoft.com\ndocschina.org\ndocshare.org\ndocsj.com\ndocsmall.com\ndocsou.com\ndoctor-network.com\ndoctorbridge.com\ndoctorcom.com\ndoctorkickstart.com\ndoctorscrap.com\ndoctoryou.ai\ndocuarea.org\ndocuments.cdnetworks.com\ndocx88.com\ndocxz.com\ndoczj.com\ndodjoy.com\ndodo8.com\ndodobook.net\ndodoca.com\ndodoeasy.com\ndodoedu.com\ndodoh5.com\ndodonecq.com\ndodonew.com\ndodovip.com\ndoducity.com\ndoercn.com\ndoergob.com\ndoerhr.com\ndoerjob.com\ndoffry.com\ndofolong.com\ndog-e-clothing.com\ndog089a-a66.com\ndogain.com\ndoganinsaatemlak.com\ndogecast.com\ndogecdn.com\ndogecloud.com\ndogecoin.studio\ndogedns.com\ndogedoge.com\ndogevideo.com\ndogfight360.com\ndogfuzhu.com\ndoggygosubs.com\ndoghun.com\ndoglg.com\ndogmr.com\ndogwhere.com\ndogyun.com\ndoh.plus\ndoh.pub\ndohai.com\ndohia.com\ndohuo.com\ndoibns.com\ndoii.cc\ndoingv.com\ndoit.am\ndoitim.com\ndoitwiki.com\ndoiua.com\ndoki8.com\ndolcn.com\ndolfincdnx.com\ndolfincdnx.net\ndolfincdnx.top\ndolfindns.net\ndolfindnsx.com\ndolfindnsx.net\ndolfindnsx.top\ndolgma.com\ndolike.com\ndoll-leaves.com\ndoll-zone.com\ndollun.com\ndolovely.net\ndolphin-browser.com\ndolphin-global.com\ndolphin.com\ndolphincube.com\ndolphinpaper.com\ndolphinphp.com\ndom-3d.net\ndomabio.com\ndomaingz.com\ndomesticmedia.cc\ndomesticmedia.co\ndomesticmedia.com\ndomesticmedia.net\ndomesticmedia.tv\ndomesticmediagame.co\ndomesticmediagame.net\ndomesticmediapay.com\ndomigewear.com\ndomilight.com\ndomob-inc.com\ndomob.org\ndomobcdn.com\ndomobnetwork.com\ndomor.net\ndomp4.cc\ndomp4.net\ndondonwenda.com\ndone-home.com\ndonews.com\ndong-shou.com\ndong-xu.com\ndong10.com\ndongaigc.com\ndongannews.com\ndongao.com\ndongaoacc.com\ndongaocloud.com\ndongba.com\ndongbao-cn.com\ndongbao120.com\ndongbaoshengwu.com\ndongbd.com\ndongbeishifandaxue.com\ndongbing.wiki\ndongboauto.com\ndongbochem.com\ndongbosy.com\ndongbucaijing.com\ndongcai.net\ndongcaibao.com\ndongcaibaoxian.com\ndongcaijijin.com\ndongchali.net\ndongchedi.com\ndongchediapp.com\ndongchehui.net\ndongcheng120.com\ndongchenghotels.com\ndongcheyun.com\ndongchuangipr.com\ndongchuanmin.com\ndongdao.net\ndongdianqiu.com\ndongdongaijia.com\ndongdongliu.com\ndongdongmai.com\ndongdongwenda.com\ndongdongzu.com\ndongeejiao.com\ndongfahouse.com\ndongfang-heater.com\ndongfang-sisal.com\ndongfang-wh.com\ndongfang.com\ndongfang77.com\ndongfangfuli.com\ndongfanglicaishi.com\ndongfangnews.com\ndongfangnuojin.com\ndongfangqb.com\ndongfangtech.net\ndongfangzi.cafe\ndongfeng-honda-ur-v.com\ndongfeng-honda.com\ndongfeng-nissan.com\ndongfeng-robot.com\ndongfeng.net\ndongfengem.com\ndongfengtc.com\ndongfengtrucks.com\ndongfou.com\ndongfund.com\ndonggaoshiye.com\ndongge.com\ndongguanguoyao.com\ndongguantoday.com\ndonghaidl.com\ndonghaifunds.com\ndonghaileasing.com\ndonghailighter.com\ndonghaotest.com\ndonghetea.com\ndonghongzx.com\ndonghuangshanquan.com\ndonghugroup.com\ndonghui.tech\ndonghuihospital.com\ndonghulvdao.com\ndonghushequ.com\ndongjian.cc\ndongjiao.cc\ndongjiaoapp.com\ndongjiaotn.com\ndongjiax.com\ndongjin-cn.com\ndongjinyu.com\ndongjueonline.com\ndongjujituan.com\ndongjun.cc\ndongjungroup.com\ndongjunhui.com\ndongkafei.com\ndongkelun.com\ndongkouren.com\ndonglaishun.com\ndonglangroup.com\ndongli720.com\ndonglidianji.com\ndonglin.org\ndonglinchem.com\ndonglingying.cc\ndonglinkeji.com\ndonglishuzhai.net\ndonglivillage.com\ndongliw.com\ndonglizhixin.com\ndonglongfm.com\ndongman.la\ndongmanwang.com\ndongmanxingkong.com\ndongmanzx.com\ndongmiban.com\ndongmk.com\ndongnanmaifeng.com\ndongnanshan.com\ndongnanwangjia.com\ndongni100.com\ndongniao.net\ndongnienglish.com\ndongniyingyu.com\ndongpeng.net\ndongpengjieju.com\ndongpingren.com\ndongputech.com\ndongqiang.com\ndongqiniqin.com\ndongqiudi.com\ndongqiudi.net\ndongri.com\ndongricn.com\ndongrv.com\ndongsentire.com\ndongsenzs.com\ndongshengdasha.com\ndongshiju.com\ndongshou.com\ndongshunxinxi.com\ndongsport.com\ndongtai588.com\ndongtaijt.com\ndongteng.cc\ndongting.com\ndongtu.com\ndongua.com\ndongwm.com\ndongxi.net\ndongxingkonggu.com\ndongxingnet.com\ndongxong.com\ndongxu.com\ndongyanggas.com\ndongyangmotor.com\ndongyao.ren\ndongyaods.com\ndongyaowuliu.com\ndongyewenhua.com\ndongyimg.com\ndongyin.com\ndongyin.net\ndongyixiang.com\ndongyoutu.com\ndongyuansl.com\ndongyuetruck.com\ndongyun.biz\ndongyun01.com\ndongzee.com\ndongzhougroup.com\ndongzhuandi.com\ndongzhuoyao.com\ndongzsec.com\ndonhonet.net\ndoniv.net\ndonlim.com\ndonnor.com\ndonoo.net\ndonper.com\ndontfar.com\ndonvv.com\ndoodoobird.com\ndoofull.com\ndoohe.com\ndooioo.com\ndookay.com\ndooland.com\ndoonsec.com\ndooo.cc\ndoooor.com\ndoooor.net\ndoor-expo.com\ndooready.com\ndoorhr.com\ndoorqr.com\ndoorzo.app\ndoorzo.net\ndoosunggroup.com\ndoov5g.com\ndooya.com\ndopic.net\ndopo-online.net\ndopoil.com\ndopool.com\ndora-control.cdnetworks.com\ndora-family.com\ndorapp.com\ndorcen.com\ndorgean.com\ndorole.com\ndorpule.com\ndorrr.com\ndoseeing.com\ndoserv.com\ndoservice.com\ndoshome.com\ndosilicon.com\ndosk.win\ndosnap.com\ndospy.com\ndossav.com\ndossen.com\ndostor.com\ndosxs.com\ndot.pub\ndotaindex.com\ndotamax.com\ndotcpp.com\ndotdotnews.com\ndoteck.com\ndotgate.com\ndothantech.com\ndoticloud.com\ndotty-china.com\ndotwe.org\ndou.bz\ndou.li\ndou.top\ndou6.cc\ndoubaijiu.com\ndouban.com\ndouban.fm\ndoubanio.com\ndoubao.com\ndoubaocdn.com\ndoubaozhidao.com\ndoubean.com\ndoubilm.com\ndoubimeizhi.com\ndoublearrow.net\ndoubleclick-cn.net\ndoubleclick.net\ndoublecoinholdings.com\ndoubleeagle-group.com\ndoublestarmingren.com\ndoublewin123.com\ndoublleclinic.com\ndoubo03.com\ndouboshi.net\ndouc.cc\ndoucang.com\ndoucanlk.xyz\ndoucehua.com\ndouchacha.com\ndouco.com\ndoudang.com\ndoudehui.com\ndoudeke.com\ndoudier.com\ndoudou.com\ndoudou.fun\ndoudou.in\ndoudou1217.com\ndoudou520.online\ndoudouad.com\ndoudoubird.com\ndoudouditu.com\ndoudouso.com\ndoufan.tv\ndoufm.net\ndougong.net\ndougongyun.com\ndouguo.com\ndouguo.net\ndouhao.com\ndouhaomei.com\ndouhua.net\ndouhuameiquan.com\ndouhuameiquan.net\ndouhuawenxue.com\ndouhuaxiongmao.com\ndouhuibuy.com\ndouhuomall.com\ndoujis.com\ndoukantv.com\ndoukeji.com\ndoukou.com\ndoulaicha.com\ndoulaidu.cc\ndoulaidu8.cc\ndoule-ref.com\ndouleyun.net\ndoulongyun.com\ndoumenqu.com\ndoumi.com\ndoumiip.com\ndoumistatic.com\ndouniwan.org\ndoupai.cc\ndoupay.com\ndoupocangqiong1.com\ndouqi.com\ndouqq.com\ndoushen.com\ndoushisan.com\ndousonvalve.com\ndoutian.me\ndoutianshequ.com\ndoutub.com\ndoutuimao.net\ndoutukeji.com\ndoutushe.com\ndouwanweb.com\ndouxiangtao.com\ndouxie.com\ndouya2.com\ndouyabo.com\ndouyacun.com\ndouyadaili.com\ndouyar.com\ndouyin.com\ndouyin766.com\ndouyinact.com\ndouyinact.net\ndouyincdn.com\ndouyinclips.com\ndouyincloud.net\ndouyincloud.run\ndouyinec.com\ndouyinfe.com\ndouyingequ.com\ndouyinhanyu.com\ndouyinliving.com\ndouyinmusicclips.com\ndouyinmusicpromotion.com\ndouyinmusicvideo.com\ndouyinpay.com\ndouyinpic.com\ndouyinshortvideo.com\ndouyinstatic.com\ndouyinvideo.net\ndouyinvod.click\ndouyinvod.com\ndouyinxs.com\ndouyongtuan.com\ndouyou100.com\ndouyu.com\ndouyu.tv\ndouyuex.com\ndouyuscdn.com\ndouyushepin.com\ndouyutv.com\ndouzaimai.com\ndouzi.com\ndouzihuyu.com\ndouzijiasu.com\ndovechina.com\ndovepay.com\ndovesky.com\ndovov.com\ndowater.com\ndowebok.com\ndoweidu.com\ndowell-health.com\ndowhere.com\ndown10s.com\ndown123.cc\ndown123.me\ndown199.com\ndown568.com\ndown6.com\ndownabc.com\ndownbei.com\ndowncc.com\ndowncodes.com\ndownfi.com\ndowng.com\ndownhand.com\ndownjoy.com\ndownke.com\ndownkr.com\ndownkuai.com\ndownload-cn.msi.com\ndownload.jetbrains.com\ndownload.microsoft.com\ndownload.qatp1.net\ndownload.visualstudio.microsoft.com\ndownloadcenter.samsung.com\ndownloads.ltd\ndownok.com\ndownos.com\ndownpp.com\ndownqa.com\ndownsave.com\ndownwn.com\ndownxia.com\ndownxing.com\ndownxy.com\ndownyi.com\ndownza.com\ndowv.com\ndowway.com\ndowyuan.com\ndoxo.fun\ndoxue.com\ndoxygen.io\ndoyeah.com\ndoyee.com\ndoyoimg.com\ndoyonoc.com\ndoyoo.net\ndoyoudo.com\ndoyouhike.net\ndozview.com\ndp.tech\ndp168.com\ndp2u.com\ndpanel.cc\ndpangzi.com\ndpcafc.com\ndpcq1.net\ndpcyjt.com\ndpd-hul.cfd\ndpdfsd.com\ndpdp.net\ndpdpt-prtra.cfd\ndper.com\ndpfile.com\ndpgz.com\ndpifloor.com\ndpin100.com\ndpkyz.com\ndplor.com\ndplord.com\ndplslab.com\ndpma.cc\ndpn.net\ndpqct.com\ndprjh.com\ndpsoidf.com\ndptech.com\ndptechnology.net\ndptel.com\ndpurat.com\ndpw.pub\ndpwl.net\ndpxkjw.com\ndpxq.com\ndpy8.com\ndq123.com\ndq247.com\ndq3c.com\ndq800.com\ndq99.net\ndqccc.cc\ndqccc.com\ndqcccc.com\ndqdaily.com\ndqdbrc.com\ndqdg.cc\ndqdgame.com\ndqdm.com\ndqf14u8573.com\ndqguo.com\ndqhsrq.com\ndqhui.com\ndqhyxh.com\ndqiis.com\ndqjob88.com\ndqlaketour.com\ndqlnyy.com\ndqntv.com\ndqntwl.com\ndqoooo.com\ndqpi.net\ndqpkb.com\ndqpu.com\ndqrailing.com\ndqshdj.com\ndqshjt.com\ndqsjt.com\ndqsldz.com\ndqsq.net\ndqsy.net\ndqtzdt.com\ndqyadong.net\ndqyfapiao.com\ndqyouqi.com\ndqyq.com\ndqzboy.com\ndqzrrq.com\ndqzsteel.com\ndr-bj.com\ndr-jm.com\ndr-ku.com\ndr009.com\ndraftstatic.com\ndrageasy.com\ndragon-chem.com\ndragon-download.msi.com\ndragon-guide.net\ndragon-hotel.com\ndragonballcn.com\ndragonest.com\ndragonfgame.com\ndragonfly.fun\ndragonlab.org\ndragonlcm.com\ndragonnewsru.com\ndragonsea-china.com\ndragonseagroup.com\ndragonspringwater.com\ndragontrail.com\ndragontsc.com\ndragonwell-jdk.io\ndragonyq.com\ndrakeet.com\ndramasclub.com\ndramx.com\ndrartisan.com\ndrasy.net\ndrawyoo.com\ndrbdp.com\ndrcact.com\ndrcbank.com\ndrcg8.com\ndrclvs.com\ndrcnetdns.com\ndrcuiyutao.com\ndream-loft.com\ndream-marathon.com\ndream.ren\ndream211.com\ndreamad.mobi\ndreamai.fun\ndreamavatar.com\ndreambig.work\ndreamboys.org\ndreamcast.hk\ndreamchasercapital.com\ndreame.tech\ndreamershop.com\ndreamkite.net\ndreammeta.net\ndreamo100.com\ndreampiggy.com\ndreams-travel.com\ndreamshell.cc\ndreamspark.download.prss.microsoft.com\ndreamsparkuat.download.prss.microsoft.com\ndrearry.com\ndreawer.com\ndrebella.com\ndressmeup-hk.com\ndrgou.com\ndrice.cc\ndriect-jajpviewd00.com\ndriect-jeopbnkoa00.com\ndriect-sntpjpviewa08.com\ndriectjp-jeobnksad01.com\ndriectjp-tuowja02.com\ndrinkmagazine.asia\ndrinkpoem.com\ndrip.im\ndripcar.com\ndriver114.com\ndriverchina.com\ndriverdevelop.com\ndrivergenius.com\ndriverzeng.com\ndriverzj.com\ndrivethelife.com\ndrjou.cc\ndrlai.com\ndrli.group\ndrlmeng.com\ndrm-lic-dom.net\ndrm-x.com\ndrmaml.com\ndrmsoft.net\ndrockart.com\ndroi.com\ndroiapps.com\ndroiseewd.com\ndroitstock.com\ndroiyou.com\ndrokozz.club\ndropsec.xyz\ndrouma.com\ndrp321.com\ndrpika.com\ndrry.site\ndrscrewdriver.com\ndrscrm.com\ndrsmilehealth.com\ndrsrp.com\ndrstour.com\ndrtyf.com\ndrugadmin.com\ndrugfuture.com\ndruggcp.net\ndrughk.com\ndruid.vip\ndrupalla.com\ndrupalproject.org\ndrvceo.com\ndrvi.net\ndrvsky.com\ndrxexpo.com\nds-360.com\nds-lg.com\nds028.com\nds123456.com\nds5f.com\ndsary.com\ndsb.ink\ndsbaike.com\ndsblog.net\ndscbs.com\ndscq.com\ndsdbxg.com\ndsdod.com\ndsdyf.com\ndseman.com\ndser.com\ndsfdy.com\ndsfjh.vip\ndsfpz.com\ndsfuse.com\ndsfzcz.com\ndsfzh.com\ndsgaokao.com\ndshigao.com\ndshltech.com\ndshrc.com\ndsilicone.com\ndsjt.com\ndskb.co\ndskj-ops.com\ndsktjt.com\ndskystudio.com\ndslbuy.com\ndslr120.com\ndslrpark.com\ndslt.tech\ndslvts.com\ndslwk.com\ndslyy.com\ndsm888.com\ndsmxp.com\ndsmyiyuan.com\ndsmzyy.com\ndsmzyy120.com\ndsnpz.com\ndsnzyy120.com\ndsook.com\ndspga.com\ndspgo.com\ndspmt.com\ndspwhy.com\ndsq.com\ndsqzls.com\ndsqzxyy.com\ndsrepark.com\ndss.hk\ndsspinfo.com\ndsssp.com\ndsstudio.tech\ndssz.com\ndst.gov.mo\ndstcar.com\ndstfsbc.com\ndstguanwang.com\ndsti.net\ndsw6.com\ndswjcms.com\ndswljt.com\ndswmt.com\ndswql.com\ndswx.cc\ndswzxh.com\ndsx.ac\ndsx2020.com\ndsxliuxue.com\ndsxys.pro\ndsyqt.com\ndsyun.com\ndsz.cc\ndt-paint.com\ndt-stor.com\ndt123.net\ndt830.com\ndtao.com\ndtcj.com\ndtcms.net\ndtcoalmine.com\ndtcxw.com\ndtdcjt.net\ndtdream.com\ndtdxcw.com\ndtechcn.com\ndtfjw.com\ndthgdq.com\ndthr.com\ndtidc.com\ndtime.com\ndtjh-bj.com\ndtjhgs.com\ndtlpt.com\ndtlqg.com\ndtlty.com\ndtmbw.com\ndtmiller.com\ndtminds.com\ndtmiot.com\ndtmuban.com\ndtnews.net\ndtq.com\ndtrcb.com\ndtrcw.net\ndts007.com\ndtssyy.com\ndtstack.com\ndtstatic.com\ndtston.com\ndttc-icp.com\ndttt.net\ndtuosh.com\ndtuyun.com\ndtwave.com\ndtxww.com\ndtxxjq.com\ndtysky.moe\ndtyunxi.com\ndtyzg.com\ndtzj.com\ndu-hope.com\ndu-xiaomai.com\ndu.biz\ndu7.com\ndu8.com\ndualaid.com\ndualspace.com\ndualspacetech.com\nduan.red\nduangks.com\nduanju.com\nduanju.fun\nduanjuzi.com\nduanlonggang.com\nduanmale.com\nduanmeiwen.com\nduanqu.com\nduanrong.com\nduanshipin.vip\nduanshu.com\nduantian.com\nduanwdm.com\nduanwenxue.com\nduanwenxue8.com\nduanxb.com\nduanxiansen.com\nduanxianxia.com\nduanxin.com\nduanxin520.com\nduanxindao.com\nduanzaixian.vip\nduanzao001.com\nduanzikuaizui.com\nduanziya.com\nduapp-preview.com\nduapp.net\nduasrdwb.com\nduba.cc\nduba.com\nduba.net\ndubairen.com\ndubao123.com\ndubbing.tech\ndubbingx.com\ndubbo.io\nduble.live\ndubola.com\ndubprince.com\ndubyc.com\nducafecat.com\nducafecat.tech\nducar.cc\nduchina.com\nduckycn.com\nduckyset.com\ndudong.com\ndudongsheji.com\nduduaa.com\ndudubashi.com\ndududm.com\ndudujb.com\nduduji.com\ndudujuzi.com\ndudulu.org\ndudutalk.com\nduduwo.com\nduelcn.com\ndugrqnn.xyz\nduguying.net\nduhao.net\nduhaobao.net\ndui.ai\nduia.com\nduiai.com\nduibiao.com\nduibiao.org\nduibimao.com\nduiduihuishou.com\nduiduilian.com\nduiduipengds.com\nduijie666.com\nduikuang.com\nduimg.com\nduimin.com\nduiopen.com\nduipu.com\nduishu.com\nduitang.com\nduitangwang.com\nduitianhe.com\nduiyou360.com\nduiz.net\nduizhuang.com\ndujiabieshu.com\ndujin.org\ndujixiao.com\ndujiza.com\ndujun.io\ndukang.com\ndukechiang.com\nduketop1.com\ndukharo.com\ndukku.com\ndukuai.com\ndule.cc\ndulesocks.com\nduliangaotu.com\ndulife.com\ndulifei.com\ndulightapp.com\ndullr.com\ndulwich.org\ndumall.com\ndumanhua.com\ndumasoftware.com\ndumi0898.com\ndumpapp.com\ndun.la\ndun555.com\ndun599.com\ndunan.net\ndunanac.com\ndunankeji.com\ndunbaigo.com\ndundianwang.com\ndungeon-server.com\ndungkarime.com\ndunhuang-yueqi.com\ndunhuang.com\ndunhuangtour.com\ndunjiaodu.com\ndunkhome.com\ndunstanhardcastle.com\ndunsuan.com\ndunwang.com\ndunzhiwang.com\nduoao.com\nduobiyi.com\nduocaish.com\nduocaitou.com\nduocengban.org\nduochang.cc\nduodaa.com\nduodanke.com\nduodele.com\nduodian.com\nduodiwan.com\nduodunj.com\nduoduo.link\nduoduo123.com\nduoduo365.com\nduoduobang365.com\nduoduocdn.com\nduoduocm.com\nduoduodashi.com\nduoduoipo.com\nduoduopan.com\nduoduoshipin.vip\nduoduoyin.com\nduoduoyoucai.com\nduoduoyouli888.com\nduoduoyuncai.com\nduoduozb.com\nduodutek.com\nduoduwang.com\nduoerpharmacy.com\nduofriend.com\nduofugroup.com\nduogouhui.com\nduohuanbao.com\nduohui.co\nduoic.com\nduokaima.com\nduokaiwang.com\nduokaiya.com\nduokaiyun.com\nduokan.com\nduokanbox.com\nduoke.com\nduoke.net\nduokebao.net\nduokebo.com\nduoku.com\nduolabao.com\nduolabaocdn.com\nduoladayin.com\nduolahua.com\nduolaika.com\nduolaima.com\nduolapiao.com\nduolatom.com\nduolawk.asia\nduolayunwang.com\nduole.com\nduolebaohuang.com\nduolebh.com\nduolebo.com\nduolegame.com\nduolegd.com\nduolegj.com\nduolegouji.com\nduolemahjong.com\nduolemajiang.com\nduolemao.com\nduolepdk.com\nduolephz.com\nduolesj.com\nduolesk.com\nduolexing.com\nduolexq.com\nduoliheng.com\nduoliucui.com\nduoluodeyu.com\nduomeng.fun\nduomeng.net\nduomeng.org\nduomi.com\nduomian-static.com\nduomian.com\nduomiao.pro\nduomicheng.com\nduominuo.com\nduomiyou.com\nduomni.com\nduomo3205.xyz\nduomob.com\nduomoyu.com\nduomu.hk\nduomu.tv\nduonvlangceo.com\nduopaiad.com\nduopao.com\nduopei.cc\nduopei.xyz\nduopingka.com\nduoqu.com\nduorenwei.com\nduorou.com\nduorou.me\nduorou42.com\nduosai.com\nduose.com\nduosenfashion.com\nduoshan.com\nduoshitong.com\nduoshoubang.com\nduoshuo.com\nduososo.com\nduost.com\nduotai.net\nduotaoli.com\nduotegame.com\nduoteyx.com\nduotin.com\nduotoupiao.com\nduotuscdn.com\nduowan.com\nduowanns.com\nduoweijt.com\nduoweisoft.com\nduowenlvshi.com\nduoxinqi.com\nduoxue.com\nduoyewu.com\nduoyi.com\nduoying.com\nduoyinsu.com\nduoyoumi.com\nduozhi.com\nduozhuayu.com\nduozhuayu.net\nduoziwang.com\ndup2.org\ndupingzu.com\nduplo-shandong.com\ndur9.com\nduread8.com\ndurkcell.com\ndurkeesox.net\ndurkflex.net\ndurongjie.com\ndusaiphoto.com\ndusao.vip\ndusays.com\ndusdn.com\ndusdn.net\ndushaofei.com\ndushewang.com\ndushi118.com\ndushicn.com\ndushifen.com\ndushiliren.net\ndushiquan.net\ndushu.com\ndushu.io\ndushu263.com\ndushu365.com\ndushu369.com\ndushu66.com\ndushudaren.com\nduskonlinestore.com\ndustess.com\ndustglobal.com\ndusulang.com\ndute.me\ndutenews.com\ndutyfreeyun.com\ndutype.com\nduuchin.com\nduunion.com\nduwenxue.com\nduwenz.com\nduwenzhang.com\nduwfi.org\nduxiaomai.net\nduxiaoman-int.com\nduxiaoman.com\nduxiaomanfintech.com\nduxiaomanfund.com\nduxiaomantech.com\nduxiu.com\nduxuetang.com\nduyandb.com\nduyao001.com\nduyaonet.com\nduyixing.com\nduyunfk.com\nduyunshi.com\nduzelong.com\nduzhe.com\nduzhoumo.com\ndv37.com\ndv58.com\ndvagent.com\ndvbbs.net\ndvbcn.com\ndvbei.com\ndvd2017.com.tw\ndvdc100.com\ndvidc.com\ndvkors.com\ndvmama.com\ndvmission.com\ndvr163.com\ndvrdydns.com\ndvsadive.com\ndvvvs.com\ndw-microbiology.com\ndw4.co\ndwbxg.com\ndwdds.com\ndwforging.com\ndwgbj.com\ndwgszc.com\ndwgwatch.com\ndwhub.net\ndwidc.com\ndwinput.com\ndwion.com\ndwjkgl.com\ndwjpwf.com\ndwjxz.com\ndwmoniqi.com\ndwntme.com\ndwoke.com\ndwq.com\ndwrh.net\ndwsedu.com\ndwsgases.com\ndwstatic.com\ndwstock.com\ndwt.life\ndww11.com\ndwwin.com\ndwxyamaha.com\ndwywood.com\ndwywooden.com\ndwz.lc\ndwzhs.com\ndwzjd.com\ndx-job.com\ndx-marine.com\ndx-tech.com\ndx00.net\ndx10000.com\ndx2008.com\ndx86.com\ndxbei.com\ndxcc.org\ndxclinics.com\ndxda.com\ndxdl1688.com\ndxdlw.com\ndxe520.com\ndxecs.com\ndxf6.com\ndxfbk.com\ndxfblog.com\ndxgg.co\ndxguanxian.org\ndxhuafu.net\ndxinzf.com\ndxjs.com\ndxjt2013.com\ndxjzz666.com\ndxlfile.com\ndxm-cdn.com\ndxm-int.com\ndxm-yibai.com\ndxmjinr.com\ndxmjuhe.com\ndxmlcf.com\ndxmlcfintech.com\ndxmpay.com\ndxmstatic.com\ndxmwx.com\ndxmyqh.com\ndxncyy.com\ndxnky.com\ndxnt.com\ndxnwyjw.com\ndxper.net\ndxqck.com\ndxqjg.com\ndxqyy.com\ndxr.com\ndxrc.com\ndxs8.com\ndxsaxw.com\ndxsbb.com\ndxsclass.com\ndxsdb.com\ndxsdermyy.com\ndxshtb.com\ndxsk.com\ndxsng.com\ndxsport.com\ndxsrmyy.com\ndxsvr.com\ndxszx.com\ndxton.com\ndxtradedata.com\ndxtyy.com\ndxuexi.com\ndxwei.com\ndxwfgg.com\ndxxxfl.com\ndxxzjgdgs.com\ndxy.com\ndxy.me\ndxy.net\ndxyan.org\ndxyb.com\ndxycdn.com\ndxyer.com\ndxyff.com\ndxys.pro\ndxyykj.com\ndxzanzhu.com\ndxzhz.com\ndxzk88.com\ndxzq.net\ndxztc.com\ndxzw.com\ndxzx.com\ndy-bus.com\ndy-hospital.com\ndy120.net\ndy163.cc\ndy172.com\ndy1905.net\ndy2018.com\ndy2066.com\ndy3j.com\ndy558.com\ndyaobo2029.com\ndybeta.com\ndycar.net\ndyccb.net\ndycdn.com\ndycic.net\ndycjy.com\ndycloud.run\ndycloudbk.com\ndycmyl.com\ndycnchem.com\ndycom365.com\ndycyw.com\ndydata.io\ndydt.net\ndye-ol.com\ndyechina.com\ndyedu.net\ndyemp.com\ndyets-cn.com\ndyfc.net\ndyfm200.com\ndyfsp88.wiki\ndyg-hec.com\ndygf.com\ndygmotor.com\ndygod.org\ndygyjs.com\ndygzs.com\ndyhculture.com\ndyhengli.com\ndyhgames.com\ndyhjw.com\ndyhongshun.com\ndyhuidong.com\ndyhxgame.com\ndyjqd.com\ndyjqlrj.com\ndyjs.com\ndyjw.info\ndyjxjt.com\ndyjxsj.com\ndyjymy.com\ndykszx.com\ndykz66.com\ndylc.com\ndyls.app\ndyly.com\ndylyghm.com\ndymatic.com\ndymexhealthcare.com\ndyml.net\ndymusictape.com\ndymusicvideo.com\ndynabook-dbh.com\ndynavolt.net\ndynguyeniq.com\ndyonr.com\ndypf8.com\ndyqc.com\ndyqh.info\ndyqm888.com\ndyrbw.com\ndyrcb.net\ndyrmt.com\ndyrs.cc\ndyrtg.com\ndysday.com\ndysgydlc.com\ndyshf.com\ndyshortvideo.com\ndysj.com\ndysji.com\ndyspcdntip.com\ndythmy.com\ndytmgm.com\ndytss.com\ndytt2028.cc\ndytt789.com\ndytt7899.com\ndytt8.net\ndytt89.com\ndyvideotape.com\ndywcc.com\ndywuyuan.com\ndywxs.com\ndywzx.com\ndyxldjy.com\ndyxsdwm.com\ndyxtw.com\ndyxuexin.com\ndyxw.com\ndyxz.la\ndyxzyy.com\ndyys.com\ndyysdhv.xyz\ndyysoft.net\ndyyy120.com\ndyzdx.com\ndyzpw.com\ndyzs163.com\ndyzsart.com\ndyzxw.org\ndz-ailive.com\ndz-ic.net\ndz-x.net\ndz-z.com\ndz.tt\ndz000.com\ndz0566.com\ndz11.com\ndz137.com\ndz169.com\ndz19.net\ndz1982.com\ndz211.com\ndz31hao.com\ndz88.com\ndz98.com\ndzabosn.com\ndzbarcode.com\ndzbchina.com\ndzbdq.com\ndzblo.com\ndzboligang.com\ndzbxk.com\ndzcch.com\ndzcj.tv\ndzcjw.com\ndzcmedu.com\ndzcnc.com\ndzcolor.com\ndzcrcgas.com\ndzdesign.cc\ndzdiy.com\ndzdu.com\ndzdvip.com\ndzdxs.net\ndzdzzd.com\ndzemotor.com\ndzfang.com\ndzfc.com\ndzfjsm.com\ndzfwjd.com\ndzglsb.net\ndzgxq.com\ndzh.link\ndzhlive.com\ndzhope.com\ndzhqexpo.com\ndziuu.com\ndzjc.com\ndzjkw.net\ndzjob.net\ndzkbw.com\ndzkx.org\ndzlaa.com\ndzlems.net\ndzljy.com\ndzllzg.com\ndzlndygh.com\ndzmachines.com\ndzmhospital.com\ndzng.com\ndzoptics.com\ndzp.tv\ndzpc.net\ndzpezp.com\ndzpk.com\ndzpklite.com\ndzpknews.com\ndzqrmyy.com\ndzqu.com\ndzqxj.com\ndzr120.com\ndzrbs.com\ndzrcd.com\ndzronghui.com\ndzrsteel.com\ndzs2004.com\ndzsaas.com\ndzsaascdn.com\ndzsc.com\ndzsdg.com\ndzsg.com\ndzsjgroup.com\ndzsjtjt.com\ndzsm.com\ndzspzx.com\ndzsrcw.com\ndzst999.com\ndzszlsyxgs.com\ndztester.com\ndztugongbu.net\ndztv.tv\ndztz168.com\ndzvv.com\ndzw3.com\ndzwad.com\ndzwebs.net\ndzwindows.com\ndzwork.net\ndzwww.com\ndzwww.net\ndzwy.com\ndzxsw.net\ndzxw.net\ndzxxzy.com\ndzxzh.com\ndzy.link\ndzybk.com\ndzyqc.com\ndzyule.com\ndzyysb.com\ndzyzj.com\ndzz.cc\ndzzcgs.com\ndzzgsw.com\ndzzoffice.com\ndzzui.com\ndzzy88.com\ndzzyisp.com\ne-10031.com\ne-adcon.com\ne-ande.com\ne-bidding.org\ne-buychina.com\ne-byte.com\ne-cbest.com\ne-celap.com\ne-chinalife.com\ne-cig-market.com\ne-ciie.com\ne-cloudstore.com\ne-cookies.net\ne-cspc.com\ne-cuc.com\ne-czt.com\ne-elitech.com\ne-eway.com\ne-fangtong.com\ne-flyinc.com\ne-fong.com\ne-ging.com\ne-ging.net\ne-giordano.com\ne-gooo.com\ne-guofu.com\ne-hongw.com\ne-hqins.com\ne-huaxue.com\ne-icco.com\ne-jianxiu.com\ne-jitp-dom.com\ne-jitp-dom.net\ne-jitp-glo.com\ne-jitp-glo.net\ne-jjj.com\ne-jlt.com\ne-kawai.com\ne-kays.com\ne-length.com\ne-lining.com\ne-mallchina.com\ne-mmt.com\ne-nci.com\ne-nebula.com\ne-net.hk\ne-onekey.com\ne-peilian.com\ne-picclife.com\ne-pointchina.com\ne-power.vip\ne-pxn.com\ne-qdpm.com\ne-readbook.com\ne-ruikd.com\ne-seenet.com\ne-sleb.com\ne-sscard.com\ne-tecsun.com\ne-tiller.com\ne-ufnb.com\ne-uniongroup.com\ne-vaulting.com\ne-xina.com\ne-xp05.vip\ne0453.com\ne0514.com\ne0575.com\ne0734.com\ne0838.com\ne1.vdowowza.vip.hk1.tvb.com\ne12345.com\ne1288.com\ne1299.com\ne12e.com\ne13000d6f1019.beer\ne151475d71020.beer\ne1617.com\ne1988.com\ne1evh0lp4n.com\ne213155.com\ne21cn.com\ne22a.com\ne23dns.net\ne24c.com\ne253.com\ne27e02c891010.beer\ne2capp.com\ne2edesign.com\ne2esoft.com\ne2say.com\ne307586127f21050.com\ne32047a8e21fbc0a.com\ne32a01b94145bb23.com\ne3492587711012.beer\ne360e.com\ne363172a110241.beer\ne365mall.com\ne36b9a1c210301.beer\ne3861.com\ne38647b2411b17c3.com\ne3j.co\ne3ol.com\ne4008.com\ne43bb71e710272.beer\ne44e4e8c11020.beer\ne452a362210291.beer\ne495f363ae7187cf.com\ne4d0c1f1d1021.beer\ne4e4c4415fd53198.com\ne4l4.com\ne4xk2cvh.work\ne508250086b14d75.com\ne53w.com\ne5413.com\ne5865f69dee0.xyz\ne58860e249bf56ad.com\ne58b70798965b223.com\ne58f8d5eb11032.beer\ne5a743f9511d287d.com\ne5d929dd82a164f1.com\ne5d9384f510292.beer\ne5e333e55e5e3d.xyz\ne5hc.com\ne5n.com\ne5sj.com\ne5tech.com\ne600.com\ne656gps.com\ne65u.com\ne66609.com\ne68cname.com\ne6ad1d0761021.beer\ne6gps.com\ne763.com\ne77b0ff1f10241.beer\ne7890.com\ne7ba7566e10291.beer\ne7cc97fab56d13b6.com\ne7cn.net\ne7e6.net\ne7e7e7.com\ne7f60ece99e82d92.com\ne7flash.com\ne7lang.com\ne7wan.com\ne7wei.com\ne7z.net\ne8034d5ac1022.beer\ne80bf18e978d9e37.com\ne80fb4ced1015.beer\ne81fd4b49ca5e6a4.com\ne836g.com\ne84p8174c7.com\ne88u.com\ne890.com\ne8bfeae1bf34023d.com\ne8cfdb0ee10272.beer\ne9527ad346cb0157.com\ne9797.com\ne9898.com\ne99999.com\ne9x51y8t91.com\nea-china.com\nea-retina.com\nea-xing.com\nea2cn-dev-outlet.dell.com\nea2cn-prod-outlet.dell.com\nea2cn-staging-outlet.dell.com\nea360.com\nea3w.com\nea65d2a2f16d6b8c.com\nea6d86dbe8e3e423.com\nea7c8805e10241.beer\nea89f50fde822303.com\neabax.com\neachnet.com\neachsee.com\neachtravel.com\neachwave.com\neadianqi.com\neaeacn.com\neaecis.com\neaf341cc30c286cf.com\neafifaonline2.com\neagle-sight.com\neaglebgm.com\neaglebrandgroup.com\neagleceramics.com\neaglecoin.com\neaglejt.com\neaglemale.com\neaglenos.com\neagleyun.com\neagllwin.com\neagonxc.com\neagsen.com\neaibot.com\neaka365.com\neal-ceair.com\neallcn.com\neallerp.com\neamn.net\neanfang.com\neanmed.com\neap2.net\neapchina.net\near0.com\neardatek.com\nearlytrip.fun\nearningapp.info\nearth-science.net\nearth-traveller.com\nearth2037.com\nearthdq.com\nearthedu.com\nearthstar-cloud.com\nearture.org\neasck.com\neascs.com\neasea.net\neasebar.net\neasecation.net\neaseconvert.com\neasefun.info\neaseheal.com\neasemob.com\neaserun.com\neasesale.com\neasesdk.com\neaseslb.com\neasetuner.com\neaseus.com\neaseyedelivery.com\neashu.com\neasi-tech.com\neasilysend.com\neasipass.com\neasipay.net\neasitcn.com\neasiu.com\neasonad.com\neast-regis.com\neast.net\neast263.com\neastall.com\neastar-group.com\neastbest.com\neastbuy.com\neastchinafair.com\neastcmc.com\neastcom-group.com\neastcom-sw.com\neastcom.com\neastcom.site\neastcompeace.com\neastcoms.com\neastday.com\neastdesign.net\neastdrama.com\neastdushi.com\neasteat.com\neastecloud.com\neastecp.com\neastelsoft.com\neastent.com\neastern-tek.com\neasternalong.com\neasternpose.com\neastforever.com\neastfu.com\neasthc.com\neasthome.com\neastib.com\neasticloud.com\neastjl.com\neastjq.com\neastled.com\neastlen.com\neastlending.com\neastmab.com\neastmannplastics.com\neastmarathon.com\neastmoney.com\neastmoneyfutures.com\neastmoneyloans.com\neastmoneysec.com\neastobacco.com\neastpharm.com\neastpump.com\neastshanghaifair.com\neastsilver.com\neastsoo.com\neastspacelight.com\neaststarbio.com\neasttone.com\neastunion.net\neastups.com\neastwin-zc.com\neastwinn.com\neastwudpharma.com\neastyule.com\neasu.net\neasugar.com\neasy-all.net\neasy-china.com\neasy-dotnet.com\neasy-eai.com\neasy-ent.com\neasy-h5.com\neasy-linkholiday.com\neasy-mock.com\neasy-signing.com\neasy163.net\neasy2world.com\neasy361.com\neasy888.com\neasyar.com\neasyarvr.com\neasybug.org\neasyclean.fun\neasydarwin.org\neasyder.com\neasydo.work\neasydoc.net\neasyeda.com\neasyfang.com\neasyfapiao.com\neasyfunfun.com\neasygame2021.com\neasygametime.com\neasygovm.com\neasyhaitao.com\neasyhin.com\neasyidc.com\neasylabplus.com\neasyliao.net\neasylinkin.com\neasylinkin.net\neasymule.com\neasynet.vip\neasypakk.com\neasypayx.com\neasyrecovery.cc\neasyrecovery.net\neasyrecoverycn.com\neasyscholar.cc\neasysensor.net\neasysofthome.com\neasyswoole.com\neasytifen.com\neasytimetv.com\neasytite.com\neasytocn.com\neasytogophuket.com\neasytouch-manager.com\neasytouch.com\neasytrip.com\neasyv.cloud\neasywza.com\neasyya.com\neasyzw.com\neaton-samc.com\neatonbusbar.com\neatuo.com\neavic.com\neawh.com\neaydu.com\neayh.com\neaymusic.com\neayou.com\neayuan.com\neayyou.com\neazypharm.com\neazytec-cloud.com\neb-ind.com\neb0de9d6bc52f2d0.com\neb10c842d10291.beer\neb623580160e8cbc.com\neb80.com\neb94ccc9625d8539.com\nebadfbe1278533ae.com\nebadu.net\nebaidutv.com\nebaifo.com\nebaina.com\nebaixing.com\nebama.net\nebancom.com\nebangchina.com\nebank96518.com\nebanma.com\nebanshu.net\nebaodai.com\nebaoquan.org\nebaotech.com\nebasset.com\nebb6ea72919edea2.com\nebbcb476210291.beer\nebbf2f9101016.beer\nebchina.com\nebchinaintl.com\nebchinatech.com\nebcvm.org\nebdan.net\nebdoor.com\nebfb8c1c2f714608.com\nebfcn.com\nebfkc.com\nebfortune.com\nebgic.com\nebibi.com\nebico.com\nebidbid.com\nebidding.com\nebigear.com\nebiobuy.com\nebiomall.com\nebiotrade.com\nebioweb.com\nebjfinance.com\nebjservice.com\neblockschina.com\nebls-group.com\nebnew.com\nebocert.com\nebookmen.com\nebopark.com\neboxmaker.com\nebpftravel.com\nebptp.com\nebrun.com\nebscn-am.com\nebscn.com\nebscohost.com\nebseek.com\nebsfw.com\nebt.group\nebtang.com\nebtrust.com\nebuckler.com\nebullienceconsultancy.com\nebumbrella.com\nebuy16.com\nebuy1718.com\nebways.com\nebyet.com\nebyte.com\nec-ae.com\nec-cloudtech.com\nec-dns.com\nec-founder.com\nec-sz.com\nec-world.com\nec.com\nec07yxgd11.com\nec233.com\nec3s.com\nec45f2d84111f960.com\nec4ca59341009.beer\nec4e54545d0e31fa.com\nec51.com\nec6056a95386f752.com\nec8j.com\necac1cd921021.beer\necadi.com\necaidian.com\necaihr.com\necamzone.cc\necanmed.com\necapp.org\necaptechnology.com\necaray.com\necare365.com\necarechina.com\necarxgroup.com\necb43b6f5064acc6.com\necbcamp.com\necboo.com\necbos.com\necbuy.net\neccang.com\neccc-china.com\neccdnx.com\neccn.com\neccnmall.com\necco-market.com\neccpos.com\necdag.net\necdnx.com\necduo.com\nece-global.com\neceibs.com\neceibs.net\neceibs20.com\necej.com\necer.com\necerdns.com\necerimg.com\necf-gov.com\necgci.com\necgoods.com\necgtool.com\nechanceyun.com\nechangye.com\nechao8.com\nechargenet.com\necharpile.com\nechatsoft.com\nechead.com\nechemsrc.com\nechepiao.com\nechiele.com\nechinacareers.com\nechinacities.com\nechinagov.com\nechinalife.org\nechinatobacco.com\necho-isoftstone.com\necho188.com\nechoing.tech\nechoteen.com\nechovelle.com\nechu-cable.com\nechuaren.com\nechunlan.com\nechuzhou.com\neci-everconn.com\neciawards.org\necice06.com\necigdaily.com\necinnovations.com\necitic.com\necitic.net\neciticcfc.com\necjobhome.com\necjson.com\neckgxbfa.com\neckwai.com\necloud-gdu.com\necloud.hk\necmc-nj.com\necmould.com\necnpl.net\necnu.net\necnuas.com\necnudec.com\neco-seavol.com\neco-system.xyz\necoalchina.com\necocn.org\necodreamers.com\necoland-plan.com\necoliving168.com\necolovo.com\necom-lightapp.com\necomanbiotech.com\necombdapi.com\necombdimg.com\necombdpage.com\necombdstatic.com\necombdvod.com\necomoter.com\necontactsplus.com\necool.site\necoplastech.com\necoprint.tech\necorr.org\necotourgroup.com\necouser.net\necovacs.com\necovacsgroup.com\necowrd.com\necp-cloud.com\necp-cloud.net\necphk.com\necplf.com\necppn.com\necpsrplus.com\necqd.com\necqun.com\necr-global.com\necrrc.com\necs6.com\necsage.net\necscoupon.com\necscpu.com\necshop.com\necshop123.com\necsits.com\necspartner.com\necsponline.com\necsxs.com\nectdno.com\nectencent.com\nectnno.com\nectnno.org\nectrip.com\necukwai.com\necustmde.com\necv360.com\necvv.com\necwan77.net\necydm.com\necyti.com\necyzm.com\neczuafam.com\ned-textile.com\ned21.cc\ned2k.vip\ned2kers.com\ned2kk.com\ned403ab821011.beer\ned77fc33a10241.beer\ned834dbe3264d3a0.com\neda-china.com\neda1024.com\neda2.com\neda365.com\neda365.net\neda4bf686e3ac7d4.com\neda7fb17710272.beer\nedaboss.com\nedadoc.com\nedagit.com\nedai.com\nedaibo.com\nedaili.com\nedaixi.com\nedaizhijia.com\nedajob.com\nedaka.org\nedaocha.com\nedata100.com\nedatahome.com\nedatop.com\nedawiki.com\nedaxiang.com\nedazhang.com\nedb-tech.com\nedcba.com\nedcdfg.com\nedcfda.com\neddic.net\neddingpharm.com\neddycjy.com\nede35.com\nededian.com\nedefang.net\nedengjiang.com\nedesson.com\nedge-byted.com\nedge-cluster-hk-pre.com\nedge.music-choice-play-chaina1.top.comcast.net\nedgefn.net\nedgegslb.com\nedgekey88.net\nedgemec.com\nedgeone-ai-dev.com\nedgeone-ai.com\nedgeone-browser-rendering-dev.com\nedgeone-browser-rendering.com\nedgeone.ai\nedgeone.app\nedgeone.cool\nedgeone.run\nedgeone.site\nedgeonedl1.com\nedgeonedl1.net\nedgeonedy1.com\nedgeonedy1.net\nedgeonestic1.com\nedgeonestic1.net\nedgeonetcp1.com\nedgeonetcp1.net\nedgeonev1.com\nedgeonev1.net\nedgeonev2.com\nedgeonev2.net\nedgeonev3.com\nedgeonev3.net\nedgeonev4.com\nedgeonev4.net\nedgeonev5.com\nedgeonev5.net\nedgeonevod1.com\nedgeonevod1.net\nedgep.net\nedgesrv.com\nedgetls.xyz\nedhic.com\nedi198.com\nedianda.com\nedianshang.com\nediantec.com\nedianyun.com\nedianzu.com\nediaoyu.com\nediconf.org\nedifier.com\nedimob.com\nedingzhuan.com\nedisec.net\neditorjianying.com\neditsprings.com\nedlcaster.com\nedmcn.net\nedmseller.com\nedns.com\nedojia.com\nedong.com\nedongeejiao.com\nedongli.net\nedongyun.com\nedoou.com\nedowning.net\nedozx.com\nedqgk.com\nedragongame.com\nedrawsoft.com\nedream-tech.com\nedsionte.com\nedspay.com\nedt2017.com\nedt2018.com\nedtsoft.com\nedty.com\nedu-cj.com\nedu-edu.com\nedu-nw.com\nedu03.com\nedu0851.com\nedu1488.com\nedu24o1.com\nedu24ol.com\nedu4399.com\nedu510.com\nedu5a.com\nedu63.com\nedu777.com\nedu84.com\nedu84.net\nedu88.com\neduaaf.com\neduaiplat.com\neduapaashwc.com\neduardoam.com\neduartisan.com\neducg.net\neduchn.net\neducoder.net\nedudc.net\nedudigital123.com\neduease.com\neduego.com\neduei.com\neduglobal.com\neduglobalchina.com\neduhuoshi.com\nedui.fun\neduic-sh.com\neduiso.com\nedujia.com\nedujianshe.com\nedujiaoyu.com\nedukuang.com\nedulawonline.com\nedulivevideo.com\nedumail.pub\nedumine.net\nedumq.com\neduour.com\nedupm.com\nedurck.com\nedushi.com\nedusoho.com\nedusoho.net\nedusy.net\nedutao.com\nedutime.net\nedutrackconsult.com\nedutxw.com\neduu.com\neduuu.com\neduwenzheng.com\neduwest.com\neduwo.com\neduwx.com\nedux.design\neduxcxportal.com\neduxiji.net\neduydt.com\neduyf.com\neduyo.com\neduzb.com\neduzhai.net\neduzhixin.com\neduzs.net\nedwiv.com\nedxmy.cc\nee-nav.com\nee067e33bd637916.com\nee123.net\nee1234.com\nee409d6370bfc826.com\nee45560.com\nee68.com\nee6da7410adfd3aa.com\nee702ec398aaecfd.com\nee99.net\neeban.com\neebbk.com\neebbk.net\neeboard.com\neechina.com\neecnt.com\neecourse.com\neecso.com\needevice.com\needns.com\needzvv.com\neee-eee.com\neee4.com\neeeam.com\neeedri.com\neeedu.net\neeeen.com\neeeetop.com\neeeff.com\neeekkk.com\neeeknow.com\neeeqi.net\neees.cc\neeetb.com\neeezahomemena.com\neefans.com\neefcdn.com\neeff.net\neefocus.com\neefung.com\neegem.com\neehk.net\neehu.com\neei168.com\neeio99.com\neeioe.com\neeju.com\neelly.com\neema.info\neenzo.com\neeook.com\neeparking.com\neepw.com\neeqiu.com\neeskill.com\neeso.net\neestar.com\neetoday.com\neetop.com\neetrend.com\neetrust.com\neeuetqbv.shop\neevision.com\neeworld.com\neeworm.com\neexiaoshuo.com\neeyd.com\neeyxs.com\neeyys.com\neezml.com\nef-cdn.com\nef17145aecd7dd06.com\nef360.com\nef360.net\nef369594911012.beer\nefang.tv\nefangwang.com\nefapiao.com\nefasco.com\nefashionchina.com\nefashioncloud.com\nefb6ff0d81022.beer\nefbf407b011021.beer\nefchina.org\nefe.cc\nefengqing.com\nefesco.com\neff-soft.com\neff85fd9610292.beer\neffapp.com\nefficient.hk\neffood.net\nefglobal-gy.com\nefivestar.com\nefl-tech.com\neflagcomm.com\neflybird.com\neflycloud.com\neflydns.net\nefmac.net\nefnchina.com\neforclub.com\nefotile.com\nefount.com\nefoxconn.com\nefpp.com\neftime.com\nefucms.com\nefueloil.com\nefuin.com\nefunchina.com\nefuncn.com\nefunent.com\nefunq.com\nefusc.com\nefwh.com\nefy-tech.com\nefzhou.com\nefzzs.com\negainnews.com\negbt.net\negcmedia.com\negeel.com\negfb2221.com\neggbnk.com\neggrj.com\neghimalayanak.com\negjqgs.com\nego-robotics.com\negoint.com\negongzheng.com\negood995.com\negoonet.com\negotops.com\negou68.com\negouz.com\negovsum.com\negpctiz.com\negpharm.com\negqch.link\negqkxzd.com\negrdrill.net\negreatworld.com\negret-labs.org\negret.com\negridconsulting.com\negrowads.com\negsea.com\negshuyuan.com\negsssy.com\negt365.com\negu365.com\neguangjie.com\neguantao.com\neguqwhvg.com\negwealth.hk\negxlx.com\nehafo.com\nehaier.com\nehaini.com\nehaiwang.com\nehang.com\nehanglian.com\nehangtian.com\nehaohai.com\nehaoyao.com\nehaoyao.us\nehclglobal.com\nehealthcareforum.com\nehecd.com\nehedco.com\nehejun.com\nehengjian.com\neheren.com\nehetech.com\neheyin.com\nehijoy.com\nehinvest.hk\nehnasia.com\nehnchina.com\nehome-env.com\nehome5.com\nehome8.com\nehomeclouds.com\nehomeday.com\nehousechina.com\nehowbuy.com\nehowbuy.net\nehrel.com\nehschina.com\nehsy.com\nehtcn.com\nehualu.com\nehuarun.com\nehuatai.com\nehuataifund.com\nehub.net\nehui.net\nehuijing.com\nehujia.com\nehuoke.com\nehuoyan.com\nehuoyun.com\nehutu.com\nehuyao.com\nehuzhu.com\nei6nd.com\neia-data.com\neia543.com\neiacloud.com\neiafans.com\neiccmall.com\neickaopei.com\neicodesign.com\neicourse.com\neicp.net\neicp.vip\neicuhq.xyz\neiczz.com\neid-sft.com\neidcenter.com\neidlink.com\neidtokencloud.com\neifini.com\neightbridge.com\neightedu.com\neigpay.com\neihtfire.com\neiicn.com\neiisys.com\neiixx.com\neijiucq.com\neilieili.cc\neimoney.com\neinfo-tech.com\neingdong.com\neinkcn.com\neinsteintiles.com\neintone.com\neiot.com\neisoo.com\nejamad.com\nejc56.com\nejcms.com\nejcop.com\nejdrone.com\nejdyin.com\nejectu.com\nejecx.com\nejee.com\nejeegroup.com\nejhimalayanje.com\nejia7.net\nejiacn.com\nejianlong.com\nejianmedia.com\nejiawang.cc\nejiayou.com\nejiayu.com\nejie.me\nejiecheng.com\nejinshan.net\nejion.net\nejmrh.com\nejomoo.com\nejoo.cc\nejoy.com\nejoy365.com\nejoy365hk.com\nejrfood.com\nejsoon.win\nejtieyi.com\nejtsyc.com\neju.com\nejudata.com\nejuhome.com\nejustcn.com\nejy365.com\nek-edu.com\nek1ng.com\nekaidian.com\nekan001.com\nekang99.com\nekangji.com\nekaobang.com\nekaoyan.com\nekaoyan365.com\nekclubinternational.com\nekdoc.com\nekecdn.com\nekewy.com\nekimmigration.com\neking-tech.com\nekingair.com\nekingtopwood.com\nekmic873o6vkza.com\nekoooo.com\neks0451.com\neksoi7mwa4fa27.com\nekuaibao.com\nekumao.com\nekumb.com\nekuzy.com\nekweixin.com\nekwing.com\nekxx.net\nelabinfo.com\nelabpic.com\nelaina.vin\nelaiter.com\nelameyal.com\nelane.com\nelangchina.com\nelanking.com\nelanp.com\nelanso.com\nelanw.com\nelascloud.com\nelawoffice.net\nelbmodel.com\neldamu.com\neldawa.com\nele.me\nele.to\nele001.com\nele1.com\nele12.com\nelec100.com\nelecfans.com\nelecfans.net\nelecinfo.com\nelecloud8.com\nelecrystal.com\nelecshop.com\nelecspn.com\neleduck.com\nelefang.com\nelefirst.com\nelegant-prosper.com\nelegsant.com\nelelx.com\neleme.hk\neleme.io\nelemecdn.com\nelement3ds.com\nelementaw.com\nelementfresh.com\nelenet.me\nelephant-base.com\nelephantrobotics.com\neleui.net\nelevator-expo.com\nelex-tech.net\nelexcon.com\nelextec.com\nelfartworld.com\nelfinbook.com\nelfjs.com\nelht.com\nelian5.com\nelianhong.com\nelianmeng.vip\neliansy.com\nelianwiz.com\neliaoxuke.com\nelicht.com\nelikeme.com\nelikeme.net\nelimautism.org\neling.me\nelingka.com\nelingyun.com\nelinzy.com\nelita.work\nelite-shooters.com\nelitecrm.com\nelitenexusgroup.com\nelitesland.com\nelitetie.com\nelitimes.com\neliwang.com\nelkpi.com\nellassay.com\nellechina.com\nellemen.com\nelleschool.com\nelliotxing.com\nelmerlxy.com\nelmerzhang.com\neloancn.com\nelong-edm.com\nelong.com\nelong.net\nelongai.com\nelonghotel.com\nelongshine.com\nelongstatic.com\nelongtrip.com\nelontest.com\neloonggame.com\neloongsun.com\nelpcon.com\nelpland.com\nelpont.net\nelpsky.com\nels001.com\nelsker.com\nelsz5.xyz\neltmall.com\neltt.org\neltws.com\neluxiu.com\neluying.com\nelvgufen.com\nelvshi.com\nelvxing.net\nelxk.com\nelysia.beauty\nem86.net\nemai.com\nemail.fund\nemaileds.com\nemailflame.com\nemailuo.com\nemailxqq.com\nemak.hk\nemakerzone.com\nemall001.com\nemao.com\nemao.net\nemaozi.com\nemapgis.com\nemarketingw.com\nemas-poc.com\nematong.com\nemaup.com\nemavil.com\nemax.cc\nembcom.net\nembed-cloudstudio.net\nembed.cc\nembedfire.com\nembedhq.org\nembedmcu.com\nembedsky.com\nembedtrain.org\nembedu.org\nembedunion.com\nembedway.com\nembest-tech.com\nembryform.com\nembryochina.com\nembsky.com\nemby.men\nemby.yun\nembyvip.org\nemcbj.com\nemcdir.com\nemcsosin.com\nemdoor.com\nemea.cdnetworks.com\nemed.cc\nemeiju.com\nemeixian.com\nemeixs.com\nemengju.com\nemeok.com\nemepu.com\nemerald.com\nemeratech.com\nemergencyexit.xyz\nemfuture.com\nemilechouriet.com\nemiltorres.com\nemin123.com\neminsheng.com\nemiretasnbd.com\nemjianshen.com\nemjob.com\nemlinix.com\nemlog.net\nemmmn.com\nemodor.com\nemoi-cncdn.bing.com\nemoji6.com\nemojimobile.com\nemoriko.com\nemotibot.com\nemotofine.com\nemots.cc\nemoyu.com\nempornium.me\nemqx.cloud\nemqx.com\nemqx.net\nemr-volces.com\nems-audio.com\nems517.com\nemsec.hk\nemsepc.com\nemshost.com\nemshua.com\nemsym.com\nemtana.com\nemtcm.com\nemtronix.com\nemtx.com\nemu999.net\nemuban.com\nemuch.net\nemuchong.com\nemugif.com\nemui.com\nemui.tech\nemuia.com\nemulatedlab.com\nemumax.com\nemupic.com\nemushroom.net\nemwan.com\nemzexzfp.com\nen-micro.com\nen.tm\nen51.com\nen5static.com\nen8848.com\nen998.com\nenacdn.biz\nenacdn.info\nenacdn.net\nenaiter.com\nename.com\nename.net\nenantiotech.com\nenbamaoyi.com\nenbrands.com\nencthinking.com\nenderbbs.fun\nenderuixm.com\nendianpp.com\nendovastec.com\nendowa-auto.com\nendress.store\nendurance-shinmaywa.com\nenec.net\nenelcn.com\nenergy-greenland.com\nenergy-root.com\nenergy-zj.com\nenergychina.press\nenergyhz.com\nenerpat.net\nenet16.com\nenet16.net\nenet360.com\nenet369.com\nenetedu.com\nenfi.vip\nenflame-tech.com\nenfodesk.com\nenforever.com\neng24.com\nengeniustec.com\nengeyuan.com\nengineeringvillage.com\nengley.com\nenglibrary.com\nenglish163.com\nenglishdict.cc\nenglishmasterclub.com\nenglishtimes.cc\nengloncar.com\nengpx.com\nengr-z.com\nenguo.com\nengz.net\nengzai.com\nenianteam.com\nenicn.com\neniu.com\nenjerr.com\nenjlink.com\nenjoy.link\nenjoy1992.com\nenjoy3c.com\nenjoycare.com\nenjoydiy.com\nenjoyfe.com\nenjoyglobal.net\nenjoying3d.com\nenjoykorea.net\nenjoymeet.com\nenjoynowapp.com\nenjoyor.net\nenjoyyue.com\nenjoyz.com\nenketu.com\nenkichen.com\nenkj.com\nenkris.com\nenlaide.com\nenlightent.com\nenlistsecurely.com\nenmonster.com\nenmotech.com\nenmuo.com\nenn-ng.com\nennenergy.com\nennew.com\nennewpower.com\nennews.com\nennmt.com\nennobay.com\nennocad.com\nennovabio.com\nennpet.com\nennpower.com\nennresearch.com\nenovatemotors.com\nenoya.com\nenpapers.com\nenpht.com\nenpower-sd.com\nenpowermicro.com\nenproscm.com\nenqoo.com\nenread.com\nenricgroup-sh.com\nenrlb.com\nenroo.com\nenroobbs.com\nenruida.com\nenruigroup.com\nenrz.com\nens4.com\nenshide.com\nenshijob.com\nensignworld.com\nenstylement.com\nent001.com\nent120.com\nentengll.com\nenterdesk.com\nenterdesk.net\nentive.com\nentstudy.com\nentts.com\nenunix.com\nenuomachinery.net\nenvi-ch.com\nenvisionagents.com\nenvisioncn.com\nenwing-tech.com\nenxicled.com\nenyamusical.com\nenyugame.net\nenzj.com\neo-edgefunctions.com\neo-edgefunctions1.com\neo-edgefunctions2.com\neo-edgefunctions3.com\neo-edgefunctions4.com\neo-edgefunctions5.com\neo-edgefunctions6.com\neo-edgefunctions7.com\neo-edgefunctions8.com\neo-edgefunctions9.com\neo-preview.com\neo-shieldspace.com\neo-vod.com\neo-vod1.com\neo-vod2.com\neo-vod3.com\neo-vod4.com\neo-vod5.com\neo-vpcgw.com\neoacc2.com\neoacme-dev.com\neoacme0.com\neoacme1.com\neoacme2.com\neoacme3.com\neoaluminium.com\neobuwieplonline.com\neoeandroid.com\neoemarket.com\neoemarket.net\neoffcn.com\neofreqctrl.com\neofreqctrlbk.com\neogamewechat.com\neoivisa.com\neojofdrzei4.com\neolce.com\neolink.com\neolinker.com\neomgames.net\neomoo.com\neomoy.com\neonad.org\neonlytech.com\neonun.com\neoof.net\neoofoo.com\neooioo.com\neoopoo.com\neooqoo.com\neoouoo.com\neoovoo.com\neoriver.com\neorygadw.com\neorzea.moe\neosantpool.com\neoss-hj.com\neovod.com\nep-china.net\nep-zl.com\nep12.com\nep365.com\nepaas.net\nepaiclub.com\nepailive.com\nepalfish.com\nepandian.com\nepanshi.com\nepark.cc\nepassway.com\nepay.com\nepaynfc.com\nepbiao.com\nepchina.com\nepcnn.com\nepcservicio.com\nepcsw.com\nepd3.com\nepday.com\nepeaksport.com\nepeimall.com\nepeo.net\nepermarket.com\nepesr.com\nepet.com\nepetbar.com\nepetpet.com\nepexpo-asia.com\nepfrontier.com\nepg-power.com\nephen.me\nephua.com\nepian1.com\nepiaogo.com\nepibiotek.com\nepicgamesspot.com\nepichust.com\nepinautomation.com\nepinduo.com\nepinga.com\nepinhoo.com\nepinv.com\nepinzu.com\nepjike.com\nepjob88.com\nepkey.com\neplove.com\nepluspvy.com\nepnnel.com\nepoos.com\neportyun.com\neprcw.com\neprezi.com\neps-tigermed.com\nepsea.com\nepshw.com\nepstsoft.com\neptchina.com\neptsz.com\nepub360.com\nepubit.com\nepweike.com\nepwitkey.com\nepwk.com\nepzcw.com\nepzwxs.com\neq321.com\neqding.com\neqh5.com\neqicha.com\neqidi.com\neqie.com\neqifa.com\neqigou.com\neqingdan.com\neqixiu.com\neqiyingxiao.com\neqlky.com\neqmis.com\neqmobi.com\neqnvip.com\neqoavtbu.com\neqq.net\nequalocean.com\nequdong.net\nequipmentimes.com\neqxiu.com\neqxiul.com\neqxiuzhan.com\neqyn.com\ner07.com\ner8gmvwi54p5x1.com\neraclean.com\neraedu.com\neral.com\neran123.com\neranet-dns.com\neranet.com\neranqi.com\nerapp.run\nerbadu.com\nerbingimg.com\nercc.cc\nercfh.com\nercoabv.com\nerda.cloud\nerdaicms.com\nerdangame.xyz\nerdangjiade.com\nerddv.com\nerdiamond.com\nerdianzhang.com\nerdong.site\nerdosedu.com\nerdosrcb.com\nerdossysw.com\nerelcn.com\nerentalcarpro.com\nereter.com\nereuiib.com\nerfang-ic.com\nerg3r.com\nergcb.com\nergecdn.com\nergedd.com\nergediandian.com\nergeduoduo.com\nergengtech.com\nergengtv.com\nergouzi.fun\nergvx.com\nerhlyc.club\nerhss.org\nerhua.cc\neric-bot.com\nericdeng.net\nerichfund.com\neriqua.com\nerji.com\nerji.hk\nerji.net\nerjianglin.com\nerjiren.com\nerk8.com\nerke.com\nerkuai.com\nerldoc.com\nerlo.vip\nerlou.com\nermain.com\nermao.com\nermao.live\nermeiti.com\nermiao.com\nernaonet.com\nernest.me\nernxzc.com\neroacg.com\neromesalo.com\nerongdu.com\nerp321.com\nerp321.net\nerpang.cc\nerpingge.com\nerpwd.com\nerro.life\nersantian.com\nershicimi.com\nersjk.com\nersoso.com\nersuo.com\nert.icu\nert7.com\nerthb.online\nertmineq.com\nertongkongjian.com\nertongtuku.com\nertoutiao.com\nerun.cloud\nerun360.com\nervtqeq1206.vip\nerw.cc\nerxin360.com\nerxitong.com\nerya100.com\neryajf.net\neryanet.com\neryi.org\neryyutu.com\nerzzz.com\nes-soccer.com\nes100.com\nes2q.com\nes86.com\nes9e.com\nesa2000.com\nesafenet.com\nesandcloud.com\nesavip.com\nesbedu.com\nesbook.cc\nesc.show\nescdn.com\nescjy.com\nesclt.net\nescortevenly.com\nesdaxiagu.com\nesde.cc\nesdhm.net\nesemseo.com\nesenagro.com\nesensoft.com\nesfimg.com\nesgforum.com\nesgz.com\neshangle.com\nesheep.com\neshenlin.com\neshimin.com\neshine-logistics.com\neshiyun.info\neshop-switch.com\neshopb2c.com\neshoppromohub.com\neshow365.com\neshufa.com\neshuizong.com\neshukan.com\neshzp.com\nesilk.net\nesinidc.com\nesipark.com\nesjlf.com\nesjson.com\nesk365.com\neskedu.com\neskimall.com\neskysky.com\neslosity.com\neslygroup.com\nesm8u7oe9ci5.com\nesmartwave.com\nesnai.com\nesnai.net\nesni.tech\nesnpc.com\nesoboy.com\nesoho.org\neson.org\nesoo.org\nesoogle.com\nesou.biz\nesoua.com\nesound.vip\nesouou.com\nespeedpost.com\nesplus.club\nespnlol.com\nesports-console.com\nesportsreg.com\nesr.com\nessaystar.com\nessca.com\nessclick.com\nessemi.com\nessencefund.com\nesseniot.com\nessent-tech.com\nession.com\nessjj.com\nesstglobal.com\nessurl.com\nesswye.com\nessxp.com\nessyy.com\nestandonhotel.com\nesteellink.com\nestelchina.com\nestonegroup.com\nestory365.com\nestrongs.com\nesttools.com\nestudychinese.com\nestun.com\nesudai.com\nesugimoto.com\nesun21.com\nesun88.com\nesune.com\nesunny.com\nesunresin.com\nesurging.com\neswin.com\neswincomputing.com\neswlnk.com\neswxj.com\neswzx.com\nesxlt.com\neszmall.com\nesztsg.org\nesztyg.com\neszwdx.com\neszyb.com\net-api.com\net-cdn.com\net-fine.com\net001.com\net0731.com\net59.com\netagri.com\netang.com\netao.com\netaog.com\netaswisswatch.com\netbet.com\netccenter.com\netccenters.com\netcchebao.com\netcgsx.com\netchcb.com\netcifk.vip\netcifw.vip\netciwe.vip\netcsd.com\netcsx.com\netcupor.cc\netczs.net\netczx.com\netelux.com\neternalsys.com\neterngroup.com\netescape.com\netest8.com\neteste.com\netf.group\netf88.com\netfcjz.com\netfiber.net\netg56.com\nethainan.com\nethan.pub\nethercap.com\nethereum.work\netian365.com\netiantian.com\netiantian.net\netimeusa.com\netitgo.com\netiv.me\netjournals.com\netjy.com\netlong.com\netmoc.com\netmtoy.com\netmwanju.com\netocrm.com\netokzt.site\netolies.com\netomlink.com\neton-tech.com\netonetech.com\netonfood.com\netong.com\netongchem.com\netongguan.com\netonjx.com\netonkidd.com\netonkids.com\netool.cc\netoote.com\netoote.net\netoplive.com\netoprun.com\netoptour.com\netoubao.com\netoujie.com\netovl.org\netowncapital.com\netownestate.com\netpass.com\netpcar.com\netplat.com\netpowers.com\netrack01.com\netrack02.com\netrack03.com\netrack04.com\netrack05.com\netrack07.com\netrack08.com\netradegx.com\netransfar.com\netranshare.com\netrasemi.com\netrd.org\netrol.com\netrump.net\nets100.com\netsc-tech.com\netsingshan.com\netsoon.com\netsstar.com\nett-cn.com\nett.cc\nettabiotech.com\nettbl.org\nettdns.com\nettdns.net\nettdnsv.com\nettdnsv.net\nettinn.com\nettshop.com\netu6.com\netuan.com\netuan123.com\netudu.com\netuogroup.com\netuoyi.com\netuschool.org\netwgzkce.com\netxcs.com\netycx.com\netyy.com\netyyy.com\netz927.com\netzj.net\netzqw.com\netzzy.com\neu4cn.com\neub-inc.com\neuci-software.com\neucure.com\neudic.net\neuejia.com\neuetsp.website\neueui.com\neufc.org\neuforums.com\neuhhob.com\neui.cc\neuibe.com\neuino.com\neuklass.com\neulike.com\neulixos.com\neumt.com\neur-go.com\neurasia.edu\neurasiacasinolasvegas.com\neuratao.com\neureka.name\neurkon.com\neuroasia-p.com\neurochinesedaily.com\neurofinscn.com\neuropapa.com\neurope.com.hk\neuropewatch.com\neuropewatch.com.hk\neursell.com\neusercenter.com\neushophq.com\neusoftbank.com\neuwan.com\neuzw.net\nev123.com\nev123.net\nev3ds.com\nev88.com\nev98.com\neva-group.com\neva001.com\nevacellbio.com\nevan.xin\nevancg.com\nevanway.net\nevask360.com\nevcar.com\nevcard.com\nevcard.vip\nevcrrc.com\nevdays.com\nevdo.vip\neve.moe\nevebattery.com\nevefashion.com\nevening.me\neventown.com\nevents.pub\neveqbow.xyz\never9527.com\neverbox.net\neverbright.com\neverbright21.com\neverbrightlaw.com\neverbrightphotonics.com\nevercarecn.com\neverdns.com\neverdrawing.com\nevereasycom.com\neveredit.net\neveret.org\nevergrande.com\nevergrandeauto.com\nevergrandeservice.com\nevergrandespring.com\nevergreen-plastics.com\nevergreen2012.org\neverichgroup.com\neverisker.com\neverknight.net\neverlight-space.com\nevernakedcake.com\neverpay.org\neverrobot.com\neversino.com\neverspry.com\neverstar.xyz\neverstray.com\neversun-chn.com\neverybodysuo.com\neverychina.com\neverydo.com\neveryinch.net\neveryonejun.com\neveryouthtech.com\nevestemptation.com\nevewan.com\nevfchina.com\nevget.com\nevgezphv.com\nevhui.com\nevideostb.com\nevileyesaint.com\nevilleaker.com\nevinchina.com\nevisa99.com\nevisionics.com\nevisugo.com\nevketang.com\nevkworld.net\nevlightpro.com\nevlook.com\nevmam-tbrat.com\nevobserver.com\nevoc.com\nevocqd.com\nevotrue.com\nevpartner.com\nevpowergroup.com\nevtcn.com\nevtrust.com\nevzhidao.com\nevznl.org\nevzs.com\new-wirestripping.com\new80.com\new80.net\new80yun.com\new9z.com\newaga.com\newang.com\newaninfo.com\newarecomputer.com\newaterchina.com\newatt.com\newceo.com\newdcloud.com\newebeditor.net\newebsoft.com\newecha.com\newei.com\neweiqi.com\neweirong.com\neweis.com\newemt.com\newen.co\newenyan.com\newhnzmqncm7.com\newidecloud.com\newidewater.com\newidewater.net\newie.net\newin007.com\newinshine.com\newinshocks.com\newoka.com\newomail.com\neworksglobal.com\neworldship.com\newpeinfo.com\newqcxz.com\newsaas.com\newsdxc.com\newstudy.com\newt360.com\newteacher.com\newtp.com\newtp.org\newu.cc\newuzhen.com\newzqsyuc.link\nex-energybattery.com\nex-silver.com\nex-starch.com\nex360.com\nexact-ic.com\nexam100.net\nexam58.com\nexam76.com\nexam8.com\nexamcoo.com\nexamda.com\nexamebook.com\nexamk.com\nexampx.com\nexamw.com\nexands.com\nexaphotons.com\nexasic.com\nexbaotuan.com\nexbapp.com\nexbot.net\nexc-resin.com\nexc118.com\nexcake.com\nexcalibur.link\nexcarepharm.com\nexcbio.com\nexcean.com\nexceedconn.com\nexcegroup.com\nexcegroupur.com\nexcel8.com\nexcel880.com\nexcelbbx.net\nexcelcn.com\nexcelhome.net\nexcellbio.com\nexcellencegroupfoundation.com\nexcelpharma.com\nexcelpx.com\nexcm.net\nexd.design\nexdoll.com\nexedus.com.co\nexeedcars.com\nexemplifyt.com\nexexm.com\nexezhanqun.com\nexfree.com\nexgpykzm.com\nexhera.com\nexhobby.com\nexia.xyz\nexiaoba.com\nexiliumgf.com\nexinee.com\nexingbao.com\nexiqu.com\nexllog.com\nexmailgz.com\nexmailqq.com\nexmay.com\nexmetis.com\nexmoo.com\nexmrw.com\nexnpk.com\nexntech.com\nexo-mk.com\nexound.com\nexp99.com\nexpba.com\nexpdns.net\nexpec-tech.com\nexpensiveg.com\nexpin.site\nexpingworld.com\nexpiredns.net\nexpirenotification.com\nexpirepausedns.com\nexpku.com\nexplinks.com\nexplorehainan.com\nexplorexd.com\nexpo-china.com\nexpo-nb.com\nexpocemat.com\nexpodmc.com\nexpoeye.net\nexpohsp.com\nexpolifestyle.com\nexponingbo.com\nexpoon.com\nexpoooo.com\nexpoquan.com\nexpotu.com\nexpowindow.com\nexpozh.com\nexpressboo.com\nexpresscompanynetwork.com\nexpreview.com\nexprun.com\nexpsky.com\nexquisite-automotive.com\nexscapesmoke.com\nexsvc.net\next2fsd.com\nextech-sh.com\nexteriorm.com\nexternalcoop.com\nextfans.com\nextqq.com\nextron-tech.com\nextscreen.com\nextstars.com\nexuanfang.cc\nexuanpin.com\nexuanshi.com\nexuekt.com\nexueshi.com\nexuezhe.com\nexyws.org\ney100.com\ney3g.com\ney99.com\neyacn.com\neyangfan.com\neyangguang.com\neyangzhen.com\neyao168.com\neyaobei.com\neyaodev.xyz\neyar.com\neyasglobal.com\neyasgloble.com\neybond.com\neybook.com\neycfhb.com\neycms.net\neydata.net\neydns.com\neye023.com\neye024.com\neye025.com\neye027.com\neye0510.com\neye0515.com\neye0561.com\neye0712.com\neye0731.com\neye0746.com\neye0770.com\neye0771.com\neye0773.com\neye0774.com\neye0775.com\neye0776.com\neye0777.com\neye0779.com\neyeabc.com\neyee.com\neyeofcloud.com\neyeofcloud.net\neyepetizer.net\neyeplay.org\neyesar.com\neyeshenzhen.com\neyeso.net\neyhsj.com\neyili.com\neyingchuang.com\neyingyubao.com\neyiwu.com\neyoodns.com\neyoogo.com\neyou.com\neyou.net\neyoubaidu.com\neyoucms.com\neyouct.com\neyoumb.com\neyoungindustry.com\neyourbusiness.com\neyouwx.com\neyprint.com\neyspwkg.com\neyuangong.com\neyuconnect.com\neyugame.com\neyunidc.com\neyunzhu.com\neyuyan.com\neyuyan.la\neyuyao.com\neyuzhu.com\neywedu.com\neywedu.net\neywedu.org\neyy168.com\neyy8.vip\neyyyye.com\neyz.ink\neyzeafp.com\nez-leaf.com\nez01.com\nezagoo.com\nezaiai.com\nezca.org\nezchip.tech\nezcname.com\nezcpt.com\nezcun.com\nezdnscenter.com\nezeeship.com\nezeroshop.com\nezfuns.com\nezhangdan.com\nezhangu.com\nezhayan.com\nezhicai.com\nezhijiantuoluo.com\nezhijiao.com\nezhiwan.com\nezhou.com\nezhousetech.com\nezhu.com\nezhun.com\nezhupei.com\nezindie.com\neziot.com\nezjhw.com\nezlippi.com\nezliushao.com\nezloo.com\neznowdns.com\neznowdns.net\nezone-h5.com\nezonsport.com\nezpro.pro\nezreal.cool\nezrent.hk\nezrpro.com\nezshou.com\nezsuperfans.com\neztcn.com\neztest.org\neztvnet.com\nezucoo.com\nezviz.com\nezwan.com\nezwanjia.com\nezwise.com\nezyotkp.com\nezzls.com\nezzxw.com\nf-0.cc\nf-biology.com\nf-dou.com\nf-insight.com\nf-stack.org\nf.biz\nf.cx\nf008.com\nf015dfc4510292.beer\nf049443d111032.beer\nf0580.com\nf0758.com\nf08ecb0455f06f18.com\nf09qgja1.com\nf0f21399311031.beer\nf1-shanghai.com\nf11w.com\nf130.com\nf139.com\nf14ed7c801022.beer\nf1943w.com\nf1d28bdd11019.beer\nf1zd.com\nf24hls-i.akamaihd.net\nf26.cc\nf2c8017f110281.beer\nf2cca7592f8a0441.com\nf2time.com\nf315.cc\nf32365.com\nf3322.net\nf3322.org\nf33eb245b1022.beer\nf385e7fcd1013.beer\nf397350c0958109e.com\nf3bed1ef51013.beer\nf3ff28a3e1015.beer\nf40ca6aa911042.beer\nf419a55f61023.beer\nf41g.com\nf42cccb808.forum\nf442165e29dbca6e.com\nf44b9bd1fe4e913f.com\nf49f8e0421015.beer\nf4a107d7a11012.beer\nf4b2ed8f711011.beer\nf4e2a302f1016.beer\nf52o04oylrbmfw.com\nf537.com\nf542d8de71022.beer\nf5432.com\nf54321.com\nf54c463ad528b39a.com\nf567c912a077aacc.com\nf5cs.com\nf5ec7553b5ec6ea3.com\nf5fa5ff8ef7379ba.com\nf5gh.com\nf5sd.com\nf5yx.com\nf61a.com\nf61b.com\nf66a747451016.beer\nf69a662cb11031.beer\nf6b06c2d5821c34e.com\nf6c62f7ab11031.beer\nf6d4a4f461010.beer\nf6yc.com\nf704204fa11021.beer\nf71f38e6a1015.beer\nf746c2da252336a6.com\nf7777.net\nf79ca805111881f6.com\nf79f9e5b71019.beer\nf7aa9093710281.beer\nf7chinavip.com\nf7e84829210281.beer\nf7yuncdn.com\nf800909401015.beer\nf8167007e7bf667d.com\nf831fb9ce11031.beer\nf8e772f41348c086.com\nf8fm.com\nf92ec0629f52f064.com\nf94fa469f5680337.com\nf9ee74bf602c79cf.com\nf9f4a38021013.beer\nfa-part.com\nfa-today.com\nfa-tojoin.com\nfa2da1f5b1024.beer\nfa80a608ec3e1ead.com\nfaadcf6d01009.beer\nfaakee.com\nfaanw.com\nfaayoo.com\nfabang.com\nfabao365.com\nfabaofoundation.com\nfabaogou.com\nfabiao.com\nfabiaoqing.com\nfabigbig.com\nfablusa.com\nfabpo.com\nfabu.io\nfabu114.com\nfaburuanwen.com\nfabuzhushou.com\nfacaishu.com\nfacang.com\nfacash.com\nface-plus-plus.com\nface100.net\nface2ai.com\nfaceboer.com\nfacebookol.com\nfacebooksx.com\nfacecloud.net\nfacedic.com\nfaceface2.com\nfacehufu.com\nfaceid.com\nfacejoking.com\nfacephoto.com\nfaceplusplus.com\nfacernt.com\nfaceu.com\nfaceu.mobi\nfaceu.net\nfaceui.com\nfaceunity.com\nfachcloud.com\nfacri.com\nfactchina.com\nfactj.com\nfactube.com\nfad9e7ce5a0de13c.com\nfada12888888.work\nfadada.com\nfadesky.com\nfadfunds.com\nfadior.cc\nfadoudou.com\nfadoushi.com\nfadsc.com\nfadsfasd.asia\nfadui.com\nfaer.work\nfafa9.com\nfafaku.com\nfafawang.com\nfafeng.com\nfafuli.com\nfagaoshi.com\nfageka.com\nfagua.net\nfaguowenhua.com\nfahai.com\nfahuolianmeng.com\nfaidev.cc\nfaidns.com\nfaieduusr.com\nfaihdusr.com\nfaimallusr.com\nfaioo.com\nfaipod.com\nfair-guard.com\nfair1688.com\nfairguard.net\nfairguard.tech\nfairhr.com\nfairkwa.com\nfairplaycloud.com\nfairso.com\nfairygui.com\nfairysen.com\nfairysoft.net\nfairysoftware.com\nfairytest.com\nfaiscm.com\nfaisco.com\nfaisys.com\nfaiusr.com\nfaiusrd.com\nfaiww.com\nfajiayun.com\nfajihao.com\nfakamiao.com\nfakamiao.shop\nfakeloc.cc\nfakeluxurywatches.com\nfalconnet.app\nfalconsending.com\nfalcontalent.com\nfaloo.com\nfamascro.com\nfameile.net\nfameirui.com\nfamen163.com\nfamenbaike.com\nfamens.com\nfamens.vip\nfamensi.com\nfamily-marathon.com\nfamilyincloud.com\nfamilykoloro.com\nfamilylifemag.com\nfamilyzuji.com\nfaminuo.com\nfamiyou.com\nfamobiotech.com\nfamousoffice.com\nfamoustone.com\nfamulei.com\nfan-lun.com\nfan-md.com\nfan-tastic.fun\nfan-xun.com\nfan88.com\nfanai.com\nfanbook.mobi\nfancl-vip.com\nfancyecommerce.com\nfancygo.xyz\nfandcode.com\nfandengds.com\nfandian.com\nfandiankeji.com\nfandongxi.com\nfane8.com\nfanerkongjian.com\nfanfannet.com\nfanfou.com\nfang-te.com\nfang-zhou.com\nfang.com\nfang.xin\nfang24k.com\nfang33.com\nfang668.com\nfang91.com\nfang99.cc\nfang99.com\nfangbei.org\nfangcang.com\nfangcece.com\nfangchan.com\nfangche.net\nfangchengbao.com\nfangchengbaoapp.com\nfangchengganglvxingshe.com\nfangchip.com\nfangcloud.com\nfangcunshan.xyz\nfangda-specialsteels.com\nfangda.com\nfangdacarbon.com\nfangdaijisuanqi.com\nfangdaquan.com\nfangdd.com\nfangdichanceo.com\nfangdonggroup.com\nfangdr.com\nfangdudu.com\nfangfa.net\nfanggeek.com\nfangguan6.com\nfanghenet.com\nfangheng.com\nfanghua120.com\nfanghuafu.com\nfanghuihui.com\nfangjia.com\nfangjiadp.com\nfangjinsuo.com\nfangkeduo.net\nfangkewang.com\nfangko.com\nfangkuai.com\nfangkuai.link\nfangkuaiwang.com\nfangkuaiyi.com\nfanglb.com\nfangle.com\nfangliju.com\nfanglimei.com\nfanglinad.com\nfanglitong.com\nfangma.com\nfangming.com\nfango8.com\nfangpaiwang.com\nfangqk.com\nfangrun.com\nfangshanzi.com\nfangsheji.com\nfangshengaxle.com\nfangsi.net\nfangstar.com\nfangtan007.com\nfangtangtv.com\nfangte.com\nfangtian.net\nfangtong.com\nfangtx.com\nfangwei315.com\nfangweima.com\nfangwuzaixian.com\nfangxfang.com\nfangxian.org\nfangxiaobao.net\nfangxiaoer.com\nfangxin.com\nfangxinbao.com\nfangxinbiao.com\nfangxinmai.com\nfangxinzhuomian.com\nfangxu.work\nfangyanzazhi.com\nfangyb.com\nfangyi.com\nfangyiai.com\nfangyou.com\nfangyouquan.com\nfangyouw.com\nfangyuan-group.com\nfangyuan365.com\nfangyuanhp.com\nfangyuannew1zycdn.cc\nfangyunlin.com\nfangzd.com\nfangzew.com\nfangzhengip.com\nfangzhengshufa.com\nfangzhenxiu.com\nfangzhipeng.com\nfangzhouad.com\nfangzhoukonggu.com\nfangzhoulawyer.com\nfangzhouqihang.com\nfangzhoushidai.com\nfangzhouyanglao.com\nfangzongguan.com\nfanhai-hk.com\nfanhaib.com\nfanhaic.com\nfanhangame.ltd\nfanhaoyue.com\nfanhar.com\nfanhonghua.net\nfanhougame.com\nfanhuaholdings.com\nfanhuan.com\nfanhuan.org\nfanhuishou.com\nfanin.cc\nfaniuwenda.com\nfanjianhome.com\nfanjinyan.com\nfanjunyang.zone\nfankebang.com\nfankhome.com\nfankuweb.com\nfanli.com\nfanli001.net\nfanlibei.com\nfanlihe.com\nfanlihi.com\nfanlihotels.com\nfanlitou.com\nfanlv.fun\nfanmeilantian.com\nfanmimi.com\nfanmingming.com\nfanmugua.net\nfannaojiputi.com\nfanooo.com\nfanpaijidian.com\nfanpanjidain.com\nfanpusoft.com\nfanqiang.com\nfanqianxs.com\nfanqianzhushou.com\nfanqie.im\nfanqiecopyright.com\nfanqiejiang.net\nfanqienovel.com\nfanqieopen.com\nfanqieopenpic.com\nfanqieopenstatic.com\nfanqieopenvod.com\nfanqier.com\nfanqiesdk.com\nfanqiesdkpic.com\nfanqiesdkstatic.com\nfanqiesdkvod.com\nfanqietianqi.com\nfanqievv.com\nfanqiewin10.com\nfanqiexitong.com\nfanquanwang.com\nfanruan.com\nfanruanclub.com\nfanryes.com\nfans35.com\nfans8.com\nfanshicekong.com\nfanshigang.com\nfanshui.net\nfansiji.com\nfansimg.com\nfansjoy.net\nfansobattery.com\nfansoon.com\nfansx.com\nfansyes.com\nfantablade.com\nfantaiai.com\nfantaicdn.net\nfantaitech.com\nfantanggame.com\nfantasticbin.com\nfantatech.com\nfantawild.com\nfante.com\nfantibody.com\nfantnet.com\nfantong.com\nfantsida.com\nfanttec.com\nfantuan.hk\nfanuc666.com\nfanuchdf.com\nfanw8.com\nfanwantianyu.com\nfanwe.com\nfanwen118.com\nfanwenbaike.com\nfanwenq.com\nfanwenzhan.com\nfanwubi.org\nfanxian.com\nfanxiang.com\nfanxianw.com\nfanxiaojian.com\nfanxing.com\nfanxingliveshow.com\nfanxingshidaitech.com\nfanxuefei.com\nfany-eda.com\nfany-online.com\nfanyantao.com\nfanyeda.com\nfanyedu.com\nfanyi.com\nfanyi1234.com\nfanyiba.net\nfanyibase.com\nfanyigou.com\nfanyigou.net\nfanyijia.com\nfanyiqi.net\nfanyishang.com\nfanyitec.com\nfanyouvip.com\nfanyu.com\nfanyu.work\nfanyuip.com\nfanzehua.com\nfanzhidu.com\nfanzhiyang.com\nfapharm.com\nfapiao.com\nfapiao365.com\nfapiaobang.com\nfapselc.com\nfaq-whtasapp.com\nfaq-whtasapp.net\nfaqianjia.com\nfaqiren.com\nfar-china.com\nfar123.com\nfar800.com\nfaraconix.com\nfaradayfuturecn.com\nfaradynamics.com\nfareastcontainers.com\nfarenhui.com\nfarennews.com\nfarerdak.com\nfarfir.com\nfarisl.com\nfarmasino.com\nfarmkd.com\nfarmsec.com\nfarsee2.com\nfarsightdev.com\nfarsiightppc.com\nfas-bee.com\nfasensor.com\nfash1043.cloudycdn.services\nfashaoyou.net\nfashengba.com\nfashilawfirm.com\nfashionan.com\nfashionszshow.com\nfashiontrenddigest.com\nfashuounion.com\nfasionchan.com\nfast-eyes.com\nfast-heat-cartridge-heaters.com\nfast.im\nfast666ioceywit93h8a.com\nfastadmin.net\nfastbuild.run\nfastcdn.com\nfastchina.net\nfastdo.cc\nfastener-cn.net\nfastener.cc\nfastgz.com\nfastidea.cc\nfastidea.me\nfastindexs.com\nfastliii.com\nfastmirror.net\nfastmirror.org\nfastmis.com\nfastmock.site\nfastmovie88.com\nfastmyna.com\nfaston56.com\nfastonetech.com\nfastoper.com\nfastposter.net\nfastreportcn.com\nfastsdwan.com\nfastsilver.press\nfastsoc.com\nfastsoso.cc\nfaststatics.com\nfastx-ai.com\nfat-tail.com\nfat999.com\nfatangmedia.com\nfatbobman.com\nfateadm.com\nfatedier.com\nfateqi.com\nfatfreader.com\nfatherai.com\nfatiao.pro\nfatier.com\nfatoan.com\nfatvg.com\nfaussefrance.com\nfaussemontrerolex.com\nfavang.com\nfavdeb.com\nfavopen.com\nfavoreducation.com\nfavorites.ren\nfaw-benteng.com\nfaw-vw.com\nfaw.com\nfawan.com\nfaway.com\nfawmc.com\nfawsoft.com\nfawulu.com\nfawuzaixian.com\nfaxdns.com\nfaxdns.net\nfaxianjingpin.com\nfaxianla.com\nfaxianlaw.com\nfaxianpindao.com\nfaxingbao.com\nfaxingchina.com\nfaxingcn.com\nfaxingsj.com\nfaxingzhan.com\nfaxiufang.com\nfaxuan.net\nfaxy-tech.com\nfayfans.com\nfayifa.com\nfayimen.com\nfayiyi.com\nfayufaguo.com\nfazhijx.com\nfazz.fun\nfb32dc52302e6b9b.com\nfb46cd5483f029aa.com\nfb4bc82f71019.beer\nfb56.com\nfbaichuan.com\nfbank.com\nfbatop.com\nfbf6c93bf10272.beer\nfbflex.com\nfbjsgf.com\nfbkjapp.com\nfbku.com\nfblife.com\nfblsj.com\nfbnxb.com\nfbook.net\nfbpaas.com\nfbsjedu.com\nfbuy365.com\nfbxslw.com\nfbyvalve.com\nfc-smartglobal.xyz\nfc0531.com\nfc0633.com\nfc224220480630b3.com\nfc3e2b88fc5254c9.com\nfc571.com\nfc62.com\nfc811.com\nfc858.com\nfc92322b910311.beer\nfcachinagsdp.com\nfcai.com\nfcapp.run\nfcb16888.com\nfcbox.com\nfcboxmall.com\nfcbs999.com\nfcbsgroup.com\nfcbu.com\nfcc8aa32d10251.beer\nfcchbj.com\nfccs.com\nfccscar.com\nfcczp.com\nfcd2448c6211c5a6.com\nfcdecb0b610261.beer\nfcg01.com\nfcg0770.com\nfcgasj.com\nfcgby.com\nfcgfcjy.com\nfcgfzjy.com\nfcggsj.com\nfcghbxx.com\nfcglib.com\nfcgsaps.com\nfcgsnews.com\nfcgstzjt.com\nfcguoan.com\nfcgxt.com\nfcgzjchy.com\nfcgzph.com\nfcgzrkq.com\nfcgzrzyqxyj.com\nfchospital.com\nfcjjdbsc.com\nfcjjt.com\nfcjob.net\nfcjob88.com\nfcjtaobao.com\nfcjuxian.com\nfckpw.com\nfclassroom.com\nfcldaf.com\nfcljt.com\nfclouddns.net\nfcloudpaas.com\nfcnes.com\nfcnode.net\nfcpawn.com\nfcpiao.com\nfcpowerup.com\nfcqjc.com\nfcrc114.com\nfcs.dell.com\nfcs1.com\nfcsc.com\nfcsccz.com\nfcsdzly.xyz\nfcseiko.com\nfcstor.com\nfcsubcn.cc\nfcsubcn.pro\nfctaiwan.com\nfcto.rest\nfcvvip.com\nfcw0633.com\nfcw6.com\nfcwei.com\nfcwr8.com\nfcwyglyxgs.com\nfcxxh.org\nfcxzb.com\nfcz.ink\nfcz360.com\nfczhongwang.com\nfczlpt.com\nfczlsc.com\nfczst.com\nfczx.com\nfd-capital.com\nfd-trust.com\nfd-yy.com\nfd-zj.com\nfd08a9f9a1016.beer\nfdbatt.com\nfdc0746.com\nfdcjj.org\nfdcyun.com\nfdczbstatic.com\nfdd0cd79c10281.beer\nfdeent.org\nfdeer.com\nfdevops.com\nfdf46bd061024.beer\nfdfhtl.com\nfdfinvoice.com\nfdgearbox.com\nfdh6up750n.com\nfdjskf.com\nfdjzu.com\nfdkfloor.com\nfdkm88.com\nfdlbeckwai.com\nfdleckwai.com\nfdlt.net\nfdmhmm.com\nfdooo.com\nfdqc.com\nfdren.com\nfdrobot.com\nfdtsgs.com\nfdttgroup.com\nfdx-fund.com\nfdxww.com\nfdxxjs.com\nfdzcxy.com\nfdzq.com\nfdzyy.com\nfdzzjs.com\nfe-cable.com\nfe15a959f1020.beer\nfe232d4b510271.beer\nfe2x.cc\nfe520.com\nfe7f9abcbf8e1dd2.com\nfeadi.com\nfeanton.com\nfeapp.net\nfeatchina.com\nfebbab1472011af4.com\nfecc.cc\nfecify.com\nfecmall.com\nfecn.net\nfecshop.com\nfedlearner.net\nfedte.cc\nfeeair.com\nfeeclouds.com\nfeedcoop.net\nfeedcoopapi.com\nfeedsp.com\nfeeeco.com\nfeehi.com\nfeejii.com\nfeekr.com\nfeel-bar.com\nfeelcars.com\nfeelchat.net\nfeelec.net\nfeelnowtrip.com\nfeelsoar.com\nfeemoo.com\nfeemoo.vip\nfeepan.com\nfeeprint.com\nfeesing.com\nfeeyan.com\nfeeye.com\nfeeyo.com\nfeeyun.com\nfefd203.xin\nfegine.com\nfeheadline.com\nfehelper.com\nfehorizon.com\nfei580.com\nfeiair.com\nfeiauto.com\nfeibajiasu.com\nfeibaokeji.com\nfeiben-starter.com\nfeibians.com\nfeibing.tech\nfeibisi.com\nfeibisi.org\nfeibit.com\nfeibo.com\nfeichangrice.com\nfeichicloud.com\nfeichong.net\nfeicool.com\nfeicui168.com\nfeicui99.com\nfeicuishuo.com\nfeicuiwuyu.com\nfeida-china.net\nfeidacrusher.com\nfeidaep.com\nfeidagroup.com\nfeidaoboke.com\nfeidavalve.com\nfeidazuanji.com\nfeidee.com\nfeidee.net\nfeidi.com\nfeidiao.com\nfeidou.com\nfeie.work\nfeierlaiedu.com\nfeiersmart.com\nfeifandesign.com\nfeifanindustry.com\nfeifantxt.com\nfeifantxt.net\nfeifdx.com\nfeifei.com\nfeifeiboke.com\nfeifeishijie.com\nfeifeixitong.com\nfeifeiziyuan.com\nfeifustudio.com\nfeigang.net\nfeige.ee\nfeigeblog.com\nfeigo.fun\nfeihe.com\nfeihe168.com\nfeiheair.com\nfeihengip.com\nfeihongtec.com\nfeihu.me\nfeihua.com\nfeihuadns.com\nfeihuo.com\nfeihutaoke.com\nfeijie.org\nfeijing88.com\nfeijipan.com\nfeijiu.net\nfeijiuzs.com\nfeijix.com\nfeijs.com\nfeikework.com\nfeikongbao.com\nfeiku.com\nfeikua.net\nfeiliao.com\nfeilihua.com\nfeiliks.com\nfeiliu.com\nfeilixi888.com\nfeilu.cc\nfeilvway.com\nfeimalv.com\nfeimao666.com\nfeimaoweb.com\nfeimaoyun.com\nfeimawaiqin.com\nfeimayun.com\nfeimogames.com\nfeimooo.com\nfeimosheji.com\nfeimoustex.net\nfeinews.com\nfeiniao.name\nfeiniaomy.com\nfeiniaowangluo.com\nfeiniu.com\nfeinno.com\nfeiphp.com\nfeipin.com\nfeipin.net\nfeipinzhan.com\nfeipr.com\nfeiq18.com\nfeirar.com\nfeiruikeji.com\nfeisaidi.com\nfeisan.net\nfeishu-3rd-party-services.com\nfeishu-boe.net\nfeishu-pre.net\nfeishu.net\nfeishuapp-cdn.net\nfeishuapp.com\nfeishucdn.com\nfeishudoc.com\nfeishuhuiyi.com\nfeishuimg-boe.com\nfeishuimg-pre.com\nfeishuimg.com\nfeishukacdn.com\nfeishumeetings.com\nfeishuoffice.com\nfeishuopenplatformrecord.com\nfeishupkg.com\nfeishuvc.com\nfeishuwx.net\nfeishuzw.net\nfeisiplus.com\nfeistech.com\nfeisu.com\nfeisuwx.org\nfeisuxs.com\nfeisuzhibo.com\nfeitaomall.com\nfeitengsoft.com\nfeitent.com\nfeitianwu7.com\nfeitsui.com\nfeituo126.com\nfeiwan.net\nfeiwentianxia.com\nfeixian.cc\nfeixiansoft.com\nfeixiaoqiu.com\nfeixiong.tv\nfeixue666.com\nfeixuege.com\nfeixueteam.net\nfeiyang.com\nfeiyang.hk\nfeiyang233.club\nfeiyang971.com\nfeiyangholiday.com\nfeiyangjm.com\nfeiyangstar.com\nfeiyiblog.com\nfeiyin2016.com\nfeiying-china.com\nfeiyit.com\nfeiyouyun.com\nfeiyu.com\nfeiyuapi.com\nfeiyue.online\nfeiyueconglin.com\nfeiyuhu.com\nfeiyun.cc\nfeiyunjs.com\nfeiyuteam.com\nfeizan.com\nfeizhaojun.com\nfeizhiyi.com\nfeizhu.com\nfeizhuke.com\nfeizhupan.com\nfeizhuqwq.com\nfeizutrip.com\nfeizw.net\nfelicitysolar.com\nfeling.net\nfelink.com\nfelix021.com\nfelizpg.com\nfelmvip.com\nfelo-ev.com\nfemrice.com\nfen360.com\nfenbaner.net\nfenbei.com\nfenbeijinfu.com\nfenbeitong.com\nfenbi.com\nfenbike.com\nfenbilantian.com\nfenbu.net\nfenby.com\nfencescn.com\nfenchuan8.com\nfenda.com\nfendytech.com\nfenfen.com\nfenfenriji.com\nfenfentang.com\nfenfenwz.com\nfenfenyu.com\nfenfenzh.cc\nfeng-du.com\nfeng.com\nfeng.pub\nfeng1.com\nfengakj.com\nfengaomedical.com\nfengba888.com\nfengbangleasing.com\nfengbao.com\nfengbaowo.com\nfengbohan.com\nfengbolive.com\nfengcaijiaju.com\nfengchaoyuan.com\nfengche.us\nfengchengroup.com\nfengchizixun.com\nfengchuanba.com\nfengchui.cc\nfengchusheng.com\nfengcms.com\nfengcx.com\nfengdu.com\nfengdu365.com\nfengdufrp.com\nfengduqi.com\nfengduxiaoshuo.com\nfengedu.com\nfengeek.com\nfengei.com\nfengeini.com\nfengex.com\nfengfeng.cc\nfenggangzulin.com\nfenggongliangrenju.com\nfenggouhui.com\nfenggui-baking.com\nfenghaibin.com\nfenghenever.com\nfenghong.tech\nfenghua001.com\nfenghuangcanyin.com\nfenghuangxs.com\nfenghui-motor.com\nfenghuidongman.com\nfenghuo.cc\nfenghuoyunji.com\nfengimg.com\nfengj.com\nfengji.net\nfengjiawang.net\nfengjierc.com\nfengjing.com\nfengjinggroup.com\nfengjinketang.com\nfengjr.com\nfengjx.com\nfengkeji.com\nfengkongbao.com\nfengkuangzaoren.com\nfengkui.net\nfenglao.org\nfengli.com\nfengli.su\nfengliankeji.com\nfenglichem.com\nfenglingroup.com\nfenglinjiu.com\nfenglinlab.com\nfenglu-alu.com\nfengmaniu.com\nfengmap.com\nfengmeng.net\nfengmios.com\nfengnayun.com\nfengniao.com\nfengniaohd.com\nfengniaojianzhan.com\nfengone.com\nfengpintech.com\nfengread.com\nfengse.com\nfengshangroup.com\nfengshangweekly.com\nfengshankeji.com\nfengshi8888.com\nfengshigroup.com\nfengsung.com\nfengsutb.com\nfengtai.tv\nfengtalk.com\nfengtao365.com\nfengtaochanglai.com\nfengtianz.com\nfengtingsmart.com\nfengtupic.com\nfengwanyx.com\nfengwatch.com\nfengwenyi.com\nfengwo.com\nfengwohao.com\nfengxb.com\nfengxian110.com\nfengxianrc.com\nfengxianwater.com\nfengxiaotx.com\nfengxing007.com\nfengxinglihua.com\nfengxuan.co\nfengyan.cc\nfengyang.fun\nfengyeholding.com\nfengyitong.name\nfengyuangufen.com\nfengyuncad.com\nfengyuncx.com\nfengyunlu.com\nfengyunmusic.net\nfengyunpdf.com\nfengyushan.com\nfengzegroup.com\nfengzhan.vip\nfengzhangame.net\nfengzhao.net\nfengzigame.com\nfengzusw.com\nfenha.net\nfenhong123.com\nfenhuo360.com\nfenixmall.com\nfenjiji.net\nfenjj.com\nfenke.com\nfenking.club\nfenlei168.com\nfenlei265.com\nfenleidao.com\nfenleihu.com\nfenlekeji.com\nfenliu.net\nfenmitech.com\nfennessy.hk\nfenqile.com\nfenqix.com\nfenqubiao.com\nfens.me\nfensaas.com\nfensebook.com\nfenshua123.com\nfensishenghuo.com\nfenssy.com\nfentorsolar.com\nfenxi.cc\nfenxi.com\nfenxi.org\nfenxiangdashi.com\nfenxianglife.com\nfenxiti.com\nfenxm.com\nfenxmi.com\nfenxuekeji.com\nfenyu.net\nfenyucn.com\nfenzhi.com\nfenzhi.net\nfenzijr.com\nfeotech.com\nfequan.com\nferlie.net\nferlytc.com\nfermatmind.com\nferqwo.sbs\nferro-alloys.com\nfescoadecco.com\nfescoadeccochongqing.com\nfescoadeccozhejiang.com\nfescogroup.com\nfescoguangdong.com\nfescojinan.com\nfeso.tech\nfestaint.com\nfetion-portal.com\nfetiononline.com\nfetionpic.com\nfettesgz.com\nfeucnp.com\nfeverales.com\nfeverassets.net\nfevermi.com\nfevia.work\nfevte.com\nfeydj.com\nfeyer-tc.com\nff14.cloud\nff54.ink\nff63.com\nff722fbac1011.beer\nffalcon.com\nffan.com\nffasp.com\nffb199e9266142c6.com\nffbc6bb121021.beer\nffbc82f8d1013.beer\nffbook.cc\nffbuddy.com\nffc540c0611031.beer\nffca028de10292.beer\nffcell.com\nffcloudcdn.com\nffdbj.com\nffe06ebc91024.beer\nffe0be9f91019.beer\nffeeii.com\nffepower.com\nfffont.com\nffhome.com\nffis.me\nffj.cc\nffls-edu.com\nffmomola.com\nffnmu.com\nffpedia.com\nffpw1688.com\nffquan.com\nffreeslott.com\nffsgame.com\nffsky.com\nfftcc.com\nfftub.com\nffxivhuntcn.com\nffy.com\nffzww.com\nfg.cc\nfg114.com\nfgba.net\nfgcndigital.com\nfgeekcloud.com\nfgfed.com\nfggyw.com\nfghi34.com\nfgidna.com\nfgkj.cc\nfglt.net\nfgnwct.com\nfgo.wiki\nfgowiki.com\nfgq.net\nfgtxnews.com\nfgvisa.net\nfh01.com\nfh1551.com\nfh21.com\nfh21static.com\nfh77.net\nfh86.com\nfh888.com\nfhaircut.com\nfhb971.com\nfhclm.com\nfhcomp.com\nfhd001.com\nfheb-four.com\nfheb-six.com\nfhfxys.com\nfhgame.com\nfhgjds.com\nfhguotai.com\nfhl05161ps.com\nfhldns.com\nfhldns.net\nfhlmotor.com\nfhlun.com\nfhmion.com\nfhmooc.com\nfhmv.com\nfhonest.com\nfhoverseas.com\nfhrlw.com\nfhsfilm.com\nfht360.com\nfhtao.com\nfhtj.com\nfhtlw.com\nfhtre.com\nfhvalley.com\nfhwlgs.com\nfhwzx.com\nfhycedu.com\nfhycs.com\nfhyl56.net\nfhyx.com\nfhyx.hk\nfhzggame.com\nfhzl.co\nfi-play.com\nfi0.cc\nfi11.com\nfi7.cc\nfi94.com\nfia-china.com\nfibercrops.com\nfiberglasschina.com\nfiberhome.com\nfiberhomegroup.com\nfibocom.com\nfibodata.com\nfibrlink.net\nficochina.net\nficowshen.com\nfiehff.com\nfieldcommunicator.net\nfifa666.com\nfifaschool.com\nfifedu.com\nfifsky.com\nfigure-it.com\nfiifh.com\nfiil.com\nfiinote.com\nfiio.com\nfiio.net\nfilcochina.com\nfile.hhtv.cc\nfile.mb.leshantv.net\nfilediag.com\nfilez.com\nfilfox.info\nfillersmart.com\nfillseo.com\nfilm-yuelongchina.com\nfilteringlist.com\nfily.fun\nfim34s.com\nfimky.com\nfimmu.com\nfin-shine.com\nfinaleden.com\nfinaltheory.me\nfinance365.com\nfinancetcloud.com\nfinanceun.com\nfinancialdatamining.com\nfinancialstreetforum.com\nfinchina.com\nfinclip.com\nfinddanandlaura.com\nfinderweb.net\nfindhro.com\nfindic.com\nfindic.kr\nfindic.tw\nfindic.us\nfindlawimg.com\nfindlinked.com\nfindmyfun.xyz\nfindmyrepair.com\nfindoout.com\nfindshu.net\nfindxk.com\nfindxz.com\nfindyou.xin\nfindzd.com\nfinebey.com\nfinebi.com\nfineex.com\nfineforming.com\nfineheads.com\nfineidc.com\nfineimmu.com\nfinelybook.com\nfiner2.com\nfinereport.com\nfinereporthelp.com\nfineset.com\nfinesilver.store\nfinetooling.com\nfineui.com\nfinewatchcare.com\nfineway.com\nfinewyx.com\nfineyoga.com\nfinezb.com\nfingard.com\nfinger-cnc.com\nfingerflyapp.com\nfingerjoys.com\nfingerstylechina.com\nfingertc.com\nfingu.com\nfingu.net\nfinjetchemical.com\nfinndy.com\nfinogeeks.com\nfinovo.com\nfinshell-cib.com\nfintechinchina.com\nfintechquan.com\nfinupfriends.com\nfinupgroup.com\nfinzfin.com\nfinzjr.com\nfiocco-group.com\nfir.im\nfir.vip\nfiradio.net\nfire233.com\nfire2333.com\nfire24h.com\nfirebase-settings.crashlytics.com\nfirebirdprint.com\nfirebit.com\nfiredata119.com\nfireemblem.net\nfireemulator.com\nfireflyacg.com\nfiregz.com\nfirerock.tech\nfiretry.com\nfirevale.com\nfirhq.com\nfirm-lithium.com\nfirst-panel.com\nfirst-swg.com\nfirstarpc.com\nfirstdrs.com\nfirstfood-cn.com\nfirstlinkapp.com\nfirstmetcs.net\nfirstonesource.com\nfirstp2p.com\nfirstproduction.net\nfirstpvm.com\nfirsunbioscience.com\nfirwinds.site\nfiscan007.com\nfisdhu.com\nfish2bird.com\nfish3000.com\nfishcn.com\nfisherac.com\nfisherv.com\nfishfay.com\nfishfd.com\nfishflying.net\nfishin2boat.com\nfishing-sh.com\nfishing-sinkers.com\nfishingjoy.com\nfishingmarkets.com\nfishings.biz\nfishlee.net\nfishmobi.com\nfishqc.org\nfishros.com\nfishs.com\nfishtui.com\nfishwantg.com\nfishyoung.com\nfit-start.co\nfit120.net\nfit2cloud.com\nfitgroup.com\nfitit100.com\nfitoneapp.com\nfittentech.com\nfittingcn.com\nfiu07021kl.com\nfiu07040kl.com\nfiui.org\nfivecakes.com\nfivedo.net\nfiveplus.com\nfivestarsolar.com\nfivision-tech.com\nfix666.com\nfixdown.com\nfixhdd.org\nfixmath.com\nfiyta.com\nfj-atfz.com\nfj-ba.com\nfj-cc.com\nfj-eprint.com\nfj-jima.com\nfj-kn.com\nfj10010.com\nfj133165.com\nfj173.net\nfj2000.com\nfj3c.net\nfj888.com\nfj96336.com\nfj987.com\nfjbcjt.com\nfjbdex.com\nfjber.com\nfjbgwl.com\nfjbiopharma.com\nfjbk.org\nfjbyjs.com\nfjc001.com\nfjce.com\nfjcee.com\nfjcgxc.com\nfjcid.com\nfjcoop.com\nfjcqjy.com\nfjcredit.com\nfjctw.net\nfjctyz.net\nfjcyl.com\nfjcyl.org\nfjdaily.com\nfjdaze.com\nfjdc.xyz\nfjdf.vip\nfjdfxy.com\nfjdh.com\nfjdkjt.com\nfjdygljt.com\nfjdzmy.com\nfjeca.com\nfjejjt.com\nfjepn.com\nfjetc.com\nfjeverone.com\nfjfgroup.com\nfjfhsteel.com\nfjfoxiang.com\nfjfs.net\nfjfxjt.com\nfjfzsx.com\nfjgczjxh.com\nfjgdwl.com\nfjgkedu.com\nfjgsgl.com\nfjgtfood.com\nfjguanyue.com\nfjgwy.org\nfjhaizu.com\nfjhcw.com\nfjhospital.com\nfjhps.com\nfjhrjt.com\nfjhsjg.com\nfjhssy.com\nfjhuayagroup.com\nfjhxbank.com\nfjhxcaee.com\nfjhxvc.com\nfjii.com\nfjjcjy.com\nfjjcled.com\nfjjgn396.com\nfjjianxin.com\nfjjmylbx.com\nfjjnsn.com\nfjjoyz.com\nfjjsp01.com\nfjjszg.com\nfjjyt.net\nfjjyxy.com\nfjjzjt.com\nfjkdxh.com\nfjkqyy.com\nfjlawyers.net\nfjlb.com\nfjlcjs.com\nfjlcjt.com\nfjleixin.com\nfjlg.com\nfjlh.com\nfjlib.net\nfjllsn.com\nfjlstz.net\nfjlszbc.com\nfjly.com\nfjlygroup.com\nfjlyrmyy.com\nfjlyzls.com\nfjlzy.com\nfjm.info\nfjmap.net\nfjmego.com\nfjmh.com\nfjmlh.com\nfjmotor.net\nfjmstc.com\nfjmzw.com\nfjndqx.com\nfjndwb.com\nfjnet.com\nfjnhjt.com\nfjotic.com\nfjpca.com\nfjpcz.com\nfjpicc.com\nfjpit.com\nfjpta.com\nfjptdy.com\nfjptyz.com\nfjptzs.com\nfjptzx.com\nfjptzyt.com\nfjqfkg.com\nfjqjsw.com\nfjrclh.com\nfjrcw.com\nfjrmyy.com\nfjrtv.net\nfjsafxh.com\nfjsalt.com\nfjsanheng.com\nfjsdn.com\nfjsdsrmyy.com\nfjsdxy.com\nfjsdzj.com\nfjsen.com\nfjsenda.com\nfjsfa.org\nfjsfjyl.com\nfjsfy.com\nfjshgx.com\nfjshjy.net\nfjsj.com\nfjsjkyy.com\nfjsmjj.com\nfjssjt.com\nfjstfc.com\nfjstjt.com\nfjstmgcjzhyxh.com\nfjsxqy.com\nfjsxyqygl.com\nfjsyyhyxh.com\nfjszx.com\nfjtd-logistics.com\nfjtelecom.com\nfjtianya.com\nfjtp.net\nfjtv.net\nfjtzlt.com\nfjvs.org\nfjwanan.com\nfjwjgs.com\nfjwr.xyz\nfjwxj.com\nfjwzjt.com\nfjxfgroup.com\nfjxhfx.com\nfjxhyw.com\nfjxhyy.com\nfjxiehe.com\nfjxn.com\nfjxsxx.com\nfjxwx.com\nfjxxal.com\nfjybyjjysos.com\nfjyc8.com\nfjycw.com\nfjydnews.com\nfjyfjsjt.com\nfjyklc.com\nfjyunba.com\nfjyxdm.com\nfjyxgl.com\nfjyy.org\nfjyyjt.com\nfjzbgf.com\nfjzikao.net\nfjzixun.com\nfjzol.com\nfjzx.org\nfjzyxx.com\nfjzzct.com\nfk100.com\nfkask.net\nfkblog.org\nfkbuff.com\nfkcaijing.com\nfkdex.com\nfkdmg.com\nfkdxg.com\nfkeduwxxcx.com\nfkgou.com\nfkguolu.com\nfkhdactive.com\nfkhdview.com\nfkhongdan.com\nfklhb.com\nfklngy.com\nfktool.com\nfkw.com\nfkw100.com\nfkwapi.com\nfkwatchtw.com\nfkwvya4035.vip\nfkyuer.com\nfkyun.com\nfkyxt.com\nfl-game.net\nfl0632.com\nfl160.com\nfl168.com\nfl365.com\nfl5.co\nfl580.com\nflacc.com\nflagchem.com\nflairmicro.com\nflamecdn.com\nflamesky.org\nflamingcold.com\nflan1688.com\nflaredup.com\nflash8.net\nflash8f.com\nflashcat.cloud\nflashgame163.com\nflashgene.com\nflashkrypton.com\nflashmemoryworld.com\nflashsalesfb.store\nflashv8.com\nflashwar.com\nflashwolfcn.com\nflashxsport.com\nflaskflock.com\nflatsh.com\nflawcache.com\nflclb.com\nflduo.com\nfle078.com\nflebm.com\nfleeper.com\nfleetlogd.com\nfleety.com\nflexifont.com\nfleyun.com\nflfc5999.com\nflgame.net\nflhimalayandn.com\nfliggy.com\nfliggy.hk\nflightroutes24.com\nflikfill.com\nflintech.org\nflintos.com\nflip.fun\nfliplus.com\nflleasing.com\nflmgr.net\nflml.cc\nfloatcamellia.com\nfloatingislandapps.com\nfloatmaze.com\nflockypet.com\nflomoapp.com\nfloorb2b.com\nflora009.work\nflorentiavillage.com\nflourish-fs.com\nflowchemchina.com\nflower188.com\nflower33.com\nflowerknows.co\nflowever.net\nflowinnglobal.com\nflowlbkj.com\nflowportal.com\nflowtechgd.com\nflowtechsh.com\nflpsz.com\nflpwb.com\nflqrmyy.com\nflrcw.com\nfltau.com\nfltcsb.com\nfltrp.com\nfluke-ig.com\nflumatic.com\nflutterchina.club\nflvcd.com\nflvlog.com\nflvpw.com\nflvsp.com\nflvurl.net\nflwatertech.com\nflxc.net\nflxdns.com\nflxzz.com\nfly-exp.com\nfly139.com\nfly160.com\nfly1999.com\nfly2lan.cc\nfly3949.com\nfly63.com\nfly84.com\nfly998.com\nflyadx.com\nflyai.com\nflyancctv.com\nflycc.net\nflyco.com\nflycua.com\nflydigi.com\nflyenglish.com\nflyert.com\nflyertea.com\nflyertrip.com\nflyfishx.com\nflyfunny.com\nflygo.net\nflygon.net\nflyhand.com\nflyingeffect.com\nflyingpigeon1936.com\nflyme.com\nflyme.net\nflymeauto.com\nflymeos.com\nflymeyun.com\nflyml.net\nflymobi.biz\nflymodem.net\nflymopaper.com\nflyneutron.com\nflysand.com\nflysheeep.com\nflytcloud.com\nflytexpress.com\nflzc.com\nflzhan.com\nfm-uivs.com\nfm058.com\nfm0754.com\nfm0758.com\nfm086.com\nfm120.com\nfm365.com\nfm3838.com\nfm4399.com\nfm520.com\nfm875.com\nfm901.cityfm.tw\nfm918.net\nfm929.cityfm.tw\nfm960.net\nfm971.cityfm.tw\nfm983.cityfm.tw\nfmbimg.com\nfmc123.com\nfmcoprc.gov.mo\nfmd360.com\nfmetro.net\nfmi33.com\nfminers.com\nfmjmm.com\nfmkefu.com\nfmkpharm.com\nfmmob.com\nfmscm.com\nfmsdlb.com\nfmsh.com\nfmssrc.com\nfmswift.net\nfmtmed.com\nfmtt6.xyz\nfmwei.com\nfmwhahaha.com\nfmy90.com\nfmyunlv.com\nfn-mart.com\nfn-tech.com\nfn010.com\nfnconn.com\nfnedge.net\nfnetlink.com\nfnf-foods.com\nfnfcutlery.com\nfnhealth.com\nfnji.com\nfnji.net\nfnjiasu.com\nfnjs.cc\nfnjsq.com\nfnkq.com\nfnkslift.com\nfnkvision.com\nfnlvshi.com\nfnmobi.com\nfnnas.com\nfnnas.net\nfnnsh.com\nfnnspa.com\nfnos.net\nfnrcw.com\nfnrczp.com\nfnsbqvz.com\nfnscore.com\nfnwlzz.com\nfnxzyy.com\nfnyes.com\nfnysb.com\nfob123.com\nfob580.com\nfobaoyou.com\nfobbusinessforum.com\nfobcentury.com\nfobmy.com\nfobshanghai.com\nfocaj.com\nfocalbrand.com\nfocalhot.com\nfocc.cc\nfochot.com\nfocigc.com\nfocobio.com\nfocofish.com\nfoctek.com\nfocus-efc.com\nfocus-eloan.com\nfocus-fusion.com\nfocuschina.com\nfocusight.net\nfocussend.com\nfocustock.com\nfodaba.com\nfodexin.com\nfodian.net\nfodizi.com\nfodizi.net\nfodlab.com\nfodonline.com\nfofa.info\nfofa.so\nfofcn.tech\nfofen.com\nfofstudio.net\nfofuai.com\nfogcloud.io\nfoguanghui.org\nfohohr.com\nfoidn.com\nfoisongroup.com\nfojiaonet.com\nfojiaoyongpin.com\nfokstone.com\nfoldur.com\nfolidaymall.com\nfolij9nry5cxy8.com\nfollowintg.com\nfollowsteel.com\nfolou.com\nfondcosplay.com\nfoneplatform.com\nfonian.com\nfonsview.com\nfont.im\nfont6.com\nfontgoods.com\nfontke.com\nfontong.com\nfontoohotels.com\nfontowns.com\nfontsfile.com\nfontshow.com\nfontvip.com\nfontyi.com\nfonye.com\nfoodaily.com\nfoodbk.com\nfoodciexpo.com\nfoodex360.com\nfoodjx.com\nfoodkz.com\nfoodmate.net\nfoodqs.com\nfoods1.com\nfoodsc.net\nfoodspace.net\nfoodspjm.com\nfoodszs.com\nfoodu14.com\nfoofish.net\nfooher.com\nfoojoo.com\nfookunion.com\nfookwood.com\nfookyik.com\nfooleap.org\nfoomx.com\nfoooooot.com\nfoosheng.com\nfootball8888.store\nfootballdown.com\nfootbig.com\nfootgamer.com\nfootseen.com\nfoovoo.com\nfooww.com\nfoqian.com\nfor-she.com\nfor512.com\nfor68.com\nforbeschina.com\nforbetty.com\nforbuyers.com\nforceclouds.com\nforcecreat.com\nforcemz.net\nforcger.com\nforcloudcdn.com\nford.com\nfordgo.com\nforecam.com\nforeignapi.com\nforeignserver.com\nforemostgroup.com\nforenose.com\nforerunnercollege.com\nforeseahealth.com\nforesealife.com\nforeseamall.com\nforesightfund.com\nforesl.com\nforestfood.com\nforestmusicnanjing.com\nforestpolice.net\nforestpolice.org\nforevernine.com\nforeveross.com\nforeweld.com\nforface3d.com\nforgame.com\nforindata.com\nforkeji.com\nforkliftnet.com\nforlinx.com\nform-create.com\nformeasy.cc\nformeneed.com\nformessengers.com\nformingcn.com\nformssi.com\nformtalk.net\nfornass.com\nfornature.com\nforrealbio.com\nforrelaxing.com\nforshine.net\nforsol.net\nforsou.com\nforthxu.com\nfortiortech.com\nfortrustpower.com\nfortunatelyt.com\nfortune-co.com\nfortunebs.net\nfortunehair.com\nfortunepdc.com\nfortunevc.com\nforwardgroup.com\nforwe.store\nforwell-parking.com\nforyone.com\nforyou56.com\nforyouge.com\nforyougroup.com\nforys-at.com\nfos.cc\nfoscam.com\nfoshanaosibo.com\nfoshanmuseum.com\nfoshannews.com\nfoshannews.net\nfoshanplus.com\nfoshanpower.com\nfoshion.com\nfosss.org\nfosstea.com\nfosun-uhi.com\nfosun.com\nfosunhealth.com\nfosunholiday.com\nfosunmetal.com\nfosunpharma.com\nfosunwanbang.com\nfotile.com\nfotileglobal.com\nfotilestyle.com\nfotomore.com\nfotoplace.cc\nfotosay.com\nfototuan.com\nfoturn.com\nfou.net\nfoumobile.com\nfounder.com\nfounder.net\nfounderaipu.com\nfounderbn.com\nfounderchip.com\nfoundereagle.com\nfounderff.com\nfounderfu.com\nfounderic.com\nfounderinternational.com\nfounderit.com\nfounderpcb.com\nfounderpod.com\nfoundersc.com\nfoundertech.com\nfoundertype.com\nfounpad.com\nfour-faith.com\nfourco-inc.com\nfourfaithwater.com\nfovmy.com\nfow.ink\nfowep.com\nfox-studio.net\nfox008.com\nfoxconn.com\nfoxconnmall.com\nfoxera.com\nfoxirj.com\nfoxmail.com\nfoxphp.com\nfoxqq.com\nfoxtable.com\nfoxuc.com\nfoxugame.com\nfoxwaf.com\nfoxwho.com\nfoxwq.com\nfoxzld.com\nfoyuan.net\nfozhidaoxs.cc\nfozl.sg\nfpaixfl.com\nfpc-nb.com\nfpccn.com\nfpcn.net\nfpdclub.net\nfpdisplay.com\nfpdvision.com\nfpe-china.com\nfpg.com.tw\nfpga-china.com\nfpgabbs.com\nfpgakey.com\nfpgaw.com\nfphis.com\nfphs.cc\nfphs5.com\nfpi-inc.com\nfpliu.com\nfpoll.net\nfpsace.com\nfpsjk.com\nfpstt.com\nfpwap.com\nfpxz.net\nfpyy120.com\nfq688.com\nfqapps.com\nfqbnbg1311.vip\nfqfilm.com\nfqghj.net\nfqgyljt.com\nfqhospital.com\nfqis.xin\nfqjob.net\nfqlook.com\nfqnovel-op.com\nfqnovel.com\nfqnovelim.com\nfqnovelop.com\nfqnovelpic.com\nfqnovelstatic.com\nfqnovelvod.com\nfqpai.com\nfqrsw.com\nfquwcs3089.vip\nfqvpc.online\nfqworld.org\nfqxdw.com\nfqxs.org\nfqxsw.cc\nfr-trading.com\nfr0528.art\nfr2007.com\nfractal-technology.com\nfraeco.com\nfraee.com\nfragpunk.com\nfragrance.ink\nfrainfo.com\nframemaker.com\nfranceqz.com\nfrancissoung.com\nfranckfw.com\nfrancochinois.com\nfrankenman.group\nfrankyrobot.com\nfranzsandner.com\nfraproperty.com\nfrcisforce.com\nfrdic.com\nfread.com\nfredamd.com\nfredestiny.com\nfree-863.com\nfree-api.com\nfree-coin.org\nfree-doctor.com\nfree-e.net\nfree-img.com\nfree9.net\nfreebuf.com\nfreebz.net\nfreecomm.net\nfreedgo.com\nfreedirlist.com\nfreedomscm.com\nfreedoonline.com\nfreegeeker.com\nfreehpcg.com\nfreeidea.win\nfreejishu.com\nfreekaobo.com\nfreekaoyan.com\nfreelycode.com\nfreelynb.com\nfreelynet.cloud\nfreelynet.com\nfreemancn.com\nfreemindworld.com\nfreemoban.com\nfreemudgame.com\nfreemypay.com\nfreeoa.net\nfreeovp.com\nfreeqingnovel.com\nfreeshoppingchina.com\nfreessl.org\nfreestman.com\nfreestyle666.com\nfreetech.com.hk\nfreetiku.com\nfreeuid.com\nfreevm.com\nfreewhale.net\nfreeydch.com\nfreeyun.com\nfreezhw.com\nfreezl.net\nfrefloya.com\nfrensworkz.com\nfreqchina.com\nfresh-ideas.cc\nfreshfresh.com\nfreshhema.com\nfreshippo.com\nfreshippomarket.com\nfreshiz.xyz\nfreshnewsnet.com\nfreshtrgetgendyalert.xyz\nfrgsupps.store\nfrhelper.com\nfriendeye.com\nfriends-exchange.com\nfriends8.com\nfriendship-match.com\nfrigate-cn.video\nfright-tattoo.com\nfrigidpine.com\nfringe-zero.com\nfrisobaby.com\nfristweb.org\nfrlawyer.com\nfrler.com\nfrodzo.club\nfroglesson.com\nfrombyte.com\nfromgeek.com\nfromshandong.com\nfromwiz.com\nfrontierbiotech.com\nfrontjs.com\nfrontopbd.com\nfrontpharm.com\nfrontstreetcoffee.com\nfrontwize.com\nfrost-s.com\nfrostchina.com\nfrostwell.cc\nfrostwell.net\nfrostwing98.com\nfrp-act.com\nfrp-air.com\nfrp-all.com\nfrp-any.com\nfrp-arm.com\nfrp-bag.com\nfrp-bar.com\nfrp-bid.com\nfrp-box.com\nfrp-boy.com\nfrp-bus.com\nfrp-china.net\nfrp-dad.com\nfrp-dog.com\nfrp-egg.com\nfrp-end.com\nfrp-era.com\nfrp-fan.com\nfrp-fee.com\nfrp-fog.com\nfrp-fox.com\nfrp-fun.com\nfrp-gap.com\nfrp-gas.com\nfrp-gym.com\nfrp-hat.com\nfrp-hen.com\nfrp-hip.com\nfrp-hub.com\nfrp-ice.com\nfrp-jar.com\nfrp-key.com\nfrp-kit.com\nfrp-lab.com\nfrp-leg.com\nfrp-mad.com\nfrp-mix.com\nfrp-mom.com\nfrp-net.com\nfrp-now.com\nfrp-nut.com\nfrp-off.com\nfrp-oil.com\nfrp-one.com\nfrp-own.com\nfrp-pen.com\nfrp-put.com\nfrp-rib.com\nfrp-rug.com\nfrp-run.com\nfrp-say.com\nfrp-sea.com\nfrp-shy.com\nfrp-six.com\nfrp-ski.com\nfrp-sun.com\nfrp-tag.com\nfrpapp.com\nfrt.ltd\nfrtgraphite.com\nfruitday.com\nfrysb.com\nfrytea.com\nfrzmh.com\nfs-ade.com\nfs-bus.com\nfs-czx.com\nfs-eliza.com\nfs-qiyun.com\nfs-yld.net\nfs.microsoft.com\nfs0757.com\nfs121.com\nfs1982.com\nfs31.com\nfs58.com\nfs7000.com\nfsabwy.com\nfsaii.com\nfsbankonline.com\nfsbldjd.com\nfsbqgd.com\nfsccjy.com\nfsccyy.com\nfschems.com\nfschico.com\nfscinda.com\nfscjfm.com\nfscjkj.net\nfscm.tech\nfscmjt.com\nfscsps.com\nfsdxzhpt.com\nfsecity.com\nfseig.com\nfseport.com\nfsesa.com\nfsfsfz.com\nfsfund.com\nfsfy.com\nfsgas.com\nfsgbly.com\nfsgcw.com\nfsgechao.com\nfsggb.com\nfsgplus.com\nfsgzhg.com\nfshczf.com\nfshd.com\nfshh1688.com\nfshj118.com\nfshones.com\nfshpharm.com\nfshsfl.com\nfshsl.com\nfshuiren.com\nfshyschool.net\nfshzg.com\nfsigc.com\nfsight.ai\nfsightai.com\nfsilon.com\nfsjgchina.com\nfsjgw.com\nfsjinlan.com\nfsjinma.com\nfsjoy.com\nfsjrl.com\nfsjsdtc.com\nfsjx.org\nfsjy.net\nfsky.pro\nfskzpw.com\nfslgz.com\nfslinker.com\nfsllq.com\nfslsg.com\nfsltsmhjq.com\nfslyx.com\nfsmama.com\nfsmcled.com\nfsmeeting.com\nfsmi818.com\nfsoet.com\nfsohu.com\nfsoptronics.com\nfsou.com\nfspage.com\nfspcdn.com\nfspinqiu.com\nfspits.com\nfspride.com\nfspt.net\nfspublic.com\nfsruibin.com\nfssdbjyy.com\nfssdlhyxh.com\nfsspc.com\nfssptjj.com\nfsstone.com\nfsswsxh.com\nfst-pipe.net\nfstaoci.com\nfstcb.com\nfstgs.com\nfsthr.com\nfstrhb.com\nfstvgo.com\nfsukj.com\nfswater.com\nfswateraso.net\nfswchina.com\nfswk.com\nfsxchina.com\nfsxinquan.com\nfsxsj.net\nfsxzygz.com\nfsy6.com\nfsyanhe.com\nfsygroup.com\nfsyhlz.com\nfsylr.com\nfsyq.net\nfsysyy.com\nfsytss.com\nfsyule.net\nfsyuncai.com\nfsyxg.com\nfsyy.net\nfsyyy.com\nfszhihuiyan.com\nfszhiko.com\nfszyjx.com\nft.tech\nft12.com\nft22.com\nft98.com\nfta.dell.com\nftaapj.dell.com\nftaemea.dell.com\nftaro.com\nftasitapj.dell.com\nftbj.net\nftcoaster.com\nftcwifi.com\nftd.nz\nftdevice.com\nftesop.com\nftfast.com\nftfund.com\nftfx.ink\nfthformal.com\nfthgz.com\nfthimalayandb.com\nftium4.com\nftlcloud.com\nftls.xyz\nftlzghz.com\nftmespro.com\nftnwater.com\nftoc.com\nftourcn.com\nftp.pet\nftsafe.com\nftsfund.com\nftswcc.com\nfttrs.com\nftuan.com\nftwafer.com\nftxad.com\nftxft.com\nftxgame.com\nftxia.com\nftxsoccer.com\nftylw.com\nftzbq.com\nftzn.net\nftzx.com\nfu-guan.com\nfu-rui.com\nfu2zu.com\nfu57.com\nfu62.vip\nfuanna.com\nfubabafumama.com\nfubangauctions.com\nfubaochem.com\nfubaofei.com\nfubonchina.com\nfubonplastic.com\nfuca-china.com\nfucantec.com\nfuchaipower.com\nfuchaoqun.com\nfuchen33.com\nfuchengshicai.com\nfuchuangyu.com\nfucol.club\nfuczx.com\nfuda.com\nfuda120.com\nfudaguangzhou.com\nfudahospital.com\nfudaiapp.com\nfudajishu.com\nfudajn.com\nfudakang.com\nfudancell.com\nfudanglp.com\nfudanmed.com\nfudanpress.com\nfudasafe.com\nfudayiyao.com\nfudian-bank.com\nfudongdong.com\nfudu167.com\nfudubao.com\nfuduwang.com\nfuduxiao.com\nfuduxuexiao.com\nfuedf.org\nfuel-lab.com\nfuelcellchina.com\nfuermu.com\nfufeng-group.com\nfufuidc.com\nfufuok.com\nfugary.com\nfuguangchina.com\nfuguangwater.com\nfuguantang.com\nfuhai360.com\nfuhancapital.com\nfuhanziben.com\nfuhaoku.com\nfuhefu.com\nfuheng.org\nfuhouyin.com\nfuhuibao.club\nfui.im\nfuiou.com\nfuioupay.com\nfujfu.com\nfujiabin.com\nfujianbenz.com\nfujiangames.com\nfujianguofu.com\nfujianmei.com\nfujianrc.com\nfujiansme.com\nfujianyinruan.com\nfujinguo.com\nfujinjiazheng.com\nfujinotrade.com\nfujutec.com\nfuka.cc\nfukangjixie.com\nfukangqipai.com\nfukangyuanyanglao.com\nfuke39.com\nfukexie.com\nfulanka.com\nfulantv.com\nfulengen.com\nfuliansheng.com\nfuliao.com\nfuliaotech.com\nfuliba.com\nfulicat.com\nfulimin.org\nfulin.org\nfuling.com\nfulinpm.com\nfulinsujiao.com\nfulinxiuxian.com\nfuliquan.com\nfulishemusic.com\nfulitec.com\nfuliti.com\nfuliw.net\nfull-way.com\nfullcopecb.icu\nfullde.com\nfullhan.com\nfullics.com\nfulllinks.com\nfullluckcalendar.com\nfullsemitech.com\nfullstack.love\nfulltech.work\nfulltruckalliance.com\nfulou.life\nfultree.com\nfulu.com\nfulykong.com\nfuma-carbide.com\nfumake.com\nfumaofawu.com\nfumi.com\nfumiaoyinpin.com\nfumin.com\nfumu.com\nfumubang.com\nfumuhui.com\nfun.tv\nfun2ex.com\nfun4go.com\nfuncdn.com\nfuncrea.com\nfunctionads.com\nfunctionaltextilesshanghai.com\nfunctorz.com\nfund001.com\nfundebug.com\nfundebug.net\nfundegroup.com\nfundog.cc\nfundrive.com\nfundxy.com\nfunenc.com\nfunengscm.com\nfuneralchain.com\nfunfungolf.com\nfungichina.com\nfungj.com\nfunhillmedia.com\nfunhillrm.com\nfuni.com\nfuni365.com\nfunik.com\nfuniutang.net\nfunjsq.com\nfunkoonlinegb.club\nfunletu.com\nfunliving.com\nfunmz.com\nfunnet.net\nfunnycore.com\nfunnycorelive.com\nfunnyplaying.com\nfunnysphere.com\nfunpaer.com\nfunplay66.com\nfunqipai.com\nfunsens.com\nfunshareamusement.com\nfunshion.com\nfunshion.net\nfunshion.tv\nfunshipin.com\nfuntaoyuan.com\nfuntouchos.com\nfuntoygame.com\nfunvba.com\nfunwear.com\nfunxun.com\nfunyard-hotels.com\nfunzm.com\nfupanwang.com\nfupin832.com\nfuragon.com\nfurama-beihai.com\nfurderdriving.com\nfurenchina.com\nfurenkeji.com\nfurielec.com\nfurongedu.com\nfurrychina.com\nfuruijiaju.vip\nfuruise.com\nfusaide.com\nfusheng-group.com\nfushengal.com\nfushibao.com\nfushite.com\nfusiling.com\nfusion-inte.com\nfusion.design\nfusionappl.com\nfusure.com\nfusureum.com\nfuta.eu\nfutaike.net\nfutang.org\nfute.com\nfutianlvshi.com\nfutongquartz.com\nfutu5.com\nfutuau.com\nfutuesop.com\nfutufin.com\nfutuhn.com\nfutuniuniu.com\nfutunn.com\nfuture-sh.com\nfutureengineer.org\nfuturejuzhen.vip\nfuturenetlab.com\nfutureprize.org\nfuturescontest.com\nfutustatic.com\nfututrade.com\nfututrustee.com\nfuwa.org\nfuwahgroup.com\nfuwai.com\nfuwaliuxue.com\nfuwei.com\nfuweifilms.com\nfuweivision.com\nfuweiwang.com\nfuweizn.com\nfuwit.com\nfuwj.com\nfuwo.com\nfuwu7.com\nfuwuce.com\nfuwucms.com\nfuwuqinet.com\nfuwuqu.com\nfuxila.com\nfuxinbank.com\nfuxinews.com\nfuxinghf.com\nfuxingtech.com\nfuxingwang.com\nfuxuanji-jp.com\nfuxunpay.com\nfuyang.com\nfuyang.net\nfuyangbio.com\nfuyangjituan.com\nfuyangren.org\nfuyangtv.com\nfuyaogroup.com\nfuyaozb.com\nfuyaozhubao.com\nfuyingdai.com\nfuyingkeji.com\nfuyingyanke.com\nfuyiou.com\nfuyiwang.net\nfuyou.online\nfuyou888.com\nfuyoubank.com\nfuyougame.com\nfuyoukache.com\nfuyuan5.com\nfuyuan6.com\nfuyuehotels.com\nfuyunbj.com\nfuyuncc.com\nfuyunjiasu.com\nfuyuzhe.com\nfuzadu.com\nfuzamei.com\nfuzeetech.com\nfuzegame.com\nfuzfu.net\nfuzhenghos.com\nfuzhhc.com\nfuzhimao.com\nfuzhoufashi.com\nfuzhuangwang.com\nfuzhugo.com\nfuziche.com\nfvfvxs.com\nfview.com\nfvo2o.com\nfvti.com\nfw-12365.com\nfw365.online\nfw4.co\nfw4.me\nfwbsjnakjabdname.com\nfwcfwg.com\nfwcranes.com\nfwcx315.com\nfwdq.com\nfwdqw.com\nfwfly.com\nfwhzxxgbyy.com\nfwljmwf.com\nfwlxtc.com\nfwqje67h.work\nfwqlt.com\nfwqtg.net\nfws-china.com\nfwtoys.com\nfwvv.net\nfwwevez.xyz\nfwxgx.com\nfx-plc.com\nfx120.net\nfx168api.com\nfx168news.com\nfx168vip.com\nfx3q.com\nfx678.com\nfx678.net\nfx678img.com\nfx678red.com\nfx696.com\nfx898.com\nfxbaogao.com\nfxccp1296.com\nfxcdev.com\nfxclass.net\nfxcsxb.com\nfxcw.com\nfxdp.com\nfxe0898.com\nfxeyee.com\nfxeyetips.com\nfxfbx.com\nfxfcyy.com\nfxgjwy.com\nfxgz8.com\nfxhaoke.com\nfxian.org\nfxiaoke.com\nfxingw.com\nfxjia.shop\nfxkedu.com\nfxkjnj.com\nfxlbb.com\nfxlbl.com\nfxltsbl.com\nfxm.so\nfxo2opt.com\nfxpai.com\nfxpan.com\nfxpharm.com\nfxrcw.net\nfxsh.com\nfxsou.com\nfxsw.net\nfxt365.com\nfxtrip.com\nfxtrips.com\nfxw.la\nfxwe.com\nfxxww.net\nfxxz.com\nfxyf99.com\nfxzb.vip\nfxzhj.com\nfxzhjapp.com\nfxzygc.com\nfy-connect.com\nfy-game.com\nfy-mold.com\nfy027.com\nfy169.net\nfy1938.com\nfy2d.com\nfy35.com\nfy65.com\nfyaaz.org\nfyab.net\nfyage.com\nfyak.net\nfyal.net\nfyan.net\nfyapi.net\nfyat.net\nfyau.net\nfyaw.net\nfybiji.com\nfybj.net\nfybjsd.com\nfyblogs.com\nfybxw.com\nfycpu.com\nfycrcgas.com\nfyddj.com\nfyddjys.com\nfydeos.com\nfydvtu.com\nfyec.net\nfyeds.com\nfyeds0.com\nfyeds1.com\nfyeds2.com\nfyeds3.com\nfyeds4.com\nfyeds5.com\nfyeds6.com\nfyeds7.com\nfyeds8.com\nfyeds9.com\nfyedu.net\nfyeedu.net\nfyfch.com\nfygame.com\nfygdrs.com\nfygi.com\nfygift.com\nfygjyljt.com\nfygmbc.com\nfygroup.com\nfygsoft.com\nfyigou.com\nfyjl.org\nfyjsz.net\nfyjzyxh.com\nfylcg.com\nfyleasing.com\nfyluo.com\nfymaduoji.com\nfymall0.com\nfymall1.com\nfymall2.com\nfymall3.com\nfymall4.com\nfymall5.com\nfymall6.com\nfymall7.com\nfymall8.com\nfymall9.com\nfymallqa0.com\nfymallqa1.com\nfymallqa2.com\nfymallqa3.com\nfymallqa4.com\nfymallqa5.com\nfymallqa6.com\nfymallqa7.com\nfymallqa8.com\nfymallqa9.com\nfynas.com\nfynb.net\nfynews.net\nfypage.com\nfypt.net\nfyqyjt.com\nfyrc.net\nfyrcbk.com\nfyrexian.com\nfyrmyy.com\nfyrqgs.com\nfyrwzz.com\nfyscs.com\nfysfzk.com\nfysip.com\nfysoft3.com\nfysyy.com\nfytcw.com\nfythbkj.com\nfytire.com\nfytschool.com\nfytxonline.com\nfytz.net\nfyuanpack.com\nfyun.cc\nfyun.org\nfyvart.com\nfywip.com\nfywx.cc\nfyxhlink.com\nfyxtzc.com\nfyxxcl.com\nfyxxwb.com\nfyxz.com\nfyydnz.cc\nfyynlx.com\nfyyy.com\nfyzku.com\nfyzls.com\nfyzp.net\nfz-aefi.com\nfz-energy.com\nfz-gf.com\nfz0752.com\nfz222.com\nfz2sc.com\nfz597.com\nfzahw.com\nfzaqjy.com\nfzbbk.com\nfzbdcj.com\nfzbidding.com\nfzbingo.com\nfzbm.com\nfzccpit.org\nfzcollege.org\nfzcpos.com\nfzcrg.com\nfzcyjh.com\nfzddg.com\nfzdmag.com\nfzdzyun.com\nfzec-tencentclb.cloud\nfzec-tencentclb.com\nfzec-tencentclb.net\nfzec-tencentclb.work\nfzele.com\nfzengine.com\nfzentertainment.com\nfzetyy.com\nfzfhg.com\nfzfinancing.com\nfzfrp.com\nfzfu.com\nfzfzjx.com\nfzg360.com\nfzghy.com\nfzgolden.com\nfzhlkx.com\nfzhqzx.net\nfzhzxh.com\nfzithome.com\nfzjdct.com\nfzjingzhou.com\nfzjs.work\nfzjxr.com\nfzjxw.com\nfzkjg.com\nfzl7.com\nfzlawyers.net\nfzlbar.com\nfzlean.com\nfzlft.com\nfzlizhi.net\nfzlol.com\nfzmama.net\nfzmetro.net\nfzmtr.com\nfzn.cc\nfzport.com\nfzqywater.com\nfzrsrc.com\nfzs.com\nfzsdtkq.com\nfzsdyyy.com\nfzshouji.com\nfzslyy.com\nfzswgc.com\nfzswjt.com\nfzswyc.com\nfzsybj.com\nfzthinking.com\nfzvcolco.com\nfzwater.com\nfzwcn.com\nfzwhzn.com\nfzwqq.com\nfzwtqx.com\nfzwxxcx.com\nfzxiaomange.com\nfzxm.com\nfzyfan.com\nfzyfs.net\nfzyinghe.com\nfzyun.net\nfzyvis.com\nfzyz.net\nfzzhaobiao.com\nfzzhtc.com\nfzzhuoyi.com\nfzzixun.com\nfzzpw.net\nfzzqcdn.com\ng-biomed.com\ng-bits.com\ng-cores.com\ng-digital4ud.com\ng-film.com\ng-hi.com\ng-medon.com\ng-proxy.com\ng-spin.com\ng-tar.com\ng-var.com\ng.biz\ng00gle.vip\ng052m43e2ghn.com\ng1080.com\ng12e.com\ng12e.org\ng188.net\ng1d.net\ng1yx.com\ng2.link\ng20chn.org\ng2h3.com\ng2us.com\ng2work.com\ng32365.com\ng3d.org\ng3img.com\ng3user.com\ng3voip.com\ng3wei.com\ng4weixin.com\ng55m94b1za.com\ng59p.com\ng5h.com\ng5h4.com\ng5kj.com\ng63.fun\ng66667777.com\ng768r.com\ng77775555.com\ng7bd307de.skin\ng80mx.com\ng82btd54.work\ng88885555.com\ng88886666.com\ng8hh.com\ng983.com\ng9china.com\nga-me.com\nga-zn.com\nga002.com\ngaaamee.com\ngaapqcloud.com\ngaaptest.com\ngac-capital.com\ngac-nio.com\ngacfca.com\ngacfcasales.com\ngacfiatauto.com\ngachn.com\ngaclib.net\ngacmotor.com\ngacrnd.com\ngacsofinco.com\ngadlee.com\ngae-pro.com\ngaeadata.com\ngaeamobile-inc.net\ngaeamobile.net\ngaetausohyei.com\ngafata.com\ngafei.com\ngafencuchina.com\ngagacafe.com\ngagaga.icu\ngagaga.tech\ngagahi.com\ngai.net\ngaiabiohx.com\ngaiamount.com\ngaiaworkforce.com\ngaibang365.com\ngaibar.com\ngaibieshu.net\ngaicas.com\ngaigeshen.work\ngainchip.com\ngainda.net\ngaineng.net\ngainet.com\ngainscha.com\ngaintop.com\ngairuo.com\ngaisen.ltd\ngaishichina.com\ngaishitongshu.com\ngaitu.com\ngaituba.com\ngaitubao.com\ngaituya.com\ngaixingchang.com\ngaixue.com\ngaiyadajidali.com\ngaiyazhanlan.com\ngaizhui.com\ngajerseys.com\ngajsk.com\ngal3d.info\ngala-v.com\ngalaxix.com\ngalaxus.club\ngalaxus.work\ngalaxy-geely.com\ngalaxy-immi.com\ngalaxyasset.com\ngalaxycarepair.com\ngalaxyfont.com\ngalaxyinfo.com\ngalaxymagnets.com\ngalaxyoversea.com\ngalileo.work\ngalsun.com\ngaludisu.info\ngalvincdn.com\ngamder.cc\ngamdream.com\ngame-as.com\ngame-client.com\ngame-props.com\ngame-reign.com\ngame10000.com\ngame112233.com\ngame123.space\ngame12315.com\ngame13.com\ngame2.com\ngame234.com\ngame332.com\ngame3vs7novel.com\ngame499.com\ngame5.com\ngame5399.com\ngame773.com\ngame798.com\ngame80s.com\ngame89.com\ngame900.com\ngame9012.com\ngame95.cc\ngameabc.com\ngameabc2.com\ngameabc2.net\ngameapida.com\ngameapp.club\ngamebar.com\ngamebean.com\ngamebean.net\ngamebee.net\ngamebonfire.com\ngamebto.com\ngamecat.fun\ngamecatstudio.com\ngamecomb.com\ngamed9.com\ngamedachen.com\ngamedo.org\ngameducky.com\ngameegg.com\ngameexp.com\ngamefang.com\ngamefeile.com\ngamefm.com\ngamegamept.com\ngamege.com\ngameggg.com\ngamegocenter.com\ngamegocenter.net\ngamehaopu.com\ngamehome.tv\ngameinns.com\ngameitop.com\ngamejym.com\ngamekee.com\ngamekezhan.com\ngamekuaishou.com\ngamelet.games\ngameley.com\ngameloop.com\ngameloop.fun\ngamemale.com\ngamemcu.com\ngamemei.com\ngamemili.com\ngamenow.club\ngameol.com\ngamepingce.com\ngamepp.com\ngamer520.net\ngamerboom.com\ngameres.com\ngamerhome.com\ngamerhome.net\ngamermake.com\ngamersky.com\ngamersky.net\ngamerstorm.com\ngamesh.com\ngameshr.com\ngamesifu.com\ngametanzi.com\ngametaptap.com\ngametdd.com\ngametea.com\ngametea.net\ngamethk.com\ngamett.net\ngameviewer.com\ngamewifi.net\ngamewower.com\ngamexdd.com\ngamexhb.com\ngamexun.com\ngameyiming.com\ngameyisi.com\ngameyj.com\ngamfe.com\ngammabicycle.com\ngammatimes.com\ngamutsoft.com\ngamux.org\ngamxex.com\ngan-ren.com\ngandi.net\nganduee.com\ngangbao365.com\ngangbogroup.com\ngangduotech.com\nganggangguoji.com\nganggg.com\ngangguan8.com\ngangguana.com\nganghaowang.com\ngangjiajieli.com\ngangpaibao.com\ngangqinpu.com\ngangqinxiansheng.com\ngangshenglian.com\ngangtise.com\ngangwan.com\ngangyu.org\ngangyuan.com\nganhao.vip\nganji.com\nganjiangrc.com\nganjiangvpn.com\nganjiazheng.com\nganjin.com\nganjistatic1.com\nganjistatic2.com\ngank-studio.com\ngank.io\ngankang.com\ngankao.com\ngankaomao.com\ngankaosheng.com\ngankgames.com\ngankh5.com\nganlj.com\nganlongjt.com\nganlv.net\nganlvji.com\nganniu.com\nganode.org\nganqi.com\nganqi.net\nganqing10.com\nganrobot.com\nganso.net\ngansuairport.com\ngansumuseum.com\ngansuyouxi.com\ngantanhao.com\ngantanhao.vip\ngantong.net\nganwan.com\nganxb2.com\nganxi.com\nganxianw.com\nganxianzhi.win\nganxinet.com\nganyeah.com\nganyu.com\nganyu.org\nganyu8.net\nganyurc.com\nganzhe.com\nganzhishi.com\nganzhong.net\nganzitv.com\ngao-shou.com\ngao.bo\ngao.com\ngao7.com\ngao7gao8.com\ngaoan.net\ngaobei.com\ngaobiao.xyz\ngaobohealthcare-sh.com\ngaocangyun.com\ngaoce.cc\ngaocegege.com\ngaochun.info\ngaoda8.com\ngaodage.com\ngaodangbiao.com\ngaode.com\ngaodilicai.com\ngaodimed.com\ngaoding.com\ngaoduanqianzheng.com\ngaoduguoji.com\ngaodun.com\ngaodunwangxiao.com\ngaofacable.com\ngaofangcache.com\ngaofangm.com\ngaofangz.com\ngaofans.com\ngaofeie.com\ngaofen.com\ngaofenplatform.com\ngaofenzi.org\ngaofushuai.com\ngaogpress.com\ngaogulou.com\ngaohaipeng.com\ngaohangip.com\ngaoheconsult.com\ngaohr.com\ngaohuasec.com\ngaoimg.com\ngaojer.com\ngaoji.ren\ngaojie.com\ngaojihealth.com\ngaojima.com\ngaojipro.com\ngaojitui.com\ngaojiua.com\ngaokao.com\ngaokao365.com\ngaokao789.com\ngaokaobaoming.com\ngaokaohelp.com\ngaokaomeishu.com\ngaokaopai.com\ngaokaoq.com\ngaokaozhiku.com\ngaokaozhitongche.com\ngaokeny.com\ngaokin.com\ngaokowl.com\ngaokw.com\ngaokzx.com\ngaolian.com\ngaoligroup.com\ngaolihanjie.com\ngaolouimg.com\ngaomeif.com\ngaomeluo.com\ngaominews.com\ngaomon.net\ngaopaiwood.com\ngaopeng.com\ngaopin.tech\ngaopinimages.com\ngaopost.com\ngaoqidian.com\ngaoqingdianshi.com\ngaoqinghua.com\ngaoqingpai.com\ngaoqiwenda.com\ngaoqixhb.com\ngaoqixie.com\ngaore.com\ngaosafe.com\ngaosan.com\ngaoseng.com\ngaoshou.me\ngaoshouvr.com\ngaoshouyou.com\ngaosiedu.com\ngaosivip.com\ngaosouyi.com\ngaosu.com\ngaosudu.com\ngaotang.cc\ngaotangwang.com\ngaotieshike.com\ngaotu006.club\ngaotu007.club\ngaotu100.com\ngaotu11.com\ngaotuxueyuan.com\ngaowoip.com\ngaoxiaobang.com\ngaoxiaodashi.com\ngaoxiaoit.com\ngaoxiaojob.com\ngaoxiaoo.com\ngaoxiaozp.com\ngaoxin123.com\ngaoxincarbon.com\ngaoxinedu.com\ngaoxinedu.net\ngaoxinjy.com\ngaoxitech.com\ngaoyawang.com\ngaoyizaixian.com\ngaoyoujob.com\ngaozhaiedu.com\ngaozhentang.com\ngaozhidazhuan.com\ngaozhongwuli.com\ngaozhouba.com\ngaozi365.com\ngap.hk\ngapitech.com\ngaqcloud.com\ngaqcloud.net\ngaqcloud1.com\ngaqcloud2.com\ngaqcloudbackup.com\ngaqcloudbackup.net\ngara.cc\ngarage-bastide.com\ngarden-aquarium.com\ngardencn.com\ngardenhotel.com\ngardenhotelshanghai.com\ngarfopg.org\ngarleden.com\ngarmin.com\ngarmuri.com\ngarnoc.com\ngarnor.com\ngarphy.com\ngarply.com\ngaryee.com\ngas-analyzers.com\ngas-scrubber.com\ngas-turbine-parts.com\ngas775.com\ngas800.com\ngasfw.com\ngasgoo.com\ngasgood.com\ngashr.com\ngashw.com\ngaspeedup.com\ngaspim.com\ngasshow.com\ngastank-china.com\ngastronomy.gov.mo\ngate-dhgames.com\ngateface.com\ngateweb3.cc\ngateweb3.io\ngather-dns.com\ngatymciu.com\ngaudie.org\ngaugan.com\ngaush.com\ngautomator.com\ngavill.com\ngavindesign.com\ngavinzh.com\ngaxgame.com\ngaxrmyy.com\ngayotv.net\ngayzyhh.com\ngaze.run\ngazellegames.net\ngazemd.com\ngazx.org\ngb324.com\ngb55009.com\ngb56.net\ngb5842.com\ngbacd.com\ngbase8a.com\ngbasebi.com\ngbasig.com\ngbdex.com\ngbdz.net\ngbeca.org\ngbffchina.com\ngbgba.com\ngbgcn.com\ngbhome.com\ngbiac.net\ngbicdn.com\ngbicom.com\ngbictc.com\ngbimg.com\ngbma.org\ngbofd.com\ngbox.pub\ngboxchina.com\ngbphar.com\ngbrgz.com\ngbskptu1044.vip\ngbsrobot.com\ngbstape.com\ngbt88.com\ngbtranswins.com\ngbvh.com\ngbw114.com\ngbxgateway-dev.dell.com\ngbxgateway.dell.com\ngc-zb.com\ngc0771.com\ngc1616.com\ngc39.com\ngc48tdh6gm.com\ngc73.com\ngc91.com\ngcable.tv\ngccdn.net\ngccgz.com\ngcchina.com\ngccmgw.com\ngccrcw.com\ngcdcrs.com\ngcexlab3.com\ngcgd.net\ngcgzjt.com\ngchao.com\ngchbs.com\ngchhotels.com\ngci-china.com\ngcihotel.net\ngciig.com\ngcimg.net\ngcjc.com\ngcjgxx.com\ngcjlkj.com\ngcjr.com\ngcjy.info\ngckychina.com\ngcl-et.com\ngcl-perovskite.com\ngcl-power.com\ngcld.net\ngclhgc.com\ngcloudcs.com\ngcloudcstest.com\ngcloudcstestonly.com\ngclouddolphin.com\ngcloudf.com\ngcloudgbs.com\ngcloudsdk.com\ngcloudsvcs.com\ngcmc.cc\ngcok.com\ngcomtechnology.com\ngcopt.com\ngcoreinc.com\ngcores.com\ngcpok.com\ngcpunion.org\ngcs66.com\ngcscmp.com\ngcstorage.com\ngctianshanxh.com\ngctong.com\ngctwds.com\ngctzsh.com\ngcwdp.com\ngcwduoduo.com\ngcwith.com\ngcykj.com\ngcyts.com\ngcyy08.com\ngczyg.com\ngd-chenxing.com\ngd-chuangfu.com\ngd-dl.com\ngd-esa.com\ngd-haijing.com\ngd-hcsj.com\ngd-hongyuegroup.com\ngd-hskj.com\ngd-hstech.com\ngd-huadi.com\ngd-id.com\ngd-jinzhanggui.com\ngd-jxjy.com\ngd-kexin.com\ngd-linux.com\ngd-linux.org\ngd-ls.com\ngd-lt.com\ngd-realfaith.com\ngd-shenhua.com\ngd-tianchen.com\ngd-tianyue.com\ngd-wanxi.com\ngd-weisi.com\ngd-xrsd.com\ngd1580.com\ngd165.com\ngd2000.org\ngd2h.com\ngd32.com\ngd32mcu.com\ngd3n.com\ngd56114.com\ngd563.com\ngd9d.com\ngda086.com\ngdaa.ltd\ngdadjs.com\ngdadri.com\ngdaep.com\ngdahua.com\ngdaia.net\ngdairport.com\ngdanano.com\ngdandun.com\ngdapi.net\ngdarcu.net\ngdase.com\ngdass.org\ngdatacube.net\ngdatc.net\ngdbailin.com\ngdbainengbao.com\ngdbaishun.net\ngdbbk.com\ngdbhnk.com\ngdbicyclexh.com\ngdbidding.com\ngdbita.com\ngdbljd.com\ngdbmh.com\ngdbsjd.com\ngdbzkz.com\ngdbzkz.org\ngdcaa.com\ngdcaia.com\ngdcaward.com\ngdcayyebh.com\ngdccaa.com\ngdcci.com\ngdccus.org\ngdcdsh.com\ngdceg.com\ngdcgkg.com\ngdchanbo.com\ngdchess.com\ngdchjt.com\ngdcia.org\ngdcic.net\ngdcjrhcjh.com\ngdcjtd.com\ngdcjxx.com\ngdcocodemer.com\ngdcoop.com\ngdcopper.com\ngdcordblood.org\ngdcost.com\ngdcow.com\ngdcreate.com\ngdcsgj.com\ngdctaa.com\ngdctcd.com\ngdctdb.com\ngdctpark.com\ngdcts.com\ngdctsvisa.com\ngdctsy.com\ngdcvi.net\ngdcxc2c.com\ngdcxxy.net\ngdcygp.com\ngdcyl.org\ngdczedu.net\ngdczkj.com\ngdczyy.com\ngddata.net\ngddci.com\ngddcjt.com\ngddcm.com\ngddelux.com\ngddeqing.com\ngddfpaper.com\ngddfund.com\ngddg.cc\ngddhn.com\ngddianchuang.com\ngddidg.com\ngddikasi.com\ngddingxin.com\ngddjauto.com\ngddlaaa.com\ngddlkj.com\ngddmsmc.com\ngddqfs.com\ngddqfs.net\ngddrcgzjt.com\ngddsjt.com\ngddtop.com\ngddyhb168.com\ngddysl.com\ngddz0769.com\ngde.cc\ngdeams.com\ngdebidding.com\ngdecn.com\ngdedia.com\ngdedu123.com\ngdeeia.com\ngdefair.com\ngdeia.com\ngdems.com\ngdepi.com\ngdevops.com\ngdfanhua.com\ngdfcjz.com\ngdfeiyang.com\ngdfenxiao.com\ngdfggvfsd.asia\ngdfgq.club\ngdfjsh.org\ngdfplaza.com\ngdfs.com\ngdfsg-yxva.vip\ngdfshx.com\ngdfuji.com\ngdfushefanghuxiehui.com\ngdfzsy.com\ngdgajt.com\ngdganhua.com\ngdgassoc.com\ngdgcjhf.com\ngdgczb.com\ngdggkf.com\ngdghg.com\ngdgkfn.com\ngdgkty.com\ngdgowe.com\ngdgpc.net\ngdgrsw.com\ngdguangdong.com\ngdguozhi.com\ngdgwyw.com\ngdgxxbw.com\ngdgzhengzhou.com\ngdgzrb.com\ngdhairun.com\ngdhaoma.com\ngdhbsh.com\ngdhchina.com\ngdhcsh.com\ngdhdbxg.com\ngdhdgc.com\ngdhengdian.com\ngdhfjt.com\ngdhfkg.com\ngdhhgroup.com\ngdhhjs.net\ngdhhotels.com\ngdhjtz.com\ngdhjzs.com\ngdhla.com\ngdhmgc.com\ngdhongsha.com\ngdhpwx.com\ngdhqzy.com\ngdhsbid.com\ngdhtcm.com\ngdhuana.com\ngdhuaxun.net\ngdhuaya.com\ngdhwater.com\ngdhwgf.com\ngdhwjl.com\ngdhxgf.com\ngdhylhh.com\ngdhzsb.com\ngdi5ap2ikn.com\ngdida.org\ngdie.com\ngdinfo.net\ngdinin.com\ngdinm.com\ngdinsa.org\ngdinsight.com\ngdipa.org\ngdippa.com\ngdiso.com\ngdj-tech.com\ngdjdxh.com\ngdjdxy.com\ngdjhh.com\ngdjiabao.com\ngdjinge.com\ngdjinguan.net\ngdjingyin.com\ngdjinzong.com\ngdjiutu.com\ngdjky.com\ngdjlfood.com\ngdjlxh.org\ngdjly.com\ngdjs120.com\ngdjshd.com\ngdjugong.com\ngdjuhan.com\ngdjuntai.com\ngdjxjy.com\ngdjxzs.com\ngdjydg.com\ngdjysteel.com\ngdjyw.com\ngdjyyy.com\ngdkailin.com\ngdkcsj.com\ngdkepler.com\ngdkingma.com\ngdkjb.com\ngdkjk56.com\ngdkjw.com\ngdkjzy.net\ngdks168.com\ngdkszx.com\ngdktzx.com\ngdkxpcb.com\ngdkyhj.com\ngdkz88.com\ngdlaoan.com\ngdlgsw.com\ngdlgxy.com\ngdlighting.com\ngdlii.com\ngdlinefly.com\ngdlingjie.net\ngdlins.com\ngdliontech.com\ngdlkjt.com\ngdlmetc.com\ngdlnpumps.com\ngdlsgz.com\ngdlswl.com\ngdly-motor.com\ngdlz.com\ngdmagam.com\ngdmain.com\ngdmca.org\ngdmhjjt.com\ngdmia.com\ngdminda.com\ngdmm.com\ngdmoa.org\ngdmschina.com\ngdmtjt.com\ngdmuah.com\ngdmusah.com\ngdmuseum.com\ngdmzh.com\ngdmztv.com\ngdnanbo.com\ngdnbdaqi.com\ngdnd2016.com\ngdnengyuan.com\ngdneptunus.com\ngdnewmedia.cc\ngdnfu.com\ngdnfzb.com\ngdnhci.com\ngdnin.com\ngdniubang.com\ngdnjuae.com\ngdnybank.com\ngdnyjt.com\ngdofun.com\ngdoip.com\ngdojbk.com\ngdokpackaging.com\ngdolai.com\ngdomall.com\ngdou.com\ngdpace.com\ngdpdd.com\ngdpengquan.com\ngdpia.com\ngdprm.com\ngdprm.net\ngdpsc.org\ngdpysc.com\ngdqcxcl.com\ngdqianliang.com\ngdqianyou.com\ngdqlxh.com\ngdquannong.com\ngdqxjt.com\ngdqynews.com\ngdrc.com\ngdrc360.com\ngdrc365.com\ngdrcu.com\ngdrdcy.com\ngdrfyy.com\ngdronggang.com\ngdroro.com\ngdrqj.org\ngdrsrc.com\ngdruien.com\ngdruisheng.com\ngdrxyy.com\ngdrxzx.com\ngdryc.com\ngds-huanbaogroup.com\ngds-services.com\ngdsa.com\ngdsaipu.com\ngdsalt.com\ngdsanlian.com\ngdsanling.com\ngdsbaxh.com\ngdscse.net\ngdsday.com\ngdsdays.com\ngdsdkg.com\ngdsdwan.com\ngdsdyy.com\ngdsflbs.com\ngdsfpharma.com\ngdsfsgl.com\ngdsgd.com\ngdsgj.com\ngdsgjgxh.com\ngdshcm.com\ngdshe.org\ngdshunna.net\ngdshuojin.com\ngdsia.net\ngdsjqr.com\ngdsjx.com\ngdsjxjy.com\ngdskfz.com\ngdskills.com\ngdskin.com\ngdslrobot.com\ngdslwl.com\ngdsme.org\ngdsoftpark.com\ngdsports.net\ngdsqyg.com\ngdsrcw.com\ngdssie.com\ngdsspt.net\ngdst.cc\ngdstc.group\ngdstie.com\ngdstlab.com\ngdsugar.com\ngdsunfly.com\ngdsunhot.com\ngdsunli.com\ngdsuxie.com\ngdswgc.com\ngdswine.com\ngdsxgd.com\ngdsxgf.com\ngdsytech.com\ngdsyy.org\ngdsyzxsz.com\ngdszjgdj.org\ngdszkw.com\ngdszsl.com\ngdszxh.com\ngdtadx.com\ngdtaihao.com\ngdtap.com\ngdtc.cc\ngdtcoin.com\ngdtcyy.com\ngdtengen.com\ngdtengnan.com\ngdtex.com\ngdtextbook.com\ngdtianrun.com\ngdtianshanoa.com\ngdtichy.com\ngdton.com\ngdtongda.com\ngdtongjiang.com\ngdtongyi.com\ngdtravel.com\ngdtri.com\ngdtstream.com\ngdttaph.com\ngdttc.com\ngdtu.org\ngdtx56.com\ngdtykj.net\ngdtz888.com\ngdtzb.com\ngdu-tech.com\ngduaee.com\ngdunis.com\ngdupi.com\ngdus.cc\ngdutbbs.com\ngdveren.com\ngdvolunteer.net\ngdwanlv.com\ngdwanshun.com\ngdwbyq.com\ngdwca.com\ngdwczb.com\ngdweilaisw.com\ngdwha.org\ngdwia.com\ngdwlcloud.com\ngdwld.com\ngdwlife.com\ngdwsa.com\ngdwse.com\ngdwsrc.net\ngdww.com\ngdwxyf.com\ngdwz.com\ngdxdf.com\ngdxdpg.com\ngdxdy.com\ngdxfl.com\ngdxindun.com\ngdxinqiang168.com\ngdxinxiang.com\ngdxise.com\ngdxjzx.org\ngdxmsx.com\ngdxscode.com\ngdxsn.com\ngdxueyin.com\ngdxy.vip\ngdxych.com\ngdybkjjt.com\ngdyd.com\ngdydgj.com\ngdydzb.com\ngdyeb.com\ngdygsk.com\ngdyhgn.com\ngdyhsp.com\ngdyiyou.com\ngdykhb.net\ngdylhp.com\ngdyngl.com\ngdyouyes.com\ngdypt.com\ngdyqxc.com\ngdyslyh.org\ngdysnk.com\ngdysxh.com\ngdytc.com\ngdytxh.com\ngdyuanshun.com\ngdyuasa.com\ngdyuegou.com\ngdyuhi.com\ngdyunxiao.com\ngdyunyin.net\ngdyxc.com\ngdyyjgxh.com\ngdyyyy.net\ngdz.co\ngdzbha.com\ngdzcjt.net\ngdzd-motor.com\ngdzdbidding.com\ngdzgjl.com\ngdzgy.com\ngdzhcx.com\ngdzhenxing.com\ngdzhiding.com\ngdzhig.com\ngdzhonghua.com\ngdzhongpeng.com\ngdzhongshan.com\ngdzjdl.com\ngdzjqy.com\ngdzp.org\ngdzrlj.com\ngdzs2018.cc\ngdzs2018.vip\ngdzskj.tech\ngdzsxx.com\ngdzszt.com\ngdztbz.com\ngdzuoxie.com\ngdzxgj.com\ngdzxmm.com\ngdzy5413.com\ngdzygroup.com\ngdzygy.com\ngdzyinvest.com\ngdzyjnw.com\ngdzz114.com\ngdzzjc.com\ngdzzw.net\ngdzzz.com\nge-garden.net\nge100.com\nge3rge43r6.com\ngeality.com\ngeapu.com\ngear5.me\ngearbbs.net\ngearfront.net\ngearkr.com\ngearpharma.com\ngearsnet.com\ngeautos.com\ngebaiwan.com\ngebchina.com\ngebertech.com\ngebilaoshi.com\ngebinlong.com\ngebiqu.com\ngec123.com\ngeci123.com\ngecimi.com\ngecpc.com\ngedi2099.com\ngedou8.com\ngedoumi.com\ngedu.org\ngeeboo.com\ngeebook.com\ngeedai.com\ngeedu.com\ngeeetech.com\ngeeeu.com\ngeehy.com\ngeejing.com\ngeek-docs.com\ngeek-papa.com\ngeek-share.com\ngeek32.com\ngeekbang.com\ngeekbang.org\ngeekbangtech.com\ngeekcar.com\ngeekcar.net\ngeekclo.com\ngeekdata.com\ngeekdaxue.co\ngeekdive.com\ngeekefu.com\ngeekercloud.com\ngeekerconsulting.com\ngeekerhua.com\ngeekfans.com\ngeekiron.com\ngeeklab.work\ngeeklei.com\ngeekluo.com\ngeekmaker.com\ngeekman.vip\ngeeknev.com\ngeekpark.net\ngeekpwn.com\ngeekpwn.org\ngeeksblog.cc\ngeeksman.com\ngeektcp.com\ngeektutu.com\ngeeku.net\ngeekwom.com\ngeekxia.com\ngeekxue.com\ngeekzhao.me\ngeekzl.com\ngeelevel.com\ngeely-auto-gtm.com\ngeely-motors.com\ngeely-test.com\ngeely.com\ngeely.com.qa\ngeely.pe\ngeelyauto.com.hk\ngeelycv.com\ngeelydesign.com\ngeelyholding.com\ngeelylaos.com\ngeelyminiprogram.com\ngeelyph.com\ngeelysc.com\ngeelyswedenholdings.com\ngeement.com\ngeeqee.com\ngeermunews.com\ngeermurmt.com\ngeeseteam.com\ngeesic.com\ngeespace.com\ngeetest.com\ngeevisit.com\ngeewaza.com\ngeexek.com\ngeezn.com\ngegame.site\ngegeailu.org\ngegedao.com\ngegejia.com\ngegemm.work\ngegeselect.hk\ngegeyingshi.com\ngehaowu.com\ngehope.com\ngehua.com\ngehua.net\ngei-journal.com\ngei.pw\ngei6.com\ngeicloud.com\ngeihuasuan.com\ngeihui.com\ngeilicdn.com\ngeilijiasu.com\ngeilijiasu.net\ngeiliwx.com\ngeimian.com\ngeiniwan.com\ngeisnic.com\ngeizan.cc\ngelaha.com\ngelicang.net\ngeline.net\ngelinya.com\ngeliqi.net\ngellec.com\ngelonghui.com\ngelu.me\ngelufu.com\ngem-soft.com\ngemac-cn.com\ngembotech.com\ngemchina.com\ngemdale.com\ngemei.com\ngemelai.com\ngemiaomiao.org\ngemii.cc\ngemini-galaxy.com\ngemini530.net\ngemjz.com\ngemled-tech.com\ngempharmatech.com\ngempoll.com\ngemuedu.com\ngenchim.com\ngendan5.com\ngendantong.com\ngendone.com\ngenegeo.com\ngeneliunx.com\ngenelotus.com\ngenepharma.com\ngeneral-power.com\ngeneralfushi.com\ngeneralichina.com\ngeneraltouch.com\ngeneralwatertech.com\ngenergy-technology.com\ngenericfixer.com\ngenerosbio.com\ngenesis-rock.com\ngeneskies.com\ngenetalks.com\ngenevoyager.com\ngeneway-bio.com\ngeneworldcn.com\ngenfleet.com\ngengchuangz.com\ngengfuwang.com\ngenghai.com\ngengius.com\ngengleyuan.com\ngengls.org\ngengnie.com\ngengsan.com\ngengshangpin.com\ngengstar.com\ngengzhongbang.com\ngenhousebio.com\ngeni4s.com\ngenial.vip\ngeniatech.com\ngenie-robot.com\ngeniusafc.com\ngeniusara.com\ngeniuscn.com\ngeniusite.com\ngenmiao.com\ngenobank.org\ngenomeditech.com\ngenrace.com\ngenscript.com\ngensee.com\ngenshinimpact.com\ngenshinimpact.moe\ngenshuixue.com\ngenstars.com\ngentco.com\ngentechchina.com\ngentize.com\ngenudite.com\ngenuine-bio.com\ngenuway.com\ngenvict.com\ngenway.net\ngeo-compass.com\ngeo.kaspersky.com\ngeo2k.com\ngeoactivity.net\ngeoai.com\ngeoforcechip.com\ngeogsci.com\ngeoharbour.com\ngeohey.com\ngeoidc.com\ngeolong.com\ngeometryauto.com\ngeons.host\ngeorginaarmadas.com\ngeosheen.com\ngeospatialsmart.com\ngeovisearth.com\ngepcc.com\ngephb.com\ngepresearch.com\ngepubbs.com\ngeren-jianli.com\ngerenjianli.com\ngerenshuoming.com\ngerhard-china.com\ngermmc.com\ngeruihuate.com\ngeruishuiwu.com\ngeruisi-bio.com\ngerzz.com\ngesanghua.org\ngescosteel.com\ngescs.com\ngesedna.com\ngesedna.net\ngesep.com\ngeshitong.net\ngeshui.com\ngeshui100.com\ngeshui99.com\ngeshuiba.com\ngestagpu.com\ngesuo.com\ngeswl.com\nget-shell.com\nget.vip\nget233.com\ngetbs.com\ngetcai.com\ngetconnectplus.com\ngetddhospi.com\ngetehu.com\ngetelighting.com\ngetgetai.com\ngethover.com\ngetiis.com\ngetiot.tech\ngetkwai.com\ngetmarkman.com\ngetpm.com\ngetquicker.net\ngetrebuild.com\ngetsays.com\ngetsetgadget.com\ngetsurfboard.com\ngettopacoustic.com\ngetu.fun\ngetui.vip\ngetvidi.co\ngewala.com\ngewara.com\ngewei-wh.com\ngewei.com\ngeweng.com\ngewu.vc\ngewuer.com\ngewuzhixiang.com\ngexiao.me\ngexiaocloud.com\ngexinda.com\ngexing.com\ngexing.me\ngexings.com\ngexingshuo.com\ngexingzipai.com\ngexiong.com\ngexiuyixibai.org\ngeyawatch.com\ngeyevalve.com\ngeyifudi.com\ngeyo.com\ngeyoukj.com\ngezida.com\ngezila.com\ngezipu8.net\ngezivisa.com\ngf-cloud.com\ngf-funds.com\ngf-metals.com\ngf-nj.com\ngf.app\ngf.cc\ngf139.com\ngf1579.com\ngf7979cn.com\ngfan.com\ngfanstore.com\ngfbk.net\ngfbzb.com\ngfbzb.net\ngfcdn.xyz\ngfcity.com\ngfcname.com\ngfcvisa.com\ngfd178.com\ngfdj99665.com\ngfdns.net\ngfdsa.net\ngfdwsx.com\ngfedu.com\ngfedu.net\ngffirm.com\ngffwq.com\ngfglb.com\ngfh82.com\ngfhealthcare.com\ngfjeah-rhjeb6.com\ngfjl.org\ngflad.com\ngflz.com\ngfmpv.com\ngfnormal00ab.com\ngfnormal00ac.com\ngfnormal00ad.com\ngfnormal00ae.com\ngfnormal00af.com\ngfnormal00ag.com\ngfnormal00ai.com\ngfnormal00al.com\ngfnormal00am.com\ngfnormal00ao.com\ngfnormal00ap.com\ngfnormal00aq.com\ngfnormal00ar.com\ngfnormal00as.com\ngfnormal00at.com\ngfnormal01aa.com\ngfnormal01ab.com\ngfnormal01ac.com\ngfnormal01ad.com\ngfnormal01af.com\ngfnormal01ag.com\ngfnormal01ah.com\ngfnormal01ak.com\ngfnormal01al.com\ngfnormal01am.com\ngfnormal01an.com\ngfnormal01ao.com\ngfnormal01ap.com\ngfnormal01aq.com\ngfnormal01ar.com\ngfnormal01as.com\ngfnormal01at.com\ngfnormal02aa.com\ngfnormal02ab.com\ngfnormal02ac.com\ngfnormal02ad.com\ngfnormal02ae.com\ngfnormal02af.com\ngfnormal02ag.com\ngfnormal02ah.com\ngfnormal02ai.com\ngfnormal02aj.com\ngfnormal02ak.com\ngfnormal02al.com\ngfnormal02am.com\ngfnormal02an.com\ngfnormal02ao.com\ngfnormal02ap.com\ngfnormal02aq.com\ngfnormal02ar.com\ngfnormal02as.com\ngfnormal02at.com\ngfnormal03aa.com\ngfnormal03ab.com\ngfnormal03ac.com\ngfnormal03ad.com\ngfnormal03ae.com\ngfnormal03af.com\ngfnormal03ag.com\ngfnormal03ah.com\ngfnormal03ai.com\ngfnormal03aj.com\ngfnormal03ak.com\ngfnormal03al.com\ngfnormal03am.com\ngfnormal03an.com\ngfnormal03ao.com\ngfnormal03ap.com\ngfnormal03aq.com\ngfnormal03ar.com\ngfnormal03as.com\ngfnormal03at.com\ngfnormal04aa.com\ngfnormal04ab.com\ngfnormal04ac.com\ngfnormal04ad.com\ngfnormal04ae.com\ngfnormal04af.com\ngfnormal04ag.com\ngfnormal04ah.com\ngfnormal04ai.com\ngfnormal04aj.com\ngfnormal04ak.com\ngfnormal04al.com\ngfnormal04am.com\ngfnormal04an.com\ngfnormal04ao.com\ngfnormal04ap.com\ngfnormal04aq.com\ngfnormal04ar.com\ngfnormal04as.com\ngfnormal04at.com\ngfnormal05aa.com\ngfnormal05ab.com\ngfnormal05ac.com\ngfnormal05ad.com\ngfnormal05ae.com\ngfnormal05af.com\ngfnormal05ag.com\ngfnormal05ah.com\ngfnormal05ai.com\ngfnormal05aj.com\ngfnormal05ak.com\ngfnormal05al.com\ngfnormal05am.com\ngfnormal05an.com\ngfnormal05ao.com\ngfnormal05ap.com\ngfnormal05aq.com\ngfnormal05ar.com\ngfnormal05as.com\ngfnormal05at.com\ngfnormal06aa.com\ngfnormal06ab.com\ngfnormal06ac.com\ngfnormal06ad.com\ngfnormal06ae.com\ngfnormal06af.com\ngfnormal06ag.com\ngfnormal06ah.com\ngfnormal06ai.com\ngfnormal06aj.com\ngfnormal06ak.com\ngfnormal06al.com\ngfnormal06am.com\ngfnormal06an.com\ngfnormal06ao.com\ngfnormal06ap.com\ngfnormal06aq.com\ngfnormal06ar.com\ngfnormal06as.com\ngfnormal06at.com\ngfnormal07aa.com\ngfnormal07ab.com\ngfnormal07ac.com\ngfnormal07ad.com\ngfnormal07af.com\ngfnormal07ag.com\ngfnormal07ah.com\ngfnormal07ai.com\ngfnormal07aj.com\ngfnormal07ak.com\ngfnormal07al.com\ngfnormal07am.com\ngfnormal07an.com\ngfnormal07ao.com\ngfnormal07ap.com\ngfnormal07aq.com\ngfnormal07ar.com\ngfnormal07as.com\ngfnormal07at.com\ngfnormal08aa.com\ngfnormal08ab.com\ngfnormal08ac.com\ngfnormal08ad.com\ngfnormal08ae.com\ngfnormal08af.com\ngfnormal08ag.com\ngfnormal08ah.com\ngfnormal08ai.com\ngfnormal08aj.com\ngfnormal08ak.com\ngfnormal08al.com\ngfnormal08am.com\ngfnormal08an.com\ngfnormal08ao.com\ngfnormal08ap.com\ngfnormal08aq.com\ngfnormal08ar.com\ngfnormal08as.com\ngfnormal08at.com\ngfnormal09aa.com\ngfnormal09ab.com\ngfnormal09ac.com\ngfnormal09ad.com\ngfnormal09ae.com\ngfnormal09af.com\ngfnormal09ag.com\ngfnormal09ah.com\ngfnormal09ai.com\ngfnormal09aj.com\ngfnormal09ak.com\ngfnormal09al.com\ngfnormal09am.com\ngfnormal09an.com\ngfnormal09ao.com\ngfnormal09ap.com\ngfnormal09aq.com\ngfnormal09ar.com\ngfnormal09as.com\ngfnormal09at.com\ngfnyzb.com\ngforward.org\ngfoxsoft.net\ngfren.org\ngfrtrttweet.com\ngfslgy.com\ngfsz.net\ngftiec.com\ngfttek.com\ngftuan.com\ngfun.me\ngfund.com\ngfvip00aa.com\ngfvip00ab.com\ngfvip00ac.com\ngfvip00ad.com\ngfvip00ae.com\ngfvip00af.com\ngfvip00ag.com\ngfvip00ah.com\ngfvip00ai.com\ngfvip00aj.com\ngfvip00ak.com\ngfvip00al.com\ngfvip00am.com\ngfvip00an.com\ngfvip00ao.com\ngfvip00ap.com\ngfvip00aq.com\ngfvip00ar.com\ngfvip00as.com\ngfvip00at.com\ngfvip01aa.com\ngfvip01ab.com\ngfvip01ac.com\ngfvip01ad.com\ngfvip01ae.com\ngfvip01af.com\ngfvip01ag.com\ngfvip01ah.com\ngfvip01ak.com\ngfvip01al.com\ngfvip01am.com\ngfvip01an.com\ngfvip01ao.com\ngfvip01ap.com\ngfvip01aq.com\ngfvip01ar.com\ngfvip01as.com\ngfvip01at.com\ngfvip02aa.com\ngfvip02ab.com\ngfvip02ac.com\ngfvip02ad.com\ngfvip02ae.com\ngfvip02af.com\ngfvip02ag.com\ngfvip02ah.com\ngfvip02ai.com\ngfvip02aj.com\ngfvip02ak.com\ngfvip02al.com\ngfvip02am.com\ngfvip02an.com\ngfvip02ao.com\ngfvip02ap.com\ngfvip02aq.com\ngfvip02ar.com\ngfvip02as.com\ngfvip02at.com\ngfvip03aa.com\ngfvip03ab.com\ngfvip03ac.com\ngfvip03ad.com\ngfvip03ae.com\ngfvip03af.com\ngfvip03ag.com\ngfvip03ah.com\ngfvip03ai.com\ngfvip03aj.com\ngfvip03ak.com\ngfvip03al.com\ngfvip03am.com\ngfvip03an.com\ngfvip03ao.com\ngfvip03ap.com\ngfvip03aq.com\ngfvip03ar.com\ngfvip03as.com\ngfvip03at.com\ngfvip04aa.com\ngfvip04ab.com\ngfvip04ac.com\ngfvip04ad.com\ngfvip04ae.com\ngfvip04af.com\ngfvip04ag.com\ngfvip04ah.com\ngfvip04ai.com\ngfvip04aj.com\ngfvip04ak.com\ngfvip04al.com\ngfvip04am.com\ngfvip04an.com\ngfvip04ao.com\ngfvip04ap.com\ngfvip04aq.com\ngfvip04ar.com\ngfvip04as.com\ngfvip04at.com\ngfvip05aa.com\ngfvip05ab.com\ngfvip05ac.com\ngfvip05ad.com\ngfvip05ae.com\ngfvip05af.com\ngfvip05ag.com\ngfvip05ah.com\ngfvip05ai.com\ngfvip05aj.com\ngfvip05ak.com\ngfvip05al.com\ngfvip05am.com\ngfvip05an.com\ngfvip05ao.com\ngfvip05ap.com\ngfvip05aq.com\ngfvip05ar.com\ngfvip05as.com\ngfvip05at.com\ngfvip06aa.com\ngfvip06ac.com\ngfvip06ad.com\ngfvip06ae.com\ngfvip06ag.com\ngfvip06ah.com\ngfvip06ai.com\ngfvip06aj.com\ngfvip06ak.com\ngfvip06am.com\ngfvip06an.com\ngfvip06ao.com\ngfvip06ap.com\ngfvip06aq.com\ngfvip06ar.com\ngfvip06as.com\ngfvip06at.com\ngfvip07aa.com\ngfvip07ab.com\ngfvip07ac.com\ngfvip07ad.com\ngfvip07ae.com\ngfvip07af.com\ngfvip07ag.com\ngfvip07ah.com\ngfvip07ai.com\ngfvip07aj.com\ngfvip07ak.com\ngfvip07al.com\ngfvip07am.com\ngfvip07an.com\ngfvip07ao.com\ngfvip07ap.com\ngfvip07aq.com\ngfvip07ar.com\ngfvip07as.com\ngfvip07at.com\ngfvip08aa.com\ngfvip08ab.com\ngfvip08ac.com\ngfvip08ad.com\ngfvip08ae.com\ngfvip08ag.com\ngfvip08ah.com\ngfvip08ai.com\ngfvip08aj.com\ngfvip08ak.com\ngfvip08al.com\ngfvip08am.com\ngfvip08an.com\ngfvip08ao.com\ngfvip08ap.com\ngfvip08aq.com\ngfvip08ar.com\ngfvip08at.com\ngfxaa.com\ngfxcamp.com\ngfxtr1.com\ngfxy.com\ngfzihua.com\ngfzj.us\ngg-lb.com\ngg-led.com\ngg.com\ngg122.net\ngg1994.com\nggac.net\nggaiyan.com\nggas.com\nggbamy.com\nggbanfu.com\nggbondtech.com\nggbygx.com\nggcimbar.com\nggcj.com\nggcx.com\nggcykf.com\nggdata.com\nggecc.com\nggecgc.com\nggemo.com\nggeye.com\nggfsfy.com\nggfswy.com\nggg42.com\nggg868.com\ngggcn.com\ngggfyl.com\ngggg5.com\nggghny.com\ngggjs.com\ngggqa.com\ngggrp.com\ngggua.com\ngggwg.com\ngggzhi.com\ngggzpw.com\ngghb.cloud\ngghcgg.com\ngghosp.net\ngghs.info\ngghualong.com\ngghx120.com\ngghy.org\ngginto.com\nggjcpm.com\nggjpay.com\nggjrw.com\nggjstz.com\nggjszp.com\nggjt.com\nggjtfw.com\nggksw.com\nggkuai.com\nggl.com\ngglenglish.com\ngglkw.net\ngglmg.com\nggmlechi.com\nggmm55.com\nggmsw.com\nggnqmy.com\nggo.net\nggoplay.com\nggowan.com\nggqule.com\nggqunshanmuye.com\nggqx.com\nggrcw.com\nggren.net\nggrsmy.com\nggrsrc.com\nggsfcw.com\nggshfmy.com\nggshmy.com\nggslxs.com\nggsq.cc\nggtime.com\nggtjx.com\nggtrj.com\nggttvc.com\nggunk1tn.com\nggwan.com\nggwan.net\nggweijie.com\nggwlxx.com\nggwxmuye.com\nggwzpf120.com\nggxarq.com\nggxdsmzx.com\nggxhx.com\nggxiaolinmy.com\nggxinzhitaimy.com\nggxjhk.com\nggxsjz.com\nggxue.com\nggxx.net\nggy.net\nggy775.com\nggyouyu.com\nggysc.com\nggysfw.com\nggytc.com\nggyx666.com\nggyy100.com\nggzbbj.com\nggzc.net\nggzgc.com\nggzha.com\nggzhaf.com\nggzs.me\nggzuhao.com\nggzx.net\ngh-fm.com\ngh-reagent.com\ngh-shipping.com\ngh8s.com\nghatg.com\nghboke.com\nghbxrj.com\nghc168.com\nghcec.com\nghcis.com\nghcxzb.com\nghddi.org\nghdoor.com\nghed119.com\nghedu.com\nghfdc.org\nghgglobal.com\nghglzx.com\nghgy.com\nghhyjc.com\nghibliwiki.org\nghitcsh.com\nghitest.com\nghjbh123.com\nghlawyer.net\nghlearning.com\nghlshb.com\nghlykj.com\nghmba.com\nghmcchina.com\nghmd448.com\nghmisnet.com\ngho5.com\nghoffice.com\nghost-him.com\nghost008.com\nghost11.com\nghost32.net\nghost64.com\nghostchu.com\nghostoact.com\nghostsf.com\nghostwin7win8.com\nghostxp2.com\nghostxpsp3.net\nghostxx.com\nghoxz.com\nghparking.com\nghpepower.com\nghproxy.cc\nghpy3333.com\nghpym.com\nghrepower.com\nghrlib.com\nghs.net\nghschool.com\nghsd16888.com\nghsense.com\nghsmc.com\nghsmpwalmart.com\nght-china.com\nght120.com\nghtech.com\nghtianshancn.com\nghtt.net\nghturbine.com\nghtzgs.com\nghwgame.com\nghxi.com\nghxsw.com\nghyg.com\nghyhjsw.com\nghyl888.com\nghzhushou.com\nghzs.com\nghzs666.com\ngiabbs.com\ngiaimg.com\ngialen.com\ngiant-china.com\ngiant-cycling-lifestyle.com\ngiantaircompressor.com\ngiantcdn.com\ngiantet.com\ngiantgd.com\ngiantkone.com\ngiao.me\ngibcp.com\ngicasa.com\ngiccoo.com\ngicfg.com\ngicp.net\ngidepay.com\ngiecds.com\ngiexya.com\ngif5.net\ngiffox.com\ngifhome.com\ngifshow.com\ngiftres.com\ngiftsbeijing.com\ngifu-pr.com\ngiga-da.com\ngiga-science.com\ngigaget.com\ngigbl.com\ngigpayroll.com\ngihg.com\ngihiji.com\ngiho.com\ngiihg.com\ngiikin.com\ngiiktop.com\ngiiso.com\ngijsq.com\ngildata.com\ngilieye.com\ngiltbridge.com\ngiltworld.com\ngimcyun.com\ngimhoy.com\ngimmgimm.com\ngimoo.net\ngimsh.com\ngin-vue-admin.com\nginde.com\nginfon.com\ngingerbreadstudio.cc\ngingyan.com\nginlong.com\nginshio.org\nginwa.com\ngio07231rp.com\ngioccc.com\ngiomeru.com\ngionee.com\ngionee.net\ngioneemobile.net\ngioner.com\ngiordano.com\ngiorgiomorandihotels.com\ngiraff3.com\ngirdear.net\ngirl13.com\ngirls-frontline.com\ngirlsfighters.com\ngirlw.net\ngiscafer.com\ngiserdqy.com\ngispark.org\ngissaas.com\ngissinggroup.com\ngissky.net\ngistc.com\ngit-repo.info\ngit-star.com\ngitcafe.ink\ngitclone.com\ngitcode.com\ngitcode.host\ngitcode.net\ngitee.com\ngitee.io\ngithang.com\ngithub-zh.com\ngithubim.com\ngithubshare.com\ngitinn.com\ngitiu.com\ngitlib.com\ngitmirror.com\ngitnoteapp.com\ngitom.com\ngitpp.com\ngitsea.com\ngitshell.com\ngitv.tv\ngityuan.com\ngityx.com\ngiveda.com\ngiyu8.com\ngizaworks.com\ngizwits.com\ngj62.com\ngjbaek.ren\ngjcars.com\ngjceshi9.com\ngjcha.com\ngjcoil.com\ngjcweb.com\ngjcxgs.com\ngjdk100.com\ngjds.vip\ngjdwzp.com\ngjfmxd.com\ngjgzpw.com\ngjhgroup.com\ngjhl.com\ngjj.cc\ngjjcxw.com\ngjjiaxiao.com\ngjjnhb.com\ngjjsbz.com\ngjkdwl.com\ngjl15.com\ngjlease.com\ngjmbwxpt.com\ngjmbwxzx.com\ngjmrk.com\ngjnlyd.com\ngjpdh.com\ngjrwls.com\ngjsj.com\ngjsun.com\ngjsy.org\ngjtmu.com\ngjtool.com\ngjtt.net\ngjw.com\ngjw123.com\ngjwca.org\ngjwl123.com\ngjwlyy.com\ngjxh.org\ngjxx.com\ngjxzq.com\ngjydz.com\ngjyfish.com\ngjyuxiang.com\ngjyys.com\ngjzfw.com\ngjzy.com\ngk-cn.com\ngk-net.com\ngk-z.com\ngk.ink\ngk.link\ngk100.com\ngk114.com\ngk99.com\ngkcyc.com\ngkczgs.com\ngkczp.com\ngkfb.com\ngkgzj.com\ngkhxtc.com\ngki88.com\ngkjzy.com\ngkket.com\ngkkxd.com\ngklx.net\ngkmao.com\ngkmems.com\ngkmhq.com\ngkmotor.com\ngkong.com\ngkoo.net\ngkoudai.com\ngkqcw.com\ngkqxfsl.xyz\ngkrpgtee.com\ngkshanghai.com\ngkshuju.com\ngktianshanjd.com\ngkwo.net\ngkxd.com\ngkxs.com\ngkxx.com\ngkyly.com\ngkzhan.com\ngkzj.com\ngkzj.net\ngkzpfw.com\ngkzppt.com\ngkzq.mobi\ngkzqxc.com\ngkzxw.com\ngkzy.com\ngkzy100.com\ngkzyb.com\ngkzzd.com\ngkzzy.com\ngl-data.com\ngl-mes.com\ngl-qf.com\ngl-uav.com\ngl-zj.com\ngl102.com\ngl114.net\ngl170.com\ngl17u.com\ngl18.com\ngl258.com\ngl2mt.com\nglab.online\nglacierluo.com\ngladcc.com\ngladdigit.com\nglafamily.com\nglamever.com\nglamourred.com\nglamourtrains.com\nglanimaltrade.com\nglanu.com\nglaproject.com\nglasercom.com\nglass-ciac.com\nglassbottleproducer.com\nglasseasy.com\nglassmicro.com\nglavo.site\nglaway.com\nglawyer.net\nglb3.com\nglb4.com\nglb6.com\nglbaishen.com\nglbdns.com\nglblkq.com\nglby118.com\nglbyhotel.com\nglbyjdjt.com\nglcablesy.com\nglcanyin.net\nglcape.com\nglcct.com\nglcht.com\nglchunchao.com\nglchuyun.com\nglcits.com\nglclcsy.com\nglcszy.com\ngldaewoo.com\ngldjc.com\ngleasy.com\nglecan.com\nglelec.com\ngleyy.com\nglface.com\nglfangzhen.com\nglfdfcyy.com\nglflyy.com\nglfpii.com\nglfund.com\nglfyjg.com\nglgangyu.com\nglgcsj.com\nglgda.com\nglgdst.com\nglgeneng.com\nglggh.com\nglgh.org\nglghy.com\nglgnmt.com\nglgsoft.com\nglgst.com\nglgtzc.com\nglgyzn.com\nglgzlq.com\nglhcjs.com\nglhckj.com\nglhclv-kool.com\nglhdq.com\nglhfmy.com\nglhfsy.com\nglhmmr.com\nglhnkj.com\nglhospital.com\nglhrzx.com\nglhsylqx.com\nglhtpcb.com\nglhuade.com\nglhuashi.com\nglhuayue.com\nglhycy.com\nglhygjlxs.com\nglhzhotel.com\nglhzzx.com\nglicon.design\nglifegame.com\nglinfo.com\nglinkmedia.com\nglinksure.com\ngljcss.com\ngljdjt.com\ngljiatianxia.com\ngljiayu.com\ngljieli.com\ngljinbao.com\ngljinfeng.com\ngljinhui.com\ngljinshan.com\ngljkfhq.com\ngljlw.com\ngljshy.com\ngljshz.com\ngljsjl.com\ngljtkg.com\ngljtxjy.com\ngljygd.com\ngljykj.com\ngljyrj.com\ngljzgs.com\nglk7.com\nglkgjt.com\nglkths.com\ngllcit.com\ngllfyy.com\nglljsh.com\nglljy.com\ngllshan.com\ngllstz.com\nglludiyan.com\ngllue.com\ngllue.me\ngllue.net\ngllxsb.com\ngllycs.com\nglmama.com\nglmapper.com\nglmayo.com\nglmbc.com\nglmingke.com\nglmmodels.com\nglncn.com\nglnewstar.com\nglo-slotsimulator.com\ngloamingtechnology.com\nglobal-dba.com\nglobal-download.acer.com\nglobal-harbor.com\nglobal-idc.net\nglobal-jf.com\nglobal-ks-cdn.com\nglobal-leader.com\nglobal-otc.com\nglobal-scsl.com\nglobal-tio2.com\nglobal56.com\nglobalaccentchinese.com\nglobalauthorid.com\nglobalbaike.com\nglobalbuy.cc\nglobalchangan.com\nglobalcho.com\nglobalesim.shop\nglobaletrust.com\nglobalgeopark.org\nglobalhardwares.com\nglobalimporter.net\nglobalizex.com\nglobalmil.com\nglobalnevs.com\nglobalpingbao.com\nglobalscanner.com\nglobalsigncdn.com\nglobalslb.net\nglobalso.com\nglobalso.site\nglobalsources.com\nglobalsourcingbiz.com\nglobalstech.com\nglobalston.com\nglobaltenpay.com\nglobaltradecoo.com\nglobalvisa888.com\nglobalx-nest.com\nglobebill.com\nglobecancer.com\nglobeedu.com\nglobrand.com\nglobusevents.com\nglodon.com\nglofang.com\nglofiy.work\ngloraledu.com\ngloriahotels.com\ngloriamedia.com\nglorygarment.com\nglorysoft.com\ngloryview.com\nglorze.com\nglosellers.com\nglosku.com\nglosspp.com\nglowapp.fun\nglowapp.vip\nglowoman.org\nglpenhui.com\nglplyf.com\nglqh.com\nglqshb.com\nglquanji.com\nglrcjob.com\nglrcw.com\nglreading.com\nglredu.com\nglriverside.com\nglrmyy.com\nglruixin.com\nglsanhua.com\nglsdhnt.com\nglseed.com\nglsgmr.com\nglshimg.com\nglsjf.com\nglsmy024.com\nglssgolf.com\nglsstm.com\nglsxdlkj.com\nglsxr.com\nglsyjd.com\nglsyjgs.com\nglsytzjt.com\nglt365.com\ngltop.com\ngltsg.com\ngltvs.com\ngltx.tech\ngltzjt.com\ngluebon.com\nglumes.com\nglvroc.com\nglvs.com\nglwangcheng.com\nglwuhong.com\nglwxw.net\nglwyhd.com\nglxcc.net\nglxcjt.com\nglxd.com\nglxhzs.com\nglxiaoyaohu.com\nglxinhu.com\nglxkbz.com\nglxsyx.vip\nglxwdb.com\nglxxjx.com\nglxyjx.com\nglxyrn.com\nglyhjc.com\nglyhy.com\nglyjk.com\nglylgg.com\nglyltl.com\nglyndwrsway.com\nglyphara.com\nglyslydjq.com\nglyummy.com\nglyxc.com\nglyxjtgc.com\nglz8.com\nglzcqy.com\nglzdgx.com\nglzeasun.com\nglzfst.com\nglzh-szzx.site\nglzhcyy.com\nglzhealth.com\nglzip.com\nglzizhu.com\nglzj88.com\nglzmn.com\nglzrflx.com\nglzsjc.com\nglzthz.com\nglztj.com\nglzx.net\nglzyjt.com\nglzzjy.com\ngm-scm.com\ngm016.com\ngm193.com\ngm3.win\ngm35.com\ngm3studio.com\ngm825.com\ngm825.net\ngm86.com\ngm88.com\ngm99game.net\ngmacsaic.com\ngmacsaic.net\ngmanhua.com\ngmatg.com\ngmaxbiopharm.com\ngmbbs.net\ngmbuluo.com\ngmcc.net\ngmcinnov.com\ngmcmonline.com\ngmdeng.com\ngmdt9b.com\ngmdun.com\ngmecn.com\ngmed.cc\ngmedata.com\ngmeditech.com\ngmedtech.com\ngmem.cc\ngmeri.com\ngmerit.com\ngmertc.com\ngmfc.cc\ngmfintl.com\ngmg.so\ngmgc.info\ngmgitc.com\ngmhub.com\ngmhuijin.com\ngmhysj.com\ngmi1001.com\ngmilesquan.com\ngmiot.net\ngmjk.com\ngmm01.com\ngmmicro.com\ngmmsj.com\ngmmtcc.com\ngmoe.cc\ngmoj.net\ngmonline-all.com\ngmpbj.com\ngmqd.com\ngmquickapp.com\ngmrmyy.com\ngmsec.net\ngmsolid.com\ngmssl.org\ngmsyun.com\ngmt-china.org\ngmt-cn.com\ngmtacoa.com\ngmtv.cc\ngmtzy.com\ngmugmu.com\ngmw.com\ngmwiki.com\ngmxmym.ren\ngmya.net\ngmyihua.com\ngmylj.com\ngmz88.com\ngmzhushou.com\ngmzi.com\ngmzm.org\ngmzp.net\ngmzx.com\ngn168.com\ngn301.xyz\ngnber.com\ngncebest88.com\ngndaily.com\ngndown.com\ngneec.com\ngneec3.com\ngneec4.com\ngneec5.com\ngneec7.com\ngneeccloud.com\ngneedu.com\ngnehr.com\ngnete.com\ngnetis.com\ngnetpg.com\ngng92.com\ngngnk.com\ngnhome.com\ngnhpc.com\ngnice-it.com\ngnict.com\ngninstruments.com\ngnitif.com\ngnlearn.com\ngnnzfw.com\ngnrcbank.com\ngnrnye.com\ngnrtv.com\ngnsschips.center\ngnssinfo.com\ngnssopenlab.org\ngnt8.com\ngnvip.net\ngnway.cc\ngnway.com\ngnway.org\ngnzad.com\ngnzrk.com\ngo-admin.com\ngo-behind.one\ngo-gddq.com\ngo-goal.com\ngo.cc\ngo007.com\ngo108.com\ngo1314.com\ngo2aaron.com\ngo2eu.com\ngo2map.com\ngo2yd.com\ngo300.com\ngo5kvsiay5wx.com\ngoalchina.net\ngoalhi.com\ngoalmapapp.com\ngoalonez.site\ngoapk.com\ngobanma.com\ngobasearcher.com\ngobelike.net\ngobivc.com\ngobroadhealthcare-sh.com\ngobroadhealthcare.com\ngobyd.com\ngocarjourney.com\ngocashback.com\ngocchina.com\ngocdn.cc\ngocea.net\ngoceshi.com\ngoclee.com\ngocn.vip\ngodaily.org\ngodasai.com\ngodbiao.com\ngodblessrail.com\ngodblessyuan.com\ngoddelivery.com\ngoddessxzns.com\ngodele.com\ngodgy.xyz\ngodic.net\ngodida.com\ngodo.pub\ngodoor.com\ngodotcn.com\ngodsendcn.com\ngodsheepteam.com\ngodsignal.com\ngodweiyang.com\ngodwolf.com\ngoeasy.io\ngoelia1995.com\ngoepe.com\ngoertek.com\ngoetheslz.com\ngofarqzyy.com\ngoforandroid.com\ngoframe.org\ngofreeplay.com\ngofrp.org\ngog-cdn-fastly.gog.com\ngog-cdn.akamaized.net\ngogalaxy.gog-statics.com\ngogbuy.com\ngoglew5sn.com\ngogo.so\ngogo123.com\ngogo123.net\ngogoauc.com\ngogocn.com\ngogofly.com\ngogokid.com\ngogolinux.com\ngogooffer.com\ngogoqq.com\ngogoup.com\ngoherbalfood.com\ngohighfund.com\ngoho.co\ngohoedu.com\ngohomesafe.org\ngohomesh.com\ngohong.com\ngoing-link.com\ngojiaju.com\ngojira.net\ngokaigai.com\ngoke.com\ngokemicro.com\ngokols.com\ngokuai.com\ngolahsg.com\ngolang8.com\ngolangapi.com\ngolanger.com\ngolangroadmap.com\ngolangw.com\ngolaravel.com\ngold-dragon-castings.com\ngold-seagull.com\ngold-v.com\ngold58.com\ngold678.com\ngoldav.net\ngolday666.com\ngolday999.com\ngolday9999.com\ngoldbj.com\ngoldbox.vip\ngolden-bamboo.com\ngolden-book.com\ngolden-infor.com\ngolden-soft.com\ngolden-spri.com\ngolden3t.net\ngoldenad.net\ngoldenbeechina.com\ngoldenear.club\ngoldenexpogroup.com\ngoldengoosee.com\ngoldengreengolf.com\ngoldenhighway-chem.com\ngoldenholiday.com\ngoldenhome.cc\ngoldening.com\ngoldenken.com\ngoldenladies.com\ngoldenname.com\ngoldennumis.store\ngoldenseaair.com\ngoldentec.com\ngoldenthroat.com\ngoldentom.com\ngoldfoil.com\ngoldgov.com\ngoldgrid.com\ngoldhoe.com\ngoldksoft.com\ngoldlion-china.com\ngoldlion-info.com\ngoldmadon.com\ngoldmantis.com\ngoldmarkrealestate.com\ngoldmt.net\ngoldstone-group.com\ngoldstone-investment.com\ngoldstonepack.com\ngoldsunchn.com\ngoldsunmachinery.com\ngoldsupplier.com\ngoldvole.com\ngoldwaterhk.com\ngoldwind.com\ngolenpower.com\ngolfvv.com\ngolink.com\ngolinkapi.com\ngolinkcn.com\ngolinkgroup.com\ngolinksworld.com\ngolive-tv.com\ngolivetv.tv\ngoluckcity.com\ngoluckyvip.com\ngolue.com\ngomaeps.com\ngomanlift.com\ngomeart.com\ngomecloud.com\ngomegj.com\ngomeholdings.com\ngomehome.com\ngomeplus.com\ngomo.com\ngomocdn.com\ngomvyxvm.com\ngona-semi.com\ngonever.com\ngong-xin.com\ngong123.com\ngongao.net\ngongbaike.com\ngongbi.net\ngongbiaoku.com\ngongboshi.com\ngongcdn.com\ngongchang.com\ngongcheng168.com\ngongchengbing.com\ngongchengjn.com\ngongchou.com\ngongchu.com\ngongfubb.com\ngongfudou.com\ngongji58.com\ngongjiao.com\ngongjiao160.com\ngongjiaomi.com\ngongjiyun.com\ngongju.com\ngongju5.com\ngongjux.com\ngongkaohub.com\ngongkaoleida.com\ngongkaowo.com\ngongkong.com\ngongkong001.com\ngongkongbpo.com\ngongkongedu.com\ngongkongjia.com\ngongkongke.com\ngongkongmall.com\ngongkongsaas.com\ngonglchuangl.net\ngonglf.com\ngonglve.net\ngongmo1688.com\ngongmutang.com\ngongnou.com\ngongpin.net\ngongpingjia.com\ngongqiu.biz\ngongshang120.com\ngongshiku.com\ngongsibao.com\ngongsijiaoyi.com\ngongsizhang.com\ngongsizhijia.com\ngongwuxing.com\ngongxiangcj.com\ngongxiao8.com\ngongxiaodaji.com\ngongxuanwang.com\ngongxueyun.com\ngongye360.com\ngongyefengshan.com\ngongyeku.com\ngongyelian.com\ngongyeyun.com\ngongyeyunwang.com\ngongyi.la\ngongyi.net\ngongyi.xin\ngongyichuangyi.net\ngongyicn.org\ngongyidaily.com\ngongying405.com\ngongyingshang.biz\ngongyingshi.com\ngongyipuhui.com\ngongyishibao.com\ngongyou.com\ngongyouhui.com\ngongyoumishu.com\ngongzhao.net\ngongzhao.work\ngongzhou.com\ngongzhou.net\ngongzhun.com\ngongzicp.com\ngongzufudinzu.com\ngongzuobaogao.xyz\ngongzuoshouji.net\ngongzuoyun.org\ngonsun.com\ngonvvama.net\ngonxt.com\ngonyn.com\ngoo17.com\ngooagoo.com\ngooann.com\ngoobai.com\ngoobye.net\ngood-display.com\ngood-expo.com\ngood-import.com\ngood.cc\ngood1230.com\ngood321.net\ngood519.com\ngoodacc.net\ngoodally.hk\ngoodao.net\ngoodapk.com\ngoodbaby.com\ngoodbabygroup.com\ngoodbaike.com\ngoodcang.com\ngoodcloud.xyz\ngooddr.com\ngooddu.com\ngoode-china.com\ngoodealwigs.com\ngoodeeis.com\ngoodesocket.com\ngoodfamily.cc\ngoodfamily.com\ngoodgongshi.com\ngoodgupiao.com\ngoodid.com\ngoodix.com\ngoodjd.com\ngoodjili.com\ngoodjob100.com\ngoodk88.com\ngoodkejian.com\ngoodlcm.com\ngoodlift.net\ngoodluckcalendar.com\ngoodmorening.com\ngoodnic.net\ngoododo.com\ngoodonecn.com\ngoodprogrammer.org\ngoodqq.net\ngoodrain.com\ngoodread.com\ngoodschool.world\ngoodsid.com\ngoodsku.com\ngoodstudydayup.com\ngoodtea.cc\ngoodtech.live\ngoodtp.com\ngoodwe.com\ngoodwillcis.com\ngoodwillresource.com\ngoodwyee.com\ngoodyoungtea.com\ngoofish.com\ngooge.ink\ngoogoc.com\ngoogol-power.com\ngoogolpark.com\ngoogvv.com\ngoolemall.com\ngoolink.org\ngoome.net\ngoomj.com\ngoonemei.com\ngooo8.com\ngoooc.net\ngooogua.com\ngooooal.com\ngooood.hk\ngoootech.com\ngoootu.com\ngoopush2025.com\ngooray.com\ngoosai.com\ngoosail.com\ngooseeker.com\ngootho.com\ngootoai.com\ngoowine.com\ngooxi.com\ngooyo.com\ngoozp.com\ngopedu.com\ngopeed.com\ngoplaycn.com\ngopos.hk\ngoproxy.cc\ngoproxy.io\ngorebuy.com\ngoregxa.com\ngorichox.com\ngorouter.info\ngorse.com\ngortune.com\ngosailgis.com\ngoselling.com\ngoshijia.com\ngoshopjp.com\ngosinoic.com\ngoskygroup.com\ngosonly.com\ngospelwin.com\ngost-pct.com\ngosun.com\ngosun.ltd\ngosuncdn.com\ngosuncdn.net\ngosuncn.com\ngosunm.com\ngot001.com\ngot002.com\ngotechcn.com\ngotechina.com\ngoten.com\ngothe3.com\ngoto-game.com\ngoto-game.mobi\ngoto-game.net\ngoto-game.org\ngotobath.com\ngotocdn.com\ngotocoding.com\ngotodn.com\ngotofreight.com\ngotohui.com\ngotohz.com\ngotohzrb.com\ngotoip.net\ngotoip1.com\ngotoip11.com\ngotoip2.com\ngotoip3.com\ngotoip4.com\ngotoip88.com\ngotokeep.com\ngotolink.net\ngotonav.com\ngotonets.com\ngotopsoft.com\ngotostudyroom.com\ngotoubi.com\ngotozhuan.com\ngotran.com\ngotvg.com\ngou.com\ngoubrand.com\ngouchezj.com\ngoufang.com\ngoufw.com\ngougoujp.com\ngouguoyin.com\ngouhai.com\ngouhao.com\ngouhaowang.com\ngouhuasuan.shop\ngoujianwu.com\ngoukk.com\ngoukuai.com\ngoulegu.com\ngoulew.com\ngoulong.com\ngoumee.com\ngoumin.com\ngoupautomation.com\ngoupsec.com\ngoupuzi.com\ngourmet114.com\ngoushh.com\ngouso.com\ngousu.com\ngoutanzi.com\ngouwanmei.com\ngouwo.com\ngouwudang.com\ngouwuke.com\ngouwule.com\ngouwuyu.com\ngouyoukeji.com\ngov-static.tech\ngovagroup.com\ngovfz.com\ngovisionox.net\ngovjc.com\ngovmade.com\ngovqcloud.com\ngovuln.com\ngovwq.com\ngowan8.com\ngoweb1.cc\ngoweb2.net\ngoweb3.net\ngoweike.net\ngowinamc.com\ngowincms.com\ngowinlease.com\ngowlc.net\ngowmo.com\ngowonganinn.com\ngoww.net\ngoxytrbz.com\ngoyihu.com\ngoyoo.com\ngozap.com\ngozongroup.com\ngozyq.com\ngp-tm.com\ngp1903.com\ngp1907.com\ngp241.com\ngp259.com\ngp451.com\ngp51.com\ngp88888.com\ngp891.com\ngpai.net\ngpall.net\ngpautobid.com\ngpb-hls.streamguys1.com\ngpbbs.net\ngpbeta.com\ngpboke.com\ngpcang.com\ngpcqjy.com\ngpd.hk\ngpdi.com\ngper.club\ngpetrip.com\ngpfang.net\ngpgwx.com\ngpl-express.com\ngplayspace.com\ngplqdb.com\ngplus-lab.com\ngpmii.net\ngpmro.com\ngpmycez.com\ngpnewtech.com\ngpost-ge.cfd\ngpowersoft.com\ngppapp.com\ngpqnrc.com\ngps009.net\ngps010.net\ngps123.org\ngps16888.com\ngpsbao.com\ngpsgx.net\ngpslook.net\ngpsonextra.net\ngpsoo.net\ngpsov.com\ngpspw.net\ngpsrcw.com\ngpsspg.com\ngpstool.com\ngpsuu.com\ngpszlsc.com\ngpticket.org\ngptkong.com\ngpubgm.com\ngpuez.com\ngpuztrvt.com\ngpxiv5kew4mvk.com\ngpxxz.com\ngpxygpfx.com\ngpxz.com\ngpxzw.com\ngpyck.com\ngpydxl.com\ngq-rose.com\ngq60.com\ngqbmt.com\ngqget.com\ngqgkj.com\ngqhmt.com\ngqjd.net\ngqjtgs.com\ngqjx.net\ngqk.tv\ngqprgkr.com\ngqpyh.com\ngqqsm.com\ngqsj.cc\ngqsoso.com\ngqsyk.com\ngqsym.com\ngqt168.com\ngqxtq.com\ngqzewmsk8yma18.com\ngr-hospital.com\ngr3xuaov74khb.com\ngra-moissanitesorg.com\ngrab4k.com\ngrablan.com\ngrabsun.com\ngrace2015.site\ngracece.com\ngraceelectron.com\ngracelaser.com\ngracg.com\ngradaimmi.com\ngradgroup.com\ngradgroup.net\ngraduallylift.com\ngrafytek.com\ngrainedu.com\ngrainstorage.net\ngrand-tec.com\ngrandcitytours.com\ngranddongshan.com\ngrandee-elevator.com\ngrandelazio.com\ngrandhopebio.com\ngrandinsight.com\ngrandioes.com\ngrandkol.com\ngrandlisboa.com\ngrandlisboapalace.com\ngrandloong.com\ngrandomics.com\ngrandordesign.com\ngrandpharm.com\ngrandqueen.com\ngrandskylightgardenshenzhen.com\ngrandskylightshenzhenguanlan.com\ngrandwaylaw.com\ngrapchina.org\ngraphene.tv\ngraphmovie.com\ngraphmovies.com\ngrass98.com\ngrassmoon.net\ngraueneko.xyz\ngravity-engine.com\ngraz.quest\ngrcbank.com\ngrchina.com\ngrcwzx.com\ngreat-future.com\ngreatagroup.com\ngreatbit.com\ngreatesting.com\ngreathink.com\ngreatld.com\ngreatoo.com\ngreatopensource.com\ngreatops.net\ngreatopt.com\ngreatpowercn.com\ngreatran.com\ngreatroma.com\ngreatsk.com\ngreatsoftman.com\ngreatsolid.com\ngreatssp.com\ngreatstargroup.com\ngreatstartools.com\ngreatwallmusic.com\ngreatwuyi.com\ngredmedic.com\ngree-jd.com\ngree.com\ngreebox.com\ngreedc.com\ngreedongaohotel.com\ngreefinance.com\ngreejt.com\ngreen-cpc.com\ngreen-holdings.com\ngreen-sh.com\ngreen12306.com\ngreencharm.com\ngreenchengjian.com\ngreencompute.org\ngreendh.com\ngreenism.net\ngreenits.net\ngreenlandcn.com\ngreenlandsc.com\ngreenpine.cc\ngreenswolf.com\ngreentomail.com\ngreentownchina.com\ngreenvalleypharma.com\ngreenwater.cc\ngreenwaychina.org\ngreenwicher.com\ngreenwood-park.com\ngreenxf.com\ngreenxiazai.com\ngreepi.com\ngreeyun.com\ngrender.com\ngreplay.com\ngrescw.com\ngretf.com\ngreyli.com\ngreywolfcdn.net\ngreywolffast.com\ngreywolfns.com\ngrfexpo.com\ngrfyw.com\ngrg2013.com\ngrgaoren.com\ngrgbanking.com\ngrgreecv.com\ngrgroup.cc\ngrgsecurity.com\ngrgtest.com\ngrgvision.com\ngrgyintong.com\ngrid2048.com\ngridsum.com\ngridy.com\ngrikin.com\ngrinm.com\ngrirem.com\ngritgen.com\ngritpharma.com\ngrjzjt.com\ngrksc.com\ngrmxdy.com\ngrnuo.com\ngroad.net\ngronhi.com\ngroovymedicine.com\ngrouk.com\ngroundsun.com\ngroup-purchasing.com\ngroup-spl.com\ngroup-wenyuan.com\ngroupfangyuan.com\ngrouphx.com\ngroupjh.com\ngroupjx.com\ngrouplus.com\ngroupshenxi.com\ngrowatt.com\ngrowful.com\ngrowth.ai.srv\ngrowthbox.net\ngrpindex.com\ngrria.net\ngrs-syphu.com\ngrspet.com\ngrstz.com\ngrt-china.com\ngrtrelay.com\ngrtsports.com\ngrumplesgroup.com\ngruntjs.net\ngruposeimex.com\ngrxxw.com\ngryltop.com\ngryphline.com\ngryu.net\ngryw666.com\ngrzmz.com\ngrzq.com\ngs-cdn.com\ngs090.com\ngs12122.com\ngs14.com\ngs1cn.org\ngs2.ww.prod.dl.playstation.net\ngs6699.com\ngsadds.com\ngsafc.com\ngsafety.com\ngsaxns.com\ngsbankchina.com\ngsbankmall.com\ngscaishui.com\ngscblog.com\ngscdn.pub\ngschaos.club\ngscidc.net\ngsdk.tv\ngsdpw.com\ngsdswz.com\ngsdtfx.com\ngsdyjsgs.com\ngseen.com\ngsensebot.com\ngsfilter.net\ngsflcp.com\ngsfrj.com\ngsfybjy.com\ngsfycloud.com\ngsfzb.com\ngsgltz.com\ngsgs10086.com\ngsgundam.com\ngshangju.com\ngshis.net\ngshmhotels.com\ngshmzs.com\ngshopper.com\ngshqqcx.shop\ngshrgroup.com\ngsi24.com\ngsicpa.net\ngsidy.com\ngsjb.com\ngsjkjt.com\ngsjqtv.com\ngsjt-cn.com\ngsjt56.com\ngsjtky.com\ngskaiwei.com\ngskfzxyy.com\ngskjpt.com\ngsktraining.com\ngskwai.com\ngsl.cc\ngslbauto.com\ngslbdns.com\ngslbdns.net\ngslmw.net\ngsmpers.com\ngsmuban.com\ngsnhcg.com\ngsnytz.com\ngspaceteam.com\ngspst.com\ngspt.com\ngspxonline.com\ngsqstudio.com\ngsrc.com\ngsrcb.net\ngsrcu.com\ngsrcw.com\ngsrecv.com\ngsrl.net\ngsrwfyy.com\ngss56.com\ngssag.com\ngssbh.com\ngssey.com\ngsshylsh.com\ngssjyxrmyy.com\ngsskyst.com\ngssltxrmyy.com\ngsslxh.com\ngsstargroup.com\ngsstic.com\ngsstock.com\ngsstsdgs.com\ngsswtz.com\ngst-china.net\ngst.prod.dl.playstation.net\ngstarcad.com\ngstatic-cn.com\ngsthq.com\ngstonegames.com\ngstsz.com\ngstzyyy.com\ngswjxjzx.com\ngswljt.com\ngswz.com\ngsx009.com\ngsxb.net\ngsxcdn.com\ngsxetc.com\ngsxgw.com\ngsxservice.com\ngsxtj.com\ngsydxzyy.com\ngsysportwear.com\ngsyth.com\ngsyxjyw.com\ngsyygh.com\ngszhaopin.com\ngszlyy.com\ngszph.com\ngszq.com\ngszsc.com\ngszybw.com\ngszyi.com\ngszytcm.com\ngszyy.com\ngt-generator.com\ngt-oil.com\ngt-semi.com\ngt47xc.com\ngt520.com\ngtac.cc\ngtadata.com\ngtajl.com\ngtan.com\ngtaos.com\ngtarcade.com\ngtarsc.com\ngtastart.com\ngtaxqh.com\ngtbuy.work\ngtc-power.com\ngtcedu.com\ngtcfla.net\ngtcfzp.com\ngtcim.com\ngtd-china.com\ngtder.club\ngtdgc.com\ngtdlife.com\ngtdreamlife.com\ngtdsc.com\ngter.net\ngtetern.com\ngtfund.com\ngtg56.com\ngtgqw.com\ngtgres.com\ngtht.com\ngthzc.com\ngti56.com\ngtibee.com\ngtig-esen.com\ngtig.com\ngtiggm.com\ngtimg.com\ngtinno.com\ngtja-allianz.com\ngtja.com\ngtjadev.com\ngtjaqh.com\ngtjazg.com\ngtjgzt.com\ngtjiaoyu.com\ngtjt.com\ngtk-china.com\ngtkj.tech\ngtkl.net\ngtlggy.com\ngtlrxt.com\ngtm-a1b2.com\ngtm-a1b3.com\ngtm-a1b4.com\ngtm-a1b5.com\ngtm-a1b6.com\ngtm-a1b7.com\ngtm-a1b8.com\ngtm-a1b9.com\ngtm-a2b2.com\ngtm-a2b3.com\ngtm-a2b4.com\ngtm-a2b5.com\ngtm-a2b6.com\ngtm-a2b7.com\ngtm-a2b8.com\ngtm-a2b9.com\ngtm-a3b1.com\ngtm-a3b3.com\ngtm-a3b4.com\ngtm-a3b5.com\ngtm-a3b6.com\ngtm-a3b7.com\ngtm-a3b8.com\ngtm-a3b9.com\ngtm-a4b1.com\ngtm-a4b2.com\ngtm-a4b3.com\ngtm-a4b4.com\ngtm-a4b5.com\ngtm-a4b6.com\ngtm-a4b7.com\ngtm-a4b8.com\ngtm-a4b9.com\ngtm-a5b1.com\ngtm-a5b2.com\ngtm-a5b3.com\ngtm-a5b4.com\ngtm-a5b5.com\ngtm-a6b1.com\ngtm-a6b2.com\ngtm-a6b3.com\ngtm-a6b4.com\ngtm-citycloud.com\ngtm-host.com\ngtm-i1d1.com\ngtm-i1d2.com\ngtm-i1d6.com\ngtm-i1d7.com\ngtm-i1d8.com\ngtm-i1d9.com\ngtm-i2d3.com\ngtm-i2d4.com\ngtm-i2d6.com\ngtm-i2d8.com\ngtm-i2d9.com\ngtm-we.com\ngtm.oasisfeng.com\ngtm.pub\ngtmlufax.com\ngtmsh.com\ngtn9.com\ngtobal.com\ngtphotonics.com\ngtpso.com\ngtqzg.com\ngtradedata.com\ngtrukxeo.com\ngts.work\ngtshebei.com\ngtsnzp.com\ngttctech.com\ngttxidc.com\ngtuanb.com\ngtuu.com\ngtwrmdxo.com\ngtx-sh.com\ngtxf.com\ngtxh.com\ngtxp2.com\ngtycn.net\ngtyztpt.com\ngtzlw.com\ngtzszy.com\ngtzxhk.com\ngtzxsg.com\ngtzy123.com\ngu166.com\ngu360.com\ngua123.com\nguabu.com\nguaguay.com\nguahao-inc.com\nguahao.com\nguahao114.com\nguahaoe.com\nguahaowang.com\nguaiguai.com\nguaihou.com\nguaiku.com\nguaileicp.com\nguaili.org\nguailuo.com\nguailuzi.com\nguaitao.cc\nguaixun.com\nguajibao.club\nguajibao.me\nguajibaola.com\nguakaoba.com\nguan-shi.com\nguan.com\nguan5.com\nguanaitong.com\nguance.com\nguanchangnongmu.com\nguanchao.site\nguanchiad.com\nguancibaoku.com\nguandan.com\nguandan.mobi\nguandan888.com\nguandang.net\nguandata.com\nguandianle.com\nguang-yuan.com\nguang.com\nguangbali.com\nguangbao-uni.com\nguangbo.net\nguangbogroup.com\nguangcimh.com\nguangdamr.com\nguangdauser.com\nguangdianyun.tv\nguangdiu.com\nguangdong-hotel.com\nguangdong1039.com\nguangdonggames.com\nguangdonglianxing.com\nguangdonglong.com\nguangdongrc.com\nguangdongtianxi.com\nguangdongwater.com\nguangdongyunchen.com\nguangdv.com\nguangfan.com\nguangfeng.com\nguangfulingyuan.com\nguanggao.com\nguanghan-marathon.com\nguanghe.tv\nguanghuayigou.com\nguanghui.com\nguangjie5u.com\nguangjieba.com\nguangjiela.com\nguangjinghb.com\nguangjipharm.com\nguangjiubusiness.com\nguangjiucompany.com\nguangju123.com\nguangjuke.com\nguangka.com\nguangkatf.com\nguangli88.com\nguanglikou.com\nguanglilvyuan.com\nguanglingroup.com\nguanglongsoft.com\nguangming.com\nguangmintou.com\nguangnengquan.com\nguangraoluntan.com\nguangruijixie.com\nguangsai.cc\nguangshaxy.com\nguangshenghang.com\nguangsuan.com\nguangsuss.com\nguangte-ne.com\nguangtuikeji.com\nguanguigroup.com\nguanguser.com\nguangwaifu.com\nguangwei.com\nguangxi910.com\nguangxibiaoxie.com\nguangxicarbon.com\nguangxichunhui.com\nguangxigames.com\nguangxiguozhi.com\nguangxihaihui.com\nguangxihongji.com\nguangxijiazhi.com\nguangxijinhang.com\nguangxilindakejimeiliyaoshang.com\nguangxilonghua.com\nguangxima.com\nguangximinhang.com\nguangxinengyuan.com\nguangxipubeihuaheng.com\nguangxircw.com\nguangxishangfu.com\nguangxishuizhiyangzhigongsi.com\nguangxisichujiadao.com\nguangxixinchan.com\nguangxixinyan.com\nguangxixinyuwanzixun.com\nguangxiyijie.com\nguangxizbq.com\nguangxizhonghui.com\nguangxizhutingqi.com\nguangxunsd.com\nguangya-group.com\nguangyapan.com\nguangyi.net\nguangyinghj.com\nguangyuancare.com\nguangyuangroup.com\nguangyuanjt.com\nguangyuanmarathon.com\nguangyuhb.com\nguangyv.com\nguangzhitui.com\nguangzhou-logistics.com\nguangzhou-marathon.com\nguangzhouamc.com\nguangzhoudazhong.com\nguangzhougy.com\nguangzhouxiehe.com\nguangzhouyibo.com\nguangzhouzaiyu.com\nguanhaiwei.com\nguanhaobio.com\nguanhejx.com\nguanhou.com\nguanhuaju.com\nguanjiajf.com\nguanjunjg.com\nguankou.net\nguanlannet.com\nguanli360.com\nguanlixi.com\nguanliyun.com\nguanmeikj.com\nguannews.com\nguanngxu.com\nguanpark.com\nguanpindiaosu.com\nguanquanapp.com\nguanrenjiaoyu.com\nguanshanbaodian.com\nguanshang1998.com\nguanshangyu.cc\nguanshenggz.com\nguansong.com\nguansre.com\nguantao.com\nguanting.com\nguanvip8.com\nguanwang.cc\nguanwang.com\nguanwangbao.com\nguanwangdaquan.com\nguanwangshijie.com\nguanwangyun.com\nguanwuxiaoer.com\nguanxf.com\nguanxian.org\nguanxiaokai.com\nguanxingyun.com\nguanxintec.com\nguanxxg.com\nguanyezipper.com\nguanyierp.com\nguanyinshan.com\nguanyiyun.com\nguanzhongrc.com\nguanzhu.mobi\nguanzhulian.com\nguanzhunet.com\nguanziheng.com\nguapaijia.com\nguardease.com\nguardrailchina.com\nguatedu.com\nguatuwang.com\nguazhuan.com\nguazi-apps.com\nguazi.com\nguazi.net\nguazi75637736.cc\nguazipai.com\nguazistatic.com\nguazixs.com\nguba.com\nguba163.com\ngubaike.com\ngubo.org\ngucciblog.net\nguccistar.com\ngucheng.com\nguchengnews.com\nguchengxiangye.com\ngucihand.com\ngucn.com\ngucun.info\ngucunpark.net\nguczkbdq.com\ngudeapp.com\ngudemanage.com\ngudianwenxue.com\ngudongtech.com\ngufengmh9.com\ngufenxueshu.net\ngug66.com\ngugeapps.net\ngugexs.com\ngugezg.com\ngugong.net\ngugu.fun\ngugu5.com\ngugu6.com\ngugud.com\ngugudang.com\nguguread.com\ngugushuzi.com\nguguyu.com\nguguyun.com\nguguyuyin.com\nguguzhu.com\nguhantai.com\nguhei.net\nguheshuyuan.com\nguhuozaiol.com\ngui333.com\ngui66.com\nguibi.com\nguicaiyun.com\nguichanghj.com\nguichuideng.com\nguichuxing.com\nguidecari.com\nguidechem.com\nguideir.com\nguideofsh.com\nguiderank-app.com\nguifan.cc\nguifancha.com\nguifanku.com\nguifeng.net\nguifun.com\nguigang688.com\nguigu.org\nguigushi2.com\nguihaikj.com\nguihejr.com\nguihua.com\nguihuangfood.com\nguihuayun.com\nguiji.com\nguijingchina.com\nguijinshu.com\nguijitech.com\nguijob.com\nguikai888.com\nguikangmaterials.com\nguikuan.com\nguilinaohu.com\nguilincyjt.com\nguilinhd.com\nguilinhengda.com\nguilinihg.com\nguilinjiaqi.com\nguilinjizhuangxiang.com\nguilinlife.com\nguilinlv.com\nguilinoutdoor.com\nguilinpharma.com\nguilinruntai.com\nguilinsongyu.com\nguilintianhu.com\nguilintravel.com\nguilinzhiyuan.com\nguiluohuang.com\nguimamuye.com\nguimengjob.com\nguimengning.com\nguimengshangeng.com\nguinsoft.com\nguipeibao.com\nguipin.com\nguiqingkeji.com\nguiqv.com\nguirong.com\nguiscn.com\nguishangtong.com\nguishanhotel.com\nguishequ.com\nguisteel.com\nguitan.com\nguitang.com\nguitang.fun\nguitarq.com\nguitongmy.com\nguitu18.com\nguiwang.org\nguiweilian.com\nguixiaozi.com\nguixue.com\nguiyangmarathon.com\nguiyingclub.net\nguiyuhuanbao.com\nguiyuntai.com\nguizeco.com\nguizheng.net\nguizhenghe.com\nguizhenwei.com\nguizhougames.com\nguizhougas.com\nguizhoushengyang.com\nguizhutanglao.com\nguj6.com\ngujianba.com\ngujing.com\ngujinshici.com\ngujiushu.com\ngujiyx.com\ngukaculture.com\ngukaifu.com\ngukaihu.com\ngukun.com\ngulandscape.com\nguliem.com\ngulinglong.com\ngulinrongmei.com\ngullmap.com\ngulltour.com\ngulongbbs.com\ngulove.com\ngulu.tv\ngulu001.com\ngulugj.com\ngululu.com\nguluyou.com\ngumade.com\ngumang.com\ngumaor.com\ngumeng.net\ngumiji.com\ngumingnc.com\ngumo.pro\ngumodels.com\ngumpmall.com\ngundambattle.com\ngunshitech.com\ngunsuo.com\nguo-kai.com\nguo7.com\nguo98.com\nguoanaz.com\nguoanclub.com\nguoanele.com\nguoanqi.com\nguoanwine.com\nguoaoqiyuan.com\nguobaihui.com\nguobaoyou.com\nguobiao99.com\nguobiaotest.com\nguobin120.com\nguoboshi.com\nguocaipps.com\nguocaiqinghai.com\nguocar.com\nguochaos.com\nguocool.com\nguocuijingju.com\nguodashi.com\nguodatzjt.com\nguodegang.org\nguodi.net\nguodiana.com\nguodingnet.com\nguodongbaohe.com\nguodongtech.com\nguodongtechnology.com\nguodouw.com\nguodu.com\nguodu.hk\nguodushidai.com\nguofanglab.com\nguofen.com\nguofenchaxun.com\nguofenchaxun.net\nguofeng.com\nguofenkong.com\nguogongxin.com\nguoguangmold.com\nguoguo-app.com\nguoguojie.com\nguohanlawfirm.com\nguohaokeji.com\nguohongxin.com\nguohu360.com\nguohua88.com\nguohuapharm.com\nguohuarf.com\nguohuayule.com\nguoing.com\nguoji.biz\nguoji.pro\nguojiang.tv\nguojianglive.com\nguojiayikao.com\nguojiayixuekaoshi.com\nguojiazhiyezige.com\nguojidaigou.com\nguojiexpress.com\nguojijinjia.com\nguojimami.com\nguojing-tech.com\nguojiseka.com\nguojiwuye.com\nguojixiao.com\nguojixuexiao.net\nguojixuexiao.org\nguojiyujiaxueyuanzongbu.com\nguojizhanlanhui.com\nguojj.com\nguojusoft.com\nguokang.com\nguokelonghui.com\nguoketest.com\nguokeyun.com\nguokongqixie.com\nguokr.com\nguokr.io\nguokr.net\nguoku.com\nguolaiwanba.com\nguolan.com\nguolannewmaterial.com\nguole.fun\nguoli.com\nguolianchem.com\nguolianglab.org\nguolin.tech\nguolisec.com\nguolong365.com\nguolongplastic.com\nguoluonews.com\nguolv.com\nguolv.net\nguomai.cc\nguomaoreducer.com\nguomeijiayuanxiaoxue.com\nguomeikuaidi.com\nguomiaokeji.com\nguomin999.com\nguominpension.com\nguomu.com\nguoocang.com\nguopeiwang.com\nguopika.com\nguoping123.com\nguopop.tech\nguoqi.org\nguoqi365.com\nguoqinwang.com\nguorongfei.com\nguoruijx.com\nguoshengtech.com\nguoshi.com\nguosujt.com\nguotaijsh.com\nguotailiangyou.com\nguotangauto.com\nguotongglobal.com\nguoturen.com\nguotv.com\nguowai.org\nguoweijt.com\nguoweistem.com\nguoweitong.com\nguowuwushu.com\nguoxiehao.com\nguoxikonggu.com\nguoxinbj.com\nguoxinlanqiao.com\nguoxinmac.com\nguoxinqh.com\nguoxintek.com\nguoxue.com\nguoxue123.com\nguoxuedashi.com\nguoxuemeng.com\nguoxuemi.com\nguoxuwang.com\nguoyang.cc\nguoyang.work\nguoyangtech.com\nguoyc.online\nguoyice.com\nguoyihuake.com\nguoyitang.org\nguoyu.com\nguoyue.games\nguoyuegroup.com\nguoyuejituan.com\nguoyunjc.com\nguoyusec.com\nguoyutec.com\nguozaoke.com\nguozh.net\nguozhangroup.com\nguozhanjiaoyu.com\nguozhen.net\nguozhenyi.com\nguozhivip.com\nguozhuan.com\nguozhuangxincai.com\nguozi.org\nguoziyx.com\nguozucq.org\ngupang.com\ngupaoedu.com\ngupei.com\ngupen.com\ngupiao135.com\ngupiao168.com\ngupiao8.com\ngupiaoq.com\ngupiaowajue.com\ngupowang.com\ngupt.net\ngupuu.com\ngupzs.com\nguqiankun.com\nguqiu.com\nguqu.net\nguronge.com\ngurukeji.com\ngushengwang.com\ngushequ.com\ngushi.ci\ngushi.com\ngushi160.com\ngushi365.com\ngushiai.com\ngushici.com\ngushicimingju.com\ngushidaquan.cc\ngushidi.com\ngushiji.cc\ngushiju.net\ngushiwen.org\ngusspro.com\ngusucaishui.com\ngusuwang.com\nguteke.com\ngutlighting.com\ngutou.com\ngutousoft.com\ngutx.org\nguwan.com\nguwantj.com\nguweimin.com\nguwendao.net\nguwenxs.com\nguwenxuexi.com\nguwu121.com\nguxiang.com\nguxunw.com\nguyizisha.com\nguyuehe.com\nguyuehome.com\nguyuenglish.com\nguyungame.com\nguzhang.com\nguzhangting.com\nguzhenm.com\nguzhongtrade.com\nguzuci.com\nguzwiayz.com\ngvcr9zaemdzh.com\ngvg-redsun.com\ngvgoo.com\ngvi-tech.com\ngvlocalization.com\ngvmocpc.com\ngvoiceplat.com\ngvt2-cn.com\ngvwyuik.com\ngw-ec.com\ngw.craft.moe\ngw4.cc\ngw66.vip\ngwacoe.com\ngwamcc.com\ngwauto.com\ngwbfc.com\ngwblighting.com\ngwc.net\ngwcdncloud.com\ngwdang.com\ngwdqsb.com\ngwdzkj.com\ngweike.com\ngwell.cc\ngwenorcasv1.com\ngwepy.org\ngwetech.com\ngwfls.com\ngwfx.net\ngwgl168.com\ngwgsc.com\ngwi.cc\ngwidc.com\ngwin-cn.com\ngwinbody.com\ngwjakzzx.com\ngwjinan.com\ngwkvepgc.com\ngwm-global.com\ngwmapp-h.com\ngwmapp-w.com\ngwmfc.com\ngwmmarathon.com\ngwmsoft.com\ngwnsxx.com\ngwnz.com\ngworg.com\ngwozai.com\ngwpdi.com\ngwpp.net\ngwpstools.com\ngwrcw.com\ngwsdns.com\ngwtt.com\ngwvpsceping.com\ngwwg.com\ngwxeda.com\ngwy.com\ngwyclass.com\ngwyoo.com\ngwyou.com\ngwypxw.com\ngwysydw.com\ngwyzk.com\ngwyzwb.com\ngwzft.com\ngwzhinan.com\ngwzwfw.com\ngwzyxh.com\ngx-antai.com\ngx-aozhan.com\ngx-biosensor.com\ngx-ds.net\ngx-etrans.com\ngx-hengyuan.com\ngx-hm.com\ngx-lc.com\ngx-newmedia.com\ngx-royalpartners.com\ngx-stbd.com\ngx-wl.com\ngx-xc.com\ngx-xjyx.com\ngx-yidaiyilu.com\ngx-zy.com\ngx10010.com\ngx121.com\ngx12333.net\ngx12580.net\ngx163.com\ngx1g.com\ngx3j.net\ngx4485.com\ngx5127.com\ngx516.com\ngx51766.com\ngx5f.com\ngx79.com\ngx81jxzl.com\ngx966888.com\ngxaas.net\ngxabd.net\ngxacjs.com\ngxacto.com\ngxadt.com\ngxadwh.com\ngxaedu.com\ngxahjy.com\ngxaids.com\ngxairlines.com\ngxaist.com\ngxaixier.com\ngxalt.com\ngxanchen.com\ngxankao.com\ngxantu.com\ngxany.com\ngxaoma.com\ngxar.com\ngxarl.com\ngxasjc.com\ngxasjn.com\ngxawjmy.com\ngxaxjy.com\ngxaxpc.com\ngxayn.com\ngxb.io\ngxbaichen.com\ngxbaidu.net\ngxbaidutg.com\ngxbaifugch.com\ngxbaikuang.com\ngxbaixun.com\ngxbakj.com\ngxbaozhiyue.com\ngxbasic.com\ngxbbwsw.com\ngxbbwyl.com\ngxbcf.com\ngxbcgjg.com\ngxbcjc.com\ngxbckj.com\ngxbdcx.com\ngxbdtx.com\ngxbeiente.com\ngxbest.xyz\ngxbeyy.com\ngxbf.net\ngxbgdl.com\ngxbgtf.com\ngxbhgas.com\ngxbhjg.com\ngxbhlg.com\ngxbhly.net\ngxbian.com\ngxbiandao.com\ngxbidding.com\ngxbihongkeji.com\ngxbinhai.com\ngxbiyang.com\ngxblfs.com\ngxbltz.com\ngxbml.com\ngxbmmy.com\ngxbngs.com\ngxbochi.com\ngxboning.com\ngxbotlan.com\ngxbqba.com\ngxbqkj.com\ngxbr668.com\ngxbre.com\ngxbrm.com\ngxbs.net\ngxbscbh.com\ngxbsfj.com\ngxbsky.com\ngxbsnx.com\ngxbssyy.com\ngxbstlxx.com\ngxbsyjsw.com\ngxbtjt.com\ngxbtka.com\ngxbtnz.com\ngxbtsc.com\ngxbtsy.com\ngxbtxc.com\ngxbygs.com\ngxbyjxc.com\ngxbykj.com\ngxbyrcb.com\ngxbys.com\ngxbyw.com\ngxbyx.com\ngxbzjx.com\ngxcae.com\ngxcaining.com\ngxcaiyiduo.com\ngxcampus.com\ngxcards.com\ngxcareer.com\ngxcast.com\ngxcatv.com\ngxcbjs.com\ngxcbljt.com\ngxccblg.com\ngxccedu.com\ngxccjt.com\ngxcd.pw\ngxcdc.com\ngxceg.com\ngxcei.com\ngxcerc.com\ngxcexxzx.com\ngxcfjx.com\ngxcgmf.com\ngxcgzh.com\ngxch168.com\ngxchanghe.com\ngxchangjiangpn-jinnuo.com\ngxchbf.com\ngxchem.com\ngxchengjian.com\ngxchengmei.com\ngxchengyun.com\ngxchlrf.com\ngxchr.com\ngxchuanghua.com\ngxchuanlan.com\ngxchuen.com\ngxchunmao.com\ngxchuxin.com\ngxcic.net\ngxcimc.com\ngxcj.cc\ngxcj.net\ngxcjcl.com\ngxcjgt.cc\ngxcjn.com\ngxcjtc.com\ngxclkj.com\ngxclzz.com\ngxcmgr.com\ngxcmicc.com\ngxcncec.com\ngxcnjx.com\ngxcodemaker.com\ngxcors.com\ngxcounty.com\ngxcpa.com\ngxcq188.com\ngxcqm.com\ngxcr.cc\ngxcrcw.com\ngxcrh.net\ngxcrhj.com\ngxcrjm.com\ngxcro.com\ngxcrzxgs.com\ngxcschem.com\ngxcscm.com\ngxcsfc.com\ngxcskj.com\ngxcsmed.com\ngxcsmx.com\ngxcsqj.com\ngxcsycj.com\ngxcsypm.com\ngxcszm.com\ngxctc.net\ngxctd.com\ngxcthb.com\ngxcti.com\ngxctzb.com\ngxcuiping.com\ngxcvuedu.com\ngxcw.com\ngxcxhb.com\ngxcxxny.com\ngxcxyx.com\ngxcyaq.com\ngxcyhjt168.com\ngxcyzs.com\ngxcz88.com\ngxczm.com\ngxcznews.com\ngxcznews.net\ngxczrc.com\ngxdadu.com\ngxdairy.com\ngxdajin.com\ngxdajixiong.com\ngxdake.com\ngxdanbao.com\ngxdangan.com\ngxdansi.com\ngxdanzo.com\ngxdaos.com\ngxdaosheng.com\ngxdbdl.com\ngxdbxrmyy.com\ngxdco.net\ngxdcwh.com\ngxddcs.com\ngxddtz.com\ngxddzl.com\ngxdegas.com\ngxdetdq.com\ngxdfjt.com\ngxdfzx.com\ngxdhgy.com\ngxdhhb.com\ngxdhyy.com\ngxdiba.com\ngxdicai.com\ngxdig.com\ngxdingyi.com\ngxdingyu.com\ngxdkjmy.com\ngxdkyr.net\ngxdljz.com\ngxdltech.com\ngxdlxy.com\ngxdlzl.com\ngxdmds.com\ngxdmsq.com\ngxdmtrade.com\ngxdmw.com\ngxdna.com\ngxdnu.com\ngxdong.com\ngxdongce.com\ngxdongfangshi.com\ngxdonghong.com\ngxdongkai.com\ngxdoulaibo.com\ngxdqtg.com\ngxdrh.com\ngxds1.com\ngxdse.com\ngxdslyy.com\ngxdslyyls.com\ngxdsoms.com\ngxdsxf.com\ngxdsyl.com\ngxdtchem.com\ngxdtiot.com\ngxdtjl.com\ngxdtsc.com\ngxdunshen.com\ngxduomeishi.com\ngxduyi.com\ngxdx5.com\ngxdxbj.com\ngxdxcredit.com\ngxdxdt.com\ngxdxjs.com\ngxdxlk.com\ngxdxlxs.com\ngxdycpa.com\ngxdygs.com\ngxdygx.com\ngxdyxjd.com\ngxdyyj.com\ngxea.com\ngxeaq.com\ngxecard.com\ngxecm.com\ngxeduyun.net\ngxegoo.com\ngxehy.com\ngxeits.com\ngxej.net\ngxelang.com\ngxenews.com\ngxeph.com\ngxept.com\ngxeqjx.com\ngxeqx.com\ngxer.net\ngxeszx.com\ngxevc.com\ngxewa.com\ngxfag.com\ngxfaj.com\ngxfanghu.com\ngxfanlian.com\ngxfanlu.com\ngxfanxing.com\ngxfanyayoga.com\ngxfcq.com\ngxfcw.com\ngxfengjie.com\ngxfenglei.com\ngxfengxingjq.com\ngxffjt.com\ngxfhjs.com\ngxfhny.com\ngxfhxx.com\ngxfi.net\ngxfigroup.com\ngxfin.com\ngxfinfr.com\ngxfjly.com\ngxflm.com\ngxflpg.com\ngxfls.com\ngxflzx.com\ngxfm.net\ngxfmmy.com\ngxfnt.com\ngxforestry.com\ngxfrhb.com\ngxfsms.com\ngxfssy.com\ngxfsty.com\ngxfswl.com\ngxfsxrmyy.com\ngxfsyljt.com\ngxftu.org\ngxfushun.com\ngxfusui.com\ngxfuxue.com\ngxfuyuan.com\ngxfxhjwy.com\ngxfxly.com\ngxfxm.com\ngxfxwh.com\ngxfxzb.com\ngxfybj.com\ngxfygp.com\ngxfysteel.com\ngxfyzx.com\ngxfzf.com\ngxfzkkj.com\ngxfzpg.com\ngxfzyjs.com\ngxg1978.com\ngxgaia.com\ngxgangji.com\ngxgangxin.com\ngxgangyuan.com\ngxganhua.com\ngxgaoling.com\ngxgaotong.com\ngxgaoyao.com\ngxgaoyou.com\ngxgaty.com\ngxgba.com\ngxgbdb.com\ngxgbkj.com\ngxgbx.com\ngxgcedu.com\ngxgcfscl.com\ngxgcjs.com\ngxgczxjt.com\ngxgd192.com\ngxgdbg.com\ngxgdhg.com\ngxgdlsp.com\ngxgdpg.com\ngxgdyy.com\ngxgdyz.com\ngxgeek.com\ngxgentle.com\ngxgf.net\ngxgfsh.com\ngxggcmc.com\ngxggdq.com\ngxggfhsmy.com\ngxgghx.com\ngxggm.com\ngxghfs.com\ngxghjt.com\ngxghpg.com\ngxghyysc.com\ngxghzh.com\ngxgj.com\ngxgjgc.com\ngxgjgg.com\ngxgjh.com\ngxgjjl.com\ngxgjjt.com\ngxgjny.com\ngxgjzy.com\ngxgkzzr.com\ngxgl588.com\ngxglft.com\ngxglgcjs.com\ngxglhd.com\ngxglhx.com\ngxgljhgc.com\ngxgljy.com\ngxglkg.com\ngxglnykj.com\ngxglory.com\ngxglyl.com\ngxglys.com\ngxglzj.com\ngxglzs.com\ngxgm.net\ngxgmgc.com\ngxgmjhc.com\ngxgmtx.com\ngxgndxdl.com\ngxgoldpool.com\ngxgongyinglian.com\ngxgoodfirst.com\ngxgp123.com\ngxgpo.com\ngxgpzhtc.com\ngxgqdz.com\ngxgqsn.com\ngxgrasp.com\ngxgree.com\ngxgrtech.com\ngxgryy.com\ngxgsgl.com\ngxgsgs.com\ngxgshb.com\ngxgswlhy.com\ngxgsxy.com\ngxgsyy.com\ngxgszb.com\ngxgtdg.com\ngxgtdl.com\ngxgtghy.com\ngxgttt.com\ngxgtxny.com\ngxgtzb.com\ngxgtzx.com\ngxguanghui.com\ngxguangxin.com\ngxguangyi.com\ngxguantai.com\ngxguanyu.com\ngxguerte.com\ngxguicheng.com\ngxguijiu.com\ngxguimei.com\ngxguiping.com\ngxguiren.com\ngxguirun.com\ngxguite.com\ngxguixing.com\ngxguiyang.com\ngxguizhiyuan.com\ngxguoda.com\ngxguoen.com\ngxguojian.com\ngxguojingjiuye.com\ngxguoyang.com\ngxguyu.com\ngxgwmb.com\ngxgwuxe.com\ngxgwyw.org\ngxgxjc.com\ngxgxncplm.com\ngxgxun.com\ngxgyfy.com\ngxgyh.com\ngxgymsxx.com\ngxgyrq.com\ngxgyyclc.com\ngxgyyy.com\ngxgzlm.com\ngxgztyy.com\ngxgzy.com\ngxgzzn.com\ngxhaibao.com\ngxhalw.com\ngxhanhe.com\ngxhanlin.com\ngxhaojian.com\ngxhaorun.com\ngxhaozhi.com\ngxharui.com\ngxhb8.com\ngxhbcyxh.com\ngxhbedu.com\ngxhbs.com\ngxhc120.com\ngxhc18.com\ngxhc365.com\ngxhcht.com\ngxhclw.com\ngxhcmr.com\ngxhcnf.com\ngxhcwy.com\ngxhcyk.com\ngxhczx.com\ngxhdaf.com\ngxhddj.com\ngxhddq.com\ngxhdsy.com\ngxhealth.xin\ngxheda.com\ngxhefei.com\ngxheguan.com\ngxhengda.com\ngxheyumaoyi.com\ngxhezhixin.com\ngxhfba.com\ngxhfdqsb.com\ngxhfyy.com\ngxhg.net\ngxhghg.com\ngxhgjm.com\ngxhgkj.com\ngxhgx.net\ngxhgzb.com\ngxhgzc.com\ngxhh.com\ngxhhgc.com\ngxhhgs.com\ngxhhhb.com\ngxhhig.com\ngxhhjk.com\ngxhhjt.net\ngxhhmed.com\ngxhhzsjt.com\ngxhigreen.com\ngxhis.net\ngxhjbw.com\ngxhjjt.net\ngxhjky.com\ngxhjly.com\ngxhjsh.com\ngxhjsz.com\ngxhjwy.com\ngxhjzbcyy.com\ngxhjzx.com\ngxhkd.com\ngxhkdq.com\ngxhkdyf.com\ngxhkgy.com\ngxhkjc.com\ngxhkjt.com\ngxhl.com\ngxhlc.com\ngxhljx.com\ngxhlun.com\ngxhlx.net\ngxhly168.com\ngxhmba.com\ngxhmcm.com\ngxhmdjt.com\ngxhnyt.com\ngxhongchuan.com\ngxhonggang.com\ngxhongning.com\ngxhongshimuye.com\ngxhongyunsi.com\ngxhongzh.com\ngxhope.org\ngxhospital.com\ngxhouse.com\ngxhovi.com\ngxhpxrmyy.com\ngxhqh.com\ngxhqjy.com\ngxhqtest.com\ngxhqwh.com\ngxhqxmgl.com\ngxhrcjz.com\ngxhrkj.com\ngxhs.site\ngxhsba.com\ngxhsjgs.com\ngxhsltd.com\ngxhsry.com\ngxhsshj.com\ngxhsshjzl.com\ngxhstars.com\ngxhsxcl.com\ngxhsxxkj.com\ngxhsykj.com\ngxhszb.com\ngxhtjx.com\ngxhtl.com\ngxhtte.com\ngxhuabao.com\ngxhuachi.com\ngxhuachuang.com\ngxhuadu.com\ngxhuaen.com\ngxhuahui.com\ngxhuanbaojt.com\ngxhuapei.com\ngxhuaqu.com\ngxhuar.com\ngxhuaxing.com\ngxhuaxintech.com\ngxhui.com\ngxhuicuibencao.com\ngxhuifa.com\ngxhuihuang.com\ngxhuiji.com\ngxhuijvtong.com\ngxhuiming.com\ngxhuitong.com\ngxhuiwanger.com\ngxhuolong.com\ngxhxbook.com\ngxhxgg.com\ngxhxgroup.com\ngxhxh.com\ngxhxysgs.com\ngxhxyyjt.com\ngxhxzyh.com\ngxhyart.com\ngxhydq.com\ngxhyey.com\ngxhygg.com\ngxhyhs.com\ngxhykglass.com\ngxhyq.com\ngxhyscl.com\ngxhysm.com\ngxhyww.com\ngxhyxf.com\ngxhyxt.com\ngxhyz168.com\ngxhyzixun.com\ngxhyzx.net\ngxhzgjyy.com\ngxhzjsgc.com\ngxhzkj.com\ngxhzsbwg.com\ngxhzsqyg.com\ngxhztqt.com\ngxhzxk.com\ngxhzxw.com\ngxhzyd.com\ngxi.ink\ngxiang.org\ngxibvc.net\ngxic.club\ngxic.net\ngxicc.net\ngxicpa.com\ngxidc.com\ngxidi.com\ngxind.com\ngxinf.com\ngxinfo.org\ngxinfotec.com\ngxipo.net\ngxjajc.com\ngxjaw.com\ngxjbhb.com\ngxjbk.com\ngxjbyy.com\ngxjcbf.com\ngxjccj.com\ngxjch.com\ngxjckc.com\ngxjcqt.com\ngxjcxcl.com\ngxjcxy.com\ngxjcy.com\ngxjcys.com\ngxjdcb.com\ngxjdgc.com\ngxjdgczx.com\ngxjdgyxx.com\ngxjdxs.com\ngxjeyy.com\ngxjf99.com\ngxjfdz.com\ngxjfx.com\ngxjg199.com\ngxjgdj.com\ngxjgea.com\ngxjghy.com\ngxjgjjc.com\ngxjgjstzjt.com\ngxjgjt.com\ngxjgyj.com\ngxjgyjgs.com\ngxjgzcb.com\ngxjgzppc.com\ngxjhcj.com\ngxjhgczx.com\ngxjhgd.com\ngxjhgs.com\ngxjhjcw.com\ngxjhjdsb.com\ngxjhjs.com\ngxjhky.com\ngxjhsj.com\ngxjhygs.com\ngxjhzj.com\ngxjiahua.com\ngxjiangyong.com\ngxjianhong.com\ngxjianlan.com\ngxjianrong.com\ngxjianyi.com\ngxjiaohang.com\ngxjiasheng.com\ngxjiatai.com\ngxjichang.com\ngxjiebai.com\ngxjiefeng.com\ngxjien.com\ngxjigeng.com\ngxjigeyuan.com\ngxjihu.com\ngxjinan.com\ngxjingsheng.com\ngxjinhai.com\ngxjinhuiauto.com\ngxjinjiang.com\ngxjinsu.com\ngxjinsui.com\ngxjintu.com\ngxjirui.com\ngxjiufa.com\ngxjiuxincpa.com\ngxjiuyi.com\ngxjiuyi99.com\ngxjixu.com\ngxjiyu.com\ngxjjb.com\ngxjjfds.com\ngxjjfjt.com\ngxjjgy.com\ngxjjh.com\ngxjjyb.com\ngxjkamc.com\ngxjkhj.com\ngxjkjg.com\ngxjkjyjc.com\ngxjkwy.com\ngxjl99.com\ngxjla.com\ngxjlbw.com\ngxjljz.com\ngxjlkj.com\ngxjlnm.com\ngxjlrc.com\ngxjlsc.com\ngxjm.vip\ngxjmggs.com\ngxjmxx.com\ngxjmxy.com\ngxjmzg.com\ngxjnbgzx.com\ngxjowy.com\ngxjpfs.com\ngxjpjs.com\ngxjpjy.com\ngxjptw.com\ngxjqgs.com\ngxjqt.com\ngxjqyy.com\ngxjrxy.com\ngxjrzl.com\ngxjs.net\ngxjsd56.com\ngxjsfs.com\ngxjshu.com\ngxjsstjt.com\ngxjstkj.com\ngxjsws.com\ngxjsxny.com\ngxjsxszn.com\ngxjt.net\ngxjt001.com\ngxjtaq.com\ngxjtjx.com\ngxjtkyy.com\ngxjtpg.com\ngxjtsa.com\ngxjtscm.com\ngxjtsjy.com\ngxjttz.com\ngxjttzjt.com\ngxjtyab.com\ngxjtysxx.com\ngxjtzb.com\ngxjuancheng.com\ngxjub.com\ngxjugu.com\ngxjuhw.com\ngxjunan.com\ngxjunhe.com\ngxjunliang.com\ngxjxcloud.com\ngxjxsy.com\ngxjxwh.com\ngxjycjsb.com\ngxjyfdc.com\ngxjyfkj.com\ngxjygljt.com\ngxjyh.store\ngxjyhb.com\ngxjyjs168.com\ngxjyjt.com\ngxjyjz.com\ngxjyxxw.com\ngxjyy.com\ngxjyzl.com\ngxjyzyw.com\ngxjz123.com\ngxjzcy.com\ngxjzdt.com\ngxjzht.com\ngxjzhxd.com\ngxjzj-hotel.com\ngxjzj.com\ngxjzjc.com\ngxjzjl.com\ngxjznet.com\ngxjzw12315.com\ngxjzy.com\ngxjzzbdl.com\ngxkaifan.com\ngxkangtian.com\ngxkaoba.com\ngxkcjc.com\ngxkcmy119.com\ngxkdefy.com\ngxkdjc.com\ngxkdjd.com\ngxkdjsq.com\ngxkefei.com\ngxkehong.com\ngxkelite.com\ngxkesui.com\ngxkfl.com\ngxkfy.com\ngxkhjt.com\ngxkhkj.com\ngxkhn.com\ngxkhxxcl.com\ngxkiwi.com\ngxkjd.com\ngxkjdns.com\ngxkjdsj.com\ngxkjec.com\ngxkjhb.com\ngxkjjt.com\ngxkjl.com\ngxkjs.com\ngxkjzy.com\ngxkl.com\ngxkld.com\ngxklyy.com\ngxkmkny.com\ngxkongshan.com\ngxkorbel.com\ngxkqjt.com\ngxkqty.com\ngxkrqz.com\ngxkrui.com\ngxkrx.com\ngxkrzc.com\ngxksdl.com\ngxksdt.com\ngxksjx.net\ngxksxf.com\ngxktdl.com\ngxktzk.com\ngxktzx.com\ngxkunzhen.com\ngxkyjc.com\ngxkzxx.com\ngxlanbowang.com\ngxlanco.com\ngxlancogroup.com\ngxlanlian.com\ngxlansheng.com\ngxlbang.com\ngxlbbwg.com\ngxlbgf.com\ngxlbi.com\ngxlbzszy.com\ngxlcclean.com\ngxlcgy.com\ngxlcjsjt.com\ngxlclsyf.com\ngxlcpp.com\ngxlcwater.com\ngxlcxs.com\ngxld168.com\ngxlddq.com\ngxldgjgpj.com\ngxldjs.com\ngxldpc.com\ngxldzn.com\ngxlecheng.com\ngxlek.com\ngxlelin.com\ngxlfzl.com\ngxlgwl.com\ngxlgxx.com\ngxlh168.com\ngxlhcx.com\ngxlhgjg.com\ngxlhhb.com\ngxlhjc.com\ngxlhxn.com\ngxlianci.com\ngxliangjian.com\ngxliangla.com\ngxlianguan.com\ngxliangyun.com\ngxlianye.com\ngxlianying.com\ngxlib.com\ngxlihua.com\ngxlimu.com\ngxliri.com\ngxlituo.com\ngxliuhang.com\ngxliuqiaojidian.com\ngxlixin.com\ngxliyugs.com\ngxljgc.com\ngxljh.com\ngxljjt.com\ngxljjz.com\ngxljxs.com\ngxlk.net\ngxlke.com\ngxlkjy.com\ngxlkl.net\ngxllcb.com\ngxllsw888.com\ngxllxl.com\ngxlmjt.com\ngxlmzs.com\ngxlongfa.com\ngxlonsen.com\ngxlove.vip\ngxlqgcy.com\ngxlqjs.com\ngxlqkg.com\ngxlqsd.com\ngxlryl.com\ngxlscf.com\ngxlsfy.com\ngxlsfz.com\ngxlsnm.com\ngxlstc.com\ngxlswhg.com\ngxltbaoan.com\ngxlteng.com\ngxltgjg.com\ngxltjj.com\ngxltm.com\ngxltmyjt.com\ngxltzy.com\ngxluhai.com\ngxlulian.com\ngxluogui.com\ngxluyun.com\ngxlvjian.com\ngxlvtong.com\ngxlvwang.com\ngxlwdsslgy.com\ngxlwlc.com\ngxlwt.com\ngxlxgg.com\ngxlxs2008.com\ngxlxs2008.net\ngxlxsn.com\ngxlxxl.com\ngxlxyun.com\ngxly66.com\ngxlyb.com\ngxlycq.com\ngxlycs.com\ngxlycwb.com\ngxlycyxh.com\ngxlyghy.com\ngxlygyl.com\ngxlyhbkj.com\ngxlyjt.com\ngxlzbbw.com\ngxlzck.com\ngxlzdyc.com\ngxlzgcc.com\ngxlzgdjt.com\ngxlzhm.com\ngxlzlk.com\ngxlzpc.com\ngxlzsh.com\ngxlzsmk.com\ngxlztz.com\ngxlzwl.com\ngxlzxrmyy.com\ngxlzxt.com\ngxlzzc.com\ngxlzzh.net\ngxma123.com\ngxmacc.com\ngxmailu.com\ngxmanyy.com\ngxmaocai.com\ngxmbh.com\ngxmbs.com\ngxmdgroup.com\ngxmdjt.com\ngxmeiao.com\ngxmeiduo.com\ngxmeike.com\ngxmetalking.com\ngxmggg.com\ngxmiao.com\ngxmiaoshu.com\ngxminglian.com\ngxmingshi.com\ngxmj.org\ngxmjyy.com\ngxmjzs.com\ngxmk.net\ngxmlba.com\ngxmlyjy.com\ngxmmhgs.com\ngxmmkt.com\ngxmoking.com\ngxmqhb.com\ngxmscbs.com\ngxmsg.com\ngxmsgy.com\ngxmtzn1658.com\ngxmuch.com\ngxmuwmfy.com\ngxmuyfy.com\ngxmuzi.com\ngxmxc.com\ngxmxin.com\ngxmyjc.com\ngxmykj.com\ngxmylink.com\ngxmytzsn.com\ngxmzb.net\ngxmzcl.com\ngxmzjwy.com\ngxmzkj.com\ngxmzly.com\ngxmznzs.com\ngxnantong.com\ngxnapd.com\ngxnbjc.com\ngxnccq.com\ngxncgd.com\ngxnctzjt.com\ngxndcxswyxgs.com\ngxnddq.com\ngxndgg.com\ngxnewen.com\ngxnfxny.com\ngxnfyk.com\ngxnhjk.com\ngxnjqj.com\ngxnjsy.com\ngxnjy.com\ngxnjzj.com\ngxnk.com\ngxnkjgnc.com\ngxnkxjry.com\ngxnkyy.com\ngxnkyy.net\ngxnmkj.com\ngxnmzj.com\ngxnncj.com\ngxnnclt.com\ngxnndghb.com\ngxnnedu.com\ngxnnfx.com\ngxnnhexiexinli.com\ngxnnip.com\ngxnnjn.com\ngxnnjqgg.com\ngxnnjw.com\ngxnnkfzx.com\ngxnnks.com\ngxnnlsz.com\ngxnnlyd.com\ngxnnmudz.com\ngxnnncp.com\ngxnnsdyy.com\ngxnnsmfbl.com\ngxnnsy.com\ngxnntfx.com\ngxnnthch.com\ngxnntn.com\ngxnnws.com\ngxnnxny.com\ngxnnybskq.com\ngxnnyihui.com\ngxnnyxjx.com\ngxnnzj.com\ngxnongmu.com\ngxnpzbx.com\ngxnsjt.com\ngxntjz.com\ngxnumba.com\ngxnun.net\ngxnwjt.com\ngxnxdb.com\ngxnxgd.com\ngxnydq.com\ngxnymt.com\ngxnzjz.com\ngxnzzy.com\ngxoc168.com\ngxoem.com\ngxok.com\ngxosjc.com\ngxota.com\ngxota.net\ngxoulian.com\ngxouwen.com\ngxp.cc\ngxp2.com\ngxpanda.com\ngxpangbo.com\ngxpbs.com\ngxpeh.com\ngxpfyy.com\ngxpgfood.com\ngxpgft.com\ngxpggj.com\ngxpghj.com\ngxphc.com\ngxphd.com\ngxphj.com\ngxpingen.com\ngxpinn.com\ngxpjzs.com\ngxpljt.com\ngxpnzp.com\ngxpost.com\ngxppw.com\ngxptids.com\ngxptkc.com\ngxptyy.com\ngxpu.com\ngxpuyi.com\ngxpxdj.com\ngxpykj.com\ngxqcjs.com\ngxqcw.com\ngxqddfxf.com\ngxqdkj.com\ngxqfjzzs.com\ngxqgjx.com\ngxqgps.com\ngxqhcm.com\ngxqhjc.com\ngxqhtec.com\ngxqianhan.com\ngxqianrong.com\ngxqianshuo.com\ngxqianyuan.com\ngxqiba.com\ngxqihu.com\ngxqihuan.com\ngxqingchang.com\ngxqintang.com\ngxqiyang.com\ngxqiyuan.com\ngxqkcm.com\ngxqljt.com\ngxqllc.com\ngxqmk.com\ngxqnjc.com\ngxqqxcl.com\ngxqrhb.com\ngxqrjy.com\ngxqs.org\ngxqszl.com\ngxqtgroup.com\ngxqtszxc.com\ngxqyjy.com\ngxqykj.com\ngxqymc.com\ngxqymy.com\ngxqzdx.com\ngxqzez.com\ngxqzfz.com\ngxqzk.com\ngxqzrc.com\ngxqzrm.com\ngxqztv.com\ngxqztz.net\ngxqzxjh.com\ngxqzxw.com\ngxqzxyd.com\ngxqzyz.com\ngxqzzy.com\ngxrasafety.com\ngxrayhome.com\ngxrc.com\ngxrcda.com\ngxrcgs.com\ngxrcosta.com\ngxrcpx.com\ngxrcw.com\ngxrcyj.com\ngxrczc.com\ngxrdgroup.com\ngxrdjy.com\ngxrenheng.com\ngxrfys.com\ngxrgjd.com\ngxrgwl.com\ngxrhdl.com\ngxrijia.com\ngxrjf.com\ngxrjyy.com\ngxrkyy.com\ngxrmzs.com\ngxrnzb.com\ngxroad.com\ngxrongpin.com\ngxrongwang.com\ngxrqsjhz.com\ngxrsjc.com\ngxrskyy.com\ngxrsmllab.com\ngxrtbtc.com\ngxruiheng.com\ngxruipai.com\ngxruizhen.com\ngxrunteng.com\ngxrxdt.com\ngxrxsy.com\ngxrxsyjz.com\ngxrygc.com\ngxrzd.com\ngxrzgczx.com\ngxsad.net\ngxsag.com\ngxsailian.com\ngxsanchuan.com\ngxsanleng.com\ngxsanli.com\ngxsanyo.com\ngxsbcj.com\ngxsbfdc.com\ngxsbzz.com\ngxsc88.com\ngxscbxg.com\ngxsccl.com\ngxscjn.com\ngxscjx.com\ngxsckj.net\ngxscq.com\ngxscse.com\ngxscsw.com\ngxsd.net\ngxsdem.com\ngxsdpx.com\ngxsdy.com\ngxseal.com\ngxsejy.com\ngxsell.com\ngxsenge.net\ngxsenhao.com\ngxsenzhou.com\ngxsfcm.com\ngxsfht.com\ngxsfjd.com\ngxsgcgpt.com\ngxsgip.com\ngxsgys.com\ngxshangbeng.com\ngxshangjia.com\ngxshanglong.com\ngxshangyou.com\ngxshanyixing.com\ngxshbs.com\ngxshck.com\ngxshdl.com\ngxshebei.com\ngxshenglu.com\ngxshengwei.com\ngxshenyi.com\ngxshgk.com\ngxshile.com\ngxshiteng.com\ngxshixinde.com\ngxshizhi.com\ngxshjy.com\ngxshjz.com\ngxshny.com\ngxshoufeng.com\ngxshouji.com\ngxshtf.com\ngxshua.com\ngxshuairun.com\ngxshudao.com\ngxshuibao.com\ngxshuixie.com\ngxshunxiu.com\ngxshxc.com\ngxshxf.com\ngxshxlpx.com\ngxshyy.com\ngxshz01.com\ngxshzyzs.com\ngxsika.com\ngxsilk.com\ngxsjc.com\ngxsjgs.com\ngxsjmilk.com\ngxsjmy.com\ngxsjsd.com\ngxsjtz.com\ngxsjwh.com\ngxskf.com\ngxsksw.com\ngxsksy.com\ngxsl.com\ngxslbj.com\ngxslcc.com\ngxslyj.com\ngxslyy.com\ngxsme.net\ngxsmkt.com\ngxsngc.com\ngxsntp.com\ngxsnzw.com\ngxspas.com\ngxspri.com\ngxsrkj.com\ngxsrtz.com\ngxsrwl.com\ngxsrxlzxyxzrgs.com\ngxssmg.com\ngxssrs.com\ngxstarship.com\ngxstd.com\ngxsthb.com\ngxsthnt.com\ngxstkw.com\ngxstzx.com\ngxsubat.com\ngxsuda.com\ngxsunwin.com\ngxsut.com\ngxsuyun.com\ngxswgd.com\ngxswsw.com\ngxswzps.com\ngxsxbj.com\ngxsxhw.com\ngxsy.org\ngxsycpa.com\ngxsydg.com\ngxsygg.com\ngxsyh.com\ngxsyzs.com\ngxszf.net\ngxszgp.com\ngxszjf.com\ngxszjk.com\ngxszyy.com\ngxtagrm.com\ngxtaiping.com\ngxtaishi.com\ngxtaiyinuo.com\ngxtalc.com\ngxtangmi.com\ngxtcdpp.com\ngxtckj.com\ngxtcq.com\ngxtcsys.com\ngxtdg.com\ngxtenger.com\ngxtengsong.com\ngxtesjy.com\ngxtf108.com\ngxtfgg.com\ngxtfmy.com\ngxtfxx.com\ngxthcpa.com\ngxthxxkj.com\ngxthyy.com\ngxtianmiao.com\ngxtianpin.com\ngxticket.com\ngxtizi.com\ngxtjddc.com\ngxtjksj.com\ngxtjsnzg.com\ngxtk.com\ngxtkzx.com\ngxtlgd.com\ngxtljnhb.com\ngxtltzjt.com\ngxtmh.com\ngxtmhzx.com\ngxtmrs.com\ngxtmsy.com\ngxtodo.com\ngxtonghui.com\ngxtongji.com\ngxtongtai.com\ngxtongzhu.com\ngxtopart.com\ngxtp2021.com\ngxtrwhy.com\ngxtskq.com\ngxtslr.com\ngxttcc.com\ngxttjs.com\ngxttjt.com\ngxtuipin.com\ngxtuliao.com\ngxtuoen.com\ngxtuoyi.com\ngxtuscity.com\ngxtxjk.com\ngxtxpec.com\ngxty.com\ngxty.ltd\ngxtydt.com\ngxtydzqy.com\ngxtyjc.com\ngxtykj.com\ngxtyw.com\ngxtywj.com\ngxtyymxcgs.com\ngxtzh.net\ngxtznn.com\ngxtzpx.com\ngxtztech.com\ngxucreate.com\ngxue.net\ngxufl.com\ngxufz.com\ngxuit.com\ngxumi.com\ngxupdi.com\ngxups.com\ngxuzf.com\ngxvideo.net\ngxvolardda.com\ngxwanchao.com\ngxwanchun.com\ngxwbl.com\ngxwcll.com\ngxwcwl.com\ngxwdgg.com\ngxwdjt.com\ngxweibo.net\ngxweipeng.com\ngxweite.com\ngxwellsun.com\ngxwenlian.com\ngxwenyutech.com\ngxwgdq.com\ngxwgjf.com\ngxwhsy.com\ngxwhwy.com\ngxwjkj.com\ngxwjs.com\ngxwjwswkj118.com\ngxwjxl.com\ngxwjxsbcj.com\ngxwjyllh.com\ngxwkhb.com\ngxwkxcl.com\ngxwmj168.com\ngxwmpco.com\ngxwofi.com\ngxwogan.com\ngxwohua.com\ngxwoqi.com\ngxwqwh.com\ngxwskq.com\ngxwsxt.com\ngxwtai.com\ngxwtba.com\ngxwtrlzy.com\ngxwtt.com\ngxwtzy.com\ngxwudun.com\ngxwuyan.com\ngxwuzi.com\ngxwx.com\ngxwxbjsy.com\ngxwxjy.com\ngxwxjz.com\ngxwxtyn.com\ngxwzgroup.com\ngxwzhh.co\ngxwzj.com\ngxwzjt.com\ngxwzjx.com\ngxwzlhh.com\ngxwzsz.com\ngxwztv.com\ngxwzxhyq.com\ngxwzyl.com\ngxxbx.com\ngxxbysy.com\ngxxbzm.com\ngxxdbp.com\ngxxdit.com\ngxxdpc.com\ngxxdzx.com\ngxxfbfg.com\ngxxfgg.com\ngxxfky.com\ngxxfsl.com\ngxxfz.com\ngxxgg.com\ngxxgle.com\ngxxgpower.com\ngxxgrj.com\ngxxgty.com\ngxxh58.com\ngxxhb.com\ngxxhgj.com\ngxxhgroup.com\ngxxhgs.com\ngxxhn.com\ngxxhsd.com\ngxxhtax.com\ngxxhtsj.com\ngxxhtx.com\ngxxhtzp.com\ngxxhz.com\ngxxhzp.com\ngxxiangxing.com\ngxxiangyi88.com\ngxxiaofu.com\ngxxiaolong.net\ngxxielang.com\ngxxijiang.com\ngxxilin.com\ngxxin.com\ngxxinchai.com\ngxxingfu.com\ngxxingxing.com\ngxxingyao.com\ngxxinhui.com\ngxxinrui.net\ngxxinxiang.com\ngxxinye.com\ngxxinyi.com\ngxxinzhihai.com\ngxxiyuanep.com\ngxxjcz.com\ngxxjry.com\ngxxjsy.com\ngxxkai.com\ngxxkgs.com\ngxxkhj.com\ngxxkslgy.com\ngxxldl.com\ngxxlhkj.com\ngxxlk.com\ngxxlkj.com\ngxxls.com\ngxxlyc.com\ngxxlzxs.com\ngxxlzyc.com\ngxxmglzx.com\ngxxmjjs.com\ngxxmyjs.com\ngxxndz.com\ngxxpgd.com\ngxxqsm.com\ngxxrf.com\ngxxrwl.com\ngxxrxmgl.com\ngxxrzb.com\ngxxstz.com\ngxxsy.com\ngxxszx.com\ngxxszy.net\ngxxtlq.com\ngxxundongtech.com\ngxxuyang.com\ngxxw.com\ngxxwjs.net\ngxxy.online\ngxxydhb.com\ngxxyh.net\ngxxyhwhcb.com\ngxxyrbc.com\ngxxyybc.com\ngxxyydl.com\ngxxyzx.com\ngxxzbjy.com\ngxxzbzh.com\ngxxzlx.com\ngxxztcm.com\ngxxzwd.com\ngxyaan.tech\ngxyali.com\ngxyanggong.com\ngxyasuoji.com\ngxybsw.com\ngxybyy.com\ngxyc.net\ngxycjy.com\ngxycwh.com\ngxycwy.com\ngxycykj.com\ngxycysw.com\ngxyd.com\ngxydbg.com\ngxydbgjj.com\ngxyddyf.com\ngxydeye.com\ngxydfs.com\ngxydh.com\ngxydn.com\ngxydsc.com\ngxydspm.com\ngxydtaxi.com\ngxydxf.com\ngxyefang.com\ngxyesf.com\ngxyete.com\ngxyfck.com\ngxyfdz.com\ngxyfkj.com\ngxyfm.com\ngxyfxc.com\ngxygfund.com\ngxyglw.com\ngxygys.com\ngxyhdq.com\ngxyhgcjcxxw.com\ngxyhjgjt.com\ngxyhjt.com\ngxyhmy.net\ngxyhtz.com\ngxyhxx.com\ngxyicheng.com\ngxyidao.com\ngxyide.com\ngxyih.com\ngxyingchuang.com\ngxyingdi.com\ngxyinglun.com\ngxyingyue.com\ngxyinniyuan.com\ngxyintian.com\ngxyinyulanyingguigang.com\ngxyixin.com\ngxyiz.com\ngxyj.com\ngxyjcy.com\ngxyjdc.com\ngxyjhb.com\ngxyjmc.com\ngxyjzx.com\ngxykjd.com\ngxylct.com\ngxyldfyy.com\ngxylgyx.com\ngxylink.com\ngxyljf.com\ngxyllc.com\ngxylms.com\ngxylnews.com\ngxyls.com\ngxylsjsp.com\ngxylswkj.com\ngxympay.com\ngxynjx.com\ngxynlts.com\ngxyoj.com\ngxyongjiehb.com\ngxyongsheng.com\ngxyongzhitai.com\ngxyos.com\ngxypdc.com\ngxypjy.com\ngxypnh.com\ngxyqjc.com\ngxysbt.com\ngxysbz.com\ngxysccsh.com\ngxyskz.com\ngxyslkj.com\ngxysqj.com\ngxyss.com\ngxytdyf.com\ngxytgc.com\ngxytk.com\ngxytsy.com\ngxytzx.com\ngxyuanan.com\ngxyuanfeng.com\ngxyuansheng.com\ngxyuanyun.com\ngxyuchuan.com\ngxyunhua.com\ngxyunsen.com\ngxyunsheng.com\ngxyunxiang.com\ngxyuqiaoshiye.com\ngxyushengwenhua.com\ngxyuyun.com\ngxyx168.com\ngxyx1688.com\ngxyxdl.com\ngxyxjt.com\ngxyxlx.com\ngxyxsh.com\ngxyxtkj.com\ngxyxyy.com\ngxyy.net\ngxyykj.com\ngxyyun.com\ngxyyyc.com\ngxyyzwy.com\ngxyz120.com\ngxyzems.com\ngxyzh.com\ngxyzhhb.com\ngxyzjc.com\ngxyzrmyy.com\ngxyzt.com\ngxyzxf119.com\ngxyzyy.com\ngxzanwen.com\ngxzbfm.com\ngxzbkj.com\ngxzbzh.com\ngxzc888.com\ngxzcab.com\ngxzcfd.com\ngxzchz.com\ngxzcjh.com\ngxzckj.com\ngxzclq.com\ngxzcpsw.com\ngxzcs.com\ngxzdsj.com\ngxzdyg.com\ngxzecai.com\ngxzepu.com\ngxzero.com\ngxzfjg.com\ngxzfnz.com\ngxzfzx.com\ngxzfzy.com\ngxzgdl.com\ngxzghsp.com\ngxzgsy.com\ngxzgt.com\ngxzgtz.com\ngxzh.ltd\ngxzh666.com\ngxzhdq.com\ngxzhenghua.com\ngxzhenhang.com\ngxzhentao.com\ngxzhgz.com\ngxzhicui.com\ngxzhihui.com\ngxzhisai.com\ngxzhixing.com\ngxzhiyuanxing.com\ngxzhizhi.com\ngxzhjj.com\ngxzhkj.com\ngxzhlw.com\ngxzhnm.com\ngxzhongshui.com\ngxzhongta.com\ngxzhongzhai.com\ngxzhp.com\ngxzhpm.com\ngxzhshxx.com\ngxzhunchengbg.com\ngxzhzb.com\ngxzhzy.com\ngxziheng.com\ngxzj-metal.com\ngxzjjs.com\ngxzjjtgs.com\ngxzjy.com\ngxzkl.com\ngxzky.com\ngxzkzs.com\ngxzlcs.com\ngxzldt.com\ngxzljt.com\ngxzljx.net\ngxzlnm.com\ngxzls.com\ngxzlsb.net\ngxzm.vip\ngxzmjg.com\ngxzmlm.com\ngxzmrl.com\ngxzmtech.com\ngxzmzz.com\ngxznym.com\ngxzongjun.com\ngxzoxn.com\ngxzpjx.com\ngxzpw.org\ngxzrdk.com\ngxzrjc.com\ngxzrxf.com\ngxzscloud.com\ngxzsgl.com\ngxzsjzsj.com\ngxzslfz.com\ngxzsnm.com\ngxzspg.com\ngxzssmart.com\ngxzstsg.com\ngxzstzjtgs.com\ngxzsyy.com\ngxzszw.com\ngxzt.com\ngxzt148.com\ngxzt99.com\ngxztbf.com\ngxztzs.com\ngxzunx.com\ngxzuojiang.com\ngxzwhw.com\ngxzwjt.com\ngxzwxx.com\ngxzxgl.com\ngxzxht.com\ngxzxmy.net\ngxzxrh.com\ngxzy.com\ngxzydl.com\ngxzyfs.com\ngxzygygs.com\ngxzyhb.com\ngxzyjl.com\ngxzyjsgc.com\ngxzyky.com\ngxzymodel.com\ngxzypg.com\ngxzytx.com\ngxzyxysy.com\ngxzyyt.com\ngxzyzb.com\ngxzzcpa.com\ngxzzd.com\ngxzztkj.com\ngxzzxin.com\ngy-ggy.com\ngy120.net\ngy1688led.com\ngy2025.com\ngy328.com\ngy3y.com\ngy794c.com\ngy7n.com\ngy818.com\ngyaqyy.com\ngyb086.com\ngybcq.com\ngybsn.com\ngybyscy.com\ngycharm.com\ngycode.com\ngyddos.com\ngydfsy.com\ngydongli.com\ngyedu.net\ngyersf.com\ngyfensuiji.com\ngyfwyy.com\ngyfyy.com\ngygmhs.com\ngygmk.club\ngyhapp.com\ngyhb68.com\ngyhdsj.com\ngyhht.com\ngyhimalayanul.com\ngyhj.org\ngyhm.cc\ngyidc.net\ngyii.com\ngyip.net\ngyjc88.com\ngyjdgs.com\ngyjiangyuan.com\ngyjs.net\ngykgcqtm.com\ngykggz.com\ngykghb.com\ngykgsx.com\ngykqyy.com\ngylcxo.xyz\ngyljc.com\ngylwgjsyxx.com\ngylwyy.com\ngylxq.com\ngym0boy.com\ngymama.com\ngymbo-online.com\ngymxbl.com\ngymy.cc\ngyncb.net\ngynsh.net\ngynyzp.com\ngyouapp.com\ngypmsl.com\ngypserver.com\ngypump.com\ngypzkat.com\ngyqcw.com\ngyqqd.com\ngyqrmyy.com\ngyr.cc\ngyrcw.com\ngyrmyy.com\ngyrqfd.com\ngyrsy.com\ngyscw.com\ngysdzy.com\ngyseals.com\ngyshwl.online\ngysk.com\ngysou.com\ngysq.org\ngysrmyy.com\ngystarch.com\ngystars.com\ngystatic.com\ngystc.com\ngyswzys.com\ngytcwb.com\ngytxnc.com\ngytzkg.com\ngyuancdn.com\ngyurt.com\ngywlhypt.com\ngywxedu.com\ngywygl.com\ngyxdkjdl.com\ngyxtyy.com\ngyxuan.com\ngyxww.net\ngyxx.com\ngyxx365.com\ngyyb.com\ngyycc.com\ngyypw.com\ngyyuli.com\ngyyywcpx.com\ngyzdh.com\ngyzdkq.com\ngyzfbz.net\ngyzhtc.com\ngz-begreen.com\ngz-best.com\ngz-chantou.com\ngz-chengkao.com\ngz-cjjl.com\ngz-cmc.com\ngz-cube.com\ngz-ejoy.com\ngz-goam.com\ngz-gree.com\ngz-haohushan.com\ngz-hipower.com\ngz-huayuan.com\ngz-hz.com\ngz-julong.com\ngz-junan.com\ngz-lodihair.com\ngz-ltjx.com\ngz-mrt.com\ngz-notary.com\ngz-shanguang.com\ngz-spi.com\ngz-tencentclb.cloud\ngz-tencentclb.com\ngz-tencentclb.net\ngz-tencentclb.work\ngz-wx.com\ngz-xinghe.com\ngz-xinyu.com\ngz-xt.com\ngz-zhongshang.com\ngz.com\ngz007.net\ngz0668.com\ngz111.com\ngz121.com\ngz12301.com\ngz162.com\ngz1hua.com\ngz300.com\ngz304.com\ngz360.com\ngz4399.com\ngz4u.net\ngz528.com\ngz583.com\ngz91.com\ngzac.org\ngzanquan.com\ngzap.net\ngzaptech.net\ngzasp.net\ngzate.com\ngzautojet.com\ngzbaozhilin.com\ngzbawei.com\ngzbeaton.com\ngzbic.com\ngzbiogene.com\ngzbl.com\ngzblssly.com\ngzboji.com\ngzbookcenter.com\ngzbt020.com\ngzbus.com\ngzbxyy120.com\ngzbycq.com\ngzbyyy.com\ngzbzsport.com\ngzbzx.net\ngzcablec.com\ngzcancer.com\ngzcars.net\ngzccb.com\ngzccigroup.com\ngzccvs.com\ngzceia.com\ngzch120.com\ngzch12333.com\ngzchangke.com\ngzchangzhe.com\ngzchenggeng.com\ngzchj.net\ngzchts.com\ngzchuanghe.com\ngzchupai.com\ngzci.net\ngzcihui.com\ngzcjjs.com\ngzcmer.com\ngzcmjl.com\ngzcn.net\ngzcots.com\ngzcppa.com\ngzcqs.com\ngzcrdzbk.com\ngzcsgs.com\ngzcsjg.com\ngzcxhd.com\ngzcxlm.org\ngzcycling.com\ngzczjd.com\ngzdahyxh.com\ngzdai.com\ngzdaily.com\ngzdangaopeixun.com\ngzdaochen.com\ngzdaqi.com\ngzdata.net\ngzdayue.com\ngzdbx.com\ngzdcsmt.com\ngzdensity.com\ngzdi.com\ngzdia.com\ngzdingan.com\ngzdingjie.com\ngzdingyu.com\ngzdingyue.com\ngzdingyun.com\ngzdisheng.com\ngzdjy.org\ngzdli.com\ngzdqyy.com\ngzdryy.com\ngzdsw.com\ngzdtg.com\ngzduguo.com\ngzdysx.com\ngzebpubservice.com\ngzedu.com\ngzeic.com\ngzenxx.com\ngzeryun.com\ngzexpo.com\ngzfc.net\ngzfengmao.com\ngzfezx.com\ngzfgxh.com\ngzfi.com\ngzfin.com\ngzfirst.com\ngzfisher.com\ngzfk01.com\ngzfodak.com\ngzforge.com\ngzfpa.net\ngzfqyy.com\ngzfrldz.com\ngzfsnet.com\ngzfuk.net\ngzgajy.com\ngzgas.com\ngzgayy.com\ngzgccs.com\ngzgccxkj.com\ngzgcg.com\ngzgdkq.com\ngzgdwl.com\ngzgelandi.com\ngzghic.com\ngzghyy.com\ngzgj.net\ngzgjcm.com\ngzgjxny.com\ngzglgcjt.com\ngzgljx.com\ngzgmjcx.com\ngzgongsizhuce.com\ngzguangjia.com\ngzguidian.com\ngzgx020.com\ngzgxysjx.com\ngzgyetc.com\ngzh6.com\ngzhaigu.com\ngzhakj.com\ngzhand.com\ngzhangcha.com\ngzhatao.com\ngzhbchy.com\ngzhc365.com\ngzhclw.com\ngzhcpcb.com\ngzhd.net\ngzhd56.com\ngzhdcs.com\ngzhe.net\ngzhengdian.com\ngzhengdou.com\ngzheyoukeji.com\ngzhfschool.com\ngzhifi.com\ngzhkl.com\ngzhkzyyy.com\ngzhm.com\ngzhntec.com\ngzhornet.com\ngzhotelgroup.com\ngzhpaier.com\ngzhpgroup.com\ngzhphb.com\ngzhpyy.com\ngzhpzz.net\ngzhrsa.org\ngzhsh.com\ngzhstars.net\ngzhtdz.com\ngzhtinfo.com\ngzhuake.cc\ngzhuamei.net\ngzhuayan.com\ngzhuiwan.com\ngzhuiyk.com\ngzhuiyun.com\ngzhwgg.com\ngzhwsp.com\ngzhx04.com\ngzhx09.com\ngzhx10.com\ngzhxaq.com\ngzhxyyhos.com\ngzhygk.com\ngzhysy.com\ngzhzcj.com\ngzidc.com\ngziec.net\ngzitvs.com\ngzitwm.net\ngzj568.com\ngzjbjx.com\ngzjbwm.com\ngzjc2016.com\ngzjeeseng.com\ngzjgpy.com\ngzjhotel.com\ngzjiada.com\ngzjiaw.com\ngzjiehun.com\ngzjiema.com\ngzjingsha.com\ngzjinsong.com\ngzjiunuo.com\ngzjizhong.com\ngzjk120.com\ngzjkfk.com\ngzjkfund.com\ngzjkjl.com\ngzjkqh.com\ngzjkyljt.com\ngzjlp.com\ngzjlwl.com\ngzjlwy.com\ngzjlxh.com\ngzjmyy.com\ngzjob.net\ngzjpad.com\ngzjqd.com\ngzjrkg.com\ngzjs020.com\ngzjsxh.com\ngzjt.cc\ngzjtch.com\ngzjtjx.com\ngzjtjy.com\ngzjtxh.com\ngzjtxx.net\ngzjtzy.net\ngzjunbo.net\ngzjunyu.com\ngzjuqi.com\ngzjvcom.com\ngzjxchem.com\ngzjyh.com\ngzjykj.com\ngzjyme.com\ngzjyypt.com\ngzjz-auto.com\ngzjzc.com\ngzkaiheng.com\ngzkaiyue.com\ngzkangyuan.com\ngzkcsj.com\ngzkcsjw.com\ngzking.com\ngzkint.com\ngzkmbg.com\ngzkofa.com\ngzktm.com\ngzkuaiyingyong.com\ngzkunmao.com\ngzkydzyyy.com\ngzlarc.com\ngzlawyer.org\ngzlex.com\ngzlgsyxx.com\ngzli.com\ngzliancun.com\ngzlib.org\ngzlig.com\ngzlight.com\ngzliyuanhb.com\ngzljsl.com\ngzlnholdings.com\ngzlsgy.com\ngzlt.net\ngzlujiao.com\ngzlushun56.com\ngzlutong.com\ngzluxlife.com\ngzlwrc.com\ngzlwycft-tencentclb.cloud\ngzlwycft-tencentclb.com\ngzlwycft-tencentclb.net\ngzlwycft-tencentclb.work\ngzlyhlawyer.com\ngzlz307.com\ngzlzfm.com\ngzm1.com\ngzmama.com\ngzmath.com\ngzmc668.com\ngzmcg.com\ngzmcgjcpt.com\ngzmediaclick.com\ngzmedri.com\ngzmeichang.com\ngzmiden.com\ngzminjia.com\ngzmiyuan.com\ngzmlfcyy.com\ngzmofa.com\ngzmould.com\ngzmpc.com\ngzmri.com\ngzmstech.com\ngzmtr.com\ngzmtrticket.com\ngzmylike.com\ngzmzedu.com\ngznaturn.com\ngznbsyy.com\ngzncstudios.com\ngznemo.com\ngznf.net\ngznftz.com\ngzngn.com\ngznict.com\ngznotes.com\ngznw.com\ngznxbank.com\ngznyjj.com\ngznypfk.com\ngzocl.com\ngzomick.com\ngzopen-tencentclb.cloud\ngzopen-tencentclb.com\ngzopen-tencentclb.net\ngzopen-tencentclb.work\ngzoyrr.com\ngzpaco.com\ngzpeite.com\ngzpeiyou.com\ngzpfs.com\ngzpg.net\ngzpgroup.com\ngzpgs.com\ngzph.net\ngzpma.com\ngzpoint.com\ngzpotent.com\ngzppa.org\ngzprg.com\ngzprobig.com\ngzpy120.net\ngzpydlc.com\ngzpyxz.net\ngzqbd.com\ngzqiche.com\ngzqixun-tech.com\ngzqljxd.com\ngzqsts.com\ngzqunsheng.com\ngzqygl.com\ngzqz.com\ngzrand.com\ngzrandr.com\ngzrch.com\ngzrcqf.com\ngzrecruit.com\ngzredpine.com\ngzrh.com\ngzrishun.com\ngzrkt.com\ngzrobot.com\ngzrobots.com\ngzrqhyxh.com\ngzrrj.com\ngzrskh.com\ngzrsksxxw.com\ngzrtnet.com\ngzrycl.com\ngzsaf.com\ngzsbdq.com\ngzscbio.com\ngzschknyy.com\ngzscjrh.com\ngzsdwrmyy.com\ngzselon.com\ngzsenergy.com\ngzsenzheng.com\ngzsewage.com\ngzsg.org\ngzsgczb.com\ngzshaudio.com\ngzsheraton.com\ngzshiran.com\ngzshuangbao.com\ngzshuimh.com\ngzshujuhui.com\ngzshyk.com\ngzsiyuan.com\ngzsj.live\ngzsjgxcl.com\ngzsjjs.com\ngzsjyzx.com\ngzsjzzsxh.com\ngzskysoil.com\ngzslyy.com\ngzsonic.com\ngzsouth.com\ngzspm.com\ngzspring.com\ngzspt.com\ngzsq.com\ngzsqkfyy.com\ngzsqmxx.com\ngzsrmyy.com\ngzsrunda.com\ngzssltzinc.com\ngzssnzx.com\ngzssyyy.com\ngzstarship.com\ngzsttc.com\ngzstv.com\ngzstw.com\ngzstyq.com\ngzsu.net\ngzsuike.com\ngzsums.net\ngzsunny.com\ngzsw168.com\ngzswgf.com\ngzswjs.com\ngzsxds.com\ngzsyyxh.com\ngzszfgjj.com\ngzszgas.com\ngzszgyjt.com\ngzszjl.com\ngzszsj.com\ngzszyy.com\ngztaiyou.com\ngztalx.com\ngztamude.com\ngztcdj.com\ngztcm3.com\ngztea.vip\ngzteacher.com\ngztextiles.com\ngztfgame.com\ngzthfy.com\ngzthrc.com\ngztig.com\ngztime.cc\ngztit.com\ngztlgc.com\ngztopkt.com\ngztoptour.com\ngztotem.com\ngztowngas.com\ngztrseo.com\ngztszl.com\ngzttjt.com\ngztv.com\ngztvu.com\ngztwkadokawa.com\ngztxcw.com\ngztxedu.com\ngztxfood.com\ngztyjx.com\ngztyre.com\ngztyyedu.com\ngztz.org\ngztz120.com\ngzu521.net\ngzuc.net\ngzuci.com\ngzucm-yhyy.com\ngzuni.com\ngzupdc.com\ngzv6.com\ngzvalex.com\ngzvstc.net\ngzw.net\ngzwanbao.com\ngzwanju.com\ngzwanzhou.com\ngzwarriortech.com\ngzwaterinvest.com\ngzwatersupply.com\ngzwcfjd.com\ngzwcit.com\ngzwcjs.com\ngzweicai.com\ngzweix.com\ngzwhir.com\ngzwjnt.com\ngzwlcyjt.com\ngzwoman.org\ngzwonbo.com\ngzwrit.com\ngzwrjt.com\ngzwshd.com\ngzwswjc.com\ngzwtqx.com\ngzwxzf-tencentclb.cloud\ngzwxzf-tencentclb.com\ngzwxzf-tencentclb.net\ngzwxzf-tencentclb.work\ngzwynet.com\ngzwzhw.com\ngzxdd.com\ngzxdf.com\ngzxdzlyy.com\ngzxf35.com\ngzxhcbfx.com\ngzxhce.com\ngzxhhs.net\ngzxianc.com\ngzxiaoban.com\ngzxict.com\ngzxijiu.com\ngzxinfo.com\ngzxjgc.com\ngzxrsqj.com\ngzxswh.com\ngzxsyy.com\ngzxszf.com\ngzxue.com\ngzxulang.com\ngzxwtjy.com\ngzxxm.com\ngzxxtiyu.com\ngzxy.net\ngzxyh.com\ngzxyprint.com\ngzxzjy.com\ngzyajs.com\ngzyangai.com\ngzybao.com\ngzycdy.com\ngzych.vip\ngzycsjgs.com\ngzyct.com\ngzydnewmaterial.com\ngzydong.com\ngzydwh.com\ngzyfjsjt.com\ngzyflw.com\ngzyhg.vip\ngzyiagu.com\ngzyilongprinting.com\ngzyitsy.com\ngzylhyzx.com\ngzyouai.com\ngzyowin.com\ngzyqtlxs.com\ngzyqwl.net\ngzysnkyy.com\ngzytgf.com\ngzyucai.com\ngzyucai.net\ngzyxedu.net\ngzyxls.com\ngzyxtech.com\ngzyycg.com\ngzyyjt.net\ngzyyma.com\ngzyytj.com\ngzyywz.net\ngzyz699.com\ngzzarts.com\ngzzbdl.com\ngzzc-logistics.com\ngzzcs.com\ngzzdgg.com\ngzzdkg.com\ngzzdqy.net\ngzzfrl.com\ngzzgresin.com\ngzzhanmei.com\ngzzhitu.com\ngzzhixin.com\ngzzhrong.com\ngzzjgf.com\ngzzjtx.com\ngzzkjc.net\ngzzkzj.com\ngzzkzsw.com\ngzzldq.com\ngzzlfw.com\ngzzliot.com\ngzzmedu.com\ngzzoc.com\ngzzongsi.com\ngzzoo.com\ngzzqy.net\ngzzrdc007.com\ngzzulin.com\ngzzwis.com\ngzzx.cc\nh-ceo.com\nh-cled.com\nh-college.com\nh-diode.com\nh-heguo.com\nh-partners.com\nh-shgroup.com\nh-ui.net\nh-world.com\nh-zl.net\nh0591.com\nh0758.net\nh12.net\nh12345.com\nh128.com\nh13.mobi\nh14z.com\nh2-bank.com\nh2fc.net\nh2gl.com\nh2o-china.com\nh2os.com\nh2vm.com\nh2weilai.com\nh3806.com\nh3807.com\nh389.com\nh3c.com\nh3c.com.hk\nh3cfuwuqi.com\nh3dns.net\nh3ue2s.com\nh3wog.com\nh3yun.com\nh4088.com\nh4k5.com\nh4sud3rr4pmu.com\nh5-share.com\nh5-x.com\nh5-yes.com\nh5.net\nh51h.com\nh554.com\nh55u.com\nh576.com\nh5abc.com\nh5anli.com\nh5app.com\nh5avu.com\nh5cn.com\nh5data.com\nh5designer.com\nh5ds.com\nh5eco.com\nh5faner.com\nh5gamecdn.club\nh5gd.com\nh5gdsvip.com\nh5gdvip.com\nh5in.net\nh5jun.com\nh5king.com\nh5kuai.com\nh5ky.com\nh5le.com\nh5login.work\nh5ma.com\nh5mc.com\nh5mgd.com\nh5mo.com\nh5mota.com\nh5mugeda.com\nh5no1.com\nh5pack.com\nh5po.com\nh5shuo.com\nh5taotao.com\nh5tpl.com\nh5uc.com\nh5util.com\nh5video.shop\nh5wap.com\nh5war.com\nh5youxi.com\nh5yunban.com\nh5zhifu.com\nh61889.com\nh6969.com\nh6app.com\nh6room.com\nh6ru.net\nh7ec.com\nh7fpuyk8.com\nh803w.com\nh863.com\nh99998888.com\nh99999999.com\nha-airport.com\nha47.net\nha95158.com\nha97.com\nhaawking.com\nhabadog.com\nhabbygames.com\nhabctv.com\nhabwjc.com\nhach-hanna.com\nhachicnc.com\nhacjkq.com\nhack0nair.me\nhack520.com\nhack58.com\nhack6.com\nhackav.com\nhacker5t2ohub.com\nhackerav.com\nhackernews.cc\nhackhome.com\nhackhp.com\nhackhw.com\nhacking-linux.com\nhackinn.com\nhackjie.com\nhackliu.com\nhacknical.com\nhackp.com\nhackpascal.net\nhackrf.net\nhackroad.com\nhackyh.com\nhacori.com\nhacpai.com\nhaczjob.com\nhadax.com\nhadewu.com\nhadobi.com\nhadsky.com\nhaeicr.world\nhaers.com\nhaersgroup.com\nhaeye.net\nhafei.com\nhafuyoufk.com\nhagaozhong.com\nhagibis.com\nhaguan.com\nhaguworld.com\nhaha168.com\nhaha33.com\nhaha360.com\nhaha365.com\nhaha9911.com\nhahack.com\nhahaertong.com\nhahait.com\nhahajing.com\nhahasou.com\nhahasz.com\nhahaurl.com\nhahawen.com\nhahayouxi.com\nhahazhao.com\nhahon.com\nhahour.com\nhai-jiang.com\nhai.pet\nhai360.com\nhaianbank.com\nhaianbm.com\nhaianedu.net\nhaianw.com\nhaianyaoye.com\nhaianzhuangshi.com\nhaibao.com\nhaibaobaoxian.com\nhaibaofoods.com\nhaibaoptech.com\nhaibaoyl.com\nhaibaoyouxi.com\nhaibeinews.com\nhaibian.com\nhaibianshibei.com\nhaibowh.com\nhaiboyi.com\nhaica.cc\nhaicent.com\nhaichangchina.com\nhaichangoceanpark.com\nhaichen-logistics.com\nhaichuang3d.com\nhaichufang.com\nhaici.com\nhaicj.com\nhaicnh.com\nhaicoder.net\nhaidaibao.com\nhaidaike.com\nhaidaoteam.com\nhaidaotrip.com\nhaidaozhu.com\nhaidegroup.com\nhaidian-marathon.com\nhaidii.com\nhaidilao.com\nhaidilao.net\nhaidilao.us\nhaidubooks.com\nhaidutouzi.net\nhaier-ioc.com\nhaier.com\nhaier.hk\nhaier.net\nhaiercash.com\nhaierfinancial.com\nhaiermoney.com\nhaiershequ.com\nhaiershui.com\nhaiersmarthomes.com\nhaierubic.com\nhaieruplus.com\nhaifangbest.com\nhaifanwu.com\nhaifuhospital.com\nhaige.com\nhaigeek.com\nhaigeer.com\nhaigehome.com\nhaigoose.com\nhaigouyan.com\nhaigugroup.com\nhaigui001.com\nhaihepharma.com\nhaihetour.com\nhaihuainternational.com\nhaihub.co\nhaihuishou.com\nhaiintelligent.com\nhaijia.org\nhaijianchuxing.com\nhaijianstock.com\nhaijiaonet.com\nhaijiaoshi.com\nhaijiasu.com\nhaijizq.com\nhaijob.com\nhaijt.com\nhaijudoc.com\nhaijunda.com\nhaikegroup.com\nhaikejin.com\nhaikele.com\nhaikeoutdoor.com\nhaiketrip.com\nhaikouvw.com\nhaikouwater.com\nhailanchem.com\nhailanggroup.com\nhailea.com\nhailiang.com\nhailiangbio.com\nhailiangedu.com\nhailiangip.com\nhailiangstock.com\nhailiangxinxi.com\nhailichemical.com\nhailidoctor.com\nhaililiang.com\nhailin.com\nhailongfoods.com\nhailouw.com\nhailunpiano.com\nhailuoai.com\nhailuowu.com\nhaima.com\nhaima.me\nhaima001.com\nhaimacloud.com\nhaimacloudpc.com\nhaimaiyun.com\nhaiman.io\nhaimaoji.com\nhaimawan.com\nhaimeec.com\nhaimi.com\nhaimian.com\nhaimin.net\nhaimini.com\nhaimosic.com\nhaina.com\nhaina.net\nhainaguangdian.com\nhainajc.com\nhainan.com\nhainan.net\nhainan0898.net\nhainanairlines.com\nhainancom.com\nhainancp.com\nhainandc.com\nhainanfp.com\nhainanfz.com\nhainanjiuzi.com\nhainanjk.com\nhainanlawyer.org\nhainanlecheng.com\nhainanruiyuan.com\nhainanwangdai.com\nhainanyouxi.com\nhainanyumu.com\nhainanzuojia.com\nhainawater.com\nhainayun.net\nhainiaowo.com\nhainic.com\nhaining.com\nhaining.tv\nhainingnews.net\nhainiubl.com\nhainiugo.com\nhainiuxy.com\nhainuotech.com\nhaiotsys.com\nhaipal.com\nhaipengtoy.com\nhaipinggroup.com\nhaipuzhiwu.com\nhaiqianghm.com\nhaiqigame.com\nhaiqingyanyu.com\nhaiqisoft.com\nhaiqq.com\nhaiqu.vip\nhair43.com\nhair8.net\nhairbobo.com\nhairboxonline.com\nhairenren.com\nhairology.net\nhairongsw.com\nhairuichem.com\nhairuituo.com\nhairunce.com\nhairunmedia.com\nhairunpictures.com\nhairxmf.com\nhairycrabs.com\nhaisco.com\nhaisenyouxi8.com\nhaishengfrp.com\nhaishensl.com\nhaishiyiliao.com\nhaishui.cc\nhaishun.com\nhaishuokj.com\nhaishuu.com\nhaisongta.com\nhaita.io\nhaitaibrowser.com\nhaitaichina.com\nhaitakuajing.com\nhaitangmm.com\nhaitangw.cc\nhaitangw.net\nhaitao.co\nhaitaohub.com\nhaitaoj.com\nhaitaolab.com\nhaitaoqq.com\nhaitaotong.com\nhaitaozu.org\nhaitian-food.com\nhaitian-group.com\nhaitian.com\nhaitiangroup.com\nhaitianhome.com\nhaitianpm.com\nhaitianshuiwu.com\nhaitl.com\nhaitong.com\nhaitongjiaoyu.com\nhaitou.cc\nhaitou360.com\nhaitoujia.com\nhaituie.com\nhaitunshenghuo.com\nhaitunvoice.com\nhaitunwallet.com\nhaitunzhibo.com\nhaitunzhidao.com\nhaitunzixi.com\nhaituoqi.com\nhaitutech.com\nhaiwaicat.com\nhaiwaichongzhi.com\nhaiwaihuafei.com\nhaiwaimoney.com\nhaiwaioo.com\nhaiwaiyou.com\nhaiwaiyoujia.com\nhaiwangbuyu.com\nhaiwanxinxi.com\nhaiwd.com\nhaiwei-tech.com\nhaiweili.com\nhaiwell.com\nhaiwen-law.com\nhaiwenky.com\nhaiwu.com\nhaixiachina.com\nhaixiangkuajing.com\nhaixin.com\nhaixin5.com\nhaixindichan.com\nhaixinews.com\nhaixing6.com\nhaixingbangfu.com\nhaixingcloud.com\nhaixinhui.com\nhaixinpatent.com\nhaixiulive.com\nhaixiumv.com\nhaixiutv.com\nhaixiuvv.com\nhaixuan.com\nhaixue.com\nhaixuemeili.com\nhaixuyun.com\nhaiyang-group.com\nhaiyang.net\nhaiyi701.com\nhaiyiai.tech\nhaiyingmt.com\nhaiyingshuju.com\nhaiyisoft-gz.com\nhaiyisoft.com\nhaiymobi.com\nhaiyong.site\nhaiyuangabion.com\nhaiyuangabiou.com\nhaiyuetechltd.com\nhaiyun.me\nhaizhanweb.com\nhaizhenzhu.com\nhaizhikj.com\nhaizhlink.com\nhaizhoumo.com\nhaizhu.vip\nhaizhuyx.com\nhaizitong.com\nhaiziwang.com\nhaizol.com\nhajt-cn.com\nhaju.com\nhajw.com\nhajzhyxh.com\nhakaimg.com\nhakchina.com\nhakczz.com\nhakfqyy.com\nhakonespring.com\nhakuya.work\nhalade.com\nhalcyonz.com\nhalead.com\nhalfrost.com\nhaligame.com\nhalixun.com\nhaljl.com\nhalloar.com\nhallofix.com\nhalobear.com\nhalomobi.com\nhalopepper.com\nhalsplastics.com\nhaluan2u.com\nhaluoha.com\nhaluolinks.com\nhalvie.com\nham.xin\nhamdl.com\nhamedal.com\nhaminol.com\nhammypuff.com\nhamu.site\nhanabi-live.com\nhanas.com\nhanascitygas.com\nhanbi.live\nhanbige.com\nhanboshi.com\nhanbridge.org\nhanchacha.com\nhanchao9999.com\nhancibao.com\nhancloud.com\nhanclouds.com\nhand-china.com\nhandanhuizhong.com\nhandanjob.com\nhandanyz.com\nhandcn.com\nhandday.com\nhandelic.com\nhandelsen.com\nhandern.com\nhandisele.com\nhandone.com\nhandongkj.com\nhandongruanjian.com\nhandpk.com\nhandsfree.work\nhandu.com\nhanduyishe.com\nhandyfriendship.com\nhanergy.com\nhanex.cc\nhanfakg.com\nhanfan.cc\nhanfei.net\nhanfeiyl.com\nhanfugong.com\nhanganxian.com\nhangbohaorun.com\nhangcha-forklift.com\nhangchow.org\nhangdagroup.com\nhangdaowangluo.com\nhangdaxinli.com\nhangdianzhizao.com\nhangduhc.com\nhangf.com\nhanggao.net\nhangge.com\nhanghaimeng.com\nhanghang.com\nhanghangcha.com\nhanghangohye.com\nhangjia-tech.com\nhangjianet.com\nhangjiayun.com\nhangjizulin.com\nhangkong.com\nhangkongxx.com\nhanglorygroup.com\nhangmaquan.com\nhangnakeji.com\nhangongjk.com\nhangpai.org\nhangpu-topsys.com\nhangruntech.com\nhangshitech.com\nhangsi-bio.com\nhangtianride.com\nhangtu-china.com\nhangtunggroup.com\nhanguangbaihuo.com\nhangugc.monster\nhanguu.com\nhangw.com\nhangwei-media.com\nhangxinyiqi.xin\nhangyan.co\nhangyang.com\nhangyecloud.com\nhangzhiqiao.com\nhangzhouboiler.com\nhangzhoueda.com\nhangzhouexpo.com\nhangzhoufujikura.com\nhangzhoujizhang.com\nhangzhoujx.com\nhangzhouleili.com\nhangzhouluohu.com\nhangzhoumengfa.com\nhangzhouqisheng.com\nhangzhousports.com\nhangzhoutianqi114.com\nhangzhouweifeng.com\nhangzhouyiyao.com\nhangzhouyq.com\nhangzhouzehe.com\nhanhai.net\nhanhaiqikan.com\nhanhe-cable.com\nhanhongchina.com\nhanhoo.com\nhanhua.com\nhanhuatin.com\nhanihanrf.com\nhanjea.com\nhanjianbing.org\nhanjiaying.com\nhanjie.biz\nhanjjl.com\nhanju-tv.org\nhanjuejituan.com\nhanjutv.com\nhankaiacademy.com\nhankaikeji.com\nhankchina.com\nhanke1688.com\nhankeer.org\nhankemaoyi.com\nhanking.com\nhankinggroup.com\nhankmo.com\nhankunlaw.com\nhanlei.org\nhanlin-tech.net\nhanlin.com\nhanlin.press\nhanlindong.com\nhanlinedu.com\nhanlinzhijia.com\nhanlka.com\nhanlongpiju.com\nhanlunjx.com\nhanmaa.com\nhanmads.com\nhanmaidj.com\nhanmaker.com\nhanmeilin.com\nhanmembrane.com\nhanmozhai.com\nhanniulaser.com\nhannor.com\nhannto.com\nhanon.cc\nhanpian.tv\nhanpokou.com\nhanpupharm.com\nhanqigroup.com\nhanqinghb.com\nhanqunfeng.com\nhanrunbt.com\nhans-ad.com\nhansaoxinxi.xyz\nhanschen.site\nhansenexpo.com\nhansetile.com\nhanshinkiki-xuzhou.com\nhansholdings.com\nhanshow.com\nhansight.com\nhanslaser.com\nhanslaser.net\nhansme.com\nhansong-china.com\nhanspower.com\nhanspub.org\nhansrobot.com\nhanstong.com\nhansuku.com\nhansunic.com\nhanswine.net\nhant.cc\nhantang59.com\nhantangxintong.com\nhantangzy.com\nhantecables.com\nhantele.com\nhanterry.com\nhantev.com\nhantinghotels.com\nhantongrc.com\nhantongsteel.com\nhanvitools.com\nhanvon.com\nhanvonmfrs.com\nhanvontouch.com\nhanwa-ch.com\nhanweb.com\nhanwei1234.com\nhanweimetal.com\nhanwenzhongyi.com\nhanximeng.com\nhanxinsheng.com\nhanxuew.com\nhanyanggroup.com\nhanyangmoto.com\nhanyanseed.com\nhanyaohuanbao.com\nhanyi.com\nhanyi.studio\nhanyipo.com\nhanyou.com\nhanyougame.com\nhanyouwang.com\nhanyu.me\nhanyuansh.com\nhanyudi.com\nhanyuguoxue.com\nhanyulaoshi.com\nhanyutai.com\nhanyuwatch.com\nhanyya.com\nhanzhesh.com\nhanzhong123.com\nhanzhonggas.com\nhanzhoulaser.com\nhanzify.org\nhanziguan.com\nhao-shangliang.com\nhao.ac\nhao.gg\nhao.ink\nhao0517.com\nhao0724.com\nhao0770.com\nhao120.cc\nhao123-hao123.com\nhao123.com\nhao123.com.sg\nhao123.net\nhao123.ph\nhao12306.com\nhao123img.com\nhao123n.com\nhao1358.com\nhao136.com\nhao163.com\nhao184.com\nhao1cm.com\nhao22.com\nhao222.net\nhao2345.com\nhao24.com\nhao245.com\nhao251.com\nhao268.com\nhao315.cc\nhao315.com\nhao353.com\nhao360.com\nhao394.com\nhao3gp.com\nhao5.net\nhao528.com\nhao568.com\nhao6.com\nhao695.com\nhao7188.com\nhao753.com\nhao76.com\nhao774.com\nhao86.com\nhao9669.com\nhaoad.org\nhaoamc.com\nhaoayi.xyz\nhaobangni.com\nhaobangscm.com\nhaobtc.com\nhaocaa.com\nhaocai.com\nhaocaiqi.net\nhaocang.com\nhaochang.tv\nhaochangyou.com\nhaoche1.com\nhaoche51.com\nhaochedai.com\nhaocheedai.com\nhaochehui.com\nhaochengda.net\nhaochenmo.cc\nhaochi123.com\nhaochijixie.com\nhaochimei.com\nhaochu.com\nhaochuguo.com\nhaocw.com\nhaodai.com\nhaodanku.com\nhaodaquan.com\nhaodekuai.com\nhaodevps.com\nhaodewap.com\nhaodewap.net\nhaodf.com\nhaodf.org\nhaodiany.com\nhaodiaoyu.com\nhaodingdan.com\nhaodisoft.com\nhaodiy.net\nhaodns123.cc\nhaodns789.cc\nhaodns999.cc\nhaodongdong.com\nhaodou.com\nhaodro.com\nhaoduck.com\nhaoduhe.com\nhaoduo.vip\nhaoduobao6.com\nhaoduofangs.com\nhaoduojiaju.com\nhaoduorou.net\nhaoduoziti.com\nhaoe123.com\nhaoejia.com\nhaoeyou.com\nhaofabiao.com\nhaofakeji.com\nhaofan005.com\nhaofang.net\nhaofang007.com\nhaofang5.com\nhaofangkankan.com\nhaofangyu999.com\nhaofeng-group.com\nhaofenshu.com\nhaofenxiao.net\nhaofly.net\nhaofs.com\nhaofz.com\nhaoge500.com\nhaogedu.com\nhaogj8.com\nhaogongzhang.com\nhaohaizi.com\nhaohan-data.com\nhaohanfw.com\nhaohanguo.com\nhaohanju.com\nhaohanjx.com\nhaohanpower.tech\nhaohanstar.com\nhaohao8888.com\nhaohaodoc.com\nhaohaowan.com\nhaohaowan.net\nhaohaoxiuche.com\nhaohaoxz.com\nhaohaoyx.com\nhaohaozhu.com\nhaohead.com\nhaoht123.com\nhaohuan.com\nhaohuanjiao.com\nhaohuoa.com\nhaohuoyuan.com\nhaohxs.com\nhaointl.com\nhaoinvest.com\nhaoji.me\nhaojiao.cc\nhaojiao.net\nhaojiaolian.com\nhaojie.work\nhaojing.org\nhaojit.com\nhaojixie.cc\nhaojixiong.com\nhaoju5.com\nhaojue.com\nhaojue163.com\nhaojushe.com\nhaoka88.com\nhaokale.com\nhaokan.com\nhaokan5.com\nhaokanbu.com\nhaokanqq.com\nhaokavip.com\nhaoke100.com\nhaokebang.net\nhaokebio.com\nhaokecheng.com\nhaokejie.com\nhaokeyun.vip\nhaokongbu123.com\nhaokoo.com\nhaoku.net\nhaokuaiya.com\nhaolaba.com\nhaolangtech.com\nhaolaoshi.tv\nhaolawyer.com\nhaole.com\nhaoled9999.com\nhaolexiang.com\nhaolidayiliao.com\nhaolietou.com\nhaolifa.com\nhaolike.com\nhaoliners.net\nhaoling.cc\nhaolints.com\nhaoliv.com\nhaolizi.net\nhaolongsci.com\nhaolvbt.com\nhaolyy.com\nhaoma.com\nhaoma123.com\nhaomagujia.com\nhaomai.net\nhaomaikeji.com\nhaomaishe.com\nhaomaishou.com\nhaomaitong.com\nhaomaizhizao.com\nhaomaku.com\nhaomei-alu.com\nhaomenke.com\nhaomifi.com\nhaomingguan.com\nhaommn.com\nhaomo-tech.com\nhaomove.com\nhaomzl.com\nhaonames.com\nhaonic.com\nhaoniu1.com\nhaonongzi.com\nhaooyuan.com\nhaopeixun.com\nhaoqdl.com\nhaoqiao.com\nhaoqihb.com\nhaoqikan.com\nhaoqiutiyu.com\nhaoqixingstem.com\nhaoqu.net\nhaoqu99.com\nhaoqun.vip\nhaoranbio.com\nhaorantech.com\nhaorc.com\nhaoread.com\nhaoreagent.com\nhaorencai.net\nhaorooms.com\nhaoruanmao.com\nhaoruo.com\nhaosd.com\nhaoseals.com\nhaosedaohang.com\nhaosenchina.com\nhaoservice.com\nhaosf.com\nhaosf.net\nhaoshangqi.com\nhaoshanxi.com\nhaosheng168.com\nhaoshengmall.com\nhaoshengyin.org\nhaoshenqi.com\nhaoshici.com\nhaoshifamen.com\nhaoshipin123.com\nhaoshiqi.net\nhaoshsh.com\nhaoshuaji.com\nhaoshudi.com\nhaoshun666.com\nhaoshunjia.com\nhaoshunjx.com\nhaoshuntm.com\nhaoshuo.com\nhaoshuyou.net\nhaoshuyun.com\nhaositone.com\nhaosix.com\nhaoso.com\nhaosou.com\nhaosou.net\nhaosou123.com\nhaosou360.com\nhaoss.vip\nhaost.com\nhaostay.com\nhaosulu.com\nhaote.com\nhaotengly.com\nhaotgame.com\nhaotianhuyu.com\nhaotihui.com\nhaotijin.com\nhaoting.com\nhaotm.com\nhaotonggg.com\nhaotoufa.com\nhaotougao.com\nhaotougu.com\nhaotoys.com\nhaott.com\nhaotu3.com\nhaotui.com\nhaotyn.com\nhaouc.com\nhaowa.com\nhaowaicaijing.com\nhaowallpaper.com\nhaowandeni.com\nhaowang.shop\nhaowangjiaohospital.com\nhaowangpu.com\nhaowanma.info\nhaowanok.com\nhaowanyou.com\nhaowen100.com\nhaowenbo.com\nhaowenshi.com\nhaowu.com\nhaowu.link\nhaowuguo.com\nhaowusong.com\nhaowuyunji.com\nhaoxg.net\nhaoxiana.com\nhaoxiangmachine.com\nhaoxiangyundong.com\nhaoxiaoguo.net\nhaoxingchen.com\nhaoxingcn.com\nhaoxingroup.com\nhaoxinpinggu.com\nhaoxintaikj.com\nhaoxipu.com\nhaoxitong.com\nhaoxiu.net\nhaoxiyou.com\nhaoxue.com\nhaoxue360.com\nhaoxueche.com\nhaoxuee.com\nhaoxyx.com\nhaoyangmao18.com\nhaoyao.com\nhaoyao163.com\nhaoyaofs.com\nhaoyaogo.com\nhaoychuang.com\nhaoyetaoci.com\nhaoyintong123.com\nhaoyisheng.com\nhaoyishu.com\nhaoyong.cc\nhaoyou666.com\nhaoyouidc.com\nhaoyouqian.com\nhaoyouxi.cc\nhaoyouyinxiang.com\nhaoyuanxiao.com\nhaoyue.com\nhaoyue28.com\nhaoyuepu.com\nhaoyun.life\nhaoyun13.com\nhaoyun56.com\nhaoyunbb.com\nhaoyunlaisz.com\nhaoyunlawyer.com\nhaoyunma.com\nhaoyuntech.com\nhaoyunwuyou.com\nhaoyusw.com\nhaozai120.com\nhaozaishop.com\nhaozhai.com\nhaozhanhui.com\nhaozhebao.com\nhaozhexie.com\nhaozhihs.com\nhaozhougroup.com\nhaozhuan.vip\nhaozhuji.net\nhaozi.net\nhaozi.xyz\nhaozip.com\nhaozjj.com\nhaozke.com\nhaozongjie.com\nhaozu.com\nhaozuojia.com\nhapco-cn.com\nhapg-hitachi.com\nhapi123.net\nhapids.com\nhapingapp.com\nhapjs.org\nhaplat.net\nhappi123.com\nhappigo.com\nhappiness9999.com\nhappy-ti.com\nhappy88.com\nhappycodeboy.com\nhappycoding.online\nhappydino.com\nhappyelements.com\nhappyeo.com\nhappyet.org\nhappyev.com\nhappyhlddz.com\nhappyjuzi.com\nhappykb.com\nhappykey6.com\nhappylivelife.com\nhappymmall.com\nhappynic.com\nhappypingpang.com\nhappyplaygame.net\nhappysky.org\nhappystudy.cc\nhappytimenet.com\nhappyvalley.link\nhappywalk.net\nhappyya.com\nhaqu.com\nhaquan.cc\nharbin-electric.com\nharbin123.com\nharborhousehome.com\nharbourmooc.com\nhardcc.com\nhardcoresir.net\nhardhard.work\nhardkr.com\nhardspell.com\nhardware114.com\nhareonsolar.com\nhariogame.com\nharj120.com\nharleyydavidsale.shop\nharmay.com\nharmight.com\nharmony-et.com\nharmony3.com\nharmony4s.com\nharmonyos.com\nharmonywatch.com\nharmyy.com\nharog.net\nharpost.com\nharpping.com\nharryhorsemedia.com\nharrynull.tech\nharrypottermagicawakened.com\nharseen.com\nharsom.com\nhart-worldwide.com\nharvestcm.com\nharvesthanger.com\nharworld.com\nharworld.work\nharzone.com\nhasaf.com\nhasbyk.com\nhasco-group.com\nhasea.com\nhasee.com\nhasee.net\nhasen-cn.com\nhashyrmyy.com\nhasivo.com\nhaskqyy.com\nhasoltd.com\nhaspig.com\nhassbian.com\nhassfull.com\nhasstatic.com\nhastenpharma.com\nhasuhasu.com\nhatanggame.com\nhatangqp.com\nhatangyx.com\nhatelifu.club\nhatfav.com\nhatjedu.com\nhatlonely.com\nhatoem.com\nhatro.cc\nhatter.ink\nhaval-global.com\nhave.ink\nhavefun.im\nhavevisa.com\nhavewo.com\nhawagame.com\nhawanyx.com\nhawbel.com\nhaweigroup.com\nhawjob.com\nhawjwl.com\nhawkaoe.net\nhawkeye.fun\nhawkfilter.com\nhawkhai.com\nhawtaimotor.com\nhaxdjx.com\nhaxm.com\nhaxwx.cc\nhayao.com\nhayaoym.com\nhayge.com\nhaygo.com\nhayi.cc\nhayseen.com\nhazp.net\nhazpw.org\nhazq.com\nhb-163.com\nhb-ecloud.com\nhb-gjj.com\nhb-green.com\nhb-hengda.com\nhb-jn.com\nhb-ly.com\nhb-sx.net\nhb-water.com\nhb-ws.com\nhb-xydq.com\nhb-young.com\nhb0561.com\nhb0771.com\nhb10000.com\nhb10000sale.com\nhb1000kv.com\nhb110.cc\nhb12333.com\nhb191.com\nhb2h.com\nhb2stream1.baoxinwen.com\nhb30.com\nhb3rm.com\nhb500.com\nhb56.cc\nhb96369.com\nhb96568.com\nhbaas.com\nhbaec.com\nhbafa.com\nhbafxh.org\nhbahyy.com\nhbairport.com\nhbanbao.com\nhbapia.vip\nhbasstu.net\nhbbaidu.com\nhbbfyfy.com\nhbbidcloud.com\nhbbidding.com\nhbblxb.com\nhbbmjd.com\nhbbnqy.com\nhbbrgd.com\nhbbst99.com\nhbbsw.vip\nhbbutler.com\nhbbwg.net\nhbbxpx.com\nhbbyb.com\nhbbzyys.org\nhbca110.com\nhbcbly.com\nhbccp.org\nhbccpit.org\nhbcdc.com\nhbcdyz.com\nhbcg.cc\nhbchen.com\nhbchufeng.com\nhbcjh.net\nhbcjkcfwjt.com\nhbcjlq.com\nhbcjw.com\nhbcjxx.com\nhbclgg.com\nhbcljyc.com\nhbclqcw.com\nhbcoal.com\nhbcof.com\nhbcofco.com\nhbcourt.org\nhbct-wiremesh.com\nhbctgs.com\nhbcthotels.com\nhbctic.com\nhbctjk.com\nhbctjt.com\nhbcwt.com\nhbcxpm.com\nhbcyclub.com\nhbcydlqc.com\nhbcyyy.com\nhbdangyang.com\nhbdckj.com\nhbddjt.com\nhbddrn.com\nhbdefon.com\nhbdfmlw.com\nhbdjcc.com\nhbdjk.com\nhbdmia.com\nhbdschem.com\nhbdssb.com\nhbdtjqj.com\nhbdx-kdyy.com\nhbdzcg.com\nhbdzky.com\nhbdzxx.com\nhbeda.org\nhbedky.com\nhbeducloud.com\nhbeeia.com\nhbekt.com\nhbema.net\nhbepec.com\nhbfesco.com\nhbfie.org\nhbfintech.com\nhbfootball.com\nhbfoundry.org\nhbfqyjt.com\nhbfsh.com\nhbfy.com\nhbfybj.com\nhbfyhb.com\nhbfzb.com\nhbg66.club\nhbgajg.com\nhbgbdst.com\nhbgcxj.com\nhbgdsfy.com\nhbgdwl.com\nhbgis.org\nhbgj-3.com\nhbgj.com\nhbgk.net\nhbglky.com\nhbglobal.com\nhbgr.net\nhbgrb.net\nhbgroups.com\nhbgsetc.com\nhbgswl.com\nhbgwy.org\nhbgydxw.com\nhbgzh.com\nhbha027.com\nhbhaolinju.com\nhbhcdn.com\nhbhcgt.com\nhbhdhd.com\nhbhjrzzl.com\nhbhm.net\nhbhml.com\nhbhmxx.com\nhbhongrunxwy.com\nhbhqzyc.com\nhbhtcm.com\nhbhtgroup.com\nhbhtxx.com\nhbhuamei.com\nhbhuipu.com\nhbhxbb.com\nhbhxgroup.com\nhbhyychem.com\nhbhz.net\nhbiclqc.com\nhbicpa.org\nhbidc.net\nhbifeng.com\nhbinitiate.com\nhbipdc.com\nhbisco.com\nhbisv.com\nhbitg.com\nhbjbjt.net\nhbjcgjg.com\nhbjcgy.com\nhbjcxy.com\nhbjdxt.com\nhbjgwl.com\nhbjhc.com\nhbjhkfcyy.com\nhbjhpx.com\nhbjia.net\nhbjinnong.com\nhbjinshenglan.com\nhbjir.com\nhbjjrb.com\nhbjk114.com\nhbjkjt.com\nhbjmcjjt.com\nhbjmyljs.com\nhbjob88.com\nhbjomay.com\nhbjpim.com\nhbjsinfo.com\nhbjsxg.com\nhbjtfwxh.com\nhbjtjsjt.com\nhbjttz.com\nhbjtwljtyxgs.com\nhbjtwlpt.com\nhbjtzb.com\nhbjubao.com\nhbjxad.com\nhbjxjy.org\nhbjxjyw.com\nhbjxym.com\nhbjy.net\nhbjyjmzg.com\nhbjzgw.com\nhbjzxh.com\nhbjzzx.com\nhbkggroup.com\nhbkgy.com\nhbkj-sic.com\nhbklsl.com\nhbkqw.com\nhbksw.com\nhbky.com\nhbkyby.com\nhbkzw.com\nhblbjg.com\nhblccy.com\nhblds.com\nhbldwx.com\nhblhfrp.com\nhblhnykj.com\nhbliti.com\nhblq.com\nhblszzyy.com\nhbltyh.com\nhbltzb.com\nhbltzx.com\nhblxxx.com\nhblynk.com\nhbm360.com\nhbmajiang.com\nhbmchina.com\nhbmes.com\nhbmingjie.com\nhbmmtt.com\nhbn68.com\nhbnews.net\nhbnewsoft.com\nhbneww.com\nhbnfxm.com\nhbnholdings.com\nhbnxb.net\nhbnyfzjt.com\nhbnz.net\nhbomick.com\nhbooker.com\nhboxs.com\nhbpangu.net\nhbpch.com\nhbpengxi.com\nhbpic5.com\nhbpictures.com\nhbppa.org\nhbpryy.com\nhbptzsbw.com\nhbpukang.com\nhbpvc.com\nhbpx.net\nhbqcxy.com\nhbqingteng.com\nhbqmys.com\nhbqndc.com\nhbqtgg.com\nhbqydz.com\nhbqyxy.com\nhbr-caijing.com\nhbrbmedia.com\nhbrc.com\nhbrchina.org\nhbrchinese.org\nhbrcxcl.com\nhbrd.net\nhbrdt.com\nhbrebond.com\nhbrfxh.com\nhbriso.com\nhbrmhospital.com\nhbrsks.co\nhbrsks.net\nhbrsksw.com\nhbruiao.com\nhbruicai.com\nhbrunfeng.com\nhbrunlin.com\nhbryzx.net\nhbrzkj.com\nhbs-nd.com\nhbscd.com\nhbsczx.com\nhbsczzxy.com\nhbsdenterprise.com\nhbseasky.com\nhbsfdx.com\nhbsfedu.com\nhbsfjtgs.com\nhbsgsq.com\nhbshanhe.com\nhbshengbangwl.com\nhbshgzx.com\nhbshichang.com\nhbshls.com\nhbshunda.com\nhbsia.org\nhbsjym.com\nhbsjzyxh.com\nhbskw.com\nhbslft.com\nhbslndx.com\nhbslxzx.com\nhbsmservice.com\nhbsmtxh.com\nhbsmwljt.com\nhbsql.com\nhbsrjt.com\nhbsrjyy.com\nhbssfw.com\nhbssttz.com\nhbsszx.com\nhbstars.com\nhbsti.com\nhbstoo.com\nhbsunlink.com\nhbswjt.com\nhbswkj.com\nhbswmyyxgs.com\nhbsxkyy.com\nhbsxly.com\nhbsxwljt.com\nhbsxzjw.com\nhbsygw.com\nhbsz120.com\nhbszbykj.com\nhbszfw.com\nhbszjsjt.com\nhbszlcc.com\nhbszsv.com\nhbsztv.com\nhbszxyjhyy.com\nhbszzk.com\nhbszzx.com\nhbtcmu.com\nhbtcw.com\nhbtea.com\nhbtengniu.com\nhbtjryp.com\nhbtlh.com\nhbtljg.com\nhbtmjt.com\nhbtobacco.com\nhbtqzx.com\nhbtvc.com\nhbtycp.com\nhbtycyjt.com\nhbtyxh.com\nhbun.net\nhbvtc.net\nhbwanhao.com\nhbwanrun.com\nhbweid.com\nhbwenchang.com\nhbwh.net\nhbwhcyw.com\nhbwhcyxh.com\nhbwhexpo.com\nhbwhjj.com\nhbwjs.com\nhbwljm.com\nhbwlykt.com\nhbwsrc.net\nhbwuxue.com\nhbwuye.com\nhbww.org\nhbxcw.com\nhbxdf.com\nhbxgzls.com\nhbxhfc.com\nhbxhxkj.com\nhbxinfadi.com\nhbxingchi.com\nhbxmcy.com\nhbxot.com\nhbxtzx.com\nhbxtzy.com\nhbxxy.com\nhbxyjob.com\nhbxytc.com\nhbyangyuan.com\nhbyczk.com\nhbydsg.com\nhbydsy.com\nhbyh0561.com\nhbyhfcyy.com\nhbyidu.com\nhbyisen.com\nhbyjfs.com\nhbylgov.com\nhbyljf.com\nhbylzx.com\nhbymfswz.com\nhbynet.net\nhbyouyunyouke.com\nhbyoyo.com\nhbyqtl.com\nhbysfhm.com\nhbyt56.com\nhbyuanhao.com\nhbyunxi.net\nhbyunyang.net\nhbyybwff.com\nhbyysw.com\nhbzaxh.com\nhbzbw.com\nhbzcpg.com\nhbzgjx.com\nhbzh.net\nhbzhan.com\nhbzhjxzz.com\nhbzhonghai.com\nhbzjjk.com\nhbzjrx.com\nhbzjzb.com\nhbzknet.com\nhbzkw.com\nhbzkzxw.com\nhbzm.cc\nhbzmw.com\nhbzncz.com\nhbzqzx.com\nhbzsb.com\nhbzst.com\nhbzszy.net\nhbztn.com\nhbzuojia.com\nhbzyjsjt.com\nhbzzzzw.com\nhc-byq.com\nhc-cdn.com\nhc-overseas.com\nhc-ph.com\nhc-software.com\nhc-sre.com\nhc-testing.com\nhc01.com\nhc121.com\nhc12306.com\nhc23.com\nhc360.com\nhc376.com\nhc39.com\nhc3yy.com\nhc6756.com\nhc79.com\nhc943.com\nhca258.com\nhcaj.com\nhcazb.com\nhcbbs.com\nhcbnjy.com\nhcbuy.com\nhcbyq.com\nhcc11.com\nhcccia.com\nhccenter.net\nhcciot.com\nhcclhealthcare.com\nhccoeutg.com\nhccpcba.com\nhcdamai.com\nhcdyhr.com\nhceia.com\nhcepay.com\nhcfac888.com\nhcfc168.com\nhcftyy.com\nhcgaokong.com\nhcglzj.com\nhcgroup.com\nhcgtravels.com\nhch518.com\nhchbblg.com\nhchbsb.com\nhchezhu.com\nhchina.com\nhchlidc.com\nhchliot.com\nhchongren.com\nhcicloud.com\nhcinfo.tech\nhcj1952.com\nhcjike.com\nhcjt.cc\nhckg.com\nhckj.org\nhclonely.com\nhclouder.com\nhcmiraefund.com\nhcmofen.com\nhcnaimo.com\nhcpharm.com\nhcqixinhb.com\nhcqxbj.com\nhcrlm.com\nhcschengtou.com\nhcsd123.com\nhcsdhgjzx.com\nhcsemitek.com\nhcshangwu.com\nhcsilk.com\nhcsjddc.com\nhcsound.com\nhcswgx.com\nhcsyjt.com\nhct-test.com\nhctxf.org\nhcty.com\nhctzbj.com\nhcvac.com\nhcwebsite.com\nhcwh.ltd\nhcwhjd.com\nhcwiki.com\nhcx123.com\nhcx99.com\nhcxcw.com\nhcxfjq.com\nhcxwdb.com\nhcxxy.com\nhcxy6.com\nhcyacg.com\nhcydit.com\nhcyea.com\nhcykt.com\nhcypzy.com\nhczc.com\nhczfgjj.com\nhczl.com\nhczm1.com\nhczq.com\nhczr.com\nhczs.com\nhczsbj.com\nhczshb.com\nhczxmr.com\nhczyw.com\nhd-english.com\nhd-english.net\nhd-mw.com\nhd-tvb.com\nhd-u.com\nhd.gg\nhd027.com\nhd123.com\nhd123.net\nhd12333.com\nhd199.com\nhd199.net\nhd2h.com\nhd3p.com\nhd88.cc\nhd8y.com\nhdabc.com\nhdanc.com\nhdanheng.com\nhdarea.club\nhdavchina.com\nhdb.com\nhdbaichuan.com\nhdbgjt.com\nhdbits.org\nhdbp.com\nhdbus.net\nhdbz.net\nhdchina.org\nhdcmct.org\nhdcms.net\nhdcy123.com\nhdd-group.com\nhddata.net\nhddgood.com\nhddid.com\nhddlion.com\nhddolby.com\nhddznet.com\nhdeexpo.com\nhdeso.com\nhdfax.com\nhdfimg.com\nhdfybjy.com\nhdgetters.com\nhdh.im\nhdhjtz.com\nhdhome.org\nhdhosp.com\nhdhospital.com\nhdhui.com\nhditec.com\nhdj.me\nhdjad.com\nhdjingwei.com\nhdjt.net\nhdjwj.com\nhdjx.org\nhdjxpx.com\nhdkcsjxh.com\nhdks.net\nhdksjp.com\nhdkwa.com\nhdkylin.work\nhdl-watch.com\nhdlcdns.com\nhdlchina.com\nhdletv.com\nhdlogo.com\nhdlstage.com\nhdlsxh.com\nhdltest.com\nhdlzmdb.com\nhdmiaoc.com\nhdmnw.com\nhdmooncake.com\nhdmryy.com\nhdmtv168.com\nhdmv.org\nhdnd01.com\nhdnychina.com\nhdp88.com\nhdph.com\nhdpyqa.com\nhdpyqc.com\nhdpyqd.com\nhdpyqf.com\nhdqyf.club\nhdrcw.com\nhdsay.net\nhdschina.com\nhdschools.org\nhdsdyyy.com\nhdslb.com\nhdslb.net\nhdslb.org\nhdsmgw.com\nhdtgtm.com\nhdtonghe.com\nhdtyre.com\nhduofen.com\nhdurl.me\nhdw99.com\nhdwbcloud.com\nhdwbsaas.com\nhdwebpyqa.com\nhdwebpyqc.com\nhdwebpyqe.com\nhdwjc.com\nhdwtpay.com\nhdwzz.com\nhdxing.net\nhdxweb.com\nhdxxg.com\nhdxxw.com\nhdxynet.com\nhdyanke.com\nhdyouxi.com\nhdyu.com\nhdyujiu.com\nhdyxgame.com\nhdyxi.com\nhdyy95.com\nhdyzsw.com\nhdzbgs.com\nhdzc.com\nhdzc.net\nhdzcwlian.com\nhdzp.com\nhdzp.net\nhdzuoye.com\nhdzxyy.com\nhe-edu.com\nhe-ku.com\nhe-one.com\nhe17.com\nhe1j.com\nhe29.com\nheacn.net\nhead-way.com\nheadconsultant.com\nheader.cc\nheading123.com\nheadingfilter.com\nheadphoneclub.com\nheadscm.com\nheag.com\nhealforce.com\nhealrna.com\nhealth-china.com\nhealth-foru.asia\nhealthan.net\nhealthbbs.net\nhealthcareol.net\nhealthcareyun.com\nhealthcn.com\nhealthgv.com\nhealthjd.com\nhealthr.com\nhealthybaike.com\nhealthych.com\nhealthydigitallife.com\nhealzentx.com\nheanyo.com\nhearfly.com\nhearstchina.com\nheart-game.com\nheartide.com\nheartinsti.com\nheartxin.com\nheating-sh.com\nheatingtrace.com\nheavenlywind.cc\nheavenonearthhealingalternatives.com\nhebangdianzi.com\nhebbank.com\nhebbc.org\nhebbr.com\nhebca.com\nhebcar.com\nhebecc.com\nhebeeb.com\nhebei.cm\nhebeieb.com\nhebeifanlin.com\nhebeifc.com\nhebeifeimeng.com\nhebeigwy.org\nhebeihazhi.com\nhebeihualang.com\nhebeijd.com\nhebeijia.com\nhebeijiaxin.com\nhebeilyxh.com\nhebeiminglan.com\nhebeimutian.com\nhebeinongzi.com\nhebeisaixin.com\nhebeishifei.com\nhebeishuangning.com\nhebeisia.com\nhebeitongtai.com\nhebeiwl.net\nhebeiwulian.com\nhebeiyouxi.com\nhebeizuqiu.net\nheben-eng.com\nhebetextile.com\nhebgcdy.com\nhebgsetc.com\nhebgtjt.com\nhebi99.com\nhebiia.org\nhebimalasong.com\nhebinhospital.com\nhebisf.com\nhebitv.com\nhebiw.com\nhebjxw.com\nhebjy.com\nhebkjs.com\nhebl.name\nhebmj.com\nhebmusic.com\nhebngc.com\nhebnx.com\nhebolaw.com\nhebooming.com\nhebotc.com\nhebpi.com\nhebpolicycube.com\nhebradio.com\nhebsg.net\nhebshanggu.com\nhebtig.com\nhebtv.com\nhebwlfdc.com\nhebxakj.com\nhebxyjt.com\nhebyjxh.com\nhebzd.com\nhebzhy.com\nhebzljx.com\nhec-al.com\nhec-changjiang.com\nhecaijing.com\nhecdn.com\nhecdn.net\nhechanghuyu.com\nhechangshipin.com\nhechangtech.com\nhechengeco.com\nhechiguotou.com\nhechijinxin.com\nhechuang.info\nhechuangxinxi.xyz\nhechuann.com\nheclife.com\nheclouds.com\nhecoe.com\nhecpharm.com\nhedaoapp.com\nhedaozi.com\nhedasudi.com\nhedaweb.com\nhedgehogbio.com\nhedgehogrock.com\nhedlaonga.com\nhedongli.com\nhedpump.com\nhedu.net\nheduibu.com\nheduismart.com\nhedysx.com\nheec.com\nheeeeeh.com\nheeeepin.com\nheemoney.com\nheenee.com\nheepay.com\nheerit.com\nhefagear.com\nhefei.cc\nhefeifc.com\nhefeilaws.com\nhefeimarathon.com\nheflc.com\nhefls.net\nhefunoodles.com\nhegii.com\nhegouvip.com\nhegsryjq.com\nhehagame.com\nhehang.net\nhehecam.com\nhehecamera.com\nhehejin.com\nhehesheng.com\nheheshouyou.com\nhehesy.com\nhehewan.com\nheheyx.com\nhehooo.com\nhehouse.com\nhehuapei.com\nhei.red\nheibai.net\nheibaicao.com\nheibaige.com\nheibailianmeng.com\nheibaimeng.com\nheibaixiaoyuan.com\nheibandongcha.com\nheibanwa.mobi\nheibaow.com\nheibaowuliu.com\nheibian.com\nheicha.com\nheicheng51.com\nheidaren.com\nheidiankeji.com\nheigaga.com\nheightindustry.com\nheiguang.com\nheiguang.net\nheiha.net\nheihei.com\nheiheiyuyin.com\nheihekeji.com\nheijiao.net\nheijiaovip.com\nheike07.com\nheilanhome.com\nheilei.com\nheilifun.com\nheilongjianggames.com\nheiluo.com\nheima010.com\nheimabao.com\nheimac.net\nheimadao.com\nheimadata.com\nheimai666.com\nheimajijin.com\nheimalanshi.com\nheimaoseo.org\nheimaoseojishu.com\nheimaoshe.com\nheimaying.com\nheimeiai.com\nheimeng.net\nheimizhou.com\nheiniubao.com\nheiniufeiye.com\nheinote.com\nheinw.com\nheirenlei.com\nheisha.net\nheishao.net\nheishenhua.com\nheishou.org\nheistbeer.com\nheitao.com\nheitao2014.com\nheitaosan.com\nheitiane123.com\nheitu.com\nheitukeji.com\nheiwahospital.com\nheiwangke.net\nheixi.com\nheiyan.com\nheiyan.org\nheiyange.com\nheiyanimg.com\nheiying.cc\nheiyu.cc\nheiyu.space\nheiyunxitong.com\nheizhushoes.com\nhejia-china.com\nhejiang.com\nhejiangroup.com\nhejiantech.com\nhejichip.com\nhejicut.com\nhejin588.com\nhejujk.com\nhejun.com\nhejxf.com\nheketai.com\nhekouxin.com\nheku.org\nhel168.com\nhelensbar.com\nheliang.cc\nhelianhealth.com\nhelianwap.com\nhelichina.com\nheliforklift.com\nhelight.info\nhelijia.com\nhelingqi.com\nhelipay.com\nhelishun.com\nhelitzc.com\nheliuyan.com\nhello-fpga.com\nhello-inc.com\nhello1010.com\nhello123.com\nhellobanma.com\nhellobike.com\nhellobiye.com\nhellocq.com\nhellocq.net\nhellodive.com\nhellof1.com\nhelloflask.com\nhellogame.net\nhellogithub.com\nhellogitlab.com\nhelloglobal.com\nhellogroup.vip\nhellogslb.com\nhellohnb.com\nhellohuohu.com\nhelloimg.com\nhelloinstruments.com\nhellojava.com\nhellokid.com\nhellokidvip.com\nhellomeowlab.com\nhellomida.com\nhellonitrack.com\nhellopcb.com\nhellorf.com\nhellostreetcat.com\nhellotalk8.com\nhellotw.com\nhellotyping.com\nhelloweba.com\nhelloweba.net\nhellowebfont.com\nhellowgame.com\nhelloworld.net\nhelloxjn.com\nhelloxkb.com\nhelloyao.com\nhelmicro.com\nhelmtower.com\nhelnon.com\nhelo11.com\nhelohub.com\nhelp-w.com\nhelpmeng.com\nhelpmepick.net\nhelps.live\nhelpson.com\nhelpton.com\nhelptousa.com\nhelpweixin.com\nhelunyun.com\nheluowenhua.net\nhelywin.com\nhema.ren\nhema.wiki\nhemahuashi.com\nhemaish.com\nhemajs.com\nhemamax.com\nhemanc.com\nhemanzi.com\nhemaos.com\nhemaread.com\nhemaxiaofen.com\nhemayouxi.com\nhemayouxi.net\nhemayun.com\nhemayx.com\nhemetal.com\nhempelgroup.com\nhen360.com\nhenai.com\nhenaiwan.com\nhenan100.com\nhenanart.com\nhenanbojin.com\nhenance.com\nhenancme.net\nhenanfucai.com\nhenangames.com\nhenaninfo.com\nhenanjianling.com\nhenanjiqiren.com\nhenanjubao.com\nhenanrc.com\nhenansha.com\nhenanshengtang.com\nhenansyj.com\nhenanxinjiang.com\nhenanyikayi.com\nhenanyixue.com\nhenanzhida.com\nhenanzsb.com\nhenau.net\nhenbt.com\nhencin.com\nhencoder.com\nhendera.com\nhenduofang.com\nheng-f.com\nheng98.com\nhengan-instruments.com\nhengansl.com\nhengaodebj.com\nhengbao.com\nhengbaochuju.com\nhengbinzl.com\nhengbogroup.com\nhengchangda.com\nhengdafilm.com\nhengdafuji.com\nhengdawenbo.com\nhengdaxincai.com\nhengdayun.com\nhengdeegroup.com\nhengdian.com\nhengdianfilm.com\nhengdianworld.com\nhengdrive.com\nhengdulaw.com\nhengfang.com\nhengfasd.com\nhengfengtires.com\nhengfujz.com\nhenggufood.com\nhenghe-group.com\nhenghe666.com\nhenghengmao.com\nhenghongjixie.com\nhengjiafish.net\nhengjianyy.com\nhengjiatouzi.com\nhengjiecdn.com\nhengjiu-pt.com\nhengjixiaofang.com\nhengkun.com\nhengli.com\nhengliguoji.com\nhenglihotels.com\nhengqian.com\nhengqifeng.com\nhengqijy.com\nhengqikuaiji.com\nhengqinmarathon.com\nhengrui.com\nhengruisensor.com\nhengshan01.com\nhengshanpharm.com\nhengshengpark.com\nhengshuilaobaigan.net\nhengshuiyake.com\nhengtai-law.com\nhengtaiboyuan.com\nhengtiansoft.com\nhengtianyun.com\nhengtonggf.com\nhengtonggroup.com\nhengtonglog.com\nhengtongzhineng.com\nhengxiangtaji.com\nhengxinjinshu.com\nhengxinyongli.com\nhengxucapital.com\nhengxueedu.com\nhengyagongshui.com\nhengyan.com\nhengyankeji.com\nhengyemould.com\nhengyi.com\nhengyimining.com\nhengyishihua.com\nhengyoux.com\nhengyu.work\nhengyuansilk.com\nhengyuanzn.com\nhengyudata.com\nhengyuefund.com\nhengyulighting.com\nhenha.com\nhenhaoji.com\nhenku.com\nhenkuai.com\nhenkung.com\nhenlius.com\nhenluoli.com\nhenmimang.com\nhenningchem.com\nhenovcom.com\nhenrayglass.com\nhenri.ren\nhensctai.com\nhensgroup.com\nhenzan.com\nhenzanapp.com\nheodoraiu.com\nhepalink.com\nhepan.com\nhepan.org\nhepartshome.com\nhepatox.org\nhepingdao.net\nhepmall.com\nhepost.com\nhepu123.com\nhepurc.com\nhepuwang.com\nhepuweilai.com\nhepuxw.com\nheqingloong.com\nhercity.com\nhercules-logistics.com\nhercules-micro.com\nherdacdn.com\nherdar.com\nherdcloud.com\nherdpcdn.com\nherdsric.com\nhere120.com\nhere325.com\nherecdn.com\nheredlift.com\nherenit.com\nherllamo-med.com\nherllamo.com\nhermod1.com\nhero-geek.com\nhero.com\nherocoming.com\nheroesports.com\nherogame.com\nherohr.net\nheroic-ltd.com\nheroje.com\nheroone.com\nherosanctuary.com\nheroskate.com\nherostart.com\nheroworld.net\nherrel.com\nherrywatch.com\nherstime.com\nherta.space\nherton.net\nhertzhu.com\nheryipharma.com\nheshanghuitong.com\nheshdity.com\nheshecasa.com\nheshimilk.com\nheshui.com\nheshuyun.com\nheson10.com\nhesongwang.com\nhesppe.com\nhessianhealth.com\nhestudio.net\nheta.tech\nhetaigroup.net\nhetaixin.com\nhetao101.com\nhetaoa.com\nhetaoapis.com\nhetaobiancheng.com\nhetaocdn.com\nhetaodaxue.com\nhetaointernal.com\nhetaolin.com\nhetaousercontent.com\nhetaoxingqiu.com\nhetianlab.com\nhetianyu.cc\nhetongamp.com\nhetunzu.com\nhetusoft.com\nheu8.com\nheungkong.com\nheupxtct.work\nheuvan.com\nhewaner.com\nhewascreen.com\nheweather.com\nheweather.net\nhewebgl.com\nheweifurniture.com\nhewukeji.com\nhexaamc.com\nhexagonsemi.com\nhexchip.com\nhexdo.com\nhexgears.com\nhexi-electric.com\nhexian.ltd\nhexianbbs.com\nhexiangroup.com\nhexianrc.com\nhexiaoxiang.com\nhexicomtech.com\nhexie.cc\nhexieshaanxi.com\nhexilai.com\nhexin-puleather.com\nhexinchemical.com\nhexindai.com\nhexinli.org\nhexinwanjia.com\nhexiny.com\nhexinyu.com\nhexmeet.com\nhexsen.com\nhextower.com\nhexun.com\nhexun.com.tw\nhexuncaizhi.com\nhexuu.com\nheyang.cc\nheyang365.com\nheycan.com\nheycloudy.co\nheycode.com\nheycomrades.com\nheycross.com\nheycsm.com\nheydayinfo.com\nheygears.com\nheyi.com\nheyiguangye.com\nheyiguoyuan.com\nheyimiao.com\nheyingcn.com\nheyingedu.com\nheyinshiliu.com\nheyix.com\nheymeo.net\nheymeowfm.com\nheymore.com\nheyou51.com\nheyplus.com\nheyria.com\nheytap.com\nheytapcloud.com\nheytapcs.com\nheytapdownload.com\nheytapimage.com\nheytapmobi.com\nheytapugc.com\nheytea-co.com\nheytea.com\nheythings-iot.com\nheytime.com\nheyuanstone.com\nheyuanxw.com\nheyuhongfang.com\nheyun100.com\nheyunnet.com\nheywhale.com\nheywoodsminiprogram.com\nheyyo.com\nhez70.com\nheze.cc\nhezebus.com\nhezegd.com\nhezejob.com\nhezejtjt.com\nhezelawyers.org\nhezepharm.com\nhezeribao.com\nhezeswjt.com\nhezhidongli.com\nhezhong-china.com\nhezhongyihua.com\nhezhouhuatong.com\nhezhoujcy.com\nhezi.com\nhezibook.com\nhezijia.com\nhezimi.com\nhezongyy.com\nhezuvip.com\nhf-alu.com\nhf-aw.com\nhf-iflysse.com\nhf0779.com\nhf10000.com\nhf12345.vip\nhf168.net\nhf365.com\nhf3owy4.sbs\nhf777.com\nhf960.com\nhfabiao.com\nhfairport.com\nhfanss.com\nhfbaogao.com\nhfbaozi.com\nhfbcjt.com\nhfbeta.com\nhfbtv.com\nhfbz.com\nhfcentury.com\nhfchosp.com\nhfchzyy120.com\nhfcsbc.com\nhfdaoyuan.com\nhfdsgs.com\nhfeec-tencentclb.cloud\nhfeec-tencentclb.com\nhfeec-tencentclb.net\nhfeec-tencentclb.work\nhffhq.com\nhffoil.com\nhffund.com\nhffy.com\nhfgcxx.com\nhfgdjt.com\nhfgip.com\nhfgjj.com\nhfgxbus.com\nhfhm.com\nhfhouse.com\nhfhuamei.com\nhfhwbgyp.com\nhfi-health.com\nhfish.net\nhfjnxh.com\nhfjscn.com\nhfjsj.com\nhfjtjt.com\nhfjxwz.com\nhfjzzsxh.com\nhfkeheng.com\nhfkenfan.com\nhfkjsd.com\nhfkktt.com\nhfksmdl.com\nhflbysm.com\nhfleda.net\nhflengku.com\nhflp88.com\nhflube.com\nhfly.net\nhflz.com\nhfmama.com\nhfmdzx.com\nhfmt.net\nhfmxs.com\nhfnuola.com\nhfoj.net\nhfplg.com\nhfpx.cc\nhfqgmagnet.com\nhfqinhang.com\nhfray.com\nhfrc.net\nhfrcbc.com\nhfrsggff.com\nhfsava.com\nhfshec.com\nhfsia.com\nhfsid.com\nhfspxh.com\nhfssw.com\nhfsszgcxh.com\nhfswcz.com\nhft-sz.com\nhftfund.com\nhfthink.com\nhftogo.com\nhftsoft.com\nhftx-jt.com\nhfw.cc\nhfx.net\nhfxczj.com\nhfyestar.com\nhfykd.com\nhfykt.com\nhfyouqi.com\nhfyt365.com\nhfyuqin.com\nhfyyhyxh.com\nhfyylcy.com\nhfzfzlw.com\nhfzhengxu.com\nhfzjxh.com\nhfzkgw.com\nhfzls.com\nhfzssw.com\nhg-automation.com\nhg-capacitor.com\nhg-daigou.com\nhg-valves.com\nhg1218.com\nhg12333.com\nhg5177.com\nhg568.com\nhg8880.org\nhg9895.com\nhga994.com\nhgaas.com\nhgcapsule.com\nhgcha.com\nhgchess.com\nhgcitech.com\nhgepc.com\nhgfdrf.com\nhghngroup.com\nhghsd.com\nhgicreate.com\nhgimage.com\nhgitv.com\nhgj.com\nhgj668.com\nhgjart.com\nhgjl.net\nhgjob.com\nhgk-group.com\nhglaser.com\nhgmai.com\nhgmri.com\nhgnc.net\nhgo06070uyi.com\nhgo06071uyi.com\nhgo06080uyi.com\nhgo06081uyi.com\nhgo06090uyi.com\nhgo06091uyi.com\nhgo06101uyi.com\nhgo06111uyi.com\nhgobox.com\nhgoqi.com\nhgptech.com\nhgqizhong.com\nhgqrx.com\nhgs001.com\nhgscn.com\nhgsfy.com\nhgsj.com\nhgskjc.com\nhgskyray.com\nhgsyiyuan.com\nhgszyyy.com\nhgto.cc\nhgty5533.com\nhgty663.com\nhgty7598.com\nhguduo.com\nhgvalve.com\nhgveejt270.vip\nhgxxgz.com\nhgxxgz.net\nhgyrnk.com\nhgyys.com\nhgzk.com\nhgzkb.com\nhgzrt.com\nhgzxgz.com\nhgzxgz.net\nhgzxzc.com\nhgzyxy.com\nhh-gltd.com\nhh-honghu.com\nhh-jt.com\nhh-medic.com\nhh-pcbs.com\nhh-pmp.com\nhh-post.com\nhh.global\nhh010.com\nhh88hh.com\nhhaqpx.com\nhhax.org\nhhbraider.com\nhhbwff.com\nhhchampion.com\nhhchsw.com\nhhcjjy.com\nhhclby.com\nhhcn.com\nhhcx-led.com\nhhcyt.com\nhhczy.com\nhhdglm.com\nhhdjc.com\nhhdna.net\nhhfdjz.com\nhhfxw.com\nhhglys.com\nhhh.tm\nhhh233.net\nhhh800.com\nhhh885.com\nhhhg258.com\nhhhji.com\nhhhkpb.com\nhhhoo.com\nhhhstz.com\nhhhtfdj.com\nhhhtfin.com\nhhhtscf.com\nhhhtyg.com\nhhitgroup.com\nhhjctest.com\nhhjgqh.com\nhhjsyxh.com\nhhjtcn.com\nhhju.com\nhhk365.com\nhhkaobo.com\nhhkin.com\nhhking.com\nhhkmls.com\nhhl1916.com\nhhlwchem.com\nhhmage.com\nhhmajiang.com\nhhmanhua.net\nhhnykg.com\nhhnynews.com\nhho-hawater.com\nhhojs.com\nhholy.com\nhhozw.com\nhhpcbs.com\nhhpj.net\nhhpmzp.com\nhhqs.xyz\nhhrcard.com\nhhrcw.com\nhhrdc.com\nhhrsks.com\nhhsilk.com\nhhsw6688hxcdn.com\nhhtmm.com\nhhtravel.com\nhhtravel.com.tw\nhhtvc.com\nhhup.com\nhhuubb.com\nhhuubb.net\nhhvv.com\nhhwenjian.com\nhhwindowmesh.com\nhhwl88.com\nhhxfqc.com\nhhxnycl.com\nhhxnyqc.com\nhhy0.com\nhhycdk.com\nhhygame.com\nhhygames.com\nhhytm.com\nhhyungu.com\nhhyy.com\nhhyy100.com\nhhzls.com\nhhzm88.com\nhhzyjng.com\nhi-54.com\nhi-books.com\nhi-cloud.net\nhi-davids.com\nhi-gtd.com\nhi-lead.com\nhi-linux.com\nhi-mantech.com\nhi-roy.com\nhi-sm.com\nhi-spider.com\nhi-techspring.com\nhi-trend.com\nhi0755.net\nhi138.com\nhi169.net\nhi1718.com\nhi2000.com\nhi2000.net\nhi772.com\nhiaiabc.com\nhiao.com\nhiapk.com\nhiascend.com\nhiascend.net\nhiavr.com\nhibace.com\nhibace.net\nhibbw.net\nhibea.com\nhibelarus.com\nhibgm.com\nhibixin.com\nhibogroup.com\nhibor.net\nhibor.org\nhibt.net\nhibtc.org\nhibusiness.com\nhibuzz.net\nhiby.cd\nhiby.com\nhibymusic.com\nhic.cloud\nhicamelia.com\nhicane.com\nhiccupx.xyz\nhicdma.com\nhiceon.com\nhichain.com\nhicheng.net\nhichina.com\nhichina.net\nhichipharm.com\nhichips.com\nhicitech.com\nhiclc.com\nhicling.com\nhicloud.com\nhicnhm.com\nhicomp.com\nhiconey.com\nhiconics-zn.com\nhiconics.com\nhicoo.net\nhicosmo.com\nhicp.net\nhicsharp.com\nhicss.net\nhiczp.com\nhid98ys.com\nhidery.com\nhidesigncloud.com\nhiditie.com\nhidna.net\nhidreamai.com\nhidva.com\nhiechangzhou.com\nhiecheimaetu.com\nhiencode.com\nhienshi.com\nhiersun-ido.com\nhiesquire.com\nhifangjia.com\nhifar.net\nhifengli.com\nhifi168.com\nhificat.com\nhifidig.com\nhifidiy.net\nhifime.net\nhifiok.com\nhifishuo.com\nhifiveai.com\nhifkw.com\nhifkw.xin\nhifleet.com\nhifly.mobi\nhifly.tv\nhifortune.net\nhifpga.com\nhifreud.com\nhifuntv.com\nhifuture.com\nhiger.com\nhigeshi.com\nhiggmm.net\nhigh-genius.com\nhigh20-playback.com\nhigh21-playback.com\nhigh22-playback.com\nhigh24-playback.com\nhigh25-playback.com\nhighdigitizing.com\nhighfaststudio.com\nhighfel.com\nhighfundcorp.com\nhighgo.com\nhighhope.com\nhighleveltrans.com\nhighlightoptics.com\nhighlionceramic.com\nhighlm.com\nhighly.cc\nhighsharp.com\nhighstar.com\nhightac.com\nhightopo.com\nhighwayguitar.com\nhigoldgroup.net\nhigon.com\nhigoshipping.com\nhigrand.com\nhiguchi.xyz\nhigy.org\nhiheartgo.com\nhihell.com\nhihocoder.com\nhihonor.com\nhihonorcdn.com\nhihonorcloud.com\nhihope.org\nhii-go.com\nhiido.net\nhiigame.net\nhiiibrand.com\nhiiyun.com\nhijackorg.net\nhijiangxi.com\nhijiaoshi.com\nhijin.vip\nhijoys.com\nhik-cloud.com\nhik-express.com\nhik-park.com\nhikailink.com\nhikari-ch.com\nhikauto.com\nhikcreate.com\nhikemobile.com\nhikerfans.com\nhikihj.com\nhikinginternational.com\nhikiot.com\nhiklife.com\nhikmall.com\nhikoon.com\nhikops.com\nhikparking.com\nhikrobotics.com\nhiksemitech.com\nhikstor.com\nhikstorage.com\nhikunpeng.com\nhikunpeng.net\nhikvision-jl.com\nhikvision.com\nhikvisionauto.com\nhikyun.com\nhilantu.com\nhilau.com\nhilbcd.com\nhile-bio.com\nhileap.com\nhilemic.com\nhilfv.com\nhiliad.com\nhiliwi.com\nhillelmilwaukee.org\nhilllei.com\nhillstonenet.com\nhillyton.com\nhilo8.com\nhiloletswin.com\nhilonggroup.com\nhiloong.com\nhilqq.com\nhiluluke.com\nhima.auto\nhimado.com\nhimaker.com\nhimalaya.com\nhimalaya.cool\nhimanufacture.com\nhimarking.com\nhimawari-japan.com\nhimehear.com\nhimeidian.com\nhimengyou.com\nhimetoo.com\nhimile.com\nhimin.com\nhimmpat.com\nhimoral.com\nhimorale.com\nhimorfei.com\nhin.cool\nhinabian.com\nhinabiotech.com\nhinavi.net\nhindiabp-lh.akamaihd.net\nhinocn.com\nhinotravel.com\nhinpy.com\nhinsyeow.org\nhintsnet.com\nhiofd.com\nhiooq0417.com\nhiosu.com\nhioug.com\nhiparking.com\nhipcam.net\nhipcapi.com\nhiphi.com\nhiphop8.com\nhiphotonics.com\nhipiao.com\nhipole.com\nhippoanimation.com\nhippter.com\nhipu.com\nhiputian.com\nhiqiyu.com\nhirain.com\nhiram1009-dw.org\nhirata-cn.com\nhirata-hts.com\nhirede.com\nhiregex.com\nhireye.com\nhirige.com\nhirisemed.com\nhirisun.com\nhiroop.com\nhirosspac.com\nhirossz.com\nhirtk.com\nhirunsport.com\nhis.sh\nhisaka-china.com\nhisavana.com\nhiscene.com\nhisdnoc.com\nhisense-home.com\nhisense-plaza.com\nhisense-syxs.com\nhisense.com\nhisensehitachi.com\nhisensekf.com\nhisern.com\nhishouhui.com\nhisilicon.com\nhisiphp.com\nhislota.com\nhismarttv.com\nhisoar.com\nhisoft.com\nhisofts.com\nhisonracking.com\nhistorychina.net\nhisugar.com\nhisunplas.com\nhisupplier.com\nhit180.com\nhitachi-helc.com\nhitalk.com\nhitalkers.com\nhitao.com\nhitbot.cc\nhitctf.com\nhite.me\nhitechfrp.com\nhiteksoft.com\nhitergas.com\nhitevision-solution.com\nhitevision-solutions.com\nhitevision.com\nhitgk.com\nhitnology.com\nhitoor.com\nhitouch.com\nhitoupiao.com\nhitour2005.com\nhitozumi.com\nhitpound.com\nhitqs.com\nhitrip.info\nhitsame.com\nhitui.com\nhitv.com\nhiusers.com\nhiveshared.com\nhivi.com\nhivictor.net\nhiwafer.com\nhiwaysemi.com\nhiwayslaw.com\nhiwbb.com\nhiwechats.com\nhiweixiu.com\nhiwelcom.com\nhiwiyi.com\nhiwms.com\nhiworld.com\nhiwuhuan.com\nhixgo.com\nhixianchang.com\nhixiaoe.com\nhixuexiao.net\nhiyd.com\nhiyongche.com\nhiyouib.com\nhiyouqu.com\nhiyun.site\nhiyun.tv\nhizaoan.com\nhizh.net\nhizhecheng.com\nhizj.net\nhizom.com\nhizyw.com\nhizyy.com\nhj-bits.com\nhj-dog.com\nhj-ienergy.com\nhj-mail.com\nhj-pack.com\nhj01.com\nhj110.com\nhj1951.com\nhj44103a1.shop\nhjapi.com\nhjasiancenter.com\nhjbbs.com\nhjbxw.com\nhjcadc.com\nhjchee.com\nhjcjifen.com\nhjckjt.com\nhjclass.com\nhjcm.net\nhjcpl.com\nhjd111.shop\nhjd123.com\nhjdhdduekcdie.com\nhjdict.com\nhjdns.com\nhjdns.net\nhjdshop.cc\nhjdzn.com\nhjenglish.com\nhjg365.com\nhjgcd.com\nhjgrp.com\nhjgtjt.com\nhjhrcloud.com\nhjido.com\nhjiesuan.com\nhjinternationalhotel.com\nhjiuye.com\nhjjg.com\nhjjh.com\nhjjt.net\nhjjunhua.com\nhjkhjkl.com\nhjkklj.com\nhjksjx.com\nhjlrw.com\nhjlw.com\nhjmarathon.com\nhjmtzb.com\nhjpcc.com\nhjpp.net\nhjr-exchange.com\nhjren.com\nhjsj.com\nhjtag.com\nhjunkel.com\nhjw169.com\nhjw68.com\nhjwsky.com\nhjwsxzz.com\nhjwxcps.com\nhjxcl.com\nhjxhg.com\nhjxry.com\nhjxsjx.com\nhjxtv.com\nhjy1314.com\nhjyanxue.com\nhjyc.com\nhjygame.com\nhjyl.org\nhjyyjt.com\nhjz4.com\nhjz518.com\nhjzlg.com\nhjzzcl.com\nhk-island.hk\nhk-jztzjt.com\nhk-pwc.com\nhk-sz.com\nhk-tencentclb.cloud\nhk-tencentclb.com\nhk-tencentclb.net\nhk-tencentclb.work\nhk-titan.com\nhk-vstart.com\nhk-xin.com\nhk.uy\nhk0523.com\nhk603.hk\nhk8668.com\nhk9.com\nhkaco.com\nhkaima.com\nhkance.com\nhkance.xyz\nhkanews.com\nhkaohua.com\nhkbchina.com\nhkca.club\nhkcd.com\nhkcgart.com\nhkchat.app\nhkcna.hk\nhkcoalition.com\nhkcpr.com\nhkctgbus.com\nhkcts.com\nhkctshotels.com\nhkctsmembers.com\nhkcwdc.com\nhkd82.com\nhkdfc.com\nhkdfgroup.com\nhkdqgroup.com\nhkdzxs.com\nhkexpressworld.com\nhkfc.hk\nhkfcchina.com\nhkfdi.com\nhkfe.hk\nhkfljt.com\nhkg3g299r4.com\nhkgcloudcs.com\nhkgcr.com\nhkgj07.com\nhkgjcz.com\nhkglink.xyz\nhkgol.com\nhkgsw.com\nhkgtedu.com\nhkgwater.com\nhkhdsyxx.com\nhkinsu.com\nhkinur.com\nhkjinxin.com\nhkjnn.com\nhkjsrent.com\nhkklock.com\nhkkuaiyixiu.com\nhklego.com\nhklmoto.com\nhklmxcx.com\nhklsqc.com\nhkm168.com\nhkmedtime.com\nhkmeinian.com\nhkmipo.com\nhkmjd.com\nhknbc.com\nhknet-inc.com\nhkoke.com\nhkpep.com\nhkproperty.com\nhkqbh.com\nhkroyal.com\nhkrsoft.com\nhksc888.com\nhkscxh.com\nhkserversolution.com\nhkslg520.com\nhkstv.tv\nhkt4.com\nhktheone.com\nhktidg.com\nhku-szh.org\nhkvisen.com\nhkwb.net\nhkwzig.com\nhkxbjt.com\nhkxen.com\nhkxtech.org\nhky360.com\nhkyukai.vip\nhkyxfgs.com\nhkyykq.com\nhkzlcm.com\nhl-bandao.com\nhl-brushes.com\nhl-epay.com\nhl-hengsheng.com\nhl95.com\nhl95001.com\nhlapi.com\nhlashop.com\nhlb2020.com\nhlbcks.com\nhlbe365.com\nhlbeixiu.com\nhlbeixiu.net\nhlbf.net\nhlblz.com\nhlbn.cc\nhlbryy.com\nhlcdn.cc\nhlchsw.com\nhlcm.net\nhlcode.net\nhld558.com\nhldbtv.com\nhldedu.com\nhldfcom.com\nhldgajjzd.com\nhldgp.com\nhldhouse.com\nhldhuanbao.com\nhldjob.com\nhldjz8.com\nhldmzg.com\nhldnews.com\nhldszxyy.com\nhlduanjian.com\nhledu.net\nhlej.com\nhlekk.org\nhletong.com\nhlgad.com\nhlgcj.com\nhlgdata.com\nhlgnet.com\nhlgnet.net\nhlhfjt.com\nhlhjapp.com\nhlhmf.com\nhlhqdj.com\nhlhs.cc\nhlhyc.com\nhljcqjy.com\nhljdata.net\nhljgvc.com\nhljgwy.net\nhljgzkj.com\nhljhgckj.com\nhljiasen.com\nhljjjb.com\nhljjkfp.com\nhljjytkj.com\nhljpm.com\nhljpost.com\nhljradio.com\nhljrcc.com\nhljsdm.com\nhljszjxhw.com\nhljtchina.com\nhljtcm.com\nhljtv.com\nhljtx.com\nhljucm.net\nhljxgs.com\nhljyestar.com\nhljyqnj.com\nhljyushi.com\nhljzc.net\nhljzl.icu\nhlkd.pro\nhlkkwl.com\nhlkncse.com\nhlktech.com\nhlkznsb.com\nhllinks.com\nhllives.com\nhlmmold.com\nhlnhw.com\nhlnmg.com\nhlnpic.com\nhlnpm.com\nhlo-trade.com\nhloong.com\nhlqiaojia.com\nhlqxj.com\nhlread.com\nhls-1.wamu.org\nhls-video01.cdnvideo.ru\nhls.cdn.ua\nhls.kqed.org\nhls.qguiyang.com\nhls.qxtv0763.com\nhls.wlrn.mobi\nhlsdq.com\nhlsimu.com\nhltmsp.com\nhltx.net\nhlupr.com\nhlvitamin.com\nhlw1588.com\nhlwarp.com\nhlwidc.com\nhlwjnm.com\nhlwwhy.com\nhlxky.com\nhlxstipark.com\nhlxsykd.com\nhlxsz.com\nhlxy.com\nhlybar.com\nhlyds.com\nhlyiq.com\nhlytec.com\nhlyy8.com\nhlyykp.com\nhlzaojia.com\nhlzq.com\nhlzqgs.com\nhlzzkj.com\nhm-3223.net\nhm-optics.com\nhm025.com\nhm120.com\nhm152n.com\nhm163.net\nhm16888.net\nhm169.com\nhm588.com\nhm5988.com\nhmadgz.com\nhmarathon.com\nhmbzfjt.com\nhmchina.com\nhmcl.net\nhmdx.net\nhmedu.com\nhmeili.com\nhmf-china.com\nhmfxw.com\nhmgbtv.com\nhmgj.com\nhmgreat.com\nhminvestment.com\nhmj666.com\nhmjblog.com\nhmjc.org\nhmkp.org\nhmlan.com\nhmlcar.com\nhmltec.com\nhmly666.cc\nhmmachine.com\nhmmryk.com\nhmnst.com\nhmoe.link\nhmplay.com\nhmqg.com\nhmqjsb.com\nhmrczp.com\nhmrsrc.com\nhmsemi.com\nhmszkj.com\nhmtgo.com\nhmting.com\nhmtnew.com\nhmtrhf.com\nhmus.net\nhmwdj.com\nhmwzjs.com\nhmx-led.com\nhmx3556y0o.com\nhmxixie.com\nhmxw.com\nhmxx.net\nhmyzs.com\nhmz.com\nhmz8.com\nhmzhtc.cc\nhmzhtc.com\nhmzixin.com\nhmzjzx.com\nhmzs.net\nhmzx163.com\nhn-binglang.com\nhn-cbec.com\nhn-hwqjxh.com\nhn-medical.com\nhn-xqlhw.com\nhn0746.com\nhn165.com\nhn96520.com\nhn9mu.com\nhnacargo.com\nhnacgs.com\nhnaec.com\nhnaec.org\nhnaee.com\nhnafxh.com\nhnagroup.com\nhnagroup.net\nhnainfrastructure.com\nhnair.com\nhnair.net\nhnaiya.com\nhnamdi.com\nhnangel.com\nhnanqi.com\nhnapay.com\nhnasatc.com\nhnaues.com\nhnbaili.net\nhnbemc.com\nhnbidding.com\nhnbits.com\nhnblc.com\nhnbljy.com\nhnblly.com\nhnbntv.com\nhnbrush.com\nhnbsq.com\nhnbtcy.com\nhnccpit.org\nhnceg.com\nhncfa.com\nhncgkgjt.com\nhnchaosu.com\nhnchemtech.com\nhnchuangj.net\nhnchuangxiangkj.com\nhncj.com\nhncloud.com\nhncmsx.com\nhncnedu.com\nhncost.com\nhncourt.org\nhncpu.com\nhncreate.com\nhncsart.com\nhncsmtr.com\nhncsvod.com\nhnct56.com\nhnctw.com\nhncu.net\nhncwc.com\nhncxwater.com\nhncytxly.com\nhncyzx.com\nhndbsp.com\nhndca.com\nhndcyg.com\nhndec.com\nhndfbg.com\nhndfsrmyy.com\nhndgxh.com\nhndhsyjt.com\nhndlhx.com\nhndlks.com\nhndmtjc.com\nhndnews.com\nhndpf.org\nhndpx.com\nhnds88.com\nhndscg.com\nhndsyy.com\nhndt.com\nhndxzte.com\nhndybus.com\nhndysx.com\nhndz413.com\nhndzxh.com\nhnechz.com\nhnedition.com\nhnedutv.com\nhnerkang.com\nhnetn.com\nhnetyy.net\nhnfa.org\nhnfapiao.com\nhnfcis.com\nhnfcjr.com\nhnfck.com\nhnfjz.com\nhnfles.com\nhnfudu.com\nhnfyqmj.com\nhnfysg.com\nhngajs.com\nhngangjiegou.com\nhngbjy.com\nhngdkg.com\nhngh.org\nhnghzl.com\nhngjj.net\nhngjx.com\nhngks.com\nhngoldcorp.com\nhngpmall.com\nhngqjc.com\nhngs.net\nhngscloud.com\nhngsetc.com\nhngtrust.com\nhngwg.com\nhngwkj.net\nhngwmt.com\nhngwy.org\nhngwzk.com\nhngx.net\nhngyms.com\nhnh.cc\nhnhaofang.com\nhnhbyxdq.com\nhnhcrn.com\nhnhdxd.com\nhnhflqgc.com\nhnhho.com\nhnhj.net\nhnhjjx.com\nhnhlpp.com\nhnhnled.com\nhnhp.com\nhnhsjt.com\nhnht56.com\nhnhtdg.com\nhnhw.com\nhnhwly.com\nhnhxin.com\nhnhxs.com\nhnhxxk.com\nhnhyfm.com\nhnhylx.com\nhnhyrc.com\nhnhyt.com\nhniec.org\nhniic.com\nhnijunhai.com\nhninsure.com\nhnisca.org\nhniso.net\nhnisvc.com\nhnitedu.org\nhnjbwh.com\nhnjcly.com\nhnjg.com\nhnjiabao.com\nhnjing.com\nhnjing.net\nhnjinmaizi.com\nhnjkjn.com\nhnjkw.net\nhnjme.com\nhnjmsk.com\nhnjshzy.com\nhnjsrcw.com\nhnjtcl.com\nhnjttz.com\nhnjudarhr.com\nhnjuhuo.com\nhnjyyz.com\nhnjzy.org\nhnkcjt.com\nhnks.com\nhnksgf.com\nhnktgame.com\nhnktzz.com\nhnkxy.com\nhnkygas.com\nhnkzy.com\nhnlantian.com\nhnlat.com\nhnlawyer.org\nhnlbdl.com\nhnleisu.com\nhnlens.com\nhnliangku.com\nhnlipu.com\nhnlshm.com\nhnlxq.com\nhnlzhd.com\nhnlzw.net\nhnmangshan.com\nhnmcymy.com\nhnmdtv.com\nhnmgjr.com\nhnming.com\nhnmjyy.com\nhnmks.com\nhnmlqianpan.com\nhnmqtt.com\nhnmrffm888.com\nhnmsg.com\nhnmsw.com\nhnmudi.com\nhnmuseum.com\nhnmyjt.com\nhnmzmy.com\nhnnanshang.com\nhnnbwdiaosu.com\nhnnews.cc\nhnnhyy.com\nhnninglian.com\nhnnkyy.com\nhnnx.com\nhnnxs.com\nhnnyrzzl.com\nhnnzwhyy.com\nhnoak.com\nhnoceanrace.com\nhnoexpo.com\nhnoscar.com\nhnpdig.com\nhnpfw.com\nhnpic.com\nhnpm.cc\nhnpolice.com\nhnpta.com\nhnptschool.net\nhnpwholesale.com.au\nhnqczy.com\nhnqfseed.com\nhnqinshi.com\nhnqlhj.com\nhnqljj.com\nhnqljt.com\nhnqnw.com\nhnquxing.com\nhnquyou.com\nhnqz.net\nhnradio.com\nhnrcjl.com\nhnrcjob.com\nhnrcsc.com\nhnrcsc.net\nhnrczpw.com\nhnredcross.com\nhnrich.net\nhnrmb.com\nhnrmtjg.com\nhnrmzy.com\nhnrpc.com\nhnrrco.com\nhnrsks.com\nhnrszhjc.com\nhnryly.com\nhns4j.com\nhns5j.com\nhnsbxl.com\nhnsd2fz.com\nhnsdfz.org\nhnsdzjy.com\nhnsdzsrmyy.com\nhnsfdc.com\nhnsfjy.net\nhnsggzy.com\nhnsghsljt.com\nhnsgkb.com\nhnshengben.com\nhnshqfz.com\nhnshuntian.com\nhnshyzx.com\nhnsiia.com\nhnsilane.com\nhnsite.cc\nhnsiwei.com\nhnsjgroup.com\nhnsjlh.com\nhnsjrd.com\nhnsktc.com\nhnskxy.com\nhnsky.net\nhnslsdxy.com\nhnslshyxh.com\nhnslxh.com\nhnslytz.com\nhnsnnews.com\nhnsoftedu.com\nhnsong.net\nhnsqtg.com\nhnsrmyy.com\nhnsrmyy.net\nhnssjn.com\nhnssyhbkj.com\nhnssyxx.com\nhnst.org\nhnstandards.com\nhnster.com\nhnstguolu.net\nhnstjsjt.com\nhnswljt.com\nhnswsjy.com\nhnswxy.com\nhnsyda.com\nhnsygroup.com\nhnsyhj.com\nhnsyhm.com\nhnsyu.net\nhnsyyq.com\nhnsyzls.com\nhnsyzxyy.com\nhnszn.com\nhnszyxy.com\nhntba.com\nhntbpm.com\nhntchq.com\nhntcm.com\nhntcmc.net\nhntele.com\nhnthrq.com\nhntiannuo.net\nhntianyue.com\nhntic.com\nhnticai.com\nhntican.com\nhntkg1.com\nhntky.com\nhntlxh.com\nhntncdn.com\nhntobacco.com\nhntqb.com\nhntv.tv\nhntxcd.com\nhntxxy.com\nhntzyy.com\nhnubbs.com\nhnucc.com\nhnukai.com\nhnwanglong.com\nhnwbxx.com\nhnwca.com\nhnwcl.com\nhnwczx.com\nhnwd.com\nhnwdhk.com\nhnwhg.org\nhnwhjy.com\nhnwisecom.com\nhnwlcm.com\nhnwlxh.com\nhnwlxh.net\nhnwlycg.com\nhnwsbz.com\nhnwtqx.com\nhnwwsjzx.com\nhnwyxx.com\nhnwz8.com\nhnwzinfo.com\nhnxdf.com\nhnxfpfb.com\nhnxggas.com\nhnxhdn.com\nhnxhnews.com\nhnxhyl.com\nhnxingda.com\nhnxljkj.com\nhnxmht.com\nhnxtkg.com\nhnxttv.com\nhnxunch.com\nhnxuntang.com\nhnxxc.com\nhnxxyz.com\nhnxzctec.com\nhnyanglao.com\nhnyaoshan.com\nhnyaosi.com\nhnydf.net\nhnydgl.com\nhnyesf.com\nhnyfkj.com\nhnyichang.com\nhnyingfang.com\nhnyinhan.com\nhnyixiao.com\nhnysfww.com\nhnytgt.com\nhnyuanhong.com\nhnyuanyou.com\nhnyuedu.com\nhnyunji.com\nhnyunsutong.com\nhnyunzhiyi.com\nhnyuyuhui.com\nhnyydg.com\nhnyygroup.com\nhnyyws.com\nhnyyxj.com\nhnyyyfsyy.com\nhnyyyz.com\nhnyzfwlkj.com\nhnyzzy.com\nhnzdjsj.com\nhnzfcgxh.com\nhnzfgjj.com\nhnzhangkun.com\nhnzhaobiao.com\nhnzhijiang.com\nhnzhongzhuan.com\nhnzhouyi.com\nhnzhy.com\nhnzjgdkj.com\nhnzjip.com\nhnzjj.com\nhnzjyl.com\nhnzkclouds.com\nhnzkhbsb.com\nhnzlyy.com\nhnzm.vip\nhnzoc.com\nhnzose.com\nhnzqw.com\nhnzrjy.com\nhnzrsc.com\nhnzsbw.com\nhnzsxh.com\nhnztb.org\nhnztdq.com\nhnztfs.com\nhnztqzjx.com\nhnzxyy.com\nhnzycfc.com\nhnzyfy.com\nhnzywh.xyz\nhnzyxckj.com\nhnzyydx.com\nhnzyzx.com\nhnzzjob.com\nhnzzlh.com\nhnzzms.com\nhnzzrc.com\nhoau.net\nhobalab.com\nhobby-eagle.net\nhobbyboss.com\nhobosgroup.com\nhocheymed.com\nhochitech.com\nhocode.com\nhocodo.com\nhodgen-china.com\nhodiasflavor.com\nhodo170.com\nhodoop.com\nhoehub.com\nhofcc.com\nhogacn.com\nhogasky.com\nhogesoft.com\nhoghu.com\nhogon17.com\nhoho123.com\nhoho666.com\nhohode.com\nhoilon.com\nhoing.net\nhoisen.com\nhojonn.com\nhok5v5.com\nhokai.com\nhokori.online\nhokparts.com\nhold168.com\nholder-pharm.com\nholdhr.com\nholdsteel.com\nholdtwo.com\nholichip.com\nholike.com\nholiland.com\nholine.com\nholkx.com\nholleykingkong.com\nhollischuang.com\nhollisterco.com\nhollwingroup.com\nhollycrm.com\nhollysource.com\nhollysys.com\nhollyuc.com\nhollywant.com\nholmesbio.com\nholmesian.org\nholoalpha.com\nholoremax.com\nholsauto.com\nholteksupport.com\nholyfunny.com\nholymalls.com\nholyxiongan.com\nhome0311.com\nhome0538.com\nhome0668.com\nhome133.com\nhome178.com\nhome898.com\nhomearch.com\nhomearch.shop\nhomearch.store\nhomearch.vip\nhomeartschina.com\nhomebaseradiators.com\nhomebehind.com\nhomecdn.com\nhomed.me\nhomedgroup.com\nhomedo.com\nhomeindus.com\nhomeinframes.com\nhomeinmists.com\nhomeinns.com\nhomeintour.com\nhomekeji.com\nhomeking365.com\nhomekingcdn.com\nhomekoo.com\nhomekoocdn.com\nhomelandhotel.com\nhomelandol.com\nhomesir110.com\nhomestyler.com\nhometex114.com\nhometexjoin.com\nhometexnet.com\nhometol.com\nhomey-household.com\nhomeyao.com\nhomhow.com\nhommk.com\nhomolo.com\nhomolo.net\nhomsoboard.com\nhomsuncap.com\nhomylogistics.com\nhomyu.com\nhonaenergy.com\nhonbro.com\nhonchmedia.com\nhonco88.com\nhonda-sundiro.com\nhonder.com\nhondugroup.com\nhonestmc.com\nhonestread.com\nhonesty-environ.com\nhonf.net\nhong-lawfirm.com\nhong-shun.com\nhongbao.com\nhongbao.sh\nhongbao.show\nhongbaoli.com\nhongbeibang.com\nhongbeicn.com\nhongbizi.org\nhongbo-group.com\nhongbo-sh.com\nhongbo100.com\nhongboluo.com\nhongcesys.com\nhongchangpawn.com\nhongchisw.com\nhongchuangholding.com\nhongda-steeltube.com\nhongdaishu.com\nhongdamach.com\nhongdatec.com\nhongdefund.com\nhongdian.com\nhongdianfund.com\nhongdongpumps.com\nhongdou.com\nhongdoufm.com\nhongdoulive.com\nhongen.com\nhongfasi.net\nhongfengye.com\nhongfuloi.com\nhongganshebei.net\nhongguogame.com\nhongguoyouxi.com\nhonghaibengye.com\nhonghaish.com\nhonghe-tech.com\nhongheiku.com\nhonghu-muffler.com\nhonghuajz.com\nhonghuotai.com\nhonghusaas.com\nhonghusoft.com\nhongjia138.com\nhongjiang.info\nhongjibp.com\nhongjiejia.com\nhongjigroupsz.com\nhongjin2.com\nhongjing-wh.com\nhongjing.com\nhongjing3.com\nhongjingedu.com\nhongjinleather.com\nhongkang-life.com\nhongkegd.com\nhongkeyun.com\nhongkongairlines.com\nhongkonganran.com\nhongkongmeixie.com\nhongku.com\nhongkun-tech.com\nhongkunjinfu.com\nhonglan123.com\nhonglans.com\nhonglimfg.com\nhonglimingbiao.com\nhonglipai.net\nhonglumedia.com\nhongm.com\nhongmaoshiye.com\nhongmeiti.com\nhongmeiti.net\nhongmen.cc\nhongmen.com\nhongmingbus.com\nhongmo.xyz\nhongmoka.com\nhongmu.com\nhongniang.com\nhongniuzyimage.com\nhongpai.com\nhongpig.com\nhongqi.tv\nhongqiangmjg.com\nhongqiaochina.com\nhongqipharma.com\nhongqipress.com\nhongrenyiyuan.com\nhongrida.com\nhongrinongye.com\nhongrizi.com\nhongru.com\nhongruihuanjing.com\nhongruike.com\nhongsanban.com\nhongsat.com\nhongsegs.com\nhongsejiqing.com\nhongsenlin.com\nhongshan.com\nhongshang-led.com\nhongsheng-group.com\nhongsheng.shop\nhongshi88.com\nhongshigroup.com\nhongshipaint.com\nhongshizi.org\nhongshn.xyz\nhongshu.com\nhongshunet.com\nhongshunth.com\nhongshuxiao.com\nhongsong.club\nhongsong.info\nhongsungifts.com\nhongta.com\nhongtaijixie.com\nhongtair.com\nhongtaiscp.com\nhongtaiwy.com\nhongtastock.com\nhongtelecom.com\nhongtong588.com\nhongtongtube.com\nhongttel.com\nhongtu.net\nhongtu56.com\nhongtucad.com\nhongtunetwork.com\nhongvv.com\nhongwenfeh.com\nhongwu.com\nhongwuhuan.com\nhongxiangzaixian.com\nhongxiaolong.com\nhongxingdl.com\nhongxingdl.love\nhongxinglin.com\nhongxingshangye.com\nhongxingzhonggong.com\nhongxingzn.com\nhongxiu.cc\nhongxiu.com\nhongxiu158.com\nhongyan-e.com\nhongyan.info\nhongyangsoft.com\nhongyangxiezi.com\nhongyanhr.com\nhongyanjin.com\nhongyanliren.com\nhongyans.com\nhongyantruck.com\nhongyaomall.com\nhongyawang.com\nhongyejixie.com\nhongyewuyang.com\nhongyi5.com\nhongyikun.com\nhongyimarine.com\nhongyirong.com\nhongyu-qi.com\nhongyuanpharm.com\nhongyuanqh.com\nhongyue.com\nhongyugroup.com\nhongyugz.com\nhongyumedical.com\nhongyunduo.com\nhongyuntx.com\nhongyunvren.com\nhongyuzps.com\nhongze.net\nhongze365.com\nhongzerc.com\nhongzetai.com\nhongzhengchem.com\nhongzhentextile.com\nhongzhigongzuowang.com\nhongzhoukan.com\nhongzhuangyuan.com\nhongzhuojituan.com\nhonhan.ltd\nhonkaiimpact3.com\nhonkaistarrail.com\nhonkonlaser.com\nhonlyu.com\nhonor.com\nhonorfair.com\nhonorfile.com\nhonorofkings.com\nhonpc.com\nhonpery.com\nhonsea.com\nhonson-china.com\nhonsonch.com\nhonstarmemory.com\nhonsuntec.com\nhonyanwl.com\nhonycapital.com\nhonyfunds.com\nhonyone.com\nhonyuan.net\nhooan.net\nhoodinn.com\nhoodong.com\nhooenergy.com\nhooh5.com\nhookan.com\nhoolai.com\nhoolaigames.com\nhoolee8.com\nhoolinks.com\nhoolo.tv\nhoonup.com\nhoop-archi.com\nhoopchina.com\nhoopugames.net\nhoosho.com\nhooshun.com\nhoosuntec.com\nhooya.hk\nhooyagroup.com\nhooyoo.com\nhope-bridge.com\nhope-m.com\nhopebank.com\nhopebeauty.com\nhopebiol.com\nhopebook.net\nhopechart.com\nhopecool.com\nhopeda.com\nhopegoocdn.com\nhopehook.com\nhopemedinc.com\nhopenoah.com\nhoperun.com\nhopes-tech.com\nhopetrip.com.hk\nhopexr.com\nhophingfood.com\nhopoot.com\nhopsontong.com\nhorace-liu.com\nhorain.net\nhoran.cc\nhorchips.com\nhori-gz.com\nhori3d.com\nhoribaprecision.com\nhorigames.com\nhorion.com\nhorionsw.com\nhorizon-china.com\nhorizon.ai\nhorizon.auto\nhorizon.cc\nhorizonfuelcell.com\nhorizonlawyers.com\nhorizonrcg.com\nhorizonsanya.com\nhorju.com\nhorn-yacht.com\nhornetcorn.com\nhorosama.com\nhorou.com\nhorphoto.com\nhorsebrowser.com\nhorsechinaone.com\nhorti-expo2019.com\nhortor-comic.com\nhortor.net\nhortor002.com\nhortor005.com\nhortor020.com\nhortorgames.com\nhorwathhtl-cn.com\nhosane.com\nhoscogroup.com\nhosgs.com\nhoshinesilicon.com\nhoshiroko.com\nhosjoy.com\nhoslen-sh.com\nhosn168.com\nhosno7.com\nhosonglass.com\nhosory.com\nhosowin.com\nhospit.net\nhospital-cqjs.com\nhospital-cqmu.com\nhospital2.com\nhospitalkg.com\nhospitalshy.com\nhospitalstar.com\nhospite.com\nhost263.com\nhost888.net\nhostacc.net\nhostacc1.com\nhostacc2.com\nhostadm.net\nhostbbs.net\nhostbuf.com\nhostdie.com\nhostgw.net\nhostidc.net\nhostkvm.com\nhostloc.me\nhostmonit.com\nhostoexp.com\nhostxen.com\nhot-test.org\nhot0755.com\nhotalk.com\nhotata.com\nhotborn.com\nhotchenghong.com\nhotdb.com\nhoteamsoft.com\nhoteastday.com\nhotel-noir-film.com\nhotel-ochsen-hardheim.com\nhotelbaijin.com\nhotelcis.com\nhotelgg.com\nhoteljianguo.com\nhotelpanpacific.com\nhotelsjianguo.com\nhotelvi.com\nhotelyunos.com\nhotent.com\nhotent.xyz\nhotgamehl.com\nhotgopark.com\nhotiis.com\nhotkey123.com\nhotkidclub.com\nhotking.com\nhotlcd.com\nhotlinegames-jp.net\nhotnewx.com\nhotone.com\nhotoneaudio.com\nhotoos.com\nhotpotstq.com\nhotpub.com\nhotread.com\nhotsales.net\nhotsnow.club\nhotsnow.org\nhotsoonapp.com\nhotsoonapp.net\nhotsoonvideo.com\nhotsoonvideo.net\nhotsoonzb.com\nhotsoonzb.net\nhotssp.com\nhotstoday.com\nhottechsemi.com\nhottui.com\nhotwatchsreplica.com\nhotwind.net\nhotwindbox.com\nhotwon.com\nhotxf.com\nhotyihao.com\nhou5.com\nhoucaller.com\nhoudao.com\nhoudao.net\nhoudask.com\nhoudewl.com\nhoudy.com\nhoufaka.com\nhoufangyiyao.com\nhouge.com\nhouhoucn.com\nhoujiji.com\nhoujt.com\nhoukai.com\nhoukuanshop.com\nhoulangsports.com\nhoumoai.com\nhoungfuh.com\nhouniaohao.com\nhouniaotrip.com\nhouniaoyc.com\nhoupukeji.com\nhouqigo.com\nhouqinbao.com\nhouqun.net\nhouquner.com\nhourt-cert.com\nhourui-arch.net\nhouse086.com\nhouse178.com\nhouse365.com\nhouse5.net\nhouse510.com\nhouse86.com\nhouseimg.com\nhouseoftantra.org\nhoushaoan.com\nhousoo.com\nhouwenfei.com\nhouwuedu.com\nhouxue.com\nhouyicaiji.com\nhouyuantuan.com\nhouzhibo.com\nhouzhiwang.com\nhouzi8.com\nhovfree.com\nhowbuy.com\nhoweipharm.com\nhowelllighting.com\nhowellsto.com\nhowjoin.com\nhowlapm.com\nhowmay.com\nhowsci.com\nhowtoing.com\nhowxm.com\nhowyouinternational.com\nhowzhi.com\nhoxing.com\nhoxue.com\nhoyakeji.com\nhoyatod.com\nhoyi-tech.com\nhoyibox.xyz\nhoyip.com\nhoyo.link\nhozest.com\nhozin.com\nhozonauto.com\nhp-marathon.com\nhp.com\nhp123.com\nhp888.com\nhpbgb.com\nhpblog.net\nhpc.cloud\nhpcang.com\nhpccake.com\nhpccube.com\nhpculturegroup.com\nhpearx.com\nhpeft.com\nhpepea.com\nhpgamestream.com\nhpglw.com\nhpgzf.com\nhph123.com\nhphwa.com\nhpichina.org\nhpicorp.net\nhpigc.com\nhpjd.com\nhplyy.com\nhpmicro.com\nhpnfjx.com\nhpoi.net\nhprt.com\nhprx.com\nhps-sh.com\nhpstore-china.com\nhpstore.cc\nhptea.com\nhpv112.com\nhpwin.com\nhpwjs.com\nhpwu.com\nhpwxc.com\nhpyiqi.com\nhpyk.com\nhpzhatu.com\nhq-mart.com\nhq-minerals.com\nhq0564.com\nhq114.net\nhq88.com\nhqbd.com\nhqbnb.com\nhqbuy.com\nhqbuycdn.com\nhqc-china.com\nhqcanyin.com\nhqcg1984.com\nhqchip.com\nhqcr.com\nhqdlsn.com\nhqdoc.com\nhqdoor.com\nhqengroup.com\nhqepay.com\nhqew.com\nhqew.net\nhqewimg.com\nhqfastner.com\nhqgjzz.com\nhqgq.com\nhqhb.com\nhqhl.net\nhqhop.com\nhqhospital.com\nhqhot.com\nhqhtfl.com\nhqidi.com\nhqis.org\nhqiye.com\nhqjcjj.com\nhqjy.com\nhqls.com\nhqnqz.com\nhqpcb.com\nhqps.com\nhqqt.com\nhqresearch.org\nhqrvs.com\nhqsec.com\nhqsgw.com\nhqshuaimi.com\nhqsmartcloud.com\nhqsoft.cc\nhqswuye.com\nhqthw.com\nhqtong.com\nhqts.com\nhqubbs.com\nhquu.net\nhqvchina.com\nhqwhw.com\nhqwx.com\nhqxlad.com\nhqyc.com\nhqygyg.com\nhqyj.com\nhqyjng.com\nhqyjsuccess.com\nhqyl.com\nhqys.net\nhqyt.net\nhqytgyh.com\nhqyun.com\nhqyxjy.com\nhqyzx.com\nhqzhou.com\nhqzxecd.asia\nhr-channel.com\nhr-mp.com\nhr-self.com\nhr-welink.com\nhr002.com\nhr025.com\nhr0571.com\nhr0660.com\nhr0715.com\nhr0752.com\nhr0753.com\nhr0766.com\nhr0915.com\nhr1000.com\nhr10000.com\nhr135.com\nhr2002.com\nhr2003.com\nhr2trainer.com\nhr33.com\nhr369.com\nhr3ds.com\nhr448.com\nhr510.com\nhr5156.com\nhr558.net\nhr668.com\nhr730.com\nhr763.com\nhr78.net\nhr9000.com\nhr987.com\nhrayw.com\nhrb-dg.com\nhrbanlv.com\nhrbaodian.com\nhrbar.com\nhrbbcf.com\nhrbbleasing.com\nhrbeduy.com\nhrbesd.com\nhrbj.net\nhrbjianchewang.com\nhrbjishunbanjia.com\nhrbjunxin.com\nhrbmama.com\nhrbmilan.com\nhrbpattern.com\nhrbpolarland.com\nhrbpt.com\nhrbshuiwu.com\nhrbswx.com\nhrbtv.net\nhrbuyu.com\nhrbyafeng.com\nhrbzdty.com\nhrbzhsd.com\nhrbzyy.com\nhrcf168.com\nhrcfc.com\nhrcwelink.com\nhrday.com\nhrddqc.com\nhref.lu\nhrenh.com\nhrexam.com\nhrfc.net\nhrflc.com\nhrfoods.com\nhrgsmz.com\nhrgxyy.com\nhrhuiyi.com\nhrhy365.com\nhrintl.com.hk\nhrjextruders.com\nhrjkjt.com\nhrloo.com\nhrm100.com\nhrmarket.net\nhrmtgroup.com\nhro-cosmetics.com\nhroot.co\nhroot.com\nhrpackage.com\nhrrsj.com\nhrs100.com\nhrsalon.org\nhrsay.com\nhrsee.com\nhrsel.com\nhrsoft-china.com\nhrsteelpipe.com\nhrtechchina.com\nhrtfin.com\nhrtn.net\nhrtsea.com\nhrtx.com\nhruikang.com\nhrvouge.com\nhrwuu.com\nhrxiongan.com\nhrxz.com\nhrzy.cc\nhs-bianma.com\nhs-biopharm.com\nhs-defense.com\nhs-fe.com\nhs-outlets.com\nhs-sz.com\nhs.net\nhs13z.net\nhs2z.net\nhs326.com\nhs499.com\nhs5g.com\nhs65.com\nhs85.com\nhsakyy.com\nhsay.com\nhsayi.com\nhsbank.cc\nhsbbs.com\nhsbdc.com\nhsbianma.com\nhscarbonfibre.com\nhscbw.com\nhscc.com\nhscfjt.com\nhschina.net\nhscn.com\nhscode.net\nhscode123.com\nhsdbg.com\nhsdcw.com\nhsddyy.com\nhsdfzp.com\nhsdjxh.org\nhsdjz.com\nhseda.com\nhsehome.com\nhsehome.org\nhsez.net\nhsfh56.com\nhsfund.com\nhsfyyy.com\nhsfzexsg.com\nhsfzxjy.site\nhsg2oi3c.com\nhsgf.net\nhsgjj.com\nhsgjysj.com\nhshan.com\nhshdyw.com\nhshhlj.com\nhshj.cc\nhshl360.com\nhshsjy.com\nhshsxkj.com\nhshton.com\nhshuiyi.com\nhsijqa.com\nhsjk.com\nhsjkaoyan.com\nhsjpgzx.com\nhsjrhy.com\nhsjt1983.com\nhsjy.com\nhsjy.net\nhskehong.com\nhskgchina.com\nhskun.com\nhsleu.com\nhslid.net\nhslight.net\nhslvshan.com\nhslxhl.com\nhsly.org\nhsm-intl.com\nhsmap.com\nhsmdb.com\nhsmob.com\nhsmrt.com\nhsnewsnet.com\nhsoow.com\nhspeletizadora.com\nhspharm.com\nhspm.net\nhspress.net\nhsqh.net\nhsqhfunds.com\nhsqhospital.com\nhsqjfw.com\nhsqt888.com\nhsqyy.com\nhsrc.tv\nhsrcw.com\nhsrexpo.com\nhsrjtk.com\nhsrtd.club\nhssdk.com\nhssdtest.com\nhssenglish.com\nhssjyj.com\nhsskyy.com\nhsslab.com\nhssrc.com\nhssyy.com\nhsszfx.com\nhst.com\nhst1966.net\nhstars.net\nhstbroker.com\nhstczkj.com\nhstd.com\nhstong.com\nhstpizza.com\nhstspace.com\nhstypay.com\nhstyre.com\nhsufuchifoods.com\nhsuyeung.com\nhswatersupply.com\nhsweb.me\nhswell.com\nhswkzy.com\nhswlkj.com\nhswmb.com\nhswyvz.com\nhswzyh.com\nhswzyj.com\nhsx99.com\nhsxedu.com\nhsxt.com\nhsxt.net\nhsy188.com\nhsyaguanjg.com\nhsyanyi.com\nhsybyh.com\nhsyk023.com\nhsysupply.com\nhsyuntai.com\nhsyunyi.com\nhsyyf.me\nhsyymusic.com\nhsyzg.net\nhszk.org\nhszq6.com\nhszq8.com\nhszsb.org\nhszsfz.com\nhszsz.com\nhsztbzx.com\nhszw.org\nhszxlzx.com\nhszy8.com\nhszyy8.com\nhszzsyzx.net\nhszzzx.net\nht-cao.com\nht-chem.com\nht-med.com\nht-motor.com\nht-rc.com\nht-saae.com\nht-tech.com\nht-valve.com\nht0775.com\nht1832.com\nht88.com\nht9.com\nhtai51.com\nhtaizhou.com\nhtanwang.com\nhtaocloud.com\nhtback.com\nhtbmsc.com\nhtc-media.com\nhtcases.com\nhtcis.net\nhtcrrc.com\nhtcxfund.com\nhtcxms.com\nhtd2000.com\nhtdata.com\nhtdtire.com\nhtdxcl.com\nhteacher.net\nhtech360.com\nhteos.com\nhtexam.com\nhtexam.net\nhtfcn.com\nhtffund.com\nhtfilter.com\nhtfoxit.com\nhtfpartner.com\nhtfutures.com\nhtg520.com\nhtgjjl.com\nhtgkdz.com\nhtguosheng.com\nhtgwf.com\nhth.com\nhti-instrument.com\nhtidc.com\nhtinfor.com\nhtinns.com\nhtinnsjm.com\nhtinv.com\nhtjinju.com\nhtjob.net\nhtjs.net\nhtjsq.com\nhtjsq.mobi\nhtkaoyan.com\nhtkgsx.com\nhtknow.com\nhtky365.com\nhtml5-app.com\nhtml5china.com\nhtml5code.net\nhtml5dw.com\nhtml5mark.com\nhtml5plus.org\nhtml5train.com\nhtml5tricks.com\nhtmlai.com\nhtmleaf.com\nhtmlsucai.com\nhtmycn.com\nhtnice.com\nhtong.com\nhtoo.vip\nhtood.com\nhtool.com\nhtqjy.com\nhtqyy.com\nhtrip.biz\nhts-auto.com\nhtsamc.com\nhtsc.com\nhtsec.com\nhtsec.net\nhtsham.com\nhtsjj.com\nhtslauto.com\nhtsprings.com\nhttdsj.com\nhtths.com\nhttingshu.com\nhttpcanary.com\nhttpcn.com\nhttpsok.com\nhttpssl.com\nhtucloud.com\nhtudata.com\nhtudns.com\nhturl.cc\nhtv123.com\nhtvaas.com\nhtvcentral.com\nhtwcq.com\nhtwed.com\nhtwx.net\nhtx.cc\nhtxgcw.com\nhtxgssb.com\nhtxrc.com\nhtxxpx.com\nhtxy.net\nhtycs.com\nhtyduck.com\nhtyhm.com\nhtyou.com\nhtys.cc\nhtys123.com\nhtyssdf.com\nhtyswzzgw.com\nhtyunwang.com\nhtzdj.com\nhtzdznjs.com\nhtzhgd.com\nhtzipr.com\nhu.com\nhua-chips.com\nhua-lan.com\nhua-yong.com\nhua.com\nhua1000.com\nhua168.com\nhua5.com\nhuaaiangel.com\nhuaan-cpa.com\nhuaao-trust.com\nhuaaojiaoyu.com\nhuaaoranqi.com\nhuaaosoft.com\nhuaaotech.com\nhuaat.com\nhuabaike.com\nhuaban.com\nhuaban.net\nhuabanimg.com\nhuabanpro.com\nhuabbao.com\nhuabeicw.com\nhuabian.com\nhuabianyl.com\nhuabo.net\nhuabocam.com\nhuabokeji.com\nhuabot.com\nhuabuqi.com\nhuacai-tech.com\nhuacai.com\nhuacaijia.com\nhuacaobk.com\nhuacaole.com\nhuacemedia.com\nhuachang-alu.com\nhuachengenjoy.com\nhuachengjx.com\nhuachenholdings.com\nhuachenit.com\nhuachenyuanyang.com\nhuachuangroup.net\nhuaco908.com\nhuacolor.com\nhuacooling.com\nhuada120.com\nhuadabz.com\nhuadachem.com\nhuadan.com\nhuadehyd.com\nhuaderack.com\nhuadian360.com\nhuadiansc.com\nhuadie.com\nhuadihealth.com\nhuadiplan.com\nhuadonghospital.com\nhuadongmedia.com\nhuadongtrack.com\nhuadream.com\nhuaduanbio.com\nhuadun315.com\nhuaduocai.net\nhuaease.net\nhuaeda.com\nhuaer.cc\nhuafaceg.com\nhuafagroup.com\nhuafaih.com\nhuafajituan.com\nhuafang.com\nhuafangdichan.com\nhuafasports.com\nhuafatech.com\nhuafeimould.com\nhuafeng-al.com\nhuafeng.com\nhuafengaw.com\nhuafens.com\nhuafer.cc\nhuafu.com\nhuagolf.com\nhuagongkaoyan.com\nhuagujs.com\nhuaguoshan.com\nhuaguoyuan.com\nhuagupai.com\nhuahai-gz.com\nhuahaibiochem.com\nhuahaige.com\nhuahaijiaju.com\nhuahaipharm.com\nhuahanart.com\nhuahanbook.com\nhuahao.com\nhuahengbio.com\nhuahengrobot.com\nhuahengsk.com\nhuahong-group.com\nhuahonggk.com\nhuahongjt.com\nhuahtc.com\nhuahua777.com\nhuahuacaocao.com\nhuahuamaoyi.com\nhuahuan.com\nhuahuihealth.com\nhuahuizhineng.com\nhuahuo.com\nhuai.gg\nhuaian.com\nhuaiangj.com\nhuaiansgyy.com\nhuaibaobei.com\nhuaibei.com\nhuaibeihosp.com\nhuaicai.cc\nhuaien.com\nhuaigang.com\nhuaihai.tv\nhuaihaixiang.com\nhuaijiufu.com\nhuaimg.com\nhuaimi.com\nhuain.com\nhuainanhy.com\nhuainannet.com\nhuainanren.net\nhuainanzi.com\nhuainet.com\nhuairen588.com\nhuairougreatwallmarathon.com\nhuairtv.com\nhuairui59.com\nhuaitao.vip\nhuaixin88.com\nhuaiyangnews.com\nhuaji.com\nhuaji.store\nhuajia.cc\nhuajiakeji.com\nhuajialishe.com\nhuajian-al.com\nhuajiangai.com\nhuajiankang.com\nhuajianmed.com\nhuajiantong.com\nhuajiao.com\nhuajiaow.com\nhuajiaowu.com\nhuajicnc.com\nhuajieai.com\nhuajifen.com\nhuajin100.com\nhuajinct.com\nhuajing-inf.com\nhuajingsec.com\nhuajingyun.com\nhuajuanma.com\nhuajuanyun.com\nhuajuhotel.com\nhuajx.com\nhuakaifilter.com\nhuake-weixin.com\nhuakewang.com\nhuakeyun.com\nhuakpower.com\nhualady.com\nhualaikeji.com\nhualaiyun.com\nhualala.com\nhualan-tech.com\nhualanbio.com\nhualay.net\nhualet.org\nhualewl.net\nhualiandie.com\nhualiandressing.com\nhualianmining.com\nhualiantv.com\nhualianxin.com\nhualing-pm.com\nhualingjiangong.com\nhualiuniversity.com\nhualong-sz.com\nhualongholding.com\nhualongxiang.com\nhualu5.com\nhualumedia.com\nhualuwood.com\nhualv.com\nhualvtu.com\nhuaman.pub\nhuamanlou.cc\nhuamanlou.com\nhuamao.com\nhuamaobook.com\nhuamaorice.com\nhuamaoshuo.com\nhuamedicine.com\nhuameili.net\nhuameiyuezi.com\nhuamengxiaoshuo.com\nhuami.com\nhuamou.com\nhuamu.com\nhuamuwo.com\nhuan-tai.com\nhuan.tv\nhuananauctionctf.com\nhuananyiyao.com\nhuananzhi.com\nhuanbao.com\nhuanbaoscx.com\nhuanbearing.com\nhuanbeieloan.com\nhuanbeiloan.com\nhuanbeipic.com\nhuandie.com\nhuandonglg.com\nhuane.net\nhuanenet.com\nhuanergy.com\nhuanfeng580.com\nhuang-jerryc.com\nhuang-jiang.com\nhuangbaoche.com\nhuangbaoquan.com\nhuangbowei.com\nhuangchujunyulong.com\nhuangchun.net\nhuangdao.in\nhuangdao.net\nhuangdc.com\nhuangea.com\nhuangfusl.net\nhuanggangmarathon.com\nhuanggao.net\nhuanggaole.com\nhuangguanluo.com\nhuangh.com\nhuanghaicollege.com\nhuanghanlian.com\nhuanghegongshui.com\nhuanghehr.com\nhuanghepiao.com\nhuanghuacheng.com\nhuangjiemin.com\nhuangjihuang.com\nhuangka.com\nhuangkong.net\nhuanglei.me\nhuangli.com\nhuangli8.com\nhuangliangbo.com\nhuanglong.com\nhuangma.com\nhuangqi1688.com\nhuangshaotian.com\nhuangshimarathon.com\nhuangwei.me\nhuangwei.pro\nhuangxin.dev\nhuangxinwei.com\nhuangyao.work\nhuangye.net\nhuangye51.com\nhuangye88.com\nhuangye88.net\nhuangyifan.com\nhuangyixiaoshuo.com\nhuangyuehe.com\nhuangyuhui.net\nhuangyunkun.com\nhuangzz.xyz\nhuanhaoba.com\nhuanhuanhuishou.com\nhuanhuanxin.com\nhuanhuba.com\nhuanidc.com\nhuanju.net\nhuanjutang.com\nhuanjuyun.com\nhuanle.com\nhuanle800.com\nhuanlecdn.com\nhuanledd.com\nhuanlefish.com\nhuanleguang.com\nhuanletang.com\nhuanlewan.net\nhuanlezhuan.com\nhuanlingpharm.com\nhuanlingxiuxian.com\nhuanlj.com\nhuanmusic.com\nhuanong1688.com\nhuanongdao.com\nhuanpeng.com\nhuanpingge.com\nhuanq.com\nhuanqiu-ltd.com\nhuanqiu.com\nhuanqiu.org\nhuanqiu56.com\nhuanqiuauto.com\nhuanqiuchuguo.com\nhuanqiujiemi.com\nhuanqiukexue.com\nhuanqiumil.com\nhuanqiutape.com\nhuanqiuw.com\nhuanqiuyimin.com\nhuanqu-tec.com\nhuanqunquan.com\nhuansengifts.com\nhuanshoulv.com\nhuante.com\nhuantest.com\nhuanting.cc\nhuantour.com\nhuanuomenye.com\nhuanwen.com\nhuanwenwen.com\nhuanxi.com\nhuanxia.com\nhuanxiangji.com\nhuanximedia.com\nhuanxinchem.com\nhuanxinfluoro.com\nhuanxing1904.com\nhuanxingedu.com\nhuanxio.com\nhuanxiongdd.com\nhuanxiyl.com\nhuanyatour.com\nhuanyingzq.com\nhuanyouji.com\nhuanyuantech.com\nhuanyudns.com\nhuanyule.com\nhuanyumid.com\nhuanyutv.com\nhuanzhu101.com\nhuanzhucv.com\nhuaoe.com\nhuaon.com\nhuaougas.com\nhuapai.com\nhuapiaoer.com\nhuapiaoliang.com\nhuapinwang.com\nhuapontshengchem.com\nhuaqiaobang.com\nhuaqidigital.com\nhuaqin.com\nhuaqinchi.com\nhuaqingkeji.net\nhuaqingtax.com\nhuaqiu.com\nhuaraytech.com\nhuaren-scm.com\nhuarenyingyu.com\nhuarenyizhan.com\nhuari-furniture.com\nhuari.com\nhuaroem.com\nhuarongdao.com\nhuarongled.com\nhuarui.work\nhuarui1952.com\nhuaruiaero.com\nhuaruicom.com\nhuaruidns.com\nhuaruisales.com\nhuas.co\nhuasadata.com\nhuash.com\nhuashangcbbtv.com\nhuashangedu.com\nhuashanglawyer.com\nhuashangtop.com\nhuashanxin.com\nhuashen-edu.com\nhuashen-group.com\nhuashen6.com\nhuasheng-automation.com\nhuasheng100.com\nhuashengchn.com\nhuashengdaili.com\nhuashenghaoche.com\nhuashengjia100.com\nhuashengls.com\nhuashengshiyan.com\nhuashengtoutiao.com\nhuashi-sh.com\nhuashi.cc\nhuashi6.com\nhuashichang.com\nhuashidongman.com\nhuashijie.art\nhuashilm.com\nhuashipharmacymtalionlineybpay.com\nhuashitong.net\nhuashphoto.com\nhuashui.com\nhuashuitax.com\nhuashunxinan.net\nhuasimtour.com\nhuasiwood.com\nhuasongwang.com\nhuasu.net\nhuasuankeji.com\nhuasuhui.com\nhuasuokeji.com\nhuasyun.com\nhuatai-elec.com\nhuatai-pb.com\nhuatai.com\nhuatai1993.com\nhuataiyc.com\nhuatan365.com\nhuatans.com\nhuatec.com\nhuatech.net\nhuategas.com\nhuatengsci.com\nhuati.cc\nhuatian-hotel.com\nhuatian.net\nhuatianxiangsu.com\nhuatong-logistics.com\nhuatongcloud.com\nhuatu.com\nhuatugz.com\nhuatuo007.com\nhuatuowenda.com\nhuatuoyf.com\nhuaue.com\nhuavisa.com\nhuawan.com\nhuawangzhixun.com\nhuawanyun.com\nhuawe.com\nhuawei-3com.com\nhuawei-eu.store\nhuawei.asia\nhuawei.com\nhuawei.eu\nhuawei.ru\nhuaweiacad.com\nhuaweiapaas.com\nhuaweiapi.com\nhuaweicloud-dns.com\nhuaweicloud-dns.net\nhuaweicloud-dns.org\nhuaweicloud-idme.com\nhuaweicloud-koophone.com\nhuaweicloud-smn.com\nhuaweicloud-smn.net\nhuaweicloud.com\nhuaweicloudapis.com\nhuaweicloudlive.com\nhuaweicloudsite.com\nhuaweicloudwaf.com\nhuaweidevice.com\nhuaweidevice.tel\nhuaweidun.com\nhuaweielab.com\nhuaweifile.com\nhuaweiief.com\nhuaweiita.com\nhuaweils.com\nhuaweimall.com\nhuaweimarine.com\nhuaweimarketplace.com\nhuaweimossel.com\nhuaweioneaccess.com\nhuaweirtc.com\nhuaweisafedns.com\nhuaweishop.net\nhuaweisoft.com\nhuaweisre.com\nhuaweistatic.com\nhuaweiuniversity.com\nhuaweiyun.com\nhuaweizdl.com\nhuawenwin.com\nhuawo-wear.com\nhuawote.com\nhuaxi.net\nhuaxi100.com\nhuaxia.com\nhuaxia77.com\nhuaxiabeidou.com\nhuaxiaeye.com\nhuaxiaf.com\nhuaxiagg.com\nhuaxiajianyan.com\nhuaxiald.com\nhuaxialiangzi.com\nhuaxiangdiao.com\nhuaxianpai.com\nhuaxianzhaopin.com\nhuaxiao5.com\nhuaxiaobaokeji.com\nhuaxiapawn.com\nhuaxiashiwen.com\nhuaxiasz.com\nhuaxiataike.com\nhuaxiazi.com\nhuaxin303.com\nhuaxinbaojie.com\nhuaxincem.com\nhuaxing.com\nhuaxingas.com\nhuaxingchem.com\nhuaxinhz.com\nhuaxinorthop.com\nhuaxinpark.com\nhuaxiong.com\nhuaxirc.com\nhuaxj.net\nhuaxuezoo.com\nhuaxumag.com\nhuaxunbaili.com\nhuaxunholdings.com\nhuayang.net\nhuayanghui.net\nhuayangsolar.com\nhuayanwater.com\nhuayaocc.com\nhuayaody.com\nhuaye.com\nhuayi-faucet.com\nhuayicn.com\nhuayidiaosu.com\nhuayielec.com\nhuayijiahe.com\nhuayilawfirm.com\nhuayilighting.com\nhuayimedia.com\nhuayiming.com\nhuayin114.com\nhuayingglass.com\nhuayingrc.com\nhuayingsc.com\nhuayinhealth.com\nhuayinjapan.com\nhuayinlab.com\nhuayinyiliao.com\nhuayitaitech.com\nhuayitongkeji.com\nhuayitongtai.com\nhuayiweibo.com\nhuayiwork.com\nhuayiyuan.com\nhuayiyunxinxi.com\nhuayou.com\nhuayoumengze.com\nhuayoutianyu.com\nhuayuan-print.com\nhuayuanlcd.com\nhuayuchaxiang.com\nhuayue119.com\nhuayueivf.com\nhuayufilter.com\nhuayug.com\nhuayuhua.com\nhuayulandmarkhotel.com\nhuayun.com\nhuayunfl.com\nhuayuzj.com\nhuazhangautomation.com\nhuazhanggroup.com\nhuazhanwire.com\nhuazhen-gs.com\nhuazhen2008.com\nhuazhen2008.net\nhuazhengcaiwu.com\nhuazhengwuye.com\nhuazhenjiaoyu.com\nhuazhiedu.com\nhuazhiweilai.com\nhuazhixingchina.com\nhuazhongcar.com\nhuazhongcnc.com\nhuazhongtimes.com\nhuazhu.com\nhuazhuanapp.com\nhuazhucorp.com\nhuazirc.com\nhubamdi.com\nhubashihuo.com\nhubcyts.com\nhubei88.com\nhubeiamc.com\nhubeibbs.net\nhubeibidding.com\nhubeichengji.com\nhubeici.com\nhubeidaily.net\nhubeifc.com\nhubeifurui.com\nhubeigongfu.com\nhubeihome.net\nhubeiip.com\nhubeijingjunf.com\nhubeikj.com\nhubeinet.com\nhubeipbx.com\nhubeiport.com\nhubeiqiche.org\nhubeiwsd.com\nhubeixuekao.com\nhubeiyanjiusheng.com\nhubeiyongtai.com\nhubeizhengao.com\nhubiao168.com\nhubing.online\nhubsound.com\nhubstudio.vip\nhubulab.com\nhubwd.com\nhubwiz.com\nhuc08.com\nhucais.com\nhucdn.com\nhuceg.com\nhuceo.com\nhuchaowei.com\nhucheng100.com\nhuchihuchi.com\nhudai.com\nhudong.com\nhudong100.com\nhudong100.net\nhudong100.org\nhudongad.com\nhudongba.com\nhudongcdn.com\nhudongkejian.com\nhudongku.net\nhudun.com\nhudunsoft.com\nhuduntech.com\nhuelead.com\nhuenhuenfood.com\nhufangkeji.com\nhufangyun.com\nhufe.cc\nhugane.com\nhugcar.com\nhugd.com\nhugecdn168.com\nhugecore.net\nhugeland.com\nhugetall.com\nhugong-js.com\nhugong.com\nhuhaha.net\nhuhanba.com\nhuhaoyang.com\nhuhexian.com\nhuhoo.com\nhuhoo.net\nhuhua.net\nhuhuang.net\nhuhudi.com\nhuhuguanjia.com\nhuhui-sh.com\nhuhustory.com\nhuhutian.com\nhuhutong315.com\nhui-ben.com\nhui-chao.com\nhui.net\nhui10.com\nhui10.net\nhui100.com\nhui43.com\nhui800.com\nhui800.net\nhuians.com\nhuibag.com\nhuibiao-group.com\nhuibiaoinfo.com\nhuibo.com\nhuibojob.com\nhuiboparking.com\nhuiborobot.com\nhuicaishui.net\nhuiche.com\nhuiche100.com\nhuicheimg.com\nhuichenghuijia.com\nhuichengip.com\nhuichengy.com\nhuichewang.com\nhuichongduo.com\nhuichuangjialife.com\nhuichuangzhanlan.com\nhuicx7.com\nhuida18.com\nhuidabbs.com\nhuidafrp.com\nhuidagroup.com\nhuidan.net\nhuidang.com\nhuidaocaishui.com\nhuidaqg.com\nhuidawanan.com\nhuidazhe.vip\nhuiddo.com\nhuide-medical.com\nhuiderui.com\nhuideyecai.com\nhuidian.net\nhuidiantech.com\nhuidu.com\nhuidu.net\nhuidu001.com\nhuiduogang.com\nhuiemall.com\nhuierming.com\nhuierp.com\nhuifachina.com\nhuifacms.com\nhuifayun.com\nhuifeng-zj.com\nhuifengtools.com\nhuifengxinxi.com\nhuifengzhuzao.com\nhuifenqi.com\nhuifu.com\nhuifudashi.com\nhuifusihai.com\nhuifutz.com\nhuifuzhinan.com\nhuigaiji.com\nhuigao-magnetics.com\nhuigezi.org\nhuiguanwang.com\nhuih110.com\nhuihaha.com\nhuihaicenter.com\nhuihaicn.com\nhuihaiyiyao.com\nhuihe56.com\nhuihefz.com\nhuihengmedical.com\nhuihestone.com\nhuihezx.com\nhuihua365.com\nhuihua8.com\nhuihuaren.com\nhuii.cc\nhuiidea.com\nhuiji.wiki\nhuijiame.com\nhuijian-land.com\nhuijiangroup.com\nhuijiaoyun.com\nhuijiazhileng.com\nhuijidata.com\nhuijie.shop\nhuijiegroup.com\nhuijiewei.com\nhuijimall.com\nhuijing.org\nhuijinggroup.com\nhuijingwl.com\nhuijinshang.com\nhuijinwater.com\nhuijistatic.com\nhuijitrans.com\nhuijiwiki.com\nhuiju.cool\nhuijucn.com\nhuikao8.com\nhuikex.com\nhuikundz.com\nhuila88.com\nhuilaimi.com\nhuilan-online.com\nhuilan.com\nhuilanfoundation.org\nhuilanyujia.com\nhuiliangapp.com\nhuilianyi.com\nhuililong.com\nhuilintyre.com\nhuilinwang.com\nhuilitc.com\nhuiliu.net\nhuiliubao.com\nhuilm.com\nhuilog.com\nhuilongsen.com\nhuilongtech.com\nhuilunbio.com\nhuilv8.com\nhuilvbiao.com\nhuilvwang.com\nhuilvyankuang.com\nhuilw.com\nhuilyn.com\nhuimaiche.com\nhuimaihs.com\nhuiman.net\nhuimei.net\nhuimeijiaozi.com\nhuimeisports.com\nhuimeiyp.com\nhuimeizr.com\nhuimengchem.com\nhuimengya.com\nhuimiaokeji.com\nhuimin111.com\nhuimincz.com\nhuimingcn.com\nhuimingjia.com\nhuimwang.com\nhuinaimei.com\nhuing.net\nhuinkj.net\nhuion.com\nhuiqia.net\nhuiqianfan.com\nhuiqibaike.com\nhuiqiyidiantong.com\nhuiqiyu.com\nhuiqk.com\nhuiqudsp.com\nhuiqunchina.com\nhuiquzu.com\nhuirde.com\nhuirenshenbao.com\nhuirenyy.com\nhuiris.com\nhuiruanzhuang.com\nhuirui-tech.com\nhuirui1688.com\nhuisem.com\nhuisencapital.com\nhuisenky.com\nhuishandairy.com\nhuishangbao.com\nhuishangol.com\nhuishantech.com\nhuisheng.fm\nhuishengaudio.com\nhuishenghuo.ink\nhuishengqianzhushou.com\nhuishida.com\nhuishou1680.com\nhuishoubao.com\nhuishoubaojiadan.com\nhuishouigbt.com\nhuishoujie.com\nhuishoujiuwu.com\nhuishoushang.com\nhuishouyx.com\nhuishuaka.com\nhuishuirencai.com\nhuishuitech.com\nhuisituo.com\nhuisj.com\nhuisky.com\nhuisou.com\nhuisports.com\nhuisuanzhang.com\nhuisucn.com\nhuisuoping.com\nhuitao.net\nhuitaoche.com\nhuitaoyouhui.com\nhuitengpipe.com\nhuitongqingsuan.com\nhuitoubj.com\nhuitouche.com\nhuitoukefood.com\nhuitouyan.com\nhuitouyu.com\nhuitouzi.com\nhuitu.com\nhuitu.tech\nhuitu8.com\nhuitun.com\nhuiurl.com\nhuivo.com\nhuiwang.net\nhuiweikeji.com\nhuiwenda.com\nhuiwww.com\nhuixianginvest.com\nhuixiangtiandi.com\nhuixiaoer.com\nhuixiaoer.net\nhuixineducation.com\nhuixinggroup.com\nhuixingsoft.com\nhuixinli.com\nhuixinyiyuan.com\nhuixinyt.com\nhuixinyun.com\nhuixsw.com\nhuixuanjiasu.com\nhuixueba.net\nhuiyan315.com\nhuiyangranqi.com\nhuiyankan.com\nhuiyaohuyu.com\nhuiybb.com\nhuiyda.com\nhuiyelaw.com\nhuiyi-123.com\nhuiyi365.net\nhuiyi8.com\nhuiyi9e.com\nhuiyiabc.com\nhuiyiai.net\nhuiyicq.net\nhuiyihealth.com\nhuiyinxun.com\nhuiyizhuo.com\nhuiyou.com\nhuiyou027.com\nhuiyouhotels.com\nhuiyuandao.com\nhuiyuanjia.net\nhuiyuansoft.com\nhuiyuantang.com\nhuiyuanyy.com\nhuiyucn.com\nhuiyuehz.com\nhuiyumedia.com\nhuiyundong.net\nhuiyutools.com\nhuize.com\nhuizecdn.com\nhuizhaofang.com\nhuizhek.com\nhuizhengmachinery.com\nhuizhiguanghua.com\nhuizhihuyu.com\nhuizhijiaxun.com\nhuizhilin.com\nhuizhilin.net\nhuizhimob.com\nhuizhioptech.com\nhuizhou-marathon.com\nhuizhouf.com\nhuiziyuan.net\nhuizone.com\nhuizuche.com\nhuizucloud.com\nhuizuoyuezi.com\nhuizustore.com\nhujia.org\nhujiang.com\nhujianggroup.com\nhujibbs.com\nhujingnb.com\nhuke88.com\nhukeck.com\nhukecs.com\nhukecwx.com\nhukefjb.com\nhukehyh.com\nhukelc.com\nhukenb.com\nhukesxm.com\nhukewq.com\nhukexyy.com\nhukou021.com\nhukou365.com\nhukuangroup.com\nhulai.com\nhulianfang.com\nhulianmaibo.com\nhulianwangchuangye.com\nhulinhong.com\nhulixin.com\nhuliyx.com\nhulubaba.com\nhuluboshi.com\nhuludz.com\nhuluer.com\nhuluip.com\nhuluip.tech\nhuluo.com\nhulusaas.com\nhulusi.com\nhulutrip.com\nhuluwa.cc\nhuluwa365.com\nhuluwa8.com\nhuluxia.com\nhuluxia.net\nhuluzc.com\nhumaiyouxi.com\nhumanplustech.com\nhumanrights-china.org\nhumanwellcaps.com\nhumanwellhb.com\nhumaotec.com\nhumblit.com\nhumengyun.com\nhumensec.com\nhuming.com\nhummcars.com\nhumpline.com\nhunaen.com\nhunan-changda.com\nhunan-huasheng.com\nhunan100km.com\nhunanbestall.com\nhunancatv.com\nhunaneu.com\nhunangaozhi.com\nhunangy.com\nhunanhaihong.com\nhunaniptv.com\nhunanjz.com\nhunanpea.com\nhunantv.com\nhunanxingxin.com\nhunanyuneng.com\nhunanzp.com\nhunanzy.com\nhunau.net\nhunbei.com\nhunbei1.com\nhunbei2.com\nhunbei3.com\nhunbei4.com\nhunbei5.com\nhunbohui.info\nhunbys.com\nhunche.net\nhunchun123.com\nhundredcent.com\nhundsun.com\nhundun.net\nhundx.com\nhunger-valley.com\nhungsh.store\nhunli100.com\nhunlian100.com\nhunlihu.com\nhunlihu1.com\nhunlihu2.com\nhunlihunli.com\nhunliji.com\nhunlimama.com\nhunlimao.com\nhunmiao.com\nhunsh.net\nhuntchance.com\nhuntermailfocus.com\nhunteron.com\nhuntic.com\nhuntkey.com\nhuntkeydiy.com\nhuntsbot.com\nhunuo.com\nhunyinyiyuan.com\nhuoas.com\nhuoban.com\nhuobanbot.com\nhuobanhuyu.com\nhuobanimg.com\nhuobanjs.com\nhuobanniu.com\nhuobaowang.com\nhuobaoweishang.com\nhuobaoyx.com\nhuobi.io\nhuocai.com\nhuochai.cc\nhuochai.mobi\nhuoche.com\nhuoche.net\nhuoche.wiki\nhuocheba.com\nhuocheci.com\nhuochehuan.com\nhuochepiao.com\nhuochepiao.net\nhuocheso.com\nhuocms.com\nhuodao.hk\nhuodong.org\nhuodong.store\nhuodong5.com\nhuodonghui.net\nhuodongjia.com\nhuodongju.com\nhuodongpro.com\nhuodongshu.com\nhuodongwang.com\nhuodongxing.com\nhuodongzhongguo.com\nhuofar.com\nhuofutp.com\nhuogongdian.com\nhuohao8.com\nhuohoo.com\nhuohuacdn.com\nhuohuahudong.com\nhuohudun.com\nhuohuo.com\nhuoideas.com\nhuoji.com\nhuojiaba.com\nhuojitui.com\nhuoju365.com\nhuokebao.net\nhuokeying.com\nhuokeyuan.com\nhuolala.co\nhuolala.work\nhuole.com\nhuolea.com\nhuoli.com\nhuolieniao.com\nhuolieyun.com\nhuolinhe.com\nhuolishaonianwang.com\nhuolug.com\nhuomakeji.com\nhuomao.com\nhuomaotv.com\nhuomaqun.com\nhuoming.com\nhuomujin.com\nhuonan.net\nhuonao.com\nhuoniuniu.com\nhuopinyuan.com\nhuopu.com\nhuoqibao.com\nhuoqiuw.com\nhuosdk.com\nhuoshan.cc\nhuoshan.club\nhuoshan.com\nhuoshancdn.com\nhuoshangroup.com\nhuoshanimg.com\nhuoshanlive.com\nhuoshanparty.com\nhuoshanstatic.com\nhuoshante8.com\nhuoshanvideo.net\nhuoshanvod.com\nhuoshanxiaoshipin.net\nhuoshanzhibo.com\nhuoshanzhibo.net\nhuoshanzhufang.com\nhuoshen.com\nhuoshen99.com\nhuoshi.shop\nhuosu.com\nhuowan.com\nhuowanes.com\nhuoxiaoyi.com\nhuoxing.com\nhuoxing24.com\nhuoxingyu.com\nhuoxingzi.com\nhuoxun.com\nhuoyan.com\nhuoyan.io\nhuoyanio.com\nhuoyantu.com\nhuoyanyunying.com\nhuoyfish.com\nhuoying.com\nhuoyuan.mobi\nhuoyugame.com\nhuoyuyan.com\nhuoziyin.com\nhupan.com\nhupanedu.com\nhupanoled.com\nhupo.com\nhupo.tv\nhupozhidao.com\nhupu.com\nhupu.gg\nhupu.io\nhupucdn.com\nhupujrs.com\nhupun.com\nhur05100kns.com\nhur05111kns.com\nhur05120kns.com\nhurom.vip\nhurricane618.me\nhurricanechip.com\nhurun.net\nhurx04.xyz\nhurys.com\nhusadw.com\nhusenji.com\nhushangcaifu.com\nhusini.net\nhusiyang.com\nhust-laser.com\nhust-snde.com\nhust-wuxi.com\nhust.cc\nhust.online\nhustcad.com\nhustlife.com\nhustlzp.com\nhustmei.com\nhustnews.com\nhustoj.com\nhustonline.net\nhustp.com\nhustsofc.tech\nhustunique.com\nhustwenhua.net\nhustxb.com\nhustyy.com\nhusubao.com\nhutaojie.com\nhutaolinight.com\nhutegy.com\nhutew.com\nhutong-school.com\nhutong360.com\nhutongcdn.com\nhutoufeng.net\nhutui9.com\nhutuii.com\nhutusi.com\nhuuhoo.com\nhuuing.com\nhuwaibbs.com\nhuwaizb.com\nhuwatech.club\nhuway.com\nhuweihuang.com\nhuweishen.com\nhuwi8.com\nhux6.com\nhuxianwang.com\nhuxiaofan.com\nhuxiaoshi.com\nhuxiji999.com\nhuxijizhongguo.com\nhuxingroup.com\nhuxishiye.com\nhuxiu.com\nhuxiu.link\nhuxiucdn.com\nhuya.com\nhuyajs.com\nhuyall.com\nhuyanapp.com\nhuyanbao.com\nhuyanjie.com\nhuyaos.com\nhuyaruanwen.com\nhuyatvns.com\nhuyayue.com\nhuyn.com\nhuyouxiong.com\nhuyueidc.com\nhuyuekj.com\nhuyuncdn.com\nhuyuning.com\nhuyuxx.com\nhuzhan.com\nhuzhang.com\nhuzhao1.com\nhuzheng.org\nhuzhongxin.com\nhuzhoumj.com\nhuzhoumuseum.com\nhuzicaotang.com\nhuzwater.com\nhvacstar.com\nhvchan.com\nhvcnitl.com\nhvcxo.com\nhvdiy.com\nhvread.com\nhvsgqlo.xyz\nhvtong.com\nhw-ai.com\nhw-go.net\nhw-supply.com\nhw-tm.com\nhw100k.com\nhw3static.com\nhw555.com\nhw99.com\nhwactive.com\nhwad.net\nhwagain.com\nhwait.com\nhwangda.com\nhwanw.com\nhwaq.cc\nhwashi.com\nhwasmart.com\nhwastro.com\nhwasunpharma.com\nhwatson.com\nhwavi.org\nhwbanaa.com\nhwbaoan.com\nhwbfxp5030.vip\nhwbim.com\nhwbs.org\nhwbz.net\nhwccpc.com\nhwcdnsre.com\nhwcloudlive.com\nhwclouds-dns.com\nhwclouds-dns.net\nhwclouds.com\nhwclouds.mobi\nhwclouds.net\nhwclouds.org\nhwcloudsite.com\nhwcloudvis.com\nhwclzq.com\nhwcpb.com\nhwcrazy.com\nhwehs.com\nhweimall.com\nhweventgrid.com\nhwfcw.com\nhwgis.com\nhwhidc.com\nhwht.com\nhwj.com\nhwjianmo.com\nhwjm-mold.com\nhwjyw.com\nhwlchain.com\nhwlifting.com\nhwlpz.com\nhwlxuz.work\nhwocloud.com\nhwoled.com\nhworld.com\nhwpan.com\nhwrecruit.com\nhwshu.com\nhwsupplychain.com\nhwtelcloud.com\nhwtrip.com\nhwtzdl.com\nhwwt2.com\nhwwt8.com\nhwxc.com\nhwxda.com\nhwxfc.com\nhwxjp.com\nhwxnet.com\nhwxuanliuqi.com\nhwyton.com\nhwyxxx.com\nhwzn.com\nhwzuku.com\nhwzyjt.com\nhx-parking.com\nhx-qt.com\nhx-r.com\nhx008.com\nhx008.net\nhx110.com\nhx1h.com\nhx2car.com\nhx2cars.com\nhx36.net\nhx416.com\nhx5658.com\nhx818.com\nhx8886.com\nhx95.com\nhx99.net\nhxacc.com\nhxage.com\nhxbdf120.com\nhxbdxled.com\nhxbl.com\nhxbsth.com\nhxbus.net\nhxc-power.com\nhxccc.org\nhxcd.net\nhxcdn.net\nhxchem.net\nhxchx.org\nhxclouds.com\nhxcsbj.com\nhxct.com\nhxct.ltd\nhxd56.com\nhxdec.com\nhxdi.com\nhxdkfp.com\nhxdkj88.com\nhxdrisk.com\nhxdsbgg.com\nhxdspa.com\nhxdtekf.com\nhxen.com\nhxepawn.com\nhxf111.com\nhxfilm.com\nhxfjw.com\nhxfy888.com\nhxfzzx.com\nhxgame.net\nhxgqw.com\nhxgro.com\nhxgroup.com\nhxgs.com\nhxgs.net\nhxgwott.com\nhxhaoyu.com\nhxhost.com\nhxhssw.com\nhxiangjia.com\nhxing.com\nhxinq.com\nhxjbh.com\nhxjhcloud.com\nhxjinqiao.com\nhxjiot.com\nhxjiqi.com\nhxjnyy.com\nhxjsjkj.com\nhxjstech.com\nhxjwang.com\nhxjxs.com\nhxjxsw.com\nhxkba.com\nhxkfh.com\nhxkgjt.com\nhxkj.cc\nhxkj.vip\nhxkq.net\nhxkq.org\nhxkqyxzz.net\nhxland.com\nhxlbc.com\nhxlbd.com\nhxledu.com\nhxlhjt.com\nhxljjt.com\nhxlot.com\nhxlsw.com\nhxltcj.com\nhxlxx.com\nhxm5.com\nhxmeishi.com\nhxmlyy.com\nhxmryy.com\nhxnews.com\nhxnk.com\nhxny.com\nhxnygx.com\nhxpdd.com\nhxposuiji.com\nhxq123456.com\nhxqc.com\nhxqc.mobi\nhxqcgf.com\nhxqcjt.com\nhxqgczx.com\nhxqnj.org\nhxqtedu.com\nhxr100.com\nhxrc.com\nhxsd.com\nhxsd.tv\nhxseal.com\nhxsec.com\nhxsjjt.com\nhxsmart.com\nhxsme.org\nhxspjt.com\nhxssyy.com\nhxstrive.com\nhxsts.com\nhxsyjt.net\nhxt5.com\nhxtk.com\nhxtrip.com\nhxtxxw.com\nhxtzgroup.com\nhxwglm.com\nhxx.net\nhxxkw.org\nhxxl6.com\nhxyd.cc\nhxydup.com\nhxyjw.com\nhxys.com\nhxytea.com\nhxytw.com\nhxyxt.com\nhxyyw.com\nhxz.ink\nhxzlsgs.com\nhy-china.com\nhy-express.com\nhy-f.com\nhy-la.com\nhy-lamp.com\nhy-titan.com\nhy-tp.com\nhy-zr.com\nhy017.com\nhy01888.com\nhy031.com\nhy05190134.com\nhy053.com\nhy074.com\nhy118.com\nhy120.com\nhy12048.com\nhy123.com\nhy1234567.com\nhy163.com\nhy169.com\nhy1862.com\nhy2046.com\nhy219.com\nhy237.com\nhy254.com\nhy261.com\nhy2809.com\nhy296.com\nhy341.com\nhy345.com\nhy346.com\nhy36061.com\nhy36098.com\nhy375.com\nhy3804.com\nhy385.com\nhy4.cc\nhy410.com\nhy439.com\nhy4445.com\nhy450.com\nhy453.com\nhy464.com\nhy5353.com\nhy552.com\nhy5553.com\nhy563.com\nhy576.com\nhy628.com\nhy636.com\nhy679.com\nhy702.com\nhy7050.com\nhy732.com\nhy762.com\nhy7703.com\nhy7738.com\nhy7756.com\nhy8881.com\nhy9698.com\nhy9905.com\nhyagrochem.com\nhyagv.com\nhyahm.com\nhyaimed.com\nhyakkaryouran.date\nhyb2b.com\nhybase.com\nhybbs.net\nhybbtree.com\nhybiome.com\nhybssy.com\nhyc.com\nhyccw.com\nhycdn.com\nhycet.com\nhycfw.com\nhycgy.com\nhyckjic.com\nhycn.com\nhydarts.com\nhydbest.com\nhyddd.com\nhyderabadgrowth.com\nhydesolar.com\nhydravizoficial.info\nhydst.com\nhydun.com\nhydz999.com\nhydzfp.com\nhydzswyxgs.com\nhyec.com\nhyedu.com\nhyexpo.com\nhyext.com\nhyey.com\nhyeycg.com\nhyflc.com\nhyfutures.com\nhyfxbj.com\nhyggfx.com\nhygkit.com\nhygmgroup.com\nhygoldcup.com\nhygxbgd.com\nhygy361.com\nhyham.com\nhyhcdn.com\nhyhdtg.com\nhyhhgroup.com\nhyhjzc.com\nhyhl66.com\nhyhospital.com\nhyhqjt.com\nhyhro.com\nhyhscm.com\nhyht.fun\nhyhuo.com\nhyhxt.net\nhyhy.cc\nhyhyn.com\nhyilp.com\nhyimmi.com\nhyipchina.com\nhyj999.com\nhyjgxx.com\nhyjhgy.com\nhyjnpx.com\nhyjxmx.com\nhykang.com\nhykcsoft.com\nhykiln.com\nhykj.cc\nhyl1.tv\nhylanda.com\nhylandslaw.com\nhylicreate.com\nhylik.net\nhylname.com\nhymake.com\nhymall.net\nhymater.com\nhymcu.com\nhymicrofiber.com\nhymicrosystem.com\nhymjy.net\nhymson.com\nhynet.co\nhynetek.com\nhynews.net\nhyngj.com\nhynixic.com\nhynpay.com\nhynyw.com\nhyocr.com\nhyouda.com\nhyp-arch.com\nhypefolio.com\nhypefolio.net\nhyper.sh\nhyper3d.ai\nhypercachenet.com\nhypercachenode.com\nhypergryph.com\nhypergryph.net\nhyperguestai.com\nhypersilicon.com\nhyperstrong.com\nhyphencargo.com\nhyplc.com\nhypnotherapyforeverybody.com\nhyppmm.com\nhyptec.com\nhypyimei.com\nhyqcw.com\nhyqdxcl.com\nhyrainbow.com\nhysbz.com\nhysec.com\nhyseim.com\nhyshengnian.org\nhyshi.net\nhysound.com\nhysteeltube.com\nhyswcn.com\nhyswjt.net\nhysyyl.com\nhysz.net\nhyt01.com\nhyt368.com\nhytbj.com\nhytch.com\nhytcshare.com\nhytd.com\nhytera.com\nhytxhd.com\nhytzqb.com\nhyun.cc\nhyundai-chhm.com\nhyundai-hmtc.com\nhyuuhit.com\nhyuyy.com\nhywater.net\nhywaternet.com\nhywh1999.com\nhywjjz.com\nhywx.com\nhyx1927.com\nhyxiang888.xyz\nhyxrmt.com\nhyxsoft.com\nhyxt.com\nhyy99.com\nhyybj.com\nhyyf.net\nhyyl.net\nhyyoa.com\nhyypjs.com\nhyyun.com\nhyyykj.net\nhyyyy.net\nhyyzy.com\nhyzc.com\nhyzc.net\nhyzcservice.com\nhyzenhospital.com\nhyzhcdn.com\nhyzhihe.com\nhyznjs.com\nhyzqxsb.com\nhyzui.com\nhz-alw.com\nhz-bdqn.com\nhz-ch.com\nhz-delixi.com\nhz-emc.com\nhz-etest.com\nhz-expo.com\nhz-gaoke.com\nhz-gn.com\nhz-hospital.com\nhz-jsyg.com\nhz-kedi.com\nhz-moon.com\nhz-pharm.com\nhz-polar.com\nhz-spring.net\nhz-tire.com\nhz-tt.com\nhz-winone.com\nhz-xiaofei.com\nhz-xin.com\nhz-zhuce.com\nhz-zq.com\nhz2jx.com\nhz2y.com\nhz3201.com\nhz3ds.com\nhz3y.com\nhz66.com\nhz6z.com\nhz7hospital.com\nhz8z.net\nhz9hospital.com\nhzabjt.com\nhzaee.com\nhzahy.com\nhzaiguojiang.com\nhzairport.com\nhzajjt.com\nhzallina.com\nhzamcare.com\nhzaoz.com\nhzapu.com\nhzapuqi.com\nhzaygb.com\nhzazh.com\nhzbcdp.com\nhzbcxg.com\nhzbh.com\nhzbhjy.com\nhzbhsh.com\nhzbianqing.com\nhzbianqu.com\nhzbike.com\nhzbjwy.com\nhzbk.net\nhzbojin.com\nhzbomed.com\nhzbook.com\nhzboxing.com\nhzboxuan.com\nhzbpm.com\nhzbx.com\nhzc.com\nhzcables.com\nhzcbparking.com\nhzcbs.com\nhzccb.net\nhzcctech.com\nhzcd120.com\nhzcda.com\nhzcdhcyy.com\nhzcdycyy.com\nhzcdyyhc.com\nhzcdyyyc.com\nhzcekong.com\nhzch.org\nhzchaoxiang.com\nhzchengdun.com\nhzchengdun.net\nhzchgj.com\nhzcjtz.com\nhzcmc.com\nhzcmdq.com\nhzcnc.com\nhzcollege.com\nhzcopyright.com\nhzcourse.com\nhzctjs.com\nhzctkj.com\nhzctxh.com\nhzcy.com\nhzczjt.com\nhzdajiangdong.com\nhzdare.com\nhzddwk.com\nhzdelian.com\nhzdely.com\nhzdgjc.com\nhzdjr.com\nhzdjy.com\nhzdledu.com\nhzdlrj.com\nhzdmpower.com\nhzdongyu.com\nhzdq.com\nhzdsrmyy.com\nhzdtv.tv\nhzdx.com\nhzebang.com\nhzec-tencentclb.cloud\nhzec-tencentclb.com\nhzec-tencentclb.net\nhzec-tencentclb.work\nhzecsemir.com\nhzeeec.com\nhzeg.com\nhzelec.com\nhzepd.com\nhzeyun.com\nhzfc.cc\nhzfc365.com\nhzfeat.com\nhzfeiyao.com\nhzfesco.com\nhzfj.com\nhzfllbj.com\nhzfolo.com\nhzfpay.com\nhzfstz.com\nhzfucai.net\nhzfuturehos.com\nhzfwq.com\nhzfzxh.com\nhzgcec.com\nhzgcgl.com\nhzggfw.com\nhzgh.org\nhzgjj.com\nhzglsb.com\nhzgmwl.com\nhzgolong.com\nhzgoyuan.com\nhzgrow.com\nhzgrys.net\nhzgthb.com\nhzguode.com\nhzguojiao.com\nhzgwzn.com\nhzgxr.com\nhzgymd.com\nhzgzsoft.com\nhzh0775.com\nhzh1.com\nhzhadx.com\nhzhanbo.com\nhzhchj.com\nhzhcia.com\nhzhcloud.com\nhzhebei.com\nhzhehua.com\nhzhehui.com\nhzhengding.com\nhzhengtong.com\nhzhf.com\nhzhfdc.com\nhzhfzx.com\nhzhike.com\nhzhisoft.com\nhzhkai.com\nhzhl666.com\nhzhlcc.com\nhzhlgzx.net\nhzhlpt.com\nhzhltec.com\nhzhm888.com\nhzhnano.com\nhzhnzdh.com\nhzhqdj.com\nhzhqqz.com\nhzhr.com\nhzhssy.com\nhzhstb.com\nhzhtlh.com\nhzhuning.com\nhzhuti.com\nhzhx.com\nhzhxfy88888.com\nhzhxsy.com\nhzhy163.com\nhzhyqp.com\nhziam.com\nhzimc.com\nhzinfo.com\nhzins.com\nhzins.net\nhzj7.com\nhzjbzg.com\nhzjcbg.com\nhzjcp.com\nhzjcqczl.com\nhzjcxh.com\nhzjdi.net\nhzjiaro.com\nhzjiaxiao.com\nhzjie7.com\nhzjingxian.com\nhzjinlu.com\nhzjiuyimo.com\nhzjizhun.com\nhzjlcs.com\nhzjljt.com\nhzjmjl.com\nhzjndz.com\nhzjqhy.com\nhzjsjl.com\nhzjtfw.com\nhzjtgcjt.com\nhzjtjl.com\nhzjtjypt.com\nhzjunglepay.com\nhzjuzhi.com\nhzjxapp.com\nhzjxhy.com\nhzjxj.com\nhzjxmd.com\nhzjyks.net\nhzjynet.com\nhzjywl.net\nhzjzjc.com\nhzjzmed.com\nhzjzxh.com\nhzkaiming.com\nhzkangji.com\nhzkayo.com\nhzkcck.com\nhzkemengda.com\nhzkesheng.com\nhzkjcyy.com\nhzkjgf.com\nhzkjn.com\nhzkln.com\nhzklyy.com\nhzkqyyjt.com\nhzkszx.com\nhzlange.com\nhzlawyer.net\nhzlczx.com\nhzleaper.com\nhzleshun.com\nhzlgzs.net\nhzliangdong.com\nhzlingxing.com\nhzljlyy.com\nhzlp.com\nhzlqgroup.com\nhzlrbiotech.com\nhzlrhb.com\nhzlug.org\nhzlyhs.com\nhzmama.net\nhzman.net\nhzmansheng.com\nhzmantu.com\nhzmba.com\nhzmcd.com\nhzmctech.com\nhzmdch.com\nhzmdcnc.com\nhzmeizhuo.com\nhzmest.com\nhzmetro.com\nhzmgdj.com\nhzmixc.com\nhzmkdq.com\nhzmobius.com\nhzmogo.com\nhzmrcar.com\nhzmsholding.com\nhzmt001.com\nhzmtg.com\nhzmtjx.com\nhzmxkj.net\nhzmygg.com\nhzmylike.com\nhzncc.com\nhznet.tv\nhznetwk.com\nhznewface.com\nhznews.com\nhznkg.com\nhznrkj.com\nhznsh.com\nhzntjt.com\nhznunxc.com\nhznzcn.com\nhzok.net\nhzorganicchem.com\nhzou.net\nhzpcs.com\nhzpgc.com\nhzpswy.com\nhzpzs.net\nhzqfy.com\nhzqiuxue.com\nhzqj.com\nhzqjdz.net\nhzqlpt.com\nhzqsn.com\nhzqszl.com\nhzqvod.com\nhzqx.com\nhzqxbg.com\nhzqyhydrogen.com\nhzr1.com\nhzragine.com\nhzranqu.com\nhzrc.com\nhzrczx.net\nhzrdjt.com\nhzredream.com\nhzrib.com\nhzriyue.com\nhzrjjg.com\nhzrjkf.com\nhzrjmy.com\nhzrlciec.com\nhzrlhy.com\nhzrobam.com\nhzrqgf.com\nhzrsl.com\nhzrxsoft.com\nhzs2sc.com\nhzsaifang.com\nhzsanjiaomao.com\nhzsaso.com\nhzsbysj.com\nhzsbz.com\nhzsco.com\nhzscxsj.com\nhzsdjzgs.com\nhzsdlrmyy.com\nhzsdyfzfxxx.com\nhzseedcorp.com\nhzsgjj.com\nhzsh666.com\nhzshanjie.com\nhzshantai.com\nhzshengjia.com\nhzshudian.com\nhzshuren.com\nhzshw.com\nhzsjnxh.org\nhzslgf.com\nhzslgzx.com\nhzsmbio.com\nhzsnowcom.com\nhzsource.com\nhzsp.com\nhzspeed.com\nhzsports.net\nhzsqhb.com\nhzsqsmart.com\nhzsswjt.com\nhzstad.com\nhzstad88.com\nhzstar.com\nhzstarshuaier.com\nhzsteel.com\nhzstlzxyy.com\nhzsun.com\nhzsunup.com\nhzswmotor.com\nhzswysyy.com\nhzszls.com\nhzszyyy.com\nhzt2006.com\nhztbc.com\nhztchj.com\nhztcm.net\nhztdjt.com\nhzteaexpo.com\nhztek.com\nhzthinker.net\nhztianchuang.com\nhztianlang.com\nhztiger.com\nhztssy.com\nhztuoliang.com\nhztvmg.com\nhztx.com\nhztzkj.net\nhzvillas.com\nhzvtc.net\nhzwan.com\nhzwatch.com\nhzwaye.com\nhzweiheng.com\nhzwentou.com\nhzwer.com\nhzwf.link\nhzwgc.com\nhzwindpower.com\nhzwlt.com\nhzwluo.com\nhzwmhp.com\nhzwmw.com\nhzwomenmarathon.com\nhzwotu.com\nhzwqscl.com\nhzwsa.com\nhzwsjyjt.com\nhzwtech.com\nhzwyx.net\nhzx.center\nhzx8188.com\nhzxbcs.com\nhzxddt.com\nhzxded.com\nhzxdfpr.com\nhzxdship.com\nhzxiangbin.com\nhzxiangshang.com\nhzxiaoya.com\nhzxinglong-ip.com\nhzxiyuege.com\nhzxqf.com\nhzxsjgxx.com\nhzxsjtzt.com\nhzxuanming.com\nhzxuhong.com\nhzxy888.com\nhzxyns.com\nhzxywlkj.com\nhzy189.com\nhzyanglao.com\nhzyaohao.com\nhzyapu.com\nhzyb.com\nhzyestar.com\nhzyhjg.com\nhzyhzp.com\nhzyidc.com\nhzyjd.com\nhzyllh.com\nhzylpco.com\nhzyn888.com\nhzyoka.com\nhzyoushu.com\nhzyqys.com\nhzyread.com\nhzyuejie.com\nhzyuewan.com\nhzywinf.com\nhzyxart.com\nhzyye.com\nhzyys.com\nhzyz.net\nhzyzhp.com\nhzyzxx.net\nhzzbco.com\nhzzckg.com\nhzzfxx.com\nhzzh.com\nhzzhaobiao.com\nhzzhhd.com\nhzzhileng.com\nhzzhiwei.com\nhzzhjs.com\nhzzhonggang.net\nhzzhonghao.com\nhzzhuode.com\nhzzhyl.com\nhzzhzm.com\nhzzjjsgc.com\nhzzjzk.com\nhzzkj.net\nhzzp.com\nhzzpko3186.vip\nhzzqzc.com\nhzzrmc.com\nhzzsfs.com\nhzzsxh.com\nhzztkj.com\nhzzuyin.com\nhzzx365.com\nhzzxyjhyy.com\nhzzxyy.com\nhzzzpt.com\ni-27.name\ni-520.net\ni-bei.com\ni-bigdatas.net\ni-click.com\ni-conference.org\ni-excellence.com\ni-f.work\ni-fanr.com\ni-firefly.com\ni-haitao.com\ni-hifi.com\ni-ktv.com\ni-lewan.com\ni-lu.cc\ni-m.dev\ni-manji.com\ni-markit.com\ni-md.com\ni-miguo.com\ni-mock.com\ni-modec.com\ni-mofang.com\ni-morefun.com\ni-mylab.com\ni-neeq.com\ni-now.com\ni-oranges.com\ni-same.com\ni-sensjs.com\ni-shu.com\ni-shunxi.com\ni-size.com\ni-swimmer.com\ni-tetris.com\ni-tongfang.com\ni-touchpanel.com\ni-vista.org\ni-weichuan.com\ni-xiaohaibao.com\ni-xinnuo.com\ni-xoron.com\ni-z-e.com\ni.dell.com\ni.ipinyou.com\ni.pki.goog\ni007.vip\ni027.com\ni0349.com\ni0469.com\ni0734.com\ni0746.com\ni075.com\ni0766.com\ni0898.org\ni11r.com\ni121.net\ni1608.com\ni16949.com\ni171.com\ni1758.com\ni1766.com\ni178.info\ni1r.cc\ni2863.com\ni2abc.com\ni2eas.com\ni2finance.net\ni2ya.com\ni360mall.com\ni369.com\ni3839.com\ni3abox.com\ni3ciebwk6ixfb.com\ni3done.com\ni3dpworld.com\ni3geek.com\ni3gt.com\ni3smot.com\ni3vsoft.com\ni3yuan.com\ni3z.cc\ni4px.com\ni4t.com\ni51game.com\ni52tt.com\ni5399.com\ni56r.com\ni588ku.com\ni5a6.com\ni5i6.net\ni5p.com\ni5sto.com\ni5tea.com\ni66wan.com\ni6879.com\ni72.com\ni77p94y6yi.com\ni7car.com\ni7fh.com\ni7gg.com\ni7ol.com\ni7play.com\ni7txt.cc\ni8956.com\ni8i8i8.com\ni8toys.com\ni8tq.com\ni91pv.com\ni965300.com\ni987.com\ni9978.net\ni9dhjx.ru\ni9mr.com\ni9rht.com\ni9star.com\nia-shenzhen.com\niaapc.org\niacstar.com\niaddata.com\niadmob.com\niadmore.com\niadtracker.com\niaeac.org\niagefans.com\niai-robot.com\niaion.com\niaitao.com\niaixue.com\niajl.org\nialicdn.com\nialloc.com\niamabio.com\niambocai.com\niameduwork.com\niamfisher.net\niamips.com\niamle.com\niamlintao.com\niamlm.com\niamshuaidi.com\niamsujie.com\niamtxt.com\niamvloger.com\niamvlogger.com\niamxcb.com\niamxiaoming.net\niamxk.com\nianbaby.com\niandun.com\nianvisa.com\nianxing.com\niaocwbk.com\niaoligame.com\niaoyou.com\niaozi.com\niaozu.com\niape-js.com\niapijy.com\niapkk.com\niapolo.com\niappad.com\niappdaily.com\niapprank.com\niapps.im\niappsafe.com\niappsign.com\niappstoday.com\niapptry.com\niarlejz.com\niars-wuhan.com\niask-media.com\niask.com\niask.in\niaskbus.com\niaskhot.com\niasmr.cc\niat-auto.com\niautodaily.com\niautodraw.com\niautopress.com\niavira.com\niaviva.com\niavlife.com\niaxure.com\niazhi.com\nib-china.com\nib3-gogin.com\nibabyjoy.com\nibadboy.net\nibailve.com\nibaiqiu.com\nibaitiao.com\nibaizhu.com\nibanana.club\nibanbu.com\nibanggo.com\nibangkf.com\nibangquan.com\nibangtiao.com\nibanma.net\nibanquan.com\nibantang.com\nibanyu.com\nibaobay.com\nibaoji.cc\nibaoji.com\nibaossl.com\nibaotu.com\nibaoxiu.net\nibaralioho.com\nibashu.net\nibayapp.com\nibb2b.com\nibbwhat.com\nibcet.org\nibczy.com\nibdxigualive.com\nibdxiguavod.com\nibee360.com\nibeidiao.com\nibeifeng.com\nibeiig.com\nibenxi.com\nibestapp.com\nibestfanli.com\nibeta.me\nibianma.com\nibicn.com\nibidian.com\nibiji.com\nibingniao.com\nibiquge.info\nibiquge.la\nibiquge.net\nibiquges.com\nibiquges.info\nibiquges.org\nibiquke.com\nibiquku.la\nibiquxs.info\nibiquxs.net\nibiquzw.info\nibireme.com\nibituo.com\nibixiaxs.com\nibkcn.com\nibkstore.com\nibl520.com\niblimg.com\niblog.ren\nibloger.net\niblue.com\niblue.me\nibluefrog.com\nibluesocial.com\niblwl.com\nibm-dns.com\nibmcampus.com\nibmfwqdl.com\nibmhz.com\nibmwclub.com\nibobscs.com\nibodao.com\nibodyhome.com\niboohee.com\nibook8.com\nibooker.cc\nibooloo.com\nibornclinic.com\nibossay.com\nibox.art\niboxpay.com\nibreader.com\nibreeno.com\nibribery.com\nibrilife.com\nibroadlink.com\nibruce.info\nibscdn.com\nibtsat.com\nibucm.com\nibuick.com\nibuscloud.com\nibuscloud.net\nibuychem.com\nibw.cc\nibytedapm.com\nic-bro.com\nic-captain.com\nic-itssc.org\nic-king.com\nic-ldo.com\nic-leasing.com\nic-mag.com\nic-spic.com\nic-valley.com\nic001.org\nic2china.com\nic37.com\nic71.com\nic72.com\nic98.com\nic9cube.com\nica-alliance.org\nicabcm.org\nicaew-china.com\nicafe8.com\nicafe8.net\nicai.vip\nicaidao.com\nicaifu.com\nicaile.com\nicall.me\nican-x.com\nican365.net\nicandata.com\nicaneasy.com\nicangshu111.com\nicanvideo.com\nicarbonx.com\nicardfinancial.com\nicaredbd.com\nicasiso.com\nicastlewar.com\nicax.org\nicbc-at.com\nicbc-axa.com\nicbc-cz.com\nicbc-ltd.com\nicbc-uk.com\nicbc-us.com\nicbc.ae\nicbc.be\nicbc.co.id\nicbc.co.jp\nicbc.co.kr\nicbc.co.nl\nicbc.com.au\nicbc.com.es\nicbc.com.kh\nicbc.com.kw\nicbc.com.la\nicbc.com.mm\nicbc.com.mo\nicbc.com.mx\nicbc.com.pe\nicbc.com.pk\nicbc.com.qa\nicbc.com.sg\nicbc.com.vn\nicbc.de\nicbc.eu\nicbc.jp\nicbc.lu\nicbcalmaty.kz\nicbcamg.com\nicbcasia.com\nicbcbr.com.br\nicbci.com.hk\nicbcina.com\nicbcindia.com\nicbcit.com\nicbcleasing.com\nicbclondon.com\nicbcme.ae\nicbcmoscow.ru\nicbcmy.com\nicbcnz.com\nicbcpanama.com\nicbcparis.fr\nicbcpl.com\nicbcstandard.com\nicbcstandardbank.com\nicbcstandardresources.com\nicbcstandardsecurities.com\nicbcswiss.com\nicbcthai.com\nicbcwallet.com\nicbeexpo.com\nicbkfs.com\nicbkus.com\nicbuy.com\nicc.link\niccchina.com\niccessh.org\niccgame.com\niccgame.net\nicchaoren.com\niccidchaxun.com\niccircle.com\niccsz.com\nicctbs.org\niccvlog.com\nicdeal.com\nicdemi.com\nicdmall.com\nicdn2.com\nicdream.com\nicdt-conf.com\nice.work\nice1000.org\nice138.com\niceasy.com\nicebear.me\nicebound.cc\nicecast-ruvr.cdnvideo.ru\nicecloud-car.com\nicedropper.com\niceflowsoft.com\nicefoxgame.com\nicehotisland.com\niceinto.com\nicekylin.online\nicemle.org\nicentown.com\nicepie.net\niceread.com\niceriverbj.com\nicesimba.com\nicesofts.com\nicetorrent.org\nicevirtuallibrary.com\nicevpn.org\nicewingcc.com\nicewoo.com\nicfans.com\nicfcc.com\nicfgblog.com\nicfqs.com\nicfusions.com\nicg.cc\nicgbl.org\nicgebm.org\nicgoo.net\nicgu.com\nich8.com\nichacha.com\nichanfeng.com\nichang8.com\nichangtou.com\nichangyan.com\nichanyu.com\nichaoshangyue.com\nichaotao.com\nichaotu.com\nichat800.com\nichatcn.com\nichdata.com\nicheese.net\nichehome.com\nichemsafe.com\nichenfu.com\nichengli.com\nichengsi.com\nichengyun.net\nichennan.com\nicheruby.net\nicheshi.com\nichezhan.com\nichhlj.com\nichika.cc\nichinaceo.com\nichinaenergy.com\nichong123.com\nichongdao.com\nichtcm.com\nichuanglan.com\nichuangye.com\nichuanyi.com\nichuguang.com\nichunqiu.com\nichunt.com\nichzh.com\niciba.com\niciba.net\nicicicic.com\nicignacmb.com\nicinfo.net\nicirculation.com\nicitizens.net\nicitymobile.com\nicixun.com\niciyuan.com\nicjs.ink\nickeep.com\nicketang.com\nickey.cc\nickimg.com\niclabcn.com\niclicash.com\niclickstatic.com\nicliexpo.com\nicljt.com\nicloud-power.com\nicloudcity.com\nicloudgslb.com\nicloudnative.io\nicloudnews.net\niclouds.work\nicloudv6.com\nicloudwaf.com\nicmaxgroup.com\nicme14.org\nicminer.com\nicmomo.com\nicmp.link\nicmsdev.com\nicnal.com\nicnano-tech.com\nicncpc.com\nicnjob.com\nicnkr.com\nicntv.tv\nicntvcdn.com\nico-deli.com\nicoat.cc\nicoc.bz\nicoc.in\nicoc.me\nicoc.vc\nicodelogic.com\nicoderobot.com\nicofchina.com\nicomuimi.com\niconntech.com\nicoolby.com\nicoonal.xyz\nicoou.com\nicoremail.net\nicos8.com\nicosky.com\nicostapp.com\nicosz.com\nicot.com\nicourse163.com\nicourse163.org\nicourses163.com\nicourses163.org\nicourt.cc\nicp.red\nicp100.net\nicp21.com\nicpapi.com\nicpbcm.org\nicpcdn.com\nicpcw.com\nicpdaili.com\nicpdf.com\nicpeexpo.com\nicpenguin.com\nicpenguin.net\nicphu.com\nicpisp.net\nicpkuaiban.net\nicplishi.com\nicqmwrhm.com\nics-sec.com\nics.design\nicshanghai.com\nicsisia.com\nicslx.com\nicsoc.net\nicson.com\nicspec.com\nicsprout.com\nicstreet.com\nicsuns.com\nicswb.com\nict18.com\nict361.com\nict88.com\nictbda.com\nictcsr.org\nictdns.cloud\nictdns.icu\nictdns.store\nictdns.tech\nictehi.com\nictest8.com\nictlce.com\nictown.com\nictp-ap.org\nictpaas.com\nictun.com\nictuniv.com\niculture.cc\nicustomslawyer.com\nicv-ip.com\nicvcs.com\nicver.com\nicvip.com\nicxbk.com\nicxinli.com\nicy-capital.com\nicytown.com\nicyuyan.net\nicz.com\niczhiku.com\niczoom.com\nid-bear.com\nid-photo-verify.com\nid4r.com\nid4r.net\nid57.com\nida-a.org\nidaasksyun.com\nidachu.com\nidacn.org\nidadt.com\nidailycar.com\nidaima.com\nidangyang.com\nidanpianji.com\nidaocao.com\nidaotuo.com\nidatacube.com\nidataforces.com\nidatage.com\nidatagx.com\nidataway.com\nidatawz.com\nidayer.com\nidbhost.com\nidc-icp.com\nidc-status.com\nidc002.com\nidc021.com\nidc027.net\nidc029.com\nidc123.com\nidc129.com\nidc1680.com\nidc180.com\nidc218.com\nidc31.com\nidc35.com\nidc4.com\nidc400.com\nidc45.com\nidc789.com\nidc917.com\nidcay.com\nidcbdy.com\nidcbest.com\nidcbest.hk\nidccenter.net\nidcchacha.com\nidccom.net\nidccun.com\nidcd.com\nidcdoc.com\nidceb.com\nidcfengye.com\nidcgcloudcs.com\nidchz.com\nidchz.net\nidcicp.com\nidcicpdns.com\nidcjf.com\nidckx.com\nidcloudbase.com\nidcmz.com\nidcoffer.com\nidcpu.com\nidcquan.com\nidcsec.com\nidcser.com\nidcsh.com\nidcsmart.com\nidcsp.com\nidcspy.com\nidcspy.net\nidcss.com\nidctalk.com\nidctq.com\nidcug.com\nidcum.net\nidcun.com\nidcvendor.com\nidcvip.net\nidcwn.com\nidcwp.com\nidcys.com\nidcyunwei.org\nidczone.net\nidd1.com\nideabody.com\nideacarbon.org\nideacms.net\nideacreated.com\nideaflow.pro\nideagou.com\nideaintellij.com\nidealbags.com\nidealcontrol.com\nidealdeposition.com\nidealeer.com\nidealideapromos.com\nidealjj.com\nidealshanghai.com\nideanote.cc\nideapool.tv\nideappt.com\nidearhanyu.com\nideasr.com\nideassoft.com\nideation.love\nideazhao.com\nideepin.com\nideerled.com\nidejian.com\nidejian.net\niden123.com\nidepu.org\nidesktopcal.com\nidevbase.com\nidgeeks.net\nidgou.com\nidgvc.com\nidianchou.com\nidianfa.com\nidiankj.com\nidianshijia.com\nidiaoyan.com\nidigi.net\nidingju.com\nidlegog.com\nidloves.com\nidlpc.win\nidmzj.com\nidnscloud.com\nido-love.com\nido512.com\nidoacg.com\nidocbank.com\nidocv.com\nidodb.com\nidol001.com\nidolmoba.com\nidom.me\nidong.ren\nidongde.com\nidongdong.com\nidongniu.com\nidongzhi.com\nidooshu.com\nidosend.com\nidotools.com\nidoupiao.com\nidouqu.com\nidourl.com\nidouyinliving.com\nidouyinpic.com\nidouyinstatic.com\nidouyinvod.com\nidouzi.com\nidoyun.com\nidqqimg.com\nidreamsky.com\nidreamsoft.com\nidrools.com\nidrwl.com\nidscn.net\nidshi.com\nidsoo.com\nidspub.net\nidss.shop\nidsuipai.com\nidtcdn.com\nidtechwh.com\nidu9.com\niduba.com\niduiying.com\nidukaqi.com\niduochong.com\niduodou.com\niduokan.net\niduomi.cc\nidux-vw.com\nidwzs.com\nidwzx.com\nidx365.com\nie13.com\nie515.com\nie525.com\nie57.com\nie815.com\nie915.com\nie935.com\nieasn.com\nieasou.com\nieasy123.com\nieasyclick.net\nieasytech.com\nieasytest.net\nieayoio.com\niecdn.com\niecidc.com\niecity.com\niecool.com\niecworld.com\nieduchina.com\nieduglobe.com\nieechina.com\nieee-jas.net\nieee.org\nieeepower.com\nieeewifi.com\nieepa.org\nieevchina.com\niefang.com\niefans.net\nieffect.cc\nieforever.com\niefrd.com\niefxz.com\niegcom.com\niegourl.com\nieh-hz.com\niehou.com\nieisystem.com\niejiu.com\nieliulanqi.net\nieltsabc.com\nieltsonlinetests.com\niemailforce.com\niemblog.com\niemnet.xyz\niemouepk.com\nienglish.store\nienjoys.com\nienjoys.mobi\nientire.biz\niepcn.com\niepose.com\nieppcn.com\nieqkypcq.com\nierze.com\niesdouyin.com\niesdouyin.net\nieshs.com\nieshs.net\nieshuodong.net\nieshuoshan.com\nieshuoshan.net\niessay100.com\nietdata.com\nietheme.com\nietrcd.com\nievision.com\niewb.net\niewie.org\niewoai.com\niewzx.com\niex-group.com\niexx.com\nieyecloud.com\niezuo.com\nif1f.com\nifabao.com\nifabiao.com\nifaclub.com\nifanbei.com\nifangarden.com\nifangka.com\nifanpu.com\nifanr.com\nifanr.in\nifanrcloud.com\nifanrprod.com\nifanrprod.net\nifanrusercontent.com\nifanrx.com\nifareast.com\nifatrabbit.com\nifaxin.com\nifaxin.org\nifconfig.cc\nifcresidence.com\nifdian.net\nifeart.ltd\nifedge.com\nifeehei.xyz\nifeilian.com\nifeimo.com\nifeng.com\nifengcdn.com\nifengcu.com\nifenghui.com\nifengidc.com\nifengimg.com\nifengli.com\nifenglian.com\nifenglife.com\nifengmap.com\nifengo.com\nifengpai.com\nifengqun.com\nifenguo.com\nifengweekly.com\nifengwoo.com\nifengyin.com\nifensi.com\nifenxi.com\nifenxiang.cc\nifere.com\nifeve.com\niffline.com\nifindever.com\nifintechnews.com\nifireeye.com\nifireflygame.com\nifish7.com\nifitbox.com\nifjing.com\nifjqq.com\nifkeji.com\nifkz256x3p.com\niflix.com\niflow.work\niflowercity.com\niflyadx.com\niflyaiedu.com\niflyauto-solution.com\niflydatahub.com\niflydocs.com\niflygse.com\niflyhealth.com\niflying.com\niflyink.com\niflyiot.com\niflynote.com\niflyread.com\niflyrec.com\niflyresearch.com\niflysec.com\niflytek.com\niflytekin.com\niflytektstd.com\niflytoy.com\nifmtech.com\nifnews.com\nifonelab.net\nifonts.com\niforce-ad.com\niforce-media.com\nifoxfactory.com\nifoxhui.com\nifread.com\nifreecdn.com\nifreecomm.com\nifreedom.icu\nifreedom001.com\nifreetalk.com\nifreeurl.com\nifresh.mobi\nifromvr.com\nifscity.com\nifseclabs.com\nifshot.com\nifundstore.com\nifunmac.com\nifutest.com\nifutureworks.com\nifxtx.com\nifzxs.cc\nifzzw.com\nigaichong.com\nigame007.com\nigame58.com\nigamecj.com\nigandan.com\niganggu.com\nigao7.com\nigaoda.com\nigaokaopai.com\nigaosheng.com\nigarwin.com\nigbill.com\nigdzc.com\nigea-un.org\nigeak.com\nigeciku.com\nigeekbar.com\nigeekys.com\nigeidao.com\nigelou.com\nigenetech.com\nigengmei.com\nigeshui.com\nigetget.com\nigetmall.net\nigevin.info\nigimu.com\nigkbroker.com\niglda.com\niglqh.com\nigo180.com\nigo52.com\nigocctv.com\nigome.com\nigomkt.com\nigoodgame.com\nigooma.com\nigou.com\nigoyx.com\nigps123.com\nigpsport.com\nigptex.com\nigreatdream.com\nigrs.org\nigta.vip\nigtm-a101.com\nigtm-b101.com\nigtm-c101.com\nigtm-d101.com\nigtm-e101.com\nigtm-meeting-tencent.com\nigtm-yuanbao.com\nigtm.pub\niguaka.com\niguangdiu.com\niguanyu.com\niguazutraffic.xyz\niguder.com\niguitar.me\niguizao.com\niguming.net\nigumo.cc\niguoguo.net\niguopin.com\niguoplay.com\niguowan.com\niguoyin.com\niguxuan.com\nigwfmc.com\nigwzx.com\nigxbaidu.net\nihacksoft.com\nihaier.com\nihaima.com\nihaique.net\nihaiu.com\nihaiyan.com\nihanbridge.com\nihanghai.com\nihanhua.com\nihani.tv\nihansen.org\nihanshi.com\nihaohaoxuexi.com\nihaoma.icu\nihaoqu.com\nihaoxi.com\nihaozhuo.com\nihappy.vip\nihappystudio.com\nihappystudio.net\nihasl.com\nihdt.tv\nihdty.com\nihealthcoming.com\nihei5.com\niheima.com\nihello.cc\nihelpy.net\nihemuu.com\nihenda.com\nihengheng.com\nihepa.com\nihggccampaign.com\nihicon.com\nihigee.com\nihint.me\nihisce.com\nihitui.com\nihitun.com\nihkk.net\nihlimtv.com\nihmch.com\nihnhr.com\nihomefnt.com\nihomesoft.net\nihongde.com\nihongma.com\nihongmeng.tech\nihongpan.com\nihonker.com\nihotchip.com\nihou.com\nihourglass.club\nihowguide.com\nihqfo.org\nihr360.com\nihrscloud.com\nihst8.com\nihstatic.com\nihtcboy.com\nihtmlcss.com\nihtwmi.yachts\nihuaben.com\nihuan.me\nihuang.org\nihuanling.com\nihuanque.com\nihuayou.com\nihuazhan.net\nihuge.net\nihui.com\nihuidian.com\nihuigo.com\nihuipao.com\nihuisida.net\nihuman.com\nihumand.com\nihuntto.com\nihuoli.com\nihuoqiu.com\nihuoshanimg.com\nihuoshanlive.com\nihuoshanstatic.com\nihuoshanvod.com\nihuoyan.com\nihupo.com\nihuyi.com\nihwrm.com\nihxlife.com\nihyhs.com\nihying.cc\nihykb.com\nihypnus.com\nihypo.net\nihytv.com\nihzzy.com\nii.td\nii010.com\nii090.com\nii35.com\nii77.com\niianews.com\niiaq.net\niiast.com\niiauuw.com\niibechina.com\niibq.com\niicall.com\niicats.com\niicha.com\niicheese.com\niicp.net\niicz.cc\niidns.com\niidx.fun\niieii.com\niiesz.com\niieye.cc\niii80.com\niiiaaa.com\niiiddd.com\niiiib.com\niiiimg.com\niiijk.com\niiiview.net\niikuzhan.com\niikx.com\niinhotel.com\niinorii.com\niiolink.com\niiong.com\niipcloud.com\niipiano.com\niirii.com\niirpwigs.com\niis7.com\niis7.net\niis8.com\niischool.com\niisfree2.com\niisp.com\niispbdy.com\niissnan.com\niitang.com\niitcp.com\niithz.com\niitol.com\niituku.com\niivd.net\niivey.com\niiwoo.com\niiyi.com\niiyiyi.com\nijatv.com\nijh.cc\nijheng.com\nijia120.com\nijia360.com\nijiandao.com\nijiangyin.com\nijianji.com\nijiaoxue.net\nijiatv.com\nijicai.com\nijie.com\nijiebao.com\nijiedian.com\nijiela.com\nijindun.com\nijingdi.com\nijingyi.com\nijinshan.com\nijinzhuan.com\nijishu.cc\nijiwei.com\nijiwen.com\nijizhi.com\nijjnews.com\nijkuhygabc.work\nijkxt.com\nijml.net\nijnqc.com\nijovo.com\nijq.tv\nijsi.org\nijson.com\nijsp.net\nijuanshi.com\nijuer.com\nijuhepay.com\nijunhai.com\nijunxun.com\nijuzhong.com\nijxuitr.com\nijycnd.com\nijzhang.com\nik123.com\nik3cloud.com\nikafan.com\nikahe.com\nikaixun.com\nikaka.com\nikanchai.com\nikang.com\nikanoo.com\nikantu365.com\nikaolaa.com\nikaowu.com\nikb.vc\nikcd.net\nikcest.org\nikck.com\nikcrm.com\nikcw.com\nikdmjx.com\nike-global.com\nikebukuro777.org\nikeled.com\nikemeng.com\nikepu.com\nikgambwqeqnv.com\nikhimalayaniq.com\nikj123.com\nikj168.com\nikjds.com\nikjtao.com\nikjxc.com\nikmoo.com\nikmt.net\nikncn.com\nikonfx.com\nikongjian.com\nikongjun.com\nikonke.com\nikoori.com\nikozn.com\nikqtcbva.com\niksea.com\nikuai8-wifi.com\nikuai8.com\nikuaicai.com\nikuaimi.com\nikuaiyue.com\nikuajing.com\nikuayou.com\nikuju.com\nikunac.com\nikuncdnfb.com\nikunpay.com\nikupan.me\nikvoaxzw.com\nikx.me\nikxnes04.com\nikyy.cc\nikzybf.com\nilab-x.com\nilabilab.com\nilaisa.com\nilaitui.com\nilangqu.com\nilanni.com\nilanyao.com\nilanzou.com\nilaoyou.com\nilaozhu.com\nilaw13.com\nilaw66.com\nilawpress.com\nilazycat.com\nilcweloc.com\nilea-roswell.org\nileadsun.com\nileapcloud.com\nileci.com\nileedarson.com\nileehoo.com\nileju.com\nileopard.com\nileshua.com\niletou.com\nilewan.com\niliangcang.com\nilianwo.com\nilianyue.com\nilibrand.com\nilifesmart.com\nilikemanga.com\nilingdai.com\nilinki.net\nilinkmall.com\nilinkone.com\nilinksure.com\nilinuxkernel.com\nilinyi.net\nilishi.net\nilivehouse.com\nilixiangguo.com\niliyu.com\nilll.xyz\nilmgq.com\nilohas.com\niloli.bid\niloli.xin\nilongre.com\nilongterm.com\nilonhoo.com\niloveanan.com\nilovechao.com\nilovefishc.com\niloveopened.com\nilovey.live\nilovezuan.com\nilovezz.com\nilsungf.com\nilucky.net\niluckysf.net\niluezhi.com\nilufan.com\niluhang.com\nilustrepro.com\niluvatar.ai\niluvatar.com\nilux.ai\nilvxing.com\nilxdh.com\nilxtx.com\nilydjk.com\nilz.me\nim-cc.com\nim-ch.com\nim.ci\nim286.com\nim286.net\nim2maker.com\nim323.com\nim577.com\nim5i.com\nim9.com\nimaccn.com\nimachina.com\nimaegoo.com\nimage-tech.vip\nimageaccelerate.com\nimageedu.com\nimagefuture101.com\nimagehub.cc\nimagelol.com\nimageoss.com\nimageplusplus.com\nimageplusplus.net\nimagepy.org\nimagerjt.com\nimages-amazon.com\nimages-cache.com\nimages-cn-8.ssl-images-amazon.com\nimages-cn.ssl-images-amazon.com\nimages.samsung.com\nimagestoryai.com\nimagetotxt.com\nimagiclouds.com\nimaginde.com\nimagineadtech.com\nimaibo.net\nimaicai.mobi\nimaijia.com\nimaitu.com\nimalljoy.com\nimallvip.com\nimalun.com\nimandarin.net\nimanke.com\nimao2.com\nimaojiang.com\nimarketchina.com\nimarkr.com\nimaschina.com\nimatlas.com\nimayitxt.com\nimbackr.com\nimbeiyu.com\nimblog.in\nimbtk.com\nimcapptest.com\nimcart.com\nimcclinics.com\nimcec.org\nimchinese.net\nimcn.me\nimcome.net\nimcoming.com\nimconlinereg.com\nimcq.net\nimd-marketing.com\nimdadui.com\nimdmedical.com\nimdo.co\nimdodo.com\nimdst.com\nimedao.com\nimedcloudimage.com\nimedera.com\nimedicalai.com\nimedlab.net\nimedp.com\nimeete.com\nimeete.net\nimeete1.com\nimeete2.com\nimeete3.com\nimeete4.com\nimeeton.com\nimefuture.com\nimeidb.com\nimeihei.com\nimeimama.com\nimeiren.com\nimeirongyi.com\nimeishike.com\nimeitools.com\nimeitou.com\nimelai.com\nimeme.tv\nimetacloud.com\nimeyahair.com\nimf.org\nimfirewall.com\nimfooww.com\nimg-space.com\nimg-static.tech\nimg-sys.com\nimg.beauty\nimg.ink\nimg.net\nimg.run\nimg.samsungapps.com\nimg.vin\nimg001.com\nimg005.com\nimg168.net\nimg16888.com\nimg4399.com\nimg4me.com\nimg898.com\nimgbed.link\nimgcdc.com\nimgchr.com\nimgcook.com\nimgdd.cc\nimgdianying.com\nimgdianyingoss.com\nimge.cc\nimgeek.net\nimgeek.org\nimgets.com\nimgii.com\nimgkr.com\nimglefeng.com\nimglink.win\nimgmarket.net\nimgmg.com\nimgo.tv\nimgs.ovh\nimgscdn.com\nimgse.com\nimgsha.com\nimgsina.com\nimgsohu.com\nimgtex.com\nimgtg.com\nimgurl.org\nimgyzzy.com\nimgzy360.com\nimhan.com\nimhdr.com\nimhuchao.com\nimiaomeng.com\nimibaby.net\nimibao.com\nimicome.com\nimifun.com\nimigu.com\nimiker.com\nimile-inc.com\nimile.com\nimitui.com\nimixpark.com\nimjiayin.com\nimkero.net\nimkevinyang.com\nimlaidian.com\nimlazy.ink\nimlb2c.com\nimlianai.com\nimlianpu.com\nimliuyi.com\nimlizhi.com\nimmeee.com\nimmfast.com\nimmi520.com\nimmiexpo.com\nimmiknow.com\nimmivip.com\nimmomo.com\nimmomogame.com\nimmotors.com\nimmune-path.com\nimmusician.com\nimmviragroup.com\nimnerd.org\nimnight.com\nimnks.com\nimobile-ent.com\nimoe.me\nimoe.tech\nimoeer.com\nimofan.com\nimoffice.com\nimok.net\nimok.run\nimoke.org\nimol.cc\nimolive.tv\nimoo.com\nimooc.com\nimoocc.com\nimop.com\nimosi.com\nimotao.com\nimotion.group\nimoto.love\nimou.com\nimovideo.ru\nimp3.net\nimpcochina.com\nimperfectionstudio.com\nimperial-vision.com\nimperialsprings.com\nimperialspringsforum.org\nimpk.cc\nimpnails.com\nimportingtochina.com\nimprove-ai.com\nimprove-medical.com\nimpta.com\nimqianduan.com\nimqq.com\nimqq.net\nimquzan.com\nimrfresh.com\nimrobotic.com\nimroc.cc\nimscv.com\nimsharecenter.com\nimshu.cc\nimshusheng.com\nimsilkroad.com\nimsinoexpo.com\nimsle.com\nimsun.net\nimsyy.com\nimtaweb.net\nimtics.com\nimtrwqjier3.com\nimtuan.com\nimtyimages.vip\nimudgame.com\nimugeda.com\nimuke.com\nimummybiz.com\nimusicking.com\nimvictor.tech\nimvtc.com\nimwaco.com\nimwallet.com\nimweb.io\nimweia.com\nimwexpo.com\nimwork.net\nimwukong.com\nimwzh.com\nimx365.net\nimxh.com\nimxiaomai.com\nimxingzhe.com\nimxpan.com\nimycdn.com\nimycloud.com\nimydns.net\nimyfone.club\nimyike.com\nimyouxin.com\nimys.net\nimyshare.com\nimyuedu.com\nimyushu.com\nimzego.com\nimzhanghao.com\nimzhongxin.com\nimzhuomo.com\nimzudian.com\nimzy.ink\nin-driving.com\nin-en.com\nin-freight.com\nin-int.com\nin-tencentclb.cloud\nin-tencentclb.com\nin-tencentclb.net\nin-tencentclb.work\nin.th\nin001.com\nin66.com\nin800.com\nin853.com\nin955.com\ninabr.com\ninadvanceof.com\ninaink.com\ninav.site\ninbeing.net\ninbilin.com\ninbooker.com\ninboyu.com\ninc365.com\nincake.net\nincensechina.com\ninch.red\ninchitech.com\nincker.com\nincloudexpo.com\nincomperlite.com\nincomrecycle.com\nincopat.com\nincreasedct.com\nincsg.com\ninctrip.com\nind-map.com\nind4.net\nind9ed.com\nindetek-lab.com\nindexea.com\nindexedu.com\nindexedu.net\nindexfor.fun\nindexmob.com\nindics.com\nindielight.net\nindienova.com\nindier.com\nindigobeijing.com\nindmi.com\nindochinatraveladvisor.com\nindonesia-daily.com\nindubd.com\nindustrybamboo.com\nindustryillusion.com\ninduta.com\ninekoxia.com\ninengyuan.com\ninesa-it.com\ninesa.com\ninetech.fun\ninetmaster.net\ninewhope.com\ninewoffice.com\ninewskeji.com\ninexbot.com\ninfarts.net\ninferoey.com\ninfertilitybridge.com\ninfimotion.com\ninfineon-autoeco.com\ninfini-ai.com\ninfinisign.com\ninfiniteborders3kingdoms.com\ninfinitescript.com\ninfinity8ball.com\ninfinitynewtab.com\ninfinitytab.com\ninflyway.com\ninfo-insur.com\ninfo-monitor.com\ninfo-onesky.com\ninfo.cc\ninfo10.com\ninfo110.com\ninfo35.com\ninfobidding.com\ninfobigdata.com\ninfocloud.cc\ninfoeach.com\ninfohand.net\ninfohpc.com\ninfoier.com\ninfoldgames.com\ninfomorning.com\ninfong.net\ninfoobs.com\ninfoodfamily.com\ninfoq.com\ninfoqstatic.com\ninforbus.com\ninforeenviro.com\ninforguard.net\ninformrack.com\ninforsec.org\ninfosoft.cc\ninfovc.com\ninfoview.com\ninfowuxi.com\ninfoxgame.com\ninfoxiao.com\ninframe.mobi\ninftab.com\ninfyniclick.com\ninfzm.com\ning10bbs.com\ningageapp.com\ningags.com\ningaoyt.biz\ningcore.com\ningdan.com\ningeek.com\ningenic.com\ningkee.com\ningping.com\ningping.net\ningzhong.com\ninhalpharma.com\ninhdd.com\ninhe.com\ninhe365.com\ninheweb.com\ninhuawei.com\nini5.com\ninibiru.com\ninicoapp.com\ninidc.net\nininin.com\ninitaa.com\ninitac.com\ninitaf.com\ninitah.com\ninitaj.com\ninitbb.com\ninitcc.com\ninitdd.com\ninitff.com\ninitialview.com\ninitjj.com\ninitkk.com\ninitll.com\ninitmm.com\ninitnn.com\ninitpp.com\ninitqq.com\ninitroot.com\ninitrr.com\ninittt.com\ninituu.com\ninitvv.com\ninitww.com\ninitxa.com\ninitxb.com\ninitxx.com\ninitzz.com\ninja.com\ninjectionmachine.com\ninjoinic.com\nink4you.com\ninkankan.com\ninkcc.net\ninkcn.com\ninke.com\ninke.tv\ninkeygo.com\ninkonlife.com\ninkonote.com\ninktok.com\ninkuai.com\ninkwai.com\ninlandschool.com\ninlaylink.com\ninlighting.org\ninlishui.com\ninliuzhou.com\ninluckcalendar.com\ninmeng.net\ninmuu.com\ninmyshow.com\ninnatek.com\ninnnnnn.com\ninno3d.cc\ninnobm.com\ninnocn.com\ninnocomn.com\ninnodealing.com\ninnofidei.com\ninnogenpharm.com\ninnohere.com\ninnojoy.com\ninnolcon.com\ninnomd.org\ninnomddesign.com\ninnopack97.com\ninnoplayfun.com\ninnopro.cc\ninnos.com\ninnotechx.com\ninnotek-co.com\ninnotimegood.com\ninnotron.com\ninnov-xsystem.com\ninnovagt.com\ninnovane.com\ninnovatedigital.com\ninnovationmetal.com\ninnoventbio.com\ninnover.com\ninnoveronline.com\ninnovidcn.com\ninnovisgroup.com\ninnovmedicine.com\ninnvitor.com\nino3w.com\ninoherb.com\ninoneh5.com\ninong.net\ninoteexpress.com\ninovance-automotive.com\ninovogen.com\ninovppg.com\ninovpu.com\ninpla.net\ninplayable.com\ninputmore.com\ninqan.com\ninrice.com\ninrice.zone\ninrugao.com\nins110.com\ninsagee.com\ninsarticle.com\ninshion.com\ninshotapp.com\ninsigma-elec.com\ninsistence.tech\ninsmoin.com\ninsnail.com\ninsneu.com\ninsnex.com\ninsome.com\ninspeed.biz\ninspirecloud.com\ninspmobi.com\ninspur.com\ninspurcloudoss.com\ninspuronline.com\ninspurpower.com\ninspurpower.org\ninsta360.com\ninstafogging.com\ninstallgreat.com\ninstallwage.com\ninstantinfographicspresence.com\ninstome.com\ninsulators-china.com\ninsun-china.com\ninswindow.com\ninsxz.com\ninsytone.com\nint-agri.com\nint2018.com\nint800.com\nintaek.com\nintdmp.com\nintecheye.com\nintecol-10iwc.com\nintedc.com\nintegrity-funds.com\nintekey.com\nintel-space.com\nintelcupid.com\nintellect.black\nintelligen.ltd\nintelligence-electricity.net\nintelligentmanufactory.com\nintelvisioncn.com\nintencent.com\ninter-credit.net\ninter-rock.com\ninter1908.net\ninteractivebrokers.hk\ninterchinawater.com\ninterface003.com\ninteriorous.com\ninternational-gfe.nvidia.com\ninternationalbrand.net\ninternbird.com\ninternetke.com\ninternettrademark.com\nintertid.com\ninterval.im\nintimerent.com\nintlgame.com\nintlqydd.info\nintlscdn.com\nintltencentcos.com\nintmedic.com\nintmes.com\nintohard.com\nintomod.com\nintopet.com\nintostarry.com\nintovfx.com\nintowz.com\nintozgc.com\nintple.com\nintramirror.com\nintsavi.com\nintseamultiply.com\nintsig.com\nintsig.net\nintvolunteer.com\nintwho.com\nintwing.com\ninuobi.com\ninuorui.com\ninuu6.com\ninuyasha.love\ninvaluablu.com\ninverter.so\ninvescogreatwall.com\ninvest-data.com\ninvestassistant.com\ninvestbjdx.com\ninvestgohn.com\ninvestoday.net\ninvestorscn.com\ninveststkitts.org\ninvocean.com\ninvoee.com\ninvzible.com\ninwaishe.com\ninwatch.cc\ninwuoo.com\ninxedu.com\ninxni.com\ninxunoffice.com\ninyota.com\ninzone-auto.com\ninzotek.com\nioa365.com\nioage.com\nioasaas.com\niocdn.cc\niocrest.com\nioe-times.com\niofange.com\nioffershow.com\nioffice100.com\niofomo.com\nioigamer.net\nioikypzw.com\nioiosafe.com\nioiox.com\nioiox.net\nioioz.com\niok.la\niol8.com\nioms.cc\nionchi.com\nioncol.com\nioneball.com\nionewu.com\niongentherapeutics.com\niooeoo.com\niooqoo.com\nioozu.com\niop.org\niopenhec.com\niophthalmology.net\niopiopl.com\nioppo.net\nioptics.org\niorca.net\niornnl.xyz\nios114.com\nios222.com\nios98.com\niosask.com\nioser.fun\niosfengwo.com\nioshacker.net\niosi.vip\niosre.com\niosrxwy.com\nioswg.com\niosyyds.com\nioszc.com\nioszn.com\niot-cas.com\niot-dc.com\niot-tencent.com\niot.moe\niot0.net\niot1001.com\niot101.com\niot688.com\niot889.com\niotachem.com\niotbay.com\niotfair.net\niotku.com\niotmag.com\niotmore.com\niotmrvr.com\niotpai.com\niotrix.net\niotronic.tech\niotrouter.com\niots.vip\niotsafe.net\niotshifang.com\niotweixin.com\niotwrt.com\niotxing.com\niotxx.com\niotyeas.com\niotyes.com\niouluo.com\nioxqm.com\nioxray.com\nioxunyun.com\nip-cdn.com\nip-guard.net\nip-hercules.com\nip-soc.com\nip.istatmenus.app\nip.la\nip008.com\nip138.com\nip159.com\nip181.com\nip192.com\nip33.com\nip3366.net\nip518.com\nip66.com\nip66.net\nip669.com\nip77.net\nip777xxx.com\nip87.com\nip938.com\nipackbynewstep.com\nipadown.com\nipadump.com\nipadview.com\nipaiban.com\nipail.com\nipalfish.com\nipalmap.com\nipampas.com\nipanda.com\nipanda.net\nipandao.com\nipandata.com\nipangcai.com\nipanocloud.com\nipanta.com\nipaobuji.com\nipaochaxun.com\nipaomi.com\nipaotuan.com\nipapark.com\nipason.com\nipay.so\nipaylinks.com\nipbaohe.com\nipcelou.com\nipchaxun.com\nipchaxun.net\nipcmen.com\nipcodm.com\nipcorecatalog.com\nipctest.com\nipcwifi.com\nipdaili.com\nipdatacloud.com\nipddz.com\nipdfmaster.com\nipdftool.com\nipdodo.com\nipdsms.com\nipduoduo.cc\nipduoduo.com\nipdz.me\nipease.net\nipehr.com\nipeijiu.com\nipengchen.com\nipengtai.com\nipetct.com\nipexp.com\nipfeibiao.com\nipfen.com\nipfsbit.com\nipgoal.com\nipguishu.com\niphonediule.com\nipin.com\nipinba.com\nipingke.com\nipingyao.com\nipip.net\nipjingling.com\nipjisuanqi.com\nipktv.com\nipku.com\niplascloud.com\niplay11g.com\niplay365.com\niplaypy.com\niplaysoft.com\niplcn.com\niplusmed.com\niplwin999.com\nipmay.com\nipmi.cc\nipmoniqi.com\nipmost.com\nipmotionmc.com\nipmph.com\nipo.hk\nipo.la\nipo1688.com\nipo3.com\nipoceo.com\niposeidonbussiness.com\niposeidoncdn.com\niposeidongame.com\nipostalcode.com\nipple.net\nipplus360.com\nippsport.com\nippzone.com\nipqcrhf.com\nipr007.com\nipr114.net\nipr123.com\niprabc.com\niprchn.com\niprdaily.com\niprdp.net\nipresst.com\niproyal.co\niprtop.com\niprub.com\niprun.com\nips.com\nips8.com\nipsebe.com\nipshu.com\nipshudi.com\nipsmap.com\nipssh.net\niptalent.com\niptrm.com\nipts.com\niptvlm.com\niptvzj.com\nipuer.com\nipuu.net\nipv4.host\nipv4dns.com\nipv6-only.com\nipv6dns.com\nipv6radar.com\nipv6testingcenter.com\nipwuji.com\nipyy.com\niq.com\niq123.com\niq33.com\niqalliance.org\niqbuud.lol\niqbxq.com\niqcrj.com\niqdedu.com\niqdii.com\niqdnet.com\niqhmh.com\niqianggou.com\niqianjin.com\niqianyue.com\niqianzhan.com\niqiaowai.com\niqidian.com\niqihang.com\niqilu.com\niqilun.com\niqimengkj.com\niqinbao.com\niqingguo.com\niqingren.com\niqingua.com\niqingyi.com\niqinshuo.com\niqinzhou.com\niqishu.la\niqiyi.com\niqiyi.demo.uwp\niqiyiedge.com\niqiyiedge.net\niqiyih5.com\niqiyipic.com\niqmie.com\niqnew.com\niqoo.com\niqr.cc\niqtianshanmw.com\niquanba.com\niquanben.net\niquanfen.com\niquanpai.com\niquanwai.com\niquaveizeeru.com\nique.com\niquegui.com\niquhuo.com\niquickfish.com\niqujing.com\niqunix.com\niqunix.store\niqupdate.com\niqxbf.com\niqxedu.com\nirain.in\nirainone.com\niranmahanair.com\niranshao.com\niraoping.com\nirbsh.com\nirc-risk.com\nircmnr.com\nireader.com\nireader.live\nireader.mobi\nireadercity.com\nireaderm.com\nireaderm.net\nireadweek.com\nireadyit.com\nirealbest.com\nirealcare.com\nirealtech.com\nirecyclingtimes.com\niredwhale.com\nireeda-tech.com\nirelandvisacenter.com\niremaker.com\niremax.hk\niremax.net\niresarch.com\niresearchad.com\niresearchchina.com\nirest.tv\nirestapp.com\nirexy.com\niridescent.ink\nirisdt.com\nirisdt.net\nirisgw.com\nirisgw.net\nirising.me\nirlianmeng.com\nirmleader.com\nirober.com\nirobotbox.com\nirockbunny.com\niroing.com\nironfishchina.com\nirongbei.com\nironghui.com\nirootech.com\nirort.com\nirouteros.com\nirqpa.work\nirrichina.com\nirskj.com\nirsnp.com\nirtouch.com\niruanmi.com\niruanshi.com\niruidian.com\niruixing.com\nirunner.mobi\niryoucai.com\nis-programmer.com\nis36.com\nis404.com\nisa-hsse.com\nisa1751.com\nisagzfls.com\nisagzlw.com\nisagzlwis.com\nisagzlws.com\nisagzsc.com\nisagzth.com\nisahome.net\nisaieg.com\nisamanhua.com\nisameforum.org\nisapt.com\nisawhis.com\nisawhs.com\nisawuhan.com\nisay365.com\nisay365.hk\nisay365.net\nisay365.org\nisayabc.com\nisbdai.org\niscanchina.com\nisd.com\nisdox.com\nisdpp.com\niseacat.com\niseafood.shop\nisealsuite.com\nisecsp.com\niseedog.com\niseekids.com\nisellerpal.com\nisenruan.com\niseoku.com\nisf.ink\nisfashion.com\nisfdz.com\nisfirst.net\nisgo.com\nish168.com\nishaanxi.com\nishaibiao.com\nishala.com\nishang.net\nishanghome.com\nishangman.com\nishangtong.com\nishangu.com\nishanjian.com\nishansong.com\nishaohuang.com\nisharepc.com\nisheely.com\nisheji.com\nisheji5.com\nishell.cc\nishenbao.com\nishengxue.com\nishenping.com\nishenyou.com\nishijing.com\nishipoffshore.com\nishouhong.com\nishoujizhuan.com\nishouka.com\nishouping.com\nishowchina.com\nishowx.com\nishubao.org\nishugui.com\nishuirong.com\nishuiyun.com\nishumei.com\nishuocha.com\nishuqi.com\nishuqi.net\nishuquge.com\nishuquge.la\nishuquge.org\nishuw.com\nisi-gf.com\nisiabio.com\nisign.ren\nisigqno.com\nisigu.com\nisilent.me\nisilicontech.com\nisiluke.net\nisiluke.org\nisilvermaterials.com\nisimcere.com\nisinosig.com\nisixiang.com\nisixue.com\nisjike.com\niskryou.com\nisky000.com\niskyjoy.com\niskyone.com\niskysoft.com\nislandren.com\nisli.cc\nislide.cc\nisluo.com\nismartgo.com\nismarthealth.com\nismartware.com\nismdeep.com\nisme.pub\nismisv.com\nismsms.org\nismx8.com\nisnnapp.com\nisnsz.com\niso-est.com\niso-iso9000.com\niso2004.com\niso37001rz.com\niso9001rz.com\nisobar.tech\nisocgw.net\nisoftstone.com\nisogx.com\nisolves.com\nisong520.com\nisongcontrol.com\nisoqh.com\nisorange.com\nisorenzheng.org\nisosh.com\nisotoo.com\nisoucai.com\nisoudy.com\nisoyes.com\nisoying.com\nisoyu.com\nisozhijia.com\nisp.cx\nispcache.net\nispecial.xyz\nispqcloud.com\nisrcb.com\nisres.com\niss-ms.com\nisscloud.com\nissconline.com\nissedu365.com\nissjj.com\nissks.com\nist-zl.com\nistcw.com\nistoreos.com\nistpei.com\nistrongcloud.com\nistrongcloud.net\nistylepdf.com\nisuanyun.com\nisudaji.com\nisuike.com\nisummi.com\nisun.org\nisunon.com\nisunton.com\nisurecloud.net\nisuzhou.me\nisv-tech.com\nisvee.com\nisvjcloud.com\nisvjd.com\nisvup.com\niswbm.com\nisweek.com\niswifting.com\niswweb.com\nisxtv.com\nisyour.love\nit-bound.com\nit007.com\nit0772.net\nit120.cc\nit165.net\nit168.com\nit2021.com\nit2168.com\nit224.com\nit322.com\nit376.com\nit399.com\nit478.com\nit525.com\nit528.com\nit578.com\nit610.com\nit666.com\nit689.com\nit707.com\nit7t.com\nit8.com\nit8g.com\nit918.com\nit985.com\nit9g.com\nita-alliance.com\nitab.link\nitacademy.download.prss.microsoft.com\nitacademyuat.download.prss.microsoft.com\nitaconicacid.com\nitaic.org\nitailai.com\nitaiping.com\nitakeeasy.com\nitakutf.com\nitalentclc.com\nitalyvisacenterd.com\nitamt.com\nitangbole.com\nitangyuan.com\nitanlian.com\nitany.com\nitany.org\nitanzi.com\nitao.com\nitaoke.org\nitaokecms.com\nitaored.com\nitaotuo.com\nitasci.com\nitav-gz.com\nitayao.com\nitbaizhan.com\nitbegin.com\nitblw.com\nitboth.com\nitbour.com\nitboy.net\nitbug.shop\nitbulo.com\nitbulu.com\nitbuy.com\nitbyte.net\nitc.vip\nitcdlf.com\nitceo.com\nitchaguan.com\nitcm.com\nitcn.cc\nitcodemonkey.com\nitcpn.net\nitcqf.org\nitczh.com\nitdabao.com\nitdai.com\nitdayang.com\nitddo2page.com\nitdevnow.com\nitdks.com\nitdog-dns.com\nitdog.com\nitdog.plus\nitdoisp.com\nitdoor.net\nitdos.com\nitdos.net\nitdp-china.org\niteam-dress.com\niteblog.com\nitechate.com\nitedou.com\niteer.net\nitek-training.com\nitelecloud.com\nitensoft.com\niter168.com\nitest.info\nitetc.org\nitexamprep.com\niteye.com\nitfanr.cc\nitfaster.com\nitfeed.com\nitfenghui.com\nitfly.net\nitfox.net\nitfsw.com\nitfw5.com\nitgd.net\nitgeeker.net\nitgege.com\nitgemini.net\nitgochina.com\nitgoodboy.com\nitgsa.com\nithard.com\nitheat.com\nitheima.com\nitheima.net\nithenticatecn.com\nithey.com\nithlj.com\nithome.com\nithome.net\nithor.com\nithor.net\nithothub.com\nithov.com\nithuangw.com\nitiankong.com\nitiankong.net\nitianliao.com\nitiexue.net\nitigergrowth.com\nitigergrowtha.com\nitigerup.com\nitilxf.com\nitilzj.com\nitimotor.com\nitingwa.com\nitjoy.net\nitjspx.com\nitjuzi.com\nitkuku.com\nitlic.com\nitlog.vip\nitlu.org\nitlz.net\nitma.org\nitmakes.com\nitmanager.club\nitmanbu.com\nitmind.net\nitmoocs.com\nitmop.com\nitmuch.com\nitmuke.com\nitmyhome.com\nitnavs.com\nitnb.cc\nitnec.org\nitnihao.com\nitnxs.com\nitoec.org\nitoegd.com\nitogame.com\nitoka.com\nitokit.com\nitokoo.com\nitongcheng.cc\nitonghui.com\nitonglian.com\nitongzhi.com\nitopcoupon.com\nitopers.com\nitophis.com\nitopplay.com\nitopsdk.com\nitotii.com\nitouchchina.com\nitougu.com\nitoumi.com\nitoutiao.co\nitoutiaoimg.com\nitoutiaoliving.com\nitoutiaostatic.com\nitoutiaovod.com\nitower-soft.com\nitoyfx.com\nitpon.com\nitpow.com\nitptg.com\nitpub.net\nitpux.com\nitpwd.com\nitqaq.com\nitrace.cc\nitrackstar.com\nitredu.com\nitrid.com\nitrip.com\nitripsh.com\nitrolexshop.com\nitruelife.com\nitruke.com\nitrus.com\nitruscloud.com\nitrusign.com\nitry.com\nits114.com\nitsapu.com\nitsdz.com\nitshai.com\nitshubao.com\nitsiwei.com\nitsk.com\nitslaw.com\nitsmephoto.net\nitsoku.com\nitsto.com\nitsun.com\nitsvse.com\nittellyou.com\nittft.com\nittime.com\nitto100.com\nittribalwo.com\nituad.com\nituchong.com\nituite.com\nituopeng.com\niturco.com\nitutu.tv\nituu.net\nituun.com\nituut.com\nitv.video\nitvcn.com\nitvssp.com\nitwanger.com\nitwlw.com\nitwork.club\nitwsms.com\nitxe.net\nitxia.club\nitxp365.com\nitxst.com\nitxtbook.com\nitxueyuan.com\nityears.com\nityg.com\nitying.com\nityizu.com\nitylq.com\nityouknow.com\nityxb.com\nitzhai.com\nitzhengshu.com\nitzhimei.com\nitzhp.com\nitzjj.com\nitzm.com\nitzmx.com\nitzmx.net\niu18.com\niu95522.com\niuban.com\niucars.com\niucdn.com\niuctrip.com\niufida.com\niuhtg8.com\niuinns.com\niuiu.site\niujkegbpo.xyz\niujkm.com\niuktb.com\niumemo.com\niuni.com\niunv.com\niuoooo.com\niusersurvey.com\niusertracker.com\niusmob.com\niuynfg.com\niv06.com\niv2i.com\niva-schmetz.com\nivali.com\nivanli.cc\nivaoqph.com\nivban.com\nivcheng.com\nivdchina.org\nivdys.com\nivemusic.net\niventoy.com\niverycloud.com\nivfchina.net\nivfdhc.com\nivfuture.com\nivideostar.com\niviewui.com\nivinkon.com\nivipi.com\nivips.site\nivistang.com\nivixivi.com\nivknow.com\nivolces.com\nivon.work\nivqamtkr.com\nivrwan.com\nivsky.com\nivu4e.com\nivvajob.com\nivweb.io\nivwen.com\nivxiaoyuan.com\nivy-school.org\nivybaby.me\nivydad.com\nivykit.com\nivypha.com\nivypub.org\nivyschools.com\nivysci.com\nivysun.net\nivywing.me\niwala.net\niwan4399.com\niwan78.com\niwanbei.com\niwanboy.com\niwangding.com\niwangnan.com\niwanoutdoor.com\niwanshow.com\niwanws.com\niwapan.com\niwatani-gz.com\niwatch365.com\niwatertech.com\niway-tech.com\niwcoo.com\niwebad.com\niwebchoice.com\niwecan.net\niwecxafv.com\niweek.ly\niweekapi.com\niweidu.net\niweixiu120.com\niweju.com\niwellen.com\niwen1.com\niwencai.com\niwenchuan.com\niwenson.com\niwewin.net\niwgame.com\niwhalecloud.com\niwhopro.com\niwhqmk.com\niwhr.com\niwhr.org\niwiki.com\niwin10.net\niwingchina.com\niwiscloud.com\niwishwed.com\niwith-smart.com\niwithu.net\niwjw.com\niwmmob.com\niwncomm.com\niwooji.com\niwopop.com\niwordnet.com\niwordshow.com\niwosai.com\niwpai.com\niwshang.com\niwte-expo.com\niwteexpo.com\niwuchen.com\niwurexs.info\niwurexs.net\niwurexs.org\niwuyou189.com\niwwwwwi.com\niwxapi.com\niwyvi.com\niwzbz.com\niwztc.com\niwzwh.com\niwzwy.com\nix-edu.com\nixbk.fun\nixbk.net\nixbren.net\nixdc.org\nixdzs.com\nixfc.net\nixgvideo.com\nixianlai.com\nixiaochengxu.cc\nixiaoma.com\nixiatxt.com\nixiede.com\nixigua.com\nixiguavideo.com\nixilou.com\niximo.com\nixingfei.com\nixinglu.com\nixingmei.com\nixingpan.com\nixingyan.com\nixinqing.com\nixintu.com\nixinwei.com\nixinwenjie.com\nixinwu.com\nixinyou.com\nixiqi.com\nixiumei.com\nixiupet.com\nixiway.com\nixizang.com\nixmtx.com\nixmu.net\nixpsge.com\nixs.la\nixsz.com\nixuanquge.com\nixuanshu.net\nixuenong.com\nixueshu.com\nixueyi.com\nixueyi.net\nixunke.com\nixxzx.com\nixy68.com\nixywy.com\nixzgkzps.com\nixzzcgl.com\niy-cd.com\niyamusic.com\niyangxi.com\niyaou.com\niyatt.com\niyawoqu.com\niyaxi.com\niyaxin.com\niyaya.com\niyaya.info\niyb.tm\niybtv.com\niycsky.com\niydsj.com\niydu.net\niyeeda.com\niyemao.cc\niyenei.com\niyeren.com\niyiji.com\niyincaishijiao.com\niyingdi.com\niyingji.com\niyint.com\niyiou.com\niyiqi.com\niyishengyuan.com\niyitu.com\niyiyu.com\niymark.com\niyocloud.com\niyoimar.com\niyong.com\niyongpdf.com\niyooread.com\niyoou.com\niyoucai.com\niyoudui.com\niyouhun.com\niyoujia.com\niyoujiao.net\niyouke.com\niyoule.com\niyouman.com\niyouqian.com\niyouxia.com\niyouxin.com\niyouxun.com\niyruan.com\niysj.com\niytc.net\niytcdn.com\niyuan.ltd\niyuanpei.cc\niyue.pub\niyuedan.com\niyuedian.com\niyuezhang.net\niyun.com\niyunbao.com\niyunbiao.com\niyunche.com\niyunmai.com\niyunmu.com\niyunnan.travel\niyunshu.com\niyunv.com\niyunxh.com\niyunxiao.com\niyunyue.com\niyunzk.com\niyuren.com\niyuxiyang.com\niyxing.com\niyxku.com\niyyin.com\niyz168.com\nizacholsm.com\nizaodao.com\nizattime.qcomgeo2.com\nizazamall.com\nizb.pub\nizdatatech.com\nizenith.co\nizestchina.com\nizetvetv.com\nizgfu.com\nizhailong.com\nizhanchi.com\nizhangan.com\nizhangchu.com\nizhangheng.com\nizhaohe.com\nizhaoo.com\nizhaowo.com\nizhenxin.com\nizhihuicheng.net\nizhihuo.com\nizhikang.com\nizhiliao.com\nizhiqun.com\nizhishi.com\nizhixiu.com\nizhuanfa.com\nizhuce.com\nizhuose.com\nizhuyue.com\nizihun.com\niziyo.com\nizjj.com\nizmzg.com\nizobrt.com\nizpan.com\nizpec.com\nizqdn.com\nizstz.com\nizsvip.com\nizt8.com\niztigcpk.com\nizto.com\niztwp.com\niztzq.com\nizuche.com\nizuchebao.com\nizuchecdn.com\nizuciw.com\nizuichun.com\nizuiyou.com\nizumicn.com\nizywang.com\nizyz.org\nizz.cc\nj-dun.com\nj-gsexpress.com\nj-h-k.com\nj-smu.com\nj-techcnc.com\nj-test.com\nj-ui.com\nj03og.app\nj0g0.com\nj1000plan.org\nj1998.com\nj1j5q683cj.world\nj2822.com\nj2ee.cc\nj2up.com\nj3cx.com\nj43439.com\nj4lpr.com\nj5.cc\nj5k6.com\nj66.net\nj6n29.com\nj8.net\nj881p924q2.com\nj8j9.com\nj95a.com\nj99h8.com\nj9pic.com\nja-cloud.com\njaadee.com\njaadee.net\njabansk-auymon.com\njabizb.com\njabpark.com\njabrehoo.com\njacheng.com\njackeylea.com\njackon.me\njackxiang.com\njacky-blog.com\njackyang.me\njackytong.com\njackyyf.com\njackzhu.com\njacoll.com\njacxw.com\njadeclass.com\njademond.net\njadetowerccrc.com\njadewd.com\njadyf.com\njaeapp.com\njaebanke-jocelyou.com\njaebanke-nochujapazsn20.com\njaebanke-nochujapazsn5.com\njaecdn.com\njaedu.com\njaeger-hello.com\njaeosc.com\njaf-china.com\njafeney.com\njafie.org\njafron.com\njafronclub.com\njafroninternational.com\njagjj.com\njaguar-guangdong.com\njaifang.com\njaja123.com\njaka.com\njakabiotech.com\njakeai.com\njakehu.me\njalaa57.cc\njalorsoft.com\njamalube.net\njamanetwork.com\njamcz.com\njamidol.com\njamms.org\njammyfm.com\njampotgames.com\njanbao.net\njandan.com\njandan.net\njane7.com\njanezhang.com\njanezt.com\njangho.com\njangyuanzhao.com\njanpn.com\njanrain.biz\njanrainservices.com\njansonco.com\njapanhr.com\njapansoufun.com\njarczpw.com\njarencai.com\njarhu.com\njarods.org\njarvisw.com\njasangroup.com\njasbasnkilonau6.com\njasminer.com\njasolar.com\njason-z.com\njason5.xyz\njasongj.com\njasongzy.com\njasonsemicon.com\njasonwatches.com\njasonzk.com\njasperxu.com\njasuoenergy.net\njatcochina.com\njava-er.com\njava.com\njava1234.com\njava2000.net\njavabikes.com\njavaboy.org\njavacui.com\njavaer.xyz\njavaeye.com\njavamilk.org\njavanav.com\njavascriptcn.com\njavatang.com\njavawind.net\njavaxxz.com\njavazhiyin.com\njavazx.com\njavbuy.xyz\njavier.io\njawouue.com\njaxcx.com\njay.tg\njaya.cc\njayce.icu\njayfc.com\njayfu.tk\njayjw.com\njayxhj.com\njaz581.com\njazlxs.com\njazzyear.com\njb100.com\njb1000.com\njb51.com\njb51.net\njbaier023.com\njbaobao.com\njbb.one\njbbzcorp.com\njbcz.tv\njbddoors.com\njbdhome.com\njbdown.com\njbdown.net\njbedu.net\njbelf.com\njbepharm.com\njbers.com\njbiev.com\njbjc.org\njbjdgroup.com\njbjw.net\njbknx.com\njblogistics.com\njbote.com\njbpmhk.com\njbpzs.com\njbryun.com\njbs-kj.com\njbsmartcity.com\njbsx88.com\njbt.ink\njbtlj.com\njbtxy.net\njbwave.com\njbwtm.com\njbxy.com\njbyy120.com\njbzj.com\njbzpw.com\njbzwread.com\njbzyk.com\njbzyw.com\njc-ai.com\njc-dl.net\njc-hr.com\njc-pcba.com\njc-saas.com\njc0531.com\njc170.com\njc315.com\njc35.com\njc56.com\njc615cezcq.world\njc808.com\njc85.com\njc88.net\njc899.com\njca-china.org\njcancer.org\njcashore.com\njcbjbcak.com\njcbmt.com\njcbq.net\njccchina.com\njcceram.com\njccinema.com\njccjtwl.com\njccmn.com\njccpay.com\njccsoc.com\njccug.com\njcdd.com\njcebid.com\njcecom.com\njcedu.org\njcetglobal.com\njcex.com\njcf94.com\njcgcn.com\njcgcw.com\njchat.io\njchl.com\njchla.com\njchouse.org\njchunuo.com\njchxmc.com\njcjjwx.com\njckjsc.com\njcku.com\njclab.net\njclegend.com\njcloud-cache.com\njcloud-cache.net\njcloud-cdn.com\njcloud-live.com\njcloud-oss.com\njcloud.com\njcloudcache.com\njcloudcache.net\njcloudcs.com\njclouddn.com\njclouddns.com\njclouddns.net\njcloudec.com\njcloudedge.com\njcloudedge.net\njcloudgslb.com\njcloudgslb.net\njcloudimg.com\njcloudimg.net\njcloudlb.com\njcloudlb.net\njcloudlive.com\njcloudlv.com\njcloudoss.com\njcloudresolve.com\njcloudresolve.net\njcloudss.com\njcloudstatic.com\njcloudstatic.net\njcloudvideo.com\njcloudvideo.net\njcloudwaf.com\njcloudwaftest.com\njcloudwaftest.net\njclps.com\njcmeh.com\njcmob.net\njcnano.com\njcnk120.com\njcno.net\njcnqqnf.com\njcodecraeer.com\njcorv.org\njcpeixun.com\njcpesz.com\njcqzw.com\njcrb.com\njcrcw.com\njcrgyy.com\njcscp.org\njcsfs.com\njcsjt.com\njcsrsj.com\njcssolar.com\njcsy66.com\njcszhtc.com\njctmj.net\njctrans-shantou.com\njctrans.com\njcumbrella.com\njcvba.com\njcwgk.com\njcwgo.com\njcwiki.net\njcwjdg.com\njcwljt.com\njcwxiao.com\njcxzlsgs.com\njcyad.com\njcyai.com\njcyes.com\njcys120.com\njcys12366.com\njcyspt.com\njcyx2019.com\njcyxds.com\njczb.vip\njczc.vip\njczh100.com\njczhijia.com\njczhiyao.com\njcznzb.com\njd-88.com\njd-app.com\njd-bbs.com\njd-credit.com\njd-df.com\njd-ex.com\njd-ex.net\njd-fm.com\njd-hospital.com\njd-link.com\njd-sprot-eur.shop\njd-zd.com\njd.co\njd.co.th\njd.com\njd.hk\njd.id\njd.ru\njd.shop\njd100.com\njd120.com\njd360.hk\njd37.com\njd5.com\njdair.net\njdallianz.com\njdapi.com\njdb-ware.com\njdb100.com\njdbbs.com\njdbbx.com\njdbchina.com\njdbhw.com\njdbjba.com\njdbox.xyz\njdbpcb.com\njdburl.com\njdbusiness.com\njdcache.com\njdcaipu.com\njdcapital.com\njdcdn.com\njdcloud-api.com\njdcloud-api.net\njdcloud-edu.com\njdcloud-elite.com\njdcloud-elive.com\njdcloud-livebuy.com\njdcloud-mail.com\njdcloud-openapi.com\njdcloud-oss.com\njdcloud-scdn.net\njdcloud-scdn.tech\njdcloud-scdndns.com\njdcloud-yd.com\njdcloud.com\njdcloudai.solutions\njdcloudcache.com\njdcloudcache.net\njdcloudcdn.com\njdcloudcdn.net\njdcloudcs.com\njdclouddns.com\njdclouddns.net\njdcloudedge.com\njdcloudedge.net\njdcloudlb.com\njdcloudlb.net\njdcloudlive.com\njdcloudlive.net\njdcloudnaming.net\njdcloudresolve.com\njdcloudresolve.net\njdcloudshop.com\njdcloudsite.com\njdcloudstatic.com\njdcloudstatic.net\njdcloudstatus.com\njdcloudstatus.net\njdcloudvideo.com\njdcloudvideo.net\njdcloudwaf.com\njdcmmc.com\njdcmoly.com\njdcontent.com\njdcq.net\njdcsww.com\njdctky.com\njdd-global.com\njdd-hub.com\njddaojia.shop\njddapeigou.com\njdddata.com\njddglobal.com\njddj.com\njddmoto.com\njddtv.com\njddyl.com\njdedu.net\njdemall.com\njdface.com\njdfair.com\njdfcloud.com\njdfeijing.com\njdfinance.com\njdfjx.com\njdfmgt.com\njdfryl.com\njdfschool.com\njdfw1.com\njdfybjy.com\njdfzm.com\njdgogo.com\njdgslb.com\njdgslb.net\njdgzf.net\njdh.com\njdh.healthcare\njdhmediajd.com\njdhospital.com\njdhuafeng.com\njdhyplay.com\njdianfei.com\njdindustry.com\njdis.org\njdiy.club\njdjgq.com\njdjingmai.com\njdjinrong.com\njdjob88.com\njdjrdns.com\njdjt.com\njdjygold.com\njdkcb.com\njdkjxy.com\njdl.com\njdl8.com\njdlgw.com\njdlhb.com\njdlhpt.com\njdlingyu.com\njdlingyu.net\njdmwk.com\njdmy.com\njdnews.net\njdon.com\njdpay.com\njdpaydns.com\njdplay.com\njdpta.com\njdpz44.com\njdreader.net\njdrns.com\njdrpr.com\njdrq.net\njds-china.com\njdsafe.com\njdsha.com\njdsjy.com\njdsmartkf.com\njdsry.com\njdss.cc\njdsyjc.com\njdt-precision.com\njdtiot.com\njdtjy.com\njdtxgc.com\njdunion.com\njduoduo.com\njdvisa.com\njdw001.com\njdw2.com\njdwdc.com\njdweixiao.com\njdwgame.com\njdwl.com\njdwmfj.com\njdworldwide.com\njdwxwz.com\njdwxzp.com\njdx.com\njdxc.net\njdxfw.com\njdxlt.com\njdxs.com\njdxsr.com\njdxyydf.com\njdxzz.com\njdy.com\njdycdn.com\njdydevelop.com\njdyfy.com\njdylb.com\njdyou.com\njdypf.com\njdyyeb.com\njdzdeyy.com\njdzeduyun.com\njdzj.com\njdzjw.com\njdzkw.com\njdzmc.com\njdzol.com\njdzol.net\njdzrcw.com\njdzs.com\njdzwang.com\njeacar.com\njean.cd\njeanphy.online\njeansc.com\njeanssalon.com\njeanswest.com\njeawin.com\njeawincdn.com\njechobio.com\njectronic.com\njedi-games.com\njedoo.com\njee-cn.com\njeeanlean.com\njeecg.com\njeecg.org\njeecms.com\njeee.ltd\njeejen.com\njeepay.com\njeepay.vip\njeeplus.org\njeequan.com\njeerun.com\njeesci.com\njeeseen.com\njeesite.com\njeewong.com\njeeyaa.com\njeeyee.com\njeeyor.com\njefen.com\njeffdingzone.com\njeffjade.com\njeffreyitstudio.com\njeflon.com\njegotrip.com\njehudf.com\njekeen.com\njelleybrown.com\njellow.club\njellow.site\njellymoo.com\njellythink.com\njemincare.com\njemoic.com\njengcloud.com\njenno-cn.com\njenomc.com\njeom.org\njeongen.com\njeoshi.com\njepekale.com\njereh-gas.com\njereh-network.com\njereh.com\njerei.com\njeremycn.com\njerpx.com\njerryzou.com\njersey01.com\njescard.com\njesdatools.com\njesie.org\njesiro.com\njesoncom.com\njesselauristonlivermore.com\njesselivermore.com\njestq.com\njet-ego.com\njet-logistics.com\njet-ok.com\njetechtool.com\njetgroup-cn.com\njetgroup-nb.com\njethoo.com\njethro.fun\njetionservice.com\njetlogistic.com\njetmobo.com\njetneed.com\njetsum.com\njetsum.net\njeulover.com\njeuronghotels.com\njevolpu.com\njewellery.gold\njewellworld.com\njewelryseeds.com\njewelryshanghai.com\njexus.org\njeyi.com\njeywatch.com\njf-biaotw.com\njf-motor.com\njf-r.com\njf1898.com\njf1969.com\njf258.com\njf900.com\njf9p.com\njfagroup.com\njfbcb.com\njfbuilding.com\njfchinese.com\njfcjt.com\njfcoo.com\njfdaily.com\njfedu.net\njfgjwl.com\njfgou.com\njfh.com\njfhzfsn.com\njfinal.com\njfinfo.com\njfj3419.com\njfjt.cc\njflparking.com\njflswl.com\njfpal.com\njfq.com\njfrogchina.com\njfrschool.com\njfsc.com\njfshare.com\njfstatic.com\njftech.com\njftianshancn.com\njfwb.com\njfwypay.com\njfxiaopaoqi.com\njfydgame.com\njfyf.cc\njfyiyao.com\njfyskw.com\njfz.com\njfzhcx.com\njfzhiyao.com\njg058.com\njg1060.com\njg1994.com\njg91.com\njgcarbide.com\njgchat.net\njgcjjt.com\njgdq.org\njgdun.com\njgdx.com\njgew3d.com\njgfarm.com\njgg.hk\njgg09.com\njggame.net\njghstar.com\njgjapp.com\njglh.com\njglm.cc\njgs-ds.com\njgscct.com\njgsdaily.com\njgsemicon.com\njgstour.com\njgsxfw.com\njgtc315.com\njguanjia.com\njgums.com\njguo.com\njgxb120.com\njgxzy.com\njgy.com\njgyljt.com\njgyun.net\njgzx.org\njgzyw.com\njh-dzcl.com\njh-sh.com\njh-trace.com\njh-uav.com\njh0516.com\njh3737.com\njh3j.com\njh597.com\njh5l.com\njh8k.com\njh96095.com\njhak.com\njhaoyou.com\njhcb.net\njhcfz.com\njhcheku.com\njhcms.com\njhconba.com\njhctbank.com\njhddsz.com\njhdmro.com\njhdpower.com\njhdxjk.com\njhenten.com\njhfl.com\njhforever.com\njhfsata.com\njhgolfcarts.com\njhgroup525.com\njhgtgb.com\njhgykt.com\njhhospital.com\njhhygl.com\njhi.cc\njhjt.xyz\njhjunda.com\njhjy.net\njhkao.com\njhkuajing.com\njhltsl.com\njhm2012.com\njhmnew.com\njhmwo.com\njhnsh.com\njhnsyh.com\njhonge.net\njhonse.com\njhotel-shanghai.com\njhpm.cc\njhqrmyy.com\njhqshfly.com\njhrcbank.com\njhrcsc.com\njhrcw.com\njhsairport.com\njhsc201ddd211svds.com\njhscl.net\njhscm.com\njhscrm.com\njhsddjd.com\njhsjttz.com\njhspa6.com\njhszyy.com\njhtmsf.com\njhu.edu\njhuishou.com\njhvsr.com\njhwaimai.com\njhwdp.com\njhwvjjw.com\njhxcms.com\njhxjd.com\njhxl.org\njhxms.com\njhxrmyy.com\njhxzlsgs.com\njhydns01.com\njhydns05.com\njhygame.com\njhyongyou.com\njhypcy.com\njhytech.com\njhyusqo.com\njhyz.net\njhzdhjt.com\njhzhizao.com\njhzhkj.com\njhzhuji.com\njhzoo.com\nji-pai.com\nji-zhun.com\nji.ci\nji7.com\njia.com\njia12.com\njia300.com\njia360.com\njia400.com\njia86.cc\njiaads.com\njiaaohuanbao.com\njiaapps.com\njiabaiwang.net\njiabangcnc.com\njiabaoyuanlin.com\njiabasha.com\njiaben.com\njiaboojc.com\njiacai001.com\njiacaitc.com\njiachangshichutieqi.com\njiacheng88.com\njiachong.com\njiadafoods.com\njiadapaper.com\njiadeqy.com\njiadingjiaxiao.com\njiadingqiang.com\njiadounet.com\njiadule.com\njiaduobao.ru\njiae.com\njiaenderen.com\njiaenhospital.com\njiafang168.com\njiafenqi.com\njiafu68.com\njiafuda.com\njiagedan.com\njiagela.com\njiagle.com\njiagoo.com\njiagoo.net\njiagouyun.com\njiaguanlaw.com\njiaguboshi.com\njiaguhome.com\njiagulun.com\njiagumen.com\njiagumima.com\njiaguowenhua.com\njiaguwenxf.com\njiahecare.com\njiaheu.com\njiahewushe.com\njiahua-sz.com\njiahuacinema.com\njiahuaming.com\njiahui.com\njiahuism.com\njiain.net\njiaji.com\njiaji28.net\njiajia-china.com\njiajia.tv\njiajiagroup.com\njiajiakt.com\njiajiangcake.com\njiajiao114.com\njiajiao400.com\njiajiaoban.com\njiajimao.com\njiajingink.com\njiajiyp.com\njiaju.cc\njiaju.com\njiajuimg.com\njiajuketang.com\njiajumi.com\njiajurenwu.com\njiajuservice.com\njiajuwo.com\njiajuxialiang.org\njiajuzhuliu.com\njiakao.com\njiakaobaodian.com\njiakaodashi.com\njiakaokemuyi.com\njiakelai.com\njiakexs.com\njialanling.com\njialaxin.cc\njialebao.cc\njialecc.com\njialei168.com\njialez.com\njialiangad.com\njialianzg.com\njialinep.com\njialiwood.com\njialiyoukuang8.com\njialongsports.com\njialvzc.com\njiamei123.com\njiameidental.com\njiameigj.com\njiameng.com\njiamengbang.net\njiamengfei.com\njiamens.com\njiami110.com\njiamiantech.com\njiaminghi.com\njiamingwenhua.com\njiamisoft.com\njian-jie.com\njian.net\njian27.com\njianada-qianzheng.com\njianae.com\njianai.love\njianai360.com\njianavi.com\njianayangzhiguo01.com\njianbaizhan.com\njianbangchem.com\njianbaolife.com\njianbihua.com\njianbihua.org\njianbihua360.com\njianbing.com\njiancai.com\njiancaijia.com\njiancaik.com\njiancenj.com\njiancent.com\njiancepai.com\njiancepaper.com\njianchacha.com\njianchiapp.com\njianchihu.net\njiandaima.com\njiandan.net\njiandantianqi.com\njiandanxinli.com\njiandaopay.com\njiandaoyun.com\njiandati.com\njiandiao.com\njianeryi.com\njianfc.com\njianfei.com\njianfei.net\njianfeiba.com\njianfeibaike.com\njianfeidaren.com\njianfengstudio.com\njiang11.com\njiang7.com\njiangbeijituan.com\njiangbeimach.com\njiangbeishuicheng.com\njiangbeiyiyuan.com\njiangbeiyiyuan.net\njiangchaochina.com\njiangcp.com\njiangduoduo.com\njiangguimei.asia\njiangguo.net\njianghaiqu.net\njianghaosm.com\njianghehuagong.com\njianghuamem.com\njianghui.xyz\njiangidea.com\njiangjiuren.com\njiangjizhong.com\njiangkk.com\njianglinminingindustry.com\njiangmama.net\njiangmike.com\njiangmin.com\njiangnan-group.com\njiangnanmarket.org\njiangningwater.com\njiangongdata.com\njiangongw.com\njiangpaipinpai.com\njiangpinjiangxin.com\njiangqiaomuye.com\njiangque.com\njiangruyi.com\njiangshankeji.com\njiangshanlihong.com\njiangshi.org\njiangshi99.com\njiangsudanzhao.com\njiangsuedu.net\njiangsufilm.com\njiangsufootball.org\njiangsugqt.org\njiangsugwy.org\njiangsukj.com\njiangsulvhe.com\njiangsumobile.com\njiangsurc.com\njiangsurhi.com\njiangsusx.com\njiangsuzhongpin.com\njiangtai.com\njiangtuoedu.com\njianguo.tv\njianguopuzi.com\njianguoyun.com\njiangweishan.com\njiangxiatech.com\njiangxinkeji.club\njiangxiol.com\njiangxirc.com\njiangxiwater.com\njiangxiwuliu.com\njiangxueqiao.com\njiangyan.tv\njiangyoushang.com\njiangyu.org\njiangzheba.com\njiangzidushu.com\njiangzikanshu.com\njiangziyuedu.com\njiangzuoku.net\njianhangcaifu.com\njianhaobao.com\njianhuagroup.com\njianhuasheng.com\njianhuavalve.com\njianhucheng.com\njianhui.org\njianhuw.com\njianianle.com\njianidc.com\njianjian.tv\njianjiaobuluo.com\njianjutec.com\njiankang123.net\njiankang13.com\njiankanghebei.com\njiankangsn.com\njiankangyouyi.com\njianke-fangzhou.com\njianke.cc\njianke.com\njianke.net\njiankong.com\njiankunchina.com\njianlc.com\njianlc.net\njianli-sky.com\njianli.com\njianli88.com\njianliao.com\njianliben.com\njianliduo.com\njianlimoban-ziyuan.com\njianlisheji.com\njianliw.com\njianlixiu.com\njianliyuan.com\njianloubao.com\njianlow.com\njianlu365.com\njianmaidi.com\njianmao.net\njianmeicao.com\njianmeng.net\njianmite.com\njianmuhub.com\njianniang.com\njianpaimeiye.com\njianpeicn.com\njianpian.info\njianpu.net\njianpu6.com\njianpu8.com\njianpu99.net\njianq.com\njianqiaochina.com\njianqimao.com\njianqiyl.com\njianran360.com\njianshe99.com\njiansheku.com\njianshen8.com\njianshenmi.com\njianshiduo.com\njianshihui.net\njianshionline.com\njianshu.com\njianshu.io\njianshu.tech\njianshuapi.com\njianshukeji.com\njiansuji001.com\njiansujihm.com\njiantaokj.com\njiantuku.com\njianwang360.com\njianweidata.com\njianweitv.com\njianwenapp.com\njianwulian.com\njianxi-materials.com\njianxinchemical.com\njianxinyun.com\njianxiyasi.com\njianyanjia.com\njianyechina.com\njianyefans.com\njianyewx.com\njianying.com\njianyixinli.com\njianyu360.com\njianyujiasu.com\njianyuweb.com\njianyv.com\njianzeppt.com\njianzhan110.com\njianzhan580.com\njianzhanbao.net\njianzhangongsi.com\njianzhe.com\njianzhi8.com\njianzhian.com\njianzhiba.net\njianzhibao.com\njianzhidaxue.com\njianzhidou.com\njianzhikeji.com\njianzhikeji.net\njianzhimao.com\njianzhiwangzhan.com\njianzhiweike.net\njianzhiyixin.com\njianzhong-edu.com\njianzhusheying.com\njiao15.com\njiaoben.net\njiaobu365.com\njiaobuser.com\njiaochengzhijia.com\njiaoda306.com\njiaodian.pub\njiaodj.com\njiaodong.net\njiaodonghr.com\njiaofei123.com\njiaohuilian.com\njiaohuiyun.com\njiaohusheji.net\njiaojiang.com\njiaokaitech.com\njiaoko.com\njiaoliuqu.com\njiaomai.com\njiaonan.net\njiaonan.tv\njiaonizuocai.com\njiaoping.com\njiaoshirencai.com\njiaoshizhaopin.net\njiaoshizhuye.com\njiaoshoubang.com\njiaoshouhuayuan.com\njiaotu.men\njiaoya.com\njiaoyanyun.com\njiaoyf.com\njiaoyibao.com\njiaoyimao.com\njiaoyin.com\njiaoyixia.com\njiaoyizhu.com\njiaoyu361.com\njiaoyu400.com\njiaoyuangroup.com\njiaoyudao.com\njiaoyumao.com\njiaoyundiandongmen.com\njiaoyunw.com\njiaoyuwo.com\njiaoyuzhan.net\njiaozhou.net\njiapin.com\njiapu.tv\njiapuvip.com\njiaqiangban.com\njiaqianglian.com\njiaqing900.com\njiaren.org\njiarenrecycle.com\njiarenvip.com\njiarenzs.com\njiaruitec.com\njiasale.com\njiashejianyan.com\njiashengguangdian.com\njiashida5618.com\njiashiguoji168.com\njiashuangkuaizi.com\njiashuba.com\njiashule.com\njiasou.cc\njiass.cc\njiasu.work\njiasubook.com\njiasucai.com\njiasuhui.com\njiasule.com\njiasule.net\njiasule.org\njiasulian.com\njiataizic.cc\njiataizir.cc\njiatejijin.com\njiatengflycdn.com\njiatongyitu.com\njiatop.com\njiatuhui.com\njiatui.com\njiatushuke.com\njiatx.com\njiawei.com\njiawei.xin\njiawentrans.com\njiawin.com\njiawonongye.com\njiawutech.com\njiawuzhanzheng.org\njiawuzi.com\njiaxianggame.com\njiaxianghudong.com\njiaxiangxm.com\njiaxiao.pub\njiaxiao100.com\njiaxiaozhijia.com\njiaxiaozhilian.com\njiaxichina.net\njiaxincloud.com\njiaxingren.com\njiaxinkg.com\njiaxinxuetang.com\njiaxiweb.com\njiaxuanwl.com\njiaxuejiyin.com\njiaxun.com\njiay.press\njiayans.net\njiayaw.com\njiayi56.com\njiayin618.com\njiayougo.com\njiayoujsq.com\njiayouxueba.com\njiayu.net\njiayu.yoga\njiayuan-ev.com\njiayuan-law.com\njiayuan.com\njiayuanzhang.com\njiayudata.com\njiayue.tech\njiayuehua.com\njiayuhongwedding.com\njiayusx.com\njiazaishanghai.com\njiazhao.com\njiazhao7.com\njiazhaoba.com\njiazhi.online\njiazhichem.com\njiazhoulvke.com\njiazhuang.com\njiazhuang6.com\njiazile.com\njiazuo.cc\njibai.com\njibao.online\njibencaozuo.com\njibi.net\njibing57.com\njibite.fun\njicaibao.com\njicaifund.com\njicaixinke.com\njice.io\njichangbus.com\njichangdaba.com\njiche.com\njicheng.net\njichengzao.net\njichuangke.com\njiclip.com\njicnj.com\njicon.net\njicyun.com\njidacheng.com\njidanpu.com\njidantuoshebei.com\njide.com\njidekan.com\njideos.com\njidi.com\njidian.im\njidiancdn.com\njidianwang.com\njidivr.com\njidiw.com\njidouauto.com\njidubook.com\njidujiao.com\njidujiasu.com\njieanjiaotong.com\njiebai.com\njiebanchuyou.com\njiebaodz.com\njiebaogroup.com\njiebide.xin\njiecang.com\njiecangtubemotors.com\njiechengcehui.com\njiechengcloud.com\njiechikeji.com\njiechuang.com\njiedaibao.gs\njiediankeji.com\njiefadg.com\njiefanglinli.net\njiefu.com\njiefu.net\njiefuku.com\njiegames.com\njiege.pro\njiegeng.com\njiegon.com\njiehua-chem.com\njiehua.com\njiehualv.com\njiehuapharma.com\njiehuigroup.com\njiehun021.com\njiehun027.com\njiejichengshi.com\njiejing.fun\njiekenmould.com\njiekon.com\njiekou.ltd\njielaigroup.com\njieliapp.com\njielibj.com\njieligo.net\njielijs.com\njieling.net\njielong-printing.com\njielong.co\njielong.com\njielongcorp.com\njielongdaquan.com\njielongguanjia.com\njiemaiyang.com\njiemeng.cc\njiemeng.tw\njiemeng8.com\njiement.com\njiemian.com\njiemin.com\njiemo.net\njiemodui.com\njiemoselect.com\njienyl.com\njiepai.net\njiepaids.com\njiepei.com\njieqi.com\njieqian.co\njieqibg.com\njieqinwang.com\njierengz.com\njieri2.com\njierili.com\njieruchaosheng.com\njiese.org\njiesen365.com\njieshangwei.com\njieshengit.com\njieshimt8.com\njieshitong.com\njieshu.me\njieshui8.com\njieshuitech.com\njieshuwang.com\njietu365.com\njietuhb.com\njietuosh.com\njietusoft.com\njieweijt.com\njiewen.run\njiexi.net\njiexitz.com\njiexiuyiyuan.com\njiexunyun.net\njieyang.la\njieyanri.com\njieyigroup.net\njieyitong.net\njieyou.com\njieyou.pro\njieyougame.com\njieyoulai888.com\njieyoutsg.com\njieyue.net\njieyuechina.com\njieyuechina.net\njifang360.com\njifang365.com\njifang369.com\njifenapp.com\njifencity.com\njifenfu.net\njifengkj.com\njifengyun.com\njifenh.com\njifenyi.com\njifenyouhuidui.com\njifenzhi.com\njifugk.com\njifulei.com\njigao616.com\njigaojituan.com\njigecili.com\njiguangdaili.com\njiguangdanci.com\njiguanglan.com\njiguo.com\njiguzuo.com\njihai8.com\njihaoba.com\njihegui.com\njihex.com\njihexian.com\njiheyun.com\njihot.com\njihuachina.com\njihuadyes.com\njihuanshe.com\njihubear.com\njihui88.com\njihujiasuqi.com\njihulab.com\njihuoma.com\njihuoniao.com\njihuoyx.com\njiiaa.com\njiimore.com\njijia.com\njijiaerp.com\njijiagames.com\njijiang5.com\njijiangep.com\njijianzhineng.com\njijiaoyu.com\njijidi.com\njijie168.com\njijigugu.club\njijijijin.com\njijing.site\njijinhao.com\njijitec.com\njijiyouxuan.com\njijuduo.com\njikabao.com\njikaicai.com\njike.city\njike.com\njike.info\njike800.com\njikecdn.com\njikedata.com\njikedingyue.com\njikedog.com\njikefan.com\njikegou.net\njikeiot.cloud\njikejiang.com\njikejiazhuang.com\njikejishu.com\njikeq.com\njiketuchuang.com\njikewan.com\njikexiaojiang.com\njikexiu.com\njikexueyuan.com\njikipedia.com\njikstatic.com\njikuai.work\njilailawyer.com\njilaoshi.com\njiletaotao.com\njili20.com\njiliguala.com\njilingames.com\njilingwy.org\njilinmarathon.com\njilinshuiwu.com\njilinxiangyun.com\njiliuwang.net\njiliyun.com\njilongsw.com\njilu.info\njiluchengshi.com\njiluer.com\njilulijob.com\njiluyu.org\njilvfaka.com\njimagroup.com\njimakj.com\njimay.com\njimei-cn.com\njimeisilk.com\njimeng.com\njimeng.mobi\njimetec.com\njimi168.com\njimicn.com\njimifashion.com\njimihu.com\njimilier.com\njimingbao.com\njimistore.com\njimmoo.com\njimoedu.net\njimu.com\njimubox.com\njimuc.com\njimucake.com\njimujiazx.com\njimuyk.com\njin-huang.net\njin-wang.net\njin-xiang.com\njin-xin.com\njin10.com\njin10x.com\njinan-marathon.com\njinan7.com\njinanfu.net\njinanguanggao.com\njinanhaofang.com\njinanhualian.com\njinankingyue.com\njinanxww.com\njinbangedu.com\njinbaobeiqiming.com\njinbaoidc.com\njinbaonet.com\njinbi-an.com\njinbiaochi.com\njinbiaohui.com\njinbiaojv.com\njinbifun.com\njinbilianmeng.com\njinbitou.net\njinbondt.com\njincaicaiwu.com\njincao.com\njincaocw.com\njincdn.com\njincece.com\njinchanggps.com\njinchanqunale.com\njincheng56dl.com\njinchengdingjs.com\njinchengmf.com\njinchengpharm.com\njinchuang.org\njinchuanrmt.com\njinchutou.com\njincin.com\njindaixx.com\njindaoshangwu.com\njindati.com\njinde-logistics.com\njindianweb.com\njindianyishi.com\njindidata.com\njindidq.com\njinding.cc\njindingfm.com\njindongsoft.com\njindoushiqi.com\njinducw.com\njindun007.net\njindun9.com\njindunfan.com\njindunkeji.com\njinduoduo.net\njinengtisheng.com\njinenrunze.com\njinergy.com\njinerkang.com\njinfan-keji.com\njinfanda.com\njinfangka.com\njinfengcx.com\njinfengpaint.com\njinfengwine.com\njinfh.net\njinfuzi.com\njing-tong.com\njing-xian.com\njingangfuhui.com\njingangjing.com\njingangjing.net\njingankerrycentre.com\njingansicbd.com\njingbantong.com\njingbo.net\njingbotech.com\njingc.com\njingcai360.net\njingcaipaint.com\njingcaituijian.com\njingch.net\njingchang.tv\njingchengban.com\njingchengwl.com\njingchi.net\njingchuhao.com\njingchurc.com\njingdajiance.com\njingdaka.com\njingdapcb.com\njingdata.com\njingdeyx.com\njingdianju.com\njingdianlaoge.com\njingdianxitong.com\njingdiao.com\njingdigital.com\njingdong.com\njingdongdaili.com\njingdongjinrong.com\njingdongyouxuan.com\njingdudai.com\njingdukaoyan.com\njingdw.com\njingge.com\njinggeng.net\njinggon.com\njinggong-auto.com\njinggongvalve.com\njingguan.ai\njinggui.com\njinghaishop.com\njinghandianzi.com\njinghangapps.com\njingheiot.com\njinghesh.net\njinghonggroup.com\njinghongmedical.com\njinghongsh.com\njinghua.com\njinghuans.com\njinghuaqimo.com\njinghudianqi.com\njinghuitang.com\njingjia.net\njingjia.org\njingjia6.com\njingjiamicro.com\njingjiang.com\njingjiasc.com\njingjiawang.com\njingjiayl.com\njingjidaokan.com\njingjie360.com\njingjiezhileng.com\njingjitech.com\njingjiu.com\njingju.com\njingjuok.com\njingjusc.com\njingkaiyuan.com\njingkan.net\njingkaowang.com\njingkebio.com\njingkeleici.com\njingkeyiqi.com\njingkids.com\njingkunagro.com\njinglawyer.com\njinglian88.com\njingliangad.com\njingling.group\njinglingbaoai.com\njinglingbiaozhu.com\njinglingshuju.com\njinglou8.com\njingluemall.com\njingluole.com\njingme.net\njingmedicine.com\njingmeiti.com\njingmen.com\njingmiguangliangg.com\njingmiliangju.com\njingnei.net\njingnengpower.com\njingoal.com\njingos.com\njingpai.com\njingpaidang.com\njingpaihao.com\njingpainet.com\njingpinhui.com\njingpinke.com\njingpt.com\njingqizhitongche.com\njingqueyun.com\njingrongshuan.com\njingruigroup.com\njingsailian.com\njingsh.com\njingshanbus.com\njingshibang.com\njingshibianhuren.com\njingshicd.com\njingshifang.net\njingshistudy.com\njingshizyy.com\njingshun-wl.com\njingshzh.com\njingsocial.com\njingtai-group.com\njingtang.xyz\njingtanggame.com\njingtao58.com\njingtuitui.com\njingtum.com\njingua168.com\njinguanauto.com\njingugroup.net\njinguilvyou.com\njingutrust.com\njingvo.com\njingwacenter.com\njingwah.com\njingwei.link\njingweizhichuang.com\njingwuhui.com\njingwxcx.com\njingxi.com\njingxi.net\njingxiang.work\njingxianglawfirm.com\njingxinad.com\njingxinclass.com\njingyakt.com\njingyanben.com\njingyanbus.com\njingyangzhijia.com\njingyanlib.com\njingyanshu.com\njingyeco.com\njingyeqian.com\njingyi186.com\njingyimetal.com\njingyinb.com\njingyingshenghua.com\njingyingyicheng.com\njingyitech.com\njingyiyiyao.com\njingyougz.com\njingytech.com\njingyuan.com\njingyuelaw.com\njingyuetang.com\njingyunos.com\njingyunyilian.com\njingyuweike.com\njingyuxiaoban.com\njingyuyun.com\njingzhengu.com\njingzhi5.com\njingzhouxw.com\njingzhu-bio.com\njingzhusz.com\njingzong.org\njinhaigroup.com\njinhaihujingqu.com\njinhaisujiao.com\njinhe-energy.com\njinheamc.com\njinher.com\njinheshiye.com\njinhevip.com\njinhongchina.com\njinhonggroup.com\njinhongnl.com\njinhu.me\njinhuapp.com\njinhuatv.com\njinhuawatch.com\njinhuazhe.com\njinhuo.net\njinhusns.com\njinhutour.com\njinianbi.com\njiniance8.com\njinianri.com\njining.com\njiningcoal.com\njiningjj.com\njiniu.work\njiniutech.com\njinjia.com\njinjiang-group.com\njinjiang.com\njinjiang.tv\njinjianghotels.com\njinjianginns.com\njinjiangwater.com\njinjiaomh.com\njinjie.tech\njinjiedu.com\njinjieshengwu.com\njinkaijia.com\njinkan.org\njinkanghospital.com\njinkaoedu.com\njinke.com\njinkedatex.com\njinkeholdings.com\njinkejoy.com\njinkex.com\njinkezhexin.com\njinkongauto.com\njinkopower.com\njinkosolar.com\njinkoubaodian.com\njinkoucaigou.com\njinku.com\njinkunlaw.com\njinlaiba.com\njinlaijinwang.com\njinlangbo.com\njinlanqihua.com\njinlanzuan.com\njinletx.com\njinlianchu.com\njinling.com\njinlingholdings.com\njinlinghotel.com\njinlinghotels.com\njinlingjiajiao.com\njinlishenghuo.com\njinliufu.net\njinliyang.net\njinliyu.cc\njinlonggeishui.com\njinluowater.net\njinluzl.com\njinlvkeji.com\njinlyb.com\njinma-int.com\njinmabrand.com\njinmajia.com\njinmalvyou.com\njinmao-ti.com\njinmao88.com\njinmaodigital.com\njinmaofoundry.com\njinmaopartners.com\njinmaowy.com\njinmaozs.com\njinmeiji.com\njinmenrc.com\njinmi.com\njinming.net\njinmixuetang.com\njinmogame.com\njinmuinfo.com\njinnong.cc\njinpacs.com\njinpai365.com\njinpanlab.com\njinpengecologyhotel.com\njinpin.xyz\njinpu.com\njinpupvc.com\njinqi2023.com\njinqiang.online\njinqiangjc.com\njinqianguan.com\njinqianma.com\njinqiaojob.com\njinqiaopu.com\njinqiexia.com\njinqigroup.com\njinqijian.com\njinqingdz.com\njinqiunc.com\njinqiuzhu.com\njinquanpharm.com\njinqunla.com\njinr.com\njinri.red\njinridiaoyu.com\njinriguanzhu.cc\njinrilife.com\njinriningxiang.com\njinrirm.com\njinrishici.com\njinritemai-inc.com\njinritemai.com\njinritoutiao.com\njinriwushi.com\njinrixing.cc\njinrongbaguanv.com\njinrongchaoshi.com\njinrongdianli.com\njinronghu.com\njinrongren.net\njinrui-tech.com\njinruimedical.com\njinruism.com\njinrunsoft.com\njins-cn.com\njinse.com\njinsebook.com\njinsehuaqin.com\njinsenforestry.com\njinsha120.com\njinshacapital.com\njinshakemei.com\njinshanapi.com\njinshandaolu.com\njinshangdai.com\njinshangji.com\njinshanglawfirm.com\njinshangroup.net\njinshangtechnology.com\njinshanju.com\njinshanmz.com\njinshasitemuseum.com\njinshengceramics.com\njinshengtang.net\njinsheyi.com\njinshi-nj.com\njinshier66.com\njinshileasing.com\njinshisoft.com\njinshitan.com\njinshixun.com\njinshmgw.com\njinshu.org\njinshuai.com\njinshuangding.com\njinshuiyuncai.com\njinshuju.co\njinshuju.com\njinshuju.cool\njinshuju.net\njinshuju.org\njinshujuapp.com\njinshujucdn.com\njinshujufiles.com\njinshuluoshui.com\njinshun.com\njinshuschool.com\njinshutuan.com\njinsiwei.com\njintaiwh.com\njintajx.com\njintanwang.com\njintdev.com\njintelisi.com\njinti.com\njintianjihao.com\njintiankansha.me\njintone.com\njintouep.com\njintouwangdai.com\njintuituiapp88.com\njinwaimai.com\njinweitec.com\njinwucdn.com\njinxiang114.com\njinxianglian.net\njinxidao.com\njinxinqh.com\njinxiu266.com\njinxuliang.com\njinxun.cc\njinyaco.com\njinyafu.com\njinyawei.com\njinyici.com\njinyidun.com\njinyindao.com\njinying.com\njinyinghotels.com\njinyingimage.com\njinyongwang.com\njinyoukai.com\njinyuan.pro\njinyuanbiochem.com\njinyuancopper.com\njinyuangejiaju.com\njinyuanlight.com\njinyunal.com\njinyunjob.com\njinyunweb.com\njinyuzd.cc\njinzhao.me\njinzheled.com\njinzhengjt.com\njinzhidagl.com\njinzhijiance.com\njinzhongbus.com\njinzhou315.com\njinzhou360.com\njinzhougroup.com\njinzhouoffice.com\njinzhucaifu.com\njinzhuoqy.com\njinzjy.com\njinzunjy.com\njioluo.com\njiongcun.com\njiongji.com\njiongtoutiao.com\njiongyaya.com\njiont.com\njionz.com\njiou.me\njiouyun.com\njipd.com\njiping.site\njipinsoft.com\njipinwww.com\njiqid.com\njiqie.com\njiqimao.com\njiqirenku.com\njiqish.com\njiqizhixin.com\njiqrxx.com\njiqw.com\njirehhz.com\njirengu.com\njirenqi.com\njiri10.com\njiri28.com\njirong.com\njirongyunke.net\njirou.com\njisapower.com\njisec.com\njisheyun.com\njishi3.com\njishicloud.com\njishicn.com\njishigou.net\njishigu.com\njishirili.com\njishitailai.com\njishiyuboke.com\njishubai.com\njishuchi.com\njishukong.com\njishulink.com\njishuoshuo.com\njishusongshu.com\njishux.com\njishuzf.com\njisi17.com\njisikaer.com\njissbon.com\njisu-cnd.com\njisu1688.com\njisuanke.com\njisuanla.com\njisuanzt.com\njisuapi.com\njisuchou.com\njisuim.com\njisuimage.com\njisuimg.com\njisujie.com\njisukandian.com\njisunton.com\njisuoffice.com\njisupdf.com\njisupdfeditor.com\njisupdftoword.com\njisupe.com\njisuqiang.com\njisuqiang.net\njisutodo.com\njisutp.com\njisuts.com\njisutui.vip\njisuwebapp.com\njisuwz.com\njisuxia.com\njisuye.com\njisuyilaixingpiyan.com\njisuziyuanbf.com\njita.fun\njita.im\njita5.com\njitaba.net\njitabang.com\njitadaren.com\njitadog.com\njitailian.com\njitaivalve.com\njitangcn.com\njitao.tech\njitapai.com\njitapu.com\njitapuji.com\njitashe.org\njitavip.com\njitetech.com\njitgame.com\njitianhz.com\njitriroad.com\njittbang.com\njitucdn.com\njitukaisuo.com\njituofuture.com\njituotech.com\njituwang.com\njiu-b.com\njiuaidu.com\njiuaizhihe.com\njiuanchem.com\njiuanyy.com\njiub.net\njiubaju.com\njiubawan.com\njiucaicaijing.com\njiucaigongshe.com\njiucaishuo.com\njiuce.com\njiuchenglaw.com\njiuchet.shop\njiuchutong.com\njiucool.org\njiudafu.com\njiudaifu.com\njiudianjiu.com\njiudianrong.com\njiudianyongpin.com\njiuding-group.com\njiudingcapital.com\njiudinggroup.com\njiudingref.com\njiufengsuye.com\njiugang.com\njiugangbid.com\njiuguijiu000799.com\njiuhantang365.com\njiuhengmake.com\njiuhewj.com\njiuhongwang.com\njiuhua0566.com\njiuhuaiwenxue.com\njiuhuang.com\njiuhuashan.cc\njiuhuishou.com\njiuhuoba.com\njiuishizanjin.com\njiujiange.com\njiujiangjx.com\njiujipos.com\njiujiuhuyu.com\njiujiuyunhui.com\njiujiuzu.com\njiujun.net\njiujunqifu.com\njiukaicable.com\njiuku.com\njiuligroup.com\njiulku.com\njiull.com\njiulong120.com\njiulve.com\njiumaojiu.com\njiumaster.com\njiumei.com\njiumei168.com\njiumei8.com\njiumeisheng.com\njiumentongbu.com\njiunile.com\njiuniok.com\njiupaicom.com\njiupainews.com\njiupaipay.com\njiuq.com\njiuqianwan.group\njiuqianwanjituan.com\njiuqijz.com\njiuqings193004.asia\njiuqings21833.asia\njiuquan.cc\njiuqucloud.com\njiuquhe.com\njiurichem.com\njiurong.com\njiuruigroup.com\njius.net\njiusanedu.com\njiuse.cloud\njiuse2.cloud\njiuse3.cloud\njiushengas.com\njiushiadx.com\njiushigong.com\njiushixing.com\njiushui.tv\njiusi.com\njiusi.net\njiusibz.com\njiusihengyuan.com\njiusili.com\njiusitm.com\njiusko.com\njiutaigroup.com\njiutong100.com\njiutongqu.com\njiutu.net\njiutw.com\njiuwa.net\njiuwan.com\njiuwang.shop\njiuwanshan.net\njiuwei.net\njiuweick.com\njiuweige.com\njiuxian.com\njiuxianfeng.com\njiuxiaobao.vip\njiuxihuan.net\njiuxinban.com\njiuxing.com\njiuxing818.com\njiuxingtang.online\njiuxinsolar.com\njiuxu.com\njiuxusb.com\njiuyan.info\njiuyanchuanmei.com\njiuyang.com\njiuyangongshe.com\njiuyaowangluo.com\njiuyejia.com\njiuyew.com\njiuyezhinan.com\njiuyf.com\njiuyi120.com\njiuyiwenhe.com\njiuyue919.com\njiuyuehuyu.com\njiuyuu.com\njiuzg.com\njiuzhai.com\njiuzhaigou-china.com\njiuzhang.com\njiuzheng.com\njiuzhenge.com\njiuzhilan.com\njiuzhinews.com\njiuzhoupharma.com\njiuzhouzb.com\njiuzhuanzhuan.com\njiuzungame.com\njiway.net\njiweichengzhu.com\njiweixin168.com\njiwu.com\njiwucdn.com\njixiang-ht.com\njixiang-tech.com\njixiang800.com\njixiangjili.com\njixiangyou.com\njixianku.com\njixiao100.com\njixiaoedu.com\njixie100.net\njixie5.com\njixie5188.com\njixiecun.com\njixiehonghong.com\njixiejiaoyu.com\njixieshi.com\njixieshigong.com\njixiew360.com\njixiewz.com\njixinbbd.com\njixinet.com\njixixx.com\njixuanw.com\njixueedu.com\njixuninfo.com\njixunjsq.com\njixunlyq.com\njiyaogroup.com\njiyi.art\njiyi.biz\njiyi.top\njiyida-logistics.com\njiyifa.com\njiyikj.com\njiyili.net\njiyin-tech.com\njiyin2020.com\njiyixcx.com\njiyou-tech.com\njiyoujia.com\njiyouwang.com\njiyouzhan.com\njiyuantour.com\njiyue-auto.com\njiyuncn.com\njiyunhudong.com\njiyunhudong.net\njiyuntang.com\njiyusi.com\njiyx.com\njizbmedia.com\njizhan.com\njizhangla.com\njizhaotang.com\njizhazha.com\njizhiba.com\njizhida.com\njizhihd.com\njizhihezi.com\njizhimobi.com\njizhiyouke.com\njizhouyoupin.com\njizhuba.com\njizhuomi.com\njizhutaoke.com\njizustore.com\njj-1918.com\njj-inn.com\njj00.com\njj0833.com\njj20.com\njj59.com\njj831.com\njj99.icu\njjbang.com\njjbank.net\njjbbs.com\njjbctv.com\njjbdns.com\njjbearings.com\njjbhn.com\njjbisai.com\njjblogs.com\njjbnews.xyz\njjbzhx.com\njjcbw.com\njjccb.com\njjcclt.com\njjcdn.com\njjcoffetel.cc\njjcoffetels.com\njjcpe.com\njjcs66.com\njjcto.com\njjdd.com\njjdede.com\njjdqshy.com\njjecn.com\njjedu.com\njjedu.net\njjeglobal.com\njjfinder.com\njjfuzu.com\njjg630.com\njjgsxc.com\njjh11.com\njjhb.com\njjhgame.com\njjhgamedns.com\njjhh.com\njjhlkqn.com\njjhuifu.com\njjhuolang.com\njjhuoyan.com\njjhza.win\njjidc.com\njjiehao.com\njjinfo.com\njjisp.com\njjj555.com\njjjaaa.com\njjjcjt.com\njjjjjertqqo2222.com\njjjkj.com\njjjlll.org\njjkeq.com\njjkjnet.com\njjkk.org\njjkucunxie.com\njjldbk.com\njjldxz.com\njjledu.net\njjlgbj.com\njjlhbs.com\njjlvu.com\njjlysh.com\njjmatch.com\njjmfc.com\njjmh.com\njjmkids.com\njjmmw.com\njjnshop.com\njjnz.com\njjonline.org\njjqj.net\njjr.vip\njjrau1656.com\njjrc.net\njjrw.com\njjsedu.org\njjshome.com\njjsip.com\njjtang.com\njjtianshangi.com\njjtonline.com\njjtravel.com\njjttjx.com\njjwdz.com\njjwli.com\njjwsx.com\njjwxc.com\njjwxc.net\njjwxc.org\njjxxk.com\njjxyls.com\njjy118.com\njjycw.net\njjygym.com\njjypyz.com\njjys188.com\njjyz.net\njjyz360.com\njjzc168.com\njjzdm.com\njjzfgjj.com\njjzls.com\njjzyy.com\njjzyy.org\njk-bms.com\njk-px.com\njk.com\njk126.com\njk13.net\njk169.net\njk2h.com\njk33zu6.org\njk37du.com\njk3a.com\njk51.com\njk725.com\njk90.com\njkangbao.com\njkapi.com\njkb7.com\njkbexp.com\njkbl.com\njkc8.com\njkchemical.com\njkcn365.com\njkcorkpads.com\njkcsjd.com\njkd.com\njkd360.com\njkdsz.com\njkelec.com\njkh-ym.com\njkhapp.com\njkhcfz.com\njkhds872.com\njkhealth.vip\njkimg.net\njkjiekuan.com\njkjzt.com\njkkefv.com\njkl6.com\njkllbd.com\njklsjm.com\njklughj.work\njknanotech.com\njkouu.com\njkpan.cc\njkpj.com\njkqdl.com\njkqingman.com\njkrcw.net\njksdhgu.com\njkt-tencentclb.cloud\njkt-tencentclb.com\njkt-tencentclb.net\njkt-tencentclb.work\njktcom.com\njktong.com\njktower.com\njkuntp.com\njkwatch99.com\njkwshk.tv\njkx.cc\njkxds.net\njkxedu.com\njkximg.com\njkxw168.com\njkyc.com\njkydt.com\njkypeg.com\njkyule.com\njkzhilu.com\njkzl.com\njkzn365.com\njl-er.com\njl-jssk.com\njl0435.com\njl0775.com\njl1mall.com\njl465.com\njl519.com\njl54.org\njl7y.com\njladi.com\njlafw.com\njlairports.com\njlakes.org\njlandmeditech.com\njlaod.com\njlaoj.com\njlaqjdjt.com\njlbhtc.com\njlbjcs.com\njlbkjt.com\njlbry.com\njlc-3dp.com\njlc-bbs.com\njlc-cad.com\njlc-cam.com\njlc-cnc.com\njlc-code.com\njlc-dfm.com\njlc-drm.com\njlc-ecad.com\njlc-erp.com\njlc-fpc.com\njlc-gw.com\njlc-jh.com\njlc-layout.com\njlc-pcb.com\njlc-smt.com\njlc-zh.com\njlc.com\njlccad.com\njlccam.com\njlccnc.com\njlccpit.com\njlcdfm.com\njlcecad.com\njlceda.com\njlcerp.com\njlcfa.com\njlcmc.com\njlcops.com\njlcsj.com\njlcsmt.com\njldjam.com\njldpvc.com\njlfba.com\njlg66.com\njlgf.com\njlginyo.com\njlgjjt.com\njlguorui.com\njlguowen.com\njlgxmob.com\njlgyjj.com\njlhc.com\njlhdq.com\njlhnw.com\njlhs.net\njlhtcm.com\njlhxjt.com\njlhzyanxue.com\njlinh.com\njljcxy.com\njljcz.com\njljgdj.org\njljnkj.com\njljob88.com\njljzzs.com\njlkfapp.com\njlkgj.com\njlkj.cc\njlkjgroup.com\njllihua.com\njllyzxyy.com\njlmhk.com\njlmhw.com\njlmuban.com\njlnku.com\njlnls.com\njlonline.com\njlpay.com\njlq.com\njlqsugar.com\njlriza.com\njlrtvu.com\njlsdesyxx.com\njlsdwj.com\njlsdzgckcy.com\njlsebhyy.com\njlsegx.com\njlsemi.com\njlsfcyy.com\njlsgjt.com\njlsjsjlhgczxxh.com\njlsjsxxw.com\njlsports.com\njlspr.com\njlsqwyy.com\njlsrc.com\njlsrmyy.net\njlstt.com\njlsw.cc\njlswansen.com\njlsyqzyy.com\njlszlyy.com\njlt01.com\njltchina.com\njlthcc4596.vip\njltq.com\njltrq.com\njltu.net\njlty56.com\njltzgfgs.com\njlwater.com\njlwlw.com\njlxfw.com\njlxhyy.com\njlxtxny.com\njlylwater.com\njlyr2.com\njlysgjzx.com\njlystatic.com\njlytzk.com\njlzhongdong.com\njlzkb.com\njlzsoft.com\njlzyz.com\njm-gallium.com\njm-machines.com\njm-talents.com\njm1ph.com\njm2046.com\njm233333.com\njm3f.com\njm3q.com\njmads.net\njmbao.com\njmbbs.com\njmbon.com\njmbus.net\njmch12333.com\njmchn.com\njmd-china.com\njmd-leatherbag.com\njmdedu.com\njmdna.com\njmdns.com\njmed.com\njmeii.com\njmeizs.com\njmev.com\njmgle.com\njmglg.com\njmgo.com\njmgsgs.com\njmhaofa.com\njmhapp.com\njmhd8.com\njmhjh.org\njmhs.net\njmi365.com\njmj-pharma.com\njmj.cc\njmj1995.com\njmjc.tech\njmjxc.com\njmjzy.com\njmkj.com\njmkx.com\njmkxjt.com\njmlanguan.com\njmlfood.com\njmmsn.com\njmmuseum.com\njmnk300.com\njmonline.org\njmp-cn.com\njmp.gd\njmqy.com\njmqyjt.com\njmrb.com\njmrcw.com\njmsqw.com\njmstatic.com\njmstation.com\njmsxsw.com\njmt-bio.com\njmtnt.com\njmtsg.com\njmwater.com\njmxckj.com\njmxiangyi.com\njmxlmc.com\njmxw.net\njmycapacitor.com\njmycbus.com\njmyleather.com\njmyna.net\njmyqsl.com\njmzcgs.com\njmzgo.com\njmzhangfu.com\njmzns.com\njn-bank.com\njn-cits.com\njn001.com\njn1535.com\njn172.com\njn720.com\njn80.com\njnadi.net\njnairport.com\njnbaibo.com\njnbank.cc\njnbbbyy.com\njnbctv.com\njnbosai.com\njnbuscard.com\njncarw.com\njncec.com\njncfcj.com\njncfjt.com\njncgzl.com\njnchsd.com\njncjjt.com\njncjsgroup.com\njncncq.com\njncyx.com\njndfzt.com\njndssd.com\njndvisa.com\njndwyy.com\njndzx.com\njnec-tencentclb.cloud\njnec-tencentclb.com\njnec-tencentclb.net\njnec-tencentclb.work\njnesc.com\njnexpert.com\njnfx.com\njnfxny.com\njngaobo.com\njngcxy.com\njnghm.com\njngjj.net\njngl.net\njnhb.com\njnhi.com\njnhongyun9.com\njnhouse.com\njnhwjt.com\njnhxzc.com\njnhyyy.com\njnhzxx.com\njnjfwzhs.com\njnjingxin.com\njnjj.com\njnjpkj.com\njnjszl.com\njnkason.com\njnkj.org\njnky.com\njnlab.com\njnlc.com\njnlgzs.com\njnltwy.com\njnmama.com\njnmc.com\njnnc.com\njnnews.tv\njnoec.com\njnpfsoft.com\njnpjyy.com\njnqzyy.com\njnrain.com\njnreli.com\njnrmyy.com\njnruilun.com\njnryc.com\njns168.com\njnshijia.com\njnshu.com\njnsjzyxh.com\njnskqyy.com\njnslyy.com\njnsmjt.com\njnsms.com\njnstdc.com\njnszhqyy.com\njntcg.com\njntig.com\njntinchina.com\njntyhl.com\njnubio.com\njnw.cc\njnwb.net\njnwenlian.com\njnwinner.com\njnxdgs.com\njnxtzdh.com\njnxydefsxx.com\njnyczx.com\njnydgm.com\njnyng.com\njnyyjt.com\njnzcsyj.com\njnzhuoxin.com\njnzjzx.net\njnzl.com\njnzongchi.com\njnzwgzs.com\njnzx.cc\njnzycw.com\njo-loagm06.com\njob-sky.com\njob006.com\njob0575.net\njob0663.com\njob0722.com\njob0728.com\njob0768.com\njob088.com\njob0917.com\njob10000.com\njob1001.com\njob120.com\njob168.com\njob1998.com\njob225.com\njob2299.com\njob250.com\njob263.com\njob36.com\njob510.com\njob5156.com\njob5588.com\njob5678.com\njob592.com\njob788.com\njob88.com\njob910.com\njob9151.com\njob916.com\njobbaidu.com\njobbole.com\njobcdp.com\njobch263.com\njobcn.com\njobczrc.com\njobeast.com\njobef.com\njobgojob.com\njobhb.com\njobhuaibei.com\njobi5.com\njobidc.com\njobinhe.net\njobjm.com\njobjy.com\njobloser.com\njobosoft.vip\njobpin.com\njobsalon.net\njobsdigg.com\njobsitechina.com\njobsun.com\njobtiku.com\njobtong.com\njobui.com\njobuy.com\njobvvv.com\njobxinpg.com\njobyp.com\njocat.com\njocgreatwall.com\njocite.com\njoclabor.net\njocltd.com\njoctech.com\njocund-gift.com\njodoll.com\njoe92.com\njoessem.com\njohhan.com\njohnlz.com\njohnmedia.com\njohogames.com\njohouse.com\njoiest.com\njoinchitchat.com\njoindata.net\njoineonlux.com\njoinf.com\njoiningss.com\njoinkchem.com\njoinpay.com\njoinquant.com\njoinsen.com\njoinsuns.com\njoint-harvest.com\njointas.com\njointech-cn.com\njointekbusiness.com\njointforce.com\njointown.com\njoinusad.com\njoinval.com\njoinway.com\njoinwaylawfirm.com\njoinwee.com\njojo000.vip\njojoread.com\njojoreading.com\njoke66.com\njokecommunity.com\njokecommunity.net\njoker.li\njokerbai.com\njolimark.com\njollerge.com\njollylifelhq.com\njoloplay.com\njomocdn.net\njomodns.com\njomodns.net\njomoxc.com\njomoxd.com\njonesroadbeautyrebate.com\njongtay.com\njonhuu.com\njonllen.com\njonln.com\njonny.vip\njonrmal.com\njonsbo.com\njonvie.com\njooancloud.com\njoobot.com\njooioo.com\njoojcc.com\njoojtech.com\njoojzz.com\njoomla.work\njoomobx.com\njoooz.com\njoowhee.com\njoox.com\njooxemail.com\njooyacn.com\njooyoo.net\njooyuu.com\njoozone.com\njoqoo.com\njoscent-sa.com\njosen.net\njosephcz.xyz\njoshreso.com\njoshua317.com\njotop.com\njotrin.com\njouav.com\njouder.com\njoudou.com\njoulwatt.com\njournalmc.com\njournalsay.com\njourneyui.com\njourserv.com\njouypub.com\njovcloud.com\njovetech.com\njovision.com\njovisionai.com\njovmall.com\njowto.com\njoy-air.com\njoy-nb.com\njoy110.com\njoy147.com\njoy5151.com\njoya-electric.com\njoyact.com\njoyami.com\njoyanglab.com\njoyapi.com\njoyargroup.com\njoybuy.com\njoybuy.es\njoycity.mobi\njoydin.com\njoyes.com\njoyfire.net\njoyforce.com\njoygames.com\njoyglory.com\njoyglue.com\njoyhc.com\njoyi.com\njoyinchem.com\njoying.com\njoyingbox.com\njoyingtrip.com\njoyinpharma.com\njoyintour.com\njoyinvleah.com\njoyj.com\njoylawyer.com\njoymeng.com\njoyncleon.com\njoynext.com\njoyochem.com\njoyocosmetics.com\njoyoget.com\njoyoucnc.com\njoyoung.com\njoyours2019.com\njoyowo.com\njoyplus.tv\njoyshebao.com\njoyslink.com\njoyson.com\njoyssl.com\njoystay.net\njoysung.com\njoysunsh.com\njoytest.org\njoytourvip.com\njoytrav.com\njoytraveller.com\njoytunescn.com\njoytype.com\njoyu.com\njoyuai.com\njoyugas.com\njoyulf.com\njoyware.com\njoywellsemi.com\njoywii.net\njoywok.com\njoyworkshop.com\njoywplace.website\njoyy.com\njoyyan.com\njoyyang.com\njoyyinc.com\njoyyued.com\njozhaopinopin.com\njozne.com\njp-daigou.com\njp-moco.com\njp-tencentclb.cloud\njp-tencentclb.com\njp-tencentclb.net\njp-tencentclb.work\njp.com\njp.run\njp0663.com\njp95.com\njpbeta.net\njpcec.com\njpchinapress.com\njpcoalboss.com\njpddc.com\njpedo.com\njpeen.com\njperation.com\njpfmor.com\njpg.cm\njpghd.com\njpgjzzs.com\njpgreat7.com\njphot.net\njpisp.com\njpjc315.com\njpkankan.com\njpkix.com\njpmetro.com\njpmorganchina.com\njpmsg.com\njpnettech.com\njpnlink.xyz\njpopsuki.eu\njprtyun.com\njpsdk.com\njpseek.com\njpshuntong.com\njpsmile.com\njpspecsz.com\njpsto.com\njptab.com\njpthome.com\njptoe.com\njpts.sinovision.net\njpvat.com\njpwb.cc\njpwb.net\njpwind.com\njpwindow.com\njpwky.com\njpwxapp.com\njpxm.com\njpxue.com\njpxww.com\njpyoo.com\njpyssc.com\njpzx.net\njpzy01.com\njq-school.com\njq22.com\njq33.com\njqbar.com\njqcool.net\njqdzw.com\njqgc.com\njqhtml.com\njqkgjt.com\njqlv.com\njqnbp.com\njqncp.com\njqpress.com\njqr.com\njqr5.com\njqrc.net\njqrc88.com\njqrkc.com\njqs4463333a7.shop\njqs4463333a9.shop\njqsite.com\njqsmm.com\njqtxxedk.com\njquan.ink\njquee.com\njquery123.com\njqueryfuns.com\njquerywidget.com\njqwater.com\njqwwq.com\njqyljt.com\njqyou.com\njqzhuangshi.com\njqzjop.com\njqzplat.com\njqzw.com\njr-mjg.com\njr-soft.com\njr123.com\njr18.com\njr2019.com\njravity.com\njrbiopharma.com\njrbobbin.com\njrc-tech.com\njrdaimao.com\njrexam.com\njrfcg.com\njrgang.com\njrgaofu.com\njrhot.com\njrj.com\njrjiekuan.com\njrjingshan.com\njrjr.com\njrlady.com\njrlm81.com\njrlxym.com\njrmf360.com\njrmianban.com\njrnba.cc\njrntv.com\njrpengze.com\njrqiwen.com\njrqzw.net\njrs-live-football.com\njrs-live-score.com\njrs-live-z.com\njrs-watch-live.com\njrs-yc-hupu.com\njrsncn.com\njrss.com\njrszw.com\njrteck.com\njrtgroup.net\njrtx.site\njrwenku.com\njrxtp.com\njrxzj.com\njryccm.com\njryghq.com\njryssj.com\njryzt.com\njrzj.com\njrzp.com\njs-aeg.com\njs-aerfa.com\njs-cct.com\njs-cxjt.com\njs-dw.com\njs-emap.com\njs-gear.com\njs-gojo.com\njs-haiyao.com\njs-jiatai.com\njs-jinhua.com\njs-jwt.com\njs-leader.com\njs-lottery.com\njs-paper.com\njs-powerstone.com\njs-rongzheng.com\njs-seeker.com\njs-shenghang.com\njs-talents.com\njs-weilong.com\njs-xny.com\njs-ym.com\njs-zk.com\njs.design\njs04999.com\njs0573.com\njs118114.com\njs165.com\njs178.com\njs3.org\njs3n.com\njs7xc.com\njs811.com\njs9499.com\njs96008.com\njs96777.com\njsadkg.com\njsaeit.com\njsaes.com\njsafc.net\njsahj.com\njsanbo.com\njsaopa.com\njsape.com\njsarchi.com\njsartcentre.org\njsase.com\njsatcm.com\njsb-syleasing.com\njsbaidu.com\njsballs.com\njsbank.org\njsbc.com\njsbcfl.com\njsbeiyang.com\njsbestop.com\njsbexam.com\njsbfgg.com\njsbgj.com\njsblj.com\njsboxbbs.com\njsbsxh.com\njsbzwh.com\njscba.org\njsccn.com\njscdn.ink\njscdwlw.com\njsceb.com\njscelltech.com\njsceou.com\njschahua.com\njschanglong.com\njschangshou.com\njsche.net\njschunxing.com\njschy.com\njscj-elec.com\njscj.com\njsckw.org\njsclearing.com\njscmjt.com\njscnc.net\njscncg.com\njscndata.com\njscnnet.com\njsconi.com\njsconnect.com\njscrg.com\njscsbz.com\njscsdr.com\njscsfc.com\njscssimg.com\njscts.com\njscz55.com\njsd-jasper.com\njsd.cc\njsd2021.com\njsdagua.com\njsdas.com\njsdcly.com\njsddbs.com\njsddhjt.com\njsddz.net\njsdebang.com\njsdehui.com\njsdesign1.com\njsdesoft.com\njsdgb.com\njsdghfw.com\njsdhjssyjt.com\njsdjwood.com\njsdkdzw.com\njsdljn.com\njsdmirror.com\njsdonglai.com\njsdrc.com\njsdsad.com\njsduopin.net\njsdyyt.com\njsdz16.com\njsdzb.com\njsdzgc.com\njsdzlm.com\njseconomy.com\njsedu114.com\njseduinfo.com\njseea.com\njseepub.com\njsehealth.com\njsendian.com\njsenews.com\njseoptics.com\njsep.com\njsepa.com\njser.io\njsessh.com\njsexpressway.com\njsfish.net\njsfj.net\njsfls.com\njsfmly.com\njsfof.com\njsform.com\njsform3.com\njsfqhwsb.com\njsfreiburg.net\njsft.com\njsfw8.com\njsfwpt.com\njsfxw.com\njsfycdn3.com\njsfyjt.com\njsfywater.com\njsfyxh.net\njsgbds.com\njsgc.com\njsgc168.com\njsgcbank.com\njsgcjyw.com\njsgclaw.com\njsgdsb.com\njsgerrard.com\njsggwhy.com\njsgh.org\njsghfw.com\njsgho.com\njsgho.net\njsghx.com\njsgian.com\njsgjksl.com\njsgjl.net\njsgkw.org\njsgogogo.com\njsgoldenbridge.com\njsgongwei.com\njsgpa.com\njsgrb.com\njsgssb.com\njsgsyy.com\njsguohua.com\njsguolv.com\njsgwyw.org\njsgx.net\njsgxgf.com\njsgyrcb.com\njsgzgz.com\njsh.com\njshaipeng.com\njshaite.com\njshaman.com\njshanchao.com\njshaorungroup.com\njsharer.com\njshasy.com\njshazz.com\njshbank.com\njshcsoft.com\njshcxn.com\njshdata.com\njshddx.com\njshdwh.com\njshealth.com\njshemc.com\njshfgroup.com\njshgfm.com\njshggroup.com\njshgyb.com\njshhjkjt.com\njshhqc.com\njshhzssj.com\njshiway.com\njshj.org\njshkht.com\njshlfd.com\njshmrcb.com\njshnh.com\njshqjt.com\njshr.net\njshrconsult.com\njshrtfl.com\njshsoft.com\njsht88.net\njshtcm.com\njshtjt88.com\njshtocean.com\njshtsteel.com\njshuachen.com\njshuafu.com\njshuana.com\njshuanya.com\njshuaxiagroup.com\njshuaxicun.com\njshwyy.com\njshy.com\njshy1688.com\njshykg.com\njshysj.com\njshytec.com\njshywl.net\njshyzh.com\njshyzh.net\njshzfzjt.com\njshzzx.com\njsi.cc\njsifa.org\njsinnopharm.com\njsiport.com\njsirfe.com\njsjajt.com\njsjcjx.com\njsjclykz.com\njsjd.cc\njsjdgy.com\njsjdjt.com\njsjdrcb.com\njsjdzf.com\njsjeda.com\njsjffj.com\njsjfz.com\njsjgbxg.com\njsjgtz.com\njsjhtz.com\njsjiami.com\njsjianli.com\njsjianye.net\njsjinfu.com\njsjinghui.com\njsjinqi.com\njsjiuda.com\njsjj120.com\njsjjedu.com\njsjjy.com\njsjkx.com\njsjky.com\njsjkzx.com\njsjljg.com\njsjljy.com\njsjnsw.com\njsjnw.org\njsjrtzjt.com\njsjs.cc\njsjs1982.com\njsjsgroup.com\njsjskgjt.com\njsjszgz.com\njsjtxx.com\njsjunma.com\njsjwkg.com\njsjxh03.com\njsjyrcb.com\njsjyyz.com\njsjzd.com\njsk365.com\njskale.com\njskchem.com\njskh.com\njskhfm.com\njskjcms.com\njskjgc.com\njskjgroup.com\njsklcy.com\njskly.com\njskoso.com\njskpcg.org\njskuajing.com\njskunquan.com\njskwt.com\njskxjl.com\njslcjt.com\njsldweb.com\njsldxcl.com\njslegal.com\njslhgroup.com\njslhjg.com\njslida.net\njslife.net\njslijiang.com\njslink.com\njslmarathon.com\njslottery.com\njslpk.com\njslszz.com\njsltgcjt.com\njslvzhigu.com\njsly001.com\njslyjc.com\njslysp.com\njsmda.org\njsmfk.com\njsmian.com\njsminstar.com\njsmjys.com\njsmkyy.com\njsmo.xin\njsmodeling.com\njsmolfa.com\njsmrmf.com\njsmsg.com\njsmxgs.com\njsmxw.com\njsna.work\njsnaier.com\njsnewexpo.com\njsningyi.com\njsnjck.com\njsnjjg.com\njsnkmy.com\njsnol.com\njsnovel.com\njsntg.com\njsntgas.com\njsnx.net\njsnxs.com\njsnydefy.com\njsnydsfy.com\njsnzhb.com\njsocr.com\njsomick.com\njsonin.com\njsososo.com\njspaint.com\njspang.com\njspatch.com\njspcgjg.com\njspcinc.com\njspdg.com\njspeople.com\njspesz.com\njsph.net\njsphjr.com\njsphp.net\njsplayground.net\njspoh.com\njspp.com\njspwc.com\njspxcms.com\njsq886.com\njsqcyjsq.com\njsqdsx.com\njsqiuying.com\njsqlawer.com\njsqstg.com\njsqt.com\njsr.cc\njsrail.com\njsrc.com\njsrcsc.com\njsrcu.com\njsrdgg.com\njsrdsw.com\njsrea.com\njsrenshi.com\njsrgjy.net\njsrhzh.com\njsright.com\njsrongjin.com\njsrpebh.com\njsrrcb.com\njsrsks.com\njsrsrc.com\njsruifeng.net\njsruiyin.com\njsrun.net\njsrun.pro\njsrxjt.com\njss52018.com\njssaikang.com\njssalt.com\njssbaoxian.com\njssbjt.com\njssc.cc\njssczxh.com\njssdezyy.com\njssdh.com\njssem.com\njssfgl.com\njssfx.com\njssfzg.com\njssgjjt.com\njssgjs.com\njsshasczzyy.com\njsshfcw.com\njsshhzx.com\njsshichuang.com\njsshow.net\njsshrzx.com\njsshuangxin.com\njsshuntai.com\njssia.org\njssihuan.com\njssjchyxh.com\njssjiu.com\njssjrfw.com\njssjxgyw.com\njssks.com\njssling.com\njssltz.com\njssnrcb.com\njssoar.com\njssqwx.com\njsssha.com\njsssrj.com\njsssy.com\njsstgs.com\njsstt.com\njsstyt.com\njssunhui.com\njssunlord.com\njssutong.com\njssuty.com\njssuwei.com\njsswordshop.com\njssyj.com\njssytc.com\njssyyy.net\njstcm.com\njstedu.com\njstex.com\njstextile.com\njstfdz.com\njsthinktank.com\njsthjsgc.com\njsti.com\njstianniao.com\njstide.com\njstigd.com\njstjjs.com\njstlcyy.com\njstlgn.com\njstljs.com\njstor.org\njstore.site\njstoys.net\njstsks.com\njstti.com\njstucdn.com\njstv.com\njstve.org\njstxb.com\njstxdm.com\njstxrcb.net\njstxry.com\njsty.com\njstyaz.com\njstygroup.com\njstyjzsg.com\njstywl.com\njstzhospital.com\njstzjy.net\njstzloveyuebao.com\njstzrcb.com\njstzzg.net\njsuc.com\njsuedc.net\njsuhuzhi.com\njsure.com\njsurehealth.com\njsw118.com\njsw988.com\njswater.net\njswb.com\njswcc.com\njswch.net\njswebcall.com\njsweiqi.com\njsweixiu.com\njswel.com\njswenguang.com\njswenjin.com\njswfgroup.com\njswjkj.net\njswmw.com\njswonderful.com\njswrhjkj.com\njswspocapi.com\njswsxx.com\njswtc.net\njswukong.com\njswuyang.com\njswwl.com\njswx-ej.com\njswxhy.com\njswxjx.com\njswxmax.com\njswyglw.com\njswyjt.com\njswyw.com\njswzjt.com\njsxbxcl.com\njsxcra.com\njsxcx.com\njsxdf.com\njsxdyh.com\njsxfedu.com\njsxggx.com\njsxgjt.com\njsxhljt.com\njsxhrcb.com\njsxht.com\njsxhw.org\njsxhy.net\njsxiangtanzi.com\njsxiaoguo.com\njsxiaoshi.com\njsxiechang.com\njsxihu.com\njsxinfeng.com\njsxinfly.com\njsxionghuojxzz.com\njsxlhb.com\njsxmw.com\njsxpbc.com\njsxq.com\njsxtsw.com\njsxxzh.com\njsxy.biz\njsxyfy.com\njsxyjt.com\njsxzgjzx.com\njsxzkingdee.com\njsxzty.com\njsy666.xyz\njsybjt.com\njsybjz.com\njsyc-marathon.com\njsycmc.com\njsycport.com\njsycsy.com\njsyczls.com\njsyd139.com\njsydns15.com\njsyes123.com\njsyf88.com\njsyfxcl.com\njsyghw.com\njsyhkf.com\njsyhxl.com\njsyinba.com\njsyixin.com\njsyjjt.com\njsyks.com\njsyks.net\njsyksw.com\njsyljz.com\njsymjt.com\njsyongbao.com\njsypj.com\njsypyg.com\njsysafe.com\njsysedu.com\njsysxx.net\njsyt.group\njsytsw.com\njsyun.cc\njsyunhao.com\njsywjt.com\njsyxep.com\njsyxh.org\njsyxrcb.com\njsyypump.com\njsyzht.com\njsz.asia\njsz120.com\njszbtb.com\njszca.com\njszcqy.com\njszdlssws.com\njszf.org\njszfy.com\njszg.org\njszhaobiao.com\njszhiping.com\njszhjsjtgs.com\njszhongci.com\njszhongte.com\njszjcg.com\njszjgg.net\njszjgroup.com\njszjrqrd.com\njszjscl.com\njszjsx.com\njszjw.com\njszjxh.com\njszjzf.com\njszkrz.com\njszks.com\njszlgjg.com\njszlyy.com\njszmgj.com\njszmly.com\njszn.ink\njsznstny.com\njszpw.net\njszs-group.com\njszs.com\njszsgroup.cc\njszwpx.com\njszxsw.com\njszygp.com\njszygs.com\njszyjsjt.com\njszyyguoji.com\njszzks.com\njszzxjhk.com\njt-ele.com\njt-it.com\njt000.com\njt111.com\njt120.com\njt26wzz.com\njt56w.com\njt62.com\njt91.com\njta-travel.org\njtamac.com\njtamc.com\njtbole.com\njtbtech.com\njtcjd.com\njtcopper.com\njtexpress.com\njtfcg.com\njtfengtou.com\njtfulfillment.com\njtg2g.com\njtggame.com\njtgloble.com\njtgzfw.com\njtj-kr.com\njtjiaoyu.com\njtjms-ae.com\njtjms-br.com\njtjms-eg.com\njtjms-mx.com\njtjms-sa.com\njtjob.net\njtjr99.com\njtjt.info\njtjyfw.net\njtkjbike.com\njtktkj.com\njtlculture.com\njtlfans.com\njtlw.com\njtlzj.net\njtlzx.com\njtm-food.com\njtm.pub\njtmedical.com\njtn.com\njtnlk.com\njtnsh.com\njto8.com\njtpipeline.com\njtrauto.com\njtrobots.com\njtso.net\njtsp98.com\njttv.net\njttzsy.com\njtv123.com\njtwmall.com\njtxa.net\njtxmtxy.com\njtxys8.com\njtyjy.com\njtystz.com\njtyxh.com\njtzjedu.com\njtzyjt.com\nju1212.com\nju51.com\nju53.com\nju8811.com\nju8856.com\njuaiyou.com\njuanbao.com\njuangua.com\njuanyunkeji.com\njuaq.com\njubaihuijia.com\njubaiye.com\njubaozang.com\njuben108.com\njuben98.com\njuc365.com\njucaiw.com\njucanw.com\njucdn.net\njucelin.com\njucheng01.net\njuchengvi.com\njuchuangbio.com\njuchuangfushi.com\njucool.com\njucuiwangluo.com\njudajia.com\njudehahh.tech\njudns.com\njudong-1.com\njudouapp.com\njuduoping.com\njue.so\njuebankongjian.com\njuecan.com\njuedui100.com\njueduilingyu.com\njuefeng.com\njuehuo.com\njuejinchain.com\njuejinqifu.com\njuemei.com\njuemuren4449.com\njueqijy.com\njuequling.com\njuerguea.com\njuewei.com\njuexiang.com\njuexiaotime.com\njuexinw.com\njueywo.com\njufa-composite.com\njufa.vip\njufaanli.com\njufair.com\njufeng313.com\njufengcap.com\njufengcompany.com\njufenginfo.com\njufengshang.com\njufengwuxi.com\njufoinfo.com\njugezi.com\njugongdan.com\njuguang.com\njuguifu.com\njuhaihui.com\njuhangye.com\njuhaokan.org\njuhaokanya.com\njuhaom.cc\njuhaom.com\njuhe.com\njuhe5.com\njuhebang.com\njuheweb.com\njuhomai.com\njuhome.net\njuhuasuan.com\njuhui581.com\njuhuicloud.com\njuhuiwan.com\njuhuiwan.net\njui.org\njuicefs.com\njuicycouture-diaperbags.org\njuij.fun\njuiju.com\njuj66.com\njuji123.com\njujianggcz.com\njujiangkk.com\njujiangktz.com\njujiaobaby.com\njujiaonet.com\njujias.com\njujie.com\njujienet.com\njujin8.com\njujinpcb.com\njujoy.com\njujumao.com\njukan.net\njuke200.com\njukebao.com\njukejia.com\njuketai.net\njukeyouxuan.com\njukuu.com\njulaibao.com\njulang88.com\njulanggroup.com\njulanhp.com\njulanling.com\njulebu.co\njulecn.com\njulefun.com\njuli-china.com\njuliandianqi.com\njuliang8.com\njuliangcili.com\njulianghttp.com\njuliangip.com\njuliangyinqing.com\njuliangyinqing.net\njulifenti.com\njuligroup.com\njulihuang.com\njulink.net\njulisjj.com\njulive.com\njuliym.com\njuliyuemeng.com\njulong.cc\njulongchina.com\njulonggr.com\njuluape.com\njulycn.com\njulydate.com\njulyedu.com\njulysong.com\njumanhua.com\njumanlou.com\njumbo-wpc.com\njumbot.net\njumbotutor.com\njumdfd.com\njumei.com\njumeinet.com\njumengco.com\njumengren.com\njumengtbs.net\njumi-cdn.com\njumi.com\njumi18.com\njumin.cc\njuming-xz.com\njuming.com\njumingwang.com\njumo2.icu\njumold.com\njumore.com\njump-center.com\njump-game.com\njump301.com\njumpjumpcat.com\njumple.com\njumppo.com\njumpserver.org\njumpstar-tech.com\njumpvg.com\njumpw.com\njumpwgame.com\njumpwo.com\njumsz.com\njumwayholdings.com\njun-hai.com\njun.la\njun4.com\njunahotels.com\njunankeji.com\njunanres.com\njunanshengwu.com\njunao147.com\njunaotiyu.com\njunce.com\njuncyun.com\njundacheng.com\njundaobaoan.com\njundui.net\njundushan.com\njunengdingli.com\njuneyao.com\njuneyaoair.com\njuneyaoairlines.com\njunezx.com\njunfalipin.com\njungewang.com\njunhaocn.com\njunhe.com\njunhegroup.com\njunhunxiaoshuo.com\njuniontech.com\njunjing.net\njunjingsuodao.com\njunjue888.com\njunka.com\njunkai.net\njunlanhotels-hp.com\njunlebaoruye.com\njunlee.net\njunli.net\njunlian.me\njunlinsz.com\njunlongtech.com\njunmoseo.com\njunnanhao.com\njunong360.com\njunpengtouzhi.xyz\njunph.com\njunpin.com\njunpin360.com\njunpinclub.com\njunpinghui.com\njunpinhui.com\njunpinmall.com\njunpinzhi.com\njunqing360.com\njunrunrenli.com\njunsaozg.com\njunshanggame.com\njunshencm.com\njunshi.com\njunshi881.com\njunshidao.com\njunshifuxin.com\njunshijia.com\njunshijidi.com\njunshipharma.com\njunshis.com\njunshishu.com\njunshitt.com\njuntec.com\njuntu.com\njunwu262.com\njunxinmed.com\njunxunkji.com\njunyao.tech\njunyi-auto.com\njunyimeng.com\njunying.com\njunyisj.com\njunyouxuan.com\njunyudns.com\njunyuewl.com\njunyushop.com\njunzehb.com\njunzhenggroup.com\njunzhi.com\njunzhuan.com\njunziboxue.com\njunzimen.com\njunziqian.com\njunziyize.com\njuooo.com\njupiterlauncher.com\njupup.com\njuqi.com\njuqianwh.com\njuqibike.com\njuqingla.com\njuqk.net\njuquanquanapp.com\njurcc.net\njuren.com\njurenqi.com\njurongfangchan.com\njurongrencai.com\njurp.net\njusdasr.com\njuseey.com\njusen2008.com\njushe.org\njushen.co\njushequ.net\njushequan.com\njushewang.com\njushi.com\njushigj.com\njushihui.com\njushiwangedu.com\njushri.com\njushtong.com\njushuitan-inc.com\njushuitan.com\njushuitan.net\njushuo.com\njusiot.com\njusoucn.com\njussevent.com\njusssports.com\njusssportsvenue.com\njusstickets.com\njussyun.com\njust-plain.fun\njust4coding.com\njust4fun.site\njust998.com\njustalkcloud.com\njustar-cn.com\njustbbs0.com\njustbilt.com\njustbon.com\njustep.com\njustering.com\njustinbot.com\njustjavac.com\njustlove.work\njustmyblog.net\njustnowmn.com\njustpodmedia.com\njustsy.com\njusttop.com\njustwe.site\njutao.com\njutean.com\njutengjiqi.com\njutingshop.com\njutone.com\njutongbao.online\njutubao.com\njutuike.com\njutuilian.com\njuvefans.com\njuwa.net\njuwan.com\njuwang.com\njuwangmedia.com\njuwanhezi.com\njuwanshe.com\njuweixin.com\njuwuxian.com\njuxia.com\njuxian.com\njuxiang3d.com\njuxieyun.com\njuxiiangyou.com\njuxin.tv\njuxingj.com\njuxinguanjian.com\njuxinhuizhi.com\njuxuan.net\njuxuecms.com\njuxuewen.com\njuyang-chem.com\njuyanwenjuan.com\njuyebwg.com\njuyingele.com\njuyingonline.com\njuyisuliao.com\njuyoubao.com\njuyoukuaisong.net\njuyouqu.com\njuyoutang.com\njuyoutv.cc\njuyouxi.com\njuyouxuan.vip\njuyuan.com\njuyuewang.net\njuyun.tv\njuyutube.com\njuyuweb.net\njuzhen.com\njuzhen.io\njuzhentech.com\njuzhenyun.org\njuzhi720.com\njuzhiliang.com\njuzhiyuan.com\njuzhongjoy.com\njuzicon.com\njuzicy.com\njuzifenqi.com\njuzijiudian.com\njuzikong.com\njuzilicai.com\njuzimi.cc\njuzioo.com\njuziseo.com\njuziss.com\njuzistore.com\njuzisy.com\njuziwulian.com\njuzix.io\njuzizhoutou.net\njuzone.cc\njuzui.com\njuzzi-ec.com\njv07.com\njvbhotel.com\njvcxp.com\njvdebao.com\njvgnwn.sbs\njvmai.com\njvniubi.com\njvpin.vip\njvrong.com\njvshangwang.com\njvshi.net\njvtianshanuu.com\njvyou.net\njw100.net\njw1588.com\njwappgc.com\njwautoparts.com\njwbf.online\njwbl.com\njwchicago.com\njwdili.com\njwedit.net\njwetech.com\njwfun.com\njwgb.net\njwgf.com\njwick-switch.com\njwipc.com\njwkj.site\njwl100.com\njwsaas.com\njwsem.com\njwshy.com\njwsm123.com\njwtherapeutics.com\njwview.com\njwwey.com\njwygou.com\njwyun.net\njwzhn.com\njwzykg.com\njx-189.com\njx-amc.com\njx-bank.com\njx09.com\njx116114.com\njx139.com\njx163-cname.com\njx163.com\njx188.com\njx3box.com\njx3mogu.com\njx3pve.com\njx3yymj.com\njx4.com\njx530.com\njx8.net\njx878.com\njxage.com\njxairport.com\njxausoft.com\njxawe.org\njxbhwl.com\njxbinhong.com\njxbond.com\njxbscbd.com\njxc4.com\njxcar.com\njxcat.com\njxcb.net\njxcc.com\njxccb.com\njxcdkjfz.com\njxcfs.com\njxch12333.com\njxchaguan.com\njxckd.shop\njxcsedu.com\njxct.work\njxcua.com\njxdcnc.com\njxdcost.com\njxdcw.com\njxdhhbhg.com\njxdiguo.com\njxdinfo.com\njxdlzy.com\njxdouliang.com\njxdx.com\njxdxxt.com\njxdyf.com\njxdyyy.com\njxdzx.com\njxeca.com\njxedgroup.com\njxedt.com\njxedu.net\njxeduyun.com\njxenglish.com\njxep.net\njxetv.com\njxexpressway.com\njxey.com\njxfeng.com\njxfhomes.org\njxfls.com\njxfrjs.com\njxfxky.com\njxg1.com\njxg866.com\njxga.com\njxgazx.com\njxgcxy.net\njxgdhb.com\njxgdw.com\njxgis.com\njxgs.cc\njxgtzxc.com\njxgwy.org\njxgztv.com\njxh2000.net\njxheming.com\njxhesyy.com\njxhjxy.com\njxhmjx.com\njxhmxxjs.com\njxhswhcb.com\njxhuahang.com\njxhxmed.com\njxhyxx.com\njxiaolan.com\njxic.com\njximage.com\njxjatv.com\njxjdgy.com\njxjee.com\njxjia.net\njxjianwei.com\njxjktzjt.com\njxjmzc.com\njxjob.net\njxjrw.com\njxjt666.com\njxjuwentech.com\njxjx6.com\njxjywater.com\njxkeda.com\njxkjzb.com\njxkp.com\njxksw.net\njxlgjd.com\njxln.com\njxlog.istreamsche.com\njxlong.com\njxlpjt.com\njxlsxy.com\njxlvs.com\njxlwgame.com\njxlygo.com\njxmhp.com\njxmj.com\njxmlkd.com\njxmrfire.com\njxmy18.com\njxncyy.com\njxndxuebao.com\njxnjy.com\njxnongjiayuan.com\njxnxs.com\njxnyc.net\njxpdf.com\njxphone.com\njxpp.com\njxpta.com\njxqcw.com\njxqy.city\njxqyfw.com\njxrays.com\njxrcgame.com\njxrcw.cc\njxrcw.com\njxrczp.com\njxrjxh.com\njxrmtzx.com\njxropan.com\njxrqgs.com\njxrqhy.com\njxrsrc.com\njxrtv.com\njxrtvu.com\njxsdfz.com\njxsedu.com\njxsenyang.com\njxsfjzsh.com\njxsg.com\njxshangyou.com\njxshyzhx.com\njxsilkpark.com\njxsj-vtech.com\njxsj2sy.com\njxsjgjt.com\njxsjxh.com\njxsjypt.com\njxslsyy.com\njxsltz.com\njxslyw.com\njxsrfdc.com\njxsrjt.com\njxsrra.com\njxssjx.com\njxssjy.com\njxstm.com\njxsuji.com\njxswjt.com\njxswskj.com\njxswzjx.com\njxsxdz.com\njxszxyjhyy.com\njxszyy.com\njxt1314.com\njxt189.com\njxtcxh.com\njxteacher.com\njxtech.net\njxthz.net\njxtransfer.com\njxtutechan.com\njxtvbbs.com\njxtvshop.com\njxtwkj.com\njxtxzzw.com\njxtyzx.org\njxtzw.com\njxunicom.com\njxveg.org\njxw12328.com\njxwan.com\njxwmanage.com\njxwmsj.com\njxwxai.com\njxwz.net\njxx7.com\njxxdf.com\njxxdxy.com\njxxhdn.com\njxxhsd.com\njxxinzhe.com\njxxnyqc.com\njxxs.net\njxycqy.com\njxyczs.com\njxydt.com\njxygroup.com\njxyhys.com\njxyige.com\njxyjxy.com\njxyqw.com\njxysedu.com\njxytech.com\njxyuging.com\njxyushan.com\njxyy.net\njxzbx.com\njxzeto.com\njxzikao.net\njxzl.cc\njxzxtec.com\njxzyx.com\njy-leasing.com\njy-mach.com\njy-sz.net\njy.cc\njy0604.com\njy0832.com\njy163.net\njy1991.com\njy391.com\njy510.com\njy6d.com\njyacg.com\njyacht.com\njyaochi.com\njyarton.com\njybase.net\njyblife.com\njyboo.com\njycbank.com\njycinema.com\njycloudgslb.com\njycloudgslb.net\njydc.com\njydj.net\njydoc.com\njydonghu.com\njydtu.com\njyebank.com\njyebfz.com\njyecc.com\njyeoo.com\njyeoo.net\njyfcyy.com\njyfprinting.com\njyfund.com\njyfwyun.com\njyg-lighting.com\njygch.com\njygjsq.com\njyglass.net\njygo.cc\njygpu.com\njygsdyrmyy.com\njyguagua.com\njygyl.com\njygz.com\njygz.org\njyh.com\njyhcd.com\njyhmz.com\njyhome.com\njyhwcl.com\njyhyfintax.com\njyhzsc.com\njyimg.com\njyinns.com\njyip.net\njyjhkj.com\njyjjc.com\njyjk.com\njyjxtech.com\njykm88.com\njykss.com\njykuaidi.com\njyl88.com\njylight.cc\njylink.com\njyltx.com\njylw.com\njylxbc.com\njymhb.com\njymredu.com\njynews.net\njynongye.com\njynyrc.com\njyoptical.com\njypc.org\njypecdn3.com\njypipes.com\njypmm.com\njyqcw.com\njyqingfeng.com\njyqxz2015.com\njyrcjl.com\njyrcw.com\njyrczp.com\njyrlzy.com\njyrmtzx.com\njyrmyy.com\njyrq.net\njyry.com\njys0755.com\njys6z.com\njysbcj.com\njysd.com\njysedu.com\njyseeds.com\njyshare.com\njyshoubao.com\njysld.com\njysmtech.com\njysper.net\njysq.net\njysrc369.com\njyss.com\njyss.net\njysteels.com\njysu.com\njysyyey.com\njysyzk.com\njysyzx.net\njytaier.com\njytcdq.com\njytek.com\njytjsgyp.com\njytmachinery.com\njytrump.com\njytwp.com\njyubbs.com\njywanrun.com\njywfgg.com\njywlcm.com\njywmgs.com\njywxq.com\njyxdyzx.com\njyykyy.com\njyyun.com\njyzb01.com\njyzc.com\njyzhongg.com\njyzmd.com\njyzz666.com\njyzzdq.com\njyzzx.com\njz-hy.com\njz-ins.com\njz-job.com\njz-marathon.com\njz0045.com\njz08.com\njz100.com\njz177.com\njz182.com\njz26666.com\njz36666.com\njz5u.com\njz6.com\njz60.com\njz6868.com\njz68888.com\njzac.org\njzagile.com\njzb.com\njzbar.net\njzbull.com\njzcbank.com\njzchou.com\njzcmfw.com\njzctmy.com\njzcxptm.com\njzda001.com\njzdd.com\njzdlgroup.com\njzdwh.com\njzedu24.com\njzerp.com\njzfz.net\njzg12315.com\njzgc-school.com\njzgchy.com\njzgcjsysjzz.com\njzgczz.com\njzgede.com\njzggzy.com\njzgjbus.com\njzgjj.com\njzhfz.com\njzhkr.com\njzhlgg.com\njzhospital.com\njzhuishou.com\njzhx.net\njzhy5.com\njzj2009.com\njzj9999.com\njzjgift.com\njzjt.com\njzking.com\njzkjjt.com\njzlt100.com\njzmbti.com\njzmjtjn.xyz\njzmlzy.com\njzmob.com\njzmsmj.com\njzmt.net\njznygf.com\njznyjt.com\njzongguan.com\njzpat.com\njzptt.com\njzpu.com\njzpx.net\njzq9pzcz8b.world\njzqe.com\njzqlyptall.com\njzrb.com\njzrc.net\njzrsks.com\njzsbs.com\njzsbxxh.com\njzsc.net\njzsc8.com\njzsec.com\njzsf.com\njzsgzmhjyxgs.com\njzsjyksy.com\njzsos.com\njzsousuo.com\njzsszyjzx.com\njzsxinyudianqi.com\njzsyy.com\njzszdq.com\njzszzx.com\njztey.com\njztsjx.com\njztvnews.com\njztvxmt.com\njztweb.com\njzty.com\njztylxx.com\njztzw.net\njzwcom.com\njzwl66.com\njzwxfrp.com\njzx.com\njzxian.com\njzxjcf.com\njzxs.com\njzygczx.com\njzyqyb.com\njzyqzypg.com\njzyx.com\njzzfyw.com\njzzhw.com\njzzls.com\njzzx.com\njzzypt.com\nk-boxing.com\nk-dyn.com\nk-kbox.com\nk-res.net\nk.biz\nk0898.com\nk0rz3n.com\nk12.vip\nk12china.com\nk12kc.com\nk12zx.com\nk165.com\nk166.org\nk1u.com\nk1wave.com\nk22.xyz\nk2os.com\nk3072.com\nk365.asia\nk366.com\nk369.com\nk382.com\nk3cdn.com\nk3yes.com\nk43439.com\nk518.com\nk5hp4qte.work\nk5n.com\nk61.org\nk6uk.com\nk73.com\nk780.com\nk8.com\nk8008.com\nk8azeicxy4idx.com\nk8k8k8.com\nk8ser.com\nk8smeetup.com\nk8stech.net\nk913.com\nka20.com\nkaaass.net\nkaadas.com\nkaaer.org\nkaayou.com\nkaayou.net\nkaayun.com\nkaba365.com\nkabapay.com\nkabasiji.com\nkaboy.net\nkabu1.com\nkaceie.com\nkachecn.com\nkachengnet.com\nkacheren.com\nkacper.fun\nkada.com\nkada163.com\nkadang.com\nkaduoduohk.com\nkaeryun.com\nkafangtech.com\nkafeng.com\nkagirl.net\nkah8.com\nkahaozhushou.com\nkahha.com\nkahuodong.com\nkai-lun.net\nkai-ying.com\nkaiba315.com\nkaibanglaw.com\nkaiboer.com\nkaichejiqiao.com\nkaichengschool.com\nkaicn.com\nkaidanbao.com\nkaidany.com\nkaidapack.com\nkaidechem.com\nkaidianbang.com\nkaidicloud.com\nkaidydrilling.com\nkaierda.com\nkaifabang.com\nkaifae.com\nkaifage.com\nkaifakuai.com\nkaifama.com\nkaifamei.com\nkaifangkecheng.com\nkaifapiao.com\nkaifaxhl.com\nkaifaxueyuan.com\nkaifayun.com\nkaifu.com\nkaifu1.com\nkaifubiao.com\nkaifubiao123.com\nkaigao.com\nkaige68.com\nkaigongyi.com\nkaiguo.com\nkaihei.co\nkaihong.com\nkaihu51.com\nkaihuaeva.com\nkaihuia.com\nkaijia-smt.com\nkaijia.com\nkaijiage.com\nkaijiejinrong.com\nkaijieunion.com\nkaijiudian.net\nkaikeba.com\nkailang17.com\nkaili-group.com\nkailinchem.com\nkailing.pub\nkailinjt.com\nkailitech.com\nkaimanhua.com\nkaimen360.com\nkaimenhong.org\nkaimg.com\nkaimitech.com\nkaipai.com\nkaipanhong.com\nkaipanla.com\nkaipuyun.com\nkaipuyun.net\nkaiqiancq.com\nkaiqiu.cc\nkaiqsz.com\nkaiquan.com\nkairui.tech\nkairunjinshu.com\nkaisacst.com\nkaisagroup.com\nkaisahotel.com\nkaisalong.com\nkaisamicf.org\nkaishan-pv.com\nkaishancomp.com\nkaishangroup.com\nkaishigo.com\nkaishikan.com\nkaishuhezi.com\nkaishujia.com\nkaishustory.com\nkaitai668.com\nkaitaibh.com\nkaitaishotblasting.com\nkaitaku.xyz\nkaiteer17.com\nkaitianad.com\nkaitiancloud.com\nkaiting.cc\nkaiwenda.com\nkaiweneducation.com\nkaiwind.com\nkaixia.com\nkaixin.com\nkaixin00.com\nkaixin001.com\nkaixin100.com\nkaixinbao.com\nkaixindou.net\nkaixinguopiao.com\nkaixinguopiaowu.net\nkaixinhui.com\nkaixinhui.net\nkaixinit.com\nkaixinlu.com\nkaixinvv9.com\nkaixinzuqin.com\nkaixue.io\nkaiyanapp.com\nkaiygame.com\nkaiyi.cool\nkaiyihome.com\nkaiyinedu.com\nkaiyuan.me\nkaiyuanbusiness.com\nkaiyuancn.com\nkaiyuangroup.cc\nkaiyuanhospital.com\nkaiyuanhotels.com\nkaiyuanweilaikeji.com\nkaiyuedoors.com\nkaiyueyun.com\nkaiyun.com\nkaiyun.net\nkaiyun360.com\nkaiyuncare.com\nkaiyunwu.net\nkaizhan.com\nkajicam.com\nkajishou.com\nkaka.com\nkaka996.com\nkakacl.net\nkakadown.com\nkakalili.com\nkakamobi.com\nkakappt.com\nkakashuzi.net\nkakatx.com\nkakayigui.com\nkakayuy.net\nkaken-china.com\nkaku-scdn.com\nkaku.tv\nkakucloud.com\nkalading.com\nkalamitsibeach.com\nkalazan.com\nkalcaddle.com\nkaleesh.com\nkalefans.com\nkalegou.com\nkalifang.com\nkaliorg.com\nkalugaqueen.com\nkaluli.com\nkamaqc.com\nkameng98.com\nkamenwang.com\nkamfat.net\nkami.vip\nkami5.com\nkamidox.com\nkamisamak.com\nkamitemall.com\nkammtown.com\nkamoasia.com\nkamopos.com\nkamtao.com\nkamwu.com\nkan.cc\nkan0512.com\nkan3721.com\nkanbaobei.com\nkanbing.net\nkanbox.com\nkancaibao.com\nkanchao.com\nkanchuan.com\nkandao.com\nkandaoni.com\nkandedongguan.com\nkandegang.net\nkandehotelhuizhou.com\nkandian.com\nkandian.net\nkandian.tv\nkandian5.com\nkandianbao.com\nkandianshi.com\nkandianzixun.com\nkandzww.com\nkanfangjilu.com\nkanfeidie.com\nkang-li.com\nkang-zhuo.com\nkang7.com\nkangai8.com\nkangame.tv\nkangantu.com\nkangbaifoundation.com\nkangbatv.com\nkangbeijia.com\nkangbidz.com\nkangbixing.com\nkangchun.com\nkangdacolorful.com\nkangdaep.com\nkangdajiuzhou.com\nkangdalawyers.com\nkangdamed.net\nkangdexin.com\nkangdns.com\nkangehao.com\nkangepian.com\nkangerfugroup.com\nkangfenhui.com\nkangfenmao.com\nkanggui.com\nkanghe.com\nkanghu.net\nkanghuash.com\nkanghuayun.com\nkanghui.com\nkanghuicy.com\nkanghuwang.com\nkangjiachildcare.com\nkangjian.com\nkangjian888.com\nkangjiezx.net\nkangkang.com\nkanglaohui.com\nkangle.net\nkanglepharm.com\nkanglisha.com\nkangliyaoye.com\nkangnai.com\nkangpeining.com\nkangpugroup.com\nkangq.com\nkangqiao-sh.com\nkangre.com\nkangrunpharm.com\nkangshuai.biz\nkangsibeauty.com\nkangtaiwang.com\nkangting.com\nkangtor.com\nkangufen.com\nkanguo.com\nkanguowai.com\nkangxi55wlsf.com\nkangxiang.com\nkangxidi.com\nkangxin.com\nkangyang51.com\nkangyiqiye.com\nkangyuntang.com\nkangze.com\nkangzhi.com\nkangzhimei.net\nkangzhiqiao.com\nkanimg.com\nkaniuquan.com\nkanixiaoxia.com\nkanjia.com\nkanjian.com\nkanjianxinli.com\nkankan.com\nkankan.run\nkankan365.cc\nkankancity.com\nkankanews.com\nkankanlive.com\nkankanmi.com\nkankannews.com\nkankanpiao.com\nkankantu.com\nkankanyn.com\nkankanyulewang.com\nkankanzhijian.com\nkanketv.com\nkankezw.com\nkankun-smartplug.com\nkanman.com\nkanniao.com\nkanong.com\nkanongyun.com\nkanqibao.com\nkanqiye.com\nkanqq.com\nkanqu.com\nkanrang.com\nkanrang.net\nkansdk.com\nkansea.com\nkanshangjie.com\nkanshijie.cc\nkanshu.com\nkanshu5.net\nkanshu58.cc\nkanshuge.com\nkanshuhai.com\nkanshushi.com\nkansp.com\nkantao.net\nkantianqi.net\nkantop.net\nkantsuu.com\nkantu.com\nkanwuye.com\nkanwz.net\nkanxue.com\nkanyaji.com\nkanyijie.com\nkanyixue.com\nkanyouxi.com\nkanyouxi.tv\nkanyun.com\nkanzhekou.com\nkanzhun.com\nkanzuixian.com\nkao100.com\nkao750.com\nkao8.cc\nkao910.com\nkaoaa.com\nkaobeitu.com\nkaochong.com\nkaochongqing.com\nkaodaojy.com\nkaodongli.com\nkaoersi.com\nkaogua.com\nkaoguobao.com\nkaojiaoshi.com\nkaojionline.com\nkaojuan.com\nkaola.com\nkaola.com.hk\nkaola100.com\nkaolacam.net\nkaolacdn.com\nkaolafm.com\nkaolafm.net\nkaolawenku.com\nkaom.net\nkaomeiyuan.com\nkaonaw.com\nkaonenyi.com\nkaonun.com\nkaopenhs.com\nkaopu001.com\nkaopubao.com\nkaopujinfu.com\nkaopuyun.com\nkaopuyun.net\nkaoqin.com\nkaoqintong.net\nkaoqinyi.com\nkaoruo.com\nkaoshenzazhi.com\nkaoshi110.com\nkaoshi365.com\nkaoshi86.com\nkaoshibao.com\nkaoshibb.com\nkaoshidian.com\nkaoshixing.com\nkaoshizixun.com\nkaosite.com\nkaostedu.com\nkaotipai.com\nkaowana.com\nkaowang.com\nkaowx.com\nkaoyan.com\nkaoyan.org\nkaoyan1v1.com\nkaoyanbox.net\nkaoyancas.com\nkaoyancas.net\nkaoyango.com\nkaoyanjun.com\nkaoyanking.com\nkaoyanmiji.com\nkaoyansiji.com\nkaoyanwin.com\nkaoyaya.com\nkaozc.com\nkaozh.com\nkaozhiye.com\nkap666.com\nkapokshenzhen.com\nkaquanbao.com\nkaratetrend.com\nkarger.com\nkargocard.com\nkarl-led.com\nkarlzhou.com\nkarrytech.com\nkartlover.com\nkascend.com\nkashangwl.com\nkashen.com\nkashen8.com\nkashengauto.com\nkasitesoft.com\nkaslyju.com\nkaspersky-labs.com\nkasscloud.com\nkataliya.net\nkate-kanebo.net\nkatongji.com\nkatvr.com\nkatyusha.net\nkava-auto.com\nkavaparts.com\nkaven.xyz\nkavience.com\nkawahdinosaur.com\nkawasakijp.com\nkawata-group.com\nkawoka.com\nkayajiuhui.com\nkayhanfamily.com\nkayipgroup.com\nkayougame.com\nkaytrip.com\nkaytune.com\nkazakcnr.com\nkazhifu.com\nkazithai.com\nkazl.com\nkb.com\nkb54.com\nkb9.com\nkbans.com\nkbao123.com\nkbcdn.com\nkbcmw.com\nkbcool.com\nkbdfans.com\nkbdxd.org\nkbgogo.com\nkbgok.com\nkbiquge8.com\nkbjcn.com\nkbkyy.com\nkblcdn.com\nkblin.com\nkbmlifesci.com\nkbn-zhejiang.com\nkbnhp.com\nkbnqy.com\nkbobo.com\nkboth.com\nkbrightlaw.com\nkbscd.net\nkbscloud.com\nkbsml.com\nkbspheres.com\nkbtingdu.com\nkbyun.com\nkc-keycool.com\nkc0011.net\nkc87.com\nkcbebank.com\nkccidc.com\nkccn.net\nkcdn0.com\nkcdnvip.com\nkcfei.com\nkchance.com\nkchezhan.com\nkchile.com\nkchuhai.com\nkci-gz.com\nkciptv.com\nkcjpharma.com\nkcjyyjzzs.com\nkcloudidc.com\nkcm120.com\nkcmice.com\nkcouxp.com\nkcqcjt.com\nkcrcb.com\nkcrea.cc\nkcrw.streamguys1.com\nkctgov.com\nkctzgroup.com\nkcwiki.org\nkcyuri.com\nkczhaosheng.com\nkd010.com\nkd100.com\nkd120.com\nkd128.com\nkd315.com\nkd58.com\nkd9000.com\nkdadj.com\nkdaec.com\nkdatacenter.com\nkdatu.com\nkdcloud.com\nkdclub.net\nkdcnu.com\nkdefu.com\nkdf.ink\nkdgcsoft.com\nkdhj-edu.net\nkdige.com\nkdkefu.com\nkdkh.com\nkdlgs.com\nkdnet.net\nkdniao.com\nkdpt.net\nkdr163.com\nkdrmd.com\nkdroid.club\nkds100.com\nkdslife.com\nkdt.im\nkdued.com\nkdweibo.com\nkdzs.com\nkdzwy.com\nkdzxedu.com\nke-chuang.com\nke.com\nke51.com\nke6.com\nke6payux9q4pih.com\nke82.com\nke86.com\nke8u.com\nkeai.icu\nkeaidian.com\nkeaiq.com\nkean1688.com\nkeanrui.com\nkeaopt.com\nkeba.host\nkebango.com\nkeberosteri.com\nkebi.biz\nkebide.com\nkebingzao.com\nkeboyunxiao.com\nkebvalves.com\nkeceyun.com\nkechengbiao.net\nkechengkeli.com\nkechuang.org\nkechuangai.com\nkechuangfu.com\nkeda-digital.com\nkeda-group.com\nkeda-u.com\nkeda.com\nkeda.fun\nkedabai.com\nkedacom.com\nkedaifu.com\nkedang.net\nkedanm.com\nkedaotech.com\nkede-auto.com\nkede.com\nkedefamen.com\nkedi.cc\nkedian-tech.com\nkedianduo.com\nkedidairy.com\nkedingyun.com\nkedou.com\nkeduxinxi.com\nkedwyz.com\nkeede.com\nkeejuu.com\nkeen-dental.com\nkeenbow.com\nkeenonrobot.com\nkeensky.com\nkeep.com\nkeep999.com\nkeepc.com\nkeepcdn.com\nkeepchen.com\nkeeper.work\nkeepfightinghxz.xyz\nkeepfrds.com\nkeepke.com\nkeepmobi.com\nkeepnight.com\nkeepsoft.net\nkeepyoga.com\nkeerdapower.com\nkeerqinmuseum.com\nkeerworld.com\nkeetalks.com\nkeewin.com\nkeey.sh\nkefeijn.com\nkefenxi.com\nkefoo.com\nkefu01.com\nkefutoutiao.com\nkefuzu.com\nkege.com\nkehaohao.com\nkehou.com\nkehu51.com\nkehuaapp.com\nkehuan-upward.com\nkehuda.com\nkehuzhichi.com\nkehuzhichi.net\nkeil345.com\nkeinsci.com\nkeithbo.com\nkeji100.net\nkejian.design\nkejianx.com\nkejibear.net\nkejicut.com\nkejids.com\nkejihai.com\nkejik.com\nkejilie.com\nkejimeixue.com\nkejingyuan.com\nkejinlianmeng.com\nkejinshou.com\nkejiqi.com\nkejishou.net\nkejitai.com\nkejitechangsheng.com\nkejitian.com\nkejiwang.cc\nkejiweixun.com\nkejudati.com\nkekaku.com\nkekaoxing.com\nkekaoyun.com\nkeke.moe\nkeke289.com\nkekebaby.com\nkekedj.com\nkekegold.com\nkekenet.com\nkekeniu.com\nkekeshici.com\nkekeyuyin.com\nkekkyy.com\nkekoku.com\nkeky.org\nkeladuoww.com\nkeladuoyy.com\nkelaisz.com\nkelanjt.com\nkelankqs.com\nkeldamedical.com\nkele8.com\nkelehuyu.com\nkeleqiu.com\nkelete.com\nkeliangtek.com\nkelibiao.com\nkelikt.com\nkelimotor.com\nkelinpower.com\nkelinsoft.com\nkelon.com\nkelong-chemical.com\nkelong-powder.com\nkelongding.com\nkeloop.com\nkelorlink.com\nkelphome.com\nkelu.org\nkelun.com\nkeluokelie.com\nkeluyjs.com\nkema66.com\nkemaicrm.com\nkeman.com\nkemavip.com\nkeme.work\nkemiaotai.com\nkemicro.com\nkemike888.com\nkemov.com\nken-tools.com\nken.io\nkename.com\nkenaqz.com\nkenbotong.com\nkendingde.com\nkendryte.com\nkeneng.org\nkenflo.com\nkenfor.com\nkenfor.net\nkengatoki.com\nkengdie.com\nkengic.com\nkengwan.com\nkenistab.com\nkeniu.com\nkeniub.com\nkeniuxy.com\nkenjieer.com\nkenkapacking.com\nkenpai.com\nkenpains.com\nkenshu.cc\nkenshuhu.com\nkensuntec.com\nkentier.com\nkentxxq.com\nkenuonet.com\nkenweini.com\nkenxon.com\nkenzochina.com\nkeoaeic.org\nkeouaxbw.com\nkeovo.net\nkepusky.com\nkeputech.com\nkeqiaojob.com\nkequcps.com\nker58.com\nkercan.net\nkercoras.com\nkerisom.com\nkerlala.com\nkernel-sh.com\nkernel.cc\nkernelfood.com\nkernelmed.com\nkernelnote.com\nkerneltravel.net\nkerntech-asp.com\nkerric-china.com\nkerryparkside.com\nkeruibell.com\nkeruigroup.com\nkeruiiai.com\nkeruilai.com\nkeruilait.com\nkeruisifan.com\nkeruknowledge.com\nkerun2010.com\nkerundegroup.net\nkerust.com\nkeruyun.com\nkeruyun.net\nkery-pharm.com\nkerysoft.com\nkesci.com\nkesheng.com\nkeshenwei.com\nkeshizhongguo.com\nkesion.com\nkesiyunlai.com\nkesonco.com\nkesong.co\nkesong520.com\nkesonic.com\nketangpai.com\nketechdigital.com\nketingkeji.com\nketingzhuangxiu.com\nketofbx.net\nkevinems.com\nkevinjiang.info\nkevinlq.com\nkevke.com\nkewu.cc\nkewucool.com\nkexgfv.com\nkexianggroup.com\nkexin001.com\nkexinbiotech.com\nkexincpa.com\nkexing100.com\nkexingchem.com\nkexinggy.com\nkexinhaoma.org\nkexinshe.com\nkexinyun.org\nkexu.com\nkexue.com\nkexue.fm\nkexuezixunzzs.com\nkexuna.com\nkey-iot.com\nkeyboardancer.com\nkeyboardingonline.net\nkeycom-ip.com\nkeydak.com\nkeydatas.com\nkeyde.com\nkeyfc.net\nkeygotech.com\nkeyibao.com\nkeyigroup.com\nkeyingchem.com\nkeyipump.com\nkeylol.com\nkeymantek.com\nkeymedbio.com\nkeymoe.com\nkeyoo.com\nkeyoou.com\nkeyray-hk.com\nkeytherapharma.com\nkeyto168.com\nkeytoix.vip\nkeyu66.com\nkeyuanpharma.com\nkeyubio.com\nkeyuejiazheng.com\nkeyueng.com\nkeyunchaxun.com\nkeyunidc.com\nkeyunlaser.com\nkeyunsoft.com\nkeyyaam.com\nkezehb.com\nkezhaozhao.com\nkezhi.tech\nkf.ai\nkf155yy.com\nkf5.com\nkf911.com\nkf9977.com\nkfadx.tech\nkfang.xin\nkfb126.com\nkfb163.com\nkfcbest.com\nkfcdn.com\nkfchiheng.com\nkfcjrl.com\nkfdcc.com\nkffone.com\nkfganquan.com\nkfhome.com\nkfhty.com\nkfj.cc\nkfjd.com\nkfjyd.com\nkfjyjt.com\nkflhgs.com\nkfmanager.com\nkfqizhongji.com\nkfsddj.com\nkfskxy.com\nkfvcca.com\nkfw001.com\nkfzdh.com\nkfzhinan.com\nkfzimg.com\nkfzls.com\nkg-power.com\nkg.com\nkghbcn.com\nkgimg.com\nkgipr.com\nkgithub.com\nkgnmkj.com\nkgogame.com\nkgrestrg.com\nkgzyy.com\nkh-zx.com\nkh84.com\nkhdatasolutions.com\nkhdyly.com\nkhfwedu.com\nkhhospital.com\nkhidi.com\nkhlgamen.com\nkhly.com\nkhlysc.com\nkhmhvlw.com\nkhnhw.com\nkhotyn.com\nkhqihuo.com\nkhruiming.com\nkhs1994.com\nkhworidtour.com\nkhysct.com\nki-pa.com\nkiaic.com\nkiana.love\nkiapmyf.xyz\nkibinggroup.com\nkicontech.com\nkid17.com\nkiddopal.com\nkidikidi.net\nkidsccshow.com\nkidscoding8.com\nkidsdown.com\nkidseq.net\nkidsflab.org\nkidsfoto.net\nkidspsy.com\nkidsthomas.com\nkidsyun.com\nkidulte.com\nkidulty.com\nkiiik.com\nkiijoy.com\nkiinii.com\nkiiyi.com\nkijifept.com\nkikiwon.com\nkikoplay.fun\nkikusuitape.com\nkikuu.com\nkilamanbo.com\nkililife.com\nkilldb.com\nkillerheelsphotography.org\nkilo1kw.com\nkiloai.com\nkimberley-technology.com\nkimderlite.com\nkimi.ai\nkimi.com\nkimi.link\nkimi.pub\nkimiss.com\nkimiss.net\nkimiter.com\nkimleo.net\nkimqi.net\nkimsom.com\nkimxz.com\nkina.cc\nkinbull.com\nkindechem.com\nkindlelib.com\nkindobest.com\nkindredous.com\nkindsoft.net\nking-capital.com\nking-rain.com\nking-strong.com\nkingandkey.com\nkingandwood.com\nkingarad.com\nkingbank.com\nkingboritape.com\nkingborn.org\nkingbos.com\nkingbrother.com\nkingcheergame.com\nkingcloud.com\nkingcloudad.com\nkingclouddns.com\nkingcms.com\nkingdaychina.com\nkingdee-soft.com\nkingdee.com\nkingdee.com.tw\nkingdee.org\nkingdeemall.com\nkingdeestar.com\nkingdeeyun.com\nkingdelgc.com\nkingdom-ceramic.com\nkingdomfishing.com\nkingdomsolar.net\nkingdraw.com\nkingdun.net\nkingexplorer.com\nkingfu-china.com\nkingfulai.com\nkinggoo.com\nkinggrid.com\nkinghomechina.com\nkingidc.net\nkinginfo.com\nkingjee-tech.com\nkingjee.com\nkingjin-sh.com\nkingkaid.com\nkingland119.com\nkingleen.net\nkingliton.com\nkinglory.com\nkinglymotor.com\nkinglyuan.com\nkingmagic.co\nkingmagnet.com\nkingmb.com\nkingmylab.com\nkingnare.com\nkingnet.com\nkingnetdc.com\nkingnettech.com\nkingoit.com\nkingosoft.com\nkingpower-cn.com\nkingrack.com\nkingray-tech.com\nkingreader.com\nkingrein.com\nkingroot.net\nkings3d.com\nkingsemi.com\nkingsh.store\nkingshan2002.com\nkingsley-cq.com\nkingslicer.com\nkingsmen-gc.com\nkingsoft-office-service.com\nkingsoft.com\nkingsoft.net\nkingsoftstore.com\nkingsrich.com\nkingst.org\nkingstarmedical.com\nkingstartech.com\nkingston.group\nkingstronbio.com\nkingsunedu.com\nkingsungmedical.com\nkingsunpower.com\nkingsunsoft.com\nkingtaifook.com\nkingtroldata.com\nkingtysin.com\nkingview.com\nkingwisoft.com\nkingyield.com\nkingyon.com\nkingyork.com\nkingzom.com\nkinhom.com\nkinhoo.com\nkinlong.com\nkinpan.com\nkinpn.com\nkinpoway.com\nkinqee.com\nkinsec.com\nkinte-ind.com\nkintiger.com\nkintn.com\nkintowe.com\nkinval.com\nkinwong.com\nkinzhan.com\nkinzoncap.com\nkiomodesign.com\nkira.cool\nkirakuapp.com\nkirgen.com\nkiriko-china.com\nkirin-tech.com\nkirincloud.net\nkirinmach.com\nkirinvm.com\nkirkcloud.com\nkiscoca.com\nkisdee.com\nkisence.com\nkisilicon.com\nkisops.com\nkiss998.com\nkisskisso.com\nkissyj.com\nkissyui.com\nkiswo.com\nkit-lee.me\nkitic.net\nkitiu.com\nkitking.com\nkitontech.com\nkitstown.com\nkitty.su\nkituin.fun\nkiun24ok.com\nkivend.net\nkivo.wiki\nkiwa-tech.com\nkiwenlau.com\nkiwifarms.net\nkiwifarms.st\nkiwimoore.com\nkiwisec.com\nkiyuu.club\nkj-ic.com\nkj-pcb.com\nkj021.com\nkj1d.com\nkj2100.com\nkj3.com\nkj400.com\nkj521.com\nkjb2c.com\nkjcdn.com\nkjchina.com\nkjchuang.com\nkjcity.com\nkjcmxx.com\nkjcxpp.com\nkjcyfz.com\nkjdb.org\nkjdvsg.com\nkjeport.com\nkjewryhf.xin\nkjfns.com\nkjgcl.com\nkjghyjy.com\nkjhaoyun.com\nkjimg.com\nkjingbao.com\nkjiuye.com\nkjjcrm.com\nkjjl100.com\nkjjxjy.com\nkjjxl.com\nkjjzm.com\nkjkd.com\nkjkp.com\nkjks.net\nkjkxun.com\nkjlww.com\nkjmofang.com\nkjmte.com\nkjmti.com\nkjpmconsulting.com\nkjr365.com\nkjrs365.com\nkjsdh6.com\nkjson.com\nkjsv.com\nkjt.com\nkjtbao.com\nkjtianshanxu.com\nkjtong.com\nkjtpay.com\nkjutf-uejfncpo72u.com\nkjw.cc\nkjwlxt.com\nkjwugx.com\nkjycx.com\nkjyicdn.com\nkjykcdn.com\nkjyun123.com\nkjzhan.com\nkjzj.com\nkjzx.net\nkjzxtk.com\nkjzz.streamguys1.com\nkk-china.com\nkk1.vip\nkk169.com\nkk18.com\nkk1bie336689.com\nkk30.com\nkk30.net\nkk3g.net\nkkabc.com\nkkapp.com\nkkcache.net\nkkcapture.com\nkkcdn.net\nkkcha.com\nkkcharge.com\nkkcoo.com\nkkcursor.com\nkkdaxue.com\nkkddosdns.com\nkkdgroup.com\nkkdict.com\nkkdnsv1.com\nkkdownload.com\nkkdzpt.com\nkkeji.com\nkkexcel.com\nkkfesw.com\nkkffdns.com\nkkfw.net\nkkgithub.com\nkkguan.com\nkkgwy.com\nkkh-global.com\nkkhaitao.com\nkkid.vip\nkkidc.com\nkkj2.com\nkkjiaofei.com\nkkjs.tech\nkkk5.com\nkkkwww.com\nkkkxj.com\nkklishi.com\nkklxj.com\nkkmall.org\nkkmar.com\nkkmh.com\nkkmicro.com\nkkmop.com\nkkong.vip\nkkrb.net\nkksmg.com\nkksofts.com\nkkt.com\nkktian.com\nkktijian.com\nkktv1.com\nkktv5.com\nkktv8.com\nkkuryat.com\nkkuu.com\nkkwafdns.com\nkkwan.cc\nkkx.net\nkkxnb.com\nkkxxiazai.com\nkkyoo.com\nkkyp.shop\nkkyuan.com\nkkyuedu.com\nkkzhan.com\nkkzj.com\nkkzs.io\nkkzycdn.com\nkl1l5.com\nkl321.com\nkl688.com\nklandk.com\nklbn100.com\nklbyjt.com\nklchemicals.net\nklclear.com\nklcsb.com\nkldhq.com\nklgkm.com\nklhpw.com\nklhuyan.com\nklianfa.com\nklicen.com\nklingai.com\nklinlee.com\nklisedu.com\nkliwu.com\nkljiyou.com\nkljtc.com\nkllife.com\nklmnf.com\nklmy118114.com\nklmybbs.com\nklmymarathon.com\nklmyssn.com\nklner.com\nklniu.com\nklpbbs.com\nklqcb.com\nklqy.com\nkltgt.com\nkltjn.com\nkltong.com\nklub11.com\nklv5qu.com\nklvtu.com\nklwxq.com\nklx-tech.com\nklxksci.com\nklxsw.com\nklxuexi.com\nklyang.com\nklzhlogistics.com\nkm.com\nkm10z.net\nkm169.net\nkm18.net\nkm1818.com\nkm28.com\nkm5858.com\nkm8z.net\nkmail.com\nkmaoxx.com\nkmapp.net\nkmbbs.com\nkmbdqn.com\nkmcha.com\nkmcits.com\nkmcits0716.com\nkmcsg.com\nkmcxedu.com\nkmcxg.com\nkmcz365.com\nkmd8888.com\nkmdctz.com\nkmdcwt.com\nkmdn.net\nkmdns.net\nkmeecc.com\nkmeila.com\nkmeitu.com\nkmf.com\nkmfengli.com\nkmg-jd.com\nkmgdgs.com\nkmguolv.com\nkmgybsr.com\nkmhpc.net\nkmhwtz.com\nkmjt.net\nkmlcl.com\nkmlhh.com\nkmljexb.xyz\nkmmama.com\nkmmdkj.com\nkmoe0.com\nkmplayercn.com\nkmpwgxzy.com\nkmqcwx.com\nkmqsaq.com\nkmread.com\nkmrfidtag.com\nkmrijie.com\nkmron.com\nkms.pub\nkmssgd.com\nkmsz.net\nkmszy.com\nkmteruite.com\nkmthy.com\nkmtlbj.com\nkmtlfckyy.com\nkmtrh.org\nkmtxzs.com\nkmvtc.net\nkmvxwedy.com\nkmw.cc\nkmw.com\nkmwatersupply.com\nkmway.com\nkmwx.net\nkmxkh.com\nkmxyj.com\nkmy100.com\nkmyanyou.com\nkmyestar.com\nkmykt.com\nkmyzzx.com\nkmzhihuitong.com\nkmzp.com\nkmzscc.com\nkmzx.com\nkmzx.org\nkn-light.com\nkn-nanjing.com\nkn0sky.com\nkn120.com\nknbmotor.com\nknewbi.com\nknewone.com\nknewsmart.com\nknfeco.com\nknight-un.com\nknightedge.com\nknightli.com\nkninebox.com\nknj-nanjing.com\nknn-nj.com\nknnnd.com\nknockdream.com\nknotesapp.com\nknow-act.com\nknow88.com\nknowapartments.com\nknowfashionstyle.com\nknowhowedu.com\nknowingclouds.com\nknowingcloudvip.com\nknowingyun.com\nknowledgedp.com\nknowledgu.com\nknowlink-assets.com\nknownpcb.com\nknownsec.com\nknowsafe.com\nknowsurface.com\nknowyourself.cc\nknoya.com\nknscq.com\nknsheng.com\nknsyxw.com\nknt-nj.com\nkntc.win\nkntn.tech\nknvps.com\nknxchina.org\nknzlcq.com\nko0.com\nkoagzrxt.com\nkoal.com\nkoalacam.net\nkoalareading.com\nkoalasolo.com\nkoba8.com\nkobeandkdshoes.com\nkobelco-zh.com\nkobox.tv\nkocla.com\nkodcloud.com\nkoderover.com\nkodmp.com\nkoenli.com\nkof-kol.club\nkofficemart.com\nkofuf.com\nkofunion.net\nkogfc.net\nkohergroup.com\nkoiclub.net\nkoikreative.com\nkoinocn.com\nkoioawq.com\nkojihjnklka.asia\nkojtech.com\nkok.plus\nkokophp.com\nkolarmy888.com\nkolcc.com\nkole8.com\nkolemay.com\nkolleracademy.com\nkolrank.com\nkolstore.com\nkolyun.com\nkomect.com\nkometo.com\nkompasszdcom.site\nkonami.cc\nkoncoo.com\nkonekomoe.com\nkonfan.net\nkongai.org\nkongao.com\nkongapi.com\nkongbugushi.com\nkongdao.com\nkongduan.com\nkongfz.com\nkongge.com\nkongjianjia.com\nkongjibusiness.com\nkongjie.com\nkongjieshijie.com\nkongjitang.com\nkongjun.com\nkongkangroup.com\nkonglei.com\nkonglonggu.com\nkongming-inc.com\nkongqinengrebeng.com\nkongquecheng.com\nkongqueyuzd.cc\nkongrong.com\nkongtiao163.com\nkongtiao365.com\nkongwu2022.com\nkongzhi.net\nkongzhiji.com\nkongzhong.com\nkonka.com\nkonkamobile.com\nkonkasnow.com\nkonkek2.com\nkonlan.com\nkonotaku.com\nkooaoo.com\nkoobeemobile.com\nkoobone.com\nkoocdn.com\nkooci.net\nkoodi98.com\nkoofang.com\nkoofun.com\nkoogua.com\nkook.vip\nkookong.com\nkoolcenter.com\nkooldns.com\nkoolearn.com\nkoolproxy.com\nkoolyun.com\nkoomao.com\nkoopass.com\nkoorun.com\nkooshui.com\nkooteam.com\nkoovin.com\nkooxoo.com\nkopebe.com\nkopisee.com\nkopitokein.com\nkopiurerolex.com\nkoplayer.com\nkopperchem.com\nkoreabt.com\nkoreaxin.com\nkoreaxing.com\nkorirl.com\nkormee.com\nkornsweets.com\nkoronsoft.com\nkorosensei.com\nkorqqr1l13.com\nkorrun.com\nkortatb.com\nkortrong.com\nkotaqkew.com\nkotei-info.com\nkotoo.com\nkotoyoshi.com\nkoubei.com\nkoubeikc.com\nkoucai.com\nkouchouwang.net\nkoudai.com\nkoudai8.com\nkoudaigou.net\nkoudaili.com\nkoudaionline.com\nkoudaionline.net\nkoudaitiku.com\nkoudaitong.com\nkoudashijie.com\nkouer.com\nkouer.net\nkougukougu.work\nkouhao8.com\nkoukao.net\nkoukao.org\nkouke5.com\nkoukoutu.com\nkoukuko.com\nkoumakan.cc\nkouqiangba.com\nkoushare.com\nkouss.com\nkouxin.com\nkouxin.net\nkouyijia.com\nkouyu100.com\nkouzi.com\nkovemoto.com\nkowa-dental.com\nkowa103.com\nkowloonhospital.com\nkoyuki.cc\nkoz.moe\nkpblw.com\nkpbs-wowza.streamguys1.com\nkpbyd.com\nkpdhk.com\nkpfans.com\nkpfcw.com\nkphm88.com\nkphwchem.com\nkpjushi.com\nkpkpw.com\nkplanet.vip\nkpmqg.com\nkpoll.net\nkppcsem.com\nkprepublic.com\nkpt5.com\nkptour.com\nkpwcmb.com\nkpxmsbtw.com\nkpyy239.com\nkpyy258.com\nkpzip.com\nkpzip.net\nkpzpw.com\nkpzs.com\nkpzuan.com\nkq-cnmia.com\nkq36.com\nkq39.com\nkq520.net\nkq7.com\nkq81.com\nkq88.com\nkqalevel.com\nkqapi.com\nkqgeo.com\nkqgyl.com\nkqj123.com\nkqjtj.com\nkqjtj.net\nkqlink.com\nkqmmm.com\nkqopg.app\nkqpgstxx.com\nkqqy.com\nkqw.com\nkqwh231122.com\nkqwlxxjs.com\nkqzlzx.com\nkqzp.net\nkr-cell.com\nkr-tencentclb.cloud\nkr-tencentclb.com\nkr-tencentclb.net\nkr-tencentclb.work\nkr.com\nkr126.com\nkra-5at.com\nkrahag.com\nkrak12.com\nkraken30.com\nkrbk.com\nkrd168.com\nkrdrama.com\nkrenzheng.com\nkridol.com\nkrioqxi.com\nkriszhang.com\nkrones-group.com\nkrones.com\nkrpano.tech\nkrqcitie.com\nkrszf.com\nkrtdl.com\nkrxz.com\nkrzb.net\nkrzwymfr.com\nkrzzjn.com\nks-cdn.com\nks-cdn1.com\nks-cdnv6.com\nks-fag.com\nks-live.com\nks-spring.com\nks-terminals.com\nks-wg.com\nks1688.com\nks321.com\nks365.org\nks5.uno\nks51.com\nks5u.com\nksair.com.tw\nksapisrv.com\nksbao.cc\nksbao.com\nksbbs.com\nksbm.com\nksc-test.com\nkscac.com\nkscbigdata.cloud\nkscbpkf.com\nkscdns.com\nkschuangku.com\nkscloudapi.com\nksco.cc\nkscord.com\nksdedu.com\nksdhgy.com\nksdown.com\nksecit.com\nksedt.com\nkseibitools.com\nksense.com\nksfang.com\nksgnr.com\nkshahn.com\nkshaoteng.com\nkshfgf.com\nkshjn.com\nkshot.com\nkshot.net\nkshtxf.com\nkshuwx.com\nkshwtj.com\nksjgs.com\nksjhaoka.com\nksjxgs.com\nkslccb.com\nkslyt.com\nksmend.com\nksmiai.com\nksmingl.com\nksmjmj.com\nksmmed.com\nksmobile.com\nksmobile.net\nksmq5a9kxzmr.com\nksn-cinfo.geoksn.kaspersky.com\nksn-crypto-wifiplus.geoksn.kaspersky.com\nksn-dc1-cert.geoksn.kaspersky.com\nksn-dc1-file.geoksn.kaspersky.com\nksn-dc1.geoksn.kaspersky.com\nksn-file.geoksn.kaspersky.com\nksn-info.geoksn.kaspersky.com\nksn-kas.geoksn.kaspersky.com\nksn-mdr.geoksn.kaspersky.com\nksn-tcert.geoksn.kaspersky.com\nksn-url.geoksn.kaspersky.com\nksn-verdict.geoksn.kaspersky.com\nksndsa.com\nksnows.com\nksoapp.com\nksokay.com\nksops.com\nksord.com\nksosoft.com\nkspays.com\nkspeeder.com\nkspkg.com\nksrc001.com\nksren.com\nksrenfan.com\nksria.com\nksrmtzx.com\nksrmyy.org\nksruanjian.com\nkss4.com\nkssip.msi.com\nkssjkj.com\nksslxh.com\nkst-cn.com\nkst100.com\nkst365.com\nkstao.com\nkstengcai.com\nkstnjscl.com\nkstore.space\nkstore.vip\nkstv.com\nksupdate.com\nksust.com\nkswcd.com\nkswxjnjs.com\nksx88.com\nksxfgc.com\nksxianda.com\nksydns.com\nksydx.com\nksyiqiwan.com\nksyll.com\nksyna.com\nksyun.com\nksyun.net\nksyunad.com\nksyuncdn-k1.com\nksyuncdn-k2.com\nksyuncdn.com\nksyuncdnv6.com\nksyuncs.com\nksyungslb.com\nksyungslb2.com\nksyunv5.com\nksyunv6.com\nksyunv7.com\nksyunwaf.com\nksyxmc.com\nkszhuanjia.com\nkszlzz.com\nkszpw.com\nkszxzsxh.com\nkt007.com\nkt10000.com\nkt286.com\nkt40.com\nkt5u.com\nktallong.com\nktang1.com\nktazg.com\nktbiao.com\nktc-med.com\nktcomposite.com\nktctjt.com\nktcupdate.com\nkting.info\nktkt.com\nktlshu.vip\nktlstbg.com\nktmap.com\nktmv.com\nktmwan.net\nktovztie.com\nktplay.com\nktq8e0zm.work\nktrcn.com\nktrlight.com\nktstny.com\nktswjt.com\nktt-automation.com\nktu56.com\nktuner.store\nktv.com\nktvc8.com\nktvdaren.com\nktvme.com\nktvsky.com\nktwap.net\nktxuexi.com\nktyunlianjie.com\nku25.com\nku33a.net\nku6.net\nku6cdn.com\nku6img.com\nku6vms.com\nku82.com\nku90.com\nku968.com\nku987.com\nkua365.com\nkuaaa.com\nkuabaobao.com\nkuadu.com\nkuafuai.net\nkuai-fei.com\nkuai-ying.com\nkuai.ma\nkuai65.com\nkuai666aa8e43gomqhzeg.com\nkuai666bj7tu65rkdz82.com\nkuai666bjeve6ks43qyw4vc8.com\nkuai666bjs3gsymi6v4h5pz.com\nkuai666e9rqs5wumk7at3.com\nkuai666gki3osg54rx7a.com\nkuai666gkq3semv1r34.com\nkuai666i4rmp7c5i16hb.com\nkuai666kysktrxmwici27.com\nkuai666m6vgmorxw77vb5.com\nkuai666ogv754urmpb4.com\nkuai666trqtauks5ht6x.com\nkuai666vs5aq9o3ytdgp.com\nkuai7.com\nkuai8.com\nkuaiads.com\nkuaiapps.com\nkuaibaobei.com\nkuaibiao2000.com\nkuaicad.com\nkuaicha365.com\nkuaicha888.com\nkuaichala.com\nkuaichale.com\nkuaidadi.com\nkuaidaili.com\nkuaidi.com\nkuaidi100.com\nkuaidi321.com\nkuaidihe.com\nkuaidihelp.com\nkuaidihome.com\nkuaidilab.com\nkuaidim.com\nkuaidizs.com\nkuaiduizuoye.com\nkuaiduwen.com\nkuaiex.com\nkuaifaka.com\nkuaifaka.net\nkuaifan.shop\nkuaifawu.com\nkuaifeng.com\nkuaifuinfo.com\nkuaigames.com\nkuaigeng.com\nkuaigou.co\nkuaiguohui.com\nkuaih5.com\nkuaihaodai.com\nkuaihecaishui.com\nkuaihou.com\nkuaihuoyun.com\nkuaihz.com\nkuaiji.com\nkuaiji.so\nkuaiji521.com\nkuaiji66.com\nkuaijianji.com\nkuaijiepaotui.com\nkuaijilunwen.com\nkuaijinniu.com\nkuaijipeixunlg.com\nkuaijishizi.com\nkuaijisishu.com\nkuaijitong.com\nkuaijizheng365.com\nkuaikan.ink\nkuaikanad.com\nkuaikanmanhua.com\nkuaikao.com\nkuaikaoti.com\nkuaikuaicloud.com\nkuaila.com\nkuailails.com\nkuailaiwz.com\nkuaile-u.com\nkuaile8.com\nkuaile800.com\nkuailedo.com\nkuailekaishi.com\nkuailelunwen.com\nkuailepipixia.com\nkuailetongyao.com\nkuailexs.com\nkuailexue.com\nkuailezu.com\nkuailiyu.com\nkuailiyu.net\nkuailon.com\nkuailvzaixian.com\nkuaimai.com\nkuaimi.com\nkuaimi.net\nkuaiming.com\nkuaipandata.com\nkuaipao.run\nkuaipao8.com\nkuaipianer.com\nkuaipin.work\nkuaipiyun.com\nkuaipng.com\nkuaiqi.net\nkuaiqikan.com\nkuaiqin.com\nkuaiqushuiyin.com\nkuairen88.com\nkuaishangkf.com\nkuaishebao.com\nkuaishiedu.com\nkuaishou-gz.com\nkuaishou.com\nkuaishouapp.com\nkuaishouapp.net\nkuaishouapps.com\nkuaishouba.com\nkuaishougroup.com\nkuaishoupay.com\nkuaishuru.net\nkuaisu.com\nkuaisushu-cnd.com\nkuaisuyun.com\nkuaitijian.com\nkuaitouad.com\nkuaitu.cc\nkuaitu666.com\nkuaitui365.com\nkuaiwan.com\nkuaiwenyun.com\nkuaixiazai.com\nkuaixue.com\nkuaiyan.com\nkuaiyankanshu.org\nkuaiyiad.com\nkuaiyilicai.com\nkuaiyingxiao88.com\nkuaiyingyong.vip\nkuaiyizu.net\nkuaiyong.com\nkuaiyoujia.com\nkuaiyouxi.com\nkuaiyuepu.com\nkuaiyugo.com\nkuaiyunds.com\nkuaizhan.com\nkuaizhang.com\nkuaizhaogong.com\nkuaizhe.com\nkuaizhihui.com\nkuaizhou123.com\nkuaizi.co\nkuaizitech.net\nkuaizupu.com\nkuaizy.com\nkuajing.com\nkuajing.hk\nkuajing84.com\nkuajingketang.cc\nkuajingmaihuo.com\nkuajingnet.com\nkuajingvs.com\nkuajingx.com\nkuajingyan.com\nkuajingyang.com\nkuajingzhushou.com\nkuajinzhifu.com\nkuakao.com\nkuakao.net\nkuake8.com\nkuaming.com\nkuandaige.com\nkuanfans.com\nkuanff.com\nkuanfutong.com\nkuang-chi.com\nkuang-chi.org\nkuangchan.biz\nkuangdacn.com\nkuangdi.com\nkuangjijia.com\nkuangjiwan.com\nkuangmaidz.com\nkuangming.com\nkuangshitech.com\nkuangshun.com\nkuangxiangit.com\nkuangyeyuan.com\nkuangyi.com\nkuangyuantrade.com\nkuanhuacheng.com\nkuanye.net\nkuark.com\nkuashou.com\nkuayuegroup.com\nkubercloud.com\nkubesre.xyz\nkubey.cc\nkubikeji.com\nkuboluo.com\nkuche.com\nkuchechina.com\nkuchuan.com\nkucoin-in.work\nkucunguanli.online\nkudapp.com\nkudianvip.com\nkudiaoyu.com\nkudingyu.com\nkudou.org\nkuems.com\nkufangwuyou.com\nkufaxian.com\nkufei.com\nkuge.cc\nkugoo.com\nkugou.com\nkugou.la\nkugou.net\nkugouaudio.com\nkugouipv6.com\nkugoukid.com\nkugouliveshow.com\nkugouringtone.com\nkugousenior.com\nkugoustore.com\nkugouvoice.com\nkugouyouth.com\nkuguanyi.com\nkugz.com\nkuhao360.com\nkuhii.com\nkuhimalayandp.com\nkuicc.com\nkuigkj.com\nkuihe.com\nkuihuakeji.com\nkuihuayaoye.com\nkuihuo.com\nkuike.ltd\nkuiniuca.com\nkuishiba.com\nkujiale.com\nkujiang.com\nkujiang.net\nkuka-xj.com\nkuka001.com\nkukagroup.com\nkukahome.com\nkukankeji.com\nkukasofa.com\nkuke.com\nkuke99.com\nkukecloud.com\nkukseo.com\nkuku123.com\nkukuda.net\nkukulv.com\nkukupig.com\nkukushouhou.com\nkukushow.com\nkukushu.com\nkukuspeak.com\nkukuw.com\nkukuxiu.com\nkuledushu.com\nkuleiman.com\nkulekeji.com\nkulemi.com\nkulengvps.com\nkuletco.com\nkuli.ren\nkuliwang.net\nkuman.com\nkumanju.com\nkumao.vip\nkumaoyun.com\nkumeiwp.com\nkumhosunny.com\nkumi.com\nkumiao.com\nkumiao.tv\nkumiao.vip\nkumifeng.com\nkun-pharm.com\nkun66.xyz\nkunchuang.com\nkunduo.com\nkungfucloud.com\nkungfuenglish.com\nkunguankeji.com\nkunguanyx.net\nkunjuke.com\nkunkkawu.com\nkunkundev.com\nkunkunyu.com\nkunlexf.com\nkunlunaq.com\nkunlunar.com\nkunlunca.com\nkunluncan.com\nkunlunce.com\nkunlundns.com\nkunlunea.com\nkunlungem.com\nkunlunger.com\nkunlungr.com\nkunlunhuf.com\nkunlunjk.com\nkunlunjue.com\nkunlunjyk.com\nkunlunle.com\nkunlunli.com\nkunlunno.com\nkunlunpi.com\nkunlunra.com\nkunlunsa.com\nkunlunsc.com\nkunlunsl.com\nkunlunso.com\nkunlunta.com\nkunlunvi.com\nkunlunwe.com\nkunlunxin.com\nkunlunyb.com\nkunmingbc.com\nkunmingguolv.net\nkunmingkanghui.com\nkunpengkg.com\nkunpengtn.com\nkunpo.cc\nkunruijs.com\nkunshandx.com\nkunst-x.com\nkuntaihotel.com\nkuntin.com\nkunyamedical.com\nkuo-yi.com\nkuobuy.com\nkuocaicdn.com\nkuocaidns.com\nkuocaiyun.com\nkuoo8.com\nkuosheng.com\nkuosheng.net\nkuotu.com\nkuozang.com\nkuozhan.net\nkupaisky.com\nkupan.cc\nkupao.com\nkuqin.com\nkuraboshanghai.com\nkureader.com\nkurobbs.com\nkurogame-service.com\nkurogame-service.xyz\nkurogame.com\nkurogame.net\nkurogame.xyz\nkurogames-ads.com\nkurogames-global.com\nkurogames.com\nkurokingdom.com\nkuroko.info\nkurtizanki-spb.com\nkurz-sh.com\nkusdk.com\nkusen888.com\nkushe.net\nkushouwang.net\nkushuzw.com\nkusnc17.com\nkuso.xyz\nkusouji.com\nkut-hls.streamguys1.com\nkut3974vc.com\nkutianxia.com\nkutianxia.net\nkutinai.com\nkutj.com\nkutongji.com\nkutuan.com\nkuuke.com\nkuvun.com\nkuwan8.com\nkuwanapp.com\nkuwanbang.com\nkuwanjitar.com\nkuwen.net\nkuwuu.com\nkuwwz.com\nkuxi100.com\nkuxiaoji.com\nkuxiaomiao.com\nkuxiaomiao.net\nkuxiaoshuo.com\nkuxiaozhu.com\nkuxiuktv.com\nkuxueedu.com\nkuy8.com\nkuyh.com\nkuyibu.com\nkuyin123.com\nkuyinxiu.com\nkuyinxiuxiu.com\nkuyinyun.com\nkuyiso.com\nkuyiyun.com\nkuyoo.com\nkuyouyun.com\nkuyumall.com\nkuyunbo.club\nkuzhange.com\nkuzhazha.com\nkuzhengame.com\nkuzu.com\nkv-kva.com\nkv6om4zs5i47.com\nkvamerfx.com\nkvenjoy.com\nkviso.com\nkvogues.com\nkvov.com\nkvps85.com\nkvrmicit.com\nkw007.com\nkwai-group.com\nkwai-pro.com\nkwai.com\nkwai.net\nkwai.xyz\nkwai666.com\nkwaiadapp.com\nkwaiads.com\nkwaibusiness.com\nkwaicdn.com\nkwaicdnx.com\nkwaie65eu4gvs1943.com\nkwaiekow98icxsp7fz.com\nkwaiesovc9xgzfcmt.com\nkwaigobuy.com\nkwaigroup.com\nkwailai.com\nkwailala.com\nkwailbs.com\nkwailine.com\nkwailocallife.com\nkwailocation.com\nkwaim.com\nkwairga8upiycbiv.com\nkwairia4qs5e76v52z.com\nkwairpoewaum3s9z41.com\nkwairr9aw56vso581r.com\nkwairtc.com\nkwaisczway7r4tz7m8.com\nkwaiselfcdn.com\nkwaishop.com\nkwaishouapp.com\nkwaishouapp.net\nkwaitalk.com\nkwaitv.com\nkwaiww7t3qi8x217.com\nkwaixiaodian.com\nkwaiying.com\nkwaiymx64war5a7f.com\nkwaizt.com\nkwangfeng.com\nkwggroupholdings.com\nkwicdn.com\nkwimgs.com\nkwinbon.com\nkwise-log.com\nkwkf.com\nkwmu-flash.streamguys1.com\nkwniu.com\nkwong-tech.com\nkws123.com\nkwt56.com\nkwtgs.com\nkwtzn.com\nkwudor.com\nkwwblcj.com\nkwx.gd\nkwxcj.com\nkwxjh.net\nkwxpobrw.com\nkx-turbo.com\nkx001.com\nkx139.com\nkx1978.com\nkx1d.com\nkx778.com\nkx7p.com\nkxapps.com\nkxb100.com\nkxbox.com\nkxccjjt.com\nkxceping.com\nkxcq.com\nkxdaili.com\nkxdao.com\nkxdao.org\nkxdpm.com\nkxdw.com\nkxiaoshuo77.com\nkxinyk.com\nkxji.com\nkxjlzx.com\nkxjsys.com\nkxkzrcke.com\nkxl100.com\nkxlc.com\nkxll.com\nkxload.com\nkxmas.com\nkxmrg.com\nkxoalq.com\nkxow.com\nkxparking.com\nkxphy.com\nkxq520.com\nkxqo2ev.com\nkxscience.com\nkxstykrgx8z3.com\nkxt.com\nkxtjt.com\nkxtoo.com\nkxtui.com\nkxtwz.com\nkxue.com\nkxwell.com\nkxx2.com\nkxxsc.com\nkxxxl.com\nkxyyf.com\nky-express.com\nky.cc\nky.live\nky393834.com\nky5yx.com\nky6yx.com\nky7yx.com\nky958.com\nkybapp.com\nkybapp.net\nkybcrm.com\nkybimg.com\nkyboye.com\nkybyun.com\nkych5.com\nkydbp.com\nkydev.net\nkydl308015.vip\nkydl308029.vip\nkydzfl.com\nkye-erp.com\nkye.vip\nkyec.cc\nkyedu.cc\nkyemall.com\nkyfey.com\nkygroup.ltd\nkygso.com\nkyhtech.com\nkyhyxy.com\nkyj168.com\nkyjlhz.com\nkyjxy.com\nkyk.cc\nkykjgroup.com\nkylc.com\nkyleduo.com\nkyligence.io\nkylin-os.com\nkylinlot.com\nkylinmobi.com\nkylinos.com\nkylinpet.com\nkylpharm.com\nkymjs.com\nkyo.hk\nkyoceraconnect.com\nkyppt.com\nkyrcw.com\nkysjhx.com\nkyslb.com\nkysnxt.com\nkysygs.com\nkytijian.com\nkyubwsx1g5.com\nkyuedu.com\nkyv5.com\nkyvipw.org\nkyw4y0s.com\nkywiremesh.com\nkyxdloan.com\nkyxh.com\nkyxsw.org\nkyy6.com\nkyzhpt.com\nkyzs.com\nkyzyj.com\nkz.cc\nkz321.com\nkzcpm.com\nkzgui.com\nkzk1.com\nkzmyhome.com\nkzo.moe\nkzrcw.com\nkzread.com\nkzrqicae.com\nkzryu.xyz\nkztsjj.com\nkzwr.com\nkzwx.net\nkzyzz.com\nl-zb.com\nl.biz\nl069.com\nl178.info\nl1yu.com\nl2cn.com\nl2h.site\nl2t7.cc\nl2z4l.net\nl3gt9.com\nl68.net\nl6qmpykq.work\nl799vk4qe2.com\nl7audiolab.com\nl85r.com\nl99.com\nla-bbs.net\nla-chinata.hk\nla-mo.com\nla-technology.com\nla31.com\nlaawoo.com\nlab-bst.com\nlab-easttitan.com\nlab-rm.com\nlab-z.com\nlabaoxian.com\nlabbang.com\nlabbase.net\nlabbuy.net\nlabel-printing-factory.com\nlabgogo.com\nlabi.com\nlabisart.com\nlabixiao.xin\nlabno3.com\nlabuladong.online\nlabview.help\nlabxing.com\nlabzj.com\nlacaoshi.com\nlacesar.com\nlackeeden.com\nlacngs.com\nlacocrea.com\nladiyoga.com\nladjzs.com\nlady361.com\nlady75.com\nlady8844.com\nladybirdedu.com\nladydaily.com\nladyhua.com\nladyol.com\nladyw.com\nladyw.net\nlaecloud.com\nlaey.net\nlaf.run\nlafaso.com\nlafayettewines.com\nlafy.org\nlafybjy.com\nlagou.com\nlagouevents.com\nlagoujobs.com\nlaguaba.com\nlaguke.com\nlahuashanbx.com\nlahuolaozao.com\nlai-ai.com\nlaianbbs.com\nlaiba.shop\nlaibafu.com\nlaibeiparking.com\nlaibokeji.com\nlaibot.com\nlaichon.com\nlaichou.com\nlaichuanfeng.com\nlaidacai.com\nlaidazi.com\nlaidingba.com\nlaidudu.com\nlaifen.net\nlaifeng.com\nlaifeng.net\nlaifenqi.com\nlaifu.net\nlaigame7.net\nlaigaokao.com\nlaigong.com\nlaihua.com\nlaijiawen.com\nlaijishaofang.com\nlaijuba.com\nlaikan.com\nlaikanxia.com\nlaikanxing.com\nlaikanxs.com\nlaike.net\nlaikeerp.com\nlaiketui.com\nlailaieshop.com\nlailaihui.com\nlailibai.com\nlailin.xyz\nlailinzhihui.com\nlailook.net\nlaima-tech.com\nlaimaidi.com\nlainse.store\nlainzy.net\nlaipei.net\nlaiqi.net\nlaiqm.com\nlaiqukankan.com\nlaiqy.com\nlaird-tek.com\nlaisai.com\nlaishui.info\nlaisizuji.com\nlaisj.com\nlaitelaide.com\nlaituia.com\nlaituijian.net\nlaiwang.com\nlaiwo.com\nlaiwu.net\nlaiwuyizhong.com\nlaixi.com\nlaixiangzuji.com\nlaixindianzi.com\nlaixiukeji.com\nlaixs.com\nlaixueedu.com\nlaixuexi.cc\nlaiyagushi.com\nlaiye.com\nlaiyifen.com\nlaiyincat.com\nlaiyouhui.net\nlaiyouxi.com\nlaiytech.com\nlaiyu.com\nlaizee.com\nlaizhouba.com\nlaizhouba.net\nlaizhoujob.com\nlaizi.net\nlajoson.com\nlakala.com\nlakecn.com\nlakeregionfitness.com\nlakwdian.com\nlalaba.com\nlalaedu.com\nlalavision.com\nlalawaimai.com\nlalkk.com\nlamahui.com\nlamaison-arting.com\nlamall.com\nlambda.hk\nlamborlogistics.com\nlameixs.com\nlamiu.com\nlamost.org\nlamoton.com\nlampbi.com\nlampouomo.com\nlamuba.com\nlamyu.com\nlan-bridge.com\nlan-lin.com\nlan-ning.com\nlan1001.com\nlanall.com\nlanapartments.com\nlanbenjia.com\nlanbing510.info\nlanbinimall.com\nlanbts.com\nlanbula.com\nlancdn.com\nlancecity.net\nlancern.xyz\nlanchenglv.com\nlanchuanhuanbao.com\nlancn.net\nlancome-beauty.com\nlancong.net\nlanconvey.com\nlancunwater.com\nlancygroup.com\nland136.com\nlanda-solenoid.com\nlandai.com\nlandaiwood.com\nlandbond.com\nlandbridge.com\nlandchina.com\nlanded.cc\nlandhonor.com\nlandi.com\nlandian.vip\nlandian.xyz\nlandiannews.com\nlanding-med.com\nlandingbj.com\nlandintheair.com\nlanditrip.com\nlandizs.com\nlandjs.com\nlandmedium.com\nlandong.com\nlandraco.com\nlandray.com\nlandroads.com\nlandscape.vip\nlandscapek.com\nlandspace.com\nlandtu.com\nlandui.com\nlanduicdn.com\nlanduncn.com\nlandunxiaofang.com\nlandwind.com\nlandzestate.com\nlandzg.com\nlandzy.com\nlanecn.com\nlanfanapp.com\nlanfc.com\nlanfcw.com\nlanfeicastle.com\nlanfeitech.com\nlanfeiwine.com\nlanfeng.net\nlanfucai.com\nlanfucaijing.com\nlanfw.com\nlang8.net\nlangan-group.com\nlangao.com\nlangchao.com\nlangchaosh.com\nlangchi.com\nlangduqi.com\nlangemedtech.com\nlangfang.com\nlangfang12345.com\nlangfangfc.com\nlangfly.com\nlanggine.com\nlanghao-medical-platform.com\nlanghuansoft.net\nlangjian.work\nlangkaiwenhua.com\nlangkawipower.com\nlangke.com\nlangke.tv\nlangkoo.com\nlangkun.com\nlanglangjiajiao.com\nlanglangy.com\nlanglib.com\nlanglive.com\nlangmanzg.com\nlangqing.club\nlangren001.com\nlangren8.com\nlangrencard.com\nlangrenclub.com\nlangrensha.net\nlangruiyun.com\nlangsajiasi.com\nlangsong.site\nlangtao.cc\nlangtaojin.com\nlangtongpos.com\nlanguageclass.cc\nlanguang.com\nlanguershiton.com\nlangukeji.com\nlangwei.net\nlangxi.org\nlangxi.xyz\nlangxingys.com\nlangxiyuyou.com\nlangyintech.com\nlangzezs.com\nlanh.love\nlanhanba.net\nlanhao.name\nlanhu.com\nlanhuajituan.com\nlanhuapp.com\nlanhuasoft.com\nlanhuhu.com\nlanhui.com\nlanin.tech\nlanindex.com\nlanjie100.com\nlanjie520.com\nlanjing.vip\nlanjingads.com\nlanjinger.com\nlanjingerp.com\nlanjingfm.com\nlanjingmembrane.com\nlanjings.com\nlanjingtmt.com\nlanjingzf.com\nlankecloud.com\nlankeji.com\nlanlanlife.com\nlanlanwork.com\nlanlinghospital.com\nlanlingtuliao.com\nlanlnk.com\nlanlv.com\nlanmaiedu.com\nlanmao.com\nlanmaokeji.com\nlanmaos.com\nlanmicloud.com\nlanmit.com\nlanmiyun.com\nlanniuh.com\nlanniuyun.com\nlanohotel.com\nlanosso.com\nlanou3g.com\nlanovamedicines.com\nlanpiankeji.com\nlanpuele.com\nlanpv.com\nlanpw.com\nlanpye.com\nlanqb.com\nlanqi.com\nlanqibing.com\nlanqingkeji.com\nlanqiudi.com\nlanrar.com\nlanree.com\nlanreelh.com\nlanrenbijia.com\nlanrenclub.com\nlanrenexcel.com\nlanrenmb.com\nlanrents.com\nlanrentuku.com\nlanrenzhaofang.com\nlanrenzhijia.com\nlanrenzhoumo.com\nlanruitech.com\nlansancn.com\nlanscn.com\nlansedir.com\nlansedongli.com\nlanshan.com\nlanshanae.com\nlanshanweb.com\nlanshauk.com\nlanshenniao.com\nlanshizi.com\nlanshou.net\nlansors.com\nlansscl.com\nlansun-pumps.com\nlansurcn.com\nlantiangufen.com\nlantianyu.net\nlantinglou.com\nlantumap.com\nlantushiji.com\nlanuss.com\nlanvote.com\nlanwa.net\nlanwei.org\nlanwoncloudfilm.com\nlanwuzhe.com\nlanxinbase.com\nlanxincn.com\nlanxincomputing.com\nlanxing123.com\nlanxiniu.com\nlanxiongsports.com\nlanxixiaowu.com\nlanxum.com\nlanyaa.com\nlanying.site\nlanyingwang.com\nlanyu.net\nlanyue.com\nlanyun.net\nlanyunbrand.com\nlanyunbusiness.com\nlanyuncloud.com\nlanyuncms.com\nlanyunone.com\nlanyusf.com\nlanzchina.com\nlanzhouvw.com\nlanzhuwh.com\nlanzn.com\nlanzog.com\nlanzong6.com\nlanzou.com\nlanzoub.com\nlanzouc.com\nlanzoue.com\nlanzouf.com\nlanzoug.com\nlanzouh.com\nlanzoui.com\nlanzouj.com\nlanzouk.com\nlanzoul.com\nlanzoum.com\nlanzouo.com\nlanzoup.com\nlanzouq.com\nlanzous.com\nlanzout.com\nlanzouu.com\nlanzouv.com\nlanzouw.com\nlanzoux.com\nlanzouy.com\nlanzov.com\nlanzun.net\nlanzv.com\nlao.si\nlaobaicai.net\nlaobaigan-hs.com\nlaoban100.com\nlaobandq.com\nlaobanfa.com\nlaobangban.com\nlaobanmail.com\nlaobi.icu\nlaobinggun.com\nlaobingmi.com\nlaobuxie.com\nlaocen.com\nlaodao.cc\nlaodaoyun.com\nlaodong.me\nlaodong66.com\nlaodongfa.com\nlaoduo.net\nlaoduzhe.com\nlaoevisa.gov.la\nlaofengwei.com\nlaofu.online\nlaofuzhou.net\nlaoge.xyz\nlaogongshuo.com\nlaogu.cc\nlaogu.com\nlaohaoren.com\nlaohu.com\nlaohu8.com\nlaohuabao.com\nlaohuangli.net\nlaohucaijing.com\nlaohuyun.com\nlaojiuxitong.com\nlaojuhui.com\nlaoke.com\nlaolai.com\nlaolaishou.com\nlaolaomiyou.com\nlaoliang.net\nlaoliboke.com\nlaolieren.com\nlaolieren.shop\nlaoliuceping.com\nlaoma.cc\nlaomaoniu.com\nlaomaotao.org\nlaomaotaopan.com\nlaomatou.com\nlaomo.me\nlaomoe.com\nlaomu.net\nlaonanren.cc\nlaonian100.com\nlaoniushuju.com\nlaopao.org\nlaoqiange.club\nlaoqianzhuang.com\nlaoren.com\nlaosiji.com\nlaosunit.com\nlaotiaomao.com\nlaowalens.com\nlaowuxx.com\nlaoxiangji.com\nlaoxianhui.com\nlaoxiezi.com\nlaoxuean.com\nlaoxuehost.com\nlaoxuehost.net\nlaoxuezhuji.com\nlaoy.net\nlaoyancheng.com\nlaoyaoba.com\nlaoyi0773.com\nlaoyoujiaju.com\nlaoyouyun.com\nlaoyouzhibo.com\nlaoyuanji.com\nlaoyuegou.com\nlaoyuge.com\nlaozhaopian5.com\nlaozicloud.com\nlaozu.com\nlaozuo.org\nlapc.cc\nlapin365.com\nlaplace-semi.com\nlapostea.cfd\nlapulace.com\nlaravel-admin.org\nlaravelacademy.org\nlarenla.com\nlarge.net\nlark-passport-qa-sg.net\nlarkapp.com\nlarkcloud.com\nlarkcloud.net\nlarkfn.com\nlarkoffice.com\nlarkofficeapp-boe.com\nlarkofficeapp-pre.com\nlarkofficeapp.com\nlarkofficeboe.com\nlarkofficecdn.com\nlarkofficeimg.com\nlarkofficepkg.com\nlarkofficepre.com\nlarkroad.com\nlarksuite.com\nlarksuitecdn.com\nlarksuiteimg-boe.com\nlarksuiteimg-pre.com\nlarkworld.com\nlarmace.com\nlarryms.com\nlarscheng.com\nlarsonlimited.com\nlaruence.com\nlasashengdi.com\nlaschina.org\nlascn.net\nlaserfair.com\nlaserjg.com\nlashou.com\nlasji.net\nlasmasas.com\nlast2win.com\nlastdream.net\nlastline.tech\nlategege.com\nlatepost.com\nlatexeasy.com\nlatexlive.com\nlatexstudio.net\nlatin100.com\nlatinhui.com\nlatitudeda.com\nlattebank.com\nlattecake.com\nlattefinance.com\nlattice.vip\nlaungee.com\nlaurelfilms.com\nlauyoo.com\nlavago.com\nlavandehotels.com\nlavapm.com\nlavaradio.com\nlavdrzv.xyz\nlaw-lib.com\nlaw-star.com\nlaw-wei.com\nlaw01.net\nlaw6888.com\nlawasst.com\nlawaxi.net\nlawbang.com\nlawbridge.org\nlawbus.net\nlawen.org\nlawen2.org\nlawh.fun\nlawinfochina.com\nlawipcompass.com\nlawke.com\nlawlawing.com\nlawlh1688.com\nlawlingyun.com\nlawnewscn.com\nlawparks.com\nlawrencetsui.com\nlawsdata.com\nlawtimeimg.com\nlawugu.com\nlawxin.com\nlawxp.com\nlawyee.com\nlawyee.net\nlawyee.org\nlawyer186.com\nlawyerbridge.com\nlawyerchina.org\nlawyermr.com\nlawyerpass.com\nlawyershanghai.net\nlax-pro.com\nlaxarq.com\nlaxmok.com\nlayaair.com\nlayabox.com\nlayinfo.com\nlayleen.com\nlaymauchina.com\nlayoutad.com\nlaysky.com\nlayui.com\nlayuicdn.com\nlayz.net\nlazada.co.id\nlazada.co.th\nlazada.com\nlazada.com.my\nlazada.com.ph\nlazada.sg\nlazada.vn\nlazcdn.com\nlaze.cc\nlazyaudio.com\nlazybios.com\nlazycat.cloud\nlazycatmicroserver.com\nlazycomposer.com\nlazydim.com\nlazyer.net\nlazymap.com\nlazyren.com\nlazystones.com\nlb-yz.com\nlb.streaming.sk\nlb0398.com\nlb5.com\nlb54hon504ke.com\nlbbb.cc\nlbbee.com\nlbbniu.com\nlbctjt.com\nlbctrl.com\nlbd-group.com\nlbd99.com\nlbddd.com\nlbdj.com\nlbedu.com\nlbesec.com\nlbexps.com\nlbf123.com\nlbgold.com\nlbgoo.com\nlbgttc.com\nlbhdbl.com\nlbhgle.com\nlbinin.com\nlbjljc.com\nlbjn.cc\nlbjsfz.com\nlbjtjt.com\nlbkaiguan.com\nlbkrs.com\nlbmobi.com\nlbrencai.com\nlbsdermyy.com\nlbsdmy.com\nlbsrmyy.com\nlbswjt.com\nlbszx.com\nlbtek.com\nlbtp.com\nlbu.cc\nlbv1.com\nlbwbw.com\nlbx777.com\nlbx777.net\nlbxcn.com\nlbxcrmyy.com\nlbxdrugs.com\nlbxdyfgx.com\nlbxjkyf.com\nlbycwx.com\nlbyeyaji.com\nlbyq.com\nlbysgz.com\nlbzuo.com\nlc-cn-e1-shared.com\nlc-cn-n1-ayaqc.com\nlc-cn-n1-npxfk.com\nlc-cn-n1-shared.com\nlc-cn-n1-thovg.com\nlc-led.net\nlc-news.com\nlc-rc.com\nlc044.love\nlc1001.com\nlc123.net\nlc1618.com\nlc365.net\nlc787.com\nlcang.com\nlcatgame.com\nlcayun.com\nlcbdf.net\nlcboai.com\nlcbtv.com\nlccareer.com\nlccdn.net\nlcchem.com\nlcchgg.com\nlccmw.com\nlccyy.com\nlccz.com\nlcddjm.com\nlcdhome.net\nlcdtz.com\nlcdushi.com\nlcdwiki.com\nlcdzsww.com\nlcenn.com\nlcfby.com\nlcfcw.com\nlcfgjs.com\nlcfile.com\nlcftech.com\nlcfw.co\nlcgdbzz.org\nlcgjcj.com\nlcgod.com\nlchdf.work\nlchfunv.xyz\nlchot.com\nlchzzs.com\nlcisb.com\nlciuyou.com\nlcjh.com\nlcjrfg.com\nlcjxj.com\nlcjyg.com\nlckeshun.com\nlckfb.com\nlckiss.com\nlcloudcdn.com\nlcmack.com\nlcmhbl.com\nlcmpn.com\nlcnichia.com\nlcofjp.com\nlcofo.com\nlcoss.com\nlcouncil.com\nlcpdu.com\nlcpumps.com\nlcqixing.com\nlcqjsjxxx.com\nlcqwdz.com\nlcrc.ltd\nlcrcbank.com\nlcsepu.com\nlcsgxjt.com\nlcsrmyy.com\nlcsrw.com\nlcsssg.com\nlcsyzp.com\nlctech-inc.com\nlctsggzz.com\nlcux.net\nlcwl.net\nlcxtgs.com\nlcxwfc.com\nlcxzyy.com\nlcycgg.com\nlcyff.com\nlcyhdl.com\nlcyidc.com\nlcyinsu.com\nlcykgg.com\nlcyp.net\nlcyrny.com\nlcysc.com\nlcywhx.com\nlcyyfj.com\nlcyzh.com\nlczbgc.com\nlczm.com\nlczq.com\nlczyjsxx.com\nlczyun.com\nlczyy.com\nld-pd.com\nld-powder.com\nld0766.com\nld12366.com\nld173.com\nld246.com\nldaq2005.com\nldb.cc\nldbj.com\nldbmcs.com\nldd.me\nlddengine.com\nlddgo.net\nldfdcw.com\nldgjj.com\nldgslb.com\nldhrd.com\nldhy.click\nldj-edujy.com\nldjt-china.com\nldkftz.com\nldkj-zs.com\nldkqyy.com\nldmap.net\nldmnq.com\nldngj.shop\nldoooo.com\nldqxn.com\nldrcw.com\nldseals.com\nldshijie.com\nldshj.com\nldsink.com\nldstark.com\nldtdn.com\nldtec.com\nldtech168.com\nldteq.com\nldwxiao.com\nldxiang.com\nldycdn.com\nldydh.com\nldygo.com\nldyz365.com\nldzcgs.com\nldzxyy.com\nle-feng.com\nle-wan.com\nle.com\nle365.cc\nle4.com\nle4ker.me\nle5le.com\nle8.com\nle855.com\nle890.com\nleacol.com\nleadada.com\nleadal.com\nleadal.net\nleadamc.com\nleadclimb.org\nleadcoretech.com\nleadding.com\nleaddo.com\nleader-e.com\nleader609.com\nleader755.com\nleaderhero.com\nleaderlawyer.com\nleadernano.com\nleaderobot.com\nleadervc.com\nleadge.com\nleading-chem.com\nleadingpharm.com\nleadintelligent.com\nleadlan.com\nleadleo.com\nleadmanbio.com\nleadmap.net\nleadmedpharm.com\nleadmicro.com\nleadmoad.com\nleado-pharma.com\nleadong.com\nleadrd.com\nleadrive.com\nleadshiptech.com\nleadstong.com\nleadvc.com\nleadvsion.com\nleadway-china.com\nleadwaytk.com\nleadyo.com\nleadzees.com\nleaferjs.com\nleaforbook.com\nleaftools.net\nleafword.com\nleagcard.com\nleagpoint.com\nleagsoft.com\nleaguesun.com\nleakeyun.com\nlean.ren\nleangoo.com\nleanote.com\nleansoftx.com\nleanwind.com\nleanyon.com\nleap-pc.com\nleapahead.vip\nleapfive.com\nleaping.games\nleapmie.com\nleapmmw.com\nleapmotor.com\nlearn-quantum.com\nlearn.microsoft.com\nlearndiary.com\nlearnfuture.com\nlearningsj.com\nlearnku.com\nlearsun.com\nleatherhr.com\nleautolink.com\nleavescn.com\nleawin.com\nleayin.com\nleb-china.com\nlebanban.com\nlebang.com\nlebang.net\nlebi2.com\nlebilp.com\nlebinwl.com\nlebocode.com\nlebome.com\nlebopark.com\nlebosky.com\nleboweb.com\nlecai.com\nlecai08.com\nlecake.com\nlechain.com\nlechange.com\nlechangxia.cc\nleche.com\nlechebang.com\nlecheng18.com\nlechengdz.com\nlechengyunfu.com\nlechinepay.com\nlechuangzhe.com\nlecloud.com\nlecloudapi.com\nlecloudapis.com\nlecoinfrancais.org\nlecomposites.com\nlecong56.com\nleconiot.com\nlecoo.com\nlecreperoyaloak.com\nlecu8.com\nlecuntao.com\nled-zulin.com\nled661.com\nledanji.com\nledcax.com\nledchina-sh.com\nledctl.com\nlede.com\nledger-phrase.com\nledguhon.com\nledhyzm.com\nledianyun.com\nlediaocha.com\nledmary.com\nledo.com\nledouwan.com\nledouya.com\nledsdk.com\nledth.com\nledtoplight.net\nledu.com\nledu365.com\nleduimg.com\nlee-tieguo.com\nleeaon.com\nleeco.com\nleefanmr.com\nleehon.com\nleelen.com\nleeleo.vip\nleenzee.com\nleenzhu.com\nleeon.me\nleesdog.space\nleeshen.net\nleesoar.com\nleesou.com\nleetcode-cn.com\nleetcodechina.com\nleetro.com\nleeuu.com\nleevol.com\nleevy.net\nleewiart.com\nlefang365.com\nlefanglj.com\nlefeng.com\nleffercode.com\nleftfm.com\nleftlady.com\nleftshadow.com\nleftso.com\nlefu8.com\nlefuzuwu.com\nlegalsiri.com\nlegend-si.com\nlegendsec.com\nlegendsemi.com\nlegion.com.hk\nlegou456.com\nlegowechat.com\nlegu.cc\nlegu168.com\nleguyu.com\nleha.com\nlehaitv.com\nlehe.com\nlehecai.com\nlehibay.com\nlehihi.com\nleho.com\nlehuadisplay.com\nlehuipay.com\nlehuiso.com\nlei001.com\nleiaomold.com\nleibei.cc\nleiboyiqi.com\nleidacj.com\nleidianip.com\nleigod.com\nleigodjsq.com\nleihetg.com\nleihuo.net\nleijue.net\nleijun.com\nleike.cc\nleikeji.com\nleilei3dprinter.com\nleileiluoluo.com\nleilong158.com\nleimengjixie.com\nleimi.com\nleimingtech.com\nleimingtelab.com\nleimudata.com\nleiniao.com\nleiniao365.com\nleining-shield.com\nleiouxiong.com\nleiphone.com\nleishen-lidar.com\nleishencloud.com\nleishenhuyu.com\nleishenlaser.com\nleishouwin.cc\nleisoon.com\nleisu-ty.net\nleisu.com\nleisu123.com\nleisuapi.com\nleisureer.com\nleisurelypanda.com\nleitaibio.com\nleitaigongsi.com\nleiting.com\nleitingcn.com\nleitingjunshi.com\nleitool.com\nleiue.com\nleixiaofeng.net\nleixinbuild.com\nleixue.com\nleiyediaoche.com\nleiyunge.com\nleiyunge.net\nleji.com\nlejiachao.com\nlejian.com\nlejiao.tv\nlejiaolexue.com\nlejiaotech.com\nlejiashu.com\nlejj.com\nleju.com\nlejucaijing.com\nlejunwl.com\nlekan.com\nlekannews.com\nlekazc.com\nlekevr.com\nlekoukou.com\nlektec.com\nlekuya.com\nlelaer.com\nlelai.com\nlele-lezhong.com\nlelecdn.com\nleleda.com\nleledp.com\nlelehuyu.com\nleleju.com\nleleketang.com\nlelelala.net\nlelepyq.com\nleletv.com\nleletv.net\nlelinly.com\nlelongpp.com\nlemai.com\nlemaker.com\nlemall.com\nlemedu.com\nlemeitu.com\nlemeng.center\nlemengcloud.com\nlemengfun.com\nlemicp.com\nlemiwan.com\nlemiyigou.com\nlemo360.com\nlemobar.com\nlemoes.com\nlemon4.club\nlemonban.com\nlemonnovel.com\nlemonpiggy.com\nlemonplus.asia\nlemonsay.com\nlemonttt.com\nlemonvp.com\nlemonyd.com\nlemote.com\nlempstack.com\nlemurbrowser.com\nlen.ink\nlenauth.com\nlenbenelectric.com\nlenciel.com\nlendy520.com\nlenfocus.com\nlengcat.com\nlengdou.net\nlenget.com\nlenglengyu.com\nlengliwh.com\nlenglv.com\nlengshuiji.org\nlengxiaohua.com\nlengxiaohua.net\nlengyankj.com\nlengzzz.com\nleniugame.com\nleniy.org\nlenmy.com\nlenogo.com\nlenosoft.com\nlenosoft.net\nlenovator.com\nlenovo.com\nlenovo.com.cdn.cloudflare.net\nlenovo.net\nlenovocloudos.com\nlenovoconnect.com\nlenovoeservice.com\nlenovofile.com\nlenovogame.com\nlenovohci.com\nlenovohuishang.com\nlenovoimage.com\nlenovomm.com\nlenovomobile.com\nlenovonetapp.com\nlenovonowgo.com\nlenovopoc.com\nlenovoprinter.com\nlenovoprinter.net\nlenovots.com\nlenovouat.com\nlenovows.com\nlenovozdl.com\nlenschine.com\nlenslifephoto.com\nlensuo.com\nlenwoo.com\nlenzhao.com\nleoao-inc.com\nleoao.com\nleocode.net\nleogd.com\nleolin86.com\nleonblog.net\nleoogo.com\nleopardtale.com\nleopump.com\nleozwang.com\nlepaicm.com\nlepiaoyun.com\nlepidard.com\nleptv.com\nlepumedical.com\nleqi.us\nleqian.com\nleqiaobh.com\nleqiaobhyy.com\nleqiku.com\nleqiuba.com\nleqiuzbc.org\nlequ.com\nlequanip.com\nlequgo.com\nlequji.com\nlequz.com\nlequzh.com\nlercar.com\nlergao.com\nlergle.com\nlerist.dev\nlers168.com\nlers168.net\nlersang.com\nlertao.com\nlerye.com\nlesejie.com\nleshangzs.com\nleshangzx.com\nleshanvc.com\nleshare.work\nleshi123.com\nleshiguang.com\nleshow.com\nleshuatech.com\nleshuazf.com\nleshuwu.com\nlesimao.net\nlesjob.com\nlesjulo.com\nleslie-cheung.com\nlesofn.com\nlesonccl.com\nlesoon.com\nlesou.net\nlespark.us\nlesports.com\nless-bug.com\nless-more.net\nlesscode.work\nlesso.com\nlestcg.com\nletabc.com\nletang666.com\nletaoedu.com\nletaoren.com\nletbonchina.com\nleter.io\nletianbiji.com\nletianshanec.com\nletim-auto.com\nletinet.com\nleting.io\nletoour.com\nletotur.com\nletou8.com\nletoursport.com\nletright.com\nletrychina.com\nlets-study.com\nletschuhai.com\nletsebuy.com\nletsfilm.org\nletsgaga.com\nletsinno.com\nletssepub.com\nletsvisa.com\nlettercloud.net\nletuinet.com\nletuixiaokefu.com\nleturich.org\nletushu.com\nletv.com\nletv8.com\nletvapp.net\nletvcdn.com\nletvcloud.com\nletvimg.com\nletvlb.com\nletvlive.com\nletvstore.com\nletwind.com\nletwx.com\nletyo.com\nleuok.com\nlevc.com\nlevcauto.com\nlevect.com\nlevel8cases.com\nlevelinfinite.com\nlevenx.com\nlewaimai.com\nlewang.ltd\nlewangame.net\nlewawa.com\nlewbin.com\nlewen.la\nlewenba.cc\nlewenlou.la\nlewenn.com\nlewenqu.com\nlewenss.com\nlewenxsw.com\nlewifi.com\nlex.download.prss.microsoft.com\nlexar.com\nlexed.org\nlexiaigame.com\nlexiang-app.com\nlexiang-asset.com\nlexiang-asset.net\nlexiang-ops.com\nlexiangla.com\nlexiangla.net\nlexiangzuji.com\nlexin.com\nlexin001.com\nlexinchina.com\nlexoncloud.net\nlexuat.download.prss.microsoft.com\nlexue-cloud.com\nlexue.com\nlexueying.com\nlexun.com\nlexun.net\nlexuncaishui.com\nlexuntimes.com\nleya920.com\nleyaep.com\nleyan.com\nleyantech.com\nleyaoyao.com\nleyaoyao.org\nleyard.com\nleybc.com\nleyi007.com\nleyifan.com\nleying.com\nleying365.com\nleyingtt.com\nleyishandong.com\nleyixue.com\nleyonb.com\nleyoo.com\nleyoujia.com\nleyu.com\nleyuanhr.com\nleyue100.com\nleyuglobal.com\nleyun001.com\nleyun365.com\nleyuncn.com\nleyungame.com\nleyunge.com\nleyuxyz.com\nleyuz.com\nlezai.com\nlezai.org\nlezhao.com\nlezhi.com\nlezhi99.com\nlezhibo.com\nlezhiot.com\nlezhiyun.com\nlezhuan168.com\nlezhuan365.com\nlezhuanwang.net\nlezhudai.com\nlezhufenqi.com\nlezhun.com\nlezi.com\nlezuan.net\nlezuan11.com\nlezuan9.com\nlezuocai.com\nlf126.net\nlf127.net\nlfan.net\nlfang.com\nlfbxw.com\nlfcharge.com\nlfcmw.com\nlfdjex.com\nlfekaj.help\nlfex.com\nlffloor.com\nlfggzz.com\nlfhacks.com\nlfhospital.net\nlfhygl.com\nlficanton.com\nlfjsly.com\nlfjx88.com\nlfkjgh.com\nlfksqzj.com\nlfmxc.com\nlfppt.com\nlfqysm.com\nlfrczp.com\nlfszk.com\nlftdzd.com\nlfungame.com\nlfwin.com\nlfx20.com\nlfxww.com\nlfywood.com\nlfyx.ink\nlfyzjck.com\nlfzhaopin.com\nlg-lg.com\nlg-pump.com\nlg1024.com\nlg198.com\nlg5.co\nlg5.com\nlgbzj.com\nlgcdz.com\nlgctshanghai.com\nlgcx.com\nlgdisplayproduct.com\nlgdxtech.com\nlgexam.com\nlgfdcw.com\nlgfzgroup.com\nlghd111.com\nlghlncl.com\nlgimg.com\nlgimic.com\nlglmf.com\nlglmf.net\nlgmi.com\nlgo100.com\nlgpic.com\nlgpj.net\nlgpm.com\nlgrcbank.com\nlgshouyou.com\nlgtzkg.com\nlguohe.com\nlgvf.com\nlgwy.net\nlgxly.com\nlgyanglao.com\nlgyszl.com\nlgyudiao.com\nlgyzyy.com\nlgzowo.com\nlgzzu.com\nlh-ep.com\nlh-lx.com\nlh.link\nlh168.net\nlh17.net\nlh36524.com\nlh75.com\nlhasa.icu\nlhbbj.com\nlhbgchina.com\nlhconst.com\nlhcreditevaluation.com\nlhcy168.com\nlhdbgs.com\nlhdeer.com\nlhdown.com\nlhdxz.com\nlhenet.net\nlhey.com\nlhgcxx.com\nlhguomy.xyz\nlhgz.net\nlhh.la\nlhhy.net\nlhihg.com\nlhjdfs.com\nlhjol.com\nlhjws.com\nlhjy.net\nlhjyw.vip\nlhjzlw.com\nlhkaye.com\nlhkgs.com\nlhl.zone\nlhl7.com\nlhmj.com\nlhmp.cc\nlhovoxcx.work\nlhp-cdn-game.online\nlhp-cdn-update.online\nlhpharma.com\nlhratings.com\nlhrbszb.com\nlhs-arts.org\nlhs11.com\nlhs99.com\nlhsdjxy.com\nlhsoso.com\nlhszyxx.com\nlhulan.com\nlhwill.com\nlhwytj.com\nlhxhwl.com\nlhyc3888.com\nlhyiliao.com\nlhytgroup.com\nlhzq.com\nli-ca.com\nli-ning.com\nli-on.com\nli-world.com\nli-yuan.com\nli.auto\nli63.com\nli91.com\nliageren.com\nlian-ou.com\nlianaibiji.com\nlianaixingwei.com\nlianaiyx.com\nlianbei66.com\nlianchuang.com\nlianchuanghj.com\nliancsoft.com\nlianda.fun\nliandaomobi.com\nliandaquan.com\nliande.cc\nlianfawy.com\nlianfengqy.com\nlianfengwh.com\nliang520.com\nliangc.com\nliangchan.net\nliangchanba.com\nliangduapp.com\nliangduiban.com\nlianggao.com\nlianghuadashi.com\nliangjan.com\nliangjiangbashu.com\nliangjianghu.com\nliangjiangroup.com\nliangjiangwuye.com\nliangjihui.com\nliangjiu.shop\nliangka.vip\nliangkun.net\nliangle.com\nlianglimi.com\nlianglunshijie.com\nliangnuo.com\nliangpinbiji.com\nliangqikeji.com\nliangrisheng.com\nliangrunbio.com\nliangshunet.com\nliangtian-tech.com\nlianguowang.com\nliangwanjianshe.com\nliangwei.cc\nliangxinyao.com\nliangyi.com\nliangyi360.com\nliangyiyy.com\nliangyuan.com\nliangzhishu.com\nliangziheikeji.com\nlianhaikeji.com\nlianhanghao.com\nlianhaokeji.com\nlianhejiaju.com\nlianhengkj.com\nlianhengtec.com\nlianhepaimai.com\nlianhuangroup.com\nlianjia.com\nlianjianode.xyz\nlianjianxsw.com\nlianjiasm.com\nlianjie.in\nlianjiezhe.com\nlianjingdq.com\nlianjixia.com\nliankaa.com\nliankebio.com\nliankenet.com\nlianku.xin\nliankuaiche.com\nlianli168.com\nlianlian.com\nlianlianlvyou.com\nlianlianpay-inc.com\nlianlianpay.com\nlianliantao.net\nlianliantaoshop.com\nlianlianz.com\nlianlife.com\nlianliwork.com\nlianluo.com\nlianmeng.la\nlianmeng.link\nlianmeng.work\nlianmenhu.com\nlianmishu.com\nlianni.com\nlianok.com\nlianouyiyuan.com\nlianpingroup.com\nlianpunet.com\nlianqi.net\nlianqigong.com\nliansaipiao.com\nlianshang.com\nlianshijie.com\nlianshun.cc\nliansn.com\nliansuo.com\nliantianhong.com\nliantongcar.com\nliantu.com\nliantuobank.com\nliantuofu.com\nlianty.com\nlianwen.com\nlianwifi.com\nlianwo8.com\nlianwwl.com\nlianxianjia.com\nlianxinapp.com\nlianxinkj.com\nlianyi.com\nlianyins.com\nlianyiwater.com\nlianyuannongye.com\nlianyungangforum.org\nlianzhixiu.com\nlianzhong.com\nlianzhongyun.com\nlianzhoupc.com\nlianzhuli.com\nlianzifang.com\nliao1.com\nliao98.com\nliaobagua.com\nliaocheng.cc\nliaochuo.com\nliaode.com.tw\nliaogu.com\nliaogx.com\nliaoing.com\nliaoji.com\nliaojiu.net\nliaokong.com\nliaoliao.com\nliaoningmoduo.com\nliaoningpharm.com\nliaosam.com\nliaotiantu.com\nliaoworking.com\nliaoxiwenhua.com\nliaoxuefeng.com\nliaoyuanchats.com\nliaoyuanedu.org\nliaozhai.tv\nliauto.com\nlib520.com\nliba.com\nliba88.com\nlibaclub.com\nlibai.com\nlibaidns.com\nlibaishuo.com\nlibao007.com\nlibaopay.com\nlibawall.com\nliberlive-music.com\nlibertynlp.com\nlibforest.com\nlibguides.com\nlibinx.com\nlibiotech.com\nlibisky.com\nliblib.art\nliblib.cloud\nlibmk.com\nlibomarathon.com\nlibreofficechina.org\nlibsou.com\nlibssh.com\nlibsys.net\nlibtop.com\nlibvideo.com\nlic-bcbc.com\nlic-slf-dom.com\nlic-slf-dom.net\nlicai.com\nlicai18.com\nlicaie.com\nlicaigc.com\nlicaike.com\nlicaiker.com\nlicaimofang.com\nlicaishouyi.com\nlicaixu.com\nlicaiyaoye.com\nlicancan.com\nlicaoz.com\nlicat.com\nlicc.tech\nlichangtai.com\nlichangtao.com\nlichangwen.net\nlichee.pro\nlichenglove.com\nlichengwu.net\nlichenjy.com\nlichimedicine.com\nlichiwei.com\nlichong.work\nlichuang.ren\nlicic.net\nlickeji.com\nlickscreen.com\nlicomsh.com\nlicqi.com\nlida100.com\nlidakang.com\nlidamicron.com\nlidar360.com\nlideapower.com\nlidebiotech.com\nlidepower.com\nlidg-fueltank.com\nlidianchizu.com\nlidianren.com\nlidihuo.com\nliding.me\nlidlsalevipeu.shop\nlidodo.com\nlidu6.com\nlidw.com\nlie.icu\nliebao.live\nliebaoh5.com\nliebaoidc.com\nliebaopay.com\nliebiao.com\nliebigwatch.com\nliebo.com\nliechan.com\nliedaoshou.com\nlieguo.com\nlieguozhi.com\nliehunwang.com\nliehuo.net\nliehuosoft.com\nliejin99.com\nlieju.com\nlieketao.com\nlielema.com\nliemingwang.com\nlienew.com\nliepin.com\nliepin8.com\nliepincc.com\nlierda.com\nlierdapark.com\nlierfang.com\nliermusic.com\nliesauer.net\nlieshi.net\nlieshuku.com\nlietou-edm.com\nlietou-static.com\nlietou.com\nlietou007.com\nlietuwang.com\nliewen.cc\nliewen.la\nliexing-ai.com\nliexing.com\nliexiulive.com\nlieyingjt.com\nlieyou.com\nlieyouqi.com\nlieyuncapital.com\nlieyunpro.com\nlieyunwang.com\nliezhe.com\nliezhen166.com\nliezhun.com\nlif8.com\nlifan.com\nlife-2028sport.com\nlifebook.red\nlifediary.shop\nlifeeu.com\nlifefunkingdom.org\nlifegc.com\nlifegreenmedical.com\nlifeng.in\nlifengshoe.com\nlifeofguangzhou.com\nlifesense.com\nlifetimecables.com\nlifetm.com\nlifetmt.com\nlifetmt.net\nlifetmt.org\nlifeup.vip\nlifevc.com\nlifevccdn.com\nlifeweeker.com\nlifeyk.com\nlifeyn.net\nlifezb.com\nliffmp.com\nlifo-fj.com\nlifotronic.com\nlifox.net\nlifrog.com\nlifushop.com\nlifves.com\nlify.vip\nligendpower.com\nligetz.com\nlighos.com\nlight-cos.com\nlight-player.com\nlight3moon.com\nlightalk.com\nlightalk.me\nlightblue.net\nlightbox.games\nlighte-tech.com\nlightgx.com\nlighthg.com\nlighting-china.net\nlightingchina.com\nlightinit.com\nlightky.com\nlightlygame.com\nlightmake.site\nlightonus.com\nlightpassport.com\nlightsaber.com\nlightspeed-dc.com\nlightspeed-lic.com\nlightspeed-og.com\nlightstrade.com\nlightxi.com\nlightyy.com\nligonggong.com\nliguanchina.com\nliguangtaogroup.com\nliguosong.com\nlih-invest.com\nlihang-expo.com\nlihaoshuyuan.com\nliheiat.xyz\nliheng1688.com\nlihengjh.com\nlihetong.com\nlihong.net\nlihongcctv.com\nlihtao.com\nlihua.com\nlihuadonghua.com\nlihuamuye.com\nlihuashouji.com\nlihuasoft.net\nlihui.net\nlihuia.com\nlihun66.com\nliigou.com\nlijiabaijc.com\nlijiabrasstube.com\nlijiajia.com\nlijiajia.net\nlijiangbooks.com\nlijiangcun.com\nlijiangriver.com\nlijiankai.com\nlijiejiaju.com\nlijigang.com\nlijinghua.club\nlijingquan.net\nlijinxincai.com\nlijinzhang.com\nlijishi.com\nlijizhong.com\nlijjj.com\nlikamao.com\nlikangwei.com\nlike.video\nlike996.icu\nlikeaboat2023.com\nlikeacg.com\nlikebuy.com\nlikecha.com\nlikechuxing.com\nlikecs.com\nlikee.video\nlikeface.com\nlikefar.com\nlikefont.com\nlikeji.net\nlikejianzhan.com\nlikelic.com\nlikepoems.com\nlikeshare-tech.com\nlikeshuo.com\nliketm.com\nliketry.com\nliking.site\nlikingfit.com\nlikuli.com\nlikuso.com\nlilacbbs.com\nlilaigroup.com\nlilanz.com\nlili.cc\nliliangji.com\nlilinwei.com\nlilishare.com\nlilisi.com\nlilith.com\nlilithgame.com\nlilithgames.com\nlilvb.com\nlilygo.cc\nlilysamericandiner.com\nlimabaoxian.com\nlimaoqiu.com\nlimebenifit.com\nlimei.org\nlimeiltd.com\nlimian.com\nliminglight.com\nlimingtech.com\nliminjie714.com\nliminwang.com\nlimit-animation.com\nlimless.com\nlimobai.com\nlin-jiang.com\nlinakesi.com\nlinancity.com\nlinaoyiqi.com\nlinban.com\nlinchangyu.com\nlinchuangsy.com\nlincoc.com\nlindapatent.com\nlinde-china.com\nlindmik.com\nlindybag.com\nline-gate.com\nlinearbuyic.com\nlinearmotor.net\nlineartracklight.com\nlinecg.com\nlineget.site\nlinekong.com\nlinelayout.com\nlinestartech.com\nlinewell.com\nlinewow.com\nlinfan.com\nlinfeicloud.com\nlinfen365.com\nlinfeng.tech\nlinfenwater.net\nling-shi.com\nlingangholding.com\nlingangic.com\nlingaoren.com\nlingbao-e.com\nlingboxauto.com\nlingceu.com\nlingd.com\nlingdi.net\nlingdianksw.com\nlingdong.net\nlingdongweilai.com\nlingdongwuliu.com\nlingdu.love\nlingduan-sh.com\nlingduohome.com\nlingduzuji.com\nlingdz.com\nlingfengyun.com\nlingganjia.com\nlinggao.vip\nlinggu.com\nlinghanggroup.com\nlinghit.com\nlinghitai.com\nlinghonggroup.com\nlinghua-logistics.com\nlinghuidzsw.com\nlinghuoai.com\nlingji666.com\nlingjiaocheng.com\nlingjing.com\nlingjiptai.com\nlingjoin.com\nlingjuad.com\nlingjumobile.com\nlingkaba.com\nlingkebang.com\nlingkou.com\nlingkou.xyz\nlingkuyun.com\nlingla.com\nlinglingkaimen.com\nlinglingmo.site\nlinglong.dev\nlinglongart.com\nlinglonglife.com\nlinglongtech.com\nlingmao.tech\nlingmeijie.com\nlingmeng888.com\nlingmovie.com\nlingnanpass.com\nlingo-ace.com\nlingodeer.net\nlingosail.com\nlingostarcdn.com\nlingowhale.com\nlingphone.net\nlingquanb.com\nlingqumall.com\nlingrengame.com\nlingrn.com\nlingruipc.com\nlingruofeng.com\nlingshangkaihua.com\nlingshangmeien.com\nlingshenxing.com\nlingshenxl.com\nlingshi.com\nlingshimiyu.com\nlingshou.com\nlingshoujia.com\nlingshulian.com\nlingshunlab.com\nlingsky.com\nlingsoul.com\nlingti.com\nlingtiao.com\nlingtingmusic.com\nlingtings.com\nlingtong.info\nlingtool.com\nlingtu.com\nlingtuan.com\nlingumob.com\nlinguoguang.com\nlingw.net\nlingwe.com\nlingwh.com\nlingwu66.com\nlingxi360.com\nlingxianfund.com\nlingxicloud.com\nlingxigames.com\nlingxing.com\nlingxingcai.com\nlingxingkj.com\nlingxiuwenlv.com\nlingxmall.com\nlingy.cc\nlingyanghuyu.com\nlingyi.org\nlingyihanhua.com\nlingyiitech.com\nlingyiliebian.com\nlingyinsi.com\nlingyinsi.org\nlingyiwanwu.com\nlingyuan.design\nlingyue-digital.com\nlingyuecloud.com\nlingyuedianzi.com\nlingyuint.com\nlingyun.com\nlingyun.net\nlingyun5.com\nlingyuncw.com\nlingyunip.com\nlingyunquan.com\nlingyuok.com\nlingzhanwenhua.com\nlingzhilab.com\nlingzhitech.com\nlingzhtech.com\nlinhaigroup.com\nlinhaiwangdai.com\nlinhao.net\nlinhuatz.com\nlinhuiba.com\nlining.com\nlining0806.com\nlinjia.me\nlinjieapp.com\nlinjin.net\nlinjunlong.com\nlink-ai.tech\nlink-nemo.com\nlink-trans.com\nlink27.com\nlink2lib.com\nlink2shops.com\nlink3.cc\nlinkadsapi.com\nlinkbook.tech\nlinkbroad.com\nlinkbux.com\nlinkchant.com\nlinkchina.hk\nlinkcubecloud.net\nlinkdesign.tech\nlinkdialy.com\nlinkeabc.com\nlinkease.com\nlinked-f.com\nlinked-reality.com\nlinkedbyx.com\nlinkedhope.com\nlinkedin-event.com\nlinkedkeeper.com\nlinkedme.cc\nlinkedsee.com\nlinker.cc\nlinkernetworks.com\nlinkeye.net\nlinkfinancier.com\nlinkflowtech.com\nlinkfruits.com\nlinkfunny.com\nlinkgou.com\nlinkh5.com\nlinkh5.xyz\nlinkheer.com\nlinkiebuy.com\nlinkingcloud.com\nlinkist.net\nlinknewideas.com\nlinkoing.com\nlinkolder.com\nlinkon.me\nlinkontek.com\nlinkpai.com\nlinkpro.tech\nlinkr.com\nlinkrall-trk.com\nlinkresearcher.com\nlinks-china.com\nlinksdao.com\nlinksfield.net\nlinksgood.com\nlinkshop.com\nlinksoon.net\nlinkstars.com\nlinkstec.com\nlinksunet.com\nlinktech.hk\nlinktom.com\nlinktom.net\nlinktree.vip\nlinktt.com\nlinkunbin.com\nlinkunjc.com\nlinkvfx.com\nlinkwebll.com\nlinli580.com\nlinlikuaipao.com\nlinliyz.com\nlinlongnewmaterials.com\nlinlongyun.com\nlinlongyx.com\nlinmi.cc\nlinmujianghome.com\nlinni.com\nlinnsea.com\nlinnxin.com\nlinnyou.com\nlinovel.net\nlinovelib.com\nlinoya.com\nlinpx.com\nlinqujob.com\nlinqumarathon.com\nlinruanwangluo.com\nlins-bros.com\nlinshang.com\nlinshaoqian.work\nlinshi.cc\nlinshigong.com\nlinshimuye.com\nlinshiyongling.com\nlinsn.com\nlinstitute.net\nlint2.com\nlintai.tech\nlintaicnc.com\nlintcode.com\nlintec-china.com\nlintey.com\nlintongrc.com\nlintonpharm.com\nlintui.com\nlinuo-paradigma.com\nlinuo.com\nlinuopv.com\nlinuoshi.com\nlinuottc.com\nlinux-code.com\nlinux-ren.org\nlinux.zone\nlinux178.com\nlinux265.com\nlinux5.net\nlinuxba.com\nlinuxbaike.com\nlinuxbaodian.com\nlinuxboy.net\nlinuxcool.com\nlinuxde.net\nlinuxdiyf.com\nlinuxdot.net\nlinuxea.com\nlinuxeden.com\nlinuxeye.com\nlinuxgogo.com\nlinuxidc.com\nlinuxidc.net\nlinuxjoy.com\nlinuxmi.com\nlinuxpanda.tech\nlinuxpk.com\nlinuxprobe.com\nlinuxsir.com\nlinuxso.com\nlinuxtone.org\nlinuxyunwei.com\nlinuxyw.com\nlinwushuang.fun\nlinx-info.com\nlinyafeng.com\nlinyang.com\nlinyekexue.net\nlinyi.net\nlinyibus.net\nlinyiren.com\nlinyizhizhiyuan.com\nlinyouquan.net\nlinyufan.com\nlinzhou.store\nlinzhuotech.com\nlinzhuxin.com\nlinzihy.com\nlion1ou.tech\nlionaka.com\nlionit.net\nlionkingsoft.com\nlionmac.com\nlionmobo.com\nlionmobo.net\nlionsgx.com\nlipian.com\nlipiji.com\nlipilianghang.com\nlipin.com\nlipin51.com\nlipind.com\nlipinduihuan.com\nlipro.com\nlipro.net\nlipu.net\nlipuhome.com\nlipush.com\nlipuxixi.com\nliqinet.com\nliqinyi.com\nliquan.com\nliqucn.com\nliquidgoldtatttoo.com\nliquidnetwork.com\nliqun.org\nliqun.vip\nliquncommercialgroup.com\nliqungroup.com\nliqunshop.com\nliqwei.com\nlirenliye.com\nliriansu.com\nliriji.com\nlirui.name\nlis99.com\nlisdn.com\nlisenergy.com\nlisheng.gold\nlishengstone.com\nlishi-test.com\nlishi6.com\nlishi7.com\nlishibk.com\nlishichunqiu.com\nlishicloud.com\nlishiip.com\nlishiming.net\nlishimingren.com\nlishixiaozhi.com\nlishixinzhi.com\nlishizhishi.com\nlishuhang.me\nlishuhao.ltd\nlishui.com\nlishuichayuan.com\nlisigroup.com\nlisihouseware.com\nlisizhang.com\nlisp123.com\nlissgx.com\nlistary.net\nlistarypro.com\nlisteneer.com\nlisteningo.com\nlistenpa.com\nlistentide.com\nlistentoworld.com\nlistenvod.com\nlistno1.com\nlistong.com\nlisure.com\nlisz.me\nlitangkj.com\nlitaow.com\nlitaparking.com\nlitchon.com\nlite-miniprogram-1.com\nlite-miniprogram-5.com\nlitecdncname.com\nlitecoin.ink\nlitecoin.ren\nlitefeel.com\nlitemob.net\nliteng-industry.com\nlitessl.com\nlithomaterial.com\nlithub.cc\nlitian268.com\nlitianchina.com\nliticool.club\nlitilala.site\nlitilala.xyz\nlititop.group\nlitiww.mobi\nlitofu.com\nlitongsupply.com\nlitongtech.com\nlitosim.com\nlitree.com\nlitten.me\nlittle-star.love\nlittle-sun.com\nlittleboy.net\nlittlegeek.work\nlittlehero.xyz\nlittleqiu.net\nlittleroost.net\nlittlesheep.com\nlittlesix.mobi\nlittlesproutsdk.com\nlittleswan.com\nlituo666.com\nliu-he.com\nliu-kevin.com\nliu16.com\nliuar.xin\nliubaocha.com\nliucao.vip\nliuchengguanli.com\nliuchengtu.com\nliuchengtu.net\nliuchenkeji.com\nliuchuo.net\nliudanking.com\nliudaoxiang.com\nliudatxt.com\nliudatxt.org\nliudayadan.com\nliudian6.com\nliudon.com\nliudon.org\nliudu.com\nliufanggroup.com\nliugejava.com\nliugezhou.online\nliugj.com\nliugm.com\nliugong.com\nliugongac.com\nliugongam.com\nliugonggroup.com\nliuguofeng.com\nliuhaolin.com\nliuhubang.com\nliujiagd.com\nliujiajia.me\nliujian666.com\nliujiangblog.com\nliujiaoyidai.com\nliujijun.com\nliujinkai.com\nliujto.com\nliujunworld.com\nliujy.com\nliukai.net\nliukebao.com\nliulan.net\nliulanqi.net\nliulantao.com\nliulian.com\nliulianga.com\nliuliangcanmou.com\nliuliangdada.com\nliulianggo.com\nliuliangguo.com\nliuliangka.pro\nliulianglf.com\nliuliangmima.club\nliuliangmima.vip\nliuliangzu.com\nliulianqi123.com\nliulin.cc\nliulishuo.com\nliulishuo.work\nliulisyb.org\nliuliushe.net\nliulixuexiao.com\nliulj.com\nliulv.net\nliumapp.com\nliumeinet.com\nliuming.work\nliumuzulin.com\nliumx.com\nliunian.info\nliunianbanxia.com\nliunn.com\nliuqh.icu\nliurq.com\nliushen.fun\nliushidong.com\nliushuishiyin.com\nliusibo.com\nliusteel.com\nliusu-kyimm.com\nliusu.me\nliusuping.com\nliuts.com\nliuwamiaoji.com\nliuweihotel.com\nliuwo.com\nliuxianan.com\nliuxianjt.com\nliuxiaoer.com\nliuxiaofan.com\nliuxing.com\nliuxingw.com\nliuxinli.com\nliuxuchao.com\nliuxue.com\nliuxue114.com\nliuxue360.com\nliuxue86.com\nliuxuegang.site\nliuxuehr.com\nliuxuekw.com\nliuxuesmd.com\nliuxuetown.com\nliuxuewind.com\nliuxueyun.com\nliuxx.com\nliuyang.com\nliuyangfcw.com\nliuyangjob.com\nliuyanzhao.com\nliuyifei.cc\nliuyiguo.com\nliuyimin4.com\nliuyixiang.com\nliuyua.xyz\nliuyunflow.com\nliuyunliumeng.com\nliuyuntian.com\nliuzaoqi.com\nliuzhihang.com\nliuzhixiang.com\nliuzhiyugzs.com\nliuzhosoft.com\nliuzhoufushan.com\nliuzhoukaichuang.com\nliuzhourm.com\nliuzhousteel.com\nliuzhuni.com\nliuziyoudu.com\nliuzongyang.com\nliuzy88.com\nlivanauto.com\nlive-350k.streamingfast.net\nlive-echotv.cdnvideo.ru\nlive-flashscore.com\nlive-helps.com\nlive-qiudidai.com\nlive-ssport.com\nlive-voip.com\nlive.hhtv.cc\nlive.hnzzzzzdst.com\nlive.lxzc.net\nlive.ntdimg.com\nlive.sccxtv.com\nlive.sichuanmianning.com\nlive.streamingfast.net\nlive.tvbaoji.com\nlive.ugratv.cdnvideo.ru\nlive.zhihuizq.com\nlive02.rfi.fr\nlive1.jcbctv.com\nlive123.cc\nlive2.asbctv.com\nlive2.ntdimg.com\nlive800.com\nliveanevia.mncnow.id\nliveapp.ink\nlivebong68.com\nlivecdn.fptplay.net\nlivecdnh2.tvanywhere.ae\nlivecdnstatic.com\nlivechina.com\nlivecourse.com\nlivehwc4.com\nliveinau.com\nlivejh.com\nliveme.com\nlivemediav.com\nlivemook.com\nlivenmall.com\nliver-surgery.net\nlivesone.net\nlivesupport24x7.com\nliveuc.net\nliveupdate-cn.msi.com\nlivevideostack.com\nliving.ai\nlivnj.com\nlivotre.com\nliwai.com\nliwanggui.com\nliwanght.com\nliweiauto.com\nliweicar.com\nliweijia.com\nliweijituan.com\nliweiliang.com\nliwenzhou.com\nliwi.cc\nliwinon.com\nliwojx.com\nliwoxiao.com\nliwucheng.com\nliwumaoapp.com\nliwushuo.com\nliwuzhi.art\nlixcx.com\nlixfaf.com\nlixiaedu.com\nlixiang.com\nlixianghuanbao.com\nlixiangoa.com\nlixiangshu.net\nlixianhezi.com\nlixianhua.com\nlixiaocrm.com\nlixiaolu.org\nlixiaoskb.com\nlixiaoyun.com\nlixiaozhe.com\nlixinapp.com\nlixinger.com\nlixingyong.com\nlixinpharm.com\nlixuan360.com\nlixueba.com\nlixueduan.com\nlixuejiang.com\nliyan365.com\nliyang1.com\nliyangbit.com\nliyanggroup.com\nliyangic.com\nliyangrc.com\nliyangtuopan.com\nliyanmobi.com\nliyaochao.com\nliyegroup.com\nliyi99.com\nliyinewmaterial.com\nliyingfei.com\nliyinka.com\nliyu8.com\nliyuan1999.com\nliyuan99.com\nliyuan99.vip\nliyuanchun.net\nliyuanheng.com\nliyuanhospital.com\nliyuanresort.com\nliyuansz.com\nliyugang.com\nliyujn.com\nliyunde.com\nliyunkm.com\nliyunshuwu.com\nliyuplay.com\nliyx.fun\nliyx.net\nlizaberese.com\nlizaike.com\nlizhehaozhongyi.com\nlizhenauto.com\nlizhenglai.com\nlizhenwang.com\nlizhi.com\nlizhi.fm\nlizhi.io\nlizhi.shop\nlizhi110.com\nlizhifilm.com\nlizhifm.com\nlizhiinc.com\nlizhijitang.com\nlizhilive.com\nlizhiqi.com\nlizhiqiang.name\nlizhiqp.com\nlizhiweike.com\nlizhongyi.com\nlizhujue98.com\nlizi.com\nlizihang.com\nlizikeji.vip\nlizilaw.com\nliziqiche.com\nlizitongxue.com\nliziwu.net\nliziyuan.com\nlizq.host\nlj-audio.com\nlj-bank.com\nlj168.com\nljbao.net\nljbbj.com\nljcdn.com\nljclz.work\nljflavor.com\nljh.cool\nljhjgc.com\nljhjny.com\nljhks.com\nljhks.net\nljia.com\nljia.net\nljimg.com\nljjcyy.com\nljjlb.net\nljjq.com\nljjyjt.com\nljk.cc\nljkangyang.com\nljlcd.com\nljlj.cc\nljlmdns.com\nljlqw.com\nljmeng.site\nljmyy120.com\nljqhju.com\nljqxjjhbc.com\nljrbw.com\nljs.fun\nljsdk.com\nljsy2017.com\nljsz.xyz\nljtx.com\nljw113.com\nljwebs.com\nljwit.com\nljwlz.com\nljxqzy.com\nljxww.com\nljz-talentapt.com\nljzfin.com\nlk-jd.com\nlk0355.com\nlk361.com\nlk366.com\nlkalpos.com\nlkcash.com\nlkcgyl.com\nlkchemical.com\nlkcoffee.com\nlkdt.work\nlke.hk\nlkfan.com\nlkg888.com\nlkgame.com\nlkgk.net\nlkgshq.com\nlkhaowu.com\nlki2.org\nlkjujm.com\nlkkbrand.com\nlkkcdn.com\nlkkdesign.com\nlkker.com\nlkkued.com\nlkme.cc\nlknvcti.com\nlkong.com\nlkong.net\nlkpc.com\nlkqihang.com\nlksmarttech.com\nlkssite.vip\nlkszj.info\nlktz.net\nlkuaiy.com\nlkxfeda.com\nlkyljt.com\nlkyou.com\nll-hao123.com\nll1024.com\nll5856.com\nllang.net\nllaoyou.com\nllbzy.com\nllcat.tech\nlldlf.com\nllever.com\nllewan.com\nllgjx.com\nllgkm.com\nllguangli.com\nllguangli30.com\nllhlkftzjt.com\nllidc.com\nllinkslaw.com\nlljgame.com\nlljsq.net\nlljyx.com\nllku.com\nlllcn.com\nllllx7.com\nlllpv.com\nllmtrend.com\nllmworld.net\nllongwill.com\nllqsq.com\nllrj.net\nllrsz.com\nlls.moe\nllsapp.com\nllscdn.com\nllskjt.com\nllsops.com\nllsserver.com\nllssite.com\nllsttapp.com\nllsun.com\nlltoken.com\nlltskb.com\nllumar-cn.com\nllwx.net\nllx168.com\nllxj119.com\nllxx.cc\nllxzl.com\nllxzu.com\nllyj.net\nllyweb.com\nllyy.org\nllyyx.com\nllzg.com\nllzxedu.net\nlm263.com\nlm335.com\nlm9999.com\nlmacc.com\nlmanmo.com\nlmanucell.com\nlmbct.com\nlmbest.com\nlmdouble.com\nlmengcity.com\nlmjtgs.com\nlmjx.net\nlmjzd.com\nlmkggf.com\nlmkzx.com\nlmlc.com\nlmlq.com\nlmnano.com\nlmnsaas.com\nlmonkey.com\nlmparcel.com\nlmqt.com\nlms.pub\nlmschina.net\nlmscp.com\nlmtutou.com\nlmtw.com\nlmu5.com\nlmujp.work\nlmwlhh.com\nlmwljz.com\nlmwmm.com\nlmylgs.com\nlmzitie.com\nlmzt.com\nln-map.com\nln-rc.com\nln525.com\nlnairport.com\nlnamphp.com\nlnast.net\nlnbaiyun.com\nlnbdsc.com\nlnbybc.com\nlnbyy.net\nlncbp.com\nlncct.com\nlncjxy.com\nlncldapi.com\nlncmcc.com\nlncmxy.com\nlncnw.com\nlnddhxq.com\nlndhdx.com\nlndnw.com\nlndwkj.com\nlndxpt3.com\nlndxptssl.com\nlneab.com\nlnemci.com\nlnenergy.net\nlnes.net\nlnest.com\nlnfdcxh.org\nlnfssy.com\nlnfzb.com\nlngche.com\nlngwy.org\nlnhddq.com\nlnhotels.com\nlnhygy.com\nlnicc-dl.com\nlnicp.com\nlninfo.com\nlnjfyc.com\nlnjmlnykjfzyxzrgs.com\nlnjpedu.com\nlnjzxy.com\nlnkdjt.com\nlnlawyers.net\nlnlc2.net\nlnldsw.com\nlnlib.net\nlnlon-zdh.com\nlnlotto.com\nlnmtc.com\nlnmu3h.com\nlnnoo.com\nlnok.net\nlnpatcm.com\nlnpenger.com\nlnphar.com\nlnpjw.com\nlnqwe.com\nlnrbxmt.com\nlnrcu.com\nlnrsks.com\nlnsenhai.com\nlnsent.com\nlnsgczb.com\nlnsqxj.xyz\nlnsrmyy.com\nlnsslhyxh.com\nlnsyzx.com\nlnszyjt.com\nlntenghui.com\nlntvu.com\nlntycp.com\nlnvipsoft.com\nlnwish.com\nlnwoo.com\nlnxmt.com\nlnxysf.com\nlnyahui.com\nlnydjt.com\nlnyxcj.com\nlnyyzyxy.com\nlnzcj.com\nlnzhongka.com\nlnzhqy.com\nlnzikao.com\nlnzsks.com\nlnzy-edu.com\nlnzzpf.com\nlo97.com\nloac.cc\nloadingbay.com\nloansliml.com\nlocal-ip.online\nlocal.hk\nlocalizecdn.com\nlocalxcafe.com\nlocatran.com\nlocez.com\nlocimg.com\nlockchat.app\nlockfans.com\nlockin.com\nlockinchina.com\nlocklauncher.com\nlockscreenimg.com\nlocnavi.com\nlocojoy.com\nlocoy.com\nlocoyposter.com\nlocren.com\nloctek.com\nlocvps.com\nlocvps.net\nlodashjs.com\nloexu.com\nloftcn.com\nlofter.com\nloftshine.com\nlofu.net\nlog-research.com\nlog1992.com\nlogacg.com\nlogclub.com\nlogdmentincomepay.sbs\nlogi.im\nlogi100.com\nlogicdsp.com\nlogin.cdnetworks.com\nlogiseasy.com\nlogisteed-sc.com\nlogistics-ea.com\nlogisticstech.com\nlogo-emblem.com\nlogo123.net\nlogo2008.net\nlogo888.com\nlogo9.net\nlogoaa.com\nlogobiaozhi.com\nlogodao.com\nlogodashi.com\nlogohhh.com\nlogoly.pro\nlogoqq.com\nlogory.com\nlogoshe.com\nlogosheji.com\nlogosj.com\nlogovps.com\nlogowk.com\nlogozhizuowang.com\nlogwing.com\nlogwirecloud.com\nlohaa.com\nlohalink.com\nlohand.com\nlohasor.com\nlohjs.com\nlohkahhotels.com\nloho88.com\nlohu.info\nloj.ac\nloji.com\nloke123.com\nlokenchem.com\nlokyi.name\nlol99.com\nlolaroseglobal.com\nlolbuku.com\nloldan.com\nloldk.com\nloli.by\nloli.cloud\nloli.ee\nloli.net\nloliapi.com\nlolicon.team\nloliloli.moe\nloliloli.net\nlolimoe.cc\nlolitawardrobe.com\nloljy.com\nlolkeng.com\nlollipopo.com\nlolmax.com\nlolmf.com\nlolmz.com\nlolphp.com\nloltmall.com\nlolxy.com\nlolyculture.net\nlomge.com\nlomoment.com\nlomon.com\nlomowo.com\nloncent.com\nloncin.com\nloncinindustries.com\nlonderful.com\nlondonermacaoresort.com\nlonelystar.org\nlonery.com\nlonfoor.com\nlong-horn.com\nlong-photo.com\nlong-term.net\nlong.ge\nlong5.com\nlong7.com\nlonganlaw.com\nlongau.com\nlongbenren.com\nlongbridgeapp.com\nlongbridgehk.com\nlongcai.com\nlongcai027.com\nlongchangjixiekeji.com\nlongcheer.com\nlongchunbajiao.com\nlongclouds.com\nlongcore.com\nlongdameishi.com\nlongdaoyun.com\nlongde.com\nlongdear.com\nlongdear.net\nlongdian.com\nlongdiandianli.com\nlongduwang.com\nlongease.net\nlongfanshipping.com\nlongfengmarathon.com\nlongfor.com\nlongfu360.com\nlongguanjia.so\nlonghan.cc\nlonghoo.net\nlonghorn-auto.com\nlonghu.net\nlonghua.net\nlonghuafilm.com\nlonghufengyun.com\nlonghuiren.com\nlonghuquan.com\nlonghuvip.com\nlongi.com\nlongigroup.com\nlongjcun.com\nlongjiazuo.com\nlongjisteel.com\nlongjisz.com\nlongjitour.com\nlongjoy.net\nlongjunjiayuan.com\nlongk.com\nlongkui.site\nlongkunjituan.com\nlongkuntech.com\nlonglijituan.com\nlonglingas.com\nlongliqicom.com\nlongluo.me\nlonglycn.com\nlongmaosoft.com\nlongmarchspace.com\nlongmaywuliu.com\nlongmeicn.com\nlongmen-pharma.com\nlongmen.net\nlongmenedutech.com\nlongmeng.com\nlongmenshuju.com\nlongming.com\nlongmingdns.com\nlongnanke.com\nlongo.ltd\nlongoo.com\nlongood.com\nlongpokeji.com\nlongquan-baojian.com\nlongquecdn.com\nlongre.com\nlongrich.com\nlongsailing.net\nlongsan.com\nlongshanchemical.com\nlongshangrc.com\nlongsheng.com\nlongsheng988.com\nlongshine.com\nlongsok.com\nlongsto.com\nlongstonechina.com\nlongsunhd.com\nlongsys.com\nlongtaifoods.com\nlongtec.com\nlongtugame.com\nlongtuojixie.com\nlongu.com\nlongwangshipin.com\nlongwaycabinet.com\nlongwenedu.com\nlongwiki.org\nlongwin.org\nlongwintoys.com\nlongwisedata.com\nlongwisepr.com\nlongwx.com\nlongxi-tech.net\nlongxia.com\nlongxianwen.net\nlongxinfa.com\nlongxinglong.com\nlongxinli.com\nlongxintec.com\nlongxuan.ren\nlongyanbus.com\nlongyar.com\nlongygo.com\nlongyi-uav.com\nlongyin.net\nlongyinok.com\nlongyistudio.com\nlongyiyy.com\nlongyu.cc\nlongyucq.com\nlongyuedu.com\nlongyuegs.com\nlongyusheng.org\nlongyutec.com\nlongzhou.cc\nlongzhu.com\nlongzhu.tv\nlongzhudagroup.com\nlongzhulive.com\nlonhcloud.net\nlonleaf.com\nlonlife.org\nlonmedcn.com\nlonsoon.com\nlontengsteel.com\nlontiumsemi.com\nlontrue.com\nlonyon.com\nloocall.com\nloocode.com\nloodd.com\nlooeen.com\nlooeo.com\nlooeoo.com\nloogoo.com\nloohuo.com\nlooioo.com\nlookae.com\nlookao.com\nlookbaby.com\nlookbravo.com\nlookchem.com\nlookgame.com\nlooking-car.com\nlookr.cc\nlooktm.com\nlooktmt.com\nlookvin.com\nloome.net\nloonapp.com\nloong3d.com\nloongdriving.com\nloongnix.com\nloongnix.org\nloongon.com\nloongshine.com\nloongsin.com\nloongson.org\nloongsonclub.com\nloongtravel.com\nloongxy.com\nloonlog.com\nlooooker.com\nloooooong.com\nlooquan.com\nloorin.com\nloovee.com\nlooyuoms.com\nlooyush.com\nlopetech.net\nloping151.site\nlopmall.com\nlopss.com\nlopwon.com\nlordabbettchina.com\nlorefree.com\nlorhf.com\nlorienk.com\nloring.xyz\nlorzeal-zj.com\nlosergogogo.com\nlossyou.com\nlostdeer.xyz\nlostphp.com\nlostsakura.com\nlot-ml.com\nlotevision.com\nlotianshangx.com\nlotlab.org\nlotour.com\nlotour.net\nlotpc.com\nlotpen.com\nlotsmv.com\nlottery-sports.com\nlotusair.net\nlotusdata.com\nlotusfr.com\nlotut.com\nloubobooo.com\nlouding.com\nloudseas.com\nlouge.ltd\nlouislivi.com\nlouisvuittonbags.club\nloukky.com\nloulanwang.com\nloupan.com\nlouruo.com\nloushi.com\nlousj.com\nlousw.com\nlouyue.com\nlovcuty.com\nlove-freedom.com\nlove-math-edu.com\nlove.tv\nlove21cn.com\nlove3721.com\nlove5201314.net\nlove5209420.com\nlove85g.com\nloveabc.net\nlovean.com\nloveapp.com\nlovebizhi.com\nlovedword.com\nloveforvenus.com\nlovefree.cc\nlovehaimi.com\nlovehhy.net\nlovehifi.com\nloveifgames.com\nloveinhere.com\nloveinhtw.com\nlovejavascript.com\nlovejia.win\nlovelacelee.com\nlovelian.com\nloveliao.com\nlovellacountry.com\nlovelyping.com\nlovelytooth.com\nlovemojito.com\nlovengame.com\nloveniwed.com\nloveota.com\nloveota.net\nlovepd.com\nloverdoor.com\nlovesec.com\nloveshang.com\nlovesoo.org\nlovestu.com\nlovetan.net\nloveteemo.com\nloveu.life\nloveuav.com\nlovev.com\nlovevibe1.com\nlovewith.me\nlovgiin.com\nlovingedmond.com\nlovol.com\nlovology.com\nloxpo.com\nloyalvalleycapital.com\nloyar.com\nloyi.net\nloyo.cc\nloystnetwork.com\nlp.fyi\nlp023.com\nlp025.com\nlp91.com\nlpaec.com\nlpcheng.com\nlpcues.com\nlpd8888.com\nlpetl.com\nlpfile.com\nlpgjkd.com\nlph119.com\nlpllol.com\nlpmas.com\nlpou.online\nlppz.com\nlppzimg.com\nlpq1688.com\nlprcx.com\nlprogram.site\nlpsckf.com\nlpsign88.com\nlpspt.com\nlpswz.com\nlpszstv.com\nlptiyu.com\nlpxinjuhui.com\nlpxinke.com\nlpxt.com\nlpxuqi2057.vip\nlpzine.com\nlq5u.com\nlqaafgq.com\nlqabr.com\nlqbby.com\nlqbj.com\nlqbj66.com\nlqfeather.com\nlqgy.com\nlqhualang.com\nlqjob88.com\nlqjt.com\nlqjyw.net\nlqlst.com\nlqpos.vip\nlqqm.com\nlqrcb.com\nlqsbcl.net\nlqschool.net\nlqsilicon.com\nlqtzjy.com\nlqwang.com\nlqxcl.com\nlqxshop.com\nlqxyljt.com\nlqyaopin.com\nlqyfsx.com\nlqyqjt.com\nlqzh.me\nlqzp.com\nlqzwdj.com\nlr-amm.com\nlr-link.com\nlr8888.com\nlrc99.com\nlrcb.net\nlrceu.com\nlrcku.com\nlrdcq.com\nlrhold.net\nlricn.com\nlrist.com\nlrkdzx.com\nlrkj.net\nlrlz.com\nlrmation.com\nlrnya.com\nlrs001.com\nlrscloud2.com\nlrscloud3.com\nlrt-tech.com\nlrts.me\nlrvin.com\nls-doll.com\nls-gb.com\nls-hospital.com\nls.link\nls0358.com\nls0513.com\nls102.com\nls1935.com\nls520.net\nls605.com\nls666.com\nlsbankchina.com\nlsbchina.com\nlsbin.com\nlsbj365.com\nlsbtly.com\nlsccb.com\nlscstz.com\nlscsw168.com\nlsdfood.com\nlsdjwl.com\nlsdzk.com\nlserp.com\nlsfcj.com\nlsfvideo.com\nlsfwpt.com\nlsfyw.net\nlsgenius.com\nlsgqys.com\nlsgrandtheatre.com\nlsgw.com\nlsgwebmall.com\nlsgzn.com\nlsh-cat.com\nlshdw.cc\nlshfreda.com\nlshitv.com\nlshou.com\nlshzj.com\nlsij3km.com\nlsit.net\nlsjgcx.com\nlsjiancai.com\nlsjkj.com\nlsjlp8.com\nlsjnwxly.com\nlsjo.com\nlsjrcdn.com\nlsjtjs.com\nlsjxck.com\nlsjxww.com\nlskejisoft.com\nlskem.com\nlskj1993.com\nlskjkf.com\nlskong.com\nlsldjyw.com\nlslfs.com\nlslgzn.com\nlslihai.com\nlsmaps.com\nlsmtjy.com\nlsmzt.cc\nlsnm.com\nlsoos.com\nlspjy.com\nlsplayer.com\nlsqcjjt.com\nlsqedu.com\nlsqmx.com\nlsqpay.com\nlsqqy.com\nlsqv.com\nlsqx.com\nlsqy398.com\nlsrbs.net\nlsrfzy.com\nlsrmyy.com\nlssdexternal.com\nlssggzy.com\nlssjt.com\nlsswjt.com\nlsszgh.com\nlst1000.com\nlstazl.com\nlstest.com\nlstt-app.com\nlsttapp.com\nlsttappmoney.com\nlsttapppro.com\nlsttappspace.com\nlsttappweb.com\nlsttappworks.com\nlsttmoney.com\nlsttnews.com\nlsttonline.com\nlsttpro.com\nlsttrich.com\nlsttweb.com\nlsttworks.com\nlstx.vip\nlsun.net\nlsuoled.com\nlsup.net\nlswfw.com\nlswgy.com\nlswld.com\nlswqw.com\nlsxrmtzx.com\nlsxuantong.com\nlsxxkj.net\nlsyart.com\nlsyhh.com\nlsys2002.com\nlszi.net\nlszj.com\nlszjy.com\nlszjyj.com\nlsznk.com\nlsznkyy.com\nlszp.cc\nlszyy.net\nlszzg.com\nlt-edu.net\nlt-info.net\nlt-shanghai.com\nlt-tree.com\nlt-uv.com\nlt3c.com\nlt7293333.com\nltaaa.com\nltaaa.net\nltao.com\nltd.com\nltdcdn.com\nltdspot.com\nltesting.net\nltfwzs.com\nltggc.com\nltggzy.com\nltgtm.com\nlth.xyz\nlthqdl.com\nltidc.com\nltie.org\nltimg.net\nltjczx.com\nltjianhe.com\nltkgjt.com\nltkqjt.com\nltl5210.com\nltld.net\nltly.so\nltnic.com\nltoit.com\nltp-cloud.com\nltp.ai\nltplighting.com\nltpower.net\nltsbbs.com\nltsc.vip\nltsf.com\nltsj2005.com\nltski.com\nltswxy.com\nlttconn.com\nlttmgc.com\nlttvip.com\nltwkw.com\nltwy.com\nltxbbs.com\nltxjob.com\nltxsw.co\nltxxgcxx.com\nltxys.com\nlty.fun\nltyears.com\nltzsjt.com\nltzxw.com\nltzz666.com\nlu.com\nlu0.com\nlu17996.com\nlu35.com\nlua.ren\nlua99.com\nluan.ma\nluan163.com\nluaninfo.com\nluanren.com\nluanup.com\nluanwater.com\nluanxian114.com\nluanzhougucheng.com\nluastudio.net\nluatos.com\nluba360.com\nluban-furniture.com\nlubandata.com\nlubanjianye.com\nlubanlebiao.com\nlubanner.com\nlubanpm.com\nlubanshop.com\nlubanso.com\nlubansoft.com\nlubanu.com\nlubaocar.com\nlubeichem.com\nlubiao.com\nlubotv.com\nluboyun.com\nluchengas.com\nluchentech.com\nluchenwater.com\nluchuang.com\nluciaz.me\nlucifer.ren\nlucifr.com\nluck-number.com\nluck808.com\nluckao.com\nluckeeinc.com\nluckforcalendar.com\nluckincalendar.com\nluckincdn.com\nluckincoffee.co\nluckincoffee.com\nluckincoffeecdn.com\nlucklnk.com\nluckmail.net\nluckup.cc\nlucky.gd\nlucky286.com\nlucky8k.com\nluckyair.net\nluckychipsmaster.com\nluckycoffee.com\nluckyop.com\nluckysf.net\nluckyxp.net\nlucode.net\nluctonchongqing.com\nluctoncq.com\nluctonshanghai.com\nludaocn.com\nludaopei-bjyz.com\nludashi.com\nludashicdn.com\nludashisafe.com\nludayq.com\nludedc.com\nludengtyn.com\nludeqi.com\nludiban.com\nludongyy.com\nludosuperstar.com\nludou.org\nludown.com\nludoworld.net\nludu319.com\nlueasygi.com\nluebin.com\nluedian.com\nluenmei.com\nlueqiu.com\nluexpo.com\nlueyue.com\nluezhi.com\nlufahouse.com\nlufangjia.com\nlufaxcdn.com\nlufengwuliu.net\nlufengzhe.com\nlufff.com\nluffy.cc\nluffycity.com\nlufunds.com\nlugangsoft.com\nlugick.com\nlugong.net\nlugouqiaojiu.com\nluguisc.com\nluhai.net\nluhaioil.com\nluhao198.com\nluhaoche.com\nluhe.net\nluhehospital.com\nluhu.co\nluhua.cc\nluhuadong.com\nluhuiwl.com\nlujiaming.com\nlujiandairy.com\nlujianxin.com\nlujiazuiforum.org\nlujingtao.com\nlujiya.com\nlujun9972.win\nlukachen.com\nlukafei.com\nlukechina.com\nlukiwod.org\nlukiya.com\nlukou.com\nlukuanart.com\nlul8.com\nlula.fun\nlulala.com\nlulaoshi.info\nlulinux.com\nlulisteel.com\nlulubei.com\nlulufind.com\nlulugda.icu\nluluhong.com\nluluju.com\nlum114.com\nlumai.net\nlumen-chip.com\nlumiai.com\nlumin.tech\nlumingtec.com\nlumiunited.com\nlumosfun.com\nlunalotus.online\nlunannews.com\nlunar2013.com\nlunatdteteask.cfd\nlundao.pub\nluneng.com\nlungai.com\nlunkuokeji.com\nlunlunapp.com\nlunwengo.net\nlunwenlib.com\nlunwenstudy.com\nlunwentong.com\nlunwenxiazai.com\nlunzima.net\nluobo020.com\nluobo360.com\nluobotou.org\nluobowin8.com\nluoboxia.com\nluochen.com\nluochenyl.com\nluochenzhimu.com\nluodian.com\nluodw.cc\nluoergai.com\nluofk.xyz\nluoganpump.com\nluogu.org\nluohanacademy.com\nluohanyu.cc\nluohuedu.net\nluojiaci.net\nluojiadeyi.com\nluojiji.com\nluojilab.com\nluojiweiye.com\nluokuang.com\nluolai.com\nluolai.tech\nluolaoguai.com\nluolatu.com\nluoli.net\nluoluoluoluo.xyz\nluomanxincai.com\nluomanyueqi.com\nluomapan.com\nluomor.com\nluoniushan.com\nluoo.net\nluoohu.com\nluooqi.com\nluopan.com\nluoqiu.us\nluoqiuzw.com\nluori.net\nluoshendao.com\nluoshu.com\nluoshuanchangjia.com\nluosi.com\nluosifen888.com\nluosika.com\nluosimao.com\nluosoft.com\nluotiannews.com\nluotianyi.vc\nluotuo101.com\nluotuobang.net\nluotuoshop.net\nluowandianzi.com\nluowave.com\nluoxiang.com\nluoxiangcheliang.com\nluoxiaozi.com\nluoxinyaoye.com\nluoxudong.com\nluoxue.com\nluoyangdx.com\nluoyangkeji.com\nluoyangmalasong.com\nluoyechenfei.com\nluoying66.com\nluoyingsh.com\nluoyuanhang.com\nluozhiyun.com\nluozhongxu.com\nluozongle.com\nlup2p.com\nlupaworld.com\nluping.com\nluqidong.com\nlure123.com\nlurefans.com\nlurelogs.com\nlurenshuwx.com\nluruba.com\nlurun68.com\nlusen.com\nluseng.cc\nlush-mount.com\nlushangroups.com\nlushaojun.com\nlushifu.net\nlushu.com\nlusongsong.com\nluspet.com\nlussac.net\nluster3ds.com\nlustervision.com\nlustre-pharma.com\nlusun.com\nlusure-pharma.com\nluszy.com\nlutao.com\nluteng888.com\nlutongda.com\nlutonggroup.com\nlutongnet.com\nluv66.com\nluvoras.store\nluwei.me\nluweiwater.com\nluxe.cc\nluxe.co\nluxemon.com\nluxenixa.com\nluxiangba.com\nluxiangdong.com\nluxiangwu.net\nluxiaoche.com\nluxichemical.com\nluxiwang.com\nluxshare-ict.com\nluxtarget.com\nluxuanart.com\nluxuqing.com\nluxury-ceramics.com\nluxury2008.com\nluxurybrandmall.com\nluxurychina.org\nluxurymany.com\nluxuryshopwatch.com\nluxvisions-inno.com\nluyanghui.com\nluyanhui.com\nluyaodz.com\nluye-pharm.com\nluye.com\nluyecanyin.com\nluyijiaoyu.com\nluyinla.com\nluyinzhushou.com\nluyitong.com\nluyor.net\nluyouqi.com\nluyouqi.net\nluyouwang.com\nluyouwang.net\nluyouxia.com\nluyouxia.net\nluyusheji.com\nluyusoft.com\nluzewangluo.com\nluzexi.com\nluzhonggonglu.com\nluzhou.net\nluzhoubs.com\nluzhoufood.com\nluzhouok.com\nlv74.com\nlv96.com\nlvanol.com\nlvbad.com\nlvban365.com\nlvbang.tech\nlvbeijingtour.com\nlvbenma.com\nlvbitte.com\nlvbogas.com\nlvcai.biz\nlvcampaign.com\nlvcchong.com\nlvchanghuanbao.com\nlvchayun.com\nlvchehui.com\nlvcheng.com\nlvchengba.com\nlvchicar.com\nlvd.cc\nlvdawei.com\nlvdhb.com\nlvdingjia.com\nlvdishandong.com\nlvdongip.com\nlvdxs.com\nlve-china.com\nlvfang.cc\nlvfapiao.com\nlvgangss.com\nlvgou.com\nlvgset.com\nlvguo.net\nlvhuawei.work\nlvirahoe.com\nlvjhx.com\nlvjiaoya121.com\nlvjieplus.com\nlvjinsuo.com\nlvjiwang.com\nlvjuelaw.com\nlvjuf.com\nlvjunzx.com\nlvkcn.com\nlvke.wiki\nlvkhouse.com\nlvkun.site\nlvlian5.com\nlvluowang.com\nlvlvlvyou.com\nlvmae.com\nlvmall.com.tw\nlvmama.com\nlvmenglvye.com\nlvmifo.com\nlvmushan.com\nlvneng.com\nlvnengliang.com\nlvpai114.com\nlvpin100.com\nlvpu-chem.com\nlvqingqichangjia.com\nlvrdn.com\nlvren.com\nlvruanhome.com\nlvsan.com\nlvsanxia.com\nlvse.com\nlvsenbao.com\nlvsetxt.com\nlvsexitong.com\nlvshidaxia.com\nlvshiguan.com\nlvshiminglu.com\nlvshou.com\nlvshou.net\nlvshunmuseum.org\nlvsiport.com\nlvsongguo.com\nlvtds.com\nlvtingzs.com\nlvtu100.com\nlvtudiandian.com\nlvtuwa.com\nlvwan.com\nlvwang.com\nlvwenhan.com\nlvwmb.com\nlvxiaoer.net\nlvxing.net\nlvxunlaw.com\nlvyahoo.com.tw\nlvye.com\nlvye.org\nlvyestudy.com\nlvyetong.com\nlvyidoor.com\nlvyinba.com\nlvyinbar.com\nlvyou168.net\nlvyou521.com\nlvyoubei.com\nlvyouf.com\nlvyoukan.com\nlvyounong.com\nlvyouw.net\nlvysz.com\nlvyuanjj.com\nlvyuanpam.com\nlvyuetravel.com\nlvzeep.com\nlvzheng.com\nlw0591.com\nlw0634.net\nlw5188.com\nlw54.com\nlwalb.online\nlwccc.net\nlwcj.com\nlwd3699.com\nlwdjc.com\nlwebapp.com\nlwfengji.net\nlwfmzh.com\nlwgsw.com\nlwguitar.com\nlwhouse.com\nlwinst.com\nlwjhql.com\nlwjl.com\nlwjt.net\nlwjy.net\nlwlm.com\nlwlocks.com\nlwlt.net\nlwlzy.com\nlwnews.net\nlwons.com\nlwork.com\nlwrcb.com\nlwshanghai.org\nlwshuku.info\nlwsy.org\nlwtylqx.com\nlwurl.to\nlwwandong.com\nlwxgds.com\nlwxs.com\nlwxs11.com\nlwxstxt.com\nlwzls.com\nlx.cok.elexapp.com\nlx.pub\nlx.run\nlx138.com\nlx2.cok.elex.com\nlx2.cok.elexapp.com\nlx3.cok.elexapp.com\nlx598.com\nlx688.com\nlxapk.com\nlxbio.net\nlxblog.com\nlxbtrip.com\nlxccl.com\nlxcdns.com\nlxcvc.com\nlxdas.com\nlxdfs.com\nlxdms.com\nlxdns.com\nlxdns.info\nlxdns.net\nlxdns.org\nlxdp.net\nlxdus.com\nlxdvs.com\nlxdvs.info\nlxdvs.org\nlxdvsss.com\nlxdws.com\nlxf.me\nlxg2016.com\nlxgcf.com\nlxhg.com\nlxhkair.com\nlxhro.com\nlxhuwai.com\nlxhuwai.net\nlxhz-avionics.com\nlxi.me\nlxjapp.com\nlxjcjg.com\nlxjiasu.com\nlxkj.site\nlxlinux.net\nlxns.net\nlxny.vip\nlxq7t234u.shop\nlxrcsc.com\nlxsales.com\nlxsec.com\nlxsk.com\nlxt55094.com\nlxtianhu.com\nlxtuig77.com\nlxtuyoo.com\nlxtuyoogame.com\nlxtuyou.com\nlxway.com\nlxway.net\nlxwlcn.com\nlxxarq.com\nlxxdyzx.com\nlxxm.com\nlxyai.com\nlxybaike.com\nlxydoor.com\nlxyedu.com\nlxyes.com\nlxyjxsb.com\nlxykjsz.com\nlxyl020.com\nlxyl028.com\nlxyl053.com\nlxyl070.com\nlxyl071.com\nlxyl219.com\nlxyl247.com\nlxyl328.com\nlxyl335.com\nlxyl353.com\nlxyl355.com\nlxyl375.com\nlxyl539.com\nlxyl803.com\nlxyl954.com\nlxyl980.com\nlxyllawfirm.com\nlxyswl.com\nlxzjjt.com\nlxzrmyy.com\nlxzwedu.com\nly-eps.com\nly-jz.com\nly-qiche.com\nly-sky.com\nly.com\nly1by1.com\nly200-cdn.com\nly200.com\nly2y.com\nly321.com\nly333.com\nly39zx.com\nly522.com\nly6s.com\nly93.cc\nlyagyd.com\nlyangchuanbo.com\nlyauto.com\nlybdfqh.com\nlybol.com\nlybtmy.com\nlybus.com\nlybybz.com\nlycheer.net\nlyckw.com\nlycs-arc.com\nlyd-china.com\nlyd6688.com\nlydaas.com\nlydezx.net\nlydfyy.com\nlydhb888.com\nlydpjx.com\nlydsy.com\nlyduanzao.com\nlydyyy.com\nlyecs.com\nlyenet.org\nlyf.com\nlyfangc.com\nlyfc.com\nlyfc001.com\nlyfff.com\nlyfsgy.com\nlyfz.net\nlyg.live\nlyg001.com\nlyg01.net\nlyg1.com\nlyg12371.com\nlyg321.com\nlyg800.com\nlygcec.com\nlygchkq.com\nlygcjjt.com\nlygcsyy.com\nlygdfrcb.com\nlygend.com\nlygent.com\nlygfdc.com\nlygfish.com\nlygfybj.com\nlyggm.com\nlyggmyk.com\nlyghi.com\nlyghs.net\nlyghtyy.com\nlygjdf.com\nlygjkw.com\nlygjkwljt.com\nlygjtjt.com\nlygjtkgjt.com\nlygktj.com\nlygl.net\nlygmedia.com\nlygnews.com\nlygou.cc\nlygrc.net\nlygsgt.com\nlygshjd.com\nlygshlxh.com\nlygxwmarathon.com\nlygxwxqrmyy.com\nlygyyjt.com\nlygyyw.com\nlyh666.asia\nlyh8888.com\nlyhb88.com\nlyhendry.com\nlyhero.com\nlyhkh.com\nlyhomestayinn.com\nlyhuadu.com\nlyhx.net\nlyia.org\nlyihub.com\nlyilife.com\nlyjiuzhou.com\nlyjksw.com\nlyjob.net\nlyjunshi.com\nlyjwatch.com\nlyjy.net\nlyjyfw.net\nlyjyjt.com\nlyjys.com\nlylangchao.com\nlyldhg.com\nlylend.com\nlylhkq.com\nlylme.com\nlylxjxc.com\nlymarathon.com\nlymmasu.xyz\nlymy1684.com\nlyngrhec.sbs\nlynkco-test.com\nlynkco.com\nlynlzqy.com\nlynne.ink\nlyobs.com\nlyou123.com\nlyouoa.com\nlypb.com\nlypd.com\nlypdl.com\nlypower.com\nlypyxx.com\nlyqckyzz.com\nlyqgm.com\nlyqlm.com\nlyquanshunmall.com\nlyrc.cc\nlyrcw.com\nlyric-robot.com\nlyrics.run\nlysafety.com\nlyscjc.com\nlyshangdu.com\nlyshark.com\nlyshenglu.com\nlyshgs.com\nlysk.net\nlysksw.com\nlyslsw.com\nlysq.com\nlysqzs.com\nlysswjt.com\nlysteel.com\nlyswjt.com\nlysxtv.com\nlysy360.com\nlysyzx.com\nlyszls.com\nlyszxyy.com\nlythw.com\nlytoufang.com\nlytpw.com\nlytq.com\nlytuanxue.com\nlyuncloud.com\nlyunle.com\nlyunweb.com\nlyunx.com\nlyvnee.com\nlywenlv.com\nlywf.me\nlywhxy.com\nlywtpx.com\nlywww.com\nlywxww.com\nlyxinhua.com\nlyxltv.com\nlyxsjmm.com\nlyxyxx.com\nlyy99.com\nlyyapp.com\nlyyg.com\nlyyzedu.com\nlyz810.com\nlyzaix.com\nlyzb.com\nlyzb33.app\nlyzfgjj.com\nlyzggs.com\nlyzhanlang.com\nlyzlzz.com\nlyzp100.com\nlyzyxy.com\nlz-qs.com\nlz-redeem.com\nlz-risun.com\nlz-veoliawater.com\nlz12328.com\nlz310.com\nlz520.net\nlzabcd.com\nlzahzn.com\nlzailin.com\nlzane.com\nlzaotw.com\nlzarays.com\nlzb.im\nlzbank.com\nlzbaosteel.com\nlzbcjt.com\nlzbhmy.com\nlzc369.com\nlzcasting.com\nlzcbnews.com\nlzccb.com\nlzcf.net\nlzcgty.com\nlzchcnc.com\nlzchenhui.com\nlzchjs.com\nlzcits.com\nlzcrjs.com\nlzctbyq.com\nlzcyjt.com\nlzdchotel.com\nlzdcic.com\nlzdd.com\nlzdfxj.com\nlzdjjd.com\nlzdql.com\nlzdsqcysgs.com\nlzdsyy.com\nlzdxb888.com\nlzdxdyyy.com\nlzdymy.com\nlzdyyy.com\nlzetyy.com\nlzeweb.com\nlzfcjys.com\nlzfdjt.com\nlzfjq.com\nlzfqty.com\nlzfssp2007.com\nlzftah.com\nlzfyhgm.com\nlzfzct.com\nlzgas.com\nlzgbdst.com\nlzgd.net\nlzghmy.com\nlzgjcxkj.com\nlzgjschool.com\nlzgkyq.com\nlzgm.com\nlzgps.com\nlzgryy.com\nlzhanghai.com\nlzhaoteng.com\nlzhdtk.com\nlzhean.com\nlzhf.com\nlzhhuinong.com\nlzhjuszs.com\nlzhl.online\nlzhmmr.com\nlzhongdian.com\nlzhpo.com\nlzhrobot.com\nlzhszhyy.com\nlzhtwl.com\nlzhuali.com\nlzhuinong.com\nlzhygame.com\nlzhyjd.com\nlzihospital.com\nlziig.com\nlzimall.com\nlzimc.com\nlzjchina.com\nlzjcm.com\nlzjd.com\nlzjiajuw.com\nlzjianlong.com\nlzjingda.com\nlzjldj.com\nlzjoy.com\nlzjuhu.com\nlzjyy.com\nlzkajc.com\nlzkczy.com\nlzkjedu.com\nlzklkqyy.com\nlzknpco.com\nlzkojj.com\nlzky.com\nlzl98.com\nlzlatc.com\nlzlcba.com\nlzlgyy.com\nlzlhpq.com\nlzlj.com\nlzljc.com\nlzljmall.com\nlzlmyyl.com\nlzlqc.com\nlzlrxx.com\nlzlsl.com\nlzlsy.com\nlzltong.com\nlzltool.com\nlzlxylsf.com\nlzlygs.com\nlzmachine.net\nlzmaoliu.com\nlzmbhj.com\nlzmckq.com\nlzmei.com\nlzmljdzx.com\nlzmoyin.com\nlzmun.com\nlzmy123.com\nlznbjz.com\nlznetease.com\nlznrlmxh.com\nlzoam.com\nlzolm.com\nlzorient.com\nlzpfei.com\nlzpmia.com\nlzppt.com\nlzprocess.com\nlzqjjx.com\nlzqjsm.com\nlzqqpcts.com\nlzqxjx.com\nlzranqi.com\nlzrfc.com\nlzrfhg.com\nlzrimd.com\nlzrkjx.com\nlzrmzx.com\nlzro.net\nlzrq.com\nlzry.com\nlzsajzl.com\nlzsansong.com\nlzsb.org\nlzsey.com\nlzseygs.com\nlzseyy.com\nlzsfdq.com\nlzsfy.com\nlzsgmf.com\nlzsjhjx.com\nlzskqyy.com\nlzskx.com\nlzslgcj.com\nlzslong.com\nlzsmedia.com\nlzsmxzy.com\nlzsq.net\nlzsrsj.com\nlzsunspot.com\nlzswmsj.com\nlztb.com\nlztdzy.com\nlzteli.com\nlztlcyxx.com\nlztvnet.com\nlztx123.com\nlztxw.com\nlztzgroup.com\nlzweidaoyou.com\nlzwg.com\nlzwi.fun\nlzwls.com\nlzwopu.com\nlzwsgs.com\nlzwx.com\nlzxbook.com\nlzxfmc.com\nlzxinjiu.com\nlzxinwenwang.com\nlzxishaj.com\nlzxjet.com\nlzxlgg.com\nlzxnqt.com\nlzxqlgwl.com\nlzxqm.com\nlzxqsmwl.com\nlzxqswjt.com\nlzxrmtzx.com\nlzxrmyy.com\nlzxy.com\nlzyd.com\nlzydby.com\nlzyec.com\nlzyfoods.net\nlzygpm.com\nlzyhcy.com\nlzyhdyf.com\nlzyisheng.com\nlzyizhu.com\nlzylkf.com\nlzylqc.com\nlzyoushang.com\nlzyrwz.com\nlzytbl.com\nlzyts.com\nlzyuantong.com\nlzyun.vip\nlzyxfs.com\nlzyxsoft.net\nlzyyy.com\nlzyz.fun\nlzyz.org\nlzyzbz.com\nlzyzx.net\nlzyzxzyy.com\nlzzcloud.net\nlzzf.com\nlzzg365.com\nlzzgljj.com\nlzzhdq.com\nlzzhhq.com\nlzzhongke.com\nlzzkzs.com\nlzzl.net\nlzzlsoft.com\nlzznbyq.com\nlzzrgas.com\nlzzy.net\nlzzyy.com\nm-edu.com\nm-finder.com\nm-hero.com\nm-rainbow.com\nm-team.cc\nm.567it.com\nm.travelzoo.com\nm1.run\nm123.com\nm1315.com\nm176.net\nm186.net\nm188.com\nm1905.com\nm1938.com\nm1ok.com\nm1page.com\nm1world.com\nm1xia.com\nm2ez.com\nm2mlib.com\nm2mzy.com\nm2time.net\nm3-cloud.com\nm3guo.com\nm3kaiye.com\nm3mk7nyo17.com\nm3u8.file.leshantv.net\nm3u8channel-bx.wuxianyaan.com\nm3u8channel-ms.wuxianyaan.com\nm3u8channel-sm.wuxianyaan.com\nm3u8channel-yc.wuxianyaan.com\nm3u8channel-yj.wuxianyaan.com\nm3u8channel.wuxianyaan.com\nm448.com\nm4vmsozi62ifz.com\nm5bn.com\nm5m6x0vh.com\nm5stack.com\nm6.run\nm6tza3ip7x8zr1.com\nm7686d7aw5.com\nm7hwocyo67.com\nm8.com\nm818.com\nm9.run\nm937.com\nm999.com\nm9c7ayme59tp.com\nm9dz.com\nma-china.com\nma.run\nma3office.com\nma3you.com\nma5000.com\nmaa.plus\nmaaend.com\nmaanhui.com\nmaasdk.com\nmabangerp.com\nmabaozhuyun.com\nmabiji.com\nmabotech.com\nmac169.com\nmac189.com\nmac69.com\nmac89.com\nmacabc.com\nmacaobusinessnews.com\nmacaotourism.gov.mo\nmacapp8.com\nmacappbox.com\nmacat.vip\nmacaucentral.com\nmacauchenguangji.com\nmacaumonthly.net\nmacauo2o.com\nmacaupass.com\nmaccms.site\nmaccmsbox.com\nmaccura.com\nmacdaxue.com\nmacgene.com\nmacgood.com\nmachaojin.com\nmachenike.com\nmachine-information.com\nmachine-jh.com\nmachine-visions.com\nmachine35.com\nmachinery4stone.com\nmachloop.cc\nmachloop.com\nmachloop.net\nmachmall.com\nmachtalk.net\nmacjb.com\nmackentan.com\nmackext.com\nmacmao.com\nmacmicst.com\nmacocn.com\nmacoshome.com\nmacpeers.com\nmacrolake.com\nmacroprocess.com\nmacrosan.com\nmacrosilicon.com\nmacrounion.com\nmacrowing.com\nmacrozheng.com\nmacrr.com\nmacs.vip\nmacsc.com\nmacsem.com\nmacshuo.com\nmacsky.net\nmacsz.com\nmacv.com\nmacw.com\nmacxf.com\nmacxin.com\nmacxz.com\nmacz.com\nmaczd.com\nmaczhi.com\nmaczj.com\nmaczl.com\nmadaicaifu.com\nmadailicai.com\nmadajiefood.com\nmadaomall.com\nmadboxi.com\nmadefuns.com\nmadeinchinastone.com\nmadewei.com\nmadiancan.com\nmadio.net\nmadisonboom.com\nmadissonline.com\nmadmalls.com\nmadouvip.com\nmadouym.com\nmadsam.work\nmadsrevolution.net\nmaemo.cc\nmaershan.org\nmafa.tech\nmafadns.com\nmafengs.com\nmafengwo.com\nmafengwo.net\nmafengwoo.com\nmaff.com\nmag10000.com\nmagadanryba.com\nmagaoedu.com\nmagcloud.net\nmagecorn.com\nmagedu.com\nmagentochina.org\nmagewell.com\nmagfx-jbkk.com\nmagi.com\nmagic-school.com\nmagich5page.com\nmagicleaders.com\nmagicneko.com\nmagicnetmall.com\nmagics-ad.com\nmagics.plus\nmagictavern.com\nmagicw3.com\nmagicwatchface.com\nmagicwinmail.com\nmagireco.moe\nmagma.ink\nmagnotel.com\nmagook.com\nmagpiepharma.com\nmagtechjournal.com\nmaguang.net\nmagvision.com\nmahailushu.com\nmahjongai.com\nmahjongai.net\nmahjongcup.com\nmahjongcup.net\nmahoupao.com\nmahua.com\nmahuatalk.com\nmai.com\nmai.tn\nmaianhao.com\nmaibaapp.com\nmaibaihuo.com\nmaibangbang.net\nmaibaokeji.com\nmaibuymai.com\nmaichawang.com\nmaiche.com\nmaiche168.com\nmaicheme.com\nmaichuang.net\nmaicro.com\nmaicuole.com\nmaidang.cool\nmaidangao.com\nmaidelong.com\nmaidengju.net\nmaideyi.com\nmaidiancy.com\nmaidige.com\nmaiditu.com\nmaidong100.com\nmaidongxi.com\nmaidou.com\nmaidouke.com\nmaidrom.net\nmaiduo.com\nmaie.name\nmaifjb.com\nmaigoo.com\nmaihaoche.com\nmaihaojiu.com\nmaihaome.com\nmaihaowan.com\nmaihaowuyou.com\nmaihaoyou.com\nmaihengqi.com\nmaihuacha.com\nmaihuominiapps.com\nmaihuwai.com\nmaijia.com\nmaijiakan.com\nmaijiaw.com\nmaijiazhichi.com\nmaijichuang.net\nmaijiemedia.com\nmaikami.vip\nmaikongjian.com\nmaikr.com\nmail-bitgate.net\nmail163.com\nmail4399.com\nmaila88.com\nmaileds.com\nmailehudong.com\nmailejifen.com\nmailetian.com\nmailianou.com\nmailiku.com\nmailixing.com\nmailizc.com\nmailpanda.com\nmailshanguo.com\nmailyun.net\nmaimaibao.com\nmaimaiche.com\nmaimaidx.cc\nmaimaigongkong.com\nmaimaimaiw.com\nmaimemo.com\nmaimemostatus.com\nmaimiaotech.com\nmainaer.com\nmainaffyn-dev.com\nmaindown4399.com\nmaine1688.com\nmainlandip.com\nmainlandmed.com\nmainshe.com\nmaintao.com\nmainwww.com\nmainyou.com\nmaipu.com\nmaipyi.com\nmaiqun.vip\nmaiqunwang.com\nmairoot.com\nmairuancn.com\nmaisanqi.com\nmaiscrm.com\nmaiseed.com\nmaishebei.com\nmaishitv.com\nmaishou88.com\nmaishoumm.com\nmaisry.net\nmaissn.com\nmaisu.vip\nmaisucai.com\nmaisui1.com\nmaitao.com\nmaitaowang.com\nmaitegao.com\nmaitewang.com\nmaitix.com\nmaitix.net\nmaitu.cc\nmaituan.com\nmaitube.com\nmaiuspharma.com\nmaiwe.com\nmaiweikj.com\nmaixhub.com\nmaixiaba.com\nmaixiang.net\nmaixiaodao.com\nmaixinxin.com\nmaiya91.com\nmaiyadi.com\nmaiyanju.com\nmaiyaole.com\nmaiyayk.com\nmaiyuesoft.com\nmaiyuren.com\nmaizer.pw\nmaizhi.com\nmaizhixiu.com\nmaizhuanbao.com\nmaiziedu.com\nmaizipo.com\nmaizuo.com\nmajia99.com\nmajiamen.com\nmajiang520.com\nmajilive.com\nmajor-epoch.com\nmajorbio.com\nmajorprecious.com\nmajorsec.com\nmajsoul.com\nmaka.im\nmaka.mobi\nmakaevent.com\nmakaidong.com\nmakaiqian.com\nmake-w0rld-static.club\nmakeapp.co\nmakeblock.com\nmakecn.net\nmakedie.me\nmakeeu.com\nmakefang.com\nmakefont.com\nmakelie.com\nmakelove.la\nmakenv.com\nmakeoptim.com\nmakepic.net\nmakepolo.com\nmakepolo.net\nmakerbio.com\nmakeronly.com\nmakeronsite.com\nmaketion.com\nmakeweiyuan.com\nmaking.link\nmala123.com\nmalabeibei.com\nmalagis.com\nmalait.com\nmalajikuai.com\nmalata.com\nmalaysia-mdac.com\nmaldiveszh.com\nmaldun.com\nmales120.com\nmalifenlawyer.com\nmalifuke.org\nmalimalihome.net\nmalingguzhai.com\nmaliquankai.com\nmaliuliu.com\nmall-builder.com\nmall.com\nmallchina.net\nmallchina.org\nmallcoo.net\nmallhaha.com\nmallocfree.com\nmallshow.net\nmallstaroa.com\nmallzhe.com\nmallzto.com\nmalmam.com\nmalong.com\nmaloyonline.com\nmalsmiles.com\nmaltm.com\nmama100.com\nmamabearoasis.site\nmamacn.com\nmamahao.com\nmamahuo.com\nmamayz.com\nmambasms.com\nmambike.com\nmamcharge.com\nmamecn.com\nmamicode.com\nmamioo.com\nmamoe.net\nmamsh.org\nmamumall.com\nman6.org\nmanagershare.com\nmanamana.net\nmanben.com\nmanbetxoo.com\nmanbetxrr.com\nmanboker.com\nmanbu.cc\nmanchengpiaoxiang.com\nmanco-logistics.com\nmanction.com\nmandao-tech.com\nmandarinedu.org\nmandarinhouse.com\nmandarinmorning.net\nmandashu.com\nmande-car.com\nmandian.com\nmandiankan.com\nmandnsv1.com\nmandnsv1.net\nmandudu.com\nmanduhu.com\nmanew.com\nmanewvr.com\nmanfen.net\nmanfen5.com\nmanfenyufa.com\nmanfred-auto.com\nmanfrottoclub.com\nmangafuna.site\nmangafuna.xyz\nmanganesenanhai.com\nmangg.com\nmangguo.com\nmangguo168.com\nmangguonews.com\nmangjianghuole.com\nmangocity.com\nmangoebike.com\nmangoent.com\nmangoerp.com\nmangogame.com\nmangolm.com\nmangomob.net\nmangoru.site\nmangpielb.com\nmangren.com\nmangrovetek.com\nmangrovetreeresort.com\nmangroviarestaurant.com\nmangtian.com\nmangtuhuyu.com\nmanguo42.com\nmangxia.com\nmangxuewang.com\nmangzhongbrand.com\nmangzitian.com\nmangzx.com\nmanhinggroup.com\nmanhua1.com\nmanhua365.com\nmanhua8.net\nmanhuacheng.com\nmanhuadaohang.com\nmanhualang.com\nmanhuang.org\nmanhuapi.com\nmanhuatai.com\nmanjiwang.com\nmankebao.com\nmankewenxue.cc\nmanlaxy.com\nmanlaxycloud.com\nmanli.ltd\nmanlinggame.com\nmanlinwood.com\nmanluoni.com\nmanluotuo.com\nmanmanapp.com\nmanmanbuy.com\nmanmango.com\nmanmankan.com\nmanmanzou.com\nmanmeilp.com\nmanmeng168.com\nmanmu.net\nmannian.com\nmanogk.com\nmanongdao.com\nmanonggu.com\nmanongjc.com\nmanosp.com\nmanpianyi.com\nmanpowergrc.com\nmanrong.win\nmanshaoco.com\nmanshijian.com\nmantachina.com\nmantangc.com\nmantewei.com\nmantianfei.net\nmantusy.com\nmanulife-sinochem.com\nmanuscripk.com\nmanwahholdings.com\nmanxing.net\nmanxiu-law.com\nmanyacan.com\nmanylaw.com\nmanyoo.net\nmanyoujing.net\nmanyoukeji2024.com\nmanyoumao.com\nmanyupay.com\nmanzhai.net\nmanzhan.com\nmanzu365.com\nmanzuo.com\nmanzuocaipu.com\nmanzx.com\nmao-shen.com\nmao.fan\nmao35.com\nmaobob123.com\nmaobotv.com\nmaobugames.com\nmaodou.com\nmaodouapp.com\nmaodouketang.com\nmaoercdn.com\nmaoflag.net\nmaogang.com\nmaogepingbeauty.com\nmaogepingedu.com\nmaogp.com\nmaogua.com\nmaogumaogu.com\nmaogx.win\nmaoha.com\nmaohongdz.com\nmaojiaoque.com\nmaojiuxs.com\nmaokangbio.com\nmaoken.com\nmaoln.com\nmaolog.com\nmaomao365.com\nmaomaoche.com\nmaomaoxue.com\nmaomaoyuanma.com\nmaomijiaoyi.com\nmaomilingyang.com\nmaomob.com\nmaomp.com\nmaomp.icu\nmaono.com\nmaopaoya.com\nmaopuyouxi.com\nmaoqitian.com\nmaoqiumail.com\nmaoshanger.com\nmaotao.net\nmaotiangroup.com\nmaotuan.net\nmaotuying.com\nmaowotao.com\nmaoxia007.com\nmaoxiangai.com\nmaoxinhang.com\nmaoxinquan.net\nmaoxiongtv.com\nmaoyachen.com\nmaoyan.com\nmaoyanqing.com\nmaoye-smd.com\nmaoyi.biz\nmaoyidi.com\nmaoyigu.com\nmaoyingaipu.com\nmaoyouxi.com\nmaoyun.com\nmaoyun.tv\nmaoyuncloud.com\nmaozhishi.com\nmaozhuar.com\nmaozhuashow.com\nmap-tencent.com\nmap17.com\nmap456.com\nmap456.net\nmapabc.com\nmapbar.com\nmapeng.net\nmapfarm.com\nmapgis.com\nmapgx.com\nmaphuan.com\nmapks.com\nmaple-game.com\nmaple.ren\nmaplecheck.tech\nmaplef.net\nmapmapping.com\nmappn.com\nmaproelec.com\nmaptalks.com\nmapvq.com\nmaqingbo.com\nmaqinnews.com\nmararun.com\nmarathonbm.com\nmarathonchangsha.com\nmarazziguide.com\nmarchinfo.com\nmarco-bj.com\nmarcopolochina.com\nmarginalk.com\nmariedalgar.com\nmarimekko-hots.com\nmarine-dancer.com\nmarinedancer.com\nmarioall.com\nmarioin.com\nmariowap.com\nmarisfrolg.com\nmaritime-dg.com\nmarkdown.xyz\nmarkdream.com\nmarkedboat.com\nmarketingconv.com\nmarketingforce.com\nmarkfairwhale.com\nmarkiapp.com\nmarkji.com\nmarkjour.com\nmarkmall.com\nmarkmiao.com\nmarknum.com\nmarkorchem.com\nmarkorhome.com\nmarksmile.com\nmarljoy.com\nmarmot-cloud.com\nmaro6.com\nmarry5.com\nmars-block.com\nmarshal-ceramics.com\nmarshallscarlett.shop\nmarshotspot.com\nmarssenger.com\nmarstor.com\nmarstv.com\nmarsvis.com\nmartech365.com\nmartin8023.com\nmartincl2.me\nmartinlofts.com\nmarto.cc\nmarvelunlimitedresources.com\nmaryek.net\nmarylandtenthcavalry.org\nmas10010.com\nmas300275.com\nmasastack.com\nmascaw.com\nmasdjy.com\nmaseek.com\nmasej.com\nmaseven.com\nmasff.com\nmasgjjt.com\nmasgw.com\nmashang98.com\nmashangfangxin.com\nmashangfl.com\nmashangmai.com\nmashangshijie.com\nmashangxue123.com\nmashiro.me\nmashqkq.com\nmashrabiya-screen.com\nmasiao.com\nmasikkk.com\nmasjfc.com\nmasjinquan.com\nmaslink.com\nmaslong.com\nmason-led.com\nmason-optics.com\nmaspiece.com\nmasqhboat.com\nmass-evo.com\nmassage-hospital.com\nmassclouds.com\nmasscrunch.com\nmassestech.com\nmassx.com\nmasszxyy.com\nmasteam.com\nmaster-home.com\nmastercardnucc.com\nmasterchefworks.com\nmasterfy.com\nmastergo.com\nmasterkongchef.com\nmasterlab.vip\nmasterofmalteu.shop\nmasterofsoccer.com\nmastersay.com\nmastersim123.com\nmastodonhub.com\nmasttoards.com\nmastv.cc\nmastvnet.com\nmasyi.com\nmasyunrui.com\nmat-rev.com\nmat-test.com\nmatao.com\nmatch-much.com\nmatchboxnetwork.com\nmatchsaas.com\nmatchupexpo.com\nmatchvs.com\nmate.vip\nmateair.com\nmater-rep.com\nmaterial.istreamsche.com\nmatfron.com\nmath168.com\nmathartsys.com\nmathchina.com\nmathcn.com\nmathfan.com\nmathleague.hk\nmathoe.com\nmathpretty.com\nmati.hk\nmatistyle.com\nmatlabsky.com\nmatoaudio.com\nmatocloud.com\nmatongxue.com\nmatpool.com\nmatpool.net\nmatrix-chem.com\nmatrix-net.tech\nmatrixchuang.com\nmatrixerse.com\nmatrixscrm.com\nmatrixsens.com\nmatsubayashi-op.com\nmatsuri.icu\nmatsuri.site\nmatt33.com\nmattressmachinery.net\nmauu.me\nmawei.live\nmawentao.com\nmawhome.com\nmax-c.com\nmaxamchina.com\nmaxd.cloud\nmaxdo.net\nmaxfinesthair.com\nmaxfor-tool.com\nmaxgamehub.com\nmaxgj.net\nmaxhub.com\nmaxhub.vip\nmaxiang.info\nmaxiang.io\nmaxiaobang.com\nmaximajt.com\nmaximfiber.com\nmaxing128.com\nmaxinovel.com\nmaxio-tech.com\nmaxitas.com\nmaxjia.com\nmaxkamsofarms.com\nmaxket.com\nmaxlu.net\nmaxmindpharma.com\nmaxng.cc\nmaxok.com\nmaxonc.com\nmaxonesemi.com\nmaxonesoft.com\nmaxowen.com\nmaxpda.com\nmaxqiu.com\nmaxreader.la\nmaxreader.net\nmaxscend.com\nmaxsewing.com\nmaxspeedgf.com\nmaxtop.online\nmaxuscloud.com\nmaxviewrealty.com\nmaxway-logistics.com\nmaxwealthfund.com\nmaxwi.com\nmaxxipoint.com\nmay.ltd\nmaya09.com\nmaya777.com\nmayabot.com\nmayahuashi.com\nmayanchina.com\nmaybe2016.com\nmaycpay.com\nmaycur.com\nmaydeal.com\nmaydo.group\nmayerse.com\nmayi.com\nmayiangel.com\nmayicms.com\nmayihr.com\nmayiic.com\nmayikankan.com\nmayikt.vip\nmayima.net\nmayishebao.com\nmayishoubei.com\nmayitek.com\nmayitxt.com\nmayiui.com\nmayiw.com\nmayiwenku.com\nmayiwsk.com\nmayiyx.com\nmayizhuanlan.com\nmaylandresort.com\nmaylove2333.com\nmayora-sh.com\nmayshijia.com\nmaysun.net\nmayswind.net\nmayunbj.com\nmaywant.com\nmaywonenergy.com\nmazakii.com\nmazc.org\nmazey.net\nmazhan.com\nmazhen.tech\nmazhizuo.com\nmazida.com\nmb-go.com\nmb2p.com\nmb5u.com\nmba518.com\nmbabao.com\nmbachina.com\nmbadashi.com\nmbadbaedu.com\nmbajs.com\nmbalib.com\nmbanggo.com\nmbatrip.com\nmbazl.com\nmbazsw.com\nmbb0760.com\nmbb180.com\nmbbrowser.com\nmbbs.cc\nmbcloud.com\nmbd.pub\nmbdkjsw.com\nmbestway.com\nmbg06290pg.com\nmbg06301pg.com\nmbgo.com\nmbian.com\nmbiaohui.com\nmbigfish.com\nmbimc.com\nmbinary.xyz\nmbiosh.com\nmbitrres.net\nmbkfj1656.com\nmbksh.com\nmblaudio.com\nmbldbb.com\nmblog.club\nmblu.com\nmblyun.com\nmbo-china.com\nmbokee.com\nmbs.download.prss.microsoft.com\nmbsifu.com\nmbsuat.download.prss.microsoft.com\nmbti16cc.com\nmbtools.work\nmbwxzx.hk\nmbysrobot.com\nmbzhu.net\nmc-biolab.com\nmc-ccpit.com\nmc-dj.com\nmc-f.com\nmc-test.com\nmc-user.com\nmc-xborder.com\nmc.cc\nmc520.com\nmc91.com\nmc9y.net\nmcake.com\nmcbaas.work\nmcbang.com\nmcbao.com\nmcbbs.co\nmcbbs.jp\nmcbbs.net\nmcbeam.pro\nmcc0.com\nmcc460.pub.3gppnetwork.org\nmccbim.com\nmccchina.com\nmccshhospital.com\nmcd.cc\nmcdchina.net\nmcdemo.show\nmcdsusan.com\nmcdvisa.com\nmcearnmore.com\nmcecy.com\nmceebbs.com\nmcepchina.org\nmcfound.net\nmcfui.work\nmcfun.tv\nmcfxw.com\nmcgsjt.com\nmchanmai.com\nmchat.com\nmchifi.com\nmchim.net\nmchost.guru\nmchpk.com\nmchuiji.com\nmchweb.net\nmchxx.net\nmcidc.net\nmcit.tech\nmcjd.net\nmckuai.com\nmcloudvr.com\nmcmap.cc\nmcmarkets.com\nmcmaster-asia.com\nmcmqyc.com\nmcmsmp.com\nmcmssc.com\nmcmtek.com\nmcmusic.hk\nmcnav.net\nmcneko.com\nmcnjigou.com\nmcobj.com\nmcohmygod.com\nmcoo.cc\nmcooks.com\nmcool.com\nmcpemaster.com\nmcpfks.com\nmcpmaid.com\nmcq93.app\nmcqy.net\nmcsafebox.com\nmcsgis.com\nmcshuo.com\nmctcn.com\nmcu-home.com\nmcue.cc\nmcufan.com\nmcuisp.com\nmcusky.com\nmcuzj.com\nmcuzone.com\nmcuzx.net\nmcw99.com\nmcwell66.com\nmcwizrd.com\nmcwshop.com\nmcx666.com\nmcxyzt.cc\nmcxzs.com\nmcyhfl.com\nmcypls.com\nmcyz.com\nmczhihui.com\nmczmb.org\nmczwlt.net\nmczyz.com\nmczz.net\nmd-hmjt.com\nmd-pms.com\nmd5ma.com\nmdapp.tv\nmdbchina.com\nmdbimg.com\nmdclub.org\nmdddg.com\nmddj.com\nmddlsa.com\nmdeasydiagnosis.com\nmdeer.com\nmdex.co\nmdex.com\nmdfkyiyuan.com\nmdfors.com\nmdhky.com\nmditie.com\nmdjgjjt.com\nmdkj1.com\nmdl.ink\nmdlf.xyz\nmdm.plus\nmdmccq.com\nmdmmm.com\nmdmt.com\nmdnice.com\nmdouvip.com\nmdouwz.com\nmdpda.com\nmdpetrotech.com\nmdrmyy.com\nmdsin.com\nmdsmos.com\nmdsyzx.com\nmdtu.com\nmdupc.com\nmdvdns.com\nmdwyservice.com\nmdxs.com\nmdxw.work\nmdy-edu.com\nmdybk.com\nmdydt.net\nmdymedical.com\nmdyseducation.org\nmdyuepai.com\nmdzgjx.com\nmdzx.net\nme-city.com\nme-game.com\nme-tencent.com\nme.com\nme1.ltd\nme360.com\nme361.com\nme4399.com\nmeadin.com\nmeaningfulcloud.com\nmeanwell.cc\nmeb.com\nmebhaoya.com\nmebo.com\nmebtf.com\nmebyk.com\nmecaraiotp.org\nmechatim.com\nmechina.org\nmechr.com\nmechrevo.com\nmecoxlane.com\nmecru.com\nmecsz.com\nmecue.cc\nmed-123.com\nmed-linket.com\nmed-water.com\nmed123.com\nmed126.com\nmed139.com\nmed66.com\nmeda.cc\nmedbotsurgical.com\nmedcaren.com\nmedcmz.com\nmeddatas.com\nmedebound.com\nmedejob.com\nmedeming.com\nmedia.fantv.hk\nmedia.joycorp.co.kr\nmedia.paperclipclub.net\nmedia.trrtv.com\nmediaprima.rastream.com\nmediastory.cc\nmediatek.com\nmediaxinan.com\nmedical-union.com\nmedicalqc.com\nmedicexam.net\nmediecogroup.com\nmedifinit.com\nmedilinkthera.com\nmedinoah.com\nmediparksh.com\nmeditrustbroker.com\nmeditrusthealth.com\nmediumvis.com\nmedixcloud.com\nmedkaoyan.net\nmedlander.com\nmedlinkchina.com\nmedlinker.com\nmedlinker.net\nmedme.net\nmedmeeting.org\nmednovogroup.com\nmedrc.net\nmedreading.com\nmedris-china.com\nmedscrm.com\nmedstarcorp.com\nmedsuture.com\nmedtechshare.com\nmedtimes-hk.com\nmedtion.com\nmedwant.com\nmeecec.com\nmeegobeta.com\nmeegoe.com\nmeekdai.com\nmeeket.com\nmeeshow.com\nmeet-in-shanghai.net\nmeet99.com\nmeetbf.com\nmeetfave.com\nmeethall.com\nmeethome.com\nmeeting.so\nmeeting666.com\nmeetingmeet.com\nmeetingrj.com\nmeetlawyer.com\nmeetsite.com\nmeetsocial.com\nmeetsoho.com\nmeetsprring.com\nmeetuvip.com\nmeetwhale.com\nmeetxian.com\nmeetyoumuseum.com\nmeetzoom.net\nmefcl.com\nmefenglife.com\nmefenlife.com\nmega555net10.org\nmegaemoji.com\nmegaer.com\nmegagamelog.com\nmegagenchina.com\nmegahugo.net\nmegalithwatch.com\nmegarobo.com\nmegasig.com\nmegawords.cc\nmegcup.com\nmegmeet-welding.com\nmegobike.com\nmegou8.com\nmeguo.com\nmeguri.app\nmeguri.moe\nmegvii-inc.com\nmegvii.com\nmeheco.com\nmehecointl.com\nmei-shu.com\nmei-shu.net\nmei.com\nmei1.com\nmei1.info\nmeia.me\nmeianclean.com\nmeianjuwang.com\nmeiaoju.com\nmeiba.com\nmeibaiwu.com\nmeibanla.com\nmeibei.com\nmeibg.com\nmeibgroup.com\nmeican.com\nmeicanstatic.com\nmeichen.cc\nmeichengchongdian.com\nmeichenindustry.com\nmeichibao.com\nmeichuanchuan.com\nmeichuanmei.com\nmeichunmed.com\nmeici.com\nmeida.com\nmeidaifu.com\nmeidanylon.com\nmeidaogg.com\nmeidaojia.com\nmeide-casting.com\nmeidebi.com\nmeidecloud.com\nmeideng.net\nmeidepump.net\nmeidongauto.com\nmeidunyipin.com\nmeidusacloud.com\nmeierbei.com\nmeifang.com\nmeifang8.com\nmeifangquan.com\nmeifazhan.com\nmeifengli.com\nmeigeinc.com\nmeigongyun.com\nmeiguanjia.net\nmeiguiauto.com\nmeiguiwxw.com\nmeiguo-qianzheng.com\nmeiguogouwu.com\nmeiguoxiaoxue.com\nmeiguoxq.com\nmeigushe.com\nmeih5.net\nmeiheups.com\nmeihouyun.com\nmeihu99.com\nmeihua.info\nmeihuainfo.com\nmeihuapacking.com\nmeihuboyue.com\nmeihudong.com\nmeihutong.com\nmeiji-icecream.com\nmeijia51.com\nmeijiadaren.com\nmeijiaedu.com\nmeijiandaojia.com\nmeijianpin.com\nmeijiashang.com\nmeijiavip.com\nmeijiebijia.com\nmeijieclub.com\nmeijiedaka.com\nmeijiehang.com\nmeijiehezi.com\nmeijieku.com\nmeijiequan.com\nmeijieu.com\nmeijiexia.com\nmeijieyizhan.com\nmeijiezaixian.com\nmeijiezaixian.net\nmeijipharma.net\nmeijipower.com\nmeijiu.com\nmeijubo.com\nmeijufans.com\nmeijuniao.net\nmeijuq.com\nmeijust.com\nmeika360.com\nmeikai1979.com\nmeikanguo.com\nmeikankeji.com\nmeikao.com\nmeikeda.net\nmeikevideo.com\nmeikongte.com\nmeikr.com\nmeiktv.com\nmeiku123.com\nmeilandianzi.com\nmeilanrilan.com\nmeilaoshi.com\nmeili-inc.com\nmeili-oh.com\nmeili43.com\nmeilichengren.com\nmeilidongnanya.com\nmeiligaosu.com\nmeilijia.com\nmeilijian.com\nmeiling.com\nmeilishuo.com\nmeilishuo.net\nmeilisite.com\nmeiliwang.org\nmeiliworks.com\nmeiljiaqi.com\nmeilunmeijia.com\nmeilvtong.com\nmeimedical.com\nmeimeidu.com\nmeimeifa.com\nmeimeiriji.com\nmeimeiyouxin.com\nmeimianjiafang.com\nmeiming8.com\nmeimingbao.net\nmeimingteng.com\nmeimingxuan.com\nmeinali.com\nmeinenggas.com\nmeinenggou.com\nmeinv.com\nmeiobrand.com\nmeionetech.com\nmeip0.me\nmeip1.me\nmeip4.me\nmeipai.com\nmeipaixiu.com\nmeipeng518.com\nmeipian.me\nmeipian2.com\nmeipingmeiwu.com\nmeipuapp.com\nmeipvip.net\nmeiqiacloud.com\nmeiqiausercontent.com\nmeiqinedu.com\nmeiquankongjian.com\nmeirenchong.com\nmeirijinrong.com\nmeiritv.net\nmeirixz.com\nmeiriyiwen.com\nmeirong.net\nmeirongchuang.com\nmeirongshanghai.com\nmeishai.com\nmeishanjob.com\nmeishanren.com\nmeishe-app.com\nmeisheapp.com\nmeishesdk.com\nmeishi.cc\nmeishi13.com\nmeishichina.com\nmeishiffx.online\nmeishij.net\nmeishijr.com\nmeishilife.com\nmeishiqin.com\nmeishischool.com\nmeishiwangluo.com\nmeishizuofa.com\nmeishow.com\nmeishu.com\nmeishubao.com\nmeishutuku.com\nmeisilin.com\nmeisubq.com\nmeisupic.com\nmeitangdehulu.com\nmeitanjianghu.com\nmeitanwang.com\nmeite.com\nmeitegou.com\nmeitianhui.com\nmeitianzuche.com\nmeitie.com\nmeitifagao.com\nmeitong-tech.com\nmeitq.com\nmeitu-int.com\nmeitu-mobile.com\nmeitu.com\nmeitu.net\nmeituaccount.com\nmeituan.com\nmeituan.net\nmeitubase.com\nmeitubeauty.com\nmeitubf.com\nmeitubox.com\nmeitucam.com\nmeitucamera.com\nmeitucoffee.com\nmeitudashi.com\nmeitudata.com\nmeituduoduo.com\nmeitufamily.com\nmeitufans.com\nmeitugif.com\nmeituhezi.com\nmeituhuahua.com\nmeituinside.com\nmeitukankan.com\nmeitukiss.com\nmeitumail.com\nmeitumob.com\nmeitumobile.com\nmeitumv.com\nmeitun.com\nmeituncdn.com\nmeituo.shop\nmeitupaipai.com\nmeitupic.com\nmeitupingzi.com\nmeituriji.com\nmeiturom.com\nmeitushijie.com\nmeitushop.com\nmeitushouji.com\nmeitusiyu.com\nmeitusnap.com\nmeitustatic.com\nmeitustore.com\nmeitutaotao.com\nmeitutg.com\nmeitutietie.com\nmeituxiangji.com\nmeituxiaopu.com\nmeituxiu.com\nmeituxiuxiu.com\nmeituyidong.com\nmeituyuan.com\nmeituyun.com\nmeiwafuying.com\nmeiweibf.com\nmeiweigroup.com\nmeiweis.com\nmeiweishudan.com\nmeiwpkpu.com\nmeiwulist.com\nmeixin.com\nmeixincdn.com\nmeixinl.com\nmeixinqi.com\nmeixiong5.com\nmeiya.com\nmeiyaapp.com\nmeiyacup.com\nmeiyan.chat\nmeiyan.com\nmeiyan.tech\nmeiyanstatic.com\nmeiyatour.com\nmeiye.art\nmeiyedana.com\nmeiyi.ai\nmeiyixinrui.com\nmeiyou.com\nmeiyue.com\nmeiyujt.net\nmeiyuko.com\nmeiyuwang.com\nmeizhan.com\nmeizhandian.com\nmeizhanggui.cc\nmeizhi-cn.com\nmeizhou.com\nmeizhou.net\nmeizitu.net\nmeizu.com\nmeizu.com.hk\nmeizu.net\nmeizuapi.com\nmejorrelojes.com\nmejxw.com\nmeke8.com\nmekedoo.com\nmeldingcloud.com\nmelecode.com\nmelizhi.com\nmellowactivy.com\nmellowgroups.com\nmelon-eptc.com\nmelon.cdnetworks.com\nmelon.icu\nmeloong.com\nmelotgroup.com\nmemblaze.com\nmemewan.com\nmemeyin.com\nmemeyule.com\nmemfiredb.com\nmemofun.net\nmemorieslab.com\nmemoverflow.com\nmems.me\nmemsconsulting.com\nmemsensing.com\nmemsflex.com\nmemsic.com\nmemuplay.com\nmemuu.com\nmemyy.com\nmen.ci\nmenchuang.biz\nmenchuang58.com\nmenci.xyz\nmendale.com\nmendd.com\nmenducn.com\nmeng-model.com\nmeng2u.com\nmeng3.com\nmeng800.com\nmengaite.com\nmengarchitects.com\nmengat.com\nmengbige.com\nmengchongzu.com\nmengdian.com\nmengdie.com\nmengdoc.com\nmengdoctor.com\nmengdodo.com\nmengensha.com\nmengfm.com\nmenggang.com\nmenggaole.com\nmenghuimengtu.com\nmenghunli.com\nmengjiagames.com\nmengjianjiemeng.com\nmengkang.net\nmengkm.com\nmenglan.com\nmenglechong.com\nmenglegame.com\nmenglu.com\nmengmayw.com\nmengmei.org\nmengniang.tv\nmengniuarla.com\nmengniuir.com\nmengou.net\nmengqingpo.com\nmengqiuju.com\nmengsang.com\nmengso.com\nmengte.online\nmengtian.com\nmengtuiapp.com\nmengvlog.com\nmengxi.com\nmengxiang.com\nmengxiangeka.com\nmengxintianxia.com\nmengxyz.com\nmengya.com\nmengyanggroup.com\nmengyin.cc\nmengyou.org\nmengzhou.com\nmengzhuangxiu.com\nmengziyuan.com\nmengzuji.com\nmenhu.io\nmenksoft.com\nmenpad.com\nmenpiao.com\nmenpiaotuangou.com\nmenshiny.com\nmentamob.com\nmentorsc.com\nmentrends.com\nmenu-static.gog-statics.com\nmenubarx.app\nmenwee.com\nmenww.com\nmenwww.com\nmenxue.com\nmenyuannews.com\nmeoof-pet.com\nmeovse.com\nmeow.plus\nmeowcat.org\nmepai.me\nmepcec.com\nmepoem.com\nmeppon.com\nmeqlm.org\nmerach.com\nmercedes-benzarena.com\nmerchaincargo.com\nmercitime.com\nmereith.com\nmergeek.com\nmerivox.net\nmerklechina.com\nmerkpd.com\nmerlinmedicine.com\nmero-db.com\nmerries-china.com\nmerroint.com\nmerryhome.com\nmerucario.com\nmescroll.com\nmeshiot.com\nmesince.com\nmesnac.com\nmesonart.com\nmesou.net\nmesowe.com\nmesresearch.com\nmessawith.com\nmessecloud.com\nmeta-stone.com\nmeta-verse.co\nmeta-xuantan.com\nmeta.law\nmetacd.com\nmetal-min.com\nmetal-tube.com\nmetal.com\nmetalchina.com\nmetalrevolution.com\nmetalsinfo.com\nmetalyoung.com\nmetaoptronics.com\nmetaplanet3023.com\nmetasecurities.com\nmetastonecorp.com\nmetastudioxr.com\nmetastudy.vip\nmetasyun.com\nmetatrader4.com\nmetatrader5.com\nmetatube.pro\nmetavatar.cc\nmetawalle.com\nmetax-tech.com\nmetayuanjing.com\nmetcn.com\nmeten.com\nmeteni.com\nmetenk12.com\nmeteric.com\nmetersbonwe.com\nmetin520.com\nmetispharma.com\nmetnews.net\nmetong.com\nmetools.info\nmetro-3d.com\nmetroer.com\nmetrofastpass.com\nmetropolohotels.com\nmetroshield.com\nmetrowatch.net\nmetstr.com\nmetword.co\nmeu95otw4967t.com\nmeuicat.com\nmeutu.com\nmevionchina.com\nmew.fun\nmewchan.com\nmewx.art\nmexingroup.com\nmexontec.net\nmexxum.com\nmeyet.net\nmeyoufreight.com\nmeyum1688.com\nmezamca.com\nmezhiyu.com\nmezw.com\nmf-y.com\nmf08s.com\nmf1288.com\nmf999.com\nmfaeb.ltd\nmfbrjc.com\nmfbuluo.com\nmfcad.com\nmfcad.net\nmfcpx.com\nmfcteda.com\nmfcyun.com\nmfdl666.com\nmfdns.com\nmfdzqj.com\nmfexcel.com\nmfg-magnets.com\nmfgchn.com\nmfhcd.com\nmfinetech.com\nmfisp.com\nmfjl.wiki\nmfjxcn.com\nmfk.com\nmflady.com\nmfniu.com\nmfpad.com\nmfpay.net\nmfqqx.com\nmfqyw.com\nmfsj1908.com\nmftianshanam.com\nmftvideo.com\nmfunz.com\nmfwxpay.com\nmfxlawyer.com\nmfzl.net\nmfzxcs.com\nmg-cdn.com\nmg-pen.com\nmg21.com\nmg3721.com\nmgaqehzm.com\nmgcan.com\nmgcmehzt.com\nmgd5.com\nmgdq.net\nmgdzz.com\nmgenbio.com\nmgenware.com\nmgff.com\nmgfty.com\nmgfy88.com\nmggtech.vip\nmgh2-lab.com\nmgjianshe.com\nmgkj.vip\nmgkjht.com\nmgl9.com\nmglhx.com\nmglip.com\nmgm255.com\nmgmgrandsanya.com\nmgmovie.net\nmgmusic.vip\nmgnav.com\nmgobe-webattle.com\nmgongkong.com\nmgplay.com.tw\nmgryekby.com\nmgsdk.com\nmgse.info\nmgskfjfod25.com\nmgskfjfod31.com\nmgskfjfod40.com\nmgslb.com\nmgslb.net\nmgslb.org\nmgsp.fun\nmgtv.com\nmgtv2025.com\nmgugaklive.nowcdn.co.kr\nmgw999.com\nmgwxw.com\nmgxf.com\nmgxzsy.com\nmgys.cc\nmgyxw.net\nmgyyw.com\nmgzf.com\nmgzxzs.com\nmh-rjgb.com\nmh160.cc\nmh456.com\nmh51.com\nmh9.cc\nmhacn.com\nmhacn.net\nmhaoma.com\nmhbras.com\nmhcharging.com\nmhealth100.com\nmhfotos.com\nmhhf.com\nmhhf.net\nmhi-ac.com\nmhinele.com\nmhito.net\nmhkami.com\nmhkcomment.com\nmhnzww.com\nmhome.com\nmhotels.design\nmhpdf.com\nmhpin.com\nmhrooz.xyz\nmhskso.sbs\nmht.la\nmht.tw\nmhtclub.com\nmhtes.com\nmhtyd.com\nmhtzjt.com\nmhv2.net\nmhw315.com\nmhwck.com\nmhwh168.com\nmhwmm.com\nmhwy2.com\nmhxk.com\nmhxzhkl.com\nmhystatic.com\nmhyun.net\nmhzd.cc\nmhzd.net\nmi-ae.com\nmi-ae.net\nmi-cache.com\nmi-cdn.com\nmi-customer.com\nmi-dong.com\nmi-dun.com\nmi-fds.com\nmi-fds.net\nmi-idc.com\nmi-img.com\nmi-img1.com\nmi-img2.com\nmi-img3.com\nmi-img4.com\nmi-img5.com\nmi-static.com\nmi.com\nmi0.cc\nmia.com\nmiaibox.com\nmiak.work\nmian520.com\nmianbao.com\nmiancp.com\nmiandanbx.com\nmianfa.org\nmianfeiic.com\nmianfeiquming.com\nmianfeiwendang.com\nmianfeiwucan.org\nmianfeiziti.com\nmianhuatang.cc\nmianhuatang.la\nmianjue.com\nmiankousucai.com\nmianmoi.com\nmianshiya.com\nmianshui365.com\nmianwai.com\nmianyangauto.com\nmianyanghuida.com\nmianyaojsj.com\nmianyazulin.com\nmianzhouhotel.com\nmiao-lang.com\nmiao15777790078.com\nmiaobe.com\nmiaobige.com\nmiaobolive.com\nmiaoche.com\nmiaocode.com\nmiaodiyun.com\nmiaodongbar.com\nmiaodongshenghuo.com\nmiaogongzi.cc\nmiaogongzi.net\nmiaohuiyanyi.com\nmiaojibrand.com\nmiaokaikeji.com\nmiaokaiyun.com\nmiaokan.com\nmiaokan100.com\nmiaolaoshi.com\nmiaolianyunapp.com\nmiaolingbio.com\nmiaomaicar.com\nmiaomiaolock.com\nmiaomiaowork.com\nmiaomiaoxue.com\nmiaomiaoz.com\nmiaomiaozhe.com\nmiaomiaozhua.com\nmiaomu.com\nmiaomuzhan.com\nmiaoo.me\nmiaopai.com\nmiaoqutimes.com\nmiaosha.com\nmiaoshou.cc\nmiaoshou.com\nmiaoshou.net\nmiaoshoucdn.com\nmiaoshufang.com\nmiaoshuwu.com\nmiaoshuzhai.net\nmiaoso.com\nmiaostreet.com\nmiaov.com\nmiaovps.com\nmiaoweijianfei.com\nmiaowenhk.com\nmiaowlabs.com\nmiaowutech.com\nmiaoxiazai.com\nmiaoyanai.com\nmiaoyin.pw\nmiaoyun.link\nmiaozanba.com\nmiaozao.com\nmiaozhan.com\nmiaozhun.com\nmiaozhunjing.net\nmiaozuo.com\nmiawycxs.com\nmiaxis.com\nmiaxis.net\nmibao.com\nmibaoxian.com\nmibei.com\nmic-s.com\nmicai.com\nmicai315.com\nmicaihu.net\nmicaiying.com\nmicamika.com\nmicang.com\nmicblo.com\nmice-gz.org\nmicecn.com\nmichaelapp.com\nmichoi.com\nmichong.com\nmichplay.com\nmiclle.com\nmico.io\nmicode.net\nmicoe.com\nmicro-bee.com\nmicro-bridge.com\nmicro-game-client.com\nmicro-x.net\nmicroaiav.com\nmicrobeee.com\nmicrobell.com\nmicrobt.com\nmicrocai.org\nmicrocardio.com\nmicrochampion.com\nmicrodiag.com\nmicrodreams.com\nmicroesim.com\nmicrofotos.com\nmicrofountain.com\nmicronetpay.com\nmicrorui.net\nmicrosate.com\nmicrosoftsa.com\nmicrostarsoft.com\nmicrostern.com\nmicrosword.net\nmicrotrading.com\nmicrovcard.com\nmicrovirt.com\nmicrovoip.com\nmicrowear.com\nmicrowoo.com\nmicrowu.com\nmicroxiang.com\nmicroyan.com\nmicrozuji.com\nmictormedical.com\nmicu.hk\nmicw.com\nmicyjz.com\nmid-link.net\nmidaapi.com\nmidadata.com\nmidainc.com\nmidanyi.com\nmidasbuy.com\nmiddleschoolcounselor.com\nmidea-buy.com\nmidea-group.com\nmidea-hotwater.com\nmidea.com\nmidea.com.tr\nmideabiomedical.com\nmideadc.com\nmideaepay.com\nmideaepayuat.com\nmideav.com\nmideazy.com\nmidecopharm.com\nmidi-cn.com\nmidian.com\nmidiclouds.com\nmidicn.com\nmidifan.com\nmidingdong.com\nmidiplus.com\nmidita.com\nmiditools.net\nmidiyinyue.com\nmidlele.com\nmidonglab.com\nmidongtech.com\nmidongtech.xyz\nmidu.com\nmiduiedu.com\nmidukanshu.com\nmidureader.com\nmidust.com\nmidway.run\nmieco.net\nmiecod.com\nmieevents.com\nmiemie.la\nmiercn.com\nmieseng.com\nmifacelive.com\nmifan365.com\nmifangba.com\nmifanli.com\nmifanlicdn.com\nmifei.com\nmifeng.plus\nmifengchengshi.com\nmifengv.com\nmifengvv.com\nmifengxiuchang.com\nmifengzd.com\nmifengzhibo.com\nmifenlife.com\nmifispark.com\nmifjhgq.xyz\nmifon.com\nmifpay.com\nmifwl.com\nmigames.com\nmigelab.com\nmightsquare.com\nmiglioriorologi.com\nmigood.net\nmigu.store\nmigucloud.com\nmigufm.com\nmigufun.com\nmigugk.com\nmigugu.com\nmiguku.com\nmigumaotrip.com\nmigutv.com\nmiguvideo.com\nmiguyu.com\nmihanw.com\nmihayo.com\nmihayou.com\nmihopacking.com\nmihoyo.com\nmihoyocg.com\nmihoyocloud.com\nmihoyogift.com\nmihoyomall.com\nmihuachat.com\nmihuangame.com\nmihuashi.com\nmihuatown.com\nmihui365.com\nmihulu.com\nmihuwa.com\nmiicp.com\nmiidc.com\nmiidii.tech\nmiidim.com\nmiiee.com\nmiiiw.com\nmiiiw.net\nmiinaa.com\nmiinsurtech.com\nmiit-icdc.org\nmiit-kjcg.com\nmij.cc\nmijewelries.com\nmiji8.com\nmijia.tech\nmijian360.com\nmijiannet.com\nmijiayou.com\nmijiayoupin.com\nmijisou.com\nmijwed.com\nmika123.com\nmike-x.com\nmikeauth.com\nmikechen.cc\nmikecrm.com\nmikemessiha.com\nmikeoperfect.com\nmikesent-awareness-02.com\nmikesent-awareness-04.com\nmikesent.net\nmikeyouxi.com\nmikge.com\nmikika.com\nmiko007.com\nmikoshu.me\nmiku.ink\nmiku01.cc\nmikuac.com\nmikublog.com\nmikucdn.com\nmikuclub.fun\nmikudm.com\nmikumikumi.xyz\nmilan.com\nmilan520.com\nmilanshishang.com\nmilanvip.com\nmilchips.com\nmileage.vip\nmilejia.com\nmilemovie.com\nmileshub.net\nmileweb.com\nmilianshe.com\nmiliantech.com\nmiliao.com\nmilido.vip\nmilihua.com\nmilike.com\nmilimao.com\nmilimili.tv\nmiliol.com\nmiliol.org\nmilipictures.com\nmilitadowatch.com\nmiliyo.com\nmilkjpg.com\nmilliant.com\nmilliway-ic.com\nmillnovel.com\nmilnews.com\nmilo-star.com\nmiloktv.com\nmiloli.info\nmilsay.com\nmilu.com\nmilubtyx.com\nmilusybt.com\nmilvtong.com\nmilvzn.com\nmilyf.com\nmimangfei.com\nmimayun.com\nmimi123.vip\nmimi518.com\nmimidi.com\nmimimeu.com\nmimiteng.com\nmimixiaoke.com\nmimiyc.net\nmimo51.com\nmimomim.com\nmimoprint.com\nmimouse.net\nmimvp.com\nminapp.com\nminapp.xin\nmincdn.com\nmind-home.net\nmind-medi.work\nmindai.com\nmindcherish.com\nmindcontroles.com\nmindechem.com\nmindlabpros.site\nmindmanagerchina.com\nmindmm.com\nmindpin.com\nmindray.com\nmindshow.fun\nmindstore.io\nmindsun.com\nmindway-sz.com\nminebbs.com\nminecraftxz.com\nminecraftzw.com\nminegoods.com\nminei.com\nmineplugin.org\nmineraltown.net\nminerfun.com\nminerhome.com\nminewtech.com\nminfengmuye.com\nminfengtianfu.com\nminfufa.com\nming-med.com\nming-men.com\nminganmed.com\nmingbianji.com\nmingbiao001.com\nmingbiaohao.com\nmingcalc.com\nmingchao.com\nmingchaoonline.com\nmingchaoyouxi.com\nmingchu.co\nmingci.org\nmingcihospital.com\nmingcloud.net\nmingczh.com\nmingdanwang.com\nmingdao.com\nmingdao.net\nmingdao8.com\nmingdaocloud.com\nmingdazhongxue.com\nmingdejx.com\nmingdongman.com\nmingdutech.com\nmingechina.com\nmingfengtang.com\nmingfucdn.com\nmingfucloud.com\nmingfudns.com\nmingfuyun.com\nminghaoshangwu.com\nminghecloud.com\nmingheng-group.com\nmingheyaoye.com\nmingheyiyao.com\nminghezhi.com\nminghuatang.com\nminghuaxinda.com\nminghuishijia.com\nmingin.com\nmingjiachina.com\nmingjian.com\nmingjian365.com\nmingjian365.net\nmingjignfang.com\nmingjinglu.com\nmingjiudu.com\nmingjuyoupin.com\nmingkj.com\nminglian.com\nminglunlaw.com\nmingmen-tech.com\nmingpian.biz\nmingpian.net\nmingqi.co\nmingqian666.com\nmingqu.xyz\nmingr.com\nmingren888.com\nmingricctv.com\nmingrsoft.com\nmingshi100.com\nmingshi100.net\nmingshi51.com\nmingshi58.com\nmingshiedu.com\nmingshisanling.com\nmingsoft.net\nmingstar.net\nmingtaimed.com\nmingtaokeji.com\nmingtejia.com\nmingtian.com\nmingtou.com\nmingxigu.com\nmingxingku.com\nmingxinglai.com\nmingxuan.store\nmingya.mobi\nmingyang100.com\nmingyangtek.com\nmingyangyinhe.com\nmingyannet.com\nmingyantong.com\nmingyaohui.com\nmingyaoruci.com\nmingyaweb.com\nmingyi.com\nmingyihui.net\nmingyou360.com\nmingyu-porcelain.com\nmingyuanfund.com\nmingyuanmuye.com\nmingyuanyun.com\nmingzhi-tech.com\nmingzhucable.com\nmingzhujs.com\nmingzhuoedu.com\nmingzhuxiaoshuo.com\nmingzihui.com\nminhang.cc\nminhangshi.com\nminhow.com\nmini-audio.com\nmini-banana.com\nmini-ease.com\nmini-program-acc.com\nminiadx.com\nminiaixue.com\nminiapida.com\nminiapp.fun\nminiapp360.com\nminiappss.com\nminibai.com\nminibg.com\nminiblink.net\nminidaxue.com\nminidso.com\nminieye.cc\nminieye.tech\nminigame.com\nminigameam.com\nminigui.com\nminigui.org\nminihaowan.com\nminiluck.com\nminimaituan.com\nminimax.chat\nminimaxi.com\nmining120.com\nmininglamp.com\nminip-service.com\nminipacs.com\nminiprogramadmin.com\nminirizhi.com\nminisforum.com\nminishops.co\nminiso-au.com\nminiso.com\nminisoyo.com\nministudy.com\nminitiao.com\nminiui.com\nminixiazai.com\nminiyounger.com\nminjichem.com\nminkave.com\nminking.cc\nminleai.com\nminli.com\nminmetals.com\nminor-tech.com\nminovapharma.com\nminpayment.com\nminqiao.com\nminra.com\nminretail.com\nminshangjie.com\nminshengec.com\nminshengjob.com\nminshenglife.com\nminshop.com\nminstrans.com\nmintaibank.com\nmintake.com\nmintaylor.com\nmintimate.cc\nmintix.store\nmintmuse.com\nmintrust.com\nmints-id.com\nminunix.com\nminxing365.com\nminxiwang.com\nminxue.net\nminyukji.com\nminyunit.cool\nminz.press\nminzu56.net\nmionerxrospeo.com\nmionexmailerc2.com\nmionexmailero1.com\nmiooku.com\nmiospay.com\nmiot-spec.org\nmiotech.com\nmipa.fun\nmipahui.com\nmipangwang.com\nmipay.com\nmipay.net\nmipcdn.com\nmipengine.com\nmipengine.org\nmipkj.com\nmiplus.cloud\nmippaper.com\nmipplan.com\nmipplan.org\nmipuo.com\nmipush.com\nmiqixuan.net\nmiquapp.com\nmir4399.com\nmir6.com\nmiracdn.com\nmiraclelaser.com\nmiracleplus.com\nmiraclevision.com\nmiraclevision.net\nmiracomotor.com\nmirahomes.shop\nmiratama.com\nmiravia.es\nmiredian.com\nmirgaga.net\nmiri.site\nmirmzhy.com\nmirreal.net\nmirrorcast.tv\nmirrorchyan.com\nmisaka.center\nmisakamoe.com\nmisall.com\nmiscd.com\nmishang.com\nmishangkeji.com\nmishuhome.com\nmisiai.com\nmisintlschool.com\nmiso-lab.com\nmispos.cc\nmisrm.com\nmisrm.net\nmissevan.com\nmissfresh.net\nmisshachina.com\nmisshcl.com\nmissionhillschina.com\nmissjia.net\nmisslele.com\nmisstar.com\nmissyuan.net\nmisuland.com\nmisunly.com\nmitalk.com\nmitang.com\nmitangtuan.com\nmitao.bar\nmitaoping.com\nmitaowu.com\nmitay.net\nmiteno.com\nmitertec.com\nmitesi.com\nmitotoo.com\nmitpgxvm.com\nmitsubishielectric-mesh.com\nmitsuha.space\nmitsuiplastics-shanghai.com\nmittrchina.com\nmituancm.com\nmituyuedu.com\nmitvos.com\nmitvos.net\nmiued.com\nmiui.com\nmiuiver.com\nmiulab.com\nmiusi.co\nmiuss.icu\nmiutour.com\nmiutrip.com\nmiwaimao.com\nmiwap.com\nmiwifi.com\nmiwuad.com\nmiwuzhentan.com\nmix-planet.com\nmix.moe\nmixbao.com\nmixcapp.com\nmixcm.com\nmixdesk.net\nmixdo.net\nmixian88.com\nmixiaojin.com\nmixin.cc\nmixinshe.com\nmixiong.tv\nmixkr.com\nmixly.org\nmixmind.com\nmixmoe.com\nmixpwr.com\nmixrnb.com\nmixueedu.com\nmixvvideo.com\nmiyabaobei.com\nmiyaboke.com\nmiyachat.com\nmiyanlife.com\nmiyapay.com\nmiyateam.com\nmiyatech.com\nmiyilink.com\nmiyoushe.com\nmiyouu.com\nmiyuangz.com\nmiyun-ecomarathon.com\nmiyun.com\nmiyun360.com\nmiyuncms.com\nmizhai.com\nmizhe.com\nmizhiji.com\nmizhimedia.com\nmizhionline.com\nmizhizbf.vip\nmizhuan.me\nmizone.cc\nmizuda.com\nmizuki2.com\nmj110.net\nmj365.club\nmj365.site\nmj365.vip\nmj567.com\nmj85.com\nmjasoft.com\nmjatm.com\nmjcec.com\nmjceo.com\nmjecu.com\nmjgxsc.com\nmjgysm.com\nmjh5.com\nmjia.cc\nmjjcn.com\nmjjq.com\nmjlong.com\nmjlsh.com\nmjmjm.com\nmjoys.com\nmjqishi.com\nmjt288.com\nmjtcsb.com\nmjtom.com\nmjttt.com\nmjxhgdl.com\nmjxpay.com\nmjyg.com\nmjylbj.com\nmjyun.com\nmjyx.com\nmjyxkf.com\nmjzcnd.com\nmjzhcl.com\nmjzj.com\nmjzq.net\nmk-yiliao.com\nmk169.com\nmk2048.com\nmk5.xyz\nmkaq.org\nmkb0898.com\nmkdata.top\nmkf.com\nmki7rxcwmfe7c.com\nmkjump.com\nmkkcn.com\nmklimg.com\nmklist.com\nmkmchina.com\nmkn666.com\nmkpum.com\nmkpush.com\nmkqh.com\nmkqst.com\nmkrobot.org\nmkrviu.sbs\nmkshell.com\nmkstone.club\nmksucai.com\nmktcreator.com\nmktdatatech.com\nmktoys.com\nmktzb.com\nmktzr.com\nmkvcn.com\nmkwhat.com\nmkzcdn.com\nmkzhan.com\nmkzhan.net\nmkzhou.com\nmkzoo.com\nmlabc.com\nmlairport.com\nmlayt14.com\nmlbaikew.com\nmlc.cc\nmlexpo.com\nmlfjnp.com\nmlfkc.net\nmlgj.com\nmlgxw.org\nmlhimalayanxt.com\nmlhld.com\nmlibaba.com\nmlibrarys.com\nmliev.com\nmlink.tv\nmlinkapp.com\nmlinks.cc\nmlinks.co\nmlito.com\nmlj122.com\nmlj125.com\nmlj130.com\nmlj162.com\nmlj194.com\nmlj36.com\nmlj93.com\nmljtevy.com\nmljydoors.com\nmlkmba.com\nmllj.net\nmlmcms.com\nmlmtz.com\nmlnk.me\nmlnsoft.net\nmlocso.com\nmlogcn.com\nmlpzes05.com\nmlqdpdgf.sbs\nmlrcn.com\nmlrlzy.com\nmlrzsj.com\nmlsbmw.com\nmlsh.net\nmlsub.net\nmlszp.com\nmlt.pub\nmltrans.net\nmlunwen.com\nmlwanwan.com\nmlwdpx.com\nmlwed.com\nmlwplus.com\nmlwu.net\nmlxks.com\nmlxx.com\nmlycdn.com\nmlychee.com\nmlyfc.net\nmlyfcyy.com\nmlyns.com\nmlyx.com\nmlzs2008.com\nmm-sh.com\nmm.com\nmm111.net\nmm131.kim\nmm1357.com\nmm138.com\nmm2hservices.com\nmm3yy.com\nmm8mm8.com\nmmall.com\nmmaqa.com\nmmarket.com\nmmarket6.com\nmmatch.tech\nmmbang.com\nmmbang.info\nmmbang.net\nmmbao.com\nmmbest.com\nmmbjq.com\nmmbread.com\nmmc-data.com\nmmcl.net\nmmcloud.com\nmmcos.com\nmmdtt.com\nmmegg.com\nmmfad.com\nmmgl.net\nmmgo.com\nmmgogo.com\nmmgoodcar.com\nmmhygame.com\nmmi-shanghai.com\nmmia.com\nmmim8.com\nmmj.vip\nmmjbh.com\nmmjynet.com\nmmjzxh.com\nmmlessin.com\nmmllllasjd.com\nmmmglobalgroup.com\nmmmmmmm.com\nmmmnote.com\nmmmrz.com\nmmmtech.com\nmmods.site\nmmogg.net\nmmoist.com\nmmonly.cc\nmmoser.work\nmmosite.com\nmmqidian.com\nmmrcw.com\nmms591.com\nmmsase.com\nmmsccn.com\nmmscoo.com\nmmsfw.com\nmmsk.com\nmmt3000.com\nmmtch.com\nmmtx.net\nmmuaa.com\nmmww.com\nmmxchina.com\nmmxiaowu.com\nmmxmmx.com\nmmyj.com\nmmyxshop.com\nmmyz.net\nmmzcn.com\nmmzh.com\nmmzj.com\nmn-soft.com\nmnancheng.com\nmnbvbqw.com\nmnbvdfg.com\nmnbvtgv.com\nmndqlib.net\nmnengine.com\nmnfqw.org\nmnihyc.com\nmnjj.group\nmnpc.net\nmnwww.com\nmo-co.com\nmo298.com\nmo2g.com\nmo7.cc\nmo9.com\nmoa06181ju.com\nmoa06211ju.com\nmoa06240ju.com\nmoa06250ju.com\nmoage.com\nmob55.com\nmobai.sbs\nmobaibox.com\nmoban.com\nmobanhao.com\nmobanjing.com\nmobanku.com\nmobanlane.com\nmobanma.com\nmobantiankong.com\nmobantu.com\nmobanwang.com\nmobanyun.com\nmobao.online\nmobaoo.net\nmobartsgame.com\nmobawan.com\nmobayx.com\nmobcells.com\nmobcent.com\nmobcloud.mobi\nmobdna.com\nmobeehome.com\nmobgroupbuy.com\nmobhui.com\nmobiapp.cloud\nmobibao.com\nmobibrw.com\nmobike.com\nmobile.ccdntech.com\nmobileanjian.com\nmobilebone.org\nmobilegamebase.com\nmobilegamecdn.com\nmobilelegends.com\nmobilemgr-global.com\nmobilemgr-global.net\nmobileppp.com\nmobiletrain.org\nmobileztgame.com\nmobispeaker.com\nmobjz.com\nmobkeeper.com\nmobking.biz\nmoblazer.com\nmobmore.com\nmobo168.com\nmoboage.com\nmoboplayer.com\nmobotap.com\nmobring.co\nmobrtb.com\nmobsdks.com\nmobsurl.com\nmobtou.com\nmobvoi.com\nmobwan.com\nmocache.com\nmocafilm.com\nmocartoon.com\nmochafengbao.com\nmochai.store\nmochateam.com\nmochi.website\nmochiwang.com\nmochouu.com\nmoci6.com\nmockingbot.com\nmockuai.com\nmocn.cc\nmoco-mall.com\nmocreak.com\nmocusez.site\nmocuz.com\nmodao.cc\nmodao.com\nmodao.io\nmodaogz.com\nmodashi.net\nmodb.cc\nmodb.pro\nmodelarts-infer.com\nmodelarts-maas.com\nmodelevel.com\nmodelltd.com\nmodelones.com\nmodelscope.net\nmodelwhale.com\nmodeng178.com\nmodengtianshi.com\nmoderatep.com\nmodernavenue.com\nmoderner.com\nmoderno2.com\nmodernsky.com\nmodernweekly.com\nmodevol.com\nmodian.com\nmodianverse.com\nmodificatiy.com\nmodooplay.com\nmodouwangluo.com\nmodstart.com\nmodudaojia.com\nmodujx11.com\nmodujx13.com\nmodujx14.com\nmodujx15.com\nmodujx16.com\nmoduyun.com\nmodxz.com\nmoe-box.com\nmoe.im\nmoe.so\nmoe.tips\nmoe.xin\nmoe123.com\nmoe123.org\nmoe321.com\nmoeclub.org\nmoedot.net\nmoeelf.com\nmoefactory.com\nmoefantasy.com\nmoefou.org\nmoegirl.tw\nmoehot.com\nmoehu.org\nmoehui.com\nmoeid.com\nmoeigfx.com\nmoejp.com\nmoeking.me\nmoeli123.com\nmoemiao.net\nmoerlong.com\nmoetu.club\nmoetu.org\nmoetuji.com\nmoeub.com\nmoeworld.tech\nmoex.ink\nmoeyuuko.com\nmoeyy.xyz\nmoezx.cc\nmofacdnode.com\nmofadns.online\nmofahou.com\nmofang.com\nmofang.jp\nmofangchuxing.com\nmofangge.com\nmofanghr.com\nmofangshe.com\nmofangwang.com\nmofangyu.com\nmofanodes.com\nmofashi.ltd\nmofavideo.com\nmofazhu.com\nmoffettai.com\nmofile.com\nmofishgames.com\nmofoun.com\nmofunenglish.com\nmogao.com\nmogecloud.com\nmogecloud.net\nmogengyun.com\nmogengyun.net\nmogezhouyi.com\nmogher.com\nmogoedit.com\nmogohd.com\nmogojob.com\nmogoo.com\nmogoroom.com\nmogu.com\nmogu.io\nmogua.co\nmogucdn.com\nmoguding.net\nmoguf.com\nmogujia.com\nmogujie.com\nmogujie.org\nmogujielive.com\nmogumiao.com\nmogutong.com\nmoguv.com\nmoguvet.com\nmoguyun.com\nmoh.cc\nmoh7.com\nmohangkeji.net\nmohjdvh.com\nmohou.com\nmohu.org\nmohuishou.com\nmoihu.com\nmoimg.net\nmoissture.com\nmoith.com\nmoji.com\nmoji001.com\nmoji002.com\nmojicb.com\nmojicdn.com\nmojichina.com\nmojichina.net\nmojidict.com\nmojidoc.com\nmojie.app\nmojie.co\nmojie.kim\nmojieai.com\nmojitest.com\nmojitok-c.com\nmojocube.com\nmojusteel.com\nmojy.xyz\nmok8uptsmk19.com\nmokahr.com\nmokamrp.com\nmokatyper.com\nmokayuedu.com\nmoke.com\nmokeyjay.com\nmoko.cc\nmokra.house\nmokxing.com\nmolbase.com\nmolbase.net\nmolcoo.com\nmoldinginductor.com\nmoldnano.com\nmoleecel.com\nmolefitting.com\nmolerose.com\nmolesdn.com\nmolibaike.com\nmolihe.cc\nmolihua.net\nmolihuadami.com\nmolilian.com\nmolilier.com\nmolimoli.tech\nmoliplayer.com\nmolipy.com\nmoliqiji.com\nmolishe.com\nmolixiangce.com\nmollervilla.com\nmolt.win\nmolwater.com\nmolygoo.com\nmom001.com\nmoma-hz.com\nmombuybuy.com\nmoment.fun\nmomentad.com\nmomentcake.com\nmomhui.com\nmomishi.com\nmommygf.com\nmomo35.com\nmomoapk.com\nmomobako.com\nmomocdn.com\nmomoda8.com\nmomokuba.com\nmomooyo.com\nmomotn.com\nmomoyu.cc\nmomoyu.com\nmomoyuyouxi.com\nmomzs.com\nmonadyneed.com\nmonaite.com\nmonarch-sw.com\nmondaymorningmtg.com\nmoneak.com\nmonengu.com\nmonengugame.com\nmoneydata.hk\nmonfetch.com\nmongac.com\nmonhun.fun\nmonidai.com\nmonidata.com\nmoniex-verifyb.com\nmonika.love\nmonitoring.qpdp1.net\nmonkeylsp.com\nmonknow.com\nmono.work\nmonolink.net\nmonph.com\nmonsterlin.com\nmontage-tech.com\nmonternet.com\nmontnets.com\nmontres8.com\nmonurhineas.com\nmonv.com\nmonxin.com\nmoocollege.com\nmooctest.net\nmoodmoon.com\nmoodoon.com\nmooiee.com\nmoojing.com\nmoojnn.com\nmoolsun.com\nmoomoo.com\nmoomooequity.com\nmoomootrustee.com\nmoomv.com\nmoon-insight.com\nmoonbasa.com\nmoonbio.com\nmoonbitlang.com\nmoonbt.com\nmooncell.wiki\nmoonfly.net\nmoongood.com\nmooninbox.com\nmoonjer.com\nmoonlian.com\nmoonsec.com\nmoonsees.com\nmoonshot.ai\nmoonstatistics.com\nmoonton.com\nmoontonapp.com\nmoontontech.net\nmoonvy.com\nmoonvy.cool\nmooooc.com\nmooool.com\nmooore.net\nmoooyu.com\nmoore.ren\nmoore8.com\nmoorecat.com\nmooreelite.com\nmooreiot.com\nmoorext.com\nmoowo.com\nmooyuu.com\nmooyy.com\nmop.com\nmopaas.com\nmopair-erm.net\nmopcn.com\nmopei8.com\nmoper.me\nmoper.net\nmopicer.com\nmopin.cc\nmopo.com\nmopoint.com\nmopsky.com\nmopxz.com\nmoqie.com\nmoqiehome.com\nmoqifei.com\nmoqikaka.com\nmoqilin.net\nmoqing.com\nmoqingtk.com\nmoqipobing.com\nmoqiwanba.com\nmoqu8.com\nmoquseo.com\nmoraex.com\nmorange.shop\nmordernstone.com\nmorechinese.cc\nmoreck.com\nmoredian.com\nmorefood.com\nmorefreegame.com\nmorefun-philippines.com\nmorefunstudio.com\nmorefuntengyun.com\nmoregy.com\nmoreless.io\nmorelink.net\nmoremeat.com\nmorequick.net\nmoresing.com\nmorestep.com\nmorethan.tv\nmoretickets.com\nmorevfx.com\nmorewis.com\nmorewiscloud.com\nmorganstanleyhuaxin.com\nmorgendesign.com\nmorihei.net\nmorketing.com\nmorketinglearn.com\nmorketingsummit.com\nmorlab.com\nmorning.work\nmorningcore.com\nmorninghan.com\nmorninginn.com\nmorningwhistle.com\nmorong-elec.com\nmorrisco.cc\nmorstar.net\nmoschat.com\nmoseacg.com\nmoseeker.com\nmosesenglish.com\nmosgcj.com\nmoshanghotel.com\nmoshanghua.net\nmosheng520.com\nmoshengliang.com\nmoshike.com\nmoshou.com\nmoshua.net\nmoshuai.cc\nmosoga.net\nmossimo.net\nmossle.com\nmostch.com\nmostmob.com\nmostsd.com\nmosuzi.com\nmotanku.com\nmotel168.com\nmotherchildren.com\nmotic-electric.com\nmotie.com\nmotieimg.com\nmotiezw.com\nmotilive.com\nmotimaster.com\nmotimo.com\nmotisky.com\nmoto-one.com.hk\nmoto17.com\nmoto8.com\nmoto8.net\nmotomatu.com\nmotooy.com\nmotor-comm.com\nmotormade.com\nmotowoo.com\nmotuo2.com\nmou.ge\nmou.ren\nmouldbbs.com\nmouldnews.com\nmoulem.com\nmoumi.com\nmounriver.com\nmountor.net\nmounui.com\nmouraeodor.com\nmouralanco.com\nmouratoriousi.com\nmousesquadca.org\nmoushei.com\nmousycoder.com\nmout.me\nmoutaichina.com\nmova-tech.com\nmovcam.com\nmovebroad.com\nmovelaser.com\nmovesky.net\nmovie.mcas.jp\nmovie365.tv\nmoviemore.com\nmoviereviewtoday.com\nmovit-tech.com\nmowan123.com\nmoweather.com\nmowgz.com\nmowowo.com\nmoxfive.xyz\nmoxiai.com\nmoxian.com\nmoxiaoying.com\nmoxidongman.com\nmoxin.me\nmoxing.net\nmoxingbk.com\nmoxingfans.com\nmoxingyun.com\nmoxiu.com\nmoxiu.net\nmoxuangenet.com\nmoxz.net\nmoyangmoyang.com\nmoyann.com\nmoyol.com\nmoyoyo.com\nmoypk.com\nmoyubuluo.com\nmoyugroup.com\nmoyunteng.com\nmoz8.com\nmozartsemi.com\nmozhan.com\nmozheanquan.com\nmozhedun.com\nmozhenhau.com\nmozichina.com\nmozigu.net\nmozillaonline.com\nmozillazg.com\nmoziqing.com\nmozouyan.com\nmp.cc\nmp17.com\nmp333player.com\nmp4ba.com\nmp4cn.com\nmpaascloud.com\nmpacc.cc\nmpacc.com\nmpacc.net\nmpackchina.com\nmpaidata.com\nmpass.club\nmpbza.com\nmpcloudapp.com\nmpdn.fun\nmpdsj.com\nmpg.de\nmph11.com\nmphdx.com\nmpiano.com\nmplus.tech\nmpmc-china.com\nmpnbenefits.download.prss.microsoft.com\nmpnbenefitsrtl.download.prss.microsoft.com\nmpnbenefitsrtluat.download.prss.microsoft.com\nmpoa.vip\nmpopkart.com\nmpqddg.club\nmps.live\nmpserverless.com\nmpsoft.net\nmpxiaomi.net\nmpxx.net\nmqant.com\nmqc168.com\nmqcoffee.com\nmqhospital.com\nmqikan.com\nmqmgroup.com\nmqqurl.com\nmqqy.com\nmqrouter.com\nmqsyr.com\nmqttdkx.vip\nmqttx.app\nmquanquan.com\nmqxpyy.com\nmqxww.com\nmqyu.com\nmqzoneapp.com\nmr-ping.com\nmr77.com\nmr91.com\nmrbanana.com\nmrbird.cc\nmrbook114.com\nmrcrm.com\nmrcywang.com\nmrdede.com\nmrdoc.pro\nmrdooku.com\nmrduan.com\nmrenbaike.com\nmrentea.com\nmrhallacg.com\nmrhe.net\nmrhs.cc\nmrjeke.com\nmrjiang.com\nmrjjxw.com\nmrlian.club\nmrlika.com\nmrmfsc.ltd\nmro365.com\nmro9.com\nmroall.com\nmrobao.com\nmrpyq.com\nmrqf.com\nmrqoxfvs.com\nmrqxs.com\nmrrvendor.com\nmrsdgg.com\nmrsingsing.com\nmrsjzt.com\nmrsta.com\nmrtoss03.com\nmrts.com\nmru-taste.com\nmrutaste.com\nmrvcdn.com\nmrwish.net\nmrxiao.net\nmrxwlb.com\nmryunwei.com\nmryys.com\nmrzhenggang.com\nms08067.com\nms211.com\nms315.com\nms6666111.com\nms7caryw5i48t.com\nmsanjia.com\nmsbank.com\nmscbsc.com\nmscdntrip.com\nmscland.org\nmscodecloud.com\nmsd-facing.com\nmsddp.com\nmsdkpass.com\nmsdn.download.prss.microsoft.com\nmsdn.hk\nmsdnwogaosuni.com\nmsdnxitong.com\nmsdpmarathon.com\nmsdprc.com\nmsdprod-ad.download.prss.microsoft.com\nmsfpay.com\nmsftonlinelab.com\nmsg.work\nmsgamego.com\nmsgcarry.com\nmsgtjj.com\nmsh2020.com\nmshandong.com\nmshao.com\nmshare.cc\nmshareservices.com\nmshchina.com\nmshg2019.com\nmshishang.com\nmshot.com\nmshouyou.com\nmshw.net\nmshxw.com\nmsits.com\nmsjingmi.com\nmsjpay.com\nmsjy123.com\nmskoo.com\nmslmc.net\nmsltbio.com\nmslzk.com\nmsm.moe\nmsmartlife.com\nmsmbjp.com\nmsndvr.com\nmsny.cc\nmsolok.com\nmspace.cc\nmspacecd.com\nmspharm.com\nmsproduct.download.prss.microsoft.com\nmsproductuat.download.prss.microsoft.com\nmsstatic.com\nmst-jc.com\nmstatik.com\nmstchina.com\nmstxx.com\nmsunland.com\nmsweekly.com\nmsxf.com\nmsxf.net\nmsxt.com\nmsxxg.com\nmsy5.com\nmsyc.cc\nmsyidai.com\nmsyos.com\nmsysk.com\nmszdld.com\nmszdld.net\nmszlyoozo.com\nmszmapp.com\nmszq.com\nmszsx.com\nmszxyh.com\nmt-bbs.com\nmt-viki.com\nmt-wire.com\nmt180.com\nmt22q4s3w5.com\nmt3.com\nmt77.com\nmt888vip.com\nmtab.cc\nmtadvert.com\nmtadx.com\nmtaokj.com\nmtavip.com\nmtblj.com\nmtchome.com\nmtcn.net\nmtcnsoft.com\nmtcsys.com\nmtcx99.com\nmtcxsw.com\nmtcxx.com\nmtcyz.com\nmtdpai.com\nmtdpgame.com\nmtdz.com\nmte-shenzhen.com\nmtedu.com\nmtex.work\nmtfpos.com\nmtgchina.com\nmtgmcim.com\nmthlyp.com\nmthreads.com\nmti100.com\nmtiancity.com\nmtianshitong.com\nmtide.net\nmtime.com\nmtimg.net\nmting.info\nmtitest.com\nmtizt.com\nmtjiangsu.com\nmtk.com.tw\nmtk114.com\nmtkdy.com\nmtketang.com\nmtkgvip.com\nmtkpacker.com\nmtksj.com\nmtlyp.work\nmtm.mo\nmtmos.com\nmtmss.com\nmtmssdn.com\nmtmssdn0.com\nmtmt.tech\nmtmyg.com\nmtmyw.com\nmtnets.com\nmtnets.net\nmtoou.info\nmtrmart.com\nmtschina.com\nmtsjgf.com\nmtspark.com\nmttlab.com\nmttsq.com\nmtty.com\nmtv123.com\nmtvip.cc\nmtw.so\nmtwine.com\nmtwl.net\nmtxshop.com\nmtxyx.com\nmtxzs.com\nmtyun.com\nmtzcjy.com\nmtzqb.com\nmtzscp.com\nmtzuichen.com\nmu69.com\nmuaedge.com\nmubanjianli.com\nmubanwan.com\nmubixueyuan.com\nmubon.net\nmubu.com\nmubucm.com\nmucanzhe.com\nmucf.cc\nmucfc.com\nmuch001.com\nmuchangqing.com\nmuchcloud.com\nmuchong.com\nmudanauto.com\nmudgj.com\nmudiaotx.com\nmudongguang.com\nmudotarot.com\nmudu.com\nmudu.tv\nmuduhs.com\nmufengyue.com\nmuftc.com\nmuge.info\nmugeda.com\nmuguang.me\nmuguayuan.com\nmuhai.net\nmuhan.co\nmuhan.ltd\nmuhou.net\nmuhoujiemi.com\nmuhuo.chat\nmuidar.com\nmuimg.com\nmuin.cc\nmuinsoft.com\nmujiangquan.com\nmujihotel-beijing.com\nmujin.net\nmujj.us\nmujoy.sg\nmukenano.com\nmukewang.com\nmukongyun.com\nmukool.com\nmulangbrand.com\nmulanlake.com\nmulazim.com\nmulightapp.com\nmulinsen.com\nmulinyun.com\nmulti-parking.com\nmulticonceptslink.com\nmultilingual-volc.com\nmultimodalmatch.com\nmultiplym.com\nmulunspring.com\nmumayi.com\nmumbuy365.com\nmumingfang.com\nmumunv.com\nmumuplayer.com\nmumuxili.com\nmunantonio.com\nmuncard.com\nmundane.ink\nmuniao.com\nmunling.com\nmunue.com\nmuomou.com\nmupao.com\nmupceet.com\nmuqianyun.com\nmuquan.com\nmuquan.net\nmurata-china.com\nmurdermysterypa.com\nmurl.tv\nmurongtech.com\nmurphysec.com\nmurphyyi.com\nmuryi.net\nmuse.ltd\nmuselab-tech.com\nmusenxi.com\nmuser168.com\nmuseradio.net\nmusestudio.net\nmusetransfer.com\nmushafa.net\nmusialmarketing.com\nmusic-search.org\nmusic4x.com\nmusicchina-expo.com\nmusiccia.com\nmusicd.cc\nmusicdu.com\nmusicedu8.com\nmusiceol.com\nmusicgw.com\nmusicheng.com\nmusiciansfriendsaleusa.shop\nmusikid.com\nmusiness.vip\nmuslimwww.com\nmuspost.icu\nmussgirl.store\nmustangbattery.com\nmustbull.com\nmustelanivalis.com\nmustshipdealyy.shop\nmustups.net\nmusyder.com\nmutean.com\nmutian.net\nmutianyugreatwall.com\nmutieffect.com\nmutouxb.com\nmutouyu.com\nmutualhunter.com\nmuwai.com\nmuwaifanzhiliao.com\nmuwenxi.com\nmux5.com\nmuxin.fun\nmuxiulin.com\nmuyangkuaibao.com\nmuyao.asia\nmuyee.com\nmuyer.com\nmuyeseed.com\nmuyewx.com\nmuyidc.com\nmuyingjie.com\nmuyingzhijia.com\nmuyuanfoods.com\nmuyuanpharm.com\nmuyuanwuliu.com\nmuyuekj0.com\nmuyuge.net\nmuyun.work\nmuyunsoft.com\nmuzhi.us\nmuzhibot.com\nmuzhicao.com\nmuzhifm.com\nmuzhigame.com\nmuzhiwan.com\nmuzhun.com\nmuziang.com\nmuzigame.com\nmuzijie.com\nmuzisoft.com\nmuziyueqiu.com\nmuzuhui.com\nmvashanghai.org\nmvhere.com\nmvmaster.com\nmvoicer.com\nmvopri5ac153.com\nmvorgexv.com\nmvote.net\nmvpdj.com\nmvpmeta.com\nmvpmob.com\nmvprpg.com\nmvpsky.com\nmvs-intel.com\nmvtianshanlr.com\nmvwchina.com\nmvyxws.com\nmw.com\nmw1950.com\nmwadx.com\nmwave.tech\nmwcdns.com\nmwclg.com\nmwcloudcdn.com\nmwcloudcdn.info\nmwcname.com\nmwdfawg.com\nmweda.com\nmwemp.com\nmwjournalchina.com\nmwkj.net\nmwm.moe\nmwquicio.com\nmwrf.net\nmwrfabc.com\nmwstore.com\nmwtee.com\nmwtg.vip\nmww.so\nmwyzhcdn.com\nmwzhtc.com\nmx-china.net\nmx-fm.com\nmx-industry.com\nmx-xz.com\nmx007.com\nmx175.com\nmx3g.com\nmx520.com\nmxarts.com\nmxbc.com\nmxbc.net\nmxbiao.com\nmxchip.com\nmxddp.com\nmxde.com\nmxdia.com\nmxdjzj.com\nmxdmf.com\nmxdpark-gs.com\nmxdraw.com\nmxdraw3d.com\nmxdx.net\nmxeosbvt.com\nmxew.com\nmxflutter.com\nmxfy.com\nmxgogo.com\nmxguan.com\nmxhaitao.com\nmxhichina.com\nmxifund.com\nmxitres.com\nmxjd.com\nmxjtedu.com\nmxjyxx.com\nmxk.cc\nmxkjai.com\nmxklchina.com\nmxmem.com\nmxnavi.com\nmxnxs.com\nmxnzp.com\nmxomo.com\nmxpharm.com\nmxqe.com\nmxria.com\nmxsa2178.club\nmxsyzen.com\nmxtcn.com\nmxtronics.com\nmxun.com\nmxw3.com\nmxweiqi.com\nmxwz.com\nmxxjh.com\nmxyinghang.com\nmxyn.com\nmxzgame.com\nmxzx123.net\nmxzzzs.com\nmy-cpaas.com\nmy-hlb.work\nmy-imcloud.com\nmy-le.com\nmy-ndns.com\nmy-qcloud.com\nmy-summit.com\nmy-tcloud.com\nmy.st.com\nmy0511.com\nmy0511.net\nmy0513.com\nmy0534.com\nmy0538.com\nmy0551.com\nmy0832.com\nmy089.com\nmy120.org\nmy147.com\nmy1616.net\nmy22.art\nmy22.fun\nmy22.info\nmy2852.com\nmy2space.com\nmy2w.com\nmy399.com\nmy3w.com\nmy4399.com\nmy510.com\nmy51y.com\nmy5v.com\nmy68.com\nmy7v.com\nmy88316666.com\nmy9166.com\nmy91app.com\nmy91game.net\nmy9527.com\nmy97.net\nmya92f.icu\nmyagric.com\nmyaijarvis.com\nmyaiwecom.com\nmyalicdn.com\nmyalirtc.com\nmyallvalue.com\nmyanjian.com\nmyanmarembassy.com\nmyanmarembassybeijing.com\nmyanonamouse.net\nmyapp.com\nmyapp.ltd\nmyappdl1.com\nmyappdl1.net\nmyappdl2.com\nmyappdl2.net\nmyaqsh.com\nmyarena7.com\nmyarowanas.com\nmyauth.us\nmybabya.com\nmybarrefitness.com\nmybdqn.com\nmybj.com\nmybjx.net\nmybluefox.com\nmybosc.com\nmyboyan.com\nmybu.net\nmybwallet.com\nmybxg.com\nmycaidan.com\nmycaigou.com\nmycaijing.com\nmycar168.com\nmycar58.com\nmycaraok.com\nmycarbar.com\nmycardgame.net\nmychery.com\nmychery.net\nmychinaunicom.com\nmychuguan.com\nmychunyan.net\nmyckjr.com\nmycloudstudy.com\nmyclub2.com\nmycnc.org\nmycodes.net\nmycollect.net\nmycolorcity.com\nmycolorway.com\nmycoov.com\nmycos.cc\nmycos.com\nmycos.net\nmycos.org\nmycospxk.com\nmycosresearch.net\nmycoss.com\nmycoss.net\nmycoss.org\nmycplife.com\nmycreate.net\nmycyjg.com\nmydadui.com\nmydao.net\nmydatetime.info\nmydcis.net\nmydcyj.com\nmydeal.asia\nmydf.net\nmydical.com\nmydidadi.com\nmydigi.net\nmydigit.net\nmydigitex.com\nmydisk.work\nmydnns.com\nmydns114.net\nmydns8.com\nmydnser.com\nmydnspod.net\nmydnsw.com\nmydoc.io\nmydoc123.com\nmydor.com\nmydown.com\nmydrivers.com\nmydyt.com\nmyecer.com\nmyechannel.com\nmyechinese.com\nmyeclipsecn.com\nmyekp.net\nmyelasticsearch.com\nmyeriri.com\nmyex.cc\nmyezdns.com\nmyfans.cc\nmyfdmg.com\nmyfhospital.com\nmyfrfr.com\nmyfun7.com\nmyfund.com\nmyfushun.com\nmygaks.com\nmygame66.com\nmygame82.com\nmygame88.com\nmygisdel.com\nmygjp.com\nmygobatv.com\nmygolbs.com\nmyguancha.com\nmygymchina.com\nmygzb.com\nmyhayo.com\nmyhc.net\nmyherocn.com\nmyhexin.com\nmyhithink.com\nmyhjw.vip\nmyhkw.com\nmyhl-china315.com\nmyhm.org\nmyhomeok.com\nmyhongzuan.com\nmyhopu.com\nmyhostadmin.net\nmyhscodes.com\nmyhuaweicloud-custom.com\nmyhuaweicloud-date.com\nmyhuaweicloud-koodrive.com\nmyhuaweicloud-obs.com\nmyhuaweicloud.com\nmyhuilv.com\nmyhuizhan.com\nmyhwcdn.com\nmyhwcloudlive.com\nmyhwclouds.com\nmyhwclouds.net\nmyhxy.com\nmyidc.club\nmyider.com\nmyie.me\nmyie9.com\nmyilibrary.com\nmyimis.com\nmyip.la\nmyiplay.com\nmyir-tech.com\nmyirtech.com\nmyitit.com\nmyityun.com\nmyjh.net\nmyjianzhu.com\nmyjiedian.com\nmyjob.com\nmyjob500.com\nmyjujing.com\nmyk3.com\nmykans.com\nmykarry.com\nmykd.cc\nmykeeta.com\nmykeeta.net\nmykqyy.com\nmykscdn.com\nmykuaidi.com\nmykuaiji.com\nmylbabao.com\nmylguoji.com\nmylhh.com\nmylibs.org\nmylightsite.com\nmylike.cc\nmylike.com\nmylike120.com\nmylikesz.com\nmylikeyk.com\nmylinkapp.hk\nmylitboy.com\nmyliwu.net\nmylotushealth.com\nmylovehome.com\nmylsfw.com\nmyluohan.com\nmym001.com\nmym195.com\nmymaitian.com\nmymanhua.com\nmymaudio.com\nmymember.ltd\nmymetal.net\nmymhotel.com\nmyminapp.com\nmymlsoft.com\nmymofun.com\nmymoive.com\nmymova.com\nmymuwu.net\nmynatapp.cc\nmynb8.com\nmynee.com\nmyo.ink\nmyoas.com\nmyoas.net\nmyodatech.com\nmyoed.com\nmyoldtime.com\nmyopenwrt.org\nmyoppo.com\nmyorbita.net\nmyottad.com\nmyouhua.com\nmyouth.net\nmyp17.com\nmyp2pch.net\nmypaas.com\nmyparallelstory.com\nmypcrun.com\nmypethome.com\nmypharma.com\nmypian.com\nmypiao.com\nmypiaojia.com\nmypitaya.com\nmypity.com\nmypiwik.com\nmypm.net\nmyprad.com\nmypscloud.com\nmypsy365.com\nmypx.org\nmyqbosuppportt.com\nmyqcloud.com\nmyqcloud.net\nmyqee.com\nmyqqdd.com\nmyqqjd.com\nmyr9.com\nmyra2.com\nmyrb.net\nmyreadcloud.com\nmyreadme.com\nmyrice.com\nmyrightone.com\nmyrqjt.com\nmyrtx.com\nmyrunners.com\nmysbaojie.com\nmysecretrainbow.com\nmysecrettop.com\nmysemlife.com\nmyseot.com\nmyshipjob.com\nmyshopex.com\nmyshoptago.com\nmyshow360.net\nmyshow800.com\nmyshown.com\nmysinamail.com\nmysipo.com\nmysiteres.com\nmysm888.com\nmysmth.net\nmysongktv.com\nmysore-yoga.com\nmyspain.org\nmysql360.com\nmysqlab.net\nmysqlpub.com\nmyssl.com\nmystao.com\nmystarch.com\nmysteel.com\nmysteel.net\nmysteelcdn.com\nmysteelcms.com\nmysticalcard.com\nmysubmail.com\nmysupa.com\nmysuperdns.com\nmysvw.com\nmysybt.com\nmyt126.com\nmytaizhou.net\nmytaofun.com\nmytencentes.com\nmythbird.com\nmythcall.com\nmythcare.com\nmythidea.com\nmythroad.net\nmythsman.com\nmythware.com\nmythware.net\nmytianchang.com\nmytijian.com\nmytju.com\nmytokenapi.com\nmytokenpocket.vip\nmytoptown.com\nmytqwpe.com\nmytrix.me\nmytt.com\nmytv365.com\nmytvgame.com\nmytxly.com\nmyuall.com\nmyubbs.com\nmyuclass.com\nmyun.tv\nmyunke.com\nmyunlu.com\nmyusmile.online\nmyvipsalon.com\nmyvs.download.prss.microsoft.com\nmyvsoncloud.com\nmyvsuat.download.prss.microsoft.com\nmywakao.com\nmywaymeta.com\nmyweb888.com\nmyweimai.com\nmywhh.com\nmywinch.com\nmywirebox.com\nmywll.com\nmyworld6.com\nmyxxts.club\nmyxxts.com\nmyxycjh.com\nmyxypt.com\nmyyerrol.xyz\nmyyishu.com\nmyyjs.com\nmyyoudao.com\nmyypark.com\nmyyx618.com\nmyyx915.com\nmyyzd.com\nmyzaker.com\nmyzfw.com\nmyzhenai.com\nmyzhidao.com\nmyzhiniu.com\nmyzte.com\nmyztxyy.com\nmyzxsx.com\nmyzxyy.com\nmyzyy.com\nmyzyzy.com\nmz186.com\nmz52.com\nmz6.net\nmz99.com\nmzbei.com\nmzbkw.com\nmzboss.com\nmzdscm.com\nmzeyes.com\nmzfanyi.vip\nmzfile.com\nmzfpay.com\nmzfsm.com\nmzfxw.com\nmzgroup.vip\nmzgtuan.com\nmzh.ren\nmzhb.com\nmzhen.com\nmzhfm.com\nmzhu8.com\nmzhujia.com\nmzjiacheng.com\nmzjinyan.com\nmzklg.com\nmzksgmex.com\nmzli.club\nmzlittc.com\nmzlwxw.com\nmzlx88.com\nmzlxcl.com\nmzmjyy.com\nmznznj.com\nmzone.site\nmzqbt.com\nmzrcw.com\nmzread.com\nmzres.com\nmzrmyy.com\nmzsdsyy.com\nmzsemi.com\nmzsky.cc\nmzsmn.com\nmzsrmyy.com\nmzssysmyxgs.com\nmzstatic.com\nmzsvn.com\nmztgame.com\nmztspa.com\nmzty.com\nmztzzx.com\nmzuimg.net\nmzwu.com\nmzxstar.com\nmzy0.com\nmzyege.com\nmzyfz.com\nmzyispmc.com\nmzyjfcn.com\nmzyoudao.com\nmzyun.ren\nmzyunyin.com\nmzyz.com\nmzzhgcc.com\nmzzjw.com\nmzzyk.com\nmzzzn.work\nn-bros.net\nn.biz\nn0808.com\nn0vadesktop.com\nn12345.com\nn13.club\nn18.rcs.revma.com\nn1b.com\nn2017.com\nn21.cc\nn21ce.com\nn283nser4cjz.com\nn3sd.com\nn459.com\nn5w.com\nn62f.vip\nn63.com\nn78785.com\nn7maufn.sbs\nn802.com\nn8soft.com\nn9z.net\nna.ci\nnaaln.com\nnabluemedia.com\nnaboyi.com\nnac88.com\nnachuan.com\nnacuiwei.com\nnadianshi.com\nnadioutdoor.com\nnadu8.com\nnaec-cn.com\nnaeeo.com\nnaeraxitang.com\nnagagame.net\nnagain.com\nnagar-setu.com\nnagcloudcs.com\nnagekuai.com\nnagezan.net\nnahuayuan.com\nnahuiyi.com\nnahuo.com\nnahuo8.com\nnahuo9.com\nnaibabiji.com\nnaibago.com\nnaicha99.com\nnaichabiao.com\nnaideceas.com\nnaids.com\nnaifei.pro\nnaifeistation.com\nnaifenzhiku.com\nnaijian.net\nnail-auto.com\nnails7.com\nnaimal.com\nnaimei.com\nnaipan.com\nnaiping.net\nnaisuanbeng.com\nnaitang.com\nnaitta.com\nnaiveadmin.com\nnaiveblue.com\nnaiwch.com\nnaixi.com\nnaixi.org\nnaixuecha.com\nnaiyouxuexi.com\nnajingtech.com\nnajyj.net\nnajyw.net\nnakedsail.com\nnakeli-biotech.com\nnakevip.com\nnaknor.com\nnakong.com\nnalanchuanmei.com\nnalanxi.com\nnalati.com\nnalichi.com\nname2012.com\nname321.net\nnameidi.com\nnamejin.com\nnamepre.com\nnameserver.fit\nnamesilodns.com\nnami.com\nnamibox.com\nnamichong.com\nnamihair.com\nnamipan.com\nnamiso.com\nnamisoft.com\nnamitiyu.com\nnamkwonglog.com\nnamoc.org\nnan-cable.com\nnan1688.com\nnana.center\nnanbeige.com\nnanbeijt.com\nnanbeiyou.com\nnanbeiyu.shop\nnanbushenghuo.com\nnancalelectric.com\nnancc.com\nnancharencai.com\nnanchigroup.com\nnanchu.com\nnanchunhz.com\nnandaauto.com\nnandasoft-its.com\nnandasoft.com\nnandiu.com\nnandu.com\nnandufoundation.org\nnanerjia.com\nnanfang-pump.com\nnanfangfood.com\nnanfen.com\nnanfu.com\nnanguache.com\nnanguakexue.biz\nnanguakexue.com\nnangualin.com\nnanguaxia.vip\nnanguowl.com\nnangxia.com\nnanhaibank.com\nnanhaicorp.com\nnanhaisw.com\nnanhaitoday.com\nnanhexinxi.com\nnanhua.net\nnanhuabx.com\nnanhuafunds.com\nnanhuangic.com\nnanhuazaobao.net\nnanhufund.com\nnanhujianshe.com\nnanhunnvjia.com\nnanhuwang.com\nnanjbjjt.com\nnanjet.com\nnanjianggroup.com\nnanjiaogroup.com\nnanjing-pharma.com\nnanjing-reagent.com\nnanjing.com\nnanjingboiler.com\nnanjingbtkt.com\nnanjingbyby.com\nnanjingchenxi.com\nnanjingelectric.com\nnanjinggaopeng.com\nnanjinghuihe.com\nnanjinghuojia.net\nnanjinglf.org\nnanjingludeng.com\nnanjingtianqi114.com\nnanjingttym.com\nnanjingxinxu.com\nnanjingyinuo.com\nnanjixiong.com\nnankaimba.org\nnanlangshengwu.com\nnanlew.com\nnanlingwater.com\nnanlingzr.com\nnanlong.com\nnanmodesign.com\nnanning-marathon.com\nnanninginfo.com\nnanningmhw.com\nnanningmuseum.com\nnanningnongjiao.com\nnanningrcw.com\nnanningtech.com\nnanningxiaoou.com\nnanningyouhua.com\nnanningyuexing.com\nnannjlnk.com\nnano-zero.com\nnanobody-biolab.com\nnanochrom.com\nnanoeast.net\nnanoer.net\nnanoinglobal.com\nnanomicro.com\nnanomotions.com\nnanomxenes.com\nnanosic.com\nnanpowan.com\nnanpu.vip\nnanpua.com\nnanputuo.com\nnanqi.org\nnanqiangbusiness.com\nnanrentu.cc\nnanrenwa.com\nnanrenwo.net\nnanrenzhi.com\nnanshanfuzi.net\nnanshanlvyou.com\nnanshanski.com\nnanshe-tech.com\nnanshiw.com\nnanss.com\nnantaihu.com\nnantong-hst.com\nnantongfeixu.com\nnantonghua.net\nnantoujituan.com\nnanvi.com\nnanxi.me\nnanxiang.info\nnanxingmac.com\nnanxinwang.com\nnanxueqx.com\nnanxunfb.com\nnanyangcable.com\nnanyangdianlan.com\nnanyangpt.com\nnanyangzb.com\nnanyinwealth.com\nnanyuecloud.com\nnanyuenews.com\nnanyuetong.com\nnanzhougroup.com\nnaobaocun.com\nnaobiao.com\nnaoda.net\nnaoffer.com\nnaokor.com\nnaokr.com\nnaominet.live\nnaono.cc\nnaosiling.com\nnaozhong.net\nnaozoejnnwzjaz.work\nnapengzn.com\nnapiantian.com\nnaqing-tech.com\nnaquan.com\nnaquan.org\nnaradafoundation.org\nnaradahotels.com\nnaradapower.com\nnarcissoshotel.com\nnaris-china.com\nnarkii.com\nnarochina.com\nnaruto.red\nnarwal.com\nnarwaltech.com\nnas-ya.com\nnascrew.com\nnase.tech\nnasenwangluo.net\nnasfreight.com\nnasge.com\nnasgetinfo.com\nnashwork.com\nnasinet.com\nnaslab.club\nnastcorp.com\nnasyeo.com\nnasyun.com\nnat123.com\nnatachem.com\nnatapp.cc\nnatapp1.cc\nnatapp4.cc\nnatappfree.cc\nnatashayana.shop\nnatbbs.com\nnatchecker.com\nnatergy.com\nnatfrp.com\nnatgmj.com\nnationalchip.com\nnationalee.com\nnationsky.com\nnationstech.com\nnativosink.com\nnatnps.com\nnattest-china.com\nnaturali.io\nnaturaltfc.com\nnaturalvision.org\nnature-museum.net\nnature.com\nnatureholisticwellness.com\nnaturesvariety-china.com\nnatywish.com\nnauac.com\nnaupd.com\nnav-cn.com\nnavchina.com\nnavgnss.com\nnavigastar.com\nnavimentum.com\nnavinfo.com\nnaxcx.com\nnaxiaozhu.com\nnaxide.com\nnayatec.com\nnayei.com\nnayuansu.com\nnazarstudios.com\nnazhidj.com\nnazhilong.com\nnazo.fun\nnb-bailing.com\nnb-jf.com\nnb-jiale.com\nnb-medicalsystem.com\nnb160.com\nnb591.com\nnba-zhibowebsite.com\nnba.com\nnba98k.com\nnbabm.com\nnbahero.com\nnbahi.com\nnbaidai.com\nnbakan8.com\nnball.cc\nnbamyl.com\nnbaoke.com\nnbappliance.com\nnbaqmq.com\nnbaqsj.com\nnbaqx.com\nnbaxiaoshuo.com\nnbbiao.com\nnbbjack.com\nnbbuxiutie.com\nnbcbd.com\nnbcentre.com\nnbchao.com\nnbchen.com\nnbcqjy.org\nnbcsgo.com\nnbctg.com\nnbcyts.com\nnbdavid.com\nnbdeli.com\nnbdeli.net\nnbdeyy.com\nnbdisco.com\nnbdkj.com\nnbdpress.com\nnbdyf.com\nnbdyyy.com\nnbegame.com\nnbegame.net\nnbelec.com\nnbenl.com\nnbfeyy.com\nnbfkgs.com\nnbfox.com\nnbgdjt.com\nnbginnovations.com\nnbgj.net\nnbgjwl.com\nnbgodo.com\nnbgong.com\nnbgree.com\nnbgy.com\nnbhao.org\nnbhechang.com\nnbhhgroup.com\nnbhky.com\nnbhuke.com\nnbhxmr.com\nnbhysj.com\nnbidifund.com\nnbimer.com\nnbit6d.com\nnbjcae.com\nnbjcds.com\nnbjingyong.com\nnbjisi.com\nnbjit.com\nnbjlw.com\nnbjnw.com\nnbjoyo.com\nnbjttz.com\nnbjzjn.com\nnbjzzsw.com\nnbkaisheng.com\nnbkc-rp.com\nnbkdl.com\nnbkjcx.com\nnbkqyy.com\nnblhlyy.com\nnblhwy.com\nnblilong.com\nnblongzhan.com\nnblwhb.com\nnblyhy.com\nnbmai.com\nnbmedicalsystem.com\nnbmiao.com\nnbmidun.com\nnbmpzs.com\nnbmylike.com\nnbmyy.com\nnbmzyl.com\nnbnnn.xyz\nnbocc.com\nnbocqdm.xyz\nnbosco.com\nnbpathcent.org\nnbpmia.com\nnbpolytheatre.com\nnbqixing.com\nnbqwrc.com\nnbrawwater.com\nnbrcg.com\nnbrcw.com\nnbren.net\nnbrj.com\nnbrlzy.com\nnbruili.com\nnbscxh.com\nnbsdjyy.com\nnbsfgy.com\nnbshunjian.com\nnbshuoxue.com\nnbshzwyy.com\nnbsijian.com\nnbslkg.com\nnbslxh.com\nnbsmjt.com\nnbsp99.com\nnbsqbank.com\nnbsti.net\nnbstjt.com\nnbstrans.com\nnbsz.com\nnbszgd.com\nnbt.ren\nnbtlwl.com\nnbtobacco.com\nnbttbn.com\nnbtzjd.com\nnbtzsh.com\nnbuci.com\nnbudp.com\nnbunicom.com\nnbuser.com\nnbvps.net\nnbwaf.net\nnbwan.net\nnbwbw.com\nnbweldingtorch.com\nnbwelldon.com\nnbwetc.com\nnbwhg.com\nnbwskj666.com\nnbxdjt.com\nnbxiaoshi.net\nnbxry.com\nnbxsjg.com\nnbxsrc.com\nnbyang.com\nnbyeda.com\nnbyjrf.com\nnbyouth.com\nnbyyz.com\nnbyzyy.com\nnbzhongxin.com\nnbzhuzhai.com\nnbzjpc.com\nnbzsq.com\nnbzxgj.com\nnbzyenergy.com\nnc-bio.com\nnc189.net\nnc530.com\nncarzone.com\nncawzs.com\nncboo.com\nncc-cma.net\nnccqj.com\nnccurbanmayfair.com\nncderuida.com\nncdxbbs.com\nncepujournal.com\nncfcsa.org\nncfgroup.com\nncfimg.com\nncfjj.com\nncfwx.com\nncfz.com\nncgprq.com\nnch-bg.com\nnchq.cc\nnchtech.com\nnchycw.com\nncidbj.com\nnciyuan.com\nncjrailway.com\nnclqq.com\nncmbio.com\nncmem.com\nncmtkj.com\nncmtr.com\nncnynl.com\nncogvki.xyz\nncore.cc\nncpa-classic.com\nncpc.biz\nncpqh.com\nncpssd.org\nncq8.com\nncqiche.com\nncsdyyy.com\nncshxd.com\nncsjhf.com\nncsxy.com\nncsyco.com\nnctry.com\nnctvcloud.com\nnctzsj.com\nncu.me\nncvt.net\nncvtmi.com\nncwsxh.org\nncwsxx.com\nncxhrc.com\nncxinshou.com\nncxuw.com\nncyrqs.com\nncyscb.com\nncyunqi.com\nnczfgjj.com\nnczfj.com\nnczxst.com\nnczxwl.com\nnczy.com\nnd15.com\nnd56.com\nnd597.com\nndapp.com\nndbzteck.com\nndcimgs.com\nndcjl.com\nndcpp.com\nndcppx.com\nndcyx.com\nnddaily.com\nnddnrm.com\nnddst.com\nndfdc.com\nndgchina.com\nndgf.net\nndgzy.com\nndhx.net\nndhys.com\nndiip.com\nndj520.com\nndjtwl.com\nndkhn.com\nndkybio.com\nndmh.com\nndoo.net\nndpharm.com\nndsad.com\nndsbbs.com\nndscsoft.com\nndser.net\nndsyy.com\nndszgb.com\nnduoa.com\nnduoshousi.com\nnduotuan.com\nndvfxyvj.sbs\nndxlj.com\nndyt.com\nndzfl.com\nndzls.net\nne01.com\nne21.com\nne365.com\nne56.com\nneapme.com\nnearcharge.com\nneardi.com\nnearsnet.com\nnease.net\nneashow.com\nneat-reader.com\nneatifyapp.com\nneboer.site\nnebulogy.com\nneccsh.com\nnecgokr2-724.acs.wecandeo.com\nnecool.com\nnedfon.co\nnedigitals.com\nneeca.net\nneefood.com\nneegle.net\nneeinn.com\nneep.shop\nneeq.cc\nneets.cc\nneeu.com\nneffkb.com\nnei-mao.com\nnei.tm\nneigou.com\nneihan.net\nneihancommunity.com\nneihancommunity.net\nneihandiantai.com\nneihanfly.com\nneihang.net\nneihanshequ.com\nneimaowang.com\nneimenggugames.com\nneisha.cc\nneitui.com\nneituixiaowangzi.com\nneixiong8.net\nneko.pub\nnekoarch.cc\nnelkshuhe.com\nnellit.info\nnellit.net\nnellit.xyz\nnelson-textiles.com\nnelsonjulia.shop\nnelumbosp.com\nnengapp.com\nnengdarack.com\nnenggeimall.com\nnenghaoidc.com\nnengqiang.com\nnengrui.com\nnengshida.com\nnengshouwangluo.com\nnengyuanxx.com\nnenufm.com\nnenup.com\nnenzei.com\nneo-yiming.com\nneo.org\nneo1989.net\nneoap.com\nneobiochina.com\nneoease.com\nneoease.org\nneofaith.net\nneofussvr.sslcs.cdngc.net\nneohytung.com\nneojos.com\nneolee.com\nneolix.net\nneomodulus.com\nneoremind.com\nneoscholar.com\nneoschool.com\nneosey.com\nneoyon.com\nnep-logistics.com\nneptcn.com\nneptunus.com\nneqtahotelshanghai.com\nnercdtv.org\nnercel.com\nnerin.com\nnero-cn.com\nnerocats.com\nnerochat.com\nnerve-corp.com\nnervepotato.com\nnes-auto.com\nnesbbs.com\nnesmt.org\nnesoso.com\nnesox.com\nnespressochina.com\nnestgene.com\nnestlechinese.com\nnesyouxi.net\nnet-add.com\nnet-measure.net\nnet-rope.com\nnet-sharp.com\nnet-swift.com\nnet-times.net\nnet0516.com\nnet111.info\nnet130.com\nnet199.com\nnet2345.net\nnet263.com\nnet767.com\nnetac.com\nnetandtv.com\nnetat.net\nnetbian.com\nnetbooo.com\nnetchina100.com\nnetcoc.com\nnetcolc.cc\nnetconst.com\nnetcoretec.com\nnetcute.com\nnetded.com\nnetease-inc.com\nnetease.com\nnetease.im\nneteasegame.com\nneteasegame.net\nneteasegames.com\nneteasegames.net\nnetentsec.com\nnetesee.com\nnetgamecar.com\nnetge.com\nnetherlandvcenter.com\nnethonghe.com\nnetianshannu.com\nnetiler.com\nnetinfi.com\nnetinfi.net\nnetingcn.com\nnetitest.com\nnetkao.com\nnetman123.com\nnetnoease.com\nnetor.net\nnetpi.me\nnetpoint25.com\nnetposa.com\nnetqd.com\nnetsmell.com\nnetspreading.com\nnetstatic.net\nnetsun.com\nnetswise.com\nnetsyq.com\nnett.to\nnettvpro.live\nnetvp.net\nnetwork-hk.com\nnetworkesl.com\nnetworklinkpro.com\nnetworklo.com\nnetzonesoft.com\nnetzz.net\nneu-reality.com\nneucrack.com\nneuedu.com\nneunn.com\nneupaas.com\nneuqsoft.com\nneuroxiv.com\nneuroxiv.net\nneusemi.com\nneusncp.com\nneusoft.com\nneusoftmedical.com\nneutrontek.com\nneux.studio\nnevadaheladosjujuy.com\nnevem.com\nnew-elegance.com\nnew-mobi.com\nnew-thread.com\nnew0633.com\nnew1cloud.com\nnew253.com\nnew669.com\nnew7.com\nnewacademic.net\nnewaigou.com\nnewaircloud.com\nnewamigo.net\nnewamstar.com\nnewansha.com\nnewaq.com\nnewasp.com\nnewasp.net\nnewayz.com\nnewbakers.com\nnewbandeng.com\nnewbanker.com\nnewbd.com\nnewbeaconhotels.com\nnewbeebook.com\nnewbeebox.com\nnewbenglish.com\nnewbook8.com\nnewcapec.net\nnewcentral.com\nnewcentury-edu.com\nnewcger.com\nnewchainbase.com\nnewchieve.com\nnewchinabeach.org\nnewchinalife.com\nnewcitygz.com\nnewclasses.org\nnewclouddenfender.com\nnewcoder.com\nnewcosemi.com\nnewdao.net\nnewday.me\nnewdreamgroup.com\nnewdroid.net\nnewdruginfo.com\nnewdu.com\nnewdun.com\nnewe.tv\nnewelementchina.com\nnewer2001.com\nnewevcar.com\nneweyezs.com\nnewft.com\nnewglp.com\nnewgscloud.com\nnewharbour.net\nnewhb.com\nnewhbdoor.com\nnewhopbattery.com\nnewhopeagri.com\nnewhopegroup.com\nnewhqnotary.com\nnewhtml.net\nnewhua.com\nnewikou.com\nnewistock.com\nnewjg.com\nnewkunhua.com\nnewland-edu.com\nnewlandaidc.com\nnewlandcomputer.com\nnewlandnpt.com\nnewlesson.com\nnewlifex.com\nnewlink.com\nnewlixon.com\nnewlongbj.com\nnewlongma.com\nnewluobo.com\nnewmaker.com\nnewman.mobi\nnewmargin.com\nnewmorehot.com\nnewnanbao.com\nnewnewle.com\nnewniu.com\nnewoasis.cc\nnewoo.com\nneworiental.org\nnework360.com\nneworldedu.org\nnewposture.vip\nnewqjsteel.com\nnewrathon.com\nnewrizon.com\nnews18a.com\nnewsapp01.com\nnewsccn.com\nnewscctv.net\nnewseasoft.com\nnewsgd.com\nnewsgu.com\nnewsgx.com\nnewshengwei.com\nnewshs.com\nnewsighting.com\nnewsing.com\nnewskj.com\nnewskj.org\nnewskyunion.com\nnewsletter-cn.com\nnewsletter-nespresso.com\nnewslqy.com\nnewsmth.com\nnewsmth.net\nnewsmy-car.com\nnewsmy.com\nnewsmyshop.com\nnewsn.net\nnewspluse.com\nnewssc.net\nnewssc.org\nnewstarpress.com\nnewstartsoft.com\nnewstjk.com\nnewsungroup.com\nnewsungroup.net\nnewsv5.com\nnewsxc.com\nnewsxcar.com\nnewsxy.com\nnewsyc.com\nnewszjk.com\nnewtab123.com\nnewtalentaward.com\nnewtao.work\nnewtimeai.com\nnewtimevalve.com\nnewtonghua.com\nnewtop100.com\nnewtouch-elec.com\nnewtouch.com\nnewtranx.com\nnewtrip.com\nnewume.com\nnewupbank.com\nnewvfx.com\nnewvisionvc.com\nnewvr.com\nnewwatchesale.com\nnewxing.com\nnewxitong.com\nnewxue.com\nnewyanshamall.com\nnewyifagroup.com\nnewyishi.com\nnewyorkerdownunder.com\nnewyorkluxurywatch.com\nnewyoton.com\nnewyx.net\nnewzealandvscenter.com\nnewzgc.com\nnewzhizao.com\nnewzhongyuan.com\nnexaparty.com\nnexmoe.com\nnexon.to\nnext-bei.com\nnext-playground.com\nnextclass.club\nnextclass.com\nnextday.im\nnextech-x.com\nnextjoy.com\nnexto2o.com\nnextpcb.com\nnextplayground.com\nnextriskcontrol.com\nnextrt.com\nnextstudios.com\nnexttao.com\nnextvid.net\nnextworkshop.net\nnextyu.com\nnexus-holding.com\nnexus.dell.com\nnexusapex.cfd\nnexushd.org\nneyetwatcher.com\nneytap.com\nnezhu.com\nneznanskyphoto.com\nnf-ref.com\nnf.video\nnf108.com\nnf56.com\nnfbdc154.org\nnfc315.com\nnfcic.com\nnfcmag.com\nnfcreader.net\nnfcs-med.com\nnfcs-medical.com\nnfdx.net\nnffq.net\nnffund.com\nnfgjhr.com\nnflchina.com\nnflsxl.com\nnfmedia.com\nnfmrtfv.com\nnfnews.com\nnfoservers.com\nnfpeople.com\nnfqbyp.com\nnfs-china.com\nnfschina.com\nnfsyx.com\nnftrr.com\nnfvalve.com\nnfwl168.com\nnfxsy.com\nnfyeya.com\nnfyny.com\nnfyun.vip\nnfyy.com\nnfyyzcfy.com\nnfzhouyi.com\nnfzmy.com\nnfzzh.com\nng-alain.com\nng021.com\nnga.wiki\nngaa.info\nngaa.shop\nngaa.top\nngaacdn.com\nngaacdn.net\nngaagslb.com\nngaagslb.net\nngabbs.com\nngacn.cc\nngarihealth.com\nngbbs.com\nngc-marine.com\nngcgears.com\nngctransmission.com\nngcz.tv\nngedu.net\nngfcyy.com\nngfjkzps.com\nngh6.com\nnghmesc.com\nngicer.com\nnginstar.net\nngjjtg.com\nngkjjt.com\nngksz.com\nngmap.com\nngmyt.com\nngnice.com\nngnlink.net\nngo.com\nngotcmszh.com\nngread.com\nngrok.cc\nngs1685.com\nngswgs.com\nngtravelercn.com\nngty556.com\nngwxw.com\nngxn.com\nngzyxx.com\nnh.com\nnh2h.com\nnh56.com\nnhaidu.com\nnhaidu.net\nnhcec.com\nnhcilab.com\nnhcsw.com\nnhd-mart.com\nnhdacrw.xyz\nnhdia.com\nnhdmd.com\nnhfyyy.com\nnhganggeban.com\nnhhongyi.com\nnhjjlt.com\nnhkaiyang.com\nnhkeysu.com\nnhkw-zh-hlscomp.akamaized.net\nnhkwlive-xjp.akamaized.net\nnhlq.com\nnhmuni.com\nnhnexpo.com\nnhnst.com\nnhooo.com\nnhspd.com\nnhwa-group.com\nnhxz.com\nnhygkj.com\nnhzb.com\nnhzhaopin.com\nnhzj.com\nnhzs.com\nni8.com\nni93.com\nnianchu.net\nnianhuawan.com\nniankawang.com\nnianlingjisuanqi.com\nnianlun010.com\nniannz.com\nnianqin.cc\nnianqin123.com\nnianshao.me\nniansir.com\nniao95.com\nniaobulashi.com\nniaocms.com\nniaogebiji.com\nniaola.com\nniaoquan.fun\nniaosuangao.online\nniaowoclub.com\nniaoyun.com\nniba.com\nnibaguai.com\nnibaku.com\nnibj.com\nnibomu.com\nnic.ren\nnic.xin\nnicaicheng.com\nnicaifu.com\nnicaifu.net\nnice-app.com\nnice-china.com\nnice1688.com\nnicebing.com\nnicebooker.com\nnicecdn.com\nnicefilm.com\nniceguo.com\nniceinno.com\nniceios.com\nniceisp.com\nnicekid.com\nniceloo.com\nnicenergy.com\nnicesnow.com\nnicetheme.xyz\nnicetuan.net\nnicewatch.cc\nnicexf.com\nniceyea.com\nnicezhuanye.com\nnichuanbo.com\nnickbussok.com\nnicksxs.com\nnicky1605.com\nnicolaszhao.com\nniconiconi.cc\nnicosu.com\nnicot-motor.com\nnicotine.vip\nnics365.com\nnicsbuy.com\nnicwind.com\nnidecms.com\nnidiandaojia.com\nnie.io\nnieapps.com\nniegobrand.com\nniegoweb.com\nnielsenccdata.tv\nnies.org\nniexiaotao.com\nnieyou.com\nnifdc.com\nnifengz.com\nnightanddaythegame.com\nnightcity.pub\nnightmare.press\nnihao.net\nnihaoafrica.org\nnihaodd.com\nnihaotv.net\nnihaotw.com\nnihaowang.com\nnihil.cc\nnihonngo.site\nniiam.com\nniiceda.com\nniiddm.com\nniimbot.com\nniiwoo.com\nnikanpian.com\nnike-inc.com.tw\nnike.host\nnike666.com\nnikefans.com\nnikkisoft.com\nnikkiup2u2.com\nnikkon-china.com\nnilai.com\nnileloan.com\nnim-lang-cn.org\nnimitzvac.com\nnimolife.com\nnimzx.com\nnindeli.com\nnine-rivers.com\nninebot-link.com\nninebot.com\nnineplaying.com\nnineroad.com\nninesix.cc\nninestargroup.com\nninestarmall.com\nninetylab.com\nnineya.com\nning0370.com\nningban.com\nningbo-airport.com\nningbocat.com\nningboenlighten.com\nningboexport.com\nningbofy.com\nningborunner.com\nningbotianxia.com\nningbotm.net\nningbowater.com\nningdo.com\nningdong.com\nninghao.net\nninghuoban.com\nningidc.com\nningkangyuan.com\nningkekeji.com\nninglutech.com\nningma.com\nningmengdou.com\nningmengyun.com\nningshing.com\nningtingche.com\nningto.com\nnington.com\nningxi.com\nningxiacaijing.com\nningxiagames.com\nningxiahuangheyun.com\nningxingxing.com\nningzhe.net\nningzhi.net\nningzhishidai.com\nningzhitec.com\nninjacn.com\nninjadq.com\nninomiya.store\nnint.com\nnintaus.com\nninthpalace360.com\nninthpalace520.com\nnio.com\nnioapis.com\nniozhr.com\nniparts.com\nnipei.com\nnipic.com\nnipponcore.com\nnis.stream.publicradio.org\nnischina.org\nnishuoa.com\nnissmi.com\nnitaitag.com\nnittoseiki-cn.com\nniu-tu.com\nniu.com\nniua.com\nniuacc.com\nniuap.com\nniubalun.com\nniubb.net\nniubibsn.com\nniubihonghong.net\nniubilai.com\nniubilety.com\nniubixia.com\nniubo.cc\nniuboli.com\nniucache.com\nniucdn.com\nniuche.com\nniuclass.net\nniucodata.com\nniudai120.com\nniudashu.com\nniudie.cc\nniufang.net\nniufun.com\nniug8.com\nniugame.net\nniugp.com\nniuguwang.com\nniuhuagong.com\nniujinniu.com\nniukk.com\nniuming147.com\nniunai.com\nniuniu-dns.com\nniuniufund.com\nniuniutui.com\nniupiano.com\nniupianwang.com\nniupinhui.com\nniupu.com\nniuqia.com\nniurenqushi.com\nniurosoft.com\nniuschools.com\nniushe.com\nniushield.online\nniushoushan.net\nniutech.com\nniutk.com\nniutoushe.com\nniutrans.com\nniuwk.com\nniuxiaoer.net\nniuxyun.com\nniuyou5.com\nniuyuan.com\nniuza.com\nniuzhigongzuo.com\nniuzhu.com\nniuzhuan-test.com\nnivtc.com\nniwangwang.com\nniwodai.com\nniwodai.net\nniwoxuexi.com\nnixi.win\nnixingtao.com\nnixwang.com\nniyingseo.com\nnizhan888.com\nnizi88.com\nnizkeyboard.com\nnj-anruitai.com\nnj-bl.com\nnj-bw.com\nnj-chishun.com\nnj-control.com\nnj-deli.com\nnj-dhl.com\nnj-gw.com\nnj-halfmarathon.com\nnj-hr.com\nnj-huaqiang.com\nnj-hust.com\nnj-jp.com\nnj-jy.com\nnj-kejin.com\nnj-kk.com\nnj-maici.com\nnj-nanhuai.com\nnj-newhope.com\nnj-qiyiguo.net\nnj-reagent.com\nnj-ss.com\nnj-tencentclb.cloud\nnj-tencentclb.com\nnj-tencentclb.net\nnj-tencentclb.work\nnj-test.com\nnj-tongrentang.com\nnj-tops.com\nnj-tq.com\nnj-xyzs.com\nnj-zhengze.com\nnj-zhongbo.com\nnj-zj.com\nnj0827.net\nnj12320.org\nnj127.com\nnj13z.net\nnj1937.org\nnj29jt.net\nnj303yy.com\nnj63.com\nnj87.com\nnjabsw.net\nnjaces.com\nnjacme.com\nnjajjt.com\nnjajt.com\nnjaline.com\nnjanmu.com\nnjaolian.com\nnjaoti.com\nnjatl.com\nnjavc.com\nnjbaisou.com\nnjbaoxun.com\nnjbdhb.com\nnjbestway.com\nnjbhec.com\nnjbhhb.net\nnjbiaochen.com\nnjbj888.com\nnjbnw.com\nnjbpvi.org\nnjbsby.com\nnjbtkt.com\nnjbx.com\nnjbx.work\nnjbytyq.com\nnjc100.com\nnjcangong.com\nnjcaringmedical.com\nnjcatv.net\nnjcbcmjt.com\nnjccwei.com\nnjcdata.com\nnjcedu.com\nnjcgs.com\nnjchanke.com\nnjchengyi.com\nnjchina.com\nnjcitygas.com\nnjcjby.com\nnjcjszyy.com\nnjcjzz.com\nnjcky.com\nnjcl-gear.com\nnjclwlkj.com\nnjcmotor.com\nnjcmsj.com\nnjcnmc.com\nnjcomptech.com\nnjctcm.com\nnjcttq.com\nnjcw.com\nnjcwlk.com\nnjcxj.com\nnjcyt99.com\nnjd1.com\nnjdapaidang.com\nnjdatang.com\nnjdewo.com\nnjdftl.com\nnjdfwb.com\nnjdfzg.com\nnjdianyong.com\nnjdiip.com\nnjdndz.com\nnjdnjt.com\nnjdq-ld.com\nnjdqgytg.com\nnjdtyx.com\nnjdzjcyq.com\nnjdzn.com\nnjeport.com\nnjfdyy.com\nnjfjkj.com\nnjfk.net\nnjfkdq.com\nnjfklngl.com\nnjflt.com\nnjfmz.com\nnjforge.com\nnjfuruisi.com\nnjfybjy.com\nnjfzad.com\nnjfzdc.com\nnjfzjc.com\nnjfzm.net\nnjgaokai.com\nnjgb.com\nnjgcct.com\nnjgcyy.com\nnjgdbus.com\nnjgdhb.com\nnjgdjg.com\nnjgdmm.com\nnjgean.com\nnjggk.com\nnjgh.org\nnjghes.com\nnjghgf.com\nnjgjj.com\nnjgjngq.com\nnjgjsj.com\nnjgjyy.com\nnjgljy.com\nnjglobalielts.com\nnjglsx.com\nnjglyy.com\nnjgn.com\nnjgreen.net\nnjgsmach.com\nnjguangkui.com\nnjgulan.com\nnjguochu.com\nnjguotong.com\nnjguoxuan.com\nnjgy.net\nnjgyjx.com\nnjgzm.com\nnjhanrui.com\nnjhbyl.com\nnjhctest.com\nnjhcyq.com\nnjhd025.com\nnjhddl.com\nnjhdzy.com\nnjhengda.com\nnjhengyou.com\nnjheyang.com\nnjhgame.com\nnjhightech.com\nnjhipower.com\nnjhjgs.com\nnjhjyy.com\nnjhkyq.com\nnjhmmr.com\nnjhnzx.com\nnjhonest.com\nnjhongfa.com\nnjhonghu.com\nnjhongya.com\nnjhoutai.com\nnjhrjt.com\nnjhsjt.com\nnjhszoo.com\nnjhtg.com\nnjhtjt.com\nnjhuachuang.com\nnjhuatian.com\nnjhuatong.com\nnjhuazhu.com\nnjhunyan.com\nnjhxnpx.com\nnjhxzx.com\nnjhy-elec.com\nnjhy-tech.com\nnjhzypiano.com\nnjiabe.com\nnjiairport.com\nnjianzhan.com\nnjibhu.com\nnjibmfwq.com\nnjicg.com\nnjicia.com\nnjiec.com\nnjiig.com\nnjimi.com\nnjjbsc.com\nnjjcbio.com\nnjjdzl.com\nnjjgfckyy.com\nnjjgjs.com\nnjjgzlgl.com\nnjjhjt.com\nnjjht.com\nnjjiancai.com\nnjjianguo.com\nnjjiantian.com\nnjjienuo.com\nnjjifei.com\nnjjknkyy.com\nnjjn.com\nnjjnrc.com\nnjjnwzyy.com\nnjjnzc.com\nnjjrc.com\nnjjrkj.com\nnjjspzx.com\nnjjst.com\nnjjsxy.com\nnjjsyy.com\nnjjtjl.com\nnjjttt.com\nnjjtxx.org\nnjjundong.com\nnjjunpu.com\nnjjuntong.com\nnjjwkj.com\nnjjxtz.com\nnjjz.net\nnjjzsensor.com\nnjjzyxh.com\nnjkaifeng.com\nnjkaiguan.com\nnjkcsj.com\nnjkeeryq.com\nnjkefayuan.com\nnjkerun.com\nnjkeystone.com\nnjkhhb.com\nnjkhly.com\nnjkilter.com\nnjklclear.com\nnjkongte.com\nnjkoopan.com\nnjkpdz.com\nnjkq.net\nnjkskn.com\nnjkzgjj.com\nnjl114.com\nnjlanwu.com\nnjletop.com\nnjlg56.com\nnjlhzn.com\nnjlianyang.com\nnjlietou.com\nnjlike.com\nnjlingyun.com\nnjliterature.org\nnjlizhuo.com\nnjljhy.com\nnjljjy.com\nnjljscl.com\nnjlkjc.com\nnjlndl.com\nnjlofty.com\nnjlonsen.com\nnjloyalty.net\nnjlrxx.com\nnjlsw.com\nnjltxx.com\nnjluye.com\nnjlyc.com\nnjlyjt.com\nnjlzsx.net\nnjmama.com\nnjmapp.com\nnjmatx.com\nnjmbwxzx.com\nnjmdzx.net\nnjmeisai.com\nnjmes.org\nnjmjs.com\nnjmjzn.com\nnjmkt.com\nnjml120.com\nnjmlxy.com\nnjmoon.com\nnjmsdk.com\nnjmuseum.com\nnjmuseumadmin.com\nnjmwwl.com\nnjnanlin.com\nnjnanmu.com\nnjnaws.com\nnjndgl.com\nnjnemin.com\nnjnewgreen.com\nnjnfwl.com\nnjnhsx.net\nnjnhyx.net\nnjnii.com\nnjningyi.com\nnjnkxt.com\nnjnkzz.com\nnjnpfl.com\nnjntdj.com\nnjnwyy.com\nnjnysoft.com\nnjnzrs.com\nnjodu.com\nnjouman.com\nnjpeptide.com\nnjpkwater.com\nnjpkzyy.com\nnjpmp.com\nnjpuao.com\nnjpud.com\nnjpujiang.com\nnjqchyxh.com\nnjqhjy.net\nnjqihong.com\nnjqinghai.com\nnjqxrc.com\nnjrbjd.com\nnjrealway.com\nnjrgrj.com\nnjrjt.com\nnjrmzx.com\nnjrnk.com\nnjrs119.com\nnjrsks.net\nnjrsxh.com\nnjruipu.com\nnjruisen.com\nnjrunk.com\nnjrzkj.com\nnjsadz.com\nnjsanhui.com\nnjsdjt.com\nnjsdyy.com\nnjsech.com\nnjsech.net\nnjsenwo.com\nnjservo.com\nnjsfyb.com\nnjshengde.com\nnjshenglue.com\nnjshsh.com\nnjshsw.com\nnjsimba.com\nnjsjz.com\nnjskxlyy.com\nnjskxlyy.net\nnjslaq.com\nnjslawyers.org\nnjsljy.com\nnjsme.com\nnjsmz.com\nnjspkj.com\nnjspkrmyy.com\nnjsqxqyy.com\nnjsrsyxx.com\nnjsspeek.com\nnjstht.com\nnjstia.com\nnjstudy.com\nnjstx.net\nnjstzbxxx.com\nnjsujing.com\nnjsunchem.com\nnjsunlord.com\nnjsunshine.com\nnjswgs.com\nnjswkj.com\nnjsxfxh.com\nnjsyue.com\nnjsyxy.com\nnjszxyy.com\nnjszy.com\nnjtaihong.com\nnjtapery.com\nnjtechsafety.com\nnjteyun.com\nnjtgdq.com\nnjthgy.com\nnjthsp.com\nnjtjyq.com\nnjtn.com\nnjtobacco.com\nnjtoyo.com\nnjtqw.com\nnjtrabon.com\nnjtransplant.com\nnjtrh.com\nnjtrq.com\nnjtst.com\nnjuchem.com\nnjued.com\nnjuoe.com\nnjupco.com\nnjust.pub\nnjuup.com\nnjuwh.com\nnjvcare.com\nnjvkd.com\nnjw88.com\nnjwbjj.com\nnjwcjx.com\nnjwds.com\nnjweixiao.com\nnjweiyi6.com\nnjwmbj.com\nnjwpdi.com\nnjwqqx.com\nnjwrr.com\nnjwsp.com\nnjwtm.com\nnjwtqx.com\nnjwuhe.com\nnjwww.net\nnjwx.com\nnjwz.net\nnjwzjsw.com\nnjxax.com\nnjxcj.com\nnjxfcft-tencentclb.cloud\nnjxfcft-tencentclb.com\nnjxfcft-tencentclb.net\nnjxfcft-tencentclb.work\nnjxiaochi.com\nnjxizebio.com\nnjxjjsjt.com\nnjxkyy.net\nnjxlhd.com\nnjxlxx.com\nnjxnjt.com\nnjxsmz.com\nnjxty.com\nnjxueyun.com\nnjxushang.com\nnjxwyl.com\nnjxxrc.com\nnjxyyy.com\nnjxzwh.com\nnjyafeng.com\nnjyaoze.com\nnjycwy.com\nnjydky.com\nnjyec.com\nnjyhhj.com\nnjyhznkj.com\nnjyjglxh.com\nnjyjxh.com\nnjyjzz.com\nnjyouwin.com\nnjypk.com\nnjyqhj.com\nnjyqkj0ksyz.com\nnjyqmj.com\nnjyspharma.com\nnjysw.com\nnjytian.com\nnjytyy.com\nnjyuanlang.com\nnjyule.club\nnjyulong.com\nnjyuyuan.com\nnjyxdq.com\nnjyy.com\nnjyy.name\nnjyydl.com\nnjyyhyxh.com\nnjyysf.net\nnjyz.net\nnjyzdl.com\nnjyzgz.com\nnjyzmj.com\nnjzb.net\nnjzb.org\nnjzdhotel.com\nnjzdyq.com\nnjzdyy.com\nnjzec.com\nnjzefeng.com\nnjzfy.com\nnjzhengluan.com\nnjzhengyuan.com\nnjzhituo.com\nnjzhongtuo.com\nnjzhsw.com\nnjzhuce.com\nnjzhzx.net\nnjzikao.com\nnjzj.net\nnjzjamc.com\nnjzkwiot.com\nnjzkyy.com\nnjzqzs.com\nnjzrdq.com\nnjzsgroup.com\nnjzxgy.com\nnjzxxyy.com\nnjzychemical.com\nnjzywangluo.com\nnjzztyl.com\nnk-sh.com\nnk8686.com\nnkf-pharma.com\nnkiec.com\nnkjy.com\nnkks378.org\nnkshw.com\nnkuytzv.com\nnkygty.com\nnkzy.com\nnlark.com\nnlbgt.com\nnlecloud.com\nnlhszc.com\nnliniz.com\nnlinkline.com\nnlktj.com\nnlogn.art\nnlpjob.com\nnlplab.com\nnls1853.com\nnlsc.group\nnlscan.com\nnlteck.com\nnlttms.com\nnlww168.com\nnlxn.com\nnlypx.com\nnlyzzzxrmyy.com\nnlzpw.com\nnlzpy.com\nnm178.net\nnm8yx.com\nnmb-bj.com\nnmbcp.com\nnmbfxy.com\nnmboat.com\nnmbxd1.com\nnmbyh.com\nnmcoo.com\nnmcpo.com\nnmet168.com\nnmgbaiju.com\nnmgchina.cc\nnmgczx.com\nnmgd.com\nnmgfood.net\nnmgfrank.com\nnmgfy.com\nnmggwy.org\nnmggyy.com\nnmghhjt.com\nnmghtszkj.com\nnmgjdxy.com\nnmgjkmc.com\nnmgjtjt.com\nnmgjxjy.com\nnmgjyzh.com\nnmgjzyxh.com\nnmglabs.com\nnmglawyer.com\nnmgmarathon.com\nnmgmzys.com\nnmgonline.com\nnmgrsksw.com\nnmgswkj.com\nnmgswtz.com\nnmgup.com\nnmgwhly.com\nnmgwxgs.com\nnmgyjszx.com\nnmimi.com\nnmjtzy.com\nnmjyl.com\nnmkjxy.com\nnmliao.cc\nnmlpa.com\nnmod.net\nnmpfkj.com\nnmrdata.com\nnmrxw.com\nnmsl.gs\nnmslwsnd.com\nnmt2.com\nnmtyxy.com\nnmufh.com\nnmvps.com\nnmwbk.com\nnmweidian.com\nnmxc.ltd\nnmxxprt.com\nnmzh.net\nnn-jinlun.com\nnn-tct.com\nnn.com\nnn12333.com\nnn1yy.com\nnn1zx.com\nnn2fy.com\nnn2yy.com\nnn3yy.com\nnn4yy.com\nnn4z.com\nnn5itt.com\nnn5yy.com\nnn6yy.com\nnn6zx.com\nnn7yy.com\nnn8yy.com\nnn9yy.com\nnnairport.com\nnnanyang.com\nnnayd.com\nnnbanrui.com\nnnbbrn.com\nnnbdfyy.com\nnnbnutritionchina.com\nnnboao.com\nnnbooster.com\nnnboyi.com\nnnbsjyk.com\nnnbtl.com\nnnbupin.com\nnnbyg.com\nnncbre.com\nnncc626.com\nnncg1688.com\nnnch.net\nnnchuangliang.com\nnnchyy.com\nnncj.com\nnncjnkyy.com\nnncjyy.com\nnncjzc.com\nnnclgs.com\nnncnjh.com\nnnctjt.com\nnnctzcfz.com\nnncwsoft.com\nnncxjh.cc\nnncydyf.com\nnncytz.com\nnndache.com\nnndascom.com\nnndayuan.com\nnnddssaaddeeyy.com\nnnddxd.com\nnndegas.com\nnndims.com\nnndj168.com\nnndjg.com\nnndjxcl.com\nnndsj.co\nnndssk.com\nnnduyi.com\nnndya.com\nnndylm.com\nnndz3xu7.com\nnnedqp.com\nnnedu.com\nnnewn.com\nnnfae.com\nnnfcetyy.com\nnnfcxx.com\nnnfdys.com\nnnflkyz.com\nnnflzyyy.com\nnnfrp.com\nnnfsw.com\nnnfwwb.com\nnnfwzl.com\nnngdjt.com\nnngeo.com\nnnggzxc.com\nnngj.com\nnngjj.com\nnngjjx.com\nnnglbj.com\nnngljc888.com\nnngreenscm.com\nnngrhj.com\nnngtbw.com\nnnguphoto.com\nnngxqscy.com\nnngyds.com\nnnhaidong.com\nnnhaoyuan.com\nnnhbsl.com\nnnhccc.com\nnnhccl.com\nnnhcszc.com\nnnhengfu.com\nnnhh8.com\nnnhhhbgs.com\nnnhkdz.com\nnnhlgx.com\nnnhltz.com\nnnhmcj.com\nnnhongbei.com\nnnhpbbs.com\nnnhqcy.com\nnnhqjd.com\nnnhrsip.com\nnnhtsy.com\nnnhuaxin.com\nnnhuaxiong.com\nnnhuishi.com\nnnhwxh.com\nnnhxgg.com\nnnhxwygs.com\nnnhytyy.com\nnnhzkj888.com\nnnhzt.com\nnnippsp.com\nnnit30.com\nnnjajt.com\nnnjajt.xyz\nnnjdgl.com\nnnjgsd.com\nnnjht.com\nnnjhwy.com\nnnjiangmei.com\nnnjieshuo.com\nnnjingchu.com\nnnjingda.com\nnnjingyuan.com\nnnjioko.com\nnnjiuji.com\nnnjiuzhidu.com\nnnjj120.com\nnnjjk.com\nnnjjtgs.com\nnnjkjzs.com\nnnjkwy.com\nnnjl.com\nnnjmskj.com\nnnjnwg.com\nnnjr.co\nnnjsdsoft.com\nnnjsgy.com\nnnjsypx.com\nnnjsza.com\nnnjszlsb.com\nnnjt.com\nnnjtjt.com\nnnjtkt.com\nnnjtyq.com\nnnjuheli.com\nnnjunliang.com\nnnjxbs.com\nnnjy100.com\nnnjzd.com\nnnjzybl.com\nnnkailong.com\nnnkcy.com\nnnkeerlab.com\nnnkeruan.com\nnnkeyuan.com\nnnkhjq.com\nnnkin.com\nnnkj77.com\nnnkqfs.com\nnnkxnz.com\nnnlanfang.com\nnnlfcm.com\nnnlgjt.com\nnnlib.com\nnnljhb.com\nnnljoa.com\nnnljsw.com\nnnlsbl.com\nnnlvdu.com\nnnlwoo.com\nnnlxart.com\nnnlxs.com\nnnlyjp.com\nnnlzhs.com\nnnmama.com\nnnmhzc.com\nnnminghe.com\nnnmingyuanyun.com\nnnmjm.com\nnnmsjdgs.com\nnnmutong.com\nnnmyst.com\nnnmzfy.com\nnnmzof.com\nnnn.vip\nnnn666.com\nnnnen.com\nnnnews.net\nnnngs.com\nnnnntv.com\nnnnuo.com\nnnpckj.com\nnnpma.com\nnnpml.com\nnnpnzx.com\nnnpp.vip\nnnqh.net\nnnqianfan.com\nnnqmjy.com\nnnqsk.com\nnnrbsoa.com\nnnrc.net\nnnrfjc.com\nnnrig.com\nnnrkz.com\nnnrongjie.com\nnnruixin.com\nnnrxzm.com\nnnryf.com\nnnrzfw.com\nnnsanke.com\nnnsatai.com\nnnsbc.com\nnnsc6.com\nnnscsy.com\nnnsdygs.com\nnnsenhong.com\nnnsftz.com\nnnsg520.com\nnnsgx.com\nnnshengan.com\nnnshenghua.com\nnnshzhg.com\nnnsirui.com\nnnsjcgs.com\nnnslx.com\nnnslzy.com\nnnsmk.com\nnnsmy.com\nnnsqr.com\nnnsrjsnzp.com\nnnssyjs.com\nnnstbss.com\nnnsugar.com\nnnsuoyu.com\nnnsupeng.com\nnnswdx.com\nnnsxd.com\nnnsygs.com\nnnsylq.com\nnnsymy.com\nnnsynldc.com\nnnsynqzyyy.com\nnnsz.com\nnnszwl.com\nnnt0.net\nnntaichu.com\nnnthink.com\nnntlj.com\nnntlyy.com\nnntobo.com\nnnttsoft.com\nnntuobang.com\nnntxw.com\nnntzgz.com\nnnups.com\nnnwb.com\nnnwhg.com\nnnwilking.com\nnnwitkey.com\nnnwk.net\nnnwow.com\nnnwrxd.com\nnnwsgl.com\nnnwtgs.com\nnnwxtzgs.com\nnnwysc.com\nnnwytl.com\nnnxchda.com\nnnxcx.com\nnnxczxjt.com\nnnxdj.com\nnnxfz.com\nnnxiehehospital.com\nnnxinxiang.com\nnnxiyun.com\nnnxjtf.com\nnnxknkyy.com\nnnxl.net\nnnxmbh.com\nnnxqy.com\nnnxsypco.com\nnnxt.net\nnnxxzl.com\nnnybf.com\nnnybskq.com\nnnych.com\nnnydcs.com\nnnyfjc.com\nnnyhjc.com\nnnyhtx.com\nnnyhxl.com\nnnyingxuan.com\nnnyiya.com\nnnyjpco.com\nnnykx.com\nnnylhz.com\nnnynrc.com\nnnyongzhou.com\nnnysart.com\nnnyunying.com\nnnyy17.com\nnnyypc.com\nnnyyq.com\nnnyyyy.com\nnnzc.net\nnnzdbz.com\nnnzgh.org\nnnzgkj.com\nnnzhaoguan.com\nnnzhenyukj.com\nnnzhnm.com\nnnzhuoli.com\nnnzjjckj.com\nnnzjqc.com\nnnzksy.com\nnnzkzs.com\nnnzljx.com\nnnzmyx.com\nnnzn1.com\nnnzp.com\nnnzp.net\nnnzp8.com\nnnzw168.com\nnnzxtx.net\nnnzyjob.com\nno-mad-world.club\nno1news.com\nno8ms.com\nnoahedu.com\nnoaheducation.com\nnoahgroup.com\nnoahhealthcare.com\nnoahpharm.com\nnoahsnail.com\nnoahsoft-vn.com\nnoahteck.com\nnoahwm.com\nnoarter.com\nnobb.cc\nnobel120.com\nnoblefashion.hk\nnobleliftgroup.com\nnoblove.com\nnocang.com\nnocare.com\nnoclyt.com\nnocobase.com\nnocode-tech.com\nnocode.com\nnocode.host\nnod32jihuoma.com\nnodcloud.com\nnode-is.green\nnode1link.xyz\nnodeing.com\nnodejs999.com\nnodekey.com\nnodelayusdtcasino.com\nnodeme.site\nnodepacific.com\nnodpcba.com\nnoeic.com\nnohost.pro\nnohup.cc\nnoipto.host\nnoirphoenix.studio\nnoizztv.com\nnokeeu.com\nnokia-sbell.com\nnokia.press\nnokia88.com\nnokurack.com\nnolanchou.com\nnolibox.com\nnologo.tech\nnolovr.com\nnomax.vip\nnome.com\nnomuaexander.com\nnomuaheridan.com\nnomuamarcia.com\nnomura-nset.com\nnomuraoi-sec.com\nnonfemet.com\nnongbaike.net\nnongbaotong.com\nnongcun5.com\nnongcundating.com\nnongfadai.com\nnongfuspring.com\nnonggan.com\nnonghushi.vip\nnongji1688.com\nnongji1958.com\nnongji360.com\nnongjiao.com\nnongjiaoyun.com\nnongjitong.com\nnongjx.com\nnongkaigufen.com\nnongkeyu.com\nnongli.com\nnongli.net\nnonglirili.net\nnongmintv.com\nnongnet.com\nnongpin88.com\nnongplay.com\nnongshang.com\nnongxinyin.com\nnongyao001.com\nnongye.tv\nnongyedns.com\nnongyelu.com\nnongyemen.com\nnongyie.com\nnongyu.net\nnonobank.com\nnoobboss.com\nnoobkrf.com\nnoobmb.com\nnoobn6.com\nnoobofficial.com\nnoobsb.com\nnoobshanhe.com\nnoobtime618.com\nnoobvip.com\nnoobwatches.com\nnoobyard.com\nnoobyy.com\nnoobzz.net\nnoodba.com\nnoogel.xyz\nnoomuuhapmav.com\nnoonaspizza.com\nnoonnoora.com\nnoontec.com\nnoops.me\nnooshen.com\nnootoo.com\nnooxion.com\nnoposion.com\nnor-land.com\nnoratechpharma.com\nnorchem-pharma.com\nnordicic.com\nnordicways.com\nnordikr.com\nnordkete.com\nnordonfire.com\nnordritools.com\nnorinco-vehicle.com\nnorinco.com\nnorincogroup-ebuy.com\nnorionpro.com\nnorislam.com\nnoritzd.com\nnormanes.com\nnormar8888.com\nnormcore.com\nnormstar.net\nnorroybioscience.com\nnorsencn.com\nnorth30degrees.com\nnorthbundforum.com\nnorthdy.com\nnorthernlights.ink\nnorthgun.com\nnorthland-bio.com\nnorthsoar.com\nnorthtexascribs.com\nnorthtimes.com\nnosec.org\nnosoul99.com\nnossmoke.com\nnosub.net\nnosuchfield.com\nnosugar.tech\nnosugartech.com\nnot3.com\nnotbucai.com\nnote52.com\nnotedeep.com\nnotetao.com\nnotetech.org\nnotion.pet\nnotonlymoon.com\nnotrisk.com\nnouriz.com\nnova-test.com\nnovaicare.com\nnovapps.com\nnovastagepharma.com\nnovastargame.net\nnovaxinli.com\nnovel-supertv.com\nnovelbio.com\nnovelfm.com\nnovelfmpic.com\nnovelfmstatic.com\nnovelfmvod.com\nnovell.me\nnovelquickapp.com\nnovelquickapppic.com\nnovemideas.com\nnovipnoad.com\nnovo-auto.com\nnovo-biotech.com\nnovocool.com\nnovocranes.com\nnovodriv.com\nnovogene.com\nnovosns.com\nnovotelcitygate.com\nnovotrail.com\nnovotrails.com\nnovots.com\nnovtecgroup.com\nnovtium.com\nnow-cn.net\nnowapi.com\nnowbeta.com\nnowchip.com\nnowcndns.com\nnowcoder.com\nnowcoder.net\nnowcoder.org\nnowec.com\nnowhttps.com\nnowmsg.com\nnowo.com\nnowodds.com\nnowre.com\nnowscore.com\nnowtop.net\nnowxz.com\nnoxagile.duapp.com\nnoxgroup.com\nnoxnny.com\nnoxpadelsale.com\nnoxxxx.com\nnoyes88.com\nnpbbs.net\nnpbeta.com\nnpc233.com\nnpcka.com\nnpedi.com\nnpfls.com\nnphoto.net\nnpi-sh.com\nnpilasers.com\nnpjzjx.com\nnplusgroup.com\nnplusgroup.net\nnpmmirror.com\nnpmss.com\nnpmtrend.com\nnpoall.com\nnpodevelopment.org\nnpp-battery.com\nnpp.cc\nnpqx.com\nnprc.net\nnprnat-i.akamaihd.net\nnpsdyyy.com\nnpsel.com\nnptpark.com\nnptparking.com\nnptwedding.com\nnpub.net\nnpuxs.com\nnpxsw.com\nnpz.com\nnq6.com\nnq8.net\nnqctek.com\nnqez.com\nnqiief.com\nnqjt.com\nnqlai.com\nnqmoui.com\nnqqpp.com\nnqyz.org\nnr-esc.com\nnrb.cc\nnrbbearing.com\nnrdzqwd.com\nnrec.com\nnri-beijing.com\nnrisc.com\nnrmchina.com\nnrmtc.com\nnrsfh.com\nnrsg.net\nnruan.com\nnrwspt.com\nnrzb0.com\nns-china.net\nns1.hk\nns1011.com\nns168.net\nns222s.com\nns365.net\nns5n.com\nns6s6.com\nns8d.com\nnsbdjssy.com\nnsbeta.info\nnsccsc.com\nnschctw.com\nnscloudwaf.com\nnscscc.com\nnscscc.org\nnsd-at.com\nnsdfx.net\nnsdic.com\nnsdszsyxx.com\nnsdt.cloud\nnseac.com\nnsecsoft.com\nnseia.com\nnsemii.com\nnsfocus-sase.com\nnsfocus.com\nnsfocus.net\nnsforce.net\nnsfz.net\nnsfzqhkg.net\nnsgz.net\nnshen.net\nnshzpks.com\nnsig.com\nnsini.com\nnsiqoaks.com\nnsisfans.com\nnsiuqsjaza.com\nnskfagcn.com\nnsknsk.com\nnskwj.com\nnsm-electrical.com\nnsmodel.com\nnsoad.com\nnsqtlcdn.cc\nnsqtlcdn.info\nnsrcup.com\nnsrfww.com\nnsrjlb.com\nnsrmarine.com\nnsseii.com\nnssf.work\nnsshare.com\nnsstream.com\nnsswa.org\nnstfhg.com\nnstggroup.com\nnsuci.com\nnsuuu.com\nnsw58.com\nnsw88.com\nnsw99.com\nnswhj.com\nnswscp.com\nnswyun.com\nnswzs.com\nnsxdns.com\nnsxww.com\nnsydt.com\nnsyhwakrkq2.com\nnsynu.com\nnszmz.com\nnszone.com\nnszxsyxx.com\nnszynd66ggbcx.com\nnt.app\nnt.cc\nnt56.net\nnt6y.com\nnt7fck19y3.com\nntaow.com\nntc-lft.com\nntc.sh\nntcaac.com\nntcchina.com\nntce.com\nntcfy.com\nntdingke.com\nntdjk.com\nntdsyy.com\nntdvf.com\nntes53.com\nntes53.net\nntescdn.com\nntesmail.com\nntesunn.com\nntfabu.com\nntfan.com\nntfegd.xyz\nntfhgj.com\nntflk.com\nntfssh.com\nnthcl.com\nnthfw.com\nnthongda.com\nnthysp.com\nnti56.com\nntiee.com\nntjgjt.com\nntjgpx.com\nntjhbw.com\nntjhzy.com\nntjob88.com\nntjoy.com\nntjsxy.com\nntjymall.com\nntjzyxh.com\nntkfqjy.com\nntlcjd.com\nntmlxm.com\nntmyexp.com\nntneuro.org\nntp.felixc.at\nntp123.com\nntpcb.com\nntpcn.com\nntpharma.com\nntptimeserver.com\nntqcct.com\nntqfdq.com\nntrailway.com\nntrc.com\nntrcb.com\nntrun.com\nntsanxin.com\nntservicepack.microsoft.com\nntsgx.com\nntsuye.com\nnttui.com\nntwikis.com\nntwzy.com\nntxx.net\nntxz.net\nntyodspt.com\nntyodspt.net\nntyswlkj.com\nntyy888.com\nntzhcs.com\nnu1l.com\nnu36.vip\nnuan.chat\nnuan.io\nnuan.org\nnuancaixs.com\nnuancepharma.com\nnuandao.com\nnuanjiayuan.com\nnuannuanapp.com\nnuannuanzu.com\nnuanpaper.com\nnuanque.com\nnuanshi100.com\nnuantingapp.com\nnuantong8.com\nnuanyuehanxing.com\nnubb.com\nnubia.cc\nnubia.com\nnubia.mobi\nnucc.com\nnucleisys.com\nnuctech.com\nnuedc-ti.com\nnuedcchina.com\nnufans.net\nnufrr.com\nnuhcpf.com\nnuhighbio.com\nnuist.pro\nnulipin.com\nnullice.com\nnullno.com\nnullprivate.com\nnum1dns.com\nnum2020.com\nnumans.cc\nnumemory.com\nnunaios.com\nnuo5.com\nnuoan.com\nnuobaike.com\nnuobeiliao.com\nnuobeirack.com\nnuobz.com\nnuocdn.com\nnuodaguandao.com\nnuodefund.com\nnuodepharm.com\nnuoder.com\nnuoerchina.com\nnuofanpay.com\nnuoguangsh.com\nnuohotel.com\nnuoji.com\nnuoke147.com\nnuomi.com\nnuomicikoi.com\nnuomili.com\nnuomiphp.com\nnuomisi.com\nnuona.com\nnuonuo.com\nnuoshell.com\nnuoshou2023.com\nnuosike.com\nnuoxun.com\nnuoyahao.com\nnuoyasite.com\nnuoye.xyz\nnuozhan.com\nnuozhensh.com\nnuptec.com\nnuqixi.com\nnurotron.com\nnursesky.com\nnusudia.org\nnuszar.xyz\nnutdh.com\nnutra-max.com\nnutriease.com\nnutriera.com\nnutrilite-farm.com\nnutsbp.com\nnutspace.com\nnutstart.com\nnutstore.net\nnutstorehq.com\nnutzam.com\nnuvoltatech.com\nnuvoton-m0.com\nnuvoton-mcu.com\nnuxtv.com\nnuxue.com\nnuyoahbk.com\nnv2118.com\nnvans.com\nnvcam.net\nnvcong.com\nnvgate16.nvidia.com\nnvhaiz.com\nnvidia-china.com\nnvkan.com\nnvpuse.com\nnvpuwo.com\nnvsay.com\nnvsheng.com\nnvshengjie.com\nnvsip.com\nnvwu.com\nnvyouguoji.com\nnvzhanshen.com\nnvziwu.com\nnw-host.com\nnw0898.com\nnwbiotec.com\nnwct.me\nnwdlink.com\nnweon.com\nnwncd.com\nnwshotel.com\nnwzg.net\nnx-sc.com\nnx.cm\nnx12346.com\nnx5.com\nnxadmin.com\nnxcells.com\nnxcrb.com\nnxdns.net\nnxeduyun.com\nnxengine.com\nnxez.com\nnxgangyi.com\nnxgjbyy.com\nnxgtjt.com\nnxgyzb.com\nnxhongshanhe.com\nnxin.com\nnxist.com\nnxit.us\nnxjwl.com\nnxlayer2.com\nnxls.com\nnxly766.com\nnxmy.com\nnxnba.com\nnxnews.net\nnxnmedia.com\nnxnresearch.com\nnxny.com\nnxpta.com\nnxrmyy.com\nnxrrvmy.com\nnxrte.com\nnxruixin.com\nnxsjgd.com\nnxstjt.com\nnxsyy.com\nnxtf.net\nnxtianshangb.com\nnxxdns.com\nnxxh.net\nnxxhr.com\nnxxinhaoyuan.com\nnxxllt.com\nnxxmqy.com\nnxxzyimg.com\nnxyqs.com\nnxyqs.net\nnxyxh.net\nnxyy.asia\nnxzcah.com\nnxzhnyyjy.com\nnxzwnews.net\nny-yy.com\nny1988.com\nny2000.com\nnya.ink\nnyaacat.com\nnyat.app\nnyato.com\nnybai.com\nnybaidu.net\nnybw.net\nnybyggx.com\nnyckidsclub.com\nnyd7y.com\nnydsrrsh.com\nnyefy.com\nnyfzx.com\nnyjvbs.xyz\nnyjy-china.com\nnylingshang.com\nnync.com\nnypd520.com\nnyrmyy.com\nnysenba.com\nnysgjgs.com\nnyshipyard.com\nnyshszh.com\nnyshui.com\nnysswq.com\nnywz.net\nnyxg.vip\nnyxgs.com\nnyxiecheng.com\nnyxlzy.com\nnyxr-home.com\nnyxx365.com\nnyxz166.com\nnyyfy.com\nnyzdjj.com\nnyzy.com\nnz86.com\nnz998.com\nnzb555.com\nnzbdw.com\nnzcxh.com\nnzggroup.com\nnzghotel.com\nnzhnb.com\nnziku.com\nnzkd.com\nnzlw.com\nnzmice.com\nnzqyowk.com\nnzrlzy.com\nnzsensing.com\nnzsiteres.com\nnzw6.com\nnzwgs.com\nnzxww.com\nnzygyt.com\no--o.win\no-home.com\no-hr.com\no-netcom.com\no-star.cc\no.pki.goog\no0-2.com\no014148q7p.com\no03011aokk.com\no03080aokk.com\no0310o.com\no03121aokk.com\no0o0w.com\no136.com\no2123.com\no2ee.com\no2moment.com\no2o4.com\no2oa.net\no2obill.com\no2ocms.com\no2ocn.com\no2oexpo.com\no2onet.com\no2packs.com\no2pcn.com\no2ting.com\no37o.net\no3ndix.com\no571.com\no5zyk9vu2d.com\no6s.net\no790l1uw6q.com\no92mv1ik.baby\noa025.com\noa0351.com\noa7day.com\noa8000.com\noa8858.com\noabc.cc\noabg.net\noachee.com\noacrm.com\noact.net\noafocus.net\noahelp.com\noahelp.net\noaimai.com\noait360.com\noak-amc.com\noaloft.com\noaloft.net\noalur.com\noameibang.com\noaooa.com\noaqi.com\noasesalliance.com\noasistry.com\noatenglish.com\noatos.com\noauto.com\noayqwkhg.com\noaz.cc\nobagame.com\nobai.cc\nobaku.com\nobatsipilisjos.com\nobeesmedia.com\nobeishi.com\nobesu.com\nobetal.com\nobins.net\nobj.cc\nobj6.com\nobjccn.io\nobjcer.com\nobjcoding.com\nobkoro1.com\nobolee.com\noborad.com\nobowin.com\nobrao.com\nobsapp.net\nobsbot.com\nobsidian-display.com\nobsworks.com\nobtelecom.com\nobyee.com\nocahs.com\nocale.net\nocamar.com\nocar.tv\noccasionishoes.club\noccpay.com\nocd120.com\noceanaircorp.com\noceanbase.com\noceanbites123.com\noceancloudapi.com\noceancus.com\noceandatas.com\noceando.cloud\noceanengine.com\noceanhood.com\noceanol.com\noceanorama.com\noceanpine.net\noceanplayable.com\noceantime.org\nocent.net\nocetest.com\nocfess.com\nocft.com\nochirly.com\nochsystems.com\nocic-static.com\nocici.com\nocideal.com\nocimg.com\noclean.com\noclkj.com\nocn187.com\nocpuritech.com\nocsjs.com\nocsp.pki.goog\nocsp.us.cdnetworks.com\nocssaas.com\noct-asia.com\noct-cts.com\noctbay.com\noctcommercial.com\nocteshow.com\noctgulou.com\noctholding.com\nocthotels.com\noctinn.com\noctmami.com\nocto.fm\noctocathub.com\noctoparse.com\noctopus31.com\noctopusgame.com\noctre.com\noctsszj.com\noctsunshine.com\noctwuhan.com\noculist.net\nocwms.com\nocwuaibq.com\nocypo.org\nodaily.news\nodalong.com\nodao.com\nodeasports.com\nodict.net\nodinichina.com\nodinjc.com\nodinjilin.com\nodinliu.com\nodlkj.com\nodohx.org\nody8.com\nodypw.com\nodyzj.com\noealy.com\noeasy.org\noec365.com\noecd-ilibrary.org\noecr.com\noectib.com\noedtech.com\noedun.com\noeebee.com\noeeee.com\noejournal.org\noelove.com\noemao.com\noemhouse.com\noemnew.com\noempromo.com\noemresource.com\noemsoc.download.prss.microsoft.com\noemsocuat.download.prss.microsoft.com\noemssl.cn.cdn.cloudflare.net\noeob.net\noepamvxq.com\noepkgs.net\noepkgs.org\noesell.com\noetsi.com\nof3d.com\nofcard.com\nofcms.com\nofdreader.net\nofenka.com\noffcn.com\noffer-wow.com\nofferpluscn.com\noffersloc.com\noffice-cn.net\noffice-kagu1.com\noffice-peixun.com\noffice68.com\noffice8hour.com\nofficeaid.com\nofficeaid02.com\nofficebai.com\nofficebay.net\nofficecdn.microsoft.com\nofficectrl.com\nofficemkt.download.prss.microsoft.com\nofficemktuat.download.prss.microsoft.com\nofficese.com\nofficeweb365.com\nofficezhushou.com\nofficezy.com\noffodd.com\noffshoremedia.net\nofgame.net\nofidc.com\nofo.com\nofopp.com\nofpay.com\nofpay365.com\nofuns.com\nofweek.com\nofweek.net\nofyoo.com\nogame3.com\nogaoxiao.com\nogaqcbfi.com\nogccdn.com\nogivzztz.com\nogl-dragon.com\nogsoyxg.com\nogxeidiv.com\noh100.com\noh4k.com\nohausyt.com\nohedu.net\nohgnylbp.shop\nohipic.com\nohltjt.com\nohltk.com\nohneen.com\nohohklp.xyz\nohqly.com\nohtly.com\nohtpc.com\nohyee.cc\noi-wiki.com\noi-wiki.org\noi3g.com\noia05041klq.com\noia05050klq.com\noia05051klq.com\noiaqye7985.com\noicat.com\noicp.io\noicp.net\noicp.vip\noicq88.com\noicto.com\noidchina.org\noigcn.com\noigps.com\noiine.com\noiinhand.info\noilchem.net\noilcn.com\noildigital.com\noilepay.com\noilmooc.com\noinbag.com\noincp.com\noinva5yl.com\noioidesign.com\noioiok.com\noioj.net\noishi-tm.com\noiwas.com\noiz611.com\nojcdn.com\nojhdt.com\nojidacp.com\nojkjt.com\nojpal.com\nok-meeting.com\nok-skins.com\nok0415.com\nok06.com\nok096.com\nok100i.work\nok123.com\nok126.net\nok1616.com\nok165.com\nok168.com\nok183.com\nok206.com\nok3w.net\nok619.com\nok888883.com\nok9624.com\noka-vip.com\nokaapps.com\nokad.com\nokada-china.com\nokadwin.com\nokair.net\nokaoyan.com\nokayapi.com\nokaybio.com\nokbao.com\nokbase.net\nokbmf.com\nokbuy.com\nokcard.com\nokcdnns.com\nokchang.com\nokchexian.com\nokcxo.com\nokdai.com\nokdcc.com\nokdd.net\nokemu.com\nokex.vip\nokeycar.com\nokfang.com\nokgoes.com\nokhimalayanzi.com\nokhqb.com\nokidc.com\nokideaad.com\nokii.com\nokjc.one\nokjike.com\nokjk.co\nokk123.com\nokki.com\nokktee.com\noklaapp.com\noklinklink.com\noklpoi.com\nokmao.com\nokmart.com\nokmyapp.com\nokng.com\nokooo.com\nokoooimg.com\nokplife.com\nokpush.com\nokr.com\nokrecovery.com\noks.ltd\noksec.net\noksun.com\noksvn.com\noktamall.com\noktjy.com\noktools.xyz\noktranslation.com\noktukids.com\nokuer.com\nokuma-byjc.com\nokvnet.com\nokweb.info\nokwfqz.org\nokwuyou.com\nokxr.com\nokyueche.com\nol-cdn.com\nol-img.com\nolabo.net\nolacio.com\nolakeji.com\nolami.ai\nolatop.com\nolatop.net\noldboyedu.com\noldcat.me\noldding.net\noldj.net\noldmanemu.net\noldmantvg.net\noldpan.me\nole-vod.com\nolecn.com\noleoad.com\noli-wolong.com\noliannews.com\nolidun.com\nolinone.com\nolipharma.com\noliver.ren\noliveryang.net\nollomall.com\nolmhedbg.cc\nolo4.com\nolokitchen.com\noltfm.com\nolwsz.com\nolxd.com\nolympicmuseum-nj.org\nolymtech.com\nolymvax.com\nolys88.com\nolzz.com\nomacloud.com\nomarea.com\nomarte.com\nomaten.com\nombuy.com\nomccsh.com\nomchain.com\nomcube.com\nomedsc.com\nomeet.cc\nomegatravel.net\nomegaxyz.com\nomen.com\nomgaixm.com\nomgxy.com\nomiaozu.com\nomicsclass.com\nomicshare.com\nomicshare.net\nomifanyi.com\nomigr.com\nomlzx.com\nomlzz.com\nommoo.com\nomni-pharma.com\nomnijoi.com\nomnivision-group.com\nomnshoes.com\nomobi.cc\nomooo.com\nomooo.net\nomos88.com\nomowork.com\nompchina.net\nompower.cc\nomronmed.com\noms-elevator.com\nomsheji.com\nomsmy.com\nomso2o.com\nomycar.cc\nomyerp.com\non-sun.com\nonaliyun.com\noncanyin.com\nonccc.com\noncdp.com\nonceai.com\nonceoa.com\nonche.net\noncity.cc\none-all.com\none-cdn.com\none-netbook.com\none-punch.win\none.edu.kg\none918.com\nonealert.com\noneasp.com\nonebash.com\nonebiji.com\nonebox.site\nonebrowser.net\nonebuygz.com\nonecoder.site\nonecommunity-asia.com\noneconnectft.com\nonedi.net\nonediankeji.com\nonedict.com\nonedns.net\noneflys.com\nonefoot365.com\nonegobrand.com\nonegreen.net\nonehome.me\nonehousesh.com\noneic.com\nonein.com\noneinf.com\noneitfarm.com\noneiwff.com\nonekey.cc\nonekeyghost.com\nonekeyrom.com\noneleafchina.com\nonelic.work\nonelife-love.com\nonelinkplus.com\nonemtservers.com\nonenice.tech\noneniceapp.com\nonenoter.com\noneonewrite.com\noneplus.com\noneplus.net\noneplus6666.com\noneplusbbs.com\noneplusmobile.com\nonescorpion.com\noneself.icu\noneshao.com\nonesight.com\nonespacechina.com\nonesun-china.com\nonething.net\nonethingc.com\nonethingcloud.com\nonethingd.com\nonethingn.com\nonethingpcs.com\nonethingtech.net\nonetop.net\nonetts.com\noneuedu.com\nonev.cat\nonevcat.com\noneway.mobi\nonewedesign.com\nonewo.com\nonewos.com\nonewsimg.com\nonewtech.com\nonexinli.com\nonexmail.com\nonexunge.com\noneyac.com\nonezapp.com\nonezh.com\nonfun.net\nongoalconveying.com\nongoaltech.com\nonijiang.com\nonishi-cn.com\nonixhiend.com\nonjobedu.com\nonkocares.com\nonlady.net\nonline-cmcc.net\nonline-edu.org\nonline-phaidon.shop\nonlinecn.com\nonlineding.com\nonlinedown.net\nonlinekr.com\nonlinenic.net\nonlinesjtu.com\nonlinesurvey.work\nonlinexijiang.com\nonlly.com\nonloon.net\nonly-memory.com\nonly-moment.com\nonly4.work\nonlyedu.com\nonlyedu.net\nonlyeduit.com\nonlygamefans.com\nonlyidc.com\nonlylady.com\nonlyling.com\nonlyliuxue.com\nonlymr.com\nonlypat.com\nonlyred.net\nonlyrobotedu.com\nonlyrubberparts.com\nonlystem.com\nonlywem.com\nonnets1.xyz\nono-bbb.com\nonochem.com\nonrunningshop.com\nonsiteclub.com\nontall.com\nontheroadstore.com\nonthetrip.com\nonthink.com\nonwaf.com\nonwear.net\nonwork.com\nonwsw.com\nonyealink.com\nonyi.net\nonyuan.com\nonyxcina.com\nonyxwater.net\nonyy255q8c.com\noo14.com\noo365.com\nooamjs.work\noobao.net\noocct.com\noocheoo.com\nooclab.com\noodii.com\noofont.com\noofos-sandals.net\noogcw.com\noogps.com\noogsy.com\noohdear.com\nooiii.com\noojsq.com\noolap.com\noomake.com\noonne.com\noooccc.com\nooofoo.com\nooogo.com\noooiove.com\nooojogo.com\nooomm.com\nooooai.com\noooooooooo213.com\nooopic.com\noopswow.com\noopz.vip\noortgslb.com\noortos.tech\nootu.cc\noouee.com\noouyan.com\noov.cc\nooxoo.net\nooxxc.com\nooyyee.com\nop86.net\nopadlink.com\nopahnet.com\nopaidb.com\nopal-qt.com\nopalhk.com\nopark.com\nopatseg.com\nopcool.com\nopdown.com\nopectek.com\nopen-ct.com\nopen-douyin.com\nopen-falcon.com\nopen-falcon.org\nopen-open.com\nopen-search.org\nopen-verify.cc\nopen-whatsapp-hk.vip\nopen.cd\nopen1024.com\nopen147.com\nopen189.net\nopenaboc.com\nopenadx.com\nopenai.wf\nopenailab.com\nopenanolis.org\nopenapp.run\nopenasic.org\nopenatom.club\nopenbayes.com\nopenbcs.com\nopencas.org\nopencitybrain.org\nopencloudgpt.online\nopencloudos.org\nopencloudos.tech\nopencourt.vip\nopendatalab.com\nopendns123.com\nopenedv.com\nopenerp.hk\nopeneuler.org\nopeneuler.sh\nopenew.com\nopenfans.org\nopenfde.com\nopenfrp.net\nopengame0.com\nopengcc.org\nopengslb.com\nopenharmonyproject.com\nopenhippy.com\nopeninstall.com\nopenintelliedge.tech\nopenke.net\nopenkylin.top\nopenlanguage.com\nopenlaw.work\nopenlayers.vip\nopenlearning.com\nopenlink.cc\nopenloong.org\nopenloongson.org\nopenluat.com\nopenmidas.com\nopenmmlab.com\nopenmv.cc\nopenos.org\nopenqa.com\nopenrasp.com\nopenrasp.info\nopenrasp.net\nopenrasp.org\nopenredcloud.com\nopenrice.com\nopenrtbadx.com\nopensoce.com\nopensplendid.com\nopenssw.com\nopenswap.space\nopentrust.net\nopenuc.com\nopenvela.com\nopenwbs.com\nopenwrt.ai\nopenwrt.pro\nopenxiaoniu.com\nopenxsea.com\noperachina.com\nopfed.com\nopfibre.com\nopgw-oppc.com\nopjmw1.ren\nopkjh.com\noplay.net\noplinking.com\noplus.com\noplustrust.com\nopmaterial.com\nopp2.com\noppein.com\nopplestore.com\noppo.com\noppo.mobi\noppodigital.com\noppoer.me\noppofind.com\noppojia.com\noppomobile.com\noppopay.com\nopportunuity.com\nopposales.com\nopposhop.in\nopposhore.com\noppowork.com\nopqnext.com\noprtb.com\nopsapp.com\nopshields.com\nopsjuas.shop\nopskb.com\nopskumu.com\nopstatics.com\nopstatistics.com\nopstool.com\nopt-os.com\noptbbs.com\nopticres.com\nopticsjournal.net\noptimized-ai.com\noptinetchina.com\noptiondoma.com\noptmv.com\noptol.net\noptomedic.com\noptuk2.com\noptzmx.com\nopuzswk5tbt25.com\nopwill.com\nopython.com\noqss.com\noqwizd.com\noqwnfambg.com\nor-sun.com\noracle-tencent.com\noracle-tencent.net\noracle-tencent.org\noracle.com\noraev.com\norafl.com\noralpractice.com\norange-ci.net\norange2h.com\norangeapk.com\norangeclk.com\norangelovely.com\norangemum.com\norangenews.hk\norangepi.org\norangesgame.com\norangetage.com\norangevip.com\noraper.com\norasos.com\noray.com\noray.net\noraybox.com\noraycn.com\norayer.com\norayimg.com\norbiepharm.com\norbitmes.com\norcadt.com\norchid-lanhua.com\norchome.com\norcode.com\norcony.com\nordchaos.com\nordedr.com\norderorigin.com\nordinaryroad.tech\nordosbank.com\nordosqyjt.com\nordostonghui.com\norebotech.com\norepainc.com\norfactory.com\norg-hddnf.vip\norg-tollsi.cc\norgano-sz.com\norgcc.com\norggd.com\norgleaf.com\noriemac.com\norient-fund.com\norient-opto.com\norient-safety.com\norientaldata.com\norientalgas.com\norientalpearltower.com\norientalplaza.com\norientalwisdom.com\norientcable.com\norientcasa.com\norientengg.com\norientfoods.net\norientgene.com\norientgolf.com\norientgroup.com\norientpc.com\norientpowertech.com\norientscape.com\norienttextile.com\norienttumor.com\norientzj.com\norientzr.com\norifound.com\norigin-a.akamaihd.ne\norigin-a.akamaihd.net\noriginalimg.com\noriginalkindergarten.com\noriginalstatic.com\noriginalvod.com\norigincn.com\noriginlee.com\noriginoo.com\noriginpic.com\noriginsilicon.com\noriginwater.com\norigloria.com\norihard.com\noriphant.com\noritive.com\noriza.com\norjlight.com\norleto.com\norm-compressor.com\norolay.com\norsoon.com\norspr.com\norstatic.com\norsun.cc\nortc.cc\nortmk.com\norvaegao.com\norvibo.com\norz-dns.com\norz.asia\norz520.com\norz6.com\norzoupri.com\norztip.com\nos-easy.com\nos-lb.com\nos-os.com\nos-v.com\nos7blue.com\nosaaa.com\nosakacopyshop.com\nosapublishing.org\nosase.net\nosbdf.com\nosbean.com\nosbkj.com\nosbzr.com\nosc.cool\noscaches.com\noscarzhoud.com\noschina.com\noschina.io\noschina.net\noscs1024.com\nosechina.com\nosee-dig.com\noseminfo.com\noserror.com\nosf2f.net\nosf5xep778.com\nosfipin.com\nosgchina.org\nosgervirtual.com\nosgraph.com\nosgz.com\noshadan.com\noshield.com\noshome.com\noshoplive.com\noshwhub.com\nosicgroup.com\nosizx.com\nosjiaju.com\nosk-clean.com\noskwai.com\noskwai.net\noslaw.net\nosm-pearls.com\nosmanbio.com\nosmundacn.com\nosnvuqwlsjakf.com\noso6.com\nosogoo.com\nosoos.com\nososn.com\nosp.io\nospchina.com\nospod.com\nosportsmedia.com\nospp.com\nospuq.org\nosredm.com\nosrelease.download.prss.microsoft.com\noss-cn-beijing-aliyuncs.com\noss.link\nossdshxh.com\nosslan.com\nosuxrq.com\nosvlabs.com\nosw3c.com\noswdj.com\noswhy.com\nosx.cx\nosxxy.com\nosyunwei.com\notakirispring.org\notbmall.com\notc-china.com\notcaumiu.com\notcgd.com\notcms.com\notkglass.com\notm.ink\notms.com\notoeasy.com\notomedream.com\notosaas.com\notp-express.com\notpub.com\notqyzk7mx2t8.com\nott-live.olympicchannel.com\nott4china.com\nottai.com\nottcn.com\nottcn.help\nottffss.net\nottshopping.net\nottssp.com\nottv.tv\notuxu.com\notype.com\nou163.com\nou99.com\nouapi.com\noubauneereid.com\noubiix.lol\noubk.com\nouchang.net\nouchengzl.com\nouchgzee.com\noucuibo.com\noudapay.com\noudas.tech\noudianyun.com\nouei-sc-mulohomasi.com\noufa-travel.com\noufengblog.com\noufusoft.com\nougei.com\nouhua.info\nouhui.org\nouies88.com\nouj.com\noujiangroup.net\noujistore.com\noukan.online\noukyx.com\noulagongshi.com\noulehdtv.com\noulgp.com\nouliwang.com\noulongauto.com\nouluwind.com\nouluyun.com\noulvnet.com\noumaan.com\noumakspt.com\noume.cc\noumengke.com\nouming.com\noumoo.com\nounh.org\nounoe.com\nounuoyq.com\nouo7.com\nouou.com\nouou.icu\nououbet.com\nouougo.com\noup.com\noupaigroup.com\noupeng.com\noupeng9.com\noupengcloud.net\noupula.com\noupuzw.com\nour100.net\nour360vr.com\nourai.ws\nourail.com\nourats.com\nouravr.com\nourbits.club\nourbloom.com\nourbluecity.com\nourcargo.com\nourcdns.com\nourchem.com\nourcloudsec.com\nourcm.net\nourdian.com\nourdlbs.com\nourdomains.com\nourdvs.com\nourdvs.info\nourdvs.net\nourdvsss.com\nourdvsssvip.com\nourdvsvip.com\nourdxz.com\nourdxz.info\nourdxz.org\noureman.com\nourep.com\nourfdn.com\nourgame.com\nourger.com\nourglb.com\nourglb.net\nourglb0.com\nourglb0.info\nourglb0.net\nourglb0.org\nourglb0vip.com\nourhf.com\nourhlb.com\nourhlb.info\nourhlb.org\nourhy.net\nourjay.com\nourjewel.com\nourjg.com\nourjiangsu.com\nourjs.com\nourjz.com\nourl.co\nourleadchina.com\nourlife365.com\nourltc.com\nourmate.net\nourmis.com\nourpalm.com\nourplat.net\nourplay.net\nourqm.com\nourren.com\noursakura.com\nourschool.cc\noursec1.com\noursec2.com\nourseo.net\noursmc.com\nourstech.com\nourtour.com\nourunited.com\nourwebat.com\nourwebcdn.com\nourwebcdn.info\nourwebcdn.net\nourwebcdn.org\nourwebcdnvip.com\nourwebhttps.com\nourwebpic.com\nourwebpic.info\nourwebpic.net\nourwebpic.org\nourwebpicvip.com\nouryao.com\nousaikj.com\noushangstyle.com\noushidiban.net\noushinet.com\noushisheng.com\noushivoyages.com\nousweixin.com\noutbrandlink.com\noutes.com\noutfit7.com\noutfit7.net\noutlets365.com\noutletscn.com\noutman.press\noutsoo.com\nouvps.com\nouwost.com\nouxiangxiezhen.com\nouyada.com\nouyade.com\nouyanghuasi.net\nouyaoxiazai.com\nouyeel.com\nouyingyimin.com\nouyizs.com\nouyu158.com\nouzhaorj.com\nouzhou.cc\nouzhougoufang.com\nov5.org\novalechina.com\novaqrzcw.com\novcgegxa.com\novcreative.com\novdlb.com\novdream.com\nove3bi5rpn.com\novear.info\novellpump.com\noversea-ks-cdn.com\noverseasops.com\noverseaspharm.com\novertrue.me\novglass.com\novhlb.com\novhlb.net\novicnet.com\novid.com\novital.com\novital.net\novjpvk.org\novmgc.com\novopark.com\novopic.com\novqq.com\novrvo.com\novscdns.com\novscdns.net\novtfwn.com\novuems.com\novupre.com\novuwork.com\novxe.com\nowalle.com\noway.mobi\nowecn.com\noweidata.com\noweis-tech.com\nowent.net\nowenzhang.com\nowgels.com\nowinchina.com\nowl-go.com\nowlxjz.lol\nowo.cab\nowocloud.net\nowoit.com\nowseals.com\nowsgo.com\nowspace.com\nowulia.com\nox5tis8cm7zg82.com\noxbridgedu.org\noxerr.net\noxfordartonline.com\noxfordbibliographies.com\noxfordmusiconline.com\noxiang.com\noxiaohua.com\noxiranchem.com\noxrm.com\noxygenos.com\noxyry.com\noya365.com\noyalee.com\noyewifi.com\noygteapq.com\noym56lm.com\noyohyee.com\noyonyou.com\noyoozo.com\noyospider.com\noyoumo.com\noysd.com\noywtv.com\noyxdwx.com\noyya.com\noyzns.com\nozmvpbhc.com\nozocenter.com\nozonabc.com\nozonbigsell.com\nozoninfo.com\nozouckzr.com\nozsmartbuy.com\nozzair.org\nozzyad.com\np-an.com\np-bstarstatic.akamaized.net\np-dragon.com\np-e-china.com\np-er.com\np-i.vip\np-pass.com\np-sig-dom.com\np-sig-dom.net\np.biz\np.bstarstatic.com\np.cdn.persaas.dell.com\np023.com\np0371.com\np0431.com\np04e.com\np0kc9ym05p.com\np0y.com\np1.com\np12345.com\np24p75149p.com\np2cdn.com\np2hp.com\np2p001.com\np2p178.com\np2pbbs.net\np2pchina.com\np2pcq.com\np2peye.com\np2peye.net\np2psearchers.com\np2ptouhang.com\np3-china.com\np33t5y8b97.com\np4pfile.com\np4pp.com\np4ws8zptrrdc6.com\np4wtpoqzihi8v.com\np5w.net\np6air.com\np6sai.com\np7game.com\np80.net\np8811.com\np8games.com\np96q3p1m93.world\np99998888.com\npa.ci\npa18.com\npa1pa.com\npaahu.com\npaalermat.com\npaascloud.net\npaat.com\npabulika.com\npacdn.com\npacebms.com\npacfc.com\npacgatelaw.com\npacicanschool.com\npacificchinaaero.com\npacificimmi.com\npacificphar.com\npacilution.com\npackagesddn.win\npackertec.com\npacketmania.net\npacksky.com\npacktom.com\npackty.com\npacmantwo.com\npacs-plus.com\npactera.com\npadao.org\npadasuo.net\npadddy.vip\npaddlepaddle.org\npaddlewaver.com\npadh.net\npadns.com\npadtf.com\npaer.work\npafj.net\npafwl.com\npag.art\npagd.net\npageadmin.net\npagedoo.com\npagescube.com\npageseagle.com\npagetu.com\npahhhf.com\npahx.com\npahys.com\npai.video\npaiago.com\npaiangmedical.com\npaiangstudy.com\npaibanxia.com\npaibaohy.com\npaichen.net\npaichi.com\npaicoding.com\npaidai.com\npaidui.com\npaiduidai.com\npaigepian.com\npaihang114.com\npaihang360.com\npaihang8.com\npaihb.com\npaihotels.cc\npaihuisy.com\npaikew.com\npaiky.com\npaiky.net\npailitao.com\npailixiang.com\npaimaprint.com\npaiming.net\npaintinghere.org\npaints.market\npaipai.com\npaipai123.com\npaipaibang.com\npaipaiimg.com\npaipay.net\npaipianbang.com\npairmb.com\npaishi.com\npaitol.com\npaivideo.com\npaiwan.com\npaixiangxian.com\npaixin.com\npaixueche.net\npaiyidan.net\npaiyuyy.com\npaizhaofanyi.net\npaizhe.com\npaizi.com\npaizi.net\npaizia.com\npaizin.com\npaizishop.com\npajkb.com\npajkdc.com\npajktj.com\npajt.com\npal-fin.com\npalace-international.com\npalanceli.com\npaldq.com\npallasa.com\npally-travel.com\npalm-ad.com\npalm-h.com\npalm.tech\npalma-battery.com\npalmda.com\npalmebook.com\npalmeread.com\npalmestore.com\npalmexpo.com\npalmfungames.com\npalmjoys.com\npalmpay-inc.com\npalmpay.com\npalmpk.com\npalmtrends.com\npalmyou.com\npaloinino.com\npalomachina.com\npamahotel.com\npamica.com\npamss.net\npan-good.com\npan-ics.com\npan-key.com\npan131.com\npan58.com\npan8.net\npanabit.com\npanaihua.com\npanasiashipping.com\npanasonic-door.com\npanasonicmall.com\npanawincn.com\npanbaidu.net\npanbrake.com\npanchinasports.com\npanchip.com\npanchuang.net\npanda-home.com\npanda-js-power.com\npanda.ren\npanda98.com\npanda995.xyz\npandabus.cc\npandadairy.com\npandadastudio.com\npandafoundation.org\npandagreen.com\npandahome.org\npandainc.cc\npandaminer.com\npandapaint.net\npandara.xyz\npandaremit.com\npandateacher.com\npandatv.com\npandax.wiki\npandolia.net\npanduoduo.net\npangbo51.com\npangbu.com\npangcheng.com\npangdago.com\npangdasc.com\npangdly.com\npangeng.vip\npanggugu.com\npanghuasheng.com\npangjun.com\npangku.com\npangku01.com\npangmao56.com\npangmaovc.com\npangod.com\npangodsxbj.com\npangoing.com\npangolin-sdk-toutiao-b.com\npangolin-sdk-toutiao.com\npangolin-sdk-toutiao1.com\npangolin-sdk-toutiao2.com\npangolin-sdk-toutiao3.com\npangolin-sdk-toutiao4.com\npangomicro.com\npangqiu.com\npangshare.com\npangshu.com\npangsuan.com\npangu.io\npangubox.com\npanguhotel.com\npanguidc.com\npangukj.com\npangusheng.com\npanguso.com\npangxieke.com\npangyuan.com\npanjiayuan.com\npanjin.net\npanjindamibest.com\npanjk.com\npanku.cc\npankuaisou.com\npanlai.com\npanlan.com\npanli.com\npanlv.net\npanmeme.com\npannacloud.com\npanocom.com\npanoeade.com\npanomix.com\npanoramastock.com\npanothers.com\npanpanfood.com\npanpanzsw.com\npanpass.net\npanpay.com\npanqiincs.me\npanqishu.com\npanruikj.com\npanshenlian.com\npanshi101.com\npanshianquan.com\npanshihudong.com\npanshiminerals.com\npanshixk.com\npanshiyun.com\npanshy.com\npansino-solutions.com\npanso.pro\npansoso.com\npansou.com\npansousuo.com\npantherhealthcare.com\npantonechina.com\npantower.com\npantrysbest.com\npantuitui.com\npantum.com\npanwangkeji.com\npanweizeng.com\npanxsoft.com\npanyiyun.com\npanyouwl.com\npanyun.com\npanyunkj.com\npanyuwater.com\npaoao.net\npaodoo.com\npaojiao.com\npaoka.com\npaokucloud.com\npaolanhuanbao.com\npaomo.com\npaomochengxingji.com\npaopao.com\npaopaoche.net\npaopaohd.com\npaopaosz.com\npaoshuba.cc\npaoshuba.org\npaoxue.com\npaozhengtong.com\npaozw.org\npapa21.com\npapa91.com\npapago.hk\npapajohnschina.com\npapajohnshanghai.com\npapapa.tv\npapatya.store\npapazw.com\npapegames.com\npaper-translation.com\npaper.tv\npaper120.net\npaperang.com\npaperask.com\npaperbert.com\npaperbus.com\npaperbye.com\npaperccb.com\npaperclipglobal.com\npapercool.com\npaperdb.com\npapereasy.com\npaperge.com\npaperinsight.net\npaperisok.com\npapernew.net\npaperok.com\npaperonce.org\npaperopen.com\npaperpass.com\npaperpass.org\npaperpp.com\npaperrater.net\npaperright.com\npapers.cool\npapersay.com\npapersee.com\npapertime.cc\npapertime.shop\npapertime.vip\npaperweekly.site\npaperword.com\npaperyy.com\npapocket.com\npapuanewguineans.com\npaquapp.com\nparallelsras.com\nparatera.com\nparawikis.com\nparduscycle.com\nparentshk.com\nparis-girafe.com\nparisblackpride.org\nparkbees.com\nparketech.com\nparkicloud.com\nparking520.com\nparkinginfoweb.com\nparkingjet.com\nparkingos.club\nparkingpda.com\nparkingquickly.com\nparkingsaas.com\nparkingwang.com\nparkmecn.com\nparkonroad.com\nparkshen.com\nparkviewgreen.com\nparkwaychina.com\nparkworld.net\nparkyardhotel.com\nparsein.com\npartinchina.com\npartner-group.com\npartner.cdnetworks.com\npartnerboost.com\nparty68.com\npaschermontre.to\npasecng.com\npasertech.com\npashu5.org\npass7.cc\npasser-by.com\npassfab.com\npassfab.tw\npassion120.com\npassiongroupltd.com\npassip.xyz\npassnat.com\npassthepopcorn.me\npasswordkeyboard.com\npat-edu.com\npat-edu.org\npatachina.org\npatchallin.com\npatchew.org\npatek.website\npatekphilippe.website\npatent9.com\npatentguru.com\npatexplorer.com\npatfun.com\npatheagames.com\npatholancet.com\npathologycn.com\npatiencepoker.com\npatsev.com\npatsnapglobal.com\npatv123.com\npaul-corp.com\npaul.pub\npaulzzh.com\npauwaypower.com\npavay.com\npavayjt.com\npavilionshenzhenhotel.com\npaxdn.com\npaxgl.com\npaxhz.com\npaxini-robot.net\npay-in.com\npay-lakala.com\npay-ly.com\npaybaike.com\npaydxm.com\npayeco.com\npayititi.com\npaykwai.com\npaylf.com\npaympay.com\npaynews.net\npaypaytech.com\npaytollbyv.world\npaytolltfd.world\npaytollvfd.world\npb89.com\npbaohza.com\npbc-dcep.com\npbcan.com\npbcedu.net\npbcft.com\npbchizhou.com\npbdpw.com\npbiso.com\npbkrs.com\npblie.com\npbqdhty.com\npbrcw.net\npbsvpn.com\npbtcw.com\npbtlpm.com\npbtsl.com\npbtt.net\npbtxt.com\npbyz.net\npc-120.com\npc-daily.com\npc.wiki\npc02.com\npc028.com\npc120.com\npc15.net\npc168.com\npc18.net\npc186.com\npc34.com\npc360.net\npc51.com\npc520.net\npc521.net\npc5210.com\npc528.net\npc55.com\npc6.com\npc699.com\npc6a.com\npc89.com\npc8h.com\npc9.com\npcapqz.com\npcasl.com\npcauto.com\npcb-hl.com\npcb-membraneswitch.com\npcb3.com\npcb818.com\npcbask.com\npcbba.com\npcbbar.com\npcbbbs.com\npcbeta.com\npcbhunt.com\npcbjob.com\npcbserve.com\npcbsheji.com\npcbtech.net\npcbtime.com\npccm88.com\npccpa.hk\npccppc.com\npcdan.net\npcdn100.com\npcdnhome.com\npcdog.com\npcdrv.com\npcdtg.com\npceggs.com\npceva.net\npcfphs.com\npcfreetime.com\npcgeshi.com\npcgogo.com\npcgta.cc\npch.pub\npchome.com\npchome.net\npchpic.net\npcidv.com\npciiss.com\npcitc.com\npcitech.com\npcjsq.com\npcljl.com\npcmgr-global.com\npcmgr-global.net\npcmoe.net\npcoic.com\npcoof.com\npcoyx.com\npcpc521.com\npcpop.com\npcpresent.com\npcqudong.com\npcr9170.com\npcscedu.com\npcsee.org\npcsfc.com\npcshou.com\npcsjsm.com\npct86.com\npctutu.net\npctvx.com\npcw365.com\npcwcn.com\npcweb3.com\npcwenti.com\npcwgu.com\npcwl.com\npcxitongcheng.com\npcyangguangban.com\npcysy.com\npcz.net\npczhi.com\npd-italent.com\npd-sts.com\npd120.com\npd17.com\npdafans.com\npdai.tech\npdb2.com\npdbeta.com\npdd-fapiao.com\npdd.net\npddcdn.com\npddeu.com\npddglobalhr.com\npddim.com\npddpic.com\npddugc.com\npddxfd.com\npdeepmatrix.com\npdf.la\npdf00.com\npdf1122.com\npdfangchan.com\npdfbianji.com\npdfdo.com\npdffsy.com\npdfjia.com\npdflibr.com\npdfxd.com\npdfzj.com\npdgohome.com\npdgzf.com\npdhr.com\npdidc.com\npdie-expo.com\npdinvestmentgroup.com\npdlib.com\npdlnn.com\npdloscar.com\npdm.tech\npdnob.com\npdosgk.com\npdrcfw.com\npdreading.com\npdreamer.com\npdryx.com\npdscb.com\npdsey.com\npdsgjj.com\npdshouse.com\npdskgb.com\npdswater.com\npdsxww.com\npdszhtl.com\npdty123.com\npduoduo.vip\npdvc.com\npdvisa.com\npdwxo.vip\npdxx.net\npdxxg.com\npdzls.com\npe-exhibition.com\npe.vc\npe898.com\npeace-read.com\npeacebird.com\npeaceboat.net\npeacepetro.com\npeacha.net\npeacockedu.com\npeak-labs.com\npeaksport.com\npeakyun.cc\npeal.cc\npear.hk\npearlinpalm.com\npearvideo.com\npeasrch.com\npeatour.com\npebellows.com\npeccn.com\npechoin.com\npecmgd.com\npecoo.com\npediatrixtherapeutics.com\npediy.com\npedli.com\npeekpipai.com\npeento.com\npeepic.com\npeerkennel.com\npegbiocq.com\npeidibrand.com\npeidu.com\npeihao.space\npeihu-lyjkgl.com\npeihuyi.com\npeijiamedical.com\npeijian.com\npeijian8.net\npeikua.com\npeilian.com\npeiluming.com\npeiluyou.com\npeipusci.com\npeise.net\npeisebiao.com\npeiwan.tv\npeiwanlu.com\npeiwantv.com\npeixianedu.com\npeixiang.com\npeixinbao.com\npeixinkj.com\npeixinyi.com\npeixun.net\npeixun360.com\npeixun5.com\npeixune.com\npeixunla.com\npeixunmatou.com\npeixunxue.com\npeiyake.com\npeiyicha.com\npeiyin.net\npeiyinge.com\npeiyingefiles.com\npeiyingo.com\npeiyinshenqi.club\npeiyinxiu.com\npeiyou.com\npeiyouwang.com\npeiyue.com\npeizi.com\npejdw.com\npejxjy.com\npekhongyuan.com\npeksung.com\npelejs.com\npelorseating.com\npemap.com\npemch.com\npenavicoxm.com\npending-renewal-domain.com\npengbaoxuan.com\npengboguandao.com\npengchengenergy.com\npengchenglx.com\npengfei.com\npenghh.fun\npenging.com\npengke.com\npenglei.name\npengliao.com\npengpailaw.com\npengqi.club\npengqian.win\npengrl.com\npengrui-ssj.com\npengshancy.com\npengtuzm.com\npenguin-logistics.space\npengxinziyuan.com\npengyaou.com\npengyihotel.com\npengyou.com\npengyou.net\npengyoukan.com\npengyuanled.com\npengyucpa.com\npengyuwei.net\npengzhihui.xyz\npenhuijiqi.com\npeninsula-med.com\npenlingaizao.com\npenno-pallet.com\npensunny.com\npentalaser.com\npentaq.com\npentatomic.com\npentiw.com\npenyouw.com\npenzai.com\npenzealcn.com\npeople-squared.com\npeople78.com\npeople78.net\npeopleapp.com\npeopleart.tv\npeopledailyhealth.com\npeopledailypress.com\npeoplehealthdata.com\npeoplekg.com\npeoplelamp.com\npeoplemooc.com\npeoplerail.com\npeoplewang.com\npeopleyuqing.com\npepresource.com\npepsimeipai.com\npepsitmall.com\npeptide-china.com\nperfect-input.com\nperfect99.com\nperfectdiary.com\nperfecttradinghk.com\nperfectwatchen.com\nperfertw.com\nperfma.net\nperopero.net\nperoperogames.com\npersagy.com\nperseverany.com\npersonabook.net\npersonpsy.org\nperspectivar.com\npescms.com\npesiv.com\npesrmyy.com\npesyun.com\npet-mri.com\npet86.com\npetaindonesia.org\npetalmail.com\npetalmaps.com\npetalsdata.com\npetctchina.com\npetctw.com\npeter-zhou.com\npeterjxl.com\npetersonjace.shop\npetersonlian.com\npetgugu.com\npethr.com\npetkit.com\npetkoo.com\npetktasia.com\npetly.net\npetmrchina.com\npetmrs.com\npetope.com\npetpcb.com\npetpetin.com\npetrexchina.com\npetroren.com\npetrostaroil.com\npetrvet.com\npetssky.com\npewax88.com\npewld.com\npewsc.com\npexue.com\npf.net\npf110.com\npf168.com\npfcexpress.com\npfhoo.com\npfinno.com\npfjekm.org\npfmmedicalchina.com\npft12301.cc\npftianshanno.com\npfwx.com\npfzhiliao.com\npg-leak.com\npg114.net\npgbee.com\npgc.tv\npgcaststone.com\npgcog.com\npgdz.com\npgdz4422.com\npggho.com\npghqa.org\npgidp.com\npgidw.com\npgive.com\npgjcqm.com\npgjxo.com\npgl-world.com\npglstatp-toutiao-b.com\npglstatp-toutiao.com\npgmcatalyst.com\npgos.cc\npgosglobal.com\npgpop.com\npgq.win\npgqcw.com\npgqjz7733.com\npgrm.site\npgsql.tech\npgxqw.net\npgxxw.com\npgy6.com\npgyapi.com\npgyer.cc\npgyer.com\npgyer.im\npgyidc.com\npgyy.com\npgyy.vip\npgzs.com\npgzx.net\nph-fc.com\nph365.bond\nph66.com\nphaenothera.com\nphaetonsemi.com\nphalapi.net\nphantasy.life\npharaohvisionstudios.com\npharbers.com\npharm81.mobi\npharmacn.com\npharmacodia.com\npharmacyyf.com\npharmalego.com\npharmcube.com\npharmengin.com\npharmglass.com\npharmproc.com\npharmzs.com\npharnexcloud.com\npharscin.com\nphaser-china.com\nphb01.com\nphb123.com\nphbang.net\nphedu.net\nphemu.net\nphenom-sem.com\nphet.fan\nphezzan.com\nphgll.com\nphhongyu.com\nphicomm.com\nphilanthropy.xin\nphilipswechat.com\nphilisense.com\nphiljang.work\nphirda.com\nphirs.com\nphjqs.com\nphjt.com\nphlexing.com\nphmacn.com\nphnamedns.com\nphnixhome.com\nphnixpool.com\npho.so\nphodal.com\nphoemix.net\nphoenix-ea.com\nphoenixfilters.net\nphoenixos.com\nphoenixtea.org\nphoenixtv.com\nphoent.com\nphoer.net\nphome.net\nphone580.com\nphonecoolgame.com\nphonegap.me\nphonegap100.com\nphonelinksoft.com\nphonertech.com\nphonthing.com\nphopic.com\nphosun.com\nphotc.com\nphoto0086.com\nphoto3050.com\nphoto889.com\nphotocnc.com\nphotocome.com\nphotohn.com\nphotoncounts.com\nphotonpay.com\nphotops.com\nphotosks.vip\nphp-note.com\nphp-oa.com\nphp100.com\nphp168.com\nphp168.net\nphp318.com\nphpbbchina.com\nphpbloger.com\nphpcashshare.com\nphpchina.com\nphpcom.net\nphpcomposer.com\nphpconchina.com\nphpcoo.com\nphpddt.com\nphpdr.net\nphpe.net\nphpernote.com\nphperservice.com\nphperz.com\nphpfs.com\nphpha.com\nphphub.org\nphpjiami.com\nphpjiayuan.com\nphpkaiyuancms.com\nphplife.net\nphpor.net\nphpsong.com\nphpspider.org\nphpstat.net\nphpub.mobi\nphpv.net\nphpwc.com\nphpwc.info\nphpweb.net\nphpweblog.net\nphpwind.com\nphpwind.net\nphpxs.com\nphpyun.com\nphsb.com\nphysicalchina.com\nphysicalchina.vip\nphysicalclub.com\nphysike.com\nphysoe.com\nphyuan.com\nphyy.com\nphzg.com\npi7.com\npiaget-hello.com\npianbar.net\npianbingji.com\npiankuai.com\npianohl.com\npianor.com\npianoun.com\npianpian.net\npiantou.net\npianyilo.com\npianyit.com\npianyiwan.com\npiao.com\npiao.tips\npiao88.com\npiao95.com\npiaobing.com\npiaobuy.com\npiaochong.com\npiaocom.com\npiaodaren.com\npiaode.ren\npiaodian.net\npiaododo.com\npiaodown.com\npiaogroup.com\npiaohomeinn.com\npiaohua.com\npiaojubao.com\npiaolia.com\npiaoliang.com\npiaoliusan.com\npiaoniu.com\npiaoqianqian.com\npiaoquantv.com\npiaoshen.com\npiaotian.org\npiaotongyun.com\npiaowutong.cc\npiaowutong.com\npiaoxian.net\npiaoxingqiu.com\npiaoyi.org\npiaoyun.net\npiaozone.com\npiasy.com\npiaviation.com\npic-cname.cc\npic-png.com\npic16.com\npic21.com\npic315.com\npic3733.com\npic720.com\npicacgp.com\npicatown.com\npicbling.com\npicc.com\npiccamc.com\npicchealth.com\npiccjs.com\npicdlb.com\npicdns.com\npicing.com\npickme.cc\npickpikka.com\npicooc.com\npicosmos.net\npicovr.com\npicoxr.com\npicp.io\npicp.net\npicsandquotes.com\npicsays.com\npictureknow.com\npicup.shop\npicxiaobai.com\npicyourmix.com\npicyq.com\npidcn.com\npidoutv.com\npidru.com\npiececool.com\npieceofbake.net\npieeco.com\npiekee.com\npiekee.net\npieshua.com\npifa.bz\npifa333.com\npiflogistics.com\npifukezaixian.com\npig4cloud.com\npig66.com\npigai.org\npigcms.com\npighaihe.com\npigji.com\npigmentlc.com\npigmoral.tech\npigonline.org\npigsq.com\npigsty.cc\npigv5.com\npigx.vip\npigyun.com\npihitech.com\npihmh.com\npiimg.com\npiios.com\npikoplay.com\npikpak.me\npikpakdrive.com\npil0txia.com\npilaipiwang.com\npilidns.com\npilifu.com\npilimeng.com\npimaoji.com\npimax.com\npimei.com\npimgeek.com\npin-color.net\npin18pin.com\npin2eat.com\npin5i.com\npinan1688.com\npinbaitai.com\npinbaiyan.com\npinbang.com\npinbayun.com\npinble.com\npinble.net\npinchain.com\npinchedashi.com\npinchetang.com\npincn.com\npinda.com\npinduoduo.com\npinduoduo.net\npinelephant.com\npinestoneasset.com\npinfangw.com\npinfeng.group\npinfun.com\nping-an.net\nping-jia.net\nping-qu.com\nping99.com\npingan.com\npingan.com.hk\npingancdn.com\npinganfang.com\npinganfu.net\npingansilu.org\npinganventures.com\npinganwj.com\npinganyun.com\npinganzhengxin.com\npinganzhengyang.com\npingcap.com\npingce.net\npingchuangyl.com\npingcode.com\npingcode.tech\npingcoo.com\npingdingshan.me\npingdurc.com\npingevip.com\npingfangx.com\npingfanli.com\npingfenbang.com\npinggao.com\npinggaogroup.com\npinggu.com\npinggu.org\npingguobaoxiu.com\npingguodj.com\npingguoid.com\npingguolv.com\npinghe.com\npinghu.tech\npinghui-cn.com\npingjiata.com\npingmudiy.com\npingnanlearning.com\npingnantong.com\npingnuosoft.com\npingpangwang.com\npingpingw.com\npingpingze.com\npingplusplus.com\npingpongx.com\npingpongx.org\npingshu365.com\npingshu8.com\npingshuku.com\npingshuocoal.com\npingshuxiazai.com\npingstart.com\npinguan.com\npinguo.us\npingwest.com\npingxiangzhifa.com\npingxiaow.com\npingxuan123.com\npingxx.com\npingyin.cc\npingzishuo.com\npinhaohuo.com\npinhui001.com\npinidea.co\npinjiago.com\npinjiao.com\npinjiaolian.com\npinjie.cc\npinjieqicai.com\npinjiesj.com\npinkecity.com\npinkehao.com\npinkertech.com\npinkoichina.com\npinkou.com\npinla.com\npinlyu.com\npinmanduo.com\npinmuch.com\npinocchiowb.com\npinpai-bang.com\npinpai1.com\npinpai37.com\npinpaihuoyuan.com\npinpailiu.com\npinpaime.com\npinpointloc.com\npinpopt.site\npinqugongxiangktv.com\npinqukeji.com\npinshu.com\npinsuodesign.com\npintangshi.com\npintechpharma.com\npintreel.com\npintu360.com\npintuan.com\npintuanya.com\npintuer.com\npintuju.com\npintuxiu.net\npinuc.com\npinwaiyi.com\npinweiqifu.com\npinxianghui.com\npinxianghui.net\npinyafang.com\npinyinxiang.com\npinyuan.cc\npinyuew.com\npinzhenglh.com\npinzhi.org\npinzhi365.com\npinzhikeji.net\npinzs.com\npioneer-pharma.com\npioneer-pku.com\npioneerchina.com\npioneerep.com\npioneernews.cc\npioneersci.com\npipa.com\npipacoding.com\npipahealth.com\npipaw.com\npipaw.net\npipedetect.com\npipegg.com\npipgame.com\npipikou.com\npipikun.com\npipilu.com\npipimp3.com\npipipi.net\npipipifa.com\npipishu.com\npipiti.com\npipix.com\npipixue.com\npipsemi.com\npipuda.com\npiqs.com\npiscesys.com\npisx.com\npitayaio.com\npiuqiupia.com\npivotacp.com\npivotautomotive.com\npiwxal.work\npixbe.com\npixcakeai.com\npixcakes.com\npixcheese.com\npixe44lrifted.com\npixelauth.com\npixeldance.com\npixelgame.net\npixepf.sbs\npixiaojiang.com\npixivic.com\npixpark.net\npiyanzi.com\npiyipiba.com\npj-666.com\npj-road.com\npj.com\npj0099.com\npj09.com\npj334.org\npj39800.com\npj57.com\npj62049.com\npj73.com\npjbest.com\npjf.name\npjgear.com\npjgjg.com\npjhome.net\npjhubs.com\npjjjw.com\npjjyzx.com\npjlyds.com\npjob.net\npjtime.com\npjtka.com\npk106.com\npk137.com\npk2234.com\npk38.com\npk532.com\npk7o.com\npk995.com\npkbeta.com\npkbff.com\npkbigdata.com\npkcity.com\npkfish.com\npkfj.xyz\npkfun.com\npkgame.com\npkghund.com\npkgklk.com\npki.plus\npkm360.com\npkma.cc\npko123.com\npkoplink.com\npkpmjc.com\npkpmsoft.com\npkpuke.com\npkq.xyz\npksf8.com\npksfc.com\npksky.com\npkslow.com\npkt-cable.com\npku-cele.com\npku-hc.com\npku-hit.com\npku-lvxin.com\npku666.com\npkucare.com\npkucarenjk.com\npkucnooch.com\npkufh.com\npkufi.com\npkugac.com\npkulaw.com\npkulaws.com\npkulb.com\npkuncii.com\npkunn.com\npkuph.com\npkuphqd.com\npkupuzzle.art\npkurc.com\npkusky.com\npkusp.com\npkuszh.com\npkutourism.com\npkuxue.com\npkvs.com\npkwenku.com\npl999.com\nplaidc.com\nplalzhang.com\nplanary-yz.com\nplanckled.com\nplanetariuminsight.site\nplanetarylighting.com\nplanetmeican.com\nplanpelham.com\nplantb2b.com\nplantname.xyz\nplantnutrifert.org\nplantower.com\nplas-cn.com\nplasdata.com\nplastics-machinery-equipment.com\nplasway.com\nplateno.cc\nplateno.com\nplatenogroup.com\nplatform-cn.com\nplatform.dell.com\nplatinum-traveller.com\nplatinumchina.com\nplay-analytics.com\nplay-cdn10.com\nplay-cdn11.com\nplay-cdn13.com\nplay-cdn14.com\nplay-cdn16.com\nplay-cdn19.com\nplay-cdn2.com\nplay-cdn20.com\nplay-cdn7.com\nplay.craft.moe\nplay.jinnantv.top\nplay.scrstv.com\nplay.sngdxsn.com\nplay68.com\nplay700.com\nplay910.com\nplay920.com\nplaybattleaces.com\nplaycase.com\nplaychd.com\nplaycomet.jp\nplaycool.com\nplaycrab.com\nplaydanji.com\nplaydisorder.com\nplayer.200877926.top\nplayerinfinite.com\nplayezu.com\nplayfifa.com\nplaygm.cc\nplayhousemag.com\nplaylu.com\nplayorcas.com\nplaypangu.com\nplaytai.com\nplaytai.net\nplaywonderful.com\nplaywxgame.com\nplayyx.com\nplayzy.com\nplb1.com\nplbig.com\nplc100.com\nplc11.com\nplcent.com\nplchinese.com\nplcjs.com\nplcloud.com\nplctlab.com\nplentypolymer.com\npleo-securelogin.com\nplesk-cn.com\nplex2.com\nplexpt.com\nplfrog.com\nplll-fluid.com\nplob.org\nplopco.com\nplottersyservicioshdz.com\nplpwz.com\nplsbd.com\nplsdeyy.com\nplsfybjy.com\npltgd.com\npluosi.com\npluralitycn.com\nplures.net\nplus-chem.com\nplus-space.com\nplus3gallery.com\nplusco-tech.com\nplusgantt.com\nplusplus7.com\nplusplustu.com\nplusrtc.com\nplutoer.com\nplutuspay.com\npluveto.com\nplvideo.net\nplxao.com\nplxfgroup.com\nplxww.com\nplycd.com\nplyh.com\nplyhjt.net\nplyygs.com\nplyz.net\nplzly.com\nplzx.net\nplzyll.com\npm-china.com\npm-leader.com\npm-summit.org\npm222.com\npm25.com\npm265.com\npm28.com\npm360.com\npmallstore.com\npmcaff.com\npmceo.com\npmcj-group.com\npmcrobot.com\npmd5.com\npmdak.com\npmdaniu.com\npmdled.com\npmdoudou.com\npmdown.com\npmhfd.org\npmichina.org\npmish-tech.com\npmkiki.com\npmovie.com\npmparkchina.com\npmph.com\npmphai.com\npmphmooc.com\npmptuan.com\npmquanzi.com\npmr66.com\npmsmzyy.com\npmtalk.club\npmtemple.com\npmtown.com\npmway.com\npmx-nanho.com\npmxprecision.com\npmxsd.com\npmyes.com\npmyuanxing.com\npn1waq.com\npnas.org\npnetp.org\npnfang.com\npnfq.com\npng.pub\npngbag.com\npngsucai.com\npniao.com\npnol.net\npnst8.com\npntagkyy.com\npntkyy.com\npntryy.com\npnty1688.com\npnwww.com\npnxct.com\npnxyrykj.com\npnzpw.com\npo.co\npo7ryumvkx34.com\npoacefex.shop\npobaby.net\npobasoft.com\npochanguanliyanjiu.com\npochezu.com\npocketcloud.vip\npocketdigi.com\npocketuni.net\npockpower.com\npocomagnetic.com\npocosite.com\npocsuite.org\npodcast.xyz\npodfest.tech\npodinns.com\npodjiasu.org\npodunjiasu.com\npoem88.com\npoemlife.com\npoemschina.com\npohaier.com\npohover.com\npoikm.com\npoint-memory.com\npoiuytw.com\npoizon.com\npoj.org\npojianyunfu.com\npoke203.com\npokemmc.com\npokemon-unitepgame.com\npokemon.vip\npokerbros.net\npokercup.net\npokermate.net\npoketb.com\npolamus.com\npolariton.life\npolarloco.com\npolars.cc\npolarxiong.com\npolaxiong.com\npolayoutu.com\npolebrief.com\npolingba.com\npolo-king.com\npoloxue.com\npoluosenko.com\npoly-gx.com\npoly-pm.com\npolycd.com\npolycent.com\npolycinemas.com\npolycn.com\npolycom-jl.com\npolyflowenergy.com\npolyhotel.com\npolyhotels.com\npolyinno.com\npolyreymed.com\npolytheatre.com\npolyv.net\npolywuye.com\npolyxfb.com\npomears.com\npomeloyun.com\npomoho.com\npondernext.com\nponging.store\nponkong.com\nponley.com\npontite.com\npony.ai\nponyai-cn.com\nponycool.com\nponyemu.com\nponyfk.com\nponytest.com\nponytestqd.com\nponytestsh.com\nponytestsz.com\npoo1.club\npooban.com\npooeoo.com\npoofoo.com\npooioo.com\npook.com\npookcdn.com\npooketools.com\npoorren.com\npop-bags.com\npop-fashion.com\npop-shoe.com\npop136.com\npop365.com\npopcj.com\npopcustoms.com\npopdg.com\npopgo.org\npopincdn.com\npopkart.tv\npopkx.com\npoploli.com\npopmart.com\npopmartfans.cc\npopmtstyle.com\npopoffices.com\npopoho.com\npopoim.com\npopovivi.com\npopoxiu.com\npopqiu.com\npopsoft.com\npopss.biz\npopumed.com\npopupgrade.com\npoputar.com\npopziti.com\nporation-vac-tech.com\nporlockz.com\nport-m.com\nportalcdn.cdnetworks.com\nportcontainer.com\nporthebei.com\nportjs.com\nportjs.net\nportjswl.com\nportlyg.com\nportmansevenstars.com\nports-intl.com\nportsgmt.com\nporttong.com\nportugal-visacenter.com\nporu-mro.com\nporyf.com\npos58.com\npos580.com\nposbar.com\nposcerwatch.com\nposeidong.com\nposeidonqianshui.com\nposfree.com\nposge.com\nposmcc.com\nposn.net\npospalit.com\npospos.com\npost-delivered.today\npost163.com\npost183.net\npostarlight.com\npostdelivered.today\nposterlabs.com\npostgres.fun\npostgresqlchina.com\npostjson.com\npostnord.xin\npostpony.com\npostxin.com\nposyn.com\nposzjia.com\npotalapalace.com\npotassiumnitrate-zx.com\npotato.gold\npotensic.com\npotevio.com\npothros.asia\npotianji.net\npotnsik-faastink898.com\npotomaccottage.com\npotops.com\npotplayer.org\npotplayercn.com\npouchcontainer.io\npouquiagievu.com\npouser.net\npova-elc.com\npower-rail.com\npower-sprayer.com\npower86.com\npower8t.com\npowerapp.io\npowerbeijing-ec.com\npowerbeijing.com\npowerbibbs.com\npowercdn.com\npowerchina-intl.com\npowerchinaleasing.com\npowerchinanewenergy.com\npowerchinashow.com\npowerchinayun.com\npowerde.com\npowereasy.net\npowerex1.com\npowerflow-tech.com\npowerfulchina.com\npowerhubei.com\npoweric-china.com\npowerlandtech.com\npowerlaw.ai\npowerleaderidc.com\npowerliber.com\npowerlong.com\npowerlongmuseum.com\npowerma.net\npowermaxcorp.com\npoweron.cc\npowerpigs.net\npowerpms.com\npowerrsoft.com\npowerskystudio.com\npowerstationofart.com\npowerstonetech.com\npowertensors.ai\npowertradepro.com\npowervision.me\npowerworldgd.com\npowerxene.com\npowpegxw.com\npowzamedia.com\npoxiaowy.com\npoxiaoxinxi.com\npoyour.com\npozou.com\npp.cc\npp100.com\npp1o.com\npp25.com\npp250.com\npp30.com\npp365.com\npp373.com\npp51.com\npp540.com\npp63.com\npp918.com\npp9l.com\nppad.com\nppaiss.com\nppbizon.com\nppbnchina.com\nppcho.com\nppcn.net\nppcode.com\nppcost.com\nppcwzebv.com\nppdai.com\nppdaicdn.com\nppdaicorp.com\nppdd.com\nppdesk.com\nppdqk.com\nppduck.com\nppdys.vip\nppfeng.com\nppforging.com\nppgallery.com\nppgame.com\nppgg.in\nppgmm.com\nppgslb.com\npphimalayanrt.com\nppia-china.com\nppinfra.com\nppio.cloud\nppio.work\nppj.io\nppjtc.net\nppkankan01.com\nppkjinc.com\nppkoo.com\npplib.net\npplive.com\npplive.net\npplm1996.com\npplp.info\nppm-htv.com\nppm2.com\nppmake.com\nppmm.org\nppmoney.com\nppnews.vip\nppos.com\nppp.gold\nppparking.net\npppcar.com\npppet.net\npppie.com\npppiii.com\npppnnm.com\npppoevps.com\nppppic.com\nppppoints.com\nppq.me\npprxcdn.com\npps.tv\nppsao.com\nppsimg.com\nppsoftw.com\nppspain.com\nppsport.com\nppstream.com\nppstream.net\nppstv.com\nppstv.net\nppsurl.com\nppsz.net\nppt118.com\nppt20.com\nppt360.com\nppt920.com\npptair.com\npptbest.com\npptboss.com\npptbz.com\npptelf.com\nppter8.com\nppthi-hoo.com\npptianliao.com\npptiyu.com\npptkj.net\npptmall.net\npptniu.com\npptsq.com\npptstore.net\npptsupermarket.com\npptui.com\npptutor.com\npptv.com\npptv5.com\npptvdata.com\npptvimg.com\npptvnet.com\npptvyun.com\npptxy.com\nppurl.com\nppvi.net\nppwan.com\nppwang.com\nppwenda.com\nppwfa.com\nppwow.cc\nppwwyyxx.com\nppx520.com\nppxclub.com\nppxiaoshuowang.com\nppximg.com\nppxm.com\nppxmw.com\nppxs.net\nppxstatic.com\nppxsw.co\nppxvod.com\nppxwo.com\nppzhan.com\nppzhilian.com\nppzuche.com\nppzw.com\npqdtcn.com\npqneq.com\npqpo.me\npqt-bearing.com\npqtygsfkv.com\npqyhigh.com\npqylow.com\npqymiddle.com\npqyvzr56aceitx.com\npqzhichan.com\npr020.com\npr027.com\npr0771.com\npr1bg.com\npradabao.com\npratic-cnc.com\nprayaya.com\nprayaya.net\nprayaya.org\nprcedu.com\nprcee.org\nprcfe.com\nprcvalve.com\nprecision-biotech.com\nprecision-biz.com\npreludeid.com\npremedglobal.com\npresenceall.com\npressmine.com\nprestodb-china.com\nprestolite-bj.com\nprettech.com\npreyp.net\nprfc-cn.com\nprfog.com\nprhljt.com\npricl.com\nprimadiagnostic.com\nprimarychina.com\nprime-care.com\nprime-semi.com\nprime3c.com\nprimegene.net\nprimerachina.com\nprimeton.com\nprincechem.com\nprint86.com\nprinterwhy.net\nprinthome.com\nprinthr.com\nprintidea.art\nprintlake.com\nprivateapi.xyz\nprivatehd.to\nprivatess.win\nprivspace.net\nprizesapp.com\nprjdrj.com\nprkfyy.com\nprnewspress.com\npro001.com\npro400.com\nproangela.com\nproav-china.com\nprocar.cc\nprocessedmetals.com\nprocesson.com\nprocetpoeinjector.com\nprochembio.com\nprociss.com\nprocivi.net\nprod-controlbe.floonet.goog\nprod-databe.floonet.goog\nprod.databe.floonet.goog\nprodcam.cc\nprodcutmodel.com\nproductcard.gog-statics.com\nproductivity.wiki\nproginn.com\nprogramfan.com\nprogrammer.ink\nprogrammercarl.com\nprogramschool.com\nprogress-cn.com\nprogressingeography.com\nproject-oa.com\nproject-snow.com\nproject.ai\nprojectaker.com\nprojector-jl.com\nprojector-window.com\nprojectserval.com\nproleantech.com\nprolog-int.com\nprolto.com\npromise-sz.com\npromisingedu.com\npronax.tech\npronetway.com\nprophecyi.com\nproposalt.com\nproquest.com\nproresearch.org\npros-view.com\nprositsole.com\nprostar-cn.com\nprotect-file.com\nprotong.com\nprotontechcn.com\nproup.club\nprovidence-chemicals.com\nprowine-shanghai.com\nproximabeta.com\nproxypass.net\nproya-group.com\nproya.com\nproyy.com\nprpracg.com\nprs-9hospital.com\nprs-motion.com\nprsgl.com\nprteco.com\nprts.wiki\nprtscttposty.cfd\nprttech.com\nprvchina.com\nprwlyy.com\nprxxff.com\npryk0755.com\nprzhushou.com\nprzwt.com\nps-boat.com\nps123.net\nps12345.com\nps173.com\nps288.com\nps314.com\nps616.com\nps9d.com\npsaiwave.com\npsald.com\npsb888.com\npsbc-ubank.com\npsbc.com\npsc4d.com\npscddos.com\npsd1403.com\npsd8.com\npsdee.com\npsdiv.com\npse-meti.com\npsfjz.com\npsjdhhnkjahbn.cfd\npsjia.com\npsjxty.com\npsjyedu.com\npslkzs.com\npsmartcloud.com\npsnine.com\npsoneart.com\npsp99.com\npsr-china.com\npsrar.com\npsrss.com\npstatp.com\npstips.net\npstxg.com\npsvalve.com\npsy-1.com\npsychcn.com\npsychspace.com\npsylife.com\npsysoper.com\npsyzg.com\npsznh.com\npszwatch.com\npszx.com\npszxw.net\npt-link.com\npt597.com\npt80.net\npt963.com\npt97.com\nptacn.com\nptah-tech.com\nptausercontent.com\nptbchina.com\nptbus.com\nptc-asia.com\nptdsh.com\npterclub.com\nptfdc.com\nptfe-rod.com\nptfish.com\nptfish.org\nptgcn.com\npthceshi.com\npthksw.com\npthxuexi.com\npthxx.com\npthxxw.com\nptimg.org\nptkckj.com\nptkill.com\nptmezkgg.com\nptnrjt.com\nptools.fun\nptorch.com\nptotour.com\nptpcp.com\nptrcw.com\npts-ai-texture.com\npts-testing.com\npts.games\nptshare.org\nptszgh.org\nptteng.com\nptwbs.net\nptweixin.com\nptx123.com\nptxie.com\nptxyrcw.com\nptxz.com\nptyg.com\nptyly.com\nptyoubike.com\nptyqm.com\nptyx.com\npu-bg.com\npu-ling.com\npu1kj.com\npu600.com\npu82.vip\npuaas.com\npuai999.com\npuaihospital.net\npuamap.com\npubbcsapp.com\npubchn.com\npubg.plus\npubg8x.com\npubghelper.com\npubgkam.com\npubgtool.com\npubgwesk.art\npubgzh-cn.vip\npubliccms.com\npublicdns.cc\npubmed007.com\npubmedplus.com\npubone.cc\npubtian.com\npubukeji.com\npubwinol.com\npubyun.com\npubyun.net\npubyun.org\npucijiankang.com\npudding.cc\npudetouzi.com\npudie.net\npudijt.com\npudn.com\npudongwater.com\npudutech.com\npuduzhai.com\npuem.org\npuer10000.com\npuercn.com\npuersai.com\npuertea.com\npufalianzheng.com\npufewev.store\npuffergames.com\npugba.com\npuh3.com\npuhebiopharma.com\npuhedesign.com\npuhja.work\npuhler.com\npuhuacapital.com\npuhuahui.com\npuhuaxincai.com\npuidc.com\npuiedu.com\npuikiuxinyi.com\npujia8.com\npujiaba.com\npujiaziwang.com\npujie.com\npujingjt888.com\npujiugame.com\npukinte.com\npule.com\npulinmed.com\npulisi.com\npulixingfu.com\npullwave.com\npullword.com\npullywood.com\npulogroup.com\npumcderm.net\npumpisok.com\npumpzc.com\npunaide.com\npunanhospital.com\npunchbox.info\npungboo.com\npuoke.com\npuoraiatorcubt.icu\npuppetchina.com\npuppy888.com\npupu168.com\npupuapi.com\npupufz.com\npupugo.com\npupumall.com\npupumall.net\npupurazzi.com\npupuwang.com\npurang.com\npurcotton.com\npureage.info\npurebuy.club\npureh2b.com\npurekindfund.com\npuremild.com\npurenyy.com\npuresnake.com\npuresys.net\npurewhite.io\npurified-group.com\npuritysilvers.store\npurolatorko.com\npuronglong.com\npurplehi.com\npurplelec.com\npurui020.com\npuruimachinery.com\npusa123.com\npusa365.com\npush-herbchem.com\npush2u.com\npushgrid.net\npushi-ngp.com\npushigao.com\npushihao.com\npushiyb.com\npushjoy.com\npushplus.plus\npushthink.com\npushtime.net\npushyzheng.com\npusicapital.com\npusupvc.com\nputaoa.com\nputaocdn.com\nputaogame.com\nputaojiu.com\nputaotec.com\nputclub.com\nputdb.com\nputdl.com\nputian-nst.com\nputian508.com\nputitt.com\nputonsoft.com\nputop.net\npuusa.net\npuwenlong.com\npuworld.com\npuwww.com\npuxiang.com\npuxindesign.com\npuxun.co\npuyewx.com\npuyideshiye.com\npuyimed.com\npuyuan-electric.com\npuzeyf.com\npuzzle8.com\npuzzles100.com\npv001.com\npv001.net\npv138.com\npv265.com\npvacegurmbz3e.com\npvc-diban.net\npvc123.com\npvpin.com\npvzbaike.com\npw-partners.com\npw1999.com\npw88.com\npwand.com\npwdding.icu\npwithe.com\npwjptdg.xyz\npwjt.com\npwkss.com\npwkyyb.com\npwmat.com\npwmqr.com\npwns.fun\npwnyun.com\npword.net\npwrd.com\npwrdoverseagame.com\npwrdoverseas.com\npwsannong.com\npwsz.com\npwypx.com\npwypyq.com\npx0571.com\npx0769.com\npx1039.com\npx33.com\npx5a.com\npxb7.com\npxbgp.com\npxc33.com\npxcn168.com\npxcoex.com\npxdier.net\npxemba.com\npxrczpw.com\npxsfybjy.com\npxsrmyy.com\npxtbhb.com\npxtcm.com\npxtu.com\npxtx.com\npxtzirma.com\npxuiamz.com\npxvps.com\npxwsemi.com\npxx.io\npxykyy.com\npxyuan.com\npxyyjt.com\npxzhbsq.com\npxzj.com\npy-axa.com\npy1080p.com\npy1314.com\npy168.com\npy2y.com\npy3.io\npy3study.com\npy94.com\npyadx.com\npyasfunds.com\npybrother.com\npychina.com\npychina.org\npydp888.com\npydvu.com\npyedu.cc\npyeec.com\npyer.net\npyer.site\npyfb001.com\npyhead.com\npyhosp.com\npyjdgj.com\npyjkd.com\npyjt.net\npyker.com\npylonghai.com\npymeng.com\npymh.com\npyneo.com\npyou.com\npyral07m8m.com\npysdsysc.com\npyshszh.com\npystar.com\npyt2021.com\npytesgroup.com\npython-abc.xyz\npython100.com\npython51.com\npythonclub.org\npythoner.com\npythonheidong.com\npythonke.com\npythonlion.com\npythonthree.com\npythontip.com\npytk.net\npytool.com\npytorchtutorial.com\npywangqi.com\npyxhh.work\npyxjiang.com\npyxk.com\npyxrc.com\npyxwapp.com\npyxww.com\npyycz.com\npyynsm.com\npyzhbc.com\npyzls.com\npyzwy.com\npz028.com\npz6.com\npzboy.com\npzcgw.com\npzdf.com\npzds.com\npzfc.com\npzfcw.com\npzhccb.com\npzhdahe.com\npzhedu.com\npzhl.net\npzhol.com\npzhqx.com\npzhqz.com\npzhr.com\npzhwater.com\npzhwyw.com\npzjdimg.com\npzjiadian.com\npzlink.com\npzmls.com\npznews.com\npznrfsy.com\npznsh.com\npzoom.com\npzpu.com\npzrex.com\npzzc.net\npzzx.com\nq-alumni.com\nq-bakery.com\nq-dazzle.com\nq-parking.com\nq-supreme.com\nq.biz\nq047.com\nq1.com\nq1cm.com\nq2ak.com\nq2cdn.com\nq2d.com\nq2zy.com\nq36f.icu\nq38519je8o.world\nq49d4486xg.com\nq4yvu50kh2.com\nq5.com\nq66x11b6c2wfg57.sbs\nq6c.com\nq6haqi.com\nq6u.com\nq77777777.com\nq78s5.com\nq7kyzxq4nj.com\nq88b.net\nq88c.net\nq89850n302.com\nq96bq8m39p.world\nqa114.com\nqacctv.com\nqacn.net\nqae3orq9we9t7.com\nqaeczbxr.com\nqafone.cc\nqagpublic.qatp1.net\nqakkan.vip\nqalex.com\nqamemc.com\nqapi.cc\nqaqa555.com\nqaros.com\nqast.com\nqaxanyu.com\nqaxanyuv6.com\nqaxcloudwaf.com\nqaxwzws.com\nqaynak.com\nqazasd.com\nqazdsa.com\nqazso.com\nqaztool.com\nqazwobdu.com\nqazxsdc.com\nqbangmang.com\nqbao.cc\nqbaobei.com\nqbb6.com\nqbboss.com\nqbd888.com\nqbewux.xyz\nqbfnp.com\nqbgxl.com\nqbide.com\nqbihui.com\nqbiqu.com\nqbitai.com\nqbj.cc\nqbjrxs.com\nqbjwater.com\nqbox.me\nqbox.net\nqbtxt.net\nqbtzjt.com\nqbview.com\nqbxz.com\nqc-hr.com\nqc-shanghaipathology.com\nqc101.com\nqc188.com\nqc6.com\nqc99.com\nqca.org\nqcaipiao.com\nqcbaas.com\nqcbone.com\nqcc.com\nqcc.qualcomm.com\nqccip.com\nqcckyc.com\nqccost.com\nqccr.com\nqccrm.com\nqcdne.com\nqcdnlog.com\nqcdntest.com\nqcdntest.net\nqcds.com\nqcdy.com\nqcdyj.com\nqcenglish.com\nqcers.com\nqcers.net\nqcgm.net\nqcgq168.com\nqchcm.com\nqches.com\nqchouses.com\nqchsym.com\nqchxt.com\nqckuaizhi.com\nqclc.com\nqclivecdn.com\nqcloud-edumall.com\nqcloud.com\nqcloud.la\nqcloudapps.com\nqcloudcdn.com\nqcloudcdnsrc.com\nqcloudcjgj.com\nqcloudclass.com\nqcloudcos.com\nqcloudcos.net\nqcloudecdn.com\nqclouder.com\nqcloudestate.com\nqcloudgme.com\nqcloudgslb.com\nqcloudimg.com\nqcloudipv6.com\nqcloudmail.com\nqcloudmarket.com\nqcloudns.com\nqcloudocdn.com\nqcloudoceanus.com\nqcloudsmartiot.com\nqcloudtcic.com\nqcloudteo.com\nqcloudtiw.com\nqcloudtrip.com\nqcloudtt.com\nqcloudwaf.com\nqcloudwzgj.com\nqcloudzygj.com\nqcly.love\nqcly.xyz\nqcmgkids.com\nqcmod.xyz\nqcmoe.com\nqcmrjx.com\nqcmuzhi.com\nqcoco.com\nqconbeijing.com\nqconshanghai.com\nqcplay.com\nqcq3.com\nqcql.com\nqcr.cc\nqcrencai.com\nqcrlvip.com\nqcrqll.com\nqcsh8.net\nqcsj.com\nqcstudy.com\nqct100.com\nqctm.com\nqctsw.com\nqctx88.com\nqcvbs1296.com\nqcwan.com\nqcwh2021.com\nqcwhxx.com\nqcwlseo.com\nqcwp.com\nqcwxjs.com\nqcxrby.com\nqcxs.com\nqcxzls.com\nqcy.com\nqcymall.com\nqcyoung.com\nqcyuns.com\nqczb.app\nqd-dy.com\nqd-metro.com\nqd-mls.com\nqd-weimob.com\nqd.ink\nqd0513.com\nqd256.com\nqd5itt.com\nqd8.com\nqd8kbq0.shop\nqdac.cc\nqdaeon.com\nqdaiia.com\nqdaily.com\nqdairlines.com\nqdairport.com\nqdauction.com\nqdbdsk.com\nqdbhuh.com\nqdbocweb.com\nqdby.com\nqdcaijing.com\nqdcars.com\nqdccb.com\nqdccdl.com\nqdcloudsolution.com\nqdcu.com\nqdcykg.com\nqdcz.com\nqdd.gd\nqdd.gg\nqdd.la\nqdd2223338a2.shop\nqdd2223338a9.shop\nqddfxfpx.com\nqddlchb.com\nqddown.com\nqddsjx.com\nqddsta.com\nqdeastsea.net\nqdedu.net\nqderzhong.net\nqdexam.com\nqdezc.work\nqdfik.com\nqdfnscy.com\nqdfuer.com\nqdfuns.com\nqdgaoshanyun.com\nqdgjj.com\nqdgw.com\nqdgxjt.com\nqdgxqrc.com\nqdhantang.com\nqdhengyong.com\nqdhetian.net\nqdhkhospital.com\nqdhmsoft.com\nqdhongyunxing.com\nqdhonmon.com\nqdhr.net\nqdhsty.com\nqdhualing.com\nqdhuaren.com\nqdhw.com\nqdhwjs.com\nqdingnet.com\nqdipc.com\nqdjimo.com\nqdjingchengyiqi.com\nqdjjwsjf.com\nqdjttzjt.com\nqdjunyi.com\nqdjxhz.com\nqdjyjtdzsw.com\nqdkefu.com\nqdkelinde.com\nqdkingst.com\nqdkmjc.com\nqdkpdy.com\nqdlanrun.com\nqdlcl.com\nqdlib.net\nqdliding.com\nqdlinghaiba.com\nqdlives.com\nqdliye.com\nqdlongre.com\nqdlpay.com\nqdlups.com\nqdlyxx.com\nqdmama.net\nqdmcxh.com\nqdmm.com\nqdmswx.com\nqdnsyh.com\nqdnxsyy.com\nqdnzrmyy.com\nqdpdjx.com\nqdport.com\nqdpr.com\nqdqiche.com\nqdqihang.com\nqdqs.com\nqdrcsc.com\nqdreads.com\nqdsay.com\nqdsbx.com\nqdsdeyljt.com\nqdsdyjt.com\nqdshebao.com\nqdshoufei.com\nqdshuiche.com\nqdslcs.com\nqdsmjxh.com\nqdspr.com\nqdsrmyy.com\nqdsxtkj.com\nqdsysj.com\nqdsyxh.com\nqdtaide.com\nqdtech.ai\nqdtgood.com\nqdthgs.com\nqdtianxintai.com\nqdtrrh.com\nqdtxdzgc.com\nqduhwq.com\nqdurl.cc\nqdwebim.com\nqdwenxue.com\nqdwpa.com\nqdwxnet.com\nqdxfgy.com\nqdxgn.com\nqdxgysy.com\nqdxhd.com\nqdxhs.vip\nqdxtcw.com\nqdycdx.com\nqdyijiamei.com\nqdyiyi.com\nqdyuzhengtang.com\nqdyxbyy.com\nqdyztang.com\nqdzhengkang.com\nqdzhv.com\nqdzkmj.com\nqdzls.com\nqdznjt.com\nqdzx.net\nqdzxyy.com\nqdzz.com\nqe32.com\nqebk.com\nqechu.com\nqeebike.com\nqeecc.com\nqeejoo.com\nqeeka.com\nqeeniao.com\nqeerd.com\nqefee.com\nqegcdn.com\nqeoacc.com\nqeoacc.net\nqeoagphm.com\nqeodns.com\nqeodns.net\nqeopzvgm.com\nqeqnet.com\nqera.online\nqerwsoft.com\nqeteshcn.com\nqeto.com\nqetoken.com\nqeyopxb.com\nqeyrhhy.com\nqf-meter.com\nqfang.com\nqfangimg.com\nqfbcs.com\nqfbio.com\nqfbwcd.xyz\nqfcgroup.com\nqfclo.com\nqfdeng.com\nqfdengn.com\nqfedu.com\nqfeiche.com\nqfiee.com\nqfihdr.com\nqfns1.com\nqfpay.com\nqfpq.com\nqfrost.com\nqfrxyl.com\nqfsh.com\nqfsyj.com\nqftimg.com\nqftouch.com\nqfull.com\nqfun.com\nqfvip.net\nqfwl.com\nqfxcha.com\nqg.net\nqg108.com\nqg3oed7882.com\nqgadmin.qcpp1.net\nqgb2b.com\nqgbnzb.com\nqgbzyzl.com\nqgcyjq.org\nqgenius.com\nqgfund.com\nqgggxxw.com\nqggj.com\nqggzszk.org\nqgjzsc.com\nqgkjacc.com\nqgnvbc.com\nqgodb.com\nqgpx.com\nqgqc.shop\nqgqy.com\nqgren.com\nqgswvza.com\nqgsydw.com\nqgtql.com\nqgtsvvm1278.vip\nqgvps.com\nqgwzjs.com\nqgxl.org\nqgyksr.com\nqgyqshz.com\nqgysj.org\nqgyyzs.net\nqgzb.net\nqgzxx.com\nqgzzz.com\nqh-cdn.com\nqh-dl.com\nqh-hospital.org\nqh-lb.com\nqh.com\nqh24.com\nqh4321.com\nqh6bc.com\nqh9y.com\nqhangyun.com\nqhass.org\nqhball.com\nqhbtv.com\nqhcby.com\nqhcdn-lb.com\nqhcdn.com\nqhch520.com\nqhchcb.com\nqhclass.com\nqhcro.com\nqhcswhh.com\nqhcuvj3143.vip\nqhd-marathon.com\nqhd.net\nqhdast.com\nqhdatongnews.com\nqhdcm.com\nqhderwei.com\nqhdgjj.com\nqhdglc.com\nqhdjgyy.com\nqhdlcdn.com\nqhdnews.com\nqhdnxgyy.com\nqhdren.com\nqhduhu.com\nqhdvtc.com\nqhdxgps.com\nqhdxw.com\nqhdzyy.com\nqhea.com\nqhee-ma.com\nqhee.com\nqhfx.net\nqhfzcp.com\nqhgas.com\nqhgufen.com\nqhgwh.com\nqhholding.com\nqhhxnw.com\nqhimg.com\nqhimgs.com\nqhimgs0.com\nqhimgs1.com\nqhimgs2.com\nqhimgs3.com\nqhimgs4.com\nqhimgs5.com\nqhimgs6.com\nqhimi.com\nqhjyks.com\nqhkyfund.com\nqhlhfund.com\nqhlingwang.com\nqhlyou.com\nqhm123.com\nqhmed.com\nqhmgf.com\nqhmsg.com\nqhnews.com\nqhong.net\nqhpcc.com\nqhpta.com\nqhrch.com\nqhrcsc.com\nqhres.com\nqhres2.com\nqhrqxh.com\nqhsat.com\nqhsdzs.com\nqhsetup.com\nqhsklw.com\nqhsrmyy.com\nqhssyy.com\nqhstatic.com\nqhsxf.net\nqhtdow.help\nqhtf-china.com\nqhtibetan.com\nqhtui.com\nqhtycp.com\nqhtysz.com\nqhtyzx.com\nqhuah.com\nqhwmw.com\nqhwptyn.com\nqhwww.com\nqhxcjt.com\nqhxzlsgs.com\nqhyccd.com\nqhyh.com\nqhyhq.com\nqhyimin.com\nqhylns.com\nqhysjt.com\nqhytyyvx.com\nqhyzzzs.com\nqhzpw.com\nqi-auto.com\nqi-che.com\nqi-ju.com\nqi-wen.com\nqi10.com\nqi18.com\nqi58.com\nqiaijt.com\nqiaiju.com\nqiaiou.com\nqiak.com\nqialol.com\nqian-gua.com\nqian-lai.com\nqian.lu\nqianaolawyer.com\nqianbao.com\nqianbaocard.com\nqianbaogroup.com\nqianbaohr.com\nqianbeibei.shop\nqianbi360.com\nqianbianapi.com\nqianbianma.com\nqianbianxiazai.com\nqiancangwms.com\nqiancha.cc\nqianchenglvdong.com\nqianchengrh.com\nqianchengriben.com\nqianchiyun.com\nqiancipai.com\nqiandai.com\nqiandao.com\nqiandaoapp.com\nqiandaoapp.net\nqiandaocdn.com\nqiandaohu.cc\nqiandaqian.com\nqiandaren.com\nqiandd.com\nqiandeups.com\nqianduan.com\nqianduanheidong.com\nqiandunvpn.com\nqianfan.app\nqianfan.tv\nqianfan123.com\nqianfan365.com\nqianfanwanmu.com\nqianfanyun.com\nqianfeng.com\nqiang100.com\nqiangbus.com\nqiangchezu.com\nqiangchuan.com\nqiangfu.xyz\nqianggen.com\nqianggen.net\nqianggou5.com\nqiangjin.org\nqiangka.com\nqianglihuifu.com\nqiangmi.com\nqiangqiang5.com\nqiangren.com\nqiangsenhg.com\nqiangshengyanhua.com\nqiangumeitan.com\nqiangungun.com\nqianguyihao.com\nqiangyingjituan.com\nqiangyinli.com\nqianhai12315.com\nqianhaiaiaitie.com\nqianhaibs.com\nqianhaipower.com\nqianhong.com\nqianhuajie.com\nqianhuanhulian.com\nqianhuaweb.com\nqianinfo.com\nqianjia.com\nqianjianggas.com\nqianjiangwang.com\nqianjiapp.com\nqianjiawen.net\nqianjiayue.com\nqianjing.com\nqianjingdesign.com\nqianjingkeji.com\nqianju.org\nqianka.com\nqiankoo.com\nqiankun6.com\nqiankungroup.com\nqiankunshopping.com\nqiankunxin.com\nqianlai778.com\nqianlaiye.com\nqianlht.com\nqianliao.net\nqianliao.tv\nqianliaowang.com\nqianliht.com\nqianliii.com\nqianlima.com\nqianlimafile.com\nqianlimazb.com\nqianling.pw\nqianlinkj.com\nqianlong.com\nqianluxiaoshuo.com\nqianmaiapp.com\nqianmaidao.com\nqianmi.com\nqianmingyun.com\nqianmiyun.com\nqianmoqi.com\nqianmoufirm.com\nqianmu.org\nqiannahotel.com\nqianniu.com\nqianp.com\nqianpailive.com\nqianpen.com\nqianpin.com\nqianping.work\nqianqi.net\nqianqian.com\nqianqiankeji.xyz\nqianqiantao.com\nqianrengang.com\nqianrenge.com\nqianrihong.net\nqianrong.me\nqianselight.com\nqianshanren.com\nqianshengqian.com\nqianshuixing.com\nqiansiw.com\nqiant.net\nqiantangke.com\nqiantianchayuan.com\nqiantucdn.com\nqianuni.com\nqianvisa.com\nqianwa.com\nqianwanku.com\nqianwen.com\nqianxiangbank.com\nqianxibj.net\nqianximiye.com\nqianxin.com\nqianxincdn.com\nqianxinet.com\nqianxingniwo.com\nqianxingwl.com\nqianxs.com\nqianxuecloud.com\nqianxuew.com\nqianxueyunke.com\nqianxun.com\nqianxunclub.com\nqianxungroup.com\nqianxuntrip.com\nqianyan.biz\nqianyan001.com\nqianye88.com\nqianyierp.com\nqianyikeji.com\nqianyinedu.com\nqianyingzhi.com\nqianyuangx.com\nqianyuewenhua.xyz\nqianyuncare.com\nqianyuwang.com\nqianzhan.com\nqianzhan123.com\nqianzhanhl.com\nqianzhengbanliliucheng.com\nqianzhengdaiban.com\nqianzhou.shop\nqianzhu8.com\nqianzhuvisa.com\nqiao-cn.com\nqiao88.com\nqiaobo.net\nqiaobocnc.com\nqiaobuqiao.com\nqiaobutang.com\nqiaoclouds.com\nqiaodan.com\nqiaofangyun.com\nqiaofanxin.com\nqiaoh.com\nqiaohewei.cc\nqiaohu.com\nqiaohuapp.com\nqiaohumall.com\nqiaoji8.com\nqiaojiamuxian.com\nqiaojiang.tv\nqiaolianyimin.com\nqiaolishuiwu.com\nqiaomaren.com\nqiaomi.com\nqiaomu.ai\nqiaomukeji.com\nqiaoqiaoyun.com\nqiaoshang.org\nqiaoshisui.com\nqiaoshoujituan.com\nqiaosidea.com\nqiaotu.com\nqiaoxuanhong.com\nqiaoxuesi.com\nqiaoyi.org\nqiaoyinkg.com\nqiaoyue66.com\nqiaozhuangjia.com\nqiaozuji.com\nqiaqa.com\nqiaqiafood.com\nqiawei.com\nqibali.com\nqibaodwight.org\nqibazaixian.com\nqibingdaojia.com\nqibingwang.com\nqibo168.com\nqiboleqipai.com\nqibosoft.com\nqibox.com\nqibuge.com\nqibuluo.com\nqicaispace.com\nqicaizulinwang.com\nqichacha.co\nqichacha.com\nqichacha.net\nqichamao.com\nqichang56.com\nqichangqing.com\nqichangv.com\nqichecailiao.com\nqichechaoren.com\nqichedaquan.com\nqicheedu.com\nqichegeyin.com\nqichehot.com\nqichejingwei.com\nqichelian.com\nqicheliliang.com\nqichemen.com\nqichemoxing.net\nqichengplus.com\nqichepeijian.com\nqichepinpai.com\nqicheq.com\nqichequan.net\nqichetansuo.com\nqichetong.com\nqichexl.com\nqichezhan.net\nqichuang.com\nqichunfdc.com\nqichunzp.com\nqicolor.com\nqicp.net\nqicp.vip\nqictools.com\nqida100.com\nqidaile.com\nqideshuiwu.com\nqideyun.com\nqidi-edu.com\nqidian-cos-backup.com\nqidian-cos.com\nqidian.com\nqidian688.com\nqidianbox.com\nqidianjob.com\nqidianla.com\nqidianmm.com\nqidianpw.com\nqidiantu.com\nqidic.com\nqidisheng.com\nqidiwang.com\nqidong.name\nqidongcha.com\nqidongnews.com\nqidongyx.com\nqidulp.com\nqiduo.net\nqie.tv\nqiecdn.com\nqieerxi.com\nqiejingsu.com\nqiekao.com\nqiekj.com\nqieman.com\nqiepai.com\nqieracing.com\nqierge.com\nqieta.com\nqieyike.com\nqieying.com\nqieyou.com\nqiezibenpao.com\nqiezic.com\nqiezip.com\nqifan1.com\nqifandianlansh.com\nqifangw.com\nqifeiy.com\nqifeiye.com\nqifeizn.com\nqifeng-safety.com\nqifeng.com\nqifenxiao.com\nqifu.me\nqifub.com\nqifuip.com\nqigonggate.com\nqigongworld.net\nqigousoft.com\nqiguagua.com\nqigumi.com\nqiguo.com\nqiguoread.com\nqihanbio.com\nqihangcrrc.com\nqihangw.com\nqihaoip.com\nqihaxiaoshuo.com\nqihejy.com\nqihepaimai.com\nqihihi.com\nqihoo.com\nqihoo.net\nqihu-lb.com\nqihu.com\nqihu.org\nqihuaa.xyz\nqihuangpuji.com\nqihuangshuyuan.com\nqihuangzhishu.com\nqihuapi.com\nqihucdn.com\nqihuiai.com\nqihuiwang.com\nqihuorumen.com\nqii404.me\nqiieer.net\nqiigame.com\nqiivoo.com\nqijedu.com\nqijee.com\nqijiadianzi.com\nqijian99.com\nqijianzs.com\nqijiapay.com\nqijiayoudao.net\nqijilvxing.com\nqijishow.com\nqijishu.com\nqijiyun.vip\nqijizuopin.com\nqijuan.com\nqijucn.com\nqikan.com\nqikanchina.com\nqikanmulu.com\nqikanvip.com\nqikanw.com\nqike-cloud.com\nqikegu.com\nqikekeji.com\nqikoo.com\nqikouu.com\nqikqiak.com\nqiku.com\nqikuaibao.com\nqikucdn.com\nqikula.com\nqilaijian.com\nqilang.net\nqilanxiaozhu.co\nqilanxiaozhu.net\nqilanxiaozhu.vip\nqilaoshicaishui.com\nqilecms.com\nqiliangjia.com\nqiliaokj.com\nqilindao.com\nqiling.org\nqilinnet.com\nqilinshuixiang.com\nqilinxuan.net\nqilinyiqi88.com\nqilitech.ltd\nqiliuxs.com\nqilong.com\nqilongtan.com\nqilongyoule.com\nqilu-pharma.com\nqiluce.com\nqiludb.com\nqiluhospital.com\nqiluhr.com\nqilupaint.com\nqiluyidian.mobi\nqiluyidian.net\nqima-inc.com\nqimaiz.com\nqimao.com\nqimi.com\nqimiaosenlin.com\nqiming.tech\nqimingcx.com\nqimingjiang.com\nqimingpian.com\nqimingvc.com\nqimingventures.com\nqimingxing.com\nqimingzi.net\nqiminzi.com\nqimodesign.com\nqimser.com\nqimu86.com\nqin.io\nqinbei.com\nqinbing.com\nqincai.com\nqincaigame.com\nqinchacha.com\nqinchuan.com\nqincj.me\nqinco.net\nqindaohotel.com\nqinde.net\nqineasy.com\nqinengdongfang.com\nqiner520.com\nqinfenpharm.com\nqing-feng.com\nqing-shan.com\nqing-tian.com\nqing.me\nqing.su\nqing5.com\nqingbh.com\nqingcache.com\nqingcaige.com\nqingcdn.com\nqingcheng.com\nqingchengfaren.com\nqingchenyu.com\nqingchunbank.com\nqingchunlu.com\nqingcigame.com\nqingclass.com\nqingclasscdn.com\nqingcloud.com\nqingcongxiaoyuan.com\nqingcty.com\nqingdan.com\nqingdao-port.com\nqingdao-port.net\nqingdaochina.org\nqingdaogxt.com\nqingdaokohap.com\nqingdaolawyer.org\nqingdaomaidige.com\nqingdaomedia.com\nqingdaomeixie.com\nqingdaomuseum.com\nqingdaonengyuan.com\nqingdaonews.com\nqingdaoport.net\nqingdaoren.com\nqingdaoshenghao.com\nqingdelan.com\nqingdou.net\nqingdou.vip\nqingdouw.com\nqingf001.com\nqingfanqie.com\nqingfeichina.com\nqingfengchuxing.com\nqingfengjiaoyu.com\nqingflow.com\nqingfo.com\nqingful.com\nqingfuwu.com\nqingfuwucdn.com\nqingfuwucdn.net\nqingge666.com\nqinggl.com\nqinggonggroup.com\nqingguo.com\nqinghaigames.com\nqinghaihuaer.com\nqinghe-sh.com\nqinghe.tv\nqinghedaxue.com\nqinghua2017.com\nqinghuan.com\nqinghuaonline.com\nqinghuaxuezi.com\nqinghuo.net\nqingicon.com\nqingjiaocloud.com\nqingju.com\nqingkai.net\nqingkan.tw\nqingkaoyan.com\nqingkeji.com\nqingkongfy.xyz\nqingkuaipdf.com\nqingkuajing.com\nqingkuw.com\nqinglan.info\nqinglanbaseanycast.com\nqinglanbaseunicast.com\nqinglanji.com\nqinglianfood.com\nqingliange.com\nqingliangkeji.com\nqingliaoapp.com\nqinglidashi.com\nqingliezhiquan.com\nqinglin.net\nqingline.net\nqinglingvip.com\nqinglinong.com\nqinglm.com\nqinglue.com\nqinglue.net\nqinglvpin.com\nqingly.ink\nqingmail.com\nqingmang.me\nqingmang.mobi\nqingmayun.com\nqingmei.me\nqingmh.com\nqingmo.com\nqingmob.com\nqingmucdn.com\nqingmuit.com\nqingmutec.com\nqingmuxinli.com\nqingnianlvxing.com\nqingniantuzhai.com\nqingnianwang.com\nqingpanduola.com\nqingpin.vip\nqingping.co\nqingqikeji.com\nqingqin.com\nqingqingmedia.com\nqingqj.com\nqingque.co\nqingqujie.com\nqingquyp.com\nqingr.com\nqingrenw.com\nqingruanit.net\nqingruyun.com\nqingshanpaper.com\nqingshigame.com\nqingshou.online\nqingshow.net\nqingshuo.com\nqingshuxuetang.com\nqingsongcdn.com\nqingsongchou.com\nqingsongjituan.com\nqingsonngxx.com\nqingstor.com\nqingstorage.com\nqingsucai.com\nqingtajiao.com\nqingtaoke.com\nqingteng-inc.com\nqingteng168.com\nqingtengzhilian.com\nqingtian16265.com\nqingtiancms.net\nqingting.fm\nqingting123.com\nqingtingfm.com\nqingtingip.com\nqingtingjh.com\nqingtingtrip.com\nqinguanjia.com\nqingui123.com\nqinguoag.com\nqingwabs.com\nqingwk.com\nqingxianrenminyiyuan.com\nqingxiaoyun.com\nqingxinjs.com\nqingxuetang.com\nqingxun.com\nqingyantek.com\nqingyeyun.com\nqingyi.com\nqingying.net\nqingyuangroup.com\nqingyuanshihua.com\nqingyun-it.com\nqingyun.com\nqingyuntrip.com\nqingyunzu.com\nqingzhanshi.com\nqingzhicheng.com\nqingzhifeng.com\nqingzhiwenku.com\nqingzhou.biz\nqingzhou.ltd\nqingzhou.pro\nqingzhou5.com\nqingzhouip.com\nqinheng.com\nqinhuaiziyun.com\nqiniu-enterprise.com\nqiniu-solutions.com\nqiniu.co\nqiniu.com\nqiniu.in\nqiniu.io\nqiniu.org\nqiniu.us\nqiniu.work\nqiniuapi.com\nqiniuapp.com\nqiniublob.com\nqiniucc.com\nqiniucdn.com\nqiniucloud.net\nqiniucs.com\nqiniudn.com\nqiniudns.com\nqiniudns.net\nqiniudns2.com\nqiniug.com\nqiniuimg.com\nqiniuinc.com\nqiniuio.com\nqiniukodo.com\nqiniup.com\nqiniupkg.com\nqiniuqcdn.com\nqiniurs.com\nqiniutek.com\nqinla.com\nqinlake.com\nqinlaobo.com\nqinlaoke.net\nqinlinad.com\nqinlinkeji.com\nqinms.com\nqinnongbank.com\nqinpu.com\nqinpuwang.com\nqinqiang.org\nqinqin.com\nqinqin.net\nqinqingshipin.com\nqinqinxiaobao.com\nqinqishuhua.org\nqinronmedia.com\nqinronread.com\nqinrun.com\nqins.com\nqinshantang.com\nqinshihu.com\nqinsilk.com\nqinsmoon.com\nqinsuanbazi.com\nqinxiand.com\nqinxing.xyz\nqinxue.com\nqinxue100.com\nqinxue365.com\nqinxuye.me\nqinyangtv.com\nqinyuanyang.com\nqinyukehuan.com\nqinzhe.com\nqinzhou.net\nqinzhou360.com\nqinzhou8.com\nqinzhouit.com\nqinzibuy.com\nqinzidna.com\nqionghaif.com\nqionghi.com\nqiongming.com\nqiow.net\nqipai.com\nqipai007.com\nqipaifan.com\nqipamaijia.com\nqipayuan.com\nqipeipu.com\nqipeiren.com\nqipeiwuyou365.com\nqipeng.com\nqipinshangji.com\nqiqao.com\nqiqi2000.com\nqiqiboke.com\nqiqids.com\nqiqilab.com\nqiqipu.com\nqiqiuyu.com\nqiqiuyun.net\nqiqjc.com\nqiqu.cc\nqiquanwl.com\nqiquha.com\nqiqumaker.com\nqiquw.info\nqiquwen.com\nqiquyou.com\nqire123.com\nqirebook.com\nqiredy.com\nqiremanhua.com\nqirui.com\nqiruikeji2019.com\nqisankeji.com\nqisaoba.com\nqisbook.com\nqishenghuo.com\nqishengliang.com\nqishiruye.com\nqishixitong.com\nqishu.vip\nqishui.com\nqishunbao.com\nqishuta.info\nqishuta.la\nqishuta.net\nqishuta.org\nqisi.co\nqisool.com\nqita.love\nqitaifu.com\nqitaijiuye.com\nqiti88.com\nqitian-tech.com\nqitianchina.com\nqitianpower.com\nqitongxq.com\nqituowang.com\nqiu-ai.com\nqiu630.com\nqiuball.com\nqiubiaoqing.com\nqiufaqf.com\nqiufengblog.com\nqiuhua.com\nqiujieda.com\nqiujuer.net\nqiujunya.com\nqiukuixinxi.com\nqiumei100.com\nqiumeiapp.com\nqiumibao.com\nqiumijia.com\nqiumiwu.com\nqiupuwang.com\nqiuqiusd.com\nqiuquan.cc\nqiushi.com\nqiushibaike.com\nqiushile.com\nqiushu.cc\nqiushu.info\nqiushubang.com\nqiushuzw.com\nqiutan.com\nqiutianaimeili.com\nqiutiangear.com\nqiuvps.com\nqiuweili.com\nqiuwen.wiki\nqiuwu.net\nqiuxian.com\nqiuxiao.com\nqiuxietang.com\nqiuxue360.com\nqiuxueshe.com\nqiuyewang.com\nqiuyexitong.com\nqiuyueli.com\nqiuzhang.com\nqiuzhijiangtang.com\nqiuziti.com\nqiwang2025.com\nqiwangming.com\nqiwei.com\nqiwenhui.com\nqiwenqi.com\nqiwenya.com\nqiwiotch.com\nqixayrvo.com\nqixia.ltd\nqixiangwang.com\nqixigame.com\nqixin.com\nqixin007.com\nqixin18.com\nqixin19.com\nqixincha.com\nqixing123.com\nqixingcr.com\nqixingquan.com\nqixingtang.com\nqixinpro.com\nqixintian.com\nqixinworks.com\nqixiu88.com\nqixiushouce.com\nqixoo.com\nqixuan888.com\nqixuny.com\nqiye.la\nqiye163.com\nqiye8848.com\nqiyeboao.com\nqiyedata.net\nqiyegongqiu.com\nqiyegongqiu.net\nqiyeku.com\nqiyelipin.com\nqiyenet.net\nqiyes.com\nqiyeshangpu.com\nqiyeshangpu.net\nqiyesou.com\nqiyetong.com\nqiyetoupiao.com\nqiyeweixin.com\nqiyewenhua.net\nqiyeyougou.com\nqiyeyouxiang.net\nqiyi.com\nqiyi.video\nqiyikeji.com\nqiyimusic.com\nqiyipic.com\nqiyiw.com\nqiyoubangbang.com\nqiyouji.com\nqiyoujiage.com\nqiyoutuo.com\nqiyouwang.com\nqiyouworld.com\nqiytech.com\nqiyu-lighting.com\nqiyu99.com\nqiyuanai.com\nqiyuange.com\nqiyuanxuetang.net\nqiyucloud.com\nqiyue.com\nqiyuebio.com\nqiyuesuo.com\nqiyujiasu.com\nqiyujoy.com\nqiyukf.com\nqiyukf.net\nqiyuns3.com\nqiyuntong.com\nqiyunxinfu.com\nqiyutech.tech\nqiyutianxia.com\nqizbov8115.vip\nqizheplay.com\nqizhidao.com\nqizhihaotian.com\nqizhong166.com\nqizhu.org\nqizhu18.com\nqizhuyun.com\nqizi.cc\nqizuang.com\nqizubang.com\nqj-group.com\nqj-robot.com\nqj023.com\nqj175.com\nqj26.com\nqj99.net\nqjbchina.com\nqjbxw.com\nqjcode.com\nqjcrcgas.com\nqjcz.com\nqjdchina.com\nqjfy.com\nqjhlw.com\nqjhm.com\nqjia.com\nqjiajk.com\nqjidea.com\nqjimage.com\nqjis.com\nqjjfin.com\nqjjmw.com\nqjmotor.com\nqjnice.com\nqjrc.com\nqjren.com\nqjsalia.com\nqjsalib.com\nqjsb88.com\nqjslngy.com\nqjsmartech.com\nqjtourism.com\nqjwenming.com\nqjwh.xyz\nqjwhzs.com\nqjwjw.com\nqjxgold.com\nqjystang.com\nqjzl.com\nqjzyy.com\nqk365.com\nqkagame.com\nqkan.com\nqkang.com\nqkblh.com\nqkcdn.com\nqkeke.com\nqkhg.com\nqking.ink\nqkisp.com\nqkkj88.com\nqkkjd.com\nqkl234.com\nqknode.com\nqknown.com\nqktoutiao.com\nqkttapp.com\nqkua.com\nqkvop.com\nqkyamkl.com\nqkyxzx.com\nqkzj.com\nql-cellbank.com\nql-msx.com\nql-spe.com\nql009.com\nql18.mobi\nql1d.com\nql361.com\nql361.shop\nqlan99.com\nqlbchina.com\nqlbk.com\nqlchat.com\nqldgd.com\nqldz.store\nqldzj.com\nqledu.net\nqlelectrons.com\nqlhimalayantm.com\nqlidc.com\nqlife-lab.com\nqlinyun.com\nqlippie.com\nqlivecdn.com\nqlivecloud.com\nqlivertc.com\nqlivertc2.com\nqlivewebrtc.com\nqlivewebrtc2.com\nqll-times.com\nqlmec.com\nqlmf.com\nqlmoney.com\nqlnonwoven.com\nqlotc.net\nqlrc.com\nqlrc114.com\nqls.fun\nqls70.com\nqlteacher.com\nqluu.com\nqlwyjy.com\nqlxiaozhan.com\nqlxyedu.com\nqlxzj.com\nqlydw.com\nqlyjt.com\nqlyygl.com\nqlyyqd.com\nqlzygs.com\nqm.net\nqm119.com\nqm120.com\nqm2009.com\nqm41.com\nqm69.com\nqm989.com\nqmacro.com\nqmail.com\nqmango.com\nqmceo.com\nqmconfig.com\nqmcro.com\nqmei.me\nqmei.vip\nqmeikq.com\nqmhd87.com\nqmhimalayanpz.com\nqmhkids.com\nqmht.com\nqmht.mobi\nqmjianli.com\nqmniu.com\nqmoji.mobi\nqmoji.net\nqmqm.net\nqmrms.com\nqmrobot.com\nqmsea.com\nqmsjmfb.com\nqmtj.net\nqmtjgame.com\nqmtmedia.com\nqmtv.com\nqmvchina.com\nqmwtp.com\nqmwyy.com\nqmxny.com\nqmxphoto.com\nqmxrmt.com\nqmxyc.com\nqmyc.ltd\nqmyq.com\nqmyyl.com\nqmz5.com\nqmz99.com\nqmzhibo.com\nqmzs.com\nqn200.com\nqnali.com\nqnapcn.com\nqnbar.com\nqncd.com\nqncha.com\nqnchrome.com\nqndb.net\nqnfcdn.com\nqnfyg.com\nqngas.com\nqngcjx.com\nqnget.com\nqngslb.com\nqngygf.com\nqnhdkj.com\nqnhuifu.com\nqnjslm.com\nqnjyjt.com\nqnl1.com\nqnlinking.com\nqnlj.com\nqnmlgb.tech\nqnqcdn.com\nqnqcdn.net\nqnsdk.com\nqnssl.com\nqnvipmall.com\nqnvipxd.com\nqnw.cc\nqnydns.com\nqnydns.net\nqnzrmyy.com\nqnzyy.com\nqoder.ai\nqoder.com\nqolai.com\nqooboo.com\nqoocc.com\nqooioo.com\nqookar.com\nqookkagames.com\nqoros.com\nqorosauto.com\nqosnet.xyz\nqosq.com\nqouteall.fun\nqp108.com\nqp110.com\nqp46.com\nqp49.com\nqp666.com\nqpaimg.com\nqpb187.com\nqpdca.com\nqpdiy.com\nqpgame.com\nqpgczx.com\nqphospital.com\nqpjjku.com\nqpjylm.com\nqpkaifa.com\nqplus.com\nqplusstatic.com\nqpmwg68cre9pci.com\nqpoc.com\nqpstar.com\nqpwater.com\nqpxiaoshuo.com\nqpz.com\nqpzq.net\nqq-xmail.com\nqq.cc\nqq.cn.com\nqq.com\nqq.design\nqq.do\nqq.md\nqq.net\nqq.travel\nqq.zone\nqq11999.com\nqq123.xin\nqq1398.com\nqq163.cc\nqq163.com\nqq163.net\nqq190.com\nqq190.net\nqq260.com\nqq3366.net\nqq3xkm64kavh.com\nqq499.com\nqq5.com\nqq52o.me\nqq5818.com\nqq620.com\nqq745.com\nqq7c.com\nqq933.com\nqq999q.com\nqq9v.com\nqqai.net\nqqaiqin.com\nqqan.com\nqqb.pub\nqqbiaoqing.com\nqqbibile.com\nqqbrowser.mobi\nqqbytrans.com\nqqcdn.com\nqqcfw.net\nqqcg.com\nqqcjw.com\nqqclass.com\nqqclock.com\nqqcnop366.vip\nqqcrvpv.com\nqqddc.com\nqqdiannao.com\nqqdiannaoguanjiadl.com\nqqdna.com\nqqdr.com\nqqdzzb.win\nqqe2.com\nqqeml.com\nqqeo.com\nqqexmail.net\nqqexpert.com\nqqfamily.com\nqqgameapp.com\nqqgamedesign.com\nqqgamemall.com\nqqgames.com\nqqgb.com\nqqgd.com\nqqgexing.com\nqqgexingqianming.com\nqqgfw.com\nqqgpw.com\nqqgx.com\nqqgygd.com\nqqgyhk.com\nqqhangjia.com\nqqhaoma.com\nqqhaoma.net\nqqhbx.com\nqqhjy.com\nqqhn.net\nqqhot.com\nqqhrch12333.com\nqqhrnews.com\nqqhubei.com\nqqhwb.com\nqqiac.com\nqqimage.net\nqqimg.net\nqqjapan.com\nqqje.com\nqqjia.com\nqqjiyu.com\nqqjjsj.com\nqqjm.com\nqqju.com\nqqkj66.com\nqqkjj.com\nqqkkb.com\nqqkrmotors.com\nqqku.com\nqqkw.com\nqqkwsitu.com\nqqlivepull.seedata.top\nqqmail.com\nqqmail.email\nqqmapyx.com\nqqmc.com\nqqmcc.org\nqqmda.com\nqqmra.com\nqqmtc.com\nqqmusic.com\nqqmusic.store\nqqnaozhong.com\nqqnn.net\nqqopenapp.com\nqqor.com\nqqpao.com\nqqpharm.com\nqqpifu.com\nqqplusapp.com\nqqpuke.org\nqqq.tv\nqqqiyemail.com\nqqqiyeyouxiang.com\nqqqmmm.com\nqqqv.press\nqqrain.com\nqqread.com\nqqrer.com\nqqrizhi.com\nqqro.com\nqqscb.com\nqqservice.mobi\nqqsgame.com\nqqsgjy.com\nqqsgmob.com\nqqsgplay.com\nqqshidao.com\nqqshuoshuo.com\nqqsk.com\nqqski.com\nqqsm.com\nqqsort.com\nqqspark.com\nqqssly.com\nqqstudent.com\nqqsurvey.net\nqqswzx.com\nqqt.com\nqqteacher.com\nqqtest.com\nqqtf.com\nqqthj.com\nqqtjmgg.com\nqqtlr.com\nqqtool8.com\nqqtouxiangzq.com\nqqtu8.cc\nqqtu8.com\nqqtz.com\nqquanquan.com\nqqumall.com\nqqun.com\nqqurl.com\nqqwangming6.com\nqqwebapp.com\nqqwewew.com\nqqwiki.com\nqqwin.xyz\nqqwinner.com\nqqwjx.com\nqqwmba.net\nqqwmly.com\nqqwwr.com\nqqwxmail.com\nqqwys.net\nqqxmail.com\nqqxs.la\nqqxsnew.net\nqqxsnew5.com\nqqxsw.co\nqqxx.net\nqqxzb-img.com\nqqxzb.com\nqqy189.com\nqqya.com\nqqyewu.com\nqqymail.com\nqqyn.com\nqqyouju.com\nqqywf.com\nqqyy.com\nqqzby.net\nqqzfw.com\nqqzhi.com\nqqzi.net\nqqzimu.com\nqqzimu.net\nqqzl.cc\nqqzmly.com\nqqzshc.com\nqqzyw.com\nqqzywang.com\nqqzzz.net\nqr-batch.com\nqr25.com\nqrcpu.com\nqrgiant.com\nqrmanhua.com\nqrobot.com\nqrprt.com\nqrtest.com\nqrtz.co\nqrx.cc\nqrzxx.com\nqs-jt.net\nqs12315.com\nqs5.org\nqs921.com\nqsap-group.com\nqsb.browser.miui.srv\nqsbank.cc\nqsbbs.net\nqsbdc.com\nqsboy.com\nqscharge.com\nqschou.com\nqsebao.com\nqsedu.com\nqsedus.com\nqseeking.com\nqsfcw.com\nqsfm.net\nqsgx-pt.com\nqshang.com\nqshealth.com\nqsiedu.com\nqsiso.com\nqsjsjt.com\nqsjt.com\nqsjxzz.com\nqskggf.com\nqskj.net\nqskretkf.com\nqsl.pub\nqsmchina.com\nqsmis.com\nqsmutual.com\nqsnctf.com\nqsnovel.com\nqspfw.com\nqspfwadmin.com\nqss-lb.com\nqssec.com\nqstatic.com\nqstbg.com\nqstcorp.com\nqstkizve.com\nqstsking.com\nqsw.la\nqswk.com\nqswnet.com\nqsxezgai.com\nqsxiaoshuo.com\nqsxiu.com\nqsxuke.com\nqsxzls.com\nqsyfunds.com\nqsyy.net\nqszs.com\nqszt.com\nqszt.net\nqt-edu.com\nqt.com\nqt119.com\nqt56yun.com\nqt6.com\nqt86.com\nqtaeixd.com\nqtav.org\nqtbig.com\nqtbtp.com\nqtcb.net\nqtccolor.com\nqtck.net\nqtcn.org\nqtctc.org\nqtdebug.com\nqtdream.com\nqtedu.net\nqteng.net\nqter.org\nqtest8.com\nqtgz.cc\nqth8.com\nqthinker.net\nqtke.com\nqtkj.love\nqtlcdn.com\nqtlcdn.net\nqtlcdn360.info\nqtlcdn360.top\nqtlcdn360.xin\nqtlcdn360.xyz\nqtlcdncn.info\nqtlcn.com\nqtlcname.com\nqtlglb.com\nqtlglb.info\nqtlgslbcn.com\nqtlgslbcn.info\nqtlgslbcn.net\nqto-pay.com\nqtonghua.com\nqtool.net\nqtqsaadp.com\nqtrun.com\nqtshe.com\nqtshisan.com\nqtshu.com\nqtshu.la\nqtslog.com\nqtsyw.com\nqtsyzfc.com\nqttc.net\nqttunion.com\nqtu8.com\nqtumist.com\nqtvnews.com\nqtw555.com\nqtx.com\nqtyd.com\nqu2000.com\nqu2345.com\nqu247.com\nqu67.com\nqua.com\nquaita.com\nqualcomm-challenge.com\nqualcomm.cn.cdn.cloudflare.net\nquality666.com\nqualtekgz.com\nqualysapi.qatp1.net\nqualysguard.qpdp1.net\nquan.mx\nquan007.com\nquan05.com\nquan365.com\nquanaichina.com\nquancang.com\nquandashi.com\nquanduoduo.com\nquanerp.com\nquanfangtong.net\nquanfangtongvip.com\nquanfeng.tech\nquanfensi.com\nquanfs.com\nquanguoban.com\nquanguoyoubian.com\nquangushi.com\nquanhuaoffice.com\nquanji.la\nquanji.net\nquanjiamei.com\nquanjiaowang.com\nquanjing.com\nquanjingke.com\nquanjinglian.com\nquanjunkeji.com\nquanjuwuye.com\nquankexia.com\nquanlaoda.com\nquanlego.com\nquanlitu.com\nquanlv66.com\nquanma51.com\nquanmaigo.com\nquanmaihuyu.com\nquanmama.com\nquanmamaimg.com\nquanmamaonline.com\nquanmeipai.com\nquanmin-game.com\nquanmin.tv\nquanmin110.com\nquanminbagua.com\nquanminbb.com\nquanminfu.com\nquanoukeji.com\nquanqiuwa.com\nquanqiuweishang.com\nquanquanapp.net\nquanriai.com\nquansheng-group.com\nquanshi.com\nquanshuge.com\nquanshui.net\nquansucloud.com\nquantacn.com\nquantaoyougou.com\nquantil.com\nquantilcn.com\nquantilcn.net\nquantilng.com\nquantobio.com\nquantongfu.com\nquantuantuan.com\nquantum-etc.com\nquantum-info.com\nquantumsc.online\nquanup.com\nquanwai100.com\nquanwiki.com\nquanxi.cc\nquanxiangyun.com\nquanxiankeji.com\nquanxiaoha.com\nquanxinfu.com\nquanyaotong.com\nquanyin.xyz\nquanyueqk.com\nquanyuesc.com\nquanzhanketang.com\nquanzhi.com\nquanzhifu.net\nquanzhougastronomy.com\nquanziapp.com\nquaolai.com\nquarkbook.com\nquarkers.com\nquartzhy.com\nquasarchs.com\nquaspa.com\nquazero.com\nquba360.com\nqubang.cc\nqubaobei.com\nqubiankeji.com\nqucai.com\nqucanzhan.com\nquce001.com\nquceaiqing.com\nquchao.net\nqucheng.com\nquclouds.com\nqudaiji.com\nqudao168.com\nqudaowuyou.com\nqudayun.com\nqudingshui.com\nqudong.com\nqudong51.net\nqudong9.com\nqudou100.com\nqudushu.com\nquduzixun.com\nqueceng.com\nquechao.vip\nquechen.com\nquectel.com\nqueenl.com\nquefan.com\nquegame.com\nquegui.run\nquehu.com\nqueji.tw\nquenergysemi.com\nqueniuaa.com\nqueniuab.com\nqueniuai.com\nqueniuak.com\nqueniual.com\nqueniuam.com\nqueniubc.com\nqueniubd.com\nqueniubf.com\nqueniubg.com\nqueniubh.com\nqueniubi.com\nqueniubk.com\nqueniubl.com\nqueniubm.com\nqueniubn.com\nqueniubq.com\nqueniubt.com\nqueniucdn.com\nqueniucdn.net\nqueniucf.com\nqueniucg.com\nqueniuck.com\nqueniucl.com\nqueniucm.com\nqueniucn.com\nqueniuco.com\nqueniucs.com\nqueniucw.com\nqueniucx.com\nqueniucz.com\nqueniuda.com\nqueniudd.com\nqueniude.com\nqueniudf.com\nqueniudg.com\nqueniudl.com\nqueniudns.com\nqueniudns.net\nqueniudo.com\nqueniudt.com\nqueniuee.com\nqueniueg.com\nqueniueh.com\nqueniuei.com\nqueniueq.com\nqueniuer.com\nqueniues.com\nqueniuez.com\nqueniufa.com\nqueniufc.com\nqueniufg.com\nqueniufi.com\nqueniufj.com\nqueniufm.com\nqueniufr.com\nqueniufw.com\nqueniufz.com\nqueniugd.com\nqueniugm.com\nqueniugslb.com\nqueniugslb.net\nqueniugt.com\nqueniugv.com\nqueniugw.com\nqueniugz.com\nqueniuhe.com\nqueniuhg.com\nqueniuhl.com\nqueniuhp.com\nqueniuhx.com\nqueniuhy.com\nqueniuhz.com\nqueniuib.com\nqueniuic.com\nqueniuif.com\nqueniuig.com\nqueniuih.com\nqueniuin.com\nqueniuiq.com\nqueniuit.com\nqueniuiv.com\nqueniuiy.com\nqueniuja.com\nqueniujd.com\nqueniuje.com\nqueniujf.com\nqueniujg.com\nqueniujq.com\nqueniujz.com\nqueniukk.com\nqueniukq.com\nqueniukr.com\nqueniuks.com\nqueniukt.com\nqueniukw.com\nqueniukx.com\nqueniukz.com\nqueniulb.com\nqueniulf.com\nqueniulg.com\nqueniuli.com\nqueniulp.com\nqueniulr.com\nqueniuls.com\nqueniulu.com\nqueniulv.com\nqueniulz.com\nqueniumc.com\nqueniumd.com\nqueniumf.com\nqueniumh.com\nqueniumn.com\nqueniumo.com\nqueniumy.com\nqueniund.com\nqueniunh.com\nqueniuni.com\nqueniunq.com\nqueniuns.com\nqueniuny.com\nqueniunz.com\nqueniuod.com\nqueniuog.com\nqueniuop.com\nqueniuos.com\nqueniuot.com\nqueniuoy.com\nqueniupa.com\nqueniupc.com\nqueniupe.com\nqueniupg.com\nqueniupj.com\nqueniupl.com\nqueniupq.com\nqueniupz.com\nqueniuqe.com\nqueniuqj.com\nqueniuql.com\nqueniuqm.com\nqueniuqt.com\nqueniuqu.com\nqueniuqy.com\nqueniuqz.com\nqueniurc.com\nqueniurj.com\nqueniurk.com\nqueniurq.com\nqueniuru.com\nqueniurv.com\nqueniurx.com\nqueniusa.com\nqueniusf.com\nqueniusg.com\nqueniush.com\nqueniusi.com\nqueniusj.com\nqueniuso.com\nqueniusp.com\nqueniusr.com\nqueniusv.com\nqueniusy.com\nqueniusz.com\nqueniutc.com\nqueniute.com\nqueniutn.com\nqueniutt.com\nqueniutx.com\nqueniutz.com\nqueniuua.com\nqueniuuc.com\nqueniuuf.com\nqueniuuk.com\nqueniuum.com\nqueniuuq.com\nqueniuus.com\nqueniuuy.com\nqueniuvb.com\nqueniuvc.com\nqueniuvg.com\nqueniuvi.com\nqueniuvk.com\nqueniuvq.com\nqueniuvu.com\nqueniuvx.com\nqueniuwb.com\nqueniuwf.com\nqueniuwh.com\nqueniuwk.com\nqueniuwq.com\nqueniuwx.com\nqueniuwz.com\nqueniuxd.com\nqueniuxe.com\nqueniuxk.com\nqueniuxr.com\nqueniuxx.com\nqueniuxy.com\nqueniuxz.com\nqueniuyb.com\nqueniuyf.com\nqueniuyg.com\nqueniuyk.com\nqueniuys.com\nqueniuyu.com\nqueniuyz.com\nqueniuza.com\nqueniuzd.com\nqueniuzf.com\nqueniuzh.com\nqueniuzl.com\nqueniuzp.com\nqueniuzu.com\nqueniuzv.com\nqueniuzy.com\nqueniuzz.com\nqueryrecord.com\nquesela.com\nqueshu.com\nquestyleaudio.com\nquestyleshop.com\nquexiaoxian.com\nqueyang.com\nqufair.com\nqufaya.com\nqufeisoft.com\nqufeizhou.com\nqufenqi.com\nqufenqian.vip\nqufu123.com\nqufumarathon.com\nqufushi.com\nqufutuan.com\nqugame.com\nquguonet.com\nquhaidiao.com\nquheqihuo.com\nquhua.com\nquhuaxue.com\nquhuhao.com\nquhuichang.net\nquhuo.net\nquick-global.com\nquick-touch.com\nquickapi.net\nquickbass.com\nquickcan.com\nquickcep.com\nquickddns.com\nquickdetection.com\nquickingdata.com\nquickjoy.com\nquicklaser.com\nquicklyopen.com\nquickpark.cc\nquicksdk.com\nquicksdk.net\nquickswan.com\nquicktvui.com\nquickwis.com\nquiksx.cfd\nquilimen.com\nquimg.com\nquji.com\nqujiangyizhong.com\nqujie365.com\nqujingm.com\nqujunde.com\nquk.cc\nqukaa.com\nqukan.cc\nqukanok.com\nqukanshu.com\nqukantoutiao.net\nqukanvideo.com\nquklive.com\nqukuai.com\nqukuaila.com\nqulaoshi.com\nqule8.com\nquledu.net\nqulianaiba.com\nqulishi.com\nquluying.com\nqulv.com\nqumaihuishou.com\nqumaishu.com\nqumaiyao.com\nqumaw.com\nqumifeng.com\nquming.com\nqumingdashi.com\nquminglemei.com\nqumitech.com\nqun-net.com\nqun.hk\nqun100.com\nqun7.com\nquna.com\nqunaer.com\nqunagai.com\nqunale888.com\nqunaly.com\nqunar.com\nqunar.ink\nqunarcdn.com\nqunarzz.com\nqunba.com\nqunchi.com\nquncrm.com\nqunfengjixie.com\nqunfenxiang.net\nqunhai.net\nqunhaohotel.com\nqunhaolawfirm.com\nqunhei.com\nqunhequnhe.com\nqunjielong.com\nqunke.com\nqunkeng.com\nqunliao.info\nqunligroup.com\nqunmi.vip\nqunniao.com\nqunonnet.com\nqunsou.co\nqunteng.net\nquntengnet.com\nquntuishou.com\nqunwin.com\nqunxiang.club\nqunxingcable.com\nqunxingvc.com\nqunyaninfo.com\nqunyingkeji.com\nqunzh.com\nqunzhuquan.com\nqunzou.com\nquoffice.com\nquotationi.com\nqupeiyin.com\nqupingce.com\nquqi.com\nquqike.com\nquqingting.com\nquqiuhun.com\nququabc.com\nququyou.com\nquqxphdm.com\nqusem.com\nqushiw.com\nqushixi.net\nqushoumiao.com\nqushuba.com\nqushuiying.net\nqusibajjj.men\nqutaiwan.com\nqutanme.com\nqutao.com\nqutaojiao.com\nqutecall.com\nqutechat.com\nqutemessenger.com\nqutetalk.com\nqutevoice.com\nquthing.com\nqutianshanav.com\nqutingting.com\nqutoutiao.net\nqutouwang.com\nqutu.com\nqutuancan.com\nqutuiwa.com\nqutuly.com\nquumibao.com\nquumii.com\nquvisa.com\nquwan.com\nquwangming.com\nquweiwu.com\nquwenqing.com\nquwentxw.com\nquwj.com\nquwm.com\nquword.com\nquwuxian.com\nquxds.com\nquxianchang.com\nquxiang.work\nquxianzhuan.com\nquxiaxia.com\nquxingdong.com\nquxintiaodong.com\nquxiu.com\nquxuan.com\nquyangyizhong.com\nquyibao.com\nquyinginc.com\nquyixian.com\nquyiyuan.com\nquyou.net\nquyouhui.net\nquyu.net\nquyundong.com\nquzhiwen.com\nquzhuanxiang.com\nquzhubao.com\nquzwamx.com\nquzwx123.org\nquzz88.com\nquzzgames.com\nqvdv.net\nqvip.net\nqvkanwen.com\nqvlz.com\nqvxz.com\nqw5599.com\nqwbk.cc\nqwconnect.top\nqwe1e.com\nqweather.com\nqweather.net\nqweatherapi.com\nqwebapp.com\nqwen.ai\nqwenlm.ai\nqwepgmyz.vip\nqwerdns.com\nqwerhost.com\nqwfync.com\nqwgg.com\nqwgt.com\nqwimm.com\nqwing.com\nqwmtjj360.vip\nqwocs.com\nqwpo2018.com\nqwps.com\nqwps.net\nqwq.link\nqwq.moe\nqwq.ren\nqwq.trade\nqwqfzl.com\nqwqk.net\nqwqoffice.com\nqwrmt.com\nqwsy.com\nqwwz.com\nqx-era.com\nqx-kj.com\nqx-semi.com\nqx.com\nqx100.com\nqx1000.com\nqx10086.net\nqx100years.com\nqx121.com\nqx162.com\nqx66.cc\nqx818.com\nqxad.com\nqxbnkj.com\nqxbsk.com\nqxckjr.com\nqxcu.com\nqxdaojia.com\nqxdcc.com\nqxen.com\nqxfun.com\nqxgcsc.com\nqxhospital.com\nqxhqxh.com\nqxioqq4283.vip\nqxiu.com\nqxjeff.com\nqxka.com\nqxkp.net\nqxlib.com\nqxllq.com\nqxme.com\nqxmewmgr.com\nqxmugen.com\nqxnav.com\nqxndt.com\nqxnecn.com\nqxnic.com\nqxnzx.com\nqxozm.com\nqxqing.com\nqxqkeak.com\nqxqtwmgz.com\nqxqxa.com\nqxrcw.com\nqxsdq.com\nqxsfjq.com\nqxshucai.com\nqxswk.com\nqxteacher.com\nqxtongcheng.com\nqxtour.com\nqxtxt.com\nqxueji4167.vip\nqxueyou.com\nqxw.cc\nqxw18.com\nqxwz.com\nqxxsjk.com\nqxy777.com\nqxyjssb.com\nqxzc.net\nqxzsw.com\nqxzxp.com\nqy-marathon.com\nqy-office.com\nqy-polymer.com\nqy-qq.com\nqy-tencentclb.cloud\nqy-tencentclb.com\nqy-tencentclb.net\nqy-tencentclb.work\nqy.com\nqy.net\nqy266.com\nqy57.com\nqy6.com\nqy7v7nn96e.com\nqyaninfo.com\nqybc.com\nqybhl.com\nqyc2008.com\nqycn.com\nqycn.net\nqycn.org\nqycname.com\nqycylinder.com\nqyd-rf.com\nqydimg.com\nqydqw.com\nqydsj.com\nqyer.com\nqyerstatic.com\nqyestar.com\nqyfw168.com\nqyg12.com\nqyg30.com\nqyg447.com\nqyg9.com\nqygbet140.vip\nqygbet381.vip\nqygbet427.vip\nqygjyey.com\nqyglzz.com\nqygvip128.com\nqygvip40.com\nqyhgsb.com\nqyhl.vip\nqyhr.org\nqyhxy365.com\nqyiliao.com\nqyins.com\nqyinter.com\nqyjg.com\nqyjidianqi.com\nqyjks.com\nqykh2009.com\nqykjedu.com\nqymdb.com\nqymgc.com\nqyous.com\nqyrb.com\nqyrcbank.com\nqyrcrs.com\nqyrx.cc\nqysbj.com\nqysd.net\nqysgf.com\nqysport.com\nqysrmyy.com\nqyssgame.com\nqysulian.com\nqysuliao.com\nqyszyyy.com\nqyt.com\nqyt1902.com\nqytdesign.com\nqytranslation.com\nqytst.com\nqytxhy.com\nqyunapp.com\nqyuner.com\nqyuns.net\nqywater.net\nqywcom.com\nqywd.com\nqywww.net\nqyx888.com\nqyxa-tencentclb.cloud\nqyxa-tencentclb.com\nqyxa-tencentclb.net\nqyxa-tencentclb.work\nqyxxpd.com\nqyxzfw.com\nqyyt.com\nqyyun.cloud\nqyzba.club\nqyzc.net\nqyzlgame.com\nqyzss.com\nqz-jk.com\nqz100.com\nqz123.com\nqz456.com\nqz5z.com\nqz828.com\nqz96811.com\nqz97.com\nqz97.net\nqzair.com\nqzbbs.com\nqzbgzz.com\nqzbhgyl.com\nqzbhzy.com\nqzbwjx.com\nqzccbank.com\nqzchuxing.com\nqzcia.com\nqzcklm.com\nqzclfc.com\nqzcns.com\nqzct.net\nqzda.com\nqzdatasoft.com\nqzdswy.com\nqzdxcj888.com\nqzdyyy.com\nqzesx.net\nqzeyy.com\nqzfwckj.com\nqzg123.com\nqzgc.net\nqzgchj.com\nqzgfyy.com\nqzgjjp.com\nqzgkwy.com\nqzhaite.com\nqzhlkj.net\nqzhmyy.com\nqzhmzx.com\nqzhospital.com\nqzhrkj.com\nqzhsjc.com\nqzhslw.com\nqzhuye.com\nqzhxshipping.com\nqzimg.com\nqzj2.com\nqzjcd.com\nqzjgxx.com\nqzjhscl.com\nqzjhsd.com\nqzjianwo.com\nqzjkw.net\nqzjy029.com\nqzjycc.com\nqzjzyy002.com\nqzkangfu.com\nqzkcw.com\nqzkey.com\nqzkjyy.com\nqzks.com\nqzktzc.com\nqzlanwei.com\nqzld.com\nqzldkj.com\nqzljjq.com\nqzlo.com\nqzlwnm.com\nqzmayouquan.com\nqzmktjt.com\nqzmtgs.com\nqznovel.com\nqznovelpic.com\nqznovelstatic.com\nqznovelvod.com\nqznxt.com\nqzone.cc\nqzone.com\nqzoneapp.com\nqzonei.com\nqzqcfw.com\nqzqcw.com\nqzqiye.com\nqzqn8.com\nqzqstudio.com\nqzqxd.com\nqzqxw.com\nqzrbx.com\nqzrc.com\nqzrcsc.com\nqzrcw.com\nqzread.com\nqzrencai.com\nqzsdkj.com\nqzsfy.com\nqzsgyxx.com\nqzshangwu.com\nqzshly.com\nqzsmxx.com\nqzsqsnhdzx.com\nqzssdy.com\nqzsx168.com\nqzsystem.com\nqzsyy.com\nqzszyy.com\nqzt520.com\nqztc.vip\nqztingche.com\nqztour.com\nqztsecurity.com\nqztszls.com\nqztvxwgj.com\nqzwb.com\nqzwgw.com\nqzww.com\nqzxdianzi.com\nqzxkeji.com\nqzxx.com\nqzyckhzx.com\nqzynhhmm.com\nqzyonyou.com\nqzyuchao.com\nqzyun.net\nqzyz.com\nqzyzt.com\nqzzdtc.com\nqzze.com\nqzzgdl.com\nqzzhedu.com\nqzzhonghan.com\nqzzhwk.com\nqzzjchy.com\nqzzn.com\nqzzpw.net\nqzzres.com\nqzzsbx.com\nqzzyyy.com\nqzzzg.net\nr-china.net\nr-tms.net\nr.bing.com\nr.biz\nr12345.com\nr147emh.com\nr1y.com\nr2009.com\nr220.cc\nr2coding.com\nr2yx.com\nr302.cc\nr51.net\nr5g.cc\nr5k.com\nr5tao.com\nr61lsi5tje.com\nr6d7345371.com\nr75y8c2628.com\nr77777777.com\nr79xqa8r7e93.com\nr8.com\nr8.net\nr8856.com\nr8857.com\nr8876.com\nr89gr9gr.ink\nr8hr7.net\nr9922.com\nr9t1.com\nra022.com\nra2ol.com\nraas1.com\nrabbit1117.com\nrabbitbbs.com\nrabbitpre.com\nrabbitpre.me\nrabbitserve.com\nrabook.com\nrabschina.com\nrace604.com\nracent.com\nracetigertiming.com\nrachina.org\nracing-china.com\nracktray.com\nracpro.net\nracsd.com\nracymj.com\nradar-ev.com\nradiate-electronics.com\nradicalmail.net\nradida.com\nradio1964.com\nradio366.com\nradiotj.com\nradiowar.org\nradissoncollection-wuxi.com\nradius-america.com\nradleybagssaleuk.org\nraeblog.com\nrafflesmedicalchina.com\nragdgs.com\nragnarokcn.com\nraharyanto.com\nrahisystems-cn.com\nraidc.com\nrail-metro.com\nrail-transit.com\nrailcn.net\nrails365.net\nrailsctc.com\nrailshj.com\nrailwaybill.com\nrailworkschina.com\nraina.tech\nrainbond.com\nrainbowcn.com\nrainbowred.com\nrainbowsoft.org\nrainbutterfly.xyz\nrainclassroom.com\nraindi.net\nraineggplant.com\nraingray.com\nrainhj.com\nrainhz.com\nraink.org\nrainlain.com\nrainng.com\nrainso.com\nrainwe.com\nrainyun.com\nraise-win.com\nraisecom.com\nraisedsun.com\nraisewebdesign.com\nraisingsun.xyz\nraiyi.com\nrajaluck.work\nrajax-inc.com\nrajax.me\nrajyj.com\nrakinda-aidc.com\nrakinda-xm.com\nrakpqgk.com\nrakutabichina.com\nrakvps.com\nramadaplaza-ovwh.com\nramboplay.com\nramostear.com\nrampingup.com\nramsdei.com\nramventures.com\nramwaybat.com\nrancat.im\nrandengseo.com\nrandongada.com\nrandongma.com\nrandyandtheresa.com\nrangercd.com\nrangnihaokan.com\nrango.fun\nrangotec.com\nrangti.com\nrangxue.com\nrangzong.com\nranhou.com\nrankingonline.jp\nranknowcn.com\nranliao.biz\nranling.com\nranqibiao.net\nrantu.com\nranwen.net\nranwen.org\nranwena.com\nranxi.net\nranyangrent.com\nranzhi.net\nranzhi.org\nraobee.com\nraoke.net\nraoluns.com\nraonie.com\nraorao.com\nrap-pro.com\nrapidppt.com\nrapoo.com\nrapospectre.com\nrarbg.to\nrarbt.fun\nrarcbank.com\nrarelit.net\nrarone.com\nrashanghai.org\nrashost.com\nraspigeek.com\nrastargame.com\nrat.dev\nrat3c.com\nrate2003.com\nratingtoken.net\nrationalwh.com\nratogh.com\nratoo.net\nrauto.com\nravenna0943.xyz\nraverstern.site\nrawanfa.com\nrawchen.com\nraxtone.com\nray-joy.com\nray1988.com\nray8.cc\nraycham.com\nraychase.net\nraycim.com\nraycloud.com\nraycom-inv.com\nraycuslaser.com\nraydata-asset.com\nraydata-mobile.com\nraydata-open.com\nraydata-web.com\nraydata.cc\nraydata.info\nraydata.pro\nraydataasset.com\nraydatamobile.com\nraydataopen.com\nraydataweb.com\nraydonet.com\nrayenergytech.com\nrayfalling.com\nrayfaydata.com\nraygame3.com\nraygame4.com\nrayiantway.com\nrayjoy.com\nraykite.club\nraykite.com\nraykite.info\nraykite.net\nraykite.vip\nraykite.xyz\nrayli.com\nraylink.live\nraymage.com\nraymx-micro.com\nraynext.info\nrayoptek.com\nrayp.com\nrayps.com\nrayrjx.com\nrayseasc.com\nraysgo.com\nraysilicon.com\nraystek-p.com\nraystesting.com\nraysync.cloud\nraysyun.com\nraythonsoft.com\nraytine.com\nraytoon.net\nrayuu.com\nrayvision-tech.com\nrayvision.com\nraywit.com\nrazerapi.com\nrazersynapse.com\nrazerzone.com\nrazrlele.com\nraztb.com\nrb-parking.com\nrb32.com\nrb400.com\nrbi-china.com\nrbischina.org\nrbkwater.com\nrbladycrusaders.com\nrbotai.com\nrbqq.com\nrbtxw.com\nrbz1672.com\nrbzarts.com\nrbzygs.com\nrc-ev.com\nrc0817.com\nrc1001.com\nrc114.com\nrc120.com\nrc168.com\nrc3cr.com\nrc775.com\nrcbc888.com\nrcbuying.com\nrccaijing.com\nrccchina.com\nrcche.com\nrcdang.com\nrcesssc.com\nrcfans.com\nrcgus.com\nrchsrc.com\nrchudong.com\nrcjypx.com\nrclbbs.com\nrclhome.com\nrclolci.com\nrclrow.com\nrclsemi.com\nrcmarble.com\nrcmxw.com\nrcnep.com\nrcolab.com\nrcpx.cc\nrcswo.com\nrcsxzx.com\nrcunxyn.com\nrcuts.com\nrcwl.net\nrcyd.net\nrcyjw.com\nrcyxdk.com\nrcz.cc\nrczhuyu.com\nrczp.org\nrczx.com\nrd-cn.com\nrd-game.com\nrd351.com\nrdacs.com\nrdadiy.com\nrdamicro.com\nrdbuy.com\nrdcnzz.com\nrdcolg.net\nrdcv1.com\nrdcv1.net\nrddesign.cc\nrddoc.com\nrdedu.net\nrdfis.com\nrdfybk.com\nrdfz.com\nrdgcs.com\nrdgcw.com\nrdgz.org\nrdgzxx.net\nrdhyw.com\nrdidc.com\nrdjmgg.com\nrdmicro.com\nrdnsdb.com\nrdplat.com\nrdqczl.com\nrdqh.com\nrdsdk.com\nrdsms.net\nrdwork.com\nrdxmt.com\nrdyjs.com\nrdympjoqbu.work\nrdzjw.com\nrdzs.com\nrdzx.net\nrdzy.net\nre25.vip\nreabam.com\nreach-ad.com\nreach-biology.com\nreachace.com\nreachauto.com\nreachsh.com\nreachsurgical.com\nreachtone.com\nreachwin.net\nreact-china.org\nreact.mobi\nread678.com\nreadboy.com\nreadceo.com\nreadend.net\nreaders365.com\nreadfollow.com\nreadfree.net\nreadgps.com\nreadhb.com\nreadhr360.com\nreadhub.me\nreadke.com\nreadlevel.com\nreadlink.com\nreadlishi.com\nreadm.tech\nreadmeok.com\nreadnos.com\nreadnovel.com\nreadpai.com\nreadpaper.com\nreadpaul.com\nreadse.com\nreadten.net\nreadu.net\nready4go.com\nreai120.com\nrealape.com\nrealapp.xin\nrealbiogroup.com\nrealcybertron.com\nrealfoodiescompost.com\nrealforcechina.com\nrealibox.com\nrealks.com\nreallct.com\nrealliniot.com\nrealmax-sh.com\nrealme.com\nrealme.net\nrealmebbs.com\nrealmemobile.com\nrealmeservice.com\nrealmofswords.com\nrealor.net\nrealsee-cdn.com\nrealsee.com\nrealshark.com\nrealtech-inc.com\nrealtek-rtd.com\nrealtimecn.com\nrealtorforce.ca\nrealxen.com\nrealyuan.com\nreanda.com\nreapdaro.com\nreardatchina.com\nreasonclub.com\nrebang.today\nrebatesme.com\nrebo-group.com\nrecaptcha-cn.net\nrecaptcha.net\nrechaos.com\nrechulishebei.com\nrecitymedia.com\nreckfeng.com\nrecodeal.com\nrecolighting.com\nreconova.com\nrecordpharm.com\nrecovery-soft.com\nrecovery-transfer.com\nrecoye.com\nrecuvachina.com\nrecycle366.com\nred-yellow.net\nredacted.ch\nredatoms.com\nredbaby.com\nredbascket.com\nredbeeai.com\nredcome.com\nredcross-hx.com\nredcross-sha.org\nreddogchina.com\nredearth.com\nredefine.ltd\nredenmc.com\nredfcv.com\nredflag-linux.com\nredflagseed.com\nredhome.cc\nredhongan.com\nredhtc.com\nredianduanzi.com\nredianmao.com\nredianyuansu.com\nredianyule.com\nredianzixun.com\nrediao.com\nredidc.com\nredirector.bdn.dev\nredirector.c.youtubeeducation.com\nredirector.gcpcdn.gvt1.com\nredirector.gvt1.com\nredirector.offline-maps.gvt1.com\nredirector.snap.gvt1.com\nredirector.xn--ngstr-lra8j.com\nredisfans.com\nredmagic.com\nredmart.com\nredmou.com\nrednetdns.com\nredocn.com\nredodopower.com\nredoop.com\nredou.com\nredoufu.com\nredox-med.com\nredphon.com\nredq.cc\nredraingame.com\nredrcd.com\nredream.com\nredredsquare.com\nredsea888.com\nredsh.com\nredshu.com\nredstarwine.com\nredstonewill.com\nredsun-nsh.com\nredsun-rp.com\nredsungd.com\nredsungz.com\nredtriphome.com\nredug8dqjjktoapmdfmqymrvi0iupi.com\nreduxingxuan.com\nredyue.com\nredyue.org\nreed-sinopharm.com\nreedoun.com\nreeidc.com\nreeiss.com\nreeji.com\nreenoo.com\nreenoo.net\nreeoo.com\nrefined-x.com\nrefineidea.com\nrefire.com\nrefond.com\nreformdata.org\nrefresh-bkg.activation-v2.kaspersky.com\nreg007.com\nregal-marathon.com\nregal-raptor.com\nregenchem.com\nregengbaike.com\nregexlab.com\nregexr-cn.com\nreglogo.net\nregltd.com\nregtm.com\nregulatory-ledger-transaction-check.com\nreguo.com\nrehiy.com\nrehn.cc\nreht.com\nrehtt.com\nrehuwang.com\nreibootmac.com\nreignwood.com\nreilybrand.com\nreinness.com\nrejesafe.com\nrejushe.com\nrek8.com\nrekong.com\nrekonquer.com\nrekoo.com\nrekoo.net\nrela.me\nrelangbang.com\nrelangdata.com\nrelativelk.com\nrelaychina.org\nrelayx.io\nrelenger.com\nreliabiotech.com\nreliangbiao.com\nreliao.tv\nrellet.com\nreloadbuzz.com\nrelxtech.com\nrelxyanyou.com\nrely87779777.com\nremaijie.net\nremapcity.com\nremax-bj.com\nremenxs.cc\nremixai.com\nremixicon.com\nremo-ai.com\nremodelife.com\nremotcon.mobi\nremoteaps.com\nremotedu.com\nremyhumanhairextension.com\nrenai-edu.com\nrenaihospital.com\nrenaishiyao.com\nrenaissancehotelhuizhou.com\nrenaren.com\nrenbenai.com\nrenbenzhihui.com\nrenbj.com\nrencaijia.com\nrencaijob.com\nrencheng1991.com\nrendajingjiluntan.com\nrenderbus.com\nrenderincloud.com\nrendeyixue.com\nrendiyu.com\nrendna.com\nrendoc.com\nrenead.com\nrenegade-project.org\nrenelgroup.net\nrenergy-me.com\nrenew-cmda.com\nrenew-cn.com\nrenfei.net\nrenfutm.com\nrenguokeji.com\nrenhaocw.com\nrenhe888.com\nrenhebusiness.com\nrenhence.com\nrenhuaicode.com\nrenji.com\nrenjian.com\nrenjiaoshe.com\nrenjiyiyuan.com\nrenkky.com\nrenle.com\nrenleisheji.com\nrenlijia.com\nrenliwo.com\nrenlu.net\nrenmaiku.com\nrenmaitong.com\nrenminkaiguan.com\nrenminyixue.com\nrenny.ren\nrenping.cc\nrenren-inc.com\nrenren-x.com\nrenren.com\nrenren.io\nrenrenbeidiao.com\nrenrenchaxun.com\nrenrenche.com\nrenrencou.com\nrenrendai.com\nrenrendoc.com\nrenrenfinance.com\nrenrening.com\nrenrenlun.com\nrenrenmoney.com\nrenrenpeizhen.com\nrenrenshaike.com\nrenrenshe.com\nrenrenshipu.com\nrenrensousuo.com\nrenrenstudy.com\nrenrensucai.com\nrenrentou.com\nrenrentrack.com\nrenrenyee.com\nrenrk.com\nrenruihr.com\nrenrunkeji.com\nrensa-hanno.com\nrensheng123.com\nrenshouks.com\nrenshouren.com\nrent.work\nrenwen.com\nrenwenyishu.com\nrenwuduo.com\nrenwuji.com\nrenwulian.com\nrenwumatou.com\nrenyiwei.com\nrenzaoshu.com\nrenzhemao.com\nrepai.com\nrepaiapp.com\nrepair5g.com\nrepanso.com\nrepian.com\nreplays.net\nreplica.club\nreplicabest.cc\nreplicachinawatch.vip\nreplicahot.cc\nreplicais.com\nreplicaluxury.cc\nreplicareloj.es\nreplicasale.cc\nreplicashop.cc\nreplicasreloj.com\nreplicasrelojlujo.com\nreplicaswiss.co\nreplicaswissclocks.com\nreplicawatchaaa.cc\nreplicawatchhot.com\nreplicawatchshipping.com\nreplicawatchshop.cc\nreplicawatchsshop.cc\nreplicheorologio.com\nrepliquemontresdeluxe.fr\nrepliquesuisse.co\nrepont.com\nreportify.cc\nreportrc.com\nreportway.org\nreprogenix.com\nreptilesworld.com\nreputatioy.com\nreqable.com\nreqgvheo.com\nrergdfh.com\nreseetech.com\nresemblancey.com\nresemi.com\nreservehemu.com\nresheji.com\nresistor.today\nresnics.com\nresnowshop.com\nresona-wujl.com\nresone-shinab.com\nresowolf.com\nrespeaonsct.com\nrespect-lab.com\nrespondaudio.com\nrespusher.com\nresset.com\nresturbo.com\nresuly.me\nretailo2o.com\nretalltech.com\nretiehe.com\nretopon.com\nretouchpics.com\nreturn.net\nreturnc.com\nreveetech.com\nrevefrance.com\nrevenuads.com\nreviosky.com\nrevolut.ltd\nrevolutwebapp.com\nrew65.com\nrewanyouxi.com\nrewnat.xyz\nreworlder.com\nrewuwang.com\nrexcdn.com\nrexdf.org\nrexinyisheng.com\nrexsee.com\nrexueqingchun.com\nreyinapp.com\nrezhanwang.com\nrf-bed.com\nrf-china.com\nrf-link.com\nrf.com\nrf.hk\nrfaexpo.com\nrfc2cn.com\nrfchina.com\nrfchost.com\nrfcmedia.streamguys1.com\nrfcreader.com\nrfdl88.com\nrfeyao.com\nrffan.info\nrfgjhz.com\nrfhhzx.com\nrfid-e.com\nrfidcardcube.com\nrfidfans.com\nrfidnfk.com\nrfidtech.cc\nrfilter.com\nrfimonde-lh.akamaihd.net\nrfjd.com\nrfjq.com\nrfk.com\nrfmwave.com\nrfthunder.com\nrfvtgbnh.vip\nrfylyp.com\nrg-marathon.com\nrg-pharma.com\nrg950.com\nrgaxobcs.com\nrgb128.com\nrgble.com\nrgdse.shop\nrgezppvk.com\nrgkjyp.com\nrgoo.com\nrgrcb.com\nrgsgnj.com\nrgslb.com\nrgtjf.com\nrgxw.com\nrgyh6t.com\nrgzbgroup.hk\nrgzxraiu.com\nrh31.com\nrh98.com\nrhce.cc\nrhcncpa.com\nrhcqmu.com\nrhctwy.com\nrhcyl.com\nrheaeco.com\nrheemchina.com\nrhexe.com\nrhhz.net\nrhine-inc.com\nrhinosgamestwhk.com\nrhinoxky.com\nrhjoyhotel.org\nrhkj.com\nrhky.com\nrhnewmaterials.com\nrhoadshomebuyers.com\nrhonghai.com\nrhphos.com\nrhsj520.com\nrhspring.com\nrhtimes.com\nrhtzjt.com\nrhusen03.com\nrhwatchcn.com\nrhwatches.com\nrhyme.cc\nrhypw.com\nri-china.com\nriande.com\nrianico.tech\nriaway.com\nribaoapi.com\nribaocdn.com\nribencun.com\nribenguwan.com\nribio.com\nribolia.com\nricebook.com\nricequant.com\nriceyun.com\nrich-chang.com\nrich-fc.com\nrich-futures.com\nrich-healthcare.com\nrichardfw.com\nricheninfo.com\nrichhurry.com\nrichiecn.com\nrichinfer.net\nrichkays.com\nrichlandsfarm.com\nrichong.com\nrichseafood.com\nrichsuntrade.com\nrichtech123.com\nrichtechcn.com\nrichtj.com\nricklj.com\nrickyfabrics.com\nrickysu.com\nrictos.com\nridgepole.com\nrido-ja.com\nriecent.com\nrifagroup.com\nrifapm.com\nrifubao.com\nrigen-bio.com\nrigerna.com\nrigger-micro.com\nrightknights.com\nrightpaddle.com\nrigol.com\nrigouwang.com\nrigums.xyz\nriitao.com\nriji001.com\nriji100zi.com\nrijigu.com\nrijiwang.com\nrikua.com\nrili11.com\nrili19.com\nrilijingling.com\nrilingpec.com\nriliri.com\nrilvtong.com\nrim20.com\nrimaiwang.com\nrin9.com\nringdoll.com\nringerswesternauoff.com\nringofelysium.com\nringofelysiumonline.com\nringpu.com\nrining.com\nrinlink.com\nrinvay.cc\nrioalc.com\nriogene.com\nriolu.lol\nriowine.com\nripic.xyz\nrippletek.com\nriqicha.com\nrisc-v1.com\nriscv-dev.tech\nriscv-mcu.com\nriscv-summit.com\nrisde.com\nrise99.com\nrisecenter.com\nrisechina.org\nriselinkedu.com\nrisen-pharma.com\nrisencn.com\nrisenenergy.com\nrisesoft.net\nriseyears.com\nrisfond.com\nrishiqing.com\nrishuncn.com\nrising-eo.com\nrisingauto.com\nrisinggas.com\nriskbird.com\nriskivy.com\nrisongtc.com\nrisuiwd.com\nrisun.com\nriswing.com\nritaichina.com\nritao.hk\nritaojiang.com\nritaomeng.com\nritarpower.com\nrivalsa.net\nriveralydia.shop\nrivergame.net\nriverinepm.com\nriverlimittech.net\nrivocean.com\nriwise.com\nrix-dl.com\nriya.cc\nriyingkj.com\nriyuandianzi.com\nriyuexing.org\nriyuezhuan.com\nriyugo.com\nriyutool.com\nrizbbs.com\nrizhao.net\nrizhaociming.com\nrizhaogongshui.com\nrizhaokjg.com\nrizhaosteel.com\nrizhaoxl.com\nrizhili.com\nrizhiyi.com\nrizhuti.com\nrj.link\nrj.net\nrj668.com\nrj889.net\nrjaaa.com\nrjcopy.com\nrjdownd.com\nrjetech.com\nrjeye.com\nrjfc110.com\nrjgcz.com\nrjghome.com\nrjh0.com\nrjhcsoft.com\nrjitxy.com\nrjlqq.com\nrjoy.com\nrjpharm.com\nrjpharma.com\nrjreducer.com\nrjs.com\nrjsjmbwx.com\nrjsos.com\nrjtx.net\nrjty.com\nrjuxl.xyz\nrjxzjx.com\nrjzxw.com\nrk-light.com\nrk120.com\nrkanr.com\nrkaq110.com\nrkckth.com\nrkdatabase.com\nrkddzda.com\nrkeji.com\nrkgaming.com\nrkkgyy.com\nrklive888.com\nrkrcemei.com\nrksec.com\nrkvir.com\nrkzxhyy.com\nrl-consult.com\nrlair.net\nrljydt.com\nrlkj.com\nrlkj.net\nrlmeijia.com\nrlnk.net\nrlreader.com\nrlsofa.net\nrltyll.com\nrlw27.com\nrlydw.com\nrlyl.net\nrlzdh.com\nrlzyxa.com\nrm.run\nrmall-solution.com\nrmb.sh\nrmbbk.com\nrmbgame.net\nrmbgd.com\nrmburl.com\nrmcteam.org\nrmcvqq.sbs\nrmejk.com\nrmgvx.com\nrmhospital.com\nrmjiaju.com\nrmjtxw.com\nrmny.tech\nrmrbwc.com\nrmrun.com\nrmsznet.com\nrmttjkw.com\nrmtv24hweblive-lh.akamaihd.net\nrmtyun.com\nrmwxgame.com\nrmxiongan.com\nrmysjzx.com\nrmzs.net\nrmzszp.com\nrmzt.com\nrmzxb.com\nrn-core.com\nrn-hswh.com\nrnfengwo.com\nrngdyy.com\nrngmoe.com\nrngtest.com\nrnhospital.com\nrnhy.net\nrnmachine.com\nro50.com\nro8qwpaikd4kx.com\nroad-group.com\nroadhb.com\nroadjava.com\nroadlady.com\nroadoor.com\nroadqu.com\nroadsignads.com\nroadtoempress.com\nroadwaygroup.com\nroai.shop\nroaing.com\nrobam.com\nrobbyant.com\nrobei.com\nroboeyeai.com\nrobomaster.com\nroboneo.com\nroboo.com\nrobook.com\nrobopeak.net\nroborock.com\nrobosense.ai\nrobot-ai.org\nrobot-china.com\nrobot301.net\nrobotech-log.com\nroboticsurg301.net\nrobotime.com\nrobotiot.org\nrobotphoenix.com\nrobotplaces.com\nroboxx.ltd\nroc-cnc.com\nroca026.com\nrocaircraft.com\nrocar.net\nrochat.tech\nrock-chips.com\nrockbrain.net\nrockbundartmuseum.org\nrockdata.net\nrockemb.com\nrockerfm.com\nrocketmq.cloud\nrockflow.tech\nrockjitui.com\nrocklogistic.com\nrockontrol.com\nrockorca.com\nrockrobo.com\nrockru.com\nrockx.pub\nrocky.hk\nrockyaero.com\nrockyenglish.com\nrockyglass.com\nroclee.com\nrocoswatch.com\nrocxgroups.com\nroffar.com\nroguelike.com\nroguelitegames.com\nrohm-chip.com\nroidmi.com\nroii.cc\nroiland.com\nrojewel.com\nrokeyyan.com\nrokid.com\nrokidcdn.com\nrokub.com\nrokxyecc.com\nroland-china.com\nrolipscn.com\nrollupjs.com\nrom100.com\nrom333.com\nromantic-ltd.com\nromantic214.com\nromens.cloud\nromhui.com\nromielf.com\nromjd.com\nromleyuan.com\nromney-lighting.com\nromo.tech\nromonupark.com\nromzhijia.net\nromzj.com\nronbaymat.com\nroncoo.com\nrondygroup.com\nrong-data.com\nrong-edge.com\nrong-rtc.com\nrong-sheng.com\nrong100.com\nrong360.com\nronganjx.com\nronganquan.com\nrongba.com\nrongbiz.com\nrongbiz.net\nrongbst.com\nrongcfg.com\nrongchain.com\nrongchaodichan.com\nrongcheer.com\nrongchenjx.com\nrongdasoft.com\nrongdatamall.com\nrongded.com\nrongdeji.com\nrongechain.com\nronggangcity.com\nronggongyeya.com\nrongguang-sh.com\nronghai.com\nronghedai.com\nronghotels.com\nronghuajixie.com\nronghub.com\nronghuiad.com\nronghuisign.com\nrongji.com\nrongjiagroup.com\nrongkang.com\nrongkao.com\nrongkeyiyuan.com\nrongledz.com\nrongmaowl.com\nrongmei.net\nrongnav.com\nrongqu.net\nrongroad.com\nrongsheng.biz\nrongshiedu.com\nrongshu.com\nrongshuweb.com\nrongshuxia.com\nrongstone.com\nrongtai-arch.com\nrongtai-china.com\nrongtongworld.com\nrongwenest.com\nrongwengroup.com\nrongxingroup.com\nrongxuancast.com\nrongyanshe.com\nrongyao666.com\nrongyaozhiguang.com\nrongyi.com\nrongyilian.net\nrongyimao.com\nrongyitechnology.com\nrongyizhaofang.com\nrongyuechem.com\nrongzhitong.com\nrongzhongleasing.com\nrongzhongloan.com\nrongzhougucheng.com\nrongzi.com\nronpharm.com\nrontgens.com\nroobo.com\nrooderscooters.com\nrooee.com\nroof325.com\nroogames.com\nroongeimahwo.com\nroosur.com\nroot-servers.world\nroot1111.com\nrootcloud.com\nrootguide.org\nrootintech.com\nrootjl.com\nroouoo.com\nropefitting.com\nropinsite.com\nror-game.com\nrorotoo.com\nros-lab.com\nros6.com\nrosabellass.store\nrosaryshelties.com\nrosbox.net\nrosdn.com\nrose.ren\nrosecmsc.com\nrosedata.com\nrosefinchfund.com\nrosepie.com\nrosesandgold.fun\nrosewin.com\nrosin-china.com\nrosirs-edu.com\nrosmontis.com\nrosnas.com\nrosoo.net\nrosoyp.com\nrossoarts.com\nrossoarts.net\nrossopharm.com\nrossroma.com\nroswiki.com\nroszj.com\nrotai.com\nrotiyfhp.com\nrotom-x.com\nrotora-china.com\nrotorgroup.com\nrouding.com\nrouexdmv.com\nroujiaosuo.com\nroukabz.com\nroule.org\nroundexpo.com\nroundyule.com\nrouruan.com\nroushidongwu.com\nrousin.com\nroute78asia.com\nrouter.tw\nrouterclub.com\nrouteryun.com\nroutewize.com\nroutuan.com\nrouxiutang.com\nrouzao.com\nrouzhitang.com\nrovbox.com\nrowa.com\nrowcan.com\nrowlib.com\nroxinq.com\nroxmotor.com\nroyalsh.net\nroyalym.com\nroyole.com\nroyotech.com\nroyqh.net\nroywang.com\nrp-field.com\nrp-pet.com\nrpa-cn.com\nrpaii.com\nrpfieldcdn.com\nrpg99.com\nrpgmoba.com\nrpo5156.com\nrprnolz.com\nrpy.net\nrq.run\nrqb99.com\nrqgtzit.com\nrqjtp.com\nrqkr.com\nrqrcw.com\nrqrlxx.com\nrquyzhda.com\nrqyy.com\nrqyz.com\nrr-sc.com\nrr365.com\nrrajz.com\nrrb365.com\nrrbay.com\nrrbjt.com\nrrbus.com\nrrchem.com\nrrcimg.com\nrrdtz.com\nrrfed.com\nrrfmn.com\nrrimg.com\nrrioo.com\nrrjc.com\nrrkf.com\nrrky.com\nrrl360.com\nrrlicai.com\nrrmj.tv\nrrppt.com\nrrrdai.com\nrrrrdaimao.com\nrrrxz.com\nrrs.com\nrrsurg.com\nrrswl.com\nrrting.net\nrrtoibg.com\nrrtv.vip\nrrwtp.com\nrrxf.online\nrrxh5.cc\nrrxiu.cc\nrrxiu.me\nrrxiu.net\nrrxiuh5.cc\nrrys.tv\nrrys2019.com\nrrys2020.com\nrrysapp.com\nrrzu.com\nrrzuji.com\nrrzwl.com\nrrzxw.net\nrs-xrys.com\nrs485.net\nrsachina.org\nrsc.org\nrscazvdbfpbyzqdvpy1m.com\nrscazvdbfpbyzqdvpylm.com\nrscygroup.com\nrsdcw.com\nrsdgd.com\nrsdsgy.com\nrsdxjd.com\nrsdyy.com\nrsdznjj.com\nrsfang.net\nrsfcxq.com\nrshao.com\nrshaoapp.com\nrshdsz.com\nrshf88.com\nrshjgc.com\nrsjq.org\nrsjytx.com\nrskjx.com\nrsl.cc\nrslg-china.com\nrsm.download.prss.microsoft.com\nrsnmxd.com\nrsnschina.com\nrsplcdcs.com\nrspwj.com\nrsq111.com\nrsrlzysc.com\nrss.ink\nrsscc.com\nrssdtec.com\nrssso.com\nrsttdsaaas.icu\nrsttest.com\nrsty77.com\nrsuedu.com\nrsun.com\nrsw163.com\nrswaf.com\nrswl.cc\nrsxc01.com\nrsxmgl.com\nrsybattery.com\nrsyzs.com\nrszfg.com\nrszkw.com\nrt-blend.com\nrt-ics.com\nrt-thread.com\nrt-thread.io\nrt-thread.org\nrtacdn-os.com\nrtahengtai.com\nrtalink.com\nrtb5.com\nrtbbox.com\nrtbmax.com\nrtbpb.com\nrtbtmc.com\nrtbwave.com\nrtc-web.com\nrtc-web.io\nrtcdeveloper.com\nrtddisplay.com\nrtdsoft.com\nrtf1688.com\nrtfcode.com\nrtfcpa.com\nrtftq.org\nrtfund.com\nrtfzfl.com\nrthklive1-lh.akamaihd.net\nrthklive2-lh.akamaihd.net\nrthpc.com\nrti-investor.com\nrtjxssj.com\nrtmap.com\nrtmobi.cc\nrtprc.org\nrtrrx.com\nrtsaas.com\nrtsac.org\nrtsc-gift.com\nrtvcdn.com.au\nrtxapp.com\nrtxonline.com\nrtxplugins.com\nrtxuc.com\nrtyhfg.com\nrtyxpt.com\nrtyy.com\nru5sq.com\nrua93.online\nruan.cloud\nruan8.com\nruanchaomin.com\nruanduo.com\nruandy.com\nruanfujia.com\nruanjian60.com\nruanjiandown.com\nruanjianwuxian.com\nruanjianya.net\nruanjiesh.com\nruankao.com\nruankaodaren.com\nruankaokao.com\nruanko.com\nruanmei.com\nruansky.com\nruansky.net\nruantiku.com\nruanwen.la\nruanwen.tv\nruanwengfa.com\nruanwenhui.com\nruanwenkezhan.com\nruanwenlala.com\nruanwenpu.com\nruanwenshijie.com\nruanx.net\nruanyuan.net\nruazi.com\nrubaoo.com\nrubbervalley.com\nrubinn.com\nruby-china.com\nruby-china.org\nrubyconfchina.org\nrubyer.me\nrubyfoods.com\nrucedu.net\nruchee.com\nruchu.club\nruczzy.com\nrue123.com\nrueiran.com\nruesu.com\nrufei.ren\nrufengda.com\nruffhousetraining.com\nrufida.com\nrugao35.com\nrugaobbs.com\nruguoapp.com\nruguojiaoyu.com\nruhaivip.com\nruhnn.com\nrui.plus\nruiaiad.com\nruian.com\nruianchayuan.com\nruianfang.com\nruianrz.com\nruibai.com\nruibaigroup.com\nruibangwl.com\nruiccm.com\nruichengmedia.com\nruichun120.com\nruicitijian.com\nruida.org\nruidaedu.com\nruidaen.com\nruidan.com\nruidang.com\nruidaxx.com\nruidengkeji.com\nruideppt.com\nruideppt.net\nruidongcloud.com\nruidroid.xyz\nruidsp.com\nruiduobao.com\nruienkj.com\nruifang-tech.com\nruifengchemical.com\nruifengdisplay.com\nruifengjk.com\nruifuwatch.com\nruige.com\nruigedf.com\nruigushop.com\nruihaimeifeng.com\nruihaozhanlan.com\nruihengyiliao.com\nruiheyuanny.com\nruihongip.com\nruihuajw.com\nruihuaxinxi.com\nruihuo.com\nruiii.com\nruiinsurance.com\nruijie.com\nruijiehuanbao.com\nruijienetworks.com\nruijiery.com\nruijieyun.com\nruijinginfo.com\nruijinintl.com\nruijinyy.com\nruikangjinshu.com\nruilibi.com\nruilimr.com\nruilinblw.com\nruiniucn.com\nruiniweier.com\nruipai.com\nruipengkeji.com\nruipengpet.com\nruipupharma.com\nruiscz.com\nruisheng.cc\nruishengseal.com\nruisilc.com\nruisizt.com\nruisong.tv\nruit56.com\nruitairt.com\nruite-tec.com\nruitengmaoyi.com\nruitian.com\nruitiancapital.com\nruitianjc.com\nruiuav.com\nruivihome.com\nruiwant.com\nruiwen.com\nruiwenruanjian.com\nruixhz.com\nruixiangbest.com\nruixiangdy.com\nruixin-eht.com\nruixing.cc\nruixueys.com\nruixuncw.com\nruixunidc.com\nruixunidc.net\nruiyang-ra.com\nruiying3d.com\nruiyingkeji.com\nruiyitech.com\nruiyuanchina.com\nruiyuanobserve.com\nruiyun.com\nruiyunit.com\nruize66.com\nruizhi-group.com\nruizhipak.com\nruizhiqi.com\nruizib.com\nruizong-gz.com\nrujiazg.com\nrujiu.net\nrukechina.com\nruketang.com\nrukodilla.com\nrulandchem.com\nrulei.vip\nrulejianzhan.com\nrulianshi.la\nrumeibox.com\nrumodesign.com\nrumosky.com\nrunbaijia.com\nrunboyun.com\nrunca.net\nruncmd.com\nruncobo.com\nruncome.com\nrundamedical.com\nrundapv.com\nrunde666.net\nrundefit.com\nrundejy.com\nrundeschool.com\nrunergy.com\nrunff.com\nrunforint.com\nrunfox.com\nrunfujin.com\nrunhe.org\nrunhengfdc.com\nrunhuayou.biz\nrunjf.com\nrunjian.com\nrunjiapp.com\nrunkodo.com\nrunkunoptics.com\nrunlaijituan.com\nrunmang.com\nrunnar.com\nrunner-corp.com\nrunnerbar.com\nrunning8.com\nrunningcheese.com\nrunninginchina.org\nrunningman-fan.com\nrunnoob.com\nrunnuokeji.com\nrunoob.com\nrunpho.com\nrunqi-nj.com\nrunqijx.com\nrunsheng.com\nrunshenggk.com\nrunsky.com\nrunsunedu.net\nruntimebj.com\nruntimeedu.com\nruntimewh.com\nruntronic.com\nruntuchem.com\nrunwanxin.com\nrunwise.co\nrunwith.cc\nrunxun.com\nrunzechuanmei.com\nrunzefluidsystem.com\nrunzeyuan.com\nrunzi.cc\nruochu.com\nruodian360.com\nruofeisinian.com\nruohang.com\nruohuo.net\nruokuai.com\nruonei.com\nruons.com\nruoren.com\nruoshui.com\nruosoft.com\nruoxia.com\nruoyer.com\nruoyi.vip\nruozedata.com\nruozhu.shop\nruqimobility.com\nruralwomengd.org\nruseer.com\nrusforest-sh.com\nrushan.com\nrushb.net\nrushi.net\nrushihu.com\nrushivr.com\nrushiwowen.org\nrushmail.com\nrushui.net\nrussellluo.com\nrustc.cloud\nrustdesk.work\nrustfisher.com\nrustfs.com\nrustvnt.com\nrutbr.com\nruthout.com\nruthus.com\nrutron.net\nruu6373.com\nruubypay.com\nruvar.com\nruvisas.com\nruwen5.org\nruxiaoyi.com\nruyig.com\nruyigou.com\nruyile.com\nruyim.com\nruyiqiming.com\nruyishi.com\nruyo.cc\nruyo.net\nruyu.com\nruyuecx.com\nruyuexs.com\nruzong.com\nruzw.com\nrv28.com\nrv2go.com\nrvacvzhru.com\nrvcore.com\nrvedu.com\nrvfdp.com\nrvgyckhp.com\nrvkol.com\nrvmcu.com\nrwb66.com\nrwd.hk\nrwdls.com\nrwjiankang.com\nrwjtgc.com\nrwkv.com\nrwosf.space\nrwrvthca.com\nrwsignal.com\nrwtext.com\nrwxqfbj.com\nrwys.com\nrx-copper.com\nrx-semi.com\nrx4wiug6ec6r.com\nrxbj.com\nrxcrs.com\nrxftw.com\nrxgl.net\nrxhospital.com\nrxhui.com\nrxhysm.com\nrxian.com\nrxjhbaby.com\nrxjt.co\nrxkjcn.com\nrxljzy.com\nrxndt.com\nrxshc.com\nrxwsls.com\nrxwsls.net\nrxxdny.com\nrxyjqz.com\nrxykamto.com\nrxys.com\nrxyushangfw.com\nry0663.com\nry0751.com\nryanbencapital.com\nryanchem.com\nryansu.tech\nrybbaby.com\nrybridge.com\nrybyurom.com\nryc360.com\nrycc.net\nryd-group.com\nrydbatt.com\nrydermedical.com\nrydth5.com\nryeex.com\nrygits.com\nryjer.com\nryjiaoyu.com\nryjoin.com\nrylfj.com\nrylinkworld.com\nrymcu.com\nrymdh.com\nrymooc.com\nryone.net\nrypeixun.com\nrypenwu.com\nrysy9191.com\nrytad.com\nrytx.com\nrytyaofang.com\nryweike.com\nryx.store\nryxiut.com\nryxiut.net\nryxkf.com\nryyqh.com\nrz-cm.com\nrz.com\nrz.sb\nrz0375.com\nrz1158.com\nrz520.com\nrzaide.com\nrzbxgc.com\nrzcdc.com\nrzcdz2.com\nrzfanyi.com\nrzfdc.com\nrzfyu.com\nrzglgc.com\nrzhr.com\nrzhushou.com\nrzhybh.com\nrzkj999.com\nrzline.com\nrzltech.com\nrzmeijia.com\nrzmoizmk.com\nrzok.net\nrzport.com\nrzrc114.com\nrzsf.com\nrzspx.com\nrzsuetrx.com\nrzszp.com\nrzv5.com\nrzv7.com\nrzx.me\nrzzyfw.com\ns-02.com\ns-captcha-r1.com\ns-famed.com\ns-jl.com\ns-ns.com\ns-pia.org\ns-q-s.net\ns-reader.com\ns-ss.cc\ns-tech.com\ns-ts.net\ns-xsenyuan.com\ns-yue.com\ns-zone.com\ns.xyz\ns.zampdsp.com\ns0599.com\ns0nnet.com\ns10000.com\ns135.com\ns163.com\ns1979.com\ns1blsecgerto.com\ns1blseclvira.com\ns1craft.com\ns1gh.com\ns1mple.cc\ns1mplecode.com\ns2ceda.com\ns2cinc.com\ns2g2b2c.com\ns361.com\ns369.com\ns3s9.com\ns3she5k7sm.com\ns4g5.com\ns4yd.com\ns575.com\ns57o79552f.com\ns5ex.com\ns5s5.me\ns6uu.com\ns72c.com\ns74xr605gt.monster\ns7y3.com\ns8dj.com\ns936.com\ns9377.com\ns98s2.com\ns9hospital.com\ns9yun.com\nsa-ec.com\nsa-log.com\nsa-tencentclb.cloud\nsa-tencentclb.com\nsa-tencentclb.net\nsa-tencentclb.work\nsa-token.cc\nsa20.com\nsa516gr70.com\nsa96.com\nsaaas.com\nsaagasports.com\nsaasddos.com\nsaasops.tech\nsaasruanjian.com\nsaasta.net\nsaaswaf.com\nsaayaa.com\nsaberqq.com\nsabxg.com\nsac-china.com\nsacdr.net\nsachenpharm.com\nsact-digital.com\nsadidc.com\nsae-china.org\nsaebbs.com\nsaec.cc\nsaegedu.com\nsaen.com\nsaf158.com\nsafbon.com\nsafdsafea.com\nsafe-lb.com\nsafeb2b.com\nsafecenter.com\nsafedocumentview.com\nsafeglp.com\nsafehoo.com\nsafejmp.com\nsafejmp.net\nsafeluck.com\nsafemini.club\nsafeneeds.com\nsafenext.com\nsafetyimg.com\nsafetystatic.com\nsafetyvod.com\nsafround.com\nsagepub.com\nsagewc-exp.com\nsagigame.net\nsagsaas.com\nsagw.com\nsahcqmu.com\nsaheo.com\nsahvyw8.sbs\nsaibeiip.com\nsaibeinews.com\nsaibo.com\nsaiboauto.com\nsaiboyy.com\nsaic-audi.mobi\nsaic-finance.com\nsaic-gm.com\nsaic-group.com\nsaicdh.com\nsaicdt.com\nsaicfinance.com\nsaicgmac.com\nsaicgmf.com\nsaicgroup.com\nsaichenglogistics.com\nsaicjg.com\nsaicmaxus.com\nsaicmg.com\nsaicmobility.com\nsaicmotor.com\nsaicyun.com\nsaiczd.com\nsaiday.com\nsaidouwang.com\nsaiduo888.com\nsaige.com\nsaihu.com\nsaihuahong.com\nsaihuitong.com\nsaike.com\nsaikerept.com\nsaikr.com\nsail-lab.net\nsail.name\nsail2world.com\nsailaweiwangluo.com\nsailfansclub.com\nsaili.science\nsailingyun.com\nsailipaint.com\nsailongmetal.com\nsailrnal.com\nsailungroup.com\nsailunkeji.com\nsailuntire.com\nsailway-china.com\nsaiminprecision.com\nsaimogroup.com\nsaimoliku.com\nsainacoffee.com\nsaintcos.hk\nsainteco.com\nsaintgreenchem.com\nsaintic.com\nsaintyear.com\nsaipujianshen.com\nsaipujiaoyu.com\nsairaicc.com\nsairui020.com\nsaisaiwa.com\nsaitenm.com\nsaiterobot.com\nsaivsi.com\nsaiway.com\nsaiyou999.com\nsaiyouedu.net\nsaiyun.net\nsaiyunyx.com\nsaizhi.com\nsaj110.com\nsajs.com\nsakata.one\nsaki.cc\nsakura.vin\nsakura286.ink\nsakway.com\nsaky.site\nsalabs.org\nsaladvideo.com\nsalamatcharity.org\nsalasolo.com\nsale8.com\nsaleenauto.com\nsaleforin.com\nsalesdish.com\nsalesman-bd.com\nsalg-sichuanair.com\nsaliai.com\nsalogs.com\nsalongweb.com\nsalutecc.asia\nsam-tec.com\nsamanhua.net\nsamanlehua.com\nsamasty.com\nsame-tech.com\nsamebar.com\nsamedayusdtcasino.com\nsameled.com\nsamhotele.com\nsaming.com\nsamirchen.com\nsamite.cc\nsamitead.com\nsamool.com\nsampux.com\nsamsph.com\nsamsrchina.com\nsamsuncn.net\nsamsunganycar.com\nsamsungcloudcn.com\nsamsungconnectivity.com\nsamsunghealthcn.com\nsamsungroaming.com\nsamsungyx.com\nsamton.net\nsamyang.cc\nsamyuong.com\nsamzhe.com\nsan-health.net\nsan-mu.com\nsan-sheng.net\nsan-tuo.com\nsan-u.com\nsan-yang.com\nsan.net\nsanabuy.com\nsanaemio.com\nsanan-e.com\nsananyiliao.com\nsanau.com\nsanbaiyun.com\nsanbanggs.com\nsanbangwt.com\nsanbao-steel.com\nsanbao0563.com\nsanbum.com\nsancaiheast.com\nsancanal.com\nsanchuangke.com\nsancov.com\nsandaha.com\nsandai.net\nsandbean.com\nsandcomp.com\nsandeepin.com\nsandegroup.com\nsandinggas.com\nsandload.com\nsanduoyun.com\nsanen.online\nsanfangshun.com\nsanfen666.com\nsanfengyun.com\nsanfer.com\nsanfi.com\nsanfinehospital.com\nsanfo.com\nsanfu.com\nsangaopatent.com\nsangbang.com\nsangem.com\nsangerbio.com\nsangfor.com\nsangfor.net\nsangfor.org\nsangforcloud.com\nsangfordns.com\nsangle.com\nsangmifort.com\nsangon.com\nsangongzai.net\nsangsir.com\nsangsongtech.com\nsangumc.com\nsanguocard.com\nsanguoh5.com\nsanguohero.com\nsanguoq.com\nsanguosha.com\nsanguows.com\nsanguowudi.com\nsanguozz.com\nsangxingxi.com\nsangxuesheng.com\nsanhao.com\nsanhaoradio.com\nsanhaostreet.com\nsanhe-medical.com\nsanhepile.com\nsanheqin.com\nsanhetimburly.com\nsanheyongjia.com\nsanhome.com\nsanhuagroup.com\nsanhuan.com\nsanhucidiao.cc\nsaniwaveltd.com\nsanjiahospital.com\nsanjiang.com\nsanjiangdai.com\nsanjiangtourism.com\nsanjiasoft.com\nsanjieke.com\nsanjiexc.com\nsanjinjiake.com\nsanjinpufa.com\nsanjiusk.net\nsanjiuxs.com\nsanjun.com\nsankengriji.com\nsanki-e.com\nsanki-suzhou.com\nsankki.com\nsankougift.com\nsankton.com\nsankuai.com\nsankumao.com\nsanlan123.com\nsanlei.net\nsanlengbio.com\nsanlian-group.com\nsanlian-machine.com\nsanlianpump.com\nsanligm.com\nsanliwenhua.com\nsanlovalve.com\nsanmanuela.com\nsanmanuela.net\nsanmao.com\nsanmaoyou.com\nsanmiaocdn.com\nsanmicun.com\nsannewschool.com\nsanniaokeji.com\nsanpowergroup.com\nsanpuzhiyao.com\nsanqianzhihui.com\nsanqin.com\nsanqindaily.com\nsanqinyou.com\nsanqiu.org\nsanquan.com\nsanrangas.com\nsanrenwenku.com\nsanritzgroup.com\nsansancloud.com\nsansanyun.com\nsansg.com\nsanshanwuyuan.org\nsanshiok.com\nsanshua.com\nsansitech.com\nsansky.net\nsantaihu.com\nsantanjob.com\nsantelvxing.com\nsantezjy.com\nsantianfilter.net\nsantiego.ink\nsantiyun.com\nsantongit.com\nsantostang.com\nsanvo.com\nsanway.tech\nsanweihou.com\nsanweimoxing.com\nsanweiyiti.org\nsanweiyunfuwu.com\nsanwen.com\nsanwen.net\nsanwen8.com\nsanwer.com\nsanxao.com\nsanxia-china.com\nsanxia.com\nsanxiamc.com\nsanxiao56.com\nsanxiaomingshi.com\nsanxiapharm.com\nsanxige.com\nsanxin-med.com\nsanxinbook.com\nsanxing.com\nsanxinwin.com\nsanxinzgjx.com\nsanyaairport.com\nsanyachloe.com\nsanyajob.com\nsanyamotor.com\nsanyanblockchain.com\nsanyangma.com\nsanyastar.com\nsanyawater.com\nsanyecao.com\nsanyegame.com\nsanyenet.com\nsanyewu.com\nsanyexin.com\nsanyglobal.com\nsanygroup.com\nsanyhi.com\nsanyibao.com\nsanyichemical.com\nsanyipos.com\nsanyou123.com\nsanyouco.com\nsanyoumed.com\nsanyoutj.com\nsanyuanbaobao.com\nsanyuanqian.com\nsanyuantc.com\nsanyuanzn.com\nsanyue.com\nsanyuesha.com\nsanzangwang.com\nsanzao.xyz\nsanzei.com\nsanzer.com\nsanzhimeihua.com\nsanzijing.org\nsanzinfo.com\nsanzkf.com\nsao-ma.com\nsao-tencentclb.cloud\nsao-tencentclb.com\nsao-tencentclb.net\nsao-tencentclb.work\nsao.ren\nsaohua.com\nsaoic.com\nsaolei123.com\nsaolife.com\nsaomadc.com\nsaomadiancan.com\nsaoniuhuo.com\nsaop.cc\nsaoshu.org\nsaoso.com\nsaowen.net\nsaoztfii.com\nsap-nj.com\nsap1000.com\nsapphiretech.store\nsaraba1st.com\nsardchina-lmgt.com\nsarft.net\nsarosgame.com\nsasacity.com\nsasecurity.com\nsass.hk\nsasscss.com\nsasseur.com\nsasseur1989.com\nsassi2956.xyz\nsast.fun\nsast.net\nsat0.net\nsatcomiot.com\nsatgssb.com\nsating-tech.com\nsator.tech\nsatpro.com\nsatrip.com\nsaturdaysoft.com\nsaturnbird.com\nsaublenew.com\nsavastan0.biz\nsavilehotelgroup.com\nsavokiss.com\nsavouer.com\nsawenow.com\nsawuatsurgical.com\nsaxydc.com\nsaxyit.com\nsayabear.com\nsayatoo.com\nsayll.com\nsaylover.com\nsayloving.com\nsayodevice.com\nsaywash.com\nsayyas.com\nsazeoq8158.vip\nsb1secapply4.com\nsbaoe.com\nsbc-mcc.com\nsbf56.com\nsbh15.com\nsbhimalayanml.com\nsbjd88.com\nsbjxyq.com\nsbk-h5.com\nsbkh5.com\nsbkk8.com\nsbl-ruseldau.com\nsblseceorf.com\nsblsechuorb3.net\nsblsecorgan.com\nsbmscs.com\nsbnkca.com\nsbnkjl.com\nsbo2.com\nsbooktxt.com\nsbpiping.com\nsbr-info.com\nsbrczx.com\nsbs-mag.com\nsbscn.com\nsbsjk.com\nsbt-sh.com\nsbt56.com\nsbtjt.com\nsbtzy.net\nsbwl.com\nsbwxz.com\nsbxh.org\nsbycjy.com\nsbzj.com\nsc-001.net\nsc-aaa.com\nsc-admc.com\nsc-dl.com\nsc-edu.com\nsc-glas.com\nsc-hstar.com\nsc-jiaoyu.com\nsc-pd.com\nsc-tianyu.com\nsc-troy.com\nsc-wx.com\nsc-xngs.com\nsc.gg\nsc115.com\nsc119.cc\nsc157.com\nsc1588.com\nsc1618.com\nsc168.com\nsc2c.com\nsc2car.com\nsc2p.com\nsc2yun.com\nsc518.com\nsc666.com\nsc788.com\nsc946.com\nsc96655.com\nscaffi.com\nscagz.com\nscanservice1.qcpp1.net\nscansmt.com\nscanv.com\nscarbbs.com\nscarclinic-cn.com\nscardtech.com\nscarlet-box.com\nscasqhwz.com\nscatc.net\nscavc.com\nscbaidu.com\nscbaijia.com\nscbao.com\nscbaopo.org\nscbgaudio.com\nscbh15.com\nscbid.com\nscbnrq.com\nscbotai.com\nscbuilder.com\nscbxmr.com\nscbyx.net\nsccbj.com\nsccchina.net\nscccyts.com\nsccea.net\nsccens.net\nsccia8888.com\nsccin.com\nsccita.org\nsccjjtjy.com\nscclssj.com\nscclzn.com\nsccm.cc\nsccmlj.com\nsccnfb.com\nsccnn.com\nsccnnc.com\nsccq.net\nscctjywy.com\nsccts.com\nscctsw.com\nsccvc.com\nsccwz.com\nsccxbe.com\nsccyxh.com\nscdanzhao.net\nscdbzzw.com\nscdccb.com\nscdcs.net\nscdengbang.com\nscdn.im\nscdn.io\nscdn0077.com\nscdn08xd.com\nscdn0wcp.com\nscdn0wes.com\nscdn0xks.com\nscdn10a7.com\nscdn12zo.com\nscdn1dcz.com\nscdn1e8v.com\nscdn1eul.com\nscdn1kjh.com\nscdn2kw9.com\nscdn2lhh.com\nscdn323r.com\nscdn3t09.com\nscdn40kn.com\nscdn43uu.com\nscdn46r9.com\nscdn4cpe.com\nscdn4esv.com\nscdn4iy4.com\nscdn4usw.com\nscdn549v.com\nscdn67mw.com\nscdn6e40.com\nscdn7c4e.com\nscdn7gsf.com\nscdn7ma2.com\nscdn8ksq.com\nscdn8ppt.com\nscdn98um.com\nscdnacsj.com\nscdnazo0.com\nscdnbi9w.com\nscdnbiar.com\nscdnc77s.com\nscdncloud.com\nscdndn0v.com\nscdndns.com\nscdndns.net\nscdndsa6.com\nscdndtma.com\nscdne3lt.com\nscdne60t.com\nscdneb5k.com\nscdnebrq.com\nscdneufe.com\nscdnf3v6.com\nscdnf80r.com\nscdnfu51.com\nscdng8js.com\nscdnga.com\nscdnga.net\nscdngc.com\nscdngc.net\nscdngs0h.com\nscdnguqg.com\nscdnh957.com\nscdnhagn.com\nscdnhfua.com\nscdnhou6.com\nscdnhwc.com\nscdnifld.com\nscdnioyt.com\nscdnirdl.com\nscdnj3in.com\nscdnj8do.com\nscdnjfj2.com\nscdnjk59.com\nscdnkeuo.com\nscdnl05m.com\nscdnl3bk.com\nscdnl46h.com\nscdnl9cm.com\nscdnmba2.com\nscdnmnrz.com\nscdnmo3m.com\nscdnmogt.com\nscdnmskl.com\nscdnn4t9.com\nscdnndj2.com\nscdnnm9o.com\nscdnnrib.com\nscdnnub6.com\nscdno55z.com\nscdno5zl.com\nscdnoklx.com\nscdnokqh.com\nscdnooyg.com\nscdnpe31.com\nscdnq6rc.com\nscdnqjg9.com\nscdnqkxi.com\nscdnqo8s.com\nscdnqrty.com\nscdnqumc.com\nscdnr7p2.com\nscdnr932.com\nscdnrlm1.com\nscdnrvy1.com\nscdnsmjc.com\nscdnsvg4.com\nscdnt1h7.com\nscdnt9n9.com\nscdntop.com\nscdntucs.com\nscdntxla.com\nscdnucc5.com\nscdnukio.com\nscdnulx9.com\nscdnurea.com\nscdnv7uq.com\nscdnvij7.com\nscdnvip.com\nscdnw4kb.com\nscdnwehb.com\nscdnwljp.com\nscdnwmp0.com\nscdnwpqy.com\nscdnwwp9.com\nscdnxgev.com\nscdny1t3.com\nscdnydiw.com\nscdnygb7.com\nscdnywwp.com\nscdnzrch.com\nscdri.com\nscdyjyzx.com\nscdytv.com\nscdyzx.com\nscdz120.com\nscdzmw.com\nsce-re.com\nscea.co\nsceci.net\nsceeo.com\nsceia.org\nscemrq.com\nscene7-cdn.dell.com\nscengine.com\nscenictc.com\nscensmart.com\nscetop.com\nscezju.com\nscflcp.com\nscfsino.com\nscfzbs.com\nscg-archi.com\nscgc.net\nscgchc.com\nscgckj.com\nscgglm.com\nscgh114.com\nscghsd.com\nscghseed.com\nscgis.net\nscgj56.net\nscgkw.net\nscgra.com\nscgxhq.com\nscgxlc.com\nscgyjt.com\nscgzyun.com\nsch-szu.com\nschbrain.com\nschbrilliant.com\nschcnc.com\nschdxww.com\nschengle.com\nschielecn.com\nschimalayanuz.com\nschk777.com\nschkxy.com\nschlzn.com\nschneidercampus.com\nscholarmate.com\nscholat.com\nschool51.com\nschool888.com\nschoolinweb.com\nschoolpi.net\nschoopia.com\nschstv.com\nscht.cc\nschwarzeni.com\nschwr.com\nschxzx.com\nsci-bioland.com\nsci-fifans.net\nsci-gz.com\nsci-hub.ee\nsci-hub.shop\nsci-inv.com\nsci-it.com\nsci99.com\nscialyze.com\nscianet.org\nsciasc.com\nscichina.com\nscicn.net\nscidict.org\nsciecure.com\nsciedu.org\nsciencecity.net\nsciencedirect.com\nsciencehr.net\nsciencep.com\nsciengine.com\nscienjus.com\nscientop.com\nscientrans.com\nscienward.net\nscies.org\nscievent.com\nscifans.com\nscigy.com\nsciimg.com\nsciirc.com\nscijet.com\nscilucy.com\nscimall.cc\nscimall.org\nscimao.com\nscimee.com\nscinormem.com\nscinorwater.com\nscio.icu\nsciping.com\nsciscanpub.com\nscisky.com\nscistor.com\nscisun.com\nscitechoutlet.com\nscitycase.com\nscixh.com\nsciyard.com\nsciyon.com\nscjcce.com\nscjcdl.com\nscjhg.com\nscjhhb.com\nscjhyq.com\nscjjdd.com\nscjjn.com\nscjjrb.com\nscjk.com\nscjmm.com\nscjrm.com\nscjty.com\nscjuchuang.com\nscjygd.com\nscjyx.com\nscjyxw.com\nscjyzb.net\nscjyzbxh.com\nscjz-led.com\nscjzjyjc.com\nscjzy.net\nsckje.com\nsckrskj.com\nsckxjd.com\nscl-cn.com\nsclanyingkj.com\nsclf.org\nscll.cc\nscloudgda.com\nsclrjc.com\nsclsnk.com\nsclssz.com\nsclsyz.com\nsclvb.com\nsclyxw.com\nsclzfq.com\nscm121.com\nscmccboss.com\nscmchem.com\nscmfair.com\nscmor.com\nscmroad.com\nscmsky.com\nscmttec.com\nscmxtv.com\nscmy120.com\nscmydb.com\nscmylike.com\nscmyns.com\nscncbus.com\nscncgz.net\nscncrc.com\nscnj.tv\nscnjnews.com\nscnjw.com\nscnleee.com\nscntv.com\nscntzjrqfd.com\nscnufl.com\nscnyw.com\nsco-marathon.com\nscodereview.com\nscoee.com\nscommander.com\nscomper.me\nscoowx.com\nscopus.com\nscoregg.com\nscowqbfk.com\nscpgj.com\nscpgroup.com\nscpidi.com\nscpolicec.com\nscqckypw.com\nscqcp.com\nscqjxh.com\nscqstv.com\nscqy100.com\nscraij.com\nscrape.center\nscratch5.com\nscratchmirror.com\nscratchmirror.net\nscrc168.com\nscrcnet.org\nscrcu.com\nscredcross.com\nscrft.com\nscriptjc.com\nscrmtech.com\nscrqw.com\nscrsw.net\nscrsy.net\nscrumcn.com\nscs-jianyu.com\nscscms.com\nscsddyf.com\nscsdzxh.org\nscsdzzx.com\nscsema.com\nscsfjt.com\nscsgkyy.com\nscshzx.com\nscsia.org\nscsjnxh.org\nscsjsd.com\nscslfd.com\nscsltjt.com\nscsmzy.com\nscsntv.com\nscssdd.com\nscsstjt.com\nscsuhuigy.com\nscswyy.com\nscsxth.com\nscsyaszyyy.com\nscsyytj.com\nscszsw.com\nscszxy.com\nsctbc.net\nsctcd.com\nsctcm120.com\nsctdzl.com\nsctes.com\nsctfia.com\nsctfleasing.com\nsctgo.com\nsctindustries.com\nsctm.cc\nsctobacco.com\nsctodr.com\nsctszh.com\nscttwy.com\nsctv-tf.com\nsctv.com\nsctvcloud.com\nsctvf.com\nsctvgo.com\nsctx.com\nsctyhx.com\nsctyxy.net\nsctzsbhy.com\nscubamew.com\nscudcn.com\nscufida.com\nscujj.com\nscunionpay.com\nscusec.org\nscutech.com\nscutedu.org\nscuvc.com\nscw98.com\nscwdwl.com\nscwhx.com\nscwj.net\nscwlylqx.com\nscwmwl.com\nscwqxh.com\nscwy.net\nscwyzx.com\nscxd56.net\nscxdf.com\nscxinkang.com\nscxjyw.com\nscxsls.com\nscyanzu.com\nscyarui.com\nscybjc.com\nscybxx.com\nscyc.cc\nscych.org\nscyesz.com\nscyf.xyz\nscylzx.net\nscymob.com\nscyongqin.com\nscyqfhw.com\nscyqjs.com\nscysxh.org\nscytyy.net\nscyvu.org\nscyxcm.com\nscyyhyxh.com\nscyyxh.com\nsczg.com\nsczgzb.com\nsczht.com\nsczlsgs.com\nsczshz.net\nsczsie.com\nsczsxx.com\nsczuanshen.com\nsczw.com\nsczxmr.com\nsczycp.com\nsczyh30.com\nsczytx.com\nsd-cancer.com\nsd-cellbank.com\nsd-chengdasteel.com\nsd-chengde.com\nsd-eh.com\nsd-ex.com\nsd-fjzy.com\nsd-gold.com\nsd-gree.com\nsd-guotai.com\nsd-jiuyang.com\nsd-jnyz.com\nsd-kb.com\nsd-keyuan.com\nsd-nand.com\nsd-port.com\nsd-portfh.com\nsd-rtn.com\nsd-sangte.com\nsd-sanju.com\nsd-sma.com\nsd-xd.net\nsd-xingshun.com\nsd-yihao.com\nsd-ysjt.com\nsd001.com\nsd11185.com\nsd173.com\nsd2000.com\nsd2008.cc\nsd235.com\nsd235.net\nsd5g.com\nsdacid.com\nsdailong.com\nsdaofu.com\nsdapo.net\nsdaswq.com\nsdawhuagong.com\nsdaxue.com\nsdazgs.com\nsdbao.com\nsdbaoding.com\nsdbaowei.com\nsdbeidou.com\nsdbeta.com\nsdbetter.com\nsdbgk.com\nsdbjm.com\nsdbkxh.com\nsdbochen.net\nsdbqfw.com\nsdbx.org\nsdbys.com\nsdca119.com\nsdcbcm.com\nsdcbcnc.com\nsdccg.com\nsdcclh.com\nsdcfdq.net\nsdcgc.com\nsdchelv.com\nsdchem.net\nsdcheshi.com\nsdchild.com\nsdchina.com\nsdchuangyi.com\nsdcia.net\nsdcjtz.com\nsdclimber.com\nsdcmc.net\nsdcoke.com\nsdcpd.com\nsdcqjy.com\nsdcqjyjt.com\nsdcxgk.com\nsdcxjl.com\nsdcxslzj.com\nsdcyun.com\nsdcz.com\nsddagongrubber.com\nsddaqi.com\nsddcbz.com\nsddcp.com\nsddcxm.com\nsddep.com\nsddermyy.com\nsddeznsm.com\nsddfnk.com\nsddhpharm.com\nsddory.com\nsddp.net\nsddstore.com\nsddtzx.com\nsdduojing.com\nsddyfxjc.com\nsddyzl.com\nsddyzy.com\nsddzinfo.com\nsddzrljx.com\nsdebank.com\nsdeca.org\nsdeclhnfz.com\nsdecloud.com\nsdecu.com\nsdecx.com\nsdedu.net\nsdedubook.com\nsdeer.com\nsdeerlive.com\nsdenews.com\nsdepci.com\nsdepi.com\nsderp.com\nsdewj.com\nsdey.net\nsdeyei-h.edu\nsdfeid.com\nsdfey.com\nsdffqaz.com\nsdfhyl.com\nsdflc.com\nsdflon.com\nsdfon.com\nsdfscm.com\nsdfscx.com\nsdftc.com\nsdfuer.net\nsdfxyoule.com\nsdfybj.com\nsdfz.net\nsdfztz.com\nsdg-china.com\nsdg53.com\nsdgakj.com\nsdgckg.com\nsdgdwljt.com\nsdgdxt.com\nsdgh.net\nsdgho.com\nsdghrq.com\nsdghtz.com\nsdghzy.net\nsdglobaltrade.com\nsdglql.com\nsdgmjiaoyun.com\nsdgren.com\nsdgsdggg.xyz\nsdgsgcjsjt.com\nsdgsjc.com\nsdgslb.com\nsdgslbc.com\nsdgslbd.com\nsdgswl.com\nsdgsxcljt.com\nsdgsxxjt.com\nsdgt1985.com\nsdguanfeng.com\nsdguanzhou.com\nsdguguo.com\nsdgw.com\nsdgwlc.com\nsdgwy.org\nsdgxdb.com\nsdgxzn.com\nsdgykg.com\nsdgyslfz.com\nsdgzkg.com\nsdhack.com\nsdhbcl.com\nsdhdssd.com\nsdhead.com\nsdheguogroup.com\nsdhengxingroup.com\nsdhfsh.com\nsdhgu.com\nsdhitg.com\nsdhmdp.com\nsdhmjt.net\nsdhmkj.com\nsdhnt.com\nsdhofa.com\nsdholding.com\nsdhongdaglass.com\nsdhoukang.com\nsdhqcp.com\nsdhqedu.net\nsdhrjt.net\nsdhsg.com\nsdhshbgs.com\nsdhsie.com\nsdhslqgj.com\nsdhsrh.com\nsdhssfjt.com\nsdht666.com\nsdhtkt.com\nsdhtwl.com\nsdhualigongshui.com\nsdhuanneng.com\nsdhxem.com\nsdhxf.com\nsdhxjl.com\nsdhxsj.com\nsdhydl.com\nsdhynytc.com\nsdhz12333.com\nsdhzgs.com\nsdi23.com\nsdiandian.com\nsdiccapital.com\nsdicgdny.com\nsdicgxxny.com\nsdicin.com\nsdicpower.com\nsdicqzdefd.com\nsdictktrust.com\nsdictrade.com\nsdicvc.com\nsdigc.com\nsdiitu.com\nsdinfo.net\nsdiread.com\nsditol.com\nsdj-tech.com\nsdj88.com\nsdjcf.com\nsdjcsh.com\nsdjcw.com\nsdjiance.com\nsdjiankan.com\nsdjianmei.com\nsdjingdao.com\nsdjinghan.com\nsdjinhuihb.com\nsdjinke.com\nsdjkdq.com\nsdjky.com\nsdjlxh.com\nsdjnlf.com\nsdjnwx.com\nsdjrg.com\nsdjsen.com\nsdjtbd.com\nsdjtcx.com\nsdjtzyxy.com\nsdjujiang.com\nsdjuliangnet.com\nsdjulong.net\nsdjuming.com\nsdjuxiang.com\nsdjwg.com\nsdjxgj.com\nsdjys.org\nsdjzgt.com\nsdjzhc.com\nsdjzsemi.com\nsdkamaiduo.com\nsdkbalance.com\nsdkdch.com\nsdkeli.com\nsdkjjt.com\nsdkjnn.com\nsdklh.com\nsdklss.work\nsdknext.com\nsdkserver.com\nsdksrv.com\nsdlaien.com\nsdland-sea.com\nsdland-sea.net\nsdlcbyq.com\nsdlfhbkj.com\nsdlgjycm.com\nsdlinqu.com\nsdlivc.com\nsdljdj.com\nsdlkqx.com\nsdllrc.com\nsdlmzb.com\nsdlongli.com\nsdlookchemical.com\nsdlqgf.com\nsdlsgroup.com\nsdlsjszp.com\nsdlsxrmyy.com\nsdludian.com\nsdluqiao.com\nsdlvbang.com\nsdlvjuren.com\nsdlvtai.com\nsdlvxing.com\nsdlxsj.com\nsdly35.com\nsdlyjygs.com\nsdlysz.com\nsdm0377.com\nsdmctech.com\nsdmdcm.com\nsdmecl.com\nsdmic.com\nsdmingquan.com\nsdmingshan.com\nsdmjkc.com\nsdmta.com\nsdmtfy.com\nsdmuhua.com\nsdmuseum.com\nsdmyzsgs.com\nsdn-global-live-streaming-packager-cache-3qsdn.akamaized.net\nsdndzb.com\nsdnfv.org\nsdnh.net\nsdnjsbc.com\nsdnlab.com\nsdnsbd.com\nsdnxs.com\nsdnydb.com\nsdo-shabake.com\nsdo.com\nsdocapp.com\nsdodk.com\nsdodo.com\nsdointl.com\nsdoke.com\nsdongpo.com\nsdoprofile.com\nsdoyhg.com\nsdpag.com\nsdpea.org\nsdpku.com\nsdplt.com\nsdptem.com\nsdpua.com\nsdpxyq.com\nsdqcgs.com\nsdqcpc.com\nsdqljh.com\nsdqlkr.com\nsdqmy.com\nsdqsqx.com\nsdqte.com\nsdqu.com\nsdqyjtzfzcjh.com\nsdqyslt.com\nsdrail.com\nsdrcu.com\nsdricom.com\nsdrixingchem.com\nsdrmyy.com\nsdrongya.com\nsdrszp.com\nsdrtgk.com\nsdruile.com\nsdruiqi.com\nsdrunfujia.com\nsdrunse.com\nsdrxtf.com\nsdrz12333.com\nsdsaifute.com\nsdsalt.com\nsdsansen.com\nsdsazgs.com\nsdsazxh.com\nsdsbjp.com\nsdschdlxxhyxh.com\nsdsdbjt.com\nsdsdiy.com\nsdsdjxh.com\nsdsdsoft.com\nsdsdzx.com\nsdsenrong.com\nsdseshealth.com\nsdsfjy.com\nsdsgwy.com\nsdshangya.com\nsdshgk.com\nsdshihua.com\nsdshitu.com\nsdshshb.com\nsdsifang.net\nsdsihuanpharm.com\nsdsinometal.com\nsdsj.com\nsdsjhhyxh.com\nsdsjzyxh.com\nsdsldsyy.com\nsdsmartlogistics.com\nsdsmefina.com\nsdspyyy.com\nsdsrhb.com\nsdssiliao.com\nsdstdc.com\nsdsteelrz.com\nsdstet.com\nsdstg.com\nsdstrong.com\nsdstslyy.com\nsdstudy.vip\nsdswitch.com\nsdswtz.com\nsdsxw.com\nsdsxwz.net\nsdsytgcl.com\nsdsyyxh.com\nsdszbzz.com\nsdtadm.com\nsdtaikai.com\nsdtcck.com\nsdtdata.com\nsdtdfz.com\nsdteleiptv.com\nsdtender.com\nsdteya.com\nsdtianjing.com\nsdtkgl.com\nsdtlpm.com\nsdtlyyjt.com\nsdtryyjt.com\nsdtugongbucj.com\nsdtvjiankang.com\nsdtwxx.com\nsdtxmq.com\nsdtylq.net\nsdtzcn.com\nsdtzsb.net\nsdu8cvc.com\nsduept.com\nsduod.com\nsdushu.com\nsdvps.com\nsdwan.work\nsdwcpm.com\nsdwdhj.com\nsdwdxl.com\nsdweiji.com\nsdweima.com\nsdweiye.com\nsdwen.com\nsdwenlian.com\nsdwenlv.com\nsdwfvc.com\nsdwgyy.com\nsdwinnerbio.com\nsdwkhvac.com\nsdwljqtzjt.com\nsdwlsym.com\nsdwscgs.com\nsdwtd.com\nsdwtqqysj.com\nsdwtqx.com\nsdwtyy.com\nsdx.microsoft.com\nsdxawy.com\nsdxgty.com\nsdxhce.com\nsdxhjtgs.com\nsdxianweisumi.com\nsdxiaoman.com\nsdxietong.com\nsdxinboao.com\nsdxinglu.com\nsdxingya.com\nsdxjnrqjt.com\nsdxjpc.com\nsdxl.com\nsdxli.win\nsdxlkjgf.com\nsdxnetcafe.com\nsdxsgas.com\nsdxszhny.com\nsdxszs.com\nsdxtsz.com\nsdxtxh.com\nsdxvisa.com\nsdxwyy.net\nsdxxjmgg.com\nsdxyxhj.com\nsdxzt.com\nsdyftr.com\nsdyhne.com\nsdyhqp.com\nsdyifeng.com\nsdyinshuachang.com\nsdyizhibi.com\nsdylhg.com\nsdyndcjx.com\nsdysjcc.com\nsdyuanbao.com\nsdyxmall.com\nsdyyebh010.com\nsdyyjsxy.com\nsdyypt.net\nsdyzzyzdh.com\nsdzamy.com\nsdzbcg.com\nsdzckj.com\nsdzdb.com\nsdzdxm.com\nsdzgfj.com\nsdzhidian.com\nsdzhongjiu.com\nsdzhx.com\nsdzhxk.com\nsdzjxx.com\nsdzk.co\nsdzktd.com\nsdznlh.com\nsdznzx.com\nsdzpw.com\nsdzpw.net\nsdzrm.com\nsdzs.com\nsdzssj.com\nsdzsyl.com\nsdztkj.com\nsdztxxkj.com\nsdzx.net\nsdzydfy.com\nsdzzdzkj.com\nse7ej39i9g.best\nsea-group.org\nsea-gullmall.com\nseaarea.com\nseacatcry.com\nseacxy.com\nseafile.com\nseaflysoft.com\nseafrom.com\nseagull-digital.com\nseagullwatch.com\nseagullwatches.com\nseahisun.com\nseaide.com\nsealaly.net\nsealand100.com\nsealandtableware.com\nsealeadbattery.com\nsealien.net\nsealimg.com\nsealion360.com\nsealos.run\nsealyun.com\nseamanhome.com\nseamaty.com\nseaning.com\nseanya.com\nseanyxie.com\nseaps.org\nseapsoft.com\nsearch616.com\nsearcheasy.net\nsearchpstatp.com\nsearchstatic.com\nsearchtb.com\nsearchtoutiaolive.com\nseashinepm.com\nseasj.com\nseaskyapp.com\nseasonperiod.com\nseasouthgy.com\nseassoon.com\nseastarasset.com\nseasungame.com\nseasungames.com\nseasunwbl.com\nseatent.com\nseatonjiang.com\nseatopcq.com\nseavalve.com\nseavo.com\nseawardhyacinth.com\nseayao.net\nseayee.com\nseayoo.com\nseayooassets.com\nseazor.com\nseb.sason.top\nseblong.com\nsebug.net\nsec-in.com\nsec-mail.cloud\nsec-motor.com\nsec-wiki.com\nsecaibi.com\nsecbug.cc\nsecbug.org\nseccw.com\nsecdoctor.com\nsecdriver.com\nsecec.com\nsecfree.com\nsecisland.com\nsecjia.com\nseclover.com\nseco-rukutin-co-jp.com\nsecoo.com\nsecooart.com\nsecooimg.com\nsecote.com\nsecpulse.com\nsecretflow.com\nsecretgardenresorts.com\nsecretmine.net\nsecrss.com\nsecrui.com\nsecshow.net\nsecsib-eliaslias.com\nsecsib-kendal.com\nsecsilo.com\nsectigochina.com\nsectigochina.com.cdn.cloudflare.net\nsecu100.net\nsecure-83a.com\nsecure-ch-ase03.online\nsecure-chasle026.ink\nsecure-chasle029.wiki\nsecure-chasle039.wiki\nsecure-chasle049.ink\nsecureqin.net\nsecuritycn.net\nsecurityeb.com\nsecurityinsight.com\nsecutimes.com\nsecwk.com\nsecwx.com\nsecxun.com\nseducix.com\nsee-far.com\nsee-source.com\nsee100n.com\nseebeautymedia.com\nseebon.com\nseebug.org\nseecmedia.net\nseed-china.com\nseedasdan.org\nseedchina.com\nseeddsp.com\nseedit.cc\nseedit.com\nseedland.cc\nseedlandss.com\nseedpace.com\nseedsufe.com\nseeed.cc\nseegif.com\nseehealth.net\nseehu.net\nseek114.com\nseekbetter.me\nseekchem.com\nseekcy.com\nseekfunbook.com\nseekhill.com\nseekingsoft.com\nseeklane.com\nseekswan.com\nseekwavetech.com\nseelvyou.com\nseemmo.com\nseemse.com\nseentao.com\nseepomotor.com\nseepomotor.net\nseerbigdata.com\nseerking.com\nseermylife.com\nseersecret.com\nseesawcoffee.com\nseesea.site\nseeseed.com\nseetacloud.com\nseetao.com\nseetong.com\nseewellintl.net\nseewin-edu.com\nseewo.com\nseewoedu.com\nseewoll.com\nseexpo.com\nseeya-tech.com\nseeyii.com\nseeyon.com\nseeyonoversea.com\nseeyouhealth.com\nseeyouweb.com\nseeyouyima.com\nsefonsoft.com\nsegacnsh.com\nsegapi.com\nsegbuy.com\nsegmentfault.com\nsegmentfault.net\nsegotep.com\nsegwayrobotics.com\nsehand.com\nsehimalayanqj.com\nseida.tech\nseijoin.com\nseilway.com\nseily.com\nseirobotics.net\nseis-jun.xyz\nseisman.info\nseiyuex.com\nsejai.com\nsejianghu.com\nsekede.net\nsekorm.com\nselboo.com\nselectdataset.com\nselenlictio.com\nselet4.com\nselfiecity.com\nselfservicechina.com\nselfwhostudio.com\nselgrospl.com\nselinuxplus.com\nsellerspace.com\nsellersprite.com\nsellfox.com\nsellingexpress.net\nselypan.com\nsem123.com\nsem17.com\nsemem99.com\nsemeye.com\nsemgz.com\nsemi-casi.com\nsemi.design\nsemiconductorpower.com\nsemiconshop.com\nsemidata.info\nsemiee.com\nsemight.com\nsemigraph.net\nsemiinsights.com\nsemir.com\nsemiway.com\nsemiwebs.com\nsempk.com\nsemptian.com\nsemsay.com\nsemw-sh.com\nsenaocargo.com\nsenbeijia.com\nsencdn.com\nsencha-china.com\nsenco.cc\nsencomu.com\nsend2boox.com\nsenda360.com\nsendbp.com\nsendcloud.net\nsendcloud.org\nsenderline.com\nsenderline.net\nsendestar.com\nsendijt.com\nsendong.com\nsendpioneer.com\nsends.cc\nsendsharedfiles.com\nsenfa.net\nsenge-dq.com\nsenge.com\nsenggama.online\nsenguo.cc\nsenguo.com\nsengxian.com\nsengzai.com\nsenhai.com\nsenhaix.com\nsenhe.com\nsenior.auto\nseniverse.com\nsenkah.com\nsenken-international.com\nsenlianshop.com\nsenlinjimore.com\nsenmiaoliuxue.com\nsenmiaoschool.com\nsenorsen.com\nsenpet.com\nsenphoto.org\nsenpian.com\nsenra.me\nsensate.hk\nsense-hk.com\nsenseagro.com\nsenselock.com\nsenseluxury.com\nsenser.group\nsensertek.com\nsensesw.com\nsensetime.com\nsenseyun.com\nsenshidahengqi.com\nsensivo.com\nsensors-iot.net\nsensorsdata.com\nsensorsdatavip.com\nsenssun.com\nsenszx.com\nsentaihb.com\nsentaijs.com\nsentaiwpc.com\nsentcss.com\nsentdream.net\nsenteauto.com\nsenthink.com\nsentosemi.com\nsentuxueyuan.com\nsentyeasy.com\nsenwas.com\nsenyada.com\nsenyao1718.com\nsenyou.com\nsenypc.com\nsenyuanhi.com\nsenyuanzhonggong.com\nseo-lv.com\nseo.tm\nseo1158.com\nseo123.net\nseo178.com\nseo371.com\nseo628.com\nseobti.com\nseocxw.com\nseodaniel.com\nseofangfa.com\nseoipo.com\nseokoubei.com\nseoqx.com\nseosdc.com\nseosiguan.com\nseosn.com\nseotcs.com\nseovx.com\nseowhy.com\nseoxiaoxin.com\nseoxuetang.com\nsep.cc\nsepact.com\nsepcc.com\nsepco1.com\nsepfocus.com\nsepimcsemi.com\nseppec.com\nseptinn.com\nseptwolves-group.com\nseptwolves.com\nsepu.net\nsepumps.com\nsequ.biz\nsequoiacap.com\nsequoiadb.com\nsereypath.com\nserholiu.com\nseridc.com\nseridoat.com\nservasoft.com\nserveclouds.com\nserverless-devs.com\nserverproof.net\nservice.urchin.com\nservice86.com\nservicemesher.com\nservicewechat.com\nserviceweixin.com\nservilabmedical.com\nsesamestreetenglishchina.com\nsesamewatermelon.com\nsescar.com\nsescie.com\nseseds.com\nsesier.com\nsetb2b.com\nsetdg.net\nseteuid0.com\nsetshop.vip\nseuic.com\nsevb.com\nseven-meters.com\nseven7777.eu\nsevendatas.com\nsevenhei.com\nsevenseas-china.com\nsevensem.com\nsevnday.com\nsevnz.com\nsewise.com\nsex291roushipin.wiki\nsex2ribenwuma.wiki\nsex2xiaoluoli.wiki\nsex2yingtaoshipin.wiki\nsexytea2013.com\nseyoo.net\nseyuma-cn.com\nsf-airlines.com\nsf-auto.com\nsf-bearing.com\nsf-bsd.com\nsf-card.com\nsf-china.com\nsf-cityrush.com\nsf-dsc.com\nsf-express.com\nsf-financial.com\nsf-freight.com\nsf-international.com\nsf-intra-city.com\nsf-jf.com\nsf-js.com\nsf-laas.com\nsf-pay.com\nsf-saas.com\nsf-zs.net\nsf007.com\nsf024.com\nsf2021.com\nsf34.com\nsf7.net\nsf888.net\nsfacg.com\nsfadx.com\nsfair.com\nsfata.com\nsfb-100.com\nsfbest.com\nsfbuy.com\nsfc9oyfmqg.work\nsfcar.hk\nsfccn.com\nsfcdn.org\nsfcservice.com\nsfdiban.com\nsfdrums.com\nsfdy13168.com\nsfdzh.com\nsfecr.com\nsffdj.com\nsfgj.org\nsfgy.org\nsfhaa.com\nsfht.com\nsfi-sh.com\nsfile2012.com\nsfitcdp.com\nsfjddna.com\nsfjdml.com\nsfjsgroup.com\nsfjt.co\nsfjx888.com\nsfkedu.com\nsfkj-tech.com\nsfkj.vip\nsfkjweb.com\nsflep.com\nsflmfls.com\nsflqw.com\nsflshz.com\nsfmianhua.com\nsfndns.com\nsforest.in\nsfpgmk.com\nsfplay.net\nsfqzj.com\nsfrmt.com\nsfs-cn.com\nsfsdds.com\nsfshuiwu.com\nsfsigroup.com\nsfsw2000.com\nsfsyenergy.com\nsftj.net\nsftnow.com\nsfund.com\nsfvip1.com\nsfwl.co\nsfwljt.com\nsfwxf.com\nsfy-gmc.com\nsfyb.com\nsfybee.com\nsfydns.com\nsfygroup.com\nsfys365.com\nsfystatic.com\nsfzj123.com\nsfzk.org\nsg-che.com\nsg-gemsy.com\nsg-gzy.com\nsg-micro.com\nsg-tencentclb.cloud\nsg-tencentclb.com\nsg-tencentclb.net\nsg-tencentclb.work\nsg.work\nsg163.com\nsg169.com\nsg91.net\nsgameglobal.com\nsgamer.com\nsgautomotive.com\nsgbll.com\nsgccdn.com\nsgcctd.com\nsgcctop.com\nsgcec.com\nsgcgis.com\nsgchangxun.com\nsgchinese.com\nsgcqscgu.com\nsgcyjy.com\nsgda.cc\nsge.sh\nsgfsm.com\nsgjlkyjx.com\nsgjq.net\nsgjsgf.com\nsgjwb.com\nsgjy169.com\nsgjyq.com\nsgla.com\nsglituo.com\nsgliulian.com\nsgllk.com\nsgmart.com\nsgmlink.com\nsgmsonline.com\nsgmw.com\nsgmwlu.com\nsgmwsales.com\nsgnet.cc\nsgou.com\nsgpjbg.com\nsgplink.xyz\nsgpsea.com\nsgqd.com\nsgqqxh.org\nsgrastudio.com\nsgrbcm.com\nsgrcw.com\nsgrsvakz.com\nsgshero.com\nsgshuyuan.com\nsgsic.com\nsgsotools.com\nsgst.prod.dl.playstation.net\nsgsugou.com\nsgsxw.com\nsgsxybiz.com\nsgsyxx.net\nsgt21.com\nsgthzb.com\nsgtmos.com\nsguo.com\nsgvalve.com\nsgvbot.com\nsgwjjc.com\nsgwk.info\nsgy-it.com\nsgyaogan.com\nsgyeyou.com\nsgyhux.com\nsgyouxi.com\nsgyscom.com\nsgyzyun.club\nsgzb2.com\nsgzm.com\nsgzww.com\nsgzww.net\nsgzxedu.com\nsh-3ai.com\nsh-agilebot.com\nsh-aia.com\nsh-anfang.org\nsh-anrong.com\nsh-aquarium.com\nsh-arpm.com\nsh-autofair.com\nsh-azjiadeli.com\nsh-baolai.com\nsh-biobond.com\nsh-chenghuan.com\nsh-chimbusco.com\nsh-datastone.com\nsh-deem.com\nsh-delixi.com\nsh-desu.com\nsh-dongbiao.com\nsh-eastwes.com\nsh-edi.com\nsh-eshow.com\nsh-fdtw.com\nsh-fxgz.com\nsh-fy.com\nsh-game.com\nsh-gelanlishi.com\nsh-gexing.com\nsh-gsg.com\nsh-henderson-metropolitan.com\nsh-hengyuan.com\nsh-hilead.com\nsh-hitech.com\nsh-hlrubber.com\nsh-holfer.com\nsh-holiday.com\nsh-hs.com\nsh-hting.com\nsh-huate.com\nsh-huayang.com\nsh-hwbaoan.com\nsh-hywin.com\nsh-italent.com\nsh-iwatani.com\nsh-jiapeng.com\nsh-jingjin.com\nsh-jinxiang.com\nsh-jjsb.com\nsh-jkyy.com\nsh-jzgroup.com\nsh-kechen.com\nsh-kelai.com\nsh-kingsun.com\nsh-kr.net\nsh-lengdong.com\nsh-liangxin.com\nsh-likun.com\nsh-livemusic.com\nsh-meluck.com\nsh-minghui.com\nsh-ncn.com\nsh-nemoto.com\nsh-oca.com\nsh-pet.com\nsh-pn.com\nsh-pp.com\nsh-printing.com\nsh-prosperity.com\nsh-prosun.com\nsh-putai.com\nsh-puwei.com\nsh-real.com\nsh-recycle.org\nsh-rfid.com\nsh-ryjx.com\nsh-saic.com\nsh-sed.com\nsh-service.com\nsh-sfc.com\nsh-sgl.com\nsh-shenming.com\nsh-shuguang.com\nsh-sict.com\nsh-sinodiet.com\nsh-smartstate.com\nsh-soa.com\nsh-srcb.com\nsh-ssci.com\nsh-tangfeng.com\nsh-tayor.com\nsh-tencentclb.cloud\nsh-tencentclb.com\nsh-tencentclb.net\nsh-tencentclb.work\nsh-ticket.com\nsh-tm.com\nsh-valve.com\nsh-warwick.com\nsh-web.net\nsh-xinao.com\nsh-xixuan.com\nsh-yajia.com\nsh-yano.com\nsh-ybxhz.com\nsh-yichen.com\nsh-yuai.com\nsh-yuy.com\nsh-zbfm.com\nsh002.com\nsh1011.com\nsh112.com\nsh12320.com\nsh148.org\nsh17.com\nsh1nk1n-shokd.com\nsh1nk1n-shokf.com\nsh414.com\nsh4th.com\nsh51766.com\nsh5mcc.com\nsh5y.com\nsh600696.com\nsh601200.com\nsh83.xyz\nsh8y.com\nsh91.com\nsh9130.com\nsh9156.com\nsha-steel-yx.com\nsha-steel.com\nsha2777.com\nsha990.com\nshaaidata.com\nshaangu.com\nshaanxigas.com\nshaanxiiot.com\nshaanxirk.com\nshaanxita.com\nshaanyaogroup.com\nshabc.com\nshabc.net\nshabidding.com\nshabiyun.com\nshachong8.com\nshacumox.com\nshadafang.com\nshadc-tencentclb.cloud\nshadc-tencentclb.com\nshadc-tencentclb.net\nshadc-tencentclb.work\nshaddockfishing.com\nshadiao.pro\nshaduizi.com\nshaduruanjian8.com\nshafa.com\nshafaguanjia.com\nshagangcapital.com\nshagyy.com\nshaidc.com\nshairport.com\nshaisino.com\nshaizai.com\nshajdog.com\nshajuta.com\nshakingcloud.com\nshala99.com\nshalashike.com\nshalfoil.com\nshall-buy.com\nshallserve.cc\nshamiao.com\nshan-yu-tech.com\nshan.com\nshanbay.com\nshanbotv.com\nshancemall.com\nshanchuangjiaoyu.com\nshancui1688.com\nshanda960.com\nshandacasual.com\nshandacasual.net\nshandagames.com\nshandaz.com\nshandechina.xin\nshandian666.com\nshandiandaili.com\nshandiangou.com\nshandianhuifu.com\nshandiansiwei.com\nshandingdang.com\nshandingmenye.com\nshandjj.com\nshandong-energy.com\nshandongair.com\nshandongbadun.com\nshandongbojun.com\nshandonggangxie.com\nshandonggk.com\nshandonghaiyang.com\nshandonghealthcare.com\nshandonghuahai.com\nshandonghuaye.com\nshandongjiapeng.com\nshandongjuli.com\nshandonglanhua.com\nshandongqinuo.com\nshandongruyi.com\nshandongsannong.com\nshandongyunpin.com\nshandw.com\nshanedit.com\nshanfengguigang.com\nshang-chain.com\nshang-ma.com\nshang-xia.com\nshang0898.com\nshang168.com\nshang360.com\nshangair.com\nshangame.com\nshanganzixun.com\nshangate.com\nshangbangzhuan.com\nshangbanla.net\nshangbanzugroup.com\nshangbaolai.com\nshangbaowood.com\nshangbiao.com\nshangbiao.store\nshangbiaocheng.com\nshangbopharm.com\nshangbw.com\nshangc.net\nshangc123.net\nshangcaifanyi.com\nshangchao668.com\nshangchuanba.com\nshangcon.com\nshangdagc.com\nshangdandan.com\nshangdaotong.com\nshangdejy.com\nshangdian.biz\nshangdiguo.com\nshangdu.com\nshangdu.info\nshangeyun.com\nshangfang56.com\nshangfox.com\nshanggame.com\nshanggong-zj.com\nshanghai-air.com\nshanghai-at.com\nshanghai-channel.com\nshanghai-electric.com\nshanghai-idea.com\nshanghai-intex.com\nshanghai-leather.com\nshanghai-map.net\nshanghai-parking.com\nshanghai-pictures.com\nshanghai-sports.com\nshanghai-test.com\nshanghaiahte.com\nshanghaiairport.com\nshanghaiairporttour.com\nshanghaiamts.com\nshanghaiata.com\nshanghaiba.org\nshanghaibaokai.com\nshanghaibaomu.com\nshanghaibaoxie.com\nshanghaicaiyi.com\nshanghaicg.net\nshanghaichannel.net\nshanghaichemical.com\nshanghaiconcerthall.org\nshanghaiconcrete.com\nshanghaicredit.org\nshanghaicup.com\nshanghaidaily.com\nshanghaidelong.com\nshanghaidisneyresort.com\nshanghaidite.com\nshanghaigm.com\nshanghaigobroadhospital.com\nshanghaihino.com\nshanghaihuanli.com\nshanghaiinvest.com\nshanghaiiot.org\nshanghaijinyimaoyi.com\nshanghailima.com\nshanghailm.com\nshanghaimaling.com\nshanghaimart.com\nshanghaimaxicheng.com\nshanghaimengtaishangcheng.com\nshanghaimetal.com\nshanghaimuseum.net\nshanghainb.com\nshanghaining.com\nshanghaionstar.com\nshanghaiparker.com\nshanghaipower.com\nshanghaiqihu.com\nshanghaiqilu.com\nshanghaiql.org\nshanghairanking.com\nshanghairc.com\nshanghairolexmasters.com\nshanghaishuangyanpi.com\nshanghaishuxie.com\nshanghaitianqi114.com\nshanghaitower.com\nshanghaitrust.com\nshanghaivast.com\nshanghaivet.com\nshanghaiwater.com\nshanghaiweicon.com\nshanghaixuejia.com\nshanghaiyinyang.com\nshanghaiyk.com\nshanghaiyouxi.com\nshanghaizhaxinhospital.com\nshanghaizhenji.com\nshanghcat.com\nshanghongbei.com\nshanghuiai.com\nshanghuiwww.com\nshanghuiyi.com\nshangjieiot.com\nshangjilian.com\nshangjingsh.com\nshangjinssp.com\nshangjinuu.com\nshangjixin.com\nshangketang.com\nshangli-tea.com\nshanglin.net\nshanglischool.com\nshanglp.com\nshangluo.co\nshanglushan.com\nshanglv51.com\nshangnaxue.cc\nshangnaxue.net\nshangpai123.com\nshangpin.com\nshangpinshou.com\nshangpo.com\nshangpu-china.com\nshangpusou.com\nshangpuzhan.com\nshangquanquan.com\nshangque.com\nshangrao-marathon.com\nshangshaban.com\nshangshancm.com\nshangshang.com\nshangshangke.me\nshangshangoa.com\nshangshangsp.com\nshangshi360.com\nshangshici.com\nshangshiwl.com\nshangshouweb.com\nshangshu.com\nshangshuce.com\nshangshuyixue.com\nshangtaiw.com\nshangtao.net\nshangtao360.com\nshangtianhui.com\nshangtongda.com\nshangtuf.com\nshanguanjixie.com\nshanguansoft.com\nshangui.cc\nshangusec.net\nshangwb.com\nshangwu168.com\nshangwulink.com\nshangxue.com\nshangxueba.com\nshangyejihua.com\nshangyekj.com\nshangyexinzhi.com\nshangyouxuan.com\nshangyouze.com\nshangyu-marathon.com\nshangyuan029.com\nshangyubank.com\nshangyuer.com\nshangzhang.com\nshangzhibo.tv\nshanhaifuture.com\nshanhainengyuan.com\nshanhaitujian.com\nshanhaizhanji.com\nshanhe.com\nshanhe.kim\nshanhe01.com\nshanheknit.com\nshanheyule.com\nshanhs.com\nshanhu188.com\nshanhu99.com\nshanhuijiangtang.com\nshanhuu.com\nshanjianzhan.com\nshanjinqh.com\nshanjuinformation.com\nshankaisports.com\nshanks.link\nshanliao.com\nshanliaoapp.com\nshanling.com\nshanlinjinrong.com\nshanlink.com\nshanlinshengwu.com\nshanliulian.com\nshanmeixincai.com\nshanniaorecycle.com\nshannon-sys.com\nshannonai.com\nshanqing.net\nshanqu.cc\nshanqx.com\nshanrongmall.com\nshanse8.com\nshanshan-business.com\nshanshan.com\nshanshangame.com\nshanshanhc.com\nshanshanim.vip\nshanshanku.com\nshanshantech.com\nshanshoufu.com\nshanshuihotel.com\nshanshuiwl.com\nshansteelgroup.com\nshante.me\nshantoujingrui.com\nshantoumama.com\nshantui.com\nshantuimall.com\nshanwan.com\nshanwan.store\nshanwanli.com\nshanweinews.net\nshanweirc.com\nshanweiyule.com\nshanwel.com\nshanwxxg.com\nshanxiangjiaoyu.com\nshanxiaobai.com\nshanxichess.com\nshanxidiy.com\nshanxigames.com\nshanxigas.com\nshanxigwy.org\nshanxihaoshengtong.com\nshanxijianzhuzizhi.com\nshanximuseum.com\nshanxinj.com\nshanxiol.com\nshanxiranqi.com\nshanxishangren.com\nshanxishizheng.com\nshanxiumao.com\nshanxiuxia.com\nshanyang666.com\nshanyangwang.com\nshanyaogroup.com\nshanyaoo.com\nshanyaoyjy.com\nshanyemangfu.com\nshanyetang.com\nshanyhs.com\nshanyishanmei.com\nshanyougame.com\nshanyu.com\nshanyuankj.com\nshanyuanms.com\nshanyue.tech\nshanyuechina.com\nshanyzx.com\nshanzhen.com\nshanzhen.me\nshanzhildq.com\nshanzhonglei.com\nshanzhuyou.com\nshaoanlv007.com\nshaoerbc.org\nshaoerwushu.org\nshaogefenhao.com\nshaogood.com\nshaojiu.com\nshaoke.com\nshaolinjingwu.com\nshaolintagou.com\nshaolinwushuxuexiao.com\nshaolinwy.com\nshaolvjt.com\nshaomingyang.com\nshaoniandream.com\nshaoshangwang.org\nshaoshilei.com\nshaoxiao.net\nshaoxing330.com\nshaoxingwater.com\nshaoyangnews.net\nshaoyuncloud.com\nshaphar.com\nshapharqx.com\nshaphc.org\nshaqing.com\nshaqm.com\nshare1diantong.com\nshare2dlink.com\nshare2uu.com\nshare404.com\nshareate.com\nsharecharger.com\nsharecore.net\nsharedaka.com\nsharegog.com\nshareinstall.com\nshareinstall.net\nshareintelli.com\nshareitthrough.com\nsharejoytech.com\nsharejs.com\nsharelogis.com\nsharemoon.club\nshareoneplanet.org\nsharesdns.com\nsharetome.com\nsharetrace.com\nsharevdi.com\nsharewaf.com\nsharexbar.com\nsharexiang.com\nsharingclass.vip\nsharjahmadrasa.com\nsharkisland.store\nsharkselection.com\nsharkshopping.com\nsharpbai.com\nsharpheel.com\nsharpmobi.com\nsharpon.com\nshasx.com\nshatian.org\nshautomuseum.com\nshawdo.com\nshawnzeng.com\nshaxian.biz\nshayugg.com\nshayujizhang.com\nshayuweb.com\nshazc.com\nshb.ltd\nshbangde.com\nshbangdian.com\nshbaoli.com\nshbars.com\nshbbq.net\nshbear.com\nshbetterway.com\nshbg.org\nshbicycle.com\nshbike.com\nshbio.com\nshbiochip.com\nshbizhen.com\nshbj.com\nshbjfc.com\nshbkfyy.com\nshbkwai.com\nshbl8.com\nshbnrj.com\nshbobo.com\nshboka.com\nshbpump.com\nshbqmp.com\nshbtpm.com\nshbxzp.com\nshbyer.com\nshbyw.com\nshcaco3.com\nshcancer.com\nshcas.net\nshcc-horizon.com\nshcce.com\nshccig.com\nshccineg.com\nshccio.com\nshccpx.net\nshccxy.com\nshcd.cc\nshcell.com\nshcell.org\nshcellgroup.com\nshcfcd.com\nshchangshun.com\nshchnkyy.com\nshchyy.net\nshcifco.com\nshckgs.com\nshclearing.com\nshclgc.net\nshcljoy.com\nshclkj.com\nshcmer.com\nshcmhr.com\nshcnfb.com\nshcngz.com\nshcsdq.com\nshcsinfo.com\nshcstheatre.com\nshcwmotor.com\nshcxbyjt.com\nshcya.com\nshcz.com\nshczssyq.com\nshczyy.com\nshdafw.com\nshdancecenter.com\nshdasa.com\nshdata.com\nshdatagroup.com\nshdcjt.com\nshdftz.com\nshdgm.com\nshdingzhidental.com\nshdirong.com\nshdjt.com\nshdmic.com\nshdmt.net\nshdmu.com\nshdnjt.com\nshdouxie.com\nshdpa.com\nshdrc.org\nshdrkj.com\nshdsd.com\nshdsn.com\nshdsqs.com\nshdszc.com\nshdxgraphene.com\nshdxk.com\nshdy.com\nshdy168.com\nshdyiy.com\nshdyty.com\nshdzep.com\nshdzfp.com\nshe120.com\nsheasyoffice.com\nshebao.net\nshebao100.com\nshebao5.com\nshebao520.com\nshebaomi.com\nshebaotong.com\nshebaowang.com\nshebaozhaopian.com\nshebiaotm.com\nsheboo.com\nsheca.com\nshedejie.com\nshedongyun.com\nshedoor.com\nshedunews.com\nsheec-tencentclb.cloud\nsheec-tencentclb.com\nsheec-tencentclb.net\nsheec-tencentclb.work\nsheencity.com\nsheenrun.com\nsheentec.com\nsheep11.com\nsheepmats.com\nsheinet.com\nsheji.com\nshejibao.com\nshejiben.com\nshejibiji.com\nshejidaren.com\nshejidaxue.com\nshejidedao.com\nshejidna.com\nshejijia.com\nshejijingsai.com\nshejiku.net\nshejinu.com\nshejipi.com\nshejiqun.com\nshejis.com\nshejiwo.net\nshejixf.com\nshejiyizhou.com\nshejiyue.com\nsheketiandi.com\nshekou.com\nshelive.net\nshellpub.com\nshellsec.com\nshelter-china.com\nshelterdome.net\nshelwee.com\nshen-grh.com\nshen-nao.com\nshen-xi.com\nshen321.com\nshenanhui.com\nshenbanglawyer.com\nshenbinghang.com\nshenbingyiyuan.org\nshenbisheji.com\nshencai-china.com\nshencaiceshi.com\nshenchai.com\nshenchengkeji.com\nshenchengtou.com\nshenchigroup.com\nshenchuang.com\nshenchunhui.com\nshencut.com\nshenda-group.com\nshendatong.com\nshendiaoqzj.com\nshendoow.com\nshendu.com\nshendu123.com\nshendugho.com\nshenduliaojie.com\nshenduwang.com\nshenduwin10.com\nshenduwin7.com\nshenduxiyin.com\nshenfagg.com\nshengangzc.com\nshengaohua.com\nshengbaihui.com\nshengbangshenghua.com\nshengbaoluo.com\nshengcai.net\nshengcaijinrong.com\nshengcaiyoushu.com\nshengcaozhiwang.com\nshengcekeji.com\nshengchan.biz\nshengdan.com\nshengdaosoft.com\nshengdaprint.com\nshengdawood.com\nshengdecw.com\nshengdianhuadg.com\nshengdianhuadk.com\nshengejing.com\nshengenqianzheng.com\nshengenv.com\nshengfajiaohua.com\nshengfanwang.com\nshenghan.org\nshenghefilms.com\nshengheplastic.com\nshenghongpec.com\nshenghu.cc\nshenghua-fire.com\nshenghuabao.net\nshenghuaem.com\nshenghuagroup.com\nshenghuaxi.com\nshenghui56.com\nshenghuigd.com\nshenghuo365.com\nshenghuojia.com\nshenghuorili.com\nshenghuowo.com\nshengjie-logistics.com\nshengjing360.com\nshengjinghe.com\nshengjinglinye.com\nshengjiu.com\nshengjoy.com\nshengjuewl.com\nshengli.com\nshenglongit.com\nshengmaapp.com\nshengmage.com\nshengming.net\nshengmingfa.com\nshengminghitech.com\nshengniuuz.com\nshengpay.com\nshengqian51.com\nshengquan.com\nshengqugames.com\nshengren.work\nshengrungroup.com\nshengsci.com\nshengshengkang.com\nshengshizhicheng.com\nshengtai.com\nshengtaigroup.net\nshengtian.com\nshengtiangroup.com\nshengtongedu.com\nshengtuanyouxuan.com\nshenguang.com\nshengwu.store\nshengwu01.com\nshengxiao.net\nshengxiaobj.com\nshengxiaochemical.com\nshengxin.ren\nshengxingholdings.com\nshengxinquan.net\nshengxuxu.com\nshengyan985.com\nshengyedq.com\nshengyeji.com\nshengyi.ai\nshengyi.biz\nshengyizhuanjia.com\nshengyuan.com\nshengyuancc.com\nshengzhaoli.com\nshengzhujiage.com\nshenhaoinfo.com\nshenhexin.com\nshenhexin.vip\nshenheyuan.net\nshenhongfei.com\nshenhongmao.com\nshenhua.cc\nshenhuachina.com\nshenhudong.com\nsheniaoren.com\nsheniaorenw.com\nshenjianggroup.com\nshenjiangyy.com\nshenjing.com\nshenjumiaosuan.com\nshenkai.com\nshenkelong.com\nshenkexin.com\nshenkong.net\nshenlan01.com\nshenlan02.com\nshenlanbao.com\nshenlaohr.com\nshenling.com\nshenlintech.com\nshenma-inc.com\nshenma.com\nshenmabaike.com\nshenmadsp.com\nshenmapay.com\nshenmayouxi.com\nshenmeipharm.com\nshenmikj.com\nshenmo.com\nshenmojiaoyu.com\nshenmou.com\nshennongjiazhaopin.com\nshennongpharma.com\nshennwu.com\nshenou.com\nshenousz.com\nshenpinwu.com\nshenpojie.com\nshenpowang.com\nshenpucw.com\nshenqhy.com\nshenqisou.com\nshenqiwunet.com\nshenqizhilv.com\nshenquol.com\nshenrongda.com\nshenrongjidian.com\nshenruan.org\nshenruapp.com\nshenshang.org\nshenshi777.com\nshenshijituan.com\nshenshitech.org\nshenshoucdn.com\nshenshouwl.com\nshenshouyouxi.com\nshenshu.info\nshenshuo.net\nshenshuw.com\nshenshuxs.org\nshensuantang.com\nshensuokeji.com\nshenta.net\nshentongchina.com\nshentongdata.com\nshentongkuaidi.com\nshenweibengye.com\nshenweimicro.com\nshenweisupport.com\nshenweixiangjiao.com\nshenxianhua.com\nshenxianyu.cc\nshenxijixie.com\nshenxingroup.com\nshenxm.com\nshenxuanche.com\nshenyang2car.com\nshenyangoffice.com\nshenyd.com\nshenyecg.com\nshenyehd.com\nshenyeyunying.com\nshenyinhudong.com\nshenyou.tv\nshenyu.me\nshenyuanquan.com\nshenyunlaw.com\nshenyunmedical.com\nshenyunwang.com\nshenzan.com\nshenzaokeji.com\nshenzaole.com\nshenzhekou.com\nshenzhen-kuaiji.com\nshenzhen-world.com\nshenzhenair.com\nshenzhenbianhua.com\nshenzhencefa.com\nshenzhenew.com\nshenzheninvestment.com\nshenzhenjgw.com\nshenzhenlianhua.com\nshenzhenmakerfaire.com\nshenzhenshouxin.com\nshenzhenshuixie.com\nshenzhentong.com\nshenzhentour.com\nshenzhenware.com\nshenzhenygx.com\nshenzhenyuren.com\nshenzhoublm.com\nshenzhouen.com\nshenzhoufu.com\nshenzhoupharma.com\nshenzhyu.work\nshepai1688.com\nshephe.com\nshepinw.com\nshequfu.com\nshequfu.net\nsherc.net\nsherlockkk.com\nsherlocky.com\nsherowm.com\nsheshui.com\nshesoleshoes.com\nshetu66.com\nsheui.com\nshevdc.org\nshewang.net\nsheweikeji.com\nshexcloud.com\nshexgrp.com\nshexian100.com\nshexiannet.com\nshexpocenter.com\nsheying001.net\nsheyingtg.com\nsheyou.com\nsheyuan.com\nshezaixian.com\nshezfy.com\nshfa120.com\nshfamily.com\nshfangshui.com\nshfayy.com\nshfcw.com\nshffjt.com\nshfft.co\nshfft.com\nshfgzl.com\nshfigaro.com\nshfilmart.com\nshfilmmuseum.org\nshfinechem.com\nshfirstrehab.com\nshfoxmotor.com\nshfq.com\nshfrp.com\nshfswl.com\nshfte.com\nshfxrc.com\nshfy2020.com\nshgao.com\nshgaoxin.net\nshgbc.org\nshgbit.com\nshgbitcloud.com\nshgci.com\nshgedu.com\nshggzy.com\nshgjj.com\nshgjq.com\nshgkh.com\nshgkl.com\nshgkw.org\nshglgf.com\nshgpo.com\nshgsec.com\nshgsic.com\nshgskj.com\nshgtheatre.com\nshgushi.com\nshgyg.com\nshgymy.com\nshhanqiao.com\nshharborcity.com\nshhbgm.com\nshhcjt.com\nshhcpm.com\nshhd17.com\nshhdouyue.com\nshhebio.com\nshhella.com\nshhenghesh.com\nshheywow.com\nshhic.com\nshhigher.com\nshhiminhm.com\nshhkcc.com\nshhkfw.com\nshhksports.com\nshhkyy.com\nshhl56.com\nshhlgroup.com\nshhmbio.com\nshhmu.net\nshholdingeu.com\nshhorse.com\nshhqcft-tencentclb.cloud\nshhqcft-tencentclb.com\nshhqcft-tencentclb.net\nshhqcft-tencentclb.work\nshhqcftfzhj-tencentclb.cloud\nshhqcftfzhj-tencentclb.com\nshhqcftfzhj-tencentclb.net\nshhqcftfzhj-tencentclb.work\nshhqcftfzhjtencentclb.cloud\nshhqgc.com\nshhrp.com\nshhtqn.com\nshhuaerkang.com\nshhuayi.com\nshhuayitz.com\nshhuazhen.com\nshhugong.com\nshhuihai.com\nshhuke.com\nshhuo.com\nshhushi.com\nshhuu.com\nshhweili.com\nshhws.com\nshhxbk.com\nshhxpx.com\nshhxyy.com\nshhxzq.com\nshhyanqing.com\nshhyhy.com\nshhzcj.com\nshi-ming.com\nshiabank.com\nshianzhixuan.com\nshibaili.com\nshibangchina.com\nshibangsy.com\nshibei.com\nshibeiht.com\nshibeixuan.com\nshibolm.com\nshibor.org\nshicai.biz\nshicaidai.com\nshicaizhanlan.com\nshicehao.com\nshichangbu.com\nshichengbao.com\nshichengyi.com\nshichuangsj.com\nshichuangyi.com\nshichuedu.com\nshichuihui.com\nshicigequ.com\nshicishe.com\nshiciyun.com\nshicuojue.com\nshida66.com\nshidaedu.vip\nshidai5d.com\nshidaohospital.com\nshidapx.com\nshidastudy.com\nshide.com\nshidegroup.com\nshidenggui.com\nshidianbaike.com\nshidianguji.com\nshidianwandao.com\nshidiao136.com\nshidicn.com\nshidoukeji.com\nshidutuozhan.com\nshiepmexpo.com\nshifair.com\nshifan.org\nshifanedu.com\nshifang.tech\nshifansheng.com\nshifd.net\nshifeiti.com\nshifen.com\nshifendaodu.com\nshifendaojia.com\nshifeng.com\nshifenyuedu.com\nshigaoshan.com\nshiguanai.com\nshiguanghuyu.com\nshiguangpu.com\nshiguangxu.com\nshiguangyouju.com\nshiguanyinger-jg.com\nshihua-group.com\nshihuantong.com\nshihuishuo.com\nshijiala.com\nshijian.cc\nshijian.org\nshijiancn.com\nshijianla.com\nshijianping.com\nshijiaok.com\nshijicloud.com\nshijie2.com\nshijiebang.com\nshijiechaoshi.com\nshijieditu.net\nshijiemap.com\nshijieminghua.com\nshijiemingren.com\nshijiesanqingshan.com\nshijieshijian.net\nshijiexia.com\nshijieyouxi.com\nshijiezz.com\nshijihr.com\nshijihulian.com\nshijiong.com\nshijiqingqing.com\nshijiretailo2o.com\nshijiudao.com\nshijiufang.com\nshijqq.com\nshijuan1.com\nshijue.me\nshijueju.com\nshijuenian.com\nshikangsi.com\nshikaricharters.com\nshikee.com\nshikelang.cc\nshikongdaoyu.com\nshiku.co\nshilehui.com\nshileizuji.com\nshilian.com\nshilian.net\nshilicdn.com\nshilincn.com\nshilitie.net\nshiliuai.com\nshiliupo.com\nshiluetl.com\nshiluoji.com\nshimano-fishchina.com\nshimaoco.com\nshimaoenergy.com\nshimaogroup.com\nshimaostargroup.com\nshimaotong.com\nshimaowy.com\nshimen.org\nshimengcs.com\nshimengyuan.com\nshimengzhanghao.com\nshimge.com\nshimiduanju.com\nshiming.com\nshiminjia.com\nshimizuchem.com\nshimo.im\nshimo.run\nshimodev.com\nshimoko.com\nshimolife.com\nshimonote.com\nshimotx.com\nshimowendang.com\nshin-kinojseh.com\nshinberto.com\nshinco.com\nshindaichem.com\nshine-consultant.com\nshine-ic.com\nshine-tech.net\nshineacc.com\nshinechina.com\nshinefeel.com\nshinelon.com\nshineoptics.com\nshineray-motors.com\nshinerayad.com\nshinescan.tech\nshinetsu.shop\nshineu.com\nshineway.com\nshinewaytech.com\nshinewing.com\nshinewonder.com\nshineyie.com\nshineyue.com\nshinger.com\nshinianonline.com\nshining-electric.com\nshining3d.com\nshiningmidas.com\nshiningnew.com\nshiningpharm.com\nshink1n-ojasaoq.com\nshinkin-jpo-coy.com\nshinkinopsae.com\nshinnytech.com\nshinva.net\nshinycg.com\nshinye-ortho.com\nshinyway.org\nshinzoom.com\nshiove.com\nship-gps.net\nship.sh\nship56.net\nshipai123.com\nshipfinder.com\nshipgce.com\nshipgroup.net\nshiphr.com\nshipin163.com\nshipin520.com\nshipinzhibojian.com\nshipoe.com\nshippingate.com\nshippingchina.com\nshippingwhale.com\nshipry.com\nships66.com\nshipservice.org\nshiptux.com\nshipurili.com\nshipuxiu.com\nshipxy.com\nshiqi.me\nshiqiao.com\nshiqichuban.com\nshiqidu.com\nshiqitech.com\nshiqu.com\nshiquan56.com\nshiquask.com\nshiqutech.com\nshirenzuojia.com\nshiritianchengtech.com\nshirongzhaoye.com\nshisanzhi.com\nshiseidochina.com\nshishacharcoal.net\nshishagame.com\nshishangd.com\nshishangfengyun.com\nshishenmegeng.com\nshishifanyi.com\nshishijia.com\nshishike.com\nshishiwater.com\nshiso9001.net\nshisongya.com\nshisukeji.com\nshitac.com\nshitac.net\nshitairen.com\nshitestunion.work\nshiti.net\nshitianxia.vip\nshitoc.com\nshitou.com\nshitouboy.com\nshitourom.com\nshitsu.co.jp\nshituyikao.com\nshiwaiyun.net\nshiwanbaijiu.com\nshiwang1688.com\nshiwangyun.com\nshiweisemi.com\nshiwenlu.com\nshixiangren.com\nshixiaojin.com\nshixibiaozhi.com\nshixijob.net\nshixingceping.com\nshixinhua.com\nshixinyufang.com\nshixiseng.com\nshixiu.net\nshixun365.com\nshixunhao.com\nshixunsuda.com\nshixunwl.com\nshiyan.com\nshiyanbar.com\nshiyanbar.net\nshiyangdr.com\nshiyanhospital.com\nshiyanjia.com\nshiyanlou.com\nshiyculture.com\nshiye.org\nshiyebian.net\nshiyebian.org\nshiyedanwei.net\nshiyi.co\nshiyi11.com\nshiyibao.com\nshiyicdn.com\nshiyide.com\nshiyifacai.com\nshiyingbao.com\nshiyiyj.com\nshiyiyx.com\nshiyong.com\nshiyongjun.biz\nshiyou-electric.com\nshiyou.me\nshiyouflooring.com\nshiyouhome.com\nshiyousan.com\nshiyu.pro\nshiyu.zone\nshiyuandx.com\nshiyue.com\nshiyuegame.com\nshiyueliangpin.com\nshiyund.com\nshiyus.com\nshiyutianqi.com\nshizhanxia.com\nshizhiad.work\nshizhuang-inc.com\nshizhuolin.com\nshizhuonet.com\nshj6789.com\nshjakfyy.com\nshjaming.com\nshjayson.com\nshjb600838.com\nshjcm3d.com\nshjd.org\nshjdceo.com\nshjdjx.com\nshjglaser.com\nshjgu.com\nshjh120.com\nshjhjc.com\nshjiabu.com\nshjinbao.com\nshjincan.com\nshjingmi.com\nshjingxu.com\nshjinnengzuche.com\nshjlnzyy.com\nshjob.work\nshjr-tencentclb.cloud\nshjr-tencentclb.com\nshjr-tencentclb.net\nshjr-tencentclb.work\nshjsit.com\nshjsrg.com\nshjsst.com\nshjstl.com\nshjsxh.com\nshjt.net\nshjtos.com\nshjtw.com\nshjtxx.net\nshjus.com\nshjvguan.com\nshjx-group.com\nshjy18.com\nshjy8888.com\nshjyou.com\nshjyyx.com\nshjzfs.com\nshjzfutures.com\nshjzzjf.net\nshkaihang.com\nshkamoer.com\nshkcn.com\nshkcsj.com\nshkdchem.com\nshkdfua.com\nshkdtfyf.vip\nshkewen.com\nshkg.net\nshkhzc.com\nshkingchem.com\nshkjb.com\nshkjcable.com\nshkjjs.com\nshkjqp.com\nshkjsoft.com\nshkkl.com\nshklsw.com\nshkm.com\nshkpzx.com\nshkuangjing.com\nshkypump.com\nshlab.tech\nshlangao.com\nshlawserve.com\nshlayout.com\nshlcxby.com\nshld.com\nshldfm.com\nshlhbxg.com\nshliafvzc.com\nshliangshi.com\nshlianlu.com\nshlingang.com\nshlinjiang.com\nshlitc.com\nshlixin.com\nshll-gs.com\nshlll.net\nshlmth.com\nshlongtai.com\nshlp.com\nshlpk.com\nshlsnk.com\nshlsyb.com\nshlungu.com\nshlys.com\nshmaas.net\nshmama.net\nshmarathon.com\nshmaur.com\nshmbjy.org\nshmds.com\nshmds.vip\nshmedia.tech\nshmengyang.com\nshmet.com\nshmetro.com\nshmfmr.net\nshmhtv.com\nshmhzp.com\nshmljm.com\nshmockup.com\nshmog.org\nshmondial.com\nshms-expo.com\nshmtu.net\nshmusic.org\nshmusicschool.com\nshmylike.com\nshmzgroup.com\nshnaile.com\nshnanfang.com\nshnayw.com\nshnb12315.com\nshnbsh.com\nshneuro.org\nshneweye.com\nshnmnm.com\nshnne.com\nshnsyh.com\nshnti.com\nshoasis.net\nshoasisholding.com\nshobserver.com\nshockerli.net\nshockley-elect.com\nshoegaze.com\nshoeshr.com\nshofine.com\nshojo.cc\nshokan.org\nshokdown.com\nshokw.com\nshokz-comm.org\nsholaser.com\nshollper.com\nshomop.com\nshomyq.com\nshonfer.com\nshootmedia.net\nshop-isv.com\nshop2cn.com\nshopbackdrop.com\nshopchaoren.com\nshopeesell.com\nshopeesz.com\nshopesv.com\nshopex123.com\nshopimgs.com\nshopin.net\nshopjyh.com\nshoplazza.com\nshopline123.com\nshopmaxmb.com\nshopnc.net\nshoppingchain.net\nshopplus.vip\nshoprobam.com\nshopscrm.com\nshopss.com\nshoptop.com\nshopwatchus.com\nshopwind.net\nshopxo.net\nshopxo.vip\nshopxx.net\nshopyy.com\nshorcut88.com\nshorologe.com\nshortof.com\nshotnba.com\nshou-qi.com\nshoubaiart.com\nshoubanjiang.com\nshoubaodan.com\nshoubashou.net\nshoubb.com\nshoubiaohuishou.com\nshoubiaowang.com\nshoubuluo.com\nshoucangyaji.com\nshouce.ren\nshouce365.com\nshouchaoba.com\nshoucheng123.com\nshoudayy.net\nshoudian.com\nshoudian.info\nshoudian.org\nshoudu.org\nshouduit.com\nshoudurc.com\nshoudurx.com\nshoufaw.com\nshoufm.com\nshoufu.com\nshougongke.com\nshougongke.net\nshougoumingbiao.com\nshouhaoche.com\nshouhoubang.com\nshouhougou.com\nshouhui.com\nshouhuigroup.com\nshouhuisoft.com\nshouhuojiyun.com\nshouhuola.com\nshouji.com\nshouji.racing\nshouji10086.com\nshouji315.org\nshouji56-img.com\nshouji56.com\nshoujibao.net\nshoujidai.com\nshoujiduoduo.com\nshoujihuifu.com\nshoujikanshu.net\nshoujimi.com\nshoujitouping.com\nshoujiwan.com\nshoujixs.net\nshoujixs.org\nshoukaigufen.com\nshoukala.com\nshoukangyiyuan.com\nshoukayun.com\nshoulian.org\nshoumaquan.com\nshoumizhibo.com\nshoumm.com\nshounaoxuexiao.com\nshouqi-zuche.com\nshouqianba.com\nshouqibus.com\nshouqicar.com\nshouqiev.com\nshouqu.me\nshoushenlvcheng.com\nshoutai.com\nshoutanjjj.com\nshouxi.com\nshouxieke.net\nshouxieti.com\nshouxihu.net\nshouxiphotos.com\nshouyao.com\nshouyao8.com\nshouyaoholding.com\nshouye-wang.com\nshouyhui.com\nshouyihuo.com\nshouyinbei.net\nshouying.tv\nshouyou.com\nshouyoubus.com\nshouyoucdn.com\nshouyoudao.com\nshouyoujz.com\nshouyouqianxian.com\nshouyoushenqi.com\nshouyoutv.com\nshouyouzhijia.net\nshouzhang.com\nshouzhangapp.com\nshouzhitao.com\nshouzhuanzhidao.com\nshovesoft.com\nshow160.com\nshowaamericanstory.com\nshowapi.com\nshowchina.org\nshowcitytimes.net\nshowcome.net\nshowdoc.cc\nshowerlee.com\nshowfay.com\nshowgame.com\nshowing9.com\nshowjoy.com\nshowkey.com\nshowl.com\nshowmeai.tech\nshowmebug.com\nshowmesse.net\nshowroomshanghai.com\nshowse.com\nshowself.com\nshowshell.com\nshowstart.com\nshowtao.com\nshowxiu.com\nshowxue.com\nshowyu.com\nshoyoo.com\nshpans.com\nshpanyou.com\nshpbs.com\nshpd.net\nshpdh.org\nshpdjq.com\nshpedi.com\nshpenquan.com\nshpgt.com\nshpgx.com\nshphschool.com\nshpiano.com\nshpingda.com\nshppa.net\nshps518.com\nshpsncp.com\nshpyedu.com\nshqec.com\nshqi7.net\nshqinghe.com\nshqingzao.com\nshqipai.org\nshqkxh.org\nshqmxx.com\nshqncs.com\nshqpxc.com\nshqswlgs.com\nshqunlu.com\nshqxjx.com\nshqyg.com\nshrail.com\nshrbank.com\nshrca.org\nshrcb.com\nshrcdy.com\nshrenqi.com\nshresource.com\nshrgjt.com\nshrlig.com\nshrmpump.com\nshrmw.com\nshrrjt.com\nshrtlnks.com\nshruanjie.com\nshruisong.net\nshry.net\nshryou.com\nshsaic.net\nshsajt.com\nshsanfang.com\nshsanfine.com\nshsanji.com\nshsanwei.com\nshsbnu.net\nshsby.com\nshsc-valve.com\nshscce.com\nshsci.org\nshscsc.com\nshsctec.com\nshsd-elec.com\nshsdjsj.com\nshsdnet.com\nshsee.com\nshsfkyy.com\nshsfxxh.com\nshsgbm.com\nshsgyq.com\nshshenbo.com\nshshilin.com\nshshinfo.com\nshshuhui.com\nshshunfeng.com\nshshuxiao.com\nshshzu.com\nshsid.org\nshsinhu.com\nshsipo.com\nshsixun.com\nshsjb.com\nshsjcb.com\nshsjgj.com\nshsjjh.com\nshskin.com\nshsktower.com\nshskyland.com\nshslqxh.com\nshsmzj.com\nshsoong-chingling.com\nshsot.com\nshsparkwater.com\nshspdq.com\nshsportschool.com\nshsq.vip\nshsrdzs.com\nshssdc.com\nshssp.org\nshstcm.com\nshstone.org\nshstyxh.com\nshsunny.com\nshswim.com\nshsxjy.com\nshsyf.com\nshsyzn.online\nshsz17.com\nshszsoft.com\nshtalentgroup.com\nshtannet.com\nshtaoism.com\nshtazy.com\nshtbi.com\nshtdgj.com\nshtdsc.com\nshtefu.com\nshtfqx.com\nshtgds.com\nshthbanz.com\nshthediyya.com\nshtianhe.cc\nshtianye.com\nshtianyuqiche.com\nshtic.com\nshtimessquare.com\nshtion.com\nshtopshow.com\nshtour.org\nshtqzs.com\nshtrhospital.com\nshtsn.com\nshtsp.com\nshtutian.com\nshtw.cc\nshtwjiebao.com\nshtxcj.com\nshtydic.com\nshu-ju.net\nshu163.com\nshuaigeshe.com\nshuaigun.com\nshuaihuajun.com\nshuaiku.com\nshuaiming.com\nshuainiba.com\nshuaipiao.com\nshuaishou.com\nshuaiy.com\nshuaji.com\nshuaji.net\nshuajibao.com\nshuajizhijia.net\nshuakazhijia.com\nshuame.com\nshuang-feng.com\nshuang-sen.com\nshuangcheng.net\nshuangda-pump.com\nshuangguan.net\nshuanghancn.com\nshuangheng.com\nshuanghui.net\nshuangjing.net\nshuangkou.net\nshuangkuai.co\nshuangle888.com\nshuangliang-boiler.com\nshuanglin.com\nshuanglingroup.com\nshuanglongdong.com\nshuanglongjp.com\nshuangmatbs.com\nshuangmei2008.com\nshuangniaoslhl.com\nshuangqingtech.com\nshuangtao.com\nshuangtiantech.com\nshuangtuan.com\nshuangxian.com\nshuangxingcaisu.com\nshuangxingseed.com\nshuangxinhui.com\nshuangyanjie.com\nshuangyingmenye.net\nshuangyingsx.com\nshuangyuejn.com\nshuangzheng.org\nshuangzhong.com\nshuashuaapp.com\nshuashuati.com\nshuazhibo.com\nshubiaob.com\nshubl.com\nshucai001.com\nshucai123.com\nshucaixiaoshuo.com\nshuchengdt.com\nshuchongread.com\nshuchuandata.com\nshucong.com\nshudaoge.com\nshudaojt.com\nshudaowl.com\nshudaxia.com\nshudianwang.com\nshudongpoo.com\nshudouzi.com\nshuduntech.com\nshuerjia.com\nshufa.com\nshufa.org\nshufa121.com\nshufa360.com\nshufa520.com\nshufaai.com\nshufabao.net\nshufafin.com\nshufaji.com\nshufajia.cc\nshufami.com\nshufashibie.com\nshufaway.com\nshufawu.com\nshufazidian.com\nshufaziti.com\nshufe.com\nshufenggaoke.com\nshuge.org\nshuge9.com\nshuguang.com\nshuguanggroup.com\nshuguanghuayuan.com\nshuhai.com\nshuhaidata.com\nshuhaige.net\nshuhaisc.com\nshuhaitz.com\nshuhaochaxun.com\nshuhegroup.com\nshuhenglib.com\nshuhonggz.com\nshuhua.com\nshuhuast.com\nshuhuawu.com\nshuhui9.com\nshui12366.com\nshuibaogs.com\nshuibengxinghao.com\nshuicao.cc\nshuichan.cc\nshuichan51.com\nshuichuyu.com\nshuidichou.com\nshuididabingchou.net\nshuidigongyi.com\nshuidiguanjia.com\nshuidihealth.com\nshuidihuzhu.com\nshuidihuzhu.net\nshuidike.com\nshuidiopen.com\nshuiditech.com\nshuidixy.com\nshuidyd.com\nshuifuhuanbao.com\nshuigongye.com\nshuiguobang.com\nshuijing100.com\nshuijingka.com\nshuijingwanwq.com\nshuijingwuyu.com\nshuijingyibai.com\nshuijinshunzhuang.com\nshuiku.cc\nshuiliangye.com\nshuiliantong.com\nshuiliaosheji.com\nshuiligroup.com\nshuilongtouapp.com\nshuimiao.net\nshuimofang.net\nshuimoshi.net\nshuimozhuan.net\nshuimui.com\nshuimujiaju.com\nshuimuyulin.com\nshuinfo.com\nshuini.biz\nshuionland.com\nshuipingce.com\nshuipo.com\nshuisj.com\nshuitexxkj.com\nshuitou001.com\nshuiwushi.com\nshuiwushi.net\nshuixin.tech\nshuiyaohuo.com\nshuiye.cc\nshuiyinbao.com\nshuiyinwang.com\nshuiyinyu.com\nshuiyinyun.com\nshuiyoucam.com\nshuiyugame.com\nshuiyuwenquan.com\nshuizhi360.com\nshuizhifenxi.com\nshuizhili.com\nshuizilong.com\nshujiangweike.com\nshujiariji.com\nshujike.com\nshuju.net\nshujuapi.com\nshujuba.net\nshujubang.com\nshujubo.com\nshujujishi.com\nshujulin.com\nshujutang.com\nshujuwa.net\nshujuxian1688.com\nshukeba.com\nshukebox.com\nshukeju.com\nshukemobile.com\nshukingfashion.com\nshukoe.com\nshukongwang.com\nshuku99.com\nshukuai.com\nshukuai.net\nshukuai3.com\nshukuajing.com\nshukuge.com\nshukun.press\nshukwai.com\nshulanapp.com\nshulanedu.com\nshulanhealth.com\nshulb.com\nshulex-voc.com\nshuliangtec.com\nshulidata.com\nshuling.vip\nshulink.com\nshuliyun.com\nshuma7.com\nshumaidata.com\nshumayin.com\nshumazhaopian.com\nshumeipai.net\nshumenol.com\nshumensy.com\nshumiao.com\nshumiimg.com\nshumilou.org\nshumo.com\nshun176.com\nshunanholding.com\nshunbangsaifu.com\nshunchangzhixing.com\nshunchaojinshu.com\nshuncom.com\nshundaoyun.com\nshunde-marathon.com\nshundecity.com\nshundehr.com\nshundeplus.com\nshunderen.com\nshunfalighting.com\nshunfangw.com\nshunfeng.cc\nshunguang.com\nshunhaiwang.com\nshunhejieshui.com\nshunhengkn.com\nshunhongny.com\nshunhualithium.com\nshunhuishou.com\nshunjing.xin\nshunjunys.com\nshunlitm.com\nshunmi.com\nshunnengnet.com\nshunnengoil.com\nshunqi.com\nshunscom.com\nshunshikj.com\nshunshunliuxue.com\nshuntian.cc\nshuntongtong.com\nshunwang.com\nshunwoit.com\nshunyagroup.com\nshunygroup.com\nshunyoubio.com\nshunyuwater.com\nshuoba.com\nshuoba.me\nshuoba.org\nshuobao.com\nshuobozhaopin.com\nshuocdn.com\nshuodedui.com\nshuoedu.com\nshuofangw.com\nshuohong.net\nshuoji1688.com\nshuojuchaxu.com\nshuoman.com\nshuomingshuku.com\nshuoniu.cc\nshuoshuojie.net\nshuoshuojuzi.com\nshuoshuokong.com\nshuoshuokong.org\nshuoshuomi.com\nshuoshuoxinqing.com\nshuowan.com\nshuozhiwu.com\nshupackaging.com\nshupaiyun.com\nshupeng.com\nshuqi.com\nshuqiandiqiu.com\nshuqiaozt.com\nshuqiapi.com\nshuqiread.com\nshuqireader.com\nshuquge.com\nshuquge.la\nshuquta.com\nshuquxs.com\nshuquzw.la\nshuren100.com\nshushangai.com\nshushangyun.com\nshushihome.com\nshushindo.com\nshushubuyue.com\nshushubuyue.net\nshusw.com\nshutcm.com\nshuti.com\nshutong1680.com\nshutong5858.com\nshutonginfo.com\nshutu.cc\nshutwin.com\nshuwangxing.com\nshuwenxianyun.com\nshuwulou.com\nshuxiangmenhu.com\nshuxiangmuye.com\nshuxiayun.com\nshuxinsp.com\nshuxinyc.com\nshuxuehua.com\nshuxuejia.com\nshuxuejingwei.com\nshuxuet.com\nshuxueweb.com\nshuxueyingyong.com\nshuya-china.com\nshuyan-biotech.com\nshuyang.tv\nshuyangba.com\nshuye.com\nshuyeedu.com\nshuyeidc.com\nshuyfdc.com\nshuyong.net\nshuyuanchina.org\nshuyuewu.co\nshuyun.com\nshuzhi9.com\nshuzhiduo.com\nshuzhou.cc\nshuzibao.com\nshuzifuyu.com\nshuzigd.com\nshuzigonggao.com\nshuziguanxing.com\nshuzijihuo.com\nshuzisharing.com\nshuzixiaoyuan.com\nshuzixindong.com\nshuziyuedong.com\nshuzong.com\nshwbs.org\nshwdbjgs.com\nshwdir.com\nshwebspace.com\nshweiqi.org\nshwexpo.com\nshwhl.com\nshwilling.com\nshwkwai.com\nshwoody.com\nshwpbbs.com\nshwpg.com\nshws.org\nshwsfy.com\nshwsg.net\nshwszdh.com\nshwtqx.com\nshwuji.com\nshwx.com\nshwxzf-tencentclb.cloud\nshwxzf-tencentclb.com\nshwxzf-tencentclb.net\nshwxzf-tencentclb.work\nshwxzfjpyzc-tencentclb.cloud\nshwxzfjpyzc-tencentclb.com\nshwxzfjpyzc-tencentclb.net\nshwxzfjpyzc-tencentclb.work\nshwyky.net\nshwzjt.com\nshwzoo.com\nshwzsh.com\nshxaby.com\nshxayy.com\nshxbe.com\nshxcj.com\nshxcoal.com\nshxdnt.com\nshxgroup.net\nshxiaoran.com\nshxibank.com\nshxichina.com\nshxil.com\nshxinbodi.com\nshxincn.com\nshxinhua.net\nshxinping.net\nshxjkjt.com\nshxjycqxx.com\nshxkyy.com\nshxlpe.com\nshxmbzcl.com\nshxmhjs.com\nshxnetwork.com\nshxrcw.com\nshxrmtzx.com\nshxrmyy.com\nshxseer.com\nshxsj.com\nshxsjedu.com\nshxuanming.net\nshxuou.com\nshxwcb.com\nshxxyun.com\nshxy.net\nshxyou.com\nshyahs.com\nshyanke.com\nshyanpu.com\nshyaoxu.com\nshyclouds.net\nshycqf.com\nshydjscl.com\nshydxsy.com\nshyestar.com\nshyfci.com\nshygdz.com\nshyhgj.com\nshyhhema.com\nshyihuoh.com\nshyingt.asia\nshyirijian.com\nshyisai.com\nshykx.com\nshykz123456.com\nshylwlkj.com\nshymhk.com\nshyndec.com\nshyongci.com\nshyongwo.com\nshyongzeng.com\nshyouai.com\nshyoudao.com\nshyouhuan.com\nshyouth.net\nshypzx.com\nshyrcb.com\nshyrcw.com\nshyrcw.net\nshyrjt.com\nshysjt.com\nshyuanye.com\nshyueai.com\nshyueyanghospital.com\nshyuhuankj.com\nshyumin.net\nshyuwl.com\nshyuzhai.com\nshywly.com\nshyx-bio.com\nshyxhy.com\nshyxi5.com\nshyxwz.com\nshyy6688.com\nshyygh.com\nshyyp.net\nshyywz.com\nshyyy.com\nshyyyl.com\nshyz07.com\nshyzj.com\nshyzjsxh.com\nshyzsd.com\nshzaiguan.com\nshzbc.com\nshzbh.com\nshzbkj.com\nshzch12333.com\nshzf.com\nshzfsy.com\nshzfzz.net\nshzgauto.com\nshzgd.org\nshzgt56.com\nshzh.net\nshzhanling.com\nshzhanmeng.com\nshzhiyingedu.com\nshzhongru.com\nshzhuran.com\nshzhyx.com\nshziyi.com\nshzjy.com\nshzkb.com\nshzkbc.com\nshzkbj.com\nshzkie.com\nshzkvalve.com\nshzkw.org\nshzm.org\nshzq.com\nshzrx.com\nshzs2013.com\nshzsgroup.com\nshzsun.com\nshzuibaichi.com\nshzunma.com\nshzxkq.com\nshzychem.com\nshzymp.com\nshzytzj.com\nshzyw.com\nshzzks.com\nsi-bao.com\nsi-en.com\nsi-era.com\nsi-in.com\nsi-win.com\nsi.cdn.dell.com\nsia1995.net\nsiad-c.com\nsiaedu.net\nsialiagames.com.tw\nsiam.org\nsian.cc\nsiaoao.com\nsias-sha.com\nsiasun.com\nsiasuncare.com\nsibangde.com\nsibfi.com\nsibida.net\nsibinwave.com\nsibojin.com\nsibpt.com\nsibsnet.org\nsibuzyn.com\nsic8d.net\nsicarrier.com\nsicc.cc\nsicent.com\nsicheng.net\nsicher-elevator.com\nsichuan163.com\nsichuanair.com\nsichuanbh.com\nsichuanbojiesports.com\nsichuancancer.org\nsichuangwy.org\nsichuannpo.com\nsichuanyunzhan.com\nsichw.com\nsiciciyu.com\nsicimano.com\nsickcn.com\nsicosemi.com\nsicreat.com\nsid.cc\nsidande.com\nsidike.com\nsidlgroup.com\nsidri.com\nsidvc.com\nsiec-ccpit.com\nsiengine.com\nsienwater.com\nsieredu.com\nsieryun.com\nsif.com\nsifalu.com\nsifang123.com\nsifangbazhu.tech\nsifangclub.com\nsifanggroup.com\nsifangoa.com\nsifangvideo.com\nsifary.com\nsifayun.com\nsiff.com\nsifky.com\nsifou.com\nsig-am.com\nsigachem.com\nsigas-group.com\nsigchina.com\nsightp.com\nsiglent.com\nsiglff.com\nsigma.run\nsigmachip.com\nsigmamed.net\nsigmastarsemi.com\nsigmcdn.com\nsigmoblive.com\nsign-say.com\nsignage911.com\nsigncc.com\nsigndo.com\nsigninpod.com\nsigujian.com\nsihai-inc.com\nsihaidj.com\nsihaigongkao.com\nsihaishuyuan.com\nsihaitv.com\nsiheal.com\nsihociho.com\nsihonghui.com\nsihongjob.com\nsihongxian.com\nsihoo.com\nsihotels.com\nsihuanpharm.com\nsihui-electric.com\nsihuisoft.com\nsihuixiqu.com\nsihuiyiliao.com\nsihuizhongyi.com\nsiia-sh.com\nsiicenv-wuhan.com\nsiicfl.com\nsiicshc.com\nsiii.xyz\nsiilu.com\nsiixu.com\nsijiaomao.com\nsijijun.com\nsijinchuanbo.com\nsijiwater.com\nsijiweinong.com\nsikantech.com\nsikem.net\nsikiedu.com\nsikuwu.com\nsikuyi5838.asia\nsikuyun.net\nsilanggame.com\nsilasbuchanan.shop\nsildyn.com\nsileadinc.com\nsilenceper.com\nsilexmicro.com\nsilianmall.com\nsiliansensor.com\nsiliantecai.com\nsiliaobaba.com\nsiliaokelijixie.com\nsilicon-magic.com\nsilicongo.com\nsiliconvisionlabs.com\nsilikron.com\nsilinchen.com\nsiling.com\nsilingge.com\nsilique.com\nsilkpresent.com\nsilkroad-ec.com\nsilkroad24.com\nsilkroadtechnologies.com\nsilkroddream.com\nsilktrek.com\nsillumin.com\nsillydong.com\nsiloon.com\nsilucar.com\nsilucg.com\nsiludao.com\nsiluecai.com\nsiluke.cc\nsiluke.info\nsilukex.com\nsiluwu.com\nsilvmark.store\nsim800.com\nsimaek.com\nsimagic.com\nsimaguo.com\nsimanuo.com\nsimat-sh.com\nsimbajs.com\nsimcere.com\nsimcgroup.com\nsimchip.com\nsimcolux.com\nsimcom.com\nsimcomm2m.com\nsimcu.com\nsimei.cc\nsimei.vip\nsimei8.com\nsimengqifu.com\nsimglo.com\nsimhaoka.com\nsimiam.com\nsimici3.com\nsimicloud.com\nsimij.com\nsimiki.org\nsimingkuai.com\nsimingtang.com\nsimkeway.com\nsimmtime.com\nsimochina.com\nsimon96.online\nsimope.com\nsimp.red\nsimperfect.com\nsimplecreator.net\nsimpledatas.com\nsimplexue.com\nsimpread.pro\nsimsci.net\nsimu-tech.com\nsimu800.com\nsimul-china.com\nsimullink.com\nsimulway.com\nsimuwang.com\nsimwe.com\nsimxhs.com\nsin-jiang-law.com\nsin0sites.com\nsina-cf.com\nsina.com\nsina.lt\nsina.net\nsinaapp.com\nsinacdn.com\nsinacloud.com\nsinacloud.net\nsinadaxue.com\nsinaedge.com\nsinaemc.com\nsinaft.com\nsinaimg.com\nsinajs.com\nsinalog.com\nsinaluming.com\nsinan.fun\nsinanet.com\nsinanode.com\nsinanya.com\nsinaquyong.com\nsinas3.com\nsinas3.net\nsinashow.com\nsinastorage.com\nsinasws.com\nsinauda.com\nsinawf.com\nsinbam.com\nsincerelyone.com\nsincetech.com\nsincetimes.com\nsinct.com\nsindsun.com\nsinepharm.com\nsinereal.com\nsinesafe.com\nsinesemi.com\nsineva-robot.com\nsineva.com\nsinf-test.net\nsinf.net\nsinflb.net\nsinforcon.com\nsinfotek.com\nsingaporepaya.com\nsingbon.com\nsingchy.com\nsingdown.com\nsingfosolar.com\nsingfun.com\nsinggnetworkcdn.com\nsinghead.com\nsinglecool.com\nsinglegraindatabiz.com\nsingmaan.com\nsingoo.cc\nsingpao.com\nsingse.com\nsingsun.net\nsingtaonet.com\nsingtown.com\nsingularity-ai.com\nsingularmedical.net\nsingulato.com\nsingworld.net\nsinictek.com\nsinitek.com\nsinldo.com\nsinlu.net\nsino-agri.com\nsino-composite.com\nsino-corrugated.com\nsino-cr.com\nsino-customs.com\nsino-epa.com\nsino-foldingcarton.com\nsino-gps.com\nsino-heavymach.com\nsino-info.net\nsino-life.com\nsino-manager.com\nsino-pharm.com\nsino-pigment.com\nsino-sfcc.com\nsino-tcm.com\nsino-trading.com\nsino-training.com\nsino-web.net\nsinoagentsh.com\nsinoancher.com\nsinoaqr.com\nsinoaquafilter.com\nsinoassist.com\nsinoassistance.com\nsinobaron.com\nsinobasalt.com\nsinobasedm.com\nsinobel.com\nsinobestbio.com\nsinobo.com\nsinobp.com\nsinobrook.com\nsinocache.net\nsinocare.com\nsinocars.com\nsinocax.com\nsinochem-guangdong.com\nsinochem-zhfl.com\nsinochem.com\nsinochemb2c.com\nsinochemehc.com\nsinochemintl.com\nsinochemitc.com\nsinochemjiangsu.com\nsinochemoilmarketing.com\nsinochempharma.com\nsinochip.net\nsinoclick.com\nsinocoalchem.com\nsinocopy.com\nsinodh.com\nsinodingcheng.com\nsinodis.com\nsinodrive.com\nsinoec.net\nsinoevin.com\nsinofarm.net\nsinofo.com\nsinofo.group\nsinofusite.com\nsinog2c.com\nsinogeo.com\nsinoglorygroup.com\nsinogslb.com\nsinogslb.net\nsinogt.com\nsinohb.com\nsinohotel.com\nsinohowe.com\nsinohsc.com\nsinohx.com\nsinohydro.com\nsinoid.com\nsinoinfosec.com\nsinoing.net\nsinoinnovel.com\nsinoins.com\nsinointeractive.com\nsinoiov.com\nsinokap.com\nsinolease.com\nsinolinchem.com\nsinolinchemintl.com\nsinolines.com\nsinolion.net\nsinologyinstitute.com\nsinolub.com\nsinolube.com\nsinoluhong.com\nsinoma-suzhou.com\nsinomach-auto.com\nsinomachint.com\nsinomags.com\nsinomapping.com\nsinomaps.com\nsinomatech.com\nsinomatin.com\nsinomcu.com\nsinomep.com\nsinonet.org\nsinonsh.com\nsinontech.com\nsinoo.cc\nsinooceangroup.com\nsinooceanland.com\nsinopatho.com\nsinopec-usa.com\nsinopec.com\nsinopecgroup.com\nsinopecgx.com\nsinopechyzx.com\nsinopecnews.com\nsinopecpay.com\nsinopecsales.com\nsinopecsenmeifj.com\nsinopharm-fj.com\nsinopharm-fl.com\nsinopharm-gz.com\nsinopharm-henan.com\nsinopharm.com\nsinopharmdbj.com\nsinopharmholding.com\nsinopharmhospital.com\nsinopharmintl.com\nsinopharmlrt.com\nsinopharmsx.com\nsinopharmzl.com\nsinophex.com\nsinopipevalve.com\nsinopont.com\nsinopr.org\nsinoprinterparts.com\nsinoqy.com\nsinorda.com\nsinoreagent.com\nsinort.com\nsinorusfocus.com\nsinorussian21st.org\nsinosam.com\nsinoshan.com\nsinosig.com\nsinosilica.com\nsinosms.com\nsinoss.com\nsinoss.net\nsinostargroup.com\nsinosteel.com\nsinosun.com\nsinosuntop.com\nsinotau.com\nsinotechline.com\nsinotf.com\nsinotide.com\nsinotn.com\nsinotone.net\nsinotph.com\nsinotrans.com\nsinotruk.com\nsinotrukinternational.com\nsinotrust-group.com\nsinoturning.com\nsinovale.com\nsinovast.com\nsinovatech.com\nsinovatio.com\nsinovationmed.com\nsinovationventures.com\nsinovel.com\nsinovoice.com\nsinowaycarbon.com\nsinowbs.com\nsinowbs.org\nsinowealth.com\nsinowealth.com.hk\nsinowel.com\nsinowheelbarrow.com\nsinowinfiber.com\nsinoxk.com\nsinoxlube.com\nsinozhongyuan.com\nsinozoc-ex.com\nsinreweb.com\nsinrey.com\nsinro.com\nsinsam.com\nsinsche.com\nsintaho.com\nsintaytour.com\nsintien.com\nsintoacct.com\nsintu.com\nsinture.com\nsinvofund.com\nsinvta.com\nsinyoung.site\nsinyuan.com\nsinyuee.com\nsinzk.com\nsiobp.com\nsiomxity.com\nsiomxity.net\nsiozqkt.com\nsipai.com\nsipaphoto.com\nsipatsaw.com\nsipcdc.com\nsipco.com\nsipedu.net\nsipedu.org\nsipeed.com\nsipgl-lcl.com\nsipgzct.com\nsiphrd.com\nsipingseo.com\nsipmsg.com\nsipo-sc.com\nsiposchina.com\nsipprh.com\nsipsenegal.org\nsipujy.com\nsipurd.com\nsiqiangame.com\nsiqiquan.org\nsiqxmg4256.vip\nsir3.com\nsir66.com\nsiranbio.com\nsireda.com\nsirenyouxiang.com\nsirfang.com\nsirweara.com\nsiryin.com\nsiscantech.com\nsiscmag.com\nsisder.com\nsisdown.com\nsisen.com\nsisensing.com\nsishui123.com\nsishuojixie.com\nsishuok.com\nsishuxuefu.com\nsisi-smu.org\nsisigad.com\nsisijiyi.com\nsisp-china.com\nsissiok.com\nsisuts.com\nsiswin.com\nsitande.com\nsitangtech.com\nsitc.com\nsite-digger.com\nsite119.com\nsiteapp-static.com\nsitejiu.com\nsitekc.com\nsiteonlinetest.com\nsithc.com\nsitiaoyu.com\nsitobiotech.com\nsitong.net\nsitongedu.org\nsitongzixun.com\nsitrigroup.com\nsitronics-sh.com\nsituationk.com\nsitudata.com\nsiud.com\nsivlab.com\nsiwaman.com\nsiweidaotu.com\nsiweiearth.com\nsiweikongjian.net\nsiweiw.com\nsiwuprint.com\nsix.club\nsixflower.com\nsixianchina.com\nsixiang.im\nsixianggangyin.com\nsixiju.com\nsixjoy.com\nsixstaredu.com\nsixu.life\nsixue.tech\nsixuexiazai.com\nsixunited.com\nsixyin.com\nsiyanhui.com\nsiyetian.com\nsiyi007.com\nsiyrcw.com\nsiyuan.cc\nsiyuan.me\nsiyuanedu.com\nsiyuanren.com\nsiyuanyl.com\nsiyuhome.net\nsiyunyatwo.com\nsiyuweb.com\nsizebid.com\nsizeofvoid.net\nsizhicn.com\nsizuo.com\nsj-airpurge.com\nsj-hospital.org\nsj-lawyer.com\nsj-marathon.com\nsj-tmdi.com\nsj0763.com\nsj123.com\nsj33.net\nsj3g.com\nsj51.net\nsj6rgxtjg3tmb.com\nsj998.com\nsjawards.com\nsjaz.com\nsjbutton.com\nsjbyj.com\nsjcamzone.cc\nsjcomic.com\nsjcybz.com\nsjdongwang.com\nsjdshd.com\nsjdzp.com\nsjdzp.net\nsjebh.com\nsjetdz.com\nsjf029.com\nsjfcdn.com\nsjfh168.com\nsjfpro.com\nsjfzxm.com\nsjg8.com\nsjgle.com\nsjgo365.com\nsjgskaipiao.com\nsjhcip.com\nsjhfkhgut009.com\nsjhfrj.com\nsjhgo.com\nsjhl.cc\nsjhoffice.com\nsjhong.net\nsjhuatong.com\nsjhy.net\nsjhykt.com\nsjizx.com\nsjjob88.com\nsjjt001.com\nsjjzm.com\nsjkj.net\nsjlbearing.com\nsjlexpress.com\nsjlgc.com\nsjlhlawyer.com\nsjlvyou.com\nsjm-zdh.com\nsjm.life\nsjmao.net\nsjmdh.com\nsjmeigao.com\nsjmp3.com\nsjmwsw.com\nsjono.com\nsjooo.com\nsjpif.net\nsjpjyx.com\nsjq315.com\nsjqcj.com\nsjqmtlm.com\nsjrwzz.com\nsjsbk.com\nsjsei.com\nsjsgdzx.com\nsjsheji.com\nsjsrm.com\nsjsydq.com\nsjszt.com\nsjtickettech.com\nsjtm.me\nsjtug.org\nsjtusummer.org\nsjtxt.com\nsjtxt.la\nsjtype.com\nsjvi.net\nsjwec-tencentclb.cloud\nsjwec-tencentclb.com\nsjwec-tencentclb.net\nsjwec-tencentclb.work\nsjwj.com\nsjwl.xyz\nsjwt.net\nsjwtlm.com\nsjwx.info\nsjwyx.com\nsjxinxiwang.com\nsjxqn.com\nsjxs.la\nsjxtcw.com\nsjxydc.com\nsjxyit.com\nsjxysec.com\nsjxyx.com\nsjxzc.com\nsjy-art.org\nsjy2.com\nsjycbl.com\nsjyhotel.com\nsjyl.com\nsjysz.com\nsjyt.net\nsjytech.com\nsjyx.com\nsjyybz.com\nsjyyt.com\nsjyyy.com\nsjz-marathon.com\nsjz.cc\nsjz110.cc\nsjz44z.com\nsjz7.com\nsjzbasha.com\nsjzbwx.com\nsjzcfjd.com\nsjzcmw.com\nsjzez.com\nsjzfeitai.com\nsjzfls.com\nsjzgxwl.com\nsjzhr.com\nsjzhushou.com\nsjzjifeng.com\nsjzjinliulin.com\nsjzjkqgs.com\nsjzjtjt.com\nsjzkz.com\nsjzlg.com\nsjzlgz.com\nsjzmama.com\nsjznuanjieks.com\nsjzonline.com\nsjzpco.org\nsjzqcrl.com\nsjzrbapp.com\nsjzrmyz.com\nsjzshunbang.com\nsjzslnyhy.com\nsjzswtz.com\nsjzszz.com\nsjztd.com\nsjzthdz.com\nsjzxfy.com\nsjzxh.com\nsjzxtsh.com\nsjzxyy.com\nsjzyb.com\nsjzyes.com\nsjzys.com\nsjzysdz.com\nsjzysgz.com\nsjzyxh.com\nsjzyz.net\nsjzzbxh.com\nsjzzxmm.com\nsjzzyy.com\nsk163.com\nsk1999.com\nsk1z.com\nsk2w.net\nskatehere.com\nskcto.com\nskd6.com\nskd62.com\nskdj5.com\nskdlabs.com\nske.cc\nskeo.net\nsketchcn.com\nsketchupbar.com\nsketchupbbs.com\nskf-bearing.net\nskg.com\nskhb.com\nskidstorm.com\nskieer.com\nskimit.net\nskinjc.com\nskinme.cc\nskinpp.com\nskip-links.com\nskjcsc.com\nskl.net\nskland.com\nsklbce.org\nskldoor.com\nsklinux.com\nskmgc.com\nsknbj.com\nskomart.com\nskongmx.com\nskp-beijing.com\nskpssz.com\nskrskrskrskr.com\nsksdwl.com\nsksight.com\nskslfd.com\nskstravel.com\nskswz.com\nsktcdn.com\nsktecfibre.com\nsktfaker.com\nskuking.com\nskusoft.com\nskwfls.com\nskxox.com\nskxsj.com\nsky-deep.com\nsky-fire.com\nsky-ing.com\nsky-mobi.com\nsky123th.com\nsky1shop.com\nsky350.com\nskyai.tech\nskyallhere.com\nskyao.io\nskyapp1.tv\nskyard.com\nskyart.site\nskybility.com\nskybluek.com\nskybogroup.com\nskybright-group.com\nskycaiji.com\nskycedu.com\nskycham.com\nskycloudsoftware.com\nskycn.com\nskycn.net\nskycnc.com\nskycoleasing.com\nskycorp.com\nskydodi.com\nskydust.net\nskyeaglee.com\nskyecs.com\nskyee360.com\nskyfeather.online\nskyfollowsnow.pro\nskyfont.com\nskyfox.org\nskyhand.vip\nskyheng.com\nskyislets.com\nskyleon.com\nskylerzhang.com\nskymoons.com\nskymoons.net\nskymp4.cc\nskynan.com\nskynicecity.com\nskynj.com\nskype-china.net\nskype-tom.com\nskypixel.com\nskypuretech.com\nskyray-instrument.com\nskyray-water.com\nskyrelay-ic.com\nskyrichpower.com\nskyrivers.org\nskyrj.com\nskysea.com\nskysgame.com\nskysriver.com\nskysrt.com\nskyton123.com\nskyts.net\nskytv.cc\nskyue.com\nskyw.cc\nskywalkeryacht.com\nskywavewifi.com\nskywek.com\nskywellcorp.com\nskywldh.com\nskywork.ai\nskyworkcdn.com\nskyworth-ac.com\nskyworth-cloud.com\nskyworth-ea.com\nskyworth.com\nskyworthbox.com\nskyworthdigital.com\nskyworthdigitaliot.com\nskyworthds.com\nskyworthev.com\nskyworthiot.com\nskyworthlighting.com\nskyworthnj.com\nskyworthznxyj.com\nskyxinli.com\nskyyin.org\nskyzhan.com\nskznsb.com\nsl.al\nsl.fun\nsl.ink\nsl512.com\nsl916.com\nsl91d.com\nslaccas.com\nslagta.com\nslaidor.com\nslamtec.com\nslanissue.com\nslanmedia.com\nslatic.net\nslbauto.com\nslbiop.com\nslcad.com\nslchos.com\nslcyber.icu\nsldhc.com\nsldns1.com\nslduntong.com\nsle.group\nsleele.com\nsleepboy.com\nsleepwearinc.com\nslegetank.com\nslengy.com\nsleton.com\nslfwakuang.com\nslfwq.com\nslgegc.com\nslhwyy.com\nslicejobs.com\nslidestalk.com\nslingbearings.com\nslink8.com\nslinli.com\nsliun.com\nslive.ytn.co.kr\nslja2.com\nsljob88.com\nslk1.net\nslkg1949.com\nsllai.com\nsllngy.com\nsllssrq.com\nslodon.net\nsloer.com\nslofdoro.com\nslogra.com\nslot-china.com\nslot4.net\nslotb.vip\nslotph.vip\nslovakia-visacenter.com\nslovenia-visacenter.com\nslowdark.com\nslpi1.com\nslpm.net\nslpmg.com\nslrbs.com\nslreactor.com\nslready.com\nslshareservices.com\nslspcn.com\nslssx.com\nslsteel.com\nslswd.com\nslswx7.com\nsltg2019.com\nsltgj.com\nslthxx.com\nsltv.net\nsltxantonline.com\nsluyu.com\nslwh-dfh.com\nslwwedding.com\nslybjp.com\nslyld.com\nslyxmobi.com\nslzsxx.com\nslzww.com\nsm-check.com\nsm-cq.com\nsm-main.com\nsm.dell.com\nsm0.fun\nsm160.com\nsm160.net\nsm3s.com\nsm597.com\nsm96596.com\nsmall-master.com\nsmallfighter.com\nsmalljun.com\nsmallpdfer.com\nsmallyuan.com\nsmarch.com\nsmarchit.com\nsmart-hengdi.com\nsmart-idc.net\nsmart-ptt.com\nsmart-rise.com\nsmart.com\nsmart.uhdnow.com\nsmart2pay.com\nsmart365ol.com\nsmart400.com\nsmartautoclub.com\nsmartbgp.com\nsmartbunniemen.com\nsmartcar.zone\nsmartcarrace.com\nsmartchn.com\nsmartcity.team\nsmartcitysz.com\nsmartcloudcon.com\nsmartcom.cc\nsmartdeep.com\nsmartdeer.com\nsmartdeer.work\nsmartdot.com\nsmartedm.com\nsmarteredu.net\nsmartermicro.com\nsmartgaga.com\nsmarthey.com\nsmarthomecn.com\nsmarthuayan.com\nsmartisan.com\nsmartisanos.com\nsmartisantv.com\nsmartjoygames.com\nsmartlifein.com\nsmartlinkio.com\nsmartlinku.com\nsmartmapx.com\nsmartmidea.net\nsmartmore.com\nsmartoct.com\nsmartont.net\nsmartpigai.com\nsmartpoweriot.com\nsmartqilu.net\nsmartroomcn.com\nsmarts-isoftstone.com\nsmartsenstech.com\nsmartsteps.com\nsmartstudy.com\nsmarttaixing.com\nsmartwebee.com\nsmartx-cn.com\nsmartx.com\nsmartxiantao.com\nsmartyao.com\nsmartyoke.com\nsmartyun8.com\nsmartzzx.com\nsmarun.com\nsmaryun.com\nsmasmj.com\nsmb956101.com\nsmbc-cardzj0.club\nsmbinn.com\nsmbxw.com\nsmc18.com\nsmc3s.com\nsmcalia.com\nsmcalib.com\nsmcbnokkiduran.com\nsmcbnokkihabak.com\nsmcbnokkirederc.com\nsmcec.com\nsmcic.net\nsmcsrj.com\nsmd-automation.com\nsmd88.com\nsmdcn.net\nsmdiban.net\nsmdmark.com\nsmdx.net\nsmdxx.com\nsme-cn.com\nsme8718.com\nsmebb.com\nsmec-cn.com\nsmedi.com\nsmei.net\nsmeia.net\nsmeiic.com\nsmemo.info\nsmeok.com\nsmetumen.com\nsmf1888.com\nsmfsgs.com\nsmfyun.com\nsmgpt.com\nsmgstar.com\nsmgstv.com\nsmgtech.net\nsmhsw.com\nsmhyplay.com\nsmianao.com\nsmianet.com\nsmic-sh.com\nsmicc.com\nsmicrobe.com\nsmics.com\nsmil888.com\nsmile2012.com\nsmileangelfoundation.org\nsmilec.cc\nsmilefil.com\nsmileyan.com\nsmilingwhitebear.com\nsmithcn.com\nsmjstcy.com\nsmkeji.com\nsmkgc.com\nsmkmake.com\nsmknow.com\nsmkxyjy.com\nsmlaw8.com\nsmlqcl.com\nsmmc.com\nsmmiki.com\nsmo-clinplus.com\nsmo-software.com\nsmoba.net\nsmobird.cc\nsmogfly.cloud\nsmogfly.club\nsmogfly.com\nsmogfly.net\nsmogflycloud.com\nsmogflycloud.net\nsmohan.net\nsmoothgroup.cc\nsmoreroll.com\nsmovie168.com\nsmowo.com\nsmpg888.com\nsmppw.com\nsmq.ltd\nsmqh.com\nsmrmyy.com\nsms.imagetasks.com\nsms18.com\nsms9.net\nsmsbao.com\nsmshos.com\nsmshx.com\nsmskb.com\nsmslk1.com\nsmslk2.com\nsmslkcoffee.com\nsmsot.com\nsmsvifv.com\nsmswgy.com\nsmswriter.com\nsmsyun.cc\nsmt-dip.com\nsmt.net\nsmt2000.com\nsmtcdn.com\nsmtcdns.com\nsmtcdns.net\nsmtchinamag.com\nsmtcl.com\nsmtdc.com\nsmtdwx.com\nsmthome.net\nsmtphub.org\nsmtro.com\nsmtsmt.com\nsmtso.com\nsmtsvs.com\nsmttouch.com\nsmtukuzy.com\nsmtul.com\nsmtvip.com\nsmtw.com\nsmtworld.com\nsmudc.com\nsmuszh.com\nsmuszsh.com\nsmvip8.com\nsmwd.tech\nsmxdiy.com\nsmxgjj.com\nsmxin.com\nsmxr.com\nsmxrcw.net\nsmxs.com\nsmxyi.com\nsmxzls.com\nsmyfinancial.com\nsmyhvae.com\nsmynn.com\nsmyx.net\nsmyxxj.com\nsmyyhj.com\nsmyz.net\nsmzdm.com\nsmzdmimg.com\nsmzdwan.com\nsmzhongran.com\nsmzjy.cc\nsmzrmyy.com\nsmzsffb.com\nsmzy.com\nsn-epe.com\nsn12333.com\nsn180.com\nsn511.com\nsnack-show.com\nsnai.edu\nsnail.com\nsnail007.com\nsnailgame.net\nsnailovet.com\nsnailsleep.net\nsnailyun.com\nsnap-buy.com\nsnapany.com\nsnapdrop.net\nsnapemoji.net\nsnapgenshin.com\nsnaplabdevelop.com\nsnapp.ir\nsnapp.site\nsnapp.taxi\nsnappcloud.io\nsnappea.com\nsnapplay.com\nsnappmaps.ir\nsnaptube.app\nsnbcnyjt.com\nsnbiopharm.com\nsnbkf34.com\nsncoda.com\nsnctaa.com\nsnd-cia.com\nsnd-stig.com\nsnd-yy.com\nsnda.com\nsndcc.cc\nsndgroup.com\nsndhr.com\nsndks.com\nsndnt.com\nsndo.com\nsndvc.com\nsndzrg0.org\nsneac.com\nsneb3.com\nsnedu.com\nsneducloud.com\nsneia.org\nsnfic.com\nsnfox.com\nsnfzsw.com\nsngct.com\nsnh48.com\nsnhere.com\nsnhrm.com\nsnibe.com\nsniec.net\nsnieri.com\nsnimay.com\nsniuw.com\nsnjairport.com\nsnjbs.com\nsnjjiu.com\nsnjt.com\nsnkjol.com\nsnkshoe.com\nsnkyat.com\nsnltty.com\nsnlxgk.com\nsnmandarin.com\nsnmi.com\nsnmxzls.com\nsnoba.net\nsnobten.com\nsnodehome.com\nsnoone.com\nsnor-china.com\nsnowballfinance.com\nsnowballsecurities.com\nsnowballtech.com\nsnowbeasts.com\nsnowdream.tech\nsnowflake.pink\nsnowkey.com\nsnowlotusgroup.com\nsnowyimall.com\nsnp.cdn.dell.com\nsnpac.com\nsnpi.dell.com\nsnps.tech\nsnptc.com\nsnrat.com\nsnren.com\nsnrtv.com\nsnrunning.com\nsns-china.com\nsnscz.com\nsnsfun.cc\nsnsfun.com\nsnsii.com\nsnsnb.com\nsnsqw.com\nsnsyhg.com\nsnsyx.com\nsntba.com\nsnto.com\nsnupg.com\nsnv1.com\nsnwx.com\nsnxw.com\nsnycloud.com\nsnynas.com\nsnzhao.com\nsnzhny.com\nsnzsxh.com\nso.car\nso.com\nso03290koaq.com\nso03300koaq.com\nso04060koaq.com\nso04061koaq.com\nso123.com\nso126.com\nso50.com\nso666gslb.com\nso8848.com\nsoapphoto.com\nsoar-chem.com\nsoargift.com\nsoarwatch.com\nsoaryoof.com\nsoauto.com\nsobaidupan.com\nsobereva.com\nsobeycache.com\nsobeycloud.com\nsobeylingyun.com\nsobeylive.com\nsobili.com\nsobone.com\nsobot.com\nsobot.io\nsoboten.com\nsobute.com\nsocang.com\nsocay.com\nsoccerbar.cc\nsocchina.net\nsoche8.com\nsochengyi.com\nsochips.com\nsocialark.net\nsocialbasecustomercontent.com\nsocialbaseusercontent.com\nsocialbeta.com\nsocialjia.com\nsocialpls.com\nsocket.tw\nsocolar.com\nsocomic.com\nsocool-tech.com\nsocoologo.com\nsocotton.com\nsocpk.com\nsodajs.org\nsodalife.xyz\nsodamc.com\nsodao.com\nsodasoccer.com\nsodayang.com\nsodc8.com\nsodexo-cn.com\nsodig.com\nsodino.com\nsodion.net\nsodocloud.com\nsody123.com\nsoeasysdk.com\nsoeo.net\nsofa-webbing.com\nsofabiao.com\nsofan.one\nsofang.com\nsofangche.com\nsofasofa.io\nsofastack.tech\nsofeiya.net\nsofi-tech.com\nsofoo.com\nsofreight.com\nsoft128.com\nsoft2005.com\nsoft50.com\nsoft5566.com\nsoft568.com\nsoft6.com\nsoft778.com\nsoft8.net\nsoft808.com\nsoft8899.com\nsoftabc.com\nsoftbank.best\nsoftbanks.net\nsoftbar.com\nsoftbingo.net\nsoftdownd.com\nsoftgostop.com\nsofthome.cc\nsoftjinzhou.com\nsoftmall.net\nsoftrobottech.com\nsoftscdn.com\nsoftsz.com\nsofttest.com\nsoftware.download.prss.microsoft.com\nsoftwarechn.com\nsoftwarecn.com\nsoftweek.net\nsoftwhy.com\nsoftwincn.com\nsoftworker.com\nsofujinyu.com\nsofun.com\nsogaa.net\nsogalqd.com\nsogaokao.com\nsogeche.com\nsogo.com\nsogoke.com\nsogood360.com\nsogou-compress.com\nsogou-diskmgr.com\nsogou-inc.com\nsogou-inner.com\nsogou-kantu-pic.com\nsogou-kantu.com\nsogou-op.org\nsogou-pdf.com\nsogou-wallpaper.com\nsogou.com\nsogou.net\nsogoucdn.com\nsogoucdndl.com\nsogouimecdn.com\nsogowan.com\nsogw.cc\nsoharp.com\nsohfvx3149.vip\nsoho-yiming.com\nsoho3q.com\nsohoblink.com\nsohochina.com\nsohodd.com\nsohonow.com\nsohotask.com\nsohu-inc.com\nsohu.com\nsohu.net\nsohuapps.com\nsohucao.duapp.com\nsohucs.com\nsohuhistory.com\nsohuiw.com\nsohumail.com\nsohunjug.com\nsohuns.com\nsohuora.com\nsohurdc.com\nsohusce.com\nsohuu.com\nsoicp.com\nsojex.net\nsojiang.com\nsojiang.net\nsojianli.com\nsojixun.com\nsojiyin.com\nsojoline.com\nsojson.com\nsojump.com\nsoke17.com\nsoken-sz.com\nsokoban.ws\nsokon.com\nsoku.com\nsokuba.com\nsokutu.com\nsokyotw.com\nsolaking.com\nsolanyun.com\nsolar-engine.com\nsolarbao.com\nsolarbe.com\nsolarbio.com\nsolarcare.com\nsolarchin.com\nsolareast.com\nsolarf.net\nsolaridc.com\nsolarspace.com\nsolarzoom.com\nsolasmat.com\nsoldeazy.com\nsoldierstory-toys.com\nsolelybio.com\nsolepic.com\nsoletower.com\nsoliao.com\nsolidifyk.com\nsolidigm-asdf.com\nsolidigm-nvme.com\nsolidigm-zxcv.com\nsolidot.org\nsolidstatelion.com\nsoliner.com\nsolipharma.com\nsolo-launcher.com\nsolochex.com\nsoloknight.xyz\nsolomath.com\nsolooncontrols.com\nsolosea.com\nsolotoon.com\nsolove.design\nsolsticeorbit.cfd\nsolution9.net\nsolvyou.com\nsom88.net\nsomacisgraphic.hk\nsomama.com\nsomamobi.com\nsomd5.com\nsomdom.com\nsomeabcd.com\nsomenchina.com\nsomenmian.com\nsomething8.com\nsometracking.com\nsomo.so\nsomode.com\nsomsds.com\nsonbest.com\nsoncci.com\nsongcn.com\nsongcwh.com\nsongduwuye.com\nsongguike.com\nsongguo.com\nsongguo7.com\nsongguobox.com\nsongguojiankang.com\nsonghaifeng.com\nsonghaoyun.com\nsonghaozhi.com\nsonghengnet.com\nsonghualan.com\nsonghuwan.com\nsongjiangjituan.com\nsongker.com\nsonglei.net\nsonglicnc.com\nsongma.com\nsongmaogroup.com\nsongmiao.net\nsongqinnet.com\nsongshanlab.com\nsongshitang.com\nsongshizhao.com\nsongshuai.com\nsongshudiandian.com\nsongshuhui.net\nsongshujiedan.com\nsongshushuo.com\nsongshuyouxi.com\nsongsongruanwen.com\nsongsongyingxiao.com\nsongsongyun.com\nsongtaox.com\nsongtasty.com\nsongtianlube.com\nsongtsam.com\nsongwang168.com\nsongxiaocai.com\nsongxiaojin.com\nsongxing.net\nsongyang.net\nsongyangcn.com\nsongyanjiaye.com\nsongyi.net\nsongyongzhi.com\nsongyuan163.com\nsongyuan58.com\nsongyuanlove.com\nsongyuanshuisi.com\nsongzhaopian.com\nsongzi100.com\nsongziren.com\nsongzixian.com\nsonhoo.com\nsonhoshin.com\nsonicmodel.net\nsonicrhino.cc\nsoniu.net\nsonkwo.com\nsonkwo.hk\nsonoscapebrasil.com\nsonoschina.com\nsontan.net\nsony.com\nsonybbs.com\nsonyentertainmentnetwork.com\nsonyong.com\nsonyselect.net\nsoo56.com\nsooal.com\nsooauto.com\nsoocang.com\nsoochowchem.com\nsoocor.com\nsoodao.com\nsooele.com\nsoofel.com\nsoogf.com\nsoogif.com\nsoohaid.com\nsoojs.com\nsooker.com\nsoolinen.com\nsoolou.net\nsoolun.com\nsoomal.com\nsoon.guru\nsoonku.net\nsoonv.com\nsoonwill.com\nsoonyo.com\nsooopu.com\nsooopu.org\nsoopat.com\nsoopay.net\nsooroo.com\nsooshong.com\nsooshu.net\nsoosmart.com\nsoosox.com\nsootmoor.com\nsootoo.com\nsootool.net\nsoovalve.com\nsoovvi.com\nsooxie.com\nsooxue.com\nsooyooj.com\nsoozhu.com\nsoozhuozhou.com\nsopaidea.com\nsophgo.com\nsophgo.vip\nsophnet.com\nsopic.org\nsopowcore.net\nsoq.com\nsoqicrm.com\nsoqqq.com\nsoquano.com\nsorftime.com\nsoripan.net\nsorswitch.com\nsortdoor.com\nsos919.com\nsosaf.com\nsosdx.com\nsosg.net\nsoship.com\nsoshoo.com\nsoso.com\nsosoba.org\nsosobtc.com\nsosoled.com\nsosolight.com\nsosomp.com\nsosonc.com\nsosonsk.com\nsosoo.net\nsosorank.com\nsososnap.com\nsososteel.com\nsosotec.com\nsosoyunpan.com\nsosoyy.com\nsosuo.name\nsosyao.com\nsotake.com\nsotemall.com\nsothink.com\nsotongwang.com\nsotouv.com\nsotoy.net\nsotu114.com\nsou-yun.com\nsou.com\nsouaiche.com\nsouajki.com\nsouajki.net\nsoubao.net\nsoucai.com\nsoucangjie.com\nsouche-fin.com\nsouche-inc.com\nsouche.com\nsoucod.com\nsoudao.com\nsoudoc.com\nsoudron.com\nsouduanzu.com\nsoueast-motor.com\nsouebao.com\nsoufair.com\nsoufang.com\nsoufang998.com\nsoufun.com\nsoufunimg.com\nsouge.cc\nsouget.com\nsougou.com\nsougu001.com\nsouha.net\nsouho.cc\nsouho.net\nsouiaico.com\nsouidc.com\nsouidc.org\nsoukecheng.net\nsoukuyou.com\nsoulapp.me\nsoulgame.mobi\nsoulsky.net\nsoulteary.com\nsoulu365.com\nsouluo.net\nsouluojie.com\nsouluopai.com\nsoulwonderland.com\nsound-force.com\nsoundai.info\nsoundconch.com\nsoundems.com\nsoundgroup.com\nsoundnybio.com\nsoundpeats.com\nsoundstay.com\nsoupan.info\nsoupf.net\nsoupin.com\nsoupingguo.com\nsoupu.com\nsoupv.com\nsouqian.com\nsouqiantu.com\nsouqiu8.com\nsour-lemon.com\nsource.tutorabc.com\nsource3g.com\nsourcecodebeat.com\nsourcecodecap.com\nsourcecodeserver.com\nsourcegcdn.com\nsourcelandchina.com\nsousea.com\nsoushai.com\nsousou.com\nsousou.pro\nsousoudus.com\nsousuoshidai.com\nsousuotu.com\nsouthbeauty.com\nsouthbeautygroup.com\nsouthchip.com\nsouthcn.com\nsouthei.com\nsouthernfund.com\nsouthernmindict.net\nsouthernpec.com\nsouthgis.com\nsouthmoney.com\nsouthnews.cc\nsouthnews.net\nsouthseagy.com\nsouthsurvey.com\nsouthyule.com\nsoutiyun.com\nsoutudi.so\nsoutushenqi.com\nsouvi.com\nsouvr.com\nsouwuxing.com\nsouxia.com\nsouxue8.com\nsouxuexiao.com\nsouxw.com\nsouya.com\nsouyidai.com\nsouyue.mobi\nsouyue.vip\nsouyunku.com\nsouyute.com\nsouziti.com\nsov2ex.com\nsovell.com\nsoven.com\nsowang.com\nsoweather.com\nsowellwell.com\nsowin.com\nsowotech.com\nsowu.com\nsoxpai.com\nsoxyc.com\nsoya-protein.com\nsoyim.com\nsoyixia.net\nsoyiyuan.com\nsoyjg.com\nsoyo-dg.com\nsoyohui.com\nsoyoung.com\nsoyouso.com\nsoyunion.com\nsoyx123.com\nsozdata.com\nsozhe.com\nsozhen.com\nsozyb.com\nsp.cc\nsp168.com\nsp588.cc\nsp588.net\nsp888.net\nsp910.com\nspace1688.com\nspacechina.com\nspaceestar.com\nspacei.net\nspacemit.com\nspacesystech.com\nspacety.com\nspamc.com\nspanishknow.com\nsparenode.com\nspark-page.com\nspark-page0.com\nspark-page1.com\nspark-page2.com\nspark-page3.com\nspark-page4.com\nspark-page5.com\nspark-page6.com\nspark-page7.com\nspark-page8.com\nspark-page9.com\nspark4y.com\nsparkdeep.com\nsparkeduapi.com\nsparkeducdn.com\nsparkgis.com\nsparkletour.com\nspasvo.com\nspawor.com\nspay365.com\nspbao.com\nspbo.com\nspbycdn.biz\nspbycdn.com\nspbycdn.info\nspc365.com\nspcc-cn.com\nspcc-silk.com\nspccmc.com\nspcdntip.com\nspcdntipbak.com\nspcloudhw.com\nspcloudhw.net\nspcywang.com\nspdbh5.com\nspdbuser.com\nspdcat.com\nspddir.com\nspdex.com\nspdiy.com\nspdl.com\nspdydns.com\nspdyidea.com\nspeakout.hk\nspecchemind.com\nspecialcdnstatus.com\nspectorfilm.com\nspectrafusion.cfd\nsped-ssss-pppp-eeee-dddd.com\nspeechless.pw\nspeed-hz.com\nspeedaf.com\nspeedcdns.com\nspeedcdns.info\nspeedcdns.org\nspeedcdnsvip.com\nspeedin.shop\nspeedmanager.net\nspeednt.com\nspeedpdf.com\nspeedsz.net\nspeedws.com\nspeedws.info\nspeedws.org\nspeedzonerc.com\nspeiyou.com\nsperogenix.com\nspfbiotech.com\nspforum.net\nspfosd.com\nspg-ls.com\nspgacmotorsc.com\nspgcw.com\nspgykj.com\nsph00852.com\nsphcchina.com\nsphchina.com\nsphkids.com\nsphmc.org\nsphsine.com\nspibj.com\nspic-coalcg.com\nspicaceshi.asia\nspiccq.com\nspicescn.com\nspicezee.com\nspicgx.com\nspicgxnp.com\nspicgz.com\nspicjs.com\nspiedigitallibrary.org\nspiiker.com\nspin-view.com\nspiritframe.org\nspirithy.com\nspischolar.com\nspiwcn.com\nsplaybow.com\nsplayer.work\nspldlkj.com\nsplendecor.com\nsplmcn.com\nspmcn.com\nspnchinaren.com\nspochikj.com\nspoience.com\nspointdesign.com\nsporposten.today\nsport-syy.com\nsportman.cc\nsportnanoapi.com\nsportq.com\nsports-100.com\nsportsdt.com\nsporui.com\nspoto.net\nspotpear.com\nspouyashop.com\nspph-sx.com\nspplnet.com\nspprec.com\nspr-atm.com\nsprayv.com\nsprda.org\nspreadtrum.com\nspreton.com\nspring-mall.com\nspring4all.com\nspring56.com\nspringairlines.com\nspringcocoon.com\nspringer.com\nspringerlink.com\nspringpharma.net\nspringsunday.net\nspringtour.com\nspringx.fun\nsprint-tech.com\nsprixin.com\nspsb114.com\nspsicloudport.com\nspsisctgroup.com\nspsisncl.com\nspsy.org\nsptcc.com\nsptccn.com\nspthome.com\nsptv-1.com\nspug.cc\nspvtime.com\nspwj.com\nspxgas.net\nspyouxi.com\nspzb.com\nspzp.com\nspzs.com\nsq-ks.com\nsq-newstar.com\nsq.cc\nsq1996.com\nsq23.com\nsq521.com\nsq523.com\nsq580.com\nsq581.com\nsqa-chn.com\nsqage.com\nsqchunqiu.com\nsqdaily.com\nsqeatin.com\nsqezz.com\nsqfcw.com\nsqfgc.com\nsqgg.cc\nsqggzy.com\nsqgwh.com\nsqhec.com\nsqhx.com\nsqis.com\nsqj-jiuyousport.com\nsqj888.com\nsqjk123.com\nsqjrc.com\nsqjsxy.com\nsqjt.com\nsqjtcy.com\nsqjvx.org\nsqkb.com\nsqklrq.com\nsql110.com\nsqlpub.com\nsqlsec.com\nsqluck.com\nsqmarathon.com\nsqmn666.com\nsqphb.com\nsqpx.org\nsqqmall.com\nsqqmtj.com\nsqqnh.org\nsqrc.net\nsqrcw.com\nsqreader.com\nsqrsks.com\nsqrtthree.com\nsqrush.com\nsqs373.com\nsqshmzx.net\nsqsjt.net\nsqstudio.com\nsqswjt.com\nsqsyy.com\nsquare16.org\nsquarecn.com\nsquarefong.com\nsquirrelboiler.com\nsqwenhua.com\nsqxww.com\nsqyai.com\nsqyhw.com\nsqzjg.com\nsqzs.com\nsqzw.com\nsqzyxy.com\nsr-139.com\nsrcb.com\nsrcbcz.com\nsrcbeijing.com\nsrccdn.com\nsrccdn2.com\nsrcge.com\nsrcgsre.com\nsrcmsh.com\nsrcqeece.com\nsre.ink\nsrell.com\nsrfip.com\nsrgnmsrg.com\nsrgow.com\nsriappalam.com\nsribs.com\nsric.fun\nsrichina.org\nsrici.com\nsritsoft.com\nsrixon-china.com\nsrlfl.com\nsrlzzp.com\nsrmyy.com\nsrrcw.com\nsrrsh.com\nsrrtvu.com\nsrschool.net\nsrslyy.com\nsrsq.club\nsrt365.com\nsrtong.com\nsrun.com\nsrvbus.com\nsrw00.com\nsrworld.net\nsrx3.net\nsrxiayunbusiness.com\nsrxww.com\nsrxzz.com\nsrygz.com\nsrzc.com\nsrzdq.com\nsrzx.com\nsrzx100.com\nsrzxjt.com\nss-ceo.com\nss-smartech.com\nss03.net\nss1969.com\nss2007.com\nss246.com\nss256.com\nss28.com\nss8899888.com\nssalegs.store\nssaocorp.com\nssawhotels.com\nssaxx.com\nssaya.win\nssbbww.com\nssbgzzs.com\nssbifen.com\nssbjf.com\nssbjsy.com\nssbx.me\nssby.cc\nssby66.com\nssc-mcc.com\nsscanmou.com\nsscejia.com\nsscha.com\nsschengtou.com\nsscity.org\nsscms.com\nsscmwl.com\nsscom.vip\nssctp.com\nsscy.net\nssdaex.com\nssdata.com\nssdax.com\nssdfans.com\nssdp.com\nssdzg.com\nsseinfo.com\nssf.cc\nssfb86.com\nssfei.com\nssfetsz.org\nssffx.com\nssfqsfvd.com\nssgedm.com\nssgeek.com\nssgsemi.com\nssgz.com\nsshr.net\nssia.cc\nssidc.net\nssidc.org\nssine.cc\nssine.ink\nssipex.com\nssis.asia\nssish.com\nssixvo9gaybkp5.com\nssjj2.com\nssjjss.com\nssjjtt.com\nssjlicai.com\nssjljk.com\nssjytc.com\nssjyxx.com\nsskc360.com\nsskgame.com\nsskoo.com\nssky123.com\nssl-zs.cc\nsslaaa.com\nsslad.com\nsslawy.com\nsslceshi.com\nsslchaoshi.com\nsslchina.com\nsslcity.com\nssldun.com\nssldun.vip\nssleye.com\nsslibrary.com\nsslnode.com\nsslso.com\nssltgm.com\nssmc-sz.com\nssmchina.org\nssmec.com\nssmedic.com\nssmept.com\nssmys.com\nssmysh.com\nssnewyork.com\nssnm.xyz\nssnuo-ch.com\nssofair.com\nssoffo.com\nssoouu.com\nssp.group\nsspaas.com\nsspai.com\nsspai.me\nsspeeddns.com\nsspjizb.com\nssports.com\nssports.net\nssptqt.com\nssqgx.com\nssqtt.com\nssqzj.com\nssrcdn.com\nssrcr.com\nssreader.com\nssrjzs.com\nssrlzy.net\nsss.wiki\nsss348499.com\nsss437942.com\nsss495830.com\nsss850697.com\nssscdn.com\nsssch.net\nssses.net\nssslgs.com\nsssmro.com\nsssmy.com\nssso.com\nsst-ic.com\nsst-sd.com\nsst-sz.com\nsstlp.com\nssuip.com\nssw777734dh1.shop\nsswater.com\nsswchina.com\nsswl315.com\nssws.tv\nssxcycy.com\nssxf.net\nssxjd.com\nssxpxjt.com\nssxx.site\nssxxp.com\nssyapi.com\nssyar.com\nssycw.com\nssydt.com\nssyer.com\nssyssf.com\nssywh.com\nssyxlx.com\nssyxmall.com\nssyzx.net\nsszgit.com\nsszhg.com\nsszjnc.com\nsszsj.cc\nst-jzx.com\nst-recovery.com\nst001.com\nst12121.net\nst123.com\nst180.com\nst3tzmp6gg.work\nstaarphewas.org\nstacf.com\nstachina.org\nstackboom.xin\nstackcc.com\nstackoom.com\nstackoverflow.club\nstackoverflow.wiki\nstage1st.com\nstage3rd.com\nstaginfo.com\nstaging-controlbe.floonet.goog\nstaging-databe.floonet.goog\nstaging.databe.floonet.goog\nstaidson.com\nstandard-groups.com\nstandardcn.com\nstandardshop.net\nstandardsofchina.com\nstandteam.net\nstanlyview.com\nstaofchina.com\nstapharma.com\nstar-charge.com\nstar-elink.com\nstar-engine.com\nstar-kid.com\nstar-linear.com\nstar-meeting.com\nstar-new-material.com\nstar-river.com\nstar365.com\nstar7game.com\nstar7th.com\nstararc-coating.com\nstarbaby.cc\nstarbaby.com\nstarbaysoft.com\nstarcharge.com\nstardata360.com\nstarde.net\nstardict.net\nstardict.org\nstards.com\nstardust2000.com\nstarduster.me\nstarfishcloud.com\nstarfivetech.com\nstarhalo.mobi\nstaringos.com\nstarkai.com\nstarkettle.com\nstarlakelab.com\nstarlink.uno\nstarlu.com\nstarm.cc\nstarming.com\nstarooo.com\nstarpainters.net\nstarpiao.com\nstarrails.com\nstarrevs.com\nstarrockinvest.com\nstarrtc.com\nstarrydyn.com\nstarryfrp.com\nstarrymed.com\nstarrysurvey.com\nstars-one.site\nstarschina.com\nstarschinalive.com\nstarscube.com\nstarsharbor.com\nstarsino.com\nstarsmicrosystem.com\nstarsshine1.com\nstarsshine2.com\nstarstech.cc\nstarswar.org\nstartcarlife.com\nstartcatcher.com\nstartcomca.net\nstartdt.com\nstartech.ltd\nstarting2000.com\nstartogether1.com\nstartos.com\nstartos.org\nstartssl.com\nstartup-partner.com\nstarwarschina.com\nstarway.net\nstarwaycomm.com\nstarworldgames.com\nstarworldmacau.com\nstarwsn.com\nstarxn.com\nstaryea.com\nstat-nba.com\nstat08.com\nstat18.com\nstatic-login.gog-statics.com\nstatic.cdnetworks.com\nstatic.eprintsw.com\nstatic163.net\nstaticaa.com\nstaticdn.net\nstaticec.com\nstatickksmg.com\nstatics.cc\nstaticsdd.com\nstaticsoe.com\nstaticsoem.com\nstaticswin.com\nstationpc.com\nstats.ipinyou.com\nstatsinstall.xyz\nstatuslarkoffice.com\nstay-bullish.com\nstaybrowser.com\nstaycu.com\nstbieshu.com\nstboy.com\nstbs100.com\nstc2002.com\nstcaimcu.com\nstcfa.org\nstcfile.com\nstcmcu.com\nstcmcudata.com\nstcmih.com\nstcn.com\nstcy168.com\nstcyzls.com\nstdaily.com\nstdard.com\nstdhgd.com\nstdicloud.com\nstdlibrary.com\nstdmm.org\nstdout.pub\nstdwp.com\nste56.com\nstea2008.com\nsteam302.xyz\nsteambig.com\nsteamboxs.com\nsteamcn.com\nsteamcommunity-a.akamaihd.net\nsteamdd.com\nsteamdt.com\nsteamgift.site\nsteamhost.info\nsteammm.com\nsteampp.net\nsteamproxy.net\nsteampy.com\nsteamrepcn.com\nsteamxdf.com\nstec.net\nstecn.org\nstedu.net\nsteel-mate.com\nsteel-spot.com\nsteeljs.com\nsteelkey.com\nsteelphone.com\nsteelsearcher.com\nstefg.org\nstegameskins.com\nsteinberg-cn.com\nstelinno.com\nstellarplayer.com\nstemceltech.com\nstep-by-step.tech\nstep-motor.com\nstepelectric.com\nstepsigriner.com\nstereorise.com\nsteriguardmed.com\nstexc.online\nstfile.com\nstgiantfilms.com\nsthforme.com\nsthfsteel.com\nsthifi.com\nsthke.com\nsthospital.com\nsticksgame.com\nstjinfa.com\nstjinguan.com\nstjjxh.com\nstkfanli.com\nstklt.com\nstlb520.com\nstmaoyi.com\nstmbuy.com\nstmjsociety.com\nstmybj.com\nstnn.cc\nstnts.com\nsto-express.com\nstocke.com\nstockhn.com\nstockradar.net\nstockren.com\nstockstar.com\nstockwei.com\nstofund.org\nstointl.com\nstojf.com\nstone139.com\nstone168.com\nstone365.com\nstonebtb.com\nstonebuy.com\nstoneios.com\nstoneleague.com\nstoneo2o.com\nstonepoll.com\nstonepoll.net\nstonescloud.com\nstonesm.com\nstoneu.com\nstonexp.com\nstor-age.com\nstor-helper.com\nstorage-asset.msi.com\nstorcezon.com\nstore12.com\nstoreapi.net\nstorecorefulfillment.download.prss.microsoft.com\nstoreedge.microsoft.com\nstoreedgefd.dsx.mp.microsoft.com\nstorkapp.me\nstormorai.com\nstory520.com\nstoryboardworld.com\nstoryren.com\nstosolution.com\nstourweb.com\nstourweb.net\nstovol.club\nstoyard.com\nstozxmveui4pvr.com\nstpolice.com\nstpos.net\nstqiyuan.com\nstql.com\nstql.org\nstr-mo.com\nstraitchain.com\nstrategy-sight.com\nstray-soul.com\nstream.baoxinwen.com\nstream.dybtv.com\nstream.guihet.com\nstream.houstonpublicmedia.org\nstream.nbbltv.com\nstream.rcs.revma.com\nstream.slave.jxtvnet.tv\nstream.superfm99-1.com.tw\nstream.wbez.org\nstream.xctv.news\nstream.zhystv.com\nstream.zzgd.tv\nstream0.tv41.ru\nstream01.dqtv123.com\nstream1.shopch.jp\nstream2.cprnetwork.org\nstreamax.com\nstreamaxtech.com\nstreamcomputing.com\nstreamipcf.akamaized.net\nstreamlakeapi.com\nstreffy.com\nstrinova.com\nstrong-light.com\nstrong-study.com\nstrongfc.com\nstrongflc.com\nstrongled.com\nstshuizhi.com\nstsmt.com\nstssugar.com\nstswjx.com\nstszcm.com\nstt-bearing.com\nsttanso.com\nsttcq.com\nsttry.com\nstu-lab.com\nstu-works.com\nstu51.com\nstubbornhuang.com\nstuda.net\nstudentboss.com\nstudioartiz.com\nstudstu.com\nstudy-cloud.com\nstudy163.com\nstudyems.com\nstudyez.com\nstudyfor.work\nstudyfr.net\nstudyget.com\nstudygolang.com\nstudyhub.fun\nstudyingtours.com\nstudypay.com\nstudyquicks.com\nstudytime.xin\nstudyuser.com\nstudyvip.com\nstuhome.net\nstuhui.com\nstuky.net\nstulip.org\nstuliving.com\nstuln.com\nstunnel.vip\nstupid77.com\nstupidet.com\nstuq.com\nsturgeonnews.com\nsturmdcp.com\nstutimes.com\nstvf.com\nstvgame.com\nstwj.com\nstwyxh.com\nstxfjs.com\nstxsw.com\nstylecdn.com\nstylechina.com\nstyles-sys.com\nstzc.com\nstzzx.com\nsu-jiao.com\nsu-long.com\nsuaee.com\nsuan5.com\nsuanbanyun.com\nsuanchang.com\nsuandao.com\nsuanguaju.com\nsuanjiayun.com\nsuanjuzi.com\nsuanpin.com\nsuanst.com\nsuansuangua.com\nsuanya.com\nsuapp.me\nsuawin.com\nsubangjia.com\nsubaonet.com\nsubaoxw.com\nsubaru-li.org\nsubeiflower.com\nsubelf.net\nsubingkang.com\nsubinwechat.com\nsubline.org\nsubo.net\nsubom.net\nsubond.com\nsubuy.com\nsucai.com\nsucai77.com\nsucai999.com\nsucaibar.com\nsucaidao.com\nsucaifu.com\nsucaijiayuan.com\nsucaijishi.com\nsucainiu.com\nsucaiplus.com\nsucaisucai.com\nsucaitu.cc\nsucaiw.com\nsuccess001.com\nsuccesshr.com\nsuccez.com\nsucdri.com\nsuch-game.com\nsuchasplus.com\nsuchengmeizhan.com\nsuchugao.com\nsucjg.com\nsucop.com\nsucoupon.com\nsudaizhijia.com\nsudaoa.com\nsudasuta.com\nsudawuye.com\nsuddenfix.com\nsudecoating.com\nsudoinfotech.com\nsudu-67ph.com\nsudu-72ub.com\nsudu-ab6h.com\nsudu-by4e.com\nsudu-du9k.com\nsudu-kay6.com\nsudu-me6n.com\nsudu-pq2y.com\nsudu-q6wk.com\nsudu-r8gh.com\nsudu-sq56.com\nsudu-tf42.com\nsudu-xu9b.com\nsudu-y94k.com\nsudu123.net\nsuducha.com\nsududa.com\nsudundns.com\nsudupower.net\nsudusite.com\nsuease.com\nsuemor.com\nsueon.com\nsufachina.com\nsufangxu.com\nsufeinet.com\nsufoma.com\nsufont.com\nsufybkt.com\nsufycdn.com\nsugaov.com\nsugar5.club\nsugarall365.com\nsugarenergy.com\nsugarguo.com\nsugarle.com\nsugessofficial.com\nsugon.com\nsugou.com\nsuguangxx.com\nsugwedding.com\nsuhaoyy.com\nsuhedj.com\nsuhedz.com\nsuhergroup.com\nsuhuishou.com\nsui.com\nsui.me\nsuibao-jiaozhu.com\nsuibao.com\nsuibiji.com\nsuibo.org\nsuiji123.com\nsuijinetworks.com\nsuijunlaowu.com\nsuilengea.com\nsuileyoo.com\nsuimeng.la\nsuinikan.com\nsuiningwang.com\nsuiniyi.com\nsuiqiao.com\nsuirui.com\nsuishenyun.net\nsuishouji.com\nsuishouxie.com\nsuishouzj.com\nsuisuihu.com\nsuisuijiang.com\nsuitaichem.com\nsuitdaily.com\nsuiunited.com\nsuixianwang.net\nsuixin8.com\nsuixingpay.com\nsuixinzulin.com\nsuixkan.com\nsuixw.com\nsuiyichong.com\nsuiyifa.com\nsuiyiju.com\nsuiyuanjian.com\nsuizhoushi.com\nsuizui.net\nsujh.net\nsujia.cc\nsujiagroup.com\nsujiao1668.com\nsujw.com\nsujx.net\nsukean.com\nsukeler.com\nsukeyun.com\nsuki.club\nsuki.moe\nsukimon.me\nsukiu.net\nsukkaw.com\nsukoshi.xyz\nsukoutu.com\nsukvm.com\nsulabs.net\nsulaixue.com\nsulamp.com\nsulandscape.com\nsuleapi.com\nsuliaodingzhi.com\nsuliaojian.com\nsulicn.com\nsulitui.com\nsuluf.com\nsulvwenhua.com\nsumaart.com\nsumaarts.com\nsumapay.com\nsumatang.com\nsumavision.com\nsumcl.com\nsumec.com\nsumedu.com\nsumeme.com\nsumer.work\nsumgotea.com\nsumian.com\nsumiao.net\nsumiaowang.com\nsumibuy.com\nsumkoo.com\nsumkoo.net\nsumly.net\nsummall.com\nsummercampschina.com\nsummerfarm.net\nsummerlight.com\nsummerlight.name\nsummerpalace-china.com\nsummitpharmachina.com\nsummitviewcapital.com\nsumoon.com\nsumrday.net\nsumscope.com\nsumuda.tech\nsumwin.com\nsumzc.com\nsumzi.com\nsun-ada.net\nsun-coo.com\nsun-create.com\nsun-feel.com\nsun-hua.com\nsun-park.com\nsun-wish.com\nsun0769.com\nsun0769ns.com\nsun0816.com\nsun66.net\nsuna-opto.com\nsunaas.com\nsunacctg.com\nsunalytools.com\nsunari17.com\nsunasia.com\nsunbelife.com\nsunbl.com\nsunbloger.com\nsunbo.com\nsunbo367.com\nsunborngame.com\nsunbowhospital.com\nsunboxsoft.com\nsunboyu.com\nsuncereltd.com\nsuncjm.com\nsundan.com\nsundaydragon.com\nsundayvision.net\nsundns.com\nsundray.com\nsunear.net\nsunease.net\nsunemc.com\nsuner.cc\nsunera-cn.com\nsunergyworks.com\nsunflowerscf.com\nsunfounder.cc\nsunfreight-logistics.com\nsunfront.com\nsunft.com\nsungainyeast.com\nsungari1995.com\nsungent.com\nsungesoft.com\nsungine.com\nsunglow-tec.com\nsungoal.org\nsungoedu.com\nsungroup-energy.com\nsungshu.com\nsunhan.vip\nsunhante.com\nsunhepower.com\nsunhongs.com\nsunhospital.net\nsunhuhotel.com\nsuninf.net\nsuninfo.com\nsuning.com\nsuningbank.com\nsuningcdn.com\nsuningcdn.net\nsuningcloud.com\nsuningdns.com\nsuningdns.net\nsuningestate.com\nsuninggslb.net\nsuningholdings.com\nsuninghotel.com\nsuninghotels.com\nsuningmail.com\nsuningpay.com\nsuningyunyou.com\nsunjex.com\nsunjiadai.xyz\nsunjianjian.com\nsunjs.com\nsunkeydata.com\nsunland.vip\nsunlandlaw.com\nsunlands.com\nsunlandstudy.com\nsunlandvip.com\nsunlandzk.com\nsunleader.net\nsunlife-everbright.com\nsunlight-tech.com\nsunlogging.com\nsunlogin.com\nsunlogin.net\nsunlons.com\nsunlordinc.com\nsunlune.com\nsunmarr.com\nsunmeihotel.com\nsunmen.com\nsunmi.com\nsunmingxia.com\nsunmmio.com\nsunmmm.com\nsunmnet.com\nsunmoonepe.com\nsunnatech.com\nsunnercn.com\nsunnergp.com\nsunnsoft.com\nsunny90.com\nsunnyaiot.com\nsunnychina.com\nsunnyfly.com\nsunnyhaitai.com\nsunnyhf.com\nsunnylab.work\nsunnylawyer.com\nsunnyms.com\nsunnyoptical.com\nsunnyos.com\nsunnyplas.com\nsunnypure.com\nsunnyqi.com\nsunnysemi.com\nsunnyxx.com\nsunocean.life\nsunofbeaches.com\nsunofus.org\nsunon-china.com\nsunon-power.com\nsunonln.com\nsunorensolar.com\nsunorlng.com\nsunowe.com\nsunowo.com\nsunpala.com\nsunpapergroup.com\nsunpeed.com\nsunpowergroup.biz\nsunprocn.com\nsunpun.com\nsunrain.com\nsunrate.com\nsunray2000.com\nsunresin.com\nsunresin.net\nsunrisedutyfree.com\nsunrisegroupcn.com\nsunrisenan.com\nsunrisesha.com\nsunrizetech.com\nsunrtb.com\nsunrtnet.com\nsunsea.net\nsunseekerpower.com\nsunsetcare-mirrortech.com\nsunsharer.com\nsunshine-power.net\nsunshine-sino.com\nsunshinecoasthomesearch.com\nsunsili.com\nsunsilu.com\nsunsine.com\nsunspotfund.com\nsunstarasia.com\nsuntech-metal.com\nsuntech-power.com\nsuntechospital.com\nsuntgj.com\nsuntimehousehold.com\nsuntop168.com\nsuntray.com\nsuntrayoa.com\nsuntront.com\nsunup.name\nsunup3d.com\nsunupcg.com\nsunus-china.com\nsunvim.com\nsunvio.com\nsunwardcap.com\nsunwatt.com\nsunwaygas.com\nsunwayland.com\nsunwaypharm.com\nsunways-portal.com\nsunwayworld.com\nsunwayx.com\nsunweihu.com\nsunweiwei.com\nsunwellpower.com\nsunwin-china.com\nsunwin2001.com\nsunwinon.com\nsunwoda.com\nsunwoodacoustic.com\nsunxiaoning.com\nsunxisc.com\nsunyaholding.com\nsunyansong.com\nsunyard.com\nsunyea.com\nsunyet.com\nsunyitech.com\nsunyoads.com\nsunyuu.com\nsunywo.com\nsunzhongwei.com\nsunzn.com\nsuo.im\nsuobao8.com\nsuobifa.com\nsuobuy.com\nsuoer-group.com\nsuofeiya.com\nsuofeiyashop.com\nsuoge.net\nsuolong.com\nsuoluomei.com\nsuopingbao.com\nsuorang.com\nsuosihulian.com\nsuotn.com\nsuoxin5.com\nsuoyiren.com\nsupafa.com\nsupaq.com\nsuparc.com\nsupcname.com\nsupcompute.com\nsupcon.com\nsupconauto.com\nsupconit.com\nsupdri.com\nsupeeder.com\nsupei.com\nsuper-king.net\nsuper-mt.com\nsuperace.com\nsuperacme.com\nsuperaicdn.com\nsuperayi.com\nsuperbed.cc\nsuperboss.cc\nsuperbrandmall.com\nsuperbrowser.com\nsuperbrowser.hk\nsuperbuy.com\nsuperbuyy.com\nsupercachenet.com\nsupercachenode.com\nsupercalnow.com\nsupercarrier8.com\nsupercell.com\nsupercrm.com\nsuperdns.org\nsuperepoxyresin.com\nsuperfix.com\nsuperhcloud.com\nsuperic.com\nsuperiorscope.com\nsuperjq.com\nsuperlib.com\nsuperlib.net\nsuperlink.mobi\nsuperlinkscm.com\nsuperlitetech.com\nsuperljq01.com\nsupermap.com\nsupermap.io\nsupermapcloud.com\nsupermapol.com\nsupernode.pro\nsuperpb.com\nsuperpowercn.com\nsuperqq.com\nsuperrrai77.com\nsupers.ltd\nsupersharket.com\nsupersocket.net\nsuperstar-med.com\nsuperstarkennel.com\nsuperstars.vip\nsupertime-malting.com\nsupertracker.net\nsupertrw.com\nsupervisionus.com\nsupervote.cc\nsuperwrt.com\nsuperyd.com\nsuperyears.com\nsuperzl.com\nsupesite.com\nsupesoft.com\nsupet.com\nsupgroups.com\nsuplaymart.com\nsupman.com\nsupmea.com\nsupmeter.com\nsupmil.com\nsupmil.net\nsupoin.com\nsupool.com\nsupor.com\nsuporgroup.com\nsuporpharm.com\nsupplierlist.com\nsupplygw.com\nsupplywater.com\nsupport-cn.samsung.com\nsupportassist.dell.com\nsupreme-oe.com\nsupwisdom.com\nsupwk.com\nsuqian360.com\nsuqianhospital.com\nsuqing.com\nsuqishi.com\nsuqnn.com\nsuqun-group.com\nsurely.cool\nsurerp.com\nsurface.download.prss.microsoft.com\nsurface.downloads.prss.microsoft.com\nsurfacetreatmentgroup.com\nsurfacetreatmenttechnology.com\nsurfcg.com\nsurgerii.com\nsurgerycast.com\nsurgi-plan.com\nsurmounthat.com\nsurprising.studio\nsursen.com\nsursenelec.com\nsursung.com\nsurtime.com\nsuruicloud.com\nsurun-tech.com\nsurvey.work\nsurveyhills.com\nsurveyqq.com\nsurveyrtk.com\nsurveyunion.com\nsurvivor99.com\nsurwit.com\nsuryee.com\nsuseage.com\nsushijiameng.com\nsushiyanglao.com\nsushui.com\nsuso56.com\nsusong1.com\nsusong51.com\nsusongbbs.com\nsusoul.com\nsustcra.com\nsustech.online\nsusudm.com\nsusun.cc\nsusungroup.com\nsutanapp.com\nsuteidc.com\nsuteshop.com\nsuting123.com\nsutpc.com\nsutune.me\nsutuobang.com\nsuujee.com\nsuuny0826.com\nsuv-trip.com\nsuv666.com\nsuwen.org\nsuxiangsj.com\nsuxiazai.com\nsuxieban.com\nsuxiege.com\nsuxing.me\nsuxuejiaoyu.com\nsuxx0.com\nsuyangroup.com\nsuyuantuliao.com\nsuyuening.com\nsuyugame.com\nsuyujoy.com\nsuyun.net\nsuyunc.com\nsuyunj.com\nsuyur.com\nsuyutech.com\nsuyuzz.com\nsuzhongyy.com\nsuzhou-marathon.com\nsuzhou-otsuka.com\nsuzhouballettheatre.com\nsuzhoubank.com\nsuzhoubeili.com\nsuzhoubond.com\nsuzhoucitymarathon.com\nsuzhoudyh.com\nsuzhouexpo.com\nsuzhoufashion.com\nsuzhouhengtai.com\nsuzhouhui.com\nsuzhoujicai.com\nsuzhouleasing.com\nsuzhoulida.com\nsuzhoulinsen.com\nsuzhousj.com\nsuzhouyabao.com\nsuzip.com\nsuzport.com\nsuzuki-china.com\nsuzuki-shanghai.com\nsvconcloud.com\nsve.cc\nsveir.xyz\nsvell.net\nsvenhetin.com\nsvfrrg.com\nsvgoptronics.com\nsvimeng.com\nsvinsight.com\nsvip51.com\nsvipdog.com\nsvipgulr.com\nsviping.com\nsvk3o97xmyid93.com\nsvlik.com\nsvmxxaq.com\nsvn999.com\nsvnbucket.com\nsvnspot.com\nsvp6.com\nsvpchina.org\nsvqsokp.com\nsvrvr.com\nsvw-volkswagen.com\nsvwuc.com\nsvyun.com\nsw-bllp.com\nsw-zh.com\nsw0013.com\nsw163.com\nsw2008.com\nsw996.com\nswakopuranium.com\nswan366.com\nswanchemical.com\nswang8.com\nswangwx.com\nswanhub.co\nswaqds.com\nswarma.net\nswat-js.com\nswatou.com\nswaywm.com\nswbbsc.com\nswceb.com\nswchina.org\nswckc.com\nswdcmg.com\nswdyz.com\nsweet-data.com\nsweetalkos.com\nsweetjing.cc\nsweetlove.cc\nsweetmartmarketing.com\nsweetome.com\nsweetread.net\nsweetrouble.com\nsweetystory.com\nswelder.com\nswellfun.com\nswfc-shanghai.com\nswfzjt.com\nswg36.com\nswgocean.com\nswgzs.com\nswgzy.com\nswhydyj.com\nswhysc.com\nswift-at.com\nswift51.com\nswiftfintech.com\nswifthumb.com\nswiftjava.com\nswiftlet.net\nswijoy.com\nswip.group\nswirebev.com\nswirecocacola.com\nswisdom.cc\nswissgenie.com\nswissrepicass.com\nswissreplicas.cc\nswisswatcheshot.com\nswisswatchx.com\nswit-battery.com\nswit.cc\nswitchb2b.com\nswitchxiazai.com\nswitzerland-visacenter.com\nswjjshfw.com\nswjoy.com\nswjsj.com\nswjtjt.com\nswkedou.com\nswkong.com\nswkpe.tw\nswliuxue.com\nswltools.com\nswnic.com\nswofcare.com\nswomc.net\nswoole.com\nswordair.com\nswordart.online\nswordofmorning.com\nswords.center\nswordtt.com\nswpubar.com\nswq242xc54.com\nswrjzxw.com\nswrtxtb.com\nswsbw.com\nswsegroup.com\nswskj.com\nswsm.net\nswsmu.com\nswstsg.com\nswt0.com\nswtpu.com\nswufe-online.com\nswupdl.adobe.com\nswwy.com\nswxk.cc\nswxxvr.com\nswyun.net\nswz001.com\nswzj.com\nswzx.com\nsx-merryland.com\nsx-moen.com\nsx-seafood.com\nsx1211.com\nsx189.com\nsx267.com\nsx311.cc\nsxaec.com\nsxafz.com\nsxalu.com\nsxand.com\nsxase.com\nsxasuykzx2sq.icu\nsxatcm.com\nsxbada.com\nsxbang.net\nsxbawy.com\nsxbctv.com\nsxbdf.com\nsxbest.com\nsxbjedu.com\nsxbpa.com\nsxbuszp.com\nsxbychem.com\nsxcahosp.com\nsxccb.com\nsxcd-gyl.com\nsxcgzh.com\nsxchangshengjt.com\nsxcig.com\nsxcitygas.com\nsxclassiclighting.com\nsxcm.net\nsxcntv.com\nsxcoal.com\nsxcp.com\nsxctf.com\nsxcxgf.com\nsxcxldjy.com\nsxcyts.com\nsxcywy.com\nsxczdz.com\nsxd408.com\nsxdagang.com\nsxddy.com\nsxdkj.com\nsxds.com\nsxdzyp.com\nsxepa.org\nsxepc.com\nsxetcedu.com\nsxfl.org\nsxfoundation.com\nsxfu.org\nsxgbs.com\nsxgdtv.com\nsxggec.com\nsxggzp.com\nsxgjj.com\nsxglpx.com\nsxgoo.com\nsxgq.net\nsxgrw.com\nsxgs.com\nsxgsps.com\nsxhbjt.com\nsxhbjtshj.com\nsxhctv.com\nsxhhwl.com\nsxhhyy.com\nsxhimalayanqd.com\nsxhiway.com\nsxhjrc.com\nsxhkstv.com\nsxhkxy.com\nsxhlcc.com\nsxhlfjt.com\nsxhlxy.com\nsxhm.com\nsxhongyuan.com\nsxhospital.com\nsxhtss.com\nsxhtyy.com\nsxhtyy.net\nsxhwhb.com\nsxhwls.com\nsxhxbank.com\nsxisa.org\nsxj7k.com\nsxjant.com\nsxjbswyy.com\nsxjcdyy.com\nsxjd-cn.com\nsxjdfreight.com\nsxjdpm.com\nsxjg-wl.com\nsxjgkg.com\nsxjhzsgc.com\nsxjianli.com\nsxjinfengjiuye.com\nsxjky.com\nsxjmfxky.com\nsxjntech.com\nsxjtyhjt.com\nsxjwlkj.com\nsxjxdyqfw.com\nsxjxsc0.org\nsxjybk.com\nsxjzxww.com\nsxkbzc.com\nsxkids.com\nsxkzxt.com\nsxlcdn.com\nsxldns.com\nsxlfwl.com\nsxlhrj.com\nsxlib.com\nsxlljm.com\nsxlottery.net\nsxlpd.com\nsxls.com\nsxltsj.com\nsxluxiang.com\nsxmda.net\nsxmhgas.com\nsxmty.com\nsxmxwh.com\nsxmyh.com\nsxncb.com\nsxnxs.com\nsxnxxny.com\nsxnycl.com\nsxol.com\nsxpgb.com\nsxplc.com\nsxpmg.com\nsxpmpos.com\nsxprgc.com\nsxpta.com\nsxpyzg.com\nsxpyzx.com\nsxqingyi.com\nsxqzy.com\nsxrb.com\nsxrbw.com\nsxrcw.net\nsxrczx.com\nsxrekord.com\nsxri.net\nsxrom.com\nsxrqrlxh.com\nsxrqxny.com\nsxrszdh.com\nsxrtv.com\nsxrxgs.com\nsxrxyc.com\nsxs56.com\nsxs8818.com\nsxsa.org\nsxsanwei.com\nsxsapi.com\nsxscwl.com\nsxsedu.net\nsxsfdxylsyzx.com\nsxsfky.com\nsxsfyyy.com\nsxsgs.com\nsxshjhyxh.com\nsxshu.com\nsxsim.com\nsxsimg.com\nsxsjgy.com\nsxsjzyxh.com\nsxslhg.com\nsxslnews.com\nsxsme.org\nsxsmtgyxh.com\nsxsng.com\nsxsoft.com\nsxsqxj.com\nsxsqyjxh.org\nsxsrmyy.com\nsxsslz.net\nsxssyh.com\nsxswfzjt.com\nsxsyyxh.com\nsxsyyxh.net\nsxsztv.com\nsxszw.net\nsxtbu.net\nsxtcm.com\nsxtgedu.net\nsxtianjian.com\nsxtourgroup.com\nsxtourism.com\nsxtppm.com\nsxtqsl.com\nsxtracking.com\nsxtv6.com\nsxtvs.com\nsxudqg.com\nsxuyr2nx.com\nsxvtc.com\nsxwao4zi6dgp.com\nsxwbedu.com\nsxwbs.com\nsxwetalent.com\nsxwlyhzp.com\nsxworker.com\nsxwpyx.com\nsxwq.com\nsxwstcm.com\nsxwtdyd.com\nsxww.com\nsxxfj.com\nsxxl.com\nsxxrmyy.com\nsxxsmjh.com\nsxxt.net\nsxxw.net\nsxxyfw.com\nsxxynews.com\nsxxzpt.com\nsxy7.com\nsxyasen.com\nsxyckjr.com\nsxycpc.com\nsxycrb.com\nsxycys.com\nsxygsj.com\nsxyj.net\nsxyqgs.asia\nsxyrxb.com\nsxyxqk.com\nsxyyc.net\nsxyyzcj.com\nsxzhaobiao.com\nsxzhongfei.com\nsxzhyy.com\nsxzkzs.com\nsxzlycl.com\nsxzlyy.com\nsxzq.com\nsxzxsdf.com\nsxzydj.com\nsxzyfy.com\nsxzytech.com\nsy-game.com\nsy-home.com\nsy-yy.com\nsy021.com\nsy118.com\nsy12306.com\nsy12328.com\nsy17.com\nsy1994.com\nsy1z.com\nsy2k.com\nsy2z.com\nsy3.com\nsy76.com\nsyais.com\nsybasebbs.com\nsyberos.com\nsyberq.com\nsybj.com\nsybxpu.com\nsybygx.com\nsyc738gtwihc2.com\nsycaijing.com\nsycdtz.com\nsychlon.com\nsycontroller.com\nsycreader.com\nsycsgj.com\nsycxzx.net\nsydaxxw.com\nsydcch.com\nsydcdjt.com\nsydey.com\nsydfty.com\nsydhyg.com\nsydjwl.com\nsydkidsedu.com\nsydneyglobaltimes.com\nsydtgd.com\nsydw.net\nsydw8.com\nsydxdl.com\nsyeamt.com\nsyeg-ev.com\nsyepia.org\nsyetyy.com\nsyf.ink\nsyfabiao.com\nsyfb2021.com\nsyfj.net\nsyfly007.com\nsyfw.com\nsyfyyy.com\nsyg315.com\nsygcjs.com\nsygcjsxh.com\nsygd.com\nsygjj.com\nsygjzx.com\nsyglyg.com\nsygnew.com\nsyh666.com\nsyhccs.com\nsyhfxsh.com\nsyhhidc.com\nsyhhkj.com\nsyhl.vip\nsyhlgg.com\nsyholdings.com\nsyhospital.com\nsyhouse.net\nsyhsfzl.com\nsyhsxb.com\nsyhuayang.com\nsyhzdj.net\nsyhzx.com\nsyhzzf.com\nsyiptv.com\nsyitgz.com\nsyjcly.com\nsyjiancai.com\nsyjkqzw.com\nsyjlp.com\nsyjsq.com\nsyjt.com\nsyjtwlzx.com\nsyjtzm.com\nsyjyzl.com\nsyjzedu.com\nsyk2023.com\nsykezheng.com\nsykfff.com\nsykong.com\nsykt520.com\nsylangyue.xyz\nsylaryun.com\nsylc.xyz\nsylincom.com\nsylixos.com\nsylm2022.com\nsylmg.com\nsylnyx.com\nsyltgl.com\nsymama.com\nsymarathon.com\nsymbiote.work\nsymboltek.com\nsymf-crm.com\nsymtc.com\nsyn-tron.com\nsyn029.com\nsynball.com\nsync.sh\nsyncedoffplanet.com\nsyncozymes.com\nsyngars.com\nsyngenemed.com\nsynjones.com\nsynjones.net\nsynnchem.com\nsynochip.com\nsynodc.com\nsynology-cn.com\nsynologyssb.com\nsyntao.com\nsynyan.net\nsynyi.com\nsynykj.net\nsyobserve.com\nsyoits.com\nsyoker.com\nsyoseo.com\nsyounggroup.com\nsypglass.com\nsypole.com\nsypost.com\nsypost.net\nsypvm.com\nsyq666.com\nsyr-sce.com\nsyranqi.com\nsyrc.org\nsyrcb.net\nsyrczpw.com\nsyreads.com\nsyrecovery.com\nsyrhkj.com\nsyrinxchina.com\nsyrqgas.com\nsyrszs.com\nsys-ele.com\nsys321.com\nsyscan360.com\nsyscan360.net\nsyscan360.org\nsysceo.com\nsysceo.net\nsyscxp.com\nsysdyy120.com\nsysengi.com\nsyshell.com\nsyshospital.com\nsyshospital.org\nsyshosts.net\nsysjnl.com\nsysjoint.com\nsysmaster.online\nsysmini.com\nsysmls.com\nsysnfj.com\nsysshine.com\nsystedata.com\nsystemsci.org\nsystemserviceable.com\nsystoon.com\nsysu-pharm.com\nsysucc.com\nsysuschool.com\nsysush.com\nsyswgw.com\nsysx.tech\nsysxhz.com\nsysydz.net\nsysyhfj.com\nsysysjnk.com\nsyt1000.com\nsytcke.com\nsytfgroup.com\nsythealth.com\nsytjcc.com\nsytlj.com\nsytlw.com\nsyttgame.com\nsytuku.com\nsyuan.com\nsyuan.net\nsyue.com\nsyw6.com\nsywg.com\nsywgy.com\nsywtqc.com\nsyx-ac.com\nsyxb.com\nsyxidao.com\nsyxjjsw.com\nsyxlgame.com\nsyxt.cc\nsyxw.xyz\nsyxwang.com\nsyxwnet.com\nsyxzhongyi.com\nsyyan.site\nsyyc.com\nsyygjs.com\nsyyjs.com\nsyyl.org\nsyylfh.com\nsyyqls.com\nsyysjt.com\nsyyx.com\nsyyy99.com\nsyyyd.com\nsyyyj.com\nsyyyking.com\nsyyzhpc.com\nsyzdhyb.com\nsyzjjt.com\nsyzlzz.com\nsyzoukan.com\nsyzpw.com\nsyzsgroup.com\nsz-3a.com\nsz-acuvu.com\nsz-amc.com\nsz-baile.com\nsz-bst.com\nsz-building.com\nsz-byg.com\nsz-cbea.com\nsz-cerberus.com\nsz-changfeng.com\nsz-changhong.com\nsz-coin.com\nsz-czzc.com\nsz-dfl.com\nsz-dns.net\nsz-ebest.com\nsz-edsy.com\nsz-ekl.com\nsz-el.com\nsz-etong.com\nsz-expressway.com\nsz-fesco.com\nsz-fukuda.com\nsz-function.com\nsz-gaokai.com\nsz-hbwy.com\nsz-hdenergy.com\nsz-hengdeyuan.com\nsz-hiragawa.com\nsz-huashi.com\nsz-huayuan.com\nsz-hyauto.com\nsz-hzt.com\nsz-iso.com\nsz-jiahong.com\nsz-jlc.co\nsz-jlc.com\nsz-jyd.net\nsz-kaito.com\nsz-keli.com\nsz-khgroup.com\nsz-ky.com\nsz-kye.com\nsz-lcsc.com\nsz-lzyy.com\nsz-map.com\nsz-matro.com\nsz-mtr.com\nsz-myjs.com\nsz-news.com\nsz-osckj.com\nsz-printing.com\nsz-qb.com\nsz-rlx.com\nsz-sunway.com\nsz-suwan.com\nsz-talant.com\nsz-tianmai.com\nsz-trip.com\nsz-tyjx.com\nsz-ua.com\nsz-xingfu.com\nsz-xiran.com\nsz-yian.com\nsz-ytq.com\nsz-zhenghe.com\nsz002329.com\nsz0429.com\nsz121.com\nsz1905.com\nsz1978.com\nsz1z.com\nsz2048.com\nsz240.com\nsz2g.com\nsz315.org\nsz3dp.com\nsz3e.com\nsz3gao.com\nsz56t.com\nsz5983.com\nsz7h.com\nsz800.com\nsz836.com\nsz886.com\nsz910.com\nsz96296.com\nszaaci.com\nszacc.com\nszaccl.com\nszaction.com\nszadf.com\nszadna.net\nszadst.com\nszaeia.com\nszagera.com\nszahotel.com\nszai.com\nszaiaitie.com\nszaicx.com\nszaid.com\nszaima.com\nszaipx.com\nszairport.com\nszaisino.com\nszaiten.com\nszaixian.com\nszajsj.com\nszamc.com\nszande.com\nszanjun.com\nszaojin.com\nszas.com\nszastcg.com\nszaudio.com\nszaudio.net\nszaupd.com\nszautism.com\nszbaba.com\nszbaicao.com\nszbaike.com\nszbaleng.com\nszbaoly.com\nszbaoming.com\nszbattery.org\nszbayy.com\nszbazx.com\nszbbs.org\nszbcase.com\nszbcfurniture.com\nszbdzs.com\nszbeilu.com\nszbeilu888.com\nszbhwk.com\nszbhyy.com\nszbia.com\nszbih.com\nszbike.com\nszbim.com\nszbinying.com\nszbiu.com\nszbnrj.com\nszboehospital.com\nszbojay.com\nszbosen.com\nszbosk.com\nszbrandweek.com\nszbryq.com\nszbubu.com\nszbwgy.com\nszbyzn.com\nszc-ic.com\nszca.com\nszcat.org\nszcatic.com\nszcbc.com\nszcfjt.com\nszcfyi.com\nszcgc.com\nszcgkg.com\nszch-cn.com\nszchengli.com\nszchengyue.com\nszchilink.com\nszchunqiu.com\nszcic.com\nszcidg.com\nszclbxf.com\nszcleanair.com\nszclxzx.com\nszcmer.com\nszcnpiec.com\nszcogo.com\nszcompare.com\nszcp.com\nszcsot.com\nszcssx.com\nszcswater.com\nszctch.com\nszctkj.net\nszcttlab.com\nszctyx.com\nszcua.org\nszcw.com\nszcwdz.com\nszcxjscl.com\nszcy-fintech.com\nszcy99.com\nszczjy.com\nszczkjgs.com\nszdaily.com\nszdcjd.com\nszddns.net\nszdesigncenter.org\nszdesigner.org\nszdesy.com\nszdf.com\nszdhjt.com\nszdiantu.com\nszdihang.com\nszdiyibo.com\nszdkgssb.com\nszdljt.com\nszdlsjj.com\nszdn1ms.com\nszdpi.com\nszdprt.com\nszdrse.com\nszds.com\nszdsit.com\nszdtwcw.com\nszdunan.net\nszduopin.com\nszdwwy.com\nszdwxy.com\nszdwyy.com\nszdx189.com\nszdxfsrhyy.com\nszdz123.com\nszdzczp.com\nszeant.com\nszeastroc.com\nszeasyin.com\nszebus.net\nszecowater.com\nszects.com\nszed.com\nszeds.com\nszedu.net\nszeeg.com\nszegddc.com\nszeholiday.com\nszeia.com\nszelab.com\nszelanpo.com\nszelec.cc\nszelight.com\nszelink.com\nszepiao.com\nszerye.com\nszesens.com\nszetop.com\nszeua.org\nszeunon.com\nszeverich.com\nszfa.com\nszfachina.org\nszfangzhouhd.com\nszfc.net\nszfcol.com\nszfda.net\nszfdg.com\nszfdzx.com\nszfengtu88.com\nszffmr.com\nszfg.net\nszfglass.com\nszfirstplastic.com\nszfiu.com\nszfjt.com\nszfolo.com\nszforter.com\nszftfybj.com\nszftzx.net\nszftzy.com\nszfutong.com\nszfuture.com\nszfw.org\nszfx.com\nszfxdev.com\nszfyhd.com\nszfyzb.com\nszfzx.org\nszgalaxy.com\nszgangdi.com\nszgays.org\nszgcyy.com\nszggzy.com\nszghedu.com\nszghgw.com\nszgky.com\nszgla.com\nszglby.com\nszglsf.com\nszgraphene.com\nszgreenhulk.com\nszgrjt.com\nszgsjc.com\nszgt.com\nszgthr.com\nszguanai.com\nszguanghua.com\nszguante.com\nszguixiang.com\nszguoxin.com\nszgwin.com\nszgwsd.com\nszgymz.com\nszgztg.com\nszh.com\nszha.org\nszhaian.com\nszhaicao.com\nszhailan.com\nszhaochuang.com\nszharmony.com\nszhb.org\nszhddq.com\nszhdy.com\nszhdyic.com\nszhenglian.com\nszhetai.com\nszhfwd.com\nszhgong.com\nszhightondz.com\nszhiross.com\nszhjwybj.com\nszhk.com\nszhkhui.com\nszhlodz.com\nszhlsg.com\nszhmjp.com\nszhmkeji.com\nszhnsz.com\nszhome.com\nszhomeimg.com\nszhongshe.com\nszhospital.com\nszhot.com\nszhq.com\nszhqgf.com\nszhqyy.com\nszhqyy120.com\nszhr.com\nszhrh.com\nszhri.com\nszhsdpa.com\nszhstjt.com\nszhsx.net\nszhtp.com\nszhua-gao.net\nszhuace.com\nszhuarong.com\nszhuayilong.com\nszhubei.com\nszhuhang.com\nszhulian.com\nszhuodong.com\nszhvac.org\nszhvs.com\nszhwad.com\nszhxbiz.com\nszhytrip.com\nszhzsd.com\nszhzzl.com\nszicbe.com\nszicc.net\nszicpa.org\nszida.org\nszider.com\nszieg.com\nszihl-bayarea.com\nszihl-port.com\nsziia.org\nszind.com\nszinvent.com\nsziota.com\nszitcare.com\nsziton.com\nszitsa.org\nszjags.com\nszjawest.com\nszjbz.cc\nszjcmr.com\nszjcyljt.com\nszjcyy.com\nszjcyyy.com\nszjdsd.com\nszjfh.com\nszjg.net\nszjgjt.com\nszjhxjt.com\nszjianan.com\nszjiansheng.net\nszjianuo.com\nszjiazhao.com\nszjiexikeji.com\nszjinhejs.com\nszjinhuanyu.com\nszjinke.com\nszjinxinzh.com\nszjitu.com\nszjjedu.com\nszjkhd.com\nszjkp.com\nszjkxh.com\nszjkyun.com\nszjlkt.com\nszjlwul.com\nszjr-tencentclb.cloud\nszjr-tencentclb.com\nszjr-tencentclb.net\nszjr-tencentclb.work\nszjsgroup.com\nszjsjlxh.com\nszjsjt.com\nszjtxm.com\nszjuhaozn.com\nszjunchuang.com\nszjunfei.com\nszjunlin.com\nszjunrong.com\nszjuquan.com\nszjuwx.com\nszjuyou.com\nszjxcft-tencentclb.cloud\nszjxcft-tencentclb.com\nszjxcft-tencentclb.net\nszjxcft-tencentclb.work\nszjxgroup.com\nszjxj.com\nszjy.cc\nszjyos.com\nszjys.net\nszjys1888.com\nszjytx.com\nszjyxtech.com\nszjzdcjt.com\nszkdxx.com\nszkeda.com\nszkegao.net\nszkente.com\nszkete.com\nszkgdesign.com\nszkingdom.com\nszkinks.com\nszkjcn.com\nszkjjs.com\nszkjxh.com\nszknet.com\nszknk.net\nszknys.com\nszknyy.com\nszkoa.com\nszkobo.com\nszkosun.com\nszkqyy.com\nszkrd.com\nszl724.com\nszlaituo.com\nszlande.com\nszlangwei.com\nszlanyou.com\nszlawyers.com\nszlc9.com\nszlcsc.com\nszlcwy.com\nszldcc.com\nszlddb.com\nszlddj.com\nszldzb.com\nszledia.org\nszleezen.com\nszlgzxyy.com\nszlhtram.com\nszlianhua.com\nszlianya.net\nszlightlink.com\nszlihuam.com\nszlilun.com\nszline9.com\nszlinglewangluo.com\nszlingsheng.com\nszlmxx.com\nszlnjt.com\nszlnxh.com\nszlongyu.com\nszlottery.org\nszlqjt.com\nszlsnk.com\nszlswl8.com\nszltech.com\nszltlh.com\nszltour.com\nszltwlw.com\nszlunhua.com\nszluxon.com\nszlvbarcode.com\nszlwbj.com\nszlwtech.com\nszlxl100.com\nszlzsd.com\nszmadigi.com\nszmagellan.com\nszmall.com\nszmama.com\nszmama.net\nszmaxima.com\nszmb.cc\nszmc.net\nszmcjsjt.com\nszmcjt.com\nszmcob.com\nszmctc.com\nszmcy.com\nszmea.net\nszmedtech.com\nszmengqukj.com\nszmgci.com\nszmhthb.com\nszmicrogate.com\nszmieps.com\nszmii.com\nszmil.com\nszmjd.com\nszmjlcd.com\nszmkd.com\nszmrcd.com\nszmsjs.com\nszmslaser.com\nszmtc.com\nszmtxny.com\nszmtzc.com\nszmuseum.com\nszmwzs.com\nszmylike.com\nszmynet.com\nszmys.com\nszmywin.com\nszmyxc.com\nszn360.com\nsznaibeng.com\nsznbm.com\nsznecn.com\nsznewbest.com\nsznews.com\nsznewworld.com\nsznffc.com\nsznfwt.net\nszngdz.com\nszniego.com\nszniushi.com\nsznnhg.com\nszns-marathon.com\nsznsyy.net\nsznumberone.com\nsznwriterhouse.work\nszny189.com\nsznyfz.com\nsznyyznnj.com\nszobk.com\nszol.net\nszolgj.com\nszolxd.com\nszonline.net\nszooo.com\nszoxstand.com\nszp168.com\nszpa.com\nszpa.org\nszpan-china.com\nszpckj.com\nszpclab.com\nszped.com\nszpengfa.net\nszpgm.com\nszpiaoyi.com\nszpldq.net\nszpllp.com\nszplus.com\nszpmi.org\nszporter.com\nszpowerfly.com\nszpra.com\nszprl.com\nszptxx.com\nszputy.com\nszqf.org\nszqhlx.com\nszqhtkyy.com\nszqhyf.com\nszqiangu.com\nszqinyuan.com\nszqjxh.com\nszqp.site\nszqsq.com\nszqt.net\nszquanli.com\nszqycl.com\nszqyw.net\nszqzsd.com\nszrba.org\nszrc-hr.com\nszrcaj.com\nszrcb.com\nszrcfw.com\nszrch.com\nszrfdq.com\nszrfstar.com\nszrgsh.com\nszrhg.com\nszrj.net\nszrlaw.net\nszrrjc.com\nszrsks.com\nszrswj.com\nszrtcpa.com\nszruilan.com\nszrunning.com\nszryc.com\nszrzxh.com\nszs189.com\nszsaibao.com\nszsailong.com\nszsaiwei.com\nszsamr.com\nszsandt.com\nszsangbo.com\nszschj.com\nszschl.com\nszsci.net\nszscree.com\nszsczx.com\nszsdhjt.com\nszsdjrmyy.com\nszsdsrmyy.com\nszseafoodexpo.com\nszseasons.com\nszsemicon.com\nszsep.com\nszsewo.com\nszsfgc.com\nszsh.com\nszshtjm.com\nszshuangjin.com\nszshuori.com\nszshutao.com\nszshwy.com\nszsia.com\nszsing.com\nszsjtjj.com\nszsjxxpt.com\nszskd.com\nszsky.com\nszslcyy.com\nszslhssy.com\nszsmk.com\nszsmyg.com\nszsnk.com\nszsoa.org\nszsolutia.com\nszsongmao.com\nszsorch.com\nszsptk.com\nszsq.net\nszsrs.com\nszssct.com\nszssda.com\nszssep.com\nszssfor.com\nszsswcs.com\nszsszx.com\nszsta.org\nszstar.com\nszstariver.com\nszstartec.com\nszsti.org\nszstndzsw.com\nszstyle.cc\nszsuanli.com\nszsunlaser.com\nszsunwin.com\nszsupvan.com\nszswgcjc.com\nszswjc.com\nszswjs.com\nszsycft-tencentclb.cloud\nszsycft-tencentclb.com\nszsycft-tencentclb.net\nszsycft-tencentclb.work\nszsyyxh.org\nszszjt.com\nszszlm.com\nszszpx.com\nszsztj.com\nsztaijier.com\nsztalent.org\nsztanzo.com\nsztara.com\nsztc.com\nsztcg.com\nsztd123.com\nszte.com\nsztechand.com\nszted.com\nsztexun.com\nszteyin.com\nsztgxc.com\nsztgxx.com\nsztheatre.com\nszthekey.com\nszthxf.com\nsztiaocao.com\nsztino.com\nsztkc.com\nsztkd.com\nsztljyjt.com\nsztmjz.com\nsztncm.com\nsztongwang.com\nsztopbrand.com\nsztower.com\nsztoys.com\nsztqjf.com\nsztreeent.com\nsztspi.com\nsztw96933.com\nsztxcpa.com\nsztxsz.com\nsztxw.com\nszty56.com\nsztz.org\nsztzzs.com\nszuavia.org\nszudad.com\nszunionlab.com\nszurta.org\nszvannylove.com\nszvca.com\nszvft.com\nszvi-bo.com\nszvsdpco.com\nszwa.com\nszwaishi.com\nszwale.com\nszwanghong.com\nszwata.com\nszwb.com\nszwblm.com\nszwchy.com\nszwdny.com\nszwego.com\nszweidi.com\nszweijubao.com\nszweita.com\nszwfhp.com\nszwfzs.com\nszwghl.com\nszwgmf.com\nszwgroup.com\nszwhcycyw.com\nszwhxy.com\nszwldq.com\nszword.com\nszwsm.com\nszwstui.com\nszwtsd.com\nszwudao.com\nszwuyukeji.com\nszwwco.com\nszwzjt.com\nszwzzxyy.com\nszx-ray.com\nszx-tencentclb.cloud\nszx-tencentclb.com\nszx-tencentclb.net\nszx-tencentclb.work\nszx58.com\nszxbbus.com\nszxbjt.com\nszxbyx.com\nszxcqfw.com\nszxcrq.com\nszxcxkf.com\nszxcyl.com\nszxdfpr.com\nszxdhj.com\nszxdzb.com\nszxfgcw119.com\nszxhdz.com\nszxihu.com\nszxijili.com\nszxinghe.net\nszxinjiaxin.com\nszxinjicheng.com\nszxinyixin.com\nszxiot.com\nszxlga.com\nszxljc.com\nszxlxzb.com\nszxs.work\nszxsdmy.com\nszxsshb.com\nszxtiot.com\nszxuexiao.com\nszxuw.com\nszxwlkj.com\nszxxj.com\nszxxtx.com\nszxxw.com\nszxyjd.com\nszxyxbkle.com\nszyake.com\nszyakeda.com\nszyansai.com\nszyazhi.com\nszybio.com\nszycil.com\nszyclmarathon.com\nszydtx.com\nszydxx.net\nszydyy.com\nszyfai.com\nszyfdz.net\nszygcgpt.com\nszyh.org\nszyhja.com\nszyhoa.com\nszyhznkj.com\nszyibei.com\nszyichengjd.com\nszyin.com\nszyingduoduo.com\nszyinglian.com\nszyingzhan.com\nszyink.com\nszyixx.com\nszyiyue.com\nszyjedu.com\nszyljt.com\nszymweb.com\nszyns.com\nszypfb.com\nszyptx.net\nszyqjzxh.com\nszyran.com\nszys.net\nszys119.com\nszysjt.com\nszysmpay.com\nszystea.com\nszysxx.com\nszyt-hosp.com\nszyuda88.com\nszyundingschool.com\nszyuxin.com\nszyweibo.com\nszyxue.com\nszyxwdz.com\nszyxwkj.com\nszyy0373.com\nszyyda.com\nszyyt.com\nszyyx.com\nszyzsy.com\nszzbmy.com\nszzesee.com\nszzfbt.com\nszzfgjj.com\nszzh365.com\nszzhangchu.com\nszzhaodaxin.com\nszzhijun.com\nszzhsponge.com\nszzhuoju.com\nszzkgk.com\nszzljg.com\nszzntech.com\nszznzn.com\nszzoan.com\nszzoo.net\nszzs360.com\nszzscq.com\nszzsivf.com\nszzunbao.com\nszzuting.com\nszzx100.com\nszzxgzy.net\nszzyjt.net\nszzyqc.net\nszzyqy.com\nszzytech.com\nszzywxkj.com\nt-angel.com\nt-d.chat\nt-d.tv\nt-dsyy.com\nt-firefly.com\nt-gafa.com\nt-io.org\nt-npm.com\nt-ocean.com\nt-t.live\nt-tlearning.com\nt-v.com\nt-workshop.com\nt.biz\nt.tt\nt0001.com\nt003005.com\nt00ls.cc\nt00ls.net\nt00y.com\nt016vip20.com\nt016vip28.com\nt016vip7.com\nt0377.com\nt086.com\nt1.ink\nt10.com\nt105.com\nt11.co\nt123yh.xyz\nt139.com\nt178.info\nt1networks.com\nt1qq.com\nt1tms.com\nt1y4.com\nt1y5.com\nt20000.com\nt2audio.net\nt2cn.com\nt2uu.com\nt3315.com\nt3j4.com\nt3yanzheng.com\nt47888.com\nt49cdn.com\nt4x3.com\nt4z5p5s9k4q3m4h4m3.org\nt5.work\nt50888.com\nt528.com\nt56.net\nt56jy.net\nt5tm.com\nt5xs.com\nt66.com\nt6q.com\nt7114.com\nt7805.com\nt79d6.com\nt7rt5.com\nt7y8.com\nt7z.cc\nt85.net\nt8703hd304.com\nt888w.com\nt8f.com\nt8tcdn.com\nt8tms.com\nt8ui6xzkw.shop\nt99677.com\nt9in.com\nt9tms.com\nta-ly.com\nta-shang.com\nta26.com\nta313.com\nta39.com\ntaaas.org\ntaagoo.com\ntabalt.net\ntabbitbrowser.com\ntabbypro.com\ntabbywork.com\ntableauxmly.com\ntabuzhe.com\ntabxexplorer.com\ntachangxing.com\ntactan.net\ntadgkj.com\ntadiao365.com\ntadsim.com\ntadsim.net\ntadu.com\ntadyz.com\ntaeapp.com\ntaeee.com\ntafeihu.com\ntag.gg\ntagen-pm.com\ntagjjt.com\ntaglyst.com\ntagold.net\ntagoo.club\ntagphi.net\ntaguage.com\ntaguxdesign.com\ntahoecn.com\ntahua.net\ntai-liang.com\ntai1000.com\ntai3399.com\ntai87.com\ntaian.com\ntaianmedia.com\ntaiantang.net\ntaibumall.com\ntaicang.info\ntaicent.com\ntaichi-graphics.com\ntaichi-maker.com\ntaichuan.com\ntaichuan.net\ntaici.com\ntaicihome.com\ntaicike.com\ntaida-china.com\ntaida100.com\ntaidao.net\ntaidaxincai.com\ntaidichina.com\ntaidu.com\ntaiduhome.com\ntaiergroup.com\ntaifeng.co\ntaifengfans.com\ntaifua.com\ntaig.com\ntaigaoxiao.com\ntaihaikj.com\ntaihainet.com\ntaihe-hr.com\ntaihe.com\ntaihealthcare.com\ntaihecap.com\ntaihechengjian.com\ntaihehospital.com\ntaihemedia.com\ntaihopaint.com\ntaihuachem.com\ntaihuapharm.com\ntaihuawj.com\ntaihuboiler.com\ntaihucn.com\ntaihuoniao.com\ntaihutour.com\ntaihuwang.com\ntaihuwater.com\ntaihuxue.com\ntaihuyuan.com\ntaihuzimi.com\ntaiji.com\ntaijidf.com\ntaijiewuliu.com\ntaijiny.com\ntaijio.com\ntaijs.com\ntaijutv.com\ntaikaibyq.com\ntaikaihuanbao.com\ntaikancnc.com\ntaikang.com\ntaikanginv.com\ntaikangjsnc.com\ntaikanglife.com\ntaikanglife.net\ntaikangonline.com\ntaikangonline.net\ntaikangph.com\ntaikangzhijia.com\ntaikeji.com\ntaikewei.com\ntaikongmedia.com\ntaikoohui.com\ntaikoyc.com\ntaikr.com\ntailgdd.com\ntailingood.com\ntailixiangjiao.com\ntaillkang.com\ntailong.com\ntaimei.com\ntaimi100.com\ntaimls.com\ntainengchong.com\ntaininge.online\ntainingrencai.com\ntaiorient.com\ntaiott.com\ntaipingyangshuiwu.com\ntaipumed.com\ntaiqiedu.com\ntaiqigame.com\ntaiquan.com\ntairock.com\ntairos.cc\ntairos.net\ntairos.tech\ntairui-ad.com\ntais3.com\ntaisantech.com\ntaisenfurniture.com\ntaishangroup.com\ntaishansports.com\ntaishanxq.com\ntaishanyy.com\ntaisuyun.com\ntaitonglj.com\ntaiwandao.tw\ntaiwanwii.com\ntaiweiholding.com\ntaiwoagri.com\ntaiwu.com\ntaixi.cc\ntaixigas.com\ntaixingren.com\ntaixirobot.com\ntaixubio.com\ntaixuguoji.com\ntaiyangd.com\ntaiyanghttp.com\ntaiyechem.com\ntaiyin117.com\ntaiyiplus.com\ntaiyocablecn.com\ntaiyou.fund\ntaiyuanguanye.com\ntaiyuanqy.com\ntaizhoucitymarathon.com\ntaizhouwater.com\ntaizibao.com\ntajd.net\ntaji-ai.com\ntajiduo.com\ntakebackthegrid.org\ntakesend.com\ntakfat.com\ntakhogroup.com\ntakstar.com\ntakumi-cnc.com\ntakungpao.com\ntakusogroup.com\ntakwang.net\ntal-china.com\ntal.com\ntalbrain.com\ntalebase.com\ntalegenes.com\ntalentable.com\ntalentlin.com\ntalentran.com\ntalents-tech.com\ntalentsmag.com\ntalentspotgroup.com\ntalicai.com\ntaliove.com\ntaljdns.com\ntalk-cloud.net\ntalk-fun.com\ntalk.ai\ntalk915.com\ntalkgw.com\ntalkingchina.com\ntalkwithtrend.com\ntalkxj.com\ntalkyun.com\ntalldns.com\ntalldns.net\ntallgu.com\ntalmdhome.com\ntaluo.com\ntaluo5.com\ntaluoji.com\ntalzjsj.com\ntamaegis.com\ntamarace.com\ntamayaki.com\ntamc8.com\ntamensay.com\ntamersunion.net\ntamigos.com\ntamigroup.com\ntamlab.net\ntamll.com\ntan-gtr.com\ntan.cc\ntan07.com\ntan14.net\ntan8.com\ntanapk.com\ntanaqul.org\ntanbao178.com\ntanbj7wflr.com\ntanbo.name\ntanboer.com\ntancdn.com\ntanchinese.com\ntandehao.com\ntandfonline.com\ntanewmaterial.com\ntang-lei.com\ntanganlingshi.com\ntangbai.cc\ntangbolitangci.com\ntangchendoor.com\ntangdaoya.com\ntangdou.com\ntangdouddn.com\ntangdouedn.com\ntangdoufdn.com\ntangdouhdn.com\ntangdouimg.com\ntangdouz.com\ntangeche.com\ntangfc.com\ntanggu11g.com\ntangguobaohe.com\ntanghu.net\ntanghushi.com\ntangjie.me\ntangjihuang.com\ntangkabj.com\ntanglei.name\ntangmingint.com\ntangoic.com\ntangongye.com\ntangpai.cc\ntangping.com\ntangqingtuia1.com\ntangrenmedia.com\ntangruiqian.com\ntangsanshu.com\ntangsem.com\ntangshan-marathon.com\ntangshanliulin.net\ntangshuang.net\ntangshui.net\ntangsongys.com\ntangsuanradio.com\ntangtang.org\ntanguan.net\ntangux.com\ntangwai.com\ntangxia.xin\ntangxiagoodview.com\ntangyeedu.com\ntangyoufushi.fun\ntangyuan.com\ntanhaibo.net\ntanho.com\ntanjigroup.com\ntanjing.online\ntanjiyongjun.com\ntankeai.com\ntankmm.com\ntankprint.online\ntanksuv.com\ntankywoo.com\ntanling.com\ntanlive.com\ntanlong.org\ntanluxia.com\ntanma.tech\ntanmer.com\ntanpaifang.com\ntanpoqiuer.com\ntanshudata.com\ntansiling.com\ntansoole.com\ntantaly.com\ntantan123.com\ntantanapp.com\ntantu.com\ntantu.info\ntantuw.com\ntanwan.com\ntanwan123.net\ntanwanmao.net\ntanweime.com\ntanwuapp.com\ntanxingfuli.com\ntanxinyu.work\ntanxlog.istreamsche.com\ntanxuling.com\ntanyu.mobi\ntanyuantech.com\ntanzhouwater.com\ntao-che-wei.com\ntao-jiujiu.com\ntao-star.com\ntao-studio.net\ntao-wu.com\ntao008.com\ntao123.com\ntao3.cc\ntao33.com\ntao37.com\ntao3c.com\ntao66.com\ntao800.com\ntao8090.com\ntaoa.com\ntaoad.com\ntaoart.com\ntaoban.com\ntaobao-img.com\ntaobao.com\ntaobao.global\ntaobao.net\ntaobao.org\ntaobao.tw\ntaobao1111.com\ntaobaocdn.com\ntaobaocity.com\ntaobaotest.com\ntaobaotesting.com\ntaobeihai.com\ntaobiaozu.com\ntaobizhong.com\ntaoc.cc\ntaocange.com\ntaocdn.com\ntaoche.com\ntaocheche.com\ntaoci.com\ntaoci163.com\ntaocibao.com\ntaocijiaju.com\ntaocloudx.com\ntaocz.com\ntaodake.com\ntaodang8.com\ntaodaso.com\ntaodaxiang.com\ntaodianla.com\ntaodingzhi.cc\ntaodiqupu.com\ntaodocs.com\ntaodu.com\ntaoduoke.com\ntaodushi.cc\ntaoerge.com\ntaoex.com\ntaofake.com\ntaofang.com\ntaofanghaiju.com\ntaofeige.com\ntaofen8.com\ntaofont.com\ntaogede.com\ntaogegou.com\ntaogepian.com\ntaogouxingxuan.com\ntaogutang.com\ntaohao6.com\ntaohaoba.com\ntaohaobang.com\ntaohaoge.com\ntaohaoqu.com\ntaohaowan.com\ntaohhui.com\ntaohua.com\ntaohuaqizhi.com\ntaohuazu.net\ntaohuazu.pw\ntaohui.pub\ntaohuren.com\ntaoic.com\ntaojiaju8090.com\ntaojianghu.com\ntaojiji.com\ntaojin6.com\ntaojindi.com\ntaojingame.com\ntaojingroup.com\ntaojinhudong.com\ntaojinji.com\ntaojinyi.com\ntaoke.com\ntaokewenan.com\ntaokezhushou.com\ntaokouling.com\ntaoktv.com\ntaoku.com\ntaokuaibiao.com\ntaolale.com\ntaoliangroi.com\ntaolinzhen.com\ntaolvtong.com\ntaolx.com\ntaomanhua.com\ntaomee.com\ntaomeiju.com\ntaomeixie.com\ntaoming.com\ntaomingshi.com\ntaomingyan.com\ntaomobao.com\ntaomr.com\ntaonanfu.com\ntaonienie.com\ntaoniu.com\ntaoniupin.com\ntaoonelogistics.com\ntaooo.cc\ntaopb.com\ntaopian.org\ntaopiaopiao.com\ntaopic.com\ntaopinquan.com\ntaopuwang.com\ntaopxx.com\ntaoq.net\ntaoqao.com\ntaoquanquan.com\ntaor.work\ntaoruinyuan.com\ntaosaas.com\ntaosdata.com\ntaosha.club\ntaoshengtc.com\ntaoshouyou.com\ntaoshu.com\ntaoshuashua.net\ntaoshudang.com\ntaosj.com\ntaotao.com\ntaotaocar.com\ntaotaoit.com\ntaotaosports.com\ntaoth.com\ntaotian.com\ntaotu8.net\ntaotv.com\ntaotv.net\ntaou.com\ntaourl.com\ntaowangzhan.com\ntaoweng.site\ntaoxiangyoushu.com\ntaoxiaolu.com\ntaoxie.com\ntaoxie.com.tw\ntaoxuemiao.com\ntaoxv.com\ntaoyi-support.com\ntaoyitu.com\ntaoyizhu.com\ntaoyougou.com\ntaoyuanc.com\ntaoyuewenhua.net\ntaoyutaole.com\ntaozg.store\ntaozhanyun.com\ntaozhibook.com\ntaozhuo.com\ntaozhutu.com\ntap-ad.com\ntapafun.com\ntapai.com\ntapaijiu.com\ntapapis.com\ntapapks.com\ntapbooster.net\ntapd-app.com\ntapdata.net\ntapenjoy.com\ntapimg.com\ntapjoytech.com\ntapotiexie.com\ntappile.com\ntapque.com\ntaprls.com\ntaprls.net\ntapsvc.com\ntaptap-api.com\ntaptap.com\ntaptapcode.com\ntaptapdada.com\ntapurl.com\ntaraniss.com\ntarcoist.com\ntarczp.com\ntarenacn.com\ntarenwang.net\ntargetportion.com\ntarisland-zh.com\ntaro.zone\ntarotchina.net\ntarsier-infra.com\ntarsocial.com\ntartscenter.com\ntasaiwang.com\ntaschb.com\ntashine.com\ntasiyun.com\ntask51.com\ntaskcity.com\ntasly.com\ntaslypharma.com\ntastespirit.com\ntastien-external.com\ntastientech.com\ntastysteak.com\ntaswwx.com\ntaszk.com\ntaszls.com\ntatatimes.com\ntataxingqiu.com\ntatazu.com\ntaterli.com\ntatfook.com\ntatiqrf.com\ntatstm.com\ntattoo77.com\ntattooo.net\ntaurentech.net\ntauris.com\ntaurus66.com\ntaurusxin.com\ntav-global.com\ntav-global.net\ntavsiktlig.com\ntawk.link\ntax-edu.net\ntax.vip\ntax100.com\ntaxchina.com\ntaxdata.tax\ntaxjiangkewang.com\ntaxksec.com\ntaxnote.org\ntaxspirit.com\ntaxtaoj.xyz\ntaxuspharm.com\ntaxwen.com\ntayohya.com\ntazai.com\ntazhe.com\ntazts.com\ntb-whatsapp.com\ntb.biz\ntb.pub\ntb51.net\ntb58.net\ntbaas.tech\ntbadc.com\ntbadesign.org\ntbaiq.com\ntbankw.com\ntbapp.com\ntbcache.com\ntbcdn.com\ntbh5.com\ntbhcc.com\ntbhelper.com\ntbizmail.com\ntbjt18.com\ntbjtss.com\ntbk-app.com\ntbkf.net\ntbkong.com\ntbl-import.com\ntblk.me\ntbmcas.com\ntbmkt.com\ntbnimg.com\ntboxn.com\ntbpark.com\ntbq168.com\ntbqjx.com\ntbreeden.com\ntbs321.com\ntbsandbox.com\ntbshare123.com\ntbsite.net\ntbt-tuning.com\ntbt168.com\ntbtopc.com\ntburl.in\ntbuser.com\ntbwyl.com\ntbxsw.com\ntbyfsoft.com\ntc-21.com\ntc-mining.com\ntc-semi.com\ntc0770.com\ntc108.com\ntc118.com\ntc12580.com\ntc199.net\ntc29.com\ntc29.net\ntc471cyhud.com\ntc58.net\ntc880.com\ntc9011.com\ntc930.com\ntcbqcloud.com\ntccfjt.com\ntccrtzyxgs.com\ntccxfw.com\ntcdinfo.com\ntcdj.com\ntcdlive.com\ntcdneo.com\ntcdneo.net\ntcdnext.com\ntcdnhw.com\ntcdnhw.net\ntcdnkc.com\ntcdnkcbak.com\ntcdnlive.com\ntcdnlivebak1.com\ntcdnlivebak2.com\ntcdnlp.com\ntcdnos.com\ntcdnos.net\ntcdntip.com\ntcdnv3.com\ntcdnvod.com\ntcdnvodbak.com\ntcdnvodnew.com\ntcdnvp.com\ntcdnzb.com\ntcdushi.com\ntcecps.org\ntced-transsion.com\ntcedshare.com\ntceic.com\ntcenn.com\ntceratronix.com\ntcfhty.com\ntcfmglobal.com\ntcgcardgame.com\ntcgdxyb.xyz\ntcggkj.com\ntcgke.com\ntcgsw.com\ntchbgz.com\ntchbsb.com\ntchong.com\ntchy.net\ntchzt.com\ntchzx.com\ntciplay.com\ntcisct.com\ntcjdcapital.com\ntcjx688.com\ntckjfast.com\ntckjhigh.com\ntckwj.com\ntcl-cctv.com\ntcl.com\ntclbusiness.com\ntclclouds.com\ntcljd.com\ntclking.com\ntclkqn.com\ntclogx.com\ntcloud19.com\ntcloudbase.com\ntcloudbase.net\ntcloudbaseapi.com\ntcloudbaseapp.com\ntcloudbasegateway.com\ntcloudbasestatic.com\ntcloudbh.com\ntcloudbi.com\ntclouddrive.com\ntcloudedu.com\ntcloudfamily.com\ntcloudhw.com\ntcloudhw.net\ntcloudit.com\ntcloudit.net\ntcloudlive.com\ntcloudscdn.com\ntcloudscdn.net\ntcltech.com\ntclyjg.com\ntcm100.com\ntcm360.com\ntcmer.com\ntcmfrj.com\ntcmmh.com\ntcmppcloud.com\ntcmwindow.com\ntcnen.com\ntcnews.cc\ntcnvmms.com\ntcoejox.shop\ntcomall.com\ntcp.hk\ntcp.mk\ntcp.pub\ntcp5.com\ntcping8.com\ntcqmj.com\ntcrcb.com\ntcrcsc.com\ntcs-y.com\ntcsae.org\ntcsasac.com\ntcsdk.com\ntcsdzz.com\ntcseny.com\ntcsisu.com\ntcsnake.com\ntcspbj.com\ntcstzg.com\ntcsurg.org\ntctip.com\ntctong.com\ntctpwebank.com\ntctpwebankcdn.net\ntctpxwebank.com\ntctran.com\ntctz.com\ntcvywoh.com\ntcwqqdy.guru\ntcwt.net\ntcxmt.com\ntcxw.cc\ntcxwg.com\ntcxx1985.com\ntcxys.com\ntcxzj.com\ntcy1688.com\ntcy365.com\ntcy365.net\ntcyad.com\ntcyfw.com\ntcylgslb.com\ntczgwzw.com\ntczj.net\ntczmled.com\ntd-sf.com\ntd-tech.com\ntd22.com\ntd2cn.com\ntd300321.com\ntd776.com\ntd96.com\ntd98.com\ntdances.com\ntdasz.com\ntdatamaster.com\ntdataspace.com\ntdbbj.com\ntdchats.us\ntdchatvip.us\ntdd.la\ntdfsm.com\ntdgdy.org\ntdgod.com\ntdiac.com\ntdict.com\ntdimg.com\ntdjxhb.com\ntdkchina.com\ntdlcdn.com\ntdlcdn.net\ntdmall.cc\ntdmoli2.com\ntdmta.com\ntdns127.com\ntdnsdlovs1.com\ntdnsdlovs2.com\ntdnsdlovs3.com\ntdnsdlovs4.com\ntdnsdlovs5.com\ntdnsdp.com\ntdnsdpovs1.com\ntdnsdpovs2.com\ntdnsdpovs3.com\ntdnsdpovs4.com\ntdnsdpovs5.com\ntdnsliveovs1.com\ntdnsliveovs2.com\ntdnsliveovs3.com\ntdnsliveovs4.com\ntdnsliveovs5.com\ntdnspub.com\ntdnspub.net\ntdnsspovs1.com\ntdnsspovs2.com\ntdnsspovs3.com\ntdnsspovs4.com\ntdnsspovs5.com\ntdnssticovs1.com\ntdnssticovs2.com\ntdnssticovs3.com\ntdnssticovs4.com\ntdnssticovs5.com\ntdnsv1.com\ntdnsv1.net\ntdnsv10.com\ntdnsv10.net\ntdnsv11.com\ntdnsv11.net\ntdnsv12.com\ntdnsv12.net\ntdnsv13.com\ntdnsv13.net\ntdnsv14.com\ntdnsv14.net\ntdnsv15.com\ntdnsv15.net\ntdnsv2.com\ntdnsv2.net\ntdnsv3.com\ntdnsv3.net\ntdnsv4.com\ntdnsv4.net\ntdnsv5.com\ntdnsv5.net\ntdnsv6.com\ntdnsv6.net\ntdnsv7.com\ntdnsv7.net\ntdnsv8.com\ntdnsv8.net\ntdnsv9.com\ntdnsv9.net\ntdnsvodovs1.com\ntdnsvodovs2.com\ntdnsvodovs3.com\ntdnsvodovs4.com\ntdnsvodovs5.com\ntdnsx1.com\ntdotapp.com\ntdpress.com\ntdqs.com\ntdrffh.com\ntds-1300.com\ntdsf.asia\ntdsfiles.com\ntdshbao.com\ntdsjbj.com\ntdtbd.com\ntdtec.com\ntdun.com\ntduou.com\ntdwan.com\ntdxz.net\ntdyxmoto.com\ntdzntech.com\ntdzyw.com\nte-ch.tech\nte-silicone.com\nte160.com\nte5.com\nte6.com\ntea-gd.com\ntea26.com\ntea7.com\nteach365.com\nteachblog.net\nteachclinic.com\nteachcn.net\nteachercn.com\nteachers211.com\nteachertc.com\nteakki.com\nteaku.com\nteallang.com\ntealui.com\nteamall.cc\nteambition.com\nteambition.io\nteambition.net\nteambitionapis.com\nteamlogs.com\nteamminus.com\nteamotto.net\nteamshub.com\nteamtop.com\nteamtopgame.com\nteandy.com\nteatreexy.com\ntebaidu.com\ntebiao.net\ntebie6.com\ntebiefuza.cloud\ntebiezan.com\ntebiezhuan.com\nteboncapital.com\ntec73.com\ntecbbs.com\ntecenet.com\ntech-long.com\ntech-mx.com\ntech-now.com\ntech-sem.com\ntech-sonic.net\ntech002.com\ntech1024.com\ntech110.net\ntech2ipo.com\ntech2real.com\ntech4joy.com\ntechan.com\ntechannet.com\ntechanshop.com\ntechantong.net\ntechbeat.net\ntechbrood.com\ntechdow.com\ntechfine.net\ntechflowpost.com\ntechgastronomy.com\ntechgogogo.com\ntechigh.net\ntechingrid.net\ntechmiao.com\ntechmoris.com\ntecho.chat\ntecho.pub\ntecho.show\ntechoke.com\ntechonegame.com\ntechqianmo.com\ntechsir.com\ntechsize.com\ntechtmt.com\ntechtop.com\ntechuangyi.com\ntechub.news\ntechug.com\ntechvisum.com\ntechwalker.com\ntechwell-cn.com\ntechwin.com\ntechxue.com\nteclast.com\ntecmz.com\ntecochina.net\ntecolighting.com\ntecompharma.com\ntecreal.com\ntecyle.com\nteda-veolia.com\ntedagas.com\ntedahotel.com\ntedahr.com\ntedaich.com\ntedaniu.com\ntedastock.com\nteddycc.com\nteddymobile.net\ntedushi.com\ntedx.net\ntedy.cc\nteejia.com\nteeqee.com\ntefact.com\ntefl-china.net\ntefscloud.com\ntefscloud.net\ntefshipping.com\ntegongji.com\ntegoushe.com\ntegvzpvz.com\ntehang.com\ntehub.com\ntehuituan.com\nteilei.com\ntejiabiao.com\ntejiawang.com\ntek-asia.com\ntekkenthree.com\ntekshanghai.com\ntekuaijie.com\ntel01.com\ntelaideyouxue.com\nteld.net\ntelecomhb.com\ntelecomhr.com\ntelecomjs.com\ntelefen.com\ntelegerlam.cc\ntelegramcn.co\ntelegramggo.com\ntelegramtoke.com\ntelegramyug.cc\ntelegroiam.cc\ntelehr.com\nteleinfoo.com\ntelekoml.cfd\nteleland.net\ntelemgrasm.cc\nteleows.com\ntelergaemoam.cc\ntelevivi.com\ntelfri.net\nteligen-cloud.com\nteligen.net\nteliute.org\ntelking.com\ntell520.com\ntellgen.com\ntelling.com\ntellingtech.com\ntelllove520.com\ntellmachgd.com\ntelnet404.com\ntelongzn.com\ntelpo.com\ntelrgeam.cc\ntelsda.com\ntelu.net\ntelunsu.net\ntem.pw\ntemaiapi.com\ntemaiku.com\ntemch.net\ntemedical.com\ntemox.com\ntemp.im\ntempersyi.com\ntemyee.com\nten.design\ntenag.com\ntenant-zone-dev.com\ntenbilliongame.com\ntencdns.com\ntencdns.net\ntencenst.com\ntencent-blackboard.com\ntencent-cloud.com\ntencent-cloud.net\ntencent-education.com\ntencent-gcloud.com\ntencent-gf.com\ntencent-qejs.com\ntencent-stock.com\ntencent.co.id\ntencent.com\ntencent.com.hk\ntencent.design\ntencent.net\ntencentads.com\ntencentads.net\ntencentadx.com\ntencentanxin.com\ntencentapigw.com\ntencentapis.com\ntencentapp.com\ntencentapps.com\ntencentbh.com\ntencentbyod.com\ntencentcc.com\ntencentcdb.com\ntencentcds.com\ntencentcfs.com\ntencentciam.com\ntencentclb.cc\ntencentclb.cloud\ntencentclb.com\ntencentclb.host\ntencentclb.info\ntencentclb.link\ntencentclb.net\ntencentclb.online\ntencentclb.plus\ntencentclb.pro\ntencentclb.site\ntencentclb.space\ntencentclb.team\ntencentclb.tech\ntencentclb.top\ntencentclb.vip\ntencentclb.work\ntencentclb.zone\ntencentcloud-aiot.com\ntencentcloud-demo.com\ntencentcloud.com\ntencentcloud.io\ntencentcloudapi.com\ntencentcloudapimarket.com\ntencentcloudapp.com\ntencentcloudbase.com\ntencentcloudbase.net\ntencentcloudclub.com\ntencentcloudcore.com\ntencentcloudcr.com\ntencentcloudcs.com\ntencentcloudga.com\ntencentcloudga001.com\ntencentcloudga001.net\ntencentcloudga002.com\ntencentcloudga002.net\ntencentcloudga003.com\ntencentcloudga003.net\ntencentcloudga004.com\ntencentcloudga004.net\ntencentcloudga005.com\ntencentcloudga005.net\ntencentcloudga006.com\ntencentcloudga006.net\ntencentcloudga007.com\ntencentcloudga007.net\ntencentcloudga008.com\ntencentcloudga008.net\ntencentcloudga009.com\ntencentcloudga009.net\ntencentcloudga010.com\ntencentcloudga010.net\ntencentcloudga011.com\ntencentcloudga011.net\ntencentcloudga012.com\ntencentcloudga012.net\ntencentcloudga013.com\ntencentcloudga013.net\ntencentcloudga014.com\ntencentcloudga014.net\ntencentcloudga015.com\ntencentcloudga015.net\ntencentcloudga016.com\ntencentcloudga016.net\ntencentcloudga017.com\ntencentcloudga017.net\ntencentcloudga018.com\ntencentcloudga018.net\ntencentcloudga019.com\ntencentcloudga019.net\ntencentcloudga020.com\ntencentcloudga020.net\ntencentcloudga021.com\ntencentcloudga021.net\ntencentcloudga022.com\ntencentcloudga022.net\ntencentcloudga023.com\ntencentcloudga023.net\ntencentcloudga024.com\ntencentcloudga024.net\ntencentcloudga025.com\ntencentcloudga025.net\ntencentcloudga026.com\ntencentcloudga026.net\ntencentcloudga027.com\ntencentcloudga027.net\ntencentcloudga028.com\ntencentcloudga028.net\ntencentcloudga029.com\ntencentcloudga029.net\ntencentcloudga030.com\ntencentcloudga030.net\ntencentcloudipv6.com\ntencentcloudlab.com\ntencentcloudlive.com\ntencentcloudmarket.com\ntencentcloudmq.com\ntencentcloudns.com\ntencentcloudsandbox.com\ntencentcloudsec.com\ntencentcloudses.com\ntencentcloudsso.com\ntencentcls.com\ntencentcmq.com\ntencentcode.com\ntencentcomics.com\ntencentconsulting.com\ntencentcos.cloud\ntencentcos.com\ntencentcos.net\ntencentcs.com\ntencentcsms.com\ntencentdayu.com\ntencentdb.com\ntencentddos.com\ntencentdevices.com\ntencentdigitalassistant.com\ntencentdmp.com\ntencentdms.com\ntencentedi.com\ntencentehs.com\ntencenteiam.com\ntencentelasticsearch.com\ntencentemr.com\ntencentes.com\ntencentexpert.com\ntencentfanyi.com\ntencentff.com\ntencentfilm.com\ntencentfoundation.org\ntencentga.com\ntencentgames.co\ntencentgames.us\ntencentgme.com\ntencentgse.com\ntencentgy.com\ntencenthangjia.com\ntencentiam.com\ntencenticp.com\ntencentid.com\ntencentidaas.com\ntencentidentity.com\ntencentimage.com\ntencentimage.net\ntencentiotcloud.com\ntencentiotmedia.com\ntencentipv6.com\ntencentlegalservices.com\ntencentlink.com\ntencentlkfz.com\ntencentlog.com\ntencentmail.com\ntencentmdb.com\ntencentmeeting.com\ntencentmfa.com\ntencentmovie.com\ntencentmusic.com\ntencentoa.com\ntencentoceanus.com\ntencentpay.com\ntencentpic.com\ntencentproxy.com\ntencentrce.com\ntencentrcpcsdk.com\ntencentresearch.com\ntencentrio.com\ntencentscf.com\ntencentsecsdk.com\ntencentserverless.com\ntencentservicewatcher.com\ntencentses.com\ntencentsite.com\ntencentsmhcname.com\ntencentsmhuc.com\ntencentsource.com\ntencentstart.com\ntencentsuite.com\ntencentsurvey.com\ntencentsurvey.net\ntencenttcr.com\ntencenttdai.com\ntencenttdmq.com\ntencenttds.com\ntencenttid.com\ntencenttione.com\ntencenttree.com\ntencenttrtc.com\ntencenttymaas.com\ntencentud.com\ntencentvpc.com\ntencentweiban.com\ntencentwemeet.club\ntencentwepark.com\ntencentwf.com\ntencentwm.com\ntencentwukong.com\ntencentxinge.com\ntencentyouth.com\ntencentyun.com\ntencentzhzf.com\ntenchii.com\ntencity.com\ntendacn.com\ntendawifi.com\ntendbcluster.com\ntendbcluster.net\ntendcode.com\ntendfo.com\ntendis.net\ntendrones.com\ntendyron.com\ntengamy.com\ntenganxinxi.com\ntengbai-it.com\ntengbenyueji.com\ntengbo.cc\ntengchangjiancai.com\ntengchu.com\ntengdatumu.com\ntengdawl.com\ntengdazuche.com\ntengen.com\ntengfangyun.com\ntengfeidn.com\ntengfeijob.com\ntengfeizhida.com\ntengfun.com\ntenghen.com\ntenghesmart.com\ntenghoo.com\ntengkackjr.com\ntengkaxx.com\ntenglong.net\ntenglonggroup.com\ntengmed.com\ntengmoney.com\ntengning.net\ntengnu999.com\ntengnuobx.com\ntengrant.com\ntengshengchina.com\ntengshiauto.com\ntengtiegongyi.com\ntengwen.com\ntengxuan.net\ntengxunlct.com\ntengxunqiye.com\ntengxunqiyeyou.com\ntengy.com\ntengya.com\ntengyang666.com\ntengye-vc.com\ntengyeshiye.com\ntengyu-group.com\ntengyuejz.com\ntengyunqq.com\ntengzhihh.com\ntengzhipp.com\ntengzhou0632.com\ntengzhuan.com\ntenhot.net\ntenio.com\ntenjia.cc\ntenjincn.com\ntenkent.com\ntenlonstudio.com\ntenmh.com\ntennny.com\ntennoo.com\ntenorforman.com\ntenorshare.com\ntenorshare.tw\ntenovatech.com\ntenpay.com\ntenqent.com\ntenrays.com\ntensafe.com\ntensgpt.com\ntenshi.cc\ntensorchip.com\ntensorflownews.com\ntensorlet.org\ntenstars.net\ntensuntrans.com\ntensure.com\ntensynchina.com\ntentech.club\ntentrue.com\ntentx.com\ntenwowfood.com\ntenwukong.com\ntenxapp.com\ntenxcloud.com\ntenxcloud.net\ntenyn.com\nteo-rum.com\nteoacc.com\nteoacc.net\nteodns.com\nteodns.net\nteown.com\ntepcb.com\ntepin.hk\nterabuy.com\nterapark.com\nterapines.com\nterencemusic.com\nteresahowarddoula.com\nteridge.com\nterminal.icu\nterminus.io\nterose.com\nterra-master.com\nterran.tech\nterransforce.com\nterratribes.com\nterrypacking.com\nterrytec.com\nteruide.net\ntese5.com\ntesery.com\ntesexiu.com\nteshenqi.com\ntesight.com\ntesiro.com\ntesolsh.com\ntesoon.com\ntest-cignacmb.com\ntest.gbugs-qa.chromium.org\ntestbird.com\ntestcoo.com\ntestdemo.work\ntesteb.com\ntesteck.com\ntesterhome.com\ntestict.com\ntestin.im\ntestingpai.com\ntestinsight.net\ntestlrq.com\ntestmrrvendor.com\ntestroad.org\ntestrust.com\ntestshm.com\ntestsparkling.com\ntestwaf.com\ntestwo.com\ntestxy.com\ntesys.online\ntetcm.com\ntetegu.com\nteteyu.com\ntetrisone.com\ntetuijiudian.com\nteuhui.com\nteuxipet.com\ntevachem.com\ntewsiext.com\ntex68.com\ntexasholdemcup.com\ntexasholdemcup.net\ntexpage.com\ntexpageusercontent.com\ntexpro-group.com\ntextaihua.com\ntextin.com\ntexzhongtao.com\nteyonds.com\nteyop.com\ntez-tencentclb.cloud\ntez-tencentclb.com\ntez-tencentclb.net\ntezhengma.com\ntezhongzhuangbei.com\ntezign.com\ntf-bm.com\ntf.wiki\ntf56.com\ntfauto.net\ntfax.com\ntfbestea.com\ntfbird.com\ntfbkw.com\ntfbx.net\ntfcaijing.com\ntfcloud.com\ntfclub.com\ntfcsz.com\ntfdsb.org\ntfedu.net\ntfeic.com\ntfengyun.com\ntff.bz\ntfg2.com\ntfgame.vip\ntfgas.com\ntfgvb.com\ntfidc.net\ntfkj.games\ntfkyj.com\ntflzhongkongban.com\ntfme.com\ntfmywood.com\ntfogc.com\ntfogc.net\ntfoison.com\ntfol.com\ntfoyin.com\ntfrl.net\ntfs906.com\ntfsb.net\ntfsino.com\ntfsmy.com\ntftplay.com\ntfvisa.com\ntfxqrmyy.com\ntfyum.net\ntfzikao.com\ntfzq.com\ntg-vision.com\ntg-vision.net\ntg0123.com\ntg1234.com\ntg138.com\ntgametalent.com\ntgbus.com\ntgcid.org\ntgcondo.com\ntgcook.com\ntgcyber.com\ntgect.com\ntgeosmart.com\ntggypn.com\ntgjbs.work\ntgjh.com\ntgking.net\ntgkjjg.com\ntgldfm.com\ntgljw.com\ntglxh.com\ntgnet.com\ntgo-ai.com\ntgovcloud.com\ntgprocs.net\ntgr365.com\ntgshiguan.com\ntgslsst.com\ntgstech.com\ntgtenty.com\ntgtest.site\ntgtianshanga.com\ntguangxue.com\ntgxuwgdi.com\ntgzhz.com\ntgzwmk.xyz\nth-sjy.com\nth-tencentclb.cloud\nth-tencentclb.com\nth-tencentclb.net\nth-tencentclb.work\nth-water.net\nth.bing.com\nth38.com\nth99.com\nthailycare.com\nthaivor.com\nthaiyellowpagesusa.com\nthakjsbyy.com\nthamco.com\nthanju.com\nthankbabe.com\nthankyou99.com\nthankyoumaris.com\nthanmelin.com\nthape.com\nthatinterpreter.net\nthatsmags.com\nthatsmandarin.com\nthatwind.com\nthboiler.com\nthcad.net\nthcantech.com\nthcf168.com\nthclouds.com\nthdangzhun.com\nthdb.com\nthe-dahan.com\nthe4can.com\nthe5fire.com\nthe9.com\ntheantiagingshow.com\nthearenacapital.com\nthearyong.com\ntheateliercouture.com\nthebeastshop.com\nthebeijinger.com\nthebeijingnews.com\nthebird-air.com\nthebizark.com\nthebuddycreative.com\nthecalicocafepa.com\nthecfa.info\nthechois.cc\nthecodeway.com\nthedatasys.com\nthederma.com\ntheduapp.com\nthedutchman.org\nthefastcdns.com\nthefastfile.com\nthefastimg.com\nthefastmake.com\nthefastvideo.com\nthefilehosting.com\nthefrodo.com\nthegiac.com\nthegoods.asia\nthegraduation.store\nthegreatwall-china.com\nthehanshow.com\ntheheirism.com\ntheicstock.com\nthejamy.com\nthejiangmen.com\nthejie.com\nthejoyrun.com\nthekunlunbeijing.com\nthekunlunjingan.com\nthelalu.com\nthelarkcloud.com\nthelastsky.com\nthemebetter.com\nthemediumtx.org\nthemeoffices.com\nthemeol.com\nthemex.net\nthemisweeps.com\nthemixc.com\nthemulian.com\nthemumian.com\nthemusiqu.com\nthen9.com\nthenburn.com\nthenew123.com\nthenewhotel.com\nthenextravelmarket.com\ntheoborn.com\ntheoreticalw.com\ntheorychina.org\nthepeak.com.my\nthepoemforyou.com\nthepredictivemodel.com\nthepresidentialhotel.com\nthepsychscrivener.com\nthepuli.com\ntherasaganga.com\ntheseshepherd.com\nthesetech.com\nthesmartmelon.com\nthesofabedshop.com\ntheszt.com\nthetali.com\nthethirdmedia.com\nthetigerhood.com\nthetollroadsc.icu\nthetongji.com\nthetoplab.com\nthetype.cloud\nthevaldezfamily.com\nthevideosworld.com\ntheweina.com\nthewestinpazhou.com\nthewhitedragons.com\nthewowa.com\nthewrittencoach.com\nthexinji.com\nthexnode.com\ntheytree.com\nthfdc.net\nthfdcsoft.com\nthffc.com\nthgkyy.com\nthgsjt.com\nthhymj.com\nthief.im\nthiemechina.com\nthinbug.com\nthingclub.com\nthingjs.com\nthingskit.com\nthinheal.com\nthink-mall.com\nthink-way.net\nthinkcloudlab.com\nthinkcmf.com\nthinkdid.com\nthinkdream.com\nthinkeffective-usa.com\nthinkeridea.com\nthinkerride.com\nthinkerx.com\nthinkindrupal.com\nthinkive.com\nthinkjs.org\nthinkpad.com\nthinkprinter.net\nthinkraz.com\nthinksrc.com\nthinkstu.com\nthinkvo.com\nthinkyea.com\nthinkyeah.com\nthinla.com\nthinmoo.com\nthinvent.com\nthirtyindiantrail.com\nthis6.com\nthishealthsummit.com\nthismomentinamerica.org\nthisnew.com\nthisshop.com\nthiztech.com\nthjb.net\nthjiang.com\nthjjhs.com\nthjunshi.com\nthkconn.com\nthkill.com\nthm3u8.com\nthmall.com\nthmfvb.com\nthmins.com\nthmnet.com\nthmovie.com\nthmz.com\nthmzedu.com\nthny.cc\nthomanmustore.shop\nthomasschools.com\nthoreco.com\nthorn.red\nthorne-eco.org\nthosefree.com\nthoughtworkers.org\nthrbs.com\nthreadcn.com\nthreatbook.com\nthreatbook.net\nthreetong.com\nthreewater.net\nthrive-chemicals.com\nthronechina.com\nthroughyourlens.org\nthrrip.space\nths123.com\nths8.com\nthsj.com\nthsolar.com\nthsware.com\nthtfpc.com\nthufeng.net\nthumbenv.com\nthumedialab.com\nthundercdn.com\nthundercdn.net\nthundercloud.group\nthunderflash.net\nthunderobot.com\nthunderplaygame.com\nthundersoft.com\nthunderurl.com\nthunis.com\nthunisoft.com\nthunlp.org\nthupdi.com\nthvow.com\nthwater.com\nthwgetsy.com\nthwiki.cc\nthwpmanage.com\nthxddb.com\nthxdx.com\nthxflt.com\nthxtg.org\nthxy.org\nthxyy.com\nthyoo.com\nthyristors.org\nthyuu.com\nthz56.com\nthzab.com\nthzu.cc\nti-node.com\nti-solar.com\nti0s.com\nti360.org\ntiamaes.com\ntian-gang.com\ntian-jie.com\ntian-run.com\ntian10.com\ntianan-cyber.com\ntianan-insurance.com\ntianan-life.com\ntianan.com\ntianan.net\ntiananaq.com\ntiananchem.com\ntiananmenchenglou.com\ntianapi.com\ntianbaosi.com\ntianbiao.net\ntiancaixing.com\ntiancaixing.net\ntiancao360.com\ntiancehang.com\ntianchanggongjiao.com\ntianchenalum.com\ntianchengas.com\ntianchi.com\ntianchihao.com\ntianchu.com\ntianchuixiang.com\ntianchy.com\ntiancichina.com\ntiancity.com\ntiancitycdn.com\ntiandirenfarm.com\ntianditao.com\ntianditu.com\ntiandiyoyo.com\ntiandizw.com\ntianduntech.com\ntiandy.com\ntianehui.net\ntianfeiyu.com\ntianfeng.cc\ntianfu-stone.com\ntianfucaijing.com\ntianfugroup.com\ntianfuhui.xin\ntianfupic.com\ntianfusoftwarepark.com\ntiangaicha.com\ntiangang.com\ntiangen.com\ntiangou.xyz\ntianhai.info\ntianhai2002.com\ntianhaixing.com\ntianhebus.com\ntianhejiayi.com\ntianheoil.com\ntianhepiano.com\ntianheplaza.com\ntianhetech.com\ntianhongchina.com\ntianhongdiaosu.com\ntianhonglaser.com\ntianhongsunshine.com\ntianhuixile.com\ntianhujy.com\ntianiot.com\ntianji368.com\ntianjiachem.com\ntianjiang-tech.com\ntianjiarun.com\ntianjibio.com\ntianjigame.com\ntianjigu.com\ntianjihr.com\ntianjimedia.com\ntianjin-air.com\ntianjin-iwc.com\ntianjin-marathon.com\ntianjin-patek.com\ntianjinbbs.com\ntianjinbohaileasing.com\ntianjingames.com\ntianjinwe.com\ntianjiyy.com\ntiankang.com\ntiankong.com\ntiankonghuyugames.com\ntiankuojy.com\ntianlaiedu.com\ntianlaijiaoyu.com\ntianlaikge.com\ntianlailive.com\ntianlala.com\ntianli-blog.club\ntianlian.com\ntianlijianshe.com\ntianliwindpower.com\ntianlongshop.com\ntianlun.net\ntianlun100.com\ntianlunano.com\ntianlungas.com\ntianma3600.com\ntianmaijigou.com\ntianmalvyou.com\ntianmao.com\ntianmapharma.com\ntianmarketing.com\ntianmawx.com\ntianmaying.com\ntianmimiclub.com\ntianmu.mobi\ntianmu.net\ntianmuds.com\ntianmumusic.com\ntianmunews.com\ntianmupe.com\ntiann90.com\ntiannengcarbon.com\ntiannilaw.com\ntianninghr.com\ntiannucoating.com\ntiannv.com\ntianpeng.com\ntianpu.com\ntianqi.cc\ntianqi.com\ntianqi24.com\ntianqi321.com\ntianqiaojuyuan.com\ntianqiaoyishuzhongxin.org\ntianqiapi.com\ntianqicloud.com\ntianqihoubao.com\ntianqiip.com\ntianqijun.com\ntianqilithium.com\ntianqistatic.com\ntianqiweiqi.com\ntianqiyubao3.com\ntianqiyubao4.com\ntianqiyubao9.com\ntianqizhixin.com\ntianqu.com\ntianquangs.com\ntianquetech.com\ntianqunnet.com\ntianrkl.com\ntianrow.com\ntianruihr.com\ntianrunshunteng.com\ntianruo.net\ntianruoyun.com\ntiansdl.com\ntiansenjituan.com\ntianshan277.com\ntianshanxt.com\ntianshengdiyi.com\ntianshengholdings.com\ntianshenyule.com\ntianshiyiyuan.com\ntianshugame.com\ntianshungroup.com\ntiansu-china.com\ntiantaichina.com\ntiantaienergy.com\ntiantailaw.com\ntiantaishebei.com\ntiantaivideo.com\ntiantanbio.com\ntiantang100.com\ntiantang6.com\ntiantangnian.com\ntiantanpark.com\ntiantaocs.com\ntiantaxx.com\ntiantexing.com\ntianti.com\ntiantianbannixue.com\ntiantiancaige.com\ntiantiancaipu.com\ntiantianfm.com\ntiantianfunds.com\ntiantianleshuiguo.com\ntiantianquce.com\ntiantiantiaosheng.com\ntiantianxieye.com\ntiantianxuexi.com\ntiantingfm.com\ntiantis.com\ntiantonglaw.com\ntianvalue.com\ntianwang.com\ntianwenca.com\ntianwt.com\ntianwugroup.com\ntianxia70.com\ntianxiajiameng.com\ntianxiajiaoyi.com\ntianxiamaimai.com\ntianxiang.com\ntianxianmao.com\ntianxiaputao.com\ntianxiaquanchengapp.com\ntianxiawangxiao.com\ntianxiawushi.com\ntianxiawuzei.org\ntianxiaxiao.net\ntianxiaxinyong.com\ntianxiayouxi.com\ntianxiayouyue.com\ntianxin100.vip\ntianxing.com\ntianxingjianyiliao.com\ntianxinkeji.com\ntianya.com\ntianya.tv\ntianya66.com\ntianyablog.com\ntianyabook.com\ntianyaclub.com\ntianyaluedu.com\ntianyancha.com\ntianyancha.net\ntianyangqz.com\ntianyanqifu.com\ntianyaruanwen.com\ntianyaui.com\ntianyecollege.com\ntianyi1368.com\ntianyibook.com\ntianyid78.com\ntianyihy.net\ntianyiidc.com\ntianyijue.com\ntianyinzaixian.com\ntianyisc.com\ntianyitop.com\ntianyiwangxiao.com\ntianyon.com\ntianyongcheng.com\ntianyuanfishing.com\ntianyuanjiudian.com\ntianyuanpet.com\ntianyucangqiongxiaoshuo.com\ntianyuchaye.com\ntianyuimg.com\ntianyujidi.com\ntianyutest.com\ntianyuyuan.com\ntianzeqiti.com\ntianzequan.com\ntianzhao.net\ntianzhishui.com\ntianzhitong.net\ntianzhuo.com\ntianzhuobj.com\ntianziguoji003.com\ntianzijiaoyu.com\ntianziweb.net\ntianzongyouxi.com\ntiaodao.com\ntiaofang.com\ntiaoguangbolimo.com\ntiaohao.com\ntiaohaoba.com\ntiaoka.com\ntiaomama.com\ntiaomaruanjian.com\ntiaona.com\ntiaooo.com\ntiaotiaotang.net\ntiaovon.com\ntiaoyue.xyz\ntiaozhanbei.net\ntiatiatoutiao.com\ntibaitong.com\ntibet3.com\ntibet4wd.com\ntibetanbible.org\ntibetannet.com\ntibetcn.com\ntibetcnr.com\ntibetcul.com\ntibetculture.net\ntibetcyts.com\ntibethospital.com\ntibetpic.com\ntiboshi.org\ntic-gx.com\ntica.com\nticachina.com\nticketdashi.com\nticketmars.com\nticp.io\nticp.net\nticpayidr.com\nticpsh.com\nticstore.com\nticwear.com\ntidaas.com\ntidb.ai\ntidb.io\ntidb.net\ntidbcloud.com\ntide-china.com\ntide.fm\ntidejd.com\ntidemedia.com\ntidepharm.com\ntidesec.com\ntideswing.fun\ntidi.mobi\ntiduyun.com\ntieba.com\ntiebaimg.com\ntiebanzi.com\ntiebaobei.com\ntiedan2019.com\ntiegu.com\ntiehuatu.com\ntiejiang.org\ntiejiong.com\ntiejunmedia.com\ntiekuangshi.com\ntielemao.com\ntielingcn.com\ntielu.cc\ntielu.org\ntielu123.com\ntielujob.com\ntiemeeting.com\ntiemu.com\ntieniujixie.com\ntiens.com\ntiepishihu.com\ntieque.net\ntiesan.com\ntieshuwang.net\ntietie.la\ntietuku.com\ntietuo.work\ntieweishi.com\ntieww.com\ntiexing.net\ntiexiuyugudao.com\ntiexue.net\ntiexuedanxin.net\ntieyang.com\ntieyou.com\ntiezhima.com\ntiezis.com\ntifenxi.com\ntiger-code.com\ntiger-info.com\ntiger-motion.com\ntiger2doudou.com\ntigerbbs.com\ntigerbrokers.com\ntigerbrokers.net\ntigerdns.com\ntigeresop.com\ntigerfintech.com\ntigermed.net\ntigermedgrp.com\ntigersecurities.com\ntigeryun.com\ntigr.link\ntiham.com\ntijian001.com\ntijian123.com\ntijianbao.com\ntijianshangmen.com\ntijianzhuanjia.com\ntijox.cc\ntijox.com\ntijox.hk\ntijox.net\ntijox.org\ntik2019.com\ntikersport.com\ntiktok-jdsprot.shop\ntiktok-youku.com\ntiktoknewaccount.com\ntiktokrow-cdn.com\ntikuol.com\ntikv.org\ntileywy.com\ntillcn.com\ntillglance.com\ntimanetworks.com\ntimbrd.com\ntime-weekly.com\ntime-year.com\ntime.xtracloud.net\ntimecoo.com\ntimedg.com\ntimedl.com\ntimedoo.com\ntimeep.com\ntimelate.com\ntimelessq.com\ntimemachine.icu\ntimenetwork.tech\ntimeofdate.com\ntimeoutbeijing.com\ntimeoutcn.com\ntimeoutshanghai.com\ntimephread.com\ntimepill.net\ntimeread.com\ntimeread.net\ntimesartmuseum.com\ntimesboom.com\ntimescollege.com\ntimesdf-hn.com\ntimesfortune.com\ntimesndt.com\ntimesoutlets.com\ntimestock.co\ntimetickme.com\ntimeticktick.com\ntimetw.com\ntimev.com\ntimevary.com\ntimewelder.com\ntimez.com\ntimi78.com\ntimibase.com\ntiming360.com\ntimipc.com\ntimitime.com\ntimiwc.com\ntimjx.com\ntimmerse.com\ntimsgrank-apphome65.com\ntimzuu.com\ntinavi.com\ntinengwang.com\ntinetcloud.com\ntinfinite.com\ntinfo.com\nting22.com\nting27.com\nting55.com\nting89.com\ntingbook.com\ntingchewei.net\ntingchucontrol.com\ntingclass.com\ntingfun.net\ntinghaohr.com\ntinghen.com\ntinghongzz.com\ntingjiandan.com\ntingkanbao.com\ntingke8.com\ntingkez.com\ntinglifangs.com\ntingmall.com\ntingmei.com\ntingmimi.net\ntingmubeef.com\ntingniukeji.com\ntingood.com\ntingpiting.com\ntingroom.com\ntingshubao.net\ntingshumi.com\ntingshuo51.com\ntingshuowan.com\ntingsonglaw.com\ntingtao.net\ntingtingfm.com\ntingtingwo.com\ntingvision.com\ntingxi8.com\ntingxiangzu.com\ntingxiaoyou.com\ntingyulou.com\ntingyutech.net\ntiniangroup.com\ntinigame.xyz\ntinkad.com\ntinkerpatch.com\ntinktek.net\ntinman798.net\ntinning-automation.com\ntinsecret.com\ntinstu.com\ntinwod.com\ntinychen.com\ntinycms.xyz\ntinyems.com\ntinyfeng.com\ntinyflare.com\ntinygroup.org\ntinylab.org\ntinymind.com\ntinypixos.com\ntinyservices.net\ntinywan.com\ntinyyuan.com\ntipaipai.com\ntipask.com\ntipdim.org\ntipdm.com\ntipdm.org\ntipray.com\ntiprpress.com\ntipsoon.com\ntiqakcrxmyca6i.com\ntiqiaa.com\ntiqianle.com\ntirechina.net\ntiremay.com\ntiruna-cn.com\ntiscend.com\ntisgame.com\ntisi.org\ntisino.com\ntisiwi.com\ntisohinge.com\ntisptech.com\ntita.com\ntita.net\ntitamobi.com\ntitan007.com\ntitan24.com\ntitanar.com\ntitanlaw.com\ntitanm.com\ntitanmatrix.com\ntitans-ele.com\ntitansci.com\ntitapark.com\ntitianshanfz.com\ntititxt.com\ntitloteka.com\ntitussb.com\ntiuzor.com\ntivitv.com\ntiwb.com\ntiwu.net\ntixa.com\ntixaapp.com\ntixue.net\ntiyamat.com\ntiye.me\ntiyeji.com\ntiyep.com\ntiyucdn.com\ntiyufeng.com\ntiyuguoji.com\ntiyule.com\ntiyusaishi.com\ntiyushe.com\ntiyuxiu.com\ntizi.com\ntizi365.com\ntizoinfo.com\ntj-fch.com\ntj-guangxin.com\ntj-kingdee.com\ntj-model.com\ntj-un.com\ntj0573.com\ntj1-miui-bn-stage01.kscn\ntj20.com\ntj2022.com\ntj316bxg.com\ntj47zx.net\ntj9.co\ntjab.org\ntjafxh.com\ntjaide.com\ntjbb.com\ntjbearing.com\ntjbh.com\ntjbhnews.com\ntjboai.com\ntjbpi.com\ntjbsq.com\ntjbus.com\ntjbxingbian.com\ntjcamp.com\ntjcaoshiyabo.com\ntjcecp.com\ntjcep.com\ntjchangxing.com\ntjchildrenshospital.com\ntjcid.com\ntjckjr.com\ntjcn.org\ntjcondom.com\ntjcta.org\ntjculture.com\ntjcyts.com\ntjczjxsb.com\ntjdeviser.com\ntjdewy.com\ntjdrzc.com\ntjdyf.com\ntjeco-city.com\ntjeti.com\ntjfengfan.com\ntjfer.com\ntjflcpw.com\ntjfxdx.com\ntjfytech.com\ntjgcs.com\ntjgdjt.com\ntjgg88.com\ntjghw.com\ntjgmcg.com\ntjgportnet.com\ntjgtgd.com\ntjhgmc.com\ntjhmsj.com\ntjhtcpvc.com\ntjhyzyxy.com\ntji.io\ntjian.com\ntjinsuo.com\ntjjfrh.com\ntjjhqyy.com\ntjjiaotong.com\ntjjinglang.com\ntjjt360.com\ntjjtjt.net\ntjjwt.com\ntjjwwl.com\ntjjzzls.com\ntjkache.com\ntjkeheng.com\ntjkj300.com\ntjkp-tools.com\ntjkpzx.com\ntjkx.com\ntjkximg.com\ntjllhbkj.com\ntjluohuzhijia.com\ntjmama.com\ntjmcgc.com\ntjmhc.com\ntjmldy.com\ntjmuch.com\ntjnjw.com\ntjoy.biz\ntjpa-china.org\ntjpma.org\ntjpme.com\ntjportnet.com\ntjqiqiu.com\ntjqq.cc\ntjrenliziyuan.com\ntjrenmu.com\ntjruien.com\ntjsjnxh.com\ntjsjwygg.com\ntjsjx.com\ntjskq.com\ntjskqyy.com\ntjsptech.com\ntjst.net\ntjstats.com\ntjsylhh.com\ntjszyy.com\ntjtele.com\ntjtjshengtu.com\ntjtongrentang.com\ntjtrust.com\ntjtsxd.com\ntjtum.work\ntjtvc.com\ntjubbs.net\ntjumc.com\ntjupdi.com\ntjupt.org\ntjuzj.com\ntjwatergroup.com\ntjwch.com\ntjwch.org\ntjwenjie.com\ntjwf.com\ntjwj88.com\ntjwmschool.net\ntjxdzhonda.com\ntjxinyu.com\ntjxiqi.com\ntjxunlei888.com\ntjxxcl.com\ntjxz.cc\ntjydyt.com\ntjyun.com\ntjzb.com\ntjzcsj.com\ntjzfcg.com\ntjzfhgcj.com\ntjzhongyiyao.com\ntjzhyj.com\ntjznjt.com\ntjzxyy.com\ntjzyec.com\ntjzyefy.com\ntjzyfw.com\ntjzymob.com\ntk-life.com\ntk-rays.com\ntk-xiong.com\ntk.anythinktech.com\ntk163.com\ntk233.xyz\ntk315.com\ntkas2019.com\ntkchina.com\ntkckjr.com\ntkcn.cc\ntkd-suzhou.com\ntkfashion.club\ntkfff.com\ntkgame.com\ntkhealthcare.com\ntkjzym.com\ntkmedicare.com\ntkpension.com\ntkplusemi.com\ntkqpggvx.com\ntkrlab.com\ntktjwhyy.com\ntktk123.com\ntkw.cc\ntkwcn.com\ntkww.hk\ntkxb.net\ntkxlglyy.com\ntkxxd.net\ntkxyy.com\ntky001.com\ntkzqv.com\ntl-finechem.com\ntl-self.com\ntl-shida.com\ntl-tek.com\ntl-vogue.com\ntl.gscm.tv\ntl100.com\ntl2y.com\ntl50.com\ntl88.net\ntlang.com\ntlbapm.com\ntlbsbigdata.com\ntlby120.com\ntlbyx.com\ntlcbf.com\ntlcharity.com\ntlcssk.com\ntlfw.net\ntlfzkj.com\ntlgas.com\ntlgslb.com\ntlhjjc.com\ntlhmhd.com\ntlink.io\ntlinkaccess.com\ntlinkaccess2.com\ntlinx.com\ntliveapi.com\ntliveapi2.com\ntliveapp.com\ntliveauth.com\ntliveauth2.com\ntlivecdn.com\ntlivecdnv1.com\ntlivecdnv2.com\ntlivecdnv3.com\ntlivecdnv4.com\ntlivecloud.com\ntlivecontroller.com\ntlivecontroller2.com\ntlivedal.com\ntlivedal2.com\ntlivedeliver.com\ntlivedispatch.com\ntlivedispatch2.com\ntlivedns.com\ntlivedns2.com\ntlivednsv1.com\ntlivegslb.com\ntlivehttpdns.com\ntlivehttpdns2.com\ntliveigtm.com\ntliveigtm2.com\ntliveigtm3.com\ntlivemcdn.com\ntlivemcdnsched.com\ntliveplay.com\ntliveplaydemo.com\ntliveproxy.com\ntliveproxy2.com\ntlivepush.com\ntlivepush2.com\ntlivertc.com\ntlivertc2.com\ntlivesdk.com\ntlivesdk2.com\ntlivesdkconfig.com\ntlivesdkconfig2.com\ntlivesource.com\ntlivesrc.com\ntlivesrc2.com\ntlivesrcaccess.com\ntlivesrcaccess2.com\ntlivesrcapp.com\ntlivesrcapp2.com\ntlivesrcdemo.com\ntlivesrcschedule.com\ntlivesrcschedule2.com\ntlivessl.com\ntlivessl2.com\ntlivestability.com\ntlivestability2.com\ntlivestream.com\ntlivestream2.com\ntliveupload.com\ntliveupload2.com\ntliveweb.com\ntliveweb2.com\ntlivewebrtc.com\ntlivewebrtc2.com\ntlivewebrtcpush.com\ntlivewebrtcpush2.com\ntlivewebrtcpushsch.com\ntlivewebrtcpushsch2.com\ntljas.com\ntljcw.com\ntljob8001.com\ntljwbj.com\ntljx.net\ntlkuazr.com\ntlomo.com\ntloongroup.com\ntlqwine.com\ntlrcbk.com\ntlryjg.com\ntlsj-hd.com\ntlsy.vip\ntlt5.com\ntlte.com\ntltesoft.com\ntltuan.net\ntltzg.com\ntlu5.com\ntlwanjishan.com\ntlwk.net\ntlwok.com\ntlxwjx.com\ntlxxw.com\ntly.cloud\ntlyz.net\ntlzey.com\ntlzhjt.com\ntlzyxy.com\ntm-auto.com\ntm0755.com\ntm1949.com\ntm51.com\ntm5ad.com\ntmaill.com\ntmall.com\ntmall.hk\ntmall.ru\ntmallalicdn.com\ntmallgenie.com\ntmallgenieapi.com\ntmallplay.net\ntmalltv.com\ntmallvvv.com\ntmallyc.com\ntmaotech.com\ntmbbs.com\ntmc-youqun.com\ntmcdn.net\ntmctool.com\ntmecd.com\ntmeiju.com\ntmetb.net\ntmfcloud.com\ntmgdb.com\ntmhong.com\ntmhtour.com\ntmhttc.com\ntmianyang.com\ntmigrate.com\ntmirob.com\ntmisp.com\ntmjbee.com\ntmjd123.com\ntmjiasuqi.com\ntmjj.com\ntmjl.ai\ntmjob88.com\ntmkoo.com\ntmmini.com\ntmoxrobot.com\ntmqd.me\ntmqd.so\ntmqmqj.com\ntmrcw.com\ntmrenergy.com\ntms-in.org\ntms56.com\ntms8.com\ntmscnz.com\ntmsemi.com\ntmsf.com\ntmshare123.com\ntmsmh.com\ntmsmq.com\ntmsx.net\ntmtforum.com\ntmtmw.com\ntmtpost.com\ntmtpost.net\ntmtsmartlife.com\ntmtsmartrun.com\ntmtsp.com\ntmuaih.com\ntmusoft.com\ntmuyun.com\ntmwcn.com\ntmwxxcx.com\ntmwzs.com\ntmxmall.com\ntmxxw.com\ntmxz.me\ntmyirick.com\ntmzvps.com\ntn2000.com\ntnas.link\ntnas.online\ntnblog.net\ntnblt.com\ntnbz.com\ntnccdn.com\ntndsjka.com\ntnebula.net\ntnedu.com\ntnettms.com\ntngcjx.com\ntngdigital.com.my\ntnodenow.com\ntnong.com\ntnsou.com\ntnyoo.com\ntnzuwu.com\nto-future.net\nto2025.com\nto4f.com\nto999.com\ntoaobg.com\ntoast.pub\ntoaw.net\ntobaccochina.com\ntobaccosz.com\ntobebetterjavaer.com\ntoberp.com\ntobetopone.com\ntobnews.com\ntobo1688.com\ntobosu.com\ntobsnssdk.com\ntochgo.com\ntochinajob.com\ntocomtech.com\ntocosc.com\ntocreating.com\ntoday.ai\ntoday36524.com\ntoday99.com\ntodaycache.net\ntodaydunhuang.com\ntodayguizhou.com\ntodaygx.com\ntodayidc.com\ntodayintnet.com\ntodayios.com\ntodayisp.net\ntodaymedtech.com\ntodaynic.com\ntodaypublish.com\ntodayyj.com\ntodesk.com\ntodgo.com\ntodoen.com\ntodokeji.com\ntodokit.xyz\ntodolist.chat\ntodolist.email\ntodolist.pub\ntodonow.com\ntodoyi.com\ntodreamer.com\ntoec-gdgs.com\ntoec-iot.com\ntoec.com\ntoecsec.com\ntofeat.com\ntofengmi.com\ntofflon.com\ntofine.com\ntogoalad.com\ntogocareer.com\ntogogo.net\ntogoo.com\ntohfox.com\ntohosting.com\ntohosting.net\ntohours.com\ntoidea.com\ntoiue.com\ntokcoder.com\ntokeiaat.com\ntokeimall080.com\ntokeisuisukopi.com\ntoken-ad.com\ntoken-sensor.com\ntokenglish.com\ntokensky.net\ntokimekiclub.org\ntol24.com\ntollpaymentbv.vip\ntollpaymentkj.vip\ntom.cat\ntom.com\ntom163.net\ntom61.com\ntomatogames.com\ntomatolei.com\ntomatooflove.com\ntomax.xyz\ntomdiy.com\ntomley.com\ntommsoft.com\ntompda.com\ntomson-group.com\ntomson-riviera.com\ntomwx.net\ntonbao.com\ntone-sun.com\ntonebj.com\ntonechemical.com\ntonehk.com\ntonewinner.com\ntong-pao.com\ntong-run.com\ntongaokeji.com\ntongbanjie.com\ntongbaoyun.com\ntongbb.net\ntongbupan.com\ntongbusj.com\ntongceyiliao.com\ntongchaba.com\ntongcheng.cc\ntongchengbx.com\ntongchengchaku.com\ntongchengir.com\ntongchengqun.vip\ntongchengxuanshang.com\ntongchouba.com\ntongda2000.com\ntongdanet.com\ntongdaohui.com\ntongdaonews.com\ntongdaotv.com\ntongdayun.com\ntongdelove.com\ntongdinggroup.com\ntongdun.net\ntongdy.com\ntongfangpc.com\ntongfei.tech\ntongfengkh.com\ntongfu.net\ntongfudun.com\ntongfugroup.com\ntonggao.info\ntongguanbao.net\ntonghanguav.com\ntonghuan.com\ntonghuiqiye.com\ntongji.com\ntongji.linezing.com\ntongjia.com\ntongjiai.com\ntongjijs.com\ntongjipf.com\ntongkask.com\ntongleer.com\ntonglei.com\ntonglian.com\ntongliangrc.com\ntongliaowang.com\ntonglichang.com\ntonglingwulian.com\ntonglize.com\ntongmengge.com\ntongmengguo.com\ntongniguoji.com\ntongoiltools.com\ntongpiao.com\ntongquee.com\ntongrenchina.org\ntongrentang.com\ntongrentangjb.com\ntongrentangkj.com\ntongrenyouxi.online\ntongsha.com\ntongshanbank.com\ntongshiling.net\ntongshuai.com\ntongshun6.com\ntongsuo.net\ntongtaiamc.com\ntongtech.com\ntongtex-fashion.com\ntongtianta.site\ntongtongtong.com\ntongtongyilian.com\ntongtool.com\ntongtut.com\ntongwang.net\ntongwei.com\ntongwo.net\ntongxi.net\ntongxiang.net\ntongxianghuicn.com\ntongxiangshun.com\ntongxiclub.com\ntongxiehui.net\ntongxigroup.com\ntongxin.com\ntongxin.org\ntongxingbao123.com\ntongxinghui.com\ntongxinky.com\ntongxinmao.com\ntongxiong.com\ntongxue.com\ntongxue365.com\ntongxue8.com\ntongxuepie.com\ntongyangship.com\ntongyaoplay.com\ntongyavisa.com\ntongye.biz\ntongye56.com\ntongyehuanbao.com\ntongyi.com\ntongyicm.com\ntongyidrying.com\ntongyiplastic.com\ntongyist.com\ntongyonggroup.com\ntongyongpe.net\ntongyongts.com\ntongyongzs.com\ntongyoujiancai.com\ntongyu369.com\ntongyuan.cc\ntongyuangas.com\ntongyuanos.com\ntongyue.com\ntongyuheavy.com\ntongzecn.com\ntongzhuo100.com\ntongzhuodn.com\ntongzicha.com\ntongzsf.com\ntonhwa.com\ntoniandguychina.com\ntonitech.com\ntonki-tpms.com\ntonksz.com\ntonlyele.com\ntonnp.com\ntonsontec.com\ntontian.com\ntontime.com\ntontsen.com\ntony-bro.com\ntonycrane.cc\ntonysfarm.com\ntonze.com\ntoobiao.com\ntoocf.com\ntoocle.com\ntoodaylab.com\ntoodudu.com\ntool.la\ntool.lu\ntool56.com\ntool77.com\ntooleemesse.com\ntoolgg.com\ntoolkk.com\ntoolmall.com\ntoolmao.com\ntoolnb.com\ntoolonline.net\ntools.team\ntoolscat.com\ntoolsjy.com\ntooltt.com\ntoolwa.com\ntooming.com\ntoomoss.com\ntoonechem.com\ntooopen.com\ntooseo.com\ntootour.com\ntoouoo.com\ntop-cnc.com\ntop-dianjingfeng.com\ntop-elan.com\ntop-shanghai.com\ntop-trust.com\ntop100school.com\ntop100summit.com\ntop147.com\ntop168.com\ntop1game.com\ntop263.net\ntop2fun.com\ntop3456.com\ntop4xlc.com\ntop6000.com\ntopbester.com\ntopbiol.com\ntopbiz360.com\ntopbook.cc\ntopbridge.asia\ntopcanchina.com\ntopcdb.com\ntopcentenviro.com\ntopcheer.com\ntopchitu.com\ntopcj.com\ntopcomm.co\ntopcpu.net\ntopcrab.com\ntopcsic.com\ntopcto50.com\ntopdodo.com\ntopdoge123-a.com\ntope365.com\ntopeastic.com\ntopeditsci.com\ntopeet.com\ntopeetboard.com\ntopexhib.net\ntopfisc.com\ntopflames.com\ntopfo.com\ntopfreeweb.net\ntopgoer.com\ntopgprs.com\ntopgslb.com\ntopgus.com\ntophant.com\ntophold.com\ntophr.net\ntophub.app\ntophub.fun\ntophub.today\ntopideal.com\ntopit.pro\ntopit5.com\ntopjoy.com\ntopjoycloud.com\ntopkhealth.com\ntopku.com\ntoplanit.com\ntoplee.com\ntoplevel.ink\ntoplife.com\ntoploong.com\ntopmba.mobi\ntopmediai.com\ntopnic.net\ntopnokycusdtcasino.com\ntopomel.com\ntoppdu.com\ntopperuse.com\ntopping.pro\ntoppingaudio.com\ntoppkg.com\ntoppollen.com\ntoppps.com\ntoppridehk.com\ntopproio.com\ntopqh.net\ntoprand.com\ntoprender.com\ntoprocn.com\ntopsage.com\ntopsayauto.com\ntopscan.com\ntopsedu.com\ntopsim.cc\ntopsmartinfo.com\ntopsmt.com\ntopsresearch.com\ntopsrx.com\ntopstar.art\ntopstarltd.com\ntopsunholdings.com\ntopsunleisure.com\ntopsunpower.cc\ntoptastewin.com\ntopthink.com\ntopthink.net\ntoptiao.com\ntoptopn.com\ntoptopone.com\ntoptubeco.com\ntopuc.com\ntopunix.com\ntopv1.com\ntopwalk.com\ntopway.org\ntopwaysoft.com\ntopwidgets.com\ntopwinchance.com\ntopwinfo.com\ntopxgun.com\ntopxiu.com\ntopxlc.com\ntopxlc6.com\ntopys.com\ntopyun.tv\ntopyun.vip\ntopzj.com\ntorch.plus\ntorcstark.com\ntoromotor.com\ntorovo.com\ntorphan.com\ntorrealcielo.com\ntoscdn.com\ntoshiba-gtbs.com\ntoshiba-semicon-storage.com\ntoshiba-thpc.com\ntoshiba-tnis.com\ntoshow.com\ntosohbioscience.net\ntosonet.com\ntosound.com\ntospur.com\ntosstar5117.com\ntosuai.com\ntosunk.com\ntotainfo.com\ntotalacg.com\ntotenchina.com\ntotheglory.im\ntotiot.com\ntotochina.com\ntotodi.com\ntotope.com\ntotoro.pub\ntototang.com\ntotren.com\ntotwoo.com\ntotwoseal.com\ntou-tiao.com\ntoubang.tv\ntoucdn.com\ntouch-ck.com\ntouch-massageandholistictherapies.com\ntouch-moblie.com\ntouch4.me\ntouchat.online\ntouchealth.com\ntouchelf.com\ntouchev.com\ntouchjoin.com\ntouchjoint.com\ntouchmark.art\ntouchngo.com.my\ntouchsh.com\ntouchsprite.com\ntouchsprite.net\ntouchstudio.net\ntouduyu.com\ntoufu321.com\ntougongjiao.com\ntougub.com\ntouhou.casa\ntouhou.cd\ntouhou.market\ntouhoudog.net\ntoujidao.com\ntouker.com\ntoumiao.com\ntoupb.com\ntouqikan.com\ntour110.com\ntourboxtech.com\ntourenwang.com\ntourgansu.com\ntourhr.com\ntourjob.net\ntourongjia.com\ntourongzi.org\ntoursbms.com\ntourscool.com\ntourunion.com\ntourye.com\ntourzhenjiang.com\ntourzj.com\ntoushivip.com\ntoutiao.com\ntoutiao.org\ntoutiao11.com\ntoutiao12.com\ntoutiao13.com\ntoutiao14.com\ntoutiao15.com\ntoutiaoapi.com\ntoutiaoapp.com\ntoutiaobashi.com\ntoutiaobus.com\ntoutiaocdn.com\ntoutiaocdn.net\ntoutiaocloud.com\ntoutiaocloud.net\ntoutiaogood.com\ntoutiaohao.com\ntoutiaohao.net\ntoutiaoimg.com\ntoutiaoimg.net\ntoutiaojingyan.com\ntoutiaojisu.com\ntoutiaolite.com\ntoutiaolite1.com\ntoutiaolite2.com\ntoutiaoliving.com\ntoutiaonanren.com\ntoutiaopan.com\ntoutiaopanapi.com\ntoutiaopic.com\ntoutiaoribao.net\ntoutiaostatic.com\ntoutiaovod.com\ntoutiaowap.com\ntoutiaowap.net\ntoutiaoyule.com\ntoutiaozb.com\ntoutoufc.com\ntoutoupiao.com\ntouwenzi.com\ntouwho.com\ntouxiang8.com\ntouxiang88.com\ntouxiangkong.com\ntouying.com\ntouzhijia.com\ntouzi.com\ntouzid.com\ntouzikuaibao.com\ntouzime.com\ntouzime.net\ntouzitiandi.com\ntouzizn.com\ntowavephone.com\ntowelltech.com\ntower.im\ntower0788.com\ntowinor.com\ntowmy.com\ntowngasenergy.com\ntowngasvcc.com\ntownsky.com\ntownsungroup.com\ntowntour.net\ntowords.com\ntowry.me\ntowyzcxc.com\ntoxingwang.com\ntoybaba.com\ntoycloud.com\ntoyean.com\ntoyota-nanning.com\ntoyoures.com\ntoyoutesting.com\ntoysir.com\ntoysol.com\ntp-data.com\ntp-hivi.com\ntp.louisvuitton.com\ntp82.com\ntpadx.com\ntpbook.com\ntpccoo.com\ntpdmp.com\ntpdz.net\ntpe-tencentclb.cloud\ntpe-tencentclb.com\ntpe-tencentclb.net\ntpe-tencentclb.work\ntpfangchan.com\ntphdled.com\ntpiccdn.com\ntpiccdn.net\ntpimg.xyz\ntpjhr.com\ntpjwww.com\ntpkey.com\ntplcd100.com\ntplife.com\ntplogincn.com\ntpooo.com\ntpoxiaozhan.com\ntpqxb.com\ntprtc.com\ntps138.info\ntpsbp.com\ntpsea.com\ntpsge.com\ntpshleasing.com\ntpsns.com\ntpstatic.net\ntpsxs.com\ntpszw.com\ntpturang.com\ntpuda.com\ntpumlir.org\ntpy100.com\ntpy119.com\ntpyboard.com\ntpykyy.com\ntpyzq.com\ntpzlj.com\ntqads.com\ntqapp.com\ntqapp.net\ntqcj.com\ntqcp.net\ntqcpc.com\ntqcrane.com\ntqcto.com\ntqdianbiao.com\ntqedu.net\ntqgxb.com\ntqhj88.com\ntqiangg.com\ntqiangg.net\ntqiantu.com\ntqip.com\ntqkgjt.com\ntql.ink\ntqle.com\ntqmall.com\ntqmba.com\ntqmdp.net\ntqmy168.com\ntqpac.com\ntqqa.com\ntqqyun.com\ntqrobodrive.com\ntqschool.net\ntqshfw.com\ntqshfw.net\ntquic.net\ntquyi.com\ntqw5.com\ntqwqq.com\ntqybw.net\ntr-test-ali.net\ntr-test.net\ntr-testboe.net\ntr89.com\ntrace4me.com\ntracefact.net\ntracegd.com\ntraceint.com\ntracestour.com\ntracevision.tv\ntracker.ink\ntrackingmore.com\ntracup.com\ntracyclass.com\ntradaquan.com\ntradeblazer.net\ntradeleo.com\ntrademanager.com\ntrademessenger.com\ntradeplus.cc\ntradesns.com\ntradesou.com\ntradevv.com\ntradew.com\ntradingcomps.com\ntradinghero.com\ntradow.com\ntrae.guru\ntraineexp.com\ntrainingipv6.com\ntrainnets.com\ntrainsimchina.com\ntrait-wholesale.com\ntranbbs.com\ntraneasygo.cc\ntranlion.com\ntranplanet.com\ntrans-china.com\ntrans4e.com\ntranscendchina.com\ntranscenta.com\ntransduck.com\ntranser-cn.com\ntransfarchem.com\ntransfarzl.com\ntransformer-cn.com\ntransformers.run\ntransfriend.com\ntransfu.com\ntransfun.net\ntranslatego.net\ntranslatellm.asia\ntranslationchina.com\ntransmission-china.org\ntransmonkey.com\ntransmonkey.net\ntransn.com\ntransnanning.com\ntransparcel.com\ntransportjp.com\ntransrush.com\ntranssion-os.com\ntranssscoco.com\ntransthera.com\ntranswarp.io\ntranswiki.org\ntranwit.com\ntratamientoalcohol.com\ntratao.com\ntravel-x.cc\ntravel6.co.uk\ntravelgo.com\ntraveling-exhibitions.com\ntravellaureate.com\ntravellingwithhotel.com\ntravellinkdaily.com\ntravelsky.com\ntravelsky.net\ntravelwuhan.com\ntravelyee.com\ntrawind.com\ntreatgut.com\ntreazr.store\ntreehousesub.com\ntreesir.pub\ntreetwins.com\ntreeyee.com\ntrekin.space\ntrellocdn.com\ntrend6.com\ntrendiano.com\ntrendimedia.com\ntrendingstar.tech\ntrendsbulletin.com\ntrendsmag.com\ntrendsmen.com\ntrendtokyo.com\ntrendy-global.com\ntrenrde.com\ntressgroup.com\ntretars.com\ntrevias.store\ntrewbnhj.vip\ntrexiu.com\ntrfgvb.com\ntrfkyy.com\ntrftpe.com\ntrgauto.cfd\ntrgis.com\ntrhealth.net\ntrhj.net\ntrhly.com\ntrhos.com\ntrhui.com\ntrhxt.com\ntriggerdelivery.com\ntrinasolar.com\ntrinitigame.com\ntrinova-tech.com\ntrioisobardev.com\ntriolion.com\ntriopen.com\ntriorder.com\ntriowin.com\ntrip.com\ntrip169.com\ntrip8080.com\ntripbaba.com\ntripbe.com\ntripcdn.com\ntriphr.com\ntripleuuu.com\ntriplexservice.com\ntripnearby.com\ntripodeck.com\ntripolers.com\ntripsanxia.net\ntriptt.com\ntripurx.com\ntripvivid.com\ntripwirechina.com\ntriring.com\ntrisfal.com\ntristarinc.com\ntriton-games.com\ntritoninfo.net\ntrizenai.com\ntrizinfo.tech\ntrizlaser.com\ntrizmed.com\ntrjcn.com\ntrjcn.net\ntrjddq.com\ntrkj.com\ntrkjbj.com\ntrl.center\ntrleader.com\ntrli.club\ntrmedical.net\ntrnjm.com\ntrnox.com\ntroika-design.com\ntroila.com\ntrojantesting.com\ntronixin.com\ntronlife.com\ntronlong.com\ntronly.com\ntronsmart.com\ntropcdn.com\ntroubles.work\ntroxchina.com\ntrpc.center\ntrpc.group\ntrpc.tech\ntrpcdn.com\ntrpcdn.net\ntrqjrp.xyz\ntrs-logistics.com\ntrsjgdj.com\ntrsoft.vip\ntrsoft.xin\ntrsol.com\ntrswtz.com\ntrt.hk\ntrtb.net\ntrtc.io\ntrtcanlitv-lh.akamaihd.net\ntrtccloud.com\ntrtccloud.net\ntrtcrecover.com\ntrthealth.com\ntrtpazyz.com\ntrtquxro.com\ntrucker365.com\ntrucklc.com\ntrueart.com\ntruebuty.com\ntruechine.com\ntruedian.com\ntruedream.ltd\ntrueeyu.com\ntrueful.com\ntruekex.com\ntrueland.net\ntrueme.net\ntruerun.com\ntruesing.com\ntruestudio.tech\ntrufun.net\ntruimo.com\ntrumpeter-china.com\ntrumsense.com\ntrunktech.com\ntrusfort.com\ntrusit.net\ntrusple.com\ntrust-mro.com\ntrust-one.com\ntrust400.com\ntrusta-lawyer.com\ntrustasia.com\ntrustcn.com\ntrustdecision.com\ntrustedsign.com\ntrustexporter.com\ntrustie.net\ntrustkernel.com\ntrustlife.com\ntrustmo.com\ntrustmover.com\ntrustmta.com\ntrustwe.com\ntrutes.com\ntruthsinfo.com\ntruzem.com\ntrvok.com\ntrwl.net\ntryfun.com\ntryine.com\ntryineapp.com\ntrykan.com\ntrylmr.com\ntrymoka.com\ntryudesk.com\ntryurbest.com\ntryxue.com\ntryz.net\ntrzhineng.com\nts-bus.com\nts-cooling.com\nts-jiabo.com\nts-juheng.com\nts-marathon.com\nts-precision.com\nts-watch.com\nts.cc\nts0775.com\nts100.com\nts16949px.com\nts16949rz.org\nts3.hk\nts3.ink\nts3.vip\nts56xh.com\ntsa-lp.com\ntsa-page.com\ntsa-page0.com\ntsa-page1.com\ntsa-page2.com\ntsa-page3.com\ntsa-page4.com\ntsa-page5.com\ntsa-page6.com\ntsapage.com\ntsarufaq.com\ntsbjschool.com\ntsbtv.tv\ntschina.com\ntscichina.com\ntscorona.com\ntsdaodao.com\ntsdjg.com\ntsdxb.com\ntsecdapi.com\ntsefang.com\ntsepcn.com\ntses.net\ntsflc.com\ntsfqw.com\ntsg-online.net\ntsggx.com\ntsgks.com\ntsgyun.com\ntshaisen.com\ntshe.com\ntshe.me\ntsheducation.net\ntshell.online\ntshengqi888.com\ntshmkj.com\ntshock.cc\ntshtech.com\ntsichuan.com\ntsinergy.com\ntsing-jn.com\ntsingaero.com\ntsinghua-getinfo.com\ntsinghua-sz.org\ntsinghua-vc.com\ntsinghua-wx.org\ntsinghuaic.com\ntsinghuajournals.com\ntsinghuan.com\ntsinghuawoman.com\ntsinghuawuxigz.net\ntsinghydrogen.com\ntsingj.com\ntsingmicro.com\ntsingming.com\ntsingoofoods.com\ntsingpost.com\ntsingshang.com\ntsingtek.com\ntsingtoo.com\ntsingtuo.com\ntsingyangroup.com\ntsingyanresearch.com\ntsj-js.com\ntsj-tsy.com\ntsjtsy.com\ntsk-fixture.com\ntskscn.com\ntslib.net\ntsljzs.com\ntslongtai.com\ntslsmart.com\ntslt.tech\ntsluping.com\ntsm-license-test.com\ntsm-license.com\ntsm-yuntrust.com\ntsm52dc.com\ntsmtkj.com\ntsn-tencentclb.cloud\ntsn-tencentclb.com\ntsn-tencentclb.net\ntsn-tencentclb.work\ntsorder.com\ntsp189.com\ntsparkling.com\ntspsy.com\ntspweb.com\ntsqw.com\ntsrcw.com\ntsrenli.com\ntsrnjs.com\ntsrqjt.com\ntsrqjtfc.com\ntsruifeng.com\ntssns.net\ntsstorry.com\ntssyedu.com\ntssyjt.com\ntstvxmt.com\ntsubakichina.com\ntsukistar.fun\ntsunbull.com\ntswjs.net\ntswjs.org\ntswljt.com\ntswnanning.com\ntswuby.com\ntsxcfw.com\ntsxcx.xyz\ntsxgedz.com\ntsxjt.com\ntsxtgj.com\ntsxw66.com\ntsycdn.com\ntsyexmail.com\ntsykf.com\ntsyvps.com\ntsyzm.com\ntszh.net\ntszhjk.com\ntszlsgs.com\ntszxhosp.com\ntszyzx.com\ntt-app.com\ntt-bike.com\ntt-ly.com\ntt286.com\ntt65org.com\ntt787.com\ntt818k.com\ntt919.com\ntt96596.com\nttaidu.com\nttalkai.com\nttbba.com\nttbbss.com\nttbyte.com\nttbyte.net\nttcad.com\nttcatv.tv\nttcl.cc\nttdailynews.com\nttdnsa.com\nttdown.com\nttdsw.com\nttechhk.com\nttfly.com\nttfuav.com\nttg8.com\nttgan.com\nttge.ru\nttggxx.com\nttgjx.com\nttgood.com\nttgslb.com\nttgtm.com\nttgwm.com\nttgxlx.com\ntthaoduo.com\ntthigo.com\ntthunder.com\nttic.cc\nttigame.com\nttime.com\nttionya.com\nttj5.com\nttjianbao.com\nttjisu.com\nttkdex.com\nttkefu.com\nttkuan.com\nttlock.com\nttmark.com\nttmass.com\nttmd5.com\nttmeiju.com\nttmm.vip\nttmn.com\nttmnq.com\nttmv.com\nttn8.com\nttnea.com\nttnongli.com\nttnqh.com\nttongda.com\nttpaicdn.com\nttpaihang.com\nttpaper.com\nttpet.com\nttpharm.com\nttplayer.co\nttplayer.com\nttpod.com\nttpp.com\nttppoo.com\nttpx.net\nttq.com\nttq.so\nttqiadar.com\nttqiancheng.com\nttriqi.com\ntts8.com\nttshengbei.com\nttship.com\nttshuba.cc\nttshuba.net\nttsim.com\nttsim.net\nttsmk.com\nttstream.com\nttsz8.com\ntttang.com\ntttarot.com\ntttcykt.com\ntttelephone.com\nttthing.com\ntttiti.com\ntttkkt.com\ntttllt.com\nttttt22222.com\ntttuangou.net\ntttxf.com\ntttz.com\nttunion.com\nttvmexmk.com\nttwanjia.com\nttwifi.net\nttwqw.com\nttwx.com\nttwxh.com\nttxn.com\nttxs123.net\nttxs7.com\nttxsapp.com\nttxsonline.com\nttxuanpai.com\nttxx8888.com\nttyec.com\nttyfp.com\nttyfund.com\nttyinfo.com\nttyingqiu.com\nttyjf.com\nttymq.com\nttyongche.com\nttyqm.com\nttysq.com\nttyuyin.com\nttyy800.vip\nttzcw.com\nttzubao.com\nttzw365.com\nttzyw.com\ntu54o7863tbf6.com\ntu8.cc\ntu93.biz\ntu960.com\ntuan800.com\ntuan800.net\ntuanai.com\ntuanbohui.com\ntuanche.com\ntuancu.com\ntuandai.com\ntuanduishuo.com\ntuang.club\ntuangai.com\ntuangouba.com\ntuanidc.net\ntuanimg.com\ntuanitgx.com\ntuanjiebao.com\ntuanjuwang.com\ntuanlin.net\ntuanmeme.com\ntuanok.com\ntuanpibao.com\ntuanping.com\ntuanshan.com\ntuantuangame.com\ntuantuanshou.com\ntuanxue360.com\ntuanyougou.com\ntuanyuan520.com\ntuanyx.com\ntuanziai.com\ntubachina.com\ntubanginfo.com\ntubangzhu.com\ntubaobao.com\ntubaobaoqm.com\ntubaoveneer.com\ntubaoyz.com\ntubatu.com\ntube-cat.com\ntubebbs.com\ntubiaoxiu.com\ntubie.art\ntuboshu.com\ntuboshuxinxi.xyz\ntuboxu.com\ntubutu.com\ntuchong.com\ntuchong.net\ntuchuangs.com\ntuchuiwang.com\ntuchuiwang.net\ntucoo.com\ntudai.cc\ntudai.com\ntudan.cc\ntudan.vip\ntudou.com\ntudoupe.com\ntudouseo.com\ntudouui.com\ntudouxy01.com\ntudouyx.com\ntudu.com\ntudu.im\ntuer.me\ntuer123.com\ntuf3a353.com\ntuganjue.com\ntugemedical.com\ntugoo.net\ntugou.com\ntugoucx.com\ntuguaishou.com\ntuguan.net\ntuguiyao-gd.com\ntuhaiba.com\ntuhaogroup.com\ntuhaokuai.com\ntuhu.com\ntuhu.org\ntuhu.work\ntui18.com\ntui33.com\ntuiaaaa.com\ntuiaaae.com\ntuiaaaf.com\ntuiaaag.com\ntuiabq.com\ntuibear.com\ntuiberry.com\ntuiclick.com\ntuicool.com\ntuicross.com\ntuidaniu.com\ntuidc.com\ntuideli.com\ntuidragon.com\ntuifeiapi.com\ntuiguang91.com\ntuiguangdns.com\ntuiguangjia.com\ntuijiantong.com\ntuijianxin.com\ntuijie.cc\ntuikemima.com\ntuikemima.net\ntuikemohe.com\ntuili.com\ntuilidashi.xin\ntuilie.com\ntuilisr.com\ntuiliu.net\ntuilixy.net\ntuimob.com\ntuimotuimo.com\ntuimy.com\ntuipeanut.com\ntuipear.com\ntuipinpai.com\ntuiplay.com\ntuirice.com\ntuishao.net\ntuishark.com\ntuishubang.com\ntuishuge.com\ntuishujun.com\ntuisnake.com\ntuistone.com\ntuitui.info\ntuitui99.com\ntuituifang.com\ntuituitang.com\ntuiwen.net\ntuixiu.com\ntuiyi.cc\ntuizx.com\ntujia.com\ntujiacdn.com\ntujian.com\ntujiandan.com\ntujidu.com\ntujixiazai.com\ntuke88.com\ntukedu.com\ntukkk.com\ntuku.com\ntukujia.com\ntukuppt.com\ntulading.com\ntuleminsu.com\ntuling123.com\ntulingdns.com\ntulipsport.com\ntuliu.com\ntulsj.com\ntumajewelry.com\ntumanyi.com\ntumchina.com\ntumengtech.com\ntumicomm.com\ntumormed.com\ntumukaoyan.com\ntumukeji.com\ntumwf.com\ntumyu.com\ntuna.wiki\ntunanhuashi.com\ntungee.com\ntungkong.com\ntungraymhe.com\ntungs.store\ntungshungroup.com\ntungsten-alloy.com\ntungsten-bar.com\ntungsten-copper.com\ntungsten-jewellery.com\ntungsten-powder.com\ntungwah.com\ntunhe.com\ntunhent.com\ntunionfans.com\ntuniu.cc\ntuniu.com\ntuniu.net\ntuniu.org\ntuniucdn.com\ntuniuglobal.com\ntuniuins.com\ntuniuops.net\ntunynet.com\ntuo-pan.com\ntuoaa.com\ntuobeng.net\ntuocad.com\ntuodan.tech\ntuodaneee.com\ntuodangclub.com\ntuodanlab.com\ntuodanyy.com\ntuohuangzu.com\ntuojiebiotech.com\ntuojunedu.com\ntuolajieightscore.com\ntuoluozhuan.net\ntuoniaox.com\ntuopaishedecta.com\ntuopan808.com\ntuopu.com\ntuoren.com\ntuotoo.com\ntuotuozu.com\ntuoweisi.com\ntuoyuan619.com\ntuoyuantec.com\ntuozhe8.com\ntuozheng168.com\ntuozhilight.com\ntupian1.com\ntupian114.com\ntupian1234.com\ntupian365.com\ntupiancunchu.com\ntupiankucdn.com\ntupianseo.com\ntupianyun.com\ntupianzj.com\ntupu360.com\ntuputech.com\ntupuw.com\ntuqiangcn.com\ntuqou.com\ntuquu.com\nturangyq.com\nturboes.com\nturbomail.org\nturingapi.com\nturingbook.com\nturingdi.com\nturingfraud.net\nturinggear.com\nturingtopia.com\nturnitin.org.in\nturnitinuk.net\nturs-ptt.icu\nturtle-sir.com\nturui-robots.com\nturuio.com\ntus-health.com\ntusapi.com\ntusay.net\ntuscbec.com\ntuscdn.com\ntusdesign.com\ntusdk.com\ntusenergy.com\ntushare.org\ntushare.pro\ntushencn.com\ntushifu.com\ntusholdings.com\ntushu007.com\ntushumi.cc\ntushumi.com\ntushuokeji.net\ntusij.com\ntusiot.com\ntusmedicine.com\ntusooo.com\ntuspark.com\ntuspass.com\ntuspass.net\ntusstar.com\ntustt.com\ntusu.cc\ntusuguanjiage.com\ntusujiu.com\ntutdown.com\ntutechanhb.com\ntutengcloud.com\ntutengdai.com\ntutu001.com\ntutuapp.com\ntutucloud.com\ntutudati.com\ntutuge.me\ntutuguai.com\ntutuim.com\ntutupan.com\ntuvrblog.com\ntuwan.com\ntuwandata.com\ntuwangwang.com\ntuwanjun.com\ntuwazhundian.com\ntuweng.com\ntuwenzhibo.com\ntuxi.com\ntuxiangyan.com\ntuxiaobei.com\ntuxing.art\ntuxing2010.com\ntuxingren.com\ntuxiu.com\ntuxun.fun\ntuya.com\ntuyacn.com\ntuyansuo.com\ntuyaya.com\ntuye.com\ntuyiqi.com\ntuyitu.com\ntuyiyi.com\ntuyoo.com\ntuyou.me\ntuyougame.com\ntuyoujp.com\ntuyoumi.com\ntuyouvpn.com\ntuyouxinxi.net\ntuzhan.com\ntuzhan.net\ntuzhanai.com\ntuzhanh5.com\ntuzhaozhao.com\ntuzhijie.com\ntuzhizhijia.com\ntuzhongit.com\ntuzi123.com\ntuzi8.com\ntuziip.com\ntv-live-cctv.com\ntv-live-tvsou.com\ntv.cnbeijing.xyz\ntv.drs.hhtv.cc\ntv.nknews.org\ntv002.com\ntv121.com\ntv189.com\ntv2-zuqiu.com\ntv20806.com\ntv373.com\ntvandnet.com\ntvapk.com\ntvapk.net\ntvbbj.com\ntvblack.com\ntvcbj.com\ntvcbook.com\ntvccc.org\ntventry.com\ntvfanqie.com\ntvfuwu.com\ntvguo.tv\ntvhf.com\ntvhuan.com\ntvjianshen.com\ntvkuai.com\ntvmao.com\ntvmcloud.com\ntvmining.com\ntvoao.com\ntvodapi.com\ntvodapibk.com\ntvos.com\ntvt.im\ntvt85.com\ntvuctgze.com\ntvxio.com\ntvzhe.com\ntvzn.com\ntw-joly.com\ntw-yun.com\ntw2sm.com\ntwanxi.com\ntwatchesmall.com\ntwbuild.org\ntwcoal.com\ntwd2.me\ntwd2.net\ntwdxdl.com\ntweakcube.com\ntwheixiong.com\ntwinkledeals.com\ntwinkstar.com\ntwinsel.com\ntwinsenliang.net\ntwistysocks.com\ntwk.cc\ntwmsuf.com\ntwoarmy.com\ntwoear.com\ntwplink.xyz\ntws.com\ntwsapp.com\ntwscholar.com\ntwsns.com\ntwsz-cq.com\ntwszs.com\ntwtes18.com\ntwtime.vip\ntwtstudio.com\ntwty.vip\ntwwtn.com\ntwwtn.net\ntwyuxin.com\ntwyxi.com\ntwz1t32lzy.com\ntwzgn.com\ntwzilla.com\ntwzmd.com\ntx-exhibition.com\ntx-livetools.com\ntx-trans.com\ntx.lilyemby.com\ntx009.com\ntx1588.com\ntx163.com\ntx321.com\ntx365.com\ntx5d.com\ntx8j.com\ntxacc1.com\ntxacc1.net\ntxbanche.com\ntxbapp.com\ntxbimg.com\ntxbond.com\ntxbyod.com\ntxcap.com\ntxcdns.com\ntxcdns.net\ntxcfgl.com\ntxcgoo.com\ntxclivecdn.com\ntxcloudlive.com\ntxcm365.com\ntxcm365.net\ntxcmapp.com\ntxcode.com\ntxcx.com\ntxcx.tech\ntxcxjd.com\ntxcxpt.com\ntxczawlfpj5.com\ntxdai.com\ntxdl1.com\ntxdl1.net\ntxdl2.com\ntxdl2.net\ntxdyt.com\ntxdzw.com\ntxelive.com\ntxelvb.com\ntxeo.net\ntxfba.com\ntxfeiyu.com\ntxffp.com\ntxfund.com\ntxga.com\ntxgirl1.com\ntxgirl2.com\ntxhsya.com\ntxhttpdns.net\ntxhy1699.com\ntxitech.com\ntxjhqh.com\ntxjscl.com\ntxjsjgs888.com\ntxjy689.com\ntxlctong.com\ntxleshare.com\ntxlivecdn.com\ntxlivecdn2.com\ntxlt.com\ntxlunwenw.com\ntxlzp.com\ntxmcu.com\ntxmdb.com\ntxmkf.com\ntxon.net\ntxooo.com\ntxqcw.net\ntxqq.com\ntxqq789.com\ntxresearch.com\ntxrjy.com\ntxrpic.com\ntxrz.com\ntxrzx.com\ntxscdn.com\ntxsdk.com\ntxsec.com\ntxsf.com\ntxssw.com\ntxstatic.com\ntxt101.com\ntxt321.com\ntxt81.com\ntxtag-secure.world\ntxtagsceru.cc\ntxtagscerw.cc\ntxtbbs.com\ntxtduo.com\ntxtelsig.com\ntxtshuku.org\ntxttgj.com\ntxttool.com\ntxtyxg.com\ntxuwft6117.vip\ntxvat.com\ntxvideo1.com\ntxvideo2.com\ntxwb.com\ntxweekly.com\ntxwestart.com\ntxwm.com\ntxwy.com\ntxwy.com.tw\ntxx66.com\ntxxy.com\ntxxzc.com\ntxy8.com\ntxyapp.com\ntxybio.com\ntxybk.com\ntxyes.com\ntxyfwq.com\ntxyscdn.com\ntxyscdn.net\ntxzb.app\ntxzing.com\ntxzqzb.com\ntxzuranji.com\nty-archdesign.com\nty-group.net\nty-im.com\nty-magnet.com\nty-tyre.com\nty-xxl.com\nty.ink\nty1970.com\nty2y.com\nty360.com\nty3w.net\nty8621.com\ntybai.com\ntyboard.net\ntyc100.com\ntyc13804.com\ntyc13810.com\ntyc13867.com\ntyccdn888.com\ntychemical.com\ntychio.net\ntycimages.com\ntyclport.com\ntycqxs.com\ntycredit.com\ntydao.com\ntydcdn.com\ntydesyxx.com\ntydevice.com\ntydgas.com\ntydns.cc\ntyduanju.com\ntyeat.com\ntyeec.net\ntyepi.com\ntyfo.com\ntygameworld.com\ntygckj.com\ntyh120.com\ntyhjrbl.com\ntyhjzx.com\ntyi365.com\ntyihome.com\ntyjd.cc\ntyjnkj.com\ntyjsq.com\ntykd.com\ntykmedicines.com\ntylls.com\ntym001.com\ntymcdn.com\ntymotor.cc\ntyn.cc\ntynlwx.com\ntynxy.com\ntyorient.com\ntyouai.com\ntypany.com\ntype.so\ntypecho.work\ntypechodev.com\ntypechx.com\ntypeeasy.net\ntyphoon.vip\ntypicalchn.com\ntypora.net\ntyprotech.com\ntyqian.com\ntyqxzx.com\ntyrantg.com\ntyrbl.com\ntyrbw.com\ntyread.com\ntysdmh.com\ntysih.com\ntysj365.com\ntyst.cc\ntysurl.com\ntyszy.com\ntytgigty.com\ntytlj.com\ntytuyoo.com\ntytzy.com\ntytzyyy.com\ntytzzy.com\ntyuanlv.com\ntyust.net\ntyututy.com\ntyuyan.com\ntyuyan.net\ntywangcai.com\ntywbw.com\ntywh.com\ntywheels.com\ntywx.com\ntywxw.la\ntyxcdn.com\ntyxcdn.net\ntyy6.com\ntyymt.com\ntyzh.com\ntyzhjx.com\ntyzhyun.com\ntyzs8.com\ntyzspy.com\ntz-water.com\ntz100.com\ntz118802.com\ntz121.com\ntz12306.com\ntz1288.com\ntz13866.com\ntz13897.com\ntz13898.com\ntz1980.com\ntz2100.com\ntz777666.com\ntz8733.com\ntz887.com\ntz8966.com\ntz94.com\ntz999777.com\ntzada.com\ntzbank.com\ntzbank.net\ntzbao.com\ntzcpa.com\ntzcul.com\ntzcz.com\ntzedu.org\ntzfdc.com\ntzfeilu.com\ntzfeize.xyz\ntzfile.com\ntzgamepkg.com\ntzgcjie.com\ntzggzj.com\ntzgjjt.com\ntzgkuci.com\ntzgsjc.com\ntzhledu.net\ntzhospital.com\ntzhwcc.com\ntzjob.com\ntzjxl.com\ntzjyjt.com\ntzjz123.com\ntzjzsw.com\ntzkameng.com\ntzkciz.com\ntzke18.mobi\ntzlib.net\ntzlmt.com\ntzm66.com\ntzme.net\ntzmem.com\ntzmpqcfr.com\ntzpaper.com\ntzqby.com\ntzqingzhifeng.com\ntzqytv.com\ntzrc.com\ntzres.com\ntzrl.com\ntzsfhxx.com\ntzshipping.net\ntzsnw.com\ntzsports.com\ntzsti.com\ntzsucai.com\ntzswatch.com\ntzswfz.com\ntzsz.net\ntzszyy.com\ntztledu.com\ntztrq.com\ntztusi.com\ntzujian.com\ntzvec.com\ntzvtc.com\ntzwpco.com\ntzxingtang.com\ntzxwzx.com\ntzyiyuantuan.com\ntzyongda.com\ntzyun.com\ntzyy-sh.com\ntzyyao.com\ntzyyjt.com\ntzzhkj.com\ntzzhtc.com\ntzzls.com\ntzzp.com\ntzzszb.com\ntzzx.net\nu-camera.com\nu-carloan.com\nu-cdn.com\nu-cdn.net\nu-con-dom.com\nu-con-dom.net\nu-lights.com\nu-link.org\nu-mro.com\nu-om.com\nu-qun.com\nu-road.com\nu-sharing.work\nu-softtech.com\nu-speedex.com\nu-workshop.com\nu.biz\nu.sb\nu.tools\nu005.com\nu0351.com\nu0537.com\nu062.com\nu10010.com\nu10086.com\nu14.com\nu148.net\nu17.com\nu17i.com\nu17t.com\nu1d1.com\nu21a.com\nu22e.com\nu235.net\nu2j2ha.com\nu2sz.com\nu3dc.com\nu3dcn.com\nu3dol.com\nu3l120di51.com\nu3v1adybl4.com\nu3v3.com\nu4u5.com\nu4u5.tv\nu51.com\nu520.net\nu58.com\nu581.com\nu5wan.com\nu69cn.com\nu6ex.com\nu72.net\nu78785.com\nu8164i46a4.com\nu88.com\nu8e.com\nu8see.com\nu8sy.com\nu8yb16b993.com\nu8yx.com\nu966.com\nu9baoku.xyz\nu9h.com\nu9time.com\nu9u8.com\nu9u9.com\nu9wan.com\nuabkrsj.xyz\nuahh.site\nuakwezgc.com\nuancf.com\nuandi-wireless.com\nuangee.com\nuao-online.com\nuao.so\nuaomprvw.com\nuascent-iot.com\nuat1.bfsspadserver.8le8le.com\nuatmrrvendor.com\nuauc.net\nuavtjxh.com\nuavvv.com\nuaxk.com\nub-os.com\nubaiyi.com\nubangmang.com\nubao.com\nubc-bearing.com\nubccn.com\nubeethiesemo.com\nubeihai.com\nubesh.com\nubestkid.com\nubetween.com\nubgame.com\nubicdn.com\nubiquant.com\nubismartparcel.com\nubits.club\nubixai.com\nubja.vip\nublese.com\nubmconlinereg.com\nubmsinoexpo.com\nuboat100.com\nuborn.net\nuboxol.com\nubs001.com\nubssdic.com\nubtrobot.com\nubuant.com\nubuntukylin.com\nubuuk.com\nubuylogi.com\nuc-test.com\nuc-union.com\nuc108.com\nuc129.com\nuc138.com\nuc1z.com\nuc2008.com\nuc23.net\nuc56.com\nuc666.com\nucacc.com\nucai123.com\nucaiyun.com\nucancs.com\nucanrobot.com\nucantech.com\nucantech.net\nucany.net\nucarinc.com\nucassc.com\nucb6.com\nucbug.com\nuccastore.com\nuccbikes.com\nuccpd.com\nucdchina.com\nucdok.com\nucdrs.net\nucgslb.com\nucgslb.info\nucgslb.net\nucgslb.top\nuchangdi.com\nuchiha.ltd\nuchis.com\nuchoice.cc\nuchuanbo.com\nucicq.com\nucigl.com\nucjoy.com\nucl0ud.com\nucloud-edm.com\nucloud365.com\nucloudadmin.com\nucloudapi.com\nucloudgda.com\nucloudnaming.com\nucloudnaming.info\nucloudnaming.net\nucloudoss.com\nuclouds3.com\nucloudstack.com\nucloudstack.net\nucloudstor.com\nuclouduewaf.com\nucloudufile.com\nucly.net\nucmmine.com\nucnaming.com\nucnaming.info\nucnaming.net\nucnano.com\nucnest.com\nucpaas.com\nucpchina.com\nucpopo.com\nucren.com\nucsanya.com\nucss.ninja\nuctwydx.com\nucun.tech\nucuntech.com\nucuuc.com\nucw.pub\nucweb.com\nucxsw.com\nucying.com\nudache.com\nudacity.com\nudalogistic.com\nudamall.com\nudangjia.com\nudasauto.com\nudashi.com\nudbac.com\nudcgroup.com\nudcn.com\nuddtrip.com\nudecig.com\nudelivrs.com\nudeskcs.com\nudeskglobal.com\nudfspace.com\nudiannet.com\nudid.vin\nudns.dev\nudonmai.com\nudows.com\nudragons.com\nudream.com\nudsdown.xyz\nudship.com\nudsstudio.com\nudxd.com\nuebilling.com\nuebuilder.net\nuecook.com\nued1.com\nuedbet.bet\nuedbox.com\nuedna.com\nueep.com\nueeshop.com\nuehchina.com\nuehtml.com\nueibo.com\nueiibi.com\nuelike.com\nuemo.net\nueno-china.com\nuenu.com\nueoqex.help\nueren.com\nuestcedu.com\nuestcliuxue.com\nuesw215.xin\nuetianshanyp.com\nueuz.com\nuewaf.com\nuez.com\nuf-crm.com\nuf-tobacco.com\nufancycase.com\nufanw.com\nufcap.com\nufcs.com\nufenqi.com\nufhost.com\nufhosted.com\nufida-lcwy.com\nufidaoa.com\nufileos.com\nufirefly.com\nufizl.com\nufkwm.com\nufo.club\nufo110.net\nufoer.com\nufojoy.com\nuformwater.com\nufsoo.com\nufyct.com\nug.link\nugainian.com\nugapi.com\nugapk.com\nugbb.com\nugc-up-dom.com\nugc-up-dom.net\nugdesk.com\nugdocker.link\nuggame.com\nuggd.com\nugirls.tv\nugmars.com\nugmjd.com\nugnas.com\nugnx.net\nugo-china.com\nugojp.com\nugong.com\nugoshop.com\nugostar.com\nugreen.cloud\nugreengroup.com\nugshare-img.com\nugslb.com\nugslb.info\nugslb.net\nugslb.top\nugslb2.net\nugsnx.com\nugtemfeu.com\nugubl.net\nugurl.cc\nugxsd.com\nuhaom.com\nuhaozu.com\nuhasadmin.com\nuhbthn.com\nuhcmu.com\nuhomecp.com\nuhomes.com\nuhomesplus.com\nuhouzz.com\nuhp.cc\nuhs68.com\nuhuibao.com\nuhuitong.com\nuhuocn.com\nuhut.com\nuhzcdn.com\nui-lab.com\nui100day.com\nui63.com\nuibep.com\nuibhealthcare.com\nuibmm.com\nuicats.com\nuicmall.com\nuicom.net\nuid75.com\nuidec.com\nuidev.tech\nuidev.xyz\nuihacker.com\nuiiiuiii.com\nuijtcareers.cfd\nuik.cc\nuil.ink\nuileader.com\nuimix.com\nuincall.com\nuincall400.com\nuinchat.com\nuincom400.com\nuino.com\nuipaas-assets.com\nuipower.com\nuiren.net\nuisdc.com\nuisee.com\nuisheji.com\nuishijie.com\nuisnetwork.com\nuisrc.com\nuiste.com\nuit-sz.com\nuitab.com\nuitool.net\nuiu.cc\nuiuihub.com\nuiwow.com\nujakn.com\nujia007.com\nujianchina.net\nujiao.net\nujiaoshou.com\nujinbi.com\nujing.online\nujintan.com\nujipin.com\nujiuye.com\nujmjk.com\nujnfdfv.com\nuju365.com\nujxs.com\nuk-edu.com\nuk-st.com\nukanshu.com\nukeban.com\nukelink.com\nuker.net\nukh5.com\nukiea.com\nukin-tech.com\nukingtech.com\nuklga.work\nukluhu.com\nukongm.com\nukonline2000.com\nukoo.net\nukosgolfcart.com\nukpass.org\nukpathway.com\nukpayment.xin\nukrainevisacenter.com\nuku6.com\nukubang.com\nukui.org\nukupu.com\nukusk12.com\nukve4smo9gapv.com\nukvisacenterd.com\nukworldsale.com\nulab360.com\nulamps.com\nulanzou.com\nulapia.com\nule.com\nule.hk\nuleapp.com\nulecdn.com\nuleek.net\nulgrobot.com\nuliang.vip\nuliangwang.com\nuliaobao.com\nulife.com\nulife.group\nulikecam.com\nulikecam.mobi\nulikecam.net\nulikepic.com\nulikestatic.com\nulinix.com\nulinix.tv\nulinkcollege.com\nulixirglobal.com\nulpay.com\nultracachenode.com\nultraeda.com\nultramanol.com\nultrarisc.com\nultrasonice.com\nulucu.com\nulvac-shanghai.com\nulvac-suzhou.com\num.run\numajor.net\numaman.com\numasoft.com\numaszdc.com\numate.net\numb.ink\numbpay.com\numc-ai.com\numcloud.com\numdac.com\numeijiaju.com\numeng.co\numeng.com\numeng100.com\numengcloud.com\numenglog.com\numetal.com\numetrip.com\numexair.com\numfintech.com\numgg.biz\numihome.com\numindex.com\numinsky.com\numiplus.com\numiwi.com\numiwx.com\numjicanvas.com\numl-tech.com\numlchina.com\numlife.net\numpay.com\numpxkvtt.com\nums86.com\numsamd.com\numtrack0.com\numtrack1.com\numtrack2.com\numva-china.com\numvcard.com\numvsoft.com\nun-bug.com\nun.org\nun10086.com\nun1c0de.xyz\nuna-ad.com\nuna-campaign.com\nunachina.org\nunaming.info\nunaming.net\nunbank.info\nuncbd.com\nunccr.com\nuncfa.org\nuncitys.com\nuncle-ad.com\nuncle-chen.com\nunclecheers.com\nuncleda.com\nuncledesk.com\nunclenoway.com\nunclenoway.net\nunclenowayapi.com\nuncletalk.com\nunclicks.com\nuncoverman.com\nunder-5.shop\nunderfill.cc\nuneatclean.com\nuneed.com\nunfish.net\nungifts.com\nuni-bielefeld.de\nuni-cent.com\nuni-forest.com\nuni-perfect.com\nuni-ubi.com\nuni6rtmp.tulix.tv\nunibeauty.net\nunibizp.com\nunicde.com\nunicloud.com\nunicloudgov.com\nunicloudsrv.com\nunicmicro.com\nunicom-cz.com\nunicomgd.com\nunicomjnwy.com\nunicomlife.com\nunicompayment.com\nunicompayment.net\nunicompayment.org\nunicomtest.com\nunicon-hibar.com\nunietec.net\nunifl-networks.com\nuniflows.com\nunifound.net\nunifull.com\nunifuncs.com\nunifycarbon.com\nunigress.com\nuniham.net\nunihertz.com\nunilaw.net\nunilumin.com\nunimasdata.com\nunimtx.com\nuninf.com\nuning.com\nuninstall-tools.com\nuninto.com\nuniny.com\nunion-4.com\nunion-game.com\nunion-net.com\nunion-tio2.com\nunion400.com\nunion555.com\nunioncyber.net\nunionpay.com\nunionpay.net\nunionpay95516.cc\nunionpayintl.com\nunionpaysecure.com\nuniontech.com\nuniostay.com\nuniow.com\nunipack-tech.com\nuniproud.com\nuniscope.com\nunisdigital.com\nunisedu.com\nunisemicon.com\nunisguard.com\nunishy.com\nunisiot.com\nunisoc.com\nunisonal.com\nunisound.com\nunispc.com\nunispim.com\nunissoft.com\nunistc.com\nunistrong.com\nunistrument.com\nuniswdc.com\nuniswl.com\nunitaxgd.com\nunited-bearing.com\nunited-imaging.com\nunited-sqwater.com\nunited-water.com\nunitedbank.ltd\nunitedds.com\nunitedmoney.com\nunitek-it.com\nunitemotor.com\nunitexlogistics.com\nuniteyun.com\nunithinker.com\nunitrans-agency.com\nunitrans-group.com\nunitree.com\nunitree.work\nunittec.com\nunitweld.com\nunitworld.net\nunitymanual.com\nunityonehold.com\nuniv-bio.com\nuniversity-hr.com\nuniview.com\nunivista-isg.com\nunivsport.com\nuniwaf.com\nunixhot.com\nunixidc.com\nunixtitan.net\nunjmz.com\nunjs.com\nunkzyy3201.vip\nunlcn.com\nunlgroup.com\nunlimax.com\nunlimithealth.com\nunmou.com\nunn114.com\nunncahs.net\nunnnnn.com\nunogenius.com\nunomedicalgroup.com\nunparts.net\nunpcn.com\nunpluggedatknight.com\nunpmcc.com\nunqu.com\nunsedu.com\nunsemi.com.tw\nunshan.com\nunspay.com\nunsuv.com\nuntbbsdwarfs.com\nunvmax.com\nunwtonews.com\nunyx.com\nunzg.com\nuoboc.com\nuochen.com\nuodzhx.com\nuoeee.com\nuoevtxmx.com\nuoften.com\nuoj.ac\nuoko.com\nuokon.com\nuomg.com\nuomo.cc\nuomrcipa.com\nuonglong.store\nuonline-sh.com\nuonline-sh.net\nuono4521.com\nuonone.com\nuooconline.com\nuoolu.com\nuooss.com\nuoozi.com\nuoria.com\nuos56.com\nuostools.com\nuotoo.com\nuouin.com\nuouo123.com\nuovz.com\nup-et.com\nup-pharma-gx.com\nup-pharma.com\nup135.com\nup360.com\nup368.com\nup37.com\nup4dev.com\nup62.org\nup71.com\nupai.com\nupaidui.com\nupaiyun.com\nupanboot.com\nupanok.com\nupanshadu.com\nupantool.com\nupashance.com\nupbiao.com\nupbuilder.info\nupbz.net\nupc-cn.com\nupcave.com\nupcd.org\nupcdn.net\nupchina.com\nupchinapro.com\nupchinaproduct.com\nupd.kaspersky.com\nupdate.crashlytics.com\nupdate.microsoft.com\nupdate1.cyou\nupdate2.cyou\nupdate8.com\nupdeals.com\nupdf.com\nupdrv.com\nupe.net\nupeaoktc.com\nupecp.com\nupengyou.com\nupengyou.net\nupesn.com\nupetmart.com\nupfos.com\nuphicoo.com\nupho2015.com\nuphong.com\nupimgku.com\nupimgt.com\nupin.com\nupkao.com\nupkk.com\nupkuajing.com\nuplaypc-s-ubisoft.cdn.ubi.com\nuplookedu.com\nuplooking.com\nupluck.cc\nupnono.com\nupos-bstar-mirrorakam.akamaized.net\nupos-bstar1-mirrorakam.akamaized.net\nupos-hz-mirrorakam.akamaized.net\nupowerchain.com\nuppershop.hk\nupppt.com\nupqzfile.com\nupqzfilebk.com\nuprimer.net\nups001.com\nups88.net\nupsapp.com\nupsclan.com\nupseller.com\nupskyshanghai.com\nupst86.com\nupsunet.com\nuptom.com\nuptougu.com\nupu-opt.com\nupupbug.com\nupupoo.com\nupupview.com\nupupw.net\nupvixusa.com\nupvr.net\nupwater.net\nupwith.me\nupx8.com\nupyun.com\nupzxt.com\nupzxt.net\nuq-express.com\nuqbike.com\nuqche.com\nuqee.com\nuqeegame.com\nuqiba.com\nuqidata.com\nuqidong.com\nuqidong.net\nuqipower.com\nuqite.com\nuqitong.com\nuqseo.com\nuqualities.com\nuqude.com\nuqulive.com\nurart.cc\nurbanchina.org\nurbanfind.club\nurbanmatters.com\nurbansocialwork.org\nurbetter.com\nurbetter.net\nurbtix.hk\nurcb.com\nurcove-hotels.com\nurhimalayanak.com\nuril6.com\nuriminzokkiri.com\nurit.com\nuritebio.com\nuritest.com\nuriwh.com\nurl.cy\nurl7.me\nurlos.com\nurlsecajog.com\nurmuyhz.com\nuroandrologyseries.com\nurocancer.org\nurology.wiki\nurongda.com\nurovo.com\nurovoworld.com\nurpwcei.com\nurq7wvyumzfdi5.com\nurs-china.com\nursb.me\nurselect.com\nurtrust.com\nurumqi-air.com\nurumqimarathon.com\nurumqimtr.com\nurwkcgpt.com\nus-ex.com\nus-qianzheng.com\nus.ci\nus0.me\nusa-gam.com\nusa-idc.com\nusaapcups.com\nusaas.net\nusaedu.net\nusaeu.com\nusagoodclothes.com\nusalink.xyz\nusao8.com\nusaphoenixnews.com\nusapschool.com\nusashopcn.com\nusayouma.com\nusbing.com\nusbserver.com\nusbzh.com\nusbzl.com\nuschinagreenfund.com\nuscnk.com\nuscntv.com\nuscoin.gold\nusdcny.net\nusdtmall.com\nuse-tencentclb.cloud\nuse-tencentclb.com\nuse-tencentclb.net\nuse-tencentclb.work\nuse-trust.com\nuseasp.net\nuseaudio.com\nusecubes.com\nuselesses.com\nusensejn.com\nuserbp.com\nuserhostting.com\nuserresearch.net\nuseryun.net\nuseso.com\nushendu.com\nushengame.com\nushinef.com\nushknews.com\nushui.com\nushui.net\nusidt.com\nusing.club\nusingwin.com\nusinspirationfcg.com\nusitour.com\nusitrip.com\nusj.cc\nusjticketing.com\nuslawchina.com\nuslk.net\nusmile.com\nusniuku.com\nusnook.com\nusocialplus.com\nusoftchina.com\nusoi.net\nusonetrip.com\nuspard.com\nusportnews.com\nusqiaobao.com\nusryinc.com\nustack.com\nustalk.com\nustarl.com\nustbtc.com\nustc.edu\nustcers.com\nustui.com\nusuredata.com\nusus.ltd\nusuuu.com\nusw-tencentclb.cloud\nusw-tencentclb.com\nusw-tencentclb.net\nusw-tencentclb.work\nuszcn.com\nutan.com\nutanbaby.com\nutbon.com\nutc-ic.com\nutcbag.com\nutchk.org\nutctherapeutics.com\nutec.cc\nutecbj.com\nutecexpress.com\nutepo.com\nutermux.dev\nutfinancing.com\nutgd.net\nutiao.com\nutofairy.com\nutogame.com\nutom.design\nutoper.com\nutopiafar.com\nutoppromo.com\nutourworld.com\nutovr.com\nutowekcr.com\nutrainee.com\nutransm.com\nutrustamc.com\nutsource.net\nuttjhu.xyz\nutuqafcr.com\nutvhk.com\nutvmuvpi.com\nuu-baidu.com\nuu-proxy.com\nuu-xs.net\nuu.cc\nuu1.com\nuu11.com\nuu1314.com\nuu178.com\nuu375.com\nuu456.com\nuu66.com\nuu661.com\nuu6o.com\nuu89.com\nuu898.com\nuuaa.net\nuuaoz.com\nuucall.com\nuucc.cc\nuucin.com\nuucl.vip\nuucnn.com\nuucqrdmk.com\nuueasy.com\nuuedutech.com\nuufund.com\nuufuns.com\nuugai.com\nuugame.com\nuugtv.com\nuuhdedu.com\nuuhimalayanqm.com\nuuid.online\nuuimg.com\nuukkuu.com\nuuliaoning.com\nuulux.com\nuumachine.com\nuume.com\nuumeitu.com\nuumnu.com\nuunice.com\nuunt.com\nuuoog.com\nuupages.com\nuupan.net\nuupaotui.com\nuupaper.com\nuupei.com\nuupoop.com\nuupt.com\nuupython.com\nuus8.com\nuusama.com\nuusee.com\nuusense.com\nuusky.com\nuusoo.net\nuustory.com\nuustv.com\nuutils.com\nuutop.com\nuutrip.net\nuutytp.com\nuuu.ovh\nuuu9.com\nuuujjj.com\nuuulan.com\nuuumi.net\nuuuo.com\nuuusss.com\nuuutu.com\nuuvisa.com\nuuvps.com\nuuwldh.com\nuuwtq.com\nuuwx.la\nuuxlink.com\nuuxn.com\nuuxoo.com\nuuxs.info\nuuxs.tw\nuuyoyo.com\nuuzham.com\nuuzhufu.com\nuuzo.net\nuuzuonline.com\nuuzuonline.net\nuuzz.com\nuuzz.net\nuuzzw.com\nuv25h.com\nuvcdns.com\nuvledtek.com\nuvlv75moy8.com\nuvsec.com\nuvwhd.com\nuw36gicu5xav.com\nuw3c.com\nuw9.net\nuwa4d.com\nuwan.com\nuwaysoft.com\nuwenku.com\nuwn.com\nuwntek.com\nuworter.com\nuwparking.com\nux18.com\nux87.com\nuxacn.com\nuxdc.net\nuxdzpmz.com\nuxengine.net\nuxiangzu.com\nuxianhu.com\nuxicp.com\nuxier.com\nuxin.com\nuxin001.com\nuxingroup.com\nuxiting.com\nuxiu.vip\nuxpi.net\nuxuncloud.com\nuy5.net\nuya04170okq.com\nuya04171okq.com\nuya04180okq.com\nuya04181okq.com\nuya04201okq.com\nuyan.cc\nuyang.co\nuyanip.com\nuyanke.com\nuycnr.com\nuyesee.com\nuygtbsmw.vip\nuyhjnm.com\nuyi2.com\nuyiban.com\nuyiqggpa.com\nuymfybcf.shop\nuyou.com\nuyouii.cool\nuyouqu.com\nuyshipin.com\nuyun-cdn.com\nuyunbaby.com\nuyuncdn.com\nuyuncdn.net\nuyunce.com\nuyunche.com\nuyuuy.xyz\nuzai.com\nuzaicdn.com\nuzhika.com\nuzhuangji.net\nuzing.net\nuzise.com\nuzkqymgs.com\nuzosibzk.com\nuzshare.com\nuzzf.com\nv-56.com\nv-jitp-dom.com\nv-jitp-dom.net\nv-jitp-glo.com\nv-jitp-glo.net\nv-mate.mobi\nv-simtone.com\nv-suan.com\nv.to\nv007.net\nv0668tm614.com\nv0719.com\nv1.one-tv.com\nv11-360.org\nv114.com\nv15cdn.com\nv15i.com\nv1kf.com\nv1lady.com\nv1pin.com\nv1sj.com\nv1tx.com\nv1zhushou.com\nv2b3.com\nv2ex.cc\nv2kt.com\nv2vm.com\nv2xdatacenter.com\nv2xdatasource.com\nv2xengine.com\nv3.com\nv3best.com\nv3edu.org\nv3kyo4wb8i.com\nv3mh.com\nv4.cc\nv479.com\nv5.cc\nv5.com\nv5.net\nv50307shvkaa.art\nv51124-3.qpon\nv51124-3a.qpon\nv51124.qpon\nv5595.com\nv5875.com\nv5cg.com\nv5dun.net\nv5fox.com\nv5kf.com\nv5ppt.com\nv5shop.com\nv5tv.com\nv5waf.com\nv61.com\nv6c.cc\nv6eq34ykhek5.com\nv6lvs.com\nv6ok.com\nv78q.com\nv814.com\nv84z6a854d.com\nv89.com\nv8a5rasf64.com\nv8gb.com\nv9022f162g.com\nv977.com\nv9b5n91.com\nva-etong.com\nva05ex1.org\nvaakwe.com\nvaatn.com\nvacepcvu.com\nvacmic.com\nvadxq.com\nvaedu.net\nvaeliu.com\nvafox.net\nvaicdn.com\nvaillant99.com\nvailogchina.com\nvakku.com\nvaliant-cn.com\nvalinbl.com\nvalinresources.com\nvalogin.com\nvaluablety.com\nvaluablexmail.com\nvalue500.com\nvaluecome.com\nvaluedshow.com\nvaluepr.net\nvalueq-sea.com\nvalueq.com\nvalueur.com\nvalurise.com\nvalveshow.com\nvalvewbg.com\nvamachina.com\nvan-long.com\nvanbaolu.com\nvanbyte.com\nvance-commerce.com\nvanch.net\nvancheer.com\nvanchip.com\nvanchiptech.com\nvancl.com\nvanclimg.com\nvancss.com\nvanda.cc\nvandream.com\nvanform.com\nvangelinu.com\nvangotech.com\nvanguardstars.com\nvanjee.net\nvanjoin.com\nvankang.com\nvanke-hotels.com\nvanke.com\nvankeclub.com.hk\nvankeservice.com\nvankeservice.mobi\nvankeweekly.com\nvankeytech.com\nvanlinkon.com\nvanmai.com\nvanmatt.com\nvanokey.com\nvanqun.com\nvanrui.com\nvansungroup.com\nvanvi-cn.com\nvanvps.com\nvanward.com\nvanwardsmart.com\nvanyee.net\nvanzol.com\nvaopo.com\nvapepie-web.com\nvapps.me\nvaptcha.com\nvaptcha.net\nvarchserverqa.com\nvarena.com\nvariflight.com\nvarlt.com\nvarmilo.com\nvarsalmed.com\nvart.cc\nvarygroup.com\nvasdgame.com\nvasee.com\nvaslco.com\nvasoon.com\nvastlandsc.com\nvastman.com\nvastsea.com\nvastteq.com\nvatech-china.com\nvattenvalve.com\nvauoo.com\nvautoshow.com\nvayakid.com\nvaydeer.com\nvayol.com\nvayuan.com\nvazyme.com\nvazymemedical.com\nvbango.com\nvbaoxian-cib.com\nvbbobo.com\nvbc08090op.com\nvbidc.com\nvbio-pharma.com\nvbiquge.com\nvbkhk.com\nvbkrhk.com\nvbmnmy.com\nvbsemi.com\nvbyko.org\nvc800.com\nvcarepharmatech.com\nvcbeat.net\nvcc808.site\nvcchar.com\nvcd.io\nvcdnga.com\nvcg.com\nvchangyi.com\nvchello.com\nvcimg.com\nvcinchina.com\nvckbase.com\nvclass.com\nvclbroker.com\nvclbrokers.com\nvcled.com\nvcloud-byte.com\nvcloudapi.com\nvcloudgtm.com\nvcloudgtm.net\nvcloudlive.com\nvcloudlive.net\nvcloudsp.com\nvcloudsp.net\nvcloudstc.com\nvcloudstc.net\nvcloudvod.com\nvcloudvod.net\nvcltrade.com\nvclusters.com\nvcnews.com\nvcomic.com\nvcomputes.com\nvconew.com\nvconew3.com\nvcooline.com\nvcore.hk\nvcpdemo.com\nvcredit.com\nvcrfiw.lol\nvcsint.com\nvcsmemo.com\nvcspark.com\nvctianshanvs.com\nvctnepj.monster\nvcxpe.com\nvdaye.com\nvdbet.com\nvdfly.com\nvdiagnostic.com\nvdian.com\nvdisk.me\nvdjg65fh3ac-aw1u.com\nvdlya.com\nvdncache.com\nvdncloud.com\nvdndc.com\nvdnplus.com\nvdnplus.net\nvdnsv.com\nvdobiotech.com\nvdolady.com\nvdongchina.com\nvdson888.com\nvdyoo.com\nvdyoo.net\nve-imcloud.com\nve-trafficroute.com\nve-trafficroute.net\nve70.com\nvearne.cc\nvebaike.com\nvec-contracting.com\nvecentek.com\nveckinc.com\nveclightyear.com\nvecloudgame.com\nvecrp.com\nvector-engine.com\nvectorplaces.com\nvedamobi.com\nvedcdnlb.com\nvedeng.com\nveding.com\nvedsalb.com\nveecar.com\nveefdev.com\nveelink.com\nveeqi.net\nveer.com\nveervr.tv\nveeteam.com\nveevlink.com\nveew-alb-cn1.com\nveew-alb-cn2.com\nveew-alb-ts.com\nvefast-fa.com\nveg520.com\nvegalb.com\nvegslb.com\nvegtm.net\nveicplive.com\nveikei.com\nveilytech.com\nveinbase.com\nveirun.com\nveiso.vip\nveitor.net\nvejianzhan.com\nveken.com\nvekinerp.com\nvelasx.com\nvelep.com\nvelledq.com\nvelocaps.com\nvelouras.shop\nvemarsdev.com\nvemarsstatic.com\nvemic.com\nvemte.com\nvemvm.com\nvendor-src-eo.com\nvendue.vip\nvenlvcloud.com\nventoy.net\nvenucia.com\nvenuscn.com\nvenusgroup.asia\nvenusmedtech.com\nvenusong.site\nvephp.com\nveqxiu.net\nver.cc\nvergilisme.com\nverify5.com\nverisilicon.com\nverisyno.com\nversa-ai.com\nversolsolar.com\nversoventure.com\nvertciot.com\nvertical-china.com\nvertu.com\nvertuonline.com\nvery361.com\nveryapex.com\nveryark.com\nverycd.com\nverycdn.net\nverychem.com\nverydg.com\nverydoc.net\nverydu.net\nverydz.com\nveryevent.com\nverygrass.com\nverygslb.com\nverygslb.net\nveryhappy.pw\nveryhuo.com\nveryide.com\nveryim.com\nverykuai.com\nverym.com\nveryns.com\nveryok.net\nveryol.com\nverypan.com\nverysource.com\nverystar.net\nverysync.com\nveryvp.com\nveryweibo.com\nverywind.com\nveryxiang.com\nveryzhun.com\nves100.com\nvestack-beta.com\nvestack-cicd.com\nvestack-preview.com\nvestack-sandbox.com\nvestack.cloud\nvesystem.com\nvetoolchain.com\nvetscloud.com\nvevor.net\nvevorstatic.com\nvevsmize.com\nvez.me\nvf5c.com\nvfcdnrd.com\nvfcpay.com\nvfcsz.com\nvfe.cc\nvfinemusic.com\nvfocus.net\nvftfishing.com\nvfuiov.sbs\nvfuke.net\nvfund.org\nvfvdf.com\nvfx123.com\nvg.com\nvg173.com\nvg89qeas3xagd.com\nvgabc.com\nvgbaike.com\nvgctradeunion.com\nvghall.com\nvghimalayandm.com\nvghimalayanet.com\nvgjump.com\nvglook.com\nvgnclub.com\nvgoapp.com\nvgogbuy.com\nvgooo.com\nvgover.com\nvgoyun.com\nvgtime.com\nvgunxpkt.com\nvgvmotor.com\nvgyuhu.com\nvhall.com\nvhallyun.com\nvhao123.com\nvhengdata.com\nvhiphop.com\nvhisxs.com\nvhong.com\nvhostcp.com\nvhostgo.com\nvhshub.com\nvhsinsurtech.com\nvhxaw.com\nvhzhaopin.com\nvi1zen.com\nvi21.net\nvi586.com\nvia-cert.com\nviablife.com\nviaeda.com\nvial.cc\nviarmour.com\nviayoo.com\nviberom.com\nvibrou.com\nvibunion.com\nvic18.com\nvicanquan.com\nvicbio.com\nvicchen.me\nvicigaming.com\nvicitymall.com\nvickn.com\nvicl.net\nvicome.com\nvicovico.com\nvicp.cc\nvicp.fun\nvicp.io\nvicp.net\nvicpalm.com\nvicpv.com\nvicrab.com\nvicsdf.com\nvicsz.com\nvictoriassecretclearance.online\nvictory-inflight.com\nvictorybio.com\nviczz.com\nvida-bio.com\nviday.org\nvideaba.com\nvideasoft.com\nvideo-study.com\nvideo-voip.com\nvideo2b.com\nvideocc.net\nvideofty.com\nvideohudong.com\nvideohupu.com\nvideoincloud.com\nvideomind.cloud\nvideomind.net\nvideoplus.cc\nvideotomp3.site\nvideougc.com\nvideoxiaoyouxi.com\nvideoyx.com\nvidmate.mobi\nvidmate.net\nvidmatefilm.org\nvidz.asia\nviecoo.com\nvieg.net\nvientao.com\nviewcoder.com\nviewstock.com\nviewtool.com\nviewtrans.com\nvifaka.com\nvigogroup.com\nvigorgb.com\nvigorousxy.com\nvigtel.com\nvigtm-meeting-tencent.com\nviigee.com\nviiixcpe.com\nviisan.com\nviitalk.com\nviixin.com\nvijingsmart.com\nvijos.org\nvijs.net\nvikduo.com\nvikecn.com\nvikilife.com\nvilives.com\nvillachina.com\nvillasbalirent.com\nviltd.com\nvim8.org\nvimage1.com\nvimage2.com\nvimage3.com\nvimage4.com\nvimdesign.com\nvimge.com\nvimicro.com\nvimiix.com\nvimin.cc\nvimiy.com\nvims04.com\nvimsky.com\nvin114.net\nvin17.com\nvincentqin.tech\nvinchin.com\nvindapaper.com\nvinehoo.com\nvinetreetents.com\nvingoojuice.com\nvinjn.com\nvinkdong.com\nvinlion.com\nvinsondata.com\nvioletabeautyltd.com\nvioletgo.com\nviolinstudy.net\nviolinww.com\nvip-chn.com\nvip-lexiang.com\nvip-vip-yzzy.com\nvip-wifi.com\nvip.com\nvip10000.club\nvip120.com\nvip1280.net\nvip150.com\nvip360.work\nvip3659k.com\nvip7337.com\nvip7787.com\nvip800.com\nvip8849.com\nvip888.kuyun99.com\nvip9982.net\nvipabc.com\nvipabcyun.com\nvipappsina.com\nvipbaihe.com\nvipbcw.com\nvipbla.com\nvipbuluo.com\nvipcaocao.com\nvipchina.com\nvipcto.com\nvipdlt.com\nvipersaudio.com\nvipexam.org\nvipfashion.com\nvipfengfei.com\nvipfengxiao.com\nvipfenxiang.com\nvipfinal.com\nvipflonline.com\nvipglobal.hk\nvipgouyouhui.com\nvipgs.net\nvipgslb.com\nvipguanjia.net\nviphxw.com\nvipiao.com\nvipjingdong.com\nvipjinron.com\nvipjr.com\nvipkaoyan.net\nvipkid.com\nvipkidcdn.com\nvipkidresource.com\nvipkidstatic.com\nvipkj.net\nviplao.com\nvipleyuan.com\nvipliangmei.com\nviplux.com\nvipmaillist.com\nvipmalljf.com\nvipmro.com\nvipmro.net\nviponlyedu.com\nviposs.com\nvippapi.com\nvippluspai.com\nvipqdd.com\nvipqlz.com\nvipreading.com\nvips100.com\nvipshare.com\nvipshop.com\nvipshopyao.com\nvipshou.com\nvipsinaapp.com\nvipskill.com\nvipslib.com\nvipsmt.com\nvipsoft.cc\nvipsrc.com\nvipstatic.com\nvipstore.com\nviptijian.com\nvipwzswl.com\nvipxap.com\nvipxdns.com\nvipxdns.info\nvipxdns.net\nvipxf.com\nvipxs.la\nvipyl.com\nvipyyzz.com\nvipyz-cdn1.com\nvipzhuanli.com\nviqq.com\nvirbox.com\nvircloud.net\nvireala.com\nvireala.net\nvirosin.org\nvirscan.org\nvirtaicloud.com\nvirtualevent.net\nvirtualworld.pub\nvirtupharmako.com\nvirusdefender.net\nvisa027.com\nvisa163.com\nvisa198.com\nvisa800.com\nvisaai.com\nvisabao.com\nvisacits.com\nvisactor.com\nvisadeguo.com\nvisaforchina.org\nvisaforkorea-bj.com\nvisaforkorea-cd.com\nvisaforkorea-gz.com\nvisaforkorea-qd.com\nvisaforkorea-sh.com\nvisaforkorea-wh.com\nvisahuanqiu.com\nvisajx.com\nvisanc.com\nvisas.to\nvisasoo.com\nvisaun.com\nvisbodyfit.com\nviscosefibre.com\nviseator.com\nvisfarm.com\nvishavideo.com\nvisheng.com\nvishoor.com\nvisinextek.com\nvision-nj.com\nvision-systems-china.com\nvisionandview.com\nvisionarytech.ltd\nvisionbbs.com\nvisionchinashow.net\nvisioncloudapi.com\nvisionhacker.com\nvisionly.org\nvisionmax-sh.com\nvisionstar-tech.com\nvisionunion.com\nvisionvera.com\nvisirobot.com\nvisitsanya.com\nvisitsz.com\nviskem.com\nvismaasale.shop\nvismadeal.shop\nvista-china.net\nvista123.com\nvistahelmets.com\nvistastory.com\nvisu-autotec.com\nvisualchina.com\nvisvachina.com\nvitagou.com\nvitagou.hk\nvitalgen.com\nvitaloffice.life\nvitalxyz.com\nvitamio.net\nvitamio.org\nvitamio.tv\nvitarn.com\nvitasoy-chn.com\nvitechliu.com\nviterbi-tech.com\nvitesexpo.com\nvitian.vip\nviu777.co\nvivaia.com\nvivaiaschweiz.com\nvivantecorp.com\nvivcms.com\nvivebest.com\nvividict.com\nvivijk.com\nviviv.com\nviviwin.com\nvivo.com\nvivo.xyz\nvivoglobal.com\nvivojia.com\nvivojrkj.com\nvivokb.com\nvivosjpt.com\nvivotc.com\nviwik.com\nvixiu.com\nvixue.com\nviyuan.com\nvizo-dns.com\nvjgmcoqs.com\nvjia.com\nvjiazu.com\nvjifen.com\nvjread.com\nvjshi.com\nvjtchina.com\nvk6.me\nvk6oqcevmd1a.com\nvk8.co\nvkaijiang.com\nvkbaby.com\nvkehu.com\nvkemai.com\nvkjsq.com\nvkoolhf.com\nvkoopp.com\nvkrqtir.xyz\nvkrtzzc.com\nvksir.zone\nvksoft.com\nvku6.com\nvkua.com\nvkxiazai.com\nvlabstatic.com\nvlabvod.com\nvlan.fun\nvland-official.com\nvlandgroup.com\nvlcable.com\nvliang.com\nvlight.me\nvlightv.com\nvlink.cc\nvlinkage.com\nvlinkapi.com\nvlinke.com\nvlion.mobi\nvlong.tv\nvlongbiz.com\nvlportal.download.prss.microsoft.com\nvlrzgf.sbs\nvlss.com\nvlssu.com\nvlwwu.com\nvm.sg\nvm7.com\nvm888.com\nvmaes.com\nvmall-hw.com\nvmall.cloud\nvmall.com\nvmallres.com\nvmanhua.com\nvmartaw.com\nvmax-lighting.com\nvmaxhome.com\nvmaya.com\nvmdns.xyz\nvmdo.net\nvmecum.com\nvmengblog.com\nvmeti.com\nvmic.xyz\nvmicloud.com\nvmkj.net\nvmlib.com\nvmoiver.com\nvmonkey.mobi\nvmovier.cc\nvmoviercdn.com\nvmsky.com\nvmtdf.com\nvmtnet.com\nvmuboh.com\nvmuhyu.site\nvmylan.com\nvname.com\nvnanke.com\nvnet.com\nvnet.mobi\nvnlin.com\nvnnox.com\nvnpy.com\nvnvn33.com\nvnzmi.com\nvoa-lh.akamaihd.net\nvoa365.com\nvobao.com\nvoc.ai\nvocalmiku.com\nvoccdn.com\nvocinno.com\nvocotype.com\nvod-backup.net\nvod-bk-qcloud.com\nvod-content.com\nvod-content.net\nvod-eo.com\nvod-eo1.com\nvod-eo2.com\nvod-eo3.com\nvod-eo4.com\nvod-eo5.com\nvod-igtm.com\nvod-pro.com\nvod-qcloud.com\nvod-test.com\nvod-upload.com\nvodapis.com\nvodapisbk.com\nvodasafe.com\nvoddlb.com\nvodecn.com\nvodehr.com\nvodeoapi.com\nvodeoapibk.com\nvodeointernal.com\nvodeshop.com\nvodinternal.com\nvodinternalbk.com\nvodjk.com\nvodn-valve.com\nvodplayvideo.com\nvodplayvideo.net\nvodpro-upload.com\nvodpro-upload1.com\nvodpro-upload2.com\nvodpro-uploadbk.com\nvodtcbk.com\nvodxl-qcloud.com\nvoguecafebeijing.com\nvoguechinese.com\nvoguelife.net\nvohringer.com\nvoice9.com\nvoicedic.com\nvoicer.info\nvoicer.me\nvoidking.com\nvojs.tv\nvokop.com\nvolc-dns.com\nvolc-dns.net\nvolc-dns.pub\nvolc-embed.com\nvolcadocean.com\nvolcadvc.com\nvolcalb.com\nvolcanicengine.com\nvolcano-force.com\nvolcanospring.com\nvolcautovod.com\nvolcbiz.com\nvolcca.com\nvolccdn.com\nvolccdn1.com\nvolccdn2.com\nvolccloudidentity.com\nvolcddos.com\nvolcddos001.com\nvolcdem.com\nvolcdn.com\nvolcdns-test.com\nvolcdns-test.net\nvolcdns.com\nvolcdns.pub\nvolceapi.com\nvolceapplog.com\nvolcecr.com\nvolcecw.com\nvolcengine-dns.com\nvolcengine-dns.net\nvolcengine.com\nvolcengine.net\nvolcenginealb.com\nvolcengineapi.com\nvolcenginedns.com\nvolcenginedns.net\nvolcenginepaas.com\nvolces.com\nvolcfake.com\nvolcfcdn.com\nvolcfcdnbyte.com\nvolcfcdndvs.com\nvolcfcdndvs1.com\nvolcfcdndvs2.com\nvolcfcdnplus.com\nvolcfcdnrd.com\nvolcfcdnsc.com\nvolcfxgjrtm.com\nvolcgroup.com\nvolcgslb-mlt.com\nvolcgslb.com\nvolcgtm.com\nvolchina.com\nvolciad.com\nvolcimagex.com\nvolcimagex.net\nvolcimagextest.com\nvolclivedvs.com\nvolcmagicpage.com\nvolcmcdn1.com\nvolcmcdn2.com\nvolcmcdn3.com\nvolcmcdn4.com\nvolcmcdnalias.com\nvolcmgs.com\nvolcmlt.com\nvolcmusecdn.com\nvolcocic.com\nvolcopjrtm.com\nvolcpartner.com\nvolcpartner.net\nvolcsirius.com\nvolcsiriusbd.com\nvolcspaceeduc.com\nvolctracer.com\nvolctraffic.com\nvolctranscdn.com\nvolcvideo.com\nvolcvms.com\nvolcvod.com\nvolcwaf.com\nvolcwaf001.com\nvoldp.com\nvoleai.com\nvolic.download.prss.microsoft.com\nvolit.com\nvolkswagen-anhui.com\nvolleyballchina.com\nvolleychina.org\nvoltmemo.com\nvolvocars.com\nvomicer.com\nvoming.com\nvommatec.com\nvoneseals.com\nvonets.com\nvonng.com\nvonwei.com\nvoo0.com\nvooct.com\nvooec.com\nvooedit.com\nvoole.com\nvoolea.com\nvoolga.net\nvoopoo.com\nvoovlive.com\nvoovlive.net\nvoovmeeting.com\nvoovnow.com\nvortexfun.com\nvosvmamt.com\nvot8.com\nvote001.com\nvote8.com\nvotianxia.com\nvoto.cc\nvotwo.com\nvoxlearning.com\nvoxpie.com\nvoycn.com\nvp6.co\nvpabrand.com\nvpal.com\nvpalstatic.com\nvpansou.com\nvpascare.com\nvpay8.com\nvpbus.com\nvpcs.com\nvpea.ca\nvpgame.com\nvpgamecdn.com\nvpiaotong.com\nvpimg1.com\nvpimg2.com\nvpimg3.com\nvpimg4.com\nvpkupfti.sbs\nvplay8.com\nvplayer.net\nvpmagic.com\nvpn39.com\nvpnsoft.net\nvpnvpn.com\nvpquc9rn.com\nvps-vacuum.com\nvps.dance\nvps.im\nvps234.com\nvps55.com\nvps911.com\nvpsaa.com\nvpsaa.net\nvpscang.com\nvpsce.com\nvpser.com\nvpsguo.com\nvpshu.com\nvpsjxw.com\nvpsno.com\nvpsoff.net\nvpsor.com\nvpsplayer.com\nvpspurchase.com\nvpsss.net\nvpssw.com\nvpsvip.com\nvpsvsvps.com\nvpszh.com\nvptek.com\nvqaq.com\nvqjuice.com\nvqpwg.work\nvqq.com\nvqs.com\nvqskrzmq.com\nvqu.show\nvqudo.com\nvqudochina.com\nvqyzdzcg.shop\nvr-cat.com\nvr186.com\nvr2.tv\nvr42.com\nvrbeing.com\nvrbi.viveport.com\nvrbig.com\nvrbrothers.com\nvrbt.mobi\nvrcfo.com\nvrdiamondtools.com\nvrindabg.com\nvrjie.com\nvrmajor.com\nvrnew.com\nvrnos.com\nvrp3d.com\nvrpinea.com\nvrpowder.com\nvrqjcs.com\nvrqq.org\nvrrw.net\nvrtyg.com\nvrupup.com\nvrvlink.com\nvrvmanager.com\nvrwuhan.com\nvrzb.com\nvrzhijia.com\nvrzwk.com\nvrzwk.net\nvs-gascloud.com\nvs.cm\nvs2a.com\nvsaker.com\nvsamhos.com\nvsane.com\nvsaol.com\nvsbclub.com\nvsbuys.com\nvscode.download.prss.microsoft.com\nvscops.com\nvsean.net\nvsearch.club\nvsens.com\nvshabo.com\nvshangdaili.com\nvsharecloud.com\nvsharing.com\nvshoucang.com\nvsjwtcdn.com\nvslai.com\nvsmquvds.com\nvsnoon.net\nvsnoon.org\nvsochina.com\nvsocloud.com\nvsoon.net\nvsooncat.com\nvsooncloud.com\nvsoontech.com\nvsping.com\nvspk.com\nvsread.com\nvss.cbnmtv.com\nvssou.com\nvsszan.com\nvstarstatic.com\nvstart.net\nvstecs.com\nvstmv.com\nvstonefund.com\nvstonewealth.com\nvstou.com\nvsun.com\nvsx10.com\nvsxue.com\nvsyo.com\nvsyy.net\nvt-pharm.com\nvtache.com\nvtcsy.com\nvteamgroup.com\nvtears.com\nvtepai.com\nvtepai.net\nvtibet.com\nvtijian.com\nvtmyfbax.vip\nvtool.vip\nvtoshop.com\nvtoutiao.cc\nvtradex.com\nvtrois.com\nvtron.site\nvtstar.net\nvtuzx.com\nvtydgv.org\nvue-js.com\nvue88.com\nvuejs.press\nvuepush.com\nvuevideo.net\nvulbox.com\nvulcan.dl.playstation.net\nvulrange.com\nvultr1.com\nvultrcn.com\nvultrvps.com\nvumstar.com\nvunion.net\nvuphub.com\nvurl.fun\nvurl.link\nvurl.pro\nvurl.tech\nvurl3.vip\nvutimes.com\nvuxmpw.com\nvuz.me\nvv-tool.com\nvv.cc\nvv1628.cc\nvv27.com\nvv3111.com\nvv8.com\nvv881.com\nvv8yx.com\nvv91.com\nvv91.net\nvvbin.com\nvvebo.vip\nvvfeng.com\nvvgroup.com\nvvhan.com\nvvhcwpddaa.com\nvvhunter.com\nvvic.com\nvving.vip\nvvipcdn.com\nvviptuangou.com\nvvjob.com\nvvmeiju.com\nvvo2o.com\nvvpgwg.xyz\nvvpncdn.com\nvvstc.com\nvvtor.com\nvvup.net\nvvvdj.com\nvvvtt.com\nvvxue.com\nvvzero.com\nvw888.com\nvwanjia.com\nvwaycn.com\nvwhulian.com\nvwkbh1674.com\nvwo50.club\nvwvvwv.com\nvwwmsd.com\nvx56.com\nvxe.com\nvxia.net\nvxiaocheng.com\nvxiaoxin.com\nvxinyou.com\nvxixi.com\nvxo7tu.com\nvxocok3197.vip\nvxras.com\nvxuepin.com\nvxuey.com\nvxv.ink\nvxwo.com\nvxxsfxxs.com\nvxxx.vip\nvycool.com\nvycxvgmk.com\nvyin.com\nvynior.com\nvyuan8.com\nvz.download.prss.microsoft.com\nvz41.com\nvzan.cc\nvzan.com\nvzbvhfql.com\nvzhang.net\nvzhantong.com\nvzhifu.net\nvzhou.net\nvzhuanba.com\nvzhuji.com\nvzhuo.com\nvzhushou.com\nvzidc.com\nvzimu.net\nvzklb.com\nvzkoo.com\nvzone.me\nvztkoegc.com\nvzuu.com\nw-e.cc\nw-startech.com\nw-zhong.com\nw.biz\nw032.com\nw03voavpa5.com\nw0663.com\nw0x9r0k2l1.com\nw0y.com\nw10a.com\nw10xitong.com\nw123w.com\nw18.net\nw1989.com\nw1b.com\nw218.com\nw2gou.com\nw2n5cu58rn.com\nw2solo.com\nw3.wifijiangyin.com\nw333.com\nw3cbus.com\nw3ccoo.com\nw3cfuns.com\nw3chtml.com\nw3cjava.com\nw3cplus.com\nw3cschool.cc\nw3ctalk.com\nw3ctech.com\nw3cways.com\nw3h5.com\nw3pop.com\nw3so.com\nw3techservices.com\nw3tool.com\nw3tt.com\nw3xue.com\nw5.com\nw61usi4a.org\nw6pdp.com\nw7.cc\nw7000.com\nw7ghost.net\nw918.com\nw9188wan.com\nwa5.com\nwa5as4.com\nwaaaat.com\nwaakee.com\nwaaku.com\nwaakuu.com\nwaasee.com\nwabcw.info\nwabestdealmall.com\nwabuw.com\nwacai.com\nwacai365.com\nwacaijizhang.com\nwacaiyun.com\nwacaoren.net\nwacdn.com\nwader1714.com\nwadkj.com\nwaduanzi.com\nwae-logistics.com\nwaerfa.com\nwaesedu.com\nwaf-website.com\nwaf.one\nwafatea.com\nwafcn.com\nwafunny.com\nwafzi.com\nwagen.cc\nwagonsclub.com\nwaha.cc\nwahahakid.org\nwaheaven.com\nwahlap.com\nwahlap.net\nwahsanggroup.com\nwahtaisz.com\nwahuto.com\nwahyao.com\nwaibao123.com\nwaibao12333.com\nwaibaodashi.com\nwaibou.com\nwaifushangcheng.com\nwaig8.com\nwaigamer.com\nwaigf.com\nwaigi.org\nwaiguofang.com\nwaihui321.com\nwaihui580.com\nwaihui888.com\nwaihuigu.net\nwaihuo.com\nwaiji.com\nwailaishop.com\nwailaizhe.com\nwailianluntan.com\nwailiantu.com\nwailianvisa.com\nwaima.com\nwaimai.com\nwaimai.zone\nwaimai101.com\nwaimai361.com\nwaimaimingtang.com\nwaimaiwanjia.com\nwaimaob2c.com\nwaimaoniu.com\nwaimaoniu.net\nwaimaoribao.com\nwaimaozhuge.com\nwaimungfire.com\nwainconnector.com\nwaipojia.com\nwaipoxin.com\nwaiqicha.com\nwaiqin365.com\nwaisnj.com\nwaiting.monster\nwaitingfy.com\nwaitsun.com\nwaiwmhsb.org\nwaiyuedu.com\nwaizaowang.com\nwajiquan.com\nwajueji.com\nwajufo.com\nwakaligong.com\nwakeai.tech\nwakedata.com\nwakeofgods.com\nwakeup.fun\nwakingsands.com\nwakkaa.com\nwakuai.com\nwal8.com\nwalanwalan.com\nwalatao.com\nwalekan.com\nwali.com\nwali123.com\nwalibao.com\nwalimaker.com\nwalk-live.com\nwalker-fan.com\nwalkera.com\nwalkingpad.com\nwalkkind.com\nwalknode.com\nwalkthechat.com\nwallcoo.com\nwallcoo.net\nwalle-web.io\nwallet.io\nwalletio.io\nwallmatechina.com\nwallstcn.com\nwallstreetcn.com\nwallswitch.com\nwalltu.com\nwallyt.net\nwalre.com\nwalsongreenhouse.com\nwalton-xuzhou.com\nwaltzsy.com\nwaluer.com\nwalvax.com\nwamawama.com\nwamila.com\nwan-ka.com\nwan.cc\nwan.com\nwan1234.com\nwan123x.com\nwan32.com\nwan5d.com\nwan68.com\nwan73.com\nwan77.com\nwan8.com\nwan886.com\nwan898.com\nwan95.com\nwanadalu.com\nwanandroid.com\nwanbaapp.com\nwanbexpress.com\nwanbgame.com\nwanbiao800.com\nwanbiaogs.com\nwanbiaohao.com\nwanbushu.com\nwanbuyu.com\nwancaiinfo.com\nwancaomei.com\nwanchangerp.com\nwanchaohotels.com\nwanche100.com\nwanche168.com\nwanchemi.com\nwancheng168.com\nwanchengwenku.com\nwanchuweilai.com\nwanci.cc\nwancibp.com\nwancili.com\nwanda-cti.com\nwanda-gh.com\nwanda-group.com\nwandacinemas.com\nwandaclub.cc\nwandacm.com\nwandafilm.com\nwandahotelinvestment.com\nwandahotels.com\nwandanji.cc\nwandaph.com\nwandaplazas.com\nwandarealm.com\nwandavista.com\nwandawic.com\nwandhao.com\nwandhi.com\nwanding.net\nwandingwangluo.com\nwandipay.com\nwandodo.com\nwandoer.com\nwandongli.com\nwandoudou.com\nwandouip.com\nwandoujia.com\nwanduoduo.com\nwaneziyuan.com\nwanfangche.com\nwanfangdata.com\nwanfangtech.com\nwanfangtech.net\nwanfantian.com\nwanfayun.com\nwanfoquan.com\nwanfucc.com\nwanfudaluye.com\nwanfuqianqiu.com\nwang-li.com\nwang-nan.com\nwang-russell.cc\nwang1314.com\nwang1314.net\nwanga.me\nwangaiche.com\nwangamela.com\nwangan.com\nwanganke.com\nwangbaobao.org\nwangbaobei.com\nwangbaoqiang-cloudcdn.com\nwangbixi.com\nwangcaio2o.com\nwangcaiwang.com\nwangcanmou.com\nwangchanggou.com\nwangchao.de\nwangchujiang.com\nwangchunsheng.com\nwangcms.com\nwangdafeed.com\nwangdahn.com\nwangdai114.com\nwangdai555.com\nwangdaibdt.com\nwangdaicaifu.com\nwangdaidongfang.com\nwangdaiguancha.com\nwangdaishikong.com\nwangdaisj.com\nwangdaitiandi.com\nwangdalao.com\nwangdali.net\nwangdaodao.com\nwangdianchaxun.com\nwangdianmaster.com\nwangdingchang321.xyz\nwangdingcup.com\nwangdongjie.com\nwangdu.site\nwangduanwifi.com\nwangeda.com\nwangeditor.com\nwangejiba.com\nwangfujing.com\nwanggongwang.com\nwanggou.com\nwangguai.com\nwanghaifeng.net\nwanghanyue.com\nwanghao.me\nwanghe.tv\nwanghong.zone\nwanghongluo.com\nwanghualang.com\nwanghuinet.com\nwanghz.com\nwangid.com\nwangjianshuo.com\nwangjiezhe.com\nwangjm.com\nwangjubao.com\nwangjumeng.xin\nwangjun.art\nwangjunwei.com\nwangkangzhong.com\nwangkewang.com\nwangkl.com\nwangkong.com\nwangle.com\nwangligroup.com\nwangling.net\nwanglingyue.com\nwanglong.com\nwanglu.info\nwangluoxiangmu.com\nwanglv.com\nwanglv.vip\nwangmei360.com\nwangmeng.com\nwangmingdaquan.cc\nwangmou.com\nwangniuwms.com\nwangpeiaiot.com\nwangpiao.com\nwangpiao.net\nwangpu.net\nwangqc.com\nwangqi.com\nwangqingzx.com\nwangren.com\nwangrunze.com\nwangshidi.com\nwangshitou.com\nwangshu.la\nwangshuashua.com\nwangshugu.com\nwangsu.com\nwangsu.net\nwangsucloud.com\nwangsuedge.com\nwangsuedge.net\nwangsutong.com\nwangt.cc\nwangtingrui.com\nwangtongtong.com\nwangtu.com\nwanguan.com\nwanguanwl.com\nwanguo-outlets.com\nwanguokang.com\nwanguotong.com\nwangwanglive.com\nwangwango.com\nwangweiluo.com\nwangwo.net\nwangxc.club\nwangxiangyule.com\nwangxianyuan.com\nwangxiao.net\nwangxiaobao.cc\nwangxiaobao.com\nwangxie.org\nwangxing.com\nwangxingcs.com\nwangxinhao.com\nwangxinlicai.com\nwangyangyang.vip\nwangyanpiano.com\nwangye6.com\nwangyeyixia.com\nwangyikai.com\nwangyin.com\nwangyinmao.com\nwangyou.com\nwangyou.ink\nwangyou2.com\nwangyouhangkong.com\nwangyuan.com\nwangyuedaojia.com\nwangyulue.com\nwangyunchuan.com\nwangyunf.com\nwangyuwang.com\nwangzhan123.net\nwangzhan31.com\nwangzhan360.com\nwangzhanbao.cc\nwangzhanbianji.com\nwangzhanchi.com\nwangzhantuiguang.net\nwangzhanzj.com\nwangzhe.com\nwangzhengzhen.com\nwangzhennan.com\nwangzherongyao.com\nwangzhuanz.com\nwanh5.com\nwanhea.com\nwanhebin.com\nwanheweb.com\nwanhi.com\nwanhongbao.com\nwanhongindigo.com\nwanhongji.com\nwanhu888.com\nwanhuabao.com\nwanhuaes.com\nwanhuahai.com\nwanhuajing.com\nwanhui365.com\nwanhuicar.com\nwanhuida888.com\nwanhuiya.com\nwanhumotor.com\nwanhunet.com\nwanimal1983.org\nwanjia.org\nwanjiacc.com\nwanjiachupin.com\nwanjiaiot.com\nwanjiashe.com\nwanjiashow.com\nwanjidashi.com\nwanjiedata.com\nwanjiedu.com\nwanjiejixie.com\nwanjing111.com\nwanjiquan.com\nwanjunshijie.com\nwanjutoy.com\nwanka5.com\nwankacn.com\nwankacn.net\nwankamall.com\nwanke123.com\nwanke798.com\nwanku.com\nwanlaiwang.com\nwanli.com\nwanli.org\nwanlian-group.com\nwanlicd.com\nwanliduo.com\nwanliniu.com\nwanlitong.com\nwanlongdianqi.com\nwanlongjituan.com\nwanmaco.com\nwanmei.com\nwanmei.net\nwanmeilink.com\nwanmeilr.com\nwanmeiyunjiao.com\nwanmi.com\nwanmingpiano.com\nwannaenergy.com\nwannaexpresso.com\nwanneng56.com\nwannengxiaoge.com\nwannengzj.com\nwannianli.net\nwannianli3.com\nwannianli7.com\nwannianli8.com\nwannianli9.com\nwannianqingjianzhan.com\nwannuoda.com\nwanplus.com\nwanpufeiliu.com\nwanqianyun.com\nwanqiula.com\nwanqutong.com\nwanren.com\nwanruihuanjing.com\nwanrungj.com\nwansanzu.com\nwansf.com\nwanshahao.com\nwanshancha.com\nwanshangding.com\nwanshanshuju.com\nwanshifu.com\nwanshifuapp.com\nwanshitong.com\nwanshouyou.net\nwanshu.com\nwanshuiqing.com\nwanshuiwater.com\nwanshulou.com\nwanshuyun.com\nwansixie.com\nwansongpu.com\nwansusyj.com\nwant-want.com\nwantexe.com\nwantgame.net\nwantiangroup.com\nwantiku.com\nwantong-tech.net\nwantowan.com\nwantquotes.net\nwantuju.com\nwantumusic.com\nwantwords.net\nwantwu.com\nwantxt.cc\nwanwan4399.com\nwanwan88.com\nwanwang.com\nwanwang.space\nwanwang.xin\nwanweiedu.com\nwanweixin.com\nwanwu.com\nwanwudezhi.com\nwanwuelian.com\nwanwumall.com\nwanwusc.com\nwanwushuo.com\nwanwuxia.com\nwanwuzhinan.com\nwanxia.com\nwanxiangauto.com\nwanxiangleasing.com\nwanxiangqihang.com\nwanxiangyouxian.com\nwanxiaochu.com\nwanxie.cc\nwanxiquan.com\nwanyabox.com\nwanyan.com\nwanyanwang.com\nwanye.cc\nwanyico.com\nwanyijizi.com\nwanyiwang.com\nwanyol.com\nwanyoo.com\nwanyouw.com\nwanyouxi.com\nwanyouxi7.com\nwanyr.com\nwanyuannews.com\nwanyuanxiang.com\nwanyuanyun.com\nwanyuenet.com\nwanyuhengtong.com\nwanyuhudong.com\nwanyujy.com\nwanyumi.com\nwanyunshuju.com\nwanyuproperty.com\nwanyuwang.com\nwanyx.com\nwanzaiwater.com\nwanzecc.com\nwanzhizr.com\nwanzhoujob.com\nwanzhoumls.com\nwanzhoumo.com\nwanzhua.com\nwanzhuang.com\nwanzhuangkj.com\nwanzhucdn.com\nwanzi.cc\nwanzi.com\nwanzia.com\nwanzjhb.com\nwanzuile.com\nwaodown.com\nwaoh.fun\nwaoo.cc\nwapone.net\nwaptt.com\nwaptw.com\nwar-sky.com\nwaralert.net\nwarchina.com\nwarcraftchina.com\nwarframeofficial.com\nwarhammertech.com\nwarmchina121.com\nwarmjar.com\nwarnp.org\nwarom.com\nwarpora.asia\nwarriorshoes.com\nwarriortire.com\nwarsk.com\nwarsongmobile.com\nwarstudy.com\nwarsu.com\nwarting.com\nwaruixinxi.com\nwarwww.com\nwas-expo.com\nwasabi.fun\nwasair.com\nwasanfeng.com\nwasd.plus\nwasdj.com\nwasee.com\nwashpayer.com\nwashun.com\nwashuw.com\nwasintek.com\nwasoinfo.com\nwasonchina.com\nwasu.com\nwasu.tv\nwasucnc.com\nwatch-space.com\nwatch-top.net\nwatch1905.com\nwatch4s.com\nwatchadmin.com\nwatchdios.com\nwatchds.com\nwatcheschep.com\nwatchlead.com\nwatchok.net\nwatchreplica.co\nwatchreplicaswiss.com\nwatchrm.com\nwatchshfw.com\nwatchsos.com\nwatchstor.com\nwatchtop.com\nwatchtraveler.com\nwatchwxfw.com\nwatchzb.com\nwater-cube.com\nwater520.com\nwater8848.com\nwaterchina.com\nwaterdp.com\nwaterdropfilter.com\nwaterenping.com\nwatergasheat.com\nwatergdd.com\nwaterjhh.com\nwaterlytech.com\nwatermc.org\nwatershowcg.com\nwatertek.com\nwatertu.com\nwateryx.com\nwatyuan.com\nwauee.com\nwauee.net\nwave-optics.com\nwavecn.com\nwavecommittee.com\nwavedsp.tech\nwavefront-optics.com\nwaveopt.com\nwaveshare.net\nwaveup.work\nwavezones.com\nwavideo.tv\nwavpub.com\nwawacm.com\nwawayaya.net\nwawayu.tv\nwawlhld.com\nwaxiaoxia.com\nwaxpi.com\nwaxrain.com\nwaxsivk.com\nwaxxh.me\nway2solo.com\nwayboosz.com\nwaycdn.com\nwayenbio.com\nwayhu.cc\nwayhu8.com\nwaylon.online\nwaynetechs.com\nwayos.com\nwayosbill.com\nwayoulegal.com\nwayoumi.com\nwayoxi.com\nwaypons.com\nwaysundata.com\nwaytit.com\nwaytoagi.com\nwayupss.store\nwayzim.com\nwazhuti.com\nwb133.com\nwb321.com\nwb521.net\nwb699.com\nwb86.com\nwbangdan.com\nwbb-electric.com\nwbbcdn.com\nwbcm55.com\nwbd99.com\nwbecrisfro.com\nwbeexpo.com\nwbgt.net\nwbh-sh.com\nwbhgwbnd.com\nwbiao.co\nwbiao.com\nwbiao120.com\nwbiaohome.com\nwbimg.com\nwbncp.com\nwbo529.com\nwboll.com\nwbolt.com\nwbpvc.com\nwbrks.com\nwbsdz.com\nwbstar.com\nwbsz.com\nwbt5.com\nwbtech.com\nwbtrans.com\nwbw.im\nwbwbwb.net\nwbxcx.net\nwbxinxi.com\nwbzd.net\nwc44.com\nwcansoft.com\nwcbygame.com\nwccbee.com\nwcccc.cc\nwccg.tech\nwcd.im\nwcdc.center\nwcfang.com\nwch-ic.com\nwch17.com\nwch666.com\nwchfgd.com\nwcjbb.com\nwcjbb.net\nwcjm.org\nwclbox.com\nwcloud.com\nwcnc-lh.akamaihd.net\nwcode.net\nwcp.hk\nwcqjyw.com\nwcsapi.com\nwcsapi.net\nwcsfa.com\nwcsteasker.com\nwcuhdi.com\nwcwlmobi.com\nwcxjs.com\nwcxsw.com\nwcyecs.com\nwd-ljt.com\nwdace.com\nwdashi.com\nwdaveh5game.com\nwdazgscbxh2.com\nwddcn.com\nwddns.net\nwddream.com\nwdexam.com\nwdf1tz.com\nwdf1tz.net\nwdfangyi.com\nwdfok.com\nwdfxw.net\nwdgf.com\nwdghy.com\nwdiyi.com\nwdj21.com\nwdjimg.com\nwdjky.com\nwdkao.com\nwdklchina.com\nwdkmall.com\nwdku.net\nwdkud6.com\nwdldl.com\nwdmagnet.com\nwdmcake.com\nwdmuz.com\nwdmyksm.com\nwdnld.com\nwdomob.com\nwdpharma.com\nwdpower.com\nwdres.com\nwdsdjxh.com\nwdsj2.com\nwdsjz.com\nwdsk.net\nwdstory.com\nwdsz.net\nwdtec.cc\nwdtuishu.com\nwduw.com\nwdw88.com\nwdwd.com\nwdwlb.com\nwdxmzy.com\nwdxtub.com\nwdycenter.com\nwdyiyuan.com\nwdyserver.com\nwdyxgames.com\nwdyy.com\nwdzj.com\nwdzx.com\nwe-ai.work\nwe-pass.com\nwe-vmaxgroup.com\nwe.com\nwe1130.com\nwe123.com\nwe2.name\nwe278.com\nwe2marry.com\nwe378.com\nwe4399.com\nwe4game.com\nwe54.com\nwe556.com\nwe7.cc\nweachat.net\nweadoc.com\nweakyon.com\nwealink.com\nweand.com\nweaoo.com\nweapp.com\nweapp.me\nweareing.store\nwearemanner.com\nwearesellers.com\nwearosbox.com\nweartrends.com\nweasing.com\nweather-lh.akamaihd.net\nweather.com\nweatherat.com\nweathercn.com\nweatherdt.com\nweatherol.com\nweavatar.com\nweavi.com\nweaview.com\nweb-rakouetnsei.net\nweb-tinker.com\nweb0518.com\nweb0898.net\nweb100.cc\nweb176.com\nweb1800.com\nweb2008.com\nweb2060.com\nweb20share.com\nweb265.net\nweb3.xin\nweb3389.com\nweb360.pw\nweb3caff.com\nweb3gate.cc\nweb3gate.io\nweb3ling.com\nweb3radio.com\nweb89.net\nweb930.com\nwebacc.net\nwebacg.com\nwebadminsystem66.com\nwebank.com\nwebankapp.com\nwebankcdn.net\nwebanktcftp.net\nwebankwealth.com\nwebankwealthcdn.net\nwebankwld.com\nwebankwyd.com\nwebarcx.com\nwebcamx666.com\nwebdns263.com\nwebetter-ad.com\nwebfalse.com\nwebfont.com\nwebfoss.com\nwebfreecounter.com\nwebfunny.com\nwebfuwu.com\nwebgame138.com\nwebgame163.com\nwebgamehome.com\nwebgetstore.com\nwebgzs.com\nwebhek.com\nwebiolotech.com\nwebjike.com\nwebjx.com\nwebkaka.com\nwebkdcdn.com\nwebkf.net\nwebkv.com\nwebmaster.me\nwebmaster5u.com\nwebmulu.com\nwebofknowledge.com\nwebok.me\nwebok.net\nwebond.net\nwebpackjs.com\nwebportal.cc\nwebportalapi.com\nwebpower.asia\nwebpowerchina.com\nwebqxs.com\nwebrtc.win\nwebsaru.net\nwebsbook.com\nwebsec1.com\nwebsec1.net\nwebsem.cc\nwebseo9.com\nwebshao.com\nwebshu.net\nwebsitecname.com\nwebsjcdn.com\nwebsjy.com\nwebsky.biz\nwebsocket-test.com\nwebsoso.com\nwebsztz.com\nwebtrncdn.com\nwebui.fun\nwebullbroker.com\nwebuy.ai\nwebuy.vip\nwebview.tech\nwebworker.tech\nwebxgame.com\nwebxin.com\nwebyang.net\nwebyounger.com\nwebzzcdn.com\nwecanbio.com\nwecare-bio.com\nwecarepet.com\nwecash.net\nwecasting.com\nwecenter.com\nweceshi.com\nwechat.com\nwechat.design\nwechat.me\nwechat.org\nwechat77.com\nwechatapp.com\nwechatapp.us\nwechatauthdemo.com\nwechatdevelop.com\nwechatify.net\nwechatlegal.com\nwechatlegal.net\nwechatmessenger.com\nwechatmessenger.us\nwechatos.net\nwechatpay-global.com\nwechatpay.com\nwechatpay.com.hk\nwechatpay.com.my\nweclassroom.com\nwecloud.io\nwecloudx.com\nwecom.work\nwecomput.com\nwecrm.com\nwecrm.net\nwecycling.com\nwed2008.com\nwed6.com\nwedate.me\nwedcm.com\nweddingos.com\nwedengta.com\nwedev.cool\nwedeveloper.com\nwedfairy.com\nwedn.net\nwedoany.com\nwedoctor.com\nwedoexpress.com\nwedooapp.com\nwedumedical.com\nweebei.com\nweebia.com\nweedo3d.org\nweedong.com\nweeet.com\nweefang.com\nweeiy.com\nweekus.com\nweelv.com\nweeqoo.com\nweeyun.com\nwefans.com\nwefinger.club\nwefitos.com\nweflywifi.com\nwefunol.com\nwegame.com\nwegameapi.com\nwegamedesign.com\nwegamedeveloper.com\nwegamemail.com\nwegameplus.com\nwegamex.com.hk\nwegdj.com\nwegene.com\nwego-healthcare.com\nwegooooo.com\nwehandbio.com\nwehefei.com\nwehelpwin.com\nweherepost.com\nwehichina.com\nwei-ben.com\nwei-li.com\nwei-ze.com\nwei2008.com\nwei6.com\nwei688.com\nweiaixiaoshuo.com\nweianet.com\nweiba66.com\nweibanan.com\nweibang.vip\nweibangong.com\nweibanzhushou.com\nweibo.com\nweibo.tv\nweibocdn.com\nweibochem.com\nweibohelper.com\nweiboi.com\nweibolj.com\nweibopay.com\nweibopie.com\nweiboreach.com\nweibosci.com\nweiboums.com\nweibowang.net\nweiboyi.com\nweibozn.com\nweibu.com\nweibusi.net\nweicaifu.com\nweicaixun.com\nweicewang.com\nweichai.com\nweichaipower.com\nweichaishi.com\nweichengchemical.com\nweicher-sz.com\nweichewl.com\nweichuanbo.com\nweichuangtech.com\nweichuming.com\nweico.cc\nweico.com\nweicogif.com\nweicon.cc\nweicot.com\nweicunmall.com\nweida888.com\nweidanbai.com\nweidanci.com\nweidansj.com\nweidaoliu.com\nweidian-inc.com\nweidian.cc\nweidian.com\nweidian.gg\nweidianfans.com\nweidiango.com\nweidianmishu.com\nweidibio.com\nweidoufu.com\nweidown.com\nweidulinchang.com\nweiduruanjian.com\nweiengift.com\nweifengchina.com\nweifenghr.com\nweifengke.com\nweifengtang.com\nweifenpay.com\nweiforyou.net\nweifrom.com\nweifujd.com\nweigangdairy.com\nweigangqin.com\nweigaogroup.com\nweigaoholding.com\nweigaoyaoye.com\nweige2006.com\nweige55.com\nweighment.com\nweigongju.org\nweiguan.com\nweiguang.cc\nweiguanlaw.com\nweihai.tv\nweihaibsy.com\nweihaicollege.com\nweihaifengji.com\nweihaihaiwang.com\nweihaisheng.com\nweihaobang.com\nweihaoyi.com\nweiheshidai.com\nweihua-newmaterial.com\nweihua2.com\nweihuagroup.com\nweihubao.com\nweihuijob.com\nweihuitel.com\nweihulian.com\nweihuo.site\nweihz.net\nweii.cc\nweiixxin.com\nweijia1999.com\nweijiancloud.com\nweijianmen.com\nweijingzhijia.com\nweijinsuo.com\nweijiu.org\nweijiuxin.com\nweijizongbao.com\nweijj.com\nweijq.com\nweiju.net\nweijuju.com\nweikao.com\nweikaowu.com\nweikasen.com\nweike.fm\nweike21.com\nweikeimg.com\nweikelink.com\nweikengtech.com\nweikenhair.com\nweikeqi-biotech.com\nweikerifu.com\nweikuw.com\nweilai555.com\nweilaicaijing.com\nweilaili.com\nweilairzdb.com\nweilaishidai.com\nweilaitianwang.com\nweilaitianwang.info\nweilaitiku.com\nweilaiyunxiao.com\nweilaizhaiju.com\nweilaizhushou.com\nweilan.com\nweilan27.com\nweilandog.com\nweilanhaian.com\nweilanliuxue.com\nweilanwl.com\nweilayun.com\nweile.com\nweileapp.com\nweilegetu.com\nweilekuiming.com\nweilenicetime.com\nweileryiyt.com\nweiliangsport.com\nweilindct.com\nweiling520.com\nweilingapp.com\nweilinggame.com\nweilinovel.net\nweilitoutiao.net\nweilongshipin.com\nweimaelectric.com\nweimagroup.com\nweimai.com\nweimaitu.com\nweimaqi.net\nweimeigu.net\nweimeiyijing.com\nweimen.hu\nweimi24.com\nweimiaocaishang.com\nweimibio.com\nweimingchem.com\nweimingcq.com\nweimingedu.com\nweimingkids.com\nweimingxt.com\nweimisystem.com\nweimizhengxing.com\nweimob.com\nweimob.net\nweimobapp.com\nweimobcloud.com\nweimobdc.com\nweimobqa.com\nweimobwmc.com\nweimoka.com\nweinan.cc\nweinisongdu.com\nweinm.com\nweinuo.work\nweiot.net\nweipaitang.com\nweipe.vip\nweiphone.com\nweiphone.net\nweiphp.com\nweipinchu.com\nweiping.com\nweipu-he.com\nweipu.com\nweipu.live\nweipugroup.com\nweipuhj.com\nweiputek.com\nweiq.com\nweiqi.cc\nweiqiaocy.com\nweiqiaoyun.com\nweiqidaxing.com\nweiqiming.com\nweiqinfang.com\nweiqing120.com\nweiqingbao.cc\nweiqiok.com\nweiqitv.com\nweiquyx.com\nweiren.com\nweirenjob.com\nweiresearch.com\nweiribio.com\nweiruipai.net\nweisanyun.com\nweisay.com\nweishadian.com\nweishaizi.com\nweishan.cc\nweishan2015.com\nweishang99.net\nweishangagent.com\nweishangmh.com\nweishangshijie.com\nweishangtui.vip\nweishengrc.com\nweishi.com\nweishi016.com\nweishi024.com\nweishi100.com\nweishigz.com\nweishipin.com\nweishishuyuan.com\nweisiliang.com\nweismarts.com\nweistang.com\nweisuda.net\nweisurvey.com\nweisurvey.net\nweisuyun.com\nweisuyun.net\nweisyun.com\nweitehui.com\nweitiewang.com\nweitoupiao.com\nweituibao.com\nweitunit.com\nweituo.com\nweituobang.net\nweitupian.com\nweitushe.com\nweituya.com\nweiunity.com\nweivd.com\nweiwall.com\nweiwangpu.com\nweiwangvip.com\nweiwanjia.com\nweiweixiao.net\nweiweiyi.com\nweiwenjia.com\nweiwom.com\nweiwss.com\nweiwuhui.com\nweixianmanbu.com\nweixiaoduo.com\nweixiaohan.com\nweixiaoi.com\nweixiaoqu.com\nweixiaotong.com\nweixiaov.club\nweiximusic.com\nweixin-001.com\nweixin.com\nweixin12315.com\nweixinbang.com\nweixinbiaoqing.com\nweixinbridge.com\nweixincall.com\nweixindadang.com\nweixindevelop.com\nweixingate.com\nweixingmap.com\nweixingon.com\nweixingongzuoshi.com\nweixingv.com\nweixinhost.com\nweixinhow.com\nweixinjia.net\nweixinjiajia.com\nweixinju.com\nweixinkd.com\nweixinmvp.com\nweixinpy.com\nweixinqing.com\nweixinqn.com\nweixinqz.com\nweixinrensheng.com\nweixinsir.com\nweixinsxy.com\nweixinyidu.com\nweixinyunduan.com\nweixistyle.com\nweixiu.name\nweixiu2.com\nweixiuchu.com\nweixiuka.com\nweixjn.com\nweixue100.com\nweixueyuan.net\nweixun.com\nweixun998.com\nweixuncj.com\nweixunyunduan.net\nweiyan.me\nweiyan000.com\nweiyangx.com\nweiyanjiang.com\nweiyapaper.com\nweiye-alu.com\nweiye.me\nweiyes.com\nweiyi.com\nweiyi.link\nweiyiqibj.com\nweiyitec.com\nweiyituku.com\nweiyituliao.com\nweiyiwangluo.com\nweiyoubot.com\nweiyours.com\nweiyouxi.com\nweiyu98.com\nweiyueliang.com\nweiyueread.com\nweiyun.com\nweiyun001.com\nweiyunchong.com\nweiyunfushi.com\nweiyunjian.com\nweiyuntop.com\nweiyunyingxiang.com\nweizhanabc.com\nweizhangjilu.com\nweizhangwang.com\nweizhanle.com\nweizhi.com\nweizhike.club\nweizhipin.com\nweizhishu.com\nweizhivet.com\nweizhiyundong.list\nweizhoudaoly.com\nweizhuangfu.com\nweizhuanji.com\nweizoom.com\nweizunkj.com\nweja-hospital.com\nwejianzhan.com\nwejias.com\nwejizan.com\nwejizan.ink\nwejoydata.com\nweka.life\nwekbo.com\nweknow.io\nwekuo.com\nwelain.com\nwelansh.com\nwelaw.com\nwelchmat.com\nwelcome-lt.com\nwelcrm.com\nweledpower.com\nwelefen.com\nweleve.com\nwelfull.com\nwelgwiyan.com\nweliads.com\nwelian.com\nwelidaimkt.com\nwelife001.com\nwelife100.com\nwelinkpark.com\nwelk.co\nwell-dns.com\nwell-js.com\nwell-trust.com\nwellaide.com\nwellav.com\nwellcee.com\nwellhope.net\nwelljoint.com\nwelllinkio.com\nwellnj.com\nwellnode.com\nwellongmedical.com\nwellpie.com\nwellplas.com\nwellreach.com\nwells-shipping.com\nwellselectronic.com\nwellsepoxy.com\nwellsoon.com\nwellswam.com\nwelltonhotel.com\nwelltrend-edu.com\nwellwhales.com\nwelove520.com\nwelovead.com\nwelqua.com\nwelzek.com\nwemagfmp.com\nwemart.com\nweme.fun\nwemeche.com\nwemediacn.com\nwemomo.com\nwemorefun.com\nwems.net\nwemtime.com\nwemvp.com\nwenai.net\nwenancehua.com\nwenancn.com\nwenandaquan.com\nwenangou.com\nwenanwang.com\nwenanzhe.com\nwenbagu.com\nwenbo.cc\nwenbofund.com\nwenbothinktank.com\nwencaischool.com\nwencan.com\nwenchain.com\nwenda1000.com\nwenda123.com\nwendabaike.com\nwendahu.com\nwendaifu.com\nwendal.net\nwendangdaquan.com\nwendangmao.net\nwendangwang.com\nwendangxiazai.com\nwendax.com\nwendaxiaowu.com\nwendns.com\nwendoc.com\nwendougee.com\nwendu.com\nwenduedu.com\nwendumao.com\nwenfangcn.com\nwenfangjushe.com\nwenfangnet.com\nwenfenggroup.com\nwengbi.com\nwengegroup.com\nwengem.com\nwengkui.com\nwengmeiling.com\nwenguang.com\nwenguangta.com\nwenguangzhineng.com\nwenguo.com\nwenhao123.com\nwenhaofan.com\nwenhetong.com\nwenhua.cc\nwenhuakejiao.com\nwenhualvyou.net\nwenhui.space\nwenidc.com\nwenjian.net\nwenjianbaike.com\nwenjiangbus.com\nwenjiangs.com\nwenjiasu.com\nwenjingnetwork.com\nwenjingzhai.com\nwenjiwu.com\nwenju666.com\nwenjuan.cc\nwenjuan.com\nwenjuan.link\nwenjuan.ltd\nwenjuan.net\nwenjuan.pub\nwenjuanba.com\nwenjuanbang.com\nwenjuanshow.com\nwenjuntech.com\nwenkaoba.com\nwenkeju.com\nwenku.in\nwenku.net\nwenku365.com\nwenku7.com\nwenku8.cc\nwenku8.com\nwenku8.net\nwenkub.com\nwenkudao.com\nwenkudaquan.com\nwenkunet.com\nwenkuvip.com\nwenkuwenku.com\nwenkuxiazai.net\nwenlc.com\nwenli-china.com\nwenlian123.com\nwenliangedu.com\nwenlvnews.com\nwenlvpai.com\nwenmeng.com\nwenmi114.com\nwenmingban.com\nwenneart.com\nwenpie.com\nwenqy.com\nwenroo.com\nwenrouge.com\nwenryxu.com\nwensang.com\nwensb.org\nwenshaktv.com\nwenshannet.com\nwenshen.net\nwenshenba.com\nwenshendaka.com\nwenshenku.com\nwenshenxiu.com\nwenshuba.com\nwenshubang.com\nwenshushu.com\nwensiluo.com\nwensli.com\nwenstech.com\nwensuocaster.com\nwentab.com\nwentihu.com\nwentiquan.net\nwentiyi.com\nwentong.com\nwenwen.com\nwenwo.com\nwenwu8.com\nwenwuchina.com\nwenxiaha.com\nwenxiaobai.com\nwenxiaoyou.com\nwenxiaozhan.com\nwenxiaozhan.net\nwenxin-ge.com\nwenxinapp.com\nwenxingonline.com\nwenxiql.com\nwenxiu.com\nwenxuan.news\nwenxue100.com\nwenxue360.com\nwenxueapp.com\nwenxuedu.com\nwenxuem.com\nwenxuemm.com\nwenxuesk.com\nwenxuesk.info\nwenxuesk.net\nwenxuesk.org\nwenxuetiandi.com\nwenyaguan.com\nwenyaqi.net\nwenyi188.com\nwenyijcc.com\nwenyoutai.com\nwenyouyun.com\nwenytao.com\nwenyu6.com\nwenyuanenviron.com\nwenyucdn.com\nwenyupages.com\nwenzaizhibo.com\nwenzhangba.com\nwenzhanghui.com\nwenzheng.club\nwenzhihuai.com\nwenzhouchayuan.com\nwenzhoumajiang.com\nwenzhoushuke.com\nwenzhousx.com\nwenziyuan.com\nweoathome.com\nwepiao.com\nwepie.com\nwepieoa.com\nweplayapp.com\nweplaybubble.com\nweplayer.cc\nweplaymore.com\nweplus.com\nweproedu.com\nweqoocu.com\nwerewolf.online\nwerfactory.com\nwerings.store\nwerkai.com\nwerlchem.com\nwertalk.com\nwesane.com\nwescrm.com\nwesdom.me\nweshaketv.com\nweshape3d.com\nweshine.im\nweshineapp.com\nwesimiot.com\nwesing-game.com\nwesingapp.com\nwest-motion.com\nwest.xyz\nwest263.com\nwest95582.com\nwest999.com\nwestanpharma.com\nwestaport.com\nwestarcloud.com\nwestbund.art\nwestbund.com\nwestchinago.com\nwestcits.com\nweste.net\nwestendwell.ca\nwestfutu.com\nwestinfosoft.com\nwestingz.com\nwestlake-vacuum.com\nwestlakedata.com\nwestlakegenetech.com\nwestlakeinst.com\nwestlakeomics.com\nwestlaw.com\nwestleadfund.com\nwestmining.com\nwestmininggroup.com\nwestmonth.com\nwestonecloud.com\nwestpac.group\nwestsecu.com\nwestsh.com\nwestsummitcap.com\nwesure100.com\nwetab.link\nwetest.host\nwetest.net\nwetest.org\nwetestlab.net\nwetherm.com\nweti.me\nweton.net\nwetools.com\nwetools.pro\nwetrial.com\nwetruetech.com\nwetry.shop\nwetsd.com\nwetuc.com\nwetv.vip\nwetvinfo.com\nweui.io\nweuschool.com\nwevul.com\nwewillpro.com\nwewinpe.com\nwework-pro.com\nwework-studio.com\nweworkcloudesk.com\nwewuhu.com\nwex5.com\nwex7.com\nwexcdn.com\nwexguivq.com\nwexiaocheng.com\nwexin.com\nwey.com\nweyee.com\nweyesimg.com\nweyhd.com\nweyic.com\nweyo.me\nwezeit.com\nwezhan.hk\nwezhan.net\nwezhan.us\nwezhibo.net\nwezhibo.tv\nwezhicms.com\nwezhuiyi.com\nwezonet.com\nwf.pub\nwf121.com\nwf163.com\nwf66.com\nwfaozhuo.com\nwfbbs.com\nwfc805.com\nwfcgs.com\nwfdaily.com\nwfdata.club\nwfdj.net\nwfdqzx.com\nwfdsjls.com\nwfdyes.com\nwfeil.com\nwfek.com\nwff168.com\nwffc120.com\nwffms.com\nwfhbjg.com\nwfhlxy.com\nwfiltericf.com\nwfilterngf.com\nwfits.com\nwfjec.com\nwfjgzs.com\nwfjienuo.com\nwfjimg.com\nwfjsd.com\nwfjtjy.com\nwfkji.com\nwflgjx.com\nwflps.com\nwflushebei.com\nwfmzjscl.com\nwfrcsc.com\nwfsanshan.com\nwfshiliyy.com\nwfswjt.com\nwfsydzxyy.com\nwfsyzx.net\nwftdrh.com\nwftvqcm.com\nwfuyu.com\nwfwzg.xyz\nwfy.pub\nwfzbjx.com\nwfzczdh.com\nwfzqhb.com\nwfzssz.com\nwg-views.com\nwg999.com\nwgc2025.com\nwgce.space\nwghai.net\nwghaos.com\nwghostk.com\nwghpdi.com\nwgimg.com\nwgl-group.com\nwglh.com\nwglm.net\nwgm66.com\nwgmf.com\nwgmotor.com\nwgnds.com\nwgoic.com\nwgos.com\nwgppt.com\nwgpsec.org\nwgtechjx.com\nwgxdxx.com\nwgxy.com\nwgxy.net\nwgy.cc\nwh-anhua.com\nwh-aojie.com\nwh-badges.com\nwh-baidu.com\nwh-bus.com\nwh-charity.com\nwh-china.com\nwh-dongjiang.com\nwh-haipu.com\nwh-hsun.com\nwh-motorshow.com\nwh-mx.com\nwh-swhj.com\nwh-yuanhang.com\nwh10000.com\nwh100idc.com\nwh111.com\nwh119.com\nwh12345szzx.com\nwh50.com\nwh5yy.com\nwh6yy.com\nwh6z.com\nwh702g.ren\nwhabl.net\nwhaee.com\nwhafxh.org\nwhagcg.com\nwhairport.com\nwhale-king.com\nwhale-plus.com\nwhale123.com\nwhalefall.space\nwhaleskts.com\nwhalet.com\nwhaleunique.com\nwhalipaycs.com\nwhampoa-design.com\nwhatbuytoday.com\nwhatchina.com\nwhatfugui.com\nwhatismyip.com\nwhatsns.com\nwhatswebyuo.com\nwhattheybuy.com\nwhaudio.com\nwhbahyxh.com\nwhbaishitong.com\nwhbbs.com\nwhbc2000.com\nwhbcrs.com\nwhbear.com\nwhbec.com\nwhbester.com\nwhbgdt.com\nwhbgy.net\nwhbhst.com\nwhbj88.com\nwhbjdn.com\nwhbodywell.com\nwhbts.com\nwhbuilding.com\nwhbwj.com\nwhbws.com\nwhbx.org\nwhcaijing.net\nwhcat.net\nwhcbank.com\nwhcbd.net\nwhcbs.com\nwhccb.com\nwhcch802.com\nwhcdc.org\nwhcdwater.com\nwhcfjsjt.com\nwhcfjt.com\nwhcfs.org\nwhcgtx.com\nwhchem.com\nwhchip.com\nwhcibe.com\nwhcjfc.com\nwhcjfq.com\nwhcjkq.com\nwhcotton.com\nwhcqedu.com\nwhcsfzjt.com\nwhcst.com\nwhcsyc.com\nwhctcii.com\nwhctfcjt.com\nwhctjg.com\nwhctv.com\nwhcx.group\nwhcx365.com\nwhcyit.com\nwhdayy.com\nwhdckj.com\nwhdhgd.com\nwhdjxx.com\nwhdlfu.com\nwhdlkj.com\nwhdonde.com\nwhdqhj.com\nwhdrawing.com\nwhdsck.com\nwhdsyy.com\nwhdxhzx.com\nwhec-tencentclb.cloud\nwhec-tencentclb.com\nwhec-tencentclb.net\nwhec-tencentclb.work\nwhecb.com\nwhecloud.com\nwhecn.com\nwhedu.net\nwhee.com\nwhenchat.net\nwhenever-online.com\nwherexpress.com\nwherxian.com\nwhetc.com\nwhevt.com\nwhewash.com\nwhfamous.com\nwhfanyi.com\nwhfazun.com\nwhfeiyou.com\nwhfengli.com\nwhfilter.com\nwhfles.com\nwhfmg.org\nwhfph.com\nwhgas.com\nwhgayy.com\nwhgdgjt.com\nwhggjk.com\nwhggjtjs.com\nwhggvc.net\nwhggzc.com\nwhgh.org\nwhghjt.com\nwhgjzt.com\nwhgk.com\nwhglkf.com\nwhgmbwg.com\nwhgnjt.com\nwhgnyy.com\nwhgtgh.com\nwhguangguyun.com\nwhguanshan.com\nwhguo.com\nwhgwbn.net\nwhgyt.com\nwhhaifang.com\nwhhaiyue.com\nwhhdcz.com\nwhhdgk.com\nwhhdjzzl.com\nwhhdky.com\nwhhdmt.com\nwhhengchang.com\nwhhexin.com\nwhhhealth.com\nwhhhxy.com\nwhhjjt.com\nwhhjpharm.com\nwhhkbyg.com\nwhhkgjt.com\nwhhksj.com\nwhhmgroup.com\nwhhmmbl.com\nwhhouse.com\nwhhpaccp.com\nwhhr.com\nwhhryd.com\nwhhsg.com\nwhhtjg.com\nwhhtjt.com\nwhhtyl.com\nwhhuatian.com\nwhhuayou.com\nwhhxi.com\nwhhxyk.com\nwhhykg.com\nwhhysound.com\nwhhyyy.com\nwhhzhn.com\nwhhztcm.com\nwhhzyj.com\nwhib.com\nwhicec.com\nwhichmba.net\nwhicu.com\nwhidc.com\nwhidf.com\nwhidy.net\nwhiee.com\nwhiie-expo.com\nwhimsywarpgame.cc\nwhinfo.net\nwhir.net\nwhisperto.net\nwhite-collar.net\nwhite-dolphin.com\nwhitebox.im\nwhitecat.com\nwhitecdnx.com\nwhitegem.net\nwhitemedia-china.com\nwhiteswanhotels.com\nwhizen.com\nwhjaco.com\nwhjbh.com\nwhjclgs.com\nwhjdsjfkdfd.cfd\nwhjf.com\nwhjh120.com\nwhjhb.org\nwhjiahai.com\nwhjiaoy.com\nwhjinlong.com\nwhjjhbj.com\nwhjkcj.com\nwhjkct.com\nwhjksyxx.com\nwhjldj.com\nwhjm.com\nwhjrjjt.com\nwhjrjt.com\nwhjrjy.com\nwhjst.com\nwhjsxx.com\nwhjtjt.com\nwhjuren.com\nwhjxbaby.com\nwhjy.net\nwhjylh.com\nwhjyx.com\nwhjyxh.com\nwhjyxx.com\nwhjzxh.com\nwhjzxx.com\nwhjzy.net\nwhjzyxh.org\nwhk.hk\nwhkakaxi.com\nwhkc.com\nwhkcy.com\nwhkingdom.com\nwhkjdxyy.com\nwhkjz.com\nwhkqd.com\nwhkxzl.com\nwhkykj.com\nwhlabor.com\nwhland.com\nwhlangxing.com\nwhleishen.com\nwhlexue.com\nwhlgchache.com\nwhlib.com\nwhlido.com\nwhljyl.com\nwhlkwy.com\nwhlovehome.com\nwhlpa.com\nwhlrhd.com\nwhlynk.com\nwhmama.com\nwhmc2005.com\nwhmdedu.com\nwhmeigao.com\nwhmf8.com\nwhminwei.com\nwhmj.org\nwhmlcy.net\nwhmnls.com\nwhmnrc.com\nwhmnx.com\nwhmoocs.com\nwhmvc.net\nwhmxrj.com\nwhmylike.cc\nwhmylikekq.com\nwhmzkf.com\nwhnewcando.com\nwhnfc.com\nwhnyd.com\nwho.cx\nwho2o.com\nwhoami.akamai.net\nwhoiscx.com\nwhoisreminder.net\nwhoisspy.ai\nwhongtec.com\nwhoolala.com\nwhooyan.com\nwhoregamer.com\nwhovii.com\nwhpantosoft.com\nwhpanva.com\nwhpcschool.com\nwhphbc.com\nwhplmd.com\nwhpma.org\nwhptc.org\nwhpx.net\nwhqcbj.com\nwhqcpx.com\nwhqcst.com\nwhqianxing.com\nwhqjjt.com\nwhqtdjy.com\nwhqtgqbwg.com\nwhqunyu.com\nwhqwyd.com\nwhqyw.com\nwhrango.com\nwhrayy.com\nwhrazf.com\nwhrcbank.com\nwhrenai.com\nwhres.net\nwhrhkj.com\nwhrj.com\nwhrl.net\nwhrsip.com\nwhrszx.com\nwhrtmpay.com\nwhrtyycg.com\nwhsctgs.com\nwhsdhyy.com\nwhsdsyy.com\nwhsgj.com\nwhsgyy.com\nwhsir.com\nwhsjfs.com\nwhsjytyy.com\nwhskq.com\nwhsladz.com\nwhsladz.net\nwhsmzc.com\nwhsql.org\nwhsrc.com\nwhsthjtzjt.com\nwhsundata.com\nwhsw.net\nwhswcyy.com\nwhswx.com\nwhsxsy88.com\nwhsy.org\nwhsyy.net\nwhszniao.com\nwhtaxi.com\nwhtbglass.com\nwhtbgroup.com\nwhtbq.com\nwhtcm.com\nwhtcsz.com\nwhtdcb.com\nwhtdlx.com\nwhtdsc.com\nwhtfzy.com\nwhthgy.com\nwhtime.net\nwhtmhh.com\nwhtongyun.com\nwhtonhe.com\nwhtpgbyy.com\nwhtpi.com\nwhtpyy.com\nwhtpyzx.com\nwhtran.com\nwhtryg.com\nwhtryine.com\nwhtsapp-part.team\nwhtto.com\nwhttsy.com\nwhtuff.com\nwhtxcloud.com\nwhtzb.org\nwhu-cveo.com\nwhu.pt\nwhualong.com\nwhucopm.com\nwhudfr.com\nwhudows.com\nwhuh.com\nwhuhzzs.com\nwhulabs.com\nwhulc.com\nwhunitedvet.com\nwhuss.com\nwhut-px.com\nwhutech.com\nwhuznhmedj.com\nwhvkk.com\nwhvms.com\nwhwanshun.com\nwhwat.com\nwhwater.com\nwhwd.com\nwhwdky.com\nwhweb.net\nwhwebsite.com\nwhweiying.com\nwhweo.com\nwhwgcm.com\nwhwindplus.com\nwhwjnwn522.vip\nwhwkzc.com\nwhwm.net\nwhwm.org\nwhwomensmarathon.com\nwhwtqx.com\nwhwuyan.com\nwhwx2018.com\nwhwxxy.com\nwhwz.com\nwhx0621.com\nwhxcepc.com\nwhxcy.com\nwhxh.com\nwhxhdn.com\nwhxrjt.com\nwhxsdn.com\nwhxunw.com\nwhxwxzxc.com\nwhxy.net\nwhxysz.net\nwhybh2015.com\nwhycan.com\nwhycw.com\nwhyec.com\nwhyenjoy.com\nwhyesi.fun\nwhyestar.com\nwhyicheng.com\nwhyimingkeji.com\nwhyinzhimei.com\nwhyiqitong.com\nwhyky.com\nwhyongwei.com\nwhyrtc.com\nwhys558.com\nwhysb.org\nwhysdomain.com\nwhyshop.com\nwhysodiao.com\nwhysw.org\nwhysx.com\nwhysxc2c.com\nwhyun.com\nwhyuntai.com\nwhyunzhou.fun\nwhyushang.com\nwhyyhy.com\nwhyyjt.com\nwhyyy.com\nwhyzrcb.com\nwhzb.com\nwhzbdw.com\nwhzc2008.com\nwhzdyy.com\nwhzglc.com\nwhzh-cw.com\nwhzhanyi.com\nwhzhaopin.net\nwhzhjty.com\nwhzhongzhi.com\nwhzhtd.com\nwhzhzxmr.com\nwhzjyy.com\nwhzjzxy.com\nwhzkb.com\nwhzph.com\nwhzsrc.com\nwhzszy.com\nwhzwzk.com\nwhzwzs.com\nwhzxht.com\nwhzxzls.com\nwhzydz.com\nwhzys.com\nwhzzhb.com\nwibaidu.com\nwicep.com\nwicp.net\nwicp.vip\nwicresoft.com\nwidgetable.net\nwiduu.com\nwietone.com\nwifenxiao.com\nwifi188.com\nwifi6667.com\nwifi8.com\nwifiapi.net\nwifibanlv.com\nwifichain.com\nwificstia.com\nwifidigyy.com\nwifidog.pro\nwifigx.com\nwifihell.com\nwifijy.com\nwifilu.com\nwifimsl.com\nwifinew.com\nwifinews.com\nwifiniu.com\nwifire.net\nwifisdk.net\nwifishenqi.com\nwifivpn.net\nwifiwx.com\nwifizj.com\nwifussion.com\nwigenbio.com\nwiicha.com\nwiihey.com\nwiihg.com\nwiinkle.com\nwiiteer.com\nwiitrans.com\nwiiun.com\nwiiyi.com\nwikicaring.com\nwikiexpo.com\nwikiimgs.com\nwikimbti.com\nwikipediaxx.icu\nwildcardx.net\nwilddog.com\nwilddream.net\nwildfire.work\nwildfirechat.net\nwildgun.net\nwildhorde.com\nwildto.com\nwildwind.com\nwildwindpharm.com\nwiley.com\nwilhb.com\nwillapps.com\nwillcdn.com\nwilliameva.com\nwilliamslullaby.com\nwillingchem.com\nwillingchina.com\nwillnanobio.com\nwillsemi.com\nwillsfitness.net\nwillwin91.com\nwiloon.com\nwimetro.com\nwimiar.com\nwin-haoxiang-win.com\nwin-ke.com\nwin-man.com\nwin007.com\nwin1032.com\nwin1064.com\nwin10cjb.com\nwin10com.com\nwin10d.com\nwin10gw.com\nwin10h.com\nwin10net.com\nwin10set.com\nwin10w.net\nwin10win.com\nwin10world.com\nwin10ww.com\nwin10xitong.com\nwin10zyb.com\nwin3000.com\nwin310.com\nwin4000.com\nwin71234.com\nwin7china.com\nwin7en.com\nwin7qijian.com\nwin7qjb.com\nwin7xzb.com\nwin8.net\nwin866.com\nwin8china.com\nwin8e.com\nwin8xiazai.com\nwinallseed.com\nwinature.com\nwinbaoxian.com\nwinbjb.com\nwinbond-ic.com\nwinbons.com\nwinbywin.com\nwincellchina.com\nwincheers.com\nwincheers.net\nwincologistics.com\nwincome.group\nwincomn.com\nwincoprint.net\nwind.ink\nwind.moe\nwindaka.com\nwindbg.download.prss.microsoft.com\nwindcoder.com\nwindesign.cc\nwindeyenergy.com\nwindfone.com\nwindfonts.com\nwindin.com\nwindmsn.com\nwindoor168.com\nwindows10.pro\nwindows10zj.com\nwindows11.pro\nwindows7en.com\nwindowstool.net\nwindowsupdate.microsoft.com\nwindowszj.com\nwindpayer.com\nwinds.red\nwindsbridge.com\nwindsns.com\nwindspeedbike.com\nwindtch.com\nwindtourgame.com\nwine-world.com\nwine9.com\nwinebar-pur.com\nwinegame.net\nwinekee.com\nwinemagz.com\nwinenice.com\nwines-info.com\nwinesinfo.com\nwinesou.com\nwineworld.vip\nwinex-hk.com\nwinex-sh.com\nwinfang.com\nwinfreeinfo.com\nwing-cafe.com\nwing-id.com\nwing-max.com\nwingconn.com\nwinglinetrans.com\nwinglungbank.com\nwingmob.com\nwingon-travel.com\nwingtecher.com\nwinheadhunter.com\nwinhealth.hk\nwinhealthgroups.com\nwinhlb.com\nwinhong.com\nwinicssec.com\nwinjoinit.com\nwinkingworks.com\nwinkkie.com\nwinksi.com\nwinlongtech.com\nwinmoes.com\nwinndoo.com\nwinner-hitech.com\nwinner-rbt.com\nwinner9.com\nwinnerholding.com\nwinnermicro.com\nwinnerracing.com\nwinnerway.com\nwinnet.cc\nwinningdq.com\nwinos.me\nwinotes.net\nwinotmk.com\nwinowe.com\nwinpe.cc\nwinpex-cn.com\nwinpexgroup.com\nwinrim.com\nwinrobot360.com\nwinsalesaas.com\nwinsenseos.com\nwinshang.com\nwinshangdata.com\nwinsing.net\nwinspay.com\nwinstandard.com\nwinstoncc.com\nwinsui.com\nwinsun3d.com\nwinsurface.com\nwintalent.com\nwintaosaas.com\nwinteam500.com\nwintech-nano.com\nwintechchina.com\nwintimechina.com\nwinto100.com\nwintodoor.com\nwintom.net\nwintooo.com\nwintopedu.com\nwintrueholding.com\nwintxt.com\nwinvk.com\nwinvod.com\nwinvvv.com\nwinwebmail.com\nwinwin-co.com\nwinwin-hotel.com\nwinwin7.com\nwinwinchemical.com\nwinxiang.com\nwinxp8.com\nwinxuan.com\nwinxuancdn.com\nwinyoungreading.com\nwinziss.com\nwinzonelaw.com\nwio2o.com\nwiot.host\nwipanda.com\nwipcc.org\nwireless-driver.com\nwireless-tag.com\nwirelesschina-summit.com\nwiremesh001.com\nwiremeshforfilter.com\nwirlesshare.com\nwis-park.com\nwisbiom.com\nwisburg.com\nwiscargo.com\nwischina.org\nwisder.net\nwisdoing.com\nwisdom-braun.com\nwisdomcmmi.com\nwisdomep.com\nwisdompharma.com\nwisdomwz.com\nwisdontech.com\nwisdri.com\nwise-iot.com\nwise99.com\nwiseah.com\nwiseasy.com\nwisebond.net\nwisecity.net\nwisecotech.com\nwisedoo.com\nwisedsp.net\nwisedu.com\nwiseetec.com\nwisefx.com\nwisegotech.com\nwiseimp.com\nwisekingsurgical.com\nwiselong.cc\nwiselong.com\nwisenjoy.com\nwisentbioproductschina.com\nwiseqx.com\nwisestcloud.com\nwiseuc.com\nwisevector.com\nwisewatercloud.com\nwish-hightech.com\nwish3d.com\nwishcad.com\nwishdown.com\nwishisp.com\nwishtec.com\nwisiyilink.com\nwison-engineering.com\nwison.com\nwispower.com\nwisrc.com\nwistapharma.com\nwistone.com\nwiswonder.com\nwit-parking.com\nwit0.com\nwitcp.com\nwitersen.com\nwith366.com\nwithcdn.com\nwithmedia.net\nwithoutpain.net\nwithpinbox.com\nwithqiuliang.com\nwithwheat.com\nwithwinds.com\nwithzz.com\nwitintech.com\nwitkeyschool.com\nwitmart.net\nwitnew.net\nwitontek.com\nwitrn.com\nwitspring.com\nwittf.ink\nwityx.com\nwiwide.com\nwiwide.net\nwixdigital.com\nwiz03.com\nwizitek.com\nwizsci.com\nwj-chem.com\nwj-hospital.com\nwj-hr.com\nwj-lean.com\nwj-park.com\nwj001.com\nwj0556.com\nwj166.com\nwjacloud.com\nwjajw.com\nwjasset.com\nwjbfwzx.com\nwjccx.com\nwjcd.net\nwjceo.com\nwjcjt.com\nwjctg.com\nwjdaily.com\nwjdhcms.com\nwjdiy.com\nwjdiy.net\nwjedu.net\nwjeryuan.com\nwjfcw.com\nwjfilm.com\nwjgdyy.com\nwjgslb.com\nwjhh666.com\nwjhotelgroup.com\nwjhouses.com\nwjhr.net\nwjhtxx.com\nwjiaxing.com\nwjin.cc\nwjinmiao.com\nwjjfjt.com\nwjjyxxw.com\nwjkjxcx.com\nwjlxmedia.com\nwjmh8.com\nwjnin.cc\nwjqcw.com\nwjqwy.com\nwjqyw.com\nwjrcb.com\nwjs.com\nwjshw.com\nwjsldy.com\nwjsms.net\nwjsw.com\nwjtr.com\nwjttl.com\nwjtzyg.com\nwjvusw.shop\nwjwuqiang.com\nwjx.com\nwjx.top\nwjy01.com\nwjyanghu.com\nwjyh.com\nwjyt-china.org\nwjyw.com\nwjzp.cc\nwjzpgz.com\nwk2.com\nwk515.com\nwk78.com\nwkai.cc\nwkandian.com\nwkbins.com\nwkbrowser.com\nwkcdn.com\nwkcw.net\nwkddkyy.com\nwkdimg.com\nwkdty.com\nwkepu.com\nwkhub.com\nwkimg.com\nwkkshu.com\nwklken.me\nwkmic.com\nwknky1296.com\nwkopen.com\nwkread.com\nwksc.com\nwkshipark.com\nwktfkj.com\nwktline.com\nwkwl9.com\nwkxxw.com\nwkyx520.com\nwkzf.com\nwkzk.com\nwkzstencent.com\nwkzuche.com\nwl369.com\nwl890.com\nwlaforum.com\nwlai.vip\nwlaiy.com\nwlanadmin.com\nwlanbanlv.com\nwlcbnews.com\nwlcbw.com\nwlcxx.com\nwldbs.com\nwldlr.com\nwldmarket.com\nwlds.net\nwldsb.com\nwldservice.com\nwlerp.com\nwlfce.com\nwlfimms.com\nwlgkk.com\nwlgooo.com\nwlgou.com\nwlhcc.com\nwlhyjx.com\nwlhyxh.com\nwlinfor.com\nwljhealth.com\nwljyyjy.com\nwlkgo.com\nwlkst.com\nwlku.com\nwll-xyz.com\nwllxcl.com\nwllxx.com\nwllxy.net\nwlmf.vip\nwlmq.com\nwlmqedu.com\nwlmqhytd.com\nwlmqrc.com\nwlmqrsks.com\nwlmqwb.com\nwlmqxht.com\nwlnh.net\nwlnkaep.xyz\nwlnmp.com\nwlnnosu.xyz\nwlol.com\nwlphp.com\nwlplove.com\nwlpmmm.store\nwlqtpolytheatre.com\nwlrcw.com\nwlsgjslgy.com\nwlski.com\nwlstock.com\nwlsx.net\nwltieyaoban.com\nwltong.com\nwluotx.com\nwlw-jcdlcxzx.com\nwlwj.com\nwlwltech.com\nwlwx.com\nwlwx.la\nwlwx.org\nwlxit.com\nwlxmall.com\nwlxtbj.com\nwlxww.com\nwlyfw.com\nwlyjbl.com\nwlyongli.com\nwlysjt.com\nwlyyjt.com\nwlzni.com\nwlzp.com\nwlzp.vip\nwlzz666.com\nwm-dream.vip\nwm-imotor.com\nwm-motor.com\nwm090.com\nwm18.com\nwm23.com\nwmathor.com\nwmb2b.com\nwmbluegame.com\nwmc-bj.net\nwmc-gba.net\nwmc95588.com\nwmcloud.com\nwmcn.com\nwmdang.com\nwmfanyi.com\nwmgurt9zka425.com\nwmhcn.net\nwmiao.com\nwmidgroup.com\nwmimg.com\nwming.com\nwmintl.com\nwmiyx.com\nwmjk.net\nwmjrc.com\nwmjt.net\nwmjygg.net\nwmjyqd.net\nwmjyszba.com\nwmksj.com\nwmlip.com\nwmnetwork.cc\nwmok.com\nwmp169.com\nwmphp.com\nwmpic.me\nwmproxy.net\nwmpvp.com\nwmpyol.com\nwmqt.net\nwmqzyyy.com\nwms100.com\nwmsjyun.com\nwmslz.com\nwmsub.com\nwmupd.com\nwmvideo.com\nwmviv.com\nwmwm.com\nwmxba.com\nwmxcjj.com\nwmxke.com\nwmxpro.com\nwmxue.com\nwmxxgy.com\nwmxxgz.com\nwmxxwh.com\nwmxxxj.com\nwmy-ad.com\nwmyqdmm.com\nwmzhe.com\nwmzkt.com\nwmzp.cc\nwmzyw.com\nwn1998.com\nwn51.com\nwn789.com\nwnark.com\nwnbsq.com\nwnchengtou.com\nwncpp.net\nwndoor.com\nwndroid.com\nwnevia.com\nwnform.com\nwnhuifu.com\nwniec.com\nwniecm.com\nwnjdtz.com\nwnkbyon.com\nwnkj88.com\nwnlbs.com\nwnllx.com\nwnlpromain.com\nwnlproyunying.com\nwnlprozhanxing.com\nwnlprozijia.com\nwnluo.com\nwnlwedu.com\nwnnyjx.com\nwnote.com\nwnplayer.net\nwnqapp.com\nwnqianbao.com\nwnrb.net\nwnrcw.com\nwns8181.com\nwns888.com\nwns8888.com\nwns99938.com\nwnshouhu.com\nwnspic.com\nwnspicbk.com\nwnsqzone.com\nwnsqzonebk.com\nwnssedu.com\nwnszxyy.com\nwntool.com\nwntzjt.com\nwnuos.com\nwnwb.com\nwnxfs.com\nwnylyx.com\nwnzc.com\nwnzctc.com\nwnzhbb.com\nwnzy.net\nwo-link.tech\nwo-smart.com\nwo-voyage.com\nwo.cc\nwo116114.com\nwo186.tv\nwo1wan.com\nwo87.com\nwoa.com\nwoaanc.com\nwoaap.com\nwoai310.com\nwoaidu.org\nwoaihaoyouxi.com\nwoaihuahua.com\nwoaihuoshan.com\nwoaipu.com\nwoaiseo.net\nwoaishouban.com\nwoaivps.com\nwoaixiao.com\nwoaiyt.com\nwoaizhitu.com\nwoaizr.com\nwoaizuji.com\nwoaoo.net\nwoaoocdn.com\nwobaif.com\nwobangzhao.com\nwobeili.com\nwobocn.com\nwobu2.com\nwoc.space\nwoc88.com\nwocaoseo.net\nwochacha.com\nwochaw.com\nwoda.com\nwodasi.com\nwodavip.com\nwode.bid\nwode.im\nwodeabc.com\nwodecaipu.com\nwodecrowd.com\nwodecun.com\nwodedagong.com\nwodeev.com\nwodegongzi.com\nwodescw.com\nwodeshebao.com\nwodeshucheng.com\nwodeweiquan.com\nwodeyt.com\nwodidashi.com\nwodingche.com\nwodjob.com\nwodocx.com\nwodown.com\nwodu518.com\nwodunyun.com\nwoeoo.com\nwofang.com\nwofangwang.com\nwofficebox.com\nwofjhs.com\nwofuwater.com\nwogame.net\nwogaosuni.com\nwogg.net\nwogoo.com\nwohenizaiyiqi.com\nwoheschool.com\nwohst8.com\nwohuishou.club\nwoi3d.com\nwoiauto.com\nwoiles.com\nwoiwrj.com\nwoiyu.com\nwojiacloud.com\nwojiaoni.com\nwojiuhuanle.com\nwok.com\nwokaola.com\nwokeji.com\nwokende.com\nwokew.com\nwoko.cc\nwol.tv\nwolai.com\nwolai.ren\nwolaidai.com\nwolansw.com\nwolegou.net\nwolei-tech.com\nwolezhibo.com\nwolf.cc\nwolfbolin.com\nwolfcstech.com\nwolfgo.com\nwolfguandan-01.com\nwolfguandan-02.com\nwolfguandan-03.com\nwolfguandan-04.com\nwolfguandan-05.com\nwolfogre.com\nwolianw.com\nwolidou.com\nwolife.com\nwolighting.com\nwoliuda.com\nwologic.net\nwolong-beng.com\nwolong.com\nwolonge.com\nwolongge.com\nwolongmedia.com\nwolongyin.com\nwolongyoule.com\nwolunliuliangji.org\nwolwo.ltd\nwolwobiotech.com\nwom186.com\nwomai.com\nwomaiapp.com\nwomailink.com\nwoman91.com\nwomanforces.com\nwomanfriend.com\nwomei.org\nwomeifilm.com\nwomeimenye.com\nwomen-heart.com\nwomenjie.com\nwomenofchina.com\nwonadea.com\nwonder-link.net\nwonder.wiki\nwondercv.com\nwonderful-pr.com\nwonderfulnonwoven.com\nwonderfulsz.com\nwonderjk.com\nwonderkun.cc\nwonderscloud.com\nwondersgroup.com\nwondershare.cc\nwondershare.com\nwondershare.com.br\nwondershare.jp\nwondershare.net\nwondersmemory.com\nwonderstar027.com\nwonderyouxi.com\nwondko.com\nwonengxing588.com\nwonflavour.com\nwonfulplaza.com\nwongcw.com\nwongpeace.com\nwoniu.com\nwoniu8.com\nwoniubaoxian.com\nwoniucloud.com\nwoniuge.com\nwoniugm.com\nwoniuhuoche.com\nwoniupai.net\nwoniutrip.com\nwonjarobot.com\nwonmay.com\nwonmay.net\nwonnder.com\nwononme.com\nwonote.com\nwonpearl.com\nwonplug.net\nwoo.im\nwood-china.com\nwood168.net\nwood888.net\nwoodbridgebath.com\nwoodbunny.com\nwoodchina.com\nwoodnn.com\nwoodsbrosrental.com\nwoodu.me\nwoofee-laser.com\nwooffice.net\nwooide.com\nwoola.net\nwooltex.org\nwooolab.com\nwooomooo.com\nwooqx.com\nwoordee.com\nwoosiyuan.com\nwoosmart.com\nwoowtcprc.com\nwooxhome.com\nwooyun.org\nwoozooo.com\nwopaiyi.com\nwopaw.com\nwopop.com\nwopti.net\nwopus.org\nwoqifoundation.com\nwoqu.com\nwoquyun.com\nword666.com\nwordfc.com\nwordlm.com\nwordplay.work\nwordpress.la\nwordscan.net\nwordscheck.com\nwordstorming.com\nwordsunny.com\nworkbenchapi.com\nworkchat.com\nworkec.com\nworkehr.com\nworkerman.net\nworkhelpmanila.com\nworkpcb.com\nworksoho.com\nworktile.com\nworktilemail.com\nworkyun.com\nworld-machining.com\nworld-pet.org\nworld3dmodel.com\nworld68.com\nworldbangmai.com\nworldbank.org\nworldbearingshub.com\nworldbuy.cc\nworldcps.com\nworldfcdn.com\nworldgoodvoices.com\nworldh5.com\nworldhello.net\nworldhotel.com\nworldhub.market\nworldinout.com\nworldjiasu.com\nworldmr.net\nworldnyjx.com\nworldpathclinic.com\nworldpowerliftingchina.com\nworldrobotconference.com\nworlds-slotsimulator.com\nworldscientific.com\nworldsteel.net\nworlduc.com\nworldwarner.com\nworldwayhk.com\nworldwu.com\nwort.cloud\nworthgarden.com\nworthtech.net\nworuide.net\nworxperience.com\nwosai-inc.com\nwosaimg.com\nwosenmedia.com\nwoshanit.com\nwoshao.com\nwoshenghotel.com\nwoshi100.com\nwoshipm.com\nwoshipt.com\nwoshiqian.com\nwosign.com\nwosigndoc.com\nwoskj2.com\nwosu.streamguys1.com\nwotangka.com\nwotaoka.com\nwotingpingshu.com\nwotokol.com\nwotransfer.com\nwotrus.com\nwotrust.com\nwotta.net\nwotuan.com\nwotucdn.com\nwotula.com\nwouju.com\nwouu.net\nwow.fun\nwowamazingthings.com\nwowbbs.com\nwowcat.net\nwowchina.com\nwowenda.com\nwowenwen.com\nwowgf.com\nwowo6.com\nwowogroup.com\nwowoit.com\nwowomaifang.com\nwowoohr.com\nwowops.com\nwowoqq.com\nwowoshijie.com\nwowotech.net\nwowotuan.com\nwowoyoo.com\nwowoyou.com\nwowoyou.net\nwowozhe.com\nwowqu.cc\nwowtb.com\nwowtran.com\nwowza-stream.wbur.org\nwowza.montevideo.com.uy\nwowza.ner.gov.tw\nwowzx.net\nwoxian.com\nwoxiaoyun.com\nwoxihuan.com\nwoxiu.com\nwoxuexue.com\nwoxuyuan.com\nwoyao998.com\nwoyaobaoliang.com\nwoyaodayin.com\nwoyaogexing.com\nwoyaojiaju.com\nwoyaoqiudai.com\nwoyaosai.com\nwoyaozhan.com\nwoying.com\nwoyo.com\nwoyonghj.com\nwoyoo.com\nwoyouche.com\nwoyouzhuce.com\nwoyun.work\nwozaixiaoyuan.com\nwozhangwan.com\nwozhishang.com\nwozhongla.com\nwozhuan.com\nwozhuye.com\nwp-hz.com\nwpan123.com\nwpc.124ce.sigmacdn.net\nwpceo.com\nwpcio.com\nwpcsh.com\nwpdaxue.com\nwpdian.com\nwpengapp.com\nwpeu.net\nwpeyes.com\nwpgdadatong.com\nwpgdadawant.com\nwpglb.com\nwphonelife.com\nwphun.com\nwping.org\nwpjam.com\nwpk8.com\nwporder.com\nwproedu.com\nwps.com\nwpscdn.com\nwpsdns.com\nwpsep.net\nwpsgo.com\nwpske.com\nwpsmail.net\nwpsoffice.com\nwpsplus.com\nwpt.la\nwptao.com\nwptea.com\nwpued.com\nwpurl.cc\nwpweixin.com\nwpxap.com\nwpyou.com\nwpzhiku.com\nwpzysq.com\nwq96f9.com\nwqbook.com\nwqc.so\nwqchat.com\nwqcsjt.com\nwqdian.com\nwqdian.net\nwqdsq.com\nwqebl.org\nwqgp.com\nwqhfw.com\nwqhome.com\nwqhunqing.com\nwqian.net\nwqiis.com\nwqingjian.com\nwqketang.com\nwqlml.com\nwqlrvp3510.vip\nwqoiyz.com\nwqop2018.com\nwqshe.com\nwqstatic.com\nwqszwhf.com\nwqtool.com\nwqxsw.com\nwqxuetang.com\nwqycq.com\nwqyunpan.com\nwqzsc36ou356m.com\nwqzx.net\nwr88.cc\nwrcdn.com\nwrdtech.com\nwrfou.com\nwright9.com\nwrite-bug.com\nwritebp.com\nwritingo-editor.com\nwritingo.net\nwrjzj.com\nwrkdih.com\nwrlsw.com\nwrltxt.com\nwrlwx.com\nwrmjk.com\nwrsa.net\nwrshg.com\nwrtauto.com\nwrtnode.cc\nwrtnode.com\nwrtsz.com\nwrxdsm.com\nwsaf.net\nwsandos.com\nwsbedu.com\nwsbkwai.com\nwsbuluo.com\nwscdn30.com\nwscdns.com\nwscdns.info\nwscdns.org\nwscdnss.com\nwsce-expo.com\nwscgdns.com\nwsche.com\nwscloudcdn.com\nwscloudcdn.org\nwsclouddns.com\nwscloudsec.com\nwscloudvpn.com\nwsclsb.net\nwscn.net\nwscncdn.com\nwscont1.apps.microsoft.com\nwscont2.apps.microsoft.com\nwscp.shop\nwscrm.net\nwscso.com\nwscstrace.com\nwscvdns.com\nwsdianzi.com\nwsdks.com\nwsdlb.com\nwsdns.top\nwsdqd56.com\nwsdvs.com\nwsdvs.info\nwsdvs.net\nwsdvs.org\nwsecar.com\nwseen.com\nwselearning.com\nwselearning.net\nwseqtza.com\nwsf1234.com\nwsfdl.com\nwsfdn.com\nwsfff.com\nwsfgx.com\nwsfnk.com\nwsgeogen.com\nwsgjj.com\nwsgjp.com\nwsglb.com\nwsglb.net\nwsglb0.com\nwsglb0.info\nwsglb0.org\nwsglw.com\nwsglw.net\nwsgph.com\nwsgri.com\nwsgtm1.com\nwsgtm2.com\nwsgtm3.com\nwshang.com\nwshbzc.com\nwshengda2009.com\nwshenm.com\nwshifen.com\nwshili.com\nwshost.cc\nwshoto.com\nwshr.com\nwshtgame.com\nwshttpdns.com\nwsimen.com\nwsipv6.com\nwsisp.com\nwsisp.net\nwsjgd688.com\nwsjtxia.com\nwskam.com\nwskj16818.xyz\nwsks.net\nwskwai.com\nwslivehls.com\nwsljf.xyz\nwsngb.com\nwsonh.com\nwsoso.com\nwsoss.com\nwsound.cc\nwsoversea.com\nwsoversea.info\nwsoversea.net\nwsoversea.org\nwsqejt.com\nwsrsj.com\nwsrxw.com\nwss.cc\nwss.email\nwss.ink\nwss.pet\nwss.show\nwss.zone\nwssafe.net\nwssanguo.com\nwssdns.com\nwsssec.com\nwsstplay.com\nwssvs.com\nwssvs.net\nwssyun.com\nwsszzx.com\nwstong.com\nwstx.com\nwsukwai.com\nwsurl.cc\nwswebcdn.com\nwswebcdn.info\nwswebcdn.org\nwswebpic.com\nwswebpic.info\nwswebpic.org\nwsxa.com\nwsxc.me\nwsxcme.com\nwsxjzp.com\nwsxsdf.com\nwsy.com\nwsy400.com\nwsy7.com\nwsyhn.com\nwsysdg.com\nwsyuanlin.com\nwsyxmall.com\nwszwhg.net\nwt-tech.com\nwt168.com\nwt222.com\nwta-web.org\nwtaluo.com\nwtango.com\nwtardseo26x6ts8tss0-dfs1.com\nwtbds.com\nwtbworld.com\nwtc-conference.com\nwtcmirni.com\nwtcxs.com\nwtd56.com\nwtdex.com\nwtdms.com\nwtecl.com\nwtfeng.com\nwtg7ew8cvzxbk.com\nwtiharbin.com\nwtimm.com\nwting.info\nwtkj.site\nwtliker.com\nwtmicrowave.com\nwtmtest.com\nwtn-bearing.com\nwto-btb.com\nwto168.net\nwto9000.com\nwtoip.com\nwtojob.com\nwtoutiao.com\nwtown.com\nwts999.com\nwtsimg.com\nwtsm.net\nwtsoft.net\nwtszx.com\nwttai.com\nwttms.com\nwtuce.com\nwtwvision.com\nwtxcdn.com\nwtxcon.com\nwtzw.com\nwu-mart.com\nwu-mi.com\nwu.run\nwu123.com\nwu35.com\nwu37.com\nwu7zhi.com\nwuage.com\nwuahihotel.com\nwuaihanfu.com\nwuaiso.com\nwuaitec.com\nwuan888.com\nwubaiyi.com\nwubaiyi.net\nwubaiyi.vip\nwubashangban.com\nwubeizi.com\nwubiba.com\nwubixuexi.com\nwubizi.net\nwublock123.com\nwubuxianjing.com\nwubx.net\nwuchenxu.com\nwuchou.org\nwuchuanghui.com\nwuchucloud.com\nwuchucloud.net\nwuchuyun.com\nwuchuyun.net\nwucuoxs.com\nwucuozi.com\nwuczfj.com\nwudaai.com\nwudage.com\nwudajucheng.com\nwudangpai.com\nwudangshan.com\nwudao.com\nwudao28.com\nwudaotech.com\nwudaotv.com\nwudeli.com\nwudihan.com\nwudingfadian.com\nwuduyi.com\nwueasy.com\nwufafuwu.com\nwufan88.com\nwufangzhai.com\nwufazhuce.com\nwufun.net\nwufunb.com\nwug4.com\nwuganpark.com\nwugongdong.com\nwuguiyunwei.com\nwuguyufen.com\nwugx.net\nwuhaidaily.com\nwuhaijy.com\nwuhan-guide.com\nwuhan-tour.net\nwuhan.com\nwuhananyu.com\nwuhanbaituo.com\nwuhanbiennial.com\nwuhanbus.com\nwuhanchengqi.com\nwuhancityofdesign.com\nwuhandaishu.com\nwuhanev.com\nwuhanfuke120.com\nwuhanfukeyy.com\nwuhanghyy.com\nwuhanhexin.com\nwuhanins.com\nwuhanjingce.com\nwuhankb.com\nwuhankq.com\nwuhanlanqing.com\nwuhanlengji.com\nwuhanly.com\nwuhanmarathon.org\nwuhanmeigao.com\nwuhanmetro.com\nwuhanopen.org\nwuhanparking.com\nwuhanpe.com\nwuhanpep.com\nwuhanport.com\nwuhanrt.com\nwuhansanzhen.com\nwuhanshiliantong.shop\nwuhansport.com\nwuhanta.com\nwuhantianqi114.com\nwuhantskj.com\nwuhanunion.com\nwuhanup.com\nwuhanwyg.com\nwuhanyushidai.com\nwuhanzhenye.com\nwuhao13.xin\nwuhexxg.com\nwuhongsheng.com\nwuht.net\nwuhu.cc\nwuhubtv.com\nwuhues.com\nwuhujianshe.com\nwuhukj.fun\nwuhusanlian.com\nwuhuwater.com\nwuhuzr.com\nwuhzx.com\nwui5.com\nwuip.com\nwuji-edu.com\nwuji.com\nwujianghongyi.com\nwujianghr.com\nwujiangtong.com\nwujiayi.vip\nwujicode.com\nwujiecaifu.com\nwujiehd.com\nwujiehuyu.com\nwujiemed.com\nwujiexiang.com\nwujieyouth.com\nwujiit.com\nwujijiasu.com\nwujinimg.com\nwujinpp.com\nwujintool.com\nwujinwater.com\nwujiok.com\nwujisite.com\nwujistatic.com\nwujitang.com\nwujixiaoshuo.com\nwujixsw.info\nwujogroup.com\nwujue.com\nwukaikai.tech\nwukao.com\nwukong.com\nwukong.la\nwukongbjb.com\nwukongkf.com\nwukongks.com\nwukonglicai.com\nwukongphp.com\nwukongrom.com\nwukongsearch.com\nwukongshuo.com\nwukongtj.com\nwukongwenda.com\nwukongyz.com\nwukypay.com\nwul.ai\nwulannews.com\nwuli.wiki\nwuliangroup.com\nwuliannanjing.com\nwuliaoo.com\nwuliaosi.com\nwuliaozhuan.com\nwuliapi.com\nwulicdn.com\nwulincdn.com\nwulincun.com\nwulinfeng8.com\nwuling.com\nwulingauto.com\nwulingnev.com\nwulingzy.com\nwulinn.com\nwulintang.net\nwuliok.com\nwuliucat.com\nwuliuhangye.com\nwuliujie.com\nwuliuren.com\nwuliuyun.com\nwulong365.com\nwuluoyun.com\nwulvxing.com\nwumai.net\nwumart.com\nwumii.tv\nwuming.com\nwupdec.com\nwupk.com\nwuqi-micro.com\nwuqing.cc\nwuqiong.info\nwuqizhen.com\nwuqutu.com\nwurenjifanzhi.com\nwurenjihangyexiehui.com\nwuruihong.com\nwuscn.com\nwuse.com\nwuse.ink\nwusen.net\nwuseng.net\nwusetu.art\nwushang.com\nwushen.com\nwushifublog.com\nwushuangol.com\nwushuangtech.com\nwushuangzl.com\nwushuhenan.com\nwushuibao.com\nwushupeixunban.com\nwushuzw.com\nwushuzw.org\nwusong.com\nwusuhan.com\nwusunjiance.net\nwusunk.com\nwusuobuneng.com\nwusuobuneng.org\nwuta-cam.com\nwuta.cc\nwutaishanfojiao.com\nwutanyuhuatan.com\nwuteaclub.com\nwutep.com\nwuthreat.com\nwutianqi.com\nwutongchain.com\nwutongguo.com\nwutongtec.com\nwutongzi.com\nwutos.com\nwutuojia.com\nwuuconix.link\nwuuxiang.com\nwuwangnongseed.com\nwuweijob.com\nwuweiyou.com\nwuwenjun.net\nwuwm.streamguys1.com\nwuwuju.com\nwuxi5h.com\nwuxi9h.com\nwuxiairport.com\nwuxiamt.com\nwuxianhaibao.com\nwuxiantu.com\nwuxiatools.com\nwuxiatu.com\nwuxibiologics.com\nwuxibus.com\nwuxicxl.com\nwuxidiagnostics.com\nwuxihospital.com\nwuxihqyy.com\nwuxijf.com\nwuxijia.com\nwuxijiekang.com\nwuximarathon.com\nwuximediaglobal.com\nwuximhc.com\nwuxin.info\nwuxin.work\nwuxinban.com\nwuxingmu.com\nwuxingzuji.com\nwuxinhua.com\nwuxinmuye.com\nwuxipark.com\nwuxiph.com\nwuxishuangfan.com\nwuxishuangyou.com\nwuxisj.com\nwuxitianlang.com\nwuxiwang.net\nwuxiwanli.com\nwuxiwenlv.com\nwuxiworld.com\nwuxixdc.com\nwuxixz.com\nwuxiyishi.com\nwuxizazhi.com\nwuxizazhi.net\nwuxjob.com\nwuxs.org\nwuxue.cc\nwuxuwang.com\nwuxzx.com\nwuyabuluo.com\nwuyang-honda.com\nwuyangkeji.com\nwuyangmotor.com\nwuyangplatform.com\nwuyantonglun.org\nwuyazi.com\nwuyecao.net\nwuyechaorenrcw.com\nwuyenews.com\nwuyetongxin.com\nwuyetoutiao.com\nwuyi.link\nwuyida.com\nwuyijt.com\nwuyishan.net\nwuyixinyi.com\nwuylh.com\nwuyongwang.com\nwuyou.com\nwuyou.net\nwuyou189.com\nwuyoudagong.com\nwuyoufang.com\nwuyougroup.com\nwuyoujianding.com\nwuyoushow.com\nwuyousy.com\nwuyouyun.cc\nwuyouyun.com\nwuys.com\nwuyuan.cc\nwuyublog.com\nwuyueart.com\nwuyueit.com\nwuyuidc.com\nwuyukang.com\nwuyumin.com\nwuyuntaxue.com\nwuyutai.com\nwuz7.com\nwuzao.com\nwuzhaiba.com\nwuzhenfestival.com\nwuzhenpay.com\nwuzhenwic.org\nwuzhenwucun.com\nwuzhi.me\nwuzhicms.com\nwuzhii.com\nwuzhiq.com\nwuzhiwei.net\nwuzhong.com\nwuzhongdc.com\nwuzhongwater.com\nwuzhoucj.com\nwuzhoucloud.com\nwuzhoudonghui.com\nwuzhouhotels.com\nwuzhoumed.com\nwuzhouqianzheng.com\nwuzhourcw.com\nwuzhouwahson.com\nwuzhuiso.com\nwuzi8.com\nwuzx.com\nwvidc.com\nwvkygvmu.com\nwvmrczc.com\nwvshare.com\nwvxkezhg.com\nww-77660.com\nww2bbs.net\nww8899.com\nwware.org\nwwejds.com\nwwenglish.com\nwwenglish.org\nwwentua.com\nwweuzgtp.com\nwwfchina.org\nwwhlian.com\nwwjia.com\nwwjie.com\nwwk888.com\nwwlcargo.com\nwwldz.com\nwwmhdq.com\nwwnet.vip\nwwrcw.net\nwwsgh.com\nwwsq.tv\nwwstat.com\nwww-11187.com\nwww-4466666.com\nwww-666789.com\nwww-76244.com\nwww-csb.dell.com\nwww-jabuank-co-jp.net\nwww.adobe.com\nwww.cbsnews.com\nwww.cdnetworks.com\nwww.cg\nwww.com.my\nwww.dell.com\nwww.destinationurl.com\nwww.djivideos.com\nwww.epsonconnect.com\nwww.filmon.com\nwww.gov.mo\nwww.htc.com\nwww.microsoft.com\nwww.nike.com\nwww.pxcc.com\nwww.pxitv.com\nwww.recaptcha.net\nwww.redhat.com\nwww.samsung.com\nwww.soundvideostar.com\nwww.st.com\nwww.szmgiptv.com\nwww.tutorabc.com\nwww.uz0.xyz\nwww.vive.com\nwww.viveport.com\nwww100789.com\nwww11ic-shinkni-ib-jp.com\nwww2489.com\nwww4-static.gog-statics.com\nwww48-365365.com\nwww5929.com\nwww9912.com\nwwwer.net\nwwwfkw.com\nwwwic.net\nwwwimages.adobe.com\nwwwimages2.adobe.com\nwwwwqq.com\nwwxrmyy.com\nwwxxg.com\nwx-api.net\nwx-data.com\nwx-jsj.com\nwx-xdxc.com\nwx-yn.com\nwx-youyan.net\nwx.com\nwx135.com\nwx2h.com\nwx2share.com\nwx4.cc\nwx8g.com\nwx8h.com\nwx8s.com\nwx920.com\nwx939.com\nwxagame.com\nwxagyy.com\nwxamedia.com\nwxamkfyy.com\nwxappclub.com\nwxappvideo.com\nwxatech.com\nwxavu.com\nwxaz.net\nwxb.com\nwxb3d.com\nwxbaoming.com\nwxbhagv.com\nwxbiao.com\nwxbjyy.com\nwxbkw.com\nwxblockchain.com\nwxboiler.com\nwxboilerchina.com\nwxbrandway.com\nwxbsgc.com\nwxccfz.com\nwxccl.net\nwxcec.net\nwxcha.com\nwxchaoshengbo.com\nwxchildren.com\nwxchina.com\nwxchuguan.com\nwxchunleikeji.com\nwxcig.com\nwxcjfzjt.com\nwxcloudrun.com\nwxcnc.com\nwxcnpa.com\nwxcsgd.com\nwxcts.com\nwxddlfsq.com\nwxdegroup.com\nwxdesk.com\nwxdfgc.com\nwxdhnt.com\nwxdianju.com\nwxdtsj.com\nwxdw.info\nwxeditor.com\nwxedu.net\nwxeic.com\nwxf.com\nwxfhqchina.com\nwxfls.net\nwxfncjd.com\nwxfr.net\nwxfsdff.com\nwxfsgj.com\nwxfxw.com\nwxgamemini.com\nwxgamemini.work\nwxgateway.com\nwxggxx.com\nwxgjyy.com\nwxglyy.com\nwxgmkt.com\nwxgongkaike.com\nwxgrcpa.com\nwxgxjt.com\nwxhaifa.com\nwxhand.com\nwxhbjt.com\nwxhbzx.com\nwxhcgbds.com\nwxhdzg.com\nwxhgglc.com\nwxhgsrm.com\nwxhkexpress.com\nwxhledu.com\nwxhlhg.com\nwxhlzx.com\nwxhon.com\nwxhongqiao.com\nwxhouse.com\nwxhrm.com\nwxhsgkjt.com\nwxhstx.net\nwxhtkfyy.com\nwxhudong.com\nwxhxyk.com\nwxhyts.com\nwxhyzf.com\nwxiao.net\nwxiaoai.com\nwxiat.com\nwxidg.com\nwxivzhvp.com\nwxjava.com\nwxjcgas.com\nwxjgxx.com\nwxjh120.com\nwxjiaogun.com\nwxjieyang.com\nwxjkedu.com\nwxjmar.com\nwxjmsyzdxx.com\nwxjoi.com\nwxjsgs.com\nwxjshx.com\nwxjsxqc.com\nwxjsxy.com\nwxjtyf.com\nwxjx123.com\nwxjzh.com\nwxkj666.com\nwxkjwlw.com\nwxkml.com\nwxkou.com\nwxkpharma.com\nwxlele.com\nwxlight.com\nwxlivecdn.com\nwxlongda.com\nwxlongre.com\nwxlpool.com\nwxlxjy.com\nwxlydhb.com\nwxmama.com\nwxmetro.net\nwxmolegames.com\nwxmovie.com\nwxmuseum.com\nwxnacy.com\nwxngh.com\nwxp114.com\nwxp2022.vip\nwxpangu.com\nwxpayui.com\nwxphp.com\nwxpmc.com\nwxq.today\nwxqcgc.com\nwxqxbxg.com\nwxrb.com\nwxrc.com\nwxrcgz.com\nwxrcw.com\nwxrrd.com\nwxsbank.com\nwxscreen.com\nwxscxxx.com\nwxsd.com\nwxsdezyyy.com\nwxsell.com\nwxsemzx.com\nwxsemzxyy.com\nwxsgf.com\nwxshake.com\nwxshgs.com\nwxshiteng.com\nwxshops.co\nwxshuku.la\nwxskysy.com\nwxslzf.com\nwxsswgs.com\nwxsteed.com\nwxstztg.com\nwxsywater.com\nwxsyyxh.com\nwxszjt.com\nwxt2020.com\nwxtaihujx.com\nwxtcm.com\nwxtcxny.com\nwxtdf.com\nwxthe.com\nwxtj.com\nwxtj10086.com\nwxtpb.com\nwxtrirh.com\nwxtrust.com\nwxtyjt.com\nwxtyyy.com\nwxtyzyyy.com\nwxurls.com\nwxuse.tech\nwxutil.com\nwxw120.com\nwxwerp.com\nwxwjk5.com\nwxwmdq.com\nwxworklive.com\nwxwtblg.com\nwxwzt.com\nwxxd.co\nwxxfltg.com\nwxxfzx.com\nwxxrh.com\nwxxsh.net\nwxxsjyk.com\nwxxsyg.com\nwxxuetao.com\nwxxyxnb.com\nwxy1314.com\nwxyhgk.com\nwxyhhosp.com\nwxyljgxx.com\nwxyongji.com\nwxystour.com\nwxyuannuo.com\nwxyxrc.com\nwxyzedu.net\nwxzfkj.com\nwxzhongcai.com\nwxzpw8.com\nwxzq.com\nwxzwb.com\nwxzxw.com\nwxzzz.com\nwy000.com\nwy100.com\nwy182000.com\nwy213.net\nwy2fy.com\nwy34.com\nwy6000.com\nwya1.com\nwybgs.com\nwybosch.com\nwybzdwss.com\nwycad.com\nwycfw.com\nwycsyyjt.com\nwydbw.com\nwydljx.com\nwydns.com\nwyduihua.com\nwyfluorine.com\nwygkmitk.com\nwyh138.com\nwyhef.com\nwyhos.fun\nwyins.cc\nwyins.net\nwyjianzhan.com\nwyjsq.com\nwyk8.com\nwykefu.com\nwykw.com\nwyl.cc\nwylylxx.com\nwyn88.com\nwynca.com\nwyndhamchangshasouth.com\nwyndhamgrandxian.com\nwyndhamsanya.com\nwynnstools.com\nwyptk.com\nwypxj.com\nwyrj.net\nwyrlzy.com\nwysaid.org\nwysap.com\nwysbglza.vip\nwysfgc.com\nwyshuoshuo.com\nwysls.com\nwysm88.com\nwyteam.net\nwytracir.com\nwytx.net\nwytype.com\nwytzgl.com\nwyuetec.com\nwywy.ltd\nwywy6.com\nwywyx.com\nwyxokokok.com\nwyxzxyjhyy.com\nwyydsb.xin\nwyyve.com\nwyzc.com\nwyzg.org\nwyzxsd.com\nwyzyz.org\nwz-cjjt.com\nwz-emauto.com\nwz-goodcarbide.com\nwz-tea.com\nwz-zhongheng-zy.com\nwz-zhongheng.com\nwz01.com\nwz121.com\nwz132.com\nwz141.com\nwz16.net\nwz5.cc\nwz5.com\nwzadri.com\nwzbb.com\nwzbhct.com\nwzbks.com\nwzbox.net\nwzbyjt.com\nwzcbd.com\nwzcfjt.com\nwzcggroup.com\nwzchayuan.com\nwzcl.net\nwzclxx.com\nwzdjy.com\nwzdlqj.com\nwzdsb.net\nwzdslyy.com\nwzdyn.com\nwzer.net\nwzes.net\nwzfg.com\nwzfou.com\nwzg0898.com\nwzg6.com\nwzgbj.com\nwzgemsmall.com\nwzghy.com\nwzguolian.com\nwzgyjt.com\nwzgytz.com\nwzh.kim\nwzhealth.com\nwzhibo.net\nwzhibo.tv\nwzhonghe.com\nwzhosp.com\nwzhouhui.com\nwzhouhui.net\nwzhphg.com\nwzhuanzhong.com\nwzhust.com\nwzhxlx.com\nwziii.com\nwzime.com\nwzits.com\nwzjbbus.com\nwzjcsc.com\nwzjrtzjt.com\nwzjsjtzcpt.com\nwzjsxx.com\nwzjxdyf.com\nwzjxyq.com\nwzkelineng.com\nwzkex.com\nwzkuailu.com\nwzkygroup.com\nwzlcgf.com\nwzlgjt.com\nwzlijingyuanlin.com\nwzlingyun.com\nwzlyqy.com\nwzlysz.com\nwzm.com\nwzmc.net\nwzmfgs.com\nwzmryy.com\nwzmtr.com\nwznas.com\nwznfgs.com\nwznyfz.com\nwzofjt.com\nwzojk.com\nwzoka.com\nwzotai.com\nwzpcw.com\nwzpkus.com\nwzplc.com\nwzport.com\nwzpy.com\nwzqbhsls.com\nwzqingou.com\nwzqmt.com\nwzqsyy120.com\nwzrc.com\nwzrc.net\nwzrclt.com\nwzrdwl2.com\nwzright.com\nwzrjsp.com\nwzrm-hospital.com\nwzrssip.com\nwzrygcht.com\nwzsee.com\nwzshe.com\nwzshuidian.com\nwzsky.net\nwzspinneret.com\nwzsrmyy.com\nwzssx.net\nwzstsj.com\nwzsxj.net\nwzsz.net\nwzsz.org\nwztf121.com\nwztianshanfs.com\nwztlink1013.com\nwztsy.com\nwzty.ltd\nwzu.com\nwzwqs.com\nwzwtrlyy.com\nwzxchem.com\nwzxclc.com\nwzxianggui.com\nwzxinchang.com\nwzxinfeng.com\nwzxmkj.com\nwzxszx.net\nwzxywj.com\nwzy2.com\nwzy6.com\nwzyc.com\nwzyds.com\nwzyestar.com\nwzyzdyf.com\nwzz1809.com\nwzzbdz.com\nwzzbtb.com\nwzzcd.com\nwzzhchem.com\nwzzjzxx.com\nwzzlovesli.com\nwzznft.com\nwzzp.com\nwzzpw.net\nwzzqqh.com\nwzzsfd.com\nwzzww.com\nwzzyhp.com\nwzzysm.com\nx-abt.com\nx-bull.com\nx-cloud.cc\nx-cmd.com\nx-droners.com\nx-imagine.com\nx-jishu.com\nx-kicks.com\nx-mol.com\nx-newedu.com\nx-peng.com\nx-ray.work\nx-storm.com\nx-tetris.com\nx-vsion.com\nx0246.com\nx0769.com\nx1047xv8b4.com\nx1106y.mobi\nx11263.com\nx11296.com\nx118.net\nx1abo.com\nx23118.com\nx23119.com\nx23qb.com\nx23us.us\nx23wxw.com\nx2552.com\nx2intell.com\nx315.com\nx3322.net\nx3366.com\nx33699.com\nx33yq.org\nx3a37ynn2n.com\nx3china.com\nx3cn.com\nx3g1.com\nx431.com\nx4dp.com\nx5dj.com\nx5zs.com\nx64go.com\nx64pro.com\nx66597.com\nx69zw.com\nx6d.com\nx6tb.com\nx6x8.com\nx72y.com\nx7game.com\nx7sy.com\nx7z.cc\nx81zw.co\nx81zw2.com\nx821.com\nx86android.com\nx86pi.com\nx8ds.com\nx8sb.com\nx93r91l460.com\nx9gc3siwevbpc.com\nxa-bank.com\nxa-online.com\nxa-psj.com\nxa.com\nxa189.net\nxa30zx.com\nxa4.com\nxa8yuan.com\nxaaycz.com\nxabaotu.com\nxabbs.com\nxabpo.com\nxacademy.cc\nxacbank.com\nxacg.info\nxachangda.com\nxachangxing.com\nxachanhe.com\nxachyy.com\nxacitywall.com\nxaclcrm.com\nxacnnic.com\nxacpubfs.com\nxacsjsedu.com\nxactad.net\nxacxxy.com\nxacyyxq.com\nxadamai.com\nxadlwx.com\nxadsa.com\nxadwyy.com\nxadyyy.com\nxaeaa.com\nxaecong.com\nxaedumedia.com\nxaent.com\nxafc.com\nxafish.com\nxafzjy.com\nxagdyz.com\nxagkwl.com\nxagmsm.com\nxaguanggu.com\nxagxp.com\nxahc971.com\nxahhp.com\nxahmqy.com\nxahr.net\nxahttd.com\nxahuapu.net\nxahuayi.com\nxahuilong.com\nxahxgy.com\nxahxp.com\nxaidc.com\nxainjo.com\nxaixs.org\nxajfwy.com\nxajiason.com\nxajjk.com\nxajjn.com\nxajjwy.com\nxajob.com\nxajx.com\nxajxcw.com\nxakaili.com\nxakjgzz.com\nxakqby.com\nxakrlab.com\nxalanq.com\nxalawyer.net\nxalhar.net\nxalyd.com\nxamama.net\nxaminim.com\nxamv.com\nxanahotelle.com\nxanhr.com\nxank120.com\nxanway.com\nxany6.com\nxaocao.com\nxaoji.com\nxaonline.com\nxaoyao.com\nxapcn.com\nxapi.ltd\nxaqhgas.com\nxarc.net\nxarlm.com\nxarongdi.com\nxarptec.com\nxarqba352.vip\nxarxbio.com\nxaseastar.com\nxasfyw.com\nxasgxy.com\nxashl.com\nxashuiwu.com\nxashzhjz.com\nxasimonds.com\nxasrc.com\nxasrite.com\nxasun.com\nxaswx.com\nxasyx.com\nxatc168.com\nxatielu.com\nxatourismgroup.com\nxatvs.com\nxatyds.com\nxatyz.com\nxatzj.com\nxauat-hqc.com\nxaudiopro.com\nxauwvhgt.com\nxavierbrooks.shop\nxawb.com\nxawdcy.com\nxawdslzp.com\nxawdz.com\nxaweather.com\nxawscu.com\nxawyjx.com\nxaxcgx.com\nxaxddz.com\nxaxydr.com\nxaxzlsgs.com\nxayabx.com\nxayestar.com\nxaygddc.com\nxayhedu.com\nxayizhou.com\nxayzjc.com\nxazbts.com\nxazcit.com\nxazls.com\nxazmkm.com\nxazwy.com\nxazysoft.net\nxazyy.com\nxazzs.com\nxb.app\nxb0.cc\nxb2s.com\nxba123.com\nxbaixing.com\nxbaodi.com\nxbaofun.com\nxbase.cloud\nxbase.xyz\nxbatu.com\nxbauto.com\nxbb8.com\nxbbaoan.com\nxbceo.com\nxbcjy.com\nxbcloudprint.com\nxbcpsjk.com\nxbd61.com\nxbdgps.com\nxbds.cc\nxbdym.com\nxbec-tencentclb.cloud\nxbec-tencentclb.com\nxbec-tencentclb.net\nxbec-tencentclb.work\nxbeian.com\nxbequge.com\nxbeta.info\nxbext.com\nxbfashion.com\nxbfnet.com\nxbfzb.com\nxbgjw.com\nxbhb.net\nxbhjgg.com\nxbhy.com\nxbiao.com\nxbidc.com\nxbiqiku.net\nxbiqiku2.com\nxbiquge.la\nxbiqugu.info\nxbiqugu.net\nxbiquke.com\nxbiquwx.la\nxbiquzw.com\nxbirder.com\nxbitw.net\nxbjianzhan.com\nxbjob.com\nxbjtkj.com\nxbk.icu\nxbkjvip.com\nxblaw.com\nxblou.com\nxblqb.com\nxblqugex.cc\nxblsign.com\nxblyw.com\nxbmbw.com\nxbmiaomu.com\nxbniao.com\nxbnj.net\nxbongbong.com\nxboot.org\nxboxfan.com\nxbpex.com\nxbptc.com\nxbrl-cn.org\nxbrother.com\nxbtest.com\nxbuwrp.sbs\nxbuyees.com\nxbw0.com\nxbwbh.com\nxbwebyun.com\nxbxgame.com\nxbxxb.com\nxbxxz.com\nxbzlapp.com\nxc-fc.com\nxc-fund.com\nxc-js.com\nxc05x.com\nxc1000.com\nxc2500.com\nxca551hgxm.com\nxcabc.com\nxcao.win\nxcape.cc\nxcar.com\nxcarimg.com\nxcb-family.com\nxcbank.com\nxcbbtf.com\nxcc.com\nxccrugs.com\nxccy.cc\nxcdesign.net\nxcdn.global\nxcdngyc.vip\nxcdntp.vip\nxcdssy.com\nxcedu.net\nxcex.net\nxcfuer.com\nxcfunds.com\nxcgbb.com\nxcgbie.com\nxcgogo.club\nxcgogo.site\nxcgp.com\nxcgui.com\nxcgwk.com\nxcgyy175.org\nxcharger.net\nxchjw.org\nxchr-group.com\nxchsgy.com\nxchuxing.com\nxciic.com\nxcj.com\nxcjd.net\nxcjincheng.com\nxcjmcnc.com\nxcjtjt.com\nxcjyxx.com\nxckfsq.com\nxckgq.com\nxckpjs.com\nxckssw.com\nxckszx.com\nxclawyers.org\nxcljs.com\nxcloudbase.com\nxcmad.com\nxcmg-dkrob.com\nxcmg.com\nxcmgmall.com\nxcmobi.com\nxcmsports.com\nxcmwqdvc.com\nxcnchinese.com\nxcncp.com\nxcnv.com\nxcode.me\nxcoder.in\nxcommon.com\nxcoodir.com\nxcot.com\nxcpapa.site\nxcpapa.xyz\nxcpxssx.com\nxcq2022.com\nxcq518.com\nxcqpayy.com\nxcqxcq.com\nxcrc.net\nxcrmyy.com\nxcsc.com\nxcshaifen.com\nxcstuido.com\nxcsyy.com\nxctmr.com\nxcukezmr.com\nxcurrency.com\nxcvec.com\nxcvmbyte.com\nxcvvs.com\nxcwhjj.com\nxcx-x.com\nxcxd-inc.com\nxcxd1997.com\nxcxjpd.com\nxcxvs.com\nxcxwo.com\nxcxymw.com\nxcxyw.com\nxcxzks.com\nxcxzww.com\nxcyg.net\nxczhmzb.com\nxczhsh.com\nxczim.com\nxczzs.com\nxd-tech.com\nxd-world.com\nxd.com\nxd0.co\nxd0.com\nxd0731.com\nxd56b.com\nxd57.com\nxd8888.net\nxda.show\nxdapp.com\nxdbcb8.com\nxdbin.com\nxdc.at\nxdcdn.com\nxdcdn.net\nxdcg100.com\nxddpay.com\nxde.com\nxdebike.com\nxdf99.com\nxdfckjz.com\nxdfpr.com\nxdfsjj.com\nxdgalaxy.com\nxdggd.com\nxdgj.com\nxdgkwl.com\nxdglt.com\nxdgogogo.com\nxdhcn.com\nxdhelp.com\nxdhyty.com\nxdiarys.com\nxdingerp.com\nxdiscuz.com\nxdj-sz.com\nxdja.com\nxdjcgs.com\nxdju.com\nxdjunxiao.com\nxdjy369.com\nxdkb.net\nxdkjjy.com\nxdkjpx.com\nxdmb.xyz\nxdmssp.com\nxdn001.com\nxdn10000.com\nxdn2.com\nxdnice.com\nxdnote.com\nxdnphb.com\nxdnsvip.com\nxdnsvip.info\nxdocin.com\nxdowns.com\nxdpaomo.com\nxdper.com\nxdpipe.com\nxdpjump.com\nxdplt.com\nxdpvp.com\nxdqtech.com\nxdrcftv.com\nxdressy.com\nxdrqsb.com\nxdrtc.com\nxdrun.com\nxdsipo.com\nxdsp.mobi\nxdsyzzs.com\nxdter.com\nxdtev.com\nxdtool.com\nxdtos.com\nxduim.com\nxdundq.work\nxduoo.com\nxduoyu.com\nxduph.com\nxdwan.com\nxdweilai.com\nxdwyx.com\nxdxct.com\nxdxdsz.com\nxdxialingying.com\nxdxiaoshuo.com\nxdxmsy.com\nxdxmwang.com\nxdyanbao.com\nxdystar.com\nxdytuliao.com\nxdyy.net\nxdyy100.com\nxdyyws.com\nxdzhsw.com\nxdzu.net\nxed.plus\nxedaojia.com\nxedaojia.net\nxedge.cc\nxeeee.net\nxeeger.com\nxeeok.com\nxefan.com\nxege.org\nxegymyb.xyz\nxehedu.com\nxeknow.com\nxeltek-cn.com\nxen0n.name\nxender.com\nxenium.mobi\nxepher.fun\nxesabc.com\nxesapp.com\nxescdn.com\nxesdns.com\nxesee.com\nxesimg.com\nxesv5.com\nxet.tech\nxetimes.com\nxetlk.com\nxetslk.com\nxev-connectivity.com\nxevd.co\nxevddy.com\nxeylon.com\nxf-fund.com\nxf-gtm.com\nxf-world.org\nxf-yun.com\nxf.com\nxf0797.com\nxf119.xin\nxf1233.com\nxf21.com\nxf24ms.com\nxf3z.com\nxf4hs.com\nxf5z.com\nxfabs.com\nxfadx.com\nxfannix.com\nxfaqwlw.com\nxfb315.com\nxfbst.com\nxfcjn.com\nxfcn.com\nxfconnect.com\nxfcqc.com\nxfdown.com\nxfdp.net\nxfdwz.com\nxfdyb.com\nxfehc.com\nxfeng.me\nxffbb.com\nxffox.com\nxfguo.org\nxfhx.com\nxfinfr.com\nxfisp.com\nxfj100.com\nxfjcw.com\nxfjw.net\nxfjxs.com\nxflapp.com\nxflimg.com\nxfliusheng.com\nxflstatic.com\nxfltd.net\nxfmspps.com\nxfnano.com\nxfocus.net\nxfocus.org\nxforceplus.com\nxfpaas.com\nxfpass.com\nxfpg119.com\nxfplay.com\nxfprecise.com\nxfr3u4lz94.com\nxframework.org\nxft123.com\nxftclub.com\nxftransa.com\nxfun233.com\nxfusion.com\nxfwed.com\nxfwindow.com\nxfx02.com\nxfx168.com\nxfxb.net\nxfxglass.com\nxfyousheng.com\nxfypaper.com\nxfyun.com\nxfzc.com\nxfzhsf.com\nxfzllht.com\nxg-techgroup.com\nxg1234.com\nxg38.com\nxgamecenter.com\nxgamevip.com\nxgantt.net\nxgate.com\nxgc002.com\nxgc004.com\nxgc09.com\nxgccm.com\nxgcp.asia\nxgcs55.com\nxgcsczyc.com\nxgcsfz.com\nxgd.com\nxgd666.com\nxgdfz.com\nxgdown.com\nxgdq.com\nxgdqsn.com\nxggj56.com\nxggjj.com\nxghylt.com\nxgimi.com\nxgimi.net\nxgiu.com\nxgj-info.com\nxgjdyjjt.com\nxgjgas.com\nxgjjw.com\nxgkwx.com\nxglgift.com\nxglist.com\nxgllreport.com\nxglopto.com\nxglpa.com\nxgn-cy.com\nxgo.cc\nxgost.com\nxgp365.com\nxgpharma.com\nxgqq.com\nxgqyy.com\nxgsdk.com\nxgsdpm.com\nxgss.net\nxgsxt.net\nxgsyun.com\nxgt2014.com\nxgtea.com\nxgwx.net\nxgxedu.com\nxgxsignage.com\nxgyszj.com\nxgz.cc\nxgzbwdj.com\nxgzdhj.com\nxgzrs.com\nxh-arch.com\nxh-health.com\nxh-silicone.com\nxh.com\nxh0523.com\nxh1958.com\nxh39.com\nxhaiwai.com\nxhante.com\nxhay1122.com\nxhbaoguan.net\nxhboke.com\nxhbosn.com\nxhby.net\nxhbycm.net\nxhcct.com\nxhclaw.com\nxhclub.net\nxhcpa.net\nxhcpas.com\nxhcs.com\nxhctcm.com\nxhd.org\nxhdjx.com\nxhdnwct.com\nxhdpay.com\nxhdxly.com\nxhedu.net\nxhfk120.net\nxhforex.com\nxhg.com\nxhgame.com\nxhgamesdk.com\nxhgjyc.com\nxhgz.com\nxhh.pw\nxhhd6.com\nxhhdd.cc\nxhhhzs.com\nxhhos.com\nxhidc.com\nxhily.com\nxhintech.com\nxhj.com\nxhj.info\nxhjaty.com\nxhjianglong.com\nxhjingling.com\nxhjj.com\nxhjkgj.com\nxhjnyy.com\nxhjs168.com\nxhjt.com\nxhjyxxw.com\nxhkt.tv\nxhlaowu.com\nxhlcsl.com\nxhlld002.shop\nxhlsgs.com\nxhma.com\nxhmedia.com\nxhmwxy.com\nxhnews.net\nxhostfire.com\nxhostserver.com\nxhpfw.com\nxhpiano.com\nxhpr.net\nxhqbapp.com\nxhqqt.com\nxhrczp.com\nxhs.com\nxhscdn.com\nxhscdn.net\nxhsd.com\nxhsd.net\nxhsea.com\nxhsf.com\nxhslink.com\nxhslw.com\nxhsmlt.com\nxhsrmyy.com\nxhsxmt.com\nxhsyqx.com\nxhsyww.com\nxhtheme.com\nxhtw.com\nxhtwb.com\nxhtxgroup.com\nxhu2.com\nxhu218.com\nxhuaian.com\nxhup.club\nxhw520.com\nxhw81pr263.com\nxhwater.com\nxhwcdasha.com\nxhwhouse.com\nxhwtech.com\nxhwx100.com\nxhwyzsd.com\nxhxcedu.com\nxhxgt.com\nxhxhr.com\nxhxsw.com\nxhy.com\nxhyd.com\nxhygroup.com\nxhyksha.xyz\nxhylbfyy.com\nxhyljt.com\nxhysh.com\nxhytd.com\nxhyun.vip\nxhzysg.com\nxi-9.com\nxi-soft.com\nxi.biz\nxi.su\nxi5jie.com\nxia1ge.com\nxiaa.net\nxiabingbao.com\nxiabor.com\nxiabu.com\nxiacaopu.net\nxiache.net\nxiachufang.com\nxiada.net\nxiadaolieche.com\nxiadele.com\nxiaditu.com\nxiadts.com\nxiadu.com\nxiafenfa.com\nxiagaoqing.com\nxiagepian.com\nxiageyy.com\nxiaguanzhan.com\nxiagujian.com\nxiaheng.net\nxiaiot.com\nxiajuan88.com\nxiakefyz.com\nxiakeol.com\nxialingying.cc\nxialv.com\nxiamag.com\nxiamai.net\nxiame.com\nxiamen888.com\nxiamenair.com\nxiamenbg.com\nxiamenfojiao.com\nxiamenhuandongmarathon.com\nxiamenjiyang.com\nxiamentianqi114.com\nxiamenwater.com\nxiami.com\nxiami.fm\nxiami.net\nxiamo.fun\nxiamoyun.com\nxiamp4.com\nxian-feng.com\nxian-tourism.com\nxian-yao.com\nxian.com\nxianayi.net\nxianbao.fun\nxianbao.net\nxianbao5.com\nxianbdj.com\nxianbeikeji.com\nxianbey.com\nxiancaotang.com\nxianchengyou.com\nxiancn.com\nxiandaihospital.com\nxiandaimuye.com\nxiandaiyuwen.com\nxiandanjia.com\nxiandengdengguan.com\nxiandp.com\nxianer.net\nxianfae.com\nxianfan2022.com\nxianfengjiayuan.com\nxianfengsg.com\nxianfengyiyao.com\nxiang.com\nxiang.xin\nxiang5.com\nxiang578.com\nxiangange.com\nxianganquan.com\nxianganyu.com\nxiangauto.com\nxiangbababus.com\nxiangbala.net\nxiangbinmeigui.com\nxiangbojiubo.com\nxiangbosoft.com\nxiangcoin.com\nxiangcun.cc\nxiangcun.com\nxiangcunxiaoshuo.com\nxiangdian.com\nxiangdian.store\nxiangguo.com\nxiangguohe.com\nxiangha.com\nxianghuanji.com\nxianghumarathon.com\nxianghunet.com\nxianghus.com\nxiangjiamuye.com\nxiangjiang-amc.com\nxiangjiasz.com\nxiangjiayaoyehz.com\nxiangkanwang.com\nxiangkesi.com\nxiangley.com\nxianglifood.com\nxiangliuzi.com\nxianglongpharm.com\nxianglute.com\nxiangmaita.com\nxiangming.site\nxiangmu.com\nxiangni.com\nxiangniya.com\nxiangoo.com\nxiangpeach.com\nxiangpi.com\nxiangpu24fa.com\nxiangqiai.com\nxiangqianpos.com\nxiangqigame.com\nxiangqin7.com\nxiangqishan.com\nxiangqiyouxi.com\nxiangqu.com\nxiangrikui.com\nxiangrikuijianzhan.com\nxiangrikuisite.com\nxiangruichina.com\nxiangruizulin.com\nxiangshang360.com\nxiangshangban.com\nxiangshanpark.com\nxiangshe.com\nxiangshengbao.com\nxiangshengnet.com\nxiangshi.cc\nxiangshi.video\nxiangshitan.com\nxiangshuheika.com\nxiangshunjy.com\nxiangsidi.com\nxiangsw.com\nxiangtaiyun.com\nxiangtaole.com\nxiangtatech.com\nxiangtuan.xyz\nxiangtx.com\nxianguo.com\nxianguomall.com\nxianguotea.com\nxiangw.com\nxiangwushuo.com\nxiangxiangmf.com\nxiangxihe.com\nxiangxinggroup.com\nxiangxingnet.com\nxiangyang-marathon.com\nxiangyang.net\nxiangyangwater.com\nxiangyi.co\nxiangyiai.com\nxiangyilxj.com\nxiangyu-group.com\nxiangyue.life\nxiangyueedu.com\nxiangyueliangyuan.com\nxiangyuezhongxue.com\nxiangyujiankang.com\nxiangyuncdn.com\nxiangyungx.com\nxiangyuyaoye.com\nxiangzhan.com\nxiangzhiren.com\nxiangzhuyuan.com\nxiangzi.ltd\nxiangzi.tech\nxiangzuanjiang.com\nxiangzukeji.com\nxianjian.com\nxianjian10.com\nxianjiaosuo.com\nxianjichina.com\nxianjiqun.com\nxianjzyxh.org\nxiankabao.com\nxiankan.com\nxianlai.work\nxianlaicd.com\nxianlaigame.com\nxianlaihy.com\nxianlaivip.com\nxianlan315.com\nxianlife.com\nxianliming.com\nxianmaiyangsheng.com\nxianmeilai.com\nxianmeisc.com\nxianningmarathon.com\nxianniu.com\nxianniu.net\nxianniuzu.com\nxiannvhu.com\nxianousiqi.com\nxianpinyun.com\nxianpp.com\nxianrail.com\nxianrenzhang.net\nxianshiqiba.com\nxianshishangmao.com\nxianshu.com\nxianshua.net\nxianshuabao.com\nxianshufang.com\nxiansimo.com\nxiansuan.com\nxiantao-marathon.com\nxiantao.com\nxianweizhang.com\nxianxiadao.com\nxianxiadao.net\nxianxiazhuanjz.com\nxianxueba.com\nxianyang888.com\nxianyer.com\nxianyongyong.com\nxianyouhe.com\nxianyu.mobi\nxianyuange.com\nxianyudanji.net\nxianyugame.com\nxianyugouwu.com\nxianyuso.com\nxianyuvr.com\nxianyuwang.com\nxianyuyouxi.com\nxianzhanget.com\nxianzhi.net\nxianzhid.com\nxianzhongwang.com\nxianzidaer.com\nxianzilaishui.com\nxiao-an.com\nxiao-bo.com\nxiao-new.com\nxiao100.com\nxiao2she.com\nxiao688.com\nxiao84.com\nxiaoa.name\nxiaoac.com\nxiaoaiassist.com\nxiaoaiscan.net\nxiaoaisound.com\nxiaoantech.com\nxiaoantech.net\nxiaoao.com\nxiaoapp.io\nxiaoba001.com\nxiaobai.com\nxiaobaibar.net\nxiaobaipan.com\nxiaobaishiji.com\nxiaobaishixi.com\nxiaobaitool.net\nxiaobaiupin.com\nxiaobaivr.com\nxiaobaixitong.com\nxiaobal.com\nxiaobangbaoxian.com\nxiaobangguihua.com\nxiaobangtouzi.com\nxiaobao360.com\nxiaobaobianli.com\nxiaobaobianli.net\nxiaobaodt.com\nxiaobaoming.com\nxiaobaoonline.com\nxiaobaostudio.com\nxiaobeibike.com\nxiaobeigl.com\nxiaobeiyangji.com\nxiaobeizuqin.com\nxiaobianli8.com\nxiaobingxitong.com\nxiaobool.com\nxiaobot.net\nxiaobu.tech\nxiaobu121.com\nxiaobuwq.com\nxiaocanapp.com\nxiaocanhulian.com\nxiaocantech.com\nxiaocaoo.com\nxiaocaoyun.com\nxiaoce.fun\nxiaocen.com\nxiaochamao.com\nxiaoche001.com\nxiaocheng.com\nxiaochengxu029.com\nxiaochengxucms.com\nxiaochi198.com\nxiaochixiang.com\nxiaochuan010.com\nxiaochuanyun.com\nxiaocifang.com\nxiaocms.com\nxiaocx.org\nxiaoda.fun\nxiaodaijl.com\nxiaodaka.net\nxiaodangxian.com\nxiaodanzi.com\nxiaodao0.com\nxiaodaotv.com\nxiaodaozhi.com\nxiaodapei.com\nxiaodengvip.com\nxiaodian.com\nxiaodian.so\nxiaodianweb.com\nxiaodigu.com\nxiaoding110.com\nxiaodingchui.com\nxiaodiyouxi.com\nxiaodongxier.com\nxiaodoubi.com\nxiaodoukj.com\nxiaodoushebao.com\nxiaodouzuche.com\nxiaoduoai.com\nxiaoduseo.com\nxiaodutv.com\nxiaody.com\nxiaoe-assets.com\nxiaoe-live.com\nxiaoe-materials.com\nxiaoe-tech.com\nxiaoe-tools.com\nxiaoecloud.com\nxiaoeeye.com\nxiaoeknow.com\nxiaoenai.com\nxiaoerjiren.com\nxiaoeryi.com\nxiaoetong.com\nxiaofany.com\nxiaofeng.org\nxiaofengtv.com\nxiaofubao.com\nxiaofuzi.net\nxiaog.xyz\nxiaogan.com\nxiaogd.net\nxiaogegelive.com\nxiaogj.com\nxiaogou111.com\nxiaogou222.com\nxiaogou333.com\nxiaogou444.com\nxiaogou555.com\nxiaogou666.com\nxiaogou777.com\nxiaogou888.com\nxiaogou999.com\nxiaogouds.com\nxiaogouh5.com\nxiaogouzhineng.com\nxiaoguaniu.com\nxiaoguikuaipao.com\nxiaoguo101.com\nxiaoguosq.com\nxiaoguowenhua.com\nxiaoguoyi.com\nxiaogushi.com\nxiaohansong.com\nxiaohe-jiankang.com\nxiaohe666.com\nxiaoheihegame.com\nxiaoheima.com\nxiaohelive.com\nxiaohengmaidan.com\nxiaohi.cc\nxiaohongchun.com\nxiaohongjituan.com\nxiaohongshu-mycdn.com\nxiaohongshu.com\nxiaohongshu.net\nxiaohongshulvyou.com\nxiaohouyisheng.com\nxiaohouyunyin.com\nxiaohu8.com\nxiaohua8.com\nxiaohuabaichu.com\nxiaohuabuluo.com\nxiaohuai.com\nxiaohuangji.com\nxiaohuanxiong.com\nxiaohuazhuo.com\nxiaohucloud.com\nxiaohufev.com\nxiaohulu.com\nxiaohun.net\nxiaohuochai.cc\nxiaohuochai.site\nxiaohuohu.com\nxiaohus.com\nxiaohuwl.com\nxiaoi.com\nxiaoi.me\nxiaoice.com\nxiaoj.com\nxiaoji.com\nxiaoji001.com\nxiaojian.site\nxiaojiaokeji.com\nxiaojiaoyar.com\nxiaojiaoyu.com\nxiaojiaoyu100.com\nxiaojing.work\nxiaojing360.com\nxiaojinzi.com\nxiaojiuwang.com\nxiaojl.com\nxiaojp.com\nxiaojuchefu.com\nxiaojudeng.com\nxiaojukeji.com\nxiaojupeijian.com\nxiaoka.tv\nxiaokache.com\nxiaokakj.com\nxiaokanba.com\nxiaokanglongjiang.com\nxiaokao.com\nxiaokaxiu.com\nxiaokcdn.com\nxiaokcehui.com\nxiaoke.space\nxiaoke101.com\nxiaokeai.com\nxiaokeduo.com\nxiaokepu.com\nxiaokesoso.com\nxiaokudang.com\nxiaokuihua.net\nxiaokusha.com\nxiaolachuxing.com\nxiaolajiao.com\nxiaolanapp.com\nxiaolanben.com\nxiaolangtt.com\nxiaolantiao.com\nxiaole.com\nxiaoleimob.com\nxiaolianbao.com\nxiaoliangkou.com\nxiaolianhb.com\nxiaoliebian.com\nxiaolii.com\nxiaolikj.online\nxiaolin.in\nxiaolinbysj.com\nxiaolincoding.com\nxiaolinsi.com\nxiaolintj.com\nxiaolinwl.com\nxiaoliqing.net\nxiaolizhuli.com\nxiaolizupai.com\nxiaolong.li\nxiaoluboke.com\nxiaoluerhuo.com\nxiaoluhaohuo.com\nxiaolun.net\nxiaoluxuanfang.com\nxiaoluyouxuan.com\nxiaoluyy.com\nxiaoluzhidian.com\nxiaolvji.com\nxiaolxiao.com\nxiaoma.com\nxiaoma.io\nxiaoma.net\nxiaomachuxing.com\nxiaomagaojian.com\nxiaomai.live\nxiaomai5.com\nxiaomaidong.com\nxiaomaigongkao.com\nxiaomaigui.com\nxiaomaiketang.com\nxiaomaiuzu.com\nxiaomajia.com\nxiaomaomi.online\nxiaomaomv.com\nxiaomape.com\nxiaomark.com\nxiaomashijia.com\nxiaomaxitong.com\nxiaomayi.net\nxiaomazhixing.com\nxiaomei.cc\nxiaomeiti.com\nxiaomeng1235.com\nxiaomi.com\nxiaomi.hk\nxiaomi.net\nxiaomi.org\nxiaomi.tw\nxiaomiaozai.com\nxiaomicache.com\nxiaomicorp.com\nxiaomicorp.net\nxiaomicp.com\nxiaomidns.com\nxiaomidns.net\nxiaomiev.com\nxiaomiflash.com\nxiaomiinc.com\nxiaomiinc.net\nxiaomimimo.com\nxiaomimobile.com\nxiaominet.com\nxiaominfo.com\nxiaomingjianzhan.com\nxiaomingtaiji.cc\nxiaomingtaiji.com\nxiaomingtaiji.net\nxiaominr.com\nxiaomiprint.com\nxiaomiqiu.com\nxiaomiquan.com\nxiaomirom.com\nxiaomisa.com\nxiaomisa.net\nxiaomisa.org\nxiaomishu.com\nxiaomiw.cc\nxiaomiwear.com\nxiaomixiaoai.com\nxiaomiyoupin.com\nxiaomlove.com\nxiaomor.com\nxiaomu.cc\nxiaomuji.info\nxiaomuzhi.com\nxiaomy.net\nxiaomyc.com\nxiaonaodai.com\nxiaonaonao.org\nxiaonei.com\nxiaonengren.com\nxiaoni.com\nxiaoniba.com\nxiaoniu66.com\nxiaoniuben.com\nxiaoniuds.com\nxiaoniuhululu.com\nxiaopai.vip\nxiaopaitech.com\nxiaopaotec.com\nxiaopeiqing.com\nxiaopeng.com\nxiaophy.com\nxiaopi.com\nxiaopinchuxing.com\nxiaopinw.com\nxiaopiu.com\nxiaoqiandao.com\nxiaoqiangge.com\nxiaoqiling.com\nxiaoqingtou.com\nxiaoqinre.com\nxiaoqiqiao.com\nxiaoqiweb.com\nxiaoquba.com\nxiaoqueshe.com\nxiaoquyijia.com\nxiaorizi.me\nxiaorui.cc\nxiaoruibao.com\nxiaoshengping.com\nxiaoshentongzongbu.com\nxiaoshidata.com\nxiaoshijie.com\nxiaoshituina.vip\nxiaoshouhudong.com\nxiaoshourc.com\nxiaoshouyi.com\nxiaoshuapp.com\nxiaoshuiguo.com\nxiaoshujiang.com\nxiaoshuo.com\nxiaoshuo1-sm.com\nxiaoshuo2-sm.com\nxiaoshuo3-sm.com\nxiaoshuo4-sm.com\nxiaoshuo5-sm.com\nxiaoshuo520.com\nxiaoshuoba.com\nxiaoshuobi.cc\nxiaoshuodaquan.com\nxiaoshuohui.net\nxiaoshuoli.com\nxiaoshuowu.com\nxiaoshuxiong.com\nxiaositv.com\nxiaot.com\nxiaota.com\nxiaotangketang.com\nxiaote.com\nxiaote.net\nxiaotee.com\nxiaotengyouxi.com\nxiaotiancai.com\nxiaoting.com\nxiaotongqq.com\nxiaotud.com\nxiaotuzhan.com\nxiaou2014.com\nxiaoupan.com\nxiaowang.net\nxiaowangshen.com\nxiaowangyun.com\nxiaowangzi777.com\nxiaowazi.com\nxiaoweichen.com\nxiaoweigod.com\nxiaoweijia.net\nxiaoweijiankang.com\nxiaoweirobot.com\nxiaowiba.com\nxiaowm.com\nxiaowuwl.com\nxiaoxia.vip\nxiaoxiaapi.com\nxiaoxiang.club\nxiaoxiangbz.com\nxiaoxiangtoutiao.com\nxiaoxiangxueyuan.com\nxiaoxiangyoupin.com\nxiaoxiaodangan.com\nxiaoxiaoketang.com\nxiaoxiaomo.com\nxiaoxiaoshuo.com\nxiaoxiaotong.org\nxiaoxiaoyouxuan.com\nxiaoxichangliu.com\nxiaoxili.com\nxiaoxinbk.com\nxiaoxineye.com\nxiaoxinrili.com\nxiaoxintoutiao.com\nxiaoxintuku.com\nxiaoxiong360.com\nxiaoxiongjita.com\nxiaoxiongmeishu.com\nxiaoxiongxitong.com\nxiaoxiongyouhao.com\nxiaoxiongzhoupu.com\nxiaoxitech.com\nxiaoxusd.com\nxiaoya56.com\nxiaoyanjiusheng.com\nxiaoyantong.com\nxiaoyanwenxue.com\nxiaoyaodsx.com\nxiaoyaoxi.com\nxiaoyaoyou.com\nxiaoyastar.com\nxiaoyatong.com\nxiaoyegejitar.com\nxiaoyejidian.com\nxiaoyejixie.com\nxiaoyeren.com\nxiaoyezi.com\nxiaoyezu.com\nxiaoyi.com\nxiaoyiads.com\nxiaoyida.com\nxiaoyida.net\nxiaoyiduoduo.com\nxiaoying.co\nxiaoying.com\nxiaoying.tv\nxiaoyingxiong.com\nxiaoyingzhenxuan.com\nxiaoyisysreset.com\nxiaoyizhiqu.com\nxiaoyou66.com\nxiaoyouxi.co\nxiaoyouxi.com\nxiaoyouxi100.com\nxiaoyouxiqun.com\nxiaoyouzb.net\nxiaoyu.com\nxiaoyuananquantong.com\nxiaoyuankousuan.com\nxiaoyuansouti.com\nxiaoyuansouti.xyz\nxiaoyuanyun2.com\nxiaoyuanzhao.com\nxiaoyuanzhaopin.net\nxiaoyuer.com\nxiaoyujia.com\nxiaoyun.com\nxiaoyusan.com\nxiaoyusanchou.com\nxiaoyuxitong.com\nxiaoyuzhoufm.com\nxiaoz.me\nxiaozhang365.com\nxiaozhao365.com\nxiaozhenpaotui.com\nxiaozhibaoxian.com\nxiaozhibo.com\nxiaozhimed.com\nxiaozhiyun.com\nxiaozhongjishu.com\nxiaozhoumo.com\nxiaozhu.com\nxiaozhu.hk\nxiaozhu158.com\nxiaozhu2.com\nxiaozhua.com\nxiaozhuangzhuang.com\nxiaozhuanhao.com\nxiaozhustatic1.com\nxiaozhustatic2.com\nxiaozhustatic3.com\nxiaozlife.com\nxiaozu365.com\nxiaozuan8.com\nxiaozuanbike.com\nxiaozufan.com\nxiaozujian.com\nxiapac.com\nxiapilu.com\nxiappt.com\nxiapu.co\nxiaqu.org\nxiaqunfeng.cc\nxiarenzhuxin.com\nxiarj.com\nxiashanet.com\nxiataoseo.com\nxiatou.com\nxiaw.net\nxiawan8.com\nxiawen.tv\nxiawuyouke.com\nxiaxs.info\nxiaxs.la\nxiayixing.com\nxiayx.com\nxiazai.live\nxiazai126.com\nxiazai16.com\nxiazai163.com\nxiazaiba.com\nxiazaicc.com\nxiazaidizhi.cc\nxiazaijidi.com\nxiazais.com\nxiazaitool.com\nxiazaiwx.com\nxiazhougroup.com\nxibaike.com\nxibaiwang.com\nxibanyaqz.com\nxibeicanyin.com\nxibeidev.com\nxiberia.net\nxibojiaoyu.com\nxibu168.com\nxibujuece.com\nxiburongmei.com\nxicaijing.com\nxicaishe.com\nxicaodesign.com\nxichengo.com\nxichongsm.com\nxichu.net\nxichuan001.com\nxichuangzhu.com\nxici.com\nxici.net\nxicp.net\nxidesheng.com\nxidian.cc\nxidibuy.com\nxidie.com\nxidiglobal.com\nxiduobaby.com\nxie22.com\nxiebanyun.com\nxiebao18.com\nxieboke.net\nxiecdn.com\nxieche.com\nxieche.net\nxiecheng.com\nxiechuangw.com\nxiedaimala.com\nxiedajia.com\nxiedao.com\nxiediantong.com\nxiefenxiang.com\nxiegangsir.com\nxiege.net\nxiegekt.com\nxiehehp.com\nxiehejx.com\nxiehekjkf.com\nxiehepcb.com\nxiehouit.com\nxiehuiyi.com\nxiejiahe.com\nxiejianji.com\nxiejiaxin.com\nxiejing.com\nxieliaofa.com\nxielijiaoyu.com\nxieliqun.com\nxiemm.com\nxiesk.com\nxietonghuaxue.com\nxiexiaoyuan.com\nxiexin.com\nxiexinbao.com\nxiexingcun.com\nxieyangzhe.com\nxieyimao.com\nxieyudatea.com\nxiezewen.com\nxiezi.tech\nxiezilouzulinwang.com\nxieziqiu.net\nxiezixiansheng.com\nxiezuocat.com\nxiezuoye.com\nxiezuoyisi.com\nxifangw.com\nxifenfei.com\nxifengboke.com\nxifenggroup.com\nxifengjiuzhaoshang.com\nxifu120.com\nxifumi.com\nxigaogen.com\nxiggua.com\nxigo.tv\nxigou100.com\nxigoubao.com\nxigua.com\nxigua110.com\nxiguaapp.com\nxiguabook.com\nxiguaji.com\nxiguang.xyz\nxiguaplayer.com\nxiguashipin.net\nxiguavideo.net\nxigushan.com\nxigushan.net\nxigushi.com\nxihabang.com\nxihachina.com\nxihaiannews.com\nxihaianrc.com\nxihangzh.com\nxihaxueche.com\nxihazsww.com\nxihegp.com\nxiherencai.com\nxihuan.me\nxihusgh.com\nxiimoon.com\nxiinnn.com\nxiji.com\nxijie.com\nxijie888.com\nxijinfa.com\nxijing01.com\nxijingjianzhan.com\nxijingjianzhan0.com\nxijingjianzhan1.com\nxijingjianzhan2.com\nxijingjianzhan3.com\nxijingjianzhan4.com\nxijingjianzhan5.com\nxijingjianzhan6.com\nxijingjianzhan7.com\nxijingjianzhan8.com\nxijingjianzhan9.com\nxikang365.net\nxikcloud.com\nxikii.com\nxikoutourism.com\nxikrs.com\nxikuan.com\nxikuqi.com\nxilaijian.com\nxilaiping.com\nxilanggufen.com\nxilddt.com\nxilehongniang.com\nxilexuan.com\nxileyougame.com\nxili.fan\nxilian-group.com\nxiliangjituan.com\nxilichi.com\nxiliguoji.com\nxilinjie.com\nxilinsi.org\nxilinx-ic.com\nxilipy.com\nxilish.com\nxilitang.com\nxiliulou.com\nxilu.com\nxiluoxuan.com\nxilvlaw.com\nxima.org\nxima.tv\nximalaya.com\nximalaya.fm\nximalaya.men\nximalaya.tv\nximalayadata.com\nximalayaos.com\nximeiapp.com\nximeigroup.com\nximendou.com\nximenwai.com\nximgs.net\nximiplay.com\nximitools.com\nximiyouxi.com\nximmerse.com\nximogo.com\nximuw.com\nxin-health.com\nxin-manganese.com\nxin-yao.com\nxin.com\nxin.science\nxin.xin\nxin1234.com\nxin21.xyz\nxin3721.com\nxin6.net\nxinac.net\nxinanjr.com\nxinanrui.com\nxinansec.com\nxinaogas.com\nxinaoyun.com\nxinba.com\nxinbaicai.com\nxinbalive.com\nxinbear.com\nxinbiaocha.com\nxinbiaochijiaoyu.com\nxinboaa.com\nxinbqg.com\nxincache.com\nxincai.com\nxincailiao.com\nxincainet.com\nxincaise.com\nxincaitong.net\nxincanshu.com\nxinceremed.com\nxincg.com\nxincha.com\nxinchacha.com\nxinchaipower.com\nxinchanfeng.com\nxinchangol.com\nxinchao.com\nxinchaoss.com\nxinchego.com\nxinchenai.com\nxincheng.com\nxinchengbio.com\nxinchengge13.com\nxinchengyue.com\nxincheping.com\nxinchess.com\nxinchong.com\nxinchuanbo.com\nxinchuang-bio.com\nxinchukj.com\nxincj.com\nxincmm.com\nxincode.com\nxincomm.com\nxinda-bio.com\nxindachem.com\nxindaifu.com\nxindalawyer.com\nxindaohang123.com\nxindasulian.com\nxindawz.com\nxinde.org\nxindemarinenews.com\nxindetihuiya.com\nxindexuexi.com\nxindianti.com\nxindingdianxsw.com\nxindingwealth.com\nxindns.com\nxindong.com\nxindongdinglv.com\nxindonghuyu123.com\nxindu.cc\nxinduo.com\nxinduoad.com\nxinenw.com\nxiner-membrane.com\nxineurope.com\nxinexpress.com\nxinfaholding.com\nxinfangcidian.com\nxinfangsheng.com\nxinfei.com\nxinfeijituan.com\nxinfeipengjixie.com\nxinfeiyu.net\nxinfenggxgroup.com\nxinfengji.com\nxinfengming.com\nxinfenlei.com\nxinfinite.net\nxinfox.net\nxinfree.com\nxinfuhk.com\nxinfushe.com\nxinfuyouxi.com\nxinfuyun.net\nxing-su.com\nxing73.com\nxingames.com\nxingaochengtai.com\nxingb.net\nxingbangfl.com\nxingbo.tv\nxingchao1.com\nxingchengb.org\nxingcheshixian.com\nxingchiauto.com\nxingchuangcar.com\nxingchuangtiandi.com\nxingdatrip.com\nxingdong.co\nxingdongliu.com\nxinge.com\nxinge.la\nxinge365.com\nxingechemical.com\nxingechina.com\nxingefuwu.com\nxingeshan.com\nxingezhan.com\nxingfagroup.com\nxingfeiinc.com\nxingfudu.com\nxingfufangdai.com\nxingfulaonian.com\nxingfulizhaofang.com\nxingfuu.com\nxinggan.net\nxingganggas.com\nxingguanggongkao.com\nxinghai365.com\nxinghaigroup.com\nxinghaiwaimai.com\nxinghan.vip\nxinghangdao.com\nxinghantec.com\nxinghaoyun8.com\nxinghejoy.com\nxinghengedu.com\nxingheoa.com\nxinghuaport.com\nxinghuazixun.com\nxinghuo100.com\nxinghuo365.com\nxinghuoxiaoshuo.com\nxinghy.com\nxinghy56.com\nxingjiagames.com\nxingjiaoyun.com\nxingjiesj.com\nxingjijy.com\nxingjimob.com\nxingjun-group.com\nxingkec.com\nxingkeqi.com\nxingketech.com\nxingkong.link\nxingkongfy.xyz\nxingkongmt.com\nxingkupai.com\nxinglai.com\nxinglan.co\nxingliao.work\nxingliju.com\nxinglin-tech.com\nxinglingyingxue.com\nxinglinpukang.com\nxinglizhou.vip\nxingloo.com\nxingmima.com\nxingming.com\nxingming.net\nxingmuyi.com\nxingnuo.cc\nxingongjiaoyu.com\nxingpai.com\nxingpaibilliard.com\nxingpan.com\nxingpin.com\nxingqier.com\nxingqisihuishou.com\nxingqiu.tv\nxingqiu520.com\nxingqu11.com\nxingquanke.com\nxingren.com\nxingronghealthcare.com\nxingrongn.com\nxingruan.com\nxingrui-cn.com\nxingrunkg.com\nxingse.net\nxingseapp.com\nxingshangnet.com\nxingshawater.com\nxingshen.com\nxingshu.com\nxingshuishuiwu.net\nxingshulin.com\nxingsteel.com\nxingsuyun58.com\nxingtai.net\nxingtai0319.com\nxingtai123.com\nxingtaishipping.com\nxingtan.one\nxingtan001.com\nxingtangzp.com\nxingtongsw.com\nxingtu.com\nxingtui520.com\nxinguad.com\nxinguangjian.com\nxinguge.com\nxinguida.com\nxinguizhou.com\nxingumin.net\nxinguodu.com\nxingvps.com\nxingwajiang.com\nxingwan001.com\nxingxing.com\nxingxingbao.com\nxingxingjizhang.com\nxingxingzaixian.fun\nxingxingzu.com\nxingxuanwaimai.com\nxingyangroup.com\nxingyao.com\nxingyaocq.com\nxingyaomob.com\nxingyaoss.com\nxingyaowa.com\nxingyaoyd.com\nxingyaozhilian.com\nxingye.work\nxingye1.com\nxingyeace.com\nxingyeai.com\nxingyeddz.com\nxingyigz.com\nxingyihaiyang.com\nxingyin.com\nxingying2018.com\nxingyizhai.com\nxingyongli.com\nxingyou99.com\nxingyoucai.com\nxingyuan-hb.com\nxingyuan.com\nxingyuebike.com\nxingyuebio.com\nxingyuedoor.com\nxingyuehuyu.com\nxingyuhuwai.com\nxingyunb.com\nxingyunba.com\nxingyungroup.com\nxingyunol.com\nxingyusoft.net\nxingyutc.com\nxingyuyouxi.com\nxingzh.xyz\nxingzhean.com\nxingzhige.com\nxingzhiheyi.com\nxingzhilan.com\nxingzi-vision.com\nxingzou.art\nxingzoushu.com\nxingzuo.com\nxingzuomi.com\nxingzuopei.com\nxingzuowu.com\nxingzuoyundns.com\nxinhaiglobal.com\nxinhaimineral.com\nxinhaiminingepc.com\nxinhaimininggroup.com\nxinhaisoft.com\nxinhaitravel.com\nxinhanhd.com\nxinhanhr.com\nxinhanyx.com\nxinhaolian.com\nxinhaoqi.net\nxinhaosi.com\nxinhay.com\nxinhe99.com\nxinhechina.com\nxinhecq.com\nxinhedjq.com\nxinhengshui.net\nxinheshenggroup.com\nxinheyun.net\nxinhongru.com\nxinhua-news.com\nxinhua.org\nxinhua08.com\nxinhuaapp.com\nxinhuachongming.com\nxinhuachuanmeijs.com\nxinhuacu.com\nxinhuaiot.com\nxinhuamm.net\nxinhuanet.com\nxinhuanet.ltd\nxinhuapo.com\nxinhuaprs.com\nxinhuapub.com\nxinhuaqipai.com\nxinhuashe.org\nxinhuashudian.com\nxinhuasuye.com\nxinhuawang.com\nxinhuawz.com\nxinhuaxmt.com\nxinhuayimin.com\nxinhuazhiyun.com\nxinhuoq.com\nxinhuozhi.com\nxining-marathon.com\nxiniu.com\nxiniu3d.com\nxiniugushi.com\nxiniushu.com\nxiniuyun.com\nxinjiadiy.com\nxinjianggames.com\nxinjianggou.com\nxinjiangqinglvyou.com\nxinjiangroup.com\nxinjiashangtou.com\nxinjidian.com\nxinjifangchan.com\nxinjimo.com\nxinjingst.com\nxinjingxiang.com\nxinjinqiu.com\nxinjiren.com\nxinjisuan.net\nxinjiyuan.net\nxinju.fun\nxinjuc.com\nxinjunshi.net\nxinjunshicn.net\nxinke-semi.com\nxinkuai.com\nxinlangtupian.com\nxinlanshengbc.com\nxinle.com\nxinle366.com\nxinleineng.com\nxinleshan.com\nxinleshiyiyuan.com\nxinlexie.com\nxinli001.cc\nxinli001.com\nxinli001.xyz\nxinli001wx.com\nxinli10.com\nxinliangxiang.com\nxinliceping.com\nxinlifudao.com\nxinlilw.com\nxinlinghuayuan.com\nxinlingletu.com\nxinlip.com\nxinliwanju.com\nxinlixinli.net\nxinlong-holding.com\nxinluex.com\nxinlvtu.com\nxinlvyy.com\nxinmaizj.com\nxinmanduo.com\nxinmanhua.net\nxinmanyuan.com\nxinmaotao.net\nxinmei365.com\nxinmeihu.com\nxinmeijiutian.com\nxinmeinuo.com\nxinmem.com\nxinmenglife.com\nxinmeow.com\nxinmeti.com\nxinmima.com\nxinminghui.com\nxinminheng.com\nxinmintian.vip\nxinmizx.com\nxinnakj.com\nxinnet.com\nxinnetdns.com\nxinnetvip.com\nxinniangjie.com\nxinnianhua.com\nxinnong.com\nxinnong.net\nxinnuodazu.com\nxino-tech.com\nxinorngyk.com\nxinouhk.com\nxinoujixie.com\nxinpa.com\nxinpeihu.net\nxinpg.com\nxinpianchang.com\nxinpianyugao.com\nxinpin-ip.com\nxinping.cc\nxinpingmu.com\nxinpinhe.com\nxinpinmao.com\nxinpintoutiao.com\nxinpupower.com\nxinpure.com\nxinqidian-sh.com\nxinqigu.com\nxinqing.com\nxinqingyulu.com\nxinqite.com\nxinqiucc.com\nxinqiyejia.com\nxinqtech.com\nxinquanedu.com\nxinquji.com\nxinranliu.me\nxinrenxinshi.com\nxinri.com\nxinrong88.com\nxinrui-games.com\nxinrui-pharm.com\nxinrui.biz\nxinruipiao.com\nxinruiweb.com\nxinsanbanbao.com\nxinsankeji.com\nxinsdn.com\nxinsenz.com\nxinsf.cc\nxinshangmeng.com\nxinshangshangxin.com\nxinshengdagroup.com\nxinshengku.com\nxinshengsemi.com\nxinshi525.com\nxinshiba.com\nxinshipu.com\nxinshishen.com\nxinshouyou.com\nxinshouzhanzhang.com\nxinshuge.net\nxinshuiny.com\nxinshuru.com\nxinsilu.com\nxinsource.com\nxinss.com\nxinss.net\nxinstall.com\nxinstatic.com\nxinszy.com\nxintaikeji.com\nxintairen.com\nxintairencai.com\nxintaishequ.com\nxintaizhou.com\nxintajixie.com\nxinteenergy.com\nxintengmenchuang.com\nxintheme.com\nxintiandi.com\nxintianw.com\nxintianya.net\nxintiao100.com\nxintiaogroup.com\nxintiaoyouxi.com\nxintongconference.com\nxintongwang.com\nxintrum.com\nxintuan.com\nxintucdn.com\nxintuosoft.com\nxintv.com\nxinwangcj.com\nxinwanr.com\nxinweier.com\nxinweiyun.com\nxinwell.com\nxinwen365.com\nxinwen520.net\nxinwengao.net\nxinwengood.com\nxinwenlianbo.tv\nxinwo.com\nxinwuji.com\nxinwulan.com\nxinxe.com\nxinxi28.com\nxinxianghui.com\nxinxianshilb.com\nxinxiansk.com\nxinxianwang.com\nxinxiaochina.com\nxinxiaodian.com\nxinxiaoqi.com\nxinxiaozu.com\nxinxiehe.com\nxinxifabu.net\nxinxinapp.net\nxinxing-marathon.com\nxinxing001.com\nxinxing100.com\nxinxing91.com\nxinxinhot.net\nxinxinhotel.com\nxinxinjoy.com\nxinxinmed.com\nxinxjs.com\nxinxue-edu.com\nxinxuejy.com\nxinxunwang.com\nxinxyun.com\nxinya.me\nxinyali.net\nxinyan-gx.com\nxinyan.com\nxinyanggaopin.com\nxinyanglao.com\nxinyanwuliu.com\nxinyao168.com\nxinyaoapp.com\nxinyaoshi.com\nxinyapharm.com\nxinyayk.com\nxinyegang.com\nxinyetongcard.com\nxinyi-tech.com\nxinyi.com\nxinyidc.com\nxinyiglass.com\nxinyihl.com\nxinyinghc.com\nxinyingpower.com\nxinyingtec.com\nxinyingyang.com\nxinyisemi.com\nxinyishiji.com\nxinyitt.com\nxinyo100.com\nxinyong.net\nxinyongbuy.com\nxinyongsoon.com\nxinyou.com\nxinyoudui.com\nxinyour.com\nxinyu-tam.com\nxinyu19.com\nxinyuanclub.com\nxinyuanf.com\nxinyuanfin.com\nxinyuanshiye.net\nxinyubt.com\nxinyuchen.com\nxinyueclub.com\nxinyuefei.com\nxinyuehealth.com\nxinyuejiaxiao.net\nxinyueseo.com\nxinyuevod.com\nxinyuhole.com\nxinyuhongyuan.com\nxinyuncs.com\nxinyunfuwu.com\nxinyunit.com\nxinyurc.com\nxinyustone.com\nxinyutengyuan.com\nxinzegongshui.com\nxinzengwj.net\nxinzheng.cc\nxinzhi.com\nxinzhi.space\nxinzhibang168.com\nxinzhibid.com\nxinzhichuangzhi.com\nxinzhiguanwangyun.com\nxinzhongqi.net\nxinzhou.org\nxinzlkj.com\nxinzuojia.com\nxinzushenghuo.com\nxiolift.com\nxiongan1dt.org\nxionganxinxi.com\nxiongbagk.com\nxiongchuan.com\nxiongf.com\nxiongfengcl.com\nxiongfenggroup.com\nxiongge.club\nxiongmaitech.com\nxiongmao555.com\nxiongmao789.com\nxiongmaoboshi.com\nxiongmaodangao.com\nxiongmaojinku.com\nxiongmaosaohao.com\nxionguamaqui.com\nxiongying.com\nxiongyudl.com\nxiowo.net\nxioxix.com\nxipu.com\nxipunet.com\nxipushuju.net\nxiqb.com\nxiqianyangyi.com\nxiqiaoshantour.com\nxiqifun.com\nxiqinrc.com\nxiqkj.com\nxiqu.me\nxiqu001.com\nxiquebo.com\nxiqueer.com\nxiquepark.net\nxiqueqingjian.com\nxiqurongmei.com\nxiquwenhua.net\nxirang.com\nxiri-vacuum.com\nxironiot.net\nxisaiwang.com\nxise3.com\nxishalz.com\nxishanju-hn.com\nxishanju.com\nxishanxuexiao.com\nxishaoye.com\nxishiwang.com\nxishixiuhair.com\nxishpj.com\nxishu365.com\nxishuai.com\nxishuai.net\nxishuizk.com\nxishunj.com\nxisofttec.com\nxitanhotel.com\nxitaoinfo.com\nxite-group.com\nxitek.com\nxitek.net\nxitengbingxue.com\nxitie.com\nxitieba.com\nxitieba.net\nxitinet.com\nxitmi.com\nxitong-tech.com\nxitong114.com\nxitong5.com\nxitong8.com\nxitong86.com\nxitongcity.com\nxitongdaquan.net\nxitonggho.com\nxitonghe.com\nxitongku.com\nxitongle.com\nxitongpe.com\nxitongtiandi.net\nxitongtiankong.com\nxitongtu.net\nxitongwanjia.com\nxitongxz.net\nxitongzhijia.com\nxitongzhijia.net\nxitongzijia.net\nxitongzongcai.com\nxitu.com\nxitu.io\nxituan.com\nxiu.com\nxiu8.com\nxiuai.com\nxiubiaoshi.com\nxiubiaozu.com\nxiucai.com\nxiudodo.com\nxiudtech.com\nxiufa.com\nxiufaxing.com\nxiugei.com\nxiugu.com\nxiuhandingzhi.com\nxiuhangzhe.com\nxiuhe128.com\nxiuimg.com\nxiujiadian.com\nxiujixia.com\nxiujue.cc\nxiulian.com\nxiuluowang.com\nxiuluren.com\nxiulv.com\nxiumb.com\nxiumb12.com\nxiumi.us\nxiumius.com\nxiumucn.com\nxiuna.com\nxiuno.com\nxiuqicloud.com\nxiuren.com\nxiushao.com\nxiusheji.com\nxiushuang.com\nxiushui.net\nxiusifudianji.com\nxiustatic.com\nxiutanqi.com\nxiutuan.com\nxiutv.com\nxiuxiandou.com\nxiuxianshipin.com\nxiuxiu.com\nxiuxiuda.com\nxiuxiustatic.com\nxiuxmanhua.com\nxiuzhan365.com\nxiuzhanwang.com\nxiuzhiwu.com\nxivcdn.com\nxiwan.vip\nxiwang.com\nxiwangame.com\nxiwangchina.com\nxiwangd.com\nxiwanglife.com\nxiwangxiaoyuan.com\nxiwantrip.com\nxiweigas.com\nxiwenquan.com\nxiwicloud.com\nxiwnn.com\nxiwuji.com\nxiwuy.com\nxixiangongjiao.com\nxixianwatergroup.com\nxixiaoyou.com\nxixiarc.com\nxixibobo.com\nxixidoudizhu.com\nxixig8.com\nxixih.cc\nxixih.net\nxixik.com\nxixik.net\nxixinews.com\nxixinghanghr.com\nxixiqipai.com\nxixisys.com\nxixiwg.com\nxiyacs.com\nxiyangan.com\nxiyashiji.com\nxiyec-tencentclb.cloud\nxiyec-tencentclb.com\nxiyec-tencentclb.net\nxiyec-tencentclb.work\nxiyi-jt.com\nxiyijiang.com\nxiyijm.com\nxiyin.life\nxiyiqq.com\nxiyogo.com\nxiyongpark.com\nxiyoo.com\nxiyou-g.com\nxiyoucdn.com\nxiyouchat.com\nxiyouji.com\nxiyouji.work\nxiyoulinux.com\nxiyoupark.com\nxiyouquan.com\nxiyousdk.com\nxiyouwebgame.com\nxiyouxi.com\nxiyuanshuke.com\nxiyucosmetics.com\nxiyuege.com\nxiyuegr.com\nxiyufine.com\nxiyun.net\nxizanggames.com\nxizangguolv.net\nxizangmaoniunai.com\nxizangqinglv.com\nxizangzl.com\nxizexiao.com\nxizhai2021.com\nxizhang.com\nxizhengtouzi.com\nxizhi.com\nxizi.com\nxizice.com\nxiziiparking.com\nxiziquan.com\nxiziwang.net\nxj-biotech.com\nxj-etyy.com\nxj-tianye.com\nxj-zp.com\nxj120.com\nxj123.info\nxj169.com\nxj5152.com\nxj5u.com\nxj71.com\nxj917.com\nxj96596.com\nxjabc.net\nxjauto.net\nxjbank.com\nxjbaoyouge.com\nxjbdf.net\nxjbhc.net\nxjbuluo.com\nxjc18.com\nxjcc.net\nxjcmtj.com\nxjcysky.com\nxjcysw.com\nxjd2020.com\nxjdaily.com\nxjdkctz.com\nxjdpx.com\nxjdsb.com\nxjdwfc.com\nxjdzhyq.com\nxjedu.org\nxjent.com\nxjesps.com\nxjf.pub\nxjfam.com\nxjfdcw.com\nxjfilm.net\nxjfk.com\nxjflcp.com\nxjfm.com\nxjfzb.com\nxjgameapi.com\nxjgameinfo.com\nxjgc.com\nxjggjy.com\nxjgj.com\nxjgqt.org\nxjgsdm.com\nxjgt.com\nxjguanghui.com\nxjguowang.org\nxjgwy.org\nxjgxjt.com\nxjh.com\nxjh.me\nxjhgame.net\nxjhjrq.com\nxjhr.com\nxjhsxt.com\nxjhtrq.com\nxjhuan.fun\nxjhx120.com\nxjhyktsp.com\nxjhzn.com\nxjietiao.com\nxjishu.com\nxjisme.com\nxjiyou.com\nxjjhjt.com\nxjjnjp.org\nxjjqd154.com\nxjjsws.com\nxjjt.com\nxjks.net\nxjlxw.com\nxjlytz.com\nxjlz365.com\nxjmachine.com\nxjmg.com\nxjmty.com\nxjnnet.net\nxjnzm.com\nxjoycity.com\nxjpdf.com\nxjphsd.com\nxjpnmt.com\nxjqixing.com\nxjqysw.com\nxjr2018.com\nxjrb.com\nxjrb.net\nxjrc365.com\nxjrmyy.com\nxjshanhao.com\nxjsic.com\nxjsmwl.com\nxjsy56.com\nxjtcm.com\nxjtjjt.com\nxjtour.com\nxjtrcw.com\nxjtrry.com\nxjtsnews.com\nxjtssw.com\nxjtucompressor.com\nxjtudlc.com\nxju88.com\nxjwell.com\nxjwljb.com\nxjwyglw.com\nxjxa.com\nxjxbmy.com\nxjxbx.com\nxjxdf.com\nxjxf.com\nxjxhdn.com\nxjxtrq.com\nxjy020.com\nxjygaofu.com\nxjyrcw.com\nxjysk.com\nxjytjt.com\nxjz.com\nxjzclyqc.com\nxjzcsq.com\nxjzdjx.com\nxjzhsh.com\nxjzlyy.com\nxjzp.net\nxk41v506m7.com\nxk57.com\nxk857.com\nxk89.com\nxk9l.com\nxkaczxv.com\nxkaxka.com\nxkbbtang.com\nxkbjm.com\nxkcd.in\nxkcun.com\nxkdywl.com\nxkeirofiowef.com\nxker.com\nxkfyzmob.com\nxkgiwdey.com\nxkhouse.com\nxkitd.com\nxkjian.com\nxkjt.com\nxkjt.net\nxkjxcon.com\nxknow.net\nxkoeccrq.com\nxkonglong.com\nxkpx.com\nxksafe.com\nxksast.com\nxktech.com\nxktsz.com\nxkunyi.com\nxkw.com\nxkwe.com\nxkxs.org\nxkxsc.com\nxkyl.vip\nxkyn.com\nxkyn.net\nxkyy.com\nxkzzz.com\nxl-ai.com\nxl-edu.net\nxl-ele.com\nxl-soft.com\nxl-vip.com\nxl18z.com\nxl2824.com\nxl5bb.com\nxl5dd.com\nxl5du.com\nxl5dw.com\nxl699.com\nxlaidudu.info\nxlaidudu.net\nxlaomi.net\nxlbsoft.com\nxlcai.com\nxlcgjg.com\nxlcidc.com\nxlcjzx.com\nxlctyd.com\nxlczg.com\nxldlive.com\nxldz.com\nxlewen5.com\nxlfred.com\nxlgao.com\nxlgjg.net\nxlgogo.com\nxlgtx.com\nxlgxapp.com\nxlhb.com\nxlhbgroup.com\nxlhfmj.xin\nxlhhy.com\nxlhk.net\nxlhs.com\nxlhyc.com\nxlibai.com\nxlinclass.com\nxlisp.net\nxljly.com\nxljnjy.com\nxljsci.com\nxlkdyf.com\nxlkorganic.com\nxlkshop.com\nxlkty.com\nxllyk.com\nxlm258.com\nxlmarathon.com\nxlmr.com\nxlmz.net\nxlndt.com\nxlobo.com\nxlongm.com\nxloveyoux.com\nxlpai.com\nxlpan.com\nxlpp.net\nxlqeai.com\nxlqzh.com\nxlread.com\nxlreads.com\nxlsdn.com\nxlsemi.com\nxlshou.com\nxlsxmj.com\nxltll.com\nxltnjslfd.com\nxlvshi.com\nxlwl95.com\nxlxkgjt.com\nxlxqsgf.com\nxlxslny.com\nxlyap.com\nxlyfhw.com\nxlykzz.com\nxlyouxi.com\nxlyouxi.net\nxlysauc.com\nxlysauc.net\nxlysoft.net\nxlyx3.com\nxlyxo.com\nxlyxp.com\nxlzfpt.com\nxlzhao.com\nxlzyd.com\nxlzys.com\nxlzyyw.com\nxm-ad.com\nxm-ais.net\nxm-chuang.com\nxm-gzf.com\nxm-olympic-museum.org\nxm002.com\nxm200.com\nxm51.com\nxm5156.com\nxm680.com\nxm6wpp.com\nxm9.co\nxm909.com\nxm9m.com\nxmac.app\nxmafkj.com\nxmaibu.com\nxmalaya.com\nxmamiga.com\nxmanblog.net\nxmantou.com\nxmasg.com\nxmayitxt.com\nxmbankonline.com\nxmbhw.com\nxmbie.com\nxmbike.com\nxmbus.com\nxmccb.com\nxmcdn.com\nxmchong.com\nxmcimg.com\nxmcord.com\nxmcp.ltd\nxmcwh.com\nxmcx.net\nxmcy.com\nxmdh.com\nxmeasygo.com\nxmecard.com\nxmerak.com\nxmeye.net\nxmf.com\nxmfc.com\nxmferry.com\nxmfev.com\nxmfish.com\nxmfls.net\nxmfunny.com\nxmgd.com\nxmgltwzhs.com\nxmgod.site\nxmgouemc.com\nxmgps.com\nxmgsd.com\nxmgslx.com\nxmguoyi.com\nxmgwbn.com\nxmhaicangmarathon.com\nxmheigu.com\nxmheitu.com\nxmhitek.com\nxmhlcs.org\nxmhljx.net\nxmhouse.com\nxmht.com\nxmhx.com\nxmigc.com\nxminfoport.com\nxming.ai\nxminnov.com\nxminzu.com\nxmisp.com\nxmitic.com\nxmj1688.com\nxmjchyxh.com\nxmjgjy.com\nxmjiaruan.com\nxmjim.com\nxmjj3d.com\nxmjled.com\nxmjsci.com\nxmjslh.com\nxmjyw.com\nxmjzykj.com\nxmkanshu.com\nxml-journal.net\nxmldz4.com\nxmlhifi.com\nxmlulub.com\nxmlvbarcode.com\nxmmade.com\nxmmama.com\nxmmeiyou.com\nxmmnrj.com\nxmmtu.com\nxmmuye.com\nxmnjdwx.com\nxmnovel.com\nxmocloud01.com\nxmonecode.com\nxmos.tv\nxmov.ai\nxmpaoyou.com\nxmparking.net\nxmpbjl.com\nxmpcba.com\nxmqianzun.com\nxmqxy.com\nxmr-zh.com\nxmrb.com\nxmrbi.com\nxmrdtx.com\nxmruanci.com\nxmruiyou.com\nxmseaview.com\nxmseeyouyima.com\nxmsgame.com\nxmsixian.com\nxmsiyb.com\nxmsj.org\nxmsme.com\nxmsmjk.com\nxmsoft.com\nxmsouhu.com\nxmsoushu.com\nxmspace.net\nxmssie.com\nxmsssyy.com\nxmsumi.com\nxmsuperlite.com\nxmswim.com\nxmtbang.com\nxmtyy.net\nxmuli.tech\nxmvod.org\nxmwan.com\nxmwes.com\nxmwsrc.com\nxmx023.com\nxmxc.com\nxmxdev.com\nxmxfxh.com\nxmxgame.com\nxmxmc.com\nxmxsapp.com\nxmxwl.net\nxmxwz.com\nxmyeditor.com\nxmylhy.com\nxmyouma.com\nxmyzm.com\nxmzangao.com\nxmzdls.com\nxmzgxcl.com\nxmzhdz.com\nxmzhkt.com\nxmzibi.com\nxmzjjl.com\nxmzjtjckmy.com\nxmzmmr.com\nxmzmy.com\nxmzs.org\nxmzsyg.site\nxmzyark.com\nxmzzy.net\nxn--0lqwsu2w.com\nxn--1bs9ye16ez8b.com\nxn--1ctq05bvu1a.com\nxn--1d3a16a.com\nxn--1lqq7i4w0acli.com\nxn--2cyr99a.com\nxn--2quu5hi8e69p.com\nxn--2vra6db.com\nxn--2vxsp6vi4j.com\nxn--3bs35yfl6bn8a.ink\nxn--3bs70igqdr64f.com\nxn--3bs781ecijtrt.com\nxn--3bsp13hurlcwb.com\nxn--3bsx54la62v.com\nxn--3bsz0pskmp89skv3a0zd724b1py.net\nxn--48s50dpwnbh95ah07i.com\nxn--4gq0d69oba129b9wd94ey8bs83ji3c3q7hoka.org\nxn--4gq1d760bszbgdv5p12rhq5bx2yc.net\nxn--4lwr21d.com\nxn--4qwqc04pn0lg9h.com\nxn--4xup5j.com\nxn--54q249denfzw9a.net\nxn--54q40czz0g7xp.com\nxn--55qw7biqf7g3d004h8yuw1ctrt04sep1cjfb.com\nxn--55qx2ag79c1iq.com\nxn--55qzsxj5y4ozkz93dswptmau4jc88dg75ctid8raf29c.com\nxn--5brz4b846h.com\nxn--5kv317c.com\nxn--5kv91jiz2b.com\nxn--6fr61zj8c92fg34d.com\nxn--6kr66fp2ep1ac5edz2hy7s2wq.com\nxn--6krw3qs7jl59b.com\nxn--6oq83hzb922dnorwsomx9dzkb.com\nxn--6qqp94buie2ss.com\nxn--6rtq6phwfhva.com\nxn--6xv710dola.net\nxn--730-l44eu9iitvv9h.com\nxn--7mqy6dj0brts55e.com\nxn--7qvz7xssa.com\nxn--88-9s0f59z.com\nxn--8lqrjra071bi0qgga421cs99a4qeqwm.com\nxn--8ou124e6ek.net\nxn--8owq8u.com\nxn--8stx8olrwkucjq3b.com\nxn--91-y60d638c.xyz\nxn--9kr72kqwe.com\nxn--9krv3x413bbyb.com\nxn--9myo55bi8l.com\nxn--9pr56vfna007k.com\nxn--9pry86bq5ex68c.org\nxn--b0t462i.com\nxn--b0tn0sxy3ayhj.com\nxn--b0tp7p3met2a.com\nxn--b0tp7p3met2a.net\nxn--b8qi619ujyk.com\nxn--btvs3aw8fhtbms310k.com\nxn--btvu9x9qgt8c.com\nxn--bxyy83e.net\nxn--cesw6hd3s99f.com\nxn--cesx3oukw29l.com\nxn--chq7lp8e46htw3g.com\nxn--chq84itwgrb674blm6f.com\nxn--chq978ctsf6v6c.com\nxn--cjztj18l.com\nxn--cpqr0dg9g4t0fodaq5c.com\nxn--cssw8z54rj2ds2q.com\nxn--czr93rxry.com\nxn--czru2dx3eszw3lat53b.com\nxn--dev407h.com\nxn--djr48g6sik7q.com\nxn--djr58xb1mzxk3mtrhfc8g.com\nxn--dkr447bejn.com\nxn--dkr447bejn.net\nxn--dll-8n0e103bz5hg93c.site\nxn--dlq10g6xfkw4a201b.com\nxn--dlqu6kw2e2n3aolseyrfhn.com\nxn--dlqw10borzgxh.com\nxn--dtq23gl66e.com\nxn--eh1a34ykpl.com\nxn--fcs316auqlyoe.com\nxn--fhq79jyym9nh74hfm8a.com\nxn--fiq03fftg7m2c.com\nxn--fiq06jqoz14s.com\nxn--fiq446amrnx0i.com\nxn--fiq4mgq69drxaiym2g5wnynb77huij0bchq7vj5ay61o3cwdq2ah92mlg9c.com\nxn--fiq60luzcp97a7oxivr99k.org\nxn--fiq6q20pz51d.com\nxn--fiq73f39fwr0b4wk.net\nxn--fiq7v55hnsepqz.net\nxn--fiqr9gg1vdha.com\nxn--fiqrtn9duw9e.cc\nxn--fiqs8sr9ge7eb4b28vo92a.com\nxn--fiqu59c0hf2sy.net\nxn--fiqv94di0c54ipe.net\nxn--fiqw8jl3h7xc25m753d.link\nxn--fiqx7ci2whnj.com\nxn--fjq5py34j65v.com\nxn--flw351e.com\nxn--glr604k.com\nxn--gmqr9gdtrhuf56g.com\nxn--h0tn34c.cc\nxn--husx9zj2eepau0se83d.com\nxn--hutn94av9amzg.net\nxn--i6q33br88fkud.com\nxn--igry70bi8kqt9a.org\nxn--igt225itqf.com\nxn--it-if7c19g5s4bps5c.com\nxn--jh1a128b.com\nxn--jor0b302fdhgwnccw8g.com\nxn--jpr47zq87axwjc0d.com\nxn--jxuv1s.net\nxn--kivq8be3whsi.com\nxn--l9qya49g86gm9ghpbzy1dwl0fppo.com\nxn--lt0at3k.com\nxn--mct72chgrm.net\nxn--mes380bwhsoec.com\nxn--mmz.cc\nxn--mnqs00c24c2pw0ii.com\nxn--mts196b.net\nxn--n5q75cia631gba51vx4ag2a008o08l1t0adzay2skp4b.com\nxn--n6qy1xeobw60f.net\nxn--ncym25ahib.net\nxn--nmqp78hmufjwu.com\nxn--ntso8dsz1borbzvfm5h.com\nxn--ntsp37j.net\nxn--nyqx2gbsm8u0b.com\nxn--ohqn1dw64cf45c8l9a1ba.com\nxn--omrvgz6er31au6f.com\nxn--oorz70c56jtwb49x.net\nxn--p5t28ylet56a.com\nxn--pss89e6xl72g.com\nxn--ptua509t.com\nxn--q20av2y36ac54a.com\nxn--qruq25bjsj.net\nxn--qzwx3ij21azka.com\nxn--r8s65df7admf92a.com\nxn--rhq112dhez17bejdyhl55dypc.com\nxn--rhqr3ykwbm05aegjqxb.com\nxn--rhqt5j7qj6mj.com\nxn--rht439a44bdyk.com\nxn--riqi041otpd.com\nxn--ror-j59d107t.net\nxn--rpv331d.com\nxn--rss237b.com\nxn--rss404ac6aj60e.net\nxn--rsss0ke5ghnj.com\nxn--ruqs20ac8b5z7av8ir2u.net\nxn--ruqz9zcojm5sf19a.com\nxn--s4t325g.com\nxn--sgt856gbjl.cc\nxn--siq0gv77a3c.com\nxn--sosw2ge0bs10aoq0a.com\nxn--sss604efuw.com\nxn--swts8irvtrtr.com\nxn--tesiro-n17nh93r.net\nxn--tfr181fg2az43a.com\nxn--tkr55q2oa097dyxe209c.com\nxn--tlq092au7hsi3a.com\nxn--tlqz3aj77agil76ww4ni2k.com\nxn--tqq89g2tjj5x8xs.com\nxn--vcso1ukuz.net\nxn--vcsu51b3zccpm.com\nxn--vcsu9p66gy1l9vpnnbk52f.com\nxn--vhq3m33sbqhpsmtnuxfq.com\nxn--vhq3mr8b802a.net\nxn--vhq4ut2dsxd5xqnicjxxo55a756aovhik0aunm.com\nxn--vhq72yfwbt0elp2cpkhtld55g73l1o6a.com\nxn--vhqqbz2p62hm92e04p.com\nxn--vhqr42drhf5k7b.com\nxn--vhqu1kbz3bnbi.com\nxn--viq463a.com\nxn--vq3a5gj6c9i.com\nxn--w9q313dfn4a.com\nxn--w9qr0k.com\nxn--w9qy23cc6adz7d.net\nxn--wbsz85a2a.com\nxn--wtqs2doz3b.com\nxn--wxtr44c.live\nxn--xcry9n251cvcar5xj6r.com\nxn--xhq60k09cr85at2f494d.com\nxn--xhq60kzbz07dem6azlu.com\nxn--xhq8sm16c5ls.com\nxn--xhqq4f5vc69qlmk6mva633mwoeiuad9562e.com\nxn--xhqs8jmxkive1yest6g.com\nxn--xhqs8jp0kpz2d.net\nxn--xhqx10kr8o.com\nxn--xkr190gv5p.com\nxn--xkr26fp82clgt.com\nxn--xkr999cp4fv97a.com\nxn--xkrs9ba41r.com\nxn--y6q834d2k3al4h.com\nxn--y8jhmm6gn.moe\nxn--ygtp21bwyedsq.com\nxn--yhqq38bmov17mqxi.com\nxn--ykr169cm1pskt.com\nxn--z4q559dueav8q.com\nxn--z63a11k.com\nxn-ck.com\nxn0.cc\nxn121.com\nxna8.com\nxnara.org\nxnb.me\nxncjdx.com\nxndm.tech\nxndqfw.com\nxndxfz.com\nxndyyljt.com\nxnfyy.com\nxngjbus.com\nxnh123.com\nxnh98d9c32om.com\nxnhdgame.com\nxninja.org\nxnjcw.com\nxnjdcbs.com\nxnjxnz.com\nxnnpc.com\nxnongren.com\nxnparking.com\nxnpfs.com\nxnpic.com\nxns315.com\nxnsbdzb.com\nxnsdermyy.com\nxnsntr.com\nxnssy.com\nxnszlszgs.com\nxntg.com\nxntt.com\nxntv.tv\nxnw.com\nxnw19.vip\nxnwan.com\nxnwatch.com\nxnwbw.com\nxnwmw.com\nxnxy120.com\nxny365.com\nxnyauto.com\nxnye.net\nxnytjt.com\nxnzjxx.com\nxnzn.net\nxnzxyy.com\nxnzyyy.com\nxo58tjrol4.work\nxoao.com\nxogekfb.com\nxoliao.com\nxooooa.com\nxopenbeta.com\nxoqeyeti.com\nxorlink.com\nxorpay.com\nxoso13.com\nxoso57.com\nxoso64.com\nxoso94.com\nxoso96.com\nxoss.co\nxoudou.com\nxox717.com\nxox848.com\nxoxv.net\nxoxxoo.com\nxoyo.com\nxoyobox.com\nxoyocdn.com\nxoyq.net\nxp535.com\nxp6000.com\nxp61.com\nxp811.com\nxp9365.com\nxp94.com\nxpaper.com\nxpaper.net\nxpccdn.com\nxpcdz.com\nxpcha.com\nxpchina.net\nxpdf.net\nxpeae.com\nxpeng.link\nxpf.cc\nxpgod.com\nxpgps.cc\nxphcn.com\nxpj0066.com\nxpj8857.com\nxpkjpk.com\nxpkongqipao.com\nxplaymobile.com\nxppgsx.com\nxppjzs.com\nxpsheying.com\nxpsup.com\nxpsy.net\nxpsy3q9e5kr4.com\nxptt.com\nxpu93.com\nxpw888.com\nxpwin7.com\nxpykjsws.com\nxpyouxi.com\nxpyx.net\nxpzsgc.com\nxq0356.com\nxq0757.com\nxq2024.com\nxq5.com\nxq668.com\nxqb24.com\nxqbase.com\nxqblog.com\nxqbssj.com\nxqce.com\nxqckg.com\nxqdgroup.com\nxqdjkwz.com\nxqebp.org\nxqfunds.com\nxqgmx.com\nxqhuyu.com\nxqhzw.org\nxqipu.com\nxqishuta.com\nxqiushu.com\nxqjmzc.com\nxqjs.net\nxqllaser.com\nxqltzp.com\nxqmdc.com\nxqmice.com\nxqnmz.com\nxqpharma.com\nxqppt.com\nxqsbw.com\nxqshe.com\nxqship.com\nxqtzigc.com\nxqu5.com\nxqvxifvk.com\nxqyake.com\nxqyk024.com\nxqymuy.com\nxqypay.com\nxr100.net\nxray.cool\nxrbulk.com\nxrcch.com\nxrccp.com\nxrdyl.com\nxrdzidonghua.com\nxredu.com\nxrender.com\nxresgrbw.com\nxrhhg.com\nxrichengapp.com\nxrjjk.com\nxrkapp.com\nxrkcdn.com\nxrkmonitor.com\nxrlmold.com\nxrpyq.com\nxrqh.com\nxrqorv.com\nxrso.com\nxrunda.com\nxrvm.com\nxrwf66.com\nxrxr.xyz\nxrxukegi.com\nxrxx365.com\nxrzdsp.com\nxrzhg.com\nxrzww.com\nxs-ir.com\nxs-servers.com\nxs058.com\nxs3cnc.com\nxs52.com\nxs63.info\nxs7.cc\nxs7.com\nxs7.la\nxs920.com\nxs9999.com\nxsa239.com\nxsappxz.com\nxsb120.com\nxsbja.com\nxsbus.com\nxscbs.com\nxschu.com\nxschuban.com\nxscp03150xq.com\nxscxzcz.com\nxsdma.com\nxsdmr.com\nxsdnjl.com\nxsdoudou.com\nxsdwk.com\nxsee.cc\nxsesc.com\nxsfaya.com\nxsfc.com\nxsgame.net\nxsgame99.com\nxsgongju.com\nxsgtvacct.com\nxshengyan.com\nxshenshu.com\nxshhotels.com\nxshkvip.com\nxshmzz.com\nxshntc.com\nxshouyou.com\nxshr.com\nxshrcw.com\nxshts.com\nxshuai.com\nxshubao.org\nxshuma.com\nxshuoba.com\nxshuoshuo.com\nxsignal-ft.com\nxsina.net\nxsinger.me\nxsj21.com\nxsjedu.org\nxsjgzbdf.com\nxsjit.com\nxsjk.net\nxsjny.com\nxsjom.com\nxsjplm.com\nxsjrc.com\nxsjs-cifs.com\nxsjtxt.com\nxsjwyx.com\nxsjxyedu.com\nxsjzsy.com\nxskb.org\nxskhome.com\nxskjw.com\nxslb.me\nxslb.net\nxslmed.net\nxsm818.com\nxsmaofa.com\nxsmart.com\nxsmart.link\nxsmoe.com\nxsn168.com\nxsnow.net\nxsnsyh.com\nxsool.com\nxsp0311.com\nxsphs.com\nxspinfo.com\nxspio.com\nxsqzyyy.com\nxsrm.com\nxsrtvu.com\nxss.tv\nxssc8888.com\nxssdcdn.com\nxsser.date\nxsshuku.com\nxsskc.com\nxsslyjt.com\nxssz.net\nxsteach.com\nxsti.net\nxstnet.com\nxstqj.com\nxsttop.com\nxstv.net\nxstx.info\nxstzgs.com\nxsui.com\nxsuweb.com\nxswang.com\nxswdcasting.com\nxsxgjsw.com\nxsxlt.com\nxsxzls.com\nxsy-edu.com\nxsy.science\nxsycps.com\nxsyeli.com\nxsyk021.com\nxsyq.cc\nxsyqmztg.com\nxsyx.xyz\nxsyxsc.com\nxsyydtfy.com\nxsyzdl.com\nxszhuan.com\nxszrcw.com\nxszsw.com\nxszww2.com\nxszww8.net\nxt-gas.com\nxt-kp.com\nxt-luyou.com\nxt-rent.com\nxt-shipping.com\nxt12333.com\nxt3yy.com\nxt700.com\nxt7p.com\nxtadmins.com\nxtaike.com\nxtal.cc\nxtao.me\nxtbank.com\nxtc-edu.com\nxtcaq.com\nxtcfjt.com\nxtcrm.com\nxtdj.cc\nxtedu.com\nxtep.com\nxthinking.net\nxthtc.com\nxthyjt.com\nxtiai.com\nxtianlang.com\nxtibet.com\nxtingcloud.com\nxtion.net\nxtjc.com\nxtjcxh.org\nxtjky.com\nxtjlyy.com\nxtjob.net\nxtjsxy.net\nxtjtjs.com\nxtlexueu.com\nxtlog.com\nxtmit.com\nxtmtrj.com\nxtomp.com\nxtong-solar.com\nxtongs.com\nxtoobmo.xyz\nxtqarzip.com\nxtransfer.com\nxtrapowercn.com\nxtratime.qcomgeo2.com\nxtrc.net\nxtrunc.com\nxtsfuke.com\nxttblog.com\nxttz.com\nxtu2.com\nxtuan.com\nxtuos.com\nxtutoring.com\nxtw-system.com\nxtwzyx.com\nxtx6.com\nxtxcm.com\nxtxh.net\nxtxnxk.sbs\nxtylxx.com\nxtyyw.com\nxtzdc.com\nxtzhiliji.com\nxtzjup.com\nxtzpw.com\nxtzy.com\nxu1s.com\nxu42x.net\nxu8.fun\nxu97.vip\nxuanba.com\nxuancaizi.com\nxuanceo.com\nxuancheng.org\nxuanchuanyi.com\nxuandan.com\nxuandecarpet.com\nxuanfengge.com\nxuanhaikuwan.com\nxuanhao.com\nxuanhuange.com\nxuanhuange.net\nxuanjigame.com\nxuanjingcn.com\nxuanjutong.com\nxuanke.com\nxuankuge.com\nxuanliw.com\nxuanma.com\nxuannaer.com\nxuanqii.com\nxuanquge.com\nxuanqun.com\nxuanruanjian.com\nxuanshi.link\nxuanshitou.com\nxuanshu.com\nxuanshu.org\nxuansiwei.com\nxuantaikeji.com\nxuanteng.org\nxuanwifi.com\nxuanwonainiu.com\nxuanwu88.com\nxuanwumobile.com\nxuanwww.com\nxuanxiaodi.com\nxuanxiaozhuanjia.com\nxuanxuan.com\nxuanxuangame.com\nxuanxue.com\nxuanxuewang.com\nxuanyang888.com\nxuanyaodang.com\nxuanyaodang.net\nxuanyge.info\nxuanyouwang.com\nxuanyuan.cloud\nxuanyuan.run\nxuanyuancode.com\nxuanyuanhuangdi.org\nxuanyuans.com\nxuanyuanzjy.com\nxuanyusong.com\nxuanyutech.com\nxuanzhi.com\nxuanzhuanmumatuwen.com\nxuavieres.com\nxubei.com\nxuchencq.com\nxuchuang.com\nxucongbaobao.com\nxudan123.com\nxudankeji.com\nxudong8.com\nxudongfood.com\nxudoodoo.com\nxue.net\nxue114.com\nxue126.com\nxue138.com\nxue163.net\nxue51.com\nxue63.com\nxue8nav.com\nxue99.com\nxueanquan.com\nxueba100.com\nxuebaclass.com\nxuebaike.net\nxuebangsoft.com\nxuebapan.com\nxuebawang.net\nxuecaijie.com\nxuecan.net\nxueche.com\nxueche.net\nxuechebu.com\nxuechela.com\nxuechu123.com\nxuecoo.com\nxueda.com\nxuedao.com\nxuedapei.com\nxuedi.com\nxuedingmiao.com\nxuedong97.com\nxuedou.com\nxueepay.com\nxueersi.com\nxueersibook.com\nxueerxing.com\nxueeu.com\nxuefa.com\nxuefeiji.org\nxuefenxi.com\nxuefo.com\nxuefo.net\nxuefoxue.com\nxuegaogame.com\nxuegaogg.com\nxuegeshui.com\nxuegongkong.com\nxuegui.net\nxueguoedu.net\nxuehai.net\nxuehaiwu.com\nxuehuacdn.com\nxuehui.com\nxuehuile.com\nxuehuiwang.com\nxueid.com\nxueit.com\nxuejia123.com\nxuejian.site\nxuejiaoso.com\nxuejiqiao.com\nxuekanba.com\nxuekao.com\nxuekao123.com\nxuekeedu.com\nxuekewang.com\nxuekuaiji.com\nxuekubao.com\nxuekuibang.shop\nxuelangapp.com\nxuele.net\nxueleku.com\nxuelema.com\nxueleyun.com\nxueli9.com\nxueliedu.com\nxuemh.com\nxueming.li\nxuenarui.com\nxuenb.com\nxuepaijie.com\nxuepaipai.com\nxuepingx.com\nxuepojie.com\nxueqian.com\nxueqinji.com\nxueqiu.com\nxueqiu360.com\nxuerong.com\nxuesai.net\nxuesax.com\nxuesexs.com\nxueshanlinghu.com\nxuesheng.com\nxueshiyun.com\nxueshu.com\nxueshu5.com\nxueshuda.com\nxueshujia.com\nxueshut.com\nxueshuwenhai.com\nxuesidaojiajiao.com\nxuesongshuwood.com\nxuesw.com\nxuetangonline.com\nxuetangx.com\nxuetengedu.com\nxuetianli.com\nxuetimes.com\nxueto.com\nxuetongw.com\nxuetu.net\nxueui.com\nxuewangshang.com\nxuewangzhan.com\nxuewangzhan.net\nxuewei360.com\nxueweigui.com\nxueweijiema.com\nxuewennet.com\nxuewenya.com\nxuexb.com\nxuexi.la\nxuexi199.com\nxuexi365.com\nxuexi365.net\nxuexi612.com\nxuexi613.com\nxuexi616.com\nxuexi637.com\nxuexi665.com\nxuexi682.com\nxuexi683.com\nxuexi684.com\nxuexi707.com\nxuexi719.com\nxuexi721.com\nxuexi725.com\nxuexi727.com\nxuexi733.com\nxuexi734.com\nxuexi782.com\nxuexi784.com\nxuexi786.com\nxuexi806.com\nxuexi807.com\nxuexi823.com\nxuexi824.com\nxuexi825.com\nxuexi826.com\nxuexi827.com\nxuexi828.com\nxuexi829.com\nxuexi848.com\nxuexi851.com\nxuexi859.com\nxuexi860.com\nxuexi861.com\nxuexi863.com\nxuexi864.com\nxuexiaodaquan.com\nxuexiaozhaopin.com\nxuexibao.com\nxuexicha.com\nxuexicn.com\nxuexigang.com\nxuexili.com\nxuexin365.com\nxuexinjiaoshi.com\nxuexito.com\nxuexitong.com\nxuexiuwang.com\nxuexiwa.com\nxuexizhiwang.com\nxuexizoo.com\nxuexun.com\nxueyanshe.com\nxueyiyun.com\nxueyou.org\nxueyuanjun.com\nxueyuhuangjinyan.com\nxuezeshi.com\nxuezhangbb.com\nxuezhangya.com\nxuezhao.space\nxuezhishi88.com\nxuezhiyou.com\nxuezhouyi.com\nxuezizhai.com\nxuezozx.com\nxufa315.com\nxugaoyang.com\nxugt.com\nxuguang.net\nxuguangwangluo.com\nxuhe56.com\nxuheen.com\nxuhenghandicraft.com\nxuhongjx.com\nxuhuihs.com\nxujc.com\nxuji.co\nxujianhua.com\nxujiepack.com\nxujingkj.com\nxujinhuancaishui.com\nxujun.org\nxuka.com\nxulaoshi68.com\nxuld.net\nxulihang.me\nxuliutian.com\nxumenger.com\nxumengwang.com\nxumingxiang.com\nxumucloud.com\nxumurc.com\nxumuren.com\nxumuzx.com\nxun-gou.com\nxun321.com\nxunbang.com\nxunbao178.com\nxunbaozhifu.com\nxunbf.com\nxunbin.com\nxunbo.net\nxunchabing.com\nxunchanggroup.com\nxundasemi.com\nxundayun.com\nxundekai.com\nxundiesoft.com\nxundns.com\nxundns.net\nxundupdf.com\nxunerjie.com\nxunfang.com\nxunfeia.com\nxunfeib.com\nxunfeivr.com\nxunfeiwl.com\nxunfeixxj.com\nxungejiang.com\nxungou.com\nxungou5.com\nxunguagua.com\nxunguanggame.com\nxunhuai.com\nxunhuanshuibeng.com\nxunhupay.com\nxunhuweb.com\nxunicard.com\nxunihao.net\nxuniquan.com\nxunjiecad.com\nxunjiefanyi.com\nxunjiepdf.com\nxunjieshipin.com\nxunjietupian.com\nxunjk.com\nxunkids.com\nxunlanchina.com\nxunlei.com\nxunlei.net\nxunleioa.com\nxunlew.com\nxunliandata.com\nxunlianip.com\nxunlong.net\nxunlong.tv\nxunlongsoft.com\nxunlu-led.com\nxunlugame.com\nxunmai888.com\nxunmall.net\nxunmei.net\nxunmeinet.com\nxunmengtu.com\nxunpaibao.com\nxunqinji.net\nxunrenzhaoren.com\nxunruicms.com\nxunruns.com\nxunsearch.com\nxunshi.cc\nxunsho.com\nxunshou.com\nxunsl.com\nxunsn.com\nxunsns.com\nxunta.mobi\nxuntongwuxian.com\nxuntou.com\nxuntou.mobi\nxuntuoguan.com\nxunurl.com\nxunvision.com\nxunw.shop\nxunwan.com\nxunwangba.com\nxunwei.tm\nxunweihc.com\nxunxi.com\nxunxiang.site\nxunxu.com\nxunyangzaixian.com\nxunye1975.com\nxunyou.com\nxunyou.mobi\nxunyouyw.com\nxunyuan1314.com\nxunyun.com\nxunzai.com\nxunzhuang.net\nxuooo.com\nxupai.com\nxupea.com\nxupernode.com\nxupertves.com\nxuprinter.com\nxupu.name\nxupu120.com\nxupupifu.com\nxuqijt.com\nxuqyfw.com\nxuruowei.com\nxushunda.com\nxusplastic.com\nxussb.com\nxusss.com\nxuvol.com\nxuweidj.com\nxuwenliang.com\nxuxian.com\nxuxian.me\nxuxiang.com\nxuxueli.com\nxuxusheng.com\nxuyalipin.com\nxuyangny.com\nxuyanmaoyi.com\nxuyechem.com\nxuyi.net\nxuyongrongmei.com\nxuyu56.com\nxuyueswkj.com\nxuyunjt.com\nxuzai.com\nxuzhi.net\nxuzhoufabu.com\nxuzhoujob.com\nxuzhouma.com\nxuzhoumuseum.com\nxuzhounano.com\nxuzhousports.com\nxuzhouwater.com\nxuzpazms.com\nxv5.com\nxvacuum.com\nxvcdmo.com\nxvista.com\nxvizubkg.com\nxvjhzuc.com\nxvnez.org\nxvuikerk.com\nxvwprdk.com\nxw-chip.com\nxw-planning.com\nxw-scm.com\nxw1806.com\nxw360.com\nxw365.com\nxw501.com\nxwabx.com\nxwadv.com\nxwamp.com\nxwan.com\nxwb8.com\nxwbank.com\nxwcbgg.com\nxwcx6.com\nxwcx666.com\nxwcxgroup.com\nxweb.vip\nxwei.tv\nxwfintech.com\nxwfls.com\nxwfruits.com\nxwg.cc\nxwgl.cc\nxwhb.com\nxwhodesign.com\nxwhosp.org\nxwinvip.com\nxwjqr.com\nxwjr.com\nxwjy.org\nxwkjcms.com\nxwlcdfactory.com\nxwlxw.com\nxwmyw.com\nxwog.com\nxwood.net\nxwpbj.com\nxwpx.com\nxwscg.com\nxwshensuofeng.com\nxwtcmh.com\nxwtele.com\nxwuorvhz.com\nxwx.mobi\nxwxguan.com\nxwxwh.com\nxwy-powder.com\nxwylhh.com\nxwyun.net\nxwzc.net\nxwzxldfx.com\nxx-industrial.com\nxx-motor.com\nxx-sapce.com\nxx007.com\nxx186.com\nxx4a.com\nxx5515.com\nxx7z.co\nxx8g.com\nxxahsk.com\nxxart.net\nxxbiquge.com\nxxbmm.com\nxxbt.com\nxxcang.com\nxxccx.com\nxxcig.com\nxxcipharm.com\nxxcmw.com\nxxdao.com\nxxedu123.com\nxxfbiaa.xyz\nxxfqc.com\nxxgd888.com\nxxghh.biz\nxxgzz.com\nxxhd-tech.com\nxxhnanke.com\nxxinficity.com\nxxingclub.com\nxxir.com\nxxjdns.com\nxxjqgs.com\nxxjrjxc.com\nxxjzg.com\nxxka.com\nxxkapp.com\nxxkucun.com\nxxkxjx.net\nxxkxw.net\nxxlcn.com\nxxlifexx.com\nxxliudsp.com\nxxlsmqzs.com\nxxlwin.com\nxxmac.com\nxxmyf.com\nxxnet.vip\nxxnets.net\nxxnmjx.com\nxxoojoke.com\nxxorg.com\nxxparking.com\nxxpay.vip\nxxpie.com\nxxpkg.com\nxxptcs.com\nxxpysc.com\nxxqb5200.net\nxxqipai.com\nxxqun.com\nxxqzjt.com\nxxrjm.com\nxxrmyy.net\nxxrsm.com\nxxrxfilter.com\nxxs8.com\nxxsb.com\nxxsfjx.com\nxxshell.com\nxxshu.com\nxxspd.com\nxxsrmyy.com\nxxsy.com\nxxsy.net\nxxsypro.com\nxxszxw.net\nxxt139.com\nxxtaotao.com\nxxtiao.com\nxxtjdz.com\nxxtlw.com\nxxtmail.com\nxxw001.com\nxxwmy.com\nxxwolo.com\nxxwxf.com\nxxx1577.com\nxxxbiquge.com\nxxxcsf.com\nxxxedu.net\nxxxhhh.com\nxxxx88xxxx.com\nxxxx92xxxx.com\nxxxx96xxxx.com\nxxxxxx6.com\nxxxzzlm.org\nxxycw.com\nxxyeyan.com\nxxyfgy.com\nxxyhzd.com\nxxykgl.com\nxxymdy.com\nxxymw.com\nxxyo.com\nxxys2023.com\nxxyw.com\nxxyx.ltd\nxxyy.co\nxxyzh.net\nxxzfgjj.com\nxxzhushou.com\nxxzmz.com\nxxzrs.xyz\nxxzsgame.com\nxy-365.com\nxy-asia.com\nxy-ddh.com\nxy-dgyx.com\nxy-display.com\nxy-invite.com\nxy-mp.com\nxy-technology.com\nxy007.net\nxy120.net\nxy1212.com\nxy1758.com\nxy178.com\nxy3000.com\nxy36z.com\nxy3yy.com\nxy58.net\nxy599.com\nxy980.net\nxyb2b.com\nxybch123.com\nxybhdy.com\nxybj365.com\nxybsyw.com\nxybtv.com\nxybygc.com\nxybygw.com\nxycad.com\nxycaogen.com\nxycareer.com\nxycclass.com\nxycdn.net\nxycgd.com\nxychyy.com\nxycloud.com\nxyclouds.com\nxycms.com\nxycsq.com\nxyctgroup.com\nxycwei.com\nxycyky.com\nxyda.cc\nxydcname.com\nxydcname.net\nxydhl.com\nxydpay.com\nxydxcloud.com\nxydyfy.com\nxydz08.com\nxyebbs.com\nxyeidc.com\nxyeyy.com\nxyf6.com\nxyfc.com\nxyfcw.com\nxyffsb.com\nxyffvip.com\nxyfinechem.com\nxyfish.com\nxyfsy.com\nxyg100.com\nxygdcm.com\nxygmed.com\nxygre.com\nxygsjt.com\nxygt666.com\nxygtea.com\nxygulou.com\nxygwh.cc\nxyh2021.com\nxyhc.com\nxyhis.com\nxyhjd168.com\nxyhlcd.com\nxyhospital.com\nxyhqsh.com\nxyhtml5.com\nxyhygs.com\nxyict.com\nxyj.link\nxyj321.com\nxyj618.com\nxyjbglass.com\nxyjj99.com\nxyjs999.com\nxyjtzz.com\nxyjuyuan.com\nxyjy.net\nxyjyjt.com\nxyjyy.net\nxykgjt.net\nxykmovie.com\nxyktjt.com\nxyl2002.com\nxylh888.com\nxylhwdu.com\nxylink.com\nxylive.tv\nxylll.com\nxylmf.com\nxylofh.com\nxymfqb.com\nxymj.xyz\nxymlcs.com\nxynbnb.com\nxynetweb.com\nxyngas.com\nxyniubi.com\nxynsh.com\nxyookj.com\nxyous.com\nxypifu.com\nxyppzx.com\nxypse.com\nxyqb.com\nxyqczy.com\nxyqmall.com\nxyqy88.com\nxyrbszb.com\nxyre.com\nxyriaf.work\nxyrsks.com\nxyrtv.com\nxysb.com\nxysdyrmyygw.com\nxyshoppingbag.com\nxyshu8.com\nxyshuk.com\nxysjg.com\nxysmart.com\nxysstgs.com\nxystatic.com\nxystoy.com\nxyswychgs.com\nxysy.com\nxysyzx.com\nxyszxyy.com\nxyt-tech.com\nxytcw.vip\nxytfy.com\nxytiyu.com\nxytjcpj.com\nxytsoft.com\nxytsw.com\nxytzg.com\nxytzjt.com\nxyuncloud.com\nxyunjiasu.com\nxyunqi.com\nxyusk.com\nxyvcard.com\nxyvcpe.com\nxyvend.com\nxyvending.com\nxyw-wifi.com\nxyw.com\nxywclass.com\nxywlhlh.com\nxywm.com\nxywy.com\nxywyfw.com\nxywzs.com\nxyx234.com\nxyx3d.com\nxyxcables.com\nxyxdie.com\nxyxrmt.com\nxyxsc.com\nxyxsns.com\nxyxsw.ltd\nxyxww.com\nxyxy.net\nxyxyzz.com\nxyxza.com\nxyy001.com\nxyyao.com\nxyyb.net\nxyybs.com\nxyydnode.com\nxyyh.xyz\nxyyksy.com\nxyykt.org\nxyyl.com\nxyyuan.fun\nxyyuedu.com\nxyyx82.com\nxyyy999.com\nxyyzi.com\nxyz-jm.com\nxyz1412.net\nxyzcdn.net\nxyzcn.com\nxyzdict.com\nxyzdns.xyz\nxyzele.com\nxyzfm.link\nxyzfm.space\nxyzggg.com\nxyzimo.com\nxyzkj.xyz\nxyzmdzs.com\nxyzmovie.net\nxyzop.com\nxyzs.com\nxyzshouji.com\nxyzspeaker.com\nxyzsq.com\nxyzttt.xyz\nxyzvo.com\nxyzywl.com\nxz-juming.com\nxz-soft.com\nxz.com\nxz325.com\nxz3733.com\nxz3z.com\nxz6.com\nxz6699.com\nxz66gxnnjyl.com\nxz6y.com\nxz7.com\nxz7899.com\nxz8.com\nxzairport.com\nxzaz.com\nxzb360.com\nxzbaorun.com\nxzbco.com\nxzbhfk.com\nxzbu.com\nxzbzq.com\nxzcblog.com\nxzcbxg.com\nxzccjt.com\nxzcdc.com\nxzcet.com\nxzcjyjt.com\nxzcoder.com\nxzcr.com\nxzcykg.com\nxzdabyw.xyz\nxzdag.com\nxzdfcd.com\nxzdfyy.com\nxzdtjt.com\nxzep.net\nxzepa.com\nxzfenghe.com\nxzfesco.com\nxzfhhz.com\nxzfile.com\nxzfwzl.com\nxzgdsf.com\nxzggjyzpw.com\nxzgj.com\nxzgjj.com\nxzgqm.com\nxzgtjt.com\nxzgxwq.com\nxzhh966888.com\nxzhhbfesco.com\nxzhichang.com\nxzhizao.com\nxzhlz.com\nxzhome.com\nxzhpck.com\nxzhyjsjt.com\nxzhzkd.com\nxzis.org\nxzjhgt.com\nxzjiufa.com\nxzjsxy.com\nxzjtkg.com\nxzjy.net\nxzkd.com\nxzking.com\nxzkssb.com\nxzksyy.com\nxzkwjtzyy.com\nxzkx.com\nxzldbl.com\nxzlgjt.com\nxzlogo.com\nxzlres.com\nxzlsqy.com\nxzltrq.com\nxzltzc.com\nxzlzf.com\nxzm56.com\nxzmai.com\nxzn56.com\nxznqcc.com\nxznqnews.com\nxzoo.org\nxzpf110.com\nxzpm.com\nxzpoll.com\nxzport.com\nxzpxrc.com\nxzqh.org\nxzqixing.com\nxzqrmyy.com\nxzqxj.com\nxzrbw.com\nxzrcfc.com\nxzrcyy.com\nxzrdwq.com\nxzriit.com\nxzsckj.com\nxzsdszx.com\nxzsdyyy.com\nxzsec.com\nxzsis.com\nxzskfyy.com\nxzsmartmetro.com\nxzsmlq.com\nxzsnw.com\nxzstatic.com\nxzsthj.com\nxzsw.net\nxzswjt.com\nxzszb.net\nxzszjt.com\nxztcm.com\nxztdesign.com\nxztsjf.com\nxztzb.com\nxzuan.com\nxzw.com\nxzw.pw\nxzwanda.com\nxzwhg.com\nxzwhlyjt.com\nxzwy.com\nxzwyxh.com\nxzx.com\nxzxjkyy.com\nxzxkjd.com\nxzxw.com\nxzxx.com\nxzxxlcp.com\nxzyhealth.com\nxzyjl.com\nxzynyy.com\nxzzh.com\nxzzhbsq.com\nxzzhongye.com\nxzzhtc.com\nxzzlyy.com\nxzzp.net\nxzztly.com\nxzzulin.com\ny-feng.com\ny-i-y.com\ny-lotus.com\ny-os.net\ny.to\ny007.com\ny1995.com\ny1v.com\ny2002.com\ny2374050fo.com\ny2531.com\ny3pm.com\ny4rwk6v8s41kr.com\ny5000.com\ny55l6.com\ny56.com\ny5663.com\ny5api.com\ny5coin.com\ny5kfpt.com\ny5news.com\ny5store.com\ny617.com\ny66b1pi5re.com\ny67.net\ny70qeg6506.com\ny77.cc\ny78r.com\ny80s.com\ny8cyx6fvyxk3hs.com\ny8kj95k62v.com\ny8l.com\ny92ft2vz.com\nya-bo888.com\nya-marathon.com\nya17.com\nya19si8.lol\nya247.com\nyab44.com\nyabais.com\nyabaite.com\nyabandpay.com\nyabang-qhpharm.com\nyabet03.com\nyabet08.com\nyabet888.com\nyabet99.com\nyabo.com\nyabo00.com\nyabo0000.com\nyabo016.com\nyabo023.com\nyabo063.com\nyabo072.com\nyabo077.com\nyabo083.com\nyabo085.com\nyabo098.com\nyabo159.com\nyabo170.com\nyabo189.com\nyabo199.com\nyabo2025.com\nyabo552.com\nyabo593.com\nyabo602.com\nyabo64.com\nyabo6600.com\nyabo691.com\nyabo70.com\nyabo75.com\nyabo7755.com\nyabolive.com\nyaboo-cn.com\nyaboshi0777.com\nyabyy.com\nyac8.com\nyace17.com\nyach.me\nyachtsinchina.com\nyacol.com\nyacou.net\nyacto-tech.com\nyadancoffee.org\nyadao8.com\nyadashi.com\nyadatong.net\nyadilite.com\nyadingtour.com\nyadongjf.com\nyadran.com\nyadugroup.com\nyadunyun.com\nyaduo.com\nyaeherhealth.com\nyaersen.com\nyaexun.com\nyaeyy.com\nyafangyiyuan.com\nyafco.com\nyafdev.com\nyafeilinux.com\nyafshb.com\nyago-mall.com\nyahacode.com\nyahaha.net\nyahaizi.com\nyahanmr.com\nyahboom.com\nyahong-mold.com\nyahoo001.com\nyahuayunshu.com\nyahuhost.com\nyahui.cc\nyahui.hk\nyahuishou.com\nyahunet.com\nyahxxcl.com\nyaimg.com\nyaitest.com\nyaiyuan.com\nyajxc.com\nyake123.com\nyake5.com\nyakgamer.com\nyakjhfh.com\nyakool.com\nyakup.info\nyalayi.com\nyalewoo.com\nyalianedu.com\nyaliaojie.com\nyalikongzhi.com\nyaling8.com\nyalishiyanji.com\nyalj.net\nyalongbay.net\nyalqq8976.com\nyamaijia.net\nyameisj.com\nyamibo.com\nyamoke.com\nyan-grh.com\nyan-jian.com\nyan678.com\nyanagou.net\nyananpharm.com\nyanbaike.com\nyanbaohui.com\nyanbaolong.com\nyanbeige.com\nyanbinghu.com\nyanbm.com\nyanbmn.com\nyanboyuan.com\nyance.wiki\nyanchebang.com\nyancheng-culture.com\nyanchengdj.com\nyanchengjtgz.com\nyanchengzx.com\nyanchupiao.com\nyanchupiaojia.com\nyanchupiaowu.com\nyandaco.com\nyandianying.com\nyanding.com\nyanduyiyuan.com\nyanedu.com\nyanfabu.com\nyanfen.online\nyanfeng.com\nyanfengauto.com\nyanfukun.com\nyang99.fun\nyangbentong.com\nyangbinlvshi.com\nyangchanji.com\nyangchenghudzx.com\nyangchenglianhe.com\nyangcheyongche.com\nyangchunjian.com\nyangcong.com\nyangcong345.com\nyangcongchufang.com\nyangdongjia.com\nyangfannie.com\nyanggang-group.com\nyanggeng.com\nyanggu.tv\nyangguangxinye.com\nyangguanjun.com\nyangguiweihuo.com\nyanghd.com\nyanghong.art\nyanghuaxing.com\nyangji.com\nyangjibao.com\nyangjie.li\nyangjigroup.com\nyangjinyou.com\nyangjisen.com\nyangk6668.com\nyangkeduo.com\nyangki.net\nyangkun.net\nyanglaocn.com\nyanglaofuwu365.com\nyanglaotiandi.com\nyanglee.com\nyangli.com\nyangliping.com\nyangliq.com\nyanglong.pro\nyangluojob.com\nyangmao.info\nyangmi.net\nyangmingauction.com\nyangner.com\nyangnongchem.com\nyangoo-global.com\nyangpanzg.com\nyangqi.show\nyangqianguan.com\nyangqimanhua.com\nyangqq.com\nyangqu.com\nyangsam.com\nyangsan.work\nyangsensheng.com\nyangshengliang.com\nyangshengtang123.com\nyangshengtv.com\nyangshijz.com\nyangshuolvyou.com\nyangsihan.com\nyangstandards.com\nyangtai.com\nyangtaiapp.com\nyangtao.site\nyangtaolujiu.com\nyangtengfei.com\nyangtianb.com\nyangtong.com\nyangtse-automobile.com\nyangtse.com\nyangwajia.com\nyangwang.pw\nyangwangauto.com\nyangwc.com\nyangwenlong.org\nyangwenqing.com\nyangxiang.com\nyangxiangdb.com\nyangxingzhen.com\nyangxinren.com\nyangyangad.com\nyangyangla.com\nyangyanxing.com\nyangyi.vip\nyangyi02.com\nyangyi08.com\nyangyi09.com\nyangyi13.com\nyangyi19.com\nyangyingming.com\nyangyivacuum.com\nyangyongquan.com\nyangyq.net\nyangzhe1991.org\nyangzhengfang.com\nyangzhi777.com\nyangzhihb.com\nyangzhiriji.com\nyangzhix.com\nyangzhongchao.com\nyangzhoutuozhan.com\nyangzhouyiyuan.com\nyangzhu360.com\nyangziclean.com\nyangzijiang.com\nyangziwater.com\nyangzw.vip\nyanhaijing.com\nyanhuamedia.net\nyanhuoidc.com\nyaniu.net\nyanjiao.com\nyanjiaoapp.com\nyanjiaoweixin.com\nyanjinews.com\nyanjingge.com\nyanjiubaogao.com\nyanjiuchubanshe.com\nyanjob.com\nyanjun7858.com\nyankay.com\nyanke360.com\nyankon.com\nyankong.com\nyanliang.com\nyanliaofang.work\nyanlong.shop\nyanmaiyingyu.com\nyannv.com\nyanoda.com\nyanpengjk.com\nyanpk.com\nyanqiao.com\nyanqingshan.com\nyanqueai.com\nyanrongyun.com\nyanshanmuyuan.com\nyanshanpump.com\nyanshaoutlets.com\nyanshihua.com\nyanshimei.com\nyanshishuo.com\nyanshuoshi.com\nyansx.com\nyanta.cc\nyantai-chuanpiao.com\nyantaibank.net\nyantaihr.com\nyantaijintai.com\nyantailuoshuan.com\nyantaiport.com\nyantaitech.com\nyantan.cc\nyantangmilk.com\nyantao.wiki\nyantaparking.com\nyantaqu.com\nyantian-port.com\nyantu360.net\nyantubao.com\nyantubbs.com\nyantuchina.com\nyantudq.com\nyanue.net\nyanweihappybirthday.com\nyanwugroup.com\nyanxian.org\nyanxianggroup.com\nyanxintong.com\nyanxishe.com\nyanxiu.com\nyanxizhu.com\nyanxurui.cc\nyanyapeng.com\nyanyib2b.com\nyanyidakaoyan.com\nyanyijingling.com\nyanyin.tech\nyanyiquan.com\nyanyiwu.com\nyanyizc.com\nyanyue.net\nyanyunmail.com\nyanzhaorc.com\nyanzhaowang.com\nyanzhihuisc.com\nyanzhiwu.com\nyanzhoulugang.com\nyao.com\nyao123.com\nyao51.com\nyaobo.net\nyaocai.com\nyaocaicang.com\nyaocaizhongzi.com\nyaocdn.com\nyaochengwang.com\nyaochentech.com\nyaochixie.com\nyaochufa.com\nyaocsoft.com\nyaodou.net\nyaodu365.com\nyaoex.com\nyaofangwang.com\nyaofangwang.net\nyaofei365.com\nyaoge123.com\nyaoguo.com\nyaohaixiao.com\nyaohuaglass.net\nyaohuascape.com\nyaohuiji.com\nyaohuo.me\nyaohuo168.com\nyaoji.center\nyaojibuyu.com\nyaojidsfee.com\nyaojiedianzi.com\nyaojigames.com\nyaojiuqq.com\nyaokaihui.com\nyaokantv.com\nyaokeke.com\nyaoky.com\nyaolaifen.com\nyaolan.com\nyaolandairy.com\nyaoliangmi.com\nyaoliwang.com\nyaolue.com\nyaolutong.com\nyaoluu.com\nyaomai666.com\nyaomaiche.com\nyaoman.net\nyaomv.com\nyaonano.com\nyaooxx.space\nyaopaiming.com\nyaopharma.com\nyaopinlenglian.com\nyaopinnet.com\nyaoq.net\nyaoqing.com\nyaoqun.net\nyaosai.com\nyaoshagroup.com\nyaoshanly.com\nyaoshimiaolianhua.com\nyaotia.com\nyaotiannano.com\nyaotongjn.com\nyaotou.com\nyaoudq.com\nyaoujc.com\nyaowan.com\nyaoxiaoyi.com\nyaoxuebang.com\nyaoxun.net\nyaoyaola.net\nyaoyedan.net\nyaoying.vip\nyaoyouke.com\nyaozh.com\nyaozhigong.com\nyaozhizhu.com\nyaozs.com\nyaozui.com\nyapingkeji.com\nyapingtech.com\nyapp.com\nyaqilian.com\nyaqjyj.com\nyaristyle.com\nyarncm.com\nyarward.com\nyasee-zs.com\nyashili.com\nyashowmarket.com\nyasishuo.com\nyasiyasi.com\nyasking.org\nyasn.com\nyasudachem.com\nyasuotu.com\nyasyy.com\nyatai.com\nyataidianli.com\nyataifr.com\nyataiinsur.com\nyatailx.com\nyataimall.com\nyataioa.com\nyataohome.com\nyatebizhi.com\nyaterv.com\nyatiku.com\nyatiwang.com\nyato-sh.com\nyatsenglobal.com\nyatsoft.com\nyatv.tv\nyatyjx.com\nyaucn.com\nyauuy.com\nyawancaiwu.com\nyawbbs.com\nyawei.cc\nyaweijituan.com\nyawen8.com\nyawy.cc\nyaxi.net\nyaxiaodong.com\nyaxige.com\nyaxin888.com\nyaxinde.com\nyaxinghbkj.com\nyaxuntuhang.com\nyaya.love\nyayaad.com\nyayagushi.com\nyayawan.com\nyayeschool.com\nyayihouse.com\nyayiskq.com\nyayitianyun.com\nyayiyun.net\nyayjrj.com\nyayouapp.com\nyaypool.com\nyayu.net\nyayunjiqi.com\nyazhihg.com\nyazhijian.com\nyazhougoufang.com\nyazuo.com\nyazx.net\nyb-able.com\nyb1518.com\nyb1867.com\nyb3.cc\nyb983.com\nyb999.com\nyba120.com\nybaby.com\nybaobx.com\nybaomall.com\nybbwy.com\nybbxkj.com\nybc1024.com\nybc35.com\nybccb.com\nybccode.com\nybcheck.com\nybchen.work\nybcjmarathon.com\nybcnjg.com\nybcxjd.com\nybcxz.com\nybdbz.com\nybdlogistic.com\nybe.net\nybgkz.com\nybgz.com\nybhdmob.com\nybi.net\nybirds.com\nybj.com\nybjjsgc.com\nybjsk.com\nybk001.com\nybk168.com\nybk6.com\nyblc.com\nyblcs.com\nyblry.com\nybm100.com\nybmedicine.com\nybmilkgoat.com\nybqysw.com\nybrc128.com\nybren.com\nybs120.com\nybscjp.com\nybscpqtlxx.com\nybsftd.com\nybsjyyn.com\nybstjs.com\nybstwl.com\nybt168.com\nybtianshantu.com\nybtvyun.com\nybty.com\nybvip.com\nybvips.com\nybvv.com\nybw315.com\nybword.com\nybxww.com\nyby1953.com\nybyiot.com\nybynet.com\nybypark.com\nybzhao.com\nybznzz.com\nybzzgh.org\nyc-exp.com\nyc-gc.com\nyc-petronas.com\nyc-yinhe.com\nyc-zj.com\nyc0917.com\nyc123.com\nyc123.net\nyc12313.com\nyc222.com\nyc2e.com\nyc360.org\nyc370.com\nyc8.com\nyc9y.com\nycait.com\nycamlyy.com\nycandyz.com\nycangels.com\nycaqr.com\nycb.com\nycbiz.net\nycbright.com\nycbroker.com\nycbus.com\nycc.ink\nyccdl.net\nyccn.cc\nycd-hk.com\nycdext.net\nycdfby.com\nycdfwater.com\nycdongxu.com\nycdrh.com\nycdryy.com\nycduile.com\nycdz.shop\nycdzcc.com\nyceshop.com\nycfang.net\nycfanglei.com\nycfbapp.com\nycfggc.com\nycfog.com\nycfybj.com\nycfybjy.com\nycgame.com\nycgj.cc\nycgjxx.com\nycgslb.com\nycgwl.com\nycgzgame.com\nychanfang.com\nychcqmu.com\nychdzxsh.com\nychr.com\nychromedgeie.com\nychszh.com\nychxie.com\nychxiex.com\nycig.com\nycigilink.com\nyciou.com\nycis-bj.com\nycis-cq.com\nycis-schools.com\nycis-sh.com\nyciyun.com\nycjhjsbyy.com\nycjingweiranqi.com\nycjintou.com\nycjinze.com\nycjklrq.com\nycjljt.com\nycjob.com\nycjsxy.com\nycjt2007.com\nycjyjt.com\nycjzzsw.com\nyckceo.com\nyckceo.vip\nyckjzsq.com\nyckkdd.com\nycku.com\nycleaning.com\nyclh6.com\nycloud.online\nycloudlb.com\nycloudvip.com\nyclyq.com\nycmae.com\nycmlaw.com\nycmm.com\nycnaxin.com\nycnevpds.com\nycny.com\nycoa0898.com\nycool.com\nycpack.net\nycpai.com\nycpec.com\nycphkj.com\nycpinke.com\nycpsy.com\nycqin.com\nycqq.com\nycrcrs.com\nycrcw.net\nycrh.com\nycrkb.com\nycrusher.com\nycrx360.com\nycrysw.com\nycs120.com\nycscszh.com\nycsd.work\nycsdryy.com\nycsdyyy.com\nycshengquan.com\nycsjtjt.com\nycsound.com\nycsrc.com\nycsthqrmyy.com\nycsystem.com\nycsyy.com\nyct-tec.com\nyctdyy.com\nyctxrj.com\nycty.org\nyculblog.com\nycur.net\nycwalker.com\nycwb.com\nycwljt.com\nycxba.com\nycxdryy.com\nycxicmall.com\nycxiezhu.com\nycxinxi.com\nycxm.com\nycxskw.com\nycxy.com\nycxzlsyxgs.com\nycyaw.com\nycyck.com\nycycut.com\nycyhzx.com\nycyjkj.com\nycym.com\nycypin.com\nycyunyuk.com\nycyz.com\nycyzwb.net\nyczbw.com\nyczfwy.com\nyczihua.com\nyczjkfyy.com\nyczk.org\nyczpw.com\nyczxyy.com\nyczy5.com\nyd-data.com\nyd-jxt.com\nyd-power.com\nyd-tec.com\nyd166.com\nyd43s2q51b.com\nydadmob.com\nydalison.com\nydamc.com\nydayc.com\nydbimg.com\nydbmed.com\nydbox.com\nydc360.com\nydcb.com\nydce.com\nydcloud.cc\nyddsha2.com\nyddtiyu.com\nyddxkj.com\nydfeathers.com\nydfgq.com\nydgj2727.com\nydguolan.com\nydh.fun\nydhex.com\nydhexpress.com\nydhjj.com\nydhl.cc\nydhlaz11151.com\nydhn.com\nydht.com\nydhyfs.com\nydihi.com\nydimmi.com\nydjdcjc.com\nydjt1166.com\nydjt2288.com\nydjwy.net\nydjy.net\nydkj2019.com\nydl-sh.com\nydl.com\nydlcdn.com\nydlut.com\nydmel.com\nydmeng.com\nydn5.com\nydnewmedia.com\nydniu.com\nydr.me\nydsaso.com\nydscan.net\nydsjjs.com\nydsjpt.com\nydsrmyy.com\nydstatic.com\nydsyyy.com\nydt-express.com\nydt.link\nydtad.com\nydtbl.com\nydtnotary.com\nydtqd.com\nyduav.com\nydvip00aa.com\nydvip00ab.com\nydvip00ac.com\nydvip00ad.com\nydvip00ae.com\nydvip00af.com\nydvip00ag.com\nydvip00ah.com\nydvip00ai.com\nydvip00aj.com\nydvip00ak.com\nydvip00al.com\nydvip00am.com\nydvip00an.com\nydvip00ao.com\nydvip00ap.com\nydvip00aq.com\nydvip00ar.com\nydvip00as.com\nydvip00at.com\nydwatch.com\nydwgame.net\nydx2.com\nydxphb.com\nydxrf.com\nydxxt.com\nydyb.com\nydycdn.com\nydyeducation.com\nydyj.net\nydylcn.com\nydyljk.com\nydylmtytv.com\nydyspc.com\nydywh.shop\nydyy120.com\nydzxyjhyy.com\nydzz.com\nye1992.com\nye3.com\nye40.com\nyead.net\nyeah.net\nyeahka.com\nyeahnic.net\nyeahteen.com\nyeahworld.com\nyeai.com\nyealink.com\nyealinkvc.com\nyeaosound.com\nyeapcloud.net\nyearlygreen.com\nyearnfar.com\nyeastar.com\nyeasturias.com\nyebaike.com\nyebangyu.org\nyebaojiasu.com\nyebinnet.com\nyeboyzq.com\nyebrewing.com\nyecao.net\nyecaoyun.com\nyecdn.com\nyechangktv.com\nyechengmuye.com\nyedanguan365.com\nyedapi.com\nyedarc.com\nyedejia.com\nyedingding.com\nyedone.com\nyeduxiaoshuo.com\nyee5.com\nyee800.com\nyeeanbao.com\nyeeaoo.com\nyeeauto.com\nyeecai.com\nyeecin.com\nyeecloud.com\nyeedian365.com\nyeefeitrip.com\nyeefire.com\nyeefung.com\nyeefx.net\nyeekang.com\nyeekit.com\nyeelight.com\nyeelink.net\nyeelogo.com\nyeemei.com\nyeemen.com\nyeemiao.com\nyeemiao.net\nyeepay.com\nyeepaycdn.com\nyeepbank.com\nyeepiao.com\nyeesha.com\nyeetan.com\nyeeuu.com\nyeewo.net\nyeeyan.com\nyeeyan.org\nyeezon.com\nyefengs.com\nyegame.com\nyegaochemical.com\nyegenyou.com\nyegoo.com\nyegrand.com\nyegu168.com\nyeguohd.com\nyehoochina.com\nyehuisteel.com\nyeidc.com\nyeitu.com\nyejiangye.com\nyejibang.com\nyejienet.com\nyejuu.com\nyekyc.com\nyelanxiaoyu.com\nyelinmall.com\nyelishi.net\nyelixiali.com\nyellowriver.org\nyelook.com\nyelot.com\nyemacaijing.com\nyemadai.com\nyemajun.com\nyemancomic.com\nyemaosheji.com\nyemaosoft.com\nyemayun.com\nyemeihuoguo.com\nyemeisy.com\nyemengstar.com\nyemet.com\nyemhj.com\nyenlex.com\nyentechnology.com\nyeoebyevhq.com\nyeolar.com\nyeoner.com\nyepaisz.com\nyephy.com\nyeren86.com\nyergoo.com\nyes-chinese.com\nyes-lcd.com\nyes58.net\nyes88.com\nyesacc.com\nyesapi.net\nyesbt.cc\nyesbx.com\nyeschool.net\nyescontrols.com\nyesdotnet.com\nyesense.com\nyeshen.com\nyeshengarts.com\nyeshine.net\nyeshitv.com\nyeshj.com\nyeshu.cloud\nyeshu.com\nyesidos.com\nyesilicon.com\nyeskn.com\nyesky.com\nyeslicake.com\nyesmyimg.com\nyesmywine.com\nyesonfashion.com\nyesou.com\nyesoulchina.com\nyespearl.com\nyespik.com\nyespmp.com\nyestar.com\nyestar1992.com\nyestarcorp.com\nyestargz.com\nyestarm.com\nyestarvip.com\nyestehotel.com\nyeston.net\nyestone.com\nyesudoo.com\nyesungroup.com\nyesuse.net\nyeswan.com\nyeswood.com\nyesxun.com\nyetaidrink.com\nyetianlian.cc\nyetianlian.info\nyetianzi.com\nyettos.com\nyetu.net\nyewanba.com\nyewen.us\nyewuyuan.com\nyexinggroup.com\nyeyday.com\nyeyezhenxuan.com\nyeyimg.com\nyeyingkf.com\nyeyo.cc\nyeyou.com\nyeyoucdn.com\nyeyoujia.com\nyeyousg.com\nyeyulingfeng.com\nyeyun.com\nyezaifei.com\nyezhuwq.com\nyezhuwuyou.com\nyezi66.xyz\nyeziapp.com\nyezipi.net\nyeziting.com\nyezixigame.com\nyezixueyuan.com\nyezizhu.com\nyezizx.com\nyf-ec.com\nyf-zs.com\nyf0008168.com\nyf520.com\nyf77.com\nyfanad.com\nyfanqie.com\nyfbudong.com\nyfbzb.com\nyfcache.com\nyfcalc.com\nyfcdn.net\nyfchuhai.com\nyfcity.net\nyfcloud.com\nyfcloud.io\nyfcloud.work\nyfd.xyz\nyfdc.net\nyfdns.net\nyfds168.com\nyfdts.net\nyfdurl.com\nyfdurl0.com\nyfdurl1.com\nyfdurl10.com\nyfdurl11.com\nyfdurl12.com\nyfdurl13.com\nyfdurl14.com\nyfdurl15.com\nyfdurl16.com\nyfdurl17.com\nyfdurl18.com\nyfdurl19.com\nyfdurl2.com\nyfdurl20.com\nyfdurl3.com\nyfdurl4.com\nyfdurl5.com\nyfdurl6.com\nyfdurl7.com\nyfdurl8.com\nyfdurl9.com\nyfdxs.com\nyfdyf.com\nyfemj.com\nyffood.com\nyffy120.com\nyffzkl.com\nyfgg.com\nyfgj68.com\nyfhex.com\nyfhhf.com\nyfhl.net\nyfhospital.com\nyfhxtech.com\nyfinds.com\nyfiot.com\nyfisher.com\nyfjiakao.com\nyfjnjc.com\nyfklxz.com\nyflcloud.online\nyfldocker.com\nyflive.net\nyfm99.com\nyfmac.com\nyfmhgf.com\nyfmhw.com\nyfp2p.net\nyfpayment.com\nyfsafety.com\nyfsail.net\nyfscdn.com\nyfscdn.net\nyfservice.com\nyfsteel.com\nyfswjt.com\nyfswny.com\nyftxt.com\nyfty88.com\nyfvb.com\nyfway.com\nyfwnm.com\nyfworld.com\nyfwpt.vip\nyfwqlij.xyz\nyfycrc.com\nyfycyboil.com\nyfygxyy.com\nyfyky.com\nyfysjt.com\nyg-pump.com\nyg-st.com\nyg1997.com\nyg84.com\nyg8898.com\nygbid.com\nygbx.com\nygc711iq.com\nygcgfw.com\nygcloud.com\nygcooler.com\nygct.com\nygdatabase.com\nygdl.com\nygdy8.net\nyge.me\nygeer.com\nygei.com\nyget.me\nygfengshui.com\nygfmlt.com\nyggk.net\nyghsh.com\nygibao.com\nyginsight.com\nygjctech.com\nygjj.com\nygjoy.com\nygmsy.com\nygread.com\nygrtt.com\nygsdmedia.com\nygsf.com\nygsoft.com\nygtape.com\nygtcpa.com\nygtf.net\nygtiyu.com\nygtl.com\nygtq.net\nygvyp.com\nygwenxue.com\nygwh.cc\nygwood.com\nygx8888.com\nygxy.com\nygym.org\nygzt.net\nyh-group.com\nyh0.com\nyh2000.com\nyh31.com\nyh596.com\nyh598.com\nyh914.com\nyh99.cc\nyh999999.com\nyhaabva.com\nyhachina.com\nyhadmob.com\nyham.net\nyhc-card.com\nyhcangchu.com\nyhchj.com\nyhchn.com\nyhcjcw.com\nyhcko.com\nyhcmovie.com\nyhcplatform.com\nyhcqw.com\nyhd.com\nyhdd365.shop\nyhdfa.com\nyhdi.net\nyhdlcs.com\nyhdm5.com\nyhdns.net\nyhedu.com\nyhees.com\nyhgdiopn.vip\nyhgfb-cn-static.com\nyhggroup.com\nyhgmjf.com\nyhgzjt.com\nyhhh8888.com\nyhhjcc.com\nyhhotel.com\nyhidc.com\nyhindustrial.com\nyhj9.com\nyhjbox.com\nyhjcollege.com\nyhjj.com\nyhjktgfd.cc\nyhjx2018.com\nyhkaq.com\nyhkbchao.com\nyhkingdee.com\nyhkz.com\nyhlbx.com\nyhly.shop\nyhm11.com\nyhmob.com\nyhmsfc.com\nyhmyi.com\nyhpackaging.net\nyhppk.com\nyhqapp.com\nyhqdashi.com\nyhqh.net\nyhqrmyy.com\nyhquan365.com\nyhqurl.com\nyhrcb.com\nyhrjk.com\nyhrongde.com\nyhrsks.com\nyhs518.com\nyhsc.com\nyhshapp.com\nyhsms.com\nyhsp.net\nyhsport.com\nyhstjt.com\nyhtclb.com\nyhthing.com\nyhtools.cc\nyhtx.tv\nyhtzx.net\nyhurl.com\nyhwch.com\nyhwins.com\nyhwjlp.plus\nyhwomen.com\nyhx3318.com\nyhxincai.com\nyhxmset.com\nyhxs3344.net\nyhxuexiao.com\nyhydl.com\nyhyhwy.com\nyhylc71.com\nyhyyjk.com\nyhz2000.com\nyhz365.com\nyhz66.com\nyhzky.net\nyhzky1.net\nyhzm.com\nyhzrt.com\nyhzuche.com\nyi-fengshui.com\nyi-hall.com\nyi-i.com\nyi-jy.com\nyi-oa.com\nyi-programmer.com\nyi-sky.com\nyi-you.org\nyi-zhifu.com\nyi-zhou.com\nyi020.com\nyi0600.com\nyi114.com\nyi2.net\nyi6.com\nyi7.com\nyi958.com\nyiai.me\nyiaini.com\nyiandrive.com\nyianjiulao.com\nyiapp.com\nyibaijin.com\nyibaixun.com\nyiban.io\nyiban1314.com\nyibaogao.com\nyibaojiankang.com\nyibaotech.com\nyibei.com\nyibeiic.com\nyibeiwangluo.com\nyibenmanhua.com\nyibentushu.com\nyibiao-sh.com\nyibite.com\nyiboard.com\nyiboliu.com\nyiboow.com\nyiboshi.com\nyibotec.com\nyiboyangguang.com\nyicai.com\nyicaiai.com\nyicaiexpo.com\nyicaiglobal.com\nyicaihua.com\nyicaiykt.com\nyicamp.com\nyicang.com\nyicanggongyi.com\nyicbo.com\nyice11.com\nyicha-yc.com\nyichadan.com\nyichafen.com\nyichangly.com\nyichangmarathon.com\nyiche.com\nyichemall.com\nyichengfood.net\nyichengji.com\nyichengnews.com\nyichengwangluo.net\nyicheshi.com\nyichezhi.com\nyichi.tech\nyichip.com\nyichuan.net\nyichuntv.com\nyichuyifan.com\nyickd.com\nyiclear.com\nyicloud.org\nyicode.tech\nyicoe.com\nyicongfound.org\nyiconmed.com\nyicuba.com\nyicungn.com\nyicx.com\nyida6666.com\nyidaba.com\nyidachem.com\nyidachina.com\nyidadrillcollar.com\nyidagas.com\nyidahospital.com\nyidai.com\nyidaidai.com\nyidaointernational.com\nyidaomall.com\nyidaomobi.com\nyidaplay.com\nyide.com\nyideamobile.com\nyidejia.com\nyidengxuetang.com\nyidian-inc.com\nyidian360.com\nyidian51.com\nyidiancangwei.com\nyidianchina.com\nyidianda.com\nyidianedu.com\nyidianfenqi.com\nyidianhulian.com\nyidianliangdiansandiansidianwudianliudianqidianbadianjiudianshi.com\nyidianling.com\nyidianliulan.com\nyidianmail.com\nyidiansz.com\nyidianting.xin\nyidianyuan-wawa.com\nyiding-gr.com\nyidingbao.shop\nyidingding3.com\nyidmall.com\nyidns.net\nyidong-food.com\nyidonghua.com\nyidongtimes.com\nyidontek.com\nyidoutang.com\nyidouzhaofang.com\nyidu-marathon.com\nyidubbs.com\nyiduchuan.com\nyidui.me\nyiduir.com\nyidulive.com\nyidumen.com\nyidun.com\nyiduoli.com\nyiduoxinya.com\nyiduqiang.com\nyiduwater.com\nyiec.com\nyiernews.com\nyiexi.com\nyifajingren.com\nyifake.com\nyifan211.com\nyifancdn.com\nyifancn.com\nyifanggl.com\nyifanghy.com\nyifanmedia.net\nyifanshangplus.com\nyifanyy.com\nyifatong.com\nyifei.com\nyifei.space\nyifeigufen.com\nyifeimeiye.com\nyifeishu.com\nyifeng-filter.com\nyifeng-mover.com\nyifeng.com\nyifenghudong.com\nyifengke.com\nyifengliangyou.com\nyifengx.com\nyifengxin.org\nyifont.com\nyifu.net\nyifubao.com\nyifucj.com\nyifum.com\nyifum.hk\nyifum.net\nyifutu.com\nyigaosu.com\nyige.org\nyigeban.com\nyigecun.com\nyigerlife.com\nyigomob.com\nyigongdcs.com\nyigonghl.com\nyigood.net\nyigoonet.com\nyigouu.com\nyiguanba.com\nyiguanghuagong.com\nyiguo.com\nyiguoimg.com\nyihafo.com\nyihaikerry.net\nyihaiquanyi.com\nyihaishijia.com\nyihang.info\nyihao.com\nyihao01.com\nyihaocar.com\nyihaodian.com\nyihaodianimg.com\nyihaoduozhongduan.com\nyihaojiaju.com\nyihaomall.com\nyihaomen.com\nyihaoranjd.com\nyihaoyunche.com\nyihchina.com\nyiheda.com\nyihedoors.com\nyihegroup.com\nyihekf.com\nyihengyt.com\nyiherubber.com\nyihong001.com\nyihong1718.com\nyihtc.com\nyihu.com\nyihu365.com\nyihuacomputer.com\nyihuajiaoyu.com\nyihuan.org\nyihuanjt.com\nyihubaijia.com\nyihubg.com\nyihuichuang.com\nyihuikeji.vip\nyihuimg.com\nyihuiyun.net\nyihun.com\nyihuohao.com\nyiibai.com\nyiichina.com\nyiigle.com\nyiihuu.com\nyiii.net\nyiimoo.com\nyiinet.net\nyiiwo.com\nyijia-ai.com\nyijia.com\nyijia.ink\nyijia5.com\nyijiakao.com\nyijian-app.com\nyijian119.com\nyijiande.com\nyijiangbao.com\nyijianjiexi.com\nyijianlogo.com\nyijianqutu.com\nyijianzj.com\nyijiaqin.com\nyijiaren3413.com\nyijiawang.com\nyijiebuyi.com\nyijiedai.com\nyijimaoyi.com\nyijinghong.com\nyijingji.com\nyijingxiehui.net\nyijintong.net\nyijirecovery.com\nyijiupi.com\nyijiuplus.com\nyijueculture.com\nyijuedesign.com\nyijueweb.com\nyijun77.com\nyikag.com\nyikai.com\nyikaiye.com\nyikaiye.net\nyikang.work\nyikang1977.com\nyikangdongf.com\nyikanxs.com\nyikaoapp.com\nyikaochacha.com\nyikaow.com\nyikebus.com\nyikedou.com\nyikeou.com\nyiketalks.com\nyiketianqi.com\nyikeweiqi.com\nyikexue.com\nyikezhengxing.com\nyikouhy.com\nyikuaide.com\nyikuaiqu.com\nyikuaixiu.com\nyikuns.com\nyikuyi.com\nyilandezhong.com\nyilantop.com\nyilanvaas.com\nyile8.com\nyilewan.com\nyileweb.com\nyileyiqi.com\nyileyoo.com\nyileyunssp.com\nyili.com\nyilianapp.com\nyilianmeiti.com\nyilianyixue.com\nyiliaosheji.com\nyilibabyclub.com\nyilicar.com\nyiliganggou.com\nyilihuo.com\nyiliit.com\nyilijet.com\nyilikim.com\nyilingarden.com\nyilingshop.com\nyilingsj.com\nyilinweb.com\nyiliqqstar.com\nyilishiji.com\nyiliwater.com\nyiliysr.com\nyillionbank.com\nyilong.com\nyilongnews.com\nyilongweiguo.com\nyilu365.com\nyilule.com\nyiluzouhao.com\nyilvcheng.com\nyima.world\nyima88.com\nyimaitongdao.com\nyimakk.com\nyimao.net\nyimaoip.com\nyimapay.com\nyimashijie.com\nyimeichu.com\nyimeihui360.com\nyimeima.com\nyimeiya.com\nyimenapp.com\nyimenapp.net\nyimeng.com\nyimenonline.com\nyimenseo.net\nyimenssl.com\nyimian.xyz\nyimianmian.com\nyimiaotui.com\nyimiaoxia.com\nyimidida.com\nyimifund.com\nyimihaodi.com\nyimin.biz\nyimin168.com\nyimingcul.com\nyimingkeji.net\nyimingroup.com\nyimingzhi.net\nyimininfo.com\nyiminjiayuan.com\nyiminw.com\nyiminyy.com\nyimisoft.com\nyimitongxue.com\nyimiyisu.com\nyimuapp.com\nyimudoor.com\nyimutian.com\nyimuymc.com\nyinbaitu.com\nyinban.com\nyinbangbroker.com\nyinbian.cc\nyinbin.ink\nyincat.com\nyinchar.com\nyinchenglawyer.com\nyinchengli.com\nyinchengpai.com\nyinchuanwater.com\nyinchuanzxd.com\nyindon.com\nyindu.com\nyinduchina.com\nyindudigital.com\nyindui.net\nyindunjituan.com\nyinduzx.com\nyineitong.com\nyinengjituan.net\nyinengkt.com\nyinengwl.com\nyinerda.com\nyinfeiy.com\nyinfenggr.com\nying-sw.com\nying-ting.com\nyingbei365.com\nyingbio.com\nyingbozhu.org\nyingcai.cc\nyingcaicheng.com\nyingcankeji.com\nyingchao-wikipedia.com\nyingchaozhibo.com\nyingcheng.net\nyingchengnet.com\nyingchuang.com\nyingchulawyer.com\nyingci86.com\nyingdao.com\nyingde.com\nyingdev.com\nyinge.cc\nyinge.tech\nyingeda.com\nyingeye.com\nyingfangkeji.com\nyingfeiyun.com\nyingfeng.me\nyinggou.com\nyingguangroup.com\nyingguantx.com\nyinghai.work\nyinghaicar.com\nyinghanhuyi.com\nyinghecloud.com\nyingheedu.com\nyingheying.com\nyinghezhong.com\nyinghuaonline.com\nyinghuasuan.com\nyinghuiiot.com\nyinghuo.art\nyinghuochong.com\nyinghuochong.fun\nyinghuochongjz.com\nyinghuodd.com\nyingjia360.com\nyingjianzhijia.com\nyingjiesheng.com\nyingjiesheng.net\nyingjiesheng.org\nyingjimall.com\nyingjinhk.com\nyingke010.com\nyingkefuli.com\nyingkelawyer.com\nyingkounews.com\nyingle.com\nyingleku.com\nyinglib.com\nyingligroup.com\nyinglisolar.com\nyingliugroup.com\nyinglunka.com\nyingmei.me\nyingmi.com\nyingming.net\nyingnor.com\nyingpaigame.com\nyingpaikeji.com\nyingpengbz.com\nyingpost.com\nyingriliuti.com\nyingrongit.com\nyingshe.com\nyingsheng.com\nyingshi-ai.com\nyingshiyou.com\nyingso.fun\nyingsoft.com\nyingsoo.com\nyingsun.net\nyingsx.com\nyingt.asia\nyingt.fun\nyingtai.com\nyingtaigroup.com\nyingtaorelian.com\nyingtaosiyue.com\nyingtaoyun.com\nyingteach.com\nyingtexin.net\nyingtianit.com\nyingtianlight.com\nyingtianwang.com\nyingtongshe.com\nyinguobing.com\nyingworks.com\nyingwuyuzd.cc\nyingxi.tv\nyingxiahome.com\nyingxiaofangan.com\nyingxiaoli.com\nyingxichina.com\nyingxiong.com\nyingxiongji.com\nyingxun56.com\nyingyang630.com\nyingyankantu.com\nyingyecraft.com\nyingyijin.com\nyingyinclub.com\nyingyinglicai.com\nyingyonghao8.com\nyingyonghui.com\nyingyongmiao.com\nyingyongshichang.com\nyingyongso.com\nyingyu.com\nyingyuchat.com\nyingyudengji.com\nyingyuehe.com\nyingyushijie.com\nyingyuxiaoshuo.com\nyingzaocms.com\nyingzhongshare.com\nyingzi01.com\nyingzi02.com\nyingzicms.com\nyingzt.com\nyinhai.com\nyinhang123.net\nyinhangchaxun.com\nyinhanghanghao.com\nyinhangkadata.com\nyinhangkahao.com\nyinhangkaoshi.net\nyinhangzhaopin.com\nyinhe.com\nyinhe.net\nyinhecn.com\nyinheyuedu.com\nyinhu.com\nyinhuadm.one\nyinhuafu.com\nyinhuatangyiyao.com\nyinhuchem.com\nyinhulaser.com\nyini.org\nyinisun.com\nyinjia.com\nyinjiabio.com\nyinjispace.com\nyinka.co\nyinkunwi.work\nyinlimedia.com\nyinlingshuyuan.com\nyinlvaa.com\nyinmakeji.com\nyinmaojx.com\nyinmishu.com\nyinning.vip\nyinongtao.com\nyinpiao.com\nyinqiao.com\nyinqiaogroup.com\nyinrcw.com\nyinsafe.com\nyinsfinance.com\nyinsha.com\nyinshenxia.com\nyinshua.cc\nyinshuiyu.com\nyinsuwl.com\nyintai.com\nyintechi.com\nyintime.com\nyinuo1000.com\nyinuobeidiao.com\nyinuochina.com\nyinuoedu.net\nyinuotech.com\nyinxiang.com\nyinxiangart.com\nyinxianggame.com\nyinxiangmall.com\nyinxiangqingyang.com\nyinxiangwuye.com\nyinxiao.com\nyinxiaobao.net\nyinxinbh.com\nyinxinchina.com\nyinxing.com\nyinxunbiao.com\nyinyangresin.com\nyinyangshi.com\nyinyao168.com\nyinyue7.com\nyinyuegf.com\nyinyueke.net\nyinyuemeitu.com\nyinyuetai.com\nyinyueyouxi.com\nyinyuezhizuoren.com\nyinzhaowang.com\nyinzhijie.com\nyinzhupharma.com\nyinziyan.com\nyinzuo100.com\nyioho.com\nyioulai.com\nyiovo.com\nyipai.info\nyipai360.com\nyipaiming.com\nyipaogan.com\nyiparts.com\nyipemail.com\nyipeng888.com\nyipiaoyun.com\nyipigu.com\nyipihuo.com\nyipinbowu.com\nyipingmed.com\nyipingmi.vip\nyipingsj.com\nyipinhr.com\nyipinpai.com\nyipinsmart.com\nyipintemian.com\nyipinyiwu.com\nyipsink.com\nyipujiance.com\nyipuping.com\nyiputouzi.com\nyipuwuyou.com\nyiq.com\nyiqi.com\nyiqi35.com\nyiqi4.com\nyiqianbao.com\nyiqianbao.net\nyiqianlian.com\nyiqiao88.com\nyiqiaochina.com\nyiqibazi.com\nyiqibing.com\nyiqibuduoduo.com\nyiqicai.com\nyiqicesuan.com\nyiqichuangxiang.com\nyiqicms.com\nyiqifa.org\nyiqifei.com\nyiqifengtian.com\nyiqig.com\nyiqihi.com\nyiqihuihui.com\nyiqijian.com\nyiqijixiang.com\nyiqikan8.com\nyiqike.com\nyiqiming88.com\nyiqimob.com\nyiqingyuan.com\nyiqinzi.com\nyiqioffice.com\nyiqipaipingtai.com\nyiqishai.com\nyiqishanyuan.com\nyiqiso.com\nyiqisooimg.com\nyiqistore.com\nyiqitp.com\nyiqituodan.com\nyiqiuu.com\nyiqiwang.net\nyiqixiaofei.com\nyiqixie.com\nyiqixiegushi.com\nyiqiyoo.com\nyiqiyou.com\nyiquan-keji.com\nyiquhai.com\nyiqujing.com\nyiquxapp.com\nyirankejiao.com\nyiranmeifushi.com\nyiren001.com\nyirendai.com\nyirentong.com\nyirenwuye.com\nyirenzhushou.com\nyirenzuji.com\nyirgalab.com\nyirlir.com\nyirong.com\nyiruan.la\nyiruantong.com\nyiruide.com\nyiruikecorp.com\nyiruituo.com\nyirujs.com\nyiruniot.com\nyiruwijojn1.com\nyiryi.com\nyisa.com\nyisanban.com\nyisanwu.com\nyisbei.com\nyisell.com\nyishalai.com\nyishan168.com\nyishang.cc\nyishangwang.com\nyishangye.com\nyishengfanyi.com\nyishengjiaoyu.com\nyishidian.com\nyishihui.com\nyishihui.net\nyishion.com\nyishion.net\nyishiongd.com\nyishixue.com\nyishouapp.com\nyishs.com\nyishu168.com\nyishujia.net\nyishujie.com\nyishuliuxue.com\nyishun.fun\nyishutang.com\nyishuzhifa.com\nyishuzi.com\nyishuzi.org\nyishuziti.com\nyisier.com\nyisimeimaoyi.xyz\nyiso.fun\nyisocms.com\nyisou.com\nyisouti.com\nyisouyifa.com\nyissimg.com\nyisu.com\nyisuan.net\nyisuddoscdn.com\nyisuoyi.com\nyit.com\nyitai17.com\nyitaifang.com\nyitaigroup.com\nyitaihdbf.com\nyitanyun.com\nyitao.com\nyitaopu.com\nyitb.com\nyitcollege.com\nyitechnology.com\nyiteholdings.com\nyitel.com\nyitelish.com\nyitesoft.com\nyitiangroup.com\nyitianshidai.com\nyitianxinda.com\nyitiaoyule.com\nyiticm.com\nyitijizhi.com\nyitisports.com\nyitoa.com\nyitong-group.com\nyitongguan.com\nyitongmedia.com\nyitongsolar.com\nyitonyiqi.com\nyitoto.cc\nyitsoftware.com\nyitutech.com\nyituyu.com\nyiubd.com\nyiupin.com\nyiuxiu.com\nyivian.com\nyivicar.com\nyivizd.com\nyiwaiart.com\nyiwan.com\nyiwangdujin.com\nyiwanggo.net\nyiwangtui.com\nyiwanlian.net\nyiwanzhushou.com\nyiwealth.com\nyiweb.com\nyiweiads.com\nyiweishi.com\nyiwenyida.com\nyiwenyizhi.com\nyiwise.com\nyiworld.com\nyiwu56.com\nyiwubuy.com\nyiwufair.com\nyiwugo.com\nyiwugou.com\nyiwuguan.com\nyiwuku.com\nyiwulianhe.com\nyiwumls.com\nyiwupay.com\nyiwutalk.com\nyiwuzhaopin.com\nyiwuzhongxiyi.com\nyiwz.net\nyixao.com\nyixao.net\nyixc.com\nyixi.tv\nyixia.com\nyixiaai.com\nyixiaai.online\nyixianfabu.com\nyixiangzuji.com\nyixiansheng.com\nyixiaobang.net\nyixiaoyuan.com\nyixiaozu.com\nyixiatong.com\nyixiekeji.com\nyixin-valve.com\nyixin.com\nyixin.im\nyixin5.com\nyixincao.com\nyixincapital.com\nyixinfinance.com\nyixinfund.com\nyixingart.com\nyixingauto.com\nyixingguanchang.com\nyixinli.xin\nyixintui.com\nyixinu.com\nyixiu.cloud\nyixiubx.com\nyixiuxueyuan.com\nyixuan.net\nyixue.com\nyixue68.com\nyixue99.com\nyixuegr.com\nyixueks.com\nyixuelunwen.com\nyixuexianzhi.com\nyixuezp.com\nyixun.com\nyixunjidian.com\nyixunwu.com\nyiya520.com\nyiyacht.com\nyiyaha.com\nyiyanche.com\nyiyang168.com\nyiyang668.com\nyiyangadx.com\nyiyangidc.com\nyiyangzhuangyuan.com\nyiyao.tv\nyiyaodxt.com\nyiyaohang.com\nyiyaojd.com\nyiyaojie.com\nyiyaoqianyan.com\nyiyayans.com\nyiye-a.com\nyiye-h.com\nyiye-v.com\nyiye.ai\nyiyebang.com\nyiyedu.com\nyiyefei.com\nyiyesheng.net\nyiyiarts.net\nyiyifoods.com\nyiyimh.com\nyiyisoft.com\nyiyitech.com\nyiyitesco.com\nyiyiu.com\nyiyiwawa.com\nyiyongcad.com\nyiyouliao.com\nyiyouliuxue.com\nyiyouqi.com\nyiyoushu.net\nyiyu.com\nyiyuan.com\nyiyuanjichang.com\nyiyuanluye.com\nyiyuanqiang.net\nyiyuansoft.com\nyiyuanyi.org\nyiyuanzhaopin.com\nyiyukj.com\nyiyum.com\nyiyun518.com\nyiyupack.com\nyiyusemi.com\nyiz.vip\nyizanmeiye.com\nyizenb.com\nyizeseafood.com\nyizhanapp.com\nyizhang8.com\nyizhanhulian.com\nyizhanzx.com\nyizhaopin.com\nyizhedian.com\nyizhengwx.com\nyizhibi.com\nyizhibo.com\nyizhidayu.com\nyizhifubj.com\nyizhijia.com\nyizhikan.com\nyizhiknow.com\nyizhiqc.com\nyizhiqingxie.com\nyizhitou.com\nyizhiwechat.com\nyizhiweixin.com\nyizhiws.com\nyizhixiaogame.com\nyizhoucb.com\nyizhu-tech.com\nyizhuan5.com\nyizimg.com\nyizlife.com\nyizu.org\nyizu.tv\nyizumi-group.com\nyizumi.com\nyizuxing.com\nyj-fun.com\nyj-zn.com\nyj.com\nyj.ink\nyj028.com\nyj36.com\nyj518.com\nyjai.art\nyjbys.com\nyjbzr.com\nyjcard.com\nyjcf360.com\nyjcp.com\nyjctrip.com\nyjdatasos.com\nyjdzm.com\nyjfs8.com\nyjfy.com\nyjgf.com\nyjgxcx.com\nyjhbqx.com\nyjhnt888.com\nyjhospital.com\nyjhyjl.com\nyjhzb.com\nyjihua.com\nyjijy.com\nyjiyun.com\nyjjsjt.com\nyjk.com\nyjk.im\nyjkxw.org\nyjldp.com\nyjlhq.com\nyjlin4.com\nyjlink.cc\nyjliquan.com\nyjllq.com\nyjmc.org\nyjmuseum.com\nyjopen.com\nyjpal.com\nyjpd.work\nyjpoo.com\nyjq.cc\nyjqegc.com\nyjr123.com\nyjrc.com\nyjrc.net\nyjrcyw.com\nyjro.com\nyjs-cdn.com\nyjs-cdn1.com\nyjs-cdn10.com\nyjs-cdn2.com\nyjs-cdn3.com\nyjs-cdn4.com\nyjs-cdn5.com\nyjs-cdn6.com\nyjs-cdn7.com\nyjs-cdn8.com\nyjs-cdn9.com\nyjscloud.com\nyjsershi.com\nyjsmodel.com\nyjsops.com\nyjsry.com\nyjssishisi.com\nyjsswjt.com\nyjswsht.xyz\nyjtiyu.com\nyjtvw.com\nyjtw.com\nyjwlnet.com\nyjwlo.com\nyjwmidc.com\nyjwujian.com\nyjxbgjj.com\nyjxfz.com\nyjxlawyer.com\nyjxsoft.com\nyjydl.com\nyjygjjt.com\nyjygx.com\nyjyxiyan.com\nyjyz.com\nyjz9.com\nyjzcalzcxm.com\nyjzf.com\nyk-bio.com\nyk-fm.com\nyk0579.com\nyk56.com\nyk72e.com\nykai.com\nykazgima.com\nykccn.com\nykccn.net\nykcer.com\nykclass.com\nykcuqlt.com\nykdgd.com\nykdmsy.com\nykedu.net\nykelai.com\nykfc.net\nykhongye.com\nykimg.com\nykinvestment.com\nykjljdcss.com\nykjtb.com\nykkpict.com\nykkpict.vip\nykmanhua.com\nykmxemho.com\nykneng.com\nykplg.com\nykptg.com\nykq.ink\nykqj.com\nykqnl.com\nykqx.com\nykrc.net\nykrcx.com\nyksdks.com\nyksign.com\nyksjjt.com\nyksuit.com\nykt.io\nyktchina.com\nyktworld.com\nyktz.net\nykuee.link\nykugyph.com\nykw18.com\nykwater.com\nykwin.com\nykxwcm.com\nykyao.com\nykyi.net\nykzls.com\nykzq.com\nykzr.com\nykzyyy.com\nyl-csj.com\nyl-fc.com\nyl-scm.com\nyl.ag\nyl.vip\nyl0008168.com\nyl01.com\nyl1001.com\nyl1988.com\nylallinone.com\nylbeef.com\nylbloc.com\nylbycw.com\nylcapsule.com\nylchbyfz.com\nylcm.net\nylcncmy.com\nylcxsb.net\nyldaye.com\nyldayu.com\nyldigitallife.com\nyldmall.com\nyldndl.com\nyldrs.com\nylduyi.com\nyldy.net\nyldzhb.com\nylfd.net\nylfx.com\nylgaoshan.com\nylgjsty.com\nylgnyy.com\nylgs96332.com\nylgxgs.com\nylhags.com\nylhakc.com\nylhdgg.com\nylhdsl.com\nylhfjq.com\nylhh.net\nylhhny.com\nylhmgz.com\nylhongjin.com\nylhr.net\nylhrjxfw.com\nylhsrsrc.com\nylibi.com\nylijh.com\nylike.com\nylike.net\nylitc.net\nyliyun.com\nylizu.com\nyljcjt.com\nyljdjx.com\nyljr.com\nylkaite.com\nylkbf.com\nylkjgame.com\nylklyl.com\nyllhzb.com\nyllm666.xyz\nyllt.icu\nylmaterial.com\nylmf.cc\nylmf123.com\nylmf888.com\nylmfeng.com\nylmfwin100.com\nylmm.com\nylnetworks.com\nyloo.org\nylprinter.com\nylq.com\nylqk88.com\nylqyyr.com\nylr114.com\nylrb.com\nylrj.com\nylrq.org\nylscgl.com\nylscw.net\nylsdeyy.com\nylsdyyy.com\nylsfqyy.com\nylsmtnozzle.com\nylssgg.com\nylssofa.com\nylsssgg.com\nylstatic.com\nylstcgz.com\nylstudy.com\nylsw.net\nylt2008.com\nyltapi.com\nyltender.com\nyltexgroup.com\nyltlgjzx.com\nyltpcb.com\nylturl.com\nyltvb.com\nyltxxx.com\nylun8.com\nyluu.com\nylwdec.com\nylwl.cc\nylwltv.com\nylwpark.com\nylws.net\nylwyw.com\nylxdtww.com\nylxgf.com\nylxhmy.com\nylxw.net\nylxweb.com\nylxyct.com\nylxyyy.com\nylxyzs.com\nylxzgz.com\nylyk.com\nylyun.com\nylyz.com\nylzbsj.com\nylzbtech.com\nylzhaopin.com\nylzhsk.com\nylzknk.com\nylzmjd.com\nylzms.com\nylzpay.com\nylzsy.com\nylztwy.com\nylzuche.com\nylzxmryy.com\nylzyhb.com\nylzyjx.com\nylzz5557.com\nylzz5999.com\nylzz666.com\nylzz6777.com\nylzz755.com\nylzz877.com\nym-trans.com\nym.link\nym.run\nym.today\nym01.tech\nym23.com\nym3222333.com\nymacg.com\nymadly.com\nymailcampaign.com\nymanz.com\nymark.cc\nymars.com\nymatou.com\nymawv.la\nymbaidu.com\nymbank.com\nymcart.com\nymcart.net\nymcsepu.com\nymdoctor.com\nymechina.com\nymexf.com\nymfund.com\nymg.cc\nymgk.com\nymgkimg.com\nymhfp.com\nymhudong.com\nymhui.com\nymhuwai.com\nymhzpx.com\nymiot.net\nymisc.com\nymj9.com\nymjkj.com\nymjx8.com\nymkuzhan.com\nymlfxp.com\nymlinks.com\nymlt.net\nymlt.vip\nymm56.com\nymmfa.com\nymnsdk.com\nympc88.com\nympcb.com\nymrcw.vip\nyms.cool\nymsoft.team\nymsss.com\nymsteam.com\nymt.com\nymt123.com\nymt360.com\nymtc.com\nymtie.com\nymtmt.com\nymtnet.com\nymuuy.com\nymvkt.com\nymwcds.org\nymwl.net\nymxinke.com\nymxinxi.com\nymxlass.com\nymyun.com\nymyxsw.com\nymzer.com\nymzsl.com\nymzxconf.com\nymzy.games\nyn-tcm-hospital.com\nyn-tobacco.com\nyn2007.com\nyn58.com\nynaec.com\nynairport.com\nynb2dca.com\nynbit.com\nync365.com\nyncost.com\nyncun.net\nyncunguan.com\nyncyc1990.com\nyndaily.com\nyndcc.com\nyndkt.com\nyndzdj.com\nyneg-ev.com\nyneit.com\nynet.com\nynfabu.com\nynfmly.com\nynfww.com\nynfwyy.com\nynfxw.com\nyngas.net\nyngp.com\nyngsxy.net\nyngw518.com\nynhkfyy.com\nynhl.net\nynho.com\nynhotel.net\nynhouse.com\nynhr.com\nynhthbkj.com\nynhuasong.com\nynhzm.com\nyni84.com\nynian.com\nynjgy.com\nynjiaoyu.net\nynjkeji.com\nynjkjy.com\nynjlgroup.com\nynjtt.com\nynjttzjt.com\nynjtys.com\nynkcfc.com\nynkgyy.com\nynkm88.com\nynkmit.com\nynlygf.com\nynmbwl.com\nynmcyl.com\nynmec.com\nynmlgsgs.com\nynmzly.com\nynnits.com\nynpco.com\nynpta.com\nynpti.com\nynpublish.com\nynqjnews.net\nynqrmyy.com\nynradio.com\nynrainbow.com\nynrc.net\nynrcc.com\nynrd.com\nynscgg.com\nynsdfz.net\nynsfhq.com\nynshangji.com\nynshhyy.com\nynshijian.com\nynsjg.com\nynsjzyxh.com\nynsmyy.com\nynsnjt.com\nynsnw.com\nynsrx.com\nynsst.com\nynstl.com\nynsydwzp.com\nynsyhkgs.com\nynsyy.com\nynszfw.com\nynszk.com\nynszlyy.com\nyntz.cc\nyntz.net\nynurl.com\nynw360.com\nynwater.com\nynwin.com\nynwww.cc\nynxdfpr.com\nynxingexinxi.com\nynxinhua.com\nynxiu.com\nynxr.com\nynxrmyy.com\nynxxb.com\nynxxwfw.com\nynxzy.com\nynyc.com\nynyes.com\nynylhy.com\nynyp.com\nynytkc.com\nynyysc.com\nynzaojia.com\nynzbxh.com\nynzcwl.com\nynzg.org\nynzp.com\nynzqyc.com\nynzrf.com\nynzs.com\nynztrq.com\nynztzxw.com\nynzy-tobacco.com\nynzzwl.com\nyo4399.com\nyo9.com\nyoagoa.com\nyobo.ink\nyobo360.com\nyobochina.com\nyocajr.com\nyocdev.com\nyocofs.com\nyocopi.com\nyocvn.com\nyocyxc.com\nyodak.net\nyodao.com\nyodao.info\nyodao.net\nyodao.org\nyodiya.com\nyodo1.com\nyodo1api.com\nyodou.com\nyoduzw.com\nyoe365.com\nyofc.com\nyofcjs.com\nyofijoy.com\nyofish.com\nyofogo.com\nyofond.com\nyofond.net\nyofus.com\nyoga-8.com\nyogeev.com\nyoghourt.space\nyogiyogacenter.com\nyogoip.com\nyogorobot.com\nyoher.com\nyohipay.com\nyoho.org\nyohobuy.com\nyohui.com\nyohuu.com\nyojcool.com\nyojochina.com\nyoju360.com\nyoju360.net\nyoka.com\nyokacdn.com\nyokagames.com\nyokaimg.com\nyokaverse.com\nyokechina.com\nyokemart.com\nyokmob.com\nyokong.com\nyokotop.com\nyolanda.hk\nyolcool.com\nyolewa.com\nyolexi.com\nyolinkmob.com\nyolipai.net\nyoloho.com\nyoloogames.com\nyolyon.com\nyomhy.com\nyomiko.cloud\nyomiko.club\nyomiko.fun\nyomiko.tech\nyomob.com\nyomocode.com\nyomuzu.com\nyonderep.com\nyondocredit.com\nyoneihan.com\nyonex-china.com\nyong-gang.com\nyong-ming.com\nyong9ai.com\nyonganyiyuan.com\nyongaomy.com\nyongchaohuagong.com\nyongche.com\nyongche.org\nyongchengren.com\nyongdachina.com\nyongdaoyun.com\nyongdasteel.com\nyongdugroup.com\nyonggu.com\nyonghe2008.com\nyongheng.online\nyongheyl.com\nyonghongtech.com\nyonghuivip.com\nyonghungs.store\nyongjiang.com\nyongjiezb.com\nyongjindl.com\nyongjukeji.com\nyongjx.com\nyongkang56.com\nyongkao.com\nyonglibao.com\nyonglibelt.com\nyonglin.com\nyonglinyy.com\nyonglvtong.com\nyongmei0537.com\nyongnangroup.com\nyongootech.com\nyongpingziyuan.com\nyongqianbao.com\nyongqischool.net\nyongridt.com\nyongsheng-sl.com\nyongshenggroup.com\nyongshenghn.com\nyongshengjituan.com\nyongshikj.com\nyongsy.com\nyongtaitech.com\nyongtaiyun.com\nyongtu.net\nyongwangcpa.com\nyongweigroup.com\nyongxiandata.com\nyongxiang.work\nyongxiangwz.com\nyongxinby.com\nyongxinfushi.com\nyongxinhuangjin.com\nyongxinshuo.com\nyongxintex.com\nyongxinxuexiao.com\nyongxiuren.com\nyongyi-valve.com\nyongyoujia.com\nyongyu.xyz\nyongyuenj.com\nyongzhegroup.com\nyongzhentang.com\nyongzhoubus.com\nyonho.com\nyonjan.com\nyonkersz.com\nyonlive.com\nyonthin.com\nyonyou.com\nyonyouaud.com\nyonyoubao.com\nyonyouccs.com\nyonyoucloud.com\nyonyoufintech.com\nyonyougov.com\nyonyougx.com\nyonyouny.com\nyonyouoa.com\nyonyouup.com\nyoo-club.com\nyoo616.com\nyoo66.com\nyooc.me\nyoodb.com\nyooek.com\nyoofh.com\nyoogene.com\nyoohe.net\nyoohouse.com\nyoojia.com\nyoojing.com\nyooknet.com\nyooojie.monster\nyoooooooooo.com\nyoopu.me\nyooquma.com\nyooxlife.com\nyooxun.com\nyooyo.com\nyoozai.com\nyoozhe.com\nyoozhibo.cc\nyoozhibo.net\nyoozoo.com\nyopoint.cc\nyopoint.com\nyoptech.com\nyopu.co\nyopwork.com\nyopye.com\nyoqoo.com\nyoqoo.net\nyoqoo.tv\nyoqu.net\nyorentown.com\nyork-tech.com\nyork33.com\nyorlaw.com\nyorui.net\nyoseleather.com\nyostar.net\nyostatic.com\nyotopic.com\nyou-mi.net\nyou03.com\nyou1ke.com\nyou200.com\nyouacc.com\nyouandme123.com\nyouba.com\nyouba123.com\nyouban.com\nyoubangkeyi.com\nyoubangyun.com\nyoubbs.org\nyoubeichefu.com\nyoubian.com\nyoubibi.com\nyoubike.me\nyoubikecn.com\nyoubohe.com\nyouboy.com\nyouboy.net\nyouboyy.com\nyoucaihua.net\nyoucaiyun.com\nyoucaizhushou.com\nyoucareyk.com\nyoucash.com\nyoucha.net\nyouche.com\nyouchedi.com\nyouchejiuxing.com\nyouchent.com\nyoucheyihou.com\nyouchuhuodong.com\nyoucloud.com\nyouda8.com\nyoudajx.com\nyoudao.com\nyoudaocaifu.com\nyoudaochem.com\nyoudas.com\nyoudashidai.com\nyoudawangluo.com\nyoude.com\nyoudemai.com\nyoudiancms.com\nyoudianyisi.com\nyoudianzhishi.com\nyoudingsuit.com\nyoudingte.com\nyoudong.com\nyoudou.mobi\nyoudubook.com\nyouduzw.com\nyoudwh.com\nyouease.net\nyouedata.com\nyouez.com\nyoufabiao.com\nyoufan.pub\nyoufanerbuy.com\nyoufang123.com\nyoufangou.com\nyoufangzx.com\nyoufanx.com\nyoufen666.com\nyoufengbio.com\nyoufubao.vip\nyoufujc.com\nyoufunlab.com\nyoufutongxinag.org\nyoufuyoucai.com\nyougababy.com\nyouganghangmoguan.com\nyougaoji.com\nyougaoyx.com\nyougenet.com\nyouginorg.com\nyougou.com\nyougu.tv\nyougumuye.com\nyouguo.com\nyouguoquan.com\nyouguu.com\nyouhaodongxi.com\nyouhaosoft.com\nyouhaosuda.com\nyouhaoxinxi.com\nyouhro.com\nyouhu.net\nyouhua.com\nyouhua.pw\nyouhuaaa.com\nyouhuafuzhi.com\nyouhuas.com\nyouhuashu.com\nyouhugmedia.com\nyouhuiduo.net\nyouhundao.com\nyouhuohao.com\nyouhutong.com\nyouideal.net\nyouinsh.com\nyouj.com\nyoujiajk.com\nyoujiands.net\nyoujiangdati.com\nyoujiangzhijia.com\nyoujiao.com\nyoujiao365.net\nyoujiao5.com\nyoujiaxiao.com\nyoujimilk.com\nyoujindi.com\nyoujingnetwork.com\nyoujiuhealth.com\nyoujoy.tv\nyouju360.com\nyouke.co\nyouke.com\nyouked.com\nyoukeda.com\nyoukego.com\nyoukexueyuan.com\nyoukia.com\nyoukia.net\nyouking.com\nyoukongkan.com\nyoukongwan.com\nyouku-dns.com\nyouku.cdn2-youku.com\nyouku.com\nyouku.org\nyoukua.net\nyoukuaiyun.com\nyoukud.com\nyoukupic.com\nyoulai.tech\nyoulanw.com\nyoulechuhai.com\nyoulecn.com\nyouleliwu.com\nyoulesp.com\nyouletd.com\nyouleyou.com\nyoulian.fun\nyoulianfuwu.com\nyouliangda.com\nyoulianghz.com\nyouliao.com\nyouliao.love\nyouliaobaike.com\nyouliaoyi.com\nyoulingtong.com\nyoulinyouke.com\nyoulionbattery.com\nyoulishipin.com\nyouloft.com\nyoulong123.com\nyoulongciqing.com\nyoulu.com\nyoulu.net\nyoulu6.com\nyoulupei.com\nyouluwx.com\nyouma.cc\nyoumai.com\nyoumanvideo.com\nyoume.im\nyoumeisiji.com\nyoumeng020.com\nyoumengchuangxiang.com\nyoumengcms.com\nyoumengmob.com\nyoumenr.com\nyoumew.com\nyoumiad.com\nyoumian99.com\nyoumiaoyigou.com\nyoumideer.com\nyoumindao.com\nyoumobi.com\nyouneedcrydear.com\nyouneng.com\nyounet.com\nyoung40.com\nyoungem.com\nyoungerfeel.com\nyounggas.com\nyoungjoygame.com\nyoungle.site\nyoungle.tech\nyoungor.com\nyoungsunpack.com\nyouni.im\nyounuokeji.cloud\nyouo.net\nyouol.com\nyouonbike.com\nyoupengcx.com\nyoupengw.com\nyoupin898.com\nyoupingame.com\nyoupinhaoche.com\nyoupinimg.com\nyoupinppt.com\nyoupinsanyue.com\nyoupintechs.com\nyoupinx.com\nyouplus.cc\nyoupont.net\nyoupuchina.com\nyoupumao.com\nyoupumao.xyz\nyouqiantu.com\nyouqichuyun.com\nyouqiong.net\nyouqiwu.com\nyouqizhan.com\nyouqo.com\nyouqoo.net\nyouqu.in\nyouqudao.com\nyouquhui.com\nyour-man.com\nyour360loans.com\nyour724sports.com\nyourbin.com\nyourcee.com\nyourchinagent.com\nyourcollect.net\nyourdream.cc\nyouren5.com\nyourjia.com\nyourongsj.com\nyourtion.com\nyourtravelyourchoice.com\nyouruitech.com\nyouscm.com\nyouseen.com\nyousengshe.com\nyousenjiaoyu.com\nyouser.cc\nyoushang.com\nyoushaohua.com\nyousheng.shop\nyoushenggz.com\nyoushenhudong.com\nyousheyoujia.com\nyoushibeike.com\nyoushifu.com\nyoushihui.cc\nyoushikoudai.com\nyoushixiu.com\nyoushop01.com\nyoushop02.com\nyoushop03.com\nyoushop04.com\nyoushop10.com\nyoushu.cc\nyoushuge.com\nyoushujian.com\nyousi.com\nyoustong.com\nyoutaidoors.com\nyoutaidu.com\nyoutao55.com\nyoutaojd.com\nyouthi.com\nyoutiandi.com\nyoutianli.com\nyoutianmetal.com\nyoutianz.com\nyoutibao.com\nyouto.club\nyoutoart.com\nyoutochat.com\nyoutoupiao.com\nyoutrans.net\nyoutu.com\nyoutube-dubbing.com\nyoutuzi.com\nyoutx.com\nyouuav.com\nyouuvs.com\nyouwanplay.com\nyouwawa.com\nyouwei-china.com\nyouwei.com\nyouweigroup.com\nyouweihui.com\nyouwo.com\nyouwoxing.net\nyouwu.today\nyouwusc.com\nyouxedu.com\nyouxi.com\nyouxi01.com\nyouxi377.com\nyouxi527.com\nyouxi528.com\nyouxi567.com\nyouxi8282.com\nyouxia.com\nyouxiacg.com\nyouxiagushi.com\nyouxiaju.com\nyouxiake.com\nyouxiake.net\nyouxiamotors.com\nyouxiangclub.com\nyouxiangyx.com\nyouxiaoge.com\nyouxiaohou.com\nyouxiaxiazai.com\nyouxibao.com\nyouxibaoku.com\nyouxibd.com\nyouxica.com\nyouxicdn.com\nyouxichaguan.com\nyouxicheng.net\nyouxicitang.com\nyouxidaxue.com\nyouxidr.com\nyouxidun.com\nyouxiduo.com\nyouxifan.com\nyouxigongchang.com\nyouxigt.com\nyouxigu.com\nyouxiguancha.com\nyouxigui.com\nyouxih.com\nyouxihezi.net\nyouxihun.com\nyouxiivf.com\nyouxila.com\nyouximt.com\nyouxin.com\nyouxingapp.com\nyouxiniao.com\nyouxinpai.com\nyouxinshi.com\nyouxinsign.com\nyouxipai.com\nyouxiping.com\nyouxiputao.com\nyouxiqiang.com\nyouxiqun.com\nyouxishuo.com\nyouxitexiao.com\nyouxituoluo.com\nyouxiuhui.com\nyouxiwangguo.com\nyouxiwugui.com\nyouxixf.com\nyouxixinzhi.com\nyouxixj.com\nyouxizhan.com\nyouxuan.com\nyouxuanan.com\nyouxuancdn.com\nyouxuandns.com\nyouxuangu.com\nyouxueke.com\nyouxuetong.com\nyouyacao.com\nyouyacheye.com\nyouyan.xyz\nyouyannet.com\nyouyantech.com\nyouyeetoo.com\nyouyegame.com\nyouyi-game.com\nyouyi800.com\nyouyicun.net\nyouyierp.com\nyouyigame.com\nyouyiguke.com\nyouyihuibk.com\nyouyijifen.com\nyouyijiu.com\nyouyiqi.com\nyouyiqiaogou.com\nyouyitape.com\nyouyitian.net\nyouyitms.com\nyouyiweizhan.com\nyouyiwms.com\nyouyix.com\nyouyixue.com\nyouyizhidao.com\nyouyo88.com\nyouyogame.com\nyouyong360.com\nyouyou.com\nyouyou001.com\nyouyou234.com\nyouyoufood.com\nyouyouwin.com\nyouyuan.com\nyouyudf.com\nyouyuegame.com\nyouyuela.com\nyouyuit.net\nyouyur.com\nyouyuwenhuay.com\nyouyuwo.com\nyouyy.com\nyouzack.com\nyouzan.com\nyouzanyun.com\nyouzhai.com\nyouzhan.org\nyouzhanjia.com\nyouzhao.com\nyouzhenhua.com\nyouzhi.net\nyouzhi99.com\nyouzhicai.com\nyouzhicn.com\nyouzhiwk.com\nyouzhixueyuan.com\nyouzhiying.com\nyouzhiyouxing.com\nyouzhou-knife.com\nyouzhu.com\nyouzhuan.com\nyouzi02.com\nyouzibuy.com\nyouzijie.com\nyouzijimu.com\nyouziku.com\nyouzikuaibao.com\nyouzipay.com\nyouzu.com\nyouzuanmy.vip\nyovisun.com\nyovocloud.com\nyovole.com\nyovyuan.com\nyowhale.com\nyowooa.com\nyoxiha.com\nyoximi.com\nyoxmail.com\nyoxuba.com\nyoxyok.com\nyoya.com\nyoybuy.com\nyoyiapp.com\nyoyiit.com\nyoyile.com\nyoyo007.com\nyoyo1900.com\nyoyo2008.com\nyoyoask.com\nyoyoer.com\nyoyojacky.com\nyoyojie.com\nyoyokko.com\nyoyoogo.com\nyoyosc.com\nyoyotown.com\nyoyou.com\nyoytang.com\nyoyucn.com\nyoyv.com\nyozodcs.com\nyozodoc.com\nyozodocs.com\nyozooffice.com\nyozosoft.com\nyozsc.com\nyozyn.com\nyp001.com\nyp007.net\nypank.com\nypattern.com\nypblkm.com\nypc-fc.com\nypfph.com\nypgyyq.com\nyph-shop.com\nyphbuy.com\nyphuifu.com\nypiao.com\nypicw.com\nypjc.cloud\nypjiameng.com\nypjsgl.com\nypkc.com\nypkegroup.com\nypky.net\nyplady.com\nyplog.net\nyplogistics.com\nyplsw.com\nypmail.work\nyppp.net\nypppt.com\nyprh.com\nypshengxian.com\nypshop.net\nypstech.com\nypwater.com\nypxiixs.xyz\nypyyjt.com\nypzdw.com\nypzhushou.com\nyq-zc.com\nyq2404.com\nyqacg.com\nyqb.at\nyqb.com\nyqb920.com\nyqbank.com\nyqbdt.com\nyqbimg.com\nyqbimg.net\nyqchjd.com\nyqcn.com\nyqcsbqxj.com\nyqcymj.com\nyqdtv.com\nyqelect.com\nyqfcw.net\nyqfml.com\nyqfoodec.com\nyqfxw.net\nyqh.com\nyqh1969.com\nyqh5.com\nyqhlm.com\nyqhzz.com\nyqjtgs.com\nyqk889.com\nyqk8ku.com\nyqkddm.com\nyqkk.link\nyqlzq.com\nyqmb001.com\nyqmengyou.com\nyqmh.com\nyqmls.com\nyqmoybz.com\nyqms.net\nyqmsn.com\nyqn.com\nyqphh.com\nyqqqbm.com\nyqrc.com\nyqrcw.com\nyqrtv.com\nyqsbz.com\nyqslmall.com\nyqsn.com\nyqtg.cc\nyqtkgzbk.com\nyqtsgg.com\nyqw188.com\nyqwfpy.com\nyqwxw.cc\nyqwyx.xyz\nyqxiuyoung.com\nyqxs.cc\nyqxsg.cc\nyqxsge.cc\nyqxxjy.com\nyqy021.com\nyqybzhan.com\nyqyu.com\nyqzww.cc\nyqzww.la\nyqzww.net\nyqzwww.com\nyqzxx.net\nyr-info.com\nyr17.net\nyr3.com\nyra2.com\nyracc.com\nyrapp.net\nyrcbank.com\nyrdart.com\nyretc.com\nyrglass.com\nyrgx168.com\nyrhct.com\nyrmpay.com\nyrobot.com\nyrom.net\nyrtgame.com\nyrtyyds.com\nyruan.com\nyrucd.com\nyrw.cc\nyrw.com\nyrwy.com\nyrxitong.com\nyrxsw.com\nyryz.com\nyrz.name\nyrzjw.com\nys-fj.com\nys-oss.xin\nys.cc\nys001.com\nys0431.net\nys121.com\nys133.com\nys137.com\nys168.com\nys1898.com\nys2345.com\nys4fun.com\nys7.com\nys720.com\nys8.com\nys991.com\nysaedesign.com\nysali.com\nysbopet.com\nysbtv.net\nysbz168.com\nyscase.com\nysch.cc\nysclass.net\nyscq.com\nyscro.com\nysczw.com\nysdq8.com\nysdwe.asia\nysedu.com\nysej.com\nysemi.com\nysepan.com\nysepay.com\nysext.com\nysfog.com\nysgang.com\nysgfood.com\nysghh.com\nysgtg.com\nysgushi.com\nyshp.net\nyshshuimitao.com\nyshsports.com\nyshw1.com\nyshzjt.com\nysicing.net\nysidcz.com\nysiis.com\nysirv.com\nysjcyxgs.com\nysjdaijia.com\nysjf.com\nysjianzhan.com\nysjkbk.com\nyskcsj.com\nyskjz.com\nyskjzj.com\nyskxjy.com\nyslcw.com\nyslpaint.com\nyslqo.com\nyslw.com\nyslyhr.com\nyslzc.com\nysmeet.com\nysmiji.com\nysmine.com\nysmir.net\nysn.cc\nysnews.net\nysod.com\nysok.net\nysol.com\nysosuo.com\nysplay.com\nysrencai.com\nysrh.com\nysrzdb.com\nysslc.com\nyssp88.com\nyssql.com\nyssrmyy.com\nysstech.com\nysszzs.com\nyst100.net\nystan.com\nystb.com\nystbds.com\nysten.com\nystencdn.com\nysts.cc\nystsx.com\nystzzy.com\nysug.com\nysupan.com\nysw1950.com\nysw68.com\nyswebportal.cc\nyswh.com\nyswlgame.com\nyswswkj.com\nyswu.net\nyswyyds.com\nysx9999.com\nysxapp.com\nysxs8.com\nysxswz.com\nysxts.com\nysxyhtz.com\nysxzls.com\nysys.com\nysyycv.com\nyszpwatch.com\nyszx99.com\nyszxx.net\nyszyun.com\nyt-ma.com\nyt-taili.com\nyt-xinpeng.com\nyt0.cc\nyt1998.com\nyt2.net\nyt69.com\nyt698.com\nyt98w.com\nytaotao.net\nytaxx.com\nytbainakeji.com\nytbbs.com\nytbfilm.com\nytbt.cc\nytcables.com\nytcbh.com\nytccr.com\nytchangyang.com\nytcj.com\nytcnc.net\nytcutv.com\nytdaily.com\nytdcloud.com\nyte1.com\nytecn.com\nytedi.com\nyteng.net\nytesting.com\nytf8888.com\nytfcjy.com\nytg666.com\nytgas.com\nytghnb.com\nytgos.com\nythairui.com\nytholidayplaza.com\nythospital.com\nythouse.com\nythzg.com\nytjcpj.com\nytjiage.com\nytjlc.net\nytjob.com\nytjpkj.com\nytjqjt.com\nytjunyue.com\nytkiewvf.cc\nytkj2010.com\nytlh120.com\nytlvbao.com\nytmachinery.net\nytmc.press\nytmedia.tv\nytmgz.com\nytmingju.com\nytnetgame.com\nytnstone.com\nyto-jsd.com\nyto-lgs.com\nyto-lgs.net\nyto.vip\nyto.xin\nyto56test.com\nytocargo.com\nytoexpress.com\nytoglobal.com\nytogroup.com\nytoholding.com\nytokj.com\nytokj.net\nytoluohan.com\nytoluohan.net\nytoluohan.xin\nytop8.com\nytphq.com\nytport.com\nytpowder.com\nytpp.com\nytpu.com\nytqh-electric.com\nytrain.com\nytrcw.com\nytrdc.com\nytrlzyw.com\nytrmtzx.com\nyts88.com\nytsanchuan.com\nytsense.com\nytsexrb.com\nytsfc.com\nytshipin.com\nytsyy.com\nytszg.com\nyttxcs.com\nytud.net\nytuqy.com\nytusmart.com\nytwater.com\nytxedu.com\nytxinhai.com\nytxinyan.com\nytxsc.com\nytxww.com\nytyaoye.com\nytyhdyy.com\nytyz.net\nytyz.org\nytzhihui.com\nytzq.com\nytzww.com\nyu-electronics.net\nyu163.com\nyu4l.com\nyu72.com\nyu7l.com\nyuaigongwu.com\nyuaiweiwu.com\nyuan2808.com\nyuan7i.com\nyuanabsorber.com\nyuanbaobaoxian.com\nyuanbaokc.com\nyuanbaotaoche.com\nyuanbei.biz\nyuanben.io\nyuanbin.me\nyuancangipr.com\nyuancdn.com\nyuancefund.com\nyuanchang888.com\nyuanchengroup.com\nyuanchuangyinyue.com\nyuancoder.com\nyuanda-fm.com\nyuandacn.com\nyuandaocn.com\nyuandi.com\nyuandian.club\nyuandiancredit.com\nyuandongsl.com\nyuanf56.com\nyuanfen.icu\nyuanfeng021.com\nyuanfeng1.com\nyuanfudao.biz\nyuanfudao.com\nyuanfudao.ws\nyuanfudaoschool.com\nyuanfusc.com\nyuangongbao.com\nyuanhaitaiji.com\nyuanhangqiche.com\nyuanhangzyt.com\nyuanhechem.com\nyuanhengyi.com\nyuanheyaoye.com\nyuanhua.com\nyuanhuixinhai.com\nyuanjingang.com\nyuanjingss.com\nyuanjisong.com\nyuanjoy.com\nyuanlai.com\nyuanlei.net\nyuanley.com\nyuanlian365.com\nyuanlin.com\nyuanlin365.com\nyuanlin8.com\nyuanlvkeji.com\nyuanma.net\nyuanmadian.com\nyuanmait.com\nyuanmajiaoyiw.com\nyuanmatao.com\nyuanmengyouxuan.com\nyuano.cc\nyuanpanguoji.com\nyuanqiao.net\nyuanqiao.pw\nyuanqilt.com\nyuanqingsh.com\nyuanqisenlin.com\nyuanrenbang.com\nyuanrengu.com\nyuanrenxue.com\nyuansfer.com\nyuanshen.com\nyuanshi-sec.com\nyuanshichang.com\nyuanshuflow.com\nyuansikeji2021.com\nyuansoti.com\nyuansouti.biz\nyuansouti.com\nyuant.net\nyuantaobgjj.com\nyuanteng.net\nyuantest.com\nyuantiku.biz\nyuantiku.com\nyuantiku.xyz\nyuantongyizhan.com\nyuantoushuo.com\nyuantu.info\nyuantuedu.com\nyuantujun.com\nyuantutech.com\nyuanu.com\nyuanvip.shop\nyuanweish.com\nyuanwind.com\nyuanwsk.com\nyuanxianmedia.com\nyuanxinbaoxian.com\nyuanxinjituan.com\nyuanyaedu.com\nyuanyangbj.com\nyuanyangcoffee.com\nyuanyangmed.com\nyuanyeer.com\nyuanyoumao.com\nyuanyoutao.com\nyuanyubusiness.com\nyuanzhanapp.com\nyuanzhexi.com\nyuanzhi.com\nyuanzhihao.life\nyuanzhiyijiantong.com\nyuanzidai.com\nyuanzige.com\nyuanzipower.com\nyuanziyan.com\nyuanzun.fun\nyuaoq.com\nyuapt.com\nyubaike.com\nyubangweb.com\nyuboinfo.com\nyuboqj.com\nyucekj.com\nyucezhijia.com\nyuchai.com\nyuchaicd.com\nyuchaidiesel.com\nyuchainev.com\nyuchainz.com\nyuchaipg.com\nyuchaizm.com\nyuchenpharm.com\nyuchenw.com\nyuchofoodmachine.com\nyuchuan.org\nyuchuantech.com\nyuci998.com\nyucoolgame.com\nyucui.org\nyucunkeji.com\nyudamedical.com\nyudeglobal.com\nyudiangame.vip\nyudiaomingjia.com\nyudiu.com\nyudoauto.com\nyudouyudou.com\nyuduxx.com\nyue-grh.com\nyue-tao.com\nyue365.com\nyue7.com\nyuebai.tv\nyueban.com\nyueban.net\nyuebao.ltd\nyuebei.vip\nyuebeist.com\nyuebie.com\nyueblx.com\nyuebooemt.com\nyuecdn.net\nyuecheng.com\nyuechengcn.com\nyuecong.club\nyueda.com\nyuedainvest.com\nyuedaoec.com\nyuedarzzl.com\nyuedatc.com\nyuedianedu.com\nyuedisk.com\nyuedsk.com\nyuedu.pro\nyuedu88.com\nyuedufang.com\nyueduji.com\nyuedujiayuan.com\nyuedunovel.com\nyueduwen.com\nyueduwu.com\nyueduwuxianpic.com\nyueduyun.com\nyuegongyutu.com\nyuegowu.com\nyuegui.shop\nyueguisuchong.com\nyuehaifeed.com\nyuehaowy.com\nyueimg.com\nyueji.com\nyuejiewangluo.com\nyuejikeng.com\nyuejob.com\nyuejuanbao.com\nyuejuwang.com\nyuekenet.com\nyuekesoft.com\nyuekesoft.net\nyuekeyun.com\nyuelanxinghe.com\nyueliangshi.com\nyuelongchina.com\nyuelongdzc168.com\nyueloo.com\nyuelu.net\nyuelun.com\nyuelvxing.com\nyuemagroup.com\nyueme.tv\nyuemei.com\nyuemicn.com\nyueniuzq.com\nyuenongren.com\nyuenshui.com\nyuenwooping-truelegend.com\nyuenyled.com\nyuepaijia.com\nyueqi.com\nyueqiji.com\nyueqikan.com\nyueqingchayuan.com\nyueqiweixiu.com\nyueqiyou.com\nyueque.com\nyuequtech.com\nyuer.com\nyuerbao.com\nyueren123.com\nyuerenjt.com\nyueru.com\nyuerugou.com\nyuesekaer.com\nyueserve.com\nyueseyuewei.com\nyueshenggame.com\nyueshifengyin.net\nyueshitv.com\nyuesuoping.com\nyuetengiot.com\nyueting.net\nyuetingapp.com\nyuetj.com\nyuetu.tech\nyuetuvip.com\nyuetuvip.net\nyuewanggd.com\nyuewei007.com\nyueweimusic.com\nyuewen.com\nyuexiamen.com\nyuexiangpin.com\nyuexiangspace.com\nyuexindianqi.com\nyuexing.com\nyuexingchem.com\nyuexinship.com\nyuexirc.com\nyuexiren.com\nyuexiu-finance.com\nyuexiu.com\nyuexiudevelopment.com\nyuexiufoods.com\nyuexiuleasing.com\nyuexiuproperty.com\nyuexunedu.com\nyuexunfanyi.com\nyuexw.com\nyueya.net\nyueyaa.com\nyueyan365.com\nyueyangshop.com\nyueyangyy.com\nyueyat.net\nyueye7.com\nyueyear.com\nyueyouxs.com\nyueyq.com\nyueyu114.com\nyueyuanzhiye.com\nyueyues.com\nyueyueworld.com\nyueyueyd.com\nyueyuez.com\nyueyundns.com\nyueyuzhushou.com\nyuezeyi.com\nyuezhicn.com\nyuezhiding.com\nyuezhinan.com\nyufanlogistics.com\nyufanwei.com\nyufeng05.com\nyufenggroup.com\nyufenjiameng.com\nyuflc.com\nyufuid.com\nyufuid.net\nyugasun.com\nyugenmed.com\nyugew.com\nyuglf.com\nyugongw.com\nyugudz.com\nyuguimedia.com\nyuguo.com\nyuguowang.net\nyugusoft.com\nyuguz.com\nyuhaids.com\nyuhaiyiya.com\nyuhaochemical.com\nyuhaotime.com\nyuhaozhixing.com\nyuheii.com\nyuhein.com\nyuhelaw.com\nyuhengcheng.com\nyuhocare.com\nyuhongchem.com\nyuhongpharm.com\nyuhou.com\nyuhougame.com\nyuhsoft.com\nyuhuagu.com\nyuhuaholding.com\nyuhuanghuagong.com\nyuhucoldchain.com\nyuhuijob.com\nyuhx.com\nyui06161shga.com\nyui06171shga.com\nyujia.com\nyujiahui.com\nyujianpay.com\nyujianxiaomian.com\nyujiawuliu.com\nyujiefs.com\nyujifruit.com\nyujingkj.com\nyujiu.vip\nyujpa.com\nyujunjie.com\nyujunren.com\nyukaidi.com\nyukaiprecision.com\nyukeinfo.com\nyukeweb.com\nyukexinchem.com\nyukicat.net\nyukicomic.com\nyukiovo.com\nyukuai.com\nyukxw.com\nyulangair.com\nyule114.com\nyule263.com\nyuledaily.com\nyulefm.com\nyulehezi.com\nyuleie.com\nyulejiaodian.com\nyulekan.com\nyulekoudai.com\nyuleqiu.com\nyulhe.com\nyuli.be\nyuliancn.com\nyuliang-sh.com\nyulicdn.com\nyulinapp.com\nyulincard.com\nyulindxgjj.com\nyulinedu.net\nyulingtianxia.com\nyulinhuaran.com\nyulinjue.com\nyulinqj.com\nyulins.com\nyulinshidefu.com\nyulinyw.com\nyuliqx.com\nyulong.com\nyulongdt.com\nyulongjun.com\nyulongpc.com\nyulongsteelpipe.com\nyulongtour.com\nyulongwanski.com\nyuloo.com\nyulore.com\nyulorepages.com\nyulu1.com\nyulu99.com\nyuluju.com\nyuluyao.com\nyulv.net\nyumao.com\nyumaochuhai.com\nyumaoclub.com\nyumaoshu.com\nyumchina.com\nyumi.cc\nyumi.com\nyumingguwen.com\nyumingyouhui.com\nyummy.tech\nyumstone.com\nyun-ac.com\nyun-app.net\nyun-dns.com\nyun-gu.com\nyun-health.com\nyun-idc.com\nyun-img.com\nyun-jinrong.com\nyun-jintong.com\nyun-kai.com\nyun-live.com\nyun-qu.com\nyun-wp.com\nyun123.com\nyun5.vip\nyun61.com\nyun88.com\nyunadmins.com\nyunalias.com\nyunannet.com\nyunaq.com\nyunarm.com\nyunassess.com\nyunaw.com\nyunba.io\nyunban.com\nyunbaofei.com\nyunbaolai.com\nyunbaoming.com\nyunbei.com\nyunbiao.tv\nyunbiaowulian.com\nyunbiaozhun.com\nyunbiji.com\nyunbisai.com\nyunbohealth.com\nyunbook.vip\nyunbu.me\nyunbugame.com\nyunbuzhan.com\nyuncai5.com\nyuncaioo.com\nyuncdn.bid\nyuncdn123.com\nyuncdn263.com\nyuncdndun.com\nyunce.work\nyuncechina.com\nyunceng.com\nyunchelogistics.com\nyuncheng.com\nyunchexing.com\nyunchip.com\nyunchonglife.com\nyunchongmob.com\nyunchou.com\nyunchuan.info\nyuncii.com\nyuncitys.com\nyuncloudauth.com\nyuncname.com\nyuncode.net\nyuncuntu.com\nyund.tech\nyunda56.com\nyundaex.com\nyundagongyi.com\nyundagroup.com\nyundalog.com\nyundaltl.com\nyundangan.com\nyundangnet.com\nyundaomen.com\nyundasys.com\nyunde.net\nyundianjia.com\nyundianseo.com\nyundiantech.com\nyundingdun.com\nyundongfang.com\nyundonghao.com\nyundongit.com\nyundousoft.com\nyundui.cc\nyunduimedia.com\nyundun.com\nyundun.shop\nyunduncc.com\nyunduncdn.com\nyunduncdns.com\nyunduncname.com\nyundunddos.com\nyundundns.com\nyunduns.com\nyundunwaf.com\nyundunwaf1.com\nyundunwaf2.com\nyundunwaf3.com\nyundunwaf4.com\nyundunwaf5.com\nyunduocrm.com\nyunduoke.net\nyunduoketang.com\nyunduolp.com\nyundzh.com\nyuneach.com\nyunerba.com\nyunews.net\nyunexam.com\nyunexpress.com\nyunfabiao.com\nyunface.com\nyunfalv.com\nyunfan.com\nyunfan0739.com\nyunfancdn.com\nyunfancdn.net\nyunfandns.com\nyunfangtan.com\nyunfanka.com\nyunfanyouxi.com\nyunfei89.com\nyunfeihudong.com\nyunfeitech.com\nyunfeiyang.com\nyunfengdie.com\nyunfutang8.com\nyunfutech.com\nyunfuwuqiba.com\nyungangbj.com\nyungao-ssp.com\nyungao.mobi\nyungbang.com\nyungengxin.com\nyungongchang.com\nyungotec.com\nyungou618.com\nyungouos.com\nyungousj.net\nyungpu.com\nyungu.org\nyunguajibao.com\nyungujia.com\nyunhaicangshu.com\nyunhaike.com\nyunhaiqiao.com\nyunhaisteel.com\nyunhaoka.com\nyunhaoren.com\nyunhe518.net\nyunhedata.com\nyunhehudong.com\nyunheit.com\nyunhesanwan.com\nyunhetong.com\nyunhou.com\nyunhuangroup.com\nyunhuaq.com\nyunhuasheji.com\nyunhuashu.com\nyunhuijing.com\nyunhulu.org\nyunhuotong.net\nyunifang.com\nyunify.com\nyunio.com\nyunip.com\nyunipo.com\nyunji.work\nyunji.xin\nyunjian.com\nyunjian.net\nyunjiasu-cdn-dnssec.net\nyunjiasu-cdn.com\nyunjiasu-cdn.net\nyunjiasu-dns.com\nyunjiasu-dns.net\nyunjiasu-test.com\nyunjiasu.cc\nyunjiasu360.com\nyunjiasucdn.info\nyunjiasucdn.net\nyunjiasudns.com\nyunjiasudns.net\nyunjiasupreview.com\nyunjiasussl.com\nyunjiazheng.com\nyunjichaobiao.com\nyunjie.art\nyunjiemi.net\nyunjifarm.com\nyunjiglobal.com\nyunjing720.com\nyunjingdian.net\nyunjinggo.com\nyunjinginc.com\nyunjitele.com\nyunjiweidian.com\nyunjix.com\nyunjuwuliu.com\nyunkaiguan.com\nyunkangdoctor.com\nyunkanghealth.com\nyunkanpan.com\nyunkawulian.com\nyunkd.com\nyunke.com\nyunkejituan.com\nyunken.com\nyunketop.com\nyunkezan.com\nyunkuaimai.com\nyunkushop.com\nyunlaiwu.com\nyunlangtuanjian.com\nyunlie.net\nyunlietou.com\nyunliketech.com\nyunlinghang.com\nyunlitz.com\nyunlsp.com\nyunlucn.cc\nyunma99.com\nyunmai.com\nyunmayi.com\nyunmc.vip\nyunmd.net\nyunmeipai.com\nyunmell.com\nyunmengdata.com\nyunmianqian.com\nyunmoseo.com\nyunmoxing.com\nyunn-tech.com\nyunna.me\nyunnan.vip\nyunnancoffee.org\nyunnandns.com\nyunnanjun.com\nyunnanlong.com\nyunnanuu.com\nyunnao.com\nyunneidongli.com\nyunos-inc.com\nyunos-tv.com\nyunos.com\nyunpan.com\nyunpansou.cc\nyunpanx.com\nyunparking.cloud\nyunpay.cc\nyunpei.com\nyunpian.com\nyunpiao.net\nyunqi.org\nyunqi2050.com\nyunqi6.com\nyunqiba.com\nyunqifly.com\nyunqiju.com\nyunqikecrm.com\nyunqishi.net\nyunqishi8.com\nyunqishuju.com\nyunqiyqh.com\nyunque360.com\nyunquna.com\nyunrang.fun\nyunrenshi.net\nyunrg.com\nyunrongu.com\nyunruicloud.com\nyunruikj.com\nyunruizz.com\nyunsd.net\nyunser.com\nyunshan.net\nyunshangdian.com\nyunshangguangdong.com\nyunshanghangzhou.com\nyunshangkj.com\nyunshangnc.com\nyunshangshou.com\nyunshangsuzhou.com\nyunshangxuzhou.com\nyunshangzhejiang.com\nyunshanit.com\nyunshanmedical.com\nyunshanmeicai.com\nyunsheng.com\nyunsheng999.com\nyunshibuluo.com\nyunshicloud.com\nyunshiketang.xyz\nyunshow.com\nyunshunxx.com\nyunshuren.com\nyunshuwh.com\nyunsiya.com\nyunsom.com\nyunsong.com\nyunsou168.com\nyunssl.com\nyunsuan.org\nyunsuanzi.com\nyunsuo.com\nyuntaigo.com\nyuntask.com\nyuntemai.com\nyunteng-group.com\nyuntiancloud.com\nyuntianti.com\nyuntianxia.com\nyuntingbo.com\nyuntingiot.com\nyuntisoft.com\nyuntongauto.com\nyuntongbu.com\nyuntongcloud.com\nyuntongshuke.com\nyuntongxun.com\nyuntongzy.com\nyuntop.com\nyuntsg.com\nyuntu.io\nyuntue.com\nyuntuiweishang.com\nyuntuoguan.cc\nyuntus.com\nyuntus.net\nyuntust.com\nyuntuys.com\nyuntyfilter.com\nyunupay.com\nyunverify.com\nyunvm.com\nyunwei8.com\nyunweibang.com\nyunweipai.com\nyunweiwl.com\nyunwenkeji.com\nyunwenxue.com\nyunwins.com\nyunwuxian.net\nyunxi.cc\nyunxi.net\nyunxi.tv\nyunxi10.com\nyunxiacn.com\nyunxianchang.com\nyunxiao.com\nyunxin123.com\nyunxin163.com\nyunxinapi.com\nyunxindai.com\nyunxindns.com\nyunxinfa.com\nyunxinfw.com\nyunxing123.com\nyunxingslb.com\nyunxinhi.com\nyunxinhy.com\nyunxinrtc.com\nyunxinshi.com\nyunxinsvip.com\nyunxinsvr.com\nyunxinvcloud.com\nyunxinvideo.com\nyunxiren.com\nyunxish.com\nyunxiu.com\nyunxs.com\nyunxuetang.com\nyunxunmedia.com\nyunxya.com\nyunyangwang.com\nyunyazu.com\nyunyi-china.com\nyunyi-dd.com\nyunyibiji.com\nyunyichong.com\nyunyihudong.com\nyunyin.org\nyunying001.com\nyunyingbiotech.com\nyunyingdashu.com\nyunyingketang.com\nyunyingmiao.com\nyunyingpai.com\nyunyingxbs.com\nyunyingxuetang.com\nyunyis.com\nyunyiyuan.com\nyunyize.com\nyunyoufeitian.com\nyunyouni.com\nyunyousj.com\nyunysr.com\nyunyu123.com\nyunyuba.com\nyunyueqiji.com\nyunyunvip.com\nyunyuwuyou.com\nyunzazhi.com\nyunzehj.com\nyunzhan365.com\nyunzhangfang.com\nyunzhanggui.net\nyunzhanghu.com\nyunzhanxinxi.com\nyunzhanyou.com\nyunzhifankeji.net\nyunzhijia.com\nyunzhirencai.com\nyunzhisec.com\nyunzhitai.com\nyunzhixiyou.com\nyunzhizao.net\nyunzhonghe.com\nyunzhu100.com\nyunzhuan.com\nyunzhuangbei.com\nyunzhuxue.com\nyunzitraining.com\nyunzmall.com\nyunzongnet.com\nyunzuji.vip\nyunzujia.com\nyunzuoye.net\nyunzz.net\nyuoucn.com\nyupao.com\nyupaowang.com\nyupeiholdings.com\nyupinny.com\nyupoo.com\nyupu.com\nyuqianshu.com\nyuqiao.com\nyuqiaolong.com\nyuqinpin.com\nyuquanhosp.com\nyuque.com\nyuren.org\nyuriimg.com\nyurongoptical.com\nyurun.com\nyusa.me\nyusainorthwest.com\nyusanmao12345.store\nyushanfang.com\nyushangmao.com\nyushengny.com\nyushengtang.com\nyushexuetang.com\nyushics.com\nyushin88.com\nyushiyan.net\nyushiyuan.com\nyushu5.com\nyushunews.com\nyusi.com\nyusi.tv\nyusi123.com\nyusii.com\nyusii.net\nyusinvestment.com\nyusiyy.com\nyusmnfgh.vip\nyusongec.com\nyusuan.com\nyusunjewelry.com\nyusuusnw.com\nyusxz.com\nyutai365.com\nyutainews.com\nyutaoyouxi.com\nyuteng.site\nyutennet.com\nyutian.cc\nyutianedu.com\nyutonad.com\nyutong.com\nyutongplay.vip\nyutongzyc.com\nyuttz.com\nyutuwo.com\nyuucn.com\nyuudnn.com\nyuwan-game.com\nyuwang.com\nyuwangcn.com\nyuwanjianshe.com\nyuwanyouxi.com\nyuweikuijianzhan.com\nyuweitek.com\nyuweiyanwo.com\nyuwell.com\nyuwellgroup.com\nyuwen.net\nyuwen123.com\nyuwen360.com\nyuwenchaoshi.com\nyuwenmi.com\nyuwennews.com\nyuwenxiandaihua.com\nyux.team\nyuxianall.com\nyuxiangwang0525.com\nyuxianxing.com\nyuxiaogroup.com\nyuxiaor.com\nyuxiaotuo.com\nyuxicorrosion.com\nyuxinews.com\nyuxinoulogistics.com\nyuxipark.com\nyuxitech.com\nyuyangtec.com\nyuyaoclub.com\nyuyaotop.com\nyuyejt.com\nyuyicai.com\nyuyin.tv\nyuyinct.com\nyuyinfanyi.com\nyuyingufen.com\nyuyoung32.com\nyuyouyouxi.com\nyuyu.com\nyuyue111.com\nyuyue27.com\nyuyuecoat.com\nyuyueshop.com\nyuyuetec.com\nyuyuetui.com\nyuyueweb.com\nyuyuezhiyangji.com\nyuyunkj.com\nyuyuntang.com\nyuyuntech.com\nyuzeli.com\nyuzeli.net\nyuzhengzixun.net\nyuzhenhai.com\nyuzhicaiexpo.com\nyuzhiguo.com\nyuzhike.com\nyuzhong.biz\nyuzhong.net\nyuzhongxxw.com\nyuzhoua.com\nyuzhouwan.com\nyuzhouyiyuan.com\nyuzhua.com\nyuzhuan.com\nyuzhulin.com\nyuzhuw.com\nyuzijiaoyu.com\nyuzmshanghai.org\nyuzone.net\nyuzua.com\nyuzundaojia.com\nyvkkqfy7m.shop\nyvrdream.com\nyvv.in\nyvzfgigpiwmofux.com\nyw11.com\nyw160.com\nyw2005.com\nywart.com\nywbank.com\nywcbs.com\nywclxp.com\nywdier.com\nywditan315.com\nywei.org\nyweisugar.com\nywfby.com\nywgc.net\nywgd.com\nywhack.com\nywhqs.com\nywies-bj.com\nywies-gz.com\nywies-sh.com\nywies-shpd.com\nywindex.com\nywinf.com\nywint.net\nywit.xyz\nywjinfabag.com\nywkefu.com\nywky.org\nywlandport.com\nywnds.com\nywnz.com\nywopt.com\nywork.me\nywpark.net\nywputxks.com\nywshouyou.com\nywshouyou.net\nywsoftware.com\nywstsb.com\nywt.com\nywtd.xyz\nywtds.com\nywurl.com\nywvzxeau.com\nywwg.net\nywwl.com\nywwpay.com\nywxue.com\nywxww.net\nywyanxing.com\nywyishi.com\nywziwei.com\nywzt.org\nywzz.com\nyx-g.com\nyx-s.com\nyx-s.net\nyx0599.com\nyx090.com\nyx12345.com\nyx1312.com\nyx192.com\nyx231.com\nyx643.com\nyx7088.com\nyx74.com\nyx7507.com\nyx8tya36v8bp.com\nyx93.com\nyx988.com\nyx99.com\nyxacc6.com\nyxad.com\nyxaz.com\nyxbabe.com\nyxbao.com\nyxbhhbkj.com\nyxbk.com\nyxbox91.com\nyxbrand.com\nyxc.hk\nyxcal.com\nyxcax.com\nyxcc.net\nyxcity.com\nyxcustom.com\nyxcxfw.com\nyxdaily.com\nyxdd.com\nyxdh.com\nyxdimg.com\nyxdinghuo.com\nyxdmgame.com\nyxdou.com\nyxdown.com\nyxdr.com\nyxduo.com\nyxdwj.com\nyxecg.com\nyxeht.com\nyxen.net\nyxepqcbc.com\nyxflzs.com\nyxfshop.com\nyxfw.com\nyxfwai.com\nyxgames.fun\nyxgcx.com\nyxgczx.com\nyxgf.net\nyxgxbike.com\nyxgxw.com\nyxgxz.com\nyxgzs.com\nyxhao.com\nyxhapi.com\nyxhenan.com\nyxhhdl.com\nyxhhr.com\nyxhi.com\nyxhimg.com\nyxhjgs.com\nyxholding.com\nyxhqj.com\nyxhy.asia\nyxhyu.com\nyxi.cc\nyxiangzu.com\nyxiannetgz.com\nyxianypin.com\nyxid.net\nyxielts.com\nyxilogistics.com\nyximgs.com\nyxin18.com\nyxinbao.com\nyxintent.com\nyxit.net\nyxixy.com\nyxjia.com\nyxjjdby.com\nyxjkhb.com\nyxjob.net\nyxjs.org\nyxjsjg.com\nyxjuren.com\nyxjyy.net\nyxk120.com\nyxkfw.com\nyxkjlcd.com\nyxkxyghx.org\nyxlaba.com\nyxlady.com\nyxlady.net\nyxle.net\nyxlele.com\nyxlink.com\nyxlmdl.net\nyxlqge.com\nyxlsj.com\nyxm.com\nyxmarketing01.com\nyxmcu.com\nyxmxc.com\nyxn.fun\nyxnu.net\nyxnxz.com\nyxool.com\nyxopt.com\nyxou.com\nyxph.com\nyxpk.net\nyxpms.com\nyxptfs.com\nyxqiche.com\nyxrb.net\nyxrcw.com\nyxrj.com\nyxsc33.com\nyxsea.com\nyxsgame.com\nyxsj.net\nyxsos.com\nyxss.com\nyxssp.com\nyxsxhj.com\nyxt-tattoo.com\nyxt.com\nyxtidc.com\nyxtk.xyz\nyxttzb.com\nyxtvg.com\nyxuankeji.com\nyxun.net\nyxwh5.com\nyxwic.com\nyxwsgame.com\nyxx-china.com\nyxxgame.com\nyxxurl.com\nyxxzbox.com\nyxybb.com\nyxydns.com\nyxylbz.com\nyxyy33.com\nyxyzjx.com\nyxz.me\nyxzcemet.com\nyxzd.info\nyxzggame.com\nyxzhi.com\nyxzoo.com\nyxzp.net\nyxzq.com\nyxzu.com\nyxzxgy.com\nyxzzd.com\nyy.com\nyy11.com\nyy138.com\nyy1986.com\nyy2169.com\nyy2hd.com\nyy365.com\nyy4080.com\nyy502.com\nyy520.com\nyy591.com\nyy845.com\nyy960.com\nyyarea.com\nyyblly.com\nyybnet.net\nyybox.cc\nyycec.com\nyyclouds.com\nyyclub.org\nyyclub.work\nyycoin.com\nyycqc.com\nyycqfw.com\nyyctrade.com\nyyczxt.com\nyydbzz.com\nyydcs.com\nyyddss.vip\nyydl-china.com\nyyds.co\nyyds.pink\nyyds.space\nyydsmh.com\nyydsok.com\nyydszp.com\nyydy.com\nyydzh.com\nyyearth.com\nyyej.com\nyyestar.com\nyyets.com\nyyfax.com\nyyfdcw.com\nyyfqm.com\nyyfunning.com\nyyg.com\nyyg120.com\nyyg7.com\nyygamedev.com\nyyge.com\nyygold.com\nyygongzi.com\nyygrammar.com\nyyh78.com\nyyha168.com\nyyhao.com\nyyhh.com\nyyhn365.com\nyyhybz.com\nyyi100.com\nyyijt.com\nyyixx.com\nyyizu.com\nyyjingyan.com\nyyjxkj.com\nyyjzt.com\nyyk100.com\nyykj.site\nyykj2003.com\nyykj8775.com\nyykpx.com\nyylending.com\nyylivens.com\nyylm.org\nyymedias.com\nyyming2.com\nyymoban.com\nyynetwk.com\nyynykj.com\nyyouren.com\nyyoz.com\nyypf-china.com\nyypjyds.com\nyypt.com\nyyq.com\nyyquan.vip\nyyqyweb.com\nyyqyyyy.com\nyyrc.com\nyyrec.com\nyyrenting.com\nyyrjd.net\nyyrtv.com\nyysf.cc\nyyshangfu.com\nyystatic.com\nyysweb.com\nyyszfsxx.com\nyyszq.com\nyytad.com\nyytcdn.com\nyytek.com\nyytfood.com\nyytiflytek.com\nyytingli.com\nyyuap.com\nyywd.com\nyywlsj.com\nyywords.com\nyyws.net\nyywsb.com\nyywsbjb.com\nyywszzs.com\nyywt.online\nyywx888.com\nyywz123.com\nyywzw.com\nyyx.com\nyyxfilm.com\nyyxfplayer.com\nyyxmgl.com\nyyxsen.com\nyyxtao.com\nyyxx100.com\nyyxxgame.com\nyyxxgameyw.com\nyyxyjt.com\nyyy1389.com\nyyyeee.com\nyyyisp.com\nyyylll.com\nyyymvp.com\nyyyncp.com\nyyyqkq.com\nyyyqm.com\nyyyxbl.com\nyyyy.games\nyyyyy.run\nyyz100.com\nyyzb-live.com\nyyzdjd.com\nyyzdm.com\nyyzf.com\nyyzf.vip\nyyzls.com\nyyzqta.com\nyyzqtb.com\nyyzsoft.com\nyyzw.com\nyyzx.org\nyyzxcj.com\nyyzy-play.vip\nyyzyytj.com\nyyzzqk.com\nyyzzsem.com\nyz-iot.com\nyz-kjjt.com\nyz-li.com\nyz-machinery.com\nyz-proton.com\nyz-show.com\nyz-xd.com\nyz0752.com\nyz168.cc\nyz2pp.com\nyz2y.com\nyz360.cc\nyz3c.com\nyz3l.com\nyz4l.com\nyzajz.com\nyzbank.com\nyzbhn.work\nyzbo.tv\nyzbpro.com\nyzbqzx.net\nyzbsytl.com\nyzceg.com\nyzckjt.com\nyzcn.net\nyzcnet.com\nyzcrown.net\nyzcsoft.com\nyzcxx.com\nyzcyj.net\nyzcyjy.com\nyzcyts.com\nyzdfyy.com\nyzdhxx.com\nyzdir.net\nyzdjkcy.com\nyzdn.net\nyzdryer.com\nyzdx99.com\nyzdxnews.com\nyzdyhwh.com\nyzeco.com\nyzej.com\nyzemd.com\nyzfang.com\nyzfbgjj.com\nyzfc8.com\nyzfcdn.com\nyzfchat.com\nyzfdc.net\nyzfjy.com\nyzfrkf.com\nyzftpx.com\nyzfybj.com\nyzgcsj.com\nyzgcyy.com\nyzggdj.com\nyzgjgs.com\nyzgnet.com\nyzgttm.com\nyzgzx.com\nyzh.li\nyzhbw.net\nyzhcloud.com\nyzhdyy.com\nyzhejin.com\nyzhi.cc\nyzhifupay.com\nyzhmyy.com\nyzhotels.com\nyzhp.com\nyzhqyy.com\nyzhrhl.com\nyzhsk.com\nyzhuali.com\nyzhx.net\nyzhyai.com\nyzie.net\nyziin.com\nyzimgs.com\nyzinter.com\nyzitc.com\nyzj.cc\nyzja.com\nyzjb.com\nyzjdgs88.com\nyzjiaozhai.com\nyzjj120.com\nyzjjw.net\nyzjob.net\nyzjship.com\nyzjsxy.com\nyzjtcyjt.com\nyzjtech.com\nyzjyfz.com\nyzkdfcw.com\nyzkhfw.com\nyzkimage.com\nyzkjpcb.com\nyzkos.com\nyzlngi.com\nyzlxjt.com\nyzlyxx.com\nyzmary.com\nyzmat.com\nyzmcms.com\nyzmcxx.com\nyzmg.com\nyzmgf.com\nyzmiao03.com\nyzmls.com\nyzmoney.com\nyznano.com\nyzncms.com\nyznn.com\nyzntv.com\nyzops.net\nyzpanstar.com\nyzpetfood.com\nyzpfbyy.com\nyzport.com\nyzqcw.com\nyzqgamefun.com\nyzqx.com\nyzqzf.com\nyzra900.com\nyzrayy.com\nyzrb.com\nyzrc.net\nyzren.com\nyzrenai.com\nyzrom.com\nyzrshop.com\nyzrsks.com\nyzrss.com\nyzrzgroup.com\nyzs.com\nyzs.io\nyzsbh.com\nyzsbhjt.com\nyzsfuer.com\nyzshkjxx.com\nyzshyzz.com\nyzsljz.com\nyzsnen.com\nyzsrmyy.org\nyzsszw888.com\nyzstudio.net\nyzsz.net\nyzsz3.icu\nyzszsxh.com\nyzszyy.com\nyzt-tools.com\nyzt888.com\nyztcdn.com\nyztchg.com\nyztjb.net\nyztzairport.net\nyzw.cc\nyzwb.com\nyzwb.net\nyzweekly.com\nyzx0771.com\nyzxcfdj.com\nyzxdyrmyy.com\nyzxw.com\nyzxxfzy.com\nyzy-gx.com\nyzyhyy.com\nyzyjhg.com\nyzyouth.com\nyzywhw.com\nyzyxart.com\nyzyxgame.com\nyzyz.org\nyzzcyy.com\nyzzd.com\nyzzp.com\nyzzpw.com\nyzzs.cc\nyzzsoft.com\nyzzxjyjt.com\nyzzxxz.com\nyzzy-online.com\nyzzy20-play.com\nyzzy29-play.com\nyzzy31-play.com\nyzzyimages.com\nz-bank.com\nz-henergy.com\nz-inn.com\nz-tek.com\nz.ai\nz.wiki\nz0.cc\nz01.com\nz0ukun.com\nz120.com\nz12345.com\nz17.link\nz1987.com\nz1cdn.com\nz211.top\nz211.vip\nz28j.com\nz2chain.com\nz2ehospital.com\nz2imc.com\nz2sci.com\nz2u.tv\nz3145x0367.com\nz316.com\nz318.com\nz3quant.com\nz4bgpo.com\nz4gwsoqmcvxt.com\nz574.com\nz5encrypt.com\nz5w.net\nz5z4.com\nz668.net\nz6e.com\nz701.com\nz729.com\nz7xz.com\nz82a3814j5.com\nz888.net\nz8cqv59kh3ip.com\nz8q.cc\nz99.biz\nz9cdn.com\nza-cosmetics.com\nza-doctor.com\nza8g1nx4ft.com\nzabxib.com\nzac1993.com\nzachina.org\nzack.asia\nzacveh.com\nzadervice.com\nzaduonews.com\nzaecu.com\nzaeke.com\nzaepi.com\nzafinsvc.com\nzafk120.com\nzahtb.com\nzahui.fan\nzahuishi.com\nzahuod.com\nzahuoji.com\nzai-art.com\nzai-xian.com\nzaibaoan.com\nzaidu.org\nzaiduu.com\nzaiemei.com\nzaifan.com\nzaigl.com\nzaiguahao.com\nzaih.com\nzaihuangshi.com\nzaijia.com\nzaijiawan.com\nzailaboratory.com\nzailingtech.com\nzailouxia.com\nzaimanhua.com\nzaiminglvsuo.com\nzainanjing365.com\nzaitong.net\nzaiwai.com\nzaiweiwx.com\nzaiwenai.com\nzaixian100f.com\nzaixianfanyi.com\nzaixiangzx.com\nzaixianjisuan.com\nzaixiankaoshi.com\nzaixianps.cc\nzaixianvip.net\nzaixs.com\nzaiyulin.com\nzaiyunli.com\nzajiebao.com\nzajilu.com\nzajourney.com\nzakc.group\nzaker.com\nzaku.fun\nzakww.com\nzalandode.com\nzallcn.com\nzallgo.com\nzallimg.com\nzalljinfu.com\nzallsoon.com\nzallxk.com\nzamcs.com\nzampdmp.com\nzamplink.net\nzan-live.com\nzanao.com\nzanba.com\nzanbai.com\nzancar.com\nzangao.com\nzangaopet.com\nzangdiyg.com\nzangenggroup.com\nzangft.com\nzanggekuangye.com\nzanghaihuatxt.com\nzanglikun.com\nzangto.com\nzangx.com\nzangyitang123.com\nzangyitong.com\nzanig.com\nzanih.com\nzankee1955.com\nzanlaa.com\nzanmeizhibo.com\nzanpic.com\nzanpu.com\nzanyiba.com\nzaobang.com\nzaoche168.com\nzaodao.net\nzaodian.com\nzaodin.com\nzaodula.com\nzaofabiao.com\nzaofacai.com\nzaogai.com\nzaojiadoc.com\nzaojiance.com\nzaojiance.net\nzaojiao.com\nzaojiaxueshe.com\nzaojiu.com\nzaojuge.com\nzaojuzi.com\nzaojv.com\nzaoowoo.com\nzaoqiangzhiheng.com\nzaowandushu.com\nzaowuyun.com\nzaoyang.org\nzaozuo.com\nzapak.com\nzapyamobile.com\nzaqizaba.xyz\nzarcw.com\nzarsion.com\nzastatic.com\nzasv.com\nzasv.net\nzasysz.com\nzasyuhkq.com\nzat.cc\nzatan.com\nzatanb1.com\nzatest.com\nzaticdn.com\nzattc.com\nzaucyih.com\nzauoehg.com\nzawomkv.com\nzaxdcredit.com\nzaxline.com\nzaxzn.com\nzaysz.com\nzazhipu.com\nzazsz.com\nzb-kc.com\nzb.dehua.tv\nzb.pzhgd.com\nzb1.org\nzb18.net\nzb8.com\nzb800.com\nzb99.net\nzbao.com\nzbao56.com\nzbbar.net\nzbbm.net\nzbbus.com\nzbbx.org\nzbc.pub\nzbc.wiki\nzbca.com\nzbcars.com\nzbchem.com\nzbcyrq.com\nzbczce.com\nzbdedu.com\nzbdzy.com\nzbfilm.com\nzbgala.com\nzbgarden.cc\nzbgedu.com\nzbgl.net\nzbgscm.com\nzbhbkj.com\nzbhot.com\nzbhouse.com\nzbhuafx.com\nzbii.com\nzbinfo.net\nzbintel.com\nzbird.com\nzbisq.com\nzbitcloud.com\nzbiwl.com\nzbj.com\nzbj66.com\nzbjdev.com\nzbjdr.com\nzbjiangsu.com\nzbjimg.com\nzbjsaas.com\nzbjwork.com\nzbjzgroup.com\nzbkb.com\nzblcyy.com\nzblhh.com\nzblhrl.com\nzbling.com\nzbljw.com\nzblogcn.com\nzblzm.xyz\nzbmag.com\nzbmbj.com\nzbmeishu.com\nzbnews.net\nzbo0n.com\nzbom.com\nzbopr.net\nzboqc.com\nzbpengxuan.com\nzbqlm.com\nzbqtwbzr.com\nzbra-inc.com\nzbrhsc.com\nzbrty.com\nzbsfdy.com\nzbsjzy.com\nzbsonline.com\nzbstatic1.com\nzbstatic5.com\nzbsyzx.com\nzbszkj.com\nzbt-china.com\nzbt.com\nzbt.net\nzbt100.com\nzbtaizhan.com\nzbtbjt.com\nzbtianao.com\nzbudbq.sbs\nzbusa.com\nzbw315.com\nzbwbbs.com\nzbwdj.com\nzbwg.cc\nzbwmy.com\nzbwpay.com\nzbxcck.com\nzbxinmeiti.com\nzbxjgs.com\nzbxsoft.com\nzbxyh.com\nzbxyly.com\nzbyads.com\nzbycg.com\nzbycorp.com\nzbyinghe.com\nzbylc.com\nzbytb.com\nzbyz.net\nzbz.com\nzbzb.org\nzbzdm.com\nzbzw.com\nzbzw.la\nzc-gs100.com\nzc-ha.com\nzc-it.com\nzc0317.com\nzc173.com\nzc532.com\nzc61.com\nzc6sigma.com\nzcaijing.com\nzcawuhvr.com\nzcbearing.com\nzcbgy.net\nzcbm580.com\nzcccc.com\nzccninfo.com\nzccrzx.com\nzcdiesel.com\nzcdlkeji.com\nzcdog.com\nzcdz1688.com\nzcedi.com\nzcedustudy.com\nzcfc.com\nzcfeed.com\nzcfirst.com\nzcfuhua.com\nzcfun.com\nzcfy.cc\nzcgg.net\nzcgou.com\nzcgsfy.com\nzcgsh.com\nzchat.tech\nzchb-water.net\nzchmbx.com\nzchmh.com\nzchospital.com\nzchrgroup.com\nzcict.com\nzcimg.com\nzcinfo.net\nzcitidc.net\nzciv.com\nzcjbgame.com\nzcjce.com\nzcjhsdk.com\nzcjxedu.com\nzcjxzl.com\nzckb001.com\nzckdwx.com\nzckp.com\nzclkj.com\nzclock.xyz\nzcloud.world\nzclqzls.com\nzcmlc.com\nzcmol.com\nzcmpark.com\nzcnest.com\nzcoa365.com\nzcobrand.com\nzcodesign.com\nzcofuture.com\nzcom.com\nzcomc.com\nzcoming.com\nzcooler.com\nzcosz.com\nzcowh.com\nzcpc.net\nzcpd.cc\nzcpm.net\nzcpzj.com\nzcqh.com\nzcqss.com\nzcqtz.com\nzcrcw.com\nzcrczp.com\nzcread.com\nzcry007.com\nzcs.cc\nzcsbbs.com\nzcscz.com\nzcset.com\nzcsweb.com\nzcszcm.com\nzctec.cc\nzctl.net\nzctpt.com\nzctt.com\nzctx.com\nzctzgr.com\nzcwin.com\nzcwlsc.com\nzcwxjx.com\nzcwz.com\nzcxcl.com\nzcxd9.com\nzcxn.com\nzcxsl.com\nzcycdn.com\nzczbzx.com\nzczj.com\nzczy100.com\nzczy56.com\nzczyofficial.com\nzd-auto.com\nzd-brake.com\nzd-dl.com\nzd-hs.com\nzd-pm.com\nzd-power.com\nzd.biz\nzd.hk\nzd200572.com\nzd315.net\nzdanfu.com\nzdao.com\nzdaoxb.com\nzdaq999.com\nzdaye.com\nzdbfjj.com\nzdbiogene.com\nzdbnm.com\nzdcgc.com\nzdcj.net\nzdcjw18.com\nzdcs666.com\nzdctid.com\nzddhr.com\nzddhub.com\nzddjq.com\nzddr.com\nzddream.com\nzdepay.com\nzdeqs.com\nzdevo.com\nzdfans.com\nzdfdc.com\nzdfei.com\nzdfx.net\nzdgkyy.com\nzdgxchina.com\nzdgzc.com\nzdh0.com\nzdh168.com\nzdhaitao.com\nzdhaitao.net\nzdhuoyunbao.com\nzdhyibiao.com\nzdiao.com\nzdic.net\nzdjt.com\nzdkfq.com\nzdkqyy.com\nzdlink.com\nzdlpk.net\nzdm.net\nzdmimg.com\nzdmq.com\nzdmq88.com\nzdmr.net\nzdnph.com\nzdnscloud.biz\nzdnscloud.com\nzdnscloud.info\nzdnscloud.net\nzdomo.com\nzdong.net\nzdpower.com\nzdrcw.com\nzdsdp.com\nzdsee.com\nzdsfy.net\nzdsju.com\nzdslb.com\nzdsr.net\nzdtent.com\nzdvalves.com\nzdvc.net\nzdwafis.com\nzdwallcovering.com\nzdwang.com\nzdwfy.com\nzdwmq.com\nzdworks.com\nzdwx.com\nzdwx.net\nzdwx.vip\nzdxlz.com\nzdyfy.com\nzdz.la\nzdzdm.com\nzdzwtesting.com\nzdzxtech.com\nze-assemble.com\nze-clock.com\nze-grow.com\nze-introduce.com\nze-invite.com\nze-mp.com\nze-wx.com\nzeaho.com\nzealer.com\nzeali.net\nzealquest.com\nzealsafe.net\nzebangedu.com\nzebracdn.com\nzebraenglish.biz\nzebraenglish.com\nzebred.com\nzecsma.com\nzeda1.com\nzedyer.com\nzeedao.com\nzeehoev.com\nzeekrlife.com\nzeekrline.com\nzeelis.com\nzeesin.com\nzeeteq.com\nzeetzj.com\nzeewain.com\nzegarkirepliki.pl\nzegnau.shop\nzego.im\nzeguoren.com\nzeheng.com\nzeidei.com\nzeiet.com\nzeisis.com\nzeisp.com\nzejiexinxi.com\nzeju.com\nzejunpharma.com\nzeku.com\nzekv.com\nzeldacn.com\nzelinai.com\nzemc.vip\nzemismart.com\nzen-est.com\nzencheer.com\nzengdefei.com\nzengenti.com\nzengjunpeng.com\nzengjunyin.com\nzenglong3d.com\nzengrong.net\nzengslb.com\nzengyongfu.com\nzengyt.com\nzengzeng.net\nzenha.net\nzenhotspring.com\nzenith-group.net\nzenithfashion.asia\nzenithmining.com\nzenithspace.net\nzenixauto.com\nzenkungforging.com\nzenlesszonezero.com\nzenmen.com\nzenner-metering.com\nzeno-tech.com\nzenoven.com\nzenshine-pharma.com\nzentao.net\nzentaopm.com\nzepcc.com\nzepdi.com\nzeperd.com\nzepp.com\nzeq366.net\nzero2me.com\nzerobreeze.com\nzerocollege.com\nzerogfans.com\nzeroling.com\nzerongjituan.com\nzerontruck.com\nzeroonead.com\nzeropartner.com\nzerotogether.net\nzerseager.com\nzeruns.com\nzerustech.com\nzesee.com\nzeshengproject.com\nzeshengshun.online\nzeshengtecphar.com\nzesidasi.com\nzesmob.com\nzeststore.com\nzetacn.com\nzetaijituan.com\nzetast.com\nzetbig.com\nzetcloud.com\nzettlernb.com\nzetyun.com\nzeusai.xin\nzeuux.com\nzeuux.org\nzexiaoqiao.com\nzeyouquan.com\nzeyu99.com\nzeyuan.shop\nzeyuan123.com\nzezhengcnc.com\nzezhenwangluo.com\nzezhuanggd.com\nzf313.com\nzf360.net\nzf3d.com\nzfancy.net\nzfb369.com\nzfboke.com\nzfbzhsq.com\nzfcm.net\nzfdliot.com\nzfdmkj.com\nzfemc.com\nzfengit.com\nzffan.com\nzfgy88.com\nzfhz.org\nzfile.vip\nzfj1441.com\nzfkg.com\nzfkjgw.com\nzfl9.com\nzfnet.net\nzfowed.com\nzfrontier.com\nzfrykj.com\nzfsc.com\nzfservicescn.com\nzfsf.com\nzfsjy.com\nzfsjzx.com\nzfsoft.com\nzft.com\nzftime.com\nzfty.work\nzfvnet.com\nzfw.net\nzfwlxt.com\nzfwx.com\nzfxz.com\nzfyypt.com\nzg-gaoling.com\nzg-gyt.com\nzg-import.com\nzg-imsoft.com\nzg-seastar.com\nzg114jy.com\nzg114w.com\nzg114zs.com\nzg118.com\nzg163.net\nzg3721.com\nzg388.com\nzg58.com\nzgaode.com\nzgaxr.com\nzgazxxw.com\nzgbaili.cc\nzgbenrun.com\nzgbfw.com\nzgbghdw.com\nzgbk.com\nzgblh.com\nzgbmcl.com\nzgbnt.com\nzgboke.com\nzgbszf.com\nzgby114.com\nzgbywl.com\nzgc-bigdata.org\nzgc261.com\nzgcbank.com\nzgcbb.com\nzgccity.com\nzgcdiy.com\nzgcgjn.com\nzgchawang.com\nzgchawenhua.com\nzgchospital.com\nzgchrx.com\nzgcicc.com\nzgcindex.org\nzgcjm.org\nzgcjpx.com\nzgclease.com\nzgclzzc.com\nzgcmc.com\nzgcmlm.com\nzgcsa.org\nzgcswhcbw.com\nzgcszkw.com\nzgcups.com\nzgcwpark.com\nzgcxbs.com\nzgcznet.com\nzgczrj.com\nzgddek.com\nzgddmx.com\nzgdjw.com\nzgdlfzw.com\nzgdlzb.org\nzgdmly.com\nzgdnjj.com\nzgdqcy.com\nzgdqjy.com\nzgdsw.com\nzgdwzp.com\nzgdxhbkf.com\nzgdych.com\nzgdydyxh.com\nzgdygf.com\nzgdztk.com\nzgeyanwo.com\nzgfllt.com\nzgfp.com\nzgfwgj.com\nzgfxnews.com\nzgfzh.com\nzgfznews.com\nzgfznj.com\nzgg.com\nzggas.com\nzggbdsw.net\nzggbhb.com\nzggcks.com\nzggd.city\nzgggws.com\nzgggz.com\nzggjgy.com\nzggjsmc.com\nzggldgj.com\nzgglkx.com\nzgglyun.com\nzggqzp.com\nzggroups.com\nzggtxhw.com\nzggua.com\nzggwy.com\nzggwy.org\nzggxgp.com\nzggxhj.com\nzggxlbc.com\nzggxsmlt.com\nzggye.com\nzggysyw.com\nzggzgg.com\nzggzzk.com\nzgh.com\nzghaojiaoyu.com\nzghaopingche.com\nzghbxh.org\nzghctc.com\nzghdch.com\nzghde.com\nzghhzx.net\nzghlzs.com\nzghongbiao.com\nzghongqi.com\nzghotnews.com\nzghtcd.com\nzghtedu.com\nzghtqk.com\nzghy.com\nzghzp.com\nzghzsk.com\nzgjcks.com\nzgjct.com\nzgjgw.com\nzgjhjy.com\nzgjianfang.com\nzgjiaoyan.com\nzgjiayang.com\nzgjiemeng.com\nzgjinglong.com\nzgjjzyjy.org\nzgjl123.com\nzgjm.net\nzgjm.org\nzgjmorg.com\nzgjrcw.com\nzgjrjw.com\nzgjrw.com\nzgjscopper.com\nzgjsdsj.com\nzgjsks.com\nzgjsqw.com\nzgjsyw.com\nzgjt518.com\nzgjtb.com\nzgjxcad.com\nzgjxjjw.com\nzgjymg.com\nzgjzy.org\nzgkao.com\nzgkashi.com\nzgkawah.com\nzgkfzz.com\nzgkjb.com\nzgkjcx.com\nzgkjw.org\nzgkjxww.com\nzgkjzx.com\nzgkqth.com\nzgkqw.com\nzgkyb.com\nzglb.org\nzglcn.net\nzglcxyxzz.com\nzglcyx.com\nzglibrary.com\nzglipin.com\nzgljl2012.com\nzglushang.com\nzglutongjituan.com\nzglwb.com\nzglww.net\nzglxw.com\nzglyfair.com\nzglyrc.com\nzglyz.com\nzgmba.com\nzgmcxw.com\nzgmdbw.com\nzgmh.net\nzgmicro.com\nzgmsbw.com\nzgmsbweb.com\nzgmscmpm.com\nzgmxjjgs.com\nzgmxl.com\nzgmzgsx.com\nzgmzyyzz.com\nzgnfys.com\nzgng.com\nzgnhzx.com\nzgnjm.com\nzgnnwdkj.com\nzgnt.cc\nzgnt.net\nzgnwp.com\nzgny.com\nzgnyw.net\nzgoa.net\nzgong.com\nzgoog.com\nzgpingshu.com\nzgpj.net\nzgps168.com\nzgpts.com\nzgpy168.com\nzgqbyp.com\nzgqcdt.com\nzgqczj.com\nzgqdrc.com\nzgqkgw.com\nzgqkk.com\nzgqw.com\nzgqywhcbw.com\nzgqyzxw.com\nzgqzjt.com\nzgqzswdx.com\nzgrcjlxh.com\nzgrcjyw.com\nzgrd.org\nzgrdnews.com\nzgrlm.com\nzgruisai.com\nzgrzbj.com\nzgsclp.com\nzgsd.net\nzgsepri.com\nzgserver.com\nzgshenglu.com\nzgshgs.com\nzgshige.com\nzgshige.net\nzgshjj.com\nzgshoes.com\nzgshq.com\nzgshuhuaxh.com\nzgshxd.com\nzgshxfw.com\nzgshyshyxh.com\nzgsj.com\nzgsjcn.com\nzgsjl8.com\nzgsjshy.com\nzgslb.net\nzgslylw.com\nzgsmile.com\nzgsmmhw.com\nzgsmsy.net\nzgsnzj.com\nzgsof.com\nzgspws.com\nzgsssss.com\nzgsta.com\nzgstly.net\nzgswcn.com\nzgswzys.com\nzgsxzs.com\nzgsyb.com\nzgsydw.com\nzgsynews.com\nzgsyqx.com\nzgsyz.com\nzgszglfh.com\nzgszjs.com\nzgtaining.com\nzgtcc.com\nzgtcyswh.com\nzgtghccl.com\nzgtianlong.com\nzgtianqi.com\nzgtjqxh.com\nzgtnzx.com\nzgtop10.com\nzgtuku.com\nzgty188.com\nzgtygg.com\nzgtywdysxh.com\nzgtzc.com\nzgtzhb.com\nzgtzqvk.com\nzgui.com\nzguonew.com\nzgvmxma.com\nzgw.com\nzgweimeng.com\nzgwhfe.com\nzgwlwx.com\nzgwstxc.com\nzgwt.co\nzgwypl.com\nzgxcc.com\nzgxcfx.com\nzgxcw.com\nzgxetnw.com\nzgxh.net\nzgxhm.com\nzgxk.org\nzgxledu.com\nzgxmlsp.com\nzgxnnews.com\nzgxnyhyxh.com\nzgxnyxh.com\nzgxqwqh.com\nzgxrjy.com\nzgxsczdldak.com\nzgxue.com\nzgxytc.com\nzgxyzx.net\nzgxzcj.com\nzgxzhjx.com\nzgybsfxh.com\nzgycgc.com\nzgyeda.com\nzgyey.com\nzgyhbc.com\nzgyhys.org\nzgyjlf.com\nzgylbx.com\nzgylj.com\nzgyouth.cc\nzgys.net\nzgyssyxh.com\nzgysw.cc\nzgytc.com\nzgyxjt.com\nzgyxzs.com\nzgyygl.com\nzgyyjgw.com\nzgyykx.com\nzgyythy.com\nzgyyzn2004.com\nzgyzyq.com\nzgzb.com\nzgzca.com\nzgzcw.com\nzgzcwy.com\nzgzhmz.com\nzgzjjcy.com\nzgzjzzs.com\nzgznh.com\nzgznjt.com\nzgzpsjz.com\nzgzsa.com\nzgzsrc.com\nzgzszy.com\nzgzy.net\nzgzypyw.com\nzgzyxxzs.com\nzgzzs.com\nzgzzxx.com\nzh-an-pg-gaming.com\nzh-ansheng.com\nzh-brimed.com\nzh-chem.com\nzh-cjh.com\nzh-douqiutiyu.com\nzh-gs.com\nzh-hbs.com\nzh-heshi.com\nzh-hks-slotsimulator.com\nzh-hr.com\nzh-hz.com\nzh-itone.com\nzh-jieli.com\nzh-jinhang.com\nzh-languan.com\nzh-le-slotsimulator.com\nzh-longshi.com\nzh-piao.com\nzh10.com\nzh189.com\nzh818.com\nzh996.com\nzha.co\nzhaeec.com\nzhai14.com\nzhaiba.com\nzhaibao.vip\nzhaibian.com\nzhaidou.com\nzhaihai.com\nzhaijihui.com\nzhaijis.com\nzhaikexueyuan.com\nzhainanba.net\nzhainanfulishe.com\nzhainanhuayuan.com\nzhaipan.vip\nzhairport.com\nzhaitushe.com\nzhaiwuu.com\nzhaixiaoniu.com\nzhaixue.cc\nzhale.me\nzhan.com\nzhanbanji.com\nzhanbuba.com\nzhanchenyouqi.com\nzhanchily.com\nzhandaren.com\nzhandian88.com\nzhandodo.com\nzhang-chu.com\nzhang365.com\nzhangbj.com\nzhangbo.org\nzhangchangfa.com\nzhangchi.art\nzhangdongxuan.com\nzhangdu.com\nzhangdu5.net\nzhangdu520.com\nzhange8.com\nzhangfeibiao.com\nzhangfensir.com\nzhangferry.com\nzhangfupeng.com\nzhanggaoyuan.com\nzhangge.net\nzhanghaodaren.com\nzhanghetianxia.com\nzhanghonghong.com\nzhanghongliang.com\nzhanghuang.com\nzhangjet.com\nzhangjiee.com\nzhangjinyue.com\nzhangjunbk.com\nzhangkai.red\nzhangketong.com\nzhangkongapp.com\nzhangkoubei.net\nzhangku.com\nzhangle.com\nzhangleglobal.com\nzhangli2015.com\nzhanglinfeng09.com\nzhangliziyun.com\nzhangluya.com\nzhangmen.com\nzhangmen.org\nzhangmenkid.com\nzhangnan.xyz\nzhangnq.com\nzhangqi.ltd\nzhangqiaokeyan.com\nzhangqiongjie.com\nzhangqiu.cc\nzhangqiubus.com\nzhangrc.site\nzhangread.com\nzhangrunnan.com\nzhangsenhao.com\nzhangshangtong.com\nzhangshengcw.com\nzhangshengrong.com\nzhangshi.org\nzhangshuchang.com\nzhangsifan.com\nzhangtaiwuye.com\nzhangtu.com\nzhangu365.com\nzhangwan.net\nzhangwei.li\nzhangwenli.com\nzhangwojumian.com\nzhangxin.ltd\nzhangxinhulian.com\nzhangxinkeji.com\nzhangxinmj.com\nzhangxinxu.com\nzhangxiu.com\nzhangyi123.com\nzhangyoubao.com\nzhangyoushijie.com\nzhangyu.com\nzhangyu39.com\nzhangyuanqiang.com\nzhangyue.com\nzhangyue.net\nzhangyue01.com\nzhangyue02.com\nzhangyue03.com\nzhangyuecdn.com\nzhangyupeng.com\nzhangzepower.com\nzhangzhao.me\nzhangzhengfan.com\nzhangzhongpei.com\nzhangzhongyun.com\nzhangzhuo.ltd\nzhangzidao.com\nzhangzifan.com\nzhangziran.com\nzhangzishi.cc\nzhanh.com\nzhanhi.com\nzhanhome.com\nzhanhuidaili.com\nzhanhuiniu.com\nzhanhuiquan.com\nzhanhuo.com\nzhanid.com\nzhankoo.com\nzhankuaqq.com\nzhanlingol.com\nzhanmang.com\nzhanq.net\nzhanqi.net\nzhanqi.tv\nzhanqitv.com\nzhanqu.tv\nzhanruizb.com\nzhanshaoyi.com\nzhanshi888.com\nzhanshifood.com\nzhanshiren.com\nzhansu.com\nzhantuo.com\nzhanuan.com\nzhanxingfang.com\nzhanyouyun.com\nzhanyugroup.com\nzhanzhanbao.com\nzhanzhangb.com\nzhanzhangs.com\nzhao-meng.com\nzhao123.org\nzhaoba.net\nzhaobeijing.com\nzhaobenshan.tv\nzhaobiaoziyuan.com\nzhaobide.com\nzhaobuxiu.com\nzhaocaimall.com\nzhaocaiyan.com\nzhaochanpin.com\nzhaochao.xyz\nzhaochongwu.com\nzhaoda.net\nzhaodanji.com\nzhaodaojia.com\nzhaodedao.xyz\nzhaodigroup.com\nzhaodll.com\nzhaodns999.com\nzhaofangbang.net\nzhaofenxiang.com\nzhaogang.com\nzhaogangimg.com\nzhaogui.com\nzhaohaowang.com\nzhaohe.net\nzhaoheng-cpm.com\nzhaoiphone.com\nzhaojiafang.com\nzhaojiao.net\nzhaojiaoan.com\nzhaojiaxiao.com\nzhaojs.com\nzhaojunhg.com\nzhaoka.com\nzhaokaifeng.com\nzhaokao.net\nzhaokaocn.com\nzhaokeli.com\nzhaoketang.com\nzhaokuaizhao.com\nzhaolaobanla.com\nzhaoliangji.com\nzhaoliming.net\nzhaomengtu.com\nzhaoming.biz\nzhaomishijie.com\nzhaomu.com\nzhaomuqingyun.com\nzhaomxd.com\nzhaoniupai.com\nzhaoonline.com\nzhaopianzhibo.com\nzhaopin.com\nzhaopin400.com\nzhaopin668.com\nzhaopinbao.me\nzhaopingou.com\nzhaopinrugao.com\nzhaopintangyin.com\nzhaoplc.com\nzhaoqianwang.com\nzhaoqiufa.com\nzhaoqt.net\nzhaoquanwang.vip\nzhaoren.net\nzhaorunsen.com\nzhaosf.co\nzhaosha.com\nzhaoshang.net\nzhaoshang100.com\nzhaoshang800.com\nzhaoshangbang.com\nzhaoshangbao.com\nzhaoshangdai.com\nzhaoshayou.com\nzhaosheng.com\nzhaosheng365.com\nzhaoshixi.com\nzhaoshizhou.xyz\nzhaosifang.com\nzhaosuliao.com\nzhaosw.com\nzhaosy.com\nzhaota8.com\nzhaotaicaiyin.com\nzhaotu.com\nzhaouc.com\nzhaouc.net\nzhaowenyu.com\nzhaowofanyi.com\nzhaoxi.org\nzhaoxiangliao.com\nzhaoxiangyd.com\nzhaoxiaoshuo.com\nzhaoxin.com\nzhaoxingfang.com\nzhaoxitech.com\nzhaoxuncaijing.com\nzhaoyanblog.com\nzhaoyangmao.com\nzhaoyangsem.com\nzhaoyangxueyuan.com\nzhaoyaojd.com\nzhaoyasai.com\nzhaoybbk.com\nzhaoyingtian.com\nzhaoyinqian.com\nzhaoyl.com\nzhaoyo.com\nzhaoyuan365.com\nzhaoyun.com\nzhaozhanxu.com\nzhaozhishi.com\nzhaozhonggong.com\nzhaozongjie.com\nzharev.com\nzhatoufa.com\nzhatuyunshu.com\nzhayanwang.com\nzhb1.com\nzhbit.com\nzhblawyer.com\nzhboyang.com\nzhbus.org\nzhbx.net\nzhby-point.com\nzhcic.com\nzhcidian.com\nzhckw.com\nzhcnews.com\nzhcommerce.com\nzhcomputing.com\nzhcsgc.com\nzhctv.com\nzhcw.com\nzhcyanshi.com\nzhdfg.com\nzhdgps.com\nzhdhq.com\nzhdhqc.com\nzhdhqcz.com\nzhdhqzy.com\nzhdmwhg.com\nzhdsbang.com\nzhe.com\nzhe800.com\nzhe900.com\nzhebei.com\nzhebeipharm.com\nzhebumai.com\nzhechem.com\nzhedabingchong.com\nzhedu.net\nzhefengle.com\nzhefuhua.com\nzhegu8.xyz\nzheiyu.com\nzhejiangcheng.com\nzhejiangcircuit.com\nzhejiangfa.com\nzhejiangfc1998.com\nzhejianghanpu.com\nzhejianglab.com\nzhejianglab.org\nzhejiangliming.com\nzhejianglong.com\nzhejiangmuseum.com\nzhejiangqinghe.com\nzhejiangseed.com\nzhejiangzhuohang.com\nzhejing.tech\nzhekoulieshou.com\nzhekouniu.net\nzhekouo.com\nzhelaoda.com\nzheli.com\nzhelibao.com\nzhelin.me\nzhelixin.com\nzheliyin.com\nzhen-ao.com\nzhen.com\nzhenai.com\nzhenaihn.com\nzhenandl.com\nzhenaoyaoye.com\nzhenbanggd.com\nzhenbi.com\nzhenbizi.com\nzhenchu.cc\nzhending-chicken.com\nzhendong365.com\nzhendonggames.com\nzhene.net\nzhenfacloud.com\nzhenfangyuan.com\nzhenfund.com\nzhengbang.com\nzhengben56group.com\nzhengbiaoke.com\nzhengcaimall.com\nzhengcaishangcheng.com\nzhengchang.com\nzhengdaijingji.com\nzhengdaojiapei.com\nzhengdaotang.com\nzhengdapeanut.com\nzhengdichaiqian.com\nzhengdong.cc\nzhengdongzulin.com\nzhengerpin.com\nzhengfalaw.com\nzhengfayunpt.com\nzhengfengnet.com\nzhenggang.org\nzhenggui.com\nzhengguzhishen.com\nzhenghai-ht.com\nzhenghangplc.com\nzhenghangyq.net\nzhenghe.biz\nzhenghewuye.com\nzhenghong888.com\nzhenghuiyaoye.com\nzhengjia.com\nzhengjianzhao.com\nzhengjie.com\nzhengjifb.com\nzhengjimt.com\nzhengkaji.com\nzhenglonggroup.com\nzhengmeng.net\nzhengmin.com\nzhengpengbo.com\nzhengpic.com\nzhengpinle.com\nzhengqi100.com\nzhengqingsong.com\nzhengquan.org\nzhengquan.work\nzhengqun123.com\nzhengruioi.com\nzhengtaidianlan.com\nzhengte.net\nzhengtongcloud.com\nzhengtoon.com\nzhenguanyu.biz\nzhenguanyu.com\nzhenguo.com\nzhengw-tech.com\nzhengwei007.com\nzhengwutong.com\nzhengxiaoling.com\nzhengxinbao.com\nzhengxing021.com\nzhengxingzhijia.com\nzhengxinonly.com\nzhengyaing.win\nzhengyang-tek.com\nzhengyaokeji.net\nzhengyee.com\nzhengyexing.com\nzhengyounet.com\nzhengyouyoule.com\nzhengyuanfu.com\nzhengyutuliao.com\nzhengzai.tv\nzhengzhaopai.com\nzhengzhenxx.com\nzhengzhou42195.com\nzhengzhoubus.com\nzhengzhoutools.com\nzhengzhoutx.com\nzhengzhouyunmei.com\nzhengzihui.com\nzhenhaofu.com\nzhenhaotao.com\nzhenhaotv.com\nzhenheli.com\nzhenhonggroup.com\nzhenhospital.com\nzhenhuadj.com\nzhenhuan888.com\nzhenimg.com\nzhenjiatong.com\nzhenjingtv.com\nzhenkongbang.com\nzhenlongvip.com\nzhenmeidai.com\nzhenmeifoods.com\nzhenmeigroup.com\nzhenpin.com\nzhenren.com\nzhenrongbao.com\nzhenruhotels.com\nzhenrun.press\nzhensheng.com\nzhenshi.com\nzhenshigroup.com\nzhenshua.com\nzhenshungroup.com\nzhensiyu.com\nzhenstyle.com\nzhensuo.tv\nzhentaigroup.com\nzhentan.la\nzhentoo.com\nzhenweiexpo.com\nzhenwu.com\nzhenxiad.com\nzhenxiliangshi.com\nzhenxin2014.com\nzhenxinfu.com\nzhenxipin.net\nzhenyangshoes.com\nzhenye.com\nzhenyouliao.com\nzhenyoumei.com\nzhenyuansoft.com\nzhenyunpan.com\nzhenzhuchanfu.com\nzheqc.com\nzheshenet.com\nzhetao.com\nzhetian.org\nzhetouniu.com\nzheurl.com\nzhewanji.net\nzhexi.tech\nzhexingzx.com\nzhexinit.com\nzhexinsteel.net\nzheye.com\nzheyibu.com\nzheyinleasing.com\nzheyouxinxi.com\nzheyuntech.com\nzhezheai.com\nzhezhekan.com\nzhezhewhkj.com\nzhezhi.tech\nzhfc.com\nzhfivehospital.com\nzhfund.com\nzhfwq.com\nzhfyhb.com\nzhgc.com\nzhgfanyi.com\nzhgjx.com\nzhgl.com\nzhglory.com\nzhgn.com\nzhgnj.com\nzhgreens.com\nzhguoguo.com\nzhgxjs.com\nzhhainiao.com\nzhhaitai.com\nzhheo.com\nzhhfedu.com\nzhhfjt.com\nzhhlaw.com\nzhhlogistics.com\nzhhrm.com\nzhhs-china.com\nzhhuahui.com\nzhhuashengjt.com\nzhhuihua.com\nzhhy-oa.com\nzhi-ming.com\nzhi-niao.com\nzhi.hu\nzhi10.com\nzhi3.net\nzhiaimusic.com\nzhiangit.com\nzhiangroup.com\nzhiannet.com\nzhiantec.com\nzhibaimeixue.com\nzhibiao168.com\nzhibiaow.com\nzhibitouzi.com\nzhibo.tv\nzhibo8.cc\nzhibo8.com\nzhiboba.com\nzhiboohui.com\nzhiboqiao.com\nzhiboyun.net\nzhibs.net\nzhibugongzuo.com\nzhicaiwang.com\nzhicall.com\nzhichanli.com\nzhichaoxt.com\nzhicheng-champion.com\nzhicheng.net\nzhichepai.com\nzhichepin.com\nzhichi.com\nzhichidata.com\nzhichikeji.com\nzhichiwangluo.com\nzhichiweiye.com\nzhicms.cc\nzhicyun.com\nzhidao91.com\nzhidaochuanxin.com\nzhidaoplan.com\nzhidejian.com\nzhidemai.com\nzhidesoft.com\nzhidi66.com\nzhidianfan.com\nzhidianlife.com\nzhidieyun.com\nzhidiy.com\nzhidtech.com\nzhiduopc.com\nzhidx.com\nzhienkeji.com\nzhiexa.com\nzhifa.cc\nzhifa315.com\nzhifang.com\nzhifayangfa.com\nzhifayiyuan.com\nzhifeishengwu.com\nzhifengtang.com\nzhifou123.com\nzhifoukeji.com\nzhiftype.com\nzhifufu.com\nzhifujie.com\nzhifuquanzi.com\nzhifure.com\nzhifux.com\nzhifuzi.com\nzhigaometal.com\nzhige.net\nzhigongfu.com\nzhigou.com\nzhigou888.com\nzhigouyp.com\nzhiguagua.com\nzhiguang.me\nzhigudata.com\nzhiguf.com\nzhiguoguo.com\nzhihai.fun\nzhihang100.com\nzhihe.link\nzhihe.mobi\nzhiheiot.com\nzhihejia.com\nzhihejiaoyu.com\nzhihemobi.com\nzhihengwangchen.com\nzhihepartners.com\nzhihevip.com\nzhihjf.com\nzhihu.com\nzhihu.dev\nzhihua-tech.com\nzhihuangjin.com\nzhihudsp.com\nzhihuichuangyanshi.com\nzhihuiep.com\nzhihuifangdong.net\nzhihuihongze.com\nzhihuihuiwu.com\nzhihuihutong.com\nzhihuiji.com\nzhihuijingyingba.com\nzhihuikangyang.com\nzhihuimami.com\nzhihuinanzhan.com\nzhihuishan.com\nzhihuishitang.net\nzhihuishu.com\nzhihuiwater.com\nzhihuixiadan.com\nzhihuixl.com\nzhihuixuexipt.com\nzhihuiya.com\nzhihuiyunbo.com\nzhihuizhangyu.com\nzhihuizp.com\nzhihuoseo.com\nzhihur.com\nzhiji.com\nzhijia.com\nzhijian114.com\nzhijianbao.com\nzhijianchuhai.com\nzhijianfengyi.com\nzhijiangames.com\nzhijiannuoche.com\nzhijiaow.com\nzhijiaow.net\nzhijiaoyi.com\nzhijiapro.com\nzhijiashe.com\nzhijidoc.com\nzhijie-edu.com\nzhijieguo.com\nzhijieketang.com\nzhijin.com\nzhijinwang.com\nzhijizhibi.com\nzhikaiis.com\nzhikao100.com\nzhikao365.net\nzhikaocn.com\nzhikaojy.com\nzhikaowangxiao.net\nzhiketong.com\nzhiketong.net\nzhikexun.com\nzhikongyangpin.com\nzhikuai.com\nzhikubao.net\nzhil.cloud\nzhilandaren.com\nzhilehuo.com\nzhileiqiye.com\nzhilepin.com\nzhilian-nb.com\nzhilian.com\nzhilian.host\nzhilianghui.com\nzhiliangren.com\nzhilianiot.com\nzhiliaobiaoxun.com\nzhiliaocaibao.com\nzhiliaoke.com\nzhilidata.com\nzhilingshop.com\nzhilitraffic.com\nzhilongtech.com\nzhiluo.net\nzhima1688.com\nzhimacangku.com\nzhimaixiaodian.com\nzhimantian.com\nzhimap.com\nzhimapay.net\nzhimaquan.net\nzhimaruanjian.com\nzhimatech.com\nzhimawenda.com\nzhimaxkf.com\nzhimei.com\nzhimeibot.com\nzhimeijiankang.com\nzhimengdaren.com\nzhimg.com\nzhimi.com\nzhiminglawyer.com\nzhimodesign.com\nzhimoe.com\nzhineikaixin.com\nzhinengdayi.com\nzhinengjianzhan.com\nzhinengxia.com\nzhinengxiehui.com\nzhinengyujia.com\nzhinet.com\nzhinianboke.com\nzhiniceshi.com\nzhinikefu.com\nzhiniu8.com\nzhinuoshuzi.com\nzhinvnetwork.com\nzhipan.net\nzhipeix.com\nzhiper.com\nzhipianbang.com\nzhipianbang.vip\nzhipin.com\nzhipingke.com\nzhipucn.com\nzhipuzi.com\nzhiqi.info\nzhiqiang.org\nzhiqiapp.com\nzhiqicms.com\nzhiqihuo.com\nzhiqihuo.org\nzhiqijichu.com\nzhiquanxia.com\nzhiquapp.com\nzhiquhuyu.work\nzhiquyuan.com\nzhiqwl.com\nzhiren.com\nzhiren.ren\nzhiribao.com\nzhiru.com\nzhirui-inv.com\nzhirui.net\nzhiruiinvest.com\nzhisanzhao.com\nzhishanfu.com\nzhishangnet.com\nzhishangsoft.com\nzhisheji.com\nzhisheng.com\nzhishengbang.com\nzhishengtec.com\nzhishengxinchuang-food.com\nzhishi.com\nzhishi.tech\nzhishif.com\nzhishifanli.com\nzhishifenzi.com\nzhishinn.com\nzhishisoft.com\nzhishiu.com\nzhishiv.com\nzhishiwu.com\nzhishutang.com\nzhishuyun.com\nzhisiyun.com\nzhisuoyi.net\nzhitaiparking.com\nzhitangvalve.com\nzhitaosoft.com\nzhitingtech.com\nzhito.com\nzhitongcaijing.com\nzhitongpm.com\nzhitouxing.com\nzhituad.com\nzhitui.com\nzhitusoft.com\nzhituwujie.com\nzhituzhilian.com\nzhivisaworld.com\nzhiweidata.com\nzhiweihome.com\nzhiweisoft.com\nzhiwenw.com\nzhiwgx.com\nzhiwo.com\nzhiwo.work\nzhiwu.com\nzhiwushuo.com\nzhiwutiyu.com\nzhiwutong.com\nzhixi.com\nzhixiaochengxu.com\nzhixiaohuoke.com\nzhixiaosj.com\nzhixiaowang.com\nzhixin-semi.com\nzhixingapp.com\nzhixingit.com\nzhixingjj88.com\nzhixingyunke.com\nzhixiu.net\nzhixuan.com\nzhixue.com\nzhixue.org\nzhixuedoc.com\nzhixueyun.com\nzhixunfang.com\nzhixunkeji.xyz\nzhiyakeji.com\nzhiyanxuan.com\nzhiyazz.com\nzhiye.com\nzhiyeapp.com\nzhiyeguihua.com\nzhiyequan.com\nzhiyexueyuan.com\nzhiyi.com\nzhiyicx.com\nzhiyinghui.com\nzhiyingos.com\nzhiyingyang.com\nzhiyinhao.com\nzhiyinlou.com\nzhiyinmanhuawang.com\nzhiyinmedia.com\nzhiyoo.com\nzhiyoubao.com\nzhiyousx.com\nzhiys.com\nzhiyu-china.com\nzhiyuan-robot.com\nzhiyuanbang.com\nzhiyuanshijie.com\nzhiyuanxinglvye.com\nzhiyuanyun.com\nzhiyuanzhongyi.com\nzhiyuapp.com\nzhiyueit.com\nzhiyun-cn.com\nzhiyun-tech.com\nzhiyunwang.net\nzhiyutianqi.com\nzhiyuyg.com\nzhizaoyun.com\nzhizeu.com\nzhizhan360.com\nzhizhen.com\nzhizhi88.com\nzhizhibaike.com\nzhizhihu.com\nzhizhizhi.com\nzhizhizhi.net\nzhizhonghl.com\nzhizhoukeji.com\nzhizhoumi.com\nzhizhu35.net\nzhizhucms.com\nzhizhuip.com\nzhizhuma.com\nzhizhuwu.com\nzhizhuyule.com\nzhizhuyx.com\nzhizihuan.com\nzhizihuan.net\nzhizugz.com\nzhizunbo.com\nzhizundun.com\nzhizunnews.com\nzhizuobiao.com\nzhizuobiaojiaoyu.com\nzhizuoh5.com\nzhizuotu.com\nzhj9.com\nzhjd.org\nzhjdkz.com\nzhjgkg.com\nzhjgkgjt.com\nzhjgongjiao.com\nzhjiameng.com\nzhjianet.com\nzhjingsai.com\nzhjj.org\nzhjncb.com\nzhjtaq.com\nzhjtong.com\nzhjuche.com\nzhjxwh.com\nzhjypco.com\nzhjzg.com\nzhjzgroup.com\nzhk.me\nzhka.com\nzhks.org\nzhku.com\nzhl.com\nzhld.com\nzhlhh.com\nzhliaoshe.com\nzhliqi.com\nzhljq.com\nzhlm.com\nzhlqjt.com\nzhltech.net\nzhltraffic.com\nzhlyen.com\nzhlzw.com\nzhmag.com\nzhmedcenter.com\nzhmeiwen.com\nzhmf.com\nzhmodaoli.com\nzhmold.com\nzhmu.com\nzhmxchina.com\nzhmzqi.com\nzhnbj.com\nzhnc-kaiyunapp.com\nzhnfad.com\nzhnsyh.com\nzhong-yao.net\nzhong.com\nzhong100.com\nzhongan.com\nzhongan.io\nzhongancloud.com\nzhonganfengshang.com\nzhonganguobao.com\nzhonganib.com\nzhonganinfo.com\nzhongankang.com\nzhonganweishi.com\nzhongbao360.com\nzhongbaounion.com\nzhongbeiyouhao.com\nzhongbenkeji.com\nzhongbenwangluo.com\nzhongbingtongxin.com\nzhongbowenwu.com\nzhongboxinwen.com\nzhongcai.com\nzhongcaistream.com\nzhongcaisuo.com\nzhongcetech.com\nzhongche.com\nzhongchebaolian.com\nzhongchewuliu.com\nzhongchouke.com\nzhongchuang365.com\nzhongchuangwenhua.com\nzhongda021.com\nzhongdajc.com\nzhongdakang.com\nzhongdazm.com\nzhongdegroup.com\nzhongdemetal.com\nzhongdeng.com\nzhongdengwang.com\nzhongdeschool.com\nzhongdexc.com\nzhongdi168.com\nzhongerp.com\nzhongfeiqiao.com\nzhongfu.net\nzhongfuwatch.com\nzhonggenggroup.com\nzhonggu56.com\nzhongguang.com\nzhongguanpetro.com\nzhongguinong.com\nzhongguobaiyin.com\nzhongguobingxue.com\nzhongguociwang.com\nzhongguoditu.com\nzhongguofeng.com\nzhongguogouliang.com\nzhongguoguwan.com\nzhongguohao123.com\nzhongguohuo.com\nzhongguopeixun.net\nzhongguose.com\nzhongguosou.com\nzhongguoss.com\nzhongguowangshi.com\nzhongguoym.com\nzhonggushipping.com\nzhonghaitech.com\nzhonghaojituan.com\nzhonghe58.com\nzhonghegame.com\nzhonghengxingufen.com\nzhonghengyiyao.com\nzhonghhd.com\nzhonghongwang.com\nzhonghuacar.com\nzhonghuacpa.com\nzhonghuadiancang.com\nzhonghuaent.com\nzhonghuamba.com\nzhonghuameiwang.com\nzhonghuanjianbj.com\nzhonghuanus.com\nzhonghuaqiming.com\nzhonghuasuan.com\nzhonghuaying.com\nzhonghuilv.com\nzhonghuitj.com\nzhonghuvalve.com\nzhongji.cc\nzhongjian.run\nzhongjiangapp.com\nzhongjianyiliao.com\nzhongjiaochuxing.com\nzhongjijidian.com\nzhongjincc.com\nzhongjintongsheng.com\nzhongjiujiu.com\nzhongjiunanshuo.com\nzhongjixinyuan.com\nzhongjukiln.com\nzhongjunstone.com\nzhongkaiedu.com\nzhongkao.com\nzhongkaohelp.com\nzhongkecn.com\nzhongkeguan.com\nzhongkekc.com\nzhongkerd.com\nzhongkezhihang.com\nzhongkongbancn.com\nzhongkongdaikuan.com\nzhongleny.com\nzhongli.com\nzhonglian.com\nzhonglianbiao.com\nzhonglianguanwei.com\nzhongliangxny.com\nzhonglianhuashu.com\nzhonglianhuaxin.com\nzhonglianyx.com\nzhongliusp.com\nzhongliuyiyuan.com\nzhonglue-consulting.com\nzhonglun.com\nzhonglunnet.com\nzhongluyuntong.com\nzhongmaohr.com\nzhongmei.com\nzhongmeigk.com\nzhongmian.com\nzhongminenergy.com\nzhongmingjiaoyu.net\nzhongnakeji.com\nzhongnengrecycling.com\nzhongnice.com\nzhongnongjimu.com\nzhongp.com\nzhongpaiwang.com\nzhongpenggufen.com\nzhongping.com\nzhongpingcapital.com\nzhongpujiancai.com\nzhongqijiye.com\nzhongqijt.com\nzhongqingshao.com\nzhongqixin360.com\nzhongran.org\nzhongrenbang.cc\nzhongruihuacheng.com\nzhongruitech.com\nzhongruiyaoye.com\nzhongsenmenye.com\nzhongshan-hotel.com\nzhongshanchengtai.com\nzhongshang114.com\nzhongshanpark.com\nzhongshantoukong.com\nzhongshanweixin.com\nzhongshanzhekai.com\nzhongshengdai.com\nzhongshenglong.xyz\nzhongshi-chem.com\nzhongshiqixie.com\nzhongshucan.com\nzhongshungroup.com\nzhongshuopg.com\nzhongso.com\nzhongsou.com\nzhongsou.net\nzhongtaihangzhou.com\nzhongtaitrust.com\nzhongtefamen.com\nzhongtiancloud.com\nzhongtieyintong.com\nzhongtong.com\nzhongtongshe.com\nzhongtou.co\nzhongtuirong.com\nzhongtuobang.com\nzhongtusy.com\nzhongwang.com\nzhongwangsc.com\nzhongwei-info.com\nzhongweicable.com\nzhongweihotels.com\nzhongweiteamtop.com\nzhongwen.wiki\nzhongwenhexinqikan.com\nzhongwogroup.com\nzhongwucan.com\nzhongwulian.com\nzhongxiang.com\nzhongxiangdichan.net\nzhongxiangwang.co\nzhongxiaole.net\nzhongxiaoyl.com\nzhongxingglove.com\nzhongxinjzzs.com\nzhongxinkeji.vip\nzhongxinwei.net\nzhongxinzhongxue.com\nzhongxisunve.com\nzhongxues.com\nzhongxuewuyou.net\nzhongxuewy.net\nzhongxunrunda.com\nzhongxuntv.com\nzhongxuyiyuan.com\nzhongyagroup.com\nzhongyangkeji.com\nzhongyangweixiu.com\nzhongyao365.com\nzhongyapeicui.com\nzhongyasmart.com\nzhongyejy.com\nzhongyf.com\nzhongyi6.com\nzhongyi9999.com\nzhongyibaodian.com\nzhongyiinc.com\nzhongyiiot.com\nzhongyiju360.com\nzhongyingdp.com\nzhongyingtougu.com\nzhongyingyiyao.com\nzhongyinlawyer.com\nzhongyishangwu.com\nzhongyisousuo.com\nzhongyiyisheng.com\nzhongyoo.com\nzhongyouai.com\nzhongyouex.com\nzhongyougc.com\nzhongyoumedia.com\nzhongyu.com\nzhongyu87.xyz\nzhongyuan-sports.com\nzhongyuanauto.com\nzhongyue001.com\nzhongyuefuwu.com\nzhongyulian.com\nzhongyunjt.net\nzhongyunjy.com\nzhongyunqianbao.com\nzhongyuyx.com\nzhongzaisheng.net\nzhongzeny.com\nzhongzetherapeutics.com\nzhongzhaizs.com\nzhongzhao.com\nzhongzhen56.com\nzhongzhenjiaoyu.com\nzhongzhensen.com\nzhongzhi-faqian.com\nzhongzhide.com\nzhongzhifaqian.com\nzhongzhiiov.com\nzhongzhilin.com\nzhongzhixin.com\nzhongzhixitong.com\nzhongzhongkeji.com\nzhongzhoulianhe.com\nzhongzhouwater.com\nzhongzhuang.com\nzhongzilu.com\nzhonshian.com\nzhou.icu\nzhouao.com\nzhoubaitong.net\nzhoubianyou.com\nzhouchun.net\nzhoudaosh.com\nzhoufengsd.com\nzhougong.com\nzhouhaismart.com\nzhouhing.com\nzhouhoulin.com\nzhoujiahong.com\nzhoujianhui.com\nzhoujifood.com\nzhoujunji.com\nzhoukaiwen.com\nzhoulaoshi.club\nzhoulingjie.com\nzhoupu123.com\nzhoupudata.com\nzhouql.vip\nzhouweitong.site\nzhouxianghb.com\nzhouxiaoben.info\nzhouxingchi.info\nzhouxuanyu.com\nzhouyi.biz\nzhouyi.cc\nzhouyi114.com\nzhouyiapi.com\nzhouyiy.com\nzhouyou360.com\nzhouyouji.world\nzhouzhuang.net\nzhpca.com\nzhpecc.com\nzhpharm-sh.com\nzhqgtjxh.com\nzhqyue.com\nzhrct.com\nzhrczp.com\nzhrtc.com\nzhsapphire.com\nzhsc.net\nzhsecurity.net\nzhsho.com\nzhshw.com\nzhsrcw.com\nzhsumarc.com\nzhsunway.com\nzhsw.org\nzhswfw.com\nzhszcz.com\nzht-cn.com\nzhtdtech.com\nzhtelecom.com\nzhtfw.net\nzhtgroup.com\nzhthg.com\nzhtlq.com\nzhtmid.com\nzhty.net\nzhtyljt.com\nzhu.today\nzhuainiu.com\nzhuajiyou.com\nzhualeyixia.com\nzhuancorp.com\nzhuanfa.net\nzhuanfou.com\nzhuang520.com\nzhuangbutong.com\nzhuanghebm.com\nzhuangji.net\nzhuangjiba.com\nzhuangjinshanhe.com\nzhuangkou.com\nzhuangku.com\nzhuangpeitu.com\nzhuangshengsheng.com\nzhuangshijituansheji.com\nzhuangxiang.cc\nzhuangxiaomi.com\nzhuangxiu.com\nzhuangxiu567.com\nzhuangxiubao.com\nzhuangyanyanglao.com\nzhuangyuantao.com\nzhuangzhuang.net\nzhuanhuamao.com\nzhuanhuanqi.com\nzhuanhuanqi.net\nzhuaniao.com\nzhuaninc.com\nzhuankeapp.com\nzhuankebang.com\nzhuankezu.com\nzhuanlichaxun.net\nzhuanliqiao.com\nzhuanmenmian.com\nzhuanpinyin.com\nzhuanqianba.net\nzhuanspirit.com\nzhuanstatic.com\nzhuanwaifu.com\nzhuanyejun.com\nzhuanyepeixun.com\nzhuanyes.com\nzhuanyewanjia.com\nzhuanyezhidao.com\nzhuanyizhuanw.com\nzhuanyun.cc\nzhuanyun123.com\nzhuanzfx.com\nzhuanzhi.net\nzhuanzhuan.com\nzhuatang.com\nzhuaxia.com\nzhuayao.net\nzhuayou.com\nzhuayoukong.com\nzhuayuya.com\nzhuazi.com\nzhubai.love\nzhubai.pub\nzhubaijia.com\nzhubajie.com\nzhubajie.la\nzhubangbang.com\nzhubao.com\nzhubao668.com\nzhubaowo.com\nzhubian.com\nzhubiaoju.com\nzhubo123.com\nzhuboqiang.com\nzhuceshenzhengongsi.com\nzhuceyou.com\nzhuchao.cc\nzhucheng.com\nzhuchengdc.com\nzhuchuang.club\nzhudai.com\nzhudianquan.com\nzhufaner.com\nzhufangdianping.com\nzhufengpeixun.com\nzhuge.com\nzhuge888.com\nzhugec.com\nzhugeculture.com\nzhugefang.com\nzhugejianzhi.com\nzhugexuetang.com\nzhuhai-holitel.com\nzhuhaidutyfree.com\nzhuhaigh.com\nzhuhaihuwai.com\nzhuhaily.com\nzhuhaimarathon.com\nzhuhd.win\nzhuhua.com\nzhuhuotech.com\nzhuige.com\nzhuigong.com\nzhuiguang.com\nzhuiguangzhe.com\nzhuihd.com\nzhuihuodong.com\nzhuimabk.com\nzhuimeng8.com\nzhuimengzhu.com\nzhuinianqing.com\nzhuinw.com\nzhuiqu.com\nzhuishu.la\nzhuishukan.com\nzhuishushenqi.com\nzhuishuwang.com\nzhuishuyun.com\nzhuitiankeji.com\nzhuiwan.org\nzhuiyi.ai\nzhuiyi123.com\nzhuiyigemeng.fun\nzhuji.com\nzhuji.net\nzhuji5.com\nzhuji66.com\nzhujia100.com\nzhujia360.com\nzhujiajiao.com\nzhujianapp.com\nzhujiangbeer.com\nzhujiangfuji.com\nzhujiangrc.com\nzhujiangroad.com\nzhujianptcn.com\nzhujib.com\nzhujibaike.com\nzhujibank.com\nzhujicankao.com\nzhujiceping.com\nzhujipindao.com\nzhujipower.com\nzhujirc.com\nzhujisou.com\nzhujitao.com\nzhujiw.com\nzhujiwanjia.com\nzhujiwiki.com\nzhujiwu.com\nzhujizixun.com\nzhukai.com\nzhukang.tech\nzhukao666.com\nzhuke.com\nzhul.in\nzhulang.com\nzhulang.net\nzhulanli.com\nzhulemei.com\nzhuli999.com\nzhulianwines.com\nzhulincat.com\nzhulinedu.com\nzhulinweiye.com\nzhulixiaolie.com\nzhulogic.com\nzhulong.com\nzhulong360.com\nzhulongjiang.com\nzhulouren.com\nzhulu86.com\nzhulubox.com\nzhulusoft.com\nzhuluyy.com\nzhumanggroup.com\nzhumanggroup.net\nzhumaweb.com\nzhumengwl.com\nzhumingepc.com\nzhumiquan.com\nzhumotech.com\nzhumu.me\nzhumulive.com\nzhuna.net\nzhunaerminsu.com\nzhunbai.com\nzhunc.vip\nzhundao.net\nzhundaoyun.com\nzhuneicdn.com\nzhuneijs.com\nzhuniangjia.com\nzhuniu.com\nzhunnai.com\nzhunshitianqi.com\nzhunter.com\nzhuntui.com\nzhunzha.com\nzhuo.com\nzhuo.re\nzhuobao.com\nzhuobufan.com\nzhuodai.net\nzhuofan.net\nzhuofansoft.com\nzhuoguang.net\nzhuohaomao.com\nzhuohuamg.com\nzhuohuan-ep.com\nzhuojuead.com\nzhuokai1.com\nzhuolaoshi.com\nzhuolaoshi.net\nzhuoligk.com\nzhuomaiyun.com\nzhuomiles.com\nzhuomogroup.com\nzhuoquapp.com\nzhuoqun.info\nzhuoqun.xyz\nzhuoqundianli.com\nzhuoshigroup.com\nzhuoshixiong.com\nzhuotianchike.com\nzhuotingwl.com\nzhuoxun68.com\nzhuoyachina.com\nzhuoyi.com\nzhuoyigame.com\nzhuoyigame.site\nzhuoyitm.site\nzhuoyixuan.com\nzhuoykeji.com\nzhuoyou.com\nzhuoyoutech.com\nzhuoyue78.com\nzhuoyuechenxing.com\nzhuoyuegame.com\nzhuoyuegame.net\nzhuoyuesuoxue.com\nzhuoyuezhongxue.com\nzhuozhan.com\nzhuozhengsoft.com\nzhuozhoufangchan.com\nzhuozhourencai.com\nzhuozhuogame.com\nzhupinhr.com\nzhuqinit.com\nzhuqiy.com\nzhuqiyang.com\nzhuqu.com\nzhuque.me\nzhushan.cc\nzhushandata.com\nzhushiyao.com\nzhushou001.com\nzhust.com\nzhutao.com\nzhutaostudio.com\nzhutidasai.com\nzhutihome.net\nzhutile.com\nzhutiwo.com\nzhutix.com\nzhutix.net\nzhutix.vip\nzhutou.com\nzhutxia.com\nzhuwang.cc\nzhuwang360.com\nzhuwona.com\nzhux2.com\nzhuxian.com\nzhuxianfei.com\nzhuxiaobang.com\nzhuxuezi.com\nzhuye.kim\nzhuye.xyz\nzhuye123.com\nzhuyili.org\nzhuyitai.com\nzhuyst.cc\nzhuzao.com\nzhuzaobang.com\nzhuzaocloud.com\nzhuzhai.com\nzhuzher.com\nzhuzhichao.com\nzhuzhou.com\nzhuzhoubus.com\nzhuzhoumarathon.com\nzhuzhouwang.com\nzhuzhutown.com\nzhuzi.me\nzhuzihaoke.com\nzhuziplay.com\nzhw2101024.com\nzhwangart.com\nzhwdw.com\nzhwenxue.com\nzhwiki.net\nzhwjw.net\nzhwkg.com\nzhwxwz.com\nzhwyy.com\nzhx-mall.com\nzhx2008.com\nzhxbjsjt.com\nzhxcn.com\nzhxdfpr.com\nzhxg.com\nzhxgimg.com\nzhxhs.net\nzhxht.com\nzhxinuser.com\nzhxnyw.com\nzhxqpt.com\nzhxszq.com\nzhxwq.com\nzhxww.net\nzhxwzx.com\nzhxy1z.com\nzhyccw.com\nzhycn.com\nzhyczx.com\nzhyd.me\nzhyfkj.com\nzhyg.org\nzhyi828.com\nzhyingxiao.com\nzhylwx.vip\nzhylyy.com\nzhyouliang.com\nzhyourun.com\nzhysdxl.com\nzhyymall.com\nzhyyz.com\nzhz.com\nzhzdtz.com\nzhzf-group.com\nzhzf360.net\nzhzh.xyz\nzhzpjt.com\nzhzxin.com\nzhzyw.com\nzi-maoqu.com\nzi0.cc\nzi15.com\nzi5.cc\nzi6.cc\nzianwu.com\nzibaomuye.com\nzibasset.com\nzibll.com\nziboborui.com\nziboga.com\nzibogongli.com\nzibojinling.com\nzibomama.com\nzibomarathon.com\nzibowater.com\nzibozhongxue.com\nzibsc.com\nzichanjie.com\nzichen.zone\nzicini.com\nzicp.fun\nzicp.vip\nzidan.chat\nzidanduanxin.com\nzidanduanxin.net\nzidg.com\nzidian8.com\nzidiankeji.com\nzidianqu.com\nzidianwang.com\nzidoo.tv\nzidootv.com\nzifandiaosu.com\nzifumao.com\nzigaokj.com\nzige365.com\nzigeer.com\nzigonggroup.com\nziguhonglan.com\nzihai0351.com\nzihai0535.com\nzihai24.com\nzihaixiaochengxu.com\nzihexin.com\nzihexin.net\nzihu.com\nzihua.li\nzihua01.com\nzihuazhijia.com\nziir-robot.com\nziisp.com\nziji.work\nzijiang.com\nzijiangqy.com\nzijiantty.com\nzijieapi.com\nzijieapi.net\nzijiecdn.com\nzijiecdn.net\nzijieimg.com\nzijieimg.net\nzijiejiaodian.com\nzijietiaodong.com\nzijieurl.com\nzijieurl.net\nzijiewap.com\nzijiewap.net\nzijinfx.com\nzijinji.com\nzijinshan.net\nzijintiyu.com\nzijizhang.com\nzikao-zikao.com\nzikao.gd\nzikao211.com\nzikao365.com\nzikao5.com\nzikaobm.com\nzikaocqi.com\nzikaogd.com\nzikaoj.com\nzikaoshu.net\nzikaoshu.vip\nzikaosw.com\nzikeys.com\nzikoo-int.com\nzikoo.com\nzikui-design.com\nzilang.net\nzilhua.com\nzilian5.com\nziliao8.cc\nziliao8.com\nziliaoge.com\nziliref.com\nzilongame.com\nzilongshanren.com\nzilrms.com\nziluolanh.com\nzimilan.com\nzimlev.com\nzimoapps.com\nzimudashi.com\nzimufy.com\nzimuism.com\nzimujiang.com\nzimuzu.com\nzimuzu.io\nzimuzu.tv\nzindall.com\nzine.la\nzinffer.com\nzing-api.com\nzingfront.com\nzingke.com\nzinglix.xyz\nzingsemi.com\nziniao.com\nziniusoft.com\nzinsight-tech.com\nzintow.com\nzinyon.com\nzionpharma.com\nziooc.com\nzip118.com\nzipadc.com\nzipjpg.com\nziqingi.com\nziquyun.com\nzircite.com\nziroom.com\nziroomapartment.com\nziroomstay.com\nziruxing.com\nzisea.com\nzisen.com\nzisha.com\nzishapot.com\nzishu.life\nzishuo.com\nzishuovideo.com\nzisuo.com\nzitbbs.com\nzitengyu.com\nzitern.com\nziti163.com\nziti3.com\nziti6.com\nziti88.com\nziti9.com\nzitichina.com\nziticq.com\nzitidi.com\nzitiewang.com\nzitiguanjia.com\nzitijia.com\nzitixiazai.org\nzitiziyuan.com\nzitongit.com\nzituo.net\nziubao.com\nzivers.com\nzivoo.com\nziwanyouxi.com\nziweicn.com\nziweifu.com\nziweihuan.com\nziwoyou.net\nziwufang.com\nziwuyunjiao.com\nzixia.com\nzixiaomao.com\nzixigua.com\nzixijiaoshi.com\nzixingxinwen.com\nzixueguoxue.com\nzixuejie.com\nzixueren.com\nzixuewang.cc\nzixunauto.com\nzixunhk.com\nzixunkankan.xyz\nzixuntop.com\nziy.cc\nziya1337.com\nziyainfo.com\nziyan666.com\nziyanfoods.com\nziyanmm.com\nziyaokj.com\nziye66.com\nziyexing.com\nziyi-health.com\nziyimall.com\nziying.site\nziyou.com\nziyou.studio\nziyoufa.com\nziyouma.net\nziyouwu.com\nziyouxing.net\nziyouziti.com\nziyrta.com\nziyuan.tv\nziyuan605.com\nziyuandai.com\nziyuangou.com\nziyuanku.com\nziyuanlm.com\nziyuanm.com\nziyuanniao.com\nziyuanshare.cc\nziyuantun.com\nziyuanxiyanly.com\nziyuanyuan.com\nziyuen.com\nziyun.com\nziyunshanju.com\nzizailvyou.com\nzizdog.com\nzizhengfang.com\nzizhigx.com\nzizhijie.com\nzizhuauto.com\nzizhuhui.com\nzizhupark.com\nzizhuyuangongyuan.com\nzizhuyunxuan.com\nzizi2000.com\nzizige.com\nzizizaizai.com\nzizizizizi.com\nzizyw.com\nzizzs.com\nzj-art.com\nzj-ccmi.com\nzj-echo.com\nzj-equation.com\nzj-fhzx.com\nzj-gold.com\nzj-guojun.com\nzj-hc168.com\nzj-huawei.com\nzj-huishi.com\nzj-idc.com\nzj-innolight.com\nzj-jc.com\nzj-jinchen.com\nzj-jingyang.com\nzj-lenor.com\nzj-nongdu.com\nzj-nuolong.com\nzj-shibo.com\nzj-syfj.com\nzj-tattoo.com\nzj-tiansong.com\nzj-tuna.com\nzj-tunnel.com\nzj-yinlong.com\nzj-zhongshe.com\nzj-zhx.com\nzj-zxjx.com\nzj-zyhb.com\nzj.com\nzj01.com\nzj1058.com\nzj123.com\nzj186.com\nzj1991.com\nzj1996.com\nzj2460.com\nzj2car.com\nzj31.net\nzj315.org\nzj32.com\nzj339.com\nzj8t5.com\nzj9.co\nzj9.com\nzj93zp.com\nzj96596.com\nzjabank.com\nzjabhw.com\nzjabjc.com\nzjadgroup.com\nzjaf.net\nzjafl.com\nzjags.com\nzjaijiagroup.com\nzjaikang.com\nzjairports.com\nzjalky.com\nzjalufoil.com\nzjamo.com\nzjamp.com\nzjanchor.com\nzjanyy.com\nzjaqxy.com\nzjart.com\nzjasem.com\nzjautoparts.com\nzjaxyx.com\nzjaxzl.com\nzjbadminton.com\nzjbanger.com\nzjbar.com\nzjbdc.com\nzjbdfood.com\nzjbeacon.com\nzjbelong.com\nzjbhi.com\nzjbicycle.com\nzjbinya.com\nzjblab.com\nzjblast.com\nzjbolunfilter.com\nzjbuc.com\nzjbxcn.com\nzjbyte.com\nzjbyte.net\nzjca.org\nzjcaoban.com\nzjcarnet.com\nzjcb.com\nzjcbank.com\nzjcbcm.com\nzjcbjy.com\nzjcbl.com\nzjcdn.com\nzjceia.com\nzjcgmetal.com\nzjchanghua.com\nzjchina.org\nzjchuanning.com\nzjchuguo.com\nzjchunhui.com\nzjcio.org\nzjcjjt.com\nzjckw.org\nzjcloud.com\nzjcnbank.com\nzjcnyb.com\nzjcqk.com\nzjcrcgas.com\nzjcrjzj.com\nzjcshjt.com\nzjct56.com\nzjctm.net\nzjcuhb.com\nzjcxbank.com\nzjcyts.com\nzjcyxh.com\nzjcyyy.com\nzjda.com\nzjdadeyy.com\nzjdashi.com\nzjdata.net\nzjdeju.com\nzjdeluo.com\nzjdetong.com\nzjdfc.com\nzjdg.com\nzjdhky.com\nzjdianying.com\nzjdjc.com\nzjdjqc.com\nzjdjxh.com\nzjdkjs.com\nzjdl.com\nzjdlgroup.com\nzjdljc.com\nzjdljt.com\nzjdmxc.com\nzjdnajy.com\nzjdpco.com\nzjdsgroup.com\nzjdsz.com\nzjdtkg.com\nzjdxghy.com\nzjdxjs.com\nzjdybank.com\nzjdydlc.com\nzjdyjob.com\nzjdzqt.com\nzje.com\nzjeagles.com\nzjeav.com\nzjeclean.com\nzjecredit.org\nzjedps.com\nzjedu.com\nzjedu.org\nzjej.com\nzjemec.com\nzjeq.com\nzjerg.com\nzjetc.net\nzjevt.com\nzjfangchan.com\nzjfcdn.com\nzjfdc.net\nzjfengli.com\nzjfish.org\nzjfj.net\nzjfm.com\nzjfszhsw.com\nzjft.com\nzjftu.org\nzjfujiu.com\nzjfurnace.com\nzjg-edu.com\nzjg-jcu.com\nzjg.me\nzjgas.com\nzjgckg.com\nzjgcreative.com\nzjgengu.com\nzjgeyi.com\nzjgf88.com\nzjgfjt.com\nzjgfls.com\nzjgj.com\nzjgjj.com\nzjgkg.com\nzjgmwl.com\nzjgqt.org\nzjgrc.com\nzjgroupedu.com\nzjgrrb.com\nzjgsgroup.com\nzjgslb.com\nzjgt.com\nzjguji.com\nzjgwqxh.com\nzjgwsc.com\nzjgwy.org\nzjgwyw.org\nzjgycjj.com\nzjgyjt.com\nzjgzcpa.com\nzjgzks.com\nzjgzp.com\nzjgztz.com\nzjgzzc.com\nzjh1893.xyz\nzjha.org\nzjhac.com\nzjhaitian.com\nzjhangmo.com\nzjhangyin.com\nzjharbor.com\nzjhbdlkj.com\nzjhby.com\nzjhcbank.com\nzjhcly.com\nzjhd.com\nzjhdchem.com\nzjheacc.com\nzjheadway.com\nzjhejiang.com\nzjheliang.com\nzjhengshun.com\nzjhengyida.com\nzjhf.org\nzjhfxcl.com\nzjhi.net\nzjhkele.com\nzjhlcnc.com\nzjhlgroup.com\nzjhlyyjt.com\nzjhnlianzhong.com\nzjhnrb.com\nzjhospital.net\nzjhpyy.com\nzjhrnet.com\nzjhsfs.com\nzjhslyw.com\nzjhtcm.com\nzjhualing.com\nzjhuazhe.com\nzjhuba.com\nzjhui.net\nzjhwgroup.com\nzjhx520.com\nzjhxgf.com\nzjhxw.com\nzjhyrcb.com\nzjhzgy.com\nzjhzjt.com\nzjhzjtjt.com\nzjhzkq.com\nzjhzxc.com\nzji.net\nzjian.net\nzjibao.com\nzjiec.com\nzjiecode.com\nzjiekai.com\nzjiii.org\nzjiis.com\nzjim.org\nzjimc.com\nzjipc.com\nzjitc.net\nzjivy.com\nzjj-holiday.com\nzjjaxx.com\nzjjcbdt.com\nzjjd.org\nzjjedu.com\nzjjfl.com\nzjjfpharm.com\nzjjgy.com\nzjjgylydjc.com\nzjjgzdh.com\nzjjh.com\nzjjianhong.com\nzjjiaoke.com\nzjjinuo.com\nzjjinzi.com\nzjjizhi.com\nzjjjtec.com\nzjjky.com\nzjjlvyou8264.com\nzjjm.net\nzjjmtl.com\nzjjn.com\nzjjnzyjx.com\nzjjr.com\nzjjrh.com\nzjjrtv.com\nzjjs.net\nzjjsbank.com\nzjjsit.com\nzjjsjt.com\nzjjstzhb.com\nzjjsw.com\nzjjta.com\nzjjtgc.com\nzjjttaa.com\nzjjtwxpgs.com\nzjjubao.com\nzjjudong.com\nzjjxjt.com\nzjjxsoft.com\nzjjy.com\nzjjy.net\nzjjytyt.com\nzjjyxx.net\nzjjyzx.com\nzjjzxgj.com\nzjjzyxh.com\nzjkangzh.com\nzjkbfjd.com\nzjkccb.com\nzjkdl.com\nzjkdqz.com\nzjke.com\nzjkelan.com\nzjkeling.com\nzjkfcapital.com\nzjkgdcs.com\nzjkgjj.com\nzjkim.com\nzjkings.com\nzjkjob.com\nzjklfj.com\nzjkmtgc.com\nzjknews.com\nzjknsn.com\nzjkpet.com\nzjks.com\nzjks.net\nzjkszg.com\nzjkwhjj.com\nzjkyjs.com\nzjlande.com\nzjlca.com\nzjlcwg.com\nzjldrcb.com\nzjledfbd.com\nzjlepu.com\nzjlfdq.com\nzjlianchi.com\nzjlianhua.com\nzjlianyingkj.com\nzjlindu.com\nzjlljt.com\nzjlottery.com\nzjlsbz.com\nzjlsedu.org\nzjlvjie.com\nzjlxjs.com\nzjlxtx.com\nzjlzgg.com\nzjma.org\nzjmaerfj.com\nzjmaiou.com\nzjmana.com\nzjmax.com\nzjmc.tv\nzjmct.com\nzjmetal.com\nzjmi-mall.com\nzjmi.com\nzjmichem.com\nzjmif.com\nzjmileasing.com\nzjminb.com\nzjminghong.com\nzjmingzhen.com\nzjmingzhuang.com\nzjminong.com\nzjmj.org\nzjmjtec.com\nzjmkzx.com\nzjmobile.com\nzjmrhpt.com\nzjmrmf.com\nzjmsbt.com\nzjmtw.com\nzjmuex.com\nzjmycn.com\nzjnad.com\nzjnature.com\nzjnav.cc\nzjnav.com\nzjndjs.com\nzjnengyuan.com\nzjnews.com\nzjnrcb.com\nzjnrg.com\nzjnthkg.com\nzjnzi.com\nzjolcdn.com\nzjoldns.com\nzjorient.com\nzjoubbs.com\nzjpark.com\nzjpcedu.com\nzjpci.com\nzjpec.com\nzjphrcb.com\nzjpia.net\nzjpjmy.com\nzjplan.com\nzjpmw.com\nzjpoetry.com\nzjpost.com\nzjpse.com\nzjptcc.com\nzjpubservice.com\nzjqichuang.com\nzjqinghu.com\nzjqingshan.com\nzjqinzijianding.com\nzjqjs.com\nzjqsysj.com\nzjqzsy.com\nzjradiology.org\nzjrc.com\nzjrc.net\nzjrcu.com\nzjrdl.com\nzjrh.net\nzjriji.com\nzjrob.com\nzjrongli.com\nzjrq.com\nzjrqchina.com\nzjrtv.vip\nzjrunqiang.com\nzjrxz.com\nzjsairport.com\nzjsaisi.com\nzjsaisiet.com\nzjsalt.com\nzjsanji.com\nzjsanma.com\nzjsaz.com\nzjsbigdata.com\nzjscdb.com\nzjsck.com\nzjscs.com\nzjsdbjt.com\nzjseaport.com\nzjsee.org\nzjsftc.com\nzjsgjs.com\nzjshangfeng.com\nzjshcl.com\nzjshibao.com\nzjshijian.com\nzjshining.com\nzjshipyard.com\nzjshjkj.com\nzjshuangtu.com\nzjshuhao.com\nzjshuo.com\nzjshwl.com\nzjsight.com\nzjsjcjt.com\nzjsjjjt.com\nzjsjky.com\nzjsjty.com\nzjsjtz.com\nzjskgr.com\nzjskjt.com\nzjslep.com\nzjslzh.com\nzjsms.com\nzjspas.com\nzjssjt.com\nzjsszsjy.com\nzjsta.org\nzjstar-electric.com\nzjstm.org\nzjstv.com\nzjsuntex.com\nzjsw.org\nzjswxpx.com\nzjsxkj.com\nzjsxlt.com\nzjsxrz.com\nzjsxss.com\nzjsyyhyxh.com\nzjszbank.com\nzjszjz.com\nzjszrc.com\nzjszsyy.com\nzjszyyxh.com\nzjszzs.com\nzjt2017.com\nzjtaa.net\nzjtbe.com\nzjtcc.com\nzjtcjt.com\nzjtcn.com\nzjtcpm.com\nzjtdw.com\nzjtdyl.com\nzjtea.com\nzjteam.com\nzjtggroup.com\nzjtic.com\nzjtjw.com\nzjtkdz.com\nzjtlcb.com\nzjtmb.com\nzjtmkg.com\nzjtntd.com\nzjtobacco.com\nzjtongde.com\nzjtp.com\nzjtree.com\nzjts.com\nzjtxedu.org\nzjtyphoon.com\nzjtzcx.com\nzjtzedu.com\nzjtzwater.com\nzju88.org\nzjubh.com\nzjuers.com\nzjugis.com\nzjuiwz.com\nzjujournals.com\nzjukf.com\nzjun.info\nzjuqsc.com\nzjut.cc\nzjvending.com\nzjwandi.com\nzjwanma.com\nzjwater.com\nzjwater.org\nzjwc168.com\nzjwcjm.com\nzjwcqp.com\nzjwebapp.com\nzjwentou.com\nzjwfgroup.com\nzjwhhly.com\nzjwhyis.com\nzjwiki.com\nzjwit.net\nzjwjrc.com\nzjwk.com\nzjwmw.com\nzjwqw.com\nzjws.net\nzjwsbidding.com\nzjwttools.com\nzjwu.net\nzjwxbank.com\nzjwzba.com\nzjwzbearing.com\nzjxc.com\nzjxcsw.com\nzjxf119.com\nzjxhbj.com\nzjxhedu.com\nzjxhgd.com\nzjxhxny.com\nzjxindongyang.com\nzjxindu.com\nzjxinghe.com\nzjxinyun.com\nzjxjrc.com\nzjxlmb.com\nzjxltz.com\nzjxlyp.com\nzjxnd.com\nzjxpp.com\nzjxqyy.com\nzjxs.work\nzjxsbank.com\nzjxssj.com\nzjxtxs.com\nzjxwjs.com\nzjxwkg.com\nzjxwtoy.com\nzjxxkx.com\nzjxxt.com\nzjxymy.com\nzjxzgrd.com\nzjyanxing.com\nzjyari.com\nzjycpx.com\nzjyfyxzz.com\nzjyhjsjt.com\nzjyhqy.com\nzjyingcai.com\nzjyinzuo.com\nzjyiot.com\nzjyiyuan.com\nzjykrc.com\nzjylbx.com\nzjylgroup.com\nzjyonder.com\nzjyoutian.com\nzjyq.cc\nzjysgroup.com\nzjytxl.com\nzjyxzzs.com\nzjyyc.com\nzjyygy.com\nzjyzpcxx.com\nzjza.com\nzjzajsjt.com\nzjzcec.com\nzjzcen.com\nzjzcj.com\nzjzfj.com\nzjzfjs.com\nzjzg.com\nzjzhd.com\nzjzhengding.com\nzjzhengxingyiyuan.com\nzjzhengyao.com\nzjzhenyou.com\nzjzhitan.com\nzjzhongcheng.com\nzjzhonglan.com\nzjzhongtian.com\nzjzj.net\nzjzj.org\nzjzjjx.com\nzjzoneng.com\nzjzramc.com\nzjzrzyjy.com\nzjzs.net\nzjzsa.com\nzjzsco.com\nzjzsxb.com\nzjzwlab.com\nzjzy.com\nzjzybiotech.com\nzjzydns.com\nzjzygroup.com\nzjzyxs.com\nzk0771.com\nzk100.com\nzk2013.com\nzk5u.com\nzk678.com\nzk71.com\nzk789.net\nzkailun.com\nzkauto.com\nzkb77.com\nzkbhj.com\nzkbs.net\nzkck.com\nzkcmg.com\nzkcrm.com\nzkcserv.com\nzkcx.com\nzkdt.net\nzke999.com\nzkecopro.com\nzkedrive.com\nzkgenergy.com\nzkh.com\nzkh360.com\nzkhb.group\nzkhcsoft.com\nzkhcsy.com\nzkhgchip.com\nzkhj618.com\nzkicme.com\nzking.com\nzkjan.com\nzkjds.com\nzkkailiaoji.com\nzkkjpa.com\nzkl2333.com\nzkmeiling.com\nzkmob.net\nzknmattress.com\nzkoffcn.com\nzkpeace.com\nzkpk.org\nzkrdlab.com\nzkreen.com\nzkroom.com\nzkrsks.com\nzksbxhyxh.com\nzkscgj.com\nzksglaser.com\nzkshare.com\nzksn.com\nzksoftwaresz.com\nzksps.com\nzksyzy.com\nzktecn.com\nzkteco.com\nzkteco.xin\nzktecoiot.com\nzktecosj.com\nzktest.com\nzktimecube.com\nzktools.net\nzktw.com\nzku.net\nzkunet.com\nzkungfu.com\nzkuyun.com\nzkw2009.com\nzkwtech.com\nzkxblog.com\nzkxww.com\nzkyai.com\nzkydib.com\nzkyl.vip\nzkyouxi.com\nzkyxc.com\nzkyxls.com\nzkzbkj.com\nzkzj.org\nzkzls.com\nzkzn666.com\nzkzs.net\nzl-steelpipe.com\nzl1006.com\nzl168.xyz\nzl56.com\nzl99.org\nzlbaba.com\nzlbagx.com\nzlca.org\nzlcool.com\nzldatas.com\nzldq.org\nzle.com\nzlf.co\nzlfc.mobi\nzlfedu.com\nzlfind.com\nzlfshop.com\nzlfzyj.com\nzlg.com\nzlgcgl.com\nzlghr.com\nzlglpt.com\nzlgmcu.com\nzlgpy.com\nzlgsj.com\nzlh-zh.com\nzlhome.com\nzlhospital.com\nzlhui.com\nzlibs.com\nzlingad.com\nzlink-e.com\nzlinkurl.com\nzlitoa.cc\nzlitoa.com\nzljskb.com\nzljweb.com\nzljx.net\nzlkb.net\nzlketang.com\nzlkj20.com\nzlm4.com\nzlmlt.com\nzlnewlife.com\nzlongame.com\nzlook.com\nzlprc.com\nzlpumps.com\nzlqb.net\nzlqbk.com\nzlqh.com\nzlqiao.com\nzlqx.com\nzlr6.com\nzls365.com\nzlscn.net\nzlsin.com\nzlsoft.com\nzlsqlt.com\nzlsss.com\nzlsyun.com\nzlt365.com\nzltianhen.com\nzlttxl.com\nzluren.com\nzlview.com\nzlvod.com\nzlwh2026.com\nzlwl.vip\nzlwlhse.com\nzlx.com\nzlxiang.com\nzly169.com\nzlygjzx.com\nzlygu.com\nzlysgl.com\nzlzlzsl.com\nzlzscq.com\nzlzt.com\nzm-assemble.com\nzm-clock.com\nzm-ep.com\nzm-grow.com\nzm-introduce.com\nzm-invite.com\nzm-mp.com\nzm-wx.com\nzm0772.com\nzm1717.com\nzm30.com\nzmapp.com\nzmaxfilm.com\nzmaxhotels.cc\nzmbesta.com\nzmbg.com\nzmbga.com\nzmc-china.com\nzmcchina.com\nzmccx.com\nzmclearing.com\nzmd5.com\nzmdfcw.com\nzmdfdc.com\nzmdsbus.com\nzmdsjob.com\nzmdwater.com\nzmdyzkgjt.com\nzmdz.com\nzmeetb.com\nzmeng.cc\nzmeng123.com\nzmengzhu.com\nzmgov.com\nzmgrcw.com\nzmhttp.com\nzmifi.com\nzmingcx.com\nzmirrordemo.com\nzmis.me\nzmister.com\nzmjiudian.com\nzmjm.com\nzmkmex.com\nzmlearn.com\nzmmek.com\nzmmio.com\nzmndjm.com\nzmnedu.com\nzmnh.com\nzmnjtwx.com\nzmnoa.com\nzmnrz.com\nzmnxbc.com\nzmobuy.com\nzmpal.com\nzmqh.com\nzmqmt.com\nzmren.com\nzmrenwu.com\nzmshz.com\nzmsq.com\nzmssh.com\nzmtpc.com\nzmtquan.com\nzmubf.com\nzmufivehospital.com\nzmumu.com\nzmweb.net\nzmwo.com\nzmwxxcx.com\nzmxitang.com\nzmye5vly.com\nzmyui.com\nzmyyc.com\nzmz001.com\nzmz002.com\nzmz003.com\nzmz004.com\nzmz2019.com\nzmzapi.com\nzmzapi.net\nzmzb.com\nzmzjt.com\nzmzx.cc\nzn99.com\nznba.net\nznbo.com\nznc365.com\nzncar.com\nzncmjt.com\nznczz.com\nzndata.com\nzndlkj.com\nzndls.com\nzndns.com\nznds.com\nznds.net\nzndsbbs.com\nzndsrom.com\nzndstec.com\nznelc.com\nznfit.com\nzngm.com\nzngue.com\nzngxjt.com\nznhhmedical.com\nznhospital.com\nznhr.com\nznhwhw.com\nznjchina.com\nznjj.tv\nznjs.com\nznjsjt.com\nznjtgf.com\nznjttz.com\nznlc2015.com\nznlcn.org\nznlerp.com\nznlh.com\nznmq.com\nznnu.com\nznonline.net\nznp9.com\nznpin.com\nznpla.space\nznrfwy.com\nznrom.com\nznrsc.com\nznshuke.com\nznshuru.com\nznsjw.com\nznsmart.com\nznstartups.com\nzntb.net\nzntcexpo.com\nzntschool.com\nzntvrom.com\nzntx.cc\nznum.com\nznwb.com\nznxdxs.com\nznxhd.com\nznxk.net\nznyp.com\nznypjy.com\nznzcompass.com\nznzcompass.net\nznzmo.com\nznzncn.com\nznznet.net\nznztool.com\nznztv.com\nznzyf.com\nzo-station.com\nzo5yap5sdc.com\nzoassetmanagement.com\nzobmxcfw.com\nzocai.com\nzocolor.com\nzocoxx.com\nzodgame.me\nzoe360.com\nzoebon.com\nzoeeasy.com\nzoeess.com\nzoform.com\nzofund.com\nzoharforce.com\nzohead.com\nzohi.tv\nzoioo.com\nzoje.com\nzojirushi-china.com\nzokmetal.com\nzokogo.com\nzol-img.com\nzol.com\nzollty.com\nzoloz.net\nzomanbio.com\nzombiescat.com\nzomiu.com\nzomsky.com\nzon100.com\nzonafs.com\nzonboapp.com\nzonci.com\nzone-king.com\nzone.id\nzone139.com\nzoneben.com\nzoneidc.com\nzoneker.com\nzonelo.tech\nzonen-tech.com\nzoneray56.com\nzoneve.com\nzoneyung.com\nzonezu.com\nzongcaidetishenqianqi.net\nzongdegongju.com\nzonghangsl.com\nzonghe.com\nzonghe888.com\nzongheng.com\nzongheng001.com\nzonghengke.com\nzonghengxiaoshuo.com\nzonglai.com\nzonglikeji.com\nzongming.net\nzongmutech.com\nzongs365.com\nzongshengjituan.com\nzongtiku.com\nzongxiankj.com\nzongyiconverge.com\nzongyifile.com\nzongyigame.com\nzongyimobile.com\nzongyionline.com\nzongyiphone.com\nzongyixun.com\nzonhen.com\nzonsengroup.com\nzonsenmotor.com\nzontes.com\nzonxiebamboo.com\nzoocer.com\nzoocoffee.com\nzooelab.com\nzoofon.com\nzookingsoft.com\nzookparts.com\nzoolnasm.com\nzoom3g.com\nzoomerstudio.com\nzoomeye.org\nzoomfr.com\nzoomla.net\nzoomlion.com\nzoomwo.com\nzoopda.com\nzoossoft.com\nzooszyservice.com\nzoot.plus\nzootope.ink\nzooyoo.cc\nzoqlan.com\nzoranchem.com\nzoroli.com\nzorrospray.com\nzorun.com\nzoscape.com\nzosurrdc.com\nzotiser.com\nzotrppzv.com\nzotrus.com\nzotumgxr.com\nzotye.com\nzou.la\nzouaw.com\nzoubiao.com\nzoucheng.cc\nzoucz.com\nzoues.com\nzouhong365.com\nzouht.com\nzouin.net\nzoujiang.com\nzoukankan.com\nzoular.com\nzoutu.com\nzouzhi.world\nzouzhiqiang.com\nzovps.com\nzowoyoo.com\nzoxun.com\nzoyoo.net\nzoyse.com\nzoyst.com\nzoyuecs.com\nzozen.com\nzp.cc\nzp.do\nzp005.com\nzp0716.com\nzp114.net\nzp365.com\nzp515.com\nzpan.space\nzparking-tech.com\nzpascal.net\nzpb365.com\nzpbtnpl.com\nzpc-cn.com\nzpcdi.com\nzpchaji.com\nzpcmshopping.com\nzpedu.com\nzpedu.org\nzpfdc.com\nzpgd.net\nzphit.com\nzphlkj.com\nzphospital.com\nzpjkcy.com\nzplay.com\nzplayworld.com\nzpm.so\nzpmc.com\nzpmg.com\nzpparts.com\nzpstar.com\nzpt966033.com\nzptq.com\nzpug.net\nzpwamdew.com\nzpwcb.com\nzpwz.net\nzpxrmyy.com\nzq12369.com\nzq235.com\nzq6.com\nzqagr.com\nzqaqxh.com\nzqase.com\nzqbykj.com\nzqcaf.com\nzqcloud.com\nzqcloudgame.com\nzqcyzg.com\nzqd086.com\nzqdns37.vip\nzqedu.net\nzqfdc.net\nzqgame.com\nzqgjz1312.com\nzqgreen.com\nzqhthr.com\nzqhuahui.com\nzqhuwkc.com\nzqic.net\nzqids.com\nzqin758.xyz\nzqjcedu.com\nzqjiese.com\nzqjinneng.com\nzqlian.com\nzqlx.com\nzqnf.com\nzqpj.com\nzqread.com\nzqsign.com\nzqsjf.com\nzqsos.com\nzqsx.net\nzqtbg.com\nzqtbu.com\nzqtong.com\nzquan.cc\nzquan.org\nzqvip8.cc\nzqwfe.work\nzqwh.com\nzqwxzf.com\nzqxsc.com\nzqy.com\nzqygame.com\nzqyxf.com\nzqz510.com\nzqzd.com\nzqzyxx.com\nzr-fanuc.com\nzr66.com\nzrahh.com\nzran88.com\nzrblog.com\nzrblog.net\nzrbx.com\nzrcaifu.com\nzrcbank.com\nzrfan.com\nzrfe.com\nzrfilm.com\nzrhsh.com\nzring.com\nzritc.com\nzrj96.com\nzrkjy.com\nzrlyyy.com\nzrmm.com\nzrpta.com\nzrpwxgp.com\nzrtechnology.com\nzrtg-group.com\nzrtg.com\nzrthink.com\nzrtjt.com\nzrway.com\nzrwjk.com\nzrxdsj.com\nzry97.com\nzrzhpt.com\nzs-ah.com\nzs-e.com\nzs-frd.com\nzs-hospital.com\nzs-jlc.com\nzs-lzlj.com\nzs-nj.com\nzs-rh.com\nzs-united.com\nzs6y.com\nzs8q.com\nzs9.com\nzs91.com\nzsaber.com\nzsacg.com\nzsaeroengine.com\nzsafedns.net\nzsaipay.com\nzsamc.com\nzsanxing.com\nzsaxi.com\nzsb2c.com\nzsbeike.com\nzsboai.com\nzsbqgz.com\nzsbsoft.com\nzsbus.wiki\nzsbyw.com\nzsc-group.com\nzscbd.com\nzscch.com\nzsceta.com\nzschem.com\nzsciupd.com\nzscjjt.com\nzscollege.com\nzsctgroup.com\nzscz0768.com\nzsd.name\nzsdianlan.com\nzsdlw.com\nzsdown.com\nzsedu.net\nzsemall.com\nzsemi.com\nzsengine.com\nzseoo.com\nzsex.ltd\nzsezt.com\nzsfund.com\nzsfzjs.com\nzsg6.com\nzsgai.com\nzsgcgj.com\nzsgd.com\nzsgjs.com\nzsglrj.com\nzsgoodlighting.com\nzsgsly.com\nzsgzc.com\nzsh.com\nzsh8.com\nzshandsome.com\nzshc12306.com\nzshcx.com\nzshgsoft.com\nzshhjt.com\nzshield.net\nzshl.com\nzshnb.com\nzshpldbz.com\nzshsoft.com\nzshszy.com\nzshtys888.com\nzshuoshao.store\nzshuoshao.tech\nzshypr.com\nzsia.org\nzsihuo.com\nzsimc.com\nzsincer.com\nzsite.com\nzsj18.com\nzsjdxh.org\nzsjhsjy.com\nzsjhx.com\nzsjjob.com\nzsjuchuang.com\nzsjz.com\nzskoubei.com\nzsksdw.com\nzsksw.net\nzslady.com\nzslefx.art\nzslhs.com\nzslin.com\nzslp021.com\nzsmama.com\nzsmeishiling.com\nzsmls.com\nzsmw.net\nzsmyy.com\nzsmz.com\nzspharm.com\nzsppsj.com\nzsquant.com\nzsqx.com\nzsr.cc\nzsscw.net\nzssjzyxh.com\nzssl.net\nzssmk.net\nzssph.com\nzssubeihospital.com\nzsswjt.com\nzssxyy.com\nzsszsh.com\nzsszyy.com\nzstack.io\nzstack.org\nzstatic.net\nzstaticcdn.com\nzsthk.com\nzstime.com\nzstled.com\nzsuan.com\nzsucai.com\nzsufivehos.com\nzsvsz.com\nzswater.com\nzswcn.com\nzswebao.shop\nzswj.com\nzswmailbox.com\nzswpqfep.com\nzswtjt.com\nzswyprkq.com\nzsxfsy.com\nzsxgzn.com\nzsxinsha.com\nzsxq.com\nzsxq100.com\nzsxsoft.com\nzsyanxuan.com\nzsyknk.com\nzsynjt.com\nzsysgz.com\nzsythink.net\nzsytit.com\nzsyyart.com\nzszk.net\nzszq.com\nzszxsz.com\nzszyss.com\nzt-express.com\nzt-g.com\nzt-info.com\nzt-job.com\nzt-motor.com\nzt0729.xyz\nzt1356.com\nzt1388.com\nzt17.com\nzt1f.com\nzt24j.com\nztautoparts.com\nztbeijixing.com\nztbest.com\nztcdata.com\nztcexam.com\nztch.ltd\nztcia.com\nztcjjt.com\nztcnwy.com\nztcpa.com\nztdgroup.com\nztdli.com\nztdsp.com\nzte.net\nztedevice.com\nztedevices.com\nztedu.com\nztedu8.com\nztehotel.com\nztehotel.net\nztemall.com\nztemap.com\nztems.com\nztestin.com\nztfans.com\nztfsec.com\nztfssc.com\nztgame.com\nztgcglzx.com\nztgy.org\nzthrv.com\nzthsqx.com\nzthx.com\nzthx2004.com\nztinfoga.com\nztjczx.com\nztjhuyu.com\nztjinchi.com\nztjoin.com\nztjttz.com\nztjy61.com\nztjystore.com\nztjzgf.net\nztjzht.com\nztkm.com\nztkosen.com\nztky.com\nztkycn.com\nztlycm.com\nztmao.com\nztmvip.com\nztn.com\nztnews.net\nztno.com\nztnwork.com\nztny188.com\nzto.com\nzto.net\nzto56.com\nztoapp.com\nztoglobal.com\nztogroup.com\nztomember.com\nztoyh.com\nztqft.com\nztqqt.com\nztrczp.com\nztrhmall.com\nztrong.com\nztsafe.com\nztshjcb.com\nztsiot.com\nztskc.com\nztt.cc\nzttx-exp.com\nzttx.com\nztupic.com\nztups.com\nztvcar.com\nztweld.com\nztwlbeijing.com\nztwlgyl.com\nztwzcg.com\nztwzsc.com\nztxinli.com\nztxxr.com\nztxyg.com\nztxygj.com\nztxywy.net\nztxz.cc\nztxzsjt.com\nztyang.com\nztytech.com\nztyyw.com\nztzcnc.com\nztzhbw.com\nztzhgw.com\nztzhsq.com\nztzjt.com\nztzqzg.com\nztzsnn.com\nztzupu.com\nztzy.com\nztzzls.com\nzu.biz\nzu1tai.com\nzu3.com\nzuadr.com\nzuan-cheng.com\nzuan88.com\nzuanke8.com\nzuanqianyi.com\nzuanshi.com\nzuanshitoupiao.com\nzubei.co\nzuber.im\nzubunet.com\nzucaijia.com\nzucangbao.com\nzuchang1688.com\nzuche.com\nzuche900.com\nzuchecdn.com\nzuchuan.cc\nzuciz.com\nzucp.net\nzudequ.com\nzudong.com\nzuduijun.com\nzueiai.net\nzuezu.com\nzufang.com\nzufangzi.com\nzugame.com\nzugeliang01.com\nzugeqifu.com\nzuhao.space\nzuhaoapp.com\nzuhaofa.com\nzuhaohao.com\nzuhaowan.com\nzuhaowan.net\nzuhedaikuan.com\nzuhuaizhijia.com\nzuhuanhao.com\nzui.com\nzui5.com\nzui88.com\nzuiaixs.net\nzuiben.com\nzuibook.com\nzuicool.com\nzuidaima.com\nzuidijia.com\nzuidongxi.com\nzuifengyun.com\nzuifuli.com\nzuigx.com\nzuihaodaxue.com\nzuihuimai.com\nzuihuixue.com\nzuijh.net\nzuijiao.net\nzuik.ren\nzuiku.com\nzuikzy.com\nzuikzy.win7i.com\nzuimeia.com\nzuimeiqidai.com\nzuimeitianqi.com\nzuiqiangyingyu.net\nzuiqingfeng.com\nzuishidai.com\nzuitang.com\nzuitu.com\nzuiwan.net\nzuixiaoyao.com\nzuixu.com\nzuiyanke.com\nzuiyou.com\nzuiyouxi.com\nzuizhifu.com\nzuji360.com\nzujiant.com\nzujuan.com\nzujuanku.com\nzujuanyi.com\nzuk.com\nzuka666.com\nzukang88.com\nzuke.com\nzuker.im\nzulijian.com\nzulin.com\nzulinbao.com\nzulinks.com\nzulllv.com\nzulong.com\nzulongacmall.com\nzulongtea.com\nzumbacn.com\nzumulv.com\nzun.com\nzun.gd\nzun9.com\nzunnou.com\nzunsf.com\nzunsou.com\nzunxiang17.com\nzunxun.com\nzunxun.net\nzunyibus.com\nzunyihospital.com\nzuo11.com\nzuo3.com\nzuoanedu.com\nzuoanfloor.com\nzuobaike.net\nzuobiao.press\nzuobin.net\nzuocaibusiness.com\nzuocaicn.com\nzuocheng.net\nzuodanye.com\nzuodao.com\nzuodashi.com\nzuodia.com\nzuofawang.com\nzuogj.com\nzuoh5.com\nzuohaotu.com\nzuohome.com\nzuohuodong.com\nzuoji-scm.com\nzuojiachubanshe.com\nzuojiang.com\nzuojiawang.com\nzuojing.com\nzuojj.com\nzuoli.com\nzuolin.com\nzuoqu.com\nzuoqudashi.net\nzuosa.com\nzuoshangbao.com\nzuoshouyisheng.com\nzuoshujiang.com\nzuotishi.com\nzuoweibc.com\nzuowen.com\nzuowen.net\nzuowen8.com\nzuowenjing.com\nzuowenjun.com\nzuowenku.net\nzuowenren.com\nzuowenwang.net\nzuowenzhitiao.com\nzuoyebang.cc\nzuoyebang.com\nzuoyebao.com\nzuoyebao.net\nzuoyehezi.com\nzuoyesou.com\nzuoyou-sofa.com\nzuozu.net\nzuozuowang.net\nzupig.com\nzupuk.com\nzupulu.com\nzuqiuba.com\nzuqiuba.net\nzusan.com\nzushouji.com\nzushoushou.com\nzuszw.com\nzutingwan.com\nzuulee.com\nzuwuzhuyi.com\nzuxiaoqi.com\nzuxiaoyi.com\nzuyaxi.com\nzuyizhan.com\nzuyouzu.com\nzuyunfei.com\nzuyushop.com\nzuzheyong.com\nzuzhirenshi.com\nzuzitech.com\nzuzuche.com\nzuzuqueen.com\nzviewcloud.com\nzving.com\nzvryuq7xg31x5g.com\nzvstapp.com\nzvsts.com\nzvv.me\nzw-tencentclb.cloud\nzw-tencentclb.com\nzw-tencentclb.net\nzw-tencentclb.work\nzw110.com\nzw3dp.com\nzw69.com\nzw885.com\nzwads.com\nzwayoptik.com\nzwaztizp.com\nzwbdata.com\nzwcad.com\nzwcctv.com\nzwcnw.com\nzwcsm.com\nzwcuo.com\nzwda.com\nzwdn.com\nzwdns.com\nzwds.cc\nzwdsty.com\nzwduxs.com\nzwechat.com\nzwefu.com\nzwelec.com\nzwfw.com\nzwgeek.com\nzwgfood.com\nzwggb.com\nzwgjpx.com\nzwgt.net\nzwgx.com\nzwhuilian.com\nzwhz.com\nzwie2003.com\nzwjczx.com\nzwjhl.com\nzwjiaoyu.com\nzwjk.com\nzwjkey.com\nzwjl.net\nzwk999.com\nzwkf.net\nzwlhome.com\nzwmrxd.com\nzwoasi.com\nzwoptical.com\nzwoptics.com\nzwslshy.com\nzwsmds.com\nzwtianshangm.com\nzwtkl8.com\nzwtxipr.com\nzwuoo.com\nzwwank.com\nzwwdm.com\nzwwlgzs.com\nzwwltkl.com\nzwwx.com\nzwxww.net\nzwxx2022.com\nzwying.com\nzwyll.com\nzwyq110.com\nzwzdiy.cc\nzwzrent.com\nzwzsh.net\nzwzyzx.com\nzx-tour.com\nzx-xcx.com\nzx0093.com\nzx017.com\nzx017.net\nzx0818.com\nzx100.com\nzx10000.com\nzx110.org\nzx1234.com\nzx16f.com\nzx181.com\nzx18x.com\nzx3002.com\nzx350zx.com\nzx42195.com\nzx7b.com\nzx8.com\nzx98.com\nzx990.com\nzxb12315.com\nzxblinux.com\nzxbook.net\nzxbzr.com\nzxchemgroup.com\nzxcmk.com\nzxcoder.com\nzxczw.com\nzxd.com\nzxd666.com\nzxdkj.com\nzxdoo.com\nzxdu.net\nzxdyw.com\nzxerp.com\nzxfsv.online\nzxfw888.com\nzxfwgj.com\nzxgcloud.com\nzxgj56.com\nzxgongshui.com\nzxgroup.com\nzxgstock.com\nzxgzs.com\nzxgzw.com\nzxhgroup.com\nzxhmjj.com\nzxhnzq.com\nzxhong.com\nzxhospital.com\nzxhsd.com\nzxhuman.com\nzxhwzm.com\nzxiaosi.com\nzxiaoxiang.com\nzxicrm.com\nzxinc.org\nzxingyun.com\nzxinzxw.com\nzxip.com\nzxiti02.com\nzxiu.com\nzxiw.com\nzxiyun.com\nzxja.com\nzxjkj.com\nzxjsq.net\nzxjy.net\nzxk120.com\nzxknow.com\nzxkq022.com\nzxky007.com\nzxl.com\nzxlib.com\nzxliu.com\nzxlo.com\nzxls.com\nzxmall.com\nzxmn2018.com\nzxmoto.com\nzxmseed.com\nzxneweye.com\nzxnic.net\nzxnrh.com\nzxoid.com\nzxopen.com\nzxpcloud.com\nzxpec.com\nzxpmq.com\nzxqfjt.com\nzxqg.com\nzxrcfw.com\nzxsauto.com\nzxsctf.com\nzxshe.com\nzxsmd.com\nzxsou.com\nzxstyl.com\nzxswjx.com\nzxsx.org\nzxsxs.com\nzxsygs.com\nzxt2007.com\nzxtang.com\nzxtnetwork.com\nzxttax.com\nzxtw168.com\nzxw1.com\nzxwcbj.com\nzxwindow.com\nzxwyouxi.com\nzxx.world\nzxxk.com\nzxxmr.com\nzxxww.com\nzxxwypsj.com\nzxxxkj.com\nzxxyedu.com\nzxydss.com\nzxyee.com\nzxz.ee\nzxzhijia.com\nzxzls.com\nzxzmail.com\nzxzt123.com\nzxzx8.com\nzxzyl.com\nzxzyy.com\nzy-cam.com\nzy-geo.com\nzy-textiles.com\nzy.com\nzy100.com\nzy120.com\nzy169.net\nzy223.com\nzy234.com\nzy728.com\nzy91.com\nzy99.net\nzyactech.com\nzyalc.com\nzyan.cc\nzyan456.com\nzyanzn.com\nzyark.com\nzyautoe.com\nzybang.com\nzybaoan.com\nzybest.com\nzybtp.com\nzybuluo.com\nzybwhsb.com\nzybwj.cc\nzybz518.com\nzyc123.com\nzyccst.com\nzycits.com\nzycitscn.com\nzycjcrz.org\nzycmmt.com\nzyctd.com\nzycultura.com\nzyczg.com\nzydanxia.com\nzydlks.com\nzydsy.com\nzydtrip.net\nzydza.com\nzydzkjcloud.com\nzye.cc\nzyea.com\nzyecp.com\nzyedu.org\nzyfb.com\nzyfbjzsc.com\nzyfchina.com\nzyfj.com\nzyfsz.net\nzygames.com\nzygj.net\nzygjtzjt.com\nzygs.com\nzygvqivs.com\nzygx8.com\nzygxxs.com\nzyh365.com\nzyhao.com\nzyhbjt.com\nzyhbxs.com\nzyhh.cc\nzyhobby.com\nzyholding.com\nzyhot.com\nzyict.net\nzying.net\nzyip.com\nzyiwater.com\nzyixi.xyz\nzyixinx.com\nzyjhzyy.com\nzyjiajiao.com\nzyjjt.com\nzyjkwh.com\nzyjoygame.com\nzyjtgas.com\nzyjthb.com\nzyjymall.com\nzyjyxx.com\nzyjyyun.com\nzyka.cc\nzykj0668.com\nzykjct.com\nzykjgame.com\nzykjnet.com\nzykpic.com\nzyks-lv.com\nzykths.com\nzyku.net\nzyl.me\nzylianto.com\nzylseo.com\nzymc1.com\nzymkcdn.com\nzymkshop.com\nzymreal.com\nzyms8.me\nzyoffice.com\nzyoo.net\nzyoogame.com\nzyops.com\nzyou100.com\nzyouexpress.com\nzyoulun.com\nzyoung.me\nzypharm.com\nzyplayer.com\nzyq.today\nzyq366.com\nzyqcs.com\nzyqjg.com\nzyqjs.com\nzyqxt.com\nzyqzyyy.com\nzyrack-china.com\nzyrb.com\nzyrc168.com\nzyrj.org\nzyrm.com\nzyrykbiandao.com\nzys6d.com\nzysd.work\nzyskys.com\nzysljhslt.com\nzysou.com\nzystarlink.com\nzyswsb.com\nzysxqgs.com\nzysyjqrmyy.com\nzyszyx.com\nzyt8.com\nzytang.net\nzytm913.com\nzyucan.com\nzyue.com\nzyun.vip\nzyvqb.com\nzywjw.com\nzywsw.com\nzywtc.com\nzywvvd.com\nzywxgames.com\nzywxpress.com\nzyxhmm.com\nzyxintuo.com\nzyxmmovie.com\nzyxr.com\nzyxxlyg.com\nzyxyfy.com\nzyxzyyy.com\nzyydb.com\nzyydjk.net\nzyyfy.com\nzyyimin.com\nzyykj168.com\nzyylee.com\nzyz119.com\nzyzhan.com\nzyzl120.com\nzyzw.com\nzz-hh.com\nzz-invest.com\nzz.ci\nzz123456789.xyz\nzz2024.com\nzz2z.com\nzz314.com\nzz34.com\nzz597.com\nzz618.com\nzz6789.com\nzz8j.com\nzz91.com\nzz96269.com\nzz9ivb.com\nzzairport.com\nzzay.net\nzzbaike.com\nzzbbs.com\nzzbd.org\nzzboiler.com\nzzboyou.com\nzzbs.org\nzzbtool.com\nzzbtv.com\nzzc9.com\nzzccom.com\nzzccp.com\nzzcdnx.com\nzzcjby.com\nzzcjxy.com\nzzcm1.com\nzzcm2.com\nzzcm5.com\nzzcomm.com\nzzcrcgas.com\nzzd.pub\nzzdengji.com\nzzdh.net\nzzdjw.com\nzzdkdz.com\nzzdl.com\nzzdnews.com\nzzdsj.com\nzzdtec.com\nzzect.com\nzzepa.org\nzzfcw.com\nzzfeilu.com\nzzfh.com\nzzfly.net\nzzfreshair.com\nzzfriend.com\nzzgcjyzx.com\nzzgdapp.com\nzzgeli.net\nzzgjj.com\nzzgkyy.com\nzzgtjtgs.com\nzzguest.com\nzzguifan.com\nzzhaofang.com\nzzhaoz.com\nzzhbgs.com\nzzhfkm.com\nzzhuanruan.com\nzzhx56.com\nzzhybz.com\nzzicpa.com\nzzidc.com\nzzjdgcxx.com\nzzjianyun.com\nzzjidi.com\nzzjldsx.com\nzzjob88.com\nzzjsled.com\nzzjunzhi.com\nzzjxbg.com\nzzjyi.com\nzzk001.com\nzzkcjq.com\nzzkehui.com\nzzkjgy.com\nzzkk.cc\nzzksjx.com\nzzlcjj.xyz\nzzlgxy.net\nzzliot.com\nzzlirui.com\nzzlive.zzc-media.com\nzzllq.com\nzzlongyou.com\nzzlt.net\nzzltsw.com\nzzluohang.com\nzzlvjuren.com\nzzlvwang.com\nzzmama.net\nzzmetro.com\nzzmingtai.com\nzzmlb.com\nzzms.com\nzzmxbc.com\nzzmy.net\nzzmyt.com\nzznah001.com\nzznst.com\nzznyy.com\nzzprotect.com\nzzptech.com\nzzpzh.com\nzzq12345.gearhostpreview.com\nzzqckj.com\nzzqfte.com\nzzqiyou.com\nzzqklm.com\nzzqrr.com\nzzqss.com\nzzquan9.com\nzzqudu.com\nzzqxs.com\nzzqz2024.com\nzzqzz.com\nzzrc.net\nzzrcw.net\nzzrmyy.com\nzzrseng.com\nzzs5.com\nzzs5.info\nzzsdyrmyy.com\nzzsey.com\nzzsf.com\nzzsggzy.com\nzzsgjj.com\nzzshe.com\nzzsi.com\nzzsiji.com\nzzsin.com\nzzsjzyxh.com\nzzslyy.com\nzzsmt.com\nzzsnewell.com\nzzspider.com\nzzsspnode.com\nzzssptop.com\nzzsteel.com\nzzstep.com\nzzszbsw.com\nzzszxyy.com\nzzt9.com\nzztaoning.com\nzzteacher.com\nzztender.com\nzztfly.com\nzzthjixie.com\nzztline.com\nzztlj.com\nzztuku.com\nzztv.tv\nzztvzd.com\nzztxkj.com\nzztyscl.com\nzzun777.com\nzzusah.com\nzzw-hb.com\nzzwah.com\nzzwanshou.com\nzzwenxue.com\nzzwgd.com\nzzwl.info\nzzwljc.com\nzzwonder.com\nzzwqqx.com\nzzwro.com\nzzwtjx.com\nzzwwiidd.com\nzzwzj.com\nzzxbn.com\nzzxca.com\nzzxcy.com\nzzxdc.com\nzzxfjxzz.com\nzzxhns.com\nzzxic.com\nzzxmys.com\nzzxw.net\nzzxworld.com\nzzxx.org\nzzxy.net\nzzy2001.com\nzzyauto.com\nzzycpa.com\nzzyecc.com\nzzyedu.org\nzzyfjc.com\nzzygxh.com\nzzyiquan.com\nzzyjs.com\nzzykcd.com\nzzyuam.com\nzzyugang.com\nzzyxxw.com\nzzyyds.com\nzzyyrl.com\nzzz4.com\nzzzdc.com\nzzzdm.com\nzzzfgjj.com\nzzzglby.com\nzzzhtc.com\nzzzj.com\nzzzla.com\nzzzlsh.com\nzzznkq.com\nzzzppp.com\nzzzqqp.com\nzzzsxx.com\nzzzxwh.net\nzzzyb.com\nzzzymjg.com\nzzzyy.com\nzzzyyy.com\nzzzzaaaa.com\nzzzzzz.me\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/rules/chnroute",
    "content": "1.1.8.0/24\n1.116.0.0/15\n1.119.0.0/17\n1.119.128.0/18\n1.119.192.0/20\n1.119.208.0/22\n1.12.0.0/14\n1.180.0.0/14\n1.184.0.0/15\n1.188.0.0/14\n1.192.0.0/13\n1.2.4.0/24\n1.202.0.0/15\n1.204.0.0/14\n1.24.0.0/13\n1.45.0.0/16\n1.48.0.0/14\n1.56.0.0/13\n1.68.0.0/14\n1.8.1.0/24\n1.8.8.0/24\n1.80.0.0/13\n1.88.0.0/14\n1.92.0.0/16\n1.94.0.0/15\n101.1.0.0/22\n101.104.144.0/20\n101.104.160.0/20\n101.106.0.0/19\n101.124.0.0/16\n101.125.0.0/22\n101.125.130.0/24\n101.125.250.0/23\n101.125.252.0/22\n101.125.4.0/23\n101.125.6.0/24\n101.126.0.0/18\n101.126.128.0/19\n101.126.172.0/22\n101.126.176.0/20\n101.126.192.0/19\n101.126.228.0/22\n101.126.232.0/21\n101.126.240.0/20\n101.126.64.0/19\n101.126.96.0/20\n101.128.0.0/22\n101.129.0.0/16\n101.132.0.0/15\n101.144.0.0/12\n101.16.0.0/12\n101.197.0.0/16\n101.198.0.0/22\n101.198.160.0/19\n101.198.192.0/19\n101.198.4.0/24\n101.199.112.0/24\n101.199.128.0/23\n101.199.196.0/22\n101.199.252.0/22\n101.199.48.0/20\n101.2.172.0/22\n101.200.0.0/15\n101.203.172.0/22\n101.204.0.0/14\n101.224.0.0/13\n101.234.76.0/22\n101.236.0.0/16\n101.237.0.0/19\n101.237.128.0/20\n101.237.33.0/24\n101.237.34.0/23\n101.237.36.0/22\n101.237.40.0/24\n101.240.0.0/14\n101.245.0.0/17\n101.245.128.0/20\n101.245.144.0/22\n101.245.152.0/21\n101.245.160.0/20\n101.246.172.0/22\n101.246.176.0/20\n101.248.0.0/15\n101.251.0.0/22\n101.251.128.0/19\n101.251.160.0/20\n101.251.176.0/22\n101.251.192.0/18\n101.251.80.0/20\n101.252.0.0/15\n101.254.0.0/20\n101.254.128.0/17\n101.254.32.0/19\n101.254.64.0/18\n101.33.128.0/17\n101.34.0.0/15\n101.36.128.0/17\n101.36.64.0/20\n101.37.0.0/16\n101.39.0.0/16\n101.4.0.0/14\n101.40.0.0/16\n101.42.0.0/15\n101.49.148.0/23\n101.49.206.0/23\n101.49.208.0/24\n101.49.212.0/24\n101.50.56.0/22\n101.50.8.0/21\n101.52.112.0/21\n101.52.124.0/22\n101.52.128.0/20\n101.52.200.0/21\n101.52.212.0/22\n101.52.216.0/21\n101.52.232.0/23\n101.52.236.0/22\n101.52.240.0/20\n101.52.4.0/24\n101.52.6.0/24\n101.52.68.0/22\n101.53.100.0/22\n101.64.0.0/13\n101.72.0.0/14\n101.76.0.0/15\n101.78.0.0/22\n101.80.0.0/12\n101.96.10.0/23\n101.96.128.0/23\n101.96.130.0/24\n101.96.132.0/23\n101.96.134.0/24\n101.96.142.0/23\n101.96.144.0/20\n101.96.192.0/18\n103.1.168.0/22\n103.1.20.0/22\n103.1.8.0/22\n103.10.0.0/22\n103.10.84.0/22\n103.100.64.0/22\n103.101.124.0/23\n103.101.180.0/22\n103.102.196.0/22\n103.102.200.0/22\n103.102.213.0/24\n103.102.214.0/24\n103.103.12.0/24\n103.103.36.0/24\n103.104.155.0/24\n103.104.252.0/22\n103.105.0.0/22\n103.105.12.0/22\n103.105.180.0/22\n103.105.184.0/22\n103.105.200.0/23\n103.105.202.0/24\n103.105.220.0/22\n103.105.60.0/22\n103.106.252.0/22\n103.106.36.0/22\n103.107.0.0/22\n103.107.188.0/22\n103.107.216.0/21\n103.108.244.0/24\n103.108.247.0/24\n103.109.20.0/22\n103.110.132.0/22\n103.110.136.0/22\n103.111.172.0/22\n103.111.64.0/24\n103.113.4.0/22\n103.114.100.0/22\n103.114.212.0/23\n103.114.236.0/22\n103.115.120.0/22\n103.115.248.0/22\n103.115.92.0/22\n103.116.120.0/23\n103.116.123.0/24\n103.116.138.0/23\n103.116.76.0/23\n103.116.78.0/24\n103.116.92.0/22\n103.117.16.0/22\n103.117.220.0/22\n103.118.52.0/22\n103.118.60.0/22\n103.12.184.0/22\n103.12.232.0/22\n103.12.98.0/23\n103.120.196.0/22\n103.120.224.0/22\n103.120.72.0/22\n103.120.88.0/22\n103.121.164.0/23\n103.121.166.0/24\n103.121.250.0/24\n103.121.52.0/22\n103.122.48.0/22\n103.123.4.0/23\n103.125.236.0/22\n103.126.1.0/24\n103.126.124.0/22\n103.13.12.0/24\n103.13.244.0/22\n103.130.160.0/23\n103.131.138.0/23\n103.131.152.0/22\n103.131.168.0/22\n103.132.212.0/23\n103.132.22.0/23\n103.133.128.0/23\n103.135.160.0/22\n103.135.164.0/23\n103.135.192.0/23\n103.135.195.0/24\n103.135.196.0/22\n103.135.236.0/24\n103.137.60.0/24\n103.139.172.0/23\n103.139.212.0/23\n103.14.132.0/22\n103.14.136.0/22\n103.140.14.0/23\n103.141.10.0/23\n103.142.234.0/23\n103.142.82.0/23\n103.142.96.0/23\n103.143.16.0/22\n103.143.228.0/23\n103.144.158.0/23\n103.144.66.0/23\n103.144.70.0/24\n103.145.42.0/23\n103.146.126.0/23\n103.147.124.0/24\n103.149.242.0/24\n103.149.244.0/22\n103.15.4.0/22\n103.15.96.0/22\n103.150.10.0/23\n103.150.164.0/23\n103.150.24.0/23\n103.151.148.0/23\n103.152.186.0/23\n103.152.209.0/24\n103.152.224.0/24\n103.152.28.0/23\n103.152.56.0/23\n103.152.76.0/23\n103.154.162.0/23\n103.154.30.0/23\n103.154.41.0/24\n103.155.76.0/23\n103.156.174.0/23\n103.156.186.0/23\n103.156.68.0/23\n103.158.0.0/23\n103.158.74.0/23\n103.159.124.0/23\n103.16.124.0/22\n103.161.220.0/23\n103.161.254.0/23\n103.162.10.0/23\n103.163.180.0/24\n103.163.46.0/23\n103.164.32.0/23\n103.165.110.0/23\n103.169.50.0/23\n103.169.62.0/23\n103.17.228.0/22\n103.17.40.0/22\n103.170.212.0/23\n103.170.4.0/23\n103.174.94.0/23\n103.175.197.0/24\n103.177.28.0/23\n103.179.78.0/23\n103.181.234.0/24\n103.183.122.0/23\n103.183.124.0/23\n103.183.66.0/23\n103.184.46.0/23\n103.186.108.0/23\n103.186.4.0/23\n103.189.154.0/23\n103.189.92.0/23\n103.19.232.0/22\n103.19.46.0/23\n103.19.64.0/22\n103.190.118.0/23\n103.190.122.0/23\n103.191.102.0/24\n103.191.242.0/23\n103.192.0.0/22\n103.192.132.0/22\n103.192.16.0/20\n103.192.188.0/22\n103.192.208.0/21\n103.192.252.0/22\n103.192.8.0/21\n103.193.188.0/22\n103.193.192.0/22\n103.196.64.0/24\n103.196.88.0/21\n103.197.0.0/22\n103.197.228.0/22\n103.198.124.0/22\n103.198.180.0/23\n103.198.216.0/21\n103.198.224.0/20\n103.198.244.0/22\n103.198.60.0/22\n103.2.108.0/22\n103.2.208.0/22\n103.20.112.0/22\n103.20.128.0/22\n103.20.160.0/22\n103.20.248.0/22\n103.20.32.0/22\n103.200.136.0/21\n103.200.144.0/21\n103.200.220.0/22\n103.200.224.0/24\n103.201.192.0/24\n103.202.0.0/19\n103.202.112.0/22\n103.202.120.0/21\n103.202.128.0/20\n103.202.144.0/22\n103.202.32.0/20\n103.202.92.0/22\n103.202.96.0/20\n103.203.140.0/22\n103.203.216.0/22\n103.203.96.0/22\n103.204.72.0/22\n103.205.188.0/22\n103.205.192.0/22\n103.205.252.0/22\n103.205.4.0/22\n103.207.228.0/22\n103.208.12.0/22\n103.208.48.0/22\n103.209.112.0/22\n103.209.136.0/22\n103.21.116.0/22\n103.21.140.0/22\n103.21.176.0/22\n103.210.160.0/22\n103.210.170.0/23\n103.211.220.0/22\n103.211.44.0/22\n103.212.1.0/24\n103.212.109.0/24\n103.212.12.0/22\n103.212.2.0/24\n103.212.4.0/22\n103.212.48.0/23\n103.213.132.0/22\n103.213.144.0/23\n103.213.148.0/22\n103.213.160.0/19\n103.213.48.0/21\n103.213.60.0/22\n103.213.64.0/19\n103.213.96.0/22\n103.214.48.0/22\n103.215.140.0/22\n103.215.36.0/22\n103.215.44.0/24\n103.216.136.0/22\n103.216.152.0/22\n103.216.252.0/24\n103.216.4.0/22\n103.217.184.0/21\n103.217.192.0/20\n103.218.216.0/22\n103.219.100.0/23\n103.219.176.0/22\n103.219.184.0/22\n103.219.24.0/21\n103.219.32.0/21\n103.219.85.0/24\n103.219.86.0/23\n103.219.92.0/24\n103.22.188.0/22\n103.22.252.0/22\n103.220.124.0/22\n103.220.128.0/19\n103.220.160.0/21\n103.220.240.0/22\n103.220.52.0/22\n103.220.56.0/21\n103.220.64.0/22\n103.220.92.0/22\n103.221.140.0/22\n103.222.176.0/21\n103.222.184.0/22\n103.222.216.0/22\n103.222.33.0/24\n103.222.40.0/22\n103.223.132.0/22\n103.223.144.0/20\n103.224.220.0/22\n103.224.232.0/22\n103.226.57.0/24\n103.226.59.0/24\n103.227.120.0/22\n103.227.136.0/22\n103.227.228.0/22\n103.227.76.0/22\n103.227.80.0/22\n103.228.136.0/22\n103.228.160.0/22\n103.228.204.0/23\n103.228.208.0/22\n103.228.228.0/22\n103.229.148.0/22\n103.229.172.0/22\n103.229.212.0/22\n103.229.216.0/21\n103.229.236.0/22\n103.23.160.0/22\n103.23.8.0/22\n103.230.110.0/23\n103.230.200.0/22\n103.230.212.0/22\n103.230.236.0/22\n103.231.16.0/24\n103.231.64.0/21\n103.232.144.0/22\n103.232.166.0/23\n103.233.128.0/22\n103.233.136.0/23\n103.233.138.0/24\n103.233.162.0/23\n103.233.4.0/22\n103.233.52.0/22\n103.234.128.0/23\n103.234.131.0/24\n103.234.20.0/22\n103.234.56.0/22\n103.235.100.0/22\n103.235.136.0/22\n103.235.144.0/24\n103.235.220.0/22\n103.235.224.0/19\n103.235.85.0/24\n103.236.120.0/22\n103.236.244.0/22\n103.236.248.0/21\n103.236.52.0/22\n103.236.56.0/21\n103.236.64.0/19\n103.236.96.0/23\n103.236.98.0/24\n103.237.176.0/20\n103.237.192.0/19\n103.237.224.0/20\n103.237.240.0/21\n103.237.248.0/23\n103.237.28.0/23\n103.237.8.0/22\n103.238.0.0/21\n103.238.132.0/22\n103.238.144.0/22\n103.238.16.0/22\n103.238.160.0/22\n103.238.180.0/22\n103.238.184.0/21\n103.238.204.0/22\n103.238.48.0/24\n103.238.52.0/22\n103.238.96.0/23\n103.238.98.0/24\n103.239.152.0/22\n103.239.184.0/23\n103.239.186.0/24\n103.239.192.0/22\n103.239.204.0/22\n103.239.224.0/22\n103.239.244.0/22\n103.239.68.0/22\n103.24.116.0/22\n103.24.176.0/22\n103.24.228.0/22\n103.240.124.0/22\n103.240.16.0/22\n103.240.244.0/22\n103.240.36.0/22\n103.240.84.0/22\n103.241.95.0/24\n103.242.128.0/24\n103.242.130.0/24\n103.242.168.0/23\n103.242.172.0/22\n103.242.212.0/22\n103.243.136.0/22\n103.243.252.0/22\n103.244.232.0/22\n103.244.59.0/24\n103.244.64.0/22\n103.244.80.0/22\n103.245.128.0/22\n103.245.23.0/24\n103.246.152.0/22\n103.247.168.0/22\n103.247.176.0/22\n103.247.191.0/24\n103.248.152.0/22\n103.248.224.0/22\n103.249.136.0/24\n103.249.244.0/22\n103.249.252.0/22\n103.249.52.0/22\n103.25.156.0/24\n103.25.20.0/22\n103.25.24.0/22\n103.25.36.0/22\n103.25.64.0/23\n103.250.104.0/22\n103.250.192.0/22\n103.250.216.0/22\n103.250.248.0/21\n103.250.32.0/22\n103.251.124.0/22\n103.251.160.0/22\n103.251.204.0/23\n103.251.207.0/24\n103.251.240.0/22\n103.251.32.0/22\n103.251.84.0/22\n103.251.96.0/22\n103.252.172.0/22\n103.252.248.0/22\n103.252.36.0/22\n103.253.204.0/22\n103.253.232.0/22\n103.253.60.0/22\n103.254.112.0/22\n103.254.188.0/22\n103.254.68.0/22\n103.254.76.0/22\n103.255.140.0/22\n103.255.200.0/22\n103.255.68.0/22\n103.255.92.0/22\n103.26.0.0/22\n103.26.64.0/22\n103.26.76.0/22\n103.27.24.0/22\n103.27.240.0/22\n103.27.4.0/22\n103.28.204.0/22\n103.28.212.0/22\n103.28.8.0/24\n103.29.136.0/22\n103.29.16.0/22\n103.29.24.0/23\n103.3.112.0/20\n103.3.128.0/22\n103.3.136.0/21\n103.3.152.0/21\n103.3.96.0/22\n103.30.148.0/24\n103.30.151.0/24\n103.31.200.0/22\n103.31.48.0/22\n103.35.104.0/22\n103.36.132.0/22\n103.36.136.0/22\n103.36.164.0/22\n103.36.168.0/21\n103.36.192.0/20\n103.36.208.0/22\n103.36.220.0/22\n103.36.28.0/22\n103.36.36.0/22\n103.36.60.0/22\n103.36.96.0/22\n103.37.100.0/22\n103.37.12.0/22\n103.37.136.0/21\n103.37.144.0/20\n103.37.16.0/22\n103.37.160.0/21\n103.37.172.0/22\n103.37.44.0/22\n103.37.72.0/22\n103.38.116.0/22\n103.38.224.0/22\n103.38.232.0/22\n103.38.252.0/23\n103.38.40.0/22\n103.38.76.0/22\n103.38.84.0/22\n103.38.92.0/23\n103.39.200.0/21\n103.39.208.0/20\n103.39.224.0/21\n103.39.232.0/22\n103.39.64.0/22\n103.4.56.0/22\n103.40.12.0/22\n103.40.173.0/24\n103.40.174.0/23\n103.40.192.0/22\n103.40.232.0/22\n103.40.240.0/20\n103.41.0.0/22\n103.41.116.0/22\n103.41.164.0/22\n103.41.232.0/23\n103.42.76.0/22\n103.42.8.0/22\n103.43.132.0/24\n103.43.134.0/23\n103.43.184.0/22\n103.43.240.0/23\n103.44.144.0/22\n103.44.168.0/22\n103.44.176.0/22\n103.44.236.0/22\n103.44.240.0/20\n103.44.56.0/22\n103.44.80.0/22\n103.45.128.0/19\n103.45.160.0/22\n103.45.168.0/23\n103.45.171.0/24\n103.45.172.0/22\n103.45.176.0/20\n103.45.248.0/22\n103.45.72.0/21\n103.46.12.0/22\n103.46.128.0/21\n103.46.136.0/22\n103.46.16.0/20\n103.46.168.0/22\n103.46.32.0/19\n103.46.64.0/18\n103.47.48.0/22\n103.47.80.0/22\n103.48.232.0/23\n103.48.235.0/24\n103.49.108.0/22\n103.49.12.0/22\n103.5.192.0/23\n103.5.194.0/24\n103.5.52.0/24\n103.52.100.0/22\n103.52.104.0/23\n103.52.172.0/22\n103.52.176.0/22\n103.52.196.0/22\n103.53.124.0/22\n103.53.208.0/24\n103.53.211.0/24\n103.54.48.0/22\n103.55.172.0/22\n103.55.228.0/22\n103.56.100.0/22\n103.56.104.0/22\n103.56.152.0/22\n103.56.184.0/22\n103.56.60.0/22\n103.56.76.0/22\n103.57.12.0/22\n103.57.136.0/23\n103.57.139.0/24\n103.59.112.0/21\n103.59.124.0/22\n103.59.148.0/22\n103.59.168.0/23\n103.6.220.0/22\n103.60.164.0/22\n103.60.228.0/23\n103.60.236.0/22\n103.61.104.0/23\n103.61.153.0/24\n103.61.154.0/23\n103.61.188.0/22\n103.61.60.0/22\n103.62.88.0/23\n103.63.160.0/20\n103.63.176.0/21\n103.63.244.0/22\n103.64.140.0/22\n103.64.144.0/22\n103.64.152.0/21\n103.64.208.0/21\n103.64.24.0/21\n103.65.224.0/23\n103.65.8.0/22\n103.66.32.0/22\n103.68.128.0/22\n103.69.16.0/22\n103.7.140.0/22\n103.70.8.0/22\n103.71.200.0/23\n103.71.202.0/24\n103.71.232.0/22\n103.71.68.0/22\n103.72.113.0/24\n103.72.172.0/24\n103.73.116.0/22\n103.73.136.0/21\n103.73.144.0/22\n103.73.158.0/24\n103.73.204.0/22\n103.73.48.0/24\n103.74.24.0/21\n103.74.48.0/22\n103.74.80.0/22\n103.75.104.0/22\n103.75.152.0/22\n103.76.220.0/22\n103.76.224.0/22\n103.76.60.0/22\n103.77.132.0/22\n103.77.28.0/22\n103.78.126.0/23\n103.78.228.0/22\n103.78.60.0/22\n103.79.200.0/22\n103.79.228.0/24\n103.79.24.0/22\n103.8.220.0/22\n103.8.32.0/22\n103.8.52.0/22\n103.8.68.0/22\n103.81.123.0/24\n103.81.200.0/22\n103.81.4.0/22\n103.81.48.0/22\n103.82.224.0/22\n103.83.44.0/22\n103.83.64.0/22\n103.83.72.0/22\n103.84.170.0/23\n103.85.147.0/24\n103.85.164.0/22\n103.85.168.0/21\n103.85.176.0/22\n103.85.84.0/22\n103.87.180.0/22\n103.88.32.0/21\n103.88.64.0/22\n103.88.96.0/22\n103.89.184.0/21\n103.89.192.0/19\n103.89.224.0/21\n103.9.252.0/22\n103.9.8.0/22\n103.90.152.0/22\n103.90.176.0/22\n103.90.188.0/22\n103.90.56.0/23\n103.90.92.0/22\n103.91.176.0/22\n103.91.208.0/22\n103.92.88.0/22\n103.93.180.0/22\n103.93.204.0/22\n103.94.12.0/22\n103.94.200.0/22\n103.95.252.0/22\n103.95.68.0/22\n103.96.214.0/23\n103.96.224.0/23\n103.96.8.0/22\n103.97.112.0/23\n103.97.144.0/22\n103.97.60.0/24\n103.98.125.0/24\n103.98.127.0/24\n103.98.220.0/22\n103.98.248.0/23\n103.98.251.0/24\n103.98.252.0/22\n103.98.44.0/22\n103.98.92.0/22\n103.98.96.0/22\n103.99.104.0/22\n104.192.108.0/23\n104.192.110.0/24\n106.0.4.0/22\n106.108.0.0/14\n106.11.0.0/16\n106.112.0.0/12\n106.12.0.0/17\n106.12.128.0/18\n106.12.192.0/19\n106.12.224.0/20\n106.12.240.0/21\n106.12.250.0/23\n106.12.252.0/23\n106.12.254.0/24\n106.13.0.0/16\n106.14.0.0/15\n106.16.0.0/14\n106.2.100.0/22\n106.2.104.0/21\n106.2.112.0/21\n106.2.124.0/22\n106.2.128.0/19\n106.2.224.0/24\n106.2.232.0/21\n106.2.37.0/24\n106.2.40.0/23\n106.2.42.0/24\n106.2.45.0/24\n106.2.46.0/23\n106.2.48.0/23\n106.2.51.0/24\n106.2.52.0/22\n106.2.56.0/22\n106.2.62.0/23\n106.2.64.0/20\n106.2.81.0/24\n106.2.82.0/23\n106.2.89.0/24\n106.2.92.0/22\n106.2.96.0/24\n106.224.0.0/14\n106.228.0.0/15\n106.230.0.0/16\n106.3.0.0/19\n106.3.128.0/19\n106.3.192.0/20\n106.3.208.0/21\n106.3.224.0/21\n106.3.32.0/20\n106.3.80.0/22\n106.3.88.0/21\n106.3.96.0/22\n106.32.0.0/12\n106.4.0.0/14\n106.48.16.0/21\n106.52.0.0/14\n106.56.0.0/14\n106.60.0.0/15\n106.62.0.0/16\n106.63.0.0/17\n106.74.0.0/16\n106.75.0.0/17\n106.75.128.0/18\n106.75.208.0/20\n106.75.224.0/19\n106.8.0.0/15\n106.80.0.0/13\n106.88.0.0/14\n106.92.0.0/16\n108.165.168.0/24\n108.165.240.0/24\n109.244.0.0/16\n110.100.0.0/16\n110.112.0.0/15\n110.114.0.0/16\n110.115.128.0/17\n110.116.0.0/16\n110.120.0.0/16\n110.124.0.0/16\n110.125.128.0/17\n110.152.0.0/14\n110.156.0.0/15\n110.16.0.0/14\n110.166.0.0/15\n110.172.200.0/21\n110.173.16.0/20\n110.173.192.0/19\n110.173.32.0/20\n110.173.8.0/21\n110.176.0.0/12\n110.199.0.0/16\n110.203.0.0/23\n110.211.0.0/16\n110.218.0.0/15\n110.228.0.0/14\n110.236.0.0/15\n110.240.0.0/12\n110.40.0.0/24\n110.40.128.0/17\n110.40.13.0/24\n110.40.14.0/23\n110.40.16.0/24\n110.41.0.0/16\n110.42.0.0/15\n110.51.0.0/16\n110.52.0.0/15\n110.56.0.0/13\n110.6.0.0/15\n110.64.0.0/15\n110.72.0.0/15\n110.75.0.0/16\n110.76.0.0/18\n110.76.156.0/22\n110.76.184.0/22\n110.76.192.0/18\n110.77.0.0/17\n110.80.0.0/13\n110.88.0.0/14\n110.94.0.0/17\n110.96.0.0/16\n111.0.0.0/10\n111.112.0.0/14\n111.116.0.0/15\n111.118.200.0/21\n111.120.0.0/14\n111.124.0.0/16\n111.126.0.0/15\n111.128.0.0/16\n111.132.0.0/16\n111.142.0.0/15\n111.144.0.0/14\n111.148.0.0/16\n111.149.0.0/24\n111.160.0.0/13\n111.170.0.0/16\n111.172.0.0/14\n111.176.0.0/13\n111.186.0.0/15\n111.192.0.0/12\n111.208.121.0/24\n111.208.254.0/24\n111.210.0.0/20\n111.210.16.0/24\n111.211.192.0/18\n111.212.0.0/14\n111.221.128.0/17\n111.221.28.0/24\n111.222.0.0/16\n111.223.12.0/22\n111.224.0.0/14\n111.228.0.0/18\n111.229.0.0/16\n111.230.0.0/15\n111.235.156.0/22\n111.235.160.0/22\n111.235.164.0/23\n111.235.168.0/22\n111.235.172.0/23\n111.235.174.0/24\n111.235.178.0/23\n111.235.180.0/23\n111.235.182.0/24\n111.72.0.0/13\n111.85.0.0/16\n112.0.0.0/10\n112.109.128.0/17\n112.111.0.0/16\n112.112.0.0/14\n112.116.0.0/15\n112.122.0.0/15\n112.124.0.0/14\n112.132.0.0/16\n112.192.0.0/14\n112.224.0.0/11\n112.64.0.0/14\n112.73.96.0/19\n112.74.0.0/16\n112.80.0.0/12\n112.96.0.0/13\n113.0.0.0/13\n113.12.0.0/14\n113.128.0.0/15\n113.130.112.0/21\n113.130.96.0/20\n113.132.0.0/14\n113.136.0.0/13\n113.16.0.0/15\n113.18.0.0/16\n113.194.0.0/15\n113.197.101.0/24\n113.197.103.0/24\n113.197.104.0/23\n113.200.0.0/15\n113.204.0.0/14\n113.208.112.0/21\n113.209.128.0/17\n113.21.232.0/21\n113.213.0.0/18\n113.213.64.0/19\n113.213.96.0/20\n113.214.0.0/15\n113.218.0.0/15\n113.220.0.0/14\n113.224.0.0/12\n113.24.0.0/14\n113.240.0.0/13\n113.248.0.0/14\n113.31.144.0/20\n113.31.160.0/19\n113.31.192.0/18\n113.31.96.0/19\n113.44.0.0/16\n113.45.0.0/18\n113.45.102.0/23\n113.45.104.0/21\n113.45.112.0/22\n113.45.120.0/22\n113.45.128.0/17\n113.45.64.0/19\n113.45.96.0/22\n113.46.0.0/16\n113.47.0.0/18\n113.47.104.0/22\n113.47.110.0/24\n113.47.112.0/20\n113.47.128.0/18\n113.47.200.0/21\n113.47.216.0/21\n113.47.232.0/21\n113.47.240.0/20\n113.47.64.0/19\n113.47.96.0/21\n113.48.127.0/24\n113.48.224.0/20\n113.48.48.0/20\n113.49.0.0/19\n113.50.0.0/20\n113.50.32.0/24\n113.50.48.0/20\n113.50.64.0/20\n113.54.0.0/15\n113.56.0.0/15\n113.58.0.0/16\n113.59.0.0/17\n113.59.224.0/22\n113.62.0.0/15\n113.64.0.0/10\n113.8.0.0/15\n114.104.0.0/14\n114.110.0.0/20\n114.110.96.0/22\n114.111.0.0/23\n114.111.16.0/20\n114.111.191.0/24\n114.112.104.0/22\n114.112.136.0/21\n114.112.144.0/21\n114.112.200.0/21\n114.112.208.0/20\n114.112.24.0/21\n114.112.32.0/19\n114.112.4.0/23\n114.112.64.0/19\n114.112.96.0/21\n114.113.144.0/20\n114.113.196.0/22\n114.113.200.0/24\n114.113.203.0/24\n114.113.208.0/21\n114.113.221.0/24\n114.113.223.0/24\n114.113.224.0/20\n114.113.63.0/24\n114.113.64.0/20\n114.113.80.0/22\n114.113.84.0/24\n114.113.88.0/21\n114.113.96.0/19\n114.114.112.0/21\n114.115.0.0/16\n114.116.0.0/15\n114.118.0.0/17\n114.119.10.0/24\n114.119.117.0/24\n114.119.119.0/24\n114.119.204.0/22\n114.119.32.0/24\n114.132.0.0/16\n114.135.0.0/16\n114.138.0.0/15\n114.141.128.0/18\n114.142.142.0/23\n114.196.0.0/15\n114.212.0.0/14\n114.216.0.0/13\n114.224.0.0/11\n114.28.128.0/18\n114.28.248.0/21\n114.28.68.0/22\n114.28.72.0/21\n114.55.0.0/16\n114.60.0.0/14\n114.64.0.0/16\n114.66.0.0/18\n114.66.236.0/22\n114.66.240.0/20\n114.66.64.0/24\n114.66.72.0/21\n114.66.80.0/23\n114.67.128.0/17\n114.67.16.0/21\n114.67.48.0/24\n114.67.57.0/24\n114.67.58.0/24\n114.67.60.0/23\n114.67.62.0/24\n114.67.64.0/18\n114.80.0.0/12\n114.96.0.0/13\n115.102.0.0/16\n115.120.0.0/17\n115.120.128.0/20\n115.120.144.0/23\n115.120.148.0/22\n115.120.152.0/21\n115.120.176.0/20\n115.120.192.0/18\n115.124.16.0/20\n115.148.0.0/14\n115.152.0.0/13\n115.168.0.0/14\n115.172.32.0/21\n115.172.46.0/23\n115.173.0.0/19\n115.175.0.0/18\n115.175.104.0/22\n115.175.108.0/23\n115.175.110.0/24\n115.175.112.0/20\n115.175.128.0/17\n115.175.64.0/19\n115.175.96.0/21\n115.180.0.0/17\n115.182.0.0/15\n115.190.0.0/16\n115.191.0.0/18\n115.191.64.0/20\n115.192.0.0/11\n115.224.0.0/12\n115.24.0.0/14\n115.28.0.0/15\n115.31.64.0/22\n115.32.0.0/19\n115.32.104.0/21\n115.32.120.0/21\n115.32.128.0/19\n115.32.32.0/20\n115.32.52.0/22\n115.32.56.0/21\n115.32.64.0/19\n115.33.0.0/19\n115.33.128.0/20\n115.44.0.0/15\n115.46.0.0/16\n115.48.0.0/12\n115.84.0.0/18\n115.85.192.0/18\n116.0.89.0/24\n116.1.0.0/16\n116.112.0.0/14\n116.116.0.0/15\n116.128.128.0/18\n116.128.200.0/21\n116.128.208.0/20\n116.128.224.0/19\n116.129.0.0/16\n116.13.0.0/16\n116.130.0.0/15\n116.132.0.0/15\n116.135.0.0/16\n116.136.0.0/13\n116.144.0.0/14\n116.148.0.0/15\n116.153.0.0/16\n116.154.0.0/15\n116.16.0.0/12\n116.162.0.0/16\n116.163.0.0/18\n116.165.0.0/16\n116.167.0.0/16\n116.168.0.0/14\n116.172.128.0/17\n116.172.64.0/18\n116.174.0.0/15\n116.176.0.0/14\n116.181.0.0/16\n116.182.0.0/16\n116.192.0.0/16\n116.193.16.0/23\n116.193.18.0/24\n116.196.0.0/21\n116.196.12.0/23\n116.196.129.0/24\n116.196.130.0/23\n116.196.132.0/22\n116.196.136.0/21\n116.196.144.0/21\n116.196.152.0/22\n116.196.156.0/23\n116.196.176.0/21\n116.196.192.0/21\n116.196.218.0/23\n116.196.220.0/22\n116.196.64.0/18\n116.196.8.0/22\n116.197.160.0/21\n116.198.0.0/18\n116.198.144.0/20\n116.198.160.0/20\n116.198.176.0/21\n116.198.192.0/18\n116.198.64.0/21\n116.198.72.0/22\n116.198.80.0/21\n116.198.96.0/19\n116.199.0.0/17\n116.2.0.0/15\n116.204.0.0/17\n116.205.0.0/16\n116.207.0.0/16\n116.208.0.0/14\n116.214.128.0/22\n116.214.132.0/23\n116.214.134.0/24\n116.214.32.0/19\n116.224.0.0/12\n116.242.0.0/16\n116.246.0.0/15\n116.248.0.0/15\n116.252.0.0/15\n116.254.104.0/21\n116.255.128.0/17\n116.4.0.0/14\n116.52.0.0/14\n116.56.0.0/15\n116.58.208.0/24\n116.62.0.0/15\n116.66.123.0/24\n116.66.36.0/24\n116.66.48.0/23\n116.66.53.0/24\n116.66.54.0/23\n116.66.98.0/24\n116.68.136.0/21\n116.68.176.0/21\n116.70.64.0/18\n116.76.0.0/15\n116.78.0.0/16\n116.8.0.0/14\n116.85.0.0/16\n116.90.80.0/20\n116.95.0.0/16\n117.106.0.0/15\n117.112.0.0/13\n117.121.132.0/22\n117.122.192.0/18\n117.124.231.0/24\n117.124.232.0/22\n117.124.236.0/23\n117.124.240.0/22\n117.124.244.0/24\n117.124.246.0/24\n117.124.98.0/24\n117.126.0.0/16\n117.128.0.0/10\n117.21.0.0/16\n117.22.0.0/15\n117.24.0.0/13\n117.32.0.0/13\n117.40.0.0/14\n117.44.0.0/15\n117.48.0.0/18\n117.48.112.0/20\n117.48.128.0/19\n117.48.160.0/20\n117.48.192.0/20\n117.48.216.0/21\n117.48.224.0/20\n117.48.64.0/19\n117.50.0.0/16\n117.51.128.0/19\n117.51.160.0/23\n117.51.168.0/21\n117.57.0.0/16\n117.59.0.0/16\n117.60.0.0/14\n117.64.0.0/13\n117.72.0.0/23\n117.72.144.0/20\n117.72.16.0/23\n117.72.160.0/19\n117.72.192.0/19\n117.72.24.0/21\n117.72.240.0/21\n117.72.248.0/22\n117.72.255.0/24\n117.72.32.0/19\n117.72.64.0/18\n117.72.8.0/21\n117.73.0.0/20\n117.73.16.0/21\n117.73.252.0/22\n117.74.128.0/21\n117.74.136.0/22\n117.74.64.0/20\n117.78.0.0/18\n117.79.128.0/21\n117.79.144.0/20\n117.79.160.0/21\n117.79.224.0/20\n117.79.241.0/24\n117.79.242.0/24\n117.79.80.0/20\n117.8.0.0/13\n117.80.0.0/12\n118.102.16.0/20\n118.103.164.0/22\n118.112.0.0/13\n118.120.0.0/14\n118.124.0.0/15\n118.126.140.0/23\n118.126.142.0/24\n118.126.32.0/19\n118.126.64.0/18\n118.132.0.0/14\n118.144.0.0/16\n118.145.0.0/19\n118.145.112.0/21\n118.145.128.0/19\n118.145.160.0/21\n118.145.176.0/20\n118.145.192.0/18\n118.145.32.0/20\n118.145.64.0/19\n118.145.96.0/20\n118.178.0.0/16\n118.180.0.0/14\n118.184.128.0/17\n118.186.0.0/19\n118.186.112.0/21\n118.186.128.0/18\n118.186.208.0/21\n118.186.240.0/21\n118.186.32.0/24\n118.186.34.0/23\n118.186.36.0/22\n118.186.56.0/21\n118.186.64.0/21\n118.186.80.0/20\n118.186.96.0/20\n118.187.0.0/18\n118.187.254.0/23\n118.187.64.0/19\n118.188.18.0/23\n118.188.20.0/22\n118.188.24.0/23\n118.190.0.0/16\n118.191.0.0/21\n118.191.12.0/24\n118.191.128.0/22\n118.191.152.0/24\n118.191.192.0/23\n118.191.208.0/24\n118.191.216.0/24\n118.191.223.0/24\n118.191.224.0/24\n118.191.240.0/23\n118.191.248.0/23\n118.191.250.0/24\n118.191.8.0/22\n118.192.20.0/24\n118.192.64.0/23\n118.192.67.0/24\n118.192.68.0/23\n118.192.70.0/24\n118.193.96.0/19\n118.194.134.0/23\n118.194.164.0/22\n118.194.240.0/21\n118.194.32.0/19\n118.195.0.0/16\n118.196.0.0/16\n118.197.0.0/18\n118.197.64.0/19\n118.202.0.0/15\n118.204.0.0/17\n118.212.0.0/15\n118.215.192.0/19\n118.228.0.0/15\n118.230.0.0/16\n118.239.0.0/16\n118.24.0.0/15\n118.242.0.0/22\n118.242.16.0/22\n118.242.24.0/22\n118.242.32.0/22\n118.242.40.0/24\n118.244.0.0/21\n118.244.128.0/17\n118.247.0.0/16\n118.248.0.0/13\n118.26.116.0/22\n118.26.120.0/24\n118.26.126.0/23\n118.26.128.0/22\n118.26.136.0/22\n118.26.160.0/20\n118.26.192.0/24\n118.26.194.0/23\n118.26.197.0/24\n118.26.198.0/23\n118.26.200.0/21\n118.26.208.0/20\n118.26.224.0/19\n118.26.32.0/22\n118.26.48.0/22\n118.26.64.0/23\n118.26.68.0/23\n118.26.72.0/22\n118.26.96.0/21\n118.30.0.0/15\n118.64.0.0/21\n118.64.248.0/21\n118.65.0.0/21\n118.66.112.0/23\n118.66.184.0/24\n118.66.224.0/20\n118.66.248.0/21\n118.72.0.0/13\n118.80.0.0/15\n118.84.0.0/15\n118.88.128.0/17\n118.88.32.0/19\n118.88.64.0/18\n118.89.0.0/16\n119.0.0.0/15\n119.108.0.0/15\n119.112.0.0/12\n119.128.0.0/12\n119.144.0.0/14\n119.148.160.0/20\n119.15.136.0/23\n119.15.140.0/23\n119.161.120.0/22\n119.161.124.0/24\n119.161.183.0/24\n119.162.0.0/15\n119.164.0.0/14\n119.176.0.0/12\n119.18.208.0/21\n119.18.224.0/24\n119.18.226.0/24\n119.18.237.0/24\n119.18.239.0/24\n119.2.128.0/17\n119.23.0.0/16\n119.233.128.0/17\n119.235.128.0/24\n119.235.130.0/24\n119.235.136.0/24\n119.235.138.0/24\n119.235.143.0/24\n119.235.144.0/23\n119.235.151.0/24\n119.235.160.0/23\n119.235.167.0/24\n119.235.185.0/24\n119.248.0.0/14\n119.253.0.0/20\n119.253.249.0/24\n119.253.252.0/24\n119.253.32.0/19\n119.253.64.0/19\n119.254.0.0/16\n119.255.128.0/17\n119.255.63.0/24\n119.27.160.0/19\n119.28.28.0/24\n119.29.0.0/16\n119.3.0.0/16\n119.31.192.0/19\n119.32.0.0/15\n119.34.0.0/16\n119.36.0.0/16\n119.37.0.0/23\n119.37.12.0/24\n119.37.192.0/21\n119.37.2.0/24\n119.38.0.0/21\n119.38.192.0/19\n119.39.0.0/16\n119.4.0.0/14\n119.40.128.0/17\n119.40.41.0/24\n119.40.64.0/20\n119.41.0.0/16\n119.42.0.0/19\n119.42.136.0/21\n119.42.224.0/19\n119.44.0.0/22\n119.44.12.0/24\n119.44.16.0/22\n119.44.192.0/24\n119.44.20.0/23\n119.44.200.0/24\n119.44.205.0/24\n119.44.208.0/22\n119.44.212.0/23\n119.44.214.0/24\n119.44.217.0/24\n119.44.218.0/23\n119.44.220.0/22\n119.44.224.0/20\n119.44.23.0/24\n119.44.24.0/22\n119.44.253.0/24\n119.44.254.0/23\n119.44.28.0/23\n119.44.4.0/23\n119.44.45.0/24\n119.44.46.0/24\n119.44.50.0/23\n119.44.52.0/24\n119.44.56.0/21\n119.44.7.0/24\n119.44.8.0/22\n119.45.0.0/16\n119.48.0.0/13\n119.57.0.0/21\n119.57.100.0/23\n119.57.102.0/24\n119.57.112.0/20\n119.57.12.0/24\n119.57.132.0/22\n119.57.136.0/21\n119.57.16.0/21\n119.57.160.0/20\n119.57.190.0/23\n119.57.246.0/23\n119.57.248.0/21\n119.57.25.0/24\n119.57.28.0/22\n119.57.32.0/21\n119.57.44.0/22\n119.57.51.0/24\n119.57.52.0/22\n119.57.56.0/21\n119.57.64.0/19\n119.57.8.0/23\n119.57.96.0/22\n119.60.0.0/15\n119.62.0.0/16\n119.75.208.0/20\n119.78.0.0/15\n119.80.0.0/21\n119.80.160.0/23\n119.80.162.0/24\n119.80.192.0/21\n119.80.200.0/22\n119.80.240.0/22\n119.80.248.0/21\n119.80.8.0/22\n119.84.0.0/14\n119.88.128.0/17\n119.90.32.0/19\n119.91.0.0/16\n119.96.0.0/13\n120.0.0.0/12\n120.131.0.0/19\n120.131.124.0/22\n120.131.88.0/21\n120.132.0.0/18\n120.132.112.0/24\n120.132.116.0/22\n120.132.120.0/21\n120.132.128.0/17\n120.132.64.0/19\n120.132.96.0/20\n120.133.0.0/16\n120.134.0.0/15\n120.136.128.0/21\n120.136.140.0/22\n120.136.144.0/20\n120.136.16.0/21\n120.136.160.0/20\n120.136.176.0/21\n120.136.184.0/22\n120.136.188.0/23\n120.136.190.0/24\n120.192.0.0/10\n120.24.0.0/14\n120.31.128.0/20\n120.31.144.0/24\n120.31.66.0/23\n120.31.68.0/22\n120.32.0.0/12\n120.48.0.0/16\n120.49.0.0/17\n120.49.192.0/18\n120.52.0.0/15\n120.55.0.0/16\n120.65.0.0/16\n120.68.0.0/14\n120.72.160.0/24\n120.72.162.0/23\n120.72.164.0/22\n120.72.168.0/24\n120.72.170.0/23\n120.72.172.0/23\n120.72.174.0/24\n120.72.177.0/24\n120.72.178.0/24\n120.72.180.0/24\n120.72.182.0/23\n120.72.184.0/22\n120.72.188.0/23\n120.72.190.0/24\n120.72.32.0/19\n120.76.0.0/14\n120.80.0.0/13\n120.92.0.0/17\n120.92.128.0/18\n120.92.192.0/19\n120.92.224.0/20\n120.94.0.0/15\n121.0.16.0/20\n121.16.0.0/12\n121.192.0.0/13\n121.201.0.0/17\n121.204.0.0/14\n121.224.0.0/12\n121.248.0.0/14\n121.255.0.0/16\n121.32.0.0/14\n121.36.0.0/15\n121.39.255.0/24\n121.4.0.0/15\n121.40.0.0/14\n121.46.0.0/19\n121.46.128.0/21\n121.46.141.0/24\n121.46.192.0/21\n121.46.200.0/22\n121.46.224.0/20\n121.46.244.0/22\n121.46.248.0/22\n121.46.252.0/23\n121.46.254.0/24\n121.47.0.0/16\n121.48.0.0/15\n121.51.0.0/16\n121.52.160.0/19\n121.52.208.0/20\n121.52.224.0/19\n121.55.0.0/18\n121.56.0.0/15\n121.58.0.0/17\n121.58.156.0/22\n121.59.160.0/20\n121.59.255.0/24\n121.59.4.0/22\n121.59.8.0/21\n121.60.0.0/14\n121.69.0.0/16\n121.70.0.0/17\n121.76.0.0/15\n121.79.128.0/20\n121.79.144.0/22\n121.79.148.0/24\n121.8.0.0/13\n121.89.0.0/16\n121.91.104.0/21\n122.0.64.0/18\n122.10.133.0/24\n122.10.136.0/23\n122.102.64.0/20\n122.11.32.0/19\n122.112.0.0/22\n122.112.132.0/22\n122.112.136.0/21\n122.112.144.0/20\n122.112.160.0/19\n122.112.192.0/18\n122.112.32.0/19\n122.114.0.0/16\n122.115.0.0/20\n122.115.224.0/20\n122.115.32.0/19\n122.119.110.0/23\n122.119.112.0/23\n122.119.114.0/24\n122.119.12.0/22\n122.119.120.0/24\n122.119.122.0/24\n122.119.124.0/23\n122.119.129.0/24\n122.119.147.0/24\n122.119.160.0/23\n122.119.172.0/24\n122.119.180.0/22\n122.119.190.0/24\n122.119.20.0/22\n122.119.224.0/22\n122.119.232.0/23\n122.119.236.0/24\n122.119.24.0/23\n122.119.253.0/24\n122.119.26.0/24\n122.119.32.0/24\n122.119.4.0/23\n122.119.50.0/24\n122.119.73.0/24\n122.119.96.0/23\n122.13.0.0/16\n122.136.0.0/13\n122.14.192.0/18\n122.14.44.0/22\n122.14.62.0/24\n122.144.128.0/20\n122.144.144.0/23\n122.144.147.0/24\n122.144.152.0/23\n122.144.156.0/23\n122.144.161.0/24\n122.144.164.0/22\n122.144.168.0/22\n122.144.172.0/23\n122.144.178.0/23\n122.144.180.0/22\n122.144.192.0/21\n122.144.200.0/22\n122.144.206.0/23\n122.144.208.0/23\n122.144.211.0/24\n122.144.212.0/22\n122.144.216.0/21\n122.144.232.0/22\n122.144.236.0/23\n122.144.240.0/24\n122.144.248.0/23\n122.152.192.0/18\n122.156.0.0/14\n122.188.0.0/14\n122.192.0.0/14\n122.200.104.0/22\n122.200.120.0/22\n122.200.124.0/24\n122.200.40.0/21\n122.200.68.0/23\n122.200.78.0/24\n122.200.82.0/24\n122.200.84.0/23\n122.200.86.0/24\n122.200.92.0/23\n122.204.0.0/14\n122.224.0.0/12\n122.240.0.0/13\n122.248.48.0/21\n122.248.56.0/22\n122.4.0.0/14\n122.48.0.0/16\n122.49.16.0/20\n122.49.32.0/20\n122.49.8.0/21\n122.51.0.0/16\n122.64.0.0/16\n122.70.0.0/15\n122.72.112.0/24\n122.72.16.0/24\n122.72.3.0/24\n122.72.38.0/24\n122.72.57.0/24\n122.77.240.0/24\n122.84.0.0/16\n122.9.0.0/16\n122.90.0.0/16\n122.91.0.0/17\n122.94.0.0/16\n122.96.0.0/15\n123.101.0.0/16\n123.103.0.0/20\n123.103.16.0/21\n123.103.24.0/22\n123.103.28.0/23\n123.103.30.0/24\n123.103.40.0/21\n123.103.48.0/20\n123.103.64.0/18\n123.108.208.0/22\n123.108.212.0/23\n123.108.220.0/22\n123.108.88.0/23\n123.112.0.0/12\n123.128.0.0/13\n123.138.0.0/15\n123.144.0.0/12\n123.160.0.0/12\n123.177.0.0/16\n123.178.0.0/15\n123.180.0.0/14\n123.184.0.0/13\n123.196.112.0/20\n123.206.0.0/15\n123.232.0.0/14\n123.242.192.0/21\n123.244.0.0/14\n123.249.0.0/17\n123.253.224.0/23\n123.254.96.0/21\n123.4.0.0/14\n123.49.192.0/23\n123.49.194.0/24\n123.49.231.0/24\n123.49.232.0/24\n123.49.240.0/24\n123.49.242.0/23\n123.49.245.0/24\n123.52.0.0/14\n123.56.0.0/15\n123.58.0.0/19\n123.58.160.0/20\n123.58.180.0/24\n123.58.182.0/23\n123.58.184.0/24\n123.58.186.0/23\n123.58.188.0/22\n123.58.224.0/19\n123.58.32.0/23\n123.58.34.0/24\n123.58.36.0/24\n123.58.38.0/23\n123.58.40.0/21\n123.58.48.0/24\n123.58.50.0/24\n123.58.53.0/24\n123.58.54.0/23\n123.58.56.0/23\n123.58.59.0/24\n123.58.60.0/22\n123.58.64.0/24\n123.58.96.0/19\n123.59.0.0/16\n123.60.0.0/15\n123.64.0.0/15\n123.66.0.0/16\n123.77.0.0/16\n123.8.0.0/13\n123.82.0.0/17\n123.83.128.0/17\n123.88.0.0/15\n123.90.0.0/16\n123.96.0.0/15\n123.99.192.0/18\n124.112.0.0/13\n124.126.0.0/15\n124.128.0.0/13\n124.14.1.0/24\n124.14.16.0/21\n124.14.2.0/23\n124.14.224.0/19\n124.14.5.0/24\n124.14.64.0/18\n124.14.7.0/24\n124.14.8.0/21\n124.151.0.0/16\n124.152.0.0/16\n124.16.0.0/15\n124.160.0.0/13\n124.172.0.0/15\n124.174.0.0/16\n124.192.0.0/15\n124.196.12.0/23\n124.196.25.0/24\n124.196.26.0/23\n124.196.28.0/24\n124.196.30.0/23\n124.196.32.0/23\n124.196.40.0/22\n124.196.48.0/22\n124.196.52.0/23\n124.196.55.0/24\n124.196.56.0/23\n124.196.58.0/24\n124.196.66.0/24\n124.196.72.0/24\n124.196.77.0/24\n124.196.80.0/22\n124.196.84.0/23\n124.200.0.0/16\n124.201.0.0/17\n124.202.0.0/16\n124.203.176.0/20\n124.204.0.0/14\n124.22.0.0/15\n124.220.0.0/14\n124.224.0.0/12\n124.240.0.0/17\n124.240.128.0/18\n124.243.192.0/18\n124.248.64.0/18\n124.250.0.0/15\n124.254.0.0/18\n124.28.192.0/18\n124.29.0.0/17\n124.31.0.0/16\n124.40.128.0/18\n124.42.0.0/17\n124.47.0.0/18\n124.64.0.0/15\n124.66.0.0/17\n124.67.0.0/16\n124.70.0.0/16\n124.71.0.0/17\n124.71.128.0/18\n124.71.192.0/19\n124.71.224.0/20\n124.71.250.0/24\n124.72.0.0/13\n124.88.0.0/13\n125.104.0.0/13\n125.112.0.0/12\n125.171.0.0/16\n125.208.0.0/19\n125.208.32.0/20\n125.208.49.0/24\n125.210.0.0/15\n125.213.32.0/20\n125.214.96.0/19\n125.215.36.0/23\n125.215.40.0/24\n125.215.44.0/23\n125.215.48.0/24\n125.215.52.0/23\n125.215.54.0/24\n125.216.0.0/13\n125.24.253.0/24\n125.254.128.0/19\n125.254.160.0/20\n125.254.176.0/21\n125.254.184.0/22\n125.254.188.0/23\n125.254.190.0/24\n125.32.0.0/12\n125.58.128.0/17\n125.62.0.0/18\n125.64.0.0/11\n125.98.122.0/23\n125.98.128.0/17\n128.108.0.0/16\n128.14.116.0/24\n129.204.0.0/16\n129.211.0.0/16\n129.28.0.0/16\n132.232.0.0/16\n132.237.134.0/24\n134.175.0.0/16\n138.252.72.0/23\n139.129.0.0/16\n139.148.0.0/16\n139.155.0.0/16\n139.159.0.0/19\n139.159.112.0/22\n139.159.132.0/22\n139.159.136.0/21\n139.159.144.0/20\n139.159.160.0/19\n139.159.192.0/18\n139.159.32.0/20\n139.159.96.0/20\n139.170.0.0/16\n139.186.0.0/16\n139.189.0.0/16\n139.196.0.0/16\n139.198.0.0/15\n139.200.0.0/13\n139.208.0.0/13\n139.217.0.0/16\n139.219.0.0/16\n139.220.128.0/17\n139.224.0.0/16\n139.226.0.0/15\n139.5.60.0/22\n139.9.0.0/17\n139.9.128.0/18\n139.9.192.0/19\n139.9.224.0/20\n139.9.240.0/21\n139.9.248.0/22\n14.103.0.0/16\n14.104.0.0/13\n14.112.0.0/12\n14.134.0.0/15\n14.144.0.0/12\n14.16.0.0/12\n14.204.0.0/15\n14.208.0.0/12\n140.143.0.0/16\n140.179.0.0/16\n140.205.0.0/16\n140.206.0.0/15\n140.210.0.0/24\n140.210.128.0/19\n140.210.16.0/20\n140.210.192.0/19\n140.210.224.0/20\n140.210.32.0/22\n140.210.4.0/22\n140.210.64.0/18\n140.210.8.0/21\n140.224.0.0/16\n140.237.0.0/16\n140.240.0.0/16\n140.243.0.0/16\n140.246.0.0/16\n140.249.0.0/16\n140.250.0.0/16\n140.255.0.0/16\n140.75.0.0/16\n143.20.246.0/24\n143.64.0.0/16\n144.0.0.0/16\n144.12.0.0/16\n144.123.0.0/16\n144.225.186.0/24\n144.255.0.0/16\n144.36.146.0/23\n144.48.212.0/22\n144.48.64.0/22\n144.52.0.0/16\n144.7.0.0/17\n144.79.10.0/23\n144.79.54.0/23\n144.79.70.0/23\n145.14.71.0/24\n145.14.72.0/22\n145.14.81.0/24\n145.14.82.0/24\n145.14.84.0/24\n145.14.86.0/24\n145.14.88.0/24\n145.14.90.0/24\n146.19.167.0/24\n146.19.236.0/24\n146.196.112.0/21\n146.196.56.0/22\n146.196.68.0/22\n146.222.79.0/24\n146.222.81.0/24\n146.222.94.0/24\n146.56.192.0/18\n147.78.132.0/22\n148.70.0.0/16\n150.129.136.0/22\n150.129.192.0/22\n150.129.252.0/22\n150.138.0.0/15\n150.158.0.0/16\n150.223.0.0/16\n150.242.120.0/22\n150.242.156.0/23\n150.242.168.0/22\n150.242.184.0/22\n150.242.232.0/22\n150.242.238.0/23\n150.242.244.0/22\n150.242.248.0/22\n150.242.56.0/22\n150.242.76.0/22\n150.242.80.0/22\n150.242.96.0/22\n150.255.0.0/16\n151.247.148.0/23\n152.104.128.0/17\n152.136.0.0/16\n153.0.0.0/16\n153.101.0.0/16\n153.118.0.0/15\n153.3.0.0/16\n153.34.0.0/15\n153.36.0.0/15\n153.99.0.0/16\n154.72.42.0/24\n154.72.44.0/24\n154.72.47.0/24\n154.8.128.0/17\n154.91.158.0/23\n155.102.0.0/23\n155.102.100.0/23\n155.102.110.0/23\n155.102.112.0/21\n155.102.120.0/23\n155.102.127.0/24\n155.102.128.0/22\n155.102.132.0/23\n155.102.135.0/24\n155.102.136.0/21\n155.102.144.0/20\n155.102.16.0/22\n155.102.160.0/21\n155.102.168.0/23\n155.102.171.0/24\n155.102.173.0/24\n155.102.174.0/23\n155.102.176.0/21\n155.102.184.0/23\n155.102.193.0/24\n155.102.194.0/23\n155.102.196.0/23\n155.102.198.0/24\n155.102.2.0/24\n155.102.20.0/24\n155.102.201.0/24\n155.102.202.0/24\n155.102.204.0/22\n155.102.208.0/21\n155.102.216.0/22\n155.102.22.0/23\n155.102.220.0/23\n155.102.223.0/24\n155.102.224.0/19\n155.102.24.0/24\n155.102.26.0/23\n155.102.28.0/22\n155.102.32.0/21\n155.102.4.0/23\n155.102.40.0/23\n155.102.43.0/24\n155.102.44.0/22\n155.102.48.0/20\n155.102.65.0/24\n155.102.67.0/24\n155.102.68.0/23\n155.102.70.0/24\n155.102.74.0/23\n155.102.76.0/22\n155.102.8.0/21\n155.102.98.0/23\n155.126.176.0/23\n156.107.160.0/23\n156.107.170.0/24\n156.107.179.0/24\n156.107.181.0/24\n156.237.104.0/23\n156.242.5.0/24\n156.59.108.0/24\n157.0.0.0/16\n157.10.112.0/23\n157.10.34.0/23\n157.119.172.0/22\n157.119.252.0/22\n157.119.28.0/22\n157.122.0.0/16\n157.148.0.0/16\n157.15.104.0/23\n157.15.94.0/23\n157.156.0.0/16\n157.18.0.0/16\n157.20.246.0/23\n157.254.231.0/24\n157.255.0.0/16\n157.61.0.0/16\n157.66.164.0/23\n158.140.252.0/22\n159.226.0.0/16\n159.27.0.0/16\n159.75.0.0/16\n16.2.142.0/23\n160.19.208.0/23\n160.19.210.0/24\n160.19.76.0/23\n160.191.0.0/24\n160.20.18.0/23\n160.202.152.0/22\n160.202.212.0/22\n160.202.224.0/19\n160.22.188.0/24\n160.22.244.0/23\n160.25.194.0/23\n160.250.102.0/23\n160.250.14.0/23\n160.250.84.0/23\n160.30.230.0/23\n160.83.110.0/24\n161.163.0.0/21\n161.163.28.0/23\n161.189.0.0/16\n161.207.0.0/16\n162.105.0.0/16\n162.128.248.0/24\n162.14.0.0/16\n163.0.0.0/16\n163.125.0.0/16\n163.142.0.0/16\n163.177.0.0/16\n163.179.0.0/16\n163.181.0.0/23\n163.181.100.0/22\n163.181.104.0/22\n163.181.108.0/24\n163.181.110.0/23\n163.181.112.0/23\n163.181.116.0/23\n163.181.118.0/24\n163.181.120.0/22\n163.181.126.0/23\n163.181.128.0/23\n163.181.131.0/24\n163.181.132.0/23\n163.181.135.0/24\n163.181.136.0/21\n163.181.144.0/20\n163.181.15.0/24\n163.181.16.0/22\n163.181.160.0/24\n163.181.162.0/23\n163.181.164.0/22\n163.181.168.0/21\n163.181.176.0/21\n163.181.184.0/22\n163.181.188.0/24\n163.181.190.0/23\n163.181.192.0/23\n163.181.196.0/22\n163.181.2.0/24\n163.181.200.0/21\n163.181.209.0/24\n163.181.210.0/23\n163.181.212.0/22\n163.181.216.0/21\n163.181.22.0/23\n163.181.224.0/23\n163.181.228.0/22\n163.181.232.0/23\n163.181.234.0/24\n163.181.236.0/22\n163.181.241.0/24\n163.181.242.0/23\n163.181.244.0/22\n163.181.248.0/21\n163.181.25.0/24\n163.181.26.0/24\n163.181.32.0/21\n163.181.40.0/24\n163.181.42.0/24\n163.181.44.0/22\n163.181.48.0/21\n163.181.56.0/22\n163.181.60.0/23\n163.181.63.0/24\n163.181.66.0/23\n163.181.69.0/24\n163.181.71.0/24\n163.181.72.0/23\n163.181.74.0/24\n163.181.77.0/24\n163.181.78.0/23\n163.181.80.0/22\n163.181.85.0/24\n163.181.87.0/24\n163.181.88.0/23\n163.181.90.0/24\n163.181.92.0/24\n163.181.94.0/23\n163.181.97.0/24\n163.181.99.0/24\n163.204.0.0/16\n163.223.178.0/23\n163.227.40.0/23\n163.228.0.0/16\n163.244.246.0/24\n163.47.4.0/22\n163.5.166.0/24\n163.5.53.0/24\n163.5.79.0/24\n163.53.128.0/22\n163.53.168.0/22\n163.53.44.0/22\n163.53.60.0/22\n163.53.88.0/21\n163.61.178.0/23\n163.61.202.0/23\n163.61.214.0/23\n165.101.208.0/23\n165.101.70.0/24\n166.111.0.0/16\n167.139.0.0/16\n167.189.0.0/16\n167.220.244.0/22\n168.160.0.0/17\n168.160.152.0/24\n168.160.158.0/23\n168.160.160.0/21\n168.160.168.0/24\n168.160.224.0/19\n170.33.98.0/24\n171.104.0.0/13\n171.112.0.0/12\n171.208.0.0/12\n171.34.0.0/15\n171.36.0.0/14\n171.40.0.0/14\n171.44.0.0/16\n171.8.0.0/13\n171.80.0.0/12\n172.81.192.0/18\n174.136.239.0/24\n175.0.0.0/12\n175.102.0.0/19\n175.102.128.0/20\n175.102.144.0/21\n175.102.152.0/24\n175.102.178.0/23\n175.102.180.0/22\n175.102.184.0/22\n175.102.188.0/23\n175.102.190.0/24\n175.102.196.0/24\n175.146.0.0/15\n175.148.0.0/14\n175.152.0.0/14\n175.16.0.0/13\n175.160.0.0/12\n175.178.0.0/16\n175.184.128.0/18\n175.185.0.0/16\n175.186.0.0/15\n175.188.188.0/22\n175.190.126.0/23\n175.190.24.0/21\n175.24.0.0/15\n175.27.0.0/16\n175.30.0.0/15\n175.42.0.0/15\n175.44.0.0/16\n175.46.0.0/15\n178.219.5.0/24\n180.129.128.0/17\n180.130.0.0/16\n180.136.0.0/13\n180.149.128.0/19\n180.150.176.0/20\n180.152.0.0/13\n180.160.0.0/12\n180.178.208.0/20\n180.178.224.0/21\n180.178.232.0/22\n180.178.248.0/21\n180.184.0.0/21\n180.184.128.0/20\n180.184.14.0/24\n180.184.144.0/21\n180.184.152.0/22\n180.184.16.0/24\n180.184.160.0/20\n180.184.176.0/21\n180.184.184.0/22\n180.184.190.0/23\n180.184.192.0/18\n180.184.24.0/21\n180.184.32.0/19\n180.184.64.0/18\n180.184.8.0/23\n180.186.38.0/23\n180.186.40.0/22\n180.186.44.0/24\n180.188.16.0/20\n180.188.32.0/20\n180.200.252.0/22\n180.201.0.0/16\n180.203.0.0/22\n180.203.4.0/24\n180.208.0.0/15\n180.210.212.0/22\n180.212.0.0/15\n180.233.0.0/18\n180.235.64.0/21\n180.235.72.0/23\n180.76.128.0/17\n180.76.16.0/20\n180.76.32.0/19\n180.76.64.0/18\n180.77.0.0/16\n180.78.0.0/15\n180.84.0.0/15\n180.88.128.0/18\n180.88.96.0/19\n180.89.56.0/22\n180.89.60.0/23\n180.89.64.0/19\n180.91.192.0/20\n180.95.128.0/17\n180.96.0.0/11\n182.128.0.0/12\n182.144.0.0/13\n182.157.0.0/16\n182.174.0.0/15\n182.18.32.0/19\n182.18.5.0/24\n182.18.72.0/21\n182.18.80.0/20\n182.18.96.0/19\n182.200.0.0/13\n182.240.0.0/13\n182.254.0.0/16\n182.32.0.0/12\n182.48.112.0/21\n182.48.96.0/20\n182.50.112.0/20\n182.50.8.0/21\n182.51.114.0/23\n182.51.116.0/23\n182.51.118.0/24\n182.51.122.0/23\n182.51.124.0/24\n182.54.0.0/17\n182.61.0.0/18\n182.61.128.0/19\n182.61.192.0/22\n182.61.200.0/21\n182.61.208.0/20\n182.61.224.0/19\n182.80.0.0/13\n182.88.0.0/14\n182.92.0.0/16\n182.96.0.0/11\n183.0.0.0/10\n183.128.0.0/11\n183.160.0.0/13\n183.168.0.0/15\n183.170.0.0/16\n183.172.0.0/14\n183.184.0.0/13\n183.192.0.0/10\n183.64.0.0/13\n183.78.180.0/22\n183.81.180.0/22\n183.84.0.0/15\n183.91.144.0/20\n183.91.39.0/24\n183.91.40.0/21\n183.91.48.0/21\n183.91.56.0/24\n183.91.61.0/24\n183.91.63.0/24\n183.92.0.0/14\n185.39.51.0/24\n185.75.173.0/24\n185.75.174.0/24\n188.131.128.0/17\n192.140.160.0/19\n192.140.208.0/21\n192.144.128.0/17\n192.163.11.0/24\n192.232.97.0/24\n193.112.0.0/16\n193.233.49.0/24\n194.127.229.0/24\n194.138.202.0/23\n194.138.245.0/24\n194.231.140.0/24\n198.208.112.0/23\n198.208.17.0/24\n198.208.19.0/24\n198.208.30.0/24\n198.208.61.0/24\n198.208.63.0/24\n198.208.67.0/24\n198.23.195.0/24\n199.182.239.0/24\n199.244.144.0/24\n202.104.0.0/14\n202.108.0.0/15\n202.110.0.0/16\n202.111.0.0/17\n202.111.128.0/18\n202.111.192.0/19\n202.111.230.0/24\n202.111.240.0/23\n202.111.242.0/24\n202.111.244.0/22\n202.111.248.0/24\n202.112.0.0/13\n202.120.0.0/15\n202.122.112.0/21\n202.122.32.0/21\n202.123.106.0/23\n202.123.108.0/24\n202.123.110.0/23\n202.123.120.0/22\n202.123.96.0/24\n202.123.98.0/24\n202.125.176.0/20\n202.127.0.0/21\n202.127.12.0/22\n202.127.144.0/20\n202.127.16.0/20\n202.127.200.0/21\n202.127.216.0/21\n202.127.224.0/19\n202.127.40.0/21\n202.127.48.0/23\n202.130.0.0/19\n202.130.224.0/20\n202.130.240.0/21\n202.136.208.0/21\n202.136.216.0/23\n202.136.218.0/24\n202.136.220.0/24\n202.136.222.0/23\n202.136.255.0/24\n202.136.48.0/20\n202.136.72.0/23\n202.14.235.0/24\n202.14.236.0/23\n202.14.238.0/24\n202.140.140.0/22\n202.141.160.0/19\n202.142.16.0/20\n202.143.100.0/22\n202.143.16.0/23\n202.148.96.0/19\n202.149.224.0/19\n202.150.16.0/20\n202.153.48.0/20\n202.158.160.0/19\n202.160.140.0/22\n202.164.0.0/20\n202.168.160.0/19\n202.170.128.0/19\n202.170.216.0/21\n202.173.14.0/23\n202.173.224.0/19\n202.173.8.0/22\n202.179.240.0/20\n202.181.120.0/21\n202.181.28.0/24\n202.189.16.0/20\n202.189.3.0/24\n202.189.32.0/20\n202.189.4.0/22\n202.189.48.0/22\n202.189.8.0/21\n202.192.0.0/12\n202.38.128.0/23\n202.38.132.0/23\n202.38.134.0/24\n202.38.140.0/23\n202.38.146.0/23\n202.38.152.0/23\n202.38.164.0/22\n202.38.184.0/21\n202.38.192.0/18\n202.38.2.0/23\n202.38.64.0/18\n202.38.8.0/21\n202.4.128.0/19\n202.4.252.0/22\n202.41.152.0/21\n202.41.241.0/24\n202.41.242.0/23\n202.41.244.0/22\n202.41.248.0/21\n202.46.224.0/22\n202.46.228.0/23\n202.46.232.0/23\n202.47.104.0/21\n202.55.0.0/19\n202.57.192.0/24\n202.57.196.0/22\n202.57.200.0/23\n202.57.204.0/23\n202.59.213.0/24\n202.59.214.0/23\n202.6.202.0/23\n202.60.112.0/20\n202.60.132.0/22\n202.61.88.0/22\n202.62.112.0/22\n202.63.160.0/20\n202.65.96.0/24\n202.67.3.0/24\n202.69.16.0/20\n202.69.4.0/23\n202.72.112.0/20\n202.73.128.0/22\n202.73.240.0/20\n202.75.208.0/20\n202.75.252.0/22\n202.80.192.0/22\n202.81.176.0/20\n202.84.17.0/24\n202.85.208.0/20\n202.89.232.0/21\n202.89.96.0/22\n202.90.20.0/22\n202.90.96.0/20\n202.91.176.0/21\n202.91.184.0/23\n202.91.186.0/24\n202.91.190.0/23\n202.91.224.0/20\n202.91.240.0/21\n202.91.248.0/22\n202.93.252.0/22\n202.95.0.0/19\n202.96.0.0/13\n203.0.104.0/21\n203.100.192.0/20\n203.100.92.0/22\n203.104.32.0/20\n203.107.1.0/24\n203.107.116.0/22\n203.107.13.0/24\n203.107.2.0/24\n203.107.20.0/22\n203.107.24.0/24\n203.107.26.0/23\n203.107.28.0/22\n203.107.32.0/19\n203.107.6.0/24\n203.107.72.0/21\n203.107.80.0/21\n203.107.96.0/23\n203.110.160.0/19\n203.110.208.0/20\n203.110.232.0/23\n203.110.234.0/24\n203.114.244.0/22\n203.118.248.0/22\n203.119.114.0/23\n203.119.128.0/19\n203.119.160.0/24\n203.119.168.0/21\n203.119.176.0/20\n203.119.192.0/18\n203.119.25.0/24\n203.119.26.0/23\n203.119.28.0/22\n203.119.33.0/24\n203.119.80.0/23\n203.119.83.0/24\n203.12.91.0/24\n203.12.93.0/24\n203.129.12.0/22\n203.13.81.0/24\n203.130.32.0/22\n203.130.40.0/21\n203.132.32.0/19\n203.135.96.0/19\n203.148.0.0/18\n203.148.64.0/20\n203.148.86.0/23\n203.15.0.0/20\n203.152.64.0/19\n203.156.192.0/18\n203.160.129.0/24\n203.160.192.0/19\n203.161.192.0/19\n203.166.160.0/22\n203.166.165.0/24\n203.166.166.0/24\n203.166.172.0/24\n203.166.177.0/24\n203.166.186.0/23\n203.166.188.0/23\n203.166.191.0/24\n203.168.0.0/19\n203.170.58.0/23\n203.174.4.0/24\n203.174.96.0/19\n203.175.128.0/19\n203.176.168.0/24\n203.176.170.0/24\n203.176.92.0/22\n203.187.160.0/19\n203.189.0.0/23\n203.189.113.0/24\n203.189.115.0/24\n203.189.192.0/19\n203.189.240.0/22\n203.189.6.0/23\n203.190.100.0/23\n203.191.0.0/23\n203.191.144.0/21\n203.192.1.0/24\n203.192.16.0/24\n203.192.2.0/23\n203.192.24.0/23\n203.192.4.0/22\n203.192.8.0/21\n203.193.224.0/19\n203.194.122.0/23\n203.194.124.0/24\n203.195.113.0/24\n203.195.114.0/24\n203.195.118.0/23\n203.195.128.0/17\n203.195.64.0/19\n203.196.0.0/21\n203.2.112.0/21\n203.2.160.0/21\n203.2.64.0/21\n203.202.236.0/23\n203.207.104.0/22\n203.207.112.0/20\n203.207.128.0/18\n203.207.192.0/21\n203.207.200.0/22\n203.207.208.0/20\n203.207.224.0/19\n203.207.64.0/19\n203.207.96.0/21\n203.208.32.0/19\n203.209.224.0/19\n203.212.0.0/20\n203.212.80.0/23\n203.215.232.0/23\n203.215.236.0/24\n203.223.21.0/24\n203.25.208.0/20\n203.25.52.0/24\n203.3.112.0/21\n203.3.80.0/21\n203.32.203.0/24\n203.32.204.0/23\n203.32.212.0/24\n203.32.48.0/23\n203.32.68.0/23\n203.32.84.0/23\n203.33.145.0/24\n203.33.156.0/24\n203.33.158.0/23\n203.33.174.0/24\n203.33.185.0/24\n203.33.200.0/24\n203.33.202.0/23\n203.33.206.0/23\n203.33.21.0/24\n203.33.214.0/23\n203.33.224.0/23\n203.33.226.0/24\n203.33.26.0/24\n203.33.32.0/24\n203.33.4.0/24\n203.33.63.0/24\n203.33.64.0/24\n203.33.67.0/24\n203.33.7.0/24\n203.34.106.0/24\n203.34.113.0/24\n203.34.147.0/24\n203.34.150.0/24\n203.34.152.0/23\n203.34.161.0/24\n203.34.162.0/24\n203.34.21.0/24\n203.34.232.0/24\n203.34.240.0/24\n203.34.242.0/24\n203.34.245.0/24\n203.34.251.0/24\n203.34.27.0/24\n203.34.39.0/24\n203.34.48.0/23\n203.34.54.0/24\n203.34.56.0/23\n203.34.67.0/24\n203.34.69.0/24\n203.34.76.0/24\n203.34.92.0/24\n203.55.10.0/24\n203.55.101.0/24\n203.55.109.0/24\n203.55.110.0/24\n203.55.116.0/23\n203.55.119.0/24\n203.55.128.0/23\n203.55.13.0/24\n203.55.146.0/23\n203.55.192.0/24\n203.55.196.0/24\n203.55.2.0/23\n203.55.218.0/23\n203.55.22.0/24\n203.55.221.0/24\n203.55.224.0/24\n203.55.30.0/24\n203.55.4.0/24\n203.55.93.0/24\n203.56.1.0/24\n203.56.110.0/24\n203.56.12.0/24\n203.56.121.0/24\n203.56.161.0/24\n203.56.169.0/24\n203.56.172.0/23\n203.56.175.0/24\n203.56.183.0/24\n203.56.185.0/24\n203.56.187.0/24\n203.56.192.0/24\n203.56.198.0/24\n203.56.201.0/24\n203.56.208.0/23\n203.56.210.0/24\n203.56.214.0/24\n203.56.216.0/24\n203.56.228.0/24\n203.56.232.0/24\n203.56.24.0/24\n203.56.240.0/24\n203.56.252.0/24\n203.56.254.0/24\n203.56.38.0/24\n203.56.4.0/24\n203.56.40.0/24\n203.56.46.0/24\n203.56.68.0/23\n203.56.82.0/23\n203.56.84.0/23\n203.56.95.0/24\n203.57.101.0/24\n203.57.109.0/24\n203.57.12.0/23\n203.57.123.0/24\n203.57.157.0/24\n203.57.200.0/24\n203.57.202.0/24\n203.57.206.0/24\n203.57.222.0/24\n203.57.224.0/20\n203.57.249.0/24\n203.57.254.0/23\n203.57.28.0/24\n203.57.39.0/24\n203.57.46.0/24\n203.57.5.0/24\n203.57.58.0/24\n203.57.6.0/24\n203.57.61.0/24\n203.57.66.0/24\n203.57.69.0/24\n203.57.70.0/23\n203.57.73.0/24\n203.57.90.0/24\n203.6.224.0/20\n203.62.131.0/24\n203.62.139.0/24\n203.62.2.0/24\n203.65.240.0/22\n203.76.208.0/21\n203.76.216.0/22\n203.76.240.0/22\n203.78.48.0/20\n203.79.0.0/23\n203.8.25.0/24\n203.8.30.0/24\n203.80.144.0/20\n203.80.57.0/24\n203.82.0.0/23\n203.83.224.0/20\n203.83.56.0/21\n203.86.0.0/19\n203.86.112.0/24\n203.86.254.0/23\n203.86.43.0/24\n203.86.44.0/23\n203.86.48.0/23\n203.86.51.0/24\n203.86.52.0/22\n203.86.60.0/23\n203.86.62.0/24\n203.86.64.0/19\n203.88.192.0/19\n203.88.32.0/19\n203.90.128.0/18\n203.90.192.0/19\n203.91.120.0/21\n203.91.32.0/19\n203.93.0.0/18\n203.93.117.0/24\n203.93.120.0/21\n203.93.128.0/19\n203.93.160.0/20\n203.93.208.0/20\n203.93.224.0/19\n203.93.64.0/19\n203.93.96.0/20\n203.94.0.0/19\n203.95.0.0/23\n203.95.128.0/23\n203.95.2.0/24\n203.95.4.0/22\n203.99.20.0/22\n203.99.24.0/21\n204.14.76.0/24\n204.235.241.0/24\n206.109.75.0/24\n210.12.0.0/16\n210.13.0.0/17\n210.13.192.0/19\n210.13.224.0/24\n210.13.227.0/24\n210.13.230.0/23\n210.13.232.0/24\n210.13.236.0/23\n210.13.238.0/24\n210.13.240.0/20\n210.14.112.0/20\n210.14.128.0/19\n210.14.192.0/18\n210.14.64.0/20\n210.14.80.0/22\n210.14.84.0/24\n210.14.90.0/23\n210.14.92.0/22\n210.15.0.0/17\n210.16.160.0/19\n210.185.192.0/18\n210.192.116.0/22\n210.192.120.0/21\n210.192.96.0/20\n210.2.0.0/23\n210.2.4.0/24\n210.21.0.0/17\n210.21.192.0/18\n210.22.0.0/19\n210.22.128.0/17\n210.22.32.0/22\n210.22.48.0/20\n210.22.64.0/18\n210.25.0.0/16\n210.26.0.0/15\n210.28.0.0/14\n210.32.0.0/12\n210.48.136.0/21\n210.5.0.0/19\n210.5.128.0/19\n210.5.56.0/21\n210.51.0.0/16\n210.52.0.0/15\n210.72.0.0/17\n210.72.128.0/18\n210.72.192.0/19\n210.72.224.0/20\n210.72.240.0/21\n210.73.0.0/17\n210.73.128.0/18\n210.73.192.0/22\n210.73.204.0/24\n210.73.208.0/20\n210.73.224.0/19\n210.74.0.0/20\n210.74.107.0/24\n210.74.108.0/23\n210.74.128.0/18\n210.74.224.0/19\n210.74.35.0/24\n210.74.36.0/23\n210.74.38.0/24\n210.74.40.0/22\n210.74.44.0/23\n210.74.47.0/24\n210.74.64.0/23\n210.75.0.0/18\n210.75.192.0/18\n210.75.96.0/19\n210.76.0.0/18\n210.76.160.0/19\n210.76.192.0/19\n210.76.64.0/19\n210.77.0.0/18\n210.77.128.0/19\n210.77.176.0/20\n210.77.192.0/18\n210.77.64.0/19\n210.78.128.0/24\n210.78.134.0/23\n210.78.139.0/24\n210.78.144.0/23\n210.79.224.0/19\n210.82.0.0/15\n210.87.128.0/18\n211.100.0.0/17\n211.100.192.0/20\n211.100.224.0/19\n211.101.0.0/18\n211.101.192.0/20\n211.101.232.0/21\n211.101.240.0/21\n211.102.128.0/18\n211.102.192.0/23\n211.102.208.0/20\n211.102.240.0/21\n211.102.248.0/24\n211.102.80.0/20\n211.103.0.0/16\n211.136.0.0/13\n211.144.10.0/24\n211.144.100.0/22\n211.144.104.0/22\n211.144.108.0/23\n211.144.110.0/24\n211.144.112.0/24\n211.144.114.0/23\n211.144.118.0/23\n211.144.12.0/22\n211.144.120.0/21\n211.144.128.0/19\n211.144.16.0/24\n211.144.18.0/23\n211.144.192.0/18\n211.144.20.0/24\n211.144.22.0/24\n211.144.24.0/24\n211.144.27.0/24\n211.144.28.0/23\n211.144.32.0/19\n211.144.64.0/19\n211.144.9.0/24\n211.144.96.0/23\n211.145.0.0/18\n211.145.64.0/20\n211.146.0.0/16\n211.147.0.0/18\n211.147.128.0/18\n211.147.208.0/20\n211.147.224.0/19\n211.147.64.0/19\n211.148.0.0/18\n211.148.128.0/17\n211.149.128.0/17\n211.150.0.0/18\n211.150.100.0/23\n211.150.114.0/23\n211.150.122.0/24\n211.150.124.0/23\n211.150.128.0/24\n211.150.64.0/19\n211.150.98.0/24\n211.151.0.0/16\n211.152.0.0/17\n211.152.192.0/22\n211.152.196.0/23\n211.152.208.0/20\n211.153.0.0/16\n211.154.0.0/19\n211.154.128.0/17\n211.154.64.0/19\n211.155.108.0/22\n211.155.112.0/20\n211.155.128.0/19\n211.155.16.0/20\n211.155.160.0/20\n211.155.176.0/22\n211.155.184.0/21\n211.155.224.0/21\n211.155.232.0/22\n211.155.236.0/24\n211.155.240.0/20\n211.155.32.0/19\n211.155.80.0/20\n211.156.0.0/19\n211.156.128.0/19\n211.156.176.0/20\n211.156.192.0/20\n211.156.208.0/21\n211.156.216.0/22\n211.156.220.0/23\n211.156.223.0/24\n211.157.0.0/19\n211.157.128.0/18\n211.157.192.0/20\n211.157.219.0/24\n211.157.222.0/24\n211.157.224.0/19\n211.157.96.0/19\n211.158.0.0/16\n211.159.128.0/17\n211.159.64.0/21\n211.160.0.0/22\n211.160.112.0/23\n211.160.115.0/24\n211.160.120.0/24\n211.160.14.0/23\n211.160.16.0/21\n211.160.160.0/19\n211.160.194.0/23\n211.160.196.0/24\n211.160.202.0/23\n211.160.204.0/23\n211.160.24.0/22\n211.160.240.0/20\n211.160.28.0/23\n211.160.36.0/23\n211.160.4.0/23\n211.160.46.0/23\n211.160.62.0/23\n211.160.72.0/21\n211.160.8.0/22\n211.160.80.0/20\n211.161.0.0/20\n211.161.101.0/24\n211.161.102.0/23\n211.161.120.0/21\n211.161.192.0/22\n211.161.203.0/24\n211.161.209.0/24\n211.161.221.0/24\n211.161.224.0/20\n211.161.24.0/22\n211.161.32.0/20\n211.161.60.0/23\n211.161.62.0/24\n211.161.97.0/24\n211.162.0.0/21\n211.162.119.0/24\n211.162.120.0/21\n211.162.200.0/22\n211.162.64.0/20\n211.165.0.0/16\n211.166.0.0/16\n211.167.128.0/19\n211.167.176.0/20\n211.167.224.0/19\n211.167.64.0/18\n211.64.0.0/13\n211.80.0.0/13\n211.88.0.0/15\n211.90.0.0/17\n211.90.128.0/18\n211.90.192.0/20\n211.90.216.0/21\n211.90.224.0/19\n211.91.0.0/18\n211.91.120.0/21\n211.91.128.0/18\n211.91.216.0/21\n211.91.224.0/19\n211.91.64.0/19\n211.91.96.0/20\n211.92.0.0/17\n211.92.128.0/18\n211.92.192.0/19\n211.92.224.0/20\n211.92.244.0/22\n211.93.0.0/17\n211.93.128.0/20\n211.93.144.0/21\n211.93.160.0/19\n211.93.192.0/21\n211.93.200.0/23\n211.93.204.0/22\n211.93.211.0/24\n211.93.212.0/23\n211.93.224.0/19\n211.94.128.0/17\n211.94.37.0/24\n211.94.64.0/18\n211.95.0.0/17\n211.95.128.0/19\n211.95.192.0/18\n211.96.0.0/16\n211.97.0.0/17\n211.97.128.0/19\n211.97.160.0/21\n211.97.176.0/20\n211.97.192.0/18\n211.98.0.0/16\n211.99.128.0/18\n211.99.16.0/23\n211.99.192.0/19\n211.99.24.0/21\n211.99.32.0/19\n211.99.64.0/18\n211.99.8.0/21\n212.129.128.0/17\n212.64.0.0/17\n218.0.0.0/11\n218.100.88.0/21\n218.104.0.0/15\n218.106.0.0/16\n218.107.0.0/18\n218.107.128.0/17\n218.108.0.0/15\n218.185.240.0/21\n218.192.0.0/12\n218.240.0.0/18\n218.240.128.0/19\n218.240.160.0/21\n218.240.168.0/22\n218.240.176.0/20\n218.241.112.0/22\n218.241.116.0/23\n218.241.118.0/24\n218.241.121.0/24\n218.241.122.0/23\n218.241.124.0/22\n218.241.128.0/17\n218.241.16.0/21\n218.241.24.0/22\n218.241.96.0/20\n218.242.0.0/16\n218.244.0.0/19\n218.244.128.0/18\n218.244.192.0/20\n218.244.224.0/19\n218.244.44.0/22\n218.244.49.0/24\n218.244.52.0/23\n218.244.55.0/24\n218.244.56.0/23\n218.244.58.0/24\n218.245.0.0/17\n218.246.0.0/19\n218.246.160.0/19\n218.246.192.0/19\n218.246.32.0/22\n218.246.48.0/22\n218.246.64.0/18\n218.247.0.0/18\n218.247.128.0/17\n218.249.0.0/16\n218.56.0.0/13\n218.64.0.0/11\n218.96.0.0/24\n218.96.104.0/22\n218.96.108.0/23\n218.96.126.0/23\n218.96.128.0/24\n218.96.241.0/24\n218.96.244.0/24\n218.96.255.0/24\n218.96.64.0/22\n218.97.0.0/17\n218.97.160.0/19\n218.97.192.0/19\n218.97.240.0/20\n218.98.0.0/18\n218.98.104.0/22\n218.98.108.0/23\n218.98.111.0/24\n218.98.112.0/20\n218.98.160.0/24\n218.98.176.0/21\n218.98.192.0/24\n218.98.96.0/21\n219.128.0.0/12\n219.144.0.0/14\n219.148.0.0/15\n219.150.0.0/16\n219.151.0.0/18\n219.151.128.0/17\n219.152.0.0/14\n219.156.0.0/15\n219.158.0.0/19\n219.158.128.0/17\n219.158.32.0/20\n219.158.58.0/23\n219.158.60.0/22\n219.158.96.0/19\n219.159.0.0/16\n219.216.0.0/13\n219.224.0.0/13\n219.232.0.0/17\n219.232.144.0/24\n219.232.160.0/19\n219.232.192.0/19\n219.233.0.0/16\n219.234.128.0/17\n219.234.80.0/20\n219.234.96.0/19\n219.235.0.0/20\n219.235.128.0/19\n219.235.192.0/23\n219.235.207.0/24\n219.235.224.0/22\n219.235.228.0/23\n219.235.233.0/24\n219.235.234.0/24\n219.235.237.0/24\n219.235.251.0/24\n219.235.252.0/24\n219.235.255.0/24\n219.235.32.0/19\n219.235.64.0/18\n219.236.0.0/14\n219.242.0.0/15\n219.244.0.0/14\n219.72.0.0/16\n219.82.0.0/16\n219.83.160.0/19\n220.101.192.0/18\n220.112.0.0/22\n220.112.194.0/24\n220.112.196.0/24\n220.112.200.0/21\n220.112.40.0/21\n220.112.50.0/23\n220.112.52.0/23\n220.112.54.0/24\n220.112.8.0/24\n220.113.0.0/19\n220.113.150.0/23\n220.113.152.0/23\n220.113.154.0/24\n220.113.32.0/20\n220.113.96.0/21\n220.114.250.0/23\n220.154.0.0/20\n220.154.128.0/20\n220.154.147.0/24\n220.154.16.0/22\n220.154.64.0/20\n220.154.80.0/22\n220.160.0.0/12\n220.176.0.0/14\n220.180.0.0/16\n220.181.0.0/17\n220.181.128.0/20\n220.181.144.0/24\n220.181.148.0/22\n220.181.152.0/21\n220.181.160.0/19\n220.182.0.0/18\n220.184.0.0/13\n220.192.0.0/16\n220.193.0.0/17\n220.194.0.0/16\n220.195.0.0/17\n220.195.128.0/19\n220.195.192.0/18\n220.196.0.0/16\n220.197.0.0/17\n220.197.160.0/19\n220.197.192.0/18\n220.198.0.0/15\n220.200.0.0/17\n220.200.128.0/20\n220.200.148.0/22\n220.200.152.0/21\n220.200.160.0/19\n220.200.192.0/18\n220.201.0.0/16\n220.202.0.0/16\n220.203.0.0/17\n220.203.128.0/18\n220.203.216.0/23\n220.203.220.0/22\n220.203.224.0/19\n220.205.0.0/16\n220.206.192.0/22\n220.207.0.0/22\n220.207.176.0/22\n220.207.184.0/22\n220.207.254.0/23\n220.207.80.0/20\n220.231.0.0/18\n220.231.128.0/17\n220.232.64.0/18\n220.234.0.0/16\n220.242.180.0/24\n220.243.128.0/18\n220.248.0.0/16\n220.249.0.0/17\n220.249.128.0/18\n220.249.192.0/19\n220.249.240.0/20\n220.250.0.0/17\n221.0.0.0/13\n221.12.0.0/17\n221.12.128.0/18\n221.122.0.0/16\n221.123.0.0/24\n221.123.112.0/20\n221.123.128.0/17\n221.129.0.0/16\n221.13.0.0/16\n221.130.0.0/15\n221.133.225.0/24\n221.133.226.0/24\n221.133.228.0/22\n221.133.232.0/23\n221.133.235.0/24\n221.133.244.0/23\n221.137.0.0/16\n221.14.0.0/15\n221.172.0.0/16\n221.174.0.0/16\n221.176.0.0/13\n221.192.0.0/14\n221.196.0.0/15\n221.198.0.0/16\n221.199.0.0/17\n221.199.128.0/18\n221.199.192.0/20\n221.199.224.0/19\n221.200.0.0/13\n221.208.0.0/12\n221.224.0.0/12\n221.8.0.0/14\n222.125.0.0/16\n222.126.128.0/17\n222.128.0.0/12\n222.16.0.0/12\n222.160.0.0/14\n222.168.0.0/13\n222.176.0.0/12\n222.192.0.0/11\n222.240.0.0/13\n222.248.0.0/15\n222.35.0.0/16\n222.42.115.0/24\n222.44.0.0/15\n222.49.128.0/17\n222.50.0.0/16\n222.59.128.0/17\n222.64.0.0/11\n223.0.1.0/24\n223.0.12.0/23\n223.0.126.0/24\n223.0.15.0/24\n223.0.16.0/24\n223.0.2.0/24\n223.0.30.0/24\n223.0.40.0/23\n223.0.8.0/22\n223.128.0.0/15\n223.144.0.0/12\n223.160.0.0/20\n223.160.112.0/20\n223.160.128.0/22\n223.160.134.0/23\n223.160.136.0/21\n223.160.144.0/20\n223.160.16.0/21\n223.160.160.0/19\n223.160.192.0/19\n223.160.224.0/21\n223.160.232.0/22\n223.160.236.0/23\n223.161.194.0/23\n223.161.196.0/22\n223.161.200.0/21\n223.161.208.0/20\n223.161.224.0/19\n223.166.0.0/15\n223.192.0.0/15\n223.198.0.0/15\n223.2.0.0/15\n223.202.0.0/24\n223.202.131.0/24\n223.202.132.0/24\n223.202.134.0/23\n223.202.211.0/24\n223.202.212.0/24\n223.202.67.0/24\n223.203.100.0/24\n223.203.3.0/24\n223.203.9.0/24\n223.203.96.0/24\n223.210.0.0/19\n223.210.48.0/22\n223.212.0.0/14\n223.220.0.0/15\n223.223.176.0/20\n223.223.192.0/20\n223.240.0.0/13\n223.248.0.0/14\n223.252.194.0/24\n223.252.199.0/24\n223.252.200.0/23\n223.252.202.0/24\n223.252.205.0/24\n223.252.209.0/24\n223.252.210.0/23\n223.252.212.0/24\n223.252.214.0/23\n223.252.221.0/24\n223.252.222.0/24\n223.255.236.0/22\n223.255.252.0/23\n223.27.184.0/22\n223.4.0.0/14\n223.64.0.0/10\n223.8.0.0/13\n23.161.8.0/24\n23.162.120.0/24\n23.26.67.0/24\n27.0.128.0/24\n27.0.130.0/23\n27.0.132.0/22\n27.0.160.0/21\n27.0.204.0/22\n27.0.208.0/21\n27.106.204.0/22\n27.109.124.0/22\n27.112.0.0/21\n27.115.0.0/17\n27.128.0.0/15\n27.144.0.0/16\n27.148.0.0/14\n27.152.0.0/13\n27.16.0.0/12\n27.184.0.0/13\n27.192.0.0/11\n27.224.0.0/14\n27.36.0.0/14\n27.40.0.0/13\n27.50.128.0/17\n27.8.0.0/13\n27.98.224.0/19\n31.56.124.0/24\n36.1.0.0/16\n36.112.0.0/15\n36.114.0.0/16\n36.128.0.0/10\n36.16.0.0/12\n36.192.0.0/16\n36.206.0.0/16\n36.212.0.0/15\n36.214.0.0/16\n36.221.0.0/17\n36.248.0.0/14\n36.255.116.0/22\n36.255.128.0/22\n36.255.164.0/24\n36.32.0.0/14\n36.36.0.0/16\n36.4.0.0/14\n36.40.0.0/13\n36.48.0.0/15\n36.50.226.0/24\n36.51.224.0/23\n36.51.226.0/24\n36.51.248.0/24\n36.51.253.0/24\n36.51.254.0/24\n36.56.0.0/13\n36.96.0.0/12\n38.105.24.0/24\n38.105.26.0/23\n38.105.28.0/22\n38.134.56.0/24\n38.134.58.0/23\n38.247.24.0/22\n38.247.32.0/23\n38.247.36.0/22\n38.84.220.0/24\n38.95.118.0/23\n38.95.121.0/24\n38.95.122.0/23\n38.95.124.0/22\n39.104.0.0/14\n39.108.0.0/16\n39.125.80.0/24\n39.128.0.0/10\n39.64.0.0/11\n39.96.0.0/13\n40.125.128.0/17\n40.126.64.0/18\n40.162.0.0/16\n40.72.0.0/15\n42.100.0.0/14\n42.120.0.0/15\n42.122.0.0/16\n42.123.64.0/18\n42.156.128.0/17\n42.157.128.0/21\n42.157.160.0/19\n42.157.192.0/21\n42.158.0.0/15\n42.176.0.0/13\n42.184.0.0/15\n42.186.0.0/16\n42.187.120.0/22\n42.187.128.0/17\n42.192.0.0/15\n42.194.12.0/24\n42.194.128.0/17\n42.199.240.0/22\n42.201.32.0/19\n42.201.64.0/21\n42.201.72.0/22\n42.201.76.0/23\n42.202.0.0/15\n42.224.0.0/12\n42.240.0.0/21\n42.240.12.0/23\n42.240.128.0/17\n42.240.16.0/23\n42.240.20.0/22\n42.240.48.0/24\n42.240.8.0/22\n42.242.0.0/15\n42.244.0.0/14\n42.248.0.0/15\n42.4.0.0/14\n42.48.0.0/15\n42.51.0.0/16\n42.52.0.0/14\n42.56.0.0/14\n42.62.0.0/17\n42.63.0.0/16\n42.80.0.0/15\n42.83.128.0/22\n42.83.132.0/23\n42.83.134.0/24\n42.83.144.0/22\n42.83.189.0/24\n42.83.190.0/24\n42.83.200.0/23\n42.84.0.0/14\n42.88.0.0/13\n42.96.128.0/17\n42.97.0.0/16\n42.99.0.0/18\n43.102.128.0/21\n43.102.136.0/22\n43.102.144.0/20\n43.109.0.0/22\n43.109.10.0/24\n43.109.100.0/23\n43.109.102.0/24\n43.109.105.0/24\n43.109.107.0/24\n43.109.111.0/24\n43.109.112.0/24\n43.109.114.0/23\n43.109.116.0/23\n43.109.12.0/22\n43.109.134.0/23\n43.109.16.0/22\n43.109.21.0/24\n43.109.22.0/24\n43.109.24.0/23\n43.109.26.0/24\n43.109.28.0/24\n43.109.30.0/23\n43.109.32.0/23\n43.109.34.0/24\n43.109.37.0/24\n43.109.38.0/23\n43.109.4.0/23\n43.109.40.0/22\n43.109.44.0/23\n43.109.46.0/24\n43.109.48.0/23\n43.109.51.0/24\n43.109.53.0/24\n43.109.54.0/23\n43.109.57.0/24\n43.109.58.0/23\n43.109.60.0/22\n43.109.64.0/22\n43.109.68.0/23\n43.109.7.0/24\n43.109.70.0/24\n43.109.72.0/23\n43.109.76.0/22\n43.109.8.0/23\n43.109.83.0/24\n43.109.84.0/22\n43.109.88.0/22\n43.109.93.0/24\n43.109.94.0/24\n43.109.96.0/23\n43.136.0.0/13\n43.144.0.0/15\n43.176.0.0/14\n43.180.0.0/16\n43.192.0.0/16\n43.193.0.0/18\n43.193.64.0/23\n43.194.0.0/20\n43.194.16.0/24\n43.195.0.0/20\n43.196.0.0/16\n43.224.12.0/22\n43.224.24.0/22\n43.224.240.0/24\n43.224.52.0/23\n43.224.56.0/22\n43.224.80.0/22\n43.225.120.0/22\n43.225.180.0/22\n43.225.208.0/22\n43.225.216.0/22\n43.225.255.0/24\n43.225.76.0/22\n43.225.84.0/23\n43.225.87.0/24\n43.226.112.0/21\n43.226.128.0/19\n43.226.164.0/22\n43.226.236.0/22\n43.226.32.0/19\n43.226.64.0/20\n43.227.104.0/22\n43.227.140.0/22\n43.227.152.0/21\n43.227.160.0/20\n43.227.176.0/21\n43.227.192.0/19\n43.227.252.0/22\n43.227.56.0/21\n43.227.64.0/21\n43.227.80.0/20\n43.228.0.0/19\n43.228.116.0/22\n43.228.204.0/22\n43.228.240.0/22\n43.228.36.0/22\n43.228.40.0/21\n43.228.48.0/20\n43.228.64.0/21\n43.228.76.0/22\n43.229.184.0/22\n43.229.216.0/22\n43.229.48.0/22\n43.230.221.0/24\n43.230.222.0/23\n43.230.72.0/22\n43.231.144.0/20\n43.231.160.0/21\n43.231.168.0/22\n43.231.32.0/22\n43.231.41.0/24\n43.231.46.0/23\n43.231.96.0/20\n43.239.120.0/22\n43.239.172.0/24\n43.240.0.0/22\n43.240.124.0/22\n43.240.128.0/22\n43.240.133.0/24\n43.240.136.0/22\n43.240.156.0/22\n43.240.192.0/21\n43.240.200.0/23\n43.240.202.0/24\n43.240.204.0/22\n43.240.216.0/21\n43.240.56.0/21\n43.240.72.0/22\n43.241.16.0/22\n43.241.180.0/22\n43.241.208.0/20\n43.241.224.0/20\n43.241.240.0/22\n43.241.48.0/22\n43.241.76.0/22\n43.242.152.0/21\n43.242.164.0/22\n43.242.180.0/22\n43.242.192.0/21\n43.242.204.0/22\n43.242.252.0/22\n43.242.72.0/22\n43.242.84.0/22\n43.242.96.0/22\n43.243.12.0/22\n43.243.128.0/22\n43.243.136.0/22\n43.243.148.0/22\n43.243.156.0/22\n43.243.16.0/22\n43.243.228.0/22\n43.243.232.0/22\n43.243.244.0/22\n43.243.4.0/22\n43.243.88.0/22\n43.247.100.0/22\n43.247.176.0/20\n43.247.196.0/22\n43.247.244.0/22\n43.247.248.0/22\n43.247.4.0/24\n43.247.68.0/22\n43.247.84.0/22\n43.247.88.0/22\n43.248.0.0/22\n43.248.108.0/22\n43.248.112.0/21\n43.248.128.0/20\n43.248.184.0/21\n43.248.192.0/20\n43.248.232.0/22\n43.248.244.0/22\n43.248.48.0/22\n43.248.76.0/22\n43.248.96.0/21\n43.249.136.0/22\n43.249.144.0/22\n43.249.168.0/22\n43.249.192.0/22\n43.249.236.0/22\n43.250.112.0/22\n43.250.144.0/22\n43.250.168.0/22\n43.250.200.0/22\n43.250.236.0/22\n43.250.244.0/22\n43.250.32.0/22\n43.250.4.0/22\n43.250.96.0/22\n43.251.232.0/22\n43.251.244.0/22\n43.251.36.0/22\n43.251.4.0/22\n43.252.48.0/24\n43.254.0.0/22\n43.254.100.0/22\n43.254.104.0/23\n43.254.106.0/24\n43.254.116.0/22\n43.254.136.0/22\n43.254.140.0/23\n43.254.144.0/20\n43.254.168.0/21\n43.254.192.0/22\n43.254.200.0/22\n43.254.220.0/22\n43.254.224.0/20\n43.254.24.0/22\n43.254.240.0/22\n43.254.248.0/21\n43.254.44.0/22\n43.254.52.0/22\n43.254.8.0/22\n43.254.88.0/22\n43.255.0.0/22\n43.255.184.0/22\n43.255.192.0/22\n43.255.200.0/22\n43.255.212.0/22\n43.255.224.0/21\n43.255.68.0/22\n43.255.84.0/22\n43.255.96.0/22\n44.30.120.0/24\n44.31.216.0/24\n44.31.28.0/24\n44.31.43.0/24\n44.32.191.0/24\n44.32.69.0/24\n45.112.232.0/22\n45.113.20.0/22\n45.113.200.0/22\n45.113.206.0/24\n45.113.24.0/22\n45.113.40.0/22\n45.115.144.0/22\n45.115.164.0/22\n45.115.200.0/22\n45.115.44.0/22\n45.116.100.0/22\n45.116.140.0/22\n45.116.152.0/22\n45.116.208.0/22\n45.116.32.0/22\n45.116.52.0/22\n45.117.68.0/22\n45.117.8.0/22\n45.119.104.0/23\n45.119.116.0/22\n45.119.60.0/22\n45.119.64.0/21\n45.12.82.0/24\n45.120.100.0/22\n45.120.164.0/22\n45.120.243.0/24\n45.121.52.0/24\n45.121.55.0/24\n45.123.128.0/22\n45.123.168.0/21\n45.123.176.0/21\n45.124.124.0/22\n45.124.20.0/22\n45.124.68.0/22\n45.124.76.0/22\n45.124.80.0/22\n45.125.44.0/22\n45.125.56.0/22\n45.126.112.0/22\n45.126.120.0/22\n45.127.129.0/24\n45.127.144.0/21\n45.137.97.0/24\n45.146.82.0/24\n45.248.108.0/22\n45.248.204.0/22\n45.248.8.0/22\n45.249.212.0/22\n45.250.152.0/23\n45.250.180.0/23\n45.250.184.0/22\n45.250.188.0/24\n45.250.28.0/22\n45.250.32.0/21\n45.250.40.0/22\n45.251.120.0/22\n45.251.2.0/23\n45.251.20.0/22\n45.251.8.0/22\n45.251.88.0/21\n45.251.96.0/21\n45.252.0.0/22\n45.252.104.0/22\n45.252.48.0/22\n45.253.112.0/21\n45.253.132.0/22\n45.253.136.0/21\n45.253.144.0/20\n45.253.160.0/19\n45.253.192.0/19\n45.253.224.0/20\n45.253.24.0/22\n45.253.240.0/22\n45.253.32.0/24\n45.253.60.0/22\n45.253.96.0/20\n45.254.20.0/22\n45.254.48.0/23\n45.254.50.0/24\n45.254.64.0/20\n45.254.8.0/22\n45.255.152.0/22\n45.40.192.0/18\n45.65.20.0/22\n45.65.24.0/22\n45.82.239.0/24\n45.86.73.0/24\n46.37.112.0/24\n47.112.0.0/13\n47.120.0.0/14\n47.246.0.0/23\n47.246.12.0/23\n47.246.15.0/24\n47.246.20.0/24\n47.246.22.0/23\n47.246.24.0/24\n47.246.26.0/24\n47.246.28.0/22\n47.246.3.0/24\n47.246.36.0/22\n47.246.4.0/24\n47.246.41.0/24\n47.246.42.0/23\n47.246.44.0/23\n47.246.46.0/24\n47.246.48.0/23\n47.246.50.0/24\n47.246.57.0/24\n47.246.6.0/23\n47.246.60.0/22\n47.246.64.0/24\n47.246.8.0/24\n47.89.121.0/24\n47.89.91.0/24\n47.92.0.0/14\n47.96.0.0/12\n49.112.0.0/13\n49.120.0.0/14\n49.140.0.0/15\n49.208.0.0/14\n49.221.128.0/19\n49.221.26.0/23\n49.221.64.0/19\n49.232.0.0/14\n49.239.192.0/18\n49.4.0.0/18\n49.4.112.0/21\n49.4.120.0/22\n49.4.124.0/23\n49.4.126.0/24\n49.4.128.0/22\n49.4.64.0/19\n49.4.96.0/20\n49.52.0.0/14\n49.64.0.0/11\n49.7.0.0/16\n5.10.138.0/23\n5.10.140.0/24\n5.10.143.0/24\n50.114.121.0/24\n52.130.0.0/15\n52.80.0.0/15\n52.82.0.0/17\n52.82.128.0/23\n52.82.131.0/24\n52.82.132.0/24\n52.82.134.0/23\n52.82.136.0/24\n52.82.144.0/23\n52.82.148.0/22\n52.82.160.0/21\n52.82.170.0/23\n52.82.172.0/22\n52.82.176.0/21\n52.82.184.0/23\n52.82.187.0/24\n52.82.188.0/23\n52.82.190.0/24\n52.82.192.0/18\n52.83.0.0/16\n54.222.0.0/19\n54.222.100.0/22\n54.222.104.0/21\n54.222.112.0/22\n54.222.116.0/23\n54.222.128.0/17\n54.222.32.0/21\n54.222.45.0/24\n54.222.46.0/23\n54.222.48.0/21\n54.222.57.0/24\n54.222.60.0/22\n54.222.64.0/23\n54.222.70.0/23\n54.222.72.0/21\n54.222.80.0/21\n54.222.88.0/22\n54.222.96.0/23\n54.223.0.0/16\n58.100.0.0/15\n58.116.0.0/14\n58.128.0.0/13\n58.144.0.0/16\n58.154.0.0/15\n58.16.0.0/13\n58.192.0.0/11\n58.24.0.0/15\n58.240.0.0/12\n58.30.0.0/15\n58.32.0.0/11\n58.67.128.0/17\n58.68.236.0/24\n58.68.247.0/24\n58.82.0.0/22\n58.83.0.0/16\n58.87.64.0/18\n58.99.128.0/17\n59.107.0.0/17\n59.108.0.0/16\n59.110.0.0/16\n59.111.0.0/20\n59.111.104.0/23\n59.111.107.0/24\n59.111.109.0/24\n59.111.111.0/24\n59.111.112.0/21\n59.111.128.0/20\n59.111.144.0/24\n59.111.152.0/21\n59.111.160.0/21\n59.111.168.0/22\n59.111.17.0/24\n59.111.173.0/24\n59.111.175.0/24\n59.111.178.0/23\n59.111.18.0/23\n59.111.181.0/24\n59.111.182.0/23\n59.111.190.0/24\n59.111.192.0/23\n59.111.198.0/23\n59.111.203.0/24\n59.111.205.0/24\n59.111.21.0/24\n59.111.211.0/24\n59.111.214.0/24\n59.111.22.0/24\n59.111.224.0/21\n59.111.232.0/23\n59.111.236.0/24\n59.111.238.0/23\n59.111.24.0/21\n59.111.240.0/22\n59.111.244.0/24\n59.111.248.0/21\n59.111.32.0/24\n59.111.35.0/24\n59.111.36.0/24\n59.111.40.0/21\n59.111.64.0/19\n59.111.96.0/21\n59.151.0.0/17\n59.152.36.0/24\n59.152.38.0/23\n59.153.164.0/22\n59.153.168.0/24\n59.153.32.0/22\n59.153.4.0/23\n59.153.92.0/22\n59.172.0.0/14\n59.191.0.0/17\n59.252.0.0/16\n59.32.0.0/13\n59.40.0.0/15\n59.42.0.0/16\n59.44.0.0/14\n59.48.0.0/12\n59.64.0.0/12\n59.80.0.0/17\n59.81.102.0/23\n59.81.104.0/22\n59.81.40.0/23\n59.81.46.0/24\n59.81.64.0/23\n59.81.8.0/23\n59.81.82.0/23\n59.81.94.0/23\n59.82.0.0/17\n59.82.128.0/19\n59.83.192.0/19\n59.83.224.0/21\n59.83.232.0/22\n60.0.0.0/11\n60.160.0.0/11\n60.194.0.0/15\n60.200.0.0/24\n60.204.0.0/14\n60.208.0.0/12\n60.232.0.0/16\n60.235.0.0/16\n60.245.128.0/17\n60.247.0.0/16\n60.252.0.0/16\n60.253.128.0/17\n60.255.0.0/16\n60.63.0.0/16\n61.128.0.0/10\n61.232.0.0/14\n61.236.112.0/21\n61.236.248.0/24\n61.236.251.0/24\n61.236.80.0/20\n61.236.96.0/20\n61.237.0.0/16\n61.240.0.0/16\n61.241.0.0/17\n61.241.128.0/18\n61.241.192.0/19\n61.242.0.0/15\n61.28.108.0/24\n61.28.112.0/20\n61.28.20.0/24\n61.28.22.0/24\n61.28.49.0/24\n61.29.128.0/18\n61.4.80.0/23\n61.47.128.0/18\n61.48.0.0/13\n61.87.192.0/18\n62.234.0.0/16\n62.72.171.0/24\n63.140.0.0/24\n63.140.3.0/24\n66.102.240.0/21\n66.102.248.0/22\n66.102.252.0/24\n66.102.254.0/23\n68.79.0.0/18\n69.163.104.0/24\n69.163.106.0/24\n69.163.123.0/24\n69.230.192.0/18\n69.231.128.0/18\n69.234.192.0/18\n69.235.128.0/18\n71.131.192.0/18\n71.132.0.0/18\n71.136.64.0/18\n71.137.0.0/18\n79.133.176.0/24\n8.128.32.0/19\n8.128.4.0/22\n8.128.64.0/19\n8.128.96.0/20\n8.129.0.0/16\n8.130.0.0/15\n8.132.0.0/14\n8.136.0.0/13\n8.144.0.0/14\n8.148.0.0/19\n8.148.128.0/17\n8.148.36.0/22\n8.148.41.0/24\n8.148.43.0/24\n8.148.64.0/18\n8.149.0.0/16\n8.150.0.0/20\n8.150.16.0/21\n8.150.64.0/23\n8.152.0.0/13\n8.160.0.0/15\n8.162.0.0/18\n8.162.64.0/19\n8.163.0.0/16\n8.164.0.0/14\n8.168.0.0/15\n8.25.82.0/24\n8.38.121.0/24\n8.45.176.0/24\n8.45.52.0/24\n8.48.85.0/24\n81.173.18.0/23\n81.173.20.0/22\n81.173.28.0/24\n81.68.0.0/14\n82.156.0.0/15\n82.38.7.0/24\n87.76.221.0/24\n87.76.222.0/24\n93.95.117.0/24\n94.191.0.0/17\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/rules/chnroute6",
    "content": "2001:250::/30\n2001:254::/31\n2001:256:100::/48\n2001:4510:1480::/41\n2001:4510:400::/40\n2001:4511:1480::/41\n2001:678:53c::/48\n2001:7fa:5::/48\n2001:c68::/32\n2001:cc0::/32\n2001:da8::/32\n2001:daa:1::/48\n2001:daa:2::/47\n2001:daa:4::/47\n2001:daa:6::/48\n2001:dc7::/32\n2001:dd8:1::/48\n2001:dd9::/48\n2001:df6:40::/48\n2400:1160::/32\n2400:3200::/32\n2400:5280:f803::/48\n2400:5a00::/32\n2400:5a60:100::/48\n2400:5a60:2::/48\n2400:6000::/32\n2400:6600::/32\n2400:6e60:1301::/48\n2400:7100::/32\n2400:73e0::/32\n2400:75aa::/32\n2400:7fc0:220::/44\n2400:7fc0:240::/44\n2400:7fc0:2a0::/44\n2400:7fc0:2c0::/44\n2400:7fc0:4000::/40\n2400:7fc0:4100::/48\n2400:7fc0:6000::/40\n2400:7fc0:8000::/36\n2400:7fc0::/40\n2400:7fc0:a000::/36\n2400:7fc0:bb00::/40\n2400:7fc0:c000::/36\n2400:8200::/32\n2400:89c0:1010::/44\n2400:89c0:1050::/46\n2400:89c0:1130::/44\n2400:89c0:1150::/48\n2400:89c0:2100::/48\n2400:89c0:2200::/48\n2400:89c0:3010::/44\n2400:89c0:6000::/48\n2400:89c0:6100::/48\n2400:8fc0:571::/48\n2400:9020:f010::/46\n2400:9380:8001::/48\n2400:9380:8003::/48\n2400:9380:8021::/48\n2400:9380:8040::/48\n2400:9380:8140::/48\n2400:9380:8201::/48\n2400:9380:8301::/48\n2400:9380:9001::/48\n2400:9380:9009::/48\n2400:9380:9020::/47\n2400:9380:9040::/48\n2400:9380:9050::/47\n2400:9380:9060::/48\n2400:9380:9071::/48\n2400:9380:9080::/47\n2400:9380:90b1::/48\n2400:9380:90b2::/47\n2400:9380:90b4::/46\n2400:9380:9121::/48\n2400:9380:9220::/47\n2400:9380:9240::/48\n2400:9380:9250::/47\n2400:9380:9260::/48\n2400:9380:9271::/48\n2400:9380:9280::/47\n2400:9380:92b1::/48\n2400:9380:92b2::/47\n2400:9380:92b4::/46\n2400:95e0::/48\n2400:9600:8800::/48\n2400:9620::/32\n2400:a860:1::/48\n2400:a860:2::/47\n2400:a860:4::/47\n2400:a860:6::/48\n2400:a980::/29\n2400:ae00:1981::/48\n2400:b200::/32\n2400:b600::/32\n2400:b700::/48\n2400:be00::/48\n2400:cb80:e2e::/47\n2400:cb80:e30::/44\n2400:cb80:e40::/44\n2400:da00::/32\n2400:dd00::/28\n2400:e680::/32\n2400:ee00::/32\n2400:f6e0::/32\n2400:f720::/32\n2400:fe00::/32\n2401:1160::/32\n2401:1200::/48\n2401:1320::/32\n2401:1d40::/32\n2401:2780::/32\n2401:2a00:f000::/43\n2401:2e00::/32\n2401:3480:2000::/48\n2401:3480:3000::/36\n2401:3480::/36\n2401:34a0::/31\n2401:3800::/32\n2401:3880::/32\n2401:3980::/32\n2401:3a80::/32\n2401:3b80::/32\n2401:3c80::/32\n2401:3d80::/32\n2401:3e80::/32\n2401:3f80::/32\n2401:4180::/32\n2401:4280::/32\n2401:4380::/32\n2401:4480::/32\n2401:4580::/32\n2401:4680::/32\n2401:4780::/32\n2401:4880::/32\n2401:4a80::/32\n2401:5560:1000::/48\n2401:5c20:10::/48\n2401:70e0::/32\n2401:71c0::/48\n2401:7660::/48\n2401:7700::/32\n2401:7d40::/32\n2401:7e00::/32\n2401:800::/32\n2401:8be0::/48\n2401:8d00:12::/48\n2401:8d00:3::/48\n2401:8d00:4::/48\n2401:8d00:7::/48\n2401:8d00:8::/47\n2401:8d00::/47\n2401:8d00:b::/48\n2401:8d00:c::/48\n2401:8d00:f::/48\n2401:9a00:10::/46\n2401:9a00::/44\n2401:a140:1::/48\n2401:b180::/32\n2401:b400:11::/48\n2401:b400:14::/48\n2401:b400:16::/47\n2401:b400:20::/47\n2401:b400:8::/47\n2401:b400::/45\n2401:b680::/32\n2401:be00::/32\n2401:c020:14::/48\n2401:c020:6::/48\n2401:c020:8::/47\n2401:ca00::/32\n2401:cb80::/32\n2401:cc00::/32\n2401:ce00::/32\n2401:d0e0:3::/48\n2401:d180:10::/47\n2401:d180:111::/48\n2401:d180:2120::/48\n2401:d180::/46\n2401:d780::/32\n2401:d920::/48\n2401:de00::/32\n2401:ec00::/32\n2401:f860:100::/40\n2401:f860:85::/48\n2401:f860:87::/48\n2401:f860:88::/47\n2401:f860:90::/46\n2401:f860:94::/48\n2401:f860:96::/47\n2401:fa00:40::/43\n2402:1440::/32\n2402:18a0::/32\n2402:2000::/32\n2402:2620::/48\n2402:2e60::/39\n2402:34e0::/32\n2402:36e0::/44\n2402:3c00::/32\n2402:3f80:1400::/40\n2402:4440:9000::/39\n2402:4440:9200::/48\n2402:4440:9400::/48\n2402:4440:9600::/48\n2402:4440:9800::/48\n2402:4440:9810::/48\n2402:4440:9900::/48\n2402:4440:9a00::/48\n2402:4440:9b00::/48\n2402:4440:9c00::/48\n2402:4440:9d00::/48\n2402:4440:9e00::/48\n2402:4440:a000::/39\n2402:4440:a800::/46\n2402:4440:a810::/46\n2402:4b80::/32\n2402:4e00::/32\n2402:5e40::/32\n2402:5ec0::/32\n2402:6e80::/32\n2402:6f40:2::/48\n2402:6f40::/48\n2402:6fc0::/48\n2402:7040::/32\n2402:7d80:240::/48\n2402:7d80:8888::/48\n2402:7d80::/48\n2402:840:d000::/46\n2402:840:e000::/46\n2402:840:f000::/38\n2402:8bc0::/32\n2402:8cc0:200::/40\n2402:8cc0::/40\n2402:92c0::/48\n2402:93c0:100::/48\n2402:93c0:20::/48\n2402:93c0::/48\n2402:9a80::/32\n2402:a200::/32\n2402:b8c0:106::/48\n2402:b8c0:186::/48\n2402:b8c0:6::/48\n2402:b8c0:86::/48\n2402:c60::/48\n2402:d340::/32\n2402:db40:5100::/48\n2402:db40:5f00::/46\n2402:dfc0:50::/44\n2402:dfc0::/44\n2402:e480::/32\n2402:e740::/32\n2402:e7c0::/32\n2402:e880::/48\n2402:ef40::/32\n2402:f000::/32\n2402:f140:ff00::/46\n2402:f140:ff04::/48\n2402:f140:ff10::/46\n2402:f140:ff14::/48\n2402:f8c0::/42\n2403:1b80::/48\n2403:1ec0:1200::/48\n2403:1ec0:1400::/48\n2403:1ec0:1600::/48\n2403:1ec0:1610::/48\n2403:2040::/48\n2403:2b40::/32\n2403:3140::/32\n2403:4280::/47\n2403:4300::/32\n2403:4c80::/48\n2403:5c80::/48\n2403:600::/32\n2403:6740::/48\n2403:6a00::/32\n2403:7580::/32\n2403:8080:101::/48\n2403:8c00::/32\n2403:9b00:2000::/48\n2403:9b00:2400::/48\n2403:9b00:6000::/48\n2403:a100::/48\n2403:a140:100::/40\n2403:a140:10::/48\n2403:a200::/32\n2403:ac00::/32\n2403:b400::/32\n2403:c80::/32\n2403:c980::/32\n2403:d400::/32\n2403:e7c0:3::/48\n2403:f4c0::/48\n2403:ffc0:1100::/40\n2403:ffc0:1200::/39\n2404:1c40:503::/48\n2404:1c80::/32\n2404:2280:105::/48\n2404:2280:106::/47\n2404:2280:109::/48\n2404:2280:10a::/47\n2404:2280:10d::/48\n2404:2280:10f::/48\n2404:2280:112::/47\n2404:2280:115::/48\n2404:2280:116::/47\n2404:2280:11a::/47\n2404:2280:11c::/46\n2404:2280:123::/48\n2404:2280:125::/48\n2404:2280:126::/47\n2404:2280:128::/46\n2404:2280:12e::/48\n2404:2280:130::/48\n2404:2280:134::/48\n2404:2280:136::/47\n2404:2280:138::/48\n2404:2280:13b::/48\n2404:2280:13c::/47\n2404:2280:142::/48\n2404:2280:147::/48\n2404:2280:14f::/48\n2404:2280:150::/48\n2404:2280:154::/46\n2404:2280:159::/48\n2404:2280:15d::/48\n2404:2280:15e::/47\n2404:2280:160::/48\n2404:2280:170::/48\n2404:2280:177::/48\n2404:2280:17a::/47\n2404:2280:17c::/46\n2404:2280:180::/47\n2404:2280:183::/48\n2404:2280:187::/48\n2404:2280:18a::/47\n2404:2280:18c::/46\n2404:2280:190::/48\n2404:2280:193::/48\n2404:2280:196::/48\n2404:2280:198::/45\n2404:2280:1a4::/46\n2404:2280:1a8::/47\n2404:2280:1b0::/48\n2404:2280:1b2::/48\n2404:2280:1b4::/46\n2404:2280:1b8::/47\n2404:2280:1ba::/48\n2404:2280:1bf::/48\n2404:2280:1c1::/48\n2404:2280:1c2::/47\n2404:2280:1c4::/46\n2404:2280:1c8::/48\n2404:2280:1cb::/48\n2404:2280:1cc::/48\n2404:2280:1cf::/48\n2404:2280:1d0::/47\n2404:2280:1d3::/48\n2404:2280:1d4::/48\n2404:2280:1d6::/47\n2404:2280:1d8::/45\n2404:2280:1e0::/45\n2404:2280:1e8::/46\n2404:2280:1ec::/47\n2404:2280:1ee::/48\n2404:2280:1f0::/45\n2404:2280:1f8::/46\n2404:2280:201::/48\n2404:2280:202::/47\n2404:2280:204::/46\n2404:2280:208::/46\n2404:2280:20c::/47\n2404:2280:20e::/48\n2404:2280:210::/46\n2404:2280:214::/48\n2404:2280:217::/48\n2404:2280:218::/46\n2404:2280:21d::/48\n2404:2280:21e::/48\n2404:2280:221::/48\n2404:2280:259::/48\n2404:2280:25a::/47\n2404:2280:25c::/48\n2404:2280:265::/48\n2404:2280:266::/47\n2404:2280:268::/45\n2404:2280:270::/45\n2404:2280:278::/47\n2404:2280:27b::/48\n2404:2280:27c::/46\n2404:2280:282::/47\n2404:2280:284::/47\n2404:2280:288::/46\n2404:2280:28c::/48\n2404:2280:291::/48\n2404:2280:292::/48\n2404:2280:296::/47\n2404:2280:298::/46\n2404:2280:29c::/47\n2404:2280:2a0::/47\n2404:2280:2a4::/46\n2404:2280:2a9::/48\n2404:2280:2aa::/48\n2404:2280:2ad::/48\n2404:2280:2ae::/47\n2404:2280:2b1::/48\n2404:2280:2b2::/47\n2404:2280:2b5::/48\n2404:2280:2b6::/47\n2404:2280:2b8::/47\n2404:2280:2ba::/48\n2404:2280:2bc::/46\n2404:2280:2c2::/47\n2404:2280:2c5::/48\n2404:2280:2c9::/48\n2404:2280:2ca::/47\n2404:2280:2cd::/48\n2404:2280:2cf::/48\n2404:3700::/48\n2404:4dc0::/32\n2404:6380:1000::/48\n2404:6380:8001::/48\n2404:6380::/48\n2404:6500:dcb3::/48\n2404:7180:a000::/48\n2404:7180:a010::/48\n2404:7180:aa00::/48\n2404:7180:aa10::/48\n2404:7180:b001::/48\n2404:7180:b002::/48\n2404:7180:b010::/48\n2404:7180:c001::/48\n2404:7180:c002::/48\n2404:7180:c011::/48\n2404:7180:c012::/48\n2404:7180:f000::/48\n2404:7180:f010::/48\n2404:7240::/33\n2404:7600::/32\n2404:7940::/32\n2404:8d02:28c8::/48\n2404:8d02:4881::/48\n2404:bc0:1::/48\n2404:bc0:4000::/43\n2404:bc0:4100::/43\n2404:bc0:4200::/43\n2404:bc0:4300::/44\n2404:bc0:4400::/43\n2404:bc0:4500::/43\n2404:bc0:4620::/44\n2404:bc0:4f00::/43\n2404:c2c0:240::/44\n2404:c2c0:280::/44\n2404:c2c0:2c0::/44\n2404:c2c0:4000::/40\n2404:c2c0:4100::/48\n2404:c2c0:501::/48\n2404:c2c0:6000::/40\n2404:c2c0:8000::/36\n2404:c2c0::/40\n2404:c2c0:bb00::/40\n2404:c2c0:c000::/36\n2404:c300::/32\n2404:c940::/48\n2404:e280::/47\n2404:e8c0::/32\n2404:f4c0:f000::/44\n2405:1480:1000::/48\n2405:1480:2000::/48\n2405:1480:3000::/47\n2405:1640:6::/48\n2405:3140:11::/48\n2405:3140:21::/48\n2405:3140:31::/48\n2405:68c0:21::/48\n2405:6940::/48\n2405:6c0:2::/48\n2405:6c0:4::/48\n2405:6f00:c101::/48\n2405:6f00:c102::/48\n2405:6f00:c170::/47\n2405:6f00:c602::/48\n2405:7040:6000::/47\n2405:78c0:6e00::/43\n2405:8280::/32\n2405:8a40::/32\n2405:a900:ffee::/48\n2405:a900:fffe::/48\n2405:ad00::/32\n2405:b7c0::/32\n2405:d900::/32\n2405:e000::/32\n2405:f940::/32\n2406:1080::/48\n2406:1e40:f012::/47\n2406:2700::/32\n2406:280::/32\n2406:3340::/32\n2406:3640:1::/48\n2406:4440:f000::/44\n2406:4d00::/48\n2406:52c0::/32\n2406:5340:6666::/48\n2406:5340:8888::/48\n2406:6100::/32\n2406:840:1000::/47\n2406:840:100::/47\n2406:840:103::/48\n2406:840:10::/45\n2406:840:110::/48\n2406:840:1800::/48\n2406:840:1::/48\n2406:840:20::/48\n2406:840:2380::/48\n2406:840:2600::/48\n2406:840:2800::/48\n2406:840:2880::/47\n2406:840:2::/48\n2406:840:2e0::/48\n2406:840:3800::/48\n2406:840:380::/48\n2406:840:3c1::/48\n2406:840:3c2::/48\n2406:840:3e0::/48\n2406:840:4100::/47\n2406:840:410::/47\n2406:840:412::/48\n2406:840:420::/48\n2406:840:42::/48\n2406:840:43c0::/47\n2406:840:43e0::/47\n2406:840:44::/48\n2406:840:46::/48\n2406:840:4800::/47\n2406:840:480::/48\n2406:840:4880::/47\n2406:840:5100::/47\n2406:840:540::/48\n2406:840:5800::/47\n2406:840:5860::/47\n2406:840:5880::/47\n2406:840:5c00::/47\n2406:840:600::/48\n2406:840:680::/48\n2406:840:6c1::/48\n2406:840:710::/48\n2406:840:78::/47\n2406:840:7::/48\n2406:840:800::/46\n2406:840:805::/48\n2406:840:806::/48\n2406:840:80::/47\n2406:840:8100::/40\n2406:840:840::/47\n2406:840:842::/48\n2406:840:860::/48\n2406:840:880::/47\n2406:840:882::/48\n2406:840:90::/48\n2406:840:9200::/40\n2406:840:9680::/44\n2406:840:9700::/40\n2406:840:9804::/46\n2406:840:981a::/48\n2406:840:981c::/46\n2406:840:9962::/47\n2406:840:9966::/48\n2406:840:996c::/48\n2406:840:9970::/44\n2406:840:a31::/48\n2406:840:c02::/48\n2406:840:c60::/48\n2406:840:cb8::/48\n2406:840:cc2::/48\n2406:840:e072::/48\n2406:840:e080::/44\n2406:840:e0cf::/48\n2406:840:e10f::/48\n2406:840:e14f::/48\n2406:840:e260::/48\n2406:840:e280::/44\n2406:840:e301::/48\n2406:840:e302::/48\n2406:840:e304::/48\n2406:840:e306::/48\n2406:840:e330::/44\n2406:840:e600::/44\n2406:840:e620::/47\n2406:840:e80f::/48\n2406:840:eb00::/46\n2406:840:eb04::/47\n2406:840:eb07::/48\n2406:840:eb08::/48\n2406:840:eb0b::/48\n2406:840:eb0f::/48\n2406:840:eb80::/42\n2406:840:ee40::/47\n2406:840:ee44::/48\n2406:840:ee4b::/48\n2406:840:ee4d::/48\n2406:840:f0a1::/48\n2406:840:f0aa::/48\n2406:840:f380::/44\n2406:840:f401::/48\n2406:840:f402::/48\n2406:840:f44f::/48\n2406:840:f680::/44\n2406:840:f889::/48\n2406:840:fa01::/48\n2406:840:fa40::/48\n2406:840:fa60::/44\n2406:840:fc10::/44\n2406:840:fc20::/43\n2406:840:fc40::/42\n2406:840:fc90::/44\n2406:840:fca0::/43\n2406:840:fcd0::/48\n2406:840:fd40::/43\n2406:840:fd60::/48\n2406:840:fd67::/48\n2406:840:fd70::/48\n2406:840:fd77::/48\n2406:840:fd80::/48\n2406:840:fd87::/48\n2406:840:fd90::/44\n2406:840:fda0::/43\n2406:840:fdc0::/44\n2406:840:fe50::/47\n2406:840:fe73::/48\n2406:840:fe90::/46\n2406:840:fe94::/48\n2406:840:fe96::/47\n2406:840:fe98::/46\n2406:840:fe9d::/48\n2406:840:fe9e::/48\n2406:840:fea2::/47\n2406:840:fea4::/46\n2406:840:fea8::/48\n2406:840:feaa::/47\n2406:840:feac::/46\n2406:840:fec0::/48\n2406:840:fec2::/47\n2406:840:fec4::/48\n2406:840:feca::/47\n2406:840:fece::/47\n2406:840:fed1::/48\n2406:840:fed3::/48\n2406:840:fed4::/48\n2406:840:fed8::/48\n2406:840:fedb::/48\n2406:840:fedc::/48\n2406:840:feed::/48\n2406:840:fef2::/47\n2406:840:fef4::/46\n2406:840:fef8::/45\n2406:8880::/48\n2406:b640:100::/48\n2406:b640:4100::/48\n2406:cac0:200::/40\n2406:cac0::/40\n2406:cf00:1000::/43\n2406:cf00::/48\n2406:d440:100::/43\n2406:d440:200::/43\n2406:d440:300::/43\n2406:d440:ff00::/48\n2406:d440:ffff::/48\n2406:e3c0::/32\n2406:e500::/33\n2407:23c0::/48\n2407:2840::/48\n2407:37c0::/32\n2407:4980::/32\n2407:5380::/32\n2407:6c40:1100::/48\n2407:6c40:1210::/48\n2407:6c40:1500::/48\n2407:6c40:1600::/40\n2407:8f40:2::/48\n2407:9f00::/32\n2407:ad80::/32\n2407:ae80::/32\n2407:b380:8000::/48\n2407:bc00::/32\n2407:c080:4000::/37\n2407:c080:5000::/37\n2407:c080:6000::/36\n2407:c080:8000::/36\n2407:c080::/35\n2407:d9c0::/32\n2408:4000::/22\n2408:8000:1000::/36\n2408:8000:2000::/35\n2408:8000:2::/47\n2408:8000:4000::/34\n2408:8000:8000::/33\n2408:8000::/48\n2408:8001::/32\n2408:8020::/30\n2408:8024::/31\n2408:8026::/32\n2408:802a:8000::/33\n2408:802c::/32\n2408:803e::/32\n2408:8056::/32\n2408:805c::/30\n2408:8060::/33\n2408:80c2::/33\n2408:80c5::/33\n2408:80ca:8000::/34\n2408:80ca::/33\n2408:80da:8000::/34\n2408:80da::/33\n2408:80e0:4000::/34\n2408:80e0:8000::/33\n2408:80e2::/33\n2408:80e9:4000::/34\n2408:80ea:4000::/34\n2408:80ea:8000::/33\n2408:80f0:4000::/34\n2408:80f0:8000::/33\n2408:80f1:100::/43\n2408:80f1:120::/44\n2408:80f1:160::/43\n2408:80f1:180::/43\n2408:80f1:1b0::/44\n2408:80f1:1c0::/43\n2408:80f1:1e0::/44\n2408:80f1:200::/40\n2408:80f1:40::/43\n2408:80f1:70::/44\n2408:80f1:80::/41\n2408:80f1::/42\n2408:80f5:4000::/34\n2408:80f9:4000::/34\n2408:80fa:4000::/34\n2408:80fa:8000::/33\n2408:8120:1::/48\n2408:8120:2::/48\n2408:8120:7000::/36\n2408:8140:2000::/48\n2408:815f:e000::/35\n2408:8181:6000::/40\n2408:8181:8000::/40\n2408:8181::/40\n2408:8181:a000::/40\n2408:8181:a220::/44\n2408:8181:e000::/40\n2408:8182:6000::/40\n2408:8182:c000::/40\n2408:8183:4000::/40\n2408:8183:8000::/40\n2408:81a2:2000::/35\n2408:81a2:4000::/35\n2408:81a3:6000::/35\n2408:81a3:c800::/48\n2408:81a3:ca66::/48\n2408:8206::/31\n2408:8208::/29\n2408:8210::/30\n2408:8214::/31\n2408:821a::/31\n2408:8220::/31\n2408:8226::/32\n2408:822a::/31\n2408:822e::/31\n2408:8230::/29\n2408:8238::/31\n2408:823c::/31\n2408:8240::/32\n2408:8244::/30\n2408:8248::/30\n2408:824c::/32\n2408:824e::/31\n2408:8250::/30\n2408:8254::/32\n2408:8256::/31\n2408:8258::/30\n2408:825c::/31\n2408:825f::/32\n2408:8260::/32\n2408:8262::/31\n2408:8264::/31\n2408:8266::/32\n2408:826a::/32\n2408:826c::/30\n2408:8270::/32\n2408:8274::/30\n2408:8278::/31\n2408:827a::/32\n2408:8306::/31\n2408:8308::/30\n2408:8310::/30\n2408:832a::/32\n2408:832e::/31\n2408:8330::/30\n2408:8338::/32\n2408:8340::/32\n2408:8344::/30\n2408:8348::/30\n2408:834e::/31\n2408:8350::/30\n2408:8354::/32\n2408:8356::/31\n2408:8358::/30\n2408:8360::/30\n2408:8364::/31\n2408:836c::/30\n2408:8374::/30\n2408:8378::/31\n2408:837a::/32\n2408:8406:100::/41\n2408:8406:180::/42\n2408:8406:18c0::/42\n2408:8406:1900::/41\n2408:8406:1980::/42\n2408:8406:24c0::/42\n2408:8406:2500::/41\n2408:8406:2580::/42\n2408:8406:30c0::/42\n2408:8406:3100::/41\n2408:8406:3180::/42\n2408:8406:3cc0::/42\n2408:8406:3d00::/41\n2408:8406:3d80::/42\n2408:8406:48c0::/42\n2408:8406:4900::/41\n2408:8406:4980::/42\n2408:8406:54c0::/42\n2408:8406:5500::/41\n2408:8406:5580::/42\n2408:8406:60c0::/42\n2408:8406:6100::/41\n2408:8406:6180::/42\n2408:8406:6cc0::/42\n2408:8406:6d00::/41\n2408:8406:6d80::/42\n2408:8406:78c0::/42\n2408:8406:7900::/41\n2408:8406:7980::/42\n2408:8406:84c0::/42\n2408:8406:8500::/41\n2408:8406:8580::/42\n2408:8406:90c0::/42\n2408:8406:9100::/41\n2408:8406:9180::/42\n2408:8406:9cc0::/42\n2408:8406:9d00::/41\n2408:8406:9d80::/42\n2408:8406:a8c0::/42\n2408:8406:a900::/41\n2408:8406:a980::/42\n2408:8406:b4c0::/42\n2408:8406:b500::/41\n2408:8406:b580::/42\n2408:8406:c0::/42\n2408:8406:cc0::/42\n2408:8406:d00::/41\n2408:8406:d80::/42\n2408:8407:500::/42\n2408:8409:100::/41\n2408:8409:1800::/40\n2408:8409:1900::/41\n2408:8409:19a0::/43\n2408:8409:19c0::/42\n2408:8409:1a00::/42\n2408:8409:1a0::/43\n2408:8409:1c0::/42\n2408:8409:200::/42\n2408:8409:2400::/40\n2408:8409:2500::/41\n2408:8409:25a0::/43\n2408:8409:25c0::/42\n2408:8409:2600::/42\n2408:8409:3000::/40\n2408:8409:3100::/41\n2408:8409:31a0::/43\n2408:8409:31c0::/42\n2408:8409:3200::/42\n2408:8409:3c00::/40\n2408:8409:3d00::/41\n2408:8409:3da0::/43\n2408:8409:3dc0::/42\n2408:8409:3e00::/42\n2408:8409:4800::/40\n2408:8409:4900::/41\n2408:8409:49a0::/43\n2408:8409:49c0::/42\n2408:8409:4a00::/42\n2408:8409:5400::/40\n2408:8409:5500::/41\n2408:8409:55a0::/43\n2408:8409:55c0::/42\n2408:8409:5600::/42\n2408:8409:6000::/40\n2408:8409:6100::/41\n2408:8409:61a0::/43\n2408:8409:61c0::/42\n2408:8409:6200::/42\n2408:8409:6c00::/40\n2408:8409:6d00::/41\n2408:8409:6da0::/43\n2408:8409:6dc0::/42\n2408:8409:6e00::/42\n2408:8409:7800::/40\n2408:8409:7900::/41\n2408:8409:79a0::/43\n2408:8409:79c0::/42\n2408:8409:7a00::/42\n2408:8409:8400::/40\n2408:8409:8500::/41\n2408:8409:85a0::/43\n2408:8409:85c0::/42\n2408:8409:8600::/42\n2408:8409:9000::/40\n2408:8409:9100::/41\n2408:8409:91a0::/43\n2408:8409:91c0::/42\n2408:8409:9200::/42\n2408:8409:9c00::/40\n2408:8409:9d00::/41\n2408:8409:9da0::/43\n2408:8409:9dc0::/42\n2408:8409:9e00::/42\n2408:8409::/40\n2408:8409:a800::/40\n2408:8409:a900::/41\n2408:8409:a9a0::/43\n2408:8409:a9c0::/42\n2408:8409:aa00::/42\n2408:8409:b400::/40\n2408:8409:b500::/41\n2408:8409:b5a0::/43\n2408:8409:b5c0::/42\n2408:8409:b600::/42\n2408:8409:c00::/40\n2408:8409:d00::/41\n2408:8409:da0::/43\n2408:8409:dc0::/42\n2408:8409:e00::/42\n2408:840c:1a00::/40\n2408:840c:1c00::/40\n2408:840c:200::/40\n2408:840c:2700::/40\n2408:840c:2900::/40\n2408:840c:3400::/40\n2408:840c:3600::/40\n2408:840c:4e00::/40\n2408:840c:5000::/40\n2408:840c:5b00::/40\n2408:840c:5d00::/40\n2408:840c:6800::/40\n2408:840c:6a00::/40\n2408:840c:7500::/40\n2408:840c:7700::/40\n2408:840c:8200::/40\n2408:840c:8400::/40\n2408:840c:8f00::/40\n2408:840c:9100::/40\n2408:840c:9c00::/40\n2408:840c:9e00::/40\n2408:840c::/40\n2408:840c:a900::/40\n2408:840c:ab00::/40\n2408:840c:b600::/40\n2408:840c:b800::/40\n2408:840c:c300::/40\n2408:840c:c500::/40\n2408:840c:d000::/40\n2408:840c:d00::/40\n2408:840c:d200::/40\n2408:840c:dd00::/40\n2408:840c:de00::/40\n2408:840c:f00::/40\n2408:840d:1100::/42\n2408:840d:1140::/43\n2408:840d:1300::/42\n2408:840d:1a00::/42\n2408:840d:1c00::/42\n2408:840d:1e00::/42\n2408:840d:1e40::/43\n2408:840d:2000::/42\n2408:840d:200::/42\n2408:840d:2700::/42\n2408:840d:2900::/42\n2408:840d:2b00::/42\n2408:840d:2b40::/43\n2408:840d:2d00::/42\n2408:840d:3400::/42\n2408:840d:3600::/42\n2408:840d:3800::/42\n2408:840d:3840::/43\n2408:840d:3a00::/42\n2408:840d:400::/42\n2408:840d:440::/43\n2408:840d:4e00::/42\n2408:840d:5000::/42\n2408:840d:5200::/42\n2408:840d:5240::/43\n2408:840d:5400::/42\n2408:840d:5b00::/42\n2408:840d:5d00::/42\n2408:840d:5f00::/42\n2408:840d:5f40::/43\n2408:840d:600::/42\n2408:840d:6100::/42\n2408:840d:6800::/42\n2408:840d:6a00::/42\n2408:840d:6c00::/42\n2408:840d:6c40::/43\n2408:840d:6e00::/42\n2408:840d:7500::/42\n2408:840d:7700::/42\n2408:840d:7900::/42\n2408:840d:7940::/43\n2408:840d:7b00::/42\n2408:840d:8200::/42\n2408:840d:8400::/42\n2408:840d:8600::/42\n2408:840d:8640::/43\n2408:840d:8800::/42\n2408:840d:8f00::/42\n2408:840d:9100::/42\n2408:840d:9300::/42\n2408:840d:9340::/43\n2408:840d:9500::/42\n2408:840d:9c00::/42\n2408:840d:9e00::/42\n2408:840d::/42\n2408:840d:a000::/42\n2408:840d:a040::/43\n2408:840d:a200::/42\n2408:840d:a900::/42\n2408:840d:ab00::/42\n2408:840d:ad00::/42\n2408:840d:ad40::/43\n2408:840d:af00::/42\n2408:840d:b600::/42\n2408:840d:b800::/42\n2408:840d:ba00::/42\n2408:840d:ba40::/43\n2408:840d:bc00::/42\n2408:840d:c300::/42\n2408:840d:c500::/42\n2408:840d:c700::/42\n2408:840d:c740::/43\n2408:840d:c900::/42\n2408:840d:d000::/42\n2408:840d:d00::/42\n2408:840d:d200::/42\n2408:840d:d400::/42\n2408:840d:d440::/43\n2408:840d:d600::/42\n2408:840d:dd00::/42\n2408:840d:de00::/42\n2408:840d:f00::/42\n2408:840e:dd00::/40\n2408:840e:de00::/40\n2408:840f:1e0::/46\n2408:840f:1e4::/47\n2408:8410::/30\n2408:8414::/31\n2408:8417::/32\n2408:8418::/32\n2408:841a::/31\n2408:841c::/31\n2408:841e::/32\n2408:8420::/31\n2408:8422::/32\n2408:8426::/31\n2408:842a::/31\n2408:842c::/32\n2408:842e::/32\n2408:8430::/31\n2408:8434::/30\n2408:8438::/31\n2408:843c::/30\n2408:8440::/31\n2408:8444::/30\n2408:8448::/32\n2408:844b::/32\n2408:844c::/30\n2408:8452::/31\n2408:8454::/32\n2408:8456::/31\n2408:8458::/30\n2408:845c::/31\n2408:8460::/30\n2408:8464::/31\n2408:8466::/32\n2408:8469::/32\n2408:846a::/31\n2408:846c::/30\n2408:8470::/31\n2408:8474::/30\n2408:8478::/31\n2408:847a::/32\n2408:84e1::/32\n2408:84e2::/31\n2408:84e4::/30\n2408:84e9::/32\n2408:84eb::/32\n2408:84ec::/30\n2408:84f0::/28\n2408:856c::/31\n2408:8606::/31\n2408:8608::/29\n2408:8610::/30\n2408:8614::/31\n2408:861a::/31\n2408:861c::/32\n2408:8620::/31\n2408:8624::/31\n2408:8626::/32\n2408:862a::/31\n2408:862d::/32\n2408:862e::/31\n2408:8630::/29\n2408:8638::/31\n2408:863c::/31\n2408:8640::/32\n2408:8642::/32\n2408:8644::/30\n2408:8648::/31\n2408:864c::/32\n2408:864e::/31\n2408:8650::/30\n2408:8656::/31\n2408:8658::/30\n2408:865c::/31\n2408:865f::/32\n2408:8660::/32\n2408:8662::/31\n2408:8664::/31\n2408:8666::/32\n2408:866a::/31\n2408:866c::/30\n2408:8670::/32\n2408:8674::/30\n2408:8678::/31\n2408:867a::/32\n2408:8706::/31\n2408:8708::/29\n2408:8710::/30\n2408:8719::/32\n2408:871a::/31\n2408:8720::/30\n2408:8726::/32\n2408:872b::/32\n2408:872f::/32\n2408:8730::/30\n2408:8734::/31\n2408:8736::/32\n2408:8738::/32\n2408:873c::/31\n2408:8740::/32\n2408:8742::/32\n2408:8744::/30\n2408:8748::/29\n2408:8752::/32\n2408:8756::/31\n2408:8758::/30\n2408:875c::/32\n2408:8760::/32\n2408:8762::/31\n2408:8764::/31\n2408:8766::/32\n2408:8768::/32\n2408:876a::/32\n2408:876c::/30\n2408:8770::/32\n2408:8772::/31\n2408:8774::/32\n2408:8776::/31\n2408:8778::/31\n2408:877a::/32\n2408:877c::/30\n2408:8806:40::/43\n2408:8806::/42\n2408:880c::/30\n2408:8810::/30\n2408:8814::/31\n2408:8818::/31\n2408:882c::/32\n2408:883a::/32\n2408:8844::/43\n2408:8856::/31\n2408:8858::/30\n2408:8862::/31\n2408:8864::/31\n2408:8866::/32\n2408:886e::/31\n2408:8872::/32\n2408:8878::/31\n2408:887e::/32\n2408:8906:20::/44\n2408:8907:9000::/44\n2408:890c::/31\n2408:8912::/31\n2408:8914::/30\n2408:891c::/32\n2408:8920::/32\n2408:8924::/32\n2408:892c::/32\n2408:8936::/32\n2408:893a::/32\n2408:8940::/32\n2408:8948::/32\n2408:894c::/32\n2408:894e::/32\n2408:8956::/31\n2408:8958::/30\n2408:8962::/31\n2408:8964::/31\n2408:8966::/32\n2408:896c::/32\n2408:896e::/31\n2408:8972::/32\n2408:8978::/30\n2408:897e::/32\n2408:8a00:c000::/36\n2408:8a00:d000::/37\n2408:8a00:e000::/35\n2408:8a01::/36\n2408:8a02:b110::/44\n2408:8a02:b120::/44\n2408:8a04:8000::/36\n2408:8a04:e000::/40\n2408:8a05:6000::/35\n2408:8a05:8000::/36\n2408:8a06:100::/47\n2408:8a06::/47\n2408:8a21:4000::/35\n2408:8a22:9200::/39\n2408:8a22:9400::/38\n2408:8a22:9800::/40\n2408:8a22:9a00::/39\n2408:8a22:9c00::/38\n2408:8a22:a000::/37\n2408:8a23:4000::/34\n2408:8a24:4000::/34\n2408:8a26:c000::/34\n2408:8a27:4000::/35\n2409:2000::/31\n2409:2002::/32\n2409:2003::/47\n2409:27fa::/48\n2409:27fa:f000::/48\n2409:27fb::/48\n2409:27fc::/48\n2409:27fe::/33\n2409:8000::/20\n240a:2000::/40\n240a:2001:1000::/36\n240a:2001:100::/40\n240a:4002:1b00::/40\n240a:4010:8000::/33\n240a:4020:83a::/48\n240a:4020:883a::/48\n240a:4021:83a::/48\n240a:4021:883a::/48\n240a:4080:8000::/35\n240a:4084:2000::/35\n240a:4088:a000::/35\n240a:408c:2000::/35\n240a:4090:1000::/39\n240a:4090:1200::/40\n240a:4090:120::/48\n240a:4090:2010::/48\n240a:4090:2041::/48\n240a:4090:2061::/48\n240a:4090:250::/48\n240a:4090:3000::/39\n240a:4090:3200::/40\n240a:4090:5000::/39\n240a:4090:50::/48\n240a:4090:5200::/40\n240a:4090:7000::/39\n240a:4090:7200::/40\n240a:4090:8000::/34\n240a:4093::/35\n240a:4094:2000::/35\n240a:409c:2000::/35\n240a:40a4:2000::/35\n240a:40a8:8000::/35\n240a:40ac:2000::/35\n240a:40b0:283a::/48\n240a:40b0:483a::/48\n240a:40b0:683a::/48\n240a:40b0:83a::/48\n240a:40c0:8000::/43\n240a:40c0:8200::/48\n240a:40c0:8240::/48\n240a:40c0:a000::/43\n240a:40c0:c000::/43\n240a:40c0:e000::/43\n240a:40c1:2000::/43\n240a:40c1:4000::/43\n240a:40c1:6000::/43\n240a:40c1:8000::/43\n240a:40c1::/43\n240a:40c1:a000::/43\n240a:40c1:c000::/43\n240a:40c1:e000::/43\n240a:40c2:2000::/43\n240a:40c2:4000::/43\n240a:40c2:6000::/43\n240a:40c2:8000::/43\n240a:40c2::/43\n240a:40c2:a000::/43\n240a:40c2:c000::/43\n240a:40c2:e000::/43\n240a:40c3:2000::/43\n240a:40c3:4000::/43\n240a:40c3:6000::/43\n240a:40c3:8000::/43\n240a:40c3::/43\n240a:40c3:a000::/43\n240a:40c3:c000::/43\n240a:40c3:c200::/48\n240a:40c3:c240::/48\n240a:40c3:e000::/43\n240a:40c4:2000::/43\n240a:40c4:4000::/43\n240a:40c4::/43\n240a:4172::/31\n240a:4180::/31\n240a:41b0::/34\n240a:41b8:8800::/40\n240a:41b8:a000::/40\n240a:41b8:d400::/40\n240a:41b8:e400::/40\n240a:41d6::/31\n240a:41f2::/31\n240a:4208::/30\n240a:4224:9000::/44\n240a:4224:a000::/44\n240a:4224:c000::/44\n240a:4224:d000::/44\n240a:4224:e000::/44\n240a:4225:1000::/44\n240a:4225:3000::/44\n240a:4230::/31\n240a:4242::/31\n240a:4280::/26\n240a:42c0::/27\n240a:42e0::/28\n240a:42f0::/29\n240a:42f8::/30\n240a:6001::/48\n240a:a000::/20\n240a:c000::/20\n240b:e001::/32\n240b:e002::/31\n240b:e004::/30\n240b:e008::/29\n240b:e010::/32\n240c:4000::/22\n240c:c000::/20\n240d:4000::/21\n240e::/20\n2602:f46d:6::/48\n2602:f92a:a46d::/48\n2602:f92a:a46f::/48\n2602:f92a:a474::/48\n2602:f9ba:10c::/48\n2602:f9ba:a8::/48\n2602:f9f6:400::/47\n2602:f9f6::/48\n2602:fbda:600::/48\n2602:fbda:610::/48\n2602:fbda:620::/48\n2602:fbda:660::/44\n2605:9d80:8001::/48\n2605:9d80:8011::/48\n2605:9d80:8021::/48\n2605:9d80:8031::/48\n2605:9d80:8041::/48\n2605:9d80:8081::/48\n2605:9d80:9003::/48\n2605:9d80:9013::/48\n2605:9d80:9023::/48\n2605:9d80:9033::/48\n2605:9d80:9042::/48\n2605:9d80:9071::/48\n2605:9d80:9092::/48\n2620:57:4004::/48\n2804:1e48:9001::/48\n2804:1e48:9002::/48\n2a04:3e00:1002::/48\n2a04:f580:8010::/47\n2a04:f580:8090::/48\n2a04:f580:8210::/47\n2a04:f580:8290::/48\n2a04:f580:9010::/48\n2a04:f580:9012::/47\n2a04:f580:9020::/48\n2a04:f580:9030::/48\n2a04:f580:9040::/48\n2a04:f580:9050::/48\n2a04:f580:9060::/48\n2a04:f580:9070::/48\n2a04:f580:9080::/48\n2a04:f580:9210::/48\n2a04:f580:9212::/47\n2a04:f580:9220::/48\n2a04:f580:9230::/48\n2a04:f580:9240::/48\n2a04:f580:9250::/48\n2a04:f580:9260::/48\n2a04:f580:9270::/48\n2a04:f580:9280::/48\n2a04:f580:9290::/48\n2a05:1085::/32\n2a05:1087::/32\n2a06:3600:e000::/40\n2a06:3600:fb00::/40\n2a06:3600:fc00::/38\n2a06:3605::/32\n2a06:3606::/31\n2a06:9f81:4600::/43\n2a06:9f81:4620::/44\n2a06:9f81:4640::/43\n2a06:a005:260::/43\n2a06:a005:280::/43\n2a06:a005:2a0::/44\n2a06:de00:de00::/48\n2a0a:d680:8100::/47\n2a0a:d680:a31::/48\n2a0a:d681:e000::/40\n2a0a:d681:fb00::/40\n2a0a:d681:fc00::/38\n2a0b:4340:90::/48\n2a0b:4340:97::/48\n2a0c:b641:570::/47\n2a0d:c7c7:400::/38\n2a0e:aa06:400::/44\n2a0e:aa06:440::/48\n2a0e:aa06:490::/44\n2a0e:aa07:e025::/48\n2a0e:aa07:e200::/44\n2a0e:b107:14a0::/44\n2a0e:b107:1522::/48\n2a0e:b107:2440::/44\n2a0e:b107:740::/44\n2a0e:b107:da0::/44\n2a0f:1cc5:110::/44\n2a0f:1cc5:130::/44\n2a0f:1cc5:140::/44\n2a0f:1cc5:14::/46\n2a0f:1cc5:1600::/44\n2a0f:1cc5:1c00::/47\n2a0f:1cc5:1c02::/48\n2a0f:1cc5:1c30::/48\n2a0f:1cc5:1cc0::/48\n2a0f:1cc5:1d10::/47\n2a0f:1cc5:1d14::/48\n2a0f:1cc5:1f::/48\n2a0f:1cc5:2510::/44\n2a0f:1cc5:2520::/44\n2a0f:1cc5:2600::/40\n2a0f:1cc5:2d01::/48\n2a0f:1cc5:2d03::/48\n2a0f:1cc5:600::/47\n2a0f:1cc5:603::/48\n2a0f:1cc5:645::/48\n2a0f:1cc5:661::/48\n2a0f:1cc5:662::/48\n2a0f:1cc5:690::/48\n2a0f:1cc5:6a0::/48\n2a0f:1cc5:f00::/45\n2a0f:1cc5:f08::/47\n2a0f:1cc5:fff::/48\n2a0f:1cc6:b110::/47\n2a0f:2706::/32\n2a0f:6284:4c00::/44\n2a0f:6284:4c20::/44\n2a0f:6284:4c30::/48\n2a0f:6284:4c40::/43\n2a0f:6284:4c60::/44\n2a0f:6284:4c80::/43\n2a0f:6284:4ca0::/44\n2a0f:6284:4cd0::/44\n2a0f:7803:fc00::/39\n2a0f:85c1:bfe::/48\n2a0f:9400:6110::/48\n2a10:ccc0:cc1::/48\n2a10:ccc0:cc2::/48\n2a10:ccc0:ccc0::/48\n2a10:ccc0:ccc::/48\n2a12:cb46:6000::/44\n2a12:cb46::/36\n2a12:cb47:ffff::/48\n2a13:1801:180::/43\n2a13:1801:200::/44\n2a13:1802::/43\n2a13:a5c3:ff50::/44\n2a13:a5c5::/48\n2a13:aac4:f000::/44\n2a13:b487:1200::/42\n2a14:67c1:a110::/44\n2a14:67c1:b500::/47\n2a14:67c1:b511::/48\n2a14:67c1:b514::/48\n2a14:67c1:b530::/44\n2a14:67c1:b561::/48\n2a14:67c1:b563::/48\n2a14:67c1:b578::/48\n2a14:67c1:b586::/47\n2a14:67c1:b588::/47\n2a14:67c1:b590::/48\n2a14:67c1:b599::/48\n2a14:67c1:b5e0::/44\n2a14:67c3:30::/44\n2a14:67c3:6668::/45\n2a14:7580:740::/44\n2a14:7580:7a0::/48\n2a14:7580:d00::/43\n2a14:7580:d20::/46\n2a14:7580:d41::/48\n2a14:7580:d42::/47\n2a14:7580:dff::/48\n2a14:7580:fffa::/48\n2a14:7581:3814::/48\n2a14:7581:3818::/47\n2a14:7581:381b::/48\n2a14:7583:f411::/48\n2a14:7583:f4f0::/48\n2a14:7583:f4f4::/48\n2a14:7583:f4fe::/48\n2a14:7583:f701::/48\n2a14:7583:f703::/48\n2a14:7583:f704::/46\n2a14:7583:f708::/46\n2a14:7583:f70c::/48\n2a14:7583:f743::/48\n2a14:7583:f744::/48\n2a14:7583:f764::/48\n2a14:7586:6100::/46\n2a14:7586:6104::/48\n2a14:7586:6107::/48\n2a14:7586:6110::/48\n2a14:7586:6300::/44\n2a14:7dc0:506::/48\n2c0f:f7a8:8011::/48\n2c0f:f7a8:8050::/48\n2c0f:f7a8:805f::/48\n2c0f:f7a8:8150::/48\n2c0f:f7a8:815f::/48\n2c0f:f7a8:8211::/48\n2c0f:f7a8:9020::/48\n2c0f:f7a8:9041::/48\n2c0f:f7a8:9211::/48\n2c0f:f7a8:9220::/48\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/rules/direct_host",
    "content": "cn\napple.com\nmicrosoft.com\ndyndns.com\ndouyucdn.cn\ndouyucdn2.cn\nlocation.services.mozilla.com\n\n#steam\nsteamcontent.com\ndl.steam.clngaa.com\ndl.steam.ksyna.com\nst.dl.bscstorage.net\nst.dl.eccdnx.com\nst.dl.pinyuncloud.com\ncdn.mileweb.cs.steampowered.com.8686c.com\ncdn-ws.content.steamchina.com\ncdn-qc.content.steamchina.com\ncdn-ali.content.steamchina.com\nepicgames-download1-1251447533.file.myqcloud.com\n\n#DoT/DoH\ndns.alidns.com\ndoh.pub\ndot.pub\ndoh.360.cn\ndot.360.cn\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/rules/direct_ip",
    "content": "114.114.114.114\n114.114.115.115\n223.5.5.5\n223.6.6.6\n119.29.29.29\n180.76.76.76\n1.12.12.12\n120.53.53.53\n180.184.1.1\n180.184.2.2\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/rules/domains_excluded",
    "content": "courier.push.apple.com\nrbsxbxp-mim.vivox.com\nrbsxbxp.www.vivox.com\nrbsxbxp-ws.vivox.com\nrbspsxp.www.vivox.com\nrbspsxp-mim.vivox.com\nrbspsxp-ws.vivox.com\nrbswxp.www.vivox.com\nrbswxp-mim.vivox.com\ndisp-rbspsp-5-1.vivox.com\ndisp-rbsxbp-5-1.vivox.com\nproxy.rbsxbp.vivox.com\nproxy.rbspsp.vivox.com\nproxy.rbswp.vivox.com\nrbswp.vivox.com\nrbsxbp.vivox.com\nrbspsp.vivox.com\nrbspsp.www.vivox.com\nrbswp.www.vivox.com\nrbsxbp.www.vivox.com\nrbsxbxp.vivox.com\nrbspsxp.vivox.com\nrbswxp.vivox.com\nMijia Cloud\ndlg.io.mi.com\nmarscdn.c2c.wechat.com\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/rules/gfwlist",
    "content": "000webhost.com\n0rz.tw\n1-apple.com.tw\n1000giri.net\n10beasts.net\n10musume.com\n12bet.com\n12vpn.com\n12vpn.net\n1337x.to\n141jj.com\n1688.com.au\n173ng.com\n18board.com\n18comic.org\n1984bbs.com\n1991way.com\n1e100.net\n1lib.sk\n1point3acres.com\n1pondo.tv\n2008xianzhang.info\n2021hkcharter.com\n2047.name\n2047.one\n2049bbs.xyz\n233abc.com\n24hrs.ca\n32red.com\n36rain.com\n404museum.com\n466453.com\n4bluestones.biz\n4everproxy.com\n4rbtv.com\n4shared.com\n4sqi.net\n500px.com\n500px.org\n51.ca\n51jav.org\n51luoben.com\n5278.cc\n611study.com\n611study.icu\n63i.com\n666pool.cn\n69shuba.cx\n6do.news\n6do.world\n6park.com\n6parkbbs.com\n6parker.com\n6parknews.com\n7capture.com\n8-d.com\n85cc.us\n881903.com\n89-64.org\n8964museum.com\n8z1.net\n91dasai.com\n91porn.com\n91porny.com\n91vps.club\n991.com\n996.icu\n99btgc01.com\n99cn.info\n9bis.com\n9bis.net\n9cache.com\n9gag.com\n9news.com.au\na-normal-day.com\na248.e.akamai.net\naamacau.com\naave.com\nabc.net.au\nabc.xyz\nabebooks.co.uk\nabebooks.com\nabematv.akamaized.net\naboluowang.com\nabout.gitlab.com\nabout.me\nabplive.com\nacast.com\naccountkit.com\nacevpn.com\nacg.rip\nacg18.me\nacgbox.org\nacgkj.com\nacgnx.se\nactivpn.com\naculo.us\nadcex.com\naddictedtocoffee.de\naddons.mozilla.org\naddyoutube.com\nadguard-vpn.com\nadmin.recaptcha.net\nadmob.com\nadpl.org.hk\nads-twitter.com\nadsense.com\nadult-sex-games.com\nadult.friendfinder.com\nadvanscene.com\nadvertfan.com\nadvertisercommunity.com\naei.org\naenhancers.com\naex.com\naf.mil\nafantibbs.com\nafr.com\nafreecatv.com\nagnesb.fr\nagoogleaday.com\nagro.hk\nai.dev\nai.studio\naiosearch.com\naiph.net\nairconsole.com\nairitilibrary.com\nairvpn.org\nait.org.tw\naiweiweiblog.com\nakademiye.org\nakamai.tvb.com\nakamaihd.net\nakiba-online.com\nakiba-web.com\nakile.io\nakinator.com\nakow.org\nalabout.com\nalanhou.com\nalasbarricadas.org\nalforattv.net\nalive.bar\naljazeera.com\naljazeera.net\nalkasir.com\nall4mom.org\nallcoin.com\nallconnected.co\nalldrawnsex.com\nallfinegirls.com\nallinfa.com\nallmovie.com\nalternate-tools.com\naltrec.com\nalwaysdata.com\nalwaysdata.net\nalwaysvpn.com\nam730.com.hk\namazon.co.jp\namazonvideo.com\nameblo.jp\namericangreencard.com\namericorps.gov\namiblockedornot.com\namitabhafoundation.us\namnesty.org\namnesty.org.hk\namnestyusa.org\nampproject.org\namuletmc.com\nanchor.fm\nanchorfree.com\nancsconf.org\nandfaraway.net\nandroid-x86.org\nandroid.com\nandroidapksfree.com\nandroidify.com\nandroidtv.com\nandygod.com\nangela-merkel.de\nangola.org\nangularjs.org\naniscartujo.com\nannas-archive.gd\nannas-archive.gl\nannas-archive.pk\nanobii.com\nanonfiles.com\nanonymouse.org\nanthonycalzadilla.com\nanthropic.com\nantiwave.net\nantpool.com\nanuneko.com\nanysex.com\nao3.org\naobo.com.au\naofriend.com\naomedia.org\naomiwang.com\naoxvpn.com\napartmentratings.com\napartments.com\napat1989.org\napi-secure.recaptcha.net\napi-verify.recaptcha.net\napi.ai\napi.palworldgame.com\napi.pureapk.com\napi.recaptcha.net\napi.steampowered.com\napiary.io\napigee.com\napk.support\napkcombo.com\napkmirror.com\napkmonk.com\napkplz.com\napkpure.com\napkpure.net\napp.box.com\napp.cloudcone.com\napp.element.io\napp.smartmailcloud.com\nappadvice.com\nappbrain.com\nappledaily.com\nappledaily.com.tw\napps.evozi.com\nappshopper.com\nappsocks.net\nappspot.com\nappsto.re\naptoide.com\narchive-it.org\narchive.fo\narchive.is\narchive.li\narchive.md\narchive.org\narchive.ph\narchive.today\narchive.vn\narchiveofourown.com\narchiveofourown.org\narchives.gov\narctosia.com\nareca-backup.org\narena.ai\narena.taipei\narethusa.su\narlingtoncemetery.mil\narte.tv\nartstation.com\narvanstorage.ir\narweave.org\nasacp.org\nasiaharvest.org\nasianage.com\nasianews.it\nasianfanfics.com\nasiansexdiary.com\nasiaone.com\nasiasociety.org\nask.com\naskstudent.com\naskynz.net\naspi.org.au\naspistrategist.org.au\nassembla.com\nassets.bwbx.io\nassets.nxtrace.org\nassimp.org\nastrill.com\natc.org.au\natchinese.com\nathenaeizou.com\natlanta168.com\natnext.com\nauctions.yahoo.co.jp\naudacy.com\nauntology.fandom.com\nautodraw.com\nav.movie\nav01.tv\navaaz.org\navdb.in\navdb.tv\navg.com\navgle.com\navidemux.org\navistaz.to\navmo.pw\navmoo.pw\navoision.com\naxios.com\naxureformac.com\nazirevpn.com\nazurewebsites.net\nb-ok.cc\nb.hatena.ne.jp\nbabylonbee.com\nbackchina.com\nbackend-v2.crixet.com\nbad.news\nbadiucao.com\nbahamut.com.tw\nbaidu.jp\nbaijie.org\nbailandaily.com\nbaixing.me\nbaizhi.org\nbanana-vpn.com\nband.us\nbandcamp.com\nbandwagonhost.com\nbangchen.net\nbangdream.space\nbangkokpost.com\nbangumi.moe\nbangyoulater.com\nbankmobilevibe.com\nbannedbook.org\nbanorte.com\nbaramangaonline.com\nbarnabu.co.uk\nbartender.dowjones.com\nbarton.de\nbastillepost.com\nbayvoice.net\nbb-chat.tv\nbbc.co.uk\nbbc.com\nbbc.pdn.tritondigital.com\nbbcchinese.com\nbbchat.tv\nbbci.co.uk\nbbs.cantonese.asia\nbbs.hanminzu.org\nbbs.junglobal.net\nbbs.mikocon.com\nbbs.mychat.to\nbbs.naixi.net\nbbs.nyinfor.com\nbcex.ca\nbearteach.com\nbebo.com\nbeeg.com\nbeepool.com\nbeepool.org\nbeevpn.com\nbehance.net\nbeijing1989.com\nbeijing2022.art\nbeijingspring.com\nbell.wiki\nbellingcat.com\nberlinerbericht.de\nberlintwitterwall.com\nbestvpn.com\nbestvpnanalysis.com\nbestvpnforchina.net\nbestvpnserver.com\nbestvpnservice.com\nbestvpnusa.com\nbet365.com\nbetaclouds.net\nbettergpt.chat\nbetterhash.net\nbetternet.co\nbettervpn.com\nbettween.com\nbetvictor.com\nbfnn.org\nbfsh.hk\nbgme.me\nbgvpn.com\nbiblesforamerica.org\nbibox.com\nbiedian.me\nbig.one\nbigjapanesesex.com\nbignews.org\nbigone.com\nbild.de\nbiliworld.com\nbinance.com\nbinance.org\nbinancezh.cc\nbird.so\nbit-z.com\nbit.do\nbit.ly\nbitbaby.com\nbitbay.net\nbitchute.com\nbitcointalk.org\nbitcoinworld.com\nbitfinex.com\nbitget.com\nbithumb.com\nbitmex.com\nbitshare.com\nbitterwinter.org\nbittorrent.com\nbitvise.com\nbitz.ai\nbjzc.org\nbl-doujinsouko.com\nblacked.com\nblackmagicdesign.com\nblackvpn.com\nblinkx.com\nblip.tv\nblockcast.it\nblockcn.com\nblockedbyhk.com\nblockless.com\nblocktempo.com\nblog.cryptographyengineering.com\nblog.de\nblog.excite.co.jp\nblog.expofutures.com\nblog.fizzik.com\nblog.fuckgfw233.org\nblog.jackjia.com\nblog.jp\nblog.martinoei.com\nblog.pathtosharepoint.com\nblog.pentalogic.net\nblog.ranxiang.com\nblog.reimu.net\nblog.soylent.com\nblog.tiney.com\nblogblog.com\nblogcatalog.com\nblogcity.me\nblogger.com\nblogjav.net\nbloglines.com\nbloglovin.com\nblogspot.ae\nblogspot.al\nblogspot.am\nblogspot.ba\nblogspot.be\nblogspot.bg\nblogspot.ca\nblogspot.cat\nblogspot.ch\nblogspot.cl\nblogspot.co.uk\nblogspot.com\nblogspot.com.ar\nblogspot.com.au\nblogspot.com.br\nblogspot.com.by\nblogspot.com.co\nblogspot.com.cy\nblogspot.com.ee\nblogspot.com.eg\nblogspot.com.es\nblogspot.com.mt\nblogspot.com.ng\nblogspot.com.tr\nblogspot.com.uy\nblogspot.cz\nblogspot.de\nblogspot.dk\nblogspot.fi\nblogspot.fr\nblogspot.gr\nblogspot.hk\nblogspot.hr\nblogspot.hu\nblogspot.ie\nblogspot.in\nblogspot.is\nblogspot.it\nblogspot.jp\nblogspot.kr\nblogspot.li\nblogspot.lt\nblogspot.lu\nblogspot.md\nblogspot.mk\nblogspot.mx\nblogspot.my\nblogspot.nl\nblogspot.no\nblogspot.pe\nblogspot.pt\nblogspot.qa\nblogspot.ro\nblogspot.ru\nblogspot.se\nblogspot.sg\nblogspot.si\nblogspot.sk\nblogspot.sn\nblogspot.tw\nblogspot.ug\nblogtd.org\nbloodshed.net\nbloomberg.cn\nbloomberg.com\nbloomberg.de\nbloombergview.com\nbloomfortune.com\nblubrry.com\nbmdru.com\nbnbstatic.com\nbnext.com.tw\nbnn.co\nbnrmetal.com\nboardreader.com\nbod.asia\nbolehvpn.net\nboobstagram.com\nbook.com.tw\nbookdepository.com\nbooks.com.tw\nbooktopia.com.au\nbookwalker.com.tw\nbootstrapcdn.com\nborgenmagazine.com\nbotanwang.com\nbowenpress.com\nboxpn.com\nboxun.com\nboxun.tv\nboysmaster.com\nbr.st\nbraumeister.org\nbrave.com\nbravotube.net\nbrazzers.com\nbreached.to\nbreak.com\nbreakgfw.com\nbreakingtweets.com\nbreakwall.net\nbrill.com\nbrizzly.com\nbroadpressinc.com\nbrookings.edu\nbrutaltgp.com\nbsky.app\nbsky.network\nbsky.social\nbt4g.org\nbt4gprx.com\nbt95.com\nbtbit.net\nbtbtt.co\nbtbtt.me\nbtc.com\nbtc98.com\nbtcbank.bank\nbtctrade.im\nbtdig.com\nbtguard.com\nbtku.me\nbtku.org\nbudaedu.org\nbuffered.com\nbullguard.com\nbullog.org\nbullogger.com\nbumingbai.net\nbunbunhk.com\nbusayari.com\nbusiness-humanrights.org\nbusiness.page\nbusinessinsider.com\nbusinesstoday.com.tw\nbusu.org\nbuzzorange.com\nbuzzsprout.com\nbvpn.com\nbwgyhw.com\nbwh1.net\nbx.in.th\nbybit.com\nbynet.co.il\nbypasscensorship.org\nbyrut.org\nc-est-simple.com\nc-span.org\nc-spanvideo.org\nc.mi.com\nc2cx.com\nc3pool.com\ncableav.tv\ncablegatesearch.net\ncachefly.com\ncachefly.net\ncacnw.com\ncactusvpn.com\ncalebelston.com\ncalendarz.com\ncamfrog.com\ncampaign-archive.com\ncampaignforuyghurs.org\ncams.com\ncanva.com\ncanyu.org\ncaobian.info\ncaochangqing.com\ncaoporn.us\ncap.org.hk\ncarfax.com\ncari.com.my\ncaribbeancom.com\ncarousell.com.hk\ncarrd.co\ncartoonmovement.com\ncasatibet.org.mx\ncasino.williamhill.com\ncasinobellini.com\ncastbox.fm\ncatbox.moe\ncatch22.net\ncatchgod.com\ncatholic.org.hk\ncatholic.org.tw\ncato.org\ncattt.com\ncaus.com\ncbc.ca\ncbs.ntu.edu.tw\ncccat.cc\ncccat.co\nccfd.org.tw\ncchere.com\ncchostvps.xyz\ncclife.org\ncclifefl.org\nccthere.com\nccthere.net\ncdbook.org\ncdef.org\ncdig.info\ncdjp.org\ncdn-images.mailchimp.com\ncdn-telegram.org\ncdn.arstechnica.net\ncdn.jwplayer.com\ncdn.printfriendly.com\ncdn.seatguru.com\ncdn.softlayer.net\ncdn.statically.io\ncdninstagram.com\ncdp1998.org\ncdp2006.org\ncdpeu.org\ncdpuk.co.uk\ncdpweb.org\ncdpwu.org\ncdw.com\ncecc.gov\ncellulo.info\ncenews.eu\ncentauro.com.br\ncenterforhumanreprod.com\ncentralnation.com\ncenturys.net\ncertificate-transparency.org\ncertificate.revocationcheck.com\ncfr.org\ncgdepot.org\nchange.org\nchangp.com\nchannelnewsasia.com\nchanworld.org\nchaoex.com\nchaos.social\ncharacter.ai\nchat.com\nchat.lmsys.org\nchatgpt.com\nchatpdf.com\nchaturbate.com\ncheckgfw.com\nchengmingmag.com\nchenguangcheng.com\nchenpokong.com\nchenpokongvip.com\nchenshan20042005.wordpress.com\ncherrysave.com\nchhongbi.org\nchina-mmm.net\nchina-review.com.ua\nchina-week.com\nchina.ucanews.com\nchina101.com\nchina18.org\nchina21.com\nchina21.org\nchina5000.us\nchinaaffairs.org\nchinaaid.net\nchinaaid.org\nchinaaid.us\nchinachange.org\nchinachannel.hk\nchinademocrats.org\nchinadialogue.net\nchinadigitaltimes.net\nchinaelections.org\nchinafile.com\nchinafreepress.org\nchinagfw.org\nchinahorizon.org\nchinamule.com\nchinanewscenter.com\nchinapress.com.my\nchinasocialdemocraticparty.com\nchinasoul.org\nchinatopsex.com\nchinauncensored.tv\nchinaview.wordpress.com\nchinaworker.info\nchinese-memorial.org\nchinese.engadget.com\nchinesedailynews.com\nchinesedemocracy.com\nchinesegay.org\nchinesen.de\nchinesenews.net.au\nchineseradioseattle.com\nchineseupress.com\nchingcheong.com\nchinman.net\nchobit.cc\nchrdnet.com\nchristianfreedom.org\nchristianstudy.com\nchristiantimes.org.hk\nchrlawyers.hk\nchrome.com\nchromecast.com\nchromeexperiments.com\nchromestatus.com\nci-en.jp\ncia.gov\ncici.com\nciciai.com\ncirosantilli.com\ncitizencn.com\ncitizenlab.ca\ncitizenlab.org\ncity365.ca\ncitypopulation.de\ncivicparty.hk\ncivilhrfront.org\ncivilmedia.tw\ncivitai.com\ncixiaoya.club\nck101.com\nclassicalguitarblog.net\nclaude.ai\nclaude.com\ncldr.unicode.org\nclearsurance.com\nclementine-player.org\nclinica-tibet.ru\nclipconverter.cc\ncloud.dify.ai\ncloud.mail.ru\ncloudflare-dns.com\ncloudflare-ipfs.com\ncloudflarestatus.com\ncloudfunctions.net\nclub1069.com\nclubhouseapi.com\nclyp.it\ncmcn.org\ncmegroup.com\ncmi.org.tw\ncms.gov\ncmule.com\ncmx.im\ncn-proxy.com\ncn.fmnnow.com\ncn.sandscotaicentral.com\ncn.shafaqna.com\ncn.theaustralian.com.au\ncn.uptodown.com\ncna.com.tw\ncnbbnews.wordpress.com\ncnbeta.com.tw\ncnd.org\ncnnews.chosun.com\ncnpolitics.org\nco.ng.mil\ncoat.co.jp\ncobinhood.com\ncochina.org\ncodeshare.io\ncodeskulptor.org\ncofacts.tw\ncoffeemanga.to\ncoinbase.com\ncoinbene.com\ncoinex.com\ncoingecko.com\ncoingi.com\ncoinmarketcap.com\ncoinrail.co.kr\ncointiger.com\ncointobe.com\ncoinut.com\ncolacloud.net\ncollateralmurder.com\ncollateralmurder.org\ncomefromchina.com\ncomments.app\ncommentshk.com\ncommunistcrimes.org\ncommunitychoicecu.com\ncomparitech.com\ncompileheart.com\nconnect.facebook.net\nconoha.jp\ncontests.twilio.com\ncool18.com\ncoolaler.com\ncoolder.com\ncoolloud.org.tw\ncoolstuffinc.com\ncopilot.microsoft.com\ncos-moe.com\ncosplayjav.pl\ncostco.com\ncotweet.com\ncounter.social\ncoursehero.com\ncovenantswatch.org.tw\ncoze.com\ncpj.org\ncpu-monkey.com\ncq99.us\ncrackle.com\ncrashlytics.com\ncrazypool.org\ncrazyshit.com\ncrbug.com\ncrchina.org\ncreaders.net\ncreativelab5.com\ncristyli.com\ncrocotube.com\ncrossfire.co.kr\ncrossvpn.net\ncrosswall.org\ncroxyproxy.com\ncrrev.com\ncrucial.com\ncrunchyroll.com\ncruxpool.com\ncsdparty.com\ncsis.org\ncsmonitor.com\ncss.pixnet.in\ncsuchen.de\ncsw.org.uk\nct.org.tw\nctinets.com\nctinews.com\nctitv.com.tw\nctowc.org\ncts.com.tw\nctwant.com\ncuiweiping.net\nculture.tw\ncumlouder.com\ncurvefish.com\ncusp.hk\ncutout.pro\ncutscenes.net\ncw.com.tw\ncyberghostvpn.com\ncynscribe.com\nd-fukyu.com\nd.cash\nd100.net\nd2bay.com\nd2pass.com\ndabr.co.uk\ndabr.me\ndabr.mobi\ndadazim.com\ndaidostup.ru\ndailymail.co.uk\ndailymotion.com\ndailysabah.com\ndailyview.tw\ndajiyuan.de\ndalailama.mn\ndalailama.ru\ndalailamacenter.org\ndalailamaworld.com\ndalianmeng.org\ndaliulian.org\ndanbooru.donmai.us\ndanke4china.net\ndarmau.co\ndarpa.mil\ndarrenliuwei.com\ndashlane.com\ndata-vocabulary.org\ndaum.net\ndavid-kilgour.com\ndawangidc.com\ndaxa.cn\ndazn.com\ndb.tt\ndbgjd.com\ndcard.tw\ndcs-spotify.megaphone.fm\nddc.com.tw\nddex.io\ndeadhouse.org\ndeadline.com\ndebug.com\ndeck.ly\ndeck.new\ndecodet.co\ndeepai.org\ndeepmind.com\ndeezer.com\ndeja.com\ndelcamp.net\ndemo.unlock-music.dev\ndemosisto.hk\ndepositphotos.com\ndesc.se\ndesipro.de\ndessci.com\ndeutsche-welle.de\ndevelopers.box.net\ndeviantart.com\ndeviantart.net\ndevio.us\ndevpn.com\ndevv.ai\ndiaoyuislands.org\ndigiland.tw\ndigisfera.com\ndiigo.com\ndirectcreative.com\ndiscoins.com\ndisconnect.me\ndiscord.com\ndiscord.gg\ndiscordapp.com\ndiscordapp.net\ndiscuss.com.hk\ndish.com\ndisk.yandex.com\ndisk.yandex.ru\ndisneyplus.com\ndisp.cc\ndisqus.com\ndit-inc.us\ndiyin.org\ndizhuzhishang.com\ndl-laby.jp\ndl.box.net\ndlive.tv\ndlsite.com\ndlyoutube.com\ndm530.net\ndma.mil\ndmc.nico\ndmcdn.net\ndmhy.org\ndmm.co.jp\ndns.cloudflare.com\ndns.sb\ndns2go.com\ndnscrypt.org\ndnssec.net\ndnvod.tv\ndoc.new\ndocker.com\ndocker.io\ndockerstatus.com\ndocs.new\ndocumentingreality.com\ndoh.sb\ndolc.de\ndolf.org.hk\ndongtaiwang.com\ndongtaiwang.net\ndoom9.org\ndoosho.com\ndoourbest.org\ndot.sb\ndotplane.com\ndotsub.com\ndotvpn.com\ndoub.io\ndoubibackup.com\ndoubiyunbackup.com\ndoublethinklab.org\ndouchi.space\ndougscripts.com\ndoujincafe.com\ndownload.dappcdn.com\ndpool.top\ndpp.org.tw\ndpr.info\ndragonex.io\ndragonsprings.org\ndrgan.net\ndropbooks.tv\ndropbox.com\ndropboxapi.com\ndropboxusercontent.com\ndscn.info\ndstk.dk\ndtiblog.com\ndtic.mil\ndubox.com\nduck.com\nduckduckgo.com\nduckmylife.com\nduga.jp\nduihua.org\nduihuahrjournal.org\nduplicati.com\nduyaoss.com\ndvdpac.com\ndvorak.org\ndw-world.com\ndw-world.de\ndw.com\ndw.de\ndweb.link\ndwnews.com\ndwnews.net\ndynawebinc.com\ndynu.com\ndynupdate.no-ip.com\ndysfz.cc\ne-classical.com.tw\ne-gold.com\ne-hentai.org\ne-hentaidb.com\ne-zone.com.hk\ne123.hk\ne621.net\nearlytibet.com\nearthvpn.com\neastasiaforum.org\neastturkistangovernmentinexile.us\nebook.hyread.com.tw\nebtcbank.com\necfa.org.tw\necimg.tw\neconomist.com\nedgecastcdn.net\nedubridge.com\nedx-cdn.org\neesti.ee\neevpn.com\nefksoft.com\nefukt.com\neic-av.com\neireinikotaerukai.com\neksisozluk.com\nelconfidencial.com\nelgoog.im\nelpais.com\nemule-ed2k.com\nemulefans.com\nen.favotter.net\nencrypt.me\nencyclopedia.com\nenewstree.com\nenglishfromengland.co.uk\nentermap.com\nepochhk.com\nepochtimes-bg.com\nepochtimes-romania.com\nepochtimes.co.il\nepochtimes.co.kr\nepochtimes.com\nepochtimes.com.tw\nepochtimes.de\nepochtimes.fr\nepochtimes.it\nepochtimes.jp\nepochtimes.ru\nepochtimes.se\nepochtimestr.com\nepochweek.com\nepochweekly.com\neporner.com\nerights.net\neriversoft.com\nernestmandel.org\nerodaizensyu.com\nerodoujinlog.com\nerodoujinworld.com\neromanga-kingdom.com\neromangadouzin.com\neromon.net\nesg.t91y.com\neslite.com\nesurance.com\netherdelta.com\nethermine.org\netherscan.com\netherscan.io\netizer.org\netokki.com\netools.ncol.com\netsy.com\neurekavpt.com\neuronews.com\nevchk.wikia.com\neveripedia.org\nevschool.net\nexchristian.hk\nexhentai.org\nexmo.com\nexmormon.org\nexpatshield.com\nexpecthim.com\nexpekt.com\nexploader.net\nexpressvpn.com\nexrates.me\nextmatrix.com\neyevio.jp\neyny.com\nf-droid.org\nf2pool.com\nf8.com\nfacebook.com\nfacebook.de\nfacebook.design\nfacebook.hu\nfacebook.in\nfacebook.nl\nfacebook.se\nfacebookmail.com\nfacebookquotes4u.com\nfaceless.me\nfacesofnyfw.com\nfacesoftibetanselfimmolators.info\nfactchecklab.org\nfactpedia.org\nfaith100.org\nfaiththedog.info\nfakku.net\nfallenark.com\nfalsefire.com\nfalunasia.info\nfalunau.org\nfalundafa-florida.org\nfalundafa-nc.org\nfalundafa-pa.net\nfalundafaindia.org\nfalunhr.org\nfamunion.com\nfanbox.cc\nfangeqiang.com\nfanglizhi.info\nfangong.org\nfanhaolou.com\nfanqiang.network\nfanqiangdang.com\nfanqianghou.com\nfanqiangzhe.com\nfanswong.com\nfantv.hk\nfast.com\nfast.wistia.com\nfastestvpn.com\nfastpic.ru\nfastssh.com\nfaststone.org\nfatbtc.com\nfavstar.fm\nfaz.net\nfb.com\nfb.me\nfb.watch\nfbaddins.com\nfbcdn.net\nfbsbx.com\nfbworkmail.com\nfc2cn.com\nfeedburner.com\nfeeder.co\nfeedly.com\nfeeds.fileforum.com\nfeedx.net\nfeelssh.com\nfeitianacademy.org\nfeixiaohao.com\nfeministteacher.com\nfengzhenghu.com\nfengzhenghu.net\nff.im\nfhreports.net\nfiddle.jshell.net\nfigprayer.com\nfileflyer.com\nfiles.oaiusercontent.com\nfilesor.com\nfinancetwitter.com\nfinancialexpress.com\nfinchvpn.com\nfindyoutube.com\nfindyoutube.net\nfirearmsworld.net\nfirebaseio.com\nfireofliberty.info\nfireofliberty.org\nfiretweet.io\nfirstpost.com\nfirstrade.com\nfish.audio\nflecheinthepeche.fr\nfleursdeslettres.com\nflexclip.com\nflexpool.io\nflgjustice.org\nflickr.com\nflipboard.com\nflipkart.com\nflitto.com\nflog.tw\nflowgpt.com\nflowhongkong.net\nflypool.org\nflyvpn.com\nflyzy2005.com\nfnac.be\nfnac.com\nfnc.ebc.net.tw\nfochk.org\nfocustaiwan.tw\nfofg.org\nfooooo.com\nforbes.com\nforefront.ai\nforeignaffairs.com\nforeignpolicy.com\nform.new\nforms.new\nforum.cyberctm.com\nfountmedia.io\nfourthinternational.org\nfoxgay.com\nfoxsub.com\nfpmt.org\nfpmtmexico.org\nfqrouter.com\nfrank2019.me\nfranklc.com\nfreakshare.com\nfree-ss.site\nfree.bg\nfree.com.tw\nfreebeacon.com\nfreebrowser.org\nfreechinaweibo.com\nfreedom.gov\nfreedomhouse.org\nfreedominfonetweb.wordpress.com\nfreedomsherald.org\nfreegao.com\nfreegpt.es\nfreegpt.tech\nfreehongkong.org\nfreekazakhs.org\nfreelotto.com\nfreenetproject.org\nfreeoz.org\nfreess.org\nfreessh.us\nfreeterabox.com\nfreetibet.org\nfreetibetanheroes.org\nfreetls.fastly.net\nfreetribe.me\nfreevpn.me\nfreewallpaper4.me\nfreewechat.com\nfreeweibo.com\nfreezhihu.org\nfriendfeed.com\nfriends-of-tibet.org\nfriendsoftibet.org\nfril.jp\nfring.com\nfringenetwork.com\nfrommel.net\nfrontlinedefenders.org\nfrootvpn.com\nfroth.zone\nfscked.org\nft.com\nftchinese.com\nftv.com.tw\nftvnews.com.tw\nftx.com\nfuchsia.dev\nfuckccp.com\nfuckccp.xyz\nfulione.com\nfullerconsideration.com\nfullservicegame.com\nfunkyimg.com\nfurbo.org\nfurinkan.com\nfurrybar.com\nfuturemessage.org\nfw.cm\nfxcm-chinese.com\nfxnetworks.com\ng-area.org\ng-queen.com\ng.co\ng0v.social\ng6hentai.com\ngab.com\ngabocorp.com\ngagaoolala.com\ngalenwu.com\ngame735.com\ngamer.com.tw\ngamez.com.tw\nganjing.com\nganjingworld.com\ngaoming.net\ngaopi.net\ngartlive.com\ngarudalinux.org\ngate.io\ngatecoin.com\ngather.com\ngaymap.cc\ngaywatch.com\ngazotube.com\ngcc.org.hk\ngclubs.com\ngcmasia.com\ngcpnews.com\ngcr.io\ngdaily.org\ngeek-art.net\ngekikame.com\ngelbooru.com\ngenerated.photos\ngenius.com\ngeph.io\nget.app\nget.dev\nget.how\nget.page\ngetastrill.com\ngetcloak.com\ngetfoxyproxy.org\ngetgom.com\ngeti2p.net\ngetlantern.org\ngetmalus.com\ngetmdl.io\ngetoutline.org\ngetsession.org\ngetsync.com\ngettr.com\ngettyimages.ae\ngettyimages.ca\ngettyimages.de\ngettyimages.hk\ngettyimages.in\ngettyimages.it\ngettyimages.us\ngetuploader.com\ngfsale.com\ngfw.press\ngfw.report\ngfwatch.org\ngfwbao.com\nggpht.com\nggssl.com\nghidra-sre.org\nghostpath.com\nghut.org\ngiantessnight.com\ngiga-web.jp\ngirlbanker.com\ngit.io\ngitbook.io\ngithub.blog\ngithub.com\ngithub.io\ngithubassets.com\ngithubcopilot.com\ngithubusercontent.com\ngitlab.net\ngizlen.net\ngjczz.com\nglarity.app\nglass8.eu\nglobal.ssl.fastly.net\nglobaljihad.net\nglobalrescue.net\nglobalvoices.org\nglobalvoicesonline.org\nglobalvpn.net\nglorystar.me\nglype.com\ngmail.com\ngmgard.com\ngmgn.ai\ngmodules.com\ngmp4.com\ngnci.org.hk\ngnews.org\ngo-to-zlibrary.se\ngo141.com\ngo5.dev\ngoagent.biz\ngodaddy.com\ngodfootsteps.org\ngodoc.org\ngofundme.com\ngohappy.com.tw\ngojet.krtco.com.tw\ngolang.org\ngoldbetsports.com\ngolden-ages.org\ngoldeneyevault.com\ngoldenfrog.com\ngoldwave.com\ngongm.in\ngoo.gl\ngoo.ne.jp\ngooday.xyz\ngoodhope.school\ngoodnewsnetwork.org\ngoodreaders.com\ngoodreads.com\ngoofind.com\ngoogle.ac\ngoogle.ad\ngoogle.ae\ngoogle.af\ngoogle.ai\ngoogle.al\ngoogle.am\ngoogle.as\ngoogle.at\ngoogle.az\ngoogle.ba\ngoogle.be\ngoogle.bf\ngoogle.bg\ngoogle.bi\ngoogle.bj\ngoogle.bs\ngoogle.bt\ngoogle.by\ngoogle.ca\ngoogle.cat\ngoogle.cd\ngoogle.cf\ngoogle.cg\ngoogle.ch\ngoogle.ci\ngoogle.cl\ngoogle.cm\ngoogle.cn\ngoogle.co.ao\ngoogle.co.bw\ngoogle.co.ck\ngoogle.co.cr\ngoogle.co.id\ngoogle.co.il\ngoogle.co.in\ngoogle.co.jp\ngoogle.co.ke\ngoogle.co.kr\ngoogle.co.ls\ngoogle.co.ma\ngoogle.co.mz\ngoogle.co.nz\ngoogle.co.th\ngoogle.co.tz\ngoogle.co.ug\ngoogle.co.uk\ngoogle.co.uz\ngoogle.co.ve\ngoogle.co.vi\ngoogle.co.za\ngoogle.co.zm\ngoogle.co.zw\ngoogle.com\ngoogle.com.af\ngoogle.com.ag\ngoogle.com.ai\ngoogle.com.ar\ngoogle.com.au\ngoogle.com.bd\ngoogle.com.bh\ngoogle.com.bn\ngoogle.com.bo\ngoogle.com.br\ngoogle.com.bz\ngoogle.com.co\ngoogle.com.cu\ngoogle.com.cy\ngoogle.com.do\ngoogle.com.ec\ngoogle.com.eg\ngoogle.com.et\ngoogle.com.fj\ngoogle.com.gh\ngoogle.com.gi\ngoogle.com.gt\ngoogle.com.hk\ngoogle.com.jm\ngoogle.com.kh\ngoogle.com.kw\ngoogle.com.lb\ngoogle.com.ly\ngoogle.com.mm\ngoogle.com.mt\ngoogle.com.mx\ngoogle.com.my\ngoogle.com.na\ngoogle.com.nf\ngoogle.com.ng\ngoogle.com.ni\ngoogle.com.np\ngoogle.com.om\ngoogle.com.pa\ngoogle.com.pe\ngoogle.com.pg\ngoogle.com.ph\ngoogle.com.pk\ngoogle.com.pr\ngoogle.com.py\ngoogle.com.qa\ngoogle.com.sa\ngoogle.com.sb\ngoogle.com.sg\ngoogle.com.sl\ngoogle.com.sv\ngoogle.com.tj\ngoogle.com.tr\ngoogle.com.tw\ngoogle.com.ua\ngoogle.com.uy\ngoogle.com.vc\ngoogle.com.vn\ngoogle.cv\ngoogle.cz\ngoogle.de\ngoogle.dev\ngoogle.dj\ngoogle.dk\ngoogle.dm\ngoogle.dz\ngoogle.ee\ngoogle.es\ngoogle.eu\ngoogle.fi\ngoogle.fm\ngoogle.fr\ngoogle.ga\ngoogle.ge\ngoogle.gg\ngoogle.gl\ngoogle.gm\ngoogle.gp\ngoogle.gr\ngoogle.gy\ngoogle.hk\ngoogle.hn\ngoogle.hr\ngoogle.ht\ngoogle.hu\ngoogle.ie\ngoogle.im\ngoogle.iq\ngoogle.is\ngoogle.it\ngoogle.it.ao\ngoogle.je\ngoogle.jo\ngoogle.kg\ngoogle.ki\ngoogle.kz\ngoogle.la\ngoogle.li\ngoogle.lk\ngoogle.lt\ngoogle.lu\ngoogle.lv\ngoogle.md\ngoogle.me\ngoogle.mg\ngoogle.mk\ngoogle.ml\ngoogle.mn\ngoogle.ms\ngoogle.mu\ngoogle.mv\ngoogle.mw\ngoogle.mx\ngoogle.ne\ngoogle.nl\ngoogle.no\ngoogle.nr\ngoogle.nu\ngoogle.org\ngoogle.pl\ngoogle.pn\ngoogle.ps\ngoogle.pt\ngoogle.ro\ngoogle.rs\ngoogle.ru\ngoogle.rw\ngoogle.sc\ngoogle.se\ngoogle.sh\ngoogle.si\ngoogle.sk\ngoogle.sm\ngoogle.sn\ngoogle.so\ngoogle.sr\ngoogle.st\ngoogle.td\ngoogle.tg\ngoogle.tk\ngoogle.tl\ngoogle.tm\ngoogle.tn\ngoogle.to\ngoogle.tt\ngoogle.us\ngoogle.vg\ngoogle.vn\ngoogle.vu\ngoogle.ws\ngoogleapis.com\ngoogleapps.com\ngooglearth.com\ngoogleartproject.com\ngoogleblog.com\ngooglebot.com\ngooglechinawebmaster.com\ngooglecode.com\ngooglecommerce.com\ngoogledomains.com\ngoogledrive.com\ngoogleearth.com\ngooglefiber.net\ngooglegroups.com\ngooglehosted.com\ngoogleideas.com\ngoogleinsidesearch.com\ngooglemail.com\ngooglemashups.com\ngooglepagecreator.com\ngoogleplay.com\ngoogleplus.com\ngooglescholar.com\ngooglesource.com\ngoogleusercontent.com\ngooglevideo.com\ngoogleweblight.com\ngooglezip.net\ngopetition.com\ngoreforum.com\ngoregrish.com\ngospelherald.com\ngotdns.ch\ngotquestions.org\ngotrusted.com\ngotw.ca\ngov.ir\ngov.taipei\ngov.tw\ngrammaly.com\ngraph.org\ngraphis.ne.jp\ngraphql.org\ngravatar.com\ngreasyfork.org\ngreatfire.org\ngreatfire.us7.list-manage.com\ngreatfirevpn.com\ngreatfirewallofchina.org\ngreenpeace.org\ngreenvpn.net\ngrindr.com\ngrok.com\ngrokipedia.com\nground.news\ngsearch.media\ngsp.target.com\ngstatic.com\ngtricks.com\ngtv.org\ngtv1.org\ngu-chu-sum.org\nguaguass.com\nguishan.org\ngumroad.com\ngunsamerica.com\ngutteruncensored.com\ngvlib.com\ngvm.com.tw\ngvt1.com\ngvt3.com\ngwins.org\ngwtproject.org\ngzone-anime.info\nh-china.org\nh-moe.com\nhackmd.io\nhackthatphone.net\nhaijiao.com\nhaiwaikan.com\nhakkatv.org.tw\nhalktv.com.tr\nhanime.tv\nhanime1.me\nhardsextube.com\nhautelook.com\nhautelookcdn.com\nhbg.com\nhbo.com\nhbomax.com\nhdtvb.net\nhdzog.com\nheartyit.com\nhec.su\nhecaitou.net\nhechaji.com\nheeact.edu.tw\nhegre-art.com\nhelixstudios.net\nhelloandroid.com\nhelloqueer.com\nhelp.byspotify.com\nhelpeachpeople.com\nhelpster.de\nhembed.com\nheqinglian.net\nheritage.org\nherokuapp.com\nherominers.com\nhexieshe.com\nhexieshe.xyz\nhexxeh.net\nheyuedi.com\nhicairo.com\nhiccears.com\nhidden-advent.org\nhide.me\nhideipvpn.com\nhideman.net\nhidemy.name\nhidemyass.com\nhidemycomp.com\nhighrockmedia.com\nhiitch.com\nhikinggfw.org\nhimalayan-foundation.org\nhimemix.com\nhindustantimes.com\nhinet.net\nhitbtc.com\nhitomi.la\nhiveon.net\nhk-pub.com\nhk.gradconnection.com\nhk.jiepang.com\nhk01.com\nhka8964.wordpress.com\nhkanews.wordpress.com\nhkbookcity.com\nhkchronicles.com\nhkcnews.com\nhkcoc.com\nhkcoc.weather.com.hk\nhkdc.us\nhket.com\nhkfaa.com\nhkgalden.com\nhkgolden.com\nhkgpao.com\nhklts.org.hk\nhkmap.live\nhkopentv.com\nhkpeanut.com\nhkreporter.com\nhmoegirl.com\nhmvdigital.ca\nhmvdigital.com\nhnjhj.com\nhojemacau.com.mo\nhola.com\nhola.org\nhole.thu.monster\nholyspiritspeaks.org\nhome.saxo\nhomedepot.com\nhomeservershow.com\nhongkong.fandom.com\nhongkongfp.com\nhongzhi.li\nhonven.xyz\nhootsuite.com\nhoover.org\nhoovers.com\nhornytrip.com\nhorrorporn.com\nhostloc.com\nhotair.com\nhotcoin.com\nhotspotshield.com\nhottg.com\nhotvpn.com\nhowtoforge.com\nhoxx.com\nhoy.tv\nhpjav.com\nhqcdp.org\nhqjapanesesex.com\nhqsbnet.wordpress.com\nhqsbonline.wordpress.com\nhrichina.org\nhrntt.org\nhrw.org\nhsex.men\nhsjp.net\nhsselite.com\nhst.net.tw\nht.ly\nhtkou.net\nhtl.li\nhtml5rocks.com\nhtx.com\nhuaglad.com\nhuanghuagang.org\nhuaren.us\nhuashangnews.com\nhuayuworld.org\nhudatoriq.web.id\nhudson.org\nhuffingtonpost.com\nhuffpost.com\nhuggingface.co\nhugoroy.eu\nhuhaitai.com\nhuhamhire.com\nhuhangfei.com\nhulu.com\nhuluim.com\nhumanparty.me\nhumanrightspressawards.org\nhung-ya.com\nhuobi.co\nhuobi.com\nhuobi.li\nhuobi.me\nhuobi.pro\nhuobi.sc\nhuobipool.com\nhuobipro.com\nhuping.net\nhustlercash.com\nhutianyi.net\nhwayue.org.tw\nhxwk.org\nhybrid-analysis.com\nhyperbeam.com\nhyperrate.com\nhypothes.is\ni-scmp.com\ni.111666.best\ni.lithium.com\ni2p2.de\ni818hk.com\niam.soy\niask.ca\niavian.net\nibvpn.com\nicedrive.net\nicij.org\nicl-fi.org\nicoco.com\niconpaper.org\nicu-project.org\nid.heroku.com\nidcflare.com\nidenti.ca\nidiomconnection.com\nidope.se\nifan.cz.cc\nifcss.org\nifreechina.wordpress.com\nifreewares.com\nift.tt\nigcd.net\nigfw.net\nigoogle.com\nigvita.com\niicns.com\niipdigital.usembassy.gov\nilbe.com\nilhamtohtiinstitute.org\nillawarramercury.com.au\nillusionfactory.com\nilove80.be\nilovelongtoes.com\nim88.tw\nimagefap.com\nimageflea.com\nimageglass.org\nimages-gaytube.com\nimages.prismic.io\nimageshack.us\nimagevenue.com\nimagezilla.net\nimago-images.com\nimb.org\nimg.dlsite.jp\nimg.ly\nimg.picgo.net\nimgasd.com\nimgchili.net\nimgur.com\nimkev.com\nimlive.co\nimprod.works\nincloak.com\nincredibox.fr\nindependent.co.uk\nindia.com\nindiablooms.com\nindianarrative.com\nindiandefensenews.in\nindiatoday.in\nindiemerch.com\ninews-api.tvb.com\ninfo-graf.fr\ninfura.io\ninherit.live\ninitiativesforchina.org\ninkbunny.net\ninkui.com\ninmediahk.net\ninoreader.com\ninote.tw\ninsecam.org\ninside.com.tw\ninsidevoa.com\ninstagram.com\ninstitut-tibetain.org\ninteractivebrokers.com\ninternet.org\ninternetfreedom.org\ninternetpopculture.com\ninterseclab.org\ninthenameofconfuciusmovie.com\ninvestigating.wordpress.com\ninvesting.com\ninvidio.us\ninxian.com\nipdefenseforum.com\nipfire.org\nipfs.4everland.io\nipfs.io\niphone4hongkong.com\niphonetaiwan.org\niphonix.fr\nipicture.ru\nipify.org\nipjetable.net\niportal.me\nippotv.com\nipredator.se\niptvbin.com\nipvanish.com\nirangov.ir\nirna.ir\nironpython.net\nironsocket.com\nisaacmao.com\nisc.sans.edu\nisgreat.org\nishr.ch\nislam.org.hk\nislamhouse.com\nismaelan.com\nismprofessional.net\nisrabox.com\nissues.chromium.org\nissuu.com\nisupportuyghurs.org\nitaliatibet.org\nitasoftware.com\nitch.io\nitemfix.com\nitiger.com\nitshidden.com\nitweet.net\niuhrdf.org\nivacy.com\nivonblog.com\nivpn.net\niwara.tv\nixquick.com\niyouport.com\niyouport.org\nj.mp\njable.tv\njamestown.org\njamyangnorbu.com\njan.ai\njapan-whores.com\njapanhdv.com\njapantimes.co.jp\njav321.com\njavakiba.org\njavbus.com\njavdb.com\njavfinder.ai\njavfor.me\njavhub.net\njavhuge.com\njavlibrary.com\njavmobile.net\njavseen.com\njcpenney.com\njex.com\njgoodies.com\njhelab.org\njiangweiping.com\njiaoyou8.com\njifangge.com\njihadology.net\njiji.com\njims.net\njingpin.org\njinrizhiyi.news\njintian.net\njinx.com\njitouch.com\njkb.cc\njma.go.jp\njmsc.hku.hk\njmscult.com\njoachims.org\njobnewera.wordpress.com\njoinclubhouse.com\njoinmastodon.org\njornaldacidadeonline.com.br\njournalofdemocracy.org\njpl.nasa.gov\njsdelivr.net\njtvnw.net\njukujo-club.com\njuliepost.com\njuliereyc.com\njunauza.com\njuoaa.com\njusthost.ru\njustmysocks.net\njustmysocks1.net\njustmysockscn.com\njuziyue.com\nka-wai.com\nkadokawa.co.jp\nkagyu.org.za\nkagyuoffice.org\nkagyuoffice.org.tw\nkakao.com\nkanald.com.tr\nkannewyork.com\nkanshifang.com\nkantie.org\nkaotic.com\nkarayou.com\nkawaiikawaii.jp\nkawase.com\nkb.monitorware.com\nkebrum.com\nkendatire.com\nkenengba.com\nkepard.com\nkex.com\nkeycdn.com\nkhatrimaza.org\nkichiku-doujinko.com\nkik.com\nkillwall.com\nkindle4rss.com\nkindleren.com\nkingdomsalvation.org\nkingkong.com.tw\nkingstone.com.tw\nkinmen.org.tw\nkinmen.travel\nkinokuniya.com\nkiwi.kz\nkk-whys.co.jp\nkkbox.com\nkknews.cc\nknowyourmeme.com\nkobo.com\nkobobooks.com\nkompozer.net\nkonachan.com\nkoolsolutions.com\nkoornk.com\nkoranmandarin.com\nkpkuang.org\nkqes.net\nkraken.com\nkspcoin.com\nktzhk.com\nkuaichedao.co\nkucoin.com\nkukuku.uk\nkurtmunger.com\nkwcg.ca\nkwongwah.com.my\nkxsw.life\nkzaobao.com\nkzeng.info\nlab.skk.moe\nlabiennale.org\nlagranepoca.com\nlala.im\nlama.com.tw\nlamayeshe.com\nlamnia.co.uk\nlandofhope.tv\nlantern.io\nlaogai.org\nlaogairesearch.org\nlaqingdan.net\nlarsgeorge.com\nlastcombat.com\nlastfm.es\nlausan.hk\nlbank.info\nldplayer.net\nldplayer.tw\nle-vpn.com\nleafyvpn.net\nlecloud.net\nledger.com\nleft21.hk\nlegra.ph\nleisurepro.com\nlematin.ch\nlenwhite.com\nlesoir.be\nletscorp.net\nlexica.art\nlhakar.org\nli.taipei\nliangyou.net\nliangzhichuanmei.com\nliaowangxizang.net\nliberal.org.hk\nlibertysculpturepark.com\nlibertytimes.com.tw\nlibrary-access.sk\nlibrary.usc.cuhk.edu.hk\nlibredd.it\nlifemiles.com\nlighten.org.tw\nlighti.me\nlightnovel.cn\nlightyearvpn.com\nlih.kg\nlihkg.com\nlike.com\nlilaoshibushinilaoshi.com\nline-apps.com\nline-scdn.net\nline.me\nline.naver.jp\nlinear-abematv.akamaized.net\nlingualeo.com\nlingvodics.com\nlink-o-rama.com\nlinkedin.com\nlinktr.ee\nlinux.do\nlinux.org.hk\nliquiditytp.com\nliquidvpn.com\nlistennotes.com\nlistentoyoutube.com\nlitenews.hk\nliuxiaobo.net\nliuxiaotong.com\nlivecoin.net\nliveleak.com\nlivemint.com\nlivestream.com\nlivevideo.com\nlivingstream.com\nlmarena.ai\nlocalbitcoins.com\nlocaldomain.ws\nlockestek.com\nlogin.target.com\nlogos.com.hk\nlongtermly.net\nlongtoes.com\nlookpic.com\nlooktoronto.com\nlovart.ai\nlovetvshow.com\nlpsg.com\nlrfz.com\nlrip.org\nlsd.org.hk\nlsm.org\nlsmchinese.org\nlsmkorean.org\nlt.sntp.uk\nltn.com.tw\nluckydesigner.space\nluckymobile.ca\nludepress.com\nlupm.org\nlushstories.com\nlvhai.org\nlvv2.com\nlyfhk.net\nlzjscript.com\nlzmtnews.org\nm.hkgalden.com\nm.me\nm.moegirl.org\nmacgamestore.com\nmad-ar.ch\nmadewithcode.com\nmadonna-av.com\nmadou.club\nmadrau.com\nmadthumbs.com\nmahjongsoul.com\nmain-ecnpaper-economist.content.pugpig.com\nmaiplus.com\nmakemymood.com\nmandiant.com\nmangabz.com\nmangafox.com\nmangafox.me\nmangmang.run\nmanta.com\nmanus.im\nmanyvoices.news\nmarc.info\nmartau.com\nmartsangkagyuofficial.org\nmarxist.net\nmarxists.org\nmash.to\nmastodon.cloud\nmastodon.host\nmastodon.online\nmastodon.social\nmastodon.xyz\nmatainja.com\nmaterial.io\nmatome-plus.com\nmatome-plus.net\nmatrix.org\nmatters.news\nmatters.town\nmatthewdgreen.wordpress.com\nmattwilcox.net\nmaven.neoforged.net\nmcadforums.com\nmcaf.ee\nmcusercontent.com\nmd-t.org\nme.me\nme.ns.ci\nmeansys.com\nmedia.nu.nl\nmediachinese.com\nmediafreakcity.com\nmediawiki.org\nmedium.com\nmeee.com.tw\nmega.co.nz\nmega.io\nmega.nz\nmegalodon.jp\nmegaproxy.com\nmegurineluka.com\nmeizhong.blog\nmeizhong.report\nmemehk.com\nmemes.tw\nmercari.com\nmercari.jp\nmercatox.com\nmercdn.net\nmercyprophet.org\nmergersandinquisitions.com\nmeridian-trust.org\nmeripet.com\nmerit-times.com.tw\nmessenger.com\nmeta.com\nmetafilter.com\nmetamask.io\nmetart.com\nmetarthunter.com\nmeteorshowersonline.com\nmetro.taipei\nmetrolife.ca\nmetroradio.com.hk\nmewe.com\nmfxmedia.com\nmgoon.com\nmgstage.com\nmh4u.org\nmicrovpn.com\nmihua.org\nmij.rip\nmikanani.me\nmike.cz.cc\nmikesoltys.com\nmindrolling.org\nmingdemedia.org\nminghui-school.org\nminghui.or.kr\nminghui.org\nminghuiyw.wordpress.com\nmingjinglishi.com\nmingjingnews.com\nmingjingtimes.com\nmingpao.com\nmingpaocanada.com\nmingpaomonthly.com\nmingpaonews.com\nmingpaony.com\nmingpaosf.com\nmingshengbao.com\nminhhue.net\nminingpoolhub.com\nministrybooks.org\nminzhuzhongguo.org\nmiraheze.org\nmiroguide.com\nmirror.xyz\nmirrorbooks.com\nmirrormedia.mg\nmissav.com\nmissav.ws\nmistral.ai\nmitbbs.com\nmiuipolska.pl\nmixero.com\nmixi.jp\nmixx.com\nmizzmona.com\nmji.rip\nmjj.rip\nmjlsh.usc.cuhk.edu.hk\nmlc.ai\nmlzs.work\nmmaaxx.com\nmo.nightlife141.com\nmobatek.net\nmobile01.com\nmobileways.de\nmoby.to\nmod.io\nmodernchinastudies.org\nmoeerolibrary.com\nmoeshare.cc\nmog.com\nmohu.club\nmohu.rocks\nmojim.com\nmomoshop.com.tw\nmondex.org\nmoney-link.com.tw\nmoneydj.com\nmonica.im\nmonitorchina.org\nmonocloud.me\nmonster.com\nmoodyz.com\nmoon.fm\nmoonbbs.com\nmoonbingo.com\nmoptt.tw\nmoresci.sale\nmorningsun.org\nmos.ru\nmosavi.io\nmotherless.com\nmovements.org\nmoviefap.com\nmpettis.com\nmpfinance.com\nmpinews.com\nmrtweet.com\nmsa-it.org\nmsha.gov\nmstdn.social\nmswe1.org\nmthruf.com\nmubi.com\nmullvad.net\nmultiply.com\nmusixmatch.com\nmuzi.com\nmuzi.net\nmuzu.tv\nmvg.jp\nmy-private-network.co.uk\nmy.pcloud.com\nmyaudiocast.com\nmybet.com\nmychinanews.com\nmycnnews.com\nmyeclipseide.com\nmyiphide.com\nmyjs.tw\nmykomica.org\nmymoe.moe\nmyparagliding.com\nmypikpak.com\nmypopescu.com\nmyspacecdn.com\nmytvsuper.com\nmywife.cc\nnaacoalition.org\nnaitik.net\nnakedsecurity.sophos.com\nnakido.com\nnalandabodhi.org\nnalandawest.org\nnamu.wiki\nnanopool.org\nnanyang.com\nnanyangpost.com\nnat.moe\nnational-lottery.co.uk\nnationalawakening.org\nnationalinterest.org\nnationalreview.com\nnationwide.com\nnaughtyamerica.com\nnaver.com\nnavyfamily.navy.mil\nnavyreserve.navy.mil\nnbcnews.com\nnbtvpn.com\nnbyy.tv\nnchrd.org\nncn.org\nndi.org\nnekoslovakia.net\nneo-miracle.com\nneowin.net\nnephobox.com\nnetalert.me\nnetflav.com\nnetflix.com\nnetflix.net\nnetlify.app\nnetme.cc\nnetsarang.com\nnewcenturymc.com\nnewchen.com\nnewhighlandvision.com\nnewindianexpress.com\nnewmitbbs.com\nnews.ebc.net.tw\nnews.mt.co.kr\nnews.seehua.com\nnews.tvbs.com.tw\nnews.ycombinator.com\nnews1.kr\nnews18.com\nnewsancai.com\nnewsblur.com\nnewsmax.com\nnewstamago.com\nnewstapa.org\nnewstatesman.com\nnewsweek.com\nnewtalk.tw\nnewthuhole.com\nnewyorker.com\nnexon.com\nnextdigital.com.hk\nnexton-net.jp\nnexttv.com.tw\nnf.id.au\nnflxext.com\nnflximg.com\nnflximg.net\nnflxso.net\nnflxvideo.net\nnftstorage.link\nnga.mil\nnhentai.net\nnic.cz.cc\nnic.gov\nnicovideo.jp\nnightswatch.top\nnikke-en.com\nnikke-jp.com\nnikke-kr.com\nnikke.hotcool.tw\nnikkei.com\nninjaproxy.ninja\nnirsoft.net\nnitter.cc\nnitter.net\nniu.moe\nniusnews.com\nnjactb.org\nnlfreevpn.com\nnmsl.website\nnnews.eu\nnobel.se\nnodeseek.com\nnokogiri.org\nnokola.com\nnordstrom.com\nnordstromimage.com\nnordstromrack.com\nnordvpn.com\nnos.nl\nnotepad-plus-plus.org\nnottinghampost.com\nnow.com\nnownews.com\nnoxinfluencer.com\nnpa.go.jp\nnpnt.me\nnpsboost.com\nnradio.me\nnrk.no\nntd.tv\nntdtv.com\nntdtv.com.tw\nntdtv.cz\nnuexpo.com\nnurgo-software.com\nnusatrip.com\nnutaku.net\nnutsvpn.work\nnuuvem.com\nnvdst.com\nnvtongzhisheng.org\nnyaa.eu\nnyaa.si\nnybooks.com\nnypost.com\nnyt.com\nnytcn.me\nnytco.com\nnyti.ms\nnytimes.com\nnytimes.map.fastly.net\nnytimg.com\nnytstyle.com\no3o.ca\noanda.com\noann.com\nobyte.org\noctober-review.org\noctocaptcha.com\noculus.com\noculuscdn.com\nodysee.com\noex.com\nofficeoftibet.com\nofile.org\nogaoga.org\nogate.org\nohmyrss.com\nok.ru\nokayfreedom.com\nokcoin.com\nokex.com\nokk.tw\noklink.com\nokpool.me\nokx.com\nold.honeynet.org\nolehdtv.com\nolelive.com\nolevod.com\nolumpo.com\nomct.org\nomni7.jp\nomnitalk.com\nomnitalk.org\nomny.fm\non.cc\non2.com\nonapp.com\none.one.one.one\nonedrive.com\nonedrive.live.com\nonejav.com\nonevps.com\nonion.city\nonion.ly\nonline.recoveryversion.org\nonlineyoutube.com\nonlygayvideo.com\nonlytweets.com\nonthehunt.com\nontrac.com\noojj.de\nooni.io\nooni.org\nopen.firstory.me\nopenai.com\nopenart.ai\nopencritic.com\nopendemocracy.net\nopenid.net\nopenleaks.org\nopensea.io\nopenstreetmap.org\nopentech.fund\nopenvpn.net\nopenvpn.org\nopenwebster.com\nopus-gaming.com\nordns.he.net\noricon.co.jp\norient-doll.com\norientaldaily.com.my\norn.jp\nosfoora.com\nosmand.net\notcbtc.com\notto.de\nourdearamy.com\noursteps.com.au\nourtv.hk\novercast.fm\noverdaily.org\noverplay.net\noversea.istarshine.com\novpn.com\now.ly\nowl.li\nowltail.com\noxfordscholarship.com\nozvoice.org\npachosting.com\npacom.mil\npacopacomama.com\npage.link\npages.dev\npaimon.moe\npancakeswap.finance\npandafan.pub\npandapow.co\npandavpn-jp.com\npandavpnpro.com\npandora.com\npanoramio.com\npao-pao.net\nparkansky.com\nparler.com\nparse.com\nparsevideo.com\npartnerstack.xyz\npassion.com\npaste.ee\npastie.org\npatreon.com\npatreonusercontent.com\npawoo.net\npaxful.com\npayments-jp.amazon.com\npbs.org\npbworks.com\npbxes.com\npbxes.org\npcgamestorrents.com\npcij.org\npct.org.tw\npdproxy.com\npds.nasa.gov\npdst.fm\npeace.ca\npeing.net\npekingduck.org\npemulihan.or.id\npen.io\npendrivelinux.com\npentoy.hk\npeoplenews.tw\npeopo.org\nperfect-privacy.com\nperiscope.tv\nperplexity.ai\npewresearch.org\nphayul.com\nphmsociety.org\nphncdn.com\nphosphation13.rssing.com\nphotodharma.net\nphotofocus.com\nphotonmedia.net\npiaotia.com\npicacomic.com\npicacomiccn.com\npicasaweb.com\npicsart.com\npicturedip.com\npicuki.com\npigav.com\npimg.tw\npin-cong.com\npin6.com\npincong.rocks\nping.fm\npinimg.com\npinoy-n.com\npinterest.at\npinterest.ca\npinterest.cl\npinterest.co.uk\npinterest.com\npinterest.com.au\npinterest.com.mx\npinterest.de\npinterest.es\npinterest.fr\npinterest.ie\npinterest.it\npinterest.jp\npinterest.nz\npinterest.ph\npinterest.pt\npinterest.se\npixeldrain.com\npixelqi.com\npixiv.net\npixiv.org\npixivsketch.net\npixnet.net\npki.goog\npkqjiasu.com\npkuanvil.com\nplacemix.com\nplay-asia.com\nplayboy.com\nplayboyplus.com\nplayer.fm\nplayno1.com\nplaypcesor.com\nplexvpn.pro\nplurk.com\nplus.codes\npmatehunter.com\npo2b.com\npodbean.com\npodcast.co\npodictionary.com\npodwise.ai\npoe.com\npoints-media.com\npokerstars.com\npokerstars.net\npoliticalchina.org\npoloniex.com\npolymarket.com\npolymer-project.org\npolymerhk.com\npoolbinance.com\npoolin.com\npopai.pro\npopvote.hk\npopxi.click\npopyard.org\npornhd.com\npornhub.com\npornhubdeutsch.net\npornmate.com\npornrapidshare.com\npornsharing.com\npornstarbyface.com\npornstarclub.com\nporntvblog.com\nposkotanews.com\npost76.com\npost852.com\nposts.careerengine.us\npotato.im\npotatso.com\npotvpn.com\npourquoi.tw\npower.com\npowerapple.com\npowercx.com\nppy.sh\nprayforchina.net\nprcleader.org\npremproxy.com\npresentation.new\npresentationzen.com\npresident.ir\npresidentlee.tw\nprestige-av.com\nprimevideo.com\nprism-break.org\npritunl.com\nprivacybox.de\nprivacyguides.org\nprivate.com\nprivateinternetaccess.com\nprivatepaste.com\nprivatetunnel.com\nprivatevpn.com\nprivoxy.org\nprocopytips.com\nproject-syndicate.org\nprompthero.com\nprosiben.de\nproton.me\nprotonvpn.com\nprovpnaccounts.com\nproxfree.com\nproxomitron.info\nproxpn.com\nproxynetwork.org.uk\nproxz.com\nproyectoclubes.com\npscp.tv\npshvpn.com\npsiphon.ca\npsiphon3.com\npstatic.net\npt.im\nptt.cc\npttgame.com\nptwxz.com\npubu.com.tw\npuffinbrowser.com\npullfolio.co\npure18.com\npureconcepts.net\npuredns.org\npureinsight.org\npurepdf.com\npurevpn.com\npurpose.nike.com\npursuestar.com\nputty.org\npximg.net\npython.com.tw\nqbittorrent.org\nqgirl.com.tw\nqi-gong.me\nqianbai.tw\nqiandao.today\nqianglie.com\nqiangwaikan.com\nqiangyou.org\nqianmo.tw\nqiwen.lu\nqmp4.com\nqoos.com\nqq.co.za\nqstatus.com\nqtrac.eu\nquestvisual.com\nquitccp.org\nquiz.directory\nquora.com\nquoracdn.net\nquran.com\nqz.com\nr-pool.net\nr0.ru\nr10s.jp\nr18.com\nradiko.jp\nradio-canada.ca\nradio-en-ligne.fr\nradio.co\nradio.garden\nradioaustralia.net.au\nradiohilight.net\nradiojar.com\nradioline.co\nradiovaticana.org\nradiovncr.com\nradmin-vpn.com\nrael.org\nraggedbanner.com\nraidcall.com.tw\nraindrop.io\nraizoji.or.jp\nrakuten.co.jp\nramcity.com.au\nrapidmoviez.com\nrapidvpn.com\nrarbgprx.org\nrateyourmusic.com\nrationalwiki.org\nraw.githack.com\nrawgit.com\nrawgithub.com\nrawstory.com\nrcam.target.com\nrcinet.ca\nrd.com\nreabble.com\nread01.com\nreadingtimes.com.tw\nreadmoo.com\nreadydown.com\nrealcourage.org\nrealitykings.com\nreason.com\nrecordedfuture.com\nrecoveryversion.com.tw\nred-lang.org\nredbubble.com\nredchinacn.net\nredd.it\nreddit.com\nreddithelp.com\nredditlist.com\nredditmedia.com\nredditspace.com\nredditstatic.com\nredhotlabs.com\nreferer.us\nreflectivecode.com\nrelay.firefox.com\nreligionnews.com\nrenminbao.com\nrentry.co\nrenyurenquan.org\nresilio.com\nresistchina.org\nretweetrank.com\nreuters.com\nreutersmedia.net\nrfa.org\nrferl.org\nrfi.fr\nrfi.my\nriku.me\nriseup.net\nritter.vg\nrixcloud.com\nrixcloud.us\nrlwlw.com\nrmbl.ws\nroblox.com\nrobustnessiskey.com\nrocket-inc.net\nrocket.chat\nrocksdb.org\nrojo.com\nrolfoundation.org\nrolia.net\nrolsociety.org\nronjoneswriter.com\nrou.video\nrsdlmonitor.com\nrsf-chinese.org\nrsf.org\nrsshub.app\nrssmeme.com\nrtalabel.org\nrthk.hk\nrthk.org.hk\nrti.org.tw\nrti.tw\nrtm.tnt-ea.com\nrule34.xxx\nrule34video.com\nrumble.com\nrustdesk.com\nrusvpn.com\nruten.com.tw\nrutracker.net\nrutracker.org\nrxhj.net\ns-cute.com\ns.yimg.com\ns3-ap-northeast-1.amazonaws.com\nsacks.com\nsacom.hk\nsadistic-v.com\nsadpanda.us\nsafechat.com\nsafeguarddefenders.com\nsafervpn.com\nsagernet.org\nsaintyculture.com\nsakuralive.com\nsalvation.org.hk\nsankakucomplex.com\nsankei.com\nsanmin.com.tw\nsavethedate.foo\nsavethesounds.info\nsavetibet.de\nsavetibet.org\nsavetibetstore.org\nsaveuighur.org\nsbme.me\nsbti.unun.dev\nscache.vzw.com\nscache1.vzw.com\nscache2.vzw.com\nschema.org\nscmp.com\nscramble.io\nscratch.mit.edu\nscribd.com\nscriptspot.com\nsearch.aol.com\nsearch.com\nsearch.xxx\nsearch.yahoo.co.jp\nsearx.me\nseattlefdc.com\nsecretchina.com\nsecretgarden.no\nsecretsline.biz\nsecure.hustler.com\nsecure.logmein.com\nsecure.shadowsocks.nu\nsecureservercdn.net\nsecuretunnel.com\nsecurityinabox.org\nsecuritykiss.com\nseed4.me\nseevpn.com\nseezone.net\nsehuatang.net\nsehuatang.org\nsensortower.com\nsesawe.net\nsethwklein.net\nsetn.com\nsevenload.com\nsex.com\nsex3.com\nsex8.cc\nsexinsex.net\nsf.net\nsfshibao.com\nsftuk.org\nshadeyouvpn.com\nshadowsocks.be\nshadowsocks.com.hk\nshadowsocks.org\nshahit.biz\nshare-videos.se\nshare.america.gov\nsharecool.org\nshattered.io\nsheet.new\nsheets.new\nshellfire.de\nshenyunperformingarts.org\nshenyunshop.com\nshenzhoufilm.com\nshenzhouzhengdao.org\nshiksha.com\nshitjournal.org\nshixiao.org\nshizhao.org\nshodanhq.com\nshooshtime.com\nshopee.tw\nshopping.yahoo.co.jp\nshowwe.tw\nshutterstock.com\nshwchurch.org\nshwchurch3.com\nsidelinesnews.com\nsignal.org\nsilvergatebank.com\nsimbolostwitter.com\nsimianx.ai\nsimplecd.me\nsimplecd.org\nsimpleswap.io\nsimplex.chat\nsina.com.hk\nsingaporepools.com.sg\nsinglelogin.se\nsingtao.com\nsingtaousa.com\nsinoants.com\nsinoca.com\nsinocast.com\nsinoinsider.com\nsipml5.org\nsis001.com\nsite.new\nsitekreator.com\nsitemaps.org\nsites.new\nsix-degrees.io\nsketchappsources.com\nskimtube.com\nskybet.com\nskyvegas.com\nskyxvpn.com\nslacker.com\nslashine.onl\nsleazyfork.org\nslheng.com\nslickvpn.com\nslides.com\nslides.new\nslideshare.net\nslutmoonbeam.com\nsm-miracle.com\nsmartdnsproxy.com\nsmh.com.au\nsmn.news\nsnapseed.com\nsndcdn.com\nsobees.com\nsoc.mil\nsocial.datalabour.com\nsocial.edu.ci\nsocialblade.com\nsocks-proxy.net\nsockslist.net\nsocrec.org\nsoftether-download.com\nsoftether.org\nsoftfamous.com\nsoftwarebychuck.com\nsoftwaredownload.gitbooks.io\nsogclub.com\nsogrady.me\nsoh.tw\nsohcradio.com\nsohfrance.org\nsolana.com\nsolarsystem.nasa.gov\nsolscan.io\nsolv.finance\nsomee.com\nsongjianjun.com\nsora.com\nsorting-algorithms.com\nsos.org\nsosad.fun\nsosreader.com\nsoubory.com\nsoulcaliburhentai.net\nsoundcloud.com\nsoundofhope.org\nsoundon.fm\nsoup.io\nsouth-plus.net\nsouth-plus.org\nsouthmongolia.org\nsouthnews.com.tw\nsouthpark.cc.com\nsowers.org.hk\nspaces.hightail.com\nspacex.com\nspankbang.com\nsparkpool.com\nspatial.io\nspb.com\nspeakerdeck.com\nspeedcat.me\nspeedify.com\nspencertipping.com\nspendee.com\nspicevpn.com\nspideroak.com\nspiderpool.com\nsports.williamhill.com\nspotflux.com\nspotify.com\nspreadsheet.new\nspreadshirt.es\nspreaker.com\nspring4u.info\nspringboardplatform.com\nspringwood.me\nsproutcore.com\nsquirrelvpn.com\nss-link.com\nss7.vzw.com\nssglobal.co\nssl.webpack.de\nsspanel.net\nssr.tools\nssrshare.com\nssrshare.us\nssrtool.com\nsstm.moe\nsstmlt.moe\nsstmlt.net\nstandard.co.uk\nstandupfortibet.org\nstandwithhk.org\nstarp2p.com\nstartpage.com\nstartuplivingchina.com\nstatic-economist.com\nstatic.pocketcasts.com\nstatic.shemalez.com\nstaticflickr.com\nstboy.net\nstc.com.sa\nsteamcommunity.com\nsteamladder.com\nsteamstatic.com\nsteel-storm.com\nsteemit.com\nsteganos.com\nstephaniered.com\nsthoo.com\nstitcher.com\nstoptibetcrisis.net\nstorage.yandex.net\nstoragenewsletter.com\nstore.steampowered.com\nstorj.io\nstorm.mg\nstorry.tv\nstoweboyd.com\nstraitstimes.com\nstraplessdildo.com\nstreamable.com\nstreamate.com\nstreamingthe.net\nstrongvpn.com\nstudentsforafreetibet.org\nstumbleupon.com\nsubhd.tv\nsubstack.com\nsuche.gmx.net\nsugarsync.com\nsugumiru18.com\nsuissl.com\nsujiatun.wordpress.com\nsumrando.com\nsundayguardianlive.com\nsunmedia.ca\nsuno.ai\nsuno.com\nsunporno.com\nsupchina.com\nsuperpages.com\nsupervpn.net\nsuperzooi.com\nsuprememastertv.com\nsurfeasy.com\nsurfeasy.com.au\nsurfshark.com\nsurrenderat20.net\nswagbucks.com\nswapspace.co\nswissinfo.ch\nswissvpn.net\nswitch1.jp\nswitchvpn.net\nsydneytoday.com\nsylfoundation.org\nsynapse.org\nsyncback.com\nsynergyse.com\nsyosetu.com\nt-g.com\nt.co\nt.me\nt66y.com\ntaa-usa.org\ntaaze.tw\ntaedp.org.tw\ntagwalk.com\ntails.net\ntaipeisociety.org\ntaipeitimes.com\ntaisounds.com\ntaiwanhot.net\ntaiwanjustice.net\ntaiwanncf.org.tw\ntaiwannews.com.tw\ntaiwantt.org.tw\ntalkatone.com\ntalkboxapp.com\ntalkcc.com\ntalkonly.net\ntanc.org\ntanks.gg\ntaoism.net\ntap.io\ntapanwap.com\ntapatalk.com\ntaptap.io\ntardigrade.io\ntarr.uspto.gov\ntaup.net\ntaweet.com\ntbcollege.org\ntbsec.org\ntbsn.org\ntbssqh.org\nteachparentstech.org\ntechnews.tw\ntechviz.net\nteck.in\nteco-hk.org\nteco-mo.org\nteddysun.com\ntehrantimes.com\ntelega.one\ntelegra.ph\ntelegram.dog\ntelegram.me\ntelegram.org\ntelegram.space\ntelegramdownload.com\ntelesco.pe\ntellapart.com\ntemu.com\ntenor.com\ntensorflow.org\ntenzinpalmo.com\nterabox.com\nterobox.com\ntew.org\ntextnow.com\ntextnow.me\ntfc-taiwan.org.tw\ntfhub.dev\ntfiflve.com\ntg-me.com\ntg.dev\ntheatlantic.com\ntheatrum-belli.com\nthebcomplex.com\ntheblaze.com\nthebobs.com\nthebodyshop-usa.com\nthecenter.mit.edu\nthechasernews.co.uk\nthechinacollection.org\ntheconversation.com\nthedalailamamovie.com\nthediplomat.com\nthedw.us\ntheepochtimes.com\nthefacebook.com\nthegay.com\nthegioitinhoc.vn\ntheguardian.com\nthehansindia.com\nthehindu.com\nthehun.net\ntheinitium.com\nthenewslens.com\nthepiratebay.org\ntheporndude.com\ntheportalwiki.com\ntheprint.in\nthesaturdaypaper.com.au\nthestandnews.com\nthetatoken.org\nthetibetpost.com\nthetvdb.com\nthewgo.org\nthewirechina.com\ntheync.com\nthinkchina.sg\nthinkgeek.com\nthinkingtaiwan.com\nthinkwithgoogle.com\nthirdmill.org\nthisav.com\nthomasbernhard.org\nthreadreaderapp.com\nthreads.com\nthreads.net\nthroughnightsfire.com\nthuhole.com\nthywords.com\ntiananmenduizhi.com\ntiananmenuniv.com\ntiananmenuniv.net\ntiandixing.org\ntianti.io\ntiantibooks.org\ntibet-envoy.eu\ntibet-initiative.de\ntibet.com\ntibet.net\ntibet.nu\ntibet.org\ntibet.org.tw\ntibet.to\ntibet3rdpole.org\ntibetaction.net\ntibetanbuddhistinstitute.org\ntibetancommunity.org\ntibetancommunityuk.net\ntibetanentrepreneurs.org\ntibetanhealth.org\ntibetanliberation.org\ntibetansports.org\ntibetanwomen.org\ntibetanyouthcongress.org\ntibetcorps.org\ntibetexpress.net\ntibetfocus.com\ntibetfund.org\ntibetgermany.de\ntibethouse.jp\ntibethouse.org\ntibethouse.us\ntibetmuseum.org\ntibetnetwork.org\ntibetoffice.ch\ntibetoffice.com.au\ntibetoffice.org\ntibetonline.com\ntibetonline.tv\ntibetoralhistory.org\ntibetpolicy.eu\ntibetrelieffund.co.uk\ntibetsociety.com\ntibetsun.com\ntibetsupportgroup.org\ntibetswiss.ch\ntibettelegraph.com\ntibettimes.net\ntibettruth.com\ntibetwrites.org\ntigervpn.com\ntiktok.com\ntiktokcdn-eu.com\ntiktokcdn-us.com\ntiktokcdn.com\ntiktokv.com\ntiktokv.us\ntiltbrush.com\ntimdir.com\ntime.com\ntimesnownews.com\ntimesofindia.indiatimes.com\ntimtales.com\ntinc-vpn.org\ntineye.com\ntingtalk.me\ntiny.cc\ntinychat.com\ntinypaste.com\ntinyurl.com\ntipas.net\ntkcs-collins.com\ntl.gd\ntma.co.jp\ntmagazine.com\ntmi.me\ntmpp.org\ntn1.shemalez.com\ntn2.shemalez.com\ntn3.shemalez.com\ntnaflix.com\ntnp.org\nto-porno.com\ntogetter.com\ntoken.im\ntokenlon.im\ntokyo-porn-tube.com\ntokyocn.com\ntomp3.cc\ntop.tv\ntop10vpn.com\ntopbtc.com\ntoppornsites.com\ntopsy.com\ntoptip.ca\ntoptoon.net\ntor.eff.org\ntorguard.net\ntorlock.com\ntorproject.org\ntorrentgalaxy.to\ntorrentkitty.tv\ntorrentprivacy.com\ntorrentproject.se\ntorrenty.org\ntortoisesvn.net\ntorvpn.com\ntosh.comedycentral.com\ntotalvpn.com\ntou.tv\ntpi.org.tw\ntracfone.com\ntradingview.com\ntranslate.goog\ntransparency.org\ntreemall.com.tw\ntrendsmap.com\ntronscan.org\ntrouw.nl\ntrt.net.tr\ntruebuddha-md.org\ntrustwallet.com\ntruthsocial.com\ntryheart.jp\ntsdr.uspto.gov\ntt1069.com\ntttan.com\nttv.com.tw\nttvnw.net\ntube8.com\ntube911.com\ntubeislam.com\ntubepornclassic.com\ntubewolf.com\ntuidang.org\ntukaani.org\ntumblr.com\ntumutanzi.com\ntumview.com\ntunein.com\ntunein.streamguys1.com\ntunnelbear.com\ntunnelblick.net\ntunnelr.com\ntunsafe.com\nturbobit.net\nturbohide.com\nturkistantimes.com\nturntable.fm\ntushycash.com\ntuvpn.com\ntuzaijidi.com\ntv.com\ntv.jtbc.joins.com\ntvbanywhere.com\ntvboxnow.com\ntvunetworks.com\ntw-blog.com\ntw.jiepang.com\ntw01.org\ntwapperkeeper.com\ntwaud.io\ntwblogger.com\ntweepguide.com\ntweepml.org\ntweetbackup.com\ntweetboard.com\ntweetcs.com\ntweetdeck.com\ntweetedtimes.com\ntweetphoto.com\ntweetree.com\ntweettunnel.com\ntweetwally.com\ntweez.net\ntwelve.today\ntwerkingbutt.com\ntwftp.org\ntwgov.tw\ntwgreatdaily.com\ntwibble.de\ntwibs.com\ntwicountry.org\ntwiends.com\ntwifan.com\ntwiffo.com\ntwiggit.org\ntwimg.com\ntwimg.edgesuite.net\ntwip.me\ntwipple.jp\ntwishort.com\ntwister.net.co\ntwitch.tv\ntwitchcdn.net\ntwitiq.com\ntwitlonger.com\ntwitoaster.com\ntwitonmsn.com\ntwitpic.com\ntwitstat.com\ntwitter.com\ntwitter.jp\ntwitter4j.org\ntwittercounter.com\ntwittergadget.com\ntwitterkr.com\ntwittermail.com\ntwitterrific.com\ntwittertim.es\ntwitturk.com\ntwitturly.com\ntwkan.com\ntwreporter.org\ntwt.tl\ntwtkr.com\ntwttr.com\ntx.me\ntycool.com\ntypepad.com\ntypeset.io\ntypora.io\nu15.info\nu9un.com\nua5v.com\nub0.cc\nubddns.org\nuberproxy.net\nuc-japan.org\nuchicago.edu\nudn.com\nudn.com.tw\nudomain.hk\nuforadio.com.tw\nuhdwallpapers.org\nuhrp.org\nuighur.nl\nuku.im\nulop.net\nultrasurf.us\nultravpn.com\nultravpn.fr\nunblock-us.com\nunblock.cn.com\nunblockdmm.com\nunblocksit.es\nuncyclopedia.hk\nuncyclopedia.tw\nunderwoodammo.com\nunholyknight.com\nunirule.cloud\nuniswap.org\nunknownspace.org\nunmineable.com\nunseen.is\nunstable.icu\nunwire.hk\nuocn.org\nup.audio\nupbit.com\nupdates.tdesktop.com\nupghsbc.com\nupmedia.mg\nupornia.com\nuproxy.org\nuptodown.com\nuraban.me\nurbandictionary.com\nurbansurvival.com\nurchin.com\nurlborg.com\nurlparser.com\nusacn.com\nusaip.eu\nuscardforum.com\nuscg.mil\nuscnpm.org\nuse.typekit.net\nusercontent.goog\nusfk.mil\nusma.edu\nusno.navy.mil\nustibetcommittee.org\nustream.tv\nutopianpal.com\nuujiasu.com\nuukanshu.com\nuupool.cn\nuvwxyz.xyz\nuwants.com\nuyghur-j.org\nuyghuraa.org\nuyghuramerican.org\nuyghurbiz.org\nuyghurcongress.org\nuyghurpen.org\nuyghurstudies.org\nuyghurtribunal.com\nuygur.fc2web.com\nuymaarip.com\nv2.help\nv2.hysteria.network\nv2ex.com\nv2fly.org\nv2ray.com\nv2raycn.com\nvaleursactuelles.com\nvansky.com\nvaticannews.va\nvatn.org\nvcf-online.org\nvcfbuilder.org\nvegas.williamhill.com\nvegasred.com\nvenetianmacao.com\nventureswell.com\nvercel.app\nvern.cc\nverybs.com\nvevo.com\nvewas.net\nviber.com\nvictimsofcommunism.org\nvid.me\nvidble.com\nvideo.aol.com\nvideobam.com\nvideomega.tv\nvideopress.com\nvilanet.me\nvilavpn.com\nvimeo.com\nvimeocdn.com\nvimperator.org\nvincnd.com\nvine.co\nvinniev.com\nvip-enterprise.com\nvirtualrealporn.com\nviu.com\nviu.tv\nvivaldi.com\nvivthomas.com\nvjav.com\nvllcs.org\nvmixcore.com\nvmpsoft.com\nvnet.link\nvoacambodia.com\nvoacantonese.com\nvoachinese.com\nvoachineseblog.com\nvoaindonesia.com\nvoanews.com\nvoatibetan.com\nvoatibetanenglish.com\nvocaroo.com\nvocus.cc\nvod-abematv.akamaized.net\nvod.wwe.com\nvoicettank.org\nvot.org\nvovo2000.com\nvoxer.com\nvpl.bibliocommons.com\nvpn.ac\nvpn.cmu.edu\nvpn.net\nvpn.sv.cmu.edu\nvpn4all.com\nvpnaccount.org\nvpnaccounts.com\nvpncoupons.com\nvpncup.com\nvpndada.com\nvpnforgame.net\nvpngate.jp\nvpngate.net\nvpnhub.com\nvpninja.net\nvpnjack.com\nvpnmaster.com\nvpnmentor.com\nvpnpick.com\nvpnpop.com\nvpnpronet.com\nvpnproxymaster.com\nvpnreactor.com\nvpnreviewz.com\nvpnsecure.me\nvpnshazam.com\nvpnshieldapp.com\nvpntunnel.com\nvpnuk.info\nvpnunlimitedapp.com\nvpnvip.com\nvporn.com\nvpsxb.net\nvrchat.com\nvrporn.com\nvrsmash.com\nvtunnel.com\nvultryhw.com\nw-pool.com\nw3s.link\nwaffle1999.com\nwainao.me\nwalletconnect.com\nwalletconnect.org\nwallmama.com\nwallpapercasa.com\nwallsttv.com\nwallzhihu.com\nwaltermartin.com\nwaltermartin.org\nwanderinghorse.net\nwangafu.net\nwangjinbo.org\nwango.org\nwant-daily.com\nwanz-factory.com\nwarroom.org\nwaselpro.com\nwashingtonpost.com\nwatchinese.com\nwatchmygf.net\nwatchout.tw\nwattpad.com\nwav.tv\nwaveprotocol.org\nwaybig.com\nwaymo.com\nwd.bible\nwealth.com.tw\nwearn.com\nweb.dev\nweb2project.net\nwebmproject.org\nwebpkgcache.com\nwebrtc.org\nwebsdr.org\nwebsite.new\nwebwarper.net\nwechatlawsuit.com\nweebly.com\nwefightcensorship.org\nwego.here.com\nweights.com\nweijingsheng.org\nweiming.info\nweisuo.ws\nwelt.de\nwemigrate.org\nwengewang.org\nwenxuecity.com\nwenyunchao.com\nwenzhao.ca\nwestca.com\nwesternwolves.com\nwestpoint.edu\nwezone.net\nwforum.com\nwhatblocked.com\nwhatbrowser.org\nwhats.new\nwhatsapp.com\nwhatsapp.net\nwhatsonweibo.com\nwheelockslatin.com\nwhereiswerner.com\nwheretowatch.com\nwhispersystems.org\nwhoer.net\nwhyx.org\nwidevine.com\nwiki.gamerp.jp\nwiki.jqueryui.com\nwiki.metacubex.one\nwiki.oauth.net\nwiki.phonegap.com\nwikibooks.org\nwikidata.org\nwikileaks.ch\nwikileaks.com\nwikileaks.de\nwikileaks.eu\nwikileaks.lu\nwikileaks.org\nwikileaks.pl\nwikiless.funami.tech\nwikimapia.org\nwikimedia.org\nwikinews.org\nwikipedia.com\nwikipedia.org\nwikis.tw\nwikisource.org\nwikiunblocked.org\nwikiversity.org\nwikivoyage.org\nwikiwand.com\nwiktionary.org\nwillw.net\nwilsoncenter.org\nwindscribe.com\nwingamestore.com\nwingy.site\nwionews.com\nwire.com\nwiredbytes.com\nwiredpen.com\nwireguard.com\nwisevid.com\nwispbyte.com\nwithgoogle.com\nwithyoutube.com\nwitopia.net\nwizcrafts.net\nwjbk.org\nwmflabs.org\nwmfusercontent.org\nwn.com\nwnacg.com\nwnacg.org\nwo.tc\nwo3ttt.wordpress.com\nwoeser.com\nwokar.org\nwolfax.com\nwombo.ai\nwoolyss.com\nwoopie.jp\nwoopie.tv\nwordpress.com\nwork2icu.org\nworkatruna.com\nworkerempowerment.org\nworkers.dev\nworldvpn.net\nwowgirls.com\nwowhead.com\nwowporn.com\nwoyaolian.org\nwp.com\nwpoforum.com\nwritesonic.com\nwsj.com\nwsj.net\nwufafangwen.com\nwufi.org.tw\nwujieliulan.com\nwunderground.com\nwuw.red\nwwitv.com\nwww.ajsands.com\nwww.antd.org\nwww.aolnews.com\nwww.clashverge.dev\nwww.cmoinc.org\nwww.dmm.com\nwww.eastturkistan.net\nwww.gmiddle.com\nwww.gmiddle.net\nwww.hoyolab.com\nwww.hustlercash.com\nwww.idlcoyote.com\nwww.kindleren.com\nwww.lorenzetti.com.br\nwww.m-sport.co.uk\nwww.monlamit.org\nwww.moztw.org\nwww.msn.com\nwww.oxid.it\nwww.powerpointninja.com\nwww.s4miniarchive.com\nwww.shadowsocks.com\nwww.skype.com\nwww.tablesgenerator.com\nwww.taiwanonline.cc\nwww.wan-press.org\nwww.websnapr.com\nwww.xicons.org\nwww.zensur.freerk.com\nwxw.cat\nwxw.moe\nx-art.com\nx-berry.com\nx-wall.org\nx.ai\nx.co\nx.com\nx.company\nx3guide.com\nxbabe.com\nxbookcn.com\nxbtce.com\nxcafe.in\nxcancel.com\nxcity.jp\nxdaforums.com\nxerotica.com\nxfinity.com\nxfxssr.me\nxgmyd.com\nxhamster.com\nxianjian.tw\nxiaohexie.com\nxiaolan.me\nxiaoma.org\nxiaomi.eu\nxiaxiaoqiang.net\nxijie.wordpress.com\nxing.com\nxinjiangpolicefiles.org\nxinmiao.com.hk\nxjtravelguide.com\nxm.com\nxml-training-guide.com\nxn--11xs86f.icu\nxn--1jqvh729avzfcy2d8ummib.com\nxn--4gq171p.com\nxn--9iqy04a7fi01l.com\nxn--9pr62r24a.com\nxn--czq75pvv1aj5c.org\nxn--i2ru8q2qg.com\nxn--kcrv3utim32hx9f6qe.com\nxn--ngstr-lra8j.com\nxn--noss43i.com\nxn--oiq.cc\nxn--p8j9a0d9c9a.xn--q9jyb4c\nxn--u2u927b.com\nxnpool.com\nxnxx.com\nxpud.org\nxsden.info\nxskywalker.com\nxt.com\nxt.pub\nxtube.com\nxuchao.net\nxuchao.org\nxuehua.us\nxvbelink.com\nxvideos-cdn.com\nxvideos.com\nxvideos.es\nxvinlink.com\nxxx.com\nxxx.xxx\nxxxx.com.au\nxxxymovies.com\ny2mate.com\nyadi.sk\nyahoo.com\nyahoo.com.hk\nyahoo.com.tw\nyakbutterblues.com\nyam.com\nyam.org.tw\nyande.re\nyangzhi.org\nyasni.co.uk\nyasukuni.or.jp\nyeahteentube.com\nyecl.net\nyeelou.com\nyeeyi.com\nyegle.net\nyes-news.com\nyes123.com.tw\nyesasia.com\nyesasia.com.hk\nyespornplease.com\nyeyeclub.com\nyfsp.tv\nyhcw.net\nyibaochina.com\nyidio.com\nyigeni.com\nyipub.com\nyizhihongxing.com\nyobit.net\nyobt.tv\nyogichen.org\nyou-get.org\nyou.com\nyoujizz.com\nyoumaker.com\nyoumind.com\nyoupai.org\nyouporn.com\nyouporngay.com\nyourepeat.com\nyourlisten.com\nyourlust.com\nyousendit.com\nyoutu.be\nyoutube-nocookie.com\nyoutube.com\nyoutubeeducation.com\nyoutubegaming.com\nyoutubekids.com\nyouversion.com\nyouwin.com\nyouxu.info\nyt.be\nytimg.com\nytn.co.kr\nyulghun.com\nyunchao.net\nyunomi.tokyo\nyvesgeleyn.com\nyyii.org\nyyjlymb.xyz\nyysub.net\nyzzk.com\nz-lib.fm\nz-lib.fo\nz-lib.gd\nz-lib.gl\nz-lib.io\nz-lib.org\nz-library.ec\nz-library.sk\nzalmos.com\nzamimg.com\nzaochenbao.com\nzattoo.com\nzb.com\nzdnet.com.tw\nzello.com\nzenmate.com\nzenmate.com.ru\nzerohedge.com\nzeronet.io\nzh-hans.cfsh99.com\nzh.ecdm.wikia.com\nzh.pokerstrategy.com\nzh.wikiquote.org\nzhangtianliang.com\nzhanlve.org\nzhao.1984.city\nzhengjian.org\nzhengwunet.org\nzhenxiang.biz\nzhizhu.top\nzhongguo.ca\nzhongguotese.net\nzhongzidi.com\nzhuatieba.com\nzhuichaguoji.org\nzi.media\nzillionk.com\nzim.vn\nzinio.com\nzmedia.com.tw\nzmw.cn\nzodgame.xyz\nzonaeuropa.com\nzonghexinwen.com\nzoogvpn.com\nzoominfo.com\nzooqle.com\nzootool.com\nzophar.net\nzorrovpn.com\nzozotown.com\nzpn.im\nzspeeder.me\nzuo.la\nzuobiao.me\nzuola.com\nzvereff.com\nzynamics.com\nzyxel.com\nzzcloud.me\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/rules/lanlist_ipv4",
    "content": "0.0.0.0/8\n10.0.0.0/8\n100.64.0.0/10\n127.0.0.0/8\n169.254.0.0/16\n172.16.0.0/12\n192.0.0.0/24\n192.0.2.0/24\n192.88.99.0/24\n192.168.0.0/16\n198.51.100.0/24\n203.0.113.0/24\n224.0.0.0/4\n233.252.0.0/24\n240.0.0.0/4\n255.255.255.255/32\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/rules/lanlist_ipv6",
    "content": "::/128\n::1/128\n::ffff:0:0/96\n::ffff:0:0:0/96\n64:ff9b::/96\n64:ff9b:1::/48\n100::/64\n2001::/32\n2001:20::/28\n2001:db8::/32\n2002::/16\n3fff::/20\n5f00::/16\nfc00::/7\nfe80::/64\nff00::/8\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/rules/proxy_host",
    "content": "engage.cloudflareclient.com\ngithub.com\nbing.com\nc.mi.com\napple-relay.apple.com\n\n#google\ngoogleapis.cn\ngoogleapis.com\ngoogle.com.tw\ngoogle.com.hk\ngstatic.com\nxn--ngstr-lra8j.com\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/rules/proxy_ip",
    "content": "149.154.160.0/20\n91.108.4.0/22\n91.108.56.0/24\n109.239.140.0/24\n67.198.55.0/24\n8.8.4.4\n8.8.8.8\n208.67.222.222\n208.67.220.220\n104.16.249.249\n104.16.248.249\n1.1.1.1\n1.1.1.2\n1.0.0.1\n9.9.9.9\n149.112.112.112\n2001:67c:4e8::/48\n2001:b28:f23c::/48\n2001:b28:f23d::/48\n2001:b28:f23f::/48\n2001:b28:f242::/48\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/socks_auto_switch.sh",
    "content": "#!/bin/sh\n\n. /usr/share/passwall/utils.sh\nAPP_FILE=${APP_PATH}/app.sh\n\nflag=0\n\ncheck_process() {\n\twhile pgrep -af \"${CONFIG}/\" | grep -E 'app\\.sh.*(start|stop)|nftables\\.sh|iptables\\.sh|subscribe\\.lua' >/dev/null; do\n\t\tsleep 6s\n\tdone\n}\n\ntest_url() {\n\tlocal url=$1\n\tlocal try=1\n\t[ -n \"$2\" ] && try=$2\n\tlocal timeout=2\n\t[ -n \"$3\" ] && timeout=$3\n\tlocal extra_params=$4\n\tif /usr/bin/curl --help all | grep -q \"\\-\\-retry-all-errors\"; then\n\t\textra_params=\"--retry-all-errors ${extra_params}\"\n\tfi\n\tlocal status=$(/usr/bin/curl -I -o /dev/null -skL ${extra_params} --connect-timeout ${timeout} --retry ${try} -w %{http_code} \"$url\")\n\tcase \"$status\" in\n\t\t204)\n\t\t\tstatus=200\n\t\t;;\n\tesac\n\techo $status\n}\n\ntest_proxy() {\n\tlocal result=0\n\tlocal status=$(test_url \"${probe_url}\" ${retry_num} ${connect_timeout} \"-x socks5h://127.0.0.1:${socks_port}\")\n\tif [ \"$status\" = \"200\" ]; then\n\t\tresult=0\n\telse\n\t\tlocal status2=$(test_url \"https://www.baidu.com\" ${retry_num} ${connect_timeout})\n\t\tif [ \"$status2\" = \"200\" ]; then\n\t\t\tresult=1\n\t\telse\n\t\t\tresult=2\n\t\t\tping -c 3 -W 1 223.5.5.5 > /dev/null 2>&1\n\t\t\t[ $? -eq 0 ] && {\n\t\t\t\tresult=1\n\t\t\t}\n\t\tfi\n\tfi\n\techo $result\n}\n\ntest_node() {\n\tlocal node_id=$1\n\tlocal _type=$(echo $(config_n_get ${node_id} type) | tr 'A-Z' 'a-z')\n\t[ -n \"${_type}\" ] && {\n\t\tcheck_process\n\t\tlocal _tmp_port=$(get_new_port 48800 tcp,udp)\n\t\tNO_REC_PROCESS=1 $APP_FILE run_socks flag=\"test_node_${node_id}\" node=${node_id} bind=127.0.0.1 socks_port=${_tmp_port} config_file=test_node_${node_id}.json\n\t\tsleep 2s\n\t\tlocal curlx=\"socks5h://127.0.0.1:${_tmp_port}\"\n\t\tlocal _proxy_status=$(test_url \"${probe_url}\" ${retry_num} ${connect_timeout} \"-x $curlx\")\n\t\t# 结束 SS 插件进程\n\t\tlocal pid_file=\"/tmp/etc/${CONFIG}/test_node_${node_id}_plugin.pid\"\n\t\t[ -s \"$pid_file\" ] && kill -9 \"$(head -n 1 \"$pid_file\")\" >/dev/null 2>&1\n\t\tpgrep -af \"test_node_${node_id}\" | awk '! /socks_auto_switch\\.sh/{print $1}' | xargs kill -9 >/dev/null 2>&1\n\t\trm -rf /tmp/etc/${CONFIG}/test_node_${node_id}*.*\n\t\tif [ \"${_proxy_status}\" -eq 200 ]; then\n\t\t\treturn 0\n\t\tfi\n\t}\n\treturn 1\n}\n\ntest_auto_switch() {\n\tflag=$((flag + 1))\n\tlocal b_nodes=$1\n\tlocal now_node=$2\n\t[ -z \"$now_node\" ] && {\n\t\tif [ -n \"$(get_cache_var \"socks_${id}\")\" ]; then\n\t\t\tnow_node=$(get_cache_var \"socks_${id}\")\n\t\telse\n\t\t\t#echolog \"Socks切换检测：未知错误\"\n\t\t\treturn 1\n\t\tfi\n\t}\n\n\t[ $flag -le 1 ] && {\n\t\tmain_node=$now_node\n\t}\n\n\tlocal status=$(test_proxy)\n\tif [ \"$status\" = \"2\" ]; then\n\t\techolog \"Socks切换检测：无法连接到网络，请检查网络是否正常！\"\n\t\treturn 2\n\tfi\n\n\t#检测主节点是否能使用\n\tif [ \"$restore_switch\" = \"1\" ] && [ -n \"$main_node\" ] && [ \"$now_node\" != \"$main_node\" ]; then\n\t\ttest_node ${main_node}\n\t\t[ $? -eq 0 ] && {\n\t\t\tcheck_process\n\t\t\t#主节点正常，切换到主节点\n\t\t\techolog \"Socks切换检测：端口[${socks_port}] 主节点【$(config_n_get $main_node type)：[$(config_n_get $main_node remarks)]】正常，切换到主节点！\"\n\t\t\tNO_REC_PROCESS=1 $APP_FILE socks_node_switch flag=${id} new_node=${main_node}\n\t\t\t[ $? -eq 0 ] && {\n\t\t\t\techolog \"Socks切换检测：端口[${socks_port}] 节点切换完毕！\"\n\t\t\t}\n\t\t\treturn 0\n\t\t}\n\tfi\n\n\tif [ \"$status\" = \"0\" ]; then\n\t\t#echolog \"Socks切换检测：${id}【$(config_n_get $now_node type)：[$(config_n_get $now_node remarks)]】正常。\"\n\t\treturn 0\n\telif [ \"$status\" = \"1\" ]; then\n\t\tlocal new_node msg\n\t\tif [ \"$backup_node_num\" -gt 1 ]; then\n\t\t\t# 有多个后备节点时\n\t\t\tlocal first_node found node\n\t\t\tfor node in $b_nodes; do\n\t\t\t\t[ -z \"$first_node\" ] && first_node=\"$node\"       # 记录第一个节点\n\t\t\t\t[ \"$found\" = \"1\" ] && { new_node=\"$node\"; break; } # 找到当前节点后取下一个\n\t\t\t\t[ \"$node\" = \"$now_node\" ] && found=1             # 标记找到当前节点\n\t\t\tdone\n\t\t\t# 如果没找到当前节点，或者当前节点是最后一个，就取第一个节点\n\t\t\t[ -z \"$new_node\" ] && new_node=\"$first_node\"\n\t\t\tmsg=\"切换到$([ \"$now_node\" = \"$main_node\" ] && echo 备用节点 || echo 下一个备用节点)检测！\"\n\t\telse\n\t\t\t# 只有一个后备节点时，与主节点轮询\n\t\t\tnew_node=$([ \"$now_node\" = \"$main_node\" ] && echo \"$b_nodes\" || echo \"$main_node\")\n\t\t\tmsg=\"切换到$([ \"$now_node\" = \"$main_node\" ] && echo 备用节点 || echo 主节点)检测！\"\n\t\tfi\n\t\techolog \"Socks切换检测：端口[${socks_port}]【$(config_n_get $now_node type)：[$(config_n_get $now_node remarks)]】异常，$msg\"\n\t\ttest_node ${new_node}\n\t\tif [ $? -eq 0 ]; then\n#\t\t\t[ \"$restore_switch\" = \"0\" ] && {\n#\t\t\t\tuci set $CONFIG.${id}.node=$new_node\n#\t\t\t\t[ -z \"$(echo $b_nodes | grep $main_node)\" ] && uci add_list $CONFIG.${id}.autoswitch_backup_node=$main_node\n#\t\t\t\tuci commit $CONFIG\n#\t\t\t}\n\t\t\tcheck_process\n\t\t\techolog \"Socks切换检测：端口[${socks_port}]【$(config_n_get $new_node type)：[$(config_n_get $new_node remarks)]】正常，切换到此节点！\"\n\t\t\tNO_REC_PROCESS=1 $APP_FILE socks_node_switch flag=${id} new_node=${new_node}\n\t\t\t[ $? -eq 0 ] && {\n\t\t\t\techolog \"Socks切换检测：端口[${socks_port}] 节点切换完毕！\"\n\t\t\t}\n\t\t\treturn 0\n\t\telse\n\t\t\ttest_auto_switch \"${b_nodes}\" ${new_node}\n\t\tfi\n\tfi\n}\n\nstart() {\n\tid=$1\n\tLOCK_FILE=${LOCK_PATH}/${CONFIG}_socks_auto_switch_${id}.lock\n\tLOG_EVENT_FILTER=$(uci -q get \"${CONFIG}.global[0].log_event_filter\" 2>/dev/null)\n\tLOG_EVENT_CMD=$(uci -q get \"${CONFIG}.global[0].log_event_cmd\" 2>/dev/null)\n\tmain_node=$(config_n_get $id node)\n\tsocks_port=$(config_n_get $id port 0)\n\tdelay=$(config_n_get $id autoswitch_testing_time 30)\n\tconnect_timeout=$(config_n_get $id autoswitch_connect_timeout 3)\n\tretry_num=$(config_n_get $id autoswitch_retry_num 1)\n\trestore_switch=$(config_n_get $id autoswitch_restore_switch 0)\n\tprobe_url=$(config_n_get $id autoswitch_probe_url \"https://www.google.com/generate_204\")\n\tbackup_node=$(config_n_get $id autoswitch_backup_node)\n\tif [ -n \"$backup_node\" ]; then\n\t\tbackup_node=$(echo \"$backup_node\" | tr -s ' ' '\\n' | uniq | tr -s '\\n' ' ')\n\t\tbackup_node_num=$(printf \"%s\\n\" \"$backup_node\" | wc -w)\n\t\tif [ \"$backup_node_num\" -eq 1 ]; then\n\t\t\t[ \"$main_node\" = \"$backup_node\" ] && return\n\t\tfi\n\telse\n\t\treturn\n\tfi\n\twhile [ -n \"$backup_node\" ]; do\n\t\t[ -f \"$LOCK_FILE\" ] && {\n\t\t\tsleep 6s\n\t\t\tcontinue\n\t\t}\n\t\tcheck_process\n\t\ttouch $LOCK_FILE\n\t\ttest_auto_switch \"$backup_node\"\n\t\trm -f $LOCK_FILE\n\t\tsleep ${delay}\n\tdone\n}\n\nstart $@\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/subscribe.lua",
    "content": "#!/usr/bin/lua\n\n------------------------------------------------\n-- @author William Chan <root@williamchan.me>\n------------------------------------------------\nrequire 'luci.util'\nrequire 'luci.jsonc'\nrequire 'luci.sys'\nlocal appname = 'passwall'\nlocal api = require (\"luci.passwall.api\")\nlocal datatypes = require \"luci.cbi.datatypes\"\n\nloadfile(\"/usr/share/\" .. appname .. \"/clash_subconverter.lua\")()\n\n-- these global functions are accessed all the time by the event handler\n-- so caching them is worth the effort\nlocal tinsert = table.insert\nlocal ssub, slen, schar, sbyte, sformat, sgsub = string.sub, string.len, string.char, string.byte, string.format, string.gsub\nlocal split = api.split\nlocal jsonParse, jsonStringify = luci.jsonc.parse, luci.jsonc.stringify\nlocal base64Decode = api.base64Decode\nlocal UrlEncode = api.UrlEncode\nlocal UrlDecode = api.UrlDecode\nlocal uci = api.uci\nlocal fs = api.fs\n\nlocal has_ss = api.is_finded(\"ss-redir\")\nlocal has_ss_rust = api.is_finded(\"sslocal\")\nlocal has_ssr = api.is_finded(\"ssr-local\") and api.is_finded(\"ssr-redir\")\nlocal has_singbox = api.finded_com(\"sing-box\")\nlocal has_xray = api.finded_com(\"xray\")\nlocal has_hysteria2 = api.finded_com(\"hysteria\")\nlocal DEFAULT_ALLOWINSECURE = true\nlocal DEFAULT_FILTER_KEYWORD_MODE = uci:get(appname, \"@global_subscribe[0]\", \"filter_keyword_mode\") or \"0\"\nlocal DEFAULT_FILTER_KEYWORD_DISCARD_LIST = uci:get(appname, \"@global_subscribe[0]\", \"filter_discard_list\") or {}\nlocal DEFAULT_FILTER_KEYWORD_KEEP_LIST = uci:get(appname, \"@global_subscribe[0]\", \"filter_keep_list\") or {}\n-- 取节点使用core类型（节点订阅页面未设置时，自动取默认）\nlocal DEFAULT_SS_TYPE = api.get_core(\"ss_type\", {{has_ss,\"shadowsocks-libev\"},{has_ss_rust,\"shadowsocks-rust\"},{has_singbox,\"sing-box\"},{has_xray,\"xray\"}})\nlocal DEFAULT_TROJAN_TYPE =  api.get_core(\"trojan_type\", {{has_singbox,\"sing-box\"},{has_xray,\"xray\"}})\nlocal DEFAULT_VMESS_TYPE = api.get_core(\"vmess_type\", {{has_xray,\"xray\"},{has_singbox,\"sing-box\"}})\nlocal DEFAULT_VLESS_TYPE = api.get_core(\"vless_type\", {{has_xray,\"xray\"},{has_singbox,\"sing-box\"}})\nlocal DEFAULT_HYSTERIA2_TYPE = api.get_core(\"hysteria2_type\", {{has_hysteria2,\"hysteria2\"},{has_singbox,\"sing-box\"},{has_xray,\"xray\"}})\nlocal core_has = {\n\t[\"xray\"] = has_xray,\n\t[\"sing-box\"] = has_singbox,\n\t[\"shadowsocks-libev\"] = has_ss,\n\t[\"shadowsocks-rust\"] = has_ss_rust,\n\t[\"hysteria2\"] = has_hysteria2\n}\n-- 判断是否过滤节点关键字\nlocal function is_filter_keyword(sub_cfg, value)\n\tlocal mode = DEFAULT_FILTER_KEYWORD_MODE\n\tlocal discard_list = DEFAULT_FILTER_KEYWORD_DISCARD_LIST\n\tlocal keep_list = DEFAULT_FILTER_KEYWORD_KEEP_LIST\n\tif sub_cfg then\n\t\tlocal filter_keyword_mode = sub_cfg.filter_keyword_mode or \"5\" -- 5 is global\n\t\tif filter_keyword_mode == \"0\" then\n\t\t\tmode = \"0\"\n\t\telseif filter_keyword_mode == \"1\" then\n\t\t\tmode = \"1\"\n\t\t\tdiscard_list = sub_cfg.filter_discard_list or {}\n\t\telseif filter_keyword_mode == \"2\" then\n\t\t\tmode = \"2\"\n\t\t\tkeep_list = sub_cfg.filter_keep_list or {}\n\t\telseif filter_keyword_mode == \"3\" then\n\t\t\tmode = \"3\"\n\t\t\tkeep_list = sub_cfg.filter_keep_list or {}\n\t\t\tdiscard_list = sub_cfg.filter_discard_list or {}\n\t\telseif filter_keyword_mode == \"4\" then\n\t\t\tmode = \"4\"\n\t\t\tkeep_list = sub_cfg.filter_keep_list or {}\n\t\t\tdiscard_list = sub_cfg.filter_discard_list or {}\n\t\tend\n\tend\n\tif mode == \"1\" then\n\t\tfor k,v in ipairs(discard_list) do\n\t\t\tif value:find(v, 1, true) then\n\t\t\t\treturn true\n\t\t\tend\n\t\tend\n\telseif mode == \"2\" then\n\t\tlocal result = true\n\t\tfor k,v in ipairs(keep_list) do\n\t\t\tif value:find(v, 1, true) then\n\t\t\t\tresult = false\n\t\t\tend\n\t\tend\n\t\treturn result\n\telseif mode == \"3\" then\n\t\tlocal result = false\n\t\tfor k,v in ipairs(discard_list) do\n\t\t\tif value:find(v, 1, true) then\n\t\t\t\tresult = true\n\t\t\tend\n\t\tend\n\t\tfor k,v in ipairs(keep_list) do\n\t\t\tif value:find(v, 1, true) then\n\t\t\t\tresult = false\n\t\t\tend\n\t\tend\n\t\treturn result\n\telseif mode == \"4\" then\n\t\tlocal result = true\n\t\tfor k,v in ipairs(keep_list) do\n\t\t\tif value:find(v, 1, true) then\n\t\t\t\tresult = false\n\t\t\tend\n\t\tend\n\t\tfor k,v in ipairs(discard_list) do\n\t\t\tif value:find(v, 1, true) then\n\t\t\t\tresult = true\n\t\t\tend\n\t\tend\n\t\treturn result\n\tend\n\treturn false\nend\n\nlocal nodeResult = {} -- update result\nlocal isDebug = false\n\nlocal log = function(...)\n\tif isDebug == true then\n\t\tlocal result = os.date(\"%Y-%m-%d %H:%M:%S: \") .. table.concat({...}, \" \")\n\t\tprint(result)\n\telse\n\t\tapi.log(...)\n\tend\nend\n\nlocal nodes_table = {}\nfor k, e in ipairs(api.get_valid_nodes()) do\n\tif e.node_type == \"normal\" then\n\t\tnodes_table[#nodes_table + 1] = e\n\tend\nend\n\n-- 获取各项动态配置的当前服务器，可以用 get 和 set， get必须要获取到节点表\nlocal CONFIG = {}\ndo\n\tlocal function import_config(protocol)\n\t\tlocal name = string.upper(protocol)\n\t\tlocal szType = \"@global[0]\"\n\t\tlocal option = protocol .. \"_node\"\n\t\t\n\t\tlocal node_id = uci:get(appname, szType, option)\n\t\tCONFIG[#CONFIG + 1] = {\n\t\t\tlog = true,\n\t\t\tremarks = name .. \"节点\",\n\t\t\tcurrentNode = node_id and uci:get_all(appname, node_id) or nil,\n\t\t\tset = function(o, server)\n\t\t\t\tuci:set(appname, szType, option, server)\n\t\t\t\to.newNodeId = server\n\t\t\tend\n\t\t}\n\tend\n\timport_config(\"tcp\")\n\timport_config(\"udp\")\n\n\tif true then\n\t\tlocal i = 0\n\t\tlocal option = \"node\"\n\t\tuci:foreach(appname, \"socks\", function(t)\n\t\t\ti = i + 1\n\t\t\tlocal id = t[\".name\"]\n\t\t\tlocal node_id = t[option]\n\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\tlog = true,\n\t\t\t\tid = id,\n\t\t\t\tremarks = \"Socks节点列表[\" .. i .. \"]\",\n\t\t\t\tcurrentNode = node_id and uci:get_all(appname, node_id) or nil,\n\t\t\t\tset = function(o, server)\n\t\t\t\t\tif not server or server == \"\" then\n\t\t\t\t\t\tif #nodes_table > 0 then\n\t\t\t\t\t\t\tserver = nodes_table[1][\".name\"]\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tuci:set(appname, t[\".name\"], option, server)\n\t\t\t\t\to.newNodeId = server\n\t\t\t\tend\n\t\t\t}\n\t\t\tif t.autoswitch_backup_node and #t.autoswitch_backup_node > 0 then\n\t\t\t\tlocal flag = \"Socks节点列表[\" .. i .. \"]备用节点的列表\"\n\t\t\t\tlocal currentNodes = {}\n\t\t\t\tlocal newNodes = {}\n\t\t\t\tfor k, node_id in ipairs(t.autoswitch_backup_node) do\n\t\t\t\t\tif node_id then\n\t\t\t\t\t\tlocal currentNode = uci:get_all(appname, node_id) or nil\n\t\t\t\t\t\tif currentNode then\n\t\t\t\t\t\t\tcurrentNodes[#currentNodes + 1] = {\n\t\t\t\t\t\t\t\tlog = true,\n\t\t\t\t\t\t\t\tremarks = flag .. \"[\" .. k .. \"]\",\n\t\t\t\t\t\t\t\tcurrentNode = currentNode,\n\t\t\t\t\t\t\t\tset = function(o, server)\n\t\t\t\t\t\t\t\t\tif server and server ~= \"nil\" then\n\t\t\t\t\t\t\t\t\t\ttable.insert(o.newNodes, server)\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\t\tremarks = flag,\n\t\t\t\t\tcurrentNodes = currentNodes,\n\t\t\t\t\tnewNodes = newNodes,\n\t\t\t\t\tset = function(o, newNodes)\n\t\t\t\t\t\tif o then\n\t\t\t\t\t\t\tif not newNodes then newNodes = o.newNodes end\n\t\t\t\t\t\t\tuci:set_list(appname, id, \"autoswitch_backup_node\", newNodes or {})\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t}\n\t\t\tend\n\t\tend)\n\tend\n\n\tif true then\n\t\tlocal i = 0\n\t\tlocal option = \"lbss\"\n\t\tlocal function is_ip_port(str)\n\t\t\tif type(str) ~= \"string\" then return false end\n\t\t\tlocal ip, port = str:match(\"^([%d%.]+):(%d+)$\")\n\t\t\treturn ip and datatypes.ipaddr(ip) and tonumber(port) and tonumber(port) <= 65535\n\t\tend\n\t\tuci:foreach(appname, \"haproxy_config\", function(t)\n\t\t\ti = i + 1\n\t\t\tlocal node_id = t[option]\n\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\tlog = true,\n\t\t\t\tid = t[\".name\"],\n\t\t\t\tremarks = \"HAProxy负载均衡节点列表[\" .. i .. \"]\",\n\t\t\t\tcurrentNode = node_id and uci:get_all(appname, node_id) or nil,\n\t\t\t\tset = function(o, server)\n\t\t\t\t\t-- 如果当前 lbss 值不是 ip:port 格式，才进行修改\n\t\t\t\t\tif not is_ip_port(t[option]) then\n\t\t\t\t\t\tuci:set(appname, t[\".name\"], option, server)\n\t\t\t\t\t\to.newNodeId = server\n\t\t\t\t\tend\n\t\t\t\tend,\n\t\t\t\tdelete = function(o)\n\t\t\t\t\t-- 如果当前 lbss 值不是 ip:port 格式，才进行删除\n\t\t\t\t\tif not is_ip_port(t[option]) then\n\t\t\t\t\t\tuci:delete(appname, t[\".name\"])\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t}\n\t\tend)\n\tend\n\n\tif true then\n\t\tlocal i = 0\n\t\tlocal options = {\"tcp\", \"udp\"}\n\t\tuci:foreach(appname, \"acl_rule\", function(t)\n\t\t\ti = i + 1\n\t\t\tfor index, value in ipairs(options) do\n\t\t\t\tlocal option = value .. \"_node\"\n\t\t\t\tlocal node_id = t[option]\n\t\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\t\tlog = true,\n\t\t\t\t\tid = t[\".name\"],\n\t\t\t\t\tremarks = \"访问控制列表[\" .. i .. \"]\",\n\t\t\t\t\tcurrentNode = node_id and uci:get_all(appname, node_id) or nil,\n\t\t\t\t\tset = function(o, server)\n\t\t\t\t\t\tuci:set(appname, t[\".name\"], option, server)\n\t\t\t\t\t\to.newNodeId = server\n\t\t\t\t\tend\n\t\t\t\t}\n\t\t\tend\n\t\tend)\n\tend\n\n\tuci:foreach(appname, \"nodes\", function(node)\n\t\tlocal node_id = node[\".name\"]\n\t\tif node.protocol and node.protocol == '_shunt' then\n\t\t\tlocal rules = {}\n\t\t\tuci:foreach(appname, \"shunt_rules\", function(e)\n\t\t\t\tif e[\".name\"] and e.remarks then\n\t\t\t\t\ttable.insert(rules, e)\n\t\t\t\t\ttable.insert(rules, {\n\t\t\t\t\t\t[\".name\"] = e[\".name\"] .. \"_proxy_tag\",\n\t\t\t\t\t\tremarks = e.remarks .. \" 前置代理\"\n\t\t\t\t\t})\n\t\t\t\tend\n\t\t\tend)\n\t\t\ttable.insert(rules, {\n\t\t\t\t[\".name\"] = \"default_node\",\n\t\t\t\tremarks = \"默认\"\n\t\t\t})\n\t\t\ttable.insert(rules, {\n\t\t\t\t[\".name\"] = \"default_proxy_tag\",\n\t\t\t\tremarks = \"默认 前置代理\"\n\t\t\t})\n\n\t\t\tfor k, e in pairs(rules) do\n\t\t\t\tlocal _node_id = node[e[\".name\"]] or nil\n\t\t\t\tif _node_id and not _node_id:find(\"Socks_\") then\n\t\t\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\t\t\tlog = false,\n\t\t\t\t\t\tcurrentNode = _node_id and uci:get_all(appname, _node_id) or nil,\n\t\t\t\t\t\tremarks = \"分流\" .. e.remarks .. \"节点\",\n\t\t\t\t\t\tset = function(o, server)\n\t\t\t\t\t\t\tif not server then server = \"\" end\n\t\t\t\t\t\t\tuci:set(appname, node_id, e[\".name\"], server)\n\t\t\t\t\t\t\to.newNodeId = server\n\t\t\t\t\t\tend\n\t\t\t\t\t}\n\t\t\t\tend\n\t\t\tend\n\t\telseif node.protocol and node.protocol == '_balancing' then\n\t\t\tlocal flag = \"Xray负载均衡节点[\" .. node_id .. \"]列表\"\n\t\t\tlocal currentNodes = {}\n\t\t\tlocal newNodes = {}\n\t\t\tif node.balancing_node then\n\t\t\t\tfor k, node in pairs(node.balancing_node) do\n\t\t\t\t\tcurrentNodes[#currentNodes + 1] = {\n\t\t\t\t\t\tlog = true,\n\t\t\t\t\t\tnode = node,\n\t\t\t\t\t\tcurrentNode = (function()\n\t\t\t\t\t\t\tif node and node:find(\"Socks_\") then\n\t\t\t\t\t\t\t\treturn { Socks = node }\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\treturn node and uci:get_all(appname, node) or nil\n\t\t\t\t\t\tend)(),\n\t\t\t\t\t\tremarks = node,\n\t\t\t\t\t\tset = function(o, server)\n\t\t\t\t\t\t\tif o and server and server ~= \"nil\" then\n\t\t\t\t\t\t\t\ttable.insert(o.newNodes, server)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t}\n\t\t\t\tend\n\t\t\tend\n\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\tremarks = flag,\n\t\t\t\tcurrentNodes = currentNodes,\n\t\t\t\tnewNodes = newNodes,\n\t\t\t\tset = function(o, newNodes)\n\t\t\t\t\tif o then\n\t\t\t\t\t\tif not newNodes then newNodes = o.newNodes end\n\t\t\t\t\t\tuci:set_list(appname, node_id, \"balancing_node\", newNodes or {})\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t}\n\n\t\t\t--后备节点\n\t\t\tlocal currentNode = uci:get_all(appname, node_id) or nil\n\t\t\tif currentNode and currentNode.fallback_node and not currentNode.fallback_node:find(\"Socks_\") then\n\t\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\t\tlog = true,\n\t\t\t\t\tid = node_id,\n\t\t\t\t\tremarks = \"Xray负载均衡节点[\" .. node_id .. \"]后备节点\",\n\t\t\t\t\tcurrentNode = uci:get_all(appname, currentNode.fallback_node) or nil,\n\t\t\t\t\tset = function(o, server)\n\t\t\t\t\t\tuci:set(appname, node_id, \"fallback_node\", server)\n\t\t\t\t\t\to.newNodeId = server\n\t\t\t\t\tend,\n\t\t\t\t\tdelete = function(o)\n\t\t\t\t\t\tuci:delete(appname, node_id, \"fallback_node\")\n\t\t\t\t\tend\n\t\t\t\t}\n\t\t\tend\n\t\telseif node.protocol and node.protocol == '_urltest' then\n\t\t\tlocal flag = \"Sing-Box URLTest节点[\" .. node_id .. \"]列表\"\n\t\t\tlocal currentNodes = {}\n\t\t\tlocal newNodes = {}\n\t\t\tif node.urltest_node then\n\t\t\t\tfor k, node in pairs(node.urltest_node) do\n\t\t\t\t\tcurrentNodes[#currentNodes + 1] = {\n\t\t\t\t\t\tlog = true,\n\t\t\t\t\t\tnode = node,\n\t\t\t\t\t\tcurrentNode = (function()\n\t\t\t\t\t\t\tif node and node:find(\"Socks_\") then\n\t\t\t\t\t\t\t\treturn { Socks = node }\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\treturn node and uci:get_all(appname, node) or nil\n\t\t\t\t\t\tend)(),\n\t\t\t\t\t\tremarks = node,\n\t\t\t\t\t\tset = function(o, server)\n\t\t\t\t\t\t\tif o and server and server ~= \"nil\" then\n\t\t\t\t\t\t\t\ttable.insert(o.newNodes, server)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t}\n\t\t\t\tend\n\t\t\tend\n\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\tremarks = flag,\n\t\t\t\tcurrentNodes = currentNodes,\n\t\t\t\tnewNodes = newNodes,\n\t\t\t\tset = function(o, newNodes)\n\t\t\t\t\tif o then\n\t\t\t\t\t\tif not newNodes then newNodes = o.newNodes end\n\t\t\t\t\t\tuci:set_list(appname, node_id, \"urltest_node\", newNodes or {})\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t}\n\t\telse\n\t\t\t--前置代理节点\n\t\t\tlocal currentNode = uci:get_all(appname, node_id) or nil\n\t\t\tif currentNode and currentNode.preproxy_node and not currentNode.preproxy_node:find(\"Socks_\") then\n\t\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\t\tlog = true,\n\t\t\t\t\tid = node_id,\n\t\t\t\t\tremarks = \"节点[\" .. node_id .. \"]前置代理节点\",\n\t\t\t\t\tcurrentNode = uci:get_all(appname, currentNode.preproxy_node) or nil,\n\t\t\t\t\tset = function(o, server)\n\t\t\t\t\t\tuci:set(appname, node_id, \"preproxy_node\", server)\n\t\t\t\t\t\to.newNodeId = server\n\t\t\t\t\tend,\n\t\t\t\t\tdelete = function(o)\n\t\t\t\t\t\tuci:delete(appname, node_id, \"preproxy_node\")\n\t\t\t\t\tend\n\t\t\t\t}\n\t\t\tend\n\t\t\t--落地节点\n\t\t\tlocal currentNode = uci:get_all(appname, node_id) or nil\n\t\t\tif currentNode and currentNode.to_node and not currentNode.to_node:find(\"Socks_\") then\n\t\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\t\tlog = true,\n\t\t\t\t\tid = node_id,\n\t\t\t\t\tremarks = \"节点[\" .. node_id .. \"]落地节点\",\n\t\t\t\t\tcurrentNode = uci:get_all(appname, currentNode.to_node) or nil,\n\t\t\t\t\tset = function(o, server)\n\t\t\t\t\t\tuci:set(appname, node_id, \"to_node\", server)\n\t\t\t\t\t\to.newNodeId = server\n\t\t\t\t\tend,\n\t\t\t\t\tdelete = function(o)\n\t\t\t\t\t\tuci:delete(appname, node_id, \"to_node\")\n\t\t\t\t\tend\n\t\t\t\t}\n\t\t\tend\n\t\tend\n\tend)\n\n\tfor k, v in pairs(CONFIG) do\n\t\tif v.currentNodes and type(v.currentNodes) == \"table\" then\n\t\t\tfor kk, vv in pairs(v.currentNodes) do\n\t\t\t\tif vv.currentNode == nil then\n\t\t\t\t\tCONFIG[k].currentNodes[kk] = nil\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tif v.currentNode == nil then\n\t\t\t\tif v.delete then\n\t\t\t\t\tv.delete()\n\t\t\t\tend\n\t\t\t\tCONFIG[k] = nil\n\t\t\tend\n\t\tend\n\tend\nend\n\n-- 取机场信息（剩余流量、到期时间）\nlocal subscribe_info = {}\nlocal function get_subscribe_info(cfgid, value)\n\tif type(cfgid) ~= \"string\" or cfgid == \"\" or type(value) ~= \"string\" then\n\t\treturn\n\tend\n\tvalue = value:gsub(\"%s+\", \"\")\n\tlocal date_patterns = {\"套餐到期：(.+)\", \"过期时间：(.+)\", \"有效期至：(.+)\", \"到期时间：(.+)\", \"截止日期：(.+)\"}\n\tlocal expired_date\n\tfor _, p in ipairs(date_patterns) do expired_date = value:match(p) or expired_date end\n\tlocal rem_patterns = {\"剩余流量：(.+)\", \"流量剩余：(.+)\", \"可用流量：(.+)\", \"套餐剩余：(.+)\"}\n\tlocal rem_traffic\n\tfor _, p in ipairs(rem_patterns) do rem_traffic = value:match(p) or rem_traffic end\n\tsubscribe_info[cfgid] = subscribe_info[cfgid] or {expired_date = \"\", rem_traffic = \"\"}\n\tif expired_date then\n\t\tlocal function formatDate(str)\n\t\t\tlocal y, m, d = str:match(\"(%d%d%d%d)[-/]?(%d%d?)[-/]?(%d%d?)\")\n\t\t\tif y and m and d then\n\t\t\t\treturn y .. \".\" .. m .. \".\" .. d\n\t\t\tend\n\t\t\treturn str\n\t\tend\n\t\tsubscribe_info[cfgid][\"expired_date\"] = formatDate(expired_date)\n\tend\n\tif rem_traffic then\n\t\tsubscribe_info[cfgid][\"rem_traffic\"] = rem_traffic\n\tend\nend\n\n-- 设置 ss 协议实现类型\nlocal function set_ss_implementation(ss_type, result)\n\tif ss_type == \"shadowsocks-libev\" and has_ss then\n\t\tresult.type = \"SS\"\n\telseif ss_type == \"shadowsocks-rust\" and has_ss_rust then\n\t\tresult.type = 'SS-Rust'\n\telseif ss_type == \"xray\" and has_xray then\n\t\tresult.type = 'Xray'\n\t\tresult.protocol = 'shadowsocks'\n\t\tresult.transport = 'raw'\n\telseif ss_type == \"sing-box\" and has_singbox then\n\t\tresult.type = 'sing-box'\n\t\tresult.protocol = 'shadowsocks'\n\telse\n\t\tlog(\"跳过 SS 节点，因未适配到 SS 核心程序，或未正确设置节点使用类型。\")\n\t\treturn nil\n\tend\n\treturn result\nend\n\n-- 处理数据\nlocal function processData(szType, content, add_mode, group, sub_cfg)\n\t--log(2, content, add_mode, group)\n\tlocal sub_allowinsecure = DEFAULT_ALLOWINSECURE\n\tlocal sub_ss_type = DEFAULT_SS_TYPE\n\tlocal sub_trojan_type = DEFAULT_TROJAN_TYPE\n\tlocal sub_vmess_type = DEFAULT_VMESS_TYPE\n\tlocal sub_vless_type = DEFAULT_VLESS_TYPE\n\tlocal sub_hysteria2_type = DEFAULT_HYSTERIA2_TYPE\n\tif sub_cfg then\n\t\tif sub_cfg.allowInsecure and sub_cfg.allowInsecure ~= \"1\" then\n\t\t\tsub_allowinsecure = nil\n\t\tend\n\t\tlocal ss_type = sub_cfg.ss_type or \"global\"\n\t\tif ss_type ~= \"global\" and core_has[ss_type] then\n\t\t\tsub_ss_type = ss_type\n\t\tend\n\t\tlocal trojan_type = sub_cfg.trojan_type or \"global\"\n\t\tif trojan_type ~= \"global\" and core_has[trojan_type] then\n\t\t\tsub_trojan_type = trojan_type\n\t\tend\n\t\tlocal vmess_type = sub_cfg.vmess_type or \"global\"\n\t\tif vmess_type ~= \"global\" and core_has[vmess_type] then\n\t\t\tsub_vmess_type = vmess_type\n\t\tend\n\t\tlocal vless_type = sub_cfg.vless_type or \"global\"\n\t\tif vless_type ~= \"global\" and core_has[vless_type] then\n\t\t\tsub_vless_type = vless_type\n\t\tend\n\t\tlocal hysteria2_type = sub_cfg.hysteria2_type or \"global\"\n\t\tif hysteria2_type ~= \"global\" and core_has[hysteria2_type] then\n\t\t\tsub_hysteria2_type = hysteria2_type\n\t\tend\n\tend\n\tlocal result = {\n\t\ttimeout = 60,\n\t\tadd_mode = add_mode, --0为手动配置,1为导入,2为订阅\n\t\tgroup = group\n\t}\n\t--ssr://base64(host:port:protocol:method:obfs:base64pass/?obfsparam=base64param&protoparam=base64param&remarks=base64remarks&group=base64group&udpport=0&uot=0)\n\tif szType == 'ssr' then\n\t\tif not has_ssr then\n\t\t\tlog(\"跳过 SSR 节点，因未安装 SSR 核心程序 shadowsocksr-libev。\")\n\t\t\treturn nil\n\t\tend\n\t\tresult.type = \"SSR\"\n\n\t\tlocal dat = split(content:gsub(\"/%?\", \"?\"), \"%?\")\n\t\tlocal hostInfo = split(dat[1], ':')\n\t\tif dat[1]:match('%[(.*)%]') then\n\t\t\tresult.address = dat[1]:match('%[(.*)%]')\n\t\telse\n\t\t\tresult.address = hostInfo[#hostInfo-5]\n\t\tend\n\t\tresult.port = hostInfo[#hostInfo-4]\n\t\tresult.protocol = hostInfo[#hostInfo-3]\n\t\tresult.method = hostInfo[#hostInfo-2]\n\t\tresult.obfs = hostInfo[#hostInfo-1]\n\t\tresult.password = base64Decode(hostInfo[#hostInfo])\t\n\t\tlocal params = {}\n\t\tfor _, v in pairs(split(dat[2], '&')) do\n\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\tif s and s > 1 then\n\t\t\t\tparams[v:sub(1, s - 1)] = v:sub(s + 1)\n\t\t\tend\n\t\tend\n\t\tresult.obfs_param = base64Decode(params.obfsparam)\n\t\tresult.protocol_param = base64Decode(params.protoparam)\n\t\t-- local ssr_group = base64Decode(params.group)\n\t\t-- if ssr_group then result.ssr_group = ssr_group end\n\t\tresult.remarks = base64Decode(params.remarks)\n\telseif szType == 'vmess' then\n\t\tlocal info = jsonParse(content)\n\t\tif sub_vmess_type == \"sing-box\" and has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\telseif sub_vmess_type == \"xray\" and has_xray then\n\t\t\tresult.type = \"Xray\"\n\t\telse\n\t\t\tlog(\"跳过 VMess 节点，因未适配到 VMess 核心程序，或未正确设置节点使用类型。\")\n\t\t\treturn nil\n\t\tend\n\t\tresult.alter_id = info.aid\n\t\tresult.address = info.add\n\t\tresult.port = info.port\n\t\tresult.protocol = 'vmess'\n\t\tresult.uuid = info.id\n\t\tresult.remarks = info.ps\n\t\t-- result.mux = 1\n\t\t-- result.mux_concurrency = 8\n\n\t\tinfo.path = (info.path and info.path ~= \"\") and UrlDecode(info.path) or nil\n\n\t\tif not info.net then info.net = \"tcp\" end\n\t\tinfo.net = string.lower(info.net)\n\t\tif result.type == \"sing-box\" and info.net == \"raw\" then \n\t\t\tinfo.net = \"tcp\"\n\t\telseif result.type == \"Xray\" and info.net == \"tcp\" then\n\t\t\tinfo.net = \"raw\"\n\t\tend\n\t\tif info.net == 'h2' or info.net == 'http' then\n\t\t\tinfo.net = \"http\"\n\t\t\tresult.transport = (result.type == \"Xray\") and \"xhttp\" or \"http\"\n\t\telse\n\t\t\tresult.transport = info.net\n\t\tend\n\t\tif info.net == 'ws' then\n\t\t\tresult.ws_host = info.host\n\t\t\tresult.ws_path = info.path\n\t\t\tif result.type == \"sing-box\" and info.path then\n\t\t\t\tlocal ws_path_dat = split(info.path, \"?\")\n\t\t\t\tlocal ws_path = ws_path_dat[1]\n\t\t\t\tlocal ws_path_params = {}\n\t\t\t\tfor _, v in pairs(split(ws_path_dat[2], '&')) do\n\t\t\t\t\tlocal t = split(v, '=')\n\t\t\t\t\tws_path_params[t[1]] = t[2]\n\t\t\t\tend\n\t\t\t\tif ws_path_params.ed and tonumber(ws_path_params.ed) then\n\t\t\t\t\tresult.ws_path = ws_path\n\t\t\t\t\tresult.ws_enableEarlyData = \"1\"\n\t\t\t\t\tresult.ws_maxEarlyData = tonumber(ws_path_params.ed)\n\t\t\t\t\tresult.ws_earlyDataHeaderName = \"Sec-WebSocket-Protocol\"\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif info.net == \"http\" then\n\t\t\tif result.type == \"Xray\" then\n\t\t\t\tresult.xhttp_mode = \"stream-one\"\n\t\t\t\tresult.xhttp_host = info.host\n\t\t\t\tresult.xhttp_path = info.path\n\t\t\telse\n\t\t\t\tresult.http_host = (info.host and info.host ~= \"\") and { info.host } or nil\n\t\t\t\tresult.http_path = info.path\n\t\t\tend\n\t\tend\n\t\tif info.net == 'raw' or info.net == 'tcp' then\n\t\t\tif info.type and info.type ~= \"http\" then\n\t\t\t\tinfo.type = \"none\"\n\t\t\tend\n\t\t\tresult.tcp_guise = info.type\n\t\t\tresult.tcp_guise_http_host = (info.host and info.host ~= \"\") and { info.host } or nil\n\t\t\tresult.tcp_guise_http_path = (info.path and info.path ~= \"\") and { info.path } or nil\n\t\tend\n\t\tif info.net == 'kcp' or info.net == 'mkcp' then\n\t\t\tinfo.net = \"mkcp\"\n\t\t\tresult.mkcp_guise = info.type\n\t\t\tresult.mkcp_seed = info.seed\n\t\tend\n\t\tif info.net == 'quic' then\n\t\t\tresult.quic_guise = info.type\n\t\t\tresult.quic_key = info.key\n\t\t\tresult.quic_security = info.securty\n\t\tend\n\t\tif info.net == 'grpc' then\n\t\t\tresult.grpc_serviceName = info.path\n\t\tend\n\t\tif info.net == 'xhttp' then\n\t\t\tresult.xhttp_host = info.host\n\t\t\tresult.xhttp_path = info.path\n\t\tend\n\t\tif info.net == 'httpupgrade' then\n\t\t\tresult.httpupgrade_host = info.host\n\t\t\tresult.httpupgrade_path = info.path\n\t\tend\n\t\tresult.security = info.security or info.scy or \"auto\"\n\t\tif info.tls == \"tls\" or info.tls == \"1\" then\n\t\t\tresult.tls = \"1\"\n\t\t\tresult.alpn = info.alpn\n\t\t\tif info.fp and info.fp ~= \"\" then\n\t\t\t\tresult.utls = \"1\"\n\t\t\t\tresult.fingerprint = info.fp\n\t\t\tend\n\t\t\tresult.tls_serverName = (info.sni and info.sni ~= \"\") and info.sni or info.host\n\t\t\tresult.tls_pinSHA256 = info.pcs\n\t\t\tresult.tls_CertByName = info.vcn\n\t\t\tlocal insecure = info.allowinsecure or info.allowInsecure or info.insecure\n\t\t\tresult.tls_allowInsecure = (insecure == \"1\" or insecure == \"0\") and insecure or (sub_allowinsecure and \"1\" or \"0\")\n\t\telse\n\t\t\tresult.tls = \"0\"\n\t\tend\n\n\t\tresult.tcp_fast_open = info.tfo\n\n\t\tinfo.fm = (info.fm and info.fm ~= \"\") and UrlDecode(info.fm) or nil\n\t\tresult.use_finalmask = (info.fm and info.fm ~= \"\") and \"1\" or nil\n\t\tresult.finalmask = (info.fm and info.fm ~= \"\") and api.base64Encode(info.fm) or nil\n\n\t\tif result.type == \"sing-box\" and (result.transport == \"mkcp\" or result.transport == \"xhttp\") then\n\t\t\tlog(\"跳过节点:\" .. result.remarks ..\"，因Sing-Box不支持\" .. szType .. \"协议的\" .. result.transport .. \"传输方式，需更换Xray。\")\n\t\t\treturn nil\n\t\tend\n\telseif szType == \"ss\" then\n\t\tresult = set_ss_implementation(sub_ss_type, result)\n\t\tif not result then return nil end\n\n\t\t--SS-URI = \"ss://\" userinfo \"@\" hostname \":\" port [ \"/\" ] [ \"?\" plugin ] [ \"#\" tag ]\n\t\t--userinfo = websafe-base64-encode-utf8(method  \":\" password)\n\t\t--ss://YWVzLTEyOC1nY206dGVzdA@192.168.100.1:8888#Example1\n\t\t--ss://cmM0LW1kNTpwYXNzd2Q@192.168.100.1:8888/?plugin=obfs-local%3Bobfs%3Dhttp#Example2\n\t\t--ss://2022-blake3-aes-256-gcm:YctPZ6U7xPPcU%2Bgp3u%2B0tx%2FtRizJN9K8y%2BuKlW2qjlI%3D@192.168.100.1:8888#Example3\n\t\t--ss://2022-blake3-aes-256-gcm:YctPZ6U7xPPcU%2Bgp3u%2B0tx%2FtRizJN9K8y%2BuKlW2qjlI%3D@192.168.100.1:8888/?plugin=v2ray-plugin%3Bserver#Example3\n\t\t--ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTp0ZXN0@xxxxxx.com:443?type=ws&path=%2Ftestpath&host=xxxxxx.com&security=tls&fp=&alpn=h3%2Ch2%2Chttp%2F1.1&sni=xxxxxx.com#test-1%40ss\n\t\t--ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTp4eHh4eHhAeHh4eC54eHh4eC5jb206NTYwMDE#Hong%20Kong-01\n\n\t\tlocal idx_sp = content:find(\"#\") or 0\n\t\tlocal alias = \"\"\n\t\tif idx_sp > 0 then\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\tend\n\t\tresult.remarks = UrlDecode(alias)\n\t\tlocal info = content:sub(1, idx_sp - 1):gsub(\"/%?\", \"?\")\n\t\tlocal params = {}\n\t\tif info:find(\"%?\") then\n\t\t\tlocal find_index = info:find(\"%?\")\n\t\t\tlocal query = split(info, \"%?\")\n\t\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\t\tif s and s > 1 then\n\t\t\t\t\tparams[v:sub(1, s - 1)] = UrlDecode(v:sub(s + 1))\n\t\t\t\tend\n\t\t\tend\n\t\t\tif params.plugin then\n\t\t\t\tlocal plugin_info = params.plugin\n\t\t\t\tlocal idx_pn = plugin_info:find(\";\")\n\t\t\t\tif idx_pn then\n\t\t\t\t\tresult.plugin = plugin_info:sub(1, idx_pn - 1)\n\t\t\t\t\tresult.plugin_opts = plugin_info:sub(idx_pn + 1, #plugin_info)\n\t\t\t\telse\n\t\t\t\t\tresult.plugin = plugin_info\n\t\t\t\tend\n\t\t\tend\n\t\t\tif result.plugin and result.plugin == \"simple-obfs\" then\n\t\t\t\tresult.plugin = \"obfs-local\"\n\t\t\tend\n\t\t\tinfo = info:sub(1, find_index - 1)\n\t\tend\n\n\t\tlocal hostInfo = split(base64Decode(UrlDecode(info)), \"@\")\n\t\tif hostInfo and #hostInfo > 0 then\n\t\t\tlocal host_port = hostInfo[#hostInfo]\n\t\t\t-- [2001:4860:4860::8888]:443\n\t\t\t-- 8.8.8.8:443\n\t\t\tif host_port:find(\":\") then\n\t\t\t\tlocal sp = split(host_port, \":\")\n\t\t\t\tresult.port = sp[#sp]\n\t\t\t\tif api.is_ipv6addrport(host_port) then\n\t\t\t\t\tresult.address = api.get_ipv6_only(host_port)\n\t\t\t\telse\n\t\t\t\t\tresult.address = sp[1]\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tresult.address = host_port\n\t\t\tend\n\n\t\t\tlocal userinfo = nil\n\t\t\tif #hostInfo > 2 then\n\t\t\t\tuserinfo = {}\n\t\t\t\tfor i = 1, #hostInfo - 1 do\n\t\t\t\t\ttinsert(userinfo, hostInfo[i])\n\t\t\t\tend\n\t\t\t\tuserinfo = table.concat(userinfo, '@')\n\t\t\telse\n\t\t\t\tuserinfo = base64Decode(hostInfo[1])\n\t\t\tend\n\t\t\tlocal method, password\n\t\t\tif userinfo:find(\":\") then\n\t\t\t\tmethod = userinfo:sub(1, userinfo:find(\":\") - 1)\n\t\t\t\tpassword = userinfo:sub(userinfo:find(\":\") + 1, #userinfo)\n\t\t\telse\n\t\t\t\tpassword = hostInfo[1]  --一些链接用明文uuid做密码\n\t\t\tend\n\n\t\t\t-- 判断密码是否经过url编码\n\t\t\tlocal function isURLEncodedPassword(pwd)\n\t\t\t\tif not pwd:find(\"%%[0-9A-Fa-f][0-9A-Fa-f]\") then\n\t\t\t\t\treturn false\n\t\t\t\tend\n\t\t\t\tlocal ok, decoded = pcall(UrlDecode, pwd)\n\t\t\t\treturn ok and UrlEncode(decoded) == pwd\n\t\t\tend\n\n\t\t\tlocal decoded = UrlDecode(password)\n\t\t\tif isURLEncodedPassword(password) and decoded then\n\t\t\t\tpassword = decoded\n\t\t\tend\n\n\t\t\tlocal _method = (method or \"none\"):lower()\n\t\t\tmethod = (_method == \"chacha20-poly1305\" and \"chacha20-ietf-poly1305\") or\n\t\t\t\t(_method == \"xchacha20-poly1305\" and \"xchacha20-ietf-poly1305\") or _method\n\n\t\t\tresult.method = method\n\t\t\tresult.password = password\n\t\t\tresult.tcp_fast_open = params.tfo\n\t\t\tresult.use_finalmask = (params.fm and params.fm ~= \"\") and \"1\" or nil\n\t\t\tresult.finalmask = (params.fm and params.fm ~= \"\") and api.base64Encode(params.fm) or nil\n\n\t\t\tlocal need_upgrade = (result.type ~= \"Xray\" and result.type ~= \"sing-box\")\n\t\t\t\tand (params.type and params.type ~= \"tcp\")\n\t\t\t\tand (params.headerType and params.headerType ~= \"none\")\n\t\t\tif has_xray and (need_upgrade or params.type == \"xhttp\") then\n\t\t\t\tresult.type = \"Xray\"\n\t\t\t\tresult.protocol = \"shadowsocks\"\n\t\t\telseif has_singbox and need_upgrade then\n\t\t\t\tresult.type = \"sing-box\"\n\t\t\t\tresult.protocol = \"shadowsocks\"\n\t\t\tend\n\n\t\t\tif result.plugin then\n\t\t\t\tif result.type == 'Xray' then\n\t\t\t\t\t-- obfs-local插件转换成xray支持的格式\n\t\t\t\t\tif result.plugin ~= \"obfs-local\" then\n\t\t\t\t\t\tresult.error_msg = \"Xray 不支持 \" .. result.plugin .. \" 插件。\"\n\t\t\t\t\telse\n\t\t\t\t\t\tlocal obfs = result.plugin_opts:match(\"obfs=([^;]+)\") or \"\"\n\t\t\t\t\t\tlocal obfs_host = result.plugin_opts:match(\"obfs%-host=([^;]+)\") or \"\"\n\t\t\t\t\t\tif obfs == \"\" or obfs_host == \"\" then\n\t\t\t\t\t\t\tresult.error_msg = \"SS \" .. result.plugin .. \" 插件选项不完整。\"\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif obfs == \"http\" then\n\t\t\t\t\t\t\tresult.transport = \"raw\"\n\t\t\t\t\t\t\tresult.tcp_guise = \"http\"\n\t\t\t\t\t\t\tresult.tcp_guise_http_host = (obfs_host and obfs_host ~= \"\") and { obfs_host } or nil\n\t\t\t\t\t\t\tresult.tcp_guise_http_path = { \"/\" }\n\t\t\t\t\t\telseif obfs == \"tls\" then\n\t\t\t\t\t\t\tresult.tls = \"1\"\n\t\t\t\t\t\t\tresult.tls_serverName = obfs_host\n\t\t\t\t\t\t\tresult.tls_allowInsecure = \"1\"\n\t\t\t\t\t\tend\n\t\t\t\t\t\tresult.plugin = nil\n\t\t\t\t\t\tresult.plugin_opts = nil\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tresult.plugin_enabled = \"1\"\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif result.type == \"SS\" then\n\t\t\t\tlocal aead2022_methods = { \"2022-blake3-aes-128-gcm\", \"2022-blake3-aes-256-gcm\", \"2022-blake3-chacha20-poly1305\" }\n\t\t\t\tlocal aead2022 = false\n\t\t\t\tfor k, v in ipairs(aead2022_methods) do\n\t\t\t\t\tif method:lower() == v:lower() then\n\t\t\t\t\t\taead2022 = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif aead2022 then\n\t\t\t\t\t-- shadowsocks-libev 不支持2022加密\n\t\t\t\t\tresult.error_msg = \"shadowsocks-libev 不支持2022加密。\"\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif params.type then\n\t\t\t\tparams.type = string.lower(params.type)\n\t\t\t\tif result.type == \"sing-box\" and params.type == \"raw\" then \n\t\t\t\t\tparams.type = \"tcp\"\n\t\t\t\telseif result.type == \"Xray\" and params.type == \"tcp\" then\n\t\t\t\t\tparams.type = \"raw\"\n\t\t\t\tend\n\t\t\t\tif params.type == \"h2\" or params.type == \"http\" then\n\t\t\t\t\tparams.type = \"http\"\n\t\t\t\t\tresult.transport = (result.type == \"Xray\") and \"xhttp\" or \"http\"\n\t\t\t\telse\n\t\t\t\t\tresult.transport = params.type\n\t\t\t\tend\n\t\t\t\tif result.type ~= \"SS-Rust\" and result.type ~= \"SS\" then\n\t\t\t\t\tif params.type == 'ws' then\n\t\t\t\t\t\tresult.ws_host = params.host\n\t\t\t\t\t\tresult.ws_path = params.path\n\t\t\t\t\t\tif result.type == \"sing-box\" and params.path then\n\t\t\t\t\t\t\tlocal ws_path_dat = split(params.path, \"%?\")\n\t\t\t\t\t\t\tlocal ws_path = ws_path_dat[1]\n\t\t\t\t\t\t\tlocal ws_path_params = {}\n\t\t\t\t\t\t\tfor _, v in pairs(split(ws_path_dat[2], '&')) do\n\t\t\t\t\t\t\t\tlocal t = split(v, '=')\n\t\t\t\t\t\t\t\tws_path_params[t[1]] = t[2]\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tif ws_path_params.ed and tonumber(ws_path_params.ed) then\n\t\t\t\t\t\t\t\tresult.ws_path = ws_path\n\t\t\t\t\t\t\t\tresult.ws_enableEarlyData = \"1\"\n\t\t\t\t\t\t\t\tresult.ws_maxEarlyData = tonumber(ws_path_params.ed)\n\t\t\t\t\t\t\t\tresult.ws_earlyDataHeaderName = \"Sec-WebSocket-Protocol\"\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tif params.type == \"http\" then\n\t\t\t\t\t\tif result.type == \"sing-box\" then\n\t\t\t\t\t\t\tresult.transport = \"http\"\n\t\t\t\t\t\t\tresult.http_host = (params.host and params.host ~= \"\") and { params.host } or nil\n\t\t\t\t\t\t\tresult.http_path = params.path\n\t\t\t\t\t\telseif result.type == \"Xray\" then\n\t\t\t\t\t\t\tresult.transport = \"xhttp\"\n\t\t\t\t\t\t\tresult.xhttp_mode = \"stream-one\"\n\t\t\t\t\t\t\tresult.xhttp_host = params.host\n\t\t\t\t\t\t\tresult.xhttp_path = params.path\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tif params.type == 'raw' or params.type == 'tcp' then\n\t\t\t\t\t\tresult.tcp_guise = params.headerType or \"none\"\n\t\t\t\t\t\tresult.tcp_guise_http_host = (params.host and params.host ~= \"\") and { params.host } or nil\n\t\t\t\t\t\tresult.tcp_guise_http_path = (params.path and params.path ~= \"\") and { params.path } or nil\n\t\t\t\t\tend\n\t\t\t\t\tif params.type == 'kcp' or params.type == 'mkcp' then\n\t\t\t\t\t\tresult.transport = \"mkcp\"\n\t\t\t\t\t\tresult.mkcp_guise = params.headerType or \"none\"\n\t\t\t\t\t\tresult.mkcp_seed = params.seed\n\t\t\t\t\tend\n\t\t\t\t\tif params.type == 'quic' then\n\t\t\t\t\t\tresult.quic_guise = params.headerType or \"none\"\n\t\t\t\t\t\tresult.quic_key = params.key\n\t\t\t\t\t\tresult.quic_security = params.quicSecurity or \"none\"\n\t\t\t\t\tend\n\t\t\t\t\tif params.type == 'grpc' then\n\t\t\t\t\t\tif params.path then result.grpc_serviceName = params.path end\n\t\t\t\t\t\tif params.serviceName then result.grpc_serviceName = params.serviceName end\n\t\t\t\t\t\tresult.grpc_mode = params.mode or \"gun\"\n\t\t\t\t\tend\n\t\t\t\t\tif params.type == 'xhttp' then\n\t\t\t\t\t\tif result.type ~= \"Xray\" then\n\t\t\t\t\t\t\tresult.error_msg = \"请更换 Xray 以支持 xhttp 传输方式。\"\n\t\t\t\t\t\tend\n\t\t\t\t\t\tresult.xhttp_host = params.host\n\t\t\t\t\t\tresult.xhttp_path = params.path\n\t\t\t\t\t\tresult.xhttp_mode = params.mode or \"auto\"\n\t\t\t\t\t\tresult.use_xhttp_extra = (params.extra and params.extra ~= \"\") and \"1\" or nil\n\t\t\t\t\t\tresult.xhttp_extra = (params.extra and params.extra ~= \"\") and api.base64Encode(params.extra) or nil\n\t\t\t\t\t\tlocal success, Data = pcall(jsonParse, params.extra)\n\t\t\t\t\t\tif success and Data then\n\t\t\t\t\t\t\tlocal address = (Data.extra and Data.extra.downloadSettings and Data.extra.downloadSettings.address)\n\t\t\t\t\t\t\t\t\tor (Data.downloadSettings and Data.downloadSettings.address)\n\t\t\t\t\t\t\tresult.download_address = (address and address ~= \"\") and address:gsub(\"^%[\", \"\"):gsub(\"%]$\", \"\") or nil\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tresult.tls = \"0\"\n\t\t\t\t\tif params.security == \"tls\" or params.security == \"reality\" then\n\t\t\t\t\t\tresult.tls = \"1\"\n\t\t\t\t\t\tresult.tls_serverName = (params.sni and params.sni ~= \"\") and params.sni or params.host\n\t\t\t\t\t\tresult.alpn = params.alpn\n\t\t\t\t\t\tif params.fp and params.fp ~= \"\" then\n\t\t\t\t\t\t\tresult.utls = \"1\"\n\t\t\t\t\t\t\tresult.fingerprint = params.fp\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif params.ech and params.ech ~= \"\" then\n\t\t\t\t\t\t\tresult.ech = \"1\"\n\t\t\t\t\t\t\tresult.ech_config = params.ech\n\t\t\t\t\t\tend\n\t\t\t\t\t\tresult.tls_pinSHA256 = params.pcs\n\t\t\t\t\t\tresult.tls_CertByName = params.vcn\n\t\t\t\t\t\tif params.security == \"reality\" then\n\t\t\t\t\t\t\tresult.reality = \"1\"\n\t\t\t\t\t\t\tresult.reality_publicKey = params.pbk or nil\n\t\t\t\t\t\t\tresult.reality_shortId = params.sid or nil\n\t\t\t\t\t\t\tresult.reality_spiderX = params.spx or nil\n\t\t\t\t\t\t\tresult.use_mldsa65Verify = (params.pqv and params.pqv ~= \"\") and \"1\" or nil\n\t\t\t\t\t\t\tresult.reality_mldsa65Verify = params.pqv or nil\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tlocal insecure = params.allowinsecure or params.allowInsecure or params.insecure\n\t\t\t\t\tresult.tls_allowInsecure = (insecure == \"1\" or insecure == \"0\") and insecure or (sub_allowinsecure and \"1\" or \"0\")\n\t\t\t\t\tresult.uot = params.udp\n\t\t\t\telseif (params.type ~= \"tcp\" and params.type ~= \"raw\") and (params.headerType and params.headerType ~= \"none\") then\n\t\t\t\t\tresult.error_msg = \"请更换 Xray 或 Sing-Box 来支持 SS 更多的传输方式。\"\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif params[\"shadow-tls\"] then\n\t\t\t\tif result.type ~= \"sing-box\" and result.type ~= \"SS-Rust\" then\n\t\t\t\t\tresult.error_msg =  sub_ss_type .. \" 不支持 shadow-tls 插件。\"\n\t\t\t\telse\n\t\t\t\t\t-- 解析SS Shadow-TLS 插件参数\n\t\t\t\t\tlocal function parseShadowTLSParams(b64str, out)\n\t\t\t\t\t\tlocal ok, data = pcall(jsonParse, base64Decode(b64str))\n\t\t\t\t\t\tif not ok or type(data) ~= \"table\" then return \"\" end\n\t\t\t\t\t\tif type(out) == \"table\" then\n\t\t\t\t\t\t\tfor k, v in pairs(data) do out[k] = v end\n\t\t\t\t\t\tend\n\t\t\t\t\t\tlocal t = {}\n\t\t\t\t\t\tif data.version then t[#t+1] = \"v\" .. data.version .. \"=1\" end\n\t\t\t\t\t\tif data.password then t[#t+1] = \"passwd=\" .. data.password end\n\t\t\t\t\t\tfor k, v in pairs(data) do\n\t\t\t\t\t\t\tif k ~= \"version\" and k ~= \"password\" then\n\t\t\t\t\t\t\t\tt[#t+1] = k .. \"=\" .. tostring(v)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\treturn table.concat(t, \";\")\n\t\t\t\t\tend\n\n\t\t\t\t\tif result.type == \"SS-Rust\" then\n\t\t\t\t\t\tresult.plugin_enabled = \"1\"\n\t\t\t\t\t\tresult.plugin = \"shadow-tls\"\n\t\t\t\t\t\tresult.plugin_opts = parseShadowTLSParams(params[\"shadow-tls\"])\n\t\t\t\t\telseif result.type == \"sing-box\" then\n\t\t\t\t\t\tlocal shadowtlsOpt = {}\n\t\t\t\t\t\tparseShadowTLSParams(params[\"shadow-tls\"], shadowtlsOpt)\n\t\t\t\t\t\tif next(shadowtlsOpt) then\n\t\t\t\t\t\t\tresult.shadowtls = \"1\"\n\t\t\t\t\t\t\tresult.shadowtls_version = shadowtlsOpt.version or \"1\"\n\t\t\t\t\t\t\tresult.shadowtls_password = shadowtlsOpt.password\n\t\t\t\t\t\t\tresult.shadowtls_serverName = shadowtlsOpt.host\n\t\t\t\t\t\t\tif shadowtlsOpt.fingerprint then\n\t\t\t\t\t\t\t\tresult.shadowtls_utls = \"1\"\n\t\t\t\t\t\t\t\tresult.shadowtls_fingerprint = shadowtlsOpt.fingerprint or \"chrome\"\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\telseif szType == \"trojan\" then\n\t\tif sub_trojan_type == \"sing-box\" and has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\t\tresult.protocol = 'trojan'\n\t\telseif sub_trojan_type == \"xray\" and has_xray then\n\t\t\tresult.type = 'Xray'\n\t\t\tresult.protocol = 'trojan'\n\t\telse\n\t\t\tlog(\"跳过 Trojan 节点，因未适配到 Trojan 核心程序，或未正确设置节点使用类型。\")\n\t\t\treturn nil\n\t\tend\n\t\t\n\t\tlocal alias = \"\"\n\t\tif content:find(\"#\") then\n\t\t\tlocal idx_sp = content:find(\"#\")\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\t\tcontent = content:sub(0, idx_sp - 1)\n\t\tend\n\t\tresult.remarks = UrlDecode(alias)\n\t\tif content:find(\"@\") then\n\t\t\tlocal Info = split(content, \"@\")\n\t\t\tresult.password = UrlDecode(Info[1])\n\t\t\tlocal port = \"443\"\n\t\t\tInfo[2] = (Info[2] or \"\"):gsub(\"/%?\", \"?\")\n\t\t\tlocal query = split(Info[2], \"%?\")\n\t\t\tlocal host_port = query[1]\n\t\t\tlocal params = {}\n\t\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\t\tif s and s > 1 then\n\t\t\t\t\tparams[v:sub(1, s - 1)] = UrlDecode(v:sub(s + 1))\n\t\t\t\tend\n\t\t\tend\n\t\t\t-- [2001:4860:4860::8888]:443\n\t\t\t-- 8.8.8.8:443\n\t\t\tif host_port:find(\":\") then\n\t\t\t\tlocal sp = split(host_port, \":\")\n\t\t\t\tport = sp[#sp]\n\t\t\t\tif api.is_ipv6addrport(host_port) then\n\t\t\t\t\tresult.address = api.get_ipv6_only(host_port)\n\t\t\t\telse\n\t\t\t\t\tresult.address = sp[1]\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tresult.address = host_port\n\t\t\tend\n\t\t\tresult.port = port\n\n\t\t\tresult.tls = '1'\n\t\t\tresult.tls_serverName = params.peer or params.sni or \"\"\n\t\t\tresult.tls_pinSHA256 = params.pcs\n\t\t\tresult.tls_CertByName = params.vcn\n\t\t\tlocal insecure = params.allowinsecure or params.allowInsecure or params.insecure\n\t\t\tresult.tls_allowInsecure = (insecure == \"1\" or insecure == \"0\") and insecure or (sub_allowinsecure and \"1\" or \"0\")\n\n\t\t\tif not params.type then params.type = \"tcp\" end\n\t\t\tparams.type = string.lower(params.type)\n\t\t\tif result.type == \"sing-box\" and params.type == \"raw\" then \n\t\t\t\tparams.type = \"tcp\"\n\t\t\telseif result.type == \"Xray\" and params.type == \"tcp\" then\n\t\t\t\tparams.type = \"raw\"\n\t\t\tend\n\t\t\tif params.type == \"h2\" or params.type == \"http\" then\n\t\t\t\tparams.type = \"http\"\n\t\t\t\tresult.transport = (result.type == \"Xray\") and \"xhttp\" or \"http\"\n\t\t\telse\n\t\t\t\tresult.transport = params.type\n\t\t\tend\n\t\t\tif params.type == 'ws' then\n\t\t\t\tresult.ws_host = params.host\n\t\t\t\tresult.ws_path = params.path\n\t\t\t\tif result.type == \"sing-box\" and params.path then\n\t\t\t\t\tlocal ws_path_dat = split(params.path, \"%?\")\n\t\t\t\t\tlocal ws_path = ws_path_dat[1]\n\t\t\t\t\tlocal ws_path_params = {}\n\t\t\t\t\tfor _, v in pairs(split(ws_path_dat[2], '&')) do\n\t\t\t\t\t\tlocal t = split(v, '=')\n\t\t\t\t\t\tws_path_params[t[1]] = t[2]\n\t\t\t\t\tend\n\t\t\t\t\tif ws_path_params.ed and tonumber(ws_path_params.ed) then\n\t\t\t\t\t\tresult.ws_path = ws_path\n\t\t\t\t\t\tresult.ws_enableEarlyData = \"1\"\n\t\t\t\t\t\tresult.ws_maxEarlyData = tonumber(ws_path_params.ed)\n\t\t\t\t\t\tresult.ws_earlyDataHeaderName = \"Sec-WebSocket-Protocol\"\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif params.type == \"http\" then\n\t\t\t\tif result.type == \"sing-box\" then\n\t\t\t\t\tresult.transport = \"http\"\n\t\t\t\t\tresult.http_host = (params.host and params.host ~= \"\") and { params.host } or nil\n\t\t\t\t\tresult.http_path = params.path\n\t\t\t\telseif result.type == \"Xray\" then\n\t\t\t\t\tresult.transport = \"xhttp\"\n\t\t\t\t\tresult.xhttp_mode = \"stream-one\"\n\t\t\t\t\tresult.xhttp_host = params.host\n\t\t\t\t\tresult.xhttp_path = params.path\n\t\t\t\tend\n\t\t\tend\n\t\t\tif params.type == 'raw' or params.type == 'tcp' then\n\t\t\t\tresult.tcp_guise = params.headerType or \"none\"\n\t\t\t\tresult.tcp_guise_http_host = (params.host and params.host ~= \"\") and { params.host } or nil\n\t\t\t\tresult.tcp_guise_http_path = (params.path and params.path ~= \"\") and { params.path } or nil\n\t\t\tend\n\t\t\tif params.type == 'kcp' or params.type == 'mkcp' then\n\t\t\t\tresult.transport = \"mkcp\"\n\t\t\t\tresult.mkcp_guise = params.headerType or \"none\"\n\t\t\t\tresult.mkcp_seed = params.seed\n\t\t\tend\n\t\t\tif params.type == 'quic' then\n\t\t\t\tresult.quic_guise = params.headerType or \"none\"\n\t\t\t\tresult.quic_key = params.key\n\t\t\t\tresult.quic_security = params.quicSecurity or \"none\"\n\t\t\tend\n\t\t\tif params.type == 'grpc' then\n\t\t\t\tresult.grpc_serviceName = params.serviceName or params.path\n\t\t\t\tresult.grpc_mode = params.mode or \"gun\"\n\t\t\tend\n\t\t\tif params.type == 'xhttp' then\n\t\t\t\tresult.xhttp_host = params.host\n\t\t\t\tresult.xhttp_path = params.path\n\t\t\tend\n\t\t\tif params.type == 'httpupgrade' then\n\t\t\t\tresult.httpupgrade_host = params.host\n\t\t\t\tresult.httpupgrade_path = params.path\n\t\t\tend\n\n\t\t\tresult.alpn = params.alpn\n\t\t\tresult.tcp_fast_open = params.tfo\n\t\t\tresult.use_finalmask = (params.fm and params.fm ~= \"\") and \"1\" or nil\n\t\t\tresult.finalmask = (params.fm and params.fm ~= \"\") and api.base64Encode(params.fm) or nil\n\n\t\t\tif result.type == \"sing-box\" and (result.transport == \"mkcp\" or result.transport == \"xhttp\") then\n\t\t\t\tlog(\"跳过节点：\" .. result.remarks ..\"，因 Sing-Box 不支持 \" .. szType .. \" 协议的 \" .. result.transport .. \" 传输方式，需更换 Xray。\")\n\t\t\t\treturn nil\n\t\t\tend\n\t\tend\n\n\telseif szType == \"ssd\" then\n\t\tresult = set_ss_implementation(sub_ss_type, result)\n\t\tif not result then return nil end\n\t\tresult.address = content.server\n\t\tresult.port = content.port\n\t\tresult.password = content.password\n\t\tresult.method = content.encryption\n\t\tresult.plugin = content.plugin\n\t\tresult.plugin_opts = content.plugin_options\n\t\tresult.group = content.airport\n\t\tresult.remarks = content.remarks\n\telseif szType == \"vless\" then\n\t\tif sub_vless_type == \"sing-box\" and has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\telseif sub_vless_type == \"xray\" and has_xray then\n\t\t\tresult.type = \"Xray\"\n\t\telse\n\t\t\tlog(\"跳过 VLESS 节点，因未适配到 VLESS 核心程序，或未正确设置节点使用类型。\")\n\t\t\treturn nil\n\t\tend\n\t\tresult.protocol = \"vless\"\n\t\tlocal alias = \"\"\n\t\tif content:find(\"#\") then\n\t\t\tlocal idx_sp = content:find(\"#\")\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\t\tcontent = content:sub(0, idx_sp - 1)\n\t\tend\n\t\tresult.remarks = UrlDecode(alias)\n\t\tif content:find(\"@\") then\n\t\t\tlocal Info = split(content, \"@\")\n\t\t\tresult.uuid = UrlDecode(Info[1])\n\t\t\tlocal port = \"443\"\n\t\t\tInfo[2] = (Info[2] or \"\"):gsub(\"/%?\", \"?\")\n\t\t\tlocal query = split(Info[2], \"%?\")\n\t\t\tlocal host_port = query[1]\n\t\t\tlocal params = {}\n\t\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\t\tif s and s > 1 then\n\t\t\t\t\tparams[v:sub(1, s - 1)] = UrlDecode(v:sub(s + 1))\n\t\t\t\tend\n\t\t\tend\n\t\t\t-- [2001:4860:4860::8888]:443\n\t\t\t-- 8.8.8.8:443\n\t\t\tif host_port:find(\":\") then\n\t\t\t\tlocal sp = split(host_port, \":\")\n\t\t\t\tport = sp[#sp]\n\t\t\t\tif api.is_ipv6addrport(host_port) then\n\t\t\t\t\tresult.address = api.get_ipv6_only(host_port)\n\t\t\t\telse\n\t\t\t\t\tresult.address = sp[1]\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tresult.address = host_port\n\t\t\tend\n\n\t\t\tif not params.type then params.type = \"tcp\" end\n\t\t\tparams.type = string.lower(params.type)\n\t\t\tif ({ xhttp=true, kcp=true, mkcp=true })[params.type] and result.type ~= \"Xray\" and has_xray then\n\t\t\t\tresult.type = \"Xray\"\n\t\t\tend\n\t\t\tif result.type == \"sing-box\" and params.type == \"raw\" then \n\t\t\t\tparams.type = \"tcp\"\n\t\t\telseif result.type == \"Xray\" and params.type == \"tcp\" then\n\t\t\t\tparams.type = \"raw\"\n\t\t\tend\n\t\t\tif params.type == \"h2\" or params.type == \"http\" then\n\t\t\t\tparams.type = \"http\"\n\t\t\t\tresult.transport = (result.type == \"Xray\") and \"xhttp\" or \"http\"\n\t\t\telse\n\t\t\t\tresult.transport = params.type\n\t\t\tend\n\t\t\tif params.type == 'ws' then\n\t\t\t\tresult.ws_host = params.host\n\t\t\t\tresult.ws_path = params.path\n\t\t\t\tif result.type == \"sing-box\" and params.path then\n\t\t\t\t\tlocal ws_path_dat = split(params.path, \"%?\")\n\t\t\t\t\tlocal ws_path = ws_path_dat[1]\n\t\t\t\t\tlocal ws_path_params = {}\n\t\t\t\t\tfor _, v in pairs(split(ws_path_dat[2], '&')) do\n\t\t\t\t\t\tlocal t = split(v, '=')\n\t\t\t\t\t\tws_path_params[t[1]] = t[2]\n\t\t\t\t\tend\n\t\t\t\t\tif ws_path_params.ed and tonumber(ws_path_params.ed) then\n\t\t\t\t\t\tresult.ws_path = ws_path\n\t\t\t\t\t\tresult.ws_enableEarlyData = \"1\"\n\t\t\t\t\t\tresult.ws_maxEarlyData = tonumber(ws_path_params.ed)\n\t\t\t\t\t\tresult.ws_earlyDataHeaderName = \"Sec-WebSocket-Protocol\"\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif params.type == \"http\" then\n\t\t\t\tif result.type == \"sing-box\" then\n\t\t\t\t\tresult.transport = \"http\"\n\t\t\t\t\tresult.http_host = (params.host and params.host ~= \"\") and { params.host } or nil\n\t\t\t\t\tresult.http_path = params.path\n\t\t\t\telseif result.type == \"Xray\" then\n\t\t\t\t\tresult.transport = \"xhttp\"\n\t\t\t\t\tresult.xhttp_mode = \"stream-one\"\n\t\t\t\t\tresult.xhttp_host = params.host\n\t\t\t\t\tresult.xhttp_path = params.path\n\t\t\t\tend\n\t\t\tend\n\t\t\tif params.type == 'raw' or params.type == 'tcp' then\n\t\t\t\tresult.tcp_guise = params.headerType or \"none\"\n\t\t\t\tresult.tcp_guise_http_host = (params.host and params.host ~= \"\") and { params.host } or nil\n\t\t\t\tresult.tcp_guise_http_path = (params.path and params.path ~= \"\") and { params.path } or nil\n\t\t\tend\n\t\t\tif params.type == 'kcp' or params.type == 'mkcp' then\n\t\t\t\tresult.transport = \"mkcp\"\n\t\t\t\tresult.mkcp_guise = params.headerType or \"none\"\n\t\t\t\tresult.mkcp_seed = params.seed\n\t\t\tend\n\t\t\tif params.type == 'quic' then\n\t\t\t\tresult.quic_guise = params.headerType or \"none\"\n\t\t\t\tresult.quic_key = params.key\n\t\t\t\tresult.quic_security = params.quicSecurity or \"none\"\n\t\t\tend\n\t\t\tif params.type == 'grpc' then\n\t\t\t\tif params.path then result.grpc_serviceName = params.path end\n\t\t\t\tif params.serviceName then result.grpc_serviceName = params.serviceName end\n\t\t\t\tresult.grpc_mode = params.mode or \"gun\"\n\t\t\tend\n\t\t\tif params.type == 'xhttp' then\n\t\t\t\tresult.xhttp_host = params.host\n\t\t\t\tresult.xhttp_path = params.path\n\t\t\t\tresult.xhttp_mode = params.mode or \"auto\"\n\t\t\t\tresult.use_xhttp_extra = (params.extra and params.extra ~= \"\") and \"1\" or nil\n\t\t\t\tresult.xhttp_extra = (params.extra and params.extra ~= \"\") and api.base64Encode(params.extra) or nil\n\t\t\t\tlocal success, Data = pcall(jsonParse, params.extra)\n\t\t\t\tif success and Data then\n\t\t\t\t\tlocal address = (Data.extra and Data.extra.downloadSettings and Data.extra.downloadSettings.address)\n\t\t\t\t\t\t\tor (Data.downloadSettings and Data.downloadSettings.address)\n\t\t\t\t\tresult.download_address = (address and address ~= \"\") and address:gsub(\"^%[\", \"\"):gsub(\"%]$\", \"\") or nil\n\t\t\t\tend\n\t\t\tend\n\t\t\tif params.type == 'httpupgrade' then\n\t\t\t\tresult.httpupgrade_host = params.host\n\t\t\t\tresult.httpupgrade_path = params.path\n\t\t\tend\n\t\t\tresult.encryption = params.encryption or \"none\"\n\t\t\tresult.flow = params.flow\n\n\t\t\tresult.tls = \"0\"\n\t\t\tif params.security == \"tls\" or params.security == \"reality\" then\n\t\t\t\tresult.tls = \"1\"\n\t\t\t\tresult.tls_serverName = (params.sni and params.sni ~= \"\") and params.sni or params.host\n\t\t\t\tresult.alpn = params.alpn\n\t\t\t\tif params.fp and params.fp ~= \"\" then\n\t\t\t\t\tresult.utls = \"1\"\n\t\t\t\t\tresult.fingerprint = params.fp\n\t\t\t\tend\n\t\t\t\tif params.ech and params.ech ~= \"\" then\n\t\t\t\t\tresult.ech = \"1\"\n\t\t\t\t\tresult.ech_config = params.ech\n\t\t\t\tend\n\t\t\t\tresult.tls_pinSHA256 = params.pcs\n\t\t\t\tresult.tls_CertByName = params.vcn\n\t\t\t\tif params.security == \"reality\" then\n\t\t\t\t\tresult.reality = \"1\"\n\t\t\t\t\tresult.reality_publicKey = params.pbk or nil\n\t\t\t\t\tresult.reality_shortId = params.sid or nil\n\t\t\t\t\tresult.reality_spiderX = params.spx or nil\n\t\t\t\t\tresult.use_mldsa65Verify = (params.pqv and params.pqv ~= \"\") and \"1\" or nil\n\t\t\t\t\tresult.reality_mldsa65Verify = params.pqv or nil\n\t\t\t\tend\n\t\t\t\tlocal insecure = params.allowinsecure or params.allowInsecure or params.insecure\n\t\t\t\tresult.tls_allowInsecure = (insecure == \"1\" or insecure == \"0\") and insecure or (sub_allowinsecure and \"1\" or \"0\")\n\t\t\tend\n\n\t\t\tresult.port = port\n\t\t\tresult.tcp_fast_open = params.tfo\n\t\t\tresult.use_finalmask = (params.fm and params.fm ~= \"\") and \"1\" or nil\n\t\t\tresult.finalmask = (params.fm and params.fm ~= \"\") and api.base64Encode(params.fm) or nil\n\n\t\t\tif result.type == \"sing-box\" and (result.transport == \"mkcp\" or result.transport == \"xhttp\") then\n\t\t\t\tlog(\"跳过节点：\" .. result.remarks ..\"，因 Sing-Box 不支持 \" .. szType .. \" 协议的 \" .. result.transport .. \" 传输方式，需更换 Xray。\")\n\t\t\t\treturn nil\n\t\t\tend\n\t\tend\n\telseif szType == 'hysteria' then\n\t\tif has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\t\tresult.protocol = \"hysteria\"\n\t\telse\n\t\t\tlog(\"跳过 Hysteria 节点，因未安装 Hysteria 核心程序 Sing-box。\")\n\t\t\treturn nil\n\t\tend\n\n\t\tlocal alias = \"\"\n\t\tif content:find(\"#\") then\n\t\t\tlocal idx_sp = content:find(\"#\")\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\t\tcontent = content:sub(0, idx_sp - 1)\n\t\tend\n\t\tresult.remarks = UrlDecode(alias)\n\t\t\n\t\tlocal query = split(content:gsub(\"/%?\", \"?\"), '%?')\n\t\tlocal host_port = query[1]\n\t\tlocal params = {}\n\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\tif s and s > 1 then\n\t\t\t\tparams[v:sub(1, s - 1)] = v:sub(s + 1)\n\t\t\tend\n\t\tend\n\t\t-- [2001:4860:4860::8888]:443\n\t\t-- 8.8.8.8:443\n\t\tif host_port:find(\":\") then\n\t\t\tlocal sp = split(host_port, \":\")\n\t\t\tresult.port = sp[#sp]\n\t\t\tif api.is_ipv6addrport(host_port) then\n\t\t\t\tresult.address = api.get_ipv6_only(host_port)\n\t\t\telse\n\t\t\t\tresult.address = sp[1]\n\t\t\tend\n\t\telse\n\t\t\tresult.address = host_port\n\t\tend\n\t\tresult.hysteria_obfs = params.obfsParam\n\t\tresult.hysteria_auth_type = \"string\"\n\t\tresult.hysteria_auth_password = params.auth\n\t\tresult.tls_serverName = params.peer or params.sni or \"\"\n\t\tlocal insecure = params.allowinsecure or params.allowInsecure or params.insecure\n\t\tresult.tls_allowInsecure = (insecure == \"1\" or insecure == \"0\") and insecure or (sub_allowinsecure and \"1\" or \"0\")\n\t\tresult.alpn = params.alpn\n\t\tresult.hysteria_up_mbps = params.upmbps\n\t\tresult.hysteria_down_mbps = params.downmbps\n\t\tresult.hysteria_hop = params.mport\n\n\telseif szType == 'hysteria2' or szType == 'hy2' then\n\t\tlocal alias = \"\"\n\t\tif content:find(\"#\") then\n\t\t\tlocal idx_sp = content:find(\"#\")\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\t\tcontent = content:sub(0, idx_sp - 1)\n\t\tend\n\t\tresult.remarks = UrlDecode(alias)\n\t\tlocal Info = content\n\t\tif content:find(\"@\") then\n\t\t\tlocal contents = split(content, \"@\")\n\t\t\tresult.hysteria2_auth_password = UrlDecode(contents[1])\n\t\t\tInfo = (contents[2] or \"\"):gsub(\"/%?\", \"?\")\n\t\tend\n\t\tlocal query = split(Info, \"%?\")\n\t\tlocal host_port = query[1]\n\t\tlocal params = {}\n\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\tif s and s > 1 then\n\t\t\t\tparams[v:sub(1, s - 1):lower()] = UrlDecode(v:sub(s + 1))\n\t\t\tend\n\t\tend\n\t\t-- [2001:4860:4860::8888]:443\n\t\t-- 8.8.8.8:443\n\t\tif host_port:find(\":\") then\n\t\t\tlocal sp = split(host_port, \":\")\n\t\t\tresult.port = sp[#sp]\n\t\t\tif api.is_ipv6addrport(host_port) then\n\t\t\t\tresult.address = api.get_ipv6_only(host_port)\n\t\t\telse\n\t\t\t\tresult.address = sp[1]\n\t\t\tend\n\t\telse\n\t\t\tresult.address = host_port\n\t\tend\n\t\tresult.tls_serverName = params.sni\n\t\tresult.tls_pinSHA256 = params.pcs or params.pinsha256\n\t\tresult.tls_CertByName = params.vcn\n\t\tlocal insecure = params.allowinsecure or params.insecure\n\t\tresult.tls_allowInsecure = (insecure == \"1\" or insecure == \"0\") and insecure or (sub_allowinsecure and \"1\" or \"0\")\n\t\tresult.hysteria2_hop = params.mport\n\n\t\tif (sub_hysteria2_type == \"sing-box\" and has_singbox) or (sub_hysteria2_type == \"xray\" and has_xray) then\n\t\t\tlocal is_singbox = sub_hysteria2_type == \"sing-box\" and has_singbox\n\t\t\tresult.type = is_singbox and 'sing-box' or 'Xray'\n\t\t\tresult.protocol = \"hysteria2\"\n\t\t\tif params[\"obfs-password\"] or params[\"obfs_password\"] then\n\t\t\t\tresult.hysteria2_obfs_type = \"salamander\"\n\t\t\t\tresult.hysteria2_obfs_password = params[\"obfs-password\"] or params[\"obfs_password\"]\n\t\t\tend\n\t\t\tresult.use_finalmask = (params.fm and params.fm ~= \"\") and \"1\" or nil\n\t\t\tresult.finalmask = (params.fm and params.fm ~= \"\") and api.base64Encode(params.fm) or nil\n\t\telseif has_hysteria2 then\n\t\t\tresult.type = \"Hysteria2\"\n\t\t\tif params[\"obfs-password\"] or params[\"obfs_password\"] then\n\t\t\t\tresult.hysteria2_obfs = params[\"obfs-password\"] or params[\"obfs_password\"]\n\t\t\tend\n\t\telse\n\t\t\tlog(\"跳过 Hysteria2 节点，因未适配到 Hysteria2 核心程序，或未正确设置节点使用类型。\")\n\t\t\treturn nil\n\t\tend\n\telseif szType == 'tuic' then\n\t\tif has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\t\tresult.protocol = \"tuic\"\n\t\telse\n\t\t\tlog(\"跳过 Tuic 节点，因未安装 Tuic 核心程序 Sing-box。\")\n\t\t\treturn nil\n\t\tend\n\n\t\tlocal alias = \"\"\n\t\tif content:find(\"#\") then\n\t\t\tlocal idx_sp = content:find(\"#\")\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\t\tcontent = content:sub(0, idx_sp - 1)\n\t\tend\n\t\tresult.remarks = UrlDecode(alias)\n\t\tlocal Info = content\n\t\tif content:find(\"@\", 1, true) then\n\t\t\tlocal contents = split(content, \"@\")\n\t\t\tlocal auth = contents[1] or \"\"\n\t\t\tlocal idx = auth:find(\":\", 1, true)\n\t\t\tif not idx then --修正某些链接会把uuid和password之间的:进行编码\n\t\t\t\tauth = UrlDecode(auth)\n\t\t\t\tidx = auth:find(\":\", 1, true)\n\t\t\tend\n\t\t\tif idx then\n\t\t\t\tresult.uuid = UrlDecode(auth:sub(1, idx - 1))\n\t\t\t\tresult.password = UrlDecode(auth:sub(idx + 1))\n\t\t\tend\n\t\t\tInfo = (contents[2] or \"\"):gsub(\"/%?\", \"?\")\n\t\tend\n\t\tlocal query = split(Info, \"%?\")\n\t\tlocal host_port = query[1]\n\t\tlocal params = {}\n\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\tif s and s > 1 then\n\t\t\t\tparams[v:sub(1, s - 1):lower()] = UrlDecode(v:sub(s + 1))\n\t\t\tend\n\t\tend\n\t\tif host_port:find(\":\") then\n\t\t\tlocal sp = split(host_port, \":\")\n\t\t\tresult.port = sp[#sp]\n\t\t\tif api.is_ipv6addrport(host_port) then\n\t\t\t\tresult.address = api.get_ipv6_only(host_port)\n\t\t\telse\n\t\t\t\tresult.address = sp[1]\n\t\t\tend\n\t\telse\n\t\t\tresult.address = host_port\n\t\tend\n\t\tresult.tls_serverName = params.sni\n\t\tresult.tls_disable_sni = params.disable_sni\n\t\tresult.tuic_alpn = params.alpn or \"h3\"\n\t\tresult.tuic_congestion_control = params.congestion_control or \"cubic\"\n\t\tresult.tuic_udp_relay_mode = params.udp_relay_mode or \"native\"\n\t\tlocal insecure = params.allowinsecure or params.insecure or params.allow_insecure\n\t\tresult.tls_allowInsecure = (insecure == \"1\" or insecure == \"0\") and insecure or (sub_allowinsecure and \"1\" or \"0\")\n\telseif szType == \"anytls\" then\n\t\tif has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\t\tresult.protocol = \"anytls\"\n\t\telse\n\t\t\tlog(\"跳过 AnyTLS 节点，因未安装 AnyTLS 核心程序 Sing-box 1.12。\")\n\t\t\treturn nil\n\t\tend\n\n\t\tlocal alias = \"\"\n\t\tif content:find(\"#\") then\n\t\t\tlocal idx_sp = content:find(\"#\")\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\t\tcontent = content:sub(0, idx_sp - 1)\n\t\tend\n\t\tresult.remarks = UrlDecode(alias)\n\t\tif content:find(\"@\") then\n\t\t\tlocal Info = split(content, \"@\")\n\t\t\tresult.password = UrlDecode(Info[1])\n\t\t\tlocal port = \"443\"\n\t\t\tInfo[2] = (Info[2] or \"\"):gsub(\"/%?\", \"?\")\n\t\t\tlocal query = split(Info[2], \"%?\")\n\t\t\tlocal host_port = query[1]\n\t\t\tlocal params = {}\n\t\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\t\tif s and s > 1 then\n\t\t\t\t\tparams[v:sub(1, s - 1):lower()] = UrlDecode(v:sub(s + 1))\n\t\t\t\tend\n\t\t\tend\n\t\t\t-- [2001:4860:4860::8888]:443\n\t\t\t-- 8.8.8.8:443\n\t\t\tif host_port:find(\":\") then\n\t\t\t\tlocal sp = split(host_port, \":\")\n\t\t\t\tport = sp[#sp]\n\t\t\t\tif api.is_ipv6addrport(host_port) then\n\t\t\t\t\tresult.address = api.get_ipv6_only(host_port)\n\t\t\t\telse\n\t\t\t\t\tresult.address = sp[1]\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tresult.address = host_port\n\t\t\tend\n\t\t\tresult.tls = \"0\"\n\t\t\tif not params.security or params.security == \"\" then\n\t\t\t\tparams.security = \"tls\"\n\t\t\tend\n\t\t\tif params.security == \"tls\" or params.security == \"reality\" then\n\t\t\t\tresult.tls = \"1\"\n\t\t\t\tresult.tls_serverName = params.sni\n\t\t\t\tresult.alpn = params.alpn\n\t\t\t\tif params.fp and params.fp ~= \"\" then\n\t\t\t\t\tresult.utls = \"1\"\n\t\t\t\t\tresult.fingerprint = params.fp\n\t\t\t\tend\n\t\t\t\tif params.security == \"reality\" then\n\t\t\t\t\tresult.reality = \"1\"\n\t\t\t\t\tresult.reality_publicKey = params.pbk or nil\n\t\t\t\t\tresult.reality_shortId = params.sid or nil\n\t\t\t\tend\n\t\t\tend\n\t\t\tresult.port = port\n\t\t\tlocal insecure = params.allowinsecure or params.insecure\n\t\t\tresult.tls_allowInsecure = (insecure == \"1\" or insecure == \"0\") and insecure or (sub_allowinsecure and \"1\" or \"0\")\n\t\tend\n\telseif szType == 'naive+https' or szType == 'naive+quic' then\n\t\tif has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\t\tresult.protocol = \"naive\"\n\t\telse\n\t\t\tlog(\"跳过 NaïveProxy 节点，因未安装 NaïveProxy 核心程序 Sing-box。\")\n\t\t\treturn nil\n\t\tend\n\n\t\tlocal alias = \"\"\n\t\tif content:find(\"#\") then\n\t\t\tlocal idx_sp = content:find(\"#\")\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\t\tcontent = content:sub(0, idx_sp - 1)\n\t\tend\n\t\tresult.remarks = UrlDecode(alias)\n\t\tlocal Info = content\n\t\tif content:find(\"@\", 1, true) then\n\t\t\tlocal contents = split(content, \"@\")\n\t\t\tlocal auth = contents[1] or \"\"\n\t\t\tlocal idx = auth:find(\":\", 1, true)\n\t\t\tif not idx then --修正某些链接会把username和password之间的:进行编码\n\t\t\t\tauth = UrlDecode(auth)\n\t\t\t\tidx = auth:find(\":\", 1, true)\n\t\t\tend\n\t\t\tif idx then\n\t\t\t\tresult.username = UrlDecode(auth:sub(1, idx - 1))\n\t\t\t\tresult.password = UrlDecode(auth:sub(idx + 1))\n\t\t\tend\n\t\t\tInfo = (contents[2] or \"\"):gsub(\"/%?\", \"?\")\n\t\tend\n\t\tlocal query = split(Info, \"%?\")\n\t\tlocal host_port = query[1]\n\t\tlocal params = {}\n\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\tif s and s > 1 then\n\t\t\t\tparams[v:sub(1, s - 1)] = UrlDecode(v:sub(s + 1))\n\t\t\tend\n\t\tend\n\t\tif host_port:find(\":\") then\n\t\t\tlocal sp = split(host_port, \":\")\n\t\t\tresult.port = sp[#sp]\n\t\t\tif api.is_ipv6addrport(host_port) then\n\t\t\t\tresult.address = api.get_ipv6_only(host_port)\n\t\t\telse\n\t\t\t\tresult.address = sp[1]\n\t\t\tend\n\t\telse\n\t\t\tresult.address = host_port\n\t\tend\n\t\tresult.tls_serverName = params.sni\n\t\tresult.uot = params.uot\n\t\tresult.naive_insecure_concurrency = params[\"insecure-concurrency\"] or \"0\"\n\t\tif params.ech and params.ech ~= \"\" then\n\t\t\tresult.ech = \"1\"\n\t\t\tresult.ech_config = params.ech\n\t\tend\n\t\tif szType == \"naive+quic\" then\n\t\t\tresult.naive_quic = \"1\"\n\t\t\tresult.naive_congestion_control = params.congestion_control or \"bbr\"\n\t\tend\n\telse\n\t\tlog(\"暂时不支持 \" .. szType .. \" 类型的节点订阅，跳过此节点。\")\n\t\treturn nil\n\tend\n\tif not result.remarks or result.remarks == \"\" then\n\t\tif result.address and result.port then\n\t\t\tresult.remarks = result.address .. ':' .. result.port\n\t\telse\n\t\t\tresult.remarks = \"NULL\"\n\t\tend\n\tend\n\treturn result\nend\n\nlocal function curl(url, file, ua, mode)\n\tif not url or url == \"\" then return 22, 404 end\n\tlocal curl_args = {\n\t\t\"-fskL\", \"-w %{http_code}\", \"--retry 3\", \"--connect-timeout 3\", \"-H 'Accept-Encoding: identity'\"\n\t}\n\n\tua = (ua and ua ~= \"\") and ua or \"passwall\"\n\tua = (ua == \"passwall\") and (\"passwall/\" .. api.get_version()) or ua\n\tcurl_args[#curl_args + 1] = '--user-agent \"' .. ua .. '\"'\n\tif not ua:lower():find(\"clash\", 1, true) then\n\t\tcurl_args[#curl_args + 1] = get_headers()\n\tend\n\n\tlocal return_code, result\n\tif mode == \"direct\" then\n\t\treturn_code, result = api.curl_base(url, file, curl_args)\n\telseif mode == \"proxy\" then\n\t\treturn_code, result = api.curl_proxy(url, file, curl_args)\n\telse\n\t\treturn_code, result = api.curl_logic(url, file, curl_args)\n\tend\n\treturn return_code, tonumber(result)\nend\n\nfunction get_headers()\n\tlocal cache_file = \"/tmp/etc/\" .. appname .. \"_tmp/sub_curl_headers\"\n\tif fs.access(cache_file) then\n\t\treturn luci.sys.exec(\"cat \" .. cache_file)\n\tend\n\tlocal headers = {}\n\n\tlocal function readfile(path)\n\t\tlocal f = io.open(path, \"r\")\n\t\tif not f then return nil end\n\t\tlocal c = f:read(\"*a\")\n\t\tf:close()\n\t\treturn api.trim(c)\n\tend\n\n\theaders[#headers + 1] = \"x-device-os: OpenWrt\"\n\n\tlocal rel = readfile(\"/etc/openwrt_release\")\n\tlocal os_ver = rel and rel:match(\"DISTRIB_RELEASE='([^']+)'\")\n\tif os_ver then\n\t\theaders[#headers + 1] = \"x-ver-os: \" .. os_ver\n\tend\n\n\tlocal model = readfile(\"/tmp/sysinfo/model\")\n\tif model then\n\t\theaders[#headers + 1] = \"x-device-model: \" .. model\n\tend\n\n\tlocal mac = readfile(\"/sys/class/net/eth0/address\")\n\tif mac and model then\n\t\tlocal raw = mac .. \"-\" .. model\n\t\tlocal p = io.popen(\"printf '%s' '\" .. raw:gsub(\"'\", \"'\\\\''\") .. \"' | sha256sum\")\n\t\tif p then\n\t\t\tlocal hash = p:read(\"*l\")\n\t\t\tp:close()\n\t\t\thash = hash and hash:match(\"^%w+\")\n\t\t\tif hash then\n\t\t\t\theaders[#headers + 1] = \"x-hwid: \" .. hash\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal out = {}\n\tfor i = 1, #headers do\n\t\tout[i] = \"-H '\" .. headers[i]:gsub(\"'\", \"'\\\\''\") .. \"'\"\n\tend\n\tlocal headers_str = table.concat(out, \" \")\n\tlocal f = io.open(cache_file, \"w\"); if f then f:write(headers_str); f:close() end\n\treturn headers_str\nend\n\nlocal function truncate_nodes(group)\n\tfor _, config in pairs(CONFIG) do\n\t\tif config.currentNodes and #config.currentNodes > 0 then\n\t\t\tlocal newNodes = {}\n\t\t\tlocal removeNodesSet = {}\n\t\t\tfor k, v in pairs(config.currentNodes) do\n\t\t\t\tif v.currentNode and v.currentNode.add_mode == \"2\" then\n\t\t\t\t\tif (not group) or (group:lower() == (v.currentNode.group or \"\"):lower()) then\n\t\t\t\t\t\tremoveNodesSet[v.currentNode[\".name\"]] = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tfor _, value in ipairs(config.currentNodes) do\n\t\t\t\tif not removeNodesSet[value.currentNode[\".name\"]] then\n\t\t\t\t\tnewNodes[#newNodes + 1] = value.currentNode[\".name\"]\n\t\t\t\tend\n\t\t\tend\n\t\t\tif config.set then\n\t\t\t\tconfig.set(config, newNodes)\n\t\t\tend\n\t\telse\n\t\t\tif config.currentNode and config.currentNode.add_mode == \"2\" then\n\t\t\t\tif (not group) or (group:lower() == (config.currentNode.group or \"\"):lower()) then\n\t\t\t\t\tif config.delete then\n\t\t\t\t\t\tconfig.delete(config)\n\t\t\t\t\telseif config.set then\n\t\t\t\t\t\tconfig.set(config, \"\")\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\tuci:foreach(appname, \"nodes\", function(node)\n\t\tif node.add_mode == \"2\" then\n\t\t\tif (not group) or (group:lower() == (node.group or \"\"):lower()) then\n\t\t\t\tuci:delete(appname, node['.name'])\n\t\t\tend\n\t\tend\n\tend)\n\tuci:foreach(appname, \"subscribe_list\", function(o)\n\t\tif (not group) or (group:lower() == (o.remark or \"\"):lower()) then\n\t\t\tuci:delete(appname, o['.name'], \"md5\")\n\t\tend\n\tend)\n\tapi.uci_save(uci, appname, true)\nend\n\nlocal function select_node(nodes, config, parentConfig)\n\tif config.currentNode then\n\t\tlocal server\n\t\t-- 负载均衡、urltest中的 Socks [端口] 节点保持原id\n\t\tif config.currentNode[\"Socks\"] then\n\t\t\tserver = config.currentNode.Socks\n\t\tend\n\t\t-- 特别优先级 cfgid\n\t\tif config.currentNode[\".name\"] then\n\t\t\tfor index, node in pairs(nodes) do\n\t\t\t\tif node[\".name\"] == config.currentNode[\".name\"] then\n\t\t\t\t\tif config.log == nil or config.log == true then\n\t\t\t\t\t\tlog('更新【' .. config.remarks .. '】匹配节点：' .. node.remarks)\n\t\t\t\t\tend\n\t\t\t\t\tserver = node[\".name\"]\n\t\t\t\t\tbreak\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\t-- 第一优先级 类型 + 备注 + IP + 端口\n\t\tif not server then\n\t\t\tfor index, node in pairs(nodes) do\n\t\t\t\tif config.currentNode.type and config.currentNode.remarks and config.currentNode.address and config.currentNode.port then\n\t\t\t\t\tif node.type and node.remarks and node.address and node.port then\n\t\t\t\t\t\tif node.type == config.currentNode.type and node.remarks == config.currentNode.remarks and (node.address .. ':' .. node.port == config.currentNode.address .. ':' .. config.currentNode.port) then\n\t\t\t\t\t\t\tif config.log == nil or config.log == true then\n\t\t\t\t\t\t\t\tlog('更新【' .. config.remarks .. '】第一匹配节点：' .. node.remarks)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tserver = node[\".name\"]\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\t-- 第二优先级 类型 + IP + 端口\n\t\tif not server then\n\t\t\tfor index, node in pairs(nodes) do\n\t\t\t\tif config.currentNode.type and config.currentNode.address and config.currentNode.port then\n\t\t\t\t\tif node.type and node.address and node.port then\n\t\t\t\t\t\tif node.type == config.currentNode.type and (node.address .. ':' .. node.port == config.currentNode.address .. ':' .. config.currentNode.port) then\n\t\t\t\t\t\t\tif config.log == nil or config.log == true then\n\t\t\t\t\t\t\t\tlog('更新【' .. config.remarks .. '】第二匹配节点：' .. node.remarks)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tserver = node[\".name\"]\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\t-- 第三优先级 IP + 端口\n\t\tif not server then\n\t\t\tfor index, node in pairs(nodes) do\n\t\t\t\tif config.currentNode.address and config.currentNode.port then\n\t\t\t\t\tif node.address and node.port then\n\t\t\t\t\t\tif node.address .. ':' .. node.port == config.currentNode.address .. ':' .. config.currentNode.port then\n\t\t\t\t\t\t\tif config.log == nil or config.log == true then\n\t\t\t\t\t\t\t\tlog('更新【' .. config.remarks .. '】第三匹配节点：' .. node.remarks)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tserver = node[\".name\"]\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\t-- 第四优先级 IP\n\t\tif not server then\n\t\t\tfor index, node in pairs(nodes) do\n\t\t\t\tif config.currentNode.address then\n\t\t\t\t\tif node.address then\n\t\t\t\t\t\tif node.address == config.currentNode.address then\n\t\t\t\t\t\t\tif config.log == nil or config.log == true then\n\t\t\t\t\t\t\t\tlog('更新【' .. config.remarks .. '】第四匹配节点：' .. node.remarks)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tserver = node[\".name\"]\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\t-- 第五优先级备注\n\t\tif not server then\n\t\t\tfor index, node in pairs(nodes) do\n\t\t\t\tif config.currentNode.remarks then\n\t\t\t\t\tif node.remarks then\n\t\t\t\t\t\tif node.remarks == config.currentNode.remarks then\n\t\t\t\t\t\t\tif config.log == nil or config.log == true then\n\t\t\t\t\t\t\t\tlog('更新【' .. config.remarks .. '】第五匹配节点：' .. node.remarks)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tserver = node[\".name\"]\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif not parentConfig then\n\t\t\t-- 还不行 随便找一个\n\t\t\tif not server then\n\t\t\t\tif #nodes_table > 0 then\n\t\t\t\t\tif config.log == nil or config.log == true then\n\t\t\t\t\t\tlog('【' .. config.remarks .. '】' .. '无法找到最匹配的节点，当前已更换为：' .. nodes_table[1].remarks)\n\t\t\t\t\tend\n\t\t\t\t\tserver = nodes_table[1][\".name\"]\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif server then\n\t\t\tif parentConfig then\n\t\t\t\tconfig.set(parentConfig, server)\n\t\t\telse\n\t\t\t\tconfig.set(config, server)\n\t\t\tend\n\t\tend\n\telse\n\t\tif not parentConfig then\n\t\t\tconfig.set(config, \"\")\n\t\tend\n\tend\nend\n\nlocal function update_node(manual)\n\tif next(nodeResult) == nil then\n\t\tlog(\"没有可用的节点信息更新。\")\n\t\treturn\n\tend\n\n\tlocal group = {}\n\tfor _, v in ipairs(nodeResult) do\n\t\tgroup[v[\"remark\"]:lower()] = true\n\tend\n\n\tif manual == 0 and next(group) then\n\t\tuci:foreach(appname, \"nodes\", function(node)\n\t\t\t-- 如果未发现新节点或手动导入的节点就不要删除了...\n\t\t\tif node.add_mode == \"2\" and (node.group and group[node.group:lower()] == true) then\n\t\t\t\tuci:delete(appname, node['.name'])\n\t\t\tend\n\t\tend)\n\tend\n\tfor _, v in ipairs(nodeResult) do\n\t\tlocal remark = v[\"remark\"]\n\t\tlocal list = v[\"list\"]\n\t\tlocal sub_cfg = v[\"sub_cfg\"]\n\t\tlocal domain_resolver, domain_resolver_dns, domain_resolver_dns_https, domain_strategy\n\t\tlocal preproxy_node_group, to_node_group, chain_node_type = \"\", \"\", \"\"\n\t\t-- Subscription Group Chain Agent\n\t\tlocal function valid_chain_node(node)\n\t\t\tif not node then return \"\" end\n\t\t\tlocal cp = uci:get(appname, node, \"chain_proxy\") or \"\"\n\t\t\tlocal am = uci:get(appname, node, \"add_mode\") or \"0\"\n\t\t\tchain_node_type = (cp == \"\" and am ~= \"2\") and (uci:get(appname, node, \"type\") or \"\") or \"\"\n\t\t\tif chain_node_type ~= \"Xray\" and chain_node_type ~= \"sing-box\" then\n\t\t\t\tchain_node_type = \"\"\n\t\t\t\treturn \"\"\n\t\t\tend\n\t\t\treturn node\n\t\tend\n\t\tif sub_cfg then\n\t\t\tdomain_resolver = sub_cfg.domain_resolver\n\t\t\tdomain_resolver_dns = sub_cfg.domain_resolver_dns\n\t\t\tdomain_resolver_dns_https = sub_cfg.domain_resolver_dns_https\n\t\t\tlocal map = { UseIPv4v6 = 1, UseIPv6v4 = 1, UseIPv4 = 1, UseIPv6 = 1 }\n\t\t\tdomain_strategy = (sub_cfg.domain_strategy and map[sub_cfg.domain_strategy]) and sub_cfg.domain_strategy or nil\n\t\t\tpreproxy_node_group = (sub_cfg.chain_proxy == \"1\") and valid_chain_node(sub_cfg.preproxy_node) or \"\"\n\t\t\tto_node_group = (sub_cfg.chain_proxy == \"2\") and valid_chain_node(sub_cfg.to_node) or \"\"\n\t\tend\n\t\tfor _, vv in ipairs(list) do\n\t\t\tlocal cfgid = uci:section(appname, \"nodes\", api.gen_short_uuid())\n\t\t\tfor kkk, vvv in pairs(vv) do\n\t\t\t\tif type(vvv) == \"table\" and next(vvv) ~= nil then\n\t\t\t\t\tuci:set_list(appname, cfgid, kkk, vvv)\n\t\t\t\telse\n\t\t\t\t\tif kkk ~= \"group\" or vvv ~= \"default\" then\n\t\t\t\t\t\tuci:set(appname, cfgid, kkk, vvv)\n\t\t\t\t\tend\n\t\t\t\t\t-- sing-box/xray 节点域名解析\n\t\t\t\t\tif kkk == \"type\" and (vvv == \"Xray\" or vvv == \"sing-box\") then\n\t\t\t\t\t\tif domain_resolver then\n\t\t\t\t\t\t\tuci:set(appname, cfgid, \"domain_resolver\", domain_resolver)\n\t\t\t\t\t\t\tif domain_resolver_dns then\n\t\t\t\t\t\t\t\tuci:set(appname, cfgid, \"domain_resolver_dns\", domain_resolver_dns)\n\t\t\t\t\t\t\telseif domain_resolver_dns_https then\n\t\t\t\t\t\t\t\tuci:set(appname, cfgid, \"domain_resolver_dns_https\", domain_resolver_dns_https)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif domain_strategy then\n\t\t\t\t\t\t\tlocal ds = domain_strategy\n\t\t\t\t\t\t\tif vvv == \"sing-box\" then\n\t\t\t\t\t\t\t\tlocal map = { UseIPv4v6 = \"prefer_ipv4\", UseIPv6v4 = \"prefer_ipv6\", UseIPv4 = \"ipv4_only\", UseIPv6 = \"ipv6_only\" }\n\t\t\t\t\t\t\t\tds = map[ds] or \"\"\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tuci:set(appname, cfgid, \"domain_strategy\", ds)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\t-- 订阅组链式代理\n\t\t\t\t\tif chain_node_type ~= \"\" and kkk == \"type\" and (vvv == \"Xray\" or vvv == \"sing-box\") then\n\t\t\t\t\t\tif preproxy_node_group ~=\"\" then\n\t\t\t\t\t\t\tuci:set(appname, cfgid, \"chain_proxy\", \"1\")\n\t\t\t\t\t\t\tuci:set(appname, cfgid, \"preproxy_node\", preproxy_node_group)\n\t\t\t\t\t\telseif to_node_group ~= \"\" then\n\t\t\t\t\t\t\tuci:set(appname, cfgid, \"chain_proxy\", \"2\")\n\t\t\t\t\t\t\tuci:set(appname, cfgid, \"to_node\", to_node_group)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\t\t\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\t-- 更新机场信息\n\tfor cfgid, info in pairs(subscribe_info) do\n\t\tfor key, value in pairs(info) do\n\t\t\tif value ~= \"\" then\n\t\t\t\tuci:set(appname, cfgid, key, value)\n\t\t\telse\n\t\t\t\tuci:delete(appname, cfgid, key)\n\t\t\tend\n\t\tend\n\tend\n\n\tif next(CONFIG) then\n\t\tlocal nodes = {}\n\t\tuci:foreach(appname, \"nodes\", function(node)\n\t\t\tnodes[#nodes + 1] = node\n\t\tend)\n\n\t\tfor _, config in pairs(CONFIG) do\n\t\t\tif config.currentNodes and #config.currentNodes > 0 then\n\t\t\t\tif config.remarks and config.currentNodes[1].log ~= false then\n\t\t\t\t\tlog('----【' .. config.remarks .. '】----')\n\t\t\t\tend\n\t\t\t\tfor kk, vv in pairs(config.currentNodes) do\n\t\t\t\t\tselect_node(nodes, vv, config)\n\t\t\t\tend\n\t\t\t\tconfig.set(config)\n\t\t\telse\n\t\t\t\tselect_node(nodes, config)\n\t\t\tend\n\t\tend\n\tend\n\n\tapi.uci_save(uci, appname, true)\n\n\tif arg[3] == \"cron\" then\n\t\tif not fs.access(\"/var/lock/\" .. appname .. \".lock\") then\n\t\t\tluci.sys.call(\"touch /tmp/lock/\" .. appname .. \"_cron.lock\")\n\t\tend\n\tend\n\n\tif manual ~= 1 then\n\t\tluci.sys.call(\"/etc/init.d/\" .. appname .. \" restart > /dev/null 2>&1 &\")\n\tend\nend\n\nlocal function parse_link(raw, add_mode, group, sub_cfg)\n\tif raw and #raw > 0 then\n\t\tlocal cfgid\n\t\tif sub_cfg then\n\t\t\tcfgid = sub_cfg[\".name\"]\n\t\tend\n\t\tlocal nodes, szType\n\t\tlocal node_list = {}\n\t\t-- SSD 似乎是这种格式 ssd:// 开头的\n\t\tif raw:find('ssd://') then\n\t\t\tszType = 'ssd'\n\t\t\tlocal nEnd = select(2, raw:find('ssd://'))\n\t\t\tnodes = base64Decode(raw:sub(nEnd + 1, #raw))\n\t\t\tnodes = jsonParse(nodes)\n\t\t\tlocal extra = {\n\t\t\t\tairport = nodes.airport,\n\t\t\t\tport = nodes.port,\n\t\t\t\tencryption = nodes.encryption,\n\t\t\t\tpassword = nodes.password\n\t\t\t}\n\t\t\tlocal servers = {}\n\t\t\t-- SS里面包着 干脆直接这样\n\t\t\tfor _, server in ipairs(nodes.servers) do\n\t\t\t\ttinsert(servers, setmetatable(server, { __index = extra }))\n\t\t\tend\n\t\t\tnodes = servers\n\t\telse\n\t\t\t-- ssd 外的格式\n\t\t\tif add_mode == \"1\" then\n\t\t\t\tnodes = split(raw, \"\\n\")\n\t\t\telse\n\t\t\t\tnodes = split(base64Decode(raw):gsub(\"\\r\\n\", \"\\n\"), \"\\n\")\n\t\t\tend\n\t\tend\n\n\t\tfor _, v in ipairs(nodes) do\n\t\t\tif v and (szType == 'ssd' or not string.match(v, \"^%s*$\")) then\n\t\t\t\txpcall(function ()\n\t\t\t\t\tlocal result\n\t\t\t\t\tif szType == 'ssd' then\n\t\t\t\t\t\tresult = processData(szType, v, add_mode, group, sub_cfg)\n\t\t\t\t\telseif not szType then\n\t\t\t\t\t\tlocal node = api.trim(v)\n\t\t\t\t\t\tlocal dat = split(node, \"://\")\n\t\t\t\t\t\tif dat and dat[1] and dat[2] then\n\t\t\t\t\t\t\tif dat[1] == 'vmess' or dat[1] == 'ssr' then\n\t\t\t\t\t\t\t\tlocal link = api.trim(dat[2]:gsub(\"#.*$\", \"\"))\n\t\t\t\t\t\t\t\tresult = processData(dat[1], base64Decode(link), add_mode, group, sub_cfg)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tlocal link = dat[2]:gsub(\"&amp;\", \"&\"):gsub(\"%s*#%s*\", \"#\")  -- 一些奇葩的链接用\"&amp;\"当做\"&\"，\"#\"前后带空格\n\t\t\t\t\t\t\t\tresult = processData(dat[1], link, add_mode, group, sub_cfg)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\telse\n\t\t\t\t\t\tlog('跳过未知类型：' .. szType)\n\t\t\t\t\tend\n\t\t\t\t\t-- log(result)\n\t\t\t\t\tif result then\n\t\t\t\t\t\tif result.error_msg then\n\t\t\t\t\t\t\tlog('丢弃节点：' .. result.remarks .. \" ，原因：\" .. result.error_msg)\n\t\t\t\t\t\telseif not result.type then\n\t\t\t\t\t\t\tlog('丢弃节点：' .. result.remarks .. \" ，找不到可使用二进制。\")\n\t\t\t\t\t\telseif (add_mode == \"2\" and is_filter_keyword(sub_cfg, result.remarks)) or not result.address or result.remarks == \"NULL\" or result.address == \"127.0.0.1\" or\n\t\t\t\t\t\t\t\t(not datatypes.hostname(result.address) and not (api.is_ip(result.address))) then\n\t\t\t\t\t\t\tlog('丢弃过滤节点：' .. result.type .. ' 节点，' .. result.remarks)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\ttinsert(node_list, result)\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif add_mode == \"2\" then\n\t\t\t\t\t\t\tget_subscribe_info(cfgid, result.remarks)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend, function (err)\n\t\t\t\t\t--log(err)\n\t\t\t\t\tlog(v, \"解析错误，跳过此节点。\")\n\t\t\t\tend\n\t\t\t)\n\t\t\tend\n\t\tend\n\t\tif #node_list > 0 then\n\t\t\tnodeResult[#nodeResult + 1] = {\n\t\t\t\tremark = group,\n\t\t\t\tlist = node_list,\n\t\t\t\tsub_cfg = sub_cfg\n\t\t\t}\n\t\tend\n\t\tlog('成功解析【' .. group .. '】节点数量：' .. #node_list)\n\telse\n\t\tif add_mode == \"2\" then\n\t\t\tlog('获取到的【' .. group .. '】订阅内容为空，可能是订阅地址无效，或是网络问题，请诊断！')\n\t\tend\n\tend\nend\n\nlocal execute = function()\n\tdo\n\t\tlocal subscribe_list = {}\n\t\tlocal fail_list = {}\n\t\tif arg[2] ~= \"all\" then\n\t\t\tstring.gsub(arg[2], '[^' .. \",\" .. ']+', function(w)\n\t\t\t\tsubscribe_list[#subscribe_list + 1] = uci:get_all(appname, w) or {}\n\t\t\tend)\n\t\telse\n\t\t\tuci:foreach(appname, \"subscribe_list\", function(o)\n\t\t\t\tsubscribe_list[#subscribe_list + 1] = o\n\t\t\tend)\n\t\tend\n\n\t\tlocal manual_sub = arg[3] == \"manual\"\n\n\t\tfor index, value in ipairs(subscribe_list) do\n\t\t\tlocal cfgid = value[\".name\"]\n\t\t\tlocal remark = value.remark or \"\"\n\t\t\tlocal url = value.url or \"\"\n\t\t\tlocal tmp_file, ua\n\n\t\t\tlocal url_is_local\n\t\t\tif fs.access(url) then\n\t\t\t\t-- debug, reads local files.\n\t\t\t\tlog('正在订阅:【' .. remark .. '】' .. url)\n\t\t\t\turl_is_local = true\n\t\t\t\ttmp_file = url\n\t\t\telse\n\t\t\t\tua = value.user_agent\n\t\t\t\tlocal access_mode = value.access_mode\n\t\t\t\tlocal result = (not access_mode) and \"自动\" or (access_mode == \"direct\" and \"直连\" or (access_mode == \"proxy\" and \"代理\" or \"自动\"))\n\t\t\t\tlog('正在订阅:【' .. remark .. '】' .. url .. ' [' .. result .. ']')\n\t\t\t\ttmp_file = \"/tmp/\" .. cfgid\n\t\t\t\tlocal return_code\n\t\t\t\treturn_code, value.http_code = curl(url, tmp_file, ua, access_mode)\n\t\t\t\tif return_code ~= 0 then\n\t\t\t\t\tfail_list[#fail_list + 1] = value\n\t\t\t\t\tluci.sys.call(\"rm -f \" .. tmp_file)\n\t\t\t\tend\n\t\t\tend\n\t\t\tif fs.access(tmp_file) then\n\t\t\t\tif luci.sys.call(\"[ -f \" .. tmp_file .. \" ] && sed -i -e '/^[ \\t]*$/d' -e '/^[ \\t]*\\r$/d' \" .. tmp_file) == 0 then\n\t\t\t\t\tlocal f = io.open(tmp_file, \"r\")\n\t\t\t\t\tlocal stdout = f:read(\"*all\")\n\t\t\t\t\tf:close()\n\t\t\t\t\tlocal raw_data = api.trim(stdout)\n\t\t\t\t\tlocal old_md5 = value.md5 or \"\"\n\t\t\t\t\tlocal new_md5 = luci.sys.exec(\"md5sum \" .. tmp_file .. \" 2>/dev/null | awk '{print $1}'\"):gsub(\"\\n\", \"\")\n\t\t\t\t\tif not manual_sub and old_md5 == new_md5 then\n\t\t\t\t\t\tlog('订阅:【' .. remark .. '】没有变化，无需更新。')\n\t\t\t\t\telse\n\t\t\t\t\t\traw_data = parseClashNode(raw_data)\n\t\t\t\t\t\tparse_link(raw_data, \"2\", remark, value)\n\t\t\t\t\t\tuci:set(appname, cfgid, \"md5\", new_md5)\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tfail_list[#fail_list + 1] = value\n\t\t\t\tend\n\t\t\t\tif url_is_local then\n\t\t\t\t\tvalue.http_code = 0\n\t\t\t\telse\n\t\t\t\t\tluci.sys.call(\"rm -f \" .. tmp_file)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tif #fail_list > 0 then\n\t\t\tfor index, value in ipairs(fail_list) do\n\t\t\t\tlog(string.format('【%s】订阅失败，可能是订阅地址无效，或是网络问题，请诊断！[%s]', value.remark, tostring(value.http_code)))\n\t\t\tend\n\t\tend\n\t\tupdate_node(0)\n\tend\nend\n\nlocal function check_instance(action)\n\tlocal sub_lock = \"/var/lock/\" .. appname .. \"_subscribe.lock\"\n\tlocal rule_lock = \"/var/lock/\" .. appname .. \"_rule_update.lock\"\n\n\tif action == \"start\" then\n\t\tmath.randomseed(os.time() + math.floor(os.clock() * 1000))\n\t\tapi.nixio.nanosleep(0, math.random(100, 1000) * 1000000)\n\t\tif fs.access(sub_lock) then\n\t\t\tlog(\"有[订阅]实例正在运行，请稍后再试...\\n\")\n\t\t\tos.exit(0)\n\t\telse\n\t\t\tluci.sys.call(\"touch \" .. sub_lock)\n\t\t\tuci:revert(appname)\n\t\tend\n\telseif action == \"end\" then\n\t\tluci.sys.call(\"rm -f \" .. sub_lock)\n\t\treturn\n\tend\n\n\tif fs.access(rule_lock) then\n\t\tlog(\"[规则更新]实例正在运行，[订阅]进入队列等待...\\n\")\n\tend\n\twhile fs.access(rule_lock) do\n\t\tapi.nixio.nanosleep(2, 0)\n\tend\nend\n\nif arg[1] then\n\tcheck_instance(\"start\")\n\n\tif arg[1] == \"start\" then\n\t\tlog('开始订阅...')\n\t\txpcall(execute, function(e)\n\t\t\tlog(e)\n\t\t\tif type(debug) == \"table\" and type(debug.traceback) == \"function\" then\n\t\t\t\tlog(debug.traceback())\n\t\t\tend\n\t\t\tlog('发生错误, 正在恢复服务')\n\t\tend)\n\t\tlog('订阅完毕...\\n')\n\telseif arg[1] == \"add\" then\n\t\tlocal f = assert(io.open(\"/tmp/links.conf\", 'r'))\n\t\tlocal raw = f:read('*all')\n\t\tf:close()\n\t\tparse_link(raw, \"1\", arg[2])\n\t\tupdate_node(1)\n\t\tluci.sys.call(\"rm -f /tmp/links.conf\")\n\telseif arg[1] == \"truncate\" then\n\t\ttruncate_nodes(arg[2])\n\tend\n\n\tcheck_instance(\"end\")\nend\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/tasks.sh",
    "content": "#!/bin/sh\n\n## 循环更新脚本\n\n. /usr/share/passwall/utils.sh\nLOCK_FILE=${LOCK_PATH}/${CONFIG}_tasks.lock\n\nCFG_UPDATE_INT=0\n\nexec 99>\"$LOCK_FILE\"\nflock -n 99\nif [ \"$?\" != 0 ]; then\n\texit 0\nfi\n\nwhile true\ndo\n\n\tif [ \"$CFG_UPDATE_INT\" -ne 0 ]; then\n\n\t\tstop_week_mode=$(config_t_get global_delay stop_week_mode)\n\t\tstop_interval_mode=$(config_t_get global_delay stop_interval_mode)\n\t\tstop_interval_mode=$(expr \"$stop_interval_mode\" \\* 60)\n\t\tif [ -n \"$stop_week_mode\" ]; then\n\t\t\t[ \"$stop_week_mode\" = \"8\" ] && {\n\t\t\t\t[ \"$(expr \"$CFG_UPDATE_INT\" % \"$stop_interval_mode\")\" -eq 0 ] && /etc/init.d/$CONFIG stop > /dev/null 2>&1 &\n\t\t\t}\n\t\tfi\n\n\t\tstart_week_mode=$(config_t_get global_delay start_week_mode)\n\t\tstart_interval_mode=$(config_t_get global_delay start_interval_mode)\n\t\tstart_interval_mode=$(expr \"$start_interval_mode\" \\* 60)\n\t\tif [ -n \"$start_week_mode\" ]; then\n\t\t\t[ \"$start_week_mode\" = \"8\" ] && {\n\t\t\t\t[ \"$(expr \"$CFG_UPDATE_INT\" % \"$start_interval_mode\")\" -eq 0 ] && /etc/init.d/$CONFIG start > /dev/null 2>&1 &\n\t\t\t}\n\t\tfi\n\n\t\trestart_week_mode=$(config_t_get global_delay restart_week_mode)\n\t\trestart_interval_mode=$(config_t_get global_delay restart_interval_mode)\n\t\trestart_interval_mode=$(expr \"$restart_interval_mode\" \\* 60)\n\t\tif [ -n \"$restart_week_mode\" ]; then\n\t\t\t[ \"$restart_week_mode\" = \"8\" ] && {\n\t\t\t\t[ \"$(expr \"$CFG_UPDATE_INT\" % \"$restart_interval_mode\")\" -eq 0 ] && /etc/init.d/$CONFIG restart > /dev/null 2>&1 &\n\t\t\t}\n\t\tfi\n\n\t\tautoupdate=$(config_t_get global_rules auto_update)\n\t\tweekupdate=$(config_t_get global_rules week_update)\n\t\thourupdate=$(config_t_get global_rules interval_update)\n\t\thourupdate=$(expr \"$hourupdate\" \\* 60)\n\t\tif [ \"$autoupdate\" = \"1\" ]; then\n\t\t\t[ \"$weekupdate\" = \"8\" ] && {\n\t\t\t\t[ \"$(expr \"$CFG_UPDATE_INT\" % \"$hourupdate\")\" -eq 0 ] && lua $APP_PATH/rule_update.lua log all cron > /dev/null 2>&1 &\n\t\t\t}\n\t\tfi\n\n\t\tTMP_SUB_PATH=$TMP_PATH/sub_tasks\n\t\tmkdir -p $TMP_SUB_PATH\n\t\tfor item in $(uci show ${CONFIG} | grep \"=subscribe_list\" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do\n\t\t\tif [ \"$(config_n_get $item auto_update 0)\" = \"1\" ]; then\n\t\t\t\tcfgid=$(uci show ${CONFIG}.$item | head -n 1 | cut -d '.' -sf 2 | cut -d '=' -sf 1)\n\t\t\t\tremark=$(config_n_get $item remark)\n\t\t\t\tweek_update=$(config_n_get $item week_update)\n\t\t\t\thour_update=$(config_n_get $item interval_update)\n\t\t\t\techo \"$cfgid\" >> $TMP_SUB_PATH/${week_update}_${hour_update}\n\t\t\tfi\n\t\tdone\n\n\t\t[ -d \"${TMP_SUB_PATH}\" ] && {\n\t\t\tfor name in $(ls ${TMP_SUB_PATH}); do\n\t\t\t\tweek_update=$(echo $name | awk -F '_' '{print $1}')\n\t\t\t\thour_update=$(echo $name | awk -F '_' '{print $2}')\n\t\t\t\thour_update=$(expr \"$hour_update\" \\* 60)\n\t\t\t\tcfgids=$(echo -n $(cat ${TMP_SUB_PATH}/${name}) | sed 's# #,#g')\n\t\t\t\t[ \"$week_update\" = \"8\" ] && {\n\t\t\t\t\t[ \"$(expr \"$CFG_UPDATE_INT\" % \"$hour_update\")\" -eq 0 ] && lua $APP_PATH/subscribe.lua start $cfgids cron > /dev/null 2>&1 &\n\t\t\t\t}\n\n\t\t\tdone\n\t\t\trm -rf $TMP_SUB_PATH\n\t\t}\n\n\tfi\n\n\tCFG_UPDATE_INT=$(expr \"$CFG_UPDATE_INT\" + 10)\n\n\tsleep 600\n\ndone 2>/dev/null\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/test.sh",
    "content": "#!/bin/sh\n\n. /usr/share/passwall/utils.sh\n\ntest_url() {\n\tlocal url=$1\n\tlocal try=1\n\t[ -n \"$2\" ] && try=$2\n\tlocal timeout=2\n\t[ -n \"$3\" ] && timeout=$3\n\tlocal extra_params=$4\n\tcurl --help all | grep \"\\-\\-retry-all-errors\" > /dev/null\n\t[ $? == 0 ] && extra_params=\"--retry-all-errors ${extra_params}\"\n\tstatus=$(/usr/bin/curl -I -o /dev/null -skL $extra_params --connect-timeout ${timeout} --retry ${try} -w %{http_code} \"$url\")\n\tcase \"$status\" in\n\t\t204|\\\n\t\t200)\n\t\t\tstatus=200\n\t\t;;\n\tesac\n\techo $status\n}\n\ntest_proxy() {\n\tresult=0\n\tstatus=$(test_url \"https://www.google.com/generate_204\" ${retry_num} ${connect_timeout})\n\tif [ \"$status\" = \"200\" ]; then\n\t\tresult=0\n\telse\n\t\tstatus2=$(test_url \"https://www.baidu.com\" ${retry_num} ${connect_timeout})\n\t\tif [ \"$status2\" = \"200\" ]; then\n\t\t\tresult=1\n\t\telse\n\t\t\tresult=2\n\t\t\tping -c 3 -W 1 223.5.5.5 > /dev/null 2>&1\n\t\t\t[ $? -eq 0 ] && {\n\t\t\t\tresult=1\n\t\t\t}\n\t\tfi\n\tfi\n\techo $result\n}\n\nurl_test_node() {\n\tresult=0\n\tlocal node_id=$1\n\tlocal _type=$(echo $(config_n_get ${node_id} type) | tr 'A-Z' 'a-z')\n\t[ -n \"${_type}\" ] && {\n\t\tif [ \"${_type}\" == \"socks\" ]; then\n\t\t\tlocal _address=$(config_n_get ${node_id} address)\n\t\t\tlocal _port=$(config_n_get ${node_id} port)\n\t\t\t[ -n \"${_address}\" ] && [ -n \"${_port}\" ] && {\n\t\t\t\tlocal curlx=\"socks5h://${_address}:${_port}\"\n\t\t\t\tlocal _username=$(config_n_get ${node_id} username)\n\t\t\t\tlocal _password=$(config_n_get ${node_id} password)\n\t\t\t\t[ -n \"${_username}\" ] && [ -n \"${_password}\" ] && curlx=\"socks5h://${_username}:${_password}@${_address}:${_port}\"\n\t\t\t}\n\t\telse\n\t\t\tlocal _tmp_port=$(get_new_port 48900 tcp,udp)\n\t\t\tNO_REC_PROCESS=1 /usr/share/${CONFIG}/app.sh run_socks flag=\"url_test_${node_id}\" node=${node_id} bind=127.0.0.1 socks_port=${_tmp_port} config_file=url_test_${node_id}.json\n\t\t\tlocal curlx=\"socks5h://127.0.0.1:${_tmp_port}\"\n\t\tfi\n\t\tsleep 2s\n\t\tlocal probeUrl=$(config_t_get global_other url_test_url https://www.google.com/generate_204)\n\t\tresult=$(curl --connect-timeout 3 --max-time 5 -o /dev/null -I -skL -w \"%{http_code}:%{time_pretransfer}\" -x ${curlx} \"${probeUrl}\")\n\t\t# 结束 SS 插件进程\n\t\tlocal pid_file=\"/tmp/etc/${CONFIG}/url_test_${node_id}_plugin.pid\"\n\t\t[ -s \"$pid_file\" ] && kill -9 \"$(head -n 1 \"$pid_file\")\" >/dev/null 2>&1\n\t\tpgrep -af \"url_test_${node_id}\" | awk '! /test\\.sh/{print $1}' | xargs kill -9 >/dev/null 2>&1\n\t\trm -rf /tmp/etc/${CONFIG}/*url_test_${node_id}*.*\n\t}\n\techo $result\n}\n\narg1=$1\nshift\ncase $arg1 in\ntest_url)\n\ttest_url $@\n\t;;\nurl_test_node)\n\turl_test_node $@\n\t;;\nesac\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/passwall/utils.sh",
    "content": "#!/bin/sh\n# Copyright (C) 2022-2025 xiaorouji\n# Copyright (C) 2026 Openwrt-Passwall Organization\n\nCONFIG=passwall\nAPP_PATH=/usr/share/${CONFIG}\nTMP_PATH=/tmp/etc/${CONFIG}\nTMP_PATH2=${TMP_PATH}_tmp\nLOCK_PATH=/tmp/lock\nLOG_FILE=/tmp/log/${CONFIG}.log\nTMP_ACL_PATH=${TMP_PATH}/acl\nTMP_BIN_PATH=${TMP_PATH}/bin\nTMP_IFACE_PATH=${TMP_PATH}/iface\nTMP_ROUTE_PATH=${TMP_PATH}/route\nTMP_SCRIPT_FUNC_PATH=${TMP_PATH}/script_func\nRULES_PATH=/usr/share/${CONFIG}/rules\n\n. /lib/functions/network.sh\n\necholog() {\n\tlocal d=\"$(date \"+%Y-%m-%d %H:%M:%S\")\"\n\techo -e \"$d: $*\" >>$LOG_FILE\n}\n\nclean_log() {\n\tlogsnum=$(cat $LOG_FILE 2>/dev/null | wc -l)\n\t[ \"$logsnum\" -gt 1000 ] && {\n\t\techo \"\" > $LOG_FILE\n\t\techolog \"日志文件过长，清空处理！\"\n\t}\n}\n\nconfig_get_type() {\n\tlocal ret=$(uci -q get \"${CONFIG}.${1}\" 2>/dev/null)\n\techo \"${ret:=$2}\"\n}\n\nconfig_n_get() {\n\tlocal ret=$(uci -q get \"${CONFIG}.${1}.${2}\" 2>/dev/null)\n\techo \"${ret:=$3}\"\n}\n\nconfig_t_get() {\n\tlocal index=${4:-0}\n\tlocal ret=$(uci -q get \"${CONFIG}.@${1}[${index}].${2}\" 2>/dev/null)\n\techo \"${ret:=${3}}\"\n}\n\nconfig_t_set() {\n\tlocal index=${4:-0}\n\tlocal ret=$(uci -q set \"${CONFIG}.@${1}[${index}].${2}=${3}\" 2>/dev/null)\n}\n\nfirst_type() {\n\t[ \"${1#/}\" != \"$1\" ] && [ -x \"$1\" ] && echo \"$1\" && return\n\tfor p in \"/bin/$1\" \"/usr/bin/$1\" \"${TMP_BIN_PATH:-/tmp}/$1\"; do\n\t\t[ -x \"$p\" ] && echo \"$p\" && return\n\tdone\n\tcommand -v \"$1\" 2>/dev/null || command -v \"$2\" 2>/dev/null\n}\n\nget_enabled_anonymous_secs() {\n\tuci -q show \"${CONFIG}\" | grep \"${1}\\[.*\\.enabled='1'\" | cut -d '.' -sf2\n}\n\nget_geoip() {\n\tlocal geo_output_path=\"$TMP_PATH2/geo_output\"\n\tmkdir -p ${geo_output_path}\n\tlocal geoip_code=\"$1\"\n\tlocal geoip_type_flag=\"\"\n\tlocal output_path=\"${geo_output_path}/geoip-${geoip_code}-$2\"\n\t[ ! -s \"${output_path}\" ] && {\n\t\tlocal geoip_path=\"$(config_t_get global_rules v2ray_location_asset)\"\n\t\tgeoip_path=\"${geoip_path%*/}/geoip.dat\"\n\t\tlocal bin=\"$(first_type $(config_t_get global_app geoview_file) geoview)\"\n\t\t[ -n \"$bin\" ] && [ -s \"$geoip_path\" ] || { echo \"\"; return; }\n\t\tcase \"$2\" in\n\t\t\t\"ipv4\") geoip_type_flag=\"-ipv6=false\" ;;\n\t\t\t\"ipv6\") geoip_type_flag=\"-ipv4=false\" ;;\n\t\tesac\n\t\t\"$bin\" -input \"$geoip_path\" -list \"$geoip_code\" $geoip_type_flag -lowmem=true -output ${output_path}\n\t}\n\t[ -s \"${output_path}\" ] && cat \"${output_path}\"\n}\n\nget_host_ip() {\n\tlocal host=$2\n\tlocal count=$3\n\t[ -z \"$count\" ] && count=3\n\tlocal isip=\"\"\n\tlocal ip=\"\"\n\tif [ \"$1\" == \"ipv6\" ]; then\n\t\tisip=$(echo $host | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\")\n\t\tif [ -n \"$isip\" ]; then\n\t\t\tip=$(echo \"$host\" | tr -d '[]')\n\t\tfi\n\telse\n\t\tisip=$(echo $host | grep -E \"([0-9]{1,3}[\\.]){3}[0-9]{1,3}\")\n\t\t[ -n \"$isip\" ] && ip=$isip\n\tfi\n\t[ -z \"$isip\" ] && {\n\t\tlocal t=4\n\t\t[ \"$1\" == \"ipv6\" ] && t=6\n\t\tlocal vpsrip=$(resolveip -$t -t $count $host | awk 'NR==1{print}')\n\t\tip=$vpsrip\n\t}\n\t[ -n \"$ip\" ] && echo \"$ip\"\n}\n\nget_node_host_ip() {\n\tlocal ip\n\tlocal address=$(config_n_get $1 address)\n\t[ -n \"$address\" ] && {\n\t\tlocal use_ipv6=$(config_n_get $1 use_ipv6)\n\t\tlocal network_type=\"ipv4\"\n\t\t[ \"$use_ipv6\" == \"1\" ] && network_type=\"ipv6\"\n\t\tip=$(get_host_ip $network_type $address)\n\t}\n\techo $ip\n}\n\nget_ip_port_from() {\n\tlocal __host=${1}; shift 1\n\tlocal __ipv=${1}; shift 1\n\tlocal __portv=${1}; shift 1\n\tlocal __ucipriority=${1}; shift 1\n\n\tlocal val1 val2\n\tval2=$(echo \"$__host\" | sed -n '\n\t\ts/^[^#]*[#]\\([0-9]*\\)$/\\1/p; t;\n\t\ts/^\\(\\[[^]]*\\]\\)[:]\\([0-9]*\\)$/\\2/p; t;\n\t\ts/^.*[:#]\\([0-9]*\\)$/\\1/p\n\t')\n\tif [ -n \"${__ucipriority}\" ]; then\n\t\tval2=$(config_n_get ${__host} port \"${val2}\")\n\t\tval1=$(config_n_get ${__host} address \"${__host%%${val2:+[:#]${val2}*}}\")\n\telse\n\t\tval1=\"${__host%%${val2:+[:#]${val2}*}}\"\n\tfi\n\teval \"${__ipv}=\\\"$val1\\\"; ${__portv}=\\\"$val2\\\"\"\n}\n\nparse_doh() {\n\tlocal __doh=$1 __url_var=$2 __host_var=$3 __port_var=$4 __bootstrap_var=$5\n\t__doh=$(printf '%s' \"$__doh\" | tr -d ' \\t\\n')\n\tlocal __url=${__doh%%,*}\n\tlocal __bootstrap=${__doh#*,}\n\t[ \"$__bootstrap\" = \"$__doh\" ] && __bootstrap=\"\"\n\tlocal __host_port=$(lua_api \"get_domain_from_url(\\\"${__url}\\\")\")\n\tlocal __host __port\n\tif echo \"${__host_port}\" | grep -q '^\\[.*\\]:[0-9]\\+$'; then\n\t\t__host=${__host_port%%]:*}]\n\t\t__port=${__host_port##*:}\n\telif echo \"${__host_port}\" | grep -q ':[0-9]\\+$'; then\n\t\t__host=${__host_port%:*}\n\t\t__port=${__host_port##*:}\n\telse\n\t\t__host=${__host_port}\n\t\t__port=443\n\tfi\n\t__host=${__host#[}\n\t__host=${__host%]}\n\tif [ \"$(lua_api \"is_ip(\\\"${__host}\\\")\")\" = \"true\" ]; then\n\t\t__bootstrap=${__host}\n\tfi\n\t__bootstrap=${__bootstrap#[}\n\t__bootstrap=${__bootstrap%]}\n\teval \"${__url_var}='${__url}' ${__host_var}='${__host}' ${__port_var}='${__port}' ${__bootstrap_var}='${__bootstrap}'\"\n}\n\nhost_from_url(){\n\tlocal f=\"${1}\"\n\n\t## Remove protocol part of url  ##\n\tf=\"${f##http://}\"\n\tf=\"${f##https://}\"\n\tf=\"${f##ftp://}\"\n\tf=\"${f##sftp://}\"\n\n\t## Remove username and/or username:password part of URL  ##\n\tf=\"${f##*:*@}\"\n\tf=\"${f##*@}\"\n\n\t## Remove rest of urls ##\n\tf=\"${f%%/*}\"\n\techo \"${f%%:*}\"\n}\n\nhosts_foreach() {\n\tlocal __hosts\n\teval \"__hosts=\\$${1}\"; shift 1\n\tlocal __func=${1}; shift 1\n\tlocal __default_port=${1}; shift 1\n\tlocal __ret=1\n\n\t[ -z \"${__hosts}\" ] && return 0\n\tlocal __ip __port\n\tfor __host in $(echo $__hosts | sed 's/[ ,]/\\n/g'); do\n\t\tget_ip_port_from \"$__host\" \"__ip\" \"__port\"\n\t\teval \"$__func \\\"${__host}\\\" \\\"\\${__ip}\\\" \\\"\\${__port:-${__default_port}}\\\" \\\"$@\\\"\"\n\t\t__ret=$?\n\t\t[ ${__ret} -ge ${ERROR_NO_CATCH:-1} ] && return ${__ret}\n\tdone\n}\n\ncheck_host() {\n\tlocal f=${1}\n\ta=$(echo $f | grep \"\\/\")\n\t[ -n \"$a\" ] && return 1\n\t# 判断是否包含汉字~\n\tlocal tmp=$(echo -n $f | awk '{print gensub(/[!-~]/,\"\",\"g\",$0)}')\n\t[ -n \"$tmp\" ] && return 1\n\treturn 0\n}\n\nget_first_dns() {\n\tlocal __hosts_val=${1}; shift 1\n\t__first() {\n\t\t[ -z \"${2}\" ] && return 0\n\t\techo \"${2}#${3}\"\n\t\treturn 1\n\t}\n\teval \"hosts_foreach \\\"${__hosts_val}\\\" __first \\\"$@\\\"\"\n}\n\nget_last_dns() {\n\tlocal __hosts_val=${1}; shift 1\n\tlocal __first __last\n\t__every() {\n\t\t[ -z \"${2}\" ] && return 0\n\t\t__last=\"${2}#${3}\"\n\t\t__first=${__first:-${__last}}\n\t}\n\teval \"hosts_foreach \\\"${__hosts_val}\\\" __every \\\"$@\\\"\"\n\t[ \"${__first}\" ==  \"${__last}\" ] || echo \"${__last}\"\n}\n\ncheck_port_exists() {\n\tlocal port=$1\n\tlocal protocol=$2\n\t[ -n \"$protocol\" ] || protocol=\"tcp,udp\"\n\tlocal result=\n\tif [ \"$protocol\" = \"tcp\" ]; then\n\t\tresult=$(netstat -tln | grep -c \":$port \")\n\telif [ \"$protocol\" = \"udp\" ]; then\n\t\tresult=$(netstat -uln | grep -c \":$port \")\n\telif [ \"$protocol\" = \"tcp,udp\" ]; then\n\t\tresult=$(netstat -tuln | grep -c \":$port \")\n\tfi\n\techo \"${result}\"\n}\n\nget_new_port() {\n\tlocal default_start_port=2001\n\tlocal min_port=1025\n\tlocal max_port=49151\n\tlocal port=\"$1\"\n\tlocal protocol=$(echo \"$2\" | tr 'A-Z' 'a-z')\n\tlocal LOCK_FILE=\"${LOCK_PATH}/${CONFIG}_get_prot.lock\"\n\twhile ! mkdir \"$LOCK_FILE\" 2>/dev/null; do\n\t\tsleep 0.05\n\tdone\n\tif [ \"$port\" = \"auto\" ]; then\n\t\tlocal now last_time diff last_port\n\t\tnow=$(date +%s 2>/dev/null)\n\t\tlast_time=$(get_cache_var \"last_get_new_port_time\")\n\t\tif [ -n \"$now\" ] && [ -n \"$last_time\" ]; then\n\t\t\tdiff=$(expr \"$now\" - \"$last_time\")\n\t\t\t[ \"$diff\" -lt 0 ] && diff=$(expr 0 - \"$diff\")\n\t\telse\n\t\t\tdiff=999\n\t\tfi\n\t\tif [ \"$diff\" -gt 10 ]; then\n\t\t\tport=$default_start_port\n\t\telse\n\t\t\tlast_port=$(get_cache_var \"last_get_new_port_auto\")\n\t\t\tif [ -n \"$last_port\" ]; then\n\t\t\t\tport=$(expr \"$last_port\" + 1)\n\t\t\telse\n\t\t\t\tport=$default_start_port\n\t\t\tfi\n\t\tfi\n\tfi\n\t[ \"$port\" -lt $min_port -o \"$port\" -gt $max_port ] && port=$default_start_port\n\tlocal start_port=\"$port\"\n\twhile :; do\n\t\tif [ \"$(check_port_exists \"$port\" \"$protocol\")\" = 0 ]; then\n\t\t\tbreak\n\t\tfi\n\t\tport=$(expr \"$port\" + 1)\n\t\tif [ \"$port\" -gt $max_port ]; then\n\t\t\tport=$min_port\n\t\tfi\n\t\t[ \"$port\" = \"$start_port\" ] && {\n\t\t\trmdir \"$LOCK_FILE\" 2>/dev/null\n\t\t\treturn 1\n\t\t}\n\tdone\n\tif [ \"$1\" = \"auto\" ]; then\n\t\tset_cache_var \"last_get_new_port_auto\" \"$port\"\n\t\t[ -n \"$now\" ] && set_cache_var \"last_get_new_port_time\" \"$now\"\n\tfi\n\trmdir \"$LOCK_FILE\" 2>/dev/null\n\techo \"$port\"\n}\n\ncheck_ver() {\n\tlocal version1=\"$1\"\n\tlocal version2=\"$2\"\n\tlocal i v1 v1_1 v1_2 v1_3 v2 v2_1 v2_2 v2_3\n\tIFS='.'; set -- $version1; v1_1=${1:-0}; v1_2=${2:-0}; v1_3=${3:-0}\n\tIFS='.'; set -- $version2; v2_1=${1:-0}; v2_2=${2:-0}; v2_3=${3:-0}\n\tIFS=\n\tfor i in 1 2 3; do\n\t\teval v1=\\$v1_$i\n\t\teval v2=\\$v2_$i\n\t\tif [ \"$v1\" -gt \"$v2\" ]; then\n\t\t\t# $1 大于 $2\n\t\t\techo 0\n\t\t\treturn\n\t\telif [ \"$v1\" -lt \"$v2\" ]; then\n\t\t\t# $1 小于 $2\n\t\t\techo 1\n\t\t\treturn\n\t\tfi\n\tdone\n\t# $1 等于 $2\n\techo 255\n}\n\neval_set_val() {\n\tfor i in $@; do\n\t\tfor j in $i; do\n\t\t\teval $j\n\t\tdone\n\tdone\n}\n\neval_unset_val() {\n\tfor i in $@; do\n\t\tfor j in $i; do\n\t\t\teval unset $j\n\t\tdone\n\tdone\n}\n\nlua_api() {\n\tlocal func=${1}\n\t[ -z \"${func}\" ] && {\n\t\techo \"nil\"\n\t\treturn\n\t}\n\techo $(lua -e \"local api = require 'luci.passwall.api' print(api.${func})\")\n}\n\nset_cache_var() {\n\tlocal key=\"${1}\"\n\tshift 1\n\tlocal val=\"$@\"\n\t[ -n \"${key}\" ] && [ -n \"${val}\" ] && {\n\t\t[ ! -d $TMP_PATH ] && mkdir -p $TMP_PATH\n\t\tsed -i \"/${key}=/d\" $TMP_PATH/var >/dev/null 2>&1\n\t\techo \"${key}=\\\"${val}\\\"\" >> $TMP_PATH/var\n\t\teval ${key}=\\\"${val}\\\"\n\t}\n}\n\nget_cache_var() {\n\tlocal key=\"${1}\"\n\t[ -n \"${key}\" ] && [ -s \"$TMP_PATH/var\" ] && {\n\t\techo $(cat $TMP_PATH/var | grep \"^${key}=\" | awk -F '=' '{print $2}' | tail -n 1 | awk -F'\"' '{print $2}')\n\t}\n}\n\neval_cache_var() {\n\t[ -s \"$TMP_PATH/var\" ] && eval $(cat \"$TMP_PATH/var\")\n}\n\nhas_1_65535() {\n\tlocal val=\"$1\"\n\tval=${val//:/-}\n\tcase \",$val,\" in\n\t\t*,1-65535,*) return 0 ;;\n\t\t*) return 1 ;;\n\tesac\n}\n\nadd_ip2route() {\n\tlocal ip=$(get_host_ip \"ipv4\" $1)\n\t[ -z \"$ip\" ] && {\n\t\techolog \"  - 无法解析[${1}]，路由表添加失败！\"\n\t\treturn 1\n\t}\n\tlocal remarks=\"${1}\"\n\t[ \"$remarks\" != \"$ip\" ] && remarks=\"${1}(${ip})\"\n\n\tlocal gateway device\n\tnetwork_get_gateway gateway \"$2\"\n\tnetwork_get_device device \"$2\"\n\t[ -z \"${device}\" ] && device=$(ubus call \"network.interface.$2\" status 2>/dev/null | jsonfilter -e '@.device' 2>/dev/null)\n\t[ -z \"${device}\" ] && [ -d \"/sys/class/net/$2\" ] && device=\"$2\"\n\t[ -z \"${device}\" ] && device=\"$2\"\n\n\tif [ -n \"${gateway}\" ]; then\n\t\troute add -host ${ip} gw ${gateway} dev ${device} >/dev/null 2>&1\n\t\techo \"$ip\" >> $TMP_ROUTE_PATH/${device}\n\t\techolog \"  - [${remarks}]添加到接口[${device}]路由表成功！\"\n\telse\n\t\techolog \"  - [${remarks}]添加到接口[${device}]路由表失功！原因是找不到[${device}]网关。\"\n\tfi\n}\n\ndelete_ip2route() {\n\t[ -d \"${TMP_ROUTE_PATH}\" ] && {\n\t\tlocal interface\n\t\tfor interface in $(ls ${TMP_ROUTE_PATH}); do\n\t\t\tfor ip in $(cat ${TMP_ROUTE_PATH}/${interface}); do\n\t\t\t\troute del -host ${ip} dev ${interface} >/dev/null 2>&1\n\t\t\tdone\n\t\tdone\n\t}\n}\n\nln_run() {\n\tlocal file_func=${1}\n\tlocal ln_name=${2}\n\tlocal output=${3}\n\n\tshift 3;\n\tif [  \"${file_func%%/*}\" != \"${file_func}\" ]; then\n\t\t[ ! -L \"${file_func}\" ] && {\n\t\t\tln -s \"${file_func}\" \"${TMP_BIN_PATH}/${ln_name}\" >/dev/null 2>&1\n\t\t\tfile_func=\"${TMP_BIN_PATH}/${ln_name}\"\n\t\t}\n\t\t[ -x \"${file_func}\" ] || echolog \"  - $(readlink ${file_func}) 没有执行权限，无法启动：${file_func} $*\"\n\tfi\n\t#echo \"${file_func} $*\" >&2\n\t[ -n \"${file_func}\" ] || echolog \"  - 找不到 ${ln_name}，无法启动...\"\n\t[ \"${output}\" != \"/dev/null\" ] && [ \"${ln_name}\" != \"chinadns-ng\" ] && {\n\t\tlocal persist_log_path=$(config_t_get global persist_log_path)\n\t\tlocal sys_log=$(config_t_get global sys_log \"0\")\n\t}\n\tif [ -z \"$persist_log_path\" ] && [ \"$sys_log\" != \"1\" ]; then\n\t\t${file_func:-echolog \" - ${ln_name}\"} \"$@\" >${output} 2>&1 &\n\telse\n\t\t[ \"${output: -1, -7}\" == \"TCP.log\" ] && local protocol=\"TCP\"\n\t\t[ \"${output: -1, -7}\" == \"UDP.log\" ] && local protocol=\"UDP\"\n\t\tif [ -n \"${persist_log_path}\" ]; then\n\t\t\tmkdir -p ${persist_log_path}\n\t\t\tlocal log_file=${persist_log_path}/passwall_${protocol}_${ln_name}_$(date '+%F').log\n\t\t\techolog \"记录到持久性日志文件：${log_file}\"\n\t\t\t${file_func:-echolog \" - ${ln_name}\"} \"$@\" >> ${log_file} 2>&1 &\n\t\t\tsys_log=0\n\t\tfi\n\t\tif [ \"${sys_log}\" == \"1\" ]; then\n\t\t\techolog \"记录 ${ln_name}_${protocol} 到系统日志\"\n\t\t\t${file_func:-echolog \" - ${ln_name}\"} \"$@\" 2>&1 | logger -t PASSWALL_${protocol}_${ln_name} &\n\t\tfi\n\tfi\n\t[ \"$NO_REC_PROCESS\" = \"1\" ] && return\n\tprocess_count=$(ls $TMP_SCRIPT_FUNC_PATH | wc -l)\n\tprocess_count=$((process_count + 1))\n\techo \"${file_func:-echolog \"  - ${ln_name}\"} $@ >${output}\" > $TMP_SCRIPT_FUNC_PATH/$process_count\n}\n\nis_socks_wrap() {\n\tcase \"$1\" in\n\t\tSocks_*) return 0 ;;\n\t\t*)       return 1 ;;\n\tesac\n}\n\nkill_all() {\n\tkill -9 $(pidof \"$@\") >/dev/null 2>&1\n}\n\nget_subscribe_host(){\n\tlocal line\n\tuci show \"${CONFIG}\" | grep \"=subscribe_list\" | while read -r line; do\n\t\tlocal section=\"$(echo \"$line\" | cut -d '.' -sf 2 | cut -d '=' -sf 1)\"\n\t\tlocal url=\"$(config_n_get $section url)\"\n\t\t[ -n \"$url\" ] || continue\n\t\turl=\"$(host_from_url \"$url\")\"\n\t\techo \"$url\"\n\tdone\n}\n\ngen_lanlist() {\n\tcat $RULES_PATH/lanlist_ipv4 | tr -s '\\n' | grep -v \"^#\"\n}\n\ngen_lanlist_6() {\n\tcat $RULES_PATH/lanlist_ipv6 | tr -s '\\n' | grep -v \"^#\"\n}\n\nget_wan_ips() {\n\tlocal family=\"$1\"\n\tlocal NET_ADDR\n\tlocal iface\n\tlocal INTERFACES=$(ubus call network.interface dump | jsonfilter -e \\\n\t\t\t'@.interface[!(@.interface ~ /lan/) && !(@.l3_device ~ /\\./) && @.route[0]].interface')\n\tfor iface in $INTERFACES; do\n\t\tlocal addr\n\t\tif [ \"$family\" = \"ip6\" ]; then\n\t\t\tnetwork_get_ipaddr6 addr \"$iface\"\n\t\t\tcase \"$addr\" in\n\t\t\t\t\"\"|fe80*) continue ;;\n\t\t\tesac\n\t\telse\n\t\t\tnetwork_get_ipaddr addr \"$iface\"\n\t\t\tcase \"$addr\" in\n\t\t\t\t\"\"|\"0.0.0.0\") continue ;;\n\t\t\tesac\n\t\tfi\n\t\tcase \" $NET_ADDR \" in\n\t\t\t*\" $addr \"*) ;;\n\t\t\t*) NET_ADDR=\"${NET_ADDR:+$NET_ADDR }$addr\" ;;\n\t\tesac\n\tdone\n\techo \"$NET_ADDR\"\n}\n\nget_local_ips() {\n\tlocal family=\"$1\"\n\tlocal ALL_IPS WAN_IPS ip NET_ADDR\n\tif [ \"$family\" = \"ip6\" ]; then\n\t\tALL_IPS=$(ip -o -6 addr show scope global | awk '{print $4}' | cut -d/ -f1)\n\t\tWAN_IPS=$(get_wan_ips ip6)\n\telse\n\t\tALL_IPS=$(ip -o -4 addr show scope global | awk '{print $4}' | cut -d/ -f1)\n\t\tWAN_IPS=$(get_wan_ips ip4)\n\tfi\n\t# 补充回环（scope global 不包含）\n\t[ \"$family\" = \"ip6\" ] && ALL_IPS=\"$ALL_IPS ::1\"\n\t[ \"$family\" != \"ip6\" ] && ALL_IPS=\"$ALL_IPS 127.0.0.1\"\n\tfor ip in $ALL_IPS; do\n\t\tcase \"$ip\" in\n\t\t\t\"\"|0.0.0.0|::) continue ;;\n\t\tesac\n\t\tcase \" $WAN_IPS \" in\n\t\t\t*\" $ip \"*) continue ;;\n\t\tesac\n\t\tcase \" $NET_ADDR \" in\n\t\t\t*\" $ip \"*) ;;\n\t\t\t*) NET_ADDR=\"${NET_ADDR:+$NET_ADDR }$ip\" ;;\n\t\tesac\n\tdone\n\tfor ip in $NET_ADDR; do\n\t\techo \"$ip\"\n\tdone\n}\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/rpcd/acl.d/luci-app-passwall.json",
    "content": "{\n\t\"luci-app-passwall\": {\n\t\t\"description\": \"Grant UCI access for luci-app-passwall\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"passwall\", \"passwall_server\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"passwall\", \"passwall_server\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/ucitrack/luci-app-passwall-server.json",
    "content": "{\n\t\"config\": \"passwall_server\",\n\t\"init\": \"passwall_server\"\n}\n"
  },
  {
    "path": "luci-app-passwall/root/usr/share/ucitrack/luci-app-passwall.json",
    "content": "{\n\t\"config\": \"passwall\",\n\t\"init\": \"passwall\"\n}\n"
  },
  {
    "path": "luci-app-passwall2/Makefile",
    "content": "# Copyright (C) 2022-2025 xiaorouji\n# Copyright (C) 2026 Openwrt-Passwall Organization\n#\n# This is free software, licensed under the GNU General Public License v3.\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-passwall2\nPKG_VERSION:=26.5.1\nPKG_RELEASE:=1\nPKG_PO_VERSION:=$(PKG_VERSION)\n\nPKG_CONFIG_DEPENDS:= \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_Nftables_Transparent_Proxy \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Haproxy \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Client \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Server \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Server \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Simple_Obfs \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_tuic_client \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_Plugin\n\nLUCI_TITLE:=LuCI support for PassWall 2\nLUCI_PKGARCH:=all\nLUCI_DEPENDS:=+coreutils +coreutils-base64 +coreutils-nohup +curl \\\n\t+ip-full +libuci-lua +lua +luci-compat +luci-lib-jsonc +lyaml +resolveip +tcping \\\n\t+geoview +v2ray-geoip +v2ray-geosite \\\n\t+unzip\n\ndefine Package/$(PKG_NAME)/config\nmenu \"Configuration\"\n\tdepends on PACKAGE_$(PKG_NAME)\n\nchoice\n\tprompt \"Basic Core\"\n\tdefault PACKAGE_$(PKG_NAME)_Basic_Core_All if aarch64||arm||i386||x86_64\n\tdefault PACKAGE_$(PKG_NAME)_Basic_Core_Xray\n\n\tconfig PACKAGE_$(PKG_NAME)_Basic_Core_Xray\n\t\tbool \"Xray\"\n\t\tselect PACKAGE_xray-core\n\n\tconfig PACKAGE_$(PKG_NAME)_Basic_Core_SingBox\n\t\tbool \"SingBox\"\n\t\tselect PACKAGE_sing-box\n\n\tconfig PACKAGE_$(PKG_NAME)_Basic_Core_All\n\t\tbool \"All\"\n\t\tselect PACKAGE_xray-core\n\t\tselect PACKAGE_sing-box\nendchoice\n\nconfig PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy\n\tbool \"Iptables Transparent Proxy\"\n\tselect PACKAGE_chinadns-ng\n\tselect PACKAGE_dnsmasq-full\n\tselect PACKAGE_dnsmasq_full_ipset\n\tselect PACKAGE_ipset\n\tselect PACKAGE_iptables\n\tselect PACKAGE_iptables-nft\n\tselect PACKAGE_iptables-zz-legacy\n\tselect PACKAGE_iptables-mod-conntrack-extra\n\tselect PACKAGE_iptables-mod-iprange\n\tselect PACKAGE_iptables-mod-socket\n\tselect PACKAGE_iptables-mod-tproxy\n\tselect PACKAGE_ip6tables-mod-nat\n\tselect PACKAGE_kmod-ipt-nat\n\tdefault y if ! PACKAGE_firewall4\n\nconfig PACKAGE_$(PKG_NAME)_Nftables_Transparent_Proxy\n\tbool \"Nftables Transparent Proxy\"\n\tselect PACKAGE_chinadns-ng\n\tselect PACKAGE_dnsmasq-full\n\tselect PACKAGE_dnsmasq_full_nftset\n\tselect PACKAGE_nftables\n\tselect PACKAGE_kmod-nft-socket\n\tselect PACKAGE_kmod-nft-tproxy\n\tselect PACKAGE_kmod-nft-nat\n\tdefault y if PACKAGE_firewall4\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Haproxy\n\tbool \"Include Haproxy\"\n\tselect PACKAGE_haproxy\n\tdefault y if aarch64||arm||i386||x86_64\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria\n\tbool \"Include Hysteria\"\n\tselect PACKAGE_hysteria\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy\n\tbool \"Include NaiveProxy\"\n\tdepends on !(arc||armeb||loongarch64||mips||mips64||powerpc||TARGET_gemini)\n\tselect PACKAGE_naiveproxy\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Client\n\tbool \"Include Shadowsocks Libev Client\"\n\tselect PACKAGE_shadowsocks-libev-ss-local\n\tselect PACKAGE_shadowsocks-libev-ss-redir\n\tdefault y\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Server\n\tbool \"Include Shadowsocks Libev Server\"\n\tselect PACKAGE_shadowsocks-libev-ss-server\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client\n\tbool \"Include Shadowsocks Rust Client\"\n\tdepends on !i386\n\tselect PACKAGE_shadowsocks-rust-sslocal\n\tdefault y if aarch64||x86_64\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server\n\tbool \"Include Shadowsocks Rust Server\"\n\tdepends on !i386\n\tselect PACKAGE_shadowsocks-rust-ssserver\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client\n\tbool \"Include ShadowsocksR Libev Client\"\n\tselect PACKAGE_shadowsocksr-libev-ssr-local\n\tselect PACKAGE_shadowsocksr-libev-ssr-redir\n\tdefault y\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Server\n\tbool \"Include ShadowsocksR Libev Server\"\n\tselect PACKAGE_shadowsocksr-libev-ssr-server\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Simple_Obfs\n\tbool \"Include Simple-Obfs (Shadowsocks Plugin)\"\n\tselect PACKAGE_simple-obfs-client\n\tdefault y\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_tuic_client\n\tbool \"Include tuic-client\"\n\tdepends on aarch64||arm||i386||x86_64\n\tselect PACKAGE_tuic-client\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_V2ray_Plugin\n\tbool \"Include V2ray-Plugin (Shadowsocks Plugin)\"\n\tselect PACKAGE_v2ray-plugin\n\tdefault y if aarch64||arm||i386||x86_64\n\nendmenu\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/passwall2\n/etc/config/passwall2_server\n/usr/share/passwall2/domains_excluded\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/controller/passwall2.lua",
    "content": "-- Copyright (C) 2022-2025 xiaorouji\n-- Copyright (C) 2026 Openwrt-Passwall Organization\n\nmodule(\"luci.controller.passwall2\", package.seeall)\nlocal api = require \"luci.passwall2.api\"\nlocal appname = api.appname\t\t-- not available\nlocal uci = api.uci\t\t\t\t-- in funtion index()\nlocal http = require \"luci.http\"\nlocal util = require \"luci.util\"\nlocal i18n = require \"luci.i18n\"\nlocal fs = api.fs\nlocal jsonStringify = luci.jsonc.stringify\nlocal jsonParse = luci.jsonc.parse\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/passwall2\") then\n\t\tif nixio.fs.access(\"/usr/share/passwall2/0_default_config\") then\n\t\t\tluci.sys.call('cp -f /usr/share/passwall2/0_default_config /etc/config/passwall2')\n\t\telse return end\n\tend\n\tlocal api = require \"luci.passwall2.api\"\n\tlocal appname = api.appname\t\t-- global definitions not available\n\tlocal uci = api.uci\t\t\t\t-- in function index()\n\tentry({\"admin\", \"services\", appname}).dependent = true\n\tentry({\"admin\", \"services\", appname, \"reset_config\"}, call(\"reset_config\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"show\"}, call(\"show_menu\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"hide\"}, call(\"hide_menu\")).leaf = true\n\tlocal e\n\tif uci:get(appname, \"@global[0]\", \"hide_from_luci\") ~= \"1\" then\n\t\te = entry({\"admin\", \"services\", appname}, alias(\"admin\", \"services\", appname, \"settings\"), _(\"PassWall 2\"), 0)\n\telse\n\t\te = entry({\"admin\", \"services\", appname}, alias(\"admin\", \"services\", appname, \"settings\"), nil, 0)\n\tend\n\te.dependent = true\n\te.acl_depends = { \"luci-app-passwall2\" }\n\t--[[ Client ]]\n\tentry({\"admin\", \"services\", appname, \"settings\"}, cbi(appname .. \"/client/global\"), _(\"Basic Settings\"), 1).dependent = true\n\tentry({\"admin\", \"services\", appname, \"node_list\"}, cbi(appname .. \"/client/node_list\"), _(\"Node List\"), 2).dependent = true\n\tentry({\"admin\", \"services\", appname, \"node_subscribe\"}, cbi(appname .. \"/client/node_subscribe\"), _(\"Node Subscribe\"), 3).dependent = true\n\tentry({\"admin\", \"services\", appname, \"other\"}, cbi(appname .. \"/client/other\", {autoapply = true}), _(\"Other Settings\"), 92).leaf = true\n\tif nixio.fs.access(\"/usr/sbin/haproxy\") then\n\t\tentry({\"admin\", \"services\", appname, \"haproxy\"}, cbi(appname .. \"/client/haproxy\"), _(\"Load Balancing\"), 93).leaf = true\n\tend\n\tentry({\"admin\", \"services\", appname, \"app_update\"}, cbi(appname .. \"/client/app_update\"), _(\"App Update\"), 95).leaf = true\n\tentry({\"admin\", \"services\", appname, \"rule\"}, cbi(appname .. \"/client/rule\"), _(\"Rule Manage\"), 96).leaf = true\n\tif api.finded_com(\"geoview\") then\n\t\tentry({\"admin\", \"services\", appname, \"geoview\"}, form(appname .. \"/client/geoview\"), _(\"Geo View\"), 97).leaf = true\n\tend\n\tentry({\"admin\", \"services\", appname, \"node_subscribe_config\"}, cbi(appname .. \"/client/node_subscribe_config\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"node_config\"}, cbi(appname .. \"/client/node_config\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"shunt_rules\"}, cbi(appname .. \"/client/shunt_rules\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"socks_config\"}, cbi(appname .. \"/client/socks_config\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"acl\"}, cbi(appname .. \"/client/acl\"), _(\"Access control\"), 98).leaf = true\n\tentry({\"admin\", \"services\", appname, \"acl_config\"}, cbi(appname .. \"/client/acl_config\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"log\"}, form(appname .. \"/client/log\"), _(\"Watch Logs\"), 999).leaf = true\n\n\t--[[ Server ]]\n\tentry({\"admin\", \"services\", appname, \"server\"}, cbi(appname .. \"/server/index\"), _(\"Server-Side\"), 99).leaf = true\n\tentry({\"admin\", \"services\", appname, \"server_user\"}, cbi(appname .. \"/server/user\")).leaf = true\n\n\t--[[ API ]]\n\tentry({\"admin\", \"services\", appname, \"server_user_status\"}, call(\"server_user_status\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"server_user_log\"}, call(\"server_user_log\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"server_get_log\"}, call(\"server_get_log\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"server_clear_log\"}, call(\"server_clear_log\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"link_add_node\"}, call(\"link_add_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"socks_autoswitch_add_node\"}, call(\"socks_autoswitch_add_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"socks_autoswitch_remove_node\"}, call(\"socks_autoswitch_remove_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"gen_client_config\"}, call(\"gen_client_config\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"get_now_use_node\"}, call(\"get_now_use_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"get_redir_log\"}, call(\"get_redir_log\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"get_socks_log\"}, call(\"get_socks_log\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"get_log\"}, call(\"get_log\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"clear_log\"}, call(\"clear_log\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"index_status\"}, call(\"index_status\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"haproxy_status\"}, call(\"haproxy_status\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"socks_status\"}, call(\"socks_status\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"connect_status\"}, call(\"connect_status\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"ping_node\"}, call(\"ping_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"urltest_node\"}, call(\"urltest_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"add_node\"}, call(\"add_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"update_node\"}, call(\"update_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"set_node\"}, call(\"set_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"copy_node\"}, call(\"copy_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"clear_all_nodes\"}, call(\"clear_all_nodes\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"delete_select_nodes\"}, call(\"delete_select_nodes\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"reassign_group\"}, call(\"reassign_group\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"get_node\"}, call(\"get_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"save_node_order\"}, call(\"save_node_order\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"save_node_list_opt\"}, call(\"save_node_list_opt\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"update_rules\"}, call(\"update_rules\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"rollback_rules\"}, call(\"rollback_rules\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"subscribe_del_node\"}, call(\"subscribe_del_node\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"subscribe_del_all\"}, call(\"subscribe_del_all\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"subscribe_manual\"}, call(\"subscribe_manual\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"subscribe_manual_all\"}, call(\"subscribe_manual_all\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"flush_set\"}, call(\"flush_set\")).leaf = true\n\n\t--[[Components update]]\n\tentry({\"admin\", \"services\", appname, \"check_passwall2\"}, call(\"app_check\")).leaf = true\n\tlocal coms = require \"luci.passwall2.com\"\n\tlocal com\n\tfor com, _ in pairs(coms) do\n\t\tentry({\"admin\", \"services\", appname, \"check_\" .. com}, call(\"com_check\", com)).leaf = true\n\t\tentry({\"admin\", \"services\", appname, \"update_\" .. com}, call(\"com_update\", com)).leaf = true\n\tend\n\n\t--[[Backup]]\n\tentry({\"admin\", \"services\", appname, \"create_backup\"}, call(\"create_backup\")).leaf = true\n\tentry({\"admin\", \"services\", appname, \"restore_backup\"}, call(\"restore_backup\")).leaf = true\n\n\t--[[geoview]]\n\tentry({\"admin\", \"services\", appname, \"geo_view\"}, call(\"geo_view\")).leaf = true\nend\n\nlocal function http_write_json(content)\n\thttp.prepare_content(\"application/json\")\n\thttp.write(jsonStringify(content or {code = 1}))\nend\n\nlocal function http_write_json_ok(data)\n\thttp.prepare_content(\"application/json\")\n\thttp.write(jsonStringify({code = 1, data = data}))\nend\n\nlocal function http_write_json_error(data)\n\thttp.prepare_content(\"application/json\")\n\thttp.write(jsonStringify({code = 0, data = data}))\nend\n\nfunction reset_config()\n\tluci.sys.call('/etc/init.d/passwall2 stop')\n\tluci.sys.call('[ -f \"/usr/share/passwall2/0_default_config\" ] && cp -f /usr/share/passwall2/0_default_config /etc/config/passwall2')\n\thttp.redirect(api.url())\nend\n\nfunction show_menu()\n\tapi.sh_uci_del(appname, \"@global[0]\", \"hide_from_luci\", true)\n\tluci.sys.call(\"rm -rf /tmp/luci-*\")\n\tluci.sys.call(\"/etc/init.d/rpcd restart >/dev/null\")\n\thttp.redirect(api.url())\nend\n\nfunction hide_menu()\n\tapi.sh_uci_set(appname, \"@global[0]\", \"hide_from_luci\", \"1\", true)\n\tluci.sys.call(\"rm -rf /tmp/luci-*\")\n\tluci.sys.call(\"/etc/init.d/rpcd restart >/dev/null\")\n\thttp.redirect(luci.dispatcher.build_url(\"admin\", \"status\", \"overview\"))\nend\n\nfunction link_add_node()\n\t-- Fragmented reception to overcome uhttpd limitations\n\tlocal tmp_file = \"/tmp/links.conf\"\n\tlocal chunk = http.formvalue(\"chunk\")\n\tlocal chunk_index = tonumber(http.formvalue(\"chunk_index\"))\n\tlocal total_chunks = tonumber(http.formvalue(\"total_chunks\"))\n\tlocal group = http.formvalue(\"group\") or \"default\"\n\n\tif chunk and chunk_index ~= nil and total_chunks ~= nil then\n\t\t-- Assemble the files in order\n\t\tlocal mode = \"a\"\n\t\tif chunk_index == 0 then\n\t\t\tmode = \"w\"\n\t\tend\n\t\tlocal f = io.open(tmp_file, mode)\n\t\tif f then\n\t\t\tf:write(chunk)\n\t\t\tf:close()\n\t\tend\n\t\t-- If it's the last piece, then it will be executed.\n\t\tif chunk_index + 1 == total_chunks then\n\t\t\tluci.sys.call(\"lua /usr/share/passwall2/subscribe.lua add \" .. group)\n\t\tend\n\tend\nend\n\nfunction socks_autoswitch_add_node()\n\tlocal id = http.formvalue(\"id\")\n\tlocal key = http.formvalue(\"key\")\n\tif id and id ~= \"\" and key and key ~= \"\" then\n\t\tuci:set(appname, id, \"enable_autoswitch\", \"1\")\n\t\tlocal new_list = uci:get(appname, id, \"autoswitch_backup_node\") or {}\n\t\tfor i = #new_list, 1, -1 do\n\t\t\tif (uci:get(appname, new_list[i], \"remarks\") or \"\"):find(key) then\n\t\t\t\ttable.remove(new_list, i)\n\t\t\tend\n\t\tend\n\t\tfor k, e in ipairs(api.get_valid_nodes()) do\n\t\t\tif e.node_type == \"normal\" and e[\"remark\"]:find(key) then\n\t\t\t\ttable.insert(new_list, e.id)\n\t\t\tend\n\t\tend\n\t\tuci:set_list(appname, id, \"autoswitch_backup_node\", new_list)\n\t\tapi.uci_save(uci, appname)\n\tend\n\thttp.redirect(api.url(\"socks_config\", id))\nend\n\nfunction socks_autoswitch_remove_node()\n\tlocal id = http.formvalue(\"id\")\n\tlocal key = http.formvalue(\"key\")\n\tif id and id ~= \"\" and key and key ~= \"\" then\n\t\tuci:set(appname, id, \"enable_autoswitch\", \"1\")\n\t\tlocal new_list = uci:get(appname, id, \"autoswitch_backup_node\") or {}\n\t\tfor i = #new_list, 1, -1 do\n\t\t\tif (uci:get(appname, new_list[i], \"remarks\") or \"\"):find(key) then\n\t\t\t\ttable.remove(new_list, i)\n\t\t\tend\n\t\tend\n\t\tuci:set_list(appname, id, \"autoswitch_backup_node\", new_list)\n\t\tapi.uci_save(uci, appname)\n\tend\n\thttp.redirect(api.url(\"socks_config\", id))\nend\n\nfunction gen_client_config()\n\tlocal id = http.formvalue(\"id\")\n\tlocal config_file = api.TMP_PATH .. \"/config_\" .. id\n\tluci.sys.call(string.format(\"/usr/share/passwall2/app.sh run_socks flag=config_%s node=%s bind=127.0.0.1 socks_port=1080 config_file=%s no_run=1\", id, id, config_file))\n\tif nixio.fs.access(config_file) then\n\t\thttp.prepare_content(\"application/json\")\n\t\thttp.write(luci.sys.exec(\"cat \" .. config_file))\n\t\tluci.sys.call(\"rm -f \" .. config_file)\n\telse\n\t\thttp.redirect(api.url(\"node_list\"))\n\tend\nend\n\nfunction get_now_use_node()\n\tlocal e = {}\n\tlocal node = api.get_cache_var(\"ACL_GLOBAL_node\")\n\tif node then\n\t\te[\"global\"] = node\n\tend\n\thttp_write_json(e)\nend\n\nfunction get_redir_log()\n\tlocal id = http.formvalue(\"id\")\n\tlocal name = http.formvalue(\"name\")\n\tlocal file_path = \"/tmp/etc/passwall2/acl/\" .. id .. \"/\" .. name .. \".log\"\n\tif nixio.fs.access(file_path) then\n\t\tlocal content = luci.sys.exec(\"tail -n 19999 '\" .. file_path .. \"'\")\n\t\tcontent = content:gsub(\"\\n\", \"<br />\")\n\t\thttp.write(content)\n\telse\n\t\thttp.write(string.format(\"<script>alert('%s');window.close();</script>\", i18n.translate(\"Not enabled log\")))\n\tend\nend\n\nfunction get_socks_log()\n\tlocal name = http.formvalue(\"name\")\n\tlocal path = \"/tmp/etc/passwall2/SOCKS_\" .. name .. \".log\"\n\tif nixio.fs.access(path) then\n\t\tlocal content = luci.sys.exec(\"tail -n 5000 \".. path)\n\t\tcontent = content:gsub(\"\\n\", \"<br />\")\n\t\thttp.write(content)\n\telse\n\t\thttp.write(string.format(\"<script>alert('%s');window.close();</script>\", i18n.translate(\"Not enabled log\")))\n\tend\nend\n\nfunction get_log()\n\t-- luci.sys.exec(\"[ -f /tmp/log/passwall2.log ] && sed '1!G;h;$!d' /tmp/log/passwall2.log > /tmp/log/passwall2_show.log\")\n\thttp.write(luci.sys.exec(\"[ -f '/tmp/log/passwall2.log' ] && cat /tmp/log/passwall2.log\"))\nend\n\nfunction clear_log()\n\tluci.sys.call(\"echo '' > /tmp/log/passwall2.log\")\nend\n\nfunction index_status()\n\tlocal e = {}\n\te[\"global_status\"] = luci.sys.call(\"/bin/busybox top -bn1 | grep -v 'grep' | grep '/tmp/etc/passwall2/bin/' | grep 'default' | grep 'global' >/dev/null\") == 0\n\thttp_write_json(e)\nend\n\nfunction haproxy_status()\n\tlocal e = {}\n\te[\"status\"] = luci.sys.call(string.format(\"/bin/busybox top -bn1 | grep -v grep | grep '%s/bin/' | grep haproxy >/dev/null\", appname)) == 0\n\thttp_write_json(e)\nend\n\nfunction socks_status()\n\tlocal e = {}\n\tlocal index = http.formvalue(\"index\")\n\tlocal id = http.formvalue(\"id\")\n\te.index = index\n\te.socks_status = luci.sys.call(string.format(\"/bin/busybox top -bn1 | grep -v -E 'grep|acl/|acl_' | grep '%s/bin/' | grep '%s' | grep 'SOCKS_' > /dev/null\", appname, id)) == 0\n\tlocal use_http = uci:get(appname, id, \"http_port\") or 0\n\te.use_http = 0\n\tif tonumber(use_http) > 0 then\n\t\te.use_http = 1\n\t\te.http_status = luci.sys.call(string.format(\"/bin/busybox top -bn1 | grep -v -E 'grep|acl/|acl_' | grep '%s/bin/' | grep '%s' | grep -E 'HTTP_|HTTP2SOCKS' > /dev/null\", appname, id)) == 0\n\tend\n\thttp_write_json(e)\nend\n\nfunction connect_status()\n\tlocal e = {}\n\te.use_time = \"\"\n\tlocal url = http.formvalue(\"url\")\n\tlocal result = luci.sys.exec('curl --connect-timeout 3 -o /dev/null -I -sk -w \"%{http_code}:%{time_appconnect}\" ' .. url)\n\tlocal code = tonumber(luci.sys.exec(\"echo -n '\" .. result .. \"' | awk -F ':' '{print $1}'\") or \"0\")\n\tif code ~= 0 then\n\t\tlocal use_time = luci.sys.exec(\"echo -n '\" .. result .. \"' | awk -F ':' '{print $2}'\")\n\t\tif use_time:find(\"%.\") then\n\t\t\te.use_time = string.format(\"%.2f\", use_time * 1000)\n\t\telse\n\t\t\te.use_time = string.format(\"%.2f\", use_time / 1000)\n\t\tend\n\t\te.ping_type = \"curl\"\n\tend\n\thttp_write_json(e)\nend\n\nfunction ping_node()\n\tlocal index = http.formvalue(\"index\")\n\tlocal address = http.formvalue(\"address\")\n\tlocal port = http.formvalue(\"port\")\n\tlocal type = http.formvalue(\"type\") or \"icmp\"\n\tlocal e = {}\n\te.index = index\n\tif type == \"tcping\" and luci.sys.exec(\"echo -n $(command -v tcping)\") ~= \"\" then\n\t\tif api.is_ipv6(address) then\n\t\t\taddress = api.get_ipv6_only(address)\n\t\tend\n\t\te.ping = luci.sys.exec(string.format(\"echo -n $(tcping -q -c 1 -i 1 -t 2 -p %s %s 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print $2}') 2>/dev/null\", port, address))\n\telse\n\t\te.ping = luci.sys.exec(\"echo -n $(ping -c 1 -W 1 %q 2>&1 | grep -o 'time=[0-9]*' | awk -F '=' '{print $2}') 2>/dev/null\" % address)\n\tend\n\thttp_write_json(e)\nend\n\nfunction urltest_node()\n\tlocal index = http.formvalue(\"index\")\n\tlocal id = http.formvalue(\"id\")\n\tlocal e = {}\n\te.index = index\n\tlocal result = luci.sys.exec(string.format(\"/usr/share/passwall2/test.sh url_test_node %s %s\", id, \"urltest_node\"))\n\tlocal code = tonumber(luci.sys.exec(\"echo -n '\" .. result .. \"' | awk -F ':' '{print $1}'\") or \"0\")\n\tif code ~= 0 then\n\t\tlocal use_time = luci.sys.exec(\"echo -n '\" .. result .. \"' | awk -F ':' '{print $2}'\")\n\t\tif use_time:find(\"%.\") then\n\t\t\te.use_time = string.format(\"%.2f\", use_time * 1000)\n\t\telse\n\t\t\te.use_time = string.format(\"%.2f\", use_time / 1000)\n\t\tend\n\tend\n\thttp_write_json(e)\nend\n\nfunction add_node()\n\tlocal redirect = http.formvalue(\"redirect\")\n\n\tlocal uuid = api.gen_short_uuid()\n\tuci:section(appname, \"nodes\", uuid)\n\n\tlocal group = http.formvalue(\"group\")\n\tif group and group ~= \"default\" then\n\t\tuci:set(appname, uuid, \"group\", group)\n\tend\n\n\tuci:set(appname, uuid, \"type\", \"Xray\")\n\n\tif redirect == \"1\" then\n\t\tapi.uci_save(uci, appname)\n\t\thttp.redirect(api.url(\"node_config\", uuid))\n\telse\n\t\tapi.uci_save(uci, appname, true, true)\n\t\thttp_write_json({result = uuid})\n\tend\nend\n\nfunction update_node()\n\tlocal id = http.formvalue(\"id\") -- Node id\n\tlocal data = http.formvalue(\"data\") -- json new Data\n\tif id and data then\n\t\tlocal data_t = jsonParse(data) or {}\n\t\tif next(data_t) then\n\t\t\tfor k, v in pairs(data_t) do\n\t\t\t\tuci:set(appname, id, k, v)\n\t\t\tend\n\t\t\tapi.uci_save(uci, appname)\n\t\t\thttp_write_json_ok()\n\t\t\treturn\n\t\tend\n\tend\n\thttp_write_json_error()\nend\n\nfunction set_node()\n\tlocal type = http.formvalue(\"type\")\n\tlocal config = http.formvalue(\"config\")\n\tlocal section = http.formvalue(\"section\")\n\tuci:set(appname, type, config, section)\n\tapi.uci_save(uci, appname, true, true)\n\thttp.redirect(api.url(\"log\"))\nend\n\nfunction copy_node()\n\tlocal section = http.formvalue(\"section\")\n\tlocal uuid = api.gen_short_uuid()\n\tuci:section(appname, \"nodes\", uuid)\n\tfor k, v in pairs(uci:get_all(appname, section)) do\n\t\tif not k:match(\"^%.\") and k ~= \"group\" then\n\t\t\tif k == \"remarks\" then v = (v or \"\") .. \"(1)\" end\n\t\t\tuci:set(appname, uuid, k, v)\n\t\tend\n\tend\n\tuci:set(appname, uuid, \"add_mode\", 1)\n\tapi.uci_save(uci, appname)\n\thttp.redirect(api.url(\"node_config\", uuid))\nend\n\nfunction clear_all_nodes()\n\tuci:set(appname, '@global[0]', \"enabled\", \"0\")\n\tuci:set(appname, '@global[0]', \"socks_enabled\", \"0\")\n\tuci:set(appname, '@haproxy_config[0]', \"balancing_enable\", \"0\")\n\tuci:delete(appname, '@global[0]', \"node\")\n\tuci:foreach(appname, \"socks\", function(t)\n\t\tuci:delete(appname, t[\".name\"])\n\t\tuci:set_list(appname, t[\".name\"], \"autoswitch_backup_node\", {})\n\tend)\n\tuci:foreach(appname, \"haproxy_config\", function(t)\n\t\tuci:delete(appname, t[\".name\"])\n\tend)\n\tuci:foreach(appname, \"acl_rule\", function(t)\n\t\tuci:delete(appname, t[\".name\"], \"node\")\n\tend)\n\tuci:foreach(appname, \"nodes\", function(node)\n\t\tuci:delete(appname, node['.name'])\n\tend)\n\tuci:foreach(appname, \"subscribe_list\", function(t)\n\t\tuci:delete(appname, t[\".name\"], \"md5\")\n\t\tuci:delete(appname, t[\".name\"], \"chain_proxy\")\n\t\tuci:delete(appname, t[\".name\"], \"preproxy_node\")\n\t\tuci:delete(appname, t[\".name\"], \"to_node\")\n\tend)\n\n\tapi.uci_save(uci, appname, true, true)\nend\n\nfunction delete_select_nodes()\n\tlocal ids = http.formvalue(\"ids\")\n\tlocal redirect = http.formvalue(\"redirect\")\n\tstring.gsub(ids, '[^' .. \",\" .. ']+', function(w)\n\t\tif (uci:get(appname, \"@global[0]\", \"node\") or \"\") == w then\n\t\t\tuci:delete(appname, '@global[0]', \"node\")\n\t\tend\n\t\tuci:foreach(appname, \"socks\", function(t)\n\t\t\tif t[\"node\"] == w then\n\t\t\t\tuci:delete(appname, t[\".name\"])\n\t\t\tend\n\t\t\tlocal auto_switch_node_list = uci:get(appname, t[\".name\"], \"autoswitch_backup_node\") or {}\n\t\t\tfor i = #auto_switch_node_list, 1, -1 do\n\t\t\t\tif w == auto_switch_node_list[i] then\n\t\t\t\t\ttable.remove(auto_switch_node_list, i)\n\t\t\t\tend\n\t\t\tend\n\t\t\tuci:set_list(appname, t[\".name\"], \"autoswitch_backup_node\", auto_switch_node_list)\n\t\tend)\n\t\tuci:foreach(appname, \"haproxy_config\", function(t)\n\t\t\tif t[\"lbss\"] == w then\n\t\t\t\tuci:delete(appname, t[\".name\"])\n\t\t\tend\n\t\tend)\n\t\tuci:foreach(appname, \"acl_rule\", function(t)\n\t\t\tif t[\"node\"] == w then\n\t\t\t\tuci:delete(appname, t[\".name\"], \"node\")\n\t\t\tend\n\t\tend)\n\t\tuci:foreach(appname, \"nodes\", function(t)\n\t\t\tif t[\"preproxy_node\"] == w then\n\t\t\t\tuci:delete(appname, t[\".name\"], \"preproxy_node\")\n\t\t\t\tuci:delete(appname, t[\".name\"], \"chain_proxy\")\n\t\t\tend\n\t\t\tif t[\"to_node\"] == w then\n\t\t\t\tuci:delete(appname, t[\".name\"], \"to_node\")\n\t\t\t\tuci:delete(appname, t[\".name\"], \"chain_proxy\")\n\t\t\tend\n\t\t\tlocal list_name = t[\"urltest_node\"] and \"urltest_node\" or (t[\"balancing_node\"] and \"balancing_node\")\n\t\t\tif list_name then\n\t\t\t\tlocal nodes = uci:get_list(appname, t[\".name\"], list_name)\n\t\t\t\tif nodes then\n\t\t\t\t\tlocal changed = false\n\t\t\t\t\tlocal new_nodes = {}\n\t\t\t\t\tfor _, node in ipairs(nodes) do\n\t\t\t\t\t\tif node ~= w then\n\t\t\t\t\t\t\ttable.insert(new_nodes, node)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tchanged = true\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tif changed then\n\t\t\t\t\t\tuci:set_list(appname, t[\".name\"], list_name, new_nodes)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif t[\"fallback_node\"] == w then\n\t\t\t\tuci:delete(appname, t[\".name\"], \"fallback_node\")\n\t\t\tend\n\t\tend)\n\t\tuci:foreach(appname, \"subscribe_list\", function(t)\n\t\t\tif t[\"preproxy_node\"] == w then\n\t\t\t\tuci:delete(appname, t[\".name\"], \"preproxy_node\")\n\t\t\t\tuci:delete(appname, t[\".name\"], \"chain_proxy\")\n\t\t\tend\n\t\t\tif t[\"to_node\"] == w then\n\t\t\t\tuci:delete(appname, t[\".name\"], \"to_node\")\n\t\t\t\tuci:delete(appname, t[\".name\"], \"chain_proxy\")\n\t\t\tend\n\t\tend)\n\t\tif (uci:get(appname, w, \"add_mode\") or \"0\") == \"2\" then\n\t\t\tlocal group = uci:get(appname, w, \"group\") or \"\"\n\t\t\tif group ~= \"\" then\n\t\t\t\tuci:foreach(appname, \"subscribe_list\", function(t)\n\t\t\t\t\tif t[\"remark\"] == group then\n\t\t\t\t\t\tuci:delete(appname, t[\".name\"], \"md5\")\n\t\t\t\t\tend\n\t\t\t\tend)\n\t\t\tend\n\t\tend\n\t\tuci:delete(appname, w)\n\tend)\n\tif redirect == \"1\" then\n\t\tapi.uci_save(uci, appname)\n\t\thttp.redirect(api.url(\"node_list\"))\n\telse\n\t\tapi.uci_save(uci, appname, true, true)\n\tend\nend\n\nfunction get_node()\n\tlocal id = http.formvalue(\"id\")\n\tlocal result = {}\n\tlocal show_node_info = api.uci_get_type(\"global_other\", \"show_node_info\", \"0\")\n\n\tlocal function add_is_ipv6_key(o)\n\t\tif o and o.address and show_node_info == \"1\" then\n\t\t\tlocal f = api.get_ipv6_full(o.address)\n\t\t\tif f ~= \"\" then\n\t\t\t\to.ipv6 = true\n\t\t\t\to.full_address = f\n\t\t\tend\n\t\tend\n\tend\n\n\tif id then\n\t\tresult = uci:get_all(appname, id)\n\t\tadd_is_ipv6_key(result)\n\telse\n\t\tlocal default_nodes = {}\n\t\tlocal other_nodes = {}\n\t\tuci:foreach(appname, \"nodes\", function(t)\n\t\t\tadd_is_ipv6_key(t)\n\t\t\tif not t.group or t.group == \"\" then\n\t\t\t\tdefault_nodes[#default_nodes + 1] = t\n\t\t\telse\n\t\t\t\tother_nodes[#other_nodes + 1] = t\n\t\t\tend\n\t\tend)\n\t\tfor i = 1, #default_nodes do result[#result + 1] = default_nodes[i] end\n\t\tfor i = 1, #other_nodes do result[#result + 1] = other_nodes[i] end\n\tend\n\thttp_write_json(result)\nend\n\nfunction save_node_order()\n\tlocal ids = http.formvalue(\"ids\") or \"\"\n\tlocal new_order = {}\n\tfor id in ids:gmatch(\"([^,]+)\") do\n\t\tnew_order[#new_order + 1] = id\n\tend\n\tfor idx, name in ipairs(new_order) do\n\t\tluci.sys.call(string.format(\"uci -q reorder %s.%s=%d\", appname, name, idx - 1))\n\tend\n\tapi.sh_uci_commit(appname)\n\thttp_write_json({ status = \"ok\" })\nend\n\nfunction reassign_group()\n\tlocal ids = http.formvalue(\"ids\") or \"\"\n\tlocal group = http.formvalue(\"group\") or \"default\"\n\tfor id in ids:gmatch(\"([^,]+)\") do\n\t\tif group ~=\"\" and group ~= \"default\" then\n\t\t\tapi.sh_uci_set(appname, id, \"group\", group)\n\t\telse\n\t\t\tapi.sh_uci_del(appname, id, \"group\")\n\t\tend\n\tend\n\tapi.sh_uci_commit(appname)\n\thttp_write_json({ status = \"ok\" })\nend\n\nfunction save_node_list_opt()\n\tlocal option = http.formvalue(\"option\") or \"\"\n\tlocal value = http.formvalue(\"value\") or \"\"\n\tif option ~= \"\" then\n\t\tapi.sh_uci_set(appname, \"@global_other[0]\", option, value, true)\n\tend\n\thttp_write_json({ status = \"ok\" })\nend\n\nfunction update_rules()\n\tlocal update = http.formvalue(\"update\") or \"\"\n\tif update == \"\" then\n\t\thttp_write_json_error({ message = \"missing update target\" })\n\t\treturn\n\tend\n\tluci.sys.call(\"lua /usr/share/passwall2/rule_update.lua log '\" .. update .. \"' > /dev/null 2>&1 &\")\n\thttp_write_json()\nend\n\nfunction rollback_rules()\n\tlocal arg_type = http.formvalue(\"type\")\n\tif arg_type ~= \"geoip\" and arg_type ~= \"geosite\" then\n\t\thttp_write_json_error()\n\t\treturn\n\tend\n\tlocal bak_dir = \"/tmp/bak_v2ray/\"\n\tlocal geo_dir = (uci:get(appname, \"@global_rules[0]\", \"v2ray_location_asset\") or \"/usr/share/v2ray/\")\n\tfs.move(bak_dir .. arg_type .. \".dat\", geo_dir .. arg_type .. \".dat\")\n\tfs.rmdir(bak_dir)\n\thttp_write_json_ok()\nend\n\nfunction server_user_status()\n\tlocal e = {}\n\te.index = http.formvalue(\"index\")\n\te.status = luci.sys.call(string.format(\"/bin/busybox top -bn1 | grep -v 'grep' | grep '%s/bin/' | grep -i '%s' >/dev/null\", appname .. \"_server\", http.formvalue(\"id\"))) == 0\n\thttp_write_json(e)\nend\n\nfunction server_user_log()\n\tlocal id = http.formvalue(\"id\")\n\tif nixio.fs.access(\"/tmp/etc/passwall2_server/\" .. id .. \".log\") then\n\t\tlocal content = luci.sys.exec(\"cat /tmp/etc/passwall2_server/\" .. id .. \".log\")\n\t\tcontent = content:gsub(\"\\n\", \"<br />\")\n\t\thttp.write(content)\n\telse\n\t\thttp.write(string.format(\"<script>alert('%s');window.close();</script>\", i18n.translate(\"Not enabled log\")))\n\tend\nend\n\nfunction server_get_log()\n\thttp.write(luci.sys.exec(\"[ -f '/tmp/log/passwall2_server.log' ] && cat /tmp/log/passwall2_server.log\"))\nend\n\nfunction server_clear_log()\n\tluci.sys.call(\"echo '' > /tmp/log/passwall2_server.log\")\nend\n\nfunction app_check()\n\tlocal json = api.to_check_self()\n\thttp_write_json(json)\nend\n\nfunction com_check(comname)\n\tlocal json = api.to_check(\"\", comname)\n\thttp_write_json(json)\nend\n\nfunction com_update(comname)\n\tlocal json = nil\n\tlocal task = http.formvalue(\"task\")\n\tif task == \"extract\" then\n\t\tjson = api.to_extract(comname, http.formvalue(\"file\"), http.formvalue(\"subfix\"))\n\telseif task == \"move\" then\n\t\tjson = api.to_move(comname, http.formvalue(\"file\"))\n\telse\n\t\tjson = api.to_download(comname, http.formvalue(\"url\"), http.formvalue(\"size\"))\n\tend\n\n\thttp_write_json(json)\nend\n\nlocal backup_files = {\n\t\"/etc/config/passwall2\",\n\t\"/etc/config/passwall2_server\",\n\t\"/usr/share/passwall2/domains_excluded\"\n}\n\nfunction create_backup()\n\tlocal date = os.date(\"%y%m%d%H%M\")\n\tlocal tar_file = \"/tmp/passwall2-\" .. date .. \"-backup.tar.gz\"\n\tfs.remove(tar_file)\n\tlocal cmd = \"tar -czf \" .. tar_file .. \" \" .. table.concat(backup_files, \" \")\n\tapi.sys.call(cmd)\n\thttp.header(\"Content-Disposition\", \"attachment; filename=passwall2-\" .. date .. \"-backup.tar.gz\")\n\thttp.header(\"X-Backup-Filename\", \"passwall2-\" .. date .. \"-backup.tar.gz\")\n\thttp.prepare_content(\"application/octet-stream\")\n\thttp.write(fs.readfile(tar_file))\n\tfs.remove(tar_file)\nend\n\nfunction restore_backup()\n\tlocal result = { status = \"error\", message = \"unknown error\" }\n\tlocal ok, err = pcall(function()\n\t\tlocal filename = http.formvalue(\"filename\")\n\t\tlocal chunk = http.formvalue(\"chunk\")\n\t\tlocal chunk_index = tonumber(http.formvalue(\"chunk_index\") or \"-1\")\n\t\tlocal total_chunks = tonumber(http.formvalue(\"total_chunks\") or \"-1\")\n\t\tif not filename then\n\t\t\tresult = { status = \"error\", message = \"Missing filename\" }\n\t\t\treturn\n\t\tend\n\t\tif not chunk then\n\t\t\tresult = { status = \"error\", message = \"Missing chunk data\" }\n\t\t\treturn\n\t\tend\n\t\tlocal file_path = \"/tmp/\" .. filename\n\t\tlocal decoded = nixio.bin.b64decode(chunk)\n\t\tif not decoded then\n\t\t\tresult = { status = \"error\", message = \"Base64 decode failed\" }\n\t\t\treturn\n\t\tend\n\t\tlocal fp = io.open(file_path, \"a+\")\n\t\tif not fp then\n\t\t\tresult = { status = \"error\", message = \"Failed to open file: \" .. file_path }\n\t\t\treturn\n\t\tend\n\t\tfp:write(decoded)\n\t\tfp:close()\n\t\tif chunk_index + 1 == total_chunks then\n\t\t\tapi.sys.call(\"echo '' > /tmp/log/passwall2.log\")\n\t\t\tapi.log(0, string.format(\" * PassWall2 %s\", i18n.translate(\"Configuration file uploaded successfully…\")))\n\t\t\tlocal temp_dir = '/tmp/passwall2_bak'\n\t\t\tapi.sys.call(\"mkdir -p \" .. temp_dir)\n\t\t\tif api.sys.call(\"tar -xzf \" .. file_path .. \" -C \" .. temp_dir) == 0 then\n\t\t\t\tfor _, backup_file in ipairs(backup_files) do\n\t\t\t\t\tlocal temp_file = temp_dir .. backup_file\n\t\t\t\t\tif fs.access(temp_file) then\n\t\t\t\t\t\tapi.sys.call(\"cp -f \" .. temp_file .. \" \" .. backup_file)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tapi.log(0, string.format(\" * PassWall2 %s\", i18n.translate(\"Configuration restored successfully…\")))\n\t\t\t\tapi.log(0, string.format(\" * PassWall2 %s\", i18n.translate(\"Service restarting…\")))\n\t\t\t\tluci.sys.call('/etc/init.d/passwall2 restart > /dev/null 2>&1 &')\n\t\t\t\tluci.sys.call('/etc/init.d/passwall2_server restart > /dev/null 2>&1 &')\n\t\t\t\tresult = { status = \"success\", message = \"Upload completed\", path = file_path }\n\t\t\telse\n\t\t\t\tapi.log(0, string.format(\" * PassWall2 %s\", i18n.translate(\"Configuration file decompression failed, please try again!\")))\n\t\t\t\tresult = { status = \"error\", message = \"Decompression failed\" }\n\t\t\tend\n\t\t\tapi.sys.call(\"rm -rf \" .. temp_dir)\n\t\t\tfs.remove(file_path)\n\t\telse\n\t\t\tresult = { status = \"success\", message = \"Chunk received\" }\n\t\tend\n\tend)\n\tif not ok then\n\t\tresult = { status = \"error\", message = tostring(err) }\n\tend\n\thttp_write_json(result)\nend\n\nfunction geo_view()\n\tlocal action = luci.http.formvalue(\"action\")\n\tlocal value = luci.http.formvalue(\"value\")\n\tif not value or value == \"\" then\n\t\thttp.prepare_content(\"text/plain\")\n\t\thttp.write(i18n.translate(\"Please enter query content!\"))\n\t\treturn\n\tend\n\tlocal function get_rules(str, type)\n\t\tlocal rules_id = {}\n\t\tuci:foreach(appname, \"shunt_rules\", function(s)\n\t\t\tlocal list\n\t\t\tif type == \"geoip\" then list = s.ip_list else list = s.domain_list end\n\t\t\tfor line in string.gmatch((list or \"\"), \"[^\\r\\n]+\") do\n\t\t\t\tif line ~= \"\" and not line:find(\"#\") then\n\t\t\t\t\tlocal prefix, main = line:match(\"^(.-):(.*)\")\n\t\t\t\t\tif not main then main = line end\n\t\t\t\t\tif type == \"geoip\" and (api.datatypes.ipaddr(str) or api.datatypes.ip6addr(str)) then\n\t\t\t\t\t\tif main:find(str, 1, true) then rules_id[#rules_id + 1] = s[\".name\"] end\n\t\t\t\t\telse\n\t\t\t\t\t\tif main == str then rules_id[#rules_id + 1] = s[\".name\"] end\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend)\n\t\treturn rules_id\n\tend\n\tlocal geo_dir = (uci:get(appname, \"@global_rules[0]\", \"v2ray_location_asset\") or \"/usr/share/v2ray/\"):match(\"^(.*)/\")\n\tlocal geosite_path = geo_dir .. \"/geosite.dat\"\n\tlocal geoip_path = geo_dir .. \"/geoip.dat\"\n\tlocal geo_type, file_path, cmd\n\tlocal geo_string = \"\"\n\tlocal bin = api.finded_com(\"geoview\")\n\tif action == \"lookup\" then\n\t\tif api.datatypes.ipaddr(value) or api.datatypes.ip6addr(value) then\n\t\t\tgeo_type, file_path = \"geoip\", geoip_path\n\t\telse\n\t\t\tgeo_type, file_path = \"geosite\", geosite_path\n\t\tend\n\t\tcmd = string.format(\"%q -type %q -action lookup -input %q -value %q -lowmem=true\", bin, geo_type, file_path, value)\n\t\tgeo_string = luci.sys.exec(cmd):lower()\n\t\tif geo_string ~= \"\" then\n\t\t\tlocal lines, rules, seen = {}, {}, {}\n\t\t\tfor line in geo_string:gmatch(\"([^\\n]+)\") do\n\t\t\t\tlines[#lines + 1] = geo_type .. \":\" .. line\n\t\t\t\tfor _, r in ipairs(get_rules(line, geo_type) or {}) do\n\t\t\t\t\tif not seen[r] then seen[r] = true; rules[#rules + 1] = r end\n\t\t\t\tend\n\t\t\tend\n\t\t\tfor _, r in ipairs(get_rules(value, geo_type) or {}) do\n\t\t\t\tif not seen[r] then seen[r] = true; rules[#rules + 1] = r end\n\t\t\tend\n\t\t\tgeo_string = table.concat(lines, \"\\n\")\n\t\t\tif #rules > 0 then\n\t\t\t\tgeo_string = geo_string .. \"\\n--------------------\\n\"\n\t\t\t\tgeo_string = geo_string .. i18n.translate(\"Rules containing this value:\") .. \"\\n\"\n\t\t\t\tgeo_string = geo_string .. table.concat(rules, \"\\n\")\n\t\t\tend\n\t\tend\n\telseif action == \"extract\" then\n\t\tlocal prefix, list = value:match(\"^(geoip:)(.*)$\")\n\t\tif not prefix then\n\t\t\tprefix, list = value:match(\"^(geosite:)(.*)$\")\n\t\tend\n\t\tif prefix and list and list ~= \"\" then\n\t\t\tgeo_type = prefix:sub(1, -2)\n\t\t\tfile_path = (geo_type == \"geoip\") and geoip_path or geosite_path\n\t\t\tcmd = string.format(\"%q -type %q -action extract -input %q -list %q -lowmem=true\", bin, geo_type, file_path, list)\n\t\t\tgeo_string = luci.sys.exec(cmd)\n\t\tend\n\tend\n\thttp.prepare_content(\"text/plain\")\n\tif geo_string and geo_string ~=\"\" then\n\t\thttp.write(geo_string)\n\telse\n\t\thttp.write(i18n.translate(\"No results were found!\"))\n\tend\nend\n\nfunction subscribe_del_node()\n\tlocal remark = http.formvalue(\"remark\")\n\tif remark and remark ~= \"\" then\n\t\tluci.sys.call(\"lua /usr/share/\" .. appname .. \"/subscribe.lua truncate \" .. luci.util.shellquote(remark) .. \" > /dev/null 2>&1\")\n\tend\n\thttp.status(200, \"OK\")\nend\n\nfunction subscribe_del_all()\n\tluci.sys.call(\"lua /usr/share/\" .. appname .. \"/subscribe.lua truncate > /dev/null 2>&1\")\n\thttp.status(200, \"OK\")\nend\n\nfunction subscribe_manual()\n\tlocal section = http.formvalue(\"section\") or \"\"\n\tlocal current_url = http.formvalue(\"url\") or \"\"\n\tif section == \"\" or current_url == \"\" then\n\t\thttp_write_json({ success = false, msg = \"Missing section or URL, skip.\" })\n\t\treturn\n\tend\n\tlocal uci_url = api.sh_uci_get(appname, section, \"url\")\n\tif not uci_url or uci_url == \"\" then\n\t\thttp_write_json({ success = false, msg = i18n.translate(\"Please save and apply before manually subscribing.\") })\n\t\treturn\n\tend\n\tif uci_url ~= current_url then\n\t\tapi.sh_uci_set(appname, section, \"url\", current_url, true)\n\tend\n\tluci.sys.call(\"lua /usr/share/\" .. appname .. \"/subscribe.lua start \" .. section .. \" manual >/dev/null 2>&1 &\")\n\thttp_write_json({ success = true, msg = \"Subscribe triggered.\" })\nend\n\nfunction subscribe_manual_all()\n\tlocal sections = http.formvalue(\"sections\") or \"\"\n\tlocal urls = http.formvalue(\"urls\") or \"\"\n\tif sections == \"\" or urls == \"\" then\n\t\thttp_write_json({ success = false, msg = \"Missing section or URL, skip.\" })\n\t\treturn\n\tend\n\tlocal section_list = util.split(sections, \",\")\n\tlocal url_list = util.split(urls, \",\")\n\t-- Check if there are any unsaved configurations.\n\tfor i, section in ipairs(section_list) do\n\t\tlocal uci_url = api.sh_uci_get(appname, section, \"url\")\n\t\tif not uci_url or uci_url == \"\" then\n\t\t\thttp_write_json({ success = false, msg = i18n.translate(\"Please save and apply before manually subscribing.\") })\n\t\t\treturn\n\t\tend\n\tend\n\t-- Save URLs that have changed.\n\tfor i, section in ipairs(section_list) do\n\t\tlocal current_url = url_list[i] or \"\"\n\t\tlocal uci_url = api.sh_uci_get(appname, section, \"url\")\n\t\tif current_url ~= \"\" and uci_url ~= current_url then\n\t\t\tapi.sh_uci_set(appname, section, \"url\", current_url, true)\n\t\tend\n\tend\n\tluci.sys.call(\"lua /usr/share/\" .. appname .. \"/subscribe.lua start all manual >/dev/null 2>&1 &\")\n\thttp_write_json({ success = true, msg = \"Subscribe triggered.\" })\nend\n\nfunction flush_set()\n\tlocal redirect = http.formvalue(\"redirect\") or \"0\"\n\tlocal reload = http.formvalue(\"reload\") or \"0\"\n\tif reload == \"1\" then\n\t\tuci:set(appname, '@global[0]', \"flush_set\", \"1\")\n\t\tapi.uci_save(uci, appname, true, true)\n\telse\n\t\tapi.sh_uci_set(appname, \"@global[0]\", \"flush_set\", \"1\", true)\n\tend\n\tif redirect == \"1\" then\n\t\thttp.redirect(api.url(\"log\"))\n\tend\nend\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/acl.lua",
    "content": "local api = require \"luci.passwall2.api\"\nlocal appname = api.appname\nlocal sys = api.sys\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\ns = m:section(TypedSection, \"global\", translate(\"ACLs\"), \"<font color='red'>\" .. translate(\"ACLs is a tools which used to designate specific IP proxy mode.\") .. \"</font>\")\ns.anonymous = true\n\no = s:option(Flag, \"acl_enable\", translate(\"Main switch\"))\no.rmempty = false\no.default = false\n\n-- [[ ACLs Settings ]]--\ns = m:section(TypedSection, \"acl_rule\")\ns.template = \"cbi/tblsection\"\ns.sortable = true\ns.anonymous = true\ns.addremove = true\ns.extedit = api.url(\"acl_config\", \"%s\")\nfunction s.create(e, t)\n\tt = TypedSection.create(e, t)\n\tluci.http.redirect(e.extedit:format(t))\nend\n\n---- Enable\no = s:option(Flag, \"enabled\", translate(\"Enable\"))\no.default = 1\no.rmempty = false\n\n---- Remarks\no = s:option(Value, \"remarks\", translate(\"Remarks\"))\no.rmempty = true\n\nlocal mac_t = {}\nsys.net.mac_hints(function(e, t)\n\tmac_t[e] = {\n\t\tip = t,\n\t\tmac = e\n\t}\nend)\n\no = s:option(DummyValue, \"sources\", translate(\"Source\"))\no.rawhtml = true\no.cfgvalue = function(t, n)\n\tlocal e = ''\n\tlocal v = Value.cfgvalue(t, n) or '-'\n\tstring.gsub(v, '[^' .. \" \" .. ']+', function(w)\n\t\tlocal a = w\n\t\tif mac_t[w] then\n\t\t\ta = a .. ' (' .. mac_t[w].ip .. ')'\n\t\tend\n\t\tif #e > 0 then\n\t\t\te = e .. \"<br />\"\n\t\tend\n\t\te = e .. a\n\tend)\n\treturn e\nend\n\ni = s:option(DummyValue, \"interface\", translate(\"Source Interface\"))\ni.cfgvalue = function(t, n)\n\tlocal v = Value.cfgvalue(t, n) or '-'\n\treturn v\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/acl_config.lua",
    "content": "local api = require \"luci.passwall2.api\"\nlocal appname = api.appname\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\nif not arg[1] or not m:get(arg[1]) then\n\tluci.http.redirect(api.url(\"acl\"))\nend\n\nm:append(Template(appname .. \"/cbi/nodes_listvalue_com\"))\n\nlocal sys = api.sys\n\nlocal port_validate = function(self, value, t)\n\treturn value:gsub(\"-\", \":\")\nend\n\nlocal nodes_table = {}\nfor k, e in ipairs(api.get_valid_nodes()) do\n\tnodes_table[#nodes_table + 1] = e\nend\n\nlocal dynamicList_write = function(self, section, value)\n\tlocal t = {}\n\tlocal t2 = {}\n\tif type(value) == \"table\" then\n\t\tlocal x\n\t\tfor _, x in ipairs(value) do\n\t\t\tif x and #x > 0 then\n\t\t\t\tif not t2[x] then\n\t\t\t\t\tt2[x] = x\n\t\t\t\t\tt[#t+1] = x\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\telse\n\t\tt = { value }\n\tend\n\tt = table.concat(t, \" \")\n\treturn DynamicList.write(self, section, t)\nend\nlocal doh_validate = function(self, value, t)\n\tif value ~= \"\" then\n\t\tlocal flag = 0\n\t\tlocal util = require \"luci.util\"\n\t\tlocal val = util.split(value, \",\")\n\t\tlocal url = val[1]\n\t\tval[1] = nil\n\t\tfor i = 1, #val do\n\t\t\tlocal v = val[i]\n\t\t\tif v then\n\t\t\t\tif not datatypes.ipmask4(v) then\n\t\t\t\t\tflag = 1\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif flag == 0 then\n\t\t\treturn value\n\t\tend\n\tend\n\treturn nil, translate(\"DoH request address\") .. \" \" .. translate(\"Format must be:\") .. \" URL,IP\"\nend\n-- [[ ACLs Settings ]]--\ns = m:section(NamedSection, arg[1], translate(\"ACLs\"), translate(\"ACLs\"))\ns.addremove = false\ns.dynamic = false\n\n---- Enable\no = s:option(Flag, \"enabled\", translate(\"Enable\"))\no.default = 1\no.rmempty = false\n\n---- Remarks\no = s:option(Value, \"remarks\", translate(\"Remarks\"))\no.default = arg[1]\no.rmempty = false\n\no = s:option(Value, \"interface\", translate(\"Source Interface\"))\no:value(\"\", translate(\"All\"))\n-- Populate with actual kernel network devices instead of UCI interface names,\n-- because the backend (nftables iifname / iptables -i) matches kernel device names.\ndo\n\tlocal nfs = require \"nixio.fs\"\n\tlocal _cursor = require(\"luci.model.uci\").cursor()\n\tlocal _sysnet = \"/sys/class/net/\"\n\n\t-- Map UCI interface names to their device names and vice versa\n\tlocal _iface_to_dev = {}\n\tlocal _dev_to_ifaces = {}\n\tlocal _iface_proto = {}\n\t_cursor:foreach(\"network\", \"interface\", function(sec)\n\t\tlocal name = sec[\".name\"]\n\t\tif name ~= \"loopback\" then\n\t\t\t_iface_proto[name] = sec.proto\n\t\t\tif sec.device then\n\t\t\t\t_iface_to_dev[name] = sec.device\n\t\t\t\t_dev_to_ifaces[sec.device] = _dev_to_ifaces[sec.device] or {}\n\t\t\t\ttable.insert(_dev_to_ifaces[sec.device], name)\n\t\t\tend\n\t\tend\n\tend)\n\n\t-- Classify device type using sysfs attributes\n\tlocal function classify_sysfs(dev)\n\t\tif nfs.stat(_sysnet .. dev .. \"/bridge\", \"type\") == \"dir\" then\n\t\t\treturn translate(\"Bridge\")\n\t\telseif nfs.stat(_sysnet .. dev .. \"/wireless\", \"type\") == \"dir\" then\n\t\t\treturn translate(\"Wireless Adapter\")\n\t\telseif dev:match(\"^tun\") or dev:match(\"^tap\") or dev:match(\"^wg\") or dev:match(\"^ppp\") then\n\t\t\treturn translate(\"Tunnel Interface\")\n\t\telse\n\t\t\treturn translate(\"Ethernet Adapter\")\n\t\tend\n\tend\n\n\t-- Classify offline UCI interfaces by config hints\n\tlocal function classify_uci(dev_name, proto)\n\t\tif dev_name and dev_name:match(\"^br%-\") then\n\t\t\treturn translate(\"Bridge\")\n\t\telseif proto == \"wireguard\" or proto == \"pppoe\" or proto == \"pptp\" or proto == \"l2tp\" then\n\t\t\treturn translate(\"Tunnel Interface\")\n\t\telse\n\t\t\treturn translate(\"Interface\")\n\t\tend\n\tend\n\n\tlocal _seen = {}\n\tlocal _devices = {}\n\n\t-- Active kernel devices from /sys/class/net/.\n\t-- Skip bridge member ports (/master) and DSA master devices (/dsa) because\n\t-- nftables iifname matches the parent bridge for routed traffic, not\n\t-- individual member ports. Also skip internal virtual devices.\n\tlocal _iter = nfs.dir(_sysnet)\n\tif _iter then\n\t\tfor dev in _iter do\n\t\t\tif dev ~= \"lo\"\n\t\t\t\tand not dev:match(\"^veth\")\n\t\t\t\tand not dev:match(\"^ifb\")\n\t\t\t\tand not dev:match(\"^gre\")\n\t\t\t\tand not dev:match(\"^sit\")\n\t\t\t\tand not dev:match(\"^ip6tnl\")\n\t\t\t\tand not dev:match(\"^erspan\")\n\t\t\t\tand not nfs.stat(_sysnet .. dev .. \"/master\", \"type\")\n\t\t\t\tand not nfs.stat(_sysnet .. dev .. \"/dsa\", \"type\")\n\t\t\tthen\n\t\t\t\tlocal dtype = classify_sysfs(dev)\n\t\t\t\tlocal label = dtype .. ': \"' .. dev .. '\"'\n\t\t\t\tif _dev_to_ifaces[dev] then\n\t\t\t\t\tlabel = label .. \" (\" .. table.concat(_dev_to_ifaces[dev], \", \") .. \")\"\n\t\t\t\tend\n\t\t\t\t_devices[#_devices + 1] = { name = dev, label = label, sort = dtype .. \":\" .. dev }\n\t\t\t\t_seen[dev] = true\n\t\t\tend\n\t\tend\n\tend\n\n\t-- UCI interfaces whose device does not currently exist (down tunnels, VPNs, etc.).\n\t-- Stored by UCI name since the kernel device is not available yet.\n\t-- Dedup by device: if two interfaces share a device, only one is shown.\n\tfor iface, dev in pairs(_iface_to_dev) do\n\t\tif not _seen[dev] then\n\t\t\tlocal dtype = classify_uci(dev, _iface_proto[iface])\n\t\t\tlocal label = dtype .. ': \"' .. iface .. '\"'\n\t\t\t-- Sort offline entries after active devices\n\t\t\t_devices[#_devices + 1] = { name = iface, label = label, sort = \"zzz:\" .. iface }\n\t\t\t_seen[dev] = true\n\t\tend\n\tend\n\n\ttable.sort(_devices, function(a, b) return a.sort < b.sort end)\n\tfor _, d in ipairs(_devices) do\n\t\to:value(d.name, d.label)\n\tend\nend\n\no.validate = function(self, value, section)\n\tif value == \"\" or value:match(\"^[a-zA-Z0-9][a-zA-Z0-9%.%_%-]*$\") then\n\t\treturn value\n\tend\n\treturn nil, translate(\"Invalid interface name\")\nend\n\nlocal mac_t = {}\nsys.net.mac_hints(function(e, t)\n\tmac_t[#mac_t + 1] = {\n\t\tip = t,\n\t\tmac = e\n\t}\nend)\ntable.sort(mac_t, function(a,b)\n\tif #a.ip < #b.ip then\n\t\treturn true\n\telseif #a.ip == #b.ip then\n\t\tif a.ip < b.ip then\n\t\t\treturn true\n\t\telse\n\t\t\treturn #a.ip < #b.ip\n\t\tend\n\tend\n\treturn false\nend)\n\n---- Source\nsources = s:option(DynamicList, \"sources\", translate(\"Source\"))\nsources.description = \"<ul><li>\" .. translate(\"Example:\")\n.. \"</li><li>\" .. translate(\"MAC\") .. \": 00:00:00:FF:FF:FF\"\n.. \"</li><li>\" .. translate(\"IP\") .. \": 192.168.1.100\"\n.. \"</li><li>\" .. translate(\"IP CIDR\") .. \": 192.168.1.0/24\"\n.. \"</li><li>\" .. translate(\"IP range\") .. \": 192.168.1.100-192.168.1.200\"\n.. \"</li><li>\" .. translate(\"IPSet\") .. \": ipset:lanlist\"\n.. \"</li></ul>\"\nsources.cast = \"string\"\nfor _, key in pairs(mac_t) do\n\tsources:value(key.mac, \"%s (%s)\" % {key.mac, key.ip})\nend\n\nsources.cfgvalue = function(self, section)\n\tlocal value\n\tif self.tag_error[section] then\n\t\tvalue = self:formvalue(section)\n\telse\n\t\tvalue = self.map:get(section, self.option)\n\t\tif type(value) == \"string\" then\n\t\t\tlocal value2 = {}\n\t\t\tstring.gsub(value, '[^' .. \" \" .. ']+', function(w) table.insert(value2, w) end)\n\t\t\tvalue = value2\n\t\tend\n\tend\n\treturn value\nend\nsources.validate = function(self, value, t)\n\tlocal err = {}\n\tfor _, v in ipairs(value) do\n\t\tlocal flag = false\n\t\tif v:find(\"ipset:\") and v:find(\"ipset:\") == 1 then\n\t\t\tlocal ipset = v:gsub(\"ipset:\", \"\")\n\t\t\tif ipset and ipset ~= \"\" then\n\t\t\t\tflag = true\n\t\t\tend\n\t\tend\n\n\t\tif flag == false and datatypes.macaddr(v) then\n\t\t\tflag = true\n\t\tend\n\n\t\tif flag == false and datatypes.ip4addr(v) then\n\t\t\tflag = true\n\t\tend\n\n\t\tif flag == false and api.iprange(v) then\n\t\t\tflag = true\n\t\tend\n\n\t\tif flag == false then\n\t\t\terr[#err + 1] = v\n\t\tend\n\tend\n\n\tif #err > 0 then\n\t\tself:add_error(t, \"invalid\", translate(\"Not true format, please re-enter!\"))\n\t\tfor _, v in ipairs(err) do\n\t\t\tself:add_error(t, \"invalid\", v)\n\t\tend\n\tend\n\n\treturn value\nend\nsources.write = dynamicList_write\n\n---- TCP No Redir Ports\nlocal TCP_NO_REDIR_PORTS = m:get(\"@global_forwarding[0]\", \"tcp_no_redir_ports\")\no = s:option(Value, \"tcp_no_redir_ports\", translate(\"TCP No Redir Ports\"))\no:value(\"\", translate(\"Use global config\") .. \"(\" .. TCP_NO_REDIR_PORTS .. \")\")\no:value(\"disable\", translate(\"No patterns are used\"))\no:value(\"1:65535\", translate(\"All\"))\no.validate = port_validate\n\n---- UDP No Redir Ports\nlocal UDP_NO_REDIR_PORTS = m:get(\"@global_forwarding[0]\", \"udp_no_redir_ports\")\no = s:option(Value, \"udp_no_redir_ports\", translate(\"UDP No Redir Ports\"),\n\t\"<font color='red'>\" ..\n\ttranslate(\"If you don't want to let the device in the list to go proxy, please choose all.\") ..\n\t\"</font>\")\no:value(\"\", translate(\"Use global config\") .. \"(\" .. UDP_NO_REDIR_PORTS .. \")\")\no:value(\"disable\", translate(\"No patterns are used\"))\no:value(\"1:65535\", translate(\"All\"))\no.validate = port_validate\n\no = s:option(DummyValue, \"_hide_node_option\", \"\")\no.template = \"passwall2/cbi/hidevalue\"\no.value = \"1\"\no:depends({ tcp_no_redir_ports = \"1:65535\", udp_no_redir_ports = \"1:65535\" })\nif TCP_NO_REDIR_PORTS == \"1:65535\" and UDP_NO_REDIR_PORTS == \"1:65535\" then\n\to:depends({ tcp_no_redir_ports = \"\", udp_no_redir_ports = \"\" })\nend\n\nlocal GLOBAL_ENABLED = m:get(\"@global[0]\", \"enabled\")\nlocal NODE = m:get(\"@global[0]\", \"node\")\no = s:option(ListValue, \"node\", \"<a style='color: red'>\" .. translate(\"Node\") .. \"</a>\")\nif GLOBAL_ENABLED == \"1\" and NODE then\n\to:value(\"\", translate(\"Use global config\") .. \"(\" .. api.get_node_name(NODE) .. \")\")\n\to.group = {\"\"}\nelse\n\to.group = {}\nend\no:depends({ _hide_node_option = \"1\",  ['!reverse'] = true })\no.template = appname .. \"/cbi/nodes_listvalue\"\n\ncurrent_node_id = o:formvalue(arg[1])\nif not current_node_id then\n\tcurrent_node_id = m.uci:get(appname, arg[1], \"node\")\nend\ncurrent_node = current_node_id and m.uci:get_all(appname, current_node_id) or {}\n\no = s:option(DummyValue, \"_hide_dns_option\", \"\")\no.template = \"passwall2/cbi/hidevalue\"\no.value = \"1\"\no:depends({ node = \"\" })\nif GLOBAL_ENABLED == \"1\" and NODE then\n\to:depends({ node = NODE })\nend\n\n---- TCP Redir Ports\nlocal TCP_REDIR_PORTS = m:get(\"@global_forwarding[0]\", \"tcp_redir_ports\")\no = s:option(Value, \"tcp_redir_ports\", translate(\"TCP Redir Ports\"))\no:value(\"\", translate(\"Use global config\") .. \"(\" .. TCP_REDIR_PORTS .. \")\")\no:value(\"1:65535\", translate(\"All\"))\no:value(\"22,25,53,80,143,443,465,587,853,873,993,995,5222,8080,8443,9418\", translate(\"Common Use\"))\no:value(\"80,443\", \"80,443\")\no.validate = port_validate\no:depends({ _hide_node_option = \"1\",  ['!reverse'] = true })\n\n---- UDP Redir Ports\nlocal UDP_REDIR_PORTS = m:get(\"@global_forwarding[0]\", \"udp_redir_ports\")\no = s:option(Value, \"udp_redir_ports\", translate(\"UDP Redir Ports\"))\no:value(\"\", translate(\"Use global config\") .. \"(\" .. UDP_REDIR_PORTS .. \")\")\no:value(\"1:65535\", translate(\"All\"))\no.validate = port_validate\no:depends({ _hide_node_option = \"1\",  ['!reverse'] = true })\n\no = s:option(DummyValue, \"tips\", \"　\")\no.rawhtml = true\no.cfgvalue = function(t, n)\n\treturn string.format('<font color=\"red\">%s</font>',\n\ttranslate(\"The port settings support single ports and ranges.<br>Separate multiple ports with commas (,).<br>Example: 21,80,443,1000:2000.\"))\nend\n\no = s:option(ListValue, \"direct_dns_query_strategy\", translate(\"Direct Query Strategy\"))\no.default = \"UseIP\"\no:value(\"UseIP\")\no:value(\"UseIPv4\")\no:value(\"UseIPv6\")\no:depends({ _hide_dns_option = \"1\",  ['!reverse'] = true })\n\no = s:option(ListValue, \"remote_dns_protocol\", translate(\"Remote DNS Protocol\"))\no:value(\"tcp\", \"TCP\")\no:value(\"doh\", \"DoH\")\no:value(\"udp\", \"UDP\")\nif current_node.type == \"sing-box\" then\n\to:value(\"tls\", \"TLS(DoT)\")\n\to:value(\"quic\", \"QUIC(DoQ)\")\n\to:value(\"http3\", \"HTTP3(DoH3)\")\nend\no:depends({ _hide_dns_option = \"1\",  ['!reverse'] = true })\n\n---- DNS over TCP or UDP or TLS (DoT) or QUIC (DoQ)\no = s:option(Value, \"remote_dns\", translate(\"Remote DNS\"))\no.datatype = \"or(ipaddr,ipaddrport)\"\no.default = \"1.1.1.1\"\no:value(\"1.1.1.1\", \"1.1.1.1 (CloudFlare)\")\no:value(\"1.1.1.2\", \"1.1.1.2 (CloudFlare-Security)\")\no:value(\"8.8.4.4\", \"8.8.4.4 (Google)\")\no:value(\"8.8.8.8\", \"8.8.8.8 (Google)\")\no:value(\"9.9.9.9\", \"9.9.9.9 (Quad9-Recommended)\")\no:value(\"149.112.112.112\", \"149.112.112.112 (Quad9-Recommended)\")\no:value(\"208.67.220.220\", \"208.67.220.220 (OpenDNS)\")\no:value(\"208.67.222.222\", \"208.67.222.222 (OpenDNS)\")\no:depends(\"remote_dns_protocol\", \"tcp\")\no:depends(\"remote_dns_protocol\", \"udp\")\no:depends(\"remote_dns_protocol\", \"quic\")\no:depends(\"remote_dns_protocol\", \"tls\")\n\n---- DNS over HTTP (DoH) or DNS over HTTP3(DoH3)\no = s:option(Value, \"remote_dns_doh\", translate(\"Remote DNS DoH\"))\no:value(\"https://1.1.1.1/dns-query\", \"CloudFlare\")\no:value(\"https://1.1.1.2/dns-query\", \"CloudFlare-Security\")\no:value(\"https://8.8.4.4/dns-query\", \"Google 8844\")\no:value(\"https://8.8.8.8/dns-query\", \"Google 8888\")\no:value(\"https://9.9.9.9/dns-query\", \"Quad9-Recommended 9.9.9.9\")\no:value(\"https://149.112.112.112/dns-query\", \"Quad9-Recommended 149.112.112.112\")\no:value(\"https://208.67.222.222/dns-query\", \"OpenDNS\")\no:value(\"https://dns.adguard.com/dns-query,94.140.14.14\", \"AdGuard\")\no:value(\"https://doh.libredns.gr/dns-query,116.202.176.26\", \"LibreDNS\")\no:value(\"https://doh.libredns.gr/ads,116.202.176.26\", \"LibreDNS (No Ads)\")\no.default = \"https://1.1.1.1/dns-query\"\no.validate = doh_validate\no:depends(\"remote_dns_protocol\", \"doh\")\no:depends(\"remote_dns_protocol\", \"http3\")\n\no = s:option(Value, \"remote_dns_client_ip\", translate(\"Remote DNS EDNS Client Subnet\"))\no.description = translate(\"Notify the DNS server when the DNS query is notified, the location of the client (cannot be a private IP address).\") .. \"<br />\" ..\n\t\t\t\ttranslate(\"This feature requires the DNS server to support the Edns Client Subnet (RFC7871).\")\no.datatype = \"ipaddr\"\no:depends(\"remote_dns_protocol\", \"tcp\")\no:depends(\"remote_dns_protocol\", \"doh\")\no:depends(\"remote_dns_protocol\", \"udp\")\no:depends(\"remote_dns_protocol\", \"http3\")\no:depends(\"remote_dns_protocol\", \"quic\")\no:depends(\"remote_dns_protocol\", \"tls\")\n\no = s:option(ListValue, \"remote_dns_detour\", translate(\"Remote DNS Outbound\"))\no.default = \"remote\"\no:value(\"remote\", translate(\"Remote\"))\no:value(\"direct\", translate(\"Direct\"))\no:depends(\"remote_dns_protocol\", \"tcp\")\no:depends(\"remote_dns_protocol\", \"doh\")\no:depends(\"remote_dns_protocol\", \"udp\")\no:depends(\"remote_dns_protocol\", \"http3\")\no:depends(\"remote_dns_protocol\", \"quic\")\no:depends(\"remote_dns_protocol\", \"tls\")\n\no = s:option(Flag, \"remote_fakedns\", \"FakeDNS\", translate(\"Use FakeDNS work in the domain that proxy.\"))\no.default = \"0\"\no.rmempty = false\n\no = s:option(ListValue, \"remote_dns_query_strategy\", translate(\"Remote Query Strategy\"))\no.default = \"UseIPv4\"\no:value(\"UseIP\")\no:value(\"UseIPv4\")\no:value(\"UseIPv6\")\no:depends(\"remote_dns_protocol\", \"tcp\")\no:depends(\"remote_dns_protocol\", \"doh\")\no:depends(\"remote_dns_protocol\", \"udp\")\no:depends(\"remote_dns_protocol\", \"http3\")\no:depends(\"remote_dns_protocol\", \"quic\")\no:depends(\"remote_dns_protocol\", \"tls\")\n\no = s:option(ListValue, \"dns_hosts_mode\", translate(\"Domain Override\"))\no:value(\"default\", translate(\"Use global config\"))\no:value(\"disable\", translate(\"No patterns are used\"))\no:value(\"custom\", translate(\"-- custom --\"))\n\no = s:option(TextValue, \"dns_hosts\", translate(\"Domain Override\"))\no.rows = 5\no.wrap = \"off\"\no:depends(\"dns_hosts_mode\", \"custom\")\no.remove = function(self, section)\n\tlocal node_value = s.fields[\"node\"]:formvalue(arg[1])\n\tif node_value then\n\t\tlocal node_t = m:get(node_value) or {}\n\t\tif node_t.type == \"Xray\" or node_t.type == \"sing-box\" then\n\t\t\tAbstractValue.remove(self, section)\n\t\tend\n\tend\nend\n\nlocal o_node = s.fields[\"node\"]\n\nfor k, v in pairs(nodes_table) do\n\to_node:value(v.id, v[\"remark\"])\n\to_node.group[#o_node.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\tif v.node_type == \"normal\" or v.protocol == \"_balancing\" or v.protocol == \"_urltest\" then\n\t\t--Shunt node has its own separate options.\n\t\ts.fields[\"remote_fakedns\"]:depends({ node = v.id, remote_dns_protocol = \"tcp\" })\n\t\ts.fields[\"remote_fakedns\"]:depends({ node = v.id, remote_dns_protocol = \"doh\" })\n\t\ts.fields[\"remote_fakedns\"]:depends({ node = v.id, remote_dns_protocol = \"udp\" })\n\t\ts.fields[\"remote_fakedns\"]:depends({ node = v.id, remote_dns_protocol = \"http3\" })\n\t\ts.fields[\"remote_fakedns\"]:depends({ node = v.id, remote_dns_protocol = \"quic\" })\n\t\ts.fields[\"remote_fakedns\"]:depends({ node = v.id, remote_dns_protocol = \"tls\" })\n\tend\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/app_update.lua",
    "content": "local api = require \"luci.passwall2.api\"\nlocal appname = api.appname\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\n-- [[ App Settings ]]--\ns = m:section(TypedSection, \"global_app\", translate(\"App Update\"),\n\t\"<font color='red'>\" ..\n\ttranslate(\"Please confirm that your firmware supports FPU.\") ..\n\t\"</font>\")\ns.anonymous = true\ns:append(Template(appname .. \"/app_update/app_version\"))\n\nlocal k, v\nlocal com = require \"luci.passwall2.com\"\nfor k, v in pairs(com) do\n\to = s:option(Value, k:gsub(\"%-\",\"_\") .. \"_file\", translatef(\"%s App Path\", v.name))\n\to.default = v.default_path or (\"/usr/bin/\" .. k)\n\to.rmempty = false\nend\n\no = s:option(DummyValue, \"tips\", \" \")\no.rawhtml = true\no.cfgvalue = function(t, n)\n\treturn string.format('<font color=\"red\">%s</font>', translate(\"if you want to run from memory, change the path, /tmp beginning then save the application and update it manually.\"))\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/geoview.lua",
    "content": "local api = require \"luci.passwall2.api\"\nlocal appname = \"passwall2\"\nlocal fs = api.fs\nlocal uci = api.uci\n\nlocal geo_dir = (uci:get(appname, \"@global_rules[0]\", \"v2ray_location_asset\") or \"/usr/share/v2ray/\"):match(\"^(.*)/\")\nlocal geosite_path = geo_dir .. \"/geosite.dat\"\nlocal geoip_path = geo_dir .. \"/geoip.dat\"\nif fs.access(geosite_path) and fs.access(geoip_path) then\n    f = SimpleForm(appname)\n    f.reset = false\n    f.submit = false\n    f:append(Template(appname .. \"/rule/geoview\"))\nend\n\nreturn f"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/global.lua",
    "content": "api = require \"luci.passwall2.api\"\nappname = api.appname\ndatatypes = api.datatypes\nhas_singbox = api.finded_com(\"sing-box\")\nhas_xray = api.finded_com(\"xray\")\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\nm:append(Template(appname .. \"/cbi/nodes_listvalue_com\"))\n\nnodes_table = {}\nfor k, e in ipairs(api.get_valid_nodes()) do\n\tnodes_table[#nodes_table + 1] = e\nend\n\nlocal normal_list = {}\nlocal balancing_list = {}\nlocal urltest_list = {}\nlocal shunt_list = {}\nlocal iface_list = {}\nfor k, v in pairs(nodes_table) do\n\tif v.node_type == \"normal\" then\n\t\tnormal_list[#normal_list + 1] = v\n\tend\n\tif v.protocol and v.protocol == \"_balancing\" then\n\t\tbalancing_list[#balancing_list + 1] = v\n\tend\n\tif v.protocol and v.protocol == \"_urltest\" then\n\t\turltest_list[#urltest_list + 1] = v\n\tend\n\tif v.protocol and v.protocol == \"_shunt\" then\n\t\tshunt_list[#shunt_list + 1] = v\n\tend\n\tif v.protocol and v.protocol == \"_iface\" then\n\t\tiface_list[#iface_list + 1] = v\n\tend\nend\n\nlocal socks_list = {}\nm.uci:foreach(appname, \"socks\", function(s)\n\tif s.enabled == \"1\" and s.node then\n\t\tsocks_list[#socks_list + 1] = {\n\t\t\tid = \"Socks_\" .. s[\".name\"],\n\t\t\tremark = translate(\"Socks Config\") .. \" [\" .. s.port .. translate(\"Port\") .. \"]\",\n\t\t\tgroup = \"Socks\"\n\t\t}\n\tend\nend)\n\nlocal doh_validate = function(self, value, t)\n\tif value ~= \"\" then\n\t\tlocal flag = 0\n\t\tlocal util = require \"luci.util\"\n\t\tlocal val = util.split(value, \",\")\n\t\tlocal url = val[1]\n\t\tval[1] = nil\n\t\tfor i = 1, #val do\n\t\t\tlocal v = val[i]\n\t\t\tif v then\n\t\t\t\tif not datatypes.ipmask4(v) and not datatypes.ipmask6(v) then\n\t\t\t\t\tflag = 1\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif flag == 0 then\n\t\t\treturn value\n\t\tend\n\tend\n\treturn nil, translate(\"DoH request address\") .. \" \" .. translate(\"Format must be:\") .. \" URL,IP\"\nend\n\nm:append(Template(appname .. \"/global/status\"))\n\nglobal_cfgid = m:get(\"@global[0]\")[\".name\"]\n\ns = m:section(TypedSection, \"global\")\ns.anonymous = true\ns.addremove = false\n\ns:tab(\"Main\", translate(\"Main\"))\n\n-- [[ Global Settings ]]--\no = s:taboption(\"Main\", Flag, \"enabled\", translate(\"Main switch\"))\no.rmempty = false\n\n---- Node\no = s:taboption(\"Main\", ListValue, \"node\", \"<a style='color: red'>\" .. translate(\"Node\") .. \"</a>\")\no.template = appname .. \"/cbi/nodes_listvalue\"\no:value(\"\", translate(\"Close\"))\no.group = {\"\"}\n\ncurrent_node_id = m.uci:get(appname, global_cfgid, \"node\")\ncurrent_node = current_node_id and m.uci:get_all(appname, current_node_id) or {}\n\n-- Shunt Start\nif (has_singbox or has_xray) and #nodes_table > 0 then\n\tif #normal_list > 0 or #iface_list > 0 then\n\t\tif current_node.protocol == \"_shunt\" then\n\t\t\tlocal shunt_lua = loadfile(\"/usr/lib/lua/luci/model/cbi/passwall2/client/include/shunt_options.lua\")\n\t\t\tsetfenv(shunt_lua, getfenv(1))(m, s, {\n\t\t\t\tnode_id = current_node_id,\n\t\t\t\tnode = current_node,\n\t\t\t\tsocks_list = socks_list,\n\t\t\t\turltest_list = urltest_list,\n\t\t\t\tbalancing_list = balancing_list,\n\t\t\t\tiface_list = iface_list,\n\t\t\t\tnormal_list = normal_list,\n\t\t\t\tverify_option = s.fields[\"node\"],\n\t\t\t\ttab = \"Shunt\",\n\t\t\t\ttab_desc = translate(\"Shunt Rule\")\n\t\t\t})\n\t\tend\n\telse\n\t\tlocal tips = s:taboption(\"Main\", DummyValue, \"tips\", \"　\")\n\t\ttips.rawhtml = true\n\t\ttips.cfgvalue = function(t, n)\n\t\t\treturn string.format('<a style=\"color: red\">%s</a>', translate(\"There are no available nodes, please add or subscribe nodes first.\"))\n\t\tend\n\t\ttips:depends({ node = \"\", [\"!reverse\"] = true })\n\t\tfor k, v in pairs(shunt_list) do\n\t\t\ttips:depends(\"node\", v.id)\n\t\tend\n\t\tfor k, v in pairs(balancing_list) do\n\t\t\ttips:depends(\"node\", v.id)\n\t\tend\n\tend\nend\n\n---- Check the transparent proxy component\nlocal handle = io.popen(\"lsmod\")\nlocal mods = \"\"\nif handle then\n\tmods = handle:read(\"*a\") or \"\"\n\thandle:close()\nend\n\nif (mods:find(\"REDIRECT\") and mods:find(\"TPROXY\")) or (mods:find(\"nft_redir\") and mods:find(\"nft_tproxy\")) then\n\to = s:taboption(\"Main\", Flag, \"localhost_proxy\", translate(\"Localhost Proxy\"), translate(\"When selected, localhost can transparent proxy.\"))\n\to.default = \"1\"\n\to.rmempty = false\n\n\to = s:taboption(\"Main\", Flag, \"client_proxy\", translate(\"Client Proxy\"), translate(\"When selected, devices in LAN can transparent proxy. Otherwise, it will not be proxy. But you can still use access control to allow the designated device to proxy.\"))\n\to.default = \"1\"\n\to.rmempty = false\nelse\n\tlocal html = string.format([[<div class=\"cbi-checkbox\"><input class=\"cbi-input-checkbox\" type=\"checkbox\" disabled></div><div class=\"cbi-value-description\"><font color=\"red\">%s</font></div>]], translate(\"Missing components, transparent proxy is unavailable.\"))\n\to = s:taboption(\"Main\", DummyValue, \"localhost_proxy\", translate(\"Localhost Proxy\"))\n\to.rawhtml = true\n\tfunction o.cfgvalue(self, section)\n\t\treturn html\n\tend\n\n\to = s:taboption(\"Main\", DummyValue, \"client_proxy\", translate(\"Client Proxy\"))\n\to.rawhtml = true\n\tfunction o.cfgvalue(self, section)\n\t\treturn html\n\tend\nend\n\nnode_socks_port = s:taboption(\"Main\", Value, \"node_socks_port\", translate(\"Node\") .. \" Socks \" .. translate(\"Listen Port\"))\nnode_socks_port.default = 1070\nnode_socks_port.datatype = \"port\"\n\nnode_socks_bind_local = s:taboption(\"Main\", Flag, \"node_socks_bind_local\", translate(\"Node\") .. \" Socks \" .. translate(\"Bind Local\"), translate(\"When selected, it can only be accessed localhost.\"))\nnode_socks_bind_local.default = \"1\"\nnode_socks_bind_local:depends({ node = \"\", [\"!reverse\"] = true })\n\ns:tab(\"DNS\", translate(\"DNS\"))\n\no = s:taboption(\"DNS\", TextValue, \"direct_dns_shunt\", translate(\"Direct domain DNS routing\"))\no.description = \"<br /><ul>\"\n.. \"<li>\" .. translate(\"Subdomain (recommended): Begining with 'domain:' and the rest is a domain. When the targeting domain is exactly the value, or is a subdomain of the value, this rule takes effect. Example: rule 'domain:v2ray.com' matches 'www.v2ray.com', 'v2ray.com', but not 'xv2ray.com'.\") .. \"</li>\"\n.. \"<li>\" .. translate(\"Full domain: Begining with 'full:' and the rest is a domain. When the targeting domain is exactly the value, the rule takes effect. Example: rule 'domain:v2ray.com' matches 'v2ray.com', but not 'www.v2ray.com'.\") .. \"</li>\"\n.. \"<li>\" .. translate(\"Such as:\") .. \"</li>\"\n.. \"<li>\" .. \"domain:my-nodes.com tcp://223.5.5.5\" .. \"</li>\"\n.. \"<li>\" .. \"domain:vpn.com udp://119.29.29.29:53\" .. \"</li>\"\n.. \"<li>\" .. \"full:www.dnspod.com https://120.53.53.53/dns-query\" .. \"</li>\"\n.. \"<li>\" .. '<a style=\"color:red\">' .. translate(\"Please note that the program will not start if the format is incorrect!\") .. '</a>' .. \"</li>\"\n.. \"</ul>\"\no.rows = 3\no.wrap = \"off\"\n\no = s:taboption(\"DNS\", ListValue, \"direct_dns_query_strategy\", translate(\"Direct Query Strategy\"))\no.default = \"UseIP\"\no:value(\"UseIP\")\no:value(\"UseIPv4\")\no:value(\"UseIPv6\")\n\no = s:taboption(\"DNS\", ListValue, \"remote_dns_protocol\", translate(\"Remote DNS Protocol\"))\no:value(\"tcp\", \"TCP\")\no:value(\"doh\", \"DoH\")\no:value(\"udp\", \"UDP\")\nif current_node.type == \"sing-box\" then\n\to:value(\"tls\", \"TLS(DoT)\")\n\to:value(\"quic\", \"QUIC(DoQ)\")\n\to:value(\"http3\", \"HTTP3(DoH3)\")\nend\n\n---- DNS over TCP or UDP or TLS (DoT) or QUIC (DoQ)\no = s:taboption(\"DNS\", Value, \"remote_dns\", translate(\"Remote DNS\"))\no.datatype = \"or(ipaddr,ipaddrport)\"\no.default = \"1.1.1.1\"\no:value(\"1.1.1.1\", \"1.1.1.1 (CloudFlare)\")\no:value(\"1.1.1.2\", \"1.1.1.2 (CloudFlare-Security)\")\no:value(\"8.8.4.4\", \"8.8.4.4 (Google)\")\no:value(\"8.8.8.8\", \"8.8.8.8 (Google)\")\no:value(\"9.9.9.9\", \"9.9.9.9 (Quad9-Recommended)\")\no:value(\"149.112.112.112\", \"149.112.112.112 (Quad9-Recommended)\")\no:value(\"208.67.220.220\", \"208.67.220.220 (OpenDNS)\")\no:value(\"208.67.222.222\", \"208.67.222.222 (OpenDNS)\")\no:depends(\"remote_dns_protocol\", \"tcp\")\no:depends(\"remote_dns_protocol\", \"udp\")\no:depends(\"remote_dns_protocol\", \"quic\")\no:depends(\"remote_dns_protocol\", \"tls\")\n\n---- DNS over HTTP (DoH) or DNS over HTTP3(DoH3)\no = s:taboption(\"DNS\", Value, \"remote_dns_doh\", translate(\"Remote DNS DoH\"))\no.default = \"https://1.1.1.1/dns-query\"\no:value(\"https://1.1.1.1/dns-query\", \"CloudFlare\")\no:value(\"https://1.1.1.2/dns-query\", \"CloudFlare-Security\")\no:value(\"https://8.8.4.4/dns-query\", \"Google 8844\")\no:value(\"https://8.8.8.8/dns-query\", \"Google 8888\")\no:value(\"https://9.9.9.9/dns-query\", \"Quad9-Recommended 9.9.9.9\")\no:value(\"https://149.112.112.112/dns-query\", \"Quad9-Recommended 149.112.112.112\")\no:value(\"https://208.67.222.222/dns-query\", \"OpenDNS\")\no:value(\"https://dns.adguard.com/dns-query,94.140.14.14\", \"AdGuard\")\no:value(\"https://doh.libredns.gr/dns-query,116.202.176.26\", \"LibreDNS\")\no:value(\"https://doh.libredns.gr/ads,116.202.176.26\", \"LibreDNS (No Ads)\")\no.validate = doh_validate\no:depends(\"remote_dns_protocol\", \"doh\")\no:depends(\"remote_dns_protocol\", \"http3\")\n\no = s:taboption(\"DNS\", Value, \"remote_dns_client_ip\", translate(\"Remote DNS EDNS Client Subnet\"))\no.description = translate(\"Notify the DNS server when the DNS query is notified, the location of the client (cannot be a private IP address).\") .. \"<br />\" ..\n\t\t\t\ttranslate(\"This feature requires the DNS server to support the Edns Client Subnet (RFC7871).\")\no.datatype = \"ipaddr\"\n\no = s:taboption(\"DNS\", ListValue, \"remote_dns_detour\", translate(\"Remote DNS Outbound\"))\no.default = \"remote\"\no:value(\"remote\", translate(\"Remote\"))\no:value(\"direct\", translate(\"Direct\"))\n\no = s:taboption(\"DNS\", Flag, \"remote_fakedns\", \"FakeDNS\", translate(\"Use FakeDNS work in the domain that proxy.\"))\no.default = \"0\"\no.rmempty = false\n\no = s:taboption(\"DNS\", ListValue, \"remote_dns_query_strategy\", translate(\"Remote Query Strategy\"))\no.default = \"UseIPv4\"\no:value(\"UseIP\")\no:value(\"UseIPv4\")\no:value(\"UseIPv6\")\n\no = s:taboption(\"DNS\", TextValue, \"dns_hosts\", translate(\"Domain Override\"))\no.rows = 5\no.wrap = \"off\"\no.remove = function(self, section)\n\tlocal node_value = s.fields[\"node\"]:formvalue(global_cfgid)\n\tif node_value then\n\t\tlocal node_t = m:get(node_value) or {}\n\t\tif node_t.type == \"Xray\" or node_t.type == \"sing-box\" then\n\t\t\tAbstractValue.remove(self, section)\n\t\tend\n\tend\nend\n\no = s:taboption(\"DNS\", Flag, \"dns_redirect\", translate(\"DNS Redirect\"), translate(\"Force special DNS server to need proxy devices.\"))\no.default = \"1\"\no.rmempty = false\n\nlocal prefer_nft = m:get(\"@global_forwarding[0]\", \"prefer_nft\") == \"1\"\nlocal set_title = api.i18n.translate(prefer_nft and \"Clear NFTSET\" or \"Clear IPSET\")\no = s:taboption(\"DNS\", DummyValue, \"clear_ipset\", set_title, translate(\"Try this feature if the rule modification does not take effect.\"))\no.rawhtml = true\nfunction o.cfgvalue(self, section)\n\treturn string.format(\n\t\t[[<button type=\"button\" class=\"cbi-button cbi-button-remove\" onclick=\"location.href='%s'\">%s</button>]],\n\t\tapi.url(\"flush_set\") .. \"?redirect=1&reload=1\", set_title)\nend\n\ns:tab(\"log\", translate(\"Log\"))\no = s:taboption(\"log\", Flag, \"log_node\", translate(\"Enable Node Log\"))\no.default = \"1\"\no.rmempty = false\n\nloglevel = s:taboption(\"log\", ListValue, \"loglevel\", translate(\"Log Level\"))\nloglevel.default = \"warning\"\nloglevel:value(\"debug\")\nloglevel:value(\"info\")\nloglevel:value(\"warning\")\nloglevel:value(\"error\")\n\ns:tab(\"faq\", \"FAQ\")\n\no = s:taboption(\"faq\", DummyValue, \"\")\no.template = appname .. \"/global/faq\"\n\ns:tab(\"maintain\", translate(\"Maintain\"))\no = s:taboption(\"maintain\", DummyValue, \"\")\no.template = appname .. \"/global/backup\"\n\n-- [[ Socks Server ]]--\no = s:taboption(\"Main\", Flag, \"socks_enabled\", \"Socks \" .. translate(\"Main switch\"))\no.rmempty = false\n\ns2 = m:section(TypedSection, \"socks\", translate(\"Socks Config\"))\ns2.template = \"cbi/tblsection\"\ns2.anonymous = true\ns2.addremove = true\ns2.extedit = api.url(\"socks_config\", \"%s\")\nfunction s2.create(e, t)\n\tlocal uuid = api.gen_short_uuid()\n\tt = uuid\n\tTypedSection.create(e, t)\n\tluci.http.redirect(e.extedit:format(t))\nend\n\no = s2:option(DummyValue, \"status\", translate(\"Status\"))\no.rawhtml = true\no.cfgvalue = function(t, n)\n\treturn string.format('<div class=\"_status\" socks_id=\"%s\"></div>', n)\nend\n\n---- Enable\no = s2:option(Flag, \"enabled\", translate(\"Enable\"))\no.default = 1\no.rmempty = false\n\no = s2:option(ListValue, \"node\", translate(\"Socks Node\"))\no.template = appname .. \"/cbi/nodes_listvalue\"\no.group = {}\n\no = s2:option(DummyValue, \"now_node\", translate(\"Current Node\"))\no.rawhtml = true\no.cfgvalue = function(_, n)\n\tlocal current_node = api.get_cache_var(\"socks_\" .. n)\n\tif current_node then\n\t\tlocal node = m:get(current_node)\n\t\tif node then\n\t\t\treturn (api.get_node_remarks(node) or \"\"):gsub(\"(：)%[\", \"%1<br>[\")\n\t\tend\n\tend\nend\n\nlocal n = 1\nm.uci:foreach(appname, \"socks\", function(s)\n\tif s[\".name\"] == section then\n\t\treturn false\n\tend\n\tn = n + 1\nend)\n\no = s2:option(Value, \"port\", \"Socks \" .. translate(\"Listen Port\"))\no.default = n + 1080\no.datatype = \"port\"\no.rmempty = false\n\nif has_singbox or has_xray then\n\to = s2:option(Value, \"http_port\", \"HTTP \" .. translate(\"Listen Port\") .. \" \" .. translate(\"0 is not use\"))\n\to.default = 0\n\to.datatype = \"port\"\nend\n\nlocal o_node = s.fields[\"node\"]\nlocal o_socks = s2.fields[\"node\"]\nfor k, v in pairs(nodes_table) do\n\tif #normal_list == 0 and #iface_list == 0 then\n\t\tbreak\n\tend\n\to_node:value(v.id, v[\"remark\"])\n\to_node.group[#o_node.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\to_socks:value(v.id, v[\"remark\"])\n\to_socks.group[#o_socks.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\tif v.node_type == \"normal\" or v.protocol == \"_balancing\" or v.protocol == \"_urltest\" then\n\t\t--Shunt node has its own separate options.\n\t\ts.fields[\"remote_fakedns\"]:depends({ node = v.id })\n\tend\nend\n\nlocal footer = Template(appname .. \"/global/footer\")\nfooter.api = api\nfooter.global_cfgid = global_cfgid\nfooter.shunt_list = api.jsonc.stringify(shunt_list)\n\nm:append(footer)\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/haproxy.lua",
    "content": "local api = require \"luci.passwall2.api\"\nlocal appname = api.appname\nlocal datatypes = api.datatypes\nlocal net = require \"luci.model.network\".init()\n\nlocal nodes_table = {}\nfor k, e in ipairs(api.get_valid_nodes()) do\n\tif e.node_type == \"normal\" then\n\t\tnodes_table[#nodes_table + 1] = {\n\t\t\tid = e[\".name\"],\n\t\t\tobj = e,\n\t\t\tremarks = e[\"remark\"],\n\t\t\tgroup = e[\"group\"]\n\t\t}\n\tend\nend\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\nm:append(Template(appname .. \"/cbi/nodes_value_com\"))\n\n-- [[ Haproxy Settings ]]--\ns = m:section(TypedSection, \"global_haproxy\", translate(\"Basic Settings\"))\ns.anonymous = true\n\ns:append(Template(appname .. \"/haproxy/status\"))\n\n---- Balancing Enable\no = s:option(Flag, \"balancing_enable\", translate(\"Enable Load Balancing\"))\no.rmempty = false\no.default = false\n\n---- Console Login Auth\no = s:option(Flag, \"console_auth\", translate(\"Console Login Auth\"))\no.default = false\no:depends(\"balancing_enable\", true)\n\n---- Console Username\no = s:option(Value, \"console_user\", translate(\"Console Username\"))\no.default = \"\"\no:depends(\"console_auth\", true)\n\n---- Console Password\no = s:option(Value, \"console_password\", translate(\"Console Password\"))\no.password = true\no.default = \"\"\no:depends(\"console_auth\", true)\n\n---- Console Port\no = s:option(Value, \"console_port\", translate(\"Console Port\"), translate(\"In the browser input routing IP plus port access, such as:192.168.1.1:1188\"))\no.datatype = \"port\"\no.default = 1188\no:depends(\"balancing_enable\", true)\n\no = s:option(Flag, \"bind_local\", translate(\"Haproxy Port\") .. \" \" .. translate(\"Bind Local\"), translate(\"When selected, it can only be accessed localhost.\"))\no.default = \"0\"\no:depends(\"balancing_enable\", true)\n\no = s:option(ListValue, \"balancingStrategy\", translate(\"Balancing Strategy\"))\no:value(\"roundrobin\", \"roundRobin\")\no:value(\"random\", \"random\")\no:value(\"leastconn\", \"leastConn\")\no:value(\"source\", \"source\")\no.default = \"roundrobin\"\no:depends(\"balancing_enable\", true)\n\n---- Health Check Type\no = s:option(ListValue, \"health_check_type\", translate(\"Health Check Type\"))\no.default = \"passwall_logic\"\no:value(\"tcp\", \"TCP\")\no:value(\"passwall_logic\", translate(\"URL Test\") .. string.format(\"(passwall %s)\", translate(\"Inner implement\")))\no:depends(\"balancing_enable\", true)\n\n---- Passwall Inner implement Probe URL\no = s:option(Value, \"health_probe_url\", translate(\"Probe URL\"))\no.default = \"https://www.google.com/generate_204\"\no:value(\"https://cp.cloudflare.com/\", \"Cloudflare\")\no:value(\"https://www.gstatic.com/generate_204\", \"Gstatic\")\no:value(\"https://www.google.com/generate_204\", \"Google\")\no:value(\"https://www.youtube.com/generate_204\", \"YouTube\")\no:value(\"https://connect.rom.miui.com/generate_204\", \"MIUI (CN)\")\no:value(\"https://connectivitycheck.platform.hicloud.com/generate_204\", \"HiCloud (CN)\")\no.description = translate(\"The URL used to detect the connection status.\")\no:depends(\"health_check_type\", \"passwall_logic\")\n\n---- Health Check Inter\no = s:option(Value, \"health_check_inter\", translate(\"Health Check Inter\"))\no.datatype = \"min(20)\"\no.default = 60\no:depends(\"balancing_enable\", true)\no.description = translate(\"Units:seconds\") .. \" ( ≥ 20s )\"\n\no = s:option(DummyValue, \"health_check_tips\", \" \")\no.rawhtml = true\no.cfgvalue = function(t, n)\n\treturn string.format('<span style=\"color: red\">%s</span>', translate(\"When the URL test is used, the load balancing node will be converted into a Socks node. when node list set customizing, must be a Socks node, otherwise the health check will be invalid.\"))\nend\no:depends(\"health_check_type\", \"passwall_logic\")\n\n-- [[ Balancing Settings ]]--\ns = m:section(TypedSection, \"haproxy_config\", translate(\"Node List\"))\ns.description = \"<font color='red'>\" ..\n\t\ttranslate(\"Add a node, Export Of Multi WAN Only support Multi Wan. Load specific gravity range 1-256. Multiple primary servers can be load balanced, standby will only be enabled when the primary server is offline! Multiple groups can be set, Haproxy port same one for each group.\") .. \"<br>\" ..\n\t\ttranslate(\"Note that the node configuration parameters for load balancing must be consistent when use TCP health check type, otherwise it cannot be used normally!\") .. \"</font>\"\ns.template = \"cbi/tblsection\"\ns.sortable = true\ns.anonymous = true\ns.addremove = true\n\ns.create = function(e, t)\n\tTypedSection.create(e, api.gen_short_uuid())\nend\n\ns.remove = function(self, section)\n\tfor k, v in pairs(self.children) do\n\t\tv.rmempty = true\n\t\tv.validate = nil\n\tend\n\tTypedSection.remove(self, section)\nend\n\n---- Enable\no = s:option(Flag, \"enabled\", translate(\"Enable\"))\no.default = 1\no.rmempty = false\n\n---- Node Address\no = s:option(Value, \"lbss\", translate(\"Node Address\"))\no.template = appname .. \"/cbi/nodes_value\"\no.group = {}\nfor k, v in pairs(nodes_table) do\n\to:value(v.id, v.remarks)\n\to.group[#o.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\nend\no.rmempty = false\no.validate = function(self, value)\n\tif not value then return nil, translate(\"Node address cannot be empty.\") end\n\tlocal t = m:get(value) or nil\n\tif t and t[\".type\"] == \"nodes\" then\n\t\treturn value\n\tend\n\tif datatypes.hostport(value) or datatypes.ip4addrport(value) then\n\t\treturn value\n\tend\n\tif api.is_ipv6addrport(value) then\n\t\treturn value\n\tend\n\treturn nil, translate(\"Not valid IP format, please re-enter!\") .. \" (IP:Port)\"\nend\n\n---- Haproxy Port\no = s:option(Value, \"haproxy_port\", translate(\"Haproxy Port\"))\no.datatype = \"port\"\no.default = 1181\no.rmempty = false\n\n---- Node Weight\no = s:option(Value, \"lbweight\", translate(\"Node Weight\"))\no.datatype = \"min(1)\"\no.default = 5\no.rmempty = false\n\n---- Export\no = s:option(ListValue, \"export\", translate(\"Export Of Multi WAN\"))\no:value(0, translate(\"Auto\"))\nlocal wa = require \"luci.tools.webadmin\"\nwa.cbi_add_networks(o)\no.default = 0\no.rmempty = false\n\n---- Mode\no = s:option(ListValue, \"backup\", translate(\"Mode\"))\no:value(0, translate(\"Primary\"))\no:value(1, translate(\"Standby\"))\no.rmempty = false\n\nm:append(Template(appname .. \"/haproxy/js\"))\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/include/shunt_options.lua",
    "content": "local m, s, data = ...\n\nif not data.node_id or not data.node then\n\treturn\nend\n\nlocal current_node_id = data.node_id\nlocal node_list = data.node_list or api.get_node_list()\n\nlocal function get_cfgvalue()\n\treturn function(self, section)\n\t\treturn m:get(current_node_id, self.option)\n\tend\nend\nlocal function get_write()\n\treturn function(self, section, value)\n\t\tif data.verify_option then\n\t\t\tif data.verify_option:formvalue(section) == current_node_id then\n\t\t\t\tm:set(current_node_id, self.option, value)\n\t\t\tend\n\t\telse\n\t\t\tm:set(current_node_id, self.option, value)\n\t\tend\n\tend\nend\nlocal function get_remove()\n\treturn function(self, section)\n\t\tif data.verify_option then\n\t\t\tif data.verify_option:formvalue(section) == current_node_id then\n\t\t\t\tm:del(current_node_id, self.option)\n\t\t\tend\n\t\telse\n\t\t\tm:del(current_node_id, self.option)\n\t\tend\n\tend\nend\n\nif data.tab then\n\ts:tab(data.tab, data.tab_desc)\nend\n\nlocal function add_option(class, option_name, option_title, option_desc)\n\tlocal a\n\tif data.tab then\n\t\ta = s:taboption(data.tab, class, option_name, option_title)\n\telse\n\t\ta = s:option(class, option_name, option_title)\n\tend\n\tif a then\n\t\tif option_desc then\n\t\t\ta.description = option_desc\n\t\tend\n\t\ta.cfgvalue = get_cfgvalue()\n\t\ta.write = get_write()\n\t\ta.remove = get_remove()\n\tend\n\tif data.verify_option then\n\t\ta:depends(data.verify_option.option, current_node_id)\n\tend\n\treturn a\nend\n\nlocal function add_depends(o, deps)\n\tif #o.deps > 0 then\n\t\tfor index, value in ipairs(o.deps) do\n\t\t\tfor k, v in pairs(deps) do\n\t\t\t\to.deps[index][k] = v\n\t\t\tend\n\t\tend\n\telse\n\t\to:depends(deps)\n\tend\nend\n\nif data.node.type == \"Xray\" then\n\to = add_option(ListValue, \"domainStrategy\", translate(\"Domain Strategy\"))\n\to:value(\"AsIs\")\n\to:value(\"IPIfNonMatch\")\n\to:value(\"IPOnDemand\")\n\to.default = \"IPOnDemand\"\n\to.description = \"<br /><ul><li>\" .. translate(\"'AsIs': Only use domain for routing. Default value.\")\n\t\t.. \"</li><li>\" .. translate(\"'IPIfNonMatch': When no rule matches current domain, resolves it into IP addresses (A or AAAA records) and try all rules again.\")\n\t\t.. \"</li><li>\" .. translate(\"'IPOnDemand': As long as there is a IP-based rule, resolves the domain into IP immediately.\")\n\t\t.. \"</li></ul>\"\n\n\to = add_option(ListValue, \"domainMatcher\", translate(\"Domain matcher\"))\n\to:value(\"hybrid\")\n\to:value(\"linear\")\nend\n\no = add_option(Flag, \"fakedns\", '<a style=\"color:#FF8C00\">FakeDNS</a>' .. \" \" .. translate(\"Main switch\"), translate(\"Use FakeDNS work in the domain that proxy.\") .. \"<br>\" ..\n\ttranslate(\"Suitable scenarios for let the node servers get the target domain names.\") .. \"<br>\" ..\n\ttranslate(\"Such as: DNS unlocking of streaming media, reducing DNS query latency, etc.\"))\n\no = add_option(Flag, \"write_ipset_direct\", translate(\"Direct DNS result write to IPSet\"), translate(\"Perform the matching direct domain name rules into IP to IPSet/NFTSet, and then connect directly (not entering the core).\") .. \" \" .. translate(\"Maybe conflict with some special circumstances.\"))\no.default = 1\no.rmempty = false\n\nif api.is_finded(\"geoview\") then\n\to = add_option(Flag, \"enable_geoview_ip\", translate(\"Enable GeoIP Data Parsing\"))\n\to.default = 1\n\to.rmempty = false\n\to.description = \"<ul>\"\n\t\t.. \"<li>\" .. translate(\"Analyzes and preloads GeoIP data to enhance the shunt performance.\") .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"Note: Increases resource usage.\") .. \" \" .. translate(\"Maybe conflict with some special circumstances.\") .. \"</li>\"\n\t\t.. \"</ul>\"\nend\n\nlocal shunt_rules = {}\nm.uci:foreach(appname, \"shunt_rules\", function(e)\n\te.id = e[\".name\"]\n\te.remarks = e.remarks or e[\".name\"]\n\te[\"_node_option\"] = e[\".name\"]\n\te[\"_node_default\"] = \"\"\n\te[\"_fakedns_option\"] = e[\".name\"] .. \"_fakedns\"\n\te[\"_proxy_tag_option\"] = e[\".name\"] .. \"_proxy_tag\"\n\ttable.insert(shunt_rules, e)\nend)\ntable.insert(shunt_rules, {\n\tid = \".default\",\n\tremarks = translate(\"Default\"),\n\t_node_option = \"default_node\",\n\t_node_default = \"_direct\",\n\t_fakedns_option = \"default_fakedns\",\n\t_proxy_tag_option = \"default_proxy_tag\",\n})\n\ns2 = m:section(Table, shunt_rules, \" \")\ns2.config = appname\ns2.sectiontype = \"shunt_option_list\"\n\no = s2:option(DummyValue, \"remarks\", translate(\"Rule\"))\no.rawhtml = true\no.cfgvalue = function(self, section)\n\tif shunt_rules[section].id == \".default\" then\n\t\treturn string.format('<font style=\"color: red\">%s</font>', shunt_rules[section].remarks)\n\telse\n\t\treturn string.format('<a href=\"%s\" target=\"_blank\">%s</a>', api.url(\"shunt_rules\", shunt_rules[section].id), shunt_rules[section].remarks)\n\tend\nend\n\n_node = s2:option(Value, \"_node\", translate(\"Node\"))\n_node.template = appname .. \"/cbi/nodes_listvalue\"\n_node.group = {\"\",\"\",\"\",\"\"}\n_node:value(\"\", translate(\"Close (Not use)\"))\n_node:value(\"_default\", translate(\"Use default node\"))\n_node:value(\"_direct\", translate(\"Direct Connection\"))\n_node:value(\"_blackhole\", translate(\"Blackhole (Block)\"))\n_node.cfgvalue = function(self, section)\n\treturn m:get(current_node_id, shunt_rules[section][\"_node_option\"]) or shunt_rules[section][\"_node_default\"]\nend\n_node.write = function(self, section, value)\n\treturn m:set(current_node_id, shunt_rules[section][\"_node_option\"], value)\nend\n_node.remove = function(self, section)\n\treturn m:del(current_node_id, shunt_rules[section][\"_node_option\"])\nend\n\no = s2:option(Flag, \"_fakedns\", string.format('<a style=\"color:#FF8C00\" title=\"%s\">FakeDNS</a>', translate(\"Use FakeDNS work in the domain that proxy.\") .. \"\\n\" ..\n\ttranslate(\"Suitable scenarios for let the node servers get the target domain names.\") .. \"\\n\" ..\n\ttranslate(\"Such as: DNS unlocking of streaming media, reducing DNS query latency, etc.\")))\no.cfgvalue = function(self, section)\n\treturn m:get(current_node_id, shunt_rules[section][\"_fakedns_option\"])\nend\no.write = function(self, section, value)\n\treturn m:set(current_node_id, shunt_rules[section][\"_fakedns_option\"], value)\nend\no.remove = function(self, section)\n\treturn m:del(current_node_id, shunt_rules[section][\"_fakedns_option\"])\nend\n\nproxy_tag_node = s2:option(ListValue, \"_proxy_tag\", string.format('<a style=\"color:red\" title=\"%s\">%s</a>',\n\ttranslate(\"Set the node to be used as a pre-proxy.\") .. \"\\n\" .. translate(\"Each rule has a separate switch that controls whether this rule uses the pre-proxy or not.\"),\n\ttranslate(\"Preproxy\")))\nproxy_tag_node.template = appname .. \"/cbi/nodes_listvalue\"\nproxy_tag_node.group = {\"\"}\nproxy_tag_node:value(\"\", translate(\"Close (Not use)\"))\nproxy_tag_node.cfgvalue = function(self, section)\n\treturn m:get(current_node_id, shunt_rules[section][\"_proxy_tag_option\"])\nend\nproxy_tag_node.write = function(self, section, value)\n\treturn m:set(current_node_id, shunt_rules[section][\"_proxy_tag_option\"], value)\nend\nproxy_tag_node.remove = function(self, section)\n\treturn m:del(current_node_id, shunt_rules[section][\"_proxy_tag_option\"])\nend\n\nfor k1, v1 in pairs(node_list) do\n\tif k1 ~= \"shunt_list\" then\n\t\tfor i, v in ipairs(v1) do\n\t\t\t_node:value(v.id, v.remark)\n\t\t\t_node.group[#_node.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\n\t\t\tproxy_tag_node:value(v.id, v.remark)\n\t\t\tproxy_tag_node.group[#proxy_tag_node.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\t\tend\n\tend\nend\n\nlocal footer = Template(appname .. \"/include/shunt_options\")\nfooter.api = api\nfooter.id = current_node_id\nfooter.normal_list = api.jsonc.stringify(node_list.normal_list)\nm:append(footer)\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/log.lua",
    "content": "local appname = \"passwall2\"\n\nf = SimpleForm(appname)\nf.reset = false\nf.submit = false\nf:append(Template(appname .. \"/log/log\"))\n\nreturn f"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_config.lua",
    "content": "api = require \"luci.passwall2.api\"\nappname = api.appname\n\nm = Map(appname, translate(\"Node Config\"))\nm.redirect = api.url()\napi.set_apply_on_parse(m)\n\nif not arg[1] or not m:get(arg[1]) then\n\tluci.http.redirect(api.url(\"node_list\"))\nend\n\nfs = require \"nixio.fs\"\nformvalue_key = \"cbid.\" .. appname .. \".\" .. arg[1] .. \".\"\n\nlocal header = Template(appname .. \"/node_config/header\")\nheader.api = api\nheader.section = arg[1]\nm:append(header)\n\nm:append(Template(appname .. \"/cbi/nodes_multivalue_com\"))\nm:append(Template(appname .. \"/cbi/nodes_listvalue_com\"))\n\ngroups = {}\nm.uci:foreach(appname, \"nodes\", function(s)\n\tif s[\".name\"] ~= arg[1] then\n\t\tif s.group and s.group ~= \"\" then\n\t\t\tgroups[s.group] = true\n\t\tend\n\tend\nend)\n\ns = m:section(NamedSection, arg[1], \"nodes\", \"\")\ns.addremove = false\ns.dynamic = false\n\no = s:option(DummyValue, \"passwall2\", \" \")\no.rawhtml  = true\no.template = \"passwall2/node_config/link_share_man\"\no.value = arg[1]\n\no = s:option(Value, \"remarks\", translate(\"Node Remarks\"))\no.default = translate(\"Remarks\")\no.rmempty = false\n\no = s:option(Value, \"group\", translate(\"Group Name\"))\no.default = \"\"\no:value(\"\", translate(\"default\"))\nfor k, v in pairs(groups) do\n\to:value(k)\nend\no.write = function(self, section, value)\n\tvalue = api.trim(value)\n\tlocal lower = value:lower()\n\n\tif lower == \"\" or lower == \"default\" then\n\t\treturn m:del(section, self.option)\n\tend\n\n\tfor _, v in ipairs(self.keylist or {}) do\n\t\tif v:lower() == lower then\n\t\t\treturn m:set(section, self.option, v)\n\t\tend\n\tend\n\tm:set(section, self.option, value)\nend\n\nlocal types_dir = \"/usr/lib/lua/luci/model/cbi/passwall2/client/type/\"\ns.val = {}\ns.val[\"type\"] = m.uci:get(appname, arg[1], \"type\")\ns.val[\"protocol\"] = m.uci:get(appname, arg[1], \"protocol\")\n\nif luci.http.formvalue(\"cbi.submit\") == \"1\" then\n\tlocal formvalue_type = luci.http.formvalue(formvalue_key .. \"type\")\n\tif formvalue_type then\n\t\ts.val[\"type\"] = formvalue_type\n\tend\nend\n\no = s:option(ListValue, \"type\", translate(\"Type\"))\n\nlocal type_table = {}\nfor filename in fs.dir(types_dir) do\n\ttable.insert(type_table, filename)\nend\ntable.sort(type_table)\n\nfor index, value in ipairs(type_table) do\n\tlocal p_func = loadfile(types_dir .. value)\n\tsetfenv(p_func, getfenv(1))(m, s)\nend\n\nlocal footer = Template(appname .. \"/node_config/footer\")\nfooter.api = api\nfooter.section = arg[1]\n\nm:append(footer)\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_list.lua",
    "content": "local api = require \"luci.passwall2.api\"\nlocal appname = api.appname\nlocal datatypes = api.datatypes\nlocal sys = api.sys\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\n-- [[ Other Settings ]]--\ns = m:section(TypedSection, \"global_other\")\ns.anonymous = true\n\no = s:option(ListValue, \"auto_detection_time\", translate(\"Automatic detection delay\"))\no:value(\"0\", translate(\"Close\"))\no:value(\"icmp\", \"Ping\")\no:value(\"tcping\", \"TCP Ping\")\n\no = s:option(Flag, \"show_node_info\", translate(\"Show server address and port\"))\no.default = \"0\"\n\no = s:option(Value, \"url_test_url\", translate(\"URL Test Address\"))\no:value(\"https://cp.cloudflare.com/\", \"Cloudflare\")\no:value(\"https://www.gstatic.com/generate_204\", \"Gstatic\")\no:value(\"https://www.google.com/generate_204\", \"Google\")\no:value(\"https://www.youtube.com/generate_204\", \"YouTube\")\no:value(\"https://connect.rom.miui.com/generate_204\", \"MIUI (CN)\")\no:value(\"https://connectivitycheck.platform.hicloud.com/generate_204\", \"HiCloud (CN)\")\no.default = o.keylist[3]\n\n-- [[ Add the node via the link ]]--\ns:append(Template(appname .. \"/node_list/link_add_node\"))\n\nm:append(Template(appname .. \"/node_list/node_list\"))\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe.lua",
    "content": "local api = require \"luci.passwall2.api\"\nlocal appname = api.appname\nlocal uci = api.uci\nlocal has_ss = api.is_finded(\"ss-redir\")\nlocal has_ss_rust = api.is_finded(\"sslocal\")\nlocal has_singbox = api.finded_com(\"sing-box\")\nlocal has_xray = api.finded_com(\"xray\")\nlocal has_hysteria2 = api.finded_com(\"hysteria\")\nlocal ss_type = {}\nlocal trojan_type = {}\nlocal vmess_type = {}\nlocal vless_type = {}\nlocal hysteria2_type = {}\nlocal xray_version = api.get_app_version(\"xray\")\nif has_ss then\n\tlocal s = \"shadowsocks-libev\"\n\ttable.insert(ss_type, s)\nend\nif has_ss_rust then\n\tlocal s = \"shadowsocks-rust\"\n\ttable.insert(ss_type, s)\nend\nif has_singbox then\n\tlocal s = \"sing-box\"\n\ttable.insert(trojan_type, s)\n\ttable.insert(ss_type, s)\n\ttable.insert(vmess_type, s)\n\ttable.insert(vless_type, s)\n\ttable.insert(hysteria2_type, s)\nend\nif has_xray then\n\tlocal s = \"xray\"\n\ttable.insert(trojan_type, s)\n\ttable.insert(ss_type, s)\n\ttable.insert(vmess_type, s)\n\ttable.insert(vless_type, s)\n\tif api.compare_versions(xray_version, \">=\", \"26.1.13\") then\n\t\ttable.insert(hysteria2_type, s)\n\tend\nend\nif has_hysteria2 then\n\tlocal s = \"hysteria2\"\n\ttable.insert(hysteria2_type, s)\nend\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\nfunction m.on_before_save(self)\n\tself.uci:foreach(appname, \"subscribe_list\", function(e)\n\t\tself:del(e[\".name\"], \"md5\")\n\tend)\nend\n\n-- [[ Subscribe Settings ]]--\ns = m:section(TypedSection, \"global_subscribe\", \"\")\ns.anonymous = true\n\no = s:option(ListValue, \"filter_keyword_mode\", translate(\"Filter keyword Mode\"))\no:value(\"0\", translate(\"Close\"))\no:value(\"1\", translate(\"Discard List\"))\no:value(\"2\", translate(\"Keep List\"))\no:value(\"3\", translate(\"Discard List,But Keep List First\"))\no:value(\"4\", translate(\"Keep List,But Discard List First\"))\n\no = s:option(DynamicList, \"filter_discard_list\", translate(\"Discard List\"))\n\no = s:option(DynamicList, \"filter_keep_list\", translate(\"Keep List\"))\n\nif #ss_type > 0 then\n\to = s:option(ListValue, \"ss_type\", translatef(\"%s Node Use Type\", \"Shadowsocks\"))\n\to:value(\"\", translate(\"Auto\"))\n\tfor key, value in pairs(ss_type) do\n\t\to:value(value)\n\tend\nend\n\nif #trojan_type > 0 then\n\to = s:option(ListValue, \"trojan_type\", translatef(\"%s Node Use Type\", \"Trojan\"))\n\to:value(\"\", translate(\"Auto\"))\n\tfor key, value in pairs(trojan_type) do\n\t\to:value(value)\n\tend\nend\n\nif #vmess_type > 0 then\n\to = s:option(ListValue, \"vmess_type\", translatef(\"%s Node Use Type\", \"VMess\"))\n\to:value(\"\", translate(\"Auto\"))\n\tfor key, value in pairs(vmess_type) do\n\t\to:value(value)\n\tend\nend\n\nif #vless_type > 0 then\n\to = s:option(ListValue, \"vless_type\", translatef(\"%s Node Use Type\", \"VLESS\"))\n\to:value(\"\", translate(\"Auto\"))\n\tfor key, value in pairs(vless_type) do\n\t\to:value(value)\n\tend\nend\n\nif #hysteria2_type > 0 then\n\to = s:option(ListValue, \"hysteria2_type\", translatef(\"%s Node Use Type\", \"Hysteria2\"))\n\to:value(\"\", translate(\"Auto\"))\n\tfor key, value in pairs(hysteria2_type) do\n\t\to:value(value)\n\tend\nend\n\nif #ss_type > 0 or #trojan_type > 0 or #vmess_type > 0 or #vless_type > 0 or #hysteria2_type > 0 then\n\to.description = string.format(\"<font color='red'>%s</font>\",\n\t\t\ttranslate(\"The configured type also applies to the core specified when manually importing nodes.\"))\nend\n\n---- Subscribe Delete All\no = s:option(DummyValue, \"_stop\", translate(\"Delete All Subscribe Node\"))\no.rawhtml = true\nfunction o.cfgvalue(self, section)\n\treturn string.format(\n\t\t[[<input type=\"button\" class=\"btn cbi-button cbi-button-remove\" onclick=\"return confirmDeleteAll()\" value=\"%s\" />]],\n\t\ttranslate(\"Delete All Subscribe Node\"))\nend\n\no = s:option(DummyValue, \"_update\", translate(\"Manual subscription All\"))\no.rawhtml = true\no.cfgvalue = function(self, section)\n    return string.format([[\n        <input type=\"button\" class=\"btn cbi-button cbi-button-apply\" onclick=\"ManualSubscribeAll()\" value=\"%s\" />]],\n\t translate(\"Manual subscription All\"))\nend\n\ns = m:section(TypedSection, \"subscribe_list\", \"\", \"<font color='red'>\" .. translate(\"When adding a new subscription, please save and apply before manually subscribing. If you only change the subscription URL, you can subscribe manually, and the system will save it automatically.\") .. \"</font>\")\ns.addremove = true\ns.anonymous = true\ns.sortable = true\ns.template = \"cbi/tblsection\"\ns.extedit = api.url(\"node_subscribe_config\", \"%s\")\nfunction s.create(e, t)\n\tlocal id = TypedSection.create(e, t)\n\tluci.http.redirect(e.extedit:format(id))\nend\n\no = s:option(Value, \"remark\", translate(\"Remarks\"))\no.width = \"auto\"\no.rmempty = false\no.validate = function(self, value, section)\n\tvalue = api.trim(value)\n\tif value == \"\" then\n\t\treturn nil, translate(\"Remark cannot be empty.\")\n\tend\n\tlocal duplicate = false\n\tm.uci:foreach(appname, \"subscribe_list\", function(e)\n\t\tif e[\".name\"] ~= section and e[\"remark\"] and e[\"remark\"]:lower() == value:lower() then\n\t\t\tduplicate = true\n\t\t\treturn false\n\t\tend\n\tend)\n\tif duplicate or value:lower() == \"default\" then\n\t\treturn nil, translate(\"This remark already exists, please change a new remark.\")\n\tend\n\treturn value\nend\no.write = function(self, section, value)\n\tlocal old = m:get(section, self.option) or \"\"\n\tif old ~= value then\n\t\tm.uci:foreach(appname, \"nodes\", function(e)\n\t\t\tif e[\"group\"] and e[\"group\"]:lower() == old:lower() then\n\t\t\t\tm.uci:set(appname, e[\".name\"], \"group\", value)\n\t\t\tend\n\t\t\tif e[\"protocol\"] and (e[\"protocol\"] == \"_balancing\" or e[\"protocol\"] == \"_urltest\") and e[\"node_group\"] then\n\t\t\t\tlocal gs = \"\"\n\t\t\t\tfor g in e[\"node_group\"]:gmatch(\"%S+\") do\n\t\t\t\t\tif api.UrlEncode(old) == g then\n\t\t\t\t\t\tgs = gs .. \" \" .. api.UrlEncode(value)\n\t\t\t\t\telse\n\t\t\t\t\t\tgs = gs .. \" \" .. g\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tgs = api.trim(gs)\n\t\t\t\tm.uci:set(appname, e[\".name\"], \"node_group\", gs)\n\t\t\tend\n\t\tend)\n\tend\n\treturn Value.write(self, section, value)\nend\n\no = s:option(DummyValue, \"_node_count\", translate(\"Subscribe Info\"))\no.rawhtml = true\no.cfgvalue = function(t, n)\n\tlocal remark = m:get(n, \"remark\") or \"\"\n\tlocal str = m:get(n, \"rem_traffic\") or \"\"\n\tlocal expired_date = m:get(n, \"expired_date\") or \"\"\n\tif expired_date ~= \"\" then\n\t\tstr = str .. (str ~= \"\" and \"/\" or \"\") .. expired_date\n\tend\n\tstr = str ~= \"\" and \"<br>\" .. str or \"\"\n\tlocal num = 0\n\tm.uci:foreach(appname, \"nodes\", function(s)\n\t\tif s[\"group\"] and s[\"group\"]:lower() == remark:lower() then\n\t\t\tnum = num + 1\n\t\tend\n\tend)\n\treturn string.format(\"%s%s\", translate(\"Node num\") .. \": \" .. num, str)\nend\n\no = s:option(Value, \"url\", translate(\"Subscribe URL\"))\no.width = \"auto\"\no.rmempty = false\n\no = s:option(DummyValue, \"_remove\", translate(\"Delete the subscribed node\"))\no.rawhtml = true\nfunction o.cfgvalue(self, section)\n\tlocal remark = m:get(section, \"remark\") or \"\"\n\treturn string.format(\n\t\t[[<input type=\"button\" class=\"btn cbi-button cbi-button-remove\" onclick=\"return confirmDeleteNode('%s')\" value=\"%s\" />]],\n\t\tremark, translate(\"Delete the subscribed node\"))\nend\n\no = s:option(DummyValue, \"_update\", translate(\"Manual subscription\"))\no.rawhtml = true\no.cfgvalue = function(self, section)\n    return string.format([[\n        <input type=\"button\" class=\"btn cbi-button cbi-button-apply\" onclick=\"ManualSubscribe('%s')\" value=\"%s\" />]],\n\tsection, translate(\"Manual subscription\"))\nend\n\nm:append(Template(appname .. \"/node_subscribe/js\"))\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/node_subscribe_config.lua",
    "content": "local api = require \"luci.passwall2.api\"\nlocal appname = api.appname\n\nm = Map(appname)\nm.redirect = api.url(\"node_subscribe\")\napi.set_apply_on_parse(m)\n\nif not arg[1] or not m:get(arg[1]) then\n\tluci.http.redirect(m.redirect)\nend\n\nfunction m.on_before_save(self)\n\tself:del(arg[1], \"md5\")\nend\n\nm:append(Template(appname .. \"/cbi/nodes_listvalue_com\"))\n\nlocal has_ss = api.is_finded(\"ss-redir\")\nlocal has_ss_rust = api.is_finded(\"sslocal\")\nlocal has_singbox = api.finded_com(\"sing-box\")\nlocal has_xray = api.finded_com(\"xray\")\nlocal has_hysteria2 = api.finded_com(\"hysteria\")\nlocal ss_type = {}\nlocal trojan_type = {}\nlocal vmess_type = {}\nlocal vless_type = {}\nlocal hysteria2_type = {}\nlocal xray_version = api.get_app_version(\"xray\")\nif has_ss then\n\tlocal s = \"shadowsocks-libev\"\n\ttable.insert(ss_type, s)\nend\nif has_ss_rust then\n\tlocal s = \"shadowsocks-rust\"\n\ttable.insert(ss_type, s)\nend\nif has_singbox then\n\tlocal s = \"sing-box\"\n\ttable.insert(trojan_type, s)\n\ttable.insert(ss_type, s)\n\ttable.insert(vmess_type, s)\n\ttable.insert(vless_type, s)\n\ttable.insert(hysteria2_type, s)\nend\nif has_xray then\n\tlocal s = \"xray\"\n\ttable.insert(trojan_type, s)\n\ttable.insert(ss_type, s)\n\ttable.insert(vmess_type, s)\n\ttable.insert(vless_type, s)\n\tif api.compare_versions(xray_version, \">=\", \"26.1.13\") then\n\t\ttable.insert(hysteria2_type, s)\n\tend\nend\nif has_hysteria2 then\n\tlocal s = \"hysteria2\"\n\ttable.insert(hysteria2_type, s)\nend\nlocal nodes_table = {}\nfor k, e in ipairs(api.get_valid_nodes()) do\n\tif e.node_type == \"normal\" then\n\t\tnodes_table[#nodes_table + 1] = {\n\t\t\tid = e[\".name\"],\n\t\t\tremark = e[\"remark\"],\n\t\t\ttype = e[\"type\"],\n\t\t\tadd_mode = e[\"add_mode\"],\n\t\t\tchain_proxy = e[\"chain_proxy\"],\n\t\t\tgroup = e[\"group\"]\n\t\t}\n\tend\nend\n\ns = m:section(NamedSection, arg[1])\ns.addremove = false\ns.dynamic = false\n\no = s:option(Value, \"remark\", translate(\"Subscribe Remark\"))\no.rmempty = false\no.validate = function(self, value, section)\n\tvalue = api.trim(value)\n\tif value == \"\" then\n\t\treturn nil, translate(\"Remark cannot be empty.\")\n\tend\n\tlocal duplicate = false\n\tm.uci:foreach(appname, \"subscribe_list\", function(e)\n\t\tif e[\".name\"] ~= section and e[\"remark\"] and e[\"remark\"]:lower() == value:lower() then\n\t\t\tduplicate = true\n\t\t\treturn false\n\t\tend\n\tend)\n\tif duplicate or value:lower() == \"default\" then\n\t\treturn nil, translate(\"This remark already exists, please change a new remark.\")\n\tend\n\treturn value\nend\no.write = function(self, section, value)\n\tlocal old = m:get(section, self.option) or \"\"\n\tif old ~= value then\n\t\tm.uci:foreach(appname, \"nodes\", function(e)\n\t\t\tif e[\"group\"] and e[\"group\"]:lower() == old:lower() then\n\t\t\t\tm.uci:set(appname, e[\".name\"], \"group\", value)\n\t\t\tend\n\t\t\tif e[\"protocol\"] and (e[\"protocol\"] == \"_balancing\" or e[\"protocol\"] == \"_urltest\") and e[\"node_group\"] then\n\t\t\t\tlocal gs = \"\"\n\t\t\t\tfor g in e[\"node_group\"]:gmatch(\"%S+\") do\n\t\t\t\t\tif api.UrlEncode(old) == g then\n\t\t\t\t\t\tgs = gs .. \" \" .. api.UrlEncode(value)\n\t\t\t\t\telse\n\t\t\t\t\t\tgs = gs .. \" \" .. g\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tgs = api.trim(gs)\n\t\t\t\tm.uci:set(appname, e[\".name\"], \"node_group\", gs)\n\t\t\tend\n\t\tend)\n\tend\n\treturn Value.write(self, section, value)\nend\n\no = s:option(TextValue, \"url\", translate(\"Subscribe URL\"))\no.rows = 5\no.rmempty = false\no.validate = function(self, value)\n\tif not value or value == \"\" then\n\t\treturn nil, translate(\"URL cannot be empty.\")\n\tend\n\treturn value:gsub(\"%s+\", \"\"):gsub(\"%z\", \"\")\nend\n\no = s:option(ListValue, \"domain_resolver\", translate(\"Domain DNS Resolve\"))\no.description = translate(\"If the node address is a domain name, this DNS will be used for resolution.\") .. \"<br>\" ..\n\t\ttranslate(\"Supports only Xray or Sing-box node types.\")\no:value(\"\", translate(\"Auto\"))\no:value(\"tcp\", \"TCP\")\no:value(\"udp\", \"UDP\")\no:value(\"https\", \"DoH\")\n\no = s:option(Value, \"domain_resolver_dns\", \"DNS\")\no.datatype = \"or(ipaddr,ipaddrport)\"\no:value(\"114.114.114.114\")\no:value(\"223.5.5.5:53\")\no.default = o.keylist[1]\no:depends({ domain_resolver = \"tcp\" })\no:depends({ domain_resolver = \"udp\" })\n\no = s:option(Value, \"domain_resolver_dns_https\", \"DNS\")\no:value(\"https://120.53.53.53/dns-query\", \"DNSPod\")\no:value(\"https://223.5.5.5/dns-query\", \"AliDNS\")\no.default = o.keylist[1]\no:depends({ domain_resolver = \"https\" })\n\no = s:option(ListValue, \"domain_strategy\", translate(\"Domain Strategy\"), translate(\"If is domain name, The requested domain name will be resolved to IP before connect.\"))\no.default = \"\"\no:value(\"\", translate(\"Auto\"))\no:value(\"UseIPv4\", translate(\"IPv4 Only\"))\no:value(\"UseIPv6\", translate(\"IPv6 Only\"))\n\no = s:option(Flag, \"allowInsecure\", translate(\"allowInsecure\"))\no.default = \"0\"\no.rmempty = false\no.description = translate(\"Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.\") .. \"<br>\" ..\n\t\ttranslate(\"Used when the node link does not include this parameter.\")\n\no = s:option(ListValue, \"filter_keyword_mode\", translate(\"Filter keyword Mode\"))\no.default = \"5\"\no:value(\"0\", translate(\"Close\"))\no:value(\"1\", translate(\"Discard List\"))\no:value(\"2\", translate(\"Keep List\"))\no:value(\"3\", translate(\"Discard List,But Keep List First\"))\no:value(\"4\", translate(\"Keep List,But Discard List First\"))\no:value(\"5\", translate(\"Use global config\"))\n\no = s:option(DynamicList, \"filter_discard_list\", translate(\"Discard List\"))\no:depends(\"filter_keyword_mode\", \"1\")\no:depends(\"filter_keyword_mode\", \"3\")\no:depends(\"filter_keyword_mode\", \"4\")\n\no = s:option(DynamicList, \"filter_keep_list\", translate(\"Keep List\"))\no:depends(\"filter_keyword_mode\", \"2\")\no:depends(\"filter_keyword_mode\", \"3\")\no:depends(\"filter_keyword_mode\", \"4\")\n\nif #ss_type > 0 then\n\to = s:option(ListValue, \"ss_type\", translatef(\"%s Node Use Type\", \"Shadowsocks\"))\n\to.default = \"global\"\n\to:value(\"global\", translate(\"Use global config\"))\n\tfor key, value in pairs(ss_type) do\n\t\to:value(value)\n\tend\nend\n\nif #trojan_type > 0 then\n\to = s:option(ListValue, \"trojan_type\", translatef(\"%s Node Use Type\", \"Trojan\"))\n\to.default = \"global\"\n\to:value(\"global\", translate(\"Use global config\"))\n\tfor key, value in pairs(trojan_type) do\n\t\to:value(value)\n\tend\nend\n\nif #vmess_type > 0 then\n\to = s:option(ListValue, \"vmess_type\", translatef(\"%s Node Use Type\", \"VMess\"))\n\to.default = \"global\"\n\to:value(\"global\", translate(\"Use global config\"))\n\tfor key, value in pairs(vmess_type) do\n\t\to:value(value)\n\tend\nend\n\nif #vless_type > 0 then\n\to = s:option(ListValue, \"vless_type\", translatef(\"%s Node Use Type\", \"VLESS\"))\n\to.default = \"global\"\n\to:value(\"global\", translate(\"Use global config\"))\n\tfor key, value in pairs(vless_type) do\n\t\to:value(value)\n\tend\nend\n\nif #hysteria2_type > 0 then\n\to = s:option(ListValue, \"hysteria2_type\", translatef(\"%s Node Use Type\", \"Hysteria2\"))\n\to.default = \"global\"\n\to:value(\"global\", translate(\"Use global config\"))\n\tfor key, value in pairs(hysteria2_type) do\n\t\to:value(value)\n\tend\nend\n\no = s:option(Flag, \"boot_update\", translate(\"Update Once on Boot\"), translate(\"Updates the subscription the first time runs automatically after each system boot.\"))\no.default = 0\n\n---- Enable auto update subscribe\no = s:option(Flag, \"auto_update\", translate(\"Enable auto update subscribe\"))\no.default = 0\no.rmempty = false\n\n---- Week Update\no = s:option(ListValue, \"week_update\", translate(\"Update Mode\"))\no:value(8, translate(\"Loop Mode\"))\no:value(7, translate(\"Every day\"))\no:value(1, translate(\"Every Monday\"))\no:value(2, translate(\"Every Tuesday\"))\no:value(3, translate(\"Every Wednesday\"))\no:value(4, translate(\"Every Thursday\"))\no:value(5, translate(\"Every Friday\"))\no:value(6, translate(\"Every Saturday\"))\no:value(0, translate(\"Every Sunday\"))\no.default = 7\no:depends(\"auto_update\", true)\no.rmempty = true\n\n---- Time Update\no = s:option(ListValue, \"time_update\", translate(\"Update Time(every day)\"))\nfor t = 0, 23 do o:value(t, t .. \":00\") end\no.default = 0\no:depends(\"week_update\", \"0\")\no:depends(\"week_update\", \"1\")\no:depends(\"week_update\", \"2\")\no:depends(\"week_update\", \"3\")\no:depends(\"week_update\", \"4\")\no:depends(\"week_update\", \"5\")\no:depends(\"week_update\", \"6\")\no:depends(\"week_update\", \"7\")\no.rmempty = true\n\n---- Interval Update\no = s:option(ListValue, \"interval_update\", translate(\"Update Interval(hour)\"))\nfor t = 1, 24 do o:value(t, t .. \" \" .. translate(\"hour\")) end\no.default = 2\no:depends(\"week_update\", \"8\")\no.rmempty = true\n\no = s:option(ListValue, \"access_mode\", translate(\"Subscribe URL Access Method\"))\no.default = \"\"\no:value(\"\", translate(\"Auto\"))\no:value(\"direct\", translate(\"Direct Connection\"))\no:value(\"proxy\", translate(\"Proxy\"))\n\no = s:option(Value, \"user_agent\", translate(\"User-Agent\"))\no.default = \"v2rayN/9.99\"\no:value(\"curl\", \"Curl\")\no:value(\"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0\", \"Edge for Linux\")\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0\", \"Edge for Windows\")\no:value(\"passwall2\", \"PassWall2\")\no:value(\"v2rayN/9.99\", \"v2rayN\")\n\no = s:option(ListValue, \"chain_proxy\", translate(\"Chain Proxy\"))\no:value(\"\", translate(\"Close(Not use)\"))\no:value(\"1\", translate(\"Preproxy Node\"))\no:value(\"2\", translate(\"Landing Node\"))\n\nlocal descrStr = \"Chained proxy works only with Xray or Sing-box nodes.<br>\"\ndescrStr = descrStr .. \"You can only use manual or imported nodes as chained nodes.\"\ndescrStr = translate(descrStr) .. \"<br>\" .. translate(\"Only support a layer of proxy.\")\n\no1 = s:option(ListValue, \"preproxy_node\", translate(\"Preproxy Node\"))\no1:depends({ [\"chain_proxy\"] = \"1\" })\no1.description = descrStr\no1.template = appname .. \"/cbi/nodes_listvalue\"\no1.group = {}\n\no2 = s:option(ListValue, \"to_node\", translate(\"Landing Node\"))\no2:depends({ [\"chain_proxy\"] = \"2\" })\no2.description = descrStr\no2.template = appname .. \"/cbi/nodes_listvalue\"\no2.group = {}\n\nfor k, v in pairs(nodes_table) do\n\tif (v.type == \"Xray\" or v.type == \"sing-box\") and (not v.chain_proxy or v.chain_proxy == \"\") and v.add_mode ~= \"2\" then\n\t\to1:value(v.id, v.remark)\n\t\to1.group[#o1.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\t\to2:value(v.id, v.remark)\n\t\to2.group[#o2.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\tend\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/other.lua",
    "content": "local api = require \"luci.passwall2.api\"\nlocal appname = api.appname\nlocal fs = api.fs\nlocal has_singbox = api.finded_com(\"sing-box\")\nlocal has_xray = api.finded_com(\"xray\")\n\nlocal port_validate = function(self, value, t)\n\treturn value:gsub(\"-\", \":\")\nend\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\n-- [[ Delay Settings ]]--\ns = m:section(TypedSection, \"global_delay\", translate(\"Delay Settings\"))\ns.anonymous = true\ns.addremove = false\n\n---- Open and close Daemon\no = s:option(Flag, \"start_daemon\", translate(\"Open and close Daemon\"))\no.default = 1\no.rmempty = false\n\n---- Delay Start\no = s:option(Value, \"start_delay\", translate(\"Delay Start\"), translate(\"Units:seconds\"))\no.default = \"1\"\no.rmempty = true\n\nfor index, value in ipairs({\"stop\", \"start\", \"restart\"}) do\n\to = s:option(ListValue, value .. \"_week_mode\", translate(value .. \" automatically mode\"))\n\to:value(\"\", translate(\"Disable\"))\n\to:value(8, translate(\"Loop Mode\"))\n\to:value(7, translate(\"Every day\"))\n\to:value(1, translate(\"Every Monday\"))\n\to:value(2, translate(\"Every Tuesday\"))\n\to:value(3, translate(\"Every Wednesday\"))\n\to:value(4, translate(\"Every Thursday\"))\n\to:value(5, translate(\"Every Friday\"))\n\to:value(6, translate(\"Every Saturday\"))\n\to:value(0, translate(\"Every Sunday\"))\n\n\to = s:option(ListValue, value .. \"_time_mode\", translate(value .. \" Time(Every day)\"))\n\tfor t = 0, 23 do o:value(t, t .. \":00\") end\n\to.default = 0\n\to:depends(value .. \"_week_mode\", \"0\")\n\to:depends(value .. \"_week_mode\", \"1\")\n\to:depends(value .. \"_week_mode\", \"2\")\n\to:depends(value .. \"_week_mode\", \"3\")\n\to:depends(value .. \"_week_mode\", \"4\")\n\to:depends(value .. \"_week_mode\", \"5\")\n\to:depends(value .. \"_week_mode\", \"6\")\n\to:depends(value .. \"_week_mode\", \"7\")\n\n\to = s:option(ListValue, value .. \"_interval_mode\", translate(value .. \" Interval(Hour)\"))\n\tfor t = 1, 24 do o:value(t, t .. \" \" .. translate(\"Hour\")) end\n\to.default = 2\n\to:depends(value .. \"_week_mode\", \"8\")\nend\n\n-- [[ Forwarding Settings ]]--\ns = m:section(TypedSection, \"global_forwarding\", translate(\"Forwarding Settings\"))\ns.anonymous = true\ns.addremove = false\n\n---- TCP No Redir Ports\no = s:option(Value, \"tcp_no_redir_ports\", translate(\"TCP No Redir Ports\"))\no.default = \"disable\"\no:value(\"disable\", translate(\"No patterns are used\"))\no:value(\"1:65535\", translate(\"All\"))\no.validate = port_validate\n\n---- UDP No Redir Ports\no = s:option(Value, \"udp_no_redir_ports\", translate(\"UDP No Redir Ports\"),\n\t\"<font color='red'>\" ..\n\ttranslate(\"Fill in the ports you don't want to be forwarded by the agent, with the highest priority.\") ..\n\t\"</font>\")\no.default = \"disable\"\no:value(\"disable\", translate(\"No patterns are used\"))\no:value(\"1:65535\", translate(\"All\"))\no.validate = port_validate\n\n---- TCP Redir Ports\no = s:option(Value, \"tcp_redir_ports\", translate(\"TCP Redir Ports\"))\no.default = \"22,25,53,80,143,443,465,587,853,873,993,995,5222,8080,8443,9418\"\no:value(\"1:65535\", translate(\"All\"))\no:value(\"22,25,53,80,143,443,465,587,853,873,993,995,5222,8080,8443,9418\", translate(\"Common Use\"))\no:value(\"80,443\", translate(\"Only Web\"))\no.validate = port_validate\n\n---- UDP Redir Ports\no = s:option(Value, \"udp_redir_ports\", translate(\"UDP Redir Ports\"))\no.default = \"1:65535\"\no:value(\"1:65535\", translate(\"All\"))\no.validate = port_validate\n\no = s:option(DummyValue, \"tips\", \" \")\no.rawhtml = true\no.cfgvalue = function(t, n)\n\treturn string.format('<font color=\"red\">%s</font>',\n\ttranslate(\"The port settings support single ports and ranges.<br>Separate multiple ports with commas (,).<br>Example: 21,80,443,1000:2000.\"))\nend\n\n---- Use nftables\no = s:option(ListValue, \"prefer_nft\", translate(\"Prefer firewall tools\"))\no.default = \"1\"\no:value(\"0\", \"Iptables\")\no:value(\"1\", \"Nftables\")\n\n---- Check the transparent proxy component\nlocal handle = io.popen(\"lsmod\")\nlocal mods = \"\"\nif handle then\n\tmods = handle:read(\"*a\") or \"\"\n\thandle:close()\nend\n\nif (mods:find(\"REDIRECT\") and mods:find(\"TPROXY\")) or (mods:find(\"nft_redir\") and mods:find(\"nft_tproxy\")) then\n\to = s:option(ListValue, \"tcp_proxy_way\", translate(\"TCP Proxy Way\"))\n\to.default = \"redirect\"\n\to:value(\"redirect\", \"REDIRECT\")\n\to:value(\"tproxy\", \"TPROXY\")\n\to:depends(\"ipv6_tproxy\", false)\n\to.remove = function(self, section)\n\t\t-- Do not delete while hidden\n\tend\n\n\to = s:option(ListValue, \"_tcp_proxy_way\", translate(\"TCP Proxy Way\"))\n\to.default = \"tproxy\"\n\to:value(\"tproxy\", \"TPROXY\")\n\to:depends(\"ipv6_tproxy\", true)\n\to.write = function(self, section, value)\n\t\tself.map:set(section, \"tcp_proxy_way\", value)\n\tend\n\n\tif mods:find(\"ip6table_mangle\") or mods:find(\"nft_tproxy\") then\n\t\t---- IPv6 TProxy\n\t\to = s:option(Flag, \"ipv6_tproxy\", translate(\"IPv6 TProxy\"),\n\t\t\t\"<font color='red'>\" ..\n\t\t\ttranslate(\"Experimental feature. Make sure that your node supports IPv6.\") ..\n\t\t\t\"</font>\")\n\t\to.default = 0\n\t\to.rmempty = false\n\tend\nend\n\no = s:option(Flag, \"accept_icmp\", translate(\"Hijacking ICMP (PING)\"))\no.default = 0\n\no = s:option(Flag, \"accept_icmpv6\", translate(\"Hijacking ICMPv6 (IPv6 PING)\"))\no:depends(\"ipv6_tproxy\", true)\no.default = 0\n\no = s:option(DynamicList, \"force_proxy_lan_ip\", translate(\"Force Proxy LAN IP\"), translate(\"By default, commonly used internal network IP ranges will be connect directly (not entering the core). If you want a certain network range to go through a proxy, please add it here.\"))\no.datatype = \"or(ipmask4,ipmask6)\"\n\nif has_xray then\n\ts_xray = m:section(TypedSection, \"global_xray\", \"Xray \" .. translate(\"Settings\"))\n\ts_xray.anonymous = true\n\ts_xray.addremove = false\n\n\to = s_xray:option(Flag, \"fragment\", translate(\"Fragment\"), translate(\"TCP fragments, which can deceive the censorship system in some cases, such as bypassing SNI blacklists.\"))\n\to.default = 0\n\t\n\to = s_xray:option(ListValue, \"fragment_packets\", translate(\"Fragment Packets\"), translate(\" \\\"1-3\\\" is for segmentation at TCP layer, applying to the beginning 1 to 3 data writes by the client. \\\"tlshello\\\" is for TLS client hello packet fragmentation.\"))\n\to.default = \"tlshello\"\n\to:value(\"tlshello\", \"tlshello\")\n\to:value(\"1-1\", \"1-1\")\n\to:value(\"1-2\", \"1-2\")\n\to:value(\"1-3\", \"1-3\")\n\to:value(\"1-5\", \"1-5\")\n\to:depends(\"fragment\", true)\n\n\to = s_xray:option(Value, \"fragment_length\", translate(\"Fragment Length\"), translate(\"Fragmented packet length (byte)\"))\n\to.datatype = \"or(uinteger,portrange)\"\n\to.default = \"100-200\"\n\to:depends(\"fragment\", true)\n\n\to = s_xray:option(Value, \"fragment_delay\", translate(\"Fragment Delay\"), translate(\"Fragmentation interval (ms)\"))\n\to.datatype = \"or(uinteger,portrange)\"\n\to.default = \"10-20\"\n\to:depends(\"fragment\", true)\n\n\to = s_xray:option(Value, \"fragment_maxSplit\", translate(\"Max Split\"), translate(\"Limit the maximum number of splits.\"))\n\to.datatype = \"or(uinteger,portrange)\"\n\to.default = \"100-200\"\n\to:depends(\"fragment\", true)\n\n\to = s_xray:option(Flag, \"noise\", translate(\"Noise\"), translate(\"UDP noise, Under some circumstances it can bypass some UDP based protocol restrictions.\"))\n\to.default = 0\n\n\to = s_xray:option(Flag, \"sniffing_override_dest\", translate(\"Override the connection destination address\"))\n\to.default = 0\n\to.description = translate(\"Override the connection destination address with the sniffed domain.<br />Otherwise use sniffed domain for routing only.<br />If using shunt nodes, configure the domain shunt rules correctly.\")\n\n\to = s_xray:option(Flag, \"route_only\", translate(\"Sniffing Route Only\"))\n\to.default = 0\n\to:depends(\"sniffing\", true)\n\n\tlocal domains_excluded = string.format(\"/usr/share/%s/domains_excluded\", appname)\n\to = s_xray:option(TextValue, \"excluded_domains\", translate(\"Excluded Domains\"), translate(\"If the traffic sniffing result is in this list, the destination address will not be overridden.\"))\n\to.rows = 15\n\to.wrap = \"off\"\n\to.cfgvalue = function(self, section) return fs.readfile(domains_excluded) or \"\" end\n\to.write = function(self, section, value) fs.writefile(domains_excluded, value:gsub(\"\\r\\n\", \"\\n\")) end\n\to:depends({sniffing_override_dest = true})\n\n\to = s_xray:option(Value, \"buffer_size\", translate(\"Buffer Size\"), translate(\"Buffer size for every connection (kB)\"))\n\to.datatype = \"uinteger\"\n\n\ts_xray_noise = m:section(TypedSection, \"xray_noise_packets\", translate(\"Xray Noise Packets\"),\"<font color='red'>\" .. translate(\"To send noise packets, select \\\"Noise\\\" in Xray Settings.\") .. \"</font>\")\n\ts_xray_noise.template = \"cbi/tblsection\"\n\ts_xray_noise.sortable = true\n\ts_xray_noise.anonymous = true\n\ts_xray_noise.addremove = true\n\n\ts_xray_noise.create = function(e, t)\n\t\tTypedSection.create(e, api.gen_short_uuid())\n\tend\n\n\ts_xray_noise.remove = function(self, section)\n\t\tfor k, v in pairs(self.children) do\n\t\t\tv.rmempty = true\n\t\t\tv.validate = nil\n\t\tend\n\t\tTypedSection.remove(self, section)\n\tend\n\n\to = s_xray_noise:option(Flag, \"enabled\", translate(\"Enable\"))\n\to.default = 1\n\to.rmempty = false\n\n\to = s_xray_noise:option(ListValue, \"type\", translate(\"Type\"))\n\to:value(\"rand\", \"rand\")\n\to:value(\"array\", \"array\")\n\to:value(\"str\", \"str\")\n\to:value(\"hex\", \"hex\")\n\to:value(\"base64\", \"base64\")\n\n\to = s_xray_noise:option(Value, \"packet\", translate(\"Packet | Rand Length\"))\n\to.datatype = \"minlength(1)\"\n\to.rmempty = false\n\n\to = s_xray_noise:option(Value, \"delay\", translate(\"Delay (ms)\"))\n\to.datatype = \"or(uinteger,portrange)\"\n\to.rmempty = false\nend\n\nif has_singbox then\n\ts = m:section(TypedSection, \"global_singbox\", \"Sing-Box \" .. translate(\"Settings\"))\n\ts.anonymous = true\n\ts.addremove = false\n\n\to = s:option(Flag, \"record_fragment\", \"TLS Record \" .. translate(\"Fragment\"),\n\t\ttranslate(\"Split handshake data into multiple TLS records for better censorship evasion. Low overhead. Recommended to enable first.\"))\n\to.default = 0\n\n\to = s:option(Flag, \"fragment\", \"TLS TCP \" .. translate(\"Fragment\"),\n\t\ttranslate(\"Split handshake into multiple TCP segments. Enhances obfuscation. May increase delay. Use only if needed.\"))\n\to.default = 0\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/rule.lua",
    "content": "local api = require \"luci.passwall2.api\"\nlocal appname = api.appname\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\n-- [[ Rule Settings ]]--\ns = m:section(TypedSection, \"global_rules\", translate(\"Rule status\"))\ns.anonymous = true\n\no = s:option(Value, \"geoip_url\", translate(\"GeoIP Update URL\"))\no:value(\"https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip.dat\", translate(\"Loyalsoldier/geoip\"))\no:value(\"https://github.com/MetaCubeX/meta-rules-dat/releases/latest/download/geoip.dat\", translate(\"MetaCubeX/geoip\"))\no:value(\"https://cdn.jsdelivr.net/gh/Loyalsoldier/geoip@release/geoip.dat\", translate(\"Loyalsoldier/geoip (CDN)\"))\no:value(\"https://cdn.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geoip.dat\", translate(\"MetaCubeX/geoip (CDN)\"))\no:value(\"https://github.com/Chocolate4U/Iran-v2ray-rules/releases/latest/download/geoip.dat\", translate(\"Chocolate4U/geoip (IR)\"))\no:value(\"https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/geoip.dat\", translate(\"runetfreedom/geoip (RU)\"))\no.default = o.keylist[1]\n\no = s:option(Value, \"geosite_url\", translate(\"Geosite Update URL\"))\no:value(\"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat\", translate(\"Loyalsoldier/geosite\"))\no:value(\"https://github.com/MetaCubeX/meta-rules-dat/releases/latest/download/geosite.dat\", translate(\"MetaCubeX/geosite\"))\no:value(\"https://cdn.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/geosite.dat\", translate(\"Loyalsoldier/geosite (CDN)\"))\no:value(\"https://cdn.jsdelivr.net/gh/MetaCubeX/meta-rules-dat@release/geosite.dat\", translate(\"MetaCubeX/geosite (CDN)\"))\no:value(\"https://github.com/Chocolate4U/Iran-v2ray-rules/releases/latest/download/geosite.dat\", translate(\"Chocolate4U/geosite (IR)\"))\no:value(\"https://github.com/runetfreedom/russia-v2ray-rules-dat/releases/latest/download/geosite.dat\", translate(\"runetfreedom/geosite (RU)\"))\no.default = o.keylist[1]\n\no = s:option(Value, \"v2ray_location_asset\", translate(\"Location of Geo rule files\"), translate(\"This variable specifies a directory where geoip.dat and geosite.dat files are.\"))\no.default = \"/usr/share/v2ray/\"\no.placeholder = o.default\no.rmempty = false\n\n---- Auto Update\no = s:option(Flag, \"auto_update\", translate(\"Enable auto update rules\"))\no.default = 0\no.rmempty = false\n\n---- Week Update\no = s:option(ListValue, \"week_update\", translate(\"Update Mode\"))\no:value(8, translate(\"Loop Mode\"))\no:value(7, translate(\"Every day\"))\no:value(1, translate(\"Every Monday\"))\no:value(2, translate(\"Every Tuesday\"))\no:value(3, translate(\"Every Wednesday\"))\no:value(4, translate(\"Every Thursday\"))\no:value(5, translate(\"Every Friday\"))\no:value(6, translate(\"Every Saturday\"))\no:value(0, translate(\"Every Sunday\"))\no.default = 7\no:depends(\"auto_update\", true)\no.rmempty = true\n\n---- Time Update\no = s:option(ListValue, \"time_update\", translate(\"Update Time(every day)\"))\nfor t = 0, 23 do o:value(t, t .. \":00\") end\no.default = 0\no:depends(\"week_update\", \"0\")\no:depends(\"week_update\", \"1\")\no:depends(\"week_update\", \"2\")\no:depends(\"week_update\", \"3\")\no:depends(\"week_update\", \"4\")\no:depends(\"week_update\", \"5\")\no:depends(\"week_update\", \"6\")\no:depends(\"week_update\", \"7\")\no.rmempty = true\n\n---- Interval Update\no = s:option(ListValue, \"interval_update\", translate(\"Update Interval(hour)\"))\nfor t = 1, 24 do o:value(t, t .. \" \" .. translate(\"hour\")) end\no.default = 2\no:depends(\"week_update\", \"8\")\no.rmempty = true\n\n--- The update option is always hidden by JavaScript.\nlocal flags = {\n\t\"geoip_update\", \"geosite_update\"\n}\nfor _, f in ipairs(flags) do\n\to = s:option(Flag, f)\n\to.rmempty = false\nend\n\ns:append(Template(appname .. \"/rule/rule_version\"))\n\ns = m:section(TypedSection, \"shunt_rules\", \"Sing-Box/Xray \" .. translate(\"Shunt Rule\"), \"<a style='color: red'>\" .. translate(\"Please note attention to the priority, the higher the order, the higher the priority.\") .. \"</a>\")\ns.template = \"cbi/tblsection\"\ns.anonymous = false\ns.addremove = true\ns.sortable = true\ns.extedit = api.url(\"shunt_rules\", \"%s\")\nfunction s.create(e, t)\n\tTypedSection.create(e, t)\n\tluci.http.redirect(e.extedit:format(t))\nend\nfunction s.remove(e, t)\n\tm.uci:foreach(appname, \"nodes\", function(s)\n\t\tif s[\"protocol\"] and s[\"protocol\"] == \"_shunt\" then\n\t\t\tm:del(s[\".name\"], t)\n\t\tend\n\tend)\n\tTypedSection.remove(e, t)\nend\n\no = s:option(DummyValue, \"remarks\", translate(\"Remarks\"))\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/shunt_rules.lua",
    "content": "local api = require \"luci.passwall2.api\"\nlocal appname = api.appname\nlocal datatypes = api.datatypes\n\nm = Map(appname, \"Sing-Box/Xray \" .. translate(\"Shunt Rule\"))\nm.redirect = api.url(\"rule\")\napi.set_apply_on_parse(m)\n\nif not arg[1] or not m:get(arg[1]) then\n\tluci.http.redirect(m.redirect)\nend\n\nfunction m.on_before_save(self)\n\tm:set(\"@global[0]\", \"flush_set\", \"1\")\nend\n\n-- Add inline CSS to map description\nm.description = (m.description or \"\") .. [[\n<style>\n/* Scope to passwall2 CBI fields so it won't leak elsewhere */\ndiv[id^=\"cbid.passwall2.\"] .cbi-value-field {\n  display: flex;\n  flex-wrap: wrap;\n  gap: 1em;\n}\ndiv[id^=\"cbid.passwall2.\"] .cbi-checkbox {\n  display: inline-flex;\n  align-items: center;\n}\n</style>\n]]\n\nfunction clean_text(text)\n\tlocal nbsp = string.char(0xC2, 0xA0) -- Non-breaking space (U+00A0)\n\tlocal fullwidth_space = string.char(0xE3, 0x80, 0x80) -- Full-width space (U+3000)\n\treturn text\n\t\t:gsub(\"\\t\", \" \")\n\t\t:gsub(nbsp, \" \")\n\t\t:gsub(fullwidth_space, \" \")\n\t\t:gsub(\"^%s+\", \"\")\n\t\t:gsub(\"%s+$\", \"\\n\")\n\t\t:gsub(\"\\r\\n\", \"\\n\")\n\t\t:gsub(\"[ \\t]*\\n[ \\t]*\", \"\\n\")\nend\n\ns = m:section(NamedSection, arg[1], \"shunt_rules\", \"\")\ns.addremove = false\ns.dynamic = false\n\nremarks = s:option(Value, \"remarks\", translate(\"Remarks\"))\nremarks.default = arg[1]\nremarks.rmempty = false\nremarks.validate = function(self, value, section)\n\tvalue = api.trim(value)\n\tif value == \"\" then\n\t\treturn nil, translate(\"Remark cannot be empty.\")\n\tend\n\treturn value\nend\n\nprotocol = s:option(MultiValue, \"protocol\", translate(\"Protocol\"))\nprotocol:value(\"http\")\nprotocol:value(\"tls\")\nprotocol:value(\"quic\")\nprotocol:value(\"bittorrent\")\nprotocol.widget = \"checkbox\"\nprotocol.default = nil\nprotocol.optional = false\n\no = s:option(MultiValue, \"inbound\", translate(\"Inbound Tag\"))\no:value(\"tproxy\", translate(\"Transparent proxy\"))\no:value(\"socks\", \"Socks\")\no.widget = \"checkbox\"\no.default = nil\no.optional = false\n\nnetwork = s:option(ListValue, \"network\", translate(\"Network\"))\nnetwork:value(\"tcp,udp\", \"TCP UDP\")\nnetwork:value(\"tcp\", \"TCP\")\nnetwork:value(\"udp\", \"UDP\")\n\nsource = s:option(DynamicList, \"source\", translate(\"Source\"))\nsource.description = \"<ul><li>\" .. translate(\"Example:\")\n.. \"</li><li>\" .. translate(\"IP\") .. \": 192.168.1.100\"\n.. \"</li><li>\" .. translate(\"IP CIDR\") .. \": 192.168.1.0/24\"\n.. \"</li><li>\" .. translate(\"GeoIP\") .. \": geoip:private\"\n.. \"</li></ul>\"\nsource.cast = \"string\"\nsource.cfgvalue = function(self, section)\n\tlocal value\n\tif self.tag_error[section] then\n\t\tvalue = self:formvalue(section)\n\telse\n\t\tvalue = self.map:get(section, self.option)\n\t\tif type(value) == \"string\" then\n\t\t\tlocal value2 = {}\n\t\t\tstring.gsub(value, '[^' .. \" \" .. ']+', function(w) table.insert(value2, w) end)\n\t\t\tvalue = value2\n\t\tend\n\tend\n\treturn value\nend\nsource.validate = function(self, value, t)\n\tlocal err = {}\n\tfor _, v in ipairs(value) do\n\t\tlocal flag = false\n\t\tif datatypes.ip4addr(v) then\n\t\t\tflag = true\n\t\tend\n\n\t\tif flag == false and v:find(\"geoip:\") and v:find(\"geoip:\") == 1 then\n\t\t\tflag = true\n\t\tend\n\n\t\tif flag == false then\n\t\t\terr[#err + 1] = v\n\t\tend\n\tend\n\n\tif #err > 0 then\n\t\tself:add_error(t, \"invalid\", translate(\"Not true format, please re-enter!\"))\n\t\tfor _, v in ipairs(err) do\n\t\t\tself:add_error(t, \"invalid\", v)\n\t\tend\n\tend\n\n\treturn value\nend\n\nlocal dynamicList_write = function(self, section, value)\n\tlocal t = {}\n\tlocal t2 = {}\n\tif type(value) == \"table\" then\n\t\tlocal x\n\t\tfor _, x in ipairs(value) do\n\t\t\tif x and #x > 0 then\n\t\t\t\tif not t2[x] then\n\t\t\t\t\tt2[x] = x\n\t\t\t\t\tt[#t+1] = x\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\telse\n\t\tt = { value }\n\tend\n\tt = table.concat(t, \" \")\n\treturn DynamicList.write(self, section, t)\nend\n\nsource.write = dynamicList_write\n\n--[[\n-- Too low usage rate, hidden\nsourcePort = s:option(Value, \"sourcePort\", translate(\"Source port\"))\n]]--\n\nport = s:option(Value, \"port\", translate(\"Port\"))\n\ndomain_list = s:option(TextValue, \"domain_list\", translate(\"Domain\"))\ndomain_list.rows = 10\ndomain_list.wrap = \"off\"\ndomain_list.validate = function(self, value)\n\tlocal hosts= {}\n\tvalue = clean_text(value)\n\tstring.gsub(value, \"[^\\r\\n]+\", function(w) table.insert(hosts, w) end)\n\tfor index, host in ipairs(hosts) do\n\t\tlocal flag = 1\n\t\tlocal tmp_host = host\n\t\tif not host:find(\"#\") and host:find(\"%s\") then\n\t\telseif host:find(\"regexp:\") and host:find(\"regexp:\") == 1 then\n\t\t\tflag = 0\n\t\telseif host:find(\"domain:.\") and host:find(\"domain:.\") == 1 then\n\t\t\ttmp_host = host:gsub(\"domain:\", \"\")\n\t\telseif host:find(\"full:.\") and host:find(\"full:.\") == 1 then\n\t\t\ttmp_host = host:gsub(\"full:\", \"\")\n\t\telseif host:find(\"geosite:\") and host:find(\"geosite:\") == 1 then\n\t\t\tflag = 0\n\t\telseif host:find(\"ext:\") and host:find(\"ext:\") == 1 then\n\t\t\tflag = 0\n\t\telseif host:find(\"rule-set:\", 1, true) == 1 or host:find(\"rs:\") == 1 then\n\t\t\tlocal w = host:sub(host:find(\":\") + 1, #host)\n\t\t\tif w:find(\"local:\") == 1 or w:find(\"remote:\") == 1 then\n\t\t\t\tflag = 0\n\t\t\tend\n\t\telseif host:find(\"#\") and host:find(\"#\") == 1 then\n\t\t\tflag = 0\n\t\tend\n\t\tif flag == 1 then\n\t\t\tif not datatypes.hostname(tmp_host) then\n\t\t\t\treturn nil, tmp_host .. \" \" .. translate(\"Not valid domain name, please re-enter!\")\n\t\t\tend\n\t\tend\n\tend\n\treturn value\nend\ndomain_list.description = \"<br /><ul>\"\n.. \"<li>\" .. translate(\"Plaintext: If this string matches any part of the targeting domain, this rule takes effet. Example: rule 'sina.com' matches targeting domain 'sina.com', 'sina.com.cn' and 'www.sina.com', but not 'sina.cn'.\") .. \"</li>\"\n.. \"<li>\" .. translate(\"Regular expression: Begining with 'regexp:', the rest is a regular expression. When the regexp matches targeting domain, this rule takes effect. Example: rule 'regexp:\\\\.goo.*\\\\.com$' matches 'www.google.com' and 'fonts.googleapis.com', but not 'google.com'.\") .. \"</li>\"\n.. \"<li>\" .. translate(\"Subdomain (recommended): Begining with 'domain:' and the rest is a domain. When the targeting domain is exactly the value, or is a subdomain of the value, this rule takes effect. Example: rule 'domain:v2ray.com' matches 'www.v2ray.com', 'v2ray.com', but not 'xv2ray.com'.\") .. \"</li>\"\n.. \"<li>\" .. translate(\"Full domain: Begining with 'full:' and the rest is a domain. When the targeting domain is exactly the value, the rule takes effect. Example: rule 'domain:v2ray.com' matches 'v2ray.com', but not 'www.v2ray.com'.\") .. \"</li>\"\n.. \"<li>\" .. translate(\"Pre-defined domain list: Begining with 'geosite:' and the rest is a name, such as geosite:google or geosite:cn.\") .. \"</li>\"\n.. \"<li>\"\n\t.. translate(\"Sing-Box rule-set: Begining with 'rule-set:remote:' or 'rule-set:local:'\")\n\t.. \"<ul>\"\n\t\t.. \"<li>\" .. translate(\"Such as:\") .. \"'rule-set:remote:https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-cn.srs'\" .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"Such as:\") .. \"'rule-set:local:/usr/share/sing-box/geosite-cn.srs'\" .. \"</li>\"\n\t.. \"</ul>\"\n.. \"</li>\"\n.. \"<li>\" .. translate(\"Annotation: Begining with #\") .. \"</li>\"\n.. \"</ul>\"\nip_list = s:option(TextValue, \"ip_list\", \"IP\")\nip_list.rows = 10\nip_list.wrap = \"off\"\nip_list.validate = function(self, value)\n\tlocal ipmasks= {}\n\tvalue = clean_text(value)\n\tstring.gsub(value, \"[^\\r\\n]+\", function(w) table.insert(ipmasks, w) end)\n\tfor index, ipmask in ipairs(ipmasks) do\n\t\tif ipmask:find(\"geoip:\") and ipmask:find(\"geoip:\") == 1 and not ipmask:find(\"%s\") then\n\t\telseif ipmask:find(\"ext:\") and ipmask:find(\"ext:\") == 1 and not ipmask:find(\"%s\") then\n\t\telseif ipmask:find(\"rule-set:\", 1, true) == 1 or ipmask:find(\"rs:\") == 1 then\n\t\t\tlocal w = ipmask:sub(ipmask:find(\":\") + 1, #ipmask)\n\t\t\tif w:find(\"local:\") == 1 or w:find(\"remote:\") == 1 then\n\t\t\t\tflag = 0\n\t\t\tend\n\t\telseif ipmask:find(\"#\") and ipmask:find(\"#\") == 1 then\n\t\telse\n\t\t\tif not (datatypes.ipmask4(ipmask) or datatypes.ipmask6(ipmask)) then\n\t\t\t\treturn nil, ipmask .. \" \" .. translate(\"Not valid IP format, please re-enter!\")\n\t\t\tend\n\t\tend\n\tend\n\treturn value\nend\nip_list.description = \"<br /><ul>\"\n.. \"<li>\" .. translate(\"IP: such as '127.0.0.1'.\") .. \"</li>\"\n.. \"<li>\" .. translate(\"CIDR: such as '127.0.0.0/8'.\") .. \"</li>\"\n.. \"<li>\" .. translate(\"GeoIP: such as 'geoip:cn'. It begins with geoip: (lower case) and followed by two letter of country code.\") .. \"</li>\"\n.. \"<li>\"\n\t.. translate(\"Sing-Box rule-set: Begining with 'rule-set:remote:' or 'rule-set:local:'\")\n\t.. \"<ul>\"\n\t\t.. \"<li>\" .. translate(\"Such as:\") .. \"'rule-set:remote:https://raw.githubusercontent.com/SagerNet/sing-geoip/rule-set/geoip-cn.srs'\" .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"Such as:\") .. \"'rule-set:local:/usr/share/sing-box/geoip-cn.srs'\" .. \"</li>\"\n\t.. \"</ul>\"\n.. \"</li>\"\n.. \"<li>\" .. translate(\"Annotation: Begining with #\") .. \"</li>\"\n.. \"</ul>\"\n\no = s:option(Flag, \"invert\", \"invert\", translate(\"Invert match result.\") .. \" \" .. translate(\"Only support Sing-Box.\"))\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/socks_config.lua",
    "content": "local api = require \"luci.passwall2.api\"\nlocal appname = api.appname\n\nm = Map(appname)\napi.set_apply_on_parse(m)\n\nif not arg[1] or not m:get(arg[1]) then\n\tluci.http.redirect(api.url())\nend\n\nm:append(Template(appname .. \"/cbi/nodes_dynamiclist_com\"))\nm:append(Template(appname .. \"/cbi/nodes_listvalue_com\"))\n\nlocal has_singbox = api.finded_com(\"sing-box\")\nlocal has_xray = api.finded_com(\"xray\")\n\nlocal nodes_table = {}\nfor k, e in ipairs(api.get_valid_nodes()) do\n\tnodes_table[#nodes_table + 1] = e\nend\n\ns = m:section(NamedSection, arg[1], translate(\"Socks Config\"), translate(\"Socks Config\"))\ns.addremove = false\ns.dynamic = false\n\n---- Enable\no = s:option(Flag, \"enabled\", translate(\"Enable\"))\no.default = 1\no.rmempty = false\n\nlocal auto_switch_tip\nlocal current_node = api.get_cache_var(\"socks_\" .. arg[1])\nif current_node then\n\tlocal n = m:get(current_node)\n\tif n then\n\t\tif tonumber(m:get(arg[1], \"enable_autoswitch\") or 0) == 1 then\n\t\t\tif n then\n\t\t\t\tlocal remarks = api.get_node_remarks(n)\n\t\t\t\tlocal url = api.url(\"node_config\", n[\".name\"])\n\t\t\t\tauto_switch_tip = translatef(\"Current node: %s\", string.format('<a href=\"%s\">%s</a>', url, remarks)) .. \"<br />\"\n\t\t\tend\n\t\tend\n\tend\nend\n\nsocks_node = s:option(ListValue, \"node\", translate(\"Node\"))\nif auto_switch_tip then\n\tsocks_node.description = auto_switch_tip\nend\nsocks_node.template = appname .. \"/cbi/nodes_listvalue\"\nsocks_node.group = {}\n\no = s:option(Flag, \"bind_local\", translate(\"Bind Local\"), translate(\"When selected, it can only be accessed localhost.\"))\no.default = \"0\"\n\nlocal n = 1\nm.uci:foreach(appname, \"socks\", function(s)\n\tif s[\".name\"] == section then\n\t\treturn false\n\tend\n\tn = n + 1\nend)\n\no = s:option(Value, \"port\", \"Socks \" .. translate(\"Listen Port\"))\no.default = n + 1080\no.datatype = \"port\"\no.rmempty = false\n\nif has_singbox or has_xray then\n\to = s:option(Value, \"http_port\", \"HTTP \" .. translate(\"Listen Port\") .. \" \" .. translate(\"0 is not use\"))\n\to.default = 0\n\to.datatype = \"port\"\nend\n\no = s:option(Flag, \"log\", translate(\"Enable\") .. \" \" .. translate(\"Log\"))\no.default = 1\no.rmempty = false\n\no = s:option(Flag, \"enable_autoswitch\", translate(\"Auto Switch\"))\no.default = 0\no.rmempty = false\n\no = s:option(Value, \"autoswitch_testing_time\", translate(\"How often to test\"), translate(\"Units:seconds\"))\no.datatype = \"min(10)\"\no.default = 30\no:depends(\"enable_autoswitch\", true)\n\no = s:option(Value, \"autoswitch_connect_timeout\", translate(\"Timeout seconds\"), translate(\"Units:seconds\"))\no.datatype = \"min(1)\"\no.default = 3\no:depends(\"enable_autoswitch\", true)\n\no = s:option(Value, \"autoswitch_retry_num\", translate(\"Timeout retry num\"))\no.datatype = \"min(1)\"\no.default = 1\no:depends(\"enable_autoswitch\", true)\n\t\no = s:option(DynamicList, \"autoswitch_backup_node\", translate(\"List of backup nodes\"))\no:depends(\"enable_autoswitch\", true)\no.template = appname .. \"/cbi/nodes_dynamiclist\"\no.group = {}\no.write = function(self, section, value)\n\tlocal n = s.fields[\"node\"]:formvalue(section)\n\tlocal v = type(value) == \"table\" and value or { value }\n\tlocal t = {}\n\tfor _, x in ipairs(v) do\n\t\tif x and x ~= n then t[#t+1] = x end\n\tend\n\treturn DynamicList.write(self, section, t)\nend\nfor i, v in pairs(nodes_table) do\n\tif v.protocol ~= \"_shunt\" then\n\t\to:value(v.id, v.remark)\n\t\to.group[#o.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\n\t\ts.fields[\"enable_autoswitch\"]:depends({ node = v.id })\n\tend\n\tsocks_node:value(v.id, v[\"remark\"])\n\tsocks_node.group[#socks_node.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\nend\n\no = s:option(Flag, \"autoswitch_restore_switch\", translate(\"Restore Switch\"), translate(\"When detects main node is available, switch back to the main node.\"))\no:depends(\"enable_autoswitch\", true)\n\no = s:option(Value, \"autoswitch_probe_url\", translate(\"Probe URL\"), translate(\"The URL used to detect the connection status.\"))\no:value(\"https://cp.cloudflare.com/\", \"Cloudflare\")\no:value(\"https://www.gstatic.com/generate_204\", \"Gstatic\")\no:value(\"https://www.google.com/generate_204\", \"Google\")\no:value(\"https://www.youtube.com/generate_204\", \"YouTube\")\no:value(\"https://connect.rom.miui.com/generate_204\", \"MIUI (CN)\")\no:value(\"https://connectivitycheck.platform.hicloud.com/generate_204\", \"HiCloud (CN)\")\no.default = o.keylist[3]\no:depends(\"enable_autoswitch\", true)\n\no = s:option(DummyValue, \"btn\")\no.template = appname .. \"/socks_auto_switch/btn\"\no:depends(\"enable_autoswitch\", true)\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/hysteria2.lua",
    "content": "local m, s = ...\r\n\r\nif not api.finded_com(\"hysteria\") then\r\n\treturn\r\nend\r\n\r\ntype_name = \"Hysteria2\"\r\n\r\n-- [[ Hysteria2 ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"Hysteria2\")\r\n\r\nif s.val[\"type\"] ~= type_name then\r\n\treturn\r\nend\r\n\r\nlocal option_prefix = \"hysteria2_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\no = s:option(Value, _n(\"address\"), translate(\"Address (Support Domain Name)\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\n\r\no = s:option(Value, _n(\"hop\"), translate(\"Port hopping range\"))\r\no.description = translate(\"Format as 1000:2000 or 1000-2000 Multiple groups are separated by commas (,).\")\r\no.rewrite_option = o.option\r\n\r\no = s:option(Value, _n(\"hop_interval\"), translate(\"Hop Interval(second)\"), translate(\"Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5.\"))\r\no.datatype = \"or(uinteger,portrange)\"\r\no.placeholder = \"30\"\r\no.default = \"30\"\r\no.rewrite_option = o.option\r\n\r\no = s:option(Value, _n(\"obfs\"), translate(\"Obfs Password\"))\r\no.rewrite_option = o.option\r\n\r\no = s:option(Value, _n(\"auth_password\"), translate(\"Auth Password\"))\r\no.password = true\r\no.rewrite_option = o.option\r\n\r\no = s:option(Flag, _n(\"fast_open\"), translate(\"Fast Open\"))\r\no.default = \"0\"\r\n\r\no = s:option(Value, _n(\"tls_serverName\"), translate(\"Domain\"))\r\n\r\no = s:option(Flag, _n(\"tls_allowInsecure\"), translate(\"allowInsecure\"), translate(\"Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.\"))\r\no.default = \"0\"\r\n\r\no = s:option(Value, _n(\"tls_pinSHA256\"), translate(\"PinSHA256\"),translate(\"Certificate fingerprint\"))\r\n\r\no = s:option(Value, _n(\"up_mbps\"), translate(\"Max upload Mbps\"))\r\no.rewrite_option = o.option\r\n\r\no = s:option(Value, _n(\"down_mbps\"), translate(\"Max download Mbps\"))\r\no.rewrite_option = o.option\r\n\r\no = s:option(Value, _n(\"recv_window\"), translate(\"QUIC stream receive window\"))\r\no.rewrite_option = o.option\r\n\r\no = s:option(Value, _n(\"recv_window_conn\"), translate(\"QUIC connection receive window\"))\r\no.rewrite_option = o.option\r\n\r\no = s:option(Value, _n(\"idle_timeout\"), translate(\"Idle Timeout\"), translate(\"Example:\") .. \"30s (4s~120s)\")\r\no.rewrite_option = o.option\r\n\r\no = s:option(Value, _n(\"keep_alive_period\"), translate(\"QUIC KeepAlive interval\"), translate(\"Example:\") .. \"10s (2s~60s)\")\r\no.rewrite_option = o.option\r\n\r\no = s:option(Flag, _n(\"disable_mtu_discovery\"), translate(\"Disable MTU detection\"))\r\no.default = \"0\"\r\no.rewrite_option = o.option\r\n\r\no = s:option(Flag, _n(\"lazy_start\"), translate(\"Lazy Start\"))\r\no.default = \"0\"\r\no.rewrite_option = o.option\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/naive.lua",
    "content": "local m, s = ...\r\n\r\nif not api.is_finded(\"naive\") then\r\n\treturn\r\nend\r\n\r\ntype_name = \"Naiveproxy\"\r\n\r\n-- [[ Naive ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"NaiveProxy\")\r\n\r\nif s.val[\"type\"] ~= type_name then\r\n\treturn\r\nend\r\n\r\nlocal option_prefix = \"naive_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\no = s:option(ListValue, _n(\"protocol\"), translate(\"Protocol\"))\r\no:value(\"https\", translate(\"HTTPS\"))\r\no:value(\"quic\", translate(\"QUIC\"))\r\n\r\no = s:option(Value, _n(\"address\"), translate(\"Address (Support Domain Name)\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\n\r\no = s:option(Value, _n(\"username\"), translate(\"Username\"))\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ray.lua",
    "content": "local m, s = ...\r\n\r\nif not api.finded_com(\"xray\") then\r\n\treturn\r\nend\r\n\r\nlocal jsonc = api.jsonc\r\n\r\ntype_name = \"Xray\"\r\n\r\n-- [[ Xray ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"Xray\")\r\nif not s.fields[\"type\"].default then\r\n\ts.fields[\"type\"].default = type_name\r\nend\r\n\r\nif s.val[\"type\"] ~= type_name then\r\n\treturn\r\nend\r\n\r\nlocal option_prefix = \"xray_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal formvalue_proto = luci.http.formvalue(formvalue_key .. _n(\"protocol\"))\r\n\r\nif formvalue_proto then s.val[\"protocol\"] = formvalue_proto end\r\n\r\nlocal arg_select_proto = luci.http.formvalue(\"select_proto\") or \"\"\r\n\r\nlocal ss_method_list = {\r\n\t\"none\", \"plain\", \"aes-128-gcm\", \"aes-256-gcm\", \"chacha20-poly1305\", \"chacha20-ietf-poly1305\", \"xchacha20-poly1305\", \"xchacha20-ietf-poly1305\", \"2022-blake3-aes-128-gcm\", \"2022-blake3-aes-256-gcm\", \"2022-blake3-chacha20-poly1305\"\r\n}\r\n\r\nlocal security_list = { \"none\", \"auto\", \"aes-128-gcm\", \"chacha20-poly1305\", \"zero\" }\r\n\r\nlocal header_type_list = {\r\n\t\"none\", \"srtp\", \"utp\", \"wechat-video\", \"dtls\", \"wireguard\", \"dns\"\r\n}\r\n\r\nlocal xray_version = api.get_app_version(\"xray\")\r\n\r\no = s:option(ListValue, _n(\"protocol\"), translate(\"Protocol\"))\r\no:value(\"vmess\", translate(\"Vmess\"))\r\no:value(\"vless\", translate(\"VLESS\"))\r\no:value(\"http\", translate(\"HTTP\"))\r\no:value(\"socks\", translate(\"Socks\"))\r\no:value(\"shadowsocks\", translate(\"Shadowsocks\"))\r\no:value(\"trojan\", translate(\"Trojan\"))\r\no:value(\"wireguard\", translate(\"WireGuard\"))\r\nif api.compare_versions(xray_version, \">=\", \"26.1.13\") then\r\n\to:value(\"hysteria2\", translate(\"Hysteria2\"))\r\nend\r\nif api.compare_versions(xray_version, \">=\", \"1.8.12\") then\r\n\to:value(\"_balancing\", translate(\"Balancing\"))\r\nend\r\no:value(\"_shunt\", translate(\"Shunt\"))\r\no:value(\"_iface\", translate(\"Custom Interface\"))\r\nfunction o.custom_cfgvalue(self, section)\r\n\tif arg_select_proto ~= \"\" then\r\n\t\treturn arg_select_proto\r\n\telse\r\n\t\treturn m:get(section, self.option:sub(1 + #option_prefix))\r\n\tend\r\nend\r\n\r\nlocal load_balancing_options = s.val[\"protocol\"] == \"_balancing\" or arg_select_proto == \"_balancing\"\r\nlocal load_shunt_options = s.val[\"protocol\"] == \"_shunt\" or arg_select_proto == \"_shunt\"\r\nlocal load_iface_options = s.val[\"protocol\"] == \"_iface\" or arg_select_proto == \"_iface\"\r\nlocal load_normal_options = true\r\nif load_balancing_options or load_shunt_options or load_iface_options then\r\n\tload_normal_options = nil\r\nend\r\nif not arg_select_proto:find(\"_\") then\r\n\tload_normal_options = true\r\nend\r\n\r\nlocal node_list = api.get_node_list()\r\nlocal fallback_list = {}\r\nlocal is_balancer = nil\r\nfor k, e in ipairs(node_list.balancing_list or {}) do\r\n\tif e.id ~= arg[1] then\r\n\t\tfallback_list[#fallback_list + 1] = {\r\n\t\t\tid = e[\"id\"],\r\n\t\t\tremark = e[\"remark\"],\r\n\t\t\tgroup = e[\"group\"],\r\n\t\t\tfallback = e.o[\"fallback_node\"],\r\n\t\t}\r\n\telse\r\n\t\tis_balancer = true\r\n\tend\r\nend\r\n\r\nif load_balancing_options then -- [[ Load balancing Start ]]\r\n\to = s:option(ListValue, _n(\"node_add_mode\"), translate(\"Node Addition Method\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_balancing\" })\r\n\to.default = \"manual\"\r\n\to:value(\"manual\", translate(\"Manual\"))\r\n\to:value(\"batch\", translate(\"Batch\"))\r\n\r\n\to = s:option(MultiValue, _n(\"balancing_node\"), translate(\"Load balancing node list\"), translate(\"Load balancing node list, <a target='_blank' href='https://xtls.github.io/config/routing.html#balancerobject'>document</a>\"))\r\n\to:depends({ [_n(\"node_add_mode\")] = \"manual\" })\r\n\to.widget = \"checkbox\"\r\n\to.template = appname .. \"/cbi/nodes_multivalue\"\r\n\to.group = {}\r\n\tfor k1, v1 in pairs(node_list) do\r\n\t\tif k1 == \"socks_list\" or k1 == \"normal_list\" then\r\n\t\t\tfor i, v in ipairs(v1) do\r\n\t\t\t\to:value(v.id, v.remark)\r\n\t\t\t\to.group[#o.group+1] = v.group or \"\"\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\n\t-- Reading the old DynamicList\r\n\tfunction o.cfgvalue(self, section)\r\n\t\treturn m.uci:get_list(appname, section, \"balancing_node\") or {}\r\n\tend\r\n\t-- Write-and-hold DynamicList\r\n\tfunction o.custom_write(self, section, value)\r\n\t\tlocal old = m.uci:get_list(appname, section, \"balancing_node\") or {}\r\n\t\tlocal new, set = {}, {}\r\n\t\tfor v in value:gmatch(\"%S+\") do\r\n\t\t\tnew[#new + 1] = v\r\n\t\t\tset[v] = 1\r\n\t\tend\r\n\t\tfor _, v in ipairs(old) do\r\n\t\t\tif not set[v] then\r\n\t\t\t\tm.uci:set_list(appname, section, \"balancing_node\", new)\r\n\t\t\t\treturn\r\n\t\t\tend\r\n\t\t\tset[v] = nil\r\n\t\tend\r\n\t\tfor _ in pairs(set) do\r\n\t\t\tm.uci:set_list(appname, section, \"balancing_node\", new)\r\n\t\t\treturn\r\n\t\tend\r\n\tend\r\n\r\n\to = s:option(MultiValue, _n(\"node_group\"), translate(\"Select Group\"))\r\n\to:depends({ [_n(\"node_add_mode\")] = \"batch\" })\r\n\to.widget = \"checkbox\"\r\n\to:value(\"default\", translate(\"default\"))\r\n\tfor k, v in pairs(groups) do\r\n\t\to:value(api.UrlEncode(k), k)\r\n\tend\r\n\r\n\to = s:option(Value, _n(\"node_match_rule\"), translate(\"Node Matching Rules\"))\r\n\to:depends({ [_n(\"node_add_mode\")] = \"batch\" })\r\n\tlocal descrStr = \"Example: <code>^A && B && !C && D$</code><br>\"\r\n\tdescrStr = descrStr .. \"This means the node remark must start with A (^), include B, exclude C (!), and end with D ($).<br>\"\r\n\tdescrStr = descrStr .. \"Conditions are joined by <code>&&</code>, and their order does not affect the result.\"\r\n\to.description = translate(descrStr)\r\n\r\n\to = s:option(ListValue, _n(\"balancingStrategy\"), translate(\"Balancing Strategy\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_balancing\" })\r\n\to:value(\"random\")\r\n\to:value(\"roundRobin\")\r\n\to:value(\"leastPing\")\r\n\to:value(\"leastLoad\")\r\n\to.default = \"random\"\r\n\r\n\t-- Fallback Node\r\n\to = s:option(ListValue, _n(\"fallback_node\"), translate(\"Fallback Node\"))\r\n\to:value(\"\", translate(\"Close(Not use)\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_balancing\" })\r\n\to.template = appname .. \"/cbi/nodes_listvalue\"\r\n\to.group = {\"\"}\r\n\tlocal function check_fallback_chain(fb)\r\n\t\tfor k, v in pairs(fallback_list) do\r\n\t\t\tif v.fallback == fb then\r\n\t\t\t\tfallback_list[k] = nil\r\n\t\t\t\tcheck_fallback_chain(v.id)\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\n\t-- Check the fallback chain and remove the balancer node that would form a closed loop.\r\n\tif is_balancer then\r\n\t\tcheck_fallback_chain(arg[1])\r\n\tend\r\n\tfor i, v in ipairs(fallback_list) do\r\n\t\to:value(v.id, v.remark)\r\n\t\to.group[#o.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\r\n\tend\r\n\tfor k1, v1 in pairs(node_list) do\r\n\t\tif k1 == \"socks_list\" or k1 == \"normal_list\" then\r\n\t\t\tfor i, v in ipairs(v1) do\r\n\t\t\t\to:value(v.id, v.remark)\r\n\t\t\t\to.group[#o.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\n\r\n\to = s:option(Flag, _n(\"useCustomProbeUrl\"), translate(\"Use Custom Probe URL\"), translate(\"By default the built-in probe URL will be used, enable this option to use a custom probe URL.\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_balancing\" })\r\n\r\n\to = s:option(Value, _n(\"probeUrl\"), translate(\"Probe URL\"))\r\n\to:depends({ [_n(\"useCustomProbeUrl\")] = true })\r\n\to:value(\"https://cp.cloudflare.com/\", \"Cloudflare\")\r\n\to:value(\"https://www.gstatic.com/generate_204\", \"Gstatic\")\r\n\to:value(\"https://www.google.com/generate_204\", \"Google\")\r\n\to:value(\"https://www.youtube.com/generate_204\", \"YouTube\")\r\n\to:value(\"https://connect.rom.miui.com/generate_204\", \"MIUI (CN)\")\r\n\to:value(\"https://connectivitycheck.platform.hicloud.com/generate_204\", \"HiCloud (CN)\")\r\n\to.default = \"https://www.google.com/generate_204\"\r\n\to.description = translate(\"The URL used to detect the connection status.\")\r\n\r\n\to = s:option(Value, _n(\"probeInterval\"), translate(\"Probe Interval\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_balancing\" })\r\n\to.default = \"1m\"\r\n\to.placeholder = \"1m\"\r\n\to.description = translate(\"The interval between initiating probes.\") .. \"<br>\" ..\r\n\t\t\ttranslate(\"The time format is numbers + units, such as '10s', '2h45m', and the supported time units are <code>s</code>, <code>m</code>, <code>h</code>, which correspond to seconds, minutes, and hours, respectively.\") .. \"<br>\" ..\r\n\t\t\ttranslate(\"When the unit is not filled in, it defaults to seconds.\")\r\n\r\n\to = s:option(Value, _n(\"expected\"), translate(\"Preferred Node Count\"))\r\n\to:depends({ [_n(\"balancingStrategy\")] = \"leastLoad\" })\r\n\to.datatype = \"uinteger\"\r\n\to.default = \"2\"\r\n\to.placeholder = \"2\"\r\n\to.description = translate(\"The load balancer selects the optimal number of nodes, and traffic is randomly distributed among them.\")\r\nend -- [[ Load balancing End ]]\r\n\r\nif load_iface_options then -- [[ Custom Interface Start ]]\r\n\to = s:option(Value, _n(\"iface\"), translate(\"Interface\"))\r\n\to.default = \"eth1\"\r\n\to:depends({ [_n(\"protocol\")] = \"_iface\" })\r\nend -- [[ Custom Interface End ]]\r\n\r\n\r\n-- [[ Normal single node Start ]]\r\nif load_normal_options then\r\n\r\no = s:option(Value, _n(\"address\"), translate(\"Address (Support Domain Name)\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\n\r\no = s:option(Value, _n(\"uuid\"), translate(\"ID\"))\r\no.password = true\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\n\r\no = s:option(Value, _n(\"username\"), translate(\"Username\"))\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\no = s:option(ListValue, _n(\"security\"), translate(\"Encrypt Method\"))\r\nfor a, t in ipairs(security_list) do o:value(t) end\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\n\r\no = s:option(Value, _n(\"encryption\"), translate(\"Encrypt Method\") .. \" (encryption)\")\r\no.default = \"none\"\r\no.placeholder = \"none\"\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no.validate = function(self, value)\r\n\tvalue = api.trim(value)\r\n\treturn (value == \"\" and \"none\" or value)\r\nend\r\n\r\no = s:option(ListValue, _n(\"ss_method\"), translate(\"Encrypt Method\"))\r\no.rewrite_option = \"method\"\r\nfor a, t in ipairs(ss_method_list) do o:value(t) end\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(Flag, _n(\"iv_check\"), translate(\"IV Check\"))\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\", [_n(\"ss_method\")] = \"aes-128-gcm\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\", [_n(\"ss_method\")] = \"aes-256-gcm\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\", [_n(\"ss_method\")] = \"chacha20-poly1305\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\", [_n(\"ss_method\")] = \"xchacha20-poly1305\" })\r\n\r\no = s:option(Flag, _n(\"uot\"), translate(\"UDP over TCP\"))\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(ListValue, _n(\"flow\"), translate(\"flow\"))\r\no.default = \"\"\r\no:value(\"\", translate(\"Disable\"))\r\no:value(\"xtls-rprx-vision\")\r\no:value(\"xtls-rprx-vision-udp443\")\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\n\r\n---- [[hysteria2]]\r\no = s:option(Value, _n(\"hysteria2_hop\"), translate(\"Port hopping range\"))\r\no.description = translate(\"Format as 1000:2000 or 1000-2000 Multiple groups are separated by commas (,).\")\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(Value, _n(\"hysteria2_hop_interval\"), translate(\"Hop Interval(second)\"), translate(\"Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5.\"))\r\no.datatype = \"or(uinteger,portrange)\"\r\no.placeholder = \"30\"\r\no.default = \"30\"\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(Value, _n(\"hysteria2_up_mbps\"), translate(\"Max upload Mbps\"))\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(Value, _n(\"hysteria2_down_mbps\"), translate(\"Max download Mbps\"))\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(ListValue, _n(\"hysteria2_obfs_type\"), translate(\"Obfs Type\"))\r\no:value(\"\", translate(\"Disable\"))\r\no:value(\"salamander\")\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(Value, _n(\"hysteria2_obfs_password\"), translate(\"Obfs Password\"))\r\no:depends({ [_n(\"hysteria2_obfs_type\")] = \"salamander\" })\r\n\r\no = s:option(Value, _n(\"hysteria2_auth_password\"), translate(\"Auth Password\"))\r\no.password = true\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\n\r\no = s:option(Value, _n(\"hysteria2_idle_timeout\"), translate(\"Idle Timeout\"), translate(\"Example:\") .. \"30s (4s~120s)\")\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\n\r\no = s:option(Value, _n(\"hysteria2_keep_alive_period\"), translate(\"QUIC KeepAlive interval\"), translate(\"Example:\") .. \"10s (2s~60s)\")\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\n\r\no = s:option(Flag, _n(\"hysteria2_disable_mtu_discovery\"), translate(\"Disable MTU detection\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\n---- [[hysteria2 end]]\r\n\r\no = s:option(Flag, _n(\"tls\"), translate(\"TLS\"))\r\no.default = 0\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(Flag, _n(\"reality\"), translate(\"REALITY\"))\r\no.default = 0\r\no:depends({ [_n(\"tls\")] = true, [_n(\"transport\")] = \"raw\" })\r\no:depends({ [_n(\"tls\")] = true, [_n(\"transport\")] = \"ws\" })\r\no:depends({ [_n(\"tls\")] = true, [_n(\"transport\")] = \"grpc\" })\r\no:depends({ [_n(\"tls\")] = true, [_n(\"transport\")] = \"httpupgrade\" })\r\no:depends({ [_n(\"tls\")] = true, [_n(\"transport\")] = \"xhttp\" })\r\n\r\no = s:option(ListValue, _n(\"alpn\"), translate(\"alpn\"))\r\no.default = \"default\"\r\no:value(\"default\", translate(\"Default\"))\r\no:value(\"h3\")\r\no:value(\"h2\")\r\no:value(\"h3,h2\")\r\no:value(\"http/1.1\")\r\no:value(\"h2,http/1.1\")\r\no:value(\"h3,h2,http/1.1\")\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\n-- o = s:option(Value, _n(\"minversion\"), translate(\"minversion\"))\r\n-- o.default = \"1.3\"\r\n-- o:value(\"1.3\")\r\n-- o:depends({ [_n(\"tls\")] = true })\r\n\r\no = s:option(Value, _n(\"tls_serverName\"), \"SNI \" .. translate(\"Domain\"))\r\no:depends({ [_n(\"tls\")] = true })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\nif api.compare_versions(os.date(\"%Y.%m.%d\"), \"<\", \"2026.6.1\") then\r\n\to = s:option(Flag, _n(\"tls_allowInsecure\"), translate(\"allowInsecure\"), translate(\"Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.\"))\r\n\to.default = \"0\"\r\n\to:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\nend\r\n\r\nif api.compare_versions(xray_version, \">=\", \"26.1.31\") then\r\n\to = s:option(Value, _n(\"tls_pinSHA256\"), translate(\"TLS Chain Fingerprint (SHA256)\"))\r\n\to:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\n\to = s:option(Value, _n(\"tls_CertByName\"), translate(\"TLS Certificate Name (CertName)\"), translate(\"TLS is used to verify the leaf certificate name.\"))\r\n\to:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\nend\r\n\r\no = s:option(Flag, _n(\"ech\"), translate(\"ECH\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(TextValue, _n(\"ech_config\"), translate(\"ECH Config\"))\r\no.default = \"\"\r\no.rows = 5\r\no.wrap = \"soft\"\r\no:depends({ [_n(\"ech\")] = true })\r\no.validate = function(self, value)\r\n\treturn api.trim(value:gsub(\"[\\r\\n]\", \"\"))\r\nend\r\n\r\n-- [[ REALITY ]] --\r\no = s:option(Value, _n(\"reality_publicKey\"), translate(\"Public Key\"))\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = true })\r\n\r\no = s:option(Value, _n(\"reality_shortId\"), translate(\"Short Id\"))\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = true })\r\n\r\no = s:option(Value, _n(\"reality_spiderX\"), translate(\"Spider X\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = true })\r\n\r\no = s:option(Flag, _n(\"utls\"), translate(\"uTLS\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\n\r\no = s:option(ListValue, _n(\"fingerprint\"), translate(\"Finger Print\"))\r\no:value(\"chrome\")\r\no:value(\"firefox\")\r\no:value(\"edge\")\r\no:value(\"safari\")\r\no:value(\"360\")\r\no:value(\"qq\")\r\no:value(\"ios\")\r\no:value(\"android\")\r\no:value(\"random\")\r\no:value(\"randomized\")\r\no.default = \"chrome\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"utls\")] = true })\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = true })\r\n\r\no = s:option(Flag, _n(\"use_mldsa65Verify\"), translate(\"ML-DSA-65\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = true })\r\n\r\no = s:option(TextValue, _n(\"reality_mldsa65Verify\"), \"ML-DSA-65 \" .. translate(\"Public key\"))\r\no.default = \"\"\r\no.rows = 5\r\no.wrap = \"soft\"\r\no:depends({ [_n(\"use_mldsa65Verify\")] = true })\r\no.validate = function(self, value)\r\n\treturn api.trim(value:gsub(\"[\\r\\n]\", \"\"))\r\nend\r\n\r\no = s:option(ListValue, _n(\"transport\"), translate(\"Transport\"))\r\no:value(\"raw\", \"RAW (TCP)\")\r\no:value(\"mkcp\", \"mKCP\")\r\no:value(\"ws\", \"WebSocket\")\r\no:value(\"grpc\", \"gRPC\")\r\no:value(\"httpupgrade\", \"HttpUpgrade\")\r\no:value(\"xhttp\", \"XHTTP\")\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\no = s:option(Value, _n(\"wireguard_public_key\"), translate(\"Public Key\"))\r\no:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\no = s:option(Value, _n(\"wireguard_secret_key\"), translate(\"Private Key\"))\r\no:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\no = s:option(Value, _n(\"wireguard_preSharedKey\"), translate(\"Pre shared key\"))\r\no:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\no = s:option(DynamicList, _n(\"wireguard_local_address\"), translate(\"Local Address\"))\r\no:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\no = s:option(Value, _n(\"wireguard_mtu\"), translate(\"MTU\"))\r\no.default = \"1420\"\r\no:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\nif api.compare_versions(xray_version, \">=\", \"1.8.0\") then\r\n\to = s:option(Value, _n(\"wireguard_reserved\"), translate(\"Reserved\"), translate(\"Decimal numbers separated by \\\",\\\" or Base64-encoded strings.\"))\r\n\to:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\nend\r\n\r\no = s:option(Value, _n(\"wireguard_keepAlive\"), translate(\"Keep Alive\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\n-- [[ RAW ]]--\r\no = s:option(ListValue, _n(\"tcp_guise\"), translate(\"Camouflage Type\"))\r\no:value(\"none\", \"none\")\r\no:value(\"http\", \"http\")\r\no:depends({ [_n(\"transport\")] = \"raw\" })\r\n\r\no = s:option(DynamicList, _n(\"tcp_guise_http_host\"), translate(\"HTTP Host\"))\r\no:depends({ [_n(\"tcp_guise\")] = \"http\" })\r\n\r\no = s:option(DynamicList, _n(\"tcp_guise_http_path\"), translate(\"HTTP Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"tcp_guise\")] = \"http\" })\r\n\r\n-- [[ mKCP ]]--\r\no = s:option(ListValue, _n(\"mkcp_guise\"), translate(\"Camouflage Type\"), translate('<br />none: default, no masquerade, data sent is packets with no characteristics.<br />srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime).<br />utp: packets disguised as uTP will be recognized as bittorrent downloaded data.<br />wechat-video: packets disguised as WeChat video calls.<br />dtls: disguised as DTLS 1.2 packet.<br />wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)<br />dns: Disguising traffic as DNS requests.'))\r\nfor a, t in ipairs(header_type_list) do o:value(t) end\r\no:depends({ [_n(\"transport\")] = \"mkcp\" })\r\n\r\no = s:option(Value, _n(\"mkcp_domain\"), translate(\"Camouflage Domain\"), translate(\"Use it together with the DNS disguised type. You can fill in any domain.\"))\r\no:depends({ [_n(\"mkcp_guise\")] = \"dns\" })\r\n\r\no = s:option(Value, _n(\"mkcp_mtu\"), translate(\"KCP MTU\"))\r\no.datatype = \"uinteger\"\r\no.default = 1350\r\no:depends({ [_n(\"transport\")] = \"mkcp\" })\r\n\r\no = s:option(Value, _n(\"mkcp_seed\"), translate(\"KCP Seed\"))\r\no:depends({ [_n(\"transport\")] = \"mkcp\" })\r\n\r\n-- [[ WebSocket  ]]--\r\no = s:option(Value, _n(\"ws_host\"), translate(\"WebSocket Host\"))\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\no = s:option(Value, _n(\"ws_path\"), translate(\"WebSocket Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\no = s:option(Value, _n(\"ws_heartbeatPeriod\"), translate(\"HeartbeatPeriod(second)\"))\r\no.datatype = \"integer\"\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\n-- [[ gRPC  ]]--\r\no = s:option(Value, _n(\"grpc_serviceName\"), \"ServiceName\")\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\no = s:option(ListValue, _n(\"grpc_mode\"), \"gRPC \" .. translate(\"Transfer mode\"))\r\no:value(\"gun\")\r\no:value(\"multi\")\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\no = s:option(Flag, _n(\"grpc_health_check\"), translate(\"Health check\"))\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\no = s:option(Value, _n(\"grpc_idle_timeout\"), translate(\"Idle timeout\"))\r\no.default = \"10\"\r\no:depends({ [_n(\"grpc_health_check\")] = true })\r\n\r\no = s:option(Value, _n(\"grpc_health_check_timeout\"), translate(\"Health check timeout\"))\r\no.default = \"20\"\r\no:depends({ [_n(\"grpc_health_check\")] = true })\r\n\r\no = s:option(Flag, _n(\"grpc_permit_without_stream\"), translate(\"Permit without stream\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"grpc_health_check\")] = true })\r\n\r\no = s:option(Value, _n(\"grpc_initial_windows_size\"), translate(\"Initial Windows Size\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\n-- [[ HttpUpgrade ]]--\r\no = s:option(Value, _n(\"httpupgrade_host\"), translate(\"HttpUpgrade Host\"))\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\n\r\no = s:option(Value, _n(\"httpupgrade_path\"), translate(\"HttpUpgrade Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\n\r\n-- [[ XHTTP ]]--\r\no = s:option(ListValue, _n(\"xhttp_mode\"), \"XHTTP \" .. translate(\"Mode\"))\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\no.default = \"auto\"\r\no:value(\"auto\")\r\no:value(\"packet-up\")\r\no:value(\"stream-up\")\r\no:value(\"stream-one\")\r\n\r\no = s:option(Value, _n(\"xhttp_host\"), translate(\"XHTTP Host\"))\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\n\r\no = s:option(Value, _n(\"xhttp_path\"), translate(\"XHTTP Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\n\r\no = s:option(Flag, _n(\"use_xhttp_extra\"), translate(\"XHTTP Extra\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\n\r\no = s:option(TextValue, _n(\"xhttp_extra\"), \"　\", translate(\"An XHttpObject in JSON format, used for sharing.\"))\r\no:depends({ [_n(\"use_xhttp_extra\")] = true })\r\no.rows = 10\r\no.wrap = \"off\"\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal raw = m:get(section, \"xhttp_extra\")\r\n\tif raw then\r\n\t\treturn api.base64Decode(raw)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"xhttp_extra\", api.base64Encode(value) or \"\")\r\n\tlocal success, data = pcall(jsonc.parse, value)\r\n\tif success and data then\r\n\t\tlocal address = (data.extra and data.extra.downloadSettings and data.extra.downloadSettings.address)\r\n\t\t\tor (data.downloadSettings and data.downloadSettings.address)\r\n\t\tif address and address ~= \"\" then\r\n\t\t\taddress = address:gsub(\"^%[\", \"\"):gsub(\"%]$\", \"\")\r\n\t\t\tm:set(section, \"download_address\", address)\r\n\t\telse\r\n\t\t\tm:del(section, \"download_address\")\r\n\t\tend\r\n\telse\r\n\t\tm:del(section, \"download_address\")\r\n\tend\r\nend\r\no.validate = function(self, value)\r\n\tvalue = api.trim(value):gsub(\"\\r\\n\", \"\\n\"):gsub(\"^[ \\t]*\\n\", \"\"):gsub(\"\\n[ \\t]*$\", \"\"):gsub(\"\\n[ \\t]*\\n\", \"\\n\")\r\n\tif api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, \"XHTTP Extra \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\no.custom_remove = function(self, section, value)\r\n\tm:del(section, \"xhttp_extra\")\r\n\tm:del(section, \"download_address\")\r\nend\r\n\r\n-- [[ User-Agent ]]--\r\no = s:option(Value, _n(\"user_agent\"), translate(\"User-Agent\"))\r\no.default = \"\"\r\no:value(\"\", translate(\"default\"))\r\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36\", \"chrome\")\r\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0\", \"firefox\")\r\no:value(\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15\", \"safari\")\r\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.70\", \"edge\")\r\no:value(\"Go-http-client/1.1\", \"golang\")\r\no:value(\"curl/7.68.0\", \"curl\")\r\no:depends({ [_n(\"tcp_guise\")] = \"http\" })\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\n-- [[ Mux.Cool ]]--\r\no = s:option(Flag, _n(\"mux\"), \"Mux\", translate(\"Enable Mux.Cool\"))\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"transport\")] = \"raw\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"transport\")] = \"ws\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"transport\")] = \"grpc\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"transport\")] = \"httpupgrade\" })\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\no = s:option(Value, _n(\"mux_concurrency\"), translate(\"Mux concurrency\"))\r\no.default = -1\r\no:depends({ [_n(\"mux\")] = true })\r\n\r\no = s:option(Value, _n(\"xudp_concurrency\"), translate(\"XUDP Mux concurrency\"))\r\no.default = 8\r\no:depends({ [_n(\"mux\")] = true })\r\n\r\n--[[FinalMask]]\r\no = s:option(Flag, _n(\"use_finalmask\"), \"FinalMask\")\r\no.default = \"0\"\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(TextValue, _n(\"finalmask\"), \"　\")\r\no:depends({ [_n(\"use_finalmask\")] = true })\r\no.rows = 10\r\no.wrap = \"off\"\r\no.description = translate(\"An FinalMaskObject in JSON format, used for sharing.\") .. \"<br>\" ..\r\n\t\ttranslate(\"Custom finalmask overrides mkcp, hysteria2, fragment, noise, and related settings.\")\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal raw = m:get(section, \"finalmask\")\r\n\tif raw then\r\n\t\treturn api.base64Decode(raw)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"finalmask\", api.base64Encode(value) or \"\")\r\nend\r\no.validate = function(self, value)\r\n\tvalue = api.trim(value):gsub(\"\\r\\n\", \"\\n\"):gsub(\"^[ \\t]*\\n\", \"\"):gsub(\"\\n[ \\t]*$\", \"\"):gsub(\"\\n[ \\t]*\\n\", \"\\n\")\r\n\tif api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, \"FinalMask \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\n\r\n--[[Fast Open]]\r\no = s:option(Flag, _n(\"tcp_fast_open\"), \"TCP \" .. translate(\"Fast Open\"), translate(\"Need node support required\"))\r\no.default = 0\r\n\r\n--[[tcpMptcp]]\r\no = s:option(Flag, _n(\"tcpMptcp\"), \"tcpMptcp\", translate(\"Enable Multipath TCP, need to be enabled in both server and client configuration.\"))\r\no.default = 0\r\n\r\no = s:option(Value, _n(\"preconns\"), translate(\"Pre-connections\"), translate(\"Number of early established connections to reduce latency.\"))\r\no.datatype = \"uinteger\"\r\no.placeholder = 0\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\n\r\no = s:option(ListValue, _n(\"domain_resolver\"), translate(\"Domain DNS Resolve\"), translate(\"If the node address is a domain name, this DNS will be used for resolution.\"))\r\no:value(\"\", translate(\"Auto\"))\r\no:value(\"tcp\", \"TCP\")\r\no:value(\"udp\", \"UDP\")\r\no:value(\"https\", \"HTTPS\")\r\n\r\no = s:option(Value, _n(\"domain_resolver_dns\"), \"DNS\")\r\no.datatype = \"or(ipaddr,ipaddrport)\"\r\no:value(\"114.114.114.114\")\r\no:value(\"223.5.5.5:53\")\r\no.default = o.keylist[1]\r\no:depends({ [_n(\"domain_resolver\")] = \"tcp\" })\r\no:depends({ [_n(\"domain_resolver\")] = \"udp\" })\r\n\r\no = s:option(Value, _n(\"domain_resolver_dns_https\"), \"DNS\")\r\no:value(\"https://120.53.53.53/dns-query\", \"DNSPod\")\r\no:value(\"https://223.5.5.5/dns-query\", \"AliDNS\")\r\no.default = o.keylist[1]\r\no:depends({ [_n(\"domain_resolver\")] = \"https\" })\r\n\r\no = s:option(ListValue, _n(\"domain_strategy\"), translate(\"Domain Strategy\"), translate(\"If is domain name, The requested domain name will be resolved to IP before connect.\"))\r\no.default = \"\"\r\no:value(\"\", translate(\"Auto\"))\r\no:value(\"UseIPv4\", translate(\"IPv4 Only\"))\r\no:value(\"UseIPv6\", translate(\"IPv6 Only\"))\r\n\r\nlocal protocols = s.fields[_n(\"protocol\")].keylist\r\nif #protocols > 0 then\r\n\tfor i, v in ipairs(protocols) do\r\n\t\tif not v:find(\"^_\") then\r\n\t\t\ts.fields[_n(\"address\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\t\ts.fields[_n(\"port\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\t\ts.fields[_n(\"domain_resolver\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\t\ts.fields[_n(\"domain_strategy\")]:depends({ [_n(\"protocol\")] = v })\r\n\r\n\t\t\tif v ~= \"hysteria2\" then\r\n\t\t\t\ts.fields[_n(\"tcp_fast_open\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\t\t\ts.fields[_n(\"tcpMptcp\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\nend\r\nend\r\n-- [[ Normal single node End ]]\r\n\r\nif not load_shunt_options then\r\n\to = s:option(ListValue, _n(\"chain_proxy\"), translate(\"Chain Proxy\"))\r\n\to:value(\"\", translate(\"Close(Not use)\"))\r\n\tif not (load_iface_options or load_balancing_options) then\r\n\t\t-- Special node cannot be use pre-proxy.\r\n\t\to:value(\"1\", translate(\"Preproxy Node\"))\r\n\tend\r\n\to:value(\"2\", translate(\"Landing Node\"))\r\n\r\n\to1 = s:option(ListValue, _n(\"preproxy_node\"), translate(\"Preproxy Node\"), translate(\"Only support a layer of proxy.\"))\r\n\to1:depends({ [_n(\"chain_proxy\")] = \"1\" })\r\n\to1.template = appname .. \"/cbi/nodes_listvalue\"\r\n\to1.group = {}\r\n\r\n\to2 = s:option(ListValue, _n(\"to_node\"), translate(\"Landing Node\"), translate(\"Only support a layer of proxy.\"))\r\n\to2:depends({ [_n(\"chain_proxy\")] = \"2\" })\r\n\to2.template = appname .. \"/cbi/nodes_listvalue\"\r\n\to2.group = {}\r\n\r\n\tfor k1, v1 in pairs(node_list) do\r\n\t\tif k1 ~= \"shunt_list\" and k1 ~= \"iface_list\" then\r\n\t\t\tfor i, v in ipairs(v1) do\r\n\t\t\t\tif v.id ~= arg[1] then\r\n\t\t\t\t\to1:value(v.id, v.remark)\r\n\t\t\t\t\to1.group[#o1.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\r\n\t\t\t\t\tif k1 == \"normal_list\" then\r\n\t\t\t\t\t\t-- Landing Node not support use special node.\r\n\t\t\t\t\t\to2:value(v.id, v.remark)\r\n\t\t\t\t\t\to2.group[#o2.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\r\n\t\t\t\t\tend\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\nend\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n\r\nif load_shunt_options then\r\n\tlocal current_node = m.uci:get_all(appname, arg[1]) or {}\r\n\tlocal shunt_lua = loadfile(\"/usr/lib/lua/luci/model/cbi/passwall2/client/include/shunt_options.lua\")\r\n\tsetfenv(shunt_lua, getfenv(1))(m, s, {\r\n\t\tnode_id = arg[1],\r\n\t\tnode = current_node,\r\n\t\tnode_list = node_list,\r\n\t})\r\nend\r\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/sing-box.lua",
    "content": "local m, s = ...\r\n\r\nlocal singbox_bin = api.finded_com(\"sing-box\")\r\n\r\nif not singbox_bin then\r\n\treturn\r\nend\r\n\r\ntype_name = \"sing-box\"\r\n\r\n-- [[ sing-box ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"Sing-Box\")\r\nif not s.fields[\"type\"].default then\r\n\ts.fields[\"type\"].default = type_name\r\nend\r\n\r\nif s.val[\"type\"] ~= type_name then\r\n\treturn\r\nend\r\n\r\nlocal option_prefix = \"singbox_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal formvalue_proto = luci.http.formvalue(formvalue_key .. _n(\"protocol\"))\r\n\r\nif formvalue_proto then s.val[\"protocol\"] = formvalue_proto end\r\n\r\nlocal arg_select_proto = luci.http.formvalue(\"select_proto\") or \"\"\r\n\r\nlocal ss_method_new_list = {\r\n\t\"none\", \"aes-128-gcm\", \"aes-192-gcm\", \"aes-256-gcm\", \"chacha20-ietf-poly1305\", \"xchacha20-ietf-poly1305\", \"2022-blake3-aes-128-gcm\", \"2022-blake3-aes-256-gcm\", \"2022-blake3-chacha20-poly1305\"\r\n}\r\n\r\nlocal ss_method_old_list = {\r\n\t\"aes-128-ctr\", \"aes-192-ctr\", \"aes-256-ctr\", \"aes-128-cfb\", \"aes-192-cfb\", \"aes-256-cfb\", \"rc4-md5\", \"chacha20-ietf\", \"xchacha20\",\r\n}\r\n\r\nlocal security_list = { \"none\", \"auto\", \"aes-128-gcm\", \"chacha20-poly1305\", \"zero\" }\r\n\r\nlocal singbox_tags = luci.sys.exec(singbox_bin .. \" version  | grep 'Tags:' | awk '{print $2}'\")\r\n\r\no = s:option(ListValue, _n(\"protocol\"), translate(\"Protocol\"))\r\no:value(\"socks\", \"Socks\")\r\no:value(\"http\", \"HTTP\")\r\no:value(\"shadowsocks\", \"Shadowsocks\")\r\nif singbox_tags:find(\"with_shadowsocksr\") then\r\n\to:value(\"shadowsocksr\", \"ShadowsocksR\")\r\nend\r\no:value(\"vmess\", \"Vmess\")\r\no:value(\"trojan\", \"Trojan\")\r\nif singbox_tags:find(\"with_wireguard\") then\r\n\to:value(\"wireguard\", \"WireGuard\")\r\nend\r\nif singbox_tags:find(\"with_quic\") then\r\n\to:value(\"hysteria\", \"Hysteria\")\r\nend\r\no:value(\"vless\", \"VLESS\")\r\nif singbox_tags:find(\"with_quic\") then\r\n\to:value(\"tuic\", \"TUIC\")\r\nend\r\nif singbox_tags:find(\"with_quic\") then\r\n\to:value(\"hysteria2\", \"Hysteria2\")\r\nend\r\no:value(\"anytls\", \"AnyTLS\")\r\no:value(\"ssh\", \"SSH\")\r\nif singbox_tags:find(\"with_naive_outbound\") then\r\n\to:value(\"naive\", \"NaïveProxy\")\r\nend\r\no:value(\"_urltest\", translate(\"URLTest\"))\r\no:value(\"_shunt\", translate(\"Shunt\"))\r\no:value(\"_iface\", translate(\"Custom Interface\"))\r\nfunction o.custom_cfgvalue(self, section)\r\n\tif arg_select_proto ~= \"\" then\r\n\t\treturn arg_select_proto\r\n\telse\r\n\t\treturn m:get(section, self.option:sub(1 + #option_prefix))\r\n\tend\r\nend\r\n\r\nlocal load_urltest_options = s.val[\"protocol\"] == \"_urltest\" or arg_select_proto == \"_urltest\"\r\nlocal load_shunt_options = s.val[\"protocol\"] == \"_shunt\" or arg_select_proto == \"_shunt\"\r\nlocal load_iface_options = s.val[\"protocol\"] == \"_iface\" or arg_select_proto == \"_iface\"\r\nlocal load_normal_options = true\r\nif load_urltest_options or load_shunt_options or load_iface_options then\r\n\tload_normal_options = nil\r\nend\r\nif not arg_select_proto:find(\"_\") then\r\n\tload_normal_options = true\r\nend\r\n\r\nlocal node_list = api.get_node_list()\r\n\r\nif load_urltest_options then -- [[ URLTest Start ]]\r\n\to = s:option(ListValue, _n(\"node_add_mode\"), translate(\"Node Addition Method\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_urltest\" })\r\n\to.default = \"manual\"\r\n\to:value(\"manual\", translate(\"Manual\"))\r\n\to:value(\"batch\", translate(\"Batch\"))\r\n\r\n\to = s:option(MultiValue, _n(\"urltest_node\"), translate(\"URLTest node list\"), translate(\"List of nodes to test, <a target='_blank' href='https://sing-box.sagernet.org/configuration/outbound/urltest'>document</a>\"))\r\n\to:depends({ [_n(\"node_add_mode\")] = \"manual\" })\r\n\to.widget = \"checkbox\"\r\n\to.template = appname .. \"/cbi/nodes_multivalue\"\r\n\to.group = {}\r\n\tfor k1, v1 in pairs(node_list) do\r\n\t\tif k1 == \"socks_list\" or k1 == \"normal_list\" then\r\n\t\t\tfor i, v in ipairs(v1) do\r\n\t\t\t\to:value(v.id, v.remark)\r\n\t\t\t\to.group[#o.group+1] = v.group or \"\"\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\n\t-- Reading the old DynamicList\r\n\tfunction o.cfgvalue(self, section)\r\n\t\treturn m.uci:get_list(appname, section, \"urltest_node\") or {}\r\n\tend\r\n\t-- Write-and-hold DynamicList\r\n\tfunction o.custom_write(self, section, value)\r\n\t\tlocal old = m.uci:get_list(appname, section, \"urltest_node\") or {}\r\n\t\tlocal new, set = {}, {}\r\n\t\tfor v in value:gmatch(\"%S+\") do\r\n\t\t\tnew[#new + 1] = v\r\n\t\t\tset[v] = 1\r\n\t\tend\r\n\t\tfor _, v in ipairs(old) do\r\n\t\t\tif not set[v] then\r\n\t\t\t\tm.uci:set_list(appname, section, \"urltest_node\", new)\r\n\t\t\t\treturn\r\n\t\t\tend\r\n\t\t\tset[v] = nil\r\n\t\tend\r\n\t\tfor _ in pairs(set) do\r\n\t\t\tm.uci:set_list(appname, section, \"urltest_node\", new)\r\n\t\t\treturn\r\n\t\tend\r\n\tend\r\n\r\n\to = s:option(MultiValue, _n(\"node_group\"), translate(\"Select Group\"))\r\n\to:depends({ [_n(\"node_add_mode\")] = \"batch\" })\r\n\to.widget = \"checkbox\"\r\n\to:value(\"default\", translate(\"default\"))\r\n\tfor k, v in pairs(groups) do\r\n\t\to:value(api.UrlEncode(k), k)\r\n\tend\r\n\r\n\to = s:option(Value, _n(\"node_match_rule\"), translate(\"Node Matching Rules\"))\r\n\to:depends({ [_n(\"node_add_mode\")] = \"batch\" })\r\n\tlocal descrStr = \"Example: <code>^A && B && !C && D$</code><br>\"\r\n\tdescrStr = descrStr .. \"This means the node remark must start with A (^), include B, exclude C (!), and end with D ($).<br>\"\r\n\tdescrStr = descrStr .. \"Conditions are joined by <code>&&</code>, and their order does not affect the result.\"\r\n\to.description = translate(descrStr)\r\n\r\n\to = s:option(Value, _n(\"urltest_url\"), translate(\"Probe URL\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_urltest\" })\r\n\to:value(\"https://cp.cloudflare.com/\", \"Cloudflare\")\r\n\to:value(\"https://www.gstatic.com/generate_204\", \"Gstatic\")\r\n\to:value(\"https://www.google.com/generate_204\", \"Google\")\r\n\to:value(\"https://www.youtube.com/generate_204\", \"YouTube\")\r\n\to:value(\"https://connect.rom.miui.com/generate_204\", \"MIUI (CN)\")\r\n\to:value(\"https://connectivitycheck.platform.hicloud.com/generate_204\", \"HiCloud (CN)\")\r\n\to.default = \"https://www.gstatic.com/generate_204\"\r\n\to.description = translate(\"The URL used to detect the connection status.\")\r\n\r\n\to = s:option(Value, _n(\"urltest_interval\"), translate(\"Test interval\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_urltest\" })\r\n\to.default = \"3m\"\r\n\to.placeholder = \"3m\"\r\n\to.description = translate(\"The interval between initiating probes.\") .. \"<br>\" ..\r\n\t\t\ttranslate(\"The time format is numbers + units, such as '10s', '2h45m', and the supported time units are <code>s</code>, <code>m</code>, <code>h</code>, which correspond to seconds, minutes, and hours, respectively.\") .. \"<br>\" ..\r\n\t\t\ttranslate(\"When the unit is not filled in, it defaults to seconds.\") .. \"<br>\" ..\r\n\t\t\ttranslate(\"Test interval must be less or equal than idle timeout.\")\r\n\r\n\to = s:option(Value, _n(\"urltest_tolerance\"), translate(\"Test tolerance\"), translate(\"The test tolerance in milliseconds.\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_urltest\" })\r\n\to.datatype = \"uinteger\"\r\n\to.placeholder = \"50\"\r\n\to.default = \"50\"\r\n\r\n\to = s:option(Value, _n(\"urltest_idle_timeout\"), translate(\"Idle timeout\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_urltest\" })\r\n\to.placeholder = \"30m\"\r\n\to.default = \"30m\"\r\n\to.description = translate(\"The idle timeout.\") .. \"<br>\" ..\r\n\t\t\ttranslate(\"The time format is numbers + units, such as '10s', '2h45m', and the supported time units are <code>s</code>, <code>m</code>, <code>h</code>, which correspond to seconds, minutes, and hours, respectively.\") .. \"<br>\" ..\r\n\t\t\ttranslate(\"When the unit is not filled in, it defaults to seconds.\")\r\n\r\n\to = s:option(Flag, _n(\"urltest_interrupt_exist_connections\"), translate(\"Interrupt existing connections\"))\r\n\to:depends({ [_n(\"protocol\")] = \"_urltest\" })\r\n\to.default = \"0\"\r\n\to.description = translate(\"Interrupt existing connections when the selected outbound has changed.\")\r\nend -- [[ URLTest End ]]\r\n\r\nif load_iface_options then -- [[ Custom Interface Start ]]\r\n\to = s:option(Value, _n(\"iface\"), translate(\"Interface\"))\r\n\to.default = \"eth1\"\r\n\to:depends({ [_n(\"protocol\")] = \"_iface\" })\r\nend -- [[ Custom Interface End ]]\r\n\r\n\r\n-- [[ Normal single node Start ]]\r\nif load_normal_options then\r\n\r\no = s:option(Value, _n(\"address\"), translate(\"Address (Support Domain Name)\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\n\r\no = s:option(Value, _n(\"uuid\"), translate(\"ID\"))\r\no.password = true\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\no = s:option(Value, _n(\"username\"), translate(\"Username\"))\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"ssh\" })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocksr\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"anytls\" })\r\no:depends({ [_n(\"protocol\")] = \"ssh\" })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\n\r\no = s:option(ListValue, _n(\"security\"), translate(\"Encrypt Method\"))\r\nfor a, t in ipairs(security_list) do o:value(t) end\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\n\r\no = s:option(ListValue, _n(\"ss_method\"), translate(\"Encrypt Method\"))\r\no.rewrite_option = \"method\"\r\nfor a, t in ipairs(ss_method_new_list) do o:value(t) end\r\nfor a, t in ipairs(ss_method_old_list) do o:value(t) end\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\nif singbox_tags:find(\"with_shadowsocksr\") then\r\n\to = s:option(ListValue, _n(\"ssr_method\"), translate(\"Encrypt Method\"))\r\n\to.rewrite_option = \"method\"\r\n\tfor a, t in ipairs(ss_method_old_list) do o:value(t) end\r\n\to:depends({ [_n(\"protocol\")] = \"shadowsocksr\" })\r\n\r\n\tlocal ssr_protocol_list = {\r\n\t\t\"origin\", \"verify_simple\", \"verify_deflate\", \"verify_sha1\", \"auth_simple\",\r\n\t\t\"auth_sha1\", \"auth_sha1_v2\", \"auth_sha1_v4\", \"auth_aes128_md5\",\r\n\t\t\"auth_aes128_sha1\", \"auth_chain_a\", \"auth_chain_b\", \"auth_chain_c\",\r\n\t\t\"auth_chain_d\", \"auth_chain_e\", \"auth_chain_f\"\r\n\t}\r\n\r\n\to = s:option(ListValue, _n(\"ssr_protocol\"), translate(\"Protocol\"))\r\n\tfor a, t in ipairs(ssr_protocol_list) do o:value(t) end\r\n\to:depends({ [_n(\"protocol\")] = \"shadowsocksr\" })\r\n\r\n\to = s:option(Value, _n(\"ssr_protocol_param\"), translate(\"Protocol_param\"))\r\n\to:depends({ [_n(\"protocol\")] = \"shadowsocksr\" })\r\n\r\n\tlocal ssr_obfs_list = {\r\n\t\t\"plain\", \"http_simple\", \"http_post\", \"random_head\", \"tls_simple\",\r\n\t\t\"tls1.0_session_auth\", \"tls1.2_ticket_auth\"\r\n\t}\r\n\r\n\to = s:option(ListValue, _n(\"ssr_obfs\"), translate(\"Obfs\"))\r\n\tfor a, t in ipairs(ssr_obfs_list) do o:value(t) end\r\n\to:depends({ [_n(\"protocol\")] = \"shadowsocksr\" })\r\n\r\n\to = s:option(Value, _n(\"ssr_obfs_param\"), translate(\"Obfs_param\"))\r\n\to:depends({ [_n(\"protocol\")] = \"shadowsocksr\" })\r\nend\r\n\r\no = s:option(Flag, _n(\"uot\"), translate(\"UDP over TCP\"))\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\n\r\no = s:option(Value, _n(\"alter_id\"), \"Alter ID\")\r\no.datatype = \"uinteger\"\r\no.default = \"0\"\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\n\r\no = s:option(Flag, _n(\"global_padding\"), \"global_padding\", translate(\"Protocol parameter. Will waste traffic randomly if enabled.\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\n\r\no = s:option(Flag, _n(\"authenticated_length\"), \"authenticated_length\", translate(\"Protocol parameter. Enable length block encryption.\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\n\r\no = s:option(ListValue, _n(\"flow\"), translate(\"flow\"))\r\no.default = \"\"\r\no:value(\"\", translate(\"Disable\"))\r\no:value(\"xtls-rprx-vision\")\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"tls\")] = true })\r\n\r\nif singbox_tags:find(\"with_quic\") then\r\n\to = s:option(Value, _n(\"hysteria_hop\"), translate(\"Port hopping range\"))\r\n\to.description = translate(\"Format as 1000:2000 or 1000-2000 Multiple groups are separated by commas (,).\")\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_hop_interval\"), translate(\"Hop Interval(second)\"), translate(\"Example:\") .. \"30 (≥5)\")\r\n\to.datatype = \"uinteger\"\r\n\to.placeholder = \"30\"\r\n\to.default = \"30\"\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_obfs\"), translate(\"Obfs Password\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(ListValue, _n(\"hysteria_auth_type\"), translate(\"Auth Type\"))\r\n\to:value(\"disable\", translate(\"Disable\"))\r\n\to:value(\"string\", translate(\"STRING\"))\r\n\to:value(\"base64\", translate(\"BASE64\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_auth_password\"), translate(\"Auth Password\"))\r\n\to.password = true\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\", [_n(\"hysteria_auth_type\")] = \"string\"})\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\", [_n(\"hysteria_auth_type\")] = \"base64\"})\r\n\r\n\to = s:option(Value, _n(\"hysteria_up_mbps\"), translate(\"Max upload Mbps\"))\r\n\to.default = \"10\"\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_down_mbps\"), translate(\"Max download Mbps\"))\r\n\to.default = \"50\"\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_recv_window_conn\"), translate(\"QUIC stream receive window\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_recv_window\"), translate(\"QUIC connection receive window\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Flag, _n(\"hysteria_disable_mtu_discovery\"), translate(\"Disable MTU detection\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\nend\r\n\r\nif singbox_tags:find(\"with_quic\") then\r\n\to = s:option(ListValue, _n(\"tuic_congestion_control\"), translate(\"Congestion control algorithm\"))\r\n\to.default = \"cubic\"\r\n\to:value(\"bbr\", translate(\"BBR\"))\r\n\to:value(\"cubic\", translate(\"CUBIC\"))\r\n\to:value(\"new_reno\", translate(\"New Reno\"))\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\n\to = s:option(ListValue, _n(\"tuic_udp_relay_mode\"), translate(\"UDP relay mode\"))\r\n\to.default = \"native\"\r\n\to:value(\"native\", translate(\"native\"))\r\n\to:value(\"quic\", translate(\"QUIC\"))\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\n\t--[[\r\n\to = s:option(Flag, _n(\"tuic_udp_over_stream\"), translate(\"UDP over stream\"))\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\t]]--\r\n\r\n\to = s:option(Flag, _n(\"tuic_zero_rtt_handshake\"), translate(\"Enable 0-RTT QUIC handshake\"))\r\n\to.default = 0\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\n\to = s:option(Value, _n(\"tuic_heartbeat\"), translate(\"Heartbeat interval(second)\"))\r\n\to.datatype = \"uinteger\"\r\n\to.default = \"3\"\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\n\to = s:option(ListValue, _n(\"tuic_alpn\"), translate(\"QUIC TLS ALPN\"))\r\n\to.default = \"default\"\r\n\to:value(\"default\", translate(\"Default\"))\r\n\to:value(\"h3\")\r\n\to:value(\"h2\")\r\n\to:value(\"h3,h2\")\r\n\to:value(\"http/1.1\")\r\n\to:value(\"h2,http/1.1\")\r\n\to:value(\"h3,h2,http/1.1\")\r\n\to:value(\"spdy/3.1\")\r\n\to:value(\"h3,spdy/3.1\")\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\nend\r\n\r\nif singbox_tags:find(\"with_quic\") then\r\n\to = s:option(Value, _n(\"hysteria2_hop\"), translate(\"Port hopping range\"))\r\n\to.description = translate(\"Format as 1000:2000 or 1000-2000 Multiple groups are separated by commas (,).\")\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria2_hop_interval\"), translate(\"Hop Interval(Second)\"), translate(\"Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5.\"))\r\n\to.datatype = \"or(uinteger,portrange)\"\r\n\to.placeholder = \"30\"\r\n\to.default = \"30\"\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria2_up_mbps\"), translate(\"Max upload Mbps\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria2_down_mbps\"), translate(\"Max download Mbps\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\n\to = s:option(ListValue, _n(\"hysteria2_obfs_type\"), translate(\"Obfs Type\"))\r\n\to:value(\"\", translate(\"Disable\"))\r\n\to:value(\"salamander\")\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria2_obfs_password\"), translate(\"Obfs Password\"))\r\n\to:depends({ [_n(\"hysteria2_obfs_type\")] = \"salamander\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria2_auth_password\"), translate(\"Auth Password\"))\r\n\to.password = true\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\nend\r\n\r\n-- [[ SSH config start ]] --\r\no = s:option(TextValue, _n(\"ssh_priv_key\"), translate(\"Private Key\"))\r\no.rows = 5\r\no.wrap = \"off\"\r\no:depends({ [_n(\"protocol\")] = \"ssh\" })\r\no.validate = function(self, value)\r\n\tvalue = api.trim(value):gsub(\"\\r\\n\", \"\\n\"):gsub(\"[ \\t]*\\n[ \\t]*\", \"\\n\"):gsub(\"\\n+\", \"\\n\")\r\n\treturn value\r\nend\r\n\r\no = s:option(Value, _n(\"ssh_priv_key_pp\"), translate(\"Private Key Passphrase\"))\r\no.password = true\r\no:depends({ [_n(\"protocol\")] = \"ssh\" })\r\n\r\no = s:option(DynamicList, _n(\"ssh_host_key\"), translate(\"Host Key\"), translate(\"Accept any if empty.\"))\r\no:depends({ [_n(\"protocol\")] = \"ssh\" })\r\n\r\no = s:option(DynamicList, _n(\"ssh_host_key_algo\"), translate(\"Host Key Algorithms\"))\r\no:depends({ [_n(\"protocol\")] = \"ssh\" })\r\n\r\no = s:option(Value, _n(\"ssh_client_version\"), translate(\"Client Version\"), translate(\"Random version will be used if empty.\"))\r\no:depends({ [_n(\"protocol\")] = \"ssh\" })\r\n-- [[ SSH config end ]] --\r\n\r\n-- [[ naive start ]] --\r\no = s:option(Value, _n(\"naive_insecure_concurrency\"), translate(\"Concurrent Tunnels\"))\r\no.datatype = \"uinteger\"\r\no.placeholder = \"0\"\r\no.default = \"0\"\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\n\r\no = s:option(Flag, _n(\"naive_quic\"), translate(\"QUIC\"))\r\no.default = 0\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\n\r\no = s:option(ListValue, _n(\"naive_congestion_control\"), translate(\"Congestion control algorithm\"))\r\no.default = \"bbr\"\r\no:value(\"bbr\", translate(\"BBR\"))\r\no:value(\"bbr2\", translate(\"BBRv2\"))\r\no:value(\"cubic\", translate(\"CUBIC\"))\r\no:value(\"reno\", translate(\"New Reno\"))\r\no:depends({ [_n(\"naive_quic\")] = \"1\" })\r\n-- [[ naive end ]] --\r\n\r\no = s:option(Flag, _n(\"tls\"), translate(\"TLS\"))\r\no.default = 0\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"anytls\" })\r\n\r\no = s:option(ListValue, _n(\"alpn\"), translate(\"ALPN\"))\r\no.default = \"default\"\r\no:value(\"default\", translate(\"Default\"))\r\no:value(\"h3\")\r\no:value(\"h2\")\r\no:value(\"h3,h2\")\r\no:value(\"http/1.1\")\r\no:value(\"h2,http/1.1\")\r\no:value(\"h3,h2,http/1.1\")\r\no:depends({ [_n(\"tls\")] = true })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\no = s:option(Flag, _n(\"tls_disable_sni\"), translate(\"Disable SNI\"), translate(\"Do not send server name in ClientHello.\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"tls\")] = true })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\"})\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(Value, _n(\"tls_serverName\"), \"SNI \" .. translate(\"Domain\"))\r\no:depends({ [_n(\"tls\")] = true })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\"})\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\n\r\no = s:option(Flag, _n(\"tls_allowInsecure\"), translate(\"allowInsecure\"), translate(\"Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"tls\")] = true })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\"})\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(Flag, _n(\"ech\"), translate(\"ECH\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"flow\")] = \"\", [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\n\r\no = s:option(TextValue, _n(\"ech_config\"), translate(\"ECH Config\"))\r\no.default = \"\"\r\no.rows = 5\r\no.wrap = \"off\"\r\no:depends({ [_n(\"ech\")] = true })\r\no.validate = function(self, value)\r\n\tvalue = api.trim(value):gsub(\"\\r\\n\", \"\\n\"):gsub(\"[ \\t]*\\n[ \\t]*\", \"\\n\"):gsub(\"\\n+\", \"\\n\")\r\n\treturn value\r\nend\r\n\r\no = s:option(Value, _n(\"ech_query_server_name\"), translate(\"ECH Query Domain\"), translate(\"Overrides the domain name used for ECH HTTPS record queries.\"))\r\no:depends({ [_n(\"ech\")] = true })\r\n\r\nif singbox_tags:find(\"with_utls\") then\r\n\to = s:option(Flag, _n(\"utls\"), translate(\"uTLS\"))\r\n\to.default = \"0\"\r\n\to:depends({ [_n(\"tls\")] = true })\r\n\r\n\to = s:option(ListValue, _n(\"fingerprint\"), translate(\"Finger Print\"))\r\n\to:value(\"chrome\")\r\n\to:value(\"firefox\")\r\n\to:value(\"edge\")\r\n\to:value(\"safari\")\r\n\to:value(\"360\")\r\n\to:value(\"qq\")\r\n\to:value(\"ios\")\r\n\to:value(\"android\")\r\n\to:value(\"random\")\r\n\to:value(\"randomized\")\r\n\to.default = \"chrome\"\r\n\to:depends({ [_n(\"utls\")] = true })\r\n\r\n\t-- [[ REALITY ]] --\r\n\to = s:option(Flag, _n(\"reality\"), translate(\"REALITY\"))\r\n\to.default = 0\r\n\to:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"vmess\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"shadowsocks\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"socks\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"trojan\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"anytls\", [_n(\"tls\")] = true })\r\n\t\r\n\to = s:option(Value, _n(\"reality_publicKey\"), translate(\"Public Key\"))\r\n\to:depends({ [_n(\"reality\")] = true })\r\n\t\r\n\to = s:option(Value, _n(\"reality_shortId\"), translate(\"Short Id\"))\r\n\to:depends({ [_n(\"reality\")] = true })\r\nend\r\n\r\no = s:option(ListValue, _n(\"transport\"), translate(\"Transport\"))\r\no:value(\"tcp\", \"TCP\")\r\no:value(\"http\", \"HTTP\")\r\no:value(\"ws\", \"WebSocket\")\r\no:value(\"httpupgrade\", \"HTTPUpgrade\")\r\nif singbox_tags:find(\"with_quic\") then\r\n\to:value(\"quic\", \"QUIC\")\r\nend\r\nif singbox_tags:find(\"with_grpc\") then\r\n\to:value(\"grpc\", \"gRPC\")\r\nelse o:value(\"grpc\", \"gRPC-lite\")\r\nend\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\nif singbox_tags:find(\"with_wireguard\") then\r\n\to = s:option(Value, _n(\"wireguard_public_key\"), translate(\"Public Key\"))\r\n\to:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\n\to = s:option(Value, _n(\"wireguard_secret_key\"), translate(\"Private Key\"))\r\n\to:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\n\to = s:option(Value, _n(\"wireguard_preSharedKey\"), translate(\"Pre shared key\"))\r\n\to:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\n\to = s:option(DynamicList, _n(\"wireguard_local_address\"), translate(\"Local Address\"))\r\n\to:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\n\to = s:option(Value, _n(\"wireguard_mtu\"), translate(\"MTU\"))\r\n\to.default = \"1420\"\r\n\to:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\n\to = s:option(Flag, _n(\"wireguard_system_interface\"), translate(\"System interface\"))\r\n\to.default = 0\r\n\to:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\n\to = s:option(Value, _n(\"wireguard_interface_name\"), translate(\"System interface name\"))\r\n\to:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\n\r\n\to = s:option(Value, _n(\"wireguard_reserved\"), translate(\"Reserved\"), translate(\"Decimal numbers separated by \\\",\\\" or Base64-encoded strings.\"))\r\n\to:depends({ [_n(\"protocol\")] = \"wireguard\" })\r\nend\r\n\r\n-- [[ TCP ]]--\r\no = s:option(ListValue, _n(\"tcp_guise\"), translate(\"Camouflage Type\"))\r\no:value(\"none\", \"none\")\r\no:value(\"http\", \"http\")\r\no:depends({ [_n(\"transport\")] = \"tcp\" })\r\n\r\no = s:option(DynamicList, _n(\"tcp_guise_http_host\"), translate(\"HTTP Host\"))\r\no:depends({ [_n(\"tcp_guise\")] = \"http\" })\r\n\r\no = s:option(DynamicList, _n(\"tcp_guise_http_path\"), translate(\"HTTP Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"tcp_guise\")] = \"http\" })\r\n\r\n-- [[ HTTP ]]--\r\no = s:option(DynamicList, _n(\"http_host\"), translate(\"HTTP Host\"))\r\no:depends({ [_n(\"transport\")] = \"http\" })\r\n\r\no = s:option(Value, _n(\"http_path\"), translate(\"HTTP Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"transport\")] = \"http\" })\r\n\r\no = s:option(Flag, _n(\"http_h2_health_check\"), translate(\"Health check\"))\r\no:depends({ [_n(\"tls\")] = true, [_n(\"transport\")] = \"http\" })\r\n\r\no = s:option(Value, _n(\"http_h2_read_idle_timeout\"), translate(\"Idle timeout\"))\r\no.default = \"10\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"transport\")] = \"http\", [_n(\"http_h2_health_check\")] = true })\r\n\r\no = s:option(Value, _n(\"http_h2_health_check_timeout\"), translate(\"Health check timeout\"))\r\no.default = \"15\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"transport\")] = \"http\", [_n(\"http_h2_health_check\")] = true })\r\n\r\n-- [[ WebSocket ]]--\r\no = s:option(Value, _n(\"ws_host\"), translate(\"WebSocket Host\"))\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\no = s:option(Value, _n(\"ws_path\"), translate(\"WebSocket Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\no = s:option(Flag, _n(\"ws_enableEarlyData\"), translate(\"Enable early data\"))\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\no = s:option(Value, _n(\"ws_maxEarlyData\"), translate(\"Early data length\"))\r\no.default = \"1024\"\r\no:depends({ [_n(\"ws_enableEarlyData\")] = true })\r\n\r\no = s:option(Value, _n(\"ws_earlyDataHeaderName\"), translate(\"Early data header name\"), translate(\"Recommended value: Sec-WebSocket-Protocol\"))\r\no:depends({ [_n(\"ws_enableEarlyData\")] = true })\r\n\r\n-- [[ HTTPUpgrade ]]--\r\no = s:option(Value, _n(\"httpupgrade_host\"), translate(\"HTTPUpgrade Host\"))\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\n\r\no = s:option(Value, _n(\"httpupgrade_path\"), translate(\"HTTPUpgrade Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\n\r\n-- [[ gRPC ]]--\r\no = s:option(Value, _n(\"grpc_serviceName\"), \"ServiceName\")\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\no = s:option(Flag, _n(\"grpc_health_check\"), translate(\"Health check\"))\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\no = s:option(Value, _n(\"grpc_idle_timeout\"), translate(\"Idle timeout\"))\r\no.default = \"10\"\r\no:depends({ [_n(\"grpc_health_check\")] = true })\r\n\r\no = s:option(Value, _n(\"grpc_health_check_timeout\"), translate(\"Health check timeout\"))\r\no.default = \"20\"\r\no:depends({ [_n(\"grpc_health_check\")] = true })\r\n\r\no = s:option(Flag, _n(\"grpc_permit_without_stream\"), translate(\"Permit without stream\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"grpc_health_check\")] = true })\r\n\r\n-- [[ User-Agent ]]--\r\no = s:option(Value, _n(\"user_agent\"), translate(\"User-Agent\"))\r\no.default = \"\"\r\no:value(\"\", translate(\"default\"))\r\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36\", \"chrome\")\r\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0\", \"firefox\")\r\no:value(\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15\", \"safari\")\r\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.70\", \"edge\")\r\no:value(\"Go-http-client/1.1\", \"golang\")\r\no:value(\"curl/7.68.0\", \"curl\")\r\no:depends({ [_n(\"tcp_guise\")] = \"http\" })\r\no:depends({ [_n(\"transport\")] = \"http\" })\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\n\r\n-- [[ Mux ]]--\r\no = s:option(Flag, _n(\"mux\"), translate(\"Mux\"))\r\no.rmempty = false\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"flow\")] = \"\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\", [_n(\"uot\")] = \"\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\no = s:option(ListValue, _n(\"mux_type\"), translate(\"Mux\"))\r\no:value(\"smux\")\r\no:value(\"yamux\")\r\no:value(\"h2mux\")\r\no:depends({ [_n(\"mux\")] = true })\r\n\r\no = s:option(Value, _n(\"mux_concurrency\"), translate(\"Mux concurrency\"))\r\no.default = 4\r\no:depends({ [_n(\"mux\")] = true, [_n(\"tcpbrutal\")] = false })\r\n\r\no = s:option(Flag, _n(\"mux_padding\"), translate(\"Padding\"))\r\no.default = 0\r\no:depends({ [_n(\"mux\")] = true })\r\n\r\n-- [[ TCP Brutal ]]--\r\no = s:option(Flag, _n(\"tcpbrutal\"), translate(\"TCP Brutal\"))\r\no.default = 0\r\no:depends({ [_n(\"mux\")] = true })\r\n\r\no = s:option(Value, _n(\"tcpbrutal_up_mbps\"), translate(\"Max upload Mbps\"))\r\no.default = \"10\"\r\no:depends({ [_n(\"tcpbrutal\")] = true })\r\n\r\no = s:option(Value, _n(\"tcpbrutal_down_mbps\"), translate(\"Max download Mbps\"))\r\no.default = \"50\"\r\no:depends({ [_n(\"tcpbrutal\")] = true })\r\n\r\no = s:option(Flag, _n(\"shadowtls\"), \"ShadowTLS\")\r\no.default = 0\r\no:depends({ [_n(\"protocol\")] = \"vmess\", [_n(\"tls\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\", [_n(\"tls\")] = false })\r\n\r\no = s:option(ListValue, _n(\"shadowtls_version\"), \"ShadowTLS \" .. translate(\"Version\"))\r\no.default = \"1\"\r\no:value(\"1\", \"ShadowTLS v1\")\r\no:value(\"2\", \"ShadowTLS v2\")\r\no:value(\"3\", \"ShadowTLS v3\")\r\no:depends({ [_n(\"shadowtls\")] = true })\r\n\r\no = s:option(Value, _n(\"shadowtls_password\"), \"ShadowTLS \" .. translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"shadowtls\")] = true, [_n(\"shadowtls_version\")] = \"2\" })\r\no:depends({ [_n(\"shadowtls\")] = true, [_n(\"shadowtls_version\")] = \"3\" })\r\n\r\no = s:option(Value, _n(\"shadowtls_serverName\"), \"ShadowTLS \" .. translate(\"Domain\"))\r\no:depends({ [_n(\"shadowtls\")] = true })\r\n\r\nif singbox_tags:find(\"with_utls\") then\r\n\to = s:option(Flag, _n(\"shadowtls_utls\"), \"ShadowTLS \" .. translate(\"uTLS\"))\r\n\to.default = \"0\"\r\n\to:depends({ [_n(\"shadowtls\")] = true })\r\n\r\n\to = s:option(ListValue, _n(\"shadowtls_fingerprint\"), \"ShadowTLS \" .. translate(\"Finger Print\"))\r\n\to:value(\"chrome\")\r\n\to:value(\"firefox\")\r\n\to:value(\"edge\")\r\n\to:value(\"safari\")\r\n\t-- o:value(\"360\")\r\n\to:value(\"qq\")\r\n\to:value(\"ios\")\r\n\t-- o:value(\"android\")\r\n\to:value(\"random\")\r\n\t-- o:value(\"randomized\")\r\n\to.default = \"chrome\"\r\n\to:depends({ [_n(\"shadowtls\")] = true, [_n(\"shadowtls_utls\")] = true })\r\nend\r\n\r\n-- [[ SIP003 plugin ]]--\r\no = s:option(Flag, _n(\"plugin_enabled\"), translate(\"plugin\"))\r\no.default = 0\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(ListValue, _n(\"plugin\"), \"SIP003 \" .. translate(\"plugin\"))\r\no.default = \"obfs-local\"\r\no:depends({ [_n(\"plugin_enabled\")] = true })\r\no:value(\"obfs-local\")\r\no:value(\"v2ray-plugin\")\r\n\r\no = s:option(Value, _n(\"plugin_opts\"), translate(\"opts\"))\r\no:depends({ [_n(\"plugin_enabled\")] = true })\r\n\r\no = s:option(ListValue, _n(\"domain_resolver\"), translate(\"Domain DNS Resolve\"), translate(\"If the node address is a domain name, this DNS will be used for resolution.\"))\r\no:value(\"\", translate(\"Auto\"))\r\no:value(\"tcp\", \"TCP\")\r\no:value(\"udp\", \"UDP\")\r\no:value(\"https\", \"HTTPS\")\r\n\r\no = s:option(Value, _n(\"domain_resolver_dns\"), \"DNS\")\r\no.datatype = \"or(ipaddr,ipaddrport)\"\r\no:value(\"114.114.114.114\")\r\no:value(\"223.5.5.5:53\")\r\no.default = o.keylist[1]\r\no:depends({ [_n(\"domain_resolver\")] = \"tcp\" })\r\no:depends({ [_n(\"domain_resolver\")] = \"udp\" })\r\n\r\no = s:option(Value, _n(\"domain_resolver_dns_https\"), \"DNS\")\r\no:value(\"https://120.53.53.53/dns-query\", \"DNSPod\")\r\no:value(\"https://223.5.5.5/dns-query\", \"AliDNS\")\r\no.default = o.keylist[1]\r\no:depends({ [_n(\"domain_resolver\")] = \"https\" })\r\n\r\no = s:option(ListValue, _n(\"domain_strategy\"), translate(\"Domain Strategy\"), translate(\"If is domain name, The requested domain name will be resolved to IP before connect.\"))\r\no.default = \"\"\r\no:value(\"\", translate(\"Auto\"))\r\no:value(\"prefer_ipv4\", translate(\"Prefer IPv4\"))\r\no:value(\"prefer_ipv6\", translate(\"Prefer IPv6\"))\r\no:value(\"ipv4_only\", translate(\"IPv4 Only\"))\r\no:value(\"ipv6_only\", translate(\"IPv6 Only\"))\r\n\r\nlocal protocols = s.fields[_n(\"protocol\")].keylist\r\nif #protocols > 0 then\r\n\tfor i, v in ipairs(protocols) do\r\n\t\tif not v:find(\"^_\") then\r\n\t\t\ts.fields[_n(\"address\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\t\ts.fields[_n(\"port\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\t\ts.fields[_n(\"domain_resolver\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\t\ts.fields[_n(\"domain_strategy\")]:depends({ [_n(\"protocol\")] = v })\r\n\t\tend\r\n\tend\r\nend\r\nend\r\n-- [[ Normal single node End ]]\r\n\r\nif not load_shunt_options then\r\n\to = s:option(ListValue, _n(\"chain_proxy\"), translate(\"Chain Proxy\"))\r\n\to:value(\"\", translate(\"Close(Not use)\"))\r\n\tif not (load_iface_options or load_urltest_options) then\r\n\t\t-- Special node cannot be use pre-proxy.\r\n\t\to:value(\"1\", translate(\"Preproxy Node\"))\r\n\tend\r\n\to:value(\"2\", translate(\"Landing Node\"))\r\n\r\n\to1 = s:option(ListValue, _n(\"preproxy_node\"), translate(\"Preproxy Node\"), translate(\"Only support a layer of proxy.\"))\r\n\to1:depends({ [_n(\"chain_proxy\")] = \"1\" })\r\n\to1.template = appname .. \"/cbi/nodes_listvalue\"\r\n\to1.group = {}\r\n\r\n\to2 = s:option(ListValue, _n(\"to_node\"), translate(\"Landing Node\"), translate(\"Only support a layer of proxy.\"))\r\n\to2:depends({ [_n(\"chain_proxy\")] = \"2\" })\r\n\to2.template = appname .. \"/cbi/nodes_listvalue\"\r\n\to2.group = {}\r\n\r\n\tfor k1, v1 in pairs(node_list) do\r\n\t\tif k1 ~= \"shunt_list\" and k1 ~= \"iface_list\" then\r\n\t\t\tfor i, v in ipairs(v1) do\r\n\t\t\t\tif v.id ~= arg[1] then\r\n\t\t\t\t\to1:value(v.id, v.remark)\r\n\t\t\t\t\to1.group[#o1.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\r\n\t\t\t\t\tif k1 == \"normal_list\" then\r\n\t\t\t\t\t\t-- Landing Node not support use special node.\r\n\t\t\t\t\t\to2:value(v.id, v.remark)\r\n\t\t\t\t\t\to2.group[#o2.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\r\n\t\t\t\t\tend\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\nend\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n\r\nif load_shunt_options then\r\n\tlocal current_node = m.uci:get_all(appname, arg[1]) or {}\r\n\tlocal shunt_lua = loadfile(\"/usr/lib/lua/luci/model/cbi/passwall2/client/include/shunt_options.lua\")\r\n\tsetfenv(shunt_lua, getfenv(1))(m, s, {\r\n\t\tnode_id = arg[1],\r\n\t\tnode = current_node,\r\n\t\tnode_list = node_list,\r\n\t})\r\nend\r\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ss-rust.lua",
    "content": "local m, s = ...\r\n\r\nif not api.is_finded(\"sslocal\") then\r\n\treturn\r\nend\r\n\r\ntype_name = \"SS-Rust\"\r\n\r\n-- [[ Shadowsocks Rust ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"Shadowsocks Rust\")\r\n\r\nif s.val[\"type\"] ~= type_name then\r\n\treturn\r\nend\r\n\r\nlocal option_prefix = \"ssrust_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal ssrust_encrypt_method_list = {\r\n\t\"none\", \"plain\",\r\n\t\"aes-128-gcm\", \"aes-256-gcm\", \"chacha20-ietf-poly1305\",\r\n\t\"2022-blake3-aes-128-gcm\", \"2022-blake3-aes-256-gcm\", \"2022-blake3-chacha8-poly1305\", \"2022-blake3-chacha20-poly1305\"\r\n}\r\n\r\no = s:option(Value, _n(\"address\"), translate(\"Address (Support Domain Name)\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\n\r\no = s:option(Value, _n(\"method\"), translate(\"Encrypt Method\"))\r\nfor a, t in ipairs(ssrust_encrypt_method_list) do o:value(t) end\r\n\r\no = s:option(Value, _n(\"timeout\"), translate(\"Connection Timeout\"))\r\no.datatype = \"uinteger\"\r\no.default = 300\r\n\r\no = s:option(Flag, _n(\"tcp_fast_open\"), \"TCP \" .. translate(\"Fast Open\"), translate(\"Need node support required\"))\r\no.default = 0\r\n\r\no = s:option(Flag, _n(\"plugin_enabled\"), translate(\"plugin\"))\r\no.default = 0\r\n\r\no = s:option(Value, _n(\"plugin\"), \"SIP003 \" .. translate(\"plugin\"), translate(\"Supports custom SIP003 plugins, Make sure the plugin is installed.\"))\r\no.default = \"none\"\r\no:value(\"none\", translate(\"none\"))\r\nif api.is_finded(\"xray-plugin\") then o:value(\"xray-plugin\") end\r\nif api.is_finded(\"v2ray-plugin\") then o:value(\"v2ray-plugin\") end\r\nif api.is_finded(\"obfs-local\") then o:value(\"obfs-local\") end\r\nif api.is_finded(\"shadow-tls\") then o:value(\"shadow-tls\") end\r\no:depends({ [_n(\"plugin_enabled\")] = true })\r\no.validate = function(self, value, t)\r\n\tif value and value ~= \"\" and value ~= \"none\" then\r\n\t\tif not api.is_finded(value) then\r\n\t\t\treturn nil, value .. \": \" .. translate(\"Can't find this file!\")\r\n\t\telse\r\n\t\t\treturn value\r\n\t\tend\r\n\tend\r\n\treturn nil\r\nend\r\n\r\no = s:option(Value, _n(\"plugin_opts\"), translate(\"opts\"))\r\no:depends({ [_n(\"plugin_enabled\")] = true })\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ss.lua",
    "content": "local m, s = ...\r\n\r\nif not api.is_finded(\"ss-local\") then\r\n\treturn\r\nend\r\n\r\ntype_name = \"SS\"\r\n\r\n-- [[ Shadowsocks Libev ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"Shadowsocks Libev\")\r\n\r\nif s.val[\"type\"] ~= type_name then\r\n\treturn\r\nend\r\n\r\nlocal option_prefix = \"ss_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal ss_encrypt_method_list = {\r\n\t\"rc4-md5\", \"aes-128-cfb\", \"aes-192-cfb\", \"aes-256-cfb\", \"aes-128-ctr\",\r\n\t\"aes-192-ctr\", \"aes-256-ctr\", \"bf-cfb\", \"salsa20\", \"chacha20\", \"chacha20-ietf\",\r\n\t\"aes-128-gcm\", \"aes-192-gcm\", \"aes-256-gcm\", \"chacha20-ietf-poly1305\",\r\n\t\"xchacha20-ietf-poly1305\"\r\n}\r\n\r\no = s:option(Value, _n(\"address\"), translate(\"Address (Support Domain Name)\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\n\r\no = s:option(Value, _n(\"method\"), translate(\"Encrypt Method\"))\r\nfor a, t in ipairs(ss_encrypt_method_list) do o:value(t) end\r\n\r\no = s:option(Value, _n(\"timeout\"), translate(\"Connection Timeout\"))\r\no.datatype = \"uinteger\"\r\no.default = 300\r\n\r\no = s:option(Flag, _n(\"tcp_fast_open\"), \"TCP \" .. translate(\"Fast Open\"), translate(\"Need node support required\"))\r\no.default = 0\r\n\r\no = s:option(Flag, _n(\"plugin_enabled\"), translate(\"plugin\"))\r\no.default = 0\r\n\r\no = s:option(ListValue, _n(\"plugin\"), \"SIP003 \" .. translate(\"plugin\"))\r\no.default = \"none\"\r\no:value(\"none\", translate(\"none\"))\r\nif api.is_finded(\"xray-plugin\") then o:value(\"xray-plugin\") end\r\nif api.is_finded(\"v2ray-plugin\") then o:value(\"v2ray-plugin\") end\r\nif api.is_finded(\"obfs-local\") then o:value(\"obfs-local\") end\r\no:depends({ [_n(\"plugin_enabled\")] = true })\r\n\r\no = s:option(Value, _n(\"plugin_opts\"), translate(\"opts\"))\r\no:depends({ [_n(\"plugin_enabled\")] = true })\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/ssr.lua",
    "content": "local m, s = ...\r\n\r\nif not api.is_finded(\"ssr-local\") then\r\n\treturn\r\nend\r\n\r\ntype_name = \"SSR\"\r\n\r\n-- [[ ShadowsocksR Libev ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"ShadowsocksR Libev\")\r\n\r\nif s.val[\"type\"] ~= type_name then\r\n\treturn\r\nend\r\n\r\nlocal option_prefix = \"ssr_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal ssr_encrypt_method_list = {\r\n\t\"none\", \"table\", \"rc2-cfb\", \"rc4\", \"rc4-md5\", \"rc4-md5-6\", \"aes-128-cfb\",\r\n\t\"aes-192-cfb\", \"aes-256-cfb\", \"aes-128-ctr\", \"aes-192-ctr\", \"aes-256-ctr\",\r\n\t\"bf-cfb\", \"camellia-128-cfb\", \"camellia-192-cfb\", \"camellia-256-cfb\",\r\n\t\"cast5-cfb\", \"des-cfb\", \"idea-cfb\", \"seed-cfb\", \"salsa20\", \"chacha20\",\r\n\t\"chacha20-ietf\"\r\n}\r\n\r\nlocal ssr_protocol_list = {\r\n\t\"origin\", \"verify_simple\", \"verify_deflate\", \"verify_sha1\", \"auth_simple\",\r\n\t\"auth_sha1\", \"auth_sha1_v2\", \"auth_sha1_v4\", \"auth_aes128_md5\",\r\n\t\"auth_aes128_sha1\", \"auth_chain_a\", \"auth_chain_b\", \"auth_chain_c\",\r\n\t\"auth_chain_d\", \"auth_chain_e\", \"auth_chain_f\"\r\n}\r\nlocal ssr_obfs_list = {\r\n\t\"plain\", \"http_simple\", \"http_post\", \"random_head\", \"tls_simple\",\r\n\t\"tls1.0_session_auth\", \"tls1.2_ticket_auth\"\r\n}\r\n\r\no = s:option(Value, _n(\"address\"), translate(\"Address (Support Domain Name)\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\n\r\no = s:option(ListValue, _n(\"method\"), translate(\"Encrypt Method\"))\r\nfor a, t in ipairs(ssr_encrypt_method_list) do o:value(t) end\r\n\r\no = s:option(ListValue, _n(\"protocol\"), translate(\"Protocol\"))\r\nfor a, t in ipairs(ssr_protocol_list) do o:value(t) end\r\n\r\no = s:option(Value, _n(\"protocol_param\"), translate(\"Protocol_param\"))\r\n\r\no = s:option(ListValue, _n(\"obfs\"), translate(\"Obfs\"))\r\nfor a, t in ipairs(ssr_obfs_list) do o:value(t) end\r\n\r\no = s:option(Value, _n(\"obfs_param\"), translate(\"Obfs_param\"))\r\n\r\no = s:option(Value, _n(\"timeout\"), translate(\"Connection Timeout\"))\r\no.datatype = \"uinteger\"\r\no.default = 300\r\n\r\no = s:option(Flag, _n(\"tcp_fast_open\"), \"TCP \" .. translate(\"Fast Open\"), translate(\"Need node support required\"))\r\no.default = 0\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/client/type/tuic.lua",
    "content": "local m, s = ...\n\nif not api.is_finded(\"tuic-client\") then\n\treturn\nend\n\ntype_name = \"TUIC\"\n\n-- [[ TUIC ]]\n\ns.fields[\"type\"]:value(type_name, \"TUIC\")\n\nif s.val[\"type\"] ~= type_name then\n\treturn\nend\n\nlocal option_prefix = \"tuic_\"\n\nlocal function _n(name)\n\treturn option_prefix .. name\nend\n\no = s:option(Value, _n(\"address\"), translate(\"Address (Support Domain Name)\"))\n\no = s:option(Value, _n(\"port\"), translate(\"Port\"))\no.datatype = \"port\"\n\no = s:option(Value, _n(\"uuid\"), translate(\"ID\"))\no.password = true\n\n-- Tuic Password for remote server connect\no = s:option(Value, _n(\"password\"), translate(\"TUIC User Password For Connect Remote Server\"))\no.password = true\no.rmempty = true\no.default = \"\"\no.rewrite_option = o.option\n\n--[[\n-- Tuic username for local socks connect\no = s:option(Value, _n(\"socks_username\"), translate(\"TUIC UserName For Local Socks\"))\no.rmempty = true\no.default = \"\"\no.rewrite_option = o.option\n\n-- Tuic Password for local socks connect\no = s:option(Value, _n(\"socks_password\"), translate(\"TUIC Password For Local Socks\"))\no.password = true\no.rmempty = true\no.default = \"\"\no.rewrite_option = o.option\n--]]\n\no = s:option(Value, _n(\"ip\"), translate(\"Set the TUIC proxy server ip address\"))\no.datatype = \"ipaddr\"\no.rmempty = true\no.rewrite_option = o.option\n\no = s:option(ListValue, _n(\"udp_relay_mode\"), translate(\"UDP relay mode\"))\no:value(\"native\", translate(\"native\"))\no:value(\"quic\", translate(\"QUIC\"))\no.default = \"native\"\no.rmempty = true\no.rewrite_option = o.option\n\no = s:option(ListValue, _n(\"congestion_control\"), translate(\"Congestion control algorithm\"))\no:value(\"bbr\", translate(\"BBR\"))\no:value(\"cubic\", translate(\"CUBIC\"))\no:value(\"new_reno\", translate(\"New Reno\"))\no.default = \"cubic\"\no.rmempty = true\no.rewrite_option = o.option\n\no = s:option(Value, _n(\"heartbeat\"), translate(\"Heartbeat interval(second)\"))\no.datatype = \"uinteger\"\no.default = \"3\"\no.rmempty = true\no.rewrite_option = o.option\n\no = s:option(Value, _n(\"timeout\"), translate(\"Timeout for establishing a connection to server(second)\"))\no.datatype = \"uinteger\"\no.default = \"8\"\no.rmempty = true\no.rewrite_option = o.option\n\no = s:option(Value, _n(\"gc_interval\"), translate(\"Garbage collection interval(second)\"))\no.datatype = \"uinteger\"\no.default = \"3\"\no.rmempty = true\no.rewrite_option = o.option\n\no = s:option(Value, _n(\"gc_lifetime\"), translate(\"Garbage collection lifetime(second)\"))\no.datatype = \"uinteger\"\no.default = \"15\"\no.rmempty = true\no.rewrite_option = o.option\n\no = s:option(Value, _n(\"send_window\"), translate(\"TUIC send window\"))\no.datatype = \"uinteger\"\no.default = 20971520\no.rmempty = true\no.rewrite_option = o.option\n\no = s:option(Value, _n(\"receive_window\"), translate(\"TUIC receive window\"))\no.datatype = \"uinteger\"\no.default = 10485760\no.rmempty = true\no.rewrite_option = o.option\n\no = s:option(Value, _n(\"max_package_size\"), translate(\"TUIC Maximum packet size the socks5 server can receive from external, in bytes\"))\no.datatype = \"uinteger\"\no.default = 1500\no.rmempty = true\no.rewrite_option = o.option\n\n--Tuic settings for the local inbound socks5 server\no = s:option(Flag, _n(\"dual_stack\"), translate(\"Set if the listening socket should be dual-stack\"))\no.default = 0\no.rmempty = true\no.rewrite_option = o.option\n\no = s:option(Flag, _n(\"disable_sni\"), translate(\"Disable SNI\"))\no.default = 0\no.rmempty = true\no.rewrite_option = o.option\n\no = s:option(Flag, _n(\"zero_rtt_handshake\"), translate(\"Enable 0-RTT QUIC handshake\"))\no.default = 0\no.rmempty = true\no.rewrite_option = o.option\n\no = s:option(ListValue, _n(\"tls_alpn\"), translate(\"TLS ALPN\"))\no.rmempty = true\no.default = \"\"\no:value(\"\", translate(\"Default\"))\no:value(\"h3\")\no:value(\"h2\")\no:value(\"h3,h2\")\no:value(\"http/1.1\")\no:value(\"h2,http/1.1\")\no:value(\"h3,h2,http/1.1\")\no:value(\"spdy/3.1\")\no:value(\"h3,spdy/3.1\")\no.rewrite_option = o.option\n\napi.luci_types(arg[1], m, s, type_name, option_prefix)\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/server/index.lua",
    "content": "local api = require \"luci.passwall2.api\"\n\nm = Map(\"passwall2_server\", translate(\"Server-Side\"))\napi.set_apply_on_parse(m)\n\nt = m:section(NamedSection, \"global\", \"global\")\nt.anonymous = true\nt.addremove = false\n\ne = t:option(Flag, \"enable\", translate(\"Enable\"))\ne.rmempty = false\n\nt = m:section(TypedSection, \"user\", translate(\"Users Manager\"))\nt.anonymous = true\nt.addremove = true\nt.sortable = true\nt.template = \"cbi/tblsection\"\nt.extedit = api.url(\"server_user\", \"%s\")\nfunction t.create(e, t)\n\tlocal uuid = api.gen_uuid()\n\tt = uuid\n\tTypedSection.create(e, t)\n\tluci.http.redirect(e.extedit:format(t))\nend\nfunction t.remove(e, t)\n\te.map.proceed = true\n\te.map:del(t)\n\tluci.http.redirect(api.url(\"server\"))\nend\n\ne = t:option(Flag, \"enable\", translate(\"Enable\"))\ne.width = \"5%\"\ne.rmempty = false\n\ne = t:option(DummyValue, \"status\", translate(\"Status\"))\ne.rawhtml = true\ne.cfgvalue = function(t, n)\n\treturn string.format('<font class=\"_users_status\">%s</font>', translate(\"Collecting data...\"))\nend\n\ne = t:option(DummyValue, \"remarks\", translate(\"Remarks\"))\ne.width = \"15%\"\n\ne = t:option(DummyValue, \"type\", translate(\"Type\"))\ne.width = \"20%\"\ne.rawhtml = true\ne.cfgvalue = function(t, n)\n\tlocal str = \"\"\n\tlocal type = m:get(n, \"type\") or \"\"\n\tif type == \"sing-box\" or type == \"Xray\" then\n\t\tlocal protocol = m:get(n, \"protocol\") or \"\"\n\t\tif protocol == \"vmess\" then\n\t\t\tprotocol = \"VMess\"\n\t\telseif protocol == \"vless\" then\n\t\t\tprotocol = \"VLESS\"\n\t\telseif protocol == \"shadowsocks\" then\n\t\t\tprotocol = \"SS\"\n\t\telseif protocol == \"shadowsocksr\" then\n\t\t\tprotocol = \"SSR\"\n\t\telseif protocol == \"wireguard\" then\n\t\t\tprotocol = \"WG\"\n\t\telseif protocol == \"hysteria\" then\n\t\t\tprotocol = \"HY\"\n\t\telseif protocol == \"hysteria2\" then\n\t\t\tprotocol = \"HY2\"\n\t\telseif protocol == \"anytls\" then\n\t\t\tprotocol = \"AnyTLS\"\n\t\telse\n\t\t\tprotocol = protocol:gsub(\"^%l\",string.upper)\n\t\t\tlocal custom = m:get(n, \"custom\") or \"0\"\n\t\t\tif custom == \"1\" then\n\t\t\t\tprotocol = translate(\"Custom Config\")\n\t\t\tend\n\t\tend\n\t\tif type == \"sing-box\" then type = \"Sing-Box\" end\n\t\ttype = type .. \" \" .. protocol\n\tend\n\tstr = str .. translate(type)\n\treturn str\nend\n\ne = t:option(DummyValue, \"port\", translate(\"Port\"))\n\ne = t:option(Flag, \"log\", translate(\"Log\"))\ne.default = \"1\"\ne.rmempty = false\n\nm:append(Template(\"passwall2/server/log\"))\n\nm:append(Template(\"passwall2/server/users_list_status\"))\nreturn m\n\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/hysteria2.lua",
    "content": "local m, s = ...\r\n\r\nlocal api = require \"luci.passwall2.api\"\r\n\r\nif not api.finded_com(\"hysteria\") then\r\n\treturn\r\nend\r\n\r\nlocal type_name = \"Hysteria2\"\r\n\r\nlocal option_prefix = \"hysteria2_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\n-- [[ Hysteria2 ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"Hysteria2\")\r\n\r\no = s:option(Flag, _n(\"custom\"), translate(\"Use Custom Config\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Listen Port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"obfs\"), translate(\"Obfs Password\"))\r\no.rewrite_option = o.option\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"auth_password\"), translate(\"Auth Password\"))\r\no.password = true\r\no.rewrite_option = o.option\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"udp\"), translate(\"UDP\"))\r\no.default = \"1\"\r\no.rewrite_option = o.option\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"up_mbps\"), translate(\"Max upload Mbps\"))\r\no.rewrite_option = o.option\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"down_mbps\"), translate(\"Max download Mbps\"))\r\no.rewrite_option = o.option\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"ignoreClientBandwidth\"), translate(\"ignoreClientBandwidth\"))\r\no.default = \"0\"\r\no.rewrite_option = o.option\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(FileUpload, _n(\"tls_certificateFile\"), translate(\"Public key absolute path\"), translate(\"as:\") .. \"/etc/ssl/fullchain.pem\")\r\no.default = m:get(s.section, \"tls_certificateFile\") or \"/etc/config/ssl/\" .. arg[1] .. \".pem\"\r\nif o and o:formvalue(arg[1]) then o.default = o:formvalue(arg[1]) end\r\no.validate = function(self, value, t)\r\n\tif value and value ~= \"\" then\r\n\t\tif not nixio.fs.access(value) then\r\n\t\t\treturn nil, translate(\"Can't find this file!\")\r\n\t\telse\r\n\t\t\treturn value\r\n\t\tend\r\n\tend\r\n\treturn nil\r\nend\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(FileUpload, _n(\"tls_keyFile\"), translate(\"Private key absolute path\"), translate(\"as:\") .. \"/etc/ssl/private.key\")\r\no.default = m:get(s.section, \"tls_keyFile\") or \"/etc/config/ssl/\" .. arg[1] .. \".key\"\r\nif o and o:formvalue(arg[1]) then o.default = o:formvalue(arg[1]) end\r\no.validate = function(self, value, t)\r\n\tif value and value ~= \"\" then\r\n\t\tif not nixio.fs.access(value) then\r\n\t\t\treturn nil, translate(\"Can't find this file!\")\r\n\t\telse\r\n\t\t\treturn value\r\n\t\tend\r\n\tend\r\n\treturn nil\r\nend\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(TextValue, _n(\"custom_config\"), translate(\"Custom Config\"))\r\no.rows = 10\r\no.wrap = \"off\"\r\no:depends({ [_n(\"custom\")] = true })\r\no.validate = function(self, value, t)\r\n\tif value and api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, translate(\"Custom Config\") .. \" \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal config_str = m:get(section, \"config_str\")\r\n\tif config_str then\r\n\t\treturn api.base64Decode(config_str)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"config_str\", api.base64Encode(value) or \"\")\r\nend\r\n\r\no = s:option(Flag, _n(\"log\"), translate(\"Log\"))\r\no.default = \"1\"\r\no.rmempty = false\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/ray.lua",
    "content": "local m, s = ...\r\n\r\nlocal api = require \"luci.passwall2.api\"\r\n\r\nif not api.finded_com(\"xray\") then\r\n\treturn\r\nend\r\n\r\nlocal type_name = \"Xray\"\r\n\r\nlocal option_prefix = \"xray_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal x_ss_method_list = {\r\n\t\"none\", \"plain\", \"aes-128-gcm\", \"aes-256-gcm\", \"chacha20-poly1305\", \"xchacha20-poly1305\", \"2022-blake3-aes-128-gcm\", \"2022-blake3-aes-256-gcm\", \"2022-blake3-chacha20-poly1305\"\r\n}\r\n\r\nlocal header_type_list = {\r\n\t\"none\", \"srtp\", \"utp\", \"wechat-video\", \"dtls\", \"wireguard\", \"dns\"\r\n}\r\n\r\n-- [[ Xray ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"Xray\")\r\nif not s.fields[\"type\"].default then\r\n\ts.fields[\"type\"].default = type_name\r\nend\r\n\r\no = s:option(Flag, _n(\"custom\"), translate(\"Use Custom Config\"))\r\n\r\no = s:option(ListValue, _n(\"protocol\"), translate(\"Protocol\"))\r\no:value(\"vmess\", \"Vmess\")\r\no:value(\"vless\", \"VLESS\")\r\no:value(\"http\", \"HTTP\")\r\no:value(\"socks\", \"Socks\")\r\no:value(\"shadowsocks\", \"Shadowsocks\")\r\no:value(\"trojan\", \"Trojan\")\r\no:value(\"hysteria2\", translate(\"Hysteria2\"))\r\no:value(\"dokodemo-door\", \"dokodemo-door\")\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Listen Port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"auth\"), translate(\"Auth\"))\r\no.validate = function(self, value, t)\r\n\tif value and value == \"1\" then\r\n\t\tlocal user_v = s.fields[_n(\"username\")] and s.fields[_n(\"username\")]:formvalue(t) or \"\"\r\n\t\tlocal pass_v = s.fields[_n(\"password\")] and s.fields[_n(\"password\")]:formvalue(t) or \"\"\r\n\t\tif user_v == \"\" or pass_v == \"\" then\r\n\t\t\treturn nil, translate(\"Username and Password must be used together!\")\r\n\t\tend\r\n\tend\r\n\treturn value\r\nend\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\n\r\no = s:option(Value, _n(\"username\"), translate(\"Username\"))\r\no:depends({ [_n(\"auth\")] = true })\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"auth\")] = true })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(ListValue, _n(\"d_protocol\"), translate(\"Destination protocol\"))\r\no:value(\"tcp\", \"TCP\")\r\no:value(\"udp\", \"UDP\")\r\no:value(\"tcp,udp\", \"TCP,UDP\")\r\no:depends({ [_n(\"protocol\")] = \"dokodemo-door\" })\r\n\r\no = s:option(Value, _n(\"d_address\"), translate(\"Destination address\"))\r\no:depends({ [_n(\"protocol\")] = \"dokodemo-door\" })\r\n\r\no = s:option(Value, _n(\"d_port\"), translate(\"Destination port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"protocol\")] = \"dokodemo-door\" })\r\n\r\no = s:option(Value, _n(\"decryption\"), translate(\"Encrypt Method\") .. \" (decryption)\")\r\no.default = \"none\"\r\no.placeholder = \"none\"\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no.validate = function(self, value)\r\n\tvalue = api.trim(value)\r\n\treturn (value == \"\" and \"none\" or value)\r\nend\r\n\r\no = s:option(ListValue, _n(\"x_ss_method\"), translate(\"Encrypt Method\"))\r\no.rewrite_option = \"method\"\r\nfor a, t in ipairs(x_ss_method_list) do o:value(t) end\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(Flag, _n(\"iv_check\"), translate(\"IV Check\"))\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(ListValue, _n(\"ss_network\"), translate(\"Transport\"))\r\no.default = \"tcp,udp\"\r\no:value(\"tcp\", \"TCP\")\r\no:value(\"udp\", \"UDP\")\r\no:value(\"tcp,udp\", \"TCP,UDP\")\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(Flag, _n(\"udp_forward\"), translate(\"UDP Forward\"))\r\no.default = \"1\"\r\no.rmempty = false\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\n\r\no = s:option(DynamicList, _n(\"uuid\"), translate(\"ID\") .. \"/\" .. translate(\"Password\"))\r\nfor i = 1, 3 do\r\n\to:value(api.gen_uuid(1))\r\nend\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\no = s:option(ListValue, _n(\"flow\"), translate(\"flow\"))\r\no.default = \"\"\r\no:value(\"\", translate(\"Disable\"))\r\no:value(\"xtls-rprx-vision\")\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\n\r\n---- [[ hysteria2 ]]\r\no = s:option(Value, _n(\"hysteria2_auth_password\"), translate(\"Auth Password\"))\r\no.password = true\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\n\r\no = s:option(Flag, _n(\"hysteria2_ignore_client_bandwidth\"), translate(\"Client BBR Flow Control\"))\r\no.default = 0\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(Value, _n(\"hysteria2_up_mbps\"), translate(\"Max upload Mbps\"))\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\", [_n(\"hysteria2_ignore_client_bandwidth\")] = false })\r\n\r\no = s:option(Value, _n(\"hysteria2_down_mbps\"), translate(\"Max download Mbps\"))\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\", [_n(\"hysteria2_ignore_client_bandwidth\")] = false })\r\n\r\no = s:option(ListValue, _n(\"hysteria2_obfs_type\"), translate(\"Obfs Type\"))\r\no:value(\"\", translate(\"Disable\"))\r\no:value(\"salamander\")\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(Value, _n(\"hysteria2_obfs_password\"), translate(\"Obfs Password\"))\r\no:depends({ [_n(\"hysteria2_obfs_type\")] = \"salamander\" })\r\n\r\n---- [[ TLS ]]\r\no = s:option(Flag, _n(\"tls\"), translate(\"TLS\"))\r\no.default = 0\r\no.validate = function(self, value, t)\r\n\tif value then\r\n\t\tlocal reality = s.fields[_n(\"reality\")] and s.fields[_n(\"reality\")]:formvalue(t) or nil\r\n\t\tif reality and reality == \"1\" then return value end\r\n\t\tif value == \"1\" then\r\n\t\t\tlocal ca = s.fields[_n(\"tls_certificateFile\")] and s.fields[_n(\"tls_certificateFile\")]:formvalue(t) or \"\"\r\n\t\t\tlocal key = s.fields[_n(\"tls_keyFile\")] and s.fields[_n(\"tls_keyFile\")]:formvalue(t) or \"\"\r\n\t\t\tif ca == \"\" or key == \"\" then\r\n\t\t\t\treturn nil, translate(\"Public key and Private key path can not be empty!\")\r\n\t\t\tend\r\n\t\tend\r\n\t\treturn value\r\n\tend\r\nend\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\n-- [[ REALITY ]] --\r\no = s:option(Flag, _n(\"reality\"), translate(\"REALITY\"))\r\no.default = 0\r\no:depends({ [_n(\"tls\")] = true })\r\n\r\no = s:option(Value, _n(\"reality_private_key\"), translate(\"Private Key\"))\r\no:depends({ [_n(\"reality\")] = true })\r\n\r\no = s:option(DynamicList, _n(\"reality_shortId\"), translate(\"Short Id\"))\r\no:depends({ [_n(\"reality\")] = true })\r\n\r\no = s:option(Value, _n(\"reality_dest\"), translate(\"Dest\"))\r\no.default = \"google.com:443\"\r\no:depends({ [_n(\"reality\")] = true })\r\n\r\no = s:option(DynamicList, _n(\"reality_serverNames\"), translate(\"serverNames\"))\r\no:depends({ [_n(\"reality\")] = true })\r\nfunction o.write(self, section, value)\r\n\tlocal t = {}\r\n\tlocal t2 = {}\r\n\tif type(value) == \"table\" then\r\n\t\tlocal x\r\n\t\tfor _, x in ipairs(value) do\r\n\t\t\tif x and #x > 0 then\r\n\t\t\t\tif not t2[x] then\r\n\t\t\t\t\tt2[x] = x\r\n\t\t\t\t\tt[#t+1] = x\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\tend\r\n\telse\r\n\t\tt = { value }\r\n\tend\r\n\treturn DynamicList.write(self, section, t)\r\nend\r\n\r\no = s:option(ListValue, _n(\"alpn\"), translate(\"alpn\"))\r\no.default = \"h2,http/1.1\"\r\no:value(\"h3\")\r\no:value(\"h2\")\r\no:value(\"h3,h2\")\r\no:value(\"http/1.1\")\r\no:value(\"h2,http/1.1\")\r\no:value(\"h3,h2,http/1.1\")\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\n\r\no = s:option(Flag, _n(\"use_mldsa65Seed\"), translate(\"ML-DSA-65\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"reality\")] = true })\r\n\r\no = s:option(TextValue, _n(\"reality_mldsa65Seed\"), \"ML-DSA-65 \" .. translate(\"Private Key\"))\r\no.default = \"\"\r\no.rows = 5\r\no.wrap = \"soft\"\r\no:depends({ [_n(\"use_mldsa65Seed\")] = true })\r\no.validate = function(self, value)\r\n\treturn api.trim(value:gsub(\"[\\r\\n]\", \"\"))\r\nend\r\n\r\n-- o = s:option(Value, _n(\"minversion\"), translate(\"minversion\"))\r\n-- o.default = \"1.3\"\r\n-- o:value(\"1.3\")\r\n--o:depends({ [_n(\"tls\")] = true })\r\n\r\n-- [[ TLS ]] --\r\no = s:option(FileUpload, _n(\"tls_certificateFile\"), translate(\"Public key absolute path\"), translate(\"as:\") .. \"/etc/ssl/fullchain.pem\")\r\no.default = m:get(s.section, \"tls_certificateFile\") or \"/etc/config/ssl/\" .. arg[1] .. \".pem\"\r\nif o and o:formvalue(arg[1]) then o.default = o:formvalue(arg[1]) end\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\no.validate = function(self, value, t)\r\n\tif value and value ~= \"\" then\r\n\t\tif not nixio.fs.access(value) then\r\n\t\t\treturn nil, translate(\"Can't find this file!\")\r\n\t\telse\r\n\t\t\treturn value\r\n\t\tend\r\n\tend\r\n\treturn nil\r\nend\r\n\r\no = s:option(FileUpload, _n(\"tls_keyFile\"), translate(\"Private key absolute path\"), translate(\"as:\") .. \"/etc/ssl/private.key\")\r\no.default = m:get(s.section, \"tls_keyFile\") or \"/etc/config/ssl/\" .. arg[1] .. \".key\"\r\nif o and o:formvalue(arg[1]) then o.default = o:formvalue(arg[1]) end\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\no.validate = function(self, value, t)\r\n\tif value and value ~= \"\" then\r\n\t\tif not nixio.fs.access(value) then\r\n\t\t\treturn nil, translate(\"Can't find this file!\")\r\n\t\telse\r\n\t\t\treturn value\r\n\t\tend\r\n\tend\r\n\treturn nil\r\nend\r\n\r\no = s:option(Flag, _n(\"ech\"), translate(\"ECH\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\n\r\no = s:option(TextValue, _n(\"ech_key\"), translate(\"ECH Key\"))\r\no.default = \"\"\r\no.rows = 5\r\no.wrap = \"soft\"\r\no:depends({ [_n(\"ech\")] = true })\r\no.validate = function(self, value)\r\n\treturn api.trim(value:gsub(\"[\\r\\n]\", \"\"))\r\nend\r\n\r\no = s:option(ListValue, _n(\"transport\"), translate(\"Transport\"))\r\no:value(\"raw\", \"RAW\")\r\no:value(\"mkcp\", \"mKCP\")\r\no:value(\"ws\", \"WebSocket\")\r\no:value(\"grpc\", \"gRPC\")\r\no:value(\"httpupgrade\", \"HttpUpgrade\")\r\no:value(\"xhttp\", \"XHTTP\")\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\n-- [[ WebSocket ]]--\r\no = s:option(Value, _n(\"ws_host\"), translate(\"WebSocket Host\"))\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\no = s:option(Value, _n(\"ws_path\"), translate(\"WebSocket Path\"))\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\n-- [[ HttpUpgrade ]]--\r\no = s:option(Value, _n(\"httpupgrade_host\"), translate(\"HttpUpgrade Host\"))\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\n\r\no = s:option(Value, _n(\"httpupgrade_path\"), translate(\"HttpUpgrade Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\n\r\n-- [[ XHTTP ]]--\r\no = s:option(Value, _n(\"xhttp_host\"), translate(\"XHTTP Host\"))\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\n\r\no = s:option(Value, _n(\"xhttp_path\"), translate(\"XHTTP Path\"))\r\no.placeholder = \"/\"\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\n\r\no = s:option(Value, _n(\"xhttp_maxuploadsize\"), translate(\"maxUploadSize\"))\r\no.default = \"1000000\"\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\n\r\no = s:option(Value, _n(\"xhttp_maxconcurrentuploads\"), translate(\"maxConcurrentUploads\"))\r\no.default = \"10\"\r\no:depends({ [_n(\"transport\")] = \"xhttp\" })\r\n\r\no = s:option(Value, _n(\"splithttp_maxuploadsize\"), translate(\"maxUploadSize\"))\r\no.default = \"1000000\"\r\no:depends({ [_n(\"transport\")] = \"splithttp\" })\r\n\r\no = s:option(Value, _n(\"splithttp_maxconcurrentuploads\"), translate(\"maxConcurrentUploads\"))\r\no.default = \"10\"\r\no:depends({ [_n(\"transport\")] = \"splithttp\" })\r\n\r\n-- [[ TCP ]]--\r\n\r\no = s:option(ListValue, _n(\"tcp_guise\"), translate(\"Camouflage Type\"))\r\no:value(\"none\", \"none\")\r\no:value(\"http\", \"http\")\r\no:depends({ [_n(\"transport\")] = \"raw\" })\r\n\r\no = s:option(DynamicList, _n(\"tcp_guise_http_host\"), translate(\"HTTP Host\"))\r\no:depends({ [_n(\"tcp_guise\")] = \"http\" })\r\n\r\no = s:option(DynamicList, _n(\"tcp_guise_http_path\"), translate(\"HTTP Path\"))\r\no:depends({ [_n(\"tcp_guise\")] = \"http\" })\r\n\r\n-- [[ mKCP ]]--\r\n\r\no = s:option(ListValue, _n(\"mkcp_guise\"), translate(\"Camouflage Type\"), translate('<br />none: default, no masquerade, data sent is packets with no characteristics.<br />srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime).<br />utp: packets disguised as uTP will be recognized as bittorrent downloaded data.<br />wechat-video: packets disguised as WeChat video calls.<br />dtls: disguised as DTLS 1.2 packet.<br />wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)<br />dns: Disguising traffic as DNS requests.'))\r\nfor a, t in ipairs(header_type_list) do o:value(t) end\r\no:depends({ [_n(\"transport\")] = \"mkcp\" })\r\n\r\no = s:option(Value, _n(\"mkcp_domain\"), translate(\"Camouflage Domain\"), translate(\"Use it together with the DNS disguised type. You can fill in any domain.\"))\r\no:depends({ [_n(\"mkcp_guise\")] = \"dns\" })\r\n\r\no = s:option(Value, _n(\"mkcp_mtu\"), translate(\"KCP MTU\"))\r\no.datatype = \"uinteger\"\r\no.default = 1350\r\no:depends({ [_n(\"transport\")] = \"mkcp\" })\r\n\r\no = s:option(Value, _n(\"mkcp_seed\"), translate(\"KCP Seed\"))\r\no:depends({ [_n(\"transport\")] = \"mkcp\" })\r\n\r\n-- [[ gRPC ]]--\r\no = s:option(Value, _n(\"grpc_serviceName\"), \"ServiceName\")\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\n--[[FinalMask]]\r\no = s:option(Flag, _n(\"use_finalmask\"), \"FinalMask\")\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false, [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"custom\")] = false, [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"custom\")] = false, [_n(\"protocol\")] = \"trojan\" })\r\no:depends({ [_n(\"custom\")] = false, [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"custom\")] = false, [_n(\"protocol\")] = \"wireguard\" })\r\no:depends({ [_n(\"custom\")] = false, [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(TextValue, _n(\"finalmask\"), \"FinalMask JSON\")\r\no:depends({ [_n(\"use_finalmask\")] = true })\r\no.rows = 10\r\no.wrap = \"off\"\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal raw = m:get(section, \"finalmask\")\r\n\tif raw then\r\n\t\treturn api.base64Decode(raw)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"finalmask\", api.base64Encode(value) or \"\")\r\nend\r\no.validate = function(self, value)\r\n\tvalue = api.trim(value):gsub(\"\\r\\n\", \"\\n\"):gsub(\"^[ \\t]*\\n\", \"\"):gsub(\"\\n[ \\t]*$\", \"\"):gsub(\"\\n[ \\t]*\\n\", \"\\n\")\r\n\tif api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, \"FinalMask \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\n\r\n--[[acceptProxyProtocol]]\r\no = s:option(Flag, _n(\"acceptProxyProtocol\"), translate(\"acceptProxyProtocol\"), translate(\"Whether to receive PROXY protocol, when this node want to be fallback or forwarded by proxy, it must be enable, otherwise it cannot be used.\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\n--[[Fast Open]]\r\no = s:option(Flag, _n(\"tcp_fast_open\"), \"TCP \" .. translate(\"Fast Open\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"protocol\")] = \"vmess\", [_n(\"custom\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"custom\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\", [_n(\"custom\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"trojan\", [_n(\"custom\")] = false })\r\n\r\n-- [[ Fallback ]]--\r\no = s:option(Flag, _n(\"fallback\"), translate(\"Fallback\"))\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"transport\")] = \"raw\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\", [_n(\"transport\")] = \"raw\" })\r\n\r\n--[[\r\no = s:option(Value, _n(\"fallback_alpn\"), \"Fallback alpn\")\r\no:depends({ [_n(\"fallback\")] = true })\r\n\r\no = s:option(Value, _n(\"fallback_path\"), \"Fallback path\")\r\no:depends({ [_n(\"fallback\")] = true })\r\n\r\no = s:option(Value, _n(\"fallback_dest\"), \"Fallback dest\")\r\no:depends({ [_n(\"fallback\")] = true })\r\n\r\no = s:option(Value, _n(\"fallback_xver\"), \"Fallback xver\")\r\no.default = 0\r\no:depends({ [_n(\"fallback\")] = true })\r\n]]--\r\n\r\no = s:option(DynamicList, _n(\"fallback_list\"), \"Fallback\", translate(\"format: dest,path,xver\"))\r\no:depends({ [_n(\"fallback\")] = true })\r\n\r\no = s:option(Flag, _n(\"bind_local\"), translate(\"Bind Local\"), translate(\"When selected, it can only be accessed localhost.\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"accept_lan\"), translate(\"Accept LAN Access\"), translate(\"When selected, it can accessed lan , this will not be safe!\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\nlocal nodes_table = {}\r\nfor k, e in ipairs(api.get_valid_nodes()) do\r\n\tif e.node_type == \"normal\" and e.type == type_name then\r\n\t\tnodes_table[#nodes_table + 1] = {\r\n\t\t\tid = e[\".name\"],\r\n\t\t\tremarks = e[\"remark\"],\r\n\t\t\tgroup = e[\"group\"]\r\n\t\t}\r\n\tend\r\nend\r\n\r\no = s:option(ListValue, _n(\"outbound_node\"), translate(\"outbound node\"))\r\no:value(\"\", translate(\"Close\"))\r\no:value(\"_socks\", translate(\"Custom Socks\"))\r\no:value(\"_http\", translate(\"Custom HTTP\"))\r\no:value(\"_iface\", translate(\"Custom Interface\"))\r\no.template = api.appname .. \"/cbi/nodes_listvalue\"\r\no.group = {\"\",\"\",\"\",\"\"}\r\nfor k, v in pairs(nodes_table) do\r\n\to:value(v.id, v.remarks)\r\n\to.group[#o.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\r\nend\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"outbound_node_address\"), translate(\"Address (Support Domain Name)\"))\r\no:depends({ [_n(\"outbound_node\")] = \"_socks\"})\r\no:depends({ [_n(\"outbound_node\")] = \"_http\"})\r\n\r\no = s:option(Value, _n(\"outbound_node_port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"outbound_node\")] = \"_socks\"})\r\no:depends({ [_n(\"outbound_node\")] = \"_http\"})\r\n\r\no = s:option(Value, _n(\"outbound_node_username\"), translate(\"Username\"))\r\no:depends({ [_n(\"outbound_node\")] = \"_socks\"})\r\no:depends({ [_n(\"outbound_node\")] = \"_http\"})\r\n\r\no = s:option(Value, _n(\"outbound_node_password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"outbound_node\")] = \"_socks\"})\r\no:depends({ [_n(\"outbound_node\")] = \"_http\"})\r\n\r\no = s:option(Value, _n(\"outbound_node_iface\"), translate(\"Interface\"))\r\no.default = \"eth1\"\r\no:depends({ [_n(\"outbound_node\")] = \"_iface\"})\r\n\r\no = s:option(TextValue, _n(\"custom_config\"), translate(\"Custom Config\"))\r\no.rows = 10\r\no.wrap = \"off\"\r\no:depends({ [_n(\"custom\")] = true })\r\no.validate = function(self, value, t)\r\n\tif value and api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, translate(\"Custom Config\") .. \" \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal config_str = m:get(section, \"config_str\")\r\n\tif config_str then\r\n\t\treturn api.base64Decode(config_str)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"config_str\", api.base64Encode(value) or \"\")\r\nend\r\n\r\no = s:option(Flag, _n(\"log\"), translate(\"Log\"))\r\no.default = \"1\"\r\no.rmempty = false\r\n\r\no = s:option(ListValue, _n(\"loglevel\"), translate(\"Log Level\"))\r\no.default = \"warning\"\r\no:value(\"debug\")\r\no:value(\"info\")\r\no:value(\"warning\")\r\no:value(\"error\")\r\no:depends({ [_n(\"log\")] = true })\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/sing-box.lua",
    "content": "local m, s = ...\r\n\r\nlocal api = require \"luci.passwall2.api\"\r\n\r\nlocal singbox_bin = api.finded_com(\"sing-box\")\r\n\r\nif not singbox_bin then\r\n\treturn\r\nend\r\n\r\nlocal fs = api.fs\r\n\r\nlocal singbox_tags = luci.sys.exec(singbox_bin .. \" version  | grep 'Tags:' | awk '{print $2}'\")\r\n\r\nlocal type_name = \"sing-box\"\r\n\r\nlocal option_prefix = \"singbox_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal ss_method_list = {\r\n\t\"none\", \"aes-128-gcm\", \"aes-192-gcm\", \"aes-256-gcm\", \"chacha20-ietf-poly1305\", \"xchacha20-ietf-poly1305\",\r\n\t\"2022-blake3-aes-128-gcm\", \"2022-blake3-aes-256-gcm\", \"2022-blake3-chacha20-poly1305\"\r\n}\r\n\r\n-- [[ Sing-Box ]]\r\n\r\ns.fields[\"type\"]:value(type_name, \"Sing-Box\")\r\nif not s.fields[\"type\"].default then\r\n\ts.fields[\"type\"].default = type_name\r\nend\r\n\r\no = s:option(Flag, _n(\"custom\"), translate(\"Use Custom Config\"))\r\n\r\no = s:option(ListValue, _n(\"protocol\"), translate(\"Protocol\"))\r\no:value(\"mixed\", \"Mixed\")\r\no:value(\"socks\", \"Socks\")\r\no:value(\"http\", \"HTTP\")\r\no:value(\"shadowsocks\", \"Shadowsocks\")\r\no:value(\"vmess\", \"Vmess\")\r\no:value(\"vless\", \"VLESS\")\r\no:value(\"trojan\", \"Trojan\")\r\no:value(\"naive\", \"Naive\")\r\nif singbox_tags:find(\"with_quic\") then\r\n\to:value(\"hysteria\", \"Hysteria\")\r\nend\r\nif singbox_tags:find(\"with_quic\") then\r\n\to:value(\"tuic\", \"TUIC\")\r\nend\r\nif singbox_tags:find(\"with_quic\") then\r\n\to:value(\"hysteria2\", \"Hysteria2\")\r\nend\r\no:value(\"anytls\", \"AnyTLS\")\r\no:value(\"direct\", \"Direct\")\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Listen Port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"auth\"), translate(\"Auth\"))\r\no.validate = function(self, value, t)\r\n\tif value and value == \"1\" then\r\n\t\tlocal user_v = s.fields[_n(\"username\")] and s.fields[_n(\"username\")]:formvalue(t) or \"\"\r\n\t\tlocal pass_v = s.fields[_n(\"password\")] and s.fields[_n(\"password\")]:formvalue(t) or \"\"\r\n\t\tif user_v == \"\" or pass_v == \"\" then\r\n\t\t\treturn nil, translate(\"Username and Password must be used together!\")\r\n\t\tend\r\n\tend\r\n\treturn value\r\nend\r\no:depends({ [_n(\"protocol\")] = \"mixed\" })\r\no:depends({ [_n(\"protocol\")] = \"socks\" })\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\n\r\no = s:option(Value, _n(\"username\"), translate(\"Username\"))\r\no:depends({ [_n(\"auth\")] = true })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\no:depends({ [_n(\"protocol\")] = \"anytls\" })\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"auth\")] = true })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"anytls\" })\r\n\r\nif singbox_tags:find(\"with_quic\") then\r\n\to = s:option(Value, _n(\"hysteria_up_mbps\"), translate(\"Max upload Mbps\"))\r\n\to.default = \"100\"\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_down_mbps\"), translate(\"Max download Mbps\"))\r\n\to.default = \"100\"\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_obfs\"), translate(\"Obfs Password\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(ListValue, _n(\"hysteria_auth_type\"), translate(\"Auth Type\"))\r\n\to:value(\"disable\", translate(\"Disable\"))\r\n\to:value(\"string\", translate(\"STRING\"))\r\n\to:value(\"base64\", translate(\"BASE64\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_auth_password\"), translate(\"Auth Password\"))\r\n\to.password = true\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\", [_n(\"hysteria_auth_type\")] = \"string\"})\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\", [_n(\"hysteria_auth_type\")] = \"base64\"})\r\n\r\n\to = s:option(Value, _n(\"hysteria_recv_window_conn\"), translate(\"QUIC stream receive window\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_recv_window_client\"), translate(\"QUIC connection receive window\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria_max_conn_client\"), translate(\"QUIC concurrent bidirectional streams\"))\r\n\to.default = \"1024\"\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n\to = s:option(Flag, _n(\"hysteria_disable_mtu_discovery\"), translate(\"Disable MTU detection\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\nend\r\n\r\nif singbox_tags:find(\"with_quic\") then\r\n\to = s:option(ListValue, _n(\"tuic_congestion_control\"), translate(\"Congestion control algorithm\"))\r\n\to.default = \"cubic\"\r\n\to:value(\"bbr\", translate(\"BBR\"))\r\n\to:value(\"cubic\", translate(\"CUBIC\"))\r\n\to:value(\"new_reno\", translate(\"New Reno\"))\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\n\to = s:option(Flag, _n(\"tuic_zero_rtt_handshake\"), translate(\"Enable 0-RTT QUIC handshake\"))\r\n\to.default = 0\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\n\to = s:option(Value, _n(\"tuic_heartbeat\"), translate(\"Heartbeat interval(second)\"))\r\n\to.datatype = \"uinteger\"\r\n\to.default = \"3\"\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\n\to = s:option(ListValue, _n(\"tuic_alpn\"), translate(\"QUIC TLS ALPN\"))\r\n\to.default = \"default\"\r\n\to:value(\"default\", translate(\"Default\"))\r\n\to:value(\"h3\")\r\n\to:value(\"h2\")\r\n\to:value(\"h3,h2\")\r\n\to:value(\"http/1.1\")\r\n\to:value(\"h2,http/1.1\")\r\n\to:value(\"h3,h2,http/1.1\")\r\n\to:value(\"spdy/3.1\")\r\n\to:value(\"h3,spdy/3.1\")\r\n\to:depends({ [_n(\"protocol\")] = \"tuic\" })\r\nend\r\n\r\nif singbox_tags:find(\"with_quic\") then\r\n\to = s:option(Value, _n(\"hysteria2_auth_password\"), translate(\"Auth Password\"))\r\n\to.password = true\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\"})\r\n\r\n\to = s:option(Flag, _n(\"hysteria2_ignore_client_bandwidth\"), translate(\"Client BBR Flow Control\"), translate(\"Commands the client to use the BBR flow control algorithm\"))\r\n\to.default = 0\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria2_up_mbps\"), translate(\"Max upload Mbps\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\", [_n(\"hysteria2_ignore_client_bandwidth\")] = false })\r\n\r\n\to = s:option(Value, _n(\"hysteria2_down_mbps\"), translate(\"Max download Mbps\"))\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\", [_n(\"hysteria2_ignore_client_bandwidth\")] = false })\r\n\r\n\to = s:option(ListValue, _n(\"hysteria2_obfs_type\"), translate(\"Obfs Type\"))\r\n\to:value(\"\", translate(\"Disable\"))\r\n\to:value(\"salamander\")\r\n\to:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\n\to = s:option(Value, _n(\"hysteria2_obfs_password\"), translate(\"Obfs Password\"))\r\n\to:depends({ [_n(\"hysteria2_obfs_type\")] = \"salamander\" })\r\nend\r\n\r\no = s:option(ListValue, _n(\"d_protocol\"), translate(\"Destination protocol\"))\r\no:value(\"tcp\", \"TCP\")\r\no:value(\"udp\", \"UDP\")\r\no:value(\"tcp,udp\", \"TCP,UDP\")\r\no:depends({ [_n(\"protocol\")] = \"direct\" })\r\n\r\no = s:option(Value, _n(\"d_address\"), translate(\"Destination address\"))\r\no:depends({ [_n(\"protocol\")] = \"direct\" })\r\n\r\no = s:option(Value, _n(\"d_port\"), translate(\"Destination port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"protocol\")] = \"direct\" })\r\n\r\no = s:option(Value, _n(\"decryption\"), translate(\"Encrypt Method\"))\r\no.default = \"none\"\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\n\r\no = s:option(ListValue, _n(\"ss_method\"), translate(\"Encrypt Method\"))\r\no.rewrite_option = \"method\"\r\nfor a, t in ipairs(ss_method_list) do o:value(t) end\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\n\r\no = s:option(DynamicList, _n(\"uuid\"), translate(\"ID\") .. \"/\" .. translate(\"Password\"))\r\nfor i = 1, 3 do\r\n\to:value(api.gen_uuid(1))\r\nend\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\n\r\no = s:option(ListValue, _n(\"flow\"), translate(\"flow\"))\r\no.default = \"\"\r\no:value(\"\", translate(\"Disable\"))\r\no:value(\"xtls-rprx-vision\")\r\no:depends({ [_n(\"protocol\")] = \"vless\" , [_n(\"tls\")] = true })\r\n\r\no = s:option(Flag, _n(\"tls\"), translate(\"TLS\"))\r\no.default = 0\r\no.validate = function(self, value, t)\r\n\tif value then\r\n\t\tlocal reality = s.fields[_n(\"reality\")] and s.fields[_n(\"reality\")]:formvalue(t) or nil\r\n\t\tif reality and reality == \"1\" then return value end\r\n\t\tif value == \"1\" then\r\n\t\t\tlocal ca = s.fields[_n(\"tls_certificateFile\")] and s.fields[_n(\"tls_certificateFile\")]:formvalue(t) or \"\"\r\n\t\t\tlocal key = s.fields[_n(\"tls_keyFile\")] and s.fields[_n(\"tls_keyFile\")]:formvalue(t) or \"\"\r\n\t\t\tif ca == \"\" or key == \"\" then\r\n\t\t\t\treturn nil, translate(\"Public key and Private key path can not be empty!\")\r\n\t\t\tend\r\n\t\tend\r\n\t\treturn value\r\n\tend\r\nend\r\no:depends({ [_n(\"protocol\")] = \"http\" })\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\no:depends({ [_n(\"protocol\")] = \"anytls\" })\r\n\r\n-- https://github.com/SagerNet/sing-box/commit/d2a04c4e41e6cef0937331cb6d10211f431caaab\r\nif singbox_tags:find(\"with_utls\") then\r\n\t-- [[ REALITY ]] --\r\n\to = s:option(Flag, _n(\"reality\"), translate(\"REALITY\"))\r\n\to.default = 0\r\n\to:depends({ [_n(\"protocol\")] = \"http\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"vmess\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"trojan\", [_n(\"tls\")] = true })\r\n\to:depends({ [_n(\"protocol\")] = \"anytls\", [_n(\"tls\")] = true })\r\n\t\r\n\to = s:option(Value, _n(\"reality_private_key\"), translate(\"Private Key\"))\r\n\to:depends({ [_n(\"reality\")] = true })\r\n\t\r\n\to = s:option(Value, _n(\"reality_shortId\"), translate(\"Short Id\"))\r\n\to:depends({ [_n(\"reality\")] = true })\r\n\r\n\to = s:option(Value, _n(\"reality_handshake_server\"), translate(\"Handshake Server\"))\r\n\to.default = \"google.com\"\r\n\to:depends({ [_n(\"reality\")] = true })\r\n\r\n\to = s:option(Value, _n(\"reality_handshake_server_port\"), translate(\"Handshake Server Port\"))\r\n\to.datatype = \"port\"\r\n\to.default = \"443\"\r\n\to:depends({ [_n(\"reality\")] = true })\r\nend\r\n\r\no = s:option(ListValue, _n(\"alpn\"), translate(\"ALPN\"))\r\no.default = \"default\"\r\no:value(\"default\", translate(\"Default\"))\r\no:value(\"h3\")\r\no:value(\"h2\")\r\no:value(\"h3,h2\")\r\no:value(\"http/1.1\")\r\no:value(\"h2,http/1.1\")\r\no:value(\"h3,h2,http/1.1\")\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\n\r\n-- [[ TLS ]] --\r\n\r\no = s:option(FileUpload, _n(\"tls_certificateFile\"), translate(\"Public key absolute path\"), translate(\"as:\") .. \"/etc/ssl/fullchain.pem\")\r\no.default = m:get(s.section, \"tls_certificateFile\") or \"/etc/config/ssl/\" .. arg[1] .. \".pem\"\r\nif o and o:formvalue(arg[1]) then o.default = o:formvalue(arg[1]) end\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\no.validate = function(self, value, t)\r\n\tif value and value ~= \"\" then\r\n\t\tif not nixio.fs.access(value) then\r\n\t\t\treturn nil, translate(\"Can't find this file!\")\r\n\t\telse\r\n\t\t\treturn value\r\n\t\tend\r\n\tend\r\n\treturn nil\r\nend\r\n\r\no = s:option(FileUpload, _n(\"tls_keyFile\"), translate(\"Private key absolute path\"), translate(\"as:\") .. \"/etc/ssl/private.key\")\r\no.default = m:get(s.section, \"tls_keyFile\") or \"/etc/config/ssl/\" .. arg[1] .. \".key\"\r\nif o and o:formvalue(arg[1]) then o.default = o:formvalue(arg[1]) end\r\no:depends({ [_n(\"tls\")] = true, [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\no.validate = function(self, value, t)\r\n\tif value and value ~= \"\" then\r\n\t\tif not nixio.fs.access(value) then\r\n\t\t\treturn nil, translate(\"Can't find this file!\")\r\n\t\telse\r\n\t\t\treturn value\r\n\t\tend\r\n\tend\r\n\treturn nil\r\nend\r\n\r\no = s:option(Flag, _n(\"ech\"), translate(\"ECH\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"tls\")] = true, [_n(\"flow\")] = \"\", [_n(\"reality\")] = false })\r\no:depends({ [_n(\"protocol\")] = \"naive\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria\" })\r\no:depends({ [_n(\"protocol\")] = \"tuic\" })\r\no:depends({ [_n(\"protocol\")] = \"hysteria2\" })\r\n\r\no = s:option(TextValue, _n(\"ech_key\"), translate(\"ECH Key\"))\r\no.default = \"\"\r\no.rows = 5\r\no.wrap = \"off\"\r\no:depends({ [_n(\"ech\")] = true })\r\no.validate = function(self, value)\r\n\tvalue = value:gsub(\"^%s+\", \"\"):gsub(\"%s+$\",\"\\n\"):gsub(\"\\r\\n\",\"\\n\"):gsub(\"[ \\t]*\\n[ \\t]*\", \"\\n\")\r\n\tvalue = value:gsub(\"^%s*\\n\", \"\")\r\n\tif value:sub(-1) == \"\\n\" then  \r\n\t\tvalue = value:sub(1, -2)  \r\n\tend\r\n\treturn value\r\nend\r\n\r\no = s:option(ListValue, _n(\"transport\"), translate(\"Transport\"))\r\no:value(\"tcp\", \"TCP\")\r\no:value(\"http\", \"HTTP\")\r\no:value(\"ws\", \"WebSocket\")\r\no:value(\"httpupgrade\", \"HTTPUpgrade\")\r\no:value(\"quic\", \"QUIC\")\r\no:value(\"grpc\", \"gRPC\")\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\n-- [[ HTTP ]]--\r\n\r\no = s:option(DynamicList, _n(\"http_host\"), translate(\"HTTP Host\"))\r\no:depends({ [_n(\"transport\")] = \"http\" })\r\n\r\no = s:option(Value, _n(\"http_path\"), translate(\"HTTP Path\"))\r\no:depends({ [_n(\"transport\")] = \"http\" })\r\n\r\n-- [[ WebSocket ]]--\r\n\r\no = s:option(Value, _n(\"ws_host\"), translate(\"WebSocket Host\"))\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\no = s:option(Value, _n(\"ws_path\"), translate(\"WebSocket Path\"))\r\no:depends({ [_n(\"transport\")] = \"ws\" })\r\n\r\n-- [[ HTTPUpgrade ]]--\r\n\r\no = s:option(Value, _n(\"httpupgrade_host\"), translate(\"HTTPUpgrade Host\"))\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\n\r\no = s:option(Value, _n(\"httpupgrade_path\"), translate(\"HTTPUpgrade Path\"))\r\no:depends({ [_n(\"transport\")] = \"httpupgrade\" })\r\n\r\n-- [[ gRPC ]]--\r\no = s:option(Value, _n(\"grpc_serviceName\"), \"ServiceName\")\r\no:depends({ [_n(\"transport\")] = \"grpc\" })\r\n\r\n-- [[ Mux ]]--\r\no = s:option(Flag, _n(\"mux\"), translate(\"Mux\"))\r\no.rmempty = false\r\no:depends({ [_n(\"protocol\")] = \"vmess\" })\r\no:depends({ [_n(\"protocol\")] = \"vless\", [_n(\"flow\")] = \"\" })\r\no:depends({ [_n(\"protocol\")] = \"shadowsocks\" })\r\no:depends({ [_n(\"protocol\")] = \"trojan\" })\r\n\r\n-- [[ TCP Brutal ]]--\r\no = s:option(Flag, _n(\"tcpbrutal\"), translate(\"TCP Brutal\"))\r\no.default = 0\r\no:depends({ [_n(\"mux\")] = true })\r\n\r\no = s:option(Value, _n(\"tcpbrutal_up_mbps\"), translate(\"Max upload Mbps\"))\r\no.default = \"10\"\r\no:depends({ [_n(\"tcpbrutal\")] = true })\r\n\r\no = s:option(Value, _n(\"tcpbrutal_down_mbps\"), translate(\"Max download Mbps\"))\r\no.default = \"50\"\r\no:depends({ [_n(\"tcpbrutal\")] = true })\r\n\r\no = s:option(Flag, _n(\"bind_local\"), translate(\"Bind Local\"), translate(\"When selected, it can only be accessed localhost.\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"accept_lan\"), translate(\"Accept LAN Access\"), translate(\"When selected, it can accessed lan , this will not be safe!\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\nlocal nodes_table = {}\r\nfor k, e in ipairs(api.get_valid_nodes()) do\r\n\tif e.node_type == \"normal\" and e.type == type_name then\r\n\t\tnodes_table[#nodes_table + 1] = {\r\n\t\t\tid = e[\".name\"],\r\n\t\t\tremarks = e[\"remark\"],\r\n\t\t\tgroup = e[\"group\"]\r\n\t\t}\r\n\tend\r\nend\r\n\r\no = s:option(ListValue, _n(\"outbound_node\"), translate(\"outbound node\"))\r\no:value(\"\", translate(\"Close\"))\r\no:value(\"_socks\", translate(\"Custom Socks\"))\r\no:value(\"_http\", translate(\"Custom HTTP\"))\r\no:value(\"_iface\", translate(\"Custom Interface\"))\r\no.template = api.appname .. \"/cbi/nodes_listvalue\"\r\no.group = {\"\",\"\",\"\",\"\"}\r\nfor k, v in pairs(nodes_table) do\r\n\to:value(v.id, v.remarks)\r\n\to.group[#o.group+1] = (v.group and v.group ~= \"\") and v.group or translate(\"default\")\r\nend\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"outbound_node_address\"), translate(\"Address (Support Domain Name)\"))\r\no:depends({ [_n(\"outbound_node\")] = \"_socks\" })\r\no:depends({ [_n(\"outbound_node\")] = \"_http\" })\r\n\r\no = s:option(Value, _n(\"outbound_node_port\"), translate(\"Port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"outbound_node\")] = \"_socks\" })\r\no:depends({ [_n(\"outbound_node\")] = \"_http\" })\r\n\r\no = s:option(Value, _n(\"outbound_node_username\"), translate(\"Username\"))\r\no:depends({ [_n(\"outbound_node\")] = \"_socks\" })\r\no:depends({ [_n(\"outbound_node\")] = \"_http\" })\r\n\r\no = s:option(Value, _n(\"outbound_node_password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"outbound_node\")] = \"_socks\" })\r\no:depends({ [_n(\"outbound_node\")] = \"_http\" })\r\n\r\no = s:option(Value, _n(\"outbound_node_iface\"), translate(\"Interface\"))\r\no.default = \"eth1\"\r\no:depends({ [_n(\"outbound_node\")] = \"_iface\" })\r\n\r\no = s:option(TextValue, _n(\"custom_config\"), translate(\"Custom Config\"))\r\no.rows = 10\r\no.wrap = \"off\"\r\no:depends({ [_n(\"custom\")] = true })\r\no.validate = function(self, value, t)\r\n\tif value and api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, translate(\"Custom Config\") .. \" \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal config_str = m:get(section, \"config_str\")\r\n\tif config_str then\r\n\t\treturn api.base64Decode(config_str)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"config_str\", api.base64Encode(value) or \"\")\r\nend\r\n\r\no = s:option(Flag, _n(\"log\"), translate(\"Log\"))\r\no.default = \"1\"\r\no.rmempty = false\r\n\r\no = s:option(ListValue, _n(\"loglevel\"), translate(\"Log Level\"))\r\no.default = \"info\"\r\no:value(\"debug\")\r\no:value(\"info\")\r\no:value(\"warn\")\r\no:value(\"error\")\r\no:depends({ [_n(\"log\")] = true })\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/ss-rust.lua",
    "content": "local m, s = ...\r\n\r\nlocal api = require \"luci.passwall2.api\"\r\n\r\nif not api.is_finded(\"ssserver\") then\r\n\treturn\r\nend\r\n\r\nlocal type_name = \"SS-Rust\"\r\n\r\nlocal option_prefix = \"ssrust_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal ssrust_encrypt_method_list = {\r\n\t\"plain\", \"none\",\r\n\t\"aes-128-gcm\", \"aes-256-gcm\", \"chacha20-ietf-poly1305\",\r\n\t\"2022-blake3-aes-128-gcm\", \"2022-blake3-aes-256-gcm\", \"2022-blake3-chacha8-poly1305\", \"2022-blake3-chacha20-poly1305\"\r\n}\r\n\r\n-- [[ Shadowsocks Rust ]]\r\n\r\ns.fields[\"type\"]:value(type_name, translate(\"Shadowsocks Rust\"))\r\n\r\no = s:option(Flag, _n(\"custom\"), translate(\"Use Custom Config\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Listen Port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(ListValue, _n(\"method\"), translate(\"Encrypt Method\"))\r\nfor a, t in ipairs(ssrust_encrypt_method_list) do o:value(t) end\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"timeout\"), translate(\"Connection Timeout\"))\r\no.datatype = \"uinteger\"\r\no.default = 300\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"tcp_fast_open\"), \"TCP \" .. translate(\"Fast Open\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(TextValue, _n(\"custom_config\"), translate(\"Custom Config\"))\r\no.rows = 10\r\no.wrap = \"off\"\r\no:depends({ [_n(\"custom\")] = true })\r\no.validate = function(self, value, t)\r\n\tif value and api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, translate(\"Custom Config\") .. \" \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal config_str = m:get(section, \"config_str\")\r\n\tif config_str then\r\n\t\treturn api.base64Decode(config_str)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"config_str\", api.base64Encode(value) or \"\")\r\nend\r\n\r\no = s:option(Flag, _n(\"log\"), translate(\"Log\"))\r\no.default = \"1\"\r\no.rmempty = false\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/ss.lua",
    "content": "local m, s = ...\r\n\r\nlocal api = require \"luci.passwall2.api\"\r\n\r\nif not api.is_finded(\"ss-server\") then\r\n\treturn\r\nend\r\n\r\nlocal type_name = \"SS\"\r\n\r\nlocal option_prefix = \"ss_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal ss_encrypt_method_list = {\r\n\t\"rc4-md5\", \"aes-128-cfb\", \"aes-192-cfb\", \"aes-256-cfb\", \"aes-128-ctr\",\r\n\t\"aes-192-ctr\", \"aes-256-ctr\", \"bf-cfb\", \"camellia-128-cfb\",\r\n\t\"camellia-192-cfb\", \"camellia-256-cfb\", \"salsa20\", \"chacha20\",\r\n\t\"chacha20-ietf\", -- aead\r\n\t\"aes-128-gcm\", \"aes-192-gcm\", \"aes-256-gcm\", \"chacha20-ietf-poly1305\",\r\n\t\"xchacha20-ietf-poly1305\"\r\n}\r\n\r\n-- [[ Shadowsocks ]]\r\n\r\ns.fields[\"type\"]:value(type_name, translate(\"Shadowsocks\"))\r\n\r\no = s:option(Flag, _n(\"custom\"), translate(\"Use Custom Config\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Listen Port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(ListValue, _n(\"method\"), translate(\"Encrypt Method\"))\r\nfor a, t in ipairs(ss_encrypt_method_list) do o:value(t) end\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"timeout\"), translate(\"Connection Timeout\"))\r\no.datatype = \"uinteger\"\r\no.default = 300\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"tcp_fast_open\"), \"TCP \" .. translate(\"Fast Open\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(TextValue, _n(\"custom_config\"), translate(\"Custom Config\"))\r\no.rows = 10\r\no.wrap = \"off\"\r\no:depends({ [_n(\"custom\")] = true })\r\no.validate = function(self, value, t)\r\n\tif value and api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, translate(\"Custom Config\") .. \" \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal config_str = m:get(section, \"config_str\")\r\n\tif config_str then\r\n\t\treturn api.base64Decode(config_str)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"config_str\", api.base64Encode(value) or \"\")\r\nend\r\n\r\no = s:option(Flag, _n(\"log\"), translate(\"Log\"))\r\no.default = \"1\"\r\no.rmempty = false\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/server/type/ssr.lua",
    "content": "local m, s = ...\r\n\r\nlocal api = require \"luci.passwall2.api\"\r\n\r\nif not api.is_finded(\"ssr-server\") then\r\n\treturn\r\nend\r\n\r\nlocal type_name = \"SSR\"\r\n\r\nlocal option_prefix = \"ssr_\"\r\n\r\nlocal function _n(name)\r\n\treturn option_prefix .. name\r\nend\r\n\r\nlocal ssr_encrypt_method_list = {\r\n\t\"none\", \"table\", \"rc2-cfb\", \"rc4\", \"rc4-md5\", \"rc4-md5-6\", \"aes-128-cfb\",\r\n\t\"aes-192-cfb\", \"aes-256-cfb\", \"aes-128-ctr\", \"aes-192-ctr\", \"aes-256-ctr\",\r\n\t\"bf-cfb\", \"camellia-128-cfb\", \"camellia-192-cfb\", \"camellia-256-cfb\",\r\n\t\"cast5-cfb\", \"des-cfb\", \"idea-cfb\", \"seed-cfb\", \"salsa20\", \"chacha20\",\r\n\t\"chacha20-ietf\"\r\n}\r\n\r\nlocal ssr_protocol_list = {\r\n\t\"origin\", \"verify_simple\", \"verify_deflate\", \"verify_sha1\", \"auth_simple\",\r\n\t\"auth_sha1\", \"auth_sha1_v2\", \"auth_sha1_v4\", \"auth_aes128_md5\",\r\n\t\"auth_aes128_sha1\", \"auth_chain_a\", \"auth_chain_b\", \"auth_chain_c\",\r\n\t\"auth_chain_d\", \"auth_chain_e\", \"auth_chain_f\"\r\n}\r\nlocal ssr_obfs_list = {\r\n\t\"plain\", \"http_simple\", \"http_post\", \"random_head\", \"tls_simple\",\r\n\t\"tls1.0_session_auth\", \"tls1.2_ticket_auth\"\r\n}\r\n\r\n-- [[ ShadowsocksR ]]\r\n\r\ns.fields[\"type\"]:value(type_name, translate(\"ShadowsocksR\"))\r\n\r\no = s:option(Flag, _n(\"custom\"), translate(\"Use Custom Config\"))\r\n\r\no = s:option(Value, _n(\"port\"), translate(\"Listen Port\"))\r\no.datatype = \"port\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"password\"), translate(\"Password\"))\r\no.password = true\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(ListValue, _n(\"method\"), translate(\"Encrypt Method\"))\r\nfor a, t in ipairs(ssr_encrypt_method_list) do o:value(t) end\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(ListValue, _n(\"protocol\"), translate(\"Protocol\"))\r\nfor a, t in ipairs(ssr_protocol_list) do o:value(t) end\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"protocol_param\"), translate(\"Protocol_param\"))\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(ListValue, _n(\"obfs\"), translate(\"Obfs\"))\r\nfor a, t in ipairs(ssr_obfs_list) do o:value(t) end\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"obfs_param\"), translate(\"Obfs_param\"))\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Value, _n(\"timeout\"), translate(\"Connection Timeout\"))\r\no.datatype = \"uinteger\"\r\no.default = 300\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(Flag, _n(\"tcp_fast_open\"), \"TCP \" .. translate(\"Fast Open\"))\r\no.default = \"0\"\r\no:depends({ [_n(\"custom\")] = false })\r\n\r\no = s:option(TextValue, _n(\"custom_config\"), translate(\"Custom Config\"))\r\no.rows = 10\r\no.wrap = \"off\"\r\no:depends({ [_n(\"custom\")] = true })\r\no.validate = function(self, value, t)\r\n\tif value and api.jsonc.parse(value) then\r\n\t\treturn value\r\n\telse\r\n\t\treturn nil, translate(\"Custom Config\") .. \" \" .. translate(\"Must be JSON text!\")\r\n\tend\r\nend\r\no.custom_cfgvalue = function(self, section, value)\r\n\tlocal config_str = m:get(section, \"config_str\")\r\n\tif config_str then\r\n\t\treturn api.base64Decode(config_str)\r\n\tend\r\nend\r\no.custom_write = function(self, section, value)\r\n\tm:set(section, \"config_str\", api.base64Encode(value) or \"\")\r\nend\r\n\r\no = s:option(Flag, _n(\"udp_forward\"), translate(\"UDP Forward\"))\r\no.default = \"1\"\r\no.rmempty = false\r\n\r\no = s:option(Flag, _n(\"log\"), translate(\"Log\"))\r\no.default = \"1\"\r\no.rmempty = false\r\n\r\napi.luci_types(arg[1], m, s, type_name, option_prefix)\r\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/model/cbi/passwall2/server/user.lua",
    "content": "local api = require \"luci.passwall2.api\"\nlocal appname = api.appname\nlocal fs = api.fs\nlocal types_dir = \"/usr/lib/lua/luci/model/cbi/\" .. appname .. \"/server/type/\"\n\nm = Map(\"passwall2_server\", translate(\"Server Config\"))\nm.redirect = api.url(\"server\")\napi.set_apply_on_parse(m)\n\nif not arg[1] or not m:get(arg[1]) then\n\tluci.http.redirect(m.redirect)\nend\n\nm:append(Template(appname .. \"/cbi/nodes_listvalue_com\"))\n\ns = m:section(NamedSection, arg[1], \"user\", \"\")\ns.addremove = false\ns.dynamic = false\n\no = s:option(Flag, \"enable\", translate(\"Enable\"))\no.default = \"1\"\no.rmempty = false\n\no = s:option(Value, \"remarks\", translate(\"Remarks\"))\no.default = translate(\"Remarks\")\no.rmempty = false\n\no = s:option(ListValue, \"type\", translate(\"Type\"))\n\nlocal type_table = {}\nfor filename in fs.dir(types_dir) do\n\ttable.insert(type_table, filename)\nend\ntable.sort(type_table)\n\nfor index, value in ipairs(type_table) do\n\tlocal p_func = loadfile(types_dir .. value)\n\tsetfenv(p_func, getfenv(1))(m, s)\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/passwall2/api.lua",
    "content": "module(\"luci.passwall2.api\", package.seeall)\nappname = \"passwall2\"\nlocal com = require \"luci.passwall2.com\"\nnixio = require \"nixio\"\nfs = require \"nixio.fs\"\nsys = require \"luci.sys\"\nuci = require\"luci.model.uci\".cursor()\nutil = require \"luci.util\"\ndatatypes = require \"luci.cbi.datatypes\"\njsonc = require \"luci.jsonc\"\ni18n = require \"luci.i18n\"\n\ncurl_args = { \"-skfL\", \"--connect-timeout 3\", \"--retry 3\" }\ncommand_timeout = 300\nOPENWRT_ARCH = nil\nDISTRIB_ARCH = nil\n\nLOG_FILE = \"/tmp/log/passwall2.log\"\nCACHE_PATH = \"/tmp/etc/passwall2_tmp\"\nTMP_PATH = \"/tmp/etc/\" .. appname\nTMP_IFACE_PATH = TMP_PATH .. \"/iface\"\n\nlocal lang = uci:get(\"luci\", \"main\", \"lang\") or \"auto\"\nif lang == \"auto\" then\n\tlocal auto_lang = uci:get(appname, \"@global[0]\", \"auto_lang\")\n\tif auto_lang then lang = auto_lang end\nend\nif lang == \"auto\" then\n\tlang = i18n.default\nend\ni18n.setlanguage(lang)\n\nfunction echolog(...)\n\tlocal result = table.concat({...}, \" \")\n\tlocal f, err = io.open(LOG_FILE, \"a\")\n\tif f and err == nil then\n\t\tf:write(result .. \"\\n\")\n\t\tf:close()\n\tend\nend\n\nfunction echolog_date(...)\n\tlocal result = os.date(\"%Y-%m-%d %H:%M:%S: \") .. table.concat({...}, \" \")\n\techolog(result)\nend\n\nfunction log(level, ...)\n\tlocal indent = \"\"\n\tif level >= 1 then\n\t\tfor i = 1, level, 1 do\n\t\t\tindent = indent .. \"  \"\n\t\tend\n\t\techolog_date(indent .. \"- \" .. table.concat({...}, \" \"))\n\telse\n\t\techolog_date(table.concat({...}, \" \"))\n\tend\nend\n\nfunction is_old_uci()\n\treturn sys.call(\"grep -E 'require[ \\t]*\\\"uci\\\"' /usr/lib/lua/luci/model/uci.lua >/dev/null 2>&1\") == 0\nend\n\nfunction uci_save(cursor, config, commit, apply)\n\tif is_old_uci() then\n\t\tcursor:save(config)\n\t\tif commit then\n\t\t\tcursor:commit(config)\n\t\t\tif apply then\n\t\t\t\tsys.call(\"/etc/init.d/\" .. config .. \" reload > /dev/null 2>&1 &\")\n\t\t\tend\n\t\tend\n\telse\n\t\tcommit = true\n\t\tif commit then\n\t\t\tif apply then\n\t\t\t\tcursor:commit(config)\n\t\t\telse\n\t\t\t\tsh_uci_commit(config)\n\t\t\tend\n\t\tend\n\tend\nend\n\nfunction sh_uci_get(config, section, option)\n\tlocal _, val = exec_call(string.format(\"uci -q get %s.%s.%s\", config, section, option))\n\treturn val\nend\n\nfunction sh_uci_set(config, section, option, val, commit)\n\texec_call(string.format(\"uci -q set %s.%s.%s=\\\"%s\\\"\", config, section, option, val))\n\tif commit then sh_uci_commit(config) end\nend\n\nfunction sh_uci_del(config, section, option, commit)\n\texec_call(string.format(\"uci -q delete %s.%s.%s\", config, section, option))\n\tif commit then sh_uci_commit(config) end\nend\n\nfunction sh_uci_add_list(config, section, option, val, commit)\n\texec_call(string.format(\"uci -q del_list %s.%s.%s=\\\"%s\\\"\", config, section, option, val))\n\texec_call(string.format(\"uci -q add_list %s.%s.%s=\\\"%s\\\"\", config, section, option, val))\n\tif commit then sh_uci_commit(config) end\nend\n\nfunction sh_uci_commit(config)\n\texec_call(string.format(\"uci -q commit %s\", config))\nend\n\nfunction set_cache_var(key, val)\n\tsys.call(string.format('. /usr/share/passwall2/utils.sh ; set_cache_var %s \"%s\"', key, val))\nend\n\nfunction get_cache_var(key)\n\tlocal val = sys.exec(string.format('. /usr/share/passwall2/utils.sh ; echo -n $(get_cache_var %s)', key))\n\tif val == \"\" then val = nil end\n\treturn val\nend\n\nfunction get_new_port()\n\tlocal cmd_format = \". /usr/share/passwall2/utils.sh ; echo -n $(get_new_port %s tcp,udp)\"\n\treturn tonumber(sys.exec(string.format(cmd_format, \"auto\")))\nend\n\nfunction exec_call(cmd)\n\tmath.randomseed(os.time())\n\tlocal tag = \"\\x01__RC__\" .. tostring(math.random(100000, 999999)) .. \"\\x01\"\n\tlocal f = io.popen('(' .. cmd .. '); printf \"\\\\n' .. tag .. '%d\" \"$?\"')\n\tlocal out = f:read(\"*a\") or \"\"\n\tf:close()\n\tlocal rc = out:match(tag .. \"(%d+)%s*$\")\n\tif not rc then\n\t\treturn 255, trim(out)\n\tend\n\tout = out:gsub(\"\\n?\" .. tag .. \"%d+%s*$\", \"\")\n\treturn tonumber(rc), trim(out)\nend\n\nfunction base64Decode(text)\n\tif not text then return '' end\n\tlocal encoded = text:gsub(\"%z\", \"\"):gsub(\"%c\", \"\"):gsub(\"_\", \"/\"):gsub(\"-\", \"+\")\n\tlocal mod4 = #encoded % 4\n\tencoded = encoded .. string.sub('====', mod4 + 1)\n\tlocal result = nixio.bin.b64decode(encoded)\n\tif result then\n\t\treturn result:gsub(\"%z\", \"\")\n\telse\n\t\treturn text\n\tend\nend\n\nfunction base64Encode(text)\n\tif not text then return nil end\n\treturn nixio.bin.b64encode(text)\nend\n\nfunction UrlEncode(szText)\n\treturn szText:gsub(\"([^%w%-_%.%~])\", function(c)\n\t\treturn string.format(\"%%%02X\", string.byte(c))\n\tend)\nend\n\nfunction UrlDecode(szText)\n\treturn szText and szText:gsub(\"%+\", \" \"):gsub(\"%%(%x%x)\", function(h)\n\t\treturn string.char(tonumber(h, 16))\n\tend) or nil\nend\n\n-- Extract the domain name and port from the URL (no IP address).\nfunction get_domain_port_from_url(url)\n\tlocal scheme, domain, port = string.match(url, \"^(https?)://([%w%.%-]+):?(%d*)\")\n\tif not domain then\n\t\tscheme, domain, port = string.match(url, \"^(https?)://(%b[])([^:/]*)/?\")\n\tend\n\tif not domain then return nil, nil end\n\tif domain:sub(1, 1) == \"[\" then domain = domain:sub(2, -2) end\n\tport = port ~= \"\" and tonumber(port) or (scheme == \"https\" and 443 or 80)\n\tif datatypes.ipaddr(domain) or datatypes.ip6addr(domain) then return nil, nil end\n\treturn domain, port\nend\n\n-- Domain resolution\nfunction domainToIPv4(domain, dns)\n\tlocal Dns = dns or \"223.5.5.5\"\n\tlocal IPs = luci.sys.exec('nslookup %s %s | awk \\'/^Name:/{getline; if ($1 == \"Address:\") print $2}\\'' % { domain, Dns })\n\tfor IP in string.gmatch(IPs, \"%S+\") do\n\t\tif datatypes.ipaddr(IP) and not datatypes.ip6addr(IP) then return IP end\n\tend\n\treturn nil\nend\n\nfunction curl_base(url, file, args)\n\tif not args then args = {} end\n\tif file then\n\t\targs[#args + 1] = \"-o \" .. file\n\tend\n\tlocal cmd = string.format('curl %s \"%s\"', table_join(args), url)\n\treturn exec_call(cmd)\nend\n\nfunction curl_proxy(url, file, args)\n\t-- Use the proxy\n\tlocal socks_server = get_cache_var(\"GLOBAL_SOCKS_server\")\n\tif socks_server and socks_server ~= \"\" then\n\t\tif not args then args = {} end\n\t\tlocal tmp_args = clone(args)\n\t\ttmp_args[#tmp_args + 1] = \"-x socks5h://\" .. socks_server\n\t\treturn curl_base(url, file, tmp_args)\n\tend\n\treturn nil, nil\nend\n\nfunction curl_logic(url, file, args)\n\tlocal return_code, result = curl_proxy(url, file, args)\n\tif not return_code or return_code ~= 0 then\n\t\treturn_code, result = curl_base(url, file, args)\n\tend\n\treturn return_code, result\nend\n\nfunction curl_direct(url, file, args)\n\t-- Direct access\n\tif not args then args = {} end\n\tlocal tmp_args = clone(args)\n\tlocal domain, port = get_domain_port_from_url(url)\n\tif domain then\n\t\tlocal ip = domainToIPv4(domain)\n\t\tif ip then\n\t\t\ttmp_args[#tmp_args + 1] = \"--resolve \" .. domain .. \":\" .. port .. \":\" .. ip\n\t\tend\n\tend\n\treturn curl_base(url, file, tmp_args)\nend\n\nfunction curl_auto(url, file, args)\n\tlocal localhost_proxy = uci:get(appname, \"@global[0]\", \"localhost_proxy\") or \"1\"\n\tif localhost_proxy == \"1\" then\n\t\treturn curl_base(url, file, args)\n\telse\n\t\tlocal return_code, result = curl_proxy(url, file, args)\n\t\tif not return_code or return_code ~= 0 then\n\t\t\treturn_code, result = curl_direct(url, file, args)\n\t\tend\n\t\treturn return_code, result\n\tend\nend\n\nfunction url(...)\n\tlocal url = string.format(\"admin/services/%s\", appname)\n\tlocal args = { ... }\n\tfor i, v in pairs(args) do\n\t\tif v ~= \"\" then\n\t\t\turl = url .. \"/\" .. v\n\t\tend\n\tend\n\treturn require \"luci.dispatcher\".build_url(url)\nend\n\nfunction trim(s)\n\tif type(s) ~= \"string\" then return \"\" end\n\tlocal i, j = 1, #s\n\twhile i <= j and s:byte(i) <= 32 do i = i + 1 end\n\twhile j >= i and s:byte(j) <= 32 do j = j - 1 end\n\tif i > j then return \"\" end\n\treturn s:sub(i, j)\nend\n\nfunction split(full, sep)\n\tif full then\n\t\tfull = full:gsub(\"%z\", \"\") -- This is not very clear; sometimes it ends with a `\\0`.\n\t\tlocal off, result = 1, {}\n\t\twhile true do\n\t\t\tlocal nStart, nEnd = full:find(sep, off)\n\t\t\tif not nEnd then\n\t\t\t\tlocal res = string.sub(full, off, string.len(full))\n\t\t\t\tif #res > 0 then -- Filter out `\\0`\n\t\t\t\t\ttable.insert(result, res)\n\t\t\t\tend\n\t\t\t\tbreak\n\t\t\telse\n\t\t\t\ttable.insert(result, string.sub(full, off, nStart - 1))\n\t\t\t\toff = nEnd + 1\n\t\t\tend\n\t\tend\n\t\treturn result\n\tend\n\treturn {}\nend\n\nfunction is_exist(table, value)\n\tfor index, k in ipairs(table) do\n\t\tif k == value then\n\t\t\treturn true\n\t\tend\n\tend\n\treturn false\nend\n\nfunction repeat_exist(table, value)\n\tlocal count = 0\n\tfor index, k in ipairs(table) do\n\t\tif k:find(\"-\") and k == value then\n\t\t\tcount = count + 1\n\t\tend\n\tend\n\tif count > 1 then\n\t\treturn true\n\tend\n\treturn false\nend\n\nfunction remove(...)\n\tfor index, value in ipairs({...}) do\n\t\tif value and #value > 0 and value ~= \"/\" then\n\t\t\tsys.call(string.format(\"rm -rf %s\", value))\n\t\tend\n\tend\nend\n\nfunction is_install(package)\n\tif package and #package > 0 then\n\t\tlocal file_path = \"/usr/lib/opkg/info\"\n\t\tlocal file_ext = \".control\"\n\t\tlocal has = sys.call(\"[ -d \" .. file_path .. \" ]\")\n\t\tif has ~= 0 then\n\t\t\tfile_path = \"/lib/apk/packages\"\n\t\t\tfile_ext = \".list\"\n\t\tend\n\t\treturn sys.call(string.format('[ -s \"%s/%s%s\" ]', file_path, package, file_ext)) == 0\n\tend\n\treturn false\nend\n\nfunction get_args(arg)\n\tlocal var = {}\n\tfor i, arg_k in pairs(arg) do\n\t\tif i > 0 then\n\t\t\tlocal v = arg[i + 1]\n\t\t\tif v then\n\t\t\t\tif repeat_exist(arg, v) == false then\n\t\t\t\t\tvar[arg_k] = v\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\treturn var\nend\n\nfunction get_function_args(arg)\n\tlocal var = nil\n\tif arg and #arg > 1 then\n\t\tlocal param = {}\n\t\tfor i = 2, #arg do\n\t\t\tparam[#param + 1] = arg[i]\n\t\tend\n\t\tvar = get_args(param)\n\tend\n\treturn var\nend\n\nfunction strToTable(str)\n\tif str == nil or type(str) ~= \"string\" then\n\t\treturn {}\n\tend\n\t\n\treturn loadstring(\"return \" .. str)()\nend\n\nfunction is_normal_node(e)\n\tif e and e.type and e.protocol and (e.protocol == \"_balancing\" or e.protocol == \"_shunt\" or e.protocol == \"_iface\" or e.protocol == \"_urltest\") then\n\t\treturn false\n\tend\n\treturn true\nend\n\nfunction is_special_node(e)\n\treturn is_normal_node(e) == false\nend\n\nfunction is_ip(val)\n\tlocal str = val:match(\"%[(.-)%]\") or val\n\treturn datatypes.ipaddr(str) or false\nend\n\nfunction is_ipv6(val)\n\tlocal str = val:match(\"%[(.-)%]\") or val\n\treturn datatypes.ip6addr(str) or false\nend\n\nfunction is_ipv6addrport(val)\n\tlocal address, port = val:match(\"%[(.-)%]:([0-9]+)$\")\n\tif address and datatypes.ip6addr(address) and datatypes.port(port) then\n\t\treturn true\n\tend\n\treturn false\nend\n\nfunction get_ipv6_only(val)\n\tlocal result = \"\"\n\tlocal inner = val:match(\"%[(.-)%]\") or val\n\tif datatypes.ip6addr(inner) then\n\t\tresult = inner\n\tend\n\treturn result\nend\n\nfunction get_ipv6_full(val)\n\tlocal result = \"\"\n\tif is_ipv6(val) then\n\t\tresult = val\n\t\tif not val:match(\"%[.-%]\") then\n\t\t\tresult = \"[\" .. result .. \"]\"\n\t\tend\n\tend\n\treturn result\nend\n\nfunction get_ip_type(val)\n\tif is_ipv6(val) then\n\t\treturn \"6\"\n\telseif datatypes.ip4addr(val) then\n\t\treturn \"4\"\n\tend\n\treturn \"\"\nend\n\nfunction is_mac(val)\n\treturn datatypes.macaddr(val)\nend\n\nfunction ip_or_mac(val)\n\tif val then\n\t\tif get_ip_type(val) == \"4\" then\n\t\t\treturn \"ip\"\n\t\tend\n\t\tif is_mac(val) then\n\t\t\treturn \"mac\"\n\t\tend\n\tend\n\treturn \"\"\nend\n\nfunction iprange(val)\n\tif val then\n\t\tlocal ipStart, ipEnd = val:match(\"^([^/]+)-([^/]+)$\")\n\t\tif (ipStart and datatypes.ip4addr(ipStart)) and (ipEnd and datatypes.ip4addr(ipEnd)) then\n\t\t\treturn true\n\t\tend\n\tend\n\treturn false\nend\n\nfunction get_domain_from_url(url)\n\tlocal domain = string.match(url, \"//([^/]+)\")\n\tif domain then\n\t\treturn domain\n\tend\n\treturn url\nend\n\nfunction get_node_name(node_id)\n\tlocal e\n\tif type(node_id) == \"table\" then\n\t\te = node_id\n\telse\n\t\te = uci:get_all(appname, node_id)\n\tend\n\tif e then\n\t\tif e.type and e.remarks then\n\t\t\tif e.protocol and (e.protocol == \"_balancing\" or e.protocol == \"_shunt\" or e.protocol == \"_iface\") then\n\t\t\t\tlocal type_name = e.type\n\t\t\t\tif e.type == \"sing-box\" then type_name = \"Sing-Box\" end\n\t\t\t\tlocal remark = \"%s：[%s] \" % {type_name .. \" \" .. i18n.translatef(e.protocol), e.remarks}\n\t\t\t\treturn remark\n\t\t\tend\n\t\tend\n\tend\n\treturn \"\"\nend\n\nfunction get_valid_nodes()\n\tlocal show_node_info = uci_get_type(\"global_other\", \"show_node_info\") or \"0\"\n\tlocal nodes = {}\n\tlocal default_nodes = {}\n\tlocal other_nodes = {}\n\tuci:foreach(appname, \"nodes\", function(e)\n\t\te.id = e[\".name\"]\n\t\tif e.type and e.remarks then\n\t\t\tlocal type_name = e.type\n\t\t\tif e.type == \"sing-box\" then type_name = \"Sing-Box\" end\n\t\t\tif e.protocol and (e.protocol == \"_balancing\" or e.protocol == \"_shunt\" or e.protocol == \"_iface\" or e.protocol == \"_urltest\") then\n\t\t\t\te[\"remark\"] = trim(\"%s：[%s]\" % {type_name .. \" \" .. i18n.translatef(e.protocol), e.remarks})\n\t\t\t\te[\"node_type\"] = \"special\"\n\t\t\t\tif not e.group or e.group == \"\" then\n\t\t\t\t\tdefault_nodes[#default_nodes + 1] = e\n\t\t\t\telse\n\t\t\t\t\tother_nodes[#other_nodes + 1] = e\n\t\t\t\tend\n\t\t\tend\n\t\t\tlocal port = e.port or e.hysteria_hop or e.hysteria2_hop\n\t\t\tif port and e.address then\n\t\t\t\tlocal address = e.address\n\t\t\t\tif is_ip(address) or datatypes.hostname(address) then\n\t\t\t\t\tif (e.type == \"sing-box\" or e.type == \"Xray\") and e.protocol then\n\t\t\t\t\t\tlocal protocol = e.protocol\n\t\t\t\t\t\tif protocol == \"vmess\" then\n\t\t\t\t\t\t\tprotocol = \"VMess\"\n\t\t\t\t\t\telseif protocol == \"vless\" then\n\t\t\t\t\t\t\tprotocol = \"VLESS\"\n\t\t\t\t\t\telseif protocol == \"shadowsocks\" then\n\t\t\t\t\t\t\tprotocol = \"SS\"\n\t\t\t\t\t\telseif protocol == \"shadowsocksr\" then\n\t\t\t\t\t\t\tprotocol = \"SSR\"\n\t\t\t\t\t\telseif protocol == \"wireguard\" then\n\t\t\t\t\t\t\tprotocol = \"WG\"\n\t\t\t\t\t\telseif protocol == \"hysteria\" then\n\t\t\t\t\t\t\tprotocol = \"HY\"\n\t\t\t\t\t\telseif protocol == \"hysteria2\" then\n\t\t\t\t\t\t\tprotocol = \"HY2\"\n\t\t\t\t\t\telseif protocol == \"anytls\" then\n\t\t\t\t\t\t\tprotocol = \"AnyTLS\"\n\t\t\t\t\t\telseif protocol == \"ssh\" then\n\t\t\t\t\t\t\tprotocol = \"SSH\"\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tprotocol = protocol:gsub(\"^%l\",string.upper)\n\t\t\t\t\t\tend\n\t\t\t\t\t\ttype_name = type_name .. \" \" .. protocol\n\t\t\t\t\tend\n\t\t\t\t\tif is_ipv6(address) then address = get_ipv6_full(address) end\n\t\t\t\t\te[\"remark\"] = trim(\"%s：[%s]\" % {type_name, e.remarks})\n\t\t\t\t\tif show_node_info == \"1\" then\n\t\t\t\t\t\tport = port:gsub(\":\", \"-\")\n\t\t\t\t\t\te[\"remark\"] = trim(\"%s：[%s] %s:%s\" % {type_name, e.remarks, address, port})\n\t\t\t\t\tend\n\t\t\t\t\te.node_type = \"normal\"\n\t\t\t\t\tif not e.group or e.group == \"\" then\n\t\t\t\t\t\tdefault_nodes[#default_nodes + 1] = e\n\t\t\t\t\telse\n\t\t\t\t\t\tother_nodes[#other_nodes + 1] = e\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\n\tfor i = 1, #default_nodes do nodes[#nodes + 1] = default_nodes[i] end\n\tfor i = 1, #other_nodes do nodes[#nodes + 1] = other_nodes[i] end\n\treturn nodes\nend\n\nfunction get_node_list()\n\tlocal node_list = {\n\t\tsocks_list = {},\n\t\tnormal_list = {},\n\t}\n\tuci:foreach(appname, \"socks\", function(s)\n\t\tif s.enabled == \"1\" and s.node then\n\t\t\tnode_list.socks_list[#node_list.socks_list + 1] = {\n\t\t\t\tid = \"Socks_\" .. s[\".name\"],\n\t\t\t\tremark = i18n.translate(\"Socks Config\") .. \" [\" .. s.port .. i18n.translate(\"Port\") .. \"]\",\n\t\t\t\tgroup = \"Socks\"\n\t\t\t}\n\t\tend\n\tend)\n\tfor k, e in ipairs(get_valid_nodes()) do\n\t\tif e.node_type == \"normal\" then\n\t\t\tnode_list.normal_list[#node_list.normal_list + 1] = {\n\t\t\t\tid = e[\".name\"],\n\t\t\t\tremark = e[\"remark\"],\n\t\t\t\ttype = e[\"type\"],\n\t\t\t\tchain_proxy = e[\"chain_proxy\"],\n\t\t\t\tgroup = e[\"group\"]\n\t\t\t}\n\t\tend\n\t\tif e.protocol and e.protocol:find(\"^_\") then\n\t\t\tlocal proto = e.protocol:sub(2)\n\t\t\tif not node_list[proto .. \"_list\"] then\n\t\t\t\tnode_list[proto .. \"_list\"] = {}\n\t\t\tend\n\t\t\tnode_list[proto .. \"_list\"][#node_list[proto .. \"_list\"] + 1] = {\n\t\t\t\tid = e[\".name\"],\n\t\t\t\tremark = e[\"remark\"],\n\t\t\t\tgroup = e[\"group\"],\n\t\t\t\to = e,\n\t\t\t}\n\t\tend\n\tend\n\treturn node_list\nend\n\nfunction get_node_remarks(n)\n\tlocal remarks = \"\"\n\tif n then\n\t\tlocal type_name = n.type\n\t\tif n.type == \"sing-box\" then type_name = \"Sing-Box\" end\n\t\tif n.protocol and (n.protocol == \"_balancing\" or n.protocol == \"_shunt\" or n.protocol == \"_iface\" or n.protocol == \"_urltest\") then\n\t\t\tremarks = trim(\"%s：[%s]\" % {type_name .. \" \" .. i18n.translatef(n.protocol), n.remarks})\n\t\telse\n\t\t\tif (n.type == \"sing-box\" or n.type == \"Xray\") and n.protocol then\n\t\t\t\tlocal protocol = n.protocol\n\t\t\t\tif protocol == \"vmess\" then\n\t\t\t\t\tprotocol = \"VMess\"\n\t\t\t\telseif protocol == \"vless\" then\n\t\t\t\t\tprotocol = \"VLESS\"\n\t\t\t\telseif protocol == \"shadowsocks\" then\n\t\t\t\t\tprotocol = \"SS\"\n\t\t\t\telseif protocol == \"shadowsocksr\" then\n\t\t\t\t\tprotocol = \"SSR\"\n\t\t\t\telseif protocol == \"wireguard\" then\n\t\t\t\t\tprotocol = \"WG\"\n\t\t\t\telseif protocol == \"hysteria\" then\n\t\t\t\t\tprotocol = \"HY\"\n\t\t\t\telseif protocol == \"hysteria2\" then\n\t\t\t\t\tprotocol = \"HY2\"\n\t\t\t\telseif protocol == \"anytls\" then\n\t\t\t\t\tprotocol = \"AnyTLS\"\n\t\t\t\telseif protocol == \"ssh\" then\n\t\t\t\t\tprotocol = \"SSH\"\n\t\t\t\telse\n\t\t\t\t\tprotocol = protocol:gsub(\"^%l\",string.upper)\n\t\t\t\tend\n\t\t\t\ttype_name = type_name .. \" \" .. protocol\n\t\t\tend\n\t\t\tremarks = trim(\"%s：[%s]\" % {type_name, n.remarks})\t\n\t\tend\n\tend\n\treturn remarks\nend\n\nfunction get_full_node_remarks(n)\n\tlocal remarks = get_node_remarks(n)\n\tif #remarks > 0 then\n\t\tlocal port = n.port or n.hysteria_hop or n.hysteria2_hop\n\t\tif n.address and port then\n\t\t\tport = port:gsub(\":\", \"-\")\n\t\t\tremarks = remarks .. \" \" .. n.address .. \":\" .. port\n\t\tend\n\tend\n\treturn remarks\nend\n\nfunction gen_uuid(format)\n\tlocal uuid = sys.exec(\"echo -n $(cat /proc/sys/kernel/random/uuid)\")\n\tif format == nil then\n\t\tuuid = string.gsub(uuid, \"-\", \"\")\n\tend\n\treturn uuid\nend\n\nfunction gen_short_uuid()\n\treturn sys.exec(\"echo -n $(head /dev/urandom | tr -dc A-Za-z0-9 | head -c 8)\")\nend\n\nfunction uci_get_type(type, config, default)\n\tlocal value = uci:get_first(appname, type, config, default) or sys.exec(\"echo -n $(uci -q get \" .. appname .. \".@\" .. type ..\"[0].\" .. config .. \")\")\n\tif (value == nil or value == \"\") and (default and default ~= \"\") then\n\t\tvalue = default\n\tend\n\treturn value\nend\n\nfunction uci_get_type_id(id, config, default)\n\tlocal value = uci:get(appname, id, config, default) or sys.exec(\"echo -n $(uci -q get \" .. appname .. \".\" .. id .. \".\" .. config .. \")\")\n\tif (value == nil or value == \"\") and (default and default ~= \"\") then\n\t\tvalue = default\n\tend\n\treturn value\nend\n\nfunction chmod_755(file)\n\tif file and file ~= \"\" then\n\t\tif not fs.access(file, \"rwx\", \"rx\", \"rx\") then\n\t\t\tfs.chmod(file, 755)\n\t\tend\n\tend\nend\n\nfunction get_customed_path(e)\n\treturn uci_get_type(\"global_app\", e .. \"_file\")\nend\n\nfunction finded_com(e)\n\tlocal bin = get_app_path(e)\n\tif not bin then return end\n\tlocal s = luci.sys.exec('echo -n $(type -t -p \"%s\" | head -n1)' % { bin })\n\tif s == \"\" then\n\t\ts = nil\n\tend\n\treturn s\nend\n\nfunction finded(e)\n\treturn luci.sys.exec('echo -n $(type -t -p \"/bin/%s\" -p \"/usr/bin/%s\" \"%s\" | head -n1)' % {e, e, e})\nend\n\nfunction is_finded(e)\n\treturn finded(e) ~= \"\" and true or false\nend\n\nfunction clone(org)\n\tlocal function copy(org, res)\n\t\tfor k,v in pairs(org) do\n\t\t\tif type(v) ~= \"table\" then\n\t\t\t\tres[k] = v;\n\t\t\telse\n\t\t\t\tres[k] = {};\n\t\t\t\tcopy(v, res[k])\n\t\t\tend\n\t\tend\n\tend\n \n\tlocal res = {}\n\tcopy(org, res)\n\treturn res\nend\n\nlocal function get_bin_version_cache(file, cmd)\n\tsys.call(\"mkdir -p /tmp/etc/passwall2_tmp\")\n\tif fs.access(file) then\n\t\tchmod_755(file)\n\t\tlocal md5 = sys.exec(\"echo -n $(md5sum \" .. file .. \" | awk '{print $1}')\")\n\t\tif fs.access(\"/tmp/etc/passwall2_tmp/\" .. md5) then\n\t\t\treturn sys.exec(\"echo -n $(cat /tmp/etc/passwall2_tmp/%s)\" % md5)\n\t\telse\n\t\t\tlocal version = sys.exec(string.format(\"echo -n $(%s %s)\", file, cmd))\n\t\t\tif version and version ~= \"\" then\n\t\t\t\tsys.call(\"echo '\" .. version .. \"' > \" .. \"/tmp/etc/passwall2_tmp/\" .. md5)\n\t\t\t\treturn version\n\t\t\tend\n\t\tend\n\tend\n\treturn \"\"\nend\n\nfunction get_app_path(app_name)\n\tif com[app_name] then\n\t\tlocal def_path = com[app_name].default_path\n\t\tlocal path = uci_get_type(\"global_app\", app_name:gsub(\"%-\",\"_\") .. \"_file\")\n\t\tpath = path and (#path>0 and path or def_path) or def_path\n\t\treturn path\n\tend\nend\n\nfunction get_app_version(app_name, file)\n\tif file == nil then file = get_app_path(app_name) end\n\treturn get_bin_version_cache(file, com[app_name].cmd_version)\nend\n\nfunction is_file(path)\n\tif path and #path > 1 then\n\t\tif sys.exec('[ -f \"%s\" ] && echo -n 1' % path) == \"1\" then\n\t\t\treturn true\n\t\tend\n\tend\n\treturn nil\nend\n\nfunction is_dir(path)\n\tif path and #path > 1 then\n\t\tif sys.exec('[ -d \"%s\" ] && echo -n 1' % path) == \"1\" then\n\t\t\treturn true\n\t\tend\n\tend\n\treturn nil\nend\n\nfunction get_final_dir(path)\n\tif is_dir(path) then\n\t\treturn path\n\telse\n\t\treturn get_final_dir(fs.dirname(path))\n\tend\nend\n\nfunction get_free_space(dir)\n\tif dir == nil then dir = \"/\" end\n\tif sys.call(\"df -k \" .. dir .. \" >/dev/null 2>&1\") == 0 then\n\t\treturn tonumber(sys.exec(\"echo -n $(df -k \" .. dir .. \" | awk 'NR>1' | awk '{print $4}')\"))\n\tend\n\treturn 0\nend\n\nfunction get_file_space(file)\n\tif file == nil then return 0 end\n\tif fs.access(file) then\n\t\treturn tonumber(sys.exec(\"echo -n $(du -k \" .. file .. \" | awk '{print $1}')\"))\n\tend\n\treturn 0\nend\n\nfunction _unpack(t, i)\n\ti = i or 1\n\tif t[i] ~= nil then return t[i], _unpack(t, i + 1) end\nend\n\nfunction table_join(t, s)\n\tif not s then\n\t\ts = \" \"\n\tend\n\tlocal str = \"\"\n\tfor index, value in ipairs(t) do\n\t\tstr = str .. t[index] .. (index == #t and \"\" or s)\n\tend\n\treturn str\nend\n\nfunction exec(cmd, args, writer, timeout)\n\tlocal os = require \"os\"\n\tlocal nixio = require \"nixio\"\n\n\tlocal fdi, fdo = nixio.pipe()\n\tlocal pid = nixio.fork()\n\n\tif pid > 0 then\n\t\tfdo:close()\n\n\t\tif writer or timeout then\n\t\t\tlocal starttime = os.time()\n\t\t\twhile true do\n\t\t\t\tif timeout and os.difftime(os.time(), starttime) >= timeout then\n\t\t\t\t\tnixio.kill(pid, nixio.const.SIGTERM)\n\t\t\t\t\treturn 1\n\t\t\t\tend\n\n\t\t\t\tif writer then\n\t\t\t\t\tlocal buffer = fdi:read(2048)\n\t\t\t\t\tif buffer and #buffer > 0 then\n\t\t\t\t\t\twriter(buffer)\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\tlocal wpid, stat, code = nixio.waitpid(pid, \"nohang\")\n\n\t\t\t\tif wpid and stat == \"exited\" then return code end\n\n\t\t\t\tif not writer and timeout then nixio.nanosleep(1) end\n\t\t\tend\n\t\telse\n\t\t\tlocal wpid, stat, code = nixio.waitpid(pid)\n\t\t\treturn wpid and stat == \"exited\" and code\n\t\tend\n\telseif pid == 0 then\n\t\tnixio.dup(fdo, nixio.stdout)\n\t\tfdi:close()\n\t\tfdo:close()\n\t\tnixio.exece(cmd, args, nil)\n\t\tnixio.stdout:close()\n\t\tos.exit(1)\n\tend\nend\n\nfunction parseURL(url_str)\n\tlocal res = {}\n\n\t-- 1. Get Scheme (http://)\n\tlocal rest = url_str\n\tlocal scheme, s_rest = url_str:match(\"^([%w%.%-%+]+)://(.+)$\")\n\tif scheme then\n\t\tres.protocol = scheme\n\t\trest = s_rest\n\tend\n\n\t-- 2. Get Authority (user:pass@host:port) and Path\n\tlocal authority, path = rest:match(\"^([^/]+)(.*)$\")\n\tif path and path ~= \"\" then\n\t\tres.pathname = path:match(\"^([^?#]*)\")\n\tend\n\n\t-- 3. Process Auth info (user:pass@)\n\t-- Use [^@]+ to match the content before the leftmost @.\n\tlocal user_info, host_port = authority:match(\"^([^@]+)@(.+)$\")\n\tif user_info then\n\t\tlocal u, p = user_info:match(\"^([^:]+):?(.*)$\")\n\t\tres.username = u or \"\"\n\t\tres.password = p or \"\"\n\telse\n\t\thost_port = authority\n\tend\n\n\t-- 4. Handles Host and Port (IPv6 compatible)\n\t-- First look for square brackets [], if not found, then look for regular colons.\n\tlocal ipv6_host, ipv6_port = host_port:match(\"^%[(.+)%]:(%d+)$\")\n\tif ipv6_host then\n\t\tres.hostname = ipv6_host\n\t\tres.port = tonumber(ipv6_port)\n\telse\n\t\t-- Check if it's an IPv6 address with parentheses but no port number: [2001:db8::1]\n\t\tlocal pure_ipv6 = host_port:match(\"^%[(.+)%]$\")\n\t\tif pure_ipv6 then\n\t\t\tres.hostname = pure_ipv6\n\t\telse\n\t\t\t-- IPv4 or hostname match\n\t\t\tlocal h, p = host_port:match(\"^([^:]+):(%d+)$\")\n\t\t\tif h and p then\n\t\t\t\tres.hostname = h\n\t\t\t\tres.port = tonumber(p)\n\t\t\telse\n\t\t\t\tres.hostname = host_port\n\t\t\tend\n\t\tend\n\tend\n\n\tres.host = host_port\n\treturn res\nend\n\nfunction compare_versions(ver1, comp, ver2)\n\tlocal table = table\n\n\tif not ver1 then ver1 = \"\" end\n\tif not ver2 then ver2 = \"\" end\n\n\tlocal av1 = util.split(ver1, \"[%.%-]\", nil, true)\n\tlocal av2 = util.split(ver2, \"[%.%-]\", nil, true)\n\n\tlocal max = table.getn(av1)\n\tlocal n2 = table.getn(av2)\n\tif (max < n2) then max = n2 end\n\n\tfor i = 1, max, 1 do\n\t\tlocal s1 = tonumber(av1[i] or 0) or 0\n\t\tlocal s2 = tonumber(av2[i] or 0) or 0\n\n\t\tif comp == \"~=\" and (s1 ~= s2) then return true end\n\t\tif (comp == \"<\" or comp == \"<=\") and (s1 < s2) then return true end\n\t\tif (comp == \">\" or comp == \">=\") and (s1 > s2) then return true end\n\t\tif (s1 ~= s2) then return false end\n\tend\n\n\treturn not (comp == \"<\" or comp == \">\")\nend\n\nlocal function auto_get_arch()\n\tlocal arch = nixio.uname().machine or \"\"\n\tif not OPENWRT_ARCH and fs.access(\"/usr/lib/os-release\") then\n\t\tOPENWRT_ARCH = sys.exec(\"echo -n $(grep 'OPENWRT_ARCH' /usr/lib/os-release | awk -F '[\\\\042\\\\047]' '{print $2}')\")\n\t\tif OPENWRT_ARCH == \"\" then OPENWRT_ARCH = nil end\n\tend\n\tif not DISTRIB_ARCH and fs.access(\"/etc/openwrt_release\") then\n\t\tDISTRIB_ARCH = sys.exec(\"echo -n $(grep 'DISTRIB_ARCH' /etc/openwrt_release | awk -F '[\\\\042\\\\047]' '{print $2}')\")\n\t\tif DISTRIB_ARCH == \"\" then DISTRIB_ARCH = nil end\n\tend\n\n\tif arch:match(\"^i[%d]86$\") then\n\t\tarch = \"x86\"\n\telseif arch:match(\"armv5\") then  -- armv5l\n\t\tarch = \"armv5\"\n\telseif arch:match(\"armv6\") then\n\t\tarch = \"armv6\"\n\telseif arch:match(\"armv7\") then  -- armv7l\n\t\tarch = \"armv7\"\n\tend\n\n\tif OPENWRT_ARCH or DISTRIB_ARCH then\n\t\tif arch == \"mips\" then\n\t\t\tif OPENWRT_ARCH and OPENWRT_ARCH:match(\"mipsel\") == \"mipsel\"\n\t\t\tor DISTRIB_ARCH and DISTRIB_ARCH:match(\"mipsel\") == \"mipsel\" then\n\t\t\t\tarch = \"mipsel\"\n\t\t\tend\n\t\telseif arch == \"armv7\" then\n\t\t\tif OPENWRT_ARCH and not OPENWRT_ARCH:match(\"vfp\") and not OPENWRT_ARCH:match(\"neon\")\n\t\t\tor DISTRIB_ARCH and not DISTRIB_ARCH:match(\"vfp\") and not DISTRIB_ARCH:match(\"neon\") then\n\t\t\t\tarch = \"armv5\"\n\t\t\tend\n\t\tend\n\tend\n\n\treturn trim(arch)\nend\n\nlocal default_file_tree = {\n\tx86_64  = \"amd64\",\n\tx86     = \"386\",\n\taarch64 = \"arm64\",\n\trockchip = \"arm64\",\n\tmips    = \"mips\",\n\tmips64  = \"mips64\",\n\tmipsel  = \"mipsel\",\n\tmips64el = \"mips64el\",\n\tarmv5   = \"arm.*5\",\n\tarmv6   = \"arm.*6[^4]*\",\n\tarmv7   = \"arm.*7\",\n\tarmv8   = \"arm64\",\n\triscv64 = \"riscv64\"\n}\n\nfunction get_api_json(url)\n\tlocal jsonc = require \"luci.jsonc\"\n\tlocal return_code, content = curl_logic(url, nil, curl_args)\n\tif return_code ~= 0 or content == \"\" then return {} end\n\treturn jsonc.parse(content) or {}\nend\n\nlocal function check_path(app_name)\n\tlocal path = get_app_path(app_name) or \"\"\n\tif path == \"\" then\n\t\treturn {\n\t\t\tcode = 1,\n\t\t\terror = i18n.translatef(\"You did not fill in the %s path. Please save and apply then update manually.\", app_name)\n\t\t}\n\tend\n\treturn {\n\t\tcode = 0,\n\t\tapp_path = path\n\t}\nend\n\nfunction to_check(arch, app_name)\n\tlocal result = check_path(app_name)\n\tif result.code ~= 0 then\n\t\treturn result\n\tend\n\n\tif not arch or arch == \"\" then arch = auto_get_arch() end\n\n\tlocal file_tree = com[app_name].file_tree[arch] or default_file_tree[arch] or \"\"\n\n\tif file_tree == \"\" then\n\t\treturn {\n\t\t\tcode = 1,\n\t\t\terror = i18n.translate(\"Can't determine ARCH, or ARCH not supported.\")\n\t\t}\n\tend\n\n\tlocal local_version = get_app_version(app_name)\n\tlocal match_file_name = string.format(com[app_name].match_fmt_str, file_tree)\n\tlocal json = get_api_json(com[app_name]:get_url())\n\n\tif #json > 0 then\n\t\tjson = json[1]\n\tend\n\n\tif json.tag_name == nil then\n\t\treturn {\n\t\t\tcode = 1,\n\t\t\terror = i18n.translate(\"Get remote version info failed.\")\n\t\t}\n\tend\n\n\tlocal remote_version = json.tag_name\n\tif com[app_name].remote_version_str_replace then\n\t\tremote_version = remote_version:gsub(com[app_name].remote_version_str_replace, \"\")\n\tend\n\tlocal has_update = compare_versions(local_version:match(\"[^v]+\"), \"<\", remote_version:match(\"[^v]+\"))\n--[[\n\tif not has_update then\n\t\treturn {\n\t\t\tcode = 0,\n\t\t\tlocal_version = local_version,\n\t\t\tremote_version = remote_version\n\t\t}\n\tend\n]]\n\tlocal asset = {}\n\tfor _, v in ipairs(json.assets) do\n\t\tif v.name and v.name:match(match_file_name) then\n\t\t\tasset = v\n\t\t\tbreak\n\t\tend\n\tend\n\tif not asset.browser_download_url then\n\t\treturn {\n\t\t\tcode = 1,\n\t\t\tlocal_version = local_version,\n\t\t\tremote_version = remote_version,\n\t\t\thtml_url = json.html_url,\n\t\t\tdata = asset,\n\t\t\terror = i18n.translate(\"New version found, but failed to get new version download url.\")\n\t\t}\n\tend\n\n\treturn {\n\t\tcode = 0,\n\t\thas_update = has_update,\n\t\tlocal_version = local_version,\n\t\tremote_version = remote_version,\n\t\thtml_url = json.html_url,\n\t\tdata = asset\n\t}\nend\n\nfunction to_download(app_name, url, size)\n\tlocal result = check_path(app_name)\n\tif result.code ~= 0 then\n\t\treturn result\n\tend\n\n\tif not url or url == \"\" then\n\t\treturn {code = 1, error = i18n.translate(\"Download url is required.\")}\n\tend\n\n\tsys.call(\"/bin/rm -f /tmp/\".. app_name ..\"_download.*\")\n\n\tlocal tmp_file = trim(util.exec(\"mktemp -u -t \".. app_name ..\"_download.XXXXXX\"))\n\n\tif size then\n\t\tlocal kb1 = get_free_space(\"/tmp\")\n\t\tif tonumber(size) > tonumber(kb1) then\n\t\t\treturn {code = 1, error = i18n.translatef(\"%s not enough space.\", \"/tmp\")}\n\t\tend\n\tend\n\n\tlocal _curl_args = clone(curl_args)\n\ttable.insert(_curl_args, \"--speed-limit 51200 --speed-time 15 --max-time 300\")\n\n\tlocal return_code, result = curl_logic(url, tmp_file, _curl_args)\n\tresult = return_code == 0\n\n\tif not result then\n\t\texec(\"/bin/rm\", {\"-f\", tmp_file})\n\t\treturn {\n\t\t\tcode = 1,\n\t\t\terror = i18n.translatef(\"File download failed or timed out: %s\", url)\n\t\t}\n\tend\n\n\treturn {code = 0, file = tmp_file, zip = com[app_name].zipped }\nend\n\nfunction to_extract(app_name, file, subfix)\n\tlocal result = check_path(app_name)\n\tif result.code ~= 0 then\n\t\treturn result\n\tend\n\n\tif not file or file == \"\" or not fs.access(file) then\n\t\treturn {code = 1, error = i18n.translate(\"File path required.\")}\n\tend\n\n\tlocal tools_name\n\tif com[app_name].zipped then\n\t\tif not com[app_name].zipped_suffix or com[app_name].zipped_suffix == \"zip\" then\n\t\t\ttools_name = \"unzip\"\n\t\tend\n\t\tif com[app_name].zipped_suffix and com[app_name].zipped_suffix == \"tar.gz\" then\n\t\t\ttools_name = \"tar\"\n\t\tend\n\t\tif tools_name then\n\t\t\tif sys.exec(\"echo -n $(command -v %s)\" % { tools_name }) == \"\" then\n\t\t\t\texec(\"/bin/rm\", {\"-f\", file})\n\t\t\t\treturn {\n\t\t\t\t\tcode = 1,\n\t\t\t\t\terror = i18n.translate(\"Not installed %s, Can't unzip!\" % { tools_name })\n\t\t\t\t}\n\t\t\tend\n\t\tend\n\tend\n\n\tsys.call(\"/bin/rm -rf /tmp/\".. app_name ..\"_extract.*\")\n\n\tlocal new_file_size = get_file_space(file)\n\tlocal tmp_free_size = get_free_space(\"/tmp\")\n\tif tmp_free_size <= 0 or tmp_free_size <= new_file_size then\n\t\treturn {code = 1, error = i18n.translatef(\"%s not enough space.\", \"/tmp\")}\n\tend\n\n\tlocal tmp_dir = trim(util.exec(\"mktemp -d -t \".. app_name ..\"_extract.XXXXXX\"))\n\n\tlocal output = {}\n\n\tif tools_name then\n\t\tif tools_name == \"unzip\" then\n\t\t\tlocal bin = sys.exec(\"echo -n $(command -v unzip)\")\n\t\t\texec(bin, {\"-o\", file, app_name, \"-d\", tmp_dir}, function(chunk) output[#output + 1] = chunk end)\n\t\telseif tools_name == \"tar\" then\n\t\t\tlocal bin = sys.exec(\"echo -n $(command -v tar)\")\n\t\t\tif com[app_name].zipped_suffix == \"tar.gz\" then\n\t\t\t\texec(bin, {\"-zxf\", file, \"-C\", tmp_dir}, function(chunk) output[#output + 1] = chunk end)\n\t\t\t\tsys.call(\"/bin/mv -f \" .. tmp_dir .. \"/*/\" .. com[app_name].name:lower() .. \" \" .. tmp_dir)\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal files = util.split(table.concat(output))\n\n\texec(\"/bin/rm\", {\"-f\", file})\n\n\treturn {code = 0, file = tmp_dir}\nend\n\nfunction to_move(app_name,file)\n\tlocal result = check_path(app_name)\n\tif result.code ~= 0 then\n\t\treturn result\n\tend\n\n\tlocal app_path = result.app_path\n\tlocal bin_path = file\n\tlocal cmd_rm_tmp = \"/bin/rm -rf /tmp/\" .. app_name .. \"_download.*\"\n\tif fs.stat(file, \"type\") == \"dir\" then\n\t\tbin_path = file .. \"/\" .. com[app_name].name:lower()\n\t\tcmd_rm_tmp = \"/bin/rm -rf /tmp/\" .. app_name .. \"_extract.*\"\n\tend\n\n\tif not file or file == \"\" then\n\t\tsys.call(cmd_rm_tmp)\n\t\treturn {code = 1, error = i18n.translate(\"Client file is required.\")}\n\tend\n\n\tlocal new_version = get_app_version(app_name, bin_path)\n\tif new_version == \"\" then\n\t\tsys.call(cmd_rm_tmp)\n\t\treturn {\n\t\t\tcode = 1,\n\t\t\terror = i18n.translate(\"The client file is not suitable for current device.\")..app_name..\"__\"..bin_path\n\t\t}\n\tend\n\n\tlocal flag = sys.call('pgrep -af \"passwall2/.*'.. app_name ..'\" >/dev/null')\n\tif flag == 0 then\n\t\tsys.call(\"/etc/init.d/passwall2 stop\")\n\tend\n\n\tlocal old_app_size = 0\n\tif fs.access(app_path) then\n\t\told_app_size = get_file_space(app_path)\n\tend\n\tlocal new_app_size = get_file_space(bin_path)\n\tlocal final_dir = get_final_dir(app_path)\n\tlocal final_dir_free_size = get_free_space(final_dir)\n\tif final_dir_free_size > 0 then\n\t\tfinal_dir_free_size = final_dir_free_size + old_app_size\n\t\tif new_app_size > final_dir_free_size then\n\t\t\tsys.call(cmd_rm_tmp)\n\t\t\treturn {code = 1, error = i18n.translatef(\"%s not enough space.\", final_dir)}\n\t\tend\n\tend\n\n\tresult = exec(\"/bin/mv\", { \"-f\", bin_path, app_path }, nil, command_timeout) == 0\n\n\tsys.call(cmd_rm_tmp)\n\tif flag == 0 then\n\t\tsys.call(\"/etc/init.d/passwall2 restart >/dev/null 2>&1 &\")\n\tend\n\n\tif not result or not fs.access(app_path) then\n\t\treturn {\n\t\t\tcode = 1,\n\t\t\terror = i18n.translatef(\"Can't move new file to path: %s\", app_path)\n\t\t}\n\tend\n\n\treturn {code = 0}\nend\n\nfunction get_version()\n\tlocal version = sys.exec(\"opkg list-installed luci-app-passwall2 2>/dev/null | awk '{print $3}'\")\n\tif not version or #version == 0 then\n\t\tversion = sys.exec(\"apk list luci-app-passwall2 2>/dev/null | awk '/installed/ {print $1}' | cut -d'-' -f4-\")\n\tend\n\treturn (version or \"\"):gsub(\"\\n\", \"\"):match(\"^([^-]+)\")\nend\n\nfunction to_check_self()\n\tlocal url = \"https://raw.githubusercontent.com/Openwrt-Passwall/openwrt-passwall2/main/luci-app-passwall2/Makefile\"\n\tlocal tmp_file = \"/tmp/passwall2_makefile\"\n\tlocal return_code, result = curl_auto(url, tmp_file, curl_args)\n\tresult = return_code == 0\n\tif not result then\n\t\texec(\"/bin/rm\", {\"-f\", tmp_file})\n\t\treturn {\n\t\t\tcode = 1,\n\t\t\terror = i18n.translatef(\"Failed\")\n\t\t}\n\tend\n\tlocal local_version  = get_version()\n\tlocal remote_version = sys.exec(\"echo -n $(grep '^PKG_VERSION' /tmp/passwall2_makefile | head -n 1 | awk -F '=' '{print $2}')\")\n\texec(\"/bin/rm\", {\"-f\", tmp_file})\n\n\tlocal has_update = compare_versions(local_version, \"<\", remote_version)\n\tif not has_update then\n\t\treturn {\n\t\t\tcode = 0,\n\t\t\tlocal_version = local_version,\n\t\t\tremote_version = remote_version\n\t\t}\n\tend\n\treturn {\n\t\tcode = 1,\n\t\thas_update = true,\n\t\tlocal_version = local_version,\n\t\tremote_version = remote_version,\n\t\terror = i18n.translatef(\"The latest version: %s, currently does not support automatic update, if you need to update, please compile or download the ipk and then manually install.\", remote_version)\n\t}\nend\n\nfunction cacheFileCompareToLogic(file, str)\n\tlocal result = nil\n\tif file and str then\n\t\tlocal file_str = \"\"\n\t\tif fs.access(file) then\n\t\t\tfile_str = sys.exec(\"cat \" .. file)\n\t\tend\n\n\t\tif file_str ~= str then\n\t\t\tsys.call(\"rm -f \" .. file)\n\t\t\tresult = false\n\t\telse\n\t\t\tresult = true\n\t\tend\n\n\t\tlocal f_out = io.open(file, \"w\")\n\t\tif f_out then\n\t\t\tf_out:write(str)\n\t\t\tf_out:close()\n\t\tend\n\tend\n\treturn result\nend\n\nfunction is_js_luci()\n\treturn sys.call('[ -f \"/www/luci-static/resources/uci.js\" ]') == 0\nend\n\nfunction set_apply_on_parse(map)\n\tif not map then\n\t\treturn\n\tend\n\tlocal lang = uci:get(\"luci\", \"main\", \"lang\") or \"auto\"\n\tif lang == \"auto\" then\n\t\tlocal http = require \"luci.http\"\n\t\tlocal aclang = http.getenv(\"HTTP_ACCEPT_LANGUAGE\") or \"\"\n\t\tfor lpat in aclang:gmatch(\"[%w-]+\") do\n\t\t\tlpat = lpat and lpat:gsub(\"-\", \"_\")\n\t\t\tif uci:get(\"luci\", \"languages\", lpat) then\n\t\t\t\tlang = lpat\n\t\t\t\tbreak\n\t\t\tend\n\t\t\tlpat = lpat and lpat:lower()\n\t\t\tif uci:get(\"luci\", \"languages\", lpat) then\n\t\t\t\tlang = lpat\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\t\tif lang ~= \"auto\" then\n\t\t\tsh_uci_set(appname, \"@global[0]\", \"auto_lang\", lang, true)\n\t\tend\n\tend\n\tif is_js_luci() == true then\n\t\tlocal hide_popup_box = nil\n\t\tif hide_popup_box == true then\n\t\t\tmap.apply_on_parse = false\n\t\t\tmap.on_after_apply = function(self)\n\t\t\t\tif self.redirect then\n\t\t\t\t\tos.execute(\"sleep 1\")\n\t\t\t\t\tluci.http.redirect(self.redirect)\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tapply_redirect(map)\n\t\t\tlocal old = map.on_after_save\n\t\t\tmap.on_after_save = function(self)\n\t\t\t\tif old then old(self) end\n\t\t\t\tmap:set(\"@global[0]\", \"timestamp\", os.time())\n\t\t\tend\n\t\t\tlocal cbi = require \"luci.cbi\"\n\t\t\tmap:append(cbi.Template(appname .. \"/cbi/optimize_cbi_ui\"))\n\t\tend\n\tend\nend\n\nfunction luci_types(id, m, s, type_name, option_prefix)\n\tlocal rewrite_option_table = {}\n\tfor key, value in pairs(s.fields) do\n\t\tif key:find(option_prefix) == 1 then\n\t\t\tif not s.fields[key].not_rewrite then\n\t\t\t\tif s.fields[key].rewrite_option then\n\t\t\t\t\tif not rewrite_option_table[s.fields[key].rewrite_option] then\n\t\t\t\t\t\trewrite_option_table[s.fields[key].rewrite_option] = 1\n\t\t\t\t\telse\n\t\t\t\t\t\trewrite_option_table[s.fields[key].rewrite_option] = rewrite_option_table[s.fields[key].rewrite_option] + 1\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\ts.fields[key].cfgvalue = function(self, section)\n\t\t\t\t\t-- Add a custom `custom_cfgvalue` attribute. If a custom `custom_cfgvalue` function exists, the custom `cfgvalue` logic will be used.\n\t\t\t\t\tif self.custom_cfgvalue then\n\t\t\t\t\t\treturn self:custom_cfgvalue(section)\n\t\t\t\t\telse\n\t\t\t\t\t\tif self.rewrite_option then\n\t\t\t\t\t\t\treturn m:get(section, self.rewrite_option)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif self.option:find(option_prefix) == 1 then\n\t\t\t\t\t\t\t\treturn m:get(section, self.option:sub(1 + #option_prefix))\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\ts.fields[key].write = function(self, section, value)\n\t\t\t\t\tif s.fields[\"type\"]:formvalue(id) == type_name then\n\t\t\t\t\t\t-- Add a custom `custom_write` attribute; if a custom `custom_write` function exists, then use the custom write logic.\n\t\t\t\t\t\tif self.custom_write then\n\t\t\t\t\t\t\tself:custom_write(section, value)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif self.rewrite_option then\n\t\t\t\t\t\t\t\tm:set(section, self.rewrite_option, value)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif self.option:find(option_prefix) == 1 then\n\t\t\t\t\t\t\t\t\tm:set(section, self.option:sub(1 + #option_prefix), value)\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\ts.fields[key].remove = function(self, section)\n\t\t\t\t\tif s.fields[\"type\"]:formvalue(id) == type_name then\n\t\t\t\t\t\t-- Add a custom `custom_remove` attribute; if a custom `custom_remove` function exists, use the custom remove logic.\n\t\t\t\t\t\tif self.custom_remove then\n\t\t\t\t\t\t\tself:custom_remove(section)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif self.rewrite_option and rewrite_option_table[self.rewrite_option] == 1 then\n\t\t\t\t\t\t\t\tm:del(section, self.rewrite_option)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tif self.option:find(option_prefix) == 1 then\n\t\t\t\t\t\t\t\t\tm:del(section, self.option:sub(1 + #option_prefix))\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tlocal deps = s.fields[key].deps\n\t\t\tif #deps > 0 then\n\t\t\t\tfor index, value in ipairs(deps) do\n\t\t\t\t\tdeps[index][\"type\"] = type_name\n\t\t\t\tend\n\t\t\telse\n\t\t\t\ts.fields[key]:depends({ type = type_name })\n\t\t\tend\n\t\tend\n\tend\nend\nfunction format_go_time(input)\n\tinput = input and trim(input)\n\tlocal N = 0\n\tif input and input:match(\"^%d+$\") then\n\t\tN = tonumber(input)\n\telseif input and input ~= \"\" then\n\t\tfor value, unit in input:gmatch(\"(%d+)%s*([hms])\") do\n\t\t\tvalue = tonumber(value)\n\t\t\tif unit == \"h\" then\n\t\t\t\tN = N + value * 3600\n\t\t\telseif unit == \"m\" then\n\t\t\t\tN = N + value * 60\n\t\t\telseif unit == \"s\" then\n\t\t\t\tN = N + value\n\t\t\tend\n\t\tend\n\tend\n\tif N <= 0 then\n\t\treturn \"0s\"\n\tend\n\tlocal result = \"\"\n\tlocal h = math.floor(N / 3600)\n\tlocal m = math.floor(N % 3600 / 60)\n\tlocal s = N % 60\n\tif h > 0 then result = result .. h .. \"h\" end\n\tif m > 0 then result = result .. m .. \"m\" end\n\tif s > 0 or result == \"\" then result = result .. s .. \"s\" end\n\treturn result\nend\n\nfunction apply_redirect(m)\n\tlocal tmp_uci_file = \"/etc/config/\" .. appname .. \"_redirect\"\n\tif m.redirect and m.redirect ~= \"\" then\n\t\tif fs.access(tmp_uci_file) then\n\t\t\tlocal redirect\n\t\t\tfor line in io.lines(tmp_uci_file) do\n\t\t\t\tredirect = line:match(\"option%s+url%s+['\\\"]([^'\\\"]+)['\\\"]\")\n\t\t\t\tif redirect and redirect ~= \"\" then break end\n\t\t\tend\n\t\t\tif redirect and redirect ~= \"\" then\n\t\t\t\tsys.call(\"/bin/rm -f \" .. tmp_uci_file)\n\t\t\t\tluci.http.redirect(redirect)\n\t\t\tend\n\t\telse\n\t\t\tfs.writefile(tmp_uci_file, \"config redirect\\n\")\n\t\tend\n\t\tm.on_after_save = function(self)\n\t\t\tlocal redirect = self.redirect\n\t\t\tif redirect and redirect ~= \"\" then\n\t\t\t\tuci:set(appname .. \"_redirect\", \"@redirect[0]\", \"url\", redirect)\n\t\t\tend\n\t\tend\n\telse\n\t\tsys.call(\"/bin/rm -f \" .. tmp_uci_file)\n\tend\nend\n\nfunction match_node_rule(name, rule)\n\tif not name then return false end\n\tif not rule or rule == \"\" then return true end\n\t-- split rule by &&\n\tlocal function split_and(expr)\n\t\tlocal t = {}\n\t\tfor part in expr:gmatch(\"[^&]+\") do\n\t\t\tpart = part:gsub(\"^%s+\", \"\"):gsub(\"%s+$\", \"\")\n\t\t\tif part ~= \"\" then\n\t\t\t\ttable.insert(t, part)\n\t\t\tend\n\t\tend\n\t\treturn t\n\tend\n\t-- match single condition\n\tlocal function match_cond(str, cond)\n\t\tif cond == \"\" then\n\t\t\treturn true\n\t\tend\n\t\t-- exclude: !xxx\n\t\tif cond:sub(1, 1) == \"!\" then\n\t\t\tlocal k = cond:sub(2)\n\t\t\tif k == \"\" then return true end\n\t\t\treturn not str:find(k, 1, true)\n\t\tend\n\t\t-- prefix: ^xxx\n\t\tif cond:sub(1, 1) == \"^\" then\n\t\t\tlocal k = cond:sub(2)\n\t\t\treturn str:sub(1, #k) == k\n\t\tend\n\t\t-- suffix: xxx$\n\t\tif cond:sub(-1) == \"$\" then\n\t\t\tlocal k = cond:sub(1, -2)\n\t\t\treturn str:sub(-#k) == k\n\t\tend\n\t\t-- contains\n\t\treturn str:find(cond, 1, true) ~= nil\n\tend\n\t-- AND logic\n\tfor _, cond in ipairs(split_and(rule)) do\n\t\tif not match_cond(name, cond) then\n\t\t\treturn false\n\t\tend\n\tend\n\treturn true\nend\n\nfunction get_core(field, candidates)\n\tlocal v = uci:get(appname, \"@global_subscribe[0]\", field)\n\tif v and v ~= \"\" then\n\t\tfor _, c in ipairs(candidates) do\n\t\t\tif c[2] == v and c[1] then\n\t\t\t\treturn v\n\t\t\tend\n\t\tend\n\tend\n\tfor _, c in ipairs(candidates) do\n\t\tif c[1] then return c[2] end\n\tend\n\treturn nil\nend\n\nfunction cleanEmptyTables(t)\n\tif type(t) ~= \"table\" then return nil end\n\tfor k, v in pairs(t) do\n\t\tif type(v) == \"table\" then\n\t\t\tt[k] = cleanEmptyTables(v)\n\t\tend\n\tend\n\treturn next(t) and t or nil\nend\n\nfunction get_dnsmasq_server_domain()\n\tlocal dnsmasq_server = uci:get(\"dhcp\", \"@dnsmasq[0]\", \"server\")\n\tlocal dnsmasq_server_t = {}\n\tif dnsmasq_server and #dnsmasq_server > 0 then\n\t\tfor k, v in ipairs(dnsmasq_server) do\n\t\t\tif v:find(\"/\") then\n\t\t\t\tlocal split1 = split(v, \"/\")\n\t\t\t\tif #split1 > 2 then\n\t\t\t\t\tlocal domain = split1[2]\n\t\t\t\t\tlocal upstream_dns = split1[#split1]\n\t\t\t\t\tlocal upstream_dns_server\n\t\t\t\t\tlocal upstream_dns_port = \"53\"\n\t\t\t\t\tlocal dns_split = split(upstream_dns, \"#\")\n\t\t\t\t\tif #dns_split > 1 then\n\t\t\t\t\t\tupstream_dns_server = dns_split[1]\n\t\t\t\t\t\tupstream_dns_port = dns_split[#dns_split]\n\t\t\t\t\telse\n\t\t\t\t\t\tupstream_dns_server = upstream_dns\n\t\t\t\t\tend\n\t\t\t\t\tdnsmasq_server_t[domain] = {\n\t\t\t\t\t\tdnsmasq_dns = upstream_dns,\n\t\t\t\t\t\tserver = upstream_dns_server,\n\t\t\t\t\t\tport = tonumber(upstream_dns_port)\n\t\t\t\t\t}\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\treturn dnsmasq_server_t\nend"
  },
  {
    "path": "luci-app-passwall2/luasrc/passwall2/com.lua",
    "content": "local _M = {}\n\nlocal function gh_release_url(self)\n\t--return \"https://api.github.com/repos/\" .. self.repo .. \"/releases/latest\"\n\treturn \"https://github.com/Openwrt-Passwall/openwrt-passwall-packages/releases/download/api-cache/\" .. string.lower(self.name) .. \"-release-api.json\"\nend\n\nlocal function gh_pre_release_url(self)\n\t--return \"https://api.github.com/repos/\" .. self.repo .. \"/releases?per_page=1\"\n\treturn \"https://github.com/Openwrt-Passwall/openwrt-passwall-packages/releases/download/api-cache/\" .. string.lower(self.name) .. \"-pre-release-api.json\"\nend\n\n_M.hysteria = {\n\tname = \"Hysteria\",\n\trepo = \"HyNetwork/hysteria\",\n\tget_url = gh_release_url,\n\tcmd_version = \"version | awk '/^Version:/ {print $2}'\",\n\tremote_version_str_replace = \"app/\",\n\tzipped = false,\n\tdefault_path = \"/usr/bin/hysteria\",\n\tmatch_fmt_str = \"linux%%-%s$\",\n\tfile_tree = {\n\t\tarmv6 = \"arm\",\n\t\tarmv7 = \"arm\"\n\t}\n}\n\n_M[\"sing-box\"] = {\n\tname = \"Sing-Box\",\n\trepo = \"SagerNet/sing-box\",\n\tget_url = gh_release_url,\n\tcmd_version = \"version | awk '{print $3}' | sed -n 1P\",\n\tzipped = true,\n\tzipped_suffix = \"tar.gz\",\n\tdefault_path = \"/usr/bin/sing-box\",\n\tmatch_fmt_str = \"linux%%-%s\",\n\tfile_tree = {\n\t\tx86_64 = \"amd64%-musl\",\n\t\tx86     = \"386%-musl\",\n\t\taarch64 = \"arm64%-musl\",\n\t\trockchip = \"arm64%-musl\",\n\t\tmips    = \"mips%-softfloat\",\n\t\tmips64  = \"mips64%-softfloat\",\n\t\tmipsel  = \"mipsle%-softfloat%-musl\",\n\t\tmips64el = \"mips64le%-softfloat\",\n\t\tarmv7   = \"armv7%-musl\",\n\t\tarmv8   = \"arm64%-musl\",\n\t\triscv64 = \"riscv64%-musl\"\n\t}\n}\n\n_M.xray = {\n\tname = \"Xray\",\n\trepo = \"XTLS/Xray-core\",\n\tget_url = gh_pre_release_url,\n\tcmd_version = \"version | awk '{print $2}' | sed -n 1P\",\n\tzipped = true,\n\tdefault_path = \"/usr/bin/xray\",\n\tmatch_fmt_str = \"linux%%-%s\",\n\tfile_tree = {\n\t\tx86_64 = \"64\",\n\t\tx86    = \"32\",\n\t\tmips   = \"mips32\",\n\t\tmipsel = \"mips32le\",\n\t\tmips64el = \"mips64le\"\n\t}\n}\n\n_M.geoview = {\n\tname = \"Geoview\",\n\trepo = \"snowie2000/geoview\",\n\tget_url = gh_release_url,\n\tcmd_version = '-version 2>/dev/null | awk \\'NR==1 && $1==\"Geoview\" {print $2}\\'',\n\tzipped = false,\n\tdefault_path = \"/usr/bin/geoview\",\n\tmatch_fmt_str = \"linux%%-%s\",\n\tfile_tree = {\n\t\tmipsel = \"mipsle\",\n\t\tmips64el = \"mips64le\"\n\t}\n}\n\nreturn _M\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/passwall2/server_app.lua",
    "content": "#!/usr/bin/lua\n\nlocal action = arg[1]\nlocal api = require \"luci.passwall2.api\"\nlocal sys = api.sys\nlocal uci = api.uci\nlocal jsonc = api.jsonc\n\nlocal CONFIG = \"passwall2_server\"\nlocal CONFIG_PATH = \"/tmp/etc/\" .. CONFIG\nlocal NFT_INCLUDE_FILE = CONFIG_PATH .. \"/\" .. CONFIG .. \".nft\"\nlocal LOG_APP_FILE = \"/tmp/log/\" .. CONFIG .. \".log\"\nlocal TMP_BIN_PATH = CONFIG_PATH .. \"/bin\"\nlocal require_dir = \"luci.passwall2.\"\n\nlocal ipt_bin = sys.exec(\"echo -n $(/usr/share/passwall2/iptables.sh get_ipt_bin)\")\nlocal ip6t_bin = sys.exec(\"echo -n $(/usr/share/passwall2/iptables.sh get_ip6t_bin)\")\n\nlocal nft_flag = api.is_finded(\"fw4\") and \"1\" or \"0\"\n\nlocal function log(...)\n\tlocal f, err = io.open(LOG_APP_FILE, \"a\")\n\tif f and err == nil then\n\t\tlocal str = os.date(\"%Y-%m-%d %H:%M:%S: \") .. table.concat({...}, \" \")\n\t\tf:write(str .. \"\\n\")\n\t\tf:close()\n\tend\nend\n\nlocal function cmd(cmd)\n\tsys.call(cmd)\nend\n\nlocal function ipt(arg)\n\tif ipt_bin and #ipt_bin > 0 then\n\t\tcmd(ipt_bin .. \" -w \" .. arg)\n\tend\nend\n\nlocal function ip6t(arg)\n\tif ip6t_bin and #ip6t_bin > 0 then\n\t\tcmd(ip6t_bin .. \" -w \" .. arg)\n\tend\nend\n\nlocal function ln_run(s, d, command, output)\n\tif not output then\n\t\toutput = \"/dev/null\"\n\tend\n\td = TMP_BIN_PATH .. \"/\" .. d\n\tcmd(string.format('[ ! -f \"%s\" ] && ln -s %s %s 2>/dev/null', d, s, d))\n\treturn string.format(\"%s >%s 2>&1 &\", d .. \" \" ..command, output)\nend\n\nlocal function gen_include()\n\tcmd(string.format(\"echo '#!/bin/sh' > /tmp/etc/%s.include\", CONFIG))\n\tlocal function extract_rules(n, a)\n\t\tlocal _ipt = ipt_bin\n\t\tif n == \"6\" then\n\t\t\t_ipt = ip6t_bin\n\t\tend\n\t\tlocal result = \"*\" .. a\n\t\tresult = result .. \"\\n\" .. sys.exec(_ipt .. '-save -t ' .. a .. ' | grep \"PSW2-SERVER\" | sed -e \"s/^-A \\\\(INPUT\\\\)/-I \\\\1 1/\"')\n\t\tresult = result .. \"COMMIT\"\n\t\treturn result\n\tend\n\tlocal f, err = io.open(\"/tmp/etc/\" .. CONFIG .. \".include\", \"a\")\n\tif f and err == nil then\n\t\tif nft_flag == \"0\" then\n\t\t\tf:write(ipt_bin .. '-save -c | grep -v \"PSW2-SERVER\" | ' .. ipt_bin .. '-restore -c' .. \"\\n\")\n\t\t\tf:write(ipt_bin .. '-restore -n <<-EOT' .. \"\\n\")\n\t\t\tf:write(extract_rules(\"4\", \"filter\") .. \"\\n\")\n\t\t\tf:write(\"EOT\" .. \"\\n\")\n\t\t\tf:write(ip6t_bin .. '-save -c | grep -v \"PSW2-SERVER\" | ' .. ip6t_bin .. '-restore -c' .. \"\\n\")\n\t\t\tf:write(ip6t_bin .. '-restore -n <<-EOT' .. \"\\n\")\n\t\t\tf:write(extract_rules(\"6\", \"filter\") .. \"\\n\")\n\t\t\tf:write(\"EOT\" .. \"\\n\")\n\t\t\tf:close()\n\t\telse\n\t\t\tf:write(\"nft -f \" .. NFT_INCLUDE_FILE .. \"\\n\")\n\t\t\tf:close()\n\t\tend\n\tend\nend\n\nlocal function start()\n\tlocal enabled = tonumber(uci:get(CONFIG, \"@global[0]\", \"enable\") or 0)\n\tif enabled == nil or enabled == 0 then\n\t\treturn\n\tend\n\tcmd(string.format(\"mkdir -p %s %s\", CONFIG_PATH, TMP_BIN_PATH))\n\tcmd(string.format(\"touch %s\", LOG_APP_FILE))\n\tif nft_flag == \"0\" then\n\t\tipt(\"-N PSW2-SERVER\")\n\t\tipt(\"-I INPUT -j PSW2-SERVER\")\n\t\tip6t(\"-N PSW2-SERVER\")\n\t\tip6t(\"-I INPUT -j PSW2-SERVER\")\n\telse\n\t\tnft_file, err = io.open(NFT_INCLUDE_FILE, \"w\")\n\t\tnft_file:write('#!/usr/sbin/nft -f\\n')\n\t\tnft_file:write('add chain inet fw4 PSW2-SERVER\\n')\n\t\tnft_file:write('flush chain inet fw4 PSW2-SERVER\\n')\n\t\tnft_file:write('insert rule inet fw4 input position 0 jump PSW2-SERVER comment \"PSW2-SERVER\"\\n')\n\tend\n\tuci:foreach(CONFIG, \"user\", function(user)\n\t\tlocal id = user[\".name\"]\n\t\tlocal enable = user.enable\n\t\tif enable and tonumber(enable) == 1 then\n\t\t\tlocal enable_log = user.log\n\t\t\tlocal log_path = nil\n\t\t\tif enable_log and enable_log == \"1\" then\n\t\t\t\tlog_path = CONFIG_PATH .. \"/\" .. id .. \".log\"\n\t\t\telse\n\t\t\t\tlog_path = nil\n\t\t\tend\n\t\t\tlocal remarks = user.remarks\n\t\t\tlocal port = tonumber(user.port)\n\t\t\tlocal bin\n\t\t\tlocal config = {}\n\t\t\tlocal config_file = CONFIG_PATH .. \"/\" .. id .. \".json\"\n\t\t\tlocal udp_forward = 1\n\t\t\tlocal type = user.type or \"\"\n\t\t\tif type == \"SS\" or type == \"SSR\" then\n\t\t\t\tif user.custom == \"1\" and user.config_str then\n\t\t\t\t\tconfig = jsonc.parse(api.base64Decode(user.config_str))\n\t\t\t\telse\n\t\t\t\t\tconfig = require(require_dir .. \"util_shadowsocks\").gen_config_server(user)\n\t\t\t\tend\n\t\t\t\tlocal udp_param = \"\"\n\t\t\t\tudp_forward = tonumber(user.udp_forward) or 1\n\t\t\t\tif udp_forward == 1 then\n\t\t\t\t\tudp_param = \"-u\"\n\t\t\t\tend\n\t\t\t\ttype = type:lower()\n\t\t\t\tbin = ln_run(\"/usr/bin/\" .. type .. \"-server\", type .. \"-server\", \"-c \" .. config_file .. \" \" .. udp_param, log_path)\n\t\t\telseif type == \"SS-Rust\" then\n\t\t\t\tif user.custom == \"1\" and user.config_str then\n\t\t\t\t\tconfig = jsonc.parse(api.base64Decode(user.config_str))\n\t\t\t\telse\n\t\t\t\t\tconfig = require(require_dir .. \"util_shadowsocks\").gen_config_server(user)\n\t\t\t\tend\n\t\t\t\tbin = ln_run(\"/usr/bin/ssserver\", \"ssserver\", \"-c \" .. config_file, log_path)\n\t\t\telseif type == \"Xray\" then\n\t\t\t\tif user.custom == \"1\" and user.config_str then\n\t\t\t\t\tconfig = jsonc.parse(api.base64Decode(user.config_str))\n\t\t\t\t\tif log_path then\n\t\t\t\t\t\tif not config.log then\n\t\t\t\t\t\t\tconfig.log = {}\n\t\t\t\t\t\tend\n\t\t\t\t\t\tconfig.log.loglevel = user.loglevel\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tconfig = require(require_dir .. \"util_xray\").gen_config_server(user)\n\t\t\t\tend\n\t\t\t\tbin = ln_run(api.get_app_path(\"xray\"), \"xray\", \"run -c \" .. config_file, log_path)\n\t\t\telseif type == \"sing-box\" then\n\t\t\t\tif user.custom == \"1\" and user.config_str then\n\t\t\t\t\tconfig = jsonc.parse(api.base64Decode(user.config_str))\n\t\t\t\t\tif log_path then\n\t\t\t\t\t\tif not config.log then\n\t\t\t\t\t\t\tconfig.log = {}\n\t\t\t\t\t\tend\n\t\t\t\t\t\tconfig.log.timestamp = true\n\t\t\t\t\t\tconfig.log.disabled = false\n\t\t\t\t\t\tconfig.log.level = user.loglevel\n\t\t\t\t\t\tconfig.log.output = log_path\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tconfig = require(require_dir .. \"util_sing-box\").gen_config_server(user)\n\t\t\t\tend\n\t\t\t\tbin = ln_run(api.get_app_path(\"sing-box\"), \"sing-box\", \"run -c \" .. config_file, log_path)\n\t\t\telseif type == \"Hysteria2\" then\n\t\t\t\tif user.custom == \"1\" and user.config_str then\n\t\t\t\t\tconfig = jsonc.parse(api.base64Decode(user.config_str))\n\t\t\t\telse\n\t\t\t\t\tconfig = require(require_dir .. \"util_hysteria2\").gen_config_server(user)\n\t\t\t\tend\n\t\t\t\tbin = ln_run(api.get_app_path(\"hysteria\"), \"hysteria\", \"-c \" .. config_file .. \" server\", log_path)\n\t\t\tend\n\n\t\t\tif next(config) then\n\t\t\t\tlocal f, err = io.open(config_file, \"w\")\n\t\t\t\tif f and err == nil then\n\t\t\t\t\tf:write(jsonc.stringify(config, 1))\n\t\t\t\t\tf:close()\n\t\t\t\tend\n\t\t\t\tlog(string.format(\"%s %s - %s\", remarks, api.i18n.translate(\"Generate configuration file and run\"), config_file))\n\t\t\tend\n\n\t\t\tif bin then\n\t\t\t\tcmd(bin)\n\t\t\tend\n\n\t\t\tlocal bind_local = user.bind_local or 0\n\t\t\tif bind_local and tonumber(bind_local) ~= 1 and port then\n\t\t\t\tif nft_flag == \"0\" then\n\t\t\t\t\tipt(string.format('-A PSW2-SERVER -p tcp --dport %s -m comment --comment \"%s\" -j ACCEPT', port, remarks))\n\t\t\t\t\tip6t(string.format('-A PSW2-SERVER -p tcp --dport %s -m comment --comment \"%s\" -j ACCEPT', port, remarks))\n\t\t\t\t\tif udp_forward == 1 then\n\t\t\t\t\t\tipt(string.format('-A PSW2-SERVER -p udp --dport %s -m comment --comment \"%s\" -j ACCEPT', port, remarks))\n\t\t\t\t\t\tip6t(string.format('-A PSW2-SERVER -p udp --dport %s -m comment --comment \"%s\" -j ACCEPT', port, remarks))\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tnft_file:write(string.format('add rule inet fw4 PSW2-SERVER meta l4proto tcp tcp dport {%s} counter accept comment \"%s\"\\n', port, remarks))\n\t\t\t\t\tif udp_forward == 1 then\n\t\t\t\t\t\tnft_file:write(string.format('add rule inet fw4 PSW2-SERVER meta l4proto udp udp dport {%s} counter accept comment \"%s\"\\n', port, remarks))\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend)\n\tif nft_flag == \"1\" then\n\t\tnft_file:write(\"add rule inet fw4 PSW2-SERVER return\\n\")\n\t\tnft_file:close()\n\t\tcmd(\"nft -f \" .. NFT_INCLUDE_FILE)\n\tend\n\tgen_include()\nend\n\nlocal function stop()\n\tcmd(string.format(\"/bin/busybox top -bn1 | grep -v 'grep' | grep '%s/' | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1\", CONFIG_PATH))\n\tif nft_flag == \"0\" then\n\t\tipt(\"-D INPUT -j PSW2-SERVER 2>/dev/null\")\n\t\tipt(\"-F PSW2-SERVER 2>/dev/null\")\n\t\tipt(\"-X PSW2-SERVER 2>/dev/null\")\n\t\tip6t(\"-D INPUT -j PSW2-SERVER 2>/dev/null\")\n\t\tip6t(\"-F PSW2-SERVER 2>/dev/null\")\n\t\tip6t(\"-X PSW2-SERVER 2>/dev/null\")\n\telse\n\t\tlocal nft_cmd = \"handles=$(nft -a list chain inet fw4 input | grep -E \\\"PSW2-SERVER\\\" | awk -F '# handle ' '{print$2}')\\n for handle in $handles; do\\n nft delete rule inet fw4 input handle ${handle} 2>/dev/null\\n done\"\n\t\tcmd(nft_cmd)\n\t\tcmd(\"nft flush chain inet fw4 PSW2-SERVER 2>/dev/null\")\n\t\tcmd(\"nft delete chain inet fw4 PSW2-SERVER 2>/dev/null\")\n\tend\n\tcmd(string.format(\"rm -rf %s %s /tmp/etc/%s.include\", CONFIG_PATH, LOG_APP_FILE, CONFIG))\nend\n\nif action then\n\tif action == \"start\" then\n\t\tstart()\n\telseif action == \"stop\" then\n\t\tstop()\n\tend\nend\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/passwall2/util_hysteria2.lua",
    "content": "module(\"luci.passwall2.util_hysteria2\", package.seeall)\nlocal api = require \"luci.passwall2.api\"\nlocal uci = api.uci\nlocal jsonc = api.jsonc\n\nfunction gen_config_server(node)\n\tlocal config = {\n\t\tlisten = \":\" .. node.port,\n\t\ttls = {\n\t\t\tcert = node.tls_certificateFile,\n\t\t\tkey = node.tls_keyFile,\n\t\t},\n\t\tobfs = (node.hysteria2_obfs) and {\n\t\t\ttype = \"salamander\",\n\t\t\tsalamander = {\n\t\t\t\tpassword = node.hysteria2_obfs\n\t\t\t}\n\t\t} or nil,\n\t\tauth = {\n\t\t\ttype = \"password\",\n\t\t\tpassword = node.hysteria2_auth_password\n\t\t},\n\t\tbandwidth = (node.hysteria2_up_mbps or node.hysteria2_down_mbps) and {\n\t\t\tup = node.hysteria2_up_mbps and node.hysteria2_up_mbps .. \" mbps\" or nil,\n\t\t\tdown = node.hysteria2_down_mbps and node.hysteria2_down_mbps .. \" mbps\" or nil\n\t\t} or nil,\n\t\tignoreClientBandwidth = (node.hysteria2_ignoreClientBandwidth == \"1\") and true or false,\n\t\tdisableUDP = (node.hysteria2_udp == \"0\") and true or false,\n\t}\n\treturn config\nend\n\nfunction gen_config(var)\n\tlocal node_id = var[\"node\"]\n\tif not node_id then\n\t\tprint(\"node Cannot be empty!\")\n\t\treturn\n\tend\n\tlocal node = uci:get_all(\"passwall2\", node_id)\n\tlocal local_socks_address = var[\"local_socks_address\"] or \"0.0.0.0\"\n\tlocal local_socks_port = var[\"local_socks_port\"]\n\tlocal local_socks_username = var[\"local_socks_username\"]\n\tlocal local_socks_password = var[\"local_socks_password\"]\n\tlocal local_http_address = var[\"local_http_address\"] or \"0.0.0.0\"\n\tlocal local_http_port = var[\"local_http_port\"]\n\tlocal local_http_username = var[\"local_http_username\"]\n\tlocal local_http_password = var[\"local_http_password\"]\n\tlocal server_host = var[\"server_host\"] or (node.address or \"\"):lower()\n\tlocal server_port = var[\"server_port\"] or node.port\n\n\tif api.is_ipv6(server_host) then\n\t\tserver_host = api.get_ipv6_full(server_host)\n\tend\n\tlocal server = server_host .. \":\" .. server_port\n\n\tif (node.hysteria2_hop) then\n\t\tserver = server .. \",\" .. string.gsub(node.hysteria2_hop, \":\", \"-\")\n\tend\n\n\tlocal config = {\n\t\tserver = server,\n\t\ttransport = {\n\t\t\ttype = \"udp\",\n\t\t\tudp = node.hysteria2_hop and (function()\n\t\t\t\tlocal udp = {}\n\t\t\t\tlocal t = node.hysteria2_hop_interval\n\t\t\t\tif not t then return nil end\n\t\t\t\tif t:find(\"-\", 1, true) then\n\t\t\t\t\tlocal min, max = t:match(\"^(%d+)%-(%d+)$\")\n\t\t\t\t\tmin = tonumber(min)\n\t\t\t\t\tmax = tonumber(max)\n\t\t\t\t\tif min and max then\n\t\t\t\t\t\tmin = (min >= 5) and min or 5\n\t\t\t\t\t\tmax = (max >= min) and max or min\n\t\t\t\t\t\tudp.minHopInterval = min .. \"s\"\n\t\t\t\t\t\tudp.maxHopInterval = max .. \"s\"\n\t\t\t\t\t\treturn udp\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tt = tonumber((t or \"30\"):match(\"^%d+\"))\n\t\t\t\tt = (t and t >= 5) and t or 30\n\t\t\t\tudp.hopInterval = t .. \"s\"\n\t\t\t\treturn udp\n\t\t\tend)() or nil\n\t\t},\n\t\tobfs = (node.hysteria2_obfs) and {\n\t\t\ttype = \"salamander\",\n\t\t\tsalamander = {\n\t\t\t\tpassword = node.hysteria2_obfs\n\t\t\t}\n\t\t} or nil,\n\t\tauth = node.hysteria2_auth_password,\n\t\ttls = {\n\t\t\tsni = node.tls_serverName,\n\t\t\tinsecure = (node.tls_allowInsecure == \"1\") and true or false,\n\t\t\tpinSHA256 = (node.tls_pinSHA256) and node.tls_pinSHA256 or nil,\n\t\t},\n\t\tquic = {\n\t\t\tinitStreamReceiveWindow = (node.hysteria2_recv_window) and tonumber(node.hysteria2_recv_window) or nil,\n\t\t\tinitConnReceiveWindow = (node.hysteria2_recv_window_conn) and tonumber(node.hysteria2_recv_window_conn) or nil,\n\t\t\tmaxIdleTimeout = (function(t)\n\t\t\t\tt = tonumber(tostring(t or \"30\"):match(\"^%d+\"))\n\t\t\t\treturn (t and t >= 4 and t <= 120) and t .. \"s\" or \"30s\"\n\t\t\tend)(node.hysteria2_idle_timeout),\n\t\t\tkeepAlivePeriod = (function(t)\n\t\t\t\tt = tonumber(tostring(t or \"0\"):match(\"^%d+\"))\n\t\t\t\treturn (t and t >= 2 and t <= 60) and t .. \"s\" or nil\n\t\t\tend)(node.hysteria2_keep_alive_period),\n\t\t\tdisablePathMTUDiscovery = (node.hysteria2_disable_mtu_discovery) and true or false,\n\t\t},\n\t\tbandwidth = (node.hysteria2_up_mbps or node.hysteria2_down_mbps) and {\n\t\t\tup = node.hysteria2_up_mbps and node.hysteria2_up_mbps .. \" mbps\" or nil,\n\t\t\tdown = node.hysteria2_down_mbps and node.hysteria2_down_mbps .. \" mbps\" or nil\n\t\t} or nil,\n\t\tfast_open = (node.fast_open == \"1\") and true or false,\n\t\tlazy = (node.hysteria2_lazy_start == \"1\") and true or false,\n\t\tsocks5 = (local_socks_address and local_socks_port) and {\n\t\t\tlisten = local_socks_address .. \":\" .. local_socks_port,\n\t\t\tusername = (local_socks_username and local_socks_password) and local_socks_username or nil,\n\t\t\tpassword = (local_socks_username and local_socks_password) and local_socks_password or nil,\n\t\t\tdisableUDP = false,\n\t\t} or nil,\n\t\thttp = (local_http_address and local_http_port) and {\n\t\t\tlisten = local_http_address .. \":\" .. local_http_port,\n\t\t\tusername = (local_http_username and local_http_password) and local_http_username or nil,\n\t\t\tpassword = (local_http_username and local_http_password) and local_http_password or nil,\n\t\t} or nil\n\t}\n\n\treturn jsonc.stringify(config, 1)\nend\n\n_G.gen_config = gen_config\n\nif arg[1] then\n\tlocal func =_G[arg[1]]\n\tif func then\n\t\tlocal var = nil\n\t\tif arg[2] then\n\t\t\tvar = jsonc.parse(arg[2])\n\t\tend\n\t\tprint(func(var))\n\tend\nend\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/passwall2/util_naiveproxy.lua",
    "content": "module(\"luci.passwall2.util_navieproxy\", package.seeall)\nlocal api = require \"luci.passwall2.api\"\nlocal uci = api.uci\nlocal jsonc = api.jsonc\n\nfunction gen_config(var)\n\tlocal node_id = var[\"node\"]\n\tif not node_id then\n\t\tprint(\"node Cannot be empty!\")\n\t\treturn\n\tend\n\tlocal node = uci:get_all(\"passwall2\", node_id)\n\tlocal run_type = var[\"run_type\"]\n\tlocal local_addr = var[\"local_addr\"]\n\tlocal local_port = var[\"local_port\"]\n\tlocal server_host = var[\"server_host\"] or (node.address or \"\"):lower()\n\tlocal server_port = var[\"server_port\"] or node.port\n\n\tif api.is_ipv6(server_host) then\n\t\tserver_host = api.get_ipv6_full(server_host)\n\tend\n\tlocal server = server_host .. \":\" .. server_port\n\n\tlocal config = {\n\t\tlisten = run_type .. \"://\" .. local_addr .. \":\" .. local_port,\n\t\tproxy = node.protocol .. \"://\" .. node.username .. \":\" .. node.password .. \"@\" .. server\n\t}\n\n\treturn jsonc.stringify(config, 1)\nend\n\n_G.gen_config = gen_config\n\nif arg[1] then\n\tlocal func =_G[arg[1]]\n\tif func then\n\t\tlocal var = nil\n\t\tif arg[2] then\n\t\t\tvar = jsonc.parse(arg[2])\n\t\tend\n\t\tprint(func(var))\n\tend\nend\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/passwall2/util_shadowsocks.lua",
    "content": "module(\"luci.passwall2.util_shadowsocks\", package.seeall)\nlocal api = require \"luci.passwall2.api\"\nlocal uci = api.uci\nlocal jsonc = api.jsonc\n\nfunction gen_config_server(node)\n\tlocal config = {}\n\tconfig.server_port = tonumber(node.port)\n\tconfig.password = node.password\n\tconfig.timeout = tonumber(node.timeout)\n\tconfig.fast_open = (node.tcp_fast_open and node.tcp_fast_open == \"1\") and true or false\n\tconfig.method = node.method\n\n\tif node.type == \"SS-Rust\" then\n\t\tconfig.server = \"::\"\n\t\tconfig.mode = \"tcp_and_udp\"\n\telse\n\t\tconfig.server = {\"[::0]\", \"0.0.0.0\"}\n\tend\n\n\tif node.type == \"SSR\" then\n\t\tconfig.protocol = node.protocol\n\t\tconfig.protocol_param = node.protocol_param\n\t\tconfig.obfs = node.obfs\n\t\tconfig.obfs_param = node.obfs_param\n\tend\n\n\treturn config\nend\n\nlocal plugin_sh, plugin_bin\n\nfunction gen_config(var)\n\tlocal node_id = var[\"node\"]\n\tif not node_id then\n\t\tprint(\"node Cannot be empty!\")\n\t\treturn\n\tend\n\tlocal node = uci:get_all(\"passwall2\", node_id)\n\tlocal server_host = var[\"server_host\"] or (node.address or \"\"):lower()\n\tlocal server_port = var[\"server_port\"] or node.port\n\tlocal local_addr = var[\"local_addr\"]\n\tlocal local_port = var[\"local_port\"]\n\tlocal mode = var[\"mode\"]\n\tlocal local_socks_address = var[\"local_socks_address\"] or \"0.0.0.0\"\n\tlocal local_socks_port = var[\"local_socks_port\"]\n\tlocal local_socks_username = var[\"local_socks_username\"]\n\tlocal local_socks_password = var[\"local_socks_password\"]\n\tlocal local_http_address = var[\"local_http_address\"] or \"0.0.0.0\"\n\tlocal local_http_port = var[\"local_http_port\"]\n\tlocal local_http_username = var[\"local_http_username\"]\n\tlocal local_http_password = var[\"local_http_password\"]\n\n\tif api.is_ipv6(server_host) then\n\t\tserver_host = api.get_ipv6_only(server_host)\n\tend\n\tlocal server = server_host\n\n\tlocal plugin_file\n\tif node.plugin and node.plugin ~= \"\" and node.plugin ~= \"none\" then\n\t\tplugin_sh = var[\"plugin_sh\"] or \"\"\n\t\tplugin_file = (plugin_sh ~=\"\") and plugin_sh or node.plugin\n\t\tplugin_bin = node.plugin\n\tend\n\n\tlocal config = {\n\t\tserver = server,\n\t\tserver_port = tonumber(server_port),\n\t\tlocal_address = local_addr,\n\t\tlocal_port = tonumber(local_port),\n\t\tpassword = node.password,\n\t\tmethod = node.method,\n\t\ttimeout = tonumber(node.timeout),\n\t\tfast_open = (node.tcp_fast_open and node.tcp_fast_open == \"1\") and true or false,\n\t\treuse_port = true\n\t}\n\t\n\tif node.type == \"SS\" then\n\t\tconfig.plugin = plugin_file or nil\n\t\tconfig.plugin_opts = (plugin_file) and node.plugin_opts or nil\n\t\tconfig.mode = mode\n\telseif node.type == \"SSR\" then\n\t\tconfig.protocol = node.protocol\n\t\tconfig.protocol_param = node.protocol_param\n\t\tconfig.obfs = node.obfs\n\t\tconfig.obfs_param = node.obfs_param\n\telseif node.type == \"SS-Rust\" then\n\t\tconfig = {\n\t\t\tservers = {\n\t\t\t\t{\n\t\t\t\t\taddress = server,\n\t\t\t\t\tport = tonumber(server_port),\n\t\t\t\t\tmethod = node.method,\n\t\t\t\t\tpassword = node.password,\n\t\t\t\t\ttimeout = tonumber(node.timeout),\n\t\t\t\t\tplugin = plugin_file or nil,\n\t\t\t\t\tplugin_opts = (plugin_file) and node.plugin_opts or nil\n\t\t\t\t}\n\t\t\t},\n\t\t\tlocals = {},\n\t\t\tfast_open = (node.tcp_fast_open and node.tcp_fast_open == \"1\") and true or false\n\t\t}\n\t\tif local_socks_address and local_socks_port then\n\t\t\ttable.insert(config.locals, {\n\t\t\t\tlocal_address = local_socks_address,\n\t\t\t\tlocal_port = tonumber(local_socks_port),\n\t\t\t\tmode = \"tcp_and_udp\"\n\t\t\t})\n\t\tend\n\t\tif local_http_address and local_http_port then\n\t\t\ttable.insert(config.locals, {\n\t\t\t\tprotocol = \"http\",\n\t\t\t\tlocal_address = local_http_address,\n\t\t\t\tlocal_port = tonumber(local_http_port)\n\t\t\t})\n\t\tend\n\tend\n\t\n\treturn jsonc.stringify(config, 1)\nend\n\n_G.gen_config = gen_config\n\nif arg[1] then\n\tlocal func =_G[arg[1]]\n\tif func then\n\t\tlocal var = nil\n\t\tif arg[2] then\n\t\t\tvar = jsonc.parse(arg[2])\n\t\tend\n\t\tprint(func(var))\n\t\tif plugin_sh and plugin_sh ~=\"\" and plugin_bin then\n\t\t\tlocal f = io.open(plugin_sh, \"w\")\n\t\t\tf:write(\"#!/bin/sh\\n\")\n\t\t\tf:write(\"export PATH=/usr/sbin:/usr/bin:/sbin:/bin:/root/bin:$PATH\\n\")\n\t\t\tf:write(plugin_bin .. \" $@ &\\n\")\n\t\t\tf:write(\"echo $! > \" .. plugin_sh:gsub(\"%.sh$\", \".pid\") .. \"\\n\")\n\t\t\tf:write(\"wait\\n\")\n\t\t\tf:close()\n\t\t\tluci.sys.call(\"chmod +x \" .. plugin_sh)\n\t\tend\n\tend\nend\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/passwall2/util_sing-box.lua",
    "content": "module(\"luci.passwall2.util_sing-box\", package.seeall)\nlocal api = require \"luci.passwall2.api\"\nlocal uci = api.uci\nlocal sys = api.sys\nlocal jsonc = api.jsonc\nlocal appname = api.appname\nlocal fs = api.fs\nlocal CACHE_PATH = api.CACHE_PATH\nlocal split = api.split\nlocal ech_domain = {}\n\nlocal local_version = api.get_app_version(\"sing-box\"):match(\"[^v]+\")\nlocal version_ge_1_13_0 = api.compare_versions(local_version, \">=\", \"1.13.0\")\n\nlocal GLOBAL = {\n\tDNS_SERVER = {}\n}\n\nlocal GEO_VAR = {\n\tOK = nil,\n\tDIR = nil,\n\tSITE_PATH = nil,\n\tIP_PATH = nil,\n\tSITE_TAGS = {},\n\tIP_TAGS = {},\n\tTO_SRS_PATH = \"/tmp/etc/\" .. appname ..\"_tmp/singbox_srss/\"\n}\n\nfunction check_geoview()\n\tif not GEO_VAR.OK then\n\t\t-- Only get once\n\t\tGEO_VAR.OK = (api.finded_com(\"geoview\") and api.compare_versions(api.get_app_version(\"geoview\"), \">=\", \"0.1.10\")) and 1 or 0\n\tend\n\tif GEO_VAR.OK == 0 then\n\t\tapi.log(0, \"!!! Note: Geo rules cannot be used if the Geoview component is missing or the version is too low.\")\n\telse\n\t\tGEO_VAR.DIR = GEO_VAR.DIR or (uci:get(appname, \"@global_rules[0]\", \"v2ray_location_asset\") or \"/usr/share/v2ray/\"):match(\"^(.*)/\")\n\t\tGEO_VAR.SITE_PATH = GEO_VAR.SITE_PATH or (GEO_VAR.DIR .. \"/geosite.dat\")\n\t\tGEO_VAR.IP_PATH = GEO_VAR.IP_PATH or (GEO_VAR.DIR .. \"/geoip.dat\")\n\t\tif not fs.access(GEO_VAR.TO_SRS_PATH) then\n\t\t\tfs.mkdir(GEO_VAR.TO_SRS_PATH)\n\t\tend\n\tend\n\treturn GEO_VAR.OK\nend\n\nfunction geo_convert_srs(var)\n\tif check_geoview() ~= 1 then\n\t\treturn\n\tend\n\tlocal geo_path = var[\"geo_path\"]\n\tlocal prefix = var[\"prefix\"]\n\tlocal rule_name = var[\"rule_name\"]\n\tlocal output_srs_file = GEO_VAR.TO_SRS_PATH .. prefix .. \"-\" .. rule_name .. \".srs\"\n\tlocal bin = api.finded_com(\"geoview\")\n\tif not fs.access(output_srs_file) and bin then\n\t\tlocal cmd = string.format(\"%q -type %q -action convert -input %q -list %q -output %q -lowmem=true\",\n\t\t\tbin, prefix, geo_path, rule_name, output_srs_file)\n\t\tsys.call(cmd)\n\t\tlocal status = fs.access(output_srs_file) and \"success.\" or \"failed!\"\n\t\tif status == \"failed!\" then\n\t\t\tapi.log(0, string.format(\"  - %s:%s convert to srs %s\", prefix, rule_name, status))\n\t\tend\n\tend\nend\n\nlocal function convert_geofile()\n\tif check_geoview() ~= 1 then\n\t\treturn\n\tend\n\tlocal function convert(file_path, prefix, tags)\n\t\tif next(tags) and fs.access(file_path) then\n\t\t\tlocal md5_file = GEO_VAR.TO_SRS_PATH .. prefix .. \".dat.md5\"\n\t\t\tlocal new_md5 = sys.exec(\"md5sum \" .. file_path .. \" 2>/dev/null | awk '{print $1}'\"):gsub(\"\\n\", \"\")\n\t\t\tlocal old_md5 = sys.exec(\"[ -f \" .. md5_file .. \" ] && head -n 1 \" .. md5_file .. \" | tr -d ' \\t\\n' || echo ''\")\n\t\t\tif new_md5 ~= \"\" and new_md5 ~= old_md5 then\n\t\t\t\tsys.call(\"printf '%s' \" .. new_md5 .. \" > \" .. md5_file)\n\t\t\t\tsys.call(\"rm -rf \" .. GEO_VAR.TO_SRS_PATH .. prefix .. \"-*.srs\" )\n\t\t\tend\n\t\t\tfor k in pairs(tags) do\n\t\t\t\tgeo_convert_srs({\n\t\t\t\t\t[\"geo_path\"] = file_path,\n\t\t\t\t\t[\"prefix\"] = prefix,\n\t\t\t\t\t[\"rule_name\"] = k\n\t\t\t\t})\n\t\t\tend\n\t\tend\n\tend\n\t--api.log(0, \"V2ray/Xray Geo convert to Sing-Box rule-set:\")\n\tconvert(GEO_VAR.SITE_PATH, \"geosite\", GEO_VAR.SITE_TAGS)\n\tconvert(GEO_VAR.IP_PATH, \"geoip\", GEO_VAR.IP_TAGS)\nend\n\nfunction parseDNS(str)\n\tlocal result_dns_server\n\t-- [proto]://[ip]\n\t-- [proto]://[ip]:[port]\n\t-- https://[ip]/[path]\n\t-- https://[ip]:[port]/[path]\n\tlocal _a = api.parseURL(str)\n\tif _a then\n\t\tif _a.protocol == \"tcp\" or _a.protocol == \"udp\" or _a.protocol == \"https\" then\n\t\t\tresult_dns_server = {\n\t\t\t\ttype = _a.protocol,\n\t\t\t\tserver = _a.hostname\n\t\t\t}\n\t\t\tif _a.port then\n\t\t\t\tresult_dns_server.server_port = _a.port\n\t\t\telse\n\t\t\t\tif _a.protocol == \"https\" then\n\t\t\t\t\tresult_dns_server.server_port = 443\n\t\t\t\telse\n\t\t\t\t\tresult_dns_server.server_port = 53\n\t\t\t\tend\n\t\t\tend\n\t\t\tresult_dns_server.path = _a.pathname\n\t\tend\n\tend\n\treturn result_dns_server\nend\n\nfunction gen_outbound(flag, node, tag, proxy_table)\n\tlocal result = nil\n\tif node then\n\t\tlocal node_id = node[\".name\"]\n\t\tif tag == nil then\n\t\t\ttag = node_id\n\t\tend\n\t\tlocal remarks = node.remarks\n\n\t\tlocal proxy_tag = nil\n\t\tlocal fragment = nil\n\t\tlocal record_fragment = nil\n\t\tlocal run_socks_instance = true\n\t\tif proxy_table ~= nil and type(proxy_table) == \"table\" then\n\t\t\tproxy_tag = proxy_table.tag or nil\n\t\t\tfragment = proxy_table.fragment or nil\n\t\t\trecord_fragment = proxy_table.record_fragment or nil\n\t\t\trun_socks_instance = proxy_table.run_socks_instance\n\t\tend\n\n\t\tif node.type ~= \"sing-box\" then\n\t\t\tlocal relay_port = node.port\n\t\t\tlocal new_port = api.get_new_port()\n\t\t\tlocal config_file = string.format(\"%s_%s_%s.json\", flag, tag, new_port)\n\t\t\tif tag and node_id and not tag:find(node_id) then\n\t\t\t\tconfig_file = string.format(\"%s_%s_%s_%s.json\", flag, tag, node_id, new_port)\n\t\t\tend\n\t\t\tif run_socks_instance then\n\t\t\t\tsys.call(string.format('/usr/share/%s/app.sh run_socks \"%s\"> /dev/null',\n\t\t\t\t\tappname,\n\t\t\t\t\tstring.format(\"flag=%s node=%s bind=%s socks_port=%s config_file=%s relay_port=%s\",\n\t\t\t\t\t\tnew_port, --flag\n\t\t\t\t\t\tnode_id, --node\n\t\t\t\t\t\t\"127.0.0.1\", --bind\n\t\t\t\t\t\tnew_port, --socks port\n\t\t\t\t\t\tconfig_file, --config file\n\t\t\t\t\t\t(proxy_tag and relay_port) and tostring(relay_port) or \"\" --relay port\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\tend\n\t\t\tnode = {\n\t\t\t\tprotocol = \"socks\",\n\t\t\t\taddress = \"127.0.0.1\",\n\t\t\t\tport = new_port\n\t\t\t}\n\t\t\tproxy_tag = \"socks <- \" .. node_id\n\t\telse\n\t\t\tif proxy_tag then\n\t\t\t\tnode.detour = proxy_tag\n\t\t\tend\n\t\tend\n\n\t\tif remarks then\n\t\t\ttag = tag .. \":\" .. remarks\n\t\tend\n\n\t\tnode.address = (node.address or \"\"):lower()\n\n\t\tresult = {\n\t\t\t_id = node_id,\n\t\t\t_flag = flag,\n\t\t\t_flag_proxy_tag = proxy_tag,\n\t\t\ttag = tag,\n\t\t\ttype = node.protocol,\n\t\t\tserver = node.address,\n\t\t\tserver_port = tonumber(node.port),\n\t\t\tdomain_resolver = {\n\t\t\t\tserver = \"local\",\n\t\t\t\tstrategy = node.domain_strategy\n\t\t\t},\n\t\t\tdetour = node.detour,\n\t\t}\n\n\t\tif api.datatypes.hostname(node.address) and node.domain_resolver and (node.domain_resolver_dns or node.domain_resolver_dns_https) then\n\t\t\tlocal dns_tag = node_id .. \"_dns\"\n\t\t\tlocal dns_proto = node.domain_resolver\n\t\t\tlocal server_address\n\t\t\tlocal server_port\n\t\t\tlocal server_path\n\t\t\tif dns_proto == \"https\" then\n\t\t\t\tlocal _a = api.parseURL(node.domain_resolver_dns_https)\n\t\t\t\tif _a then\n\t\t\t\t\tserver_address = _a.hostname\n\t\t\t\t\tif _a.port then\n\t\t\t\t\t\tserver_port = _a.port\n\t\t\t\t\telse\n\t\t\t\t\t\tserver_port = 443\n\t\t\t\t\tend\n\t\t\t\t\tserver_path = _a.pathname\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tserver_address = node.domain_resolver_dns\n\t\t\t\tserver_port = 53\n\t\t\t\tlocal split = api.split(server_address, \":\")\n\t\t\t\tif #split > 1 then\n\t\t\t\t\tserver_address = split[1]\n\t\t\t\t\tserver_port = tonumber(split[#split])\n\t\t\t\tend\n\t\t\tend\n\t\t\tGLOBAL.DNS_SERVER[node_id] = {\n\t\t\t\tserver = {\n\t\t\t\t\ttag = dns_tag,\n\t\t\t\t\ttype = dns_proto,\n\t\t\t\t\tserver = server_address,\n\t\t\t\t\tserver_port = server_port,\n\t\t\t\t\tpath = server_path,\n\t\t\t\t\tdomain_resolver = \"local\",\n\t\t\t\t\tdetour = \"direct\"\n\t\t\t\t},\n\t\t\t\tdomain = node.address\n\t\t\t}\n\t\t\tresult.domain_resolver.server = dns_tag\n\t\tend\n\n\t\tlocal tls = nil\n\t\tif node.protocol == \"hysteria\" or node.protocol == \"hysteria2\" or node.protocol == \"tuic\" or node.protocol == \"naive\" then\n\t\t\tnode.tls = \"1\"\n\t\tend\n\t\tif node.tls == \"1\" then\n\t\t\tlocal alpn = nil\n\t\t\tif node.alpn and node.alpn ~= \"default\" then\n\t\t\t\talpn = {}\n\t\t\t\tstring.gsub(node.alpn, '[^' .. \",\" .. ']+', function(w)\n\t\t\t\t\ttable.insert(alpn, w)\n\t\t\t\tend)\n\t\t\tend\n\t\t\ttls = {\n\t\t\t\tenabled = true,\n\t\t\t\tdisable_sni = (node.tls_disable_sni == \"1\") and true or false, -- Do not send the server name in ClientHello.\n\t\t\t\tserver_name = node.tls_serverName, -- Used to verify the hostname on the returned certificate, unless the settings are insecure. It is also included in ClientHello to support virtual hosts, unless it is an IP address.\n\t\t\t\tinsecure = (node.tls_allowInsecure == \"1\") and true or false, -- Accepts any server certificate.\n\t\t\t\talpn = alpn, -- A list of supported application layer protocols, arranged in order of priority. If both peers support ALPN, the protocol selected will be one of these protocols; otherwise, the connection will fail.\n\t\t\t\t--max_version = \"1.3\",\n\t\t\t\tfragment = fragment,\n\t\t\t\trecord_fragment = record_fragment,\n\t\t\t\tech = (node.ech == \"1\") and (function()\n\t\t\t\t\tlocal function get_ech_domain(s) --兼容xray \"域名+DNS\" 格式ech\n\t\t\t\t\t\tlocal domain, dns = s:match(\"^([^+]+)%+(.+)$\")\n\t\t\t\t\t\tif not domain or not dns then return nil end\n\t\t\t\t\t\tif not (dns:match(\"^https?://\") or dns:match(\"^tcp://\") or dns:match(\"^udp://\") or dns:match(\"^h2c://\")) then\n\t\t\t\t\t\t\treturn nil\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif not domain:match(\"^[%w%-%.]+%.[%a]+$\") then return nil end\n\t\t\t\t\t\treturn domain\n\t\t\t\t\tend\n\t\t\t\t\tlocal ech = { enabled = true }\n\t\t\t\t\tlocal config = node.ech_config\n\t\t\t\t\tlocal qname = node.ech_query_server_name\n\t\t\t\t\tif config and not qname then\n\t\t\t\t\t\tqname = get_ech_domain(config)\n\t\t\t\t\t\tif not qname and not (config:match(\"%-+%s*BEGIN\") and config:match(\"%-+%s*END\")) then\n\t\t\t\t\t\t\tconfig = \"-----BEGIN ECH CONFIGS-----\\n\" .. config:gsub(\"%s+\", \"\") .. \"\\n-----END ECH CONFIGS-----\"\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tif qname then\n\t\t\t\t\t\tech.query_server_name = qname\n\t\t\t\t\t\tech_domain[qname] = true\n\t\t\t\t\telseif config then\n\t\t\t\t\t\tech.config = { config }\n\t\t\t\t\telseif node.tls_serverName and node.tls_serverName ~= \"\" then\n\t\t\t\t\t\tech_domain[node.tls_serverName] = true\n\t\t\t\t\tend\n\t\t\t\t\treturn ech\n\t\t\t\tend)() or nil,\n\t\t\t\tutls = (node.utls == \"1\" or node.reality == \"1\") and {\n\t\t\t\t\tenabled = true,\n\t\t\t\t\tfingerprint = node.fingerprint or \"chrome\"\n\t\t\t\t} or nil,\n\t\t\t\treality = (node.reality == \"1\") and {\n\t\t\t\t\tenabled = true,\n\t\t\t\t\tpublic_key = node.reality_publicKey,\n\t\t\t\t\tshort_id = node.reality_shortId\n\t\t\t\t} or nil\n\t\t\t}\n\t\tend\n\n\t\tlocal mux = nil\n\t\tif node.mux == \"1\" then\n\t\t\tmux = {\n\t\t\t\tenabled = true,\n\t\t\t\tprotocol = node.mux_type or \"h2mux\",\n\t\t\t\tmax_connections = ( (node.tcpbrutal == \"1\") and 1 ) or tonumber(node.mux_concurrency) or 4,\n\t\t\t\tpadding = (node.mux_padding == \"1\") and true or false,\n\t\t\t\t--min_streams = 4,\n\t\t\t\t--max_streams = 0,\n\t\t\t\tbrutal = {\n\t\t\t\t\tenabled = (node.tcpbrutal == \"1\") and true or false,\n\t\t\t\t\tup_mbps = tonumber(node.tcpbrutal_up_mbps) or 10,\n\t\t\t\t\tdown_mbps = tonumber(node.tcpbrutal_down_mbps) or 50,\n\t\t\t\t},\n\t\t\t}\n\t\tend\n\n\t\tlocal v2ray_transport = nil\n\n\t\tif node.transport == \"tcp\" and node.tcp_guise == \"http\" and (node.tcp_guise_http_host or \"\") ~= \"\" then  -- Simulate X-ray Raw (TCP) transmission\n\t\t\tv2ray_transport = {\n\t\t\t\ttype = \"http\",\n\t\t\t\thost = node.tcp_guise_http_host,\n\t\t\t\tpath = node.tcp_guise_http_path and (function()\n\t\t\t\t\t\tlocal first = node.tcp_guise_http_path[1]\n\t\t\t\t\t\treturn (first == \"\" or not first) and \"/\" or first\n\t\t\t\t\tend)() or \"/\",\n\t\t\t\theaders = node.user_agent and {\n\t\t\t\t\t[\"User-Agent\"] = node.user_agent\n\t\t\t\t} or nil,\n\t\t\t\tidle_timeout = (node.http_h2_health_check == \"1\") and node.http_h2_read_idle_timeout or nil,\n\t\t\t\tping_timeout = (node.http_h2_health_check == \"1\") and node.http_h2_health_check_timeout or nil,\n\t\t\t}\n\t\t\t-- TLS is not enforced. If TLS is not configured, plain HTTP 1.1 will be used.\n\t\tend\n\n\t\tif node.transport == \"http\" then\n\t\t\tv2ray_transport = {\n\t\t\t\ttype = \"http\",\n\t\t\t\thost = node.http_host or {},\n\t\t\t\tpath = node.http_path or \"/\",\n\t\t\t\theaders = node.user_agent and {\n\t\t\t\t\t[\"User-Agent\"] = node.user_agent\n\t\t\t\t} or nil,\n\t\t\t\tidle_timeout = (node.http_h2_health_check == \"1\") and node.http_h2_read_idle_timeout or nil,\n\t\t\t\tping_timeout = (node.http_h2_health_check == \"1\") and node.http_h2_health_check_timeout or nil,\n\t\t\t}\n\t\t\t-- TLS is not enforced. If TLS is not configured, plain HTTP 1.1 will be used.\n\t\tend\n\n\t\tif node.transport == \"ws\" then\n\t\t\tv2ray_transport = {\n\t\t\t\ttype = \"ws\",\n\t\t\t\tpath = node.ws_path or \"/\",\n\t\t\t\theaders = (node.ws_host or node.user_agent) and {\n\t\t\t\t\tHost = node.ws_host,\n\t\t\t\t\t[\"User-Agent\"] = node.user_agent\n\t\t\t\t} or nil,\n\t\t\t\tmax_early_data = tonumber(node.ws_maxEarlyData) or nil,\n\t\t\t\tearly_data_header_name = (node.ws_earlyDataHeaderName) and node.ws_earlyDataHeaderName or nil -- For compatibility with Xray-core, set it to Sec-WebSocket-Protocol. It needs to be consistent with the server.\n\t\t\t}\n\t\tend\n\n\t\tif node.transport == \"httpupgrade\" then\n\t\t\tv2ray_transport = {\n\t\t\t\ttype = \"httpupgrade\",\n\t\t\t\thost = node.httpupgrade_host,\n\t\t\t\tpath = node.httpupgrade_path or \"/\",\n\t\t\t\theaders = node.user_agent and {\n\t\t\t\t\t[\"User-Agent\"] = node.user_agent\n\t\t\t\t} or nil\n\t\t\t}\n\t\tend\n\n\t\tif node.transport == \"quic\" then\n\t\t\tv2ray_transport = {\n\t\t\t\ttype = \"quic\"\n\t\t\t}\n\t\t\t-- There is no additional encryption support: it's essentially re-encryption. And Xray-core is incompatible with v2ray-core here.\n\t\tend\n\n\t\tif node.transport == \"grpc\" then\n\t\t\tv2ray_transport = {\n\t\t\t\ttype = \"grpc\",\n\t\t\t\tservice_name = node.grpc_serviceName,\n\t\t\t\tidle_timeout = tonumber(node.grpc_idle_timeout) or nil,\n\t\t\t\tping_timeout = tonumber(node.grpc_health_check_timeout) or nil,\n\t\t\t\tpermit_without_stream = (node.grpc_permit_without_stream == \"1\") and true or nil,\n\t\t\t}\n\t\tend\n\n\t\tlocal protocol_table = nil\n\n\t\tif node.protocol == \"socks\" then\n\t\t\tprotocol_table = {\n\t\t\t\tversion = \"5\",\n\t\t\t\tusername = (node.username and node.password) and node.username or nil,\n\t\t\t\tpassword = (node.username and node.password) and node.password or nil,\n\t\t\t\tudp_over_tcp = node.uot == \"1\" and {\n\t\t\t\t\tenabled = true,\n\t\t\t\t\tversion = 2\n\t\t\t\t} or nil,\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"http\" then\n\t\t\tprotocol_table = {\n\t\t\t\tusername = (node.username and node.password) and node.username or nil,\n\t\t\t\tpassword = (node.username and node.password) and node.password or nil,\n\t\t\t\tpath = nil,\n\t\t\t\theaders = nil,\n\t\t\t\ttls = tls\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"shadowsocks\" then\n\t\t\tprotocol_table = {\n\t\t\t\tmethod = node.method or nil,\n\t\t\t\tpassword = node.password or \"\",\n\t\t\t\tplugin = (node.plugin_enabled and node.plugin) or nil,\n\t\t\t\tplugin_opts = (node.plugin_enabled and node.plugin_opts) or nil,\n\t\t\t\tudp_over_tcp = node.uot == \"1\" and {\n\t\t\t\t\tenabled = true,\n\t\t\t\t\tversion = 2\n\t\t\t\t} or nil,\n\t\t\t\tmultiplex = mux,\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"shadowsocksr\" then\n\t\t\tprotocol_table = {\n\t\t\t\tmethod = node.method or nil,\n\t\t\t\tpassword = node.password or \"\",\n\t\t\t\tobfs = node.ssr_obfs,\n\t\t\t\tobfs_param = node.ssr_obfs_param,\n\t\t\t\tprotocol = node.ssr_protocol,\n\t\t\t\tprotocol_param = node.ssr_protocol_param,\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"trojan\" then\n\t\t\tprotocol_table = {\n\t\t\t\tpassword = node.password,\n\t\t\t\ttls = tls,\n\t\t\t\tmultiplex = mux,\n\t\t\t\ttransport = v2ray_transport\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"vmess\" then\n\t\t\tprotocol_table = {\n\t\t\t\tuuid = node.uuid,\n\t\t\t\tsecurity = node.security,\n\t\t\t\talter_id = (node.alter_id) and tonumber(node.alter_id) or 0,\n\t\t\t\tglobal_padding = (node.global_padding == \"1\") and true or false,\n\t\t\t\tauthenticated_length = (node.authenticated_length == \"1\") and true or false,\n\t\t\t\ttls = tls,\n\t\t\t\tpacket_encoding = \"\", -- UDP packet encoding. (Empty): Disabled. packetaddr: Supported by v2ray 5+. xudp: Supported by xray.\n\t\t\t\tmultiplex = mux,\n\t\t\t\ttransport = v2ray_transport,\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"vless\" then\n\t\t\tprotocol_table = {\n\t\t\t\tuuid = node.uuid,\n\t\t\t\tflow = (node.tls == '1' and node.flow) and node.flow or nil,\n\t\t\t\ttls = tls,\n\t\t\t\tpacket_encoding = \"xudp\", -- UDP packet encoding. (Empty): Disabled. packetaddr: Supported by v2ray 5+. xudp: Supported by xray.\n\t\t\t\tmultiplex = mux,\n\t\t\t\ttransport = v2ray_transport,\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"wireguard\" then\n\t\t\tif node.wireguard_reserved then\n\t\t\t\tlocal bytes = {}\n\t\t\t\tif not node.wireguard_reserved:match(\"[^%d,]+\") then\n\t\t\t\t\tnode.wireguard_reserved:gsub(\"%d+\", function(b)\n\t\t\t\t\t\tbytes[#bytes + 1] = tonumber(b)\n\t\t\t\t\tend)\n\t\t\t\telse\n\t\t\t\t\tlocal result = api.base64Decode(node.wireguard_reserved)\n\t\t\t\t\tfor i = 1, #result do\n\t\t\t\t\t\tbytes[i] = result:byte(i)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tnode.wireguard_reserved = #bytes > 0 and bytes or nil\n\t\t\tend\n\t\t\tprotocol_table = {\n\t\t\t\tsystem_interface = (node.wireguard_system_interface == \"1\") and true or false,\n\t\t\t\tinterface_name = node.wireguard_interface_name,\n\t\t\t\tlocal_address = node.wireguard_local_address,\n\t\t\t\tprivate_key = node.wireguard_secret_key,\n\t\t\t\tpeer_public_key = node.wireguard_public_key,\n\t\t\t\tpre_shared_key = node.wireguard_preSharedKey,\n\t\t\t\treserved = node.wireguard_reserved,\n\t\t\t\tmtu = tonumber(node.wireguard_mtu),\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"hysteria\" then\n\t\t\tlocal server_ports = {}\n\t\t\tif node.hysteria_hop then\n\t\t\t\tnode.hysteria_hop = string.gsub(node.hysteria_hop, \"-\", \":\")\n\t\t\t\tfor range in node.hysteria_hop:gmatch(\"([^,]+)\") do\n\t\t\t\t\tif range:match(\"^%d+:%d+$\") then\n\t\t\t\t\t\ttable.insert(server_ports, range)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tprotocol_table = {\n\t\t\t\tserver_ports = next(server_ports) and server_ports or nil,\n\t\t\t\thop_interval = (function()\n\t\t\t\t\t\t\tif not next(server_ports) then return nil end\n\t\t\t\t\t\t\tlocal v = tonumber((node.hysteria_hop_interval or \"30\"):match(\"^%d+\"))\n\t\t\t\t\t\t\treturn (v and v >= 5) and (v .. \"s\") or \"30s\"\n\t\t\t\t\t\tend)(),\n\t\t\t\tup_mbps = tonumber(node.hysteria_up_mbps),\n\t\t\t\tdown_mbps = tonumber(node.hysteria_down_mbps),\n\t\t\t\tobfs = node.hysteria_obfs,\n\t\t\t\tauth = (node.hysteria_auth_type == \"base64\") and node.hysteria_auth_password or nil,\n\t\t\t\tauth_str = (node.hysteria_auth_type == \"string\") and node.hysteria_auth_password or nil,\n\t\t\t\trecv_window_conn = tonumber(node.hysteria_recv_window_conn),\n\t\t\t\trecv_window = tonumber(node.hysteria_recv_window),\n\t\t\t\tdisable_mtu_discovery = (node.hysteria_disable_mtu_discovery == \"1\") and true or false,\n\t\t\t\ttls = tls\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"shadowtls\" then\n\t\t\tprotocol_table = {\n\t\t\t\tversion = tonumber(node.shadowtls_version),\n\t\t\t\tpassword = (node.shadowtls_version == \"2\" or node.shadowtls_version == \"3\") and node.password or nil,\n\t\t\t\ttls = tls,\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"tuic\" then\n\t\t\tprotocol_table = {\n\t\t\t\tuuid = node.uuid,\n\t\t\t\tpassword = node.password,\n\t\t\t\tcongestion_control = node.tuic_congestion_control or \"cubic\",\n\t\t\t\tudp_relay_mode = node.tuic_udp_relay_mode or \"native\",\n\t\t\t\tudp_over_stream = false,\n\t\t\t\tzero_rtt_handshake = (node.tuic_zero_rtt_handshake == \"1\") and true or false,\n\t\t\t\theartbeat = (tonumber(node.tuic_heartbeat) or 3) .. \"s\",\n\t\t\t\ttls = tls\n\t\t\t}\n\t\t\tif node.tuic_alpn and node.tuic_alpn ~= \"default\" then\n\t\t\t\tlocal alpn = {}\n\t\t\t\tstring.gsub(node.tuic_alpn, '[^,]+', function(w)\n\t\t\t\t\ttable.insert(alpn, w)\n\t\t\t\tend)\n\t\t\t\tif #alpn > 0 then protocol_table.tls.alpn = alpn end\n\t\t\tend\n\t\tend\n\n\t\tif node.protocol == \"hysteria2\" then\n\t\t\tlocal server_ports = {}\n\t\t\tif node.hysteria2_hop then\n\t\t\t\tnode.hysteria2_hop = string.gsub(node.hysteria2_hop, \"-\", \":\")\n\t\t\t\tfor range in node.hysteria2_hop:gmatch(\"([^,]+)\") do\n\t\t\t\t\tif range:match(\"^%d+:%d+$\") then\n\t\t\t\t\t\ttable.insert(server_ports, range)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tlocal interval, interval_max\n\t\t\tif next(server_ports) then\n\t\t\t\tinterval = \"30s\"\n\t\t\t\tlocal t = node.hysteria2_hop_interval or \"30s\"\n\t\t\t\tif t:find(\"-\", 1, true) then\n\t\t\t\t\tlocal min, max = t:match(\"^(%d+)%-(%d+)$\")\n\t\t\t\t\tmin = tonumber(min)\n\t\t\t\t\tmax = tonumber(max)\n\t\t\t\t\tif min and max then\n\t\t\t\t\t\tmin = (min >= 5) and min or 5\n\t\t\t\t\t\tmax = (max >= min) and max or min\n\t\t\t\t\t\tinterval = min .. \"s\"\n\t\t\t\t\t\tinterval_max = max .. \"s\"\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tt = tonumber(t:match(\"^%d+\"))\n\t\t\t\t\tt = (t and t >= 5) and t or 30\n\t\t\t\t\tinterval = t .. \"s\"\n\t\t\t\tend\n\t\t\tend\n\t\t\tprotocol_table = {\n\t\t\t\tserver_ports = next(server_ports) and server_ports or nil,\n\t\t\t\thop_interval = interval,\n\t\t\t\thop_interval_max = interval_max,\n\t\t\t\tup_mbps = (node.hysteria2_up_mbps and tonumber(node.hysteria2_up_mbps)) and tonumber(node.hysteria2_up_mbps) or nil,\n\t\t\t\tdown_mbps = (node.hysteria2_down_mbps and tonumber(node.hysteria2_down_mbps)) and tonumber(node.hysteria2_down_mbps) or nil,\n\t\t\t\tobfs = node.hysteria2_obfs_type and {\n\t\t\t\t\ttype = node.hysteria2_obfs_type,\n\t\t\t\t\tpassword = node.hysteria2_obfs_password\n\t\t\t\t} or nil,\n\t\t\t\tpassword = node.hysteria2_auth_password or nil,\n\t\t\t\ttls = tls\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"anytls\" then\n\t\t\tprotocol_table = {\n\t\t\t\tpassword = (node.password and node.password ~= \"\") and node.password or \"\",\n\t\t\t\tidle_session_check_interval = \"30s\",\n\t\t\t\tidle_session_timeout = \"30s\",\n\t\t\t\tmin_idle_session = 5,\n\t\t\t\ttls = tls\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"ssh\" then\n\t\t\tprotocol_table = {\n\t\t\t\tuser = (node.username and node.username ~= \"\") and node.username or \"root\",\n\t\t\t\tpassword = (node.password and node.password ~= \"\") and node.password or \"\",\n\t\t\t\tprivate_key = node.ssh_priv_key,\n\t\t\t\tprivate_key_passphrase = node.ssh_priv_key_pp,\n\t\t\t\thost_key = node.ssh_host_key,\n\t\t\t\thost_key_algorithms = node.ssh_host_key_algo,\n\t\t\t\tclient_version = node.ssh_client_version\n\t\t\t}\n\t\tend\n\n\t\tif node.protocol == \"naive\" then\n\t\t\tprotocol_table = {\n\t\t\t\tusername = (node.username and node.username ~= \"\") and node.username or \"\",\n\t\t\t\tpassword = (node.password and node.password ~= \"\") and node.password or \"\",\n\t\t\t\tinsecure_concurrency = tonumber(node.naive_insecure_concurrency or 0) > 0 and tonumber(node.naive_insecure_concurrency) or 0,\n\t\t\t\tudp_over_tcp = node.uot == \"1\" and {\n\t\t\t\t\tenabled = true,\n\t\t\t\t\tversion = 2\n\t\t\t\t} or false,\n\t\t\t\textra_headers = node.user_agent and {\n\t\t\t\t\t[\"User-Agent\"] = node.user_agent\n\t\t\t\t} or nil,\n\t\t\t\tquic = node.naive_quic == \"1\" and true or false,\n\t\t\t\tquic_congestion_control = (node.naive_quic == \"1\" and node.naive_congestion_control) and node.naive_congestion_control or nil,\n\t\t\t\ttls = tls\n\t\t\t}\n\t\tend\n\n\t\tif protocol_table then\n\t\t\tfor key, value in pairs(protocol_table) do\n\t\t\t\tresult[key] = value\n\t\t\tend\n\t\tend\n\tend\n\treturn result\nend\n\nfunction gen_config_server(node)\n\tlocal outbounds = {\n\t\t{ type = \"direct\", tag = \"direct\" }\n\t}\n\n\tlocal tls = {\n\t\tenabled = true,\n\t\tcertificate_path = node.tls_certificateFile,\n\t\tkey_path = node.tls_keyFile,\n\t\talpn = (node.alpn and node.alpn ~= \"default\") and (function()\n\t\t\tlocal alpn = {}\n\t\t\tstring.gsub(node.alpn, '[^,]+', function(w)\n\t\t\t\ttable.insert(alpn, w)\n\t\t\tend)\n\t\t\tif #alpn > 0 then return alpn end\n\t\t\treturn nil\n\t\tend)() or nil\n\t}\n\n\tif node.tls == \"1\" and node.reality == \"1\" then\n\t\ttls.certificate_path = nil\n\t\ttls.key_path = nil\n\t\ttls.server_name = node.reality_handshake_server\n\t\ttls.reality = {\n\t\t\tenabled = true,\n\t\t\tprivate_key = node.reality_private_key,\n\t\t\tshort_id = {\n\t\t\t\tnode.reality_shortId\n\t\t\t},\n\t\t\thandshake = {\n\t\t\t\tserver = node.reality_handshake_server,\n\t\t\t\tserver_port = tonumber(node.reality_handshake_server_port)\n\t\t\t}\n\t\t}\n\tend\n\n\tif node.tls == \"1\" and node.ech == \"1\" then\n\t\ttls.ech = {\n\t\t\tenabled = true,\n\t\t\tkey = node.ech_key and { node.ech_key } or nil\n\t\t}\n\tend\n\n\tlocal mux = nil\n\tif node.mux == \"1\" then\n\t\tmux = {\n\t\t\tenabled = true,\n\t\t\tpadding = (node.mux_padding == \"1\") and true or false,\n\t\t\tbrutal = {\n\t\t\t\tenabled = (node.tcpbrutal == \"1\") and true or false,\n\t\t\t\tup_mbps = tonumber(node.tcpbrutal_up_mbps) or 10,\n\t\t\t\tdown_mbps = tonumber(node.tcpbrutal_down_mbps) or 50,\n\t\t\t},\n\t\t}\n\tend\n\n\tlocal v2ray_transport = nil\n\n\tif node.transport == \"http\" then\n\t\tv2ray_transport = {\n\t\t\ttype = \"http\",\n\t\t\thost = node.http_host or {},\n\t\t\tpath = node.http_path or \"/\",\n\t\t}\n\tend\n\n\tif node.transport == \"ws\" then\n\t\tv2ray_transport = {\n\t\t\ttype = \"ws\",\n\t\t\tpath = node.ws_path or \"/\",\n\t\t\theaders = (node.ws_host ~= nil) and { Host = node.ws_host } or nil,\n\t\t\tearly_data_header_name = (node.ws_earlyDataHeaderName) and node.ws_earlyDataHeaderName or nil -- For compatibility with Xray-core, set it to Sec-WebSocket-Protocol. It needs to be consistent with the server.\n\t\t}\n\tend\n\n\tif node.transport == \"httpupgrade\" then\n\t\tv2ray_transport = {\n\t\t\ttype = \"httpupgrade\",\n\t\t\thost = node.httpupgrade_host,\n\t\t\tpath = node.httpupgrade_path or \"/\",\n\t\t}\n\tend\n\n\tif node.transport == \"quic\" then\n\t\tv2ray_transport = {\n\t\t\ttype = \"quic\"\n\t\t}\n\t\t-- There is no additional encryption support: it's essentially re-encryption. And Xray-core is incompatible with v2ray-core here.\n\tend\n\n\tif node.transport == \"grpc\" then\n\t\tv2ray_transport = {\n\t\t\ttype = \"grpc\",\n\t\t\tservice_name = node.grpc_serviceName,\n\t\t}\n\tend\n\n\tlocal inbound = {\n\t\ttype = node.protocol,\n\t\ttag = \"inbound\",\n\t\tlisten = (node.bind_local == \"1\") and \"127.0.0.1\" or \"::\",\n\t\tlisten_port = tonumber(node.port),\n\t}\n\n\tlocal protocol_table = nil\n\n\tif node.protocol == \"mixed\" then\n\t\tprotocol_table = {\n\t\t\tusers = (node.auth == \"1\") and {\n\t\t\t\t{\n\t\t\t\t\tusername = node.username,\n\t\t\t\t\tpassword = node.password\n\t\t\t\t}\n\t\t\t} or nil,\n\t\t\tset_system_proxy = false\n\t\t}\n\tend\n\n\tif node.protocol == \"socks\" then\n\t\tprotocol_table = {\n\t\t\tusers = (node.auth == \"1\") and {\n\t\t\t\t{\n\t\t\t\t\tusername = node.username,\n\t\t\t\t\tpassword = node.password\n\t\t\t\t}\n\t\t\t} or nil\n\t\t}\n\tend\n\n\tif node.protocol == \"http\" then\n\t\tprotocol_table = {\n\t\t\tusers = (node.auth == \"1\") and {\n\t\t\t\t{\n\t\t\t\t\tusername = node.username,\n\t\t\t\t\tpassword = node.password\n\t\t\t\t}\n\t\t\t} or nil,\n\t\t\ttls = (node.tls == \"1\") and tls or nil,\n\t\t}\n\tend\n\n\tif node.protocol == \"shadowsocks\" then\n\t\tprotocol_table = {\n\t\t\tmethod = node.method,\n\t\t\tpassword = node.password,\n\t\t\tmultiplex = mux,\n\t\t}\n\tend\n\n\tif node.protocol == \"vmess\" then\n\t\tif node.uuid then\n\t\t\tlocal users = {}\n\t\t\tfor i = 1, #node.uuid do\n\t\t\t\tusers[i] = {\n\t\t\t\t\tname = node.uuid[i],\n\t\t\t\t\tuuid = node.uuid[i],\n\t\t\t\t\talterId = 0,\n\t\t\t\t}\n\t\t\tend\n\t\t\tprotocol_table = {\n\t\t\t\tusers = users,\n\t\t\t\ttls = (node.tls == \"1\") and tls or nil,\n\t\t\t\tmultiplex = mux,\n\t\t\t\ttransport = v2ray_transport,\n\t\t\t}\n\t\tend\n\tend\n\n\tif node.protocol == \"vless\" then\n\t\tif node.uuid then\n\t\t\tlocal users = {}\n\t\t\tfor i = 1, #node.uuid do\n\t\t\t\tusers[i] = {\n\t\t\t\t\tname = node.uuid[i],\n\t\t\t\t\tuuid = node.uuid[i],\n\t\t\t\t\tflow = node.flow,\n\t\t\t\t}\n\t\t\tend\n\t\t\tprotocol_table = {\n\t\t\t\tusers = users,\n\t\t\t\ttls = (node.tls == \"1\") and tls or nil,\n\t\t\t\tmultiplex = mux,\n\t\t\t\ttransport = v2ray_transport,\n\t\t\t}\n\t\tend\n\tend\n\n\tif node.protocol == \"trojan\" then\n\t\tif node.uuid then\n\t\t\tlocal users = {}\n\t\t\tfor i = 1, #node.uuid do\n\t\t\t\tusers[i] = {\n\t\t\t\t\tname = node.uuid[i],\n\t\t\t\t\tpassword = node.uuid[i],\n\t\t\t\t}\n\t\t\tend\n\t\t\tprotocol_table = {\n\t\t\t\tusers = users,\n\t\t\t\ttls = (node.tls == \"1\") and tls or nil,\n\t\t\t\tfallback = nil,\n\t\t\t\tfallback_for_alpn = nil,\n\t\t\t\tmultiplex = mux,\n\t\t\t\ttransport = v2ray_transport,\n\t\t\t}\n\t\tend\n\tend\n\n\tif node.protocol == \"naive\" then\n\t\tprotocol_table = {\n\t\t\tusers = {\n\t\t\t\t{\n\t\t\t\t\tusername = node.username,\n\t\t\t\t\tpassword = node.password\n\t\t\t\t}\n\t\t\t},\n\t\t\ttls = tls\n\t\t}\n\tend\n\n\tif node.protocol == \"hysteria\" then\n\t\tprotocol_table = {\n\t\t\tup = node.hysteria_up_mbps .. \" Mbps\",\n\t\t\tdown = node.hysteria_down_mbps .. \" Mbps\",\n\t\t\tup_mbps = tonumber(node.hysteria_up_mbps),\n\t\t\tdown_mbps = tonumber(node.hysteria_down_mbps),\n\t\t\tobfs = node.hysteria_obfs,\n\t\t\tusers = {\n\t\t\t\t{\n\t\t\t\t\tname = \"user1\",\n\t\t\t\t\tauth = (node.hysteria_auth_type == \"base64\") and node.hysteria_auth_password or nil,\n\t\t\t\t\tauth_str = (node.hysteria_auth_type == \"string\") and node.hysteria_auth_password or nil,\n\t\t\t\t}\n\t\t\t},\n\t\t\trecv_window_conn = node.hysteria_recv_window_conn and tonumber(node.hysteria_recv_window_conn) or nil,\n\t\t\trecv_window_client = node.hysteria_recv_window_client and tonumber(node.hysteria_recv_window_client) or nil,\n\t\t\tmax_conn_client = node.hysteria_max_conn_client and tonumber(node.hysteria_max_conn_client) or nil,\n\t\t\tdisable_mtu_discovery = (node.hysteria_disable_mtu_discovery == \"1\") and true or false,\n\t\t\ttls = tls\n\t\t}\n\tend\n\n\tif node.protocol == \"tuic\" then\n\t\ttls.alpn = (node.tuic_alpn and node.tuic_alpn ~= \"default\") and (function()\n\t\t\tlocal alpn = {}\n\t\t\tstring.gsub(node.tuic_alpn, '[^,]+', function(w)\n\t\t\t\ttable.insert(alpn, w)\n\t\t\tend)\n\t\t\tif #alpn > 0 then return alpn end\n\t\t\treturn nil\n\t\tend)() or nil\n\t\tprotocol_table = {\n\t\t\tusers = {\n\t\t\t\t{\n\t\t\t\t\tname = \"user1\",\n\t\t\t\t\tuuid = node.uuid,\n\t\t\t\t\tpassword = node.password\n\t\t\t\t}\n\t\t\t},\n\t\t\tcongestion_control = node.tuic_congestion_control or \"cubic\",\n\t\t\tzero_rtt_handshake = (node.tuic_zero_rtt_handshake == \"1\") and true or false,\n\t\t\theartbeat = (tonumber(node.tuic_heartbeat) or 3) .. \"s\",\n\t\t\ttls = tls\n\t\t}\n\tend\n\n\tif node.protocol == \"hysteria2\" then\n\t\tprotocol_table = {\n\t\t\tup_mbps = (node.hysteria2_ignore_client_bandwidth ~= \"1\" and node.hysteria2_up_mbps and tonumber(node.hysteria2_up_mbps)) and tonumber(node.hysteria2_up_mbps) or nil,\n\t\t\tdown_mbps = (node.hysteria2_ignore_client_bandwidth ~= \"1\" and node.hysteria2_down_mbps and tonumber(node.hysteria2_down_mbps)) and tonumber(node.hysteria2_down_mbps) or nil,\n\t\t\tobfs = node.hysteria2_obfs_type and {\n\t\t\t\ttype = node.hysteria2_obfs_type,\n\t\t\t\tpassword = node.hysteria2_obfs_password\n\t\t\t} or nil,\n\t\t\tusers = {\n\t\t\t\t{\n\t\t\t\t\tname = \"user1\",\n\t\t\t\t\tpassword = node.hysteria2_auth_password or nil,\n\t\t\t\t}\n\t\t\t},\n\t\t\tignore_client_bandwidth = (node.hysteria2_ignore_client_bandwidth == \"1\") and true or false,\n\t\t\ttls = tls\n\t\t}\n\tend\n\n\tif node.protocol == \"anytls\" then\n\t\tprotocol_table = {\n\t\t\tusers = {\n\t\t\t\t{\n\t\t\t\t\tname = (node.username and node.username ~= \"\") and node.username or \"sekai\",\n\t\t\t\t\tpassword = node.password\n\t\t\t\t}\n\t\t\t},\n\t\t\ttls = tls,\n\t\t}\n\tend\n\n\tif node.protocol == \"direct\" then\n\t\tprotocol_table = {\n\t\t\tnetwork = (node.d_protocol ~= \"TCP,UDP\") and node.d_protocol or nil,\n\t\t\toverride_address = node.d_address,\n\t\t\toverride_port = tonumber(node.d_port)\n\t\t}\n\tend\n\n\tif protocol_table then\n\t\tfor key, value in pairs(protocol_table) do\n\t\t\tinbound[key] = value\n\t\tend\n\tend\n\n\tlocal route = {\n\t\trules = {\n\t\t\t{\n\t\t\t\tip_is_private = true,\n\t\t\t\taction = node.accept_lan == \"1\" and \"route\" or \"reject\",\n\t\t\t\toutbound = node.accept_lan == \"1\" and \"direct\" or nil\n\t\t\t}\n\t\t}\n\t}\n\n\tif node.outbound_node then\n\t\tlocal outbound = nil\n\t\tif node.outbound_node == \"_iface\" and node.outbound_node_iface then\n\t\t\toutbound = {\n\t\t\t\ttype = \"direct\",\n\t\t\t\ttag = \"outbound\",\n\t\t\t\tbind_interface = node.outbound_node_iface,\n\t\t\t\trouting_mark = 255,\n\t\t\t}\n\t\t\tsys.call(string.format(\"mkdir -p %s && touch %s/%s\", api.TMP_IFACE_PATH, api.TMP_IFACE_PATH, node.outbound_node_iface))\n\t\telse\n\t\t\tlocal outbound_node_t = uci:get_all(\"passwall2\", node.outbound_node)\n\t\t\tif node.outbound_node == \"_socks\" or node.outbound_node == \"_http\" then\n\t\t\t\toutbound_node_t = {\n\t\t\t\t\ttype = node.type,\n\t\t\t\t\tprotocol = node.outbound_node:gsub(\"_\", \"\"),\n\t\t\t\t\taddress = node.outbound_node_address,\n\t\t\t\t\tport = tonumber(node.outbound_node_port),\n\t\t\t\t\tusername = (node.outbound_node_username and node.outbound_node_username ~= \"\") and node.outbound_node_username or nil,\n\t\t\t\t\tpassword = (node.outbound_node_password and node.outbound_node_password ~= \"\") and node.outbound_node_password or nil,\n\t\t\t\t}\n\t\t\tend\n\t\t\toutbound = require(\"luci.passwall2.util_sing-box\").gen_outbound(nil, outbound_node_t, \"outbound\")\n\t\tend\n\t\tif outbound then\n\t\t\troute.final = outbound.tag\n\t\t\ttable.insert(outbounds, 1, outbound)\n\t\tend\n\tend\n\n\tlocal config = {\n\t\tlog = {\n\t\t\tdisabled = (not node or node.log == \"0\") and true or false,\n\t\t\tlevel = node.loglevel or \"info\",\n\t\t\ttimestamp = true,\n\t\t\t--output = logfile,\n\t\t},\n\t\tdns = {\n\t\t\tservers = {\n\t\t\t\t{\n\t\t\t\t\ttype = \"local\",\n\t\t\t\t\ttag = \"local\"\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\tinbounds = { inbound },\n\t\toutbounds = outbounds,\n\t\troute = route\n\t}\n\n\tfor index, value in ipairs(config.outbounds) do\n\t\tfor k, v in pairs(config.outbounds[index]) do\n\t\t\tif k:find(\"_\") == 1 then\n\t\t\t\tconfig.outbounds[index][k] = nil\n\t\t\tend\n\t\tend\n\tend\n\n\treturn config\nend\n\nfunction gen_config(var)\n\tlocal flag = var[\"flag\"]\n\tlocal log = var[\"log\"] or \"0\"\n\tlocal loglevel = var[\"loglevel\"] or \"warn\"\n\tlocal logfile = var[\"logfile\"] or \"/dev/null\"\n\tlocal node_id = var[\"node\"]\n\tlocal server_host = var[\"server_host\"]\n\tlocal server_port = var[\"server_port\"]\n\tlocal tcp_proxy_way = var[\"tcp_proxy_way\"]\n\tlocal redir_port = var[\"redir_port\"]\n\tlocal local_socks_address = var[\"local_socks_address\"] or \"0.0.0.0\"\n\tlocal local_socks_port = var[\"local_socks_port\"]\n\tlocal local_socks_username = var[\"local_socks_username\"]\n\tlocal local_socks_password = var[\"local_socks_password\"]\n\tlocal local_http_address = var[\"local_http_address\"] or \"0.0.0.0\"\n\tlocal local_http_port = var[\"local_http_port\"]\n\tlocal local_http_username = var[\"local_http_username\"]\n\tlocal local_http_password = var[\"local_http_password\"]\n\tlocal dns_listen_port = var[\"dns_listen_port\"]\n\tlocal direct_dns_udp_server = var[\"direct_dns_udp_server\"]\n\tlocal direct_dns_udp_port = var[\"direct_dns_udp_port\"]\n\tlocal direct_dns_query_strategy = var[\"direct_dns_query_strategy\"]\n\tlocal direct_ipset = var[\"direct_ipset\"]\n\tlocal direct_nftset = var[\"direct_nftset\"]\n\tlocal remote_dns_udp_server = var[\"remote_dns_udp_server\"]\n\tlocal remote_dns_udp_port = var[\"remote_dns_udp_port\"]\n\tlocal remote_dns_quic = var[\"remote_dns_quic\"]\n\tlocal remote_dns_tcp_server = var[\"remote_dns_tcp_server\"]\n\tlocal remote_dns_tcp_port = var[\"remote_dns_tcp_port\"]\n\tlocal remote_dns_tls = var[\"remote_dns_tls\"]\n\tlocal remote_dns_doh_url = var[\"remote_dns_doh_url\"]\n\tlocal remote_dns_doh_host = var[\"remote_dns_doh_host\"]\n\tlocal remote_dns_doh_ip = var[\"remote_dns_doh_ip\"]\n\tlocal remote_dns_doh_port = var[\"remote_dns_doh_port\"]\n\tlocal remote_dns_http3 = var[\"remote_dns_http3\"]\n\tlocal remote_dns_detour = var[\"remote_dns_detour\"]\n\tlocal remote_dns_query_strategy = var[\"remote_dns_query_strategy\"]\n\tlocal remote_dns_fake = var[\"remote_dns_fake\"]\n\tlocal remote_dns_client_ip = var[\"remote_dns_client_ip\"]\n\tlocal dns_cache = var[\"dns_cache\"]\n\tlocal tags = var[\"tags\"]\n\tlocal no_run = var[\"no_run\"]\n\n\tlocal dns_domain_rules = {}\n\tlocal dns = {}\n\tlocal inbounds = {}\n\tlocal outbounds = {}\n\tlocal rule_set_table = {}\n\tlocal COMMON = {}\n\n\tlocal CACHE_TEXT_FILE = CACHE_PATH .. \"/cache_\" .. flag .. \".txt\"\n\n\tlocal singbox_settings = uci:get_all(appname, \"@global_singbox[0]\") or {}\n\n\tlocal route = {\n\t\trules = {}\n\t}\n\n\tlocal experimental = nil\n\n\tfunction add_rule_set(tab)\n\t\tif tab and next(tab) and tab.tag and not rule_set_table[tab.tag]then\n\t\t\trule_set_table[tab.tag] = tab\n\t\tend\n\tend\n\n\tfunction parse_rule_set(w, rs)\n\t\t-- Format: remote:https://raw.githubusercontent.com/SagerNet/sing-geosite/rule-set/geosite-netflix.srs'\n\t\t-- Format: local:/usr/share/sing-box/geosite-netflix.srs'\n\t\tlocal result = nil\n\t\tif w and #w > 0 then\n\t\t\tif w:find(\"local:\") == 1 or w:find(\"remote:\") == 1 then\n\t\t\t\tlocal _type = w:sub(1, w:find(\":\") - 1) -- \"local\" or \"remote\"\n\t\t\t\tw = w:sub(w:find(\":\") + 1, #w)\n\t\t\t\tlocal format = nil\n\t\t\t\tlocal filename = w:sub(-w:reverse():find(\"/\") + 1) -- geosite-netflix.srs\n\t\t\t\tlocal suffix = \"\"\n\t\t\t\tlocal find_doc = filename:reverse():find(\"%.\")\n\t\t\t\tif find_doc then\n\t\t\t\t\tsuffix = filename:sub(-find_doc + 1) -- \"srs\" or \"json\"\n\t\t\t\tend\n\t\t\t\tif suffix == \"srs\" then\n\t\t\t\t\tformat = \"binary\"\n\t\t\t\telseif suffix == \"json\" then\n\t\t\t\t\tformat = \"source\"\n\t\t\t\tend\n\t\t\t\tif format then\n\t\t\t\t\tlocal rule_set_tag = filename:sub(1, filename:find(\"%.\") - 1) --geosite-netflix\n\t\t\t\t\tif rule_set_tag and #rule_set_tag > 0 then\n\t\t\t\t\t\tif rs then\n\t\t\t\t\t\t\trule_set_tag = \"rs_\" .. rule_set_tag\n\t\t\t\t\t\tend\n\t\t\t\t\t\tresult = {\n\t\t\t\t\t\t\ttype = _type,\n\t\t\t\t\t\t\ttag = rule_set_tag,\n\t\t\t\t\t\t\tformat = format,\n\t\t\t\t\t\t\tpath = _type == \"local\" and w or nil,\n\t\t\t\t\t\t\turl = _type == \"remote\" and w or nil,\n\t\t\t\t\t\t\t--download_detour = _type == \"remote\" and \"\",\n\t\t\t\t\t\t\t--update_interval = _type == \"remote\" and \"\",\n\t\t\t\t\t\t}\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\treturn result\n\tend\n\n\tfunction geo_rule_set(prefix, rule_name)\n\t\tlocal output_srs_file = \"local:\" .. GEO_VAR.TO_SRS_PATH .. prefix .. \"-\" .. rule_name .. \".srs\"\n\t\treturn parse_rule_set(output_srs_file)\n\tend\n\n\tlocal node = nil\n\tif node_id then\n\t\tnode = uci:get_all(appname, node_id)\n\tend\n\n\tif local_socks_port then\n\t\tlocal inbound = {\n\t\t\ttype = \"socks\",\n\t\t\ttag = \"socks-in\",\n\t\t\tlisten = local_socks_address,\n\t\t\tlisten_port = tonumber(local_socks_port),\n\t\t}\n\t\tif local_socks_username and local_socks_password and local_socks_username ~= \"\" and local_socks_password ~= \"\" then\n\t\t\tinbound.users = {\n\t\t\t\t{\n\t\t\t\t\tusername = local_socks_username,\n\t\t\t\t\tpassword = local_socks_password\n\t\t\t\t}\n\t\t\t}\n\t\tend\n\t\ttable.insert(inbounds, inbound)\n\t\ttable.insert(route.rules, {\n\t\t\taction = \"sniff\",\n\t\t\tinbound = inbound.tag\n\t\t})\n\tend\n\n\tif local_http_port then\n\t\tlocal inbound = {\n\t\t\ttype = \"http\",\n\t\t\ttag = \"http-in\",\n\t\t\tlisten = local_http_address,\n\t\t\tlisten_port = tonumber(local_http_port)\n\t\t}\n\t\tif local_http_username and local_http_password and local_http_username ~= \"\" and local_http_password ~= \"\" then\n\t\t\tinbound.users = {\n\t\t\t\t{\n\t\t\t\t\tusername = local_http_username,\n\t\t\t\t\tpassword = local_http_password\n\t\t\t\t}\n\t\t\t}\n\t\tend\n\t\ttable.insert(inbounds, inbound)\n\tend\n\n\tif redir_port then\n\t\tlocal inbound_tproxy = {\n\t\t\ttype = \"tproxy\",\n\t\t\ttag = \"tproxy\",\n\t\t\tlisten = \"::\",\n\t\t\tlisten_port = tonumber(redir_port),\n\t\t}\n\t\tif tcp_proxy_way ~= \"tproxy\" then\n\t\t\tlocal inbound = {\n\t\t\t\ttype = \"redirect\",\n\t\t\t\ttag = \"redirect_tcp\",\n\t\t\t\tlisten = \"::\",\n\t\t\t\tlisten_port = tonumber(redir_port),\n\t\t\t}\n\t\t\ttable.insert(inbounds, inbound)\n\t\t\ttable.insert(route.rules, {\n\t\t\t\taction = \"sniff\",\n\t\t\t\tinbound = inbound.tag\n\t\t\t})\n\n\t\t\tinbound_tproxy.tag = \"tproxy_udp\"\n\t\t\tinbound_tproxy.network = \"udp\"\n\t\tend\n\n\t\ttable.insert(inbounds, inbound_tproxy)\n\t\ttable.insert(route.rules, {\n\t\t\taction = \"sniff\",\n\t\t\tinbound = inbound_tproxy.tag\n\t\t})\n\tend\n\n\tif node then\n\t\tif node.protocol ~= \"_shunt\" then\n\t\t\t-- create shunt logic\n\t\t\tlocal tmp_node = {\n\t\t\t\tremarks = node.remarks,\n\t\t\t\ttype = \"sing-box\",\n\t\t\t\tprotocol = \"_shunt\",\n\t\t\t\tdefault_node = node[\".name\"],\n\t\t\t}\n\t\t\ttmp_node.fakedns = remote_dns_fake\n\t\t\ttmp_node.default_fakedns = remote_dns_fake\n\t\t\tnode = tmp_node\n\t\tend\n\n\t\tif server_host and server_port then\n\t\t\tdefault_node_address = server_host\n\t\t\tdefault_node_port = server_port\n\t\tend\n\n\t\tfunction gen_socks_config_node(node_id, socks_id, remarks)\n\t\t\tif node_id then\n\t\t\t\tsocks_id = node_id:sub(1 + #\"Socks_\")\n\t\t\tend\n\t\t\tlocal result\n\t\t\tlocal socks_node = uci:get_all(appname, socks_id) or nil\n\t\t\tif socks_node then\n\t\t\t\tif not remarks then\n\t\t\t\t\tremarks = socks_node.port\n\t\t\t\tend\n\t\t\t\tresult = {\n\t\t\t\t\t[\".name\"] = \"Socksid_\" .. socks_id,\n\t\t\t\t\tremarks = remarks,\n\t\t\t\t\ttype = \"sing-box\",\n\t\t\t\t\tprotocol = \"socks\",\n\t\t\t\t\taddress = \"127.0.0.1\",\n\t\t\t\t\tport = socks_node.port,\n\t\t\t\t\tuot = \"1\"\n\t\t\t\t}\n\t\t\tend\n\t\t\treturn result\n\t\tend\n\n\t\tlocal nodes_list = {}\n\t\tfunction get_urltest_batch_nodes(_node)\n\t\t\tif #nodes_list == 0 then\n\t\t\t\tfor k, e in ipairs(api.get_valid_nodes()) do\n\t\t\t\t\tif e.node_type == \"normal\" and (not e.chain_proxy or e.chain_proxy == \"\") then\n\t\t\t\t\t\tnodes_list[#nodes_list + 1] = {\n\t\t\t\t\t\t\tid = e[\".name\"],\n\t\t\t\t\t\t\tremarks = e[\"remarks\"],\n\t\t\t\t\t\t\tgroup = e[\"group\"]\n\t\t\t\t\t\t}\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif not _node.node_group or _node.node_group == \"\" then return {} end\n\t\t\tlocal nodes = {}\n\t\t\tfor g in _node.node_group:gmatch(\"%S+\") do\n\t\t\t\tg = api.UrlDecode(g)\n\t\t\t\tfor k, v in pairs(nodes_list) do\n\t\t\t\t\tlocal gn = (v.group and v.group ~= \"\") and v.group or \"default\"\n\t\t\t\t\tif gn:lower() == g:lower() and api.match_node_rule(v.remarks, _node.node_match_rule) then\n\t\t\t\t\t\tnodes[#nodes + 1] = v.id\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\treturn nodes\n\t\tend\n\t\n\t\tfunction get_node_by_id(node_id)\n\t\t\tif not node_id or node_id == \"\" or node_id == \"nil\" then return nil end\n\t\t\tif node_id:find(\"Socks_\") then\n\t\t\t\treturn gen_socks_config_node(node_id)\n\t\t\telse\n\t\t\t\treturn uci:get_all(appname, node_id)\n\t\t\tend\n\t\tend\n\n\t\tfunction gen_urltest_outbound(_node)\n\t\t\tlocal urltest_id = _node[\".name\"]\n\t\t\tlocal urltest_tag = \"urltest-\" .. urltest_id\n\t\t\t-- existing urltest\n\t\t\tfor _, v in ipairs(outbounds) do\n\t\t\t\tif v.tag == urltest_tag then\n\t\t\t\t\treturn v, true\n\t\t\t\tend\n\t\t\tend\n\t\t\t-- new urltest\n\t\t\tlocal ut_nodes\n\t\t\tif _node.node_add_mode and _node.node_add_mode == \"batch\" then\n\t\t\t\tut_nodes = get_urltest_batch_nodes(_node)\n\t\t\telse\n\t\t\t\tut_nodes = _node.urltest_node\n\t\t\tend\n\t\t\tif #ut_nodes == 0 then return nil end\n\t\t\tlocal valid_nodes = {}\n\t\t\tfor i = 1, #(ut_nodes or {}) do\n\t\t\t\tlocal ut_node_id = ut_nodes[i]\n\t\t\t\tlocal ut_node_tag = \"ut-\" .. ut_node_id\n\t\t\t\tlocal is_new_ut_node = true\n\t\t\t\tfor _, outbound in ipairs(outbounds) do\n\t\t\t\t\tif string.sub(outbound.tag, 1, #ut_node_tag) == ut_node_tag then\n\t\t\t\t\t\tis_new_ut_node = false\n\t\t\t\t\t\tvalid_nodes[#valid_nodes + 1] = outbound.tag\n\t\t\t\t\t\tbreak\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif is_new_ut_node then\n\t\t\t\t\tlocal outboundTag = gen_outbound_get_tag(flag, ut_node_id, ut_node_tag, { fragment = singbox_settings.fragment == \"1\" or nil, record_fragment = singbox_settings.record_fragment == \"1\" or nil, run_socks_instance = not no_run })\n\t\t\t\t\tif outboundTag then\n\t\t\t\t\t\tvalid_nodes[#valid_nodes + 1] = outboundTag\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif #valid_nodes == 0 then return nil end\n\t\t\tlocal outbound = {\n\t\t\t\ttype = \"urltest\",\n\t\t\t\ttag = urltest_tag,\n\t\t\t\toutbounds = valid_nodes,\n\t\t\t\turl = _node.urltest_url or \"https://www.gstatic.com/generate_204\",\n\t\t\t\tinterval = (api.format_go_time(_node.urltest_interval) ~= \"0s\") and api.format_go_time(_node.urltest_interval) or \"3m\",\n\t\t\t\ttolerance = (_node.urltest_tolerance and tonumber(_node.urltest_tolerance) > 0) and tonumber(_node.urltest_tolerance) or 50,\n\t\t\t\tidle_timeout = (api.format_go_time(_node.urltest_idle_timeout) ~= \"0s\") and api.format_go_time(_node.urltest_idle_timeout) or \"30m\",\n\t\t\t\tinterrupt_exist_connections = (_node.urltest_interrupt_exist_connections == \"true\" or _node.urltest_interrupt_exist_connections == \"1\") and true or false\n\t\t\t}\n\t\t\treturn outbound\n\t\tend\n\n\t\tfunction set_outbound_detour(node, outbound, outbounds_table)\n\t\t\tif not node or not outbound or not outbounds_table then return nil end\n\t\t\tlocal default_outTag = outbound.tag\n\t\t\tlocal last_insert_outbound\n\n\t\t\tif node.shadowtls == \"1\" then\n\t\t\t\tlocal _node = {\n\t\t\t\t\ttype = \"sing-box\",\n\t\t\t\t\tprotocol = \"shadowtls\",\n\t\t\t\t\tshadowtls_version = node.shadowtls_version,\n\t\t\t\t\tpassword = (node.shadowtls_version == \"2\" or node.shadowtls_version == \"3\") and node.shadowtls_password or nil,\n\t\t\t\t\taddress = node.address,\n\t\t\t\t\tport = node.port,\n\t\t\t\t\ttls = \"1\",\n\t\t\t\t\ttls_serverName = node.shadowtls_serverName,\n\t\t\t\t\tutls = node.shadowtls_utls,\n\t\t\t\t\tfingerprint = node.shadowtls_fingerprint\n\t\t\t\t}\n\t\t\t\tlocal shadowtls_outbound = gen_outbound(nil, _node, outbound.tag .. \"_shadowtls\")\n\t\t\t\tif shadowtls_outbound then\n\t\t\t\t\tlast_insert_outbound = shadowtls_outbound\n\t\t\t\t\toutbound.detour = outbound.tag .. \"_shadowtls\"\n\t\t\t\t\toutbound.server = nil\n\t\t\t\t\toutbound.server_port = nil\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif node.chain_proxy == \"1\" and node.preproxy_node then\n\t\t\t\tif outbound[\"_flag_proxy_tag\"] then\n\t\t\t\t\t--Ignore\n\t\t\t\telse\n\t\t\t\t\tlocal preproxy_node = get_node_by_id(node.preproxy_node)\n\t\t\t\t\tif preproxy_node then\n\t\t\t\t\t\tlocal preproxy_outbound, exist\n\t\t\t\t\t\tif preproxy_node.protocol == \"_urltest\" then\n\t\t\t\t\t\t\tpreproxy_outbound, exist = gen_urltest_outbound(preproxy_node)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tpreproxy_outbound = gen_outbound(node[\".name\"], preproxy_node)\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif preproxy_outbound then\n\t\t\t\t\t\t\toutbound.tag = preproxy_outbound.tag .. \" -> \" .. outbound.tag\n\t\t\t\t\t\t\toutbound.detour = preproxy_outbound.tag\n\t\t\t\t\t\t\tif not exist then\n\t\t\t\t\t\t\t\tlast_insert_outbound = preproxy_outbound\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tdefault_outTag = outbound.tag\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif node.chain_proxy == \"2\" and node.to_node then\n\t\t\t\tlocal to_node = get_node_by_id(node.to_node)\n\t\t\t\tif to_node then\n\t\t\t\t\t-- Landing Node not support use special node.\n\t\t\t\t\tif to_node.protocol:find(\"^_\") then\n\t\t\t\t\t\tto_node = nil\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif to_node then\n\t\t\t\t\tlocal to_outbound\n\t\t\t\t\tif to_node.type ~= \"sing-box\" then\n\t\t\t\t\t\tlocal tag = to_node[\".name\"]\n\t\t\t\t\t\tlocal new_port = api.get_new_port()\n\t\t\t\t\t\ttable.insert(inbounds, {\n\t\t\t\t\t\t\ttype = \"direct\",\n\t\t\t\t\t\t\ttag = tag,\n\t\t\t\t\t\t\tlisten = \"127.0.0.1\",\n\t\t\t\t\t\t\tlisten_port = new_port,\n\t\t\t\t\t\t\toverride_address = to_node.address,\n\t\t\t\t\t\t\toverride_port = tonumber(to_node.port),\n\t\t\t\t\t\t})\n\t\t\t\t\t\ttable.insert(rules, 1, {\n\t\t\t\t\t\t\taction = \"route\",\n\t\t\t\t\t\t\tinbound = {tag},\n\t\t\t\t\t\t\toutbound = outbound.tag,\n\t\t\t\t\t\t})\n\t\t\t\t\t\tif to_node.tls_serverName == nil then\n\t\t\t\t\t\t\tto_node.tls_serverName = to_node.address\n\t\t\t\t\t\tend\n\t\t\t\t\t\tto_node.address = \"127.0.0.1\"\n\t\t\t\t\t\tto_node.port = new_port\n\t\t\t\t\t\tto_outbound = gen_outbound(node[\".name\"], to_node, tag, {\n\t\t\t\t\t\t\ttag = tag,\n\t\t\t\t\t\t\trun_socks_instance = not no_run\n\t\t\t\t\t\t})\n\t\t\t\t\telse\n\t\t\t\t\t\tto_outbound = gen_outbound(node[\".name\"], to_node)\n\t\t\t\t\tend\n\t\t\t\t\tif to_outbound then\n\t\t\t\t\t\tto_outbound.tag = outbound.tag .. \" -> \" .. to_outbound.tag\n\t\t\t\t\t\tif to_node.type == \"sing-box\" then\n\t\t\t\t\t\t\tto_outbound.detour = outbound.tag\n\t\t\t\t\t\tend\n\t\t\t\t\t\ttable.insert(outbounds_table, to_outbound)\n\t\t\t\t\t\tdefault_outTag = to_outbound.tag\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\treturn default_outTag, last_insert_outbound\n\t\tend\n\n\t\tfunction gen_outbound_get_tag(flag, node_id, tag, proxy_table)\n\t\t\tif not node_id or node_id == \"nil\" then return nil end\n\t\t\tlocal node\n\t\t\tif type(node_id) == \"string\" then\n\t\t\t\tnode = get_node_by_id(node_id)\n\t\t\telseif type(node_id) == \"table\" then\n\t\t\t\tnode = node_id\n\t\t\tend\n\t\t\tif not tag then tag = node[\".name\"] end\n\t\t\tif node then\n\t\t\t\tif proxy_table.chain_proxy == \"1\" or proxy_table.chain_proxy == \"2\" then\n\t\t\t\t\tnode.chain_proxy = proxy_table.chain_proxy\n\t\t\t\t\tnode.preproxy_node = proxy_table.chain_proxy == \"1\" and proxy_table.preproxy_node\n\t\t\t\t\tnode.to_node = proxy_table.chain_proxy == \"2\" and proxy_table.to_node\n\t\t\t\t\tproxy_table.chain_proxy = nil\n\t\t\t\t\tproxy_table.preproxy_node = nil\n\t\t\t\t\tproxy_table.to_node = nil\n\t\t\t\tend\n\t\t\t\tlocal outbound, exist\n\t\t\t\tif node.protocol == \"_urltest\" then\n\t\t\t\t\toutbound, exist = gen_urltest_outbound(node)\n\t\t\t\t\tif exist then\n\t\t\t\t\t\treturn outbound.tag\n\t\t\t\t\tend\n\t\t\t\telseif node.protocol == \"_iface\" then\n\t\t\t\t\tif node.iface then\n\t\t\t\t\t\toutbound = {\n\t\t\t\t\t\t\ttag = tag,\n\t\t\t\t\t\t\ttype = \"direct\",\n\t\t\t\t\t\t\tbind_interface = node.iface,\n\t\t\t\t\t\t\trouting_mark = 255,\n\t\t\t\t\t\t}\n\t\t\t\t\t\tsys.call(string.format(\"mkdir -p %s && touch %s/%s\", api.TMP_IFACE_PATH, api.TMP_IFACE_PATH, node.iface))\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tif tag == \"default\" then\n\t\t\t\t\t\tif default_node_address and default_node_port then\n\t\t\t\t\t\t\tnode.address = default_node_address\n\t\t\t\t\t\t\tnode.port = default_node_port\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tfor _, _outbound in ipairs(outbounds) do\n\t\t\t\t\t\t-- Avoid generating duplicate nested processes\n\t\t\t\t\t\tif _outbound[\"_flag_proxy_tag\"] and _outbound[\"_flag_proxy_tag\"]:find(\"socks <- \" .. node[\".name\"], 1, true) then\n\t\t\t\t\t\t\toutbound = api.clone(_outbound)\n\t\t\t\t\t\t\toutbound.tag = tag\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tif not outbound then\n\t\t\t\t\t\toutbound = gen_outbound(flag, node, tag, proxy_table)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif outbound then\n\t\t\t\t\tlocal default_outbound_tag, last_insert_outbound = set_outbound_detour(node, outbound, outbounds)\n\t\t\t\t\ttable.insert(outbounds, outbound)\n\t\t\t\t\tif last_insert_outbound then\n\t\t\t\t\t\ttable.insert(outbounds, last_insert_outbound)\n\t\t\t\t\tend\n\t\t\t\t\treturn default_outbound_tag\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\trules = {}\n\n\t\tif node.protocol == \"_shunt\" then\n\t\t\tinner_fakedns = node.fakedns or \"0\"\n\n\t\t\tlocal function gen_shunt_node(rule_name, _node_id)\n\t\t\t\tif not rule_name then return nil end\n\t\t\t\tif not _node_id then _node_id = node[rule_name] end\n\t\t\t\tif _node_id == \"_direct\" then\n\t\t\t\t\treturn \"direct\"\n\t\t\t\telseif _node_id == \"_blackhole\" then\n\t\t\t\t\treturn \"block\"\n\t\t\t\telseif _node_id == \"_default\" and rule_name ~= \"default\" then\n\t\t\t\t\treturn \"default\"\n\t\t\t\telseif _node_id then\n\t\t\t\t\tlocal proxy_table = {\n\t\t\t\t\t\tfragment = singbox_settings.fragment == \"1\",\n\t\t\t\t\t\trecord_fragment = singbox_settings.record_fragment == \"1\",\n\t\t\t\t\t\trun_socks_instance = not no_run,\n\t\t\t\t\t}\n\t\t\t\t\tlocal preproxy_node_id = node[rule_name .. \"_proxy_tag\"]\n\t\t\t\t\tif preproxy_node_id == _node_id then preproxy_node_id = nil end\n\t\t\t\t\tif preproxy_node_id then\n\t\t\t\t\t\tproxy_table.chain_proxy = \"2\"\n\t\t\t\t\t\tproxy_table.to_node = _node_id\n\t\t\t\t\t\treturn gen_outbound_get_tag(flag, preproxy_node_id, rule_name, proxy_table)\n\t\t\t\t\telse\n\t\t\t\t\t\treturn gen_outbound_get_tag(flag, _node_id, rule_name, proxy_table)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\treturn nil\n\t\t\tend\n\n\t\t\t--default_node\n\t\t\tlocal default_node_id = node.default_node or \"_direct\"\n\t\t\tCOMMON.default_outbound_tag = gen_shunt_node(\"default\", default_node_id)\n\n\t\t\tif inner_fakedns == \"1\" and node[\"default_fakedns\"] == \"1\" then\n\t\t\t\tremote_dns_fake = true\n\t\t\tend\n\n\t\t\t--shunt rule\n\t\t\tuci:foreach(appname, \"shunt_rules\", function(e)\n\t\t\t\tlocal outboundTag = gen_shunt_node(e[\".name\"])\n\t\t\t\tif outboundTag and e.remarks then\n\t\t\t\t\tif outboundTag == \"default\" then\n\t\t\t\t\t\toutboundTag = COMMON.default_outbound_tag\n\t\t\t\t\tend\n\t\t\t\t\tlocal protocols = nil\n\t\t\t\t\tif e[\"protocol\"] and e[\"protocol\"] ~= \"\" then\n\t\t\t\t\t\tprotocols = {}\n\t\t\t\t\t\tstring.gsub(e[\"protocol\"], '[^' .. \" \" .. ']+', function(w)\n\t\t\t\t\t\t\ttable.insert(protocols, w)\n\t\t\t\t\t\tend)\n\t\t\t\t\tend\n\n\t\t\t\t\tlocal inboundTag = nil\n\t\t\t\t\tif e[\"inbound\"] and e[\"inbound\"] ~= \"\" then\n\t\t\t\t\t\tinboundTag = {}\n\t\t\t\t\t\tif e[\"inbound\"]:find(\"tproxy\") then\n\t\t\t\t\t\t\tif redir_port then\n\t\t\t\t\t\t\t\tif tcp_proxy_way == \"tproxy\" then\n\t\t\t\t\t\t\t\t\ttable.insert(inboundTag, \"tproxy\")\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\ttable.insert(inboundTag, \"redirect_tcp\")\n\t\t\t\t\t\t\t\t\ttable.insert(inboundTag, \"tproxy_udp\")\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif e[\"inbound\"]:find(\"socks\") then\n\t\t\t\t\t\t\tif local_socks_port then\n\t\t\t\t\t\t\t\ttable.insert(inboundTag, \"socks-in\")\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\t\n\t\t\t\t\tlocal rule = {\n\t\t\t\t\t\taction = \"route\",\n\t\t\t\t\t\tinbound = inboundTag,\n\t\t\t\t\t\toutbound = outboundTag,\n\t\t\t\t\t\tprotocol = protocols\n\t\t\t\t\t}\n\n\t\t\t\t\tif outboundTag == \"block\" then\n\t\t\t\t\t\trule.action = \"reject\"\n\t\t\t\t\t\trule.outbound = nil\n\t\t\t\t\tend\n\n\t\t\t\t\tif e.network then\n\t\t\t\t\t\tlocal network = {}\n\t\t\t\t\t\tstring.gsub(e.network, '[^' .. \",\" .. ']+', function(w)\n\t\t\t\t\t\t\ttable.insert(network, w)\n\t\t\t\t\t\tend)\n\t\t\t\t\t\trule.network = network\n\t\t\t\t\tend\n\n\t\t\t\t\tif e.source then\n\t\t\t\t\t\tlocal source_ip_cidr = {}\n\t\t\t\t\t\tlocal source_is_private = false\n\t\t\t\t\t\tstring.gsub(e.source, '[^' .. \" \" .. ']+', function(w)\n\t\t\t\t\t\t\tif w:find(\"geoip:\") == 1 then\n\t\t\t\t\t\t\t\tlocal _geoip = w:sub(1 + #\"geoip:\")\n\t\t\t\t\t\t\t\tif _geoip == \"private\" then\n\t\t\t\t\t\t\t\t\tsource_is_private = true\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\ttable.insert(source_ip_cidr, w)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend)\n\t\t\t\t\t\trule.source_ip_cidr = #source_ip_cidr > 0 and source_ip_cidr or nil\n\t\t\t\t\t\trule.source_ip_is_private = source_is_private and true or nil\n\t\t\t\t\tend\n\n\t\t\t\t\t--[[\n\t\t\t\t\t-- Too low usage rate, hidden\n\t\t\t\t\tif e.sourcePort then\n\t\t\t\t\t\tlocal source_port = {}\n\t\t\t\t\t\tlocal source_port_range = {}\n\t\t\t\t\t\tstring.gsub(e.sourcePort, '[^' .. \",\" .. ']+', function(w)\n\t\t\t\t\t\t\tif tonumber(w) and tonumber(w) >= 1 and tonumber(w) <= 65535 then\n\t\t\t\t\t\t\t\ttable.insert(source_port, tonumber(w))\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\ttable.insert(source_port_range, w)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend)\n\t\t\t\t\t\trule.source_port = #source_port > 0 and source_port or nil\n\t\t\t\t\t\trule.source_port_range = #source_port_range > 0 and source_port_range or nil\n\t\t\t\t\tend\n\t\t\t\t\t]]--\n\n\t\t\t\t\tif e.port then\n\t\t\t\t\t\tlocal port = {}\n\t\t\t\t\t\tlocal port_range = {}\n\t\t\t\t\t\tstring.gsub(e.port, '[^' .. \",\" .. ']+', function(w)\n\t\t\t\t\t\t\tif tonumber(w) and tonumber(w) >= 1 and tonumber(w) <= 65535 then\n\t\t\t\t\t\t\t\ttable.insert(port, tonumber(w))\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\ttable.insert(port_range, w)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend)\n\t\t\t\t\t\trule.port = #port > 0 and port or nil\n\t\t\t\t\t\trule.port_range = #port_range > 0 and port_range or nil\n\t\t\t\t\tend\n\n\t\t\t\t\tlocal rule_set = {}\n\n\t\t\t\t\tif e.domain_list then\n\t\t\t\t\t\tlocal domain_table = {\n\t\t\t\t\t\t\tshunt_tag = e[\".name\"],\n\t\t\t\t\t\t\toutboundTag = outboundTag,\n\t\t\t\t\t\t\tdomain = {},\n\t\t\t\t\t\t\tdomain_suffix = {},\n\t\t\t\t\t\t\tdomain_keyword = {},\n\t\t\t\t\t\t\tdomain_regex = {},\n\t\t\t\t\t\t\trule_set = {},\n\t\t\t\t\t\t\tfakedns = nil,\n\t\t\t\t\t\t\tinvert = e.invert == \"1\" and true or nil\n\t\t\t\t\t\t}\n\t\t\t\t\t\tstring.gsub(e.domain_list, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\t\t\t\tif w:find(\"#\") == 1 then return end\n\t\t\t\t\t\t\tif w:find(\"geosite:\") == 1 then\n\t\t\t\t\t\t\t\tlocal _geosite = w:sub(1 + #\"geosite:\")\n\t\t\t\t\t\t\t\tlocal t = geo_rule_set(\"geosite\", _geosite)\n\t\t\t\t\t\t\t\tif t then\n\t\t\t\t\t\t\t\t\tGEO_VAR.SITE_TAGS[_geosite] = true\n\t\t\t\t\t\t\t\t\tadd_rule_set(t)\n\t\t\t\t\t\t\t\t\ttable.insert(rule_set, t.tag)\n\t\t\t\t\t\t\t\t\ttable.insert(domain_table.rule_set, t.tag)\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\telseif w:find(\"regexp:\") == 1 then\n\t\t\t\t\t\t\t\ttable.insert(domain_table.domain_regex, w:sub(1 + #\"regexp:\"))\n\t\t\t\t\t\t\telseif w:find(\"full:\") == 1 then\n\t\t\t\t\t\t\t\ttable.insert(domain_table.domain, w:sub(1 + #\"full:\"))\n\t\t\t\t\t\t\telseif w:find(\"domain:\") == 1 then\n\t\t\t\t\t\t\t\ttable.insert(domain_table.domain_suffix, w:sub(1 + #\"domain:\"))\n\t\t\t\t\t\t\telseif w:find(\"rule-set:\", 1, true) == 1 or w:find(\"rs:\") == 1 then\n\t\t\t\t\t\t\t\tw = w:sub(w:find(\":\") + 1, #w)\n\t\t\t\t\t\t\t\tlocal t = parse_rule_set(w, true)\n\t\t\t\t\t\t\t\tif t then\n\t\t\t\t\t\t\t\t\tadd_rule_set(t)\n\t\t\t\t\t\t\t\t\ttable.insert(rule_set, t.tag)\n\t\t\t\t\t\t\t\t\ttable.insert(domain_table.rule_set, t.tag)\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\ttable.insert(domain_table.domain_keyword, w)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend)\n\t\t\t\t\t\trule.domain = #domain_table.domain > 0 and domain_table.domain or nil\n\t\t\t\t\t\trule.domain_suffix = #domain_table.domain_suffix > 0 and domain_table.domain_suffix or nil\n\t\t\t\t\t\trule.domain_keyword = #domain_table.domain_keyword > 0 and domain_table.domain_keyword or nil\n\t\t\t\t\t\trule.domain_regex = #domain_table.domain_regex > 0 and domain_table.domain_regex or nil\n\t\t\t\t\t\trule.rule_set = #domain_table.rule_set > 0 and domain_table.rule_set or nil\n\t\t\t\t\t\tif inner_fakedns == \"1\" and node[e[\".name\"] .. \"_fakedns\"] == \"1\" then\n\t\t\t\t\t\t\tdomain_table.fakedns = true\n\t\t\t\t\t\tend\n\n\t\t\t\t\t\tif outboundTag then\n\t\t\t\t\t\t\ttable.insert(dns_domain_rules, api.clone(domain_table))\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\n\t\t\t\t\tif e.ip_list then\n\t\t\t\t\t\tlocal ip_cidr = {}\n\t\t\t\t\t\tlocal is_private = false\n\t\t\t\t\t\tstring.gsub(e.ip_list, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\t\t\t\tif w:find(\"#\") == 1 then return end\n\t\t\t\t\t\t\tif w:find(\"geoip:\") == 1 then\n\t\t\t\t\t\t\t\tlocal _geoip = w:sub(1 + #\"geoip:\")\n\t\t\t\t\t\t\t\tif _geoip == \"private\" then\n\t\t\t\t\t\t\t\t\tis_private = true\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tlocal t = geo_rule_set(\"geoip\", _geoip)\n\t\t\t\t\t\t\t\t\tif t then\n\t\t\t\t\t\t\t\t\t\tGEO_VAR.IP_TAGS[_geoip] = true\n\t\t\t\t\t\t\t\t\t\tadd_rule_set(t)\n\t\t\t\t\t\t\t\t\t\ttable.insert(rule_set, t.tag)\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\telseif w:find(\"rule-set:\", 1, true) == 1 or w:find(\"rs:\") == 1 then\n\t\t\t\t\t\t\t\tw = w:sub(w:find(\":\") + 1, #w)\n\t\t\t\t\t\t\t\tlocal t = parse_rule_set(w, true)\n\t\t\t\t\t\t\t\tif t then\n\t\t\t\t\t\t\t\t\tadd_rule_set(t)\n\t\t\t\t\t\t\t\t\ttable.insert(rule_set, t.tag)\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\ttable.insert(ip_cidr, w)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend)\n\n\t\t\t\t\t\trule.ip_is_private = is_private and true or nil\n\t\t\t\t\t\trule.ip_cidr = #ip_cidr > 0 and ip_cidr or nil\n\t\t\t\t\tend\n\t\t\t\t\trule.rule_set = #rule_set > 0 and rule_set or nil\n\t\t\t\t\trule.invert = e.invert == \"1\" and true or nil\n\n\t\t\t\t\ttable.insert(rules, rule)\n\t\t\t\tend\n\t\t\tend)\n\t\tend\n\n\t\tfor index, value in ipairs(rules) do\n\t\t\ttable.insert(route.rules, rules[index])\n\t\tend\n\tend\n\n\tif COMMON.default_outbound_tag then\n\t\troute.final = COMMON.default_outbound_tag\n\tend\n\n\tdns = {\n\t\tservers = {},\n\t\trules = {},\n\t\tdisable_cache = (dns_cache and dns_cache == \"0\") and true or false,\n\t\tdisable_expire = false, -- Disable DNS cache expiration.\n\t\tindependent_cache = false, -- Make each DNS server's cache independent for specific purposes. If enabled, it will slightly reduce performance.\n\t\treverse_mapping = true, -- After responding to a DNS query, a reverse mapping of the IP address is stored to provide the domain name for routing purposes.\n\t}\n\n\ttable.insert(dns.servers, {\n\t\ttype = \"local\",\n\t\ttag = \"local\"\n\t})\n\n\tif direct_dns_udp_server then\n\t\ttable.insert(dns.servers, {\n\t\t\ttag = \"direct\",\n\t\t\ttype = \"udp\",\n\t\t\tserver = direct_dns_udp_server,\n\t\t\tserver_port = tonumber(direct_dns_udp_port) or 53,\n\t\t\tdetour = \"direct\",\n\t\t})\n\tend\n\n\tfor i, v in pairs(GLOBAL.DNS_SERVER) do\n\t\tif direct_dns_udp_server then\n\t\t\tv.server.domain_resolver = \"direct\"\n\t\tend\n\t\ttable.insert(dns.servers, v.server)\n\t\ttable.insert(dns.rules, {\n\t\t\taction = \"route\",\n\t\t\tserver = v.server.tag,\n\t\t\tdomain = v.domain,\n\t\t})\n\tend\n\n\tlocal direct_strategy = \"prefer_ipv6\"\n\tif direct_dns_query_strategy == \"UseIPv4\" then\n\t\tdirect_strategy = \"ipv4_only\"\n\telseif direct_dns_query_strategy == \"UseIPv6\" then\n\t\tdirect_strategy = \"ipv6_only\"\n\tend\n\n\tif dns_listen_port then\n\t\tlocal dns_host = \"\"\n\t\tif flag == \"global\" then\n\t\t\tdns_host = uci:get(appname, \"@global[0]\", \"dns_hosts\") or \"\"\n\t\telse\n\t\t\tflag = flag:gsub(\"acl_\", \"\")\n\t\t\tlocal dns_hosts_mode = uci:get(appname, flag, \"dns_hosts_mode\") or \"default\"\n\t\t\tif dns_hosts_mode == \"default\" then\n\t\t\t\tdns_host = uci:get(appname, \"@global[0]\", \"dns_hosts\") or \"\"\n\t\t\telseif dns_hosts_mode == \"disable\" then\n\t\t\t\tdns_host = \"\"\n\t\t\telseif dns_hosts_mode == \"custom\" then\n\t\t\t\tdns_host = uci:get(appname, flag, \"dns_hosts\") or \"\"\n\t\t\tend\n\t\tend\n\t\tif #dns_host > 0 then\n\t\t\tlocal domains = {}\n\t\t\tlocal hosts_server = {\n\t\t\t\ttag = \"hosts\",\n\t\t\t\ttype = \"hosts\",\n\t\t\t\tpredefined = {}\n\t\t\t}\n\t\t\tstring.gsub(dns_host, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\tlocal host = sys.exec(string.format(\"echo -n $(echo %s | awk -F ' ' '{print $1}')\", w))\n\t\t\t\tlocal key = sys.exec(string.format(\"echo -n $(echo %s | awk -F ' ' '{print $2}')\", w))\n\t\t\t\tif host ~= \"\" and key ~= \"\" then\n\t\t\t\t\thosts_server.predefined[host] = key\n\t\t\t\t\ttable.insert(domains, host)\n\t\t\t\tend\n\t\t\tend)\n\t\t\tif remote_dns_doh_ip and remote_dns_doh_host ~= remote_dns_doh_ip and not api.is_ip(remote_dns_doh_host) then\n\t\t\t\thosts_server.predefined[remote_dns_doh_host] = remote_dns_doh_ip\n\t\t\t\ttable.insert(domains, remote_dns_doh_host)\n\t\t\t\tremote_server_domain_resolver = \"hosts\"\n\t\t\tend\n\t\t\tif next(hosts_server.predefined) then\n\t\t\t\ttable.insert(dns.servers, hosts_server)\n\t\t\t\ttable.insert(dns.rules, {\n\t\t\t\t\tquery_type = {\n\t\t\t\t\t\t\"A\", \"AAAA\"\n\t\t\t\t\t},\n\t\t\t\t\tdomain = domains,\n\t\t\t\t\tserver = \"hosts\"\n\t\t\t\t})\n\t\t\tend\n\t\tend\n\n\t\tif direct_dns_udp_server then\n\t\t\tlocal nodes_domain = {}\n\t\t\tlocal nodes_domain_text = sys.exec('uci show passwall2 | grep \".address=\" | cut -d \"\\'\" -f 2 | grep \"[a-zA-Z]$\" | sort -u')\n\t\t\tstring.gsub(nodes_domain_text, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\tw = (w or \"\"):lower()\n\t\t\t\ttable.insert(nodes_domain, w)\n\t\t\tend)\n\t\t\tif #nodes_domain > 0 then\n\t\t\t\ttable.insert(dns_domain_rules, 1, {\n\t\t\t\t\tdomain = nodes_domain,\n\t\t\t\t\toutboundTag = \"direct\"\n\t\t\t\t})\n\t\t\tend\n\t\tend\n\n\t\tremote_strategy = \"prefer_ipv6\"\n\t\tif remote_dns_query_strategy == \"UseIPv4\" then\n\t\t\tremote_strategy = \"ipv4_only\"\n\t\telseif remote_dns_query_strategy == \"UseIPv6\" then\n\t\t\tremote_strategy = \"ipv6_only\"\n\t\tend\n\n\t\tlocal remote_server = {\n\t\t\ttag = \"remote\",\n\t\t\tdomain_resolver = \"direct\",\n\t\t\tdetour = COMMON.default_outbound_tag,\n\t\t}\n\n\t\tif remote_server_domain_resolver then\n\t\t\tremote_server.domain_resolver = remote_server_domain_resolver\n\t\tend\n\n\t\tif remote_dns_detour == \"direct\" then\n\t\t\tremote_server.detour = \"direct\"\n\t\tend\n\n\t\tif remote_dns_udp_server then\n\t\t\tlocal server_port = tonumber(remote_dns_udp_port) or 53\n\t\t\tremote_server.type = \"udp\"\n\t\t\tremote_server.server = remote_dns_udp_server\n\t\t\tremote_server.server_port = server_port\n\t\t\tif remote_dns_quic then\n\t\t\t\tremote_server.type = \"quic\"\n\t\t\t\tremote_server.server_port = 853\n\t\t\tend\n\t\telseif remote_dns_tcp_server then\n\t\t\tlocal server_port = tonumber(remote_dns_tcp_port) or 53\n\t\t\tremote_server.type = \"tcp\"\n\t\t\tremote_server.server = remote_dns_tcp_server\n\t\t\tremote_server.server_port = server_port\n\t\t\tif remote_dns_tls then\n\t\t\t\tremote_server.type = \"tls\"\n\t\t\t\tremote_server.server_port = 853\n\t\t\tend\n\t\telseif remote_dns_doh_url then\n\t\t\tlocal _a = api.parseURL(remote_dns_doh_url)\n\t\t\tif _a then\n\t\t\t\tremote_server.type = \"https\"\n\t\t\t\tif remote_dns_http3 then\n\t\t\t\t\tremote_server.type = \"h3\"\n\t\t\t\tend\n\t\t\t\tremote_server.server = _a.hostname\n\t\t\t\tif _a.port then\n\t\t\t\t\tremote_server.server_port = _a.port\n\t\t\t\telse\n\t\t\t\t\tremote_server.server_port = 443\n\t\t\t\tend\n\t\t\t\tremote_server.path = _a.pathname\n\t\t\tend\n\t\tend\n\n\t\ttable.insert(dns.servers, remote_server)\n\n\t\tfakedns_tag = \"remote_fakeip\"\n\t\tif remote_dns_fake or inner_fakedns == \"1\" then\n\t\t\ttable.insert(dns.servers, {\n\t\t\t\ttag = fakedns_tag,\n\t\t\t\ttype = \"fakeip\",\n\t\t\t\tinet4_range = \"198.18.0.0/16\",\n\t\t\t\tinet6_range = \"fc00::/18\",\n\t\t\t})\n\n\t\t\tif not experimental then\n\t\t\t\texperimental = {}\n\t\t\tend\n\t\t\texperimental.cache_file = {\n\t\t\t\tenabled = true,\n\t\t\t\tstore_fakeip = true,\n\t\t\t\tpath = CACHE_PATH .. \"/singbox_\" .. flag .. \".db\"\n\t\t\t}\n\t\tend\n\n\t\tlocal default_dns_flag = \"remote\"\n\t\tif node_id and redir_port then\n\t\t\tlocal node = get_node_by_id(node_id)\n\t\t\tif node.protocol == \"_shunt\" then\n\t\t\t\tif node.default_node == \"_direct\" then\n\t\t\t\t\tdefault_dns_flag = \"direct\"\n\t\t\t\tend\n\t\t\tend\n\t\telse default_dns_flag = \"direct\"\n\t\tend\n\t\tdns.final = default_dns_flag\n\n\t\t-- DNS in order of shunt\n\t\tif dns_domain_rules and #dns_domain_rules > 0 then\n\t\t\tfor index, value in ipairs(dns_domain_rules) do\n\t\t\t\tif value.outboundTag and (value.domain or value.domain_suffix or value.domain_keyword or value.domain_regex or value.rule_set) then\n\t\t\t\t\tlocal dns_rule = {\n\t\t\t\t\t\taction = \"route\",\n\t\t\t\t\t\tserver = value.server or value.outboundTag,\n\t\t\t\t\t\tdomain = (value.domain and #value.domain > 0) and value.domain or nil,\n\t\t\t\t\t\tdomain_suffix = (value.domain_suffix and #value.domain_suffix > 0) and value.domain_suffix or nil,\n\t\t\t\t\t\tdomain_keyword = (value.domain_keyword and #value.domain_keyword > 0) and value.domain_keyword or nil,\n\t\t\t\t\t\tdomain_regex = (value.domain_regex and #value.domain_regex > 0) and value.domain_regex or nil,\n\t\t\t\t\t\trule_set = (value.rule_set and #value.rule_set > 0) and value.rule_set or nil,\n\t\t\t\t\t\tdisable_cache = false,\n\t\t\t\t\t\tinvert = value.invert,\n\t\t\t\t\t}\n\t\t\t\t\tif value.outboundTag == \"block\" then\n\t\t\t\t\t\tdns_rule.action = \"predefined\"\n\t\t\t\t\t\tdns_rule.rcode = \"NOERROR\"\n\t\t\t\t\t\tdns_rule.disable_cache = nil\n\t\t\t\t\t\tdns_rule.server = nil\n\t\t\t\t\tend\n\t\t\t\t\tif value.outboundTag == \"direct\" then\n\t\t\t\t\t\tdns_rule.strategy = direct_strategy\n\t\t\t\t\tend\n\t\t\t\t\tif value.outboundTag ~= \"block\" and value.outboundTag ~= \"direct\" then\n\t\t\t\t\t\tdns_rule.server = \"remote\"\n\t\t\t\t\t\tdns_rule.rewrite_ttl = 30\n\t\t\t\t\t\tdns_rule.strategy = remote_strategy\n\t\t\t\t\t\tdns_rule.client_subnet = remote_dns_client_ip\n\t\t\t\t\t\tif value.outboundTag ~= COMMON.default_outbound_tag and remote_server.server and remote_dns_detour ~= \"direct\" then\n\t\t\t\t\t\t\tlocal remote_dns_server = api.clone(remote_server)\n\t\t\t\t\t\t\tremote_dns_server.tag = value.shunt_tag\n\t\t\t\t\t\t\tremote_dns_server.detour = value.outboundTag\n\t\t\t\t\t\t\ttable.insert(dns.servers, remote_dns_server)\n\t\t\t\t\t\t\tdns_rule.server = remote_dns_server.tag\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif value.fakedns then\n\t\t\t\t\t\t\tlocal fakedns_dns_rule = api.clone(dns_rule)\n\t\t\t\t\t\t\tfakedns_dns_rule.query_type = {\n\t\t\t\t\t\t\t\t\"A\", \"AAAA\"\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tfakedns_dns_rule.server = fakedns_tag\n\t\t\t\t\t\t\tfakedns_dns_rule.disable_cache = true\n\t\t\t\t\t\t\tfakedns_dns_rule.client_subnet = nil\n\t\t\t\t\t\t\ttable.insert(dns.rules, fakedns_dns_rule)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\ttable.insert(dns.rules, dns_rule)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif default_dns_flag == \"remote\" then\n\t\t\tif remote_dns_fake then\n\t\t\t\t-- When default is not direct and enable fakedns, default DNS use FakeDNS.\n\t\t\t\tlocal fakedns_dns_rule = {\n\t\t\t\t\tquery_type = {\n\t\t\t\t\t\t\"A\", \"AAAA\"\n\t\t\t\t\t},\n\t\t\t\t\tserver = fakedns_tag,\n\t\t\t\t\tdisable_cache = true,\n\t\t\t\t\trewrite_ttl = 30,\n\t\t\t\t\tstrategy = remote_strategy,\n\t\t\t\t}\n\t\t\t\ttable.insert(dns.rules, fakedns_dns_rule)\n\t\t\telse\n\t\t\t\tlocal remote_dns_rule = {\n\t\t\t\t\tserver = \"remote\",\n\t\t\t\t\tdisable_cache = true,\n\t\t\t\t\tstrategy = remote_strategy,\n\t\t\t\t}\n\t\t\t\ttable.insert(dns.rules, remote_dns_rule)\n\t\t\tend\n\t\tend\n\t\tlocal dns_in_inbound = {\n\t\t\ttype = \"direct\",\n\t\t\ttag = \"dns-in\",\n\t\t\tlisten = \"127.0.0.1\",\n\t\t\tlisten_port = tonumber(dns_listen_port),\n\t\t}\n\t\ttable.insert(inbounds, dns_in_inbound)\n\t\ttable.insert(route.rules, 1, {\n\t\t\taction = \"sniff\",\n\t\t\tinbound = dns_in_inbound.tag\n\t\t})\n\t\ttable.insert(route.rules, 1, {\n\t\t\taction = \"hijack-dns\",\n\t\t\tinbound = dns_in_inbound.tag\n\t\t})\n\n\t\tlocal content = flag .. node_id .. jsonc.stringify(route.rules)\n\t\tif api.cacheFileCompareToLogic(CACHE_TEXT_FILE, content) == false then\n\t\t\t--clear ipset/nftset\n\t\t\tif direct_ipset then\n\t\t\t\tstring.gsub(direct_ipset, '[^' .. \",\" .. ']+', function(w)\n\t\t\t\t\tsys.call(\"ipset -q -F \" .. w)\n\t\t\t\tend)\n\t\t\t\tlocal ipset_prefix_name = \"passwall2_\" .. node_id .. \"_\"\n\t\t\t\tlocal ipset_list = sys.exec(\"ipset list | grep 'Name: ' | grep '\" .. ipset_prefix_name .. \"' | awk '{print $2}'\")\n\t\t\t\tstring.gsub(ipset_list, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\t\tsys.call(\"ipset -q -F \" .. w)\n\t\t\t\tend)\n\t\t\tend\n\t\t\tif direct_nftset then\n\t\t\t\tstring.gsub(direct_nftset, '[^' .. \",\" .. ']+', function(w)\n\t\t\t\t\tlocal split = api.split(w, \"#\")\n\t\t\t\t\tif #split > 3 then\n\t\t\t\t\t\tlocal ip_type = split[1]\n\t\t\t\t\t\tlocal family = split[2]\n\t\t\t\t\t\tlocal table_name = split[3]\n\t\t\t\t\t\tlocal set_name = split[4]\n\t\t\t\t\t\tsys.call(string.format(\"nft flush set %s %s %s 2>/dev/null\", family, table_name, set_name))\n\t\t\t\t\tend\n\t\t\t\tend)\n\t\t\t\tlocal family = \"inet\"\n\t\t\t\tlocal table_name = \"passwall2\"\n\t\t\t\tlocal nftset_prefix_name = \"passwall2_\" .. node_id .. \"_\"\n\t\t\t\tlocal nftset_list = sys.exec(\"nft -a list sets | grep -E '\" .. nftset_prefix_name .. \"' | awk -F 'set ' '{print $2}' | awk '{print $1}'\")\n\t\t\t\tstring.gsub(nftset_list, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\t\tsys.call(string.format(\"nft flush set %s %s %s 2>/dev/null\", family, table_name, w))\n\t\t\t\tend)\n\t\t\tend\n\t\tend\n\tend\n\n\tif next(ech_domain) ~= nil then\n\t\ttable.insert(dns.servers, {\n\t\t\ttag = \"ech-dns\",\n\t\t\ttype = \"https\",\n\t\t\tserver = \"223.5.5.5\"\n\t\t})\n\t\tif not dns.rules then dns.rules = {} end\n\t\tlocal domain = {}\n\t\tfor line, _ in pairs(ech_domain) do domain[#domain+1] = line end\n\t\ttable.insert(dns.rules, 1, {\n\t\t\tdomain = domain,\n\t\t\tserver = \"ech-dns\"\n\t\t})\n\tend\n\n\tif COMMON.default_outbound_tag == \"block\" then\n\t\troute.final = nil\n\t\ttable.insert(route.rules, {\n\t\t\taction = \"reject\"\n\t\t})\n\tend\n\n\tif next(rule_set_table) then\n\t\troute.rule_set = {}\n\t\tfor k, v in pairs(rule_set_table) do\n\t\t\ttable.insert(route.rule_set, v)\n\t\tend\n\tend\n\t\n\tif inbounds or outbounds then\n\t\tlocal config = {\n\t\t\tlog = {\n\t\t\t\tdisabled = log == \"0\" and true or false,\n\t\t\t\tlevel = loglevel,\n\t\t\t\ttimestamp = true,\n\t\t\t\toutput = logfile,\n\t\t\t},\n\t\t\tdns = dns,\n\t\t\tinbounds = inbounds,\n\t\t\toutbounds = outbounds,\n\t\t\troute = route,\n\t\t\texperimental = experimental,\n\t\t}\n\t\ttable.insert(outbounds, {\n\t\t\ttype = \"direct\",\n\t\t\ttag = \"direct\",\n\t\t\trouting_mark = 255,\n\t\t\tdomain_resolver = {\n\t\t\t\tserver = \"local\",\n\t\t\t\tstrategy = \"prefer_ipv6\"\n\t\t\t}\n\t\t})\n\t\tfor index, value in ipairs(config.outbounds) do\n\t\t\tif not value[\"_flag_proxy_tag\"] and not value.detour and value[\"_id\"] and value.server and value.server_port and not no_run then\n\t\t\t\tsys.call(string.format(\"echo '%s' >> %s\", value[\"_id\"], api.TMP_PATH .. \"/direct_node_list\"))\n\t\t\tend\n\t\t\tif not value.detour and value.server then\n\t\t\t\tvalue.detour = \"direct\"\n\t\t\tend\n\t\t\tif value.server and not api.datatypes.hostname(value.server) then\n\t\t\t\tvalue.domain_resolver = nil\n\t\t\tend\n\t\t\tfor k, v in pairs(config.outbounds[index]) do\n\t\t\t\tif k:find(\"_\") == 1 then\n\t\t\t\t\tconfig.outbounds[index][k] = nil\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif true then\n\t\t\tlocal endpoints = {}\n\t\t\tfor i = #config.outbounds, 1, -1 do\n\t\t\t\tlocal value = config.outbounds[i]\n\t\t\t\tif value.type == \"wireguard\" then\n\t\t\t\t\t-- https://sing-box.sagernet.org/migration/#migrate-wireguard-outbound-to-endpoint\n\t\t\t\t\tlocal endpoint = {\n\t\t\t\t\t\ttype = value.type,\n\t\t\t\t\t\ttag = value.tag,\n\t\t\t\t\t\tsystem = value.system_interface,\n\t\t\t\t\t\tname = value.interface_name,\n\t\t\t\t\t\tmtu = value.mtu,\n\t\t\t\t\t\taddress = value.local_address,\n\t\t\t\t\t\tprivate_key = value.private_key,\n\t\t\t\t\t\tpeers = {\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\taddress = value.server,\n\t\t\t\t\t\t\t\tport = value.server_port,\n\t\t\t\t\t\t\t\tpublic_key = value.peer_public_key,\n\t\t\t\t\t\t\t\tpre_shared_key = value.pre_shared_key,\n\t\t\t\t\t\t\t\tallowed_ips = {\"0.0.0.0/0\"},\n\t\t\t\t\t\t\t\treserved = value.reserved\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tdomain_resolver = value.domain_resolver,\n\t\t\t\t\t\tdetour = value.detour\n\t\t\t\t\t}\n\t\t\t\t\tendpoints[#endpoints + 1] = endpoint\n\t\t\t\t\ttable.remove(config.outbounds, i)\n\t\t\t\tend\n\t\t\tend\n\t\t\tif #endpoints > 0 then\n\t\t\t\tconfig.endpoints = endpoints\n\t\t\tend\n\t\tend\n\t\treturn jsonc.stringify(config, 1)\n\tend\nend\n\nfunction gen_proto_config(var)\n\tlocal local_socks_address = var[\"local_socks_address\"] or \"0.0.0.0\"\n\tlocal local_socks_port = var[\"local_socks_port\"]\n\tlocal local_socks_username = var[\"local_socks_username\"]\n\tlocal local_socks_password = var[\"local_socks_password\"]\n\tlocal local_http_address = var[\"local_http_address\"] or \"0.0.0.0\"\n\tlocal local_http_port = var[\"local_http_port\"]\n\tlocal local_http_username = var[\"local_http_username\"]\n\tlocal local_http_password = var[\"local_http_password\"]\n\tlocal server_proto = var[\"server_proto\"]\n\tlocal server_address = var[\"server_address\"]\n\tlocal server_port = var[\"server_port\"]\n\tlocal server_username = var[\"server_username\"]\n\tlocal server_password = var[\"server_password\"]\n\n\tlocal inbounds = {}\n\tlocal outbounds = {}\n\n\tif local_socks_address and local_socks_port then\n\t\tlocal inbound = {\n\t\t\ttype = \"socks\",\n\t\t\ttag = \"socks-in\",\n\t\t\tlisten = local_socks_address,\n\t\t\tlisten_port = tonumber(local_socks_port),\n\t\t}\n\t\tif local_socks_username and local_socks_password and local_socks_username ~= \"\" and local_socks_password ~= \"\" then\n\t\t\tinbound.users = {\n\t\t\t\tusername = local_socks_username,\n\t\t\t\tpassword = local_socks_password\n\t\t\t}\n\t\tend\n\t\ttable.insert(inbounds, inbound)\n\tend\n\n\tif local_http_address and local_http_port then\n\t\tlocal inbound = {\n\t\t\ttype = \"http\",\n\t\t\ttag = \"http-in\",\n\t\t\ttls = nil,\n\t\t\tlisten = local_http_address,\n\t\t\tlisten_port = tonumber(local_http_port),\n\t\t}\n\t\tif local_http_username and local_http_password and local_http_username ~= \"\" and local_http_password ~= \"\" then\n\t\t\tinbound.users = {\n\t\t\t\t{\n\t\t\t\t\tusername = local_http_username,\n\t\t\t\t\tpassword = local_http_password\n\t\t\t\t}\n\t\t\t}\n\t\tend\n\t\ttable.insert(inbounds, inbound)\n\tend\n\n\tif server_proto ~= \"nil\" and server_address ~= \"nil\" and server_port ~= \"nil\" then\n\t\tlocal outbound = {\n\t\t\ttype = server_proto,\n\t\t\ttag = \"out\",\n\t\t\tserver = server_address,\n\t\t\tserver_port = tonumber(server_port),\n\t\t\tusername = (server_username and server_password) and server_username or nil,\n\t\t\tpassword = (server_username and server_password) and server_password or nil,\n\t\t}\n\t\tif outbound then table.insert(outbounds, outbound) end\n\tend\n\t\n\tlocal config = {\n\t\tlog = {\n\t\t\tdisabled = true,\n\t\t\tlevel = \"warn\",\n\t\t\ttimestamp = true,\n\t\t},\n\t\tinbounds = inbounds,\n\t\toutbounds = outbounds,\n\t}\n\treturn jsonc.stringify(config, 1)\nend\n\nfunction gen_front_dns_config(var)\n\tlocal dns_listen_port = var[\"dns_listen_port\"]\n\tlocal direct_dns_udp_server = var[\"direct_dns_udp_server\"]\n\tlocal direct_dns_udp_port = var[\"direct_dns_udp_port\"]\n\tlocal direct_dns_query_strategy = var[\"direct_dns_query_strategy\"]\n\tlocal default_dns_udp_server = var[\"default_dns_udp_server\"]\n\tlocal default_dns_udp_port = var[\"default_dns_udp_port\"]\n\n\tlocal dns = {\n\t\tservers = {},\n\t\trules = {}\n\t}\n\tlocal inbounds = {}\n\tlocal outbounds = {}\n\tlocal route = {}\n\n\tlocal direct_strategy = \"prefer_ipv6\"\n\tif direct_dns_query_strategy == \"UseIPv4\" then\n\t\tdirect_strategy = \"ipv4_only\"\n\telseif direct_dns_query_strategy == \"UseIPv6\" then\n\t\tdirect_strategy = \"ipv6_only\"\n\tend\n\n\ttable.insert(outbounds, {\n\t\ttype = \"direct\",\n\t\ttag = \"direct\",\n\t\trouting_mark = 255,\n\t\tdomain_resolver = {\n\t\t\tserver = \"direct\",\n\t\t\tstrategy = direct_strategy\n\t\t}\n\t})\n\n\tlocal direct_dns_shunt = uci:get(appname, \"@global[0]\", \"direct_dns_shunt\") or \"\"\n\tif #direct_dns_shunt > 0 then\n\t\tlocal dns_server = {}\n\t\tstring.gsub(direct_dns_shunt, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\tif w:find(\"#\") == 1 then return end\n\t\t\tlocal domain = sys.exec(string.format(\"echo -n $(echo %s | awk -F ' ' '{print $1}')\", w))\n\t\t\tlocal dns = sys.exec(string.format(\"echo -n $(echo %s | awk -F ' ' '{print $2}')\", w))\n\t\t\tif domain ~= \"\" and dns ~= \"\" then\n\t\t\t\tlocal new_dns_server = parseDNS(dns)\n\t\t\t\tif new_dns_server then\n\t\t\t\t\tif not dns_server[dns] then\n\t\t\t\t\t\tdns_server[dns] = {}\n\t\t\t\t\tend\n\t\t\t\t\tif not dns_server[dns].server then\n\t\t\t\t\t\tdns_server[dns].server = new_dns_server\n\t\t\t\t\t\tdns_server[dns].server.tag = dns\n\t\t\t\t\t\tdns_server[dns].server.detour = \"direct\"\n\t\t\t\t\tend\n\t\t\t\t\tif not dns_server[dns].rule then\n\t\t\t\t\t\tdns_server[dns].rule = {\n\t\t\t\t\t\t\taction = \"route\",\n\t\t\t\t\t\t\tserver = dns,\n\t\t\t\t\t\t\tdomain = {},\n\t\t\t\t\t\t\tdomain_suffix = {},\n\t\t\t\t\t\t\tdomain_keyword = {}\n\t\t\t\t\t\t}\n\t\t\t\t\tend\n\t\t\t\t\tif domain:find(\"full:\") == 1 then\n\t\t\t\t\t\ttable.insert(dns_server[dns].rule.domain, domain:sub(1 + #\"full:\"))\n\t\t\t\t\telseif domain:find(\"domain:\") == 1 then\n\t\t\t\t\t\ttable.insert(dns_server[dns].rule.domain_suffix, domain:sub(1 + #\"domain:\"))\n\t\t\t\t\telse\n\t\t\t\t\t\ttable.insert(dns_server[dns].rule.domain_keyword, domain)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend)\n\t\tfor k, v in pairs(dns_server) do\n\t\t\ttable.insert(dns.servers, v.server)\n\t\t\tif #v.rule.domain == 0 then v.rule.domain = nil end\n\t\t\tif #v.rule.domain_suffix == 0 then v.rule.domain_suffix = nil end\n\t\t\tif #v.rule.domain_keyword == 0 then v.rule.domain_keyword = nil end\n\t\t\ttable.insert(dns.rules, v.rule)\n\t\tend\n\tend\n\n\tif direct_dns_udp_server then\n\t\ttable.insert(dns.servers, {\n\t\t\ttag = \"direct\",\n\t\t\ttype = \"udp\",\n\t\t\tserver = direct_dns_udp_server,\n\t\t\tserver_port = tonumber(direct_dns_udp_port) or 53,\n\t\t\tdetour = \"direct\"\n\t\t})\n\t\tlocal node_domain = {}\n\t\tlocal nodes_domain_text = sys.exec('uci show passwall2 | grep \".address=\" | cut -d \"\\'\" -f 2 | grep \"[a-zA-Z]$\" | sort -u')\n\t\tstring.gsub(nodes_domain_text, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\tw = (w or \"\"):lower()\n\t\t\ttable.insert(node_domain, w)\n\t\tend)\n\t\tif #node_domain > 0 then\n\t\t\ttable.insert(dns.rules, {\n\t\t\t\taction = \"route\",\n\t\t\t\tserver = \"direct\",\n\t\t\t\tdomain = node_domain\n\t\t\t})\n\t\tend\n\tend\n\n\tif default_dns_udp_server then\n\t\ttable.insert(dns.servers, {\n\t\t\ttag = \"default\",\n\t\t\ttype = \"udp\",\n\t\t\tserver = default_dns_udp_server,\n\t\t\tserver_port = tonumber(default_dns_udp_port) or 53,\n\t\t\tdetour = \"direct\"\n\t\t})\n\t\tdns.final = \"default\"\n\telse\n\t\tdns.final = \"direct\"\n\tend\n\n\tlocal dns_in_inbound = {\n\t\ttype = \"direct\",\n\t\ttag = \"dns-in\",\n\t\tlisten = \"127.0.0.1\",\n\t\tlisten_port = tonumber(dns_listen_port),\n\t}\n\ttable.insert(inbounds, dns_in_inbound)\n\n\troute.rules = {}\n\ttable.insert(route.rules, {\n\t\taction = \"hijack-dns\",\n\t\tinbound = dns_in_inbound.tag\n\t})\n\ttable.insert(route.rules, {\n\t\taction = \"sniff\",\n\t\tinbound = dns_in_inbound.tag\n\t})\n\troute.final = \"direct\"\n\n\tlocal config = {\n\t\tlog = {\n\t\t\tdisabled = true,\n\t\t\tlevel = \"debug\",\n\t\t\ttimestamp = true,\n\t\t},\n\t\tdns = dns,\n\t\tinbounds = inbounds,\n\t\toutbounds = outbounds,\n\t\troute = route\n\t}\n\treturn jsonc.stringify(config, 1)\nend\n\n_G.gen_config = gen_config\n_G.gen_front_dns_config = gen_front_dns_config\n_G.gen_proto_config = gen_proto_config\n_G.geo_convert_srs = geo_convert_srs\n\nif arg[1] then\n\tlocal func =_G[arg[1]]\n\tif func then\n\t\tlocal var = nil\n\t\tif arg[2] then\n\t\t\tvar = jsonc.parse(arg[2])\n\t\tend\n\t\tprint(func(var))\n\t\tif (next(GEO_VAR.SITE_TAGS) or next(GEO_VAR.IP_TAGS)) and not no_run then\n\t\t\tconvert_geofile()\n\t\tend\n\tend\nend\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/passwall2/util_tuic.lua",
    "content": "module(\"luci.passwall2.util_tuic\", package.seeall)\nlocal api = require \"luci.passwall2.api\"\nlocal uci = api.uci\nlocal jsonc = api.jsonc\n\nfunction gen_config(var)\n\tlocal node_id = var[\"node\"]\n\tif not node_id then\n\t\tprint(\"node Cannot be empty!\")\n\t\treturn\n\tend\n\tlocal node = uci:get_all(\"passwall2\", node_id)\n\tlocal local_addr = var[\"local_addr\"]\n\tlocal local_port = var[\"local_port\"]\n\tlocal server_host = var[\"server_host\"] or (node.address or \"\"):lower()\n\tlocal server_port = var[\"server_port\"] or node.port\n\tlocal loglevel = var[\"loglevel\"] or \"warn\"\n\n\tlocal tuic= {\n\t\t\trelay = {\n\t\t\t\tserver = server_host .. \":\" .. server_port,\n\t\t\t\tip = node.tuic_ip,\n\t\t\t\tuuid = node.uuid,\n\t\t\t\tpassword = node.tuic_password,\n\t\t\t\t-- certificates = node.tuic_certificate and { node.tuic_certpath } or nil,\n\t\t\t\tudp_relay_mode = node.tuic_udp_relay_mode,\n\t\t\t\tcongestion_control = node.tuic_congestion_control,\n\t\t\t\theartbeat = (tonumber(node.tuic_heartbeat) or 3) .. \"s\",\n\t\t\t\ttimeout = (tonumber(node.tuic_timeout) or 8) .. \"s\",\n\t\t\t\tgc_interval = (tonumber(node.tuic_gc_interval) or 3) .. \"s\",\n\t\t\t\tgc_lifetime = (tonumber(node.tuic_gc_lifetime) or 15) .. \"s\",\n\t\t\t\talpn = (node.tuic_tls_alpn and node.tuic_tls_alpn ~= \"\") and (function()\n\t\t\t\t\tlocal alpn = {}\n\t\t\t\t\tstring.gsub(node.tuic_tls_alpn, '[^,]+', function(w)\n\t\t\t\t\t\ttable.insert(alpn, w)\n\t\t\t\t\tend)\n\t\t\t\t\tif #alpn > 0 then return alpn end\n\t\t\t\t\treturn nil\n\t\t\t\tend)() or nil,\n\t\t\t\tdisable_sni = (node.tuic_disable_sni == \"1\"),\n\t\t\t\tzero_rtt_handshake = (node.tuic_zero_rtt_handshake == \"1\"),\n\t\t\t\tsend_window = tonumber(node.tuic_send_window),\n\t\t\t\treceive_window = tonumber(node.tuic_receive_window)\n\t\t\t},\n\t\t\t[\"local\"] = {\n\t\t\t\tserver = \"[::]:\" .. local_port,\n\t\t\t\tusername = node.tuic_socks_username,\n\t\t\t\tpassword = node.tuic_socks_password,\n\t\t\t\tdual_stack = (node.tuic_dual_stack == \"1\") and true or false,\n\t\t\t\tmax_packet_size = tonumber(node.tuic_max_package_size)\n\t\t\t},\n\t\t\tlog_level = loglevel\n\t}\n\treturn jsonc.stringify(tuic, 1)\nend\n\n_G.gen_config = gen_config\n\nif arg[1] then\n\tlocal func =_G[arg[1]]\n\tif func then\n\t\tlocal var = nil\n\t\tif arg[2] then\n\t\t\tvar = jsonc.parse(arg[2])\n\t\tend\n\t\tprint(func(var))\n\tend\nend\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/passwall2/util_xray.lua",
    "content": "module(\"luci.passwall2.util_xray\", package.seeall)\nlocal api = require \"luci.passwall2.api\"\nlocal uci = api.uci\nlocal sys = api.sys\nlocal jsonc = api.jsonc\nlocal appname = api.appname\nlocal fs = api.fs\nlocal CACHE_PATH = api.CACHE_PATH\n\nlocal GLOBAL = {\n\tDNS_SERVER = {},\n\tDNS_HOSTNAME = {}\n}\n\nlocal xray_version = api.get_app_version(\"xray\")\n\nlocal function get_domain_excluded()\n\tlocal path = string.format(\"/usr/share/%s/domains_excluded\", appname)\n\tlocal content = fs.readfile(path)\n\tif not content then return nil end\n\tlocal hosts = {}\n\tstring.gsub(content, '[^' .. \"\\n\" .. ']+', function(w)\n\t\tlocal s = api.trim(w)\n\t\tif s == \"\" then return end\n\t\tif s:find(\"#\") and s:find(\"#\") == 1 then return end\n\t\tif not s:find(\"#\") or s:find(\"#\") ~= 1 then table.insert(hosts, s) end\n\tend)\n\tif #hosts == 0 then hosts = nil end\n\treturn hosts\nend\n\nfunction parseDNS(str)\n\tlocal result_dns_server\n\t-- [proto]://[ip]\n\t-- [proto]://[ip]:[port]\n\t-- https://[ip]/[path]\n\t-- https://[ip]:[port]/[path]\n\tlocal _a = api.parseURL(str)\n\tif _a then\n\t\tif _a.protocol == \"tcp\" or _a.protocol == \"udp\" or _a.protocol == \"https\" then\n\t\t\tresult_dns_server = {\n\t\t\t\taddress = str\n\t\t\t}\n\t\t\tif _a.protocol == \"udp\" then\n\t\t\t\tresult_dns_server.address = _a.hostname\n\t\t\tend\n\t\t\tif _a.port then\n\t\t\t\tresult_dns_server.port = _a.port\n\t\t\telse\n\t\t\t\tif _a.protocol == \"https\" then\n\t\t\t\t\tresult_dns_server.port = 443\n\t\t\t\telse\n\t\t\t\t\tresult_dns_server.port = 53\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\treturn result_dns_server\nend\n\nfunction gen_outbound(flag, node, tag, proxy_table)\n\tlocal result = nil\n\tif node then\n\t\tlocal node_id = node[\".name\"]\n\t\tif tag == nil then\n\t\t\ttag = node_id\n\t\tend\n\t\tlocal remarks = node.remarks\n\n\t\tlocal proxy_tag = nil\n\t\tlocal fragment = nil\n\t\tlocal noise = nil\n\t\tlocal run_socks_instance = true\n\t\tif proxy_table ~= nil and type(proxy_table) == \"table\" then\n\t\t\tproxy_tag = proxy_table.tag or nil\n\t\t\tfragment = proxy_table.fragment or nil\n\t\t\tnoise = proxy_table.noise or nil\n\t\t\trun_socks_instance = proxy_table.run_socks_instance\n\t\tend\n\n\t\tif node.type ~= \"Xray\" then\n\t\t\tlocal relay_port = node.port\n\t\t\tlocal new_port = api.get_new_port()\n\t\t\tlocal config_file = string.format(\"%s_%s_%s.json\", flag, tag, new_port)\n\t\t\tif tag and node_id and not tag:find(node_id) then\n\t\t\t\tconfig_file = string.format(\"%s_%s_%s_%s.json\", flag, tag, node_id, new_port)\n\t\t\tend\n\t\t\tif run_socks_instance then\n\t\t\t\tsys.call(string.format('/usr/share/%s/app.sh run_socks \"%s\"> /dev/null',\n\t\t\t\t\tappname,\n\t\t\t\t\tstring.format(\"flag=%s node=%s bind=%s socks_port=%s config_file=%s relay_port=%s\",\n\t\t\t\t\t\tnew_port, --flag\n\t\t\t\t\t\tnode_id, --node\n\t\t\t\t\t\t\"127.0.0.1\", --bind\n\t\t\t\t\t\tnew_port, --socks port\n\t\t\t\t\t\tconfig_file, --config file\n\t\t\t\t\t\t(proxy_tag and relay_port) and tostring(relay_port) or \"\" --relay port\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t)\n\t\t\tend\n\t\t\tnode = {}\n\t\t\tnode.protocol = \"socks\"\n\t\t\tnode.transport = \"tcp\"\n\t\t\tnode.address = \"127.0.0.1\"\n\t\t\tnode.port = new_port\n\t\t\tnode.stream_security = \"none\"\n\t\t\tproxy_tag = \"socks <- \" .. node_id\n\t\telse\n\t\t\tif proxy_tag then\n\t\t\t\tnode.proxySettings = {\n\t\t\t\t\ttag = proxy_tag,\n\t\t\t\t\ttransportLayer = true\n\t\t\t\t}\n\t\t\tend\n\t\tend\n\t\t\n\t\tif node.type == \"Xray\" then\n\t\t\tif node.tls and node.tls == \"1\" then\n\t\t\t\tnode.stream_security = \"tls\"\n\t\t\t\tif node.reality and node.reality == \"1\" then\n\t\t\t\t\tnode.stream_security = \"reality\"\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tif node.protocol == \"wireguard\" and node.wireguard_reserved then\n\t\t\tlocal bytes = {}\n\t\t\tif not node.wireguard_reserved:match(\"[^%d,]+\") then\n\t\t\t\tnode.wireguard_reserved:gsub(\"%d+\", function(b)\n\t\t\t\t\tbytes[#bytes + 1] = tonumber(b)\n\t\t\t\tend)\n\t\t\telse\n\t\t\t\tlocal result = api.base64Decode(node.wireguard_reserved)\n\t\t\t\tfor i = 1, #result do\n\t\t\t\t\tbytes[i] = result:byte(i)\n\t\t\t\tend\n\t\t\tend\n\t\t\tnode.wireguard_reserved = #bytes > 0 and bytes or nil\n\t\tend\n\n\t\tif node.protocol == \"hysteria2\" then\n\t\t\tnode.protocol = \"hysteria\"\n\t\t\tnode.transport = \"hysteria\"\n\t\t\tnode.stream_security = \"tls\"\n\t\tend\n\n\t\tif remarks then\n\t\t\ttag = tag .. \":\" .. remarks\n\t\tend\n\n\t\tnode.address = (node.address or \"\"):lower()\n\n\t\tresult = {\n\t\t\t_id = node_id,\n\t\t\t_flag = flag,\n\t\t\t_flag_proxy_tag = proxy_tag,\n\t\t\ttag = tag,\n\t\t\tproxySettings = node.proxySettings or nil,\n\t\t\tprotocol = node.protocol,\n\t\t\tmux = {\n\t\t\t\tenabled = (node.mux == \"1\") and true or false,\n\t\t\t\tconcurrency = (node.mux == \"1\" and ((node.mux_concurrency) and tonumber(node.mux_concurrency) or -1)) or nil,\n\t\t\t\txudpConcurrency = (node.mux == \"1\" and ((node.xudp_concurrency) and tonumber(node.xudp_concurrency) or 8)) or nil\n\t\t\t} or nil,\n\t\t\tstreamSettings = (node.streamSettings or node.protocol == \"vmess\" or node.protocol == \"vless\" or node.protocol == \"socks\" or node.protocol == \"shadowsocks\" or node.protocol == \"trojan\" or node.protocol == \"hysteria\") and {\n\t\t\t\tsockopt = {\n\t\t\t\t\tmark = 255,\n\t\t\t\t\tdomainStrategy = node.domain_strategy or \"UseIP\",\n\t\t\t\t\ttcpFastOpen = (node.tcp_fast_open == \"1\") and true or nil,\n\t\t\t\t\ttcpMptcp = (node.tcpMptcp == \"1\") and true or nil\n\t\t\t\t},\n\t\t\t\tnetwork = node.transport,\n\t\t\t\tsecurity = node.stream_security,\n\t\t\t\ttlsSettings = (node.stream_security == \"tls\") and {\n\t\t\t\t\tserverName = node.tls_serverName,\n\t\t\t\t\tallowInsecure = (function()\n\t\t\t\t\t\t\t\tif node.tls_pinSHA256 and node.tls_pinSHA256 ~= \"\" then return nil end\n\t\t\t\t\t\t\t\tif api.compare_versions(os.date(\"%Y.%m.%d\"), \"<\", \"2026.6.1\") and node.tls_allowInsecure == \"1\" then return true end\n\t\t\t\t\t\t\tend)(),\n\t\t\t\t\tfingerprint = (node.type == \"Xray\" and node.utls == \"1\" and node.fingerprint and node.fingerprint ~= \"\") and node.fingerprint or nil,\n\t\t\t\t\tpinnedPeerCertSha256 = (function()\n\t\t\t\t\t\t\t\tif api.compare_versions(xray_version, \"<\", \"26.1.31\") then return nil end\n\t\t\t\t\t\t\t\tif not node.tls_pinSHA256 then return \"\" end\n\t\t\t\t\t\t\t\treturn node.tls_pinSHA256\n\t\t\t\t\t\t\tend)(),\n\t\t\t\t\tverifyPeerCertByName = (function()\n\t\t\t\t\t\t\t\tif api.compare_versions(xray_version, \"<\", \"26.1.31\") then return nil end\n\t\t\t\t\t\t\t\tif not node.tls_CertByName then return \"\" end\n\t\t\t\t\t\t\t\treturn node.tls_CertByName\n\t\t\t\t\t\t\tend)(),\n\t\t\t\t\techConfigList = (node.ech == \"1\") and node.ech_config or nil\n\t\t\t\t} or nil,\n\t\t\t\trealitySettings = (node.stream_security == \"reality\") and {\n\t\t\t\t\tserverName = node.tls_serverName,\n\t\t\t\t\tpublicKey = node.reality_publicKey,\n\t\t\t\t\tshortId = node.reality_shortId or \"\",\n\t\t\t\t\tspiderX = node.reality_spiderX or \"/\",\n\t\t\t\t\tfingerprint = (node.type == \"Xray\" and node.fingerprint and node.fingerprint ~= \"\") and node.fingerprint or \"chrome\",\n\t\t\t\t\tmldsa65Verify = (node.use_mldsa65Verify == \"1\") and node.reality_mldsa65Verify or nil\n\t\t\t\t} or nil,\n\t\t\t\trawSettings = ((node.transport == \"raw\" or node.transport == \"tcp\") and node.protocol ~= \"socks\" and (node.tcp_guise and node.tcp_guise ~= \"none\")) and {\n\t\t\t\t\theader = {\n\t\t\t\t\t\ttype = node.tcp_guise,\n\t\t\t\t\t\trequest = (node.tcp_guise == \"http\") and {\n\t\t\t\t\t\t\tpath = node.tcp_guise_http_path and (function()\n\t\t\t\t\t\t\t\t\tlocal t, r = node.tcp_guise_http_path, {}\n\t\t\t\t\t\t\t\t\tfor _, v in ipairs(t) do\n\t\t\t\t\t\t\t\t\t\tr[#r + 1] = (v == \"\" and \"/\" or v)\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\treturn r\n\t\t\t\t\t\t\t\tend)() or {\"/\"},\n\t\t\t\t\t\t\theaders = (node.tcp_guise_http_host or node.user_agent) and {\n\t\t\t\t\t\t\t\tHost = node.tcp_guise_http_host,\n\t\t\t\t\t\t\t\t[\"User-Agent\"] = node.user_agent and {node.user_agent} or nil\n\t\t\t\t\t\t\t} or nil\n\t\t\t\t\t\t} or nil\n\t\t\t\t\t}\n\t\t\t\t} or nil,\n\t\t\t\tkcpSettings = (node.transport == \"mkcp\") and {\n\t\t\t\t\tmtu = (node.mkcp_mtu and node.mkcp_mtu ~= \"\") and tonumber(node.mkcp_mtu) or 1350,\n\t\t\t\t\ttti = 50,\n\t\t\t\t\tuplinkCapacity = 12,\n\t\t\t\t\tdownlinkCapacity = 100,\n\t\t\t\t\tCwndMultiplier = 1,\n\t\t\t\t\tMaxSendingWindow = 2 * 1024 * 1024\n\t\t\t\t} or nil,\n\t\t\t\twsSettings = (node.transport == \"ws\") and {\n\t\t\t\t\tpath = node.ws_path or \"/\",\n\t\t\t\t\thost = node.ws_host,\n\t\t\t\t\theaders = node.user_agent and {\n\t\t\t\t\t\t[\"User-Agent\"] = node.user_agent\n\t\t\t\t\t} or nil,\n\t\t\t\t\tmaxEarlyData = tonumber(node.ws_maxEarlyData) or nil,\n\t\t\t\t\tearlyDataHeaderName = (node.ws_earlyDataHeaderName) and node.ws_earlyDataHeaderName or nil,\n\t\t\t\t\theartbeatPeriod = tonumber(node.ws_heartbeatPeriod) or nil\n\t\t\t\t} or nil,\n\t\t\t\tgrpcSettings = (node.transport == \"grpc\") and {\n\t\t\t\t\tserviceName = node.grpc_serviceName,\n\t\t\t\t\tmultiMode = (node.grpc_mode == \"multi\") and true or false,\n\t\t\t\t\tidle_timeout = node.grpc_idle_timeout and (tonumber(node.grpc_idle_timeout) < 10 and 10 or tonumber(node.grpc_idle_timeout)) or nil,\n\t\t\t\t\thealth_check_timeout = tonumber(node.grpc_health_check_timeout) or nil,\n\t\t\t\t\tpermit_without_stream = (node.grpc_permit_without_stream == \"1\") and true or false,\n\t\t\t\t\tinitial_windows_size = node.grpc_initial_windows_size and tonumber(node.grpc_initial_windows_size) or 0,\n\t\t\t\t\tuser_agent = node.user_agent\n\t\t\t\t} or nil,\n\t\t\t\thttpupgradeSettings = (node.transport == \"httpupgrade\") and {\n\t\t\t\t\tpath = node.httpupgrade_path or \"/\",\n\t\t\t\t\thost = node.httpupgrade_host,\n\t\t\t\t\theaders =  node.user_agent and {\n\t\t\t\t\t\t[\"User-Agent\"] = node.user_agent\n\t\t\t\t\t} or nil\n\t\t\t\t} or nil,\n\t\t\t\txhttpSettings = (node.transport == \"xhttp\") and {\n\t\t\t\t\tmode = node.xhttp_mode or \"auto\",\n\t\t\t\t\tpath = node.xhttp_path or \"/\",\n\t\t\t\t\thost = node.xhttp_host,\n\t\t\t\t\textra = (function()\n\t\t\t\t\t\tlocal extra = {}\n\t\t\t\t\t\tif node.xhttp_extra then\n\t\t\t\t\t\t\tlocal ok, parsed = pcall(jsonc.parse, api.base64Decode(node.xhttp_extra))\n\t\t\t\t\t\t\tif ok and type(parsed) == \"table\" then\n\t\t\t\t\t\t\t\textra = parsed.extra or parsed\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\t-- Handling User-Agent\n\t\t\t\t\t\tif node.user_agent and node.user_agent ~= \"\" then\n\t\t\t\t\t\t\textra.headers = extra.headers or {}\n\t\t\t\t\t\t\tif not extra.headers[\"User-Agent\"] and not extra.headers[\"user-agent\"] then\n\t\t\t\t\t\t\t\textra.headers[\"User-Agent\"] = node.user_agent\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\treturn api.cleanEmptyTables(extra)\n\t\t\t\t\tend)()\n\t\t\t\t} or nil,\n\t\t\t\thysteriaSettings = (node.transport == \"hysteria\") and {\n\t\t\t\t\tversion = 2,\n\t\t\t\t\tauth = node.hysteria2_auth_password\n\t\t\t\t} or nil,\n\t\t\t\tfinalmask = (function()\n\t\t\t\t\tlocal finalmask = {}\n\t\t\t\t\tlocal TP = node.transport\n\t\t\t\t\tif TP == \"mkcp\" then\n\t\t\t\t\t\tlocal map = {none = \"none\", srtp = \"header-srtp\", utp = \"header-utp\", [\"wechat-video\"] = \"header-wechat\",\n\t\t\t\t\t\t\tdtls = \"header-dtls\", wireguard = \"header-wireguard\", dns = \"header-dns\"}\n\t\t\t\t\t\tlocal udp = {}\n\t\t\t\t\t\tif node.mkcp_guise and node.mkcp_guise ~= \"none\" then\n\t\t\t\t\t\t\tlocal g = { type = map[node.mkcp_guise] }\n\t\t\t\t\t\t\tif node.mkcp_guise == \"dns\" and node.mkcp_domain and node.mkcp_domain ~= \"\" then\n\t\t\t\t\t\t\t\tg.settings = { domain = node.mkcp_domain }\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tudp[#udp+1] = g\n\t\t\t\t\t\tend\n\t\t\t\t\t\tlocal c = { type = (node.mkcp_seed and node.mkcp_seed ~= \"\") and \"mkcp-aes128gcm\" or \"mkcp-original\" }\n\t\t\t\t\t\tif node.mkcp_seed and node.mkcp_seed ~= \"\" then\n\t\t\t\t\t\t\tc.settings = { password = node.mkcp_seed }\n\t\t\t\t\t\tend\n\t\t\t\t\t\tudp[#udp+1] = c\n\t\t\t\t\t\tfinalmask.udp = udp\n\t\t\t\t\telseif TP == \"hysteria\" then\n\t\t\t\t\t\tif node.hysteria2_obfs_type and node.hysteria2_obfs_type ~= \"\" then\n\t\t\t\t\t\t\tfinalmask.udp = {{\n\t\t\t\t\t\t\t\ttype = node.hysteria2_obfs_type,\n\t\t\t\t\t\t\t\tsettings = node.hysteria2_obfs_password and {\n\t\t\t\t\t\t\t\t\tpassword = node.hysteria2_obfs_password\n\t\t\t\t\t\t\t\t} or nil\n\t\t\t\t\t\t\t}}\n\t\t\t\t\t\tend\n\t\t\t\t\t\tlocal up = tonumber(node.hysteria2_up_mbps) or 0\n\t\t\t\t\t\tlocal down = tonumber(node.hysteria2_down_mbps) or 0\n\t\t\t\t\t\tfinalmask.quicParams = {\n\t\t\t\t\t\t\tcongestion = (up <= 0 and down <= 0) and \"bbr\" or \"brutal\",\n\t\t\t\t\t\t\tbrutalUp = up > 0 and (up .. \"mbps\") or nil,\n\t\t\t\t\t\t\tbrutalDown = down > 0 and (down .. \"mbps\") or nil,\n\t\t\t\t\t\t\tudpHop = (node.hysteria2_hop) and {\n\t\t\t\t\t\t\t\tports = string.gsub(node.hysteria2_hop, \":\", \"-\"),\n\t\t\t\t\t\t\t\tinterval = (function(v)\n\t\t\t\t\t\t\t\t\tif not v then return 30 end\n\t\t\t\t\t\t\t\t\tif v:find(\"-\", 1, true) then\n\t\t\t\t\t\t\t\t\t\tlocal min, max = v:match(\"^(%d+)%-(%d+)$\")\n\t\t\t\t\t\t\t\t\t\tmin = tonumber(min)\n\t\t\t\t\t\t\t\t\t\tmax = tonumber(max)\n\t\t\t\t\t\t\t\t\t\tif min and max then\n\t\t\t\t\t\t\t\t\t\t\tmin = (min >= 5) and min or 5\n\t\t\t\t\t\t\t\t\t\t\tmax = (max >= min) and max or min\n\t\t\t\t\t\t\t\t\t\t\treturn min .. \"-\" .. max\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\t\treturn 30\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\tv = tonumber((v or \"30\"):match(\"^%d+\"))\n\t\t\t\t\t\t\t\t\treturn (v and v >= 5) and v or 30\n\t\t\t\t\t\t\t\tend)(node.hysteria2_hop_interval)\n\t\t\t\t\t\t\t} or nil,\n\t\t\t\t\t\t\tmaxIdleTimeout = (function(t)\n\t\t\t\t\t\t\t\tt = tonumber(tostring(t or \"30\"):match(\"^%d+\"))\n\t\t\t\t\t\t\t\treturn (t and t >= 4 and t <= 120) and t or 30\n\t\t\t\t\t\t\tend)(node.hysteria2_idle_timeout),\n\t\t\t\t\t\t\tkeepAlivePeriod = (function(t)\n\t\t\t\t\t\t\t\tt = tonumber(tostring(t or \"0\"):match(\"^%d+\"))\n\t\t\t\t\t\t\t\treturn (t and t >= 2 and t <= 60) and t or nil\n\t\t\t\t\t\t\tend)(node.hysteria2_keep_alive_period),\n\t\t\t\t\t\t\tdisablePathMTUDiscovery = tonumber(node.hysteria2_disable_mtu_discovery) == 1\n\t\t\t\t\t\t}\n\t\t\t\t\tend\n\t\t\t\t\tif fragment and fragment_table and ({raw=1, ws=1, httpupgrade=1, grpc=1, xhttp=1})[TP] then\n\t\t\t\t\t\tfinalmask.tcp = finalmask.tcp or {}\n\t\t\t\t\t\tfinalmask.tcp[#finalmask.tcp+1] = api.clone(fragment_table)\n\t\t\t\t\tend\n\t\t\t\t\tif noise and noise_table and (TP == \"mkcp\" or (TP == \"xhttp\" and node.alpn == \"h3\")) then\n\t\t\t\t\t\tfinalmask.udp = finalmask.udp or {}\n\t\t\t\t\t\tfinalmask.udp[#finalmask.udp+1] = api.clone(noise_table)\n\t\t\t\t\tend\n\t\t\t\t\tif node.finalmask and node.finalmask ~= \"\" then\n\t\t\t\t\t\tlocal ok, fm = pcall(jsonc.parse, api.base64Decode(node.finalmask))\n\t\t\t\t\t\tif ok and type(fm) == \"table\" then\n\t\t\t\t\t\t\tfinalmask = fm\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\treturn api.cleanEmptyTables(finalmask)\n\t\t\t\tend)()\n\t\t\t} or nil,\n\t\t\tsettings = {\n\t\t\t\tvnext = (node.protocol == \"vmess\" or node.protocol == \"vless\") and {\n\t\t\t\t\t{\n\t\t\t\t\t\taddress = node.address,\n\t\t\t\t\t\tport = tonumber(node.port),\n\t\t\t\t\t\tusers = {\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tid = node.uuid,\n\t\t\t\t\t\t\t\tlevel = 0,\n\t\t\t\t\t\t\t\tsecurity = (node.protocol == \"vmess\") and node.security or nil,\n\t\t\t\t\t\t\t\ttestpre = (node.protocol == \"vless\") and tonumber(node.preconns) or nil,\n\t\t\t\t\t\t\t\tencryption = (node.protocol == \"vless\") and ((node.encryption and node.encryption ~= \"\") and node.encryption or \"none\") or nil,\n\t\t\t\t\t\t\t\tflow = (node.protocol == \"vless\"\n\t\t\t\t\t\t\t\t\tand (node.tls == \"1\" or (node.encryption and node.encryption ~= \"\" and node.encryption ~= \"none\"))\n\t\t\t\t\t\t\t\t\tand node.flow and node.flow ~= \"\") and node.flow or nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} or nil,\n\t\t\t\tservers = (node.protocol == \"socks\" or node.protocol == \"http\" or node.protocol == \"shadowsocks\" or node.protocol == \"trojan\") and {\n\t\t\t\t\t{\n\t\t\t\t\t\taddress = node.address,\n\t\t\t\t\t\tport = tonumber(node.port),\n\t\t\t\t\t\tmethod = (node.method == \"chacha20-ietf-poly1305\" and \"chacha20-poly1305\") or\n\t\t\t\t\t\t\t(node.method == \"xchacha20-ietf-poly1305\" and \"xchacha20-poly1305\") or\n\t\t\t\t\t\t\t(node.method ~= \"\" and node.method) or nil,\n\t\t\t\t\t\tivCheck = (node.protocol == \"shadowsocks\") and node.iv_check == \"1\" or nil,\n\t\t\t\t\t\tuot = (node.protocol == \"shadowsocks\") and node.uot == \"1\" or nil,\n\t\t\t\t\t\tpassword = node.password or \"\",\n\t\t\t\t\t\tusers = (node.username and node.password) and {\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tuser = node.username,\n\t\t\t\t\t\t\t\tpass = node.password\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} or nil\n\t\t\t\t\t}\n\t\t\t\t} or nil,\n\t\t\t\taddress = (node.protocol == \"wireguard\" and node.wireguard_local_address) or (node.protocol == \"hysteria\" and node.address) or nil,\n\t\t\t\tsecretKey = (node.protocol == \"wireguard\") and node.wireguard_secret_key or nil,\n\t\t\t\tpeers = (node.protocol == \"wireguard\") and {\n\t\t\t\t\t{\n\t\t\t\t\t\tpublicKey = node.wireguard_public_key,\n\t\t\t\t\t\tendpoint = node.address .. \":\" .. node.port,\n\t\t\t\t\t\tpreSharedKey = node.wireguard_preSharedKey,\n\t\t\t\t\t\tkeepAlive = node.wireguard_keepAlive and tonumber(node.wireguard_keepAlive) or nil\n\t\t\t\t\t}\n\t\t\t\t} or nil,\n\t\t\t\tmtu = (node.protocol == \"wireguard\" and node.wireguard_mtu) and tonumber(node.wireguard_mtu) or nil,\n\t\t\t\treserved = (node.protocol == \"wireguard\" and node.wireguard_reserved) and node.wireguard_reserved or nil,\n\t\t\t\tport = (node.protocol == \"hysteria\" and node.port) and tonumber(node.port) or nil,\n\t\t\t\tversion = node.protocol == \"hysteria\" and 2 or nil\n\t\t\t}\n\t\t}\n\n\t\tif node.protocol == \"wireguard\" then\n\t\t\tresult.settings.kernelMode = false\n\t\tend\n\n\t\tlocal alpn = {}\n\t\tif node.alpn and node.alpn ~= \"default\" then\n\t\t\tstring.gsub(node.alpn, '[^' .. \",\" .. ']+', function(w)\n\t\t\t\ttable.insert(alpn, w)\n\t\t\tend)\n\t\tend\n\t\tif alpn and #alpn > 0 then\n\t\t\tif result.streamSettings.tlsSettings then\n\t\t\t\tresult.streamSettings.tlsSettings.alpn = alpn\n\t\t\tend\n\t\tend\n\n\t\tif api.datatypes.hostname(node.address) and node.domain_resolver and (node.domain_resolver_dns or node.domain_resolver_dns_https) then\n\t\t\tlocal dns_tag = node_id .. \"_dns\"\n\t\t\tlocal dns_proto = node.domain_resolver\n\t\t\tlocal config_address\n\t\t\tlocal config_port\n\t\t\tif dns_proto == \"https\" then\n\t\t\t\tlocal _a = api.parseURL(node.domain_resolver_dns_https)\n\t\t\t\tif _a then\n\t\t\t\t\tconfig_address = node.domain_resolver_dns_https\n\t\t\t\t\tif _a.port then\n\t\t\t\t\t\tconfig_port = _a.port\n\t\t\t\t\telse\n\t\t\t\t\t\tconfig_port = 443\n\t\t\t\t\tend\n\t\t\t\t\tif _a.hostname then\n\t\t\t\t\t\tif api.datatypes.hostname(_a.hostname) then\n\t\t\t\t\t\t\tGLOBAL.DNS_HOSTNAME[_a.hostname] = true\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tlocal server_address = node.domain_resolver_dns\n\t\t\t\tlocal config_port = 53\n\t\t\t\tlocal split = api.split(server_address, \":\")\n\t\t\t\tif #split > 1 then\n\t\t\t\t\tserver_address = split[1]\n\t\t\t\t\tconfig_port = tonumber(split[#split])\n\t\t\t\tend\n\t\t\t\tconfig_address = server_address\n\t\t\t\tif dns_proto == \"tcp\" then\n\t\t\t\t\tconfig_address = dns_proto .. \"://\" .. server_address .. \":\" .. config_port\n\t\t\t\tend\n\t\t\tend\n\t\t\tGLOBAL.DNS_SERVER[node_id] = {\n\t\t\t\ttag = dns_tag,\n\t\t\t\tqueryStrategy = node.domain_strategy or \"UseIP\",\n\t\t\t\taddress = config_address,\n\t\t\t\tport = config_port,\n\t\t\t\tdomains = {\"full:\" .. node.address},\n\t\t\t\tfinalQuery = true,\n\t\t\t\tdisableCache = false,\n\t\t\t\tserveStale = true,\n\t\t\t}\n\t\tend\n\n\tend\n\treturn result\nend\n\nfunction gen_config_server(node)\n\tlocal settings = nil\n\tlocal routing = nil\n\tlocal outbounds = {\n\t\t{ protocol = \"freedom\", tag = \"direct\", settings = { finalRules = {{ action = \"allow\" }}}}, { protocol = \"blackhole\", tag = \"blocked\" }\n\t}\n\n\tif node.protocol == \"vmess\" or node.protocol == \"vless\" then\n\t\tif node.uuid then\n\t\t\tlocal clients = {}\n\t\t\tfor i = 1, #node.uuid do\n\t\t\t\tclients[i] = {\n\t\t\t\t\tid = node.uuid[i],\n\t\t\t\t\tflow = (node.protocol == \"vless\"\n\t\t\t\t\tand (node.tls == \"1\" or (node.decryption and node.decryption ~= \"\" and node.decryption ~= \"none\")) \n\t\t\t\t\tand node.flow and node.flow ~= \"\") and node.flow or nil\n\t\t\t\t}\n\t\t\tend\n\t\t\tsettings = {\n\t\t\t\tclients = clients,\n\t\t\t\tdecryption = (node.protocol == \"vless\") and ((node.decryption and node.decryption ~= \"\") and node.decryption or \"none\") or nil\n\t\t\t}\n\t\tend\n\telseif node.protocol == \"socks\" then\n\t\tsettings = {\n\t\t\tudp = (\"1\" == node.udp_forward) and true or false,\n\t\t\tauth = (\"1\" == node.auth) and \"password\" or \"noauth\",\n\t\t\taccounts = (\"1\" == node.auth) and {\n\t\t\t\t{\n\t\t\t\t\tuser = node.username,\n\t\t\t\t\tpass = node.password\n\t\t\t\t}\n\t\t\t} or nil\n\t\t}\n\telseif node.protocol == \"http\" then\n\t\tsettings = {\n\t\t\tallowTransparent = false,\n\t\t\taccounts = (\"1\" == node.auth) and {\n\t\t\t\t{\n\t\t\t\t\tuser = node.username,\n\t\t\t\t\tpass = node.password\n\t\t\t\t}\n\t\t\t} or nil\n\t\t}\n\t\tnode.transport = \"tcp\"\n\t\tnode.tcp_guise = \"none\"\n\telseif node.protocol == \"shadowsocks\" then\n\t\tsettings = {\n\t\t\tmethod = node.method,\n\t\t\tpassword = node.password,\n\t\t\tivCheck = (\"1\" == node.iv_check) and true or false,\n\t\t\tnetwork = node.ss_network or \"TCP,UDP\"\n\t\t}\n\telseif node.protocol == \"trojan\" then\n\t\tif node.uuid then\n\t\t\tlocal clients = {}\n\t\t\tfor i = 1, #node.uuid do\n\t\t\t\tclients[i] = {\n\t\t\t\t\tpassword = node.uuid[i]\n\t\t\t\t}\n\t\t\tend\n\t\t\tsettings = {\n\t\t\t\tclients = clients\n\t\t\t}\n\t\tend\n\telseif node.protocol == \"hysteria2\" then\n\t\tsettings = {\n\t\t\tversion = 2,\n\t\t\tclients = node.hysteria2_auth_password and {\n\t\t\t\t{ auth = node.hysteria2_auth_password }\n\t\t\t}\n\t\t}\n\telseif node.protocol == \"dokodemo-door\" then\n\t\tsettings = {\n\t\t\tnetwork = node.d_protocol,\n\t\t\taddress = node.d_address,\n\t\t\tport = tonumber(node.d_port)\n\t\t}\n\tend\n\n\tif node.fallback and node.fallback == \"1\" then\n\t\tlocal fallbacks = {}\n\t\tfor i = 1, #node.fallback_list do\n\t\t\tlocal fallbackStr = node.fallback_list[i]\n\t\t\tif fallbackStr then\n\t\t\t\tlocal tmp = {}\n\t\t\t\tstring.gsub(fallbackStr, '[^,]+', function(w)\n\t\t\t\t\ttable.insert(tmp, w)\n\t\t\t\tend)\n\t\t\t\tlocal dest = tmp[1] or \"\"\n\t\t\t\tlocal path = tmp[2]\n\t\t\t\tlocal xver = tonumber(tmp[3])\n\t\t\t\tif not dest:find(\"%.\") then\n\t\t\t\t\tdest = tonumber(dest)\n\t\t\t\tend\n\t\t\t\tfallbacks[i] = {\n\t\t\t\t\tpath = path,\n\t\t\t\t\tdest = dest,\n\t\t\t\t\txver = xver\n\t\t\t\t}\n\t\t\tend\n\t\tend\n\t\tsettings.fallbacks = fallbacks\n\tend\n\n\trouting = {\n\t\tdomainStrategy = \"IPOnDemand\",\n\t\trules = {\n\t\t\t{\n\t\t\t\tip = {\"10.0.0.0/8\", \"172.16.0.0/12\", \"192.168.0.0/16\"},\n\t\t\t\toutboundTag = (node.accept_lan == nil or node.accept_lan == \"0\") and \"blocked\" or \"direct\"\n\t\t\t}\n\t\t}\n\t}\n\n\tif node.outbound_node then\n\t\tlocal outbound = nil\n\t\tif node.outbound_node == \"_iface\" and node.outbound_node_iface then\n\t\t\toutbound = {\n\t\t\t\tprotocol = \"freedom\",\n\t\t\t\ttag = \"outbound\",\n\t\t\t\tstreamSettings = {\n\t\t\t\t\tsockopt = {\n\t\t\t\t\t\tmark = 255,\n\t\t\t\t\t\tinterface = node.outbound_node_iface\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\tsettings = {\n\t\t\t\t\tfinalRules = {{ action = \"allow\" }}\n\t\t\t\t}\n\t\t\t}\n\t\t\tsys.call(string.format(\"mkdir -p %s && touch %s/%s\", api.TMP_IFACE_PATH, api.TMP_IFACE_PATH, node.outbound_node_iface))\n\t\telse\n\t\t\tlocal outbound_node_t = uci:get_all(\"passwall2\", node.outbound_node)\n\t\t\tif node.outbound_node == \"_socks\" or node.outbound_node == \"_http\" then\n\t\t\t\toutbound_node_t = {\n\t\t\t\t\ttype = node.type,\n\t\t\t\t\tprotocol = node.outbound_node:gsub(\"_\", \"\"),\n\t\t\t\t\ttransport = \"tcp\",\n\t\t\t\t\taddress = node.outbound_node_address,\n\t\t\t\t\tport = node.outbound_node_port,\n\t\t\t\t\tusername = (node.outbound_node_username and node.outbound_node_username ~= \"\") and node.outbound_node_username or nil,\n\t\t\t\t\tpassword = (node.outbound_node_password and node.outbound_node_password ~= \"\") and node.outbound_node_password or nil,\n\t\t\t\t}\n\t\t\tend\n\t\t\toutbound = require(\"luci.passwall2.util_xray\").gen_outbound(nil, outbound_node_t, \"outbound\")\n\t\tend\n\t\tif outbound then\n\t\t\ttable.insert(outbounds, 1, outbound)\n\t\tend\n\tend\n\n\tif node.protocol == \"hysteria2\" then\n\t\tnode.protocol = \"hysteria\"\n\t\tnode.transport = \"hysteria\"\n\t\tnode.tls = \"1\"\n\tend\n\n\tlocal config = {\n\t\tlog = {\n\t\t\tloglevel = (\"1\" == node.log) and node.loglevel or \"none\"\n\t\t},\n\t\tinbounds = {\n\t\t\t{\n\t\t\t\tlisten = (node.bind_local == \"1\") and \"127.0.0.1\" or nil,\n\t\t\t\tport = tonumber(node.port),\n\t\t\t\tprotocol = node.protocol,\n\t\t\t\tsettings = settings,\n\t\t\t\tstreamSettings = {\n\t\t\t\t\tnetwork = node.transport,\n\t\t\t\t\tsecurity = \"none\",\n\t\t\t\t\ttlsSettings = (\"1\" == node.tls) and {\n\t\t\t\t\t\tdisableSystemRoot = false,\n\t\t\t\t\t\tcertificates = {\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tcertificateFile = node.tls_certificateFile,\n\t\t\t\t\t\t\t\tkeyFile = node.tls_keyFile\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\techServerKeys = (node.ech == \"1\") and node.ech_key or nil\n\t\t\t\t\t} or nil,\n\t\t\t\t\trawSettings = (node.transport == \"raw\" or node.transport == \"tcp\") and {\n\t\t\t\t\t\theader = {\n\t\t\t\t\t\t\ttype = node.tcp_guise,\n\t\t\t\t\t\t\trequest = (node.tcp_guise == \"http\") and {\n\t\t\t\t\t\t\t\tpath = node.tcp_guise_http_path and (function()\n\t\t\t\t\t\t\t\t\t\tlocal t, r = node.tcp_guise_http_path, {}\n\t\t\t\t\t\t\t\t\t\tfor _, v in ipairs(t) do\n\t\t\t\t\t\t\t\t\t\t\tr[#r + 1] = (v == \"\" and \"/\" or v)\n\t\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\t\treturn r\n\t\t\t\t\t\t\t\t\tend)() or {\"/\"},\n\t\t\t\t\t\t\t\theaders = {\n\t\t\t\t\t\t\t\t\tHost = node.tcp_guise_http_host or {}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} or nil\n\t\t\t\t\t\t}\n\t\t\t\t\t} or nil,\n\t\t\t\t\tkcpSettings = (node.transport == \"mkcp\") and {\n\t\t\t\t\t\tmtu = (node.mkcp_mtu and node.mkcp_mtu ~= \"\") and tonumber(node.mkcp_mtu) or 1350,\n\t\t\t\t\t\ttti = 50,\n\t\t\t\t\t\tuplinkCapacity = 12,\n\t\t\t\t\t\tdownlinkCapacity = 100,\n\t\t\t\t\t\tCwndMultiplier = 1,\n\t\t\t\t\t\tMaxSendingWindow = 2 * 1024 * 1024\n\t\t\t\t\t} or nil,\n\t\t\t\t\twsSettings = (node.transport == \"ws\") and {\n\t\t\t\t\t\thost = node.ws_host or nil,\n\t\t\t\t\t\tpath = node.ws_path\n\t\t\t\t\t} or nil,\n\t\t\t\t\tgrpcSettings = (node.transport == \"grpc\" and node.grpc_serviceName) and {\n\t\t\t\t\t\tserviceName = node.grpc_serviceName\n\t\t\t\t\t} or nil,\n\t\t\t\t\thttpupgradeSettings = (node.transport == \"httpupgrade\") and {\n\t\t\t\t\t\tpath = node.httpupgrade_path or \"/\",\n\t\t\t\t\t\thost = node.httpupgrade_host\n\t\t\t\t\t} or nil,\n\t\t\t\t\txhttpSettings = (node.transport == \"xhttp\") and {\n\t\t\t\t\t\tpath = node.xhttp_path or \"/\",\n\t\t\t\t\t\thost = node.xhttp_host,\n\t\t\t\t\t\tmaxUploadSize = node.xhttp_maxuploadsize,\n\t\t\t\t\t\tmaxConcurrentUploads = node.xhttp_maxconcurrentuploads\n\t\t\t\t\t} or nil,\n\t\t\t\t\thysteriaSettings = (node.transport == \"hysteria\") and {\n\t\t\t\t\t\tversion = 2\n\t\t\t\t\t} or nil,\n\t\t\t\t\tfinalmask = (function()\n\t\t\t\t\t\tlocal finalmask = {}\n\t\t\t\t\t\tif node.transport == \"mkcp\" then\n\t\t\t\t\t\t\tlocal map = {none = \"none\", srtp = \"header-srtp\", utp = \"header-utp\", [\"wechat-video\"] = \"header-wechat\",\n\t\t\t\t\t\t\t\tdtls = \"header-dtls\", wireguard = \"header-wireguard\", dns = \"header-dns\"}\n\t\t\t\t\t\t\tlocal udp = {}\n\t\t\t\t\t\t\tif node.mkcp_guise and node.mkcp_guise ~= \"none\" then\n\t\t\t\t\t\t\t\tlocal g = { type = map[node.mkcp_guise] }\n\t\t\t\t\t\t\t\tif node.mkcp_guise == \"dns\" and node.mkcp_domain and node.mkcp_domain ~= \"\" then\n\t\t\t\t\t\t\t\t\tg.settings = { domain = node.mkcp_domain }\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tudp[#udp+1] = g\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tlocal c = { type = (node.mkcp_seed and node.mkcp_seed ~= \"\") and \"mkcp-aes128gcm\" or \"mkcp-original\" }\n\t\t\t\t\t\t\tif node.mkcp_seed and node.mkcp_seed ~= \"\" then\n\t\t\t\t\t\t\t\tc.settings = { password = node.mkcp_seed }\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tudp[#udp+1] = c\n\t\t\t\t\t\t\tfinalmask.udp = udp\n\t\t\t\t\t\telseif node.transport == \"hysteria\" then\n\t\t\t\t\t\t\tif node.hysteria2_obfs_type and node.hysteria2_obfs_type ~= \"\" then\n\t\t\t\t\t\t\t\tfinalmask.udp = {{\n\t\t\t\t\t\t\t\t\ttype = node.hysteria2_obfs_type,\n\t\t\t\t\t\t\t\t\tsettings = node.hysteria2_obfs_password and {\n\t\t\t\t\t\t\t\t\t\tpassword = node.hysteria2_obfs_password\n\t\t\t\t\t\t\t\t\t} or nil\n\t\t\t\t\t\t\t\t}}\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tlocal ignore = tonumber(node.hysteria2_ignore_client_bandwidth) == 1\n\t\t\t\t\t\t\tlocal up = (not ignore) and tonumber(node.hysteria2_up_mbps) or 0\n\t\t\t\t\t\t\tlocal down = (not ignore) and tonumber(node.hysteria2_down_mbps) or 0\n\t\t\t\t\t\t\tfinalmask.quicParams = {\n\t\t\t\t\t\t\t\tcongestion = (up <= 0 and down <= 0) and \"bbr\" or \"brutal\",\n\t\t\t\t\t\t\t\tbrutalUp = up > 0 and (up .. \"mbps\") or nil,\n\t\t\t\t\t\t\t\tbrutalDown = down > 0 and (down .. \"mbps\") or nil\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif node.finalmask and node.finalmask ~= \"\" then\n\t\t\t\t\t\t\tlocal ok, fm = pcall(jsonc.parse, api.base64Decode(node.finalmask))\n\t\t\t\t\t\t\tif ok and type(fm) == \"table\" then\n\t\t\t\t\t\t\t\tfinalmask = fm\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\treturn api.cleanEmptyTables(finalmask)\n\t\t\t\t\tend)(),\n\t\t\t\t\tsockopt = {\n\t\t\t\t\t\ttcpFastOpen = (node.tcp_fast_open == \"1\") and true or nil,\n\t\t\t\t\t\tacceptProxyProtocol = (node.acceptProxyProtocol and node.acceptProxyProtocol == \"1\") and true or false\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t},\n\t\toutbounds = outbounds,\n\t\trouting = routing\n\t}\n\n\tlocal alpn = {}\n\tif node.alpn then\n\t\tstring.gsub(node.alpn, '[^' .. \",\" .. ']+', function(w)\n\t\t\ttable.insert(alpn, w)\n\t\tend)\n\tend\n\tif alpn and #alpn > 0 then\n\t\tif config.inbounds[1].streamSettings.tlsSettings then\n\t\t\tconfig.inbounds[1].streamSettings.tlsSettings.alpn = alpn\n\t\tend\n\tend\n\n\tif \"1\" == node.tls then\n\t\tconfig.inbounds[1].streamSettings.security = \"tls\"\n\t\tif \"1\" == node.reality then\n\t\t\tconfig.inbounds[1].streamSettings.tlsSettings = nil\n\t\t\tconfig.inbounds[1].streamSettings.security = \"reality\"\n\t\t\tconfig.inbounds[1].streamSettings.realitySettings = {\n\t\t\t\tshow = false,\n\t\t\t\tdest = node.reality_dest,\n\t\t\t\tserverNames = node.reality_serverNames or {},\n\t\t\t\tprivateKey = node.reality_private_key,\n\t\t\t\tshortIds = node.reality_shortId or \"\",\n\t\t\t\tmldsa65Seed = (node.use_mldsa65Seed == \"1\") and node.reality_mldsa65Seed or nil\n\t\t\t} or nil\n\t\tend\n\tend\n\n\tfor index, value in ipairs(config.outbounds) do\n\t\tfor k, v in pairs(config.outbounds[index]) do\n\t\t\tif k:find(\"_\") == 1 then\n\t\t\t\tconfig.outbounds[index][k] = nil\n\t\t\tend\n\t\tend\n\tend\n\n\treturn config\nend\n\nfunction gen_config(var)\n\tlocal flag = var[\"flag\"]\n\tlocal loglevel = var[\"loglevel\"] or \"warning\"\n\tlocal node_id = var[\"node\"]\n\tlocal server_host = var[\"server_host\"]\n\tlocal server_port = var[\"server_port\"]\n\tlocal tcp_proxy_way = var[\"tcp_proxy_way\"]\n\tlocal redir_port = var[\"redir_port\"]\n\tlocal local_socks_address = var[\"local_socks_address\"] or \"0.0.0.0\"\n\tlocal local_socks_port = var[\"local_socks_port\"]\n\tlocal local_socks_username = var[\"local_socks_username\"]\n\tlocal local_socks_password = var[\"local_socks_password\"]\n\tlocal local_http_address = var[\"local_http_address\"] or \"0.0.0.0\"\n\tlocal local_http_port = var[\"local_http_port\"]\n\tlocal local_http_username = var[\"local_http_username\"]\n\tlocal local_http_password = var[\"local_http_password\"]\n\tlocal dns_listen_port = var[\"dns_listen_port\"]\n\tlocal direct_dns_udp_server = var[\"direct_dns_udp_server\"]\n\tlocal direct_dns_udp_port = var[\"direct_dns_udp_port\"]\n\tlocal direct_dns_query_strategy = var[\"direct_dns_query_strategy\"]\n\tlocal direct_ipset = var[\"direct_ipset\"]\n\tlocal direct_nftset = var[\"direct_nftset\"]\n\tlocal remote_dns_udp_server = var[\"remote_dns_udp_server\"]\n\tlocal remote_dns_udp_port = var[\"remote_dns_udp_port\"]\n\tlocal remote_dns_tcp_server = var[\"remote_dns_tcp_server\"]\n\tlocal remote_dns_tcp_port = var[\"remote_dns_tcp_port\"]\n\tlocal remote_dns_doh_url = var[\"remote_dns_doh_url\"]\n\tlocal remote_dns_doh_host = var[\"remote_dns_doh_host\"]\n\tlocal remote_dns_doh_ip = var[\"remote_dns_doh_ip\"]\n\tlocal remote_dns_doh_port = var[\"remote_dns_doh_port\"]\n\tlocal remote_dns_fake = var[\"remote_dns_fake\"]\n\tlocal remote_dns_query_strategy = var[\"remote_dns_query_strategy\"]\n\tlocal remote_dns_detour = var[\"remote_dns_detour\"]\n\tlocal dns_cache = var[\"dns_cache\"]\n\tlocal no_run = var[\"no_run\"]\n\n\tlocal dns_domain_rules = {}\n\tlocal dns = {}\n\tlocal fakedns = nil\n\tlocal inbounds = {}\n\tlocal outbounds = {}\n\tlocal routing = nil\n\tlocal observatory = nil\n\tlocal burstObservatory = nil\n \tlocal strategy = nil\n\tlocal COMMON = {}\n\n\tlocal CACHE_TEXT_FILE = CACHE_PATH .. \"/cache_\" .. flag .. \".txt\"\n\n\tlocal xray_settings = uci:get_all(appname, \"@global_xray[0]\") or {}\n\n\tif xray_settings.fragment == \"1\" then\n\t\tlocal delay = xray_settings.fragment_delay\n\t\tfragment_table = {\n\t\t\ttype = \"fragment\",\n\t\t\tsettings = {\n\t\t\t\tpackets = xray_settings.fragment_packets,\n\t\t\t\tlength = xray_settings.fragment_length,\n\t\t\t\tdelay = delay and (delay:find(\"-\", 1, true) and delay or tonumber(delay)) or nil,\n\t\t\t\tmaxSplit = xray_settings.fragment_maxSplit\n\t\t\t}\n\t\t}\n\tend\n\n\tif xray_settings.noise == \"1\" then\n\t\tlocal noises = {}\n\t\tuci:foreach(appname, \"xray_noise_packets\", function(n)\n\t\t\tif n.enabled == \"1\" then\n\t\t\t\tlocal noise = {\n\t\t\t\t\trand = (n.type == \"rand\" and n.packet) and (n.packet:find(\"-\", 1, true) and n.packet or tonumber(n.packet)) or nil,\n\t\t\t\t\ttype = (n.type ~= \"rand\") and n.type or nil,\n\t\t\t\t\tpacket = (n.type ~= \"rand\") and n.packet or nil,\n\t\t\t\t\tdelay = n.delay and (n.delay:find(\"-\", 1, true) and n.delay or tonumber(n.delay)) or nil\n\t\t\t\t}\n\t\t\t\ttable.insert(noises, noise)\n\t\t\tend\n\t\tend)\n\t\tnoise_table = #noises > 0 and {\n\t\t\ttype = \"noise\",\n\t\t\tsettings = { reset = 0, noise = noises }\n\t\t} or nil\n\tend\n\n\tlocal node = node_id and uci:get_all(appname, node_id) or nil\n\tlocal balancers = {}\n\tlocal rules = {}\n\n\tif local_socks_port then\n\t\tlocal inbound = {\n\t\t\ttag = \"socks-in\",\n\t\t\tlisten = local_socks_address,\n\t\t\tport = tonumber(local_socks_port),\n\t\t\tprotocol = \"socks\",\n\t\t\tsettings = {auth = \"noauth\", udp = true},\n\t\t\tsniffing = {\n\t\t\t\tenabled = xray_settings.sniffing_override_dest == \"1\" or node.protocol == \"_shunt\"\n\t\t\t}\n\t\t}\n\t\tif inbound.sniffing.enabled == true then\n\t\t\tinbound.sniffing.destOverride = {\"http\", \"tls\", \"quic\"}\n\t\t\tinbound.sniffing.routeOnly = xray_settings.sniffing_override_dest ~= \"1\" or nil\n\t\t\tinbound.sniffing.domainsExcluded = xray_settings.sniffing_override_dest == \"1\" and get_domain_excluded() or nil\n\t\tend\n\t\tif local_socks_username and local_socks_password and local_socks_username ~= \"\" and local_socks_password ~= \"\" then\n\t\t\tinbound.settings.auth = \"password\"\n\t\t\tinbound.settings.accounts = {\n\t\t\t\t{\n\t\t\t\t\tuser = local_socks_username,\n\t\t\t\t\tpass = local_socks_password\n\t\t\t\t}\n\t\t\t}\n\t\tend\n\t\ttable.insert(inbounds, inbound)\n\tend\n\n\tif local_http_port then\n\t\tlocal inbound = {\n\t\t\tlisten = local_http_address,\n\t\t\tport = tonumber(local_http_port),\n\t\t\tprotocol = \"http\",\n\t\t\tsettings = {allowTransparent = false}\n\t\t}\n\t\tif local_http_username and local_http_password and local_http_username ~= \"\" and local_http_password ~= \"\" then\n\t\t\tinbound.settings.accounts = {\n\t\t\t\t{\n\t\t\t\t\tuser = local_http_username,\n\t\t\t\t\tpass = local_http_password\n\t\t\t\t}\n\t\t\t}\n\t\tend\n\t\ttable.insert(inbounds, inbound)\n\tend\n\n\tfunction gen_socks_config_node(node_id, socks_id, remarks)\n\t\tif node_id then\n\t\t\tsocks_id = node_id:sub(1 + #\"Socks_\")\n\t\tend\n\t\tlocal result\n\t\tlocal socks_node = uci:get_all(appname, socks_id) or nil\n\t\tif socks_node then\n\t\t\tif not remarks then\n\t\t\t\tremarks = socks_node.port\n\t\t\tend\n\t\t\tresult = {\n\t\t\t\t[\".name\"] = \"Socksid_\" .. socks_id,\n\t\t\t\tremarks = remarks,\n\t\t\t\ttype = \"Xray\",\n\t\t\t\tprotocol = \"socks\",\n\t\t\t\taddress = \"127.0.0.1\",\n\t\t\t\tport = socks_node.port,\n\t\t\t\ttransport = \"tcp\",\n\t\t\t\tstream_security = \"none\"\n\t\t\t}\n\t\tend\n\t\treturn result\n\tend\n\n\tfunction get_node_by_id(node_id)\n\t\tif not node_id or node_id == \"\" or node_id == \"nil\" then return nil end\n\t\tif node_id:find(\"Socks_\") then\n\t\t\treturn gen_socks_config_node(node_id)\n\t\telse\n\t\t\treturn uci:get_all(appname, node_id)\n\t\tend\n\tend\n\n\tlocal nodes_list = {}\n\tfunction get_balancer_batch_nodes(_node)\n\t\tif #nodes_list == 0 then\n\t\t\tfor k, e in ipairs(api.get_valid_nodes()) do\n\t\t\t\tif e.node_type == \"normal\" and (not e.chain_proxy or e.chain_proxy == \"\") then\n\t\t\t\t\tnodes_list[#nodes_list + 1] = {\n\t\t\t\t\t\tid = e[\".name\"],\n\t\t\t\t\t\tremarks = e[\"remarks\"],\n\t\t\t\t\t\tgroup = e[\"group\"]\n\t\t\t\t\t}\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif not _node.node_group or _node.node_group == \"\" then return {} end\n\t\tlocal nodes = {}\n\t\tfor g in _node.node_group:gmatch(\"%S+\") do\n\t\t\tg = api.UrlDecode(g)\n\t\t\tfor k, v in pairs(nodes_list) do\n\t\t\t\tlocal gn = (v.group and v.group ~= \"\") and v.group or \"default\"\n\t\t\t\tif gn:lower() == g:lower() and api.match_node_rule(v.remarks, _node.node_match_rule) then\n\t\t\t\t\tnodes[#nodes + 1] = v.id\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\treturn nodes\n\tend\n\n\tfunction gen_loopback(outbound_tag, loopback_dst)\n\t\tif not outbound_tag or outbound_tag == \"\" then return nil end\n\t\tlocal inbound_tag = loopback_dst and \"lo-to-\" .. loopback_dst or outbound_tag .. \"-lo\"\n\t\tlocal loopback_outbound = {\n\t\t\tprotocol = \"loopback\",\n\t\t\ttag = outbound_tag,\n\t\t\tsettings = { inboundTag = inbound_tag }\n\t\t}\n\t\tlocal insert_index = #outbounds + 1\n\t\tif outbound_tag == \"default\" then\n\t\t\tinsert_index = 1\n\t\tend\n\t\ttable.insert(outbounds, insert_index, loopback_outbound)\n\t\treturn loopback_outbound\n\tend\n\n\tfunction gen_balancer(_node, loopback_tag)\n\t\tlocal balancer_id = _node[\".name\"]\n\t\tlocal balancer_tag = \"balancer-\" .. balancer_id\n\t\tlocal loopback_dst = balancer_id -- route destination for the loopback outbound\n\t\tif not loopback_tag or loopback_tag == \"\" then loopback_tag = balancer_id end\n\t\t-- existing balancer\n\t\tfor _, v in ipairs(balancers) do\n\t\t\tif v.tag == balancer_tag then\n\t\t\t\tlocal loopback_outbound = gen_loopback(loopback_tag, loopback_dst)\n\t\t\t\treturn balancer_tag, loopback_outbound\n\t\t\tend\n\t\tend\n\t\t-- new balancer\n\t\tlocal blc_nodes\n\t\tif _node.node_add_mode and _node.node_add_mode == \"batch\" then\n\t\t\tblc_nodes = get_balancer_batch_nodes(_node)\n\t\telse\n\t\t\tblc_nodes = _node.balancing_node\n\t\tend\n\t\tlocal valid_nodes = {}\n\t\tfor i = 1, #(blc_nodes or {}) do\n\t\t\tlocal blc_node_id = blc_nodes[i]\n\t\t\tlocal blc_node_tag = \"blc-\" .. blc_node_id\n\t\t\tlocal is_new_blc_node = true\n\t\t\tfor _, outbound in ipairs(outbounds) do\n\t\t\t\tif string.sub(outbound.tag, 1, #blc_node_tag) == blc_node_tag then\n\t\t\t\t\tis_new_blc_node = false\n\t\t\t\t\tvalid_nodes[#valid_nodes + 1] = outbound.tag\n\t\t\t\t\tbreak\n\t\t\t\tend\n\t\t\tend\n\t\t\tif is_new_blc_node then\n\t\t\t\tlocal outboundTag = gen_outbound_get_tag(flag, blc_node_id, blc_node_tag, { fragment = xray_settings.fragment == \"1\" or nil, noise = xray_settings.noise == \"1\" or nil, run_socks_instance = not no_run })\n\t\t\t\tif outboundTag then\n\t\t\t\t\tvalid_nodes[#valid_nodes + 1] = outboundTag\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif #valid_nodes == 0 then return nil end\n\n\t\t-- fallback node\n\t\tlocal fallback_node_tag = nil\n\t\tlocal fallback_node_id = _node.fallback_node\n\t\tif not fallback_node_id or fallback_node_id == \"\" then fallback_node_id = nil end\n\t\tif fallback_node_id then\n\t\t\tlocal is_new_node = true\n\t\t\tfor _, outbound in ipairs(outbounds) do\n\t\t\t\tif string.sub(outbound.tag, 1, #fallback_node_id) == fallback_node_id then\n\t\t\t\t\tis_new_node = false\n\t\t\t\t\tfallback_node_tag = outbound.tag\n\t\t\t\t\tbreak\n\t\t\t\tend\n\t\t\tend\n\t\t\tif is_new_node then\n\t\t\t\tlocal fallback_node = get_node_by_id(fallback_node_id)\n\t\t\t\tif fallback_node then\n\t\t\t\t\tif fallback_node.protocol ~= \"_balancing\" then\n\t\t\t\t\t\tlocal outboundTag = gen_outbound_get_tag(flag, fallback_node, fallback_node_id, { fragment = xray_settings.fragment == \"1\" or nil, noise = xray_settings.noise == \"1\" or nil, run_socks_instance = not no_run })\n\t\t\t\t\t\tif outboundTag then\n\t\t\t\t\t\t\tfallback_node_tag = outboundTag\n\t\t\t\t\t\tend\n\t\t\t\t\telse\n\t\t\t\t\t\tif gen_balancer(fallback_node) then\n\t\t\t\t\t\t\tfallback_node_tag = fallback_node_id\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif _node.balancingStrategy == \"leastLoad\" then\n\t\t\tstrategy = {\n\t\t\t\ttype = _node.balancingStrategy,\n\t\t\t\tsettings = {\n\t\t\t\t\texpected = _node.expected and tonumber(_node.expected) and tonumber(_node.expected) or 2,\n\t\t\t\t\tmaxRTT = \"1s\"\n\t\t\t\t}\n\t\t\t}\n\t\telse\n\t\t\tstrategy = { type = _node.balancingStrategy or \"random\" }\n\t\tend\n\t\ttable.insert(balancers, {\n\t\t\ttag = balancer_tag,\n\t\t\tselector = api.clone(valid_nodes),\n\t\t\tfallbackTag = fallback_node_tag,\n\t\t\tstrategy = strategy\n\t\t})\n\t\tif _node.balancingStrategy == \"leastPing\" or _node.balancingStrategy == \"leastLoad\" or fallback_node_tag then\n\t\t\tlocal t = api.format_go_time(_node.probeInterval)\n\t\t\tif t == \"0s\" then\n\t\t\t\tt = \"60s\"\n\t\t\telseif not t:find(\"[hm]\") and tonumber(t:match(\"%d+\")) < 10 then\n\t\t\t\tt = \"10s\"\n\t\t\tend\n\t\t\tif _node.balancingStrategy == \"leastLoad\" then\n\t\t\t\tburstObservatory = burstObservatory or {\n\t\t\t\t\tsubjectSelector = { \"blc-\" },\n\t\t\t\t\tpingConfig = {\n\t\t\t\t\t\tdestination = _node.useCustomProbeUrl and _node.probeUrl or nil,\n\t\t\t\t\t\tinterval = t,\n\t\t\t\t\t\tsampling = 3,\n\t\t\t\t\t\ttimeout = \"5s\"\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\telse\n\t\t\t\tobservatory = observatory or {\n\t\t\t\t\tsubjectSelector = { \"blc-\" },\n\t\t\t\t\tprobeUrl = _node.useCustomProbeUrl and _node.probeUrl or nil,\n\t\t\t\t\tprobeInterval = t,\n\t\t\t\t\tenableConcurrency = true\n\t\t\t\t}\n\t\t\tend\n\t\tend\n\t\tlocal loopback_outbound = gen_loopback(loopback_tag, loopback_dst)\n\t\tlocal inbound_tag = loopback_outbound.settings.inboundTag\n\t\ttable.insert(rules, { inboundTag = { inbound_tag }, balancerTag = balancer_tag })\n\t\treturn balancer_tag, loopback_outbound\n\tend\n\t\n\tfunction set_outbound_detour(node, outbound, outbounds_table)\n\t\tif not node or not outbound or not outbounds_table then return nil end\n\t\tlocal default_outTag = outbound.tag\n\t\tlocal last_insert_outbound\n\n\t\tif node.chain_proxy == \"1\" and node.preproxy_node then\n\t\t\tif outbound[\"_flag_proxy_tag\"] then\n\t\t\t\t--Ignore\n\t\t\telse\n\t\t\t\tlocal preproxy_node = get_node_by_id(node.preproxy_node)\n\t\t\t\tif preproxy_node then\n\t\t\t\t\tlocal preproxy_outbound, exist\n\t\t\t\t\tif preproxy_node.protocol == \"_balancing\" then\n\t\t\t\t\t\tlocal balancer_tag, loopback_outbound = gen_balancer(preproxy_node)\n\t\t\t\t\t\tif loopback_outbound then\n\t\t\t\t\t\t\tpreproxy_outbound = loopback_outbound\n\t\t\t\t\t\t\texist = true\n\t\t\t\t\t\tend\n\t\t\t\t\telse\n\t\t\t\t\t\tpreproxy_outbound = gen_outbound(node[\".name\"], preproxy_node)\n\t\t\t\t\tend\n\t\t\t\t\tif preproxy_outbound then\n\t\t\t\t\t\toutbound.tag = preproxy_outbound.tag .. \" -> \" .. outbound.tag\n\t\t\t\t\t\toutbound.proxySettings = {\n\t\t\t\t\t\t\ttag = preproxy_outbound.tag,\n\t\t\t\t\t\t\ttransportLayer = true\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif not exist then\n\t\t\t\t\t\t\tlast_insert_outbound = preproxy_outbound\n\t\t\t\t\t\tend\n\t\t\t\t\t\tdefault_outTag = outbound.tag\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif node.chain_proxy == \"2\" and node.to_node then\n\t\t\tlocal to_node = get_node_by_id(node.to_node)\n\t\t\tif to_node then\n\t\t\t\t-- Landing Node not support use special node.\n\t\t\t\tif to_node.protocol and to_node.protocol:find(\"^_\") then\n\t\t\t\t\tto_node = nil\n\t\t\t\tend\n\t\t\tend\n\t\t\tif to_node then\n\t\t\t\tlocal to_outbound\n\t\t\t\tif to_node.type ~= \"Xray\" then\n\t\t\t\t\tlocal in_tag = \"inbound_\" .. to_node[\".name\"] .. \"_\" .. tostring(outbound.tag)\n\t\t\t\t\tlocal new_port = api.get_new_port()\n\t\t\t\t\ttable.insert(inbounds, {\n\t\t\t\t\t\ttag = in_tag,\n\t\t\t\t\t\tlisten = \"127.0.0.1\",\n\t\t\t\t\t\tport = new_port,\n\t\t\t\t\t\tprotocol = \"dokodemo-door\",\n\t\t\t\t\t\tsettings = {network = \"tcp,udp\", address = to_node.address, port = tonumber(to_node.port)}\n\t\t\t\t\t})\n\t\t\t\t\tif to_node.tls_serverName == nil then\n\t\t\t\t\t\tto_node.tls_serverName = to_node.address\n\t\t\t\t\tend\n\t\t\t\t\tto_node.address = \"127.0.0.1\"\n\t\t\t\t\tto_node.port = new_port\n\t\t\t\t\ttable.insert(rules, 1, {\n\t\t\t\t\t\tinboundTag = {in_tag},\n\t\t\t\t\t\toutboundTag = outbound.tag\n\t\t\t\t\t})\n\t\t\t\t\tto_outbound = gen_outbound(node[\".name\"], to_node, to_node[\".name\"], {\n\t\t\t\t\t\ttag = to_node[\".name\"],\n\t\t\t\t\t\trun_socks_instance = not no_run\n\t\t\t\t\t})\n\t\t\t\telse\n\t\t\t\t\tto_outbound = gen_outbound(node[\".name\"], to_node)\n\t\t\t\tend\n\t\t\t\tif to_outbound then\n\t\t\t\t\tto_outbound.tag = outbound.tag .. \" -> \" .. to_outbound.tag\n\t\t\t\t\tif to_node.type == \"Xray\" then\n\t\t\t\t\t\tto_outbound.proxySettings = {\n\t\t\t\t\t\t\ttag = outbound.tag,\n\t\t\t\t\t\t\ttransportLayer = true\n\t\t\t\t\t\t}\n\t\t\t\t\tend\n\t\t\t\t\ttable.insert(outbounds_table, to_outbound)\n\t\t\t\t\tdefault_outTag = to_outbound.tag\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\treturn default_outTag, last_insert_outbound\n\tend\n\n\tfunction gen_outbound_get_tag(flag, node_id, tag, proxy_table)\n\t\tif not node_id or node_id == \"\" or node_id == \"nil\" then return nil end\n\t\tlocal node\n\t\tif type(node_id) == \"string\" then\n\t\t\tnode = get_node_by_id(node_id)\n\t\telseif type(node_id) == \"table\" then\n\t\t\tnode = node_id\n\t\tend\n\t\tif not tag then tag = node[\".name\"] end\n\t\tif node then\n\t\t\tif proxy_table.chain_proxy == \"1\" or proxy_table.chain_proxy == \"2\" then\n\t\t\t\tnode.chain_proxy = proxy_table.chain_proxy\n\t\t\t\tnode.preproxy_node = proxy_table.chain_proxy == \"1\" and proxy_table.preproxy_node\n\t\t\t\tnode.to_node = proxy_table.chain_proxy == \"2\" and proxy_table.to_node\n\t\t\t\tproxy_table.chain_proxy = nil\n\t\t\t\tproxy_table.preproxy_node = nil\n\t\t\t\tproxy_table.to_node = nil\n\t\t\tend\n\t\t\tif tag == \"default\" then\n\t\t\t\tif default_node_address and default_node_port then\n\t\t\t\t\tnode.address = default_node_address\n\t\t\t\t\tnode.port = default_node_port\n\t\t\t\tend\n\t\t\tend\n\t\t\tlocal outbound, has_add_outbound\n\t\t\tfor _, _outbound in ipairs(outbounds) do\n\t\t\t\t-- Avoid generating duplicate nested processes\n\t\t\t\tif _outbound[\"_flag_proxy_tag\"] and _outbound[\"_flag_proxy_tag\"]:find(\"socks <- \" .. node[\".name\"], 1, true) then\n\t\t\t\t\toutbound = api.clone(_outbound)\n\t\t\t\t\toutbound.tag = tag\n\t\t\t\t\tbreak\n\t\t\t\tend\n\t\t\tend\n\t\t\tif node.protocol == \"_balancing\" then\n\t\t\t\tlocal balancer_tag, loopback_outbound = gen_balancer(node, tag)\n\t\t\t\tif loopback_outbound then\n\t\t\t\t\toutbound = loopback_outbound\n\t\t\t\t\tnode[\".name\"] = outbound.tag\n\t\t\t\t\thas_add_outbound = true\n\t\t\t\tend\n\t\t\telseif node.protocol == \"_iface\" then\n\t\t\t\tif node.iface then\n\t\t\t\t\toutbound = {\n\t\t\t\t\t\ttag = tag,\n\t\t\t\t\t\tprotocol = \"freedom\",\n\t\t\t\t\t\tstreamSettings = {\n\t\t\t\t\t\t\tsockopt = {\n\t\t\t\t\t\t\t\tmark = 255,\n\t\t\t\t\t\t\t\tinterface = node.iface\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t},\n\t\t\t\t\t\tsettings = {\n\t\t\t\t\t\t\tfinalRules = {{ action = \"allow\" }}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsys.call(string.format(\"mkdir -p %s && touch %s/%s\", api.TMP_IFACE_PATH, api.TMP_IFACE_PATH, node.iface))\n\t\t\t\tend\n\t\t\tend\n\t\t\tif not outbound then\n\t\t\t\toutbound = gen_outbound(flag, node, tag, proxy_table)\n\t\t\tend\n\t\t\tif outbound then\n\t\t\t\tlocal default_outbound_tag, last_insert_outbound = set_outbound_detour(node, outbound, outbounds)\n\t\t\t\tif not has_add_outbound then\n\t\t\t\t\tlocal insert_index = #outbounds + 1\n\t\t\t\t\tif tag == \"default\" then\n\t\t\t\t\t\tinsert_index = 1\n\t\t\t\t\tend\n\t\t\t\t\ttable.insert(outbounds, insert_index, outbound)\n\t\t\t\tend\n\t\t\t\tif last_insert_outbound then\n\t\t\t\t\ttable.insert(outbounds, last_insert_outbound)\n\t\t\t\tend\n\t\t\t\treturn default_outbound_tag\n\t\t\tend\n\t\tend\n\tend\n\n\tif node then\n\t\tif node.protocol ~= \"_shunt\" then\n\t\t\t-- create shunt logic\n\t\t\tlocal tmp_node = {\n\t\t\t\tremarks = node.remarks,\n\t\t\t\ttype = \"Xray\",\n\t\t\t\tprotocol = \"_shunt\",\n\t\t\t\tdefault_node = node[\".name\"],\n\t\t\t}\n\t\t\ttmp_node.fakedns = remote_dns_fake\n\t\t\ttmp_node.default_fakedns = remote_dns_fake\n\t\t\tnode = tmp_node\n\t\tend\n\n\t\tif server_host and server_port then\n\t\t\tdefault_node_address = server_host\n\t\t\tdefault_node_port = server_port\n\t\tend\n\n\t\tif node.protocol == \"_shunt\" then\n\t\t\tinner_fakedns = node.fakedns or \"0\"\n\n\t\t\tlocal function gen_shunt_node(rule_name, _node_id)\n\t\t\t\tif not rule_name then return nil end\n\t\t\t\tif not _node_id then _node_id = node[rule_name] end\n\t\t\t\tif _node_id == \"_direct\" then\n\t\t\t\t\treturn \"direct\"\n\t\t\t\telseif _node_id == \"_blackhole\" then\n\t\t\t\t\treturn \"blackhole\"\n\t\t\t\telseif _node_id == \"_default\" and rule_name ~= \"default\" then\n\t\t\t\t\treturn \"default\"\n\t\t\t\telseif _node_id then\n\t\t\t\t\tlocal proxy_table = {\n\t\t\t\t\t\tfragment = xray_settings.fragment == \"1\",\n\t\t\t\t\t\tnoise = xray_settings.noise == \"1\",\n\t\t\t\t\t\trun_socks_instance = not no_run,\n\t\t\t\t\t}\n\t\t\t\t\tlocal preproxy_node_id = node[rule_name .. \"_proxy_tag\"]\n\t\t\t\t\tif preproxy_node_id == _node_id then preproxy_node_id = nil end\n\t\t\t\t\tif preproxy_node_id then\n\t\t\t\t\t\tproxy_table.chain_proxy = \"2\"\n\t\t\t\t\t\tproxy_table.to_node = _node_id\n\t\t\t\t\t\treturn gen_outbound_get_tag(flag, preproxy_node_id, rule_name, proxy_table)\n\t\t\t\t\telse\n\t\t\t\t\t\treturn gen_outbound_get_tag(flag, _node_id, rule_name, proxy_table)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\treturn nil\n\t\t\tend\n\n\t\t\t--default_node\n\t\t\tlocal default_node_id = node.default_node or \"_direct\"\n\t\t\tlocal default_outboundTag = gen_shunt_node(\"default\", default_node_id)\n\t\t\tCOMMON.default_outbound_tag = default_outboundTag\n\n\t\t\tif inner_fakedns == \"1\" and node[\"default_fakedns\"] == \"1\" then\n\t\t\t\tremote_dns_fake = true\n\t\t\tend\n\n\t\t\t--shunt rule\n\t\t\tuci:foreach(appname, \"shunt_rules\", function(e)\n\t\t\t\tlocal outboundTag = gen_shunt_node(e[\".name\"])\n\t\t\t\tif outboundTag and e.remarks then\n\t\t\t\t\tif outboundTag == \"default\" then\n\t\t\t\t\t\toutboundTag = default_outboundTag\n\t\t\t\t\tend\n\t\t\t\t\tlocal protocols = nil\n\t\t\t\t\tif e[\"protocol\"] and e[\"protocol\"] ~= \"\" then\n\t\t\t\t\t\tprotocols = {}\n\t\t\t\t\t\tstring.gsub(e[\"protocol\"], '[^' .. \" \" .. ']+', function(w)\n\t\t\t\t\t\t\ttable.insert(protocols, w)\n\t\t\t\t\t\tend)\n\t\t\t\t\tend\n\t\t\t\t\tlocal inboundTag = nil\n\t\t\t\t\tif e[\"inbound\"] and e[\"inbound\"] ~= \"\" then\n\t\t\t\t\t\tinboundTag = {}\n\t\t\t\t\t\tif e[\"inbound\"]:find(\"tproxy\") then\n\t\t\t\t\t\t\tif redir_port then\n\t\t\t\t\t\t\t\ttable.insert(inboundTag, \"tcp_redir\")\n\t\t\t\t\t\t\t\ttable.insert(inboundTag, \"udp_redir\")\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif e[\"inbound\"]:find(\"socks\") then\n\t\t\t\t\t\t\tif local_socks_port then\n\t\t\t\t\t\t\t\ttable.insert(inboundTag, \"socks-in\")\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tlocal domains = nil\n\t\t\t\t\tif e.domain_list then\n\t\t\t\t\t\tlocal domain_table = {\n\t\t\t\t\t\t\tshunt_rule_name = e[\".name\"],\n\t\t\t\t\t\t\toutboundTag = outboundTag,\n\t\t\t\t\t\t\tdomain = {},\n\t\t\t\t\t\t\tfakedns = nil,\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdomains = {}\n\t\t\t\t\t\tstring.gsub(e.domain_list, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\t\t\t\tif w:find(\"#\") == 1 then return end\n\t\t\t\t\t\t\tif w:find(\"rule-set:\", 1, true) == 1 or w:find(\"rs:\") == 1 then return end\n\t\t\t\t\t\t\ttable.insert(domains, w)\n\t\t\t\t\t\t\ttable.insert(domain_table.domain, w)\n\t\t\t\t\t\tend)\n\t\t\t\t\t\tif inner_fakedns == \"1\" and node[e[\".name\"] .. \"_fakedns\"] == \"1\" and #domains > 0 then\n\t\t\t\t\t\t\tdomain_table.fakedns = true\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif outboundTag then\n\t\t\t\t\t\t\ttable.insert(dns_domain_rules, api.clone(domain_table))\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif #domains == 0 then\n\t\t\t\t\t\t\tdomains = nil\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tlocal ip = nil\n\t\t\t\t\tif e.ip_list then\n\t\t\t\t\t\tip = {}\n\t\t\t\t\t\tstring.gsub(e.ip_list, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\t\t\t\tif w:find(\"#\") == 1 then return end\n\t\t\t\t\t\t\tif w:find(\"rule-set:\", 1, true) == 1 or w:find(\"rs:\") == 1 then return end\n\t\t\t\t\t\t\ttable.insert(ip, w)\n\t\t\t\t\t\tend)\n\t\t\t\t\t\tif #ip == 0 then ip = nil end\n\t\t\t\t\tend\n\t\t\t\t\tlocal source = nil\n\t\t\t\t\tif e.source then\n\t\t\t\t\t\tsource = {}\n\t\t\t\t\t\tstring.gsub(e.source, '[^' .. \" \" .. ']+', function(w)\n\t\t\t\t\t\t\ttable.insert(source, w)\n\t\t\t\t\t\tend)\n\t\t\t\t\tend\n\t\t\t\t\tlocal rule = {\n\t\t\t\t\t\truleTag = e.remarks,\n\t\t\t\t\t\tinboundTag = inboundTag,\n\t\t\t\t\t\toutboundTag = outboundTag,\n\t\t\t\t\t\tnetwork = e[\"network\"] or \"tcp,udp\",\n\t\t\t\t\t\tsource = source,\n\t\t\t\t\t\t--sourcePort = e[\"sourcePort\"] ~= \"\" and e[\"sourcePort\"] or nil,\n\t\t\t\t\t\tport = e[\"port\"] ~= \"\" and e[\"port\"] or nil,\n\t\t\t\t\t\tprotocol = protocols\n\t\t\t\t\t}\n\t\t\t\t\tif domains then\n\t\t\t\t\t\tlocal _rule = api.clone(rule)\n\t\t\t\t\t\t_rule.ruleTag = _rule.ruleTag .. \" Domains\"\n\t\t\t\t\t\t_rule.domains = domains\n\t\t\t\t\t\ttable.insert(rules, _rule)\n\t\t\t\t\tend\n\t\t\t\t\tif ip then\n\t\t\t\t\t\tlocal _rule = api.clone(rule)\n\t\t\t\t\t\t_rule.ruleTag = _rule.ruleTag .. \" IP\"\n\t\t\t\t\t\t_rule.ip = ip\n\t\t\t\t\t\ttable.insert(rules, _rule)\n\t\t\t\t\tend\n\t\t\t\t\tif not domains and not ip then\n\t\t\t\t\t\ttable.insert(rules, rule)\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend)\n\n\t\t\tif default_outboundTag then\n\t\t\t\tlocal rule = {\n\t\t\t\t\truleTag = \"default\",\n\t\t\t\t\toutboundTag = default_outboundTag,\n\t\t\t\t}\n\t\t\t\tif node.domainStrategy == \"IPIfNonMatch\" then\n\t\t\t\t\trule.ip = { \"0.0.0.0/0\", \"::/0\" }\n\t\t\t\telse\n\t\t\t\t\trule.network = \"tcp,udp\"\n\t\t\t\tend\n\t\t\t\ttable.insert(rules, rule)\n\t\t\tend\n\n\t\t\trouting = {\n\t\t\t\tdomainStrategy = node.domainStrategy or \"AsIs\",\n\t\t\t\tdomainMatcher = node.domainMatcher or \"hybrid\",\n\t\t\t\tbalancers = #balancers > 0 and balancers or nil,\n\t\t\t\trules = rules\n\t\t\t}\n\t\tend\n\tend\n\n\tlocal dns_servers = {}\n\tlocal direct_dns_tag = \"dns-in-direct\"\n\tlocal remote_dns_tag = \"dns-in-remote\"\n\tlocal remote_fakedns_tag = \"dns-in-remote-fakedns\"\n\tlocal default_dns_tag = \"dns-in-default\"\n\n\tdns = {\n\t\ttag = \"dns-global\",\n\t\thosts = {},\n\t\tdisableCache = (dns_cache and dns_cache == \"0\") and true or false,\n\t\tdisableFallback = true,\n\t\tdisableFallbackIfMatch = true,\n\t\tservers = {},\n\t\tqueryStrategy = \"UseIP\"\n\t}\n\n\tfor i, v in pairs(GLOBAL.DNS_SERVER) do\n\t\ttable.insert(dns_servers, {\n\t\t\tserver = v,\n\t\t\toutboundTag = \"direct\"\n\t\t})\n\tend\n\n\tlocal _direct_dns = nil\n\tif direct_dns_udp_server then\n\t\t_direct_dns = {\n\t\t\ttag = direct_dns_tag,\n\t\t\taddress = direct_dns_udp_server,\n\t\t\tport = tonumber(direct_dns_udp_port) or 53,\n\t\t\tqueryStrategy = (direct_dns_query_strategy and direct_dns_query_strategy ~= \"\") and direct_dns_query_strategy or \"UseIP\"\n\t\t}\n\n\t\tif _direct_dns.address then\n\t\t\ttable.insert(dns_servers, {\n\t\t\t\toutboundTag = \"direct\",\n\t\t\t\tserver = _direct_dns\n\t\t\t})\n\t\tend\n\tend\n\n\tif next(GLOBAL.DNS_HOSTNAME) then\n\t\tlocal hostname = {}\n\t\tfor line, _ in pairs(GLOBAL.DNS_HOSTNAME) do\n\t\t\ttable.insert(hostname, line)\n\t\tend\n\t\tlocal new_dns_server\n\t\tif _direct_dns then\n\t\t\tnew_dns_server = api.clone(_direct_dns)\n\t\telse\n\t\t\tnew_dns_server = {\n\t\t\t\taddress = \"localhost\"\n\t\t\t}\n\t\tend\n\t\tnew_dns_server.tag = \"dns-in-bootstrap\"\n\t\tnew_dns_server.domains = hostname\n\t\ttable.insert(dns_servers, #dns_servers - 1, {\n\t\t\toutboundTag = \"direct\",\n\t\t\tserver = new_dns_server\n\t\t})\n\tend\n\n\tif dns_listen_port then\n\t\tlocal _remote_dns_proto = \"tcp\"\n\n\t\tif not routing then\n\t\t\trouting = {\n\t\t\t\tdomainStrategy = \"IPOnDemand\",\n\t\t\t\trules = {}\n\t\t\t}\n\t\tend\n\t\n\t\tlocal dns_host = \"\"\n\t\tif flag == \"global\" then\n\t\t\tdns_host = uci:get(appname, \"@global[0]\", \"dns_hosts\") or \"\"\n\t\telse\n\t\t\tflag = flag:gsub(\"acl_\", \"\")\n\t\t\tlocal dns_hosts_mode = uci:get(appname, flag, \"dns_hosts_mode\") or \"default\"\n\t\t\tif dns_hosts_mode == \"default\" then\n\t\t\t\tdns_host = uci:get(appname, \"@global[0]\", \"dns_hosts\") or \"\"\n\t\t\telseif dns_hosts_mode == \"disable\" then\n\t\t\t\tdns_host = \"\"\n\t\t\telseif dns_hosts_mode == \"custom\" then\n\t\t\t\tdns_host = uci:get(appname, flag, \"dns_hosts\") or \"\"\n\t\t\tend\n\t\tend\n\t\tif #dns_host > 0 then\n\t\t\tstring.gsub(dns_host, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\tlocal host = sys.exec(string.format(\"echo -n $(echo %s | awk -F ' ' '{print $1}')\", w))\n\t\t\t\tlocal key = sys.exec(string.format(\"echo -n $(echo %s | awk -F ' ' '{print $2}')\", w))\n\t\t\t\tif host ~= \"\" and key ~= \"\" then\n\t\t\t\t\tdns.hosts[host] = key\n\t\t\t\tend\n\t\t\tend)\n\t\tend\n\n\t\tlocal _remote_dns_ip = nil\n\t\n\t\tlocal _remote_dns = {\n\t\t\ttag = remote_dns_tag,\n\t\t\tqueryStrategy = (remote_dns_query_strategy and remote_dns_query_strategy ~= \"\") and remote_dns_query_strategy or \"UseIPv4\"\n\t\t}\n\n\t\tif remote_dns_udp_server then\n\t\t\t_remote_dns.address = remote_dns_udp_server\n\t\t\t_remote_dns.port = tonumber(remote_dns_udp_port) or 53\n\t\t\t_remote_dns_proto = \"udp\"\n\t\t\t_remote_dns_ip = remote_dns_udp_server\n\t\tend\n\n\t\tif remote_dns_tcp_server then\n\t\t\t_remote_dns.address = \"tcp://\" .. remote_dns_tcp_server .. \":\" .. tonumber(remote_dns_tcp_port) or 53\n\t\t\t_remote_dns.port = tonumber(remote_dns_tcp_port) or 53\n\t\t\t_remote_dns_proto = \"tcp\"\n\t\t\t_remote_dns_ip = remote_dns_tcp_server\n\t\tend\n\n\t\tif remote_dns_doh_url and remote_dns_doh_host then\n\t\t\tif remote_dns_doh_ip and remote_dns_doh_host ~= remote_dns_doh_ip and not api.is_ip(remote_dns_doh_host) then\n\t\t\t\tdns.hosts[remote_dns_doh_host] = remote_dns_doh_ip\n\t\t\tend\n\t\t\t_remote_dns.address = remote_dns_doh_url\n\t\t\t_remote_dns.port = tonumber(remote_dns_doh_port) or 443\n\t\t\t_remote_dns_ip = remote_dns_doh_ip\n\t\tend\n\n\t\tif _remote_dns.address then\n\t\t\ttable.insert(dns_servers, {\n\t\t\t\toutboundTag = remote_dns_detour == \"direct\" and \"direct\" or nil,\n\t\t\t\tserver = _remote_dns\n\t\t\t})\n\t\tend\n\n\t\tlocal _remote_fakedns = nil\n\t\tif remote_dns_fake or inner_fakedns == \"1\" then\n\t\t\tfakedns = {}\n\t\t\tlocal fakedns4 = {\n\t\t\t\tipPool = \"198.18.0.0/16\",\n\t\t\t\tpoolSize = 65535\n\t\t\t}\n\t\t\tlocal fakedns6 = {\n\t\t\t\tipPool = \"fc00::/18\",\n\t\t\t\tpoolSize = 65535\n\t\t\t}\n\t\t\tif remote_dns_query_strategy == \"UseIP\" then\n\t\t\t\ttable.insert(fakedns, fakedns4)\n\t\t\t\ttable.insert(fakedns, fakedns6)\n\t\t\telseif remote_dns_query_strategy == \"UseIPv4\" then\n\t\t\t\ttable.insert(fakedns, fakedns4)\n\t\t\telseif remote_dns_query_strategy == \"UseIPv6\" then\n\t\t\t\ttable.insert(fakedns, fakedns6)\n\t\t\tend\n\t\t\t_remote_fakedns = {\n\t\t\t\ttag = remote_fakedns_tag,\n\t\t\t\taddress = \"fakedns\",\n\t\t\t}\n\t\t\ttable.insert(dns_servers, {\n\t\t\t\tserver = _remote_fakedns\n\t\t\t})\n\t\tend\n\n\t\tif direct_dns_udp_server then\n\t\t\tlocal domain = {}\n\t\t\tlocal nodes_domain_text = sys.exec('uci show passwall2 | grep \".address=\" | cut -d \"\\'\" -f 2 | grep \"[a-zA-Z]$\" | sort -u')\n\t\t\tstring.gsub(nodes_domain_text, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\tw = (w or \"\"):lower()\n\t\t\t\ttable.insert(domain, \"full:\" .. w)\n\t\t\tend)\n\t\t\tif #domain > 0 then\n\t\t\t\ttable.insert(dns.servers, 1, {\n\t\t\t\t\ttag = \"dns-in-vpslist\",\n\t\t\t\t\taddress = \"localhost\",\n\t\t\t\t\tdomains = domain,\n\t\t\t\t\tfinalQuery = true,\n\t\t\t\t\tdisableCache = false,\n\t\t\t\t\tserveStale = true,\n\t\t\t\t})\n\t\t\tend\n\t\tend\n\t\n\t\tif dns_listen_port then\n\t\t\ttable.insert(inbounds, {\n\t\t\t\tlisten = \"127.0.0.1\",\n\t\t\t\tport = tonumber(dns_listen_port),\n\t\t\t\tprotocol = \"dokodemo-door\",\n\t\t\t\ttag = \"dns-in\",\n\t\t\t\tsettings = {\n\t\t\t\t\taddress = \"0.0.0.0\",\n\t\t\t\t\tnetwork = \"tcp,udp\"\n\t\t\t\t}\n\t\t\t})\n\t\t\tlocal direct_type_dns = {\n\t\t\t\tsettings = {\n\t\t\t\t\taddress = direct_dns_udp_server,\n\t\t\t\t\tport = tonumber(direct_dns_udp_port) or 53,\n\t\t\t\t\tnetwork = \"udp\",\n\t\t\t\t\tnonIPQuery = (api.compare_versions(xray_version, \"<\", \"26.4.25\")) and \"skip\" or nil, -- Todo is to remove it\n\t\t\t\t\tblockTypes = (api.compare_versions(xray_version, \"<\", \"26.4.25\")) and { 65 } or nil,  -- Todo is to remove it\n\t\t\t\t\trules = (api.compare_versions(xray_version, \">\", \"26.4.17\")) and {\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tqtype = \"1,28\",\n\t\t\t\t\t\t\taction = \"hijack\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tqtype = 65,\n\t\t\t\t\t\t\taction = \"reject\",\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taction = \"direct\"\n\t\t\t\t\t\t}\n\t\t\t\t\t} or nil\n\t\t\t\t},\n\t\t\t\tproxySettings = {\n\t\t\t\t\ttag = \"direct\"\n\t\t\t\t}\n\t\t\t}\n\t\t\tlocal remote_type_dns = {\n\t\t\t\tsettings = {\n\t\t\t\t\taddress = remote_dns_udp_server,\n\t\t\t\t\tport = tonumber(remote_dns_udp_port) or 53,\n\t\t\t\t\tnetwork = _remote_dns_proto or \"tcp\",\n\t\t\t\t\tnonIPQuery = (api.compare_versions(xray_version, \"<\", \"26.4.25\")) and \"reject\" or nil, -- Todo is to remove it\n\t\t\t\t\trules = (api.compare_versions(xray_version, \">\", \"26.4.17\")) and {\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tqtype = \"1,28\",\n\t\t\t\t\t\t\taction = \"hijack\"\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\taction = \"reject\"\n\t\t\t\t\t\t}\n\t\t\t\t\t} or nil\n\t\t\t\t}\n\t\t\t}\n\t\t\tlocal type_dns = direct_type_dns\n\t\t\ttable.insert(outbounds, {\n\t\t\t\ttag = \"dns-out\",\n\t\t\t\tprotocol = \"dns\",\n\t\t\t\tproxySettings = type_dns.proxySettings,\n\t\t\t\tsettings = type_dns.settings\n\t\t\t})\n\t\t\ttable.insert(routing.rules, 1, {\n\t\t\t\tinboundTag = {\n\t\t\t\t\t\"dns-in\"\n\t\t\t\t},\n\t\t\t\toutboundTag = \"dns-out\"\n\t\t\t})\n\t\tend\n\t\n\t\tlocal default_dns_tag_name = remote_dns_tag\n\t\tif not COMMON.default_outbound_tag or COMMON.default_outbound_tag == \"direct\" then\n\t\t\tdefault_dns_tag_name = direct_dns_tag\n\t\tend\n\t\n\t\tif dns_servers and #dns_servers > 0 then\n\t\t\t-- Default DNS logic\n\t\t\tlocal default_dns_server = nil\n\t\t\tfor index, value in ipairs(dns_servers) do\n\t\t\t\tif not default_dns_server and value.server.tag == default_dns_tag_name then\n\t\t\t\t\tdefault_dns_server = api.clone(value)\n\t\t\t\t\tdefault_dns_server.server.tag = default_dns_tag\n\t\t\t\t\tif value.server.tag == remote_dns_tag then\n\t\t\t\t\t\tif remote_dns_fake then\n\t\t\t\t\t\t\tdefault_dns_server.server = api.clone(_remote_fakedns)\n\t\t\t\t\t\t\tdefault_dns_server.server.tag = default_dns_tag\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tdefault_dns_server.outboundTag = value.outboundTag or COMMON.default_outbound_tag\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\ttable.insert(dns_servers, 1, default_dns_server)\n\t\t\t\t\tbreak\n\t\t\t\tend\n\t\t\tend\n\n\t\t\t-- Shunt rule DNS logic\n\t\t\tif dns_domain_rules and #dns_domain_rules > 0 then\n\t\t\t\tfor index, value in ipairs(dns_domain_rules) do\n\t\t\t\t\tif value.domain and value.outboundTag then\n\t\t\t\t\t\tlocal dns_server = nil\n\t\t\t\t\t\tlocal dns_outboundTag = value.outboundTag\n\t\t\t\t\t\tif value.dns_server then\n\t\t\t\t\t\t\tdns_server = api.clone(value.dns_server)\n\t\t\t\t\t\telseif value.outboundTag == \"direct\" then\n\t\t\t\t\t\t\tdns_server = api.clone(_direct_dns)\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tif value.fakedns then\n\t\t\t\t\t\t\t\tdns_server = api.clone(_remote_fakedns)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tdns_server = api.clone(_remote_dns)\n\t\t\t\t\t\t\t\tif remote_dns_detour == \"direct\" then\n\t\t\t\t\t\t\t\t\tdns_outboundTag = \"direct\"\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\tlocal dns_block_mode = \"host\"\n\t\t\t\t\t\tdns_block_mode = \"\"\n\t\t\t\t\t\tif dns_block_mode == \"host\" and dns_outboundTag == \"blackhole\" then\n\t\t\t\t\t\t\tfor d_i, d_k in ipairs(value.domain) do\n\t\t\t\t\t\t\t\tdns.hosts[d_k] = \"0.0.0.0\"\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tdns_server = nil\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif dns_server then\n\t\t\t\t\t\t\tdns_server.domains = value.domain\n\t\t\t\t\t\t\tif value.shunt_rule_name then\n\t\t\t\t\t\t\t\tdns_server.tag = \"dns-in-\" .. value.shunt_rule_name\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\ttable.insert(dns_servers, {\n\t\t\t\t\t\t\t\toutboundTag = dns_outboundTag,\n\t\t\t\t\t\t\t\tserver = dns_server\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tlocal default_rule_index = nil\n\t\tfor index, value in ipairs(routing.rules) do\n\t\t\tif value.ruleTag == \"default\" then\n\t\t\t\tdefault_rule_index = index\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\t\tif default_rule_index then\n\t\t\tlocal default_rule = api.clone(routing.rules[default_rule_index])\n\t\t\ttable.remove(routing.rules, default_rule_index)\n\t\t\ttable.insert(routing.rules, default_rule)\n\t\tend\n\n\t\tlocal content = flag .. node_id .. jsonc.stringify(routing.rules)\n\t\tif api.cacheFileCompareToLogic(CACHE_TEXT_FILE, content) == false then\n\t\t\t--clear ipset/nftset\n\t\t\tif direct_ipset then\n\t\t\t\tstring.gsub(direct_ipset, '[^' .. \",\" .. ']+', function(w)\n\t\t\t\t\tsys.call(\"ipset -q -F \" .. w)\n\t\t\t\tend)\n\t\t\t\tlocal ipset_prefix_name = \"passwall2_\" .. node_id .. \"_\"\n\t\t\t\tlocal ipset_list = sys.exec(\"ipset list | grep 'Name: ' | grep '\" .. ipset_prefix_name .. \"' | awk '{print $2}'\")\n\t\t\t\tstring.gsub(ipset_list, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\t\tsys.call(\"ipset -q -F \" .. w)\n\t\t\t\tend)\n\t\t\tend\n\t\t\tif direct_nftset then\n\t\t\t\tstring.gsub(direct_nftset, '[^' .. \",\" .. ']+', function(w)\n\t\t\t\t\tlocal split = api.split(w, \"#\")\n\t\t\t\t\tif #split > 3 then\n\t\t\t\t\t\tlocal ip_type = split[1]\n\t\t\t\t\t\tlocal family = split[2]\n\t\t\t\t\t\tlocal table_name = split[3]\n\t\t\t\t\t\tlocal set_name = split[4]\n\t\t\t\t\t\tsys.call(string.format(\"nft flush set %s %s %s 2>/dev/null\", family, table_name, set_name))\n\t\t\t\t\tend\n\t\t\t\tend)\n\t\t\t\tlocal family = \"inet\"\n\t\t\t\tlocal table_name = \"passwall2\"\n\t\t\t\tlocal nftset_prefix_name = \"passwall2_\" .. node_id .. \"_\"\n\t\t\t\tlocal nftset_list = sys.exec(\"nft -a list sets | grep -E '\" .. nftset_prefix_name .. \"' | awk -F 'set ' '{print $2}' | awk '{print $1}'\")\n\t\t\t\tstring.gsub(nftset_list, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\t\t\tsys.call(string.format(\"nft flush set %s %s %s 2>/dev/null\", family, table_name, w))\n\t\t\t\tend)\n\t\t\tend\n\t\tend\n\tend\n\n\tif not next(dns.hosts) then\n\t\tdns.hosts = nil\n\tend\n\n\tfor i = #dns_servers, 1, -1 do\n\t\tlocal value = dns_servers[i]\n\t\tif value.server.tag ~= direct_dns_tag and value.server.tag ~= remote_dns_tag then\n\t\t\t-- DNS rule must be at the front, prevents being matched by rules.\n\t\t\tif value.outboundTag and value.server.address ~= \"fakedns\" then\n\t\t\t\ttable.insert(routing.rules, 1, {\n\t\t\t\t\tinboundTag = {\n\t\t\t\t\t\tvalue.server.tag\n\t\t\t\t\t},\n\t\t\t\t\toutboundTag = value.outboundTag,\n\t\t\t\t})\n\t\t\tend\n\t\t\tif (value.server.domains and #value.server.domains > 0) or value.server.tag == default_dns_tag then\n\t\t\t\t-- Only keep default DNS server or has domains DNS server.\n\t\t\t\ttable.insert(dns.servers, 1, value.server)\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal has_default_dns_server = \"0\"\n\tfor index, value in ipairs(dns.servers) do\n\t\tif value.domains == nil then\n\t\t\thas_default_dns_server = \"1\"\n\t\t\tbreak\n\t\tend\n\tend\n\n\tif #dns.servers == 0 or not has_default_server == \"0\" then\n\t\ttable.insert(dns.servers, 1, {\n\t\t\ttag = \"local\",\n\t\t\taddress = \"localhost\"\n\t\t})\n\tend\n\n\tif redir_port then\n\t\tlocal inbound = {\n\t\t\tport = tonumber(redir_port),\n\t\t\tprotocol = \"dokodemo-door\",\n\t\t\tsettings = {network = \"tcp,udp\", followRedirect = true},\n\t\t\tstreamSettings = {sockopt = {tproxy = \"tproxy\"}},\n\t\t\tsniffing = {\n\t\t\t\tenabled = xray_settings.sniffing_override_dest == \"1\" or node.protocol == \"_shunt\"\n\t\t\t}\n\t\t}\n\t\tif inbound.sniffing.enabled == true then\n\t\t\tinbound.sniffing.destOverride = {\"http\", \"tls\", \"quic\"}\n\t\t\tinbound.sniffing.metadataOnly = false\n\t\t\tinbound.sniffing.routeOnly = xray_settings.sniffing_override_dest ~= \"1\" or nil\n\t\t\tinbound.sniffing.domainsExcluded = xray_settings.sniffing_override_dest == \"1\" and get_domain_excluded() or nil\n\t\tend\n\t\tif remote_dns_fake or inner_fakedns == \"1\" then\n\t\t\tinbound.sniffing.enabled = true\n\t\t\tif not inbound.sniffing.destOverride then\n\t\t\t\tinbound.sniffing.destOverride = {\"fakedns\"}\n\t\t\t\tinbound.sniffing.metadataOnly = true\n\t\t\telse\n\t\t\t\ttable.insert(inbound.sniffing.destOverride, \"fakedns\")\n\t\t\t\tinbound.sniffing.metadataOnly = false\n\t\t\tend\n\t\tend\n\n\t\tlocal tcp_inbound = api.clone(inbound)\n\t\ttcp_inbound.tag = \"tcp_redir\"\n\t\ttcp_inbound.settings.network = \"tcp\"\n\t\ttcp_inbound.streamSettings.sockopt.tproxy = tcp_proxy_way\n\t\ttable.insert(inbounds, tcp_inbound)\n\n\t\tlocal udp_inbound = api.clone(inbound)\n\t\tudp_inbound.tag = \"udp_redir\"\n\t\tudp_inbound.settings.network = \"udp\"\n\t\ttable.insert(inbounds, udp_inbound)\n\tend\n\t\n\tif inbounds or outbounds then\n\t\tlocal config = {\n\t\t\tlog = {\n\t\t\t\t--access = string.format(\"/tmp/etc/%s/%s_access.log\", appname, \"global\"),\n\t\t\t\t--error = string.format(\"/tmp/etc/%s/%s_error.log\", appname, \"global\"),\n\t\t\t\t--dnsLog = true,\n\t\t\t\tloglevel = loglevel\n\t\t\t},\n\t\t\tdns = dns,\n\t\t\tfakedns = fakedns,\n\t\t\tinbounds = inbounds,\n\t\t\toutbounds = outbounds,\n\t\t\tobservatory = (not burstObservatory) and observatory or nil,\n\t\t\tburstObservatory = burstObservatory,\n\t\t\trouting = routing,\n\t\t\tpolicy = {\n\t\t\t\tlevels = {\n\t\t\t\t\t[0] = {\n\t\t\t\t\t\t-- handshake = 4,\n\t\t\t\t\t\t-- connIdle = 300,\n\t\t\t\t\t\t-- uplinkOnly = 2,\n\t\t\t\t\t\t-- downlinkOnly = 5,\n\t\t\t\t\t\tbufferSize = xray_settings.buffer_size and tonumber(xray_settings.buffer_size) or nil,\n\t\t\t\t\t\tstatsUserUplink = false,\n\t\t\t\t\t\tstatsUserDownlink = false\n\t\t\t\t\t}\n\t\t\t\t},\n\t\t\t\t-- system = {\n\t\t\t\t--     statsInboundUplink = false,\n\t\t\t\t--     statsInboundDownlink = false\n\t\t\t\t-- }\n\t\t\t}\n\t\t}\n\n\t\tlocal direct_outbound = {\n\t\t\tprotocol = \"freedom\",\n\t\t\ttag = \"direct\",\n\t\t\tsettings = {\n\t\t\t\tdomainStrategy = (direct_dns_query_strategy and direct_dns_query_strategy ~= \"\") and direct_dns_query_strategy or \"UseIP\",\n\t\t\t\tfinalRules = {{ action = \"allow\" }}\n\t\t\t},\n\t\t\tstreamSettings = {\n\t\t\t\tsockopt = {\n\t\t\t\t\tmark = 255\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif COMMON.default_outbound_tag == \"direct\" then\n\t\t\ttable.insert(outbounds, 1, direct_outbound)\n\t\telse\n\t\t\ttable.insert(outbounds, direct_outbound)\n\t\tend\n\n\t\tlocal blackhole_outbound = {\n\t\t\tprotocol = \"blackhole\",\n\t\t\ttag = \"blackhole\"\n\t\t}\n\t\tif COMMON.default_outbound_tag == \"blackhole\" then\n\t\t\ttable.insert(outbounds, 1, blackhole_outbound)\n\t\telse\n\t\t\ttable.insert(outbounds, blackhole_outbound)\n\t\tend\n\n\t\tfor index, value in ipairs(config.outbounds) do\n\t\t\tlocal s = value.settings\n\t\t\tif not value[\"_flag_proxy_tag\"] and value[\"_id\"] and s and not no_run and\n\t\t\t((s.vnext and s.vnext[1] and s.vnext[1].address and s.vnext[1].port) or \n\t\t\t(s.servers and s.servers[1] and s.servers[1].address and s.servers[1].port) or\n\t\t\t(s.peers and s.peers[1] and s.peers[1].endpoint) or\n\t\t\t(s.address and s.port)) then\n\t\t\t\tsys.call(string.format(\"echo '%s' >> %s\", value[\"_id\"], api.TMP_PATH .. \"/direct_node_list\"))\n\t\t\tend\n\t\t\tfor k, v in pairs(config.outbounds[index]) do\n\t\t\t\tif k:find(\"_\") == 1 then\n\t\t\t\t\tconfig.outbounds[index][k] = nil\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\treturn jsonc.stringify(config, 1)\n\tend\nend\n\nfunction gen_proto_config(var)\n\tlocal local_socks_address = var[\"local_socks_address\"] or \"0.0.0.0\"\n\tlocal local_socks_port = var[\"local_socks_port\"]\n\tlocal local_socks_username = var[\"local_socks_username\"]\n\tlocal local_socks_password = var[\"local_socks_password\"]\n\tlocal local_http_address = var[\"local_http_address\"] or \"0.0.0.0\"\n\tlocal local_http_port = var[\"local_http_port\"]\n\tlocal local_http_username = var[\"local_http_username\"]\n\tlocal local_http_password = var[\"local_http_password\"]\n\tlocal server_proto = var[\"server_proto\"]\n\tlocal server_address = var[\"server_address\"]\n\tlocal server_port = var[\"server_port\"]\n\tlocal server_username = var[\"server_username\"]\n\tlocal server_password = var[\"server_password\"]\n\t\n\tlocal inbounds = {}\n\tlocal outbounds = {}\n\tlocal routing = nil\n\n\tif local_socks_address and local_socks_port then\n\t\tlocal inbound = {\n\t\t\tlisten = local_socks_address,\n\t\t\tport = tonumber(local_socks_port),\n\t\t\tprotocol = \"socks\",\n\t\t\tsettings = {\n\t\t\t\tudp = true,\n\t\t\t\tauth = \"noauth\"\n\t\t\t}\n\t\t}\n\t\tif local_socks_username and local_socks_password and local_socks_username ~= \"\" and local_socks_password ~= \"\" then\n\t\t\tinbound.settings.auth = \"password\"\n\t\t\tinbound.settings.accounts = {\n\t\t\t\t{\n\t\t\t\t\tuser = local_socks_username,\n\t\t\t\t\tpass = local_socks_password\n\t\t\t\t}\n\t\t\t}\n\t\tend\n\t\ttable.insert(inbounds, inbound)\n\tend\n\t\n\tif local_http_address and local_http_port then\n\t\tlocal inbound = {\n\t\t\tlisten = local_http_address,\n\t\t\tport = tonumber(local_http_port),\n\t\t\tprotocol = \"http\",\n\t\t\tsettings = {\n\t\t\t\tallowTransparent = false\n\t\t\t}\n\t\t}\n\t\tif local_http_username and local_http_password and local_http_username ~= \"\" and local_http_password ~= \"\" then\n\t\t\tinbound.settings.accounts = {\n\t\t\t\t{\n\t\t\t\t\tuser = local_http_username,\n\t\t\t\t\tpass = local_http_password\n\t\t\t\t}\n\t\t\t}\n\t\tend\n\t\ttable.insert(inbounds, inbound)\n\tend\n\t\n\tif server_proto ~= \"nil\" and server_address ~= \"nil\" and server_port ~= \"nil\" then\n\t\tlocal outbound = {\n\t\t\tprotocol = server_proto,\n\t\t\tstreamSettings = {\n\t\t\t\tnetwork = \"tcp\",\n\t\t\t\tsecurity = \"none\"\n\t\t\t},\n\t\t\tsettings = {\n\t\t\t\tservers = {\n\t\t\t\t\t{\n\t\t\t\t\t\taddress = server_address,\n\t\t\t\t\t\tport = tonumber(server_port),\n\t\t\t\t\t\tusers = (server_username and server_password) and {\n\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\tuser = server_username,\n\t\t\t\t\t\t\t\tpass = server_password\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t} or nil\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif outbound then table.insert(outbounds, outbound) end\n\tend\n\n\ttable.insert(outbounds, {\n\t\tprotocol = \"freedom\", tag = \"direct\", settings = {finalRules = {{ action = \"allow\" }}}, sockopt = {mark = 255}\n\t})\n\t\n\tlocal config = {\n\t\tlog = {\n\t\t\tloglevel = \"warning\"\n\t\t},\n\t\tinbounds = inbounds,\n\t\toutbounds = outbounds,\n\t\trouting = routing\n\t}\n\treturn jsonc.stringify(config, 1)\nend\n\nfunction gen_front_dns_config(var)\n\tlocal dns_listen_port = var[\"dns_listen_port\"]\n\tlocal direct_dns_udp_server = var[\"direct_dns_udp_server\"]\n\tlocal direct_dns_udp_port = var[\"direct_dns_udp_port\"]\n\tlocal default_dns_udp_server = var[\"default_dns_udp_server\"]\n\tlocal default_dns_udp_port = var[\"default_dns_udp_port\"]\n\n\tlocal queryStrategy = \"UseIP\"\n\tlocal dns = {\n\t\ttag = \"dns-global-direct\",\n\t\tdisableCache = false,\n\t\tdisableFallback = true,\n\t\tdisableFallbackIfMatch = true,\n\t\tqueryStrategy = queryStrategy,\n\t\tservers = {}\n\t}\n\tlocal inbounds = {}\n\tlocal outbounds = {}\n\tlocal routing = {\n\t\trules = {}\n\t}\n\n\ttable.insert(outbounds, {\n\t\ttag = \"direct\",\n\t\tprotocol = \"freedom\",\n\t\tsettings = {\n\t\t\tdomainStrategy = queryStrategy\n\t\t},\n\t\tstreamSettings = {\n\t\t\tsockopt = {\n\t\t\t\tmark = 255\n\t\t\t}\n\t\t}\n\t})\n\n\tif default_dns_udp_server then\n\t\ttable.insert(dns.servers, {\n\t\t\ttag = \"default\",\n\t\t\taddress = default_dns_udp_server,\n\t\t\tport = tonumber(default_dns_udp_port) or 53,\n\t\t\tqueryStrategy = queryStrategy,\n\t\t})\n\tend\n\n\tlocal direct_dns_shunt = uci:get(appname, \"@global[0]\", \"direct_dns_shunt\") or \"\"\n\tif #direct_dns_shunt > 0 then\n\t\tlocal dns_server = {}\n\t\tstring.gsub(direct_dns_shunt, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\tif w:find(\"#\") == 1 then return end\n\t\t\tlocal domain = sys.exec(string.format(\"echo -n $(echo %s | awk -F ' ' '{print $1}')\", w))\n\t\t\tlocal dns = sys.exec(string.format(\"echo -n $(echo %s | awk -F ' ' '{print $2}')\", w))\n\t\t\tif domain ~= \"\" and dns ~= \"\" then\n\t\t\t\tlocal new_dns_server = parseDNS(dns)\n\t\t\t\tif new_dns_server then\n\t\t\t\t\tif not dns_server[dns] then\n\t\t\t\t\t\tdns_server[dns] = {}\n\t\t\t\t\tend\n\t\t\t\t\tdns_server[dns].tag = dns\n\t\t\t\t\tdns_server[dns].queryStrategy = queryStrategy\n\t\t\t\t\tdns_server[dns].address = new_dns_server.address\n\t\t\t\t\tdns_server[dns].port = new_dns_server.port\n\t\t\t\t\tdns_server[dns].finalQuery = true\n\t\t\t\t\tif not dns_server[dns].domains then\n\t\t\t\t\t\tdns_server[dns].domains = {}\n\t\t\t\t\tend\n\t\t\t\t\ttable.insert(dns_server[dns].domains, domain)\n\t\t\t\tend\n\t\t\tend\n\t\tend)\n\t\tfor k, v in pairs(dns_server) do\n\t\t\ttable.insert(dns.servers, v)\n\t\t\ttable.insert(routing.rules, {\n\t\t\t\tinboundTag = {\n\t\t\t\t\tv.tag\n\t\t\t\t},\n\t\t\t\toutboundTag = \"direct\"\n\t\t\t})\n\t\tend\n\tend\n\n\tif direct_dns_udp_server then\n\t\tlocal node_domain = {}\n\t\tlocal nodes_domain_text = sys.exec('uci show passwall2 | grep \".address=\" | cut -d \"\\'\" -f 2 | grep \"[a-zA-Z]$\" | sort -u')\n\t\tstring.gsub(nodes_domain_text, '[^' .. \"\\r\\n\" .. ']+', function(w)\n\t\t\tw = (w or \"\"):lower()\n\t\t\ttable.insert(node_domain, \"full:\" .. w)\n\t\tend)\n\t\tif #node_domain > 0 then\n\t\t\ttable.insert(dns.servers, {\n\t\t\t\ttag = \"dns-in-vpslist\",\n\t\t\t\taddress = direct_dns_udp_server,\n\t\t\t\tport = tonumber(direct_dns_udp_port) or 53,\n\t\t\t\tqueryStrategy = queryStrategy,\n\t\t\t\tdomains = node_domain,\n\t\t\t\tfinalQuery = true,\n\t\t\t\tdisableCache = false,\n\t\t\t\tserveStale = true,\n\t\t\t})\n\t\tend\n\tend\n\n\ttable.insert(inbounds, {\n\t\ttag = \"dns-in\",\n\t\tlisten = \"127.0.0.1\",\n\t\tport = tonumber(dns_listen_port),\n\t\tprotocol = \"dokodemo-door\",\n\t\tsettings = {\n\t\t\taddress = \"0.0.0.0\",\n\t\t\tnetwork = \"tcp,udp\"\n\t\t}\n\t})\n\n\ttable.insert(outbounds, {\n\t\ttag = \"dns-out\",\n\t\tprotocol = \"dns\",\n\t\tproxySettings = {\n\t\t\ttag = \"direct\"\n\t\t},\n\t\tsettings = {\n\t\t\taddress = direct_dns_udp_server,\n\t\t\tport = tonumber(direct_dns_udp_port) or 53,\n\t\t\tnetwork = \"udp\",\n\t\t\tnonIPQuery = \"skip\",\n\t\t\tblockTypes = {\n\t\t\t\t65\n\t\t\t}\n\t\t}\n\t})\n\n\ttable.insert(routing.rules, {\n\t\tinboundTag = {\n\t\t\t\"dns-in\"\n\t\t},\n\t\toutboundTag = \"dns-out\"\n\t})\n\n\tlocal config = {\n\t\tlog = {\n\t\t\tdnsLog = true,\n\t\t\tloglevel = \"debug\"\n\t\t},\n\t\tdns = dns,\n\t\tinbounds = inbounds,\n\t\toutbounds = outbounds,\n\t\trouting = routing\n\t}\n\treturn jsonc.stringify(config, 1)\nend\n\n_G.gen_config = gen_config\n_G.gen_front_dns_config = gen_front_dns_config\n_G.gen_proto_config = gen_proto_config\n\nif arg[1] then\n\tlocal func =_G[arg[1]]\n\tif func then\n\t\tlocal var = nil\n\t\tif arg[2] then\n\t\t\tvar = jsonc.parse(arg[2])\n\t\tend\n\t\tprint(func(var))\n\tend\nend\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/app_update/app_version.htm",
    "content": "<%\nlocal api = require \"luci.passwall2.api\"\nlocal com = require \"luci.passwall2.com\"\nlocal version = {}\n-%>\n\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tvar appInfoList = new Array();\n\tvar inProgressCount = 0;\n\tvar tokenStr = '<%=token%>';\n\tvar checkUpdateText = '<%:Check update%>';\n\tvar forceUpdateText = '<%:Force update%>';\n\tvar retryText = '<%:Retry%>';\n\tvar noUpdateText = '<%:It is the latest version%>';\n\tvar updateSuccessText = '<%:Update successful%>';\n\tvar clickToUpdateText = '<%:Click to update%>';\n\tvar inProgressText = '<%:Updating...%>';\n\tvar unexpectedErrorText = '<%:Unexpected error%>';\n\tvar updateInProgressNotice = '<%:Updating, are you sure to close?%>';\n\tvar downloadingText = '<%:Downloading...%>';\n\tvar decompressioningText = '<%:Unpacking...%>';\n\tvar movingText = '<%:Moving...%>';\n\n\t//window.onload = function () {};\n\n\tfunction addPageNotice() {\n\t\tif (inProgressCount === 0) {\n\t\t\twindow.onbeforeunload = function (e) {\n\t\t\t\te.returnValue = updateInProgressNotice;\n\t\t\t\treturn updateInProgressNotice;\n\t\t\t};\n\t\t}\n\t\tinProgressCount++;\n\t}\n\n\tfunction removePageNotice() {\n\t\tinProgressCount--;\n\t\tif (inProgressCount === 0) {\n\t\t\twindow.onbeforeunload = undefined;\n\t\t}\n\t}\n\n\tfunction onUpdateSuccess(btn) {\n\t\tif (btn) {\n\t\t\tbtn.value = updateSuccessText;\n\t\t\tbtn.placeholder = updateSuccessText;\n\t\t\tbtn.disabled = true;\n\t\t}\n\n\t\tif (inProgressCount === 0) {\n\t\t\twindow.setTimeout(function () {\n\t\t\t\twindow.location.reload();\n\t\t\t}, 1000);\n\t\t}\n\t}\n\n\tfunction onRequestError(btn, errorMessage) {\n\t\tbtn.disabled = false;\n\t\tbtn.value = retryText;\n\n\t\tvar ckeckDetailElm = document.getElementById(btn.id + '-detail');\n\t\tif (errorMessage && ckeckDetailElm) {\n\t\t\tckeckDetailElm.textContent = errorMessage\n\t\t}\n\t}\n\n\tfunction onBtnClick(btn, app) {\n\t\tif (appInfoList[app] === undefined) {\n\t\t\tcheckUpdate(btn, app);\n\t\t} else {\n\t\t\tdoUpdate(btn, app);\n\t\t}\n\t}\n\n\tfunction checkUpdate(btn, app) {\n\t\tbtn.disabled = true;\n\t\tbtn.value = inProgressText;\n\n\t\taddPageNotice();\n\n\t\tvar ckeckDetailElm = document.getElementById(btn.id + '-detail');\n\t\tif (ckeckDetailElm) {\n\t\t\tckeckDetailElm.textContent = \"\";\n\t\t}\n\t\tXHR.get('<%=api.url(\"check_\")%>' + app, {\n\t\t\ttoken: tokenStr,\n\t\t\tarch: ''\n\t\t}, function (x, json) {\n\t\t\tremovePageNotice();\n\t\t\tif (json.code) {\n\t\t\t\tappInfoList[app] = undefined;\n\t\t\t\tonRequestError(btn, json.error);\n\t\t\t} else {\n\t\t\t\tappInfoList[app] = json;\n\t\t\t\tif (json.has_update) {\n\t\t\t\t\tbtn.disabled = false;\n\t\t\t\t\tbtn.value = clickToUpdateText;\n\t\t\t\t\tbtn.placeholder = clickToUpdateText;\n\n\t\t\t\t\tif (ckeckDetailElm) {\n\t\t\t\t\t\tvar urlNode = '';\n\t\t\t\t\t\tif (json.remote_version) {\n\t\t\t\t\t\t\turlNode = '<em style=\"color:red;\">' + json.remote_version + '</em>';\n\t\t\t\t\t\t\tif (json.html_url) {\n\t\t\t\t\t\t\t\turlNode = '<a href=\"' + json.html_url + '\" target=\"_blank\">' + urlNode + '</a>';\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tckeckDetailElm.innerHTML = urlNode;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tbtn.disabled = true;\n\t\t\t\t\tbtn.value = noUpdateText;\n\t\t\t\t\tvar forceBtn = document.getElementById('_' + app + '-force_btn');\n\t\t\t\t\tif (forceBtn) {\n\t\t\t\t\t\tforceBtn.style.display = \"inline\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}, 300);\n\t}\n\n\tfunction doUpdate(btn, app) {\n\t\tbtn.disabled = true;\n\t\tbtn.value = downloadingText;\n\n\t\taddPageNotice();\n\n\t\tvar appUpdateUrl = '<%=api.url(\"update_\")%>' + app;\n\t\tvar appInfo = appInfoList[app];\n\t\t// Download file\n\t\tXHR.get(appUpdateUrl, {\n\t\t\ttoken: tokenStr,\n\t\t\turl: appInfo ? appInfo.data.browser_download_url : '',\n\t\t\tsize: appInfo ? appInfo.data.size / 1024 : null\n\t\t}, function (x, json) {\n\t\t\tif (json.code) {\n\t\t\t\tremovePageNotice();\n\t\t\t\tonRequestError(btn, json.error);\n\t\t\t} else if (json.zip) {\n\t\t\t\tbtn.value = decompressioningText;\n\n\t\t\t\t// Extract file\n\t\t\t\tXHR.get(appUpdateUrl, {\n\t\t\t\t\ttoken: tokenStr,\n\t\t\t\t\ttask: 'extract',\n\t\t\t\t\tfile: json.file,\n\t\t\t\t\tsubfix: appInfo ? appInfo.type : ''\n\t\t\t\t}, function (x, json) {\n\t\t\t\t\tif (json.code) {\n\t\t\t\t\t\tremovePageNotice();\n\t\t\t\t\t\tonRequestError(btn, json.error);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tmove(btn, appUpdateUrl, json.file);\n\t\t\t\t\t}\n\t\t\t\t}, 300)\n\t\t\t} else {\n\t\t\t\tmove(btn, appUpdateUrl, json.file);\n\t\t\t}\n\t\t}, 300)\n\t}\n\n\tfunction move(btn, url, file) {\n\t\tbtn.value = movingText;\n\n\t\t// Move file to target dir\n\t\tXHR.get(url, {\n\t\t\ttoken: tokenStr,\n\t\t\ttask: 'move',\n\t\t\tfile: file\n\t\t}, function (x, json) {\n\t\t\tremovePageNotice();\n\t\t\tif (json.code) {\n\t\t\t\tonRequestError(btn, json.error);\n\t\t\t} else {\n\t\t\t\tonUpdateSuccess(btn);\n\t\t\t}\n\t\t}, 300)\n\t}\n//]]>\n</script>\n\n<div class=\"cbi-value\">\n\t<label class=\"cbi-value-title\">Passwall2 <%:Version%></label>\n\t<div class=\"cbi-value-field\">\n\t\t<div class=\"cbi-value-description\">\n\t\t\t<span>【 <%=api.get_version()%> 】</span>\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" id=\"passwall2-check_btn\"\n\t\t\t\tonclick=\"onBtnClick(this,'passwall2');\" value=\"<%:Check update%>\" />\n\t\t\t<span id=\"passwall2-check_btn-detail\"></span>\n\t\t</div>\n\t</div>\n</div>\n\n<%for k, v in pairs(com) do\n\tversion[k] = api.get_app_version(k)%>\n<div class=\"cbi-value\">\n\t<label class=\"cbi-value-title\"><%=v.name%>\n\t\t<%:Version%>\n\t</label>\n\t<div class=\"cbi-value-field\">\n\t\t<div class=\"cbi-value-description\">\n\t\t\t<span>【 <%=version[k] ~=\"\" and version[k] or translate(\"Null\") %> 】</span>\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" id=\"_<%=k%>-check_btn\"\n\t\t\t\tonclick=\"onBtnClick(this,'<%=k%>');\" value=\"<%:Check update%>\" />\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" id=\"_<%=k%>-force_btn\"\n\t\t\t\tonclick=\"doUpdate(this,'<%=k%>');\" value=\"<%:Force update%>\" style=\"display:none\"/>\n\t\t\t<span id=\"_<%=k%>-check_btn-detail\"></span>\n\t\t</div>\n\t</div>\n</div>\n<%end%>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/cbi/hidevalue.htm",
    "content": "<div id=\"cbi-<%=self.config..\"-\"..section..\"-\"..self.option%>\" data-index=\"<%=self.index%>\" data-depends=\"<%=pcdata(self:deplist2json(section))%>\" style=\"display: none !important\">\n\t<input type=\"hidden\" id=\"<%=cbid%>\" name=\"<%=cbid%>\" value=\"<%=pcdata(self:cfgvalue(section) or self.default or \"\")%>\" />\n</div>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_dynamiclist.htm",
    "content": "<%+cbi/valueheader%>\n<%\n--\tTemplate Developers:\n--\t\t- lwb1978\n--\t\t- snowie2000\n--\tCopyright: copyright(c)2025–2027\n--\tDescription: Passwall(2) UI template\n\nlocal json = require \"luci.jsonc\"\n\n-- 读取值（keylist/vallist/group）\nlocal values = {}\nfor i, key in pairs(self.keylist) do\n\tvalues[#values + 1] = {\n\t\tkey = key,\n\t\tlabel = self.vallist[i] or key,\n\t\tgroup = self.group and self.group[i] or nil\n\t}\nend\n\n-- 获取当前配置值\nlocal current_key = {}\nlocal cval = self:cfgvalue(section)\nif type(cval) == \"table\" then\n\tfor _, v in ipairs(cval) do\n\t\tfor item in string.gmatch(v, \"[^,]+\") do\n\t\t\tcurrent_key[#current_key+1] = item\n\t\tend\n\tend\nelseif type(cval) == \"string\" then\n\tfor item in string.gmatch(cval, \"[^,]+\") do\n\t\tcurrent_key[#current_key+1] = item\n\tend\nend\n\n-- 分离无组节点（ungrouped）与有组节点（grouped），并保持原有顺序\nlocal ungrouped = {}\nlocal groups = {}\nlocal group_order = {}\nfor _, item in ipairs(values) do\n\tif not item.group or item.group == \"\" then\n\t\ttable.insert(ungrouped, item)\n\telse\n\t\tlocal g = item.group\n\t\tif not groups[g] then\n\t\t\tgroups[g] = {}\n\t\t\ttable.insert(group_order, g)\n\t\tend\n\t\ttable.insert(groups[g], item)\n\tend\nend\n\n-- 打包数据给 JS\nlocal dropdown_data = {\n\tcurrent_key = current_key,\n\tungrouped = ungrouped,\n\tgroups = groups,\n\tgroup_order = group_order,\n\tcbid = cbid,\n}\n%>\n<script>\nwindow.dl_dropdown_data = window.dl_dropdown_data || {};\nwindow.dl_dropdown_data[\"<%=cbid%>\"] = <%=json.stringify(dropdown_data)%>;\n</script>\n\n<div id=\"<%=cbid%>.main\" class=\"dl-dropdown-container\">\n\t<select id=\"<%=cbid%>.ref\" class=\"cbi-input-select\" style=\"display:none !important;\">\n\t\t<option value>placeholder</option>\n\t</select>\n\n\t<!-- 已选节点显示区 -->\n\t<div id=\"<%=cbid%>.selected\" class=\"dl-selected-list\"></div>\n\n\t<!-- 模拟 listvalue 控件外观 -->\n\t<div class=\"cbi-input-value cbi-input-select dl-dropdown-display\" id=\"<%=cbid%>.display\" tabindex=\"0\">\n\t\t<span id=\"<%=cbid%>.label\" class=\"dl-dropdown-label\">\n\t\t\t<%=translate(\"-- Please choose --\")%>\n\t\t</span>\n\t\t<span class=\"dl-arrow-down\"></span>\n\t</div>\n\t<!-- 下拉面板 -->\n\t<div id=\"<%=cbid%>.panel\" class=\"cbi-dynamiclist-panel dl-dropdown-panel\" style=\"display:none;\">\n\t\t<!-- 搜索框 -->\n\t\t<div style=\"padding:8px;border-bottom:1px solid #f0f0f0;\">\n\t\t\t<input id=\"<%=cbid%>.search\" class=\"cbi-input-text dl-dropdown-search\" type=\"text\" placeholder=\"🔍 <%:Search nodes...%>\" inputmode=\"search\" enterkeyhint=\"done\" />\n\t\t</div>\n\t\t<!-- 列表容器 -->\n\t\t<div id=\"<%=cbid%>.list\" style=\"padding:8px;\">\n\t\t\t<!-- 首次点击 display 时由 JS 填充 -->\n\t\t</div>\n\t</div>\n</div>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n(function(){\n\tconst cbid = \"<%=cbid%>\";\n\tconst panel = document.getElementById(cbid + \".panel\");\n\tconst display = document.getElementById(cbid + \".display\");\n\tconst labelSpan = document.getElementById(cbid + \".label\");\n\tconst searchInput = document.getElementById(cbid + \".search\");\n\tconst listContainer = document.getElementById(cbid + \".list\");\n\n\tfunction init(){\n\t\tconst hidden = document.getElementById(cbid + \".hidden\");\n\t\tconst data = window.dl_dropdown_data[cbid];\n\t\tlet arr = data.current_key;\n\t\tif (!arr || arr.length === 0) return;\n\t\tarr.forEach(key=>{\n\t\t\tlet label = \"\";\n\t\t\tdata.ungrouped.concat(...Object.values(data.groups)).forEach(v=>{\n\t\t\t\tif (v.key == key) label = v.label;\n\t\t\t});\n\t\t\tif (label)\n\t\t\t\tdl_add_item(cbid, key, label);\n\t\t});\n\t}\n\n\t// 点击 display\n\tdisplay.addEventListener(\"click\", function(e){\n\t\te.stopPropagation();\n\t\tdl_render_dropdown_list(cbid,panel,listContainer,labelSpan,searchInput,display);\n\t\tdocument.querySelectorAll(\".cbi-dynamiclist-panel\").forEach(p=>{\n\t\t\tif (p !== panel) p.style.display = \"none\";\n\t\t});\n\t\tif (panel.style.display !== \"none\") {\n\t\t\tdl_closePanel(cbid,panel,listContainer,searchInput);\n\t\t} else {\n\t\t\tdl_openPanel(cbid,display,panel,listContainer,searchInput);\n\t\t}\n\t});\n\n\tdl_registerAdaptive(cbid);\n\n\tinit();\n\n\tnew Sortable(document.getElementById(cbid + \".selected\"), {\n\t\tanimation: 150,\n\t\tghostClass: \"dragging-row\",\n\t\tonEnd: function(){\n\t\t\tdl_update_hidden(cbid);\n\t\t}\n\t});\n})();\n//]]>\n</script>\n\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_dynamiclist_com.htm",
    "content": "<%\n--\tTemplate Developers:\n--\t\t- lwb1978\n--\t\t- snowie2000\n--\tCopyright: copyright(c)2025–2027\n--\tDescription: Passwall(2) UI template\n-- It is the common part of the template and cannot be used independently\n%>\n<script src=\"<%=resource%>/view/passwall2/Sortable.min.js\"></script>\n<style>\n/* 主下拉按钮的下箭头 */\n.dl-arrow-down {\n\twidth: 0;\n\theight: 0;\n\tborder-left: 5px solid transparent;\n\tborder-right: 5px solid transparent;\n\tborder-top: 6px solid #666;\n\tmargin-left: 6px;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 组标题的右箭头（折叠） */\n.dl-arrow-right {\n\twidth: 0;\n\theight: 0;\n\tborder-top: 4px solid transparent;\n\tborder-bottom: 4px solid transparent;\n\tborder-left: 5px solid #555;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 组标题的下箭头（展开） */\n.dl-arrow-down-small {\n\twidth: 0;\n\theight: 0;\n\tborder-left: 4px solid transparent;\n\tborder-right: 4px solid transparent;\n\tborder-top: 5px solid #555;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 基础列表项样式 */\n.cbi-dynamiclist-panel li[data-key] {\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tcursor: pointer;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\ttransition: background-color 0.15s ease;\n}\n/* 鼠标悬停效果 - 使用透明度避免覆盖问题 */\n.cbi-dynamiclist-panel li[data-key]:hover {\n\tbackground-color: rgba(0, 123, 255, 0.1);\n}\n\n.dl-dropdown-container {\n\tdisplay: inline-block;\n\tposition: relative;\n\tmin-width: 220px;\n\twhite-space: nowrap;\n}\n@media (max-width: 1152px) {\n\t.dl-dropdown-container {\n\t\twhite-space: normal;\n\t}\n}\n@media (max-width: 600px) {\n\t.dl-dropdown-container {\n\t\tdisplay: block;\n\t\twhite-space: normal;\n\t}\n}\n\n.dl-dropdown-display {\n\tcursor: pointer;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tbox-sizing: border-box;\n}\n.dl-dropdown-label,\n.dl-selected-label {\n\tdisplay: inline-block;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\twidth: 100%;\n\ttext-align: left;\n}\n.dl-dropdown-panel {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tz-index: 2147483647;\n\tborder: 1px solid #dcdcdc;\n\tborder-radius: 4px;\n\tbox-shadow: 0 6px 18px rgba(0,0,0,0.08);\n\tmax-height: 50vh;\n\toverflow: auto;\n\toverscroll-behavior: contain;\n}\n.dl-dropdown-search {\n\twidth: 100%;\n\tmax-width: 100% !important;\n\tmin-width: 0 !important;\n\tbox-sizing: border-box;\n\tpadding: 6px;\n\tborder: 1px solid #e0e0e0;\n\tborder-radius: 4px;\n}\n.dl-group-title {\n\tcursor: pointer;\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tdisplay: flex;\n\talign-items: center;\n\tline-height: normal;\n\twhite-space: nowrap;\n}\n.dl-group-list {\n\tlist-style: none;\n\tmargin: 6px 0 0 8px;\n\tpadding: 0;\n}\n.dl-group-item {\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tcursor: pointer;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\ttext-align: left !important;\n}\n.dl-selected-list {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 5px;\n}\n.dl-remove {\n\tmargin-left: 8px;\n\tcursor: pointer;\n\tcolor: red;\n}\n.dragging-row {\n\tbackground-color: rgba(131, 191, 255, 0.7) !important;\n\tbox-shadow: 0 4px 6px rgba(0,0,0,0.1);\n}\n</style>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n\t// css helper functions\n\tfunction dl_camelToKebab(str) {\n\t\treturn str.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2').toLowerCase()\n\t}\n\n\tfunction dl_style2Css(styleDeclaration, properties) {\n\t\tconst cssRules = properties.map(prop => {\n\t\t\tconst kebabCaseProp = dl_camelToKebab(prop);[1, 5]\n\t\t\tconst value = styleDeclaration[prop]\n\t\t\tif (value) {\n\t\t\t\treturn `${kebabCaseProp}: ${value};`\n\t\t\t}\n\t\t\treturn ''\n\t\t})\n\t\t// Filter out any empty strings and join the rules\n\t\treturn cssRules.filter(Boolean).join(' ')\n\t}\n\n\tconst dl_parseColorToRgba = (function() {\n\t\t// Create canvas and context once (Closure)\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = 1;\n\t\tcanvas.height = 1;\n\t\tconst ctx = canvas.getContext('2d', { willReadFrequently: true });\n\t\treturn function(colorStr) {\n\t\t\tif (!colorStr)\n\t\t\t   return null;\n\t\t\tctx.clearRect(0, 0, 1, 1);\n\t\t\t// 2. Apply the color\n\t\t\tctx.fillStyle = colorStr;\n\t\t\t// 3. Fill a single pixel\n\t\t\tctx.fillRect(0, 0, 1, 1);\n\t\t\t// 4. Extract pixel data [R, G, B, A]\n\t\t\tconst data = ctx.getImageData(0, 0, 1, 1).data;\n\t\t\treturn {\n\t\t\t\tr: data[0],\n\t\t\t\tg: data[1],\n\t\t\t\tb: data[2],\n\t\t\t\t// Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places)\n\t\t\t\ta: Math.round((data[3] / 255) * 1000) / 1000\n\t\t\t};\n\t\t};\n\t})();\n\n\t// Helper to convert back to Hex (for output consistency)\n\tfunction dl_rgbToHex(r, g, b) {\n\t\tconst toHex = (n) => {\n\t\t\tconst hex = Math.max(0, Math.min(255, n)).toString(16)\n\t\t\treturn hex.length === 1 ? '0' + hex : hex\n\t\t}\n\t\treturn `#${toHex(r)}${toHex(g)}${toHex(b)}`\n\t}\n\n\tfunction dl_isTransparent(color) {\n\t\tconst cleanColor = dl_parseColorToRgba(color);\n\t\t// check #RRGGBBAA for transparency\n\t\treturn !cleanColor || (cleanColor.a !== undefined && !cleanColor.a);\n\t}\n\n\tfunction dl_getColorSchema(color) {\n\t\tconst rgb = dl_parseColorToRgba(color);\n\t\tif (!rgb) return 'unknown'; // Handle invalid colors\n\t\t// Calculate YIQ brightness (human eye perception)\n\t\tconst brightness = ((rgb.r * 299) + (rgb.g * 587) + (rgb.b * 114)) / 1000;\n\t\t\n\t\treturn brightness > 128 ? 'light' : 'dark';\n\t}\n\n\tfunction dl_lighter(color, amount) {\n\t\tconst rgb = dl_parseColorToRgba(color);\n\t\tif (!rgb) return color;\n\t\t// Add amount to each channel\n\t\tconst r = rgb.r + amount;\n\t\tconst g = rgb.g + amount;\n\t\tconst b = rgb.b + amount;\n\t\t// Convert back to Hex (clamping happens inside rgbToHex)\n\t\treturn dl_rgbToHex(r, g, b);\n\t}\n\n\tfunction dl_darker(color, amount) {\n\t\tconst rgb = dl_parseColorToRgba(color);\n\t\tif (!rgb) return color;\n\t\t// Subtract amount from each channel\n\t\tconst r = rgb.r - amount;\n\t\tconst g = rgb.g - amount;\n\t\tconst b = rgb.b - amount;\n\n\t\treturn dl_rgbToHex(r, g, b);\n\t}\n\n\t// copy select styles\n\tfunction dl_adaptiveStyle(cbid) {\n\t\tconst display = document.getElementById(cbid + \".display\");\n\t\tconst hiddenRef = document.getElementById(cbid + \".ref\");\n\t\tconst panel = document.getElementById(cbid + \".panel\");\n\t\tif (hiddenRef && display) {\n\t\t\tconst elOption = hiddenRef.getElementsByTagName(\"option\")[0]\n\t\t\tconst styleSelect = window.getComputedStyle(hiddenRef)\n\t\t\tconst styleOption = window.getComputedStyle(elOption)\n\t\t\tconst styleBody = window.getComputedStyle(document.body)\n\n\t\t\tconst styleNode = document.createElement('style')\n\t\t\tconst styleNames = [\"width\", \"color\", \"height\", \"padding\", \"margin\", \"lineHeight\", \"border\", \"borderRadius\", \"minWidth\", \"minHeight\"]\n\t\t\tif (styleSelect.borderBottomStyle !== \"none\") {\n\t\t\t\tstyleNames.push(\"borderBottomWidth\", \"borderBottomStyle\", \"borderBottomColor\");\n\t\t\t}\n\t\t\tdocument.head.appendChild(styleNode)\n\t\t\t// trace back from option -> select -> body for background color\n\t\t\tconst panelRadius = styleSelect.borderRadius;\n\t\t\tconst optionColor = !dl_isTransparent(styleOption.backgroundColor) ? styleOption.backgroundColor : !dl_isTransparent(styleSelect.backgroundColor) ? styleSelect.backgroundColor : styleBody.backgroundColor\n\t\t\tconst titleColor = dl_getColorSchema(optionColor) === \"light\" ? dl_darker(optionColor, 30) : dl_lighter(optionColor, 30)\n\t\t\tconst selectStyleCSS = [`#${CSS.escape(cbid + \".display\")}, .dl-selected-item {`, dl_style2Css(styleSelect, styleNames), dl_style2Css(styleSelect, [\"backgroundColor\"]), \"}\"]\n\t\t\tconst optionStyleCSS = [`#${CSS.escape(cbid + \".panel\")}  {`, dl_style2Css(styleOption, styleNames), `background-color: ${optionColor};`, `border-radius: ${panelRadius};`, \"}\"]\n\t\t\tconst titleStyleCSS = [`#${CSS.escape(cbid + \".panel\")} .dl-group-title  {`, `background-color: ${titleColor} !important;`, \"}\"]\n\t\t\tstyleNode.textContent = [].concat(selectStyleCSS, optionStyleCSS, titleStyleCSS).join(\"\\n\")\n\t\t}\n\t}\n\n\tfunction dl_idSafe(id) {\n\t\treturn id\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, \"-\")\n\t\t\t.replace(/[\\x00-\\x1F\\x7F]/g, \"\");\n\t}\n\n\t// 更新组内选中计数\n\tfunction dl_updateGroupCounts(cbid, listContainer, searchInput) {\n\t\tconst groups = listContainer.querySelectorAll(\".dl-group\");\n\t\tconst isSearching = searchInput.value.trim() !== \"\";\n\t\tgroups.forEach(group => {\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst items = group.querySelectorAll(\"li[data-key]\");\n\t\t\tconst span = document.getElementById(\"group-count-\" + cbid + \"-\" + gname);\n\t\t\tif (!span) return;\n\t\t\tif (isSearching) {\n\t\t\t\t// 搜索状态：显示匹配数量\n\t\t\t\tlet matchCount = 0;\n\t\t\t\titems.forEach(li => {\n\t\t\t\t\tif (li.style.display !== \"none\") matchCount++;\n\t\t\t\t});\n\t\t\t\tspan.textContent = \"(\" + matchCount + \"/\" + items.length + \")\";\n\t\t\t\tif (matchCount > 0) {\n\t\t\t\t\tspan.style.color = \"#28a745\";\n\t\t\t\t\tspan.style.fontWeight = \"600\";\n\t\t\t\t} else {\n\t\t\t\t\tspan.style.color = \"#dc3545\";\n\t\t\t\t\tspan.style.fontWeight = \"normal\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// 默认状态\n\t\t\t\tspan.textContent = \"(\" + items.length + \")\";\n\t\t\t\tspan.style.color = \"\";\n\t\t\t\tspan.style.fontWeight = \"normal\";\n\t\t\t}\n\t\t});\n\t}\n\n\t//搜索过滤器：按 name 或 label 做模糊匹配，搜索时自动展开所有组并隐藏不匹配条目\n\tfunction dl_filterList(keyword, cbid, listContainer, searchInput) {\n\t\tkeyword = (keyword || \"\").toLowerCase().trim();\n\t\tconst topItems = listContainer.querySelectorAll(\"ul li[data-key]\");\n\t\ttopItems.forEach(li=>{\n\t\t\tconst name = (li.getAttribute(\"data-node-name\") || \"\").toLowerCase();\n\t\t\tif (!keyword || name.indexOf(keyword) !== -1) {\n\t\t\t\tli.style.display = \"block\";\n\t\t\t} else {\n\t\t\t\tli.style.display = \"none\";\n\t\t\t}\n\t\t});\n\t\tconst groups = listContainer.querySelectorAll(\".dl-group\");\n\t\tgroups.forEach(group=>{\n\t\t\tconst items = group.querySelectorAll(\"li[data-key]\");\n\t\t\tlet matchCount = 0;\n\t\t\titems.forEach(li=>{\n\t\t\t\tconst name = (li.getAttribute(\"data-node-name\") || \"\").toLowerCase();\n\t\t\t\tif (!keyword || name.indexOf(keyword) !== -1) {\n\t\t\t\t\tli.style.display = \"block\";\n\t\t\t\t\tmatchCount++;\n\t\t\t\t} else {\n\t\t\t\t\tli.style.display = \"none\";\n\t\t\t\t}\n\t\t\t});\n\t\t\tgroup.style.display = (matchCount === 0 && keyword !== \"\") ? \"none\" : \"block\";\n\t\t\tconst ul = group.querySelector(\".dl-group-list\");\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst arrow = document.getElementById(\"arrow-\" + cbid + \"-\" + gname);\n\t\t\tif (keyword) {\n\t\t\t\tif (ul) ul.style.display = (matchCount > 0 ? \"block\" : \"none\");\n\t\t\t\tif (arrow) arrow.className = (matchCount > 0 ? \"dl-arrow-down-small\" : \"dl-arrow-right\");\n\t\t\t} else {\n\t\t\t\tif (ul) ul.style.display = \"none\";\n\t\t\t\tif (arrow) arrow.className = \"dl-arrow-right\";\n\t\t\t}\n\t\t});\n\t\tdl_updateGroupCounts(cbid, listContainer, searchInput);\n\t}\n\n\t// 切换单个组（点击组标题）\n\tfunction dl_toggleGroup(listContainer, cbid, g) {\n\t\tg = dl_idSafe(g);\n\t\tconst group = listContainer.querySelector(\".dl-group[data-group='\" + g + \"']\");\n\t\tif (!group) return;\n\t\tconst ul = group.querySelector(\".dl-group-list\");\n\t\tconst arrow = document.getElementById(\"arrow-\" + cbid + \"-\" + g);\n\t\tif (!ul) return;\n\t\tconst searchInput = document.getElementById(cbid + \".search\");\n\t\tconst isSearching = searchInput?.value.trim() !== \"\";\n\t\tconst isExpanded = ul.style.display !== \"none\";\n\n\t\tif (isExpanded) {\n\t\t\tul.style.display = \"none\";\n\t\t\tif (arrow) arrow.className = \"dl-arrow-right\";\n\t\t} else {\n\t\t\tul.style.display = \"block\";\n\t\t\tif (arrow) arrow.className = \"dl-arrow-down-small\";\n\n\t\t\tif (!isSearching) {\n\t\t\t\tconst allGroups = listContainer.querySelectorAll(\".dl-group\");\n\t\t\t\tallGroups.forEach(otherGroup => {\n\t\t\t\t\tif (otherGroup !== group) {\n\t\t\t\t\t\tconst otherUl = otherGroup.querySelector(\".dl-group-list\");\n\t\t\t\t\t\tconst otherGname = otherGroup.getAttribute(\"data-group\");\n\t\t\t\t\t\tconst otherArrow = document.getElementById(\"arrow-\" + cbid + \"-\" + otherGname);\n\t\t\t\t\t\tif (otherUl) otherUl.style.display = \"none\";\n\t\t\t\t\t\tif (otherArrow) otherArrow.className = \"dl-arrow-right\";\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// 计算panel位置\n\tfunction dl_repositionPanel(panel, display) {\n\t\tif (!panel || panel.style.display === \"none\") return;\n\t\tconst rect = display.getBoundingClientRect();\n\t\tconst viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n\t\tpanel.style.visibility = \"hidden\";\n\t\tpanel.style.display = \"block\";\n\t\tpanel.style.minHeight = \"100px\";\n\t\tpanel.style.maxHeight = Math.min(0.5*viewportHeight, 550) + \"px\";\n\t\tconst panelHeight = panel.offsetHeight;\n\t\tconst spaceBelow = viewportHeight - rect.bottom;\n\t\tconst spaceAbove = rect.top;\n\t\tlet top, isUp = false;\n\t\tif (spaceBelow >= panelHeight) {\n\t\t\ttop = rect.bottom + 2;\n\t\t\tisUp = false;\n\t\t} else if (spaceAbove >= panelHeight) {\n\t\t\ttop = rect.top - panelHeight - 2;\n\t\t\tisUp = true;\n\t\t} else {\n\t\t\tif (spaceBelow >= spaceAbove) {\n\t\t\t\ttop = Math.max(rect.bottom - 2, viewportHeight - panelHeight - 2);\n\t\t\t\tisUp = false;\n\t\t\t} else {\n\t\t\t\ttop = Math.min(rect.top - panelHeight + 2, 2);\n\t\t\t\tisUp = true;\n\t\t\t}\n\t\t}\n\t\tpanel.style.left = rect.left + \"px\";\n\t\tpanel.style.top = top + \"px\";\n\t\tconst panelRect = panel.getBoundingClientRect();\n\t\tconst displayWidth = rect.width;\n\t\tconst remainingWidth = window.innerWidth - panelRect.left - 12;\n\t\tconst maxWidth = Math.max(displayWidth, Math.floor(remainingWidth));\n\t\tpanel.style.maxWidth = maxWidth + \"px\";\n\t\tpanel.style.minWidth = displayWidth + \"px\";\n\t\tpanel.style.width = \"auto\";\n\t\tpanel.style.visibility = \"\";\n\t}\n\n\t// 打开/关闭面板\n\tfunction dl_openPanel(cbid, display, panel, listContainer, searchInput) {\n\t\tif (!panel._moved) {\n\t\t\tdocument.body.appendChild(panel);\n\t\t\tpanel._moved = true;\n\t\t}\n\t\tpanel.style.display = \"block\";\n\t\tdl_repositionPanel(panel, display);\n\t\t// 失焦监听\n\t\tconst handler = function(e){\n\t\t\tconst target = e.target;\n\t\t\tif (panel.style.display !== \"none\") {\n\t\t\t\tif (!panel.contains(target) && !display.contains(target)) {\n\t\t\t\t\tdl_closePanel(cbid, panel, listContainer, searchInput, display);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tpanel._docClickHandler = handler;\n\t\tdocument.addEventListener(\"click\", handler);\n\t\t// 滚动 / resize 自动 reposition\n\t\tlet ticking = false;\n\t\tconst repositionHandler = function () {\n\t\t\tif (ticking) return;\n\t\t\tticking = true;\n\t\t\trequestAnimationFrame(function () {\n\t\t\t\tticking = false;\n\t\t\t\tdl_repositionPanel(panel, display);\n\t\t\t});\n\t\t};\n\t\tpanel._repositionHandler = repositionHandler;\n\t\twindow.addEventListener(\"scroll\", repositionHandler, true);\n\t\twindow.addEventListener(\"resize\", repositionHandler);\n\t}\n\tfunction dl_closePanel(cbid, panel, listContainer, searchInput) {\n\t\tpanel.style.display = \"none\";\n\t\tsearchInput.value = \"\";\n\t\tdl_filterList(\"\", cbid, listContainer, searchInput);\n\t\t// document click\n\t\tif (panel._docClickHandler) {\n\t\t\tdocument.removeEventListener(\"click\", panel._docClickHandler);\n\t\t\tpanel._docClickHandler = null;\n\t\t}\n\t\t// scroll / resize\n\t\tif (panel._repositionHandler) {\n\t\t\twindow.removeEventListener(\"scroll\", panel._repositionHandler, true);\n\t\t\twindow.removeEventListener(\"resize\", panel._repositionHandler);\n\t\t\tpanel._repositionHandler = null;\n\t\t}\n\t}\n\n\tfunction dl_add_item(cbid, key, label) {\n\t\tconst container = document.getElementById(cbid + \".selected\");\n\t\tconst hidden = document.getElementById(cbid + \".hidden\");\n\t\tif (container.querySelector(`[data-key=\"${key}\"]`)) return;\n\t\tconst item = document.createElement(\"div\");\n\t\titem.className = \"cbi-input-value cbi-input-select dl-dropdown-display dl-selected-item\";\n\t\titem.setAttribute(\"data-key\", key);\n\t\titem.innerHTML = `\n\t\t\t<span class=\"dl-selected-label\" style=\"cursor:grab;\" title=\"${label}\">${label}</span>\n\t\t\t<span class=\"dl-remove\">×</span>\n\t\t`;\n\t\titem.querySelector(\".dl-remove\").onclick = function(){\n\t\t\titem.remove();\n\t\t\tdl_update_hidden(cbid);\n\t\t};\n\t\tcontainer.appendChild(item);\n\t\tdl_update_hidden(cbid);\n\t}\n\n\tfunction dl_update_hidden(cbid) {\n\t\tconst main = document.getElementById(cbid + \".main\");\n\t\tconst container = document.getElementById(cbid + \".selected\");\n\t\tmain.querySelectorAll(`input[type=\"hidden\"][name=\"${cbid}\"]`).forEach(el => el.remove());\n\t\tlet items = container.querySelectorAll(\".dl-selected-item\");\n\t\titems.forEach(el => {\n\t\t\tlet key = el.getAttribute(\"data-key\");\n\t\t\tlet input = document.createElement(\"input\");\n\t\t\tinput.type = \"hidden\";\n\t\t\tinput.name = cbid;\n\t\t\tinput.value = key;\n\t\t\tmain.insertBefore(input, container);\n\t\t});\n\t}\n\n\t// 动态生成下拉框\n\twindow.dl_dropdown_rendered = {};\n\tfunction dl_escape_html(s) {\n\t\treturn s.replace(/[&<>\"']/g, c => ({\n\t\t\t\"&\":\"&amp;\", \"<\":\"&lt;\", \">\":\"&gt;\", '\"':\"&quot;\", \"'\":\"&#39;\"\n\t\t}[c]));\n\t}\n\n\tfunction dl_render_dropdown_list(cbid, panel, listContainer, labelSpan, searchInput, display) {\n\t\tif (window.dl_dropdown_rendered[cbid]) return;\n\t\tconst data = window.dl_dropdown_data[cbid];\n\t\tif (!data) return;\n\t\tif (!listContainer) return;\n\n\t\tlet html = \"\";\n\n\t\t// 无组项\n\t\tif (data.ungrouped && data.ungrouped.length > 0) {\n\t\t\thtml += `<ul style=\"list-style:none;padding:0;margin:0 0 8px 0;\">`;\n\n\t\t\tdata.ungrouped.forEach(item => {\n\t\t\t\thtml += `\n\t\t\t\t\t<li data-key=\"${item.key}\"\n\t\t\t\t\t\tdata-node-name=\"${dl_escape_html(item.label.toLowerCase())}\"\n\t\t\t\t\t\tclass=\"list-item\">\n\t\t\t\t\t\t<span class=\"dl-item-label\" style=\"margin-left:12px;\">\n\t\t\t\t\t\t\t${dl_escape_html(item.label)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</li>`;\n\t\t\t});\n\n\t\t\thtml += `</ul>`;\n\t\t}\n\n\t\t// 分组项\n\t\tdata.group_order.forEach(gname => {\n\t\t\tconst items = data.groups[gname];\n\n\t\t\thtml += `\n\t\t\t<div class=\"dl-group\" data-group=\"${dl_idSafe(gname)}\" style=\"margin-bottom:8px;\">\n\t\t\t\t<div class=\"dl-group-title\" data-group-name=\"${dl_idSafe(gname)}\">\n\t\t\t\t\t<span class=\"dl-arrow-right\" id=\"arrow-${cbid}-${dl_idSafe(gname)}\"></span>\n\t\t\t\t\t<b style=\"margin-left:6px;\">${dl_escape_html(gname)}</b>\n\t\t\t\t\t<span id=\"group-count-${cbid}-${dl_idSafe(gname)}\"\n\t\t\t\t\t\tstyle=\"margin-left:8px;\">(${items.length})</span>\n\t\t\t\t</div>\n\t\t\t\t<ul id=\"group-${cbid}-${dl_idSafe(gname)}\" class=\"dl-group-list\" style=\"display:none\">\n\t\t\t`;\n\n\t\t\titems.forEach(item => {\n\t\t\t\thtml += `\n\t\t\t\t<li data-key=\"${item.key}\"\n\t\t\t\t\tdata-node-name=\"${dl_escape_html(item.label.toLowerCase())}\"\n\t\t\t\t\tclass=\"dl-group-item\">\n\t\t\t\t\t<span class=\"dl-item-label\" title=\"${dl_escape_html(item.label)}\">\n\t\t\t\t\t\t${dl_escape_html(item.label)}\n\t\t\t\t\t</span>\n\t\t\t\t</li>`;\n\t\t\t});\n\n\t\t\thtml += `\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t\t`;\n\t\t});\n\n\t\tlistContainer.innerHTML = html;\n\n\t\twindow.dl_dropdown_rendered[cbid] = true;\n\n\t\tdl_adaptiveStyle(cbid);\n\n\t\t// 点击项（无组与组内项都使用 li[data-key]）\n\t\tlistContainer.addEventListener(\"click\", function(e){\n\t\t\tlet li = e.target;\n\t\t\twhile(li && li !== listContainer && !li.hasAttribute('data-key')) li = li.parentNode;\n\t\t\tif(!li || li === listContainer) return;\n\t\t\tconst key = li.getAttribute('data-key') || \"\";\n\t\t\tconst text = li.querySelector(\".dl-item-label\")?.textContent || li.textContent || key;\n\t\t\t//改值\n\t\t\tdl_add_item(cbid, key, text);\n\t\t\tlabelSpan.innerText = \"<%=translate(\"-- Please choose --\")%>\";\n\t\t\tdl_closePanel(cbid,panel,listContainer,searchInput);\n\t\t});\n\n\t\t// 搜索功能\n\t\tsearchInput.addEventListener(\"input\", function() {\n\t\t\tdl_filterList(this.value, cbid, listContainer, searchInput);\n\t\t\tdl_repositionPanel(panel, display);\n\t\t});\n\t\tsearchInput.addEventListener('keydown', function(e) {\n\t\t\tconst isEnter = e.key === \"Enter\" || e.keyCode === 13;\n\t\t\tif (!isEnter) return;\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tsearchInput.blur();\n\t\t});\n\n\t\t// 切换组\n\t\tlistContainer.querySelectorAll(\".dl-group-title\").forEach(title => {\n\t\t\ttitle.addEventListener(\"click\", function() {\n\t\t\t\tconst g = this.closest(\".dl-group\")?.getAttribute(\"data-group\");\n\t\t\t\tif (g) {\n\t\t\t\t\tdl_toggleGroup(listContainer, cbid, g);\n\t\t\t\t\tdl_repositionPanel(panel, display);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t// 防止 panel 惯性滚动穿透\n\t\tpanel.addEventListener('wheel', function (e) {\n\t\t\tconst deltaY = e.deltaY;\n\t\t\tconst scrollTop = panel.scrollTop;\n\t\t\tconst scrollHeight = panel.scrollHeight;\n\t\t\tconst clientHeight = panel.clientHeight;\n\t\t\tconst isAtTop = scrollTop === 0;\n\t\t\tconst isAtBottom = scrollTop + clientHeight >= scrollHeight;\n\t\t\tif (deltaY < 0 && isAtTop) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (deltaY > 0 && isAtBottom) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.stopPropagation();\n\t\t}, { passive: false });\n\t}\n\n\tconst dl_adaptiveControls = new Set();\n\tfunction dl_registerAdaptive(cbid) {\n\t\tdl_adaptiveControls.add(cbid);\n\t\tdl_adaptiveStyle(cbid);\n\t}\n\tlet dl_adaptiveTicking = false;\n\twindow.addEventListener(\"resize\", () => {\n\t\tif (!dl_adaptiveTicking) {\n\t\t\tdl_adaptiveTicking = true;\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tdl_adaptiveControls.forEach(cbid => {\n\t\t\t\t\tdl_adaptiveStyle(cbid);\n\t\t\t\t});\n\t\t\t\tdl_adaptiveTicking = false;\n\t\t\t});\n\t\t}\n\t});\n//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_listvalue.htm",
    "content": "<%+cbi/valueheader%>\n<%\n--\tTemplate Developers:\n--\t\t- lwb1978\n--\t\t- snowie2000\n--\tCopyright: copyright(c)2025–2027\n--\tDescription: Passwall(2) UI template\n\nlocal json = require \"luci.jsonc\"\n\n-- 读取值（keylist/vallist/group）\nlocal values = {}\nfor i, key in pairs(self.keylist) do\n\tvalues[#values + 1] = {\n\t\tkey = key,\n\t\tlabel = self.vallist[i] or key,\n\t\tgroup = self.group and self.group[i] or nil\n\t}\nend\n\n-- 获取当前配置值（单值）\nlocal current_key = nil\nlocal cval = self:cfgvalue(section)\nif type(cval) == \"table\" then\n\t-- 若意外为table，取第一个\n\tfor k,_ in pairs(cval) do\n\t\tcurrent_key = k\n\t\tbreak\n\tend\nelseif type(cval) == \"string\" then\n\tcurrent_key = (cval:match(\"%S+\")) -- 取第一个 token\nend\n\n-- 分离无组节点（ungrouped）与有组节点（grouped），并保持原有顺序\nlocal ungrouped = {}\nlocal groups = {}\nlocal group_order = {}\nfor _, item in ipairs(values) do\n\tif not item.group or item.group == \"\" then\n\t\ttable.insert(ungrouped, item)\n\telse\n\t\tlocal g = item.group\n\t\tif not groups[g] then\n\t\t\tgroups[g] = {}\n\t\t\ttable.insert(group_order, g)\n\t\tend\n\t\ttable.insert(groups[g], item)\n\tend\nend\n\n-- 如果没有配置值，默认取第一个（优先无组第一项，否则第一组第一项）\nif not current_key then\n\tif #ungrouped > 0 then\n\t\tcurrent_key = ungrouped[1].key\n\telse\n\t\t-- 找到 group_order 第一个有节点的项\n\t\tfor _, g in ipairs(group_order) do\n\t\t\tif groups[g] and #groups[g] > 0 then\n\t\t\t\tcurrent_key = groups[g][1].key\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\tend\nend\n\n-- 获取当前 label（用于主控件显示）\nlocal function find_label_by_key(k)\n\tif not k then return \"\" end\n\tfor _, v in ipairs(values) do\n\t\tif v.key == k then return v.label end\n\tend\n\treturn \"\"\nend\nlocal current_label = find_label_by_key(current_key) or \"\"\n\n-- 打包数据给 JS\nlocal dropdown_data = {\n\tcurrent_key = current_key,\n\tcurrent_label = current_label,\n\tungrouped = ungrouped,\n\tgroups = groups,\n\tgroup_order = group_order,\n\tcbid = cbid,\n}\n%>\n<script>\nwindow.lv_dropdown_data = window.lv_dropdown_data || {};\nwindow.lv_dropdown_data[\"<%=cbid%>\"] = <%=json.stringify(dropdown_data)%>;\n</script>\n\n<div id=\"<%=cbid%>.main\" class=\"lv-dropdown-container\">\n\t<!-- 隐藏 select（保存实际配置值） -->\n\t<select id=\"<%=cbid%>\" name=\"<%=cbid%>\" class=\"cbi-input-select\" data-update=\"change\" style=\"display:none !important;\">\n\t\t<option value=\"<%=current_key%>\" selected=\"selected\">placeholder</option>\n\t</select>\n\t<!-- 模拟 ListValue 控件外观 -->\n\t<div class=\"cbi-input-value cbi-input-select lv-dropdown-display\" id=\"<%=cbid%>.display\" tabindex=\"0\">\n\t\t<span id=\"<%=cbid%>.label\" class=\"lv-dropdown-label\" title=\"<%=pcdata(current_label)%>\">\n\t\t\t<%=pcdata(\"(\"..translate(\"Not set\")..\")\")%>\n\t\t</span>\n\t\t<span class=\"lv-arrow-down\"></span>\n\t</div>\n\t<!-- 下拉面板 -->\n\t<div id=\"<%=cbid%>.panel\" class=\"cbi-listvalue-panel lv-dropdown-panel\" style=\"display:none;\">\n\t\t<!-- 搜索框 -->\n\t\t<div style=\"padding:8px;border-bottom:1px solid #f0f0f0;\">\n\t\t\t<input id=\"<%=cbid%>.search\" class=\"cbi-input-text lv-dropdown-search\" type=\"text\" placeholder=\"🔍 <%:Search nodes...%>\" inputmode=\"search\" enterkeyhint=\"done\" />\n\t\t</div>\n\t\t<!-- 列表容器 -->\n\t\t<div id=\"<%=cbid%>.list\" style=\"padding:8px;\">\n\t\t\t<!-- 首次点击 display 时由 JS 填充 -->\n\t\t</div>\n\t</div>\n</div>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n(function(){\n\tconst cbid = \"<%=cbid%>\";\n\tconst hiddenSelect = document.getElementById(cbid);\n\tconst panel = document.getElementById(cbid + \".panel\");\n\tconst display = document.getElementById(cbid + \".display\");\n\tconst labelSpan = document.getElementById(cbid + \".label\");\n\tconst searchInput = document.getElementById(cbid + \".search\");\n\tconst listContainer = document.getElementById(cbid + \".list\");\n\n\t// 点击 display\n\tdisplay.addEventListener(\"click\", function(e){\n\t\te.stopPropagation();\n\t\tlv_render_dropdown_list(cbid,panel,listContainer,hiddenSelect,labelSpan,searchInput,display);\n\t\tdocument.querySelectorAll(\".cbi-listvalue-panel\").forEach(p=>{\n\t\t\tif (p !== panel) p.style.display = \"none\";\n\t\t});\n\t\tif (panel.style.display !== \"none\") {\n\t\t\tlv_closePanel(cbid,panel,listContainer,hiddenSelect,searchInput);\n\t\t} else {\n\t\t\tlv_openPanel(cbid,display,panel,listContainer,hiddenSelect,searchInput);\n\t\t}\n\t});\n\tlv_registerAdaptive(cbid);\n\tsetTimeout(() => {\n\t\tlabelSpan.textContent = lv_ellipsisByWidth(cbid, '<%=pcdata(current_label ~= \"\" and current_label or (\"(\"..translate(\"Not set\")..\")\"))%>');\n\t}, 100);\n})();\n//]]>\n</script>\n\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_listvalue_com.htm",
    "content": "<%\n--\tTemplate Developers:\n--\t\t- lwb1978\n--\t\t- snowie2000\n--\tCopyright: copyright(c)2025–2027\n--\tDescription: Passwall(2) UI template\n-- It is the common part of the template and cannot be used independently\n%>\n<style>\n/* 主下拉按钮的下箭头 */\n.lv-arrow-down {\n\twidth: 0;\n\theight: 0;\n\tborder-left: 5px solid transparent;\n\tborder-right: 5px solid transparent;\n\tborder-top: 6px solid #666;\n\tmargin-left: 6px;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 组标题的右箭头（折叠） */\n.lv-arrow-right {\n\twidth: 0;\n\theight: 0;\n\tborder-top: 4px solid transparent;\n\tborder-bottom: 4px solid transparent;\n\tborder-left: 5px solid #555;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 组标题的下箭头（展开） */\n.lv-arrow-down-small {\n\twidth: 0;\n\theight: 0;\n\tborder-left: 4px solid transparent;\n\tborder-right: 4px solid transparent;\n\tborder-top: 5px solid #555;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 基础列表项样式 */\n.cbi-listvalue-panel li[data-key] {\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tcursor: pointer;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\ttransition: background-color 0.15s ease;\n}\n/* 鼠标悬停效果 - 使用透明度避免覆盖问题 */\n.cbi-listvalue-panel li[data-key]:hover {\n\tbackground-color: rgba(0, 123, 255, 0.1);\n}\n/* 选中项样式 - 使用更高优先级 */\n.cbi-listvalue-panel li[data-key].is-selected {\n\tbackground-color: #007bff !important;\n\tcolor: white !important;\n\tfont-weight: 600 !important;\n}\n/* 选中项悬停时保持主色调 */\n.cbi-listvalue-panel li[data-key].is-selected:hover {\n\tbackground-color: #0056b3 !important;\n}\n\n.lv-dropdown-container {\n\tdisplay: inline-block;\n\tposition: relative;\n\tmin-width: 220px;\n\twhite-space: nowrap;\n}\n@media (max-width: 1152px) {\n\t.lv-dropdown-container {\n\t\twhite-space: normal;\n\t}\n}\n@media (max-width: 600px) {\n\t.lv-dropdown-container {\n\t\tdisplay: block;\n\t\twhite-space: normal;\n\t}\n}\n\n.lv-dropdown-display {\n\tcursor: pointer;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tbox-sizing: border-box;\n}\n.lv-dropdown-label {\n\tdisplay: inline-block;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\twidth: 100%;\n\ttext-align: left;\n}\n.lv-dropdown-panel {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tz-index: 2147483647;\n\tborder: 1px solid #dcdcdc;\n\tborder-radius: 4px;\n\tbox-shadow: 0 6px 18px rgba(0,0,0,0.08);\n\tmax-height: 50vh;\n\toverflow: auto;\n\toverscroll-behavior: contain;\n}\n.lv-dropdown-search {\n\twidth: 100%;\n\tmax-width: 100% !important;\n\tmin-width: 0 !important;\n\tbox-sizing: border-box;\n\tpadding: 6px;\n\tborder: 1px solid #e0e0e0;\n\tborder-radius: 4px;\n}\n.lv-group-title {\n\tcursor: pointer;\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tdisplay: flex;\n\talign-items: center;\n\tline-height: normal;\n\twhite-space: nowrap;\n}\n.lv-group-list {\n\tlist-style: none;\n\tmargin: 6px 0 0 8px;\n\tpadding: 0;\n}\n.lv-group-item {\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tcursor: pointer;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\ttext-align: left !important;\n}\n</style>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n\t// css helper functions\n\tfunction lv_camelToKebab(str) {\n\t\treturn str.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2').toLowerCase()\n\t}\n\n\tfunction lv_style2Css(styleDeclaration, properties) {\n\t\tconst cssRules = properties.map(prop => {\n\t\t\tconst kebabCaseProp = lv_camelToKebab(prop);[1, 5]\n\t\t\tconst value = styleDeclaration[prop]\n\t\t\tif (value) {\n\t\t\t\treturn `${kebabCaseProp}: ${value};`\n\t\t\t}\n\t\t\treturn ''\n\t\t})\n\t\t// Filter out any empty strings and join the rules\n\t\treturn cssRules.filter(Boolean).join(' ')\n\t}\n\n\tconst lv_parseColorToRgba = (function() {\n\t\t// Create canvas and context once (Closure)\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = 1;\n\t\tcanvas.height = 1;\n\t\tconst ctx = canvas.getContext('2d', { willReadFrequently: true });\n\t\treturn function(colorStr) {\n\t\t\tif (!colorStr)\n\t\t\t   return null;\n\t\t\tctx.clearRect(0, 0, 1, 1);\n\t\t\t// 2. Apply the color\n\t\t\tctx.fillStyle = colorStr;\n\t\t\t// 3. Fill a single pixel\n\t\t\tctx.fillRect(0, 0, 1, 1);\n\t\t\t// 4. Extract pixel data [R, G, B, A]\n\t\t\tconst data = ctx.getImageData(0, 0, 1, 1).data;\n\t\t\treturn {\n\t\t\t\tr: data[0],\n\t\t\t\tg: data[1],\n\t\t\t\tb: data[2],\n\t\t\t\t// Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places)\n\t\t\t\ta: Math.round((data[3] / 255) * 1000) / 1000\n\t\t\t};\n\t\t};\n\t})();\n\n\t// Helper to convert back to Hex (for output consistency)\n\tfunction lv_rgbToHex(r, g, b) {\n\t\tconst toHex = (n) => {\n\t\t\tconst hex = Math.max(0, Math.min(255, n)).toString(16)\n\t\t\treturn hex.length === 1 ? '0' + hex : hex\n\t\t}\n\t\treturn `#${toHex(r)}${toHex(g)}${toHex(b)}`\n\t}\n\n\tfunction lv_isTransparent(color) {\n\t\tconst cleanColor = lv_parseColorToRgba(color);\n\t\t// check #RRGGBBAA for transparency\n\t\treturn !cleanColor || (cleanColor.a !== undefined && !cleanColor.a);\n\t}\n\n\tfunction lv_getColorSchema(color) {\n\t\tconst rgb = lv_parseColorToRgba(color);\n\t\tif (!rgb) return 'unknown'; // Handle invalid colors\n\t\t// Calculate YIQ brightness (human eye perception)\n\t\tconst brightness = ((rgb.r * 299) + (rgb.g * 587) + (rgb.b * 114)) / 1000;\n\t\t\n\t\treturn brightness > 128 ? 'light' : 'dark';\n\t}\n\n\tfunction lv_lighter(color, amount) {\n\t\tconst rgb = lv_parseColorToRgba(color);\n\t\tif (!rgb) return color;\n\t\t// Add amount to each channel\n\t\tconst r = rgb.r + amount;\n\t\tconst g = rgb.g + amount;\n\t\tconst b = rgb.b + amount;\n\t\t// Convert back to Hex (clamping happens inside rgbToHex)\n\t\treturn lv_rgbToHex(r, g, b);\n\t}\n\n\tfunction lv_darker(color, amount) {\n\t\tconst rgb = lv_parseColorToRgba(color);\n\t\tif (!rgb) return color;\n\t\t// Subtract amount from each channel\n\t\tconst r = rgb.r - amount;\n\t\tconst g = rgb.g - amount;\n\t\tconst b = rgb.b - amount;\n\n\t\treturn lv_rgbToHex(r, g, b);\n\t}\n\n\t// copy select styles\n\tfunction lv_adaptiveStyle(cbid) {\n\t\tconst display = document.getElementById(cbid + \".display\");\n\t\tconst hiddenSelect = document.getElementById(cbid);\n\t\tconst panel = document.getElementById(cbid + \".panel\");\n\t\tif (hiddenSelect && display) {\n\t\t\tconst elOption = hiddenSelect.getElementsByTagName(\"option\")[0]\n\t\t\tconst styleSelect = window.getComputedStyle(hiddenSelect)\n\t\t\tconst styleOption = window.getComputedStyle(elOption)\n\t\t\tconst styleBody = window.getComputedStyle(document.body)\n\n\t\t\tconst styleNode = document.createElement('style')\n\t\t\tconst styleNames = [\"width\", \"color\", \"height\", \"padding\", \"margin\", \"lineHeight\", \"border\", \"borderRadius\", \"minWidth\", \"minHeight\"]\n\t\t\tif (styleSelect.borderBottomStyle !== \"none\") {\n\t\t\t\tstyleNames.push(\"borderBottomWidth\", \"borderBottomStyle\", \"borderBottomColor\");\n\t\t\t}\n\t\t\tdocument.head.appendChild(styleNode)\n\t\t\t// trace back from option -> select -> body for background color\n\t\t\tconst panelRadius = styleSelect.borderRadius;\n\t\t\tconst optionColor = !lv_isTransparent(styleOption.backgroundColor) ? styleOption.backgroundColor : !lv_isTransparent(styleSelect.backgroundColor) ? styleSelect.backgroundColor : styleBody.backgroundColor\n\t\t\tconst titleColor = lv_getColorSchema(optionColor) === \"light\" ? lv_darker(optionColor, 30) : lv_lighter(optionColor, 30)\n\t\t\tconst selectStyleCSS = [`#${CSS.escape(cbid + \".display\")} {`, lv_style2Css(styleSelect, styleNames), lv_style2Css(styleSelect, [\"backgroundColor\"]), \"}\"]\n\t\t\tconst optionStyleCSS = [`#${CSS.escape(cbid + \".panel\")}  {`, lv_style2Css(styleOption, styleNames), `background-color: ${optionColor};`, `border-radius: ${panelRadius};`, \"}\"]\n\t\t\tconst titleStyleCSS = [`#${CSS.escape(cbid + \".panel\")} .lv-group-title  {`, `background-color: ${titleColor} !important;`, \"}\"]\n\t\t\tstyleNode.textContent = [].concat(selectStyleCSS, optionStyleCSS, titleStyleCSS).join(\"\\n\")\n\t\t}\n\t}\n\n\tfunction lv_idSafe(id) {\n\t\treturn id\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, \"-\")\n\t\t\t.replace(/[\\x00-\\x1F\\x7F]/g, \"\");\n\t}\n\n\t// 高亮当前选中的项\n\tfunction lv_highlightSelectedItem(listContainer, hiddenSelect) {\n\t\tconst allItems = listContainer.querySelectorAll(\"li[data-key]\");\n\t\tconst currentKey = hiddenSelect.options[0].value;\n\t\tallItems.forEach(item => {\n\t\t\titem.classList.remove(\"is-selected\");\n\t\t\tif (item.getAttribute('data-key') === currentKey) {\n\t\t\t\titem.classList.add(\"is-selected\");\n\t\t\t}\n\t\t});\n\t}\n\n\t// 更新组内选中计数\n\tfunction lv_updateGroupCounts(cbid, listContainer, hiddenSelect, searchInput) {\n\t\tconst groups = listContainer.querySelectorAll(\".lv-group\");\n\t\tconst currentKey = hiddenSelect.options[0].value;\n\t\tconst isSearching = searchInput.value.trim() !== \"\";\n\t\tgroups.forEach(group => {\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst items = group.querySelectorAll(\"li[data-key]\");\n\t\t\tconst span = document.getElementById(\"group-count-\" + cbid + \"-\" + gname);\n\t\t\tif (!span) return;\n\t\t\tif (isSearching) {\n\t\t\t\t// 搜索状态：显示匹配数量\n\t\t\t\tlet matchCount = 0;\n\t\t\t\titems.forEach(li => {\n\t\t\t\t\tif (li.style.display !== \"none\") matchCount++;\n\t\t\t\t});\n\t\t\t\tspan.textContent = \"(\" + matchCount + \"/\" + items.length + \")\";\n\t\t\t\tif (matchCount > 0) {\n\t\t\t\t\tspan.style.color = \"#28a745\";\n\t\t\t\t\tspan.style.fontWeight = \"600\";\n\t\t\t\t} else {\n\t\t\t\t\tspan.style.color = \"#dc3545\";\n\t\t\t\t\tspan.style.fontWeight = \"normal\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// 默认状态：显示选中项数量\n\t\t\t\tlet selectedCount = 0;\n\t\t\t\titems.forEach(li => {\n\t\t\t\t\tif (li.getAttribute('data-key') === currentKey) {\n\t\t\t\t\t\tselectedCount = 1;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tspan.textContent = \"(\" + selectedCount + \"/\" + items.length + \")\";\n\t\t\t\tif (selectedCount > 0) {\n\t\t\t\t\tspan.style.color = \"#007bff\";\n\t\t\t\t\tspan.style.fontWeight = \"600\";\n\t\t\t\t} else {\n\t\t\t\t\tspan.style.color = \"\";\n\t\t\t\t\tspan.style.fontWeight = \"normal\";\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t//搜索过滤器：按 name 或 label 做模糊匹配，搜索时自动展开所有组并隐藏不匹配条目\n\tfunction lv_filterList(keyword, cbid, listContainer, hiddenSelect, searchInput) {\n\t\tkeyword = (keyword || \"\").toLowerCase().trim();\n\t\tconst topItems = listContainer.querySelectorAll(\"ul li[data-key]\");\n\t\ttopItems.forEach(li=>{\n\t\t\tconst name = (li.getAttribute(\"data-node-name\") || \"\").toLowerCase();\n\t\t\tif (!keyword || name.indexOf(keyword) !== -1) {\n\t\t\t\tli.style.display = \"block\";\n\t\t\t} else {\n\t\t\t\tli.style.display = \"none\";\n\t\t\t}\n\t\t});\n\t\tconst groups = listContainer.querySelectorAll(\".lv-group\");\n\t\tgroups.forEach(group=>{\n\t\t\tconst items = group.querySelectorAll(\"li[data-key]\");\n\t\t\tlet matchCount = 0;\n\t\t\titems.forEach(li=>{\n\t\t\t\tconst name = (li.getAttribute(\"data-node-name\") || \"\").toLowerCase();\n\t\t\t\tif (!keyword || name.indexOf(keyword) !== -1) {\n\t\t\t\t\tli.style.display = \"block\";\n\t\t\t\t\tmatchCount++;\n\t\t\t\t} else {\n\t\t\t\t\tli.style.display = \"none\";\n\t\t\t\t}\n\t\t\t});\n\t\t\tgroup.style.display = (matchCount === 0 && keyword !== \"\") ? \"none\" : \"block\";\n\t\t\tconst ul = group.querySelector(\".lv-group-list\");\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst arrow = document.getElementById(\"arrow-\" + cbid + \"-\" + gname);\n\t\t\tif (keyword) {\n\t\t\t\tif (ul) ul.style.display = (matchCount > 0 ? \"block\" : \"none\");\n\t\t\t\tif (arrow) arrow.className = (matchCount > 0 ? \"lv-arrow-down-small\" : \"lv-arrow-right\");\n\t\t\t} else {\n\t\t\t\tif (ul) ul.style.display = \"none\";\n\t\t\t\tif (arrow) arrow.className = \"lv-arrow-right\";\n\t\t\t}\n\t\t});\n\t\tlv_updateGroupCounts(cbid, listContainer, hiddenSelect, searchInput);\n\t\tlv_highlightSelectedItem(listContainer, hiddenSelect);\n\t}\n\n\t// 切换单个组（点击组标题）\n\tfunction lv_toggleGroup(listContainer, cbid, g) {\n\t\tg = lv_idSafe(g);\n\t\tconst group = listContainer.querySelector(\".lv-group[data-group='\" + g + \"']\");\n\t\tif (!group) return;\n\t\tconst ul = group.querySelector(\".lv-group-list\");\n\t\tconst arrow = document.getElementById(\"arrow-\" + cbid + \"-\" + g);\n\t\tif (!ul) return;\n\t\tconst searchInput = document.getElementById(cbid + \".search\");\n\t\tconst isSearching = searchInput?.value.trim() !== \"\";\n\t\tconst isExpanded = ul.style.display !== \"none\";\n\n\t\tif (isExpanded) {\n\t\t\tul.style.display = \"none\";\n\t\t\tif (arrow) arrow.className = \"lv-arrow-right\";\n\t\t} else {\n\t\t\tul.style.display = \"block\";\n\t\t\tif (arrow) arrow.className = \"lv-arrow-down-small\";\n\n\t\t\tif (!isSearching) {\n\t\t\t\tconst allGroups = listContainer.querySelectorAll(\".lv-group\");\n\t\t\t\tallGroups.forEach(otherGroup => {\n\t\t\t\t\tif (otherGroup !== group) {\n\t\t\t\t\t\tconst otherUl = otherGroup.querySelector(\".lv-group-list\");\n\t\t\t\t\t\tconst otherGname = otherGroup.getAttribute(\"data-group\");\n\t\t\t\t\t\tconst otherArrow = document.getElementById(\"arrow-\" + cbid + \"-\" + otherGname);\n\t\t\t\t\t\tif (otherUl) otherUl.style.display = \"none\";\n\t\t\t\t\t\tif (otherArrow) otherArrow.className = \"lv-arrow-right\";\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// 展开包含当前 hiddenSelect 值的组（初始化或打开面板时使用）\n\tfunction lv_expandGroupOfCurrent(cbid, listContainer, hiddenSelect) {\n\t\tconst key = hiddenSelect.options[0].value;\n\t\tif (!key) return;\n\t\tconst targetLi = listContainer.querySelector(\"li[data-key='\" + key.replace(/'/g,\"\\\\'\") + \"']\");\n\t\tif (!targetLi) return;\n\t\tlet parentGroup = targetLi.closest(\".lv-group\");\n\t\tif (parentGroup) {\n\t\t\tconst ul = parentGroup.querySelector(\".lv-group-list\");\n\t\t\tconst gname = parentGroup.getAttribute(\"data-group\");\n\t\t\tconst arrow = document.getElementById(\"arrow-\" + cbid + \"-\" + gname);\n\t\t\tif (ul) ul.style.display = \"block\";\n\t\t\tif (arrow) arrow.className = \"lv-arrow-down-small\";\n\t\t\tconst allGroups = listContainer.querySelectorAll(\".lv-group\");\n\t\t\tallGroups.forEach(gp=>{\n\t\t\t\tif (gp !== parentGroup) {\n\t\t\t\t\tconst gul = gp.querySelector(\".lv-group-list\");\n\t\t\t\t\tconst otherGname = gp.getAttribute(\"data-group\");\n\t\t\t\t\tconst gar = document.getElementById(\"arrow-\" + cbid + \"-\" + otherGname);\n\t\t\t\t\tif (gul) gul.style.display = \"none\";\n\t\t\t\t\tif (gar) gar.className = \"lv-arrow-right\";\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tconst allGroups = listContainer.querySelectorAll(\".lv-group\");\n\t\t\tallGroups.forEach(gp=>{\n\t\t\t\tconst gul = gp.querySelector(\".lv-group-list\");\n\t\t\t\tconst gname = gp.getAttribute(\"data-group\");\n\t\t\t\tconst gar = document.getElementById(\"arrow-\" + cbid + \"-\" + gname);\n\t\t\t\tif (gul) gul.style.display = \"none\";\n\t\t\t\tif (gar) gar.className = \"lv-arrow-right\";\n\t\t\t});\n\t\t}\n\t\tif (targetLi) {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\ttargetLi.scrollIntoView({ block: \"nearest\" });\n\t\t\t});\n\t\t}\n\t}\n\n\t// 计算panel位置\n\tfunction lv_repositionPanel(panel, display) {\n\t\tif (!panel || panel.style.display === \"none\") return;\n\t\tconst rect = display.getBoundingClientRect();\n\t\tconst viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n\t\tpanel.style.visibility = \"hidden\";\n\t\tpanel.style.display = \"block\";\n\t\tpanel.style.minHeight = \"100px\";\n\t\tpanel.style.maxHeight = Math.min(0.5*viewportHeight, 550) + \"px\";\n\t\tconst panelHeight = panel.offsetHeight;\n\t\tconst spaceBelow = viewportHeight - rect.bottom;\n\t\tconst spaceAbove = rect.top;\n\t\tlet top, isUp = false;\n\t\tif (spaceBelow >= panelHeight) {\n\t\t\ttop = rect.bottom + 2;\n\t\t\tisUp = false;\n\t\t} else if (spaceAbove >= panelHeight) {\n\t\t\ttop = rect.top - panelHeight - 2;\n\t\t\tisUp = true;\n\t\t} else {\n\t\t\tif (spaceBelow >= spaceAbove) {\n\t\t\t\ttop = Math.max(rect.bottom - 2, viewportHeight - panelHeight - 2);\n\t\t\t\tisUp = false;\n\t\t\t} else {\n\t\t\t\ttop = Math.min(rect.top - panelHeight + 2, 2);\n\t\t\t\tisUp = true;\n\t\t\t}\n\t\t}\n\t\tpanel.style.left = rect.left + \"px\";\n\t\tpanel.style.top = top + \"px\";\n\t\tconst panelRect = panel.getBoundingClientRect();\n\t\tconst displayWidth = rect.width;\n\t\tconst remainingWidth = window.innerWidth - panelRect.left - 12;\n\t\tconst maxWidth = Math.max(displayWidth, Math.floor(remainingWidth));\n\t\tpanel.style.maxWidth = maxWidth + \"px\";\n\t\tpanel.style.minWidth = displayWidth + \"px\";\n\t\tpanel.style.width = \"auto\";\n\t\tpanel.style.visibility = \"\";\n\t}\n\n\t// 打开/关闭面板\n\tfunction lv_openPanel(cbid, display, panel, listContainer, hiddenSelect, searchInput) {\n\t\tif (!panel._moved) {\n\t\t\tdocument.body.appendChild(panel);\n\t\t\tpanel._moved = true;\n\t\t}\n\t\tlv_expandGroupOfCurrent(cbid, listContainer, hiddenSelect);\n\t\tlv_highlightSelectedItem(listContainer, hiddenSelect);\n\t\tpanel.style.display = \"block\";\n\t\tlv_repositionPanel(panel, display);\n\t\t// 失焦监听\n\t\tconst handler = function(e){\n\t\t\tconst target = e.target;\n\t\t\tif (panel.style.display !== \"none\") {\n\t\t\t\tif (!panel.contains(target) && !display.contains(target)) {\n\t\t\t\t\tlv_closePanel(cbid, panel, listContainer, hiddenSelect, searchInput, display);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tpanel._docClickHandler = handler;\n\t\tdocument.addEventListener(\"click\", handler);\n\t\t// 滚动 / resize 自动 reposition\n\t\tlet ticking = false;\n\t\tconst repositionHandler = function () {\n\t\t\tif (ticking) return;\n\t\t\tticking = true;\n\t\t\trequestAnimationFrame(function () {\n\t\t\t\tticking = false;\n\t\t\t\tlv_repositionPanel(panel, display);\n\t\t\t});\n\t\t};\n\t\tpanel._repositionHandler = repositionHandler;\n\t\twindow.addEventListener(\"scroll\", repositionHandler, true);\n\t\twindow.addEventListener(\"resize\", repositionHandler);\n\t}\n\tfunction lv_closePanel(cbid, panel, listContainer, hiddenSelect, searchInput) {\n\t\tpanel.style.display = \"none\";\n\t\tsearchInput.value = \"\";\n\t\tlv_filterList(\"\", cbid, listContainer, hiddenSelect, searchInput);\n\t\t// document click\n\t\tif (panel._docClickHandler) {\n\t\t\tdocument.removeEventListener(\"click\", panel._docClickHandler);\n\t\t\tpanel._docClickHandler = null;\n\t\t}\n\t\t// scroll / resize\n\t\tif (panel._repositionHandler) {\n\t\t\twindow.removeEventListener(\"scroll\", panel._repositionHandler, true);\n\t\t\twindow.removeEventListener(\"resize\", panel._repositionHandler);\n\t\t\tpanel._repositionHandler = null;\n\t\t}\n\t}\n\n\t// 动态生成下拉框\n\twindow.lv_dropdown_rendered = {};\n\tfunction lv_escape_html(s) {\n\t\treturn s.replace(/[&<>\"']/g, c => ({\n\t\t\t\"&\":\"&amp;\", \"<\":\"&lt;\", \">\":\"&gt;\", '\"':\"&quot;\", \"'\":\"&#39;\"\n\t\t}[c]));\n\t}\n\t\n\tfunction lv_change(cbid, listContainer, hiddenSelect, labelSpan, searchInput, new_key, new_text) {\n\t\t//改值\n\t\thiddenSelect.options[0].value = new_key;\n\t\thiddenSelect.options[0].text = new_key;\n\t\thiddenSelect.value = new_key;\n\t\tlabelSpan.textContent = lv_ellipsisByWidth(cbid, new_text);\n\t\tlabelSpan.title = new_text;\n\t\tlv_highlightSelectedItem(listContainer, hiddenSelect);\n\t\tlv_updateGroupCounts(cbid, listContainer, hiddenSelect, searchInput);\n\t}\n\t\n\tfunction lv_render_dropdown_list(cbid, panel, listContainer, hiddenSelect, labelSpan, searchInput, display) {\n\t\tif (window.lv_dropdown_rendered[cbid]) return;\n\t\tconst data = window.lv_dropdown_data[cbid];\n\t\tif (!data) return;\n\t\tif (!listContainer) return;\n\n\t\tlet html = \"\";\n\n\t\t// 无组项\n\t\tif (data.ungrouped && data.ungrouped.length > 0) {\n\t\t\thtml += `<ul style=\"list-style:none;padding:0;margin:0 0 8px 0;\">`;\n\n\t\t\tdata.ungrouped.forEach(item => {\n\t\t\t\thtml += `\n\t\t\t\t\t<li data-key=\"${item.key}\"\n\t\t\t\t\t\tdata-node-name=\"${lv_escape_html(item.label.toLowerCase())}\"\n\t\t\t\t\t\tclass=\"list-item\">\n\t\t\t\t\t\t<span class=\"lv-item-label\" style=\"margin-left:12px;\">\n\t\t\t\t\t\t\t${lv_escape_html(item.label)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</li>`;\n\t\t\t});\n\n\t\t\thtml += `</ul>`;\n\t\t}\n\n\t\t// 分组项\n\t\tdata.group_order.forEach(gname => {\n\t\t\tconst items = data.groups[gname];\n\n\t\t\thtml += `\n\t\t\t<div class=\"lv-group\" data-group=\"${lv_idSafe(gname)}\" style=\"margin-bottom:8px;\">\n\t\t\t\t<div class=\"lv-group-title\" data-group-name=\"${lv_idSafe(gname)}\">\n\t\t\t\t\t<span class=\"lv-arrow-right\" id=\"arrow-${cbid}-${lv_idSafe(gname)}\"></span>\n\t\t\t\t\t<b style=\"margin-left:6px;\">${lv_escape_html(gname)}</b>\n\t\t\t\t\t<span id=\"group-count-${cbid}-${lv_idSafe(gname)}\"\n\t\t\t\t\t\tstyle=\"margin-left:8px;\">(0/${items.length})</span>\n\t\t\t\t</div>\n\t\t\t\t<ul id=\"group-${cbid}-${lv_idSafe(gname)}\" class=\"lv-group-list\" style=\"display:none\">\n\t\t\t`;\n\n\t\t\titems.forEach(item => {\n\t\t\t\thtml += `\n\t\t\t\t<li data-key=\"${item.key}\"\n\t\t\t\t\tdata-node-name=\"${lv_escape_html(item.label.toLowerCase())}\"\n\t\t\t\t\tclass=\"lv-group-item\">\n\t\t\t\t\t<span class=\"lv-item-label\" title=\"${lv_escape_html(item.label)}\">\n\t\t\t\t\t\t${lv_escape_html(item.label)}\n\t\t\t\t\t</span>\n\t\t\t\t</li>`;\n\t\t\t});\n\n\t\t\thtml += `\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t\t`;\n\t\t});\n\n\t\tlistContainer.innerHTML = html;\n\n\t\twindow.lv_dropdown_rendered[cbid] = true;\n\n\t\tlv_adaptiveStyle(cbid);\n\t\tlv_updateGroupCounts(cbid, listContainer, hiddenSelect, searchInput);\n\n\t\t// 点击项（无组与组内项都使用 li[data-key]）\n\t\tlistContainer.addEventListener(\"click\", function(e){\n\t\t\tlet li = e.target;\n\t\t\twhile(li && li !== listContainer && !li.hasAttribute('data-key')) li = li.parentNode;\n\t\t\tif(!li || li === listContainer) return;\n\t\t\tconst key = li.getAttribute('data-key') || \"\";\n\t\t\tconst text = li.querySelector(\".lv-item-label\")?.textContent || li.textContent || key;\n\n\t\t\tconst changed = key !== hiddenSelect.value;\n\t\t\tif (changed) {\n\t\t\t\t//改值\n\t\t\t\tlv_change(cbid, listContainer, hiddenSelect, labelSpan, searchInput, key, text);\n\t\t\t}\n\t\t\tlv_closePanel(cbid,panel,listContainer,hiddenSelect,searchInput);\n\t\t\tif (changed) {\n\t\t\t\tsetTimeout(() => {\n\t\t\t\t\thiddenSelect.dispatchEvent(new Event('change', { bubbles: true }));\n\t\t\t\t}, 0);\n\t\t\t}\n\t\t});\n\n\t\t// 搜索功能\n\t\tsearchInput.addEventListener(\"input\", function() {\n\t\t\tlv_filterList(this.value, cbid, listContainer, hiddenSelect, searchInput);\n\t\t\tlv_repositionPanel(panel, display);\n\t\t});\n\t\tsearchInput.addEventListener('keydown', function(e) {\n\t\t\tconst isEnter = e.key === \"Enter\" || e.keyCode === 13;\n\t\t\tif (!isEnter) return;\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tsearchInput.blur();\n\t\t});\n\n\t\t// 切换组\n\t\tlistContainer.querySelectorAll(\".lv-group-title\").forEach(title => {\n\t\t\ttitle.addEventListener(\"click\", function() {\n\t\t\t\tconst g = this.closest(\".lv-group\")?.getAttribute(\"data-group\");\n\t\t\t\tif (g) {\n\t\t\t\t\tlv_toggleGroup(listContainer, cbid, g);\n\t\t\t\t\tlv_repositionPanel(panel, display);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t// 防止 panel 惯性滚动穿透\n\t\tpanel.addEventListener('wheel', function (e) {\n\t\t\tconst deltaY = e.deltaY;\n\t\t\tconst scrollTop = panel.scrollTop;\n\t\t\tconst scrollHeight = panel.scrollHeight;\n\t\t\tconst clientHeight = panel.clientHeight;\n\t\t\tconst isAtTop = scrollTop === 0;\n\t\t\tconst isAtBottom = scrollTop + clientHeight >= scrollHeight;\n\t\t\tif (deltaY < 0 && isAtTop) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (deltaY > 0 && isAtBottom) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.stopPropagation();\n\t\t}, { passive: false });\n\t}\n\n\t//截断display字符长度\n\twindow.lv_labelSpan_maxWidth = {};\n\tfunction lv_ellipsisByWidth(cbid, text) {\n\t\tconst el = document.getElementById(cbid + \".label\");\n\t\tif (!el || !text) return text;\n\t\ttext = text.trim();\n\t\tconst maxWidth = el.clientWidth;\n\t\twindow.lv_labelSpan_maxWidth[cbid] = maxWidth;\n\t\tif (maxWidth <= 0) return text;\n\t\tconst style = window.getComputedStyle(el);\n\t\tconst font = [\n\t\t\tstyle.fontStyle,\n\t\t\tstyle.fontVariant,\n\t\t\tstyle.fontWeight,\n\t\t\tstyle.fontSize || '16px',\n\t\t\tstyle.fontFamily || 'sans-serif'\n\t\t].join(\" \").replace(/\\s+/g, ' ');\n\t\tconst canvas = lv_ellipsisByWidth._canvas || (lv_ellipsisByWidth._canvas = document.createElement(\"canvas\"));\n\t\tconst ctx = canvas.getContext(\"2d\");\n\t\tctx.font = font;\n\t\tif (ctx.measureText(text).width <= maxWidth) {\n\t\t\treturn text;\n\t\t}\n\t\tconst ellipsis = \"...\";\n\t\tconst ellipsisWidth = ctx.measureText(ellipsis).width;\n\t\tconst minChars = 15;\n\t\tconst probe = text.slice(0, minChars);\n\t\tconst probeWidth = ctx.measureText(probe).width;\n\t\tif (probeWidth + ellipsisWidth > maxWidth) {\n\t\t\treturn text;\n\t\t}\n\t\tlet left = 0;\n\t\tlet right = text.length;\n\t\tlet result = ellipsis;\n\t\twhile (left <= right) {\n\t\t\tconst mid = (left + right) >> 1;\n\t\t\tconst substr = text.slice(0, mid);\n\t\t\tconst w = ctx.measureText(substr).width;\n\t\t\tif (w + ellipsisWidth <= maxWidth) {\n\t\t\t\tresult = substr + ellipsis;\n\t\t\t\tleft = mid + 1;\n\t\t\t} else {\n\t\t\t\tright = mid - 1;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tconst lv_adaptiveControls = new Set();\n\tfunction lv_registerAdaptive(cbid) {\n\t\tlv_adaptiveControls.add(cbid);\n\t\tlv_adaptiveStyle(cbid);\n\t}\n\tfunction lv_labelSpanResize(cbid) {\n\t\tconst el = document.getElementById(cbid + \".label\");\n\t\tif (!el) return;\n\t\tconst maxWidth = el.clientWidth;\n\t\tif (window.lv_labelSpan_maxWidth[cbid] == maxWidth) return;\n\t\tlet text = el.title;\n\t\tel.textContent = lv_ellipsisByWidth(cbid, text);\n\t}\n\tlet lv_adaptiveTicking = false;\n\twindow.addEventListener(\"resize\", () => {\n\t\tif (!lv_adaptiveTicking) {\n\t\t\tlv_adaptiveTicking = true;\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tlv_adaptiveControls.forEach(cbid => {\n\t\t\t\t\tlv_adaptiveStyle(cbid);\n\t\t\t\t\tlv_labelSpanResize(cbid);\n\t\t\t\t});\n\t\t\t\tlv_adaptiveTicking = false;\n\t\t\t});\n\t\t}\n\t});\n//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_multivalue.htm",
    "content": "<%+cbi/valueheader%>\n<%\n--\tTemplate Developers:\n--\t\t- lwb1978\n--\tCopyright: copyright(c)2025–2027\n--\tDescription: Passwall(2) UI template\nlocal json = require \"luci.jsonc\"\nlocal cbid = \"cbid.\" .. self.config .. \".\" .. section .. \".\" .. self.option\n\n-- 读取 MultiValue\nlocal values = {}\nfor i, key in pairs(self.keylist) do\n\tvalues[#values + 1] = {\n\t\tkey = key,\n\t\tlabel = self.vallist[i] or key,\n\t\tgroup = self.group and self.group[i] or nil\n\t}\nend\n\n-- 获取选中值\nlocal selected = {}\nlocal cval = self:cfgvalue(section)\nif type(cval) == \"table\" then\n\tfor _, v in pairs(cval) do\n\t\tselected[v] = true\n\tend\nelseif type(cval) == \"string\" then\n\tfor v in cval:gmatch(\"%S+\") do\n\t\tselected[v] = true\n\tend\nend\n\n-- 按原顺序分组\nlocal groups = {}\nlocal group_order = {}\nfor _, item in ipairs(values) do\n\tlocal g = item.group\n\tif not g or g == \"\" then \n\t\tg = translate(\"default\") \n\tend\n\tif not groups[g] then \n\t\tgroups[g] = {}\n\t\ttable.insert(group_order, g)\n\tend\n\ttable.insert(groups[g], item)\nend\n\nlocal total_count = #values\nlocal selected_count = 0\nfor _, item in ipairs(values) do\n\tif selected[item.key] then\n\t\tselected_count = selected_count + 1\n\tend\nend\n\nlocal function idSafe(id)\n\treturn (id\n\t\t:gsub(\"^%s+\", \"\")\n\t\t:gsub(\"%s+$\", \"\")\n\t\t:gsub(\"%s+\", \"-\")\n\t\t:gsub(\"[%z\\1-\\31\\127]\", \"\")\n\t)\nend\n%>\n\n<div id=\"<%=cbid%>\" class=\"cbi-input-select\" style=\"display:inline-block;\">\n\t<select id=\"<%=cbid%>.ref\" class=\"cbi-input-select\" style=\"display:none !important;\">\n\t\t<option value>placeholder</option>\n\t</select>\n\t<!-- 搜索框 -->\n\t<input type=\"text\" id=\"<%=cbid%>.search\"\n\t\tclass=\"mv_search_input cbi-input-text\"\n\t\tplaceholder=\"🔍 <%:Search nodes...%>\" inputmode=\"search\" enterkeyhint=\"done\" />\n\t<!-- 主容器 -->\n\t<div class=\"mv_list_container\" id=\"<%=cbid%>.panel\">\n\t\t<ul class=\"cbi-multi mv_node_list\" id=\"<%=cbid%>.node_list\">\n\t\t\t<% for _, gname in ipairs(group_order) do local items = groups[gname] %>\n\t\t\t<li class=\"group-block\" data-group=\"<%=idSafe(gname)%>\">\n\t\t\t\t<!-- 组标题 -->\n\t\t\t\t<div class=\"group-title\">\n\t\t\t\t\t<span id=\"arrow-<%=self.option%>-<%=idSafe(gname)%>\" class=\"mv-arrow-right\"></span>\n\t\t\t\t\t<b style=\"margin-left:8px;\"><%=pcdata(gname)%></b>\n\t\t\t\t\t<%\n\t\t\t\t\t\tlocal g_selected = 0\n\t\t\t\t\t\tfor _, it in ipairs(items) do\n\t\t\t\t\t\t\tif selected[it.key] then\n\t\t\t\t\t\t\t\tg_selected = g_selected + 1\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t%>\n\t\t\t\t\t<span id=\"group-count-<%=self.option%>-<%=idSafe(gname)%>\" style=\"margin-left:8px;\">\n\t\t\t\t\t\t(<%=g_selected%>/<%=#items%>)\n\t\t\t\t\t</span>\n\t\t\t\t</div>\n\t\t\t\t<!-- 组内容 -->\n\t\t\t\t<ul id=\"group-<%=self.option%>-<%=idSafe(gname)%>\" class=\"group-items\" style=\"display:none;\"\n\t\t\t\t\tdata-items='<%=json.stringify(items)%>'\n\t\t\t\t\tdata-selected='<%=json.stringify(selected)%>'>\n\t\t\t\t</ul>\n\t\t\t</li>\n\t\t\t<% end %>\n\t\t</ul>\n\t</div>\n\t<!-- 底部控制栏 -->\n\t<div class=\"mv-controls\">\n\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" onclick=\"mv_selectAll('<%=cbid%>','<%=self.option%>',true)\" value=\"<%:Select all%>\">\n\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" onclick=\"mv_selectAll('<%=cbid%>','<%=self.option%>',false)\" value=\"<%:DeSelect all%>\">\n\t\t<span id=\"count-<%=self.option%>\" style=\"color:#666;\"><%:Selected:%> <span style='color:red;'><%=selected_count%>/<%=total_count%></span></span>\n\t</div>\n</div>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n(function(){\n\tconst cbid = \"<%=cbid%>\";\n\tconst opt = \"<%=self.option%>\";\n\tconst searchInput = document.getElementById(cbid + \".search\");\n\tconst nodeList = document.getElementById(cbid + \".node_list\");\n\n\tnodeList.querySelectorAll(\".group-title\").forEach(title => {\n\t\ttitle.addEventListener(\"click\", function() {\n\t\t\tconst g = this.closest(\".group-block\")?.getAttribute(\"data-group\");\n\t\t\tif (g) mv_toggleGroup(opt, nodeList, searchInput, g);\n\t\t});\n\t});\n\n\tmv_multivalue_init(cbid, opt, nodeList, searchInput)\n})();\n//]]>\n</script>\n\n<%+cbi/valuefooter%>"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_multivalue_com.htm",
    "content": "<%\n--\tTemplate Developers:\n--\t\t- lwb1978\n--\tCopyright: copyright(c)2025–2027\n--\tDescription: Passwall(2) UI template\n%>\n\n<style>\n/* 组标题的右箭头 */\n.mv-arrow-right {\n\twidth: 0;\n\theight: 0;\n\tborder-top: 4px solid transparent;\n\tborder-bottom: 4px solid transparent;\n\tborder-left: 5px solid #555;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 组标题的下箭头 */\n.mv-arrow-down-small {\n\twidth: 0;\n\theight: 0;\n\tborder-left: 4px solid transparent;\n\tborder-right: 4px solid transparent;\n\tborder-top: 5px solid #555;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n.mv_search_input {\n\twidth: 100%;\n\tbox-sizing: border-box;\n\tpadding: 6px;\n\tmargin-bottom: 8px;\n\tborder: 1px solid #ccc;\n\tborder-radius: 4px;\n\tmax-height: 36px;\n}\n.mv_list_container {\n\tmax-height: 300px;\n\toverflow: auto;\n\tmargin-bottom: 8px;\n\twhite-space: nowrap;\n}\n.mv_node_list {\n\twidth: 100%;\n\tbox-sizing: border-box;\n\tpadding: 0 !important;\n\tmargin: 0 !important;\n}\n.mv_node_list li.group-block {\n\tlist-style: none;\n\tpadding: 0;\n\tmargin: 0 0 8px 0;\n}\n.mv_node_list .group-title {\n\tcursor: pointer;\n\tdisplay: flex;\n\talign-items: center;\n\tpadding: 6px;\n\tmargin-bottom: 4px;\n\tborder-radius: 4px;\n\twhite-space: nowrap;\n}\n.mv_node_list ul.group-items {\n\tmargin: 0 0 8px 16px;\n\tpadding: 0;\n\tlist-style: none;\n}\n.mv_node_list ul.group-items li.node-item {\n\tlist-style: none;\n\tpadding: 0;\n\tmargin: 0;\n\twhite-space: nowrap;\n\ttext-align: left;\n}\n.mv-node-row {\n\tdisplay: inline-flex;\n\talign-items: center;\n\tvertical-align: middle;\n}\n.mv-node-checkbox {\n\tmargin: 0;\n\tvertical-align: middle;\n\tmargin-right: 6px;\n}\n.mv-node-label {\n\tmargin: 0;\n\tpadding: 0;\n\tvertical-align: middle;\n\tcursor: pointer;\n}\n.mv-controls {\n\tmargin-top: 4px;\n\tdisplay: flex;\n\tgap: 4px;\n\talign-items: center;\n}\n</style>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n\t// css helper functions\n\tfunction mv_camelToKebab(str) {\n\t\treturn str.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2').toLowerCase()\n\t}\n\n\tfunction mv_style2Css(styleDeclaration, properties) {\n\t\tconst cssRules = properties.map(prop => {\n\t\t\tconst kebabCaseProp = mv_camelToKebab(prop);[1, 5]\n\t\t\tconst value = styleDeclaration[prop]\n\t\t\tif (value) {\n\t\t\t\treturn `${kebabCaseProp}: ${value};`\n\t\t\t}\n\t\t\treturn ''\n\t\t})\n\t\t// Filter out any empty strings and join the rules\n\t\treturn cssRules.filter(Boolean).join(' ')\n\t}\n\n\tconst mv_parseColorToRgba = (function() {\n\t\t// Create canvas and context once (Closure)\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = 1;\n\t\tcanvas.height = 1;\n\t\tconst ctx = canvas.getContext('2d', { willReadFrequently: true });\n\t\treturn function(colorStr) {\n\t\t\tif (!colorStr)\n\t\t\t   return null;\n\t\t\tctx.clearRect(0, 0, 1, 1);\n\t\t\t// 2. Apply the color\n\t\t\tctx.fillStyle = colorStr;\n\t\t\t// 3. Fill a single pixel\n\t\t\tctx.fillRect(0, 0, 1, 1);\n\t\t\t// 4. Extract pixel data [R, G, B, A]\n\t\t\tconst data = ctx.getImageData(0, 0, 1, 1).data;\n\t\t\treturn {\n\t\t\t\tr: data[0],\n\t\t\t\tg: data[1],\n\t\t\t\tb: data[2],\n\t\t\t\t// Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places)\n\t\t\t\ta: Math.round((data[3] / 255) * 1000) / 1000\n\t\t\t};\n\t\t};\n\t})();\n\n\t// Helper to convert back to Hex (for output consistency)\n\tfunction mv_rgbToHex(r, g, b) {\n\t\tconst toHex = (n) => {\n\t\t\tconst hex = Math.max(0, Math.min(255, n)).toString(16)\n\t\t\treturn hex.length === 1 ? '0' + hex : hex\n\t\t}\n\t\treturn `#${toHex(r)}${toHex(g)}${toHex(b)}`\n\t}\n\n\tfunction mv_isTransparent(color) {\n\t\tconst cleanColor = mv_parseColorToRgba(color);\n\t\t// check #RRGGBBAA for transparency\n\t\treturn !cleanColor || (cleanColor.a !== undefined && !cleanColor.a);\n\t}\n\n\tfunction mv_getColorSchema(color) {\n\t\tconst rgb = mv_parseColorToRgba(color);\n\t\tif (!rgb) return 'unknown'; // Handle invalid colors\n\t\t// Calculate YIQ brightness (human eye perception)\n\t\tconst brightness = ((rgb.r * 299) + (rgb.g * 587) + (rgb.b * 114)) / 1000;\n\t\t\n\t\treturn brightness > 128 ? 'light' : 'dark';\n\t}\n\n\tfunction mv_lighter(color, amount) {\n\t\tconst rgb = mv_parseColorToRgba(color);\n\t\tif (!rgb) return color;\n\t\t// Add amount to each channel\n\t\tconst r = rgb.r + amount;\n\t\tconst g = rgb.g + amount;\n\t\tconst b = rgb.b + amount;\n\t\t// Convert back to Hex (clamping happens inside rgbToHex)\n\t\treturn mv_rgbToHex(r, g, b);\n\t}\n\n\tfunction mv_darker(color, amount) {\n\t\tconst rgb = mv_parseColorToRgba(color);\n\t\tif (!rgb) return color;\n\t\t// Subtract amount from each channel\n\t\tconst r = rgb.r - amount;\n\t\tconst g = rgb.g - amount;\n\t\tconst b = rgb.b - amount;\n\n\t\treturn mv_rgbToHex(r, g, b);\n\t}\n\n\t// copy select styles\n\tfunction mv_adaptiveStyle(cbid) {\n\t\tconst mainDiv = document.getElementById(cbid);\n\t\tconst hiddenRef = document.getElementById(cbid + \".ref\");\n\t\tconst panel = document.getElementById(cbid + \".panel\");\n\t\tif (hiddenRef && mainDiv) {\n\t\t\tconst elOption = hiddenRef.getElementsByTagName(\"option\")[0]\n\t\t\tconst styleSelect = window.getComputedStyle(hiddenRef)\n\t\t\tconst styleOption = window.getComputedStyle(elOption)\n\t\t\tconst styleBody = window.getComputedStyle(document.body)\n\n\t\t\tconst styleNode = document.createElement('style')\n\t\t\tconst styleNames = [\"width\", \"color\", \"height\", \"margin\", \"lineHeight\", \"borderRadius\", \"minWidth\", \"minHeight\"]\n\n\t\t\tdocument.head.appendChild(styleNode)\n\t\t\t// trace back from option -> select -> body for background color\n\t\t\tconst panelRadius = styleSelect.borderRadius;\n\t\t\tconst optionColor = !mv_isTransparent(styleOption.backgroundColor) ? styleOption.backgroundColor : !mv_isTransparent(styleSelect.backgroundColor) ? styleSelect.backgroundColor : styleBody.backgroundColor\n\t\t\tconst titleColor = mv_getColorSchema(optionColor) === \"light\" ? mv_darker(optionColor, 30) : mv_lighter(optionColor, 30)\n\t\t\tconst selectStyleCSS = [`#${CSS.escape(cbid)} {`, mv_style2Css(styleSelect, styleNames), \"}\"]\n\t\t\tconst optionStyleCSS = [`#${CSS.escape(cbid + \".panel\")}  {`, mv_style2Css(styleOption, styleNames), `background-color: ${optionColor};`, `border-radius: ${panelRadius};`, \"}\"]\n\t\t\tconst titleStyleCSS = [`#${CSS.escape(cbid + \".panel\")} .group-title  {`, `background-color: ${titleColor} !important;`, \"}\"]\n\t\t\tstyleNode.textContent = [].concat(selectStyleCSS, optionStyleCSS, titleStyleCSS).join(\"\\n\")\n\t\t}\n\t}\n\n\tfunction mv_idSafe(id) {\n\t\treturn id\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, \"-\")\n\t\t\t.replace(/[\\x00-\\x1F\\x7F]/g, \"\");\n\t}\n\n\t// 折叠组\n\tfunction mv_toggleGroup(opt, nodeList, searchInput, g) {\n\t\tg = mv_idSafe(g);\n\t\tconst ul = document.getElementById(\"group-\" + opt + \"-\" + g);\n\t\tconst arrow = document.getElementById(\"arrow-\" + opt + \"-\" + g);\n\t\tif (!ul) return;\n\t\t// 判断是否在搜索状态\n\t\tconst keyword = searchInput.value.trim().toLowerCase();\n\t\tconst isSearching = keyword.length > 0;\n\t\t// 搜索状态下，仅切换当前组，不处理其他组\n\t\tif (isSearching){\n\t\t\tul.style.display = ul.style.display === \"none\" ? \"block\" : \"none\";\n\t\t\tif (arrow) arrow.className = ul.style.display === \"none\" ? \"mv-arrow-right\" : \"mv-arrow-down-small\";\n\t\t\treturn;\n\t\t}\n\t\t// 非搜索模式：先折叠其他组\n\t\tnodeList.querySelectorAll(\".group-block\").forEach(group=>{\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst gul = document.getElementById(\"group-\" + opt + \"-\" + gname);\n\t\t\tconst garrow = document.getElementById(\"arrow-\" + opt + \"-\" + gname);\n\t\t\tif (gname !== g) {\n\t\t\t\tif (gul) gul.style.display = \"none\";\n\t\t\t\tif (garrow) garrow.className = \"mv-arrow-right\";\n\t\t\t}\n\t\t});\n\t\tnodeList.parentNode.scrollTop = 0;\n\t\t// 切换当前组\n\t\tul.style.display = ul.style.display === \"none\" ? \"block\" : \"none\";\n\t\tif (arrow) arrow.className = ul.style.display === \"none\" ? \"mv-arrow-right\" : \"mv-arrow-down-small\";\n\t};\n\n\t// 计数\n\tfunction mv_updateCount(opt, nodeList, searchInput) {\n\t\tconst keyword = searchInput.value.trim().toLowerCase();\n\t\tconst isSearching = keyword.length > 0;\n\t\t// 当前实例下的所有 checkbox\n\t\tconst cbs = isSearching \n\t\t\t? Array.from(nodeList.querySelectorAll(\"input[type=checkbox]\")).filter(cb => cb.closest(\"li\").style.display !== \"none\")\n\t\t\t: nodeList.querySelectorAll(\"input[type=checkbox]\");\n\t\tlet checked = 0;\n\t\tcbs.forEach(cb => { if(cb.checked) checked++; });\n\t\t// 更新总计\n\t\tconst totalSpan = document.getElementById(\"count-\" + opt);\n\t\tif (totalSpan) {\n\t\t\ttotalSpan.innerHTML = \"<%:Selected:%> <span style='color:red;'>\" + checked + \"/\" + cbs.length + \"</span>\";\n\t\t}\n\t\t// 更新每个组计数\n\t\tnodeList.querySelectorAll(\".group-block\").forEach(group => {\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst groupCbs = group.querySelectorAll(\"li[data-node-name] input[type=checkbox]\");\n\t\t\tlet groupChecked = 0;\n\t\t\tlet totalCount = 0;\n\t\t\tgroupCbs.forEach(cb => {\n\t\t\t\tconst li = cb.closest(\"li\");\n\t\t\t\t// 搜索时只统计可见节点\n\t\t\t\tif (!isSearching || li.style.display !== \"none\") {\n\t\t\t\t\ttotalCount++;\n\t\t\t\t\tif (cb.checked) groupChecked++;\n\t\t\t\t}\n\t\t\t});\n\t\t\tconst span = document.getElementById(\"group-count-\" + opt + \"-\" + gname);\n\t\t\tif(span) span.textContent = \"(\" + groupChecked + \"/\" + totalCount + \")\";\n\t\t});\n\t}\n\n\t// 搜索\n\tfunction mv_filterGroups(searchInput, opt, nodeList) {\n\t\tconst keyword = searchInput.value.trim().toLowerCase();\n\t\tnodeList.querySelectorAll(\".group-block\").forEach(group => {\n\t\t\tconst items = group.querySelectorAll(\"li[data-node-name]\");\n\t\t\tlet matchCount = 0;\n\t\t\titems.forEach(li => {\n\t\t\t\tconst name = li.getAttribute(\"data-node-name\");\n\t\t\t\tif (!keyword || name.indexOf(keyword) !== -1) {\n\t\t\t\t\tli.style.display = \"\";\n\t\t\t\t\tmatchCount++;\n\t\t\t\t} else {\n\t\t\t\t\tli.style.display = \"none\";\n\t\t\t\t}\n\t\t\t});\n\t\t\t// 搜索时自动展开组\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst ul = document.getElementById(\"group-\" + opt + \"-\" + gname);\n\t\t\tconst arrow = document.getElementById(\"arrow-\" + opt + \"-\" + gname);\n\n\t\t\tif (matchCount === 0 && keyword !== \"\") {\n\t\t\t\tgroup.style.display = \"none\";\n\t\t\t} else {\n\t\t\t\tgroup.style.display = \"\";\n\t\t\t\tif (keyword && ul && arrow) {\n\t\t\t\t\tul.style.display = \"\";\n\t\t\t\t\tarrow.className = \"mv-arrow-down-small\";\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t\tmv_updateCount(opt, nodeList, searchInput);\n\t\t// 清空搜索后恢复全部折叠\n\t\tif (!keyword) {\n\t\t\tmv_collapseAllGroups(opt, nodeList);\n\t\t}\n\t}\n\n\t// 折叠所有组\n\tfunction mv_collapseAllGroups(opt, nodeList) {\n\t\tnodeList.querySelectorAll(\".group-block\").forEach(group => {\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst ul = document.getElementById(\"group-\" + opt + \"-\" + gname);\n\t\t\tconst arrow = document.getElementById(\"arrow-\" + opt + \"-\" + gname);\n\t\t\tif (ul) ul.style.display = \"none\";\n\t\t\tif (arrow) arrow.className = \"mv-arrow-right\";\n\t\t});\n\t}\n\n\twindow.mv_nodeitem_rendered = {};\n\tfunction mv_render_multivalue_list(cbid, opt, nodeList, searchInput) {\n\t\tif (window.mv_nodeitem_rendered[cbid]) return;\n\t\tconst root = document.getElementById(cbid);\n\t\tif (!root) return;\n\t\t// 遍历所有组\n\t\troot.querySelectorAll(\".group-items\").forEach(function(ul) {\n\t\t\t// 组名\n\t\t\tconst gname = ul.id.replace(\"group-\" + opt + \"-\", \"\");\n\t\t\t// 解析 Lua 注入的数据\n\t\t\tconst items    = JSON.parse(ul.dataset.items || \"[]\");\n\t\t\tconst selected = JSON.parse(ul.dataset.selected || \"{}\");\n\t\t\t// 清空\n\t\t\tul.innerHTML = \"\";\n\t\t\t// 列表渲染\n\t\t\titems.forEach(function(item) {\n\t\t\t\t// li\n\t\t\t\tlet li = document.createElement(\"li\");\n\t\t\t\tli.className = \"node-item\";\n\t\t\t\tli.setAttribute(\"data-node-name\", item.label.toLowerCase());\n\t\t\t\tli.title = item.label;\n\t\t\t\t// row div\n\t\t\t\tlet row = document.createElement(\"div\");\n\t\t\t\trow.className = \"mv-node-row\";\n\t\t\t\t// checkbox\n\t\t\t\tlet checkboxId = cbid + \".\" + item.key;\n\t\t\t\tlet checkbox = document.createElement(\"input\");\n\t\t\t\tcheckbox.type = \"checkbox\";\n\t\t\t\tcheckbox.className = \"cbi-input-checkbox mv-node-checkbox\";\n\t\t\t\tcheckbox.id = checkboxId;\n\t\t\t\tcheckbox.name = cbid;\n\t\t\t\tcheckbox.value = item.key;\n\t\t\t\tif (selected[item.key]) checkbox.checked = true;\n\t\t\t\t// label\n\t\t\t\tlet label = document.createElement(\"label\");\n\t\t\t\tlabel.className = \"mv-node-label\";\n\t\t\t\tlabel.htmlFor = checkboxId;\n\t\t\t\tlabel.textContent = item.label;\n\t\t\t\t// 组装\n\t\t\t\trow.appendChild(checkbox);\n\t\t\t\trow.appendChild(label);\n\t\t\t\tli.appendChild(row);\n\t\t\t\tul.appendChild(li);\n\t\t\t});\n\t\t});\n\t\twindow.mv_nodeitem_rendered[cbid] = true;\n\t\tsearchInput.addEventListener(\"input\", function() {\n\t\t\tmv_filterGroups(searchInput, opt, nodeList);\n\t\t});\n\t\tsearchInput.addEventListener('keydown', function(e) {\n\t\t\tconst isEnter = e.key === \"Enter\" || e.keyCode === 13;\n\t\t\tif (!isEnter) return;\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tsearchInput.blur();\n\t\t});\n\t\t// checkbox 改变时更新计数\n\t\tnodeList.addEventListener(\"change\", () => {\n\t\t\tmv_updateCount(opt, nodeList, searchInput);\n\t\t});\n\t}\n\n\t// 全选 / 全不选\n\tfunction mv_selectAll(cbid, opt, flag) {\n\t\tif (!window.mv_nodeitem_rendered[cbid]) return;\n\t\tconst nodeList = document.getElementById(cbid + \".node_list\");\n\t\tconst searchInput = document.getElementById(cbid + \".search\");\n\t\tconst cbs = nodeList.querySelectorAll(\"input[type=checkbox]\");\n\t\tcbs.forEach(cb=>{\n\t\t\tif (cb.offsetParent !== null) cb.checked = flag;\n\t\t});\n\t\tmv_updateCount(opt, nodeList, searchInput);\n\t};\n\n\n\tfunction mv_onControlVisible(cbid, cb) {\n\t\tvar root = document.getElementById(cbid);\n\t\tif (!root) return;\n\t\tvar container = root.closest(\".cbi-value\");\n\t\tif (!container) return;\n\t\tif (container.offsetParent !== null) {\n\t\t\tcb();\n\t\t\treturn;\n\t\t}\n\t\tvar observer = new MutationObserver(function () {\n\t\t\tif (container.offsetParent !== null) {\n\t\t\t\tobserver.disconnect();\n\t\t\t\tcb();\n\t\t\t}\n\t\t});\n\t\tobserver.observe(container, {\n\t\t\tattributes: true,\n\t\t\tattributeFilter: [\"style\", \"class\"]\n\t\t});\n\t}\n\n\tfunction mv_multivalue_init(cbid, opt, nodeList, searchInput) {\n\t\tmv_onControlVisible(cbid, function () {\n\t\t\tvar root = document.getElementById(cbid);\n\t\t\tif (!root || root.dataset.rendered) return;\n\t\t\troot.dataset.rendered = \"1\";\n\t\t\tmv_render_multivalue_list(cbid, opt, nodeList, searchInput)\n\t\t});\n\t\tmv_registerAdaptive(cbid);\n\t}\n\n\tconst mv_adaptiveControls = new Set();\n\tfunction mv_registerAdaptive(cbid) {\n\t\tmv_adaptiveControls.add(cbid);\n\t\tmv_adaptiveStyle(cbid);\n\t}\n\tlet mv_adaptiveTicking = false;\n\twindow.addEventListener(\"resize\", () => {\n\t\tif (!mv_adaptiveTicking) {\n\t\t\tmv_adaptiveTicking = true;\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tmv_adaptiveControls.forEach(cbid => mv_adaptiveStyle(cbid));\n\t\t\t\tmv_adaptiveTicking = false;\n\t\t\t});\n\t\t}\n\t});\n//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_value.htm",
    "content": "<%+cbi/valueheader%>\n<%\n--\tTemplate Developers:\n--\t\t- lwb1978\n--\tCopyright: copyright(c)2025–2027\n--\tDescription: Passwall(2) UI template\n\nlocal json = require \"luci.jsonc\"\n\n-- 读取值（keylist/vallist/group）\nlocal values = {{key = \"\", label = translate(\"-- Please choose --\")}}\nfor i, key in pairs(self.keylist) do\n\tif key and key ~= \"\" then\n\t\tvalues[#values + 1] = {\n\t\t\tkey = key,\n\t\t\tlabel = self.vallist[i] or key,\n\t\t\tgroup = self.group and self.group[i] or nil\n\t\t}\n\tend\nend\n\n-- 获取当前配置值（单值）\nlocal current_key = nil\nlocal cval = self:cfgvalue(section)\nif type(cval) == \"table\" then\n\t-- 若意外为table，取第一个\n\tfor k,_ in pairs(cval) do\n\t\tcurrent_key = k\n\t\tbreak\n\tend\nelseif type(cval) == \"string\" then\n\tcurrent_key = (cval:match(\"%S+\")) -- 取第一个 token\nend\n\n-- 分离无组节点（ungrouped）与有组节点（grouped），并保持原有顺序\nlocal ungrouped = {}\nlocal groups = {}\nlocal group_order = {}\nlocal current_key_added = false\nfor _, item in ipairs(values) do\n\tif not current_key_added and current_key and current_key ~= \"\" and item.key == current_key then\n\t\tcurrent_key_added = true\n\tend\n\tif not item.group or item.group == \"\" then\n\t\ttable.insert(ungrouped, item)\n\telse\n\t\tlocal g = item.group\n\t\tif not groups[g] then\n\t\t\tgroups[g] = {}\n\t\t\ttable.insert(group_order, g)\n\t\tend\n\t\ttable.insert(groups[g], item)\n\tend\nend\nif not current_key_added and current_key and current_key ~= \"\" then\n\ttable.insert(ungrouped, {key = current_key, label = current_key})\nend\n\n-- 如果没有配置值，默认取第一个（优先无组第一项，否则第一组第一项）\nif not current_key then\n\tif #ungrouped > 0 then\n\t\tcurrent_key = ungrouped[1].key\n\telse\n\t\t-- 找到 group_order 第一个有节点的项\n\t\tfor _, g in ipairs(group_order) do\n\t\t\tif groups[g] and #groups[g] > 0 then\n\t\t\t\tcurrent_key = groups[g][1].key\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\tend\nend\n\n-- 获取当前 label（用于主控件显示）\nlocal function find_label_by_key(k)\n\tif not k then return \"\" end\n\tfor _, v in ipairs(values) do\n\t\tif v.key == k then return v.label end\n\tend\n\treturn \"\"\nend\nlocal current_label = find_label_by_key(current_key) or \"\"\n\n-- 打包数据给 JS\nlocal dropdown_data = {\n\tcurrent_key = current_key,\n\tcurrent_label = current_label,\n\tungrouped = ungrouped,\n\tgroups = groups,\n\tgroup_order = group_order,\n\tcbid = cbid,\n}\n%>\n<script>\nwindow.v_dropdown_data = window.v_dropdown_data || {};\nwindow.v_dropdown_data[\"<%=cbid%>\"] = <%=json.stringify(dropdown_data)%>;\n</script>\n\n<div id=\"<%=cbid%>.v-main\" class=\"v-dropdown-container\">\n\t<select id=\"<%=cbid%>.ref\" class=\"cbi-input-select\" style=\"display:none !important;\">\n\t\t<option value>placeholder</option>\n\t</select>\n\t<!-- 隐藏 input（保存实际配置值） -->\n \t<input type=\"text\" id=\"<%=cbid%>\" name=\"<%=cbid%>\" value=\"<%=current_key%>\" data-update=\"change\" style=\"display:none !important;\" />\n\t<!-- 模拟 ListValue 控件外观 -->\n\t<div class=\"cbi-input-value cbi-input-select v-dropdown-display\" id=\"<%=cbid%>.display\" tabindex=\"0\">\n\t\t<span id=\"<%=cbid%>.label\" class=\"v-dropdown-label\" title=\"<%=pcdata(current_label)%>\">\n\t\t\t<%=pcdata(translate(\"-- Please choose --\"))%>\n\t\t</span>\n\t\t<span class=\"v-arrow-down\"></span>\n\t</div>\n\t<!-- 下拉面板 -->\n\t<div id=\"<%=cbid%>.panel\" class=\"cbi-listvalue-panel v-dropdown-panel\" style=\"display:none;\">\n\t\t<!-- 搜索框 -->\n\t\t<div style=\"padding:8px;border-bottom:1px solid #f0f0f0;\">\n\t\t\t<input id=\"<%=cbid%>.search\" class=\"cbi-input-text v-dropdown-search\" type=\"text\" placeholder=\"🔍 <%:Search nodes...%>\" inputmode=\"search\" enterkeyhint=\"done\" />\n\t\t</div>\n\t\t<!-- 列表容器 -->\n\t\t<div id=\"<%=cbid%>.list\" style=\"padding:8px;padding-bottom:0;\">\n\t\t\t<!-- 首次点击 display 时由 JS 填充 -->\n\t\t</div>\n\t\t<!-- 自定义 -->\n\t\t<div style=\"padding:8px;padding-top:0;margin-top:0;\">\n\t\t\t<input id=\"<%=cbid%>.custom\" class=\"cbi-input-text v-dropdown-custom\" type=\"text\" placeholder=\"<%=translate(\"-- custom --\")%>\" inputmode=\"text\" enterkeyhint=\"done\" />\n\t\t</div>\n\t</div>\n</div>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n(function(){\n\tconst cbid = \"<%=cbid%>\";\n\tconst hiddenInput = document.getElementById(cbid);\n\tconst panel = document.getElementById(cbid + \".panel\");\n\tconst display = document.getElementById(cbid + \".display\");\n\tconst labelSpan = document.getElementById(cbid + \".label\");\n\tconst searchInput = document.getElementById(cbid + \".search\");\n\tconst listContainer = document.getElementById(cbid + \".list\");\n\tconst customInput = document.getElementById(cbid + \".custom\");\n\n\t// 点击 display\n\tdisplay.addEventListener(\"click\", function(e){\n\t\te.stopPropagation();\n\t\tv_render_dropdown_list(cbid,panel,listContainer,hiddenInput,labelSpan,searchInput,display,customInput);\n\t\tdocument.querySelectorAll(\".cbi-listvalue-panel\").forEach(p=>{\n\t\t\tif (p !== panel) p.style.display = \"none\";\n\t\t});\n\t\tif (panel.style.display !== \"none\") {\n\t\t\tv_closePanel(cbid,panel,listContainer,hiddenInput,searchInput,customInput);\n\t\t} else {\n\t\t\tv_openPanel(cbid,display,panel,listContainer,hiddenInput,searchInput,customInput);\n\t\t}\n\t});\n\tv_registerAdaptive(cbid);\n\tsetTimeout(() => {\n\t\tlabelSpan.textContent = v_ellipsisByWidth(cbid, '<%=pcdata(current_label ~= \"\" and current_label or current_key)%>');\n\t}, 100);\n})();\n//]]>\n</script>\n\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/cbi/nodes_value_com.htm",
    "content": "<%\n--\tTemplate Developers:\n--\t\t- lwb1978\n--\tCopyright: copyright(c)2025–2027\n--\tDescription: Passwall(2) UI template\n-- It is the common part of the template and cannot be used independently\n%>\n<style>\n/* 主下拉按钮的下箭头 */\n.v-arrow-down {\n\twidth: 0;\n\theight: 0;\n\tborder-left: 5px solid transparent;\n\tborder-right: 5px solid transparent;\n\tborder-top: 6px solid #666;\n\tmargin-left: 6px;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 组标题的右箭头（折叠） */\n.v-arrow-right {\n\twidth: 0;\n\theight: 0;\n\tborder-top: 4px solid transparent;\n\tborder-bottom: 4px solid transparent;\n\tborder-left: 5px solid #555;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 组标题的下箭头（展开） */\n.v-arrow-down-small {\n\twidth: 0;\n\theight: 0;\n\tborder-left: 4px solid transparent;\n\tborder-right: 4px solid transparent;\n\tborder-top: 5px solid #555;\n\tdisplay: inline-block;\n\tvertical-align: middle;\n}\n/* 基础列表项样式 */\n.cbi-listvalue-panel li[data-key] {\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tcursor: pointer;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\ttransition: background-color 0.15s ease;\n}\n/* 鼠标悬停效果 - 使用透明度避免覆盖问题 */\n.cbi-listvalue-panel li[data-key]:hover {\n\tbackground-color: rgba(0, 123, 255, 0.1);\n}\n/* 选中项样式 - 使用更高优先级 */\n.cbi-listvalue-panel li[data-key].is-selected {\n\tbackground-color: #007bff !important;\n\tcolor: white !important;\n\tfont-weight: 600 !important;\n}\n/* 选中项悬停时保持主色调 */\n.cbi-listvalue-panel li[data-key].is-selected:hover {\n\tbackground-color: #0056b3 !important;\n}\n\n.v-dropdown-container {\n\tdisplay: inline-block;\n\tposition: relative;\n\twhite-space: nowrap;\n\tmin-width: 220px;\n}\n@media (max-width: 600px) {\n\t.v-dropdown-container {\n\t\tdisplay: block;\n\t\twhite-space: normal;\n\t}\n}\n\n.v-dropdown-display {\n\tcursor: pointer;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: space-between;\n\tbox-sizing: border-box;\n\twidth: 100%;\n}\n.v-dropdown-label {\n\tdisplay: inline-block;\n\toverflow: hidden;\n\twhite-space: nowrap;\n\twidth: 100%;\n\ttext-align: left;\n}\n.v-dropdown-panel {\n\tposition: fixed;\n\ttop: 0;\n\tleft: 0;\n\tz-index: 2147483647;\n\tborder: 1px solid #dcdcdc;\n\tborder-radius: 4px;\n\tbox-shadow: 0 6px 18px rgba(0,0,0,0.08);\n\tmax-height: 50vh;\n\toverflow: auto;\n\toverscroll-behavior: contain;\n}\n.v-dropdown-search, .v-dropdown-custom {\n\twidth: 100%;\n\tmax-width: 100% !important;\n\tmin-width: 0 !important;\n\tbox-sizing: border-box;\n\tpadding: 6px;\n\tborder: 1px solid #e0e0e0;\n\tborder-radius: 4px;\n}\n.v-group-title {\n\tcursor: pointer;\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tdisplay: flex;\n\talign-items: center;\n\tline-height: normal;\n\twhite-space: nowrap;\n}\n.v-group-list {\n\tlist-style: none;\n\tmargin: 6px 0 0 8px;\n\tpadding: 0;\n}\n.v-group-item {\n\tpadding: 6px;\n\tborder-radius: 4px;\n\tcursor: pointer;\n\twhite-space: nowrap;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\ttext-align: left !important;\n}\n</style>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n\t// css helper functions\n\tfunction v_camelToKebab(str) {\n\t\treturn str.replace(/([a-z0-9]|(?=[A-Z]))([A-Z])/g, '$1-$2').toLowerCase()\n\t}\n\n\tfunction v_style2Css(styleDeclaration, properties) {\n\t\tconst cssRules = properties.map(prop => {\n\t\t\tconst kebabCaseProp = v_camelToKebab(prop);[1, 5]\n\t\t\tconst value = styleDeclaration[prop]\n\t\t\tif (value) {\n\t\t\t\treturn `${kebabCaseProp}: ${value};`\n\t\t\t}\n\t\t\treturn ''\n\t\t})\n\t\t// Filter out any empty strings and join the rules\n\t\treturn cssRules.filter(Boolean).join(' ')\n\t}\n\n\tconst v_parseColorToRgba = (function() {\n\t\t// Create canvas and context once (Closure)\n\t\tconst canvas = document.createElement('canvas');\n\t\tcanvas.width = 1;\n\t\tcanvas.height = 1;\n\t\tconst ctx = canvas.getContext('2d', { willReadFrequently: true });\n\t\treturn function(colorStr) {\n\t\t\tif (!colorStr)\n\t\t\t   return null;\n\t\t\tctx.clearRect(0, 0, 1, 1);\n\t\t\t// 2. Apply the color\n\t\t\tctx.fillStyle = colorStr;\n\t\t\t// 3. Fill a single pixel\n\t\t\tctx.fillRect(0, 0, 1, 1);\n\t\t\t// 4. Extract pixel data [R, G, B, A]\n\t\t\tconst data = ctx.getImageData(0, 0, 1, 1).data;\n\t\t\treturn {\n\t\t\t\tr: data[0],\n\t\t\t\tg: data[1],\n\t\t\t\tb: data[2],\n\t\t\t\t// Convert alpha from 0-255 to 0-1 (rounded to 3 decimal places)\n\t\t\t\ta: Math.round((data[3] / 255) * 1000) / 1000\n\t\t\t};\n\t\t};\n\t})();\n\n\t// Helper to convert back to Hex (for output consistency)\n\tfunction v_rgbToHex(r, g, b) {\n\t\tconst toHex = (n) => {\n\t\t\tconst hex = Math.max(0, Math.min(255, n)).toString(16)\n\t\t\treturn hex.length === 1 ? '0' + hex : hex\n\t\t}\n\t\treturn `#${toHex(r)}${toHex(g)}${toHex(b)}`\n\t}\n\n\tfunction v_isTransparent(color) {\n\t\tconst cleanColor = v_parseColorToRgba(color);\n\t\t// check #RRGGBBAA for transparency\n\t\treturn !cleanColor || (cleanColor.a !== undefined && !cleanColor.a);\n\t}\n\n\tfunction v_getColorSchema(color) {\n\t\tconst rgb = v_parseColorToRgba(color);\n\t\tif (!rgb) return 'unknown'; // Handle invalid colors\n\t\t// Calculate YIQ brightness (human eye perception)\n\t\tconst brightness = ((rgb.r * 299) + (rgb.g * 587) + (rgb.b * 114)) / 1000;\n\t\t\n\t\treturn brightness > 128 ? 'light' : 'dark';\n\t}\n\n\tfunction v_lighter(color, amount) {\n\t\tconst rgb = v_parseColorToRgba(color);\n\t\tif (!rgb) return color;\n\t\t// Add amount to each channel\n\t\tconst r = rgb.r + amount;\n\t\tconst g = rgb.g + amount;\n\t\tconst b = rgb.b + amount;\n\t\t// Convert back to Hex (clamping happens inside rgbToHex)\n\t\treturn v_rgbToHex(r, g, b);\n\t}\n\n\tfunction v_darker(color, amount) {\n\t\tconst rgb = v_parseColorToRgba(color);\n\t\tif (!rgb) return color;\n\t\t// Subtract amount from each channel\n\t\tconst r = rgb.r - amount;\n\t\tconst g = rgb.g - amount;\n\t\tconst b = rgb.b - amount;\n\n\t\treturn v_rgbToHex(r, g, b);\n\t}\n\n\t// copy select styles\n\tfunction v_adaptiveStyle(cbid) {\n\t\tconst display = document.getElementById(cbid + \".display\");\n\t\tconst hiddenRef = document.getElementById(cbid + \".ref\");\n\t\tconst panel = document.getElementById(cbid + \".panel\");\n\t\tif (hiddenRef && display) {\n\t\t\tconst elOption = hiddenRef.getElementsByTagName(\"option\")[0]\n\t\t\tconst styleSelect = window.getComputedStyle(hiddenRef)\n\t\t\tconst styleOption = window.getComputedStyle(elOption)\n\t\t\tconst styleBody = window.getComputedStyle(document.body)\n\n\t\t\tconst styleNode = document.createElement('style')\n\t\t\tconst styleNames = [\"color\", \"height\", \"padding\", \"margin\", \"lineHeight\", \"border\", \"borderRadius\", \"minWidth\",\"minHeight\"]\n\t\t\tif (styleSelect.borderBottomStyle !== \"none\") {\n\t\t\t\tstyleNames.push(\"borderBottomWidth\", \"borderBottomStyle\", \"borderBottomColor\");\n\t\t\t}\n\t\t\tdocument.head.appendChild(styleNode)\n\t\t\t// trace back from option -> select -> body for background color\n\t\t\tconst panelRadius = styleSelect.borderRadius;\n\t\t\tconst optionColor = !v_isTransparent(styleOption.backgroundColor) ? styleOption.backgroundColor : !v_isTransparent(styleSelect.backgroundColor) ? styleSelect.backgroundColor : styleBody.backgroundColor\n\t\t\tconst titleColor = v_getColorSchema(optionColor) === \"light\" ? v_darker(optionColor, 30) : v_lighter(optionColor, 30)\n\t\t\tconst selectStyleCSS = [`#${CSS.escape(cbid + \".display\")} {`, v_style2Css(styleSelect, styleNames), v_style2Css(styleSelect, [\"backgroundColor\"]), \"}\"]\n\t\t\tconst optionStyleCSS = [`#${CSS.escape(cbid + \".panel\")}  {`, v_style2Css(styleOption, styleNames), `background-color: ${optionColor};`, `border-radius: ${panelRadius};`, \"}\"]\n\t\t\tconst titleStyleCSS = [`#${CSS.escape(cbid + \".panel\")} .v-group-title  {`, `background-color: ${titleColor} !important;`, \"}\"]\n\t\t\tstyleNode.textContent = [].concat(selectStyleCSS, optionStyleCSS, titleStyleCSS).join(\"\\n\")\n\t\t}\n\t}\n\n\tfunction v_idSafe(id) {\n\t\treturn id\n\t\t\t.trim()\n\t\t\t.replace(/\\s+/g, \"-\")\n\t\t\t.replace(/[\\x00-\\x1F\\x7F]/g, \"\");\n\t}\n\n\t// 高亮当前选中的项\n\tfunction v_highlightSelectedItem(listContainer, hiddenInput) {\n\t\tconst allItems = listContainer.querySelectorAll(\"li[data-key]\");\n\t\tconst currentKey = hiddenInput.value;\n\t\tallItems.forEach(item => {\n\t\t\titem.classList.remove(\"is-selected\");\n\t\t\tif (item.getAttribute('data-key') === currentKey) {\n\t\t\t\titem.classList.add(\"is-selected\");\n\t\t\t}\n\t\t});\n\t}\n\n\t// 更新组内选中计数\n\tfunction v_updateGroupCounts(cbid, listContainer, hiddenInput, searchInput) {\n\t\tconst groups = listContainer.querySelectorAll(\".v-group\");\n\t\tconst currentKey = hiddenInput.value;\n\t\tconst isSearching = searchInput.value.trim() !== \"\";\n\t\tgroups.forEach(group => {\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst items = group.querySelectorAll(\"li[data-key]\");\n\t\t\tconst span = document.getElementById(\"group-count-\" + cbid + \"-\" + gname);\n\t\t\tif (!span) return;\n\t\t\tif (isSearching) {\n\t\t\t\t// 搜索状态：显示匹配数量\n\t\t\t\tlet matchCount = 0;\n\t\t\t\titems.forEach(li => {\n\t\t\t\t\tif (li.style.display !== \"none\") matchCount++;\n\t\t\t\t});\n\t\t\t\tspan.textContent = \"(\" + matchCount + \"/\" + items.length + \")\";\n\t\t\t\tif (matchCount > 0) {\n\t\t\t\t\tspan.style.color = \"#28a745\";\n\t\t\t\t\tspan.style.fontWeight = \"600\";\n\t\t\t\t} else {\n\t\t\t\t\tspan.style.color = \"#dc3545\";\n\t\t\t\t\tspan.style.fontWeight = \"normal\";\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// 默认状态：显示选中项数量\n\t\t\t\tlet selectedCount = 0;\n\t\t\t\titems.forEach(li => {\n\t\t\t\t\tif (li.getAttribute('data-key') === currentKey) {\n\t\t\t\t\t\tselectedCount = 1;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tspan.textContent = \"(\" + selectedCount + \"/\" + items.length + \")\";\n\t\t\t\tif (selectedCount > 0) {\n\t\t\t\t\tspan.style.color = \"#007bff\";\n\t\t\t\t\tspan.style.fontWeight = \"600\";\n\t\t\t\t} else {\n\t\t\t\t\tspan.style.color = \"\";\n\t\t\t\t\tspan.style.fontWeight = \"normal\";\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t//搜索过滤器：按 name 或 label 做模糊匹配，搜索时自动展开所有组并隐藏不匹配条目\n\tfunction v_filterList(keyword, cbid, listContainer, hiddenInput, searchInput) {\n\t\tkeyword = (keyword || \"\").toLowerCase().trim();\n\t\tconst topItems = listContainer.querySelectorAll(\"ul li[data-key]\");\n\t\ttopItems.forEach((li, index)=>{\n\t\t\tif (index === 0) {\n\t\t\t\tli.style.display = \"block\";\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tconst name = (li.getAttribute(\"data-node-name\") || \"\").toLowerCase();\n\t\t\tif (!keyword || name.indexOf(keyword) !== -1) {\n\t\t\t\tli.style.display = \"block\";\n\t\t\t} else {\n\t\t\t\tli.style.display = \"none\";\n\t\t\t}\n\t\t});\n\t\tconst groups = listContainer.querySelectorAll(\".v-group\");\n\t\tgroups.forEach(group=>{\n\t\t\tconst items = group.querySelectorAll(\"li[data-key]\");\n\t\t\tlet matchCount = 0;\n\t\t\titems.forEach(li=>{\n\t\t\t\tconst name = (li.getAttribute(\"data-node-name\") || \"\").toLowerCase();\n\t\t\t\tif (!keyword || name.indexOf(keyword) !== -1) {\n\t\t\t\t\tli.style.display = \"block\";\n\t\t\t\t\tmatchCount++;\n\t\t\t\t} else {\n\t\t\t\t\tli.style.display = \"none\";\n\t\t\t\t}\n\t\t\t});\n\t\t\tgroup.style.display = (matchCount === 0 && keyword !== \"\") ? \"none\" : \"block\";\n\t\t\tconst ul = group.querySelector(\".v-group-list\");\n\t\t\tconst gname = group.getAttribute(\"data-group\");\n\t\t\tconst arrow = document.getElementById(\"arrow-\" + cbid + \"-\" + gname);\n\t\t\tif (keyword) {\n\t\t\t\tif (ul) ul.style.display = (matchCount > 0 ? \"block\" : \"none\");\n\t\t\t\tif (arrow) arrow.className = (matchCount > 0 ? \"v-arrow-down-small\" : \"v-arrow-right\");\n\t\t\t} else {\n\t\t\t\tif (ul) ul.style.display = \"none\";\n\t\t\t\tif (arrow) arrow.className = \"v-arrow-right\";\n\t\t\t}\n\t\t});\n\t\tv_updateGroupCounts(cbid, listContainer, hiddenInput, searchInput);\n\t\tv_highlightSelectedItem(listContainer, hiddenInput);\n\t}\n\n\t// 切换单个组（点击组标题）\n\tfunction v_toggleGroup(listContainer, cbid, g) {\n\t\tg = v_idSafe(g);\n\t\tconst group = listContainer.querySelector(\".v-group[data-group='\" + g + \"']\");\n\t\tif (!group) return;\n\t\tconst ul = group.querySelector(\".v-group-list\");\n\t\tconst arrow = document.getElementById(\"arrow-\" + cbid + \"-\" + g);\n\t\tif (!ul) return;\n\t\tconst searchInput = document.getElementById(cbid + \".search\");\n\t\tconst isSearching = searchInput?.value.trim() !== \"\";\n\t\tconst isExpanded = ul.style.display !== \"none\";\n\n\t\tif (isExpanded) {\n\t\t\tul.style.display = \"none\";\n\t\t\tif (arrow) arrow.className = \"v-arrow-right\";\n\t\t} else {\n\t\t\tul.style.display = \"block\";\n\t\t\tif (arrow) arrow.className = \"v-arrow-down-small\";\n\n\t\t\tif (!isSearching) {\n\t\t\t\tconst allGroups = listContainer.querySelectorAll(\".v-group\");\n\t\t\t\tallGroups.forEach(otherGroup => {\n\t\t\t\t\tif (otherGroup !== group) {\n\t\t\t\t\t\tconst otherUl = otherGroup.querySelector(\".v-group-list\");\n\t\t\t\t\t\tconst otherGname = otherGroup.getAttribute(\"data-group\");\n\t\t\t\t\t\tconst otherArrow = document.getElementById(\"arrow-\" + cbid + \"-\" + otherGname);\n\t\t\t\t\t\tif (otherUl) otherUl.style.display = \"none\";\n\t\t\t\t\t\tif (otherArrow) otherArrow.className = \"v-arrow-right\";\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// 展开包含当前 hiddenInput 值的组（初始化或打开面板时使用）\n\tfunction v_expandGroupOfCurrent(cbid, listContainer, hiddenInput) {\n\t\tconst key = hiddenInput.value;\n\t\tif (!key) return;\n\t\tconst targetLi = listContainer.querySelector(\"li[data-key='\" + key.replace(/'/g,\"\\\\'\") + \"']\");\n\t\tif (!targetLi) return;\n\t\tlet parentGroup = targetLi.closest(\".v-group\");\n\t\tif (parentGroup) {\n\t\t\tconst ul = parentGroup.querySelector(\".v-group-list\");\n\t\t\tconst gname = parentGroup.getAttribute(\"data-group\");\n\t\t\tconst arrow = document.getElementById(\"arrow-\" + cbid + \"-\" + gname);\n\t\t\tif (ul) ul.style.display = \"block\";\n\t\t\tif (arrow) arrow.className = \"v-arrow-down-small\";\n\t\t\tconst allGroups = listContainer.querySelectorAll(\".v-group\");\n\t\t\tallGroups.forEach(gp=>{\n\t\t\t\tif (gp !== parentGroup) {\n\t\t\t\t\tconst gul = gp.querySelector(\".v-group-list\");\n\t\t\t\t\tconst otherGname = gp.getAttribute(\"data-group\");\n\t\t\t\t\tconst gar = document.getElementById(\"arrow-\" + cbid + \"-\" + otherGname);\n\t\t\t\t\tif (gul) gul.style.display = \"none\";\n\t\t\t\t\tif (gar) gar.className = \"v-arrow-right\";\n\t\t\t\t}\n\t\t\t});\n\t\t} else {\n\t\t\tconst allGroups = listContainer.querySelectorAll(\".v-group\");\n\t\t\tallGroups.forEach(gp=>{\n\t\t\t\tconst gul = gp.querySelector(\".v-group-list\");\n\t\t\t\tconst gname = gp.getAttribute(\"data-group\");\n\t\t\t\tconst gar = document.getElementById(\"arrow-\" + cbid + \"-\" + gname);\n\t\t\t\tif (gul) gul.style.display = \"none\";\n\t\t\t\tif (gar) gar.className = \"v-arrow-right\";\n\t\t\t});\n\t\t}\n\t\tif (targetLi) {\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\ttargetLi.scrollIntoView({ block: \"nearest\" });\n\t\t\t});\n\t\t}\n\t}\n\n\t// 计算panel位置\n\tfunction v_repositionPanel(panel, display) {\n\t\tif (!panel || panel.style.display === \"none\") return;\n\t\tconst rect = display.getBoundingClientRect();\n\t\tconst viewportHeight = window.innerHeight || document.documentElement.clientHeight;\n\t\tpanel.style.visibility = \"hidden\";\n\t\tpanel.style.display = \"block\";\n\t\tpanel.style.minHeight = \"100px\";\n\t\tpanel.style.maxHeight = Math.min(0.48*viewportHeight, 500) + \"px\";\n\t\tconst panelHeight = panel.offsetHeight;\n\t\tconst spaceBelow = viewportHeight - rect.bottom;\n\t\tconst spaceAbove = rect.top;\n\t\tlet top, isUp = false;\n\t\tif (spaceBelow >= panelHeight) {\n\t\t\ttop = rect.bottom + 2;\n\t\t\tisUp = false;\n\t\t} else if (spaceAbove >= panelHeight) {\n\t\t\ttop = rect.top - panelHeight - 2;\n\t\t\tisUp = true;\n\t\t} else {\n\t\t\tif (spaceBelow >= spaceAbove) {\n\t\t\t\ttop = Math.max(rect.bottom - 2, viewportHeight - panelHeight - 2);\n\t\t\t\tisUp = false;\n\t\t\t} else {\n\t\t\t\ttop = Math.min(rect.top - panelHeight + 2, 2);\n\t\t\t\tisUp = true;\n\t\t\t}\n\t\t}\n\t\tpanel.style.left = rect.left + \"px\";\n\t\tpanel.style.top = top + \"px\";\n\t\tconst panelRect = panel.getBoundingClientRect();\n\t\tconst displayWidth = rect.width;\n\t\tconst remainingWidth = window.innerWidth - panelRect.left - 12;\n\t\tconst maxWidth = Math.max(displayWidth, Math.floor(remainingWidth));\n\t\tpanel.style.maxWidth = maxWidth + \"px\";\n\t\tpanel.style.minWidth = Math.max(displayWidth, 240) + \"px\";\n\t\tpanel.style.width = \"auto\";\n\t\tpanel.style.visibility = \"\";\n\t}\n\n\t// 打开/关闭面板\n\tfunction v_openPanel(cbid, display, panel, listContainer, hiddenInput, searchInput, customInput) {\n\t\tif (!panel._moved) {\n\t\t\tdocument.body.appendChild(panel);\n\t\t\tpanel._moved = true;\n\t\t}\n\t\tv_expandGroupOfCurrent(cbid, listContainer, hiddenInput);\n\t\tv_highlightSelectedItem(listContainer, hiddenInput);\n\t\tpanel.style.display = \"block\";\n\t\tv_repositionPanel(panel, display);\n\t\t// 失焦监听\n\t\tconst handler = function(e){\n\t\t\tconst target = e.target;\n\t\t\tif (panel.style.display !== \"none\") {\n\t\t\t\tif (!panel.contains(target) && !display.contains(target)) {\n\t\t\t\t\tv_closePanel(cbid, panel, listContainer, hiddenInput, searchInput, display, customInput);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tpanel._docClickHandler = handler;\n\t\tdocument.addEventListener(\"click\", handler);\n\t\t// 滚动 / resize 自动 reposition\n\t\tlet ticking = false;\n\t\tconst repositionHandler = function () {\n\t\t\tif (ticking) return;\n\t\t\tticking = true;\n\t\t\trequestAnimationFrame(function () {\n\t\t\t\tticking = false;\n\t\t\t\tv_repositionPanel(panel, display);\n\t\t\t});\n\t\t};\n\t\tpanel._repositionHandler = repositionHandler;\n\t\twindow.addEventListener(\"scroll\", repositionHandler, true);\n\t\twindow.addEventListener(\"resize\", repositionHandler);\n\t}\n\tfunction v_closePanel(cbid, panel, listContainer, hiddenInput, searchInput, customInput) {\n\t\tpanel.style.display = \"none\";\n\t\tsearchInput.value = \"\";\n\t\tcustomInput.value = \"\";\n\t\tv_filterList(\"\", cbid, listContainer, hiddenInput, searchInput);\n\t\t// document click\n\t\tif (panel._docClickHandler) {\n\t\t\tdocument.removeEventListener(\"click\", panel._docClickHandler);\n\t\t\tpanel._docClickHandler = null;\n\t\t}\n\t\t// scroll / resize\n\t\tif (panel._repositionHandler) {\n\t\t\twindow.removeEventListener(\"scroll\", panel._repositionHandler, true);\n\t\t\twindow.removeEventListener(\"resize\", panel._repositionHandler);\n\t\t\tpanel._repositionHandler = null;\n\t\t}\n\t}\n\n\t//自定义框\n\tfunction v_customEnter(cbid, labelSpan, hiddenInput, searchInput, panel, listContainer, customInput) {\n\t\tlet inputValue = customInput.value.trim();\n    \tif (!inputValue) {\n\t\t\treturn;\n\t\t}\n\t\tconst existingItems = listContainer.querySelectorAll('li[data-key=\"' + inputValue + '\"]');\n\t\tif (existingItems.length <= 0) {\n\t\t\tlet newLi = document.createElement('li');\n\t\t\tnewLi.setAttribute('data-key', inputValue);\n\t\t\tnewLi.setAttribute('data-node-name', inputValue.toLowerCase());\n\t\t\tnewLi.className = 'list-item';\n\n\t\t\tlet newSpan = document.createElement('span');\n\t\t\tnewSpan.className = 'v-item-label';\n\t\t\tnewSpan.style.marginLeft = '12px';\n\t\t\tnewSpan.textContent = inputValue;\n\t\t\tnewLi.appendChild(newSpan);\n\n\t\t\tconst ungroupedList = listContainer.querySelector('ul');\n\t\t\tif (ungroupedList) {\n\t\t\t\tungroupedList.appendChild(newLi);\n\t\t\t}\n\t\t}\n\t\tconst changed = inputValue !== hiddenInput.value;\n\t\tif (changed) {\n\t\t\t//改值\n\t\t\thiddenInput.value = inputValue;\n\t\t\tlabelSpan.textContent = v_ellipsisByWidth(cbid, inputValue);\n\t\t\tlabelSpan.title = inputValue;\n\t\t\tv_highlightSelectedItem(listContainer, hiddenInput);\n\t\t\tv_updateGroupCounts(cbid, listContainer, hiddenInput, searchInput);\n\t\t}\n\t\tv_closePanel(cbid,panel,listContainer,hiddenInput,searchInput,customInput);\n\t}\n\n\t// 动态生成下拉框\n\twindow.v_dropdown_rendered = {};\n\tfunction v_escape_html(s) {\n\t\treturn s.replace(/[&<>\"']/g, c => ({\n\t\t\t\"&\":\"&amp;\", \"<\":\"&lt;\", \">\":\"&gt;\", '\"':\"&quot;\", \"'\":\"&#39;\"\n\t\t}[c]));\n\t}\n\tfunction v_render_dropdown_list(cbid, panel, listContainer, hiddenInput, labelSpan, searchInput, display, customInput) {\n\t\tif (window.v_dropdown_rendered[cbid]) return;\n\t\tconst data = window.v_dropdown_data[cbid];\n\t\tif (!data) return;\n\t\tif (!listContainer) return;\n\n\t\tlet html = \"\";\n\n\t\t// 无组项\n\t\tif (data.ungrouped && data.ungrouped.length > 0) {\n\t\t\thtml += `<ul style=\"list-style:none;padding:0;margin:0 0 8px 0;\">`;\n\n\t\t\tdata.ungrouped.forEach((item, index) => {\n\t\t\t\tconst liStyle = index === 0 ? 'text-align:center;' : '';\n\t\t\t\tconst spanStyle = index === 0 ? 'margin-left:0px;' : 'margin-left:12px;';\n\t\t\t\thtml += `\n\t\t\t\t\t<li data-key=\"${item.key}\"\n\t\t\t\t\t\tdata-node-name=\"${v_escape_html(item.label.toLowerCase())}\"\n\t\t\t\t\t\tclass=\"list-item\" style=\"${liStyle}\">\n\t\t\t\t\t\t<span class=\"v-item-label\" style=\"${spanStyle}\">\n\t\t\t\t\t\t\t${v_escape_html(item.label)}\n\t\t\t\t\t\t</span>\n\t\t\t\t\t</li>`;\n\t\t\t});\n\n\t\t\thtml += `</ul>`;\n\t\t}\n\n\t\t// 分组项\n\t\tdata.group_order.forEach(gname => {\n\t\t\tconst items = data.groups[gname];\n\n\t\t\thtml += `\n\t\t\t<div class=\"v-group\" data-group=\"${v_idSafe(gname)}\" style=\"margin-bottom:8px;\">\n\t\t\t\t<div class=\"v-group-title\" data-group-name=\"${v_idSafe(gname)}\">\n\t\t\t\t\t<span class=\"v-arrow-right\" id=\"arrow-${cbid}-${v_idSafe(gname)}\"></span>\n\t\t\t\t\t<b style=\"margin-left:6px;\">${v_escape_html(gname)}</b>\n\t\t\t\t\t<span id=\"group-count-${cbid}-${v_idSafe(gname)}\"\n\t\t\t\t\t\tstyle=\"margin-left:8px;\">(0/${items.length})</span>\n\t\t\t\t</div>\n\t\t\t\t<ul id=\"group-${cbid}-${v_idSafe(gname)}\" class=\"v-group-list\" style=\"display:none\">\n\t\t\t`;\n\n\t\t\titems.forEach(item => {\n\t\t\t\thtml += `\n\t\t\t\t<li data-key=\"${item.key}\"\n\t\t\t\t\tdata-node-name=\"${v_escape_html(item.label.toLowerCase())}\"\n\t\t\t\t\tclass=\"v-group-item\">\n\t\t\t\t\t<span class=\"v-item-label\" title=\"${v_escape_html(item.label)}\">\n\t\t\t\t\t\t${v_escape_html(item.label)}\n\t\t\t\t\t</span>\n\t\t\t\t</li>`;\n\t\t\t});\n\n\t\t\thtml += `\n\t\t\t\t</ul>\n\t\t\t</div>\n\t\t\t`;\n\t\t});\n\n\t\tlistContainer.innerHTML = html;\n\n\t\twindow.v_dropdown_rendered[cbid] = true;\n\n\t\tv_adaptiveStyle(cbid);\n\t\tv_updateGroupCounts(cbid, listContainer, hiddenInput, searchInput);\n\n\t\t// 点击项（无组与组内项都使用 li[data-key]）\n\t\tlistContainer.addEventListener(\"click\", function(e){\n\t\t\tlet li = e.target;\n\t\t\twhile(li && li !== listContainer && !li.hasAttribute('data-key')) li = li.parentNode;\n\t\t\tif(!li || li === listContainer) return;\n\t\t\tconst key = li.getAttribute('data-key') || \"\";\n\t\t\tconst text = li.querySelector(\".v-item-label\")?.textContent || li.textContent || key;\n\n\t\t\tconst changed = key !== hiddenInput.value;\n\t\t\tif (changed) {\n\t\t\t\t//改值\n\t\t\t\thiddenInput.value = key;\n\t\t\t\tlabelSpan.textContent = v_ellipsisByWidth(cbid, text);\n\t\t\t\tlabelSpan.title = text;\n\t\t\t\tv_highlightSelectedItem(listContainer, hiddenInput);\n\t\t\t\tv_updateGroupCounts(cbid, listContainer, hiddenInput, searchInput);\n\t\t\t}\n\t\t\tv_closePanel(cbid,panel,listContainer,hiddenInput,searchInput,customInput);\n\t\t});\n\n\t\t// 搜索功能\n\t\tsearchInput.addEventListener(\"input\", function() {\n\t\t\tv_filterList(this.value, cbid, listContainer, hiddenInput, searchInput);\n\t\t\tv_repositionPanel(panel, display);\n\t\t});\n\t\tsearchInput.addEventListener('keydown', function(e) {\n\t\t\tconst isEnter = e.key === \"Enter\" || e.keyCode === 13;\n\t\t\tif (!isEnter) return;\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tsearchInput.blur();\n\t\t});\n\n\t\t// 切换组\n\t\tlistContainer.querySelectorAll(\".v-group-title\").forEach(title => {\n\t\t\ttitle.addEventListener(\"click\", function() {\n\t\t\t\tconst g = this.closest(\".v-group\")?.getAttribute(\"data-group\");\n\t\t\t\tif (g) {\n\t\t\t\t\tv_toggleGroup(listContainer, cbid, g);\n\t\t\t\t\tv_repositionPanel(panel, display);\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\n\t\t//自定义框\n\t\tcustomInput.addEventListener(\"keydown\", function(e){\n\t\t\tconst isEnter = e.key === \"Enter\" || e.keyCode === 13;\n\t\t\tif (!isEnter) return;\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\t\t\tv_customEnter(cbid, labelSpan, hiddenInput, searchInput, panel, listContainer, customInput);\n\t\t});\n\n\t\t// 防止 panel 惯性滚动穿透\n\t\tpanel.addEventListener('wheel', function (e) {\n\t\t\tconst deltaY = e.deltaY;\n\t\t\tconst scrollTop = panel.scrollTop;\n\t\t\tconst scrollHeight = panel.scrollHeight;\n\t\t\tconst clientHeight = panel.clientHeight;\n\t\t\tconst isAtTop = scrollTop === 0;\n\t\t\tconst isAtBottom = scrollTop + clientHeight >= scrollHeight;\n\t\t\tif (deltaY < 0 && isAtTop) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (deltaY > 0 && isAtBottom) {\n\t\t\t\te.preventDefault();\n\t\t\t\treturn;\n\t\t\t}\n\t\t\te.stopPropagation();\n\t\t}, { passive: false });\n\t}\n\n\t//截断display字符长度\n\twindow.v_labelSpan_maxWidth = {};\n\tfunction v_ellipsisByWidth(cbid, text) {\n\t\tconst el = document.getElementById(cbid + \".label\");\n\t\tif (!el || !text) return text;\n\t\ttext = text.trim();\n\t\tconst maxWidth = el.clientWidth;\n\t\twindow.v_labelSpan_maxWidth[cbid] = maxWidth;\n\t\tif (maxWidth <= 0) return text;\n\t\tconst style = window.getComputedStyle(el);\n\t\tconst font = [\n\t\t\tstyle.fontStyle,\n\t\t\tstyle.fontVariant,\n\t\t\tstyle.fontWeight,\n\t\t\tstyle.fontSize || '16px',\n\t\t\tstyle.fontFamily || 'sans-serif'\n\t\t].join(\" \").replace(/\\s+/g, ' ');\n\t\tconst canvas = v_ellipsisByWidth._canvas || (v_ellipsisByWidth._canvas = document.createElement(\"canvas\"));\n\t\tconst ctx = canvas.getContext(\"2d\");\n\t\tctx.font = font;\n\t\tif (ctx.measureText(text).width <= maxWidth) {\n\t\t\treturn text;\n\t\t}\n\t\tconst ellipsis = \"...\";\n\t\tconst ellipsisWidth = ctx.measureText(ellipsis).width;\n\t\tconst minChars = 15;\n\t\tconst probe = text.slice(0, minChars);\n\t\tconst probeWidth = ctx.measureText(probe).width;\n\t\tif (probeWidth + ellipsisWidth > maxWidth) {\n\t\t\treturn text;\n\t\t}\n\t\tlet left = 0;\n\t\tlet right = text.length;\n\t\tlet result = ellipsis;\n\t\twhile (left <= right) {\n\t\t\tconst mid = (left + right) >> 1;\n\t\t\tconst substr = text.slice(0, mid);\n\t\t\tconst w = ctx.measureText(substr).width;\n\t\t\tif (w + ellipsisWidth <= maxWidth) {\n\t\t\t\tresult = substr + ellipsis;\n\t\t\t\tleft = mid + 1;\n\t\t\t} else {\n\t\t\t\tright = mid - 1;\n\t\t\t}\n\t\t}\n\t\treturn result;\n\t}\n\n\tconst v_adaptiveControls = new Set();\n\tfunction v_registerAdaptive(cbid) {\n\t\tv_adaptiveControls.add(cbid);\n\t\tv_adaptiveStyle(cbid);\n\t}\n\tfunction v_labelSpanResize(cbid) {\n\t\tconst el = document.getElementById(cbid + \".label\");\n\t\tif (!el) return;\n\t\tconst maxWidth = el.clientWidth;\n\t\tif (window.v_labelSpan_maxWidth[cbid] == maxWidth) return;\n\t\tlet text = el.title;\n\t\tel.textContent = v_ellipsisByWidth(cbid, text);\n\t}\n\tlet v_adaptiveTicking = false;\n\twindow.addEventListener(\"resize\", () => {\n\t\tif (!v_adaptiveTicking) {\n\t\t\tv_adaptiveTicking = true;\n\t\t\trequestAnimationFrame(() => {\n\t\t\t\tv_adaptiveControls.forEach(cbid => {\n\t\t\t\t\tv_adaptiveStyle(cbid);\n\t\t\t\t\tv_labelSpanResize(cbid);\n\t\t\t\t});\n\t\t\t\tv_adaptiveTicking = false;\n\t\t\t});\n\t\t}\n\t});\n//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/cbi/optimize_cbi_ui.htm",
    "content": "<script type=\"text/javascript\">\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t\tsetTimeout(updateElements, 200);\n\t\tfunction updateElements() {\n\t\t\tdocument.querySelectorAll(\"input.btn.cbi-button.cbi-button-up\").forEach(function(btn) {\n\t\t\t\tbtn.value = \"<%:Move up%>\";\n\t\t\t});\n\t\t\tdocument.querySelectorAll(\"input.btn.cbi-button.cbi-button-down\").forEach(function(btn) {\n\t\t\t\tbtn.value = \"<%:Move down%>\";\n\t\t\t});\n\t\t\tdocument.querySelectorAll(\"div.cbi-value-description\").forEach(function(descDiv) {\n\t\t\t\tvar prev = descDiv.previousSibling;\n\t\t\t\twhile (prev && prev.nodeType === Node.TEXT_NODE && prev.textContent.trim() === \"\") {\n\t\t\t\t\tprev = prev.previousSibling;\n\t\t\t\t}\n\t\t\t\tif (prev && prev.nodeType === Node.ELEMENT_NODE && prev.tagName === \"BR\") {\n\t\t\t\t\tprev.remove();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n</script>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/global/backup.htm",
    "content": "<%\nlocal api = require \"luci.passwall2.api\"\n-%>\n\n<div class=\"cbi-section\">\n\t<h3><%:Backup and Restore%></h3>\n\t<div class=\"cbi-section-descr\">\n\t\t<%:Backup or Restore Client and Server Configurations.%>\n\t\t<br>\n\t\t<font color=\"red\"><%:Note: Restoring configurations across different versions may cause compatibility issues.%></font>\n\t</div>\n</div>\n\n<div class=\"cbi-value\" id=\"_backup_div\">\n\t<label class=\"cbi-value-title\"><%:Create Backup File%></label>\n\t<div class=\"cbi-value-field\">\n\t\t<input class=\"btn cbi-button cbi-button-save\" type=\"button\" onclick=\"dl_backup()\" value=\"<%:DL Backup%>\" />\n\t</div>\n</div>\n\n<div class=\"cbi-value\" id=\"_upload_div\">\n\t<label class=\"cbi-value-title\"><%:Restore Backup File%></label>\n\t<div class=\"cbi-value-field\">\n\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" onclick=\"show_upload_win()\" value=\"<%:RST Backup%>\" />\n\t</div>\n</div>\n\n<div class=\"cbi-value\" id=\"_reset_div\">\n\t<label class=\"cbi-value-title\"><%:Restore to default configuration%></label>\n\t<div class=\"cbi-value-field\">\n\t\t<input class=\"btn cbi-button cbi-button-reset\" type=\"button\" onclick=\"do_reset()\" value=\"<%:Do Reset%>\" />\n\t</div>\n</div>\n\n<div class=\"cbi-value\"></div>\n\n<div id=\"upload-modal\" class=\"up-modal\" style=\"display:none;\">\n\t<div class=\"up-modal-content\">\n\t\t<h3><%:Restore Backup File%></h3>\n\t\t<div class=\"up-cbi-value-field\">\n\t\t\t<input class=\"cbi-input-file\" type=\"file\" id=\"ulfile\" accept=\".tar.gz\" />\n\t\t</div>\n\t\t<div class=\"up-button-container\">\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" id=\"upload-btn\" onclick=\"do_upload()\" value=\"<%:UL Restore%>\" />\n\t\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"close_upload_win()\" value=\"<%:CLOSE WIN%>\" />\n\t\t</div>\n\t</div>\n</div>\n\n<style>\n\t.up-modal {\n\t\tposition: fixed;\n\t\tleft: 50%;\n\t\ttop: 50%;\n\t\ttransform: translate(-50%, -50%);\n\t\tbackground: white;\n\t\tpadding: 20px;\n\t\tborder: 2px solid #ccc;\n\t\tborder-radius: 5px;\n\t\tbox-shadow: 0 0 10px rgba(0,0,0,0.5);\n\t\tz-index: 1000;\n\t\twidth: 90%;\n\t\tmax-width: 400px;\n\t}\n\n\t.up-modal-content {\n\t\twidth: 100%;\n\t\tmax-width: 400px;\n\t\ttext-align: center;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\tjustify-content: center;\n\t\talign-items: center;\n\t}\n\n\t.up-button-container {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\twidth: 100%;\n\t\tmax-width: 250px;\n\t}\n\n\t.up-cbi-value-field {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\twidth: 100%;\n\t\tmargin-top: 15px;\n\t\tmargin-bottom: 30px;\n\t}\n\n\t.up-modal h3 {\n\t\tbackground: inherit;\n\t}\n</style>\n\n<script>\n\tfunction getBg(el) {\n\t\tif (!el) return null;\n\t\tconst style = getComputedStyle(el);\n\t\tconst bgImage = style.backgroundImage;\n\t\tconst bgColor = style.backgroundColor;\n\t\treturn (bgImage !== 'none' || !/rgba\\([^,]+,[^,]+,[^,]+,\\s*0\\)/.test(bgColor) && bgColor !== 'transparent')\n\t\t\t? style.background\n\t\t\t: null;\n\t};\n\n\tfunction show_upload_win(btn) {\n\t\tconst uploadDiv = document.getElementById(\"upload-modal\");\n\t\tuploadDiv.style.background = getBg(document.querySelector('.cbi-section')) || getBg(document.body) || '';\n\t\tuploadDiv.style.display = \"block\";\n\t\tdocument.getElementById(\"ulfile\").focus();\n\t}\n\n\tfunction close_upload_win(btn) {\n\t\tdocument.getElementById(\"ulfile\").value = \"\";\n\t\tdocument.getElementById(\"upload-modal\").style.display = \"none\";\n\t}\n\n\tfunction dl_backup(btn) {\n\t\tfetch('<%= api.url(\"create_backup\") %>', {\n\t\t\tmethod: 'POST'\n\t\t})\n\t\t.then(response => {\n\t\t\tif (!response.ok) {\n\t\t\t\tthrow new Error(\"<%:Backup failed!%>\");\n\t\t\t}\n\t\t\tconst filename = response.headers.get(\"X-Backup-Filename\");\n\t\t\tif (!filename) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn response.blob().then(blob => ({ blob, filename }));\n\t\t})\n\t\t.then(result => {\n\t\t\tif (!result) return;\n\t\t\tconst { blob, filename } = result;\n\t\t\tconst url = window.URL.createObjectURL(blob);\n\t\t\tconst a = document.createElement(\"a\");\n\t\t\ta.href = url;\n\t\t\ta.download = filename;\n\t\t\tdocument.body.appendChild(a);\n\t\t\ta.click();\n\t\t\ta.remove();\n\t\t\twindow.URL.revokeObjectURL(url);\n\t\t})\n\t\t.catch(error => alert(error.message));\n\t}\n\n\tfunction do_reset(btn) {\n\t\tif (confirm(\"<%: Do you want to restore the client to default settings?%>\")) {\n\t\t\tsetTimeout(function () {\n\t\t\t\tif (confirm(\"<%: Are you sure you want to restore the client to default settings?%>\")) {\n\t\t\t\t\tvar xhr1 = new XMLHttpRequest();\n\t\t\t\t\txhr1.open(\"GET\",'<%= api.url(\"clear_log\") %>', false);\n\t\t\t\t\txhr1.send(); \n\t\t\t\t\tvar xhr2 = new XMLHttpRequest();\n\t\t\t\t\txhr2.open(\"GET\",'<%= api.url(\"reset_config\") %>', false);\n\t\t\t\t\txhr2.send(); \n\t\t\t\t\twindow.location.href = '<%= api.url(\"log\") %>'\n\t\t\t\t}\n\t\t\t}, 1000);\n\t\t}\n\t}\n\n\tfunction do_upload(btn) {\n\t\tconst fileInput = document.getElementById(\"ulfile\");\n\t\tconst file = fileInput.files[0];\n\t\tif (!file) {\n\t\t\talert(\"<%:Please select a file first.%>\");\n\t\t\treturn;\n\t\t}\n\t\tif (!file.name.endsWith(\".tar.gz\")) {\n\t\t\talert(\"<%:Invalid file type. Please upload a .tar.gz file.%>\");\n\t\t\tfileInput.value = \"\";\n\t\t\treturn;\n\t\t}\n\t\tconst maxSize = 10 * 1024 * 1024; // 10MB\n\t\tif (file.size > maxSize) {\n\t\t\talert(\"<%:File size exceeds 10MB limit.%>\");\n\t\t\tfileInput.value = \"\";\n\t\t\treturn;\n\t\t}\n\n\t\tconst reader = new FileReader();\n\t\treader.onload = function (e) {\n\t\t\tconst binaryString = e.target.result; // ArrayBuffer\n\t\t\tconst binary = new Uint8Array(binaryString);\n\t\t\tlet binaryText = \"\";\n\t\t\tfor (let i = 0; i < binary.length; i++) {\n\t\t\t\tbinaryText += String.fromCharCode(binary[i]);\n\t\t\t}\n\n\t\t\tconst base64Data = btoa(binaryText);\n\n\t\t\tconst targetByteSize = 64 * 1024; // Slice Size 64KB\n\t\t\tlet chunkSize = Math.floor(targetByteSize * 4 / 3);\n\t\t\tchunkSize = chunkSize + (4 - (chunkSize % 4)) % 4;\n\t\t\tconst totalChunks = Math.ceil(base64Data.length / chunkSize);\n\t\t\tlet currentChunk = 0;\n\n\t\t\tfunction sendNextChunk() {\n\t\t\t\tif (currentChunk < totalChunks) {\n\t\t\t\t\tconst chunk = base64Data.substring(currentChunk * chunkSize, (currentChunk + 1) * chunkSize);\n\t\t\t\t\tconst xhr = new XMLHttpRequest();\n\t\t\t\t\txhr.open(\"POST\", '<%= api.url(\"restore_backup\") %>', true);\n\t\t\t\t\txhr.onreadystatechange = function () {\n\t\t\t\t\t\tif (xhr.readyState === 4) {\n\t\t\t\t\t\t\tif (xhr.status === 200) {\n\t\t\t\t\t\t\t\tconst resp = JSON.parse(xhr.responseText);\n\t\t\t\t\t\t\t\tif (resp.status === \"success\") {\n\t\t\t\t\t\t\t\t\tcurrentChunk++;\n\t\t\t\t\t\t\t\t\tdocument.getElementById(\"upload-btn\").value = \"Uploading... \" + Math.floor((currentChunk / totalChunks) * 100) + \"%\";\n\t\t\t\t\t\t\t\t\tsendNextChunk();\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\talert(\"Upload error: \" + resp.message);\n\t\t\t\t\t\t\t\t\tdocument.getElementById(\"upload-btn\").value = \"<%:UL Restore%>\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\talert(\"Upload failed with status \" + xhr.status);\n\t\t\t\t\t\t\t\tdocument.getElementById(\"upload-btn\").value = \"<%:UL Restore%>\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t};\n\t\t\t\t\tconst formData = new FormData();\n\t\t\t\t\tformData.append(\"filename\", file.name);\n\t\t\t\t\tformData.append(\"chunk\", chunk);\n\t\t\t\t\tformData.append(\"chunk_index\", currentChunk);\n\t\t\t\t\tformData.append(\"total_chunks\", totalChunks);\n\t\t\t\t\txhr.send(formData);\n\t\t\t\t} else {\n\t\t\t\t\t//alert(\"Upload completed.\");\n\t\t\t\t\tdocument.getElementById(\"upload-btn\").value = \"<%:UL Restore%>\";\n\t\t\t\t\twindow.location.href = '<%= api.url(\"log\") %>'\n\t\t\t\t}\n\t\t\t}\n\t\t\tsendNextChunk();\n\t\t};\n\t\treader.readAsArrayBuffer(file);\n\t}\n\n</script>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/global/faq.htm",
    "content": "<%\nlocal api = require \"luci.passwall2.api\"\n-%>\n<style>\n    .dns-con {\n      padding: 1rem;\n    }\n    .faq-title {\n      color: var(--primary);\n      font-weight: bolder;\n      margin-bottom: 0.5rem;\n      display: inline-block;\n    }\n    .reset-title {\n     color: var(--primary)；\n     font-weight: bolder;\n     margin-bottom: 0.3rem;\n     display: inline-block;\n     margin-top: 1.2rem;\n     text-decoration: underline;\n    }\n    .dns-item {\n     margin-bottom: 0.8rem;\n     line-height:1.2rem;\n    }\n    .dns-list {\n\t\ttext-indent:1rem;\n\t\tline-height: 1.2rem;\n}\n</style>\n<div class=\"dns-con\">\n\t<div id=\"faq_dns\">\n\t\t<ul>\n            <b class=\"faq-title\"><%:DNS related issues:%></b>\n\t\t\t<li class=\"dns-item\">1. <span><%:Certain browsers such as Chrome have built-in DNS service, which may affect DNS resolution settings. You can go to 'Settings -> Privacy and security -> Use secure DNS' menu to turn it off.%></span></li>\n\t\t\t<li class=\"dns-item\">2. <span><%:If you are unable to access the internet after reboot, please try clearing the cache of your terminal devices (make sure to close all open browser application windows first, this step is especially important):%></span>\n\t\t\t    <ul><li class=\"dns-list\"> ◦ <span><%:For Windows systems, open Command Prompt and run the command 'ipconfig /flushdns'.%></span></li>\n\t\t\t        <li class=\"dns-list\"> ◦ <span><%:For Mac systems, open Terminal and run the command 'sudo killall -HUP mDNSResponder'.%></span></li>\n\t\t\t        <li class=\"dns-list\"> ◦ <span><%:For mobile devices, you can clear it by reconnecting to the network, such as toggling Airplane Mode and reconnecting to WiFi.%></span></li>\n\t\t\t    </ul>\n\t\t\t</li>\n\t\t\t<li class=\"dns-item\">3. <span><%:Please make sure your device's network settings point both the DNS server and default gateway to this router, to ensure DNS queries are properly routed.%></span></li>\n\t\t</ul>\n\t</div>\n\t<div id=\"faq_reset\"></div>\n</div>\n\n<script>\n\tvar origin = window.location.origin;\n\tvar hide_url = origin + \"<%=api.url(\"hide\")%>\";\n\tvar show_url = origin + \"<%=api.url(\"show\")%>\";\n\t\n\tfunction hide(url) {\n\t\tif (confirm('<%:Are you sure to hide?%>') == true) {\n\t\t\twindow.location.href = hide_url;\n\t\t}\n\t}\n\t\n\tvar dom = document.getElementById(\"faq_reset\");\n    if (dom) {\n\t\tvar li = \"\";\n\t\tli += \"<a href='#' class='reset-title' onclick='hide()'>\" + \"<%: Hide in main menu:%>\"+ \"</a>\" + \"<br />\" + \"<%: Browser access: %>\" + \"<a href='#' onclick='hide()'>\" + hide_url + \"</a>\" + \"<br />\";\n\t\tli += \"<a href='#' class='reset-title'>\" + \"<%: Show in main menu:%>\"+ \"</a>\" + \"<br />\" +\"<%: Browser access: %>\" + \"<a href='#'>\" + show_url + \"</a>\" + \"<br />\";\n\t\tdom.innerHTML = li;\n\t}\n</script>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/global/footer.htm",
    "content": "<%\nlocal api = self.api\nlocal appname = api.appname\n-%>\n<style>\n #cbi-<%=appname%>-socks .td.cbi-value-field > div { \n\twhite-space: nowrap;\n}\n@media (max-width: 1152px) {\n\t #cbi-<%=appname%>-socks .td.cbi-value-field > div {\n\t\twhite-space: normal;\n\t}\n}\n\n.shunt-tab-hidden {\n\tdisplay: none !important;\n\tvisibility: hidden !important;\n}\n\n@media screen and (max-width: 1152px) {\n\t#cbi-<%=appname%>-socks .cbi-section-table-titles {\n\t\tdisplay: none !important;\n\t}\n}\n\n@media screen and (min-width: 1152px) {\n\t#cbi-<%=appname%>-socks input[id*=\".<%=appname%>.\"][id$=\".port\"],\n\t#cbi-<%=appname%>-socks input[id*=\".<%=appname%>.\"][id$=\".http_port\"] {\n\t\twidth: 100px !important;\n\t\tmin-width: unset !important;\n\t\tmax-width: unset !important;\n\t\ttext-align: center !important;\n\t}\n}\n</style>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tvar shunt_list = JSON.parse('<%=self.shunt_list%>');\n\n\tfunction go() {\n\t\tvar _status = document.getElementsByClassName('_status');\n\t\tfor (var i = 0; i < _status.length; i++) {\n\t\t\tvar id = _status[i].getAttribute(\"socks_id\");\n\t\t\tXHR.get('<%=api.url(\"socks_status\")%>', {\n\t\t\t\t\tindex: i,\n\t\t\t\t\tid: id\n\t\t\t\t},\n\t\t\t\tfunction(x, result) {\n\t\t\t\t\tvar index = result.index;\n\t\t\t\t\tvar div = '';\n\t\t\t\t\tvar div1 = '<font style=\"font-weight:bold;\" color=\"green\">✓</font>&nbsp';\n\t\t\t\t\tvar div2 = '<font style=\"font-weight:bold;\" color=\"red\">X</font>&nbsp';\n\t\t\t\t\t\n\t\t\t\t\tif (result.socks_status) {\n\t\t\t\t\t\tdiv += div1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdiv += div2;\n\t\t\t\t\t}\n\t\t\t\t\tif (result.use_http) {\n\t\t\t\t\t\tif (result.http_status) {\n\t\t\t\t\t\t\tdiv += div1;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tdiv += div2;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t_status[index].innerHTML = div;\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t\t\n\n\t\tvar global_id = null;\n\t\tvar global = document.getElementById(\"cbi-<%=appname%>-global\");\n\t\tif (global) {\n\t\t\tvar node = global.getElementsByClassName(\"cbi-section-node\")[0];\n\t\t\tvar node_id = node.getAttribute(\"id\");\n\t\t\tglobal_id = node_id;\n\t\t\tvar all_node = node.querySelectorAll(\"[id]\");\n\t\t\tvar reg1 = /^cbid\\..*node\\.main$/;\n\n\t\t\tfor (var i = 0; i < all_node.length; i++) {\n\t\t\t\tvar el = all_node[i];\n\t\t\t\tif (!reg1.test(el.id)) continue;\n\n\t\t\t\tvar node_select = el;\n\t\t\t\tif (!node_select) continue;\n\t\t\t\tvar cbid = el.id.replace(/\\.main$/, \"\");\n\t\t\t\tvar hidden_select = document.getElementById(cbid);\n\t\t\t\tvar node_select_value = hidden_select ? hidden_select.options[0].value : \"\";\n\t\t\t\tif (!node_select_value || node_select_value.indexOf(\"_default\") === 0 || node_select_value.indexOf(\"_direct\") === 0 || node_select_value.indexOf(\"_blackhole\") === 0) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tvar to_url = '<%=api.url(\"node_config\")%>/' + node_select_value;\n\t\t\t\tif (node_select_value.indexOf(\"Socks_\") === 0) {\n\t\t\t\t\tto_url = '<%=api.url(\"socks_config\")%>/' + node_select_value.substring(\"Socks_\".length);\n\t\t\t\t}\n\t\t\t\tvar html = '<a href=\"#\" onclick=\"location.href=\\'' + to_url + '\\'\"><%:Edit%></a>';\n\n\t\t\t\tvar m = cbid.match(/\\.node$/);\n\t\t\t\tif (m) {\n\t\t\t\t\thtml += '<a href=\"#\" onclick=\"window.open(\\'' + '<%=api.url(\"get_redir_log\")%>?id=default&name=' + 'global' + '\\', \\'_blank\\')\"><%:Log%></a>';\n\t\t\t\t}\n\n\t\t\t\tnode_select.insertAdjacentHTML(\"beforeend\",\n\t\t\t\t\t'<div class=\"node-actions\" style=\"display:inline-flex; align-items:center; gap:4px; flex-wrap:wrap; margin-left:4px;\">'  \n\t\t\t\t\t+ html + '</div>'\n\t\t\t\t);\n\t\t\t}\n\t\t}\n\n\t\tvar socks = document.getElementById(\"cbi-<%=appname%>-socks\");\n\t\tif (socks) {\n\t\t\tvar socks_enabled_dom = document.getElementById(global_id + \"-socks_enabled\");\n\t\t\tsocks_enabled_dom.parentNode.removeChild(socks_enabled_dom);\n\t\t\tvar descr = socks.getElementsByClassName(\"cbi-section-descr\")[0];\n\t\t\tdescr.outerHTML = socks_enabled_dom.outerHTML;\n\t\t\trows = socks.getElementsByClassName(\"cbi-section-table-row\");\n\t\t\tfor (var i = 0; i < rows.length; i++) {\n\t\t\t\ttry {\n\t\t\t\t\tvar row = rows[i];\n\t\t\t\t\tvar id = row.id;\n\t\t\t\t\tif (!id) continue;\n\t\t\t\t\tvar dom_id = id + \"-node\";\n\t\t\t\t\tvar cbid = dom_id.replace(\"cbi-\", \"cbid-\").replace(new RegExp(\"-\", 'g'), \".\");\n\t\t\t\t\tdom_id = cbid + \".main\";\n\t\t\t\t\tvar node_select = document.getElementById(dom_id);\n\t\t\t\t\tif (!node_select) continue;\n\n\t\t\t\t\tvar hidden_select = document.getElementById(cbid);;\n\t\t\t\t\tvar node_select_value = hidden_select ? hidden_select.options[0].value : \"\";\n\t\t\t\t\tif (node_select_value && node_select_value != \"\") {\n\t\t\t\t\t\tvar to_url = '<%=api.url(\"node_config\")%>/' + node_select_value;\n\t\t\t\t\t\tvar html = '<a href=\"#\" onclick=\"location.href=\\'' + to_url + '\\'\"><%:Edit%></a>';\n\t\t\t\t\t\thtml += '<a href=\"#\" onclick=\"window.open(\\'' + '<%=api.url(\"get_socks_log\")%>?name=' + id.replace(\"cbi-<%=appname%>-\", \"\") + '\\', \\'_blank\\')\"><%:Log%></a>';\n\n\t\t\t\t\t\tnode_select.insertAdjacentHTML(\"afterend\",\n\t\t\t\t\t\t\t'<div class=\"node-actions\" style=\"display:inline-flex; align-items:center; gap:4px; flex-wrap:wrap; margin-left:4px;\">'  \n\t\t\t\t\t\t\t+ html + '</div>'\n\t\t\t\t\t\t);\n\t\t\t\t\t}\n\t\t\t\t} catch(err) {\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\tdocument.addEventListener(\"DOMContentLoaded\", () => setTimeout(() => {\n\t\tconst hiddenSelect = document.getElementById(\"cbid.<%=appname%>.<%=self.global_cfgid%>.node\");\n\t\tlet o_val = hiddenSelect.value\n\t\tconst o_hasItem = shunt_list.find(element => element.id == o_val);\n\t\thiddenSelect.addEventListener(\"change\", function(el){\n\t\t\tlet new_val = el.target.value\n\t\t\tconst new_hasItem = shunt_list.find(element => element.id == new_val);\n\t\t\tif (new_hasItem) {\n\t\t\t\tXHR.get('<%=api.url(\"update_node\")%>', {\n\t\t\t\t\tid: \"<%=self.global_cfgid%>\",\n\t\t\t\t\tdata: JSON.stringify({\n\t\t\t\t\t\tnode: new_val\n\t\t\t\t\t})\n\t\t\t\t},\n\t\t\t\tfunction(x, data) {\n\t\t\t\t\tif (x && x.status == 200 && data.code == 1) {\n\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\talert(\"<%:Error%>\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\ttry {\n\t\t\t\t\tdocument.getElementById(\"tab.<%=appname%>.<%=self.global_cfgid%>.Shunt\").classList.add('shunt-tab-hidden');\n\t\t\t\t\tdocument.getElementById(\"tab.<%=appname%>.<%=self.global_cfgid%>.Shunt\").style.display = \"none\";\n\t\t\t\t} catch (error) {}\n\t\t\t\ttry {\n\t\t\t\t\tdocument.querySelector('li[data-tab*=\"Shunt\"]').classList.add('shunt-tab-hidden');\n\t\t\t\t\tdocument.querySelector('li[data-tab*=\"Shunt\"]').style.display = \"none\";\n\t\t\t\t} catch (error) {}\n\t\t\t}\n\t\t});\n\t\tlet shunt_taboption = document.getElementById(\"container.<%=appname%>.<%=self.global_cfgid%>.Shunt\");\n\t\tif (shunt_taboption) {\n\t\t\tlet shunt_option_list = document.getElementById(\"cbi-<%=appname%>-shunt_option_list\");\n\t\t\tif (shunt_option_list) {\n\t\t\t\tshunt_taboption.appendChild(shunt_option_list);\n\t\t\t}\n\t\t}\n\t\tgo();\n\t}, 100));\n\t//setTimeout(\"go()\", 1000);\n\t//]]>\n</script>"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/global/status.htm",
    "content": "<%\nlocal api = require \"luci.passwall2.api\"\n-%>\n\n<style>\n/*!\nPure v1.0.1\nCopyright 2013 Yahoo!\nLicensed under the BSD License.\nhttps://github.com/pure-css/pure/blob/master/LICENSE.md\n*/\n.pure-g{letter-spacing:-.31em;text-rendering:optimizespeed;font-family:FreeSans,Arimo,\"Droid Sans\",Helvetica,Arial,sans-serif;display:-webkit-box;display:-webkit-flex;display:-ms-flexbox;display:flex;-webkit-box-orient:horizontal;-webkit-box-direction:normal;-webkit-flex-flow:row wrap;-ms-flex-flow:row wrap;flex-flow:row wrap;-webkit-align-content:flex-start;align-items: center;-ms-flex-line-pack:start;align-content:flex-start}@media all and (-ms-high-contrast:none),(-ms-high-contrast:active) {table .pure-g{display:block}}.opera-only :-o-prefocus,.pure-g{word-spacing:-.43em}.pure-u{display:inline-block;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-g [class*=pure-u]{font-family:sans-serif}.pure-u-1,.pure-u-1-1,.pure-u-1-12,.pure-u-1-2,.pure-u-1-24,.pure-u-1-3,.pure-u-1-4,.pure-u-1-5,.pure-u-1-6,.pure-u-1-8,.pure-u-10-24,.pure-u-11-12,.pure-u-11-24,.pure-u-12-24,.pure-u-13-24,.pure-u-14-24,.pure-u-15-24,.pure-u-16-24,.pure-u-17-24,.pure-u-18-24,.pure-u-19-24,.pure-u-2-24,.pure-u-2-3,.pure-u-2-5,.pure-u-20-24,.pure-u-21-24,.pure-u-22-24,.pure-u-23-24,.pure-u-24-24,.pure-u-3-24,.pure-u-3-4,.pure-u-3-5,.pure-u-3-8,.pure-u-4-24,.pure-u-4-5,.pure-u-5-12,.pure-u-5-24,.pure-u-5-5,.pure-u-5-6,.pure-u-5-8,.pure-u-6-24,.pure-u-7-12,.pure-u-7-24,.pure-u-7-8,.pure-u-8-24,.pure-u-9-24{display:inline-block;zoom:1;letter-spacing:normal;word-spacing:normal;vertical-align:top;text-rendering:auto}.pure-u-1-24{width:4.1667%}.pure-u-1-12,.pure-u-2-24{width:8.3333%}.pure-u-1-8,.pure-u-3-24{width:12.5%}.pure-u-1-6,.pure-u-4-24{width:16.6667%}.pure-u-1-5{width:20%}.pure-u-5-24{width:20.8333%}.pure-u-1-4,.pure-u-6-24{width:25%}.pure-u-7-24{width:29.1667%}.pure-u-1-3,.pure-u-8-24{width:33.3333%}.pure-u-3-8,.pure-u-9-24{width:37.5%}.pure-u-2-5{width:40%}.pure-u-10-24,.pure-u-5-12{width:41.6667%}.pure-u-11-24{width:45.8333%}.pure-u-1-2,.pure-u-12-24{width:50%}.pure-u-13-24{width:54.1667%}.pure-u-14-24,.pure-u-7-12{width:58.3333%}.pure-u-3-5{width:60%}.pure-u-15-24,.pure-u-5-8{width:62.5%}.pure-u-16-24,.pure-u-2-3{width:66.6667%}.pure-u-17-24{width:70.8333%}.pure-u-18-24,.pure-u-3-4{width:75%}.pure-u-19-24{width:79.1667%}.pure-u-4-5{width:80%}.pure-u-20-24,.pure-u-5-6{width:83.3333%}.pure-u-21-24,.pure-u-7-8{width:87.5%}.pure-u-11-12,.pure-u-22-24{width:91.6667%}.pure-u-23-24{width:95.8333%}.pure-u-1,.pure-u-1-1,.pure-u-24-24,.pure-u-5-5{width:100%}\n\t.block {\n\t\tmargin: 0.5rem;\n\t\tpadding: 0;\n\t\tfont-weight: normal;\n\t\tfont-style: normal;\n\t\tline-height: 1;\n\t\tfont-family: inherit;\n\t\tmin-width: inherit;\n\t\toverflow-x: auto;\n\t\toverflow-y: hidden;\n\t\tborder: 1px solid rgba(0,0,0,.05);\n\t\tborder-radius: .375rem;\n\t\tbox-shadow: 0 0 2rem 0 rgba(136,152,170,.15);\n\t}\n\t.img-con {\n\t\tmargin: 1rem;\n\n\t}\n\t.green {\n\t\tfont-size:.9rem;\n\t\tcolor: #2dce89;\n\t}\n\t.red {\n\t\tfont-size:.9rem;\n\t\tcolor: #fb6340;\n\t}\n\t.yellow {\n\t\tfont-size:.9rem;\n\t\tcolor: #fb9a05;\n\t}\n\t.block img {\n\t\twidth: 48px;\n\t\theight: auto;\n\t\t/* float:right; */\n\t}\n\t.block h4 {\n\t\tfont-size: .8125rem;\n\t\tfont-weight: 600;\n\t\tmargin: 1rem 0rem 1rem 1rem;\n\t\tcolor:#8898aa!important;\n\t\tline-height: 1.8em;\n\t\tmin-height: 48px;\n\t}\n\t\n\t.check {\n\t\tcursor: pointer;\n\t}\n\n\t@media screen and (max-width: 720px) {\n\t\t.block {\n\t\t\tmargin: 0.2rem;\n\t\t}\n\t\t.pure-u-1-4 {\n\t\t\twidth: 50%;\n\t\t}\n\t\t.pure-u-1-2 {\n\t\t\twidth: 100%;\n\t\t}\n\t\t.block h4 {\n\t\t\tmargin: 1rem 0rem 1rem 0.5rem;\n\t\t}\n\t}\n\t\n\t@media screen and (max-width: 480px) {\n\t\t.block img {\n\t\t\twidth: 36px;\n\t\t}\n\t}\n\n</style>\n\n<fieldset id=\"_passwall2_status_fieldset\" class=\"cbi-section\">\n\t<div class=\"pure-g status\">\n\t\t<div class=\"pure-u-1-4\">\n\t\t\t<div class=\"block pure-g\">\n\t\t\t\t<div class=\"pure-u-1-3\">\n\t\t\t\t\t<div class=\"img-con\">\n\t\t\t\t\t\t<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAATEAAAExCAYAAAAUZZVoAAAABGdBTUEAALGPC/xhBQAAACBjSFJNAAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAABmJLR0QAAAAAAAD5Q7t/AAAACXBIWXMAAADIAAAAyABj+uetAAAikklEQVR42u3de5gddZ3n8XeSTggEcidcZAZZLFZXShwV2V0ccBSFclwvICpyWW+4OnlW5wFl5DKjQmYVkHUBFxEFBYRhNg94G6ZACCAQkNvDpRJCqFwMIZ10Ounu9DV93z+qOlRO+pw+p05VfX9V9X09j4/Q6T71PSfhk9+p8/39vtNQqgbL9aYDs4ADgfnAQmAJcHD4v8OARcDi8H8HAfOAOeHPzQLGgTFgFOgF+oAeYCfQAbQD28P/bwv/uSP89W5gABj2HVv65VAGmiZdgJJnud5MgnB6E3A08A7gncAJBEFlCg94BngBeAXYSBB6fb5jj0kXp2RoiJVIuKpaQBBUfwWcDHyUYPWUd88DDwBPAquALb5jD0gXpdKnIVZQlusBzAWOAU4EPkkQWmXSC9xJEG7PEgTbsHRRKlkaYgURhtYighXWx4DzgdnSdRnoKeB24BFgne/Yg9IFqeZoiOWY5XpzCO5ffQK4EJghXVMOrQR+AawAXtN7a/mjIZYj4WrrcOBDwN8B75WuqYB+AvwKeF7vqeWDhpjhLNebBhwFnAH8E0Grg8rGvwM/Blb6jt0tXYyanIaYgcIV15HAp4GrpOtRADwIXAM85jt2n3Qx6g0aYgaxXG8hwU35qwkaR5WZ7gSuA571HXtUupiy0xATZrleC/CfgcuAU6XrUQ27BLjNd+wt0oWUlYaYEMv1lgDnEay6VP49SfAX0aO+Y49IF1MmGmIZCu91vRP4LvBx6XpUar4O3OE7dod0IWWgIZaB8C3jacDNBJunVTncCFztO/YG6UKKTEMsRZbrHQCcBfxcuhYl6gHgIuAFPYkjeRpiKbBc7yCCbT/XSNeijLKK4M/FnzTMkqMhlqAwvL6K9nap2tYTfKjzhIZZ8zTEEmC53v7Alwl6h5Sq12rg875jPytdSJ5piDUhvGH/WYJTEZSK62Hga75jr5UuJI80xGIIWyVOIbhhq1RSbgEu9h17u3QheaIh1iDL9d4G3Aa8R7oWVVjfAq7Xs87qoyFWJ8v15gGXEzQyKpUFB7hPb/7XpiE2hfAonDOBf5WuRZXSo8B5vmNvki7EVBpiNViuZwH3AMdK16JK71vAtTojYF8aYpMIR5hdAPxAuhalIgaBE33Hfk66EJNoiFWwXO84ghMJ9peuRakqrgK+q8dnBzTEQuHq6xKCEyaUyoPjtVFWQwwAy/XeSjD1ZqF0LUo16ArgijLfKyt1iIWfPH6F4MgUpfJqO8G9snXShUgobYhZrrcYWA68X7oWpRJyHnB72frKShliluudCDwuXYdSKVgOfMl37B7pQrJSqhAL3z5ehLZOqOI71nfs1dJFZGG6dAFZsVxvPsHsQA0wVQarLNf7nHQRWSjFSsxyvbcTnKqpVNlcD1xY5E8vCx9ilut9kmDrkFJl9TJwsu/YO6QLSUNhQyy8/3UpQR+NUgps37EL946kkCFmud5s4A7gdOlalDLMR3zHdqWLSFLhQizs/3oK+A/StShlqKW+Y98gXURSChVilusdDZSya1mpBl0N/IPv2OPShTSrMCFmud67gdJvhlWqAXcDn/Mde0i6kGYUIsQs1/sgQQ+YUqoxTwMf8B27T7qQuHIfYtpCoVTTWgk6/DulC4kj1yFmud65BJOHlFLNGQT+Mo/j4nK77chyvfPRAFMqKfsBbZbrHS5dSKNyGWKW6/0dcJN0HUoV0BbL9Y6QLqIRuXs7GQbY/5WuQ6mCO8J37C3SRdQjVyEWvoXUFZhS2Tjcd+yt0kVMJTchpjfxlRJxsOkbx3MRYtpGoZSYLuDNvmPvki6kGuNv7IeNrBpgSsmYDzxjuZ6xc1iNDrFwK5F24islywJ+b7lei3QhkzE2xMLN3LoXUikzfBC4yXI96Tr2YWSIhcfp6GkUSpnlCwQHjRrFuBv74YGGq9HzwJQy1Tm+Y98hXcQEo1Zi4ZHSd6ABppTJfhXObjWCUSFGsFTVI6WVMt/jlusdJV0EGPR20nK9TwC/lq5DKVW3YWCh79i9kkUYsRIL50JqgCmVLzOB5eFtIDHiIRZO5i7cGCmlSuI04CLJAkQTNEzwB4EPSNahlGrah3zHFmlMl16JXYQGmFJF8IDlem+SuLDYSiz8iPZxqesrpRK3Hnir79gjWV5UZCUWduRrgClVLEcD38v6opmvxML7YCuAv8n62kqpTHzAd+yHs7qYxErsK2iAKVVkD1mutyiri2W6ErNc763AmiyvqZQScT9wmu/YqV8os5WY5XozgZVZXU8pJepU4JwsLpTl28lLgIUZXk8pJev2LMa/ZfJ20nK944AXsriWUsoozwHH+449ntYFUl+JhW8jn0z7OkopI70bODfNC2TxdvICwNghA0qp1N1qud5haT14qm8nLdezgFfTvIZSKhdS+7QytZVY2NSqo9aUUhB8WnlaGg+c5tvJTwPHpvj4Sql8cS3Xm5P0g6YSYpbrzQPuSv0lUUrlzcVJP2BaK7HLU34hlFLA3Jkz+MF/XMxVx2S2y6dZl1qu95YkHzDxG/uW670NeDmzl0SpEpo7cwafP3IRZy+exfg4fOLFNrbtHpYuq16PA3+d1E3+RFdi4XTg27J/TZQqh7kzZ7D06CX86f3H8Mk5Y4yOjdE2Y3aeAgzgfSR4GGrSbydPAd6T6cuhVAlMhNezH3wb/+Mv5rF1WxuzZs5k8cKF/Mhvky4vjhWW67Uk8UCJPAhAWNADYi+JUgU0d+YMzv3LRXzDWgLAru4eunt6mDVrFosXBVuRn9wpOjGtGWcDtzb7IEmuxD4r91ooVSzRldc3rCWMjY3Rtr2d7p4eZra0sGTxIqZNm8Ztm3YyOJbatsS0/TKJlotEVmKW6+0P3C79iiiVd5UrL4ChoSHa2ncAMGPGDA5ZcjDTpgWfyd35Wod0yc1aClzVzAMktRL7svQroVSeVa68JvT29u0JsGnTpnFoJMC6h0fZ0DcoXXqzrrRcr6kjuppeiVmudxBwnfQroVQeTbbyAhgbH6ejo5OB3bv3fO3wQw9h+vQ31h3LXtkqXX5SLgAui/vDSazEvir9CiiVN9VWXgDDwyNsad1aM8AAVrT1SD+NpFwaTkCLpamVWLgKa+r9rFJlUm3lNaG/f4CdnZ17fe2wQw9hxowZe33t/m3d9IyMSj+dJF1IzC1Jza7Ezpd+5krlQa2VF8D4+DidXV37BtghS2ipCDCAn21sl35KSft23HtjsVdilusdAFwj/cyVMtlUKy+AkdFR2ra3MzY2ttfXD12yhJaWyf8TXdU9IP3U0rAUuKLRH2pmJXaW9DNWylRTrbwm7N49yNZtbfsE2CFLDmbmzMkD7Mq128hva1hNl1uud2CjPxRrJRZ25/9c+hkrZZp6Vl4TJrrvKy05eDGzZs6s+nO/a+2SfpppOhv4aSM/EHcllsoJjUrlVb0rL2Cv7vtKSxYvYr9Zs6r+7Itd/bQPjkg/3TTdGA4XqlvDK7HwpIqbpZ+pUiZoZOUFe3ffVzp40UL222+/mj9/7brt0k85Cx8G7q33m+O8nXwnUN/vmFIF1Wh4QdB937lr16S/tnjhQmbPnj3lYzzd0Sf91LNwk+V6b6r3vLE4IfZd6WeolJQ44TVZ933UwgUL2H//qQPs5o07GCroHf0KhwM24NXzzQ2FmOV6S4CPSz9DpbIWJ7wg6L7ftr36W8AF8+cz54D6xrLetTn3m70bcTHwuXq+sdEb++dJPzOlstTIDftK/f0DNQNs/rx5HDjngLoeq31whE39Q9IvR5bOqrf5te6VWNhWcbX0M1MqC3FXXhB033ft2kVvX3/V75k39yAOOrD+o7S+X5zN3o04kzraLeoeFGK53vuAx6SflVJpaia8oHr3/V7XOOhA5s2d29DjvuvBl+kdGWvoZwpiuu/YNW8ENnJPLPZRGUqZrtnwgqD7vn3nzprfc+CcOQ0H2O9bu8oaYADHAS/U+oa6Qix8b3qq9LNRKmlJhBdU776PmnPAASyYP6/hx77lzzsb/pkC+TrwxVrfUO+N/Y9JPxOlktTMDfuoWt33UfvvP5uFC+bHusaankJu9q7XF8LDJqqaciUWdujrDX1VCEmtvKB2933U7P32Y/HCeCcwL1uztaibvRtxMuBW+8V63k4eCcQ+dVEpEyQZXlC7+z4qOlotjnu3Tn2NEriYJkPs09LPQKm4kg6vqbrvo6Kj1eJ4pqOPnUOF3uxdr7+2XG+B79idk/1izRCzXG8aevy0yqGkwwum7r6PqhytFsf160ux2btepwDLJ/uFqVZiR0lXrlQj0ggvmPzs+2oqR6vF9Vxnf1M/XzDfJmaInSFduVL1SCu86um+rzTZZKJG3bihnWG9ox/1Lsv15vuO3VX5C1VDLPxU8p+kK1eqlrTCC+rrvq+URIABLN9c36qvZE4Cflf5xVorscOBhs+7VioLaYYX1Nd9X2my0WpxvD4wxOaBUm32rtdSGgyxU6QrVqpS2uEF9XXfV6o2Wi2Oq9a2pfbccu7DluvN9h17r4+Ga4XYUumKlZqQRXiNjY3RvmMnQ8PDDf1crdFqcTzaXpjJ3mk4Dngq+oVJX3nL9eYA75WuVqkswgvq776vVGu0Whx3b+mkf7S0m73r8SkqQqzaHch3SFeqyi2pvY316O3tixVgU41Wi+PWcm/2rsc3ww8d96j2V8gnpCtV5ZTVygsa676vNNVotbjW9jReSwkdBuw5JXKfEAtT7pvSVapyyTK8oLHu+0r1jFaL4zurW9HOsLqcAPxm4l8mW4ktIv5QXaUaknV4QWPd95XqHa0Wx31tutm7Tp8lEmKThdVfSVeoii/Le14TxsfH6ezqih1g9Y5Wi2Pljl46h0YzeR0K4DOW6+3JrslWYnoAokqNxMoL4nXfRzUyWi2OG9a3Z/p6FMChQCtUhFh4P+x86epU8UiFF8Trvo9qZLRaXM936WbvBr2HsHu/ciU2F0hnvaxKSTK8IF73fVSjo9XiuG7ddkbG9ZZ+gz5KGGKV98SOka5MFYPEPa+oes++r/kcDjqQuQcdlHqt92zRzd4xfGGiX6xyJXaidGUq36RXXhC/+z4qzmi1ODb0DdI60Ng2JwUE2TUX6K4MsdOlK1P5ZEJ4Qf1n39cSd7RaHD/Uzd7NOAp4cU+IhR9ZniRdlcoXU8Krme77qGZGq8WxcmdvZtcqoOOJhhiwQLoilR+mhBc0130f1cxotTju2tzBgG72boYD/DwaYkdLV6TMZ1J4QXPd91HNjlaL4/ZNutm7SadbrrfXjX3t1FdVmRZecc6+r6bZ0WpxDI6Ns653MLPrFdgB0RB7v3Q1yjymhRc0330flcRotTguf1k3eyfksGiI/a10NcocJoYXNN99H5XUaLU4/tDWnfk1C8pqAbBcbyaQflefMp6p4QXNd99XSmoyUaMe2t7DrmHd7J2Qd0+sxLK9o6mMY3J4xT37vhapAAP46Qbd7J2gEydC7HDpSpQMk8MLkum+r5TUaLW4Xto1IHbtAjplIsTeIl2Jypbp4QXJdN9XSnK0WhzXvNrGqG72TtKeMS06GKQk8hBeSXXfV0p6tFocv23tEr1+EU38jr5TuhCVrjyEFyTXfV8p6dFqcazp2c223brZO2kTv6snSBei0pGX8ILkuu8rpTFaLY4fvaqbvdPQEm78Pli6EJWsPIVXkt33ldIarRbHk7rZOxUtgBm/wyoReQovSLb7vlJao9XiuG3TTgbH9IZ+GlrQJtdCyFt4QbLd95XSHK0Wx52vdUiXUFgtQDanv6lU5DG8IPnu+6g0R6vF0T08yoY+3eydlha0Wz+X8hpeaXTfR6U9Wi2OZa9slS6h0FqAfP1XUHJ5DS9Ip/s+KovRanGsaEtnxakCLegnk7mQ5/CCdLrvo7IYrRbH/du66RnRzd5p0pWY4fIeXml130dlNVotjp9t1M3eaWshGAeuDJP38IL0uu+jshqtFteqbt3snbYWYJF0EeoNRQgvSK/7PirL0WpxXLl2G9oalr4WYLF0Eao44ZVm931U1qPV4vidbvbOhK7EhBUlvCDd7vuorEerxfFiVz/tgyPSZZTCxChwlbEihRek230fJTFaLY5r16V7L1C9QTv2M1a08IJ0u++jJEarxfV0R590CaXRApjXHVhARQyvtLvvo6RGq8Vx88YdDOkd/cy0AGZs8y+oIoYXpN99HyU5Wi2OuzbrZu8s6VE8KSlqeEH63feVJCcTNap9cIRN/UPSZZRKC+gg4iQVObyy6L6vlKcAA/i+bvbOXAswBsiNfymIIocXZNN9X0l6tFocj7TrZu+stQCjgPwB5DlV9PCCbLrvK0mPVovj961d9I6k2yOn9tUC9ALmnCCXE2UIr6y67yuZMFotjlv+nH6fnNpXC9CHbj2qWxnCC7Lrvq9kwmi1uNb06GZvCS1At3QReVCW8ILsuu8rmTJaLY5la7bqZm8hLYA2tdRQpvCC7LrvK5k0Wi2Oe7dm13Ki9qYhVkXZwivL7vtKJo1Wi+OZjj52DulmbyktgB49GVG28IJsu+8rmTZaLY7r1+tmb0ktgP4OUM7wguy776NMG60W13Od2X56q/ZW+pVYWcNLovs+ysTRanHcuKGdYb2jL6oFaJMuQsr0afDwycdwUEu+miqbJdF9H2XqaLU4lm/OtglY7Ws6JX47OTYOJ6x4hf/9anlyvL9/QDTATB2tFsfrA0NsHtDN3tKmU/JPJ0fGx7lxQzt/+/i6Qs8HHB8fp7OrK/PtQ1Emj1aL46q15fnLz2TTAd0rAfi9uwu7KhsZHaV1W1vm24eiTB+tFsejutnbCNMB/Z0IFXFVtnv3IFu3tWW+fSjK9NFqcdy9pZP+Ud3sbYLpgH4+XKEoq7Jd3T0i24ei8jBaLY5bdbO3MaYD2bdo50CeV2VjY2O0bW8X2T4UlYfRanGt7ZFpTVH7mu47NoAnXYip8rYqGxoaYsvWbSLbh6LyMlotju+sbtXjkA0yce7v09KFmCwvq7Le3j6x7UNReRqtFsd9bbrZ2yQTIfaidCF5YOqqbGx8nB07O8S2D0XlabRaHCt39NI5ZO5fZGU0EWJrpQvJC9NWZcPDI2xp3Sq2fSgqb6PV4rhhfal36RlpIsQ2SBeSNyasyqS77yvlbTJRHM936Yf5hlk/8SfOrPdHOSG1KjOh+75SGQLsunXbGRnXW/qGeWjiT12fdCV5luWqzITu+0p5HK0Wxz1bzPlLQ+3x1HQA37HHgOelq8mzLFZlJnTfV8rjaLU4NvQN0jqgLZUGWhVd/z8gXU0RpLUqM6H7vlJeR6vF8UPd7G2qjdEQe1K6mqJIclVmSvd9pTyPVotj5c5e6RLU5DqiIbZKupqiaXZVZkr3faU8j1aL467NHQzoZm8Tveo79kg0xLZIV1REcVdlpnTfV8r7aLU4bt9k1tt4tcdv4Y0+MXzHHgB0zZySeldlJnXfV8r7aLU4BsfGWdc7KF2GmtyjEAmx0J3SVRXZVKsyk7rvKxVhtFocl7+sm70N9iLsG2L6CWUGJluVmdZ9H1WU0Wpx/KGtW7oEVd022DfEnpWuqiyiq7LtnWZ130cVZbRaHA9t72HXsPz+WDWp533HHoZ9Q0xv7mfM793Nxa+aeeO4SKPV4vjpBt3sbbA9t772CrEw2f4kXV3ZPNY5wMB0s3quijRaLa6Xdg1Il6Cqe2TiHybbsfsr6erK6MrXzGlmLdpotTiuebWNUd3sbbJXJv5hshB7RLq6MjJlNVbE0Wpx/La1S7oEVV2r79h72sEmC7F10hWWlfRqrIij1eJY07ObbbvN2iWh9nJT9F/2CTHfsQeBJ6SrLCPJ1VhRR6vF8SPDjh9X+/i36L9UO8XuFukqy0piNVbk0WpxPKmbvU33cvRfqoXYCukqyyrr1ViRR6vFcdumnQyO6Q19gz0TbpHco1qIvSZdaZlltRor+mi1OO58rUO6BFXbDZVfmDTEwpNeb5jy4VQqsliNFX20Whzdw6Ns6NPN3obb511irckOd0hXW2ZprsbKMFotjmWvbJUuQU3t9cov1AoxPXNfUJqrsTJMJopjRZs5DcdqUst8x97nhmXVP8nhzbN/l666zNJYjWmATe7+bd1GDENWNS2f7ItT/Wn+sXTVZZb0aqwso9Xi+NlG3eydA6sn++JUIbZSuuqyS2o1VpbRanGt6tbN3oa7znfsSZfKNUPMd+xu4EHp6sssidVYmUarxXHl2m1oa5jxflntF+q5OXKNdPVl18xqrGyj1eL4nW72zoOXqv1CPSH2mHT1ZdfMamzT5tfZ9LqedVnNi139tA+OSJeharuy2ltJqCPEfMfuQweIiGtmNdbZ1cWLq1/WMJvEtevMnGug9lJzL3e9n7VfJ/0syq7Ze2Pj4+MaZpN4uqNPugRV2wDwaq1vqDfEdICIAZL4pFLD7A03b9zBkN7RN93f+45d8xvqCrHw/egl0s+m7JLsG9Mwg7s262bvHLh7qm9opHX7Nulno5Lv4i9rmLUPjrCpf0i6DFWb6zv2lKPA6g4x37G3AE9KP6uyS2tPZdnC7Pu62TsPLq/nmxrdRHeZ9LNS6Z5wUZYwe6RdN3vnwNP1fFOjIfao9LNS2Zw3VuQw+31rF70jY9JlqNq+Fp5rOKWGQsx37BHg69LPTmV3+utEmP2XB1fzrZdeb/4BDXDLn82cuK728i/1fmOcM1n0sEQDZHkW//mt4+wcGee3rV28/Q/5D7M1PbrZ23A/9R17V73f3HCI+Y7dAdwo/SxVNqux81vH2RVZ1A+P5TvMlq3Zqpu9zXdVI98c93S8q6WfpUp/NVYZYFF5DbN7t9b9F7yS8UffsTc08gOxQiy8yAPSz1altxqrFWBReQqzZzr62Dmkm70N961Gf6CZc4ovkn62Kp3VWL0BFpWHMLt+vW72NtxG4JlGf6iZEHsB8KSftUp2NRYnwKJMDrPnOvulS1C1fXmqfZKTiR1i4cW+Iv2sVXKrsWYDLMq0MLtxQzvDekffZLuAh+P8YLNjb/4ErJd+9qr51ViSARZlSpgt39wpdm1Vl89MNo6tHk2FWLgaO0/62avmVmNpBViUZJi9PjDE5gHd7G2wHpr4oDCJAYRPUGWUkspWnNVYFgEWJRFmV61ty+4JqjhOr3eL0WSaDrFwNfZ56VdBNb4ayzrAorIMs0d1s7fJtgArmnmAREZB+479LDFvyqlk1bsakwywqLTD7O4tnfSPGvBEVTVnxr0XNiHJefZfE34xFPWtxkwJsKi0wuxW3extsid8x276jMLEQsx37LVMMZVEZaPWaszEAItKOszW9uyWfkqqui8l8SBJrsQALhZ4IVSFaqsx0wMsKokw+87qVrQzzFg/9x37lSQeKNEQ8x17OzH2PqnkVa7G8hRgUc2E2X1tutnbYIkNHkp6JQZwfYYvhKrisc4BhmcEq7G8BlhUo2G2ckcvnUOjdTyyEvA/fcduT+rBpqVRoeV6pwFuZi+JmtSHFs5m2+AoXt+wdCmJmzl9Gh85dB5Xv+OISX/97Kc28kynDsY11CzfsRP7Q5lWiAH8ETgpoxdFlVS1MPtP969mZFzviBnoZN+xE53VkUqIAViu92aCozWUSl00zK5bt50fr9Njdwx0j+/YZyT9oKmFGIDlet9ET4FVGZo5fRot06YxoA2uJjrUd+zE94ClcWM/6lpgMOVrKLXH8Ni4BpiZ/nsaAQYph1h48+7ENK+hlDLey8DtaT142isxfMd+Dn1LqVSZ/bdm90fWknqIhb6T0XWUUmZZ2uj0okZlEmK+Yw8Ax2dxLaWUMVaTwYzarFZiE8f1XJHV9ZRS4j7SzGGH9cosxEJXANrAo1TxneM79mtZXCjTENNPK5Uqhd8Ad2R1sVSbXauxXO9c4DaJayulUrfAd+yurC6W9dvJCbcDy4WurZRKz3uzDDAQWokBWK53IMGoJqVUMVzgO/aPsr6o1EoM37F7gWOlrq+UStT9wP+RuLDYSmyC5XqfI8ObgEqpVMz3HVvkKF2xldgE37HvRE+DVSrPjpUKMDAgxEIXEmwSVUrlyxm+Y6+WLMCIEAv7x06WrkMp1ZDv+Y59j3QRRoQYgO/YOwBbug6lVF3uBb4nXQQYcGO/kg4ZUcp424GjfMfuly4EDFqJTfAd+z5gqXQdSqmqjjMlwMDAEAPwHfsG9CBFpUz0dt+xt0kXEWVkiIX+ARC/aaiU2uMk37GN6yIw7p5YlOV6s4DHgPdK16JUyZ3uO/avpYuYjNEhBmC53hzgVeBw6VqUKqkv+o79C+kiqjH57SQAvmP3Eeyx1NFvSmXvApMDDHIQYgC+Y3cCR0rXoVTJ/KPEqRSNykWIAYSDN98kXYdSJfHPwDLpIuqRmxAD8B27FfgL6TqUKrj/BVzmO/nYQJOrEAPwHft14AjpOpQqqGXApXkJMMjBp5PVWK53GNAqXYdSBfKPwLI8BRjkOMQALNdbDPjAfOlalMo5kaOlk5C7t5NR4ckXbyYIMqVUPF/Ka4BBzkMMIDxR8jhghXQtSuXQJ33HvkW6iGbkPsQAfMceAE4DjG7KU8owJ/mO/RvpIppViBAD8B17BPgicJl0LUrlwNt9x35Muogk5PrGfjWW650N/Eq6DqUMtAOwTTtOpxmFWYlF+Y59B/A+6TqUMsy/AUcWKcCgoCEG4Dv2SuAoYFi6FqUMcDnwMZNOZE1KId9ORlmudyCwnODGv1JlZOxZYEkofIgBWK43DbgI+IF0LUpl7FjpuZBpK0WITbBc7xTgAek6lMrAA8CnfMfuli4kbYW9JzYZ37EfJNg8vl66FqVS9PfAqWUIMCjZSmyC5XotBIM/L5GuRamEneA79tPSRWSplCE2wXK9vwEekq5DqQT8Bvh8uA2vVEr1drKS79gPA4uB+6VrUaoJZxPsgSxdgEHJV2ITLNcDOAe4XboWpRqwBnB8x94kXYgkDbEIy/WOIFiWv1u6FqWmsBS40XfsMelCpGmIVQh7ys4FbpWuRalJrAI+7jv2BulCTKEhVkV4/PUvgFOla1Eq9AXgVt+xx6ULMYmGWA3hvbLTAFe6FlVq9wBf8x17u3QhJtIQq4PlenOAi4FLpWtRpXOy79iPShdhMg2xBliu9xaCt5h6zI9K2zeAn/iOraewTEFDrEHhW8wPoGf6q3TcDFzsO3a7dCF5oSEWU7h16Wzgl9K1qEJYCXzZd+xXpAvJGw2xJoX3y5YCV0rXonLpNeAs37GfkC4krzTEEmK53kLgAvTmv6pPN/Ap4EFtmWiOhljCwqnkFwLflq5FGakHOBN4QLvtk6EhlpJwZbaU4GxzpTYRNKs+oiuvZGmIpSw84/8c4CfStSgRfwS+CTzrO7Z0LYWkIZYRy/VmAh8GbgIOl65Hpe4nwA91j2P6NMQyFvaZ2QQ7AM6Srkcl7qvAv/qO3SVdSFloiAkK75udCdwoXYtqyr3APwNP6c367GmIGSA8/uc44OsEN3+V+foJBnLc4zv2TuliykxDzDCW6x0AnEwwxET3aJrn+wRnza3VG/Vm0BAzmOV6C4BTCHrO3iVdT4ldSxBcL/mOPSpdjNqbhlhOWK43HziJoPfsw9L1lMAy4P8Ba3zHHpEuRlWnIZZDluvNJriH9imCHiTVvGcI2iIeBF7XhtT80BDLubBl4zDgBOCzwGeka8qJVoJPhe8DVvmOPSBdkIpHQ6xgLNebDhwKvAf4KMGnnS3SdRngeeBfCIYlr/Udu1e6IJUMDbGCC1dqc4GjgOMJZgacIV1XytYBvwYeIZgOtFVPSC0uDbESCoPtAIK3oRbBqu2/EnwSOlO6vgasI9ib+CRBWG0EOvRGfLn8f+GUFkYW510jAAAAJXRFWHRkYXRlOmNyZWF0ZQAyMDE2LTA5LTE3VDE1OjIxOjMyKzA4OjAwR74VGwAAACV0RVh0ZGF0ZTptb2RpZnkAMjAxNS0wMi0yNFQxODo0NDo0NyswODowMM5zM3oAAABNdEVYdHNvZnR3YXJlAEltYWdlTWFnaWNrIDcuMC4xLTYgUTE2IHg4Nl82NCAyMDE2LTA5LTE3IGh0dHA6Ly93d3cuaW1hZ2VtYWdpY2sub3Jn3dmlTgAAAGN0RVh0c3ZnOmNvbW1lbnQAIEdlbmVyYXRvcjogQWRvYmUgSWxsdXN0cmF0b3IgMTcuMS4wLCBTVkcgRXhwb3J0IFBsdWctSW4gLiBTVkcgVmVyc2lvbjogNi4wMCBCdWlsZCAwKSAgbjvP9wAAABh0RVh0VGh1bWI6OkRvY3VtZW50OjpQYWdlcwAxp/+7LwAAABh0RVh0VGh1bWI6OkltYWdlOjpIZWlnaHQAMzA1DH+L0QAAABd0RVh0VGh1bWI6OkltYWdlOjpXaWR0aAAzMDWfjtuMAAAAGXRFWHRUaHVtYjo6TWltZXR5cGUAaW1hZ2UvcG5nP7JWTgAAABd0RVh0VGh1bWI6Ok1UaW1lADE0MjQ3NzQ2ODfo5GxtAAAAEnRFWHRUaHVtYjo6U2l6ZQAxNS4yS0J7Sgm2AAAAX3RFWHRUaHVtYjo6VVJJAGZpbGU6Ly8vaG9tZS93d3dyb290L3NpdGUvd3d3LmVhc3lpY29uLm5ldC9jZG4taW1nLmVhc3lpY29uLmNuL3NyYy8xMTg1MS8xMTg1MTUzLnBuZx52BOUAAAAASUVORK5CYII=\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"pure-u-2-3\">\n\t\t\t\t\t<h4 id=\"status_node\">Core<br /><span class=\"red\"><%:NOT RUNNING%></span></h4>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"pure-u-1-4 check\" onclick=\"check_connect('baidu', 'https://www.baidu.com')\">\n\t\t\t<div class=\"block pure-g\">\n\t\t\t\t<div class=\"pure-u-1-3\">\n\t\t\t\t\t<div class=\"img-con\">\n\t\t\t\t\t\t<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAACXBIWXMAABYhAAAWIQG2r6PiAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAJN9JREFUeNrs3d1xFNe6BuD2rn0PEcD41jeSywEwjgA5Ag0RWI4AOQKLCBgisIjAowAoSzfc7sEJHBSBTn9oyRZYgEbq6V4/z1M1pbP3qXOQVvf0967f/ubi4qIDANryH00AAAIAACAAAAACAAAgAAAAAgAAIAAAAAIAACAAAAACAAAgAAAAAgAAIAAAAAIAACAAAAACAAAgAAAAAgAACAAAgAAAAAgAAIAAAAAIAACAAAAACAAAgAAAAAgAAIAAAAAIAACAAAAACAAAgAAAAAgAAIAAAAB88F9NAJ/33Q9/zfofs/Qf12/fPFprFaAG31xcXGgFWi/yu/2PTz8PvvJ/9i4CQf85TZ+VcAAIAJB/0d/rf1x9Hgz0/zZCwar/HPdh4FgrAwIA5NPTPxi46H/Oef9Z9p8jIwOAAADTFP55/+Ow/zyZ6Fd4FWGgDwIrVwMQAKD+wv+p1/3nwIgAIADAdgr/w/7HUf/Zz/RX/LW7nBp472oBAgAMU/wPUq//Qea/aiwYXJgWAAQAuH+vf9l/nhb2q7/oQ8CBK1jMfRYLSR9e/WcBDgEApn8ox7a7x4X+CWf9Z8/agGzup3n3z3kQs+5250KEk/4T0zpX50IIBwgAsMWH9aK7nO9/UPifEtsG533ROHVVJwmQUfRje+jQC0ZjB8ihcIcAAMM+uA/7H88r+7Oe9cVi6epu/d6ZpYIf0y9jjBy9SEHAwk8EALjnAzyK5H6lf54QsL37Zp6K/hRrRWKUZ+GUSAQAUPyFgHEL/2GXx5kQFn4iAIDiLwQ0VPivi4Wfc1MCCABwu4d5LPb7ubE/Wwi4270y6y4Xh+a8LdTCTwQAuMUDfdH/eNnon/+9IrHRvVLKYVBXIcC6AAQA+MwDfd7/+KPhJtBTvH2vf9nlN9x/G0Z6GN1/NAEFPNRb7x1FT3aZTjvk5vtk0V0ewPOk0D/hZfobQACA5Lgr/5CfIex0l3PafFz4H6aFoS8ruE+EAAQASA/3o1T4uLSvQHxc/Psfq66uXSFCAKOxBoBcH+7zru15/8+J9QC7rR8tm47vXXX1jg5ZE4ARAJrt2Xn43exB622TwmHNxf9qJGDX7Y4AQGsOu3Lf7DeGJ2mrW4vFf9Fdjgy1sC5kJQSwTaYAyLF3Z+j/65qbCmj0LIh36To7MRAjAFTPSvfbedBSWzV8EFSMhDkkCAGA6h/yMaxt1f/tPU0jJop/3Z6kHTEwKFMA5PKQj4V/686e/02dvX3zaLfi+yL+tj9d5g9+cmQwRgCo0YHifyc7te4bv7bVj0vLdDImCABU1fv3fvS7O6z0nnAK5Mea3wKKAIDePx97XOEoQPT8bQX9t2a3gDI8awDIoae3FgDu7d3bN49mldwT0cvdd0k/y2mQGAFA75+PRgH2Kij+C8X/q0wFIABQhYUmGDRMlVz8Y9Gf7W6388RLgxAAKL23Z5532KIwK/j3X3ZGgzZxlKbQQABA758ydwT0hSx+b4dAbeZBV+EOEMZjESBTPfCjp/o/LTG487dvHj0s7F5w2M/9fGtBIEYAKImtTFvqFRY4N7x02e7FKAACAEXZ0wTa1tD/IPa9NhgBgFIe+vGwsvhve56WsDgsTQMZCTIKgABAQxaawChAd7nlz6r/4ULfTDMgAKA4kXUbp9cYP3WZjAIgANAIw/+j9ghzngZw4M/w9o0CIACQs7kmaLut0y4FC/+2Y6EJEADIleF/YevQpREAEABozxNN0G7Ycvzz1lXxUigEACqTFn4xbjGY6f0bBQABgKkJAOPL5oAYvf/RPPWSIAQABAByanM90/GYBkAAQG9Um2fR+48gYv2HAIAAQGvS/n+nvo0vl6Kr9z8uhywhAJCNmSaYNHxN+e/HfPS+KzF6uxsFQAAgC4b/2w1fev/TmGsCBAA8jISvKXnjn+8cAgANsy2pwQDg3Q+T2rEdEAGALB5GmqDJ8LXQ/G2GPwQA6LyhbHJT7gQQAKY11wQIAExJAGgz+EXxsfXTCAACAA0zD5lHMR6bbWjCNwIAeiE0SACYnrU3CADQuFFHYaz+z8fUB0EhAKD4MK2xi8Bck/v+IQCAHkh7DP/7/iEAAA3y5j8jAAgAQEsm2nEACADADWYj/lsCQF5cDwQAEABGYc4ZBABAjxMQAICqpfc+OP4XBACgMTNNAAIAkI/3I/07c00NAgCQj1MjAIAAAAgAIAAADMYJgCAAwN/WmgAm814TIAAgALgGW+MI4GydagIEABAAAAQAFB8G5Qhg3z8EAPAAyswYw8BeO+v7hwAAH7EIaWJv3zxyDXz/QABg9OJjEdK03o3078w0te8fAgBMVYT4t7UA0KwzTYAAQCtFiH/TA/S9AwEARUgRwPcOBAAUIUUA1x4BADyI6vP2zaOVVvC9AwEARagtFl82fO37791aMyAAkAMrkscneLn2IADggdQgQ8C+byAAoBgpArj2IADggVS785FPgVtr8myY/0cAIB/pgWRRWr2BS8HJx7EmQADAg0kAwLUHAQAPJmFra7x1Lg8x9SNoIwCQFw+m0ZxNMAdskWebwQ8BAG7ttSbYupUmEABAAMADqj3Lsf9Bpz1mwfA/AgACQMPejbz976MCpPl9txAA4HM9xVgs9kpLbM3RhP+2dQDtXnsEANBTabhtBYDpTDnyQ4H+qwmm990Pf+32Px5+6aGaes01jQIc9393HAr02B0wqNcTnwC3dgn0/hEA+HehjyI/T5/d9Hlwy//b+HGSHrCR8lcVpP1l/3nuzhi8TaekBzqN8wyuPYX55uLiQitst+jP+h+L/rPXf3a28KWP4d7jElf+pkD0f+6SwcQQ8CyD6+qhMr5X/bVfaAaMAORR2KLgH2yh6F8Xowf78en/zaswcFTKyEBMa/S/96v0N1B+7/9KjFQ9cTlGdagJ2JRFgAMX/v4TX8R1/3m55eL/uTDwZ/87rPrP3IOrKREAc5kDNg0wfu9/rRkQAKYr/leF/3l3y3n9LYre1x8lBIH04DpxB93bUUYLRVcux6iWmoC7sAbg/oV/nr6AOa9mj6N3D3LtJaQ2/MPddK/e/yyXAGBtx6hO+us+1wwYARj5Idd/jlPhyn0r29P+c5pGKXIcBVgZBaim93910JPrOY5DTYAAMH6PdZ0KayliWuJ5/7ufpp0JuTlwZ92595/j/m8HPW3fa+9fQAAYt/gfpF7/g0L/hJ00GrDIbBQgFo45Hrjw3r8AIDRTDmsAbl/4H6aeVk1b1rLaO5zaeF1wuBpbFvv+v3A9T7txd8K05EV/7QUAjACMVJhWXX371ffTlMDDTEYB3neOM93EIvPfz7Xcjpj2OdQMCADjFf9aezLxd61yWRfQh4B4sJ25876qhPlf0wDbcVjbu0EQABT/aUPAaXopkZ5tGT3A7NvIa5+3Irb9GVlBAFD8B/UgjQRMHgLSgsBf3YWfD0gF9QCXLtegzPsjACj+1YeAw85UwE1elfTipzRN4ToO49cK3gCKAJC9o67d1ctXISCHhYHxQqVzt+Pf3hXaAzRkfX9nKRSDALDF3n9tW/2KDQHp6OKFu/KDCEJ7JS7+6n/nZQov3P3a+x4gAGy5+EeP82ct8UGMgEw+1JyGu1+4HB/e5VDy8K/ea7vXnkw5COif4j/rLl9j6hCaj2Vx4Eh678JT16Do79i6y/+9GbnJ6rAujADU6ljxv9HPmRwbHL9Di4vJXlV04ptCtpm43636RwDYcs/ksHNk6ZccTb0zIM19zxsLASc19f689XEjxa75QAAoqfhHYXvuVviiGBlZZlBAWgoB8TfuVfh3GQW4nb20CBYEgC1aaoJb2Uk7JISAcYr/vMbeXypqDnn6smde88sYml4EmF7t+5vbYCM/5vBwqviwpiYWfXlT4Gf94qhfjACMU0AO3QIbW2bSk7waCXhdUdu+aGjFt0Oebg5/ij8CwAii+Fv1v7nHadFkFiGg/0QhqWFI+VlL73dPUwFWuH9c/BeagTE1OQWQ9vz/z+W/l29zWqSUDnFaFhjq4oS8vVYPeknrSlo/fEvxxwjAyL1/7ierocp0YmAEu5K2mcUJh7stn/KWRj1a3hr4QvHHCIDef4l+zHG1cjq46Cjj0YDo9S+s9P77erX69s1n6T0JYARA719bDtSrXKbRgNzeIRCL3uKVrjPF/6Pr1dohT3Ef/KT4YwRg/J7G/7ns7fRi0ohPBJUp3/AYD/wYkThyslvzIwFNr/lAAJjyAROFwKl/Az/QokdbwLWP3zHmmxfdeFMD8bBfKvxCQBJbVhc13QvpJNW4Zlc/PxV/66kRLwEgh5t13Xkb2Tb8lBbhlXIfRAiIXQPzLYSB6O1HWxyX1CYZhoBouycV/VnFH/CTQvQ8fXbvENJOrn031u50AWDsh/5Ll3wr4qU180Lvi/knD7VNA0EU/NPUaz02tDvotalhi+BZ6vWfFnoN4juxSN+PnYHbZSkMCABj3cgtv09+DD/WMMyXep/XhzVvcvV3nhra3/r1KPV8hw/rPvr747DQ70C0+0E3zlTM69RWK3e8ALCNG3rW2fq3bQ4zYZvf3wgBpUwJREE7KK1nm9p5kQr/FIEr1swc2h0hAAx9Y3vpzzi+NZzHFr/HUZxyPt/hJBWwVWHt+jAV/VwWSAsCI2nlHAA9U+1M4a6d7xDvfsjpRUJR+GMKbF5g8Y/Cv+7y2h0VC7VfxqLtNAWEEYA73+DxwDD8P1JyL2FLIFV8r696rVMNV4dX3eXc9WmB7RfrWyJQlbDdMgLWgQW2AsBdE67h//H8aDEPI3/HF93lorUxFvnG/P7VVrb3hbbXYVfmeShxsuehhbcCwCY3u9X/I/eKLAZkwlGBq/Md4jPEmR8xH73q/tnm+b7w9in9fAXv0RAANrrpL1zmUZ33X86HmoEMvvuz7nIrZ3xm6dOln9fDQexJvyrsp+l/jgJTzTbPNOR/3NVzEJrRAAHgqzd99AZ+d5lH95NT8CCr5+CyK+8sha8p+pClHNS+C2DuEk/Cyl3Io/gvUifoQYV/XixgXKW/EQHgX3ZdYgEAGi7+tR9/HsHmZTo2mg3VPgVg/n863xuaA8V/RNW9bdEIwN2/AHOX1ygAKP7NiN1eq7TbgZYDQGf4f2oCGEzT8Wn5rac7QoAAIABM74kmgFGL/9VWv9YJAQLA33t+mbY3Amz/uxbFbtnVudpfCBAA9EALJADAOJZdGef6CwECwNbTsN5/HkzDwPafd/G+E8edCwECQCIACADQQvGPZ92hlvhqCHBOgADAyB5L3rBVy868/23sp7cgIgBgFACK7/3H0L+1Trf3PL0XgcoDgF6nAAA1F/94xunRbm5pjVj9AUDRyYcvGwwv5rQN/W8u2sxZCZUHAIQxqLX3P+9/7GuJO9uxHqDuAGAKwAgA1Erxur/n6eREAaDGhOf+zsZjTQCD9v4t/BvGUgCA7T+0jMiA3n92HcXWpwIEAMZgHQDo/efooOVdAQIAQCHFShMMLnYFNDsKIAAwhpkmgHv1/uM75Lz/7dhvdUGgAIAAAHr/rWvyXQECAED+Fppgq56kNRYCAAB56AtTFH+n/m1fc6MsAgBA3rzAZhxPW9sRIAAwBucAwN16//HdsfhvPIcCAAzLOQCg919Ee7d0cFmtAeCd+xgQANhQrLVYCABlW7uPgZIZ/p+MAAADOtUEsLG5JpjETisHAxkBYAzvNQFszPC/UQABQAAAjAAgfAkAAFVL+9Efa4nJPG5hGqDWALBy/wJ6/xgFaC8AmHPOy1oTwEacnSEACAB38fbNI6vOBQAQALiPndoPBfpvxX9bHAZkDo1mpHnj2SdF5EsPsAjKn46WnfYB2gja9J5ogizM+8+xAFBmr1MAyIMRmWGL/O61z8Ohi0X/b1z9jyfp5yoFhVMBYZRrrPcvAAgA97SSovOgYNyrGMzTQ2ieCv6Yr4V9clNvtP+d3qUwEN+xlSm3wQkAroUAoNdZBe9l2KzgR49+L33mXZ7vgX+cPk/T73yeeknHKRAIfPcz0wTZqLoTKQCwbWtNcKvCv0hFv8Sz3yOk7KfPef+3fAgDfRA4dmXvZK4Jsvpu7tY6ylVtAOgv2Dr1TB64hQWxTB8s0dM76C6PHa3lPv07DKSpgqP+szQqsJGHmiAru7U+x2o/CXDl3jUCkGHhn6de8v/6z88Vh9SYJvgt7oH+7z1s6T3r97SjCbIyq/UPEwAwAjBu4Y978o+urde8RsB5Lgjc6h7RNvmZCwACAHfw9s2j5q9BDPWnHn8U/pZ3plwFgdO+Pbzp7mZ2AOSn2lBWdQBICzfO3b+TOWu9Nxc93u5yqP+p2+FvMTXwe4QiPV4KUO2UTAtvAzQKMJ1mh//T/v3T1OPlZhGK1kYDjACUEOYFgDLZiiR8jd3rj5Xvf3ROoryNB2k0YGk04ANtIJgJAAKAEYACi//VdqGfXfqNxdbBVdoaCQgA95f2H5+41KM7b+mI2HSQz596/fcSc62nzsLHCIAAYBRAm5dS/Jf9j5cu+SAepJGARaN//9wtkCVrABQjNrBqoPDHfH+Mcuy73IOHgJcNhwAQAIYSxwL3P1673ELXgMV/lkKOU9u2RwgAAUBBKsxJzWe/X1vsp/gLAbRhJgCUPQqw7BwKJGwNU/yj5+8lU0IAAoAAUJCl+1gAUPyLDQF2B4AAcGdHLvnWvU5rLhR/hrYSAkAAuJNUmJwJoPe/afGfKf5ZiPZ3YiAIAHd26LJvzXltASAVm2PFPxs7nQW9IADccRRgZRRge73/Clf/H3dW++fmSXrLIiAAbGzp0m9FVQ/ldMLfE5c1S8/TGxcBAWCjUYB4sJ+5/IM6qWnxX9p25oS/vB1XuB5g7bK6LgLA9h24p/X+P1P8Y6W5s/3z92FRoEKD6yIAbDoKsOqsBRiy97+qpPhfLfqjDE/7aybMgwBgFEDv/96iR+mVvmX5zfkAIABsOgoQ57m/chvo/afe/yJ6lC5pmcGtkvUAK5cyS1W+2+Q/ruuHUQDvCGi8958O+3FSZLl2XD+26FQAqHMU4H1nKuCuXtfS++8uh/4d9lO2/QpeGrR2GREAxg0B8fC3IHAz57UEp3SojP3+dTgqeT1Aje/RqESV10UA+MeiMxWw0YO2hodVKhbPXc5q1LA18J3LKJgJAONfYFMBt3PWt9dhBcXflr867fTXtuT1AEYBBDIBYIIQED0HuwK+blHJ3xFFwpa/Ov3ch4C9Qn/3U5dPIBMAphGjAI4J/rxf0/bJ0nv/URwc9Vu3ZdrdoeAgkAkAtxoFeN9ZD/A5J5UM/UdRWLqc1Yv1ACW+L8AIgEAmAEwYAk67eoa5hxKBaK+Sv+W4s+WvFcWdD1DR1lojAAJAsSEgisQzLfG3vTQ6Unrv/ygVBdpR4vkApiEFMgFg4gu/7CwKDM9q+BKk98f/7HI2qbTzAUwDCGICQAYhYNF4CHiVglDpxd+Wv7Z9OB+goPUAK5dMEBMAhICpi/+ikr/FvD8x9VNKmBUAXAcBQAhQ/Afo/ce8v6N+CU/7+yH7A7/SwWROBBQABAAhQPG/R/GPnQvm/bnut7QeJHemrKb1rvZ3MwgAdwsBNe8OqKn4zzr7/flMcS1gPcDKZRLABID8QkAUlR+7+g4L+qWi4n+16M+8Pzd5kHuBTVuRHUgmgAkAGX454+aIbUU1bBOJh8xP/d90VNElst+fr4mXBi31QrnpmZgCmADAZ0PAuv9ECHhR8J8RAWa3pps9HfrinH9uI/dDggQA7b4131xcXLjUwxSdeXc531zS2+V+reFs/0+uQwSyP92RbOj7XF9y1d/TcQKnqaxx/djCkcxGAIYbDVj1n1kU1S7/ebuz9MCrrfjHvP/K3cgdrDJeFLh0eUb1rpX3MQgAwweBKKrRC81xu2DsK45jfXdreKXvTQ9xPSXu6EHGIeDI5RG4BIByQsA6rab/NpMgEIU/RiZ2azjW9zO9//i7LPrjPrJ8c2Dai/7a5REAhmYNwDjFadZdvl44PmOuEYih/qNai/619o2T3X5zpzGQX3LbEZPWGP3h0mxdTcefCwAZFqs4mS4+8y2FgSj6q1T414205+/uLAb2U247Y/p7Pb7XjrTerm9beG4KAHl8oXdTEIjP7h0DQRT801T0Vy3dvKn94u8278/QYiHvPKe1MkYB9P4FgDaKWixEmqXPp+KBFNuC1i0V+xva6WFqi8fuGrYk1s7Eupn3RgH0/gUAyKf4x4PQoj+27SyNBLzP5N43CqD3Pxi7ACiRY34ZS1Y7A9L+9Fcuy6BiuuewxT9cAKC03n88jB3zy5jiuOCcCsRB5yVBg3YoWp1ONQVAScV/0f94qSWYyLNcttTa+jqYs/Q+lyYZAaCU4r+n+DOxl2kOfnLpnAKHA93fouU/XgCghOIfCX2pJcjAcbofcylepgLu7pdKj0S/NVMAlFD8V529/uQjiu4sh50BdgXc2ev++u213ghGAMi5+Md2v2PFn8xk8+KgtCvgF5dkI7G1c6EZBADyLv7xcHPQDzna6TJ59XRaD2Br4O3E6M0ip8OdBAC4ufjb60/WISC9hTKHEBA9WosCv178563P+wsA5G6p+FOI/VxCQHc5rH3mknzWgeIvAJB37z8epk+1BIWFgIMMRgFiWHsuBNzoWe2vRRcAqKH4O+WPEv2WDqrKJQRYE3Aphv1/VPxvZhsgij9U2NP0nTLnLwCg+MO4fuqLznEm361F1+YJmlm9xVEAgJsfUM40R89zu9+xq5M0W1lY+6Jv+wO34ddZA8DUvRPFn9pcHRSUxZHBKYjMozBW3u7vusv5fsXfCAAFFH8v98FIwLjfuwgCRxWOBvzaXb7W15C/AIDiD0LAV76DEQRKP2Y7Dj+K/f1rt5oAgOIPQsDtvotx4uZB+pQWBE76z2F6FwICAIo/CAH3+G5GENjJvA2PU+HX4xcAUPyhqBCwm3PxSgsXIwjsZTQqEL39ZRR/c/wCAOUVf1v94FIx+9PTgsEIAvORRwYiKK1Sb1/RFwAouPhHcnfID3wcAvZKGsZO6wUiCOymn7NuuFd1Rw//9Orj5D4BAMUfalbFMbVpyuBh+tzm3IP3qdB3qdjr3QsAKP4gBMCYnASI4g/TyOrEQIwAwH0KfwwDHin+YCQAAYC2iv+qa+eFIyAEUDRTACj+MD3TAQgAFFf8Z4o/DBoC5poCAYDci3/0Vk4Vfxg0BPyRTs4EAYBsi/+qK/9tYpCjl0IAAgA5Fv+F4g9CAGWzC4C7FH8v9YHxvHr75pEggBEAJi3+R4o/jG4/Ha4FRgCYpPjHA8gBPzDhSED/OXB+PgIAYxX+2OMfr+V8ojVgcsW8ThgBgPKL/6qzzQ+EAKpjDQCfK/6xzW+t+EN24ju5dmogAgDbKP57nW1+kDNHByMAMHjxX/Q/flf8oYgQ8KezAhAAGKL4Lzvb/KA0DgziTiwCxEp/qIMDgzACwEbFf9Zdzvcr/lA2BwZhBIBbF38v9IH62CaIEQC+WPwX/Y8/FX+oTmwTXKXRPRAA+Kj4O9Mf6g8Bp7YJ8iWmANoq/LHYL4q/M/2hDef9Z/H2zaNjTYEA0HbxX3VO9oMWPetDwFIzcJ0pgDaKfwwDnir+0KyXaeoPjAA0Vvyj52+xH+CsAASARop/fNEt9gOuO+k/e7YJYgqg3uJ/oPgDN4hDv1ZpXRBGAKis+C87K/2BL4sdAnFg0KmmMAKA4g+0wyuFjQAYAaik8HuhD3DXkYAD2wQFAMot/qvONj/g7pwV0BhTAIo/QHiZdg4hAFBA8d9V/IGBQ4BRgEaYAii/+DvgBxiaA4OMAKD4Aw3aNxJgBADFH2h4JKC73CHg1EABAMUfaMxZd3lgkBBQGVMAij/Al8QiY0cHCwAo/oAQgACA4g8IARTJGoC8i3980eJFHY+1BpAJawKMADBC8V8p/oCRAASA9oq/E/4AIQABoCFLxR8QAhAA2ur9R/F/qiWAQkLAUjMIANy/+B/0P/a1BFCQp44NLpNdAPkU/0X/46WWAArlBUJGALhD8Y+9/kdaAihYvEDoUDMYAeD2xd9ef6Amz96+ebTUDEYA+LpjxR+oyMu+Y7OnGQQAvtz7j2H/J1oCqMwyTW2SMVMA0xX/SMi/awmgUu/6z64jg40A8HHxn3X2zgJ1i6nNlWYQAPhYFH9v9wNqt+OMAAGAf3r/cdiPeX+gFfvpnBMyYw3AuMU/FsX8qSWABn3/9s2jU81gBKBVDvsBWnXsxUECQKu9f0P/QMtiUeBSM+TDFMA4xX/WXZ72Z+Ef0DonBRoBaMqR4g9w+TxMnSIEgOp7//P+x1MtAfBBdIaMAAgATTjUBAAfeZLWRTEhawC22/tf9D9eagmAfznvLo8KXmsKIwB6/wDtiKkAW6MFgGp7/17zC/B5T9M6KQQAvX+Axiw1gQBQU+9/T+8f4FYee1eAAFATq1sBbu/QMcECQA29/3jhjyN/ATYYBdBxEgD0/gHatNAEAkDp9jQBwOajANYCCADFSjevM/8B7uZQEwgAev8AbY4CzDWDAFBa7z9WsHrpD8D9WEclAOj9AzToqdcFCwClmWsCAB0qAcANC8DdLDSBAFCEdPiP1f8Aw9gxDSAAlGKuCQAGZVRVABAAADxXEQDytKsJAAZlW7UAkLe0/9+rfwGGf74aBRAA9P4BGiQACAACAIAAgACQl4eaAEAHSwCQUAEYxgPnAQgAALRJABAAsmWICmB75ppAAMiVI4ABjAAIAAAgAAgAVUsvAQJAABAAGmMLIMB2OWlVAAAABAAAmuCdAAIAACAAAAACAAC1suBaAACgQbZcCwAAgAAAAAgAE1hrAgAEgMa8ffNIAABAAAAABIBWnGsCAASA9pxqAgAEAABAAGjAShMAIAC0570mAPCcFQDaYw0AgOesANCgtSYAQABojMOAAHS0BIB2nWgCAB0tAUA6BWAYDlsTALJmgQqA56sA4AYFYCBrTSAAZOvtm0crrQAgAAgAbbIQEGB4OlgCgJsUoEGmWAUANylAY969ffPIMcACgBEAAB0rBIDMpJRqHQCAACAANOhYEwAMZqUJBAA3K0BjbLEWAEq6WWO46p2WALi315pAACiNaQCA+9P7FwAEAADPUob2zcXFhVYY2Hc//LXufzzWEgB3Evv/Z5rBCIDkCuAZigBQhKUmAPAMzZkpgC357oe/YkfAjpYA2IjhfyMAEixAgwz/CwACAECDjjSBAFC09G6AV1oC4NbO+mfnWjMIAJIsgGcmAkCRowCxENAbAgG+7rwz/y8AVOZQEwB81TJNnSIAVDMKsOq8IAjgawz/CwBGAQAa88riPwGg1lGApVEAAL1/AaBNC00A8C8nacE0AkC1owCrzo4AgE8dagIBwI0O0JZXqXOEANDEKIDTAQF0igSABh10lwdeALTshZX/AkBrowDvpV6gceeegwJAqyEgtrxYEAi06tCpfwJAyxadqQCgPSepE4QA0OwowLozBAa050ATCABCwGUKfq0lgEb86tAfAYB/LDrHBAP1O+uL/6FmEAD4ZxQgFsLsaQmgYueecwIAN4eAGBJ7piWASh3Y8y8A8PkQsOx/vNASQGVepecbmfnm4uJCK2Tkux/+ii/KvpYAKhDz/ruawQgAtxNbZM40A1C4mPefawYBgFtKiwLnQgBQevF32p8AgBAAtGXPfn8BACEAaMuz9OpzBAAGCAFOCwRKKf5LzVAGuwAKYXcAoPhjBKDN0YBF57AgQPHHCECzIwGxp/a4/zzWGsDEPhzxa85fAGC8EPCw/xFp+6nWaEosCL2+reqmh27872+7+jrC5MMv/HczQZOvFP+51f4CANMEgb0UBB5ojSoK+2n6eb2In+awl7q/1+afBISrn09cvmbvWfv8BQAyGA046iwQzFm87nl9rcB/+FnLsGm6B3fTiEF85kYPqvaiv3cPNIMAQD4P4XkKAjtaYxLnqbCv02eVivxpw/fkVTDYvRYQjBiUfY8v+nv6WFMIAOT50F30Pw71vrbem19d682fGgrd6B7d/SQYCAX5e52Kv/tcAKCQIHBgRODOzrp/hu0/9OqtdN7q/Tq/FgjmAqxePwIAwzxYIwxYI3Dzw82wfZ737cNrYeAqHFjsOq4X/edQr18AoI4H6l76tLR98NMiX9UCvMbu4d1PRgmMbm3HSer1rzWFAEC9YeCqd1XycOvVnPz1bXSnevLN3Mvza4FgtzN1cN/CfygcCwC09RCdXXuAXn2mHG69Kupd9/Ge+KtefOchxRfC7e4n97NQ8GWvUuHX4xcA4KPeVdf9+8S4m06Qu/K1wnzTSXV664wZCiLwtj59ECE7tg0vzfELAAAtBtxZ187hRVH0j1PRF7gRAAA+CQZXowTXTzcsNRycpKK/UvQRAADuFw4eXgsFV9MLXTf92pk4u+K0++dwqpUrhgAAME1Q6D4JCd0X/rvbuGlR7NoCPgQAAOBW/qMJAEAAAAAEAABAAAAABAAAQAAAAAQAAEAAAAAEAABAAAAABAAAQAAAAAQAAEAAAAAEAABAAAAABAAAQAAAAAEAABAAAAABAAAQAAAAAQAAEAAAAAEAABAAAAABAAAQAAAAAQAAEAAAAAEAABAAAAABAAAQAAAAAQAAWvX/AgwAWsHlfs3Ot9wAAAAASUVORK5CYII=\" />\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"pure-u-2-3\">\n\t\t\t\t\t<h4 id=\"status_baidu\"><%:Baidu Connection%><br /><span id=\"_baidu_status\" class=\"red\"><%:Touch Check%></span></h4>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"pure-u-1-4 check\" onclick=\"check_connect('google', 'https://www.google.com/generate_204')\">\n\t\t\t<div class=\"block pure-g\">\n\t\t\t\t<div class=\"pure-u-1-3\">\n\t\t\t\t\t<div class=\"img-con\">\n\t\t\t\t\t\t<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAgAAAAIACAYAAAD0eNT6AAAACXBIWXMAAAsTAAALEwEAmpwYAAAgAElEQVR4nOzdeXxU9b3/8ffnzEwWEsKaBHFB3AC1bknYVAxJQMEdCFqt1qW2t7Z166KC2vTn0tra9rb3ardb8bqyuFRtrYUkREURAu6AClVE2RIIS/ZZzuf3B9prNSEzyTnzPWfm/Xw8fNQHzJx5WR/y/eR7lhEQkS9pUVFo54CMAkW4UCGFIjLYFuRBpb+InQcbeRDpD0WeyGd/r7kKhPB/fwW7+PsgABtABED4S38pwpB/+7VOgbYqrCYRbVJFk0CbVK0mO6BNlmpT1I41hTr7NeW//HJzsv9/IqKuiekAIvqyhtKSYXbQOjRgx0aqJSNg63CIFAAoBHTfgg8Mgv/+G44AaAKwDcAmAJtU9CNR2aSQTQENbBoyaflWqYJtNpMo9fntDw+ilKCVx2Rs35N9lBXDaKh1uFj2oapyKBSHQjACQLbpRoMiADYD2CSfDghq4z1LA2sjudF1w59d3WY6kCgVcAAgctG2qcflBCLZo22JHS0iYwRytELHADgcQMB0nw/ZAD4CdK0AaxTWWrGwJiYd64YtfqvVdByRn3AAIHLIltKioYFgoEjULoJKEQQnARgB/neWDCqQTSpYA+jbCqwMRq2VQ+pWfGI6jMir+AcTUS9snXZifqAzUAxLiqA4SYEiAQ4x3UVfsgXACghWilorNNZSX1C3psV0FJEXcAAgikPDlHFHImafApFTAD0FwFGmm6hXbAHWKWSFiK6wY7Ki4LSVb/OiQ0pHHACIvkArKwM7dmw6ARI7VUVOAXAygGGmu8gdCjSJok4FNRakOr9m5fumm4iSgQMAEYDtFSWHATjdUp2qkMkABphuImM+AVCjqjVWIFaTv+T1LaaDiNzAAYDS0s5p4/KiYS2zVKeqYCr2XZVP9GWKdyGoUUi11RGq4cOMKFVwAKC0saNi/BgbsXOhciag47HviXdEcVMgLECtQP+iMXm6oK5+m+kmot7iAEApSwFpKCuZYImeq5BzAYwy3UQpRQGsUMhTYslTBUtWrDcdRJQIDgCUUtZPOyJzQMfAchU5TwRngxfvUdLoOkD+Yqn+ZUjtqnrZNyAQeRYHAPI9rawMNDZtnCIiF6nqeQD6m26itLcZgkVi2w/l165+zXQMUVc4AJBvbS8rmSiCiwBUAigw3UPUFQXWiuChgIVHhiyu/9h0D9FnOACQr2ydXHJMwMLFAC4EMNJ0D1ECbEBfgMpD0pnxOO8mINM4AJDnNVUUDYiodbEAVwI4yXQPkQPaATwNWx/K19zFUlcXNR1E6YcDAHlWQ/nYUwH7G4BUIr2/HpdS23Yo5kUR/f3w2tc/Mh1D6YMDAHnKtqkTC8QOf11UrgRv26P0YgP4G4D78mvq/8G7CMhtHADIExoqik4BrGugOA9AyHQPkVEiG0T196HOzPsHLlu2y3QOpSYOAGSMVh6T0bAr50JRvRY8t0/UlXYI5kvMujd/6YrVpmMotXAAoKRrKC0ZpgF8W4BvASg03UPkE/UC/GZoLGcBLxokJ3AAoKRpnDyuCJZ9nQ3MFiDDdA+RT22E6i8720N/Pnj58nbTMeRfHADIdY3l4yYD9hwFKky3EKUMRSMs/DYUjfz3oLo3dpvOIf/hAECuUEB2TC4+Wy25GcB40z1EKaxZgT9aVvRX+Ute32I6hvyDAwA5SisrAzuaNl6oipsgONZ0D1G62PdVxfqQwPp5fs3K9033kPdxACBHaFFRaMdAuUIhPwJwmOkeojRmQ/CEhcCPh1a/us50DHkXBwDqE62sDDTu3HgJBLeBz+Yn8pIYgIdjsUDVAXWvbjQdQ97DAYB6RQFpLC+ZDeAn4BP7iDxr36kB/Akx3FFQV7/NdA95BwcASljj5OJz1MLtgBxnuoWI4tYGwX9ldGTezacLEsABgBKwbUpJudi4S4CxpluIqNd2Q+UeO9jxn8MWv9VqOobM4QBAPdpRMX6MDfseqE433UJEjmmAyB350X6/45MF0xMHAOrW1mkn5gc7gz9RwVUAgqZ7iMgNuk41cF1h7YrFpksouTgA0Jesn3ZEZl548LUCnQNggOkeInKfCp6Bbd9QWLv6n6ZbKDk4ANC/aSgvuQDAzwAcajiFiJJMgbAIfo1o2x0FdWtaTPeQuzgAEABg6+SSYwIW7gMwyXQLERm3VUVuKqhe+ZAAajqG3MEBIM1tm3pcTiCW9WOFXgcgZLqHiLxDRFaIbV8ztHbVStMt5DwOAGlse0XJDFH8J4CDTbcQkWcpIPMyOjN+wOcHpBYOAGloe0XJYQL5L97WR0QJ2A7g2oKa+gWmQ8gZHADSyL4v7LFuUmAOgCzTPUTkS38NBHD1kMX1H5sOob7hAJAmGsuKTlKReXx8LxE5oBmqc/InrbpPqmCbjqHe4QCQ4tZPOyJzQHjQjwH8EHyYDxE565UArKuG1KxYazqEEscBIIVtqxg33tLY/YCMMd1CRKlJgTCAnxUMbrtTFq0Jm+6h+HEASEEfT5iQndEvcodArgNgme4honSg68SyLs1fsnKV6RKKDweAFLO9fOwEgf4vgCNNtxBR2olC8JP8QYf+VBYtipmOof3jAJAitLQ02BBovVWAuQACpnuIKK29ooJLCqvrPzAdQt3jAJACtpcVHS5iPQxgvOkWIqJPNUNxbUFt/TzTIdQ1DgA+11BRfAXU+g2guaZbiIi68EQY8q2DalbuNB1C/44DgE99Uj52SIbqHyGYYbqFiKgHW1WtywprVyw2HUL/hwOADzWWj5ussB8GMNx0CxFRnBSq/91q5/5oZF1dh+kY4gDgKwrIjvKSWxT4MXihHxH50xuq9qzC2tX/NB2S7jgA+MSW0qKhwYD1MIDTTbcQEfXRHoVcVliz8i+mQ9IZBwAf2F5WMlEECwAcZLqFiMgpCvyyIJZzk9TVRU23pCMOAB63vazkByL4KfgcfyJKSbJMrMgF+Ute32K6JN1wAPCopoqiARFYD4riHNMtREQu226pXDS0dmWt6ZB0wufEe1Dj5OJRUbVWcvEnojRRaIsubigbO1f5g2nS8P9oj2mYXDwdljwKYIDpFiKipBN5LqMj42sDly3bZTol1XEA8JCGsrE3QvQucGeGiNLbeoGclV+z8n3TIamMA4AHfDxhQnZGdvR/RHCR6RYiIo/YrYLKwur6atMhqYoDgGE7S8cdFAvaf4GiyHQLEZHHRAG9rqBm1b2mQ1IRBwCDGqeMLVZbnwUwzHQLEZGH3Zcfy7mWzwtwFgcAQxrLSs5WwXwA/Uy3EBF5nQDVoc7M2bw40DkcAAzYXl5ytQC/BZ/nT0SUiPcFcjYvDnQGrzZPIgWksXzszwW4F1z8iYgSdZSKvrq9oqTCdEgq4ONlk2T9tCMyGzsHPQjobNMtRES+pcgFJNd0RirgKYAk2HP6hMGd0djTgJ5iuoWIyMciCpnNbxF0BgcAlzVOOXG4bQeXCHC06RYiIh/j4u8wDgAu2l5WdLiItQTASNMtREQ+FrFFK4dVr3radEgq4UWALtk2tfhYEWsZuPgTEfUFF3+XcABwwbbJReMkJi+AD/ghIuoLLv4u4q1oDts2paTcgvWc8Nv8iIj6IiK2ziqsXfWM6ZBUxR0AB22rKD7XsvE3QHmLChFRLykQFltn5S/l4u8mXgTokIby4lmAPAY+W4GIqNcUCFu2VnLxdx8HAAdw8Sci6jsu/snFawD6aHtF8UyBzAcXfyKiXlMgbClm5S9d9azplnTBHYA+2F5RPFOUiz8RUV/8a/Gvrefin0QcAHppe0XJDFEsABd/IqJe4+JvDu8C6IVPF3/+5E9E1AcKhC3ITC7+ZnAHIEGN5WPPUuiTAEKmW4iI/Opfi3/Nyr+abklXHAAS0Dil5DS18TyALNMtRER+xcXfGzgAxKmxrOgkFWspgDzTLUREfqVA2BKZkV+98m+mW9IdB4A4NE4uHqUiL0GQb7qFiMivuPh7Cy8C7EFTRdEhaskSLv5ERH3SycXfW/ggoP3YNnVigdq6FMBhpluIiHysU0RmcvH3Fg4A3dg5bVweorFqAMeabiEi8jEu/h7FUwBd0NLSYCwSWwTgRNMtREQ+1glbue3vURwAutAYaPk9VKaa7iAi8rFO2DqjYOmq50yHUNf4JLsvaCgbOxfQK013EBH5WCdUzy9YuurvpkOoe7wN8HMay0suVuBh0x1ERD62b/Gv5eLvdRwAPtVYUVxqq/xDgAzTLUREPsXF30c4AADYUTF+jK2xVwAMNN1CRORTXPx9Ju1vA/ykfOwQC3YdgANMtxAR+VQngPMKalc9bzqE4pfWdwFoaWkwBF0IYKTpFiIin9q3+NfUc/H3mbQeABqtll8JUGa6g4jIp7j4+1jaXgPQUFZyOQT3m+4gIvIpLv4+l5YDwLaKceMttesAZJpuISLyoQ4VOa+weuU/TIdQ76XdANA45cThagdXgRf9ERH1Bhf/FJFW1wCsn3ZEpm0HnwIXfyKi3uDin0LS6lHAeeFBvxVgrOkOIiIf6lC1zi2sWbHYdAg5I21OAfAxv0REvbZv8a/l4p9K0mIA2DG1aLQds1YByDHdQkTkM1z8U1TKXwOw5eyifnbUWgQu/kREieLin8JS/hqAYJt1LwTHmu4gIvKZDoWeU1i7YonpEHJHSu8ANJSVXA7gMtMdREQ+067QcwprVnHxT2Epew3AtqnFx1oxWQkg23QLkcdEAezZ95d2AohAJAJFBEBEgYgAFhQhFYQEyBAgpEBIIJkKHQBgAFL4z480167Qc7n4p76UPAXwYWlpViDWOl+5+FP62AvgQwBbAdkCsbeqyhaobIVgW0Cs3SqdeyJZ1u7hz65u6+uHaRWsPdWnDOjM6hxk2fbAWMAaFLA131Y5SAQHA//66yAAheCw4Bdc/NNISv5H2VBe8hsA15juIHJYFMA6AGug2KCWrIetGzQY2jBs8SsNpuO6o5XHZDQ15R4RFXu0qI4WsUar6hgAowD0N91H/9KugnMKq+urTYdQcqTcALC9Yuzpovp3pOA/G6WVZiheg+ANKN6EpW/sCe1ee+TfN3SaDnPSlrITRwQQOkksuwgqRVAUQZBvuisNcfFPQym1SH5SPnZIBvRt8FG/5D/vA1gu0OU2AssLTl3xjlTBNh1lws6pJQdHo1Islk6C4jQAxyPFL1g2jIt/mkqpAaChvORJAOeb7iCKw0ZVLBHIkqgdWzq8bvUO00Fetav0hIFRK3SqLThNBKVQnAgOBE5pty2cPWxJfY3pEEq+lBkAGiqKr4DKn013EHWjVaBLbJHFEo0tKah7bYPpIL/aNnVigRWLTgNwFqBTAeSZbvIpLv5pLiUGgO1lRYeLBN4ANNd0C9HnbAfwrECebon1qx5ZV9dhOijVaFFRaPtga5LE5ExLMEOhI0w3+QQXf/L/AKCANJaPfRHQU0y3EEHRCAuPqI1FBZPqX03X8/imbC8fO0GgFwCoBDDcdI9HtVsqZw2tXVlrOoTM8v0A0FBW/F2I/JfpDkprUYH8zQYeKNgd+5usXh0xHZTutArWjmXFk2y1LhTR2VAMMt3kEVz86V98PQBsKTtxRFBC73Drnwx5W0TnxayMR7x8H366+7C0NCs32DZD1f4GIKXw+Z97fdBmqZzNxZ8+4+v/EBrKSxYDmGK6g9KHAk0i8qjE5IH8pStWm+6hxHx6vdAVgF6G9DpFwMWfvsS3A0BDWcnlENxvuoPSgwDVqvLHPZlNz6Taw3jSkVZWBhp3fjQDojcAGG+6x2Vc/KlLvhwAGk8vOkCj1loAA023UEqzIXhCbPtn+bWrXzMdQ+7YVjFuvGXb10MwE0DAdI/D2gTWWfk1K5aaDiHv8ecAUF78lELOM91BKatTgf+VWOwXvF8/fTRVFB0SUesaAf4DQI7pHgdw8af98t0A0FBePAuQRaY7KCXtFejvNSa/Lqir32Y6hszYUlo0NBiwbgDwXfj3y4q4+FOPfDUANJQek4tAv3cBHGi6hVLKdgC/CYp93+Dq1XtMx5A37D7llEGdmZ3XCXAtgAGmexLQJqJn5levqjMdQt7mqwFge3nJPQJ833QHpYzNKrizLZozj0/po+40VRQNiKh1w6d/9nj91AAXf4qbbwaAbVOLj7Vi8jqAoOkW8r02FflFLDv28+HPrm4zHUP+0FBaMkwDUiXQK+HNP4e4+FNCfDMANJSXvABgkukO8jUV4BErZt08pG7FJ6ZjyJ8aJxePgoWfeexC5DaxMD1/Sf0LpkPIP3wxAGwvK75ERB403UG+ttxSvW5o7aqVpkMoNTRUFJ0Cte4D8BXDKVz8qVc8PwA0VRQNiKr1HoBC0y3kPwpssqA35tesmm+6hVKPFhWFGgdaPwBwG4AsAwmtYuFMLv7UG5bpgJ5EEbgDXPwpYdIClVvaYjmjuPiTW2T16khBTf1PVe1jBahO8sdz8ac+8fQOwKcX/r2B1Hs6F7lrgQTt6/P/sXqr6RBKL9srxl4qqr8EMNTlj2qFYnpBbf2LLn8OpTBP7wBYMbkHXPwpfjsArSyoqb+Qiz+ZUFi98sFozB4DqJvXLHHxJ0d4dgdge8XY00X1edMd5BtP2YHQf/Breckrtk0pKbdUfg/VIxw8LBd/cownB4B939S18Q0IjjXdQh4n2CWK7+XX1D9iOoXoiz4sLc3KCbTdCugPAYT6eDgu/uQoTw4AjRUlV6nij6Y7yONEnhOJXJW/5PUtplOI9qdxythitXUhgJG9PEQrINMKala+5GQXpTfPDQCfPu9/A3jlP3VvL0SvL6hedb/pEKJ4NVUUDYja1v0QzEjwrVz8yRXeuwjQ6ncjuPhTNwSoDor9FS7+5DeDq1fvKaitnwngWgXC8b1LWrj4k1s8tQOws3TcQbGA/T6AbNMt5Dm2AFVDa+rvEEBNxxD1RXynBKQFwHQu/uQWT+0ARAP2reDiT1+2G7aenV9TfzsXf0oF+UtWrgqKfSIUT3b9CmmBxPiTP7nKMzsA2ytKDhPFu+j7lbKUQgRYo7HYeQV1r20w3ULkhobykmsU+IUAGft+5dPFv3r1MrNllOo8swMgqj8GF3/6N/K4xtrGc/GnVFZQU/9by5KTAXzIxZ+SyRM7ADumFo22Y9Y74FP/aB8bKnMKalfebTqEKFmaKooGRCGHFVSvet10C6UHTwwADWUlCyCYbbqDzFOgCWp9tbB2xWLTLUREqcz4ALC9fNxxAvsNL7SQcW/aATl/2OKVH5oOISJKdcavAbCg/w9c/An6t2g/eyIXfyKi5DA6ALTceeAJCj3dZAOZp4pH82O55w1/dnWb6RYionRh9CfvSHVoYfTjfl9pfvTIHNhysMkWMube/Jr67/H+fiKi5DI2AHTUZB4eUPs9AAHtCO5pvn/Uu7E9oXGmeij5FLi9sKb+NtMdRETpyNgpgKDaN+DT2/4kKzog7+o14zKOb3oBQNRUEyWNAriOiz8RkTlGdgB0KYZGY6FN6OKxv5EP+r/VsvDwQii/EChFRVXkysLqlQ+aDiEiSmdGdgCidvA76OaZ/6HDmo/L+97agPSL8GEYqafTFp3FxZ+IyLyk7wDoK8iOtoU2ARjaw0vtlicOfTHy/sDTwNsEU0GzwDo3v2bFUtMhRERkYAcg0ha6HD0v/gBg5c7cWJpz7qbVImhyu4tc1aaKM7j4ExF5R1Kfva9VsHBI4FEAg+N9TyC/fXjGcU27Im8N/khjVoGLeeSOiIqcV1hTX2c6hIiI/k9SdwBip2TMUODwRN9n5YWHD7j2nVHBg1tedKOLXGML9NLC6pX/MB1CRET/Lqnn1iPVoRUAxvblGB2rhrzavuTgYwD0d6aK3KKCqwur639nuoOIiL4saQNAZHHwNFhS58Sx7J1ZG/fOOyqsEesoJ45HzhPgtvya+ttNdxARUdeSdwrAsn7o2KGGdBw64Np3Dg4Uti9z6pjkqN9w8Sci8rak7AB0LskYY4mucePzOl4atqx92bAidPNcAUouAR4eWlN/KZ/tT0TkbUnZAbCg34RLw0bWqdtOyfv6+x8jYG904/iUkL8OjeVczsWfiMj7XN8B0OeQGc0IbQYwxNXP6Qw0771/1Bp7d8Z4Nz+HuqF4ubM9OOXg5cvbTacQEVHPXN8BiGVknA+XF38AkMxY/wHfXjs+q2jHCwAibn8e/ZvNKtZMLv5ERP7h+gCgot9w+zM+L3vqJ6f1v+if70F0SzI/N10pELbFmlVYs2K76RYiIoqfq6cAOqqzDgsgtsHtz+mKtoea9vzpqA+1NVSU7M9OJ6ry7cLalb833UFERIlxdQcgAPtKGPoiH8mODB54zZoTM47eXQfANtGQ+uR+Lv5ERP7k2uKsCxGIDg5uAmS4W58Rr/C7A19rfWrEIYDE8yVEFJ/6PRm7Tj3y7xs6TYcQEVHiXNsBiA3NPNMLiz8AZIzefVLed9fGJDP2lumWlKBoDAQwk4s/EZF/uTYAqB1L6sV/PQn0jxQOvO6do0OHNb9gusXnYhbkwiGL6z82HUJERL3nyikAXdxveNSKbEKSv244Xp1vDV7R9twho6EYYLrFb1T0R4XVq35huoOIiPrGlR2AaCB8OTy6+ANA5nFN4/KuWrtXQva7plt8RbCIiz8RUWpwfABQhYjKFU4f12mBIeGDB1z/9sjAAW0vmW7xiS2haOSbpiOIiMgZjp8CiCwOlsOSaqeP66b25QUvd9QNPwFAjukWz7L1zIKlq54znUFERM5wfgfAkkucPqbbsic0nJx3xXvbENAPTLd4kmAeF38iotTi6ACgqxAS4Bwnj5ksgcL2wwde93ZhYGj4FdMtHvNxEPb1piOIiMhZjg4A0V3BMgCDnDxmMkmGnZN31dqJWeMaX1QgbLrHC1StbwyuXr3HdAcRETnL0QFARGY5eTxTsss2Txpw8YYNEtBPTLeYpIo/FdauWGy6g4iInOfYAKALEVDgPKeOZ1rgkJajB3x3ba7khetNt5igwCarM+P7pjuIiMgdjg0A0YHBUgAp9ax96RcZOPDqtcUZx+16AUDMdE8SqVq4Iv/ll5tNhxARkTscGwBSZfv/SwSSc+ZHp+VUfvgOLDSYzkkGEf3DsCX1NaY7iIjIPY4MAFoFSwXnO3Esr8o4Ys/xA69eC8mOvmG6xWUfa7T9h6YjiIjIXY4MANGJwVMBFDpxLC+T/uGCgdeu+UroyL0vAFDTPW4QkZsK6ta0mO4gIiJ3OTIApOz2f1dEA7mzPjgt5+yPV0Gwy3SOk0RkxdDqlY+Z7iAiIvf1eQBQhajoDCdi/CTj2J0l/b+1tk0y7DWmW5xiK66XFN3ZICKif9fnASBaG5wAyHAnYvwmOCh84MDr3z4yeHDri6ZbHLCgsGblctMRRESUHA6cAkij7f+uWJrR/2vrJ2VXbF4OoNV0Ti91RDV6o+kIIiJKHidOAaTd9n9XskoaJ+R9490GBO0Nplt64dfDa1//yHQEERElT58GgM7qjKMFGOFUjN8F8jtGDrr+neGBoe0vm25JwHbpyPip6QgiIkquPg0AAq1wKiRlBO1+eVe9d3LWyduXAegwndMTUbmFT/wjIko/HABckj1p6yl5l76/UQK6yXTLfrw5dNLK+01HEBFR8klv36hLEYzGQjsB5DnYk3K0M7B37/2j1tm7M8aZbvkiFUwprK6vNt1BRETJ1+sdgKgdHAsu/j2SzFjegG+vHZd1YtMLAKKmez5nORd/IqL01ZdTAFMcq0gD2WdsOi3ngn+ug+g20y0AYIvebbqBiIjM6f0AoMLz/wnKOKz5KwOuWRuSnOhrZkt0XWH1qmfMNhARkUm9GgB0KXIBeO6cth9Y/SJDBl7zzgmhMbvrANhGIlR+wUf+EhGlt14NALFo4DQAIYdb0omVe97G0pxzN70ugqYkf/Yn+Xvsh5P8mURE5DG92wGAxe1/B2Qc3VSU9+21nVZW7O1kfaZAfi2rV0eS9XlERORNvbsGQHgBoFOsAeEDBlzzzujgiJYXXP8wwS6Ntf7R9c8hIiLPS3gA0KUYBuAYF1rSV0BD/S/acFr2tI9fBeDiU/n0voK6NS3uHZ+IiPwi4QEgFsvg9r9Lsk7YOX7AN9Y2IWS/78LhO2wr47cuHJeIiHyoF6cAtNz5DPqMlR8eMfC6dw4JHNC2zMnjimLesMWvNDh5TCIi8q/ETwEAE90Iof8jQTsr77L3T8k+ddsyAO0OHFLVjv3KgeMQEVGKSOi7AHQJBkQltCvR91HvRbdlr29+8MgQYtahfTjMSwU19ZOcaiIiIv9LaAcgagWLwMU/qYLD2o8ceM2aoYFBnct7fRDRB5wrIiKiVJDoKYASVypovyQrlpv3H+smZJTseFGBcIJvb5P2zEWuhBERkW8lNgAoil3qoDjkVHwyKe/CDeth6ZZ43yPAk/kvv+zirYVERORHCQ0ACuEOgGHBkS3HDLp2bbaVG1kVz+tjFh5wOYmIiHwo7vP5uhRDo7FQo5sxlACFtj576IvhNQNPARDo+iXYVFBTfyi/+IeIiL4o7h2AmB3gT/9eIpCcczaeljtj41uwtMvBTBQPcvEnIqKuxD0AqArP/3tQaNTuEwd+Z50t2dE3v/Sbdux/DSQREZEPJHINAHcAPEpyw4UDr11zbOjwvS/gs5/4FS8X1L22wWwZERF5VQIDgMUdAC8TDeTO/uC0nOmb6iHYI5AHTCcREZF3xTUAaE32gYAe4HYM9V3G8U1j8765bic6QwtMtxARkXcF43lRTGPc/veRwODOD3jvP/VW6c9bhlkR/MB0BxElRlU/WHpL//vifX1cA4AqivkAYD/Rv5suIB+L6FBAvm86g4gSIyI7AMQ9AMR3DYDghN4GUfLZMes50w1ERJR0Q0t/2n5ovC+OawAQ6NG9zqGkEuDDzNPD75ruICKi5LNi0bhP2fc4AOgryFZgRN+SKIm4/U9ElKZE4n9kf48DQKQlNCqe15FHqM3tfyKiNGVL/M/s6VqdqzcAACAASURBVHFhtwIypm85lEQdgY7YUtMRRERkhiiKqqo0rh/aez4FoOAA4BvygpyNNtMVRERkTP9lgZZR8bwwjinB5gDgEwrl9j8RUZqLWfFdB9DzACAyus81lBS2bfECQCKiNBfvhYA9DwCKw/pcQ64TxYasqZ3rTXcQEZFhqn0fAHQphgHo50gQuUtQZzqBiIg84YSiP2iopxftdwCIxoIjneshN9mK5aYbiIjIEzL77+j5QsD9DgACi9v/PqG2vGK6gYiIvCEg6PH6vf2fAlCbOwD+0JQxNfye6QgiIvIGW60e7+DrYQdAuAPgByqvikBNZxARkTcItI87AALuAPiBZXP7n4iIPq9vA4AAhzjXQm4R6GumG4iIyFNGQVX294L97wAABzjbQ24IxDLfNN1ARESekjP1zvaD9veCbgcAXYqBALIdTyJnCRplatsW0xlEROQt0cD+H+Xf7QAQjmUMdz6HHKfgT/9ERPQlGtv/hYDdDgAWbA4A/sABgIiIvkTE6t0AICocAHxAhAMAERF1pZc7AGopLwD0ARvgA4CIiOhLpIdbAbu/C8CWYY7XkONCVuR90w1EROQ9Cgzb35cCdb8DAAxxJ4kctEMmY7fpCCIi8iQZ0tje7Q/z3V8DAOEA4H3rTQcQEZF3RffzPJ/9PAhIOQB4nALc/iciom6Jpd1e0N/9ACAY7EoNOUZUN5huICIi71LYvdkB4DUAXiciH5tuICIiD7OR2A6AVsECMNC1IHKEQvkIYCIi6pZCEtwBGI+B3f4eeYZtWRwAiIioWyIJ7gB0ZGbluZdDTsmQ8GbTDURE5F2S6F0Alto57uWQQ9r4DAAiItofTXQHQFQ5AHicAFtNNxARkccp8kurNNjVb3EA8CkFmkw3EBGR54kVbC/s6je6HgDAAcAHuP1PREQ9Eis2oKtf7+ZK/wAHAM/TPaYLiIjI+2wE+nf1610OADZPAXieQLgDQEREPbLU7vLOvq53ACz0c7WG+kwB7gAQEVGPbNUEBgCgyysGyUNUuQNAREQ9EkviHwAEXd8yQB4iaDedQEREPmB3fVq/6x0AmzsAXqeQiOkGIiLyPhUJdfXr3V0DEHC1hvpOwQGAiIh6ZAkSGAB4DYD3WRwAiIioZ6qJ7ADA4gDgcRZ3AIiIKC52AgOA8hSA5ymvASAiop6pJnYKgIiIiFJY1wOAIJbkDkqUaJcTHRER0eeJWOGufr2bHQA76mYM9Z3dzVWdREREn6fQRAYAcADwOpsDABER9cwCEhgAbJ4C8DzuABARURxs1S4vGu/uQUDcAfA4Ec0w3UBERN4nSOAaAIVwAPA6RbbpBCIi8j6VRE4B8BoAH5ABpguIiMj7RBI5BWCjzdUa6jMBBppuICIi7xM7gbsALJFWd3OorxTKAYCIiHqkCCRyCiDGAcDzeAqAiIh6ppLADoCCOwA+wB0AIiLqkVgJXAOgPAXgeQIMNt1ARETeZ0UT2QHgAOB5ChxguoGIiLzPTuQUgC0WBwDvy9aXMMh0BBEReZsEAvGfAsgKduxxN4ecEI5kDDfdQERE3iYR7ejq17u+C6AGewDYbgZR31m2zQGAiIj2K5pp7erq17scAKQKNoDdrhZRn4kKrwMgIqL96t+e3dTVr3f3KGAA2OlSCzlELT3YdAMREXlax7NV0uXTfTkA+JioHGG6gYiIvEuALrf/gf0NACpdbhmQd6jiSNMNRETkXSrodi3vdgBQKHcAvE44ABAR0X5o97v53Q4AwlMAflCgy9DfdAQREXmVJr4DAEu3udJCjop0hrgLQEREXRJ0fzp/PzsAssWdHHKSZcto0w1ERORNqr25BiCmHAB8QAXHmW4gIiJv6tVFgLZlbXUnhxx2vOkAIiLyJkt6cQogIxDmDoA/cAAgIqJu2L24C2AydgPo8ulB5CV6gD6HfNMVRETkPRrrxSkAABCApwF8IJoR5C4AERF9iW314hQAACiwyfkccpygyHQCERF5UNDa0d1v9bQD8KHzNeQ4xQTTCURE5DnR/JHZ3e7k738HQJUDgC8IBwAiIvqiLYtmS6y73+xhB8D6wPkeckFBx9JMfjMgERF93kf7+839DgA2lAOATwSj9kTTDURE5B0q+7+Ob78DQEgiPAXgFwIOAERE9C+W9mEAkApsB9DqaBG5QoEy0w1EROQdqtL7AeBTPA3gD0d21GQebjqCiIi8Qa0+7AB86l2HWshllm1PN91AREQeEbV7fxHgPrLOqRZyl4hMM91ARETeEM7s6NsOgAAcAHxDS/UVZJuuICIi43a/fGN+8/5e0OMAYFvKAcA/smPtgVLTEUREZFyPj/LvcQAISeQ9ALYjOZQEFk8DEBHRfs//A/GcApiMDgE2OpJD7lPwQkAiojSn2P8tgEB8dwFAIWv7nkPJoMDhHYszjzTdQURE5liizgwAAF7vYwslkWXZPA1ARJTG1LbW9/SauAYAsWRV33MoWQTC0wBERGksoJF3enpNXANAINxZ3/ccSpb19oDWk58+p7/pDiIiMqLj5FjeP3t6UXw7AGdgK6Bb+t5ELgv/qe2oP17aNKmsoz3jAtMxRESUfAK8W1UlPd69F+81AADAXQAPi0E2zd41eeH9baOvAjBQoJeZbiIiouRToMftfyCRAUA4AHjV5lhO7eSdZ27+ONb/awDk018++aSFlUeY7CIiIgMEa+J5WfwDgA1eCOg99qK2EfMqd5cfG1Frwhd/MxDTr5uIIiIig2yJawAIxnu8oERXRRHqfRA5SoGGq/ac+rc1kUFfRzeDnIpeCsVtEGiS88jHgoHIxxrLuMR0B3mbAnMAjDHdQV8WVCuuUwDS80v+T7Q69IECI3uXRE5p0qxXZzRVtHeqNbmn14pKRf1XH69JRhcRpQlVKburdQeAwaZT6Etaa+fk9IdIjz/4JXIRIGxeB2BcTefwR8/cOfXAeBZ/AFBeDEhEDqu4o2U0uPh71dp4Fn8gwQFAoBwAzNnz/T3j/nxLc3ElgIPjfpdgBp8JQEROsi3rZNMN1K24zv8DCQ4AvBDQjFaE3prSNG35K5HCK4GEL8To19kRqnSji4jSlOpE0wnUjTjvAAASHACC2dHV4FcDJ1V9eOhTFTun9WuxQ2f09hiiuMzBJCJKdwIOAB4lEt8zAIBETwGcgmYI3k88iXqh/c7WE/98zd6JZ0DRp/v5FTiFzwQgIieUVu0dCmCU6Q7qWiBmuXQKAIAoXk70PZSYDg1sOKtpyj/+2n7wlQCyHTikBGz7BgeOQ0RpTkLWVNMN1K0di2/p93G8L054AIAIbylz0XvRgc9X7JzeudPOPs/J4ypw+XEPnl/g5DGJKP2IotenI8ldAqxI5PUJDwCBaLgG4INlXBC5r230vMt2T5oYgxzjwvGzMjKsa1w4LhGlC1WBgDsAHqWQ5Ym8PvFTAKejAcDbib6PuhdRa3PlrrKnHmo76nIAeW59jgBXH7OwMtet4xNRaiu7q+1EAIWmO6hrCn01kdcnfgpgn+pevo++YFMs98WyndO3fBLLne32ZykwKMu2v+n25xBRahLh9r+H2eFg+8pE3tCrAUDE5gDQd/b8jpEPX9BUdkwUVkmyPlQE1xf94Zv8UgciSpiqcgDwKsGal2/Mb07kLXF/GdDnBaKxF6MBKwwgozfvT3cxWDuu2jPxH+sigy+C9HoXpncUB1kDmr4GYF5SP5eIfK305y3DEAGfAOhRoprQ+X+gtzsAp6MVQELnGmifhlj2qvKmae+uiwy+GL0/BdMnCv0RNLEvgiKi9GaFdRYM/ZlFPVORhNfkPvzLVJ4GSNDizoMWntc05cBOO3CK4ZTRxQtmnWO4gYj8RMT165So92zYydkB+BQHgPjtvW7P+Id+3HzSDBUcYDoGAKD2jaYTiMgfptzdOhzg9r+H7aq7uf97ib6p1wNAsCm6EsDe3r4/XeyxM9ZM2Tlt5YpIwSXo5TUXrhCZULJgZoXpDCLyvmjE5va/h6liRbxfAfx5vf4XKrMRg2pdb9+fDl4N5z87bdcZ/Vo05MmF1lbcg6oq/kdNRPslggtNN1D3LCuxBwD96319+VCF8DRA1zp+0nLSQ9fvnTBVFSNNx3RHgOOLRr9zhekOIvKuitubxwAywXQHdU8lsQcAfYYDgMPa7OAHZzVNrXm+46BLAGSa7umJAHec/PQ5/U13EJE3xQLyDdMNtF+2JeGEvgPgM30aADKnhNcpsLEvx0gl70QGVVc0TQvvtLPONN0SPy3saMu42XQFEXlPZZVmiOIS0x3UPQFeq75p8J7evLfP538FeLKvx0gB0f9uPfqRq/acOkEho03HJEpErz/xkRkjTHcQkbfsDLacCyDfdAd1z1Zd3Nv3OnABmD7e92P4V1itrZVNZX99pP2IiwHkmO7ppaxAQO42HUFEXsPtf68T4B99eG/fqEKiNcFNgBzU12P5zUd27ssX7yrNial1gukWJ1iWNXHl7EW9upqUiFLLlNv3HBmzAu+Ct/95WfOeoTlDVn9LIr15c99PAQgUkHQ7DaCPdh6x4KtNZUenyuIPALZt/5qPCCYiAIhZwevBxd/r6nq7+AOO/ctNn9MANmTn5XtOffy/mo+ercAg0z0OG1c0f8ZXTUcQkVmlVXuHAnqZ6Q7qQR/O/wMODQDBZdGXAdnmxLG8bHu03+tlO6ZveDcyqBIOnD7xIhH52TELK3NNdxCROYGMwNUAsk130P6J5YEBQKpgi+hTThzLq/7WfvBfzt9VcWAnAuNMt7js4Gw7do/pCCIyo7RKsxT6HdMd1KONNXPy3u/LARw7v6MpehpAgZZr90xYcEfriWeroMB0T3LIt4ofPX+K6QoiSj4JtV0KTZc/6/xL0Lef/gEHB4DgzugLEDQ6dTwv2G1nvjtlx7TXVkbyLwAQMN2TVJb1P+MevjjPdAYRJU9llWYIdK7pDuqZrfDOACCzERPgL04dz7SXo4V/n940NacVoUmmWww5JBbs+JXpCCJKnp3Blm8COMR0B/UoptFoTV8P4ugtHilyGqDztpaTFvxg97hyhRxsOsawK0sePf8M0xFE5L4Jv9JsEZljuoN6JtD6uqpBu/t6HEcHgKAVrQXQ5OQxk6kVwY/O3Dn1xSUdB10AIMN0jxfYlvU/Jzx13kDTHUTkruyO1u8ocIDpDuqZ9uHpf5/n6AAgkxEVxdNOHjNZ3ogMfmHqzumRJs3ixW+fI8CBwU7rN6Y7iMg9pVUNuVDcaLqD4mU948hRnDjI56mlDzt9TJfFft16zKJv7zllrK04wnSMN8mlJQtmnm26gojcEQj1mwNgqOkOiod+UDs35zUnjuT4ABAsiy4V4J9OH9cNnRrcPmtX+fML2w+vBB96sV8K/GHCwsrBpjuIyFllt+8+XIEbTHdQvGSRU0dyfAAQgSr0z04f12nrY3krpuw4Y8fmWM6Zplt8QXFAWPV/TGcQkbPECvwSQKbpDoqPWh4eAAAgGI0+ACDqxrEdoA+2H/XUpbtKx0TEOsZ0jJ+I6vlF82feZLqDiJxRfmfLFIWca7qD4qPAh0tvzlnt1PFcGQDkDGyF6nNuHLsvIgjs+vruSc/8rnX0+QD4kJteEOAOPiWQyP9KqzSoAC/w9ROFYz/9Ay5+1aNYAU9tF2+O5bw1ZecZH7wfHchpt28CEOuxEx+ZMcJ0CBH1npXR+gMAY0x3UPzUwfP/gIvfaKcLEYgODn4EyIFufUa8nu4c8de79x43QUWGmG5JIa/ltvc/ue7yBzpMhxBRYipubx5jW/I6eO7fNxT4cOnc3MOcPKZ7OwCzEYNaD7h1/HjYkNbv7pn41M+aj5/Oxd9xJzVnN//OdAQRJaaqSi21cD+4+PuKBTj+pF3XBgAAiNrWnwGom5/RnSbNen/qzmlvrY4MPR8u/3OmKwEuK5o/89umO4gofi8FW69TyHjTHZQgB6/+/4xrpwA+E6kJVUNR7vbnfF5d57Dqm5tLjgZkeDI/N02FLcsqXTl70XLTIUS0f6U/3XOEZQfeAp974jcba+fmjnT6oK7/ZCwqybwYMDy3uejJm5vHlnLxT5oM29bHxz16TqHpECLqXmmVBi078DC4+PuPOr/9DyRhAAiEw08B2On25+y1Qx9Pbzr9ldrOA2cACLr9efR5OjxmhZ6YsLCSf7AQeZQVar0DwDjTHZQ4CchCN47r/g7AdHRC8ZCbn/FaeOiyabumRXfZmaVufg7t18lR215YurSUwxeRx5Tf2TIFwI9Md1CvrK25OafejQMn5eI425Y/wJ2LAWO/bPnKX76zd2KxrXD8/AglRoGzWrYNmQd1/9oSIopP+Z0thQo8hCRc80XOE4Vrj9ZPygCQeXr4XUD+5uQx2zXYMGNXRe3jHSPPA5Dl5LGpDwRfK1k48z9NZxDRp7f8KR4EwGt0/Ckci9oPunXw5N0eJ/YvnDrUu9EBq6funNa0NdaPj6T1IFVcU/TYrFtNdxCluxdDrXdBMNV0B/WSyNN1VXk73Dp80gaAUHn0RShW9PU497ePevby3aeNikJGO9FF7hDR/1cyf9bVpjuI0tXkO1suAnCj6Q7qA3H3G1iTek4ouiRjpor26naGMKzdV+yatPyfsbxpTneRa2xALl514ePzTYcQpZPJP20tEltfAm/587ONtXNyDoOIaw/TS+oT8gIvh58SxYZE37cplrtm6o7pm7j4+44F6IMlj55/hukQonRR+vOWYWLrX8DF39dEZJ6biz+Q5AFAqmDbwK8Sec+T7SP+cWFT2fBOWMe51UWuCqllPVHy2KyJpkOIUt3UX2iOFcHTAA4y3UJ9Ygdsmef2hyT9thBdiqyoHdoERf7+XmdD2q7ZPbF2dXTImeDtK6mgWUXPXX3Bk0tNhxClotIqDUqw9VkRcMfN51Tx/NJbcl3f8U76l+TIZHRA9b/395pGO/uDqTvOWLs6OuQscPFPFf1F5e/F82edazqEKOWoihVsvZ+Lf6pw9+K/zxj5lrwgovcCaOvq96rDw+vObarIaUWoOMlZ5L5MQJ8oWjDz66ZDiFJJ2Z2tP4fgEtMd5ABBw9783GeS8VFGBgCpwE4B/u38hgKROc3Ff711b/GpCuFDK1JXQBTziufPuM50CFEqKL+r5UcQ/MB0BznExoOrvyWRZHyUkQEAACKxwC8BxABgt2ZsPrPpjJVLO4efBSBgqomSRgD5dcljs243HULkZ+V3tfxIFXeb7iDH2FYg+LtkfZjR8+vhmtCC+nD+IdfvHX+grXKwyRYyRHDvqtlPfA/iyndFEKWssjtbbgTwM9Md5ByBPFEzN2dW8j7PoHv/euyYeS2jXgeQabKDzBLg0ZzCnV+vm1wXNd1C5Adld7XcBMVPTXeQs1Ss8Uvn9OvzE3PjZewUAAB856x31qnIcyYbyDwFLmrZPuTpomfP7me6hcjryu5sncvFPxXJy8lc/AHDAwAAiMZuA2Cb7iDjpktrxvKSR2YeZjqEyJNUpfyult8AeofpFHKeCO5J9mcaHwBWXfjUO4AuNN1BnnAcAlh10oKZp5sOIfKSyirNmPzT1sdUcY3pFnLF+6eG+yXl1r/PMz4AAIAF/TE+vSOA0psCgyzFcyULZtxsuoXIC06+u7H/zlDrc6K4wHQLuUTl11VVkvSdcM88Za9o/sx5AlxmuoM85cl2y/r6mtmLWkyHEJlQenfbQVbEfgaCE023kGt2tGfnHLL8BmlP9gd7YgcAAEIa+wmApDz8gHxjRpZtrxg7//yjTIcQJVvZHXsnWhG7not/alPV+0ws/oCHBoBXv/qXjVD82XQHeYsAR9uwVpYsmHm26RaiZCm/q/VKiLUUgmGmW8hVHVEL+/1uHDd5ZgAAgBgit6Ob7wigtDZAFU8XPzarCuqd01ZETiut0mDZXa3/par/AyDDdA+5S6APvjSnf6Opz/fUAPD6V5/ZIqK/NN1BniQQ/XHJwlnVJz4yY4TpGCKnld7ddpAVaq2F6ndNt1BSqG3rr0wGeGoAAIA2CfwcwDbTHeRNqloWCMjbJQtmXmW6hcgpk+9qPceK2m8CONV0CyWJYP7SW/PeM5vgQUXzZ31DoH8y3UEeJ/J8SOQby2cv2mw6hag3pv1WMzub234B6PdMt1BSxQJ2bMySWwesNxnhuR0AAFj97rH3A3jbdAd5nOoZEdt+p/ixGfwedPKditubx4SbW1/l4p+GFA+aXvwBj+4AAEDR/FlTBfoP0x3kG08H7Mi3Vlz0zHbTIUT7U7lQAzvXt/4AwE/AL0JLR2Fo4KjaW7I/Mh3i2QEAAErmz3xeAT4WluKkO0TkO/UXPMFHS5MnVdzePMa2ZB6AcaZbyAyB3FczN+c7pjsAj54C+IzC/gH4iGCKmwxVxYKix2YuKHpoxgGma4g+U7mwMjD5rr0/si15HVz801l7GPDMlzl5egDY90VB+J3pDvIXEcyWkKwvWjDjlgkLK7NN91B6K1kws+JD236jI/+BmRDtMN1DRt330tycraYjPuPpUwAAULSwcoDY+h6ghaZbyJc2QXDTqgueeMx0CKWXkxZWHmGp/hKq53z2a1b4gE25n/ykA5rJx1unHWmxI7GRdVV5O0yXfMbzAwAAFD824xKIPGi6g3xMdblCrl/91SdWmE6h1Fa0sHKAZeutuu/q/i8/zU8z2nM337ra6jzklOTXkTGqd9Te0v9W0xmf54sBAACK5898AcAk0x3ka6rQR4NR3LTia09+YjqGUkxVlVUy+u1vQHC7Kgp6enlm08xlmbvOKQHvBEgHu6xAeGT1TYP3mA75PB8NAOcfC1ivAwiabiHfa1PgHuSE71599rP87gnqs+LHZpWq6H8KcHwi7wt2jFrXb8uP+kODB7nVRuaJyNyaOTl3me74It8MAABQMn/WPQr9vukOSg0KbAZwZ//2/vPqLn+AF2dRwoofm1UKC3OgOqW3xxA7Z3fOpjvXW7FBJU62kWdsDmbkjFr8Q2k1HfJFvhoAjllYmZtl2+8KcKDpFkodImhQW36jAbl39exFntqiIw9SSPH8GWeLyM0KjHfmoKLZDf/xQqh5/CR4/O4sSowCFy+dm/uo6Y6u+GoAAIDix2bMgsgi0x2UkvYC+ING9NerL3nSM7fqkDdULqwMbFT7q6q4EcCxbnxGqHnsa9kNVx8KyGA3jk/JpZBlS+fmePYLnnw3AABA0YJZT4rq+aY7KGV1quLBoI1frLj4CePP6yazSuddltWc3Xy5AD8EMNLtzwtEC7b0+/j/7RI7+xi3P4tcZdtAUd3c3DdMh3THlwNAycLKYbDttQoMMt1CKc2GyJOq9k9XX/jka6ZjKLmKHppxgAStyyH6PQDDkvnZosFw9pabXg12HMk7n3xKoX9YOrf/f5ju2B9fDgAAUPLYjMtUZJ7pDkob1SL4067+bU9vmP73TtMx5I6iP3wzFMjbcZaKXKHANAABkz0Ze6a/krXjguMB5JjsoIQ1idhH1czJ22k6ZH98OwAA/LIgMqIJgscsGw+s/OoTq0zHkDNOmn/+mAACV0L0knju4U+mQOeIDf023xYQDbp++oGcIdDv1sztf6/pjp74egAoWlh5iNj2OwD6m26htPS2Ag9EwvbDb136VIPpGErMyU+f0z/cEboQiiucu5rfJXZWS+7Ht79jRQu83UkA8NaQI3NOWjRbPP9Fdr4eAACgZP6sqxXq+UmLUloUIs9Ztv1AbO/Qv67+1h8jpoOoa8csrMzNVvt0KM4FMAM+21rPbrz0xdDe8ongA9E8S0VLl87p/4Lpjnj4fgCAQooXzKwDHxNM3tAIyCMQ+/FV645bjqoq23RQuit57NyDFcFzRHC2AqXw+aN3Q61feSt72w2FgMUvSPMYFSxYOif3QtMd8fL/AABg7MLKkbZtvwEgz3QL0WdE0KCKZ0XwdE5b/yV82mCSKGTs/JlFauk5tso5iT6e1w8kNrAx55M7N1vR3BNMt9C/tNlBa1Tdjf188z0jKTEAAEDRgplfF8UDpjuIutEGYIlAFlsxXcLnCzhrwsLKA6Nqn6yKckDOAnS46Sb3WbHsLdcvC7Ufd5rpEgIg+GHtnNx7TGckImUGAAAomT9zoQKVpjuI4vARgGpRXRINBGpfn72o0XSQX1QurAx8YMeOF8hEQE8GZCKAQ0x3mZK5d/KKzMavjwGEO6CGCPTVUyO5J1dVia9O+aXUADBhYeXgsG2/xe8KIB/aAGC5Assty1p+KPD2otmLPH8VcTIULawcYEWjExCQiYB1sqqOBZBrustLApEDPsr5+PZOaOgo0y1pqNOy9cTqW/uvMx2SqJQaAACgZMHMClUsRgr+s1FaaQHwGiBvQvQNW6w39+a2vJPKDyEqevSrQ1UiYwKWjlbFaABjAIwGMAL8gpyeaUZ77ie3vWaFDz7ZdEpaEdxcOyf3Z6YzeiMlF8ni+bN+Deh1pjuIHBYF8B6gbwPyTxWsF+iGQCy6YcVFz2w3HRePooWVAwJ2tNAW6whVjLagY/Yt9jIGgiGm+1JBZtMFL2Xumj4WPr/bwSfqhxyZM8EP9/x3JSUHgCOem5Y5cG+/egBfMd1ClCR7AWwUYKtCt0CwFbZsEZGtUGyzArLbAva0dmTtfuvShxz5XvKiP3wzlDVsW1ZHa06mBqMDLY0VAjJMVAoh9jBVKYTIMKgWYt+z9AsBZDnx2bR/gY7R63I2/zAPCPJ0qHvCGtOTlt7Wf43pkN5KyQEAAMYtrDw6Ztsr4bMHfRAlQRT7BoY9ADoBRP71l2oEIhEAAahmqUim7Fu0s7DvJ8rP/jcT3Jb3NCuWu6vfx3f804oNKjbdkprkltq5OXearuiLlB0AAKB4/qxLAf1f0x1ERCYIxM5quPrFUPPYSeDA5qTX7EjOuLoqiZoO6Quj33Tlti2Pr31z+MyjD4HgRNMtREQGSDSn/lDN2vZasKU4C5Bs00EpICLAmUtvy9xqOqSvUn4ieFl8lQAAEDlJREFUDAWs7wJ423QHEZEp4X6vFrWO+GGHBjp8e77aO+TOmrm5b5mucELKDwDLZy9qh2VVYt9tVUREaSkWbBzeMuI7R8ayNrxkusW3FK/vGdrvLtMZTknpUwCf2bJo7c4DZo75SERmmm4hIjJG7EAk78URkOjLwfZjhgIImU7ykeaAxqYsuyErZZ7amRYDAABsfWLd28NnHT0cQJHpFiIik2LZ7x8SzXnjo1DzpL0Ca6DpHl9QXF5za54vvuY3Xil/CuDzdue1XQNghekOIiLTYpkbj2gZ8Z0hdnDHq6ZbvE4Vf669Jfcx0x1OS6sBYMP0v3fGNDIDAt9fvUlE1FcaaO/fMuL74yN5L7yAfc+HoC8SrOnol/M90xluSOnnAHTnpPkzxluQOvBRmUREAIBg6wlv9tt+3QFQKTDd4iFtIlpSM6f/WtMhbkirHYDPvHbhk68K5NumO4iIvCKa88bxLSOuhwZa3zTd4hUK+V6qLv5AGl0E+EVbHl/7xvBZxwwBMM50CxGRF6jVkRMe8PzQQMdhL1nRwkNN9xj28NK5ubeZjnBTWu4AfCa3cMcNIlJruoOIyDMkFmwbfs9pHfn/+6pCm03nGPK+HWlL+V3itLwG4PPGPnn+EDts1QMYabqFiMhLAuEDN+Zs/kkEduhI0y1J1GkD4+vm5r5hOsRtab0DAAArZzy1U21MF2CX6RYiIi+JZWw+tPnQ7x5oZ2x+2XRLsijkmnRY/AHuAPxLycLK09S2FwPIMN1CROQ1mTsveClz9/RxSOE/IxVy79K5Od813ZEsab8D8Jn62YtegOAyAGq6hYjIazqHLDi1dfjP1gOxLaZbXFKjkX7XmY5IprS9C6ArWx5f986BlWPCgJSbbiEi8hoN7SgID6iNZDSfvFY0a7jpHufIhrAVnfrirdltpkuSiQPAF2x5fN2yA2YefaAIvzOAiOhLrHB2ZODzw6zI8BcD4QNHwP+nkvfYYpe/OGfAJ6ZDko0DQBdG/f/27j04ysJe4/jzezebkGQTKKZitR0R8RwQi4VNAqcN3toyg1ZKLhuSYO0wRdvxnNFSz5weE0vR6pzWqdNWp7U6VqgtuScIVO3xWJJWRiDJptapBa1FR4JUrAS55bLZ99c/0M5pqUDC7v7ed/f5zDDDBMh+hxnYZ959L/8x7enR4/mlAGZatxAReZCMhXqnu9kHolnHw7kCybUOmqC4OKjoqi/IyOch+H25Jc2c1kgoz3W7lU8PJCL6QE7s3H2hgbsPw82dbd0yXgp8rash9D3rDiscAKcQbqwtEmf0OQCzrFuIiLxKEBzJ21ffExiesci65Uyp4iddd4ZWWXdY4lUApxCta/qL6NhiAG9YtxAReZUilnPsgrsWjZ7TuQ3AkHXP6ShkW9FY/i3WHdZ4BOAMlDaX/4sLZxuAD1u3EBF5WWDk4lfyBxpygMCF1i0f4PWYaOlz9QVvW4dY4wA4Q8VNlfMg6AZQaN1CRORl4uYeDg3cs0tiRV572NrbIm7Zr+oLX7EO8QIOgHEoaam4QlV+CcCvZ7wSEaWIaO6BL/0meGRRGbxxxdkRdeTqrjvyo9YhXsEBME7hporrRGQjgKB1CxGR1wWPznth0lu3XSAQy49QR+DqtVu/UcCnv/4/HAATUNpUUe6KtIAjgIjotCQ+9a3QG/e+JW7eXIOXj6todVd9QafBa3saB8AEcQQQEY2DBsby3rz9+azhOVek9oXlpq0N+Y+m9jX9gQPgLHAEEBGNT/bhz+yYdOCGyyASSvqLCe7YWh/6dtJfx6c4AM4SRwAR0fg4Ixe8FnrzrjjcYDJvt37/1obQfybx+/seB0ACcAQQEY2P6KRjeQNrfhcYveCTif7eqvhpV0P+Sojw8e6nwDsBJkBPbedGR3U5gJh1CxGRH6gM5x/7WP0nRyb/728AjCbwO2/WsfxVfPM/PR4BSKD5zVWfc6BtACZZtxAR+UXW8ct+n7//9nMUzkfO5vsIdNPUWKi6ba0kcFCkLw6ABCtuqroKopsBFFi3EBH5hcQLDob23vu6xCfPn9Cfh3QcKsqrjX5ZeCT2DPEjgATrq23vFuinoXjHuoWIyC80cGTq0em3fSKWF/01gPEevm+Nx/Jq+OY/PjwCkCQljZVz1JFnAD3fuoWIyE+CR8p6cw+sugSQKaf7vSrYUDQz/4tt1RJPRVs64RGAJOmt63hJ4roIwGvWLUREfhIr2FZy5ML/PqoyvPs0v3X9laP5N/LNf2J4BCDJ5jUtPd+R4P8JcKl1CxGRnwiCI3kDDb2BkYvKTv5VfXRrfehmnu0/cRwAKfDxDXUfmhQY2aTAIusWIiK/yTm4bFvOYHkYf3sSqzy0tT7v3/nmf3Y4AFJk5lNLcqYczl0PSI11CxGR3zhDF78c2t+QC83atLUh/1brnnTAAZBKCilprfwfVXzdOoWIyG/ELfxmb926u6070gUHgIHi5qovA/pDAAHrFiIiH4gLcEtvTccj1iHphAPASHFz1RJAWwEk/4lYRET+dUxVl0drO5+0Dkk3HACGipsq50HkF7xXABHRyURwQFxc11Pb0Wfdko44AIzNa1p6fkCCnQAWWLcQEXnIKxLHkt4VHXusQ9IVB4AHvHeFwCOA3GjdQkTkAc872e7SnoqNvKV6EnEAeEi4ufJrAtwHnhxIRJmrMzRUsKJ75fph65B0xwHgMeHmqsUCbQFw2ntgExGlExE80Lvr46uxdq1r3ZIJOAA8aMGGykviAWwCMNu6hYgoBUYguKVvecdj1iGZhA8D8qCdKzr+GBibtBBAp3ULEVEyKbBPFVfyzT/1eATA44qbK74KyH0AgtYtREQJpbotoGNVO+s2v2Wdkol4BMDj+mo6v+9CrwCw17qFiChRBHhIDxddwzd/OzwC4BOlneXnuKPOzwAssW4hIjoL/LzfIzgA/EQhxc1Vd0D0bvBSQSLyGQX2QVEZre3Yad1CHAC+FG6puFrU+TlvIUxEvsHP+z2H5wD4UHR5Z5eTHZ8LXiVARN7niso9ofMOXs03f2/hEQCfK2muWqnQB8CnChKR1wgGRJwbeqvbfm2dQifjAEgD4eZlFzsI/FyBhdYtREQAoCIbs0VWba9uO2jdQv8cB0CauKrrqqyjfy66E6J3gicIEpGdIUBW99W0P2wdQqfGAZBm5jdXLBTI4wJcYt1CRBnnRRduTX/Nxl3WIXR6PAkwzfTXdO7IdpzLBXI/AD5Qg4hSQgQPHCo8Xso3f//gEYA0Fm6qXCCCdeBDhYgoWQT71dWborWdT1qn0PhwAKS5mU8tyZlyJHcNVP4LQJZ1DxGlEcVjY5Pit79Q/sQh6xQaPw6ADBFurpgPyGMCXG7dQkT+psDrjuCm3uUdz1q30MTxHIAMEa3p7Me755So6DcADFv3EJEvuSJ4IDaadxnf/P2PRwAyUMmGyhkawIMArrVuISLf2CUqq3pr25+3DqHE4ADIYKVNFeWuyA8AfMy6hYg8awzAdw4VHv/Wq9c+PWIdQ4nDAZDh5j7+hfzs7KE1gK4GELTuISJP6XPgruqp2fg76xBKPA4AAgAsaI1cGo/HfwSRK61biMiWCA6oq/V9L89dh7VreT+RNMUBQH+npKWyWhXfBnCRdQsRpVwMwIPqOHdHq9vetY6h5OIAoJPMfGpJzpTDebcCaAAw2bqHiFJA5Jca19XRuo7d1imUGhwA9IHCjbVFcEbuEsjN4E2EiNLVqy5kdX9N+y+sQyi1OADotMKNlbMkIN+F6nXWLUSUMEcges+QBL7/UnXbqHUMpR4HAJ2xkqaqT6vovQAWWLcQ0YSNCXS9G8Oa6Bc691vHkB0OABq3kpbK613Ft3hbYSJfUUBbAnFZs3NFxx+tY8geBwBNjEJKWisjqrgLwCzrHCI6pS2uizv76zpetA4h7+AAoLMSaY0E9qh7gyi+CV46SOQ1XS60vr+mc4d1CHkPBwAlRPjhm4PO5HdWKvB1ADOse4gymmqPONLAB/bQqXAAUEJFWiOBPfH4chG5A8Bl1j1EGeYFQNb21bRvsg4h7+MAoOQ4cY7A56CoV2ChdQ5RmvuVQu6L1rQ/Yx1C/sEBQElX3FR1FRzUQ/Wz1i1EaSQOoF2h90VrOvutY8h/OAAoZcLNFfMF8lUAywFkW/cQ+dSQQtc5cbm/d0XHHusY8i8OAEq5ktbIeRrXr0DwFUCnWfcQ+YLiHRX8EG72g9G6pr9Y55D/cQCQmTmtkezcEycM3qZA2LqHyKNeguIhDY2ui16/5bh1DKUPDgDyhOKWik+pK7eKoBxA0LqHyNiIAB1xlR/317Y/Zx1D6YkDgDxl7uPl5+YEAzeq6JfAOwxS5nkVwCPqZq/jYX5KNg4A8qxwa6TMiburVBABkGfdQ5QkYwA2w3V/3Fe78VkI1DqIMgMHAHleuDUyGa5bJ8AqAPOte4gS5DUB1o9p7NHf1m5+0zqGMg8HAPlKSWPlHA1oHVRqwWcPkP+8DaDFcZzGnuq27dYxlNk4AMi3Slsj/+a6bp0IqlVxrnUP0Qc4CmCjuG5j/kcGn+2+unvMOogI4ACgNBBpjQT+pO5nHNU6QMoBFFg3UcaLQeRpcd3GrEBg8/bqtiHrIKJ/xAFAaWXmU0typhzOvwbQZQCWAjjPuokyxgiArQI8keU47dur2w5aBxGdCgcApS+FlLZFFqq6n1fFMgD/ap1E6UUEB1T1SUexZTiW/8yLN/7smHUT0ZniAKCMEW6snAUHy0T1OogsBJBl3US+9HtV2RIIyJaeP8zZibVrXesgoongAKCM9KlNSwtGhrKvUbiLBbIYwEzrJvKsYQDbVLElEHC29FS3vWYdRJQIHABEAEo2VM5ws7AYkMWieg2AydZNZGYEwHaIdgvQNVgwtPPVa58esY4iSjQOAKJ/EGmNBPa48csdyCIVKYNqGXgyYTobBbBDgW5R6QoNh3Z0r1w/bB1FlGwcAERnYH5rZGYgHi9TkTIAZeAJhb4lwKACUVHZAaA7KyDP8zI9ykQcAEQTEG6sLXIwXKyOE8aJ2xOHAVxonEUnOwLVfhGnD+r2uuL2RWue+JN1FJEXcAAQJUi4sbYITmy+I25YVd4fBtPBf2epchTAiyLoU1f7VKU3WtvxMh+uQ/TP8T8moiQKb7k+D8eCsxyRSxU6GyqXApgN4GLwMsSJEeyHYrdCdwHY7YjscmK6e+cNnQPWaUR+wgFAZGBOayQ7b8y9REVnw8EMUZmuJ44WvP8j17LPmAJyQKADrsgbDvQVF9gFF7sRcHZHq9vetQ4kSgccAEQetKBx6bQxCU4XkYtUcaHj6Pmqei4g0xSYJoppEEyF//4NKxQHIdgLYK8AAxDdC8heiLMXMXfv4IeO7+Nld0TJ57f/PIjoPeGHbw66hX/+cADBaaLuNFdkKhwpFEWBqBTC0UJVLQCkECKFolqgQAhA8G8/BFlQDQISxImPJN7/NRcnLo8bBTCqwKic+Hns/a/Je1+HyIioHnIVh0RkUKGDAhkU0UGNu4OOOINxiQ9mO8HBjwLvtlW3xU3+wojo7/wVWJvziRnusY0AAAAASUVORK5CYII=\" alt=\"\"/>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"pure-u-2-3\">\n\t\t\t\t\t<h4 id=\"status_google\"><%:Google Connection%><br /><span id=\"_google_status\" class=\"red\"><%:Touch Check%></span></h4>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div class=\"pure-u-1-4 check\" onclick=\"check_connect('github', 'https://github.com')\">\n\t\t\t<div class=\"block pure-g\">\n\t\t\t\t<div class=\"pure-u-1-3\">\n\t\t\t\t\t<div class=\"img-con\">\n\t\t\t\t\t\t<img src=\"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAYAAAB/HSuDAAAAAXNSR0IArs4c6QAAIABJREFUeF7s3Qe0JUXVsOH3J0hWQHKOKgaSgBIEyaIiiIIoIEhSMGFCwICZIOYAgqgfoEg0AZIEySoCghJU/ADJWTIMMPxrS1+/6zAz94Tu09VVb611153QXbX3U+fOnN6nu+r/YVNAAQUUUECBNgRmBOYe9zVP9evZgVmBuYCZqz+L73MCs03n78bn8P+q86bMK/qIvsa3J4GHpwLwL+CZKf48jovj4+/i+0PA48BjVR9T+7tHq+Pvr77HufH1dBvojqmAAgoooEDJAvEGwaaAAgoooIACwwm8AFgImB9YsPr1AsDYRf34C/2xX8cFfsktigdjxYApv0ex4C7gDuBO4G7gduDBksHMXQEFFFBAgWEFLAAMK+j5CiiggAK5CsQn9AsDSwKLjbuojz+LC/24wB/7dXxib2teIO42GCsGRIEgfn1b9T2KBbcAN1XFAu8waH4+HEEBBRRQoGMCFgA6NmGGq4ACCihQm0B8Or9IdRG/DBBf43+/BDBTbaPZ0agF4i6C/62+4u6BKBTE78d+fSMwedRBOZ4CCiiggAJtClgAaFPfsRVQQAEFmhR4HrAUsNy4r2WrX8fFvZ/aN6mfft9xN0HcLfAP4PpxX/H7KA5MSj8FI1RAAQUUUKA/AQsA/Xl5tAIKKKBAWgKzAMtXF/VjF/fjL/LjNn6bAv0KxOMD/6yKAuMLBPHrvwNP9NuhxyuggAIKKJCCgAWAFGbBGBRQQAEFJhKIT/PjQv+lwMvGfX8x4EX+RHr+fd0C8RjB1cA1475fATxS90D2p4ACCiigQJ0CFgDq1LQvBRRQQIFhBbzQH1bQ89sUsDDQpr5jK6CAAgpMKGABYEIiD1BAAQUUaEggts57BfDKcV9+ot8Qtt22KhCFgcvGff2+2uaw1aAcXAEFFFCgPAELAOXNuRkroIACbQjE6vpxoT92C3/8egXA/4famA3HTEFgrCgw9ihBFAjikYJnUgjOGBRQQAEF8hTwjVee82pWCiigQJsCCwGvqr5WA1YB5mszIMdWoCMC9wCxlsAfgbhLIL7u6EjshqmAAgoo0AEBCwAdmCRDVEABBRIWmBlYEVhn3G38frKf8IQZWucExu4UuBC4qHqM4LHOZWHACiiggAJJCFgASGIaDEIBBRTojMDYrfxrj7von7Uz0RuoAt0XeAr4GzC+IOCjA92fVzNQQAEFRiJgAWAkzA6igAIKdFIgtteLT/fXBdarLvjn72QmBq1A3gJ3AxcA5wPnAVcBk/NO2ewUUEABBQYRsAAwiJrnKKCAAnkKxAX/ytWFfnzCvyEwb56pmpUCWQs8DPyuemQg7hSIwsCkrDM2OQUUUECBngQsAPTE5EEKKKBAlgIzASsBG1UX/fEc/9xZZmpSCpQt8Ajwp+qxgbOr74+XTWL2CiigQJkCFgDKnHezVkCBMgVmqD7h3xiIr/iU3+f3y3wtmHXZArGIYCwoeFb1FcUBtx8s+zVh9gooUIiABYBCJto0FVCgWIHYku811af8bwRiET+bAgooMF4gth88F4i7A84AbpJHAQUUUCBPAQsAec6rWSmgQLkCcwBrVhf8cWv/qoD/1pf7ejBzBQYR+N+qGBAFgTOBBwbpxHMUUEABBdIT8E1henNiRAoooEC/ArFw3xuATauL/3i236aAAgrUIfAkcEl1Z8CpwJV1dGofCiiggALtCFgAaMfdURVQQIFhBOK5/Viwb3NgS2CJYTrzXAUUUKAPgTuruwJ+BfwaiB0HbAoooIACHRGwANCRiTJMBRQoXmAB4HVAPMcf3+cqXkQABRRoW2BsMcFTgJOAW9oOyPEVUEABBaYvYAHAV4gCCiiQrsDLqgv++KR/LZ/lT3eijEwBBf4tcA0QdwZEQeBiYLIuCiiggAJpCVgASGs+jEYBBcoWiG364kJ/a+AtwKJlc5i9Agp0WOBu4HTghOp7rCVgU0ABBRRoWcACQMsT4PAKKFC8wIzVwn1x0b8NENv22RRQQIGcBO4FTquKAbHN4KSckjMXBRRQoEsCFgC6NFvGqoACuQjEIn4bV7f3vxmYP5fEzEMBBRSYQOBfwFnVYwKxbsAjiimggAIKjE7AAsDorB1JAQXKFpij2qovbu1/PTBn2Rxmr4ACCvBQdWdAFALiDgGLAb4oFFBAgYYFLAA0DGz3CihQtEDc3r8+8E4gPun3or/ol4PJK6DAdARiR4HfAEcBv/AxAV8rCiigQDMCFgCacbVXBRQoW+CV1UX/tkBs32dTQAEFFOhd4P7qEYEoBkRR4JneT/VIBRRQQIHpCVgA8PWhgAIK1CMQW/bFQn47AMvU06W9KKCAAsUL3AKcXC0geGHxGgIooIACQwpYABgS0NMVUKBogcWBrapP+1ctWsLkFVBAgeYFrqkKAccA1zc/nCMooIAC+QlYAMhvTs1IAQWaFYjn+OOT/p2BtQH/HW3W294VUECBKQXikYC4G+AHwInAwxIpoIACCvQm4BvX3pw8SgEFFIjn+ncH3g7MJYcCCiigQBICsXjgKcDhrheQxHwYhAIKJC5gASDxCTI8BRRoVWCR6pn+XYDlW43EwRVQQAEFJhL4J3AscBhw40QH+/cKKKBAiQIWAEqcdXNWQIHpCcwCbFJd+MfWfTPJpYACCijQKYHJwDnA0dUjAo92KnqDVUABBRoUsADQIK5dK6BApwRWrG7xfwcwT6ciN1gFFFBAgWkJ3Af8pHpE4M8yKaCAAqULWAAo/RVg/gqULRCf9r+puvDfqGwKs1dAAQWyF7isKgTEnQGxdoBNAQUUKE7AAkBxU27CCigALAvsVq3kP78iCiiggAJFCfwLOB74OnBtUZmbrAIKFC9gAaD4l4AAChQjMAOwQfVp/1bAjMVkbqIKKKCAAlMTGFsrIHYQ+BnwlEwKKKBA7gIWAHKfYfNTQIGFgB2BPYAl5VBAAQUUUGAqArcDRwHfBWI3AZsCCiiQpYAFgCyn1aQUUABYG/ggsCUwsyIKKKCAAgr0IPAk8HPgG8BFPRzvIQoooECnBCwAdGq6DFYBBSYQiAv9uODfC1hLLQUUUEABBYYQuBz4XnVnwOND9OOpCiigQDICFgCSmQoDUUCBIQTmrm7z/wiw+BD9eKoCCiiggAJTCtwJHAZ8G7hHHgUUUKDLAhYAujx7xq6AAi8C3gvsCswuhwIKKKCAAg0KPFHtHvBl4M8NjmPXCiigQGMCFgAao7VjBRRoSGBsNf94vv8NgP+ONQRttwoooIAC0xSI9QFinYCTgad1UkABBboi4BvnrsyUcSqgwCzVbf4fBZaXQwEFFFBAgQQE/gYcUq0TEHcI2BRQQIGkBSwAJD09BqeAAsBcwM7Ax4BFFVFAAQUUUCBBgbuAQ6u7Au5PMD5DUkABBf4tYAHAF4ICCqQqsACwJ/ABYJ5UgzQuBRRQQAEFxgk8BPwQOBi4VRkFFFAgNQELAKnNiPEooMDS1TZ+uwGzyaGAAgoooEAHBSYBxwFfBP7awfgNWQEFMhWwAJDpxJqWAh0UWAmIbfzeDszUwfgNWQEFFFBAgSkFJgOnAZ8H/iCPAgoo0LaABYC2Z8DxFVBgPeCTwEZSKKCAAgookLHAmdUdAednnKOpKaBA4gIWABKfIMNTIGOBdYD9vfDPeIZNTQEFFFBgagKxheBBwK/kUUABBUYtYAFg1OKOp4ACceH/GWBDKRRQQAEFFChYwEJAwZNv6gq0JWABoC15x1WgPIG48P8ssEF5qZuxAgoooIAC0xSwEOCLQwEFRiZgAWBk1A6kQLECceH/OWD9YgVMXAEFFFBAgYkFLgYO9NGAiaE8QgEFBhewADC4nWcqoMD0BeLCP1Y9fq1QCiiggAIKKNCzwCXAARYCevbyQAUU6EPAAkAfWB6qgAI9CawFfAmI1f1tCiiggAIKKDCYwO+A/YBzBzvdsxRQQIHnClgA8FWhgAJ1Cbwc+DSwdV0d2o8CCiiggAIKcDbwceByLRRQQIFhBSwADCvo+QoosBSwL7ArMIMcCiiggAIKKFC7wDPAicAngb/V3rsdKqBAMQIWAIqZahNVoHaBxYBPATsDM9Xeux0qoIACCiigwJQCTwHHVnfc3SiPAgoo0K+ABYB+xTxeAQXmBfYGPgDMJocCCiiggAIKjFxgEvCjqhB/18hHd0AFFOisgAWAzk6dgSswcoE5gQ8DHwGeP/LRHVABBRRQQAEFphR4ADgE+BrwiDwKKKDARAIWACYS8u8VUCCe69++2pt4YTkUUEABBRRQIDmB24DPAkcCTycXnQEpoEAyAhYAkpkKA1EgSYENga8AKyUZnUEpoIACCiigwHiBa4GPAafKooACCkxNwAKArwsFFJiawEuAz7mlny8OBRRQQAEFOikQWwfGI3tXdTJ6g1ZAgcYELAA0RmvHCnRSYL5qQaE9Xdm/k/Nn0AoooIACCowJTAZ+XC3ce4csCiigQAhYAPB1oIACIRCr+ceq/vu5wJ8vCAUUUEABBbISiMUBY6HAg4DHssrMZBRQoG8BCwB9k3mCAlkJxL8BscDfF4HFs8rMZBRQQAEFFFBgvMA/gX2BY4FnpFFAgTIFLACUOe9mrUAIrAJ8C1hbDgUUUEABBRQoRuBS4P3A74vJ2EQVUOA/AhYAfDEoUJ7AvMD+wHuBGctL34wVUEABBRQoXmBsfYBYKPDu4jUEUKAgAQsABU22qRYvMEN1u39s6xeL/dkUUEABBRRQoGyB+4HPAt8Gni6bwuwVKEPAAkAZ82yWCqxe/ee+hhQKKKCAAgoooMAUAn+qHgu4UBkFFMhbwAJA3vNrdgosXK36Gwv9+fPu60EBBRRQQAEFpiUQCwOeCMRjATfLpIACeQp4QZDnvJqVAjMDewKfc1s/XwwKKKCAAgoo0IfA2LaBBwBP9HGehyqgQAcELAB0YJIMUYE+BdYDDgVW6PM8D1dAAQUUUEABBcYErgHeA1wgiQIK5CNgASCfuTQTBeYBPgO8D4gF/2wKKKCAAgoooMAwAvFYwDHAh4F7hunIcxVQIA0BCwBpzINRKDCswNbAd4D5h+3I8xVQQAEFFFBAgSkE7gP2BY4AoihgU0CBjgpYAOjoxBm2ApXAcsB3gY0VUUABBRRQQAEFGhY4v3os4NqGx7F7BRRoSMACQEOwdqtAwwKxyF/cjhe3/M/a8Fh2r4ACCiiggAIKjAk8CXwV2N9FAn1RKNA9AQsA3ZszI1ZgXeAwF/nzhaCAAgoooIACLQpcD+wBnN1iDA6tgAJ9ClgA6BPMwxVoUeCFwFeAdwL+7LY4EQ6tgAIKKKCAAv8WiPUAfgR8FIh1AmwKKJC4gBcRiU+Q4SlQCWxefeq/iCIKKKCAAgoooEBiAncC7wVOSiwuw1FAgSkELAD4klAgbYEFgEOAHdIO0+gUUEABBRRQQAFOqAoBd2uhgAJpClgASHNejEqBEHBrP18HCiiggAIKKNA1gfuBfYDDuxa48SpQgoAFgBJm2Ry7JrBgtbXfVl0L3HgVUEABBRRQQIFK4FTg3cCtiiigQDoCFgDSmQsjUSAE4lP/Q4FY8M+mgAIKKKCAAgp0WeBfwMe9G6DLU2jsuQlYAMhtRs2nqwILVxf+W3Q1AeNWQAEFFFBAAQWmIXA6sDtws0IKKNCugAWAdv0dXYEQ2Bn4KvACORRQQAEFFFBAgUwFHgA+DPwg0/xMS4FOCFgA6MQ0GWSmAvNXt8RtmWl+pqWAAgoooIACCkwp8GtgF+B2aRRQYPQCFgBGb+6ICoTAZsCRQNz6b1NAAQUUUEABBUoSiG0C45GAn5eUtLkqkIKABYAUZsEYShKYCzik+k+vpLzNVQEFFFBAAQUUmFLgaOC9wEPSKKDAaAQsAIzG2VEUCIE1gaOA5eRQQAEFFFBAAQUU+LfAjcBOwHl6KKBA8wIWAJo3dgQFZgY+AXwSmFEOBRRQQAEFFFBAgf8SeAb4FrA38IQ2CijQnIAFgOZs7VmBEHgZELe3rSKHAgoooIACCiigwHQF/gLsAPxJJwUUaEbAAkAzrvaqQPxsfRT4PDCLHAoooIACCiiggAI9CcQdAPsBXwPizgCbAgrUKGABoEZMu1KgEojt/X4EvF4RBRRQQAEFFFBAgYEEzgbe6XaBA9l5kgLTFLAA4ItDgXoFNqxu+Xd7v3pd7U0BBRRQQAEFyhO4q1og8NflpW7GCjQjYAGgGVd7LU9gpmqRv08BM5SXvhkroIACCiiggAKNCIwtEPgxYFIjI9ipAgUJWAAoaLJNtTGBJYGfAGs1NoIdK6CAAgoooIACZQv8EXg7cH3ZDGavwHACFgCG8/NsBd4KHAHMLYUCCiiggAIKKKBAowIPAnsCP250FDtXIGMBCwAZT66pNSowG3Ag8IFGR7FzBRRQQAEFFFBAgSkFYovlKAQ8LI0CCvQnYAGgPy+PViAEVgZ+CrxYDgUUUEABBRRQQIFWBK4DtgWubGV0B1WgowIWADo6cYbdmkBsR3MoMHtrETiwAgoooIACCiigQAg8DuwDfEMOBRToTcACQG9OHqXArMC3gF2lUEABBRRQQAEFFEhKIB4JeA/waFJRGYwCCQpYAEhwUgwpOYHlgROBFZOLzIAUUEABBRRQQAEFQuBa4C3Vd0UUUGAaAhYAfGkoMH2BLYAfucq/LxMFFFBAAQUUUCB5gYeAXYATko/UABVoScACQEvwDpu8wEzAF4C9AX9Okp8uA1RAAQUUUEABBf4jcDjwPuBJTRRQ4L8FvLDxFaHAcwUWBY4D1hZHAQUUUEABBRRQoJMClwJbAzd1MnqDVqAhAQsADcHabWcF1gd+AizU2QwMXAEFFFBAAQUUUCAE7gG2A86UQwEFnhWwAOArQYH/+1nYF/g8MIMoCiiggAIKKKCAAlkIPA18AjgYeCaLjExCgSEELAAMgeep2QjMCfwQeGs2GZmIAgoooIACCiigwHiB44GdgUdkUaBkAQsAJc++uYfA4sDPgFfKoYACCiiggAIKKJC1wFXAlsANWWdpcgpMR8ACgC+PkgXWA6IavEDJCOaugAIKKKCAAgoUJHAvsC1wdkE5m6oC/xGwAOCLoVSB3YFvAzOXCmDeCiiggAIKKKBAoQJj6wIcVGj+pl2wgAWAgie/0NRnBQ4Fdio0f9NWQAEFFFBAAQUUeFbgWGBX4FFBFChFwAJAKTNtniGwGHAysLocCiiggAIKKKCAAgoAVwBvBm5SQ4ESBCwAlDDL5hgC6wIn+Ly/LwYFFFBAAQUUUECBKQTuBLYGLlBGgdwFLADkPsPmFwKx5Uvc9v88ORRQQAEFFFBAAQUUmIrAU8D7gcPUUSBnAQsAOc+uucXre//qSw0FFFBAAQUUUEABBSYS+CbwIWDyRAf69wp0UcACQBdnzZh7EZgDOKba67WX4z1GAQUUUEABBRRQQIEQ+BmwvYsD+mLIUcACQI6zak6LAL8AVpNCAQUUUEABBRRQQIEBBK4ENgduHuBcT1EgWQELAMlOjYENKLAS8EtgiQHP9zQFFFBAAQUUUEABBULgNuBNwGVyKJCLgAWAXGbSPEIgtnA5Gojb/20KKKCAAgoooIACCgwr8Ej1OMDPh+3I8xVIQcACQAqzYAx1CHwQ+CowQx2d2YcCCiiggAIKKKCAApXAM8DngM8ookDXBSwAdH0GjT+29ovtWt4lhQIKKKCAAgoooIACDQocCewBPNngGHatQKMCFgAa5bXzhgXmBE4AXtfwOHavgAIKKKCAAgoooEAI/AbYCnhQDgW6KGABoIuzZswhsDBwKrCKHAoooIACCiiggAIKjFDgz8DrgVtGOKZDKVCLgAWAWhjtZMQCKwC/BpYc8bgOp4ACCiiggAIKKKBACNxYFQGulUOBLglYAOjSbBlrCLwa+BUwnxwKKKCAAgoooIACCrQocD+wBXBBizE4tAJ9CVgA6IvLg1sWiG3+fgzM1nIcDq+AAgoooIACCiigQAg8AewIHCeHAl0QsADQhVkyxhD4APA1t/nzxaCAAgoooIACCiiQmEBsE7g3cEhicRmOAs8RsADgiyJ1gXiN7l99pR6r8SmggAIKKKCAAgqUK/BN4EPA5HIJzDx1AQsAqc9Q2fE9D/gh8I6yGcxeAQUUUEABBRRQoCMCJwI7AI93JF7DLEzAAkBhE96hdOcATgI27VDMhqqAAgoooIACCiigwLnV4oAPSaFAagIWAFKbEeMJgXmAU4C15FBAAQUUUEABBRRQoIMCl1bbBN7TwdgNOWMBCwAZT25HU1sIOANYsaPxG7YCCiiggAIKKKCAAiFwDbAJcKscCqQiYAEglZkwjhBYCjgLWE4OBRRQQAEFFFBAAQUyELgR2Bi4PoNcTCEDAQsAGUxiJim8FDgTWDSTfExDAQUUUEABBRRQQIEQuKNa1+oqORRoW8ACQNsz4PghsDpwGjCfHAoooIACCiiggAIKZChwP/BG4OIMczOlDglYAOjQZGUa6vrAL4C5Ms3PtBRQQAEFFFBAAQUUCIFHgK2qu14VUaAVAQsArbA7aCWwBfBTYFZFFFBAAQUUUEABBRQoQGASsB1wYgG5mmKCAhYAEpyUQkLaCfg+MGMh+ZqmAgoooIACCiiggAIh8DSwC/A/cigwagELAKMWd7wQ2BX4HjCDHAoooIACCiiggAIKFCjwDPB+4DsF5m7KLQpYAGgRv9Ch3w1814v/QmfftBVQQAEFFFBAAQXGBKIIsBfwTUkUGJWABYBRSTtOCOxRVTl93fl6UEABBRRQQAEFFFAAogjwYeDrYigwCgEvxEah7Bgh8FHgy1IooIACCiiggAIKKKDAcwQ+BXxBFwWaFrAA0LSw/YfAx4EDpVBAAQUUUEABBRRQQIFpCnwG+Kw+CjQpYAGgSV379uLf14ACCiiggAIKKKCAAr0LHATs0/vhHqlAfwIWAPrz8uj+BD4HxO1MNgUUUEABBRRQQAEFFOhNIB6b3bu3Qz1Kgf4ELAD05+XRvQt8Ediv98M9UgEFFFBAAQUUUEABBSqBr1ZraMUigTYFahOwAFAbpR2NEzjAW5d8PSiggAIKKKCAAgooMJRA7AzwoaF68GQFphCwAOBLom4BP/mvW9T+FFBAAQUUUEABBUoV+Ep1J0Cp+Zt3zQIWAGoGLby7WLX004UbmL4CCiiggAIKKKCAAnUKxHvs2CHApsDQAhYAhia0g0rgo0AsWGJTQAEFFFBAAQUUUECBegU+CcSdtjYFhhKwADAUnydXAvFsUixUYlNAAQUUUEABBRRQQIFmBPYFDmyma3stRcACQCkz3VyeHwRigRKbAgoooIACCiiggAIKNCsQ2wN6122zxln3bgEg6+ltPLldgcMBX0eNUzuAAgoooIACCiiggALEtoDvA76rhQKDCHjhNoia54TAzsARwAxyKKCAAgoooIACCiigwMgEogiwJ3DYyEZ0oGwELABkM5UjTWQn4Egv/kdq7mAKKKCAAgoooIACCowJTAbeBRwliQL9CFgA6EfLY0NgS+AEYCY5FFBAAQUUUEABBRRQoDWBp4G3V+/NWwvCgbslYAGgW/PVdrQbAqcCs7QdiOMroIACCiiggAIKKKAAk4A3AWdooUAvAhYAelHymBB4FXA2MKccCiiggAIKKKCAAgookIzAo8AmwEXJRGQgyQpYAEh2apIK7OXAecC8SUVlMAoooIACCiiggAIKKBAC/wLWB/4khwLTE7AA4OtjIoFlgQuAhSc60L9XQAEFFFBAAQUUUECB1gRuA9YBbmgtAgdOXsACQPJT1GqAiwAXAku3GoWDK6CAAgoooIACCiigQC8C/wBeA9zey8EeU56ABYDy5rzXjOcGzgVW7vUEj1NAAQUUUEABBRRQQIHWBf4CrAfc13okBpCcgAWA5KYkiYBmB84E1k4iGoNQQAEFFFBAAQUUUECBfgR+D2wEPNzPSR6bv4AFgPznuN8MY4u/U6p/MPo91+MVUEABBRRQQAEFFFAgDYH4QG9z+PdWgTYF/i1gAcAXwniBeD38D7CDLAoooIACCiiggAIKKNB5gZ8C2wGTO5+JCdQiYAGgFsZsOjkE+Eg22ZiIAgoooIACCiiggAIKHAx8XAYFQsACgK+DMYE9gO/KoYACCiiggAIKKKCAAtkJ7AV8I7usTKhvAQsAfZNlecKbgJOBGbPMzqQUUEABBRRQQAEFFChbIB4B2AY4qWwGs7cA4Gsg9gmNBUJmlUIBBRRQQAEFFFBAAQWyFXgc2Bi4MNsMTWxCAQsAExJlfcBLgQuAebPO0uQUUEABBRRQQAEFFFAgBO6rtvq+To4yBSwAlDnvkfUiwMXAkuUSmLkCCiiggAIKKKCAAsUJ3AKsCcR3W2ECFgAKm/Aq3bmA84GVy0zfrBVQQAEFFFBAAQUUKFrgz0A8CvxA0QoFJm8BoLxJfx5wKrBReambsQIKKKCAAgoooIACClQCsQ7YG4EnFSlHwAJAOXM9lun3gN3LS9uMFVBAAQUUUEABBRRQYAqBHwI7q1KOgAWAcuY6Mt0HOKCslM1WAQUUUEABBRRQQAEFpiPwMeAQhcoQsABQxjxHlm8GTgRmKCdlM1VAAQUUUEABBRRQQIEJBCYDbwF+rlT+AhYA8p/jyHCVaru/OcpI1ywVUEABBRRQQAEFFFCgD4HHgPWAS/s4x0M7KGABoIOT1mfICwN/ABbr8zwPV0ABBRRQQAEFFFBAgXIEbgNe5faAeU+4BYC853c24LfAGnmnaXYKKKCAAgoooIACCihQg8DlwLrAIzX0ZRcJClgASHBSagopnvU/Cdiypv7sRgEFFFBAAQUUUEABBfIXOBnYGoi1AWyZCVgAyGxCx6VzMBAretoUUEABBRRQQAEFFFBAgX4EDgT27ecEj+2GgAWAbsxTv1HuBMSenjYFFFBAAQUUUEABBRRQYBCBdwOHD3Ki56QrYAEg3bkZNLJ4Zucs4HmDduB5CiiggAIKKKC+G1QXAAAgAElEQVSAAgooULzAJGBD4MLiJTICsACQ0WQCS1RbdyyQV1pmo4ACCiiggAIKKKCAAi0I3AmsDtzcwtgO2YCABYAGUFvqclbg/OoHtKUQHFYBBRRQQAEFFFBAAQUyE7gCWAd4NLO8ikzHAkA+0/4D4F35pGMmCiiggAIKKKCAAgookIjAMcAOicRiGEMIWAAYAi+hUz8KfDmheAxFAQUUUEABBRRQQAEF8hLYC/hGXimVl40FgO7PeSzMcTowU/dTMQMFFFBAAQUUUEABBRRIVOBp4A3AGYnGZ1g9CFgA6AEp4UOWqhb9my/hGA1NAQUUUEABBRRQQAEF8hC4r1pz7H/zSKe8LCwAdHfO5wQuBl7R3RSMXAEFFFBAAQUUUEABBTomcCWwNvBIx+I2XMACQDdfBjFvPwW26Wb4Rq2AAgoooIACCiiggAIdFjgZeCvwTIdzKDJ0CwDdnPb9gC92M3SjVkABBRRQQAEFFFBAgQwE9nYh8u7NogWA7s3ZBsCZwIzdC92IFVBAAQUUUEABBRRQIBOBycDrgLMyyaeINCwAdGuaFwMuB+bvVthGq4ACCiiggAIKKKCAAhkK3AWsCtyaYW5ZpmQBoDvTOjNwDrBOd0I2UgUUUEABBRRQQAEFFMhc4BJgPeDJzPPMIj0LAN2Zxq8DH+xOuEaqgAIKKKCAAgoooIAChQh8GYg1AWyJC1gASHyCqvC2AH7mrg3dmCyjVEABBRRQQAEFFFCgMIHYDSB2BYjdAWwJC1gASHhyqtCWBy4FXpB+qEaogAIKKKCAAgoooIAChQo8BKwO/LXQ/DuRtgWAtKdpVuBiYJW0wzQ6BRRQQAEFFFBAAQUUUICrgDWBR7VIU8ACQJrzMhbVD4Gd0g7R6BRQQAEFFFBAAQUUUECB/wh8H9hNjzQFLACkOS8R1e7A99INz8gUUEABBRRQQAEFFFBAgakK7AzEh5m2xAQsACQ2IVU4cct/3PofjwDYFFBAAQUUUEABBRRQQIEuCcQjAPEoQDwSYEtIwAJAQpNRhTIH8EfgJemFZkQKKKCAAgoooIACCiigQE8CfwdWBR7u6WgPGomABYCRMPc1yI+AHfs6w4MVUEABBRRQQAEFFFBAgfQEXA8gsTmxAJDWhGwDHJdWSEajgAIKKKCAAgoooIACCgws8A7g2IHP9sRaBSwA1Mo5VGfLAFcAzx+qF09WQAEFFFBAAQUUUEABBdIReKDa1vyGdEIqNxILAGnM/czA+cCr0wjHKBRQQAEFFFBAAQUUUECB2gQuBdYGnqytRzsaSMACwEBstZ90MPCx2nu1wxIF4h/Va4FYdCW+7gTuHff11FRQXgDMCcxVfc0NLAQsCSwOLAHMXyKmOSuggAIKKNAxgVhs7Sbgn8DN1fuAh4D4BDa+4u/j948A84zLbQZgPuCF1Ve8D1geeBGwWMcMDDddgQOA/dINr4zILAC0P8+bAqcB8Q+vTYFBBeI/9DcCfwAeG7ST6Zw327iCwMuAVwArAfFrt6tsANwuFVBAAQUUmIZAFPuvq7ZXiy3WovAfF/1xwX9/A2oLAusBPwFmbKB/uyxHYDKwCfCbclJOL1MLAO3OSfyDeiUQ320KDCMQu0e8a5gOBjw33gjEpwNREFi5+h6PssSnCDYFFFBAAQUUGE4gPrWP4n68X/xzddF/DTBpuG4HOvtU4PUDnelJCvyfwO3Vh0h3i9KOgAWAdtxj1LD/FfCG9kJw5IwE1gUuSCifWNRyI2AdIGKLxwlsCiiggAIKKDB9gbuqC/4LgYuA3yf0zPTWwPFOoAI1CJxeFZOeqaEvu+hTwAJAn2A1Hv5R4Ms19mdX5QpcX30Kn/I/ossBr6luIYzvUSCwKaCAAgooULpAPKsfC0HHVxTy49b+VNsswK3VGgGpxmhc3RH4EPD17oSbT6QWANqZy3hu+o8+O90OfoajfhL4YsfyWhrYuLpL4HXV4oMdS8FwFVBAAQUU6FvgcSA+3T+7uhM0bufvUvsm8P4uBWysyQo8AaxRPdaSbJA5BmYBYPSzGtXTeJZrxdEP7YgZCjwNxMV0LPzT1RYLDMbiQm8CtgQW7moixq2AAgoooMBUBO4AfgH8Evgt8GiHlVYBLu9w/IaelsCfgFe1tKZFWhIjjMYCwAixq6Hc8m/05jmPeAYQn6Dn0mI3jPiP4M3AVsCyuSRmHgoooIACRQncAJwM/Ay4BIjVz3NpV1QL/+aSj3m0K3AgsG+7IZQ1ugWA0c53LIZ2rlv+jRY989HeCRydcY6x1eDbgbcBS2Wcp6kpoIACCnRfIJ7nPw44FoiL5FzbR4BDck3OvEYuEHezxp2gseilbQQCFgBGgFwNMWf1n0EshmZToA6BeI4wtpB8sI7OOtBHrJ2xAxBFDx8T6MCEGaICCihQgMB9QGyPd1S1t3nKC/LWNR2LVI8exl17NgXqEIg7ZuJDn4fq6Mw+pi9gAWB0r5AjgZ1HN5wjFSBwIhBb8pTWZgQ2AXYCtgBiXQ2bAgoooIACoxKYVC3g90MgHsV7alQDJzTOedU2vwmFZCgdF/g+sFvHc+hE+BYARjNNcZHy89EM5SgFCbyler6woJSfk+rcwDbVXQFrlwxh7goooIACjQvEiv3xSX9c+N/V+GhpD/Ae4NC0QzS6Dgq8FTipg3F3KmQLAM1P1wLAn4H4blOgLoG47X8h4LG6Osygn1dUleN4ROAFGeRjCgoooIAC7QvE/7fHAEcAsWK57VmB+YDbgJkFUaBGgTurndJKL7DVSPrcriwANMr7787jNu34pNamQJ0C8QnEjnV2mFFfswKbAx8EvCsgo4k1FQUUUGCEAtcC3wPiEc6HRzhul4Y6DdisSwEbaycEYrvMuHva1pCABYCGYKtu45n/+I/DpkDdAnGBe0rdnWbY32pA3KYYOwnMnmF+pqSAAgooUJ9A3FUXq/gfBvy+vm6z7Sk+iPhRttmZWJsCcQ0Vj9rYGhCwANAAatVlrJB6NRDPKNsUqFMgPomYH4hdAGy9CcQjAbFo4IeBJXo7xaMUUEABBQoRiNuO46L/28A9heRcR5rzAmE3Ux2d2YcC4wTi0ZuXV7tNCFOzgAWAmkHHdedtUc3Zlt7z8cDbSkcYMP/YsugNwAeAjQbsw9MUUEABBfIQuKK68I/H6iyqDzanvwE2GOxUz1JgugJxLRXv2Ww1C1gAqBm06s5boppxtddnBbYDfiLG0AKvAj5UrdHhpxdDc9qBAgoo0AmBycDPgK8DF3Yi4rSDfD/wzbRDNLoOC8TCzkd3OP4kQ7cAUP+0LFzd+j9P/V3bowI8We0o8S8tahNYqioE7Oo6AbWZ2pECCiiQmsCk6vn+LwHXpRZch+NZtLpN22uKDk9iwqHH+914FODWhGPsXGj+sNY/ZScDb66/W3tU4N8CZwCv06IRgVhX4b1AfJoRzzXaFFBAAQW6L/BQtZjYwV5ENDaZfwRe2Vjvdly6wK+AN5WOUGf+FgDq1Hx2pXFvza7X1N7+W2BP4FBRGhWYE9itWjBwsUZHsnMFFFBAgaYEbq9u84/F/WJBMVtzAp8EPt9c9/aswL/Xvoo1sGw1CFgAqAGx6mK+6tb/Berr0p4UeI7AMsANuoxE4HnAtsCngWVHMqKDKKCAAgoMK3AX8NXqufTY1s/WvMCqwGXND+MIBQvE7hwvA+Ln2zakgAWAIQHHnX4C8Nb6urMnBZ4jEM8srqDLyAVm5tm7ez4FLDfy0R1QAQUUUKAXgdiO7mte+PdCVfsxcT0Rz2jHOlg2BZoS+Gn1fqyp/ovp1wJAPVO9BfDzerqyFwWmKRArFseq9bZ2BMYKAXGr4/LthOCoCiiggAJTCNwMfAX4nlv5tfra+BEQu2DZFGhS4C1ArLdmG0LAAsAQeNWpL6xu/V9w+K7sQYHpCmwGnK5R6wKxZeAOwP7Akq1HYwAKKKBAmQLxifMXgB8AscK/rV2BeGTu2HZDcPQCBGJtj3gU4P4Ccm0sRQsAw9Na8Rze0B4mFojnGKPY5POME1uN6ohYI2B34BPAQqMa1HEUUECBwgXiWeADge/6f2JSr4R4jxKPYcyYVFQGk6PAkUBs3WwbUMACwIBw1WnrA78BdBzO0bMnFnD7v4mN2jpijmrrwI+5fWBbU+C4CihQgECs5B+L+8Vz/q7qn+aEXwysmWZoRpWRwDPAesAFGeU00lS8cB2cexbgChdlGxzQM/sSiIvLQ/o6w4NHLRDbB74X2A94/qgHdzwFFFAgU4G4vT/utowdWeITZlu6ArEVYKyTY1OgaYG/AisBTzQ9UI79WwAYfFbj+d/PDH66ZyrQl8AawKV9neHBbQnEVqDxRjUeD4iFA20KKKCAAv0LPF1d+Mf7rXje35a+wIbA2emHaYSZCMTuTLEOiK1PAQsAfYJVh8cK4FcBsw52umcp0JfAA9Xz//FmyNYdgRdV/zHF9qD+W9udeTNSBRRoXyAuIj8KXNl+KEbQh8Bs1eJscZesTYGmBeLT/7gLIO4GsPUh4JvSPrCqQ8PsLCCqnDYFRiFwCrD5KAZyjEYEXlU9vrFOI73bqQIKKJCPwDXAx4H4f8/WTYHzgdd0M3Sj7qDAb4ENgFgXwNajgAWAHqHGHbYT8MP+T/MMBQYWiE9BYo9jW7cFoogTi1ct2+00jF4BBRSoXSBu8f8cEKt7e7db7bwj7TDmMW7NtikwKoHtgR+ParAcxrEA0N8sxhYn1wHz9XeaRyswlMBqwGVD9eDJqQjE1oHvq94czZ1KUMahgAIKtCTwSLWlX6zu/2hLMThsvQLxaWzskGVTYFQCd1WLst83qgG7Po4FgP5m8AfAu/o7xaMVGEog3hzFheJTQ/XiyakJzAvEwlaxa4B7Jqc2O8ajgAJNC8TtuicCscPNTU0PZv8jFYh1AGLtIhfBHSl78YMdUS2+XDxELwAWAHpRevaYdYF4zkSz3s08cniBc6tnm4bvyR5SFFgZ+Eb170uK8RmTAgooULfA5cAHgQvr7tj+khH4I/DKZKIxkBIEoqgY67PF+2bbBAJezPb2Eonbdv9U3V7S2xkepUA9AgcC+9bTlb0kLLAN8GVgiYRjNDQFFFBgGIE7gE9UW/tNHqYjz01e4NvVHW7JB2qAWQlcDawCPJlVVg0kYwGgN9S4Re3g3g71KAVqFdgS+EWtPdpZqgJx2+Te1dfsqQZpXMkIPDTu0aD7x0UVjw1Nqn4fjw7FcWPtwXELrMX2SdHGtuuK23XnHHdsPHo09h5hDiAK4dHie/x+7Fxfq8m8JJINJF6PcadT7Ncdr0Fb/gLbAcfkn6YZJijwESDWFLFNR8ACwMQvj0Wqhf/mmvhQj1CgdoGFgDtr79UOUxaIuwBit4CtUg7S2AYWiAvy+CQ0FiuKX/8LeHjcV/w+/nzsz+KCKZ6njd+P/Xkck0qbAXgB8PyqgBD/V0YhYZ7qe/w6vsYfE7+P46LIEIvrLjCuqJBKXsZRj8CZwPuBv9XTnb10RCB2u7m+I7EaZl4C8X/mi6v/Z/PKrMZsLABMjBkVzKhk2hQYtcANwDKjHtTxkhHYDPiW2wYmMx/TCmTsgv4e4G4gvscF/rR+P/bJe/KJjTjAuANmfmDBqiAQu+3E76MIOvbrsb+P73G8LV2B2Nbvw8Dx6YZoZA0LxIcXUdyzKTBqgaOAHUc9aJfGswAw/dl6DXCeC/916SWdVawnAPFsuK1cgVmBfYCPA/Fr22gF4g3szcA/q++xWnn8Pr7iAicu+L2gH+2cjI0WjyHExcWi1doZcefM4tWvl6x+7Vabo5+beOwkCpexy8n4x09GH4kjti1wKvD6toNw/CIFYkHAdYCLi8y+h6QtAEwbKbbmilVMY5VumwJtCOwHHNDGwI6ZnEDcTvlN30zVOi9x4R4X8bcDtwH/W32N/T5uWfYCplbykXcWRbN4jC/upIrvC1e/Hvv9UoBrGNQ3LfGeaY/qvVN9vdpTVwW+CMT7GJsCbQhcAaw+bt2bNmJIdkwLANOemtifO1YxtSnQlkBUzn/d1uCOm6TAW4CvA4slGV16QcXiY/8A/lo9gxwX9fEVv78rvXCNaMQCsX5B3DXwouornhuNr+WBuIsg/t42sUA87hJ3Kv0AiE/ebAqEwFuBuJPRpkBbAu8BvtfW4CmPawFg6rMTzxvGG8R5U548Y8teID6xik8jbQqMF4gF1D5b7aMddyqV3uKCI27JH7u4H7vA/ztwo9X/0l8eA+cfuyOMFQaiIBC/fkn1PRYutD17sf8jIHZKulcQBaYQWA6If4dtCrQlEP8uxb/dseiubZyABYCpvxyiWrS7rxQFWhSIRcTidlWbAtMSeCVwRLXnbQlKcbERt+lfWX1dU725jAv+x0oAMMdkBKIAEEWBKAisUD0quFK1gGEyQTYcSKzw/m7gnIbHsfvuCsQ1RuxYEjuE2BRoS+BQYM+2Bk91XAsAz52ZeFP9B2/9S/UlW0xcpwOxCrxNgekJzAR8CPhMZs8yPwpcDfyp+roKiC/3EPfnIWWB2LEgCgGxdlB8j6/49Cl+TnNpTwJfAT5n4S2XKW00j/OBWFDbpkBbAk8Dq1XvJdqKIblxLQD895SER6wY+erkZsqAShM4pLqtsrS8zXcwgaWBqHJvOtjprZ51PxCf5l827us6b91vdU4cvD6BmasiQHy4EF8vrQoE8ahh11oU5HZzkb+uTVur8X63Whiy1SAcvHiBuLaLXQFco6R6KVgA+O+fiR2A2DvSpkDbArsCR7YdhON3TiD+DftqtW96isHHwnu/Ay6pLiLidv7YSs+mQEkC8d4rinZxp8CqwFrVatWxvkeK7RHgU9VOJPFpmk2BXgXeX71uej3e4xRoSuAdwLFNdd61fi0A/N+MzVYt/BcrAtsUaFsgKpUXtR2E43dSID5ZjCJAFAPabLEfeFzgx8X+2EV/PMNvU0CB5wrEgp4vB9as7kKMOxHj8YG236fFTjTx/GwsqGlToF+BDYGz+z3J4xVoQOCmat2Wxxvou3Ndtv0fS0pgnwQ+n1JAxlK0QFzEuapy0S+BoZN/HXB4tc3Z0J310EEsXBn7gMet/BdWj1PFs/w2BRQYTCAWT1ujunU1Hh+IOwVGtTvRA8De1b8hg0XvWQpA7GZ0qxAKJCIQ25UelEgsrYZhAeBZ/gWr1aTnanU2HFyBZwXuBGIxKZsCwwrMXS3YtfOwHU1xfny6f8UUn+77CWHNyHanwBQCcZdArCEQdweM3SkQuxDU3U6pVvi/re6O7a9IgVjnJf4vsinQtkAUNmMHl+IfPbQA8OxL0W3/2v6RdPzxAucBr5VEgRoFhr0bIBbO+Uu15ddvgHiNuiJ/jRNkVwoMKBDF4g3GfcXaAoO2uFDby7WQBuXzvGkIxGNgLq7tyyMVgViY8r2pBNNWHBYAnt3DN7aXymmbnrZeT45bj8APgF3q6cpeFPiPQNxO/OVqFe9e/u2P5/VjHYq4nf804BYtFVAgeYG45XptYKNqK9le1zWKZ/139+c8+fntYoDHANt1MXBjzlIgFjKNLVpjq+FiWy9vAnPHif3Wu7h1Vu7zUnJ+sdryF0oGMPdGBdatdphYbopR4tGT2LM5Fmw6C7ih0SjsXAEFRiGwTFUMiIJALMg25RoCPus/ilkoe4xYXyvW2bIpkIrAqcAbUwmmjThKLwBsApzRBrxjKjAdge2BHyukQIMCsd5JLIQTtw+fA8Rt/dc2OJ5dK6BA+wKxhkBsOxiPDEQx4OHqVtjb2w/NCDIWeBcQdzbaFEhJIIqi8d6nyFZyASD+I4xFrF5R5MybdMoCsbhTbJtmU0ABBRRQQAEFuiwQaxqd2+UEjD1LgdimOHZXiUcCimslFwB2c3ub4l7vXUk4dqW4qyvBGqcCCiiggAIKKDANgSWA2IPdpkBqArHeVpF3p5RaAJgT+BuwcGqvROMpXuBxYHYgVl23KaCAAgoooIACXRaIO27jvY2LbXd5FvOMPbY6fRHwSJ7pTTurUgsA+wOfKW2yzbcTArHy+rKdiNQgFVBAAQUUUECBiQViF5lFJz7MIxQYuUAsUPnFkY/a8oAlFgDmA/4BxJZYNgVSE7gAiFXabQoooIACCiigQA4CvwfWyCERc8hOIHZCiQ/e7s0us+kkVGIB4CvAh0uaZHPtlMBxwLadithgFVBAAQUUUECBaQucDLxZIAUSFTgY+HiisTUSVmkFgEWA64HZGtG0UwWGF/iaBarhEe1BAQUUUEABBZIR+Ha15WQyARmIAuMEYo2K5YF4VKWIVloB4HAgVv+3KZCqwD7V/uypxmdcCiiggAIKKKBAPwL7lficdT9AHtu6wGHAHq1HMaIASioAxCqPV7sK6YheWQ4zqMDuwBGDnux5CiiggAIKKKBAYgJxYfXdxGIyHAXGCzwJvLS6Uzx7mZIKAMcDW2c/oybYdYFtgBO6noTxK6CAAgoooIAClcDbgZ+ooUDiAvEa3S7xGGsJr5QCwErA5cAMtajZiQLNCWwCnNVc9/asgAIKKKCAAgqMVGAz4LSRjuhgCvQvMBl4JfCn/k/t1hmlFABOBzbt1tQYbaECsU3OpYXmbtoKKKCAAgookJ/Aq4FL8kvLjDIUOAXYPMO8/iulEgoArwHOz30izS8bgVir4u/ZZGMiCiiggAIKKFC6wEuAa0tHMP/OCLwWOK8z0Q4QaAkFgIuAtQaw8RQF2hBYELirjYEdUwEFFFBAAQUUaEBgIeD2Bvq1SwWaEIgPjtdrouNU+sy9AOAzR6m80oyjV4FZgEm9HuxxCiiggAIKKKBA4gLx3ib2Wrcp0BWBjYDfdCXYfuPMvQBwIbB2vyger0BLAo8Ac7Y0tsMqoIACCiiggAJNCTwGzNpU5/arQM0CF+d8DZlzASAW/YvF/2wKdEXgVmCxrgRrnAoooIACCiigQI8CtwEL93ishymQgsCGwDkpBFJ3DDkXAHz2v+5Xi/01LRAL5Ly06UHsXwEFFFBAAQUUGLHANcAKIx7T4RQYRiDbtQByLQBsDJw5zIx7rgItCMS+o6u0MK5DKqCAAgoooIACTQpcAazc5AD2rUADAusDv22g31a7zLUAEBWb2P7PpkCXBC4DVutSwMaqgAIKKKCAAgr0IBDvcVbt4TgPUSAlgbijfJ2UAqojlhwLALFq41l14NiHAiMWuBRYY8RjOpwCCiiggAIKKNC0wB+A1ZsexP4VaEDgtcB5DfTbWpc5FgBigtZtTdSBFRhc4HfAmoOf7pkKKKCAAgoooECSApcAr04yMoNSYPoC5wIb5ISUWwEgJifbPRtzeuGZy1QFst5yxDlXQAEFFFBAgWIFXJy72KnPIvH1gHjEPIuWWwEgFmmICbIp0EWBC7x7pYvTZswKKKCAAgooMIGA63P5EumyQHzAHI+ZZ9FyKgDE8xlxi4ZNga4KxOMr8Tq2KaCAAgoooIACOQn4IV1Os1lmLtncBZBTAeBsYMMyX49mnYnAOb6GM5lJ01BAAQUUUECB8QLxCWpWz1E7vcUJnAG8LoescykAxL6ilwO55JPDa8sc+heI3Ss26f80z1BAAQUUUEABBZIWiPc42dxCnbS0wTUp8MrqmrPJMRrvO5cL5uOBrRvXcgAFmhWwANCsr70roIACCiigQDsCpwObtjO0oypQm8BPgbfX1ltLHeVQAFgW+CswY0uGDqtAXQIuAliXpP0ooIACCiigQEoCbtOd0mwYy6ACTwMvAa4ftIMUzsuhAHA4sFsKmMagwJAC8RhL3FpkU0ABBRRQQAEFchK4FFgtp4TMpViBQ4E9u5x91wsACwI3ArN2eRKMXYFKIO5kiaqiTQEFFFBAAQUUyEngGmCFnBIyl2IFHgeWAW7vqkDXCwAHAXt3Fd+4FZhC4BZgcVUUUEABBRRQQIHMBG4ClsgsJ9MpV+BLwCe6mn6XCwDPB+Ifk7m7im/cCkwhcD8wryoKKKCAAgoooEBmAncD82WWk+mUK/AAsCQQ3zvXulwA2Ac4oHPiBqzAtAWe8HEWXx4KKKCAAgookKHAo8BsGeZlSuUKfAw4pIvpd7UAMAtwA7BwF9GNWYHpCMwMPKWQAgoooIACCiiQiUBcb8Tq6V297shkGkyjZoE7gKWBWBOgU62rP4jvAWIFRpsCuQm8AHgwt6TMRwEFFFBAAQWKFZgDeLjY7E08Z4HYie77XUuwiwWAGYDrgOW7hm28CvQgsBhwaw/HeYgCCiiggAIKKNAFgQWAO7sQqDEq0KdAXJO+FHimz/NaPbyLBYDNgV+2qubgCjQnsDJwZXPd27MCCiiggAIKKDBSgbhAunqkIzqYAqMTeANw2uiGG36kLhYAzgY2HD51e1AgSYFNgTOTjMygFFBAAQUUUECB/gXWB87p/zTPUKATAvG+Pd6/d6Z1rQDwcuAqFxHpzOvLQPsXeCdwdP+neYYCCiiggAIKKJCkwNuBnyQZmUEpUI/AStU1aj29NdxL1woAscjCLg2b2L0CbQp0dkuRNtEcWwEFFFBAAQWSFdgL+Fqy0RmYAsMLHA68e/huRtNDlwoA8wM3uYfoaF4YjtKaQOwnGkUAmwIKKKCAAgookIPAAcA+OSRiDgpMQ+AxYAngni4IdakA8Cngc11ANUYFhhA4BthhiPM9VQEFFFBAAQUUSEngB8C7UgrIWBRoQOATwJca6Lf2LrtSAJgZuAFYtHYBO1QgLYGzgE3SCsloFFBAAQUUUECBgQVihfTNBj7bExXohsBtwNLApNTD7UoBYHsXRkv9pWR8NQnEIpexkIhNAQUUUEABBRTIQeAyYNUcEjEHBSYQiGvWH6eu1JUCwB+A1VPHND4FahC4F5ivhn7sQgEFFFBAAQUUSEHgdmChFAIxBgUaFrgUWKPhMYbuvgsFgHWAC4bO1A4U6I7AvMD93QnXSBVQQAEFFFBAgakKzAk86BbevjoKEohr14tSzrcLBYDjga1TRjQ2BemsR28AACAASURBVGoWiLtd/lhzn3angAIKKKCAAgqMWmBF4MpRD+p4CrQocAKwTYvjTzh06gWAhaut/2IRQJsCpQhsCxxXSrLmqYACCiiggALZCmwFnJRtdiamwHMFngKWAm5NFSf1AsCngc+mimdcCjQk0JltRBrK324VUEABBRRQIA+BjwEH55GKWSjQs0Bcw36+56NHfGDKBYAZgX8AS47YxOEUaFsg9svdpe0gHF8BBRRQQAEFFBhS4DDg3UP24ekKdE3g5mpLwKdTDDzlAsCWwM9SRDMmBRoWOB9Yr+Ex7F4BBRRQQAEFFGha4Gxgw6YHsX8FEhTYAvhlgnGRcgHgdGDTFNGMSYGGBW4DFm14DLtXQAEFFFBAAQWaFriheh666XHsX4HUBOJadrPUgop4Ui0ALAP8HZghRTRjUmAEAm4FOAJkh1BAAQUUUECBxgTmqLYA9P18Y8R2nLDAM8CLgOtTizHVAkAsFhKLhtgUKFXgtcB5pSZv3goooIACCijQeYE1gYs7n4UJKDC4wIHAvoOf3syZKRYAZgH+CSzQTMr2qkAnBD4IfLMTkRqkAgoooIACCijwXIH3AIcKo0DBAvcAiwFPpGSQYgFge+DolJCMRYEWBNwJoAV0h1RAAQUUUECB2gTi4j+KADYFShZ4B3BsSgApFgAuAtZKCclYFGhB4DJgtRbGdUgFFFBAAQUUUKAOgUuAV9fRkX0o0GGB5Hb3Sq0AsCJwZYcn2NAVqEsgbhWaE3iqrg7tRwEFFFBAAQUUGJFALPz3QPVeZkRDOowCyQq8AvhLKtGlVgD4NvDeVHCMQ4GWBV4GXNNyDA6vgAIKKKCAAgr0K7A88Ld+T/J4BTIViHW9Yn2vJFpKBYDnAbH/+QuTkDEIBdoXeBfwo/bDMAIFFFBAAQUUUKAvge2AY/o6w4MVyFfgXmDRVBYDTKkAsG1qCyTk+xo0s44IHAHs3pFYDVMBBRRQQAEFFBgT+A6wpxwKKPAfga2BE1PwSKkAcAawSQooxqBAIgJXAy9PJBbDUEABBRRQQAEFehW4Ali514M9ToECBE4D3pBCnqkUAOKWiJuAGVNAMQYFEhF4BpgPuC+ReAxDAQUUUEABBRSYSCAWMb4fmGmiA/17BQoSeBpYCril7ZxTKQB8AvhC2xiOr0CCAlEpjIqhTQEFFFBAAQUU6ILARsBZXQjUGBUYscA+wEEjHvM5w6VQAIgYYpXQ5drGcHwFEhSIwtinEozLkBRQQAEFFFBAgakJ7A98RhoFFHiOQFzzvgSIu3xbaykUANYFzmtNwIEVSFvgAiB+RmwKKKCAAgoooEAXBOLT/7gLwKaAAs8VWAe4qE2YFAoAPwR2ahPBsRVIWODJah2ABxOO0dAUUEABBRRQQIEQmLVau2g2ORRQYKoC3wd2a9Om7QJALBJyGzBXmwiOrUDiAm8ETk08RsNTQAEFFFBAAQU2BU6XQQEFpinwMLAwEN9baW0XAHYGjmwlcwdVoDsC3wD26k64RqqAAgoooIAChQocAnyk0NxNW4FeBXYEjur14LqPa7sAEM83x3MQNgUUmLbANcDLBFJAAQUUUEABBRIXuBJYMfEYDU+BtgVi/bvXthVEmwWAZYDrgTZjaMvdcRXoV2DxFPYN7Tdoj1dAAQUUUECBYgTituZbfW9fzHyb6OACsQvA0sBNg3cx+JltXnx/AogtzmwKKDCxwJ7AoRMf5hEKKKCAAgoooEArAu8GDmtlZAdVoHsC+wAHtRF2mwWAv3hbcxtT7pgdFTgDeF1HYzdsBRRQQAEFFMhf4DRgs/zTNEMFahGIx2VWrqWnPjtpqwAQyV7RZ6werkDJArEd4ALAv0pGMHcFFFBAAQUUSFIgdva6u9oGMMkADUqBBAVeAcSH4iNtbRUA4naHvUeaqYMp0H2BbYHjup+GGSiggAIKKKBAZgJbA8dnlpPpKNC0wBeBTzY9yJT9t1EAmAG4EYhFzWwKKNC7wAnANr0f7pEKKKCAAgoooMBIBI4F4oMKmwIK9C5wA7AsEIsCjqy1UQBYF4itD2wKKNCfwONArLDrYwD9uXm0AgoooIACCjQn8HzgdmD25oawZwWyFVgLuGSU2bVRAIjVQWOVUJsCCvQvsBvw/f5P8wwFFFBAAQUUUKARgV18b9KIq52WIfBt4P2jTHXUBYCZqwrhC0eZpGMpkJHA+cB6GeVjKgoooIACCijQbYHf+t6k2xNo9K0KxOKZiwBPjSqKURcANgd+OarkHEeBDAXiGaHlgP/NMDdTUkABBRRQQIFuCSxZvSeJNb5sCigwmEBsn3n6YKf2f9aoCwAuENL/HHmGAlMKfAr4giwKKKCAAgoooEDLAvGe5HMtx+DwCnRd4Chgx1ElMcoCQOwPegcwx6iScxwFMhX4K/CSTHMzLQUUUEABBRTojsB1wIu7E66RKpCkwEPAgsBjo4hulAWAtwE/HUVSjqFA5gKfAL6UeY6mp4ACCiiggALpC8R7Eu9KTH+ejDB9ga2An40izFEWAI4Hth5FUo6hQMYCRwK7ZpyfqSmggAIKKKBAtwRiFfP3ditko1UgOYEfA9uPIqpRFQBmBe4C5hpFUo6hQKYCvwbeNMpVQjN1NC0FFFBAAQUUqE9gRuAkYIv6urQnBYoTiMcAFgAebzrzURUAthzVLQ1Ng9m/Ai0JXF5tsfNwS+M7rAIKKKCAAgooMC2B2YFzgFdJpIACAwu8ETh14LN7PHFUBYCjR3VLQ495e5gCXRK4BVgTiO82BRRQQAEFFFAgRYH5gYur7YpTjM+YFEhd4IfAzk0HOYoCwMzAncA8TSdj/wpkKPAgsA7w5wxzMyUFFFBAAQUUyEtgBeBCYN680jIbBUYicC+wUNOP+46iAPA6IJ5dtimgQH8Ck4BNgd/2d5pHK6CAAgoooIACrQmsC5wJzNJaBA6sQHcFNgbObjL8URQAvg/s0mQS9q1ApgLvBg7PNDfTUkABBRRQQIF8Bd4J/E++6ZmZAo0JHAbs0VjvQNMFgFgV9HYgngmyKaBA7wLxn+ZOvR/ukQoooIACCiigQFIC3wH2TCoig1EgfYF4dH5R4OmmQm26ALAB8JumgrdfBTIVuARYH3gi0/xMSwEFFFBAAQXyF4h1wM6qdjHKP1szVKA+gXiM5oL6uvvvnpouAFj5a2rm7DdXgTuA1YBbc03QvBRQQAEFFFCgGIEFgUuBxYvJ2EQVGF7gG8Bew3cz9R6aLABE37Ft2SJNBW+/CmQmEJ/4xyf/cQeATQEFFFBAAQUUyEFgdeB8YNYckjEHBUYgcDOwJPBME2M1WQBYA/h9E0HbpwKZCuwOHJFpbqalgAIKKKCAAuUKbA8cXW76Zq5A3wKvBC7v+6weTmiyAPBZ4NM9xOAhCigAja/4KbICCiiggAIKKNCiQNzW/IEWx3doBboksD/wuSYCbrIAEBWLVZoI2j4VyEzgz8CrgMcyy8t0FFBAAQUUUECBMYFYFPA8YE1JFFBgQoE/VNcHEx7Y7wFNFQDiuf94/r+p/vvN0+MVSFXgkWrRv+tSDdC4FFBAAQUUUECBmgSWqW5rfkFN/dmNArkKTK62A4wFwmttTV2gv5tnb2m2KaDA9AV2BI4SSQEFFFBAAQUUKERga+D4QnI1TQWGEdgF+MEwHUzt3KYKAL8ENq87WPtTIDOB44BtM8vJdBRQQAEFFFBAgYkEDgd2m+gg/16BwgVOBt5St0ETBYDZgHuA2esO1v4UyEjgeiBW93wwo5xMRQEFFFBAAQUU6EUgtgSM3cJW7OVgj1GgUIGHgfmA2Cq8ttZEAeCNwK9qi9COFMhPIH6I12pqa4/8uMxIAQUUUEABBTIUeBkQC535oWGGk2tKtQlsCpxZW28NLdJ3KPCeOoO0LwUyE/gg8M3McjIdBRRQQAEFFFCgXwHXDetXzONLE/hW3dtn1n0HQPR3E7B4aTNjvgr0KHAGsBnwTI/He5gCCiiggAIKKJCzwC+AN+WcoLkpMITADUDsnlFbq7sAsDJwRW3R2ZECeQnE8/6vAP6ZV1pmo4ACCiiggAIKDCywEHA1MO/APXiiAnkLvLz6Gakly7oLAJ8AvlBLZHaiQH4CuwNH5JeWGSmggAIKKKCAAkMJbA8cPVQPnqxAvgIfBw6uK726CwAXAOvUFZz9KJCRwG+Ajb31P6MZNRUFFFBAAQUUqFPgJGCrOju0LwUyETgH2LCuXOosAMwF3AvMXFdw9qNAJgLe+p/JRJqGAgoooIACCjQm4KMAjdHacccFJlWPyDxSRx51FgBi8Y5YxMOmgAL/LeCt/74iFFBAAQUUUECBiQW2A46Z+DCPUKA4gVhE/PQ6sq6zABBbFLyvjqDsQ4GMBLz1P6PJNBUFFFBAAQUUaFzARwEaJ3aADgp8FfhIHXHXWQC4FnhJHUHZhwKZCDwExKqdrvqfyYSahgIKKKCAAgo0LhCPAlwDzNP4SA6gQHcE/lLtJjZ0xHUVABYDbh46GjtQIC+BjwGH5JWS2SiggAIKKKCAAo0L7Al8p/FRHECB7gg8AywK3D5syHUVAHYBvj9sMJ6vQEYCUbleGXgyo5xMRQEFFFBAAQUUGIXADMAlwBqjGMwxFOiIwI7AUcPGWlcB4KfA24YNxvMVyEhgA+DcjPIxFQUUUEABBRRQYJQCqwG/B6IYYFNAgWcXyNxhWIg6CgDxQ3kHMP+wwXi+ApkI1PLDmYmFaSiggAIKKKCAAoMKHA7sNujJnqdAZgJ3AgsD8TjAwK2OAsCqwGUDR+CJCuQl8CCwAnBbXmmZjQIKKKCAAgooMHKBeYG/AvONfGQHVCBNgZWAq4YJrY4CwMeBA4cJwnMVyEhgL+AbGeVjKgoooIACCiigQJsCuwPfazMAx1YgIYGPAl8ZJp46CgBnAxsOE4TnKpCJQGzPEXfEuPBfJhNqGgoooIACCijQukA8bnwR8OrWIzEABdoXOAN43TBhDFsAmAX4FzDrMEF4rgKZCKwHnJ9JLqahgAIKKKCAAgqkIrB6tSDgsNcuqeRjHAoMKvAoMA8wadAOhv0heo0XPIPSe15mAr8AtswsJ9NRQAEFFFBAAQVSEXDXsVRmwjjaFlir2iZzoDiGLQB8Evj8QCN7kgL5CDwNxIIcV+eTkpkooIACCiiggAJJCSwNXAc8L6moDEaB0QvsO8wafMMWAM4ENh59zo6oQFIC33eLmqTmw2AUUEABBRRQIE+BbwHvyzM1s1KgZ4FfA6/v+egpDhymADATcB8w16CDe54CGQg8BrwYuDmDXExBAQUUUEABBRRIWWB+4Hrg+SkHaWwKNCwQ247HFplxF3LfbZgCQKzEeUnfI3qCAnkJHADsl1dKZqOAAgoooIACCiQr8Gngs8lGZ2AKjEZgNeCyQYYapgCwN3DQIIN6jgKZCNwPLFfdCZNJSqahgAIKKKCAAgokLTAH8Hdg4aSjNDgFmhX4CPDVQYYYpgBwCvCGQQb1HAUyEfgw8LVMcjENBRRQQAEFFFCgKwJ7AN/tSrDGqUADAj8H3jxIv4MWAGYE7gHmHmRQz1EgA4Fbqk//n8ggF1NQQAEFFFBAAQW6JDAzcC2wbJeCNlYFahSItfhiTYzJ/fY5aAFg1UGfOeg3QI9XIFGBDwLfTDQ2w1JAAQUUUEABBXIX2A04PPckzU+B6QisCPy5X6FBCwB7eetzv9Qen5HAXUDsRftoRjmZigIKKKCAAgoo0CWBuAsg1gJYsktBG6sCNQrElpjf6be/QQsAJw/6zEG/AXq8AgkK7OMCmAnOiiEpoIACCiigQGkCHwC+UVrS5qtAJXA88LZ+NQYpAMQ5d1bPHPQ7nscr0HWBWPk/Ks0PdT0R41dAAQUUUEABBTouMDtwA7BAx/MwfAUGEbhjkN0wBikALA/8bZAIPUeBDARi39nPZJCHKSiggAIKKKCAAjkIxJ2ZB+SQiDkoMIBAPJZ8Yz/nDVIA2B44up9BPFaBTAQeAZaqdsDIJCXTUEABBRRQQAEFOi3w/OoCaJ5OZ2HwCgwm8Hbgp/2cOkgB4FtALDhgU6A0gYOAqDLbFFBAAQUUUEABBdIRiDs0P51OOEaiwMgEvg58qJ/RBikA/AFYvZ9BPFaBDAQerz79j/UvbAoooIACCiiggALpCMwL/BOYI52QjESBkQj8Dlizn5H6LQDMCjwAPK+fQTxWgQwEfgjsnEEepqCAAgoooIACCuQocCjwnhwTMycFpiPwBPACIL731PotAKwNXNhTzx6kQF4CcdfLH/NKyWwUUEABBRRQQIFsBF4K/AXo9/omGwATKVbg1cDve82+3x+QDwNf6bVzj1MgE4GLgSh+2RRQQAEFFFBAAQXSFTgHWD/d8IxMgUYE9gK+0WvP/RYAjgO26bVzj1MgE4F3AMdmkotpKKCAAgoooIACuQpsBZyUa3LmpcA0BOI6Ja5Xemr9FgBuApboqWcPUiAPgTuAJYFJeaRjFgoooIACCiigQLYCMwLXVws3Z5ukiSkwhcANwDK9qvRTAFgYuK3Xjj1OgUwEYluZz2SSi2kooIACCiiggAK5C+wLfCn3JM1PgSkE4lo9PricsPVTAHgzcPKEPXqAAvkIPAksDdyaT0pmooACCiiggAIKZC0wH3AzELuX2RQoRWAL4Je9JNtPAeAAYJ9eOvUYBTIRiDUvts0kF9NQQAEFFFBAAQVKEfgRsGMpyZqnAkBcq+/Xi0Q/BYAzgY176dRjFMhEYAPg3ExyMQ0FFFBAAQUUUKAUgbWAi0pJ1jwVAOJafdNeJPopANwNxC01NgVKEIgFL2MxjcklJGuOCiiggAIKKKBAZgLXAS/OLCfTUWBaAvcA8/fC02sBIFb+jwsimwKlCHwB+FQpyZqnAgoooIACCiiQmcCngVjM2aZAKQKL9bJ2Wa8FgFhU4OelyJmnAsAKQFSObQoooIACCiiggALdE4htnGN7tF6vd7qXoREr8N8CmwOnTITS6w9EbIO2/0Sd+fcKZCJwCRDPjtkUUEABBRRQQAEFuitwHrBud8M3cgX6Eoi7Xj4/0Rm9FgB+Abxpos78ewUyEdgDOCyTXExDAQUUUEABBRQoVWBX4IhSkzfv4gR+Bmw1Uda9FgD+CSw+UWf+vQIZCEwCFgHuzSAXU1BAAQUUUEABBUoWeD5wOzB7yQjmXozAjcDSE2XbSwHghUCsKmhToASBE4BtSkjUHBVQQAEFFFBAgQIEjgW2LSBPU1TgmWrXvvumR9FLAWAj4Cw9FShEIB51+VUhuZqmAgoooIACCiiQu8BmwGm5J2l+ClQCGwDnDlsA2Bs4SFIFChB4AFgAiMcAbAoooIACCiiggALdF5gZuBOYp/upmIECEwp8BPjqsAUAb5uZ0NkDMhGI1/o7MsnFNBRQQAEFFFBAAQWeFTgG2E4MBQoQiNf6DsMWAGIv9BcXgGWKCsSz/7EGgE0BBRRQQAEFFFAgH4G3+h4vn8k0k+kKXA28fJgCQKyY+SAwo9AKZC7wBDA/8FDmeZqeAgoooIACCihQmsCcwN3ArKUlbr7FCTwFzAU8Pq3MJ1oEcFXgsuLYTLhEgVOAzUtM3JwVUEABBRRQQIECBH7pe70CZtkUQ2Al4KpBCwDx/MBROipQgMCuwJEF5GmKCiiggAIKKKBAiQI7+16vxGkvMudY0yzWNptqm+gOgAOAfYpkM+mSBCYDiwJ3lJS0uSqggAIKKKCAAgUJvLB6rzdTQTmbapkCXwA+NWgB4BdA7ItuUyBngfOB9XJO0NwUUEABBRRQQAEFOA9YVwcFMhc4GXjLoAWAvwP/n737gLKkqBo4/v8IkkEQCRJFkCBBogIGREAkKFFAckYFAVEUlKCAARRQkqggSYKSlGBABBSUjARBRXKQJJIz7Hfu0oO7w8y81P1ed9W/ztmzynZX3fvrnt3X91VXzZ84kOkp0HK/TIkUUEABBRRQQAEFGi+we6s90hufoQkoAP8AFuqmABCrZD7jDgDeQxkIxFYZsWWGTQEFFFBAAQUUUCBdgfcAt6SbnpkpMF4gdgKInS9il7M3tbHWAFgSuF5EBRIXeBiYHRiXeJ6mp4ACCiiggAIK5C4Qzz4PFJ/9crcw/7QFFgdu7rQAsClwStouZqcAPwM200EBBRRQQAEFFFAgC4H47BerpNsUSFlgY+CMTgsABwF7p6xibgoAsSXMT5VQQAEFFFBAAQUUyELA7QCzuMzZJ/kNYL9OCwDnAp/Mnk6A1AXmBe5JPUnzU0ABBRRQQAEFFBgvMLef/bwTMhA4C9ig0wLAP4EFMsAxxXwF4h5fMN/0zVwBBRRQQAEFFMhS4F/Au7LM3KRzEbgNWKSTAoA7AORya+Sd5zHAZ/MmMHsFFFBAAQUUUCA7gWOBHbLL2oRzEhh1J4DRdgGIbdFGXDUwJzVzTV4gpsXE9BibAgoooIACCiigQD4CnxptgbR8CMw0A4GFgb8Pz3O0AkC8+x9rANgUSFXgNeDtwOOpJmheCiiggAIKKKCAAiMKzAw8Aoy1Jbp0CjRdYG3g/HYLAF8EDml6xsavwBgCtwCLKaSAAgoooIACCiiQpUC8I71QlpmbdC4CuwOHt1sAiHejd8pFxjyzFDge2DbLzE1aAQUUUEABBRRQ4ERgCxkUSFjgSGCXdgsAFwGrJIxhagpEgSsWgLEpoIACCiiggAIK5CfwOSAekGwKpCrwG+Dj7RYA7gJif3SbAqkKLAXckGpy5qWAAgoooIACCigwpsCywNUaKZCwQGx3uUA7BYC3AM8BkyaMYWp5C7wATA+8nDeD2SuggAIKKKCAAtkKxDPPU8AU2QqYeOoCsRXg1MOfeUZa+XLBkbYLSF3H/LISuAL4QFYZm6wCCiiggAIKKKDAcIErgffJokDCAvMDd0yY30gFgDVH2i4gYRRTy0/gMOAL+aVtxgoooIACCiiggAITCPxgpEXSFFIgIYHVgd+2KgDsOtJ2AQkhmIoCmwCny6CAAgoooIACCiiQtcBmwMlZC5h86gI7A0e1KgBYCUv9NjC/dwF3yqCAAgoooIACCiiQtcC7gX9kLWDyqQu8aebzSK8AXACskbqE+WUr8AQwEzAuWwETV0ABBRRQQAEFFAiBeBaKz4axOLRNgRQFzgM+MWFiIxUAogoW1TCbAikK/BlYMcXEzEkBBRRQQAEFFFCgY4GrgOU6PssTFGiGwG3AImMVAKIgEFsATtmMfIxSgY4FfgJs3/FZnqCAAgoooIACCiiQosAJwJYpJmZOChTP9tOMVQCYFXhIKgUSFtgDODTh/ExNAQUUUEABBRRQoH2BLwPfbv9wj1SgcQIzA/8Zinr4KwDLANc0LiUDVqB9gY8Dv2n/cI9UQAEFFFBAAQUUSFgg3o/+ZcL5mZoCSwJ/Ha0AsC5wtkYKJCwwD3BvwvmZmgIKKKCAAgoooED7AvMDt7d/uEcq0DiBKHLFYoDj2/AZAJ8Hvt+4lAxYgfYEnilWeXUHgPa8PEoBBRRQQAEFFEhdYFIgPiO6BlrqVzrf/HYGjhqtAHAI8MV8bcw8cYGrgfclnqPpKaCAAgoooIACCnQmcCOweGeneLQCjRH4DvCV0QoAZwCfakwqBqpAZwKxyuvWnZ3i0QoooIACCiiggAKJC5wObJR4jqaXr8CpwKajFQCuAFbI18bMExeIVV4PTjxH01NAAQUUUEABBRToTGBf4OudneLRCjRG4E/Ah0YrANwHzNmYVAxUgc4ENgDO6uwUj1ZAAQUUUEABBRRIXGAz4OTEczS9fAXuAeYdqQAQC2C8AEyWr42ZJy4Q7//HOgA2BRRQQAEFFFBAAQWGBD4MXCqHAokKvAxMBbwa+U24C8DcQFQHbAqkKjA78FCqyZmXAgoooIACCiigQFcC7wTu7OpMT1KgGQIxy/+B4QWAFYHLmxG/USrQscBLReXrtY7P9AQFFFBAAQUUUECBlAXeAjwPTJJykuaWtcDywJXDCwCx8mWsgGlTIEWBu4D5UkzMnBRQQAEFFFBAAQV6FngQiNmiNgVSFIid/n4xvACwG3BYitmakwLAZcBKSiiggAIKKKCAAgooMILAVcByyiiQqMDngSOGFwC+BXwl0YRNS4FTgM1lUEABBRRQQAEFFFBgBIEzgfWVUSBRgQOBfYYXAI4Htk40YdNS4JvAV2VQQAEFFFBAAQUUUGAEgUOB3ZVRIFGBHwM7DC8AnA+smWjCpqXAZ4AfyqCAAgoooIACCiigwAgC8fAfRQCbAikK/Ar45PACQOyPvmyK2ZqTAsDaQBS5bAoooIACCiiggAIKDBfYYGiRNGkUSFAgdgCInQD4vwmSuxeYK8FkTUmBEHgfEEUumwIKKKCAAgoooIACwwU+DFwqiwKJCryxI9qEBYDY+3LKRBM2LQUWAP4lgwIKKKCAAgoooIACIwgsDtyojAKJCjwHTBO5DRUA3gr8N9FkTUuBEJgZ+I8UCiiggAIKKKCAAgqMIDAncJ8yCiQsMB3wzFABYEHg7wkna2p5C4wDJgdezZvB7BVQQAEFFFBAAQVGEYhvR59RR4GEBeYH7hgqAHwIuCzhZE0tb4EngBnzJjB7BRRQQAEFFFBAgRYCLwBTqKRAogIrAH8ZKgBsCPw80URNS4E3Fr2QQgEFFFBAAQUUUECBUQQeAmZVR4FEBdYFzh0qAHwOODLRRE1LgeuAZWRQQAEFFFBAAQUUUGAMgduAhRRSIFGBnYBjhwoAXwf2TTRR01LgYmAVGRRQQAEFFFBAAQUUGEPgCiCmSdsUSFEgnvcPGCoAHAHsnGKW5qRA8XrLRkoooIACCiiggAIKKDCGwPnAmgopkKjAYcAXhgoAJwGbJ5qoaSnwI2BHGRRQQAEFFFBAAQUUGEPgZGAzhRRIVOCnwDZDBYDzgLUSTdS0FBhf7ZJBAQUUUEABBRRQQIExBH7ol0beHwkLnAOsN1QA+BPwgYSTNbW8Bb4DfCVvArNXbD6lDAAAIABJREFUQAEFFFBAAQUUaCHga9HeIikLXAKsPFQAuBlYNOVszS1rgQNc5DLr62/yCiiggAIKKKBAOwLfc9ZoO0we01CBvwJLDhUA7gPmbGgihq1AK4HxK162Osg/V0ABBRRQQAEFFMha4FvOGs36+qee/N3AO4cKAE8D06aesfllK7AX8O1sszdxBRRQQAEFFFBAgXYE3Bq9HSWPaarAE8CMUQCYDHgJGCoGNDUh41ZgNIE9gEPlUUABBRRQQAEFFFBgDIGvOWvU+yNhgdeAyeOhf2bg0YQTNTUFPg/Eoi42BRRQQAEFFFBAAQVGE9gTiMWjbQqkKjB+BsD8wO2pZmheCgA7AccqoYACCiiggAIKKKDAGAK7O2vU+yNxgfmiALAMcE3iiZpe3gLbAD/Nm8DsFVBAAQUUUEABBVoIfA44UiUFEhZYKgoAqwAXJZykqSmwOXCKDAoooIACCiiggAIKjCGwPfAjhRRIWGDlKACsD5yZcJKmpsAmwOkyKKCAAgoooIACCigwhsBWzhr1/khcYL0oAGwJnJB4oqaXt8CmwKl5E5i9AgoooIACCiigQAuBbYGfqKRAwgKbRwEgFkg7JuEkTU0BXwHwHlBAAQUUUEABBRRoJbCDC0e3IvLPGy6wQxQAvgB8r+GJGL4CYwnEdK4TJVJAAQUUUEABBRRQYAwBvxj19khdYLcoAHwNOCD1TM0vawF3Acj68pu8AgoooIACCijQloC7ALTF5EENFtg7CgAHAXs3OAlDV6CVwHbAca0O8s8VUEABBRRQQAEFshbYBfhB1gImn7rAAVEAOAzYLfVMzS9rgR3d0iXr62/yCiiggAIKKKBAOwLxTBTPRjYFUhX4XhQAfgjEA5JNgVQFPlPc56nmZ14KKKCAAgoooIACvQu4NlrvhvZQb4GjowBwEhCrpNsUSFUg3uc6OtXkzEsBBRRQQAEFFFCgFIEvAQeX0pOdKFBPgROiAHAmsH494zMqBUoR2NX3uUpxtBMFFFBAAQUUUCBlga8A30o5QXPLXuAXUQC4EPh49hQCpCwQ1dzvppyguSmggAIKKKCAAgr0LLAfsH/PvdiBAvUVOD8KAJcAK9U3RiNToGeBfYADe+7FDhRQQAEFFFBAAQVSFvgmsFfKCZpb9gIXRwHgKmC57CkESFkgHv6jCGBTQAEFFFBAAQUUUGA0gUOB3eVRIGGBv0QB4CZgsYSTNDUFYvp/vAZgU0ABBRRQQAEFFFBgNIGjgM/Ko0DCAjdGAeDvwIIJJ2lqChwBfF4GBRRQQAEFFFBAAQXGEDgO2EYhBRIWuDUKALcD8yecpKkp8CNgRxkUUEABBRRQQAEFFBhD4BRgU4UUSFjgn1EAuAuYN+EkTU2Bk4AtZVBAAQUUUEABBRRQYAyBXwAbKKRAwgJ3RAHgXmCuhJM0NQXOADaWQQEFFFBAAQUUUECBMQTOA9ZSSIGEBe6OAsD9wBwJJ2lqCsRf5p+QQQEFFFBAAQUUUECBMQQuAlZRSIGEBe6PAsBDwKwJJ2lqClwCrCyDAgoooIACCiiggAJjCFwJvE8hBRIW+HcUAB4FZk44SVNT4BpgORkUUEABBRRQQAEFFBhD4G/AIgopkLDAI1EAeByYMeEkTU2B2OpyYRkUUEABBRRQQAEFFBhDwLXRvD1SF3g8CgBPAdOlnqn5ZS3wADBn1gImr4ACCiiggAIKKNBK4L/AW1sd5J8r0GCBJ6MA8CwwdYOTMHQFWglEkWuGVgf55woooIACCiiggAJZC7wMTJa1gMmnLvBMFABeAKZIPVPzy1rgteIv83FZK5i8AgoooIACCiigwGgCUwHPyaNA4gIvRAHASlfiV9n0xgtM41/q3gkKKKCAAgoooIACowi8HXhEHQUSF3g5CgCvApMknqjpKTB7seWlEgoooIACCiiggAIKDBeYD7hDFgUSF3gtCgAxPTp+tymQskDsAhC7AdgUUEABBRRQQAEFFBgusDRwrSwKJC4wLh78XwEmTTxR01NgReDPMiiggAIKKKCAAgooMILAqsDvlFEgcYFXogDwIvCWxBM1PQXWBs6XQQEFFFBAAQUUUECBEQQ2Ak5XRoHEBV6MAsDzwJSJJ2p6CmwJnCSDAgoooIACCiiggAIjCHwGOFoZBRIXeC4KAM8UK6QnnqvpZS6wO3B45gamr4ACCiiggAIKKDCywN7AQeIokLjAM1EAeAqYLvFETU+BA4B9ZVBAAQUUUEABBRRQYASBQ4AvKqNA4gJPRgHgv8BbE0/U9BQ4CthZBgUUUEABBRRQQAEFRhA4DthGGQUSF3g8CgD/AWZKPFHTU+A04NMyKKCAAgoooIACCigwgsA5wDrKKJC4wKNRAHgYmCXxRE1PgdjW5WMyKKCAAgoooIACCigwgsAfgQ8qo0DiAg9HAeAhYNbEEzU9BW4E3iuDAgoooIACCiiggAIjCPwTWEAZBRIXeDAKAPcDcySeqOkpEDNdZpNBAQUUUEABBRRQQIERBJ4AZlBGgcQF7osCwJ3AOxNP1PQUeBWYAojfbQoooIACCiiggAIKDAlMBTwnhwIZCNweBYBbgYUzSNYUFYgZADETwKaAAgoooIACCiigwJBAfBkaX4raFEhd4JYoAFwPLJl6puanALAEcJMSCiiggAIKKKCAAgpMILA88GdFFMhA4NooAMTNHje9TYHUBWIXgNgNwKaAAgoooIACCiigwJDAusDZciiQgcDlUQC4BFgpg2RNUYEtgJNlUEABBRRQQAEFFFBgAoGdgGMUUSADgYujAPBrYPUMkjVFBfYEDpFBAQUUUEABBRRQQIEJBPYD9ldEgQwELowCwDnAOhkka4oK/ADYVQYFFFBAAQUUUEABBSYQ+AmwrSIKZCBwVhQATgc2yiBZU1TgXCDe8bIpoIACCiiggAIKKDAkEGtErSqHAhkInBoFgBOALTNI1hQVuA5YRgYFFFBAAQUUUEABBSYQuA1YSBEFMhA4PgoAPwR2zCBZU1TgEWBWGRRQQAEFFFBAAQUUmEDgaWBaRRTIQODoKAAcCuyeQbKmqMA4YGrgBSkUUEABBRRQQAEFFABmBB5XQoFMBL4XBYBvAPtkkrBpKvBu4HYZFFBAAQUUUEABBRQA3gvcoIQCmQjsHwWALwEHZ5KwaSrwUeAPMiiggAIKKKCAAgooAKwN/EoJBTIR2CMKADsBx2SSsGkqsHWx8KUSCiiggAIKKKCAAgp8FjhKBgUyEdghCgCbAqdkkrBpKnAAsK8MCiiggAIKKKCAAgoA3wX2UEKBTAQ2iQLAJ4BfZpKwaSpwalH0UkIBBRRQQAEFFFBAgXOAdWRQIBOBtaIAsDJwcSYJm6YCVwHvl0EBBRRQQAEFFFBAAeBmYFElFMhE4MNRAFgWuDqThE1Tgf8AM8uggAIKKKCAAgookL1APAs9DUyTvYQAuQgsFTf9QsBtuWRsngoAMwH/VUIBBRRQQAEFFFAga4F3AA9kLWDyuQksEAWAOYD7c8vcfLMWWAa4LmsBk1dAAQUUUEABBRT4IPBHGRTISGC2KABMBzyVUdKmqsDGwBkyKKCAAgoooIACCmQtsBXw06wFTD43gWmiABC/XgQmzy17881W4GvAQdlmb+IKKKCAAgoooIACIXAg8FUpFMhEIJ75p4yH/2gPA7NkkrhpKvAzYDMZFFBAAQUUUEABBbIWOAtYL2sBk89J4MF4/X+oABCLAMZigDYFchC4Hlg6h0TNUQEFFFBAAQUUUGBUAZ+BvDlyErgFWGyoAHA5sGJO2Ztr1gLPFWtfvJa1gskroIACCiiggAL5CsTrz8/6GnS+N0CGmceClx8eKgD8Clg7QwRTzldgPuCufNM3cwUUUEABBRRQIGuBRYC/ZS1g8rkJnBOvvAwVAE4AtsxNwHyzFlgLuCBrAZNXQAEFFFBAAQXyFVgfODPf9M08Q4HjgO2GCgCHArtniGDK+QrsCRySb/pmroACCiiggAIKZC0Qu0IdkLWAyecmEM8+ew4VAPwByO3ym2/s+bqNDAoooIACCiiggAJZCsSuUJ/OMnOTzlVgb+BbQwWAzwJH5Sph3lkKXAssm2XmJq2AAgoooIACCihwI7C4DApkJLATcOxQAWBj4LSMkjdVBV4EpgVekUIBBRRQQAEFFFAgK4EpgKfdASCra26y8CngF0MFgI8Cv1dFgcwEFnX118yuuOkqoIACCiiggAKwNBCzQW0K5CSwEnDZUAEgHoRuzil7c1UA2AyI979sCiiggAIKKKCAAvkIbAv8JJ90zVSB8QILA38fKgDMDDwqjAKZCYxfCTOznE1XAQUUUEABBRTIXeAHwC65I5h/dgIzAk8MFQDi93gnevLsGEw4Z4GLgNVyBjB3BRRQQAEFFFAgQ4E/Ah/MMG9TzlcgnvWnAsYNFQCC4gHgHfmamHmGAjHrZZYM8zZlBRRQQAEFFFAgV4F4/vkvMEOuAOadpcC9wDyR+YQFgOuBJbPkMOmcBeYsil85G5i7AgoooIACCiiQi8B8wB25JGueChQC1wDLDS8A/BpYXSIFMhNYDzgns5xNVwEFFFBAAQUUyFVgE+DUXJM372wFzgM+MbwAcAKwZbYkJp6rwLeBvXJN3rwVUEABBRRQQIHMBA4DdsssZ9NVIHa92H54ASAehL6sjQKZCVwCrJxZzqargAIKKKCAAgrkKnAFsEKuyZt3tgIHAvsMLwDsDhyaLYmJ5yrwNBBbYryaK4B5K6CAAgoooIACmQjEjmdPFquhZ5KyaSowXiC2vTxyeAHA92G8O3IVWBT4W67Jm7cCCiiggAIKKJCJwFLAdZnkapoKTCiwIXDm8AJA7IUZe2LaFMhNYFvg+NySNl8FFFBAAQUUUCAzgc8AR2eWs+kqEALvB64aXgCYF7hLHwUyFPgRsGOGeZuyAgoooIACCiiQk8BPga1ySthcFSgE5gLuH14AiHdiXgAmkUmBzARi+n+8BmBTQAEFFFBAAQUUSFfgdmD+dNMzMwVGFHgFmHJozbP/G3bIg8DswimQmcA4YFbg0czyNl0FFFBAAQUUUCAXgdmAf+eSrHkqMIHAvcA8Q/9/eAHgamBZuRTIUGBd4NwM8zZlBRRQQAEFFFAgB4FPAWfkkKg5KjBMILa+/MBoBYCzgPUkUyBDgdgCc48M8zZlBRRQQAEFFFAgB4EjgJ1zSNQcFRgmEIWvjUcrABwO7CqZAhkKXAMsl2HepqyAAgoooIACCuQgcCOweA6JmqMCwwS+C3xptALAF4FDJFMgQ4FYHGMm4OkMczdlBRRQQAEFFFAgZYEZgcdc7DzlS2xuYwjsBnx/tAJATA04TT4FMhVYHfhtprmbtgIKKKCAAgookKrA2sCvUk3OvBRoIbAhcOZoBYAVgcslVCBTgZj9smemuZu2AgoooIACCiiQqsBhQHwLalMgR4H3A1eNVgCYA7g/RxVzVgC4AVhKCQUUUEABBRRQQIGkBG4GFk0qI5NRoH2B2O78kdEKALEt4LPAVO3355EKJCMwDog9Yt/4AUkmMxNRQAEFFFBAAQXyFIjPdg8Cw7c/z1PDrHMTeAaYbsKkR/pBuBVYODcZ81WgENgEOF0NBRRQQAEFFFBAgSQENgdOSiITk1Cgc4GbgCVaFQDOB9bsvG/PUCAJgeOA7ZLIxCQUUEABBRRQQAEFTgS2kEGBTAXOBdZtVQA4Atg5UyDTVuBeYB4ZFFBAAQUUUEABBZIQuA+YM4lMTEKBzgUOBfZoVQDYHYgDbQrkKrAQ8I9ckzdvBRRQQAEFFFAgEYFFgL8lkotpKNCNwC7Aka0KAOsA53TTu+cokIjAF4HvJZKLaSiggAIKKKCAArkKxPbO38k1efNWAFgLuKBVAWBx4Ea5FMhY4BJg5YzzN3UFFFBAAQUUUCAFgcuAD6WQiDko0KVAzIK5rVUBYFrg6S4H8DQFUhB4GZgFeCKFZMxBAQUUUEABBRTIUGDGYmvnyTLM3ZQVCIHY4nwa4PlWBYD484eLByDpFMhVYCPg57kmb94KKKCAAgoooEDDBWJr51MbnoPhK9CLwIPAHMM7+L9RerwCWKGX0TxXgYYLxH6xWzY8B8NXQAEFFFBAAQVyFfgZ8OlckzdvBYBLgY+0WwCIvdC3kU2BjAUeBWYHXs3YwNQVUEABBRRQQIEmCkxazGh+WxODN2YFShI4Ftip3QKAK2aWpG43jRb4IHB5ozMweAUUUEABBRRQID+BDxfffuaXuRkr8D+BPYBD2y0AfBI4Vz0FMhc4HNg9cwPTV0ABBRRQQAEFmiZwBLBz04I2XgVKFlgTuLDdAsBCw7cLKDkYu1OgCQL3A3MXK2g2IV5jVEABBRRQQAEFcheYBLgPeEfuEOafvcD8wB3tFgAmB54F4nebAjkLvB+4KmcAc1dAAQUUUEABBRoksKKvcDboahlqVQIvFVsAvtJuASCO+wfw7qoisl8FGiJwCBBrYtgUUEABBRRQQAEF6i8Q7zz7Cmf9r5MRVitwK/CekYYYbRvAOPZXwNrVxmXvCtRe4G5gPl8DqP11MkAFFFBAAQUUUCCebe4C5pFCgcwFzgHW67QAcDDwpczhTF+BEFgWuFYKBRRQQAEFFFBAgVoLLOerm7W+PgbXP4HvAF/ptACwHfDj/sXoSArUViCmksU2GjYFFFBAAQUUUECB+gocBuxW3/CMTIG+CWwNnNBpAWAF4Iq+hehACtRX4N/AXMCr9Q3RyBRQQAEFFFBAgawFJgViB6fZslYweQVeFxh1IfOx1gCYAfgvMNYxAiuQi8BqwEW5JGueCiiggAIKKKBAwwRWB37dsJgNV4EqBMYB8Sz/9Eidt3q4v6fYB72KwOxTgSYJnAhs1aSAjVUBBRRQQAEFFMhI4GRgs4zyNVUFRhO4E3jXaH/YqgBwAbCGtgoowLPArDD+d5sCCiiggAIKKKBAfQSmBh4Gpq1PSEaiwMAEYje/T3ZbAPg28OWBhe7ACtRL4NPAafUKyWgUUEABBRRQQIHsBeIz2s+yVxBAgdcFvgl8tdsCwObASUoqoMB4gd8BH9NCAQUUUEABBRRQoFYC8Rlt1VpFZDAKDE5gE+D0bgsA7wVuGFzsjqxArQRiQY0FgDtqFZXBKKCAAgoooIAC+QrMW3w2myRfAjNXYCKBxYBbui0ATAE8A0wmqgIKjBf4BrCfFgoooIACCiiggAK1EIjPZvvUIhKDUGDwAi8Xa2G81G0BIM67DVho8LkYgQK1EIj9ZaPS/GotojEIBRRQQAEFFFAgX4H41v8udy3L9wYw8zcJ3AwsPpZLq10A4txfABuIq4ACbwisCVyohwIKKKCAAgoooMBABeIz2fkDjcDBFaiXQCxYHotijtraKQB8DTigXnkZjQIDFTgXWHegETi4AgoooIACCiigwNl+JvMmUGAigb2A2MmvpwKAlTXvKgUmFngFmA+4TxgFFFBAAQUUUECBgQi8A7gbmHwgozuoAvUUiB3LYleMngoAswMP1jM/o1JgYAIHATE7xqaAAgoooIACCijQf4EDx9rrvP/hOKICtRCYBXi01wJAnP9vYLZapGQQCtRDIH6w5gZeqEc4RqGAAgoooIACCmQjEDuV3QPMmk3GJqpAa4GYnRzPJ2O2dtYAiA4uANZo1Zl/rkBmAlsCJ2WWs+kqoIACCiiggAKDFojPYCcMOgjHV6BmAr8E1mkVU7sFgFgE0OnOrTT989wErgeWzi1p81VAAQUUUEABBQYscDWw7IBjcHgF6iawP/D1VkG1WwBYDzirVWf+uQIZCrwfuCrDvE1ZAQUUUEABBRQYhEB89vrLIAZ2TAVqLvBJ4FetYmy3APBO4M5WnfnnCmQo8HNgowzzNmUFFFBAAQUUUGAQAr8ANhjEwI6pQM0F5gLubxVjuwWAOO4xYKZWHfrnCmQm8CqwEPCvzPI2XQUUUEABBRRQoN8CsQ3zP4FJ+z2w4ylQc4F4Vn97OzG2WwCIvn4PfLSdTj1GgcwEjgJ2zixn01VAAQUUUEABBfotcAywU78HdTwFGiDwW2D1duLspADwHWDPdjr1GAUyE3gOmKeYJZNZ6qargAIKKKCAAgr0RSC+3Yyt/6bqy2gOokCzBL4F7N1OyJ0UAFwIsB1Rj8lVIFbcjJU3bQoooIACCiiggALlC3wD2Kf8bu1RgSQE2loAMDLtpAAwJ3BfEjwmoUD5AvHezbzAs+V3bY8KKKCAAgoooEDWAtMU3/6/LWsFk1dgdIHZgYfaAeqkABD9xaqCc7TTsccokKFAvCJzSIZ5m7ICCiiggAIKKFClQHzGiteRbQoo8GaBu4HYta+t1mkB4CwgXgWwKaDAmwViFkD88D0jjgIKKKCAAgoooEApAvHtf2xHPkspvdmJAukJnAFs3G5anRYArL61K+txuQp8EfhersmbtwIKKKCAAgooULLAl4CDS+7T7hRISeALwGHtJtRpAeDDwKXtdu5xCmQo8DAQe9TGzgA2BRRQQAEFFFBAge4Fpgbu8tv/7gE9MwuBFYE/t5tppwWAaYEngEnbHcDjFMhQoKMqXIY+pqyAAgoooIACCrQjEJ+pnFnZjpTH5CrwMjAD8Hy7AJ0WAKLfG4HF2x3A4xTIUOAR4F2uBZDhlTdlBRRQQAEFFChLIL54vMNv/8vitJ9EBa4Dlukkt24KAD8Ctu9kEI9VIEOB/YGvZ5i3KSuggAIKKKCAAmUI7AfE5ymbAgqMLnAUsHMnQN0UALYBjutkEI9VIEOBp4tZAI9mmLspK6CAAgoooIACvQi8HfgXMH0vnXiuAhkIbAGc3Eme3RQA3g38o5NBPFaBTAW+D+yWae6mrYACCiiggAIKdCtwOLBrtyd7ngIZCcQW5Hd3km83BYDo/0Fg9k4G8lgFMhR4CVi42Ls2w/RNWQEFFFBAAQUU6FhgnuLLxik6PtMTFMhL4AFgzk5T7rYAcCawfqeDebwCGQqcAmyeYd6mrIACCiiggAIKdCNwkp+dumHznAwFTgc26TTvbgsAMa35sE4H83gFMhQYB3wQuCLD3E1ZAQUUUEABBRToRGBp4Gpgkk5O8lgFMhWIxf9iEcCOWrcFgNhq4JqORvJgBfIVuBJYAYhigE0BBRRQQAEFFFDgzQLxXPJH4APiKKBAWwLvBW5s68gJDuq2ADAZ8DgwXacDerwCmQpsBvws09xNWwEFFFBAAQUUaCUQn5U6Ws28VYf+uQIJCzwFzAS82mmO3RYAYpzfAat2OqDHK5CpQCzSsSDwbKb5m7YCCiiggAIKKDCawFTA34G5JVJAgbYEfg2s0daRww7qpQCwL/D1bgb1HAUyFfgGsF+muZu2AgoooIACCigwmkB8RtpHHgUUaFvga8BBbR89wYG9FABWBi7uZlDPUSBTgReBJYqtbTIlMG0FFFBAAQUUUGAigfmBm4EpdVFAgbYFPlysmdH2CUMH9lIAmLpYB8A9Ojtm94SMBS4CVss4f1NXQAEFFFBAAQUmFPC1Yu8HBToTeL54//+Fzk57/eheCgBx/mXAh7oZ2HMUyFgg9uuMfTttCiiggAIKKKBAzgLxmejUnAHMXYEuBGIW/ipdnFdKAWB/32nult7zMhZ4CFgYeCJjA1NXQAEFFFBAgbwFpgduA96RN4PZK9CxQNfv/8dIvc4A+GC37x50nKYnKJCWwFHAzmmlZDYKKKCAAgoooEDbAkcCn2v7aA9UQIEhgRWAv3TL0WsB4C3FOgDTdBuA5ymQqcBrwEcsoGV69U1bAQUUUECBvAWWBy4HJsmbwewV6FjgaeBtwMsdn1mc0GsBILpx4Y5u9T0vd4G7gMWAZ3OHMH8FFFBAAQUUyEZgKuBGYIFsMjZRBcoTuABYq5fuyigA7AV8s5cgPFeBjAW+B3wx4/xNXQEFFFBAAQXyEojPPl/IK2WzVaA0gXhuiJ+hrlsZBYD3AVd2HYEnKpC3QLwKEDtpXJE3g9kroIACCiigQAYC7y+m/k+aQa6mqEAVAksBN/TScRkFgMmAx4AZegnEcxXIWCBWwF0aiD09bQoooIACCiigQIoCMfX/emChFJMzJwX6IPA48HYgvkDsupVRAIjBz+v1XYSuM/BEBdIQ+AGwaxqpmIUCCiiggAIKKPAmgfiss4suCijQtcDZwPpdn12cWFYB4PPA93sNxvMVyFhgXFFEuzBjA1NXQAEFFFBAgTQFVgV+W8IW5GnqmJUC7QnsBBzb3qGjH1VWAWBB4O+9BuP5CmQu8EixK0D8blNAAQUUUEABBVIQmBm4CZg9hWTMQYEBCrwLuLPX8csqAEQcdwDz9RqQ5yuQucC5wLqZG5i+AgoooIACCqQj8HNgw3TSMRMFBiLwj7LWzyizAHAMENMSbAoo0JtAKdN7egvBsxVQQAEFFFBAgZ4FdihjynLPUdiBAs0XOAKI1+57bmUWANYBzuk5IjtQQIEXgBV63eJDRgUUUEABBRRQYIACiwFXAbH6v00BBXoTWBMoZa2wMgsA0wH/ASbvLTfPVkAB4F/F1oBPqaGAAgoooIACCjRMYFrgmrKmLDcsd8NVoGyBl4C3Ac+U0XGZBYCI5zLgQ2UEZh8KKEC8M7eRDgoooIACCiigQMMETgE2bVjMhqtAXQUuBlYpK7iyCwB7Ad8sKzj7UUABPgP8UAcFFFBAAQUUUKAhAp8DjmxIrIapQBME9gQOKSvQsgsASwPXlhWc/SigAC8DHwX+pIUCCiiggAIKKFBzgeWBS4Apah6n4SnQJIEliq00S4m57ALAJMCDwKylRGcnCigQAvEztQzwbzkUUEABBRRQQIGaCryj+CJw9prGZ1gKNFEgngPmBMaVFXzZBYCI63hg67ICtB8FFBgv8BfgI8CLeiiggAIKKKCAAjUTiEXA/wB8oGZxGY4CTRf4EbBjmUlUUQBYFzi7zCDtSwEFxgvEWgCxJoBNAQUUUEABBRSok8CPge3qFJCxKJAgD2vAAAAgAElEQVSIwCeA88rMpYoCQGz78Zjv/pR5mexLgTcEPgsco4cCCiiggAIKKFATgV2AH9QkFsNQICWB54GZgefKTKqKAkDE9xvgY2UGal8KKDBe4FVgHeB8PRRQQAEFFFBAgQELfBz4FTDZgONweAVSFIjP+2uXnVhVBQC3/yj7StmfAv8TeLp4x+4mURRQQAEFFFBAgQEJLApcDswwoPEdVoHUBeLd/1gDoNRWVQFgbuBuoKr+S0WwMwUaKHAP8D7g4QbGbsgKKKCAAgoo0GyBWOn/KmCuZqdh9ArUViBW/Y9n6vvLjrDKB/QbgcXLDtj+FFDgDYGrgZWBZzVRQAEFFFBAAQX6JDAdcBmwZJ/GcxgFchS4Hli6isSrLAAcCHy1iqDtUwEF3hD4PbAm8JImCiiggAIKKKBAxQKx3V+sSO5aXxVD2332Al8H9q9CocoCwPuLvcuriNs+FVDgfwKnApsDr4migAIKKKCAAgpUJBDPDScWnzkqGsJuFVCgEFgGuK4KjSoLAJMADwCzVRG4fSqgwEQC3wW+pIkCCiiggAIKKFCRQGz1F1v+2RRQoFqBeIaO9TViHYDSW5UFgAg29ivfqfSo7VABBUYS2BM4RBoFFFBAAQUUUKBkga8BB5Tcp90poMDIAkdWWWyrugCwCnCRV1YBBfoiEFXCnYGj+zKagyiggAIKKKBADgKfB76fQ6LmqEBNBGKR70uqiqXqAsBkwL+BmatKwH4VUGAigSgCxKyb0vcM1VkBBRRQQAEFshPYFvixW3tnd91NeHACjwGxzeYrVYVQdQEg4v4psFVVCdivAgq8SSAWA9wC+Jk2CiiggAIKKKBAlwLx+f04INb1simgQH8EfgJsX+VQ/SgArFVsF1JlHvatgAITC0TVcBPgTGEUUEABBRRQQIEOBWJ3oRN8+O9QzcMV6F0gnp0v6L2b0XvoRwFgCuARYPoqE7FvBRR4k8CrwNbAydoooIACCiiggAJtCmxabPc3aZvHe5gCCpQj8DQwC/BCOd2N3Es/CgAx8mnAxlUmYt8KKDCiQBQBtiuq+BIpoIACCiiggAJjCcTU4x/6zb83iQIDETgViAJcpa1fBYANgZ9XmomdK6DAaALuDuC9oYACCiiggAKtBGIR4dhJqF/PB63i8c8VyE1gA+CsqpPu1w/4tMVrAFNVnZD9K6DAiAJRBIhtfGJfUZsCCiiggAIKKDChwJeBb0uigAIDE3iumP7/bNUR9KsAEHnEYmTrV52Q/SugwJgC3wG+opECCiiggAIKKFB82x8P/nuqoYACAxWI2fIb9SOCfhYAfA2gH1fUMRRoLRDT+3YBYrtAmwIKKKCAAgrkKRCL/MX7/rFWkE0BBQYrEF+Un92PEPpZAJgSeNjdAPpxWR1DgZYC5xTbBL7Y8kgPUEABBRRQQIHUBGKXrlhwbL3UEjMfBRooEKv/zwo834/Y+1kAiHxO6cfKhv2AcwwFEhC4uHgt58kEcjEFBRRQQAEFFGhP4O3AucAK7R3uUQooULFAbNm9RcVjvNF9vwsAawO/6ldyjqOAAi0FbgXWAO5peaQHKKCAAgoooEDTBd4FXAi8u+mJGL8CCQnEZ/Ff9yuffhcAJgceAmbqV4KOo4ACLQXiZzKKc9e2PNIDFFBAAQUUUKCpAssDvwRiBoBNAQXqIfA4MDvwUr/C6XcBIPI6DtimXwk6jgIKtCUQW45sWnwwaOsED1JAAQUUUECBxgjEv/HxGTze/bcpoEB9BH4E7NjPcAZRAFgV+F0/k3QsBRRoS2AccDCwFxD/26aAAgoooIACzRaIlf4PKrb5G8Tn/mbrGb0C1QusDFxS/TD/G2EQfxHEX0QPFCsd9jNXx1JAgfYEfgFsBTzX3uEepYACCiiggAI1FJgeiMXFPlHD2AxJAQXg38BcwKv9xBhEASDyOxL4XD8TdSwFFOhI4AZgHeDejs7yYAUUUEABBRSog8DCxWt9C9QhGGNQQIERBQ4Hdu+3zaAKAMsBV/U7WcdTQIGOBB4FPg38vqOzPFgBBRRQQAEFBimwYfG+/3SDDMKxFVCgpcDSwPUtjyr5gEEVACKN24CFSs7H7hRQoFyBoXUB9gZeK7dre1NAAQUUUECBEgUmAw70ff8SRe1KgeoEYivu91TX/eg9D7IA8NXiL6lB5O2YCijQmUDsGbw5EFuV2BRQQAEFFFCgXgJzAmcAK9QrLKNRQIFRBL5cLL7dd6BBFgDmAe4EJul71g6ogALdCNwNbAZc0c3JnqOAAgoooIAClQisDRwPzFxJ73aqgAJlC8Ss2ngWvr/sjtvpb5AFgIgvtjxYqZ1APUYBBWohEKuUfhfYF3ipFhEZhAIKKKCAAnkKTAV8G9gFGPRn+jyvgFkr0J3ARcBq3Z3a+1mD/stim2KRkt4zsQcFFOinwDXFbIB/9nNQx1JAAQUUUECB8QLLFlv8LaiHAgo0TmCL4ud3IIEPugAQ+5PG/odTDyR7B1VAgV4Engf2Ar7fSyeeq4ACCiiggAJtC0wKfBH4BvCWts/yQAUUqIvAs8BswDODCmjQBYDI+2fFVmODMnBcBRToTeAcYAfgsd668WwFFFBAAQUUGENgXuAk4IMqKaBAYwXiZ3jLQUZfhwLA6sCvB4ng2Aoo0LPAg8DWwO967skOFFBAAQUUUGC4QPwbGzPuppNGAQUaLbAq8PtBZlCHAkBMZboLmGuQEI6tgAI9C4wDjgT2HuS0pp6zsAMFFFBAAQXqIzA7cBSwbn1CMhIFFOhS4B5gPiB2ARhYq0MBIJKP95j2GZiCAyugQJkCMRvg88BZZXZqXwoooIACCmQkEJ/RNwcOBd6WUd6mqkDKAvsVz70DzbEuBYB4p+kOYJKBaji4AgqUKXA+8FngvjI7tS8FFFBAAQUSF1gMOBZYPvE8TU+BnATiW//49j9mAQy01aUAEAixH+IqA9VwcAUUKFvgSSCqnfFqwKtld25/CiiggAIKJCQwFfDlYocdV/hP6MKaigLAb4CP10GiTgWAjYHT6oBiDAooULrA9cD2QPxuU0ABBRRQQIGJBdYo3vWPWbE2BRRIT2BD4Mw6pFWnAkBUOh8AZq4DjDEooEDpAq8ARxeLBMYeqDYFFFBAAQVyF4j9wA8u3vfP3cL8FUhV4D/AHMCLdUiwTgWA8IjtTWLxMJsCCqQrcGcxxbEWVdB0mc1MAQUUUKDGAlMUn3m/CsxQ4zgNTQEFeheIxTz36L2bcnqoWwEgFj25qZzU7EUBBWoucFXxl+EVNY/T8BRQQAEFFChTYG3g8GJBsDL7tS8FFKinwHuAW+sSWt0KAOFyNbBsXYCMQwEFKhUYV7wPFYse3VXpSHaugAIKKKDAYAWWA74HfGCwYTi6Agr0UeDPwIp9HK/lUHUsAGwH/Lhl5B6ggAIpCTwPHAZ8G3g6pcTMRQEFFFAge4F3Ff++rQ/U8bN39hdIAAUqFNgaOKHC/jvuuo5/CcUWKLEY4IwdZ+MJCijQdIHHgAOLlZBj0UCbAgoooIACTRWIz7Ixw21XYMqmJmHcCijQtcB/gTmB57ruoYIT61gAiDRdDLCCi22XCjRI4BZgH+CXQLwmYFNAAQUUUKApAtMCny0e/mdqStDGqYACpQvUavG/oezqWgBYqFgooa7xlX532KECCowoEIWAbxTrBFgI8CZRQAEFFKizQDz4bwt8BYjt/WwKKJCvQHxujWfaf9aNoM4P2H8APlI3MONRQIGBCFgIGAi7gyqggAIKtCEw9OC/FzBrG8d7iAIKpC9wEbBaHdOscwFgQ+DndUQzJgUUGJiAhYCB0TuwAgoooMAwgemKqf57Ak719/ZQQIEJBdYDzqkjSZ0LAJMBdwNz1BHOmBRQYKACFgIGyu/gCiigQNYCQw/+scCfi1ZnfSuYvAIjCjwIzAu8XEefOhcAwive/Y2FwGwKKKDASAI3F9sHngq8KJECCiiggAIVCrwT2KV4z3/6CsexawUUaLbA14H965pC3QsAsW3CXUDMBrApoIACowk8AhwDHAnEVoI2BRRQQAEFyhJYutjKbxM/k5ZFaj8KJCsQ21jHt/+xrX0tW90LAIF2NrBuLfUMqpVATH95HPjPsN+HVnOPKXTxiscsxR6ZsXDOW1p16p8rMIbA88BJxayAfyilgAIKKKBAlwKTAxsAuwPLdtmHpymgQH4CZwKxll1tWxMKAB8GLq2toIGFwMPAtcWvvwK3A3cC8TDWSZsUiOl1sWVG/FoQWAJ4LxD/ENsUaFfgNeDCohAQO4rYFFBAAQUUaEcg3unfAdi5+HKinXM8RgEFFBgS+CBweZ05mlAACL8biofAOlvmFttVwHnA+cCNFSc/BbAksBywPLByMWug4mHtPhGBKEodAZwBPJtITqahgAIKKFCuwFLA9sDmwDTldm1vCiiQicB1wDJ1z7UpBYCtgePrjplBfLGSZWzNeEgfHvrH4oz7NmYGrFr8ilkivjqQwQ3YY4pPAbFY4I+B63vsy9MVUEABBZovMAPwaWA7IAoANgUUUKAXgS2LV1F76aPyc5tSAJgSuMdvfSu/H8Ya4NfA54pFGQcayAiDvxVYG1gf+BgQ94tNgbEEokIbhYDTgCgM2BRQQAEF8hH4QPHQH+/pTp1P2maqgAIVCjxULP5X+12pmlIAiGvlloAV3rEtuo6tLOLX0OJ9g4uk9cjTFoWAbYH4B75J93jr7DyibIFnilcDohgQr7XYFFBAAQXSFIgFh2N6f3zbH+sM2RRQQIEyBWLbv3heqn1r0sPR7MDdTvXu+z11GPCFvo9azoALAFsV+/XGDgM2BcYSuAk4oSgIxA4WNgUUUECBZgvEjMA1i2n+a/kZstkX0+gVqLFAfOs/T7Eweo3DfD20JhUAIt5TgE1rr5pOgPHaRVTJX2h4SrGIYLzjtxuweMNzMfzqBV4tdh6J9QJiG9Inqh/SERRQQAEFShKYDFgF2LjYRnr6kvq1GwUUUGA0gROLLx0bIdS0AkDsw3p1I2TTCPJAYJ80Unkji48Cexc7CSSWmulUIBAV3dhOMIoBseNF04thFRDZpQIKKDBwgfg8u2Lx0P8p4O0Dj8gAFFAgJ4FYRDR2rWtEa1oBIFBjX8X4S95WvcB6wDnVDzOQEWJ9gH2LXQQGEoCDNk4gFguMGQGxcODFQMwUsCmggAIKDE4gtgiOb/rj19yDC8ORFVAgY4HLgJWalH8TCwDrJPxQWrd7Zw0gVv9PuUUx6WBghZSTNLfSBR4DzgN+CVwEPFf6CHaogAIKKDBcYHIgtv79RPEr3rm1KaCAAoMUiJ3IYpZoY1oTCwCTALcCCzZGubmBxrZ/Rzc3/I4ijy0EvwXEwoE2BToRiIf/3xXFgPgHIIoDNgUUUECBcgRmAD4OfBJYHYitf20KKKBAHQTimXTRhuyU9oZXEwsAEfz2wI/qcNUTjyG+3YwZF7m0+GZhFyC28Zgul6TNs1SBeC0gXlOKn51zgbtK7d3OFFBAgTwE4pv9+FYtHvrjG//499mmgAIK1E0gth0/vm5BtYqnqQWA2NYlPljP1ipB/7wngVjwbN6mbGnRU6YTnzwHcCgQCwnZFOhF4Gbgt8UMgT+5iGAvlJ6rgAIJC0xTPOivCqwGLJJwrqamgAJpCMSW0fMBsWB0o1pTCwCBHCu5H9Qo7WYGGw/CezQz9J6j/hhwbLGvZ8+d2UH2As8Df5ygIPC37EUEUECBXAXidc5YNTse+ONXrMfzllwxzFsBBRop8BXgO02MvMkFgBmBe4FpmwjfoJhjFkCssvv3BsVcZqjxKkAsErgj0OSflzJN7KscgQeKmQExQ+D3wH/K6dZeFFBAgVoKxLT+2Io3vuGP32euZZQGpYACCrQWeLrYeeSJ1ofW74imP9AcDuxaP9bkIroSiG3zct72bGXgBGCu5K6uCdVB4DUgXheIrWTiVYGYKfBIHQIzBgUUUKALgfh8uTDwweLXh/z3swtFT1FAgboKNHqGdNMLAHMCd7o4TF9+Ng4B9uzLSPUdJFYijl0RPl3fEI0sIYH4u+2KYlHB2GrQBQUTurimokBiApMCCxVT+VcBPuI3/IldYdNRQIEhgZeB+YuZ6I1UaXoBINBPATZtpH7zgt4COLl5YZcecaz4+QNg6tJ7tkMFRhe4u5gZEDMEriq2Q815Vo73igIKDE4gFmFeDlgWeD+wPBAL+dkUUECB1AXiWSieiRrbUigAxBSzW4BYUMZWrcBLwHrABdUO04jeFwfOKVb/bETABpmcwLPAX4HrJvjlwoLJXWYTUmDgArHW0nuBpSf45Sr9A78sBqCAAgMQiFc2lyiePQcwfDlDplAACImzgXXLIbGXFgKxkvkawKVK8TbgdCCmO9oUqINAbEkTswOuLn6/HniyDoEZgwIKNEJgeiAK3PEBN77dj18xtd8vWRpx+QxSAQUqFjgL2KDiMSrvPpUCQFSlr61cywGGBJ4B1gEuloTJgG9nvFWit0D9BWLtgJgpcOMEv1xPoP7XzQgVqFIgPv/F/tXxoD/0wB+/v9Mdb6pkt28FFGiwwLhiFtQNDc5hfOipFAAil18Dqzf9gjQo/heLxfBi9oXt9YUBf+y6AN4KDRGIbWuGCgJDxYHbgJjhY1NAgbQE4n39mLK/ILBY8dAfv8c2tzYFFFBAgfYELgTWbO/Qeh+VUgEgtqmLxbFs/ROIBcg+BxzbvyFrPdKSwPnAO2odpcEpMLJAvNcWCw1GIeDW4vdYU+DvwFOiKaBArQViin58ex/T9Yce9uP3+P8z1jpyg1NAAQWaIbAi8OdmhDp2lCkVACLT2EM79pq19Vfg+8UUeFckh3mB3wLv7u8lcDQFKhW4b4LCQBQE/lX8iv8ehQObAgpULxAP+bH98buKLaji9/i1QPHt/pTVh+AICiigQJYClwArp5J5agWA1YqHr1SuT5PyiIfejYGYWpx7ezsQ04SWyR3C/JMXiFeB7gRun6AoMFQcuBewKJj8LWCCJQvE9rJRSJ6neEc/9poeeuCPd/anKHk8u1NAAQUUaC0QC34ns/ZZagWAuHyx+nWsWmvrv8A/gQ2Bm/o/dO1GjG2TYn2EVWsXmQEp0B+B2DY0igD3TPArXjGIX/HfHgBe6U8ojqJAbQRmAeae4NfQw/7Qf5u5NpEaiAIKKKBACFwJLJ8SRYoFgE8Av0zpIjUsl1hEbGfg+IbFXUW4bwFOLGZGVNG/fSrQZIF4+I8iQOxIEGuJxLoDNgVSFohdY34CbJlykuamgAIKJCawFnBBSjmlWACInK4ptmlI6Vo1LZcTig/1zzUt8JLjjXc2Y5HE7Uru1+4USEHgZWBr4GcpJGMOCrQhEJ9Rvgt8oY1jPUQBBRRQYLACMbP8fYMNofzRUywAhFJs0RCrsdsGK/APYDPg2sGGMfDRowgQMyL81mfgl8IAaiQQxcENii1caxSWoSjQF4G9gIMS2465L3AOooACCvRRYI0UP6ekWgCI++IqYLk+3iAONbJAfMO3P/CdzBcEm7R4HWBTbxQFFCBeFVo7pQV1vKYKdCHweSB20bEpoIACCtRPILl3/4eIUy4ArJ5ixaZ+PxttR/QnYIdiT/G2T0rswCgCxFTnjRLLy3QU6EQgdg74pDu2dELmsQkLxEyAbyacn6kpoIACTRWIZ8nY5Sy5lnIBIC7Wn1NbtbHhd2As+hVT4eMDz+MNz6Xb8GMRqNOB9bvtwPMUaLBAzAhaz1e0GnwFDb0KgQOBr1bRsX0qoIACCnQlEM+QK3Z1ZgNOSr0AEFuw/a4B1yG3EB8pFkDKdeGv2B3gQuCjuV14881aYBywLfDTrBVMXoGRBeJVgHglwKaAAgooMHiBeIb8/eDDqCaC1AsAoXYZ8KFq+Oy1R4FLgZ2AWCwwtzZ9cW++N7fEzTdbgX2BA7LN3sQVGFsgFos9u3g9RisFFFBAgcEJXAF8YHDDVz9yDgWAlV1oqvobqYcRngV2K/ZG7qGbRp46R/GaytyNjN6gFWhf4Di3wmwfyyOzFZgWiPVyLAxnewuYuAIK1EAgZuj+oQZxVBZCDgWAwIuL+JHKFO24DIGzikUCc1sb4D3FB74Zy0C0DwVqKBCr6K4ExOJ/NgUUGFtgrmIXo9mFUkABBRTou8AlQHx5nHTLpQDw/uKb1lzybepNe0+xON51TU2gy7g/XKxVEWsD2BRISeAhYGngwZSSMhcFKhaILYz/CExR8Th2r4ACCijwP4FYq2j5ogibtEtOD8TnAOskfTXTSO4F4LMZLhQWayEck8YlNAsFxgvEiv9RRb9cDwUU6FhgZ+CIjs/yBAUUUECBbgXiWTF2Kkq+5VQAiKnWNwKxF7ut/gI/LFZEjoeIXFrkvGMuyZpn8gJfAb6TfJYmqEB1AvFqXBYfRqsjtGcFFFCgLYFXgcWA29o6uuEH5VQAiEsV209t1fBrllP4sXbD+sATmSQ9OXAREK8E2BRoskDs8LEKEP+g2hRQoDuBtwLXA+/s7nTPUkABBRRoUyCrxYpzKwDMU2w553t1bf401OCwW4A1gXtrEEs/QpgVuBaYsx+DOYYCFQg8CiwB/LuCvu1SgdwE3lcsFBsFYpsCCiigQPkC8frxghk9a5BbASBumcOBXcu/d+yxQoF4kFir+CakwmFq03XsPRqrkE5Wm4gMRIH2BWKtlV+2f7hHKqBAC4EDgK+ppIACCihQicBhwBcq6bmmneZYAJgZuAOYvqbXxLBGFngW+CRwcSZAewHfzCRX00xH4HRgk3TSMRMFaiEQO8TE7jiL1iIag1BAAQXSEXgamB94JJ2UWmeSYwEgVPYH9mvN4xE1E3iuWBDptzWLq4pwJgEuBD5WRef2qUAFAo8BiwDxCoBNAQXKFYitAf/sQsblotqbAgpkLxDPg9/ITSHXAsB0wO1AvG9ta5bAi8DGwLnNCruraGcpdq6YrauzPUmB/gpsCpza3yEdTYGsBA4BvphVxiargAIKVCcQrxi/G3imuiHq2XOuBYC4GrHdWmy7ZmuewCvAFsBpzQu944jjtYccih0dw3hCrQTi1ZxY9d+mgALVCUwF/M1dAaoDtmcFFMhKYHvgJ1llXCSbcwFgUuCvvlPX2Ns+thfbDIh3jlNvJxe5pp6n+TVTIApySwE3NzN8o1agUQLrAWc1KmKDVUABBeoncBuwOBCfYbJrORcA4mLH9nLnZ3fV00n45WJNgNSvYewFHQ9Xbg2Yzr2bUiaHAnuklJC5KFBzgd8Bq9Y8RsNTQAEF6iywOpDDmmIjXoPcCwCB8nvgo3W+Q41tTIHngTWASxN3im0Qz0s8R9NrnsDDxd65TzYvdCNWoLEC8a3V9S4I2NjrZ+AKKDBYgYuA1QYbwmBHtwAASxT/kMaq67ZmCsQWgVHJu7yZ4bcd9U+Brdo+2gMVqF7gc8DR1Q/jCAooMEzgGGAnVRRQQAEFOhJ4DVgGuKGjsxI72ALA6xfUB6vm39iPAx8qFkhqfjYjZzAj8A/g7akmaF6NErgTWBh4qVFRG6wCaQjEvwN3ALGrkU0BBRRQoD2BeObbpr1D0z3KAsDr13aO4sFqmnQvdRaZ3QO8D4hpyam2bXNdsTTVC9rgvGIRzp81OH5DV6DpAgcBezc9CeNXQAEF+iQQrw0vCNzXp/FqO4wFgP9dmm8A+9T2ShlYuwJXAysB8UOeYotXVeJVh+VTTM6cGiMQi1K+F4ipdDYFFBiMwEzAXcD0gxneURVQQIFGCcSz3n6NiriiYC0A/A92aiC2hJi7Imu77Z9AbJH0qYQfThYDrgMm7x+pIykwkcCGwJmaKKDAwAUOAL428CgMQAEFFKi3wP3AQkCsG5Z9swAw8S3waae0JvMzcTDw5WSyeXMihwBfTDg/U6uvQKxDsUjCBbb6yhuZAm8WiG1iYxZA/G5TQAEFFBhZYBPgdHFeF7AAMPGdEB5/Alb0BklCYPuE35eP9SpudcZKEvdp05LYGjihaUEbrwIJC3wd2Dfh/ExNAQUU6EUgXp2NhcLH9dJJSudaAHjz1VwSuBZwW8Dm3+kvAx8Brmh+KiNm8HHgwkRzM616CsTCOfO78n89L45RZSsQOwLcC0yZrYCJK6CAAiMLxFpFsUB4PNvZCgELACPfCj8BYrV1W/MF4oFlKeCx5qcyYgbnAOskmptp1U9gV+AH9QvLiBTIXuA4t7bK/h4QQAEF3izwY2AHYSYWsAAw8h0xS7EtoO/UpfET8wdgNeDVNNKZKIu5ilcBpk0wN1Oql8DTQNxvT9YrLKNRQAFgUeAmX+30XlBAAQXeEHiq2PbvIU0sALR7D3wB+F67B3tc7QVipeRU35HcxW9la3//pRDgUcDOKSRiDgokKnAxsHKiuZmWAgoo0KnA7sDhnZ6Uw/HOABj9KscWa1FNjy0jbM0XiIU/1gV+2fxU3pRB/BxfAMSaADYFqhKI7Sdvqapz+1VAgZ4F1gZ+1XMvdqCAAgo0XyC2dl8CiPXAbMMELACMfUt8DPiNd00yAo8DSwN3J5PR/xKZoyhYzZRgbqY0eIH4ZnGVwYdhBAooMIZALF58OzCfSgoooEDmAvHq70WZG4yavgWA1nfGL4ANWh/mEQ0R+HOxFUiK6wGsB5zVkOtgmM0S2Aj4ebNCNloFshTYD9g/y8xNWgEFFHhd4AxgYzFGF7AA0PrumBOIaSQustbaqilH7A18qynBdhjnycBmHZ7j4QqMJRCL/s0OPC+TAgrUXmAe4E63Mq79dTJABRSoRiAWLF4YeKCa7tPo1QJAe9fxS8DB7R3qUQ0QiPeBVgSuaUCsnYY4A3AjEB8CbQqUIXA08LkyOrIPBRToi8AlwEp9GclBFFBAgXoJ7AEcWq+Q6heNBYD2rkksCHh9sc1Oe2d4VN0F/gYsA7xQ90C7iC8++MU72/E+qE2BXgXeD1zVayeer4ACfRPYEjihb6M5kAIKKFAPgZuBpYBX6hFOfUZiiNYAACAASURBVKOwAND+tfkQcKl77LYP1oAjDwNiu8cU21eBA1NMzJz6KhCvPy3S1xEdTAEFehWIVxb/7auLvTJ6vgIKNEggdvv6MPCnBsU8sFAtAHRGfyKwRWeneHSNBV4rVjaP6ZKptfjZPgf4ZGqJmU9fBWIxsa/3dUQHU0CBMgROAjYvoyP7UEABBRogEM9oWzUgzlqEaAGgs8swC/B3YMbOTvPoGgvcCywOxEJnqbVYD+Bq4N2pJWY+fRNYDLilb6M5kAIKlCUQxd9zy+rMfhRQQIEaC/wXWAh4pMYx1io0CwCdX47PALEoli0dgWOAz6aTzkSZvAe40qmgiV7datOKYmespGtTQIHmCUwFPApM07zQjVgBBRToSCA+w8dneVubAhYA2oSa4LBYWO2PxSrynZ/tGXUUiFcBPgD8pY7BlRDTOsDZrl9RgmReXRwA7JtXymarQFICZwHrJZWRySiggAITC8QixSsA8Vne1qaABYA2oYYdtihwHfCW7k73rBoK/BVYNuGVQ2Mby9jO0qZAuwJLAvFzYVNAgWYKbAac3MzQjVoBBRRoKfASsLSvKrZ0etMBFgA6Nxs6I1ZYj5XWbekIxI4AsTNAii1mrpwObJhicuZUusD9wFyl92qHCijQT4G3Ag/7ZUU/yR1LAQX6KOBMxS6xLQB0CQdMAdzgO7LdA9bwzGeBmN1xdw1jKyOkmLFyIfDRMjqzj6QFfgTsmHSGJqdAHgK/BVbLI1WzVECBjARuLxbxfiGjnEtL1QJAb5Sx32RsIadjb451OjvelV+/TgGVHEvsDBBrWMTOBzYFRhOI94ZjG0mbAgo0W2C3hGe2NfvKGL0CCnQrMA5YFbi42w5yP88H197vgOOAbXrvxh5qJBDbJ/2qRvGUHcocxYKHTvEuWzaN/l4G3p7o1phpXCGzUKB9gdjK86b2D/dIBRRQoPYCPwG2r32UNQ7QAkDvF2cm4FZg1t67soeaCNwDLAI8V5N4qghjiWImwPRVdG6fjRa4DFip0RkYvAIKDAnE57yHgFkkUUABBRIQiHVNYovi/yaQy8BSsABQDv3GwGnldGUvNRGIBR6/WZNYqgrjg8WaANNWNYD9NlIgh3u/kRfGoBXoUiA+n8TnFJsCCijQdIH4u+yMpicx6PgtAJR3BeLd8XXL686eBizwNLBAsYLygEOpdPjYO/U3wHSVjmLnTRKIwtDlTQrYWBVQYEyBmCobC3vaFFBAgSYLnA+s3eQE6hK7BYDyrsTsxT6U8UqALQ2BI4Fd0khlzCwsAmRwkdtM8UUgtg5zVd02wTxMgQYIzAfc0YA4DVEBBRQYTeBJ4D3AAxL1LmABoHfDCXvYEjih3C7tbYACsRhabAv4zwHG0K+hVwR+7UyAfnHXdpzYISJ2N7EpoEBaAncC70wrJbNRQIGMBLYCTswo30pTtQBQPu8FwBrld2uPAxJIfVvACVktAgzoJqvRsAcBX6tRPIaigALlCJwCbFpOV/aigAIK9FXgQmDNvo6Y+GAWAMq/wHMWrwLEfuu2NAQ+AFyRRiots1gKiHes4pUWW34CqwO/zS9tM1YgeYFdgcOTz9IEFVAgNYGY+h+zce9PLbFB5mMBoBr9bYHYo9KWhsBVwPLAuDTSaZnFHMXuAIu3PNIDUhKI+3tm4PGUkjIXBRQYLxBrveRSyPaSK6BAOgLxTHV8OunUIxMLANVdh3ifOr5Ns6UhsAFwVhqptJXFjMA5vg/ellUqB/2r2PkilXzMQwEF/icwJfAUMLkoCiigQEMELgZWzegLuL5dFgsA1VHPDdwMTF/dEPbcR4FYCHAR4NU+jjnooaYoFlzZaNCBOH5fBH4OeK37Qu0gCgxE4HpgyYGM7KAKKKBAZwKxHXdM/b+3s9M8uh0BCwDtKHV/jHvvdm9XxzM/DZxWx8AqjCn+jvgG8FXAvy8qhK5B118GDq5BHIaggALVCPwQ2LGaru1VAQUUKFVgB+DHpfZoZ28I+IG++pvhPGCt6odxhD4I3AosBrzWh7HqNkSsvnoSMFPdAjOe0gQ+CvyhtN7sSAEF6ibg+kR1uyLGo4ACIwnEYsQfd+p/dTeHBYDqbId6nq14FSAW17I1X2C94t345mfSeQaxh/QvgKU7P9UzGiAQxZ3/NiBOQ1RAge4ElgGu6e5Uz1JAAQX6IvBY8WXbQ30ZLdNBLAD058Kvk/FDY3+E+zfKDcUDcC47AgyXjXUBYpr45/tH7kh9EHgAiC1MbQookK7AtMVCgH72S/cam5kCTRf4VPFlU9PzqHX8/iPQv8tzMrBZ/4ZzpAoF1gBil4ecW6yHcCQQuwXYmi8QK+2u0vw0zEABBVoIxIJac6mkgAIK1FDgFGDzGsaVXEgWAPp3SWcAbgJidwBbswWuBJZvdgqlRD8rcCzwyVJ6s5NBCkQxZ5dBBuDYCijQF4HfFdtq9WUwB1FAAQXaFIiZiLHOlq8itgnWy2EWAHrR6/zcWGTrIldT7xyuhmesDFxSw7gGEdKGQKwu7QKBg9AvZ8ydgaPK6cpeFFCgxgLf9xWuGl8dQ1MgT4F4rTZm1/4mz/T7n7UFgP6b/8Bv2vqPXsGITpmeGDVmtvwI+FgF1nZZvUBM/4972qaAAmkL7AQck3aKZqeAAg0TiGejXRsWc6PDtQDQ/8s3FXAdsHD/h3bEkgVWAP5Scp9N725d4HtA7Bhga4bAk8CCwMPNCNcoFVCgB4GVnL3Wg56nKqBA2QKxxXbsUPJ82R3b3+gCFgAGc3e8F4j3yGNFdVtzBc4EYvq7bWKBKYE9gL2AacSprcBtxUKOJwHP1DZKA1NAgTIFYmvif5fZoX0poIACXQq8CLwPuLHL8z2tSwELAF3ClXDabsBhJfRjF4MTeKX4pvv+wYVQ65FjW7nvABsDk9Q60nyCexU4v3jwjyn/uW5nmc8VN1MFJhaIz33PAVGotSmggAKDFNgdOHyQAeQ6tgWAwV35sL8QWH1wIThyCQIHAV8roZ+Uu4hVXfcF1rMQMLDLHFt/xTf9xwF3DywKB1ZAgToI/At4Vx0CMQYFFMhW4LfAx/0iYjDX3wLAYNyHRp2lmPYSU/JszRR4tNja8YVmht/XqN8DfBn4NDBpX0fOc7C4J88DTi6KjfHtv00BBRSIHWxiLQCbAgooMAiB+Oy8hK8jDYL+9TEtAAzOfmjkqH5d4LUY/IXoIYItioesHrrI6tSYEfAl4FOug1H6dY8p/bEw5QnAz4FY4M+mgAIKTCgQRcHNJFFAAQUGIBCfU9Yunn0GMLxDWgCozz0Q77+4/UV9rkenkVwPLN3pSR5PzIDZGvgMMI8eXQu8Vjz0x7f9ZwExvdemgAIKjCbwzWKRVoUUUECBfgscAXy+34M63sQCzgCoxx0RuwFcVUyHqUdERtGpQKxienWnJ3n8eIHJgHWA2J/6I64T0NZd8TJwafHAf65b+LVl5kEKKPC6wGeBo8RQQAEF+ixwC7As4GuzfYYfPpwFgAFfgAmGX6R4gHTbtPpck04iiSmV8SqArTeBdxS7BsQ6Ac6qmNjyISBW7o+Fc+K1ocd7o/ZsBRTIVOATwC8zzd20FVBgMAKx+0h8WRZFANuABSwADPgCDBt+K+Cn9QrJaNoUiL1M5wYeafN4D2stsCCwCbAWsFSG62Q8DVwG/L548Pcfzdb3jEcooEBrgfj79LrWh3mEAgooUJrAtsDxpfVmRz0JWADoia+Sk2Pxri0r6dlOqxaI7QBjW0Bb+QKxU0ZsmRmLZq4GvLX8IQbe41PANcAfiwf+eC3olYFHZQAKKJCaQKy54nagqV1V81GgvgLOkq3ZtbEAULMLAsQrAPEuebwSYGuWwP3AvIDbrVV73WLNgPcCyxe/VixmX1Q7arm9P1tMg/trsf5H/MzfBsSCfjYFFFCgSoHp3SGkSl77VkCBCQT+Xrz3/4wq9RGwAFCfazFhJLFfejwQTF3P8IxqDIH4ljre0bb1V2CO4h+YKJzFNoMLAwvVYJvB+Fb/duCfxa+/ATcWK/X7sN/fe8TRFFDgdYH47PdSsQCrJgoooEBVAs8X7/3fXNUA9tudgAWA7tz6cdY2wHH9GMgxShWIhZViRXvb4AVipsB8xRaDcxWzBGKdhvjfMxevEcSrBN28ThDf4McifEO/Yu2HB4D7gJgJEv/7TlfnH/xNYAQKKDCiwGPA27RRQAEFKhTYzmeZCnV76NoCQA94fTj1JGDzPozjEOUJxPT/dwH3lNelPVUsEH8PRhFghgm2IBz6b/Et/ZPF+DF9Lbbfi4f/+PbMpoACCjRVIGYmzd/U4I1bAQVqL3CKzzD1vUYWAOp7bSKyaYtFwWIqs605At8FvtSccI1UAQUUUCAzgXjNMPbjtimggAJlC/jef9miJfdnAaBk0Aq6WxS4slgcsILu7bICgfim+J1ATLG0KaCAAgooUDeBWKsmdlSxKaCAAmUKxCzJWKTZ9/7LVC25LwsAJYNW1N3GwGkV9W231Qh8E/hqNV3bqwIKKKCAAj0JnAF8qqcePFkBBRR4s8BWwInC1FvAAkC9r8+E0R0B7NyccLOP1FkA2d8CAiiggAK1FTge2Lq20RmYAgo0UeBIYJcmBp5bzBYAmnPF3wJcWkyraU7UeUd6ILBP3gRmr4ACCihQQ4EfAjvWMC5DUkCBZgr8BVjJRZKbcfEsADTjOg1FORtwPTB7s8LONtrY/zT2o3dHgGxvARNXQAEFaingrMJaXhaDUuD/27sTsNvHev/j78s2k+HoqJQ04BSFUEnjXyJT0miuyNAxhD9RhiJkLGVIZMxUomPKnEMD0SR1QuVoklDGzOxzffXb2Xv3sJ+9nt9wD+/fde1r785Z676/n9e97P2s71q/+85SII5CXqE5BjnLALUVbQMgvxWP7tqlQJxx7pW+wGnARumXaYUKKKCAAhUJHArsVFFeoyqgQDcCcVzyGsAl3QzvqF0I2ADoQrX7MT8BHNj9NM7QgsBk4K3Ad1sYyyEUUEABBRRoQ+BzwG5tDOQYCihQtUD8PeJ7ksxeAjYAMluwptxYt7OA9fIsv7qqfwS8HoguqZcCCiiggAJDC+zjHjVDL4HzK5C9wDnNe5H4sMsrIwEbABkt1nSlPgf4AfCqfCNUVflmwAlVJTasAgoooECqArFBbTQBvBRQQIFRBG5qPty6d5Qn+5xhBWwADOs/0dmXAH4ILDjRgXx+5wK3A0sDf+t8JidQQAEFFFDg2QW8ldBXiAIKjCpwT/Pm/+ZRB/B5wwrYABjWv43Z3wmcD0xqYzDH6FTgJODDnc7g4AoooIACCsxYYEfg8zN+mI9QQAEFphF4AlgHuFCXfAVsAOS7dlNXbic/n3WMnVIvyqdcK1VAAQUUKFDABkCBi2okBXoQ2BU4qId5nKJDARsAHeL2PHQcN7dBz3M63cwL/B5YBvCeqZm38xkKKKCAAu0I2ABox9FRFKhJ4AxgQ8BN/zJfdRsAmS/gVOXPCVwFvLacSMUmORP4QLHpDKaAAgookLrATsChqRdpfQookIzAz4A3AX9PpiILGVnABsDIdEk+8cXAdcDCSVZnUVMLbATEtza8FFBAAQUU6FvABkDf4s6nQL4Cf20+YPzffCNY+dQCNgDKez28BbgUmL28aEUlilsAlgNuLSqVYRRQQAEFchCwAZDDKlmjAsMLPAa8A7hy+FKsoC0BGwBtSaY1Tuw075nzaa3JWNXE16lWBh5Kv1QrVEABBRQoSGBn4OCC8hhFAQW6Edga+Eo3QzvqUAI2AIaS737e+Ic9/oH3SlvgGGCrtEu0OgUUUECBwgRsABS2oMZRoAOB2CfE9xIdwA49pA2AoVegu/lnAc4G1u1uCkduSWAzv7HRkqTDKKCAAgqMR2AXj/IaD5OPUaBagQuBdYAnqhUoOLgNgIIXF5gX+B6wbNkxs08XtwC8tdnAMfswBlBAAQUUSF7ABkDyS2SBCgwm8PNmx//7B6vAiTsVsAHQKW8Sgy8CXAu8MIlqLOKZBG4HXg/8XiIFFFBAAQU6FvgEcGDHczi8AgrkJ3BX8/PoLfmVbsXjFbABMF6pvB+3AnAVMHfeMYqv/pfAG4E4IcBLAQUUUECBrgRsAHQl67gK5CvwMLAKcHW+Eax8PAI2AMajVMZjPgicDrjmaa/nBcC7gcfTLtPqFFBAAQUyFtgVOCDj+i1dAQXaFZgMbAyc1u6wjpaigG8GU1yV7mraA/hsd8M7cksCJwKxMWD8ZeylgAIKKKBA2wI2ANoWdTwF8hb4DLB33hGsfrwCNgDGK1XO444CPlZOnGKTHAFsV2w6gymggAIKDCmwG/C5IQtwbgUUSEYgPvWPT//94CmZJem2EBsA3fqmOPok4FvN0R4p1mdNTwvs5Tc2fDkooIACCnQg8Elg/w7GdUgFFMhL4ArgncCjeZVttRMRsAEwEb18n/ucZlPA5fKNUE3lOwKHVZPWoAoooIACfQjYAOhD2TkUSFsgjvt7M3Bf2mVaXdsCNgDaFs1nvBc0u3wulk/J1Va6J7BvtekNroACCijQtsCngP3aHtTxFFAgG4HbgJWAP2RTsYW2JmADoDXKLAdaCvgesGCW1ddVtJuz1LXeplVAAQW6FLAB0KWuYyuQtsD9zSf/16ddptV1JWADoCvZfMZ9K3AxMEc+JVdb6YFAbNzkpYACCiigwEQEdvebZRPh87kKZCvwGLA2cEm2CSx8wgI2ACZMWMQAmwAnAb4e0l/OOB1gB+CJ9Eu1QgUUUECBRAVsACS6MJalQIcCscv/R5qf+TucxqFTF/ANX+or1F992wKH9zedM01A4BxgQ+DBCYzhUxVQQAEF6hXYw1Nm6l18k1crsCtwULXpDf5PARsAvhimFjgY2FmSLASubY5yvCOLai1SAQUUUCAlgdhcdp+UCrIWBRToVOBIID7s81LAr3z7GphGIBpCcStA3BLglb7Ar4E1gd+kX6oVKqCAAgokJGADIKHFsBQFOhY4tfnZPm4B8FLABoCvgX8RmA34r+aNpTzpC8TZrR9q1iz9aq1QAQUUUCAFgb2AvVMoxBoUUKBTgcuBtYBHOp3FwbMS8BaArJart2LnAi4F3tjbjE40EYHo6MY9XXGs05MTGcjnKqCAAgpUIfBpII6X9VJAgXIFrgNWAR4oN6LJRhGwATCKWh3PWQi4CliqjrhFpLwA2Bi4p4g0hlBAAQUU6ErABkBXso6rQBoCcXtofJDnXlFprEdSVdgASGo5kitmUeD7QPzulYfAzcBGwI/yKNcqFVBAAQUGELABMAC6UyrQk8Cfmjf/v+tpPqfJTMAGQGYLNkC5SzTfBHj+AHM75WgCjwP7NUc8PTHaED5LAQUUUKBggfj6fzQBvBRQoCyBu4C3Av9TVizTtClgA6BNzXLHWga4Avi3ciMWmeya5paA3xaZzlAKKKCAAqMK2AAYVc7nKZCuQGwM/Xa/BZruAqVSmQ2AVFYi/TpWBi4B5km/VCucSuDe5tzXU1RRQAEFFFCgEbAB4EtBgbIEHgRWB75XVizTdCFgA6AL1XLHjK7i+cCc5UYsNll8g2NrIPYI8FJAAQUUqFtgH2DPuglMr0AxAo8C6wHfLiaRQToVsAHQKW+Rg78LOAuYtch0ZYd6qDkucH8g/rHwUkABBRSoU8AGQJ3rburyBGKvpw2Bb5QXzURdCdgA6Eq27HFjl/mTgVnKjllsuhuArYCri01oMAUUUECBZxP4LLCHRAookLXAZGAL4LisU1h87wI2AHonL2bC+Dr5UYCvoTyX9EngRGAvII6L8VJAAQUUqEfABkA9a23ScgW2A44oN57JuhLwzVtXsnWMuwPwhTqiFpsyNo05HPgcEBsGeimggAIKlC+wL7B7+TFNqECxAp9qfnYrNqDBuhOwAdCdbS0j7wh8vpawBef8K3AwcBjwSME5jaaAAgooADYAfBUokK9A3L6zX77lW/nQAjYAhl6BMuaPLqR/EZWxlnFKQPxgeDrweBmRTKGAAgooMJ1A/Jsd/3Z7KaBAXgJxhOfeeZVstakJ2ABIbUXyrcczhfNdu7Eq/11ze8cxQJwe4KWAAgooUI5AnAbzyXLimESBKgQOAXapIqkhOxWwAdApb3WDu6lQeUt+Z7PZY9wacE958UykgAIKVClgA6DKZTd0xgKx59ZOGddv6QkJ2ABIaDEKKeUAYNdCshjjaYG7ga8AxwK3CKOAAgookLWADYCsl8/iKxOID2Fizy0vBVoRsAHQCqODTCdwqF3KYl8TcXzgJU0z4Hz3CSh2nQ2mgAJlC8TJL7uVHdF0ChQhcCQQx/1NLiKNIZIQsAGQxDIUWYQbDBW5rNOE+jNwMvBlIPYM8FJAAQUUyEPAb+vlsU5WWbfA0cB/+ua/7hdBF+ltAHSh6phTBPwBo47XwhPAZcA3gG8BcbuAlwIKKKBAugL++5zu2liZAiEQ9/z/f9/8+2LoQsAGQBeqjjm1gKcD1PV6iGbANc03A74O3FtXfNMqoIACWQgcCHwii0otUoH6BNztv7417zWxDYBeuaudbC/PLK1y7R8BLgLObvYNuL1KhXRDzwLM4TGP6S6QlSnQoYANgA5xHVqBCQjELbR7TOD5PlWBGQrYAJghkQ9oSSDOLT2opbEcJk+BOD0gbhWIzQMvBR7OM0aWVU8CXgEsBSwNrAC8oTlP+IQsE1m0AgpMRCD+PfY88YkI+lwF2heIxpybc7bv6ojTCdgA8CXRp8DOwMF9TuhcyQo8CFzVfDPgv4EbPFGgtbWaDXg18Bpg+ebXMsDcY8zwUeC41mZ2IAUUyEXABkAuK2WdtQjsDsTxnF4KdC5gA6BzYieYTuDjzcYmvvZ8aUwtEA2BnwDXAj9sfnmywLO/RmYFXgr8R/MrPuGPN/yvAmYf58trS+DYcT7WhymgQDkC0YyPpryXAgoMLxD7cfgB2fDrUE0FvgmrZqmTChpvOuLouLgH2UuBZxKIPQOiIfAj4EbgpuZX7C1Q07Vw8/X9JYEpv+LN/suA+LR/ItfWwFcmMoDPVUCBLAVik7HYYdxLAQWGE3gS2B44crgSnLlGARsANa56Gpk3AE5q4Q1MGmmsoi+B+MfyVuBm4FdNQyD+/BsgGgaP9VVIS/PMCSzS/HoR8AJg0eb3eIMfb/gXaGmusYaJ84WjGeelgAJ1CRwK7FRXZNMqkJTA48DmzalJSRVmMeUL2AAof41TTrhOc3Z8vAnyUqANgb8AdwB/BOLPU37/U/O/7wf+DtzX7H4ff27rmguYr/k1f/PGPX6f8n9bsHlz//yp3uQ/t63JRxxnG+CoEZ/r0xRQIF+BOGN8h3zLt3IFshaIbzJu2JySlHUQi89TwAZAnutWUtWrAOcA85YUyixZCdzbnEgQzYD4c3zLYDxXvLmP21imvMmf6NfxxzNn24/ZDjii7UEdTwEFkhc4DIg9ebwUUKBfgdjz6D3Axf1O62wKPC1gA8BXQwoCKzbnxS+UQjHWoEBFAvEG4EsV5TWqAgr8QyD+u48GoJcCCvQn8ACwLvCd/qZ0JgX+VcAGgK+KVATibPJLmnuhU6nJOhQoXWBHID4J9FJAgboE4ps/cQuQlwIK9CNwN7BGc8pRPzM6iwLPIGADwJdGSgKx4dmlwItTKspaFChYIHYB/3zB+YymgAJjC8Su47EJqJcCCnQvEPsQrQb8T/dTOYMCMxawATBjIx/Rr0Dsgn4hsGy/0zqbAlUK7ALEcWBeCihQl0Bs/vmxuiKbVoFBBOIY49WB3w8yu5MqMIaADQBfFikKxG7p5wJvSrE4a1KgIIFdgYMKymMUBRQYn8DRwFbje6iPUkCBEQWuA9YC7hzx+T5NgU4EbAB0wuqgLQjMAZzW7JTawnAOoYACYwh8EjhAGQUUqE7gK8CW1aU2sAL9CVwOrAfE8cNeCiQlYAMgqeWwmOkEJgFfBrZQRgEFOhHYHdi/k5EdVAEFUhY4FvhoygVamwIZC5wKfAR4LOMMll6wgA2Aghe3kGjxGv1086uQSMZQIBmBPYF9k6nGQhRQoC+BrwKb9zWZ8yhQkUAcsRkn7DxZUWajZiZgAyCzBau43DivOI4rm6ViA6Mr0LZANNf2aXtQx1NAgeQFjm8+oUy+UAtUIBOByc2/p5/JpF7LrFjABkDFi59h9A2AE4DYH8BLAQUmLrA34A8rE3d0BAVyE4h/Sz+cW9HWq0CiAo82t6uenGh9lqXANAI2AHxB5CawMnAO8NzcCrdeBRIUiE//41sAXgooUJfAScCmdUU2rQKdCMQmfx8ALupkdAdVoAMBGwAdoDpk5wKLAxcC8buXAgqMLvBZYK/Rn+4zFVAgU4H4pHKTTGu3bAVSEbitOebvZ6kUZB0KjEfABsB4lHxMigLPB84DVkyxOGtSIBOB/YA9MqnVMhVQoD2BU4CN2hvOkRSoTuAXwJrAH6pLbuDsBWwAZL+EVQeYBzgdWKdqBcMrMLrA54BPjf50n6mAApkKxDFlG2Zau2UrMLTA5cB7gXuHLsT5FRhFwAbAKGo+JyWBScAXgW1SKspaFMhE4EBgt0xqtUwFFGhP4DQgNtb1UkCBmROI/TO2AB6buaf5aAXSEbABkM5aWMnEBHYF4tNMX9MTc/TZdQkcAuxSV2TTKqAAcAbwQSUUUGDcAnHMX5ycE5vnxp+9FMhWwDdL2S6dhY8h8B7ga8Dc6iigwLgEDgV2HtcjfZACCpQk8PVm5/KSMplFga4EHmk+9Y+fMb0UyF7ABkD2S2iA6QSWBc4FXqyMAgrMUOALwE4zfJQPUECB0gTOBN5XWijzKNCBwF1AfMD03Q7GdkgFBhGwATAIu5N2LLAI8F/Aazuex+EVyF0g9s/YIfcQ1q+AAjMt8M1mE7OZfqJPUKAigRuAdwG3VpTZqBUI2ACoYJErjTgncLybHFW6+sYer8DhwPbjfbCPU0CBYgTOBtYrJo1BFGhf4CJgfXf6y4TwrQAAF25JREFUbx/WEYcXsAEw/BpYQXcC8fr+NLCXmwN2h+zIWQscCWybdQKLV0CBUQS+Bbx7lCf6HAUqEPhSc3vcExVkNWKFAjYAKlz0CiNvChwDzFFhdiMr8GwCRwMfk0gBBaoTiNvk1q0utYEVeHaBONovjpU+VigFShawAVDy6pptaoE3AGcBL5BFAQX+KRCNsa30UECB6gRis9x1qkttYAWeWeBO4P3AlSIpULqADYDSV9h8UwvE5oDRBFhJFgUUeEogPuXYUgsFFKhO4HxgrepSG1iBsQWub26JcbM/XyFVCNgAqGKZDTmVQNwGcBSwmSoKKMBxwEd1UECB6gQuANasLrWBFfhXgW8AHwEeFEeBWgRsANSy0uacXiA+9TwCmE0aBSoWOMFmWMWrb/SaBS4E3lkzgNmrF5gM7APsDcSfvRSoRsAGQDVLbdAxBN4MxFnIC6ujQKUCJzaffFQa39gKVCsQR5ytXm16g9cucD+wCXBO7RDmr1PABkCd627qpwUWBeI4pBVEUaBCgZOBD1WY28gK1C5wMbBa7Qjmr1Lg180JGL+qMr2hFfBsdF8DCjwlMA/wVWB9PRSoTOBUYOPKMhtXAQXgEuAdQihQmUB84h9N73sry21cBaYR8BsAviAUeFog9gU4HJhdFAUqETgN2KiSrMZUQIGnBS4D3i6IApUIPAHs29zz/2QlmY2pwDMK2ADwxaHAtAIrNvsCLCaMAhUInAFsUEFOIyqgwLQC3wH+nygKVCBwF7AhcGkFWY2owLgEbACMi8kHVSbwXOB0YNXKchu3PoE4/uiD9cU2sQLVC1wBvK16BQFKF/gx8D7g1tKDmk+BmRGwATAzWj62JoFJwJ7Nr1lqCm7WqgTiFIz3V5XYsAooEAJXAm+RQoGCBY4BtgMeLTij0RQYScAGwEhsPqkigXWA2Cl9gYoyG7UegbOB99YT16QKKNAIXAXEUbheCpQm8DCwDXB8acHMo0BbAjYA2pJ0nJIFlgTiq9LLlhzSbFUKxI7I764yuaEVqFvgu8Cb6iYwfYECNwEfAH5eYDYjKdCagA2A1igdqHCBOYEDge0Lz2m8ugTObc5Driu1aRVQ4PvAyjIoUJDAWcDmHvFX0IoapTMBGwCd0TpwoQLvAY7zloBCV7e+WOcDcZuLlwIK1CVwNbBSXZFNW6hAfOV/N+CLheYzlgKtC9gAaJ3UASsQWKK5JWC5CrIasWyBbwNrlR3RdAooMIbANcDrlVEgc4Ebm6/835B5DstXoFcBGwC9cjtZQQJzAAd5S0BBK1pnlIuANeqMbmoFqha4Fnht1QKGz13Ar/znvoLWP5iADYDB6J24EIH1mp1mPSWgkAWtLMYlwOqVZTauAgrAdcCKQiiQoYBf+c9w0Sw5LQEbAGmth9XkKbA4cCrwujzLt+qKBS4D3lFxfqMrUKvAj4Hlaw1v7mwF4qv+GwK/yDaBhSuQgIANgAQWwRKKEJgV2KP5NamIRIaoQeByYNUagppRAQWmEfgp4D42vihyEZgMHAvsCDyYS9HWqUCqAjYAUl0Z68pV4G3A14AX5RrAuqsSuAJYparEhlVAgRC4HlhGCgUyELizOd7vvAxqtUQFshCwAZDFMllkZgLzA0cD62dWt+XWJ3AlEE0rLwUUqEvg58Cr64ps2gwF4ja1DwG3ZVi7JSuQrIANgGSXxsIKENgUOAqYp4AsRihT4LvAW8qMZioFFHgWgbiHemmFFEhU4DFgf2Af4MlEa7QsBbIVsAGQ7dJZeCYCrwBOA16TSb2WWZfAD4A31hXZtAooAPwSWEoJBRIU+FWz0d/PEqzNkhQoQsAGQBHLaIjEBWYDdneDwMRXqc7yrgZWrjO6qRWoWiDeZEWD2kuBVASmbPS3E/D3VIqyDgVKFLABUOKqmilVgZWAk4AlUy3QuqoT+CEQr0svBRSoS+Am/y2qa8ETT3t7s9HftxOv0/IUKELABkARy2iIjATmAg4AtgP87y+jhSu01OuA1xWazVgKKPDMAr8GFhdIgQQEzgS2Bv6WQC2WoEAVAr4BqWKZDZmgwGrA8cALE6zNkuoR+DGwYj1xTaqAAo3Ab4GXqaHAgAL3ANsCpw5Yg1MrUKWADYAql93QiQgsAHwJ2CSReiyjPoGfAsvXF9vEClQvcAvw0uoVBBhK4OLmK/9/GqoA51WgZgEbADWvvtlTEVgfOAJYKJWCrKMageuB5apJa1AFFJgicCuwmBwK9CxwH7ALcCwQm/55KaDAAAI2AAZAd0oFxhBYGDgSeJ86CvQocAOwTI/zOZUCCqQh8Htg0TRKsYpKBC4BtgDiteelgAIDCtgAGBDfqRUYQ+D9TSPg39VRoAeBOAv8VT3M4xQKKJCWwB/dgyatBSm4Gj/1L3hxjZangA2APNfNqssWWLA5KWDLsmOaLgGBOAt8qQTqsAQFFOhXIO69XqTfKZ2tQoG41z8+9f9DhdmNrECyAjYAkl0aC1OAtYGj/ZTGV0KHAjcCr+xwfIdWQIE0Bf4MPD/N0qyqAIF7gU94r38BK2mEIgVsABS5rIYqSCA2BoyTAjYsKJNR0hGIs8CXTKccK1FAgZ4Ebgee19NcTlOXwPnAVsBtdcU2rQL5CNgAyGetrLRugTWBo9y1ue4XQQfpfwMs0cG4DqmAAmkL3AG410zaa5RbdX9pPvU/ObfCrVeB2gRsANS24ubNWWBuYC9gZ2BSzkGsPRmBOAv85clUYyEKKNCXwF0ePdsXdfHzxHF+pwA7AfG68lJAgcQFbAAkvkCWp8AYAnFue5yhu6I6CkxQIM4Cf+kEx/DpCiiQn8DfgNhw1kuBiQj8FtgauGwig/hcBRToV8AGQL/ezqZAWwKzAtsA+wLztjWo41QnEOcxL1ZdagMroMA9wPwyKDCiwOPNbYmfAv4+4hg+TQEFBhKwATAQvNMq0JJAfHr7ZWD1lsZzmLoE4izwReuKbFoFFABil/b5lFBgBIGfNEf7xe9eCiiQoYANgAwXzZIVGENgY+Bgj3XytTGTAnEUmGeBzySaD1egAIH7/fZYAavYb4S7gT2a44mf7HdqZ1NAgTYFbAC0qelYCgwrEF/n3Ke5NcBNAoddi1xmj6PAXpBLsdapgAKtCcTXtmNjWS8FxiNwJrAdEDv9eymgQOYCNgAyX0DLV2AMgdgkMI4MfIM6CsxAII4C8yxwXyYK1CfwEDBnfbFNPJMCNwHbusnfTKr5cAUSF7ABkPgCWZ4CIwrEf9ubAId41vOIgnU8LY5s8izwOtbalApMLfAwMIckCjyDwIPNbYX7A4+qpIACZQnYAChrPU2jwPQCcczTZ5oO/izyKDCdQBwFtpAqCihQnUC8qZututQGHo/A+c2thHFKjJcCChQoYAOgwEU1kgJjCMTtAIcDK6ijwFQCcRSYZ4H7klCgPoHHgDhO1kuBKQK/AnYALpFEAQXKFrABUPb6mk6BqQWm3BZwoKcF+MJoBO7zLHBfCwpUKfAE4LfCqlz6fwkdjeADgC/4dX9fEArUIWADoI51NqUCUwvMA+wC7OY9oNW/MOIoMM8Cr/5lIECFApMrzGzkaQXiKL9Tm58H3N3fV4cCFQnYAKhosY2qwHQCSwCfB9ZWplqBOAps3mrTG1yBOgXik//4BoBXvQLXAdsD19RLYHIF6hWwAVDv2ptcgSkCqwKHAUtLUp1AHAXmWeDVLbuBKxeYBDxeuUGt8W8DPgl8DfBbILW+CsxdvYANgOpfAgIo8JTA7M1JAXu4KVxVr4jYCdyjwKpacsMq8NTu/x7tVtcLIY71OxSIPYDim19eCihQsYANgIoX3+gKjCEQO8Lv2uwE7BvD8l8isRN4NH+8FFCgHoH4u/3heuJWnTTu8z+ruc//d1VLGF4BBf4pYAPAF4MCCowl8GJgX2BjwL8nyn2NxH3AHgVW7vqaTIGxBOYC4hNhr7IFLm/e+P+07JimU0CBmRXwB/uZFfPxCtQl8DrgEODNdcWuJm3cA+pRYNUst0EVeEog9v3wa+DlvhhuBPYCziw3oskUUGAiAjYAJqLncxWoR2Cd5sSAxeuJXE3SaAC4GVQ1y21QBZ46+SOOAPUqS+Cu5pt7R7rJY1kLaxoF2hawAdC2qOMpUK5A3Cu+NbA7sHC5MatLFrcAeCRYdctu4IoFngPcV3H+0qJHMyc2+ItfD5QWzjwKKNC+gA2A9k0dUYHSBeZpTgyIo4TmLz1sBfmisRObAXopoEAdAgsAd9cRteiUcZLDicCngduLTmo4BRRoVcAGQKucDqZAVQILNRsMbQ/EplJeeQrMCTySZ+lWrYACIwjEaS9/G+F5PiUNgSk7++8G3JJGSVahgAI5CdgAyGm1rFWBNAVeBOwJbOaO8mku0Ayqig3BHsqycotWQIFRBKJ5G/eLe+UncBmwM3B9fqVbsQIKpCJgAyCVlbAOBfIXeGWzAdF6Hh2Y1WLGhmDuCJ7VklmsAhMSeC5w54RG8Ml9C1wJxG13V/c9sfMpoEB5AjYAyltTEykwtMCrm28EvM9GwNBLMa75Y0MwN44aF5UPUqAIgdjE9S9FJCk/xA+AA4Dzyo9qQgUU6EvABkBf0s6jQH0CywB7ADYC0l772MjRHcHTXiOrU6BNgecDf25zQMdqXeAaYH/f+Lfu6oAKKOCnc74GFFCgB4Flm6MDbQT0gD3CFLEh2D0jPM+nKKBAngKLAH/Ks/Tiq457+/cDziw+qQEVUGAwAb8BMBi9EytQncBKTSNg7eqSpx04NgRzR/C018jqFGhTIDZu/UObAzrWhAV+3uyh801g8oRHcwAFFFDgWQRsAPjyUECBvgVWbm4NWKPviZ1vTIG4H9gNwXxxKFCPwKLA7+uJm3TS+Kp/fOJ/gW/8k14ni1OgKAEbAEUtp2EUyEog9giI44w2BCZlVXlZxT4PuKOsSKZRQIFnEVgMuFWhQQW+DxzoPf6DroGTK1CtgA2Aapfe4AokI7BUc7zR+sCsyVRVTyH/7png9Sy2SRUA/AbAcC+DC5tP/KMB4KWAAgoMImADYBB2J1VAgTEEXgLsCGwJzKlQbwJzAQ/3NpsTKaDA0AL/Bvx16CIqmj/u6Y+v+H8WuLai3EZVQIFEBWwAJLowlqVAxQKxQVXcGrA5MG/FDn1EfxyYrY+JnEMBBZIRmMOmXy9r8RjwdeAA4Je9zOgkCiigwDgEbACMA8mHKKDAIALzAR8BdgFeOEgF5U8a9wG/tPyYJlRAgekE4hsA8U0Ar/YFHgCOBw51s8X2cR1RAQUmLmADYOKGjqCAAt0KzA7E/gC7ArFfgFd7At8B3t7ecI6kgAKZCPwIWCGTWnMpMzZT/TLwJY9WzWXJrFOBOgVsANS57qZWIEeBWYB3NbcHvDHHAAnWHD+s/meCdVmSAgp0K3AasEG3U1Qz+o3AIcApwCPVpDaoAgpkK2ADINuls3AFqhZYuWkErAtEY8BrNIFNga+N9lSfpYACGQt8HDgs4/pTKP2q5mv+5wNPplCQNSiggALjEbABMB4lH6OAAqkKvAzYFtgMmD/VIhOua3HgtwnXZ2kKKNCNwGvdkX4k2PiEPzb2+yLwk5FG8EkKKKDAwAI2AAZeAKdXQIFWBOK0gA2B+FTLfQLGR3oz8B/je6iPUkCBwgQmAbcBCxeWq6s4cX//CcARwB+7msRxFVBAgT4EbAD0oewcCijQl0DcDrBK0whYC/DvuGeW3xfYs6+FcR4FFEhO4Bhgi+SqSqugnzUb+8WtUg+lVZrVKKCAAqMJ+MPxaG4+SwEF0hdYGtge2AiYJ/1ye61wMrAM8IteZ3UyBRRISWBV4NKUCkqklseBc5vd/K9MpCbLUEABBVoTsAHQGqUDKaBAogLzNccIbtO86U20zF7Lih/6V+t1RidTQIHUBOJnwPiEO5qBXnA7cFLzif/vBFFAAQVKFbABUOrKmksBBcYSeBuwNbAeMHvFRGsAF1Wc3+gKKPAPgbgFIG4FqPWKb0Nd0bzpPwd4rFYIcyugQD0CNgDqWWuTKqDA0wLPAz7cNANeUhnMd4C3V5bZuAooMLZANEJvAJasDOg+4AzgcG+FqmzljauAAm6Q5WtAAQWqFoidsGOzwPgULD4Vj/9d8hX3ti7f/MBfck6zKaDA+AXWBs4b/8OzfuQPgWOB04EHs05i8QoooMCIAn4DYEQ4n6aAAsUJvLD5VsBHgJcXl+4fgdz5v9CFNZYCExT4JvDeCY6R6tP/CpwCfNVP+1NdIutSQIE+BWwA9KntXAookIvACsCWwMbA3LkUPYM6Yzfr+Or/E4XkMYYCCrQnsADwY+Bl7Q056EhPAlcDJwMe4TfoUji5AgqkJmADILUVsR4FFEhJYMHmGMHNgeVSKmwma7kFeBPw55l8ng9XQIF6BKLx+d/AvBlH/iNwAnA8cGvGOSxdAQUU6EzABkBntA6sgAKFCbwG2BTYAIhNBHO5/gC8xR+Gc1ku61RgUIE4KeWCzL75FPfyf6v5pP8yv+U06OvHyRVQIAMBGwAZLJIlKqBAUgKzAqs3twesC8yVVHXTFnMjsA7wm4RrtDQFFEhLYFUg9gSYP62ypqkmvuIftzXFV/zPAu5PuFZLU0ABBZISsAGQ1HJYjAIKZCYwH/BuYJPm/vqU/k49v2lS3JuZqeUqoMDwAksAZwOvGr6UaSq4qTm+L974x61NXgoooIACMymQ0g+rM1m6D1dAAQWSEnhJ84Y7bhFYasDKYsfr3YDjgMkD1uHUCiiQt8BzgAObDVGHPCL1L8CZzVf8r82b1OoVUECB4QVsAAy/BlaggALlCbwaWL/51deu2g8DJwJ7ANEE8FJAAQXaEFgeOBxYuY3BxjnG3c03EM4ArvC+/nGq+TAFFFBgHAI2AMaB5EMUUECBCQi8Dvgg8AHgRRMY55meGjv7H938uqOD8R1SAQUUCIFoAHwcWA+YrQOSB4Bzm6/4Xww82sEcDqmAAgpUL2ADoPqXgAAKKNCTwCzNUXzRDFgNWGzEH6Ljh+IbgIuA84DrgNgQy0sBBRToQ2BhYA1gTeAdQByXOup1O/AD4OtA7FsSO/p7KaCAAgp0KGADoENch1ZAAQWeRSBOE4gmwOLAy5sfouOe29hYcO7m/v37gCm//hf4JfBr4HFlFVBAgQQEorEZ+5+8AnglELc8xd9f8zSnCMT//56p/h6LP9/c/D0Wv8ffb14KKKCAAj0K2ADoEdupFFBAAQUUUEABBRRQQAEFFBhKwAbAUPLOq4ACCiiggAIKKKCAAgoooECPAjYAesR2KgUUUEABBRRQQAEFFFBAAQWGErABMJS88yqggAIKKKCAAgoooIACCijQo4ANgB6xnUoBBRRQQAEFFFBAAQUUUECBoQRsAAwl77wKKKCAAgoooIACCiiggAIK9ChgA6BHbKdSQAEFFFBAAQUUUEABBRRQYCgBGwBDyTuvAgoooIACCiiggAIKKKCAAj0K2ADoEdupFFBAAQUUUEABBRRQQAEFFBhKwAbAUPLOq4ACCiiggAIKKKCAAgoooECPAjYAesR2KgUUUEABBRRQQAEFFFBAAQWGErABMJS88yqggAIKKKCAAgoooIACCijQo4ANgB6xnUoBBRRQQAEFFFBAAQUUUECBoQRsAAwl77wKKKCAAgoooIACCiiggAIK9ChgA6BHbKdSQAEFFFBAAQUUUEABBRRQYCgBGwBDyTuvAgoooIACCiiggAIKKKCAAj0K2ADoEdupFFBAAQUUUEABBRRQQAEFFBhKwAbAUPLOq4ACCiiggAIKKKCAAgoooECPAjYAesR2KgUUUEABBRRQQAEFFFBAAQWGErABMJS88yqggAIKKKCAAgoooIACCijQo4ANgB6xnUoBBRRQQAEFFFBAAQUUUECBoQRsAAwl77wKKKCAAgoooIACCiiggAIK9ChgA6BHbKdSQAEFFFBAAQUUUEABBRRQYCgBGwBDyTuvAgoooIACCiiggAIKKKCAAj0K2ADoEdupFFBAAQUUUEABBRRQQAEFFBhK4P8AGug5XMvySWsAAAAASUVORK5CYII=\" />\n\t\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"pure-u-2-3\">\n\t\t\t\t\t<h4 id=\"status_github\"><%:GitHub Connection%><br /><span id=\"_github_status\" class=\"red\"><%:Touch Check%></span></h4>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t  </div>\n\t<script>\n\t\t//<![CDATA[\n\t\tvar imgs = document.getElementsByTagName('img');\n\t\tfor (var i = 0 ; i < imgs.length; i++) {\n\t\t\tdocument.getElementsByTagName('img')[i].setAttribute(\"oncontextmenu\",\"return false;\");\n\t\t\tdocument.getElementsByTagName('img')[i].setAttribute(\"ondragstart\",\"return false;\");\n\t\t}\n\t\tXHR.poll(5, '<%=api.url(\"index_status\")%>', null,\n\t\t\tfunction (x, data) {\n\t\t\t\tif (data) {\n\t\t\t\t\tif (true) {\n\t\t\t\t\t\tvar status_node = document.getElementById('status_node');\n\t\t\t\t\t\tif (status_node) {\n\t\t\t\t\t\t\tvar text = 'Core<br />';\n\t\t\t\t\t\t\tif (data[\"global_status\"])\n\t\t\t\t\t\t\t\ttext += '<span class=\"green\"><%:RUNNING%></span>';\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\ttext += '<span class=\"red\"><%:NOT RUNNING%></span>';\n\t\t\t\t\t\t\tstatus_node.innerHTML = text;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\tfunction check_connect(type, url) {\n\t\t\tvar s = document.getElementById('_' + type + '_status');\n\t\t\tif (s) {\n\t\t\t\tvar div = s.parentNode.parentNode.parentNode.parentNode;\n\t\t\t\tdiv.removeAttribute('onclick');\n\t\t\t\ts.innerHTML = '<%:Check...%>';\n\t\t\t\tvar sendDate = (new Date()).getTime();\n\t\t\t\tXHR.get('<%=api.url(\"connect_status\")%>', {\n\t\t\t\t\t\ttype: type,\n\t\t\t\t\t\turl : url\n\t\t\t\t\t},\n\t\t\t\t\tfunction(x, rv) {\n\t\t\t\t\t\tif (rv.ping_type && rv.ping_type == \"curl\") {\n\t\t\t\t\t\t\tvar use_time = rv.use_time;\n\t\t\t\t\t\t\tif (use_time < 1000) {\n\t\t\t\t\t\t\t\ts.className=\"green\";\n\t\t\t\t\t\t\t} else if (use_time < 2000) {\n\t\t\t\t\t\t\t\ts.className=\"yellow\";\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\ts.className=\"red\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\ts.innerHTML = use_time + \" ms\";\n\t\t\t\t\t\t} else if (rv.status) {\n\t\t\t\t\t\t\ts.className=\"green\";\n\t\t\t\t\t\t\ts.innerHTML = \"<%:Working...%>\";\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\ts.className=\"red\";\n\t\t\t\t\t\t\ts.innerHTML = '<%:Problem detected!%>';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tdiv.setAttribute('onclick','check_connect(\"' + type + '\",\"' + url + '\")');\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t}\n\t\t\treturn false;\n\t\t}\n//]]>\n\t</script>\n</fieldset>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/haproxy/js.htm",
    "content": "<%\nlocal api = require \"luci.passwall2.api\"\nlocal appname = api.appname\n-%>\n<script src=\"<%=resource%>/view/<%=appname%>/Sortable.min.js\"></script>\n\n<style>\ntable .cbi-button-up,\ntable .cbi-button-down,\n.td.cbi-section-actions .cbi-button-up,\n.td.cbi-section-actions .cbi-button-down {\n\tdisplay: none !important;\n}\n\n.drag-handle {\n\tvertical-align: middle;\n\tcursor: grab !important;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tfont-size: 20px;\n\tfont-weight: 100;\n\tpadding: 0 !important;\n\tline-height: inherit;\n\tuser-select: none;\n\talign-self: stretch;\n\tbackground-color: transparent;\n}\n\n.drag-handle:hover {\n\tbackground: transparent;\n}\n\n.dragging-row {\n\tbackground-color: rgba(131, 191, 255, 0.7) !important;\n\tbox-shadow: 0 4px 6px rgba(0,0,0,0.1);\n}\n\n@media screen and (max-width: 1152px) {\n\t#cbi-<%=appname%>-haproxy_config .cbi-section-table-titles {\n\t\tdisplay: none !important;\n\t}\n}\n\n@media screen and (min-width: 1152px) {\n\t#cbi-<%=appname%>-haproxy_config input[id*=\".<%=appname%>.\"][id$=\".haproxy_port\"],\n\t#cbi-<%=appname%>-haproxy_config input[id*=\".<%=appname%>.\"][id$=\".lbweight\"] {\n\t\twidth: 100px !important;\n\t\tmin-width: unset !important;\n\t\tmax-width: unset !important;\n\t\ttext-align: center !important;\n\t}\n\n\t#cbi-<%=appname%>-haproxy_config select[id*=\".<%=appname%>.\"][id$=\".export\"] {\n\t\twidth: 130px !important;\n\t\tmin-width: unset !important;\n\t\tmax-width: unset !important;\n\t}\n\n\t#cbi-<%=appname%>-haproxy_config select[id*=\".<%=appname%>.\"][id$=\".backup\"] {\n\t\twidth: 100px !important;\n\t\tmin-width: unset !important;\n\t\tmax-width: unset !important;\n\t}\n}\n</style>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t\tlet monitorStartTime = Date.now();\n\n\t\tconst monitorInterval = setInterval(function () {\n\t\t\tif (Date.now() - monitorStartTime > 3000) {\n\t\t\t\tclearInterval(monitorInterval);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tconst rows = Array.from(document.querySelectorAll(\"tr.cbi-section-table-row\"))\n\t\t\t\t.filter(row => !row.classList.contains(\"placeholder\")); // 排除无配置行\n\n\t\t\tif (rows.length <= 1) return;\n\n\t\t\tconst lastRow = rows[rows.length - 1];\n\t\t\tconst secondLastRow = rows[rows.length - 2];\n\n\t\t\tconst lastInput = lastRow.querySelector(\"input[name$='.haproxy_port']\");\n\t\t\tconst secondLastInput = secondLastRow.querySelector(\"input[name$='.haproxy_port']\");\n\n\t\t\tif (!lastInput || !secondLastInput) return;\n\n\t\t\t// 如果还没绑定 change 事件，绑定一次\n\t\t\tif (!lastInput.dataset.bindChange) {\n\t\t\t\tlastInput.dataset.bindChange = \"1\";\n\t\t\t\tlastInput.addEventListener(\"input\", () => {\n\t\t\t\t\tlastInput.dataset.userModified = \"1\";\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// 如果用户手动修改过，就不再自动设置\n\t\t\tif (lastInput.dataset.userModified === \"1\") return;\n\n\t\t\tconst lastVal = lastInput.value.trim();\n\t\t\tconst secondLastVal = secondLastInput.value.trim();\n\n\t\t\tconst lbssHiddenInput = lastRow.querySelector(\"div.cbi-dropdown > div > input[type='hidden'][name$='.lbss']\");\n\t\t\tif (!lbssHiddenInput) {\n\t\t\t\tif (lastVal !== secondLastVal && secondLastVal !== \"\" && secondLastVal !== \"0\") {\n\t\t\t\t\tlastInput.value = secondLastVal;\n\t\t\t\t}\n\t\t\t}\n\t\t}, 300);\n\t});\n\n\t//节点列表添加拖拽排序\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t\tfunction initSortableForTable() {\n\t\t\tvar section = document.getElementById(\"cbi-<%=appname%>-haproxy_config\");\n\t\t\tif (!section) return;\n\n\t\t\thideSortColumn(section);\n\n\t\t\t// === 插入 drag handle ===\n\t\t\tvar rows = section.querySelectorAll(\"tr\");\n\t\t\trows.forEach(function(row) {\n\t\t\t\tvar btn = row.querySelector(\".cbi-button-remove:last-of-type\");\n\t\t\t\tif (!btn) return;\n\t\t\t\tif (btn.nextElementSibling && btn.nextElementSibling.classList.contains(\"drag-handle\")) return;\n\t\t\t\tvar handle = document.createElement(\"span\");\n\t\t\t\thandle.className = \"drag-handle center\";\n\t\t\t\thandle.title = \"<%:Drag to reorder%>\";\n\t\t\t\thandle.innerHTML = \"⠿\";\n\t\t\t\tbtn.after(handle);\n\t\t\t});\n\n\t\t\t// === 初始化 Sortable ===\n\t\t\tvar table = section.getElementsByTagName(\"table\")[0];\n\t\t\tif (!table) return;\n\t\t\tvar root = table.tBodies[0] || table;\n\t\t\tif (root._sortable_initialized) return root._sortable_instance;\n\t\t\troot._sortable_initialized = true;\n\n\t\t\t// 保存原始顺序\n\t\t\troot._origOrder = getCurrentOrder(root);\n\n\t\t\ttry {\n\t\t\t\troot._sortable_instance = Sortable.create(root, {\n\t\t\t\t\thandle: \".drag-handle\",\n\t\t\t\t\tdraggable: \"tr.cbi-section-table-row\",\n\t\t\t\t\tanimation: 150,\n\t\t\t\t\tghostClass: \"dragging-row\",\n\t\t\t\t\tfallbackOnBody: true,\n\t\t\t\t\tforceFallback: false,\n\t\t\t\t\tswapThreshold: 0.65,\n\t\t\t\t\tonEnd: function (evt) {\n\t\t\t\t\t\tupdateHiddenInput(root, section);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn root._sortable_instance;\n\t\t\t} catch (e) {\n\t\t\t\troot._sortable_initialized = false;\n\t\t\t\tconsole.error(\"Sortable init failed:\", e);\n\t\t\t}\n\t\t}\n\n\t\t// 获取 table 当前行顺序\n\t\tfunction getCurrentOrder(root) {\n\t\t\tvar order = [];\n\t\t\tvar rows = root.querySelectorAll(\"tr.cbi-section-table-row\");\n\t\t\trows.forEach(function (tr) {\n\t\t\t\tvar id = tr.id || \"\";\n\t\t\t\tif (id.startsWith(\"cbi-<%=appname%>-\"))\n\t\t\t\t\tid = id.replace(\"cbi-<%=appname%>-\", \"\");\n\t\t\t\torder.push(id);\n\t\t\t});\n\t\t\treturn order;\n\t\t}\n\n\t\t// 拖拽完成后更新 hidden input\n\t\tfunction updateHiddenInput(root, section) {\n\t\t\tvar newOrder = getCurrentOrder(root);\n\t\t\tvar changed = newOrder.join(\" \") !== root._origOrder.join(\" \");\n\t\t\tvar hiddenInput = section.querySelector('input[type=\"hidden\"][id^=\"cbi.sts.\"]');\n\t\t\tif (hiddenInput) {\n\t\t\t\thiddenInput.value = changed ? newOrder.join(\" \") : \"\";\n\t\t\t}\n\t\t}\n\n\t\t// 隐藏18.06 up/down 列\n\t\tfunction hideSortColumn(section) {\n\t\t\tvar table = section.querySelector(\"table\");\n\t\t\tif (!table) return;\n\t\t\tvar ths = Array.prototype.slice.call(table.querySelectorAll(\"tr.cbi-section-table-titles > th\"));\n\t\t\tvar dataRows = table.querySelectorAll(\"tr.cbi-section-table-row\");\n\t\t\tif (!ths.length || !dataRows.length) return;\n\t\t\tvar sortCol = -1;\n\t\t\tfor (var i = 0; i < ths.length; i++) {\n\t\t\t\tvar hasSort = false, invalid = false;\n\t\t\t\tdataRows.forEach(function(tr) {\n\t\t\t\t\tvar td = tr.querySelectorAll(\":scope > td\")[i];\n\t\t\t\t\tif (!td) return;\n\t\t\t\t\tif (td.querySelector(\".cbi-button-edit, .cbi-button-remove\")) invalid = true;\n\t\t\t\t\tif (td.querySelector(\".cbi-button-up, .cbi-button-down\")) hasSort = true;\n\t\t\t\t});\n\t\t\t\tif (!invalid && hasSort) { sortCol = i; break; }\n\t\t\t}\n\t\t\tif (sortCol === -1) return;\n\t\t\tvar rows = [table.querySelector(\"tr.cbi-section-table-titles\")].concat(\n\t\t\t\tArray.prototype.slice.call(dataRows),\n\t\t\t\tArray.prototype.slice.call(table.querySelectorAll(\"tr.cbi-section-table-descr\"))\n\t\t\t);\n\t\t\trows.forEach(function(tr) {\n\t\t\t\tvar cells = Array.prototype.filter.call(tr.children, function(el) {\n\t\t\t\t\treturn el.tagName === \"TH\" || el.tagName === \"TD\";\n\t\t\t\t});\n\t\t\t\tif (cells[sortCol]) cells[sortCol].style.display = \"none\";\n\t\t\t});\n\t\t}\n\n\t\t// === 等待 TypedSection 行稳定 ===\n\t\t(function waitStable() {\n\t\t\tvar last = 0, stable = 0;\n\t\t\tvar THRESHOLD = 5;\n\t\t\tfunction tick() {\n\t\t\t\tvar count = document.querySelectorAll(\"tr.cbi-section-table-row\").length;\n\t\t\t\tif (count && count === last) stable++;\n\t\t\t\telse stable = 0;\n\n\t\t\t\tlast = count;\n\t\t\t\tif (stable >= THRESHOLD)\n\t\t\t\t\tsetTimeout(initSortableForTable, 200);\n\t\t\t\telse\n\t\t\t\t\trequestAnimationFrame(tick);\n\t\t\t}\n\t\t\ttick();\n\t\t})();\n\t});\n\t//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/haproxy/status.htm",
    "content": "<%\nlocal api = require \"luci.passwall2.api\"\nlocal haproxy_enable = api.uci_get_type(\"global_haproxy\", \"balancing_enable\", \"0\")\nlocal console_port = api.uci_get_type(\"global_haproxy\", \"console_port\", \"\")\n-%>\n<p id=\"_status\"></p>\n\n<script type=\"text/javascript\">//<![CDATA[\n\tconst haproxy_enable = \"<%=haproxy_enable%>\";\n\tif (haproxy_enable == \"1\") {\n\t\tfunction openwebui(){\n\t\t\tvar url = window.location.hostname + \":<%=console_port%>\";\n\t\t\twindow.open('http://' + url, 'target', '');\n\t\t}\n\t\tXHR.poll(5, '<%=api.url(\"haproxy_status\")%>', null,\n\t\t\tfunction(x, result) {\n\t\t\t\tif (x && x.status == 200) {\n\t\t\t\t\tvar _status = document.getElementById('_status');\n\t\t\t\t\tif (_status) {\n\t\t\t\t\t\tif (result.status) {\n\t\t\t\t\t\t\t_status.innerHTML = '<input type=\"button\" class=\"btn cbi-button cbi-button-apply\" value=\"<%:Enter interface%>\" onclick=\"openwebui()\" />';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t_status.innerHTML = '';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n//]]></script>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/include/shunt_options.htm",
    "content": "<style>\n.hidden {\n\tdisplay: none !important;\n\tvisibility: hidden !important;\n}\n</style>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tconst normal_list = JSON.parse('<%=self.normal_list%>');\n\tfunction check_fakedns(id, val) {\n\t\tconst dom_id = \"cbid.table.\" + id + \".\";\n\t\tconst fakedns_dom = document.getElementById(dom_id + \"_fakedns\");\n\t\tif (!val) {\n\t\t\tconst selectNode = document.getElementById(dom_id + \"_node\");\n\t\t\tval = selectNode.value;\n\t\t}\n\t\tif (val == \"\" || val == \"_direct\") {\n\t\t\tfakedns_dom.value = 0;\n\t\t\tfakedns_dom.checked = false;\n\t\t\tfakedns_dom.classList.add('hidden');\n\t\t} else {\n\t\t\tfakedns_dom.classList.remove('hidden');\n\t\t}\n\t}\n\tfunction check_proxy_tag(id, val) {\n\t\tconst dom_id = \"cbid.table.\" + id + \".\";\n\t\tconst cbid = dom_id + \"_proxy_tag\";\n\t\tconst proxy_tag_dom = document.getElementById(cbid + \".main\");\n\t\tif (!val) {\n\t\t\tconst selectNode = document.getElementById(dom_id + \"_node\");\n\t\t\tval = selectNode.value;\n\t\t}\n\t\tif (val == \"\" || val.startsWith(\"_\") || val.startsWith(\"Socks_\") || !normal_list.find(element => element.id == val)) {\n\t\t\tconst hiddenSelect = document.getElementById(cbid);\n\t\t\tconst panel = document.getElementById(cbid + \".panel\");\n\t\t\tconst display = document.getElementById(cbid + \".display\");\n\t\t\tconst labelSpan = document.getElementById(cbid + \".label\");\n\t\t\tconst searchInput = document.getElementById(cbid + \".search\");\n\t\t\tconst listContainer = document.getElementById(cbid + \".list\");\n\t\t\tlv_change(cbid, listContainer, hiddenSelect, labelSpan, searchInput, \"\", \"<%:Close (Not use)%>\");\n\t\t\tproxy_tag_dom.classList.add('hidden');\n\t\t} else {\n\t\t\tproxy_tag_dom.classList.remove('hidden');\n\t\t}\n\t}\n\tfunction refresh_depends() {\n\t\tconst table_dom = document.getElementById(\"cbi-passwall2-shunt_option_list\");\n\t\tif (table_dom) {\n\t\t\tconst trs = table_dom.getElementsByTagName(\"tr\");\n\t\t\tfor (let i = 1; i < trs.length;i++) {\n\t\t\t\tcheck_fakedns(i);\n\t\t\t\tcheck_proxy_tag(i);\n\t\t\t}\n\t\t}\n\t}\n\tdocument.addEventListener(\"DOMContentLoaded\", () => setTimeout(() => {\n\t\trefresh_depends();\n\t\tconst table_dom = document.getElementById(\"cbi-passwall2-shunt_option_list\");\n\t\tif (table_dom) {\n\t\t\tconst trs = table_dom.getElementsByTagName(\"tr\");\n\t\t\tfor (let i = 1; i < trs.length;i++) {\n\t\t\t\tconst selectNode = document.getElementById(\"cbid.table.\" + i + \"._node.main\");\n\t\t\t\tselectNode.addEventListener(\"change\", function(el){\n\t\t\t\t\tlet new_val = el.target.value\n\t\t\t\t\tcheck_fakedns(i, new_val);\n\t\t\t\t\tcheck_proxy_tag(i, new_val);\n\t\t\t\t});\n\t\t\t\tif (i == trs.length - 1) {\n\t\t\t\t\tconst newArray = window.lv_dropdown_data[\"cbid.table.\" + i + \"._node\"].ungrouped.filter(item => item.key !== \"_default\");\n\t\t\t\t\twindow.lv_dropdown_data[\"cbid.table.\" + i + \"._node\"].ungrouped = newArray\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}, 100));\n\t//]]>\n</script>"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/log/log.htm",
    "content": "<%\nlocal api = require \"luci.passwall2.api\"\n-%>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tvar log_textarea = null;\n\tvar first_load_done = false;\n\n\tfunction scrollToBottom() {\n\t\tlog_textarea.scrollTop = log_textarea.scrollHeight;\n\t}\n\n\tfunction clearlog(btn) {\n\t\tXHR.get('<%=api.url(\"clear_log\")%>', null,\n\t\t\tfunction(x, data) {\n\t\t\t\tif(x && x.status == 200 && log_textarea) {\n\t\t\t\t\tlog_textarea.innerHTML = \"\";\n\t\t\t\t\tscrollToBottom();\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\tXHR.poll(5, '<%=api.url(\"get_log\")%>', null,\n\t\tfunction(x, data) {\n\t\t\tif(x && x.status == 200) {\n\t\t\t\tif (!log_textarea) log_textarea = document.getElementById('log_textarea');\n\t\t\t\tvar wasBottom = (log_textarea.scrollTop + log_textarea.clientHeight >= log_textarea.scrollHeight - 10);\n\t\t\t\tlog_textarea.innerHTML = x.responseText;\n\t\t\t\tif (!first_load_done) {\n\t\t\t\t\tscrollToBottom();\n\t\t\t\t\tfirst_load_done = true;\n\t\t\t\t}\n\t\t\t\telse if (wasBottom) {\n\t\t\t\t\tscrollToBottom();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t);\n\t//]]>\n</script>\n<fieldset class=\"cbi-section\" id=\"_log_fieldset\">\n\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"clearlog()\" value=\"<%:Clear logs%>\" />\n\t<textarea id=\"log_textarea\" class=\"cbi-input-textarea\" style=\"width: 100%;margin-top: 10px;\" data-update=\"change\" rows=\"40\" wrap=\"off\" readonly=\"readonly\"></textarea>\n</fieldset>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/node_config/footer.htm",
    "content": "<%\nlocal api = self.api\n-%>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t\twaitForElement('select[name*=\"<%=api.appname%>\"][name*=\"type\"]', function(el) {\n\t\t\tlet o_val = el.value;\n\t\t\tel.addEventListener(\"change\", () => {\n\t\t\t\tel.blur();\n\t\t\t\tif (o_val != el.value) {\n\t\t\t\t\tlet save = true;\n\t\t\t\t\tif (save) {\n\t\t\t\t\t\t//document.getElementsByClassName('cbi-button-save')[0].click();\n\t\t\t\t\t\tupdate_node({\n\t\t\t\t\t\t\tremarks: getOption(\"remarks\").value,\n\t\t\t\t\t\t\tgroup: getOption(\"group\").value,\n\t\t\t\t\t\t\ttype: getOption(\"type\").value,\n\t\t\t\t\t\t\tprotocol: ''\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t\twaitForElement('select[name*=\"<%=api.appname%>\"][name*=\"protocol\"]', function(el) {\n\t\t\tlet o_val = el.value;\n\t\t\tel.addEventListener(\"change\", () => {\n\t\t\t\tel.blur();\n\t\t\t\tif (el.value.startsWith(\"_\") || (o_val.startsWith(\"_\") && !el.value.startsWith(\"_\"))) {\n\t\t\t\t\tlet name_split = el.name.split(\".\");\n\t\t\t\t\tlet name = name_split[name_split.length - 1];\n\t\t\t\t\tlet save = true;\n\t\t\t\t\tif (save) {\n\t\t\t\t\t\t//document.getElementsByClassName('cbi-button-save')[0].click();\n\t\t\t\t\t\tupdate_node({\n\t\t\t\t\t\t\tremarks: getOption(\"remarks\").value,\n\t\t\t\t\t\t\tgroup: getOption(\"group\").value,\n\t\t\t\t\t\t\tprotocol: getOption(name).value\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\twindow.location.href = node_config_url + \"?select_proto=\" + el.value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t});\n\t});\n\t//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/node_config/header.htm",
    "content": "<%\nlocal api = self.api\n-%>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tlet node_id = \"<%=self.section%>\";\n\tlet node_config_url = '<%=api.url(\"node_config\")%>/' + node_id;\n\n\tfunction waitForElement(selector, callback) {\n\t\tconst el = document.querySelector(selector);\n\t\tif (el) return callback(el);\n\t\tconst observer = new MutationObserver(() => {\n\t\t\tconst el = document.querySelector(selector);\n\t\t\tif (el) {\n\t\t\t\tobserver.disconnect();\n\t\t\t\tcallback(el);\n\t\t\t}\n\t\t});\n\t\tobserver.observe(document.body, { childList: true, subtree: true });\n\t}\n\n\tfunction getOption(opt) {\n\t\tvar obj;\n\t\tvar id = 'cbid.<%=api.appname%>.' + node_id + '.' + opt;\n\t\tobj = document.getElementsByName(id)[0] || document.getElementById(id);\n\t\tif (obj) {\n\t\t\tvar combobox = document.getElementById('cbi.combobox.' + id);\n\t\t\tif (combobox) {\n\t\t\t\tobj.combobox = combobox;\n\t\t\t}\n\t\t\tvar div = document.getElementById(id);\n\t\t\tif (div && div.getElementsByTagName(\"li\").length > 0) {\n\t\t\t\tobj = div;\n\t\t\t}\n\t\t\treturn obj;\n\t\t} else {\n\t\t\treturn null;\n\t\t}\n\t}\n\t\n\tfunction update_node(data) {\n\t\tXHR.get('<%=api.url(\"update_node\")%>', {\n\t\t\tid: node_id,\n\t\t\tdata: JSON.stringify(data)\n\t\t},\n\t\tfunction(x, data) {\n\t\t\tif (x && x.status == 200 && data.code == 1) {\n\t\t\t\twindow.location.href = node_config_url;\n\t\t\t}\n\t\t\telse {\n\t\t\t\talert(\"<%:Error%>\");\n\t\t\t}\n\t\t});\n\t}\n\t//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/node_config/link_share_man.htm",
    "content": "<%+cbi/valueheader%>\n<%\nlocal api = require \"luci.passwall2.api\"\nlocal appname = api.appname\nlocal map = self.map\n\nlocal has_ss = api.is_finded(\"ss-redir\")\nlocal has_ss_rust = api.is_finded(\"sslocal\")\nlocal has_singbox = api.finded_com(\"sing-box\")\nlocal has_xray = api.finded_com(\"xray\")\nlocal has_hysteria2 = api.finded_com(\"hysteria\")\n\nlocal ss_type = api.get_core(\"ss_type\", {{has_ss,\"shadowsocks-libev\"},{has_ss_rust,\"shadowsocks-rust\"},{has_singbox,\"sing-box\"},{has_xray,\"xray\"}})\nlocal trojan_type = api.get_core(\"trojan_type\", {{has_singbox,\"sing-box\"},{has_xray,\"xray\"}})\nlocal vmess_type = api.get_core(\"vmess_type\", {{has_xray,\"xray\"},{has_singbox,\"sing-box\"}})\nlocal vless_type = api.get_core(\"vless_type\", {{has_xray,\"xray\"},{has_singbox,\"sing-box\"}})\nlocal hysteria2_type = api.get_core(\"hysteria2_type\", {{has_hysteria2,\"hysteria2\"},{has_singbox,\"sing-box\"}, {has_xray,\"xray\"}})\n\nlocal current_node = map:get(section)\n-%>\n<script src=\"<%=resource%>/view/<%=appname%>/qrcode.min.js\"></script>\n<script type=\"text/javascript\">//<![CDATA[\n\tlet has_singbox = \"<%=has_singbox%>\"\n\tlet has_xray = \"<%=has_xray%>\"\n\tlet has_hysteria2 = \"<%=has_hysteria2%>\"\n\tlet ss_type = \"<%=ss_type%>\"\n\tlet trojan_type = \"<%=trojan_type%>\"\n\tlet vmess_type = \"<%=vmess_type%>\"\n\tlet vless_type = \"<%=vless_type%>\"\n\tlet hysteria2_type = \"<%=hysteria2_type%>\"\n\n\tfunction padright(str, cnt, pad) {\n\t\treturn str + Array(cnt + 1).join(pad);\n\t}\n\n\tfunction b64EncodeUnicode(str) {\n\t\treturn btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {\n\t\t\treturn String.fromCharCode('0x' + p1);\n\t\t}));\n\t}\n\n\tfunction b64encutf8safe(str) {\n\t\treturn b64EncodeUnicode(str).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, '');\n\t}\n\n\tfunction b64DecodeUnicode(str) {\n\t\treturn decodeURIComponent(Array.prototype.map.call(atob(str), function (c) {\n\t\t\treturn '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n\t\t}).join(''));\n\t}\n\n\tfunction b64decutf8safe(str) {\n\t\tvar l;\n\t\tstr = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\t\tl = str.length;\n\t\tl = (4 - l % 4) % 4;\n\t\tif (l)\n\t\t\tstr = padright(str, l, \"=\");\n\t\treturn b64DecodeUnicode(str);\n\t}\n\n\tfunction b64encsafe(str) {\n\t\treturn btoa(str).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, '')\n\t}\n\n\tfunction b64decsafe(str) {\n\t\tconst orig = str;\n\t\ttry {\n\t\t\tstr = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\t\t\tconst pad = (4 - str.length % 4) % 4;\n\t\t\tif (pad) str += \"=\".repeat(pad);\n\t\t\treturn atob(str);\n\t\t} catch (e) {\n\t\t\treturn orig;\n\t\t}\n\t}\n\n\tfunction dictvalue(d, key) {\n\t\tvar v = d[key];\n\t\tif (typeof (v) === 'undefined' || v === '')\n\t\t\treturn '';\n\t\treturn b64decsafe(v);\n\t}\n\n\tfunction parseNodeUrl(url) {\n\t\tlet protocol = url.substring(0, url.indexOf(\"://\")) + \":\"\n\t\tlet str = \"http\" + url.substring(url.indexOf(\"://\"))\n\t\tconst parsedUrl = new URL(str);\n\t\tvar r = {\n\t\t\thash: parsedUrl.hash, // #asd\n\t\t\thost: parsedUrl.host, // localhost:257\n\t\t\thostname: parsedUrl.hostname, // localhost\n\t\t\tport: parsedUrl.port, // 257\n\t\t\tsearch: parsedUrl.search, // ?asd=asd\n\t\t\tpasswd: parsedUrl.username || parsedUrl.password // username\n\t\t};\n\t\treturn r;\n\t}\n\t\n\tfunction genQrcode(btn, urlname, sid) {\n\t\tvar qrcode_div = document.getElementById(\"qrcode_div\");\n\t\tqrcode_div.style.display = null;\n\t\tdocument.getElementById(\"qrcode\").innerHTML = \"\";\n\t\tvar url = buildUrl(btn, urlname, sid);\n\t\tif (url) {\n\t\t\tvar qrcode = new QRCode(document.getElementById(\"qrcode\"), {\n\t\t\t\twidth: 150,\n\t\t\t\theight: 150\n\t\t\t});\n\t\t\tqrcode.makeCode(url);\n\t\t}\n\t}\n\n\tfunction buildUrl(btn, urlname, sid) {\n\t\tvar opt = {\n\t\t\tbase: \"cbid.<%=appname%>\",\n\t\t\tclient: true,\n\t\t\tget: function (opt) {\n\t\t\t\tvar id = this.base + \".\" + opt;\n\t\t\t\tvar obj = document.getElementsByName(id)[0] || document.getElementsByClassName(id)[0] || document.getElementById(id)\n\t\t\t\tif (obj) {\n\t\t\t\t\treturn obj;\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t},\n\t\t\tgetlist: function (opt) {\n\t\t\t\tvar id = this.base + \".\" + opt;\n\t\t\t\tvar objs = document.getElementsByName(id) || document.getElementsByClassName(id);\n\t\t\t\tvar ret = [];\n\t\t\t\tif (objs) {\n\t\t\t\t\tfor (var i = 0; i < objs.length; i++) {\n\t\t\t\t\t\tret[i] = objs[i].value;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\talert(\"<%:Faltal on get option, please help in debug: %>\" + opt);\n\t\t\t\t}\n\t\t\t\treturn ret;\n\t\t\t},\n\t\t\tquery: function (param, src, default_value) {\n\t\t\t\tvar obj = this.get(src);\n\t\t\t\tif (obj) {\n\t\t\t\t\tvar ret = \"&\" + param + \"=\";\n\t\t\t\t\tif (obj.type === \"checkbox\") {\n\t\t\t\t\t\treturn ret + (obj.checked === true ? \"1\" : \"0\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar result = encodeURIComponent(obj.value);\n\t\t\t\t\t\tif (result == null || result.trim() == \"\") {\n\t\t\t\t\t\t\tif (default_value) {\n\t\t\t\t\t\t\t\treturn ret + default_value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\treturn ret + result;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\treturn \"\";\n\t\t\t}\n\t\t}\n\t\topt.base = \"cbid.\" + urlname + \".\" + sid;\n\t\topt.client = urlname.indexOf(\"server\") === -1;\n\t\tvar v_type = opt.get(\"type\").value;\n\t\tvar v_alias = opt.get(\"remarks\");\n\n\t\tvar dom_prefix = null\n\t\tvar protocol = \"\"\n\t\tif (v_type === \"SS\") {\n\t\t\tdom_prefix = \"ss_\"\n\t\t\tprotocol = \"ss\"\n\t\t} else if (v_type === \"SS-Rust\") {\n\t\t\tdom_prefix = \"ssrust_\"\n\t\t\tprotocol = \"ss\"\n\t\t} else if (v_type === \"SSR\") {\n\t\t\tdom_prefix = \"ssr_\"\n\t\t\tprotocol = \"ssr\"\n\t\t} else if (v_type === \"Hysteria2\") {\n\t\t\tdom_prefix = \"hysteria2_\"\n\t\t\tprotocol = \"hysteria2\"\n\t\t} else if (v_type === \"Xray\") {\n\t\t\tdom_prefix = \"xray_\"\n\t\t} else if (v_type === \"sing-box\") {\n\t\t\tdom_prefix = \"singbox_\"\n\t\t}\n\t\tvar _address = \"\"\n\t\tif (dom_prefix && dom_prefix != null) {\n\t\t\ttry {\n\t\t\t\tvar v_server = opt.get(dom_prefix + \"address\");\n\t\t\t\tconst ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\n\t\t\t\tif (ipv6Regex.test(v_server.value)) {\n\t\t\t\t\t_address = \"[\" + v_server.value + \"]\"\n\t\t\t\t} else {\n\t\t\t\t\t_address = v_server.value\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t}\n\t\t}\n\t\tvar url = null;\n\t\tif (v_type === \"SS\" || v_type === \"SS-Rust\" || ((v_type === \"sing-box\" || v_type === \"Xray\") && opt.get(dom_prefix + \"protocol\").value === \"shadowsocks\")) {\n\t\t\tprotocol = \"ss\"\n\t\t\tvar v_port = opt.get(dom_prefix + \"port\");\n\t\t\tvar v_method = opt.get(dom_prefix + \"method\") || opt.get(dom_prefix + \"ss_method\");\n\t\t\tvar v_password = opt.get(dom_prefix + \"password\");\n\n\t\t\turl = b64encsafe(v_method.value + \":\" + v_password.value) + \"@\" +\n\t\t\t\t_address + \":\" +\n\t\t\t\tv_port.value + \"/?\";\n\t\t\t\n\t\t\tvar shadow_tls;\n\t\t\t// Generate SS Shadow-TLS plugin parameters\n\t\t\tconst generateShadowTLSBase64 = function(paramStr) {\n\t\t\t\ttry {\n\t\t\t\t\tlet obj = {};\n\t\t\t\t\tlet list = paramStr.split(\";\");\n\t\t\t\t\tfor (let i = 0; i < list.length; i++) {\n\t\t\t\t\t\tlet kv = list[i].split(\"=\");\n\t\t\t\t\t\tif (kv.length === 2) {\n\t\t\t\t\t\t\tlet k = kv[0].trim(), v = kv[1].trim();\n\t\t\t\t\t\t\tlet m = k.match(/^v(\\d+)$/);\n\t\t\t\t\t\t\tif (m && v === \"1\") obj.version = m[1];\n\t\t\t\t\t\t\telse if (k === \"passwd\") obj.password = v;\n\t\t\t\t\t\t\telse obj[k] = v;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\treturn b64encsafe(JSON.stringify(obj));\n\t\t\t\t} catch (e) {\n\t\t\t\t\treturn \"\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar params = \"\";\n\n\t\t\topt.get(dom_prefix + \"tcp_fast_open\")?.checked && (params += \"&tfo=1\");\n\n\t\t\tvar v_plugin_dom = opt.get(dom_prefix + \"plugin\");\n\t\t\tif (v_plugin_dom) {\n\t\t\t\tvar v_plugin = v_plugin_dom.value;\n\t\t\t\tif (v_plugin && v_plugin != \"none\") {\n\t\t\t\t\tif (v_plugin == \"simple-obfs\" || v_plugin == \"obfs-local\") {\n\t\t\t\t\t\tv_plugin = \"obfs-local\";\n\t\t\t\t\t}\n\t\t\t\t\tvar v_plugin_opts = opt.get(dom_prefix + \"plugin_opts\").value;\n\t\t\t\t\tif (v_plugin_opts && v_plugin_opts != \"\") {\n\t\t\t\t\t\tv_plugin += \";\" + v_plugin_opts;\n\t\t\t\t\t}\n\t\t\t\t\tparams += \"&plugin=\" + encodeURIComponent(v_plugin);\n\n\t\t\t\t\tif (v_plugin_dom.value == \"shadow-tls\" && v_plugin_opts && v_plugin_opts != \"\") {\n\t\t\t\t\t\tparams = \"shadow-tls=\" + generateShadowTLSBase64(v_plugin_opts);\n\t\t\t\t\t\tshadow_tls = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (v_type === \"sing-box\" || v_type === \"Xray\") {\n\t\t\t\tvar v_transport = opt.get(dom_prefix + \"transport\").value;\n\t\t\t\tif (v_transport === \"ws\") {\n\t\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"ws_host\");\n\t\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"ws_path\");\n\t\t\t\t\tif (v_type == \"sing-box\" && opt.get(dom_prefix + \"ws_enableEarlyData\").checked) {\n\t\t\t\t\t\tvar ws_maxEarlyData = opt.get(dom_prefix + \"ws_maxEarlyData\").value;\n\t\t\t\t\t\tparams += \"?ed=\" + ws_maxEarlyData;\n\t\t\t\t\t}\n\t\t\t\t} else if (v_transport === \"http\") {\n\t\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"http_host\");\n\t\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"http_path\");\n\t\t\t\t} else if (v_transport === \"raw\" || v_transport === \"tcp\") {\n\t\t\t\t\tv_transport = \"tcp\";\n\t\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"tcp_guise\");\n\t\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"tcp_guise_http_host\");\n\t\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"tcp_guise_http_path\");\n\t\t\t\t} else if (v_transport === \"mkcp\") {\n\t\t\t\t\tv_transport = \"kcp\";\n\t\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"mkcp_guise\");\n\t\t\t\t\tparams += opt.query(\"seed\", dom_prefix + \"mkcp_seed\");\n\t\t\t\t} else if (v_transport === \"quic\") {\n\t\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"quic_guise\");\n\t\t\t\t\tparams += opt.query(\"key\", dom_prefix + \"quic_key\");\n\t\t\t\t\tparams += opt.query(\"quicSecurity\", dom_prefix + \"quic_security\");\n\t\t\t\t} else if (v_transport === \"grpc\") {\n\t\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"grpc_serviceName\");\n\t\t\t\t\tparams += opt.query(\"serviceName\", dom_prefix + \"grpc_serviceName\");\n\t\t\t\t\tparams += opt.query(\"mode\", dom_prefix + \"grpc_mode\");\n\t\t\t\t} else if (v_transport === \"xhttp\") {\n\t\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"xhttp_host\");\n\t\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"xhttp_path\");\n\t\t\t\t\tparams += opt.query(\"mode\", dom_prefix + \"xhttp_mode\");\n\t\t\t\t\tif (opt.get(dom_prefix + \"use_xhttp_extra\").checked) {\n\t\t\t\t\t\tparams += opt.query(\"extra\", dom_prefix + \"xhttp_extra\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tparams += \"&type=\" + v_transport;\n\n\t\t\t\tif (opt.get(dom_prefix + \"tls\").checked) {\n\t\t\t\t\tvar v_security = \"tls\";\n\t\t\t\t\tif (opt.get(dom_prefix + \"fingerprint\") && opt.get(dom_prefix + \"fingerprint\").value != \"\") {\n\t\t\t\t\t\tlet v_fp = opt.get(dom_prefix + \"fingerprint\").value;\n\t\t\t\t\t\tparams += \"&fp=\" + v_fp;\n\t\t\t\t\t}\n\t\t\t\t\tif (opt.get(dom_prefix + \"reality\") && opt.get(dom_prefix + \"reality\").checked) {\n\t\t\t\t\t\tv_security = \"reality\";\n\t\t\t\t\t\tparams += opt.query(\"pbk\", dom_prefix + \"reality_publicKey\");\n\t\t\t\t\t\tparams += opt.query(\"sid\", dom_prefix + \"reality_shortId\");\n\t\t\t\t\t\tparams += opt.query(\"spx\", dom_prefix + \"reality_spiderX\");\n\t\t\t\t\t\tparams += opt.query(\"pqv\", dom_prefix + \"reality_mldsa65Verify\");\n\t\t\t\t\t}\n\t\t\t\t\tparams += \"&security=\" + v_security;\n\t\t\t\t\tparams += opt.query(\"alpn\", dom_prefix + \"alpn\");\n\t\t\t\t\tparams += opt.query(\"sni\", dom_prefix + \"tls_serverName\");\n\t\t\t\t\tparams += opt.query(\"allowinsecure\", dom_prefix + \"tls_allowInsecure\");\n\t\t\t\t\tparams += opt.query(\"pcs\", dom_prefix + \"tls_pinSHA256\");\n\t\t\t\t\tparams += opt.query(\"vcn\", dom_prefix + \"tls_CertByName\");\n\t\t\t\t\tparams += opt.query(\"ech\", dom_prefix + \"ech_config\");\n\t\t\t\t}\n\n\t\t\t\topt.get(dom_prefix + \"uot\")?.checked && (params += \"&udp=1\");\n\t\t\t\tif (opt.get(dom_prefix + \"use_finalmask\")?.checked) {\n\t\t\t\t\tparams += opt.query(\"fm\", dom_prefix + \"finalmask\");\n\t\t\t\t}\n\n\t\t\t\tif (opt.get(dom_prefix + \"shadowtls\")?.checked) {\n\t\t\t\t\tlet st_plugin_str = \"\";\n\t\t\t\t\tlet st_version = opt.get(dom_prefix + \"shadowtls_version\")?.value;\n\t\t\t\t\tif (st_version) st_plugin_str += \"v\" + st_version + \"=1;\";\n\t\t\t\t\tlet st_password = opt.get(dom_prefix + \"shadowtls_password\")?.value;\n\t\t\t\t\tif (st_password) st_plugin_str += \"passwd=\" + st_password +\";\";\n\t\t\t\t\tlet st_host = opt.get(dom_prefix + \"shadowtls_serverName\")?.value;\n\t\t\t\t\tif (st_host) st_plugin_str += \"host=\" + st_host +\";\";\n\t\t\t\t\tif (opt.get(dom_prefix + \"shadowtls_utls\").checked) {\n\t\t\t\t\t\tlet st_fingerprint = opt.get(dom_prefix + \"shadowtls_fingerprint\")?.value;\n\t\t\t\t\t\tif (st_fingerprint) st_plugin_str += \"fingerprint=\" + st_fingerprint;\n\t\t\t\t\t}\n\t\t\t\t\tparams = \"shadow-tls=\" + generateShadowTLSBase64(st_plugin_str);\n\t\t\t\t\tshadow_tls = 1;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (shadow_tls) {\n\t\t\t\turl = b64encsafe(v_method.value + \":\" + v_password.value + \"@\" +\n\t\t\t\t\t_address + \":\" +\n\t\t\t\t\tv_port.value) + \"?\";\n\t\t\t} else {\n\t\t\t\tparams += \"&group=\"\n\t\t\t}\n\t\t\tparams += \"#\" + encodeURIComponent(v_alias.value);\n\t\t\tif (params[0] == \"&\") {\n\t\t\t\tparams = params.substring(1);\n\t\t\t}\n\t\t\turl += params;\n\t\t} else if (v_type === \"SSR\") {\n\t\t\tvar v_port = opt.get(dom_prefix + \"port\");\n\t\t\tvar v_protocol = opt.get(dom_prefix + \"protocol\");\n\t\t\tvar v_method = opt.get(dom_prefix + \"method\");\n\t\t\tvar v_obfs = opt.get(dom_prefix + \"obfs\");\n\t\t\tvar v_password = opt.get(dom_prefix + \"password\");\n\t\t\tvar v_obfs_param = opt.get(dom_prefix + \"obfs_param\");\n\t\t\tvar v_protocol_param = opt.get(dom_prefix + \"protocol_param\");\n\t\t\tvar ssr_str = _address + \":\" +\n\t\t\t\tv_port.value + \":\" +\n\t\t\t\tv_protocol.value + \":\" +\n\t\t\t\tv_method.value + \":\" +\n\t\t\t\tv_obfs.value + \":\" +\n\t\t\t\tb64encsafe(v_password.value) +\n\t\t\t\t\"/?obfsparam=\" + b64encsafe(v_obfs_param.value) +\n\t\t\t\t\"&protoparam=\" + b64encsafe(v_protocol_param.value) +\n\t\t\t\t\"&remarks=\" + b64encutf8safe(v_alias.value);\n\t\t\turl = b64encsafe(ssr_str);\n\t\t} else if ((v_type === \"sing-box\" || v_type === \"Xray\") && opt.get(dom_prefix + \"protocol\").value === \"vmess\") {\n\t\t\tprotocol = \"vmess\";\n\t\t\tvar info = {};\n\t\t\tinfo.v = \"2\";\n\t\t\tinfo.ps = v_alias.value;\n\t\t\tinfo.add = opt.get(dom_prefix + \"address\").value;\n\t\t\t//info.add = _address;\n\t\t\tinfo.port = opt.get(dom_prefix + \"port\").value;\n\t\t\tinfo.id = opt.get(dom_prefix + \"uuid\").value;\n\n\t\t\tvar v_transport = opt.get(dom_prefix + \"transport\").value;\n\t\t\tif (v_transport === \"ws\") {\n\t\t\t\tinfo.host = opt.get(dom_prefix + \"ws_host\").value;\n\t\t\t\tinfo.path = opt.get(dom_prefix + \"ws_path\").value;\n\t\t\t\tif (v_type == \"sing-box\" && opt.get(dom_prefix + \"ws_enableEarlyData\").checked) {\n\t\t\t\t\tvar ws_maxEarlyData = opt.get(dom_prefix + \"ws_maxEarlyData\").value;\n\t\t\t\t\tinfo.path = info.path + \"?ed=\" + ws_maxEarlyData;\n\t\t\t\t}\n\t\t\t} else if (v_transport === \"http\") {\n\t\t\t\tinfo.host = opt.get(dom_prefix + \"http_host\").value;\n\t\t\t\tinfo.path = opt.get(dom_prefix + \"http_path\").value;\n\t\t\t} else if (v_transport === \"raw\" || v_transport === \"tcp\") {\n\t\t\t\tv_transport = \"tcp\";\n\t\t\t\tinfo.type = opt.get(dom_prefix + \"tcp_guise\").value;\n\t\t\t\tif (info.type === \"http\") {\n\t\t\t\t\tinfo.host = opt.get(dom_prefix + \"tcp_guise_http_host\").value;\n\t\t\t\t\tinfo.path = opt.get(dom_prefix + \"tcp_guise_http_path\").value;\n\t\t\t\t}\n\t\t\t} else if (v_transport === \"mkcp\") {\n\t\t\t\tv_transport = \"kcp\";\n\t\t\t\tinfo.type = opt.get(dom_prefix + \"mkcp_guise\").value;\n\t\t\t\tinfo.seed = opt.get(dom_prefix + \"mkcp_seed\").value;\n\t\t\t} else if (v_transport === \"quic\") {\n\t\t\t\tinfo.type = opt.get(dom_prefix + \"quic_guise\")?.value;\n\t\t\t\tinfo.key = opt.get(dom_prefix + \"quic_key\")?.value;\n\t\t\t\tinfo.securty = opt.get(dom_prefix + \"quic_security\")?.value;\n\t\t\t} else if (v_transport === \"grpc\") {\n\t\t\t\tinfo.path = opt.get(dom_prefix + \"grpc_serviceName\").value;\n\t\t\t}\n\t\t\tinfo.net = v_transport;\n\n\t\t\tinfo.security = opt.get(dom_prefix + \"security\").value || \"auto\";\n\t\t\tinfo.scy = info.security;\n\t\t\tif (opt.get(dom_prefix + \"tls\").checked) {\n\t\t\t\tvar v_security = \"tls\";\n\t\t\t\tinfo.tls = \"tls\";\n\t\t\t\tinfo.sni = opt.get(dom_prefix + \"tls_serverName\").value;\n\t\t\t\tinfo.alpn = opt.get(dom_prefix + \"alpn\")?.value;\n\t\t\t\tif (info.alpn === \"default\") info.alpn = undefined;\n\t\t\t\tinfo.fp = opt.get(dom_prefix + \"fingerprint\")?.value;\n\t\t\t\tinfo.pcs = opt.get(dom_prefix + \"tls_pinSHA256\")?.value;\n\t\t\t\topt.get(dom_prefix + \"tls_allowInsecure\")?.checked && (info.insecure = \"1\");\n\t\t\t}\n\n\t\t\topt.get(dom_prefix + \"tcp_fast_open\")?.checked && (info.tfo = \"1\");\n\t\t\tif (opt.get(dom_prefix + \"use_finalmask\")?.checked) {\n\t\t\t\tinfo.fm = opt.get(dom_prefix + \"finalmask\").value;\n\t\t\t\tif (info.fm) info.fm = encodeURI(info.fm);\n\t\t\t}\n\n\t\t\turl = b64EncodeUnicode(JSON.stringify(info));\n\t\t} else if ((v_type === \"sing-box\" || v_type === \"Xray\") && opt.get(dom_prefix + \"protocol\").value === \"vless\") {\n\t\t\tprotocol = \"vless\";\n\t\t\tvar v_password = opt.get(dom_prefix + \"uuid\");\n\t\t\tvar v_port = opt.get(dom_prefix + \"port\");\n\t\t\turl = encodeURIComponent(v_password.value) +\n\t\t\t\t\"@\" + _address +\n\t\t\t\t\":\" + v_port.value + \"?\";\n\n\t\t\tvar params = \"\";\n\t\t\tvar v_transport = opt.get(dom_prefix + \"transport\").value;\n\t\t\tif (v_transport === \"ws\") {\n\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"ws_host\");\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"ws_path\");\n\t\t\t\tif (v_type == \"sing-box\" && opt.get(dom_prefix + \"ws_enableEarlyData\").checked) {\n\t\t\t\t\tvar ws_maxEarlyData = opt.get(dom_prefix + \"ws_maxEarlyData\").value;\n\t\t\t\t\tparams += encodeURIComponent(\"?ed=\" + ws_maxEarlyData);\n\t\t\t\t}\n\t\t\t} else if (v_transport === \"http\") {\n\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"http_host\");\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"http_path\");\n\t\t\t} else if (v_transport === \"raw\" || v_transport === \"tcp\") {\n\t\t\t\tv_transport = \"tcp\";\n\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"tcp_guise\");\n\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"tcp_guise_http_host\");\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"tcp_guise_http_path\");\n\t\t\t} else if (v_transport === \"mkcp\") {\n\t\t\t\tv_transport = \"kcp\";\n\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"mkcp_guise\");\n\t\t\t\tparams += opt.query(\"seed\", dom_prefix + \"mkcp_seed\");\n\t\t\t} else if (v_transport === \"quic\") {\n\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"quic_guise\");\n\t\t\t\tparams += opt.query(\"key\", dom_prefix + \"quic_key\");\n\t\t\t\tparams += opt.query(\"quicSecurity\", dom_prefix + \"quic_security\");\n\t\t\t} else if (v_transport === \"grpc\") {\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"grpc_serviceName\");\n\t\t\t\tparams += opt.query(\"serviceName\", dom_prefix + \"grpc_serviceName\");\n\t\t\t\tparams += opt.query(\"mode\", dom_prefix + \"grpc_mode\");\n\t\t\t} else if (v_transport === \"xhttp\") {\n\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"xhttp_host\");\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"xhttp_path\");\n\t\t\t\tparams += opt.query(\"mode\", dom_prefix + \"xhttp_mode\");\n\t\t\t\tif (opt.get(dom_prefix + \"use_xhttp_extra\").checked) {\n\t\t\t\t\tparams += opt.query(\"extra\", dom_prefix + \"xhttp_extra\");\n\t\t\t\t}\n\t\t\t} else if (v_transport === \"httpupgrade\") {\n\t\t\t\tv_transport = \"httpupgrade\";\n\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"httpupgrade_host\");\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"httpupgrade_path\");\n\t\t\t}\n\t\t\tparams += \"&type=\" + v_transport;\n\n\t\t\tif (v_type === \"sing-box\") {\n\t\t\t\tparams += \"&encryption=none\";\n\t\t\t} else {\n\t\t\t\tparams += opt.query(\"encryption\", dom_prefix + \"encryption\");\n\t\t\t}\n\n\t\t\tif (opt.get(dom_prefix + \"tls\").checked) {\n\t\t\t\tvar v_security = \"tls\";\n\t\t\t\tif (opt.get(dom_prefix + \"fingerprint\") && opt.get(dom_prefix + \"fingerprint\").value != \"\") {\n\t\t\t\t\tlet v_fp = opt.get(dom_prefix + \"fingerprint\").value;\n\t\t\t\t\tparams += \"&fp=\" + v_fp;\n\t\t\t\t}\n\t\t\t\tif (opt.get(dom_prefix + \"reality\") && opt.get(dom_prefix + \"reality\").checked) {\n\t\t\t\t\tv_security = \"reality\";\n\t\t\t\t\tparams += opt.query(\"pbk\", dom_prefix + \"reality_publicKey\");\n\t\t\t\t\tparams += opt.query(\"sid\", dom_prefix + \"reality_shortId\");\n\t\t\t\t\tparams += opt.query(\"spx\", dom_prefix + \"reality_spiderX\");\n\t\t\t\t\tparams += opt.query(\"pqv\", dom_prefix + \"reality_mldsa65Verify\");\n\t\t\t\t}\n\t\t\t\tif (opt.get(dom_prefix + \"flow\") && opt.get(dom_prefix + \"flow\").value) {\n\t\t\t\t\tlet v_flow = opt.get(dom_prefix + \"flow\").value;\n\t\t\t\t\tparams += \"&flow=\" + v_flow;\n\t\t\t\t}\n\t\t\t\tparams += \"&security=\" + v_security;\n\t\t\t\tparams += opt.query(\"alpn\", dom_prefix + \"alpn\");\n\t\t\t\tparams += opt.query(\"sni\", dom_prefix + \"tls_serverName\");\n\t\t\t\tparams += opt.query(\"allowinsecure\", dom_prefix + \"tls_allowInsecure\");\n\t\t\t\tparams += opt.query(\"pcs\", dom_prefix + \"tls_pinSHA256\");\n\t\t\t\tparams += opt.query(\"vcn\", dom_prefix + \"tls_CertByName\");\n\t\t\t\tparams += opt.query(\"ech\", dom_prefix + \"ech_config\");\n\t\t\t}\n\n\t\t\topt.get(dom_prefix + \"tcp_fast_open\")?.checked && (params += \"&tfo=1\");\n\t\t\tif (opt.get(dom_prefix + \"use_finalmask\")?.checked) {\n\t\t\t\tparams += opt.query(\"fm\", dom_prefix + \"finalmask\");\n\t\t\t}\n\n\t\t\tparams += \"#\" + encodeURI(v_alias.value);\n\t\t\tif (params[0] == \"&\") {\n\t\t\t\tparams = params.substring(1);\n\t\t\t}\n\t\t\turl += params;\n\t\t} else if ((v_type === \"sing-box\" || v_type === \"Xray\") && opt.get(dom_prefix + \"protocol\").value === \"trojan\") {\n\t\t\tprotocol = \"trojan\";\n\t\t\tvar v_password = opt.get(dom_prefix + \"password\");\n\t\t\tvar v_port = opt.get(dom_prefix + \"port\");\n\t\t\turl = encodeURIComponent(v_password.value) +\n\t\t\t\t\"@\" + _address +\n\t\t\t\t\":\" + v_port.value + \"/?\";\n\t\t\tvar params = \"\";\n\t\t\tvar v_transport = opt.get(dom_prefix + \"transport\").value;\n\t\t\tif (v_transport === \"ws\") {\n\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"ws_host\");\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"ws_path\");\n\t\t\t\tif (v_type == \"sing-box\" && opt.get(dom_prefix + \"ws_enableEarlyData\").checked) {\n\t\t\t\t\tvar ws_maxEarlyData = opt.get(dom_prefix + \"ws_maxEarlyData\").value;\n\t\t\t\t\tparams += \"?ed=\" + ws_maxEarlyData;\n\t\t\t\t}\n\t\t\t} else if (v_transport === \"http\") {\n\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"http_host\");\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"http_path\");\n\t\t\t} else if (v_transport === \"raw\" || v_transport === \"tcp\") {\n\t\t\t\tv_transport = \"tcp\";\n\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"tcp_guise\");\n\t\t\t\tparams += opt.query(\"host\", dom_prefix + \"tcp_guise_http_host\");\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"tcp_guise_http_path\");\n\t\t\t} else if (v_transport === \"mkcp\") {\n\t\t\t\tv_transport = \"kcp\";\n\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"mkcp_guise\");\n\t\t\t\tparams += opt.query(\"seed\", dom_prefix + \"mkcp_seed\");\n\t\t\t} else if (v_transport === \"quic\") {\n\t\t\t\tparams += opt.query(\"headerType\", dom_prefix + \"quic_guise\");\n\t\t\t\tparams += opt.query(\"key\", dom_prefix + \"quic_key\");\n\t\t\t\tparams += opt.query(\"quicSecurity\", dom_prefix + \"quic_security\");\n\t\t\t} else if (v_transport === \"grpc\") {\n\t\t\t\tparams += opt.query(\"path\", dom_prefix + \"grpc_serviceName\");\n\t\t\t\tparams += opt.query(\"serviceName\", dom_prefix + \"grpc_serviceName\");\n\t\t\t\tparams += opt.query(\"mode\", dom_prefix + \"grpc_mode\");\n\t\t\t}\n\t\t\tparams += \"&type=\" + v_transport;\n\n\t\t\tif (opt.get(dom_prefix + \"tls\").checked) {\n\t\t\t\tvar v_security = \"tls\";\n\t\t\t\tif (opt.get(dom_prefix + \"fingerprint\") && opt.get(dom_prefix + \"fingerprint\").value != \"\") {\n\t\t\t\t\tlet v_fp = opt.get(dom_prefix + \"fingerprint\").value;\n\t\t\t\t\tparams += \"&fp=\" + v_fp;\n\t\t\t\t}\n\t\t\t\tif (opt.get(dom_prefix + \"reality\") && opt.get(dom_prefix + \"reality\").checked) {\n\t\t\t\t\tv_security = \"reality\";\n\t\t\t\t\tparams += opt.query(\"pbk\", dom_prefix + \"reality_publicKey\");\n\t\t\t\t\tparams += opt.query(\"sid\", dom_prefix + \"reality_shortId\");\n\t\t\t\t\tparams += opt.query(\"spx\", dom_prefix + \"reality_spiderX\");\n\t\t\t\t\tparams += opt.query(\"pqv\", dom_prefix + \"reality_mldsa65Verify\");\n\t\t\t\t}\n\t\t\t\tparams += \"&security=\" + v_security;\n\t\t\t\tparams += opt.query(\"alpn\", dom_prefix + \"alpn\");\n\t\t\t\tparams += opt.query(\"sni\", dom_prefix + \"tls_serverName\");\n\t\t\t\tparams += opt.query(\"allowinsecure\", dom_prefix + \"tls_allowInsecure\");\n\t\t\t\tparams += opt.query(\"pcs\", dom_prefix + \"tls_pinSHA256\");\n\t\t\t\tparams += opt.query(\"vcn\", dom_prefix + \"tls_CertByName\");\n\t\t\t\tparams += opt.query(\"ech\", dom_prefix + \"ech_config\");\n\t\t\t}\n\n\t\t\topt.get(dom_prefix + \"tcp_fast_open\")?.checked && (params += \"&tfo=1\");\n\t\t\tif (opt.get(dom_prefix + \"use_finalmask\")?.checked) {\n\t\t\t\tparams += opt.query(\"fm\", dom_prefix + \"finalmask\");\n\t\t\t}\n\n\t\t\tparams += \"#\" + encodeURI(v_alias.value);\n\t\t\tif (params[0] == \"&\") {\n\t\t\t\tparams = params.substring(1);\n\t\t\t}\n\t\t\turl += params;\n\t\t} else if ((v_type === \"Hysteria2\") || ((v_type === \"sing-box\" || v_type === \"Xray\") && opt.get(dom_prefix + \"protocol\").value === \"hysteria2\")) {\n\t\t\tprotocol = \"hysteria2\"\n\t\t\tvar v_port = opt.get(dom_prefix + \"port\");\n\t\t\tvar params = \"\";\n\t\t\tparams += opt.query(\"sni\", dom_prefix + \"tls_serverName\");\n\t\t\tparams += opt.query(\"insecure\", dom_prefix + \"tls_allowInsecure\");\n\t\t\tparams += opt.query(\"pinSHA256\", dom_prefix + \"tls_pinSHA256\");\n\t\t\tparams += opt.query(\"pcs\", dom_prefix + \"tls_pinSHA256\");\n\t\t\tparams += opt.query(\"vcn\", dom_prefix + \"tls_CertByName\");\n\t\t\t\n\t\t\tvar v_password = null;\n\t\t\t\n\t\t\tif (v_type === \"Hysteria2\") {\n\t\t\t\tv_password = opt.get(\"hysteria2_auth_password\");\n\t\t\t\tvar dom_obfs = opt.get(\"hysteria2_obfs\");\n\t\t\t\tif (dom_obfs && dom_obfs.value != \"\") {\n\t\t\t\t\tparams += \"&obfs=\" + \"salamander\";\n\t\t\t\t\tparams += opt.query(\"obfs-password\", \"hysteria2_obfs\");\n\t\t\t\t}\n\t\t\t\tparams += opt.query(\"mport\", \"hysteria2_hop\");\n\t\t\t} else {\n\t\t\t\tv_password = opt.get(dom_prefix + \"hysteria2_auth_password\");\n\t\t\t\tvar dom_obfs_type = opt.get(dom_prefix + \"hysteria2_obfs_type\");\n\t\t\t\tif (dom_obfs_type && dom_obfs_type.value != \"\") {\n\t\t\t\t\tparams += opt.query(\"obfs\", dom_prefix + \"hysteria2_obfs_type\");\n\t\t\t\t\tparams += opt.query(\"obfs-password\", dom_prefix + \"hysteria2_obfs_password\");\n\t\t\t\t}\n\t\t\t\tparams += opt.query(\"mport\", dom_prefix + \"hysteria2_hop\");\n\t\t\t\tif (opt.get(dom_prefix + \"use_finalmask\")?.checked) {\n\t\t\t\t\tparams += opt.query(\"fm\", dom_prefix + \"finalmask\");\n\t\t\t\t}\n\t\t\t}\n\t\t\tparams = params.replace(/^&/, \"\");\n\t\t\turl =\n\t\t\t\t_address + \":\" +\n\t\t\t\tv_port.value + \"?\" +\n\t\t\t\tparams +\n\t\t\t\t\"#\" + encodeURI(v_alias.value);\n\t\t\tif (v_password) {\n\t\t\t\turl = encodeURIComponent(v_password.value) + \"@\" + url\n\t\t\t}\n\t\t} else if (v_type === \"sing-box\" && opt.get(dom_prefix + \"protocol\").value === \"tuic\") {\n\t\t\tprotocol = \"tuic\";\n\t\t\tvar v_username = opt.get(dom_prefix + \"uuid\");\n\t\t\tvar v_password = opt.get(dom_prefix + \"password\");\n\t\t\tvar v_port = opt.get(dom_prefix + \"port\");\n\t\t\turl = encodeURIComponent(v_username.value) +\n\t\t\t\t\":\" + encodeURIComponent(v_password.value) +\n\t\t\t\t\"@\" + _address +\n\t\t\t\t\":\" + v_port.value + \"?\";\n\n\t\t\tvar params = \"\";\n\t\t\tparams += opt.query(\"sni\", dom_prefix + \"tls_serverName\");\n\t\t\tparams += opt.query(\"disable_sni\", dom_prefix + \"tls_disable_sni\");\n\t\t\tparams += opt.query(\"alpn\", dom_prefix + \"tuic_alpn\");\n\t\t\tparams += opt.query(\"congestion_control\", dom_prefix + \"tuic_congestion_control\");\n\t\t\tparams += opt.query(\"udp_relay_mode\", dom_prefix + \"tuic_udp_relay_mode\");\n\t\t\tparams += opt.query(\"allowinsecure\", dom_prefix + \"tls_allowInsecure\");\n\n\t\t\tparams += \"#\" + encodeURI(v_alias.value);\n\t\t\tif (params[0] == \"&\") {\n\t\t\t\tparams = params.substring(1);\n\t\t\t}\n\t\t\turl += params;\n\t\t} else if (v_type === \"sing-box\" && opt.get(dom_prefix + \"protocol\").value === \"anytls\") {\n\t\t\tprotocol = \"anytls\";\n\t\t\tvar v_password = opt.get(dom_prefix + \"password\");\n\t\t\tvar v_port = opt.get(dom_prefix + \"port\");\n\t\t\turl = encodeURIComponent(v_password.value) +\n\t\t\t\t\"@\" + _address +\n\t\t\t\t\":\" + v_port.value + \"?\";\n\n\t\t\tvar params = \"\";\n\t\t\tif (opt.get(dom_prefix + \"tls\").checked) {\n\t\t\t\tvar v_security = \"tls\";\n\t\t\t\tif (opt.get(dom_prefix + \"fingerprint\") && opt.get(dom_prefix + \"fingerprint\").value != \"\") {\n\t\t\t\t\tlet v_fp = opt.get(dom_prefix + \"fingerprint\").value;\n\t\t\t\t\tparams += \"&fp=\" + v_fp;\n\t\t\t\t}\n\t\t\t\tif (opt.get(dom_prefix + \"reality\") && opt.get(dom_prefix + \"reality\").checked) {\n\t\t\t\t\tv_security = \"reality\";\n\t\t\t\t\tparams += opt.query(\"pbk\", dom_prefix + \"reality_publicKey\");\n\t\t\t\t\tparams += opt.query(\"sid\", dom_prefix + \"reality_shortId\");\n\t\t\t\t}\n\t\t\t\tparams += \"&security=\" + v_security;\n\t\t\t\tparams += opt.query(\"alpn\", dom_prefix + \"alpn\");\n\t\t\t\tparams += opt.query(\"sni\", dom_prefix + \"tls_serverName\");\n\t\t\t\tparams += opt.query(\"allowinsecure\", dom_prefix + \"tls_allowInsecure\");\n\t\t\t}\n\n\t\t\tparams += \"#\" + encodeURI(v_alias.value);\n\t\t\tif (params[0] == \"&\") {\n\t\t\t\tparams = params.substring(1);\n\t\t\t}\n\t\t\turl += params;\n\t\t} else if (v_type === \"sing-box\" && opt.get(dom_prefix + \"protocol\").value === \"naive\") {\n\t\t\tprotocol = \"naive+https\";\n\t\t\tvar v_username = opt.get(dom_prefix + \"username\");\n\t\t\tvar v_password = opt.get(dom_prefix + \"password\");\n\t\t\tvar v_port = opt.get(dom_prefix + \"port\");\n\t\t\turl = encodeURIComponent(v_username.value) +\n\t\t\t\t\":\" + encodeURIComponent(v_password.value) +\n\t\t\t\t\"@\" + _address +\n\t\t\t\t\":\" + v_port.value + \"?\";\n\n\t\t\tvar params = \"security=tls\";\n\t\t\tparams += opt.query(\"sni\", dom_prefix + \"tls_serverName\");\n\t\t\tparams += opt.query(\"insecure-concurrency\", dom_prefix + \"naive_insecure_concurrency\");\n\t\t\tparams += opt.query(\"ech\", dom_prefix + \"ech_config\");\n\t\t\tparams += opt.query(\"uot\", dom_prefix + \"uot\");\n\t\t\tif (opt.get(dom_prefix + \"naive_quic\")?.checked) {\n\t\t\t\tprotocol = \"naive+quic\";\n\t\t\t\tparams += opt.query(\"congestion_control\", dom_prefix + \"naive_congestion_control\");\n\t\t\t}\n\n\t\t\tparams += \"#\" + encodeURI(v_alias.value);\n\t\t\tif (params[0] == \"&\") {\n\t\t\t\tparams = params.substring(1);\n\t\t\t}\n\t\t\turl += params;\n\t\t}\n\t\tif (url) {\n\t\t\turl = protocol.toLowerCase() + \"://\" + url;\n\t\t\treturn url;\n\t\t} else {\n\t\t\talert(\"<%:Not a supported scheme:%> \" + v_type);\n\t\t}\n\t\treturn false;\n\t}\n\n\tfunction exportUrl(btn, urlname, sid) {\n\t\tvar url = buildUrl(btn, urlname, sid);\n\t\tif (url) {\n\t\t\tvar textarea = document.createElement(\"textarea\");\n\t\t\ttextarea.textContent = url;\n\t\t\ttextarea.style.position = \"fixed\";\n\t\t\tdocument.body.appendChild(textarea);\n\t\t\ttextarea.select();\n\t\t\ttry {\n\t\t\t\tvar s = document.getElementById(urlname + \"-status\");\n\t\t\t\tif (!s) {\n\t\t\t\t\talert(\"Never\");\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\tdocument.execCommand(\"copy\"); // Security exception may be thrown by some browsers.\n\t\t\t\ts.innerHTML = \"<font color='green'><%:Share URL to clipboard successfully.%></font>\";\n\t\t\t} catch (ex) {\n\t\t\t\ts.innerHTML = \"<font color='red'><%:Share URL to clipboard unable.%></font>\";\n\t\t\t} finally {\n\t\t\t\tdocument.body.removeChild(textarea);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction unbracketIP(server) {\n\t\tif (!server) return '';\n\t\treturn server.replace(/^\\[/, '').replace(/\\]$/, '');\n\t}\n\n\tfunction fromUrl(btn, urlname, sid, cacheData) {\n\t\tvar opt = {\n\t\t\tbase: 'cbid.<%=appname%>',\n\t\t\tclient: true,\n\t\t\tget: function (opt) {\n\t\t\t\tvar obj;\n\t\t\t\tvar id = this.base + '.' + opt;\n\t\t\t\tobj = document.getElementsByName(id)[0] || document.getElementById(id);\n\t\t\t\tif (obj) {\n\t\t\t\t\tvar combobox = document.getElementById('cbi.combobox.' + id);\n\t\t\t\t\tif (combobox) {\n\t\t\t\t\t\tobj.combobox = combobox;\n\t\t\t\t\t}\n\t\t\t\t\tvar div = document.getElementById(id);\n\t\t\t\t\tif (div && div.getElementsByTagName(\"li\").length > 0) {\n\t\t\t\t\t\tobj = div;\n\t\t\t\t\t}\n\t\t\t\t\treturn obj;\n\t\t\t\t} else {\n\t\t\t\t\treturn null;\n\t\t\t\t}\n\t\t\t},\n\t\t\tset: function (opt, val) {\n\t\t\t\tvar obj;\n\t\t\t\tobj = this.get(opt);\n\t\t\t\tif (obj) {\n\t\t\t\t\tvar event = document.createEvent(\"HTMLEvents\");\n\t\t\t\t\tevent.initEvent(\"change\", true, true);\n\t\t\t\t\tif (obj.type === 'checkbox') {\n\t\t\t\t\t\tobj.checked = val;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tobj.value = val;\n\t\t\t\t\t\tif (obj.combobox) {\n\t\t\t\t\t\t\tobj.combobox.value = val;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tvar list = obj.getElementsByTagName(\"li\");\n\t\t\t\t\t\tif (list.length > 0) {\n\t\t\t\t\t\t\tfor (var i = 0; i < list.length; i++) {\n\t\t\t\t\t\t\t\tvar li = list[i];\n\t\t\t\t\t\t\t\tvar data = li.getAttribute(\"data-value\");\n\t\t\t\t\t\t\t\tli.removeAttribute(\"selected\");\n\t\t\t\t\t\t\t\tli.removeAttribute(\"display\");\n\t\t\t\t\t\t\t\tif (data && data == val) {\n\t\t\t\t\t\t\t\t\tli.setAttribute(\"selected\", true);\n\t\t\t\t\t\t\t\t\tli.setAttribute(\"display\", \"0\");\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tvar input = document.getElementsByName(obj.id)[0];\n\t\t\t\t\t\t\tif (input) {\n\t\t\t\t\t\t\t\tinput.value = val;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tvar input = document.createElement(\"input\");\n\t\t\t\t\t\t\t\tinput.setAttribute(\"type\", \"hidden\");\n\t\t\t\t\t\t\t\tinput.setAttribute(\"name\", obj.id);\n\t\t\t\t\t\t\t\tinput.setAttribute(\"value\", val);\n\t\t\t\t\t\t\t\tobj.appendChild(input);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttry {\n\t\t\t\t\t\tobj.dispatchEvent(event);\n\t\t\t\t\t} catch (err) {}\n\t\t\t\t} else {\n\t\t\t\t\t//alert('<%:Faltal on set option, please help in debug: %>' + opt + ' = ' + val);\n\t\t\t\t\t// Processing DynamicList\n\t\t\t\t\tvar fullName = this.base + '.' + opt;\n\t\t\t\t\tvar lists = document.querySelectorAll('.cbi-dynlist');\n\t\t\t\t\tfor (var i = 0; i < lists.length; i++) {\n\t\t\t\t\t\tvar parent = lists[i].closest('.cbi-value');\n\t\t\t\t\t\tif (!parent) continue;\n\t\t\t\t\t\t// Try to extract fullName from the label's for attribute.\n\t\t\t\t\t\tvar label = parent.querySelector('label.cbi-value-title');\n\t\t\t\t\t\tvar labelFor = label?.getAttribute('for');\n\t\t\t\t\t\tif (labelFor === fullName) {\n\t\t\t\t\t\t\tvar input = lists[i].querySelector('input[type=\"text\"]');\n\t\t\t\t\t\t\tvar addBtn = lists[i].querySelector('.cbi-button-add');\n\t\t\t\t\t\t\tif (input && addBtn) {\n\t\t\t\t\t\t\t\tinput.value = val;\n\t\t\t\t\t\t\t\taddBtn.click();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t},\n\t\t\tsetlist: function (opt, vlist) {\n\t\t\t\tvar id = this.base + \".\" + opt;\n\t\t\t\tvar objs = document.getElementsByName(id) || document.getElementsByClassName(id);\n\t\t\t\tif (objs) {\n\t\t\t\t\tvar values = \"\";\n\t\t\t\t\tfor (var i = 0; i < vlist.length; i++) {\n\t\t\t\t\t\tvalues += vlist[i] + \", \";\n\t\t\t\t\t}\n\t\t\t\t\talert(\"Manually input the option:\\n\" + opt + \"s:\\n[\" + values + \"]\");\n\t\t\t\t} else {\n\t\t\t\t\t//alert(\"<%:Faltal on set option, please help in debug: %>\" + opt);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tvar s = document.getElementById(urlname + '-status');\n\t\tif (!s) {\n\t\t\talert(\"Never\");\n\t\t\treturn false;\n\t\t}\n\t\topt.base = \"cbid.\" + urlname + \".\" + sid;\n\t\topt.client = urlname.indexOf(\"server\") === -1;\n\t\tvar ssrurl = null;\n\t\tif (cacheData) {\n\t\t\tssrurl = cacheData.ssrurl\n\t\t} else {\n\t\t\tssrurl = prompt('<%:Paste Share URL Here%>', '');\n\t\t\tif (ssrurl === null || ssrurl === \"\") {\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tsessionStorage.setItem(\"fromUrl\", JSON.stringify({\n\t\t\t\ttimestamp: Date.now(),\n\t\t\t\tsavetime: 60 * 1000,\n\t\t\t\turlname: urlname,\n\t\t\t\tsid: sid,\n\t\t\t\tssrurl: ssrurl\n\t\t\t}));\n\t\t}\n\t\tssrurl = ssrurl.replace(/&amp;/gi, '&').replace(/\\s*#\\s*/, '#').trim();  // Some odd links use \"&\" as \"&\", and include spaces before and after \"#\".\n\t\ts.innerHTML = \"\";\n\t\tvar ssu = ssrurl.split('://');\n\t\tvar event = document.createEvent(\"HTMLEvents\");\n\t\tevent.initEvent(\"change\", true, true);\n\n\t\tvar dom_prefix = null\n\n\t\tif (ssu[0] === \"ssr\") {\n\t\t\tdom_prefix = \"ssr_\"\n\t\t\t//var b64c = ssu[1].match(/([A-Za-z0-9_-]+)/);\n\t\t\tvar sstr = b64decsafe((ssu[1] || \"\").replace(/#.*/, \"\").trim());\n\t\t\tvar ploc = sstr.indexOf(\"/?\");\n\t\t\tvar url0 = \"\", param = \"\";\n\t\t\tif (ploc > 0) {\n\t\t\t\turl0 = sstr.substr(0, ploc);\n\t\t\t\tparam = sstr.substr(ploc + 2);\n\t\t\t} else {\n\t\t\t\tvar url0 = sstr;\n\t\t\t}\n\t\t\tvar ssm = url0.match(/^(.+):([^:]+):([^:]*):([^:]+):([^:]*):([^:]+)/);\n\t\t\tif (!ssm || ssm.length < 7) {\n\t\t\t\ts.innerHTML = \"<font color='red'><%:Invalid Share URL Format%></font>\";\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar pdict = {};\n\t\t\tif (param.length > 2) {\n\t\t\t\tvar a = param.split('&');\n\t\t\t\tfor (var i = 0; i < a.length; i++) {\n\t\t\t\t\tvar b = a[i].split('=');\n\t\t\t\t\tpdict[decodeURIComponent(b[0])] = decodeURIComponent(b[1] || '');\n\t\t\t\t}\n\t\t\t}\n\t\t\topt.set('type', \"SSR\");\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(ssm[1]));\n\t\t\topt.set(dom_prefix + 'port', ssm[2]);\n\t\t\topt.set(dom_prefix + 'protocol', ssm[3]);\n\t\t\topt.set(dom_prefix + 'method', ssm[4]);\n\t\t\topt.set(dom_prefix + 'obfs', ssm[5]);\n\t\t\topt.set(dom_prefix + 'password', b64decsafe(ssm[6]));\n\t\t\topt.set(dom_prefix + 'obfs_param', dictvalue(pdict, 'obfsparam'));\n\t\t\topt.set(dom_prefix + 'protocol_param', dictvalue(pdict, 'protoparam'));\n\t\t\tvar rem = pdict['remarks'];\n\t\t\tif (typeof (rem) !== 'undefined' && rem !== '' && rem.length > 0)\n\t\t\t\topt.set('remarks', b64decutf8safe(rem));\n\t\t}\n\t\tif (ssu[0] === \"ss\") {\n\t\t\tvar url0 = ssu[1] || \"\";\n\t\t\tparam = \"\";\n\n\t\t\tvar ploc = url0.indexOf(\"#\");\n\t\t\tif (ploc >= 0) {\n\t\t\t\tparam = url0.substr(ploc + 1);\n\t\t\t\turl0 = url0.substr(0, ploc);\n\t\t\t}\n\n\t\t\tvar queryIndex = (url0 = url0.replace('/?', '?')).indexOf(\"?\");\n\t\t\tvar queryStr = \"\";\n\t\t\tif (queryIndex >= 0) {\n\t\t\t\tqueryStr = url0.substr(queryIndex + 1);\n\t\t\t\turl0 = url0.substr(0, queryIndex);\n\t\t\t}\n\t\t\tvar queryParam = {};\n\t\t\tqueryParam = Object.fromEntries(new URLSearchParams(queryStr));\n\n\t\t\tvar server, port, method, password, plugin, pluginOpts;\n\t\t\tvar sipIndex = url0.indexOf(\"@\");\n\t\t\tif (sipIndex !== -1) {\n\t\t\t\t// SIP002 base64(method:pass)@host:port\n\t\t\t\tvar userInfo = b64decsafe(decodeURIComponent(url0.substr(0, sipIndex)));\n\t\t\t\tvar temp = url0.substr(sipIndex + 1);\n\t\t\t\tvar serverInfo = temp.split(\":\");\n\t\t\t\tserver = serverInfo[0];\n\t\t\t\tport = serverInfo[1];\n\t\t\t\tvar userInfoSplitIndex = userInfo.indexOf(\":\");\n\t\t\t\tif (userInfoSplitIndex !== -1) {\n\t\t\t\t\tmethod = userInfo.substr(0, userInfoSplitIndex);\n\t\t\t\t\tpassword = userInfo.substr(userInfoSplitIndex + 1);\n\t\t\t\t} else {\n\t\t\t\t\tpassword = url0.substr(0, sipIndex);  // Some links use plaintext UUIDs as passwords.\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// base64(method:pass@host:port)\n\t\t\t\tvar sstr = b64decsafe(decodeURIComponent(url0));\n\t\t\t\tvar m2022 = sstr.match(/^([^:]+):([^:]+):([^@]+)@([^:]+):(\\d+)$/);\n\t\t\t\tvar mNormal = sstr.match(/^([^:]+):([^@]+)@([^:]+):(\\d+)$/);\n\t\t\t\tif (m2022) {\n\t\t\t\t\tmethod = m2022[1];\n\t\t\t\t\tpassword = m2022[2] + \":\" + m2022[3];\n\t\t\t\t\tserver = m2022[4];\n\t\t\t\t\tport = m2022[5];\n\t\t\t\t} else if (mNormal) {\n\t\t\t\t\tmethod = mNormal[1];\n\t\t\t\t\tpassword = mNormal[2];\n\t\t\t\t\tserver = mNormal[3];\n\t\t\t\t\tport = mNormal[4];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Determine if the password is URL encoded\n\t\t\tconst isURLEncodedPassword = function(pwd) {\n\t\t\t\tif (!/%[0-9A-Fa-f]{2}/.test(pwd)) return false;\n\t\t\t\ttry {\n\t\t\t\t\tconst decoded = decodeURIComponent(pwd.replace(/\\+/g, \"%20\"));\n\t\t\t\t\tconst reencoded = encodeURIComponent(decoded);\n\t\t\t\t\treturn reencoded === pwd;\n\t\t\t\t} catch (e) {\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t}\n\t\t\tpassword = isURLEncodedPassword(password) ? decodeURIComponent(password) : password;\n\n\t\t\tif (queryParam.plugin) {\n\t\t\t\tvar pluginParams = decodeURIComponent(queryParam.plugin).split(\";\");\n\t\t\t\tplugin = pluginParams.shift();\n\t\t\t\tpluginOpts = pluginParams.join(\";\");\n\t\t\t}\n\n\t\t\tconst needUpgrade = ss_type !== \"Xray\" && ss_type !== \"sing-box\" &&\n\t\t\t\t\tqueryParam.type && queryParam.type !== \"tcp\" &&\n\t\t\t\t\tqueryParam.headerType && queryParam.headerType !== \"none\";\n\t\t\tif (has_xray && (ss_type == \"xray\" || needUpgrade || queryParam.type === \"xhttp\")) {\n\t\t\t\tdom_prefix = \"xray_\"\n\t\t\t\topt.set('type', \"Xray\");\n\t\t\t\topt.set(dom_prefix + 'protocol', \"shadowsocks\");\n\t\t\t} else if (has_singbox && (ss_type == \"sing-box\" || needUpgrade)) {\n\t\t\t\tdom_prefix = \"singbox_\"\n\t\t\t\topt.set('type', \"sing-box\");\n\t\t\t\topt.set(dom_prefix + 'protocol', \"shadowsocks\");\n\t\t\t} else if (ss_type == \"shadowsocks-rust\") {\n\t\t\t\tdom_prefix = \"ssrust_\"\n\t\t\t\topt.set('type', \"SS-Rust\");\n\t\t\t} else {\n\t\t\t\tif ([\"2022-blake3-aes-128-gcm\", \"2022-blake3-aes-256-gcm\", \"2022-blake3-chacha20-poly1305\"].includes(method)) {\n\t\t\t\t\tdom_prefix = \"ssrust_\"\n\t\t\t\t\topt.set('type', \"SS-Rust\");\n\t\t\t\t} else {\n\t\t\t\t\tdom_prefix = \"ss_\"\n\t\t\t\t\topt.set('type', \"SS\");\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst _method = (method || \"none\").toLowerCase();\n\t\t\tconst mapping = {\n\t\t\t\t\"chacha20-poly1305\": \"chacha20-ietf-poly1305\",\n\t\t\t\t\"xchacha20-poly1305\": \"xchacha20-ietf-poly1305\",\n\t\t\t};\n\t\t\tmethod = mapping[_method] || _method;\n\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(server));\n\t\t\topt.set(dom_prefix + 'port', port);\n\t\t\topt.set(dom_prefix + 'password', password || \"\");\n\t\t\topt.set(dom_prefix + 'method', method || \"\");\n\t\t\topt.set(dom_prefix + 'ss_method', method || \"\");\n\t\t\topt.set(dom_prefix + 'tcp_fast_open', queryParam.tfo);\n\t\t\tif (plugin && plugin != \"none\") {\n\t\t\t\tplugin = (plugin === \"simple-obfs\") ? \"obfs-local\" : plugin;\n\t\t\t\topt.set(dom_prefix + 'plugin_enabled', true);\n\t\t\t\topt.set(dom_prefix + 'plugin', plugin || \"none\");\n\t\t\t\topt.set(dom_prefix + 'plugin_opts', pluginOpts || \"\");\n\t\t\t\t// The obfs-local plugin converts data to a format supported by xray.\n\t\t\t\tif (plugin == \"obfs-local\" && dom_prefix == \"xray_\") {\n\t\t\t\t\tvar obfs = pluginOpts.match(/obfs=([^;]+)/);\n\t\t\t\t\tvar obfs_host = pluginOpts.match(/obfs-host=([^;]+)/);\n\t\t\t\t\tobfs = obfs ? obfs[1] : \"\";\n\t\t\t\t\tobfs_host = obfs_host ? obfs_host[1] : \"\";\n\t\t\t\t\tif (obfs === \"http\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'transport', \"raw\");\n\t\t\t\t\t\topt.set(dom_prefix + 'tcp_guise', \"http\");\n\t\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_host', obfs_host || '');\n\t\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_path', '/');\n\t\t\t\t\t} else if (obfs === \"tls\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'tls', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'tls_serverName', obfs_host || '');\n\t\t\t\t\t\topt.set(dom_prefix + 'tls_allowInsecure', true);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\topt.set(dom_prefix + 'plugin', \"none\");\n\t\t\t}\n\t\t\tif (param !== undefined) {\n\t\t\t\topt.set('remarks', decodeURIComponent(param));\n\t\t\t}\n\n\t\t\tif (Object.keys(queryParam).length > 0 && !queryParam.plugin) {\n\t\t\t\tif (queryParam.security) {\n\t\t\t\t\tif (queryParam.security == \"tls\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'tls', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'reality', false);\n\t\t\t\t\t\topt.set(dom_prefix + 'alpn', queryParam.alpn || 'default');\n\t\t\t\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || '');\n\t\t\t\t\t\topt.set(\n\t\t\t\t\t\t\tdom_prefix + 'tls_allowInsecure',\n\t\t\t\t\t\t\t!((queryParam.allowinsecure ?? '0') === '0' && (queryParam.allowInsecure ?? '0') === '0' && (queryParam.insecure ?? '0') === '0')\n\t\t\t\t\t\t);\n\t\t\t\t\t\tif (queryParam.fp && queryParam.fp.trim() != \"\") {\n\t\t\t\t\t\t\topt.set(dom_prefix + 'utls', true);\n\t\t\t\t\t\t\topt.set(dom_prefix + 'fingerprint', queryParam.fp);\n\t\t\t\t\t\t}\n\t\t\t\t\t\topt.set(dom_prefix + 'ech', !!queryParam.ech);\n\t\t\t\t\t\topt.set(dom_prefix + 'ech_config', queryParam.ech || '');\n\t\t\t\t\t\topt.set(dom_prefix + 'tls_pinSHA256', queryParam.pcs || '');\n\t\t\t\t\t\topt.set(dom_prefix + 'tls_CertByName', queryParam.vcn || '');\n\t\t\t\t\t}\n\n\t\t\t\t\tif (queryParam.security == \"reality\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'tls', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'reality', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'alpn', queryParam.alpn || 'default');\n\t\t\t\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || '');\n\t\t\t\t\t\tif (queryParam.fp && queryParam.fp.trim() != \"\") {\n\t\t\t\t\t\t\topt.set(dom_prefix + 'utls', true);\n\t\t\t\t\t\t\topt.set(dom_prefix + 'fingerprint', queryParam.fp);\n\t\t\t\t\t\t}\n\t\t\t\t\t\topt.set(dom_prefix + 'reality_publicKey', queryParam.pbk || '');\n\t\t\t\t\t\topt.set(dom_prefix + 'reality_shortId', queryParam.sid || '');\n\t\t\t\t\t\topt.set(dom_prefix + 'reality_spiderX', queryParam.spx || '');\n\t\t\t\t\t\topt.set(dom_prefix + 'use_mldsa65Verify', !!queryParam.pqv);\n\t\t\t\t\t\topt.set(dom_prefix + 'reality_mldsa65Verify', queryParam.pqv || '');\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tqueryParam.type = queryParam.type?.toLowerCase();\n\t\t\t\tif (queryParam.type === \"kcp\") {\n\t\t\t\t\tqueryParam.type = \"mkcp\";\n\t\t\t\t}\n\t\t\t\tif (queryParam.type === \"h2\") {\n\t\t\t\t\tqueryParam.type = \"http\";\n\t\t\t\t}\n\t\t\t\tif (dom_prefix == \"singbox_\" && queryParam.type === \"raw\") {\n\t\t\t\t\tqueryParam.type = \"tcp\";\n\t\t\t\t} else if (dom_prefix == \"xray_\" && queryParam.type === \"tcp\") {\n\t\t\t\t\tqueryParam.type = \"raw\";\n\t\t\t\t}\n\t\t\t\tif (dom_prefix == \"xray_\" && queryParam.type === \"http\") {\n\t\t\t\t\topt.set(dom_prefix + 'transport', \"xhttp\");\n\t\t\t\t} else {\n\t\t\t\t\topt.set(dom_prefix + 'transport', queryParam.type);\n\t\t\t\t}\n\t\t\t\tif (queryParam.type === \"raw\" || queryParam.type === \"tcp\") {\n\t\t\t\t\topt.set(dom_prefix + 'tcp_guise', queryParam.headerType || \"none\");\n\t\t\t\t\tif (queryParam.headerType && queryParam.headerType != \"none\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_host', queryParam.host || \"\");\n\t\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_path', queryParam.path || \"\");\n\t\t\t\t\t}\n\t\t\t\t} else if (queryParam.type === \"ws\") {\n\t\t\t\t\topt.set(dom_prefix + 'ws_host', queryParam.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'ws_path', queryParam.path || \"\");\n\t\t\t\t\tif (dom_prefix == \"singbox_\" && queryParam.path && queryParam.path.length > 1) {\n\t\t\t\t\t\tvar ws_path_params = {};\n\t\t\t\t\t\tvar ws_path_dat = queryParam.path.split('?');\n\t\t\t\t\t\tvar ws_path = ws_path_dat[0];\n\t\t\t\t\t\tvar ws_path_params = {};\n\t\t\t\t\t\tvar ws_path_params_array = (ws_path_dat[1] || '').split('&');\n\t\t\t\t\t\tfor (i = 0; i < ws_path_params_array.length; i++) {\n\t\t\t\t\t\t\tvar kv = ws_path_params_array[i].split('=');\n\t\t\t\t\t\t\tws_path_params[decodeURIComponent(kv[0]).toLowerCase()] = decodeURIComponent(kv[1] || '');\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (ws_path_params.ed) {\n\t\t\t\t\t\t\topt.set(dom_prefix + 'ws_path', ws_path);\n\t\t\t\t\t\t\topt.set(dom_prefix + 'ws_enableEarlyData', true);\n\t\t\t\t\t\t\topt.set(dom_prefix + 'ws_maxEarlyData', ws_path_params.ed);\n\t\t\t\t\t\t\topt.set(dom_prefix + 'ws_earlyDataHeaderName', 'Sec-WebSocket-Protocol');\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t} else if (queryParam.type === \"http\") {\n\t\t\t\t\tif (dom_prefix == \"xray_\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'xhttp_mode', \"stream-one\");\n\t\t\t\t\t\topt.set(dom_prefix + 'xhttp_host', queryParam.host || \"\");\n\t\t\t\t\t\topt.set(dom_prefix + 'xhttp_path', queryParam.path || \"\");\n\t\t\t\t\t} else {\n\t\t\t\t\t\topt.set(dom_prefix + 'http_host', queryParam.host || \"\");\n\t\t\t\t\t\topt.set(dom_prefix + 'http_path', queryParam.path || \"\");\n\t\t\t\t\t}\n\t\t\t\t} else if (queryParam.type === \"quic\") {\n\t\t\t\t\topt.set(dom_prefix + 'quic_guise', queryParam.headerType || \"none\");\n\t\t\t\t\topt.set(dom_prefix + 'quic_security', queryParam.quicSecurity);\n\t\t\t\t\topt.set(dom_prefix + 'quic_key', queryParam.key);\n\t\t\t\t} else if (queryParam.type === \"mkcp\") {\n\t\t\t\t\topt.set(dom_prefix + 'mkcp_guise', queryParam.headerType || \"none\");\n\t\t\t\t\topt.set(dom_prefix + 'mkcp_seed', queryParam.seed || \"\");\n\t\t\t\t} else if (queryParam.type === \"grpc\") {\n\t\t\t\t\topt.set(dom_prefix + 'grpc_serviceName', (queryParam.serviceName || queryParam.path) || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'grpc_mode', queryParam.mode || \"gun\");\n\t\t\t\t} else if (queryParam.type === \"xhttp\") {\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_host', queryParam.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_path', queryParam.path || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_mode', queryParam.mode || \"auto\");\n\t\t\t\t\topt.set(dom_prefix + 'use_xhttp_extra', !!queryParam.extra);\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_extra', queryParam.extra || \"\");\n\t\t\t\t}\n\n\t\t\t\topt.set(dom_prefix + 'uot', queryParam.udp);\n\t\t\t\topt.set(dom_prefix + 'use_finalmask', !!queryParam.fm);\n\t\t\t\topt.set(dom_prefix + 'finalmask', queryParam.fm || \"\");\n\t\t\t\n\t\t\t\tif (queryParam[\"shadow-tls\"]) {\n\t\t\t\t\t// Parsing SS Shadow-TLS plugin parameters\n\t\t\t\t\tconst parseShadowTLSParams = function(base64Str, outObj) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tlet obj = JSON.parse(b64decsafe(base64Str));\n\t\t\t\t\t\t\tif (outObj && typeof outObj === \"object\") {\n\t\t\t\t\t\t\t\tfor (let k in obj) outObj[k] = obj[k];\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tlet out = [];\n\t\t\t\t\t\t\tif (obj.version) out.push(\"v\" + obj.version + \"=1\");\n\t\t\t\t\t\t\tif (obj.password) out.push(\"passwd=\" + obj.password);\n\t\t\t\t\t\t\tfor (let k in obj)\n\t\t\t\t\t\t\t\tif (k !== \"version\" && k !== \"password\")\n\t\t\t\t\t\t\t\t\tout.push(k + \"=\" + obj[k]);\n\t\t\t\t\t\t\treturn out.join(\";\");\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\treturn \"\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (dom_prefix === \"ssrust_\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'plugin_enabled', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'plugin', \"shadow-tls\");\n\t\t\t\t\t\tlet shadowtlsOpt = parseShadowTLSParams(queryParam[\"shadow-tls\"]);\n\t\t\t\t\t\topt.set(dom_prefix + 'plugin_opts', shadowtlsOpt || \"\");\n\t\t\t\t\t} else if (dom_prefix === \"singbox_\") {\n\t\t\t\t\t\tlet shadowtlsOpt = {};\n\t\t\t\t\t\tparseShadowTLSParams(queryParam[\"shadow-tls\"], shadowtlsOpt);\n\t\t\t\t\t\tif (Object.keys(shadowtlsOpt).length > 0) {\n\t\t\t\t\t\t\topt.set(dom_prefix + 'shadowtls', true);\n\t\t\t\t\t\t\topt.set(dom_prefix + 'shadowtls_version', shadowtlsOpt.version || \"1\");\n\t\t\t\t\t\t\topt.set(dom_prefix + 'shadowtls_password', shadowtlsOpt.password || \"\");\n\t\t\t\t\t\t\topt.set(dom_prefix + 'shadowtls_serverName', shadowtlsOpt.host || \"\");\n\t\t\t\t\t\t\tif (shadowtlsOpt.fingerprint) {\n\t\t\t\t\t\t\t\topt.set(dom_prefix + 'shadowtls_utls', true);\n\t\t\t\t\t\t\t\topt.set(dom_prefix + 'shadowtls_fingerprint', shadowtlsOpt.fingerprint || \"chrome\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (ssu[0] === \"trojan\") {\n\t\t\tif (trojan_type == \"sing-box\" && has_singbox) {\n\t\t\t\tdom_prefix = \"singbox_\"\n\t\t\t\topt.set('type', \"sing-box\");\n\t\t\t\topt.set(dom_prefix + 'protocol', \"trojan\");\n\t\t\t} else {\n\t\t\t\tdom_prefix = \"xray_\"\n\t\t\t\topt.set('type', \"Xray\");\n\t\t\t\topt.set(dom_prefix + 'protocol', \"trojan\");\n\t\t\t}\n\t\t\tvar m = parseNodeUrl(ssrurl);\n\t\t\tvar password = m.passwd;\n\t\t\tif (password === \"\") {\n\t\t\t\ts.innerHTML = \"<font color='red'><%:Invalid Share URL Format%></font>\";\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar queryParam = {};\n\t\t\tif (m.search.length > 1) {\n\t\t\t\tvar query = m.search.replace('/?', '?').split('?');\n\t\t\t\tvar queryParams = query[1];\n\t\t\t\tvar queryArray = queryParams.split('&');\n\t\t\t\tvar params;\n\t\t\t\tfor (var i = 0; i < queryArray.length; i++) {\n\t\t\t\t\tparams = queryArray[i].split('=');\n\t\t\t\t\tqueryParam[decodeURIComponent(params[0])] = decodeURIComponent(params[1] || '');\n\t\t\t\t}\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'mux', queryParam.mux === '1');\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(m.hostname));\n\t\t\topt.set(dom_prefix + 'port', m.port || \"443\");\n\t\t\topt.set(dom_prefix + 'password', decodeURIComponent(password));\n\n\t\t\tqueryParam.type = queryParam.type ? queryParam.type.toLowerCase() : \"tcp\";\n\t\t\tif (queryParam.type === \"kcp\" || queryParam.type === \"mkcp\") {\n\t\t\t\tqueryParam.type = \"mkcp\";\n\t\t\t}\n\t\t\tif (queryParam.type === \"h2\" || queryParam.type === \"http\") {\n\t\t\t\tqueryParam.type = \"http\";\n\t\t\t}\n\t\t\tif (dom_prefix == \"singbox_\" && queryParam.type === \"raw\") {\n\t\t\t\tqueryParam.type = \"tcp\";\n\t\t\t} else if (dom_prefix == \"xray_\" && queryParam.type === \"tcp\") {\n\t\t\t\tqueryParam.type = \"raw\";\n\t\t\t}\n\t\t\tif (dom_prefix == \"xray_\" && queryParam.type === \"http\") {\n\t\t\t\topt.set(dom_prefix + 'transport', \"xhttp\");\n\t\t\t} else {\n\t\t\t\topt.set(dom_prefix + 'transport', queryParam.type);\n\t\t\t}\n\t\t\tif (queryParam.type === \"raw\" || queryParam.type === \"tcp\") {\n\t\t\t\topt.set(dom_prefix + 'tcp_guise', queryParam.headerType || \"none\");\n\t\t\t\tif (queryParam.headerType && queryParam.headerType != \"none\") {\n\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_host', queryParam.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_path', queryParam.path || \"\");\n\t\t\t\t}\n\t\t\t} else if (queryParam.type === \"ws\") {\n\t\t\t\topt.set(dom_prefix + 'ws_host', queryParam.host || \"\");\n\t\t\t\topt.set(dom_prefix + 'ws_path', queryParam.path || \"\");\n\t\t\t\tif (dom_prefix == \"singbox_\" && queryParam.path && queryParam.path.length > 1) {\n\t\t\t\t\tvar ws_path_params = {};\n\t\t\t\t\tvar ws_path_dat = queryParam.path.split('?');\n\t\t\t\t\tvar ws_path = ws_path_dat[0];\n\t\t\t\t\tvar ws_path_params = {};\n\t\t\t\t\tvar ws_path_params_array = (ws_path_dat[1] || '').split('&');\n\t\t\t\t\tfor (i = 0; i < ws_path_params_array.length; i++) {\n\t\t\t\t\t\tvar kv = ws_path_params_array[i].split('=');\n\t\t\t\t\t\tws_path_params[decodeURIComponent(kv[0]).toLowerCase()] = decodeURIComponent(kv[1] || '');\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (ws_path_params.ed) {\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_path', ws_path);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_enableEarlyData', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_maxEarlyData', ws_path_params.ed);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_earlyDataHeaderName', 'Sec-WebSocket-Protocol');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (queryParam.type === \"h2\" || queryParam.type === \"http\") {\n\t\t\t\tif (dom_prefix == \"xray_\") {\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_mode', \"stream-one\");\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_host', queryParam.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_path', queryParam.path || \"\");\n\t\t\t\t} else {\n\t\t\t\t\topt.set(dom_prefix + 'http_host', queryParam.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'http_path', queryParam.path || \"\");\n\t\t\t\t}\n\t\t\t} else if (queryParam.type === \"quic\") {\n\t\t\t\topt.set(dom_prefix + 'quic_guise', queryParam.headerType || \"none\");\n\t\t\t\topt.set(dom_prefix + 'quic_security', queryParam.quicSecurity);\n\t\t\t\topt.set(dom_prefix + 'quic_key', queryParam.key);\n\t\t\t} else if (queryParam.type === \"kcp\" || queryParam.type === \"mkcp\") {\n\t\t\t\topt.set(dom_prefix + 'mkcp_guise', queryParam.headerType || \"none\");\n\t\t\t\topt.set(dom_prefix + 'mkcp_seed', queryParam.seed || \"\");\n\t\t\t} else if (queryParam.type === \"grpc\") {\n\t\t\t\topt.set(dom_prefix + 'grpc_serviceName', (queryParam.serviceName || queryParam.path) || \"\");\n\t\t\t\topt.set(dom_prefix + 'grpc_mode', queryParam.mode || \"gun\");\n\t\t\t}\n\n\t\t\tqueryParam.security = queryParam.security || \"tls\";\n\t\t\topt.set(dom_prefix + 'tls', queryParam.security === \"tls\");\n\t\t\tif (queryParam.security === \"tls\") {\n\t\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.peer || queryParam.sni || \"\");\n\t\t\t\topt.set(dom_prefix + 'alpn', queryParam.alpn || 'default');\n\t\t\t\topt.set(dom_prefix + 'tls_pinSHA256', queryParam.pcs || '');\n\t\t\t\topt.set(dom_prefix + 'tls_CertByName', queryParam.vcn || '');\n\t\t\t}\n\t\t\topt.set(\n\t\t\t\tdom_prefix + 'tls_allowInsecure',\n\t\t\t\t!((queryParam.allowinsecure ?? '0') === '0' && (queryParam.allowInsecure ?? '0') === '0' && (queryParam.insecure ?? '0') === '0')\n\t\t\t);\n\t\t\topt.set(dom_prefix + 'tcp_fast_open', queryParam.tfo);\n\t\t\topt.set(dom_prefix + 'use_finalmask', !!queryParam.fm);\n\t\t\topt.set(dom_prefix + 'finalmask', queryParam.fm || \"\");\n\n\t\t\tif (m.hash) {\n\t\t\t\topt.set('remarks', decodeURIComponent(m.hash.substr(1)));\n\t\t\t}\n\t\t}\n\t\tif (ssu[0] === \"vmess\") {\n\t\t\tif (vmess_type == \"sing-box\" && has_singbox) {\n\t\t\t\tdom_prefix = \"singbox_\"\n\t\t\t\topt.set('type', \"sing-box\");\n\t\t\t} else {\n\t\t\t\tdom_prefix = \"xray_\"\n\t\t\t\topt.set('type', \"Xray\");\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'protocol', \"vmess\");\n\t\t\tvar sstr = b64DecodeUnicode((ssu[1] || \"\").replace(/#.*/, \"\").trim());\n\t\t\tvar ploc = sstr.indexOf(\"/?\");\n\t\t\tvar url0, param = \"\";\n\t\t\tif (ploc > 0) {\n\t\t\t\turl0 = sstr.substr(0, ploc);\n\t\t\t\tparam = sstr.substr(ploc + 2);\n\t\t\t}\n\t\t\tvar ssm = JSON.parse(sstr);\n\t\t\topt.set('remarks', ssm.ps);\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(ssm.add));\n\t\t\topt.set(dom_prefix + 'port', ssm.port);\n\t\t\topt.set(dom_prefix + 'uuid', ssm.id);\n\t\t\topt.set(dom_prefix + 'security', ssm.security || ssm.scy || \"auto\");\n\t\t\topt.set(dom_prefix + 'tls', ssm.tls === \"tls\");\n\t\t\tif (ssm.tls === \"tls\") {\n\t\t\t\topt.set(dom_prefix + 'tls_serverName', ssm.sni || ssm.host);\n\t\t\t\topt.set(dom_prefix + 'alpn', ssm.alpn || \"default\");\n\t\t\t\tif (ssm.fp && ssm.fp !== \"\") {\n\t\t\t\t\topt.set(dom_prefix + 'utls', true);\n\t\t\t\t\topt.set(dom_prefix + 'fingerprint', ssm.fp);\n\t\t\t\t}\n\t\t\t\topt.set(dom_prefix + 'tls_pinSHA256', ssm.pcs || \"\");\n\t\t\t\topt.set(\n\t\t\t\t\tdom_prefix + 'tls_allowInsecure',\n\t\t\t\t\t!((ssm.allowinsecure ?? '0') === '0' && (ssm.allowInsecure ?? '0') === '0' && (ssm.insecure ?? '0') === '0')\n\t\t\t\t);\n\t\t\t}\n\t\t\tssm.net = ssm.net.toLowerCase();\n\t\t\tif (ssm.net === \"kcp\" || ssm.net === \"mkcp\")\n\t\t\t\tssm.net = \"mkcp\"\n\t\t\tif (dom_prefix == \"singbox_\" && ssm.net === \"raw\") {\n\t\t\t\tssm.net = \"tcp\";\n\t\t\t} else if (dom_prefix == \"xray_\" && ssm.net === \"tcp\") {\n\t\t\t\tssm.net = \"raw\";\n\t\t\t}\n\t\t\tif (ssm.net === \"h2\" || ssm.net === \"http\") {\n\t\t\t\tssm.net = \"http\";\n\t\t\t}\n\t\t\tif (dom_prefix == \"xray_\" && ssm.net === \"http\") {\n\t\t\t\topt.set(dom_prefix + 'transport', \"xhttp\");\n\t\t\t} else {\n\t\t\t\topt.set(dom_prefix + 'transport', ssm.net);\n\t\t\t}\n\t\t\tif (ssm.net === \"raw\" || ssm.net === \"tcp\") {\n\t\t\t\topt.set(dom_prefix + 'tcp_guise', (ssm.host && ssm.host != \"\") ? \"http\" : \"none\");\n\t\t\t\tif (ssm.host && ssm.host != \"\") {\n\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_host', ssm.host);\n\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_path', ssm.path || \"\");\n\t\t\t\t}\n\t\t\t} else if (ssm.net === \"ws\") {\n\t\t\t\topt.set(dom_prefix + 'ws_host', ssm.host);\n\t\t\t\topt.set(dom_prefix + 'ws_path', ssm.path);\n\t\t\t\tif (dom_prefix == \"singbox_\" && ssm.path && ssm.path.length > 1) {\n\t\t\t\t\tvar ws_path_params = {};\n\t\t\t\t\tvar ws_path_dat = ssm.path.split('?');\n\t\t\t\t\tvar ws_path = ws_path_dat[0];\n\t\t\t\t\tvar ws_path_params = {};\n\t\t\t\t\tvar ws_path_params_array = (ws_path_dat[1] || '').split('&');\n\t\t\t\t\tfor (i = 0; i < ws_path_params_array.length; i++) {\n\t\t\t\t\t\tvar kv = ws_path_params_array[i].split('=');\n\t\t\t\t\t\tws_path_params[decodeURIComponent(kv[0]).toLowerCase()] = decodeURIComponent(kv[1] || '');\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (ws_path_params.ed) {\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_path', ws_path);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_enableEarlyData', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_maxEarlyData', ws_path_params.ed);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_earlyDataHeaderName', 'Sec-WebSocket-Protocol');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (ssm.net === \"http\") {\n\t\t\t\tif (dom_prefix == \"xray_\") {\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_mode', \"stream-one\");\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_host', ssm.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_path', ssm.path || \"\");\n\t\t\t\t} else {\n\t\t\t\t\topt.set(dom_prefix + 'http_host', ssm.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'http_path', ssm.path || \"\");\n\t\t\t\t}\n\t\t\t} else if (ssm.net === \"quic\") {\n\t\t\t\topt.set(dom_prefix + 'quic_security', ssm.securty);\n\t\t\t\topt.set(dom_prefix + 'quic_key', ssm.key);\n\t\t\t} else if (ssm.net === \"kcp\" || ssm.net === \"mkcp\") {\n\t\t\t\topt.set(dom_prefix + 'mkcp_guise', ssm.type || \"none\");\n\t\t\t\topt.set(dom_prefix + 'mkcp_seed', ssm.seed || \"\");\n\t\t\t} else if (ssm.net === \"grpc\") {\n\t\t\t\topt.set(dom_prefix + 'grpc_serviceName', ssm.path);\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'tcp_fast_open', ssm.tfo);\n\t\t\topt.set(dom_prefix + 'use_finalmask', !!ssm.fm);\n\t\t\topt.set(dom_prefix + 'finalmask', ssm.fm || \"\");\n\t\t}\n\t\tif (ssu[0] === \"vless\") {\n\t\t\tif (vless_type == \"sing-box\" && has_singbox) {\n\t\t\t\tdom_prefix = \"singbox_\"\n\t\t\t\topt.set('type', \"sing-box\");\n\t\t\t} else {\n\t\t\t\tdom_prefix = \"xray_\"\n\t\t\t\topt.set('type', \"Xray\");\n\t\t\t}\n\t\t\t\n\t\t\tvar m = parseNodeUrl(ssrurl);\n\t\t\tvar password = m.passwd;\n\t\t\tif (password === \"\") {\n\t\t\t\ts.innerHTML = \"<font color='red'><%:Invalid Share URL Format%></font>\";\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar queryParam = {};\n\t\t\tif (m.search.length > 1) {\n\t\t\t\tvar query = m.search.replace('/?', '?').split('?')\n\t\t\t\tvar queryParams = query[1];\n\t\t\t\tvar queryArray = queryParams.split('&');\n\t\t\t\tvar params;\n\t\t\t\tfor (i = 0; i < queryArray.length; i++) {\n\t\t\t\t\tparams = queryArray[i].split('=');\n\t\t\t\t\tqueryParam[decodeURIComponent(params[0])] = decodeURIComponent(params[1] || '');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tqueryParam.type = queryParam.type.toLowerCase();\n\t\t\tif ([\"xhttp\", \"kcp\", \"mkcp\"].includes(queryParam.type) && vless_type !== \"xray\" && has_xray) {\n\t\t\t\tdom_prefix = \"xray_\"\n\t\t\t\topt.set('type', \"Xray\");\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'protocol', \"vless\");\n\t\t\topt.set(dom_prefix + 'uuid', password);\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(m.hostname));\n\t\t\topt.set(dom_prefix + 'port', m.port || \"443\");\n\n\t\t\topt.set(dom_prefix + 'encryption', queryParam.encryption || \"none\");\n\t\t\topt.set(dom_prefix + 'flow', queryParam.flow || '');\n\t\t\tif (queryParam.security) {\n\t\t\t\tif (queryParam.security == \"tls\") {\n\t\t\t\t\topt.set(dom_prefix + 'tls', true);\n\t\t\t\t\topt.set(dom_prefix + 'reality', false);\n\t\t\t\t\topt.set(dom_prefix + 'alpn', queryParam.alpn || 'default');\n\t\t\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || '');\n\t\t\t\t\topt.set(\n\t\t\t\t\t\tdom_prefix + 'tls_allowInsecure',\n\t\t\t\t\t\t!((queryParam.allowinsecure ?? '0') === '0' && (queryParam.allowInsecure ?? '0') === '0' && (queryParam.insecure ?? '0') === '0')\n\t\t\t\t\t);\n\t\t\t\t\tif (queryParam.fp && queryParam.fp.trim() != \"\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'utls', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'fingerprint', queryParam.fp);\n\t\t\t\t\t}\n\t\t\t\t\topt.set(dom_prefix + 'ech', !!queryParam.ech);\n\t\t\t\t\topt.set(dom_prefix + 'ech_config', queryParam.ech || '');\n\t\t\t\t\topt.set(dom_prefix + 'tls_pinSHA256', queryParam.pcs || '');\n\t\t\t\t\topt.set(dom_prefix + 'tls_CertByName', queryParam.vcn || '');\n\t\t\t\t}\n\n\t\t\t\tif (queryParam.security == \"reality\") {\n\t\t\t\t\topt.set(dom_prefix + 'tls', true);\n\t\t\t\t\topt.set(dom_prefix + 'reality', true);\n\t\t\t\t\topt.set(dom_prefix + 'alpn', queryParam.alpn || 'default');\n\t\t\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || '');\n\t\t\t\t\tif (queryParam.fp && queryParam.fp.trim() != \"\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'utls', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'fingerprint', queryParam.fp);\n\t\t\t\t\t}\n\t\t\t\t\topt.set(dom_prefix + 'reality_publicKey', queryParam.pbk || '');\n\t\t\t\t\topt.set(dom_prefix + 'reality_shortId', queryParam.sid || '');\n\t\t\t\t\topt.set(dom_prefix + 'reality_spiderX', queryParam.spx || '');\n\t\t\t\t\topt.set(dom_prefix + 'use_mldsa65Verify', !!queryParam.pqv);\n\t\t\t\t\topt.set(dom_prefix + 'reality_mldsa65Verify', queryParam.pqv || '');\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tif (queryParam.type === \"kcp\" || queryParam.type === \"mkcp\") {\n\t\t\t\tqueryParam.type = \"mkcp\";\n\t\t\t}\n\t\t\tif (queryParam.type === \"h2\" || queryParam.type === \"http\") {\n\t\t\t\tqueryParam.type = \"http\";\n\t\t\t}\n\t\t\tif (dom_prefix == \"singbox_\" && queryParam.type === \"raw\") {\n\t\t\t\tqueryParam.type = \"tcp\";\n\t\t\t} else if (dom_prefix == \"xray_\" && queryParam.type === \"tcp\") {\n\t\t\t\tqueryParam.type = \"raw\";\n\t\t\t}\n\t\t\tif (dom_prefix == \"xray_\" && queryParam.type === \"http\") {\n\t\t\t\topt.set(dom_prefix + 'transport', \"xhttp\");\n\t\t\t} else {\n\t\t\t\topt.set(dom_prefix + 'transport', queryParam.type);\n\t\t\t}\n\t\t\tif (queryParam.type === \"raw\" || queryParam.type === \"tcp\") {\n\t\t\t\topt.set(dom_prefix + 'tcp_guise', queryParam.headerType || \"none\");\n\t\t\t\tif (queryParam.headerType && queryParam.headerType != \"none\") {\n\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_host', queryParam.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'tcp_guise_http_path', queryParam.path || \"\");\n\t\t\t\t}\n\t\t\t} else if (queryParam.type === \"ws\") {\n\t\t\t\topt.set(dom_prefix + 'ws_host', queryParam.host || \"\");\n\t\t\t\topt.set(dom_prefix + 'ws_path', queryParam.path || \"\");\n\t\t\t\tif (dom_prefix == \"singbox_\" && queryParam.path && queryParam.path.length > 1) {\n\t\t\t\t\tvar ws_path_params = {};\n\t\t\t\t\tvar ws_path_dat = queryParam.path.split('?');\n\t\t\t\t\tvar ws_path = ws_path_dat[0];\n\t\t\t\t\tvar ws_path_params = {};\n\t\t\t\t\tvar ws_path_params_array = (ws_path_dat[1] || '').split('&');\n\t\t\t\t\tfor (i = 0; i < ws_path_params_array.length; i++) {\n\t\t\t\t\t\tvar kv = ws_path_params_array[i].split('=');\n\t\t\t\t\t\tws_path_params[decodeURIComponent(kv[0]).toLowerCase()] = decodeURIComponent(kv[1] || '');\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (ws_path_params.ed) {\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_path', ws_path);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_enableEarlyData', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_maxEarlyData', ws_path_params.ed);\n\t\t\t\t\t\topt.set(dom_prefix + 'ws_earlyDataHeaderName', 'Sec-WebSocket-Protocol');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (queryParam.type === \"h2\" || queryParam.type === \"http\") {\n\t\t\t\tif (dom_prefix == \"xray_\") {\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_mode', \"stream-one\");\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_host', queryParam.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'xhttp_path', queryParam.path || \"\");\n\t\t\t\t} else {\n\t\t\t\t\topt.set(dom_prefix + 'http_host', queryParam.host || \"\");\n\t\t\t\t\topt.set(dom_prefix + 'http_path', queryParam.path || \"\");\n\t\t\t\t}\n\t\t\t} else if (queryParam.type === \"quic\") {\n\t\t\t\topt.set(dom_prefix + 'quic_guise', queryParam.headerType || \"none\");\n\t\t\t\topt.set(dom_prefix + 'quic_security', queryParam.quicSecurity);\n\t\t\t\topt.set(dom_prefix + 'quic_key', queryParam.key);\n\t\t\t} else if (queryParam.type === \"kcp\" || queryParam.type === \"mkcp\") {\n\t\t\t\topt.set(dom_prefix + 'mkcp_guise', queryParam.headerType || \"none\");\n\t\t\t\topt.set(dom_prefix + 'mkcp_seed', queryParam.seed || \"\");\n\t\t\t} else if (queryParam.type === \"grpc\") {\n\t\t\t\topt.set(dom_prefix + 'grpc_serviceName', (queryParam.serviceName || queryParam.path) || \"\");\n\t\t\t\topt.set(dom_prefix + 'grpc_mode', queryParam.mode || \"gun\");\n\t\t\t} else if (queryParam.type === \"xhttp\" || queryParam.type === \"splithttp\") {\n\t\t\t\topt.set(dom_prefix + 'xhttp_host', queryParam.host || \"\");\n\t\t\t\topt.set(dom_prefix + 'xhttp_path', queryParam.path || \"\");\n\t\t\t\topt.set(dom_prefix + 'xhttp_mode', queryParam.mode || \"auto\");\n\t\t\t\topt.set(dom_prefix + 'use_xhttp_extra', !!queryParam.extra);\n\t\t\t\topt.set(dom_prefix + 'xhttp_extra', queryParam.extra || \"\");\n\t\t\t} else if (queryParam.type === \"httpupgrade\") {\n\t\t\t\topt.set(dom_prefix + 'httpupgrade_host', queryParam.host || \"\");\n\t\t\t\topt.set(dom_prefix + 'httpupgrade_path', queryParam.path || \"\");\n\t\t\t}\n\n\t\t\topt.set(dom_prefix + 'tcp_fast_open', queryParam.tfo);\n\t\t\topt.set(dom_prefix + 'use_finalmask', !!queryParam.fm);\n\t\t\topt.set(dom_prefix + 'finalmask', queryParam.fm || \"\");\n\n\t\t\tif (m.hash) {\n\t\t\t\topt.set('remarks', decodeURIComponent(m.hash.substr(1)));\n\t\t\t}\n\t\t}\n\t\tif (ssu[0] === \"hysteria2\" || ssu[0] === \"hy2\") {\n\t\t\tvar m = parseNodeUrl(ssrurl);\n\t\t\tvar password = m.passwd;\n\t\t\tif (password === \"\") {\n\t\t\t\ts.innerHTML = \"<font color='red'><%:Invalid Share URL Format%></font>\";\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tvar queryParam = {};\n\t\t\tif (m.search.length > 1) {\n\t\t\t\tvar query = m.search.replace('/?', '?').split('?')\n\t\t\t\tvar queryParams = query[1];\n\t\t\t\tvar queryArray = queryParams.split('&');\n\t\t\t\tvar params;\n\t\t\t\tfor (i = 0; i < queryArray.length; i++) {\n\t\t\t\t\tparams = queryArray[i].split('=');\n\t\t\t\t\tqueryParam[decodeURIComponent(params[0])] = decodeURIComponent(params[1] || '');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif ((hysteria2_type == \"sing-box\" && has_singbox) || (hysteria2_type == \"xray\" && has_xray)) {\n\t\t\t\tvar is_singbox = hysteria2_type == \"sing-box\" && has_singbox;\n\t\t\t\topt.set('type', is_singbox ? \"sing-box\" : \"Xray\");\n\t\t\t\tdom_prefix = is_singbox ? \"singbox_\" : \"xray_\";\n\t\t\t\topt.set(dom_prefix + 'protocol', \"hysteria2\");\n\t\t\t\topt.set(dom_prefix + 'hysteria2_auth_password', decodeURIComponent(password));\n\t\t\t\tif (queryParam[\"obfs-password\"] || queryParam[\"obfs_password\"]) {\n\t\t\t\t\topt.set(dom_prefix + 'hysteria2_obfs_type', \"salamander\");\n\t\t\t\t\topt.set(dom_prefix + 'hysteria2_obfs_password', queryParam[\"obfs-password\"] || queryParam[\"obfs_password\"]);\n\t\t\t\t}\n\t\t\t\topt.set(dom_prefix + 'hysteria2_hop', queryParam.mport || \"\");\n\t\t\t\topt.set(dom_prefix + 'use_finalmask', !!queryParam.fm);\n\t\t\t\topt.set(dom_prefix + 'finalmask', queryParam.fm || \"\");\n\t\t\t} else if (has_hysteria2) {\n\t\t\t\topt.set('type', \"Hysteria2\");\n\t\t\t\tdom_prefix = \"hysteria2_\"\n\t\t\t\topt.set(dom_prefix + 'auth_password', decodeURIComponent(password));\n\t\t\t\tif (queryParam[\"obfs-password\"] || queryParam[\"obfs_password\"]) {\n\t\t\t\t\topt.set(dom_prefix + 'obfs', queryParam[\"obfs-password\"] || queryParam[\"obfs_password\"]);\n\t\t\t\t}\n\t\t\t\topt.set(dom_prefix + 'hop', queryParam.mport || \"\");\n\t\t\t}\n\t\t\t\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(m.hostname));\n\t\t\topt.set(dom_prefix + 'port', m.port || \"443\");\n\t\t\t\n\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || \"\");\n\t\t\topt.set(\n\t\t\t\tdom_prefix + 'tls_allowInsecure',\n\t\t\t\t!((queryParam.allowinsecure ?? '0') === '0' && (queryParam.allowInsecure ?? '0') === '0' && (queryParam.insecure ?? '0') === '0')\n\t\t\t);\n\t\t\topt.set(dom_prefix + 'tls_pinSHA256', queryParam.pcs || queryParam.pinSHA256 || '');\n\t\t\topt.set(dom_prefix + 'tls_CertByName', queryParam.vcn || '');\n\t\t\tif (m.hash) {\n\t\t\t\topt.set('remarks', decodeURIComponent(m.hash.substr(1)));\n\t\t\t}\n\t\t}\n\t\tif (ssu[0] === \"tuic\") {\n\t\t\tif (has_singbox) {\n\t\t\t\tdom_prefix = \"singbox_\"\n\t\t\t\topt.set('type', \"sing-box\");\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'protocol', \"tuic\");\n\t\t\tvar _parsedUrl = new URL(\"http://\" + ssu[1]);\n\t\t\tvar username = _parsedUrl.username;\n\t\t\tvar password = _parsedUrl.password;\n\t\t\tvar hostname = _parsedUrl.hostname;\n\t\t\tvar port = _parsedUrl.port;\n\t\t\tvar search = _parsedUrl.search;\n\t\t\tvar hash = _parsedUrl.hash;\n\t\t\tif (!username || !password) {  //Fix for some links will encode the ':' between the UUID and password.\n\t\t\t\tconst decoded = decodeURIComponent(username || password || \"\");\n\t\t\t\tconst i = decoded.indexOf(\":\");\n\t\t\t\tif (i > -1) {\n\t\t\t\t\tusername = decoded.slice(0, i);\n\t\t\t\t\tpassword = decoded.slice(i + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'uuid', decodeURIComponent(username));\n\t\t\topt.set(dom_prefix + 'password', decodeURIComponent(password));\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(hostname));\n\t\t\topt.set(dom_prefix + 'port', port || \"443\");\n\t\t\tvar queryParam = {};\n\t\t\tif (search.length > 1) {\n\t\t\t\tvar query = search.split('?')\n\t\t\t\tvar queryParams = query[1];\n\t\t\t\tvar queryArray = queryParams.split('&');\n\t\t\t\tvar params;\n\t\t\t\tfor (i = 0; i < queryArray.length; i++) {\n\t\t\t\t\tparams = queryArray[i].split('=');\n\t\t\t\t\tqueryParam[decodeURIComponent(params[0]).toLowerCase()] = decodeURIComponent(params[1] || '');\n\t\t\t\t}\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'tuic_congestion_control', queryParam.congestion_control || 'cubic');\n\t\t\topt.set(dom_prefix + 'tuic_udp_relay_mode', queryParam.udp_relay_mode || 'native');\n\t\t\topt.set(dom_prefix + 'tuic_alpn', queryParam.alpn || 'default');\n\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || '');\n\t\t\topt.set(dom_prefix + 'tls_disable_sni', queryParam.disable_sni === \"1\");\n\t\t\topt.set(\n\t\t\t\tdom_prefix + 'tls_allowInsecure',\n\t\t\t\t!((queryParam.allowinsecure ?? '0') === '0' && (queryParam.insecure ?? '0') === '0' && (queryParam.allow_insecure ?? '0') === '0')\n\t\t\t);\n\t\t\tif (hash) {\n\t\t\t\topt.set('remarks', decodeURIComponent(hash.substr(1)));\n\t\t\t}\n\t\t}\n\t\tif (ssu[0] === \"anytls\") {\n\t\t\tif (has_singbox) {\n\t\t\t\tdom_prefix = \"singbox_\"\n\t\t\t\topt.set('type', \"sing-box\");\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'protocol', \"anytls\");\n\t\t\tvar m = parseNodeUrl(ssrurl);\n\t\t\tvar password = m.passwd;\n\t\t\tif (password === \"\") {\n\t\t\t\ts.innerHTML = \"<font color='red'><%:Invalid Share URL Format%></font>\";\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'password', password);\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(m.hostname));\n\t\t\topt.set(dom_prefix + 'port', m.port || \"443\");\n\t\t\tvar queryParam = {};\n\t\t\tif (m.search.length > 1) {\n\t\t\t\tvar query = m.search.replace('/?', '?').split('?')\n\t\t\t\tvar queryParams = query[1];\n\t\t\t\tvar queryArray = queryParams.split('&');\n\t\t\t\tvar params;\n\t\t\t\tfor (i = 0; i < queryArray.length; i++) {\n\t\t\t\t\tparams = queryArray[i].split('=');\n\t\t\t\t\tqueryParam[decodeURIComponent(params[0]).toLowerCase()] = decodeURIComponent(params[1] || '');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (!queryParam.security || queryParam.security == \"\") {\n\t\t\t\tqueryParam.security = \"tls\";\n\t\t\t}\n\t\t\tif (queryParam.security) {\n\t\t\t\tif (queryParam.security == \"tls\") {\n\t\t\t\t\topt.set(dom_prefix + 'tls', true);\n\t\t\t\t\topt.set(dom_prefix + 'reality', false);\n\t\t\t\t\topt.set(dom_prefix + 'alpn', queryParam.alpn || 'default');\n\t\t\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || '');\n\t\t\t\t\topt.set(dom_prefix + 'tls_allowInsecure', !((queryParam.allowinsecure ?? '0') === '0' && (queryParam.insecure ?? '0') === '0'));\n\t\t\t\t\tif (queryParam.fp && queryParam.fp.trim() != \"\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'utls', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'fingerprint', queryParam.fp);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (queryParam.security == \"reality\") {\n\t\t\t\t\topt.set(dom_prefix + 'tls', true);\n\t\t\t\t\topt.set(dom_prefix + 'reality', true);\n\t\t\t\t\topt.set(dom_prefix + 'alpn', queryParam.alpn || 'default');\n\t\t\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || '');\n\t\t\t\t\tif (queryParam.fp && queryParam.fp.trim() != \"\") {\n\t\t\t\t\t\topt.set(dom_prefix + 'utls', true);\n\t\t\t\t\t\topt.set(dom_prefix + 'fingerprint', queryParam.fp);\n\t\t\t\t\t}\n\t\t\t\t\topt.set(dom_prefix + 'reality_publicKey', queryParam.pbk || '');\n\t\t\t\t\topt.set(dom_prefix + 'reality_shortId', queryParam.sid || '');\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (m.hash) {\n\t\t\t\topt.set('remarks', decodeURIComponent(m.hash.substr(1)));\n\t\t\t}\n\t\t}\n\t\tif (ssu[0] === \"naive+https\" || ssu[0] === \"naive+quic\") {\n\t\t\tif (has_singbox) {\n\t\t\t\tdom_prefix = \"singbox_\"\n\t\t\t\topt.set('type', \"sing-box\");\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'protocol', \"naive\");\n\t\t\tvar _parsedUrl = new URL(\"http://\" + ssu[1]);\n\t\t\tvar username = _parsedUrl.username;\n\t\t\tvar password = _parsedUrl.password;\n\t\t\tvar hostname = _parsedUrl.hostname;\n\t\t\tvar port = _parsedUrl.port;\n\t\t\tvar search = _parsedUrl.search;\n\t\t\tvar hash = _parsedUrl.hash;\n\t\t\tif (!username || !password) {  //某些链接会把username和password之间的:进行编码\n\t\t\t\tconst decoded = decodeURIComponent(username || password || \"\");\n\t\t\t\tconst i = decoded.indexOf(\":\");\n\t\t\t\tif (i > -1) {\n\t\t\t\t\tusername = decoded.slice(0, i);\n\t\t\t\t\tpassword = decoded.slice(i + 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'username', decodeURIComponent(username));\n\t\t\topt.set(dom_prefix + 'password', decodeURIComponent(password));\n\t\t\topt.set(dom_prefix + 'address', unbracketIP(hostname));\n\t\t\topt.set(dom_prefix + 'port', port || \"443\");\n\t\t\tvar queryParam = {};\n\t\t\tif (search.length > 1) {\n\t\t\t\tvar query = search.split('?')\n\t\t\t\tvar queryParams = query[1];\n\t\t\t\tvar queryArray = queryParams.split('&');\n\t\t\t\tvar params;\n\t\t\t\tfor (i = 0; i < queryArray.length; i++) {\n\t\t\t\t\tparams = queryArray[i].split('=');\n\t\t\t\t\tqueryParam[decodeURIComponent(params[0])] = decodeURIComponent(params[1] || '');\n\t\t\t\t}\n\t\t\t}\n\t\t\topt.set(dom_prefix + 'naive_insecure_concurrency', queryParam['insecure-concurrency'] || '0');\n\t\t\topt.set(dom_prefix + 'uot', (queryParam.uot ?? '0') === '1');\n\t\t\topt.set(dom_prefix + 'tls_serverName', queryParam.sni || '');\n\t\t\topt.set(dom_prefix + 'ech', !!queryParam.ech);\n\t\t\topt.set(dom_prefix + 'ech_config', queryParam.ech || '');\n\t\t\tif (ssu[0] === \"naive+quic\") {\n\t\t\t\topt.set(dom_prefix + 'naive_quic', true);\n\t\t\t\topt.set(dom_prefix + 'naive_congestion_control', queryParam.congestion_control || 'bbr');\n\t\t\t}\n\t\t\tif (hash) {\n\t\t\t\topt.set('remarks', decodeURIComponent(hash.substr(1)));\n\t\t\t}\n\t\t}\n\t\tif (dom_prefix && dom_prefix != null) {\n\t\t\tif (opt.get(dom_prefix + 'port').value) {\n\t\t\t\topt.get(dom_prefix + 'port').focus();\n\t\t\t\topt.get(dom_prefix + 'port').blur();\n\t\t\t}\n\t\t} else {\n\t\t\ts.innerHTML = \"<font color='red'><%:Invalid Share URL Format%></font>\";\n\t\t\tsessionStorage.removeItem(\"fromUrl\");\n\t\t\treturn false;\n\t\t}\n\t\ts.innerHTML = \"<font color='green'><%:Import Finished %></font>\";\n\t\tsessionStorage.removeItem(\"fromUrl\");\n\t\treturn true;\n\t}\n\t\n\tfunction exportConfigFile(btn, sid) {\n\t\twindow.open('<%=api.url(\"gen_client_config\")%>?id=' + sid, \"_blank\")\n\t}\n\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t\tsetTimeout(function () {\n\t\t\tconst fromUrlCache = JSON.parse(sessionStorage.getItem(\"fromUrl\"));\n\t\t\tif (fromUrlCache && fromUrlCache.savetime && (Date.now() - fromUrlCache.timestamp) < fromUrlCache.savetime) {\n\t\t\t\tfromUrl(null, fromUrlCache.urlname, fromUrlCache.sid, fromUrlCache)\n\t\t\t} else {\n\t\t\t\tsessionStorage.removeItem(\"fromUrl\");\n\t\t\t}\n\t\t}, 500);\n\t})\n\n//]]></script>\n<style>\n.share-toolbar {\n\tdisplay: inline-block;\n\ttext-align: center;\n\tpadding: 5px 0 5px;\n\twhite-space: nowrap;\n}\n@media screen and (max-width: 500px) {\n\t.share-toolbar {\n\t\twhite-space: normal;\n\t}\n}\n.toolbar-buttons .cbi-button {\n\tmargin-right: 2px;\n\tmargin-bottom: 2px;\n}\n.toolbar-buttons .cbi-button:last-child {\n\tmargin-right: 0;\n}\n.status-text {\n\tdisplay: none;\n}\n.status-text:not(:empty) {\n\tdisplay: inline-block;\n\tline-height: 1;\n\tpadding: 5px 0;\n}\n</style>\n<div class=\"share-toolbar\">\n\t<div class=\"toolbar-buttons\">\n\t\t<% if not current_node.protocol or not current_node.protocol:find(\"^_\") then -%>\n\t\t<input id=\"fromUrlBtn\" type=\"button\" class=\"btn cbi-button cbi-button-apply\" value='<%:From Share URL%>' onclick=\"return fromUrl(this, '<%=self.option%>', '<%=self.value%>')\" />\n\t\t<input id=\"exportUrlBtn\" type=\"button\" class=\"btn cbi-button cbi-button-apply\" value='<%:Build Share URL%>' onclick=\"return exportUrl(this, '<%=self.option%>', '<%=self.value%>')\" />\n\t\t<input id=\"genQrcodeBtn\" type=\"button\" class=\"btn cbi-button cbi-button-apply\" value='<%:Generate QRCode%>' onclick=\"return genQrcode(this, '<%=self.option%>', '<%=self.value%>')\" />\n\t\t<% end -%>\n\t\t<input id=\"exportConfigFileBtn\" type=\"button\" class=\"btn cbi-button cbi-button-apply\" value='<%:Export Config File%>' onclick=\"return exportConfigFile(this, '<%=self.value%>')\" />\n\t</div>\n\t<div id=\"qrcode_div\" style=\"padding:5px 0;display:none\">\n\t\t<div id=\"qrcode\" style=\"display:flex;justify-content:center;\"></div>\n\t</div>\n\t<div style=\"text-align:center;padding:0;min-height:0;line-height:1;\">\n\t\t<span id=\"<%=self.option%>-status\" class=\"status-text\"></span>\n\t</div>\n</div>\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/node_list/link_add_node.htm",
    "content": "<%\nlocal api = require \"luci.passwall2.api\"\n-%>\n\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tfunction ajax_add_node(link, group) {\n\t\tconst dom = document.getElementById('modal-mask');\n\t\tdom.style.display = 'block';\n\t\tdom.innerHTML = '<div style=\"position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;\"><%:Processing, please wait…%></div>';\n\t\t\n\t\tconst chunkSize = 1000;  // Fragmented sending to overcome uhttpd's limitations, with each fragment containing 1000 characters.\n\t\tconst totalChunks = Math.ceil(link.length / chunkSize);\n\t\tlet currentChunk = 0;\n\n\t\tfunction sendNextChunk() {\n\t\t\tif (currentChunk < totalChunks) {\n\t\t\t\tconst chunk = link.substring(currentChunk * chunkSize, (currentChunk + 1) * chunkSize);\n\t\t\t\tconst xhr = new XMLHttpRequest();\n\t\t\t\txhr.open('POST', '<%=api.url(\"link_add_node\")%>', true);\n\t\t\t\txhr.onload = function () {\n\t\t\t\t\tif (xhr.status === 200) {\n\t\t\t\t\t\tcurrentChunk++;\n\t\t\t\t\t\tsendNextChunk();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdom.innerHTML = '';\n\t\t\t\t\t\tdom.style.display = 'none';\n\t\t\t\t\t\talert(\"<%:Error%>\");\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t};\n\t\t\t\txhr.onerror = function () {\n\t\t\t\t\tdom.innerHTML = '';\n\t\t\t\t\tdom.style.display = 'none';\n\t\t\t\t\talert(\"<%:Network Error%>\");\n\t\t\t\t\treturn;\n\t\t\t\t};\n\t\t\t\tconst formData = new FormData();\n\t\t\t\tformData.append(\"chunk\", chunk);\n\t\t\t\tformData.append(\"chunk_index\", currentChunk);\n\t\t\t\tformData.append(\"total_chunks\", totalChunks);\n\t\t\t\tformData.append(\"group\", group);\n\t\t\t\txhr.send(formData);\n\t\t\t} else {\n\t\t\t\twindow.location.href = '<%=api.url(\"node_list\")%>';\n\t\t\t}\n\t\t}\n\t\tsendNextChunk();\n\t}\n\n\tfunction decodeIfBase64(str) {\n\t\ttry {\n\t\t\tlet s = str.replace(/-/g, '+').replace(/_/g, '/');\n\t\t\twhile (s.length % 4) s += '=';\n\t\t\tconst decoded = decodeURIComponent(\n\t\t\t\tatob(s).split('').map(c =>\n\t\t\t\t\t'%' + c.charCodeAt(0).toString(16).padStart(2, '0')\n\t\t\t\t).join('')\n\t\t\t);\n\t\t\tif (btoa(unescape(encodeURIComponent(decoded))).replace(/=+$/, '') === s.replace(/=+$/, '')) {\n\t\t\t\treturn decoded;\n\t\t\t}\n\t\t} catch (e) {}\n\t\treturn str;\n\t}\n\n\tfunction getBg(el) {\n\t\tif (!el) return null;\n\t\tconst style = getComputedStyle(el);\n\t\tconst bgImage = style.backgroundImage;\n\t\tconst bgColor = style.backgroundColor;\n\t\treturn (bgImage !== 'none' || !/rgba\\([^,]+,[^,]+,[^,]+,\\s*0\\)/.test(bgColor) && bgColor !== 'transparent')\n\t\t\t? style.background\n\t\t\t: null;\n\t};\n\n\tfunction open_add_link_div() {\n\t\tdocument.body.classList.add('modal-open');\n\t\tdocument.getElementById('modal-mask').style.display = 'block';\n\t\tconst addLinkDiv = document.getElementById(\"add_link_div\");\n\t\taddLinkDiv.style.background = getBg(document.querySelector('.cbi-section')) || getBg(document.body) || '';\n\t\taddLinkDiv.style.display = \"block\";\n\t\tif (!addLinkDiv._dropdown_inited) {\n\t\t\taddLinkDiv._dropdown_inited = true;\n\t\t\tdropdown_list_fun(\"addlink_group_custom\");\n\t\t}\n\t\tdocument.getElementById(\"nodes_link\").focus();\n\t}\n\t\n\tfunction close_add_link_div() {\n\t\tdocument.getElementById('modal-mask').style.display = 'none';\n\t\tdocument.getElementById(\"add_link_div\").style.display = \"none\";\n\t\tdocument.body.classList.remove('modal-open');\n\t}\n\t\n\tfunction add_node() {\n\t\tlet nodes_link = document.getElementById(\"nodes_link\").value;\n\t\tconst group = (document.querySelector('#addlink_group_custom input[type=\"hidden\"]')?.value || \"default\");\n\t\tnodes_link = nodes_link.replace(/\\t/g, \"\").replace(/\\r\\n|\\r/g, \"\\n\").replace(/<[^>]*>/g, '').trim();\n\t\tif (nodes_link != \"\") {\n\t\t\tnodes_link = decodeIfBase64(nodes_link);\n\t\t\tlet s = nodes_link.split('://');\n\t\t\tif (s.length > 1) {\n\t\t\t\tclose_add_link_div();\n\t\t\t\tajax_add_node(nodes_link, group);\n\t\t\t} else {\n\t\t\t\talert(\"<%:Please enter the correct link.%>\");\n\t\t\t}\n\t\t} else {\n\t\t\tdocument.getElementById(\"nodes_link\").focus();\n\t\t}\n\t}\n\t\n\tfunction clear_all_nodes() {\n\t\tif (confirm('<%:Are you sure to clear all nodes?%>') == true){\n\t\t\tXHR.get('<%=api.url(\"clear_all_nodes\")%>', null,\n\t\t\tfunction(x, data) {\n\t\t\t\tif(x && x.status == 200) {\n\t\t\t\t\twindow.location.href = '<%=api.url(\"node_list\")%>';\n\t\t\t\t} else {\n\t\t\t\t\talert(\"<%:Error%>\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t}\n\n\tfunction open_reassign_group_div() {\n\t\tconst ids = [];\n\t\tconst visibleContainer = document.querySelector('#cbi-passwall2-nodes > .cbi-tabcontainer[style*=\"display:block\"], #cbi-passwall2-nodes > .cbi-tabcontainer[style*=\"display: block\"]');\n\t\tif (!visibleContainer) return;\n\t\tconst doms = visibleContainer.getElementsByClassName(\"nodes_select\");\n\t\tif (doms && doms.length > 0) {\n\t\t\tfor (let i = 0 ; i < doms.length; i++) {\n\t\t\t\tif (doms[i].checked) {\n\t\t\t\t\tids.push(doms[i].getAttribute(\"cbid\"))\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ids.length > 0) {\n\t\t\t\tdocument.body.classList.add('modal-open');\n\t\t\t\tdocument.getElementById('modal-mask').style.display = 'block';\n\t\t\t\tconst reassignGroupDiv = document.getElementById(\"reassign_group_div\");\n\t\t\t\treassignGroupDiv.style.background = getBg(document.querySelector('.cbi-section')) || getBg(document.body) || '';\n\t\t\t\treassignGroupDiv.style.display = \"block\";\n\t\t\t\tif (!reassignGroupDiv._dropdown_inited) {\n\t\t\t\t\treassignGroupDiv._dropdown_inited = true;\n\t\t\t\t\tdropdown_list_fun(\"reassign_group_custom\");\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\talert(\"<%:You no select nodes !%>\");\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction close_reassign_group_div() {\n\t\tdocument.getElementById('modal-mask').style.display = 'none';\n\t\tdocument.getElementById(\"reassign_group_div\").style.display = \"none\";\n\t\tdocument.body.classList.remove('modal-open');\n\t}\n\n\tfunction reassign_group() {\n\t\tconst ids = [];\n\t\tconst group = (document.querySelector('#reassign_group_custom input[type=\"hidden\"]')?.value || \"default\");\n\t\tconst visibleContainer = document.querySelector('#cbi-passwall2-nodes > .cbi-tabcontainer[style*=\"display:block\"], #cbi-passwall2-nodes > .cbi-tabcontainer[style*=\"display: block\"]');\n\t\tif (!visibleContainer) return;\n\t\tconst doms = visibleContainer.getElementsByClassName(\"nodes_select\");\n\t\tif (doms && doms.length > 0) {\n\t\t\tfor (let i = 0 ; i < doms.length; i++) {\n\t\t\t\tif (doms[i].checked) {\n\t\t\t\t\tids.push(doms[i].getAttribute(\"cbid\"))\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ids.length > 0) {\n\t\t\t\tXHR.get('<%=api.url(\"reassign_group\")%>', {\n\t\t\t\t\tgroup: group,\n\t\t\t\t\tids: ids.join(\",\")\n\t\t\t\t},\n\t\t\t\tfunction(x, data) {\n\t\t\t\t\tif (x && x.status == 200) {\n\t\t\t\t\t\twindow.location.href = '<%=api.url(\"node_list\")%>';\n\t\t\t\t\t} else {\n\t\t\t\t\t\talert(\"<%:Error%>\");\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t}\n\n\t// Custom group dropdown list events\n\tfunction dropdown_list_fun(div_id) {\n\t\tconst dropdown = document.getElementById(div_id);\n\t\tif (!dropdown) return;\n\n\t\tconst display = dropdown.querySelector(\".selected-display\");\n\t\tconst displayText = display.querySelector(\".text\");\n\t\tconst list = dropdown.querySelector(\".dropdown-list\");\n\t\tconst hidden = dropdown.querySelector('input[type=\"hidden\"]');\n\t\tconst input = dropdown.querySelector(\".create-item-input\");\n\n\t\tdisplay.addEventListener(\"click\", function() {\n\t\t\tlist.style.display = list.style.display === \"none\" ? \"block\" : \"none\";\n\t\t\tinput.value = \"\";\n\t\t\t//input.focus();\n\t\t});\n\n\t\tfunction selectItem(li) {\n\t\t\tlist.querySelectorAll(\".dropdown-item\").forEach(function(el){\n\t\t\t\tel.classList.remove(\"selected\");\n\t\t\t});\n\t\t\tli.classList.add(\"selected\");\n\t\t\thidden.value = li.dataset.value;\n\t\t\tdisplayText.textContent = li.dataset.value || \"<%:default%>\";\n\t\t\tlist.style.display = \"none\";\n\t\t}\n\n\t\tlist.addEventListener(\"click\", function(e){\n\t\t\tconst li = e.target.closest(\".dropdown-item\");\n\t\t\tif (!li || li.classList.contains(\"custom-input\")) return;\n\t\t\tselectItem(li);\n\t\t});\n\n\t\tinput.addEventListener(\"keydown\", function(e){\n\t\t\tconst isEnter = e.key === \"Enter\" || e.keyCode === 13;\n\t\t\tif (!isEnter) return;\n\t\t\te.stopPropagation();\n\t\t\te.preventDefault();\n\n\t\t\tconst val = input.value.trim();\n\t\t\tif (!val) return;\n\n\t\t\tif (val.toLowerCase() === \"default\") {\n\t\t\t\tconst emptyLi = Array.from(list.querySelectorAll(\".dropdown-item\"))\n\t\t\t\t\t.find(function(el){ return !el.dataset.value; });\n\t\t\t\tif (emptyLi) selectItem(emptyLi);\n\t\t\t\tinput.value = \"\";\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tlet li = Array.from(list.querySelectorAll(\".dropdown-item\")).find(function(el){\n\t\t\t\treturn el.dataset.value && el.dataset.value.toLowerCase() === val.toLowerCase();\n\t\t\t});\n\t\t\tif (!li) {\n\t\t\t\tli = document.createElement(\"li\");\n\t\t\t\tli.className = \"dropdown-item\";\n\t\t\t\tli.dataset.value = val;\n\t\t\t\tli.textContent = val;\n\t\t\t\tlist.insertBefore(li, input.parentNode); \n\t\t\t}\n\n\t\t\tinput.value = \"\";\n\t\t\tselectItem(li);\n\t\t});\n\t\t// Read group names from tab\n\t\tfunction InsertGroup(list, input) {\n\t\t\tconst tabs = document.querySelectorAll(\".cbi-tabmenu li\");\n\t\t\tif (!tabs.length) {\n\t\t\t\tsetTimeout(() => InsertGroup(list, input), 50);\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\ttabs.forEach(function(li){\n\t\t\t\tconst group = li.id.split('.').pop();\n\t\t\t\tif(group === \"default\") return;\n\t\t\t\tif(Array.from(list.querySelectorAll(\".dropdown-item\")).some(el => el.dataset.value === group)) return;\n\t\t\t\tconst newLi = document.createElement(\"li\");\n\t\t\t\tnewLi.className = \"dropdown-item\";\n\t\t\t\tnewLi.dataset.value = group;\n\t\t\t\tnewLi.textContent = group;\n\t\t\t\tlist.insertBefore(newLi, input.parentNode);\n\t\t\t});\n\t\t}\n\t\tInsertGroup(list, input);\n\n\t\t// Automatically collapses when clicking on the outside.\n\t\tdocument.addEventListener(\"click\", function(e) {\n\t\t\tif (!dropdown.contains(e.target)) {\n\t\t\t\tlist.style.display = \"none\";\n\t\t\t}\n\t\t});\n\t}\n\t//]]>\n</script>\n\n<div id=\"modal-mask\"></div>\n\n<div id=\"add_link_div\">\n\t<div id=\"add_link_modal_container\">\n\t\t<h3><%:Add the node via the link%></h3>\n\t\t<div class=\"value-custom\">\n\t\t\t<textarea id=\"nodes_link\" rows=\"10\"></textarea>\n\t\t\t<p id=\"nodes_link_text\"><%:Enter share links, one per line. Subscription links are not supported!%></p>\n\t\t</div>\n\t\t<div class=\"value-custom\">\n\t\t\t<div class=\"value-field-custom\">\n\t\t\t\t<label class=\"value-title-custom\" for=\"addlink_group_custom\"><%:Group Name%></label>\n\t\t\t\t<div id=\"addlink_group_custom\" class=\"custom-dropdown\">\n\t\t\t\t\t<div class=\"selected-display\">\n\t\t\t\t\t\t<span class=\"text\"><%:default%></span>\n\t\t\t\t\t\t<span class=\"arrow-down-small\"></span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<ul class=\"dropdown-list\" style=\"display:none;\">\n\t\t\t\t\t\t<li class=\"dropdown-item selected\" data-value=\"\"><%:default%></li>\n\t\t\t\t\t\t<li class=\"dropdown-item custom-input\">\n\t\t\t\t\t\t\t<input type=\"text\" placeholder=\"-- <%:custom%> --\" class=\"create-item-input\" inputmode=\"text\" enterkeyhint=\"done\">\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t\t<input type=\"hidden\" name=\"addlink_group\" value=\"\">\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div id=\"add_link_button_container\">\n\t\t\t<input class=\"btn cbi-button cbi-button-add\" type=\"button\" onclick=\"add_node()\" value=\"<%:Add%>\" />\n\t\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"close_add_link_div()\" value=\"<%:Close%>\" />\n\t\t</div>\n\t</div>\n</div>\n\n<div id=\"reassign_group_div\">\n\t<div id=\"reassign_group_modal_container\">\n\t\t<h3><%:Reassign Node Group%></h3>\n\t\t<div class=\"value-custom\">\n\t\t\t<div class=\"value-field-custom\">\n\t\t\t\t<label class=\"value-title-custom\" for=\"reassign_group_custom\"><%:Group Name%></label>\n\t\t\t\t<div id=\"reassign_group_custom\" class=\"custom-dropdown\">\n\t\t\t\t\t<div class=\"selected-display\">\n\t\t\t\t\t\t<span class=\"text\"><%:default%></span>\n\t\t\t\t\t\t<span class=\"arrow-down-small\"></span>\n\t\t\t\t\t</div>\n\t\t\t\t\t<ul class=\"dropdown-list\" style=\"display:none;\">\n\t\t\t\t\t\t<li class=\"dropdown-item selected\" data-value=\"\"><%:default%></li>\n\t\t\t\t\t\t<li class=\"dropdown-item custom-input\">\n\t\t\t\t\t\t\t<input type=\"text\" placeholder=\"-- <%:custom%> --\" class=\"create-item-input\" inputmode=\"text\" enterkeyhint=\"done\">\n\t\t\t\t\t\t</li>\n\t\t\t\t\t</ul>\n\t\t\t\t\t<input type=\"hidden\" name=\"to_group\" value=\"\">\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t\t<div id=\"reassign_group_button_container\">\n\t\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" onclick=\"reassign_group()\" value=\"<%:Save%>\" />\n\t\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"close_reassign_group_div()\" value=\"<%:Close%>\" />\n\t\t</div>\n\t</div>\n</div>\n\n\n\n<div class=\"pw-toolbar\">\n\t<div class=\"pw-toolbar-field\">\n\t\t<input class=\"btn cbi-button cbi-button-add\" type=\"button\" onclick=\"to_add_node()\" value=\"<%:Add%>\" />\n\t\t<input class=\"btn cbi-button cbi-button-add\" type=\"button\" onclick=\"open_add_link_div()\" value=\"<%:Add the node via the link%>\" />\n\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"clear_all_nodes()\" value=\"<%:Clear all nodes%>\" />\n\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"delete_select_nodes()\" value=\"<%:Delete select nodes%>\" />\n\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" id=\"select_all_btn\" onclick=\"checked_all_node(this)\" value=\"<%:Select all%>\" />\n\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" onclick=\"open_reassign_group_div()\" value=\"<%:Reassign Group%>\" />\n\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"submit\" name=\"cbi.apply\" value=\"<%:Save & Apply%>\" />\n\t\t<!--<input class=\"btn cbi-button cbi-button-save\" type=\"submit\" name=\"cbi.save\" value=\"<%:Save%>\" />-->\n\t\t<!--<input class=\"btn cbi-button cbi-button-reset\" type=\"button\" value=\"<%:Reset%>\" onclick=\"location.href='<%=REQUEST_URI%>'\" />-->\n\t</div>\n</div>\n\n<style>\n\t.pw-toolbar {\n\t\twidth: 100%;\n\t\ttext-align: center;\n\t}\n\n\t.pw-toolbar-field {\n\t\twidth: 100%;\n\t\ttext-align: center;\n\t\tdisplay: inline-block;\n\t\tpadding: 5px 0 5px;\n\t}\n\n\t#modal-mask {\n\t\tdisplay: none;\n\t\tposition: fixed;\n\t\tleft: 0;\n\t\ttop: 0;\n\t\twidth: 100vw;\n\t\theight: 100vh;\n\t\tbackground: rgba(0,0,0,0.4);\n\t\tz-index: 999;\n\t}\n\n\tbody.modal-open {\n\t\toverflow: hidden;\n\t\tpointer-events: none;\n\t}\n\n\tbody.modal-open #add_link_div,\n\tbody.modal-open #reassign_group_div {\n\t\tpointer-events: auto;\n\t}\n\n\t#add_link_div, #reassign_group_div {\n\t\tdisplay: none;\n\t\tposition: fixed;\n\t\tleft: 50%;\n\t\ttop: 50%;\n\t\ttransform: translate(-50%, -50%);\n\t\tbackground: white;\n\t\tpadding: 20px;\n\t\tborder: 2px solid #ccc;\n\t\tbox-shadow: 0 0 10px rgba(0,0,0,0.5);\n\t\tz-index: 1000;\n\t\twidth: 90%;\n\t\tmax-width: 500px;\n\t}\n\n\t#add_link_modal_container, #reassign_group_modal_container {\n\t\twidth: 100%;\n\t\ttext-align: center;\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\tpadding-bottom: 20px;\n\t}\n\n\t#nodes_link {\n\t\twidth: 100%;\n\t\theight: 180px;\n\t\tresize: vertical;\n\t\tfont-family: monospace;\n\t\tpadding: 5px;\n\t\tborder: 1px solid #ccc;\n\t\tborder-radius: 5px;\n\t}\n\n\t#add_link_div h3,\n\t#reassign_group_div h3 {\n\t\tbackground: inherit;\n\t}\n\n\t#nodes_link_text {\n\t\tcolor: red;\n\t\tfont-size: 14px;\n\t\tmargin-top: 5px;\n\t\ttext-align: center;\n\t\twidth: 100%;\n\t}\n\n\t#add_link_button_container, #reassign_group_button_container {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\twidth: 100%;\n\t\tmax-width: 300px;\n\t\tmargin-top: 10px;\n\t}\n\n\t.value-custom {\n\t\tdisplay: flex;\n\t\tflex-direction: column;\n\t\talign-items: center;\n\t\twidth: 100%;\n\t\tmargin: 10px 0;\n\t\tpadding: 0px 5px 0px 5px;\n\t}\n\n\t.value-field-custom {\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tgap: 10px;\n\t}\n\n\t.value-title-custom {\n\t\tfont-size: 13px;\n\t\tline-height: 28px;\n\t\twhite-space: nowrap;\n\t\ttext-align: right;\n\t}\n\n\t.custom-dropdown {\n\t\tposition: relative;\n\t\tborder: 1px solid #d9d9d9;\n\t\tborder-radius: 2px;\n\t\twidth: 180px;\n\t\theight: 28px;\n\t\tfont-size: 13px;\n\t\tbackground: #fff;\n\t\tcursor: pointer;\n\t\tbox-sizing: border-box;\n\t\tdisplay: block;\n\t}\n\n\t.selected-display {\n\t\tdisplay: flex;\n\t\tjustify-content: space-between;\n\t\talign-items: center;\n\t\tpadding: 0 8px;\n\t\twidth: 100%;\n\t\theight: 100%;\n\t\tbox-sizing: border-box;\n\t\tfont-size: 12px;\n\t\tcolor: #666;\n\t}\n\n\t.selected-display:hover {\n\t\tbackground-color: #f7f7f7;\n\t}\n\n\t.dropdown-list {\n\t\tposition: absolute;\n\t\ttop: calc(100% + 2px);\n\t\tleft: -1px;\n\t\twidth: calc(100% + 2px);\n\t\tborder: 1px solid #d9d9d9;\n\t\tborder-radius: 2px;\n\t\tborder-top: none;\n\t\tbox-shadow: 0 1px 3px rgba(0,0,0,0.15);\n\t\tbackground: #fff;\n\t\tlist-style: none;\n\t\tmargin: 0;\n\t\tpadding: 0;\n\t\tmax-height: 200px;\n\t\toverflow-y: auto;\n\t\toverflow-x: hidden;\n\t\tz-index: 100;\n\t\tbox-sizing: border-box;\n\t\tcolor: #666;\n\t}\n\n\t.dropdown-item {\n\t\tpadding: 4px 8px;\n\t\tline-height: 20px;\n\t\tcursor: pointer;\n\t}\n\n\t.dropdown-item.selected {\n\t\tbackground-color: #1e90ff;\n\t\tcolor: #fff;\n\t}\n\n\t.create-item-input::placeholder {\n\t\ttext-align: center;\n\t}\n\n\t.dropdown-item.custom-input input {\n\t\twidth: 100%;\n\t\tbox-sizing: border-box;\n\t\tpadding: 3px;\n\t\tfont-size: 13px;\n\t\tline-height: 20px;\n\t\tborder: 1px solid #ccc;\n\t\ttext-align: left;\n\t}\n\n\t.arrow-down-small {\n\t\twidth: 0;\n\t\theight: 0;\n\t\tborder-left: 4px solid transparent;\n\t\tborder-right: 4px solid transparent;\n\t\tborder-top: 5px solid #555;\n\t\tdisplay: inline-block;\n\t\tvertical-align: middle;\n\t}\n</style>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/node_list/node_list.htm",
    "content": "<%\nlocal api = require \"luci.passwall2.api\"\nlocal appname = api.appname\nlocal uci = api.uci\n\nlocal default_node_type = \"\"\nlocal shunt_rule_list = {}\nlocal node = api.uci_get_type(\"global\", \"node\")\nif node then\n\tlocal node_type = api.uci_get_type_id(node, \"type\")\n\tlocal node_protocol = api.uci_get_type_id(node, \"protocol\")\n\tif node_type == \"Xray\" and node_protocol == \"_shunt\" then\n\t\tdefault_node_type = node_protocol\n\t\tuci:foreach(appname, \"shunt_rules\", function(e)\n\t\t\tif e[\".name\"] and e.remarks then\n\t\t\t\tshunt_rule_list[#shunt_rule_list + 1] = e\n\t\t\tend\n\t\tend)\n\tend\nend\n-%>\n<script src=\"<%=resource%>/view/<%=appname%>/Sortable.min.js\"></script>\n\n<style>\ntable th, .table .th {\n\ttext-align: center;\n}\n\ntable td, .table .td {\n\ttext-align: center;\n    /* white-space: nowrap; */\n    word-break: keep-all;\n}\n\n#set_node_div {\n\tdisplay: none;\n\twidth: 30rem;\n\tposition: fixed;\n\ttop:50%;\n\tpadding-top: 30px;\n\tz-index: 99;\n\ttext-align: center;\n\tbackground: white;\n    box-shadow: darkgrey 10px 10px 30px 5px;\n}\n\n._now_use_bg {\n\tbackground: #5e72e445 !important;\n}\n\n.ping a,\n.ping_value a,\n.tcping_value a {\n    text-decoration: none;\n    cursor: pointer;\n}\n\n@media (prefers-color-scheme: dark) {\n\t._now_use_bg {\n\t\tbackground: #4a90e2 !important;\n\t}\n}\n\n.td.cbi-section-actions {\n\ttext-align: right !important;\n}\n\n.node-wrapper {\n\talign-items: center;\n\tdisplay: inline-flex !important;\n\tgap: 4px;\n}\n\n.cbi-tabmenu > li {\n\tmargin-right: 2px !important;\n}\n\n.cbi-tabmenu > li:last-child {\n\tmargin-right: 0 !important;\n}\n\n.node-wrapper .drag-handle {\n\tcursor: grab !important;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tfont-size: 20px;\n\tfont-weight: 100;\n\tpadding: 0 !important;\n\tline-height: inherit;\n\tuser-select: none;\n\talign-self: stretch;\n\tbackground-color: transparent;\n}\n\n.node-wrapper .drag-handle:hover {\n\tbackground: transparent;\n}\n\n#cbi-<%=appname%>-nodes .pw-checkbox, #cbi-<%=appname%>-nodes th:nth-child(1) {\n\tpadding-right: 0px;\n}\n\n#select_all_btn {\n\tdisplay: none;\n}\n\n/* enable flex for small screens*/\n@media screen and (max-width: 1152px) {\n\t.cbi-section-table-row {\n\t\tdisplay: flex;\n\t\tflex-direction: row;\n\t\tflex-wrap: wrap;\n\t\tjustify-content: space-between;\n\t}\n\n\t#cbi-<%=appname%>-nodes-default-fieldset {\n\t\tmargin: 0;\n\t}\n\n\t.cbi-section-table-titles {\n\t\tdisplay: none !important;\n\t}\n\n\t/* meticulously control how each component occupies the limited space we have */\n\t#cbi-<%=appname%>-nodes .pw-checkbox, #cbi-<%=appname%>-nodes th:nth-child(1) {\n\t\tflex: 0 0 40px;\n\t\tmin-width: 0;\n\t}\n\n\t#cbi-<%=appname%>-nodes .pw-remark {\n\t\tflex: 1 1 30%;\n\t\tmin-width: 0;\n\t}\n\n\t#cbi-<%=appname%>-nodes .pw-ping, #cbi-<%=appname%>-nodes .pw-tcping, #cbi-<%=appname%>-nodes .pw-urltest {\n\t\tflex: 0 0 50px;\n\t\twhite-space: nowrap;\n\t\tmin-width: 0;\n\t}\n\n\t.pw-actions {\n\t\tpadding-top: 0 !important;\n\t\tborder-top-width: 0 !important;\n\t\tflex: 1 1 350px;\n\t}\n\n\t#select_all_btn {\n\t\tdisplay: inline-block !important;\n\t}\n}\n\n/* shrink actionbar even further for mobile devices */\n@media screen and (max-width: 500px) {\n\t.node-wrapper {\n\t\tgap: 0;\n\t}\n\n\t.cbi-button {\n\t\tmargin-left: 0 !important;\n\t\tmargin-right: 1px !important;\n\t}\n\n\t.pw-actions {\n\t\tpadding-left: 5px!important;\n\t\tpadding-right: 5px !important;\n\t}\n}\n\n.sortable-chosen {\n\tbackground-color: rgba(220, 235, 245, 0.4) !important;\n\topacity: 0.7;\n}\n\n.sortable-ghost {\n\tbackground: #cce5ff !important;\n\theight: 3px !important;\n}\n\n.dragging-row {\n\tbackground-color: rgba(131, 191, 255, 0.7) !important;\n\tbox-shadow: 0 4px 6px rgba(0,0,0,0.1);\n}\n</style>\n\n<% if api.is_js_luci() then -%>\n<script type=\"text/javascript\">\n\tvar cbi_t = [];\n\tfunction cbi_t_add(section, tab) {\n\t\tvar t = document.getElementById('tab.' + section + '.' + tab);\n\t\tvar c = document.getElementById('container.' + section + '.' + tab);\n\n\t\tif( t && c ) {\n\t\t\tcbi_t[section] = (cbi_t[section] || [ ]);\n\t\t\tcbi_t[section][tab] = { 'tab': t, 'container': c, 'cid': c.id };\n\t\t}\n\t}\n\n\tfunction cbi_t_switch(section, tab) {\n\t\tif( cbi_t[section] && cbi_t[section][tab] ) {\n\t\t\t// Before switching tabs, first deselect all currently active tabs.\n\t\t\tdechecked_all_node();\n\t\t\tvar o = cbi_t[section][tab];\n\t\t\tvar h = document.getElementById('tab.' + section);\n\t\t\tfor( var tid in cbi_t[section] ) {\n\t\t\t\tvar o2 = cbi_t[section][tid];\n\t\t\t\tif( o.tab.id != o2.tab.id ) {\n\t\t\t\t\to2.tab.className = o2.tab.className.replace(/(^| )cbi-tab( |$)/, \" cbi-tab-disabled \");\n\t\t\t\t\to2.container.style.display = 'none';\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif(h) h.value = tab;\n\t\t\t\t\to2.tab.className = o2.tab.className.replace(/(^| )cbi-tab-disabled( |$)/, \" cbi-tab \");\n\t\t\t\t\to2.container.style.display = 'block';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false\n\t}\n</script>\n<%- else %>\n<script type=\"text/javascript\">\n\t(function() {\n\t\tif (typeof(cbi_t_switch) === \"function\") {\n\t\t\tvar old_switch = cbi_t_switch;\n\t\t\tcbi_t_switch = function(section, tab) {\n\t\t\t\tdechecked_all_node();\n\t\t\t\treturn old_switch(section, tab);\n\t\t\t};\n\t\t}\n\t})();\n</script>\n<%- end %>\n\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tlet auto_detection_time = \"<%=api.uci_get_type(\"global_other\", \"auto_detection_time\", \"0\")%>\"\n\tlet show_node_info = \"<%=api.uci_get_type(\"global_other\", \"show_node_info\", \"0\")%>\"\n\tvar ajaxList = [];\n\n\tvar ajax = {\n\t\tpost: function(url, data, fn_success, timeout, fn_timeout) {\n\t\t\tvar xhr = new XMLHttpRequest();\n\t\t\tvar code = ajax.encode(data);\n\t\t\txhr.open(\"POST\", url, true);\n\t\t\txhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n\t\t\t\n\t\t\tif (timeout && timeout > 1000) {\n\t\t\t\txhr.timeout = timeout;\n\t\t\t}\n\t\t\tif (fn_timeout) {\n\t\t\t\txhr.ontimeout = function() {\n\t\t\t\t\tfn_timeout(xhr);\n\t\t\t\t}\n\t\t\t}\n\t\t\txhr.onreadystatechange = function() {\n\t\t\t\tif(xhr.readyState == 4 && (xhr.status == 200 || xhr.status == 304)) {\n\t\t\t\t\tvar json = null;\n\t\t\t\t\tif (xhr.getResponseHeader(\"Content-Type\") == \"application/json\") {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tjson = eval('(' + xhr.responseText + ')');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tcatch(e) {\n\t\t\t\t\t\t\tjson = null;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfn_success(xhr, json);\n\t\t\t\t}\n\t\t\t};\n\t\t\tajaxList.push(xhr);\n\t\t\txhr.send(code);\n\t\t},\n\t\tencode: function(obj) {\n\t\t\tobj = obj ? obj : { };\n\t\t\tobj['_'] = Math.random();\n\n\t\t\tif (typeof obj == 'object')\n\t\t\t{\n\t\t\t\tvar code = '';\n\t\t\t\tvar self = this;\n\n\t\t\t\tfor (var k in obj)\n\t\t\t\t\tcode += (code ? '&' : '') +\n\t\t\t\t\t\tk + '=' + encodeURIComponent(obj[k]);\n\n\t\t\t\treturn code;\n\t\t\t}\n\n\t\t\treturn obj;\n\t\t}\n\t}\n\t\n\tfunction ajaxAbortAll() {\n\t\tajaxList.forEach(xhr => xhr.abort());\n\t\tajaxList = [];\n\t}\n\n\tfunction to_add_node() {\n\t\tajaxAbortAll();\n\t\tconst dom = document.getElementsByClassName(\"cbi-tab\")[0];\n\t\tconst current_group = dom ? (dom.getAttribute(\"group_name\") || \"default\") : \"default\";\n\t\twindow.location.href='<%=api.url(\"add_node\")%>?redirect=1&group=' + current_group;\n\t}\n\t\n\tfunction to_edit_node(cbi_id) {\n\t\tajaxAbortAll();\n\t\tlocation.href='<%=api.url(\"node_config\")%>/' + cbi_id;\n\t}\n\n\tfunction copy_node(cbi_id) {\n\t\tajaxAbortAll();\n\t\twindow.location.href = '<%=api.url(\"copy_node\")%>' + \"?section=\" + cbi_id;\n\t}\n\t\n\tfunction del_node(cbi_id) {\n\t\tajaxAbortAll();\n\t\twindow.location.href = '<%=api.url(\"delete_select_nodes\")%>' + \"?redirect=1&ids=\" + cbi_id;\n\t}\n\t\n\tvar section = \"\";\n\tfunction open_set_node_div(cbi_id) {\n\t\tsection = cbi_id;\n\t\tdocument.getElementById(\"set_node_div\").style.display=\"block\";\n\t\tvar node_name = document.getElementById(\"cbid.<%=appname%>.\" + cbi_id + \".remarks\").value;\n\t\tdocument.getElementById(\"set_node_name\").innerHTML = node_name;\n\t}\n\t\n\tfunction close_set_node_div() {\n\t\tdocument.getElementById(\"set_node_div\").style.display=\"none\";\n\t\tdocument.getElementById(\"set_node_name\").innerHTML = \"\";\n\t}\n\n\tfunction row_top(btn, group) {\n\t\tconst row = btn.closest(\"tr\");\n\t\tif (!row) return;\n\t\tconst parent = row.parentNode;\n\t\tlet firstDataRow = parent.querySelector(\"tr:not(.cbi-section-table-titles)\");\n\t\tif (firstDataRow && firstDataRow !== row) {\n\t\t\tparent.insertBefore(row, firstDataRow);\n\t\t\tlet save_order_btn = document.getElementById(\"save_order_btn_\" + group);\n\t\t\tif (save_order_btn) {\n\t\t\t\tconst new_order = get_node_order(group);\n\t\t\t\tif (!arraysEqual(new_order, origin_group_node_order[group])) {\n\t\t\t\t\tsave_order_btn.style.display = null;\n\t\t\t\t} else {\n\t\t\t\t\tsave_order_btn.style.display = \"none\";\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction set_select_all_state(sectionChecked) {\n\t\tvar visibleContainer = document.querySelector('#cbi-<%=appname%>-nodes > .cbi-tabcontainer[style*=\"display:block\"], #cbi-<%=appname%>-nodes > .cbi-tabcontainer[style*=\"display: block\"]');\n\t\tif (!visibleContainer) return;\n\t\tvar nodes = visibleContainer.getElementsByClassName(\"nodes_select\");\n\t\tvar selectAllChk = visibleContainer.querySelector(\".nodes_select_all\");\n\t\tvar selectAllBtn = document.getElementById(\"select_all_btn\");\n\t\tfor (var i = 0; i < nodes.length; i++) {\n\t\t\tnodes[i].checked = sectionChecked;\n\t\t}\n\t\tif (selectAllChk) {\n\t\t\tselectAllChk.checked = sectionChecked;\n\t\t\tselectAllChk.title = sectionChecked ? \"<%:DeSelect all%>\" : \"<%:Select all%>\";\n\t\t\tselectAllChk.setAttribute(\"onclick\", sectionChecked ? \"dechecked_all_node(this)\" : \"checked_all_node(this)\");\n\t\t}\n\t\tif (selectAllBtn) {\n\t\t\tselectAllBtn.value = sectionChecked ? \"<%:DeSelect all%>\" : \"<%:Select all%>\";\n\t\t\tselectAllBtn.setAttribute(\"onclick\", sectionChecked ? \"dechecked_all_node(this)\" : \"checked_all_node(this)\");\n\t\t}\n\t}\n\n\tfunction checked_all_node(btn) {\n\t\tset_select_all_state(true);\n\t}\n\n\tfunction dechecked_all_node(btn) {\n\t\tset_select_all_state(false);\n\t}\n\n\tfunction update_select_state() {\n\t\tvar visibleContainer = document.querySelector('#cbi-<%=appname%>-nodes > .cbi-tabcontainer[style*=\"display:block\"], #cbi-<%=appname%>-nodes > .cbi-tabcontainer[style*=\"display: block\"]');\n\t\tif (!visibleContainer) return;\n\t\tvar nodes = visibleContainer.getElementsByClassName(\"nodes_select\");\n\t\tif (!nodes.length) return;\n\t\tvar selectAllChk = visibleContainer.querySelector(\".nodes_select_all\");\n\t\tvar selectAllBtn = document.getElementById(\"select_all_btn\");\n\t\tvar checkedCount = 0;\n\t\tfor (var i = 0; i < nodes.length; i++) {\n\t\t\tif (nodes[i].checked) checkedCount++;\n\t\t}\n\t\tvar allChecked = checkedCount === nodes.length;\n\t\tvar title = allChecked ? \"<%:DeSelect all%>\" : \"<%:Select all%>\";\n\t\tvar onclickFunc = allChecked ? \"dechecked_all_node(this)\" : \"checked_all_node(this)\";\n\n\t\tfunction updateElement(el) {\n\t\t\tif (!el) return;\n\t\t\tif (\"checked\" in el) el.checked = allChecked;\n\t\t\tif (\"title\" in el) el.title = title;\n\t\t\tif (\"value\" in el) el.value = title;\n\t\t\tel.setAttribute(\"onclick\", onclickFunc);\n\t\t}\n\n\t\tupdateElement(selectAllChk);\n\t\tupdateElement(selectAllBtn);\n\t}\n\t\n\tfunction delete_select_nodes() {\n\t\tvar ids = [];\n\t\tvar visibleContainer = document.querySelector('#cbi-<%=appname%>-nodes > .cbi-tabcontainer[style*=\"display:block\"], #cbi-<%=appname%>-nodes > .cbi-tabcontainer[style*=\"display: block\"]');\n\t\tif (!visibleContainer) return;\n\t\tvar doms = visibleContainer.getElementsByClassName(\"nodes_select\");\n\t\tif (doms && doms.length > 0) {\n\t\t\tfor (var i = 0 ; i < doms.length; i++) {\n\t\t\t\tif (doms[i].checked) {\n\t\t\t\t\tids.push(doms[i].getAttribute(\"cbid\"))\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ids.length > 0) {\n\t\t\t\tconst dom = document.getElementById('modal-mask');\n\t\t\t\tif (confirm('<%:Are you sure to delete select nodes?%>') == true) {\n\t\t\t\t\tdom.style.display = 'block';\n\t\t\t\t\tdom.innerHTML = '<div style=\"position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);color:#fff;\"><%:Processing, please wait…%></div>';\n\t\t\t\t\tXHR.get('<%=api.url(\"delete_select_nodes\")%>', {\n\t\t\t\t\t\tids: ids.join()\n\t\t\t\t\t},\n\t\t\t\t\tfunction(x, data) {\n\t\t\t\t\t\tdom.innerHTML = '';\n\t\t\t\t\t\tdom.style.display = 'none';\n\t\t\t\t\t\tif (x && x.status == 200) {\n\t\t\t\t\t\t\t/*\n\t\t\t\t\t\t\tfor (var i = 0 ; i < ids.length; i++) {\n\t\t\t\t\t\t\t\tvar box = document.getElementById(\"cbi-<%=appname%>-\" + ids[i]);\n\t\t\t\t\t\t\t\tbox.remove();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t*/\n\t\t\t\t\t\t\tajaxAbortAll();\n\t\t\t\t\t\t\twindow.location.href = '<%=api.url(\"node_list\")%>';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\talert(\"<%:Error%>\");\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (ids.length <= 0) {\n\t\t\talert(\"<%:You no select nodes !%>\");\n\t\t}\n\t}\n\t\n\tfunction set_node(type, config) {\n\t\tif (confirm('<%:Are you sure set this server?%>')==true){\n\t\t\tajaxAbortAll();\n\t\t\twindow.location.href = '<%=api.url(\"set_node\")%>?type=' + type + '&config=' + config + '&section=' + section;\n\t\t}\n\t}\n\t\n\tfunction get_address_full(id) {\n\t\tvar address = (document.getElementById(\"cbid.<%=appname%>.\" + id + \".address\") || {}).value || \"\";\n\t\tvar port = (document.getElementById(\"cbid.<%=appname%>.\" + id + \".port\") || {}).value || \"\";\n\t\t//Has Chinese characters?\n\t\tvar reg = /[\\u4E00-\\u9FFF]+/;\n\t\taddress = !reg.test(address) ? address : \"\";\n\t\treturn { address: address, port: port };\n\t}\n\t\n\tfunction get_node_order(group) {\n\t\tlet table = document.getElementById(\"cbi-<%=appname%>-nodes-\" + group + \"-table\");\n\t\tif (!table) {\n\t\t\treturn;\n\t\t}\n\t\tlet rows = table.querySelectorAll(\"tr.cbi-section-table-row\");\n\t\tif (!rows || rows.length === 0) {\n\t\t\treturn;\n\t\t}\n\t\tvar ids = [];\n\t\trows.forEach(function(row) {\n\t\t\tvar id = row.id.replace(\"cbi-<%=appname%>-\", \"\");\n\t\t\tids.push(id);\n\t\t});\n\t\treturn ids;\n\t}\n\n\tfunction save_current_page_order(group) {\n\t\tvar table = document.getElementById(\"cbi-<%=appname%>-nodes-\" + group + \"-table\");\n\t\tif (!table) {\n\t\t\talert(\"<%:No table!%>\");\n\t\t\treturn;\n\t\t}\n\t\tvar rows = table.querySelectorAll(\"tr.cbi-section-table-row\");\n\t\tif (!rows || rows.length === 0) {\n\t\t\talert(\"<%:No nodes!%>\");\n\t\t\treturn;\n\t\t}\n\t\tvar btn = document.getElementById(\"save_order_btn_\" + group);\n\t\tif (btn) {\n\t\t\tbtn.style.display = \"none\";\n\t\t\tbtn.disabled = true;\n\t\t}\n\t\tvar ids = [];\n\t\trows.forEach(function(row) {\n\t\t\tvar id = row.id.replace(\"cbi-<%=appname%>-\", \"\");\n\t\t\tids.push(id);\n\t\t});\n\t\tXHR.get('<%=api.url(\"save_node_order\")%>', {\n\t\t\t\tgroup: group,\n\t\t\t\tids: ids.join(\",\")\n\t\t\t},\n\t\t\tfunction(x, result) {\n\t\t\t\tif (btn) {\n\t\t\t\t\tbtn.style.display = null;\n\t\t\t\t\tbtn.disabled = false;\n\t\t\t\t}\n\t\t\t\tif (x && x.status === 200) {\n\t\t\t\t\torigin_group_node_order[group] = get_node_order(group);\n\t\t\t\t\talert(\"<%:Saved current page order successfully.%>\");\n\t\t\t\t\tif (btn) {\n\t\t\t\t\t\tbtn.style.display = \"none\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\talert(\"<%:Save failed!%>\");\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\tfunction get_now_use_node() {\n\t\tXHR.get('<%=api.url(\"get_now_use_node\")%>', null,\n\t\t\tfunction(x, result) {\n\t\t\t\tvar id = result[\"global\"];\n\t\t\t\tif (id) {\n\t\t\t\t\tvar dom = document.getElementById(\"cbi-<%=appname%>-\" + id);\n\t\t\t\t\tif (dom) {\n\t\t\t\t\t\tdom.title = \"<%:Using...%>\";\n\t\t\t\t\t\tdom.classList.add(\"_now_use_bg\");\n\t\t\t\t\t\t//var v = \"<a style='color: red'><%:Using...%>：</a>\" + document.getElementById(\"cbid.<%=appname%>.\" + id + \".remarks\").value;\n\t\t\t\t\t\t//document.getElementById(\"cbi-<%=appname%>-\" + id + \"-remarks\").innerHTML = v;\n\t\t\t\t\t\tvar dom_remarks = dom.querySelector(\"td.pw-remark\");\n\t\t\t\t\t\tif (dom_remarks) {\n\t\t\t\t\t\t\tdom_remarks.style.color = 'red';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\t\n\tfunction urltest_node(cbi_id, dom) {\n\t\tif (dom.dataset.busy == \"1\" || !cbi_id) return;\n\t\tdom.dataset.busy = \"1\";\n\t\tdom.style.color = \"\";\n\t\tdom.innerText = \"<%:Check...%>\";\n\t\tXHR.get('<%=api.url(\"urltest_node\")%>', {\n\t\t\t\tid: cbi_id\n\t\t\t},\n\t\t\tfunction(x, result) {\n\t\t\t\tlet color = \"red\";\n\t\t\t\tlet text = \"<%:Error%>\";\n\t\t\t\tif (x && x.status == 200) {\n\t\t\t\t\tif (result.use_time == null || result.use_time.trim() == \"\") {\n\t\t\t\t\t\ttext = \"<%:Timeout%>\";\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlet use_time = parseInt(result.use_time);\n\t\t\t\t\t\tif (use_time < 1000)\n\t\t\t\t\t\t\tcolor = \"green\";\n\t\t\t\t\t\telse if (use_time < 2000)\n\t\t\t\t\t\t\tcolor = \"#fb9a05\";\n\t\t\t\t\t\ttext = use_time + \" ms\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tdom.innerText = text;\n\t\t\t\tdom.style.color = color;\n\t\t\t\tdom.dataset.busy = \"0\";\n\t\t\t}\n\t\t);\n\t}\n\n\tfunction ping_node(cbi_id, dom, type) {\n\t\tif (dom.dataset.busy == \"1\" || !cbi_id) return;\n\t\tconst full = get_address_full(cbi_id);\n\t\tif ((type == \"icmp\" && full.address != \"\" ) || (type == \"tcping\" && full.address != \"\" && full.port != \"\")) {\n\t\t\tdom.dataset.busy = \"1\";\n\t\t\tdom.style.color = \"\";\n\t\t\tdom.innerText = \"<%:Check...%>\";\n\t\t\tXHR.get('<%=api.url(\"ping_node\")%>', {\n\t\t\t\t\taddress: full.address,\n\t\t\t\t\tport: full.port,\n\t\t\t\t\ttype: type\n\t\t\t\t},\n\t\t\t\tfunction(x, result) {\n\t\t\t\t\tlet color = \"red\";\n\t\t\t\t\tlet text = \"<%:Error%>\";\n\t\t\t\t\tif(x && x.status == 200) {\n\t\t\t\t\t\tif (result.ping == null || result.ping.trim() == \"\") {\n\t\t\t\t\t\t\ttext = \"<%:Timeout%>\";\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar ping = parseInt(result.ping);\n\t\t\t\t\t\t\tif (ping < 100)\n\t\t\t\t\t\t\t\tcolor = \"green\";\n\t\t\t\t\t\t\telse if (ping < 200)\n\t\t\t\t\t\t\t\tcolor = \"#fb9a05\";\n\t\t\t\t\t\t\ttext = result.ping + \" ms\";\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tdom.innerText = text;\n\t\t\t\t\tdom.style.color = color;\n\t\t\t\t\tdom.dataset.busy = \"0\";\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t}\n\n\t/* Auto Ping */\n\tfunction pingAllNodes() {\n\t\tif (auto_detection_time == \"icmp\" || auto_detection_time == \"tcping\") {\n\t\t\tconst now = Date.now();\n\t\t\tconst nodes = [];\n\t\t\tconst ping_value = document.getElementsByClassName(auto_detection_time == \"tcping\" ? 'tcping_value' : 'ping_value');\n\t\t\tfor (let i = 0; i < ping_value.length; i++) {\n\t\t\t\tconst cbi_id = ping_value[i].getAttribute(\"cbiid\");\n\t\t\t\tconst full = get_address_full(cbi_id);\n\t\t\t\tif ((auto_detection_time == \"icmp\" && full.address != \"\" ) || (auto_detection_time == \"tcping\" && full.address != \"\" && full.port != \"\")) {\n\t\t\t\t\tlet flag = false;\n\t\t\t\t\t// Merge duplicates\n\t\t\t\t\tfor (let j = 0; j < nodes.length; j++) {\n\t\t\t\t\t\tif (nodes[j].address == full.address && nodes[j].port == full.port) {\n\t\t\t\t\t\t\tnodes[j].indexs = nodes[j].indexs + \",\" + i;\n\t\t\t\t\t\t\tflag = true;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (flag)\n\t\t\t\t\t\tcontinue;\n\n\t\t\t\t\tconst cacheData = JSON.parse(localStorage.getItem(auto_detection_time + \":\" + full.address + \":\" + full.port));\n\t\t\t\t\tif (cacheData && cacheData.savetime && (now - cacheData.timestamp) < cacheData.savetime) {\n\t\t\t\t\t\tconst a = ping_value[i].firstElementChild;\n\t\t\t\t\t\tlet color = \"red\";\n\t\t\t\t\t\tif (cacheData.value < 100)\n\t\t\t\t\t\t\tcolor = \"green\";\n\t\t\t\t\t\telse if (cacheData.value < 200)\n\t\t\t\t\t\t\tcolor = \"#fb9a05\";\n\t\t\t\t\t\ta.innerText = cacheData.value + \" ms\";\n\t\t\t\t\t\ta.style.color = color;\n\t\t\t\t\t\ta.onclick = function () {\n\t\t\t\t\t\t\tping_node(cbi_id, this, auto_detection_time);\n\t\t\t\t\t\t};\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlocalStorage.removeItem(auto_detection_time + \":\" + full.address + \":\" + full.port);\n\t\t\t\t\t\tnodes.push({\n\t\t\t\t\t\t\tindexs: i + \"\",\n\t\t\t\t\t\t\taddress: full.address,\n\t\t\t\t\t\t\tport: full.port\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tconst _xhr = (index) => {\n\t\t\t\treturn new Promise((res) => {\n\t\t\t\t\tconst dom = nodes[index];\n\t\t\t\t\tif (!dom) res()\n\t\t\t\t\tajax.post('<%=api.url(\"ping_node\")%>', {\n\t\t\t\t\t\tindex: dom.indexs,\n\t\t\t\t\t\taddress: dom.address,\n\t\t\t\t\t\tport: dom.port,\n\t\t\t\t\t\ttype: auto_detection_time\n\t\t\t\t\t},\n\t\t\t\t\tfunction(x, result) {\n\t\t\t\t\t\tif (x && x.status == 200) {\n\t\t\t\t\t\t\tlet strs = dom.indexs.split(\",\");\n\t\t\t\t\t\t\tfor (let i = 0; i < strs.length; i++) {\n\t\t\t\t\t\t\t\tconst a = ping_value[strs[i]].firstElementChild;\n\t\t\t\t\t\t\t\tconst cbi_id = ping_value[strs[i]].getAttribute(\"cbiid\");\n\t\t\t\t\t\t\t\tlet color = \"red\";\n\t\t\t\t\t\t\t\tlet text = \"<%:Timeout%>\";\n\t\t\t\t\t\t\t\tif (result.ping !== null && result.ping.trim() !== \"\") {\n\t\t\t\t\t\t\t\t\tlet ping = parseInt(result.ping);\n\t\t\t\t\t\t\t\t\t//save to cache\n\t\t\t\t\t\t\t\t\tconst cache_data = {\n\t\t\t\t\t\t\t\t\t\tdom_id: strs[i],\n\t\t\t\t\t\t\t\t\t\ttimestamp: Date.now(),\n\t\t\t\t\t\t\t\t\t\tsavetime: 60 * 1000,\n\t\t\t\t\t\t\t\t\t\tvalue: ping\n\t\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t\t\ttext = result.ping + \" ms\";\n\t\t\t\t\t\t\t\t\tlocalStorage.setItem(auto_detection_time + \":\" + dom.address + \":\" + dom.port, JSON.stringify(cache_data));\n\t\t\t\t\t\t\t\t\tif (ping < 100)\n\t\t\t\t\t\t\t\t\t\tcolor = \"green\";\n\t\t\t\t\t\t\t\t\telse if (ping < 200)\n\t\t\t\t\t\t\t\t\t\tcolor = \"#fb9a05\";\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\ta.innerText = text;\n\t\t\t\t\t\t\t\ta.style.color = color;\n\t\t\t\t\t\t\t\ta.onclick = function () {\n\t\t\t\t\t\t\t\t\tping_node(cbi_id, this, auto_detection_time);\n\t\t\t\t\t\t\t\t};\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tres();\n\t\t\t\t\t},\n\t\t\t\t\t5000,\n\t\t\t\t\tfunction(x) {\n\t\t\t\t\t\tlet strs = dom.indexs.split(\",\");\n\t\t\t\t\t\tfor (let i = 0; i < strs.length; i++) {\n\t\t\t\t\t\t\tconst a = ping_value[strs[i]].firstElementChild;\n\t\t\t\t\t\t\tconst cbi_id = ping_value[strs[i]].getAttribute(\"cbiid\");\n\t\t\t\t\t\t\ta.innerText = \"<%:Timeout%>\";\n\t\t\t\t\t\t\ta.style.color = \"red\";\n\t\t\t\t\t\t\ta.onclick = function () {\n\t\t\t\t\t\t\t\tping_node(cbi_id, this, auto_detection_time);\n\t\t\t\t\t\t\t};\n\t\t\t\t\t\t}\n\t\t\t\t\t\tres();\n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t\t})\n\t\t\t}\n\n\t\t\tlet task = -1;\n\t\t\tconst thread = () => {\n\t\t\t\ttask = task + 1\n\t\t\t\tif (nodes[task]) {\n\t\t\t\t\t_xhr(task).then(thread);\n\t\t\t\t}\n\t\t\t}\n\t\t\tfor (let i = 0; i < 20; i++) {\n\t\t\t\tthread()\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction arraysEqual(a, b) {\n\t\tif (a === b) return true;\n\t\tif (a == null || b == null) return false;\n\t\tif (a.length !== b.length) return false;\n\t\tfor (let i = 0; i < a.length; i++) {\n\t\t\tif (a[i] !== b[i]) return false;\n\t\t}\n\t\treturn true;\n\t}\n\n\t// List drag and rearrange\n\tfunction initSortableForTable(table) {\n\t\tif (!table) return null;\n\t\tlet group = table.id.replace(\"cbi-<%=appname%>-nodes-\", \"\").replace(\"-table\", \"\")\n\t\tvar root = table.querySelector('tbody') || table;\n\t\tif (root._sortable_initialized) return root._sortable_instance;\n\t\troot._sortable_initialized = true;\n\t\tvar opts = {\n\t\t\thandle: \".drag-handle\",\n\t\t\tdraggable: \"tr.cbi-section-table-row\",\n\t\t\tanimation: 150,\n\t\t\tghostClass: \"dragging-row\",\n\t\t\tfallbackOnBody: true,\n\t\t\tforceFallback: false,\n\t\t\tswapThreshold: 0.65,\n\t\t\tonEnd: function (evt) {\n\t\t\t\t//save_current_page_order(group); // Auto save\n\t\t\t\tlet save_order_btn = document.getElementById(\"save_order_btn_\" + group);\n\t\t\t\tif (save_order_btn) {\n\t\t\t\t\tconst new_order = get_node_order(group);\n\t\t\t\t\tif (!arraysEqual(new_order, origin_group_node_order[group])) {\n\t\t\t\t\t\tsave_order_btn.style.display = null;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tsave_order_btn.style.display = \"none\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\ttry {\n\t\t\tvar instance = Sortable.create(root, opts);\n\t\t\troot._sortable_instance = instance;\n\t\t\treturn instance;\n\t\t} catch (err) {\n\t\t\troot._sortable_initialized = false;\n\t\t\tconsole.error(\"Sortable init failed:\", err);\n\t\t\treturn null;\n\t\t}\n\t}\n\n\tfunction initAllSortable(group_nodes) {\n\t\tif (typeof Sortable === 'undefined') {\n\t\t\tvar retries = 0;\n\t\t\tvar maxRetries = 25;\n\t\t\tvar t = setInterval(function () {\n\t\t\t\tretries++;\n\t\t\t\tif (typeof Sortable !== 'undefined') {\n\t\t\t\t\tclearInterval(t);\n\t\t\t\t\tfor (var group in group_nodes) {\n\t\t\t\t\t\tvar table = document.getElementById(\"cbi-<%=appname%>-nodes-\" + group + \"-table\");\n\t\t\t\t\t\tinitSortableForTable(table);\n\t\t\t\t\t}\n\t\t\t\t} else if (retries >= maxRetries) {\n\t\t\t\t\tclearInterval(t);\n\t\t\t\t}\n\t\t\t}, 200);\n\t\t} else {\n\t\t\tfor (var group in group_nodes) {\n\t\t\t\tvar table = document.getElementById(\"cbi-<%=appname%>-nodes-\" + group + \"-table\");\n\t\t\t\tinitSortableForTable(table);\n\t\t\t}\n\t\t}\n\t}\n\n\tfunction escape_html(s) {\n\t\treturn s.replace(/[&<>\"']/g, c => ({\n\t\t\t\"&\":\"&amp;\", \"<\":\"&lt;\", \">\":\"&gt;\", '\"':\"&quot;\", \"'\":\"&#39;\"\n\t\t}[c]));\n\t}\n</script>\n\n\n<script type=\"text/template\" id=\"nodes-table-template\">\n\t<fieldset class=\"cbi-section cbi-tblsection\" id=\"cbi-<%=appname%>-nodes-{{group}}-fieldset\">\n\t\t<table class=\"table cbi-section-table\" id=\"cbi-<%=appname%>-nodes-{{group}}-table\" style=\"\">\n\t\t\t<tr class=\"tr cbi-section-table-titles anonymous\">\n\t\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:20px\">\n\t\t\t\t\t<input class=\"cbi-input-checkbox nodes_select_all\" type=\"checkbox\" onclick=\"checked_all_node(this)\" title=\"<%:Select all%>\"/>\n\t\t\t\t</th>\n\t\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:40%\"><%:Remarks%></th>\n\t\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:8%\">Ping</th>\n\t\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:8%\">TCPing</th>\n\t\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:8%\"><%:URL Test%></th>\n\t\t\t\t<th class=\"th cbi-section-table-cell cbi-section-actions\"></th>\n\t\t\t</tr>\n\t\t\t{{node-tr}}\n\t\t</table>\n\t\t<div class=\"cbi-section-create cbi-tblsection-create\">\n\t\t\t<input class=\"cbi-button cbi-button-add\" type=\"button\" value=\"<%:Add%>\" onclick=\"to_add_node()\">\n\t\t\t<input class=\"cbi-button cbi-button-apply\" style=\"display: none\" type=\"button\" id=\"save_order_btn_{{group}}\" value=\"<%:Save Order%>\" onclick=\"save_current_page_order('{{group}}')\">\n\t\t</div>\n\t</fieldset>\n</script>\n\n<script type=\"text/template\" id=\"node-tr-template\">\n\t<tr class=\"tr cbi-section-table-row\" id=\"cbi-<%=appname%>-{{id}}\">\n\t\t<input class=\"hidden\" id=\"cbid.<%=appname%>.{{id}}.remarks\" value=\"{{remarks_val}}\"/>\n\t\t<input class=\"hidden\" id=\"cbid.<%=appname%>.{{id}}.address\" value=\"{{address_val}}\"/>\n\t\t<input class=\"hidden\" id=\"cbid.<%=appname%>.{{id}}.port\" value=\"{{port_val}}\"/>\n\t\t<td class=\"td cbi-value-field pw-checkbox\">\n\t\t\t<input class=\"cbi-input-checkbox nodes_select\" type=\"checkbox\" cbid=\"{{id}}\" onclick=\"update_select_state()\"/>\n\t\t</td>\n\t\t<td class=\"td cbi-value-field pw-remark\">{{remarks}}</td>\n\t\t<td class=\"td cbi-value-field pw-ping\">{{ping}}</td>\n\t\t<td class=\"td cbi-value-field pw-tcping\">{{tcping}}</td>\n\t\t<td class=\"td cbi-value-field pw-urltest\">{{url_test}}</td>\n\t\t<td class=\"td cbi-section-table-cell nowrap cbi-section-actions pw-actions\">\n\t\t\t<div class=\"node-wrapper\">\n\t\t\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" value=\"<%:To Top%>\" onclick=\"row_top(this, '{{group}}')\" title=\"<%:To Top%>\"/>\n\t\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" value=\"<%:Use%>\" id=\"apply_{{id}}\" onclick=\"open_set_node_div('{{id}}')\"/>\n\t\t\t\t<input class=\"btn cbi-button cbi-button-add\" type=\"button\" value=\"<%:Copy%>\" onclick=\"copy_node('{{id}}')\"/>\n\t\t\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" value=\"<%:Edit%>\" onclick=\"to_edit_node('{{id}}')\" alt=\"<%:Edit%>\" title=\"<%:Edit%>\">\n\t\t\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" value=\"<%:Delete%>\" onclick=\"del_node('{{id}}')\" alt=\"<%:Delete%>\" title=\"<%:Delete%>\">\n\t\t\t\t<span class=\"drag-handle center\" title=\"<%:Drag to reorder%>\">⠿</span>\n\t\t\t</div>\n\t\t</td>\n\t</tr>\n</script>\n\n<fieldset class=\"cbi-section\" id=\"node_list\">\n</fieldset>\n\n<script type=\"text/javascript\">\n\tfunction get_remarks_name(o) {\n\t\tlet str = \"\";\n\t\tlet remarks = o[\"remarks\"] || \"\";\n\t\tlet type = o[\"type\"] || \"\";\n\t\tstr += \"<input type='hidden' id='cbid.<%=appname%>.\" + o[\".name\"] + \".type' value='\" + type + \"'/>\";\n\t\tif (type == \"sing-box\" || type == \"Xray\") {\n\t\t\tlet protocol = o[\"protocol\"]\n\t\t\tlet p = \"\";\n\t\t\tif (protocol == \"_balancing\") {\n\t\t\t\tp = \"<%:Balancing%>\";\n\t\t\t} else if (protocol == \"_urltest\") {\n\t\t\t\tp = \"URLTest\";\n\t\t\t} else if (protocol == \"_shunt\") {\n\t\t\t\tp = \"<%:Shunt%>\";\n\t\t\t} else if (protocol == \"vmess\") {\n\t\t\t\tp = \"VMess\";\n\t\t\t} else if (protocol == \"vless\") {\n\t\t\t\tp = \"VLESS\";\n\t\t\t} else if (protocol == \"shadowsocks\") {\n\t\t\t\tp = \"SS\";\n\t\t\t} else if (protocol == \"shadowsocksr\") {\n\t\t\t\tp = \"SSR\";\n\t\t\t} else if (protocol == \"wireguard\") {\n\t\t\t\tp = \"WG\";\n\t\t\t} else if (protocol == \"hysteria\") {\n\t\t\t\tp = \"HY\";\n\t\t\t} else if (protocol == \"hysteria2\") {\n\t\t\t\tp = \"HY2\";\n\t\t\t} else if (protocol == \"anytls\") {\n\t\t\t\tp = \"AnyTLS\";\n\t\t\t} else if (protocol == \"ssh\") {\n\t\t\t\tp = \"SSH\";\n\t\t\t} else {\n\t\t\t\tif (protocol && protocol.length > 1) {\n\t\t\t\t\tp = protocol.charAt(0).toUpperCase() + protocol.slice(1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (type == \"sing-box\") {\n\t\t\t\ttype = \"Sing-Box\";\n\t\t\t}\n\t\t\ttype += \" \" + p;\n\t\t}\n\t\tlet address = o[\"address\"] || \"\";\n\t\tlet port = o[\"port\"] || \"\";\n\t\tlet port_s = \"\";\n\t\tif (port != \"\") {\n\t\t\tport_s = port;\n\t\t} else {\n\t\t\tport_s = o[\"hysteria_hop\"] || o[\"hysteria2_hop\"];\n\t\t}\n\t\tstr += type + \"：\" + remarks;\n\t\treturn str;\n\t}\n\n\tfunction loadNodeList() {\n\t\tXHR.get('<%=api.url(\"get_node\")%>', null, function(x, result) {\n\t\t\tvar node_list = result\n\n\t\t\tvar group_nodes = {}\n\t\t\tfor (let i = 0; i < node_list.length; i++) {\n\t\t\t\tlet _node = node_list[i]\n\t\t\t\tif (!_node.group || _node.group === \"\") {\n\t\t\t\t\t_node.group = \"default\"\n\t\t\t\t}\n\t\t\t\tif (!group_nodes[_node.group]) {\n\t\t\t\t\tgroup_nodes[_node.group] = []\n\t\t\t\t}\n\t\t\t\tgroup_nodes[_node.group].push(_node)\n\t\t\t}\n\n\t\t\tvar tab_ul_html = '<ul class=\"cbi-tabmenu\">'\n\t\t\tvar tab_ul_li_html = ''\n\t\t\tvar tab_content_html = '<fieldset class=\"cbi-section-node cbi-section-node-tabbed\" id=\"cbi-<%=appname%>-nodes\">'\n\t\t\tvar nodes_table_template = document.getElementById(\"nodes-table-template\");\n\t\t\tvar node_template = document.getElementById(\"node-tr-template\");\n\t\t\tvar default_group = null\n\t\t\tfor (let group in group_nodes) {\n\t\t\t\tif (default_group == null)\n\t\t\t\t\tdefault_group = group\n\n\t\t\t\tvar table_html = \"\";\n\t\t\t\tif (true) {\n\t\t\t\t\t//Node List\n\t\t\t\t\tvar new_nodes_table_dom = nodes_table_template.cloneNode(true);\n\t\t\t\t\tvar _html = new_nodes_table_dom.innerHTML;\n\t\t\t\t\t_html = _html.split(\"{{group}}\").join(group);\n\t\t\t\t\tvar node_tr_html = \"\";\n\t\t\t\t\tfor (var i = 0; i < group_nodes[group].length; i++) {\n\t\t\t\t\t\tlet o = group_nodes[group][i]\n\t\t\t\t\t\tvar newDom = node_template.cloneNode(true);\n\t\t\t\t\t\tnewDom.classList.add(\"cbi-rowstyle-\" + (i % 2 + 1));\n\t\t\t\t\t\tvar innerHTML = newDom.innerHTML;\n\t\t\t\t\t\tif (auto_detection_time != \"icmp\" && o[\"address\"] && o[\"port\"]) {\n\t\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{ping}}\").join('<span class=\"ping\"><a href=\"javascript:void(0)\" onclick=\"javascript:ping_node(\\'{{id}}\\', this, \\'icmp\\')\"><%:Test%></a></span>');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{ping}}\").join('<span class=\"ping_value\" cbiid=\"{{id}}\"><a href=\"javascript:void(0)\" style=\"color:inherit\">---</a></span>');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (auto_detection_time != \"tcping\" && o[\"address\"] && o[\"port\"]) {\n\t\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{tcping}}\").join('<span class=\"ping\"><a href=\"javascript:void(0)\" onclick=\"javascript:ping_node(\\'{{id}}\\', this, \\'tcping\\')\"><%:Test%></a></span>');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{tcping}}\").join('<span class=\"tcping_value\" cbiid=\"{{id}}\"><a href=\"javascript:void(0)\" style=\"color:inherit\">---</a></span>');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (o[\"address\"] && o[\"port\"]) {\n\t\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{url_test}}\").join('<span class=\"ping\"><a href=\"javascript:void(0)\" onclick=\"javascript:urltest_node(\\'{{id}}\\', this)\"><%:Test%></a></span>');\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{url_test}}\").join('<span class=\"ping_value\"><a href=\"javascript:void(0)\" style=\"color:inherit\">---</a></span>');\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{id}}\").join(o[\".name\"]);\n\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{group}}\").join(o[\"group\"] || \"\");\n\t\t\t\t\t\tlet node_remarks = get_remarks_name(o);\n\t\t\t\t\t\tif (show_node_info == \"1\") {\n\t\t\t\t\t\t\tif (o[\"address\"] && o[\"port\"]) {\n\t\t\t\t\t\t\t\tlet _address = o[\"address\"]\n\t\t\t\t\t\t\t\tif (o[\"full_address\"])\n\t\t\t\t\t\t\t\t\t_address = o[\"full_address\"]\n\t\t\t\t\t\t\t\tnode_remarks += \"<br>\" + _address + \":\" + o[\"port\"]\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{remarks}}\").join(node_remarks);\n\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{remarks_val}}\").join(o[\"remarks\"]);\n\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{address_val}}\").join(o[\"address\"] || \"\");\n\t\t\t\t\t\tinnerHTML = innerHTML.split(\"{{port_val}}\").join(o[\"port\"] || \"\");\n\n\t\t\t\t\t\tnode_tr_html += innerHTML\n\t\t\t\t\t}\n\t\t\t\t\t_html = _html.split(\"{{node-tr}}\").join(node_tr_html);\n\t\t\t\t\ttable_html = _html;\n\t\t\t\t}\n\n\t\t\t\tvar group_name = group\n\t\t\t\tif (group === \"default\") {\n\t\t\t\t\tgroup_name = \"<%:default%>\"\n\t\t\t\t}\n\n\t\t\t\ttab_ul_li_html +=\n\t\t\t\t\t'<li group_name=\"' + group + '\" id=\"tab.<%=appname%>.nodes.' + group + '\" class=\"cbi-tab\">' +\n\t\t\t\t\t\t'<a onclick=\"this.blur(); return cbi_t_switch(\\'<%=appname%>.nodes\\', \\'' + group + '\\')\" href=\"<%=REQUEST_URI%>?tab.<%=appname%>.nodes=' + group + '\">' + escape_html(group_name) + \" | \" + \"<font style='color: red'>\" + group_nodes[group].length + '</font></a>' +\n\t\t\t\t\t'</li>'\n\t\t\t\ttab_content_html +=\n\t\t\t\t\t'<div class=\"cbi-tabcontainer\" id=\"container.<%=appname%>.nodes.' + group + '\" style=\"display: none;\">' +\n\t\t\t\t\t'' + table_html +\n\t\t\t\t\t'</div>'\n\t\t\t}\n\n\t\t\ttab_ul_html += tab_ul_li_html + '</ul>'\n\t\t\ttab_content_html += '</fieldset>'\n\t\t\tvar tab_html = tab_ul_html + tab_content_html\n\n\t\t\tdocument.getElementById(\"node_list\").innerHTML = tab_html\n\n\t\t\tfor (let group in group_nodes) {\n\t\t\t\tcbi_t_add(\"<%=appname%>.nodes\", group)\n\t\t\t}\n\n\t\t\tif (default_group) {\n\t\t\t\tcbi_t_switch(\"<%=appname%>.nodes\", default_group)\n\t\t\t}\n\t\t\t\n\t\t\torigin_group_node_order = {};\n\t\t\tfor (let group in group_nodes) {\n\t\t\t\torigin_group_node_order[group] = get_node_order(group);\n\t\t\t}\n\n\t\t\tinitAllSortable(group_nodes);\n\n\t\t\t//clear expire data\n\t\t\tif (localStorage && localStorage.length > 0) {\n\t\t\t\tconst now = Date.now();\n\t\t\t\tfor (let i = 0; i < localStorage.length; i++) {\n\t\t\t\t\tlet key = localStorage.key(i);\n\t\t\t\t\tif (key && (key.startsWith(\"icmp\") || key.startsWith(\"tcping\"))) {\n\t\t\t\t\t\tlet value_str = localStorage.getItem(key);\n\t\t\t\t\t\tconst value = JSON.parse(value_str);\n\t\t\t\t\t\tif (!(value && value.savetime && (now - value.timestamp) < value.savetime)) {\n\t\t\t\t\t\t\tlocalStorage.removeItem(key);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tget_now_use_node();\n\t\t\t\n\t\t\tpingAllNodes();\n\t\t});\n\t}\n\n\tloadNodeList();\n\n\t//Node list option saving logic\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t\tfunction waitForElement(selector, callback) {\n\t\t\tconst el = document.querySelector(selector);\n\t\t\tif (el) return callback(el);\n\t\t\tconst observer = new MutationObserver(() => {\n\t\t\t\tconst el = document.querySelector(selector);\n\t\t\t\tif (el) {\n\t\t\t\t\tobserver.disconnect();\n\t\t\t\t\tcallback(el);\n\t\t\t\t}\n\t\t\t});\n\t\t\tobserver.observe(document.body, { childList: true, subtree: true });\n\t\t}\n\n\t\tfunction onChange(option, value) {\n\t\t\tXHR.get('<%=api.url(\"save_node_list_opt\")%>', {\n\t\t\t\toption: option,\n\t\t\t\tvalue: value\n\t\t\t}, function(x) {\n\t\t\t\tif (x && x.status == 200) {\n\t\t\t\t\tdocument.getElementById(\"node_list\").innerHTML = \"\";\n\t\t\t\t\tloadNodeList();\n\t\t\t\t} else {\n\t\t\t\t\talert(\"<%:Error%>\");\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\twaitForElement('input[type=\"checkbox\"][name*=\"<%=appname%>\"][name*=\"show_node_info\"]', function(el) {\n\t\t\tel.addEventListener(\"change\", () => {\n\t\t\t\tel.blur();\n\t\t\t\tshow_node_info = el.checked ? \"1\" : \"0\";\n\t\t\t\tonChange(\"show_node_info\", show_node_info);\n\t\t\t});\n\t\t});\n\n\t\twaitForElement('select[name*=\"<%=appname%>\"][name*=\"auto_detection_time\"]', function(el) {\n\t\t\tel.addEventListener(\"change\", () => {\n\t\t\t\tel.blur();\n\t\t\t\tauto_detection_time = el.value;\n\t\t\t\tonChange(\"auto_detection_time\", auto_detection_time);\n\t\t\t});\n\t\t});\n\t});\n\t//]]>\n</script>\n\n<div style=\"display: -webkit-flex; display: flex; -webkit-align-items: center; align-items: center; -webkit-justify-content: center; justify-content: center;\">\n\t<div id=\"set_node_div\" style=\"text-align: center;\">\n\t\t<div class=\"cbi-value\" style=\"display: flex; justify-content: center; align-items: center; margin: 8px 0;\">\n\t\t\t<font color=#666><%:You choose node is:%></font><a style=\"color: red\" id=\"set_node_name\"></a>\n\t\t</div>\n\t\t<div class=\"cbi-value\" style=\"display: flex; justify-content: center; gap: 8px; margin: 8px 0;\">\n\t\t\t<%- if default_node_type == \"_shunt\" then\n\t\t\t\tfor i, v in ipairs(shunt_rule_list) do\n\t\t\t-%>\n\t\t\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" onclick=\"set_node('<%=node%>', '<%=v[\".name\"]%>')\" value=\"<%=v.remarks%>\" />\n\t\t\t<%-\n\t\t\t\tend\n\t\t\t-%>\n\t\t\t<% else %>\n\t\t\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" onclick=\"set_node('@global[0]', 'node')\" value=\"<%:Node%>\" />\n\t\t\t<% end %>\n\t\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"close_set_node_div()\" value=\"<%:Close%>\" />\n\t\t</div>\n\t</div>\n</div>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/node_subscribe/js.htm",
    "content": "<%\nlocal api = require \"luci.passwall2.api\"\n-%>\n<script src=\"<%=resource%>/view/<%=api.appname%>/Sortable.min.js\"></script>\n\n<style>\ntable .cbi-button-up,\ntable .cbi-button-down,\n.td.cbi-section-actions .cbi-button-up,\n.td.cbi-section-actions .cbi-button-down {\n\tdisplay: none !important;\n}\n\n.drag-handle {\n\tvertical-align: middle;\n\tcursor: grab !important;\n\tdisplay: inline-flex;\n\talign-items: center;\n\tjustify-content: center;\n\tfont-size: 20px;\n\tfont-weight: 100;\n\tpadding: 0 !important;\n\tline-height: inherit;\n\tuser-select: none;\n\talign-self: stretch;\n\tbackground-color: transparent;\n}\n\n.drag-handle:hover {\n\tbackground: transparent;\n}\n\n.dragging-row {\n\tbackground-color: rgba(131, 191, 255, 0.7) !important;\n\tbox-shadow: 0 4px 6px rgba(0,0,0,0.1);\n}\n\n@media screen and (max-width: 1152px) {\n\t#cbi-<%=api.appname%>-subscribe_list .cbi-section-table-titles {\n\t\tdisplay: none !important;\n\t}\n}\n</style>\n\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tvar appname = \"<%= api.appname %>\"\n\n\tfunction confirmDeleteNode(remark) {\n\t\tif (!confirm(\"<%:Delete the subscribed node%>: \" + remark + \" ?\"))\n\t\t\treturn false;\n\n\t\tfetch('<%= api.url(\"subscribe_del_node\") %>?remark=' + encodeURIComponent(remark), {\n\t\t\tmethod: \"GET\"\n\t\t}).then(res => {\n\t\t\tif (res.ok) {\n\t\t\t\tlocation.reload();\n\t\t\t} else {\n\t\t\t\talert(\"<%:Failed to delete.%>\");\n\t\t\t}\n\t\t});\n\t\treturn false;\n\t}\n\n\tfunction confirmDeleteAll() {\n\t\tif (!confirm(\"<%:Are you sure you want to delete all subscribed nodes?%>\"))\n\t\t\treturn false;\n\n\t\tfetch('<%= api.url(\"subscribe_del_all\") %>', {\n\t\t\tmethod: \"GET\"\n\t\t}).then(res => {\n\t\t\tif (res.ok) {\n\t\t\t\tlocation.reload();\n\t\t\t} else {\n\t\t\t\talert(\"<%:Failed to delete.%>\");\n\t\t\t}\n\t\t});\n\t\treturn false;\n\t}\n\n\tfunction ManualSubscribe(sectionId) {\n\t\tvar urlInput = document.querySelector(\"input[name='cbid.\" + appname + \".\" + sectionId + \".url']\");\n\t\tvar currentUrl = urlInput ? urlInput.value.trim() : \"\";\n\t\tif (!currentUrl) {\n\t\t\talert(\"<%:Subscribe URL cannot be empty.%>\");\n\t\t\treturn;\n\t\t}\n\n\t\tfetch('<%= api.url(\"subscribe_manual\") %>?section='\n\t\t\t+ encodeURIComponent(sectionId)\n\t\t\t+ '&url='\n\t\t\t+ encodeURIComponent(currentUrl))\n\t\t.then(response => response.json())\n\t\t.then(data => {\n\t\t\tif (!data.success) {\n\t\t\t\talert(data.msg || \"Operation failed\");\n\t\t\t} else {\n\t\t\t\twindow.location.href = '<%= api.url(\"log\") %>'\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction ManualSubscribeAll() {\n\t\tvar sectionIds = [];\n\t\tvar urls = [];\n\n\t\tvar table = document.getElementById(\"cbi-\" + appname + \"-subscribe_list\");\n\t\tvar editBtns = table ? table.getElementsByClassName(\"cbi-button cbi-button-edit\") : [];\n\n\t\tfor (var i = 0; i < editBtns.length; i++) {\n\t\t\tvar btn = editBtns[i];\n\t\t\tvar onclickStr = btn.getAttribute(\"onclick\");\n\t\t\tif (!onclickStr) continue;\n\n\t\t\tvar id = onclickStr.substring(onclickStr.lastIndexOf('/') + 1, onclickStr.length - 1);\n\t\t\tif (!id) continue;\n\n\t\t\tvar urlInput = document.querySelector(\"input[name='cbid.\" + appname + \".\" + id + \".url']\");\n\t\t\tvar currentUrl = urlInput ? urlInput.value.trim() : \"\";\n\t\t\tif (!currentUrl) {\n\t\t\t\talert(\"<%:Subscribe URL cannot be empty.%>\");\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tsectionIds.push(id);\n\t\t\turls.push(currentUrl);\n\t\t}\n\n\t\tif (sectionIds.length === 0) {\n\t\t\t//alert(\"No subscriptions found.\");\n\t\t\treturn;\n\t\t}\n\n\t\tvar params = new URLSearchParams();\n\t\tparams.append(\"sections\", sectionIds.join(\",\"));\n\t\tparams.append(\"urls\", urls.join(\",\"));\n\n\t\tfetch('<%= api.url(\"subscribe_manual_all\") %>', {\n\t\t\tmethod: 'POST',\n\t\t\tbody: params\n\t\t})\n\t\t.then(response => response.json())\n\t\t.then(data => {\n\t\t\tif (!data.success) {\n\t\t\t\talert(data.msg || \"Operation failed\");\n\t\t\t} else {\n\t\t\t\twindow.location.href = '<%= api.url(\"log\") %>'\n\t\t\t}\n\t\t});\n\t}\n\n\t//订阅列表添加拖拽排序\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t\tfunction initSortableForTable() {\n\t\t\tvar section = document.getElementById(\"cbi-<%=api.appname%>-subscribe_list\");\n\t\t\tif (!section) return;\n\n\t\t\thideSortColumn(section);\n\n\t\t\t// === 插入 drag handle ===\n\t\t\tvar rows = section.querySelectorAll(\"tr\");\n\t\t\trows.forEach(function(row) {\n\t\t\t\tvar btn = row.querySelector(\".cbi-button-remove:last-of-type\");\n\t\t\t\tif (!btn) return;\n\t\t\t\tif (btn.nextElementSibling && btn.nextElementSibling.classList.contains(\"drag-handle\")) return;\n\t\t\t\tvar handle = document.createElement(\"span\");\n\t\t\t\thandle.className = \"drag-handle center\";\n\t\t\t\thandle.title = \"<%:Drag to reorder%>\";\n\t\t\t\thandle.innerHTML = \"⠿\";\n\t\t\t\tbtn.after(handle);\n\t\t\t});\n\n\t\t\t// === 初始化 Sortable ===\n\t\t\tvar table = section.getElementsByTagName(\"table\")[0];\n\t\t\tif (!table) return;\n\t\t\tvar root = table.tBodies[0] || table;\n\t\t\tif (root._sortable_initialized) return root._sortable_instance;\n\t\t\troot._sortable_initialized = true;\n\n\t\t\t// 保存原始顺序\n\t\t\troot._origOrder = getCurrentOrder(root);\n\n\t\t\ttry {\n\t\t\t\troot._sortable_instance = Sortable.create(root, {\n\t\t\t\t\thandle: \".drag-handle\",\n\t\t\t\t\tdraggable: \"tr.cbi-section-table-row\",\n\t\t\t\t\tanimation: 150,\n\t\t\t\t\tghostClass: \"dragging-row\",\n\t\t\t\t\tfallbackOnBody: true,\n\t\t\t\t\tforceFallback: false,\n\t\t\t\t\tswapThreshold: 0.65,\n\t\t\t\t\tonEnd: function (evt) {\n\t\t\t\t\t\tupdateHiddenInput(root, section);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn root._sortable_instance;\n\t\t\t} catch (e) {\n\t\t\t\troot._sortable_initialized = false;\n\t\t\t\tconsole.error(\"Sortable init failed:\", e);\n\t\t\t}\n\t\t}\n\n\t\t// 获取 table 当前行顺序\n\t\tfunction getCurrentOrder(root) {\n\t\t\tvar order = [];\n\t\t\tvar rows = root.querySelectorAll(\"tr.cbi-section-table-row\");\n\t\t\trows.forEach(function (tr) {\n\t\t\t\tvar id = tr.id || \"\";\n\t\t\t\tif (id.startsWith(\"cbi-<%=api.appname%>-\"))\n\t\t\t\t\tid = id.replace(\"cbi-<%=api.appname%>-\", \"\");\n\t\t\t\torder.push(id);\n\t\t\t});\n\t\t\treturn order;\n\t\t}\n\n\t\t// 拖拽完成后更新 hidden input\n\t\tfunction updateHiddenInput(root, section) {\n\t\t\tvar newOrder = getCurrentOrder(root);\n\t\t\tvar changed = newOrder.join(\" \") !== root._origOrder.join(\" \");\n\t\t\tvar hiddenInput = section.querySelector('input[type=\"hidden\"][id^=\"cbi.sts.\"]');\n\t\t\tif (hiddenInput) {\n\t\t\t\thiddenInput.value = changed ? newOrder.join(\" \") : \"\";\n\t\t\t}\n\t\t}\n\n\t\t// 隐藏18.06 up/down 列\n\t\tfunction hideSortColumn(section) {\n\t\t\tvar table = section.querySelector(\"table\");\n\t\t\tif (!table) return;\n\t\t\tvar ths = Array.prototype.slice.call(table.querySelectorAll(\"tr.cbi-section-table-titles > th\"));\n\t\t\tvar dataRows = table.querySelectorAll(\"tr.cbi-section-table-row\");\n\t\t\tif (!ths.length || !dataRows.length) return;\n\t\t\tvar sortCol = -1;\n\t\t\tfor (var i = 0; i < ths.length; i++) {\n\t\t\t\tvar hasSort = false, invalid = false;\n\t\t\t\tdataRows.forEach(function(tr) {\n\t\t\t\t\tvar td = tr.querySelectorAll(\":scope > td\")[i];\n\t\t\t\t\tif (!td) return;\n\t\t\t\t\tif (td.querySelector(\".cbi-button-edit, .cbi-button-remove\")) invalid = true;\n\t\t\t\t\tif (td.querySelector(\".cbi-button-up, .cbi-button-down\")) hasSort = true;\n\t\t\t\t});\n\t\t\t\tif (!invalid && hasSort) { sortCol = i; break; }\n\t\t\t}\n\t\t\tif (sortCol === -1) return;\n\t\t\tvar rows = [table.querySelector(\"tr.cbi-section-table-titles\")].concat(\n\t\t\t\tArray.prototype.slice.call(dataRows),\n\t\t\t\tArray.prototype.slice.call(table.querySelectorAll(\"tr.cbi-section-table-descr\"))\n\t\t\t);\n\t\t\trows.forEach(function(tr) {\n\t\t\t\tvar cells = Array.prototype.filter.call(tr.children, function(el) {\n\t\t\t\t\treturn el.tagName === \"TH\" || el.tagName === \"TD\";\n\t\t\t\t});\n\t\t\t\tif (cells[sortCol]) cells[sortCol].style.display = \"none\";\n\t\t\t});\n\t\t}\n\n\t\t// === 等待 TypedSection 行稳定 ===\n\t\t(function waitStable() {\n\t\t\tvar last = 0, stable = 0;\n\t\t\tvar THRESHOLD = 5;\n\t\t\tfunction tick() {\n\t\t\t\tvar count = document.querySelectorAll(\"tr.cbi-section-table-row\").length;\n\t\t\t\tif (count && count === last) stable++;\n\t\t\t\telse stable = 0;\n\n\t\t\t\tlast = count;\n\t\t\t\tif (stable >= THRESHOLD)\n\t\t\t\t\tsetTimeout(initSortableForTable, 200);\n\t\t\t\telse\n\t\t\t\t\trequestAnimationFrame(tick);\n\t\t\t}\n\t\t\ttick();\n\t\t})();\n\t});\n\t//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/rule/geoview.htm",
    "content": "<%\nlocal api = require \"luci.passwall2.api\"\n-%>\n\n<style>\n\t.faq-title {\n\t\tcolor: var(--primary);\n\t\tfont-weight: bolder;\n\t\tmargin-bottom: 0.5rem;\n\t\tdisplay: inline-block;\n\t}\n\t.faq-item {\n\t\tmargin-bottom: 0.8rem;\n\t\tline-height:1.2rem;\n\t}\n\n\t.geoview-search {\n\t\tdisplay: flex;\n\t\tgap: 2px;\n\t\talign-items: center;\n\t\twhite-space: nowrap;\n\t}\n</style>\n\n<div class=\"cbi-value\">\n\t<ul>\n\t\t<b class=\"faq-title\"><%:Tips:%></b>\n\t\t<li class=\"faq-item\">1. <span><%:By entering a domain or IP, you can query the Geo rule list they belong to.%></span></li>\n\t\t<li class=\"faq-item\">2. <span><%:By entering a GeoIP or Geosite, you can extract the domains/IPs they contain.%></span></li>\n\t\t<li class=\"faq-item\">3. <span><%:Use the GeoIP/Geosite query function to verify if the entered Geo rules are correct.%></span></li>\n\t</ul>\n</div>\n<div class=\"cbi-value\" id=\"cbi-passwall2-geoview-lookup\">\n\t<label class=\"cbi-value-title\" for=\"geoview.lookup\"><%:Domain/IP Query%></label>\n\t<div class=\"cbi-value-field\">\n\t\t<div class=\"geoview-search\">\n\t\t\t<input type=\"text\" class=\"password-input cbi-input-text\" id=\"geoview.lookup\" name=\"geoview.lookup\" inputmode=\"search\" enterkeyhint=\"search\" />\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" id=\"lookup-view_btn\"\n\t\t\t\tonclick='do_geoview(this, \"lookup\", lookupInput.value)'\n\t\t\t\tvalue=\"<%:Query%>\" />\n\t\t</div>\n\t\t<div class=\"cbi-value-description\">\n\t\t\t<%:Enter a domain or IP to query the Geo rule list they belong to.%>\n\t\t</div>\n\t</div>\n</div>\n<div class=\"cbi-value\" id=\"cbi-passwall2-geoview-extract\">\n\t<label class=\"cbi-value-title\" for=\"geoview.extract\"><%:GeoIP/Geosite Query%></label>\n\t<div class=\"cbi-value-field\">\n\t\t<div class=\"geoview-search\">\n\t\t\t<input type=\"text\" class=\"password-input cbi-input-text\" id=\"geoview.extract\" name=\"geoview.extract\" inputmode=\"search\" enterkeyhint=\"search\" />\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" id=\"extract-view_btn\"\n\t\t\t\tonclick='do_geoview(this, \"extract\", extractInput.value)'\n\t\t\t\tvalue=\"<%:Query%>\" />\n\t\t</div>\n\t\t<div class=\"cbi-value-description\">\n\t\t\t<%:Enter a GeoIP or Geosite to extract the domains/IPs they contain. Format: geoip:cn or geosite:gfw%>\n\t\t</div>\n\t</div>\n</div>\n<div class=\"cbi-value\">\n\t<textarea id=\"geoview_textarea\" class=\"cbi-input-textarea\" style=\"width: 100%; margin-top: 10px;\" rows=\"25\" wrap=\"off\" readonly=\"readonly\"></textarea>\n</div>\n\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tconst lookupInput = document.getElementById(\"geoview.lookup\");\n\tconst extractInput = document.getElementById(\"geoview.extract\");\n\tconst lookup_btn = document.getElementById(\"lookup-view_btn\");\n\tconst extract_btn = document.getElementById(\"extract-view_btn\");\n\n\tfunction do_geoview(btn,action,value) {\n\t\tvalue = value.trim();\n\t\tif (!value) {\n\t\t\talert(\"<%:Please enter query content!%>\");\n\t\t\treturn;\n        }\n\t\tlookup_btn.disabled = true;\n\t\textract_btn.disabled = true;\n\t\tbtn.value = '<%:Querying%>';\n\t\tconst textarea = document.getElementById('geoview_textarea');\n\t\ttextarea.textContent = \"\";\n\t\tfetch('<%= api.url(\"geo_view\") %>?action=' + action + '&value=' + encodeURIComponent(value))\n\t\t\t.then(response => response.text())\n\t\t\t.then(data => {\n\t\t\t\ttextarea.textContent = data;\n\t\t\t\tlookup_btn.disabled = false;\n\t\t\t\textract_btn.disabled = false;\n\t\t\t\tbtn.value = '<%:Query%>';\n\t\t\t})\n\t}\n\n\tlookupInput.addEventListener(\"keydown\", function(e) {\n\t\tconst isEnter = e.key === \"Enter\" || e.keyCode === 13;\n\t\tif (!isEnter) return;\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t\tlookupInput.blur();\n\t\tlookup_btn.click();\n\t});\n\n\textractInput.addEventListener(\"keydown\", function(e) {\n\t\tconst isEnter = e.key === \"Enter\" || e.keyCode === 13;\n\t\tif (!isEnter) return;\n\t\te.stopPropagation();\n\t\te.preventDefault();\n\t\textractInput.blur();\n\t\textract_btn.click();\n\t});\n\t//]]>\n</script>"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/rule/rule_version.htm",
    "content": "<%\nlocal api = require \"luci.passwall2.api\"\nlocal fs = api.fs\nlocal has_old_geoip = fs.access(\"/tmp/bak_v2ray/geoip.dat\")\nlocal has_old_geosite = fs.access(\"/tmp/bak_v2ray/geosite.dat\")\n-%>\n<script src=\"<%=resource%>/view/<%=api.appname%>/Sortable.min.js\"></script>\n\n<style>\n\ttable .cbi-button-up,\n\ttable .cbi-button-down,\n\t.td.cbi-section-actions .cbi-button-up,\n\t.td.cbi-section-actions .cbi-button-down {\n\t\tdisplay: none !important;\n\t}\n\n\tdiv.cbi-value[id$=\"-geoip_update\"],\n\tdiv.cbi-value[id$=\"-geosite_update\"] {\n\t\tdisplay: none !important;\n\t}\n\n\t.drag-handle {\n\t\tvertical-align: middle;\n\t\tcursor: grab !important;\n\t\tdisplay: inline-flex;\n\t\talign-items: center;\n\t\tjustify-content: center;\n\t\tfont-size: 20px;\n\t\tfont-weight: 100;\n\t\tpadding: 0 !important;\n\t\tline-height: inherit;\n\t\tuser-select: none;\n\t\talign-self: stretch;\n\t\tbackground-color: transparent;\n\t}\n\n\t.drag-handle:hover {\n\t\tbackground: transparent;\n\t}\n\n\t.dragging-row {\n\t\tbackground-color: rgba(131, 191, 255, 0.7) !important;\n\t\tbox-shadow: 0 4px 6px rgba(0,0,0,0.1);\n\t}\n</style>\n\n<div class=\"cbi-value\" id=\"_rule_div\">\n\t<label class=\"cbi-value-title\">\n\t\t<%:Update Options%>\n\t</label>\n\t<div class=\"cbi-value-field\">\n\t\t<div>\n\t\t\t<label>\n\t\t\t\t<input class=\"cbi-input-checkbox\" type=\"checkbox\" name=\"geoip\" value=\"1\" />\n\t\t\t\tgeoip\n\t\t\t</label>\n\t\t\t<label>\n\t\t\t\t<input class=\"cbi-input-checkbox\" type=\"checkbox\" name=\"geosite\" value=\"1\" />\n\t\t\t\tgeosite\n\t\t\t</label>\n\t\t\t<br><br>\n\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" id=\"update_rules_btn\" onclick=\"update_rules(this)\" value=\"<%:Manually update%>\" />\n\t\t\t<% if has_old_geoip then %>\n\t\t\t<input class=\"btn cbi-button cbi-button-reset\" type=\"button\" onclick=\"rollback_rules(this, 'geoip')\" value=\"<%:Rollback%> GeoIP\" />\n\t\t\t<% end %>\n\t\t\t<% if has_old_geosite then %>\n\t\t\t<input class=\"btn cbi-button cbi-button-reset\" type=\"button\" onclick=\"rollback_rules(this, 'geosite')\" value=\"<%:Rollback%> Geosite\" />\n\t\t\t<% end %>\n\t\t</div>\n\t</div>\n</div>\n\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tdocument.addEventListener('DOMContentLoaded', function () {\n\t\tconst flags = [\n\t\t\t\"geoip_update\", \"geosite_update\"\n\t\t];\n\t\tconst bindFlags = () => {\n\t\t\tlet allBound = true;\n\t\t\tflags.forEach(flag => {\n\t\t\t\tconst orig = Array.from(document.querySelectorAll(`input[name$=\".${flag}\"]`)).find(i => i.type === 'checkbox');\n\t\t\t\tif (!orig) { allBound = false; return; }\n\t\t\t\t// 隐藏最外层 div\n\t\t\t\tconst wrapper = orig.closest('.cbi-value');\n\t\t\t\tif (wrapper && wrapper.style.display !== 'none') {\n\t\t\t\t\twrapper.style.display = 'none';\n\t\t\t\t}\n\t\t\t\tconst custom = document.querySelector(`.cbi-input-checkbox[name=\"${flag.replace('_update','')}\"]`);\n\t\t\t\tif (!custom) { allBound = false; return; }\n\t\t\t\tcustom.checked = orig.checked;\n\t\t\t\t// 自定义选择框与原生Flag双向绑定\n\t\t\t\tif (!custom._binded) {\n\t\t\t\t\tcustom._binded = true;\n\t\t\t\t\torig.addEventListener('change', () => {\n\t\t\t\t\t\tcustom.checked = orig.checked;\n\t\t\t\t\t});\n\t\t\t\t\tcustom.addEventListener('change', () => {\n\t\t\t\t\t\torig.checked = custom.checked;\n\t\t\t\t\t\torig.dispatchEvent(new Event('change', { bubbles: true }));\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn allBound;\n\t\t};\n\t\tconst target = document.querySelector('form') || document.body;\n\t\tconst observer = new MutationObserver(() => bindFlags() ? observer.disconnect() : 0);\n\t\tobserver.observe(target, { childList: true, subtree: true });\n\t\tconst timer = setInterval(() => bindFlags() ? (clearInterval(timer), observer.disconnect()) : 0, 300);\n\t\tsetTimeout(() => { clearInterval(timer); observer.disconnect(); }, 5000);\n\t});\n\n\tfunction update_rules(btn) {\n\t\tbtn.disabled = true;\n\t\tbtn.value = '<%:Updating...%>';\n\t\tvar div = document.getElementById('_rule_div');\n\t\tvar domList = div.getElementsByTagName('input');\n\t\tvar checkBoxList = [];\n\t\tvar len = domList.length;\n\t\twhile(len--) {\n\t\t\tvar dom = domList[len];　　\n\t\t\tif(dom.type == 'checkbox' && dom.checked) {　　\n\t\t\t\tcheckBoxList.push(dom.name);　　\n\t\t\t}\n\t\t}\n\t\tXHR.get('<%=api.url(\"update_rules\")%>', {\n\t\t\t\tupdate: checkBoxList.join(\",\")\n\t\t\t},\n\t\t\tfunction(x, data) {\n\t\t\t\tif(x && x.status == 200) {\n\t\t\t\t\twindow.location.href = '<%=api.url(\"log\")%>';\n\t\t\t\t} else {\n\t\t\t\t\talert(\"<%:Error%>\");\n\t\t\t\t\tbtn.disabled = false;\n\t\t\t\t\tbtn.value = '<%:Manually update%>';\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\t\n\tfunction rollback_rules(btn, type) {\n\t\tlet ori_val = btn.value;\n\t\tbtn.disabled = true;\n\t\tbtn.value = '<%:Rollbacking...%>';\n\t\tXHR.get('<%=api.url(\"rollback_rules\")%>', {\n\t\t\ttype: type\n\t\t\t},\n\t\t\tfunction(x, data) {\n\t\t\t\tif(x && x.status == 200 && data.code == 1) {\n\t\t\t\t\talert(\"<%:Success%>\");\n\t\t\t\t\tbtn.style.display = \"none\";\n\t\t\t\t} else {\n\t\t\t\t\talert(\"<%:Error%>\");\n\t\t\t\t\tbtn.disabled = false;\n\t\t\t\t\tbtn.value = ori_val;\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\t//分流规则添加拖拽排序\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t\tfunction initSortableForTable() {\n\t\t\tvar section = document.getElementById(\"cbi-<%=api.appname%>-shunt_rules\");\n\t\t\tif (!section) return;\n\n\t\t\t// === 插入 drag handle ===\n\t\t\tvar rows = section.querySelectorAll(\"tr\");\n\t\t\trows.forEach(function(row) {\n\t\t\t\tvar btn = row.querySelector(\".cbi-button-remove:last-of-type\");\n\t\t\t\tif (!btn) return;\n\t\t\t\tif (btn.nextElementSibling && btn.nextElementSibling.classList.contains(\"drag-handle\")) return;\n\t\t\t\tvar handle = document.createElement(\"span\");\n\t\t\t\thandle.className = \"drag-handle center\";\n\t\t\t\thandle.title = \"<%:Drag to reorder%>\";\n\t\t\t\thandle.innerHTML = \"⠿\";\n\t\t\t\tbtn.after(handle);\n\t\t\t});\n\n\t\t\t// === 初始化 Sortable ===\n\t\t\tvar table = section.getElementsByTagName(\"table\")[0];\n\t\t\tif (!table) return;\n\t\t\tvar root = table.tBodies[0] || table;\n\t\t\tif (root._sortable_initialized) return root._sortable_instance;\n\t\t\troot._sortable_initialized = true;\n\n\t\t\t// 保存原始顺序\n\t\t\troot._origOrder = getCurrentOrder(root);\n\n\t\t\ttry {\n\t\t\t\troot._sortable_instance = Sortable.create(root, {\n\t\t\t\t\thandle: \".drag-handle\",\n\t\t\t\t\tdraggable: \"tr.cbi-section-table-row\",\n\t\t\t\t\tanimation: 150,\n\t\t\t\t\tghostClass: \"dragging-row\",\n\t\t\t\t\tfallbackOnBody: true,\n\t\t\t\t\tforceFallback: false,\n\t\t\t\t\tswapThreshold: 0.65,\n\t\t\t\t\tonEnd: function (evt) {\n\t\t\t\t\t\tupdateHiddenInput(root, section);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\treturn root._sortable_instance;\n\t\t\t} catch (e) {\n\t\t\t\troot._sortable_initialized = false;\n\t\t\t\tconsole.error(\"Sortable init failed:\", e);\n\t\t\t}\n\t\t}\n\n\t\t// 获取 table 当前行顺序\n\t\tfunction getCurrentOrder(root) {\n\t\t\tvar order = [];\n\t\t\tvar rows = root.querySelectorAll(\"tr.cbi-section-table-row\");\n\t\t\trows.forEach(function (tr) {\n\t\t\t\tvar id = tr.id || \"\";\n\t\t\t\tif (id.startsWith(\"cbi-<%=api.appname%>-\"))\n\t\t\t\t\tid = id.replace(\"cbi-<%=api.appname%>-\", \"\");\n\t\t\t\torder.push(id);\n\t\t\t});\n\t\t\treturn order;\n\t\t}\n\n\t\t// 拖拽完成后更新 hidden input\n\t\tfunction updateHiddenInput(root, section) {\n\t\t\tvar newOrder = getCurrentOrder(root);\n\t\t\tvar changed = newOrder.join(\" \") !== root._origOrder.join(\" \");\n\t\t\tvar hiddenInput = section.querySelector('input[type=\"hidden\"][id^=\"cbi.sts.\"]');\n\t\t\tif (hiddenInput) {\n\t\t\t\thiddenInput.value = changed ? newOrder.join(\" \") : \"\";\n\t\t\t}\n\t\t}\n\t\t\n\t\t// 隐藏18.06 up/down 列\n\t\tfunction hideSortColumn(section) {\n\t\t\tvar table = section.getElementsByTagName(\"table\")[0];\n\t\t\tif(!table) return;\n\t\t\tvar rows = table.querySelectorAll(\"tr.cbi-section-table-row\");\n\t\t\tif(!rows.length) return;\n\t\t\tvar colCount = rows[0].children.length, sortCol = -1;\n\t\t\tfor(var col=0; col<colCount; col++){\n\t\t\t\tvar hasSort=false, invalid=false;\n\t\t\t\trows.forEach(function(tr){\n\t\t\t\t\tvar td=tr.children[col]; if(!td) return;\n\t\t\t\t\tif(td.querySelector(\".cbi-button-edit, .cbi-button-remove\")) invalid=true;\n\t\t\t\t\tif(td.querySelector(\".cbi-button-up, .cbi-button-down\")) hasSort=true;\n\t\t\t\t});\n\t\t\t\tif(!invalid && hasSort){ sortCol=col; break; }\n\t\t\t}\n\t\t\tif(sortCol===-1) return;\n\t\t\ttable.querySelectorAll(\"tr\").forEach(function(tr){\n\t\t\t\tvar c=tr.children[sortCol]; if(c) c.style.display=\"none\";\n\t\t\t});\n\t\t}\n\n\t\t// === 等待 TypedSection 行稳定 ===\n\t\t(function waitStable() {\n\t\t\tvar last = 0, stable = 0;\n\t\t\tvar THRESHOLD = 5;\n\t\t\tfunction tick() {\n\t\t\t\tvar count = document.querySelectorAll(\"tr.cbi-section-table-row\").length;\n\t\t\t\tif (count && count === last) stable++;\n\t\t\t\telse stable = 0;\n\n\t\t\t\tlast = count;\n\t\t\t\tif (stable >= THRESHOLD)\n\t\t\t\t\tsetTimeout(initSortableForTable, 200);\n\t\t\t\telse\n\t\t\t\t\trequestAnimationFrame(tick);\n\t\t\t}\n\t\t\ttick();\n\t\t})();\n\t});\n\t//]]>\n</script>\n"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/server/log.htm",
    "content": "<%\nlocal api = require \"luci.passwall2.api\"\n-%>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tvar log_textarea = null;\n\tvar first_load_done = false;\n\n\tfunction scrollToBottom() {\n\t\tlog_textarea.scrollTop = log_textarea.scrollHeight;\n\t}\n\n\tfunction clear_log(btn) {\n\t\tXHR.get('<%=api.url(\"server_clear_log\")%>', null,\n\t\t\tfunction(x, data) {\n\t\t\t\tif(x && x.status == 200 && log_textarea) {\n\t\t\t\t\tlog_textarea.innerHTML = \"\";\n\t\t\t\t\tscrollToBottom();\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\tXHR.poll(3, '<%=api.url(\"server_get_log\")%>', null,\n\t\tfunction(x, data) {\n\t\t\tif(x && x.status == 200) {\n\t\t\t\tif (!log_textarea) log_textarea = document.getElementById('log_textarea');\n\t\t\t\tvar wasBottom = (log_textarea.scrollTop + log_textarea.clientHeight >= log_textarea.scrollHeight - 10);\n\t\t\t\tlog_textarea.innerHTML = x.responseText;\n\t\t\t\tif (!first_load_done) {\n\t\t\t\t\tscrollToBottom();\n\t\t\t\t\tfirst_load_done = true;\n\t\t\t\t}\n\t\t\t\telse if (wasBottom) {\n\t\t\t\t\tscrollToBottom();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t);\n\t//]]>\n</script>\n<fieldset class=\"cbi-section\" id=\"_log_fieldset\">\n\t<legend>\n\t\t<%:Logs%>\n\t</legend>\n\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"clear_log()\" value=\"<%:Clear logs%>\" />\n\t<textarea id=\"log_textarea\" class=\"cbi-input-textarea\" style=\"width: 100%;margin-top: 10px;\" data-update=\"change\" rows=\"20\" wrap=\"off\" readonly=\"readonly\"></textarea>\n</fieldset>"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/server/users_list_status.htm",
    "content": "<%\nlocal api = require \"luci.passwall2.api\"\n-%>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tvar _users_status = document.getElementsByClassName('_users_status');\n\tfor(var i = 0; i < _users_status.length; i++) {\n\t\tvar id = _users_status[i].parentElement.parentElement.parentElement.id;\n\t\tid = id.substr(id.lastIndexOf(\"-\") + 1);\n\t\tXHR.get('<%=api.url(\"server_user_status\")%>', {\n\t\t\t\tindex: i,\n\t\t\t\tid: id\n\t\t\t},\n\t\t\tfunction(x, result) {\n\t\t\t\t_users_status[result.index].setAttribute(\"style\",\"font-weight:bold;\");\n\t\t\t\t_users_status[result.index].setAttribute(\"color\",result.status ? \"green\":\"red\");\n\t\t\t\t_users_status[result.index].innerHTML = (result.status ? '✓' : 'X');\n\t\t\t}\n\t\t);\n\t}\n\t\n\tvar edit_btn = document.getElementById(\"cbi-passwall2_server-user\").getElementsByClassName(\"cbi-button cbi-button-edit\");\n\tfor (var i = 0; i < edit_btn.length; i++) {\n\t\ttry {\n\t\t\tvar onclick_str = edit_btn[i].getAttribute(\"onclick\");\n\t\t\tvar id = onclick_str.substring(onclick_str.lastIndexOf('/') + 1, onclick_str.length - 1);\n\t\t\tvar td = edit_btn[i].parentNode;\n\t\t\tvar new_div = \"\";\n\t\t\t// Add `log` button\n\t\t\tnew_div += '<input class=\"btn cbi-button cbi-button-add\" type=\"button\" value=\"<%:Log%>\" onclick=\"window.open(\\'' + '<%=api.url(\"server_user_log\")%>' + '?id=' + id + '\\', \\'_blank\\')\"/>&nbsp;&nbsp;';\n\t\t\ttd.innerHTML = new_div + td.innerHTML;\n\t\t}\n\t\tcatch(err) {\n\t\t\tconsole.error(err);\n\t\t}\n\t}\n\t//]]>\n</script>"
  },
  {
    "path": "luci-app-passwall2/luasrc/view/passwall2/socks_auto_switch/btn.htm",
    "content": "<%\nlocal api = require \"luci.passwall2.api\"\n-%>\n\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tlet socks_id = window.location.pathname.substring(window.location.pathname.lastIndexOf(\"/\") + 1)\n\tfunction add_node_by_key() {\n\t\tvar key = prompt(\"<%:Please enter the node keyword, pay attention to distinguish between spaces, uppercase and lowercase.%>\", \"\");\n\t\tif (key) {\n\t\t\twindow.location.href = '<%=api.url(\"socks_autoswitch_add_node\")%>' + \"?id=\" + socks_id + \"&key=\" + key;\n\t\t}\n\t}\n\tfunction remove_node_by_key() {\n\t\tvar key = prompt(\"<%:Please enter the node keyword, pay attention to distinguish between spaces, uppercase and lowercase.%>\", \"\");\n\t\tif (key) {\n\t\t\twindow.location.href = '<%=api.url(\"socks_autoswitch_remove_node\")%>' + \"?id=\" + socks_id + \"&key=\" + key;\n\t\t}\n\t}\n\t//]]>\n</script>\n<style>\n.key-btn-div {\n\tdisplay: table-cell;\n\tpadding: 5px 0 5px;\n}\n@media screen and (max-width: 600px) {\n\t.key-btn-div {\n\t\tdisplay: block;\n\t}\n\t.key-label {\n\t\tdisplay: none !important;\n\t}\n}\n.key-btn-div .cbi-button {\n\tmargin-bottom: 2px;\n}\n</style>\n<div class=\"cbi-value\" id=\"cbi-<%=self.config..\"-\"..section..\"-\"..self.option%>\" data-index=\"<%=self.index%>\" data-depends=\"<%=pcdata(self:deplist2json(section))%>\">\n\t<label class=\"cbi-value-title key-label\">　</label>\n\t<div class=\"key-btn-div\">\n\t\t<input class=\"btn cbi-button cbi-button-add\" type=\"button\" onclick=\"add_node_by_key()\" value=\"<%:Add nodes to the standby node list by keywords%>\" />\n\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"remove_node_by_key()\" value=\"<%:Delete nodes in the standby node list by keywords%>\" />\n\t</div>\n</div>\n"
  },
  {
    "path": "luci-app-passwall2/po/fa/passwall2.po",
    "content": "msgid \"Auto\"\nmsgstr \"خودکار\"\n\nmsgid \"RUNNING\"\nmsgstr \"در حال اجرا\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"متوقف شده\"\n\nmsgid \"Working...\"\nmsgstr \"در حال کار...\"\n\nmsgid \"Problem detected!\"\nmsgstr \"مشکل شناسایی شد!\"\n\nmsgid \"Touch Check\"\nmsgstr \"بررسی اتصال\"\n\nmsgid \"Global\"\nmsgstr \"سراسری\"\n\nmsgid \"Kernel Unsupported\"\nmsgstr \"هسته پشتیبانی نمی‌شود\"\n\nmsgid \"Basic Settings\"\nmsgstr \"تنظیمات پایه\"\n\nmsgid \"Node List\"\nmsgstr \"لیست گره‌ها\"\n\nmsgid \"Other Settings\"\nmsgstr \"تنظیمات دیگر\"\n\nmsgid \"Load Balancing\"\nmsgstr \"توزیع بار\"\n\nmsgid \"Enter interface\"\nmsgstr \"رابط ورود\"\n\nmsgid \"Rule Manage\"\nmsgstr \"مدیریت قوانین\"\n\nmsgid \"Rule List\"\nmsgstr \"لیست قوانین\"\n\nmsgid \"Access control\"\nmsgstr \"کنترل دسترسی\"\n\nmsgid \"Watch Logs\"\nmsgstr \"مشاهده گزارش‌ها\"\n\nmsgid \"Node Config\"\nmsgstr \"پیکربندی گره\"\n\nmsgid \"Running Status\"\nmsgstr \"وضعیت اجرا\"\n\nmsgid \"Baidu Connection\"\nmsgstr \"اتصال بایدو\"\n\nmsgid \"Google Connection\"\nmsgstr \"اتصال گوگل\"\n\nmsgid \"GitHub Connection\"\nmsgstr \"اتصال گیت‌هاب\"\n\nmsgid \"Instagram Connection\"\nmsgstr \"اتصال اینستاگرام\"\n\nmsgid \"Node Check\"\nmsgstr \"بررسی گره\"\n\nmsgid \"Check...\"\nmsgstr \"بررسی...\"\n\nmsgid \"Clear\"\nmsgstr \"پاک کردن\"\n\nmsgid \"Main switch\"\nmsgstr \"سوئیچ اصلی\"\n\nmsgid \"Node\"\nmsgstr \"گره\"\n\nmsgid \"Edit Current Node\"\nmsgstr \"ویرایش گره فعلی\"\n\nmsgid \"Localhost Proxy\"\nmsgstr \"پروکسی میزبان محلی\"\n\nmsgid \"When selected, localhost can transparent proxy.\"\nmsgstr \"در صورت انتخاب، میزبان محلی می‌تواند از پروکسی شفاف استفاده کند.\"\n\nmsgid \"Client Proxy\"\nmsgstr \"پروکسی کلاینت\"\n\nmsgid \"When selected, devices in LAN can transparent proxy. Otherwise, it will not be proxy. But you can still use access control to allow the designated device to proxy.\"\nmsgstr \"\"\n\"در صورت انتخاب، دستگاه‌های شبکه داخلی (LAN) از پروکسی شفاف استفاده می‌کنند. \"\n\"در غیر این صورت، ترافیک آن‌ها از پروکسی عبور نمی‌کند. با این حال، همچنان می‌توانید از طریق کنترل دسترسی \"\n\"به دستگاه‌های خاص اجازه استفاده از پروکسی را بدهید.\"\n\nmsgid \"Missing components, transparent proxy is unavailable.\"\nmsgstr \"اجزای مورد نیاز یافت نشد، پروکسی شفاف در دسترس نیست.\"\n\nmsgid \"Socks Config\"\nmsgstr \"پیکربندی Socks\"\n\nmsgid \"Socks Node\"\nmsgstr \"گره Socks\"\n\nmsgid \"Current Node\"\nmsgstr \"گره فعلی\"\n\nmsgid \"Listen Port\"\nmsgstr \"پورت شنود\"\n\nmsgid \"0 is not use\"\nmsgstr \"0 به معنای عدم استفاده است\"\n\nmsgid \"Current node: %s\"\nmsgstr \"گره فعلی: %s\"\n\nmsgid \"Direct domain DNS routing\"\nmsgstr \"مسیریابی مستقیم DNS دامنه\"\n\nmsgid \"Please note that the program will not start if the format is incorrect!\"\nmsgstr \"لطفا توجه داشته باشید که اگر قالب نادرست باشد، برنامه شروع نخواهد شد!\"\n\nmsgid \"IP:Port mode acceptable, multi value split with english comma.\"\nmsgstr \"حالت IP:Port قابل قبول است، مقادیر متعدد را با کاما انگلیسی جدا کنید.\"\n\nmsgid \"Direct DNS Protocol\"\nmsgstr \"پروتکل DNS مستقیم\"\n\nmsgid \"Direct DNS\"\nmsgstr \"DNS مستقیم\"\n\nmsgid \"Direct DNS DoH\"\nmsgstr \"DNS مستقیم DoH\"\n\nmsgid \"Direct DNS EDNS Client Subnet\"\nmsgstr \"زیرشبکه کلاینت EDNS برای DNS مستقیم\"\n\nmsgid \"Remote DNS Protocol\"\nmsgstr \"پروتکل DNS راه دور\"\n\nmsgid \"Remote DNS\"\nmsgstr \"DNS راه دور\"\n\nmsgid \"Remote DNS DoH\"\nmsgstr \"DNS راه دور DoH\"\n\nmsgid \"Remote DNS EDNS Client Subnet\"\nmsgstr \"زیرشبکه کلاینت EDNS برای DNS راه دور\"\n\nmsgid \"Notify the DNS server when the DNS query is notified, the location of the client (cannot be a private IP address).\"\nmsgstr \"به سرور DNS اطلاع دهید که کلاینت در چه موقعیتی قرار دارد (نمی‌تواند آدرس IP خصوصی باشد).\"\n\nmsgid \"This feature requires the DNS server to support the Edns Client Subnet (RFC7871).\"\nmsgstr \"این ویژگی نیازمند پشتیبانی سرور DNS از زیرشبکه کلاینت EDNS (RFC7871) است.\"\n\nmsgid \"Remote DNS Outbound\"\nmsgstr \"خروجی DNS راه دور\"\n\nmsgid \"Remote\"\nmsgstr \"راه دور\"\n\nmsgid \"Direct\"\nmsgstr \"مستقیم\"\n\nmsgid \"Direct Query Strategy\"\nmsgstr \"استراتژی پرس‌وجوی مستقیم\"\n\nmsgid \"Remote Query Strategy\"\nmsgstr \"استراتژی پرس‌وجوی راه دور\"\n\nmsgid \"Use FakeDNS work in the domain that proxy.\"\nmsgstr \"استفاده از FakeDNS در دامنه‌هایی که پروکسی می‌شوند.\"\n\nmsgid \"Suitable scenarios for let the node servers get the target domain names.\"\nmsgstr \"سناریوهای مناسب برای اینکه سرورهای گره نام دامنه هدف را دریافت کنند.\"\n\nmsgid \"Such as: DNS unlocking of streaming media, reducing DNS query latency, etc.\"\nmsgstr \"مانند: رفع فیلتر DNS رسانه‌های جریانی، کاهش تاخیر پرس‌وجوی DNS و غیره.\"\n\nmsgid \"Domain Override\"\nmsgstr \"بازنویسی دامنه\"\n\nmsgid \"Direct DNS result write to IPSet\"\nmsgstr \"نتیجه DNS مستقیم در IPSet نوشته شود\"\n\nmsgid \"Perform the matching direct domain name rules into IP to IPSet/NFTSet, and then connect directly (not entering the core).\"\nmsgstr \"قوانین نام دامنه مستقیم منطبق را به IP در IPSet/NFTSet تبدیل کرده و سپس مستقیماً متصل شود (بدون ورود به هسته).\"\n\nmsgid \"Maybe conflict with some special circumstances.\"\nmsgstr \"ممکن است با برخی شرایط خاص تداخل داشته باشد.\"\n\nmsgid \"DNS Redirect\"\nmsgstr \"تغییر مسیر DNS\"\n\nmsgid \"Force special DNS server to need proxy devices.\"\nmsgstr \"اجبار دستگاه‌های پروکسی به استفاده از سرور DNS خاص.\"\n\nmsgid \"Clear IPSET\"\nmsgstr \"پاک کردن IPSET\"\n\nmsgid \"Clear NFTSET\"\nmsgstr \"پاک کردن NFTSET\"\n\nmsgid \"Try this feature if the rule modification does not take effect.\"\nmsgstr \"اگر تغییر قوانین تاثیری نداشت، این ویژگی را امتحان کنید.\"\n\nmsgid \"About DNS issues:\"\nmsgstr \"درباره مشکلات DNS:\"\n\nmsgid \"Some browsers may have built-in DNS, be sure to close. Example: Chrome. Settings - Security and Privacy - Security - Use secure DNS disabled.\"\nmsgstr \"برخی مرورگرها (مانند کروم) ممکن است DNS داخلی داشته باشند؛ لطفاً آن را غیرفعال کنید. مسیر: تنظیمات > امنیت و حریم خصوصی > امنیت > استفاده از DNS امن را غیرفعال کنید.\"\n\nmsgid \"Sometimes after restart, you can not internet. At this time, close all browsers (important), Windows Client, please `ipconfig /flushdns`. Please close the WiFi on the phone, cut the flight mode and then cut back.\"\nmsgstr \"گاهی اوقات پس از راه‌اندازی مجدد، دسترسی به اینترنت قطع می‌شود. در این صورت، تمام مرورگرها را ببندید (مهم)، در کلاینت ویندوز دستور `ipconfig /flushdns` را اجرا کنید. وای‌فای گوشی را خاموش و روشن کنید یا حالت پرواز را فعال و غیرفعال نمایید.\"\n\nmsgid \"The client DNS and the default gateway must point to this router.\"\nmsgstr \"DNS کلاینت و دروازه پیش‌فرض باید به این روتر اشاره کنند.\"\n\nmsgid \"If you have a wrong DNS process, the consequences are at your own risk!\"\nmsgstr \"اگر فرآیند DNS اشتباهی دارید، عواقب آن با خودتان است!\"\n\nmsgid \"Hide menu method, input example in the address bar:\"\nmsgstr \"روش مخفی کردن منو، مثال ورودی در نوار آدرس:\"\n\nmsgid \"After the hidden to the display, input example in the address bar:\"\nmsgstr \"پس از مخفی شدن برای نمایش، مثال ورودی در نوار آدرس:\"\n\nmsgid \"Are you sure to hide?\"\nmsgstr \"آیا مطمئن هستید که مخفی شود؟\"\n\nmsgid \"DNS related issues:\"\nmsgstr \"مشکلات مربوط به DNS:\"\n\nmsgid \"Certain browsers such as Chrome have built-in DNS service, which may affect DNS resolution settings. You can go to 'Settings -> Privacy and security -> Use secure DNS' menu to turn it off.\"\nmsgstr \"مرورگرهای خاصی مانند Chrome دارای سرویس DNS داخلی هستند که ممکن است بر تنظیمات تفکیک DNS تأثیر بگذارد. می‌توانید به منوی 'تنظیمات -> حریم خصوصی و امنیت -> استفاده از DNS امن' بروید تا آن را خاموش کنید.\"\n\nmsgid \"If you are unable to access the internet after reboot, please try clearing the cache of your terminal devices (make sure to close all open browser application windows first, this step is especially important):\"\nmsgstr \"اگر پس از راه‌اندازی مجدد قادر به دسترسی به اینترنت نیستید، لطفاً سعی کنید کش دستگاه‌های نهایی خود را پاک کنید (حتماً ابتدا تمام پنجره‌های برنامه مرورگر باز را ببندید، این مرحله بسیار مهم است):\"\n\nmsgid \"For Windows systems, open Command Prompt and run the command 'ipconfig /flushdns'.\"\nmsgstr \"برای سیستم‌های ویندوز، Command Prompt را باز کرده و دستور 'ipconfig /flushdns' را اجرا کنید.\"\n\nmsgid \"For Mac systems, open Terminal and run the command 'sudo killall -HUP mDNSResponder'.\"\nmsgstr \"برای سیستم‌های مک، ترمینال را باز کرده و دستور 'sudo killall -HUP mDNSResponder' را اجرا کنید.\"\n\nmsgid \"For mobile devices, you can clear it by reconnecting to the network, such as toggling Airplane Mode and reconnecting to WiFi.\"\nmsgstr \"برای دستگاه‌های تلفن همراه، می‌توانید با اتصال مجدد به شبکه، مانند روشن و خاموش کردن حالت هواپیما و اتصال مجدد به وای‌فای، آن را پاک کنید.\"\n\nmsgid \"Please make sure your device's network settings point both the DNS server and default gateway to this router, to ensure DNS queries are properly routed.\"\nmsgstr \"لطفاً مطمئن شوید که تنظیمات شبکه دستگاه شما هم سرور DNS و هم دروازه پیش‌فرض را به این روتر ارجاع می‌دهد تا اطمینان حاصل شود که پرس‌وجوهای DNS به درستی هدایت می‌شوند.\"\n\nmsgid \"Browser access:\"\nmsgstr \"دسترسی مرورگر:\"\n\nmsgid \"Hide in main menu:\"\nmsgstr \"مخفی کردن در منوی اصلی:\"\n\nmsgid \"Show in main menu:\"\nmsgstr \"نمایش در منوی اصلی:\"\n\nmsgid \"DNS Export Of Multi WAN\"\nmsgstr \"خروجی DNS برای چند WAN\"\n\nmsgid \"Node Export Of Multi WAN\"\nmsgstr \"خروجی گره برای چند WAN\"\n\nmsgid \"Only support Multi Wan.\"\nmsgstr \"فقط از چند WAN پشتیبانی می‌کند.\"\n\nmsgid \"Not Specify\"\nmsgstr \"نامشخص\"\n\nmsgid \"custom\"\nmsgstr \"سفارشی\"\n\nmsgid \"If not available, try clearing the cache.\"\nmsgstr \"در صورت عدم دسترسی، پاک کردن کش را امتحان کنید.\"\n\nmsgid \"Operation\"\nmsgstr \"عملیات\"\n\nmsgid \"Add Node\"\nmsgstr \"افزودن گره\"\n\nmsgid \"Add the node via the link\"\nmsgstr \"افزودن گره از طریق لینک\"\n\nmsgid \"Enter share links, one per line. Subscription links are not supported!\"\nmsgstr \"لینک‌های اشتراک‌گذاری را وارد کنید، هر کدام در یک خط. لینک‌های اشتراک (Subscription) پشتیبانی نمی‌شوند!\"\n\nmsgid \"Please enter the correct link.\"\nmsgstr \"لطفاً لینک صحیح را وارد کنید.\"\n\nmsgid \"Clear all nodes\"\nmsgstr \"پاک کردن همه گره‌ها\"\n\nmsgid \"Are you sure to clear all nodes?\"\nmsgstr \"آیا از پاک کردن همه گره‌ها اطمینان دارید؟\"\n\nmsgid \"Success\"\nmsgstr \"موفقیت\"\n\nmsgid \"Error\"\nmsgstr \"خطا\"\n\nmsgid \"Delete select nodes\"\nmsgstr \"حذف گره‌های انتخاب شده\"\n\nmsgid \"To Top\"\nmsgstr \"به بالا\"\n\nmsgid \"Select\"\nmsgstr \"انتخاب\"\n\nmsgid \"Selected:\"\nmsgstr \"انتخاب شده:\"\n\nmsgid \"DeSelect\"\nmsgstr \"لغو انتخاب\"\n\nmsgid \"Select all\"\nmsgstr \"انتخاب همه\"\n\nmsgid \"DeSelect all\"\nmsgstr \"لغو انتخاب همه\"\n\nmsgid \"Are you sure to delete select nodes?\"\nmsgstr \"آیا از حذف گره‌های انتخاب شده اطمینان دارید؟\"\n\nmsgid \"You no select nodes !\"\nmsgstr \"شما هیچ گره‌ای انتخاب نکرده‌اید!\"\n\nmsgid \"Are you sure set to\"\nmsgstr \"آیا مطمئن هستید که تنظیم شود به\"\n\nmsgid \"the server?\"\nmsgstr \"سرور؟\"\n\nmsgid \"You choose node is:\"\nmsgstr \"گره انتخابی شما عبارتست از:\"\n\nmsgid \"Timeout\"\nmsgstr \"مهلت زمانی\"\n\nmsgid \"Node Remarks\"\nmsgstr \"توضیحات گره\"\n\nmsgid \"Add Mode\"\nmsgstr \"حالت افزودن\"\n\nmsgid \"Save Order\"\nmsgstr \"ذخیره ترتیب\"\n\nmsgid \"Saved current page order successfully.\"\nmsgstr \"ترتیب صفحه جاری با موفقیت ذخیره شد.\"\n\nmsgid \"Drag to reorder\"\nmsgstr \"برای تغییر ترتیب بکشید\"\n\nmsgid \"Type\"\nmsgstr \"نوع\"\n\nmsgid \"_balancing\"\nmsgstr \"_توزیع بار\"\n\nmsgid \"_shunt\"\nmsgstr \"_شنت (Shunt)\"\n\nmsgid \"Balancing\"\nmsgstr \"توزیع بار\"\n\nmsgid \"Node Addition Method\"\nmsgstr \"روش افزودن گره\"\n\nmsgid \"Manual\"\nmsgstr \"دستی\"\n\nmsgid \"Batch\"\nmsgstr \"دسته‌ای\"\n\nmsgid \"Select Group\"\nmsgstr \"انتخاب گروه\"\n\nmsgid \"Node Matching Rules\"\nmsgstr \"قوانین تطبیق گره\"\n\nmsgid \"\"\n\"Example: <code>^A && B && !C && D$</code><br>\"\n\"This means the node remark must start with A (^), include B, exclude C (!), and end with D ($).<br>\"\n\"Conditions are joined by <code>&&</code>, and their order does not affect the result.\"\nmsgstr \"\"\n\"مثال: <code>^A && B && !C && D$</code><br>\"\n\"این بدان معناست که توضیحات گره باید با A شروع شود (^)، شامل B باشد، فاقد C باشد (!)، و با D پایان یابد ($).<br>\"\n\"شرط‌ها با <code>&&</code> به هم متصل می‌شوند و ترتیب آنها تاثیری در نتیجه ندارد.\"\n\n\nmsgid \"Balancing Strategy\"\nmsgstr \"استراتژی توزیع بار\"\n\nmsgid \"Fallback Node\"\nmsgstr \"گره پشتیبان\"\n\nmsgid \"Use Custom Probe URL\"\nmsgstr \"استفاده از URL پروب سفارشی\"\n\nmsgid \"By default the built-in probe URL will be used, enable this option to use a custom probe URL.\"\nmsgstr \"به‌صورت پیش‌فرض از URL پروب داخلی استفاده می‌شود، برای استفاده از URL سفارشی این گزینه را فعال کنید.\"\n\nmsgid \"Probe URL\"\nmsgstr \"URL پروب\"\n\nmsgid \"The URL used to detect the connection status.\"\nmsgstr \"آدرس URL مورد استفاده برای تشخیص وضعیت اتصال.\"\n\nmsgid \"Probe Interval\"\nmsgstr \"فاصله زمانی پروب\"\n\nmsgid \"The interval between initiating probes.\"\nmsgstr \"فاصله زمانی بین شروع پروب‌ها.\"\n\nmsgid \"The time format is numbers + units, such as '10s', '2h45m', and the supported time units are <code>s</code>, <code>m</code>, <code>h</code>, which correspond to seconds, minutes, and hours, respectively.\"\nmsgstr \"فرمت زمان عدد + واحد است، مانند '10s'، '2h45m'، و واحدهای زمانی پشتیبانی شده <code>s</code>، <code>m</code>، <code>h</code> هستند که به ترتیب ثانیه، دقیقه و ساعت می‌باشند.\"\n\nmsgid \"When the unit is not filled in, it defaults to seconds.\"\nmsgstr \"زمانی که واحد پر نشده باشد، پیش‌فرض ثانیه است.\"\n\nmsgid \"Preferred Node Count\"\nmsgstr \"تعداد گره‌های ترجیحی\"\n\nmsgid \"The load balancer selects the optimal number of nodes, and traffic is randomly distributed among them.\"\nmsgstr \"توزیع‌کننده بار تعداد بهینه‌ای از گره‌ها را انتخاب می‌کند و ترافیک به طور تصادفی بین آن‌ها توزیع می‌شود.\"\n\nmsgid \"Shunt\"\nmsgstr \"شنت (Shunt)\"\n\nmsgid \"Preproxy\"\nmsgstr \"پیش‌پروکسی\"\n\nmsgid \"Preproxy Node\"\nmsgstr \"گره پیش‌پروکسی\"\n\nmsgid \"Set the node to be used as a pre-proxy.\"\nmsgstr \"گره را طوری تنظیم کنید که به عنوان پیش پروکسی استفاده شود.\"\n\nmsgid \"Each rule has a separate switch that controls whether this rule uses the pre-proxy or not.\"\nmsgstr \"هر قانون یک سوئیچ جداگانه دارد که کنترل می‌کند آیا این قانون از پیش-پروکسی استفاده می‌کند یا خیر.\"\n\nmsgid \"Close (Not use)\"\nmsgstr \"بستن (عدم استفاده)\"\n\nmsgid \"Use default node\"\nmsgstr \"استفاده از گره پیش‌فرض\"\n\nmsgid \"Direct Connection\"\nmsgstr \"اتصال مستقیم\"\n\nmsgid \"Blackhole (Block)\"\nmsgstr \"سیاه‌چاله (مسدودسازی)\"\n\nmsgid \"There are no available nodes, please add or subscribe nodes first.\"\nmsgstr \"هیچ گره در دسترس نیست، لطفاً ابتدا گره‌ها را اضافه یا مشترک شوید.\"\n\nmsgid \"No shunt rules? Click me to go to add.\"\nmsgstr \"قانون شنتی وجود ندارد؟ برای افزودن اینجا کلیک کنید.\"\n\nmsgid \"When using, localhost will connect this node first and then use this node to connect the default node.\"\nmsgstr \"در صورت استفاده، میزبان محلی ابتدا به این گره متصل شده و سپس از این گره برای اتصال به گره پیش‌فرض استفاده می‌کند.\"\n\nmsgid \"Domain Strategy\"\nmsgstr \"استراتژی دامنه\"\n\nmsgid \"Domain matcher\"\nmsgstr \"تتطبیق‌دهنده دامنه\"\n\nmsgid \"'AsIs': Only use domain for routing. Default value.\"\nmsgstr \"'AsIs': فقط استفاده از دامنه برای مسیریابی. مقدار پیش‌فرض.\"\n\nmsgid \"'IPIfNonMatch': When no rule matches current domain, resolves it into IP addresses (A or AAAA records) and try all rules again.\"\nmsgstr \"\"\n\"'IPIfNonMatch': زمانی که هیچ قانونی با دامنه فعلی مطابقت ندارد، آن را به آدرس‌های IP \"\n\"(رکوردهای A یا AAAA) حل می‌کند و تمام قوانین را دوباره امتحان می‌کند.\"\n\nmsgid \"'IPOnDemand': As long as there is a IP-based rule, resolves the domain into IP immediately.\"\nmsgstr \"\"\n\"'IPOnDemand': تا زمانی که یک قانون مبتنی بر IP وجود داشته باشد، بلافاصله دامنه را به \"\n\"IP حل می‌کند.\"\n\nmsgid \"Load balancing node list\"\nmsgstr \"لیست گره‌های توزیع بار\"\n\nmsgid \"Load balancing node list, <a target='_blank' href='https://xtls.github.io/config/routing.html#balancerobject'>document</a>\"\nmsgstr \"لیست گره‌های توزیع بار، <a target='_blank' href='https://xtls.github.io/config/routing.html#balancerobject'>مستندات</a>\"\n\nmsgid \"From Share URL\"\nmsgstr \"از لینک اشتراک‌گذاری\"\n\nmsgid \"Build Share URL\"\nmsgstr \"ساخت لینک اشتراک‌گذاری\"\n\nmsgid \"Generate QRCode\"\nmsgstr \"تولید کد QR\"\n\nmsgid \"Export Config File\"\nmsgstr \"خروجی فایل پیکربندی\"\n\nmsgid \"Import Finished\"\nmsgstr \"وارد کردن پایان یافت\"\n\nmsgid \"Not a supported scheme:\"\nmsgstr \"طرح پشتیبانی نشده:\"\n\nmsgid \"Invalid Share URL Format\"\nmsgstr \"فرمت لینک اشتراک‌گذاری نامعتبر\"\n\nmsgid \"Paste Share URL Here\"\nmsgstr \"لینک اشتراک‌گذاری را اینجا جایگذاری کنید\"\n\nmsgid \"Share URL to clipboard unable.\"\nmsgstr \"کپی لینک اشتراک‌گذاری در کلیپ‌بورد ناموفق بود.\"\n\nmsgid \"Share URL to clipboard successfully.\"\nmsgstr \"لینک اشتراک‌گذاری با موفقیت در کلیپ‌بورد کپی شد.\"\n\nmsgid \"Faltal on get option, please help in debug:\"\nmsgstr \"خطای مهلک در دریافت گزینه، لطفاً در اشکال‌زدایی کمک کنید:\"\n\nmsgid \"Faltal on set option, please help in debug:\"\nmsgstr \"خطای مهلک در تنظیم گزینه، لطفاً در اشکال‌زدایی کمک کنید:\"\n\nmsgid \"Address\"\nmsgstr \"آدرس\"\n\nmsgid \"Address (Support Domain Name)\"\nmsgstr \"آدرس (پشتیبانی از نام دامنه)\"\n\nmsgid \"Trojan Verify Cert\"\nmsgstr \"تایید گواهی Trojan\"\n\nmsgid \"Trojan Cert Path\"\nmsgstr \"مسیر گواهی Trojan\"\n\nmsgid \"Finger Print\"\nmsgstr \"اثر انگشت (Fingerprint)\"\n\nmsgid \"Avoid using randomized, unless you have to.\"\nmsgstr \"از استفاده از تصادفی خودداری کنید، مگر اینکه مجبور باشید.\"\n\nmsgid \"Original\"\nmsgstr \"اصلی\"\n\nmsgid \"Transport Plugin\"\nmsgstr \"افزونه انتقال\"\n\nmsgid \"Shadowsocks secondary encryption\"\nmsgstr \"رمزنگاری ثانویه Shadowsocks\"\n\nmsgid \"Obfs Type\"\nmsgstr \"نوع مبهم‌سازی (Obfs)\"\n\nmsgid \"Obfs Password\"\nmsgstr \"رمز عبور مبهم‌سازی\"\n\nmsgid \"Auth Type\"\nmsgstr \"نوع احراز هویت\"\n\nmsgid \"Auth Password\"\nmsgstr \"رمز عبور احراز هویت\"\n\nmsgid \"Client BBR Flow Control\"\nmsgstr \"کنترل BBR مشتری\"\n\nmsgid \"Commands the client to use the BBR flow control algorithm\"\nmsgstr \"به کلاینت دستور می‌دهد تا از الگوریتم کنترل جریان BBR استفاده کند\"\n\nmsgid \"PinSHA256\"\nmsgstr \"PinSHA256\"\n\nmsgid \"Certificate fingerprint\"\nmsgstr \"اثر انگشت گواهی\"\n\nmsgid \"Max upload Mbps\"\nmsgstr \"حداکثر آپلود (Mbps)\"\n\nmsgid \"Max download Mbps\"\nmsgstr \"حداکثر دانلود (Mbps)\"\n\nmsgid \"QUIC stream receive window\"\nmsgstr \"پنجره دریافت جریان QUIC\"\n\nmsgid \"QUIC connection receive window\"\nmsgstr \"پنجره دریافت اتصال QUIC\"\n\nmsgid \"QUIC concurrent bidirectional streams\"\nmsgstr \"جریان‌های دوطرفه همزمان QUIC\"\n\nmsgid \"QUIC KeepAlive interval\"\nmsgstr \"فاصله QUIC KeepAlive\"\n\nmsgid \"Disable MTU detection\"\nmsgstr \"غیرفعال کردن تشخیص MTU\"\n\nmsgid \"ignoreClientBandwidth\"\nmsgstr \"نادیده گرفتن پهنای باند کلاینت\"\n\nmsgid \"Lazy Start\"\nmsgstr \"شروع تنبل (Lazy Start)\"\n\nmsgid \"Encrypt Method\"\nmsgstr \"روش رمزنگاری\"\n\nmsgid \"Encrypt Key\"\nmsgstr \"کلید رمزنگاری\"\n\nmsgid \"Latency\"\nmsgstr \"تاخیر\"\n\nmsgid \"Automatic detection delay\"\nmsgstr \"تاخیر تشخیص خودکار\"\n\nmsgid \"Show server address and port\"\nmsgstr \"نمایش آدرس و پورت سرور\"\n\nmsgid \"URL Test Address\"\nmsgstr \"آدرس تست URL\"\n\nmsgid \"URL Test\"\nmsgstr \"تست URL\"\n\nmsgid \"Test\"\nmsgstr \"تست\"\n\nmsgid \"Node num\"\nmsgstr \"شماره گره\"\n\nmsgid \"Self add\"\nmsgstr \"افزودن خودکار\"\n\nmsgid \"Apply\"\nmsgstr \"اعمال\"\n\nmsgid \"Use\"\nmsgstr \"استفاده\"\n\nmsgid \"Copy\"\nmsgstr \"کپی\"\n\nmsgid \"Delay Settings\"\nmsgstr \"تنظیمات تاخیر\"\n\nmsgid \"Open and close Daemon\"\nmsgstr \"باز و بسته کردن دیمن (Daemon)\"\n\nmsgid \"Delay Start\"\nmsgstr \"شروع با تاخیر\"\n\nmsgid \"Units:seconds\"\nmsgstr \"واحد: ثانیه\"\n\nmsgid \"Units:minutes\"\nmsgstr \"واحد: دقیقه\"\n\nmsgid \"stop automatically mode\"\nmsgstr \"حالت توقف خودکار\"\n\nmsgid \"stop Time(Every day)\"\nmsgstr \"زمان توقف (هر روز)\"\n\nmsgid \"stop Interval(Hour)\"\nmsgstr \"بازه توقف (ساعت)\"\n\nmsgid \"start automatically mode\"\nmsgstr \"حالت شروع خودکار\"\n\nmsgid \"start Time(Every day)\"\nmsgstr \"زمان شروع (هر روز)\"\n\nmsgid \"start Interval(Hour)\"\nmsgstr \"بازه شروع (ساعت)\"\n\nmsgid \"restart automatically mode\"\nmsgstr \"حالت راه‌اندازی مجدد خودکار\"\n\nmsgid \"restart Time(Every day)\"\nmsgstr \"زمان راه‌اندازی مجدد (هر روز)\"\n\nmsgid \"restart Interval(Hour)\"\nmsgstr \"بازه راه‌اندازی مجدد (ساعت)\"\n\nmsgid \"Forwarding Settings\"\nmsgstr \"تنظیمات فورواردینگ\"\n\nmsgid \"TCP No Redir Ports\"\nmsgstr \"پورت‌های بدون تغییر مسیر TCP\"\n\nmsgid \"UDP No Redir Ports\"\nmsgstr \"پورت‌های بدون تغییر مسیر UDP\"\n\nmsgid \"Fill in the ports you don't want to be forwarded by the agent, with the highest priority.\"\nmsgstr \"پورت‌هایی را که نمی‌خواهید توسط نماینده فوروارد شوند، با بالاترین اولویت وارد کنید.\"\n\nmsgid \"If you don't want to let the device in the list to go proxy, please choose all.\"\nmsgstr \"اگر نمی‌خواهید دستگاه موجود در لیست پروکسی شود، لطفاً همه را انتخاب کنید.\"\n\nmsgid \"The port settings support single ports and ranges.<br>Separate multiple ports with commas (,).<br>Example: 21,80,443,1000:2000.\"\nmsgstr \"تنظیمات پورت از پورت‌های تکی و بازه‌ها پشتیبانی می‌کند.<br>پورت‌های متعدد را با کاما (,) جدا کنید.<br>مثال: 21,80,443,1000:2000.\"\n\nmsgid \"TCP Proxy Drop Ports\"\nmsgstr \"پورت‌های حذف پروکسی TCP\"\n\nmsgid \"UDP Proxy Drop Ports\"\nmsgstr \"پورت‌های حذف پروکسی UDP\"\n\nmsgid \"TCP Redir Ports\"\nmsgstr \"پورت‌های تغییر مسیر TCP\"\n\nmsgid \"UDP Redir Ports\"\nmsgstr \"پورت‌های تغییر مسیر UDP\"\n\nmsgid \"No patterns are used\"\nmsgstr \"هیچ الگویی استفاده نشده است\"\n\nmsgid \"All\"\nmsgstr \"همه\"\n\nmsgid \"Common Use\"\nmsgstr \"استفاده متداول\"\n\nmsgid \"Only Web\"\nmsgstr \"فقط وب\"\n\nmsgid \"or more\"\nmsgstr \"یا بیشتر\"\n\nmsgid \"or less\"\nmsgstr \"یا کمتر\"\n\nmsgid \"Default\"\nmsgstr \"پیش‌فرض\"\n\nmsgid \"Close\"\nmsgstr \"بستن\"\n\nmsgid \"Hijacking ICMP (PING)\"\nmsgstr \"ربودن ICMP (PING)\"\n\nmsgid \"Hijacking ICMPv6 (IPv6 PING)\"\nmsgstr \"ربودن ICMPv6 (IPv6 PING)\"\n\nmsgid \"Force Proxy LAN IP\"\nmsgstr \"IP پروکسی LAN را مجبور کنید\"\n\nmsgid \"By default, commonly used internal network IP ranges will be connect directly (not entering the core). If you want a certain network range to go through a proxy, please add it here.\"\nmsgstr \"به طور پیش‌فرض، محدوده‌های IP شبکه داخلی که معمولاً استفاده می‌شوند، مستقیماً متصل می‌شوند (و وارد هسته نمی‌شوند). اگر می‌خواهید محدوده شبکه خاصی از طریق پروکسی عبور کند، لطفاً آن را اینجا اضافه کنید.\"\n\nmsgid \"Sniffing\"\nmsgstr \"شنود (Sniffing)\"\n\nmsgid \"TCP Proxy Way\"\nmsgstr \"روش پروکسی TCP\"\n\nmsgid \"Auto Switch\"\nmsgstr \"سوئیچ خودکار\"\n\nmsgid \"When there is no server, an automatic reconnect scheme is used\"\nmsgstr \"زمانی که هیچ سروری وجود ندارد، از طرح اتصال مجدد خودکار استفاده می‌شود\"\n\nmsgid \"How often to test\"\nmsgstr \"هر چند وقت یکبار تست شود\"\n\nmsgid \"Timeout seconds\"\nmsgstr \"ثانیه‌های مهلت زمانی\"\n\nmsgid \"Timeout retry num\"\nmsgstr \"تعداد تلاش مجدد مهلت زمانی\"\n\nmsgid \"Automatic switching cannot be used when this option is checked\"\nmsgstr \"زمانی که این گزینه تیک خورده باشد، نمی‌توان از سوئیچینگ خودکار استفاده کرد\"\n\nmsgid \"Main node\"\nmsgstr \"گره اصلی\"\n\nmsgid \"List of backup nodes\"\nmsgstr \"لیست گره‌های پشتیبان\"\n\nmsgid \"Restore Switch\"\nmsgstr \"سوئیچ بازگردانی\"\n\nmsgid \"When detects main node is available, switch back to the main node.\"\nmsgstr \"زمانی که در دسترس بودن گره اصلی تشخیص داده شود، به گره اصلی بازگردانده می‌شود.\"\n\nmsgid \"Add nodes to the standby node list by keywords\"\nmsgstr \"افزودن گره‌ها به لیست گره‌های آماده‌به‌کار با استفاده از کلمات کلیدی\"\n\nmsgid \"Delete nodes in the standby node list by keywords\"\nmsgstr \"حذف گره‌ها در لیست گره‌های آماده‌به‌کار با استفاده از کلمات کلیدی\"\n\nmsgid \"Please enter the node keyword, pay attention to distinguish between spaces, uppercase and lowercase.\"\nmsgstr \"لطفاً کلمه کلیدی گره را وارد کنید، به تمایز بین فاصله، حروف بزرگ و کوچک توجه کنید.\"\n\nmsgid \"Enable Load Balancing\"\nmsgstr \"فعال‌سازی توزیع بار\"\n\nmsgid \"Console Login Auth\"\nmsgstr \"احراز هویت ورود به کنسول\"\n\nmsgid \"Console Username\"\nmsgstr \"نام کاربری کنسول\"\n\nmsgid \"Console Password\"\nmsgstr \"رمز عبور کنسول\"\n\nmsgid \"Console Port\"\nmsgstr \"پورت کنسول\"\n\nmsgid \"In the browser input routing IP plus port access, such as:192.168.1.1:1188\"\nmsgstr \"در مرورگر IP مسیریابی به همراه پورت را وارد کنید، مانند: 192.168.1.1:1188\"\n\nmsgid \"Haproxy Port\"\nmsgstr \"پورت Haproxy\"\n\nmsgid \"Health Check Type\"\nmsgstr \"نوع بررسی سلامت\"\n\nmsgid \"Inner implement\"\nmsgstr \"پیاده‌سازی داخلی\"\n\nmsgid \"Health Check Inter\"\nmsgstr \"بازه بررسی سلامت\"\n\nmsgid \"When the URL test is used, the load balancing node will be converted into a Socks node. when node list set customizing, must be a Socks node, otherwise the health check will be invalid.\"\nmsgstr \"زمانی که تست URL استفاده می‌شود، گره توزیع بار به یک گره Socks تبدیل می‌شود. زمانی که لیست گره‌ها به صورت سفارشی تنظیم شده باشد، باید یک گره Socks باشد، در غیر این صورت بررسی سلامت نامعتبر خواهد بود.\"\n\nmsgid \"Add a node, Export Of Multi WAN Only support Multi Wan. Load specific gravity range 1-256. Multiple primary servers can be load balanced, standby will only be enabled when the primary server is offline! Multiple groups can be set, Haproxy port same one for each group.\"\nmsgstr \"افزودن گره، خروجی چند WAN تنها از چند WAN پشتیبانی می‌کند. محدوده وزن خاص بار 1-256. چندین سرور اصلی می‌توانند توزیع بار شوند، حالت آماده‌به‌کار تنها زمانی فعال می‌شود که سرور اصلی آفلاین باشد! چندین گروه قابل تنظیم است، پورت Haproxy برای هر گروه یکسان است.\"\n\nmsgid \"Note that the node configuration parameters for load balancing must be consistent when use TCP health check type, otherwise it cannot be used normally!\"\nmsgstr \"توجه داشته باشید که پارامترهای پیکربندی گره برای توزیع بار باید در صورت استفاده از نوع بررسی سلامت TCP یکسان باشند، در غیر این صورت نمی‌توان از آن به درستی استفاده کرد!\"\n\nmsgid \"Node Address\"\nmsgstr \"آدرس گره\"\n\nmsgid \"Node address cannot be empty.\"\nmsgstr \"آدرس گره نمی‌تواند خالی باشد.\"\n\nmsgid \"Node Port\"\nmsgstr \"پورت گره\"\n\nmsgid \"Node Weight\"\nmsgstr \"وزن گره\"\n\nmsgid \"Export Of Multi WAN\"\nmsgstr \"خروجی چند WAN\"\n\nmsgid \"Main\"\nmsgstr \"اصلی\"\n\nmsgid \"Mode\"\nmsgstr \"حالت\"\n\nmsgid \"Primary\"\nmsgstr \"اولیه\"\n\nmsgid \"Standby\"\nmsgstr \"آماده‌به‌کار\"\n\nmsgid \"Check update\"\nmsgstr \"بررسی به‌روزرسانی\"\n\nmsgid \"Force update\"\nmsgstr \"به‌روزرسانی اجباری\"\n\nmsgid \"The latest version: %s, currently does not support automatic update, if you need to update, please compile or download the ipk and then manually install.\"\nmsgstr \"آخرین نسخه: %s، در حال حاضر از به‌روزرسانی خودکار پشتیبانی نمی‌کند، اگر نیاز به به‌روزرسانی دارید، لطفاً کامپایل کنید یا فایل ipk را دانلود و سپس دستی نصب کنید.\"\n\nmsgid \"Enable custom URL\"\nmsgstr \"فعال‌سازی URL سفارشی\"\n\nmsgid \"Rule status\"\nmsgstr \"وضعیت رول\"\n\nmsgid \"Manually update\"\nmsgstr \"به‌روزرسانی دستی\"\n\nmsgid \"Rollback\"\nmsgstr \"بازگردانی\"\n\nmsgid \"Rollbacking...\"\nmsgstr \"در حال بازگردانی...\"\n\nmsgid \"Enable auto update rules\"\nmsgstr \"فعال‌سازی به‌روزرسانی خودکار قوانین\"\n\nmsgid \"Update Time(every day)\"\nmsgstr \"زمان به‌روزرسانی (هر روز)\"\n\nmsgid \"Update Interval(hour)\"\nmsgstr \"بازه به‌روزرسانی (ساعت)\"\n\nmsgid \"Update Mode\"\nmsgstr \"حالت به‌روزرسانی\"\n\nmsgid \"Loop Mode\"\nmsgstr \"حالت حلقه\"\n\nmsgid \"Every day\"\nmsgstr \"هر روز\"\n\nmsgid \"Every Monday\"\nmsgstr \"هر دوشنبه\"\n\nmsgid \"Every Tuesday\"\nmsgstr \"هر سه‌شنبه\"\n\nmsgid \"Every Wednesday\"\nmsgstr \"هر چهارشنبه\"\n\nmsgid \"Every Thursday\"\nmsgstr \"هر پنج‌شنبه\"\n\nmsgid \"Every Friday\"\nmsgstr \"هر جمعه\"\n\nmsgid \"Every Saturday\"\nmsgstr \"هر شنبه\"\n\nmsgid \"Every Sunday\"\nmsgstr \"هر یکشنبه\"\n\nmsgid \"hour\"\nmsgstr \"ساعت\"\n\nmsgid \"Hour\"\nmsgstr \"ساعت\"\n\nmsgid \"GeoIP Update URL\"\nmsgstr \"URL به‌روزرسانی GeoIP\"\n\nmsgid \"Geosite Update URL\"\nmsgstr \"URL به‌روزرسانی Geosite\"\n\nmsgid \"Location of Geo rule files\"\nmsgstr \"مکان فایل‌های قوانین Geo\"\n\nmsgid \"This variable specifies a directory where geoip.dat and geosite.dat files are.\"\nmsgstr \"این متغیر دایرکتوری محل قرارگیری فایل‌های geoip.dat و geosite.dat را مشخص می‌کند.\"\n\nmsgid \"Enable GeoIP Data Parsing\"\nmsgstr \"فعال‌سازی تجزیه داده‌های GeoIP\"\n\nmsgid \"Analyzes and preloads GeoIP data to enhance the shunt performance.\"\nmsgstr \"داده‌های GeoIP را برای بهبود عملکرد شنت تجزیه و پیش‌بارگذاری می‌کند.\"\n\nmsgid \"Note: Increases resource usage.\"\nmsgstr \"توجه: مصرف منابع را افزایش می‌دهد.\"\n\nmsgid \"Shunt Rule\"\nmsgstr \"قانون شنت\"\n\nmsgid \"Please note attention to the priority, the higher the order, the higher the priority.\"\nmsgstr \"لطفاً به اولویت توجه کنید، هرچه ترتیب بالاتر باشد، اولویت بیشتر است.\"\n\nmsgid \"Update...\"\nmsgstr \"به‌روزرسانی...\"\n\nmsgid \"It is the latest version\"\nmsgstr \"این آخرین نسخه است\"\n\nmsgid \"Update successful\"\nmsgstr \"به‌روزرسانی موفقیت‌آمیز بود\"\n\nmsgid \"Click to update\"\nmsgstr \"برای به‌روزرسانی کلیک کنید\"\n\nmsgid \"Updating...\"\nmsgstr \"در حال به‌روزرسانی...\"\n\nmsgid \"Retry\"\nmsgstr \"تلاش مجدد\"\n\nmsgid \"Unexpected error\"\nmsgstr \"خطای غیرمنتظره\"\n\nmsgid \"Updating, are you sure to close?\"\nmsgstr \"در حال به‌روزرسانی، آیا مطمئن هستید که ببندید؟\"\n\nmsgid \"Downloading...\"\nmsgstr \"در حال دانلود...\"\n\nmsgid \"Unpacking...\"\nmsgstr \"در حال استخراج...\"\n\nmsgid \"Moving...\"\nmsgstr \"در حال انتقال...\"\n\nmsgid \"App Update\"\nmsgstr \"به‌روزرسانی برنامه\"\n\nmsgid \"Please confirm that your firmware supports FPU.\"\nmsgstr \"لطفاً تأیید کنید که سیستم‌عامل شما از FPU پشتیبانی می‌کند.\"\n\nmsgid \"if you want to run from memory, change the path, /tmp beginning then save the application and update it manually.\"\nmsgstr \"اگر می‌خواهید از حافظه اجرا کنید، مسیر را تغییر دهید، با /tmp شروع شود سپس برنامه را ذخیره و دستی به‌روزرسانی کنید.\"\n\nmsgid \"Make sure there is enough space to install %s\"\nmsgstr \"مطمئن شوید که فضای کافی برای نصب %s وجود دارد\"\n\nmsgid \"App Path\"\nmsgstr \"مسیر برنامه\"\n\nmsgid \"%s App Path\"\nmsgstr \"مسیر برنامه %s\"\n\nmsgid \"%s Client App Path\"\nmsgstr \"مسیر برنامه کلاینت %s\"\n\nmsgid \"Node Subscribe\"\nmsgstr \"اشتراک گره\"\n\nmsgid \"Subscribe Remark\"\nmsgstr \"توضیحات اشتراک\"\n\nmsgid \"Subscribe Info\"\nmsgstr \"اطلاعات اشتراک\"\n\nmsgid \"Subscribe URL\"\nmsgstr \"URL اشتراک\"\n\nmsgid \"Subscribe URL Access Method\"\nmsgstr \"روش دسترسی به URL اشتراک\"\n\nmsgid \"When adding a new subscription, please save and apply before manually subscribing. If you only change the subscription URL, you can subscribe manually, and the system will save it automatically.\"\nmsgstr \"هنگام افزودن اشتراک جدید، لطفاً قبل از انجام اشتراک دستی، تنظیمات را ذخیره و اعمال (Save & Apply) کنید. اگر فقط URL اشتراک را تغییر داده‌اید، می‌توانید به صورت دستی مشترک شوید؛ سیستم آن را به طور خودکار ذخیره می‌کند.\"\n\nmsgid \"Please save and apply before manually subscribing.\"\nmsgstr \"لطفاً قبل از اشتراک دستی، ذخیره و اعمال کنید.\"\n\nmsgid \"Subscribe URL cannot be empty.\"\nmsgstr \"URL اشتراک نمی‌تواند خالی باشد.\"\n\nmsgid \"Subscribe via proxy\"\nmsgstr \"اشتراک از طریق پروکسی\"\n\nmsgid \"Update Once on Boot\"\nmsgstr \"یک بار در بوت به‌روزرسانی کنید\"\n\nmsgid \"Updates the subscription the first time runs automatically after each system boot.\"\nmsgstr \"اشتراک را برای اولین بار به طور خودکار پس از هر بار بوت سیستم به‌روزرسانی می‌کند.\"\n\nmsgid \"Enable auto update subscribe\"\nmsgstr \"فعال‌سازی به‌روزرسانی خودکار اشتراک\"\n\nmsgid \"Manual subscription\"\nmsgstr \"اشتراک دستی\"\n\nmsgid \"Delete All Subscribe Node\"\nmsgstr \"حذف همه گره‌های اشتراک\"\n\nmsgid \"Delete the subscribed node\"\nmsgstr \"حذف گره مشترک شده\"\n\nmsgid \"Are you sure you want to delete all subscribed nodes?\"\nmsgstr \"آیا مطمئن هستید که می‌خواهید همه گره‌های مشترک شده را حذف کنید؟\"\n\nmsgid \"Manual subscription All\"\nmsgstr \"اشتراک دستی همه\"\n\nmsgid \"This remark already exists, please change a new remark.\"\nmsgstr \"این توضیحات قبلاً وجود دارد، لطفاً توضیحات جدیدی را انتخاب کنید.\"\n\nmsgid \"Remark cannot be empty.\"\nmsgstr \"توضیحات نمی‌تواند خالی باشد.\"\n\nmsgid \"URL cannot be empty.\"\nmsgstr \"URL نمی‌تواند خالی باشد.\"\n\nmsgid \"Filter keyword Mode\"\nmsgstr \"حالت فیلتر کلمه کلیدی\"\n\nmsgid \"Discard List\"\nmsgstr \"لیست حذف\"\n\nmsgid \"Keep List\"\nmsgstr \"لیست نگهداری\"\n\nmsgid \"Discard List,But Keep List First\"\nmsgstr \"لیست حذف، اما ابتدا لیست نگهداری\"\n\nmsgid \"Keep List,But Discard List First\"\nmsgstr \"لیست نگهداری، اما ابتدا لیست حذف\"\n\nmsgid \"Use global config\"\nmsgstr \"استفاده از پیکربندی سراسری\"\n\nmsgid \"User-Agent\"\nmsgstr \"User-Agent\"\n\nmsgid \"Add\"\nmsgstr \"افزودن\"\n\nmsgid \"ACLs\"\nmsgstr \"ACLها\"\n\nmsgid \"ACLs is a tools which used to designate specific IP proxy mode.\"\nmsgstr \"ACL ابزاری است که برای تعیین حالت پروکسی IP خاص استفاده می‌شود.\"\n\nmsgid \"Example:\"\nmsgstr \"مثال:\"\n\nmsgid \"IP range\"\nmsgstr \"محدوده IP\"\n\nmsgid \"Source Interface\"\nmsgstr \"رابط منبع\"\n\nmsgid \"Bridge\"\nmsgstr \"پل شبکه\"\n\nmsgid \"Wireless Adapter\"\nmsgstr \"آداپتور بی‌سیم\"\n\nmsgid \"Ethernet Adapter\"\nmsgstr \"آداپتور اترنت\"\n\nmsgid \"Tunnel Interface\"\nmsgstr \"رابط تونل\"\n\nmsgid \"Invalid interface name\"\nmsgstr \"نام رابط نامعتبر\"\n\nmsgid \"Use Interface With ACLs\"\nmsgstr \"استفاده از رابط با ACLها\"\n\nmsgid \"Remarks\"\nmsgstr \"توضیحات\"\n\nmsgid \"Direct List\"\nmsgstr \"لیست مستقیم\"\n\nmsgid \"Proxy List\"\nmsgstr \"لیست پروکسی\"\n\nmsgid \"Block List\"\nmsgstr \"لیست مسدود\"\n\nmsgid \"Lan IP List\"\nmsgstr \"لیست IP شبکه داخلی\"\n\nmsgid \"Route Hosts\"\nmsgstr \"میزبان‌های مسیر\"\n\nmsgid \"Join the direct hosts list of domain names will not proxy.\"\nmsgstr \"نام دامنه‌هایی که به لیست میزبان‌های مستقیم اضافه شده‌اند، پروکسی نخواهند شد.\"\n\nmsgid \"These had been joined ip addresses will not proxy. Please input the ip address or ip address segment,every line can input only one ip address. For example: 192.168.0.0/24 or 223.5.5.5.\"\nmsgstr \"آدرس‌های IP وارد شده در این لیست از پروکسی عبور نخواهند کرد. لطفاً آدرس IP یا رنج CIDR را وارد کنید (هر خط یک مورد). مثال: 192.168.0.0/24 یا 223.5.5.5.\"\n\nmsgid \"These had been joined websites will use proxy. Please input the domain names of websites, every line can input only one website domain. For example: google.com.\"\nmsgstr \"وب‌سایت‌های وارد شده در این لیست از پروکسی استفاده خواهند کرد. لطفاً نام دامنه وب‌سایت‌ها را وارد کنید، هر خط فقط یک نام دامنه. برای مثال: google.com.\"\n\nmsgid \"These had been joined ip addresses will use proxy. Please input the ip address or ip address segment, every line can input only one ip address. For example: 35.24.0.0/24 or 8.8.4.4.\"\nmsgstr \"آدرس‌های IP اضافه شده از پروکسی استفاده خواهند کرد. لطفاً آدرس IP یا بخش آدرس IP را وارد کنید، هر خط فقط یک آدرس IP. برای مثال: 35.24.0.0/24 یا 8.8.4.4.\"\n\nmsgid \"These had been joined websites will be block. Please input the domain names of websites, every line can input only one website domain. For example: twitter.com.\"\nmsgstr \"وب‌سایت‌های وارد شده در این لیست مسدود خواهند شد. لطفاً نام دامنه وب‌سایت‌ها را وارد کنید، هر خط فقط یک نام دامنه. برای مثال: twitter.com.\"\n\nmsgid \"The list is the IPv4 LAN IP list, which represents the direct connection IP of the LAN. If you need the LAN IP in the proxy list, please clear it from the list. Do not modify this list by default.\"\nmsgstr \"این لیست، لیست IP شبکه داخلی IPv4 است که نشان‌دهنده IP اتصال مستقیم شبکه داخلی است. اگر به IP شبکه داخلی در لیست پروکسی نیاز دارید، لطفاً آن را از لیست پاک کنید. به طور پیش‌فرض این لیست را تغییر ندهید.\"\n\nmsgid \"The list is the IPv6 LAN IP list, which represents the direct connection IP of the LAN. If you need the LAN IP in the proxy list, please clear it from the list. Do not modify this list by default.\"\nmsgstr \"این لیست، لیست IP شبکه داخلی IPv6 است که نشان‌دهنده IP اتصال مستقیم شبکه داخلی است. اگر به IP شبکه داخلی در لیست پروکسی نیاز دارید، لطفاً آن را از لیست پاک کنید. به طور پیش‌فرض این لیست را تغییر ندهید.\"\n\nmsgid \"Configure routing etc/hosts file, if you don't know what you are doing, please don't change the content.\"\nmsgstr \"پیکربندی فایل etc/hosts مسیریابی، اگر نمی‌دانید چه کاری انجام می‌دهید، لطفاً محتوا را تغییر ندهید.\"\n\nmsgid \"These had been joined ip addresses will be block. Please input the ip address or ip address segment, every line can input only one ip address.\"\nmsgstr \"آدرس‌های IP وارد شده در این لیست مسدود خواهند شد. لطفاً آدرس IP یا بخش آدرس IP را وارد کنید، هر خط فقط یک آدرس IP.\"\n\nmsgid \"Inbound Tag\"\nmsgstr \"برچسب ورودی\"\n\nmsgid \"Transparent proxy\"\nmsgstr \"پروکسی شفاف\"\n\nmsgid \"Not valid domain name, please re-enter!\"\nmsgstr \"نام دامنه معتبر نیست، لطفاً دوباره وارد کنید!\"\n\nmsgid \"Not valid IP format, please re-enter!\"\nmsgstr \"فرمت IP معتبر نیست، لطفاً دوباره وارد کنید!\"\n\nmsgid \"Not valid IPv4 format, please re-enter!\"\nmsgstr \"فرمت IPv4 نامعتبر است، لطفاً دوباره وارد کنید!\"\n\nmsgid \"Not valid IPv6 format, please re-enter!\"\nmsgstr \"فرمت IPv6 نامعتبر است، لطفاً دوباره وارد کنید!\"\n\nmsgid \"Not true format, please re-enter!\"\nmsgstr \"فرمت صحیح نیست، لطفاً دوباره وارد کنید!\"\n\nmsgid \"Plaintext: If this string matches any part of the targeting domain, this rule takes effet. Example: rule 'sina.com' matches targeting domain 'sina.com', 'sina.com.cn' and 'www.sina.com', but not 'sina.cn'.\"\nmsgstr \"متن ساده (Plaintext): اگر این رشته با هر بخشی از دامنه هدف مطابقت داشته باشد، این قانون اعمال می‌شود. مثال: قانون 'sina.com' با دامنه هدف 'sina.com'، 'sina.com.cn' و 'www.sina.com' مطابقت دارد، اما با 'sina.cn' خیر.\"\n\nmsgid \"Regular expression: Begining with 'regexp:', the rest is a regular expression. When the regexp matches targeting domain, this rule takes effect. Example: rule 'regexp:\\\\.goo.*\\\\.com$' matches 'www.google.com' and 'fonts.googleapis.com', but not 'google.com'.\"\nmsgstr \"عبارت باقاعده (Regular expression): با 'regexp:' شروع می‌شود و بقیه یک عبارت باقاعده است. زمانی که عبارت باقاعده با دامنه هدف مطابقت داشته باشد، این قانون اعمال می‌شود. مثال: قانون 'regexp:\\\\.goo.*\\\\.com$' با 'www.google.com' و 'fonts.googleapis.com' مطابقت دارد، اما با 'google.com' خیر.\"\n\nmsgid \"Subdomain (recommended): Begining with 'domain:' and the rest is a domain. When the targeting domain is exactly the value, or is a subdomain of the value, this rule takes effect. Example: rule 'domain:v2ray.com' matches 'www.v2ray.com', 'v2ray.com', but not 'xv2ray.com'.\"\nmsgstr \"زیردامنه (توصیه شده): با 'domain:' شروع می‌شود و بقیه یک دامنه است. زمانی که دامنه هدف دقیقاً مقدار باشد، یا زیردامنه‌ای از مقدار باشد، این قانون اعمال می‌شود. مثال: قانون 'domain:v2ray.com' با 'www.v2ray.com' و 'v2ray.com' مطابقت دارد، اما با 'xv2ray.com' خیر.\"\n\nmsgid \"Full domain: Begining with 'full:' and the rest is a domain. When the targeting domain is exactly the value, the rule takes effect. Example: rule 'domain:v2ray.com' matches 'v2ray.com', but not 'www.v2ray.com'.\"\nmsgstr \"دامنه کامل: با 'full:' شروع می‌شود و بقیه یک دامنه است. زمانی که دامنه هدف دقیقاً مقدار باشد، قانون اعمال می‌شود. مثال: قانون 'domain:v2ray.com' با 'v2ray.com' مطابقت دارد، اما با 'www.v2ray.com' خیر.\"\n\nmsgid \"Sing-Box rule-set: Begining with 'rule-set:remote:' or 'rule-set:local:'\"\nmsgstr \"مجموعه قوانین Sing-Box: با 'rule-set:remote:' یا 'rule-set:local:' شروع می‌شود\"\n\nmsgid \"Such as:\"\nmsgstr \"مانند:\"\n\nmsgid \"Pre-defined domain list: Begining with 'geosite:' and the rest is a name, such as geosite:google or geosite:cn.\"\nmsgstr \"لیست دامنه از پیش تعریف شده: با 'geosite:' شروع می‌شود و بقیه یک نام است، مانند geosite:google یا geosite:cn.\"\n\nmsgid \"Annotation: Begining with #\"\nmsgstr \"توضیحات: با # شروع می‌شود\"\n\nmsgid \"Invert match result.\"\nmsgstr \"معکوس کردن نتیجه تطابق.\"\n\nmsgid \"Only support Sing-Box.\"\nmsgstr \"فقط پشتیبانی از Sing-Box.\"\n\nmsgid \"IP: such as '127.0.0.1'.\"\nmsgstr \"IP: مانند '127.0.0.1'.\"\n\nmsgid \"CIDR: such as '127.0.0.0/8'.\"\nmsgstr \"CIDR: مانند '127.0.0.0/8'.\"\n\nmsgid \"GeoIP: such as 'geoip:cn'. It begins with geoip: (lower case) and followed by two letter of country code.\"\nmsgstr \"GeoIP: مانند 'geoip:cn'. با geoip: (حروف کوچک) شروع می‌شود و با دو حرف کد کشور دنبال می‌شود.\"\n\nmsgid \"Clear logs\"\nmsgstr \"پاک کردن گزارش‌ها\"\n\nmsgid \"Password\"\nmsgstr \"رمز عبور\"\n\nmsgid \"IV Check\"\nmsgstr \"بررسی IV\"\n\nmsgid \"UDP over TCP\"\nmsgstr \"UDP بر روی TCP\"\n\nmsgid \"Connection Timeout\"\nmsgstr \"مهلت زمانی اتصال\"\n\nmsgid \"Local Port\"\nmsgstr \"پورت محلی\"\n\nmsgid \"Fast Open\"\nmsgstr \"بازگشایی سریع (Fast Open)\"\n\nmsgid \"Pre-connections\"\nmsgstr \"پیش‌اتصالات\"\n\nmsgid \"Number of early established connections to reduce latency.\"\nmsgstr \"تعداد اتصالات از پیش برقرار شده برای کاهش تاخیر.\"\n\nmsgid \"plugin\"\nmsgstr \"افزونه\"\n\nmsgid \"Supports custom SIP003 plugins, Make sure the plugin is installed.\"\nmsgstr \"پشتیبانی از افزونه‌های سفارشی SIP003، مطمئن شوید که افزونه نصب شده است.\"\n\nmsgid \"opts\"\nmsgstr \"گزینه‌ها (opts)\"\n\nmsgid \"Protocol\"\nmsgstr \"پروتکل\"\n\nmsgid \"Protocol_param\"\nmsgstr \"پارامتر پروتکل\"\n\nmsgid \"Obfs\"\nmsgstr \"مبهم‌سازی (Obfs)\"\n\nmsgid \"Obfs_param\"\nmsgstr \"پارامتر مبهم‌سازی\"\n\nmsgid \"Plugin Name\"\nmsgstr \"نام افزونه\"\n\nmsgid \"Plugin Arguments\"\nmsgstr \"آرگومان‌های افزونه\"\n\nmsgid \"User Level\"\nmsgstr \"سطح کاربر\"\n\nmsgid \"Transport\"\nmsgstr \"انتقال\"\n\nmsgid \"Public Key\"\nmsgstr \"کلید عمومی\"\n\nmsgid \"Private Key\"\nmsgstr \"کلید خصوصی\"\n\nmsgid \"Pre shared key\"\nmsgstr \"کلید از پیش به اشتراک گذاشته شده\"\n\nmsgid \"Local Address\"\nmsgstr \"آدرس محلی\"\n\nmsgid \"System interface\"\nmsgstr \"رابط سیستم\"\n\nmsgid \"System interface name\"\nmsgstr \"نام رابط سیستم\"\n\nmsgid \"Decimal numbers separated by \\\",\\\" or Base64-encoded strings.\"\nmsgstr \"اعداد دهدهی جدا شده با \\\",\\\" یا رشته‌های کدگذاری شده با Base64.\"\n\nmsgid \"Camouflage Domain\"\nmsgstr \"دامنه استتار\"\n\nmsgid \"Camouflage Type\"\nmsgstr \"نوع استتار\"\n\nmsgid \"Transport Layer Encryption\"\nmsgstr \"رمزنگاری لایه انتقال\"\n\nmsgid \"Whether or not transport layer encryption is enabled, \\\"none\\\" for unencrypted, \\\"tls\\\" for using TLS, \\\"xtls\\\" for using XTLS.\"\nmsgstr \"اینکه رمزنگاری لایه انتقال فعال باشد یا خیر، \\\"none\\\" برای بدون رمزنگاری، \\\"tls\\\" برای استفاده از TLS، \\\"xtls\\\" برای استفاده از XTLS.\"\n\nmsgid \"Original Trojan only supported 'tls', please choose 'tls'.\"\nmsgstr \"Trojan اصلی فقط از 'tls' پشتیبانی می‌کند، لطفاً 'tls' را انتخاب کنید.\"\n\nmsgid \"Transfer mode\"\nmsgstr \"حالت انتقال\"\n\nmsgid \"Do not send server name in ClientHello.\"\nmsgstr \"نام سرور را در ClientHello ارسال نکن.\"\n\nmsgid \"Domain\"\nmsgstr \"دامنه\"\n\nmsgid \"allowInsecure\"\nmsgstr \"اجازه ناامن (allowInsecure)\"\n\nmsgid \"Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.\"\nmsgstr \"آیا اتصالات ناامن مجاز هستند. در صورت تیک خوردن، اعتبارسنجی گواهی نادیده گرفته می‌شود.\"\n\nmsgid \"Used when the node link does not include this parameter.\"\nmsgstr \"زمانی استفاده می‌شود که لینک گره شامل این پارامتر نباشد.\"\n\nmsgid \"%s Node Use Type\"\nmsgstr \"نوع استفاده گره %s\"\n\nmsgid \"Set the TUIC proxy server ip address\"\nmsgstr \"تنظیم آدرس IP سرور پروکسی TUIC\"\n\nmsgid \"TUIC User Password For Connect Remote Server\"\nmsgstr \"رمز عبور کاربر TUIC برای اتصال به سرور راه دور\"\n\nmsgid \"TUIC UserName For Local Socks\"\nmsgstr \"نام کاربری TUIC برای Socks محلی\"\n\nmsgid \"TUIC Password For Local Socks\"\nmsgstr \"رمز عبور TUIC برای Socks محلی\"\n\nmsgid \"UDP relay mode\"\nmsgstr \"حالت بازپخش UDP\"\n\nmsgid \"Concurrent Tunnels\"\nmsgstr \"تونل‌های همزمان\"\n\nmsgid \"Congestion control algorithm\"\nmsgstr \"الگوریتم کنترل ازدحام\"\n\nmsgid \"Heartbeat interval(second)\"\nmsgstr \"بازه ضربان قلب (ثانیه)\"\n\nmsgid \"Timeout for establishing a connection to server(second)\"\nmsgstr \"مهلت زمانی برای برقراری اتصال به سرور (ثانیه)\"\n\nmsgid \"Garbage collection interval(second)\"\nmsgstr \"بازه جمع‌آوری زباله (ثانیه)\"\n\nmsgid \"Garbage collection lifetime(second)\"\nmsgstr \"طول عمر جمع‌آوری زباله (ثانیه)\"\n\nmsgid \"Disable SNI\"\nmsgstr \"غیرفعال کردن SNI\"\n\nmsgid \"Enable 0-RTT QUIC handshake\"\nmsgstr \"فعال‌سازی دست تکان دادن 0-RTT QUIC\"\n\nmsgid \"TUIC send window\"\nmsgstr \"پنجره ارسال TUIC\"\n\nmsgid \"TUIC receive window\"\nmsgstr \"پنجره دریافت TUIC\"\n\nmsgid \"TUIC Maximum packet size the socks5 server can receive from external, in bytes\"\nmsgstr \"حداکثر اندازه بسته TUIC که سرور socks5 می‌تواند از خارج دریافت کند، به بایت\"\n\nmsgid \"Set if the listening socket should be dual-stack\"\nmsgstr \"تنظیم کنید که سوکت شنونده دو پشته‌ای (dual-stack) باشد یا خیر\"\n\nmsgid \"<br />none: default, no masquerade, data sent is packets with no characteristics.<br />srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime).<br />utp: packets disguised as uTP will be recognized as bittorrent downloaded data.<br />wechat-video: packets disguised as WeChat video calls.<br />dtls: disguised as DTLS 1.2 packet.<br />wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)<br />dns: Disguising traffic as DNS requests.\"\nmsgstr \"<br />none: پیش‌فرض، بدون استتار، داده‌های ارسالی بسته‌های بدون مشخصه هستند.<br />srtp: مبدل شده به بسته SRTP، به عنوان داده تماس تصویری (مانند FaceTime) شناخته می‌شود.<br />utp: بسته‌های مبدل شده به uTP به عنوان داده دانلود شده bittorrent شناخته می‌شوند.<br />wechat-video: بسته‌های مبدل شده به تماس‌های تصویری WeChat.<br />dtls: مبدل شده به بسته DTLS 1.2.<br />wireguard: مبدل شده به بسته WireGuard. (نه واقعاً پروتکل WireGuard)<br />dns: پنهان کردن ترافیک به عنوان درخواست‌های DNS.\"\n\nmsgid \"Use it together with the DNS disguised type. You can fill in any domain.\"\nmsgstr \"از آن همراه با نوع استتار DNS استفاده کنید. می‌توانید هر دامنه‌ای را وارد کنید.\"\n\nmsgid \"Auth\"\nmsgstr \"احراز هویت\"\n\nmsgid \"Socks for authentication\"\nmsgstr \"Socks برای احراز هویت\"\n\nmsgid \"Socks protocol authentication, support anonymous and password.\"\nmsgstr \"احراز هویت پروتکل Socks، پشتیبانی از ناشناس و رمز عبور.\"\n\nmsgid \"anonymous\"\nmsgstr \"ناشناس\"\n\nmsgid \"User Password\"\nmsgstr \"رمز عبور کاربر\"\n\nmsgid \"Username and Password must be used together!\"\nmsgstr \"نام کاربری و رمز عبور باید با هم استفاده شوند!\"\n\nmsgid \"Prefer firewall tools\"\nmsgstr \"ترجیح ابزارهای فایروال\"\n\nmsgid \"IPv6 TProxy\"\nmsgstr \"IPv6 TProxy\"\n\nmsgid \"Experimental feature. Make sure that your node supports IPv6.\"\nmsgstr \"ویژگی آزمایشی. مطمئن شوید که گره شما از IPv6 پشتیبانی می‌کند.\"\n\nmsgid \"Status info\"\nmsgstr \"اطلاعات وضعیت\"\n\nmsgid \"Big icon\"\nmsgstr \"آیکون بزرگ\"\n\nmsgid \"Show node check\"\nmsgstr \"نمایش بررسی گره\"\n\nmsgid \"Show Show IP111\"\nmsgstr \"نمایش نمایش IP111\"\n\nmsgid \"Destination protocol\"\nmsgstr \"پروتکل مقصد\"\n\nmsgid \"Destination address\"\nmsgstr \"آدرس مقصد\"\n\nmsgid \"Destination port\"\nmsgstr \"پورت مقصد\"\n\nmsgid \"Whether to receive PROXY protocol, when this node want to be fallback or forwarded by proxy, it must be enable, otherwise it cannot be used.\"\nmsgstr \"آیا پروتکل PROXY دریافت شود، زمانی که این گره بخواهد پشتیبان باشد یا توسط پروکسی فوروارد شود، باید فعال باشد، در غیر این صورت قابل استفاده نیست.\"\n\nmsgid \"outbound node\"\nmsgstr \"گره خروجی\"\n\nmsgid \"Custom Socks\"\nmsgstr \"Socks سفارشی\"\n\nmsgid \"Custom HTTP\"\nmsgstr \"HTTP سفارشی\"\n\nmsgid \"Custom Interface\"\nmsgstr \"رابط سفارشی\"\n\nmsgid \"Interface\"\nmsgstr \"رابط\"\n\nmsgid \"Bind Local\"\nmsgstr \"اتصال محلی (Bind Local)\"\n\nmsgid \"When selected, it can only be accessed localhost.\"\nmsgstr \"در صورت انتخاب، فقط از طریق localhost قابل دسترسی است.\"\n\nmsgid \"Accept LAN Access\"\nmsgstr \"پذیرش دسترسی شبکه داخلی (LAN)\"\n\nmsgid \"When selected, it can accessed lan , this will not be safe!\"\nmsgstr \"در صورت انتخاب، از شبکه داخلی (LAN) قابل دسترسی خواهد بود؛ این کار امنیت را کاهش می‌دهد!\"\n\nmsgid \"Enable Remote\"\nmsgstr \"فعال‌سازی راه دور\"\n\nmsgid \"You can forward to Nginx/Caddy/V2ray/Xray WebSocket and more.\"\nmsgstr \"می‌توانید به Nginx/Caddy/V2ray/Xray WebSocket و موارد دیگر فوروارد کنید.\"\n\nmsgid \"Remote Address\"\nmsgstr \"آدرس راه دور\"\n\nmsgid \"Remote Port\"\nmsgstr \"پورت راه دور\"\n\nmsgid \"as:\"\nmsgstr \"به عنوان:\"\n\nmsgid \"Public key absolute path\"\nmsgstr \"مسیر مطلق کلید عمومی\"\n\nmsgid \"Private key absolute path\"\nmsgstr \"مسیر مطلق کلید خصوصی\"\n\nmsgid \"Can't find this file!\"\nmsgstr \"این فایل پیدا نشد!\"\n\nmsgid \"Public key and Private key path can not be empty!\"\nmsgstr \"مسیر کلید عمومی و کلید خصوصی نمی‌تواند خالی باشد!\"\n\nmsgid \"Server-Side\"\nmsgstr \"سمت سرور\"\n\nmsgid \"Server Config\"\nmsgstr \"پیکربندی سرور\"\n\nmsgid \"Users Manager\"\nmsgstr \"مدیریت کاربران\"\n\nmsgid \"Logs\"\nmsgstr \"گزارش‌ها (Logs)\"\n\nmsgid \"Log\"\nmsgstr \"گزارش (Log)\"\n\nmsgid \"Enable Node Log\"\nmsgstr \"فعال‌سازی گزارش گره\"\n\nmsgid \"Log Level\"\nmsgstr \"سطح گزارش\"\n\nmsgid \"Not enabled log\"\nmsgstr \"گزارش فعال نیست\"\n\nmsgid \"UDP Forward\"\nmsgstr \"فوروارد UDP\"\n\nmsgid \"DNS Settings\"\nmsgstr \"تنظیمات DNS\"\n\nmsgid \"Null\"\nmsgstr \"تهی (Null)\"\n\nmsgid \"You did not fill in the %s path. Please save and apply then update manually.\"\nmsgstr \"شما مسیر %s را پر نکرده‌اید. لطفاً ذخیره و اعمال کنید سپس به صورت دستی به‌روزرسانی کنید.\"\n\nmsgid \"Not installed %s, Can't unzip!\"\nmsgstr \"%s نصب نشده است، استخراج امکان‌پذیر نیست!\"\n\nmsgid \"Can't determine ARCH, or ARCH not supported.\"\nmsgstr \"معماری (ARCH) قابل تشخیص نیست، یا پشتیبانی نمی‌شود.\"\n\nmsgid \"Get remote version info failed.\"\nmsgstr \"دریافت اطلاعات نسخه راه دور ناموفق بود.\"\n\nmsgid \"New version found, but failed to get new version download url.\"\nmsgstr \"نسخه جدید پیدا شد، اما دریافت URL دانلود نسخه جدید ناموفق بود.\"\n\nmsgid \"Download url is required.\"\nmsgstr \"URL دانلود الزامی است.\"\n\nmsgid \"File download failed or timed out: %s\"\nmsgstr \"دانلود فایل ناموفق بود یا زمان آن تمام شد: %s\"\n\nmsgid \"File path required.\"\nmsgstr \"مسیر فایل الزامی است.\"\n\nmsgid \"%s not enough space.\"\nmsgstr \"%s فضای کافی ندارد.\"\n\nmsgid \"Can't find client in file: %s\"\nmsgstr \"کلاینت در فایل پیدا نشد: %s\"\n\nmsgid \"Client file is required.\"\nmsgstr \"فایل کلاینت الزامی است.\"\n\nmsgid \"The client file is not suitable for current device.\"\nmsgstr \"فایل کلاینت برای دستگاه فعلی مناسب نیست.\"\n\nmsgid \"Can't move new file to path: %s\"\nmsgstr \"انتقال فایل جدید به مسیر امکان‌پذیر نیست: %s\"\n\nmsgid \"An XHttpObject in JSON format, used for sharing.\"\nmsgstr \"یک XHttpObject در فرمت JSON، برای اشتراک‌گذاری استفاده می‌شود.\"\n\nmsgid \"Enable Mux.Cool\"\nmsgstr \"فعال‌سازی Mux.Cool\"\n\nmsgid \"Mux concurrency\"\nmsgstr \"همزمانی Mux\"\n\nmsgid \"XUDP Mux concurrency\"\nmsgstr \"همزمانی XUDP Mux\"\n\nmsgid \"Padding\"\nmsgstr \"پدینگ (Padding)\"\n\nmsgid \"Enable early data\"\nmsgstr \"فعال‌سازی داده‌های اولیه (Early Data)\"\n\nmsgid \"Early data length\"\nmsgstr \"طول داده‌های اولیه\"\n\nmsgid \"Early data header name\"\nmsgstr \"نام هدر داده‌های اولیه\"\n\nmsgid \"Recommended value: Sec-WebSocket-Protocol\"\nmsgstr \"مقدار پیشنهادی: Sec-WebSocket-Protocol\"\n\nmsgid \"Health check\"\nmsgstr \"بررسی سلامت\"\n\nmsgid \"Health check timeout\"\nmsgstr \"مهلت زمانی بررسی سلامت\"\n\nmsgid \"Permit without stream\"\nmsgstr \"اجازه بدون جریان (stream)\"\n\nmsgid \"Initial Windows Size\"\nmsgstr \"اندازه اولیه پنجره\"\n\nmsgid \"Excluded Domains\"\nmsgstr \"دامنه‌های استثنا شده\"\n\nmsgid \"If the traffic sniffing result is in this list, the destination address will not be overridden.\"\nmsgstr \"اگر نتیجه شنود ترافیک در این لیست باشد، آدرس مقصد بازنویسی نخواهد شد.\"\n\nmsgid \"Buffer Size\"\nmsgstr \"اندازه بافر\"\n\nmsgid \"Buffer size for every connection (kB)\"\nmsgstr \"اندازه بافر برای هر اتصال (کیلوبایت)\"\n\nmsgid \"Idle Timeout\"\nmsgstr \"مهلت زمانی بیکاری\"\n\nmsgid \"Hop Interval(second)\"\nmsgstr \"فاصله پرش (ثانیه)\"\n\nmsgid \"Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5.\"\nmsgstr \"از یک مقدار ثابت یا یک محدوده تصادفی (مثلاً 30، 5-30)، حداقل 5، پشتیبانی می‌کند.\"\n\nmsgid \"HeartbeatPeriod(second)\"\nmsgstr \"دوره ضربان قلب (ثانیه)\"\n\nmsgid \"Override the connection destination address\"\nmsgstr \"بازنویسی آدرس مقصد اتصال\"\n\nmsgid \"Override the connection destination address with the sniffed domain.<br />Otherwise use sniffed domain for routing only.<br />If using shunt nodes, configure the domain shunt rules correctly.\"\nmsgstr \"بازنویسی آدرس مقصد اتصال با دامنه شنود شده (Sniffed Domain).<br />در غیر این صورت، از دامنه شنود شده فقط برای مسیریابی استفاده می‌شود.<br />اگر از گره‌های شنت (Shunt) استفاده می‌کنید، قوانین مربوطه را به درستی پیکربندی کنید.\"\n\nmsgid \"Handshake Server\"\nmsgstr \"سرور دست تکان دادن\"\n\nmsgid \"Handshake Server Port\"\nmsgstr \"پورت سرور دست تکان دادن\"\n\nmsgid \"Protocol parameter. Will waste traffic randomly if enabled.\"\nmsgstr \"پارامتر پروتکل. در صورت فعال‌سازی، مقداری ترافیک تصادفی اضافی تولید می‌کند (برای مبهم‌سازی).\"\n\nmsgid \"Protocol parameter. Enable length block encryption.\"\nmsgstr \"پارامتر پروتکل. فعال‌سازی رمزنگاری بلوک طول.\"\n\nmsgid \"TLS Chain Fingerprint (SHA256)\"\nmsgstr \"اثر انگشت زنجیره TLS (SHA256)\"\n\nmsgid \"Once set, connects only when the server’s chain fingerprint matches.\"\nmsgstr \"پس از تنظیم، فقط زمانی متصل می‌شود که اثر انگشت زنجیره سرور مطابقت داشته باشد.\"\n\nmsgid \"TLS Certificate Name (CertName)\"\nmsgstr \"نام گواهی TLS (CertName)\"\n\nmsgid \"TLS is used to verify the leaf certificate name.\"\nmsgstr \"TLS برای تأیید نام گواهی برگ (Leaf Certificate) استفاده می‌شود.\"\n\nmsgid \"ECH Config\"\nmsgstr \"پیکربندی ECH\"\n\nmsgid \"ECH Key\"\nmsgstr \"کلید ECH\"\n\nmsgid \"ECH Query Policy\"\nmsgstr \"سیاست پرس‌وجوی ECH\"\n\nmsgid \"Controls the policy used when performing DNS queries for ECH configuration.\"\nmsgstr \"سیاستی که هنگام انجام پرس‌وجوهای DNS برای پیکربندی ECH استفاده می‌شود را کنترل می‌کند.\"\n\nmsgid \"ECH Query Domain\"\nmsgstr \"دامنه پرس و جو ECH\"\n\nmsgid \"Overrides the domain name used for ECH HTTPS record queries.\"\nmsgstr \"نام دامنه مورد استفاده برای پرس‌وجوهای رکورد ECH HTTPS را لغو می‌کند.\"\n\nmsgid \"Enable Multipath TCP, need to be enabled in both server and client configuration.\"\nmsgstr \"فعال‌سازی Multipath TCP، باید در تنظیمات سرور و کلاینت فعال باشد.\"\n\nmsgid \"An FinalMaskObject in JSON format, used for sharing.\"\nmsgstr \"یک شیء FinalMaskObject با فرمت JSON که برای اشتراک‌گذاری استفاده می‌شود.\"\n\nmsgid \"Custom finalmask overrides mkcp, hysteria2, fragment, noise, and related settings.\"\nmsgstr \"ماسک نهایی سفارشی، تنظیمات mkcp، hysteria2، fragment، noise و تنظیمات مرتبط را نادیده می‌گیرد.\"\n\nmsgid \"Fragment\"\nmsgstr \"قطعه‌بندی (Fragment)\"\n\nmsgid \"TCP fragments, which can deceive the censorship system in some cases, such as bypassing SNI blacklists.\"\nmsgstr \"قطعه‌بندی TCP، که می‌تواند در برخی موارد سیستم سانسور را فریب دهد، مانند دور زدن لیست سیاه SNI.\"\n\nmsgid \"Fragment Packets\"\nmsgstr \"بسته‌های قطعه‌بندی شده\"\n\nmsgid \" \\\"1-3\\\" is for segmentation at TCP layer, applying to the beginning 1 to 3 data writes by the client. \\\"tlshello\\\" is for TLS client hello packet fragmentation.\"\nmsgstr \" \\\"1-3\\\" برای قطعه‌بندی در لایه TCP است و به 1 تا 3 نوشتن اول داده توسط کلاینت اعمال می‌شود. \\\"tlshello\\\" برای قطعه‌بندی بسته سلام کلاینت TLS است.\"\n\nmsgid \"Fragment Length\"\nmsgstr \"طول قطعه\"\n\nmsgid \"Fragmented packet length (byte)\"\nmsgstr \"طول بسته قطعه‌بندی شده (بایت)\"\n\nmsgid \"Fragment Delay\"\nmsgstr \"تأخیر قطعه\"\n\nmsgid \"Fragmentation interval (ms)\"\nmsgstr \"بازه قطعه‌بندی (میلی‌ثانیه)\"\n\nmsgid \"Max Split\"\nmsgstr \"حداکثر تقسیم\"\n\nmsgid \"Limit the maximum number of splits.\"\nmsgstr \"حداکثر تعداد تقسیم‌بندی‌ها را محدود کنید.\"\n\nmsgid \"Split handshake data into multiple TLS records for better censorship evasion. Low overhead. Recommended to enable first.\"\nmsgstr \"تقسیم داده‌های دست تکان دادن به چندین رکورد TLS برای فرار بهتر از سانسور. سربار کم. توصیه می‌شود ابتدا فعال شود.\"\n\nmsgid \"Split handshake into multiple TCP segments. Enhances obfuscation. May increase delay. Use only if needed.\"\nmsgstr \"تقسیم دست تکان دادن به چندین قطعه TCP. افزایش مبهم‌سازی. ممکن است تاخیر را افزایش دهد. فقط در صورت نیاز استفاده کنید.\"\n\nmsgid \"Noise\"\nmsgstr \"نویز (Noise)\"\n\nmsgid \"UDP noise, Under some circumstances it can bypass some UDP based protocol restrictions.\"\nmsgstr \"نویز UDP، در برخی شرایط می‌تواند محدودیت‌های پروتکل مبتنی بر UDP را دور بزند.\"\n\nmsgid \"To send noise packets, select \\\"Noise\\\" in Xray Settings.\"\nmsgstr \"برای ارسال بسته‌های نویز، \\\"Noise\\\" را در تنظیمات Xray انتخاب کنید.\"\n\nmsgid \"Xray Noise Packets\"\nmsgstr \"بسته‌های نویز Xray\"\n\nmsgid \"Packet | Rand Length\"\nmsgstr \"طول بسته | رند\"\n\nmsgid \"Delay (ms)\"\nmsgstr \"تاخیر (میلی‌ثانیه)\"\n\nmsgid \"If is domain name, The requested domain name will be resolved to IP before connect.\"\nmsgstr \"اگر نام دامنه است، نام دامنه درخواست شده قبل از اتصال به IP حل می‌شود.\"\n\nmsgid \"Domain DNS Resolve\"\nmsgstr \"حل مشکل DNS دامنه\"\n\nmsgid \"If the node address is a domain name, this DNS will be used for resolution.\"\nmsgstr \"اگر آدرس گره یک نام دامنه باشد، از این DNS برای حل مسئله استفاده خواهد شد.\"\n\nmsgid \"Supports only Xray or Sing-box node types.\"\nmsgstr \"فقط گره‌های نوع Xray یا Sing-box پشتیبانی می‌شوند.\"\n\nmsgid \"Chain Proxy\"\nmsgstr \"پروکسی زنجیره‌ای\"\n\nmsgid \"Landing Node\"\nmsgstr \"گره فرود (Landing Node)\"\n\nmsgid \"Only support a layer of proxy.\"\nmsgstr \"فقط از یک لایه پروکسی پشتیبانی می‌کند.\"\n\nmsgid \"\"\n\"Chained proxy works only with Xray or Sing-box nodes.<br>\"\n\"You can only use manual or imported nodes as chained nodes.\"\nmsgstr \"\"\n\"پروکسی زنجیره‌ای فقط با گره‌های Xray یا Sing-box کار می‌کند.<br>\"\n\"شما فقط می‌توانید از گره‌های دستی یا وارد شده به عنوان گره‌های زنجیره‌ای استفاده کنید.\"\n\nmsgid \"Prefer IPv4\"\nmsgstr \"ترجیح IPv4\"\n\nmsgid \"Prefer IPv6\"\nmsgstr \"ترجیح IPv6\"\n\nmsgid \"IPv4 Only\"\nmsgstr \"فقط IPv4\"\n\nmsgid \"IPv6 Only\"\nmsgstr \"فقط IPv6\"\n\nmsgid \"Maintain\"\nmsgstr \"نگهداری\"\n\nmsgid \"Backup and Restore\"\nmsgstr \"پشتیبان‌گیری و بازیابی\"\n\nmsgid \"Backup or Restore Client and Server Configurations.\"\nmsgstr \"پشتیبان‌گیری یا بازیابی پیکربندی‌های کلاینت و سرور.\"\n\nmsgid \"Note: Restoring configurations across different versions may cause compatibility issues.\"\nmsgstr \"توجه: بازیابی پیکربندی‌ها در بین نسخه‌های مختلف ممکن است باعث مشکلات سازگاری شود.\"\n\nmsgid \"Create Backup File\"\nmsgstr \"ایجاد فایل پشتیبان\"\n\nmsgid \"Restore Backup File\"\nmsgstr \"بازیابی فایل پشتیبان\"\n\nmsgid \"DL Backup\"\nmsgstr \"دانلود پشتیبان\"\n\nmsgid \"RST Backup\"\nmsgstr \"بازنشانی پشتیبان\"\n\nmsgid \"Backup failed!\"\nmsgstr \"پشتیبان‌گیری ناموفق بود!\"\n\nmsgid \"UL Restore\"\nmsgstr \"آپلود بازیابی\"\n\nmsgid \"CLOSE WIN\"\nmsgstr \"بستن پنجره\"\n\nmsgid \"Restore to default configuration\"\nmsgstr \"بازیابی به پیکربندی پیش‌فرض\"\n\nmsgid \"Do Reset\"\nmsgstr \"انجام بازنشانی\"\n\nmsgid \"Please select a file first.\"\nmsgstr \"لطفاً ابتدا یک فایل انتخاب کنید.\"\n\nmsgid \"Invalid file type. Please upload a .tar.gz file.\"\nmsgstr \"نوع فایل نامعتبر است. لطفاً یک فایل .tar.gz آپلود کنید.\"\n\nmsgid \"File size exceeds 10MB limit.\"\nmsgstr \"اندازه فایل از محدودیت 10 مگابایت بیشتر است.\"\n\nmsgid \"Do you want to restore the client to default settings?\"\nmsgstr \"آیا می‌خواهید کلاینت را به تنظیمات پیش‌فرض بازگردانید؟\"\n\nmsgid \"Are you sure you want to restore the client to default settings?\"\nmsgstr \"آیا مطمئن هستید که می‌خواهید کلاینت را به تنظیمات پیش‌فرض بازگردانید؟\"\n\nmsgid \"Configuration file uploaded successfully…\"\nmsgstr \"فایل پیکربندی با موفقیت آپلود شد...\"\n\nmsgid \"Configuration restored successfully…\"\nmsgstr \"پیکربندی با موفقیت بازیابی شد...\"\n\nmsgid \"Service restarting…\"\nmsgstr \"راه اندازی مجدد سرویس...\"\n\nmsgid \"Configuration file decompression failed, please try again!\"\nmsgstr \"استخراج فایل پیکربندی ناموفق بود، لطفاً دوباره تلاش کنید!\"\n\nmsgid \"_urltest\"\nmsgstr \"_تست URL\"\n\nmsgid \"URLTest node list\"\nmsgstr \"لیست گره‌های URLTest\"\n\nmsgid \"List of nodes to test, <a target='_blank' href='https://sing-box.sagernet.org/configuration/outbound/urltest'>document</a>\"\nmsgstr \"لیست گره‌ها برای تست، <a target='_blank' href='https://sing-box.sagernet.org/configuration/outbound/urltest'>مستندات</a>\"\n\nmsgid \"Test interval\"\nmsgstr \"بازه تست\"\n\nmsgid \"Test interval must be less or equal than idle timeout.\"\nmsgstr \"بازه تست باید کمتر یا مساوی مهلت زمانی بیکاری باشد.\"\n\nmsgid \"Test tolerance\"\nmsgstr \"تحمل تست\"\n\nmsgid \"The test tolerance in milliseconds.\"\nmsgstr \"تحمل تست بر حسب میلی‌ثانیه.\"\n\nmsgid \"Idle timeout\"\nmsgstr \"مهلت زمانی بیکاری\"\n\nmsgid \"The idle timeout.\"\nmsgstr \"مهلت زمانی بیکاری.\"\n\nmsgid \"Interrupt existing connections\"\nmsgstr \"قطع اتصالات موجود\"\n\nmsgid \"Interrupt existing connections when the selected outbound has changed.\"\nmsgstr \"قطع اتصالات موجود زمانی که خروجی انتخاب شده تغییر کرده است.\"\n\nmsgid \"Port hopping range\"\nmsgstr \"محدوده پرش پورت\"\n\nmsgid \"Format as 1000:2000 or 1000-2000 Multiple groups are separated by commas (,).\"\nmsgstr \"فرمت به صورت 1000:2000 یا 1000-2000 گروه‌های متعدد با کاما (,) جدا می‌شوند.\"\n\nmsgid \"Use Custom Config\"\nmsgstr \"استفاده از پیکربندی سفارشی\"\n\nmsgid \"Custom Config\"\nmsgstr \"پیکربندی سفارشی\"\n\nmsgid \"Must be JSON text!\"\nmsgstr \"باید متن JSON باشد!\"\n\nmsgid \"Geo View\"\nmsgstr \"نمای Geo\"\n\nmsgid \"Query\"\nmsgstr \"پرس‌وجو\"\n\nmsgid \"Querying\"\nmsgstr \"در حال پرس‌وجو\"\n\nmsgid \"Please enter query content!\"\nmsgstr \"لطفاً محتوای پرس‌وجو را وارد کنید!\"\n\nmsgid \"No results were found!\"\nmsgstr \"هیچ نتیجه‌ای یافت نشد!\"\n\nmsgid \"Rules containing this value:\"\nmsgstr \"قوانین حاوی این مقدار:\"\n\nmsgid \"Domain/IP Query\"\nmsgstr \"پرس‌وجوی دامنه/IP\"\n\nmsgid \"GeoIP/Geosite Query\"\nmsgstr \"پرس‌وجوی GeoIP/Geosite\"\n\nmsgid \"Enter a domain or IP to query the Geo rule list they belong to.\"\nmsgstr \"یک دامنه یا IP وارد کنید تا لیست قوانین Geo که به آن تعلق دارند را جستجو کنید.\"\n\nmsgid \"Enter a GeoIP or Geosite to extract the domains/IPs they contain. Format: geoip:cn or geosite:gfw\"\nmsgstr \"یک GeoIP یا Geosite وارد کنید تا دامنه‌ها/IPهای موجود در آن استخراج شوند. فرمت: geoip:cn یا geosite:gfw\"\n\nmsgid \"Tips:\"\nmsgstr \"نکات:\"\n\nmsgid \"By entering a domain or IP, you can query the Geo rule list they belong to.\"\nmsgstr \"با وارد کردن یک دامنه یا IP، می‌توانید لیست قوانین Geo که به آن تعلق دارند را جستجو کنید.\"\n\nmsgid \"By entering a GeoIP or Geosite, you can extract the domains/IPs they contain.\"\nmsgstr \"با وارد کردن یک GeoIP یا Geosite، می‌توانید دامنه‌ها/IPهای موجود در آن را استخراج کنید.\"\n\nmsgid \"Use the GeoIP/Geosite query function to verify if the entered Geo rules are correct.\"\nmsgstr \"از عملکرد پرس‌وجوی GeoIP/Geosite برای تأیید صحت قوانین Geo وارد شده استفاده کنید.\"\n\nmsgid \"Private Key Passphrase\"\nmsgstr \"عبارت عبور کلید خصوصی\"\n\nmsgid \"Host Key\"\nmsgstr \"کلید میزبان (Host Key)\"\n\nmsgid \"Accept any if empty.\"\nmsgstr \"در صورت خالی بودن، همه پذیرفته می‌شوند.\"\n\nmsgid \"Host Key Algorithms\"\nmsgstr \"الگوریتم‌های کلید میزبان\"\n\nmsgid \"Client Version\"\nmsgstr \"نسخه کلاینت\"\n\nmsgid \"Random version will be used if empty.\"\nmsgstr \"در صورت خالی بودن، از نسخه تصادفی استفاده می‌شود.\"\n\nmsgid \"The configured type also applies to the core specified when manually importing nodes.\"\nmsgstr \"نوع پیکربندی شده همچنین به هسته مشخص شده هنگام وارد کردن دستی گره‌ها اعمال می‌شود.\"\n\nmsgid \"Group Name\"\nmsgstr \"نام گروه\"\n\nmsgid \"Reassign Group\"\nmsgstr \"تغییر گروه\"\n\nmsgid \"Reassign Node Group\"\nmsgstr \"تغییر گروه گره\"\n\nmsgid \"Search nodes...\"\nmsgstr \"جستجوی گره‌ها...\"\n\nmsgid \"Using...\"\nmsgstr \"در حال استفاده...\"\n\nmsgid \"Generate configuration file and run\"\nmsgstr \"تولید فایل پیکربندی و اجرا\"\n\nmsgid \"Start after a delay of %s seconds!\"\nmsgstr \"شروع پس از تاخیر %s ثانیه‌ای!\"\n\nmsgid \"The script is already running, do not run it again. Exit.\"\nmsgstr \"اسکریپت در حال اجرا است، دوباره آن را اجرا نکنید. خروج.\"\n\nmsgid \"Stop the script and wait for a timeout, then exit without repeating the process.\"\nmsgstr \"توقف اسکریپت و انتظار برای مهلت زمانی، سپس خروج بدون تکرار فرآیند.\"\n\nmsgid \"Warning: The %s application environment is incomplete. Switch to %s. (%s)\"\nmsgstr \"هشدار: محیط برنامه %s ناقص است. سوئیچ به %s. (%s)\"\n\nmsgid \"Note: Dnsmasq (%s) is below 2.90. Upgrading is recommended to improve stability.\"\nmsgstr \"توجه: Dnsmasq (%s) کمتر از 2.90 است. ارتقا برای بهبود پایداری توصیه می‌شود.\"\n\nmsgid \"Warning: %s transparent proxy is missing basic dependency %s!\"\nmsgstr \"هشدار: پروکسی شفاف %s وابستگی اساسی %s را ندارد!\"\n\nmsgid \"Warning: Not compatible with any transparent proxy system environment.\"\nmsgstr \"هشدار: با هیچ محیط سیستم پروکسی شفاف سازگار نیست.\"\n\nmsgid \"%s does not have execute permissions and cannot be started: %s %s\"\nmsgstr \"%s مجوز اجرا ندارد و نمی‌تواند شروع شود: %s %s\"\n\nmsgid \"%s not found, unable to start...\"\nmsgstr \"%s پیدا نشد، شروع امکان‌پذیر نیست...\"\n\nmsgid \"Socks node: [%s]%s is an invalid server address and cannot be started!\"\nmsgstr \"گره Socks: [%s]%s یک آدرس سرور نامعتبر است و نمی‌تواند شروع شود!\"\n\nmsgid \"For some reason, the configuration for this Socks service has been lost, and its startup has been aborted!\"\nmsgstr \"به دلایلی، پیکربندی این سرویس Socks از بین رفته است و راه‌اندازی آن لغو شد!\"\n\nmsgid \"Socks node: [%s]%s, start failed %s:%s %s\"\nmsgstr \"گره Socks: [%s]%s، شروع ناموفق %s:%s %s\"\n\nmsgid \"Socks node: [%s]%s, starting %s:%s\"\nmsgstr \"گره Socks: [%s]%s، در حال شروع %s:%s\"\n\nmsgid \"To enable experimental IPv6 transparent proxy (TProxy), please ensure your node and type support IPv6!\"\nmsgstr \"برای فعال‌سازی پروکسی شفاف IPv6 (آزمایشی)، لطفاً اطمینان حاصل کنید که گره و نوع اتصال شما از IPv6 پشتیبانی می‌کند!\"\n\nmsgid \"[%s] process %s error, skip this transparent proxy!\"\nmsgstr \"خطای فرآیند [%s] %s، از این پروکسی شفاف صرف‌نظر کنید!\"\n\nmsgid \"Analyzing the node configuration of the Socks service...\"\nmsgstr \"تحلیل پیکربندی گره سرویس Socks...\"\n\nmsgid \"Log file is too long, clear it!\"\nmsgstr \"فایل گزارش خیلی طولانی است، آن را پاک کنید!\"\n\nmsgid \"The task is currently running automatically as a scheduled task; no reconfiguration of the scheduled task is required.\"\nmsgstr \"وظیفه در حال حاضر به طور خودکار به عنوان یک وظیفه زمان‌بندی شده اجرا می‌شود؛ نیازی به پیکربندی مجدد وظیفه زمان‌بندی شده نیست.\"\n\nmsgid \"Scheduled tasks: Auto stop service.\"\nmsgstr \"وظایف زمان‌بندی شده: توقف خودکار سرویس.\"\n\nmsgid \"Scheduled tasks: Auto start service.\"\nmsgstr \"وظایف زمان‌بندی شده: شروع خودکار سرویس.\"\n\nmsgid \"Scheduled tasks: Auto restart service.\"\nmsgstr \"وظایف زمان‌بندی شده: راه‌اندازی مجدد خودکار سرویس.\"\n\nmsgid \"Scheduled tasks: Auto update rules.\"\nmsgstr \"وظایف زمان‌بندی شده: به‌روزرسانی خودکار قوانین.\"\n\nmsgid \"Scheduled tasks: Auto update [%s] subscription.\"\nmsgstr \"وظایف زمان‌بندی شده: به‌روزرسانی خودکار اشتراک [%s].\"\n\nmsgid \"Auto updates: Starts a cyclical update process.\"\nmsgstr \"به‌روزرسانی‌های خودکار: شروع یک فرآیند به‌روزرسانی چرخشی.\"\n\nmsgid \"Running in no proxy mode, it only allows scheduled tasks for starting and stopping services.\"\nmsgstr \"در حالت بدون پروکسی اجرا می‌شود، فقط اجازه وظایف زمان‌بندی شده برای شروع و توقف سرویس‌ها را می‌دهد.\"\n\nmsgid \"Clear scheduled commands.\"\nmsgstr \"پاک کردن دستورات زمان‌بندی شده.\"\n\nmsgid \"Unable to resolve [%s], route table addition failed!\"\nmsgstr \"عدم توانایی در حل [%s]، افزودن به جدول مسیریابی ناموفق بود!\"\n\nmsgid \"[%s] was successfully added to the routing table of interface [%s]!\"\nmsgstr \"[%s] با موفقیت به جدول مسیریابی رابط [%s] اضافه شد!\"\n\nmsgid \"Adding [%s] to the [%s] routing table failed! The reason is that the [%s] gateway cannot be found.\"\nmsgstr \"افزودن [%s] به جدول مسیریابی [%s] ناموفق بود! دلیل این است که دروازه [%s] پیدا نمی‌شود.\"\n\nmsgid \"Global nodes are not enabled, skip [%s].\"\nmsgstr \"گره‌های سراسری فعال نیستند، صرف‌نظر از [%s].\"\n\nmsgid \"Direct DNS: %s\"\nmsgstr \"DNS مستقیم: %s\"\n\nmsgid \"Remote DNS: %s\"\nmsgstr \"DNS راه دور: %s\"\n\nmsgid \"The program has started. Please stop it and then restart it!\"\nmsgstr \"برنامه شروع شده است. لطفاً آن را متوقف و سپس دوباره راه‌اندازی کنید!\"\n\nmsgid \"Running complete!\"\nmsgstr \"اجرا کامل شد!\"\n\nmsgid \"Clearing and closing related programs and cache complete.\"\nmsgstr \"پاک‌سازی و بستن برنامه‌های مرتبط و کش کامل شد.\"\n\nmsgid \"Incorrect index listing method (%s), execution terminated!\"\nmsgstr \"روش فهرست‌بندی ایندکس نادرست (%s)، اجرا متوقف شد!\"\n\nmsgid \"parse the traffic splitting rules[%s]-[geoip:%s] add to %s to complete.\"\nmsgstr \"تجزیه قوانین تقسیم ترافیک [%s]-[geoip:%s] و افزودن به %s کامل شد.\"\n\nmsgid \"Access Control:\"\nmsgstr \"کنترل دسترسی:\"\n\nmsgid \"Add node to the load balancer is directly connected to %s[%s].\"\nmsgstr \"افزودن گره به توزیع‌کننده بار مستقیماً به %s[%s] متصل است.\"\n\nmsgid \"Add all %s nodes to %s[%s] direct connection complete.\"\nmsgstr \"افزودن تمام گره‌های %s به %s[%s] اتصال مستقیم کامل شد.\"\n\nmsgid \"Starting to load %s firewall rules...\"\nmsgstr \"شروع بارگذاری قوانین فایروال %s...\"\n\nmsgid \"local network segments (%s) direct connection: %s\"\nmsgstr \"بخش‌های شبکه محلی (%s) اتصال مستقیم: %s\"\n\nmsgid \"Add ISP %s DNS to the whitelist: %s\"\nmsgstr \"افزودن DNS ISP %s به لیست سفید: %s\"\n\nmsgid \"[%s]\"\nmsgstr \"[%s]\"\n\nmsgid \"[%s],\"\nmsgstr \"[%s]،\"\n\nmsgid \"Source iface [%s],\"\nmsgstr \"رابط منبع [%s]،\"\n\nmsgid \"IP range [%s],\"\nmsgstr \"محدوده IP [%s]،\"\n\nmsgid \"All device,\"\nmsgstr \"همه دستگاه‌ها،\"\n\nmsgid \"Does not exist, ignore.\"\nmsgstr \"وجود ندارد، نادیده گرفتن.\"\n\nmsgid \"not proxy %s port [%s]\"\nmsgstr \"پروکسی نکردن پورت %s [%s]\"\n\nmsgid \"not proxy all %s\"\nmsgstr \"پروکسی نکردن همه %s\"\n\nmsgid \"Use the %s node [%s]\"\nmsgstr \"استفاده از گره %s [%s]\"\n\nmsgid \"Using a node that is different from the global configuration, DNS has been forcibly redirected to a dedicated DNS server.\"\nmsgstr \"استفاده از گره‌ای متفاوت از پیکربندی سراسری، DNS به اجبار به سرور DNS اختصاصی هدایت شده است.\"\n\nmsgid \"Add direct DNS to %s: %s\"\nmsgstr \"افزودن DNS مستقیم به %s: %s\"\n\nmsgid \"Local\"\nmsgstr \"محلی\"\n\nmsgid \"[Local],\"\nmsgstr \"[محلی]،\"\n\nmsgid \"Clear %s.\"\nmsgstr \"پاک کردن %s.\"\n\nmsgid \"Delete %s rules is complete.\"\nmsgstr \"حذف قوانین %s کامل شد.\"\n\nmsgid \"%s firewall rules load complete!\"\nmsgstr \"بارگذاری قوانین فایروال %s کامل شد!\"\n\nmsgid \"Socks switch detection: Unknown error.\"\nmsgstr \"تشخیص سوئیچ Socks: خطای ناشناخته.\"\n\nmsgid \"Socks switch detection: Unable to connect to the network. Please check if the network is working properly!\"\nmsgstr \"تشخیص سوئیچ Socks: عدم توانایی در اتصال به شبکه. لطفاً بررسی کنید که شبکه به درستی کار می‌کند!\"\n\nmsgid \"Socks switch detection: Primary node 【%s: [%s]】 is normal. Switch to the primary node!\"\nmsgstr \"تشخیص سوئیچ Socks: گره اولیه 【%s: [%s]】 عادی است. سوئیچ به گره اولیه!\"\n\nmsgid \"Socks switch detection: %s node switch complete!\"\nmsgstr \"تشخیص سوئیچ Socks: سوئیچ گره %s کامل شد!\"\n\nmsgid \"Socks switch detection: %s 【%s:[%s]】 normal.\"\nmsgstr \"تشخیص سوئیچ Socks: %s 【%s:[%s]】 عادی است.\"\n\nmsgid \"switch to %s test detect!\"\nmsgstr \"سوئیچ به تست تشخیص %s!\"\n\nmsgid \"backup node\"\nmsgstr \"گره پشتیبان\"\n\nmsgid \"next backup node\"\nmsgstr \"گره پشتیبان بعدی\"\n\nmsgid \"main node\"\nmsgstr \"گره اصلی\"\n\nmsgid \"Socks switch detection: Unknown error.\"\nmsgstr \"تشخیص سوئیچ Socks: خطای ناشناخته.\"\n\nmsgid \"Socks switch detection: %s 【%s:[%s]】 abnormal, %s\"\nmsgstr \"تشخیص سوئیچ Socks: %s 【%s:[%s]】 غیرعادی، %s\"\n\nmsgid \"Socks switch detection: %s 【%s:[%s]】 normal, switch to this node!\"\nmsgstr \"تشخیص سوئیچ Socks: %s 【%s:[%s]】 عادی، سوئیچ به این گره!\"\n\nmsgid \"Restart dnsmasq service.\"\nmsgstr \"راه‌اندازی مجدد سرویس dnsmasq.\"\n\nmsgid \"Console Port: %s\"\nmsgstr \"پورت کنسول: %s\"\n\nmsgid \"Discard one obviously invalid node.\"\nmsgstr \"حذف یک گره به وضوح نامعتبر.\"\n\nmsgid \"Entrance %s:%s\"\nmsgstr \"ورودی %s:%s\"\n\nmsgid \"Node: %s:%s, Weight: %s\"\nmsgstr \"گره: %s:%s، وزن: %s\"\n\nmsgid \"[Rule update] instance is running; please try again later.\"\nmsgstr \"نمونه [به‌روزرسانی قانون] در حال اجرا است؛ لطفاً بعداً دوباره امتحان کنید.\"\n\nmsgid \"[Subscription] instance is running; [Rule Update] queue and wait.\"\nmsgstr \"نمونه [اشتراک] در حال اجرا است؛ [به‌روزرسانی قانون] در صف انتظار قرار می‌گیرد.\"\n\nmsgid \"Start updating the rules...\"\nmsgstr \"شروع به‌روزرسانی قوانین...\"\n\nmsgid \"Download file size verification error. Original file size: %sB. Downloaded file size: %sB.\"\nmsgstr \"خطای تأیید اندازه فایل دانلود شده. اندازه فایل اصلی: %sB. اندازه فایل دانلود شده: %sB.\"\n\nmsgid \"Downloaded file is empty or an error occurred while reading it.\"\nmsgstr \"فایل دانلود شده خالی است یا خطایی هنگام خواندن آن رخ داده است.\"\n\nmsgid \"%s Start updating...\"\nmsgstr \"%s شروع به‌روزرسانی...\"\n\nmsgid \"%s version is the same and does not need to be updated.\"\nmsgstr \"نسخه %s یکسان است و نیازی به به‌روزرسانی ندارد.\"\n\nmsgid \"%s an error occurred during the file download process. Please try downloading again.\"\nmsgstr \"%s خطایی در فرآیند دانلود فایل رخ داد. لطفاً دوباره تلاش کنید.\"\n\nmsgid \"%s an error occurred while downloading the file. Please check your network or the download link and try again!\"\nmsgstr \"%s خطایی هنگام دانلود فایل رخ داد. لطفاً شبکه یا لینک دانلود را بررسی کرده و دوباره تلاش کنید!\"\n\nmsgid \"%s update success.\"\nmsgstr \"%s به‌روزرسانی موفق.\"\n\nmsgid \"%s update failed, please try again later or change URL.\"\nmsgstr \"%s به‌روزرسانی ناموفق بود، لطفاً بعداً تلاش کنید یا URL را تغییر دهید.\"\n\nmsgid \"%s update error!\"\nmsgstr \"%s خطای به‌روزرسانی!\"\n\nmsgid \"Restart the service and apply the new rules.\"\nmsgstr \"راه‌اندازی مجدد سرویس و اعمال قوانین جدید.\"\n\nmsgid \"The rules have been updated...\"\nmsgstr \"قوانین به‌روز شده‌اند...\"\n\nmsgid \"Socks node list [%s]\"\nmsgstr \"لیست گره‌های Socks [%s]\"\n\nmsgid \"Backup node list\"\nmsgstr \"لیست گره‌های پشتیبان\"\n\nmsgid \"HAProxy node list [%s]\"\nmsgstr \"لیست گره‌های HAProxy [%s]\"\n\nmsgid \"ACL list [%s]\"\nmsgstr \"لیست ACL [%s]\"\n\nmsgid \"Shunt [%s] node\"\nmsgstr \"گره شنت [%s]\"\n\nmsgid \"Xray Load Balancing node [%s] list\"\nmsgstr \"لیست گره‌های توزیع بار Xray [%s]\"\n\nmsgid \"Xray Load Balancing node [%s] backup node\"\nmsgstr \"گره پشتیبان گره توزیع بار Xray [%s]\"\n\nmsgid \"Sing-Box URLTest node [%s] list\"\nmsgstr \"لیست گره‌های URLTest Sing-Box [%s]\"\n\nmsgid \"Node [%s] preproxy node\"\nmsgstr \"گره پیش‌پروکسی گره [%s]\"\n\nmsgid \"Node [%s] landing node\"\nmsgstr \"گره فرود گره [%s]\"\n\nmsgid \"Skipping the %s node is due to incompatibility with the %s core program or incorrect node usage type settings.\"\nmsgstr \"نادیده گرفتن گره %s به دلیل ناسازگاری با هسته برنامه %s یا تنظیمات نادرست نوع گره.\"\n\nmsgid \"Skip node: %s. Because Sing-Box does not support the %s protocol's %s transmission method, Xray needs to be used instead.\"\nmsgstr \"صرف‌نظر از گره: %s. زیرا Sing-Box از روش انتقال %s پروتکل %s پشتیبانی نمی‌کند، باید به جای آن از Xray استفاده شود.\"\n\nmsgid \"Xray unsupport %s plugin.\"\nmsgstr \"Xray از افزونه %s پشتیبانی نمی‌کند.\"\n\nmsgid \"Plugin options Incomplete.\"\nmsgstr \"گزینه‌های افزونه ناقص است.\"\n\nmsgid \"shadowsocks-libev unsupport 2022 encryption.\"\nmsgstr \"shadowsocks-libev از رمزنگاری 2022 پشتیبانی نمی‌کند.\"\n\nmsgid \"Please replace %s to support %s transmission method.\"\nmsgstr \"لطفا برای پشتیبانی از روش انتقال %s، %s را جایگزین کنید.\"\n\nmsgid \"Please replace Xray or Sing-Box to support more transmission methods in Shadowsocks.\"\nmsgstr \"لطفاً برای پشتیبانی از روش‌های انتقال بیشتر در Shadowsocks، از Xray یا Sing-Box استفاده کنید.\"\n\nmsgid \"unsupport %s plugin.\"\nmsgstr \"پشتیبانی نکردن از افزونه %s.\"\n\nmsgid \"Skip the %s node because the %s core program is not installed.\"\nmsgstr \"صرف‌نظر از گره %s زیرا برنامه اصلی %s نصب نشده است.\"\n\nmsgid \"Skip the %s node, as %s type nodes require Sing-Box version 1.12 or higher.\"\nmsgstr \"صرف‌نظر از گره %s، زیرا گره‌های نوع %s به نسخه 1.12 یا بالاتر Sing-Box نیاز دارند.\"\n\nmsgid \"%s type node subscriptions are not currently supported, skip this node.\"\nmsgstr \"اشتراک‌های گره نوع %s در حال حاضر پشتیبانی نمی‌شوند، صرف‌نظر از این گره.\"\n\nmsgid \"Update [%s]\"\nmsgstr \"به‌روزرسانی [%s]\"\n\nmsgid \"Matching node:\"\nmsgstr \"گره منطبق:\"\n\nmsgid \"First Matching node:\"\nmsgstr \"اولین گره منطبق:\"\n\nmsgid \"Second Matching node:\"\nmsgstr \"دومین گره منطبق:\"\n\nmsgid \"Third Matching node:\"\nmsgstr \"سومین گره منطبق:\"\n\nmsgid \"Fourth Matching node:\"\nmsgstr \"چهارمین گره منطبق:\"\n\nmsgid \"Fifth Matching node:\"\nmsgstr \"پنجمین گره منطبق:\"\n\nmsgid \"Unable to find the best matching node, now replaced with:\"\nmsgstr \"عدم توانایی در یافتن بهترین گره منطبق، اکنون جایگزین شده با:\"\n\nmsgid \"Unable to find a new node. Please confirm and process manually.\"\nmsgstr \"عدم توانایی در یافتن گره جدید. لطفاً تأیید و به صورت دستی پردازش کنید.\"\n\nmsgid \"No node information updates are available.\"\nmsgstr \"هیچ به‌روزرسانی اطلاعات گره در دسترس نیست.\"\n\nmsgid \"Skip unknown types:\"\nmsgstr \"صرف‌نظر از انواع ناشناخته:\"\n\nmsgid \"Discard node: %s, Reason:\"\nmsgstr \"حذف گره: %s، دلیل:\"\n\nmsgid \"No usable binary was found.\"\nmsgstr \"هیچ باینری قابل استفاده‌ای یافت نشد.\"\n\nmsgid \"Discard filter nodes: %s type node %s\"\nmsgstr \"حذف گره‌های فیلتر: نوع گره %s %s\"\n\nmsgid \"Parsing error, skip this node.\"\nmsgstr \"خطای تجزیه، صرف‌نظر از این گره.\"\n\nmsgid \"Successfully resolved the [%s] node, number: %s\"\nmsgstr \"گره [%s] با موفقیت حل شد، تعداد: %s\"\n\nmsgid \"Get subscription content for [%s] is empty. This may be due to an invalid subscription address or a network problem. Please diagnose the issue!\"\nmsgstr \"دریافت محتوای اشتراک برای [%s] خالی است. این ممکن است به دلیل آدرس اشتراک نامعتبر یا مشکل شبکه باشد. لطفاً مشکل را بررسی کنید!\"\n\nmsgid \"Proxy\"\nmsgstr \"پروکسی\"\n\nmsgid \"[Subscription] instance is running; please try again later.\"\nmsgstr \"نمونه [اشتراک] در حال اجرا است؛ لطفاً بعداً دوباره امتحان کنید.\"\n\nmsgid \"[Rule Update] instance is running; [Subscription] queue and wait.\"\nmsgstr \"نمونه [به‌روزرسانی قانون] در حال اجرا است؛ [اشتراک] در صف انتظار قرار دارد.\"\n\nmsgid \"Start subscribing...\"\nmsgstr \"شروع اشتراک‌گیری...\"\n\nmsgid \"Start subscribing: %s\"\nmsgstr \"شروع اشتراک‌گیری: %s\"\n\nmsgid \"Subscription: [%s] No changes, no update required.\"\nmsgstr \"اشتراک: [%s] بدون تغییر، نیازی به به‌روزرسانی نیست.\"\n\nmsgid \"[%s] Subscription failed. This could be due to an invalid subscription address or a network issue. Please diagnose the problem! [%s]\"\nmsgstr \"[%s] اشتراک ناموفق بود. این می‌تواند به دلیل آدرس اشتراک نامعتبر یا مشکل شبکه باشد. لطفاً مشکل را بررسی کنید! [%s]\"\n\nmsgid \"Error, restoring service.\"\nmsgstr \"خطا، بازیابی سرویس.\"\n\nmsgid \"Subscription complete...\"\nmsgstr \"اشتراک کامل شد...\"\n\nmsgid \"Processing, please wait…\"\nmsgstr \"در حال پردازش، لطفا صبر کنید…\"\n"
  },
  {
    "path": "luci-app-passwall2/po/ru/passwall2.po",
    "content": "msgid \"Auto\"\nmsgstr \"Авто\"\n\nmsgid \"RUNNING\"\nmsgstr \"Служба активна\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"Служба остановлена\"\n\nmsgid \"Working...\"\nmsgstr \"Выполняется...\"\n\nmsgid \"Problem detected!\"\nmsgstr \"Обнаружена ошибка!\"\n\nmsgid \"Touch Check\"\nmsgstr \"Проверить доступность\"\n\nmsgid \"Global\"\nmsgstr \"Глобальный режим\"\n\nmsgid \"Kernel Unsupported\"\nmsgstr \"Ядро несовместимо\"\n\nmsgid \"Basic Settings\"\nmsgstr \"Общие параметры\"\n\nmsgid \"Node List\"\nmsgstr \"Список узлов\"\n\nmsgid \"Other Settings\"\nmsgstr \"Дополнительные настройки\"\n\nmsgid \"Load Balancing\"\nmsgstr \"Балансировка трафика\"\n\nmsgid \"Enter interface\"\nmsgstr \"Открыть интерфейс\"\n\nmsgid \"Rule Manage\"\nmsgstr \"Управление правилами\"\n\nmsgid \"Rule List\"\nmsgstr \"Список правил\"\n\nmsgid \"Access control\"\nmsgstr \"Контроль доступа\"\n\nmsgid \"Watch Logs\"\nmsgstr \"Просмотр журнала\"\n\nmsgid \"Node Config\"\nmsgstr \"Параметры узла\"\n\nmsgid \"Running Status\"\nmsgstr \"Состояние системы\"\n\nmsgid \"Baidu Connection\"\nmsgstr \"Baidu\"\n\nmsgid \"Google Connection\"\nmsgstr \"Google\"\n\nmsgid \"GitHub Connection\"\nmsgstr \"GitHub\"\n\nmsgid \"Instagram Connection\"\nmsgstr \"Instagram\"\n\nmsgid \"Node Check\"\nmsgstr \"Проверка узлов\"\n\nmsgid \"Check...\"\nmsgstr \"Идёт проверка...\"\n\nmsgid \"Clear\"\nmsgstr \"Очистить\"\n\nmsgid \"Main switch\"\nmsgstr \"Включить модуль\"\n\nmsgid \"Node\"\nmsgstr \"Узел\"\n\nmsgid \"Edit Current Node\"\nmsgstr \"Изменить выбранный узел\"\n\nmsgid \"Localhost Proxy\"\nmsgstr \"Прокси для самого роутера\"\n\nmsgid \"When selected, localhost can transparent proxy.\"\nmsgstr \"Если включено, трафик самого роутера будет идти через прозрачный прокси.\"\n\nmsgid \"Client Proxy\"\nmsgstr \"Прокси для клиентских устройств\"\n\nmsgid \"When selected, devices in LAN can transparent proxy. Otherwise, it will not be proxy. But you can still use access control to allow the designated device to proxy.\"\nmsgstr \"Если включено, все устройства в локальной сети будут автоматически использовать прозрачный прокси. В противном случае прокси не активируется, но вы можете добавить исключения через список контроля доступа.\"\n\nmsgid \"Missing components, transparent proxy is unavailable.\"\nmsgstr \"Не установлены необходимые компоненты — прозрачный прокси недоступен.\"\n\nmsgid \"Socks Config\"\nmsgstr \"Настройки SOCKS-прокси\"\n\nmsgid \"Socks Node\"\nmsgstr \"SOCKS-сервер\"\n\nmsgid \"Current Node\"\nmsgstr \"Активный сервер\"\n\nmsgid \"Listen Port\"\nmsgstr \"Порт прослушивания\"\n\nmsgid \"0 is not use\"\nmsgstr \"0 — отключить функцию\"\n\nmsgid \"Current node: %s\"\nmsgstr \"Текущий узел: %s\"\n\nmsgid \"Direct domain DNS routing\"\nmsgstr \"Прямая маршрутизация DNS домена\"\n\nmsgid \"Please note that the program will not start if the format is incorrect!\"\nmsgstr \"Обратите внимание, что программа не запустится, если формат указан неверно!\"\n\nmsgid \"IP:Port mode acceptable, multi value split with english comma.\"\nmsgstr \"Допустим формат IP:Port. Несколько значений указывайте через запятую.\"\n\nmsgid \"Direct DNS Protocol\"\nmsgstr \"Протокол прямого DNS\"\n\nmsgid \"Direct DNS\"\nmsgstr \"Прямой DNS\"\n\nmsgid \"Direct DNS DoH\"\nmsgstr \"Прямой DNS-over-HTTPS\"\n\nmsgid \"Direct DNS EDNS Client Subnet\"\nmsgstr \"EDNS Client Subnet для прямого DNS\"\n\nmsgid \"Remote DNS Protocol\"\nmsgstr \"Протокол прокси-DNS\"\n\nmsgid \"Remote DNS\"\nmsgstr \"Прокси-DNS\"\n\nmsgid \"Remote DNS DoH\"\nmsgstr \"Прокси DNS-over-HTTPS\"\n\nmsgid \"Remote DNS EDNS Client Subnet\"\nmsgstr \"EDNS Client Subnet для прокси-DNS\"\n\nmsgid \"Notify the DNS server when the DNS query is notified, the location of the client (cannot be a private IP address).\"\nmsgstr \"Сообщает DNS-серверу примерное местоположение клиента при запросе. Указывайте публичный IP-адрес.\"\n\nmsgid \"This feature requires the DNS server to support the Edns Client Subnet (RFC7871).\"\nmsgstr \"Функция работает только если DNS-сервер поддерживает EDNS Client Subnet (RFC7871).\"\n\nmsgid \"Remote DNS Outbound\"\nmsgstr \"Маршрут для прокси-DNS\"\n\nmsgid \"Remote\"\nmsgstr \"Через прокси\"\n\nmsgid \"Direct\"\nmsgstr \"Прямой\"\n\nmsgid \"Direct Query Strategy\"\nmsgstr \"Стратегия прямого запроса\"\n\nmsgid \"Remote Query Strategy\"\nmsgstr \"Стратегия прокси-запроса\"\n\nmsgid \"Use FakeDNS work in the domain that proxy.\"\nmsgstr \"Использовать FakeDNS для доменов, проходящих через прокси\"\n\nmsgid \"Suitable scenarios for let the node servers get the target domain names.\"\nmsgstr \"Позволяет узлам получать реальные доменные имена (вместо подставных адресов).\"\n\nmsgid \"Such as: DNS unlocking of streaming media, reducing DNS query latency, etc.\"\nmsgstr \"Например: разблокировка стриминговых сервисов, ускорение разрешения имён и т.п.\"\n\nmsgid \"Domain Override\"\nmsgstr \"Переопределение доменов\"\n\nmsgid \"Direct DNS result write to IPSet\"\nmsgstr \"Записывать результаты прямого DNS в IPSet\"\n\nmsgid \"Perform the matching direct domain name rules into IP to IPSet/NFTSet, and then connect directly (not entering the core).\"\nmsgstr \"IP-адреса доменов, подходящих под правила прямого доступа, добавляются в IPSet/NFTSet для обхода ядра прокси.\"\n\nmsgid \"Maybe conflict with some special circumstances.\"\nmsgstr \"В отдельных случаях может конфликтовать с другими правилами.\"\n\nmsgid \"DNS Redirect\"\nmsgstr \"Перехват DNS-запросов\"\n\nmsgid \"Force special DNS server to need proxy devices.\"\nmsgstr \"Принудительно направлять DNS-запросы устройств через прокси на выделенный сервер.\"\n\nmsgid \"Clear IPSET\"\nmsgstr \"Очистить IPSet\"\n\nmsgid \"Clear NFTSET\"\nmsgstr \"Очистить NFTSet\"\n\nmsgid \"Try this feature if the rule modification does not take effect.\"\nmsgstr \"Используйте, если изменения в правилах не применяются.\"\n\nmsgid \"About DNS issues:\"\nmsgstr \"Важно о настройке DNS:\"\n\nmsgid \"Some browsers may have built-in DNS, be sure to close. Example: Chrome. Settings - Security and Privacy - Security - Use secure DNS disabled.\"\nmsgstr \"Некоторые браузеры используют собственный DNS. Отключите эту функцию: в Chrome это «Настройки → Конфиденциальность и безопасность → Безопасность → Использовать безопасный DNS».\"\n\nmsgid \"Sometimes after restart, you can not internet. At this time, close all browsers (important), Windows Client, please `ipconfig /flushdns`. Please close the WiFi on the phone, cut the flight mode and then cut back.\"\nmsgstr \"Если после перезагрузки нет доступа в сеть: закройте все браузеры, в Windows выполните `ipconfig /flushdns`, на телефоне переключите авиарежим или переподключитесь к Wi-Fi.\"\n\nmsgid \"The client DNS and the default gateway must point to this router.\"\nmsgstr \"В настройках клиентов DNS-сервер и шлюз по умолчанию должны указывать на этот роутер.\"\n\nmsgid \"If you have a wrong DNS process, the consequences are at your own risk!\"\nmsgstr \"Неверная настройка DNS может привести к потере доступа в сеть — действуйте на свой страх и риск.\"\n\nmsgid \"Hide menu method, input example in the address bar:\"\nmsgstr \"Чтобы скрыть меню, введите в адресной строке:\"\n\nmsgid \"After the hidden to the display, input example in the address bar:\"\nmsgstr \"Чтобы вернуть меню, введите в адресной строке:\"\n\nmsgid \"Are you sure to hide?\"\nmsgstr \"Скрыть меню?\"\n\nmsgid \"DNS related issues:\"\nmsgstr \"Возможные проблемы с DNS:\"\n\nmsgid \"Certain browsers such as Chrome have built-in DNS service, which may affect DNS resolution settings. You can go to 'Settings -> Privacy and security -> Use secure DNS' menu to turn it off.\"\nmsgstr \"Браузеры вроде Chrome могут использовать собственный DNS, что конфликтует с настройками роутера. Отключите: «Настройки → Конфиденциальность → Безопасность → Использовать безопасный DNS».\"\n\nmsgid \"If you are unable to access the internet after reboot, please try clearing the cache of your terminal devices (make sure to close all open browser application windows first, this step is especially important):\"\nmsgstr \"Если после перезагрузки нет доступа в интернет, очистите кэш DNS на устройствах (предварительно закройте все вкладки браузера):\"\n\nmsgid \"For Windows systems, open Command Prompt and run the command 'ipconfig /flushdns'.\"\nmsgstr \"Windows: откройте командную строку и выполните `ipconfig /flushdns`.\"\n\nmsgid \"For Mac systems, open Terminal and run the command 'sudo killall -HUP mDNSResponder'.\"\nmsgstr \"macOS: откройте Терминал и выполните `sudo killall -HUP mDNSResponder`.\"\n\nmsgid \"For mobile devices, you can clear it by reconnecting to the network, such as toggling Airplane Mode and reconnecting to WiFi.\"\nmsgstr \"Мобильные устройства: переключите авиарежим или переподключитесь к Wi-Fi.\"\n\nmsgid \"Please make sure your device's network settings point both the DNS server and default gateway to this router, to ensure DNS queries are properly routed.\"\nmsgstr \"Убедитесь, что в настройках сети устройства DNS и шлюз по умолчанию указывают на этот роутер.\"\n\nmsgid \"Browser access:\"\nmsgstr \"Доступ через браузер:\"\n\nmsgid \"Hide in main menu:\"\nmsgstr \"Скрыть в главном меню:\"\n\nmsgid \"Show in main menu:\"\nmsgstr \"Показать в главном меню:\"\n\nmsgid \"DNS Export Of Multi WAN\"\nmsgstr \"Выбор WAN-интерфейса для прямого DNS\"\n\nmsgid \"Node Export Of Multi WAN\"\nmsgstr \"Выбор WAN-интерфейса для узлов\"\n\nmsgid \"Only support Multi Wan.\"\nmsgstr \"Работает только при наличии нескольких WAN-подключений.\"\n\nmsgid \"Not Specify\"\nmsgstr \"Не указывать\"\n\nmsgid \"custom\"\nmsgstr \"Свой вариант\"\n\nmsgid \"If not available, try clearing the cache.\"\nmsgstr \"Если не работает — попробуйте очистить кэш.\"\n\nmsgid \"Operation\"\nmsgstr \"Действия\"\n\nmsgid \"Add Node\"\nmsgstr \"Добавить узел\"\n\nmsgid \"Add the node via the link\"\nmsgstr \"Добавить узел по ссылке\"\n\nmsgid \"Enter share links, one per line. Subscription links are not supported!\"\nmsgstr \"Введите ссылки для импорта, по одной на строку. Ссылки на подписки не поддерживаются!\"\n\nmsgid \"Please enter the correct link.\"\nmsgstr \"Пожалуйста, введите корректную ссылку.\"\n\nmsgid \"Clear all nodes\"\nmsgstr \"Удалить все узлы\"\n\nmsgid \"Are you sure to clear all nodes?\"\nmsgstr \"Вы действительно хотите удалить все узлы?\"\n\nmsgid \"Success\"\nmsgstr \"Готово\"\n\nmsgid \"Error\"\nmsgstr \"Ошибка\"\n\nmsgid \"Delete select nodes\"\nmsgstr \"Удалить выбранные узлы\"\n\nmsgid \"To Top\"\nmsgstr \"В начало списка\"\n\nmsgid \"Select\"\nmsgstr \"Выбрать\"\n\nmsgid \"Selected:\"\nmsgstr \"Выбрано:\"\n\nmsgid \"DeSelect\"\nmsgstr \"Снять выделение\"\n\nmsgid \"Select all\"\nmsgstr \"Выделить все\"\n\nmsgid \"DeSelect all\"\nmsgstr \"Снять выделение со всех\"\n\nmsgid \"Are you sure to delete select nodes?\"\nmsgstr \"Вы действительно хотите удалить выбранные узлы?\"\n\nmsgid \"You no select nodes !\"\nmsgstr \"Вы не выбрали ни одного узла!\"\n\nmsgid \"Are you sure set to\"\nmsgstr \"Вы действительно хотите назначить\"\n\nmsgid \"the server?\"\nmsgstr \"активным сервером?\"\n\nmsgid \"You choose node is:\"\nmsgstr \"Выбранный узел:\"\n\nmsgid \"Timeout\"\nmsgstr \"Тайм-аут\"\n\nmsgid \"Node Remarks\"\nmsgstr \"Описание узла\"\n\nmsgid \"Add Mode\"\nmsgstr \"Способ добавления\"\n\nmsgid \"Save Order\"\nmsgstr \"Сохранить порядок\"\n\nmsgid \"Saved current page order successfully.\"\nmsgstr \"Порядок элементов сохранён.\"\n\nmsgid \"Drag to reorder\"\nmsgstr \"Перетащите для изменения порядка\"\n\nmsgid \"Type\"\nmsgstr \"Тип\"\n\nmsgid \"_balancing\"\nmsgstr \"_balancing\"\n\nmsgid \"_shunt\"\nmsgstr \"_shunt\"\n\nmsgid \"Balancing\"\nmsgstr \"Балансировка\"\n\nmsgid \"Node Addition Method\"\nmsgstr \"Способ добавления узлов\"\n\nmsgid \"Manual\"\nmsgstr \"Вручную\"\n\nmsgid \"Batch\"\nmsgstr \"Пакетно\"\n\nmsgid \"Select Group\"\nmsgstr \"Выберите группу\"\n\nmsgid \"Node Matching Rules\"\nmsgstr \"Правила отбора узлов\"\n\nmsgid \"\"\n\"Example: <code>^A && B && !C && D$</code><br>\"\n\"This means the node remark must start with A (^), include B, exclude C (!), and end with D ($).<br>\"\n\"Conditions are joined by <code>&&</code>, and their order does not affect the result.\"\nmsgstr \"\"\n\"Пример: <code>^A && B && !C && D$</code><br>\"\n\"Описание узла должно: начинаться с A (^), содержать B, не содержать C (!), заканчиваться на D ($).<br>\"\n\"Условия соединяются оператором <code>&&</code>, порядок условий не влияет на результат.\"\n\nmsgid \"Balancing Strategy\"\nmsgstr \"Алгоритм балансировки\"\n\nmsgid \"Fallback Node\"\nmsgstr \"Запасной узел\"\n\nmsgid \"Use Custom Probe URL\"\nmsgstr \"Использовать свой URL для проверки\"\n\nmsgid \"By default the built-in probe URL will be used, enable this option to use a custom probe URL.\"\nmsgstr \"По умолчанию используется встроенный адрес для проверки. Включите эту опцию, чтобы задать свой URL.\"\n\nmsgid \"Probe URL\"\nmsgstr \"URL для диагностики\"\n\nmsgid \"The URL used to detect the connection status.\"\nmsgstr \"Адрес, используемый для проверки доступности соединения.\"\n\nmsgid \"Probe Interval\"\nmsgstr \"Интервал проверки\"\n\nmsgid \"The interval between initiating probes.\"\nmsgstr \"Периодичность проверки доступности.\"\n\nmsgid \"The time format is numbers + units, such as '10s', '2h45m', and the supported time units are <code>s</code>, <code>m</code>, <code>h</code>, which correspond to seconds, minutes, and hours, respectively.\"\nmsgstr \"Формат: число + единица измерения, например <code>10s</code>, <code>2h45m</code>. Поддерживаемые единицы: <code>s</code> (секунды), <code>m</code> (минуты), <code>h</code> (часы).\"\n\nmsgid \"When the unit is not filled in, it defaults to seconds.\"\nmsgstr \"Если единица не указана, по умолчанию используются секунды.\"\n\nmsgid \"Preferred Node Count\"\nmsgstr \"Количество предпочтительных узлов\"\n\nmsgid \"The load balancer selects the optimal number of nodes, and traffic is randomly distributed among them.\"\nmsgstr \"Балансировщик выбирает указанное количество наилучших узлов и распределяет трафик между ними случайным образом.\"\n\nmsgid \"Shunt\"\nmsgstr \"Shunt (разделение трафика)\"\n\nmsgid \"Preproxy\"\nmsgstr \"Цепочка прокси\"\n\nmsgid \"Preproxy Node\"\nmsgstr \"Первый узел цепочки\"\n\nmsgid \"Set the node to be used as a pre-proxy.\"\nmsgstr \"Укажите узел, который будет использоваться как первый узел в цепочке.\"\n\nmsgid \"Set the node to be used as a pre-proxy. Each rule (including Default) has a separate switch that controls whether this rule uses the pre-proxy or not.\"\nmsgstr \"Укажите узел для использования в качестве первого узла цепочки. Каждое правило (включая «По умолчанию») имеет отдельный переключатель, определяющий, использовать ли цепочку для этого правила.\"\n\nmsgid \"Each rule has a separate switch that controls whether this rule uses the pre-proxy or not.\"\nmsgstr \"Для каждого правила можно отдельно включить или отключить использование цепочки.\"\n\nmsgid \"Close (Not use)\"\nmsgstr \"Отключено\"\n\nmsgid \"Use default node\"\nmsgstr \"Использовать узел по умолчанию\"\n\nmsgid \"Direct Connection\"\nmsgstr \"Прямое соединение\"\n\nmsgid \"Blackhole (Block)\"\nmsgstr \"Блокировка (Blackhole)\"\n\nmsgid \"There are no available nodes, please add or subscribe nodes first.\"\nmsgstr \"Нет доступных узлов! Добавьте вручную или настройте подписку.\"\n\nmsgid \"No shunt rules? Click me to go to add.\"\nmsgstr \"Нет правил разделения трафика! Нажмите, чтобы добавить.\"\n\nmsgid \"When using, localhost will connect this node first and then use this node to connect the default node.\"\nmsgstr \"При использовании трафик сначала пойдёт через этот узел, а затем — через основной узел назначения.\"\n\nmsgid \"Domain Strategy\"\nmsgstr \"Порядок разрешения имён\"\n\nmsgid \"Domain matcher\"\nmsgstr \"Алгоритм сопоставления доменов\"\n\nmsgid \"'AsIs': Only use domain for routing. Default value.\"\nmsgstr \"AsIs: использовать доменное имя как есть. Значение по умолчанию.\"\n\nmsgid \"'IPIfNonMatch': When no rule matches current domain, resolves it into IP addresses (A or AAAA records) and try all rules again.\"\nmsgstr \"IPIfNonMatch: если домен не подошёл ни под одно правило, разрешить его в IP-адрес и повторить проверку.\"\n\nmsgid \"'IPOnDemand': As long as there is a IP-based rule, resolves the domain into IP immediately.\"\nmsgstr \"IPOnDemand: если встречается правило на основе IP, сразу разрешать домен в адрес.\"\n\nmsgid \"Load balancing node list\"\nmsgstr \"Список узлов для балансировки\"\n\nmsgid \"Load balancing node list, <a target='_blank' href='https://xtls.github.io/config/routing.html#balancerobject'>document</a>\"\nmsgstr \"Список узлов для балансировки, <a target='_blank' href='https://xtls.github.io/config/routing.html#balancerobject'>документация</a>\"\n\nmsgid \"From Share URL\"\nmsgstr \"Импорт из ссылки\"\n\nmsgid \"Build Share URL\"\nmsgstr \"Экспорт в ссылку\"\n\nmsgid \"Generate QRCode\"\nmsgstr \"Сгенерировать QR-код\"\n\nmsgid \"Export Config File\"\nmsgstr \"Экспорт конфигурации\"\n\nmsgid \"Import Finished\"\nmsgstr \"Импорт завершён:\"\n\nmsgid \"Not a supported scheme:\"\nmsgstr \"Неподдерживаемый формат:\"\n\nmsgid \"Invalid Share URL Format\"\nmsgstr \"Неверный формат ссылки\"\n\nmsgid \"Paste Share URL Here\"\nmsgstr \"Вставьте ссылку сюда\"\n\nmsgid \"Share URL to clipboard unable.\"\nmsgstr \"Не удалось скопировать ссылку в буфер обмена.\"\n\nmsgid \"Share URL to clipboard successfully.\"\nmsgstr \"Ссылка скопирована в буфер обмена.\"\n\nmsgid \"Faltal on get option, please help in debug:\"\nmsgstr \"Ошибка при чтении настроек, пожалуйста, сообщите разработчикам:\"\n\nmsgid \"Faltal on set option, please help in debug:\"\nmsgstr \"Ошибка при сохранении настроек, пожалуйста, сообщите разработчикам:\"\n\nmsgid \"Address\"\nmsgstr \"Адрес\"\n\nmsgid \"Address (Support Domain Name)\"\nmsgstr \"Адрес (поддерживаются домены)\"\n\nmsgid \"Trojan Verify Cert\"\nmsgstr \"Проверять сертификат (Trojan)\"\n\nmsgid \"Trojan Cert Path\"\nmsgstr \"Путь к сертификату (Trojan)\"\n\nmsgid \"Finger Print\"\nmsgstr \"TLS отпечаток\"\n\nmsgid \"Avoid using randomized, unless you have to.\"\nmsgstr \"Избегайте режима randomized, если в этом нет острой необходимости.\"\n\nmsgid \"Original\"\nmsgstr \"Оригинал\"\n\nmsgid \"Transport Plugin\"\nmsgstr \"Плагин транспорта\"\n\nmsgid \"Shadowsocks secondary encryption\"\nmsgstr \"Дополнительное шифрование Shadowsocks\"\n\nmsgid \"global_padding\"\nmsgstr \"Включить padding-заполнение\"\n\nmsgid \"authenticated_length\"\nmsgstr \"Шифровать длину пакетов\"\n\nmsgid \"Obfs Type\"\nmsgstr \"Тип обфускации\"\n\nmsgid \"Obfs Password\"\nmsgstr \"Пароль обфускации\"\n\nmsgid \"Auth Type\"\nmsgstr \"Тип аутентификации\"\n\nmsgid \"Auth Password\"\nmsgstr \"Пароль аутентификации\"\n\nmsgid \"Client BBR Flow Control\"\nmsgstr \"Управление клиентом BBR\"\n\nmsgid \"Commands the client to use the BBR flow control algorithm\"\nmsgstr \"Включает использование алгоритма управления потоком BBR на клиенте\"\n\nmsgid \"PinSHA256\"\nmsgstr \"PinSHA256\"\n\nmsgid \"Certificate fingerprint\"\nmsgstr \"Хеш сертификата\"\n\nmsgid \"Max upload Mbps\"\nmsgstr \"Макс. скорость отдачи (Мбит/с)\"\n\nmsgid \"Max download Mbps\"\nmsgstr \"Макс. скорость загрузки (Мбит/с)\"\n\nmsgid \"QUIC stream receive window\"\nmsgstr \"Размер окна приёма потока QUIC\"\n\nmsgid \"QUIC connection receive window\"\nmsgstr \"Размер окна приёма соединения QUIC\"\n\nmsgid \"QUIC concurrent bidirectional streams\"\nmsgstr \"Макс. количество одновременных двунаправленных потоков QUIC\"\n\nmsgid \"QUIC KeepAlive interval\"\nmsgstr \"Интервал QUIC KeepAlive\"\n\nmsgid \"Disable MTU detection\"\nmsgstr \"Отключить определение MTU\"\n\nmsgid \"ignoreClientBandwidth\"\nmsgstr \"Игнорировать заявленные лимиты пропускной способности клиента\"\n\nmsgid \"Lazy Start\"\nmsgstr \"Отложенный старт\"\n\nmsgid \"Encrypt Method\"\nmsgstr \"Метод шифрования\"\n\nmsgid \"Encrypt Key\"\nmsgstr \"Ключ шифрования\"\n\nmsgid \"Latency\"\nmsgstr \"Задержка\"\n\nmsgid \"Automatic detection delay\"\nmsgstr \"Метод автопроверки\"\n\nmsgid \"Show server address and port\"\nmsgstr \"Показывать адрес и порт узла\"\n\nmsgid \"URL Test Address\"\nmsgstr \"Адрес для проверки\"\n\nmsgid \"URL Test\"\nmsgstr \"URL-тест\"\n\nmsgid \"Test\"\nmsgstr \"Проверить\"\n\nmsgid \"Node num\"\nmsgstr \"Количество узлов\"\n\nmsgid \"Self add\"\nmsgstr \"Добавлен вручную\"\n\nmsgid \"Apply\"\nmsgstr \"Применить\"\n\nmsgid \"Use\"\nmsgstr \"Использовать\"\n\nmsgid \"Copy\"\nmsgstr \"Копировать\"\n\nmsgid \"Delay Settings\"\nmsgstr \"Расписание\"\n\nmsgid \"Open and close Daemon\"\nmsgstr \"Запускать демон\"\n\nmsgid \"Delay Start\"\nmsgstr \"Отложенный запуск\"\n\nmsgid \"Units:seconds\"\nmsgstr \"Единица: секунды\"\n\nmsgid \"Units:minutes\"\nmsgstr \"Единица: минуты\"\n\nmsgid \"stop automatically mode\"\nmsgstr \"Режим автоотключения\"\n\nmsgid \"stop Time(Every day)\"\nmsgstr \"Время отключения (ежедневно)\"\n\nmsgid \"stop Interval(Hour)\"\nmsgstr \"Интервал отключения (часы)\"\n\nmsgid \"start automatically mode\"\nmsgstr \"Режим автозапуска\"\n\nmsgid \"start Time(Every day)\"\nmsgstr \"Время запуска (ежедневно)\"\n\nmsgid \"start Interval(Hour)\"\nmsgstr \"Интервал запуска (часы)\"\n\nmsgid \"restart automatically mode\"\nmsgstr \"Режим автоперезапуска\"\n\nmsgid \"restart Time(Every day)\"\nmsgstr \"Время перезапуска (ежедневно)\"\n\nmsgid \"restart Interval(Hour)\"\nmsgstr \"Интервал перезапуска (часы)\"\n\nmsgid \"Forwarding Settings\"\nmsgstr \"Настройки перенаправления\"\n\nmsgid \"TCP No Redir Ports\"\nmsgstr \"TCP-порты без перенаправления\"\n\nmsgid \"UDP No Redir Ports\"\nmsgstr \"UDP-порты без перенаправления\"\n\nmsgid \"Fill in the ports you don't want to be forwarded by the agent, with the highest priority.\"\nmsgstr \"Укажите порты, которые не должны обрабатываться прокси. Эти настройки имеют наивысший приоритет.\"\n\nmsgid \"If you don't want to let the device in the list to go proxy, please choose all.\"\nmsgstr \"Если вы не хотите, чтобы устройства из списка использовали прокси, выберите «Все».\"\n\nmsgid \"The port settings support single ports and ranges.<br>Separate multiple ports with commas (,).<br>Example: 21,80,443,1000:2000.\"\nmsgstr \"Поддерживаются отдельные порты и диапазоны.<br>Несколько значений указывайте через запятую.<br>Пример: 21,80,443,1000:2000.\"\n\nmsgid \"TCP Proxy Drop Ports\"\nmsgstr \"TCP-порты для блокировки прокси\"\n\nmsgid \"UDP Proxy Drop Ports\"\nmsgstr \"UDP-порты для блокировки прокси\"\n\nmsgid \"TCP Redir Ports\"\nmsgstr \"TCP-порты для перенаправления\"\n\nmsgid \"UDP Redir Ports\"\nmsgstr \"UDP-порты для перенаправления\"\n\nmsgid \"No patterns are used\"\nmsgstr \"Не использовать\"\n\nmsgid \"All\"\nmsgstr \"Все\"\n\nmsgid \"Common Use\"\nmsgstr \"Распространённые\"\n\nmsgid \"Only Web\"\nmsgstr \"Только веб\"\n\nmsgid \"or more\"\nmsgstr \"и более\"\n\nmsgid \"or less\"\nmsgstr \"и менее\"\n\nmsgid \"Default\"\nmsgstr \"По умолчанию\"\n\nmsgid \"Close\"\nmsgstr \"Отключить\"\n\nmsgid \"Hijacking ICMP (PING)\"\nmsgstr \"Перехват ICMP (PING)\"\n\nmsgid \"Hijacking ICMPv6 (IPv6 PING)\"\nmsgstr \"Перехват ICMPv6 (IPv6 PING)\"\n\nmsgid \"Force Proxy LAN IP\"\nmsgstr \"Принудительное использование IP-адреса локальной сети (Local IP)\"\n\nmsgid \"By default, commonly used internal network IP ranges will be connect directly (not entering the core). If you want a certain network range to go through a proxy, please add it here.\"\nmsgstr \"По умолчанию, часто используемые диапазоны IP-адресов внутренней сети будут подключаться напрямую (без доступа к ядру сети). Если вы хотите, чтобы определенный диапазон IP-адресов сети проходил через прокси-сервер, укажите это здесь.\"\n\nmsgid \"Sniffing\"\nmsgstr \"Анализ трафика\"\n\nmsgid \"TCP Proxy Way\"\nmsgstr \"Метод TCP-проксирования\"\n\nmsgid \"Auto Switch\"\nmsgstr \"Автопереключение\"\n\nmsgid \"When there is no server, an automatic reconnect scheme is used\"\nmsgstr \"При потере связи автоматически выполняется переподключение\"\n\nmsgid \"How often to test\"\nmsgstr \"Частота проверки\"\n\nmsgid \"Timeout seconds\"\nmsgstr \"Тайм-аут (сек)\"\n\nmsgid \"Timeout retry num\"\nmsgstr \"Количество повторов при тайм-ауте\"\n\nmsgid \"Automatic switching cannot be used when this option is checked\"\nmsgstr \"При включении этой опции автопереключение недоступно\"\n\nmsgid \"Main node\"\nmsgstr \"Основной узел\"\n\nmsgid \"List of backup nodes\"\nmsgstr \"Список резервных узлов\"\n\nmsgid \"Restore Switch\"\nmsgstr \"Возврат к основному\"\n\nmsgid \"When detects main node is available, switch back to the main node.\"\nmsgstr \"При восстановлении доступности основного узла — автоматически переключиться на него.\"\n\nmsgid \"Add nodes to the standby node list by keywords\"\nmsgstr \"Добавить узлы в резервный список по ключевым словам\"\n\nmsgid \"Delete nodes in the standby node list by keywords\"\nmsgstr \"Удалить узлы из резервного списка по ключевым словам\"\n\nmsgid \"Please enter the node keyword, pay attention to distinguish between spaces, uppercase and lowercase.\"\nmsgstr \"Введите ключевое слово. Учитывайте регистр и пробелы.\"\n\nmsgid \"Enable Load Balancing\"\nmsgstr \"Включить балансировку\"\n\nmsgid \"Console Login Auth\"\nmsgstr \"Аутентификация в консоли\"\n\nmsgid \"Console Username\"\nmsgstr \"Логин консоли\"\n\nmsgid \"Console Password\"\nmsgstr \"Пароль консоли\"\n\nmsgid \"Console Port\"\nmsgstr \"Порт консоли\"\n\nmsgid \"In the browser input routing IP plus port access, such as:192.168.1.1:1188\"\nmsgstr \"В браузере введите IP роутера и порт, например: 192.168.1.1:1188\"\n\nmsgid \"Haproxy Port\"\nmsgstr \"Порт HAProxy\"\n\nmsgid \"Health Check Type\"\nmsgstr \"Тип проверки доступности\"\n\nmsgid \"Inner implement\"\nmsgstr \"Встроенный механизм\"\n\nmsgid \"Health Check Inter\"\nmsgstr \"Интервал проверки состояния\"\n\nmsgid \"When the URL test is used, the load balancing node will be converted into a Socks node. when node list set customizing, must be a Socks node, otherwise the health check will be invalid.\"\nmsgstr \"При использовании URL-теста узлы балансировки рассматриваются как SOCKS-узлы. Если список задан вручную, все узлы должны быть типа SOCKS — иначе проверка не будет работать.\"\n\nmsgid \"Add a node, Export Of Multi WAN Only support Multi Wan. Load specific gravity range 1-256. Multiple primary servers can be load balanced, standby will only be enabled when the primary server is offline! Multiple groups can be set, Haproxy port same one for each group.\"\nmsgstr \"Добавление узла: функция выбора WAN-интерфейса работает только при нескольких WAN. Вес: 1–256. Несколько основных узлов могут балансироваться, резервные активируются только при отказе основных. Можно создать несколько групп — узлы с одинаковым портом HAProxy объединяются в одну группу.\"\n\nmsgid \"Note that the node configuration parameters for load balancing must be consistent when use TCP health check type, otherwise it cannot be used normally!\"\nmsgstr \"Важно: при использовании TCP-проверки параметры узлов в группе балансировки должны совпадать, иначе функция не будет работать корректно.\"\n\nmsgid \"Node Address\"\nmsgstr \"Адрес сервера\"\n\nmsgid \"Node address cannot be empty.\"\nmsgstr \"Адрес сервера не может быть пустым.\"\n\nmsgid \"Node Port\"\nmsgstr \"Порт сервера\"\n\nmsgid \"Node Weight\"\nmsgstr \"Вес нагрузки\"\n\nmsgid \"Export Of Multi WAN\"\nmsgstr \"Выбор WAN-интерфейса\"\n\nmsgid \"Main\"\nmsgstr \"Основной\"\n\nmsgid \"Mode\"\nmsgstr \"Режим\"\n\nmsgid \"Primary\"\nmsgstr \"Основной\"\n\nmsgid \"Standby\"\nmsgstr \"Резервный\"\n\nmsgid \"Check update\"\nmsgstr \"Проверить обновления\"\n\nmsgid \"Force update\"\nmsgstr \"Принудительное обновление\"\n\nmsgid \"The latest version: %s, currently does not support automatic update, if you need to update, please compile or download the ipk and then manually install.\"\nmsgstr \"Доступна версия %s. Автоматическое обновление пока не поддерживается — для установки скачайте или соберите ipk-пакет и установите его вручную.\"\n\nmsgid \"Enable custom URL\"\nmsgstr \"Включить пользовательский URL\"\n\nmsgid \"Rule status\"\nmsgstr \"Версия правил\"\n\nmsgid \"Manually update\"\nmsgstr \"Обновить вручную\"\n\nmsgid \"Rollback\"\nmsgstr \"Откатить\"\n\nmsgid \"Rollbacking...\"\nmsgstr \"Выполняется откат...\"\n\nmsgid \"Enable auto update rules\"\nmsgstr \"Автообновление правил\"\n\nmsgid \"Update Time(every day)\"\nmsgstr \"Время обновления (ежедневно)\"\n\nmsgid \"Update Interval(hour)\"\nmsgstr \"Интервал обновления (часы)\"\n\nmsgid \"Update Mode\"\nmsgstr \"Режим обновления\"\n\nmsgid \"Loop Mode\"\nmsgstr \"Циклический\"\n\nmsgid \"Every day\"\nmsgstr \"Ежедневно\"\n\nmsgid \"Every Monday\"\nmsgstr \"По понедельникам\"\n\nmsgid \"Every Tuesday\"\nmsgstr \"По вторникам\"\n\nmsgid \"Every Wednesday\"\nmsgstr \"По средам\"\n\nmsgid \"Every Thursday\"\nmsgstr \"По четвергам\"\n\nmsgid \"Every Friday\"\nmsgstr \"По пятницам\"\n\nmsgid \"Every Saturday\"\nmsgstr \"По субботам\"\n\nmsgid \"Every Sunday\"\nmsgstr \"По воскресеньям\"\n\nmsgid \"hour\"\nmsgstr \"час\"\n\nmsgid \"Hour\"\nmsgstr \"Час\"\n\nmsgid \"GeoIP Update URL\"\nmsgstr \"URL обновления GeoIP\"\n\nmsgid \"Geosite Update URL\"\nmsgstr \"URL обновления Geosite\"\n\nmsgid \"Location of Geo rule files\"\nmsgstr \"Папка для Geo-файлов\"\n\nmsgid \"This variable specifies a directory where geoip.dat and geosite.dat files are.\"\nmsgstr \"Укажите директорию, в которой находятся файлы geoip.dat и geosite.dat.\"\n\nmsgid \"Enable GeoIP Data Parsing\"\nmsgstr \"Включить анализ данных GeoIP\"\n\nmsgid \"Analyzes and preloads GeoIP data to enhance the shunt performance.\"\nmsgstr \"Анализирует и предварительно загружает данные GeoIP для улучшения работы разделения трафика.\"\n\nmsgid \"Note: Increases resource usage.\"\nmsgstr \"Примечание: увеличивает нагрузку на систему.\"\n\nmsgid \"Shunt Rule\"\nmsgstr \"Правила разделения трафика\"\n\nmsgid \"Please note attention to the priority, the higher the order, the higher the priority.\"\nmsgstr \"Обратите внимание: правила выше в списке имеют более высокий приоритет.\"\n\nmsgid \"Update...\"\nmsgstr \"Обновление...\"\n\nmsgid \"It is the latest version\"\nmsgstr \"Установлена последняя версия\"\n\nmsgid \"Update successful\"\nmsgstr \"Обновление успешно\"\n\nmsgid \"Click to update\"\nmsgstr \"Нажмите для обновления\"\n\nmsgid \"Updating...\"\nmsgstr \"Идёт обновление...\"\n\nmsgid \"Retry\"\nmsgstr \"Повторить\"\n\nmsgid \"Unexpected error\"\nmsgstr \"Непредвиденная ошибка\"\n\nmsgid \"Updating, are you sure to close?\"\nmsgstr \"Идёт обновление. Вы уверены, что хотите закрыть?\"\n\nmsgid \"Downloading...\"\nmsgstr \"Загрузка...\"\n\nmsgid \"Unpacking...\"\nmsgstr \"Распаковка...\"\n\nmsgid \"Moving...\"\nmsgstr \"Перемещение...\"\n\nmsgid \"App Update\"\nmsgstr \"Обновление компонентов\"\n\nmsgid \"Please confirm that your firmware supports FPU.\"\nmsgstr \"Убедитесь, что ваша прошивка поддерживает FPU.\"\n\nmsgid \"if you want to run from memory, change the path, /tmp beginning then save the application and update it manually.\"\nmsgstr \"Если вы хотите запускать из оперативной памяти, измените путь на начинающийся с /tmp, затем сохраните настройки и обновите компонент вручную.\"\n\nmsgid \"Make sure there is enough space to install %s\"\nmsgstr \"Убедитесь, что достаточно места для установки %s\"\n\nmsgid \"App Path\"\nmsgstr \"Путь к приложению\"\n\nmsgid \"%s App Path\"\nmsgstr \"Путь к приложению %s\"\n\nmsgid \"%s Client App Path\"\nmsgstr \"Путь к клиенту %s\"\n\nmsgid \"Node Subscribe\"\nmsgstr \"Подписки\"\n\nmsgid \"Subscribe Remark\"\nmsgstr \"Название подписки\"\n\nmsgid \"Subscribe Info\"\nmsgstr \"Информация о подписке\"\n\nmsgid \"Subscribe URL\"\nmsgstr \"URL подписки\"\n\nmsgid \"Subscribe URL Access Method\"\nmsgstr \"Способ доступа к URL подписки\"\n\nmsgid \"When adding a new subscription, please save and apply before manually subscribing. If you only change the subscription URL, you can subscribe manually, and the system will save it automatically.\"\nmsgstr \"При добавлении новой подписки сначала сохраните и примените настройки, затем выполните ручную подписку. Если вы только изменили URL — можно сразу выполнить ручную подписку, система сохранит изменения автоматически.\"\n\nmsgid \"Please save and apply before manually subscribing.\"\nmsgstr \"Сохраните и примените настройки перед ручной подпиской.\"\n\nmsgid \"Subscribe URL cannot be empty.\"\nmsgstr \"URL подписки не может быть пустым.\"\n\nmsgid \"Subscribe via proxy\"\nmsgstr \"Подписка через прокси\"\n\nmsgid \"Update Once on Boot\"\nmsgstr \"Обновлять один раз при загрузке\"\n\nmsgid \"Updates the subscription the first time runs automatically after each system boot.\"\nmsgstr \"Подписку обновляют при первом запуске, и она автоматически активируется после каждой загрузки системы.\"\n\nmsgid \"Enable auto update subscribe\"\nmsgstr \"Автообновление подписки\"\n\nmsgid \"Manual subscription\"\nmsgstr \"Ручное обновление подписки\"\n\nmsgid \"Delete All Subscribe Node\"\nmsgstr \"Удалить все узлы из подписки\"\n\nmsgid \"Delete the subscribed node\"\nmsgstr \"Удалить узел\"\n\nmsgid \"Are you sure you want to delete all subscribed nodes?\"\nmsgstr \"Вы действительно хотите удалить все узлы, добавленные через подписку?\"\n\nmsgid \"Manual subscription All\"\nmsgstr \"Ручное обновление всех подписок\"\n\nmsgid \"This remark already exists, please change a new remark.\"\nmsgstr \"Такое название уже существует, выберите другое.\"\n\nmsgid \"Remark cannot be empty.\"\nmsgstr \"Название не может быть пустым.\"\n\nmsgid \"URL cannot be empty.\"\nmsgstr \"URL не может быть пустым.\"\n\nmsgid \"Filter keyword Mode\"\nmsgstr \"Режим фильтрации по ключевым словам\"\n\nmsgid \"Discard List\"\nmsgstr \"Отбрасывать совпадения\"\n\nmsgid \"Keep List\"\nmsgstr \"Оставлять только совпадения\"\n\nmsgid \"Discard List,But Keep List First\"\nmsgstr \"Отбрасывать совпадения, но сначала применить список исключений\"\n\nmsgid \"Keep List,But Discard List First\"\nmsgstr \"Оставлять только совпадения, но сначала применить список отбрасывания\"\n\nmsgid \"Use global config\"\nmsgstr \"Использовать глобальные настройки\"\n\nmsgid \"User-Agent\"\nmsgstr \"User-Agent\"\n\nmsgid \"Add\"\nmsgstr \"Добавить\"\n\nmsgid \"ACLs\"\nmsgstr \"Правила доступа\"\n\nmsgid \"ACLs is a tools which used to designate specific IP proxy mode.\"\nmsgstr \"Правила доступа (ACL) позволяют задавать особый режим прокси для отдельных IP-адресов.\"\n\nmsgid \"Example:\"\nmsgstr \"Пример:\"\n\nmsgid \"IP range\"\nmsgstr \"Диапазон IP\"\n\nmsgid \"Source Interface\"\nmsgstr \"Интерфейс источника\"\n\nmsgid \"Bridge\"\nmsgstr \"Мост\"\n\nmsgid \"Wireless Adapter\"\nmsgstr \"Беспроводной адаптер\"\n\nmsgid \"Ethernet Adapter\"\nmsgstr \"Ethernet-адаптер\"\n\nmsgid \"Tunnel Interface\"\nmsgstr \"Туннельный интерфейс\"\n\nmsgid \"Invalid interface name\"\nmsgstr \"Недопустимое имя интерфейса\"\n\nmsgid \"Use Interface With ACLs\"\nmsgstr \"Применять правила к интерфейсу\"\n\nmsgid \"Remarks\"\nmsgstr \"Описание\"\n\nmsgid \"Direct List\"\nmsgstr \"Список прямого доступа\"\n\nmsgid \"Proxy List\"\nmsgstr \"Список для прокси\"\n\nmsgid \"Block List\"\nmsgstr \"Список блокировки\"\n\nmsgid \"Lan IP List\"\nmsgstr \"Список LAN-IP\"\n\nmsgid \"Route Hosts\"\nmsgstr \"Файл hosts\"\n\nmsgid \"Join the direct hosts list of domain names will not proxy.\"\nmsgstr \"Домены из этого списка будут обходить прокси. Правило действует для всех режимов и имеет наивысший приоритет.\"\n\nmsgid \"These had been joined ip addresses will not proxy. Please input the ip address or ip address segment,every line can input only one ip address. For example: 192.168.0.0/24 or 223.5.5.5.\"\nmsgstr \"IP-адреса и подсети из этого списка будут обходить прокси. Вводите по одному значению на строку. Пример: 192.168.0.0/24 или 223.5.5.5.\"\n\nmsgid \"These had been joined websites will use proxy. Please input the domain names of websites, every line can input only one website domain. For example: google.com.\"\nmsgstr \"Домены из этого списка будут использовать прокси. Вводите по одному домену на строку. Пример: google.com.\"\n\nmsgid \"These had been joined ip addresses will use proxy. Please input the ip address or ip address segment, every line can input only one ip address. For example: 35.24.0.0/24 or 8.8.4.4.\"\nmsgstr \"IP-адреса и подсети из этого списка будут использовать прокси. Вводите по одному значению на строку. Пример: 35.24.0.0/24 или 8.8.4.4.\"\n\nmsgid \"These had been joined websites will be block. Please input the domain names of websites, every line can input only one website domain. For example: twitter.com.\"\nmsgstr \"Домены из этого списка будут блокироваться. Вводите по одному домену на строку. Пример: twitter.com.\"\n\nmsgid \"The list is the IPv4 LAN IP list, which represents the direct connection IP of the LAN. If you need the LAN IP in the proxy list, please clear it from the list. Do not modify this list by default.\"\nmsgstr \"Список IPv4-адресов локальной сети, которые всегда подключаются напрямую. Если вам нужно, чтобы LAN-IP использовал прокси, удалите его из этого списка. По умолчанию не изменяйте этот список.\"\n\nmsgid \"The list is the IPv6 LAN IP list, which represents the direct connection IP of the LAN. If you need the LAN IP in the proxy list, please clear it from the list. Do not modify this list by default.\"\nmsgstr \"Список IPv6-адресов локальной сети, которые всегда подключаются напрямую. Если вам нужно, чтобы LAN-IP использовал прокси, удалите его из этого списка. По умолчанию не изменяйте этот список.\"\n\nmsgid \"Configure routing etc/hosts file, if you don't know what you are doing, please don't change the content.\"\nmsgstr \"Редактирование файла hosts роутера. Если вы не уверены в своих действиях, не изменяйте содержимое.\"\n\nmsgid \"These had been joined ip addresses will be block. Please input the ip address or ip address segment, every line can input only one ip address.\"\nmsgstr \"IP-адреса и подсети из этого списка будут блокироваться. Вводите по одному значению на строку.\"\n\nmsgid \"Inbound Tag\"\nmsgstr \"Метка входящего соединения\"\n\nmsgid \"Transparent proxy\"\nmsgstr \"Прозрачный прокси\"\n\nmsgid \"Not valid domain name, please re-enter!\"\nmsgstr \"Неверный формат домена, пожалуйста, введите заново!\"\n\nmsgid \"Not valid IP format, please re-enter!\"\nmsgstr \"Неверный формат IP, пожалуйста, введите заново!\"\n\nmsgid \"Not valid IPv4 format, please re-enter!\"\nmsgstr \"Неверный формат IPv4, пожалуйста, введите заново!\"\n\nmsgid \"Not valid IPv6 format, please re-enter!\"\nmsgstr \"Неверный формат IPv6, пожалуйста, введите заново!\"\n\nmsgid \"Not true format, please re-enter!\"\nmsgstr \"Неверный формат, пожалуйста, введите заново!\"\n\nmsgid \"Plaintext: If this string matches any part of the targeting domain, this rule takes effet. Example: rule 'sina.com' matches targeting domain 'sina.com', 'sina.com.cn' and 'www.sina.com', but not 'sina.cn'.\"\nmsgstr \"Текст: правило срабатывает, если строка встречается в любом месте домена. Например, 'sina.com' совпадёт с 'sina.com', 'sina.com.cn', 'www.sina.com', но не с 'sina.cn'.\"\n\nmsgid \"Regular expression: Begining with 'regexp:', the rest is a regular expression. When the regexp matches targeting domain, this rule takes effect. Example: rule 'regexp:\\\\.goo.*\\\\.com$' matches 'www.google.com' and 'fonts.googleapis.com', but not 'google.com'.\"\nmsgstr \"Регулярное выражение: начинается с 'regexp:', далее — шаблон. Правило срабатывает при совпадении. Например, 'regexp:\\\\.goo.*\\\\.com$' совпадёт с 'www.google.com' и 'fonts.googleapis.com', но не с 'google.com'.\"\n\nmsgid \"Subdomain (recommended): Begining with 'domain:' and the rest is a domain. When the targeting domain is exactly the value, or is a subdomain of the value, this rule takes effect. Example: rule 'domain:v2ray.com' matches 'www.v2ray.com', 'v2ray.com', but not 'xv2ray.com'.\"\nmsgstr \"Поддомен (рекомендуется): начинается с 'domain:', далее — домен. Правило срабатывает для точного совпадения или любого поддомена. Например, 'domain:v2ray.com' совпадёт с 'www.v2ray.com' и 'v2ray.com', но не с 'xv2ray.com'.\"\n\nmsgid \"Full domain: Begining with 'full:' and the rest is a domain. When the targeting domain is exactly the value, the rule takes effect. Example: rule 'domain:v2ray.com' matches 'v2ray.com', but not 'www.v2ray.com'.\"\nmsgstr \"Полное совпадение: начинается с 'full:', далее — домен. Правило срабатывает только при точном совпадении. Например, 'full:v2ray.com' совпадёт только с 'v2ray.com', но не с 'www.v2ray.com'.\"\n\nmsgid \"Sing-Box rule-set: Begining with 'rule-set:remote:' or 'rule-set:local:'\"\nmsgstr \"Набор правил Sing-Box: начинается с 'rule-set:remote:' или 'rule-set:local:'\"\n\nmsgid \"Such as:\"\nmsgstr \"Например:\"\n\nmsgid \"Pre-defined domain list: Begining with 'geosite:' and the rest is a name, such as geosite:google or geosite:cn.\"\nmsgstr \"Предопределённый список: начинается с 'geosite:', далее — имя набора, например geosite:google или geosite:cn.\"\n\nmsgid \"Annotation: Begining with #\"\nmsgstr \"Комментарий начинается с #\"\n\nmsgid \"Invert match result.\"\nmsgstr \"Инвертировать результат.\"\n\nmsgid \"Only support Sing-Box.\"\nmsgstr \"Поддерживается только в Sing-Box.\"\n\nmsgid \"IP: such as '127.0.0.1'.\"\nmsgstr \"IP: например, '127.0.0.1'.\"\n\nmsgid \"CIDR: such as '127.0.0.0/8'.\"\nmsgstr \"CIDR: например, '10.0.0.0/8'.\"\n\nmsgid \"GeoIP: such as 'geoip:cn'. It begins with geoip: (lower case) and followed by two letter of country code.\"\nmsgstr \"GeoIP: например, 'geoip:cn'. Должно начинаться с 'geoip:' (строчными), далее — двухбуквенный код страны.\"\n\nmsgid \"Clear logs\"\nmsgstr \"Очистить журнал\"\n\nmsgid \"Password\"\nmsgstr \"Пароль\"\n\nmsgid \"IV Check\"\nmsgstr \"Проверка IV\"\n\nmsgid \"UDP over TCP\"\nmsgstr \"UDP через TCP\"\n\nmsgid \"Connection Timeout\"\nmsgstr \"Тайм-аут подключения\"\n\nmsgid \"Local Port\"\nmsgstr \"Локальный порт\"\n\nmsgid \"Fast Open\"\nmsgstr \"Fast Open\"\n\nmsgid \"Pre-connections\"\nmsgstr \"Предварительные соединения\"\n\nmsgid \"Number of early established connections to reduce latency.\"\nmsgstr \"Количество заранее установленных соединений для снижения задержки.\"\n\nmsgid \"plugin\"\nmsgstr \"Плагин\"\n\nmsgid \"Supports custom SIP003 plugins, Make sure the plugin is installed.\"\nmsgstr \"Поддерживаются пользовательские плагины SIP003. Убедитесь, что плагин установлен.\"\n\nmsgid \"opts\"\nmsgstr \"опции\"\n\nmsgid \"Protocol\"\nmsgstr \"Протокол\"\n\nmsgid \"Protocol_param\"\nmsgstr \"Параметры протокола\"\n\nmsgid \"Obfs\"\nmsgstr \"Обфускация\"\n\nmsgid \"Obfs_param\"\nmsgstr \"Параметры обфускации\"\n\nmsgid \"Plugin Name\"\nmsgstr \"Название плагина\"\n\nmsgid \"Plugin Arguments\"\nmsgstr \"Аргументы плагина\"\n\nmsgid \"User Level\"\nmsgstr \"Уровень доступа\"\n\nmsgid \"Transport\"\nmsgstr \"Транспорт\"\n\nmsgid \"Public Key\"\nmsgstr \"Публичный ключ\"\n\nmsgid \"Private Key\"\nmsgstr \"Приватный ключ\"\n\nmsgid \"Pre shared key\"\nmsgstr \"Дополнительный симметричный ключ\"\n\nmsgid \"Local Address\"\nmsgstr \"Локальный адрес\"\n\nmsgid \"System interface\"\nmsgstr \"Системный интерфейс\"\n\nmsgid \"System interface name\"\nmsgstr \"Имя системного интерфейса\"\n\nmsgid \"Decimal numbers separated by \\\",\\\" or Base64-encoded strings.\"\nmsgstr \"Десятичные числа через запятую или строки в кодировке Base64.\"\n\nmsgid \"Camouflage Domain\"\nmsgstr \"Маскировочный домен\"\n\nmsgid \"Camouflage Type\"\nmsgstr \"Тип маскировки\"\n\nmsgid \"Transport Layer Encryption\"\nmsgstr \"Шифрование транспортного уровня\"\n\nmsgid \"Whether or not transport layer encryption is enabled, \\\"none\\\" for unencrypted, \\\"tls\\\" for using TLS, \\\"xtls\\\" for using XTLS.\"\nmsgstr \"Включено ли шифрование транспортного уровня: «none» — без шифрования, «tls» — TLS, «xtls» — XTLS.\"\n\nmsgid \"Original Trojan only supported 'tls', please choose 'tls'.\"\nmsgstr \"Оригинальный Trojan поддерживает только 'tls' — выберите этот вариант.\"\n\nmsgid \"Transfer mode\"\nmsgstr \"Режим передачи\"\n\nmsgid \"Do not send server name in ClientHello.\"\nmsgstr \"Не отправлять имя сервера в ClientHello.\"\n\nmsgid \"Domain\"\nmsgstr \"Домен\"\n\nmsgid \"allowInsecure\"\nmsgstr \"Пропускать проверку сертификата\"\n\nmsgid \"Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.\"\nmsgstr \"Разрешить соединения без проверки сертификата. При включении валидация будет пропущена.\"\n\nmsgid \"Used when the node link does not include this parameter.\"\nmsgstr \"Используется, если в ссылке на узел этот параметр отсутствует.\"\n\nmsgid \"%s Node Use Type\"\nmsgstr \"Тип использования сервера %s\"\n\nmsgid \"Set the TUIC proxy server ip address\"\nmsgstr \"Указать IP-адрес сервера TUIC\"\n\nmsgid \"TUIC User Password For Connect Remote Server\"\nmsgstr \"Пароль для подключения к удалённому серверу TUIC\"\n\nmsgid \"TUIC UserName For Local Socks\"\nmsgstr \"Имя пользователя для локального SOCKS TUIC\"\n\nmsgid \"TUIC Password For Local Socks\"\nmsgstr \"Пароль для локального SOCKS TUIC\"\n\nmsgid \"UDP relay mode\"\nmsgstr \"Режим ретрансляции UDP\"\n\nmsgid \"Concurrent Tunnels\"\nmsgstr \"Одновременные туннели\"\n\nmsgid \"Congestion control algorithm\"\nmsgstr \"Алгоритм контроля перегрузок\"\n\nmsgid \"Heartbeat interval(second)\"\nmsgstr \"Интервал heartbeat-пакетов (сек)\"\n\nmsgid \"Timeout for establishing a connection to server(second)\"\nmsgstr \"Тайм-аут установки соединения с сервером (сек)\"\n\nmsgid \"Garbage collection interval(second)\"\nmsgstr \"Интервал очистки фрагментов UDP (сек)\"\n\nmsgid \"Garbage collection lifetime(second)\"\nmsgstr \"Время жизни фрагментов UDP на сервере (сек)\"\n\nmsgid \"Disable SNI\"\nmsgstr \"Отключить SNI\"\n\nmsgid \"Enable 0-RTT QUIC handshake\"\nmsgstr \"Включить 0-RTT рукопожатие QUIC\"\n\nmsgid \"TUIC send window\"\nmsgstr \"Окно отправки TUIC (макс. байт без подтверждения: по умолчанию 8 МБ × 2)\"\n\nmsgid \"TUIC receive window\"\nmsgstr \"Окно приёма TUIC (макс. байт без подтверждения: по умолчанию 8 МБ)\"\n\nmsgid \"TUIC Maximum packet size the socks5 server can receive from external, in bytes\"\nmsgstr \"Макс. размер пакета, который SOCKS5-сервер TUIC может принять извне (в байтах)\"\n\nmsgid \"Set if the listening socket should be dual-stack\"\nmsgstr \"Включить поддержку dual-stack для слушающего сокета\"\n\nmsgid \"<br />none: default, no masquerade, data sent is packets with no characteristics.<br />srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime).<br />utp: packets disguised as uTP will be recognized as bittorrent downloaded data.<br />wechat-video: packets disguised as WeChat video calls.<br />dtls: disguised as DTLS 1.2 packet.<br />wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)<br />dns: Disguising traffic as DNS requests.\"\nmsgstr \"<br />none: по умолчанию, без маскировки, данные отправляются обычными пакетами.<br />srtp: маскировка под SRTP — трафик определяется как видеозвонок (например, FaceTime).<br />utp: маскировка под uTP — трафик определяется как BitTorrent.<br />wechat-video: маскировка под видеозвонок WeChat.<br />dtls: маскировка под DTLS 1.2.<br />wireguard: маскировка под WireGuard (не настоящий протокол WireGuard).<br />dns: маскировка трафика под DNS-запросы.\"\n\nmsgid \"Use it together with the DNS disguised type. You can fill in any domain.\"\nmsgstr \"Используется вместе с типом маскировки DNS. Можно указать любой домен.\"\n\nmsgid \"Auth\"\nmsgstr \"Аутентификация\"\n\nmsgid \"Socks for authentication\"\nmsgstr \"Аутентификация SOCKS\"\n\nmsgid \"Socks protocol authentication, support anonymous and password.\"\nmsgstr \"Метод аутентификации SOCKS: анонимный или по логину/паролю.\"\n\nmsgid \"anonymous\"\nmsgstr \"анонимно\"\n\nmsgid \"User Password\"\nmsgstr \"Логин и пароль\"\n\nmsgid \"Username and Password must be used together!\"\nmsgstr \"Логин и пароль должны быть указаны вместе!\"\n\nmsgid \"Prefer firewall tools\"\nmsgstr \"Предпочтительный инструмент фаервола\"\n\nmsgid \"IPv6 TProxy\"\nmsgstr \"IPv6 TProxy\"\n\nmsgid \"Experimental feature. Make sure that your node supports IPv6.\"\nmsgstr \"Экспериментальная функция. Убедитесь, что ваш сервер поддерживает IPv6.\"\n\nmsgid \"Status info\"\nmsgstr \"Информация о статусе\"\n\nmsgid \"Big icon\"\nmsgstr \"Крупный значок\"\n\nmsgid \"Show node check\"\nmsgstr \"Показывать проверку серверов\"\n\nmsgid \"Show Show IP111\"\nmsgstr \"Показывать IP111\"\n\nmsgid \"Destination protocol\"\nmsgstr \"Целевой протокол\"\n\nmsgid \"Destination address\"\nmsgstr \"Целевой адрес\"\n\nmsgid \"Destination port\"\nmsgstr \"Целевой порт\"\n\nmsgid \"Whether to receive PROXY protocol, when this node want to be fallback or forwarded by proxy, it must be enable, otherwise it cannot be used.\"\nmsgstr \"Принимать ли PROXY protocol. Если этот сервер используется для fallback или перенаправления через прокси, опция должна быть включена, иначе работа невозможна.\"\n\nmsgid \"outbound node\"\nmsgstr \"Исходящий сервер\"\n\nmsgid \"Custom Socks\"\nmsgstr \"Пользовательский SOCKS\"\n\nmsgid \"Custom HTTP\"\nmsgstr \"Пользовательский HTTP\"\n\nmsgid \"Custom Interface\"\nmsgstr \"Пользовательский интерфейс\"\n\nmsgid \"Interface\"\nmsgstr \"Интерфейс\"\n\nmsgid \"Bind Local\"\nmsgstr \"Только для localhost\"\n\nmsgid \"When selected, it can only be accessed localhost.\"\nmsgstr \"Если включено, доступ возможен только с самого роутера.\"\n\nmsgid \"Accept LAN Access\"\nmsgstr \"Разрешить доступ из LAN\"\n\nmsgid \"When selected, it can accessed lan , this will not be safe!\"\nmsgstr \"Если включено, сервис будет доступен из локальной сети. Это небезопасно! (Не рекомендуется без необходимости).\"\n\nmsgid \"Enable Remote\"\nmsgstr \"Включить перенаправление\"\n\nmsgid \"You can forward to Nginx/Caddy/V2ray/Xray WebSocket and more.\"\nmsgstr \"Можно перенаправлять на Nginx/Caddy/V2Ray/Xray WebSocket и другие сервисы.\"\n\nmsgid \"Remote Address\"\nmsgstr \"Удалённый адрес\"\n\nmsgid \"Remote Port\"\nmsgstr \"Удалённый порт\"\n\nmsgid \"as:\"\nmsgstr \"например:\"\n\nmsgid \"Public key absolute path\"\nmsgstr \"Полный путь к публичному ключу\"\n\nmsgid \"Private key absolute path\"\nmsgstr \"Полный путь к приватному ключу\"\n\nmsgid \"Can't find this file!\"\nmsgstr \"Файл не найден!\"\n\nmsgid \"Public key and Private key path can not be empty!\"\nmsgstr \"Пути к публичному и приватному ключам не могут быть пустыми!\"\n\nmsgid \"Server-Side\"\nmsgstr \"Серверная часть\"\n\nmsgid \"Server Config\"\nmsgstr \"Конфигурация сервера\"\n\nmsgid \"Users Manager\"\nmsgstr \"Управление пользователями\"\n\nmsgid \"Logs\"\nmsgstr \"Журнал\"\n\nmsgid \"Log\"\nmsgstr \"Журнал\"\n\nmsgid \"Enable Node Log\"\nmsgstr \"Запись журнала\"\n\nmsgid \"Log Level\"\nmsgstr \"Уровень записи журнала\"\n\nmsgid \"Not enabled log\"\nmsgstr \"Запись журнала отключена\"\n\nmsgid \"UDP Forward\"\nmsgstr \"UDP-перенаправление\"\n\nmsgid \"DNS Settings\"\nmsgstr \"Настройки DNS\"\n\nmsgid \"Null\"\nmsgstr \"Нет\"\n\nmsgid \"You did not fill in the %s path. Please save and apply then update manually.\"\nmsgstr \"Вы не указали путь к %s. Сохраните настройки, затем выполните обновление вручную.\"\n\nmsgid \"Not installed %s, Can't unzip!\"\nmsgstr \"%s не установлен — распаковка невозможна.\"\n\nmsgid \"Can't determine ARCH, or ARCH not supported.\"\nmsgstr \"Не удалось определить архитектуру, или она не поддерживается.\"\n\nmsgid \"Get remote version info failed.\"\nmsgstr \"Не удалось получить информацию о версии с сервера.\"\n\nmsgid \"New version found, but failed to get new version download url.\"\nmsgstr \"Обнаружена новая версия, но не удалось получить ссылку для загрузки.\"\n\nmsgid \"Download url is required.\"\nmsgstr \"Необходимо указать URL для загрузки.\"\n\nmsgid \"File download failed or timed out: %s\"\nmsgstr \"Ошибка загрузки файла или тайм-аут: %s\"\n\nmsgid \"File path required.\"\nmsgstr \"Необходимо указать путь к файлу.\"\n\nmsgid \"%s not enough space.\"\nmsgstr \"Недостаточно места для %s.\"\n\nmsgid \"Can't find client in file: %s\"\nmsgstr \"Не удалось найти клиент в файле: %s\"\n\nmsgid \"Client file is required.\"\nmsgstr \"Необходимо указать файл клиента.\"\n\nmsgid \"The client file is not suitable for current device.\"\nmsgstr \"Файл клиента не подходит для текущего устройства.\"\n\nmsgid \"Can't move new file to path: %s\"\nmsgstr \"Не удалось переместить файл в: %s\"\n\nmsgid \"An XHttpObject in JSON format, used for sharing.\"\nmsgstr \"XHttpObject в формате JSON, используется для обмена настройками.\"\n\nmsgid \"Enable Mux.Cool\"\nmsgstr \"Включить Mux.Cool\"\n\nmsgid \"Mux concurrency\"\nmsgstr \"Макс. параллельных соединений\"\n\nmsgid \"XUDP Mux concurrency\"\nmsgstr \"Макс. параллельных соединений XUDP\"\n\nmsgid \"Padding\"\nmsgstr \"Заполнение\"\n\nmsgid \"Enable early data\"\nmsgstr \"Включить 0-RTT данные\"\n\nmsgid \"Early data length\"\nmsgstr \"Макс. длина 0-RTT данных\"\n\nmsgid \"Early data header name\"\nmsgstr \"Имя HTTP-заголовка для 0-RTT\"\n\nmsgid \"Recommended value: Sec-WebSocket-Protocol\"\nmsgstr \"Рекомендуемое значение: Sec-WebSocket-Protocol\"\n\nmsgid \"Health check\"\nmsgstr \"Проверка доступности\"\n\nmsgid \"Health check timeout\"\nmsgstr \"Тайм-аут проверки\"\n\nmsgid \"Permit without stream\"\nmsgstr \"Проверка без активного потока\"\n\nmsgid \"Initial Windows Size\"\nmsgstr \"Начальный размер окна\"\n\nmsgid \"Excluded Domains\"\nmsgstr \"Исключённые домены\"\n\nmsgid \"If the traffic sniffing result is in this list, the destination address will not be overridden.\"\nmsgstr \"Если результат анализа трафика есть в этом списке, целевой адрес не будет заменён.\"\n\nmsgid \"Buffer Size\"\nmsgstr \"Размер буфера\"\n\nmsgid \"Buffer size for every connection (kB)\"\nmsgstr \"Размер буфера для каждого соединения (КБ)\"\n\nmsgid \"Idle Timeout\"\nmsgstr \"Тайм-аут простоя\"\n\nmsgid \"Hop Interval(second)\"\nmsgstr \"Интервал прыжков (секунды)\"\n\nmsgid \"Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5.\"\nmsgstr \"Поддерживается фиксированное значение или случайный диапазон (например, 30, 5-30), минимум 5.\"\n\nmsgid \"HeartbeatPeriod(second)\"\nmsgstr \"Период heartbeat-пакетов (сек)\"\n\nmsgid \"Override the connection destination address\"\nmsgstr \"Заменять целевой адрес соединения\"\n\nmsgid \"Override the connection destination address with the sniffed domain.<br />Otherwise use sniffed domain for routing only.<br />If using shunt nodes, configure the domain shunt rules correctly.\"\nmsgstr \"Заменять целевой адрес на домен, полученный при анализе трафика.<br />Иначе домен будет использоваться только для маршрутизации.<br />При использовании серверов разделения трафика правильно настройте правила доменной маршрутизации.\"\n\nmsgid \"Handshake Server\"\nmsgstr \"Сервер рукопожатия\"\n\nmsgid \"Handshake Server Port\"\nmsgstr \"Порт сервера рукопожатия\"\n\nmsgid \"Protocol parameter. Will waste traffic randomly if enabled.\"\nmsgstr \"Параметр протокола. При включении случайным образом увеличивает расход трафика.\"\n\nmsgid \"Protocol parameter. Enable length block encryption.\"\nmsgstr \"Параметр протокола. Включает шифрование блоков длины.\"\n\nmsgid \"TLS Chain Fingerprint (SHA256)\"\nmsgstr \"Отпечаток цепочки TLS (SHA256)\"\n\nmsgid \"Once set, connects only when the server's chain fingerprint matches.\"\nmsgstr \"После установки соединение возможно только при совпадении отпечатка цепочки сервера.\"\n\nmsgid \"TLS Certificate Name (CertName)\"\nmsgstr \"Имя TLS-сертификата (CertName)\"\n\nmsgid \"TLS is used to verify the leaf certificate name.\"\nmsgstr \"Используется TLS для проверки имени конечного сертификата.\"\n\nmsgid \"ECH Config\"\nmsgstr \"Конфигурация ECH\"\n\nmsgid \"ECH Key\"\nmsgstr \"Ключ ECH\"\n\nmsgid \"ECH Query Policy\"\nmsgstr \"Политика запросов ECH\"\n\nmsgid \"Controls the policy used when performing DNS queries for ECH configuration.\"\nmsgstr \"Управляет политикой DNS-запросов для получения конфигурации ECH.\"\n\nmsgid \"ECH Query Domain\"\nmsgstr \"Домен запроса ECH\"\n\nmsgid \"Overrides the domain name used for ECH HTTPS record queries.\"\nmsgstr \"Переопределяет доменное имя, используемое для запросов записей ECH HTTPS.\"\n\nmsgid \"Enable Multipath TCP, need to be enabled in both server and client configuration.\"\nmsgstr \"Включить Multipath TCP. Должно быть активировано и на сервере, и на клиенте.\"\n\nmsgid \"An FinalMaskObject in JSON format, used for sharing.\"\nmsgstr \"Объект FinalMaskObject в формате JSON, используемый для обмена данными.\"\n\nmsgid \"Custom finalmask overrides mkcp, hysteria2, fragment, noise, and related settings.\"\nmsgstr \"Пользовательская настройка finalmask переопределяет параметры mkcp, hysteria2, fragment, noise и связанные с ними настройки.\"\n\nmsgid \"Fragment\"\nmsgstr \"Фрагментация\"\n\nmsgid \"TCP fragments, which can deceive the censorship system in some cases, such as bypassing SNI blacklists.\"\nmsgstr \"Фрагментация TCP-пакетов. В некоторых случаях помогает обходить системы цензуры, например, чёрные списки SNI.\"\n\nmsgid \"Fragment Packets\"\nmsgstr \"Способ фрагментации\"\n\nmsgid \"\\\"1-3\\\" is for segmentation at TCP layer, applying to the beginning 1 to 3 data writes by the client. \\\"tlshello\\\" is for TLS client hello packet fragmentation.\"\nmsgstr \"«1–3» — фрагментация TCP для первых 1–3 отправок данных клиентом. «tlshello» — фрагментация пакета TLS ClientHello.\"\n\nmsgid \"Fragment Length\"\nmsgstr \"Длина фрагмента\"\n\nmsgid \"Fragmented packet length (byte)\"\nmsgstr \"Длина фрагментированного пакета (байт)\"\n\nmsgid \"Fragment Delay\"\nmsgstr \"Задержка фрагмента\"\n\nmsgid \"Fragmentation interval (ms)\"\nmsgstr \"Интервал между фрагментами (мс)\"\n\nmsgid \"Max Split\"\nmsgstr \"Максимальное разделение\"\n\nmsgid \"Limit the maximum number of splits.\"\nmsgstr \"Ограничьте максимальное количество разделений.\"\n\nmsgid \"Split handshake data into multiple TLS records for better censorship evasion. Low overhead. Recommended to enable first.\"\nmsgstr \"Разбивать данные рукопожатия на несколько TLS-записей для лучшего обхода цензуры. Малая нагрузка. Рекомендуется включить в первую очередь.\"\n\nmsgid \"Split handshake into multiple TCP segments. Enhances obfuscation. May increase delay. Use only if needed.\"\nmsgstr \"Разбивать рукопожатие на несколько TCP-сегментов. Усиливает маскировку. Может увеличить задержку. Использовать только при необходимости.\"\n\nmsgid \"Noise\"\nmsgstr \"Шум\"\n\nmsgid \"UDP noise, Under some circumstances it can bypass some UDP based protocol restrictions.\"\nmsgstr \"UDP-шум. В некоторых случаях помогает обходить ограничения, наложенные на UDP-протоколы.\"\n\nmsgid \"To send noise packets, select \\\"Noise\\\" in Xray Settings.\"\nmsgstr \"Чтобы отправлять шумовые пакеты, включите «Шум» в настройках Xray.\"\n\nmsgid \"Xray Noise Packets\"\nmsgstr \"Пакеты шума Xray\"\n\nmsgid \"Packet | Rand Length\"\nmsgstr \"Пакет | Длина ранда\"\n\nmsgid \"Delay (ms)\"\nmsgstr \"Задержка (мс)\"\n\nmsgid \"If is domain name, The requested domain name will be resolved to IP before connect.\"\nmsgstr \"Если указано доменное имя, оно будет разрешено в IP-адрес перед подключением.\"\n\nmsgid \"Domain DNS Resolve\"\nmsgstr \"Разрешение DNS-запросов для домена\"\n\nmsgid \"If the node address is a domain name, this DNS will be used for resolution.\"\nmsgstr \"Если адрес узла является доменным именем, для разрешения будет использоваться этот DNS-сервер.\"\n\nmsgid \"Supports only Xray or Sing-box node types.\"\nmsgstr \"Поддерживаются только узлы типа Xray или Sing-box.\"\n\nmsgid \"Chain Proxy\"\nmsgstr \"Цепочка прокси\"\n\nmsgid \"Landing Node\"\nmsgstr \"Сервер выхода\"\n\nmsgid \"Only support a layer of proxy.\"\nmsgstr \"Поддерживается только один уровень цепочки.\"\n\nmsgid \"\"\n\"Chained proxy works only with Xray or Sing-box nodes.<br>\"\n\"You can only use manual or imported nodes as chained nodes.\"\nmsgstr \"\"\n\"Цепочка прокси работает только с серверами Xray или Sing-Box.<br>\"\n\"В качестве звеньев цепочки можно использовать только серверы, добавленные вручную или импортированные.\"\n\nmsgid \"Prefer IPv4\"\nmsgstr \"Предпочитать IPv4\"\n\nmsgid \"Prefer IPv6\"\nmsgstr \"Предпочитать IPv6\"\n\nmsgid \"IPv4 Only\"\nmsgstr \"Только IPv4\"\n\nmsgid \"IPv6 Only\"\nmsgstr \"Только IPv6\"\n\nmsgid \"Maintain\"\nmsgstr \"Обслуживание\"\n\nmsgid \"Backup and Restore\"\nmsgstr \"Резервное копирование\"\n\nmsgid \"Backup or Restore Client and Server Configurations.\"\nmsgstr \"Создание или восстановление резервной копии настроек клиента и сервера.\"\n\nmsgid \"Note: Restoring configurations across different versions may cause compatibility issues.\"\nmsgstr \"Примечание: восстановление настроек между разными версиями может вызвать проблемы совместимости.\"\n\nmsgid \"Create Backup File\"\nmsgstr \"Создать резервную копию\"\n\nmsgid \"Restore Backup File\"\nmsgstr \"Восстановить из резервной копии\"\n\nmsgid \"DL Backup\"\nmsgstr \"Скачать резервную копию\"\n\nmsgid \"RST Backup\"\nmsgstr \"Восстановить из копии\"\n\nmsgid \"Backup failed!\"\nmsgstr \"Ошибка создания резервной копии!\"\n\nmsgid \"UL Restore\"\nmsgstr \"Загрузить и восстановить\"\n\nmsgid \"CLOSE WIN\"\nmsgstr \"Закрыть окно\"\n\nmsgid \"Restore to default configuration\"\nmsgstr \"Восстановить настройки по умолчанию\"\n\nmsgid \"Do Reset\"\nmsgstr \"Выполнить сброс\"\n\nmsgid \"Please select a file first.\"\nmsgstr \"Сначала выберите файл.\"\n\nmsgid \"Invalid file type. Please upload a .tar.gz file.\"\nmsgstr \"Недопустимый тип файла. Пожалуйста, загрузите файл .tar.gz.\"\n\nmsgid \"File size exceeds 10MB limit.\"\nmsgstr \"Размер файла превышает лимит 10 МБ.\"\n\nmsgid \"Do you want to restore the client to default settings?\"\nmsgstr \"Восстановить настройки клиента по умолчанию?\"\n\nmsgid \"Are you sure you want to restore the client to default settings?\"\nmsgstr \"Вы действительно хотите восстановить настройки клиента по умолчанию?\"\n\nmsgid \"Configuration file uploaded successfully…\"\nmsgstr \"Файл конфигурации успешно загружен…\"\n\nmsgid \"Configuration restored successfully…\"\nmsgstr \"Конфигурация успешно восстановлена…\"\n\nmsgid \"Service restarting…\"\nmsgstr \"Перезапуск службы…\"\n\nmsgid \"Configuration file decompression failed, please try again!\"\nmsgstr \"Ошибка распаковки файла конфигурации, попробуйте ещё раз!\"\n\nmsgid \"_urltest\"\nmsgstr \"_urltest\"\n\nmsgid \"URLTest node list\"\nmsgstr \"Список серверов для URLTest\"\n\nmsgid \"List of nodes to test, <a target='_blank' href='https://sing-box.sagernet.org/configuration/outbound/urltest'>document</a>\"\nmsgstr \"Список серверов для тестирования, <a target='_blank' href='https://sing-box.sagernet.org/zh/configuration/outbound/urltest'>документация</a>\"\n\nmsgid \"Test interval\"\nmsgstr \"Интервал тестирования\"\n\nmsgid \"Test interval must be less or equal than idle timeout.\"\nmsgstr \"Интервал тестирования не должен превышать тайм-аут простоя.\"\n\nmsgid \"Test tolerance\"\nmsgstr \"Допустимая погрешность\"\n\nmsgid \"The test tolerance in milliseconds.\"\nmsgstr \"Допустимая погрешность теста в миллисекундах.\"\n\nmsgid \"Idle timeout\"\nmsgstr \"Тайм-аут простоя\"\n\nmsgid \"The idle timeout.\"\nmsgstr \"Время бездействия до отключения.\"\n\nmsgid \"Interrupt existing connections\"\nmsgstr \"Разрывать активные соединения\"\n\nmsgid \"Interrupt existing connections when the selected outbound has changed.\"\nmsgstr \"Разрывать существующие соединения при смене выбранного исходящего сервера.\"\n\nmsgid \"Port hopping range\"\nmsgstr \"Диапазон смены портов\"\n\nmsgid \"Format as 1000:2000 or 1000-2000 Multiple groups are separated by commas (,).\"\nmsgstr \"Формат: 1000:2000 или 1000-2000. Несколько групп разделяются запятой (,).\"\n\nmsgid \"Use Custom Config\"\nmsgstr \"Использовать свою конфигурацию\"\n\nmsgid \"Custom Config\"\nmsgstr \"Пользовательская конфигурация\"\n\nmsgid \"Must be JSON text!\"\nmsgstr \"Должен быть JSON-текст!\"\n\nmsgid \"Geo View\"\nmsgstr \"Просмотр Geo\"\n\nmsgid \"Query\"\nmsgstr \"Запрос\"\n\nmsgid \"Querying\"\nmsgstr \"Идёт запрос...\"\n\nmsgid \"Please enter query content!\"\nmsgstr \"Пожалуйста, введите текст запроса!\"\n\nmsgid \"No results were found!\"\nmsgstr \"Ничего не найдено!\"\n\nmsgid \"Rules containing this value:\"\nmsgstr \"Правила, содержащие это значение:\"\n\nmsgid \"Domain/IP Query\"\nmsgstr \"Запрос домена/IP\"\n\nmsgid \"GeoIP/Geosite Query\"\nmsgstr \"Запрос GeoIP/Geosite\"\n\nmsgid \"Enter a domain or IP to query the Geo rule list they belong to.\"\nmsgstr \"Введите домен или IP, чтобы узнать, в какие Geo-правила они входят.\"\n\nmsgid \"Enter a GeoIP or Geosite to extract the domains/IPs they contain. Format: geoip:cn or geosite:gfw\"\nmsgstr \"Введите GeoIP или Geosite, чтобы получить список содержащихся в них доменов/IP. Формат: geoip:cn или geosite:gfw\"\n\nmsgid \"Tips:\"\nmsgstr \"Подсказки:\"\n\nmsgid \"By entering a domain or IP, you can query the Geo rule list they belong to.\"\nmsgstr \"Введя домен или IP, можно узнать, в какие Geo-правила он входит.\"\n\nmsgid \"By entering a GeoIP or Geosite, you can extract the domains/IPs they contain.\"\nmsgstr \"Введя GeoIP или Geosite, можно получить список содержащихся в них доменов/IP.\"\n\nmsgid \"Use the GeoIP/Geosite query function to verify if the entered Geo rules are correct.\"\nmsgstr \"Используйте функцию запроса GeoIP/Geosite для проверки корректности введённых Geo-правил.\"\n\nmsgid \"Private Key Passphrase\"\nmsgstr \"Парольная фраза приватного ключа\"\n\nmsgid \"Host Key\"\nmsgstr \"Ключ хоста\"\n\nmsgid \"Accept any if empty.\"\nmsgstr \"Если оставить пустым — принимать любой.\"\n\nmsgid \"Host Key Algorithms\"\nmsgstr \"Алгоритмы ключа хоста\"\n\nmsgid \"Client Version\"\nmsgstr \"Версия клиента\"\n\nmsgid \"Random version will be used if empty.\"\nmsgstr \"Если оставить пустым — будет использована случайная версия.\"\n\nmsgid \"The configured type also applies to the core specified when manually importing nodes.\"\nmsgstr \"Выбранный тип также применяется к ядру, указанному при ручном импорте серверов.\"\n\nmsgid \"Group Name\"\nmsgstr \"Название группы\"\n\nmsgid \"Reassign Group\"\nmsgstr \"Изменить группу\"\n\nmsgid \"Reassign Node Group\"\nmsgstr \"Изменить группу сервера\"\n\nmsgid \"Search nodes...\"\nmsgstr \"Поиск серверов...\"\n\nmsgid \"Using...\"\nmsgstr \"Используется.\"\n\nmsgid \"Generate configuration file and run\"\nmsgstr \"Сгенерировать конфигурацию и запустить\"\n\nmsgid \"Start after a delay of %s seconds!\"\nmsgstr \"Запуск с задержкой %s секунд!\"\n\nmsgid \"The script is already running, do not run it again. Exit.\"\nmsgstr \"Скрипт уже выполняется, повторный запуск отменён.\"\n\nmsgid \"Stop the script and wait for a timeout, then exit without repeating the process.\"\nmsgstr \"Остановка скрипта и ожидание тайм-аута, выход без повторного выполнения.\"\n\nmsgid \"Warning: The %s application environment is incomplete. Switch to %s. (%s)\"\nmsgstr \"Внимание: среда приложения %s неполная. Переключение на %s. (%s)\"\n\nmsgid \"Note: Dnsmasq (%s) is below 2.90. Upgrading is recommended to improve stability.\"\nmsgstr \"Примечание: версия Dnsmasq (%s) ниже 2.90. Рекомендуется обновить для повышения стабильности.\"\n\nmsgid \"Warning: %s transparent proxy is missing basic dependency %s!\"\nmsgstr \"Внимание: для прозрачного прокси %s отсутствует базовая зависимость %s!\"\n\nmsgid \"Warning: Not compatible with any transparent proxy system environment.\"\nmsgstr \"Внимание: несовместимо ни с одной средой прозрачного прокси.\"\n\nmsgid \"%s does not have execute permissions and cannot be started: %s %s\"\nmsgstr \"У %s нет прав на выполнение, запуск невозможен: %s %s\"\n\nmsgid \"%s not found, unable to start...\"\nmsgstr \"%s не найден, запуск невозможен...\"\n\nmsgid \"Socks node: [%s]%s is an invalid server address and cannot be started!\"\nmsgstr \"SOCKS-сервер: [%s]%s — недопустимый адрес, запуск невозможен!\"\n\nmsgid \"For some reason, the configuration for this Socks service has been lost, and its startup has been aborted!\"\nmsgstr \"По неизвестной причине конфигурация этого SOCKS-сервиса утеряна, запуск отменён!\"\n\nmsgid \"Socks node: [%s]%s, start failed %s:%s %s\"\nmsgstr \"SOCKS-сервер: [%s]%s, ошибка запуска %s:%s %s\"\n\nmsgid \"Socks node: [%s]%s, starting %s:%s\"\nmsgstr \"SOCKS-сервер: [%s]%s, запуск %s:%s\"\n\nmsgid \"To enable experimental IPv6 transparent proxy (TProxy), please ensure your node and type support IPv6!\"\nmsgstr \"Для включения экспериментального IPv6-прокси (TProxy) убедитесь, что ваш сервер и тип поддерживают IPv6!\"\n\nmsgid \"[%s] process %s error, skip this transparent proxy!\"\nmsgstr \"【%s】 ошибка процесса %s, этот прозрачный прокси пропускается!\"\n\nmsgid \"Analyzing the node configuration of the Socks service...\"\nmsgstr \"Анализ конфигурации сервера для SOCKS-сервиса...\"\n\nmsgid \"Log file is too long, clear it!\"\nmsgstr \"Файл журнала слишком большой, выполняется очистка!\"\n\nmsgid \"The task is currently running automatically as a scheduled task; no reconfiguration of the scheduled task is required.\"\nmsgstr \"Задача уже выполняется автоматически по расписанию, повторная настройка не требуется.\"\n\nmsgid \"Scheduled tasks: Auto stop service.\"\nmsgstr \"Планировщик: автоотключение службы.\"\n\nmsgid \"Scheduled tasks: Auto start service.\"\nmsgstr \"Планировщик: автозапуск службы.\"\n\nmsgid \"Scheduled tasks: Auto restart service.\"\nmsgstr \"Планировщик: автоперезапуск службы.\"\n\nmsgid \"Scheduled tasks: Auto update rules.\"\nmsgstr \"Планировщик: автообновление правил.\"\n\nmsgid \"Scheduled tasks: Auto update [%s] subscription.\"\nmsgstr \"Планировщик: автообновление подписки [%s].\"\n\nmsgid \"Auto updates: Starts a cyclical update process.\"\nmsgstr \"Автообновление: запуск циклического процесса обновления.\"\n\nmsgid \"Running in no proxy mode, it only allows scheduled tasks for starting and stopping services.\"\nmsgstr \"Работа в режиме без прокси: разрешены только задачи автозапуска и автоотключения службы.\"\n\nmsgid \"Clear scheduled commands.\"\nmsgstr \"Очистить запланированные команды.\"\n\nmsgid \"Unable to resolve [%s], route table addition failed!\"\nmsgstr \"Не удалось разрешить [%s], добавление в таблицу маршрутизации не выполнено!\"\n\nmsgid \"[%s] was successfully added to the routing table of interface [%s]!\"\nmsgstr \"[%s] успешно добавлен в таблицу маршрутизации интерфейса [%s]!\"\n\nmsgid \"Adding [%s] to the [%s] routing table failed! The reason is that the [%s] gateway cannot be found.\"\nmsgstr \"Добавление [%s] в таблицу маршрутизации [%s] не выполнено! Причина: не найден шлюз [%s].\"\n\nmsgid \"Global nodes are not enabled, skip [%s].\"\nmsgstr \"Глобальные серверы не включены, [%s] пропускается.\"\n\nmsgid \"Direct DNS: %s\"\nmsgstr \"Прямой DNS: %s\"\n\nmsgid \"Remote DNS: %s\"\nmsgstr \"Прокси-DNS: %s\"\n\nmsgid \"The program has started. Please stop it and then restart it!\"\nmsgstr \"Программа уже запущена. Пожалуйста, сначала остановите её, затем перезапустите!\"\n\nmsgid \"Running complete!\"\nmsgstr \"Выполнение завершено!\"\n\nmsgid \"Clearing and closing related programs and cache complete.\"\nmsgstr \"Очистка и завершение связанных процессов и кэша завершена.\"\n\nmsgid \"Incorrect index listing method (%s), execution terminated!\"\nmsgstr \"Неверный способ перечисления индексов (%s), выполнение прервано!\"\n\nmsgid \"parse the traffic splitting rules[%s]-[geoip:%s] add to %s to complete.\"\nmsgstr \"Разбор правил разделения трафика [%s]-[geoip:%s], добавление в %s завершено.\"\n\nmsgid \"Access Control:\"\nmsgstr \"Контроль доступа:\"\n\nmsgid \"Add node to the load balancer is directly connected to %s[%s].\"\nmsgstr \"Добавление сервера в балансировщик: прямое подключение к %s[%s] завершено.\"\n\nmsgid \"Add all %s nodes to %s[%s] direct connection complete.\"\nmsgstr \"Добавление всех серверов %s в %s[%s]: прямое подключение завершено.\"\n\nmsgid \"Starting to load %s firewall rules...\"\nmsgstr \"Начало загрузки правил фаервола %s...\"\n\nmsgid \"local network segments (%s) direct connection: %s\"\nmsgstr \"Локальные подсети (%s): прямое подключение: %s\"\n\nmsgid \"Add ISP %s DNS to the whitelist: %s\"\nmsgstr \"Добавление DNS провайдера %s в белый список: %s\"\n\nmsgid \"[%s]\"\nmsgstr \"【%s】\"\n\nmsgid \"[%s],\"\nmsgstr \"【%s】,\"\n\nmsgid \"Source iface [%s],\"\nmsgstr \"Исходящий интерфейс 【%s】,\"\n\nmsgid \"IP range [%s],\"\nmsgstr \"Диапазон IP 【%s】,\"\n\nmsgid \"All device,\"\nmsgstr \"Все устройства,\"\n\nmsgid \"Does not exist, ignore.\"\nmsgstr \"Не существует, пропущено.\"\n\nmsgid \"not proxy %s port [%s]\"\nmsgstr \"не прокси %s порт [%s]\"\n\nmsgid \"not proxy all %s\"\nmsgstr \"не прокси все %s\"\n\nmsgid \"Use the %s node [%s]\"\nmsgstr \"Использовать %s сервер [%s]\"\n\nmsgid \"Using a node that is different from the global configuration, DNS has been forcibly redirected to a dedicated DNS server.\"\nmsgstr \"Используется сервер, отличный от глобальной настройки: DNS принудительно перенаправлен на выделенный DNS-сервер.\"\n\nmsgid \"Add direct DNS to %s: %s\"\nmsgstr \"Добавление прямого DNS в %s: %s\"\n\nmsgid \"Local\"\nmsgstr \"Локально\"\n\nmsgid \"[Local],\"\nmsgstr \"【Локально】,\"\n\nmsgid \"Clear %s.\"\nmsgstr \"Очистка %s.\"\n\nmsgid \"Delete %s rules is complete.\"\nmsgstr \"Удаление правил %s завершено.\"\n\nmsgid \"%s firewall rules load complete!\"\nmsgstr \"Загрузка правил фаервола %s завершена!\"\n\nmsgid \"Socks switch detection: Unknown error.\"\nmsgstr \"Проверка переключения SOCKS: неизвестная ошибка.\"\n\nmsgid \"Socks switch detection: Unable to connect to the network. Please check if the network is working properly!\"\nmsgstr \"Проверка переключения SOCKS: не удалось подключиться к сети. Пожалуйста, проверьте работоспособность сети!\"\n\nmsgid \"Socks switch detection: Primary node 【%s: [%s]】 is normal. Switch to the primary node!\"\nmsgstr \"Проверка переключения SOCKS: основной сервер 【%s: [%s]】 работает нормально. Переключение на основной сервер!\"\n\nmsgid \"Socks switch detection: %s node switch complete!\"\nmsgstr \"Проверка переключения SOCKS: переключение сервера %s завершено!\"\n\nmsgid \"Socks switch detection: %s 【%s:[%s]】 normal.\"\nmsgstr \"Проверка переключения SOCKS: %s 【%s:[%s]】 работает нормально.\"\n\nmsgid \"switch to %s test detect!\"\nmsgstr \"Переключение на %s для проверки!\"\n\nmsgid \"backup node\"\nmsgstr \"резервный сервер\"\n\nmsgid \"next backup node\"\nmsgstr \"следующий резервный сервер\"\n\nmsgid \"main node\"\nmsgstr \"основной сервер\"\n\nmsgid \"Socks switch detection: %s 【%s:[%s]】 abnormal, %s\"\nmsgstr \"Проверка переключения SOCKS: %s 【%s:[%s]】 не работает, %s\"\n\nmsgid \"Socks switch detection: %s 【%s:[%s]】 normal, switch to this node!\"\nmsgstr \"Проверка переключения SOCKS: %s 【%s:[%s]】 работает нормально, переключение на этот сервер!\"\n\nmsgid \"Restart dnsmasq service.\"\nmsgstr \"Перезапуск службы dnsmasq.\"\n\nmsgid \"Console Port: %s\"\nmsgstr \"Порт консоли: %s\"\n\nmsgid \"Discard one obviously invalid node.\"\nmsgstr \"Отброшен 1 явно некорректный сервер.\"\n\nmsgid \"Entrance %s:%s\"\nmsgstr \"Вход %s:%s\"\n\nmsgid \"Node: %s:%s, Weight: %s\"\nmsgstr \"Сервер: %s:%s, вес: %s\"\n\nmsgid \"[Rule update] instance is running; please try again later.\"\nmsgstr \"Экземпляр [Обновление правила] запущен; пожалуйста, попробуйте позже.\"\n\nmsgid \"[Subscription] instance is running; [Rule Update] queue and wait.\"\nmsgstr \"Экземпляр [Подписка] запущен; [Обновление правила] поставить в очередь и ждать.\"\n\nmsgid \"Start updating the rules...\"\nmsgstr \"Начало обновления правил...\"\n\nmsgid \"Download file size verification error. Original file size: %sB. Downloaded file size: %sB.\"\nmsgstr \"Ошибка проверки размера файла. Исходный размер: %sB, загруженный: %sB.\"\n\nmsgid \"Downloaded file is empty or an error occurred while reading it.\"\nmsgstr \"Загруженный файл пуст или произошла ошибка при чтении.\"\n\nmsgid \"%s Start updating...\"\nmsgstr \"%s начало обновления...\"\n\nmsgid \"%s version is the same and does not need to be updated.\"\nmsgstr \"Версия %s совпадает, обновление не требуется.\"\n\nmsgid \"%s an error occurred during the file download process. Please try downloading again.\"\nmsgstr \"%s ошибка при загрузке файла. Пожалуйста, попробуйте ещё раз.\"\n\nmsgid \"%s an error occurred while downloading the file. Please check your network or the download link and try again!\"\nmsgstr \"%s ошибка при загрузке файла. Пожалуйста, проверьте сеть или ссылку и повторите попытку!\"\n\nmsgid \"%s update success.\"\nmsgstr \"%s обновлён успешно.\"\n\nmsgid \"%s update failed, please try again later or change URL.\"\nmsgstr \"%s обновление не удалось, попробуйте позже или измените URL.\"\n\nmsgid \"%s update error!\"\nmsgstr \"%s ошибка обновления!\"\n\nmsgid \"Restart the service and apply the new rules.\"\nmsgstr \"Перезапуск службы для применения новых правил.\"\n\nmsgid \"The rules have been updated...\"\nmsgstr \"Правила обновлены...\"\n\nmsgid \"Socks node list [%s]\"\nmsgstr \"Список SOCKS-серверов [%s]\"\n\nmsgid \"Backup node list\"\nmsgstr \"Список резервных серверов\"\n\nmsgid \"HAProxy node list [%s]\"\nmsgstr \"Список серверов HAProxy [%s]\"\n\nmsgid \"ACL list [%s]\"\nmsgstr \"Список ACL [%s]\"\n\nmsgid \"Shunt [%s] node\"\nmsgstr \"Сервер разделения [%s]\"\n\nmsgid \"Xray Load Balancing node [%s] list\"\nmsgstr \"Список серверов балансировки Xray [%s]\"\n\nmsgid \"Xray Load Balancing node [%s] backup node\"\nmsgstr \"Резервный сервер балансировки Xray [%s]\"\n\nmsgid \"Sing-Box URLTest node [%s] list\"\nmsgstr \"Список серверов Sing-Box URLTest [%s]\"\n\nmsgid \"Node [%s] preproxy node\"\nmsgstr \"Сервер [%s]: звено цепочки\"\n\nmsgid \"Node [%s] landing node\"\nmsgstr \"Сервер [%s]: финальное звено\"\n\nmsgid \"Skipping the %s node is due to incompatibility with the %s core program or incorrect node usage type settings.\"\nmsgstr \"Пропуск сервера %s: несовместимость с ядром %s или неверно задан тип использования.\"\n\nmsgid \"Skip node: %s. Because Sing-Box does not support the %s protocol's %s transmission method, Xray needs to be used instead.\"\nmsgstr \"Пропуск сервера: %s. Sing-Box не поддерживает метод передачи %s протокола %s, необходимо использовать Xray.\"\n\nmsgid \"Xray unsupport %s plugin.\"\nmsgstr \"Xray не поддерживает плагин %s.\"\n\nmsgid \"Plugin options Incomplete.\"\nmsgstr \"Опции плагина указаны не полностью.\"\n\nmsgid \"shadowsocks-libev unsupport 2022 encryption.\"\nmsgstr \"shadowsocks-libev не поддерживает шифрование 2022.\"\n\nmsgid \"Please replace %s to support %s transmission method.\"\nmsgstr \"Пожалуйста, замените %s, чтобы поддержать метод передачи %s.\"\n\nmsgid \"Please replace Xray or Sing-Box to support more transmission methods in Shadowsocks.\"\nmsgstr \"Пожалуйста, используйте Xray или Sing-Box для поддержки дополнительных методов передачи в Shadowsocks.\"\n\nmsgid \"unsupport %s plugin.\"\nmsgstr \"не поддерживает плагин %s.\"\n\nmsgid \"Skip the %s node because the %s core program is not installed.\"\nmsgstr \"Пропуск сервера %s: не установлено ядро %s.\"\n\nmsgid \"Skip the %s node, as %s type nodes require Sing-Box version 1.12 or higher.\"\nmsgstr \"Пропуск сервера %s: серверы типа %s требуют Sing-Box версии 1.12 или выше.\"\n\nmsgid \"%s type node subscriptions are not currently supported, skip this node.\"\nmsgstr \"Подписки на серверы типа %s пока не поддерживаются, этот сервер пропускается.\"\n\nmsgid \"Update [%s]\"\nmsgstr \"Обновление [%s]\"\n\nmsgid \"Matching node:\"\nmsgstr \"Найденный сервер:\"\n\nmsgid \"First Matching node:\"\nmsgstr \"Первый подходящий сервер:\"\n\nmsgid \"Second Matching node:\"\nmsgstr \"Второй подходящий сервер:\"\n\nmsgid \"Third Matching node:\"\nmsgstr \"Третий подходящий сервер:\"\n\nmsgid \"Fourth Matching node:\"\nmsgstr \"Четвёртый подходящий сервер:\"\n\nmsgid \"Fifth Matching node:\"\nmsgstr \"Пятый подходящий сервер:\"\n\nmsgid \"Unable to find the best matching node, now replaced with:\"\nmsgstr \"Не удалось найти наилучший сервер, текущая замена:\"\n\nmsgid \"Unable to find a new node. Please confirm and process manually.\"\nmsgstr \"Не удалось найти новый сервер. Пожалуйста, проверьте и обработайте вручную.\"\n\nmsgid \"No node information updates are available.\"\nmsgstr \"Нет доступных обновлений информации о серверах.\"\n\nmsgid \"Skip unknown types:\"\nmsgstr \"Пропуск неизвестных типов:\"\n\nmsgid \"Discard node: %s, Reason:\"\nmsgstr \"Отброшен узел: %s, причина:\"\n\nmsgid \"No usable binary was found.\"\nmsgstr \"Не найдено пригодного исполняемого файла.\"\n\nmsgid \"Discard filter nodes: %s type node %s\"\nmsgstr \"Отброшены узлы фильтра: тип %s, сервер %s\"\n\nmsgid \"Parsing error, skip this node.\"\nmsgstr \"Ошибка разбора, этот сервер пропускается.\"\n\nmsgid \"Successfully resolved the [%s] node, number: %s\"\nmsgstr \"Успешно разобран [%s], количество узлов: %s\"\n\nmsgid \"Get subscription content for [%s] is empty. This may be due to an invalid subscription address or a network problem. Please diagnose the issue!\"\nmsgstr \"Содержимое подписки [%s] пусто. Возможно, адрес подписки неверен или есть проблема с сетью. Пожалуйста, проведите диагностику!\"\n\nmsgid \"Proxy\"\nmsgstr \"Прокси\"\n\nmsgid \"[Subscription] instance is running; please try again later.\"\nmsgstr \"Экземпляр [Подписки] запущен; пожалуйста, попробуйте позже.\"\n\nmsgid \"[Rule Update] instance is running; [Subscription] queue and wait.\"\nmsgstr \"Экземпляр [Обновление правила] запущен; [Подписка] ставится в очередь и ожидает.\"\n\nmsgid \"Start subscribing...\"\nmsgstr \"Начало подписки...\"\n\nmsgid \"Start subscribing: %s\"\nmsgstr \"Начало подписки: %s\"\n\nmsgid \"Subscription: [%s] No changes, no update required.\"\nmsgstr \"Подписка: [%s] изменений нет, обновление не требуется.\"\n\nmsgid \"[%s] Subscription failed. This could be due to an invalid subscription address or a network issue. Please diagnose the problem! [%s]\"\nmsgstr \"[%s] Ошибка подписки. Возможно, адрес подписки неверен или есть проблема с сетью. Пожалуйста, проведите диагностику! [%s]\"\n\nmsgid \"Error, restoring service.\"\nmsgstr \"Ошибка, выполняется восстановление службы.\"\n\nmsgid \"Subscription complete...\"\nmsgstr \"Подписка завершена...\"\n\nmsgid \"Processing, please wait…\"\nmsgstr \"Обработка, пожалуйста, подождите…\"\n"
  },
  {
    "path": "luci-app-passwall2/po/zh-tw/passwall2.po",
    "content": "﻿msgid \"Auto\"\nmsgstr \"自動\"\n\nmsgid \"RUNNING\"\nmsgstr \"運行中\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"未運行\"\n\nmsgid \"Working...\"\nmsgstr \"連接正常\"\n\nmsgid \"Problem detected!\"\nmsgstr \"連接失敗\"\n\nmsgid \"Touch Check\"\nmsgstr \"點我檢測\"\n\nmsgid \"Global\"\nmsgstr \"全局\"\n\nmsgid \"Kernel Unsupported\"\nmsgstr \"內核不支持\"\n\nmsgid \"Basic Settings\"\nmsgstr \"基本設置\"\n\nmsgid \"Node List\"\nmsgstr \"節點列表\"\n\nmsgid \"Other Settings\"\nmsgstr \"高級設置\"\n\nmsgid \"Load Balancing\"\nmsgstr \"負載均衡\"\n\nmsgid \"Enter interface\"\nmsgstr \"進入界面\"\n\nmsgid \"Rule Manage\"\nmsgstr \"規則管理\"\n\nmsgid \"Rule List\"\nmsgstr \"規則列表\"\n\nmsgid \"Access control\"\nmsgstr \"訪問控制\"\n\nmsgid \"Watch Logs\"\nmsgstr \"查看日誌\"\n\nmsgid \"Node Config\"\nmsgstr \"節點配置\"\n\nmsgid \"Running Status\"\nmsgstr \"運行狀態\"\n\nmsgid \"Baidu Connection\"\nmsgstr \"百度連接\"\n\nmsgid \"Google Connection\"\nmsgstr \"谷歌連接\"\n\nmsgid \"GitHub Connection\"\nmsgstr \"GitHub連接\"\n\nmsgid \"Instagram Connection\"\nmsgstr \"Instagram連接\"\n\nmsgid \"Node Check\"\nmsgstr \"節點檢測\"\n\nmsgid \"Check...\"\nmsgstr \"檢測中...\"\n\nmsgid \"Clear\"\nmsgstr \"清除\"\n\nmsgid \"Main switch\"\nmsgstr \"主開關\"\n\nmsgid \"Node\"\nmsgstr \"節點\"\n\nmsgid \"Edit Current Node\"\nmsgstr \"編輯當前節點\"\n\nmsgid \"Localhost Proxy\"\nmsgstr \"路由器本機代理\"\n\nmsgid \"When selected, localhost can transparent proxy.\"\nmsgstr \"當勾選時，路由器本機可以透明代理。\"\n\nmsgid \"Client Proxy\"\nmsgstr \"客戶端代理\"\n\nmsgid \"When selected, devices in LAN can transparent proxy. Otherwise, it will not be proxy. But you can still use access control to allow the designated device to proxy.\"\nmsgstr \"當勾選時，局域網內的設備可以透明代理。否則，將不代理。但您仍然可以使用訪問控制允許指定的設備代理。\"\n\nmsgid \"Missing components, transparent proxy is unavailable.\"\nmsgstr \"缺少組件，透明代理無法使用。\"\n\nmsgid \"Socks Config\"\nmsgstr \"Socks 配置\"\n\nmsgid \"Socks Node\"\nmsgstr \"Socks 節點\"\n\nmsgid \"Current Node\"\nmsgstr \"當前節點\"\n\nmsgid \"Listen Port\"\nmsgstr \"監聽端口\"\n\nmsgid \"0 is not use\"\nmsgstr \"0為不使用\"\n\nmsgid \"Current node: %s\"\nmsgstr \"當前節點：%s\"\n\nmsgid \"Direct domain DNS routing\"\nmsgstr \"直連網域 DNS 分流\"\n\nmsgid \"Please note that the program will not start if the format is incorrect!\"\nmsgstr \"請注意，格式不正確將無法啟動！\"\n\nmsgid \"IP:Port mode acceptable, multi value split with english comma.\"\nmsgstr \"接受 IP:Port 形式的輸入，多個以英文逗号分隔。\"\n\nmsgid \"Direct DNS Protocol\"\nmsgstr \"直連 DNS 協議\"\n\nmsgid \"Direct DNS\"\nmsgstr \"直連 DNS\"\n\nmsgid \"Direct DNS DoH\"\nmsgstr \"直連 DNS DoH\"\n\nmsgid \"Direct DNS EDNS Client Subnet\"\nmsgstr \"直連 DNS EDNS Client Subnet\"\n\nmsgid \"Remote DNS Protocol\"\nmsgstr \"遠程 DNS 協議\"\n\nmsgid \"Remote DNS\"\nmsgstr \"遠程 DNS\"\n\nmsgid \"Remote DNS DoH\"\nmsgstr \"遠程 DNS DoH\"\n\nmsgid \"Remote DNS EDNS Client Subnet\"\nmsgstr \"遠程 DNS EDNS Client Subnet\"\n\nmsgid \"Notify the DNS server when the DNS query is notified, the location of the client (cannot be a private IP address).\"\nmsgstr \"用於 DNS 查詢時通知 DNS 服務器，客戶端所在的地理位置（不能是私有 IP 地址）。\"\n\nmsgid \"This feature requires the DNS server to support the Edns Client Subnet (RFC7871).\"\nmsgstr \"此功能需要 DNS 服務器支持 EDNS Client Subnet（RFC7871）。\"\n\nmsgid \"Remote DNS Outbound\"\nmsgstr \"遠程 DNS 出站\"\n\nmsgid \"Remote\"\nmsgstr \"遠程\"\n\nmsgid \"Direct\"\nmsgstr \"直連\"\n\nmsgid \"Direct Query Strategy\"\nmsgstr \"直連查詢策略\"\n\nmsgid \"Remote Query Strategy\"\nmsgstr \"遠程查詢策略\"\n\nmsgid \"Use FakeDNS work in the domain that proxy.\"\nmsgstr \"需要代理的域名使用 FakeDNS。\"\n\nmsgid \"Suitable scenarios for let the node servers get the target domain names.\"\nmsgstr \"適合讓節點伺服器取得目標網域的場景。\"\n\nmsgid \"Such as: DNS unlocking of streaming media, reducing DNS query latency, etc.\"\nmsgstr \"例如：流媒體的 DNS 解鎖、減少 DNS 查詢延遲等。\"\n\nmsgid \"Domain Override\"\nmsgstr \"域名重寫\"\n\nmsgid \"Direct DNS result write to IPSet\"\nmsgstr \"直連 DNS 解析結果寫入到 IPSet\"\n\nmsgid \"Perform the matching direct domain name rules into IP to IPSet/NFTSet, and then connect directly (not entering the core).\"\nmsgstr \"將匹配到的直連規則的網域解析IP寫入到 IPSet/NFTSet，然後直連（不進入核心）。\"\n\nmsgid \"Maybe conflict with some special circumstances.\"\nmsgstr \"可能和某些特殊情況衝突。\"\n\nmsgid \"DNS Redirect\"\nmsgstr \"DNS 重定向\"\n\nmsgid \"Force special DNS server to need proxy devices.\"\nmsgstr \"強制需要代理的設備使用專用 DNS 服務器。\"\n\nmsgid \"Clear IPSET\"\nmsgstr \"清空 IPSET\"\n\nmsgid \"Clear NFTSET\"\nmsgstr \"清空 NFTSET\"\n\nmsgid \"Try this feature if the rule modification does not take effect.\"\nmsgstr \"如果修改規則後沒有生效，請嘗試此功能。\"\n\nmsgid \"About DNS issues:\"\nmsgstr \"關於DNS問題：\"\n\nmsgid \"Some browsers may have built-in DNS, be sure to close. Example: Chrome. Settings - Security and Privacy - Security - Use secure DNS disabled.\"\nmsgstr \"部分瀏覽器可能有內置的DNS，請務必關閉。如：chrome。 設置 - 安全和隱私設置 - 使用安全 DNS 關閉。\"\n\nmsgid \"Sometimes after restart, you can not internet. At this time, close all browsers (important), Windows Client, please `ipconfig /flushdns`. Please close the WiFi on the phone, cut the flight mode and then cut back.\"\nmsgstr \"有時候重啟後，上不了。這時請先關閉所有瀏覽器（重要），Windows客戶端請`ipconfig /flushdns`。手機端請關閉WIFI，切一下飛行模式再切回來。\"\n\nmsgid \"The client DNS and the default gateway must point to this router.\"\nmsgstr \"客戶端DNS和默認網關必須指向本路由器。\"\n\nmsgid \"If you have a wrong DNS process, the consequences are at your own risk!\"\nmsgstr \"如果你自行配置了錯誤的DNS流程，後果自负！\"\n\nmsgid \"Hide menu method, input example in the address bar:\"\nmsgstr \"隱藏菜單方法，地址栏輸入例：\"\n\nmsgid \"After the hidden to the display, input example in the address bar:\"\nmsgstr \"當你隱藏後想再次顯示，地址栏輸入例：\"\n\nmsgid \"Are you sure to hide?\"\nmsgstr \"你確定要隱藏吗？\"\n\nmsgid \"DNS related issues:\"\nmsgstr \"DNS相關問題：\"\n\nmsgid \"Certain browsers such as Chrome have built-in DNS service, which may affect DNS resolution settings. You can go to 'Settings -> Privacy and security -> Use secure DNS' menu to turn it off.\"\nmsgstr \"某些瀏覽器如Chrome等內置此功能,這会影響設置的DNS解析。您可以進入 '設置->私隱和安全->使用安全DNS' 菜單,將其關閉。\"\n\nmsgid \"If you are unable to access the internet after reboot, please try clearing the cache of your terminal devices (make sure to close all open browser application windows first, this step is especially important):\"\nmsgstr \"如果在重啟後無法上網,請嘗試清除终端設備的缓存（先關閉所有正在使用的瀏覽器應用程序，這一步尤其重要）：\"\n\nmsgid \"For Windows systems, open Command Prompt and run the command 'ipconfig /flushdns'.\"\nmsgstr \"對於Windows系統,請在命令提示符中運行命令 'ipconfig /flushdns'.\"\n\nmsgid \"For Mac systems, open Terminal and run the command 'sudo killall -HUP mDNSResponder'.\"\nmsgstr \"對於Mac系統，在终端中運行命令 'sudo killall -HUP mDNSResponder'.\"\n\nmsgid \"For mobile devices, you can clear it by reconnecting to the network, such as toggling Airplane Mode and reconnecting to WiFi.\"\nmsgstr \"對於移動設備,可通過重新接入網絡的方式清除。比如開關一次飛行模式,重新連接WiFi。\"\n\nmsgid \"Please make sure your device's network settings point both the DNS server and default gateway to this router, to ensure DNS queries are properly routed.\"\nmsgstr \"請確認您設備的網絡設置,客戶端DNS服務器和默認網關應均指向本路由器,以確保DNS查詢正確路由。\"\n\nmsgid \"Browser access:\"\nmsgstr \"瀏覽器訪問：\"\n\nmsgid \"Hide in main menu:\"\nmsgstr \"在主菜單中隱藏：\"\n\nmsgid \"Show in main menu:\"\nmsgstr \"在主菜單中顯示：\"\n\nmsgid \"DNS Export Of Multi WAN\"\nmsgstr \"国內DNS指定解析出口\"\n\nmsgid \"Node Export Of Multi WAN\"\nmsgstr \"節點指定出口\"\n\nmsgid \"Only support Multi Wan.\"\nmsgstr \"只有多線接入才有效。\"\n\nmsgid \"Not Specify\"\nmsgstr \"不指定\"\n\nmsgid \"custom\"\nmsgstr \"自定义\"\n\nmsgid \"If not available, try clearing the cache.\"\nmsgstr \"如果無法使用，請嘗試清除缓存。\"\n\nmsgid \"Operation\"\nmsgstr \"操作\"\n\nmsgid \"Add Node\"\nmsgstr \"添加節點\"\n\nmsgid \"Add the node via the link\"\nmsgstr \"通過鏈接添加節點\"\n\nmsgid \"Enter share links, one per line. Subscription links are not supported!\"\nmsgstr \"輸入分享鏈接，支持多個節點，每行一個。請勿輸入訂閱鏈接！\"\n\nmsgid \"Please enter the correct link.\"\nmsgstr \"請輸入正確的鏈接。\"\n\nmsgid \"Clear all nodes\"\nmsgstr \"清空所有節點\"\n\nmsgid \"Are you sure to clear all nodes?\"\nmsgstr \"你確定要清空所有節點吗？\"\n\nmsgid \"Success\"\nmsgstr \"成功\"\n\nmsgid \"Error\"\nmsgstr \"錯誤\"\n\nmsgid \"Delete select nodes\"\nmsgstr \"刪除選择的節點\"\n\nmsgid \"To Top\"\nmsgstr \"置顶\"\n\nmsgid \"Select\"\nmsgstr \"選择\"\n\nmsgid \"Selected:\"\nmsgstr \"已選：\"\n\nmsgid \"DeSelect\"\nmsgstr \"反選\"\n\nmsgid \"Select all\"\nmsgstr \"全選\"\n\nmsgid \"DeSelect all\"\nmsgstr \"全不選\"\n\nmsgid \"Are you sure to delete select nodes?\"\nmsgstr \"你確定要刪除選择的節點吗？\"\n\nmsgid \"You no select nodes !\"\nmsgstr \"你沒有選择任何節點！\"\n\nmsgid \"Are you sure set to\"\nmsgstr \"你確定要設為\"\n\nmsgid \"the server?\"\nmsgstr \"服務器吗？\"\n\nmsgid \"You choose node is:\"\nmsgstr \"你選择的節點是：\"\n\nmsgid \"Timeout\"\nmsgstr \"超時\"\n\nmsgid \"Node Remarks\"\nmsgstr \"節點備注\"\n\nmsgid \"Add Mode\"\nmsgstr \"添加方式\"\n\nmsgid \"Save Order\"\nmsgstr \"儲存當前順序\"\n\nmsgid \"Saved current page order successfully.\"\nmsgstr \"儲存目前頁面順序成功。\"\n\nmsgid \"Drag to reorder\"\nmsgstr \"拖曳以重排\"\n\nmsgid \"Type\"\nmsgstr \"類型\"\n\nmsgid \"_balancing\"\nmsgstr \"負載均衡\"\n\nmsgid \"_shunt\"\nmsgstr \"分流\"\n\nmsgid \"Balancing\"\nmsgstr \"負載均衡\"\n\nmsgid \"Node Addition Method\"\nmsgstr \"節點新增方式\"\n\nmsgid \"Manual\"\nmsgstr \"手動\"\n\nmsgid \"Batch\"\nmsgstr \"批量\"\n\nmsgid \"Select Group\"\nmsgstr \"選擇分組\"\n\nmsgid \"Node Matching Rules\"\nmsgstr \"節點匹配規則\"\n\nmsgid \"\"\n\"Example: <code>^A && B && !C && D$</code><br>\"\n\"This means the node remark must start with A (^), include B, exclude C (!), and end with D ($).<br>\"\n\"Conditions are joined by <code>&&</code>, and their order does not affect the result.\"\nmsgstr \"\"\n\"示例：<code>^A && B && !C && D$</code><br>\"\n\"表示節點備註需同時滿足：以 A 開頭（^）、包含 B、不包含 C（!）、並以 D 結尾（$）。<br>\"\n\"多個條件使用 <code>&&</code> 連接，條件順序不影響結果。\"\n\nmsgid \"Balancing Strategy\"\nmsgstr \"負載均衡策略\"\n\nmsgid \"Fallback Node\"\nmsgstr \"後備節點\"\n\nmsgid \"Use Custom Probe URL\"\nmsgstr \"使用自定义探測網址\"\n\nmsgid \"By default the built-in probe URL will be used, enable this option to use a custom probe URL.\"\nmsgstr \"默認使用內置的探測網址，啟用此選項以使用自定义探測網址。\"\n\nmsgid \"Probe URL\"\nmsgstr \"探測網址\"\n\nmsgid \"The URL used to detect the connection status.\"\nmsgstr \"用於檢測連接状態的網址。\"\n\nmsgid \"Probe Interval\"\nmsgstr \"探測間隔\"\n\nmsgid \"The interval between initiating probes.\"\nmsgstr \"發起探測的間隔。\"\n\nmsgid \"The time format is numbers + units, such as '10s', '2h45m', and the supported time units are <code>s</code>, <code>m</code>, <code>h</code>, which correspond to seconds, minutes, and hours, respectively.\"\nmsgstr \"時間格式為數字+單位，比如<code>&quot;10s&quot;</code>, <code>&quot;2h45m&quot;</code>，支持的時間單位有 <code>s</code>，<code>m</code>，<code>h</code>，分别對應秒、分、時。\"\n\nmsgid \"When the unit is not filled in, it defaults to seconds.\"\nmsgstr \"未填寫單位時，默認為秒。\"\n\nmsgid \"Preferred Node Count\"\nmsgstr \"優選節點數量\"\n\nmsgid \"The load balancer selects the optimal number of nodes, and traffic is randomly distributed among them.\"\nmsgstr \"負載均衡器選出最優節點的個數，流量將在這几個節點中随機分配。\"\n\nmsgid \"Shunt\"\nmsgstr \"分流\"\n\nmsgid \"Preproxy\"\nmsgstr \"前置代理\"\n\nmsgid \"Preproxy Node\"\nmsgstr \"前置代理節點\"\n\nmsgid \"Set the node to be used as a pre-proxy.\"\nmsgstr \"設置用作前置代理的節點。\"\n\nmsgid \"Each rule has a separate switch that controls whether this rule uses the pre-proxy or not.\"\nmsgstr \"每条規則都有独立開關控制本規則是否使用前置代理。\"\n\nmsgid \"Close (Not use)\"\nmsgstr \"關閉 (不使用)\"\n\nmsgid \"Use default node\"\nmsgstr \"使用默認節點\"\n\nmsgid \"Direct Connection\"\nmsgstr \"直連\"\n\nmsgid \"Blackhole (Block)\"\nmsgstr \"黑洞（屏蔽）\"\n\nmsgid \"There are no available nodes, please add or subscribe nodes first.\"\nmsgstr \"沒有可用節點，請先添加或訂閱節點。\"\n\nmsgid \"No shunt rules? Click me to go to add.\"\nmsgstr \"沒有分流規則？點我前往去添加。\"\n\nmsgid \"When using, localhost will connect this node first and then use this node to connect the default node.\"\nmsgstr \"當使用時，本機將首先連接到此節點，然後再使用此節點連接到默認節點落地。\"\n\nmsgid \"Domain Strategy\"\nmsgstr \"域名解析策略\"\n\nmsgid \"Domain matcher\"\nmsgstr \"域名匹配算法\"\n\nmsgid \"'AsIs': Only use domain for routing. Default value.\"\nmsgstr \"AsIs：只使用域名进行路由選择。默認值。\"\n\nmsgid \"'IPIfNonMatch': When no rule matches current domain, resolves it into IP addresses (A or AAAA records) and try all rules again.\"\nmsgstr \"IPIfNonMatch：當域名沒有匹配任何規則時，將域名解析成 IP（A 記錄或 AAAA 記錄）再次进行匹配。\"\n\nmsgid \"'IPOnDemand': As long as there is a IP-based rule, resolves the domain into IP immediately.\"\nmsgstr \"IPOnDemand：當匹配時碰到任何基於 IP 的規則，將域名立即解析為 IP 进行匹配。\"\n\nmsgid \"Load balancing node list\"\nmsgstr \"負載均衡節點列表\"\n\nmsgid \"Load balancing node list, <a target='_blank' href='https://xtls.github.io/config/routing.html#balancerobject'>document</a>\"\nmsgstr \"負載均衡節點列表，<a target='_blank' href='https://xtls.github.io/config/routing.html#balancerobject'>文檔原理</a>\"\n\nmsgid \"From Share URL\"\nmsgstr \"導入分享URL\"\n\nmsgid \"Build Share URL\"\nmsgstr \"導出分享URL\"\n\nmsgid \"Generate QRCode\"\nmsgstr \"生成二维码\"\n\nmsgid \"Export Config File\"\nmsgstr \"導出配置文件\"\n\nmsgid \"Import Finished\"\nmsgstr \"導入完成：\"\n\nmsgid \"Not a supported scheme:\"\nmsgstr \"不支持這种樣式的：\"\n\nmsgid \"Invalid Share URL Format\"\nmsgstr \"無效的分享URL信息\"\n\nmsgid \"Paste Share URL Here\"\nmsgstr \"在此处粘贴分享信息\"\n\nmsgid \"Share URL to clipboard unable.\"\nmsgstr \"無法分享URL到剪贴板。\"\n\nmsgid \"Share URL to clipboard successfully.\"\nmsgstr \"成功復制分享URL到剪贴板。\"\n\nmsgid \"Faltal on get option, please help in debug:\"\nmsgstr \"代码錯誤，請協助捉蟲：\"\n\nmsgid \"Faltal on set option, please help in debug:\"\nmsgstr \"代码錯誤，請協助捉蟲：\"\n\nmsgid \"Address\"\nmsgstr \"地址\"\n\nmsgid \"Address (Support Domain Name)\"\nmsgstr \"地址（支持域名）\"\n\nmsgid \"Trojan Verify Cert\"\nmsgstr \"驗證證書\"\n\nmsgid \"Trojan Cert Path\"\nmsgstr \"證書路径\"\n\nmsgid \"Finger Print\"\nmsgstr \"指紋伪造\"\n\nmsgid \"Avoid using randomized, unless you have to.\"\nmsgstr \"避免使用 randomized , 除非你必須要。\"\n\nmsgid \"Original\"\nmsgstr \"原版\"\n\nmsgid \"Transport Plugin\"\nmsgstr \"傳輸層插件\"\n\nmsgid \"Shadowsocks secondary encryption\"\nmsgstr \"Shadowsocks 二次加密\"\n\nmsgid \"Obfs Type\"\nmsgstr \"混淆類型\"\n\nmsgid \"Obfs Password\"\nmsgstr \"混淆密碼\"\n\nmsgid \"Auth Type\"\nmsgstr \"認證類型\"\n\nmsgid \"Auth Password\"\nmsgstr \"認證密碼\"\n\nmsgid \"Client BBR Flow Control\"\nmsgstr \"客戶端 BBR 流控\"\n\nmsgid \"Commands the client to use the BBR flow control algorithm\"\nmsgstr \"命令客戶端使用 BBR 流量控制算法\"\n\nmsgid \"PinSHA256\"\nmsgstr \"PinSHA256\"\n\nmsgid \"Certificate fingerprint\"\nmsgstr \"證書指紋\"\n\nmsgid \"Max upload Mbps\"\nmsgstr \"最大上行(Mbps)\"\n\nmsgid \"Max download Mbps\"\nmsgstr \"最大下行(Mbps)\"\n\nmsgid \"QUIC stream receive window\"\nmsgstr \"QUIC 流接收窗口\"\n\nmsgid \"QUIC connection receive window\"\nmsgstr \"QUIC 連接接收窗口\"\n\nmsgid \"QUIC concurrent bidirectional streams\"\nmsgstr \"QUIC 並發双向流的最大數量\"\n\nmsgid \"QUIC KeepAlive interval\"\nmsgstr \"QUIC KeepAlive 間隔\"\n\nmsgid \"Disable MTU detection\"\nmsgstr \"禁用 MTU 檢測\"\n\nmsgid \"ignoreClientBandwidth\"\nmsgstr \"忽略客戶端帶宽設置\"\n\nmsgid \"Lazy Start\"\nmsgstr \"延迟啟動\"\n\nmsgid \"Encrypt Method\"\nmsgstr \"加密方式\"\n\nmsgid \"Encrypt Key\"\nmsgstr \"加密密鑰\"\n\nmsgid \"Latency\"\nmsgstr \"延迟\"\n\nmsgid \"Automatic detection delay\"\nmsgstr \"自動檢測延迟\"\n\nmsgid \"Show server address and port\"\nmsgstr \"顯示服務器地址和端口\"\n\nmsgid \"URL Test Address\"\nmsgstr \"URL 測試地址\"\n\nmsgid \"URL Test\"\nmsgstr \"URL 測試\"\n\nmsgid \"Test\"\nmsgstr \"測試\"\n\nmsgid \"Node num\"\nmsgstr \"節點數量\"\n\nmsgid \"Self add\"\nmsgstr \"自添\"\n\nmsgid \"Apply\"\nmsgstr \"應用\"\n\nmsgid \"Use\"\nmsgstr \"使用\"\n\nmsgid \"Copy\"\nmsgstr \"復制\"\n\nmsgid \"Delay Settings\"\nmsgstr \"定時配置\"\n\nmsgid \"Open and close Daemon\"\nmsgstr \"啟動守護進程\"\n\nmsgid \"Delay Start\"\nmsgstr \"開機時延時啟動\"\n\nmsgid \"Units:seconds\"\nmsgstr \"單位：秒\"\n\nmsgid \"Units:minutes\"\nmsgstr \"單位：分鐘\"\n\nmsgid \"stop automatically mode\"\nmsgstr \"定時關閉模式\"\n\nmsgid \"stop Time(Every day)\"\nmsgstr \"關閉時間(每天)\"\n\nmsgid \"stop Interval(Hour)\"\nmsgstr \"關閉間隔(小時)\"\n\nmsgid \"start automatically mode\"\nmsgstr \"定時開啟模式\"\n\nmsgid \"start Time(Every day)\"\nmsgstr \"開啟時間(每天)\"\n\nmsgid \"start Interval(Hour)\"\nmsgstr \"開啟間隔(小時)\"\n\nmsgid \"restart automatically mode\"\nmsgstr \"定時重啟模式\"\n\nmsgid \"restart Time(Every day)\"\nmsgstr \"重啟時間(每天)\"\n\nmsgid \"restart Interval(Hour)\"\nmsgstr \"重啟間隔(小時)\"\n\nmsgid \"Forwarding Settings\"\nmsgstr \"转發配置\"\n\nmsgid \"TCP No Redir Ports\"\nmsgstr \"TCP不转發端口\"\n\nmsgid \"UDP No Redir Ports\"\nmsgstr \"UDP不转發端口\"\n\nmsgid \"Fill in the ports you don't want to be forwarded by the agent, with the highest priority.\"\nmsgstr \"填寫你不希望被代理转發的端口，優先級最高。\"\n\nmsgid \"If you don't want to let the device in the list to go proxy, please choose all.\"\nmsgstr \"如果您不想让列表中的設備走代理，請選择全部。\"\n\nmsgid \"The port settings support single ports and ranges.<br>Separate multiple ports with commas (,).<br>Example: 21,80,443,1000:2000.\"\nmsgstr \"以上端口設置支持單端口和端口範圍。<br>多個端口用英文逗号(,)隔開。<br>例：21,80,443,1000:2000。\"\n\nmsgid \"TCP Proxy Drop Ports\"\nmsgstr \"TCP转發屏蔽端口\"\n\nmsgid \"UDP Proxy Drop Ports\"\nmsgstr \"UDP转發屏蔽端口\"\n\nmsgid \"TCP Redir Ports\"\nmsgstr \"TCP转發端口\"\n\nmsgid \"UDP Redir Ports\"\nmsgstr \"UDP转發端口\"\n\nmsgid \"No patterns are used\"\nmsgstr \"不使用\"\n\nmsgid \"All\"\nmsgstr \"所有\"\n\nmsgid \"Common Use\"\nmsgstr \"常用的\"\n\nmsgid \"Only Web\"\nmsgstr \"仅網頁\"\n\nmsgid \"or more\"\nmsgstr \"及以上\"\n\nmsgid \"or less\"\nmsgstr \"及以下\"\n\nmsgid \"Default\"\nmsgstr \"默認\"\n\nmsgid \"Close\"\nmsgstr \"關閉\"\n\nmsgid \"Hijacking ICMP (PING)\"\nmsgstr \"劫持ICMP (PING)\"\n\nmsgid \"Hijacking ICMPv6 (IPv6 PING)\"\nmsgstr \"劫持ICMPv6 (IPv6 PING)\"\n\nmsgid \"Force Proxy LAN IP\"\nmsgstr \"強制代理內網IP段\"\n\nmsgid \"By default, commonly used internal network IP ranges will be connect directly (not entering the core). If you want a certain network range to go through a proxy, please add it here.\"\nmsgstr \"預設情況下，常用內網IP網段將直連（不進入核心），如果你希望某個網段走代理，請在此新增。\"\n\nmsgid \"Sniffing\"\nmsgstr \"流量嗅探\"\n\nmsgid \"TCP Proxy Way\"\nmsgstr \"TCP代理方式\"\n\nmsgid \"Auto Switch\"\nmsgstr \"自動切換\"\n\nmsgid \"When there is no server, an automatic reconnect scheme is used\"\nmsgstr \"當沒有服務器時，則使用自動重連方案\"\n\nmsgid \"How often to test\"\nmsgstr \"多久檢測一次\"\n\nmsgid \"Timeout seconds\"\nmsgstr \"超時秒數\"\n\nmsgid \"Timeout retry num\"\nmsgstr \"超時重試次數\"\n\nmsgid \"Automatic switching cannot be used when this option is checked\"\nmsgstr \"當勾選此選項時，不能使用自動切換\"\n\nmsgid \"Main node\"\nmsgstr \"主節點\"\n\nmsgid \"List of backup nodes\"\nmsgstr \"備用節點的列表\"\n\nmsgid \"Restore Switch\"\nmsgstr \"恢復切換\"\n\nmsgid \"When detects main node is available, switch back to the main node.\"\nmsgstr \"當檢測到主節點可用時，切換回主節點。\"\n\nmsgid \"Add nodes to the standby node list by keywords\"\nmsgstr \"通過關键字添加節點到備用節點列表\"\n\nmsgid \"Delete nodes in the standby node list by keywords\"\nmsgstr \"通過關键字刪除備用節點列表的節點\"\n\nmsgid \"Please enter the node keyword, pay attention to distinguish between spaces, uppercase and lowercase.\"\nmsgstr \"請輸入節點關键字，注意区分空格、大寫和小寫。\"\n\nmsgid \"Enable Load Balancing\"\nmsgstr \"開啟負載均衡\"\n\nmsgid \"Console Login Auth\"\nmsgstr \"控制臺登錄認證\"\n\nmsgid \"Console Username\"\nmsgstr \"控制臺账号\"\n\nmsgid \"Console Password\"\nmsgstr \"控制臺密碼\"\n\nmsgid \"Console Port\"\nmsgstr \"控制臺端口\"\n\nmsgid \"In the browser input routing IP plus port access, such as:192.168.1.1:1188\"\nmsgstr \"在瀏覽器輸入路由IP加端口訪問，如：192.168.1.1:1188\"\n\nmsgid \"Haproxy Port\"\nmsgstr \"負載均衡端口\"\n\nmsgid \"Health Check Type\"\nmsgstr \"健康檢查類型\"\n\nmsgid \"Inner implement\"\nmsgstr \"內置實现\"\n\nmsgid \"Health Check Inter\"\nmsgstr \"健康檢查節點間隔時間\"\n\nmsgid \"When the URL test is used, the load balancing node will be converted into a Socks node. when node list set customizing, must be a Socks node, otherwise the health check will be invalid.\"\nmsgstr \"當使用URL測試時，負載均衡節點將转換成Socks節點。下面的節點列表自定义時必須為Socks節點，否則健康檢查將無效。\"\n\nmsgid \"Add a node, Export Of Multi WAN Only support Multi Wan. Load specific gravity range 1-256. Multiple primary servers can be load balanced, standby will only be enabled when the primary server is offline! Multiple groups can be set, Haproxy port same one for each group.\"\nmsgstr \"添加節點，指定出口功能是為多WAN用戶准備的。負載比重範圍1-256。多個主服務器可以負載均衡，備用只有在主服務器离線時才会啟用！可以設置多個组，負載均衡端口相同則為一组。\"\n\nmsgid \"Note that the node configuration parameters for load balancing must be consistent when use TCP health check type, otherwise it cannot be used normally!\"\nmsgstr \"注意，當使用TCP健康檢查時負載均衡的節點配置參數必須一致，否則無法正常使用！\"\n\nmsgid \"Node Address\"\nmsgstr \"節點地址\"\n\nmsgid \"Node address cannot be empty.\"\nmsgstr \"節點地址不能為空。\"\n\nmsgid \"Node Port\"\nmsgstr \"節點端口\"\n\nmsgid \"Node Weight\"\nmsgstr \"負載比重\"\n\nmsgid \"Export Of Multi WAN\"\nmsgstr \"多WAN指定出口\"\n\nmsgid \"Main\"\nmsgstr \"主要\"\n\nmsgid \"Mode\"\nmsgstr \"模式\"\n\nmsgid \"Primary\"\nmsgstr \"主要\"\n\nmsgid \"Standby\"\nmsgstr \"備用\"\n\nmsgid \"Check update\"\nmsgstr \"檢查更新\"\n\nmsgid \"Force update\"\nmsgstr \"強制更新\"\n\nmsgid \"The latest version: %s, currently does not support automatic update, if you need to update, please compile or download the ipk and then manually install.\"\nmsgstr \"最新版本：%s，目前暫不支持自動更新，如需更新，請自行编译或下載ipk然後手動安装。\"\n\nmsgid \"Enable custom URL\"\nmsgstr \"啟用自定义規則地址\"\n\nmsgid \"Rule status\"\nmsgstr \"規則版本\"\n\nmsgid \"Manually update\"\nmsgstr \"手動更新\"\n\nmsgid \"Rollback\"\nmsgstr \"回滾\"\n\nmsgid \"Rollbacking...\"\nmsgstr \"回滾中...\"\n\nmsgid \"Enable auto update rules\"\nmsgstr \"開啟自動更新規則\"\n\nmsgid \"Update Time(every day)\"\nmsgstr \"更新時間(每天)\"\n\nmsgid \"Update Interval(hour)\"\nmsgstr \"更新間隔(小時)\"\n\nmsgid \"Update Mode\"\nmsgstr \"更新模式\"\n\nmsgid \"Loop Mode\"\nmsgstr \"循环\"\n\nmsgid \"Every day\"\nmsgstr \"每天\"\n\nmsgid \"Every Monday\"\nmsgstr \"每周一\"\n\nmsgid \"Every Tuesday\"\nmsgstr \"每周二\"\n\nmsgid \"Every Wednesday\"\nmsgstr \"每周三\"\n\nmsgid \"Every Thursday\"\nmsgstr \"每周四\"\n\nmsgid \"Every Friday\"\nmsgstr \"每周五\"\n\nmsgid \"Every Saturday\"\nmsgstr \"每周六\"\n\nmsgid \"Every Sunday\"\nmsgstr \"每周日\"\n\nmsgid \"hour\"\nmsgstr \"小時\"\n\nmsgid \"Hour\"\nmsgstr \"小時\"\n\nmsgid \"GeoIP Update URL\"\nmsgstr \"GeoIP 更新 URL\"\n\nmsgid \"Geosite Update URL\"\nmsgstr \"Geosite 更新 URL\"\n\nmsgid \"Location of Geo rule files\"\nmsgstr \"Geo 资源文件目錄\"\n\nmsgid \"This variable specifies a directory where geoip.dat and geosite.dat files are.\"\nmsgstr \"此變量指定geoip.dat和geosite.dat文件所在的目錄。\"\n\nmsgid \"Enable GeoIP Data Parsing\"\nmsgstr \"開啟 GeoIP 數据解析\"\n\nmsgid \"Analyzes and preloads GeoIP data to enhance the shunt performance.\"\nmsgstr \"分析和预加载 GeoIP 數据，以增強分流效果。\"\n\nmsgid \"Note: Increases resource usage.\"\nmsgstr \"注：会增加一些系統资源的開销。\"\n\nmsgid \"Shunt Rule\"\nmsgstr \"分流規則\"\n\nmsgid \"Please note attention to the priority, the higher the order, the higher the priority.\"\nmsgstr \"請注意優先級問題，排序越上面優先級越高。\"\n\nmsgid \"Update...\"\nmsgstr \"更新中\"\n\nmsgid \"It is the latest version\"\nmsgstr \"已是最新版本\"\n\nmsgid \"Update successful\"\nmsgstr \"更新成功\"\n\nmsgid \"Click to update\"\nmsgstr \"點击更新\"\n\nmsgid \"Updating...\"\nmsgstr \"更新中\"\n\nmsgid \"Retry\"\nmsgstr \"重試\"\n\nmsgid \"Unexpected error\"\nmsgstr \"意外錯誤\"\n\nmsgid \"Updating, are you sure to close?\"\nmsgstr \"正在更新，你確認要關閉吗？\"\n\nmsgid \"Downloading...\"\nmsgstr \"下載中\"\n\nmsgid \"Unpacking...\"\nmsgstr \"解压中\"\n\nmsgid \"Moving...\"\nmsgstr \"移動中\"\n\nmsgid \"App Update\"\nmsgstr \"组件更新\"\n\nmsgid \"Please confirm that your firmware supports FPU.\"\nmsgstr \"請確認你的固件支持FPU。\"\n\nmsgid \"if you want to run from memory, change the path, /tmp beginning then save the application and update it manually.\"\nmsgstr \"如果你希望从內存中運行，請更改路径，/tmp 開头，然後保存應用後，再手動更新。\"\n\nmsgid \"Make sure there is enough space to install %s\"\nmsgstr \"確保有足够的空間安装 %s\"\n\nmsgid \"App Path\"\nmsgstr \"程序路径\"\n\nmsgid \"%s App Path\"\nmsgstr \"%s 程序路径\"\n\nmsgid \"%s Client App Path\"\nmsgstr \"%s 客戶端程序路径\"\n\nmsgid \"Node Subscribe\"\nmsgstr \"節點訂閱\"\n\nmsgid \"Subscribe Remark\"\nmsgstr \"訂閱備注（機场）\"\n\nmsgid \"Subscribe Info\"\nmsgstr \"訂閱信息\"\n\nmsgid \"Subscribe URL\"\nmsgstr \"訂閱網址\"\n\nmsgid \"Subscribe URL Access Method\"\nmsgstr \"訂閱網址訪問方式\"\n\nmsgid \"When adding a new subscription, please save and apply before manually subscribing. If you only change the subscription URL, you can subscribe manually, and the system will save it automatically.\"\nmsgstr \"新增訂閱請先保存並應用後再手動訂閱；如仅修改訂閱地址，可直接手動訂閱，系統將自動保存。\"\n\nmsgid \"Please save and apply before manually subscribing.\"\nmsgstr \"請先保存並應用後再手動訂閱。\"\n\nmsgid \"Subscribe URL cannot be empty.\"\nmsgstr \"訂閱網址不能為空。\"\n\nmsgid \"Subscribe via proxy\"\nmsgstr \"通過代理訂閱\"\n\nmsgid \"Update Once on Boot\"\nmsgstr \"開機更新一次\"\n\nmsgid \"Updates the subscription the first time runs automatically after each system boot.\"\nmsgstr \"路由每次啟動後，首次自動執行時更新訂閱。\"\n\nmsgid \"Enable auto update subscribe\"\nmsgstr \"開啟自動更新訂閱\"\n\nmsgid \"Manual subscription\"\nmsgstr \"手動訂閱\"\n\nmsgid \"Delete All Subscribe Node\"\nmsgstr \"刪除所有訂閱節點\"\n\nmsgid \"Delete the subscribed node\"\nmsgstr \"刪除已訂閱的節點\"\n\nmsgid \"Are you sure you want to delete all subscribed nodes?\"\nmsgstr \"您確定要刪除所有已訂閱的節點吗？\"\n\nmsgid \"Manual subscription All\"\nmsgstr \"手動訂閱全部鏈接\"\n\nmsgid \"This remark already exists, please change a new remark.\"\nmsgstr \"此備注已存在，請改一個新的備注。\"\n\nmsgid \"Remark cannot be empty.\"\nmsgstr \"備注不能爲空。\"\n\nmsgid \"URL cannot be empty.\"\nmsgstr \"網址不能爲空。\"\n\nmsgid \"Filter keyword Mode\"\nmsgstr \"過濾關键字模式\"\n\nmsgid \"Discard List\"\nmsgstr \"丟棄列表\"\n\nmsgid \"Keep List\"\nmsgstr \"保留列表\"\n\nmsgid \"Discard List,But Keep List First\"\nmsgstr \"丟棄列表，但保留列表優先\"\n\nmsgid \"Keep List,But Discard List First\"\nmsgstr \"保留列表，但丟棄列表優先\"\n\nmsgid \"Use global config\"\nmsgstr \"使用全局配置\"\n\nmsgid \"User-Agent\"\nmsgstr \"用戶代理(User-Agent)\"\n\nmsgid \"Add\"\nmsgstr \"添加\"\n\nmsgid \"ACLs\"\nmsgstr \"訪問控制\"\n\nmsgid \"ACLs is a tools which used to designate specific IP proxy mode.\"\nmsgstr \"訪問控制列表是用於指定特殊IP代理模式的工具。\"\n\nmsgid \"Example:\"\nmsgstr \"例：\"\n\nmsgid \"IP range\"\nmsgstr \"IP 範圍\"\n\nmsgid \"Source Interface\"\nmsgstr \"源接口\"\n\nmsgid \"Bridge\"\nmsgstr \"網橋\"\n\nmsgid \"Wireless Adapter\"\nmsgstr \"無線適配器\"\n\nmsgid \"Ethernet Adapter\"\nmsgstr \"乙太網適配器\"\n\nmsgid \"Tunnel Interface\"\nmsgstr \"隧道介面\"\n\nmsgid \"Invalid interface name\"\nmsgstr \"無效的介面名稱\"\n\nmsgid \"Use Interface With ACLs\"\nmsgstr \"使用接口控制\"\n\nmsgid \"Remarks\"\nmsgstr \"備注\"\n\nmsgid \"Direct List\"\nmsgstr \"直連列表\"\n\nmsgid \"Proxy List\"\nmsgstr \"代理列表\"\n\nmsgid \"Block List\"\nmsgstr \"屏蔽列表\"\n\nmsgid \"Lan IP List\"\nmsgstr \"局域網IP列表\"\n\nmsgid \"Route Hosts\"\nmsgstr \"路由Hosts文件\"\n\nmsgid \"Join the direct hosts list of domain names will not proxy.\"\nmsgstr \"加入的域名不走代理，對所有模式有效。且優先級最高。\"\n\nmsgid \"These had been joined ip addresses will not proxy. Please input the ip address or ip address segment,every line can input only one ip address. For example: 192.168.0.0/24 or 223.5.5.5.\"\nmsgstr \"加入的IP段不走代理，對所有模式有效。且優先級最高。可輸入IP地址或地址段，如：192.168.0.0/24或223.5.5.5，每個地址段一行。\"\n\nmsgid \"These had been joined websites will use proxy. Please input the domain names of websites, every line can input only one website domain. For example: google.com.\"\nmsgstr \"加入的域名將走代理。輸入網站域名，如：google.com，每個地址段一行。\"\n\nmsgid \"These had been joined ip addresses will use proxy. Please input the ip address or ip address segment, every line can input only one ip address. For example: 35.24.0.0/24 or 8.8.4.4.\"\nmsgstr \"加入的IP段將走代理。可輸入IP地址或地址段，如：35.24.0.0/24或8.8.4.4，每個地址段一行。\"\n\nmsgid \"These had been joined websites will be block. Please input the domain names of websites, every line can input only one website domain. For example: twitter.com.\"\nmsgstr \"加入的域名將屏蔽。輸入網站域名，如：twitter.com，每個地址段一行。\"\n\nmsgid \"The list is the IPv4 LAN IP list, which represents the direct connection IP of the LAN. If you need the LAN IP in the proxy list, please clear it from the list. Do not modify this list by default.\"\nmsgstr \"列表中為IPv4的局域網IP列表，代表局域網直連IP。如果需要代理列表中的局域網IP，請將其在该列表中清除,並將其添加到代理列表中。默認情況下不要修改這個列表。\"\n\nmsgid \"The list is the IPv6 LAN IP list, which represents the direct connection IP of the LAN. If you need the LAN IP in the proxy list, please clear it from the list. Do not modify this list by default.\"\nmsgstr \"列表中為IPv6的局域網IP列表，代表局域網直連IP。如果需要代理列表中的局域網IP，請將其在该列表中清除,並將其添加到代理列表中。默認情況下不要修改這個列表。\"\n\nmsgid \"Configure routing etc/hosts file, if you don't know what you are doing, please don't change the content.\"\nmsgstr \"配置路由etc/hosts文件，如果你不知道自己在做什麼，請不要改動內容。\"\n\nmsgid \"These had been joined ip addresses will be block. Please input the ip address or ip address segment, every line can input only one ip address.\"\nmsgstr \"加入的IP段將屏蔽。可輸入IP地址或地址段，每個地址段一行。\"\n\nmsgid \"Inbound Tag\"\nmsgstr \"入站標签\"\n\nmsgid \"Transparent proxy\"\nmsgstr \"透明代理\"\n\nmsgid \"Not valid domain name, please re-enter!\"\nmsgstr \"不是有效域名，請重新輸入！\"\n\nmsgid \"Not valid IP format, please re-enter!\"\nmsgstr \"不是有效IP格式，請重新輸入！\"\n\nmsgid \"Not valid IPv4 format, please re-enter!\"\nmsgstr \"不是有效IPv4格式，請重新輸入！\"\n\nmsgid \"Not valid IPv6 format, please re-enter!\"\nmsgstr \"不是有效IPv6格式，請重新輸入！\"\n\nmsgid \"Not true format, please re-enter!\"\nmsgstr \"不是正確的格式，請重新輸入！\"\n\nmsgid \"Plaintext: If this string matches any part of the targeting domain, this rule takes effet. Example: rule 'sina.com' matches targeting domain 'sina.com', 'sina.com.cn' and 'www.sina.com', but not 'sina.cn'.\"\nmsgstr \"純字符串: 當此字符串匹配目標域名中任意部分，该規則生效。比如'sina.com'可以匹配'sina.com'、'sina.com.cn'和'www.sina.com'，但不匹配'sina.cn'。\"\n\nmsgid \"Regular expression: Begining with 'regexp:', the rest is a regular expression. When the regexp matches targeting domain, this rule takes effect. Example: rule 'regexp:\\\\.goo.*\\\\.com$' matches 'www.google.com' and 'fonts.googleapis.com', but not 'google.com'.\"\nmsgstr \"正則表达式: 由'regexp:'開始，余下部分是一個正則表达式。當此正則表达式匹配目標域名時，该規則生效。例如'regexp:\\\\.goo.*\\\\.com$'匹配'www.google.com'、'fonts.googleapis.com'，但不匹配'google.com'。\"\n\nmsgid \"Subdomain (recommended): Begining with 'domain:' and the rest is a domain. When the targeting domain is exactly the value, or is a subdomain of the value, this rule takes effect. Example: rule 'domain:v2ray.com' matches 'www.v2ray.com', 'v2ray.com', but not 'xv2ray.com'.\"\nmsgstr \"子域名 (推荐): 由'domain:'開始，余下部分是一個域名。當此域名是目標域名或其子域名時，该規則生效。例如'domain:v2ray.com'匹配'www.v2ray.com'、'v2ray.com'，但不匹配'xv2ray.com'。\"\n\nmsgid \"Full domain: Begining with 'full:' and the rest is a domain. When the targeting domain is exactly the value, the rule takes effect. Example: rule 'domain:v2ray.com' matches 'v2ray.com', but not 'www.v2ray.com'.\"\nmsgstr \"完整匹配: 由'full:'開始，余下部分是一個域名。當此域名完整匹配目標域名時，该規則生效。例如'full:v2ray.com'匹配'v2ray.com'但不匹配'www.v2ray.com'。\"\n\nmsgid \"Sing-Box rule-set: Begining with 'rule-set:remote:' or 'rule-set:local:'\"\nmsgstr \"Sing-Box 規則集： 由 'rule-set:remote:' 或 'rule-set:local:' 開始\"\n\nmsgid \"Such as:\"\nmsgstr \"例如：\"\n\nmsgid \"Pre-defined domain list: Begining with 'geosite:' and the rest is a name, such as geosite:google or geosite:cn.\"\nmsgstr \"预定义域名列表：由'geosite:'開头，余下部分是一個名称，如geosite:google或者geosite:cn。\"\n\nmsgid \"Annotation: Begining with #\"\nmsgstr \"注释: 由 # 開头\"\n\nmsgid \"Invert match result.\"\nmsgstr \"反選匹配結果。\"\n\nmsgid \"Only support Sing-Box.\"\nmsgstr \"只支持 Sing-Box。\"\n\nmsgid \"IP: such as '127.0.0.1'.\"\nmsgstr \"IP: 形如'127.0.0.1'。\"\n\nmsgid \"CIDR: such as '127.0.0.0/8'.\"\nmsgstr \"CIDR: 形如'10.0.0.0/8'.\"\n\nmsgid \"GeoIP: such as 'geoip:cn'. It begins with geoip: (lower case) and followed by two letter of country code.\"\nmsgstr \"GeoIP: 形如'geoip:cn'，必須以geoip:（小寫）開头，後面跟双字符国家代码，支持几乎所有可以上網的国家。\"\n\nmsgid \"Clear logs\"\nmsgstr \"清空日誌\"\n\nmsgid \"Password\"\nmsgstr \"密碼\"\n\nmsgid \"IV Check\"\nmsgstr \"IV 檢查\"\n\nmsgid \"UDP over TCP\"\nmsgstr \"TCP 封装 UDP\"\n\nmsgid \"Connection Timeout\"\nmsgstr \"連接超時時間\"\n\nmsgid \"Local Port\"\nmsgstr \"本地端口\"\n\nmsgid \"Fast Open\"\nmsgstr \"快速打開\"\n\nmsgid \"Pre-connections\"\nmsgstr \"預連接\"\n\nmsgid \"Number of early established connections to reduce latency.\"\nmsgstr \"預連接的數量，用於降低延遲。\"\n\nmsgid \"plugin\"\nmsgstr \"插件\"\n\nmsgid \"Supports custom SIP003 plugins, Make sure the plugin is installed.\"\nmsgstr \"支持自定义 SIP003 插件，請確保插件已安装。\"\n\nmsgid \"opts\"\nmsgstr \"插件選項\"\n\nmsgid \"Protocol\"\nmsgstr \"協議名称\"\n\nmsgid \"Protocol_param\"\nmsgstr \"協議參數\"\n\nmsgid \"Obfs\"\nmsgstr \"混淆\"\n\nmsgid \"Obfs_param\"\nmsgstr \"混淆參數\"\n\nmsgid \"Plugin Name\"\nmsgstr \"插件名称\"\n\nmsgid \"Plugin Arguments\"\nmsgstr \"插件參數\"\n\nmsgid \"User Level\"\nmsgstr \"用戶等級(level)\"\n\nmsgid \"Transport\"\nmsgstr \"傳輸方式\"\n\nmsgid \"Public Key\"\nmsgstr \"公鑰\"\n\nmsgid \"Private Key\"\nmsgstr \"私鑰\"\n\nmsgid \"Pre shared key\"\nmsgstr \"额外的對称加密密鑰\"\n\nmsgid \"Local Address\"\nmsgstr \"本地地址\"\n\nmsgid \"System interface\"\nmsgstr \"系統接口\"\n\nmsgid \"System interface name\"\nmsgstr \"系統接口名称\"\n\nmsgid \"Decimal numbers separated by \\\",\\\" or Base64-encoded strings.\"\nmsgstr \"用“,”隔開的十进制數字或 Base64 编码字符串。\"\n\nmsgid \"Camouflage Domain\"\nmsgstr \"伪装域名\"\n\nmsgid \"Camouflage Type\"\nmsgstr \"伪装類型\"\n\nmsgid \"Transport Layer Encryption\"\nmsgstr \"傳輸層加密\"\n\nmsgid \"Whether or not transport layer encryption is enabled, \\\"none\\\" for unencrypted, \\\"tls\\\" for using TLS, \\\"xtls\\\" for using XTLS.\"\nmsgstr \"是否啟入傳輸層加密，支持的選項有 \\\"none\\\" 表示不加密，\\\"tls\\\" 表示使用 TLS，\\\"xtls\\\" 表示使用 XTLS。\"\n\nmsgid \"Original Trojan only supported 'tls', please choose 'tls'.\"\nmsgstr \"原版Trojan只支持'tls'，請選择'tls'。\"\n\nmsgid \"Transfer mode\"\nmsgstr \"傳輸模式\"\n\nmsgid \"Do not send server name in ClientHello.\"\nmsgstr \"不要在 ClientHello 中發送服務器名称.\"\n\nmsgid \"Domain\"\nmsgstr \"域名\"\n\nmsgid \"allowInsecure\"\nmsgstr \"允許不安全連接\"\n\nmsgid \"Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.\"\nmsgstr \"是否允許不安全連接。當勾選時，將跳過證書驗證。\"\n\nmsgid \"Used when the node link does not include this parameter.\"\nmsgstr \"當節點連結未包含該參數時，將使用此設定。\"\n\nmsgid \"%s Node Use Type\"\nmsgstr \"%s 節點使用類型\"\n\nmsgid \"Set the TUIC proxy server ip address\"\nmsgstr \"指定遠程TUIC服務器IP\"\n\nmsgid \"TUIC User Password For Connect Remote Server\"\nmsgstr \"用於遠程TUIC服務器連接的密碼\"\n\nmsgid \"TUIC UserName For Local Socks\"\nmsgstr \"用於本地Socks服務器連接的用戶名\"\n\nmsgid \"TUIC Password For Local Socks\"\nmsgstr \"用於本地Socks服務器連接的密碼\"\n\nmsgid \"UDP relay mode\"\nmsgstr \"UDP中继模式\"\n\nmsgid \"Concurrent Tunnels\"\nmsgstr \"並發隧道連接數\"\n\nmsgid \"Congestion control algorithm\"\nmsgstr \"拥塞控制算法\"\n\nmsgid \"Heartbeat interval(second)\"\nmsgstr \"保活心跳包發送間隔（單位：秒）\"\n\nmsgid \"Timeout for establishing a connection to server(second)\"\nmsgstr \"連接超時時間（單位：秒）\"\n\nmsgid \"Garbage collection interval(second)\"\nmsgstr \"UDP數据包片残片清理間隔（單位：秒）\"\n\nmsgid \"Garbage collection lifetime(second)\"\nmsgstr \"UDP數据包残片在服務器的保留時間（單位：秒）\"\n\nmsgid \"Disable SNI\"\nmsgstr \"關閉SNI服務器名称指示\"\n\nmsgid \"Enable 0-RTT QUIC handshake\"\nmsgstr \"客戶端啟用 0-RTT QUIC 連接握手\"\n\nmsgid \"TUIC send window\"\nmsgstr \"發送窗口（無需確認即可發送的最大字节數：默認8Mb*2）\"\n\nmsgid \"TUIC receive window\"\nmsgstr \"接收窗口（無需確認即可接收的最大字节數：默認8Mb）\"\n\nmsgid \"TUIC Maximum packet size the socks5 server can receive from external, in bytes\"\nmsgstr \"TUIC socks5 服務器可以从外部接收的最大數据包大小（以字节為單位）\"\n\nmsgid \"Set if the listening socket should be dual-stack\"\nmsgstr \"設置監聽套接字為双栈\"\n\nmsgid \"<br />none: default, no masquerade, data sent is packets with no characteristics.<br />srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime).<br />utp: packets disguised as uTP will be recognized as bittorrent downloaded data.<br />wechat-video: packets disguised as WeChat video calls.<br />dtls: disguised as DTLS 1.2 packet.<br />wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)<br />dns: Disguising traffic as DNS requests.\"\nmsgstr \"<br />none：默認值，不进行伪装，發送的數据是沒有特征的數据包。<br />srtp：伪装成 SRTP 數据包，会被识别為視频通话數据（如 FaceTime）。<br />utp：伪装成 uTP 數据包，会被识别為 BT 下載數据。<br />wechat-video：伪装成微信視频通话的數据包。<br />dtls：伪装成 DTLS 1.2 數据包。<br />wireguard：伪装成 WireGuard 數据包。(並不是真正的 WireGuard 協議)<br />dns：把流量伪装成 DNS 請求。\"\n\nmsgid \"Use it together with the DNS disguised type. You can fill in any domain.\"\nmsgstr \"配合伪装類型 DNS 使用，可随便填一個域名。\"\n\nmsgid \"Auth\"\nmsgstr \"身份認證\"\n\nmsgid \"Socks for authentication\"\nmsgstr \"Socks認證方式\"\n\nmsgid \"Socks protocol authentication, support anonymous and password.\"\nmsgstr \"Socks 協議的認證方式，支持匿名方式和账号密碼方式。\"\n\nmsgid \"anonymous\"\nmsgstr \"匿名\"\n\nmsgid \"User Password\"\nmsgstr \"账号密碼\"\n\nmsgid \"Username and Password must be used together!\"\nmsgstr \"账号和密碼必須同時使用！\"\n\nmsgid \"Prefer firewall tools\"\nmsgstr \"首選防火牆工具\"\n\nmsgid \"IPv6 TProxy\"\nmsgstr \"IPv6透明代理(TProxy)\"\n\nmsgid \"Experimental feature. Make sure that your node supports IPv6.\"\nmsgstr \"實驗特性，請確保你的節點支持IPv6\"\n\nmsgid \"Status info\"\nmsgstr \"状態信息\"\n\nmsgid \"Big icon\"\nmsgstr \"大图標\"\n\nmsgid \"Show node check\"\nmsgstr \"顯示節點檢測\"\n\nmsgid \"Show Show IP111\"\nmsgstr \"顯示IP111\"\n\nmsgid \"Destination protocol\"\nmsgstr \"目標協議\"\n\nmsgid \"Destination address\"\nmsgstr \"目標地址\"\n\nmsgid \"Destination port\"\nmsgstr \"目標端口\"\n\nmsgid \"Whether to receive PROXY protocol, when this node want to be fallback or forwarded by proxy, it must be enable, otherwise it cannot be used.\"\nmsgstr \"是否接收 PROXY protocol，當该節點要被回落或被代理转發時，必須啟用，否則不能使用。\"\n\nmsgid \"outbound node\"\nmsgstr \"出站節點\"\n\nmsgid \"Custom Socks\"\nmsgstr \"自定义 Socks\"\n\nmsgid \"Custom HTTP\"\nmsgstr \"自定义 HTTP\"\n\nmsgid \"Custom Interface\"\nmsgstr \"自定义接口\"\n\nmsgid \"Interface\"\nmsgstr \"接口\"\n\nmsgid \"Bind Local\"\nmsgstr \"本機監聽\"\n\nmsgid \"When selected, it can only be accessed localhost.\"\nmsgstr \"當勾選時，只能本機訪問。\"\n\nmsgid \"Accept LAN Access\"\nmsgstr \"接受局域網訪問\"\n\nmsgid \"When selected, it can accessed lan , this will not be safe!\"\nmsgstr \"當勾選時，可以直接訪問局域網，這將不安全！（非特殊情況不建議開啟）\"\n\nmsgid \"Enable Remote\"\nmsgstr \"啟用转發\"\n\nmsgid \"You can forward to Nginx/Caddy/V2ray/Xray WebSocket and more.\"\nmsgstr \"您可以转發到Nginx/Caddy/V2ray/Xray WebSocket等。\"\n\nmsgid \"Remote Address\"\nmsgstr \"遠程地址\"\n\nmsgid \"Remote Port\"\nmsgstr \"遠程端口\"\n\nmsgid \"as:\"\nmsgstr \"如：\"\n\nmsgid \"Public key absolute path\"\nmsgstr \"公鑰文件绝對路径\"\n\nmsgid \"Private key absolute path\"\nmsgstr \"私鑰文件绝對路径\"\n\nmsgid \"Can't find this file!\"\nmsgstr \"找不到這個文件！\"\n\nmsgid \"Public key and Private key path can not be empty!\"\nmsgstr \"公鑰和私鑰文件路径不能為空！\"\n\nmsgid \"Server-Side\"\nmsgstr \"服務器端\"\n\nmsgid \"Server Config\"\nmsgstr \"服務器配置\"\n\nmsgid \"Users Manager\"\nmsgstr \"用戶管理\"\n\nmsgid \"Logs\"\nmsgstr \"日誌\"\n\nmsgid \"Log\"\nmsgstr \"日誌\"\n\nmsgid \"Enable Node Log\"\nmsgstr \"啟用節點日誌\"\n\nmsgid \"Log Level\"\nmsgstr \"日誌等級\"\n\nmsgid \"Not enabled log\"\nmsgstr \"未啟用日誌\"\n\nmsgid \"UDP Forward\"\nmsgstr \"UDP转發\"\n\nmsgid \"DNS Settings\"\nmsgstr \"DNS設置\"\n\nmsgid \"Null\"\nmsgstr \"無\"\n\nmsgid \"You did not fill in the %s path. Please save and apply then update manually.\"\nmsgstr \"您沒有填寫 %s 路径。請保存應用後再手動更新。\"\n\nmsgid \"Not installed %s, Can't unzip!\"\nmsgstr \"未安装 %s，無法解压。\"\n\nmsgid \"Can't determine ARCH, or ARCH not supported.\"\nmsgstr \"無法確認ARCH架構，或是不支持。\"\n\nmsgid \"Get remote version info failed.\"\nmsgstr \"獲取遠程版本信息失敗。\"\n\nmsgid \"New version found, but failed to get new version download url.\"\nmsgstr \"發现新版本，但未能獲得新版本的下載地址。\"\n\nmsgid \"Download url is required.\"\nmsgstr \"請指定下載地址。\"\n\nmsgid \"File download failed or timed out: %s\"\nmsgstr \"文件下載失敗或超時：%s\"\n\nmsgid \"File path required.\"\nmsgstr \"請指定文件路径。\"\n\nmsgid \"%s not enough space.\"\nmsgstr \"%s 空間不足。\"\n\nmsgid \"Can't find client in file: %s\"\nmsgstr \"無法在文件中找到客戶端：%s\"\n\nmsgid \"Client file is required.\"\nmsgstr \"請指定客戶端文件。\"\n\nmsgid \"The client file is not suitable for current device.\"\nmsgstr \"客戶端文件不適合當前設備。\"\n\nmsgid \"Can't move new file to path: %s\"\nmsgstr \"無法移動新文件到：%s\"\n\nmsgid \"An XHttpObject in JSON format, used for sharing.\"\nmsgstr \"JSON 格式的 XHttpObject，用來實现分享。\"\n\nmsgid \"Enable Mux.Cool\"\nmsgstr \"啟用 Mux.Cool\"\n\nmsgid \"Mux concurrency\"\nmsgstr \"最大並發連接數\"\n\nmsgid \"XUDP Mux concurrency\"\nmsgstr \"XUDP 最大並發連接數\"\n\nmsgid \"Padding\"\nmsgstr \"填充\"\n\nmsgid \"Enable early data\"\nmsgstr \"啟用前置數据\"\n\nmsgid \"Early data length\"\nmsgstr \"前置數据最大长度\"\n\nmsgid \"Early data header name\"\nmsgstr \"前置數据 HTTP 头名\"\n\nmsgid \"Recommended value: Sec-WebSocket-Protocol\"\nmsgstr \"推荐值：Sec-WebSocket-Protocol\"\n\nmsgid \"Health check\"\nmsgstr \"健康檢查\"\n\nmsgid \"Health check timeout\"\nmsgstr \"檢查超時時間\"\n\nmsgid \"Permit without stream\"\nmsgstr \"無子連接時的健康檢查\"\n\nmsgid \"Initial Windows Size\"\nmsgstr \"初始窗口大小\"\n\nmsgid \"Excluded Domains\"\nmsgstr \"排除域名\"\n\nmsgid \"If the traffic sniffing result is in this list, the destination address will not be overridden.\"\nmsgstr \"如果流量嗅探結果在此列表中，則不会覆盖目標地址。\"\n\nmsgid \"Buffer Size\"\nmsgstr \"缓衝区大小\"\n\nmsgid \"Buffer size for every connection (kB)\"\nmsgstr \"每一個連接的缓衝区大小（kB）\"\n\nmsgid \"Idle Timeout\"\nmsgstr \"空闲超時\"\n\nmsgid \"Hop Interval(second)\"\nmsgstr \"端口跳躍間隔（秒）\"\n\nmsgid \"Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5.\"\nmsgstr \"支援固定值或隨機範圍（如 30 或 5-30），最小 5 秒。\"\n\nmsgid \"HeartbeatPeriod(second)\"\nmsgstr \"心跳周期（單位：秒）\"\n\nmsgid \"Override the connection destination address\"\nmsgstr \"覆盖連接目標地址\"\n\nmsgid \"Override the connection destination address with the sniffed domain.<br />Otherwise use sniffed domain for routing only.<br />If using shunt nodes, configure the domain shunt rules correctly.\"\nmsgstr \"用探測出的域名覆盖連接目標地址。<br />否則仅將探測得到的域名用於路由。<br />如使用分流節點，請正確設置域名分流規則。\"\n\nmsgid \"Handshake Server\"\nmsgstr \"握手服務器\"\n\nmsgid \"Handshake Server Port\"\nmsgstr \"握手服務器端口\"\n\nmsgid \"Protocol parameter. Will waste traffic randomly if enabled.\"\nmsgstr \"協議參數。 如果啟用会随機浪费流量。\"\n\nmsgid \"Protocol parameter. Enable length block encryption.\"\nmsgstr \"協議參數。啟用长度块加密。\"\n\nmsgid \"TLS Chain Fingerprint (SHA256)\"\nmsgstr \"TLS 憑證鏈指紋（SHA256）\"\n\nmsgid \"Once set, connects only when the server’s chain fingerprint matches.\"\nmsgstr \"設定後，僅在伺服器憑證鏈指紋匹配時連接。\"\n\nmsgid \"TLS Certificate Name (CertName)\"\nmsgstr \"TLS 憑證名稱（CertName）\"\n\nmsgid \"TLS is used to verify the leaf certificate name.\"\nmsgstr \"TLS 用於驗證 leaf 憑證的 name。\"\n\nmsgid \"ECH Config\"\nmsgstr \"ECH 配置\"\n\nmsgid \"ECH Key\"\nmsgstr \"ECH 密鑰\"\n\nmsgid \"ECH Query Policy\"\nmsgstr \"ECH 查詢策略\"\n\nmsgid \"Controls the policy used when performing DNS queries for ECH configuration.\"\nmsgstr \"控制使用 DNS 查詢 ECH 配置時的策略。\"\n\nmsgid \"ECH Query Domain\"\nmsgstr \"ECH 查詢網域名\"\n\nmsgid \"Overrides the domain name used for ECH HTTPS record queries.\"\nmsgstr \"覆蓋用於 ECH HTTPS 記錄查詢的網域名。\"\n\nmsgid \"Enable Multipath TCP, need to be enabled in both server and client configuration.\"\nmsgstr \"啟用 Multipath TCP，需在服務端和客戶端配置中同時啟用。\"\n\nmsgid \"An FinalMaskObject in JSON format, used for sharing.\"\nmsgstr \"JSON 格式的 FinalMaskObject，用來實現分享。\"\n\nmsgid \"Custom finalmask overrides mkcp, hysteria2, fragment, noise, and related settings.\"\nmsgstr \"自定義 finalmask 將涵蓋 mkcp、hysteria2、fragment、noise 等相關配置。\"\n\nmsgid \"Fragment\"\nmsgstr \"分片\"\n\nmsgid \"TCP fragments, which can deceive the censorship system in some cases, such as bypassing SNI blacklists.\"\nmsgstr \"TCP 分片，在某些情況下可以欺骗审查系統，比如绕過 SNI 黑名單。\"\n\nmsgid \"Fragment Packets\"\nmsgstr \"分片方式\"\n\nmsgid \" \\\"1-3\\\" is for segmentation at TCP layer, applying to the beginning 1 to 3 data writes by the client. \\\"tlshello\\\" is for TLS client hello packet fragmentation.\"\nmsgstr \" \\\"1-3\\\" 是 TCP 的流切片，應用於客戶端第 1 至第 3 次寫數据。\\\"tlshello\\\" 是 TLS 握手包切片。\"\n\nmsgid \"Fragment Length\"\nmsgstr \"分片包长\"\n\nmsgid \"Fragmented packet length (byte)\"\nmsgstr \"分片包长 (byte)\"\n\nmsgid \"Fragment Delay\"\nmsgstr \"分片延遲\"\n\nmsgid \"Fragmentation interval (ms)\"\nmsgstr \"分片間隔（ms）\"\n\nmsgid \"Max Split\"\nmsgstr \"最大分片數\"\n\nmsgid \"Limit the maximum number of splits.\"\nmsgstr \"限制分片的最大數量。\"\n\nmsgid \"Split handshake data into multiple TLS records for better censorship evasion. Low overhead. Recommended to enable first.\"\nmsgstr \"將握手數据拆分為多個 TLS 記錄，提升抗封锁能力，几乎不增加延迟，建議優先啟用。\"\n\nmsgid \"Split handshake into multiple TCP segments. Enhances obfuscation. May increase delay. Use only if needed.\"\nmsgstr \"將 TLS 握手數据分為多個 TCP 包發送，提高伪装性，可能增加延迟，仅在封锁严重時使用。\"\n\nmsgid \"Noise\"\nmsgstr \"噪聲\"\n\nmsgid \"UDP noise, Under some circumstances it can bypass some UDP based protocol restrictions.\"\nmsgstr \"UDP 噪聲，在某些情況下可以绕過一些针對 UDP 協議的限制。\"\n\nmsgid \"To send noise packets, select \\\"Noise\\\" in Xray Settings.\"\nmsgstr \"在 Xray 設置中勾選 “噪聲” 以發送噪聲包。\"\n\nmsgid \"Xray Noise Packets\"\nmsgstr \"Xray 噪聲數据包\"\n\nmsgid \"Packet | Rand Length\"\nmsgstr \"數據包 | Rand 長度\"\n\nmsgid \"Delay (ms)\"\nmsgstr \"延迟（ms）\"\n\nmsgid \"If is domain name, The requested domain name will be resolved to IP before connect.\"\nmsgstr \"如果是域名，域名將在請求發出之前解析為 IP。\"\n\nmsgid \"Domain DNS Resolve\"\nmsgstr \"域名 DNS 解析\"\n\nmsgid \"If the node address is a domain name, this DNS will be used for resolution.\"\nmsgstr \"如果節點地址是域名，則將使用此 DNS 進行解析。\"\n\nmsgid \"Supports only Xray or Sing-box node types.\"\nmsgstr \"僅支援 Xray 或 Sing-box 類型節點。\"\n\nmsgid \"Chain Proxy\"\nmsgstr \"鏈式代理\"\n\nmsgid \"Landing Node\"\nmsgstr \"落地節點\"\n\nmsgid \"Only support a layer of proxy.\"\nmsgstr \"仅支持一層代理。\"\n\nmsgid \"\"\n\"Chained proxy works only with Xray or Sing-box nodes.<br>\"\n\"You can only use manual or imported nodes as chained nodes.\"\nmsgstr \"\"\n\"鏈式代理仅支持 Xray 或 Sing-box 節點。<br>\"\n\"仅支持手動添加或導入的節點用作鏈式節點。\"\n\nmsgid \"Prefer IPv4\"\nmsgstr \"IPv4 優先\"\n\nmsgid \"Prefer IPv6\"\nmsgstr \"IPv6 優先\"\n\nmsgid \"IPv4 Only\"\nmsgstr \"仅 IPv4\"\n\nmsgid \"IPv6 Only\"\nmsgstr \"仅 IPv6\"\n\nmsgid \"Maintain\"\nmsgstr \"维護\"\n\nmsgid \"Backup and Restore\"\nmsgstr \"備份还原\"\n\nmsgid \"Backup or Restore Client and Server Configurations.\"\nmsgstr \"備份或还原客戶端及服務端配置。\"\n\nmsgid \"Note: Restoring configurations across different versions may cause compatibility issues.\"\nmsgstr \"注意：不同版本間的配置恢復可能会導致兼容性問題。\"\n\nmsgid \"Create Backup File\"\nmsgstr \"创建備份文件\"\n\nmsgid \"Restore Backup File\"\nmsgstr \"恢復備份文件\"\n\nmsgid \"DL Backup\"\nmsgstr \"下載備份\"\n\nmsgid \"RST Backup\"\nmsgstr \"恢復備份\"\n\nmsgid \"Backup failed!\"\nmsgstr \"備份失敗！\"\n\nmsgid \"UL Restore\"\nmsgstr \"上傳恢復\"\n\nmsgid \"CLOSE WIN\"\nmsgstr \"關閉窗口\"\n\nmsgid \"Restore to default configuration\"\nmsgstr \"恢復默認配置\"\n\nmsgid \"Do Reset\"\nmsgstr \"执行重置\"\n\nmsgid \"Please select a file first.\"\nmsgstr \"請先選择一個文件。\"\n\nmsgid \"Invalid file type. Please upload a .tar.gz file.\"\nmsgstr \"文件類型無效，請上傳一個 .tar.gz 文件。\"\n\nmsgid \"File size exceeds 10MB limit.\"\nmsgstr \"文件大小超過 10MB 限制。\"\n\nmsgid \"Do you want to restore the client to default settings?\"\nmsgstr \"是否要恢復客戶端默認配置？\"\n\nmsgid \"Are you sure you want to restore the client to default settings?\"\nmsgstr \"是否真的要恢復客戶端默認配置？\"\n\nmsgid \"Configuration file uploaded successfully…\"\nmsgstr \"配置文件上傳成功…\"\n\nmsgid \"Configuration restored successfully…\"\nmsgstr \"配置还原成功…\"\n\nmsgid \"Service restarting…\"\nmsgstr \"重啟服務中…\"\n\nmsgid \"Configuration file decompression failed, please try again!\"\nmsgstr \"配置文件解压失敗，請重試！\"\n\nmsgid \"_urltest\"\nmsgstr \"URLTest\"\n\nmsgid \"URLTest node list\"\nmsgstr \"URLTest 節點列表\"\n\nmsgid \"List of nodes to test, <a target='_blank' href='https://sing-box.sagernet.org/configuration/outbound/urltest'>document</a>\"\nmsgstr \"要測試的節點列表，<a target='_blank' href='https://sing-box.sagernet.org/zh/configuration/outbound/urltest'>文檔原理</a>\"\n\nmsgid \"Test interval\"\nmsgstr \"測試間隔\"\n\nmsgid \"Test interval must be less or equal than idle timeout.\"\nmsgstr \"測試間隔時間必須小於或等於空闲超時時間。\"\n\nmsgid \"Test tolerance\"\nmsgstr \"測試容差\"\n\nmsgid \"The test tolerance in milliseconds.\"\nmsgstr \"測試容差時間（單位：毫秒）。\"\n\nmsgid \"Idle timeout\"\nmsgstr \"空闲超時\"\n\nmsgid \"The idle timeout.\"\nmsgstr \"空闲超時時間。\"\n\nmsgid \"Interrupt existing connections\"\nmsgstr \"中斷现有連接\"\n\nmsgid \"Interrupt existing connections when the selected outbound has changed.\"\nmsgstr \"當選择的出站發生變化時中斷现有連接。\"\n\nmsgid \"Port hopping range\"\nmsgstr \"端口跳跃範圍\"\n\nmsgid \"Format as 1000:2000 or 1000-2000 Multiple groups are separated by commas (,).\"\nmsgstr \"格式為：1000:2000 或 1000-2000 多组時用逗号(,)隔開。\"\n\nmsgid \"Use Custom Config\"\nmsgstr \"使用自定义配置\"\n\nmsgid \"Custom Config\"\nmsgstr \"自定义配置\"\n\nmsgid \"Must be JSON text!\"\nmsgstr \"必須是 JSON 文本內容！\"\n\nmsgid \"Geo View\"\nmsgstr \"Geo 查詢\"\n\nmsgid \"Query\"\nmsgstr \"查詢\"\n\nmsgid \"Querying\"\nmsgstr \"查詢中\"\n\nmsgid \"Please enter query content!\"\nmsgstr \"請輸入查詢內容！\"\n\nmsgid \"No results were found!\"\nmsgstr \"未找到任何結果！\"\n\nmsgid \"Rules containing this value:\"\nmsgstr \"所在規則列表：\"\n\nmsgid \"Domain/IP Query\"\nmsgstr \"域名/IP 查詢\"\n\nmsgid \"GeoIP/Geosite Query\"\nmsgstr \"GeoIP/Geosite 查詢\"\n\nmsgid \"Enter a domain or IP to query the Geo rule list they belong to.\"\nmsgstr \"輸入域名/IP，查詢它们所在的 Geo 規則列表。\"\n\nmsgid \"Enter a GeoIP or Geosite to extract the domains/IPs they contain. Format: geoip:cn or geosite:gfw\"\nmsgstr \"輸入 GeoIP/Geosite，提取它们所包含的域名/IP。格式：geoip:cn 或 geosite:gfw\"\n\nmsgid \"Tips:\"\nmsgstr \"小贴士：\"\n\nmsgid \"By entering a domain or IP, you can query the Geo rule list they belong to.\"\nmsgstr \"可以通過輸入域名/IP，查詢它们所在的 Geo 規則列表。\"\n\nmsgid \"By entering a GeoIP or Geosite, you can extract the domains/IPs they contain.\"\nmsgstr \"可以通過輸入 GeoIP/Geosite，提取它们所包含的域名/IP。\"\n\nmsgid \"Use the GeoIP/Geosite query function to verify if the entered Geo rules are correct.\"\nmsgstr \"利用 GeoIP/Geosite 查詢功能，可以驗證輸入的 Geo 規則是否正確。\"\n\nmsgid \"Private Key Passphrase\"\nmsgstr \"私鑰指紋\"\n\nmsgid \"Host Key\"\nmsgstr \"主機密鑰\"\n\nmsgid \"Accept any if empty.\"\nmsgstr \"留空則不校驗。\"\n\nmsgid \"Host Key Algorithms\"\nmsgstr \"主機密鑰算法\"\n\nmsgid \"Client Version\"\nmsgstr \"客戶端版本\"\n\nmsgid \"Random version will be used if empty.\"\nmsgstr \"如留空，則使用随機版本。\"\n\nmsgid \"The configured type also applies to the core specified when manually importing nodes.\"\nmsgstr \"配置的類型同樣適用於手動導入節點時所指定的核心程序。\"\n\nmsgid \"Group Name\"\nmsgstr \"分組名\"\n\nmsgid \"Reassign Group\"\nmsgstr \"調整分組\"\n\nmsgid \"Reassign Node Group\"\nmsgstr \"調整節點分組\"\n\nmsgid \"Search nodes...\"\nmsgstr \"搜尋節點…\"\n\nmsgid \"Using...\"\nmsgstr \"使用中。\"\n\nmsgid \"Generate configuration file and run\"\nmsgstr \"生成配置文件並運行\"\n\nmsgid \"Start after a delay of %s seconds!\"\nmsgstr \"延時 %s 秒後再啟動!\"\n\nmsgid \"The script is already running, do not run it again. Exit.\"\nmsgstr \"脚本已经在運行，不重復運行，退出.\"\n\nmsgid \"Stop the script and wait for a timeout, then exit without repeating the process.\"\nmsgstr \"停止脚本等待超時，不重復運行，退出.\"\n\nmsgid \"Warning: The %s application environment is incomplete. Switch to %s. (%s)\"\nmsgstr \"警告：%s 應用環境不完整，切換至 %s。 (%s)\"\n\nmsgid \"Note: Dnsmasq (%s) is below 2.90. Upgrading is recommended to improve stability.\"\nmsgstr \"提示：Dnsmasq (%s) 低於 2.90，建議升級以增強穩定性。\"\n\nmsgid \"Warning: %s transparent proxy is missing basic dependency %s!\"\nmsgstr \"警告：%s 透明代理缺少基礎依賴 %s！\"\n\nmsgid \"Warning: Not compatible with any transparent proxy system environment.\"\nmsgstr \"警告：不滿足任何透明代理系統環境。\"\n\nmsgid \"%s does not have execute permissions and cannot be started: %s %s\"\nmsgstr \"%s 沒有执行權限，無法啟動：%s %s\"\n\nmsgid \"%s not found, unable to start...\"\nmsgstr \"找不到 %s，無法啟動...\"\n\nmsgid \"Socks node: [%s]%s is an invalid server address and cannot be started!\"\nmsgstr \"Socks節點：[%s]%s 是非法的服務器地址，無法啟動！\"\n\nmsgid \"For some reason, the configuration for this Socks service has been lost, and its startup has been aborted!\"\nmsgstr \"某种原因，此 Socks 服務的相關配置已失联，啟動中止！\"\n\nmsgid \"Socks node: [%s]%s, start failed %s:%s %s\"\nmsgstr \"Socks節點：[%s]%s，啟動失敗 %s:%s %s\"\n\nmsgid \"Socks node: [%s]%s, starting %s:%s\"\nmsgstr \"Socks節點：[%s]%s，啟動 %s:%s\"\n\nmsgid \"To enable experimental IPv6 transparent proxy (TProxy), please ensure your node and type support IPv6!\"\nmsgstr \"開啟實驗性IPv6透明代理(TProxy)，請確認您的節點及類型支持IPv6！\"\n\nmsgid \"[%s] process %s error, skip this transparent proxy!\"\nmsgstr \"【%s】 進程 %s 錯誤，跳過此透明代理！\"\n\nmsgid \"Analyzing the node configuration of the Socks service...\"\nmsgstr \"分析 Socks 服務的節點配置...\"\n\nmsgid \"Log file is too long, clear it!\"\nmsgstr \"日誌文件過长，清空处理！\"\n\nmsgid \"The task is currently running automatically as a scheduled task; no reconfiguration of the scheduled task is required.\"\nmsgstr \"當前為計划任務自動運行，不重新配置定時任務。\"\n\nmsgid \"Scheduled tasks: Auto stop service.\"\nmsgstr \"配置定時任務：自動關閉服務。\"\n\nmsgid \"Scheduled tasks: Auto start service.\"\nmsgstr \"配置定時任務：自動開啟服務。\"\n\nmsgid \"Scheduled tasks: Auto restart service.\"\nmsgstr \"配置定時任務：自動重啟服務。\"\n\nmsgid \"Scheduled tasks: Auto update rules.\"\nmsgstr \"配置定時任務：自動更新規則。\"\n\nmsgid \"Scheduled tasks: Auto update [%s] subscription.\"\nmsgstr \"配置定時任務：自動更新 【%s】 訂閱。\"\n\nmsgid \"Auto updates: Starts a cyclical update process.\"\nmsgstr \"自動更新：啟動循环更新進程。\"\n\nmsgid \"Running in no proxy mode, it only allows scheduled tasks for starting and stopping services.\"\nmsgstr \"運行於非代理模式，仅允許服務啟停的定時任務。\"\n\nmsgid \"Clear scheduled commands.\"\nmsgstr \"清除定時执行命令。\"\n\nmsgid \"Unable to resolve [%s], route table addition failed!\"\nmsgstr \"無法解析[%s]，路由表添加失敗！\"\n\nmsgid \"[%s] was successfully added to the routing table of interface [%s]!\"\nmsgstr \"[%s]添加到接口[%s]路由表成功！\"\n\nmsgid \"Adding [%s] to the [%s] routing table failed! The reason is that the [%s] gateway cannot be found.\"\nmsgstr \"[%s]添加到接口[%s]路由表失功！原因是找不到[%s]網關。\"\n\nmsgid \"Global nodes are not enabled, skip [%s].\"\nmsgstr \"全局節點未啟用，跳過【%s】\"\n\nmsgid \"Direct DNS: %s\"\nmsgstr \"直連 DNS：%s\"\n\nmsgid \"Remote DNS: %s\"\nmsgstr \"遠程 DNS：%s\"\n\nmsgid \"The program has started. Please stop it and then restart it!\"\nmsgstr \"程序已啟動，先停止再重新啟動!\"\n\nmsgid \"Running complete!\"\nmsgstr \"運行完成！\"\n\nmsgid \"Clearing and closing related programs and cache complete.\"\nmsgstr \"清空並關閉相關程序和缓存完成。\"\n\nmsgid \"Incorrect index listing method (%s), execution terminated!\"\nmsgstr \"索引列举方式不正確（%s），终止执行！\"\n\nmsgid \"parse the traffic splitting rules[%s]-[geoip:%s] add to %s to complete.\"\nmsgstr \"解析分流規則[%s]-[geoip:%s]加入到 %s 完成\"\n\nmsgid \"Access Control:\"\nmsgstr \"訪問控制：\"\n\nmsgid \"Add node to the load balancer is directly connected to %s[%s].\"\nmsgstr \"加入負載均衡的節點到%s[%s]直連完成。\"\n\nmsgid \"Add all %s nodes to %s[%s] direct connection complete.\"\nmsgstr \"加入所有%s節點到%s[%s]直連完成。\"\n\nmsgid \"Starting to load %s firewall rules...\"\nmsgstr \"開始加载 %s 防火墙規則...\"\n\nmsgid \"local network segments (%s) direct connection: %s\"\nmsgstr \"本機 %s 網段直連：%s\"\n\nmsgid \"Add ISP %s DNS to the whitelist: %s\"\nmsgstr \"追加ISP %s DNS 到白名單：%s\"\n\nmsgid \"[%s]\"\nmsgstr \"【%s】\"\n\nmsgid \"[%s],\"\nmsgstr \"【%s】，\"\n\nmsgid \"Source iface [%s],\"\nmsgstr \"源接口【%s】，\"\n\nmsgid \"IP range [%s],\"\nmsgstr \"IP 範圍【%s】，\"\n\nmsgid \"All device,\"\nmsgstr \"所有設備，\"\n\nmsgid \"Does not exist, ignore.\"\nmsgstr \"不存在，忽略。\"\n\nmsgid \"not proxy %s port [%s]\"\nmsgstr \"不代理 %s 端口 [%s]\"\n\nmsgid \"not proxy all %s\"\nmsgstr \"不代理所有 %s\"\n\nmsgid \"Use the %s node [%s]\"\nmsgstr \"使用 %s 節點[%s]\"\n\nmsgid \"Using a node that is different from the global configuration, DNS has been forcibly redirected to a dedicated DNS server.\"\nmsgstr \"使用与全局配置不相同節點，已將DNS強制重定向到專用 DNS 服務器。\"\n\nmsgid \"Add direct DNS to %s: %s\"\nmsgstr \"追加直連 DNS 到 %s： %s\"\n\nmsgid \"Local\"\nmsgstr \"本機\"\n\nmsgid \"[Local],\"\nmsgstr \"【本機】，\"\n\nmsgid \"Clear %s.\"\nmsgstr \"清除 %s。\"\n\nmsgid \"Delete %s rules is complete.\"\nmsgstr \"刪除 %s 規則完成。\"\n\nmsgid \"%s firewall rules load complete!\"\nmsgstr \"%s 防火墙規則加载完成！\"\n\nmsgid \"Socks switch detection: Unknown error.\"\nmsgstr \"Socks切換檢測：未知錯誤。\"\n\nmsgid \"Socks switch detection: Unable to connect to the network. Please check if the network is working properly!\"\nmsgstr \"Socks切換檢測：無法連接到網絡，請檢查網絡是否正常！\"\n\nmsgid \"Socks switch detection: Primary node 【%s: [%s]】 is normal. Switch to the primary node!\"\nmsgstr \"Socks切換檢測：%s 主節點【%s：[%s]】正常，切換到主節點！\"\n\nmsgid \"Socks switch detection: %s node switch complete!\"\nmsgstr \"Socks切換檢測：%s 節點切換完毕！\"\n\nmsgid \"Socks switch detection: %s 【%s:[%s]】 normal.\"\nmsgstr \"Socks切換檢測：%s 【%s:[%s]】 正常。\"\n\nmsgid \"switch to %s test detect!\"\nmsgstr \"切換到 %s 檢測！\"\n\nmsgid \"backup node\"\nmsgstr \"備用節點\"\n\nmsgid \"next backup node\"\nmsgstr \"下一個備用節點\"\n\nmsgid \"main node\"\nmsgstr \"主節點\"\n\nmsgid \"Socks switch detection: Unknown error.\"\nmsgstr \"Socks切換檢測：未知錯誤。\"\n\nmsgid \"Socks switch detection: %s 【%s:[%s]】 abnormal, %s\"\nmsgstr \"Socks切換檢測：%s 【%s:[%s]】 异常，%s\"\n\nmsgid \"Socks switch detection: %s 【%s:[%s]】 normal, switch to this node!\"\nmsgstr \"Socks切換檢測：%s 【%s:[%s]】 正常，切換到此節點！\"\n\nmsgid \"Restart dnsmasq service.\"\nmsgstr \"重啟 dnsmasq 服務。\"\n\nmsgid \"Console Port: %s\"\nmsgstr \"控制臺端口：%s\"\n\nmsgid \"Discard one obviously invalid node.\"\nmsgstr \"丟棄 1 個明顯無效的節點\"\n\nmsgid \"Entrance %s:%s\"\nmsgstr \"入口 %s:%s\"\n\nmsgid \"Node: %s:%s, Weight: %s\"\nmsgstr \"節點：%s:%s，權重：%s\"\n\nmsgid \"[Rule update] instance is running; please try again later.\"\nmsgstr \"[規則更新]實例正在運行，請稍後再試...\"\n\nmsgid \"[Subscription] instance is running; [Rule Update] queue and wait.\"\nmsgstr \"[訂閱]實例正在運行，[規則更新]進入隊列等待...\"\n\nmsgid \"Start updating the rules...\"\nmsgstr \"開始更新規則...\"\n\nmsgid \"Download file size verification error. Original file size: %sB. Downloaded file size: %sB.\"\nmsgstr \"下載檔案大小校驗出錯，原始檔案大小 %sB，下載檔案大小：%sB。\"\n\nmsgid \"Downloaded file is empty or an error occurred while reading it.\"\nmsgstr \"下載的文件為空或讀取文件時發生錯誤。\"\n\nmsgid \"%s Start updating...\"\nmsgstr \"%s 開始更新...\"\n\nmsgid \"%s version is the same and does not need to be updated.\"\nmsgstr \"%s 版本一致，無需更新。\"\n\nmsgid \"%s an error occurred during the file download process. Please try downloading again.\"\nmsgstr \"%s 下載檔案過程出錯，嘗試重新下載。\"\n\nmsgid \"%s an error occurred while downloading the file. Please check your network or the download link and try again!\"\nmsgstr \"%s 下載檔案過程出錯，請檢查網頁或下載連結後重試！\"\n\nmsgid \"%s update success.\"\nmsgstr \"%s 更新成功。\"\n\nmsgid \"%s update failed, please try again later or change URL.\"\nmsgstr \"%s 更新失敗，請稍後再試或更換 URL。\"\n\nmsgid \"%s update error!\"\nmsgstr \"%s 更新發生錯誤！\"\n\nmsgid \"Restart the service and apply the new rules.\"\nmsgstr \"重啟服務，應用新的規則。\"\n\nmsgid \"The rules have been updated...\"\nmsgstr \"規則更新完毕...\"\n\nmsgid \"Socks node list [%s]\"\nmsgstr \"Socks 節點列表 [%s]\"\n\nmsgid \"Backup node list\"\nmsgstr \"備用節點的列表\"\n\nmsgid \"HAProxy node list [%s]\"\nmsgstr \"HAProxy 節點列表 [%s]\"\n\nmsgid \"ACL list [%s]\"\nmsgstr \"訪問控制列表 [%s]\"\n\nmsgid \"Shunt [%s] node\"\nmsgstr \"分流 [%s] 節點\"\n\nmsgid \"Xray Load Balancing node [%s] list\"\nmsgstr \"Xray 負載均衡節點 [%s] 列表\"\n\nmsgid \"Xray Load Balancing node [%s] backup node\"\nmsgstr \"Xray 負載均衡節點 [%s] 後備節點\"\n\nmsgid \"Sing-Box URLTest node [%s] list\"\nmsgstr \"Sing-Box URLTest 節點 [%s] 列表\"\n\nmsgid \"Node [%s] preproxy node\"\nmsgstr \"節點 [%s] 前置代理節點\"\n\nmsgid \"Node [%s] landing node\"\nmsgstr \"節點 [%s] 落地節點\"\n\nmsgid \"Skipping the %s node is due to incompatibility with the %s core program or incorrect node usage type settings.\"\nmsgstr \"跳過 %s 節點，因未適配到 %s 核心程序，或未正確設置節點使用類型。\"\n\nmsgid \"Skip node: %s. Because Sing-Box does not support the %s protocol's %s transmission method, Xray needs to be used instead.\"\nmsgstr \"跳過節點：%s，因 Sing-Box 不支持 %s 協議的 %s 傳輸方式，需更換 Xray。\"\n\nmsgid \"Xray unsupport %s plugin.\"\nmsgstr \"Xray 不支持 %s 插件。\"\n\nmsgid \"Plugin options Incomplete.\"\nmsgstr \"插件選項不完整。\"\n\nmsgid \"shadowsocks-libev unsupport 2022 encryption.\"\nmsgstr \"shadowsocks-libev 不支持2022加密。\"\n\nmsgid \"Please replace %s to support %s transmission method.\"\nmsgstr \"請更換 %s 以支援 %s 傳輸方式。\"\n\nmsgid \"Please replace Xray or Sing-Box to support more transmission methods in Shadowsocks.\"\nmsgstr \"請更換 Xray 或 Sing-Box 來支援 Shadowsocks 更多的傳輸方式。\"\n\nmsgid \"unsupport %s plugin.\"\nmsgstr \"不支持 %s 插件。\"\n\nmsgid \"Skip the %s node because the %s core program is not installed.\"\nmsgstr \"跳過 %s 節點，因未安装 %s 核心程序 %s。\"\n\nmsgid \"Skip the %s node, as %s type nodes require Sing-Box version 1.12 or higher.\"\nmsgstr \"跳過 %s 節點，因 %s 類型的節點需要 Sing-Box 1.12 以上版本支持。\"\n\nmsgid \"%s type node subscriptions are not currently supported, skip this node.\"\nmsgstr \"暫時不支持 %s 類型的節點訂閱，跳過此節點。\"\n\nmsgid \"Update [%s]\"\nmsgstr \"更新【%s】\"\n\nmsgid \"Matching node:\"\nmsgstr \"匹配節點：\"\n\nmsgid \"First Matching node:\"\nmsgstr \"第一匹配節點：\"\n\nmsgid \"Second Matching node:\"\nmsgstr \"第二匹配節點：\"\n\nmsgid \"Third Matching node:\"\nmsgstr \"第三匹配節點：\"\n\nmsgid \"Fourth Matching node:\"\nmsgstr \"第四匹配節點：\"\n\nmsgid \"Fifth Matching node:\"\nmsgstr \"第五匹配節點：\"\n\nmsgid \"Unable to find the best matching node, now replaced with:\"\nmsgstr \"無法找到最匹配的節點，當前已更換為：\"\n\nmsgid \"Unable to find a new node. Please confirm and process manually.\"\nmsgstr \"無法匹配到新的節點，請手動確認處理。\"\n\nmsgid \"No node information updates are available.\"\nmsgstr \"沒有可用的節點信息更新。\"\n\nmsgid \"Skip unknown types:\"\nmsgstr \"跳過未知類型：\"\n\nmsgid \"Discard node: %s, Reason:\"\nmsgstr \"丟棄節點: %s ，原因：\"\n\nmsgid \"No usable binary was found.\"\nmsgstr \"找不到可使用二進制。\"\n\nmsgid \"Discard filter nodes: %s type node %s\"\nmsgstr \"丟棄過濾節點: %s 類型節點 %s\"\n\nmsgid \"Parsing error, skip this node.\"\nmsgstr \"解析錯誤，跳過此節點。\"\n\nmsgid \"Successfully resolved the [%s] node, number: %s\"\nmsgstr \"成功解析【%s】節點，數量：%s\"\n\nmsgid \"Get subscription content for [%s] is empty. This may be due to an invalid subscription address or a network problem. Please diagnose the issue!\"\nmsgstr \"獲取到的【%s】訂閱內容為空，可能是訂閱地址無效，或是網絡問題，請診斷！\"\n\nmsgid \"Proxy\"\nmsgstr \"代理\"\n\nmsgid \"[Subscription] instance is running; please try again later.\"\nmsgstr \"[訂閱]實例正在運行，請稍後再試...\"\n\nmsgid \"[Rule Update] instance is running; [Subscription] queue and wait.\"\nmsgstr \"[規則更新]實例正在運行，[訂閱]進入隊列等待...\"\n\nmsgid \"Start subscribing...\"\nmsgstr \"開始訂閱...\"\n\nmsgid \"Start subscribing: %s\"\nmsgstr \"開始訂閱：%s\"\n\nmsgid \"Subscription: [%s] No changes, no update required.\"\nmsgstr \"訂閱:【%s】沒有變化，無需更新。\"\n\nmsgid \"[%s] Subscription failed. This could be due to an invalid subscription address or a network issue. Please diagnose the problem! [%s]\"\nmsgstr \"【%s】訂閱失敗，可能是訂閱地址無效，或是網絡問題，請診斷！[%s]\"\n\nmsgid \"Error, restoring service.\"\nmsgstr \"發生錯誤, 正在恢復服務。\"\n\nmsgid \"Subscription complete...\"\nmsgstr \"訂閱完毕...\"\n\nmsgid \"Processing, please wait…\"\nmsgstr \"正在處理，請稍候。\"\n"
  },
  {
    "path": "luci-app-passwall2/po/zh_Hans/passwall2.po",
    "content": "msgid \"Auto\"\nmsgstr \"自动\"\n\nmsgid \"RUNNING\"\nmsgstr \"运行中\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\nmsgid \"Working...\"\nmsgstr \"连接正常\"\n\nmsgid \"Problem detected!\"\nmsgstr \"连接失败\"\n\nmsgid \"Touch Check\"\nmsgstr \"点我检测\"\n\nmsgid \"Global\"\nmsgstr \"全局\"\n\nmsgid \"Kernel Unsupported\"\nmsgstr \"内核不支持\"\n\nmsgid \"Basic Settings\"\nmsgstr \"基本设置\"\n\nmsgid \"Node List\"\nmsgstr \"节点列表\"\n\nmsgid \"Other Settings\"\nmsgstr \"高级设置\"\n\nmsgid \"Load Balancing\"\nmsgstr \"负载均衡\"\n\nmsgid \"Enter interface\"\nmsgstr \"进入界面\"\n\nmsgid \"Rule Manage\"\nmsgstr \"规则管理\"\n\nmsgid \"Rule List\"\nmsgstr \"规则列表\"\n\nmsgid \"Access control\"\nmsgstr \"访问控制\"\n\nmsgid \"Watch Logs\"\nmsgstr \"查看日志\"\n\nmsgid \"Node Config\"\nmsgstr \"节点配置\"\n\nmsgid \"Running Status\"\nmsgstr \"运行状态\"\n\nmsgid \"Baidu Connection\"\nmsgstr \"百度连接\"\n\nmsgid \"Google Connection\"\nmsgstr \"谷歌连接\"\n\nmsgid \"GitHub Connection\"\nmsgstr \"GitHub连接\"\n\nmsgid \"Instagram Connection\"\nmsgstr \"Instagram连接\"\n\nmsgid \"Node Check\"\nmsgstr \"节点检测\"\n\nmsgid \"Check...\"\nmsgstr \"检测中...\"\n\nmsgid \"Clear\"\nmsgstr \"清除\"\n\nmsgid \"Main switch\"\nmsgstr \"主开关\"\n\nmsgid \"Node\"\nmsgstr \"节点\"\n\nmsgid \"Edit Current Node\"\nmsgstr \"编辑当前节点\"\n\nmsgid \"Localhost Proxy\"\nmsgstr \"路由器本机代理\"\n\nmsgid \"When selected, localhost can transparent proxy.\"\nmsgstr \"当勾选时，路由器本机可以透明代理。\"\n\nmsgid \"Client Proxy\"\nmsgstr \"客户端代理\"\n\nmsgid \"When selected, devices in LAN can transparent proxy. Otherwise, it will not be proxy. But you can still use access control to allow the designated device to proxy.\"\nmsgstr \"当勾选时，局域网内的设备可以透明代理。否则，将不代理。但您仍然可以使用访问控制允许指定的设备代理。\"\n\nmsgid \"Missing components, transparent proxy is unavailable.\"\nmsgstr \"缺少组件，透明代理不可用。\"\n\nmsgid \"Socks Config\"\nmsgstr \"Socks 配置\"\n\nmsgid \"Socks Node\"\nmsgstr \"Socks 节点\"\n\nmsgid \"Current Node\"\nmsgstr \"当前节点\"\n\nmsgid \"Listen Port\"\nmsgstr \"监听端口\"\n\nmsgid \"0 is not use\"\nmsgstr \"0为不使用\"\n\nmsgid \"Current node: %s\"\nmsgstr \"当前节点：%s\"\n\nmsgid \"Direct domain DNS routing\"\nmsgstr \"直连域名 DNS 分流\"\n\nmsgid \"Please note that the program will not start if the format is incorrect!\"\nmsgstr \"请注意，格式不正确将无法启动！\"\n\nmsgid \"IP:Port mode acceptable, multi value split with english comma.\"\nmsgstr \"接受 IP:Port 形式的输入，多个以英文逗号分隔。\"\n\nmsgid \"Direct DNS Protocol\"\nmsgstr \"直连 DNS 协议\"\n\nmsgid \"Direct DNS\"\nmsgstr \"直连 DNS\"\n\nmsgid \"Direct DNS DoH\"\nmsgstr \"直连 DNS DoH\"\n\nmsgid \"Direct DNS EDNS Client Subnet\"\nmsgstr \"直连 DNS EDNS Client Subnet\"\n\nmsgid \"Remote DNS Protocol\"\nmsgstr \"远程 DNS 协议\"\n\nmsgid \"Remote DNS\"\nmsgstr \"远程 DNS\"\n\nmsgid \"Remote DNS DoH\"\nmsgstr \"远程 DNS DoH\"\n\nmsgid \"Remote DNS EDNS Client Subnet\"\nmsgstr \"远程 DNS EDNS Client Subnet\"\n\nmsgid \"Notify the DNS server when the DNS query is notified, the location of the client (cannot be a private IP address).\"\nmsgstr \"用于 DNS 查询时通知 DNS 服务器，客户端所在的地理位置（不能是私有 IP 地址）。\"\n\nmsgid \"This feature requires the DNS server to support the Edns Client Subnet (RFC7871).\"\nmsgstr \"此功能需要 DNS 服务器支持 EDNS Client Subnet（RFC7871）。\"\n\nmsgid \"Remote DNS Outbound\"\nmsgstr \"远程 DNS 出站\"\n\nmsgid \"Remote\"\nmsgstr \"远程\"\n\nmsgid \"Direct\"\nmsgstr \"直连\"\n\nmsgid \"Direct Query Strategy\"\nmsgstr \"直连查询策略\"\n\nmsgid \"Remote Query Strategy\"\nmsgstr \"远程查询策略\"\n\nmsgid \"Use FakeDNS work in the domain that proxy.\"\nmsgstr \"需要代理的域名使用 FakeDNS。\"\n\nmsgid \"Suitable scenarios for let the node servers get the target domain names.\"\nmsgstr \"适合让节点服务器获取目标域名的场景。\"\n\nmsgid \"Such as: DNS unlocking of streaming media, reducing DNS query latency, etc.\"\nmsgstr \"例如：流媒体的 DNS 解锁、减少 DNS 查询延迟等。\"\n\nmsgid \"Domain Override\"\nmsgstr \"域名重写\"\n\nmsgid \"Direct DNS result write to IPSet\"\nmsgstr \"直连 DNS 解析结果写入到 IPSet\"\n\nmsgid \"Perform the matching direct domain name rules into IP to IPSet/NFTSet, and then connect directly (not entering the core).\"\nmsgstr \"将匹配到的直连规则的域名解析IP写入到 IPSet/NFTSet，然后直连（不进入内核）。\"\n\nmsgid \"Maybe conflict with some special circumstances.\"\nmsgstr \"可能和某些特殊情况冲突。\"\n\nmsgid \"DNS Redirect\"\nmsgstr \"DNS 重定向\"\n\nmsgid \"Force special DNS server to need proxy devices.\"\nmsgstr \"强制需要代理的设备使用专用 DNS 服务器。\"\n\nmsgid \"Clear IPSET\"\nmsgstr \"清空 IPSET\"\n\nmsgid \"Clear NFTSET\"\nmsgstr \"清空 NFTSET\"\n\nmsgid \"Try this feature if the rule modification does not take effect.\"\nmsgstr \"如果修改规则后没有生效，请尝试此功能。\"\n\nmsgid \"About DNS issues:\"\nmsgstr \"关于DNS问题：\"\n\nmsgid \"Some browsers may have built-in DNS, be sure to close. Example: Chrome. Settings - Security and Privacy - Security - Use secure DNS disabled.\"\nmsgstr \"部分浏览器可能有内置的DNS，请务必关闭。如：chrome。 设置 - 安全和隐私设置 - 使用安全 DNS 关闭。\"\n\nmsgid \"Sometimes after restart, you can not internet. At this time, close all browsers (important), Windows Client, please `ipconfig /flushdns`. Please close the WiFi on the phone, cut the flight mode and then cut back.\"\nmsgstr \"有时候重启后，上不了。这时请先关闭所有浏览器（重要），Windows客户端请`ipconfig /flushdns`。手机端请关闭WIFI，切一下飞行模式再切回来。\"\n\nmsgid \"The client DNS and the default gateway must point to this router.\"\nmsgstr \"客户端DNS和默认网关必须指向本路由器。\"\n\nmsgid \"If you have a wrong DNS process, the consequences are at your own risk!\"\nmsgstr \"如果你自行配置了错误的DNS流程，后果自负！\"\n\nmsgid \"Hide menu method, input example in the address bar:\"\nmsgstr \"隐藏菜单方法，地址栏输入例：\"\n\nmsgid \"After the hidden to the display, input example in the address bar:\"\nmsgstr \"当你隐藏后想再次显示，地址栏输入例：\"\n\nmsgid \"Are you sure to hide?\"\nmsgstr \"你确定要隐藏吗？\"\n\nmsgid \"DNS related issues:\"\nmsgstr \"DNS相关问题：\"\n\nmsgid \"Certain browsers such as Chrome have built-in DNS service, which may affect DNS resolution settings. You can go to 'Settings -> Privacy and security -> Use secure DNS' menu to turn it off.\"\nmsgstr \"某些浏览器如Chrome等内置此功能,这会影响设置的DNS解析。您可以进入 '设置->私隐和安全->使用安全DNS' 菜单,将其关闭。\"\n\nmsgid \"If you are unable to access the internet after reboot, please try clearing the cache of your terminal devices (make sure to close all open browser application windows first, this step is especially important):\"\nmsgstr \"如果在重启后无法上网,请尝试清除终端设备的缓存（先关闭所有正在使用的浏览器应用程序，这一步尤其重要）：\"\n\nmsgid \"For Windows systems, open Command Prompt and run the command 'ipconfig /flushdns'.\"\nmsgstr \"对于Windows系统,请在命令提示符中运行命令 'ipconfig /flushdns'.\"\n\nmsgid \"For Mac systems, open Terminal and run the command 'sudo killall -HUP mDNSResponder'.\"\nmsgstr \"对于Mac系统，在终端中运行命令 'sudo killall -HUP mDNSResponder'.\"\n\nmsgid \"For mobile devices, you can clear it by reconnecting to the network, such as toggling Airplane Mode and reconnecting to WiFi.\"\nmsgstr \"对于移动设备,可通过重新接入网络的方式清除。比如开关一次飞行模式,重新连接WiFi。\"\n\nmsgid \"Please make sure your device's network settings point both the DNS server and default gateway to this router, to ensure DNS queries are properly routed.\"\nmsgstr \"请确认您设备的网络设置,客户端DNS服务器和默认网关应均指向本路由器,以确保DNS查询正确路由。\"\n\nmsgid \"Browser access:\"\nmsgstr \"浏览器访问：\"\n\nmsgid \"Hide in main menu:\"\nmsgstr \"在主菜单中隐藏：\"\n\nmsgid \"Show in main menu:\"\nmsgstr \"在主菜单中显示：\"\n\nmsgid \"DNS Export Of Multi WAN\"\nmsgstr \"国内DNS指定解析出口\"\n\nmsgid \"Node Export Of Multi WAN\"\nmsgstr \"节点指定出口\"\n\nmsgid \"Only support Multi Wan.\"\nmsgstr \"只有多线接入才有效。\"\n\nmsgid \"Not Specify\"\nmsgstr \"不指定\"\n\nmsgid \"custom\"\nmsgstr \"自定义\"\n\nmsgid \"If not available, try clearing the cache.\"\nmsgstr \"如果无法使用，请尝试清除缓存。\"\n\nmsgid \"Operation\"\nmsgstr \"操作\"\n\nmsgid \"Add Node\"\nmsgstr \"添加节点\"\n\nmsgid \"Add the node via the link\"\nmsgstr \"通过链接添加节点\"\n\nmsgid \"Enter share links, one per line. Subscription links are not supported!\"\nmsgstr \"输入分享链接，支持多个节点，每行一个。请勿输入订阅链接！\"\n\nmsgid \"Please enter the correct link.\"\nmsgstr \"请输入正确的链接。\"\n\nmsgid \"Clear all nodes\"\nmsgstr \"清空所有节点\"\n\nmsgid \"Are you sure to clear all nodes?\"\nmsgstr \"你确定要清空所有节点吗？\"\n\nmsgid \"Success\"\nmsgstr \"成功\"\n\nmsgid \"Error\"\nmsgstr \"错误\"\n\nmsgid \"Delete select nodes\"\nmsgstr \"删除选择的节点\"\n\nmsgid \"To Top\"\nmsgstr \"置顶\"\n\nmsgid \"Select\"\nmsgstr \"选择\"\n\nmsgid \"Selected:\"\nmsgstr \"已选：\"\n\nmsgid \"DeSelect\"\nmsgstr \"反选\"\n\nmsgid \"Select all\"\nmsgstr \"全选\"\n\nmsgid \"DeSelect all\"\nmsgstr \"全不选\"\n\nmsgid \"Are you sure to delete select nodes?\"\nmsgstr \"你确定要删除选择的节点吗？\"\n\nmsgid \"You no select nodes !\"\nmsgstr \"你没有选择任何节点！\"\n\nmsgid \"Are you sure set to\"\nmsgstr \"你确定要设为\"\n\nmsgid \"the server?\"\nmsgstr \"服务器吗？\"\n\nmsgid \"You choose node is:\"\nmsgstr \"你选择的节点是：\"\n\nmsgid \"Timeout\"\nmsgstr \"超时\"\n\nmsgid \"Node Remarks\"\nmsgstr \"节点备注\"\n\nmsgid \"Add Mode\"\nmsgstr \"添加方式\"\n\nmsgid \"Save Order\"\nmsgstr \"保存当前顺序\"\n\nmsgid \"Saved current page order successfully.\"\nmsgstr \"保存当前页面顺序成功。\"\n\nmsgid \"Drag to reorder\"\nmsgstr \"拖动以重排\"\n\nmsgid \"Type\"\nmsgstr \"类型\"\n\nmsgid \"_balancing\"\nmsgstr \"负载均衡\"\n\nmsgid \"_shunt\"\nmsgstr \"分流\"\n\nmsgid \"Balancing\"\nmsgstr \"负载均衡\"\n\nmsgid \"Node Addition Method\"\nmsgstr \"节点添加方式\"\n\nmsgid \"Manual\"\nmsgstr \"手动\"\n\nmsgid \"Batch\"\nmsgstr \"批量\"\n\nmsgid \"Select Group\"\nmsgstr \"选择分组\"\n\nmsgid \"Node Matching Rules\"\nmsgstr \"节点匹配规则\"\n\nmsgid \"\"\n\"Example: <code>^A && B && !C && D$</code><br>\"\n\"This means the node remark must start with A (^), include B, exclude C (!), and end with D ($).<br>\"\n\"Conditions are joined by <code>&&</code>, and their order does not affect the result.\"\nmsgstr \"\"\n\"示例：<code>^A && B && !C && D$</code><br>\"\n\"表示节点备注需同时满足：以 A 开头（^）、包含 B、不包含 C（!）、并以 D 结尾（$）。<br>\"\n\"多个条件使用 <code>&&</code> 连接，条件顺序不影响结果。\"\n\nmsgid \"Balancing Strategy\"\nmsgstr \"负载均衡策略\"\n\nmsgid \"Fallback Node\"\nmsgstr \"后备节点\"\n\nmsgid \"Use Custom Probe URL\"\nmsgstr \"使用自定义探测网址\"\n\nmsgid \"By default the built-in probe URL will be used, enable this option to use a custom probe URL.\"\nmsgstr \"默认使用内置的探测网址，启用此选项以使用自定义探测网址。\"\n\nmsgid \"Probe URL\"\nmsgstr \"探测网址\"\n\nmsgid \"The URL used to detect the connection status.\"\nmsgstr \"用于检测连接状态的网址。\"\n\nmsgid \"Probe Interval\"\nmsgstr \"探测间隔\"\n\nmsgid \"The interval between initiating probes.\"\nmsgstr \"发起探测的间隔。\"\n\nmsgid \"The time format is numbers + units, such as '10s', '2h45m', and the supported time units are <code>s</code>, <code>m</code>, <code>h</code>, which correspond to seconds, minutes, and hours, respectively.\"\nmsgstr \"时间格式为数字+单位，比如<code>&quot;10s&quot;</code>, <code>&quot;2h45m&quot;</code>，支持的时间单位有 <code>s</code>，<code>m</code>，<code>h</code>，分别对应秒、分、时。\"\n\nmsgid \"When the unit is not filled in, it defaults to seconds.\"\nmsgstr \"未填写单位时，默认为秒。\"\n\nmsgid \"Preferred Node Count\"\nmsgstr \"优选节点数量\"\n\nmsgid \"The load balancer selects the optimal number of nodes, and traffic is randomly distributed among them.\"\nmsgstr \"负载均衡器选出最优节点的个数，流量将在这几个节点中随机分配。\"\n\nmsgid \"Shunt\"\nmsgstr \"分流\"\n\nmsgid \"Preproxy\"\nmsgstr \"前置代理\"\n\nmsgid \"Preproxy Node\"\nmsgstr \"前置代理节点\"\n\nmsgid \"Set the node to be used as a pre-proxy.\"\nmsgstr \"设置用作前置代理的节点。\"\n\nmsgid \"Each rule has a separate switch that controls whether this rule uses the pre-proxy or not.\"\nmsgstr \"每条规则都有独立开关控制本规则是否使用前置代理。\"\n\nmsgid \"Close (Not use)\"\nmsgstr \"关闭 (不使用)\"\n\nmsgid \"Use default node\"\nmsgstr \"使用默认节点\"\n\nmsgid \"Direct Connection\"\nmsgstr \"直连\"\n\nmsgid \"Blackhole (Block)\"\nmsgstr \"黑洞（屏蔽）\"\n\nmsgid \"There are no available nodes, please add or subscribe nodes first.\"\nmsgstr \"没有可用节点，请先添加或订阅节点。\"\n\nmsgid \"No shunt rules? Click me to go to add.\"\nmsgstr \"没有分流规则？点我前往去添加。\"\n\nmsgid \"When using, localhost will connect this node first and then use this node to connect the default node.\"\nmsgstr \"当使用时，本机将首先连接到此节点，然后再使用此节点连接到默认节点落地。\"\n\nmsgid \"Domain Strategy\"\nmsgstr \"域名解析策略\"\n\nmsgid \"Domain matcher\"\nmsgstr \"域名匹配算法\"\n\nmsgid \"'AsIs': Only use domain for routing. Default value.\"\nmsgstr \"AsIs：只使用域名进行路由选择。默认值。\"\n\nmsgid \"'IPIfNonMatch': When no rule matches current domain, resolves it into IP addresses (A or AAAA records) and try all rules again.\"\nmsgstr \"IPIfNonMatch：当域名没有匹配任何规则时，将域名解析成 IP（A 记录或 AAAA 记录）再次进行匹配。\"\n\nmsgid \"'IPOnDemand': As long as there is a IP-based rule, resolves the domain into IP immediately.\"\nmsgstr \"IPOnDemand：当匹配时碰到任何基于 IP 的规则，将域名立即解析为 IP 进行匹配。\"\n\nmsgid \"Load balancing node list\"\nmsgstr \"负载均衡节点列表\"\n\nmsgid \"Load balancing node list, <a target='_blank' href='https://xtls.github.io/config/routing.html#balancerobject'>document</a>\"\nmsgstr \"负载均衡节点列表，<a target='_blank' href='https://xtls.github.io/config/routing.html#balancerobject'>文档原理</a>\"\n\nmsgid \"From Share URL\"\nmsgstr \"导入分享URL\"\n\nmsgid \"Build Share URL\"\nmsgstr \"导出分享URL\"\n\nmsgid \"Generate QRCode\"\nmsgstr \"生成二维码\"\n\nmsgid \"Export Config File\"\nmsgstr \"导出配置文件\"\n\nmsgid \"Import Finished\"\nmsgstr \"导入完成：\"\n\nmsgid \"Not a supported scheme:\"\nmsgstr \"不支持这种样式的：\"\n\nmsgid \"Invalid Share URL Format\"\nmsgstr \"无效的分享URL信息\"\n\nmsgid \"Paste Share URL Here\"\nmsgstr \"在此处粘贴分享信息\"\n\nmsgid \"Share URL to clipboard unable.\"\nmsgstr \"无法分享URL到剪贴板。\"\n\nmsgid \"Share URL to clipboard successfully.\"\nmsgstr \"成功复制分享URL到剪贴板。\"\n\nmsgid \"Faltal on get option, please help in debug:\"\nmsgstr \"代码错误，请协助捉虫：\"\n\nmsgid \"Faltal on set option, please help in debug:\"\nmsgstr \"代码错误，请协助捉虫：\"\n\nmsgid \"Address\"\nmsgstr \"地址\"\n\nmsgid \"Address (Support Domain Name)\"\nmsgstr \"地址（支持域名）\"\n\nmsgid \"Trojan Verify Cert\"\nmsgstr \"验证证书\"\n\nmsgid \"Trojan Cert Path\"\nmsgstr \"证书路径\"\n\nmsgid \"Finger Print\"\nmsgstr \"指纹伪造\"\n\nmsgid \"Avoid using randomized, unless you have to.\"\nmsgstr \"避免使用 randomized , 除非你必须要。\"\n\nmsgid \"Original\"\nmsgstr \"原版\"\n\nmsgid \"Transport Plugin\"\nmsgstr \"传输层插件\"\n\nmsgid \"Shadowsocks secondary encryption\"\nmsgstr \"Shadowsocks 二次加密\"\n\nmsgid \"Obfs Type\"\nmsgstr \"混淆类型\"\n\nmsgid \"Obfs Password\"\nmsgstr \"混淆密码\"\n\nmsgid \"Auth Type\"\nmsgstr \"认证类型\"\n\nmsgid \"Auth Password\"\nmsgstr \"认证密码\"\n\nmsgid \"Client BBR Flow Control\"\nmsgstr \"客户端 BBR 流控\"\n\nmsgid \"Commands the client to use the BBR flow control algorithm\"\nmsgstr \"命令客户端使用 BBR 流量控制算法\"\n\nmsgid \"PinSHA256\"\nmsgstr \"PinSHA256\"\n\nmsgid \"Certificate fingerprint\"\nmsgstr \"证书指纹\"\n\nmsgid \"Max upload Mbps\"\nmsgstr \"最大上行(Mbps)\"\n\nmsgid \"Max download Mbps\"\nmsgstr \"最大下行(Mbps)\"\n\nmsgid \"QUIC stream receive window\"\nmsgstr \"QUIC 流接收窗口\"\n\nmsgid \"QUIC connection receive window\"\nmsgstr \"QUIC 连接接收窗口\"\n\nmsgid \"QUIC concurrent bidirectional streams\"\nmsgstr \"QUIC 并发双向流的最大数量\"\n\nmsgid \"QUIC KeepAlive interval\"\nmsgstr \"QUIC KeepAlive 间隔\"\n\nmsgid \"Disable MTU detection\"\nmsgstr \"禁用 MTU 检测\"\n\nmsgid \"ignoreClientBandwidth\"\nmsgstr \"忽略客户端带宽设置\"\n\nmsgid \"Lazy Start\"\nmsgstr \"延迟启动\"\n\nmsgid \"Encrypt Method\"\nmsgstr \"加密方式\"\n\nmsgid \"Encrypt Key\"\nmsgstr \"加密密钥\"\n\nmsgid \"Latency\"\nmsgstr \"延迟\"\n\nmsgid \"Automatic detection delay\"\nmsgstr \"自动检测延迟\"\n\nmsgid \"Show server address and port\"\nmsgstr \"显示服务器地址和端口\"\n\nmsgid \"URL Test Address\"\nmsgstr \"URL 测试地址\"\n\nmsgid \"URL Test\"\nmsgstr \"URL 测试\"\n\nmsgid \"Test\"\nmsgstr \"测试\"\n\nmsgid \"Node num\"\nmsgstr \"节点数量\"\n\nmsgid \"Self add\"\nmsgstr \"自添\"\n\nmsgid \"Apply\"\nmsgstr \"应用\"\n\nmsgid \"Use\"\nmsgstr \"使用\"\n\nmsgid \"Copy\"\nmsgstr \"复制\"\n\nmsgid \"Delay Settings\"\nmsgstr \"定时配置\"\n\nmsgid \"Open and close Daemon\"\nmsgstr \"启动守护进程\"\n\nmsgid \"Delay Start\"\nmsgstr \"开机时延时启动\"\n\nmsgid \"Units:seconds\"\nmsgstr \"单位：秒\"\n\nmsgid \"Units:minutes\"\nmsgstr \"单位：分钟\"\n\nmsgid \"stop automatically mode\"\nmsgstr \"定时关闭模式\"\n\nmsgid \"stop Time(Every day)\"\nmsgstr \"关闭时间(每天)\"\n\nmsgid \"stop Interval(Hour)\"\nmsgstr \"关闭间隔(小时)\"\n\nmsgid \"start automatically mode\"\nmsgstr \"定时开启模式\"\n\nmsgid \"start Time(Every day)\"\nmsgstr \"开启时间(每天)\"\n\nmsgid \"start Interval(Hour)\"\nmsgstr \"开启间隔(小时)\"\n\nmsgid \"restart automatically mode\"\nmsgstr \"定时重启模式\"\n\nmsgid \"restart Time(Every day)\"\nmsgstr \"重启时间(每天)\"\n\nmsgid \"restart Interval(Hour)\"\nmsgstr \"重启间隔(小时)\"\n\nmsgid \"Forwarding Settings\"\nmsgstr \"转发配置\"\n\nmsgid \"TCP No Redir Ports\"\nmsgstr \"TCP不转发端口\"\n\nmsgid \"UDP No Redir Ports\"\nmsgstr \"UDP不转发端口\"\n\nmsgid \"Fill in the ports you don't want to be forwarded by the agent, with the highest priority.\"\nmsgstr \"填写你不希望被代理转发的端口，优先级最高。\"\n\nmsgid \"If you don't want to let the device in the list to go proxy, please choose all.\"\nmsgstr \"如果您不想让列表中的设备走代理，请选择全部。\"\n\nmsgid \"The port settings support single ports and ranges.<br>Separate multiple ports with commas (,).<br>Example: 21,80,443,1000:2000.\"\nmsgstr \"以上端口设置支持单端口和端口范围。<br>多个端口用英文逗号(,)隔开。<br>例：21,80,443,1000:2000。\"\n\nmsgid \"TCP Proxy Drop Ports\"\nmsgstr \"TCP转发屏蔽端口\"\n\nmsgid \"UDP Proxy Drop Ports\"\nmsgstr \"UDP转发屏蔽端口\"\n\nmsgid \"TCP Redir Ports\"\nmsgstr \"TCP转发端口\"\n\nmsgid \"UDP Redir Ports\"\nmsgstr \"UDP转发端口\"\n\nmsgid \"No patterns are used\"\nmsgstr \"不使用\"\n\nmsgid \"All\"\nmsgstr \"所有\"\n\nmsgid \"Common Use\"\nmsgstr \"常用的\"\n\nmsgid \"Only Web\"\nmsgstr \"仅网页\"\n\nmsgid \"or more\"\nmsgstr \"及以上\"\n\nmsgid \"or less\"\nmsgstr \"及以下\"\n\nmsgid \"Default\"\nmsgstr \"默认\"\n\nmsgid \"Close\"\nmsgstr \"关闭\"\n\nmsgid \"Hijacking ICMP (PING)\"\nmsgstr \"劫持ICMP (PING)\"\n\nmsgid \"Hijacking ICMPv6 (IPv6 PING)\"\nmsgstr \"劫持ICMPv6 (IPv6 PING)\"\n\nmsgid \"Force Proxy LAN IP\"\nmsgstr \"强制代理内网IP段\"\n\nmsgid \"By default, commonly used internal network IP ranges will be connect directly (not entering the core). If you want a certain network range to go through a proxy, please add it here.\"\nmsgstr \"默认情况下，常用内网IP网段将直连（不进入内核），如果你希望某个网段走代理，请在此添加。\"\n\nmsgid \"Sniffing\"\nmsgstr \"流量嗅探\"\n\nmsgid \"TCP Proxy Way\"\nmsgstr \"TCP代理方式\"\n\nmsgid \"Auto Switch\"\nmsgstr \"自动切换\"\n\nmsgid \"When there is no server, an automatic reconnect scheme is used\"\nmsgstr \"当没有服务器时，则使用自动重连方案\"\n\nmsgid \"How often to test\"\nmsgstr \"多久检测一次\"\n\nmsgid \"Timeout seconds\"\nmsgstr \"超时秒数\"\n\nmsgid \"Timeout retry num\"\nmsgstr \"超时重试次数\"\n\nmsgid \"Automatic switching cannot be used when this option is checked\"\nmsgstr \"当勾选此选项时，不能使用自动切换\"\n\nmsgid \"Main node\"\nmsgstr \"主节点\"\n\nmsgid \"List of backup nodes\"\nmsgstr \"备用节点的列表\"\n\nmsgid \"Restore Switch\"\nmsgstr \"恢复切换\"\n\nmsgid \"When detects main node is available, switch back to the main node.\"\nmsgstr \"当检测到主节点可用时，切换回主节点。\"\n\nmsgid \"Add nodes to the standby node list by keywords\"\nmsgstr \"通过关键字添加节点到备用节点列表\"\n\nmsgid \"Delete nodes in the standby node list by keywords\"\nmsgstr \"通过关键字删除备用节点列表的节点\"\n\nmsgid \"Please enter the node keyword, pay attention to distinguish between spaces, uppercase and lowercase.\"\nmsgstr \"请输入节点关键字，注意区分空格、大写和小写。\"\n\nmsgid \"Enable Load Balancing\"\nmsgstr \"开启负载均衡\"\n\nmsgid \"Console Login Auth\"\nmsgstr \"控制台登录认证\"\n\nmsgid \"Console Username\"\nmsgstr \"控制台账号\"\n\nmsgid \"Console Password\"\nmsgstr \"控制台密码\"\n\nmsgid \"Console Port\"\nmsgstr \"控制台端口\"\n\nmsgid \"In the browser input routing IP plus port access, such as:192.168.1.1:1188\"\nmsgstr \"在浏览器输入路由IP加端口访问，如：192.168.1.1:1188\"\n\nmsgid \"Haproxy Port\"\nmsgstr \"负载均衡端口\"\n\nmsgid \"Health Check Type\"\nmsgstr \"健康检查类型\"\n\nmsgid \"Inner implement\"\nmsgstr \"内置实现\"\n\nmsgid \"Health Check Inter\"\nmsgstr \"健康检查节点间隔时间\"\n\nmsgid \"When the URL test is used, the load balancing node will be converted into a Socks node. when node list set customizing, must be a Socks node, otherwise the health check will be invalid.\"\nmsgstr \"当使用URL测试时，负载均衡节点将转换成Socks节点。下面的节点列表自定义时必须为Socks节点，否则健康检查将无效。\"\n\nmsgid \"Add a node, Export Of Multi WAN Only support Multi Wan. Load specific gravity range 1-256. Multiple primary servers can be load balanced, standby will only be enabled when the primary server is offline! Multiple groups can be set, Haproxy port same one for each group.\"\nmsgstr \"添加节点，指定出口功能是为多WAN用户准备的。负载比重范围1-256。多个主服务器可以负载均衡，备用只有在主服务器离线时才会启用！可以设置多个组，负载均衡端口相同则为一组。\"\n\nmsgid \"Note that the node configuration parameters for load balancing must be consistent when use TCP health check type, otherwise it cannot be used normally!\"\nmsgstr \"注意，当使用TCP健康检查时负载均衡的节点配置参数必须一致，否则无法正常使用！\"\n\nmsgid \"Node Address\"\nmsgstr \"节点地址\"\n\nmsgid \"Node address cannot be empty.\"\nmsgstr \"节点地址不能为空。\"\n\nmsgid \"Node Port\"\nmsgstr \"节点端口\"\n\nmsgid \"Node Weight\"\nmsgstr \"负载比重\"\n\nmsgid \"Export Of Multi WAN\"\nmsgstr \"多WAN指定出口\"\n\nmsgid \"Main\"\nmsgstr \"主要\"\n\nmsgid \"Mode\"\nmsgstr \"模式\"\n\nmsgid \"Primary\"\nmsgstr \"主要\"\n\nmsgid \"Standby\"\nmsgstr \"备用\"\n\nmsgid \"Check update\"\nmsgstr \"检查更新\"\n\nmsgid \"Force update\"\nmsgstr \"强制更新\"\n\nmsgid \"The latest version: %s, currently does not support automatic update, if you need to update, please compile or download the ipk and then manually install.\"\nmsgstr \"最新版本：%s，目前暂不支持自动更新，如需更新，请自行编译或下载ipk然后手动安装。\"\n\nmsgid \"Enable custom URL\"\nmsgstr \"启用自定义规则地址\"\n\nmsgid \"Rule status\"\nmsgstr \"规则版本\"\n\nmsgid \"Manually update\"\nmsgstr \"手动更新\"\n\nmsgid \"Rollback\"\nmsgstr \"回滚\"\n\nmsgid \"Rollbacking...\"\nmsgstr \"回滚中...\"\n\nmsgid \"Enable auto update rules\"\nmsgstr \"开启自动更新规则\"\n\nmsgid \"Update Time(every day)\"\nmsgstr \"更新时间(每天)\"\n\nmsgid \"Update Interval(hour)\"\nmsgstr \"更新间隔(小时)\"\n\nmsgid \"Update Mode\"\nmsgstr \"更新模式\"\n\nmsgid \"Loop Mode\"\nmsgstr \"循环\"\n\nmsgid \"Every day\"\nmsgstr \"每天\"\n\nmsgid \"Every Monday\"\nmsgstr \"每周一\"\n\nmsgid \"Every Tuesday\"\nmsgstr \"每周二\"\n\nmsgid \"Every Wednesday\"\nmsgstr \"每周三\"\n\nmsgid \"Every Thursday\"\nmsgstr \"每周四\"\n\nmsgid \"Every Friday\"\nmsgstr \"每周五\"\n\nmsgid \"Every Saturday\"\nmsgstr \"每周六\"\n\nmsgid \"Every Sunday\"\nmsgstr \"每周日\"\n\nmsgid \"hour\"\nmsgstr \"小时\"\n\nmsgid \"Hour\"\nmsgstr \"小时\"\n\nmsgid \"GeoIP Update URL\"\nmsgstr \"GeoIP 更新 URL\"\n\nmsgid \"Geosite Update URL\"\nmsgstr \"Geosite 更新 URL\"\n\nmsgid \"Location of Geo rule files\"\nmsgstr \"Geo 资源文件目录\"\n\nmsgid \"This variable specifies a directory where geoip.dat and geosite.dat files are.\"\nmsgstr \"此变量指定geoip.dat和geosite.dat文件所在的目录。\"\n\nmsgid \"Enable GeoIP Data Parsing\"\nmsgstr \"开启 GeoIP 数据解析\"\n\nmsgid \"Analyzes and preloads GeoIP data to enhance the shunt performance.\"\nmsgstr \"分析和预加载 GeoIP 数据，以增强分流效果。\"\n\nmsgid \"Note: Increases resource usage.\"\nmsgstr \"注：会增加一些系统资源的开销。\"\n\nmsgid \"Shunt Rule\"\nmsgstr \"分流规则\"\n\nmsgid \"Please note attention to the priority, the higher the order, the higher the priority.\"\nmsgstr \"请注意优先级问题，排序越上面优先级越高。\"\n\nmsgid \"Update...\"\nmsgstr \"更新中\"\n\nmsgid \"It is the latest version\"\nmsgstr \"已是最新版本\"\n\nmsgid \"Update successful\"\nmsgstr \"更新成功\"\n\nmsgid \"Click to update\"\nmsgstr \"点击更新\"\n\nmsgid \"Updating...\"\nmsgstr \"更新中\"\n\nmsgid \"Retry\"\nmsgstr \"重试\"\n\nmsgid \"Unexpected error\"\nmsgstr \"意外错误\"\n\nmsgid \"Updating, are you sure to close?\"\nmsgstr \"正在更新，你确认要关闭吗？\"\n\nmsgid \"Downloading...\"\nmsgstr \"下载中\"\n\nmsgid \"Unpacking...\"\nmsgstr \"解压中\"\n\nmsgid \"Moving...\"\nmsgstr \"移动中\"\n\nmsgid \"App Update\"\nmsgstr \"组件更新\"\n\nmsgid \"Please confirm that your firmware supports FPU.\"\nmsgstr \"请确认你的固件支持FPU。\"\n\nmsgid \"if you want to run from memory, change the path, /tmp beginning then save the application and update it manually.\"\nmsgstr \"如果你希望从内存中运行，请更改路径，/tmp 开头，然后保存应用后，再手动更新。\"\n\nmsgid \"Make sure there is enough space to install %s\"\nmsgstr \"确保有足够的空间安装 %s\"\n\nmsgid \"App Path\"\nmsgstr \"程序路径\"\n\nmsgid \"%s App Path\"\nmsgstr \"%s 程序路径\"\n\nmsgid \"%s Client App Path\"\nmsgstr \"%s 客户端程序路径\"\n\nmsgid \"Node Subscribe\"\nmsgstr \"节点订阅\"\n\nmsgid \"Subscribe Remark\"\nmsgstr \"订阅备注（机场）\"\n\nmsgid \"Subscribe Info\"\nmsgstr \"订阅信息\"\n\nmsgid \"Subscribe URL\"\nmsgstr \"订阅网址\"\n\nmsgid \"Subscribe URL Access Method\"\nmsgstr \"订阅网址访问方式\"\n\nmsgid \"When adding a new subscription, please save and apply before manually subscribing. If you only change the subscription URL, you can subscribe manually, and the system will save it automatically.\"\nmsgstr \"新增订阅请先保存并应用后再手动订阅；如仅修改订阅地址，可直接手动订阅，系统将自动保存。\"\n\nmsgid \"Please save and apply before manually subscribing.\"\nmsgstr \"请先保存并应用后再手动订阅。\"\n\nmsgid \"Subscribe URL cannot be empty.\"\nmsgstr \"订阅网址不能为空。\"\n\nmsgid \"Subscribe via proxy\"\nmsgstr \"通过代理订阅\"\n\nmsgid \"Update Once on Boot\"\nmsgstr \"开机更新一次\"\n\nmsgid \"Updates the subscription the first time runs automatically after each system boot.\"\nmsgstr \"路由每次启动后，首次自动运行时更新订阅。\"\n\nmsgid \"Enable auto update subscribe\"\nmsgstr \"开启自动更新订阅\"\n\nmsgid \"Manual subscription\"\nmsgstr \"手动订阅\"\n\nmsgid \"Delete All Subscribe Node\"\nmsgstr \"删除所有订阅节点\"\n\nmsgid \"Delete the subscribed node\"\nmsgstr \"删除已订阅的节点\"\n\nmsgid \"Are you sure you want to delete all subscribed nodes?\"\nmsgstr \"您确定要删除所有已订阅的节点吗？\"\n\nmsgid \"Manual subscription All\"\nmsgstr \"手动订阅全部链接\"\n\nmsgid \"This remark already exists, please change a new remark.\"\nmsgstr \"此备注已存在，请改一个新的备注。\"\n\nmsgid \"Remark cannot be empty.\"\nmsgstr \"备注不能为空。\"\n\nmsgid \"URL cannot be empty.\"\nmsgstr \"网址不能为空。\"\n\nmsgid \"Filter keyword Mode\"\nmsgstr \"过滤关键字模式\"\n\nmsgid \"Discard List\"\nmsgstr \"丢弃列表\"\n\nmsgid \"Keep List\"\nmsgstr \"保留列表\"\n\nmsgid \"Discard List,But Keep List First\"\nmsgstr \"丢弃列表，但保留列表优先\"\n\nmsgid \"Keep List,But Discard List First\"\nmsgstr \"保留列表，但丢弃列表优先\"\n\nmsgid \"Use global config\"\nmsgstr \"使用全局配置\"\n\nmsgid \"User-Agent\"\nmsgstr \"用户代理(User-Agent)\"\n\nmsgid \"Add\"\nmsgstr \"添加\"\n\nmsgid \"ACLs\"\nmsgstr \"访问控制\"\n\nmsgid \"ACLs is a tools which used to designate specific IP proxy mode.\"\nmsgstr \"访问控制列表是用于指定特殊IP代理模式的工具。\"\n\nmsgid \"Example:\"\nmsgstr \"例：\"\n\nmsgid \"IP range\"\nmsgstr \"IP 范围\"\n\nmsgid \"Source Interface\"\nmsgstr \"源接口\"\n\nmsgid \"Bridge\"\nmsgstr \"网桥\"\n\nmsgid \"Wireless Adapter\"\nmsgstr \"无线适配器\"\n\nmsgid \"Ethernet Adapter\"\nmsgstr \"以太网适配器\"\n\nmsgid \"Tunnel Interface\"\nmsgstr \"隧道接口\"\n\nmsgid \"Invalid interface name\"\nmsgstr \"无效的接口名称\"\n\nmsgid \"Use Interface With ACLs\"\nmsgstr \"使用接口控制\"\n\nmsgid \"Remarks\"\nmsgstr \"备注\"\n\nmsgid \"Direct List\"\nmsgstr \"直连列表\"\n\nmsgid \"Proxy List\"\nmsgstr \"代理列表\"\n\nmsgid \"Block List\"\nmsgstr \"屏蔽列表\"\n\nmsgid \"Lan IP List\"\nmsgstr \"局域网IP列表\"\n\nmsgid \"Route Hosts\"\nmsgstr \"路由Hosts文件\"\n\nmsgid \"Join the direct hosts list of domain names will not proxy.\"\nmsgstr \"加入的域名不走代理，对所有模式有效。且优先级最高。\"\n\nmsgid \"These had been joined ip addresses will not proxy. Please input the ip address or ip address segment,every line can input only one ip address. For example: 192.168.0.0/24 or 223.5.5.5.\"\nmsgstr \"加入的IP段不走代理，对所有模式有效。且优先级最高。可输入IP地址或地址段，如：192.168.0.0/24或223.5.5.5，每个地址段一行。\"\n\nmsgid \"These had been joined websites will use proxy. Please input the domain names of websites, every line can input only one website domain. For example: google.com.\"\nmsgstr \"加入的域名将走代理。输入网站域名，如：google.com，每个地址段一行。\"\n\nmsgid \"These had been joined ip addresses will use proxy. Please input the ip address or ip address segment, every line can input only one ip address. For example: 35.24.0.0/24 or 8.8.4.4.\"\nmsgstr \"加入的IP段将走代理。可输入IP地址或地址段，如：35.24.0.0/24或8.8.4.4，每个地址段一行。\"\n\nmsgid \"These had been joined websites will be block. Please input the domain names of websites, every line can input only one website domain. For example: twitter.com.\"\nmsgstr \"加入的域名将屏蔽。输入网站域名，如：twitter.com，每个地址段一行。\"\n\nmsgid \"The list is the IPv4 LAN IP list, which represents the direct connection IP of the LAN. If you need the LAN IP in the proxy list, please clear it from the list. Do not modify this list by default.\"\nmsgstr \"列表中为IPv4的局域网IP列表，代表局域网直连IP。如果需要代理列表中的局域网IP，请将其在该列表中清除,并将其添加到代理列表中。默认情况下不要修改这个列表。\"\n\nmsgid \"The list is the IPv6 LAN IP list, which represents the direct connection IP of the LAN. If you need the LAN IP in the proxy list, please clear it from the list. Do not modify this list by default.\"\nmsgstr \"列表中为IPv6的局域网IP列表，代表局域网直连IP。如果需要代理列表中的局域网IP，请将其在该列表中清除,并将其添加到代理列表中。默认情况下不要修改这个列表。\"\n\nmsgid \"Configure routing etc/hosts file, if you don't know what you are doing, please don't change the content.\"\nmsgstr \"配置路由etc/hosts文件，如果你不知道自己在做什么，请不要改动内容。\"\n\nmsgid \"These had been joined ip addresses will be block. Please input the ip address or ip address segment, every line can input only one ip address.\"\nmsgstr \"加入的IP段将屏蔽。可输入IP地址或地址段，每个地址段一行。\"\n\nmsgid \"Inbound Tag\"\nmsgstr \"入站标签\"\n\nmsgid \"Transparent proxy\"\nmsgstr \"透明代理\"\n\nmsgid \"Not valid domain name, please re-enter!\"\nmsgstr \"不是有效域名，请重新输入！\"\n\nmsgid \"Not valid IP format, please re-enter!\"\nmsgstr \"不是有效IP格式，请重新输入！\"\n\nmsgid \"Not valid IPv4 format, please re-enter!\"\nmsgstr \"不是有效IPv4格式，请重新输入！\"\n\nmsgid \"Not valid IPv6 format, please re-enter!\"\nmsgstr \"不是有效IPv6格式，请重新输入！\"\n\nmsgid \"Not true format, please re-enter!\"\nmsgstr \"不是正确的格式，请重新输入！\"\n\nmsgid \"Plaintext: If this string matches any part of the targeting domain, this rule takes effet. Example: rule 'sina.com' matches targeting domain 'sina.com', 'sina.com.cn' and 'www.sina.com', but not 'sina.cn'.\"\nmsgstr \"纯字符串: 当此字符串匹配目标域名中任意部分，该规则生效。比如'sina.com'可以匹配'sina.com'、'sina.com.cn'和'www.sina.com'，但不匹配'sina.cn'。\"\n\nmsgid \"Regular expression: Begining with 'regexp:', the rest is a regular expression. When the regexp matches targeting domain, this rule takes effect. Example: rule 'regexp:\\\\.goo.*\\\\.com$' matches 'www.google.com' and 'fonts.googleapis.com', but not 'google.com'.\"\nmsgstr \"正则表达式: 由'regexp:'开始，余下部分是一个正则表达式。当此正则表达式匹配目标域名时，该规则生效。例如'regexp:\\\\.goo.*\\\\.com$'匹配'www.google.com'、'fonts.googleapis.com'，但不匹配'google.com'。\"\n\nmsgid \"Subdomain (recommended): Begining with 'domain:' and the rest is a domain. When the targeting domain is exactly the value, or is a subdomain of the value, this rule takes effect. Example: rule 'domain:v2ray.com' matches 'www.v2ray.com', 'v2ray.com', but not 'xv2ray.com'.\"\nmsgstr \"子域名 (推荐): 由'domain:'开始，余下部分是一个域名。当此域名是目标域名或其子域名时，该规则生效。例如'domain:v2ray.com'匹配'www.v2ray.com'、'v2ray.com'，但不匹配'xv2ray.com'。\"\n\nmsgid \"Full domain: Begining with 'full:' and the rest is a domain. When the targeting domain is exactly the value, the rule takes effect. Example: rule 'domain:v2ray.com' matches 'v2ray.com', but not 'www.v2ray.com'.\"\nmsgstr \"完整匹配: 由'full:'开始，余下部分是一个域名。当此域名完整匹配目标域名时，该规则生效。例如'full:v2ray.com'匹配'v2ray.com'但不匹配'www.v2ray.com'。\"\n\nmsgid \"Sing-Box rule-set: Begining with 'rule-set:remote:' or 'rule-set:local:'\"\nmsgstr \"Sing-Box 规则集： 由 'rule-set:remote:' 或 'rule-set:local:' 开始\"\n\nmsgid \"Such as:\"\nmsgstr \"例如：\"\n\nmsgid \"Pre-defined domain list: Begining with 'geosite:' and the rest is a name, such as geosite:google or geosite:cn.\"\nmsgstr \"预定义域名列表：由'geosite:'开头，余下部分是一个名称，如geosite:google或者geosite:cn。\"\n\nmsgid \"Annotation: Begining with #\"\nmsgstr \"注释: 由 # 开头\"\n\nmsgid \"Invert match result.\"\nmsgstr \"反选匹配结果。\"\n\nmsgid \"Only support Sing-Box.\"\nmsgstr \"只支持 Sing-Box。\"\n\nmsgid \"IP: such as '127.0.0.1'.\"\nmsgstr \"IP: 形如'127.0.0.1'。\"\n\nmsgid \"CIDR: such as '127.0.0.0/8'.\"\nmsgstr \"CIDR: 形如'10.0.0.0/8'.\"\n\nmsgid \"GeoIP: such as 'geoip:cn'. It begins with geoip: (lower case) and followed by two letter of country code.\"\nmsgstr \"GeoIP: 形如'geoip:cn'，必须以geoip:（小写）开头，后面跟双字符国家代码，支持几乎所有可以上网的国家。\"\n\nmsgid \"Clear logs\"\nmsgstr \"清空日志\"\n\nmsgid \"Password\"\nmsgstr \"密码\"\n\nmsgid \"IV Check\"\nmsgstr \"IV 检查\"\n\nmsgid \"UDP over TCP\"\nmsgstr \"TCP 封装 UDP\"\n\nmsgid \"Connection Timeout\"\nmsgstr \"连接超时时间\"\n\nmsgid \"Local Port\"\nmsgstr \"本地端口\"\n\nmsgid \"Fast Open\"\nmsgstr \"快速打开\"\n\nmsgid \"Pre-connections\"\nmsgstr \"预连接\"\n\nmsgid \"Number of early established connections to reduce latency.\"\nmsgstr \"预连接的数量，用于降低延迟。\"\n\nmsgid \"plugin\"\nmsgstr \"插件\"\n\nmsgid \"Supports custom SIP003 plugins, Make sure the plugin is installed.\"\nmsgstr \"支持自定义 SIP003 插件，请确保插件已安装。\"\n\nmsgid \"opts\"\nmsgstr \"插件选项\"\n\nmsgid \"Protocol\"\nmsgstr \"协议名称\"\n\nmsgid \"Protocol_param\"\nmsgstr \"协议参数\"\n\nmsgid \"Obfs\"\nmsgstr \"混淆\"\n\nmsgid \"Obfs_param\"\nmsgstr \"混淆参数\"\n\nmsgid \"Plugin Name\"\nmsgstr \"插件名称\"\n\nmsgid \"Plugin Arguments\"\nmsgstr \"插件参数\"\n\nmsgid \"User Level\"\nmsgstr \"用户等级(level)\"\n\nmsgid \"Transport\"\nmsgstr \"传输方式\"\n\nmsgid \"Public Key\"\nmsgstr \"公钥\"\n\nmsgid \"Private Key\"\nmsgstr \"私钥\"\n\nmsgid \"Pre shared key\"\nmsgstr \"额外的对称加密密钥\"\n\nmsgid \"Local Address\"\nmsgstr \"本地地址\"\n\nmsgid \"System interface\"\nmsgstr \"系统接口\"\n\nmsgid \"System interface name\"\nmsgstr \"系统接口名称\"\n\nmsgid \"Decimal numbers separated by \\\",\\\" or Base64-encoded strings.\"\nmsgstr \"用“,”隔开的十进制数字或 Base64 编码字符串。\"\n\nmsgid \"Camouflage Domain\"\nmsgstr \"伪装域名\"\n\nmsgid \"Camouflage Type\"\nmsgstr \"伪装类型\"\n\nmsgid \"Transport Layer Encryption\"\nmsgstr \"传输层加密\"\n\nmsgid \"Whether or not transport layer encryption is enabled, \\\"none\\\" for unencrypted, \\\"tls\\\" for using TLS, \\\"xtls\\\" for using XTLS.\"\nmsgstr \"是否启入传输层加密，支持的选项有 \\\"none\\\" 表示不加密，\\\"tls\\\" 表示使用 TLS，\\\"xtls\\\" 表示使用 XTLS。\"\n\nmsgid \"Original Trojan only supported 'tls', please choose 'tls'.\"\nmsgstr \"原版Trojan只支持'tls'，请选择'tls'。\"\n\nmsgid \"Transfer mode\"\nmsgstr \"传输模式\"\n\nmsgid \"Do not send server name in ClientHello.\"\nmsgstr \"不要在 ClientHello 中发送服务器名称.\"\n\nmsgid \"Domain\"\nmsgstr \"域名\"\n\nmsgid \"allowInsecure\"\nmsgstr \"允许不安全连接\"\n\nmsgid \"Whether unsafe connections are allowed. When checked, Certificate validation will be skipped.\"\nmsgstr \"是否允许不安全连接。当勾选时，将跳过证书验证。\"\n\nmsgid \"Used when the node link does not include this parameter.\"\nmsgstr \"当节点链接未包含该参数时，将使用此设置。\"\n\nmsgid \"%s Node Use Type\"\nmsgstr \"%s 节点使用类型\"\n\nmsgid \"Set the TUIC proxy server ip address\"\nmsgstr \"指定远程TUIC服务器IP\"\n\nmsgid \"TUIC User Password For Connect Remote Server\"\nmsgstr \"用于远程TUIC服务器连接的密码\"\n\nmsgid \"TUIC UserName For Local Socks\"\nmsgstr \"用于本地Socks服务器连接的用户名\"\n\nmsgid \"TUIC Password For Local Socks\"\nmsgstr \"用于本地Socks服务器连接的密码\"\n\nmsgid \"UDP relay mode\"\nmsgstr \"UDP中继模式\"\n\nmsgid \"Concurrent Tunnels\"\nmsgstr \"并发隧道连接数\"\n\nmsgid \"Congestion control algorithm\"\nmsgstr \"拥塞控制算法\"\n\nmsgid \"Heartbeat interval(second)\"\nmsgstr \"保活心跳包发送间隔（单位：秒）\"\n\nmsgid \"Timeout for establishing a connection to server(second)\"\nmsgstr \"连接超时时间（单位：秒）\"\n\nmsgid \"Garbage collection interval(second)\"\nmsgstr \"UDP数据包片残片清理间隔（单位：秒）\"\n\nmsgid \"Garbage collection lifetime(second)\"\nmsgstr \"UDP数据包残片在服务器的保留时间（单位：秒）\"\n\nmsgid \"Disable SNI\"\nmsgstr \"关闭SNI服务器名称指示\"\n\nmsgid \"Enable 0-RTT QUIC handshake\"\nmsgstr \"客户端启用 0-RTT QUIC 连接握手\"\n\nmsgid \"TUIC send window\"\nmsgstr \"发送窗口（无需确认即可发送的最大字节数：默认8Mb*2）\"\n\nmsgid \"TUIC receive window\"\nmsgstr \"接收窗口（无需确认即可接收的最大字节数：默认8Mb）\"\n\nmsgid \"TUIC Maximum packet size the socks5 server can receive from external, in bytes\"\nmsgstr \"TUIC socks5 服务器可以从外部接收的最大数据包大小（以字节为单位）\"\n\nmsgid \"Set if the listening socket should be dual-stack\"\nmsgstr \"设置监听套接字为双栈\"\n\nmsgid \"<br />none: default, no masquerade, data sent is packets with no characteristics.<br />srtp: disguised as an SRTP packet, it will be recognized as video call data (such as FaceTime).<br />utp: packets disguised as uTP will be recognized as bittorrent downloaded data.<br />wechat-video: packets disguised as WeChat video calls.<br />dtls: disguised as DTLS 1.2 packet.<br />wireguard: disguised as a WireGuard packet. (not really WireGuard protocol)<br />dns: Disguising traffic as DNS requests.\"\nmsgstr \"<br />none：默认值，不进行伪装，发送的数据是没有特征的数据包。<br />srtp：伪装成 SRTP 数据包，会被识别为视频通话数据（如 FaceTime）。<br />utp：伪装成 uTP 数据包，会被识别为 BT 下载数据。<br />wechat-video：伪装成微信视频通话的数据包。<br />dtls：伪装成 DTLS 1.2 数据包。<br />wireguard：伪装成 WireGuard 数据包。(并不是真正的 WireGuard 协议)<br />dns：把流量伪装成 DNS 请求。\"\n\nmsgid \"Use it together with the DNS disguised type. You can fill in any domain.\"\nmsgstr \"配合伪装类型 DNS 使用，可随便填一个域名。\"\n\nmsgid \"Auth\"\nmsgstr \"身份认证\"\n\nmsgid \"Socks for authentication\"\nmsgstr \"Socks认证方式\"\n\nmsgid \"Socks protocol authentication, support anonymous and password.\"\nmsgstr \"Socks 协议的认证方式，支持匿名方式和账号密码方式。\"\n\nmsgid \"anonymous\"\nmsgstr \"匿名\"\n\nmsgid \"User Password\"\nmsgstr \"账号密码\"\n\nmsgid \"Username and Password must be used together!\"\nmsgstr \"账号和密码必须同时使用！\"\n\nmsgid \"Prefer firewall tools\"\nmsgstr \"首选防火墙工具\"\n\nmsgid \"IPv6 TProxy\"\nmsgstr \"IPv6透明代理(TProxy)\"\n\nmsgid \"Experimental feature. Make sure that your node supports IPv6.\"\nmsgstr \"实验特性，请确保你的节点支持IPv6\"\n\nmsgid \"Status info\"\nmsgstr \"状态信息\"\n\nmsgid \"Big icon\"\nmsgstr \"大图标\"\n\nmsgid \"Show node check\"\nmsgstr \"显示节点检测\"\n\nmsgid \"Show Show IP111\"\nmsgstr \"显示IP111\"\n\nmsgid \"Destination protocol\"\nmsgstr \"目标协议\"\n\nmsgid \"Destination address\"\nmsgstr \"目标地址\"\n\nmsgid \"Destination port\"\nmsgstr \"目标端口\"\n\nmsgid \"Whether to receive PROXY protocol, when this node want to be fallback or forwarded by proxy, it must be enable, otherwise it cannot be used.\"\nmsgstr \"是否接收 PROXY protocol，当该节点要被回落或被代理转发时，必须启用，否则不能使用。\"\n\nmsgid \"outbound node\"\nmsgstr \"出站节点\"\n\nmsgid \"Custom Socks\"\nmsgstr \"自定义 Socks\"\n\nmsgid \"Custom HTTP\"\nmsgstr \"自定义 HTTP\"\n\nmsgid \"Custom Interface\"\nmsgstr \"自定义接口\"\n\nmsgid \"Interface\"\nmsgstr \"接口\"\n\nmsgid \"Bind Local\"\nmsgstr \"本机监听\"\n\nmsgid \"When selected, it can only be accessed localhost.\"\nmsgstr \"当勾选时，只能本机访问。\"\n\nmsgid \"Accept LAN Access\"\nmsgstr \"接受局域网访问\"\n\nmsgid \"When selected, it can accessed lan , this will not be safe!\"\nmsgstr \"当勾选时，可以直接访问局域网，这将不安全！（非特殊情况不建议开启）\"\n\nmsgid \"Enable Remote\"\nmsgstr \"启用转发\"\n\nmsgid \"You can forward to Nginx/Caddy/V2ray/Xray WebSocket and more.\"\nmsgstr \"您可以转发到Nginx/Caddy/V2ray/Xray WebSocket等。\"\n\nmsgid \"Remote Address\"\nmsgstr \"远程地址\"\n\nmsgid \"Remote Port\"\nmsgstr \"远程端口\"\n\nmsgid \"as:\"\nmsgstr \"如：\"\n\nmsgid \"Public key absolute path\"\nmsgstr \"公钥文件绝对路径\"\n\nmsgid \"Private key absolute path\"\nmsgstr \"私钥文件绝对路径\"\n\nmsgid \"Can't find this file!\"\nmsgstr \"找不到这个文件！\"\n\nmsgid \"Public key and Private key path can not be empty!\"\nmsgstr \"公钥和私钥文件路径不能为空！\"\n\nmsgid \"Server-Side\"\nmsgstr \"服务器端\"\n\nmsgid \"Server Config\"\nmsgstr \"服务器配置\"\n\nmsgid \"Users Manager\"\nmsgstr \"用户管理\"\n\nmsgid \"Logs\"\nmsgstr \"日志\"\n\nmsgid \"Log\"\nmsgstr \"日志\"\n\nmsgid \"Enable Node Log\"\nmsgstr \"启用节点日志\"\n\nmsgid \"Log Level\"\nmsgstr \"日志等级\"\n\nmsgid \"Not enabled log\"\nmsgstr \"未启用日志\"\n\nmsgid \"UDP Forward\"\nmsgstr \"UDP转发\"\n\nmsgid \"DNS Settings\"\nmsgstr \"DNS设置\"\n\nmsgid \"Null\"\nmsgstr \"无\"\n\nmsgid \"You did not fill in the %s path. Please save and apply then update manually.\"\nmsgstr \"您没有填写 %s 路径。请保存应用后再手动更新。\"\n\nmsgid \"Not installed %s, Can't unzip!\"\nmsgstr \"未安装 %s，无法解压。\"\n\nmsgid \"Can't determine ARCH, or ARCH not supported.\"\nmsgstr \"无法确认ARCH架构，或是不支持。\"\n\nmsgid \"Get remote version info failed.\"\nmsgstr \"获取远程版本信息失败。\"\n\nmsgid \"New version found, but failed to get new version download url.\"\nmsgstr \"发现新版本，但未能获得新版本的下载地址。\"\n\nmsgid \"Download url is required.\"\nmsgstr \"请指定下载地址。\"\n\nmsgid \"File download failed or timed out: %s\"\nmsgstr \"文件下载失败或超时：%s\"\n\nmsgid \"File path required.\"\nmsgstr \"请指定文件路径。\"\n\nmsgid \"%s not enough space.\"\nmsgstr \"%s 空间不足。\"\n\nmsgid \"Can't find client in file: %s\"\nmsgstr \"无法在文件中找到客户端：%s\"\n\nmsgid \"Client file is required.\"\nmsgstr \"请指定客户端文件。\"\n\nmsgid \"The client file is not suitable for current device.\"\nmsgstr \"客户端文件不适合当前设备。\"\n\nmsgid \"Can't move new file to path: %s\"\nmsgstr \"无法移动新文件到：%s\"\n\nmsgid \"An XHttpObject in JSON format, used for sharing.\"\nmsgstr \"JSON 格式的 XHttpObject，用来实现分享。\"\n\nmsgid \"Enable Mux.Cool\"\nmsgstr \"启用 Mux.Cool\"\n\nmsgid \"Mux concurrency\"\nmsgstr \"最大并发连接数\"\n\nmsgid \"XUDP Mux concurrency\"\nmsgstr \"XUDP 最大并发连接数\"\n\nmsgid \"Padding\"\nmsgstr \"填充\"\n\nmsgid \"Enable early data\"\nmsgstr \"启用前置数据\"\n\nmsgid \"Early data length\"\nmsgstr \"前置数据最大长度\"\n\nmsgid \"Early data header name\"\nmsgstr \"前置数据 HTTP 头名\"\n\nmsgid \"Recommended value: Sec-WebSocket-Protocol\"\nmsgstr \"推荐值：Sec-WebSocket-Protocol\"\n\nmsgid \"Health check\"\nmsgstr \"健康检查\"\n\nmsgid \"Health check timeout\"\nmsgstr \"检查超时时间\"\n\nmsgid \"Permit without stream\"\nmsgstr \"无子连接时的健康检查\"\n\nmsgid \"Initial Windows Size\"\nmsgstr \"初始窗口大小\"\n\nmsgid \"Excluded Domains\"\nmsgstr \"排除域名\"\n\nmsgid \"If the traffic sniffing result is in this list, the destination address will not be overridden.\"\nmsgstr \"如果流量嗅探结果在此列表中，则不会覆盖目标地址。\"\n\nmsgid \"Buffer Size\"\nmsgstr \"缓冲区大小\"\n\nmsgid \"Buffer size for every connection (kB)\"\nmsgstr \"每一个连接的缓冲区大小（kB）\"\n\nmsgid \"Idle Timeout\"\nmsgstr \"空闲超时\"\n\nmsgid \"Hop Interval(second)\"\nmsgstr \"端口跳跃间隔（秒）\"\n\nmsgid \"Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5.\"\nmsgstr \"支持固定值或随机范围（如 30 或 5-30），最小 5 秒。\"\n\nmsgid \"HeartbeatPeriod(second)\"\nmsgstr \"心跳周期（单位：秒）\"\n\nmsgid \"Override the connection destination address\"\nmsgstr \"覆盖连接目标地址\"\n\nmsgid \"Override the connection destination address with the sniffed domain.<br />Otherwise use sniffed domain for routing only.<br />If using shunt nodes, configure the domain shunt rules correctly.\"\nmsgstr \"用探测出的域名覆盖连接目标地址。<br />否则仅将探测得到的域名用于路由。<br />如使用分流节点，请正确设置域名分流规则。\"\n\nmsgid \"Handshake Server\"\nmsgstr \"握手服务器\"\n\nmsgid \"Handshake Server Port\"\nmsgstr \"握手服务器端口\"\n\nmsgid \"Protocol parameter. Will waste traffic randomly if enabled.\"\nmsgstr \"协议参数。 如果启用会随机浪费流量。\"\n\nmsgid \"Protocol parameter. Enable length block encryption.\"\nmsgstr \"协议参数。启用长度块加密。\"\n\nmsgid \"TLS Chain Fingerprint (SHA256)\"\nmsgstr \"TLS 证书链指纹（SHA256）\"\n\nmsgid \"Once set, connects only when the server’s chain fingerprint matches.\"\nmsgstr \"设置后，仅在服务器证书链指纹匹配时连接。\"\n\nmsgid \"TLS Certificate Name (CertName)\"\nmsgstr \"TLS 证书名称（CertName）\"\n\nmsgid \"TLS is used to verify the leaf certificate name.\"\nmsgstr \"TLS 用于验证 leaf 证书的 name。\"\n\nmsgid \"ECH Config\"\nmsgstr \"ECH 配置\"\n\nmsgid \"ECH Key\"\nmsgstr \"ECH 密钥\"\n\nmsgid \"ECH Query Domain\"\nmsgstr \"ECH 查询域名\"\n\nmsgid \"Overrides the domain name used for ECH HTTPS record queries.\"\nmsgstr \"覆盖用于 ECH HTTPS 记录查询的域名。\"\n\nmsgid \"Enable Multipath TCP, need to be enabled in both server and client configuration.\"\nmsgstr \"启用 Multipath TCP，需在服务端和客户端配置中同时启用。\"\n\nmsgid \"An FinalMaskObject in JSON format, used for sharing.\"\nmsgstr \"JSON 格式的 FinalMaskObject，用来实现分享。\"\n\nmsgid \"Custom finalmask overrides mkcp, hysteria2, fragment, noise, and related settings.\"\nmsgstr \"自定义 finalmask 将覆盖 mkcp、hysteria2、fragment、noise 等相关配置。\"\n\nmsgid \"Fragment\"\nmsgstr \"分片\"\n\nmsgid \"TCP fragments, which can deceive the censorship system in some cases, such as bypassing SNI blacklists.\"\nmsgstr \"TCP 分片，在某些情况下可以欺骗审查系统，比如绕过 SNI 黑名单。\"\n\nmsgid \"Fragment Packets\"\nmsgstr \"分片方式\"\n\nmsgid \" \\\"1-3\\\" is for segmentation at TCP layer, applying to the beginning 1 to 3 data writes by the client. \\\"tlshello\\\" is for TLS client hello packet fragmentation.\"\nmsgstr \" \\\"1-3\\\" 是 TCP 的流切片，应用于客户端第 1 至第 3 次写数据。\\\"tlshello\\\" 是 TLS 握手包切片。\"\n\nmsgid \"Fragment Length\"\nmsgstr \"分片包长\"\n\nmsgid \"Fragmented packet length (byte)\"\nmsgstr \"分片包长 (byte)\"\n\nmsgid \"Fragment Delay\"\nmsgstr \"分片延迟\"\n\nmsgid \"Fragmentation interval (ms)\"\nmsgstr \"分片间隔（ms）\"\n\nmsgid \"Max Split\"\nmsgstr \"最大分片数\"\n\nmsgid \"Limit the maximum number of splits.\"\nmsgstr \"限制分片的最大数量。\"\n\nmsgid \"Split handshake data into multiple TLS records for better censorship evasion. Low overhead. Recommended to enable first.\"\nmsgstr \"将握手数据拆分为多个 TLS 记录，提升抗封锁能力，几乎不增加延迟，建议优先启用。\"\n\nmsgid \"Split handshake into multiple TCP segments. Enhances obfuscation. May increase delay. Use only if needed.\"\nmsgstr \"将 TLS 握手数据分为多个 TCP 包发送，提高伪装性，可能增加延迟，仅在封锁严重时使用。\"\n\nmsgid \"Noise\"\nmsgstr \"噪声\"\n\nmsgid \"UDP noise, Under some circumstances it can bypass some UDP based protocol restrictions.\"\nmsgstr \"UDP 噪声，在某些情况下可以绕过一些针对 UDP 协议的限制。\"\n\nmsgid \"To send noise packets, select \\\"Noise\\\" in Xray Settings.\"\nmsgstr \"在 Xray 设置中勾选 “噪声” 以发送噪声包。\"\n\nmsgid \"Xray Noise Packets\"\nmsgstr \"Xray 噪声数据包\"\n\nmsgid \"Packet | Rand Length\"\nmsgstr \"数据包 | Rand 长度\"\n\nmsgid \"Delay (ms)\"\nmsgstr \"延迟（ms）\"\n\nmsgid \"If is domain name, The requested domain name will be resolved to IP before connect.\"\nmsgstr \"如果是域名，域名将在请求发出之前解析为 IP。\"\n\nmsgid \"Domain DNS Resolve\"\nmsgstr \"域名 DNS 解析\"\n\nmsgid \"If the node address is a domain name, this DNS will be used for resolution.\"\nmsgstr \"如果节点地址是域名，则将使用此 DNS 进行解析。\"\n\nmsgid \"Supports only Xray or Sing-box node types.\"\nmsgstr \"仅支持 Xray 或 Sing-box 类型节点。\"\n\nmsgid \"Chain Proxy\"\nmsgstr \"链式代理\"\n\nmsgid \"Landing Node\"\nmsgstr \"落地节点\"\n\nmsgid \"Only support a layer of proxy.\"\nmsgstr \"仅支持一层代理。\"\n\nmsgid \"\"\n\"Chained proxy works only with Xray or Sing-box nodes.<br>\"\n\"You can only use manual or imported nodes as chained nodes.\"\nmsgstr \"\"\n\"链式代理仅支持 Xray 或 Sing-box 节点。<br>\"\n\"仅支持手动添加或导入的节点用作链式节点。\"\n\nmsgid \"Prefer IPv4\"\nmsgstr \"IPv4 优先\"\n\nmsgid \"Prefer IPv6\"\nmsgstr \"IPv6 优先\"\n\nmsgid \"IPv4 Only\"\nmsgstr \"仅 IPv4\"\n\nmsgid \"IPv6 Only\"\nmsgstr \"仅 IPv6\"\n\nmsgid \"Maintain\"\nmsgstr \"维护\"\n\nmsgid \"Backup and Restore\"\nmsgstr \"备份还原\"\n\nmsgid \"Backup or Restore Client and Server Configurations.\"\nmsgstr \"备份或还原客户端及服务端配置。\"\n\nmsgid \"Note: Restoring configurations across different versions may cause compatibility issues.\"\nmsgstr \"注意：不同版本间的配置恢复可能会导致兼容性问题。\"\n\nmsgid \"Create Backup File\"\nmsgstr \"创建备份文件\"\n\nmsgid \"Restore Backup File\"\nmsgstr \"恢复备份文件\"\n\nmsgid \"DL Backup\"\nmsgstr \"下载备份\"\n\nmsgid \"RST Backup\"\nmsgstr \"恢复备份\"\n\nmsgid \"Backup failed!\"\nmsgstr \"备份失败！\"\n\nmsgid \"UL Restore\"\nmsgstr \"上传恢复\"\n\nmsgid \"CLOSE WIN\"\nmsgstr \"关闭窗口\"\n\nmsgid \"Restore to default configuration\"\nmsgstr \"恢复默认配置\"\n\nmsgid \"Do Reset\"\nmsgstr \"执行重置\"\n\nmsgid \"Please select a file first.\"\nmsgstr \"请先选择一个文件。\"\n\nmsgid \"Invalid file type. Please upload a .tar.gz file.\"\nmsgstr \"文件类型无效，请上传一个 .tar.gz 文件。\"\n\nmsgid \"File size exceeds 10MB limit.\"\nmsgstr \"文件大小超过 10MB 限制。\"\n\nmsgid \"Do you want to restore the client to default settings?\"\nmsgstr \"是否要恢复客户端默认配置？\"\n\nmsgid \"Are you sure you want to restore the client to default settings?\"\nmsgstr \"是否真的要恢复客户端默认配置？\"\n\nmsgid \"Configuration file uploaded successfully…\"\nmsgstr \"配置文件上传成功…\"\n\nmsgid \"Configuration restored successfully…\"\nmsgstr \"配置还原成功…\"\n\nmsgid \"Service restarting…\"\nmsgstr \"重启服务中…\"\n\nmsgid \"Configuration file decompression failed, please try again!\"\nmsgstr \"配置文件解压失败，请重试！\"\n\nmsgid \"_urltest\"\nmsgstr \"URLTest\"\n\nmsgid \"URLTest node list\"\nmsgstr \"URLTest 节点列表\"\n\nmsgid \"List of nodes to test, <a target='_blank' href='https://sing-box.sagernet.org/configuration/outbound/urltest'>document</a>\"\nmsgstr \"要测试的节点列表，<a target='_blank' href='https://sing-box.sagernet.org/zh/configuration/outbound/urltest'>文档原理</a>\"\n\nmsgid \"Test interval\"\nmsgstr \"测试间隔\"\n\nmsgid \"Test interval must be less or equal than idle timeout.\"\nmsgstr \"测试间隔时间必须小于或等于空闲超时时间。\"\n\nmsgid \"Test tolerance\"\nmsgstr \"测试容差\"\n\nmsgid \"The test tolerance in milliseconds.\"\nmsgstr \"测试容差时间（单位：毫秒）。\"\n\nmsgid \"Idle timeout\"\nmsgstr \"空闲超时\"\n\nmsgid \"The idle timeout.\"\nmsgstr \"空闲超时时间。\"\n\nmsgid \"Interrupt existing connections\"\nmsgstr \"中断现有连接\"\n\nmsgid \"Interrupt existing connections when the selected outbound has changed.\"\nmsgstr \"当选择的出站发生变化时中断现有连接。\"\n\nmsgid \"Port hopping range\"\nmsgstr \"端口跳跃范围\"\n\nmsgid \"Format as 1000:2000 or 1000-2000 Multiple groups are separated by commas (,).\"\nmsgstr \"格式为：1000:2000 或 1000-2000 多组时用逗号(,)隔开。\"\n\nmsgid \"Use Custom Config\"\nmsgstr \"使用自定义配置\"\n\nmsgid \"Custom Config\"\nmsgstr \"自定义配置\"\n\nmsgid \"Must be JSON text!\"\nmsgstr \"必须是 JSON 文本内容！\"\n\nmsgid \"Geo View\"\nmsgstr \"Geo 查询\"\n\nmsgid \"Query\"\nmsgstr \"查询\"\n\nmsgid \"Querying\"\nmsgstr \"查询中\"\n\nmsgid \"Please enter query content!\"\nmsgstr \"请输入查询内容！\"\n\nmsgid \"No results were found!\"\nmsgstr \"未找到任何结果！\"\n\nmsgid \"Rules containing this value:\"\nmsgstr \"所在规则列表：\"\n\nmsgid \"Domain/IP Query\"\nmsgstr \"域名/IP 查询\"\n\nmsgid \"GeoIP/Geosite Query\"\nmsgstr \"GeoIP/Geosite 查询\"\n\nmsgid \"Enter a domain or IP to query the Geo rule list they belong to.\"\nmsgstr \"输入域名/IP，查询它们所在的 Geo 规则列表。\"\n\nmsgid \"Enter a GeoIP or Geosite to extract the domains/IPs they contain. Format: geoip:cn or geosite:gfw\"\nmsgstr \"输入 GeoIP/Geosite，提取它们所包含的域名/IP。格式：geoip:cn 或 geosite:gfw\"\n\nmsgid \"Tips:\"\nmsgstr \"小贴士：\"\n\nmsgid \"By entering a domain or IP, you can query the Geo rule list they belong to.\"\nmsgstr \"可以通过输入域名/IP，查询它们所在的 Geo 规则列表。\"\n\nmsgid \"By entering a GeoIP or Geosite, you can extract the domains/IPs they contain.\"\nmsgstr \"可以通过输入 GeoIP/Geosite，提取它们所包含的域名/IP。\"\n\nmsgid \"Use the GeoIP/Geosite query function to verify if the entered Geo rules are correct.\"\nmsgstr \"利用 GeoIP/Geosite 查询功能，可以验证输入的 Geo 规则是否正确。\"\n\nmsgid \"Private Key Passphrase\"\nmsgstr \"私钥指纹\"\n\nmsgid \"Host Key\"\nmsgstr \"主机密钥\"\n\nmsgid \"Accept any if empty.\"\nmsgstr \"留空则不校验。\"\n\nmsgid \"Host Key Algorithms\"\nmsgstr \"主机密钥算法\"\n\nmsgid \"Client Version\"\nmsgstr \"客户端版本\"\n\nmsgid \"Random version will be used if empty.\"\nmsgstr \"如留空，则使用随机版本。\"\n\nmsgid \"The configured type also applies to the core specified when manually importing nodes.\"\nmsgstr \"配置的类型同样适用于手动导入节点时所指定的核心程序。\"\n\nmsgid \"Group Name\"\nmsgstr \"分组名\"\n\nmsgid \"Reassign Group\"\nmsgstr \"调整分组\"\n\nmsgid \"Reassign Node Group\"\nmsgstr \"调整节点分组\"\n\nmsgid \"Search nodes...\"\nmsgstr \"搜索节点…\"\n\nmsgid \"Using...\"\nmsgstr \"使用中。\"\n\nmsgid \"Generate configuration file and run\"\nmsgstr \"生成配置文件并运行\"\n\nmsgid \"Start after a delay of %s seconds!\"\nmsgstr \"延时 %s 秒后再启动!\"\n\nmsgid \"The script is already running, do not run it again. Exit.\"\nmsgstr \"脚本已经在运行，不重复运行，退出.\"\n\nmsgid \"Stop the script and wait for a timeout, then exit without repeating the process.\"\nmsgstr \"停止脚本等待超时，不重复运行，退出.\"\n\nmsgid \"Warning: The %s application environment is incomplete. Switch to %s. (%s)\"\nmsgstr \"警告：%s 应用环境不完整，切换至 %s。(%s)\"\n\nmsgid \"Note: Dnsmasq (%s) is below 2.90. Upgrading is recommended to improve stability.\"\nmsgstr \"提示：Dnsmasq (%s) 低于 2.90，建议升级以增强稳定性。\"\n\nmsgid \"Warning: %s transparent proxy is missing basic dependency %s!\"\nmsgstr \"警告：%s 透明代理缺失基础依赖 %s!\"\n\nmsgid \"Warning: Not compatible with any transparent proxy system environment.\"\nmsgstr \"警告：不满足任何透明代理系统环境。\"\n\nmsgid \"%s does not have execute permissions and cannot be started: %s %s\"\nmsgstr \"%s 没有执行权限，无法启动：%s %s\"\n\nmsgid \"%s not found, unable to start...\"\nmsgstr \"找不到 %s，无法启动...\"\n\nmsgid \"Socks node: [%s]%s is an invalid server address and cannot be started!\"\nmsgstr \"Socks节点：[%s]%s 是非法的服务器地址，无法启动！\"\n\nmsgid \"For some reason, the configuration for this Socks service has been lost, and its startup has been aborted!\"\nmsgstr \"某种原因，此 Socks 服务的相关配置已失联，启动中止！\"\n\nmsgid \"Socks node: [%s]%s, start failed %s:%s %s\"\nmsgstr \"Socks节点：[%s]%s，启动失败 %s:%s %s\"\n\nmsgid \"Socks node: [%s]%s, starting %s:%s\"\nmsgstr \"Socks节点：[%s]%s，启动 %s:%s\"\n\nmsgid \"To enable experimental IPv6 transparent proxy (TProxy), please ensure your node and type support IPv6!\"\nmsgstr \"开启实验性IPv6透明代理(TProxy)，请确认您的节点及类型支持IPv6！\"\n\nmsgid \"[%s] process %s error, skip this transparent proxy!\"\nmsgstr \"【%s】 进程 %s 错误，跳过此透明代理！\"\n\nmsgid \"Analyzing the node configuration of the Socks service...\"\nmsgstr \"分析 Socks 服务的节点配置...\"\n\nmsgid \"Log file is too long, clear it!\"\nmsgstr \"日志文件过长，清空处理！\"\n\nmsgid \"The task is currently running automatically as a scheduled task; no reconfiguration of the scheduled task is required.\"\nmsgstr \"当前为计划任务自动运行，不重新配置定时任务。\"\n\nmsgid \"Scheduled tasks: Auto stop service.\"\nmsgstr \"配置定时任务：自动关闭服务。\"\n\nmsgid \"Scheduled tasks: Auto start service.\"\nmsgstr \"配置定时任务：自动开启服务。\"\n\nmsgid \"Scheduled tasks: Auto restart service.\"\nmsgstr \"配置定时任务：自动重启服务。\"\n\nmsgid \"Scheduled tasks: Auto update rules.\"\nmsgstr \"配置定时任务：自动更新规则。\"\n\nmsgid \"Scheduled tasks: Auto update [%s] subscription.\"\nmsgstr \"配置定时任务：自动更新 【%s】 订阅。\"\n\nmsgid \"Auto updates: Starts a cyclical update process.\"\nmsgstr \"自动更新：启动循环更新进程。\"\n\nmsgid \"Running in no proxy mode, it only allows scheduled tasks for starting and stopping services.\"\nmsgstr \"运行于非代理模式，仅允许服务启停的定时任务。\"\n\nmsgid \"Clear scheduled commands.\"\nmsgstr \"清除定时执行命令。\"\n\nmsgid \"Unable to resolve [%s], route table addition failed!\"\nmsgstr \"无法解析[%s]，路由表添加失败！\"\n\nmsgid \"[%s] was successfully added to the routing table of interface [%s]!\"\nmsgstr \"[%s]添加到接口[%s]路由表成功！\"\n\nmsgid \"Adding [%s] to the [%s] routing table failed! The reason is that the [%s] gateway cannot be found.\"\nmsgstr \"[%s]添加到接口[%s]路由表失功！原因是找不到[%s]网关。\"\n\nmsgid \"Global nodes are not enabled, skip [%s].\"\nmsgstr \"全局节点未启用，跳过【%s】\"\n\nmsgid \"Direct DNS: %s\"\nmsgstr \"直连 DNS：%s\"\n\nmsgid \"Remote DNS: %s\"\nmsgstr \"远程 DNS：%s\"\n\nmsgid \"The program has started. Please stop it and then restart it!\"\nmsgstr \"程序已启动，先停止再重新启动!\"\n\nmsgid \"Running complete!\"\nmsgstr \"运行完成！\"\n\nmsgid \"Clearing and closing related programs and cache complete.\"\nmsgstr \"清空并关闭相关程序和缓存完成。\"\n\nmsgid \"Incorrect index listing method (%s), execution terminated!\"\nmsgstr \"索引列举方式不正确（%s），终止执行！\"\n\nmsgid \"parse the traffic splitting rules[%s]-[geoip:%s] add to %s to complete.\"\nmsgstr \"解析分流规则[%s]-[geoip:%s]加入到 %s 完成\"\n\nmsgid \"Access Control:\"\nmsgstr \"访问控制：\"\n\nmsgid \"Add node to the load balancer is directly connected to %s[%s].\"\nmsgstr \"加入负载均衡的节点到%s[%s]直连完成。\"\n\nmsgid \"Add all %s nodes to %s[%s] direct connection complete.\"\nmsgstr \"加入所有%s节点到%s[%s]直连完成。\"\n\nmsgid \"Starting to load %s firewall rules...\"\nmsgstr \"开始加载 %s 防火墙规则...\"\n\nmsgid \"local network segments (%s) direct connection: %s\"\nmsgstr \"本机 %s 网段直连：%s\"\n\nmsgid \"Add ISP %s DNS to the whitelist: %s\"\nmsgstr \"追加ISP %s DNS 到白名单：%s\"\n\nmsgid \"[%s]\"\nmsgstr \"【%s】\"\n\nmsgid \"[%s],\"\nmsgstr \"【%s】，\"\n\nmsgid \"Source iface [%s],\"\nmsgstr \"源接口【%s】，\"\n\nmsgid \"IP range [%s],\"\nmsgstr \"IP 范围【%s】，\"\n\nmsgid \"All device,\"\nmsgstr \"所有设备，\"\n\nmsgid \"Does not exist, ignore.\"\nmsgstr \"不存在，忽略。\"\n\nmsgid \"not proxy %s port [%s]\"\nmsgstr \"不代理 %s 端口 [%s]\"\n\nmsgid \"not proxy all %s\"\nmsgstr \"不代理所有 %s\"\n\nmsgid \"Use the %s node [%s]\"\nmsgstr \"使用 %s 节点[%s]\"\n\nmsgid \"Using a node that is different from the global configuration, DNS has been forcibly redirected to a dedicated DNS server.\"\nmsgstr \"使用与全局配置不相同节点，已将DNS强制重定向到专用 DNS 服务器。\"\n\nmsgid \"Add direct DNS to %s: %s\"\nmsgstr \"追加直连 DNS 到 %s： %s\"\n\nmsgid \"Local\"\nmsgstr \"本机\"\n\nmsgid \"[Local],\"\nmsgstr \"【本机】，\"\n\nmsgid \"Clear %s.\"\nmsgstr \"清除 %s。\"\n\nmsgid \"Delete %s rules is complete.\"\nmsgstr \"删除 %s 规则完成。\"\n\nmsgid \"%s firewall rules load complete!\"\nmsgstr \"%s 防火墙规则加载完成！\"\n\nmsgid \"Socks switch detection: Unknown error.\"\nmsgstr \"Socks切换检测：未知错误。\"\n\nmsgid \"Socks switch detection: Unable to connect to the network. Please check if the network is working properly!\"\nmsgstr \"Socks切换检测：无法连接到网络，请检查网络是否正常！\"\n\nmsgid \"Socks switch detection: Primary node 【%s: [%s]】 is normal. Switch to the primary node!\"\nmsgstr \"Socks切换检测：%s 主节点【%s：[%s]】正常，切换到主节点！\"\n\nmsgid \"Socks switch detection: %s node switch complete!\"\nmsgstr \"Socks切换检测：%s 节点切换完毕！\"\n\nmsgid \"Socks switch detection: %s 【%s:[%s]】 normal.\"\nmsgstr \"Socks切换检测：%s 【%s:[%s]】 正常。\"\n\nmsgid \"switch to %s test detect!\"\nmsgstr \"切换到 %s 检测！\"\n\nmsgid \"backup node\"\nmsgstr \"备用节点\"\n\nmsgid \"next backup node\"\nmsgstr \"下一个备用节点\"\n\nmsgid \"main node\"\nmsgstr \"主节点\"\n\nmsgid \"Socks switch detection: Unknown error.\"\nmsgstr \"Socks切换检测：未知错误。\"\n\nmsgid \"Socks switch detection: %s 【%s:[%s]】 abnormal, %s\"\nmsgstr \"Socks切换检测：%s 【%s:[%s]】 异常，%s\"\n\nmsgid \"Socks switch detection: %s 【%s:[%s]】 normal, switch to this node!\"\nmsgstr \"Socks切换检测：%s 【%s:[%s]】 正常，切换到此节点！\"\n\nmsgid \"Restart dnsmasq service.\"\nmsgstr \"重启 dnsmasq 服务。\"\n\nmsgid \"Console Port: %s\"\nmsgstr \"控制台端口：%s\"\n\nmsgid \"Discard one obviously invalid node.\"\nmsgstr \"丢弃 1 个明显无效的节点\"\n\nmsgid \"Entrance %s:%s\"\nmsgstr \"入口 %s:%s\"\n\nmsgid \"Node: %s:%s, Weight: %s\"\nmsgstr \"节点：%s:%s，权重：%s\"\n\nmsgid \"[Rule update] instance is running; please try again later.\"\nmsgstr \"[规则更新]实例正在运行，请稍后再试...\"\n\nmsgid \"[Subscription] instance is running; [Rule Update] queue and wait.\"\nmsgstr \"[订阅]实例正在运行，[规则更新]进入队列等待...\"\n\nmsgid \"Start updating the rules...\"\nmsgstr \"开始更新规则...\"\n\nmsgid \"Download file size verification error. Original file size: %sB. Downloaded file size: %sB.\"\nmsgstr \"下载文件大小校验出错，原始文件大小 %sB，下载文件大小：%sB。\"\n\nmsgid \"Downloaded file is empty or an error occurred while reading it.\"\nmsgstr \"下载的文件为空或读取文件时发生错误。\"\n\nmsgid \"%s Start updating...\"\nmsgstr \"%s 开始更新...\"\n\nmsgid \"%s version is the same and does not need to be updated.\"\nmsgstr \"%s 版本一致，无需更新。\"\n\nmsgid \"%s an error occurred during the file download process. Please try downloading again.\"\nmsgstr \"%s 下载文件过程出错，尝试重新下载。\"\n\nmsgid \"%s an error occurred while downloading the file. Please check your network or the download link and try again!\"\nmsgstr \"%s 下载文件过程出错，请检查网络或下载链接后重试！\"\n\nmsgid \"%s update success.\"\nmsgstr \"%s 更新成功。\"\n\nmsgid \"%s update failed, please try again later or change URL.\"\nmsgstr \"%s 更新失败，请稍后再试或更换 URL。\"\n\nmsgid \"%s update error!\"\nmsgstr \"%s 更新发生错误！\"\n\nmsgid \"Restart the service and apply the new rules.\"\nmsgstr \"重启服务，应用新的规则。\"\n\nmsgid \"The rules have been updated...\"\nmsgstr \"规则更新完毕...\"\n\nmsgid \"Socks node list [%s]\"\nmsgstr \"Socks 节点列表 [%s]\"\n\nmsgid \"Backup node list\"\nmsgstr \"备用节点的列表\"\n\nmsgid \"HAProxy node list [%s]\"\nmsgstr \"HAProxy 节点列表 [%s]\"\n\nmsgid \"ACL list [%s]\"\nmsgstr \"访问控制列表 [%s]\"\n\nmsgid \"Shunt [%s] node\"\nmsgstr \"分流 [%s] 节点\"\n\nmsgid \"Xray Load Balancing node [%s] list\"\nmsgstr \"Xray 负载均衡节点 [%s] 列表\"\n\nmsgid \"Xray Load Balancing node [%s] backup node\"\nmsgstr \"Xray 负载均衡节点 [%s] 后备节点\"\n\nmsgid \"Sing-Box URLTest node [%s] list\"\nmsgstr \"Sing-Box URLTest 节点 [%s] 列表\"\n\nmsgid \"Node [%s] preproxy node\"\nmsgstr \"节点 [%s] 前置代理节点\"\n\nmsgid \"Node [%s] landing node\"\nmsgstr \"节点 [%s] 落地节点\"\n\nmsgid \"Skipping the %s node is due to incompatibility with the %s core program or incorrect node usage type settings.\"\nmsgstr \"跳过 %s 节点，因未适配到 %s 核心程序，或未正确设置节点使用类型。\"\n\nmsgid \"Skip node: %s. Because Sing-Box does not support the %s protocol's %s transmission method, Xray needs to be used instead.\"\nmsgstr \"跳过节点：%s，因 Sing-Box 不支持 %s 协议的 %s 传输方式，需更换 Xray。\"\n\nmsgid \"Xray unsupport %s plugin.\"\nmsgstr \"Xray 不支持 %s 插件。\"\n\nmsgid \"Plugin options Incomplete.\"\nmsgstr \"插件选项不完整。\"\n\nmsgid \"shadowsocks-libev unsupport 2022 encryption.\"\nmsgstr \"shadowsocks-libev 不支持2022加密。\"\n\nmsgid \"Please replace %s to support %s transmission method.\"\nmsgstr \"请更换 %s 以支持 %s 传输方式。\"\n\nmsgid \"Please replace Xray or Sing-Box to support more transmission methods in Shadowsocks.\"\nmsgstr \"请更换 Xray 或 Sing-Box 来支持 Shadowsocks 更多的传输方式。\"\n\nmsgid \"unsupport %s plugin.\"\nmsgstr \"不支持 %s 插件。\"\n\nmsgid \"Skip the %s node because the %s core program is not installed.\"\nmsgstr \"跳过 %s 节点，因未安装 %s 核心程序 %s。\"\n\nmsgid \"Skip the %s node, as %s type nodes require Sing-Box version 1.12 or higher.\"\nmsgstr \"跳过 %s 节点，因 %s 类型的节点需要 Sing-Box 1.12 以上版本支持。\"\n\nmsgid \"%s type node subscriptions are not currently supported, skip this node.\"\nmsgstr \"暂时不支持 %s 类型的节点订阅，跳过此节点。\"\n\nmsgid \"Update [%s]\"\nmsgstr \"更新【%s】\"\n\nmsgid \"Matching node:\"\nmsgstr \"匹配节点：\"\n\nmsgid \"First Matching node:\"\nmsgstr \"第一匹配节点：\"\n\nmsgid \"Second Matching node:\"\nmsgstr \"第二匹配节点：\"\n\nmsgid \"Third Matching node:\"\nmsgstr \"第三匹配节点：\"\n\nmsgid \"Fourth Matching node:\"\nmsgstr \"第四匹配节点：\"\n\nmsgid \"Fifth Matching node:\"\nmsgstr \"第五匹配节点：\"\n\nmsgid \"Unable to find the best matching node, now replaced with:\"\nmsgstr \"无法找到最匹配的节点，当前已更换为：\"\n\nmsgid \"Unable to find a new node. Please confirm and process manually.\"\nmsgstr \"无法匹配到新节点，请手动确认处理。\"\n\nmsgid \"No node information updates are available.\"\nmsgstr \"没有可用的节点信息更新。\"\n\nmsgid \"Skip unknown types:\"\nmsgstr \"跳过未知类型：\"\n\nmsgid \"Discard node: %s, Reason:\"\nmsgstr \"丢弃节点: %s ，原因：\"\n\nmsgid \"No usable binary was found.\"\nmsgstr \"找不到可使用二进制。\"\n\nmsgid \"Discard filter nodes: %s type node %s\"\nmsgstr \"丢弃过滤节点: %s 类型节点 %s\"\n\nmsgid \"Parsing error, skip this node.\"\nmsgstr \"解析错误，跳过此节点。\"\n\nmsgid \"Successfully resolved the [%s] node, number: %s\"\nmsgstr \"成功解析【%s】节点，数量：%s\"\n\nmsgid \"Get subscription content for [%s] is empty. This may be due to an invalid subscription address or a network problem. Please diagnose the issue!\"\nmsgstr \"获取到的【%s】订阅内容为空，可能是订阅地址无效，或是网络问题，请诊断！\"\n\nmsgid \"Proxy\"\nmsgstr \"代理\"\n\nmsgid \"[Subscription] instance is running; please try again later.\"\nmsgstr \"[订阅]实例正在运行，请稍后再试...\"\n\nmsgid \"[Rule Update] instance is running; [Subscription] queue and wait.\"\nmsgstr \"[规则更新]实例正在运行，[订阅]进入队列等待...\"\n\nmsgid \"Start subscribing...\"\nmsgstr \"开始订阅...\"\n\nmsgid \"Start subscribing: %s\"\nmsgstr \"开始订阅：%s\"\n\nmsgid \"Subscription: [%s] No changes, no update required.\"\nmsgstr \"订阅:【%s】没有变化，无需更新。\"\n\nmsgid \"[%s] Subscription failed. This could be due to an invalid subscription address or a network issue. Please diagnose the problem! [%s]\"\nmsgstr \"【%s】订阅失败，可能是订阅地址无效，或是网络问题，请诊断！[%s]\"\n\nmsgid \"Error, restoring service.\"\nmsgstr \"发生错误, 正在恢复服务。\"\n\nmsgid \"Subscription complete...\"\nmsgstr \"订阅完毕...\"\n\nmsgid \"Processing, please wait…\"\nmsgstr \"正在处理，请稍候。\"\n"
  },
  {
    "path": "luci-app-passwall2/root/etc/config/passwall2_server",
    "content": "\nconfig global 'global'\n\toption enable '0'\n\n"
  },
  {
    "path": "luci-app-passwall2/root/etc/hotplug.d/iface/98-passwall2",
    "content": "#!/bin/sh\n\n[ \"$ACTION\" = \"ifup\" ] || [ \"$ACTION\" = \"ifupdate\" ] || exit 0\n\n. /usr/share/passwall2/utils.sh\n\n([ \"$(get_cache_var \"ENABLED_DEFAULT_ACL\")\" = \"1\" ] || [ \"$(get_cache_var \"ENABLED_ACLS\")\" = \"1\" ]) && [ -f ${LOCK_PATH}/${CONFIG}_ready.lock ] && {\n\n\tdefault_device=$(ip route show default 2>/dev/null | awk -F 'dev ' '{print $2}' | awk '{print $1}' | head -n1)\n\tdefault6_device=$(ip -6 route show default 2>/dev/null | awk -F 'dev ' '{print $2}' | awk '{print $1}' | head -n1)\n\t( [ \"$default_device\" = \"$DEVICE\" ] || [ \"$default6_device\" = \"$DEVICE\" ] ) && {\n\n\t\tif [ \"$ACTION\" = \"ifupdate\" ]; then\n\t\t\tUSE_TABLES=$(get_cache_var \"USE_TABLES\")\n\t\t\t[ -n \"$USE_TABLES\" ] && ${APP_PATH}/${USE_TABLES}.sh update_wan_sets >/dev/null 2>&1 &\n\t\t\texit 0\n\t\tfi\n\n\t\t[ ! -d ${LOCK_PATH} ] && mkdir -p ${LOCK_PATH}\n\t\tLOCK_FILE=\"${LOCK_PATH}/${CONFIG}_ifup.lock\"\n\t\tif [ -s ${LOCK_FILE} ]; then\n\t\t\tSPID=$(cat ${LOCK_FILE})\n\t\t\tif [ -e /proc/${SPID}/status ]; then\n\t\t\t\texit 1\n\t\t\tfi\n\t\t\tcat /dev/null > ${LOCK_FILE}\n\t\tfi\n\t\techo $$ > ${LOCK_FILE}\n\t\t\n\t\t/etc/init.d/${CONFIG} restart >/dev/null 2>&1 &\n\t\tlogger -p notice -t network -s \"${CONFIG}: restart when $INTERFACE ifup\"\n\t\t\n\t\trm -rf ${LOCK_FILE}\n\t}\n}\n"
  },
  {
    "path": "luci-app-passwall2/root/etc/init.d/passwall2",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=99\nSTOP=15\n\n. $IPKG_INSTROOT/usr/share/passwall2/utils.sh\nAPP_FILE=${APP_PATH}/app.sh\nLOCK_FILE_DIR=/var/lock\nLOCK_FILE=${LOCK_FILE_DIR}/${CONFIG}.lock\n\nset_lock() {\n\t[ ! -d \"$LOCK_FILE_DIR\" ] && mkdir -p $LOCK_FILE_DIR\n\texec 999>\"$LOCK_FILE\"\n\tflock -xn 999\n}\n\nunset_lock() {\n\tflock -u 999\n\trm -rf \"$LOCK_FILE\"\n}\n\nunlock() {\n\tfailcount=1\n\twhile [ \"$failcount\" -le 10 ]; do\n\t\tif [ -f \"$LOCK_FILE\" ]; then\n\t\t\tlet \"failcount++\"\n\t\t\tsleep 1s\n\t\t\t[ \"$failcount\" -ge 10 ] && unset_lock\n\t\telse\n\t\t\tbreak\n\t\tfi\n\tdone\n}\n\nboot_func() {\n\tlocal delay=$(uci -q get ${CONFIG}.@global_delay[0].start_delay || echo 1)\n\tif [ \"$delay\" -gt 0 ]; then\n\t\tlog_i18n 0 \"Start after a delay of %s seconds!\" \"${delay}\"\n\t\tsleep $delay\n\tfi\n\trestart boot\n\ttouch ${LOCK_FILE_DIR}/${CONFIG}_ready.lock\n}\n\nboot() {\n\tboot_func >/dev/null 2>&1 &\n}\n\nstart() {\n\tset_lock\n\t[ $? == 1 ] && log_i18n 0 \"The script is already running, do not run it again. Exit.\" && exit 0\n\t$APP_FILE start\n\tunset_lock\n}\n\nstop() {\n\tunlock\n\tset_lock\n\t[ $? == 1 ] && log_i18n 0 \"Stop the script and wait for a timeout, then exit without repeating the process.\" && exit 0\n\t$APP_FILE stop\n\tunset_lock\n}\n\nrestart() {\n\tset_lock\n\t[ $? == 1 ] && log_i18n 0 \"The script is already running, do not run it again. Exit.\" && exit 0\n\trule_lock=${LOCK_FILE_DIR}/${CONFIG}_rule_update.lock\n\tsub_lock=${LOCK_FILE_DIR}/${CONFIG}_subscribe.lock\n\tfor i in $(seq 1 300); do\n\t\tif [ ! -f \"$rule_lock\" ] && [ ! -f \"$sub_lock\" ]; then\n\t\t\tbreak\n\t\tfi\n\t\tsleep 2\n\tdone\n\trm -f \"$rule_lock\" \"$sub_lock\"\n\t$APP_FILE stop\n\t$APP_FILE start $1\n\tunset_lock\n}\n\nreload() {\n\techo \"Warning: This service does not support configuration reloading\"\n\techo \"Performing full restart instead...\"\n\trestart\n}\n"
  },
  {
    "path": "luci-app-passwall2/root/etc/init.d/passwall2_server",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=99\n\nstart() {\n\tlua /usr/lib/lua/luci/passwall2/server_app.lua start\n}\n\nstop() {\n\tlua /usr/lib/lua/luci/passwall2/server_app.lua stop\n}\n\nrestart() {\n\tstop\n\tstart\n}\n\nreload() {\n\techo \"Warning: This service does not support configuration reloading\"\n\techo \"Performing full restart instead...\"\n\trestart\n}\n"
  },
  {
    "path": "luci-app-passwall2/root/etc/uci-defaults/luci-passwall2",
    "content": "#!/bin/sh\n\nif [ -e \"/etc/config/ucitrack\" ]; then\n    uci -q batch <<-EOF\n \t\tdelete ucitrack.@passwall2[-1]\n\t\tadd ucitrack passwall2\n\t\tset ucitrack.@passwall2[-1].init=passwall2\n\t\tdelete ucitrack.@passwall2_server[-1]\n\t\tadd ucitrack passwall2_server\n\t\tset ucitrack.@passwall2_server[-1].init=passwall2_server\n\t\tcommit ucitrack\nEOF\nfi\n\nuci -q batch <<-EOF\n\tdelete firewall.passwall2\n\tset firewall.passwall2=include\n\tset firewall.passwall2.type='script'\n\tset firewall.passwall2.path='/var/etc/passwall2.include'\n\n\tdelete firewall.passwall2_server\n\tset firewall.passwall2_server=include\n\tset firewall.passwall2_server.type='script'\n\tset firewall.passwall2_server.path='/var/etc/passwall2_server.include'\n\n\tset dhcp.@dnsmasq[0].localuse=1\n\tcommit dhcp\n\n\tset uhttpd.main.max_requests=50\n\tcommit uhttpd\nEOF\n\nif [ -x \"/sbin/fw3\" ]; then\n\tuci -q set firewall.passwall2.reload='1'\n\tuci -q set firewall.passwall2_server.reload='1'\nelse\n\tuci -q delete firewall.passwall2.reload\n\tuci -q delete firewall.passwall2.fw4_compatible\n\tuci -q delete firewall.passwall2_server.reload\n\tuci -q delete firewall.passwall2_server.fw4_compatible\nfi\nuci commit firewall\n\n\n[ ! -s \"/etc/config/passwall2\" ] && cp -f /usr/share/passwall2/0_default_config /etc/config/passwall2\n\nchmod +x /usr/share/passwall2/*.sh\n\n[ \"$(uci -q get passwall2.@global_xray[0].sniffing)\" == \"1\" ] && [ \"$(uci -q get passwall2.@global_xray[0].route_only)\" != \"1\" ] && uci -q set passwall2.@global_xray[0].sniffing_override_dest=1\nuci -q delete passwall2.@global_xray[0].sniffing\nuci -q delete passwall2.@global_xray[0].route_only\nuci -q commit passwall2\n\nsed -i \"s#add_from#group#g\" /etc/config/passwall2 2>/dev/null\n\nrm -f /tmp/luci-indexcache /tmp/luci-indexcache.*\nrm -rf /tmp/luci-modulecache/\nkillall -HUP rpcd 2>/dev/null\n\nexit 0\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/passwall2/0_default_config",
    "content": "\nconfig global\n\toption enabled '0'\n\toption node_socks_port '1070'\n\toption localhost_proxy '1'\n\toption client_proxy '1'\n\toption socks_enabled '0'\n\toption acl_enable '0'\n\toption node 'rulenode'\n\toption direct_dns_protocol 'auto'\n\toption direct_dns_query_strategy 'UseIP'\n\toption remote_dns_protocol 'tcp'\n\toption remote_dns '1.1.1.1'\n\toption remote_dns_query_strategy 'UseIPv4'\n\toption dns_hosts 'cloudflare-dns.com 1.1.1.1\ndns.google.com 8.8.8.8'\n\toption log_node '1'\n\toption loglevel 'error'\n\t\nconfig global_haproxy\n\toption balancing_enable '0'\n\nconfig global_delay\n\toption start_daemon '1'\n\toption start_delay '60'\n\nconfig global_forwarding\n\toption tcp_no_redir_ports 'disable'\n\toption udp_no_redir_ports 'disable'\n\toption tcp_redir_ports '1:65535'\n\toption udp_redir_ports '1:65535'\n\toption accept_icmp '0'\n\toption prefer_nft '1'\n\toption tcp_proxy_way 'redirect'\n\toption ipv6_tproxy '0'\n\nconfig global_xray\n\toption sniffing_override_dest '0'\n\nconfig global_other\n\toption auto_detection_time 'tcping'\n\toption show_node_info '0'\n\nconfig global_rules\n\toption auto_update '0'\n\toption geosite_update '1'\n\toption geoip_update '1'\n\toption v2ray_location_asset '/usr/share/v2ray/'\n\toption geoip_url 'https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip.dat'\n\toption geosite_url 'https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat'\n\nconfig global_app\n\toption geoview_file '/usr/bin/geoview'\n\toption xray_file '/usr/bin/xray'\n\toption hysteria_file '/usr/bin/hysteria'\n\toption sing_box_file '/usr/bin/sing-box'\n\nconfig global_subscribe\n\toption filter_keyword_mode '1'\n\t\nconfig global_singbox\n\nconfig shunt_rules 'China'\n\toption remarks 'China'\n\toption network 'tcp,udp'\n\toption domain_list 'geosite:cn'\n\toption ip_list 'geoip:cn'\n\nconfig shunt_rules 'Iran'\n\toption remarks 'Iran'\n\toption network 'tcp,udp'\n\toption domain_list 'geosite:ir\n#rule-set:remote:https://raw.githubusercontent.com/Chocolate4U/Iran-sing-box-rules/rule-set/geosite-ir.srs'\n\toption ip_list 'geoip:ir\n#rule-set:remote:https://raw.githubusercontent.com/Chocolate4U/Iran-sing-box-rules/rule-set/geoip-ir.srs'\n\nconfig shunt_rules 'Russia_Block'\n\toption remarks 'Russia_Block'\n\toption network 'tcp,udp'\n\toption domain_list 'geosite:ru-blocked\n#rule-set:remote:https://raw.githubusercontent.com/runetfreedom/russia-v2ray-rules-dat/refs/heads/release/sing-box/rule-set-geosite/geosite-ru-blocked.srs'\n\toption ip_list 'geoip:ru-blocked\n#rule-set:remote:https://raw.githubusercontent.com/runetfreedom/russia-v2ray-rules-dat/refs/heads/release/sing-box/rule-set-geoip/geoip-ru-blocked.srs'\n\nconfig shunt_rules 'Russia'\n\toption remarks 'Russia'\n\toption network 'tcp,udp'\n\toption ip_list 'geoip:ru\n#rule-set:remote:https://raw.githubusercontent.com/runetfreedom/russia-v2ray-rules-dat/refs/heads/release/sing-box/rule-set-geoip/geoip-ru.srs'\n\nconfig nodes 'examplenode'\n\toption remarks 'Example'\n\toption type 'Xray'\n\toption protocol 'socks'\n\toption address 'passwall2.github'\n\toption port '1080'\n\toption tls '0'\n\toption transport 'raw'\n\toption tcp_guise 'none'\n\toption tcp_fast_open '0'\n\toption tcpMptcp '0'\n\nconfig nodes 'rulenode'\n\toption remarks 'rulenode'\n\toption type 'Xray'\n\toption protocol '_shunt'\n\toption default_node 'examplenode'\n\toption domainStrategy 'IPOnDemand'\n\toption domainMatcher 'hybrid'\n\toption write_ipset_direct '1'\n\toption enable_geoview_ip '1'\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/passwall2/app.sh",
    "content": "#!/bin/sh\n# Copyright (C) 2022-2025 xiaorouji\n# Copyright (C) 2026 Openwrt-Passwall Organization\n\n. /lib/functions.sh\n. /lib/functions/service.sh\n. /usr/share/libubox/jshn.sh\n\n. /usr/share/passwall2/utils.sh\nGLOBAL_ACL_PATH=${TMP_ACL_PATH}/default\nLUA_UTIL_PATH=/usr/lib/lua/luci/passwall2\nUTIL_SINGBOX=$LUA_UTIL_PATH/util_sing-box.lua\nUTIL_SS=$LUA_UTIL_PATH/util_shadowsocks.lua\nUTIL_XRAY=$LUA_UTIL_PATH/util_xray.lua\nUTIL_NAIVE=$LUA_UTIL_PATH/util_naiveproxy.lua\nUTIL_HYSTERIA2=$LUA_UTIL_PATH/util_hysteria2.lua\nUTIL_TUIC=$LUA_UTIL_PATH/util_tuic.lua\nSINGBOX_BIN=$(first_type $(config_t_get global_app sing_box_file) sing-box)\nXRAY_BIN=$(first_type $(config_t_get global_app xray_file) xray)\n\ncheck_run_environment() {\n\tlocal prefer_nft=$(config_t_get global_forwarding prefer_nft 1)\n\tlocal dnsmasq_info=$(dnsmasq -v 2>/dev/null)\n\tlocal dnsmasq_ver=$(echo \"$dnsmasq_info\" | sed -n '1s/.*version \\([0-9.]*\\).*/\\1/p')\n\t# local dnsmasq_opts=$(echo \"$dnsmasq_info\" | grep -i \"Compile time options\")\n\tlocal dnsmasq_ipset=0; echo \"$dnsmasq_info\" | grep -qw \"ipset\" && dnsmasq_ipset=1\n\tlocal dnsmasq_nftset=0; echo \"$dnsmasq_info\" | grep -qw \"nftset\" && dnsmasq_nftset=1\n\tlocal has_ipt=0; { command -v iptables-legacy || command -v iptables; } >/dev/null && has_ipt=1\n\tlocal has_ipset=$(command -v ipset >/dev/null && echo 1 || echo 0)\n\tlocal has_fw4=$(command -v fw4 >/dev/null && echo 1 || echo 0)\n\tif [ \"$prefer_nft\" = \"1\" ]; then\n\t\tif [ \"$dnsmasq_nftset\" -eq 1 ] && [ \"$has_fw4\" -eq 1 ]; then\n\t\t\tUSE_TABLES=\"nftables\"\n\t\telif [ \"$has_ipset\" -eq 1 ] && [ \"$has_ipt\" -eq 1 ] && [ \"$dnsmasq_ipset\" -eq 1 ]; then\n\t\t\tlog_i18n 0 \"Warning: The %s application environment is incomplete. Switch to %s. (%s)\" \"nftables (fw4)\" \"iptables\" \"has_fw4:$has_fw4/dnsmasq_nftset:$dnsmasq_nftset\"\n\t\t\tUSE_TABLES=\"iptables\"\n\t\tfi\n\telse\n\t\tif [ \"$has_ipset\" -eq 1 ] && [ \"$has_ipt\" -eq 1 ] && [ \"$dnsmasq_ipset\" -eq 1 ]; then\n\t\t\tUSE_TABLES=\"iptables\"\n\t\telif [ \"$dnsmasq_nftset\" -eq 1 ] && [ \"$has_fw4\" -eq 1 ]; then\n\t\t\tlog_i18n 0 \"Warning: The %s application environment is incomplete. Switch to %s. (%s)\" \"iptables (fw3)\" \"nftables\" \"has_ipt:$has_ipt/has_ipset:$has_ipset/dnsmasq_ipset:$dnsmasq_ipset\"\n\t\t\tUSE_TABLES=\"nftables\"\n\t\tfi\n\tfi\n\n\tif [ -n \"$USE_TABLES\" ]; then\n\t\tlocal dep_list\n\t\tlocal file_path=\"/usr/lib/opkg/info\"\n\t\tlocal file_ext=\".control\"\n\t\t[ -d \"/lib/apk/packages\" ] && { file_path=\"/lib/apk/packages\"; file_ext=\".list\"; }\n\n\t\tif [ \"$USE_TABLES\" = \"iptables\" ]; then\n\t\t\tdep_list=\"iptables-mod-tproxy iptables-mod-socket iptables-mod-iprange iptables-mod-conntrack-extra kmod-ipt-nat\"\n\t\telse\n\t\t\tdep_list=\"kmod-nft-socket kmod-nft-tproxy kmod-nft-nat\"\n\t\t\tnftflag=1\n\t\t\tlocal v_num=$(echo \"$dnsmasq_ver\" | tr -cd '0-9')\n\t\t\tif [ \"${v_num:-0}\" -lt 290 ]; then\n\t\t\t\tlog_i18n 0 \"Note: Dnsmasq (%s) is below 2.90. Upgrading is recommended to improve stability.\" \"${dnsmasq_ver}\"\n\t\t\tfi\n\t\tfi\n\t\tlocal pkg\n\t\tfor pkg in $dep_list; do\n\t\t\tif [ ! -s \"${file_path}/${pkg}${file_ext}\" ]; then\n\t\t\t\tlog_i18n 0 \"Warning: %s transparent proxy is missing basic dependency %s!\" \"${USE_TABLES}\" \"${pkg}\"\n\t\t\tfi\n\t\tdone\n\telse\n\t\tlog 0 \"$(i18n \"Warning: Not compatible with any transparent proxy system environment.\") (has_fw4:$has_fw4/has_ipt:$has_ipt/has_ipset:$has_ipset/dnsmasq_nftset:$dnsmasq_nftset/dnsmasq_ipset:$dnsmasq_ipset)\"\n\tfi\n}\n\nrun_xray() {\n\tlocal flag node redir_port tcp_proxy_way socks_address socks_port socks_username socks_password http_address http_port http_username http_password\n\tlocal dns_listen_port direct_dns_query_strategy remote_dns_protocol remote_dns_udp_server remote_dns_tcp_server remote_dns_doh remote_dns_client_ip remote_dns_detour remote_fakedns remote_dns_query_strategy dns_cache\n\tlocal loglevel log_file config_file\n\teval_set_val $@\n\tnode_protocol=$(config_n_get $node protocol)\n\t[ -n \"$log_file\" ] || local log_file=\"/dev/null\"\n\t[ -z \"$loglevel\" ] && local loglevel=$(config_t_get global loglevel \"warning\")\n\n\tjson_init\n\tjson_add_string \"loglevel\" \"${loglevel}\"\n\n\t[ -n \"$flag\" ] && {\n\t\tpgrep -af \"$TMP_BIN_PATH\" | awk -v P1=\"${flag}\" 'BEGIN{IGNORECASE=1}$0~P1{print $1}' | xargs kill -9 >/dev/null 2>&1\n\t\tjson_add_string \"flag\" \"${flag}\"\n\t}\n\t[ -n \"$socks_address\" ] && [ -n \"$socks_port\" ] && {\n\t\tjson_add_string \"local_socks_address\" \"${socks_address}\"\n\t\tjson_add_string \"local_socks_port\" \"${socks_port}\"\n\t\t[ -n \"$socks_username\" ] && [ -n \"$socks_password\" ] && {\n\t\t\tjson_add_string \"local_socks_username\" \"${socks_username}\"\n\t\t\tjson_add_string \"local_socks_password\" \"${socks_password}\"\n\t\t}\n\t}\n\t[ -n \"$http_address\" ] && [ -n \"$http_port\" ] && {\n\t\tjson_add_string \"local_http_address\" \"${http_address}\"\n\t\tjson_add_string \"local_http_port\" \"${http_port}\"\n\t\t[ -n \"$http_username\" ] && [ -n \"$http_password\" ] && {\n\t\t\tjson_add_string \"local_http_username\" \"${http_username}\"\n\t\t\tjson_add_string \"local_http_password\" \"${http_password}\"\n\t\t}\n\t}\n\t[ -n \"$dns_listen_port\" ] && {\n\t\tjson_add_string \"dns_listen_port\" \"${dns_listen_port}\"\n\t\t[ -n \"$dns_cache\" ] && json_add_string \"dns_cache\" \"${dns_cache}\"\n\t\t[ \"${node_protocol}\" = \"_shunt\" ] && local write_ipset_direct=$(config_n_get $node write_ipset_direct 0)\n\t\t[ \"${write_ipset_direct}\" = \"1\" ] && {\n\t\t\tdirect_dnsmasq_listen_port=$(get_new_port $(expr $dns_listen_port + 1) udp)\n\t\t\tlocal direct_ipset_conf=${GLOBAL_ACL_PATH}/dns_${flag}_direct.conf\n\t\t\t[ -n \"$(echo ${flag} | grep '^acl')\" ] && direct_ipset_conf=${TMP_ACL_PATH}/${sid}/dns_${flag}_direct.conf\n\t\t\tif [ \"${nftflag}\" = \"1\" ]; then\n\t\t\t\tlocal direct_nftset4=\"passwall2_${node}_white\"\n\t\t\t\tlocal direct_nftset6=\"passwall2_${node}_white6\"\n\t\t\t\tlocal direct_nftset=\"4#inet#passwall2#${direct_nftset4},6#inet#passwall2#${direct_nftset6}\"\n\t\t\telse\n\t\t\t\tlocal direct_ipset4=\"passwall2_${node}_white\"\n\t\t\t\tlocal direct_ipset6=\"passwall2_${node}_white6\"\n\t\t\t\tlocal direct_ipset=\"${direct_ipset4},${direct_ipset6}\"\n\t\t\tfi\n\t\t\trun_ipset_dns_server listen_port=${direct_dnsmasq_listen_port} server_dns=${AUTO_DNS} ipset=\"${direct_ipset}\" nftset=\"${direct_nftset}\" config_file=${direct_ipset_conf}\n\t\t\tDIRECT_DNS_UDP_PORT=${direct_dnsmasq_listen_port}\n\t\t\tDIRECT_DNS_UDP_SERVER=\"127.0.0.1\"\n\t\t\t[ -n \"${direct_ipset}\" ] && {\n\t\t\t\tjson_add_string \"direct_ipset\" \"${direct_ipset}\"\n\t\t\t\tset_cache_var \"node_${node}_direct_ipset4\" \"${direct_ipset4}\"\n\t\t\t\tset_cache_var \"node_${node}_direct_ipset6\" \"${direct_ipset6}\"\n\t\t\t}\n\t\t\t[ -n \"${direct_nftset}\" ] && {\n\t\t\t\tjson_add_string \"direct_nftset\" \"${direct_nftset}\"\n\t\t\t\tset_cache_var \"node_${node}_direct_nftset4\" \"${direct_nftset4}\"\n\t\t\t\tset_cache_var \"node_${node}_direct_nftset6\" \"${direct_nftset6}\"\n\t\t\t}\n\t\t}\n\t\t[ \"$remote_fakedns\" = \"1\" ] && {\n\t\t\tjson_add_string \"remote_dns_fake\" \"1\"\n\t\t\tjson_add_string \"remote_dns_fake_strategy\" \"${remote_dns_query_strategy}\"\n\t\t}\n\t\tcase \"$remote_dns_protocol\" in\n\t\t\tudp)\n\t\t\t\tlocal _dns=$(get_first_dns remote_dns_udp_server 53 | sed 's/#/:/g')\n\t\t\t\tlocal _dns_address=$(echo ${_dns} | awk -F ':' '{print $1}')\n\t\t\t\tlocal _dns_port=$(echo ${_dns} | awk -F ':' '{print $2}')\n\t\t\t\tjson_add_string \"remote_dns_udp_port\" \"${_dns_port}\"\n\t\t\t\tjson_add_string \"remote_dns_udp_server\" \"${_dns_address}\"\n\t\t\t;;\n\t\t\ttcp)\n\t\t\t\tlocal _dns=$(get_first_dns remote_dns_tcp_server 53 | sed 's/#/:/g')\n\t\t\t\tlocal _dns_address=$(echo ${_dns} | awk -F ':' '{print $1}')\n\t\t\t\tlocal _dns_port=$(echo ${_dns} | awk -F ':' '{print $2}')\n\t\t\t\tjson_add_string \"remote_dns_tcp_port\" \"${_dns_port}\"\n\t\t\t\tjson_add_string \"remote_dns_tcp_server\" \"${_dns_address}\"\n\t\t\t;;\n\t\t\tdoh)\n\t\t\t\tlocal _doh_url=$(echo $remote_dns_doh | awk -F ',' '{print $1}')\n\t\t\t\tlocal _doh_host_port=$(lua_api \"get_domain_from_url(\\\"${_doh_url}\\\")\")\n\t\t\t\t#local _doh_host_port=$(echo $_doh_url | sed \"s/https:\\/\\///g\" | awk -F '/' '{print $1}')\n\t\t\t\tlocal _doh_host=$(echo $_doh_host_port | awk -F ':' '{print $1}')\n\t\t\t\tlocal is_ip=$(lua_api \"is_ip(\\\"${_doh_host}\\\")\")\n\t\t\t\tlocal _doh_port=$(echo $_doh_host_port | awk -F ':' '{print $2}')\n\t\t\t\t[ -z \"${_doh_port}\" ] && _doh_port=443\n\t\t\t\tlocal _doh_bootstrap=$(echo $remote_dns_doh | cut -d ',' -sf 2-)\n\t\t\t\t[ \"${is_ip}\" = \"true\" ] && _doh_bootstrap=${_doh_host}\n\t\t\t\tjson_add_string \"remote_dns_doh_port\" \"${_doh_port}\"\n\t\t\t\tjson_add_string \"remote_dns_doh_url\" \"${_doh_url}\"\n\t\t\t\tjson_add_string \"remote_dns_doh_host\" \"${_doh_host}\"\n\t\t\t\t[ -n \"$_doh_bootstrap\" ] && json_add_string \"remote_dns_doh_ip\" \"${_doh_bootstrap}\"\n\t\t\t;;\n\t\tesac\n\t\t[ -n \"$remote_dns_detour\" ] && json_add_string \"remote_dns_detour\" \"${remote_dns_detour}\"\n\t\t[ -n \"$remote_dns_query_strategy\" ] && json_add_string \"remote_dns_query_strategy\" \"${remote_dns_query_strategy}\"\n\t\t[ -n \"$remote_dns_client_ip\" ] && json_add_string \"remote_dns_client_ip\" \"${remote_dns_client_ip}\"\n\t}\n\tjson_add_string \"direct_dns_udp_port\" \"${DIRECT_DNS_UDP_PORT}\"\n\tjson_add_string \"direct_dns_udp_server\" \"${DIRECT_DNS_UDP_SERVER}\"\n\tjson_add_string \"direct_dns_query_strategy\" \"${direct_dns_query_strategy}\"\n\n\t[ -n \"${redir_port}\" ] && {\n\t\tjson_add_string \"redir_port\" \"${redir_port}\"\n\t\tset_cache_var \"node_${node}_redir_port\" \"${redir_port}\"\n\t\t[ -n \"${tcp_proxy_way}\" ] && json_add_string \"tcp_proxy_way\" \"${tcp_proxy_way}\"\n\t}\n\n\tjson_add_string \"node\" \"${node}\"\n\n\tlocal _json_arg=\"$(json_dump)\"\n\tlua $UTIL_XRAY gen_config \"${_json_arg}\" > $config_file\n\n\ttest_log_file=$log_file\n\t[ \"$test_log_file\" = \"/dev/null\" ] && test_log_file=\"${TMP_PATH}/test.log\"\n\n\t$XRAY_BIN run -test -c \"$config_file\" > $test_log_file; local status=$?\n\tif [ \"${status}\" == 0 ]; then\n\t\tln_run ${QUEUE_RUN} \"$XRAY_BIN\" xray $log_file run -c \"$config_file\"\n\telse\n\t\t_error_log_file=$test_log_file\n\t\treturn ${status}\n\tfi\n}\n\nrun_singbox() {\n\tlocal flag node redir_port tcp_proxy_way socks_address socks_port socks_username socks_password http_address http_port http_username http_password\n\tlocal dns_listen_port direct_dns_query_strategy remote_dns_protocol remote_dns_udp_server remote_dns_tcp_server remote_dns_doh remote_dns_client_ip remote_dns_detour remote_fakedns remote_dns_query_strategy dns_cache\n\tlocal loglevel log_file config_file\n\teval_set_val $@\n\tlocal type=$(echo $(config_n_get $node type) | tr 'A-Z' 'a-z')\n\t[ -z \"$type\" ] && return 1\n\tnode_protocol=$(config_n_get $node protocol)\n\t[ -n \"$log_file\" ] || local log_file=\"/dev/null\"\n\t[ -z \"$loglevel\" ] && local loglevel=$(config_t_get global loglevel \"warn\")\n\t[ \"$loglevel\" = \"warning\" ] && loglevel=\"warn\"\n\tlocal singbox_tag=$($SINGBOX_BIN version | grep 'Tags:' | awk '{print $2}')\n\n\tjson_init\n\tjson_add_string \"tags\" \"${singbox_tag}\"\n\n\tif [ \"$log_file\" = \"/dev/null\" ]; then\n\t\tjson_add_string \"log\" \"0\"\n\telse\n\t\tjson_add_string \"log\" \"1\"\n\t\tjson_add_string \"logfile\" \"${log_file}\"\n\tfi\n\tjson_add_string \"loglevel\" \"${loglevel}\"\n\n\t[ -n \"$flag\" ] && {\n\t\tpgrep -af \"$TMP_BIN_PATH\" | awk -v P1=\"${flag}\" 'BEGIN{IGNORECASE=1}$0~P1{print $1}' | xargs kill -9 >/dev/null 2>&1\n\t\tjson_add_string \"flag\" \"${flag}\"\n\t}\n\t[ -n \"$socks_address\" ] && [ -n \"$socks_port\" ] && {\n\t\tjson_add_string \"local_socks_address\" \"${socks_address}\"\n\t\tjson_add_string \"local_socks_port\" \"${socks_port}\"\n\t\t[ -n \"$socks_username\" ] && [ -n \"$socks_password\" ] && {\n\t\t\tjson_add_string \"local_socks_username\" \"${socks_username}\"\n\t\t\tjson_add_string \"local_socks_password\" \"${socks_password}\"\n\t\t}\n\t}\n\t[ -n \"$http_address\" ] && [ -n \"$http_port\" ] && {\n\t\tjson_add_string \"local_http_address\" \"${http_address}\"\n\t\tjson_add_string \"local_http_port\" \"${http_port}\"\n\t\t[ -n \"$http_username\" ] && [ -n \"$http_password\" ] && {\n\t\t\tjson_add_string \"local_http_username\" \"${http_username}\"\n\t\t\tjson_add_string \"local_http_password\" \"${http_password}\"\n\t\t}\n\t}\n\t[ -n \"$dns_listen_port\" ] && {\n\t\t[ \"${node_protocol}\" = \"_shunt\" ] && local write_ipset_direct=$(config_n_get $node write_ipset_direct 0)\n\t\t[ \"${write_ipset_direct}\" = \"1\" ] && {\n\t\t\tdirect_dnsmasq_listen_port=$(get_new_port $(expr $dns_listen_port + 1) udp)\n\t\t\tlocal direct_ipset_conf=${GLOBAL_ACL_PATH}/dns_${flag}_direct.conf\n\t\t\t[ -n \"$(echo ${flag} | grep '^acl')\" ] && direct_ipset_conf=${TMP_ACL_PATH}/${sid}/dns_${flag}_direct.conf\n\t\t\tif [ \"${nftflag}\" = \"1\" ]; then\n\t\t\t\tlocal direct_nftset4=\"passwall2_${node}_white\"\n\t\t\t\tlocal direct_nftset6=\"passwall2_${node}_white6\"\n\t\t\t\tlocal direct_nftset=\"4#inet#passwall2#${direct_nftset4},6#inet#passwall2#${direct_nftset6}\"\n\t\t\telse\n\t\t\t\tlocal direct_ipset4=\"passwall2_${node}_white\"\n\t\t\t\tlocal direct_ipset6=\"passwall2_${node}_white6\"\n\t\t\t\tlocal direct_ipset=\"${direct_ipset4},${direct_ipset6}\"\n\t\t\tfi\n\t\t\trun_ipset_dns_server listen_port=${direct_dnsmasq_listen_port} server_dns=${AUTO_DNS} ipset=\"${direct_ipset}\" nftset=\"${direct_nftset}\" config_file=${direct_ipset_conf}\n\t\t\tDIRECT_DNS_UDP_PORT=${direct_dnsmasq_listen_port}\n\t\t\tDIRECT_DNS_UDP_SERVER=\"127.0.0.1\"\n\t\t\t[ -n \"${direct_ipset}\" ] && {\n\t\t\t\tjson_add_string \"direct_ipset\" \"${direct_ipset}\"\n\t\t\t\tset_cache_var \"node_${node}_direct_ipset4\" \"${direct_ipset4}\"\n\t\t\t\tset_cache_var \"node_${node}_direct_ipset6\" \"${direct_ipset6}\"\n\t\t\t}\n\t\t\t[ -n \"${direct_nftset}\" ] && {\n\t\t\t\tjson_add_string \"direct_nftset\" \"${direct_nftset}\"\n\t\t\t\tset_cache_var \"node_${node}_direct_nftset4\" \"${direct_nftset4}\"\n\t\t\t\tset_cache_var \"node_${node}_direct_nftset6\" \"${direct_nftset6}\"\n\t\t\t}\n\t\t}\n\n\t\tcase \"$remote_dns_protocol\" in\n\t\t\tudp|\\\n\t\t\tquic)\n\t\t\t\tlocal _dns=$(get_first_dns remote_dns_udp_server 53 | sed 's/#/:/g')\n\t\t\t\tlocal _dns_address=$(echo ${_dns} | awk -F ':' '{print $1}')\n\t\t\t\tlocal _dns_port=$(echo ${_dns} | awk -F ':' '{print $2}')\n\t\t\t\tjson_add_string \"remote_dns_udp_port\" \"${_dns_port}\"\n\t\t\t\tjson_add_string \"remote_dns_udp_server\" \"${_dns_address}\"\n\t\t\t\t[ \"$remote_dns_protocol\" == \"quic\" ] && json_add_string \"remote_dns_quic\" \"1\"\n\t\t\t;;\n\t\t\ttcp|\\\n\t\t\ttls)\n\t\t\t\tlocal _dns=$(get_first_dns remote_dns_tcp_server 53 | sed 's/#/:/g')\n\t\t\t\tlocal _dns_address=$(echo ${_dns} | awk -F ':' '{print $1}')\n\t\t\t\tlocal _dns_port=$(echo ${_dns} | awk -F ':' '{print $2}')\n\t\t\t\tjson_add_string \"remote_dns_tcp_port\" \"${_dns_port}\"\n\t\t\t\tjson_add_string \"remote_dns_tcp_server\" \"${_dns_address}\"\n\t\t\t\t[ \"$remote_dns_protocol\" == \"tls\" ] && json_add_string \"remote_dns_tls\" \"1\"\n\t\t\t;;\n\t\t\tdoh|\\\n\t\t\thttp3)\n\t\t\t\tlocal _doh_url=$(echo $remote_dns_doh | awk -F ',' '{print $1}')\n\t\t\t\tlocal _doh_host_port=$(lua_api \"get_domain_from_url(\\\"${_doh_url}\\\")\")\n\t\t\t\t#local _doh_host_port=$(echo $_doh_url | sed \"s/https:\\/\\///g\" | awk -F '/' '{print $1}')\n\t\t\t\tlocal _doh_host=$(echo $_doh_host_port | awk -F ':' '{print $1}')\n\t\t\t\tlocal is_ip=$(lua_api \"is_ip(\\\"${_doh_host}\\\")\")\n\t\t\t\tlocal _doh_port=$(echo $_doh_host_port | awk -F ':' '{print $2}')\n\t\t\t\t[ -z \"${_doh_port}\" ] && _doh_port=443\n\t\t\t\tlocal _doh_bootstrap=$(echo $remote_dns_doh | cut -d ',' -sf 2-)\n\t\t\t\t[ \"${is_ip}\" = \"true\" ] && _doh_bootstrap=${_doh_host}\n\t\t\t\t[ -n \"$_doh_bootstrap\" ] && json_add_string \"remote_dns_doh_ip\" \"${_doh_bootstrap}\"\n\t\t\t\tjson_add_string \"remote_dns_doh_port\" \"${_doh_port}\"\n\t\t\t\tjson_add_string \"remote_dns_doh_url\" \"${_doh_url}\"\n\t\t\t\tjson_add_string \"remote_dns_doh_host\" \"${_doh_host}\"\n\t\t\t\t[ \"$remote_dns_protocol\" == \"http3\" ] && json_add_string \"remote_dns_http3\" \"1\"\n\t\t\t;;\n\t\tesac\n\n\t\t[ -n \"$remote_dns_detour\" ] && json_add_string \"remote_dns_detour\" \"${remote_dns_detour}\"\n\t\t[ -n \"$remote_dns_query_strategy\" ] && json_add_string \"remote_dns_query_strategy\" \"${remote_dns_query_strategy}\"\n\t\t[ -n \"$remote_dns_client_ip\" ] && json_add_string \"remote_dns_client_ip\" \"${remote_dns_client_ip}\"\n\n\t\t[ -n \"$dns_listen_port\" ] && json_add_string \"dns_listen_port\" \"${dns_listen_port}\"\n\t\t[ -n \"$dns_cache\" ] && json_add_string \"dns_cache\" \"${dns_cache}\"\n\t\t[ \"$remote_fakedns\" = \"1\" ] && json_add_string \"remote_dns_fake\" \"1\"\n\t}\n\tjson_add_string \"direct_dns_udp_port\" \"${DIRECT_DNS_UDP_PORT}\"\n\tjson_add_string \"direct_dns_udp_server\" \"${DIRECT_DNS_UDP_SERVER}\"\n\tjson_add_string \"direct_dns_query_strategy\" \"${direct_dns_query_strategy}\"\n\n\t[ -n \"${redir_port}\" ] && {\n\t\tjson_add_string \"redir_port\" \"${redir_port}\"\n\t\tset_cache_var \"node_${node}_redir_port\" \"${redir_port}\"\n\t\t[ -n \"${tcp_proxy_way}\" ] && json_add_string \"tcp_proxy_way\" \"${tcp_proxy_way}\"\n\t}\n\n\tjson_add_string \"node\" \"${node}\"\n\n\tlocal _json_arg=\"$(json_dump)\"\n\tlua $UTIL_SINGBOX gen_config \"${_json_arg}\" > $config_file\n\n\ttest_log_file=$log_file\n\t[ \"$test_log_file\" = \"/dev/null\" ] && test_log_file=\"${TMP_PATH}/test.log\"\n\n\t$SINGBOX_BIN check -c \"$config_file\" > $test_log_file 2>&1; local status=$?\n\tif [ \"${status}\" == 0 ]; then\n\t\tln_run ${QUEUE_RUN} \"$SINGBOX_BIN\" \"sing-box\" \"${log_file}\" run -c \"$config_file\"\n\telse\n\t\t_error_log_file=$test_log_file\n\t\treturn ${status}\n\tfi\n}\n\nrun_socks() {\n\tlocal flag node bind socks_port config_file http_port http_config_file relay_port log_file no_run\n\teval_set_val $@\n\t[ -n \"$config_file\" ] && [ -z \"$(echo ${config_file} | grep $TMP_PATH)\" ] && config_file=$TMP_PATH/$config_file\n\t[ -n \"$http_port\" ] || http_port=0\n\t[ -n \"$http_config_file\" ] && [ -z \"$(echo ${http_config_file} | grep $TMP_PATH)\" ] && http_config_file=$TMP_PATH/$http_config_file\n\tif [ -n \"$log_file\" ] && [ -z \"$(echo ${log_file} | grep $TMP_PATH)\" ]; then\n\t\tlog_file=$TMP_PATH/$log_file\n\telse\n\t\tlog_file=\"/dev/null\"\n\tfi\n\tlocal type=$(echo $(config_n_get $node type) | tr 'A-Z' 'a-z')\n\tlocal remarks=$(config_n_get $node remarks)\n\tlocal server_host=$(config_n_get $node address)\n\tlocal server_port=$(config_n_get $node port)\n\t[ -n \"$relay_port\" ] && {\n\t\tserver_host=\"127.0.0.1\"\n\t\tserver_port=$relay_port\n\t}\n\tlocal error_msg tmp\n\n\tif [ -n \"$server_host\" ] && [ -n \"$server_port\" ]; then\n\t\tcheck_host $server_host\n\t\t[ $? != 0 ] && {\n\t\t\tlog 1 \"$(i18n \"Socks node: [%s]%s is an invalid server address and cannot be started!\" \"${$remarks}\" \"${server_host}\")\"\n\t\t\treturn 1\n\t\t}\n\t\ttmp=\"${server_host}:${server_port}\"\n\telse\n\t\terror_msg=\"$(i18n \"For some reason, the configuration for this Socks service has been lost, and its startup has been aborted!\")\"\n\tfi\n\n\tif [ \"$type\" == \"sing-box\" ] || [ \"$type\" == \"xray\" ]; then\n\t\tlocal protocol=$(config_n_get $node protocol)\n\t\tif [ \"$protocol\" == \"_balancing\" ] || [ \"$protocol\" == \"_shunt\" ] || [ \"$protocol\" == \"_iface\" ] || [ \"$protocol\" == \"_urltest\" ]; then\n\t\t\tunset error_msg\n\t\tfi\n\tfi\n\n\t[ -n \"${error_msg}\" ] && {\n\t\t[ \"$bind\" != \"127.0.0.1\" ] && log 1 \"$(i18n \"Socks node: [%s]%s, start failed %s:%s %s\" \"${remarks}\" \"${tmp}\" \"${bind}\" \"${socks_port}\" \"${error_msg}\")\"\n\t\treturn 1\n\t}\n\t[ \"$bind\" != \"127.0.0.1\" ] && log 1 \"$(i18n \"Socks node: [%s]%s, starting %s:%s\" \"${remarks}\" \"${tmp}\" \"${bind}\" \"${socks_port}\")\"\n\n\tjson_init\n\tjson_add_string \"node\" \"${node}\"\n\tjson_add_string \"server_host\" \"${server_host}\"\n\tjson_add_string \"server_port\" \"${server_port}\"\n\tcase \"$type\" in\n\tsing-box)\n\t\t[ \"$http_port\" != \"0\" ] && {\n\t\t\thttp_flag=1\n\t\t\tconfig_file=\"${config_file//SOCKS/HTTP_SOCKS}\"\n\t\t\tjson_add_string \"local_http_address\" \"${bind}\"\n\t\t\tjson_add_string \"local_http_port\" \"${http_port}\"\n\t\t}\n\t\t[ -z \"$relay_port\" ] && {\n\t\t\tjson_add_null \"server_host\"\n\t\t\tjson_add_null \"server_port\"\n\t\t}\n\t\t[ \"${log_file}\" != \"/dev/null\" ] && {\n\t\t\tlocal loglevel=$(config_t_get global loglevel \"warn\")\n\t\t\t[ \"$loglevel\" = \"warning\" ] && loglevel=\"warn\"\n\t\t\tjson_add_string \"log\" \"1\"\n\t\t\tjson_add_string \"loglevel\" \"${loglevel}\"\n\t\t\tjson_add_string \"logfile\" \"${log_file}\"\n\t\t}\n\t\t[ -n \"$no_run\" ] && json_add_string \"no_run\" \"1\"\n\t\tjson_add_string \"flag\" \"SOCKS_${flag}\"\n\t\tjson_add_string \"local_socks_address\" \"${bind}\"\n\t\tjson_add_string \"local_socks_port\" \"${socks_port}\"\n\t\tjson_add_string \"direct_dns_udp_port\" \"${DIRECT_DNS_UDP_PORT}\"\n\t\tjson_add_string \"direct_dns_udp_server\" \"${DIRECT_DNS_UDP_SERVER}\"\n\t\tjson_add_string \"direct_dns_query_strategy\" \"${DIRECT_DNS_QUERY_STRATEGY}\"\n\t\tlocal _json_arg=\"$(json_dump)\"\n\t\tlua $UTIL_SINGBOX gen_config \"${_json_arg}\" > $config_file\n\t\t[ -z \"$no_run\" ] && ln_run ${QUEUE_RUN} \"$SINGBOX_BIN\" \"sing-box\" /dev/null run -c \"$config_file\"\n\t;;\n\txray)\n\t\t[ \"$http_port\" != \"0\" ] && {\n\t\t\thttp_flag=1\n\t\t\tconfig_file=\"${config_file//SOCKS/HTTP_SOCKS}\"\n\t\t\tjson_add_string \"local_http_address\" \"${bind}\"\n\t\t\tjson_add_string \"local_http_port\" \"${http_port}\"\n\t\t}\n\t\t[ -z \"$relay_port\" ] && {\n\t\t\tjson_add_null \"server_host\"\n\t\t\tjson_add_null \"server_port\"\n\t\t}\n\t\t[ -n \"$no_run\" ] && json_add_string \"no_run\" \"1\"\n\t\tjson_add_string \"flag\" \"SOCKS_${flag}\"\n\t\tjson_add_string \"local_socks_address\" \"${bind}\"\n\t\tjson_add_string \"local_socks_port\" \"${socks_port}\"\n\t\tjson_add_string \"direct_dns_udp_port\" \"${DIRECT_DNS_UDP_PORT}\"\n\t\tjson_add_string \"direct_dns_udp_server\" \"${DIRECT_DNS_UDP_SERVER}\"\n\t\tjson_add_string \"direct_dns_query_strategy\" \"${DIRECT_DNS_QUERY_STRATEGY}\"\n\t\tlocal _json_arg=\"$(json_dump)\"\n\t\tlua $UTIL_XRAY gen_config \"${_json_arg}\" > $config_file\n\t\t[ -z \"$no_run\" ] && ln_run ${QUEUE_RUN} \"$XRAY_BIN\" \"xray\" $log_file run -c \"$config_file\"\n\t;;\n\tnaiveproxy)\n\t\tjson_add_string \"local_addr\" \"${bind}\"\n\t\tjson_add_string \"local_port\" \"${socks_port}\"\n\t\tjson_add_string \"run_type\" \"socks\"\n\t\tlocal _json_arg=\"$(json_dump)\"\n\t\tlua $UTIL_NAIVE gen_config \"${_json_arg}\" > $config_file\n\t\t[ -z \"$no_run\" ] && ln_run ${QUEUE_RUN} \"$(first_type naive)\" naive $log_file \"$config_file\"\n\t;;\n\tssr)\n\t\tjson_add_string \"local_addr\" \"${bind}\"\n\t\tjson_add_string \"local_port\" \"${socks_port}\"\n\t\tlocal _json_arg=\"$(json_dump)\"\n\t\tlua $UTIL_SS gen_config \"${_json_arg}\" > $config_file\n\t\t[ -z \"$no_run\" ] && ln_run ${QUEUE_RUN} \"$(first_type ssr-local)\" \"ssr-local\" $log_file -c \"$config_file\" -v -u\n\t;;\n\tss)\n\t\tjson_add_string \"local_addr\" \"${bind}\"\n\t\tjson_add_string \"local_port\" \"${socks_port}\"\n\t\tjson_add_string \"mode\" \"tcp_and_udp\"\n\t\t[ -z \"$no_run\" ] && {\n\t\t\tlocal plugin_sh=\"${config_file%.json}_plugin.sh\"\n\t\t\tjson_add_string \"plugin_sh\" \"${plugin_sh}\"\n\t\t}\n\t\tlocal _json_arg=\"$(json_dump)\"\n\t\tlua $UTIL_SS gen_config \"${_json_arg}\" > $config_file\n\t\t[ -z \"$no_run\" ] && ln_run ${QUEUE_RUN} \"$(first_type ss-local)\" \"ss-local\" $log_file -c \"$config_file\" -v\n\t;;\n\tss-rust)\n\t\tjson_add_string \"local_socks_address\" \"${bind}\"\n\t\tjson_add_string \"local_socks_port\" \"${socks_port}\"\n\t\t[ \"$http_port\" != \"0\" ] && {\n\t\t\thttp_flag=1\n\t\t\tconfig_file=\"${config_file//SOCKS/HTTP_SOCKS}\"\n\t\t\tjson_add_string \"local_http_address\" \"${bind}\"\n\t\t\tjson_add_string \"local_http_port\" \"${http_port}\"\n\t\t}\n\t\t[ -z \"$no_run\" ] && {\n\t\t\tlocal plugin_sh=\"${config_file%.json}_plugin.sh\"\n\t\t\tjson_add_string \"plugin_sh\" \"${plugin_sh}\"\n\t\t}\n\t\tlocal _json_arg=\"$(json_dump)\"\n\t\tlua $UTIL_SS gen_config \"${_json_arg}\" > $config_file\n\t\t[ -z \"$no_run\" ] && ln_run ${QUEUE_RUN} \"$(first_type sslocal)\" \"sslocal\" $log_file -c \"$config_file\" -v\n\t;;\n\thysteria2)\n\t\tjson_add_string \"local_socks_address\" \"${bind}\"\n\t\tjson_add_string \"local_socks_port\" \"${socks_port}\"\n\t\t[ \"$http_port\" != \"0\" ] && {\n\t\t\thttp_flag=1\n\t\t\tconfig_file=\"${config_file//SOCKS/HTTP_SOCKS}\"\n\t\t\tjson_add_string \"local_http_address\" \"${bind}\"\n\t\t\tjson_add_string \"local_http_port\" \"${http_port}\"\n\t\t}\n\t\tlocal _json_arg=\"$(json_dump)\"\n\t\tlua $UTIL_HYSTERIA2 gen_config \"${_json_arg}\" > $config_file\n\t\t[ -z \"$no_run\" ] && ln_run ${QUEUE_RUN} \"$(first_type $(config_t_get global_app hysteria_file))\" \"hysteria\" $log_file -c \"$config_file\" client\n\t;;\n\ttuic)\n\t\tjson_add_string \"local_addr\" \"${bind}\"\n\t\tjson_add_string \"local_port\" \"${socks_port}\"\n\t\tlocal _json_arg=\"$(json_dump)\"\n\t\tlua $UTIL_TUIC gen_config \"${_json_arg}\" > $config_file\n\t\t[ -z \"$no_run\" ] && ln_run ${QUEUE_RUN} \"$(first_type tuic-client)\" \"tuic-client\" $log_file -c \"$config_file\"\n\t;;\n\tesac\n\n\t# http to socks\n\t[ -z \"$http_flag\" ] && [ \"$http_port\" != \"0\" ] && [ -n \"$http_config_file\" ] && [ \"$type\" != \"sing-box\" ] && [ \"$type\" != \"xray\" ] && [ \"$type\" != \"socks\" ] && {\n\t\tjson_init\n\t\tjson_add_string \"local_http_port\" \"${http_port}\"\n\t\tjson_add_string \"server_proto\" \"socks\"\n\t\tjson_add_string \"server_address\" \"127.0.0.1\"\n\t\tjson_add_string \"server_port\" \"${socks_port}\"\n\t\tjson_add_string \"server_username\" \"${_username}\"\n\t\tjson_add_string \"server_password\" \"${_password}\"\n\t\tlocal _json_arg=\"$(json_dump)\"\n\t\tif [ -n \"${SINGBOX_BIN}\" ]; then\n\t\t\ttype=\"sing-box\"\n\t\t\tlocal bin=\"${SINGBOX_BIN}\"\n\t\t\tlocal util=\"${UTIL_SINGBOX}\"\n\t\telif [ -n \"${XRAY_BIN}\" ]; then\n\t\t\ttype=\"xray\"\n\t\t\tlocal bin=\"${XRAY_BIN}\"\n\t\t\tlocal util=\"${UTIL_XRAY}\"\n\t\tfi\n\t\t[ -n \"${bin}\" ] && [ -n \"${util}\" ] && {\n\t\t\tlua ${util} gen_proto_config \"${_json_arg}\" > ${http_config_file}\n\t\t\t[ -z \"$no_run\" ] && ln_run ${QUEUE_RUN} \"${bin}\" ${type} /dev/null run -c ${http_config_file}\n\t\t}\n\t\tunset bin util\n\t}\n\tunset http_flag\n\n\t[ -z \"$no_run\" ] && [ \"${server_host}\" != \"127.0.0.1\" ] && [ \"$type\" != \"sing-box\" ] && [ \"$type\" != \"xray\" ] && echo \"${node}\" >> $TMP_PATH/direct_node_list\n}\n\nsocks_node_switch() {\n\tlocal flag new_node\n\teval_set_val $@\n\t[ -n \"$flag\" ] && [ -n \"$new_node\" ] && {\n\t\tlocal prefix pf filename\n\t\t# Kill the SS plugin process\n\t\tfor prefix in \"\" \"HTTP_\"; do\n\t\t\tpf=\"$TMP_PATH/${prefix}SOCKS_${flag}_plugin.pid\"\n\t\t\t[ -s \"$pf\" ] && kill -9 \"$(head -n1 \"$pf\")\" >/dev/null 2>&1\n\t\tdone\n\n\t\tpgrep -af \"$TMP_BIN_PATH\" | awk -v P1=\"${flag}\" 'BEGIN{IGNORECASE=1}$0~P1 && !/acl\\/|acl_/{print $1}' | xargs kill -9 >/dev/null 2>&1\n\t\tfor prefix in \"\" \"HTTP_\" \"HTTP2\"; do\n\t\t\trm -rf \"$TMP_PATH/${prefix}SOCKS_${flag}\"*\n\t\tdone\n\n\t\tfor filename in $(ls ${TMP_SCRIPT_FUNC_PATH}); do\n\t\t\tcmd=$(cat ${TMP_SCRIPT_FUNC_PATH}/${filename})\n\t\t\t[ -n \"$(echo $cmd | grep \"${flag}\")\" ] && rm -f ${TMP_SCRIPT_FUNC_PATH}/${filename}\n\t\tdone\n\t\tlocal bind_local=$(config_n_get $flag bind_local 0)\n\t\tlocal bind=\"0.0.0.0\"\n\t\t[ \"$bind_local\" = \"1\" ] && bind=\"127.0.0.1\"\n\t\tlocal port=$(config_n_get $flag port)\n\t\tlocal config_file=\"SOCKS_${flag}.json\"\n\t\tlocal log_file=\"SOCKS_${flag}.log\"\n\t\tlocal log=$(config_n_get $flag log 1)\n\t\t[ \"$log\" == \"0\" ] && log_file=\"\"\n\t\tlocal http_port=$(config_n_get $flag http_port 0)\n\t\tlocal http_config_file=\"HTTP2SOCKS_${flag}.json\"\n\t\tLOG_FILE=\"/dev/null\"\n\t\trun_socks flag=$flag node=$new_node bind=$bind socks_port=$port config_file=$config_file http_port=$http_port http_config_file=$http_config_file log_file=$log_file\n\t\tset_cache_var \"socks_${flag}\" \"$new_node\"\n\t\tlocal USE_TABLES=$(get_cache_var \"USE_TABLES\")\n\t\t[ -n \"$USE_TABLES\" ] && source $APP_PATH/${USE_TABLES}.sh filter_direct_node_list\n\t}\n}\n\nrun_global() {\n\t[ -z \"$NODE\" ] && return 1\n\tTYPE=$(echo $(config_n_get $NODE type) | tr 'A-Z' 'a-z')\n\t[ -z \"$TYPE\" ] && return 1\n\n\tif [ $PROXY_IPV6 == \"1\" ]; then\n\t\tlog_i18n 0 \"To enable experimental IPv6 transparent proxy (TProxy), please ensure your node and type support IPv6!\"\n\tfi\n\n\tTUN_DNS_PORT=15353\n\tTUN_DNS=\"127.0.0.1#${TUN_DNS_PORT}\"\n\n\tV2RAY_ARGS=\"flag=global node=$NODE redir_port=$REDIR_PORT tcp_proxy_way=${TCP_PROXY_WAY}\"\n\tV2RAY_ARGS=\"${V2RAY_ARGS} dns_listen_port=${TUN_DNS_PORT} direct_dns_query_strategy=${DIRECT_DNS_QUERY_STRATEGY} remote_dns_query_strategy=${REMOTE_DNS_QUERY_STRATEGY} dns_cache=${DNS_CACHE}\"\n\tlocal dns_msg=\"DNS: ${TUN_DNS} （$(i18n \"Direct DNS: %s\" \"${AUTO_DNS}\")\"\n\n\t[ -n \"$REMOTE_DNS_PROTOCOL\" ] && {\n\t\tV2RAY_ARGS=\"${V2RAY_ARGS} remote_dns_protocol=${REMOTE_DNS_PROTOCOL} remote_dns_detour=${REMOTE_DNS_DETOUR}\"\n\t\tcase \"$REMOTE_DNS_PROTOCOL\" in\n\t\t\tudp|\\\n\t\t\tquic)\n\t\t\t\tV2RAY_ARGS=\"${V2RAY_ARGS} remote_dns_udp_server=${REMOTE_DNS}\"\n\t\t\t\tdns_msg=\"${dns_msg} $(i18n \"Remote DNS: %s\" \"${REMOTE_DNS}\")\"\n\t\t\t;;\n\t\t\ttcp|\\\n\t\t\ttls)\n\t\t\t\tV2RAY_ARGS=\"${V2RAY_ARGS} remote_dns_tcp_server=${REMOTE_DNS}\"\n\t\t\t\tdns_msg=\"${dns_msg} $(i18n \"Remote DNS: %s\" \"${REMOTE_DNS}\")\"\n\t\t\t;;\n\t\t\tdoh|\\\n\t\t\thttp3)\n\t\t\t\tREMOTE_DNS_DOH=$(config_t_get global remote_dns_doh \"https://1.1.1.1/dns-query\")\n\t\t\t\tV2RAY_ARGS=\"${V2RAY_ARGS} remote_dns_doh=${REMOTE_DNS_DOH}\"\n\t\t\t\tdns_msg=\"${dns_msg} $(i18n \"Remote DNS: %s\" \"${REMOTE_DNS_DOH}\")\"\n\t\t\t;;\n\t\tesac\n\t\t[ \"$REMOTE_FAKEDNS\" = \"1\" ] && {\n\t\t\tV2RAY_ARGS=\"${V2RAY_ARGS} remote_fakedns=1\"\n\t\t\tdns_msg=\"${dns_msg} + FakeDNS \"\n\t\t}\n\t\t\n\t\tlocal _remote_dns_client_ip=$(config_t_get global remote_dns_client_ip)\n\t\t[ -n \"${_remote_dns_client_ip}\" ] && V2RAY_ARGS=\"${V2RAY_ARGS} remote_dns_client_ip=${_remote_dns_client_ip}\"\n\t}\n\tdns_msg=\"${dns_msg}）\"\n\n\tV2RAY_CONFIG=${GLOBAL_ACL_PATH}/global.json\n\tV2RAY_LOG=${GLOBAL_ACL_PATH}/global.log\n\t[ \"$(config_t_get global log_node 1)\" != \"1\" ] && V2RAY_LOG=\"/dev/null\"\n\tV2RAY_ARGS=\"${V2RAY_ARGS} log_file=${V2RAY_LOG} config_file=${V2RAY_CONFIG}\"\n\n\tnode_socks_port=$(config_t_get global node_socks_port 1070)\n\tnode_socks_bind_local=$(config_t_get global node_socks_bind_local 1)\n\tnode_socks_bind=\"127.0.0.1\"\n\t[ \"${node_socks_bind_local}\" != \"1\" ] && node_socks_bind=\"0.0.0.0\"\n\tV2RAY_ARGS=\"${V2RAY_ARGS} socks_address=${node_socks_bind} socks_port=${node_socks_port}\"\n\tset_cache_var \"GLOBAL_SOCKS_server\" \"127.0.0.1:$node_socks_port\"\n\n\tnode_http_port=$(config_t_get global node_http_port 0)\n\t[ \"$node_http_port\" != \"0\" ] && V2RAY_ARGS=\"${V2RAY_ARGS} http_port=${node_http_port}\"\n\n\tlocal run_func\n\t[ -n \"${XRAY_BIN}\" ] && run_func=\"run_xray\"\n\t[ -n \"${SINGBOX_BIN}\" ] && run_func=\"run_singbox\"\n\tif [ \"${TYPE}\" = \"xray\" ] && [ -n \"${XRAY_BIN}\" ]; then\n\t\trun_func=\"run_xray\"\n\telif [ \"${TYPE}\" = \"sing-box\" ] && [ -n \"${SINGBOX_BIN}\" ]; then\n\t\trun_func=\"run_singbox\"\n\tfi\n\t\n\t${run_func} ${V2RAY_ARGS}; local status=$?\n\n\tif [ \"$status\" == 0 ]; then\n\t\tlog 0 ${dns_msg}\n\telse\n\t\tlog_i18n 0 \"[%s] process %s error, skip this transparent proxy!\" $(i18n \"Global\") \"${V2RAY_CONFIG}\"\n\t\tcat ${_error_log_file} >> ${LOG_FILE}\n\t\tunset _error_log_file\n\t\tENABLED_DEFAULT_ACL=0\n\t\treturn 1\n\tfi\n\n\tset_cache_var \"ACL_GLOBAL_node\" \"$NODE\"\n\tset_cache_var \"ACL_GLOBAL_redir_port\" \"$REDIR_PORT\"\n}\n\nrun_front_dns() {\n\tlocal switch=0\n\tdirect_dns_shunt=$(config_t_get global direct_dns_shunt)\n\tdirect_dns_shunt=$(echo \"${direct_dns_shunt}\" | grep -v \"^#\")\n\t[ -n \"${direct_dns_shunt}\" ] && switch=1\n\t[ \"${switch}\" == \"1\" ] && {\n\t\tlocal config_file=\"${TMP_PATH}/direct_dns.json\"\n\t\tlocal log_file=\"${TMP_PATH}/direct_dns.log\"\n\t\tlog_file=\"/dev/null\"\n\t\tlocal listen_port=$(get_new_port 10553)\n\t\tjson_init\n\t\tjson_add_string \"dns_listen_port\" \"${listen_port}\"\n\t\tjson_add_string \"direct_dns_udp_server\" \"${DIRECT_DNS_UDP_SERVER}\"\n\t\tjson_add_string \"direct_dns_udp_port\" \"${DIRECT_DNS_UDP_PORT}\"\n\t\tjson_add_string \"direct_dns_query_strategy\" \"${DIRECT_DNS_QUERY_STRATEGY}\"\n\t\t[ -n \"${ACL_GLOBAL_node}\" ] && [ -n \"${TUN_DNS_PORT}\" ] && {\n\t\t\tjson_add_string \"default_dns_udp_server\" \"127.0.0.1\"\n\t\t\tjson_add_string \"default_dns_udp_port\" \"${TUN_DNS_PORT}\"\n\t\t}\n\t\tlocal _json_arg=\"$(json_dump)\"\n\n\t\tlocal prefer_core=\"\"\n\t\t[ -n \"${XRAY_BIN}\" ] && prefer_core=\"xray\"\n\t\t[ -n \"${SINGBOX_BIN}\" ] && prefer_core=\"sing-box\"\n\n\t\tif [ \"${prefer_core}\" = \"xray\" ]; then\n\t\t\tlua $UTIL_XRAY gen_front_dns_config \"${_json_arg}\" > $config_file\n\t\t\tln_run 0 \"$XRAY_BIN\" \"xray\" \"${log_file}\" run -c \"$config_file\"\n\t\telif [ \"${prefer_core}\" = \"sing-box\" ]; then\n\t\t\tlua $UTIL_SINGBOX gen_front_dns_config \"${_json_arg}\" > $config_file\n\t\t\tln_run 0 \"$SINGBOX_BIN\" \"sing-box\" \"${log_file}\" run -c \"$config_file\"\n\t\telse\n\t\t\treturn 1\n\t\tfi\n\n\t\tFRONT_DNS_SERVER=\"127.0.0.1\"\n\t\tFRONT_DNS_PORT=\"${listen_port}\"\n\t}\n}\n\nrun_global_dnsmasq() {\n\t[ -z \"${ACL_GLOBAL_node}\" ] && [ -z \"${FRONT_DNS_PORT}\" ] && return\n\tlocal RUN_NEW_DNSMASQ=1\n\tRUN_NEW_DNSMASQ=${DNS_REDIRECT}\n\tDNSMASQ_DEFAULT_DNS=\"${AUTO_DNS}\"\n\tDNSMASQ_LOCAL_DNS=\"${LOCAL_DNS:-${AUTO_DNS}}\"\n\tDNSMASQ_TUN_DNS=\"${TUN_DNS}\"\n\t[ -n \"${FRONT_DNS_PORT}\" ] && {\n\t\tDNSMASQ_DEFAULT_DNS=\"${FRONT_DNS_SERVER}#${FRONT_DNS_PORT}\"\n\t\tDNSMASQ_LOCAL_DNS=\"${DNSMASQ_DEFAULT_DNS}\"\n\t\tDNSMASQ_TUN_DNS=\"${DNSMASQ_DEFAULT_DNS}\"\n\t}\n\tif [ \"${RUN_NEW_DNSMASQ}\" == \"0\" ]; then\n\t\t#The old logic will be removed in the future.\n\t\t#Run a copy dnsmasq instance, DNS hijack that don't need a proxy devices.\n\t\t[ \"1\" = \"0\" ] && {\n\t\t\tDIRECT_DNSMASQ_PORT=$(get_new_port 11400)\n\t\t\tDIRECT_DNSMASQ_CONF=${GLOBAL_ACL_PATH}/direct_dnsmasq.conf\n\t\t\tDIRECT_DNSMASQ_CONF_PATH=${GLOBAL_ACL_PATH}/direct_dnsmasq.d\n\t\t\tmkdir -p ${DIRECT_DNSMASQ_CONF_PATH}\n\t\t\tjson_init\n\t\t\tjson_add_string \"LISTEN_PORT\" \"${DIRECT_DNSMASQ_PORT}\"\n\t\t\tjson_add_string \"DNSMASQ_CONF\" \"${DIRECT_DNSMASQ_CONF}\"\n\t\t\tjson_add_string \"TMP_DNSMASQ_PATH\" \"${DIRECT_DNSMASQ_CONF_PATH}\"\n\t\t\tlua $APP_PATH/helper_dnsmasq.lua copy_instance \"$(json_dump)\"\n\t\t\tln_run 0 \"$(first_type dnsmasq)\" \"dnsmasq_direct\" \"/dev/null\" -C ${DIRECT_DNSMASQ_CONF} -x ${GLOBAL_ACL_PATH}/direct_dnsmasq.pid\n\t\t\tset_cache_var \"DIRECT_DNSMASQ_PORT\" \"${DIRECT_DNSMASQ_PORT}\"\n\t\t}\n\t\t\n\t\t#Rewrite the default DNS service configuration\n\t\t#Modify the default dnsmasq service\n\t\tlua $APP_PATH/helper_dnsmasq.lua stretch\n\t\tjson_init\n\t\tjson_add_string \"FLAG\" \"default\"\n\t\tjson_add_string \"TMP_DNSMASQ_PATH\" \"${GLOBAL_DNSMASQ_CONF_PATH}\"\n\t\tjson_add_string \"DNSMASQ_CONF_FILE\" \"${GLOBAL_DNSMASQ_CONF}\"\n\t\tjson_add_string \"DEFAULT_DNS\" \"${DNSMASQ_DEFAULT_DNS}\"\n\t\tjson_add_string \"LOCAL_DNS\" \"${DNSMASQ_LOCAL_DNS}\"\n\t\tjson_add_string \"TUN_DNS\" \"${DNSMASQ_TUN_DNS}\"\n\t\tjson_add_string \"NFTFLAG\" \"${nftflag:-0}\"\n\t\tjson_add_string \"NO_LOGIC_LOG\" \"${NO_LOGIC_LOG:-0}\"\n\t\tlua $APP_PATH/helper_dnsmasq.lua add_rule \"$(json_dump)\"\n\t\tuci -q add_list dhcp.@dnsmasq[0].addnmount=${GLOBAL_DNSMASQ_CONF_PATH}\n\t\tuci -q commit dhcp\n\n\t\tjson_init\n\t\tjson_add_string \"LOG\" \"1\"\n\t\tlua $APP_PATH/helper_dnsmasq.lua logic_restart \"$(json_dump)\"\n\telse\n\t\t#Run a copy dnsmasq instance, DNS hijack for that need proxy devices.\n\t\tGLOBAL_DNSMASQ_PORT=$(get_new_port 11400)\n\t\trun_copy_dnsmasq flag=\"default\" listen_port=$GLOBAL_DNSMASQ_PORT local_dns=\"${DNSMASQ_LOCAL_DNS}\" tun_dns=\"${DNSMASQ_TUN_DNS}\" default_dns=\"${DNSMASQ_DEFAULT_DNS}\"\n\t\tDNS_REDIRECT_PORT=${GLOBAL_DNSMASQ_PORT}\n\t\t#dhcp.leases to hosts\n\t\t$APP_PATH/lease2hosts.sh > /dev/null 2>&1 &\n\tfi\n}\n\nstart_socks() {\n\t[ \"$SOCKS_ENABLED\" = \"1\" ] && {\n\t\tlocal ids=$(uci show $CONFIG | grep \"=socks\" | awk -F '.' '{print $2}' | awk -F '=' '{print $1}')\n\t\t[ -n \"$ids\" ] && {\n\t\t\tlog_i18n 0 \"Analyzing the node configuration of the Socks service...\"\n\t\t\tfor id in $ids; do\n\t\t\t\tlocal enabled=$(config_n_get $id enabled 0)\n\t\t\t\t[ \"$enabled\" == \"0\" ] && continue\n\t\t\t\tlocal node=$(config_n_get $id node)\n\t\t\t\t[ -z \"$node\" ] && continue\n\t\t\t\tlocal bind_local=$(config_n_get $id bind_local 0)\n\t\t\t\tlocal bind=\"0.0.0.0\"\n\t\t\t\t[ \"$bind_local\" = \"1\" ] && bind=\"127.0.0.1\"\n\t\t\t\tlocal port=$(config_n_get $id port)\n\t\t\t\tlocal config_file=\"SOCKS_${id}.json\"\n\t\t\t\tlocal log_file=\"SOCKS_${id}.log\"\n\t\t\t\tlocal log=$(config_n_get $id log 1)\n\t\t\t\t[ \"$log\" == \"0\" ] && log_file=\"\"\n\t\t\t\tlocal http_port=$(config_n_get $id http_port 0)\n\t\t\t\tlocal http_config_file=\"HTTP2SOCKS_${id}.json\"\n\t\t\t\trun_socks flag=$id node=$node bind=$bind socks_port=$port config_file=$config_file http_port=$http_port http_config_file=$http_config_file log_file=$log_file\n\t\t\t\tset_cache_var \"socks_${id}\" \"$node\"\n\n\t\t\t\t# Auto switch logic\n\t\t\t\tlocal enable_autoswitch=$(config_n_get $id enable_autoswitch 0)\n\t\t\t\t[ \"$enable_autoswitch\" = \"1\" ] && $APP_PATH/socks_auto_switch.sh ${id} > /dev/null 2>&1 &\n\t\t\tdone\n\t\t}\n\t}\n}\n\nclean_crontab() {\n\t[ -f \"/tmp/lock/${CONFIG}_cron.lock\" ] && return\n\ttouch /etc/crontabs/root\n\t#sed -i \"/${CONFIG}/d\" /etc/crontabs/root >/dev/null 2>&1\n\tsed -i \"/$(echo \"/etc/init.d/${CONFIG}\" | sed 's#\\/#\\\\\\/#g')/d\" /etc/crontabs/root >/dev/null 2>&1\n\tsed -i \"/$(echo \"lua ${APP_PATH}/rule_update.lua log\" | sed 's#\\/#\\\\\\/#g')/d\" /etc/crontabs/root >/dev/null 2>&1\n\tsed -i \"/$(echo \"lua ${APP_PATH}/subscribe.lua start\" | sed 's#\\/#\\\\\\/#g')/d\" /etc/crontabs/root >/dev/null 2>&1\n\n\tpgrep -af \"${CONFIG}/\" | awk '/tasks\\.sh/{print $1}' | xargs kill -9 >/dev/null 2>&1\n\trm -rf /tmp/lock/${CONFIG}_tasks.lock\n}\n\nstart_crontab() {\n\tif [ \"$ENABLED_DEFAULT_ACL\" == 1 ] || [ \"$ENABLED_ACLS\" == 1 ]; then\n\t\tstart_daemon=$(config_t_get global_delay start_daemon 0)\n\t\t[ \"$start_daemon\" = \"1\" ] && $APP_PATH/monitor.sh > /dev/null 2>&1 &\n\tfi\n\n\t[ -f \"/tmp/lock/${CONFIG}_cron.lock\" ] && {\n\t\trm -rf \"/tmp/lock/${CONFIG}_cron.lock\"\n\t\tlog_i18n 0 \"The task is currently running automatically as a scheduled task; no reconfiguration of the scheduled task is required.\"\n\t\treturn\n\t}\n\n\tclean_crontab\n\n\t[ \"$ENABLED\" != 1 ] && {\n\t\t/etc/init.d/cron restart\n\t\treturn\n\t}\n\n\tstop_week_mode=$(config_t_get global_delay stop_week_mode)\n\tstop_time_mode=$(config_t_get global_delay stop_time_mode)\n\tif [ -n \"$stop_week_mode\" ]; then\n\t\tlocal t=\"0 $stop_time_mode * * $stop_week_mode\"\n\t\t[ \"$stop_week_mode\" = \"7\" ] && t=\"0 $stop_time_mode * * *\"\n\t\tif [ \"$stop_week_mode\" = \"8\" ]; then\n\t\t\tupdate_loop=1\n\t\telse\n\t\t\techo \"$t /etc/init.d/$CONFIG stop > /dev/null 2>&1 &\" >>/etc/crontabs/root\n\t\tfi\n\t\tlog_i18n 0 \"Scheduled tasks: Auto stop service.\"\n\tfi\n\n\tstart_week_mode=$(config_t_get global_delay start_week_mode)\n\tstart_time_mode=$(config_t_get global_delay start_time_mode)\n\tif [ -n \"$start_week_mode\" ]; then\n\t\tlocal t=\"0 $start_time_mode * * $start_week_mode\"\n\t\t[ \"$start_week_mode\" = \"7\" ] && t=\"0 $start_time_mode * * *\"\n\t\tif [ \"$start_week_mode\" = \"8\" ]; then\n\t\t\tupdate_loop=1\n\t\telse\n\t\t\techo \"$t /etc/init.d/$CONFIG start > /dev/null 2>&1 &\" >>/etc/crontabs/root\n\t\tfi\n\t\tlog_i18n 0 \"Scheduled tasks: Auto start service.\"\n\tfi\n\n\trestart_week_mode=$(config_t_get global_delay restart_week_mode)\n\trestart_time_mode=$(config_t_get global_delay restart_time_mode)\n\tif [ -n \"$restart_week_mode\" ]; then\n\t\tlocal t=\"0 $restart_time_mode * * $restart_week_mode\"\n\t\t[ \"$restart_week_mode\" = \"7\" ] && t=\"0 $restart_time_mode * * *\"\n\t\tif [ \"$restart_week_mode\" = \"8\" ]; then\n\t\t\tupdate_loop=1\n\t\telse\n\t\t\techo \"$t /etc/init.d/$CONFIG restart > /dev/null 2>&1 &\" >>/etc/crontabs/root\n\t\tfi\n\t\tlog_i18n 0 \"Scheduled tasks: Auto restart service.\"\n\tfi\n\n\tautoupdate=$(config_t_get global_rules auto_update)\n\tweekupdate=$(config_t_get global_rules week_update)\n\tdayupdate=$(config_t_get global_rules time_update)\n\tif [ \"$autoupdate\" = \"1\" ]; then\n\t\tlocal t=\"0 $dayupdate * * $weekupdate\"\n\t\t[ \"$weekupdate\" = \"7\" ] && t=\"0 $dayupdate * * *\"\n\t\tif [ \"$weekupdate\" = \"8\" ]; then\n\t\t\tupdate_loop=1\n\t\telse\n\t\t\techo \"$t lua $APP_PATH/rule_update.lua log all cron > /dev/null 2>&1 &\" >>/etc/crontabs/root\n\t\tfi\n\t\tlog_i18n 0 \"Scheduled tasks: Auto update rules.\"\n\tfi\n\n\tTMP_SUB_PATH=$TMP_PATH/sub_crontabs\n\tmkdir -p $TMP_SUB_PATH\n\tfor item in $(uci show ${CONFIG} | grep \"=subscribe_list\" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do\n\t\tif [ \"$(config_n_get $item auto_update 0)\" = \"1\" ]; then\n\t\t\tcfgid=$(uci show ${CONFIG}.$item | head -n 1 | cut -d '.' -sf 2 | cut -d '=' -sf 1)\n\t\t\tremark=$(config_n_get $item remark)\n\t\t\tweek_update=$(config_n_get $item week_update)\n\t\t\ttime_update=$(config_n_get $item time_update)\n\t\t\techo \"$cfgid\" >> $TMP_SUB_PATH/${week_update}_${time_update}\n\t\t\tlog_i18n 0 \"Scheduled tasks: Auto update [%s] subscription.\" \"${remark}\"\n\t\tfi\n\tdone\n\n\t[ -d \"${TMP_SUB_PATH}\" ] && {\n\t\tfor name in $(ls ${TMP_SUB_PATH}); do\n\t\t\tweek_update=$(echo $name | awk -F '_' '{print $1}')\n\t\t\ttime_update=$(echo $name | awk -F '_' '{print $2}')\n\t\t\tcfgids=$(echo -n $(cat ${TMP_SUB_PATH}/${name}) | sed 's# #,#g')\n\t\t\tlocal t=\"0 $time_update * * $week_update\"\n\t\t\t[ \"$week_update\" = \"7\" ] && t=\"0 $time_update * * *\"\n\t\t\tif [ \"$week_update\" = \"8\" ]; then\n\t\t\t\tupdate_loop=1\n\t\t\telse\n\t\t\t\techo \"$t lua $APP_PATH/subscribe.lua start $cfgids cron > /dev/null 2>&1 &\" >>/etc/crontabs/root\n\t\t\tfi\n\t\tdone\n\t\trm -rf $TMP_SUB_PATH\n\t}\n\n\tif [ \"$ENABLED_DEFAULT_ACL\" == 1 ] || [ \"$ENABLED_ACLS\" == 1 ]; then\n\t\t[ \"$update_loop\" = \"1\" ] && {\n\t\t\t$APP_PATH/tasks.sh > /dev/null 2>&1 &\n\t\t\tlog_i18n 0 \"Auto updates: Starts a cyclical update process.\"\n\t\t}\n\telse\n\t\tlog_i18n 0 \"Running in no proxy mode, it only allows scheduled tasks for starting and stopping services.\"\n\tfi\n\n\t/etc/init.d/cron restart\n}\n\nstop_crontab() {\n\t[ -f \"/tmp/lock/${CONFIG}_cron.lock\" ] && return\n\tclean_crontab\n\t/etc/init.d/cron restart\n\t#log_i18n 0 \"Clear scheduled commands.\"\n}\n\nstart_haproxy() {\n\t[ \"$(config_t_get global_haproxy balancing_enable 0)\" != \"1\" ] && return\n\thaproxy_path=$TMP_PATH/haproxy\n\thaproxy_conf=\"config.cfg\"\n\tlua $APP_PATH/haproxy.lua -path ${haproxy_path} -conf ${haproxy_conf}\n\tln_run 0 \"$(first_type haproxy)\" haproxy \"/dev/null\" -f \"${haproxy_path}/${haproxy_conf}\"\n}\n\nrun_copy_dnsmasq() {\n\tlocal flag listen_port local_dns tun_dns default_dns\n\teval_set_val $@\n\tlocal dnsmasq_conf=$TMP_ACL_PATH/$flag/dnsmasq.conf\n\tlocal dnsmasq_conf_path=$TMP_ACL_PATH/$flag/dnsmasq.d\n\tmkdir -p $dnsmasq_conf_path\n\n\tjson_init\n\tjson_add_string \"LISTEN_PORT\" \"${listen_port}\"\n\tjson_add_string \"DNSMASQ_CONF\" \"${dnsmasq_conf}\"\n\tlua $APP_PATH/helper_dnsmasq.lua copy_instance \"$(json_dump)\"\n\n\tjson_init\n\tjson_add_string \"FLAG\" \"${flag}\"\n\tjson_add_string \"TMP_DNSMASQ_PATH\" \"${dnsmasq_conf_path}\"\n\tjson_add_string \"DNSMASQ_CONF_FILE\" \"${dnsmasq_conf}\"\n\tjson_add_string \"DEFAULT_DNS\" \"${default_dns}\"\n\tjson_add_string \"LOCAL_DNS\" \"${local_dns}\"\n\tjson_add_string \"TUN_DNS\" \"${tun_dns}\"\n\tjson_add_string \"NFTFLAG\" \"${nftflag:-0}\"\n\tjson_add_string \"NO_LOGIC_LOG\" \"${NO_LOGIC_LOG:-0}\"\n\tlua $APP_PATH/helper_dnsmasq.lua add_rule \"$(json_dump)\"\n\n\tln_run 0 \"$(first_type dnsmasq)\" \"dnsmasq_${flag}\" \"/dev/null\" -C $dnsmasq_conf -x $TMP_ACL_PATH/$flag/dnsmasq.pid\n\tset_cache_var \"ACL_${flag}_dns_port\" \"${listen_port}\"\n}\n\nrun_ipset_dns_server() {\n\tif [ -n \"$(first_type chinadns-ng)\" ]; then\n\t\trun_ipset_chinadns_ng $@\n\telse\n\t\trun_ipset_dnsmasq $@\n\tfi\n}\n\nrun_ipset_chinadns_ng() {\n\tlocal listen_port server_dns ipset nftset config_file\n\teval_set_val $@\n\t[ ! -s \"$TMP_ACL_PATH/vpslist\" ] && {\n\t\tnode_servers=$(uci show \"${CONFIG}\" | grep -E \"(.address=|.download_address=)\" | cut -d \"'\" -f 2)\n\t\thosts_foreach \"node_servers\" host_from_url | grep '[a-zA-Z]$' | sort -u | grep -v \"engage.cloudflareclient.com\" > $TMP_ACL_PATH/vpslist\n\t}\n\t\n\t[ -n \"${ipset}\" ] && {\n\t\tset_names=$ipset\n\t\tvps_set_names=\"passwall2_vps,passwall2_vps6\"\n\t}\n\t[ -n \"${nftset}\" ] && {\n\t\tset_names=$(echo ${nftset} | awk -F, '{printf \"%s,%s\", substr($1,3), substr($2,3)}' | sed 's/#/@/g')\n\t\tvps_set_names=\"inet@passwall2@passwall2_vps,inet@passwall2@passwall2_vps6\"\n\t}\n\tcat <<-EOF > $config_file\n\t\tbind-addr 127.0.0.1\n\t\tbind-port ${listen_port}\n\t\tchina-dns ${server_dns}\n\t\ttrust-dns ${server_dns}\n\t\tfilter-qtype 65\n\t\tadd-tagchn-ip ${set_names}\n\t\tdefault-tag chn\n\t\tgroup vpslist\n\t\tgroup-dnl $TMP_ACL_PATH/vpslist\n\t\tgroup-upstream ${server_dns}\n\t\tgroup-ipset ${vps_set_names}\n\tEOF\n\tln_run 0 \"$(first_type chinadns-ng)\" \"chinadns-ng\" \"/dev/null\" -C $config_file -v\n}\n\nrun_ipset_dnsmasq() {\n\tlocal listen_port server_dns ipset nftset cache_size dns_forward_max config_file\n\teval_set_val $@\n\tcat <<-EOF > $config_file\n\t\tport=${listen_port}\n\t\tno-poll\n\t\tno-resolv\n\t\tstrict-order\n\t\tcache-size=${cache_size:-0}\n\t\tdns-forward-max=${dns_forward_max:-1000}\n\tEOF\n\tfor i in $(echo ${server_dns} | sed \"s#,# #g\"); do\n\t\techo \"server=${i}\" >> $config_file\n\tdone\n\t[ -n \"${ipset}\" ] && echo \"ipset=${ipset}\" >> $config_file\n\t[ -n \"${nftset}\" ] && echo \"nftset=${nftset}\" >> $config_file\n\tln_run 0 \"$(first_type dnsmasq)\" \"dnsmasq\" \"/dev/null\" -C $config_file\n}\n\nacl_app() {\n\tlocal items=$(uci show ${CONFIG} | grep \"=acl_rule\" | cut -d '.' -sf 2 | cut -d '=' -sf 1)\n\t[ -n \"$items\" ] && {\n\t\tlocal index=0\n\t\tlocal item\n\t\tlocal redir_port dns_port dnsmasq_port\n\t\tlocal ipt_tmp msg msg2\n\t\tredir_port=11200\n\t\tdns_port=11300\n\t\tdnsmasq_port=${GLOBAL_DNSMASQ_PORT:-11400}\n\t\tfor item in $items; do\n\t\t\tindex=$(expr $index + 1)\n\t\t\tlocal enabled sid remarks sources interface tcp_no_redir_ports udp_no_redir_ports node direct_dns_query_strategy remote_dns_protocol remote_dns remote_dns_doh remote_dns_client_ip remote_dns_detour remote_fakedns remote_dns_query_strategy\n\t\t\tlocal _ip _mac _iprange _ipset _ip_or_mac source_list config_file\n\t\t\tlocal sid=$(uci -q show \"${CONFIG}.${item}\" | grep \"=acl_rule\" | awk -F '=' '{print $1}' | awk -F '.' '{print $2}')\n\t\t\t[ \"$(config_n_get $sid enabled)\" = \"1\" ] || continue\n\t\t\teval $(uci -q show \"${CONFIG}.${item}\" | cut -d'.' -sf 3-)\n\n\t\t\tif [ -n \"${sources}\" ]; then\n\t\t\t\tfor s in $sources; do\n\t\t\t\t\tlocal s2\n\t\t\t\t\tis_iprange=$(lua_api \"iprange(\\\"${s}\\\")\")\n\t\t\t\t\tif [ \"${is_iprange}\" = \"true\" ]; then\n\t\t\t\t\t\ts2=\"iprange:${s}\"\n\t\t\t\t\telif [ -n \"$(echo ${s} | grep '^ipset:')\" ]; then\n\t\t\t\t\t\ts2=\"ipset:${s}\"\n\t\t\t\t\telse\n\t\t\t\t\t\t_ip_or_mac=$(lua_api \"ip_or_mac(\\\"${s}\\\")\")\n\t\t\t\t\t\tif [ \"${_ip_or_mac}\" = \"ip\" ]; then\n\t\t\t\t\t\t\ts2=\"ip:${s}\"\n\t\t\t\t\t\telif [ \"${_ip_or_mac}\" = \"mac\" ]; then\n\t\t\t\t\t\t\ts2=\"mac:${s}\"\n\t\t\t\t\t\tfi\n\t\t\t\t\tfi\n\t\t\t\t\t[ -n \"${s2}\" ] && source_list=\"${source_list}\\n${s2}\"\n\t\t\t\t\tunset s2\n\t\t\t\tdone\n\t\t\telse\n\t\t\t\tsource_list=\"any\"\n\t\t\tfi\n\n\t\t\tlocal acl_path=${TMP_ACL_PATH}/$sid\n\t\t\tmkdir -p ${acl_path}\n\t\t\t[ -n \"${source_list}\" ] && echo -e \"${source_list}\" | sed '/^$/d' > ${acl_path}/source_list\n\n\t\t\tnode=${node:-default}\n\t\t\ttcp_no_redir_ports=${tcp_no_redir_ports:-default}\n\t\t\tudp_no_redir_ports=${udp_no_redir_ports:-default}\n\t\t\t[ \"$tcp_no_redir_ports\" = \"default\" ] && tcp_no_redir_ports=$TCP_NO_REDIR_PORTS\n\t\t\t[ \"$udp_no_redir_ports\" = \"default\" ] && udp_no_redir_ports=$UDP_NO_REDIR_PORTS\n\t\t\tif has_1_65535 \"$tcp_no_redir_ports\" && has_1_65535 \"$udp_no_redir_ports\"; then\n\t\t\t\tunset node\n\t\t\tfi\n\n\t\t\t[ -n \"$node\" ] && {\n\t\t\t\ttcp_proxy_mode=\"global\"\n\t\t\t\tudp_proxy_mode=\"global\"\n\t\t\t\tdirect_dns_query_strategy=${direct_dns_query_strategy:-UseIP}\n\t\t\t\tremote_dns_protocol=${remote_dns_protocol:-tcp}\n\t\t\t\tremote_dns=${remote_dns:-1.1.1.1}\n\t\t\t\tcase \"$remote_dns_protocol\" in\n\t\t\t\t\tdoh|\\\n\t\t\t\t\thttp3)\n\t\t\t\t\t\tremote_dns=${remote_dns_doh:-https://1.1.1.1/dns-query}\n\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\t\tremote_dns_detour=${remote_dns_detour:-remote}\n\t\t\t\tremote_fakedns=${remote_fakedns:-0}\n\t\t\t\tremote_dns_query_strategy=${remote_dns_query_strategy:-UseIPv4}\n\n\t\t\t\tlocal GLOBAL_node=$(get_cache_var \"ACL_GLOBAL_node\")\n\t\t\t\t[ -n \"${GLOBAL_node}\" ] && GLOBAL_redir_port=$(get_cache_var \"ACL_GLOBAL_redir_port\")\n\n\t\t\t\tif [ \"$node\" = \"default\" ]; then\n\t\t\t\t\tif [ -n \"${GLOBAL_node}\" ]; then\n\t\t\t\t\t\tset_cache_var \"ACL_${sid}_node\" \"${GLOBAL_node}\"\n\t\t\t\t\t\tset_cache_var \"ACL_${sid}_redir_port\" \"${GLOBAL_redir_port}\"\n\t\t\t\t\t\tset_cache_var \"ACL_${sid}_dns_port\" \"${GLOBAL_DNSMASQ_PORT}\"\n\t\t\t\t\t\tset_cache_var \"ACL_${sid}_default\" \"1\"\n\t\t\t\t\telse\n\t\t\t\t\t\tlog 1 \"$(i18n \"Global nodes are not enabled, skip [%s].\" \"${remarks}\")\"\n\t\t\t\t\tfi\n\t\t\t\telse\n\t\t\t\t\t[ \"$(config_get_type $node)\" = \"nodes\" ] && {\n\t\t\t\t\t\tif [ -n \"${GLOBAL_node}\" ] && [ \"$node\" = \"${GLOBAL_node}\" ]; then\n\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_node\" \"${GLOBAL_node}\"\n\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_redir_port\" \"${GLOBAL_redir_port}\"\n\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_dns_port\" \"${GLOBAL_DNSMASQ_PORT}\"\n\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_default\" \"1\"\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tredir_port=$(get_new_port $(expr $redir_port + 1))\n\n\t\t\t\t\t\t\tlocal type=$(echo $(config_n_get $node type) | tr 'A-Z' 'a-z')\n\t\t\t\t\t\t\tif [ -n \"${type}\" ]; then\n\t\t\t\t\t\t\t\tconfig_file=$TMP_ACL_PATH/${node}_TCP_UDP_DNS_${redir_port}.json\n\t\t\t\t\t\t\t\tdns_port=$(get_new_port $(expr $dns_port + 1))\n\t\t\t\t\t\t\t\tlocal acl_socks_port=$(get_new_port $(expr $redir_port + $index))\n\t\t\t\t\t\t\t\tlocal run_func\n\t\t\t\t\t\t\t\t[ -n \"${XRAY_BIN}\" ] && run_func=\"run_xray\"\n\t\t\t\t\t\t\t\t[ -n \"${SINGBOX_BIN}\" ] && run_func=\"run_singbox\"\n\t\t\t\t\t\t\t\tif [ \"${type}\" = \"xray\" ] && [ -n \"${XRAY_BIN}\" ]; then\n\t\t\t\t\t\t\t\t\trun_func=\"run_xray\"\n\t\t\t\t\t\t\t\telif [ \"${type}\" = \"sing-box\" ] && [ -n \"${SINGBOX_BIN}\" ]; then\n\t\t\t\t\t\t\t\t\trun_func=\"run_singbox\"\n\t\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\t\t${run_func} flag=acl_$sid node=$node redir_port=$redir_port tcp_proxy_way=${TCP_PROXY_WAY} \\\n\t\t\t\t\t\t\t\t\t\t\tsocks_address=127.0.0.1 socks_port=$acl_socks_port \\\n\t\t\t\t\t\t\t\t\t\t\tdns_listen_port=${dns_port} \\\n\t\t\t\t\t\t\t\t\t\t\tdirect_dns_query_strategy=${direct_dns_query_strategy} \\\n\t\t\t\t\t\t\t\t\t\t\tremote_dns_protocol=${remote_dns_protocol} remote_dns_tcp_server=${remote_dns} remote_dns_udp_server=${remote_dns} remote_dns_doh=\"${remote_dns}\" \\\n\t\t\t\t\t\t\t\t\t\t\tremote_dns_client_ip=${remote_dns_client_ip} remote_dns_detour=${remote_dns_detour} remote_fakedns=${remote_fakedns} remote_dns_query_strategy=${remote_dns_query_strategy} \\\n\t\t\t\t\t\t\t\t\t\t\tconfig_file=${config_file}\n\t\t\t\t\t\t\t\tlocal status=$?\n\t\t\t\t\t\t\t\tif [ \"$status\" != 0 ]; then\n\t\t\t\t\t\t\t\t\tlog_i18n 2 \"[%s] process %s error, skip this transparent proxy!\" \"${remarks}\" \"${config_file}\"\n\t\t\t\t\t\t\t\t\tcat ${_error_log_file} >> ${LOG_FILE}\n\t\t\t\t\t\t\t\t\tunset _error_log_file\n\t\t\t\t\t\t\t\t\tcontinue\n\t\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\tfi\n\t\t\t\t\t\t\tdnsmasq_port=$(get_new_port $(expr $dnsmasq_port + 1))\n\t\t\t\t\t\t\trun_copy_dnsmasq flag=\"$sid\" listen_port=$dnsmasq_port local_dns=\"${LOCAL_DNS:-${AUTO_DNS}}\" tun_dns=\"127.0.0.1#${dns_port}\" default_dns=\"${AUTO_DNS}\"\n\t\t\t\t\t\t\t#dhcp.leases to hostsMore actions\n\t\t\t\t\t\t\t$APP_PATH/lease2hosts.sh > /dev/null 2>&1 &\n\n\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_node\" \"$node\"\n\t\t\t\t\t\t\tset_cache_var \"ACL_${sid}_redir_port\" \"$redir_port\"\n\t\t\t\t\t\tfi\n\t\t\t\t\t}\n\t\t\t\tfi\n\t\t\t}\n\t\t\tunset enabled sid remarks sources interface tcp_no_redir_ports udp_no_redir_ports node direct_dns_query_strategy remote_dns_protocol remote_dns remote_dns_doh remote_dns_client_ip remote_dns_detour remote_fakedns remote_dns_query_strategy \n\t\t\tunset _ip _mac _iprange _ipset _ip_or_mac source_list config_file\n\t\tdone\n\t\tunset redir_port dns_port dnsmasq_port\n\t}\n}\n\nstart() {\n\tpgrep -f /tmp/etc/passwall2/bin > /dev/null 2>&1 && {\n\t\t#log_i18n 0 \"The program has started. Please stop it and then restart it!\"\n\t\tstop\n\t}\n\tmkdir -p /tmp/etc /tmp/log $TMP_PATH $TMP_BIN_PATH $TMP_SCRIPT_FUNC_PATH $TMP_ROUTE_PATH $TMP_ACL_PATH $TMP_PATH2\n\tget_config\n\texport V2RAY_LOCATION_ASSET=$(config_t_get global_rules v2ray_location_asset \"/usr/share/v2ray/\")\n\texport XRAY_LOCATION_ASSET=$V2RAY_LOCATION_ASSET\n\texport ENABLE_DEPRECATED_GEOSITE=true\n\texport ENABLE_DEPRECATED_GEOIP=true\n\texport SS_SYSTEM_DNS_RESOLVER_FORCE_BUILTIN=1\n\tulimit -n 65535\n\tstart_haproxy\n\tstart_socks\n\tnftflag=0\n\tUSE_TABLES=\"\"\n\tcheck_run_environment\n\tif [ \"$ENABLED_DEFAULT_ACL\" == 1 ] || [ \"$ENABLED_ACLS\" == 1 ]; then\n\t\t[ \"$(uci -q get dhcp.@dnsmasq[0].dns_redirect)\" == \"1\" ] && {\n\t\t\tuci -q set ${CONFIG}.@global[0].dnsmasq_dns_redirect='1'\n\t\t\tuci -q commit ${CONFIG}\n\t\t\tuci -q set dhcp.@dnsmasq[0].dns_redirect='0'\n\t\t\tuci -q commit dhcp\n\n\t\t\tjson_init\n\t\t\tjson_add_string \"LOG\" \"0\"\n\t\t\tlua $APP_PATH/helper_dnsmasq.lua restart \"$(json_dump)\"\n\t\t}\n\tfi\n\tmkdir -p ${GLOBAL_ACL_PATH}\n\t[ \"$ENABLED_DEFAULT_ACL\" == 1 ] && run_global\n\trun_front_dns\n\trun_global_dnsmasq\n\t[ -n \"$USE_TABLES\" ] && source $APP_PATH/${USE_TABLES}.sh start\n\tset_cache_var \"USE_TABLES\" \"$USE_TABLES\"\n\tif [ \"$ENABLED_DEFAULT_ACL\" == 1 ] || [ \"$ENABLED_ACLS\" == 1 ]; then\n\t\tbridge_nf_ipt=$(sysctl -e -n net.bridge.bridge-nf-call-iptables)\n\t\tset_cache_var \"bak_bridge_nf_ipt\" \"$bridge_nf_ipt\"\n\t\tsysctl -w net.bridge.bridge-nf-call-iptables=0 >/dev/null 2>&1\n\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\tbridge_nf_ip6t=$(sysctl -e -n net.bridge.bridge-nf-call-ip6tables)\n\t\t\tset_cache_var \"bak_bridge_nf_ip6t\" \"$bridge_nf_ip6t\"\n\t\t\tsysctl -w net.bridge.bridge-nf-call-ip6tables=0 >/dev/null 2>&1\n\t\t}\n\tfi\n\trun_process_queue\n\tstart_crontab\n\tlog_i18n 0 \"Running complete!\"\n\techolog \"\\n\"\n\n\t[ \"$ENABLED\" = 1 ] && [ \"$1\" = \"boot\" ] && {\n\t\tlocal cfgids item\n\t\tfor item in $(uci show ${CONFIG} | grep \"=subscribe_list\" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do\n\t\t\tif [ \"$(config_n_get \"$item\" boot_update 0)\" = \"1\" ]; then\n\t\t\t\tlocal cfgid=$(uci show ${CONFIG}.$item | head -n 1 | cut -d '.' -sf 2 | cut -d '=' -sf 1)\n\t\t\t\tcfgids=\"${cfgids:+$cfgids,}$cfgid\"\n\t\t\tfi\n\t\tdone\n\t\t[ -n \"$cfgids\" ] && {\n\t\t\tsleep 5\n\t\t\tlua $APP_PATH/subscribe.lua start $cfgids cron > /dev/null 2>&1 &\n\t\t}\n\t}\n}\n\nstop() {\n\tclean_log\n\teval_cache_var\n\t[ -n \"$USE_TABLES\" ] && source $APP_PATH/${USE_TABLES}.sh stop\n\tdelete_ip2route\n\t# Kill the SS plugin process\n\t# kill_all xray-plugin v2ray-plugin obfs-local shadow-tls\n\tlocal pid_file pid\n\tfind \"$TMP_PATH\" -type f -name '*_plugin.pid' 2>/dev/null | while read -r pid_file; do\n\t\tread -r pid < \"$pid_file\"\n\t\tif [ -n \"$pid\" ]; then\n\t\t\tkill -9 \"$pid\" >/dev/null 2>&1\n\t\tfi\n\tdone\n\tpgrep -f \"sleep.*(6s|9s|58s)\" | xargs kill -9 >/dev/null 2>&1\n\tpgrep -af \"${CONFIG}/\" | awk '! /app\\.sh|subscribe\\.lua|rule_update\\.lua|tasks\\.sh|server_app\\.lua|ujail/{print $1}' | xargs kill -9 >/dev/null 2>&1\n\tunset V2RAY_LOCATION_ASSET\n\tunset XRAY_LOCATION_ASSET\n\tunset SS_SYSTEM_DNS_RESOLVER_FORCE_BUILTIN\n\tstop_crontab\n\trm -rf $GLOBAL_DNSMASQ_CONF\n\trm -rf $GLOBAL_DNSMASQ_CONF_PATH\n\t[ \"1\" = \"1\" ] && {\n\t\t#restore logic\n\t\tbak_dnsmasq_dns_redirect=$(config_t_get global dnsmasq_dns_redirect)\n\t\t[ -n \"${bak_dnsmasq_dns_redirect}\" ] && {\n\t\t\tuci -q set dhcp.@dnsmasq[0].dns_redirect=\"${bak_dnsmasq_dns_redirect}\"\n\t\t\tuci -q commit dhcp\n\t\t\tuci -q delete ${CONFIG}.@global[0].dnsmasq_dns_redirect\n\t\t\tuci -q commit ${CONFIG}\n\t\t}\n\t\tif [ -z \"${ACL_default_dns_port}\" ] || [ -n \"${bak_dnsmasq_dns_redirect}\" ]; then\n\t\t\tuci -q del_list dhcp.@dnsmasq[0].addnmount=\"${GLOBAL_DNSMASQ_CONF_PATH}\"\n\t\t\tuci -q commit dhcp\n\n\t\t\tjson_init\n\t\t\tjson_add_string \"LOG\" \"0\"\n\t\t\tlua $APP_PATH/helper_dnsmasq.lua restart \"$(json_dump)\"\n\t\tfi\n\t\t[ -n \"${bak_bridge_nf_ipt}\" ] && sysctl -w net.bridge.bridge-nf-call-iptables=${bak_bridge_nf_ipt} >/dev/null 2>&1\n\t\t[ -n \"${bak_bridge_nf_ip6t}\" ] && sysctl -w net.bridge.bridge-nf-call-ip6tables=${bak_bridge_nf_ip6t} >/dev/null 2>&1\n\t}\n\trm -rf $TMP_PATH\n\trm -rf /tmp/lock/${CONFIG}_socks_auto_switch*\n\trm -rf /tmp/lock/${CONFIG}_lease2hosts*\n\tlog_i18n 0 \"Clearing and closing related programs and cache complete.\"\n\texit 0\n}\n\nget_direct_dns() {\n\tRESOLVFILE=/tmp/resolv.conf.d/resolv.conf.auto\n\t[ -f \"${RESOLVFILE}\" ] && [ -s \"${RESOLVFILE}\" ] || RESOLVFILE=/tmp/resolv.conf.auto\n\n\tISP_DNS=$(cat $RESOLVFILE 2>/dev/null | grep -E -o \"[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+\" | grep -v -E '^(0\\.0\\.0\\.0|127\\.0\\.0\\.1)$' | awk '!seen[$0]++')\n\tISP_DNS6=$(cat $RESOLVFILE 2>/dev/null | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | awk -F % '{print $1}' | awk -F \" \" '{print $2}' | grep -v -Fx ::1 | grep -v -Fx :: | awk '!seen[$0]++')\n\n\tDNSMASQ_UPSTREAM_DNS=$(uci show dhcp.@dnsmasq[0] | grep \"\\.server=\" | awk -F '=' '{print $2}' | sed \"s/'//g\" | tr ' ' '\\n' | grep -v \"\\/\" | awk '{if($1 ~ /#/) {sub(/#/, \"#\", $1); print $1} else {print $1\"#53\"}}' | head -2 | sed ':label;N;s/\\n/,/;b label')\n\tDEFAULT_DNS=\"${DNSMASQ_UPSTREAM_DNS}\"\n\t[ -z \"${DEFAULT_DNS}\" ] && DEFAULT_DNS=$(echo -n $ISP_DNS | tr ' ' '\\n' | head -2 | tr '\\n' ',' | sed 's/,$//')\n\tAUTO_DNS=${DEFAULT_DNS:-119.29.29.29}\n\n\tlocal AUTO_DNS_1=$(echo ${AUTO_DNS} | awk -F ',' '{print $1}')\n\tlocal AUTO_DNS_2=$(echo ${AUTO_DNS} | awk -F ',' '{print $2}')\n\tlocal AUTO_DNS_ADDRESS=$(echo ${AUTO_DNS_1} | awk -F '#' '{print $1}')\n\tlocal AUTO_DNS_PORT=$(echo ${AUTO_DNS_1} | awk -F '#' '{print $2}')\n\tDIRECT_DNS_UDP_SERVER=${AUTO_DNS_ADDRESS}\n\tDIRECT_DNS_UDP_PORT=${AUTO_DNS_PORT}\n}\n\nget_config() {\n\tENABLED_DEFAULT_ACL=0\n\tENABLED=$(config_t_get global enabled 0)\n\tNODE=$(config_t_get global node)\n\t[ \"$ENABLED\" == 1 ] && {\n\t\t[ -n \"$NODE\" ] && [ \"$(config_get_type $NODE)\" == \"nodes\" ] && ENABLED_DEFAULT_ACL=1\n\t}\n\tENABLED_ACLS=$(config_t_get global acl_enable 0)\n\t[ \"$ENABLED_ACLS\" == 1 ] && {\n\t\t[ \"$(uci show ${CONFIG} | grep \"@acl_rule\" | grep \"enabled='1'\" | wc -l)\" == 0 ] && ENABLED_ACLS=0\n\t}\n\tSOCKS_ENABLED=$(config_t_get global socks_enabled 0)\n\tREDIR_PORT=$(echo $(get_new_port 1041 tcp,udp))\n\tTCP_PROXY_WAY=$(config_t_get global_forwarding tcp_proxy_way redirect)\n\tTCP_NO_REDIR_PORTS=$(config_t_get global_forwarding tcp_no_redir_ports 'disable')\n\tUDP_NO_REDIR_PORTS=$(config_t_get global_forwarding udp_no_redir_ports 'disable')\n\tTCP_REDIR_PORTS=$(config_t_get global_forwarding tcp_redir_ports '22,25,53,143,465,587,853,993,995,80,443')\n\tUDP_REDIR_PORTS=$(config_t_get global_forwarding udp_redir_ports '1:65535')\n\tPROXY_IPV6=$(config_t_get global_forwarding ipv6_tproxy 0)\n\tTCP_PROXY_MODE=\"global\"\n\tUDP_PROXY_MODE=\"global\"\n\tLOCALHOST_PROXY=$(config_t_get global localhost_proxy '1')\n\tCLIENT_PROXY=$(config_t_get global client_proxy '1')\n\tDIRECT_DNS_QUERY_STRATEGY=$(config_t_get global direct_dns_query_strategy UseIP)\n\tREMOTE_DNS_PROTOCOL=$(config_t_get global remote_dns_protocol tcp)\n\tREMOTE_DNS_DETOUR=$(config_t_get global remote_dns_detour remote)\n\tREMOTE_DNS=$(config_t_get global remote_dns 1.1.1.1:53 | sed 's/#/:/g' | sed -E 's/\\:([^:]+)$/#\\1/g')\n\tREMOTE_FAKEDNS=$(config_t_get global remote_fakedns '0')\n\tREMOTE_DNS_QUERY_STRATEGY=$(config_t_get global remote_dns_query_strategy UseIPv4)\n\tDNS_CACHE=$(config_t_get global dns_cache 1)\n\tDNS_REDIRECT=$(config_t_get global dns_redirect 1)\n\n\tget_direct_dns\n\n\tDEFAULT_DNSMASQ_CONF_DIR=/tmp/dnsmasq.d\n\tDNSMASQ_CONF_DIR=${DEFAULT_DNSMASQ_CONF_DIR}\n\tDEFAULT_DNSMASQ_CFGID=\"$(uci -q show \"dhcp.@dnsmasq[0]\" | awk 'NR==1 {split($0, conf, /[.=]/); print conf[2]}')\"\n\tif [ -f \"/tmp/etc/dnsmasq.conf.$DEFAULT_DNSMASQ_CFGID\" ]; then\n\t\tDNSMASQ_CONF_DIR=\"$(awk -F '=' '/^conf-dir=/ {print $2}' \"/tmp/etc/dnsmasq.conf.$DEFAULT_DNSMASQ_CFGID\")\"\n\t\tif [ -n \"$DNSMASQ_CONF_DIR\" ]; then\n\t\t\tDNSMASQ_CONF_DIR=${DNSMASQ_CONF_DIR%*/}\n\t\telse\n\t\t\tDNSMASQ_CONF_DIR=${DEFAULT_DNSMASQ_CONF_DIR}\n\t\tfi\n\tfi\n\tset_cache_var GLOBAL_DNSMASQ_CONF ${DNSMASQ_CONF_DIR}/dnsmasq-${CONFIG}.conf\n\tset_cache_var GLOBAL_DNSMASQ_CONF_PATH ${GLOBAL_ACL_PATH}/dnsmasq.d\n\n\tQUEUE_RUN=1\n}\n\narg1=$1\nshift\ncase $arg1 in\nrun_socks)\n\tget_direct_dns\n\tQUEUE_RUN=0\n\trun_socks $@\n\t;;\nsocks_node_switch)\n\tget_direct_dns\n\tQUEUE_RUN=0\n\tsocks_node_switch $@\n\t;;\nstart)\n\tstart $@\n\t;;\nstop)\n\tstop\n\t;;\nesac\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/passwall2/domains_excluded",
    "content": "courier.push.apple.com\nrbsxbxp-mim.vivox.com\nrbsxbxp.www.vivox.com\nrbsxbxp-ws.vivox.com\nrbspsxp.www.vivox.com\nrbspsxp-mim.vivox.com\nrbspsxp-ws.vivox.com\nrbswxp.www.vivox.com\nrbswxp-mim.vivox.com\ndisp-rbspsp-5-1.vivox.com\ndisp-rbsxbp-5-1.vivox.com\nproxy.rbsxbp.vivox.com\nproxy.rbspsp.vivox.com\nproxy.rbswp.vivox.com\nrbswp.vivox.com\nrbsxbp.vivox.com\nrbspsp.vivox.com\nrbspsp.www.vivox.com\nrbswp.www.vivox.com\nrbsxbp.www.vivox.com\nrbsxbxp.vivox.com\nrbspsxp.vivox.com\nrbswxp.vivox.com\nMijia Cloud\ndlg.io.mi.com\nmarscdn.c2c.wechat.com\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/passwall2/haproxy.lua",
    "content": "#!/usr/bin/lua\n\nlocal api = require (\"luci.passwall2.api\")\nlocal appname = api.appname\nlocal fs = api.fs\nlocal jsonc = api.jsonc\nlocal uci = api.uci\nlocal sys = api.sys\n\nlocal log = api.log\n\nfunction get_ip_port_from(str)\n\tlocal result_port = sys.exec(\"echo -n \" .. str .. \" | sed -n 's/^.*[:#]\\\\([0-9]*\\\\)$/\\\\1/p'\")\n\tlocal result_ip = sys.exec(string.format(\"__host=%s;__varport=%s;\", str, result_port) .. \"echo -n ${__host%%${__varport:+[:#]${__varport}*}}\")\n\treturn result_ip, result_port\nend\n\nlocal var = api.get_args(arg)\nlocal haproxy_path = var[\"-path\"]\nlocal haproxy_conf = var[\"-conf\"]\nlocal haproxy_dns = \"127.0.0.1\"\n\nlocal cpu_thread = sys.exec('echo -n $(cat /proc/cpuinfo | grep \"processor\" | wc -l)') or \"1\"\nlocal health_check_type = uci:get(appname, \"@global_haproxy[0]\", \"health_check_type\") or \"tcp\"\nlocal health_check_inter = uci:get(appname, \"@global_haproxy[0]\", \"health_check_inter\") or \"20\"\nlocal balancingStrategy = uci:get(appname, \"@global_haproxy[0]\", \"balancingStrategy\") or \"roundrobin\"\nlocal console_port = uci:get(appname, \"@global_haproxy[0]\", \"console_port\")\nlocal bind_local = uci:get(appname, \"@global_haproxy[0]\", \"bind_local\") or \"0\"\nlocal bind_address = \"0.0.0.0\"\nif bind_local == \"1\" then bind_address = \"127.0.0.1\" end\n\nlog(0, \"HAProxy: \")\nlog(1, api.i18n.translatef(\"Console Port: %s\", console_port))\nfs.mkdir(haproxy_path)\nlocal haproxy_file = haproxy_path .. \"/\" .. haproxy_conf\n\nlocal f_out = io.open(haproxy_file, \"a\")\n\nlocal haproxy_config = [[\nglobal\n\tdaemon\n\tlog 127.0.0.1 local2\n\tmaxconn 60000\n\tstats socket {{path}}/haproxy.sock\n\tnbthread {{nbthread}}\n\texternal-check\n\tinsecure-fork-wanted\n\tspread-checks 50\n\ttune.max-checks-per-thread 5\n\ndefaults\n\tmode tcp\n\tlog global\n\toption tcplog\n\toption dontlognull\n\toption http-server-close\n\t#option forwardfor except 127.0.0.0/8\n\toption redispatch\n\tretries 2\n\ttimeout http-request 10s\n\ttimeout queue 1m\n\ttimeout connect 10s\n\ttimeout client 1m\n\ttimeout server 1m\n\ttimeout http-keep-alive 10s\n\ttimeout check 10s\n\tmaxconn 3000\n\nresolvers mydns\n\tresolve_retries 1\n\ttimeout resolve 5s\n\thold valid 600s\n{{dns}}\n]]\n\nhaproxy_config = haproxy_config:gsub(\"{{path}}\",  haproxy_path)\nhaproxy_config = haproxy_config:gsub(\"{{nbthread}}\",  cpu_thread)\n\nlocal mydns = \"\"\nlocal index = 0\nstring.gsub(haproxy_dns, '[^' .. \",\" .. ']+', function(w)\n\tindex = index + 1\n\tlocal s = w:gsub(\"#\", \":\")\n\tif not s:find(\":\") then\n\t\ts = s .. \":53\"\n\tend\n\tmydns = mydns .. (index > 1 and \"\\n\" or \"\") .. \"\t\" .. string.format(\"nameserver dns%s %s\", index, s)\nend)\nhaproxy_config = haproxy_config:gsub(\"{{dns}}\",  mydns)\n\nf_out:write(haproxy_config)\n\nlocal listens = {}\n\nuci:foreach(appname, \"haproxy_config\", function(t)\n\tif t.enabled == \"1\" then\n\t\tlocal server_remark\n\t\tlocal server_address\n\t\tlocal server_port\n\t\tlocal lbss = t.lbss\n\t\tlocal listen_port = tonumber(t.haproxy_port) or 0\n\t\tlocal server_node = uci:get_all(appname, lbss)\n\t\tlocal hop = (health_check_type == \"passwall_logic\") and (server_node.hysteria_hop or server_node.hysteria2_hop) or nil\n\t\thop = hop and hop:gsub(\":\", \"-\") or nil\n\t\tif server_node and server_node.address and (server_node.port or hop) then\n\t\t\tserver_remark = server_node.address .. \":\" .. (server_node.port or hop)\n\t\t\tserver_address = server_node.address\n\t\t\tserver_port = server_node.port or hop\n\t\t\tt.origin_address = server_address\n\t\t\tt.origin_port = server_port\n\t\t\tif health_check_type == \"passwall_logic\" then\n\t\t\t\tif server_node.type ~= \"Socks\" then\n\t\t\t\t\tlocal relay_port = server_node.port\n\t\t\t\t\tlocal new_port = api.get_new_port()\n\t\t\t\t\tlocal config_file = string.format(\"haproxy_%s_%s.json\", t[\".name\"], new_port)\n\t\t\t\t\tsys.call(string.format('/usr/share/%s/app.sh run_socks \"%s\"> /dev/null',\n\t\t\t\t\t\tappname,\n\t\t\t\t\t\tstring.format(\"flag=%s node=%s bind=%s socks_port=%s config_file=%s\",\n\t\t\t\t\t\t\tnew_port, --flag\n\t\t\t\t\t\t\tserver_node[\".name\"], --node\n\t\t\t\t\t\t\t\"127.0.0.1\", --bind\n\t\t\t\t\t\t\tnew_port, --socks port\n\t\t\t\t\t\t\tconfig_file --config file\n\t\t\t\t\t\t\t)\n\t\t\t\t\t\t)\n\t\t\t\t\t)\n\t\t\t\t\tserver_address = \"127.0.0.1\"\n\t\t\t\t\tserver_port = new_port\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tserver_address, server_port = get_ip_port_from(lbss)\n\t\t\tserver_remark = server_address .. \":\" .. server_port\n\t\t\tt.origin_address = server_address\n\t\t\tt.origin_port = server_port\n\t\tend\n\t\tif server_address and server_port and listen_port > 0 then\n\t\t\tif not listens[listen_port] then\n\t\t\t\tlistens[listen_port] = {}\n\t\t\tend\n\t\t\tt.server_remark = server_remark\n\t\t\tt.server_address = server_address\n\t\t\tt.server_port = server_port\n\t\t\ttable.insert(listens[listen_port], t)\n\t\telse\n\t\t\tlog(1, api.i18n.translate(\"Discard one obviously invalid node.\"))\n\t\tend\n\tend\nend)\n\nlocal inter = tonumber((health_check_inter or \"20\"):match(\"^%d+\"))\ninter = (inter and inter >= 20) and inter or 20\nlocal inter_arg = \"inter \" .. inter .. \"s fastinter \" .. inter / 2 .. \"s downinter \" .. inter * 1.5 .. \"s\"\n\nlocal sortTable = {}\nfor i in pairs(listens) do\n\tif i ~= nil then\n\t\ttable.insert(sortTable, i)\n\tend\nend\ntable.sort(sortTable, function(a,b) return (a < b) end)\n\nfor i, port in pairs(sortTable) do\n\tlog(1, api.i18n.translatef(\"Entrance %s:%s\", bind_address, port))\n\n\tf_out:write(\"\\n\" .. string.format([[\nlisten %s\n\tbind %s:%s\n\tmode tcp\n\tbalance %s\n]], port, bind_address, port, balancingStrategy))\n\n\tif health_check_type == \"passwall_logic\" then\n\t\tf_out:write(string.format([[\n\toption external-check\n\texternal-check command \"/usr/share/%s/haproxy_check.sh\"\n]], appname))\n\tend\n\n\tlocal count_M, count_B = 1, 1\n\tfor i, o in ipairs(listens[port]) do\n\t\tlocal remark = o.server_remark or \"\"\n\t\t-- To prevent duplicate names from causing the program to fail to run.\n\t\tif tostring(o.backup) ~= \"1\" then\n\t\t\tremark = \"M\" .. count_M .. \"-\" .. remark\n\t\t\tcount_M = count_M + 1\n\t\telse\n\t\t\tremark = \"B\" .. count_B .. \"-\" .. remark\n\t\t\tcount_B = count_B + 1\n\t\tend\n\t\tlocal server = o.server_address .. \":\" .. o.server_port\n\t\tlocal server_conf = \"server {{remark}} {{server}} weight {{weight}} {{resolvers}} check {{inter_arg}} rise 2 fall 2 {{backup}}\"\n\t\tserver_conf = server_conf:gsub(\"{{remark}}\", remark)\n\t\tserver_conf = server_conf:gsub(\"{{server}}\", server)\n\t\tserver_conf = server_conf:gsub(\"{{weight}}\", o.lbweight)\n\t\tlocal resolvers = \"resolvers mydns\"\n\t\tif api.is_ip(o.server_address) then\n\t\t\tresolvers = \"\"\n\t\tend\n\t\tserver_conf = server_conf:gsub(\"{{resolvers}}\", resolvers)\n\t\tserver_conf = server_conf:gsub(\"{{inter_arg}}\", inter_arg)\n\t\tserver_conf = server_conf:gsub(\"{{backup}}\", tostring(o.backup) == \"1\" and \"backup\" or \"\")\n\n\t\tf_out:write(\"\t\" .. api.trim(server_conf) .. \"\\n\")\n\n\t\tif o.export ~= \"0\" then\n\t\t\tsys.call(string.format(\". /usr/share/%s/utils.sh ; add_ip2route %s %s\", appname, o.origin_address, o.export))\n\t\tend\n\n\t\tlog(2, string.format(api.i18n.translatef(\"Node: %s:%s, Weight: %s\", o.origin_address, o.origin_port, o.lbweight)))\n\tend\nend\n\n-- Console config\nlocal console_user = uci:get(appname, \"@global_haproxy[0]\", \"console_user\")\nlocal console_password = uci:get(appname, \"@global_haproxy[0]\", \"console_password\")\nlocal str = [[\nlisten console\n\tbind 0.0.0.0:%s\n\tmode http\n\tstats refresh 30s\n\tstats uri /\n\tstats admin if TRUE\n\t%s\n]]\nf_out:write(\"\\n\" .. string.format(str, console_port, (console_user and console_user ~= \"\" and console_password and console_password ~= \"\") and \"stats auth \" .. console_user .. \":\" .. console_password or \"\"))\n\nf_out:close()\n\n-- Built-in health check URL\nif health_check_type == \"passwall_logic\" then\n\tlocal probeUrl = uci:get(appname, \"@global_haproxy[0]\", \"health_probe_url\") or \"https://www.google.com/generate_204\"\n\tlocal f_url = io.open(haproxy_path .. \"/Probe_URL\", \"w\")\n\tf_url:write(probeUrl)\n\tf_url:close()\nend\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/passwall2/haproxy_check.sh",
    "content": "#!/bin/sh\n\nexport PATH=/usr/sbin:/usr/bin:/sbin:/bin:/root/bin\nCONFIG=passwall2\n\nlisten_address=$1\nlisten_port=$2\nserver_address=$3\nserver_port=$4\n\npgrep -af \"${CONFIG}/\" | grep -E 'app\\.sh.*(start|stop)|nftables\\.sh|iptables\\.sh|subscribe\\.lua' >/dev/null && {\n\texit 0\n}\n\nprobe_file=\"/tmp/etc/${CONFIG}/haproxy/Probe_URL\"\nprobeUrl=\"https://www.google.com/generate_204\"\nif [ -f \"$probe_file\" ]; then\n\tfirstLine=$(head -n 1 \"$probe_file\" | tr -d ' \\t\\n')\n\t[ -n \"$firstLine\" ] && probeUrl=\"$firstLine\"\nfi\n\nextra_params=\"-x socks5h://${server_address}:${server_port}\"\nif /usr/bin/curl --help all | grep -q \"\\-\\-retry-all-errors\"; then\n\textra_params=\"${extra_params} --retry-all-errors\"\nfi\n\nstatus=$(/usr/bin/curl -I -o /dev/null -skL ${extra_params} --connect-timeout 3 --retry 1 --max-time 6 -w \"%{http_code}\" \"${probeUrl}\")\n\ncase \"$status\" in\n\t200|204)\n\t\texit 0\n\t;;\n\t*)\n\t\texit 1\n\t;;\nesac\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/passwall2/helper_dnsmasq.lua",
    "content": "local api = require \"luci.passwall2.api\"\r\nlocal appname = \"passwall2\"\r\nlocal uci = api.uci\r\nlocal sys = api.sys\r\nlocal jsonc = api.jsonc\r\nlocal fs = api.fs\r\nlocal datatypes = api.datatypes\r\nlocal TMP = {}\r\n\r\nlocal function tinsert(table_name, val)\r\n\tif table_name and type(table_name) == \"table\" then\r\n\t\tif not TMP[table_name] then\r\n\t\t\tTMP[table_name] = {}\r\n\t\tend\r\n\t\tif TMP[table_name][val] then\r\n\t\t\treturn false\r\n\t\tend\r\n\t\ttable.insert(table_name, val)\r\n\t\tTMP[table_name][val] = true\r\n\t\treturn true\r\n\tend\r\n\treturn false\r\nend\r\n\r\nlocal function backup_servers()\r\n\tlocal DNSMASQ_DNS = uci:get(\"dhcp\", \"@dnsmasq[0]\", \"server\")\r\n\tif DNSMASQ_DNS and #DNSMASQ_DNS > 0 then\r\n\t\tuci:set(appname, \"@global[0]\", \"dnsmasq_servers\", DNSMASQ_DNS)\r\n\t\tapi.uci_save(uci, appname, true)\r\n\tend\r\nend\r\n\r\nlocal function restore_servers()\r\n\tlocal dns_table = {}\r\n\tlocal DNSMASQ_DNS = uci:get(\"dhcp\", \"@dnsmasq[0]\", \"server\")\r\n\tif DNSMASQ_DNS and #DNSMASQ_DNS > 0 then\r\n\t\tfor k, v in ipairs(DNSMASQ_DNS) do\r\n\t\t\ttinsert(dns_table, v)\r\n\t\tend\r\n\tend\r\n\tlocal OLD_SERVER = uci:get(appname, \"@global[0]\", \"dnsmasq_servers\")\r\n\tif OLD_SERVER and #OLD_SERVER > 0 then\r\n\t\tfor k, v in ipairs(OLD_SERVER) do\r\n\t\t\ttinsert(dns_table, v)\r\n\t\tend\r\n\t\tuci:delete(appname, \"@global[0]\", \"dnsmasq_servers\")\r\n\t\tapi.uci_save(uci, appname, true)\r\n\tend\r\n\tif dns_table and #dns_table > 0 then\r\n\t\tuci:set_list(\"dhcp\", \"@dnsmasq[0]\", \"server\", dns_table)\r\n\t\tapi.uci_save(uci, \"dhcp\", true)\r\n\tend\r\nend\r\n\r\nfunction stretch()\r\n\tlocal dnsmasq_server = uci:get(\"dhcp\", \"@dnsmasq[0]\", \"server\")\r\n\tlocal dnsmasq_noresolv = uci:get(\"dhcp\", \"@dnsmasq[0]\", \"noresolv\")\r\n\tlocal _flag\r\n\tif dnsmasq_server and #dnsmasq_server > 0 then\r\n\t\tfor k, v in ipairs(dnsmasq_server) do\r\n\t\t\tif not v:find(\"/\") then\r\n\t\t\t\t_flag = true\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\n\tif not _flag and dnsmasq_noresolv == \"1\" then\r\n\t\tuci:delete(\"dhcp\", \"@dnsmasq[0]\", \"noresolv\")\r\n\t\tlocal RESOLVFILE = \"/tmp/resolv.conf.d/resolv.conf.auto\"\r\n\t\tlocal file = io.open(RESOLVFILE, \"r\")\r\n\t\tif not file then\r\n\t\t\tRESOLVFILE = \"/tmp/resolv.conf.auto\"\r\n\t\telse\r\n\t\t\tlocal size = file:seek(\"end\")\r\n\t\t\tfile:close()\r\n\t\t\tif size == 0 then\r\n\t\t\t\tRESOLVFILE = \"/tmp/resolv.conf.auto\"\r\n\t\t\tend\r\n\t\tend\r\n\t\tuci:set(\"dhcp\", \"@dnsmasq[0]\", \"resolvfile\", RESOLVFILE)\r\n\t\tapi.uci_save(uci, \"dhcp\", true)\r\n\tend\r\nend\r\n\r\nfunction restart(var)\r\n\tlocal LOG = var[\"LOG\"]\r\n\tsys.call(\"/etc/init.d/dnsmasq restart >/dev/null 2>&1\")\r\n\tif LOG == \"1\" then\r\n\t\tapi.log(0, api.i18n.translate(\"Restart dnsmasq service.\"))\r\n\tend\r\nend\r\n\r\nfunction logic_restart(var)\r\n\tlocal LOG = var[\"LOG\"]\r\n\tlocal DEFAULT_DNS = api.get_cache_var(\"DEFAULT_DNS\")\r\n\tif DEFAULT_DNS then\r\n\t\tbackup_servers()\r\n\t\t--sys.call(\"sed -i '/list server/d' /etc/config/dhcp >/dev/null 2>&1\")\r\n\t\tlocal dns_table = {}\r\n\t\tlocal dnsmasq_server = uci:get(\"dhcp\", \"@dnsmasq[0]\", \"server\")\r\n\t\tif dnsmasq_server and #dnsmasq_server > 0 then\r\n\t\t\tfor k, v in ipairs(dnsmasq_server) do\r\n\t\t\t\tif v:find(\"/\") then\r\n\t\t\t\t\ttinsert(dns_table, v)\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\t\tuci:set_list(\"dhcp\", \"@dnsmasq[0]\", \"server\", dns_table)\r\n\t\t\tapi.uci_save(uci, \"dhcp\", true)\r\n\t\tend\r\n\t\tsys.call(\"/etc/init.d/dnsmasq restart >/dev/null 2>&1\")\r\n\t\trestore_servers()\r\n\telse\r\n\t\tsys.call(\"/etc/init.d/dnsmasq restart >/dev/null 2>&1\")\r\n\tend\r\n\tif LOG == \"1\" then\r\n\t\tapi.log(0, api.i18n.translate(\"Restart dnsmasq service.\"))\r\n\tend\r\nend\r\n\r\nfunction copy_instance(var)\r\n\tlocal LISTEN_PORT = var[\"LISTEN_PORT\"]\r\n\tlocal TMP_DNSMASQ_PATH = var[\"TMP_DNSMASQ_PATH\"]\r\n\tlocal conf_lines = {}\r\n\tlocal DEFAULT_DNSMASQ_CFGID = sys.exec(\"echo -n $(uci -q show dhcp.@dnsmasq[0] | awk 'NR==1 {split($0, conf, /[.=]/); print conf[2]}')\")\r\n\tfor line in io.lines(\"/tmp/etc/dnsmasq.conf.\" .. DEFAULT_DNSMASQ_CFGID) do\r\n\t\tlocal filter\r\n\t\tif line:find(\"passwall2\") then filter = true end\r\n\t\tif line:find(\"ubus\") then filter = true end\r\n\t\tif line:find(\"dhcp\") then filter = true end\r\n\t\tif line:find(\"server=\") == 1 then filter = true end\r\n\t\tif line:find(\"port=\") == 1 then filter = true end\r\n\t\tif line:find(\"conf%-dir=\") == 1 then\r\n\t\t\tfilter = true\r\n\t\t\tif TMP_DNSMASQ_PATH then\r\n\t\t\t\tlocal tmp_path = line:sub(1 + #\"conf-dir=\")\r\n\t\t\t\tsys.call(string.format(\"cp -r %s/* %s/ 2>/dev/null\", tmp_path, TMP_DNSMASQ_PATH))\r\n\t\t\tend\r\n\t\tend\r\n\t\tif line:find(\"address=\") == 1 or (line:find(\"server=\") == 1 and line:find(\"/\")) then filter = nil end\r\n\t\tif not filter then\r\n\t\t\ttinsert(conf_lines, line)\r\n\t\tend\r\n\tend\r\n\ttinsert(conf_lines, \"port=\" .. LISTEN_PORT)\r\n\tif TMP_DNSMASQ_PATH then\r\n\t\tsys.call(\"rm -rf \" .. TMP_DNSMASQ_PATH .. \"/*passwall2*\")\r\n\tend\r\n\tif var[\"return\"] == \"1\" then\r\n\t\treturn conf_lines\r\n\tend\r\n\tif #conf_lines > 0 then\r\n\t\tlocal DNSMASQ_CONF = var[\"DNSMASQ_CONF\"]\r\n\t\tlocal conf_out = io.open(DNSMASQ_CONF, \"a\")\r\n\t\tconf_out:write(table.concat(conf_lines, \"\\n\"))\r\n\t\tconf_out:write(\"\\n\")\r\n\t\tconf_out:close()\r\n\tend\r\nend\r\n\r\nfunction add_rule(var)\r\n\tlocal FLAG = var[\"FLAG\"]\r\n\tlocal TMP_DNSMASQ_PATH = var[\"TMP_DNSMASQ_PATH\"]\r\n\tlocal DNSMASQ_CONF_FILE = var[\"DNSMASQ_CONF_FILE\"]\r\n\tlocal LISTEN_PORT = var[\"LISTEN_PORT\"]\r\n\tlocal DEFAULT_DNS = var[\"DEFAULT_DNS\"]\r\n\tlocal LOCAL_DNS = var[\"LOCAL_DNS\"]\r\n\tlocal TUN_DNS = var[\"TUN_DNS\"]\r\n\tlocal NFTFLAG = var[\"NFTFLAG\"]\r\n\tlocal CACHE_PATH = api.CACHE_PATH\r\n\tlocal CACHE_FLAG = \"dnsmasq_\" .. FLAG\r\n\tlocal CACHE_DNS_PATH = CACHE_PATH .. \"/\" .. CACHE_FLAG\r\n\tlocal CACHE_TEXT_FILE = CACHE_DNS_PATH .. \".txt\"\r\n\r\n\tlocal list1 = {}\r\n\r\n\tlocal function check_dns(domain, dns)\r\n\t\tif domain == \"\" or domain:find(\"#\") then\r\n\t\t\treturn false\r\n\t\tend\r\n\t\tif not dns then\r\n\t\t\treturn\r\n\t\tend\r\n\t\tfor k,v in ipairs(list1[domain].dns) do\r\n\t\t\tif dns == v then\r\n\t\t\t\treturn true\r\n\t\t\tend\r\n\t\tend\r\n\t\treturn false\r\n\tend\r\n\r\n\tlocal function check_ipset(domain, ipset)\r\n\t\tif domain == \"\" or domain:find(\"#\") then\r\n\t\t\treturn false\r\n\t\tend\r\n\t\tif not ipset then\r\n\t\t\treturn\r\n\t\tend\r\n\t\tfor k,v in ipairs(list1[domain].ipsets) do\r\n\t\t\tif ipset == v then\r\n\t\t\t\treturn true\r\n\t\t\tend\r\n\t\tend\r\n\t\treturn false\r\n\tend\r\n\r\n\tlocal function set_domain_dns(domain, dns)\r\n\t\tif domain == \"\" or domain:find(\"#\") then\r\n\t\t\treturn\r\n\t\tend\r\n\t\tif not dns then\r\n\t\t\treturn\r\n\t\tend\r\n\t\tif not list1[domain] then\r\n\t\t\tlist1[domain] = {\r\n\t\t\t\tdns = {},\r\n\t\t\t\tipsets = {}\r\n\t\t\t}\r\n\t\tend\r\n\t\tfor line in string.gmatch(dns, '[^' .. \",\" .. ']+') do\r\n\t\t\tif not check_dns(domain, line) then\r\n\t\t\t\ttable.insert(list1[domain].dns, line)\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\n\r\n\tlocal function set_domain_ipset(domain, ipset)\r\n\t\tif domain == \"\" or domain:find(\"#\") then\r\n\t\t\treturn\r\n\t\tend\r\n\t\tif not ipset then\r\n\t\t\treturn\r\n\t\tend\r\n\t\tif not list1[domain] then\r\n\t\t\tlist1[domain] = {\r\n\t\t\t\tdns = {},\r\n\t\t\t\tipsets = {}\r\n\t\t\t}\r\n\t\tend\r\n\t\tfor line in string.gmatch(ipset, '[^' .. \",\" .. ']+') do\r\n\t\t\tif not check_ipset(domain, line) then\r\n\t\t\t\ttable.insert(list1[domain].ipsets, line)\r\n\t\t\tend\r\n\t\tend\r\n\tend\r\n\r\n\tlocal cache_text = \"\"\r\n\tlocal nodes_address_md5 = sys.exec(\"echo -n $(uci show passwall2 | grep '\\\\.address') | md5sum\")\r\n\tlocal new_text = TMP_DNSMASQ_PATH .. DNSMASQ_CONF_FILE .. DEFAULT_DNS .. LOCAL_DNS .. TUN_DNS .. nodes_address_md5 .. NFTFLAG\r\n\tif fs.access(CACHE_TEXT_FILE) then\r\n\t\tfor line in io.lines(CACHE_TEXT_FILE) do\r\n\t\t\tcache_text = line\r\n\t\tend\r\n\tend\r\n\r\n\tif cache_text ~= new_text then\r\n\t\tapi.remove(CACHE_DNS_PATH .. \"*\")\r\n\tend\r\n\r\n\tlocal dnsmasq_default_dns = TUN_DNS\r\n\r\n\tlocal setflag_4= (NFTFLAG == \"1\") and \"4#inet#passwall2#\" or \"\"\r\n\tlocal setflag_6= (NFTFLAG == \"1\") and \"6#inet#passwall2#\" or \"\"\r\n\r\n\tif not fs.access(CACHE_DNS_PATH) then\r\n\t\tfs.mkdir(CACHE_DNS_PATH)\r\n\r\n\t\tlocal fwd_dns\r\n\r\n\t\t-- Always use domestic DNS to resolve node domain names\r\n\t\tif true then\r\n\t\t\tfwd_dns = LOCAL_DNS\r\n\t\t\tuci:foreach(appname, \"nodes\", function(t)\r\n\t\t\t\tlocal function process_address(address)\r\n\t\t\t\t\taddress = (address or \"\"):lower()\r\n\t\t\t\t\tif address == \"engage.cloudflareclient.com\" then return end\r\n\t\t\t\t\tif datatypes.hostname(address) then\r\n\t\t\t\t\t\tset_domain_dns(address, fwd_dns)\r\n\t\t\t\t\t\tset_domain_ipset(address, setflag_4 .. \"passwall2_vps,\" .. setflag_6 .. \"passwall2_vps6\")\r\n\t\t\t\t\tend\r\n\t\t\t\tend\r\n\t\t\t\tprocess_address(t.address)\r\n\t\t\t\tprocess_address(t.download_address)\r\n\t\t\tend)\r\n\t\tend\r\n\r\n\t\tif list1 and next(list1) then\r\n\t\t\tlocal server_out = io.open(CACHE_DNS_PATH .. \"/001-server.conf\", \"a\")\r\n\t\t\tlocal ipset_out = io.open(CACHE_DNS_PATH .. \"/ipset.conf\", \"a\")\r\n\t\t\tlocal set_name = \"ipset\"\r\n\t\t\tif NFTFLAG == \"1\" then\r\n\t\t\t\tset_name = \"nftset\"\r\n\t\t\tend\r\n\t\t\tfor key, value in pairs(list1) do\r\n\t\t\t\tif value.dns and #value.dns > 0 then\r\n\t\t\t\t\tfor i, dns in ipairs(value.dns) do\r\n\t\t\t\t\t\tserver_out:write(string.format(\"server=/.%s/%s\", key, dns) .. \"\\n\")\r\n\t\t\t\t\tend\r\n\t\t\t\tend\r\n\t\t\t\tif value.ipsets and #value.ipsets > 0 then\r\n\t\t\t\t\tlocal ipsets_str = \"\"\r\n\t\t\t\t\tfor i, ipset in ipairs(value.ipsets) do\r\n\t\t\t\t\t\tipsets_str = ipsets_str .. ipset .. \",\"\r\n\t\t\t\t\tend\r\n\t\t\t\t\tipsets_str = ipsets_str:sub(1, #ipsets_str - 1)\r\n\t\t\t\t\tipset_out:write(string.format(\"%s=/.%s/%s\", set_name, key, ipsets_str) .. \"\\n\")\r\n\t\t\t\tend\r\n\t\t\tend\r\n\t\t\tserver_out:close()\r\n\t\t\tipset_out:close()\r\n\t\tend\r\n\r\n\t\tlocal f_out = io.open(CACHE_TEXT_FILE, \"a\")\r\n\t\tf_out:write(new_text)\r\n\t\tf_out:close()\r\n\tend\r\n\r\n\tapi.remove(TMP_DNSMASQ_PATH)\r\n\tfs.symlink(CACHE_DNS_PATH, TMP_DNSMASQ_PATH)\r\n\r\n\tif DNSMASQ_CONF_FILE ~= \"nil\" then\r\n\t\tlocal conf_lines = {}\r\n\t\tif LISTEN_PORT then\r\n\t\t\t--Copy dnsmasq instance\r\n\t\t\tconf_lines = copy_instance({\r\n\t\t\t\t[\"LISTEN_PORT\"] = LISTEN_PORT,\r\n\t\t\t\t[\"TMP_DNSMASQ_PATH\"] = TMP_DNSMASQ_PATH,\r\n\t\t\t\t[\"return\"] = \"1\"\r\n\t\t\t})\r\n\t\t\t--dhcp.leases to hostsMore actions\r\n\t\t\tlocal hosts = \"/tmp/etc/\" .. appname .. \"_tmp/dhcp-hosts\"\r\n\t\t\tsys.call(\"touch \" .. hosts)\r\n\t\t\ttinsert(conf_lines, \"addn-hosts=\" .. hosts)\r\n\t\telse\r\n\t\t\t--Modify the default dnsmasq service\r\n\t\tend\r\n\t\ttinsert(conf_lines, string.format(\"conf-dir=%s\", TMP_DNSMASQ_PATH))\r\n\t\tif dnsmasq_default_dns then\r\n\t\t\tfor s in string.gmatch(dnsmasq_default_dns, '[^' .. \",\" .. ']+') do\r\n\t\t\t\ttinsert(conf_lines, string.format(\"server=%s\", s))\r\n\t\t\tend\r\n\t\t\ttinsert(conf_lines, \"all-servers\")\r\n\t\t\ttinsert(conf_lines, \"no-poll\")\r\n\t\t\ttinsert(conf_lines, \"no-resolv\")\r\n\r\n\t\t\tif FLAG == \"default\" then\r\n\t\t\t\tapi.set_cache_var(\"DEFAULT_DNS\", DEFAULT_DNS)\r\n\t\t\tend\r\n\t\tend\r\n\t\tif #conf_lines > 0 then\r\n\t\t\tlocal conf_out = io.open(DNSMASQ_CONF_FILE, \"a\")\r\n\t\t\tconf_out:write(table.concat(conf_lines, \"\\n\"))\r\n\t\t\tconf_out:write(\"\\n\")\r\n\t\t\tconf_out:close()\r\n\t\tend\r\n\tend\r\nend\r\n\r\n_G.stretch = stretch\r\n_G.restart = restart\r\n_G.logic_restart = logic_restart\r\n_G.copy_instance = copy_instance\r\n_G.add_rule = add_rule\r\n\r\nif arg[1] then\r\n\tlocal func =_G[arg[1]]\r\n\tif func then\r\n\t\tlocal var = nil\r\n\t\tif arg[2] then\r\n\t\t\tvar = jsonc.parse(arg[2])\r\n\t\tend\r\n\t\tfunc(var)\r\n\tend\r\nend\r\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/passwall2/i18n.lua",
    "content": "if #arg > 0 then\r\n    local api = require \"luci.passwall2.api\"\r\n    local str = arg[1]\r\n    table.remove(arg, 1)\r\n    print(api.i18n.translatef(str, unpack(arg)))\r\nend\r\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/passwall2/iptables.sh",
    "content": "#!/bin/sh\n\nDIR=\"$(cd \"$(dirname \"$0\")\" && pwd)\"\nMY_PATH=$DIR/iptables.sh\nUTILS_PATH=$DIR/utils.sh\nIPSET_LOCAL=\"passwall2_local\"\nIPSET_PROXY_LAN=\"passwall2_proxy_lan\"\nIPSET_LAN=\"passwall2_lan\"\nIPSET_VPS=\"passwall2_vps\"\nIPSET_WAN=\"passwall2_wan\"\n\nIPSET_LOCAL6=\"passwall2_local6\"\nIPSET_PROXY_LAN6=\"passwall2_proxy_lan6\"\nIPSET_LAN6=\"passwall2_lan6\"\nIPSET_VPS6=\"passwall2_vps6\"\nIPSET_WAN6=\"passwall2_wan6\"\n\nFWMARK=\"0x50535732\"\n\nipt=$(command -v iptables-legacy || command -v iptables)\nip6t=$(command -v ip6tables-legacy || command -v ip6tables)\n\nipt_n=\"$ipt -t nat -w\"\nipt_m=\"$ipt -t mangle -w\"\nip6t_n=\"$ip6t -t nat -w\"\nip6t_m=\"$ip6t -t mangle -w\"\n[ -z \"$ip6t\" -o -z \"$(lsmod | grep 'ip6table_nat')\" ] && ip6t_n=\"eval #$ip6t_n\"\n[ -z \"$ip6t\" -o -z \"$(lsmod | grep 'ip6table_mangle')\" ] && ip6t_m=\"eval #$ip6t_m\"\nFWI=$(uci -q get firewall.passwall2.path 2>/dev/null)\nFAKE_IP=\"198.18.0.0/16\"\nFAKE_IP_6=\"fc00::/18\"\n\nfactor() {\n\tif [ -z \"$1\" ] || [ -z \"$2\" ]; then\n\t\techo \"\"\n\telif [ \"$1\" == \"1:65535\" ]; then\n\t\techo \"\"\n\telse\n\t\techo \"$2 $1\"\n\tfi\n}\n\ndst() {\n\techo \"-m set $2 --match-set $1 dst\"\n}\n\ncomment() {\n\tlocal name=$(echo $1 | sed 's/ /_/g')\n\techo \"-m comment --comment \"${name}\"\"\n}\n\n# Resolves invalid IP addresses for ports exceeding 15; it supports single ports and port ranges.\nadd_port_rules() {\n\tlocal ipt_cmd=\"$1\"\n\tlocal port_list=\"$2\"\n\tlocal target=\"$3\"\n\techo \"$port_list\" | grep -vq '[0-9]' && return\n\tport_list=$(echo \"$port_list\" | tr -d ' ' | sed 's/-/:/g' | tr ',' '\\n' | awk '!a[$0]++' | grep -v '^$')\n\t[ -z \"$port_list\" ] && return\n\tif echo \"$port_list\" | grep -q '^1:65535$'; then\n\t\teval \"$ipt_cmd $target\"\n\t\treturn\n\tfi\n\tlocal multiport_ports=\"\"\n\tlocal range_ports=\"\"\n\tlocal count=0\n\tlocal port\n\tfor port in $port_list; do\n\t\tif echo \"$port\" | grep -q ':'; then\n\t\t\trange_ports=\"$range_ports $port\"\n\t\telse\n\t\t\tmultiport_ports=\"$multiport_ports,$port\"\n\t\t\tcount=$((count + 1))\n\t\t\tif [ \"$count\" -eq 15 ]; then\n\t\t\t\teval \"$ipt_cmd -m multiport --dport ${multiport_ports#,} $target\"\n\t\t\t\tmultiport_ports=\"\"\n\t\t\t\tcount=0\n\t\t\tfi\n\t\tfi\n\tdone\n\tif [ -n \"$multiport_ports\" ]; then\n\t\teval \"$ipt_cmd -m multiport --dport ${multiport_ports#,} $target\"\n\tfi\n\tfor port in $range_ports; do\n\t\teval \"$ipt_cmd --dport $port $target\"\n\tdone\n}\n\ndestroy_ipset() {\n\tfor i in \"$@\"; do\n\t\tipset -q -F $i\n\t\tipset -q -X $i\n\tdone\n}\n\ninsert_rule_before() {\n\t[ $# -ge 3 ] || {\n\t\treturn 1\n\t}\n\tlocal ipt_tmp=\"${1}\"; shift\n\tlocal chain=\"${1}\"; shift\n\tlocal keyword=\"${1}\"; shift\n\tlocal rule=\"${1}\"; shift\n\tlocal default_index=\"${1}\"; shift\n\tdefault_index=${default_index:-0}\n\tlocal _index=$($ipt_tmp -n -L $chain --line-numbers 2>/dev/null | grep \"$keyword\" | head -n 1 | awk '{print $1}')\n\tif [ -z \"${_index}\" ] && [ \"${default_index}\" = \"0\" ]; then\n\t\t$ipt_tmp -A $chain $rule\n\telse\n\t\tif [ -z \"${_index}\" ]; then\n\t\t\t_index=${default_index}\n\t\tfi\n\t\t$ipt_tmp -I $chain $_index $rule\n\tfi\n}\n\ninsert_rule_after() {\n\t[ $# -ge 3 ] || {\n\t\treturn 1\n\t}\n\tlocal ipt_tmp=\"${1}\"; shift\n\tlocal chain=\"${1}\"; shift\n\tlocal keyword=\"${1}\"; shift\n\tlocal rule=\"${1}\"; shift\n\tlocal default_index=\"${1}\"; shift\n\tdefault_index=${default_index:-0}\n\tlocal _index=$($ipt_tmp -n -L $chain --line-numbers 2>/dev/null | grep \"$keyword\" | awk 'END {print}' | awk '{print $1}')\n\tif [ -z \"${_index}\" ] && [ \"${default_index}\" = \"0\" ]; then\n\t\t$ipt_tmp -A $chain $rule\n\telse\n\t\tif [ -n \"${_index}\" ]; then\n\t\t\t_index=$((_index + 1))\n\t\telse\n\t\t\t_index=${default_index}\n\t\tfi\n\t\t$ipt_tmp -I $chain $_index $rule\n\tfi\n}\n\nRULE_LAST_INDEX() {\n\t[ $# -ge 3 ] || {\n\t\tlog_i18n 1 \"Incorrect index listing method (%s), execution terminated!\" \"iptables\"\n\t\treturn 1\n\t}\n\tlocal ipt_tmp=\"${1}\"; shift\n\tlocal chain=\"${1}\"; shift\n\tlocal list=\"${1}\"; shift\n\tlocal default=\"${1:-0}\"; shift\n\tlocal _index=$($ipt_tmp -n -L $chain --line-numbers 2>/dev/null | grep \"$list\" | head -n 1 | awk '{print $1}')\n\techo \"${_index:-${default}}\"\n}\n\nREDIRECT() {\n\tlocal s=\"-j REDIRECT\"\n\t[ -n \"$1\" ] && {\n\t\tlocal s=\"$s --to-ports $1\"\n\t\t[ \"$2\" == \"TPROXY\" ] && {\n\t\t\tlocal mark=\"-m mark --mark ${FWMARK}\"\n\t\t\ts=\"${mark} -j TPROXY --on-port $1\"\n\t\t}\n\t}\n\techo $s\n}\n\nget_redirect_ipt() {\n\techo \"$(REDIRECT $2 $3)\"\n}\n\nget_redirect_ip6t() {\n\techo \"$(REDIRECT $2 $3)\"\n}\n\ngen_shunt_list() {\n\tlocal node=${1}\n\tlocal shunt_list4_var_name=${2}\n\tlocal shunt_list6_var_name=${3}\n\t[ -z \"$node\" ] && continue\n\tunset ${shunt_list4_var_name}\n\tunset ${shunt_list6_var_name}\n\tlocal _SHUNT_LIST4 _SHUNT_LIST6\n\tlocal USE_SHUNT_NODE=0\n\tNODE_PROTOCOL=$(config_n_get $node protocol)\n\t[ \"$NODE_PROTOCOL\" = \"_shunt\" ] && USE_SHUNT_NODE=1\n\t[ \"$USE_SHUNT_NODE\" = \"1\" ] && {\n\t\tlocal enable_geoview_ip=$(config_n_get $node enable_geoview_ip 0)\n\t\t[ -z \"$(first_type geoview)\" ] && enable_geoview_ip=0\n\t\tlocal preloading=0\n\t\tpreloading=$enable_geoview_ip\n\t\t[ \"${preloading}\" = \"1\" ] && {\n\t\t\tlocal default_node=$(config_n_get ${node} default_node _direct)\n\t\t\tlocal default_outbound=\"redirect\"\n\t\t\t[ \"$default_node\" = \"_direct\" ] && default_outbound=\"direct\"\n\t\t\tlocal shunt_ids=$(uci show $CONFIG | grep \"=shunt_rules\" | awk -F '.' '{print $2}' | awk -F '=' '{print $1}')\n\t\t\tfor shunt_id in $shunt_ids; do\n\t\t\t\tlocal shunt_node=$(config_n_get ${node} \"${shunt_id}\")\n\t\t\t\t[ -n \"$shunt_node\" ] && {\n\t\t\t\t\tlocal ipset_v4=\"passwall2_${node}_${shunt_id}\"\n\t\t\t\t\tlocal ipset_v6=\"passwall2_${node}_${shunt_id}6\"\n\t\t\t\t\tipset -! create $ipset_v4 nethash maxelem 1048576\n\t\t\t\t\tipset -! create $ipset_v6 nethash family inet6 maxelem 1048576\n\t\t\t\t\tlocal outbound=\"redirect\"\n\t\t\t\t\t[ \"$shunt_node\" = \"_direct\" ] && outbound=\"direct\"\n\t\t\t\t\t[ \"$shunt_node\" = \"_default\" ] && outbound=\"${default_outbound}\"\n\t\t\t\t\t_SHUNT_LIST4=\"${_SHUNT_LIST4} ${ipset_v4}:${outbound}\"\n\t\t\t\t\t_SHUNT_LIST6=\"${_SHUNT_LIST6} ${ipset_v6}:${outbound}\"\n\n\t\t\t\t\tconfig_n_get $shunt_id ip_list | tr -s \"\\r\\n\" \"\\n\" | sed -e \"/^$/d\" | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | sed -e \"s/^/add $ipset_v4 &/g\" | awk '{print $0} END{print \"COMMIT\"}' | ipset -! -R\n\t\t\t\t\tconfig_n_get $shunt_id ip_list | tr -s \"\\r\\n\" \"\\n\" | sed -e \"/^$/d\" | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | sed -e \"s/^/add $ipset_v6 &/g\" | awk '{print $0} END{print \"COMMIT\"}' | ipset -! -R\n\t\t\t\t\t[ \"${enable_geoview_ip}\" = \"1\" ] && {\n\t\t\t\t\t\tlocal _geoip_code=$(config_n_get $shunt_id ip_list | tr -s \"\\r\\n\" \"\\n\" | sed -e \"/^$/d\" | grep -E \"^geoip:\" | grep -v \"^geoip:private\" | sed -E 's/^geoip:(.*)/\\1/' | sed ':a;N;$!ba;s/\\n/,/g')\n\t\t\t\t\t\t[ -n \"$_geoip_code\" ] && {\n\t\t\t\t\t\t\tget_geoip $_geoip_code ipv4 | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | sed -e \"s/^/add $ipset_v4 &/g\" | awk '{print $0} END{print \"COMMIT\"}' | ipset -! -R\n\t\t\t\t\t\t\tget_geoip $_geoip_code ipv6 | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | sed -e \"s/^/add $ipset_v6 &/g\" | awk '{print $0} END{print \"COMMIT\"}' | ipset -! -R\n\t\t\t\t\t\t\tlog 1 \"$(i18n \"parse the traffic splitting rules[%s]-[geoip:%s] add to %s to complete.\" \"${shunt_id}\" \"${_geoip_code}\" \"IPSET\")\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tdone\n\t\t}\n\t\tlocal direct_ipset4=$(get_cache_var \"node_${node}_direct_ipset4\")\n\t\t[ -n \"${direct_ipset4}\" ] && {\n\t\t\tipset -! create ${direct_ipset4} nethash maxelem 1048576 timeout 259200\n\t\t\t_SHUNT_LIST4=\"${_SHUNT_LIST4} ${direct_ipset4}:direct\"\n\t\t}\n\t\tlocal direct_ipset6=$(get_cache_var \"node_${node}_direct_ipset6\")\n\t\t[ -n \"${direct_ipset6}\" ] && {\n\t\t\tipset -! create ${direct_ipset6} nethash family inet6 maxelem 1048576 timeout 259200\n\t\t\t_SHUNT_LIST6=\"${_SHUNT_LIST6} ${direct_ipset6}:direct\"\n\t\t}\n\t\t[ \"${preloading}\" = \"1\" ] && [ -n \"$default_node\" ] && {\n\t\t\tlocal ipset_v4=\"passwall2_${node}_default\"\n\t\t\tlocal ipset_v6=\"passwall2_${node}_default6\"\n\t\t\tipset -! create $ipset_v4 nethash maxelem 1048576\n\t\t\tipset -! create $ipset_v6 nethash family inet6 maxelem 1048576\n\t\t\t_SHUNT_LIST4=\"${_SHUNT_LIST4} ${ipset_v4}:${default_outbound}\"\n\t\t\t_SHUNT_LIST6=\"${_SHUNT_LIST6} ${ipset_v6}:${default_outbound}\"\n\t\t}\n\t}\n\t[ -n \"${_SHUNT_LIST4}\" ] && eval ${shunt_list4_var_name}=\\\"${_SHUNT_LIST4}\\\"\n\t[ -n \"${_SHUNT_LIST6}\" ] && eval ${shunt_list6_var_name}=\\\"${_SHUNT_LIST6}\\\"\n}\n\nadd_shunt_t_rule() {\n\tlocal shunt_args=${1}\n\tlocal t_args=${2}\n\tlocal t_jump_args=${3}\n\tlocal t_ports_args=${4}\n\t[ -n \"${shunt_args}\" ] && {\n\t\tfor j in ${shunt_args}; do\n\t\t\tlocal _set_name=$(echo ${j} | awk -F ':' '{print $1}')\n\t\t\tlocal _outbound=$(echo ${j} | awk -F ':' '{print $2}')\n\t\t\t[ -n \"${_set_name}\" ] && [ -n \"${_outbound}\" ] && {\n\t\t\t\tlocal _t_arg=\"${t_jump_args}\"\n\t\t\t\t[ \"${_outbound}\" = \"direct\" ] && _t_arg=\"-j RETURN\"\n\t\t\t\tif [ -z \"${t_ports_args}\" ] || [ \"${t_ports_args}\" == \"1:65535\" ]; then\n\t\t\t\t\t${t_args} $(dst ${_set_name}) ${_t_arg}\n\t\t\t\telse\n\t\t\t\t\tadd_port_rules \"${t_args} $(dst ${_set_name})\" \"${t_ports_args}\" \"${_t_arg}\"\n\t\t\t\tfi\n\t\t\t}\n\t\tdone\n\t}\n}\n\nload_acl() {\n\tlog_i18n 1 \"Access Control:\"\n\t[ \"$ENABLED_ACLS\" == 1 ] && {\n\t\tacl_app\n\t\tfor sid in $(ls -F ${TMP_ACL_PATH} | grep '/$' | awk -F '/' '{print $1}' | grep -v 'default'); do\n\t\t\teval $(uci -q show \"${CONFIG}.${sid}\" | cut -d'.' -sf 3-)\n\n\t\t\ttcp_no_redir_ports=${tcp_no_redir_ports:-default}\n\t\t\tudp_no_redir_ports=${udp_no_redir_ports:-default}\n\t\t\ttcp_proxy_mode=\"global\"\n\t\t\tudp_proxy_mode=\"global\"\n\t\t\ttcp_redir_ports=${tcp_redir_ports:-default}\n\t\t\tudp_redir_ports=${udp_redir_ports:-default}\n\t\t\tnode=${node:-default}\n\t\t\t[ \"$tcp_no_redir_ports\" = \"default\" ] && tcp_no_redir_ports=$TCP_NO_REDIR_PORTS\n\t\t\t[ \"$udp_no_redir_ports\" = \"default\" ] && udp_no_redir_ports=$UDP_NO_REDIR_PORTS\n\t\t\t[ \"$tcp_redir_ports\" = \"default\" ] && tcp_redir_ports=$TCP_REDIR_PORTS\n\t\t\t[ \"$udp_redir_ports\" = \"default\" ] && udp_redir_ports=$UDP_REDIR_PORTS\n\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_node\")\" ] && node=$(get_cache_var \"ACL_${sid}_node\")\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_redir_port\")\" ] && redir_port=$(get_cache_var \"ACL_${sid}_redir_port\")\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_dns_port\")\" ] && dns_redirect_port=$(get_cache_var \"ACL_${sid}_dns_port\")\n\t\t\t[ -n \"$node\" ] && node_remark=$(config_n_get $node remarks)\n\n\t\t\tif [ -n \"$(get_cache_var \"ACL_${sid}_default\")\" ]; then\n\t\t\t\tshunt_list4=${SHUNT_LIST4}\n\t\t\t\tshunt_list6=${SHUNT_LIST6}\n\t\t\telse\n\t\t\t\t# Shunt rules IP list (import when use shunt node)\n\t\t\t\tgen_shunt_list \"${node}\" shunt_list4 shunt_list6\n\t\t\tfi\n\t\t\t\n\t\t\t_acl_list=${TMP_ACL_PATH}/${sid}/source_list\n\n\t\t\tfor i in $(cat $_acl_list); do\n\t\t\t\tlocal _ipt_source _ipv4\n\t\t\t\tlocal msg\n\t\t\t\tif [ -n \"${interface}\" ]; then\n\t\t\t\t\tlocal gateway device\n\t\t\t\t\tnetwork_get_gateway gateway \"${interface}\"\n\t\t\t\t\tnetwork_get_device device \"${interface}\"\n\t\t\t\t\t# network_get_device returns empty for non-UP interfaces (e.g. auto='0').\n\t\t\t\t\t# Try ubus directly, then check if the name is a kernel device.\n\t\t\t\t\t[ -z \"${device}\" ] && device=$(ubus call \"network.interface.${interface}\" status 2>/dev/null | jsonfilter -e '@.device' 2>/dev/null)\n\t\t\t\t\t[ -z \"${device}\" ] && [ -d \"/sys/class/net/${interface}\" ] && device=\"${interface}\"\n\t\t\t\t\t[ -z \"${device}\" ] && device=\"${interface}\"\n\t\t\t\t\t_ipt_source=\"-i ${device} \"\n\t\t\t\t\tmsg=$(i18n \"Source iface [%s],\" \"${device}\")\n\t\t\t\telse\n\t\t\t\t\tmsg=$(i18n \"Source iface [%s],\" $(i18n \"All\"))\n\t\t\t\tfi\n\t\t\t\tif [ -n \"$(echo ${i} | grep '^iprange:')\" ]; then\n\t\t\t\t\t_iprange=$(echo ${i} | sed 's#iprange:##g')\n\t\t\t\t\t_ipt_source=$(factor ${_iprange} \"${_ipt_source}-m iprange --src-range\")\n\t\t\t\t\tmsg=\"${msg}$(i18n \"IP range [%s],\" \"${_iprange}\")\"\n\t\t\t\t\t_ipv4=\"1\"\n\t\t\t\t\tunset _iprange\n\t\t\t\telif [ -n \"$(echo ${i} | grep '^ipset:')\" ]; then\n\t\t\t\t\t_ipset=$(echo ${i} | sed 's#ipset:##g')\n\t\t\t\t\tmsg=\"${msg}IPset$(i18n \"[%s],\" \"${_ipset}\")\"\n\t\t\t\t\tipset -q list ${_ipset} >/dev/null\n\t\t\t\t\tif [ $? -eq 0 ]; then\n\t\t\t\t\t\t_ipt_source=\"${_ipt_source}-m set --match-set ${_ipset} src\"\n\t\t\t\t\t\tunset _ipset\n\t\t\t\t\telse\n\t\t\t\t\t\tlog 2 \"$(i18n \"[%s],\" \"${remarks}\")${msg}$(i18n \"Does not exist, ignore.\")\"\n\t\t\t\t\t\tunset _ipset\n\t\t\t\t\t\tcontinue\n\t\t\t\t\tfi\n\t\t\t\telif [ -n \"$(echo ${i} | grep '^ip:')\" ]; then\n\t\t\t\t\t_ip=$(echo ${i} | sed 's#ip:##g')\n\t\t\t\t\t_ipt_source=$(factor ${_ip} \"${_ipt_source}-s\")\n\t\t\t\t\tmsg=\"${msg}IP$(i18n \"[%s],\" \"${_ip}\")\"\n\t\t\t\t\t_ipv4=\"1\"\n\t\t\t\t\tunset _ip\n\t\t\t\telif [ -n \"$(echo ${i} | grep '^mac:')\" ]; then\n\t\t\t\t\t_mac=$(echo ${i} | sed 's#mac:##g')\n\t\t\t\t\t_ipt_source=$(factor ${_mac} \"${_ipt_source}-m mac --mac-source\")\n\t\t\t\t\tmsg=\"${msg}MAC$(i18n \"[%s],\" \"${_mac}\")\"\n\t\t\t\t\tunset _mac\n\t\t\t\telif [ -n \"$(echo ${i} | grep '^any')\" ]; then\n\t\t\t\t\tmsg=\"${msg}$(i18n \"All device,\")\"\n\t\t\t\telse\n\t\t\t\t\tcontinue\n\t\t\t\tfi\n\t\t\t\tmsg=\"$(i18n \"[%s],\" \"${remarks}\")${msg}\"\n\n\t\t\t\tipt_tmp=$ipt_n\n\t\t\t\t[ -n \"${is_tproxy}\" ] && ipt_tmp=$ipt_m\n\t\t\t\t\n\t\t\t\t[ \"$tcp_no_redir_ports\" != \"disable\" ] && {\n\t\t\t\t\tif ! has_1_65535 \"$tcp_no_redir_ports\"; then\n\t\t\t\t\t\t[ \"$_ipv4\" != \"1\" ] && add_port_rules \"$ip6t_m -A PSW2 $(comment \"$remarks\") ${_ipt_source} -p tcp\" $tcp_no_redir_ports \"-j RETURN\" 2>/dev/null\n\t\t\t\t\t\tadd_port_rules \"$ipt_tmp -A PSW2 $(comment \"$remarks\") ${_ipt_source} -p tcp\" $tcp_no_redir_ports \"-j RETURN\"\n\t\t\t\t\t\tlog 2 \"${msg}$(i18n \"not proxy %s port [%s]\" \"TCP\" \"${tcp_no_redir_ports}\")\"\n\t\t\t\t\telse\n\t\t\t\t\t\t# It will return when it ends, so no extra rules are needed.\n\t\t\t\t\t\ttcp_proxy_mode=\"disable\"\n\t\t\t\t\t\tlog 2 \"${msg}$(i18n \"not proxy all %s\" \"TCP\")\"\n\t\t\t\t\tfi\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t[ \"$udp_no_redir_ports\" != \"disable\" ] && {\n\t\t\t\t\tif ! has_1_65535 \"$udp_no_redir_ports\"; then\n\t\t\t\t\t\t[ \"$_ipv4\" != \"1\" ] && add_port_rules \"$ip6t_m -A PSW2 $(comment \"$remarks\") ${_ipt_source} -p udp\" $udp_no_redir_ports \"-j RETURN\" 2>/dev/null\n\t\t\t\t\t\tadd_port_rules \"$ipt_m -A PSW2 $(comment \"$remarks\") ${_ipt_source} -p udp\" $udp_no_redir_ports \"-j RETURN\"\n\t\t\t\t\t\tlog 2 \"${msg}$(i18n \"not proxy %s port [%s]\" \"UDP\" \"${udp_no_redir_ports}\")\"\n\t\t\t\t\telse\n\t\t\t\t\t\t# It will return when it ends, so no extra rules are needed.\n\t\t\t\t\t\tudp_proxy_mode=\"disable\"\n\t\t\t\t\t\tlog 2 \"${msg}$(i18n \"not proxy all %s\" \"UDP\")\"\n\t\t\t\t\tfi\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif ([ \"$tcp_proxy_mode\" != \"disable\" ] || [ \"$udp_proxy_mode\" != \"disable\" ]) && [ -n \"$dns_redirect_port\" ]; then\n\t\t\t\t\t$ipt_n -A PSW2_DNS $(comment \"$remarks\") -p udp ${_ipt_source} --dport 53 -j REDIRECT --to-ports $dns_redirect_port\n\t\t\t\t\t$ip6t_n -A PSW2_DNS $(comment \"$remarks\") -p udp ${_ipt_source} --dport 53 -j REDIRECT --to-ports $dns_redirect_port 2>/dev/null\n\t\t\t\t\t$ipt_n -A PSW2_DNS $(comment \"$remarks\") -p tcp ${_ipt_source} --dport 53 -j REDIRECT --to-ports $dns_redirect_port\n\t\t\t\t\t$ip6t_n -A PSW2_DNS $(comment \"$remarks\") -p tcp ${_ipt_source} --dport 53 -j REDIRECT --to-ports $dns_redirect_port 2>/dev/null\n\t\t\t\t\t[ -z \"$(get_cache_var \"ACL_${sid}_default\")\" ] && log 2 \"${msg}$(i18n \"Using a node that is different from the global configuration, DNS has been forcibly redirected to a dedicated DNS server.\")\"\n\t\t\t\telse\n\t\t\t\t\t$ipt_n -A PSW2_DNS $(comment \"$remarks\") -p udp ${_ipt_source} --dport 53 -j RETURN\n\t\t\t\t\t$ip6t_n -A PSW2_DNS $(comment \"$remarks\") -p udp ${_ipt_source} --dport 53 -j RETURN 2>/dev/null\n\t\t\t\t\t$ipt_n -A PSW2_DNS $(comment \"$remarks\") -p tcp ${_ipt_source} --dport 53 -j RETURN\n\t\t\t\t\t$ip6t_n -A PSW2_DNS $(comment \"$remarks\") -p tcp ${_ipt_source} --dport 53 -j RETURN 2>/dev/null\n\t\t\t\tfi\n\n\t\t\t\t[ \"$tcp_proxy_mode\" != \"disable\" ] && [ -n \"$redir_port\" ] && {\n\t\t\t\t\tmsg2=\"${msg}$(i18n \"Use the %s node [%s]\" \"TCP\" \"${node_remark}\")\"\n\t\t\t\t\tif [ -n \"${is_tproxy}\" ]; then\n\t\t\t\t\t\tmsg2=\"${msg2}(TPROXY:${redir_port})\"\n\t\t\t\t\t\tipt_j=\"-j PSW2_RULE\"\n\t\t\t\t\telse\n\t\t\t\t\t\tmsg2=\"${msg2}(REDIRECT:${redir_port})\"\n\t\t\t\t\t\tipt_j=\"$(REDIRECT $redir_port)\"\n\t\t\t\t\tfi\n\n\t\t\t\t\t[ \"$accept_icmp\" = \"1\" ] && {\n\t\t\t\t\t\t$ipt_n -I PSW2 $(comment \"$remarks\") -p icmp ${_ipt_source} $(dst $IPSET_PROXY_LAN) $(REDIRECT)\n\t\t\t\t\t\t$ipt_n -A PSW2 $(comment \"$remarks\") -p icmp ${_ipt_source} -d $FAKE_IP $(REDIRECT)\n\t\t\t\t\t\tadd_shunt_t_rule \"${shunt_list4}\" \"$ipt_n -A PSW2 $(comment \"$remarks\") -p icmp ${_ipt_source}\" \"$(REDIRECT)\"\n\t\t\t\t\t\t$ipt_n -A PSW2 $(comment \"$remarks\") -p icmp ${_ipt_source} $(REDIRECT)\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t[ \"$accept_icmpv6\" = \"1\" ] && [ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t\t\t$ip6t_n -I PSW2 $(comment \"$remarks\") -p ipv6-icmp ${_ipt_source} $(dst $IPSET_PROXY_LAN6) $(REDIRECT) 2>/dev/null\n\t\t\t\t\t\t$ip6t_n -A PSW2 $(comment \"$remarks\") -p ipv6-icmp ${_ipt_source} -d $FAKE_IP_6 $(REDIRECT) 2>/dev/null\n\t\t\t\t\t\tadd_shunt_t_rule \"${shunt_list6}\" \"$ip6t_n -A PSW2 $(comment \"$remarks\") -p ipv6-icmp ${_ipt_source}\" \"$(REDIRECT)\" 2>/dev/null\n\t\t\t\t\t\t$ip6t_n -A PSW2 $(comment \"$remarks\") -p ipv6-icmp ${_ipt_source} $(REDIRECT) 2>/dev/null\n\t\t\t\t\t}\n\n\t\t\t\t\t$ipt_tmp -I PSW2 $(comment \"$remarks\") -p tcp ${_ipt_source} $(dst $IPSET_PROXY_LAN) ${ipt_j}\n\t\t\t\t\t$ipt_tmp -A PSW2 $(comment \"$remarks\") -p tcp ${_ipt_source} -d $FAKE_IP ${ipt_j}\n\t\t\t\t\tadd_shunt_t_rule \"${shunt_list4}\" \"$ipt_tmp -A PSW2 $(comment \"$remarks\") -p tcp ${_ipt_source}\" \"${ipt_j}\" $tcp_redir_ports\n\t\t\t\t\tadd_port_rules \"$ipt_tmp -A PSW2 $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_redir_ports \"${ipt_j}\"\n\t\t\t\t\t[ -n \"${is_tproxy}\" ] && $ipt_m -A PSW2 $(comment \"$remarks\") -p tcp ${_ipt_source} $(REDIRECT $redir_port TPROXY)\n\n\t\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && [ \"$_ipv4\" != \"1\" ] && {\n\t\t\t\t\t\t$ip6t_m -I PSW2 $(comment \"$remarks\") -p tcp ${_ipt_source} $(dst $IPSET_PROXY_LAN6) -j PSW2_RULE 2>/dev/null\n\t\t\t\t\t\t$ip6t_m -A PSW2 $(comment \"$remarks\") -p tcp ${_ipt_source} -d $FAKE_IP_6 -j PSW2_RULE 2>/dev/null\n\t\t\t\t\t\tadd_shunt_t_rule \"${shunt_list6}\" \"$ip6t_m -A PSW2 $(comment \"$remarks\") -p tcp ${_ipt_source}\" \"${ipt_j}\" $tcp_redir_ports 2>/dev/null\n\t\t\t\t\t\tadd_port_rules \"$ip6t_m -A PSW2 $(comment \"$remarks\") -p tcp ${_ipt_source}\" $tcp_redir_ports \"-j PSW2_RULE\" 2>/dev/null\n\t\t\t\t\t\t$ip6t_m -A PSW2 $(comment \"$remarks\") -p tcp ${_ipt_source} $(REDIRECT $redir_port TPROXY) 2>/dev/null\n\t\t\t\t\t}\n\t\t\t\t\tlog 2 \"${msg2}\"\n\t\t\t\t}\n\t\t\t\t$ipt_tmp -A PSW2 $(comment \"$remarks\") ${_ipt_source} -p tcp -j RETURN\n\t\t\t\t[ \"$_ipv4\" != \"1\" ] && $ip6t_m -A PSW2 $(comment \"$remarks\") ${_ipt_source} -p tcp -j RETURN 2>/dev/null\n\n\t\t\t\t[ \"$udp_proxy_mode\" != \"disable\" ] && [ -n \"$redir_port\" ] && {\n\t\t\t\t\tmsg2=\"${msg}$(i18n \"Use the %s node [%s]\" \"UDP\" \"${node_remark}\")(TPROXY:${redir_port})\"\n\n\t\t\t\t\t$ipt_m -I PSW2 $(comment \"$remarks\") -p udp ${_ipt_source} $(dst $IPSET_PROXY_LAN) -j PSW2_RULE\n\t\t\t\t\t$ipt_m -A PSW2 $(comment \"$remarks\") -p udp ${_ipt_source} -d $FAKE_IP -j PSW2_RULE\n\t\t\t\t\tadd_shunt_t_rule \"${shunt_list4}\" \"$ipt_m -A PSW2 $(comment \"$remarks\") -p udp ${_ipt_source}\" \"-j PSW2_RULE\" $udp_redir_ports\n\t\t\t\t\tadd_port_rules \"$ipt_m -A PSW2 $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_redir_ports \"-j PSW2_RULE\"\n\t\t\t\t\t$ipt_m -A PSW2 $(comment \"$remarks\") -p udp ${_ipt_source} $(REDIRECT $redir_port TPROXY)\n\n\t\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && [ \"$_ipv4\" != \"1\" ] && {\n\t\t\t\t\t\t$ip6t_m -I PSW2 $(comment \"$remarks\") -p udp ${_ipt_source} $(dst $IPSET_PROXY_LAN6) -j PSW2_RULE 2>/dev/null\n\t\t\t\t\t\t$ip6t_m -A PSW2 $(comment \"$remarks\") -p udp ${_ipt_source} -d $FAKE_IP_6 -j PSW2_RULE 2>/dev/null\n\t\t\t\t\t\tadd_shunt_t_rule \"${shunt_list6}\" \"$ip6t_m -A PSW2 $(comment \"$remarks\") -p udp ${_ipt_source}\" \"-j PSW2_RULE\" $udp_redir_ports 2>/dev/null\n\t\t\t\t\t\tadd_port_rules \"$ip6t_m -A PSW2 $(comment \"$remarks\") -p udp ${_ipt_source}\" $udp_redir_ports \"-j PSW2_RULE\" 2>/dev/null\n\t\t\t\t\t\t$ip6t_m -A PSW2 $(comment \"$remarks\") -p udp ${_ipt_source} $(REDIRECT $redir_port TPROXY) 2>/dev/null\n\t\t\t\t\t}\n\t\t\t\t\tlog 2 \"${msg2}\"\n\t\t\t\t}\n\t\t\t\t$ipt_m -A PSW2 $(comment \"$remarks\") ${_ipt_source} -p udp -j RETURN\n\t\t\t\t[ \"$_ipv4\" != \"1\" ] && $ip6t_m -A PSW2 $(comment \"$remarks\") ${_ipt_source} -p udp -j RETURN 2>/dev/null\n\t\t\t\tunset ipt_tmp ipt_j _ipt_source msg msg2 _ipv4\n\t\t\tdone\n\t\t\tunset enabled sid remarks sources tcp_no_redir_ports udp_no_redir_ports tcp_redir_ports udp_redir_ports node interface\n\t\t\tunset node_remark _acl_list\n\t\tdone\n\t}\n\t\n\t[ \"$ENABLED_DEFAULT_ACL\" == 1 ] && [ \"$CLIENT_PROXY\" == 1 ] && {\n\t\tlocal comment_d=\"$(i18n \"Default\")\"\n\t\tmsg=\"$(i18n \"[%s],\" ${comment_d})\"\n\t\tlocal ipt_tmp=$ipt_n\n\t\t[ -n \"${is_tproxy}\" ] && ipt_tmp=$ipt_m\n\n\t\t[ \"$TCP_NO_REDIR_PORTS\" != \"disable\" ] && {\n\t\t\tadd_port_rules \"$ip6t_m -A PSW2 $(comment \"${comment_d}\") -p tcp\" $TCP_NO_REDIR_PORTS \"-j RETURN\"\n\t\t\tadd_port_rules \"$ipt_tmp -A PSW2 $(comment \"${comment_d}\") -p tcp\" $TCP_NO_REDIR_PORTS \"-j RETURN\"\n\t\t\tif ! has_1_65535 \"$TCP_NO_REDIR_PORTS\"; then\n\t\t\t\tlog 2 \"${msg}$(i18n \"not proxy %s port [%s]\" \"TCP\" \"${TCP_NO_REDIR_PORTS}\")\"\n\t\t\telse\n\t\t\t\tTCP_PROXY_MODE=\"disable\"\n\t\t\t\tlog 2 \"${msg}$(i18n \"not proxy all %s\" \"TCP\")\"\n\t\t\tfi\n\t\t}\n\n\t\t[ \"$UDP_NO_REDIR_PORTS\" != \"disable\" ] && {\n\t\t\tadd_port_rules \"$ip6t_m -A PSW2 $(comment \"${comment_d}\") -p udp\" $UDP_NO_REDIR_PORTS \"-j RETURN\"\n\t\t\tadd_port_rules \"$ipt_tmp -A PSW2 $(comment \"${comment_d}\") -p udp\" $UDP_NO_REDIR_PORTS \"-j RETURN\"\n\t\t\tif ! has_1_65535 \"$UDP_NO_REDIR_PORTS\"; then\n\t\t\t\tlog 2 \"${msg}$(i18n \"not proxy %s port [%s]\" \"UDP\" \"${UDP_NO_REDIR_PORTS}\")\"\n\t\t\telse\n\t\t\t\tUDP_PROXY_MODE=\"disable\"\n\t\t\t\tlog 2 \"${msg}$(i18n \"not proxy all %s\" \"UDP\")\"\n\t\t\tfi\n\t\t}\n\n\t\tif ([ \"$TCP_PROXY_MODE\" != \"disable\" ] || [ \"$UDP_PROXY_MODE\" != \"disable\" ]) && [ -n \"$NODE\" ]; then\n\t\t\t[ -n \"$DNS_REDIRECT_PORT\" ] && {\n\t\t\t\t$ipt_n -A PSW2_DNS $(comment \"${comment_d}\") -p udp --dport 53 -j REDIRECT --to-ports $DNS_REDIRECT_PORT\n\t\t\t\t$ip6t_n -A PSW2_DNS $(comment \"${comment_d}\") -p udp --dport 53 -j REDIRECT --to-ports $DNS_REDIRECT_PORT 2>/dev/null\n\t\t\t\t$ipt_n -A PSW2_DNS $(comment \"${comment_d}\") -p tcp --dport 53 -j REDIRECT --to-ports $DNS_REDIRECT_PORT\n\t\t\t\t$ip6t_n -A PSW2_DNS $(comment \"${comment_d}\") -p tcp --dport 53 -j REDIRECT --to-ports $DNS_REDIRECT_PORT 2>/dev/null\n\t\t\t}\n\t\tfi\n\n\t\tif [ \"$TCP_PROXY_MODE\" != \"disable\" ] && [ -n \"$NODE\" ]; then\n\t\t\tmsg2=\"${msg}$(i18n \"Use the %s node [%s]\" \"TCP\" \"$(config_n_get $NODE remarks)\")\"\n\t\t\tif [ -n \"${is_tproxy}\" ]; then\n\t\t\t\tmsg2=\"${msg2}(TPROXY:${REDIR_PORT})\"\n\t\t\t\tipt_j=\"-j PSW2_RULE\"\n\t\t\telse\n\t\t\t\tmsg2=\"${msg2}(REDIRECT:${REDIR_PORT})\"\n\t\t\t\tipt_j=\"$(REDIRECT $REDIR_PORT)\"\n\t\t\tfi\n\n\t\t\t[ \"$accept_icmp\" = \"1\" ] && {\n\t\t\t\t$ipt_n -I PSW2 $(comment \"${comment_d}\") -p icmp $(dst $IPSET_PROXY_LAN) $(REDIRECT)\n\t\t\t\t$ipt_n -A PSW2 $(comment \"${comment_d}\") -p icmp -d $FAKE_IP $(REDIRECT)\n\t\t\t\tadd_shunt_t_rule \"${SHUNT_LIST4}\" \"$ipt_n -A PSW2 $(comment \"${comment_d}\") -p icmp\" \"$(REDIRECT)\"\n\t\t\t\t$ipt_n -A PSW2 $(comment \"${comment_d}\") -p icmp $(REDIRECT)\n\t\t\t}\n\t\t\t\n\t\t\t[ \"$accept_icmpv6\" = \"1\" ] && [ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t$ip6t_n -I PSW2 $(comment \"${comment_d}\") -p ipv6-icmp $(dst $IPSET_PROXY_LAN6) $(REDIRECT)\n\t\t\t\t$ip6t_n -A PSW2 $(comment \"${comment_d}\") -p ipv6-icmp -d $FAKE_IP_6 $(REDIRECT)\n\t\t\t\tadd_shunt_t_rule \"${SHUNT_LIST6}\" \"$ip6t_n -A PSW2 $(comment \"${comment_d}\") -p ipv6-icmp\" \"$(REDIRECT)\"\n\t\t\t\t$ip6t_n -A PSW2 $(comment \"${comment_d}\") -p ipv6-icmp $(REDIRECT)\n\t\t\t}\n\n\t\t\t$ipt_tmp -I PSW2 $(comment \"${comment_d}\") -p tcp $(dst $IPSET_PROXY_LAN) ${ipt_j}\n\t\t\t$ipt_tmp -A PSW2 $(comment \"${comment_d}\") -p tcp -d $FAKE_IP ${ipt_j}\n\t\t\tadd_shunt_t_rule \"${SHUNT_LIST4}\" \"$ipt_tmp -A PSW2 $(comment \"${comment_d}\") -p tcp\" \"${ipt_j}\" $TCP_REDIR_PORTS\n\t\t\tadd_port_rules \"$ipt_tmp -A PSW2 $(comment \"${comment_d}\") -p tcp\" $TCP_REDIR_PORTS \"${ipt_j}\"\n\t\t\t[ -n \"${is_tproxy}\" ] && $ipt_m -A PSW2 $(comment \"${comment_d}\") -p tcp $(REDIRECT $REDIR_PORT TPROXY)\n\n\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t$ip6t_m -I PSW2 $(comment \"${comment_d}\") -p tcp $(dst $IPSET_PROXY_LAN6) -j PSW2_RULE\n\t\t\t\t$ip6t_m -A PSW2 $(comment \"${comment_d}\") -p tcp -d $FAKE_IP_6 -j PSW2_RULE\n\t\t\t\tadd_shunt_t_rule \"${SHUNT_LIST6}\" \"$ip6t_m -A PSW2 $(comment \"${comment_d}\") -p tcp\" \"-j PSW2_RULE\" $TCP_REDIR_PORTS\n\t\t\t\tadd_port_rules \"$ip6t_m -A PSW2 $(comment \"${comment_d}\") -p tcp\" $TCP_REDIR_PORTS \"-j PSW2_RULE\"\n\t\t\t\t$ip6t_m -A PSW2 $(comment \"${comment_d}\") -p tcp $(REDIRECT $REDIR_PORT TPROXY)\n\t\t\t}\n\n\t\t\tlog 2 \"${msg2}\"\n\t\tfi\n\n\t\tif [ \"$UDP_PROXY_MODE\" != \"disable\" ] && [ -n \"$NODE\" ]; then\n\t\t\tmsg2=\"${msg}$(i18n \"Use the %s node [%s]\" \"UDP\" \"$(config_n_get $NODE remarks)\")(TPROXY:${REDIR_PORT})\"\n\n\t\t\t$ipt_m -I PSW2 $(comment \"${comment_d}\") -p udp $(dst $IPSET_PROXY_LAN) -j PSW2_RULE\n\t\t\t$ipt_m -A PSW2 $(comment \"${comment_d}\") -p udp -d $FAKE_IP -j PSW2_RULE\n\t\t\tadd_shunt_t_rule \"${SHUNT_LIST4}\" \"$ipt_m -A PSW2 $(comment \"${comment_d}\") -p udp\" \"-j PSW2_RULE\" $UDP_REDIR_PORTS\n\t\t\tadd_port_rules \"$ipt_m -A PSW2 $(comment \"${comment_d}\") -p udp\" $UDP_REDIR_PORTS \"-j PSW2_RULE\"\n\t\t\t$ipt_m -A PSW2 $(comment \"${comment_d}\") -p udp $(REDIRECT $REDIR_PORT TPROXY)\n\n\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t$ip6t_m -I PSW2 $(comment \"${comment_d}\") -p udp $(dst $IPSET_PROXY_LAN6) -j PSW2_RULE\n\t\t\t\t$ip6t_m -A PSW2 $(comment \"${comment_d}\") -p udp -d $FAKE_IP_6 -j PSW2_RULE\n\t\t\t\tadd_shunt_t_rule \"${SHUNT_LIST6}\" \"$ip6t_m -A PSW2 $(comment \"${comment_d}\") -p udp\" \"-j PSW2_RULE\" $UDP_REDIR_PORTS\n\t\t\t\tadd_port_rules \"$ip6t_m -A PSW2 $(comment \"${comment_d}\") -p udp\" $UDP_REDIR_PORTS \"-j PSW2_RULE\"\n\t\t\t\t$ip6t_m -A PSW2 $(comment \"${comment_d}\") -p udp $(REDIRECT $REDIR_PORT TPROXY)\n\t\t\t}\n\n\t\t\tlog 2 \"${msg2}\"\n\t\tfi\n\t}\n}\n\nfilter_haproxy() {\n\tfor item in $(uci show $CONFIG | grep \".lbss=\" | cut -d \"'\" -f 2); do\n\t\tlocal ip=$(get_host_ip ipv4 $(echo $item | awk -F \":\" '{print $1}') 1)\n\t\t[ -n \"$ip\" ] && ipset -q add $IPSET_VPS $ip\n\tdone\n\tlog_i18n 1 \"Add node to the load balancer is directly connected to %s[%s].\" \"ipset\" \"${IPSET_VPS}\"\n}\n\nfilter_vpsip() {\n\tuci show $CONFIG | grep -E \"(.address=|.download_address=)\" | cut -d \"'\" -f 2 | grep -E \"([0-9]{1,3}[\\.]){3}[0-9]{1,3}\" | grep -v \"^127\\.0\\.0\\.1$\" | sed -e \"/^$/d\" | sed -e \"s/^/add $IPSET_VPS &/g\" | awk '{print $0} END{print \"COMMIT\"}' | ipset -! -R\n\t#log 1 \"$(i18n \"Add all %s nodes to %s[%s] direct connection complete.\" \"IPv4\" \"ipset\" \"${$IPSET_VPS}\")\"\n\tuci show $CONFIG | grep -E \"(.address=|.download_address=)\" | cut -d \"'\" -f 2 | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | sed -e \"/^$/d\" | sed -e \"s/^/add $IPSET_VPS6 &/g\" | awk '{print $0} END{print \"COMMIT\"}' | ipset -! -R\n\t#log 1 \"$(i18n \"Add all %s nodes to %s[%s] direct connection complete.\" \"IPv6\" \"ipset\" \"${$IPSET_VPS6}\")\"\n}\n\nfilter_server_port() {\n\tlocal address=${1}\n\tlocal port=${2}\n\tlocal stream=${3}\n\tstream=$(echo ${3} | tr 'A-Z' 'a-z')\n\tlocal _is_tproxy ipt_tmp\n\tipt_tmp=$ipt_n\n\t_is_tproxy=${is_tproxy}\n\t[ \"$stream\" == \"udp\" ] && _is_tproxy=\"TPROXY\"\n\t[ -n \"${_is_tproxy}\" ] && ipt_tmp=$ipt_m\n\n\tfor _ipt in 4 6; do\n\t\t[ \"$_ipt\" == \"4\" ] && _ipt=$ipt_tmp\n\t\t[ \"$_ipt\" == \"6\" ] && _ipt=$ip6t_m\n\t\t$_ipt -n -L PSW2_OUTPUT | grep -q \"${address}:${port}\"\n\t\tif [ $? -ne 0 ]; then\n\t\t\t$_ipt -I PSW2_OUTPUT $(comment \"${address}:${port}\") -p $stream -d $address --dport $port -j RETURN 2>/dev/null\n\t\tfi\n\tdone\n}\n\nfilter_node() {\n\tlocal node=${1}\n\tlocal stream=${2}\n\tif [ -n \"$node\" ]; then\n\t\tlocal address=$(config_n_get $node address)\n\t\tlocal port=$(config_n_get $node port)\n\t\t[ -z \"$address\" ] && [ -z \"$port\" ] && {\n\t\t\treturn 1\n\t\t}\n\t\tfilter_server_port $address $port $stream\n\t\tfilter_server_port $address $port $stream\n\tfi\n}\n\nfilter_direct_node_list() {\n\t[ ! -s \"$TMP_PATH/direct_node_list\" ] && return\n\tfor _node_id in $(cat $TMP_PATH/direct_node_list | awk '!seen[$0]++'); do\n\t\tfilter_node \"$_node_id\" TCP\n\t\tfilter_node \"$_node_id\" UDP\n\t\tunset _node_id\n\tdone\n}\n\nupdate_wan_sets() {\n\tlocal WAN_IP=$(get_wan_ips ip4)\n\t[ -n \"$WAN_IP\" ] && {\n\t\tipset -F \"$IPSET_WAN\"\n\t\tfor wan_ip in $WAN_IP; do\n\t\t\tipset -! add \"$IPSET_WAN\" \"$wan_ip\"\n\t\tdone\n\t}\n\n\tlocal WAN6_IP=$(get_wan_ips ip6)\n\t[ -n \"$WAN6_IP\" ] && {\n\t\tipset -F \"$IPSET_WAN6\"\n\t\tfor wan6_ip in $WAN6_IP; do\n\t\t\tipset -! add \"$IPSET_WAN6\" \"$wan6_ip\"\n\t\tdone\n\t}\n}\n\nadd_firewall_rule() {\n\tlog_i18n 0 \"Starting to load %s firewall rules...\" \"iptables\"\n\t\n\tipset -! create $IPSET_LOCAL nethash maxelem 1048576\n\tipset -! create $IPSET_PROXY_LAN nethash maxelem 1048576\n\tipset -! create $IPSET_LAN nethash maxelem 1048576\n\tipset -! create $IPSET_VPS nethash maxelem 1048576\n\tipset -! create $IPSET_WAN nethash maxelem 1048576\n\t\n\tipset -! create $IPSET_LOCAL6 nethash family inet6 maxelem 1048576\n\tipset -! create $IPSET_PROXY_LAN6 nethash family inet6 maxelem 1048576\n\tipset -! create $IPSET_LAN6 nethash family inet6 maxelem 1048576\n\tipset -! create $IPSET_VPS6 nethash family inet6 maxelem 1048576\n\tipset -! create $IPSET_WAN6 nethash family inet6 maxelem 1048576\n\n\tget_local_ips ip4 | sed \"s/^/add $IPSET_LOCAL /\" | ipset -! -R\n\tget_local_ips ip6 | sed \"s/^/add $IPSET_LOCAL6 /\" | ipset -! -R\n\n\tipset -! -R <<-EOF\n\t\t$(gen_lanlist | sed -e \"s/^/add $IPSET_LAN /\")\n\tEOF\n\n\tipset -! -R <<-EOF\n\t\t$(gen_lanlist_6 | sed -e \"s/^/add $IPSET_LAN6 /\")\n\tEOF\n\n\t# Ignore special IP ranges\n\tlocal lan_ifname lan_ip\n\tlan_ifname=$(uci -q -p /tmp/state get network.lan.ifname)\n\t[ -n \"$lan_ifname\" ] && {\n\t\tlan_ip=$(ip address show $lan_ifname | grep -w \"inet\" | awk '{print $2}')\n\t\tlan_ip6=$(ip address show $lan_ifname | grep -w \"inet6\" | awk '{print $2}')\n\t\t#log_i18n 1 \"local network segments (%s) direct connection: %s\" \"IPv4\" \"${lan_ip}\"\n\t\t#log_i18n 1 \"local network segments (%s) direct connection: %s\" \"IPv6\" \"${lan_ip6}\"\n\n\t\t[ -n \"$lan_ip\" ] && ipset -! -R <<-EOF\n\t\t\t$(echo $lan_ip | sed -e \"s/ /\\n/g\" | sed -e \"s/^/add $IPSET_LAN /\")\n\t\tEOF\n\n\t\t[ -n \"$lan_ip6\" ] && ipset -! -R <<-EOF\n\t\t\t$(echo $lan_ip6 | sed -e \"s/ /\\n/g\" | sed -e \"s/^/add $IPSET_LAN6 /\")\n\t\tEOF\n\t}\n\n\tupdate_wan_sets\n\n\t[ -n \"$ISP_DNS\" ] && {\n\t\tfor ispip in $ISP_DNS; do\n\t\t\tipset -! add $IPSET_LAN $ispip\n\t\t\tlog_i18n 1 \"$(i18n \"Add ISP %s DNS to the whitelist: %s\" \"IPv4\" \"${ispip}\")\"\n\t\tdone\n\t}\n\n\t[ -n \"$ISP_DNS6\" ] && {\n\t\tfor ispip6 in $ISP_DNS6; do\n\t\t\tipset -! add $IPSET_LAN6 $ispip6\n\t\t\tlog_i18n 1 \"$(i18n \"Add ISP %s DNS to the whitelist: %s\" \"IPv6\" \"${ispip6}\")\"\n\t\tdone\n\t}\n\n\t# Force proxy LAN IP CIDR\n\tforce_proxy_lan_ip=$(config_t_get global_forwarding force_proxy_lan_ip)\n\tfor ip in $force_proxy_lan_ip; do\n\t\tif [[ \"$ip\" == *::* ]]; then\n\t\t\tipset -! add $IPSET_PROXY_LAN6 $ip\n\t\telse\n\t\t\tipset -! add $IPSET_PROXY_LAN $ip\n\t\tfi\n\tdone\n\n\t# Shunt rules IP list (import when use shunt node)\n\tgen_shunt_list \"${NODE}\" SHUNT_LIST4 SHUNT_LIST6\n\n\t# Filter all node IPs\n\tfilter_vpsip > /dev/null 2>&1 &\n\tfilter_haproxy > /dev/null 2>&1 &\n\n\taccept_icmp=$(config_t_get global_forwarding accept_icmp 0)\n\taccept_icmpv6=$(config_t_get global_forwarding accept_icmpv6 0)\n\n\tif [ \"${TCP_PROXY_WAY}\" = \"redirect\" ]; then\n\t\tunset is_tproxy\n\telif [ \"${TCP_PROXY_WAY}\" = \"tproxy\" ]; then\n\t\tis_tproxy=\"TPROXY\"\n\tfi\n\n\tif [ -z \"${is_tproxy}\" ] || [ \"$accept_icmp\" = \"1\" ]; then\n\t\tIPT_N=1\n\tfi\n\n\tif [ -z \"${is_tproxy}\" ] || [ \"$accept_icmpv6\" = \"1\" ]; then\n\t\tIP6T_N=1\n\tfi\n\n\t$ipt_n -N PSW2\n\t$ipt_n -A PSW2 $(dst $IPSET_LAN) -j RETURN\n\t$ipt_n -A PSW2 $(dst $IPSET_VPS) -j RETURN\n\t$ipt_n -A PSW2 $(comment \"WAN_IP_RETURN\") $(dst $IPSET_WAN) -j RETURN\n\t\n\t[ \"$accept_icmp\" = \"1\" ] && insert_rule_after \"$ipt_n\" \"PREROUTING\" \"prerouting_rule\" \"-p icmp -j PSW2\"\n\t[ -z \"${is_tproxy}\" ] && insert_rule_after \"$ipt_n\" \"PREROUTING\" \"prerouting_rule\" \"-p tcp -j PSW2\"\n\n\t$ipt_n -N PSW2_OUTPUT\n\t$ipt_n -A PSW2_OUTPUT $(dst $IPSET_LAN) -j RETURN\n\t$ipt_n -A PSW2_OUTPUT $(dst $IPSET_VPS) -j RETURN\n\t$ipt_n -A PSW2_OUTPUT -m mark --mark 255 -j RETURN\n\n\t$ipt_n -N PSW2_DNS\n\tif [ $(config_t_get global dns_redirect \"1\") = \"0\" ]; then\n\t\t#Only hijack when dest address is local IP\n\t\t$ipt_n -I PREROUTING -m set --match-set $IPSET_LAN src $(dst $IPSET_LOCAL) -j PSW2_DNS\n\telse\n\t\t$ipt_n -I PREROUTING -m set --match-set $IPSET_LAN src -j PSW2_DNS\n\tfi\n\n\t$ipt_m -N PSW2_DIVERT\n\t$ipt_m -A PSW2_DIVERT -j MARK --set-mark ${FWMARK}\n\t$ipt_m -A PSW2_DIVERT -j ACCEPT\n\n\t$ipt_m -N PSW2_RULE\n\t$ipt_m -A PSW2_RULE -j CONNMARK --restore-mark\n\t$ipt_m -A PSW2_RULE -m mark --mark ${FWMARK} -j RETURN\n\t$ipt_m -A PSW2_RULE -p tcp -m tcp --syn -j MARK --set-xmark ${FWMARK}\n\t$ipt_m -A PSW2_RULE -p udp -m conntrack --ctstate NEW,RELATED -j MARK --set-xmark ${FWMARK}\n\t$ipt_m -A PSW2_RULE -j CONNMARK --save-mark\n\n\t$ipt_m -N PSW2\n\t$ipt_m -A PSW2 $(dst $IPSET_LAN) -j RETURN\n\t$ipt_m -A PSW2 $(dst $IPSET_VPS) -j RETURN\n\t$ipt_m -A PSW2 $(comment \"WAN_IP_RETURN\") $(dst $IPSET_WAN) -j RETURN\n\t$ipt_m -A PSW2 -m conntrack --ctdir REPLY -j RETURN\n\n\tinsert_rule_before \"$ipt_m\" \"PREROUTING\" \"mwan3\" \"-j PSW2\"\n\t# Only TCP, UDP Invalid.\n\tinsert_rule_before \"$ipt_m\" \"PREROUTING\" \"PSW2\" \"-p tcp -m socket -j PSW2_DIVERT\"\n\n\t$ipt_m -N PSW2_OUTPUT\n\t$ipt_m -A PSW2_OUTPUT $(dst $IPSET_LAN) -j RETURN\n\t$ipt_m -A PSW2_OUTPUT $(dst $IPSET_VPS) -j RETURN\n\t$ipt_m -A PSW2_OUTPUT -m conntrack --ctdir REPLY -j RETURN\n\t$ipt_m -A PSW2_OUTPUT -m mark --mark 255 -j RETURN\n\n\tip rule add fwmark ${FWMARK} table 999 priority 999\n\tip route add local 0.0.0.0/0 dev lo table 999\n\n\t[ \"$accept_icmpv6\" = \"1\" ] && {\n\t\t$ip6t_n -N PSW2\n\t\t$ip6t_n -A PSW2 $(dst $IPSET_LAN6) -j RETURN\n\t\t$ip6t_n -A PSW2 $(dst $IPSET_VPS6) -j RETURN\n\t\t$ip6t_n -A PREROUTING -p ipv6-icmp -j PSW2\n\n\t\t$ip6t_n -N PSW2_OUTPUT\n\t\t$ip6t_n -A PSW2_OUTPUT $(dst $IPSET_LAN6) -j RETURN\n\t\t$ip6t_n -A PSW2_OUTPUT $(dst $IPSET_VPS6) -j RETURN\n\t\t$ip6t_n -A PSW2_OUTPUT -m mark --mark 255 -j RETURN\n\t}\n\t\n\t$ip6t_n -N PSW2_DNS\n\tif [ $(config_t_get global dns_redirect \"1\") = \"0\" ]; then\n\t\t#Only hijack when dest address is local IP\n\t\t$ip6t_n -I PREROUTING -m set --match-set $IPSET_LAN6 src $(dst $IPSET_LOCAL6) -j PSW2_DNS\n\telse\n\t\t$ip6t_n -I PREROUTING -m set --match-set $IPSET_LAN6 src -j PSW2_DNS\n\tfi\n\n\t$ip6t_m -N PSW2_DIVERT\n\t$ip6t_m -A PSW2_DIVERT -j MARK --set-mark ${FWMARK}\n\t$ip6t_m -A PSW2_DIVERT -j ACCEPT\n\t\n\t$ip6t_m -N PSW2_RULE\n\t$ip6t_m -A PSW2_RULE -j CONNMARK --restore-mark\n\t$ip6t_m -A PSW2_RULE -m mark --mark ${FWMARK} -j RETURN\n\t$ip6t_m -A PSW2_RULE -p tcp -m tcp --syn -j MARK --set-xmark ${FWMARK}\n\t$ip6t_m -A PSW2_RULE -p udp -m conntrack --ctstate NEW,RELATED -j MARK --set-xmark ${FWMARK}\n\t$ip6t_m -A PSW2_RULE -j CONNMARK --save-mark\n\n\t$ip6t_m -N PSW2\n\t$ip6t_m -A PSW2 $(dst $IPSET_LAN6) -j RETURN\n\t$ip6t_m -A PSW2 $(dst $IPSET_VPS6) -j RETURN\n\t$ip6t_m -A PSW2 $(comment \"WAN6_IP_RETURN\") $(dst $IPSET_WAN6) -j RETURN\n\t$ip6t_m -A PSW2 -m conntrack --ctdir REPLY -j RETURN\n\n\tinsert_rule_before \"$ip6t_m\" \"PREROUTING\" \"mwan3\" \"-j PSW2\"\n\t# Only TCP, UDP Invalid.\n\tinsert_rule_before \"$ip6t_m\" \"PREROUTING\" \"PSW2\" \"-p tcp -m socket -j PSW2_DIVERT\"\n\n\t$ip6t_m -N PSW2_OUTPUT\n\t$ip6t_m -A PSW2_OUTPUT -m mark --mark 255 -j RETURN\n\t$ip6t_m -A PSW2_OUTPUT $(dst $IPSET_LAN6) -j RETURN\n\t$ip6t_m -A PSW2_OUTPUT $(dst $IPSET_VPS6) -j RETURN\n\t$ip6t_m -A PSW2_OUTPUT -m conntrack --ctdir REPLY -j RETURN\n\n\t[ -n \"$AUTO_DNS\" ] && {\n\t\tfor auto_dns in $(echo $AUTO_DNS | tr ',' ' '); do\n\t\t\tlocal dns_address=$(echo $auto_dns | awk -F '#' '{print $1}')\n\t\t\tlocal dns_port=$(echo $auto_dns | awk -F '#' '{print $2}')\n\t\t\tif [[ \"$dns_address\" == *::* ]]; then\n\t\t\t\t$ip6t_m -I PSW2_OUTPUT -p udp -d ${dns_address} --dport ${dns_port:-53} -j RETURN\n\t\t\t\tlog_i18n 1 \"$(i18n \"Add direct DNS to %s: %s\" \"ip6tables\" \"[${dns_address}]:${dns_port:-53}\")\"\n\t\t\telse\n\t\t\t\t$ipt_m -I PSW2_OUTPUT -p udp -d ${dns_address} --dport ${dns_port:-53} -j RETURN\n\t\t\t\tlog_i18n 1 \"$(i18n \"Add direct DNS to %s: %s\" \"iptables\" \"${dns_address}:${dns_port:-53}\")\"\n\t\t\tfi\n\t\tdone\n\t}\n\n\tip -6 rule add fwmark ${FWMARK} table 999 priority 999\n\tip -6 route add local ::/0 dev lo table 999\n\n\t[ \"$ENABLED_DEFAULT_ACL\" == 1 ] && {\n\t\tlocal ipt_tmp=$ipt_n\n\t\t[ -n \"${is_tproxy}\" ] && ipt_tmp=$ipt_m\n\t\t\n\t\tTCP_LOCALHOST_PROXY=$LOCALHOST_PROXY\n\t\tUDP_LOCALHOST_PROXY=$LOCALHOST_PROXY\n\t\t\n\t\tmsg=\"$(i18n \"[Local],\")\"\n\t\t[ \"$TCP_NO_REDIR_PORTS\" != \"disable\" ] && {\n\t\t\tadd_port_rules \"$ipt_tmp -A PSW2_OUTPUT -p tcp\" $TCP_NO_REDIR_PORTS \"-j RETURN\"\n\t\t\tadd_port_rules \"$ip6t_m -A PSW2_OUTPUT -p tcp\" $TCP_NO_REDIR_PORTS \"-j RETURN\"\n\t\t\tif ! has_1_65535 \"$TCP_NO_REDIR_PORTS\"; then\n\t\t\t\tlog 1 \"${msg}$(i18n \"not proxy %s port [%s]\" \"TCP\" \"${TCP_NO_REDIR_PORTS}\")\"\n\t\t\telse\n\t\t\t\tunset TCP_LOCALHOST_PROXY\n\t\t\t\tlog 1 \"${msg}$(i18n \"not proxy all %s\" \"TCP\")\"\n\t\t\tfi\n\t\t}\n\t\t\n\t\t[ \"$UDP_NO_REDIR_PORTS\" != \"disable\" ] && {\n\t\t\tadd_port_rules \"$ipt_m -A PSW2_OUTPUT -p udp\" $UDP_NO_REDIR_PORTS \"-j RETURN\"\n\t\t\tadd_port_rules \"$ip6t_m -A PSW2_OUTPUT -p udp\" $UDP_NO_REDIR_PORTS \"-j RETURN\"\n\t\t\tif ! has_1_65535 \"$UDP_NO_REDIR_PORTS\"; then\n\t\t\t\tlog 1 \"${msg}$(i18n \"not proxy %s port [%s]\" \"UDP\" \"${UDP_NO_REDIR_PORTS}\")\"\n\t\t\telse\n\t\t\t\tunset UDP_LOCALHOST_PROXY\n\t\t\t\tlog 1 \"${msg}$(i18n \"not proxy all %s\" \"UDP\")\"\n\t\t\tfi\n\t\t}\n\t\t\n\t\tif [ -n \"$NODE\" ] && ([ \"$TCP_LOCALHOST_PROXY\" = \"1\" ] || [ \"$UDP_LOCALHOST_PROXY\" = \"1\" ]); then\n\t\t\t[ -n \"$DNS_REDIRECT_PORT\" ] && {\n\t\t\t\t$ipt_n -A OUTPUT $(comment \"PSW2_DNS\") -p udp -o lo --dport 53 -j REDIRECT --to-ports $DNS_REDIRECT_PORT\n\t\t\t\t$ip6t_n -A OUTPUT $(comment \"PSW2_DNS\") -p udp -o lo --dport 53 -j REDIRECT --to-ports $DNS_REDIRECT_PORT 2>/dev/null\n\t\t\t\t$ipt_n -A OUTPUT $(comment \"PSW2_DNS\") -p tcp -o lo --dport 53 -j REDIRECT --to-ports $DNS_REDIRECT_PORT\n\t\t\t\t$ip6t_n -A OUTPUT $(comment \"PSW2_DNS\") -p tcp -o lo --dport 53 -j REDIRECT --to-ports $DNS_REDIRECT_PORT 2>/dev/null\n\t\t\t}\n\t\tfi\n\n\t\tlocal comment_l=\"$(i18n \"Local\")\"\n\n\t\t# Loading local router proxy TCP\n\t\tif [ -n \"$NODE\" ] && [ \"$TCP_LOCALHOST_PROXY\" = \"1\" ]; then\n\t\t\t[ \"$accept_icmp\" = \"1\" ] && {\n\t\t\t\t$ipt_n -A OUTPUT -p icmp -j PSW2_OUTPUT\n\t\t\t\t$ipt_n -I PSW2_OUTPUT -p icmp $(dst $IPSET_PROXY_LAN) $(REDIRECT)\n\t\t\t\t$ipt_n -A PSW2_OUTPUT -p icmp -d $FAKE_IP $(REDIRECT)\n\t\t\t\tadd_shunt_t_rule \"${SHUNT_LIST4}\" \"$ipt_n -A PSW2_OUTPUT -p icmp\" \"$(REDIRECT)\"\n\t\t\t\t$ipt_n -A PSW2_OUTPUT -p icmp $(REDIRECT)\n\t\t\t}\n\n\t\t\t[ \"$accept_icmpv6\" = \"1\" ] && {\n\t\t\t\t$ip6t_n -A OUTPUT -p ipv6-icmp -j PSW2_OUTPUT\n\t\t\t\t$ip6t_n -I PSW2_OUTPUT -p ipv6-icmp $(dst $IPSET_PROXY_LAN6) $(REDIRECT)\n\t\t\t\t$ip6t_n -A PSW2_OUTPUT -p ipv6-icmp -d $FAKE_IP_6 $(REDIRECT)\n\t\t\t\tadd_shunt_t_rule \"${SHUNT_LIST6}\" \"$ip6t_n -A PSW2_OUTPUT -p ipv6-icmp\" \"$(REDIRECT)\"\n\t\t\t\t$ip6t_n -A PSW2_OUTPUT -p ipv6-icmp $(REDIRECT)\n\t\t\t}\n\n\t\t\tif [ -n \"${is_tproxy}\" ]; then\n\t\t\t\tipt_j=\"-j PSW2_RULE\"\n\t\t\telse\n\t\t\t\tipt_j=\"$(REDIRECT $REDIR_PORT)\"\n\t\t\tfi\n\n\t\t\t$ipt_tmp -I PSW2_OUTPUT -p tcp $(dst $IPSET_PROXY_LAN) ${ipt_j}\n\t\t\t$ipt_tmp -A PSW2_OUTPUT -p tcp -d $FAKE_IP ${ipt_j}\n\t\t\tadd_shunt_t_rule \"${SHUNT_LIST4}\" \"$ipt_tmp -A PSW2_OUTPUT -p tcp\" \"${ipt_j}\" $TCP_REDIR_PORTS\n\t\t\tadd_port_rules \"$ipt_tmp -A PSW2_OUTPUT -p tcp\" $TCP_REDIR_PORTS \"${ipt_j}\"\n\t\t\t[ -z \"${is_tproxy}\" ] && $ipt_n -A OUTPUT -p tcp -j PSW2_OUTPUT\n\t\t\t[ -n \"${is_tproxy}\" ] && {\n\t\t\t\t$ipt_m -I PSW2 $(comment \"${comment_l}\") -p tcp -i lo $(dst $IPSET_PROXY_LAN) $(REDIRECT $REDIR_PORT TPROXY)\n\t\t\t\t$ipt_m -A PSW2 $(comment \"${comment_l}\") -p tcp -i lo $(REDIRECT $REDIR_PORT TPROXY)\n\t\t\t\t$ipt_m -A PSW2 $(comment \"${comment_l}\") -p tcp -i lo -j RETURN\n\t\t\t\tinsert_rule_before \"$ipt_m\" \"OUTPUT\" \"mwan3\" \"$(comment mangle-OUTPUT-PSW2) -p tcp -j PSW2_OUTPUT\"\n\t\t\t}\n\n\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t$ip6t_m -I PSW2_OUTPUT -p tcp $(dst $IPSET_PROXY_LAN6) -j PSW2_RULE\n\t\t\t\t$ip6t_m -A PSW2_OUTPUT -p tcp -d $FAKE_IP_6 -j PSW2_RULE\n\t\t\t\tadd_shunt_t_rule \"${SHUNT_LIST6}\" \"$ip6t_m -A PSW2_OUTPUT -p tcp\" \"-j PSW2_RULE\" $TCP_REDIR_PORTS\n\t\t\t\tadd_port_rules \"$ip6t_m -A PSW2_OUTPUT -p tcp\" $TCP_REDIR_PORTS \"-j PSW2_RULE\"\n\t\t\t\t$ip6t_m -I PSW2 $(comment \"${comment_l}\") -p tcp -i lo $(dst $IPSET_PROXY_LAN6) $(REDIRECT $REDIR_PORT TPROXY)\n\t\t\t\t$ip6t_m -A PSW2 $(comment \"${comment_l}\") -p tcp -i lo $(REDIRECT $REDIR_PORT TPROXY)\n\t\t\t\t$ip6t_m -A PSW2 $(comment \"${comment_l}\") -p tcp -i lo -j RETURN\n\t\t\t\tinsert_rule_before \"$ip6t_m\" \"OUTPUT\" \"mwan3\" \"$(comment mangle-OUTPUT-PSW2) -p tcp -j PSW2_OUTPUT\"\n\t\t\t}\n\n\t\t\t[ -d \"${TMP_IFACE_PATH}\" ] && {\n\t\t\t\tfor iface in $(ls ${TMP_IFACE_PATH}); do\n\t\t\t\t\t$ipt_n -A PSW2_OUTPUT -o $iface -p tcp -j RETURN\n\t\t\t\t\t$ipt_m -A PSW2_OUTPUT -o $iface -p tcp -j RETURN\n\t\t\t\tdone\n\t\t\t}\n\t\tfi\n\n\t\t# Loading local router proxy UDP\n\t\tif [ -n \"$NODE\" ] && [ \"$UDP_LOCALHOST_PROXY\" = \"1\" ]; then\n\t\t\t$ipt_m -I PSW2_OUTPUT -p udp $(dst $IPSET_PROXY_LAN) -j PSW2_RULE\n\t\t\t$ipt_m -A PSW2_OUTPUT -p udp -d $FAKE_IP -j PSW2_RULE\n\t\t\tadd_shunt_t_rule \"${SHUNT_LIST4}\" \"$ipt_m -A PSW2_OUTPUT -p udp\" \"-j PSW2_RULE\" $UDP_REDIR_PORTS\n\t\t\tadd_port_rules \"$ipt_m -A PSW2_OUTPUT -p udp\" $UDP_REDIR_PORTS \"-j PSW2_RULE\"\n\t\t\t$ipt_m -I PSW2 $(comment \"${comment_l}\") -p udp -i lo $(dst $IPSET_PROXY_LAN) $(REDIRECT $REDIR_PORT TPROXY)\n\t\t\t$ipt_m -A PSW2 $(comment \"${comment_l}\") -p udp -i lo $(REDIRECT $REDIR_PORT TPROXY)\n\t\t\t$ipt_m -A PSW2 $(comment \"${comment_l}\") -p udp -i lo -j RETURN\n\t\t\tinsert_rule_before \"$ipt_m\" \"OUTPUT\" \"mwan3\" \"$(comment mangle-OUTPUT-PSW2) -p udp -j PSW2_OUTPUT\"\n\n\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t$ip6t_m -I PSW2_OUTPUT -p udp $(dst $IPSET_PROXY_LAN6) -j PSW2_RULE\n\t\t\t\t$ip6t_m -A PSW2_OUTPUT -p udp -d $FAKE_IP_6 -j PSW2_RULE\n\t\t\t\tadd_shunt_t_rule \"${SHUNT_LIST6}\" \"$ip6t_m -A PSW2_OUTPUT -p udp\" \"-j PSW2_RULE\" $UDP_REDIR_PORTS\n\t\t\t\tadd_port_rules \"$ip6t_m -A PSW2_OUTPUT -p udp\" $UDP_REDIR_PORTS \"-j PSW2_RULE\"\n\t\t\t\t$ip6t_m -I PSW2 $(comment \"${comment_l}\") -p udp -i lo $(dst $IPSET_PROXY_LAN6) $(REDIRECT $REDIR_PORT TPROXY)\n\t\t\t\t$ip6t_m -A PSW2 $(comment \"${comment_l}\") -p udp -i lo $(REDIRECT $REDIR_PORT TPROXY)\n\t\t\t\t$ip6t_m -A PSW2 $(comment \"${comment_l}\") -p udp -i lo -j RETURN\n\t\t\t\tinsert_rule_before \"$ip6t_m\" \"OUTPUT\" \"mwan3\" \"$(comment mangle-OUTPUT-PSW2) -p udp -j PSW2_OUTPUT\"\n\t\t\t}\n\n\t\t\t[ -d \"${TMP_IFACE_PATH}\" ] && {\n\t\t\t\tfor iface in $(ls ${TMP_IFACE_PATH}); do\n\t\t\t\t\t$ipt_n -A PSW2_OUTPUT -o $iface -p udp -j RETURN\n\t\t\t\t\t$ipt_m -A PSW2_OUTPUT -o $iface -p udp -j RETURN\n\t\t\t\tdone\n\t\t\t}\n\t\tfi\n\t\t\n\t\t$ipt_m -I OUTPUT $(comment \"mangle-OUTPUT-PSW2\") -o lo -j RETURN\n\t\tinsert_rule_before \"$ipt_m\" \"OUTPUT\" \"mwan3\" \"$(comment mangle-OUTPUT-PSW2) -m mark --mark ${FWMARK} -j RETURN\"\n\t\t\n\t\t$ip6t_m -I OUTPUT $(comment \"mangle-OUTPUT-PSW2\") -o lo -j RETURN\n\t\tinsert_rule_before \"$ip6t_m\" \"OUTPUT\" \"mwan3\" \"$(comment mangle-OUTPUT-PSW2) -m mark --mark ${FWMARK} -j RETURN\"\n\n\t\t$ipt_m -A PSW2 -p udp --dport 53 -j RETURN\n\t\t$ip6t_m -A PSW2 -p udp --dport 53 -j RETURN\n\t}\n\n\tload_acl\n\n\tfilter_direct_node_list > /dev/null 2>&1 &\n\n\t[ -z \"${IPT_N}\" ] && {\n\t\tfor chain in \"PSW2\" \"PSW2_OUTPUT\"; do\n\t\t\t$ipt_n -F $chain 2>/dev/null\n\t\t\t$ipt_n -X $chain 2>/dev/null\n\t\tdone\n\t}\n\t[ -z \"${IP6T_N}\" ] && {\n\t\tfor chain in \"PSW2\" \"PSW2_OUTPUT\"; do\n\t\t\t$ip6t_n -F $chain 2>/dev/null\n\t\t\t$ip6t_n -X $chain 2>/dev/null\n\t\tdone\n\t}\n\n\tlog_i18n 0 \"%s firewall rules load complete!\" \"iptables\"\n}\n\ndel_firewall_rule() {\n\tfor ipt in \"$ipt_n\" \"$ipt_m\" \"$ip6t_n\" \"$ip6t_m\"; do\n\t\tfor chain in \"PREROUTING\" \"OUTPUT\"; do\n\t\t\tfor i in $(seq 1 $($ipt -nL $chain | grep -c PSW2)); do\n\t\t\t\tlocal index=$($ipt --line-number -nL $chain | grep PSW2 | head -1 | awk '{print $1}')\n\t\t\t\t$ipt -D $chain $index 2>/dev/null\n\t\t\tdone\n\t\tdone\n\t\tfor chain in \"PSW2\" \"PSW2_OUTPUT\" \"PSW2_DIVERT\" \"PSW2_DNS\" \"PSW2_RULE\"; do\n\t\t\t$ipt -F $chain 2>/dev/null\n\t\t\t$ipt -X $chain 2>/dev/null\n\t\tdone\n\tdone\n\n\tip rule del fwmark ${FWMARK} 2>/dev/null\n\tip route del local 0.0.0.0/0 dev lo table 999 2>/dev/null\n\n\tip -6 rule del fwmark ${FWMARK} 2>/dev/null\n\tip -6 route del local ::/0 dev lo table 999 2>/dev/null\n\n\tlog_i18n 0 \"Delete %s rules is complete.\" \"iptables\"\n}\n\nflush_ipset() {\n\tlog_i18n 0 \"Clear %s.\" \"IPSet\"\n\tfor _name in $(ipset list | grep \"Name: \" | grep \"passwall2_\" | awk '{print $2}'); do\n\t\tdestroy_ipset ${_name}\n\tdone\n}\n\nflush_include() {\n\techo '#!/bin/sh' >$FWI\n}\n\ngen_include() {\n\tflush_include\n\textract_rules() {\n\t\tlocal _ipt=\"${ipt}\"\n\t\t[ \"$1\" == \"6\" ] && _ipt=\"${ip6t}\"\n\t\t[ -z \"${_ipt}\" ] && return\n\n\t\techo \"*$2\"\n\t\t${_ipt}-save -t $2 | grep \"PSW2\" | grep -v \"\\-j PSW2$\" | grep -v \"socket \\-j PSW2_DIVERT$\" | sed -e \"s/^-A \\(OUTPUT\\|PREROUTING\\)/-I \\1 1/\"\n\t\techo 'COMMIT'\n\t}\n\tlocal __ipt=\"\"\n\t[ -n \"${ipt}\" ] && {\n\t\t__ipt=$(cat <<- EOF\n\t\t\t${MY_PATH} update_wan_sets\n\t\t\t$ipt-save -c | grep -v \"PSW2\" | $ipt-restore -c\n\t\t\t$ipt-restore -n <<-EOT\n\t\t\t$(extract_rules 4 nat)\n\t\t\t$(extract_rules 4 mangle)\n\t\t\tEOT\n\n\t\t\t[ \"$accept_icmp\" = \"1\" ] && \\$(${MY_PATH} insert_rule_after \"$ipt_n\" \"PREROUTING\" \"prerouting_rule\" \"-p icmp -j PSW2\")\n\t\t\t[ -z \"${is_tproxy}\" ] && \\$(${MY_PATH} insert_rule_after \"$ipt_n\" \"PREROUTING\" \"prerouting_rule\" \"-p tcp -j PSW2\")\n\n\t\t\t\\$(${MY_PATH} insert_rule_before \"$ipt_m\" \"PREROUTING\" \"mwan3\" \"-j PSW2\")\n\t\t\t\\$(${MY_PATH} insert_rule_before \"$ipt_m\" \"PREROUTING\" \"PSW2\" \"-p tcp -m socket -j PSW2_DIVERT\")\n\t\tEOF\n\t\t)\n\t}\n\tlocal __ip6t=\"\"\n\t[ -n \"${ip6t}\" ] && {\n\t\t__ip6t=$(cat <<- EOF\n\t\t\t${MY_PATH} update_wan_sets\n\t\t\t$ip6t-save -c | grep -v \"PSW2\" | $ip6t-restore -c\n\t\t\t$ip6t-restore -n <<-EOT\n\t\t\t$(extract_rules 6 nat)\n\t\t\t$(extract_rules 6 mangle)\n\t\t\tEOT\n\n\t\t\t[ \"$accept_icmpv6\" = \"1\" ] && $ip6t_n -A PREROUTING -p ipv6-icmp -j PSW2\n\n\t\t\t\\$(${MY_PATH} insert_rule_before \"$ip6t_m\" \"PREROUTING\" \"mwan3\" \"-j PSW2\")\n\t\t\t\\$(${MY_PATH} insert_rule_before \"$ip6t_m\" \"PREROUTING\" \"PSW2\" \"-p tcp -m socket -j PSW2_DIVERT\")\n\t\tEOF\n\t\t)\n\t}\n\tcat <<-EOF >> $FWI\n\t\t${__ipt}\n\n\t\t${__ip6t}\n\t\t\n\t\treturn 0\n\tEOF\n\treturn 0\n}\n\nget_ipt_bin() {\n\techo $ipt\n}\n\nget_ip6t_bin() {\n\techo $ip6t\n}\n\nstart() {\n\t[ \"$ENABLED_DEFAULT_ACL\" == 0 -a \"$ENABLED_ACLS\" == 0 ] && return\n\tadd_firewall_rule\n\tgen_include\n}\n\nstop() {\n\t[ -z \"$(command -v log_i18n)\" ] && . /usr/share/passwall2/utils.sh\n\tdel_firewall_rule\n\tdestroy_ipset $IPSET_PROXY_LAN\n\tdestroy_ipset $IPSET_PROXY_LAN6\n\t[ $(config_t_get global flush_set \"0\") = \"1\" ] && {\n\t\tuci -q delete ${CONFIG}.@global[0].flush_set\n\t\tuci -q commit ${CONFIG}\n\t\tflush_ipset\n\t\trm -rf $TMP_PATH2/singbox*\n\t\trm -rf $TMP_PATH2/geo_output\n\t}\n\tflush_include\n}\n\narg1=$1\nshift\ncase $arg1 in\nRULE_LAST_INDEX)\n\tRULE_LAST_INDEX \"$@\"\n\t;;\ninsert_rule_before)\n\tinsert_rule_before \"$@\"\n\t;;\ninsert_rule_after)\n\tinsert_rule_after \"$@\"\n\t;;\nget_ipt_bin)\n\tget_ipt_bin\n\t;;\nget_ip6t_bin)\n\tget_ip6t_bin\n\t;;\nfilter_direct_node_list)\n\tfilter_direct_node_list\n\t;;\nupdate_wan_sets)\n\tupdate_wan_sets \"$@\"\n\t;;\nstop)\n\tstop\n\t;;\nstart)\n\tstart\n\t;;\n*) ;;\nesac\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/passwall2/lease2hosts.sh",
    "content": "#!/bin/sh\n# dhcp.leases to hosts\n\n. /usr/share/passwall2/utils.sh\nLOCK_FILE=${LOCK_PATH}/${CONFIG}_lease2hosts.lock\nLEASE_FILE=\"/tmp/dhcp.leases\"\nHOSTS_FILE=\"$TMP_PATH2/dhcp-hosts\"\nTMP_FILE=\"/tmp/dhcp-hosts.tmp\"\n\nexec 99>\"$LOCK_FILE\"\nflock -n 99\nif [ \"$?\" != 0 ]; then\n\texit 0\nfi\n\nreload_dnsmasq_pids() {\n\tlocal pidfile pid\n\tfind $TMP_PATH/acl -type f -name 'dnsmasq.pid' 2>/dev/null | while read pidfile; do\n\t\tif [ -s \"$pidfile\" ]; then\n\t\t\tread pid < \"$pidfile\"\n\t\t\tif [ -n \"$pid\" ] && kill -0 \"$pid\" 2>/dev/null; then\n\t\t\t\tkill -HUP \"$pid\"\n\t\t\tfi\n\t\tfi\n\tdone\n}\n\nwhile true; do\n\n\tif [ -f \"$LEASE_FILE\" ]; then\n\t\tawk 'NF >= 4 && $4 != \"*\" {print $3\" \"$4}' \"$LEASE_FILE\" | sort > \"$TMP_FILE\"\n\t\tif [ -s \"$TMP_FILE\" ]; then\n\t\t\tif [ ! -f \"$HOSTS_FILE\" ] || ! cmp -s \"$TMP_FILE\" \"$HOSTS_FILE\"; then\n\t\t\t\tmv \"$TMP_FILE\" \"$HOSTS_FILE\"\n\t\t\t\treload_dnsmasq_pids\n\t\t\telse\n\t\t\t\trm -f \"$TMP_FILE\"\n\t\t\tfi\n\t\telse\n\t\t\tif [ -s \"$HOSTS_FILE\" ]; then\n\t\t\t\t: > \"$HOSTS_FILE\"\n\t\t\t\treload_dnsmasq_pids\n\t\t\tfi\n\t\t\trm -f \"$TMP_FILE\"\n\t\tfi\n\tfi\n\n\tsleep 60\n\ndone 2>/dev/null\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/passwall2/monitor.sh",
    "content": "#!/bin/sh\n\n. /usr/share/passwall2/utils.sh\nLOCK_FILE=${LOCK_PATH}/${CONFIG}_monitor.lock\n\nENABLED=$(config_t_get global enabled 0)\n[ \"$ENABLED\" != 1 ] && return 1\nENABLED=$(config_t_get global_delay start_daemon 0)\n[ \"$ENABLED\" != 1 ] && return 1\nsleep 58s\nwhile [ \"$ENABLED\" -eq 1 ]; do\n\t[ -f \"$LOCK_FILE\" ] && {\n\t\tsleep 6s\n\t\tcontinue\n\t}\n\ttouch $LOCK_FILE\n\t[ -d ${TMP_SCRIPT_FUNC_PATH} ] && {\n\t\tfor filename in $(ls ${TMP_SCRIPT_FUNC_PATH} | grep -v \"^_\"); do\n\t\t\tcmd=$(cat ${TMP_SCRIPT_FUNC_PATH}/${filename})\n\t\t\tcmd_check=$(echo $cmd | awk -F '>' '{print $1}')\n\t\t\ticount=$(pgrep -f \"$(echo $cmd_check)\" | wc -l)\n\t\t\tif [ $icount = 0 ]; then\n\t\t\t\t#echo \"${cmd} crashed, restarting.\" >> /tmp/log/passwall2.log\n\t\t\t\teval $(echo \"nohup ${cmd} 2>&1 &\") >/dev/null 2>&1 &\n\t\t\tfi\n\t\tdone\n\t}\n\t\n\trm -f $LOCK_FILE\n\tsleep 58s\ndone\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/passwall2/nftables.sh",
    "content": "#!/bin/sh\n\nDIR=\"$(cd \"$(dirname \"$0\")\" && pwd)\"\nMY_PATH=$DIR/nftables.sh\nUTILS_PATH=$DIR/utils.sh\nNFTABLE_NAME=\"inet passwall2\"\nNFTSET_LOCAL=\"passwall2_local\"\nNFTSET_PROXY_LAN=\"passwall2_proxy_lan\"\nNFTSET_LAN=\"passwall2_lan\"\nNFTSET_VPS=\"passwall2_vps\"\nNFTSET_WAN=\"passwall2_wan\"\n\nNFTSET_LOCAL6=\"passwall2_local6\"\nNFTSET_PROXY_LAN6=\"passwall2_proxy_lan6\"\nNFTSET_LAN6=\"passwall2_lan6\"\nNFTSET_VPS6=\"passwall2_vps6\"\nNFTSET_WAN6=\"passwall2_wan6\"\n\nFWMARK=\"0x50535732\"\n\nFWI=$(uci -q get firewall.passwall2.path 2>/dev/null)\nFAKE_IP=\"198.18.0.0/16\"\nFAKE_IP_6=\"fc00::/18\"\n\nfactor() {\n\tlocal ports=\"$1\"\n\tif [ -z \"$1\" ] || [ -z \"$2\" ] || [ \"$ports\" = \"1:65535\" ]; then\n\t\techo \"\"\n\t# acl mac address\n\telif echo \"$1\" | grep -qE '([A-Fa-f0-9]{2}:){5}[A-Fa-f0-9]{2}'; then\n\t\techo \"$2 {$1}\"\n\telse\n\t\tports=$(echo \"$ports\" | tr -d ' ' | sed 's/:/-/g' | tr ',' '\\n' | awk '!a[$0]++' | grep -v '^$')\n\t\t[ -z \"$ports\" ] && { echo \"\"; return; }\n\t\tif echo \"$ports\" | grep -q '^1-65535$'; then\n\t\t\techo \"\"\n\t\t\treturn\n\t\tfi\n\t\tlocal port\n\t\tlocal port_list=\"\"\n\t\tfor port in $ports; do\n\t\t\tport_list=\"${port_list},$port\"\n\t\tdone\n\t\tport_list=\"${port_list#,}\"\n\t\techo \"$2 {$port_list}\"\n\tfi\n}\n\ninsert_rule_before() {\n\t[ $# -ge 4 ] || {\n\t\treturn 1\n\t}\n\tlocal table_name=\"${1}\"; shift\n\tlocal chain_name=\"${1}\"; shift\n\tlocal keyword=\"${1}\"; shift\n\tlocal rule=\"${1}\"; shift\n\tlocal default_index=\"${1}\"; shift\n\tdefault_index=${default_index:-0}\n\tlocal _index=$(nft -a list chain $table_name $chain_name 2>/dev/null | grep \"$keyword\" | awk -F '# handle ' '{print$2}' | head -n 1 | awk '{print $1}')\n\tif [ -z \"${_index}\" ] && [ \"${default_index}\" = \"0\" ]; then\n\t\tnft \"add rule $table_name $chain_name $rule\"\n\telse\n\t\tif [ -z \"${_index}\" ]; then\n\t\t\t_index=${default_index}\n\t\tfi\n\t\tnft \"insert rule $table_name $chain_name position $_index $rule\"\n\tfi\n}\n\ninsert_rule_after() {\n\t[ $# -ge 4 ] || {\n\t\treturn 1\n\t}\n\tlocal table_name=\"${1}\"; shift\n\tlocal chain_name=\"${1}\"; shift\n\tlocal keyword=\"${1}\"; shift\n\tlocal rule=\"${1}\"; shift\n\tlocal default_index=\"${1}\"; shift\n\tdefault_index=${default_index:-0}\n\tlocal _index=$(nft -a list chain $table_name $chain_name 2>/dev/null | grep \"$keyword\" | awk -F '# handle ' '{print$2}' | head -n 1 | awk '{print $1}')\n\tif [ -z \"${_index}\" ] && [ \"${default_index}\" = \"0\" ]; then\n\t\tnft \"add rule $table_name $chain_name $rule\"\n\telse\n\t\tif [ -n \"${_index}\" ]; then\n\t\t\t_index=$((_index + 1))\n\t\telse\n\t\t\t_index=${default_index}\n\t\tfi\n\t\tnft \"insert rule $table_name $chain_name position $_index $rule\"\n\tfi\n}\n\nRULE_LAST_INDEX() {\n\t[ $# -ge 3 ] || {\n\t\tlog_i18n 1 \"Incorrect index listing method (%s), execution terminated!\" \"nftables\"\n\t\treturn 1\n\t}\n\tlocal table_name=\"${1}\"; shift\n\tlocal chain_name=\"${1}\"; shift\n\tlocal keyword=\"${1}\"; shift\n\tlocal default=\"${1:-0}\"; shift\n\tlocal _index=$(nft -a list chain $table_name $chain_name 2>/dev/null | grep \"$keyword\" | awk -F '# handle ' '{print$2}' | head -n 1 | awk '{print $1}')\n\techo \"${_index:-${default}}\"\n}\n\nREDIRECT() {\n\tlocal s=\"counter redirect\"\n\t[ -n \"$1\" ] && {\n\t\tlocal s=\"$s to :$1\"\n\t\t[ \"$2\" == \"TPROXY\" ] && {\n\t\t\ts=\"counter meta mark ${FWMARK} tproxy to :$1\"\n\t\t}\n\t\t[ \"$2\" == \"TPROXY4\" ] && {\n\t\t\ts=\"counter meta mark ${FWMARK} tproxy ip to :$1\"\n\t\t}\n\t\t[ \"$2\" == \"TPROXY6\" ] && {\n\t\t\ts=\"counter meta mark ${FWMARK} tproxy ip6 to :$1\"\n\t\t}\n\n\t}\n\techo $s\n}\n\ndestroy_nftset() {\n\tfor i in \"$@\"; do\n\t\tnft flush set $NFTABLE_NAME $i 2>/dev/null\n\t\tnft delete set $NFTABLE_NAME $i 2>/dev/null\n\tdone\n}\n\ngen_nft_tables() {\n\tif ! nft list table \"$NFTABLE_NAME\" >/dev/null 2>&1; then\n\t\tnft -f - <<-EOF\n\t\ttable $NFTABLE_NAME {\n\t\t\tchain dstnat {\n\t\t\t\ttype nat hook prerouting priority dstnat - 1; policy accept;\n\t\t\t}\n\t\t\tchain mangle_prerouting {\n\t\t\t\ttype filter hook prerouting priority mangle - 1; policy accept;\n\t\t\t}\n\t\t\tchain mangle_output {\n\t\t\t\ttype route hook output priority mangle - 1; policy accept;\n\t\t\t}\n\t\t\tchain nat_output {\n\t\t\t\ttype nat hook output priority -1; policy accept;\n\t\t\t}\n\t\t}\n\t\tEOF\n\tfi\n}\n\ninsert_nftset() {\n\tlocal nftset_name=\"${1}\"; shift\n\tlocal timeout_argument=\"${1}\"; shift\n\tlocal default_timeout=\"365d\"\n\tlocal suffix=\"\"\n\n\tif [ -n \"$nftset_name\" ] && { [ $# -gt 0 ] || [ ! -t 0 ]; }; then\n\t\tcase \"$timeout_argument\" in\n\t\t\t\"-1\") suffix=\"\" ;;\n\t\t\t \"0\") suffix=\" timeout $default_timeout\" ;;\n\t\t\t   *) suffix=\" timeout $timeout_argument\" ;;\n\t\tesac\n\t\t{\n\t\t\tif [ $# -gt 0 ]; then\n\t\t\t\tprintf \"%s\\n\" \"$@\"\n\t\t\telse\n\t\t\t\tcat\n\t\t\tfi | tr -s ' \\t' '\\n' | awk -v s=\"$suffix\" -v n=\"$nftset_name\" -v t=\"$NFTABLE_NAME\" '\n\t\t\t\t{\n\t\t\t\t\tgsub(/^[ \\t\\r]+|[ \\t\\r]+$/, \"\");\n\t\t\t\t}\n\t\t\t\t$0 != \"\" {\n\t\t\t\t\tif (first == 0) {\n\t\t\t\t\t\tprintf \"add element %s %s { \\n\", t, n;\n\t\t\t\t\t\tfirst = 1;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprintf \",\\n\";\n\t\t\t\t\t}\n\t\t\t\t\tprintf \"%s%s\", $0, s;\n\t\t\t\t}\n\t\t\t\tEND {\n\t\t\t\t\tif (first == 1) printf \"\\n }\\n\";\n\t\t\t\t}\n\t\t\t'\n\t\t} | nft -f -\n\tfi\n}\n\ngen_nftset() {\n\tlocal nftset_name=\"${1}\"; shift\n\tlocal ip_type=\"${1}\"; shift\n\t#  0 - don't set defalut timeout\n\tlocal timeout_argument_set=\"${1}\"; shift\n\t#  0 - don't let element timeout(365 days) when set's timeout parameters be seted\n\t# -1 - follow the set's timeout parameters\n\tlocal timeout_argument_element=\"${1}\"; shift\n\tlocal gc_interval_time=\"1h\"\n\n\tif ! nft list set $NFTABLE_NAME $nftset_name >/dev/null 2>&1; then\n\t\tif [ \"$timeout_argument_set\" == \"0\" ]; then\n\t\t\tnft \"add set $NFTABLE_NAME $nftset_name { type $ip_type; flags interval, timeout; auto-merge; }\"\n\t\telse\n\t\t\tnft \"add set $NFTABLE_NAME $nftset_name { type $ip_type; flags interval, timeout; timeout $timeout_argument_set; gc-interval $gc_interval_time; auto-merge; }\"\n\t\tfi\n\tfi\n\t[ $# -gt 0 ] || [ ! -t 0 ] && insert_nftset \"$nftset_name\" \"$timeout_argument_element\" \"$@\"\n}\n\ngen_shunt_list() {\n\tlocal node=${1}\n\tlocal shunt_list4_var_name=${2}\n\tlocal shunt_list6_var_name=${3}\n\t[ -z \"$node\" ] && continue\n\tunset ${shunt_list4_var_name}\n\tunset ${shunt_list6_var_name}\n\tlocal _SHUNT_LIST4 _SHUNT_LIST6\n\tlocal USE_SHUNT_NODE=0\n\tNODE_PROTOCOL=$(config_n_get $node protocol)\n\t[ \"$NODE_PROTOCOL\" = \"_shunt\" ] && USE_SHUNT_NODE=1\n\t[ \"$USE_SHUNT_NODE\" = \"1\" ] && {\n\t\tlocal enable_geoview_ip=$(config_n_get $node enable_geoview_ip 0)\n\t\t[ -z \"$(first_type geoview)\" ] && enable_geoview_ip=0\n\t\tlocal preloading=0\n\t\tpreloading=$enable_geoview_ip\n\t\t[ \"${preloading}\" = \"1\" ] && {\n\t\t\tlocal default_node=$(config_n_get ${node} default_node _direct)\n\t\t\tlocal default_outbound=\"redirect\"\n\t\t\t[ \"$default_node\" = \"_direct\" ] && default_outbound=\"direct\"\n\t\t\tlocal shunt_ids=$(uci show $CONFIG | grep \"=shunt_rules\" | awk -F '.' '{print $2}' | awk -F '=' '{print $1}')\n\t\t\tfor shunt_id in $shunt_ids; do\n\t\t\t\tlocal shunt_node=$(config_n_get ${node} \"${shunt_id}\")\n\t\t\t\t[ -n \"$shunt_node\" ] && {\n\t\t\t\t\tlocal nftset_v4=\"passwall2_${node}_${shunt_id}\"\n\t\t\t\t\tlocal nftset_v6=\"passwall2_${node}_${shunt_id}6\"\n\t\t\t\t\tgen_nftset $nftset_v4 ipv4_addr 0 0\n\t\t\t\t\tgen_nftset $nftset_v6 ipv6_addr 0 0\n\t\t\t\t\tlocal outbound=\"redirect\"\n\t\t\t\t\t[ \"$shunt_node\" = \"_direct\" ] && outbound=\"direct\"\n\t\t\t\t\t[ \"$shunt_node\" = \"_default\" ] && outbound=\"${default_outbound}\"\n\t\t\t\t\t_SHUNT_LIST4=\"${_SHUNT_LIST4} ${nftset_v4}:${outbound}\"\n\t\t\t\t\t_SHUNT_LIST6=\"${_SHUNT_LIST6} ${nftset_v6}:${outbound}\"\n\t\t\t\t\tconfig_n_get $shunt_id ip_list | tr -s \"\\r\\n\" \"\\n\" | sed -e \"/^$/d\" | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | insert_nftset $nftset_v4 \"0\"\n\t\t\t\t\tconfig_n_get $shunt_id ip_list | tr -s \"\\r\\n\" \"\\n\" | sed -e \"/^$/d\" | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | insert_nftset $nftset_v6 \"0\"\n\t\t\t\t\t[ \"${enable_geoview_ip}\" = \"1\" ] && {\n\t\t\t\t\t\tlocal _geoip_code=$(config_n_get $shunt_id ip_list | tr -s \"\\r\\n\" \"\\n\" | sed -e \"/^$/d\" | grep -E \"^geoip:\" | grep -v \"^geoip:private\" | sed -E 's/^geoip:(.*)/\\1/' | sed ':a;N;$!ba;s/\\n/,/g')\n\t\t\t\t\t\t[ -n \"$_geoip_code\" ] && {\n\t\t\t\t\t\t\tget_geoip $_geoip_code ipv4 | grep -E \"(\\.((2(5[0-5]|[0-4][0-9]))|[0-1]?[0-9]{1,2})){3}\" | insert_nftset $nftset_v4 \"0\"\n\t\t\t\t\t\t\tget_geoip $_geoip_code ipv6 | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | insert_nftset $nftset_v6 \"0\"\n\t\t\t\t\t\t\tlog 1 \"$(i18n \"parse the traffic splitting rules[%s]-[geoip:%s] add to %s to complete.\" \"${shunt_id}\" \"${_geoip_code}\" \"NFTSET\")\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\tdone\n\t\t}\n\t\tlocal direct_nftset4=$(get_cache_var \"node_${node}_direct_nftset4\")\n\t\t[ -n \"${direct_nftset4}\" ] && {\n\t\t\tgen_nftset $direct_nftset4 ipv4_addr 0 0\n\t\t\t_SHUNT_LIST4=\"${_SHUNT_LIST4} ${direct_nftset4}:direct\"\n\t\t}\n\t\tlocal direct_nftset6=$(get_cache_var \"node_${node}_direct_nftset6\")\n\t\t[ -n \"${direct_nftset6}\" ] && {\n\t\t\tgen_nftset $direct_nftset6 ipv6_addr 0 0\n\t\t\t_SHUNT_LIST6=\"${_SHUNT_LIST6} ${direct_nftset6}:direct\"\n\t\t}\n\t\t[ \"${preloading}\" = \"1\" ] && [ -n \"$default_node\" ] && {\n\t\t\tlocal nftset_v4=\"passwall2_${node}_default\"\n\t\t\tlocal nftset_v6=\"passwall2_${node}_default6\"\n\t\t\tgen_nftset $nftset_v4 ipv4_addr 0 0\n\t\t\tgen_nftset $nftset_v6 ipv6_addr 0 0\n\t\t\t_SHUNT_LIST4=\"${_SHUNT_LIST4} ${nftset_v4}:${default_outbound}\"\n\t\t\t_SHUNT_LIST6=\"${_SHUNT_LIST6} ${nftset_v6}:${default_outbound}\"\n\t\t}\n\t}\n\t[ -n \"${_SHUNT_LIST4}\" ] && eval ${shunt_list4_var_name}=\\\"${_SHUNT_LIST4}\\\"\n\t[ -n \"${_SHUNT_LIST6}\" ] && eval ${shunt_list6_var_name}=\\\"${_SHUNT_LIST6}\\\"\n}\n\nadd_shunt_t_rule() {\n\tlocal shunt_args=${1}\n\tlocal t_args=${2}\n\tlocal t_jump_args=${3}\n\tlocal t_comment=${4}\n\t[ -n \"${shunt_args}\" ] && {\n\t\t[ -n \"${t_comment}\" ] && t_comment=\"comment \\\"$t_comment\\\"\"\n\t\tfor j in ${shunt_args}; do\n\t\t\tlocal _set_name=$(echo ${j} | awk -F ':' '{print $1}')\n\t\t\tlocal _outbound=$(echo ${j} | awk -F ':' '{print $2}')\n\t\t\t[ -n \"${_set_name}\" ] && [ -n \"${_outbound}\" ] && {\n\t\t\t\tlocal _t_arg=\"${t_jump_args}\"\n\t\t\t\t[ \"${_outbound}\" = \"direct\" ] && _t_arg=\"counter return\"\n\t\t\t\t${t_args} @${_set_name} ${_t_arg} ${t_comment}\n\t\t\t}\n\t\tdone\n\t}\n}\n\nload_acl() {\n\t[ \"$ENABLED_ACLS\" == 1 ] && {\n\t\tlog_i18n 1 \"Access Control:\"\n\t\tacl_app\n\t\tfor sid in $(ls -F ${TMP_ACL_PATH} | grep '/$' | awk -F '/' '{print $1}' | grep -v 'default'); do\n\t\t\teval $(uci -q show \"${CONFIG}.${sid}\" | cut -d'.' -sf 3-)\n\n\t\t\ttcp_no_redir_ports=${tcp_no_redir_ports:-default}\n\t\t\tudp_no_redir_ports=${udp_no_redir_ports:-default}\n\t\t\ttcp_proxy_mode=\"global\"\n\t\t\tudp_proxy_mode=\"global\"\n\t\t\ttcp_redir_ports=${tcp_redir_ports:-default}\n\t\t\tudp_redir_ports=${udp_redir_ports:-default}\n\t\t\tnode=${node:-default}\n\t\t\t[ \"$tcp_no_redir_ports\" = \"default\" ] && tcp_no_redir_ports=$TCP_NO_REDIR_PORTS\n\t\t\t[ \"$udp_no_redir_ports\" = \"default\" ] && udp_no_redir_ports=$UDP_NO_REDIR_PORTS\n\t\t\t[ \"$tcp_redir_ports\" = \"default\" ] && tcp_redir_ports=$TCP_REDIR_PORTS\n\t\t\t[ \"$udp_redir_ports\" = \"default\" ] && udp_redir_ports=$UDP_REDIR_PORTS\n\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_node\")\" ] && node=$(get_cache_var \"ACL_${sid}_node\")\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_redir_port\")\" ] && redir_port=$(get_cache_var \"ACL_${sid}_redir_port\")\n\t\t\t[ -n \"$(get_cache_var \"ACL_${sid}_dns_port\")\" ] && dns_redirect_port=$(get_cache_var \"ACL_${sid}_dns_port\")\n\t\t\t[ -n \"$node\" ] && node_remark=$(config_n_get $node remarks)\n\n\t\t\tif [ -n \"$(get_cache_var \"ACL_${sid}_default\")\" ]; then\n\t\t\t\tshunt_list4=${SHUNT_LIST4}\n\t\t\t\tshunt_list6=${SHUNT_LIST6}\n\t\t\telse\n\t\t\t\t# Shunt rules IP list (import when use shunt node)\n\t\t\t\tgen_shunt_list \"${node}\" shunt_list4 shunt_list6\n\t\t\tfi\n\n\t\t\t_acl_list=${TMP_ACL_PATH}/${sid}/source_list\n\n\t\t\tfor i in $(cat $_acl_list); do\n\t\t\t\tlocal _ipt_source _ipv4\n\t\t\t\tlocal msg\n\t\t\t\tif [ -n \"${interface}\" ]; then\n\t\t\t\t\tlocal gateway device\n\t\t\t\t\tnetwork_get_gateway gateway \"${interface}\"\n\t\t\t\t\tnetwork_get_device device \"${interface}\"\n\t\t\t\t\t# network_get_device returns empty for non-UP interfaces (e.g. auto='0').\n\t\t\t\t\t# Try ubus directly, then check if the name is a kernel device.\n\t\t\t\t\t[ -z \"${device}\" ] && device=$(ubus call \"network.interface.${interface}\" status 2>/dev/null | jsonfilter -e '@.device' 2>/dev/null)\n\t\t\t\t\t[ -z \"${device}\" ] && [ -d \"/sys/class/net/${interface}\" ] && device=\"${interface}\"\n\t\t\t\t\t[ -z \"${device}\" ] && device=\"${interface}\"\n\t\t\t\t\t_ipt_source=\"iifname ${device} \"\n\t\t\t\t\tmsg=$(i18n \"Source iface [%s],\" \"${device}\")\n\t\t\t\telse\n\t\t\t\t\tmsg=$(i18n \"Source iface [%s],\" $(i18n \"All\"))\n\t\t\t\tfi\n\t\t\t\tif [ -n \"$(echo ${i} | grep '^iprange:')\" ]; then\n\t\t\t\t\t_iprange=$(echo ${i} | sed 's#iprange:##g')\n\t\t\t\t\t_ipt_source=$(factor ${_iprange} \"${_ipt_source}ip saddr\")\n\t\t\t\t\tmsg=\"${msg}$(i18n \"IP range [%s],\" \"${_iprange}\")\"\n\t\t\t\t\t_ipv4=\"1\"\n\t\t\t\t\tunset _iprange\n\t\t\t\telif [ -n \"$(echo ${i} | grep '^ipset:')\" ]; then\n\t\t\t\t\t_ipset=$(echo ${i} | sed 's#ipset:##g')\n\t\t\t\t\t_ipt_source=\"${_ipt_source}ip daddr @${_ipset}\"\n\t\t\t\t\tmsg=\"${msg}Nftset$(i18n \"[%s],\" \"${_ipset}\")\"\n\t\t\t\t\tunset _ipset\n\t\t\t\telif [ -n \"$(echo ${i} | grep '^ip:')\" ]; then\n\t\t\t\t\t_ip=$(echo ${i} | sed 's#ip:##g')\n\t\t\t\t\t_ipt_source=$(factor ${_ip} \"${_ipt_source}ip saddr\")\n\t\t\t\t\tmsg=\"${msg}IP$(i18n \"[%s],\" \"${_ip}\")\"\n\t\t\t\t\t_ipv4=\"1\"\n\t\t\t\t\tunset _ip\n\t\t\t\telif [ -n \"$(echo ${i} | grep '^mac:')\" ]; then\n\t\t\t\t\t_mac=$(echo ${i} | sed 's#mac:##g')\n\t\t\t\t\t_ipt_source=$(factor ${_mac} \"${_ipt_source}ether saddr\")\n\t\t\t\t\tmsg=\"${msg}MAC$(i18n \"[%s],\" \"${_mac}\")\"\n\t\t\t\t\tunset _mac\n\t\t\t\telif [ -n \"$(echo ${i} | grep '^any')\" ]; then\n\t\t\t\t\tmsg=\"${msg}$(i18n \"All device,\")\"\n\t\t\t\telse\n\t\t\t\t\tcontinue\n\t\t\t\tfi\n\t\t\t\tmsg=\"$(i18n \"[%s],\" \"${remarks}\")${msg}\"\n\t\t\t\t\n\t\t\t\t[ \"$tcp_no_redir_ports\" != \"disable\" ] && {\n\t\t\t\t\tif ! has_1_65535 \"$tcp_no_redir_ports\"; then\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME $nft_prerouting_chain ${_ipt_source} ip protocol tcp $(factor $tcp_no_redir_ports \"tcp dport\") counter return comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ \"$_ipv4\" != \"1\" ] && nft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 ${_ipt_source} meta l4proto tcp $(factor $tcp_no_redir_ports \"tcp dport\") counter return comment \\\"$remarks\\\"\"\n\t\t\t\t\t\tlog 2 \"${msg}$(i18n \"not proxy %s port [%s]\" \"TCP\" \"${tcp_no_redir_ports}\")\"\n\t\t\t\t\telse\n\t\t\t\t\t\t# It will return when it ends, so no extra rules are needed.\n\t\t\t\t\t\ttcp_proxy_mode=\"disable\"\n\t\t\t\t\t\tlog 2 \"${msg}$(i18n \"not proxy all %s\" \"TCP\")\"\n\t\t\t\t\tfi\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t[ \"$udp_no_redir_ports\" != \"disable\" ] && {\n\t\t\t\t\tif ! has_1_65535 \"$udp_no_redir_ports\"; then\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_no_redir_ports \"udp dport\") counter return comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ \"$_ipv4\" != \"1\" ] && nft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_no_redir_ports \"udp dport\") counter return comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\tlog 2 \"${msg}$(i18n \"not proxy %s port [%s]\" \"UDP\" \"${udp_no_redir_ports}\")\"\n\t\t\t\t\telse\n\t\t\t\t\t\t# It will return when it ends, so no extra rules are needed.\n\t\t\t\t\t\tudp_proxy_mode=\"disable\"\n\t\t\t\t\t\tlog 2 \"${msg}$(i18n \"not proxy all %s\" \"UDP\")\"\n\t\t\t\t\tfi\n\t\t\t\t}\n\n\t\t\t\tif ([ \"$tcp_proxy_mode\" != \"disable\" ] || [ \"$udp_proxy_mode\" != \"disable\" ]) && [ -n \"$dns_redirect_port\" ]; then\n\t\t\t\t\t[ -n \"$dns_redirect_port\" ] && {\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_DNS ip protocol udp ${_ipt_source} udp dport 53 counter redirect to :$dns_redirect_port comment \\\"$remarks\\\"\"\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_DNS ip protocol tcp ${_ipt_source} tcp dport 53 counter redirect to :$dns_redirect_port comment \\\"$remarks\\\"\"\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_DNS meta l4proto udp ${_ipt_source} udp dport 53 counter redirect to :$dns_redirect_port comment \\\"$remarks\\\"\"\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_DNS meta l4proto tcp ${_ipt_source} tcp dport 53 counter redirect to :$dns_redirect_port comment \\\"$remarks\\\"\"\n\t\t\t\t\t\t[ -z \"$(get_cache_var \"ACL_${sid}_default\")\" ] && log 2 \"${msg}$(i18n \"Using a node that is different from the global configuration, DNS has been forcibly redirected to a dedicated DNS server.\")\"\n\t\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_DNS ip protocol udp ${_ipt_source} udp dport 53 counter return comment \\\"$remarks\\\"\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_DNS ip protocol tcp ${_ipt_source} tcp dport 53 counter return comment \\\"$remarks\\\"\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_DNS meta l4proto udp ${_ipt_source} udp dport 53 counter return comment \\\"$remarks\\\"\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_DNS meta l4proto tcp ${_ipt_source} tcp dport 53 counter return comment \\\"$remarks\\\"\"\n\t\t\t\tfi\n\n\t\t\t\t[ \"$tcp_proxy_mode\" != \"disable\" ] && [ -n \"$redir_port\" ] && {\n\t\t\t\t\tmsg2=\"${msg}$(i18n \"Use the %s node [%s]\" \"TCP\" \"${node_remark}\")\"\n\t\t\t\t\tif [ -n \"${is_tproxy}\" ]; then\n\t\t\t\t\t\tmsg2=\"${msg2}(TPROXY:${redir_port})\"\n\t\t\t\t\t\tnft_chain=\"PSW2_MANGLE\"\n\t\t\t\t\t\tnft_j=\"counter jump PSW2_RULE\"\n\t\t\t\t\telse\n\t\t\t\t\t\tmsg2=\"${msg2}(REDIRECT:${redir_port})\"\n\t\t\t\t\t\tnft_chain=\"PSW2_NAT\"\n\t\t\t\t\t\tnft_j=\"$(REDIRECT $redir_port)\"\n\t\t\t\t\tfi\n\n\t\t\t\t\t[ \"$accept_icmp\" = \"1\" ] && {\n\t\t\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_ICMP_REDIRECT ip protocol icmp ${_ipt_source} ip daddr @$NFTSET_PROXY_LAN $(REDIRECT) comment \\\"$remarks\\\"\"\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT ip protocol icmp ${_ipt_source} ip daddr $FAKE_IP $(REDIRECT) comment \\\"$remarks\\\"\"\n\t\t\t\t\t\tadd_shunt_t_rule \"${shunt_list4}\" \"nft add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT ip protocol icmp ${_ipt_source} ip daddr\" \"$(REDIRECT)\" \"$remarks\"\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT ip protocol icmp ${_ipt_source} $(REDIRECT) comment \\\"$remarks\\\"\"\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT ip protocol icmp ${_ipt_source} return comment \\\"$remarks\\\"\"\n\t\t\t\t\t}\n\n\t\t\t\t\t[ \"$accept_icmpv6\" = \"1\" ] && [ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} ip6 daddr @$NFTSET_PROXY_LAN6 $(REDIRECT) comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} ip6 daddr $FAKE_IP_6 $(REDIRECT) comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\tadd_shunt_t_rule \"${shunt_list6}\" \"nft add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} ip6 daddr\" \"$(REDIRECT)\" \"$remarks\" 2>/dev/null\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} $(REDIRECT) comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT meta l4proto icmpv6 ${_ipt_source} return comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t}\n\n\t\t\t\t\tnft \"insert rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} ip daddr @$NFTSET_PROXY_LAN ${nft_j} comment \\\"$remarks\\\"\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} ip daddr $FAKE_IP ${nft_j} comment \\\"$remarks\\\"\"\n\t\t\t\t\tadd_shunt_t_rule \"${shunt_list4}\" \"nft add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports \"tcp dport\") ip daddr\" \"${nft_j}\" \"$remarks\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp ${_ipt_source} $(factor $tcp_redir_ports \"tcp dport\") ${nft_j} comment \\\"$remarks\\\"\"\n\t\t\t\t\t[ -n \"${is_tproxy}\" ] && nft \"add rule $NFTABLE_NAME PSW2_MANGLE ip protocol tcp ${_ipt_source} $(REDIRECT $redir_port TPROXY4) comment \\\"$remarks\\\"\"\n\n\t\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && [ \"$_ipv4\" != \"1\" ] &&  {\n\t\t\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ${_ipt_source} ip6 daddr @$NFTSET_PROXY_LAN6 counter jump PSW2_RULE comment \\\"$remarks\\\"\"\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ${_ipt_source} ip6 daddr $FAKE_IP_6 counter jump PSW2_RULE comment \\\"$remarks\\\"\"\n\t\t\t\t\t\tadd_shunt_t_rule \"${shunt_list6}\" \"nft add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports \"tcp dport\") ip6 daddr\" \"counter jump PSW2_RULE\" \"$remarks\" 2>/dev/null\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(factor $tcp_redir_ports \"tcp dport\") counter jump PSW2_RULE comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ${_ipt_source} $(REDIRECT $redir_port TPROXY) comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t}\n\t\t\t\t\tlog 2 \"${msg2}\"\n\t\t\t\t}\n\t\t\t\tnft \"add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp ${_ipt_source} counter return comment \\\"$remarks\\\"\"\n\t\t\t\t[ \"$_ipv4\" != \"1\" ] && nft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ${_ipt_source} counter return comment \\\"$remarks\\\"\" 2>/dev/null\n\n\t\t\t\t[ \"$udp_proxy_mode\" != \"disable\" ] && [ -n \"$redir_port\" ] && {\n\t\t\t\t\tmsg2=\"${msg}$(i18n \"Use the %s node [%s]\" \"UDP\" \"${node_remark}\")(TPROXY:${redir_port})\"\n\n\t\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp ${_ipt_source} ip daddr @$NFTSET_PROXY_LAN counter jump PSW2_RULE comment \\\"$remarks\\\"\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp ${_ipt_source} ip daddr $FAKE_IP counter jump PSW2_RULE comment \\\"$remarks\\\"\"\n\t\t\t\t\tadd_shunt_t_rule \"${shunt_list4}\" \"nft add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_redir_ports \"udp dport\") ip daddr\" \"counter jump PSW2_RULE\" \"$remarks\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp ${_ipt_source} $(factor $udp_redir_ports \"udp dport\") counter jump PSW2_RULE comment \\\"$remarks\\\"\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp ${_ipt_source} $(REDIRECT $redir_port TPROXY4) comment \\\"$remarks\\\"\"\n\n\t\t\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && [ \"$_ipv4\" != \"1\" ] && {\n\t\t\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} ip6 daddr @$NFTSET_PROXY_LAN6 counter jump PSW2_RULE comment \\\"$remarks\\\"\"\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} ip6 daddr $FAKE_IP_6 counter jump PSW2_RULE comment \\\"$remarks\\\"\"\n\t\t\t\t\t\tadd_shunt_t_rule \"${shunt_list6}\" \"nft add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports \"udp dport\") ip6 daddr\" \"counter jump PSW2_RULE\" \"$remarks\" 2>/dev/null\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} $(factor $udp_redir_ports \"udp dport\") counter jump PSW2_RULE comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} $(REDIRECT $redir_port TPROXY) comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\t\t}\n\t\t\t\t\tlog 2 \"${msg2}\"\n\t\t\t\t}\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp ${_ipt_source} counter return comment \\\"$remarks\\\"\"\n\t\t\t\t[ \"$_ipv4\" != \"1\" ] && nft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ${_ipt_source} counter return comment \\\"$remarks\\\"\" 2>/dev/null\n\t\t\t\tunset nft_chain nft_j _ipt_source msg msg2 _ipv4\n\t\t\tdone\n\t\t\tunset enabled sid remarks sources tcp_proxy_mode udp_proxy_mode tcp_no_redir_ports udp_no_redir_ports tcp_redir_ports udp_redir_ports node interface\n\t\t\tunset redir_port node_remark _acl_list\n\t\tdone\n\t}\n\n\t[ \"$ENABLED_DEFAULT_ACL\" == 1 ] && [ \"$CLIENT_PROXY\" == 1 ] && {\n\t\tlocal comment=\"$(i18n \"Default\")\"\n\t\tmsg=\"$(i18n \"[%s],\" ${comment})\"\n\n\t\t[ \"$TCP_NO_REDIR_PORTS\" != \"disable\" ] && {\n\t\t\tnft \"add rule $NFTABLE_NAME $nft_prerouting_chain ip protocol tcp $(factor $TCP_NO_REDIR_PORTS \"tcp dport\") counter return comment \\\"${comment}\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp $(factor $TCP_NO_REDIR_PORTS \"tcp dport\") counter return comment \\\"${comment}\\\"\"\n\t\t\tif ! has_1_65535 \"$TCP_NO_REDIR_PORTS\"; then\n\t\t\t\tlog 2 \"${msg}$(i18n \"not proxy %s port [%s]\" \"TCP\" \"${TCP_NO_REDIR_PORTS}\")\"\n\t\t\telse\n\t\t\t\tTCP_PROXY_MODE=\"disable\"\n\t\t\t\tlog 2 \"${msg}$(i18n \"not proxy all %s\" \"TCP\")\"\n\t\t\tfi\n\t\t}\n\n\t\t[ \"$UDP_NO_REDIR_PORTS\" != \"disable\" ] && {\n\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp $(factor $UDP_NO_REDIR_PORTS \"udp dport\") counter return comment \\\"${comment}\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp $(factor $UDP_NO_REDIR_PORTS \"udp dport\") counter return comment \\\"${comment}\\\"\"\n\t\t\tif ! has_1_65535 \"$UDP_NO_REDIR_PORTS\"; then\n\t\t\t\tlog 2 \"${msg}$(i18n \"not proxy %s port [%s]\" \"UDP\" \"${UDP_NO_REDIR_PORTS}\")\"\n\t\t\telse\n\t\t\t\tUDP_PROXY_MODE=\"disable\"\n\t\t\t\tlog 2 \"${msg}$(i18n \"not proxy all %s\" \"UDP\")\"\n\t\t\tfi\n\t\t}\n\n\t\tif ([ \"$TCP_PROXY_MODE\" != \"disable\" ] || [ \"$UDP_PROXY_MODE\" != \"disable\" ]) && [ -n \"$NODE\" ]; then\n\t\t\t[ -n \"$DNS_REDIRECT_PORT\" ] && {\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_DNS ip protocol udp udp dport 53 counter redirect to :$DNS_REDIRECT_PORT comment \\\"${comment}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_DNS ip protocol tcp tcp dport 53 counter redirect to :$DNS_REDIRECT_PORT comment \\\"${comment}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_DNS meta l4proto udp udp dport 53 counter redirect to :$DNS_REDIRECT_PORT comment \\\"${comment}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_DNS meta l4proto tcp tcp dport 53 counter redirect to :$DNS_REDIRECT_PORT comment \\\"${comment}\\\"\"\n\t\t\t}\n\t\tfi\n\n\t\tif [ \"$TCP_PROXY_MODE\" != \"disable\" ] && [ -n \"$NODE\" ]; then\n\t\t\tmsg2=\"${msg}$(i18n \"Use the %s node [%s]\" \"TCP\" \"$(config_n_get $NODE remarks)\")\"\n\t\t\tif [ -n \"${is_tproxy}\" ]; then\n\t\t\t\tmsg2=\"${msg2}(TPROXY:${REDIR_PORT})\"\n\t\t\t\tnft_chain=\"PSW2_MANGLE\"\n\t\t\t\tnft_j=\"counter jump PSW2_RULE\"\n\t\t\telse\n\t\t\t\tmsg2=\"${msg2}(REDIRECT:${REDIR_PORT})\"\n\t\t\t\tnft_chain=\"PSW2_NAT\"\n\t\t\t\tnft_j=\"$(REDIRECT $REDIR_PORT)\"\n\t\t\tfi\n\n\t\t\t[ \"$accept_icmp\" = \"1\" ] && {\n\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_ICMP_REDIRECT ip protocol icmp ip daddr @$NFTSET_PROXY_LAN $(REDIRECT) comment \\\"${comment}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT ip protocol icmp ip daddr $FAKE_IP $(REDIRECT) comment \\\"${comment}\\\"\"\n\t\t\t\tadd_shunt_t_rule \"${SHUNT_LIST4}\" \"nft add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT ip protocol icmp ip daddr\" \"$(REDIRECT)\" \"${comment}\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT ip protocol icmp $(REDIRECT) comment \\\"${comment}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT ip protocol icmp return comment \\\"${comment}\\\"\"\n\t\t\t}\n\n\t\t\t[ \"$accept_icmpv6\" = \"1\" ] && [ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_ICMP_REDIRECT meta l4proto icmpv6 ip6 daddr @$NFTSET_PROXY_LAN6 $(REDIRECT) comment \\\"${comment}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT meta l4proto icmpv6 ip6 daddr $FAKE_IP_6 $(REDIRECT) comment \\\"${comment}\\\"\"\n\t\t\t\tadd_shunt_t_rule \"${SHUNT_LIST6}\" \"nft add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT meta l4proto icmpv6 ip6 daddr\" \"$(REDIRECT)\" \"${comment}\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT meta l4proto icmpv6 $(REDIRECT) comment \\\"${comment}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT meta l4proto icmpv6 return comment \\\"${comment}\\\"\"\n\t\t\t}\n\n\t\t\tnft \"insert rule $NFTABLE_NAME $nft_chain ip protocol tcp ip daddr @$NFTSET_PROXY_LAN ${nft_j} comment \\\"${comment}\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp ip daddr $FAKE_IP ${nft_j} comment \\\"${comment}\\\"\"\n\t\t\tadd_shunt_t_rule \"${SHUNT_LIST4}\" \"nft add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") ip daddr\" \"${nft_j}\" \"${comment}\"\n\t\t\tnft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") ${nft_j} comment \\\"${comment}\\\"\"\n\t\t\t[ -n \"${is_tproxy}\" ] && nft \"add rule $NFTABLE_NAME PSW2_MANGLE ip protocol tcp $(REDIRECT $REDIR_PORT TPROXY4) comment \\\"${comment}\\\"\"\n\n\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ip6 daddr @$NFTSET_PROXY_LAN6 jump PSW2_RULE comment \\\"${comment}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp ip6 daddr $FAKE_IP_6 jump PSW2_RULE comment \\\"${comment}\\\"\"\n\t\t\t\tadd_shunt_t_rule \"${SHUNT_LIST6}\" \"nft add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") ip6 daddr\" \"${nft_j}\" \"${comment}\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") counter jump PSW2_RULE comment \\\"${comment}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp $(REDIRECT $REDIR_PORT TPROXY) comment \\\"${comment}\\\"\"\n\t\t\t}\n\n\t\t\tlog 2 \"${msg2}\"\n\t\tfi\n\n\t\tif [ \"$UDP_PROXY_MODE\" != \"disable\" ] && [ -n \"$NODE\" ]; then\n\t\t\tmsg2=\"${msg}$(i18n \"Use the %s node [%s]\" \"UDP\" \"$(config_n_get $NODE remarks)\")(TPROXY:${REDIR_PORT})\"\n\n\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp ip daddr @$NFTSET_PROXY_LAN counter jump PSW2_RULE comment \\\"${comment}\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp ip daddr $FAKE_IP counter jump PSW2_RULE comment \\\"${comment}\\\"\"\n\t\t\tadd_shunt_t_rule \"${SHUNT_LIST4}\" \"nft add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp $(factor $UDP_REDIR_PORTS \"udp dport\") ip daddr\" \"counter jump PSW2_RULE\" \"${comment}\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp $(factor $UDP_REDIR_PORTS \"udp dport\") counter jump PSW2_RULE comment \\\"${comment}\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp $(REDIRECT $REDIR_PORT TPROXY4) comment \\\"${comment}\\\"\"\n\n\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ip6 daddr @$NFTSET_PROXY_LAN6 jump PSW2_RULE comment \\\"${comment}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp ip6 daddr $FAKE_IP_6 jump PSW2_RULE comment \\\"${comment}\\\"\"\n\t\t\t\tadd_shunt_t_rule \"${SHUNT_LIST6}\" \"nft add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp $(factor $UDP_REDIR_PORTS \"udp dport\") ip6 daddr\" \"counter jump PSW2_RULE\" \"${comment}\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp $(factor $UDP_REDIR_PORTS \"udp dport\") counter jump PSW2_RULE comment \\\"${comment}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp $(REDIRECT $REDIR_PORT TPROXY) comment \\\"${comment}\\\"\"\n\t\t\t}\n\n\t\t\tlog 2 \"${msg2}\"\n\t\t\tudp_flag=1\n\t\tfi\n\t}\n}\n\nfilter_haproxy() {\n\tfor item in $(uci show $CONFIG | grep \".lbss=\" | cut -d \"'\" -f 2); do\n\t\tget_host_ip ipv4 $(echo $item | awk -F \":\" '{print $1}') 1\n\tdone | insert_nftset $NFTSET_VPS \"-1\"\n\tlog_i18n 1 \"Add node to the load balancer is directly connected to %s[%s].\" \"nftset\" \"${NFTSET_VPS}\"\n}\n\nfilter_vps_addr() {\n\tfor server_host in \"$@\"; do\n\t\tget_host_ip \"ipv4\" ${server_host}\n\tdone | insert_nftset $NFTSET_VPS \"-1\"\n\n\tfor server_host in \"$@\"; do\n\t\tget_host_ip \"ipv6\" ${server_host}\n\tdone | insert_nftset $NFTSET_VPS6 \"-1\"\n}\n\nfilter_vpsip() {\n\tuci show $CONFIG | grep -E \"(.address=|.download_address=)\" | cut -d \"'\" -f 2 | grep -E \"([0-9]{1,3}[\\.]){3}[0-9]{1,3}\" | grep -v \"^127\\.0\\.0\\.1$\" | insert_nftset $NFTSET_VPS \"-1\"\n\t#log 1 \"$(i18n \"Add all %s nodes to %s[%s] direct connection complete.\" \"IPv4\" \"nftset\" \"${$NFTSET_VPS}\")\"\n\tuci show $CONFIG | grep -E \"(.address=|.download_address=)\" | cut -d \"'\" -f 2 | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\" | insert_nftset $NFTSET_VPS6 \"-1\"\n\t#log 1 \"$(i18n \"Add all %s nodes to %s[%s] direct connection complete.\" \"IPv6\" \"nftset\" \"${$NFTSET_VPS6}\")\"\n}\n\nfilter_server_port() {\n\tlocal address=${1}\n\tlocal port=${2}\n\tlocal stream=${3}\n\tstream=$(echo ${3} | tr 'A-Z' 'a-z')\n\tlocal _is_tproxy\n\t_is_tproxy=${is_tproxy}\n\t[ \"$stream\" == \"udp\" ] && _is_tproxy=\"TPROXY\"\n\n\tfor _ipt in 4 6; do\n\t\t[ \"$_ipt\" == \"4\" ] && _ip_type=ip\n\t\t[ \"$_ipt\" == \"6\" ] && _ip_type=ip6\n\t\tnft \"list chain $NFTABLE_NAME $nft_output_chain\" 2>/dev/null | grep -q \"${address}:${port}\"\n\t\tif [ $? -ne 0 ]; then\n\t\t\tnft \"insert rule $NFTABLE_NAME $nft_output_chain meta l4proto $stream $_ip_type daddr $address $stream dport $port return comment \\\"${address}:${port}\\\"\" 2>/dev/null\n\t\tfi\n\tdone\n}\n\nfilter_node() {\n\tlocal node=${1}\n\tlocal stream=${2}\n\tif [ -n \"$node\" ]; then\n\t\tlocal address=$(config_n_get $node address)\n\t\tlocal port=$(config_n_get $node port)\n\t\t[ -z \"$address\" ] && [ -z \"$port\" ] && {\n\t\t\treturn 1\n\t\t}\n\t\tfilter_server_port $address $port $stream\n\t\tfilter_server_port $address $port $stream\n\tfi\n}\n\nfilter_direct_node_list() {\n\t[ ! -s \"$TMP_PATH/direct_node_list\" ] && return\n\tfor _node_id in $(cat $TMP_PATH/direct_node_list | awk '!seen[$0]++'); do\n\t\tfilter_node \"$_node_id\" TCP\n\t\tfilter_node \"$_node_id\" UDP\n\t\tunset _node_id\n\tdone\n}\n\ndel_script_mwan3() {\n\t[ -s \"/etc/init.d/mwan3\" ] && sed -i \"/${CONFIG}/d\" /etc/init.d/mwan3 >/dev/null 2>&1\n}\n\nadd_script_mwan3() {\n\tdel_script_mwan3\n\t[ -s \"/etc/init.d/mwan3\" ] && {\n\t\tsed -i '/start_service()/,/}/ s/^}/    \\/usr\\/share\\/passwall2\\/nftables.sh mwan3_start\\n}/' /etc/init.d/mwan3\n\t\tsed -i '/stop_service().*{/a \\    \\/usr\\/share\\/passwall2\\/nftables.sh mwan3_stop' /etc/init.d/mwan3\n\t}\n}\n\nmwan3_stop() {\n\tlocal handles=$(nft -a list chain ip mangle mwan3_hook 2>/dev/null | grep \"${FWMARK}\" | awk -F '# handle ' '{print$2}')\n\tfor handle in $handles; do\n\t\tnft delete rule ip mangle mwan3_hook handle ${handle} 2>/dev/null\n\tdone\n}\n\nmwan3_start() {\n\tmwan3_stop\n\tnft list chain ip mangle mwan3_hook >/dev/null 2>&1 && nft insert rule ip mangle mwan3_hook ct mark ${FWMARK} counter return >/dev/null 2>&1\n}\n\nupdate_wan_sets() {\n\tlocal WAN_IP=$(get_wan_ips ip4)\n\t[ -n \"$WAN_IP\" ] && {\n\t\tnft flush set $NFTABLE_NAME $NFTSET_WAN\n\t\techo \"$WAN_IP\" | insert_nftset $NFTSET_WAN \"-1\"\n\t}\n\n\tlocal WAN6_IP=$(get_wan_ips ip6)\n\t[ -n \"${WAN6_IP}\" ] && {\n\t\tnft flush set $NFTABLE_NAME $NFTSET_WAN6\n\t\techo \"$WAN6_IP\" | insert_nftset $NFTSET_WAN6 \"-1\"\n\t}\n}\n\nadd_firewall_rule() {\n\tlog_i18n 0 \"Starting to load %s firewall rules...\" \"nftables\"\n\tgen_nft_tables\n\tadd_script_mwan3\n\tmwan3_start\n\n\tgen_nftset $NFTSET_LOCAL ipv4_addr 0 \"-1\"\n\tgen_nftset $NFTSET_PROXY_LAN ipv4_addr 0 \"-1\"\n\tgen_nftset $NFTSET_LAN ipv4_addr 0 \"-1\" $(gen_lanlist)\n\tgen_nftset $NFTSET_VPS ipv4_addr 0 \"-1\"\n\tgen_nftset $NFTSET_WAN ipv4_addr 0 \"-1\"\n\n\tgen_nftset $NFTSET_LOCAL6 ipv6_addr 0 \"-1\"\n\tgen_nftset $NFTSET_PROXY_LAN6 ipv6_addr 0 \"-1\"\n\tgen_nftset $NFTSET_LAN6 ipv6_addr 0 \"-1\" $(gen_lanlist_6)\n\tgen_nftset $NFTSET_VPS6 ipv6_addr 0 \"-1\"\n\tgen_nftset $NFTSET_WAN6 ipv6_addr 0 \"-1\"\n\n\tget_local_ips ip4 | insert_nftset $NFTSET_LOCAL \"-1\"\n\tget_local_ips ip6 | insert_nftset $NFTSET_LOCAL6 \"-1\"\n\n\t# Ignore special IP ranges\n\tlocal lan_ifname lan_ip\n\tlan_ifname=$(uci -q -p /tmp/state get network.lan.ifname)\n\t[ -n \"$lan_ifname\" ] && {\n\t\tlan_ip=$(ip address show $lan_ifname | grep -w \"inet\" | awk '{print $2}')\n\t\tlan_ip6=$(ip address show $lan_ifname | grep -w \"inet6\" | awk '{print $2}')\n\t\t#log_i18n 1 \"local network segments (%s) direct connection: %s\" \"IPv4\" \"${lan_ip}\"\n\t\t#log_i18n 1 \"local network segments (%s) direct connection: %s\" \"IPv6\" \"${lan_ip6}\"\n\n\t\t[ -n \"$lan_ip\" ] && echo $lan_ip | insert_nftset $NFTSET_LAN \"-1\"\n\t\t[ -n \"$lan_ip6\" ] && echo $lan_ip6 | insert_nftset $NFTSET_LAN6 \"-1\"\n\t}\n\n\tupdate_wan_sets\n\n\t[ -n \"$ISP_DNS\" ] && {\n\t\techo \"$ISP_DNS\" | insert_nftset $NFTSET_LAN 0\n\t\tfor ispip in $ISP_DNS; do\n\t\t\tlog_i18n 1 \"$(i18n \"Add ISP %s DNS to the whitelist: %s\" \"IPv4\" \"${ispip}\")\"\n\t\tdone\n\t}\n\n\t[ -n \"$ISP_DNS6\" ] && {\n\t\techo $ISP_DNS6 | insert_nftset $NFTSET_LAN6 0\n\t\tfor ispip6 in $ISP_DNS6; do\n\t\t\tlog_i18n 1 \"$(i18n \"Add ISP %s DNS to the whitelist: %s\" \"IPv6\" \"${ispip6}\")\"\n\t\tdone\n\t}\n\n\t# Force proxy LAN IP CIDR\n\tforce_proxy_lan_ip=$(config_t_get global_forwarding force_proxy_lan_ip)\n\tfor ip in $force_proxy_lan_ip; do\n\t\tif [[ \"$ip\" == *::* ]]; then\n\t\t\techo \"$ip\" | insert_nftset $NFTSET_PROXY_LAN6 0\n\t\telse\n\t\t\techo \"$ip\" | insert_nftset $NFTSET_PROXY_LAN 0\n\t\tfi\n\tdone\n\n\t# Shunt rules IP list (import when use shunt node)\n\tgen_shunt_list \"${NODE}\" SHUNT_LIST4 SHUNT_LIST6\n\n\t# Filter all node IPs\n\tfilter_vpsip > /dev/null 2>&1 &\n\tfilter_haproxy > /dev/null 2>&1 &\n\t# Prevent some conditions\n\tfilter_vps_addr $(config_n_get $NODE address) > /dev/null 2>&1 &\n\tfilter_vps_addr $(config_n_get $NODE download_address) > /dev/null 2>&1 &\n\n\taccept_icmp=$(config_t_get global_forwarding accept_icmp 0)\n\taccept_icmpv6=$(config_t_get global_forwarding accept_icmpv6 0)\n\n\tif [ \"${TCP_PROXY_WAY}\" = \"redirect\" ]; then\n\t\tunset is_tproxy\n\t\tnft_prerouting_chain=\"PSW2_NAT\"\n\t\tnft_output_chain=\"PSW2_OUTPUT_NAT\"\n\telif [ \"${TCP_PROXY_WAY}\" = \"tproxy\" ]; then\n\t\tis_tproxy=\"TPROXY\"\n\t\tnft_prerouting_chain=\"PSW2_MANGLE\"\n\t\tnft_output_chain=\"PSW2_OUTPUT_MANGLE\"\n\tfi\n\n\tnft \"add chain $NFTABLE_NAME PSW2_DIVERT\"\n\tnft \"flush chain $NFTABLE_NAME PSW2_DIVERT\"\n\t# Only TCP, UDP Invalid.\n\tnft \"add rule $NFTABLE_NAME PSW2_DIVERT meta l4proto tcp socket transparent 1 mark set ${FWMARK} counter accept\"\n\n\tnft \"add chain $NFTABLE_NAME PSW2_DNS\"\n\tnft \"flush chain $NFTABLE_NAME PSW2_DNS\"\n\tif [ $(config_t_get global dns_redirect \"1\") = \"0\" ]; then\n\t\t#Only hijack when dest address is local IP\n\t\tnft \"insert rule $NFTABLE_NAME dstnat ip saddr @${NFTSET_LAN} ip daddr @${NFTSET_LOCAL} jump PSW2_DNS\"\n\t\tnft \"insert rule $NFTABLE_NAME dstnat ip6 saddr @${NFTSET_LAN6} ip6 daddr @${NFTSET_LOCAL6} jump PSW2_DNS\"\n\telse\n\t\tnft \"insert rule $NFTABLE_NAME dstnat ip saddr @${NFTSET_LAN} jump PSW2_DNS\"\n\t\tnft \"insert rule $NFTABLE_NAME dstnat ip6 saddr @${NFTSET_LAN6} jump PSW2_DNS\"\n\tfi\n\n\t# for ipv4 ipv6 tproxy mark\n\tnft \"add chain $NFTABLE_NAME PSW2_RULE\"\n\tnft \"flush chain $NFTABLE_NAME PSW2_RULE\"\n\tnft \"add rule $NFTABLE_NAME PSW2_RULE counter meta mark set ct mark\"\n\tnft \"add rule $NFTABLE_NAME PSW2_RULE meta mark ${FWMARK} counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW2_RULE tcp flags & (fin|syn|rst|ack) == syn counter meta mark set ${FWMARK}\"\n\tnft \"add rule $NFTABLE_NAME PSW2_RULE meta l4proto udp ct state { new, related } counter meta mark set ${FWMARK}\"\n\tnft \"add rule $NFTABLE_NAME PSW2_RULE counter ct mark set mark\"\n\n\t#ipv4 tproxy mode and udp\n\tnft \"add chain $NFTABLE_NAME PSW2_MANGLE\"\n\tnft \"flush chain $NFTABLE_NAME PSW2_MANGLE\"\n\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ip daddr @$NFTSET_LAN counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ip daddr @$NFTSET_VPS counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ct direction reply counter return\"\n\n\tnft \"add chain $NFTABLE_NAME PSW2_OUTPUT_MANGLE\"\n\tnft \"flush chain $NFTABLE_NAME PSW2_OUTPUT_MANGLE\"\n\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE ip daddr @$NFTSET_LAN counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE ip daddr @$NFTSET_VPS counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE ct direction reply counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE meta mark 255 counter return\"\n\n\t# jump chains\n\tnft \"add rule $NFTABLE_NAME mangle_prerouting counter jump PSW2_DIVERT\"\n\tnft \"add rule $NFTABLE_NAME mangle_prerouting ip protocol udp counter jump PSW2_MANGLE\"\n\t[ -n \"${is_tproxy}\" ] && nft \"add rule $NFTABLE_NAME mangle_prerouting ip protocol tcp counter jump PSW2_MANGLE\"\n\n\t#ipv4 tcp redirect mode\n\t[ -z \"${is_tproxy}\" ] && {\n\t\tnft \"add chain $NFTABLE_NAME PSW2_NAT\"\n\t\tnft \"flush chain $NFTABLE_NAME PSW2_NAT\"\n\t\tnft \"add rule $NFTABLE_NAME PSW2_NAT ip daddr @$NFTSET_LAN counter return\"\n\t\tnft \"add rule $NFTABLE_NAME PSW2_NAT ip daddr @$NFTSET_VPS counter return\"\n\t\tnft \"add rule $NFTABLE_NAME dstnat ip protocol tcp counter jump PSW2_NAT\"\n\n\t\tnft \"add chain $NFTABLE_NAME PSW2_OUTPUT_NAT\"\n\t\tnft \"flush chain $NFTABLE_NAME PSW2_OUTPUT_NAT\"\n\t\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_NAT ip daddr @$NFTSET_LAN counter return\"\n\t\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_NAT ip daddr @$NFTSET_VPS counter return\"\n\t\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_NAT meta mark 255 counter return\"\n\t}\n\n\t#icmp ipv6-icmp redirect\n\tif [ \"$accept_icmp\" = \"1\" ]; then\n\t\tnft \"add chain $NFTABLE_NAME PSW2_ICMP_REDIRECT\"\n\t\tnft \"flush chain $NFTABLE_NAME PSW2_ICMP_REDIRECT\"\n\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT ip daddr @$NFTSET_LAN counter return\"\n\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT ip daddr @$NFTSET_VPS counter return\"\n\n\t\t[ \"$accept_icmpv6\" = \"1\" ] && {\n\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT ip6 daddr @$NFTSET_LAN6 counter return\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT ip6 daddr @$NFTSET_VPS6 counter return\"\n\t\t}\n\n\t\tnft \"add rule $NFTABLE_NAME dstnat meta l4proto {icmp,icmpv6} counter jump PSW2_ICMP_REDIRECT\"\n\t\tnft \"add rule $NFTABLE_NAME nat_output meta l4proto {icmp,icmpv6} counter jump PSW2_ICMP_REDIRECT\"\n\tfi\n\n\t#ipv4 wan_ip\n\t[ -z \"${is_tproxy}\" ] && nft \"add rule $NFTABLE_NAME PSW2_NAT ip daddr @$NFTSET_WAN counter return comment \\\"WAN_IP_RETURN\\\"\"\n\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ip daddr @$NFTSET_WAN counter return comment \\\"WAN_IP_RETURN\\\"\"\n\n\tip rule add fwmark ${FWMARK} table 999 priority 999\n\tip route add local 0.0.0.0/0 dev lo table 999\n\n\t#ipv6 tproxy mode and udp\n\tnft \"add chain $NFTABLE_NAME PSW2_MANGLE_V6\"\n\tnft \"flush chain $NFTABLE_NAME PSW2_MANGLE_V6\"\n\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 ip6 daddr @$NFTSET_LAN6 counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 ip6 daddr @$NFTSET_VPS6 counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 ct direction reply counter return\"\n\n\tnft \"add chain $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6\"\n\tnft \"flush chain $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6\"\n\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6 ip6 daddr @$NFTSET_LAN6 counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6 ip6 daddr @$NFTSET_VPS6 counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6 ct direction reply counter return\"\n\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6 meta mark 255 counter return\"\n\n\t[ -n \"$AUTO_DNS\" ] && {\n\t\tfor auto_dns in $(echo $AUTO_DNS | tr ',' ' '); do\n\t\t\tlocal dns_address=$(echo $auto_dns | awk -F '#' '{print $1}')\n\t\t\tlocal dns_port=$(echo $auto_dns | awk -F '#' '{print $2}')\n\t\t\tif [[ \"$dns_address\" == *::* ]]; then\n\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6 meta l4proto udp ip6 daddr ${dns_address} $(factor ${dns_port:-53} \"udp dport\") counter return\"\n\t\t\t\tlog_i18n 1 \"$(i18n \"Add direct DNS to %s: %s\" \"nftables\" \"[${dns_address}]:${dns_port:-53}\")\"\n\t\t\telse\n\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE ip protocol udp ip daddr ${dns_address} $(factor ${dns_port:-53} \"udp dport\") counter return\"\n\t\t\t\tlog_i18n 1 \"$(i18n \"Add direct DNS to %s: %s\" \"nftables\" \"${dns_address}:${dns_port:-53}\")\"\n\t\t\tfi\n\t\tdone\n\t}\n\n\t# jump chains\n\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\tnft \"add rule $NFTABLE_NAME mangle_prerouting meta nfproto {ipv6} counter jump PSW2_MANGLE_V6\"\n\t\tnft \"add rule $NFTABLE_NAME mangle_output meta nfproto {ipv6} counter jump PSW2_OUTPUT_MANGLE_V6 comment \\\"PSW2_OUTPUT_MANGLE\\\"\"\n\n\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 ip6 daddr @$NFTSET_WAN6 counter return comment \\\"WAN6_IP_RETURN\\\"\"\n\n\t\tip -6 rule add fwmark ${FWMARK} table 999 priority 999\n\t\tip -6 route add local ::/0 dev lo table 999\n\t}\n\n\t[ \"$ENABLED_DEFAULT_ACL\" == 1 ] && {\n\t\tTCP_LOCALHOST_PROXY=$LOCALHOST_PROXY\n\t\tUDP_LOCALHOST_PROXY=$LOCALHOST_PROXY\n\n\t\tmsg=\"$(i18n \"[Local],\")\"\n\t\t[ \"$TCP_NO_REDIR_PORTS\" != \"disable\" ] && {\n\t\t\tnft \"add rule $NFTABLE_NAME $nft_output_chain ip protocol tcp $(factor $TCP_NO_REDIR_PORTS \"tcp dport\") counter return\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6 meta l4proto tcp $(factor $TCP_NO_REDIR_PORTS \"tcp dport\") counter return\"\n\t\t\tif ! has_1_65535 \"$TCP_NO_REDIR_PORTS\"; then\n\t\t\t\tlog 1 \"${msg}$(i18n \"not proxy %s port [%s]\" \"TCP\" \"${TCP_NO_REDIR_PORTS}\")\"\n\t\t\telse\n\t\t\t\tunset TCP_LOCALHOST_PROXY\n\t\t\t\tlog 1 \"${msg}$(i18n \"not proxy all %s\" \"TCP\")\"\n\t\t\tfi\n\t\t}\n\n\t\t[ \"$UDP_NO_REDIR_PORTS\" != \"disable\" ] && {\n\t\t\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE ip protocol udp $(factor $UDP_NO_REDIR_PORTS \"udp dport\") counter return\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6 meta l4proto udp $(factor $UDP_NO_REDIR_PORTS \"udp dport\") counter return\"\n\t\t\tif ! has_1_65535 \"$UDP_NO_REDIR_PORTS\"; then\n\t\t\t\tlog 1 \"${msg}$(i18n \"not proxy %s port [%s]\" \"UDP\" \"${UDP_NO_REDIR_PORTS}\")\"\n\t\t\telse\n\t\t\t\tunset UDP_LOCALHOST_PROXY\n\t\t\t\tlog 1 \"${msg}$(i18n \"not proxy all %s\" \"UDP\")\"\n\t\t\tfi\n\t\t}\n\n\t\tif [ -n \"$NODE\" ] && ([ \"$TCP_LOCALHOST_PROXY\" = \"1\" ] || [ \"$UDP_LOCALHOST_PROXY\" = \"1\" ]); then\n\t\t\t[ -n \"$DNS_REDIRECT_PORT\" ] && {\n\t\t\t\tnft \"add rule $NFTABLE_NAME nat_output ip protocol udp oif lo udp dport 53 counter redirect to :$DNS_REDIRECT_PORT comment \\\"PSW2_DNS\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME nat_output ip protocol tcp oif lo tcp dport 53 counter redirect to :$DNS_REDIRECT_PORT comment \\\"PSW2_DNS\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME nat_output meta l4proto udp oif lo udp dport 53 counter redirect to :$DNS_REDIRECT_PORT comment \\\"PSW2_DNS\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME nat_output meta l4proto tcp oif lo tcp dport 53 counter redirect to :$DNS_REDIRECT_PORT comment \\\"PSW2_DNS\\\"\"\n\t\t\t}\n\t\tfi\n\n\t\tlocal comment_l=\"$(i18n \"Local\")\"\n\n\t\t# Loading local router proxy TCP\n\t\tif [ -n \"$NODE\" ] && [ \"$TCP_LOCALHOST_PROXY\" = \"1\" ]; then\n\t\t\t[ \"$accept_icmp\" = \"1\" ] && {\n\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_ICMP_REDIRECT oif lo ip protocol icmp ip daddr @$NFTSET_PROXY_LAN counter redirect\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT oif lo ip protocol icmp ip daddr $FAKE_IP counter redirect\"\n\t\t\t\tadd_shunt_t_rule \"${SHUNT_LIST4}\" \"nft add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT oif lo ip protocol icmp ip daddr\" \"counter redirect\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT oif lo ip protocol icmp counter redirect\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT oif lo ip protocol icmp counter return\"\n\t\t\t}\n\n\t\t\t[ \"$accept_icmpv6\" = \"1\" ] && {\n\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_ICMP_REDIRECT oif lo meta l4proto icmpv6 ip6 daddr @$NFTSET_PROXY_LAN6 counter redirect\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT oif lo meta l4proto icmpv6 ip6 daddr $FAKE_IP_6 counter redirect\"\n\t\t\t\tadd_shunt_t_rule \"${SHUNT_LIST6}\" \"nft add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT oif lo meta l4proto icmpv6 ip6 daddr\" \"counter redirect\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT oif lo meta l4proto icmpv6 counter redirect\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_ICMP_REDIRECT oif lo meta l4proto icmpv6 counter return\"\n\t\t\t}\n\n\t\t\tif [ -n \"${is_tproxy}\" ]; then\n\t\t\t\tnft_chain=\"PSW2_OUTPUT_MANGLE\"\n\t\t\t\tnft_j=\"counter jump PSW2_RULE\"\n\t\t\telse\n\t\t\t\tnft_chain=\"PSW2_OUTPUT_NAT\"\n\t\t\t\tnft_j=\"$(REDIRECT $REDIR_PORT)\"\n\t\t\tfi\n\n\t\t\tnft \"insert rule $NFTABLE_NAME $nft_chain ip protocol tcp ip daddr @$NFTSET_PROXY_LAN ${nft_j}\"\n\t\t\tnft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp ip daddr $FAKE_IP ${nft_j}\"\n\t\t\tadd_shunt_t_rule \"${SHUNT_LIST4}\" \"nft add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") ip daddr\" \"${nft_j}\"\n\t\t\tnft \"add rule $NFTABLE_NAME $nft_chain ip protocol tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") ${nft_j}\"\n\t\t\t[ -z \"${is_tproxy}\" ] && nft \"add rule $NFTABLE_NAME nat_output ip protocol tcp counter jump PSW2_OUTPUT_NAT\"\n\t\t\t[ -n \"${is_tproxy}\" ] && {\n\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_MANGLE ip protocol tcp iif lo ip daddr @$NFTSET_PROXY_LAN $(REDIRECT $REDIR_PORT TPROXY4) comment \\\"${comment_l}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ip protocol tcp iif lo $(REDIRECT $REDIR_PORT TPROXY4) comment \\\"${comment_l}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ip protocol tcp iif lo counter return comment \\\"${comment_l}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME mangle_output ip protocol tcp counter jump PSW2_OUTPUT_MANGLE comment \\\"PSW2_OUTPUT_MANGLE\\\"\"\n\t\t\t}\n\n\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6 meta l4proto tcp ip6 daddr @$NFTSET_PROXY_LAN6 jump PSW2_RULE\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6 meta l4proto tcp ip6 daddr $FAKE_IP_6 jump PSW2_RULE\"\n\t\t\t\tadd_shunt_t_rule \"${SHUNT_LIST6}\" \"nft add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6 meta l4proto tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") ip6 daddr\" \"counter jump PSW2_RULE\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6 meta l4proto tcp $(factor $TCP_REDIR_PORTS \"tcp dport\") counter jump PSW2_RULE\"\n\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp iif lo ip6 daddr @$NFTSET_PROXY_LAN6 $(REDIRECT $REDIR_PORT TPROXY6) comment \\\"${comment_l}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp iif lo $(REDIRECT $REDIR_PORT TPROXY6) comment \\\"${comment_l}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto tcp iif lo counter return comment \\\"${comment_l}\\\"\"\n\t\t\t}\n\n\t\t\t[ -d \"${TMP_IFACE_PATH}\" ] && {\n\t\t\t\tfor iface in $(ls ${TMP_IFACE_PATH}); do\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME $nft_output_chain ip protocol tcp oif $iface counter return\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6 ip protocol tcp oif $iface counter return\"\n\t\t\t\tdone\n\t\t\t}\n\t\tfi\n\n\t\t# Loading local router proxy UDP\n\t\tif [ -n \"$NODE\" ] && [ \"$UDP_LOCALHOST_PROXY\" = \"1\" ]; then\n\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE ip protocol udp ip daddr @$NFTSET_PROXY_LAN counter jump PSW2_RULE\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE ip protocol udp ip daddr $FAKE_IP counter jump PSW2_RULE\"\n\t\t\tadd_shunt_t_rule \"${SHUNT_LIST4}\" \"nft add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE ip protocol udp $(factor $UDP_REDIR_PORTS \"udp dport\") ip daddr\" \"counter jump PSW2_RULE\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE ip protocol udp $(factor $UDP_REDIR_PORTS \"udp dport\") counter jump PSW2_RULE\"\n\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp iif lo ip daddr @$NFTSET_PROXY_LAN $(REDIRECT $REDIR_PORT TPROXY4) comment \\\"${comment_l}\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp iif lo $(REDIRECT $REDIR_PORT TPROXY4) comment \\\"${comment_l}\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp iif lo counter return comment \\\"${comment_l}\\\"\"\n\t\t\tnft \"add rule $NFTABLE_NAME mangle_output ip protocol udp counter jump PSW2_OUTPUT_MANGLE comment \\\"PSW2_OUTPUT_MANGLE\\\"\"\n\n\t\t\t[ \"$PROXY_IPV6\" == \"1\" ] && {\n\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6 meta l4proto udp ip6 daddr @$NFTSET_PROXY_LAN6 jump PSW2_RULE\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6 meta l4proto udp ip6 daddr $FAKE_IP_6 jump PSW2_RULE\"\n\t\t\t\tadd_shunt_t_rule \"${SHUNT_LIST6}\" \"nft add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6 meta l4proto udp $(factor $UDP_REDIR_PORTS \"udp dport\") ip6 daddr\" \"counter jump PSW2_RULE\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6 meta l4proto udp $(factor $UDP_REDIR_PORTS \"udp dport\") counter jump PSW2_RULE\"\n\t\t\t\tnft \"insert rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp iif lo ip6 daddr @$NFTSET_PROXY_LAN6 $(REDIRECT $REDIR_PORT TPROXY6) comment \\\"${comment_l}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp iif lo $(REDIRECT $REDIR_PORT TPROXY6) comment \\\"${comment_l}\\\"\"\n\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp iif lo counter return comment \\\"${comment_l}\\\"\"\n\t\t\t}\n\n\t\t\t[ -d \"${TMP_IFACE_PATH}\" ] && {\n\t\t\t\tfor iface in $(ls ${TMP_IFACE_PATH}); do\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME $nft_output_chain ip protocol udp oif $iface counter return\"\n\t\t\t\t\tnft \"add rule $NFTABLE_NAME PSW2_OUTPUT_MANGLE_V6 ip protocol udp oif $iface counter return\"\n\t\t\t\tdone\n\t\t\t}\n\t\tfi\n\n\t\tnft \"add rule $NFTABLE_NAME mangle_output oif lo counter return comment \\\"PSW2_OUTPUT_MANGLE\\\"\"\n\t\tnft \"add rule $NFTABLE_NAME mangle_output meta mark ${FWMARK} counter return comment \\\"PSW2_OUTPUT_MANGLE\\\"\"\n\n\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE ip protocol udp udp dport 53 counter return\"\n\t\tnft \"add rule $NFTABLE_NAME PSW2_MANGLE_V6 meta l4proto udp udp dport 53 counter return\"\n\t}\n\n\tload_acl\n\n\tfilter_direct_node_list > /dev/null 2>&1 &\n\n\tlog_i18n 0 \"%s firewall rules load complete!\" \"nftables\"\n}\n\ndel_firewall_rule() {\n\tfor nft in \"dstnat\" \"srcnat\" \"nat_output\" \"mangle_prerouting\" \"mangle_output\"; do\n        local handles=$(nft -a list chain $NFTABLE_NAME ${nft} 2>/dev/null | grep -E \"PSW2_\" | awk -F '# handle ' '{print$2}')\n\t\tfor handle in $handles; do\n\t\t\tnft delete rule $NFTABLE_NAME ${nft} handle ${handle} 2>/dev/null\n\t\tdone\n\tdone\n\n\tfor handle in $(nft -a list chains | grep -E \"chain PSW2_\" | grep -v \"PSW2_RULE\" | awk -F '# handle ' '{print$2}'); do\n\t\tnft delete chain $NFTABLE_NAME handle ${handle} 2>/dev/null\n\tdone\n\n\t# Need to be removed at the end, otherwise it will show \"Resource busy\"\n\tnft delete chain $NFTABLE_NAME handle $(nft -a list chains | grep -E \"PSW2_RULE\" | awk -F '# handle ' '{print$2}') 2>/dev/null\n\n\tip rule del fwmark ${FWMARK} 2>/dev/null\n\tip route del local 0.0.0.0/0 dev lo table 999 2>/dev/null\n\n\tip -6 rule del fwmark ${FWMARK} 2>/dev/null\n\tip -6 route del local ::/0 dev lo table 999 2>/dev/null\n\n\tdestroy_nftset $NFTSET_LOCAL\n\tdestroy_nftset $NFTSET_WAN\n\tdestroy_nftset $NFTSET_LAN\n\tdestroy_nftset $NFTSET_VPS\n\n\tdestroy_nftset $NFTSET_LOCAL6\n\tdestroy_nftset $NFTSET_WAN6\n\tdestroy_nftset $NFTSET_LAN6\n\tdestroy_nftset $NFTSET_VPS6\n\n\tdel_script_mwan3\n\n\tlog_i18n 0 \"Delete %s rules is complete.\" \"nftables\"\n}\n\nflush_nftset() {\n\tlog_i18n 0 \"Clear %s.\" \"NFTSet\"\n\tfor _name in $(nft -a list sets | grep -E \"passwall2_\" | awk -F 'set ' '{print $2}' | awk '{print $1}'); do\n\t\tdestroy_nftset ${_name}\n\tdone\n}\n\nflush_table() {\n\tnft flush table $NFTABLE_NAME\n\tnft delete table $NFTABLE_NAME\n}\n\nflush_include() {\n\techo '#!/bin/sh' >$FWI\n}\n\ngen_include() {\n\tflush_include\n\tlocal nft_chain_file=$TMP_PATH/PSW2_RULE.nft\n\techo '#!/bin/sh' > $nft_chain_file\n\tnft list table $NFTABLE_NAME >> $nft_chain_file\n\n\tlocal __nft=\" \"\n\t__nft=$(cat <<- EOF\n\t\t[ -z \"\\$(nft list chain $NFTABLE_NAME mangle_prerouting | grep PSW2)\" ] && nft -f ${nft_chain_file}\n\n\t\t${MY_PATH} update_wan_sets\n\tEOF\n\t)\n\n\tcat <<-EOF >> $FWI\n\t${__nft}\n\t\n\treturn 0\n\tEOF\n\treturn 0\n}\n\nstart() {\n\t[ \"$ENABLED_DEFAULT_ACL\" == 0 -a \"$ENABLED_ACLS\" == 0 ] && return\n\tadd_firewall_rule\n\tgen_include\n}\n\nstop() {\n\t[ -z \"$(command -v log_i18n)\" ] && . /usr/share/passwall2/utils.sh\n\tdel_firewall_rule\n\tdestroy_nftset $NFTSET_PROXY_LAN\n\tdestroy_nftset $NFTSET_PROXY_LAN6\n\t[ $(config_t_get global flush_set \"0\") = \"1\" ] && {\n\t\tuci -q delete ${CONFIG}.@global[0].flush_set\n\t\tuci -q commit ${CONFIG}\n\t\t#flush_table\n\t\tflush_nftset\n\t\trm -rf $TMP_PATH2/singbox*\n\t\trm -rf $TMP_PATH2/geo_output\n\t}\n\tflush_include\n}\n\narg1=$1\nshift\ncase $arg1 in\ninsert_nftset)\n\tinsert_nftset \"$@\"\n\t;;\nfilter_direct_node_list)\n\tfilter_direct_node_list\n\t;;\nmwan3_start)\n\tmwan3_start\n\t;;\nmwan3_stop)\n\tmwan3_stop\n\t;;\nupdate_wan_sets)\n\tupdate_wan_sets \"$@\"\n\t;;\nstop)\n\tstop\n\t;;\nstart)\n\tstart\n\t;;\n*) ;;\nesac\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/passwall2/rule_update.lua",
    "content": "#!/usr/bin/lua\n\nlocal api = require \"luci.passwall2.api\"\nlocal name = api.appname\nlocal fs = api.fs\nlocal log = api.log\nlocal sys = api.sys\nlocal uci = api.uci\nlocal jsonc = api.jsonc\n\nlocal arg1 = arg[1]\nlocal arg2 = arg[2]\nlocal arg3 = arg[3]\n\nlocal reboot = 0\nlocal geoip_update = \"0\"\nlocal geosite_update = \"0\"\n\nlocal geoip_url = uci:get(name, \"@global_rules[0]\", \"geoip_url\") or \"https://github.com/Loyalsoldier/geoip/releases/latest/download/geoip.dat\"\nlocal geosite_url = uci:get(name, \"@global_rules[0]\", \"geosite_url\") or \"https://github.com/Loyalsoldier/v2ray-rules-dat/releases/latest/download/geosite.dat\"\nlocal asset_location = uci:get(name, \"@global_rules[0]\", \"v2ray_location_asset\") or \"/usr/share/v2ray/\"\nasset_location = asset_location:match(\"/$\") and asset_location or (asset_location .. \"/\")\nlocal backup_path = \"/tmp/bak_v2ray/\"\n\nif arg3 == \"cron\" then\n\targ2 = nil\nend\n\n-- curl\nlocal function curl(url, file)\n\tlocal http_code = 0\n\tlocal header_str = \"\"\n\tlocal args = {\n\t\t\"-skL\",\n\t\t\"--retry 3\",\n\t\t\"--connect-timeout 3\",\n\t\t\"--max-time 300\",\n\t\t\"--speed-limit 51200 --speed-time 15\",\n\t\t'-A \"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/142.0.0.0 Safari/537.36\"',\n\t\t\"--dump-header -\",\n\t\t\"-w '\\\\n%{http_code}'\"\n\t}\n\tif file then\n\t\targs[#args + 1] = \"-o \" .. file\n\tend\n\tlocal return_code, result = api.curl_auto(url, nil, args)\n\tif result and result ~= \"\" then\n\t\tlocal body, code = result:match(\"^(.-)%s*([0-9]+)$\")\n\t\tif code then\n\t\t\thttp_code = tonumber(code) or 0\n\t\t\theader_str = body\n\t\telse\n\t\t\thttp_code = tonumber(result:match(\"(%d+)%s*$\")) or 0\n\t\tend\n\tend\n\tif header_str ~= \"\" then\n\t\theader_str = header_str:gsub(\"\\r\", \"\")\n\tend\n\treturn http_code, header_str\nend\n\nlocal function non_file_check(file_path, header_content)\n\tlocal remote_file_size = nil\n\tlocal local_file_size = tonumber(fs.stat(file_path, \"size\") or 0)\n\tif local_file_size == 0 then\n\t\tlog(2, api.i18n.translate(\"Downloaded file is empty or an error occurred while reading it.\"))\n\t\treturn true\n\tend\n\tif header_content and header_content ~= \"\" then\n\t\tfor size in header_content:gmatch(\"[Cc]ontent%-[Ll]ength:%s*(%d+)\") do\n\t\t\tlocal s = tonumber(size)\n\t\t\tif s and s > 0 then\n\t\t\t\tremote_file_size = s\n\t\t\tend\n\t\tend\n\tend\n\tif remote_file_size and remote_file_size ~= local_file_size then\n\t\tlog(2, api.i18n.translatef(\"Download file size verification error. Original file size: %sB. Downloaded file size: %sB.\", remote_file_size, local_file_size))\n\t\treturn true\n\tend\n\treturn false\nend\n\nlocal function fetch_geofile(geo_name, geo_type, url)\n\tlocal tmp_path = \"/tmp/\" .. geo_name\n\tlocal asset_path = asset_location .. geo_name\n\tlocal down_filename = url:match(\"^.*/([^/?#]+)\")\n\tlocal sha_url = url:gsub(down_filename, down_filename .. \".sha256sum\")\n\tlocal sha_path = tmp_path .. \".sha256sum\"\n\n\tlocal function verify_sha256(sha_file)\n\t\treturn sys.call(\"sha256sum -c \" .. sha_file .. \" > /dev/null 2>&1\") == 0\n\tend\n\n\tlocal sha_verify, _ = curl(sha_url, sha_path) == 200\n\tif sha_verify then\n\t\tlocal f = io.open(sha_path, \"r\")\n\t\tif f then\n\t\t\tlocal content = f:read(\"*l\")\n\t\t\tf:close()\n\t\t\tif content then\n\t\t\t\tcontent = content:gsub(\"(%x+)%s+.+\", \"%1  \" .. tmp_path)\n\t\t\t\tf = io.open(sha_path, \"w\")\n\t\t\t\tif f then\n\t\t\t\t\tf:write(content)\n\t\t\t\t\tf:close()\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif fs.access(asset_path) then\n\t\t\tsys.call(string.format(\"cp -f %s %s\", asset_path, tmp_path))\n\t\t\tif verify_sha256(sha_path) then\n\t\t\t\tlog(1, api.i18n.translatef(\"%s version is the same and does not need to be updated.\", geo_type))\n\t\t\t\treturn 0\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal sret_tmp, header = curl(url, tmp_path)\n\tif sret_tmp == 200 and non_file_check(tmp_path, header) then\n\t\tlog(1, api.i18n.translatef(\"%s an error occurred during the file download process. Please try downloading again.\", geo_type))\n\t\tos.remove(tmp_path)\n\t\tsret_tmp, header = curl(url, tmp_path)\n\t\tif sret_tmp == 200 and non_file_check(tmp_path, header) then\n\t\t\tsret_tmp = 0\n\t\t\tlog(1, api.i18n.translatef(\"%s an error occurred while downloading the file. Please check your network or the download link and try again!\", geo_type))\n\t\tend\n\tend\n\tif sret_tmp == 200 then\n\t\tif sha_verify then\n\t\t\tif verify_sha256(sha_path) then\n\t\t\t\tsys.call(string.format(\"mkdir -p %s && mv -f %s %s\", backup_path, asset_path, backup_path))\n\t\t\t\tsys.call(string.format(\"mkdir -p %s && mv -f %s %s\", asset_location, tmp_path, asset_path))\n\t\t\t\treboot = 1\n\t\t\t\tlog(1, api.i18n.translatef(\"%s update success.\", geo_type))\n\t\t\telse\n\t\t\t\tlog(1, api.i18n.translatef(\"%s update failed, please try again later.\", geo_type))\n\t\t\t\treturn 1\n\t\t\tend\n\t\telse\n\t\t\tif fs.access(asset_path) and sys.call(string.format(\"cmp -s %s %s\", tmp_path, asset_path)) == 0 then\n\t\t\t\tlog(1, api.i18n.translatef(\"%s version is the same and does not need to be updated.\", geo_type))\n\t\t\t\treturn 0\n\t\t\tend\n\t\t\tsys.call(string.format(\"mkdir -p %s && mv -f %s %s\", backup_path, asset_path, backup_path))\n\t\t\tsys.call(string.format(\"mkdir -p %s && mv -f %s %s\", asset_location, tmp_path, asset_path))\n\t\t\treboot = 1\n\t\t\tlog(1, api.i18n.translatef(\"%s update success.\", geo_type))\n\t\tend\n\telse\n\t\tlog(1, api.i18n.translatef(\"%s update failed, please try again later.\", geo_type))\n\t\treturn 1\n\tend\n\treturn 0\nend\n\nlocal function fetch_geoip()\n\tfetch_geofile(\"geoip.dat\", \"geoip\", geoip_url)\nend\n\nlocal function fetch_geosite()\n\tfetch_geofile(\"geosite.dat\", \"geosite\", geosite_url)\nend\n\nlocal function remove_tmp_geofile(name)\n\tos.remove(\"/tmp/\" .. name .. \".dat\")\n\tos.remove(\"/tmp/\" .. name .. \".dat.sha256sum\")\nend\n\nif arg2 then\n\tstring.gsub(arg2, '[^' .. \",\" .. ']+', function(w)\n\t\tif w == \"geoip\" then\n\t\t\tgeoip_update = \"1\"\n\t\tend\n\t\tif w == \"geosite\" then\n\t\t\tgeosite_update = \"1\"\n\t\tend\n\tend)\nelse\n\tgeoip_update = uci:get(name, \"@global_rules[0]\", \"geoip_update\") or \"1\"\n\tgeosite_update = uci:get(name, \"@global_rules[0]\", \"geosite_update\") or \"1\"\nend\nif geoip_update == \"0\" and geosite_update == \"0\" then\n\tos.exit(0)\nend\n\nlocal function check_instance(action)\n\tlocal rule_lock = \"/var/lock/\" .. name .. \"_rule_update.lock\"\n\tlocal sub_lock = \"/var/lock/\" .. name .. \"_subscribe.lock\"\n\n\tif action == \"start\" then\n\t\tmath.randomseed(os.time() + math.floor(os.clock() * 1000))\n\t\tapi.nixio.nanosleep(0, math.random(100, 1000) * 1000000)\n\t\tif fs.access(rule_lock) then\n\t\t\tlog(0, api.i18n.translatef(\"[Rule update] instance is running; please try again later.\") .. \"\\n\")\n\t\t\tos.exit(0)\n\t\telse\n\t\t\tluci.sys.call(\"touch \" .. rule_lock)\n\t\tend\n\telseif action == \"end\" then\n\t\tluci.sys.call(\"rm -f \" .. rule_lock)\n\t\treturn\n\tend\n\n\tif fs.access(sub_lock) then\n\t\tlog(0, api.i18n.translatef(\"[Subscription] instance is running; [Rule Update] queue and wait.\") .. \"\\n\")\n\tend\n\twhile fs.access(sub_lock) do\n\t\tapi.nixio.nanosleep(2, 0)\n\tend\nend\n\ncheck_instance(\"start\")\n\nlog(0, api.i18n.translate(\"Start updating the rules...\"))\nlocal function safe_call(func, err_msg)\n\txpcall(func, function(e)\n\t\tlog(1, e)\n\t\tlog(1, debug.traceback())\n\t\tlog(1, err_msg)\n\tend)\nend\n\nif geoip_update == \"1\" then\n\tlog(1, api.i18n.translatef(\"%s Start updating...\", \"geoip\"))\n\tsafe_call(fetch_geoip, api.i18n.translatef(\"%s update error!\", \"geoip\"))\n\tremove_tmp_geofile(\"geoip\")\nend\n\nif geosite_update == \"1\" then\n\tlog(1, api.i18n.translatef(\"%s Start updating...\", \"geosite\"))\n\tsafe_call(fetch_geosite, api.i18n.translatef(\"%s update error!\", \"geosite\"))\n\tremove_tmp_geofile(\"geosite\")\nend\n\nuci:set(name, \"@global_rules[0]\", \"geoip_update\", geoip_update)\nuci:set(name, \"@global_rules[0]\", \"geosite_update\", geosite_update)\napi.uci_save(uci, name, true)\n\nif reboot == 1 then\n\tif arg3 == \"cron\" then\n\t\tif not fs.access(\"/var/lock/\" .. name .. \".lock\") then\n\t\t\tsys.call(\"touch /tmp/lock/\" .. name .. \"_cron.lock\")\n\t\tend\n\tend\n\n\tlog(1, api.i18n.translate(\"Restart the service and apply the new rules.\"))\n\tuci:set(name, \"@global[0]\", \"flush_set\", \"1\")\n\tapi.uci_save(uci, name, true, true)\nend\nlog(0, api.i18n.translate(\"The rules have been updated...\"))\n\ncheck_instance(\"end\")\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/passwall2/socks_auto_switch.sh",
    "content": "#!/bin/sh\n\n. /usr/share/passwall2/utils.sh\nAPP_FILE=${APP_PATH}/app.sh\n\nflag=0\n\ncheck_process() {\n\twhile pgrep -af \"${CONFIG}/\" | grep -E 'app\\.sh.*(start|stop)|nftables\\.sh|iptables\\.sh|subscribe\\.lua' >/dev/null; do\n\t\tsleep 6s\n\tdone\n}\n\ntest_url() {\n\tlocal url=$1\n\tlocal try=1\n\t[ -n \"$2\" ] && try=$2\n\tlocal timeout=2\n\t[ -n \"$3\" ] && timeout=$3\n\tlocal extra_params=$4\n\tif /usr/bin/curl --help all | grep -q \"\\-\\-retry-all-errors\"; then\n\t\textra_params=\"--retry-all-errors ${extra_params}\"\n\tfi\n\tlocal status=$(/usr/bin/curl -I -o /dev/null -skL ${extra_params} --connect-timeout ${timeout} --retry ${try} -w %{http_code} \"$url\")\n\tcase \"$status\" in\n\t\t204)\n\t\t\tstatus=200\n\t\t;;\n\tesac\n\techo $status\n}\n\ntest_proxy() {\n\tlocal result=0\n\tlocal status=$(test_url \"${probe_url}\" ${retry_num} ${connect_timeout} \"-x socks5h://127.0.0.1:${socks_port}\")\n\tif [ \"$status\" = \"200\" ]; then\n\t\tresult=0\n\telse\n\t\tlocal status2=$(test_url \"https://www.baidu.com\" ${retry_num} ${connect_timeout})\n\t\tif [ \"$status2\" = \"200\" ]; then\n\t\t\tresult=1\n\t\telse\n\t\t\tresult=2\n\t\t\tping -c 3 -W 1 223.5.5.5 > /dev/null 2>&1\n\t\t\t[ $? -eq 0 ] && {\n\t\t\t\tresult=1\n\t\t\t}\n\t\tfi\n\tfi\n\techo $result\n}\n\ntest_node() {\n\tlocal node_id=$1\n\tlocal _type=$(echo $(config_n_get ${node_id} type) | tr 'A-Z' 'a-z')\n\t[ -n \"${_type}\" ] && {\n\t\tcheck_process\n\t\tlocal _tmp_port=$(get_new_port 48800 tcp,udp)\n\t\tNO_REC_PROCESS=1 $APP_FILE run_socks flag=\"test_node_${node_id}\" node=${node_id} bind=127.0.0.1 socks_port=${_tmp_port} config_file=test_node_${node_id}.json\n\t\tsleep 2s\n\t\tlocal curlx=\"socks5h://127.0.0.1:${_tmp_port}\"\n\t\tlocal _proxy_status=$(test_url \"${probe_url}\" ${retry_num} ${connect_timeout} \"-x $curlx\")\n\t\t# Kill the SS plugin process\n\t\tlocal pid_file=\"/tmp/etc/${CONFIG}/test_node_${node_id}_plugin.pid\"\n\t\t[ -s \"$pid_file\" ] && kill -9 \"$(head -n 1 \"$pid_file\")\" >/dev/null 2>&1\n\t\tpgrep -af \"test_node_${node_id}\" | awk '! /socks_auto_switch\\.sh/{print $1}' | xargs kill -9 >/dev/null 2>&1\n\t\trm -rf /tmp/etc/${CONFIG}/test_node_${node_id}*.*\n\t\tif [ \"${_proxy_status}\" -eq 200 ]; then\n\t\t\treturn 0\n\t\tfi\n\t}\n\treturn 1\n}\n\ntest_auto_switch() {\n\tflag=$((flag + 1))\n\tlocal b_nodes=$1\n\tlocal now_node=$2\n\t[ -z \"$now_node\" ] && {\n\t\tif [ -n \"$(get_cache_var \"socks_${id}\")\" ]; then\n\t\t\tnow_node=$(get_cache_var \"socks_${id}\")\n\t\telse\n\t\t\t#log_i18n 0 \"Socks switch detection: Unknown error.\"\n\t\t\treturn 1\n\t\tfi\n\t}\n\t\n\t[ $flag -le 1 ] && {\n\t\tmain_node=$now_node\n\t}\n\n\tlocal status=$(test_proxy)\n\tif [ \"$status\" = \"2\" ]; then\n\t\tlog_i18n 0 \"Socks switch detection: Unable to connect to the network. Please check if the network is working properly!\"\n\t\treturn 2\n\tfi\n\n\t# Check if the main node is usable\n\tif [ \"$restore_switch\" = \"1\" ] && [ -n \"$main_node\" ] && [ \"$now_node\" != \"$main_node\" ]; then\n\t\ttest_node ${main_node}\n\t\t[ $? -eq 0 ] && {\n\t\t\tcheck_process\n\t\t\t# The main node is working properly; switch to the main node.\n\t\t\tlog_i18n 0 \"Socks switch detection: Primary node 【%s: [%s]】 is normal. Switch to the primary node!\" \"${id}\" \"$(config_n_get $main_node type)\" \"$(config_n_get $main_node remarks)\"\n\t\t\t$APP_FILE socks_node_switch flag=${id} new_node=${main_node}\n\t\t\t[ $? -eq 0 ] && {\n\t\t\t\tlog_i18n 0 \"Socks switch detection: %s node switch complete!\" \"${id}\"\n\t\t\t}\n\t\t\treturn 0\n\t\t}\n\tfi\n\n\tif [ \"$status\" = \"0\" ]; then\n\t\t#log_i18n 0 \"Socks switch detection: %s 【%s:[%s]】 normal.\" \"${id}\" \"$(config_n_get $now_node type)\" \"$(config_n_get $now_node remarks)\"\n\t\treturn 0\n\telif [ \"$status\" = \"1\" ]; then\n\t\tlocal new_node msg\n\t\tif [ \"$backup_node_num\" -gt 1 ]; then\n\t\t\t# When there are multiple backup nodes\n\t\t\tlocal first_node found node\n\t\t\tfor node in $b_nodes; do\n\t\t\t\t[ -z \"$first_node\" ] && first_node=\"$node\"       # Record the first node.\n\t\t\t\t[ \"$found\" = \"1\" ] && { new_node=\"$node\"; break; } # Find the current node and then retrieve the next one.\n\t\t\t\t[ \"$node\" = \"$now_node\" ] && found=1             # Mark the current node found.\n\t\t\tdone\n\t\t\t# If the current node is not found, or if the current node is the last node, then take the first node.\n\t\t\t[ -z \"$new_node\" ] && new_node=\"$first_node\"\n\t\t\tlocal msg2=\"$(i18n \"next backup node\")\"\n\t\t\t[ \"$now_node\" = \"$main_node\" ] && msg2=\"$(i18n \"backup node\")\"\n\t\t\tmsg=\"$(i18n \"switch to %s test detect!\" \"${msg2}\")\"\n\t\telse\n\t\t\t# When there is only one backup node, poll with the primary node.\n\t\t\tnew_node=$([ \"$now_node\" = \"$main_node\" ] && echo \"$b_nodes\" || echo \"$main_node\")\n\t\t\tlocal msg2=\"$(i18n \"main node\")\"\n\t\t\t[ \"$now_node\" = \"$main_node\" ] && msg2=\"$(i18n \"backup node\")\"\n\t\t\tmsg=\"$(i18n \"switch to %s test detect!\" \"${msg2}\")\"\n\t\tfi\n\t\tlog_i18n 0 \"Socks switch detection: %s 【%s:[%s]】 abnormal, %s\" \"${id}\" \"$(config_n_get $now_node type)\" \"$(config_n_get $now_node remarks)\" \"${msg}\"\n\t\ttest_node ${new_node}\n\t\tif [ $? -eq 0 ]; then\n#\t\t\t[ \"$restore_switch\" = \"0\" ] && {\n#\t\t\t\tuci set $CONFIG.${id}.node=$new_node\n#\t\t\t\t[ -z \"$(echo $b_nodes | grep $main_node)\" ] && uci add_list $CONFIG.${id}.autoswitch_backup_node=$main_node\n#\t\t\t\tuci commit $CONFIG\n#\t\t\t}\n\t\t\tcheck_process\n\t\t\tlog_i18n 0 \"Socks switch detection: %s 【%s:[%s]】 normal, switch to this node!\" \"${id}\" \"$(config_n_get $new_node type)\" \"$(config_n_get $new_node remarks)\"\n\t\t\t$APP_FILE socks_node_switch flag=${id} new_node=${new_node}\n\t\t\t[ $? -eq 0 ] && {\n\t\t\t\tlog_i18n 0 \"Socks switch detection: %s node switch complete!\" \"${id}\"\n\t\t\t}\n\t\t\treturn 0\n\t\telse\n\t\t\ttest_auto_switch \"${b_nodes}\" ${new_node}\n\t\tfi\n\tfi\n}\n\nstart() {\n\tid=$1\n\tLOCK_FILE=${LOCK_PATH}/${CONFIG}_socks_auto_switch_${id}.lock\n\tmain_node=$(config_n_get $id node)\n\tsocks_port=$(config_n_get $id port 0)\n\tdelay=$(config_n_get $id autoswitch_testing_time 30)\n\tconnect_timeout=$(config_n_get $id autoswitch_connect_timeout 3)\n\tretry_num=$(config_n_get $id autoswitch_retry_num 1)\n\trestore_switch=$(config_n_get $id autoswitch_restore_switch 0)\n\tprobe_url=$(config_n_get $id autoswitch_probe_url \"https://www.google.com/generate_204\")\n\tbackup_node=$(config_n_get $id autoswitch_backup_node)\n\tif [ -n \"$backup_node\" ]; then\n\t\tbackup_node=$(echo \"$backup_node\" | tr -s ' ' '\\n' | uniq | tr -s '\\n' ' ')\n\t\tbackup_node_num=$(printf \"%s\\n\" \"$backup_node\" | wc -w)\n\t\tif [ \"$backup_node_num\" -eq 1 ]; then\n\t\t\t[ \"$main_node\" = \"$backup_node\" ] && return\n\t\tfi\n\telse\n\t\treturn\n\tfi\n\twhile [ -n \"$backup_node\" ]; do\n\t\t[ -f \"$LOCK_FILE\" ] && {\n\t\t\tsleep 6s\n\t\t\tcontinue\n\t\t}\n\t\tcheck_process\n\t\ttouch $LOCK_FILE\n\t\ttest_auto_switch \"$backup_node\"\n\t\trm -f $LOCK_FILE\n\t\tsleep ${delay}\n\tdone\n}\n\nstart $@\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/passwall2/subscribe.lua",
    "content": "#!/usr/bin/lua\n\n------------------------------------------------\n-- @author William Chan <root@williamchan.me>\n------------------------------------------------\nrequire 'luci.util'\nrequire 'luci.jsonc'\nrequire 'luci.sys'\nlocal appname = 'passwall2'\nlocal api = require (\"luci.passwall2.api\")\nlocal datatypes = require \"luci.cbi.datatypes\"\n\n-- these global functions are accessed all the time by the event handler\n-- so caching them is worth the effort\nlocal tinsert = table.insert\nlocal ssub, slen, schar, sbyte, sformat, sgsub = string.sub, string.len, string.char, string.byte, string.format, string.gsub\nlocal split = api.split\nlocal jsonParse, jsonStringify = luci.jsonc.parse, luci.jsonc.stringify\nlocal base64Decode = api.base64Decode\nlocal UrlEncode = api.UrlEncode\nlocal UrlDecode = api.UrlDecode\nlocal uci = api.uci\nlocal fs = api.fs\nlocal log = api.log\nlocal i18n = api.i18n\nlocal lyaml = require \"lyaml\"\n\nlocal has_ss = api.is_finded(\"ss-redir\")\nlocal has_ss_rust = api.is_finded(\"sslocal\")\nlocal has_ssr = api.is_finded(\"ssr-local\") and api.is_finded(\"ssr-redir\")\nlocal has_singbox = api.finded_com(\"sing-box\")\nlocal has_xray = api.finded_com(\"xray\")\nlocal has_hysteria2 = api.finded_com(\"hysteria\")\nlocal DEFAULT_ALLOWINSECURE = true\nlocal DEFAULT_FILTER_KEYWORD_MODE = uci:get(appname, \"@global_subscribe[0]\", \"filter_keyword_mode\") or \"0\"\nlocal DEFAULT_FILTER_KEYWORD_DISCARD_LIST = uci:get(appname, \"@global_subscribe[0]\", \"filter_discard_list\") or {}\nlocal DEFAULT_FILTER_KEYWORD_KEEP_LIST = uci:get(appname, \"@global_subscribe[0]\", \"filter_keep_list\") or {}\n-- Nodes should be retrieved using the core type (if not set on the node subscription page, the default type will be used automatically).\nlocal DEFAULT_SS_TYPE = api.get_core(\"ss_type\", {{has_ss,\"shadowsocks-libev\"},{has_ss_rust,\"shadowsocks-rust\"},{has_singbox,\"sing-box\"},{has_xray,\"xray\"}})\nlocal DEFAULT_TROJAN_TYPE = api.get_core(\"trojan_type\", {{has_singbox,\"sing-box\"},{has_xray,\"xray\"}})\nlocal DEFAULT_VMESS_TYPE = api.get_core(\"vmess_type\", {{has_xray,\"xray\"},{has_singbox,\"sing-box\"}})\nlocal DEFAULT_VLESS_TYPE = api.get_core(\"vless_type\", {{has_xray,\"xray\"},{has_singbox,\"sing-box\"}})\nlocal DEFAULT_HYSTERIA2_TYPE = api.get_core(\"hysteria2_type\", {{has_hysteria2,\"hysteria2\"},{has_singbox,\"sing-box\"},{has_xray,\"xray\"}})\nlocal core_has = {\n\t[\"xray\"] = has_xray,\n\t[\"sing-box\"] = has_singbox,\n\t[\"shadowsocks-libev\"] = has_ss,\n\t[\"shadowsocks-rust\"] = has_ss_rust,\n\t[\"hysteria2\"] = has_hysteria2\n}\n-- Determine whether to filter node keywords\nlocal function is_filter_keyword(sub_cfg, value)\n\tlocal mode = DEFAULT_FILTER_KEYWORD_MODE\n\tlocal discard_list = DEFAULT_FILTER_KEYWORD_DISCARD_LIST\n\tlocal keep_list = DEFAULT_FILTER_KEYWORD_KEEP_LIST\n\tif sub_cfg then\n\t\tlocal filter_keyword_mode = sub_cfg.filter_keyword_mode or \"5\" -- 5 is global\n\t\tif filter_keyword_mode == \"0\" then\n\t\t\tmode = \"0\"\n\t\telseif filter_keyword_mode == \"1\" then\n\t\t\tmode = \"1\"\n\t\t\tdiscard_list = sub_cfg.filter_discard_list or {}\n\t\telseif filter_keyword_mode == \"2\" then\n\t\t\tmode = \"2\"\n\t\t\tkeep_list = sub_cfg.filter_keep_list or {}\n\t\telseif filter_keyword_mode == \"3\" then\n\t\t\tmode = \"3\"\n\t\t\tkeep_list = sub_cfg.filter_keep_list or {}\n\t\t\tdiscard_list = sub_cfg.filter_discard_list or {}\n\t\telseif filter_keyword_mode == \"4\" then\n\t\t\tmode = \"4\"\n\t\t\tkeep_list = sub_cfg.filter_keep_list or {}\n\t\t\tdiscard_list = sub_cfg.filter_discard_list or {}\n\t\tend\n\tend\n\tif mode == \"1\" then\n\t\tfor k,v in ipairs(discard_list) do\n\t\t\tif value:find(v, 1, true) then\n\t\t\t\treturn true\n\t\t\tend\n\t\tend\n\telseif mode == \"2\" then\n\t\tlocal result = true\n\t\tfor k,v in ipairs(keep_list) do\n\t\t\tif value:find(v, 1, true) then\n\t\t\t\tresult = false\n\t\t\tend\n\t\tend\n\t\treturn result\n\telseif mode == \"3\" then\n\t\tlocal result = false\n\t\tfor k,v in ipairs(discard_list) do\n\t\t\tif value:find(v, 1, true) then\n\t\t\t\tresult = true\n\t\t\tend\n\t\tend\n\t\tfor k,v in ipairs(keep_list) do\n\t\t\tif value:find(v, 1, true) then\n\t\t\t\tresult = false\n\t\t\tend\n\t\tend\n\t\treturn result\n\telseif mode == \"4\" then\n\t\tlocal result = true\n\t\tfor k,v in ipairs(keep_list) do\n\t\t\tif value:find(v, 1, true) then\n\t\t\t\tresult = false\n\t\t\tend\n\t\tend\n\t\tfor k,v in ipairs(discard_list) do\n\t\t\tif value:find(v, 1, true) then\n\t\t\t\tresult = true\n\t\t\tend\n\t\tend\n\t\treturn result\n\tend\n\treturn false\nend\n\nlocal nodeResult = {} -- update result\nlocal nodes_table = {}\nfor k, e in ipairs(api.get_valid_nodes()) do\n\tif e.node_type == \"normal\" then\n\t\tnodes_table[#nodes_table + 1] = e\n\tend\nend\n\n-- To retrieve the current server's dynamic configurations, you can use `get` and `set`. `get` requires access to the node table.\nlocal CONFIG = {}\ndo\n\tif true then\n\t\tlocal szType = \"@global[0]\"\n\t\tlocal option = \"node\"\n\t\t\n\t\tlocal node_id = uci:get(appname, szType, option)\n\t\tCONFIG[#CONFIG + 1] = {\n\t\t\tlog = true,\n\t\t\tremarks = i18n.translatef(\"Node\"),\n\t\t\tcurrentNode = node_id and uci:get_all(appname, node_id) or nil,\n\t\t\tset = function(o, server)\n\t\t\t\tuci:set(appname, szType, option, server)\n\t\t\t\to.newNodeId = server\n\t\t\tend\n\t\t}\n\tend\n\n\tif true then\n\t\tlocal i = 0\n\t\tlocal option = \"node\"\n\t\tuci:foreach(appname, \"socks\", function(t)\n\t\t\ti = i + 1\n\t\t\tlocal id = t[\".name\"]\n\t\t\tlocal node_id = t[option]\n\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\tlog = true,\n\t\t\t\tid = id,\n\t\t\t\tremarks = i18n.translatef(\"Socks node list [%s]\", i),\n\t\t\t\tcurrentNode = node_id and uci:get_all(appname, node_id) or nil,\n\t\t\t\tset = function(o, server)\n\t\t\t\t\tif not server or server == \"\" then\n\t\t\t\t\t\tif #nodes_table > 0 then\n\t\t\t\t\t\t\tserver = nodes_table[1][\".name\"]\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tuci:set(appname, t[\".name\"], option, server)\n\t\t\t\t\to.newNodeId = server\n\t\t\t\tend\n\t\t\t}\n\t\t\tif t.autoswitch_backup_node and #t.autoswitch_backup_node > 0 then\n\t\t\t\tlocal flag = i18n.translatef(\"Socks node list [%s]\", i) .. \" \" .. i18n.translatef(\"Backup node list\")\n\t\t\t\tlocal currentNodes = {}\n\t\t\t\tlocal newNodes = {}\n\t\t\t\tfor k, node_id in ipairs(t.autoswitch_backup_node) do\n\t\t\t\t\tif node_id then\n\t\t\t\t\t\tlocal currentNode = uci:get_all(appname, node_id) or nil\n\t\t\t\t\t\tif currentNode then\n\t\t\t\t\t\t\tcurrentNodes[#currentNodes + 1] = {\n\t\t\t\t\t\t\t\tlog = true,\n\t\t\t\t\t\t\t\tremarks = flag .. \"[\" .. k .. \"]\",\n\t\t\t\t\t\t\t\tcurrentNode = currentNode,\n\t\t\t\t\t\t\t\tset = function(o, server)\n\t\t\t\t\t\t\t\t\tif server and server ~= \"nil\" then\n\t\t\t\t\t\t\t\t\t\ttable.insert(o.newNodes, server)\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\t\tremarks = flag,\n\t\t\t\t\tcurrentNodes = currentNodes,\n\t\t\t\t\tnewNodes = newNodes,\n\t\t\t\t\tset = function(o, newNodes)\n\t\t\t\t\t\tif o then\n\t\t\t\t\t\t\tif not newNodes then newNodes = o.newNodes end\n\t\t\t\t\t\t\tuci:set_list(appname, id, \"autoswitch_backup_node\", newNodes or {})\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t}\n\t\t\tend\n\t\tend)\n\tend\n\n\tif true then\n\t\tlocal i = 0\n\t\tlocal option = \"lbss\"\n\t\tlocal function is_ip_port(str)\n\t\t\tif type(str) ~= \"string\" then return false end\n\t\t\tlocal ip, port = str:match(\"^([%d%.]+):(%d+)$\")\n\t\t\treturn ip and datatypes.ipaddr(ip) and tonumber(port) and tonumber(port) <= 65535\n\t\tend\n\t\tuci:foreach(appname, \"haproxy_config\", function(t)\n\t\t\ti = i + 1\n\t\t\tlocal node_id = t[option]\n\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\tlog = true,\n\t\t\t\tid = t[\".name\"],\n\t\t\t\tremarks = i18n.translatef(\"HAProxy node list [%s]\", i),\n\t\t\t\tcurrentNode = node_id and uci:get_all(appname, node_id) or nil,\n\t\t\t\tset = function(o, server)\n\t\t\t\t\t-- Modify the LBS value only if it is not in IP:Port format.\n\t\t\t\t\tif not is_ip_port(t[option]) then\n\t\t\t\t\t\tuci:set(appname, t[\".name\"], option, server)\n\t\t\t\t\t\to.newNodeId = server\n\t\t\t\t\tend\n\t\t\t\tend,\n\t\t\t\tdelete = function(o)\n\t\t\t\t\t-- Deletion is only performed if the current LBS value is not in IP:port format.\n\t\t\t\t\tif not is_ip_port(t[option]) then\n\t\t\t\t\t\tuci:delete(appname, t[\".name\"])\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t}\n\t\tend)\n\tend\n\n\tif true then\n\t\tlocal i = 0\n\t\tuci:foreach(appname, \"acl_rule\", function(t)\n\t\t\ti = i + 1\n\t\t\tlocal option = \"node\"\n\t\t\tlocal node_id = t[option]\n\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\tlog = true,\n\t\t\t\tid = t[\".name\"],\n\t\t\t\tremarks = i18n.translatef(\"ACL list [%s]\", i),\n\t\t\t\tcurrentNode = node_id and uci:get_all(appname, node_id) or nil,\n\t\t\t\tset = function(o, server)\n\t\t\t\t\tuci:set(appname, t[\".name\"], option, server)\n\t\t\t\t\to.newNodeId = server\n\t\t\t\tend\n\t\t\t}\n\t\tend)\n\tend\n\n\tuci:foreach(appname, \"nodes\", function(node)\n\t\tlocal node_id = node[\".name\"]\n\t\tif node.protocol and node.protocol == '_shunt' then\n\t\t\tlocal rules = {}\n\t\t\tuci:foreach(appname, \"shunt_rules\", function(e)\n\t\t\t\tif e[\".name\"] and e.remarks then\n\t\t\t\t\ttable.insert(rules, e)\n\t\t\t\t\ttable.insert(rules, {\n\t\t\t\t\t\t[\".name\"] = e[\".name\"] .. \"_proxy_tag\",\n\t\t\t\t\t\tremarks = e.remarks .. \" \" .. i18n.translate(\"Preproxy\")\n\t\t\t\t\t})\n\t\t\t\tend\n\t\t\tend)\n\t\t\ttable.insert(rules, {\n\t\t\t\t[\".name\"] = \"default_node\",\n\t\t\t\tremarks = i18n.translatef(\"Default\")\n\t\t\t})\n\t\t\ttable.insert(rules, {\n\t\t\t\t[\".name\"] = \"default_proxy_tag\",\n\t\t\t\tremarks = i18n.translatef(\"Default\") .. \" \" .. i18n.translate(\"Preproxy\")\n\t\t\t})\n\n\t\t\tfor k, e in pairs(rules) do\n\t\t\t\tlocal _node_id = node[e[\".name\"]] or nil\n\t\t\t\tif _node_id and not _node_id:find(\"Socks_\") then\n\t\t\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\t\t\tlog = false,\n\t\t\t\t\t\tcurrentNode = _node_id and uci:get_all(appname, _node_id) or nil,\n\t\t\t\t\t\tremarks = i18n.translatef(\"Shunt [%s] node\", e.remarks),\n\t\t\t\t\t\tset = function(o, server)\n\t\t\t\t\t\t\tif not server then server = \"\" end\n\t\t\t\t\t\t\tuci:set(appname, node_id, e[\".name\"], server)\n\t\t\t\t\t\t\to.newNodeId = server\n\t\t\t\t\t\tend\n\t\t\t\t\t}\n\t\t\t\tend\n\t\t\t\t\n\t\t\tend\n\t\telseif node.protocol and node.protocol == '_balancing' then\n\t\t\tlocal flag = i18n.translatef(\"Xray Load Balancing node [%s] list\", node_id)\n\t\t\tlocal currentNodes = {}\n\t\t\tlocal newNodes = {}\n\t\t\tif node.balancing_node then\n\t\t\t\tfor k, node in pairs(node.balancing_node) do\n\t\t\t\t\tcurrentNodes[#currentNodes + 1] = {\n\t\t\t\t\t\tlog = true,\n\t\t\t\t\t\tnode = node,\n\t\t\t\t\t\tcurrentNode = (function()\n\t\t\t\t\t\t\tif node and node:find(\"Socks_\") then\n\t\t\t\t\t\t\t\treturn { Socks = node }\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\treturn node and uci:get_all(appname, node) or nil\n\t\t\t\t\t\tend)(),\n\t\t\t\t\t\tremarks = node,\n\t\t\t\t\t\tset = function(o, server)\n\t\t\t\t\t\t\tif o and server and server ~= \"nil\" then\n\t\t\t\t\t\t\t\ttable.insert(o.newNodes, server)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t}\n\t\t\t\tend\n\t\t\tend\n\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\tremarks = flag,\n\t\t\t\tcurrentNodes = currentNodes,\n\t\t\t\tnewNodes = newNodes,\n\t\t\t\tset = function(o, newNodes)\n\t\t\t\t\tif o then\n\t\t\t\t\t\tif not newNodes then newNodes = o.newNodes end\n\t\t\t\t\t\tuci:set_list(appname, node_id, \"balancing_node\", newNodes or {})\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t}\n\n\t\t\t-- Backup Node\n\t\t\tlocal currentNode = uci:get_all(appname, node_id) or nil\n\t\t\tif currentNode and currentNode.fallback_node and not currentNode.fallback_node:find(\"Socks_\") then\n\t\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\t\tlog = true,\n\t\t\t\t\tid = node_id,\n\t\t\t\t\tremarks = i18n.translatef(\"Xray Load Balancing node [%s] backup node\", node_id),\n\t\t\t\t\tcurrentNode = uci:get_all(appname, currentNode.fallback_node) or nil,\n\t\t\t\t\tset = function(o, server)\n\t\t\t\t\t\tuci:set(appname, node_id, \"fallback_node\", server)\n\t\t\t\t\t\to.newNodeId = server\n\t\t\t\t\tend,\n\t\t\t\t\tdelete = function(o)\n\t\t\t\t\t\tuci:delete(appname, node_id, \"fallback_node\")\n\t\t\t\t\tend\n\t\t\t\t}\n\t\t\tend\n\t\telseif node.protocol and node.protocol == '_urltest' then\n\t\t\tlocal flag = i18n.translatef(\"Sing-Box URLTest node [%s] list\", node_id)\n\t\t\tlocal currentNodes = {}\n\t\t\tlocal newNodes = {}\n\t\t\tif node.urltest_node then\n\t\t\t\tfor k, node in pairs(node.urltest_node) do\n\t\t\t\t\tcurrentNodes[#currentNodes + 1] = {\n\t\t\t\t\t\tlog = true,\n\t\t\t\t\t\tnode = node,\n\t\t\t\t\t\tcurrentNode = (function()\n\t\t\t\t\t\t\tif node and node:find(\"Socks_\") then\n\t\t\t\t\t\t\t\treturn { Socks = node }\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\treturn node and uci:get_all(appname, node) or nil\n\t\t\t\t\t\tend)(),\n\t\t\t\t\t\tremarks = node,\n\t\t\t\t\t\tset = function(o, server)\n\t\t\t\t\t\t\tif o and server and server ~= \"nil\" then\n\t\t\t\t\t\t\t\ttable.insert(o.newNodes, server)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t}\n\t\t\t\tend\n\t\t\tend\n\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\tremarks = flag,\n\t\t\t\tcurrentNodes = currentNodes,\n\t\t\t\tnewNodes = newNodes,\n\t\t\t\tset = function(o, newNodes)\n\t\t\t\t\tif o then\n\t\t\t\t\t\tif not newNodes then newNodes = o.newNodes end\n\t\t\t\t\t\tuci:set_list(appname, node_id, \"urltest_node\", newNodes or {})\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t}\n\t\telse\n\t\t\t-- Preproxy Node\n\t\t\tlocal currentNode = uci:get_all(appname, node_id) or nil\n\t\t\tif currentNode and currentNode.preproxy_node and not currentNode.preproxy_node:find(\"Socks_\") then\n\t\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\t\tlog = true,\n\t\t\t\t\tid = node_id,\n\t\t\t\t\tremarks = i18n.translatef(\"Node [%s] preproxy node\", node_id),\n\t\t\t\t\tcurrentNode = uci:get_all(appname, currentNode.preproxy_node) or nil,\n\t\t\t\t\tset = function(o, server)\n\t\t\t\t\t\tuci:set(appname, node_id, \"preproxy_node\", server)\n\t\t\t\t\t\to.newNodeId = server\n\t\t\t\t\tend,\n\t\t\t\t\tdelete = function(o)\n\t\t\t\t\t\tuci:delete(appname, node_id, \"preproxy_node\")\n\t\t\t\t\tend\n\t\t\t\t}\n\t\t\tend\n\t\t\t-- Landing node\n\t\t\tlocal currentNode = uci:get_all(appname, node_id) or nil\n\t\t\tif currentNode and currentNode.to_node and not currentNode.to_node:find(\"Socks_\") then\n\t\t\t\tCONFIG[#CONFIG + 1] = {\n\t\t\t\t\tlog = true,\n\t\t\t\t\tid = node_id,\n\t\t\t\t\tremarks = i18n.translatef(\"Node [%s] landing node\", node_id),\n\t\t\t\t\tcurrentNode = uci:get_all(appname, currentNode.to_node) or nil,\n\t\t\t\t\tset = function(o, server)\n\t\t\t\t\t\tuci:set(appname, node_id, \"to_node\", server)\n\t\t\t\t\t\to.newNodeId = server\n\t\t\t\t\tend,\n\t\t\t\t\tdelete = function(o)\n\t\t\t\t\t\tuci:delete(appname, node_id, \"to_node\")\n\t\t\t\t\tend\n\t\t\t\t}\n\t\t\tend\n\t\tend\n\tend)\n\n\tfor k, v in pairs(CONFIG) do\n\t\tif v.currentNodes and type(v.currentNodes) == \"table\" then\n\t\t\tfor kk, vv in pairs(v.currentNodes) do\n\t\t\t\tif vv.currentNode == nil then\n\t\t\t\t\tCONFIG[k].currentNodes[kk] = nil\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tif v.currentNode == nil then\n\t\t\t\tif v.delete then\n\t\t\t\t\tv.delete()\n\t\t\t\tend\n\t\t\t\tCONFIG[k] = nil\n\t\t\tend\n\t\tend\n\tend\nend\n\n-- Retrieve subscribe information (remaining data allowance, expiration time).\nlocal subscribe_info = {}\nlocal function get_subscribe_info(cfgid, value)\n\tif type(cfgid) ~= \"string\" or cfgid == \"\" or type(value) ~= \"string\" then\n\t\treturn\n\tend\n\tvalue = value:gsub(\"%s+\", \"\")\n\tlocal date_patterns = {\"套餐到期：(.+)\", \"过期时间：(.+)\", \"有效期至：(.+)\", \"到期时间：(.+)\", \"截止日期：(.+)\"}\n\tlocal expired_date\n\tfor _, p in ipairs(date_patterns) do expired_date = value:match(p) or expired_date end\n\tlocal rem_patterns = {\"剩余流量：(.+)\", \"流量剩余：(.+)\", \"可用流量：(.+)\", \"套餐剩余：(.+)\"}\n\tlocal rem_traffic\n\tfor _, p in ipairs(rem_patterns) do rem_traffic = value:match(p) or rem_traffic end\n\tsubscribe_info[cfgid] = subscribe_info[cfgid] or {expired_date = \"\", rem_traffic = \"\"}\n\tif expired_date then\n\t\tsubscribe_info[cfgid][\"expired_date\"] = expired_date\n\tend\n\tif rem_traffic then\n\t\tsubscribe_info[cfgid][\"rem_traffic\"] = rem_traffic\n\tend\nend\n\n-- Configure the SS protocol implementation type\nlocal function set_ss_implementation(ss_type, result)\n\tif ss_type == \"shadowsocks-libev\" and has_ss then\n\t\tresult.type = \"SS\"\n\telseif ss_type == \"shadowsocks-rust\" and has_ss_rust then\n\t\tresult.type = 'SS-Rust'\n\telseif ss_type == \"xray\" and has_xray then\n\t\tresult.type = 'Xray'\n\t\tresult.protocol = 'shadowsocks'\n\t\tresult.transport = 'raw'\n\telseif ss_type == \"sing-box\" and has_singbox then\n\t\tresult.type = 'sing-box'\n\t\tresult.protocol = 'shadowsocks'\n\telse\n\t\tlog(2, i18n.translatef(\"Skipping the %s node is due to incompatibility with the %s core program or incorrect node usage type settings.\", \"SS\", \"SS\"))\n\t\treturn nil\n\tend\n\treturn result\nend\n\nlocal function parseClashNode(node, add_mode, group, sub_cfg)\n\tlocal sub_allowinsecure = DEFAULT_ALLOWINSECURE\n\tlocal sub_ss_type = DEFAULT_SS_TYPE\n\tlocal sub_trojan_type = DEFAULT_TROJAN_TYPE\n\tlocal sub_vmess_type = DEFAULT_VMESS_TYPE\n\tlocal sub_vless_type = DEFAULT_VLESS_TYPE\n\tlocal sub_hysteria2_type = DEFAULT_HYSTERIA2_TYPE\n\tif sub_cfg then\n\t\tif sub_cfg.allowInsecure and sub_cfg.allowInsecure ~= \"1\" then\n\t\t\tsub_allowinsecure = nil\n\t\tend\n\t\tlocal ss_type = sub_cfg.ss_type or \"global\"\n\t\tif ss_type ~= \"global\" and core_has[ss_type] then\n\t\t\tsub_ss_type = ss_type\n\t\tend\n\t\tlocal trojan_type = sub_cfg.trojan_type or \"global\"\n\t\tif trojan_type ~= \"global\" and core_has[trojan_type] then\n\t\t\tsub_trojan_type = trojan_type\n\t\tend\n\t\tlocal vmess_type = sub_cfg.vmess_type or \"global\"\n\t\tif vmess_type ~= \"global\" and core_has[vmess_type] then\n\t\t\tsub_vmess_type = vmess_type\n\t\tend\n\t\tlocal vless_type = sub_cfg.vless_type or \"global\"\n\t\tif vless_type ~= \"global\" and core_has[vless_type] then\n\t\t\tsub_vless_type = vless_type\n\t\tend\n\t\tlocal hysteria2_type = sub_cfg.hysteria2_type or \"global\"\n\t\tif hysteria2_type ~= \"global\" and core_has[hysteria2_type] then\n\t\t\tsub_hysteria2_type = hysteria2_type\n\t\tend\n\tend\n\tlocal result = {\n\t\ttimeout = 60,\n\t\tadd_mode = add_mode, -- `0` for manual configuration, `1` for import, `2` for subscription\n\t\tgroup = group\n\t}\n\tresult.remarks = node.name\n\tresult.address = node.server\n\tresult.port = node.port\n\n\tif node.type == 'ss' then\n\t\tresult = set_ss_implementation(sub_ss_type, result)\n\t\tif not result then return nil end\n\t\tresult.method = node.cipher\n\t\tresult.password = node.password\n\t\tif node.plugin == \"obfs\" then\n\t\t\tresult.plugin = \"obfs-local\"\n\t\telseif node.plugin == \"v2ray-plugin\" then\n\t\t\tresult.plugin = \"v2ray-plugin\"\n\t\tend\n\t\tif node[\"plugin-opts\"] then\n\t\t\tif node.plugin == \"obfs\" then\n\t\t\t\tlocal plugin_opts = \"\"\n\t\t\t\tlocal opts_mode = node[\"plugin-opts\"].mode\n\t\t\t\tif opts_mode then\n\t\t\t\t\tplugin_opts = plugin_opts .. \"obfs=\" .. opts_mode .. \";\"\n\t\t\t\tend\n\t\t\t\tlocal opts_host = node[\"plugin-opts\"].host\n\t\t\t\tif opts_host then\n\t\t\t\t\tplugin_opts = plugin_opts .. \"obfs-host=\" .. opts_host\n\t\t\t\tend\n\t\t\t\tresult.plugin_opts = plugin_opts\n\t\t\telseif node.plugin == \"v2ray-plugin\" then\n\t\t\t\tlocal plugin_opts = \"\"\n\t\t\t\tlocal opts_mode = node[\"plugin-opts\"].mode\n\t\t\t\tlocal opts_tls = node[\"plugin-opts\"].tls\n\t\t\t\tif opts_tls then\n\t\t\t\t\tplugin_opts = plugin_opts .. \"tls;\"\n\t\t\t\tend\n\t\t\t\tlocal opts_skip_cert_verify = node[\"plugin-opts\"][\"skip-cert-verify\"]\n\t\t\t\tlocal opts_host = node[\"plugin-opts\"].host\n\t\t\t\tif opts_host then\n\t\t\t\t\tplugin_opts = plugin_opts .. \"host=\" .. opts_host .. \";\"\n\t\t\t\tend\n\t\t\t\tlocal opts_path = node[\"plugin-opts\"].path\n\t\t\t\tlocal opts_mux = node[\"plugin-opts\"].mux\n\t\t\t\tif node[\"plugin-opts\"].headers then\n\t\t\t\t\t--todo\n\t\t\t\tend\n\t\t\t\tresult.plugin_opts = plugin_opts\n\t\t\tend\n\t\tend\n\telseif node.type == 'ssr' then\n\t\tif not has_ssr then\n\t\t\tlog(2, i18n.translatef(\"Skipping the %s node is due to incompatibility with the %s core program or incorrect node usage type settings.\", \"SSR\", \"shadowsocksr-libev\"))\n\t\t\treturn nil\n\t\tend\n\t\tresult.type = \"SSR\"\n\t\tresult.method = node.cipher\n\t\tresult.password = node.password\n\t\tresult.obfs = node.obfs\n\t\tresult.protocol = node.protocol\n\t\tresult.obfs_param = node[\"obfs-param\"]\n\t\tresult.protocol_param = node[\"protocol-param\"]\n\telseif node.type == 'vmess' then\n\t\tif sub_vmess_type == \"sing-box\" and has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\telseif sub_vmess_type == \"xray\" and has_xray then\n\t\t\tresult.type = \"Xray\"\n\t\telse\n\t\t\tlog(2, i18n.translatef(\"Skipping the %s node is due to incompatibility with the %s core program or incorrect node usage type settings.\", \"VMess\", \"VMess\"))\n\t\t\treturn nil\n\t\tend\n\t\tresult.protocol = 'vmess'\n\t\tresult.uuid = node.uuid\n\t\tresult.alter_id = node.alterId\n\t\tresult.security = node.cipher or \"auto\"\n\t\tresult.tcp_fast_open = node.tfo\n\t\tresult.tls = \"0\"\n\t\tif node.tls then\n\t\t\tresult.tls = \"1\"\n\t\t\tresult.tls_serverName = node.servername or \"\"\n\t\t\tlocal insecure = node[\"skip-cert-verify\"]\n\t\t\tresult.tls_allowInsecure = insecure and \"1\" or \"0\"\n\t\t\tif sub_allowinsecure then\n\t\t\t\tresult.tls_allowInsecure = \"1\"\n\t\t\tend\n\t\tend\n\t\tresult.transport = node.network and string.lower(node.network) or \"tcp\"\n\t\tif result.type == \"sing-box\" and result.transport == \"raw\" then \n\t\t\tresult.transport = \"tcp\"\n\t\telseif result.type == \"Xray\" and result.transport == \"tcp\" then\n\t\t\tresult.transport = \"raw\"\n\t\tend\n\t\tif result.transport == 'ws' then\n\t\t\tlocal ws_opts = node[\"ws-opts\"]\n\t\t\tif ws_opts then\n\t\t\t\tif ws_opts.headers then\n\t\t\t\t\tresult.ws_host = ws_opts.headers.Host or ws_opts.headers.host\n\t\t\t\tend\n\t\t\t\tif ws_opts.path then\n\t\t\t\t\tresult.ws_path = ws_opts.path\n\t\t\t\t\tif ws_opts[\"max-early-data\"] then\n\t\t\t\t\t\tif result.type == \"sing-box\" then\n\t\t\t\t\t\t\tresult.ws_enableEarlyData = \"1\"\n\t\t\t\t\t\t\tresult.ws_maxEarlyData = tonumber(ws_opts[\"max-early-data\"])\n\t\t\t\t\t\t\tresult.ws_earlyDataHeaderName = \"Sec-WebSocket-Protocol\"\n\t\t\t\t\t\telseif result.type == \"Xray\" then\n\t\t\t\t\t\t\tresult.ws_path = result.ws_path .. \"?ed=\" .. ws_opts[\"max-early-data\"]\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\telseif result.transport == 'h2' then\n\t\t\tlocal h2_opts = node[\"h2-opts\"]\n\t\t\tif h2_opts then\n\t\t\t\tif result.type == \"sing-box\" then\n\t\t\t\t\tresult.http_path = h2_opts.path\n\t\t\t\t\tresult.http_host = h2_opts.host\n\t\t\t\telseif result.type == \"Xray\" then\n\t\t\t\t\tresult.xhttp_mode = \"stream-one\"\n\t\t\t\t\tresult.xhttp_path = h2_opts.path\n\t\t\t\t\tresult.xhttp_host = h2_opts.host\n\t\t\t\tend\n\t\t\tend\n\t\telseif result.transport == 'grpc' then\n\t\t\tlocal grpc_opts = node[\"grpc-opts\"]\n\t\t\tif grpc_opts then\n\t\t\t\tresult.grpc_serviceName = grpc_opts[\"grpc-service-name\"]\n\t\t\tend\n\t\tend\n\telseif node.type == 'vless' then\n\t\tif sub_vless_type == \"sing-box\" and has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\telseif sub_vless_type == \"xray\" and has_xray then\n\t\t\tresult.type = \"Xray\"\n\t\telse\n\t\t\tlog(2, i18n.translatef(\"Skipping the %s node is due to incompatibility with the %s core program or incorrect node usage type settings.\", \"VLESS\", \"VLESS\"))\n\t\t\treturn nil\n\t\tend\n\t\tresult.protocol = \"vless\"\n\t\tresult.uuid = node.uuid\n\t\tresult.tcp_fast_open = node.tfo\n\t\tresult.encryption = node.cipher or \"none\"\n\t\tresult.flow = node.flow\n\t\tresult.tls = \"0\"\n\t\tif node.tls then\n\t\t\tresult.tls = \"1\"\n\t\t\tresult.tls_serverName = node.servername or \"\"\n\t\t\tlocal insecure = node[\"skip-cert-verify\"]\n\t\t\tresult.tls_allowInsecure = insecure and \"1\" or \"0\"\n\t\t\tif sub_allowinsecure then\n\t\t\t\tresult.tls_allowInsecure = \"1\"\n\t\t\tend\n\t\tend\n\t\tresult.transport = node.network and string.lower(node.network) or \"tcp\"\n\t\tif result.type == \"sing-box\" and result.transport == \"raw\" then \n\t\t\tresult.transport = \"tcp\"\n\t\telseif result.type == \"Xray\" and result.transport == \"tcp\" then\n\t\t\tresult.transport = \"raw\"\n\t\tend\n\t\tif result.transport == 'ws' then\n\t\t\tlocal ws_opts = node[\"ws-opts\"]\n\t\t\tif ws_opts then\n\t\t\t\tif ws_opts.headers then\n\t\t\t\t\tresult.ws_host = ws_opts.headers.Host or ws_opts.headers.host\n\t\t\t\tend\n\t\t\t\tif ws_opts.path then\n\t\t\t\t\tresult.ws_path = ws_opts.path\n\t\t\t\t\tif ws_opts[\"max-early-data\"] then\n\t\t\t\t\t\tif result.type == \"sing-box\" then\n\t\t\t\t\t\t\tresult.ws_enableEarlyData = \"1\"\n\t\t\t\t\t\t\tresult.ws_maxEarlyData = tonumber(ws_opts[\"max-early-data\"])\n\t\t\t\t\t\t\tresult.ws_earlyDataHeaderName = \"Sec-WebSocket-Protocol\"\n\t\t\t\t\t\telseif result.type == \"Xray\" then\n\t\t\t\t\t\t\tresult.ws_path = result.ws_path .. \"?ed=\" .. ws_opts[\"max-early-data\"]\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\telseif node.type == 'trojan' then\n\t\tif sub_trojan_type == \"sing-box\" and has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\t\tresult.protocol = 'trojan'\n\t\telseif sub_trojan_type == \"xray\" and has_xray then\n\t\t\tresult.type = 'Xray'\n\t\t\tresult.protocol = 'trojan'\n\t\telse\n\t\t\tlog(2, i18n.translatef(\"Skipping the %s node is due to incompatibility with the %s core program or incorrect node usage type settings.\", \"Trojan\", \"Trojan\"))\n\t\t\treturn nil\n\t\tend\n\t\tresult.password = node.password\n\t\tresult.tls = '1'\n\t\tresult.tls_serverName = node.sni or \"\"\n\t\tlocal insecure = node[\"skip-cert-verify\"]\n\t\tresult.tls_allowInsecure = insecure and \"1\" or \"0\"\n\t\tif sub_allowinsecure then\n\t\t\tresult.tls_allowInsecure = \"1\"\n\t\tend\n\t\tif node.alpn then\n\t\t\t--todo\n\t\tend\n\t\tif node.network == \"grpc\" then\n\t\t\tif node[\"grpc-opts\"] then\n\t\t\t\tresult.grpc_serviceName = node[\"grpc-opts\"][\"grpc-service-name\"]\n\t\t\tend\n\t\telseif node.network == \"ws\" then\n\t\t\tlocal ws_opts = node[\"ws-opts\"]\n\t\t\tif ws_opts then\n\t\t\t\tresult.ws_path = ws_opts.path\n\t\t\t\tif ws_opts.headers then\n\t\t\t\t\tresult.ws_host = ws_opts.headers.Host or ws_opts.headers.host\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\telseif node.type == 'anytls' then\n\t\tif has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\t\tresult.protocol = \"anytls\"\n\t\telse\n\t\t\tlog(2, i18n.translatef(\"Skip the %s node because the %s core program is not installed.\", \"AnyTLS\", \"AnyTLS\", \"Sing-Box 1.12\"))\n\t\t\treturn nil\n\t\tend\n\t\tresult.password = node.password\n\t\tresult.tls = '1'\n\t\tresult.tls_serverName = node.sni or \"\"\n\t\tlocal insecure = node[\"skip-cert-verify\"]\n\t\tresult.tls_allowInsecure = insecure and \"1\" or \"0\"\n\t\tif sub_allowinsecure then\n\t\t\tresult.tls_allowInsecure = \"1\"\n\t\tend\n\tend\n\tif not result.remarks or result.remarks == \"\" then\n\t\tif result.address and result.port then\n\t\t\tresult.remarks = result.address .. ':' .. result.port\n\t\telse\n\t\t\tresult.remarks = \"NULL\"\n\t\tend\n\tend\n\treturn result\nend\n\n-- Processing Clash data\nlocal function processClashData(content, add_mode, group, sub_cfg)\n\tlocal results = {}\n\tfor i, node in ipairs(content.proxies or {}) do\n\t\tlocal result = parseClashNode(node, add_mode, group, sub_cfg)\n\t\tif result then\n\t\t\ttable.insert(results, result)\n\t\tend\n\tend\n\treturn results\nend\n\n-- Processing data\nlocal function processData(szType, content, add_mode, group, sub_cfg)\n\t--log(2, content, add_mode, group)\n\tlocal sub_allowinsecure = DEFAULT_ALLOWINSECURE\n\tlocal sub_ss_type = DEFAULT_SS_TYPE\n\tlocal sub_trojan_type = DEFAULT_TROJAN_TYPE\n\tlocal sub_vmess_type = DEFAULT_VMESS_TYPE\n\tlocal sub_vless_type = DEFAULT_VLESS_TYPE\n\tlocal sub_hysteria2_type = DEFAULT_HYSTERIA2_TYPE\n\tif sub_cfg then\n\t\tif sub_cfg.allowInsecure and sub_cfg.allowInsecure ~= \"1\" then\n\t\t\tsub_allowinsecure = nil\n\t\tend\n\t\tlocal ss_type = sub_cfg.ss_type or \"global\"\n\t\tif ss_type ~= \"global\" and core_has[ss_type] then\n\t\t\tsub_ss_type = ss_type\n\t\tend\n\t\tlocal trojan_type = sub_cfg.trojan_type or \"global\"\n\t\tif trojan_type ~= \"global\" and core_has[trojan_type] then\n\t\t\tsub_trojan_type = trojan_type\n\t\tend\n\t\tlocal vmess_type = sub_cfg.vmess_type or \"global\"\n\t\tif vmess_type ~= \"global\" and core_has[vmess_type] then\n\t\t\tsub_vmess_type = vmess_type\n\t\tend\n\t\tlocal vless_type = sub_cfg.vless_type or \"global\"\n\t\tif vless_type ~= \"global\" and core_has[vless_type] then\n\t\t\tsub_vless_type = vless_type\n\t\tend\n\t\tlocal hysteria2_type = sub_cfg.hysteria2_type or \"global\"\n\t\tif hysteria2_type ~= \"global\" and core_has[hysteria2_type] then\n\t\t\tsub_hysteria2_type = hysteria2_type\n\t\tend\n\tend\n\tlocal result = {\n\t\ttimeout = 60,\n\t\tadd_mode = add_mode, -- `0` for manual configuration, `1` for import, `2` for subscription\n\t\tgroup = group\n\t}\n\t--ssr://base64(host:port:protocol:method:obfs:base64pass/?obfsparam=base64param&protoparam=base64param&remarks=base64remarks&group=base64group&udpport=0&uot=0)\n\tif szType == 'ssr' then\n\t\tif not has_ssr then\n\t\t\tlog(2, i18n.translatef(\"Skipping the %s node is due to incompatibility with the %s core program or incorrect node usage type settings.\", \"SSR\", \"shadowsocksr-libev\"))\n\t\t\treturn nil\n\t\tend\n\t\tresult.type = \"SSR\"\n\n\t\tlocal dat = split(content:gsub(\"/%?\", \"?\"), \"%?\")\n\t\tlocal hostInfo = split(dat[1], ':')\n\t\tif dat[1]:match('%[(.*)%]') then\n\t\t\tresult.address = dat[1]:match('%[(.*)%]')\n\t\telse\n\t\t\tresult.address = hostInfo[#hostInfo-5]\n\t\tend\n\t\tresult.port = hostInfo[#hostInfo-4]\n\t\tresult.protocol = hostInfo[#hostInfo-3]\n\t\tresult.method = hostInfo[#hostInfo-2]\n\t\tresult.obfs = hostInfo[#hostInfo-1]\n\t\tresult.password = base64Decode(hostInfo[#hostInfo])\t\n\t\tlocal params = {}\n\t\tfor _, v in pairs(split(dat[2], '&')) do\n\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\tif s and s > 1 then\n\t\t\t\tparams[v:sub(1, s - 1)] = v:sub(s + 1)\n\t\t\tend\n\t\tend\n\t\tresult.obfs_param = base64Decode(params.obfsparam)\n\t\tresult.protocol_param = base64Decode(params.protoparam)\n\t\t-- local ssr_group = base64Decode(params.group)\n\t\t-- if ssr_group then result.ssr_group = ssr_group end\n\t\tresult.remarks = base64Decode(params.remarks)\n\telseif szType == 'vmess' then\n\t\tlocal info = jsonParse(content)\n\t\tif sub_vmess_type == \"sing-box\" and has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\telseif sub_vmess_type == \"xray\" and has_xray then\n\t\t\tresult.type = \"Xray\"\n\t\telse\n\t\t\tlog(2, i18n.translatef(\"Skipping the %s node is due to incompatibility with the %s core program or incorrect node usage type settings.\", \"VMess\", \"VMess\"))\n\t\t\treturn nil\n\t\tend\n\t\tresult.address = info.add\n\t\tresult.port = info.port\n\t\tresult.protocol = 'vmess'\n\t\tresult.alter_id = info.aid\n\t\tresult.uuid = info.id\n\t\tresult.remarks = info.ps\n\t\t-- result.mux = 1\n\t\t-- result.mux_concurrency = 8\n\n\t\tinfo.path = (info.path and info.path ~= \"\") and UrlDecode(info.path) or nil\n\n\t\tif not info.net then info.net = \"tcp\" end\n\t\tinfo.net = string.lower(info.net)\n\t\tif result.type == \"sing-box\" and info.net == \"raw\" then \n\t\t\tinfo.net = \"tcp\"\n\t\telseif result.type == \"Xray\" and info.net == \"tcp\" then\n\t\t\tinfo.net = \"raw\"\n\t\tend\n\t\tif info.net == 'h2' or info.net == 'http' then\n\t\t\tinfo.net = \"http\"\n\t\t\tresult.transport = (result.type == \"Xray\") and \"xhttp\" or \"http\"\n\t\telse\n\t\t\tresult.transport = info.net\n\t\tend\n\t\tif info.net == 'ws' then\n\t\t\tresult.ws_host = info.host\n\t\t\tresult.ws_path = info.path\n\t\t\tif result.type == \"sing-box\" and info.path then\n\t\t\t\tlocal ws_path_dat = split(info.path, \"?\")\n\t\t\t\tlocal ws_path = ws_path_dat[1]\n\t\t\t\tlocal ws_path_params = {}\n\t\t\t\tfor _, v in pairs(split(ws_path_dat[2], '&')) do\n\t\t\t\t\tlocal t = split(v, '=')\n\t\t\t\t\tws_path_params[t[1]] = t[2]\n\t\t\t\tend\n\t\t\t\tif ws_path_params.ed and tonumber(ws_path_params.ed) then\n\t\t\t\t\tresult.ws_path = ws_path\n\t\t\t\t\tresult.ws_enableEarlyData = \"1\"\n\t\t\t\t\tresult.ws_maxEarlyData = tonumber(ws_path_params.ed)\n\t\t\t\t\tresult.ws_earlyDataHeaderName = \"Sec-WebSocket-Protocol\"\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif info.net == \"http\" then\n\t\t\tif result.type == \"Xray\" then\n\t\t\t\tresult.xhttp_mode = \"stream-one\"\n\t\t\t\tresult.xhttp_host = info.host\n\t\t\t\tresult.xhttp_path = info.path\n\t\t\telse\n\t\t\t\tresult.http_host = (info.host and info.host ~= \"\") and { info.host } or nil\n\t\t\t\tresult.http_path = info.path\n\t\t\tend\n\t\tend\n\t\tif info.net == 'raw' or info.net == 'tcp' then\n\t\t\tif info.type and info.type ~= \"http\" then\n\t\t\t\tinfo.type = \"none\"\n\t\t\tend\n\t\t\tresult.tcp_guise = info.type\n\t\t\tresult.tcp_guise_http_host = (info.host and info.host ~= \"\") and { info.host } or nil\n\t\t\tresult.tcp_guise_http_path = (info.path and info.path ~= \"\") and { info.path } or nil\n\t\tend\n\t\tif info.net == 'kcp' or info.net == 'mkcp' then\n\t\t\tinfo.net = \"mkcp\"\n\t\t\tresult.mkcp_guise = info.type\n\t\t\tresult.mkcp_seed = info.seed\n\t\tend\n\t\tif info.net == 'quic' then\n\t\t\tresult.quic_guise = info.type\n\t\t\tresult.quic_key = info.key\n\t\t\tresult.quic_security = info.securty\n\t\tend\n\t\tif info.net == 'grpc' then\n\t\t\tresult.grpc_serviceName = info.path\n\t\tend\n\t\tif info.net == 'xhttp' or info.net == 'splithttp' then\n\t\t\tresult.xhttp_host = info.host\n\t\t\tresult.xhttp_path = info.path\n\t\t\tresult.xhttp_mode = params.mode or \"auto\"\n\t\t\tresult.xhttp_extra = params.extra\n\t\t\tlocal success, Data = pcall(jsonParse, params.extra)\n\t\t\t\tif success and Data then\n\t\t\t\t\tlocal address = (Data.extra and Data.extra.downloadSettings and Data.extra.downloadSettings.address)\n\t\t\t\t\t\t\tor (Data.downloadSettings and Data.downloadSettings.address)\n\t\t\t\t\tresult.download_address = address and address ~= \"\" and address or nil\n\t\t\t\telse\n\t\t\t\t\tresult.download_address = nil\n\t\t\t\tend\n\t\tend\n\t\tif info.net == 'httpupgrade' then\n\t\t\tresult.httpupgrade_host = info.host\n\t\t\tresult.httpupgrade_path = info.path\n\t\tend\n\t\tresult.security = info.security or info.scy or \"auto\"\n\t\tif info.tls == \"tls\" or info.tls == \"1\" then\n\t\t\tresult.tls = \"1\"\n\t\t\tresult.alpn = info.alpn\n\t\t\tif info.fp and info.fp ~= \"\" then\n\t\t\t\tresult.utls = \"1\"\n\t\t\t\tresult.fingerprint = info.fp\n\t\t\tend\n\t\t\tresult.tls_serverName = (info.sni and info.sni ~= \"\") and info.sni or info.host\n\t\t\tresult.tls_pinSHA256 = info.pcs\n\t\t\tresult.tls_CertByName = info.vcn\n\t\t\tlocal insecure = info.allowinsecure or info.allowInsecure or info.insecure\n\t\t\tresult.tls_allowInsecure = (insecure == \"1\" or insecure == \"0\") and insecure or (sub_allowinsecure and \"1\" or \"0\")\n\t\telse\n\t\t\tresult.tls = \"0\"\n\t\tend\n\n\t\tresult.tcp_fast_open = info.tfo\n\n\t\tinfo.fm = (info.fm and info.fm ~= \"\") and UrlDecode(info.fm) or nil\n\t\tresult.use_finalmask = (info.fm and info.fm ~= \"\") and \"1\" or nil\n\t\tresult.finalmask = (info.fm and info.fm ~= \"\") and api.base64Encode(info.fm) or nil\n\n\t\tif result.type == \"sing-box\" and (result.transport == \"mkcp\" or result.transport == \"xhttp\") then\n\t\t\tlog(2, i18n.translatef(\"Skip node: %s. Because Sing-Box does not support the %s protocol's %s transmission method, Xray needs to be used instead.\", result.remarks, szType, result.transport))\n\t\t\treturn nil\n\t\tend\n\telseif szType == \"ss\" then\n\t\tresult = set_ss_implementation(sub_ss_type, result)\n\t\tif not result then return nil end\n\n\t\t--SS-URI = \"ss://\" userinfo \"@\" hostname \":\" port [ \"/\" ] [ \"?\" plugin ] [ \"#\" tag ]\n\t\t--userinfo = websafe-base64-encode-utf8(method  \":\" password)\n\t\t--ss://YWVzLTEyOC1nY206dGVzdA@192.168.100.1:8888#Example1\n\t\t--ss://cmM0LW1kNTpwYXNzd2Q@192.168.100.1:8888/?plugin=obfs-local%3Bobfs%3Dhttp#Example2\n\t\t--ss://2022-blake3-aes-256-gcm:YctPZ6U7xPPcU%2Bgp3u%2B0tx%2FtRizJN9K8y%2BuKlW2qjlI%3D@192.168.100.1:8888#Example3\n\t\t--ss://2022-blake3-aes-256-gcm:YctPZ6U7xPPcU%2Bgp3u%2B0tx%2FtRizJN9K8y%2BuKlW2qjlI%3D@192.168.100.1:8888/?plugin=v2ray-plugin%3Bserver#Example3\n\t\t--ss://Y2hhY2hhMjAtaWV0Zi1wb2x5MTMwNTp0ZXN0@xxxxxx.com:443?type=ws&path=%2Ftestpath&host=xxxxxx.com&security=tls&fp=&alpn=h3%2Ch2%2Chttp%2F1.1&sni=xxxxxx.com#test-1%40ss\n\n\t\tlocal idx_sp = content:find(\"#\") or 0\n\t\tlocal alias = \"\"\n\t\tif idx_sp > 0 then\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\tend\n\t\tresult.remarks = UrlDecode(alias)\n\t\tlocal info = content:sub(1, idx_sp - 1):gsub(\"/%?\", \"?\")\n\t\tlocal params = {}\n\t\tif info:find(\"%?\") then\n\t\t\tlocal find_index = info:find(\"%?\")\n\t\t\tlocal query = split(info, \"%?\")\n\t\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\t\tif s and s > 1 then\n\t\t\t\t\tparams[v:sub(1, s - 1)] = UrlDecode(v:sub(s + 1))\n\t\t\t\tend\n\t\t\tend\n\t\t\tif params.plugin then\n\t\t\t\tlocal plugin_info = params.plugin\n\t\t\t\tlocal idx_pn = plugin_info:find(\";\")\n\t\t\t\tif idx_pn then\n\t\t\t\t\tresult.plugin = plugin_info:sub(1, idx_pn - 1)\n\t\t\t\t\tresult.plugin_opts = plugin_info:sub(idx_pn + 1, #plugin_info)\n\t\t\t\telse\n\t\t\t\t\tresult.plugin = plugin_info\n\t\t\t\tend\n\t\t\tend\n\t\t\tif result.plugin and result.plugin == \"simple-obfs\" then\n\t\t\t\tresult.plugin = \"obfs-local\"\n\t\t\tend\n\t\t\tinfo = info:sub(1, find_index - 1)\n\t\tend\n\n\t\tlocal hostInfo = split(base64Decode(UrlDecode(info)), \"@\")\n\t\tif hostInfo and #hostInfo > 0 then\n\t\t\tlocal host_port = hostInfo[#hostInfo]\n\t\t\t-- [2001:4860:4860::8888]:443\n\t\t\t-- 8.8.8.8:443\n\t\t\tif host_port:find(\":\") then\n\t\t\t\tlocal sp = split(host_port, \":\")\n\t\t\t\tresult.port = sp[#sp]\n\t\t\t\tif api.is_ipv6addrport(host_port) then\n\t\t\t\t\tresult.address = api.get_ipv6_only(host_port)\n\t\t\t\telse\n\t\t\t\t\tresult.address = sp[1]\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tresult.address = host_port\n\t\t\tend\n\n\t\t\tlocal userinfo = nil\n\t\t\tif #hostInfo > 2 then\n\t\t\t\tuserinfo = {}\n\t\t\t\tfor i = 1, #hostInfo - 1 do\n\t\t\t\t\ttinsert(userinfo, hostInfo[i])\n\t\t\t\tend\n\t\t\t\tuserinfo = table.concat(userinfo, '@')\n\t\t\telse\n\t\t\t\tuserinfo = base64Decode(hostInfo[1])\n\t\t\tend\n\t\t\tlocal method, password\n\t\t\tif userinfo:find(\":\") then\n\t\t\t\tmethod = userinfo:sub(1, userinfo:find(\":\") - 1)\n\t\t\t\tpassword = userinfo:sub(userinfo:find(\":\") + 1, #userinfo)\n\t\t\telse\n\t\t\t\tpassword = hostInfo[1]  -- Some links use plaintext UUIDs as passwords.\n\t\t\tend\n\n\t\t\t-- Determine if the password is URL encoded\n\t\t\tlocal function isURLEncodedPassword(pwd)\n\t\t\t\tif not pwd:find(\"%%[0-9A-Fa-f][0-9A-Fa-f]\") then\n\t\t\t\t\treturn false\n\t\t\t\tend\n\t\t\t\tlocal ok, decoded = pcall(UrlDecode, pwd)\n\t\t\t\treturn ok and UrlEncode(decoded) == pwd\n\t\t\tend\n\n\t\t\tlocal decoded = UrlDecode(password)\n\t\t\tif isURLEncodedPassword(password) and decoded then\n\t\t\t\tpassword = decoded\n\t\t\tend\n\n\t\t\tlocal _method = (method or \"none\"):lower()\n\t\t\tmethod = (_method == \"chacha20-poly1305\" and \"chacha20-ietf-poly1305\") or\n\t\t\t\t(_method == \"xchacha20-poly1305\" and \"xchacha20-ietf-poly1305\") or _method\n\n\t\t\tresult.method = method\n\t\t\tresult.password = password\n\t\t\tresult.tcp_fast_open = params.tfo\n\t\t\tresult.use_finalmask = (params.fm and params.fm ~= \"\") and \"1\" or nil\n\t\t\tresult.finalmask = (params.fm and params.fm ~= \"\") and api.base64Encode(params.fm) or nil\n\n\t\t\tlocal need_upgrade = (result.type ~= \"Xray\" and result.type ~= \"sing-box\")\n\t\t\t\tand (params.type and params.type ~= \"tcp\")\n\t\t\t\tand (params.headerType and params.headerType ~= \"none\")\n\t\t\tif has_xray and (need_upgrade or params.type == \"xhttp\") then\n\t\t\t\tresult.type = \"Xray\"\n\t\t\t\tresult.protocol = \"shadowsocks\"\n\t\t\telseif has_singbox and need_upgrade then\n\t\t\t\tresult.type = \"sing-box\"\n\t\t\t\tresult.protocol = \"shadowsocks\"\n\t\t\tend\n\n\t\t\tif result.plugin then\n\t\t\t\tif result.type == 'Xray' then\n\t\t\t\t\t-- The obfs-local plugin converts data to a format supported by xray.\n\t\t\t\t\tif result.plugin ~= \"obfs-local\" then\n\t\t\t\t\t\tresult.error_msg = i18n.translatef(\"Xray unsupport %s plugin.\", result.plugin)\n\t\t\t\t\telse\n\t\t\t\t\t\tlocal obfs = result.plugin_opts:match(\"obfs=([^;]+)\") or \"\"\n\t\t\t\t\t\tlocal obfs_host = result.plugin_opts:match(\"obfs%-host=([^;]+)\") or \"\"\n\t\t\t\t\t\tif obfs == \"\" or obfs_host == \"\" then\n\t\t\t\t\t\t\tresult.error_msg = \"SS \" .. result.plugin .. \" \" .. i18n.translatef(\"Plugin options Incomplete.\")\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif obfs == \"http\" then\n\t\t\t\t\t\t\tresult.transport = \"raw\"\n\t\t\t\t\t\t\tresult.tcp_guise = \"http\"\n\t\t\t\t\t\t\tresult.tcp_guise_http_host = (obfs_host and obfs_host ~= \"\") and { obfs_host } or nil\n\t\t\t\t\t\t\tresult.tcp_guise_http_path = { \"/\" }\n\t\t\t\t\t\telseif obfs == \"tls\" then\n\t\t\t\t\t\t\tresult.tls = \"1\"\n\t\t\t\t\t\t\tresult.tls_serverName = obfs_host\n\t\t\t\t\t\t\tresult.tls_allowInsecure = \"1\"\n\t\t\t\t\t\tend\n\t\t\t\t\t\tresult.plugin = nil\n\t\t\t\t\t\tresult.plugin_opts = nil\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tresult.plugin_enabled = \"1\"\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif result.type == \"SS\" then\n\t\t\t\tlocal aead2022_methods = { \"2022-blake3-aes-128-gcm\", \"2022-blake3-aes-256-gcm\", \"2022-blake3-chacha20-poly1305\" }\n\t\t\t\tlocal aead2022 = false\n\t\t\t\tfor k, v in ipairs(aead2022_methods) do\n\t\t\t\t\tif method:lower() == v:lower() then\n\t\t\t\t\t\taead2022 = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif aead2022 then\n\t\t\t\t\t-- shadowsocks-libev does not support 2022 encryption.\n\t\t\t\t\tresult.error_msg = i18n.translatef(\"shadowsocks-libev unsupport 2022 encryption.\")\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif params.type then\n\t\t\t\tparams.type = string.lower(params.type)\n\t\t\t\tif result.type == \"sing-box\" and params.type == \"raw\" then \n\t\t\t\t\tparams.type = \"tcp\"\n\t\t\t\telseif result.type == \"Xray\" and params.type == \"tcp\" then\n\t\t\t\t\tparams.type = \"raw\"\n\t\t\t\tend\n\t\t\t\tif params.type == \"h2\" or params.type == \"http\" then\n\t\t\t\t\tparams.type = \"http\"\n\t\t\t\t\tresult.transport = (result.type == \"Xray\") and \"xhttp\" or \"http\"\n\t\t\t\telse\n\t\t\t\t\tresult.transport = params.type\n\t\t\t\tend\n\t\t\t\tif result.type ~= \"SS-Rust\" and result.type ~= \"SS\" then\n\t\t\t\t\tif params.type == 'ws' then\n\t\t\t\t\t\tresult.ws_host = params.host\n\t\t\t\t\t\tresult.ws_path = params.path\n\t\t\t\t\t\tif result.type == \"sing-box\" and params.path then\n\t\t\t\t\t\t\tlocal ws_path_dat = split(params.path, \"%?\")\n\t\t\t\t\t\t\tlocal ws_path = ws_path_dat[1]\n\t\t\t\t\t\t\tlocal ws_path_params = {}\n\t\t\t\t\t\t\tfor _, v in pairs(split(ws_path_dat[2], '&')) do\n\t\t\t\t\t\t\t\tlocal t = split(v, '=')\n\t\t\t\t\t\t\t\tws_path_params[t[1]] = t[2]\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tif ws_path_params.ed and tonumber(ws_path_params.ed) then\n\t\t\t\t\t\t\t\tresult.ws_path = ws_path\n\t\t\t\t\t\t\t\tresult.ws_enableEarlyData = \"1\"\n\t\t\t\t\t\t\t\tresult.ws_maxEarlyData = tonumber(ws_path_params.ed)\n\t\t\t\t\t\t\t\tresult.ws_earlyDataHeaderName = \"Sec-WebSocket-Protocol\"\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tif params.type == \"http\" then\n\t\t\t\t\t\tif result.type == \"sing-box\" then\n\t\t\t\t\t\t\tresult.transport = \"http\"\n\t\t\t\t\t\t\tresult.http_host = (params.host and params.host ~= \"\") and { params.host } or nil\n\t\t\t\t\t\t\tresult.http_path = params.path\n\t\t\t\t\t\telseif result.type == \"Xray\" then\n\t\t\t\t\t\t\tresult.transport = \"xhttp\"\n\t\t\t\t\t\t\tresult.xhttp_mode = \"stream-one\"\n\t\t\t\t\t\t\tresult.xhttp_host = params.host\n\t\t\t\t\t\t\tresult.xhttp_path = params.path\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tif params.type == 'raw' or params.type == 'tcp' then\n\t\t\t\t\t\tresult.tcp_guise = params.headerType or \"none\"\n\t\t\t\t\t\tresult.tcp_guise_http_host = (params.host and params.host ~= \"\") and { params.host } or nil\n\t\t\t\t\t\tresult.tcp_guise_http_path = (params.path and params.path ~= \"\") and { params.path } or nil\n\t\t\t\t\tend\n\t\t\t\t\tif params.type == 'kcp' or params.type == 'mkcp' then\n\t\t\t\t\t\tresult.transport = \"mkcp\"\n\t\t\t\t\t\tresult.mkcp_guise = params.headerType or \"none\"\n\t\t\t\t\t\tresult.mkcp_seed = params.seed\n\t\t\t\t\tend\n\t\t\t\t\tif params.type == 'quic' then\n\t\t\t\t\t\tresult.quic_guise = params.headerType or \"none\"\n\t\t\t\t\t\tresult.quic_key = params.key\n\t\t\t\t\t\tresult.quic_security = params.quicSecurity or \"none\"\n\t\t\t\t\tend\n\t\t\t\t\tif params.type == 'grpc' then\n\t\t\t\t\t\tif params.path then result.grpc_serviceName = params.path end\n\t\t\t\t\t\tif params.serviceName then result.grpc_serviceName = params.serviceName end\n\t\t\t\t\t\tresult.grpc_mode = params.mode or \"gun\"\n\t\t\t\t\tend\n\t\t\t\t\tif params.type == 'xhttp' then\n\t\t\t\t\t\tif result.type ~= \"Xray\" then\n\t\t\t\t\t\t\tresult.error_msg = i18n.translatef(\"Please replace %s to support %s transmission method.\", \"Xray\", \"xhttp\")\n\t\t\t\t\t\tend\n\t\t\t\t\t\tresult.xhttp_host = params.host\n\t\t\t\t\t\tresult.xhttp_path = params.path\n\t\t\t\t\t\tresult.xhttp_mode = params.mode or \"auto\"\n\t\t\t\t\t\tresult.use_xhttp_extra = (params.extra and params.extra ~= \"\") and \"1\" or nil\n\t\t\t\t\t\tresult.xhttp_extra = (params.extra and params.extra ~= \"\") and api.base64Encode(params.extra) or nil\n\t\t\t\t\t\tlocal success, Data = pcall(jsonParse, params.extra)\n\t\t\t\t\t\tif success and Data then\n\t\t\t\t\t\t\tlocal address = (Data.extra and Data.extra.downloadSettings and Data.extra.downloadSettings.address)\n\t\t\t\t\t\t\t\t\tor (Data.downloadSettings and Data.downloadSettings.address)\n\t\t\t\t\t\t\tresult.download_address = (address and address ~= \"\") and address:gsub(\"^%[\", \"\"):gsub(\"%]$\", \"\") or nil\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tresult.tls = \"0\"\n\t\t\t\t\tif params.security == \"tls\" or params.security == \"reality\" then\n\t\t\t\t\t\tresult.tls = \"1\"\n\t\t\t\t\t\tresult.tls_serverName = (params.sni and params.sni ~= \"\") and params.sni or params.host\n\t\t\t\t\t\tresult.alpn = params.alpn\n\t\t\t\t\t\tif params.fp and params.fp ~= \"\" then\n\t\t\t\t\t\t\tresult.utls = \"1\"\n\t\t\t\t\t\t\tresult.fingerprint = params.fp\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif params.ech and params.ech ~= \"\" then\n\t\t\t\t\t\t\tresult.ech = \"1\"\n\t\t\t\t\t\t\tresult.ech_config = params.ech\n\t\t\t\t\t\tend\n\t\t\t\t\t\tresult.tls_pinSHA256 = params.pcs\n\t\t\t\t\t\tresult.tls_CertByName = params.vcn\n\t\t\t\t\t\tif params.security == \"reality\" then\n\t\t\t\t\t\t\tresult.reality = \"1\"\n\t\t\t\t\t\t\tresult.reality_publicKey = params.pbk or nil\n\t\t\t\t\t\t\tresult.reality_shortId = params.sid or nil\n\t\t\t\t\t\t\tresult.reality_spiderX = params.spx or nil\n\t\t\t\t\t\t\tresult.use_mldsa65Verify = (params.pqv and params.pqv ~= \"\") and \"1\" or nil\n\t\t\t\t\t\t\tresult.reality_mldsa65Verify = params.pqv or nil\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\tlocal insecure = params.allowinsecure or params.allowInsecure or params.insecure\n\t\t\t\t\tresult.tls_allowInsecure = (insecure == \"1\" or insecure == \"0\") and insecure or (sub_allowinsecure and \"1\" or \"0\")\n\t\t\t\t\tresult.uot = params.udp\n\t\t\t\telseif (params.type ~= \"tcp\" and params.type ~= \"raw\") and (params.headerType and params.headerType ~= \"none\") then\n\t\t\t\t\tresult.error_msg = i18n.translatef(\"Please replace Xray or Sing-Box to support more transmission methods in Shadowsocks.\")\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif params[\"shadow-tls\"] then\n\t\t\t\tif result.type ~= \"sing-box\" and result.type ~= \"SS-Rust\" then\n\t\t\t\t\tresult.error_msg =  sub_ss_type .. \" \" .. i18n.translatef(\"unsupport %s plugin.\", \"shadow-tls\")\n\t\t\t\telse\n\t\t\t\t\t-- Parsing SS Shadow-TLS plugin parameters\n\t\t\t\t\tlocal function parseShadowTLSParams(b64str, out)\n\t\t\t\t\t\tlocal ok, data = pcall(jsonParse, base64Decode(b64str))\n\t\t\t\t\t\tif not ok or type(data) ~= \"table\" then return \"\" end\n\t\t\t\t\t\tif type(out) == \"table\" then\n\t\t\t\t\t\t\tfor k, v in pairs(data) do out[k] = v end\n\t\t\t\t\t\tend\n\t\t\t\t\t\tlocal t = {}\n\t\t\t\t\t\tif data.version then t[#t+1] = \"v\" .. data.version .. \"=1\" end\n\t\t\t\t\t\tif data.password then t[#t+1] = \"passwd=\" .. data.password end\n\t\t\t\t\t\tfor k, v in pairs(data) do\n\t\t\t\t\t\t\tif k ~= \"version\" and k ~= \"password\" then\n\t\t\t\t\t\t\t\tt[#t+1] = k .. \"=\" .. tostring(v)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\treturn table.concat(t, \";\")\n\t\t\t\t\tend\n\n\t\t\t\t\tif result.type == \"SS-Rust\" then\n\t\t\t\t\t\tresult.plugin_enabled = \"1\"\n\t\t\t\t\t\tresult.plugin = \"shadow-tls\"\n\t\t\t\t\t\tresult.plugin_opts = parseShadowTLSParams(params[\"shadow-tls\"])\n\t\t\t\t\telseif result.type == \"sing-box\" then\n\t\t\t\t\t\tlocal shadowtlsOpt = {}\n\t\t\t\t\t\tparseShadowTLSParams(params[\"shadow-tls\"], shadowtlsOpt)\n\t\t\t\t\t\tif next(shadowtlsOpt) then\n\t\t\t\t\t\t\tresult.shadowtls = \"1\"\n\t\t\t\t\t\t\tresult.shadowtls_version = shadowtlsOpt.version or \"1\"\n\t\t\t\t\t\t\tresult.shadowtls_password = shadowtlsOpt.password\n\t\t\t\t\t\t\tresult.shadowtls_serverName = shadowtlsOpt.host\n\t\t\t\t\t\t\tif shadowtlsOpt.fingerprint then\n\t\t\t\t\t\t\t\tresult.shadowtls_utls = \"1\"\n\t\t\t\t\t\t\t\tresult.shadowtls_fingerprint = shadowtlsOpt.fingerprint or \"chrome\"\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\telseif szType == \"trojan\" then\n\t\tif sub_trojan_type == \"sing-box\" and has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\t\tresult.protocol = 'trojan'\n\t\telseif sub_trojan_type == \"xray\" and has_xray then\n\t\t\tresult.type = 'Xray'\n\t\t\tresult.protocol = 'trojan'\n\t\telse\n\t\t\tlog(2, i18n.translatef(\"Skipping the %s node is due to incompatibility with the %s core program or incorrect node usage type settings.\", \"Trojan\", \"Trojan\"))\n\t\t\treturn nil\n\t\tend\n\t\t\n\t\tlocal alias = \"\"\n\t\tif content:find(\"#\") then\n\t\t\tlocal idx_sp = content:find(\"#\")\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\t\tcontent = content:sub(0, idx_sp - 1)\n\t\tend\n\t\tresult.remarks = UrlDecode(alias)\n\t\tif content:find(\"@\") then\n\t\t\tlocal Info = split(content, \"@\")\n\t\t\tresult.password = UrlDecode(Info[1])\n\t\t\tlocal port = \"443\"\n\t\t\tInfo[2] = (Info[2] or \"\"):gsub(\"/%?\", \"?\")\n\t\t\tlocal query = split(Info[2], \"%?\")\n\t\t\tlocal host_port = query[1]\n\t\t\tlocal params = {}\n\t\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\t\tif s and s > 1 then\n\t\t\t\t\tparams[v:sub(1, s - 1)] = UrlDecode(v:sub(s + 1))\n\t\t\t\tend\n\t\t\tend\n\t\t\t-- [2001:4860:4860::8888]:443\n\t\t\t-- 8.8.8.8:443\n\t\t\tif host_port:find(\":\") then\n\t\t\t\tlocal sp = split(host_port, \":\")\n\t\t\t\tport = sp[#sp]\n\t\t\t\tif api.is_ipv6addrport(host_port) then\n\t\t\t\t\tresult.address = api.get_ipv6_only(host_port)\n\t\t\t\telse\n\t\t\t\t\tresult.address = sp[1]\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tresult.address = host_port\n\t\t\tend\n\n\t\t\tresult.port = port\n\n\t\t\tresult.tls = '1'\n\t\t\tresult.tls_serverName = params.peer or params.sni or \"\"\n\t\t\tresult.tls_pinSHA256 = params.pcs\n\t\t\tresult.tls_CertByName = params.vcn\n\t\t\tlocal insecure = params.allowinsecure or params.allowInsecure or params.insecure\n\t\t\tresult.tls_allowInsecure = (insecure == \"1\" or insecure == \"0\") and insecure or (sub_allowinsecure and \"1\" or \"0\")\n\n\t\t\tif not params.type then params.type = \"tcp\" end\n\t\t\tparams.type = string.lower(params.type)\n\t\t\tif result.type == \"sing-box\" and params.type == \"raw\" then \n\t\t\t\tparams.type = \"tcp\"\n\t\t\telseif result.type == \"Xray\" and params.type == \"tcp\" then\n\t\t\t\tparams.type = \"raw\"\n\t\t\tend\n\t\t\tif params.type == \"h2\" or params.type == \"http\" then\n\t\t\t\tparams.type = \"http\"\n\t\t\t\tresult.transport = (result.type == \"Xray\") and \"xhttp\" or \"http\"\n\t\t\telse\n\t\t\t\tresult.transport = params.type\n\t\t\tend\n\t\t\tif params.type == 'ws' then\n\t\t\t\tresult.ws_host = params.host\n\t\t\t\tresult.ws_path = params.path\n\t\t\t\tif result.type == \"sing-box\" and params.path then\n\t\t\t\t\tlocal ws_path_dat = split(params.path, \"%?\")\n\t\t\t\t\tlocal ws_path = ws_path_dat[1]\n\t\t\t\t\tlocal ws_path_params = {}\n\t\t\t\t\tfor _, v in pairs(split(ws_path_dat[2], '&')) do\n\t\t\t\t\t\tlocal t = split(v, '=')\n\t\t\t\t\t\tws_path_params[t[1]] = t[2]\n\t\t\t\t\tend\n\t\t\t\t\tif ws_path_params.ed and tonumber(ws_path_params.ed) then\n\t\t\t\t\t\tresult.ws_path = ws_path\n\t\t\t\t\t\tresult.ws_enableEarlyData = \"1\"\n\t\t\t\t\t\tresult.ws_maxEarlyData = tonumber(ws_path_params.ed)\n\t\t\t\t\t\tresult.ws_earlyDataHeaderName = \"Sec-WebSocket-Protocol\"\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif params.type == \"http\" then\n\t\t\t\tif result.type == \"sing-box\" then\n\t\t\t\t\tresult.transport = \"http\"\n\t\t\t\t\tresult.http_host = (params.host and params.host ~= \"\") and { params.host } or nil\n\t\t\t\t\tresult.http_path = params.path\n\t\t\t\telseif result.type == \"Xray\" then\n\t\t\t\t\tresult.transport = \"xhttp\"\n\t\t\t\t\tresult.xhttp_mode = \"stream-one\"\n\t\t\t\t\tresult.xhttp_host = params.host\n\t\t\t\t\tresult.xhttp_path = params.path\n\t\t\t\tend\n\t\t\tend\n\t\t\tif params.type == 'raw' or params.type == 'tcp' then\n\t\t\t\tresult.tcp_guise = params.headerType or \"none\"\n\t\t\t\tresult.tcp_guise_http_host = (params.host and params.host ~= \"\") and { params.host } or nil\n\t\t\t\tresult.tcp_guise_http_path = (params.path and params.path ~= \"\") and { params.path } or nil\n\t\t\tend\n\t\t\tif params.type == 'kcp' or params.type == 'mkcp' then\n\t\t\t\tresult.transport = \"mkcp\"\n\t\t\t\tresult.mkcp_guise = params.headerType or \"none\"\n\t\t\t\tresult.mkcp_seed = params.seed\n\t\t\tend\n\t\t\tif params.type == 'quic' then\n\t\t\t\tresult.quic_guise = params.headerType or \"none\"\n\t\t\t\tresult.quic_key = params.key\n\t\t\t\tresult.quic_security = params.quicSecurity or \"none\"\n\t\t\tend\n\t\t\tif params.type == 'grpc' then\n\t\t\t\tresult.grpc_serviceName = params.serviceName or params.path\n\t\t\t\tresult.grpc_mode = params.mode or \"gun\"\n\t\t\tend\n\t\t\tif params.type == 'xhttp' then\n\t\t\t\tresult.xhttp_host = params.host\n\t\t\t\tresult.xhttp_path = params.path\n\t\t\tend\n\t\t\tif params.type == 'httpupgrade' then\n\t\t\t\tresult.httpupgrade_host = params.host\n\t\t\t\tresult.httpupgrade_path = params.path\n\t\t\tend\n\n\t\t\tresult.alpn = params.alpn\n\t\t\tresult.tcp_fast_open = params.tfo\n\t\t\tresult.use_finalmask = (params.fm and params.fm ~= \"\") and \"1\" or nil\n\t\t\tresult.finalmask = (params.fm and params.fm ~= \"\") and api.base64Encode(params.fm) or nil\n\n\t\t\tif result.type == \"sing-box\" and (result.transport == \"mkcp\" or result.transport == \"xhttp\") then\n\t\t\t\tlog(2, i18n.translatef(\"Skip node: %s. Because Sing-Box does not support the %s protocol's %s transmission method, Xray needs to be used instead.\", result.remarks, szType, result.transport))\n\t\t\t\treturn nil\n\t\t\tend\n\t\tend\n\telseif szType == \"ssd\" then\n\t\tresult = set_ss_implementation(sub_ss_type, result)\n\t\tif not result then return nil end\n\t\tresult.address = content.server\n\t\tresult.port = content.port\n\t\tresult.password = content.password\n\t\tresult.method = content.encryption\n\t\tresult.plugin = content.plugin\n\t\tresult.plugin_opts = content.plugin_options\n\t\tresult.group = content.airport\n\t\tresult.remarks = content.remarks\n\telseif szType == \"vless\" then\n\t\tif sub_vless_type == \"sing-box\" and has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\telseif sub_vless_type == \"xray\" and has_xray then\n\t\t\tresult.type = \"Xray\"\n\t\telse\n\t\t\tlog(2, i18n.translatef(\"Skipping the %s node is due to incompatibility with the %s core program or incorrect node usage type settings.\", \"VLESS\", \"VLESS\"))\n\t\t\treturn nil\n\t\tend\n\t\tresult.protocol = \"vless\"\n\t\tlocal alias = \"\"\n\t\tif content:find(\"#\") then\n\t\t\tlocal idx_sp = content:find(\"#\")\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\t\tcontent = content:sub(0, idx_sp - 1)\n\t\tend\n\t\tresult.remarks = UrlDecode(alias)\n\t\tif content:find(\"@\") then\n\t\t\tlocal Info = split(content, \"@\")\n\t\t\tresult.uuid = UrlDecode(Info[1])\n\t\t\tlocal port = \"443\"\n\t\t\tInfo[2] = (Info[2] or \"\"):gsub(\"/%?\", \"?\")\n\t\t\tlocal query = split(Info[2], \"%?\")\n\t\t\tlocal host_port = query[1]\n\t\t\tlocal params = {}\n\t\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\t\tif s and s > 1 then\n\t\t\t\t\tparams[v:sub(1, s - 1)] = UrlDecode(v:sub(s + 1))\n\t\t\t\tend\n\t\t\tend\n\t\t\t-- [2001:4860:4860::8888]:443\n\t\t\t-- 8.8.8.8:443\n\t\t\tif host_port:find(\":\") then\n\t\t\t\tlocal sp = split(host_port, \":\")\n\t\t\t\tport = sp[#sp]\n\t\t\t\tif api.is_ipv6addrport(host_port) then\n\t\t\t\t\tresult.address = api.get_ipv6_only(host_port)\n\t\t\t\telse\n\t\t\t\t\tresult.address = sp[1]\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tresult.address = host_port\n\t\t\tend\n\n\t\t\tif not params.type then params.type = \"tcp\" end\n\t\t\tparams.type = string.lower(params.type)\n\t\t\tif ({ xhttp=true, kcp=true, mkcp=true })[params.type] and result.type ~= \"Xray\" and has_xray then\n\t\t\t\tresult.type = \"Xray\"\n\t\t\tend\n\t\t\tif result.type == \"sing-box\" and params.type == \"raw\" then \n\t\t\t\tparams.type = \"tcp\"\n\t\t\telseif result.type == \"Xray\" and params.type == \"tcp\" then\n\t\t\t\tparams.type = \"raw\"\n\t\t\tend\n\t\t\tif params.type == \"h2\" or params.type == \"http\" then\n\t\t\t\tparams.type = \"http\"\n\t\t\t\tresult.transport = (result.type == \"Xray\") and \"xhttp\" or \"http\"\n\t\t\telse\n\t\t\t\tresult.transport = params.type\n\t\t\tend\n\t\t\tif params.type == 'ws' then\n\t\t\t\tresult.ws_host = params.host\n\t\t\t\tresult.ws_path = params.path\n\t\t\t\tif result.type == \"sing-box\" and params.path then\n\t\t\t\t\tlocal ws_path_dat = split(params.path, \"%?\")\n\t\t\t\t\tlocal ws_path = ws_path_dat[1]\n\t\t\t\t\tlocal ws_path_params = {}\n\t\t\t\t\tfor _, v in pairs(split(ws_path_dat[2], '&')) do\n\t\t\t\t\t\tlocal t = split(v, '=')\n\t\t\t\t\t\tws_path_params[t[1]] = t[2]\n\t\t\t\t\tend\n\t\t\t\t\tif ws_path_params.ed and tonumber(ws_path_params.ed) then\n\t\t\t\t\t\tresult.ws_path = ws_path\n\t\t\t\t\t\tresult.ws_enableEarlyData = \"1\"\n\t\t\t\t\t\tresult.ws_maxEarlyData = tonumber(ws_path_params.ed)\n\t\t\t\t\t\tresult.ws_earlyDataHeaderName = \"Sec-WebSocket-Protocol\"\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif params.type == \"http\" then\n\t\t\t\tif result.type == \"sing-box\" then\n\t\t\t\t\tresult.transport = \"http\"\n\t\t\t\t\tresult.http_host = (params.host and params.host ~= \"\") and { params.host } or nil\n\t\t\t\t\tresult.http_path = params.path\n\t\t\t\telseif result.type == \"Xray\" then\n\t\t\t\t\tresult.transport = \"xhttp\"\n\t\t\t\t\tresult.xhttp_mode = \"stream-one\"\n\t\t\t\t\tresult.xhttp_host = params.host\n\t\t\t\t\tresult.xhttp_path = params.path\n\t\t\t\tend\n\t\t\tend\n\t\t\tif params.type == 'raw' or params.type == 'tcp' then\n\t\t\t\tresult.tcp_guise = params.headerType or \"none\"\n\t\t\t\tresult.tcp_guise_http_host = (params.host and params.host ~= \"\") and { params.host } or nil\n\t\t\t\tresult.tcp_guise_http_path = (params.path and params.path ~= \"\") and { params.path } or nil\n\t\t\tend\n\t\t\tif params.type == 'kcp' or params.type == 'mkcp' then\n\t\t\t\tresult.transport = \"mkcp\"\n\t\t\t\tresult.mkcp_guise = params.headerType or \"none\"\n\t\t\t\tresult.mkcp_seed = params.seed\n\t\t\tend\n\t\t\tif params.type == 'quic' then\n\t\t\t\tresult.quic_guise = params.headerType or \"none\"\n\t\t\t\tresult.quic_key = params.key\n\t\t\t\tresult.quic_security = params.quicSecurity or \"none\"\n\t\t\tend\n\t\t\tif params.type == 'grpc' then\n\t\t\t\tif params.path then result.grpc_serviceName = params.path end\n\t\t\t\tif params.serviceName then result.grpc_serviceName = params.serviceName end\n\t\t\t\tresult.grpc_mode = params.mode or \"gun\"\n\t\t\tend\n\t\t\tif params.type == 'xhttp' or params.type == 'splithttp' then\n\t\t\t\tresult.xhttp_host = params.host\n\t\t\t\tresult.xhttp_path = params.path\n\t\t\t\tresult.xhttp_mode = params.mode or \"auto\"\n\t\t\t\tresult.use_xhttp_extra = (params.extra and params.extra ~= \"\") and \"1\" or nil\n\t\t\t\tresult.xhttp_extra = (params.extra and params.extra ~= \"\") and api.base64Encode(params.extra) or nil\n\t\t\t\tlocal success, Data = pcall(jsonParse, params.extra)\n\t\t\t\tif success and Data then\n\t\t\t\t\tlocal address = (Data.extra and Data.extra.downloadSettings and Data.extra.downloadSettings.address)\n\t\t\t\t\t\t\tor (Data.downloadSettings and Data.downloadSettings.address)\n\t\t\t\t\tresult.download_address = (address and address ~= \"\") and address:gsub(\"^%[\", \"\"):gsub(\"%]$\", \"\") or nil\n\t\t\t\tend\n\t\t\tend\n\t\t\tif params.type == 'httpupgrade' then\n\t\t\t\tresult.httpupgrade_host = params.host\n\t\t\t\tresult.httpupgrade_path = params.path\n\t\t\tend\n\t\t\tresult.encryption = params.encryption or \"none\"\n\t\t\tresult.flow = params.flow\n\n\t\t\tresult.tls = \"0\"\n\t\t\tif params.security == \"tls\" or params.security == \"reality\" then\n\t\t\t\tresult.tls = \"1\"\n\t\t\t\tresult.tls_serverName = (params.sni and params.sni ~= \"\") and params.sni or params.host\n\t\t\t\tresult.alpn = params.alpn\n\t\t\t\tif params.fp and params.fp ~= \"\" then\n\t\t\t\t\tresult.utls = \"1\"\n\t\t\t\t\tresult.fingerprint = params.fp\n\t\t\t\tend\n\t\t\t\tif params.ech and params.ech ~= \"\" then\n\t\t\t\t\tresult.ech = \"1\"\n\t\t\t\t\tresult.ech_config = params.ech\n\t\t\t\tend\n\t\t\t\tresult.tls_pinSHA256 = params.pcs\n\t\t\t\tresult.tls_CertByName = params.vcn\n\t\t\t\tif params.security == \"reality\" then\n\t\t\t\t\tresult.reality = \"1\"\n\t\t\t\t\tresult.reality_publicKey = params.pbk or nil\n\t\t\t\t\tresult.reality_shortId = params.sid or nil\n\t\t\t\t\tresult.reality_spiderX = params.spx or nil\n\t\t\t\t\tresult.use_mldsa65Verify = (params.pqv and params.pqv ~= \"\") and \"1\" or nil\n\t\t\t\t\tresult.reality_mldsa65Verify = params.pqv or nil\n\t\t\t\tend\n\t\t\t\tlocal insecure = params.allowinsecure or params.allowInsecure or params.insecure\n\t\t\t\tresult.tls_allowInsecure = (insecure == \"1\" or insecure == \"0\") and insecure or (sub_allowinsecure and \"1\" or \"0\")\n\t\t\tend\n\n\t\t\tresult.port = port\n\t\t\tresult.tcp_fast_open = params.tfo\n\t\t\tresult.use_finalmask = (params.fm and params.fm ~= \"\") and \"1\" or nil\n\t\t\tresult.finalmask = (params.fm and params.fm ~= \"\") and api.base64Encode(params.fm) or nil\n\n\t\t\tif result.type == \"sing-box\" and (result.transport == \"mkcp\" or result.transport == \"xhttp\") then\n\t\t\t\tlog(2, i18n.translatef(\"Skip node: %s. Because Sing-Box does not support the %s protocol's %s transmission method, Xray needs to be used instead.\", result.remarks, szType, result.transport))\n\t\t\t\treturn nil\n\t\t\tend\n\t\tend\n\telseif szType == 'hysteria' then\n\t\tif has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\t\tresult.protocol = \"hysteria\"\n\t\telse\n\t\t\tlog(2, i18n.translatef(\"Skip the %s node because the %s core program is not installed.\", \"Hysteria\", \"Hysteria\", \"Sing-Box\"))\n\t\t\treturn nil\n\t\tend\n\n\t\tlocal alias = \"\"\n\t\tif content:find(\"#\") then\n\t\t\tlocal idx_sp = content:find(\"#\")\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\t\tcontent = content:sub(0, idx_sp - 1)\n\t\tend\n\t\tresult.remarks = UrlDecode(alias)\n\t\t\n\t\tlocal query = split(content:gsub(\"/%?\", \"?\"), '%?')\n\t\tlocal host_port = query[1]\n\t\tlocal params = {}\n\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\tif s and s > 1 then\n\t\t\t\tparams[v:sub(1, s - 1)] = v:sub(s + 1)\n\t\t\tend\n\t\tend\n\t\t-- [2001:4860:4860::8888]:443\n\t\t-- 8.8.8.8:443\n\t\tif host_port:find(\":\") then\n\t\t\tlocal sp = split(host_port, \":\")\n\t\t\tresult.port = sp[#sp]\n\t\t\tif api.is_ipv6addrport(host_port) then\n\t\t\t\tresult.address = api.get_ipv6_only(host_port)\n\t\t\telse\n\t\t\t\tresult.address = sp[1]\n\t\t\tend\n\t\telse\n\t\t\tresult.address = host_port\n\t\tend\n\t\tresult.hysteria_obfs = params.obfsParam\n\t\tresult.hysteria_auth_type = \"string\"\n\t\tresult.hysteria_auth_password = params.auth\n\t\tresult.tls_serverName = params.peer or params.sni or \"\"\n\t\tlocal insecure = params.allowinsecure or params.allowInsecure or params.insecure\n\t\tresult.tls_allowInsecure = (insecure == \"1\" or insecure == \"0\") and insecure or (sub_allowinsecure and \"1\" or \"0\")\n\t\tresult.alpn = params.alpn\n\t\tresult.hysteria_up_mbps = params.upmbps\n\t\tresult.hysteria_down_mbps = params.downmbps\n\t\tresult.hysteria_hop = params.mport\n\n\telseif szType == 'hysteria2' or szType == 'hy2' then\n\t\tlocal alias = \"\"\n\t\tif content:find(\"#\") then\n\t\t\tlocal idx_sp = content:find(\"#\")\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\t\tcontent = content:sub(0, idx_sp - 1)\n\t\tend\n\t\tresult.remarks = UrlDecode(alias)\n\t\tlocal Info = content\n\t\tif content:find(\"@\") then\n\t\t\tlocal contents = split(content, \"@\")\n\t\t\tresult.hysteria2_auth_password = UrlDecode(contents[1])\n\t\t\tInfo = (contents[2] or \"\"):gsub(\"/%?\", \"?\")\n\t\tend\n\t\tlocal query = split(Info, \"%?\")\n\t\tlocal host_port = query[1]\n\t\tlocal params = {}\n\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\tif s and s > 1 then\n\t\t\t\tparams[v:sub(1, s - 1):lower()] = UrlDecode(v:sub(s + 1))\n\t\t\tend\n\t\tend\n\t\t-- [2001:4860:4860::8888]:443\n\t\t-- 8.8.8.8:443\n\t\tif host_port:find(\":\") then\n\t\t\tlocal sp = split(host_port, \":\")\n\t\t\tresult.port = sp[#sp]\n\t\t\tif api.is_ipv6addrport(host_port) then\n\t\t\t\tresult.address = api.get_ipv6_only(host_port)\n\t\t\telse\n\t\t\t\tresult.address = sp[1]\n\t\t\tend\n\t\telse\n\t\t\tresult.address = host_port\n\t\tend\n\t\tresult.tls_serverName = params.sni\n\t\tresult.tls_pinSHA256 = params.pcs or params.pinsha256\n\t\tresult.tls_CertByName = params.vcn\n\t\tlocal insecure = params.allowinsecure or params.insecure\n\t\tresult.tls_allowInsecure = (insecure == \"1\" or insecure == \"0\") and insecure or (sub_allowinsecure and \"1\" or \"0\")\n\t\tresult.hysteria2_hop = params.mport\n\n\t\tif (sub_hysteria2_type == \"sing-box\" and has_singbox) or (sub_hysteria2_type == \"xray\" and has_xray) then\n\t\t\tlocal is_singbox = sub_hysteria2_type == \"sing-box\" and has_singbox\n\t\t\tresult.type = is_singbox and 'sing-box' or 'Xray'\n\t\t\tresult.protocol = \"hysteria2\"\n\t\t\tif params[\"obfs-password\"] or params[\"obfs_password\"] then\n\t\t\t\tresult.hysteria2_obfs_type = \"salamander\"\n\t\t\t\tresult.hysteria2_obfs_password = params[\"obfs-password\"] or params[\"obfs_password\"]\n\t\t\tend\n\t\t\tresult.use_finalmask = (params.fm and params.fm ~= \"\") and \"1\" or nil\n\t\t\tresult.finalmask = (params.fm and params.fm ~= \"\") and api.base64Encode(params.fm) or nil\n\t\telseif has_hysteria2 then\n\t\t\tresult.type = \"Hysteria2\"\n\t\t\tif params[\"obfs-password\"] or params[\"obfs_password\"] then\n\t\t\t\tresult.hysteria2_obfs = params[\"obfs-password\"] or params[\"obfs_password\"]\n\t\t\tend\n\t\telse\n\t\t\tlog(2, i18n.translatef(\"Skipping the %s node is due to incompatibility with the %s core program or incorrect node usage type settings.\", \"Hysteria2\", \"Hysteria2\"))\n\t\t\treturn nil\n\t\tend\n\telseif szType == 'tuic' then\n\t\tif has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\t\tresult.protocol = \"tuic\"\n\t\telse\n\t\t\tlog(2, i18n.translatef(\"Skip the %s node because the %s core program is not installed.\", \"Tuic\", \"Tuic\", \"Sing-Box\"))\n\t\t\treturn nil\n\t\tend\n\n\t\tlocal alias = \"\"\n\t\tif content:find(\"#\") then\n\t\t\tlocal idx_sp = content:find(\"#\")\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\t\tcontent = content:sub(0, idx_sp - 1)\n\t\tend\n\t\tresult.remarks = UrlDecode(alias)\n\t\tlocal Info = content\n\t\tif content:find(\"@\", 1, true) then\n\t\t\tlocal contents = split(content, \"@\")\n\t\t\tlocal auth = contents[1] or \"\"\n\t\t\tlocal idx = auth:find(\":\", 1, true)\n\t\t\tif not idx then -- Fix for some links will encode the ':' between the UUID and password.\n\t\t\t\tauth = UrlDecode(auth)\n\t\t\t\tidx = auth:find(\":\", 1, true)\n\t\t\tend\n\t\t\tif idx then\n\t\t\t\tresult.uuid = UrlDecode(auth:sub(1, idx - 1))\n\t\t\t\tresult.password = UrlDecode(auth:sub(idx + 1))\n\t\t\tend\n\t\t\tInfo = (contents[2] or \"\"):gsub(\"/%?\", \"?\")\n\t\tend\n\t\tlocal query = split(Info, \"%?\")\n\t\tlocal host_port = query[1]\n\t\tlocal params = {}\n\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\tif s and s > 1 then\n\t\t\t\tparams[v:sub(1, s - 1):lower()] = UrlDecode(v:sub(s + 1))\n\t\t\tend\n\t\tend\n\t\tif host_port:find(\":\") then\n\t\t\tlocal sp = split(host_port, \":\")\n\t\t\tresult.port = sp[#sp]\n\t\t\tif api.is_ipv6addrport(host_port) then\n\t\t\t\tresult.address = api.get_ipv6_only(host_port)\n\t\t\telse\n\t\t\t\tresult.address = sp[1]\n\t\t\tend\n\t\telse\n\t\t\tresult.address = host_port\n\t\tend\n\t\tresult.tls_serverName = params.sni\n\t\tresult.tls_disable_sni = params.disable_sni\n\t\tresult.tuic_alpn = params.alpn or \"default\"\n\t\tresult.tuic_congestion_control = params.congestion_control or \"cubic\"\n\t\tresult.tuic_udp_relay_mode = params.udp_relay_mode or \"native\"\n\t\tlocal insecure = params.allowinsecure or params.insecure or params.allow_insecure\n\t\tresult.tls_allowInsecure = (insecure == \"1\" or insecure == \"0\") and insecure or (sub_allowinsecure and \"1\" or \"0\")\n\telseif szType == \"anytls\" then\n\t\tif has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\t\tresult.protocol = \"anytls\"\n\t\telse\n\t\t\tlog(2, i18n.translatef(\"Skip the %s node because the %s core program is not installed.\", \"AnyTLS\", \"AnyTLS\", \"Sing-Box 1.12\"))\n\t\t\treturn nil\n\t\tend\n\n\t\tlocal alias = \"\"\n\t\tif content:find(\"#\") then\n\t\t\tlocal idx_sp = content:find(\"#\")\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\t\tcontent = content:sub(0, idx_sp - 1)\n\t\tend\n\t\tresult.remarks = UrlDecode(alias)\n\t\tif content:find(\"@\") then\n\t\t\tlocal Info = split(content, \"@\")\n\t\t\tresult.password = UrlDecode(Info[1])\n\t\t\tlocal port = \"443\"\n\t\t\tInfo[2] = (Info[2] or \"\"):gsub(\"/%?\", \"?\")\n\t\t\tlocal query = split(Info[2], \"%?\")\n\t\t\tlocal host_port = query[1]\n\t\t\tlocal params = {}\n\t\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\t\tif s and s > 1 then\n\t\t\t\t\tparams[v:sub(1, s - 1):lower()] = UrlDecode(v:sub(s + 1))\n\t\t\t\tend\n\t\t\tend\n\t\t\t-- [2001:4860:4860::8888]:443\n\t\t\t-- 8.8.8.8:443\n\t\t\tif host_port:find(\":\") then\n\t\t\t\tlocal sp = split(host_port, \":\")\n\t\t\t\tport = sp[#sp]\n\t\t\t\tif api.is_ipv6addrport(host_port) then\n\t\t\t\t\tresult.address = api.get_ipv6_only(host_port)\n\t\t\t\telse\n\t\t\t\t\tresult.address = sp[1]\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tresult.address = host_port\n\t\t\tend\n\t\t\tresult.tls = \"0\"\n\t\t\tif not params.security or params.security == \"\" then\n\t\t\t\tparams.security = \"tls\"\n\t\t\tend\n\t\t\tif params.security == \"tls\" or params.security == \"reality\" then\n\t\t\t\tresult.tls = \"1\"\n\t\t\t\tresult.tls_serverName = params.sni\n\t\t\t\tresult.alpn = params.alpn\n\t\t\t\tif params.fp and params.fp ~= \"\" then\n\t\t\t\t\tresult.utls = \"1\"\n\t\t\t\t\tresult.fingerprint = params.fp\n\t\t\t\tend\n\t\t\t\tif params.security == \"reality\" then\n\t\t\t\t\tresult.reality = \"1\"\n\t\t\t\t\tresult.reality_publicKey = params.pbk or nil\n\t\t\t\t\tresult.reality_shortId = params.sid or nil\n\t\t\t\tend\n\t\t\tend\n\t\t\tresult.port = port\n\t\t\tlocal insecure = params.allowinsecure or params.insecure\n\t\t\tresult.tls_allowInsecure = (insecure == \"1\" or insecure == \"0\") and insecure or (sub_allowinsecure and \"1\" or \"0\")\n\t\tend\n\telseif szType == 'naive+https' or szType == 'naive+quic' then\n\t\tif has_singbox then\n\t\t\tresult.type = 'sing-box'\n\t\t\tresult.protocol = \"naive\"\n\t\telse\n\t\t\tlog(2, i18n.translatef(\"Skip the %s node because the %s core program is not installed.\", \"NaïveProxy\", \"Sing-Box\"))\n\t\t\treturn nil\n\t\tend\n\n\t\tlocal alias = \"\"\n\t\tif content:find(\"#\") then\n\t\t\tlocal idx_sp = content:find(\"#\")\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\t\tcontent = content:sub(0, idx_sp - 1)\n\t\tend\n\t\tresult.remarks = UrlDecode(alias)\n\t\tlocal Info = content\n\t\tif content:find(\"@\", 1, true) then\n\t\t\tlocal contents = split(content, \"@\")\n\t\t\tlocal auth = contents[1] or \"\"\n\t\t\tlocal idx = auth:find(\":\", 1, true)\n\t\t\tif not idx then -- Fixed some links that encode the colon between username and password.\n\t\t\t\tauth = UrlDecode(auth)\n\t\t\t\tidx = auth:find(\":\", 1, true)\n\t\t\tend\n\t\t\tif idx then\n\t\t\t\tresult.username = UrlDecode(auth:sub(1, idx - 1))\n\t\t\t\tresult.password = UrlDecode(auth:sub(idx + 1))\n\t\t\tend\n\t\t\tInfo = (contents[2] or \"\"):gsub(\"/%?\", \"?\")\n\t\tend\n\t\tlocal query = split(Info, \"%?\")\n\t\tlocal host_port = query[1]\n\t\tlocal params = {}\n\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\tlocal s = v:find(\"=\", 1, true)\n\t\t\tif s and s > 1 then\n\t\t\t\tparams[v:sub(1, s - 1)] = UrlDecode(v:sub(s + 1))\n\t\t\tend\n\t\tend\n\t\tif host_port:find(\":\") then\n\t\t\tlocal sp = split(host_port, \":\")\n\t\t\tresult.port = sp[#sp]\n\t\t\tif api.is_ipv6addrport(host_port) then\n\t\t\t\tresult.address = api.get_ipv6_only(host_port)\n\t\t\telse\n\t\t\t\tresult.address = sp[1]\n\t\t\tend\n\t\telse\n\t\t\tresult.address = host_port\n\t\tend\n\t\tresult.tls_serverName = params.sni\n\t\tresult.uot = params.uot\n\t\tresult.naive_insecure_concurrency = params[\"insecure-concurrency\"] or \"0\"\n\t\tif params.ech and params.ech ~= \"\" then\n\t\t\tresult.ech = \"1\"\n\t\t\tresult.ech_config = params.ech\n\t\tend\n\t\tif szType == \"naive+quic\" then\n\t\t\tresult.naive_quic = \"1\"\n\t\t\tresult.naive_congestion_control = params.congestion_control or \"bbr\"\n\t\tend\n\telse\n\t\tlog(2, i18n.translatef(\"%s type node subscriptions are not currently supported, skip this node.\", szType))\n\t\treturn nil\n\tend\n\tif not result.remarks or result.remarks == \"\" then\n\t\tif result.address and result.port then\n\t\t\tresult.remarks = result.address .. ':' .. result.port\n\t\telse\n\t\t\tresult.remarks = \"NULL\"\n\t\tend\n\tend\n\treturn result\nend\n\nlocal function curl(url, file, ua, mode)\n\tif not url or url == \"\" then return 22, 404 end\n\tlocal curl_args = {\n\t\t\"-fskL\", \"-w %{http_code}\", \"--retry 3\", \"--connect-timeout 3\", \"-H 'Accept-Encoding: identity'\"\n\t}\n\tif ua and ua ~= \"\" and ua ~= \"curl\" then\n\t\tua = (ua == \"passwall2\") and (\"passwall2/\" .. api.get_version()) or ua\n\t\tcurl_args[#curl_args + 1] = '--user-agent \"' .. ua .. '\"'\n\tend\n\tcurl_args[#curl_args + 1] = get_headers()\n\tlocal return_code, result\n\tif mode == \"direct\" then\n\t\treturn_code, result = api.curl_direct(url, file, curl_args)\n\telseif mode == \"proxy\" then\n\t\treturn_code, result = api.curl_proxy(url, file, curl_args)\n\telse\n\t\treturn_code, result = api.curl_auto(url, file, curl_args)\n\tend\n\treturn return_code, tonumber(result)\nend\n\nfunction get_headers()\n\tlocal cache_file = \"/tmp/etc/\" .. appname .. \"_tmp/sub_curl_headers\"\n\tif fs.access(cache_file) then\n\t\treturn luci.sys.exec(\"cat \" .. cache_file)\n\tend\n\tlocal headers = {}\n\n\tlocal function readfile(path)\n\t\tlocal f = io.open(path, \"r\")\n\t\tif not f then return nil end\n\t\tlocal c = f:read(\"*a\")\n\t\tf:close()\n\t\treturn api.trim(c)\n\tend\n\n\theaders[#headers + 1] = \"x-device-os: OpenWrt\"\n\n\tlocal rel = readfile(\"/etc/openwrt_release\")\n\tlocal os_ver = rel and rel:match(\"DISTRIB_RELEASE='([^']+)'\")\n\tif os_ver then\n\t\theaders[#headers + 1] = \"x-ver-os: \" .. os_ver\n\tend\n\n\tlocal model = readfile(\"/tmp/sysinfo/model\")\n\tif model then\n\t\theaders[#headers + 1] = \"x-device-model: \" .. model\n\tend\n\n\tlocal mac = readfile(\"/sys/class/net/eth0/address\")\n\tif mac and model then\n\t\tlocal raw = mac .. \"-\" .. model\n\t\tlocal p = io.popen(\"printf '%s' '\" .. raw:gsub(\"'\", \"'\\\\''\") .. \"' | sha256sum\")\n\t\tif p then\n\t\t\tlocal hash = p:read(\"*l\")\n\t\t\tp:close()\n\t\t\thash = hash and hash:match(\"^%w+\")\n\t\t\tif hash then\n\t\t\t\theaders[#headers + 1] = \"x-hwid: \" .. hash\n\t\t\tend\n\t\tend\n\tend\n\n\tlocal out = {}\n\tfor i = 1, #headers do\n\t\tout[i] = \"-H '\" .. headers[i]:gsub(\"'\", \"'\\\\''\") .. \"'\"\n\tend\n\tlocal headers_str = table.concat(out, \" \")\n\tlocal f = io.open(cache_file, \"w\"); if f then f:write(headers_str); f:close() end\n\treturn headers_str\nend\n\nlocal function truncate_nodes(group)\n\tfor _, config in pairs(CONFIG) do\n\t\tif config.currentNodes and #config.currentNodes > 0 then\n\t\t\tlocal newNodes = {}\n\t\t\tlocal removeNodesSet = {}\n\t\t\tfor k, v in pairs(config.currentNodes) do\n\t\t\t\tif v.currentNode and v.currentNode.add_mode == \"2\" then\n\t\t\t\t\tif (not group) or (group:lower() == (v.currentNode.group or \"\"):lower()) then\n\t\t\t\t\t\tremoveNodesSet[v.currentNode[\".name\"]] = true\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tfor _, value in ipairs(config.currentNodes) do\n\t\t\t\tif not removeNodesSet[value.currentNode[\".name\"]] then\n\t\t\t\t\tnewNodes[#newNodes + 1] = value.currentNode[\".name\"]\n\t\t\t\tend\n\t\t\tend\n\t\t\tif config.set then\n\t\t\t\tconfig.set(config, newNodes)\n\t\t\tend\n\t\telse\n\t\t\tif config.currentNode and config.currentNode.add_mode == \"2\" then\n\t\t\t\tif (not group) or (group:lower() == (config.currentNode.group or \"\"):lower()) then\n\t\t\t\t\tif config.delete then\n\t\t\t\t\t\tconfig.delete(config)\n\t\t\t\t\telseif config.set then\n\t\t\t\t\t\tconfig.set(config, \"\")\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\tuci:foreach(appname, \"nodes\", function(node)\n\t\tif node.add_mode == \"2\" then\n\t\t\tif (not group) or (group:lower() == (node.group or \"\"):lower()) then\n\t\t\t\tuci:delete(appname, node['.name'])\n\t\t\tend\n\t\tend\n\tend)\n\tuci:foreach(appname, \"subscribe_list\", function(o)\n\t\tif (not group) or (group:lower() == (o.remark or \"\"):lower()) then\n\t\t\tuci:delete(appname, o['.name'], \"md5\")\n\t\tend\n\tend)\n\tapi.uci_save(uci, appname, true)\nend\n\nlocal function select_node(nodes, config, parentConfig)\n\tlocal log_level = 1\n\tif parentConfig then\n\t\tlog_level = log_level + 1\n\tend\n\tif config.currentNode then\n\t\tlocal server\n\t\t-- Load balancing, keeping the original ID of the Socks [port] node in urltest.\n\t\tif config.currentNode[\"Socks\"] then\n\t\t\tserver = config.currentNode.Socks\n\t\tend\n\t\t-- Special priority: cfgid\n\t\tif config.currentNode[\".name\"] then\n\t\t\tfor index, node in pairs(nodes) do\n\t\t\t\tif node[\".name\"] == config.currentNode[\".name\"] then\n\t\t\t\t\tif config.log == nil or config.log == true then\n\t\t\t\t\t\tlog(log_level, i18n.translatef(\"Update [%s]\", config.remarks) .. \" \" .. i18n.translatef(\"Matching node:\") .. \" \" .. node.remarks)\n\t\t\t\t\tend\n\t\t\t\t\tserver = node[\".name\"]\n\t\t\t\t\tbreak\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\t-- First priority: Type + Notes + IP + Port\n\t\tif not server then\n\t\t\tfor index, node in pairs(nodes) do\n\t\t\t\tif config.currentNode.type and config.currentNode.remarks and config.currentNode.address and config.currentNode.port then\n\t\t\t\t\tif node.type and node.remarks and node.address and node.port then\n\t\t\t\t\t\tif node.type == config.currentNode.type and node.remarks == config.currentNode.remarks and (node.address .. ':' .. node.port == config.currentNode.address .. ':' .. config.currentNode.port) then\n\t\t\t\t\t\t\tif config.log == nil or config.log == true then\n\t\t\t\t\t\t\t\tlog(log_level, i18n.translatef(\"Update [%s]\", config.remarks) .. \" \" .. i18n.translatef(\"First Matching node:\") .. \" \" .. node.remarks)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tserver = node[\".name\"]\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\t-- Second priority: Type + IP + Port\n\t\tif not server then\n\t\t\tfor index, node in pairs(nodes) do\n\t\t\t\tif config.currentNode.type and config.currentNode.address and config.currentNode.port then\n\t\t\t\t\tif node.type and node.address and node.port then\n\t\t\t\t\t\tif node.type == config.currentNode.type and (node.address .. ':' .. node.port == config.currentNode.address .. ':' .. config.currentNode.port) then\n\t\t\t\t\t\t\tif config.log == nil or config.log == true then\n\t\t\t\t\t\t\t\tlog(log_level, i18n.translatef(\"Update [%s]\", config.remarks) .. \" \" .. i18n.translatef(\"Second Matching node:\") .. \" \" .. node.remarks)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tserver = node[\".name\"]\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\t-- Third priority: IP + Port\n\t\tif not server then\n\t\t\tfor index, node in pairs(nodes) do\n\t\t\t\tif config.currentNode.address and config.currentNode.port then\n\t\t\t\t\tif node.address and node.port then\n\t\t\t\t\t\tif node.address .. ':' .. node.port == config.currentNode.address .. ':' .. config.currentNode.port then\n\t\t\t\t\t\t\tif config.log == nil or config.log == true then\n\t\t\t\t\t\t\t\tlog(log_level, i18n.translatef(\"Update [%s]\", config.remarks) .. \" \" .. i18n.translatef(\"Third Matching node:\") .. \" \" .. node.remarks)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tserver = node[\".name\"]\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\t-- Fourth priority: IP\n\t\tif not server then\n\t\t\tfor index, node in pairs(nodes) do\n\t\t\t\tif config.currentNode.address then\n\t\t\t\t\tif node.address then\n\t\t\t\t\t\tif node.address == config.currentNode.address then\n\t\t\t\t\t\t\tif config.log == nil or config.log == true then\n\t\t\t\t\t\t\t\tlog(log_level, i18n.translatef(\"Update [%s]\", config.remarks) .. \" \" .. i18n.translatef(\"Fourth Matching node:\") .. \" \" .. node.remarks)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tserver = node[\".name\"]\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\t-- Fifth priority: remarks\n\t\tif not server then\n\t\t\tfor index, node in pairs(nodes) do\n\t\t\t\tif config.currentNode.remarks then\n\t\t\t\t\tif node.remarks then\n\t\t\t\t\t\tif node.remarks == config.currentNode.remarks then\n\t\t\t\t\t\t\tif config.log == nil or config.log == true then\n\t\t\t\t\t\t\t\tlog(log_level, i18n.translatef(\"Update [%s]\", config.remarks) .. \" \" .. i18n.translatef(\"Fifth Matching node:\") .. \" \" .. node.remarks)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tserver = node[\".name\"]\n\t\t\t\t\t\t\tbreak\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif not parentConfig then\n\t\t\t-- If that doesn't work, just find one.\n\t\t\tif not server then\n\t\t\t\tif #nodes_table > 0 then\n\t\t\t\t\tif config.log == nil or config.log == true then\n\t\t\t\t\t\tlog(log_level, i18n.translatef(\"Update [%s]\", config.remarks) .. \" \" .. i18n.translatef(\"Unable to find the best matching node, now replaced with:\") .. \" \" .. nodes_table[1].remarks)\n\t\t\t\t\tend\n\t\t\t\t\tserver = nodes_table[1][\".name\"]\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\t\tif server then\n\t\t\tif parentConfig then\n\t\t\t\tconfig.set(parentConfig, server)\n\t\t\telse\n\t\t\t\tconfig.set(config, server)\n\t\t\tend\n\t\tend\n\telse\n\t\tif not parentConfig then\n\t\t\tconfig.set(config, \"\")\n\t\tend\n\tend\nend\n\nlocal function update_node(manual)\n\tif next(nodeResult) == nil then\n\t\tlog(1, i18n.translatef(\"No node information updates are available.\"))\n\t\treturn\n\tend\n\n\tlocal group = {}\n\tfor _, v in ipairs(nodeResult) do\n\t\tgroup[v[\"remark\"]:lower()] = true\n\tend\n\n\tif manual == 0 and next(group) then\n\t\tuci:foreach(appname, \"nodes\", function(node)\n\t\t\t-- Do not delete nodes if no new nodes are found or nodes were manually imported...\n\t\t\tif node.add_mode == \"2\" and (node.group and group[node.group:lower()] == true) then\n\t\t\t\tuci:delete(appname, node['.name'])\n\t\t\tend\n\t\tend)\n\tend\n\tfor _, v in ipairs(nodeResult) do\n\t\tlocal remark = v[\"remark\"]\n\t\tlocal list = v[\"list\"]\n\t\tlocal sub_cfg = v[\"sub_cfg\"]\n\t\tlocal domain_resolver, domain_resolver_dns, domain_resolver_dns_https, domain_strategy\n\t\tlocal preproxy_node_group, to_node_group, chain_node_type = \"\", \"\", \"\"\n\t\t-- Subscription Group Chain Agent\n\t\tlocal function valid_chain_node(node)\n\t\t\tif not node then return \"\" end\n\t\t\tlocal cp = uci:get(appname, node, \"chain_proxy\") or \"\"\n\t\t\tlocal am = uci:get(appname, node, \"add_mode\") or \"0\"\n\t\t\tchain_node_type = (cp == \"\" and am ~= \"2\") and (uci:get(appname, node, \"type\") or \"\") or \"\"\n\t\t\tif chain_node_type ~= \"Xray\" and chain_node_type ~= \"sing-box\" then\n\t\t\t\tchain_node_type = \"\"\n\t\t\t\treturn \"\"\n\t\t\tend\n\t\t\treturn node\n\t\tend\n\t\tif sub_cfg then\n\t\t\tdomain_resolver = sub_cfg.domain_resolver\n\t\t\tdomain_resolver_dns = sub_cfg.domain_resolver_dns\n\t\t\tdomain_resolver_dns_https = sub_cfg.domain_resolver_dns_https\n\t\t\tdomain_strategy = (sub_cfg.domain_strategy == \"UseIPv4\" or sub_cfg.domain_strategy == \"UseIPv6\") and sub_cfg.domain_strategy or nil\n\t\t\tpreproxy_node_group = (sub_cfg.chain_proxy == \"1\") and valid_chain_node(sub_cfg.preproxy_node) or \"\"\n\t\t\tto_node_group = (sub_cfg.chain_proxy == \"2\") and valid_chain_node(sub_cfg.to_node) or \"\"\n\t\tend\n\t\tfor _, vv in ipairs(list) do\n\t\t\tlocal cfgid = uci:section(appname, \"nodes\", api.gen_short_uuid())\n\t\t\tfor kkk, vvv in pairs(vv) do\n\t\t\t\tif type(vvv) == \"table\" and next(vvv) ~= nil then\n\t\t\t\t\tuci:set_list(appname, cfgid, kkk, vvv)\n\t\t\t\telse\n\t\t\t\t\tif kkk ~= \"group\" or vvv ~= \"default\" then\n\t\t\t\t\t\tuci:set(appname, cfgid, kkk, vvv)\n\t\t\t\t\tend\n\t\t\t\t\t-- Sing-Box Node Domain resolver\n\t\t\t\t\tif kkk == \"type\" and (vvv == \"Xray\" or vvv == \"sing-box\") then\n\t\t\t\t\t\tif domain_resolver then\n\t\t\t\t\t\t\tuci:set(appname, cfgid, \"domain_resolver\", domain_resolver)\n\t\t\t\t\t\t\tif domain_resolver_dns then\n\t\t\t\t\t\t\t\tuci:set(appname, cfgid, \"domain_resolver_dns\", domain_resolver_dns)\n\t\t\t\t\t\t\telseif domain_resolver_dns_https then\n\t\t\t\t\t\t\t\tuci:set(appname, cfgid, \"domain_resolver_dns_https\", domain_resolver_dns_https)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\tif domain_strategy then\n\t\t\t\t\t\t\tif vvv == \"sing-box\" then\n\t\t\t\t\t\t\t\tdomain_strategy = (domain_strategy == \"UseIPv4\" and \"ipv4_only\") or (domain_strategy == \"UseIPv6\" and \"ipv6_only\") or domain_strategy\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tuci:set(appname, cfgid, \"domain_strategy\", domain_strategy)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\t-- Subscription Group Chain Agent\n\t\t\t\t\tif chain_node_type ~= \"\" and kkk == \"type\" and (vvv == \"Xray\" or vvv == \"sing-box\") then\n\t\t\t\t\t\tif preproxy_node_group ~=\"\" then\n\t\t\t\t\t\t\tuci:set(appname, cfgid, \"chain_proxy\", \"1\")\n\t\t\t\t\t\t\tuci:set(appname, cfgid, \"preproxy_node\", preproxy_node_group)\n\t\t\t\t\t\telseif to_node_group ~= \"\" then\n\t\t\t\t\t\t\tuci:set(appname, cfgid, \"chain_proxy\", \"2\")\n\t\t\t\t\t\t\tuci:set(appname, cfgid, \"to_node\", to_node_group)\n\t\t\t\t\t\tend\n\t\t\t\t\tend\t\t\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\t-- Update subscription information\n\tfor cfgid, info in pairs(subscribe_info) do\n\t\tfor key, value in pairs(info) do\n\t\t\tif value ~= \"\" then\n\t\t\t\tuci:set(appname, cfgid, key, value)\n\t\t\telse\n\t\t\t\tuci:delete(appname, cfgid, key)\n\t\t\tend\n\t\tend\n\tend\n\n\tif next(CONFIG) then\n\t\tlocal nodes = {}\n\t\tuci:foreach(appname, \"nodes\", function(node)\n\t\t\tnodes[#nodes + 1] = node\n\t\tend)\n\n\t\tfor _, config in pairs(CONFIG) do\n\t\t\tif config.currentNodes and #config.currentNodes > 0 then\n\t\t\t\tif config.remarks and config.currentNodes[1].log ~= false then\n\t\t\t\t\tlog(1, i18n.translatef(\"Update [%s]\", config.remarks))\n\t\t\t\tend\n\t\t\t\tfor kk, vv in pairs(config.currentNodes) do\n\t\t\t\t\tselect_node(nodes, vv, config)\n\t\t\t\tend\n\t\t\t\tconfig.set(config)\n\t\t\t\tif not config.newNodes or #config.newNodes == 0 then\n\t\t\t\t\tlog(1, i18n.translatef(\"[%s]\", config.remarks) .. \" \" .. i18n.translate(\"Unable to find a new node. Please confirm and process manually.\"))\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tselect_node(nodes, config)\n\t\t\tend\n\t\tend\n\tend\n\n\tapi.uci_save(uci, appname, true)\n\n\tif arg[3] == \"cron\" then\n\t\tif not fs.access(\"/var/lock/\" .. appname .. \".lock\") then\n\t\t\tluci.sys.call(\"touch /tmp/lock/\" .. appname .. \"_cron.lock\")\n\t\tend\n\tend\n\n\tif manual ~= 1 then\n\t\tluci.sys.call(\"/etc/init.d/\" .. appname .. \" restart > /dev/null 2>&1 &\")\n\tend\nend\n\nlocal function parse_link(raw, add_mode, group, sub_cfg)\n\tif raw and #raw > 0 then\n\t\tlocal cfgid\n\t\tif sub_cfg then\n\t\t\tcfgid = sub_cfg[\".name\"]\n\t\tend\n\t\tlocal nodes, szType, clashTable\n\t\tlocal node_list = {}\n\t\t-- ssd appear to be in this format, starting with ssd://.\n\t\tif raw:find('ssd://') then\n\t\t\tszType = 'ssd'\n\t\t\tlocal nEnd = select(2, raw:find('ssd://'))\n\t\t\tnodes = base64Decode(raw:sub(nEnd + 1, #raw))\n\t\t\tnodes = jsonParse(nodes)\n\t\t\tlocal extra = {\n\t\t\t\tairport = nodes.airport,\n\t\t\t\tport = nodes.port,\n\t\t\t\tencryption = nodes.encryption,\n\t\t\t\tpassword = nodes.password\n\t\t\t}\n\t\t\tlocal servers = {}\n\t\t\t-- SS is wrapped inside, so let's just like this.\n\t\t\tfor _, server in ipairs(nodes.servers) do\n\t\t\t\ttinsert(servers, setmetatable(server, { __index = extra }))\n\t\t\tend\n\t\t\tnodes = servers\n\t\telse\n\t\t\t-- Try parseYAML, if success, is clash.\n\t\t\tlocal yamlTable = lyaml.load(raw)\n\t\t\tif yamlTable and type(yamlTable) == \"table\" then\n\t\t\t\t-- clash\n\t\t\t\tszType = \"clash\"\n\t\t\t\tclashTable = yamlTable\n\t\t\telse\n\t\t\t\t-- Formats other than ssd\n\t\t\t\tif add_mode == \"1\" then\n\t\t\t\t\tnodes = split(raw, \"\\n\")\n\t\t\t\telse\n\t\t\t\t\tnodes = split(base64Decode(raw):gsub(\"\\r\\n\", \"\\n\"), \"\\n\")\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tfunction nodeFilter(node)\n\t\t\tif node then\n\t\t\t\tif node.error_msg then\n\t\t\t\t\tlog(2, i18n.translatef(\"Discard node: %s, Reason:\", node.remarks) .. \" \" .. node.error_msg)\n\t\t\t\telseif not node.type then\n\t\t\t\t\tlog(2, i18n.translatef(\"Discard node: %s, Reason:\", node.remarks) .. \" \" .. i18n.translatef(\"No usable binary was found.\"))\n\t\t\t\telseif (add_mode == \"2\" and is_filter_keyword(sub_cfg, node.remarks)) or not node.address or node.remarks == \"NULL\" or node.address == \"127.0.0.1\" or\n\t\t\t\t\t\t(not datatypes.hostname(node.address) and not (api.is_ip(node.address))) then\n\t\t\t\t\tlog(2, i18n.translatef(\"Discard filter nodes: %s type node %s\", node.type, node.remarks))\n\t\t\t\telse\n\t\t\t\t\ttinsert(node_list, node)\n\t\t\t\tend\n\t\t\t\tif add_mode == \"2\" then\n\t\t\t\t\tget_subscribe_info(cfgid, node.remarks)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tif szType == \"clash\" and clashTable then\n\t\t\tnodes = {}\n\t\t\tlocal clashNodes = processClashData(clashTable, add_mode, group, sub_cfg)\n\t\t\tfor _, v in ipairs(clashNodes) do\n\t\t\t\tnodeFilter(v)\n\t\t\tend\n\t\tend\n\n\t\tfor _, v in ipairs(nodes) do\n\t\t\tif v and (szType == 'ssd' or not string.match(v, \"^%s*$\")) then\n\t\t\t\txpcall(function ()\n\t\t\t\t\tlocal result\n\t\t\t\t\tif szType == 'ssd' then\n\t\t\t\t\t\tresult = processData(szType, v, add_mode, group, sub_cfg)\n\t\t\t\t\telseif not szType then\n\t\t\t\t\t\tlocal node = api.trim(v)\n\t\t\t\t\t\tlocal dat = split(node, \"://\")\n\t\t\t\t\t\tif dat and dat[1] and dat[2] then\n\t\t\t\t\t\t\tif dat[1] == 'vmess' or dat[1] == 'ssr' then\n\t\t\t\t\t\t\t\tlocal link = api.trim(dat[2]:gsub(\"#.*$\", \"\"))\n\t\t\t\t\t\t\t\tresult = processData(dat[1], base64Decode(link), add_mode, group, sub_cfg)\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tlocal link = dat[2]:gsub(\"&amp;\", \"&\"):gsub(\"%s*#%s*\", \"#\")  -- Some odd links use \"&\" as \"&\", and include spaces before and after \"#\".\n\t\t\t\t\t\t\t\tresult = processData(dat[1], link, add_mode, group, sub_cfg)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\telse\n\t\t\t\t\t\tlog(2, i18n.translatef(\"Skip unknown types:\") .. \" \" .. szType)\n\t\t\t\t\tend\n\t\t\t\t\t-- log(2, result)\n\t\t\t\t\tnodeFilter(result)\n\t\t\t\tend, function (err)\n\t\t\t\t\t--log(2, err)\n\t\t\t\t\tlog(2, v, i18n.translatef(\"Parsing error, skip this node.\"))\n\t\t\t\tend\n\t\t\t)\n\t\t\tend\n\t\tend\n\t\tif #node_list > 0 then\n\t\t\tnodeResult[#nodeResult + 1] = {\n\t\t\t\tremark = group,\n\t\t\t\tlist = node_list,\n\t\t\t\tsub_cfg = sub_cfg\n\t\t\t}\n\t\tend\n\t\tlog(2, i18n.translatef(\"Successfully resolved the [%s] node, number: %s\", group, #node_list))\n\telse\n\t\tif add_mode == \"2\" then\n\t\t\tlog(2, i18n.translatef(\"Get subscription content for [%s] is empty. This may be due to an invalid subscription address or a network problem. Please diagnose the issue!\", group))\n\t\tend\n\tend\nend\n\nlocal execute = function()\n\tdo\n\t\tlocal subscribe_list = {}\n\t\tlocal fail_list = {}\n\t\tif arg[2] ~= \"all\" then\n\t\t\tstring.gsub(arg[2], '[^' .. \",\" .. ']+', function(w)\n\t\t\t\tsubscribe_list[#subscribe_list + 1] = uci:get_all(appname, w) or {}\n\t\t\tend)\n\t\telse\n\t\t\tuci:foreach(appname, \"subscribe_list\", function(o)\n\t\t\t\tsubscribe_list[#subscribe_list + 1] = o\n\t\t\tend)\n\t\tend\n\n\t\tlocal manual_sub = arg[3] == \"manual\"\n\n\t\tfor index, value in ipairs(subscribe_list) do\n\t\t\tlocal cfgid = value[\".name\"]\n\t\t\tlocal remark = value.remark or \"\"\n\t\t\tlocal url = value.url or \"\"\n\n\t\t\tlocal url_is_local\n\t\t\tif fs.access(url) then\n\t\t\t\t-- debug, reads local files.\n\t\t\t\tlog(1, i18n.translatef(\"Start subscribing: %s\", '【' .. remark .. '】' .. url))\n\t\t\t\turl_is_local = true\n\t\t\t\ttmp_file = url\n\t\t\telse\n\t\t\t\tlocal ua = value.user_agent\n\t\t\t\tlocal access_mode = value.access_mode\n\t\t\t\tlocal result = (not access_mode) and i18n.translatef(\"Auto\") or (access_mode == \"direct\" and i18n.translatef(\"Direct\") or (access_mode == \"proxy\" and i18n.translatef(\"Proxy\") or i18n.translatef(\"Auto\")))\n\t\t\t\tlog(1, i18n.translatef(\"Start subscribing: %s\", '【' .. remark .. '】' .. url .. ' [' .. result .. ']'))\n\t\t\t\ttmp_file = \"/tmp/\" .. cfgid\n\t\t\t\tlocal return_code\n\t\t\t\treturn_code, value.http_code = curl(url, tmp_file, ua, access_mode)\n\t\t\t\tif return_code ~= 0 then\n\t\t\t\t\tfail_list[#fail_list + 1] = value\n\t\t\t\t\tluci.sys.call(\"rm -f \" .. tmp_file)\n\t\t\t\tend\n\t\t\tend\n\t\t\tif fs.access(tmp_file) then\n\t\t\t\tif luci.sys.call(\"[ -f \" .. tmp_file .. \" ] && sed -i -e '/^[ \\t]*$/d' -e '/^[ \\t]*\\r$/d' \" .. tmp_file) == 0 then\n\t\t\t\t\tlocal f = io.open(tmp_file, \"r\")\n\t\t\t\t\tlocal stdout = f:read(\"*all\")\n\t\t\t\t\tf:close()\n\t\t\t\t\tlocal raw_data = api.trim(stdout)\n\t\t\t\t\tlocal old_md5 = value.md5 or \"\"\n\t\t\t\t\tlocal new_md5 = luci.sys.exec(\"md5sum \" .. tmp_file .. \" 2>/dev/null | awk '{print $1}'\"):gsub(\"\\n\", \"\")\n\t\t\t\t\tif not manual_sub and old_md5 == new_md5 then\n\t\t\t\t\t\tlog(1, i18n.translatef(\"Subscription: [%s] No changes, no update required.\", remark))\n\t\t\t\t\telse\n\t\t\t\t\t\tparse_link(raw_data, \"2\", remark, value)\n\t\t\t\t\t\tuci:set(appname, cfgid, \"md5\", new_md5)\n\t\t\t\t\tend\n\t\t\t\telse\n\t\t\t\t\tfail_list[#fail_list + 1] = value\n\t\t\t\tend\n\t\t\t\tif url_is_local then\n\t\t\t\t\tvalue.http_code = 0\n\t\t\t\telse\n\t\t\t\t\tluci.sys.call(\"rm -f \" .. tmp_file)\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tif #fail_list > 0 then\n\t\t\tfor index, value in ipairs(fail_list) do\n\t\t\t\tlog(1, i18n.translatef(\"[%s] Subscription failed. This could be due to an invalid subscription address or a network issue. Please diagnose the problem! [%s]\", value.remark, tostring(value.http_code)))\n\t\t\tend\n\t\tend\n\t\tupdate_node(0)\n\tend\nend\n\nlocal function check_instance(action)\n\tlocal sub_lock = \"/var/lock/\" .. appname .. \"_subscribe.lock\"\n\tlocal rule_lock = \"/var/lock/\" .. appname .. \"_rule_update.lock\"\n\n\tif action == \"start\" then\n\t\tmath.randomseed(os.time() + math.floor(os.clock() * 1000))\n\t\tapi.nixio.nanosleep(0, math.random(100, 1000) * 1000000)\n\t\tif fs.access(sub_lock) then\n\t\t\tlog(0, i18n.translatef(\"[Subscription] instance is running; please try again later.\") .. \"\\n\")\n\t\t\tos.exit(0)\n\t\telse\n\t\t\tluci.sys.call(\"touch \" .. sub_lock)\n\t\t\tuci:revert(appname)\n\t\tend\n\telseif action == \"end\" then\n\t\tluci.sys.call(\"rm -f \" .. sub_lock)\n\t\treturn\n\tend\n\n\tif fs.access(rule_lock) then\n\t\tlog(0, i18n.translatef(\"[Rule Update] instance is running; [Subscription] queue and wait.\") .. \"\\n\")\n\tend\n\twhile fs.access(rule_lock) do\n\t\tapi.nixio.nanosleep(2, 0)\n\tend\nend\n\nif arg[1] then\n\tcheck_instance(\"start\")\n\n\tif arg[1] == \"start\" then\n\t\tlog(0, i18n.translatef(\"Start subscribing...\"))\n\t\txpcall(execute, function(e)\n\t\t\tlog(1, e)\n\t\t\tlog(1, debug.traceback())\n\t\t\tlog(1, i18n.translatef(\"Error, restoring service.\"))\n\t\tend)\n\t\tlog(0, i18n.translatef(\"Subscription complete...\") .. \"\\n\")\n\telseif arg[1] == \"add\" then\n\t\tlocal f = assert(io.open(\"/tmp/links.conf\", 'r'))\n\t\tlocal raw = f:read('*all')\n\t\tf:close()\n\t\tparse_link(raw, \"1\", arg[2])\n\t\tupdate_node(1)\n\t\tluci.sys.call(\"rm -f /tmp/links.conf\")\n\telseif arg[1] == \"truncate\" then\n\t\ttruncate_nodes(arg[2])\n\tend\n\n\tcheck_instance(\"end\")\nend\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/passwall2/tasks.sh",
    "content": "#!/bin/sh\n## Loop update script\n\n. /usr/share/passwall2/utils.sh\nLOCK_FILE=${LOCK_PATH}/${CONFIG}_tasks.lock\n\nCFG_UPDATE_INT=0\n\nexec 99>\"$LOCK_FILE\"\nflock -n 99\nif [ \"$?\" != 0 ]; then\n\texit 0\nfi\n\nwhile true\ndo\n\n\tif [ \"$CFG_UPDATE_INT\" -ne 0 ]; then\n\n\t\tstop_week_mode=$(config_t_get global_delay stop_week_mode)\n\t\tstop_interval_mode=$(config_t_get global_delay stop_interval_mode)\n\t\tstop_interval_mode=$(expr \"$stop_interval_mode\" \\* 60)\n\t\tif [ -n \"$stop_week_mode\" ]; then\n\t\t\t[ \"$stop_week_mode\" = \"8\" ] && {\n\t\t\t\t[ \"$(expr \"$CFG_UPDATE_INT\" % \"$stop_interval_mode\")\" -eq 0 ] && /etc/init.d/$CONFIG stop > /dev/null 2>&1 &\n\t\t\t}\n\t\tfi\n\n\t\tstart_week_mode=$(config_t_get global_delay start_week_mode)\n\t\tstart_interval_mode=$(config_t_get global_delay start_interval_mode)\n\t\tstart_interval_mode=$(expr \"$start_interval_mode\" \\* 60)\n\t\tif [ -n \"$start_week_mode\" ]; then\n\t\t\t[ \"$start_week_mode\" = \"8\" ] && {\n\t\t\t\t[ \"$(expr \"$CFG_UPDATE_INT\" % \"$start_interval_mode\")\" -eq 0 ] && /etc/init.d/$CONFIG start > /dev/null 2>&1 &\n\t\t\t}\n\t\tfi\n\n\t\trestart_week_mode=$(config_t_get global_delay restart_week_mode)\n\t\trestart_interval_mode=$(config_t_get global_delay restart_interval_mode)\n\t\trestart_interval_mode=$(expr \"$restart_interval_mode\" \\* 60)\n\t\tif [ -n \"$restart_week_mode\" ]; then\n\t\t\t[ \"$restart_week_mode\" = \"8\" ] && {\n\t\t\t\t[ \"$(expr \"$CFG_UPDATE_INT\" % \"$restart_interval_mode\")\" -eq 0 ] && /etc/init.d/$CONFIG restart > /dev/null 2>&1 &\n\t\t\t}\n\t\tfi\n\n\t\tautoupdate=$(config_t_get global_rules auto_update)\n\t\tweekupdate=$(config_t_get global_rules week_update)\n\t\thourupdate=$(config_t_get global_rules interval_update)\n\t\thourupdate=$(expr \"$hourupdate\" \\* 60)\n\t\tif [ \"$autoupdate\" = \"1\" ]; then\n\t\t\t[ \"$weekupdate\" = \"8\" ] && {\n\t\t\t\t[ \"$(expr \"$CFG_UPDATE_INT\" % \"$hourupdate\")\" -eq 0 ] && lua $APP_PATH/rule_update.lua log all cron > /dev/null 2>&1 &\n\t\t\t}\n\t\tfi\n\n\t\tTMP_SUB_PATH=$TMP_PATH/sub_tasks\n\t\tmkdir -p $TMP_SUB_PATH\n\t\tfor item in $(uci show ${CONFIG} | grep \"=subscribe_list\" | cut -d '.' -sf 2 | cut -d '=' -sf 1); do\n\t\t\tif [ \"$(config_n_get $item auto_update 0)\" = \"1\" ]; then\n\t\t\t\tcfgid=$(uci show ${CONFIG}.$item | head -n 1 | cut -d '.' -sf 2 | cut -d '=' -sf 1)\n\t\t\t\tremark=$(config_n_get $item remark)\n\t\t\t\tweek_update=$(config_n_get $item week_update)\n\t\t\t\thour_update=$(config_n_get $item interval_update)\n\t\t\t\techo \"$cfgid\" >> $TMP_SUB_PATH/${week_update}_${hour_update}\n\t\t\tfi\n\t\tdone\n\n\t\t[ -d \"${TMP_SUB_PATH}\" ] && {\n\t\t\tfor name in $(ls ${TMP_SUB_PATH}); do\n\t\t\t\tweek_update=$(echo $name | awk -F '_' '{print $1}')\n\t\t\t\thour_update=$(echo $name | awk -F '_' '{print $2}')\n\t\t\t\thour_update=$(expr \"$hour_update\" \\* 60)\n\t\t\t\tcfgids=$(echo -n $(cat ${TMP_SUB_PATH}/${name}) | sed 's# #,#g')\n\t\t\t\t[ \"$week_update\" = \"8\" ] && {\n\t\t\t\t\t[ \"$(expr \"$CFG_UPDATE_INT\" % \"$hour_update\")\" -eq 0 ] && lua $APP_PATH/subscribe.lua start $cfgids cron > /dev/null 2>&1 &\n\t\t\t\t}\n\n\t\t\tdone\n\t\t\trm -rf $TMP_SUB_PATH\n\t\t}\n\n\tfi\n\n\tCFG_UPDATE_INT=$(expr \"$CFG_UPDATE_INT\" + 10)\n\n\tsleep 600\n\ndone 2>/dev/null\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/passwall2/test.sh",
    "content": "#!/bin/sh\n\n. /usr/share/passwall2/utils.sh\n\ntest_url() {\n\tlocal url=$1\n\tlocal try=1\n\t[ -n \"$2\" ] && try=$2\n\tlocal timeout=2\n\t[ -n \"$3\" ] && timeout=$3\n\tlocal extra_params=$4\n\tcurl --help all | grep \"\\-\\-retry-all-errors\" > /dev/null\n\t[ $? == 0 ] && extra_params=\"--retry-all-errors ${extra_params}\"\n\tstatus=$(/usr/bin/curl -I -o /dev/null -skL $extra_params --connect-timeout ${timeout} --retry ${try} -w %{http_code} \"$url\")\n\tcase \"$status\" in\n\t\t204|\\\n\t\t200)\n\t\t\tstatus=200\n\t\t;;\n\tesac\n\techo $status\n}\n\ntest_proxy() {\n\tresult=0\n\tstatus=$(test_url \"https://www.google.com/generate_204\" ${retry_num} ${connect_timeout})\n\tif [ \"$status\" = \"200\" ]; then\n\t\tresult=0\n\telse\n\t\tstatus2=$(test_url \"https://www.baidu.com\" ${retry_num} ${connect_timeout})\n\t\tif [ \"$status2\" = \"200\" ]; then\n\t\t\tresult=1\n\t\telse\n\t\t\tresult=2\n\t\t\tping -c 3 -W 1 223.5.5.5 > /dev/null 2>&1\n\t\t\t[ $? -eq 0 ] && {\n\t\t\t\tresult=1\n\t\t\t}\n\t\tfi\n\tfi\n\techo $result\n}\n\nurl_test_node() {\n\tresult=0\n\tlocal node_id=$1\n\tlocal _type=$(echo $(config_n_get ${node_id} type) | tr 'A-Z' 'a-z')\n\t[ -n \"${_type}\" ] && {\n\t\tlocal _tmp_port=$(get_new_port 48900 tcp,udp)\n\t\tNO_REC_PROCESS=1 /usr/share/${CONFIG}/app.sh run_socks flag=\"url_test_${node_id}\" node=${node_id} bind=127.0.0.1 socks_port=${_tmp_port} config_file=url_test_${node_id}.json\n\t\tsleep 2s\n\t\tlocal curlx=\"socks5h://127.0.0.1:${_tmp_port}\"\n\t\tlocal url=$(config_t_get global_other url_test_url https://www.google.com/generate_204)\n\t\tresult=$(curl --connect-timeout 3 -o /dev/null -I -skL -w \"%{http_code}:%{time_starttransfer}\" -x $curlx \"${url}\")\n\t\tpgrep -af \"url_test_${node_id}\" | awk '! /test\\.sh/{print $1}' | xargs kill -9 >/dev/null 2>&1\n\t\trm -rf /tmp/etc/${CONFIG}/*url_test_${node_id}*.json\n\t}\n\techo $result\n}\n\narg1=$1\nshift\ncase $arg1 in\ntest_url)\n\ttest_url $@\n\t;;\nurl_test_node)\n\turl_test_node $@\n\t;;\nesac\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/passwall2/utils.sh",
    "content": "#!/bin/sh\n# Copyright (C) 2022-2025 xiaorouji\n# Copyright (C) 2026 Openwrt-Passwall Organization\n\nCONFIG=passwall2\nAPP_PATH=/usr/share/${CONFIG}\nTMP_PATH=/tmp/etc/${CONFIG}\nTMP_PATH2=${TMP_PATH}_tmp\nLOCK_PATH=/tmp/lock\nLOG_FILE=/tmp/log/${CONFIG}.log\nTMP_ACL_PATH=${TMP_PATH}/acl\nTMP_BIN_PATH=${TMP_PATH}/bin\nTMP_IFACE_PATH=${TMP_PATH}/iface\nTMP_ROUTE_PATH=${TMP_PATH}/route\nTMP_SCRIPT_FUNC_PATH=${TMP_PATH}/script_func\nTMP_PROCESS_LIST_PATH=${TMP_PATH}/process_list\n\n. /lib/functions/network.sh\n\nconfig_get_type() {\n\tlocal ret=$(uci -q get \"${CONFIG}.${1}\" 2>/dev/null)\n\techo \"${ret:=$2}\"\n}\n\nconfig_n_get() {\n\tlocal ret=$(uci -q get \"${CONFIG}.${1}.${2}\" 2>/dev/null)\n\techo \"${ret:=$3}\"\n}\n\nconfig_t_get() {\n\tlocal index=${4:-0}\n\tlocal ret=$(uci -q get \"${CONFIG}.@${1}[${index}].${2}\" 2>/dev/null)\n\techo \"${ret:=${3}}\"\n}\n\nconfig_t_set() {\n\tlocal index=${4:-0}\n\tlocal ret=$(uci -q set \"${CONFIG}.@${1}[${index}].${2}=${3}\" 2>/dev/null)\n}\n\neval_set_val() {\n\tfor i in $@; do\n\t\tfor j in $i; do\n\t\t\teval $j\n\t\tdone\n\tdone\n}\n\neval_unset_val() {\n\tfor i in $@; do\n\t\tfor j in $i; do\n\t\t\teval unset $j\n\t\tdone\n\tdone\n}\n\neval_cache_var() {\n\t[ -s \"$TMP_PATH/var\" ] && eval $(cat \"$TMP_PATH/var\")\n}\n\nget_cache_var() {\n\tlocal key=\"${1}\"\n\t[ -n \"${key}\" ] && [ -s \"$TMP_PATH/var\" ] && {\n\t\techo $(cat $TMP_PATH/var | grep \"^${key}=\" | awk -F '=' '{print $2}' | tail -n 1 | awk -F'\"' '{print $2}')\n\t}\n}\n\nset_cache_var() {\n\tlocal key=\"${1}\"\n\tshift 1\n\tlocal val=\"$@\"\n\t[ -n \"${key}\" ] && [ -n \"${val}\" ] && {\n\t\t[ ! -d $TMP_PATH ] && mkdir -p $TMP_PATH\n\t\tsed -i \"/${key}=/d\" $TMP_PATH/var >/dev/null 2>&1\n\t\techo \"${key}=\\\"${val}\\\"\" >> $TMP_PATH/var\n\t\teval ${key}=\\\"${val}\\\"\n\t}\n}\n\necholog() {\n\techo -e \"$*\" >>$LOG_FILE\n}\n\necholog_date() {\n\tlocal d=\"$(date \"+%Y-%m-%d %H:%M:%S\")\"\n\techolog \"$d: $*\"\n}\n\ni18n() {\n\techo \"$(lua ${APP_PATH}/i18n.lua \"$@\")\"\n}\n\nlog() {\n\tlocal num=\"$1\"\n\tshift\n\tlocal content=\"$@\"\n\tlocal indent=\"\"\n\tif [ \"$num\" -ge 1 ]; then\n\t\tfor i in $(seq 1 ${num}); do\n\t\t\tindent=\"${indent}  \"\n\t\tdone\n\t\techolog_date \"${indent}- ${content}\"\n\telse\n\t\techolog_date \"${content}\"\n\tfi\n}\n\nlog_i18n() {\n\tlocal num=\"$1\"\n\tshift\n\tlog ${num} \"$(i18n \"$@\")\"\n}\n\nclean_log() {\n\tlogsnum=$(cat $LOG_FILE 2>/dev/null | wc -l)\n\t[ \"$logsnum\" -gt 1000 ] && {\n\t\techo \"\" > $LOG_FILE\n\t\tlog_i18n 0 \"Log file is too long, clear it!\"\n\t}\n}\n\nlua_api() {\n\tlocal func=${1}\n\t[ -z \"${func}\" ] && {\n\t\techo \"\"\n\t\treturn\n\t}\n\techo $(lua -e \"local api = require 'luci.passwall2.api' print(api.${func})\")\n}\n\ncheck_host() {\n\tlocal f=${1}\n\ta=$(echo $f | grep \"\\/\")\n\t[ -n \"$a\" ] && return 1\n\t# Determine if it contains Chinese characters.\n\tlocal tmp=$(echo -n $f | awk '{print gensub(/[!-~]/,\"\",\"g\",$0)}')\n\t[ -n \"$tmp\" ] && return 1\n\treturn 0\n}\n\nfirst_type() {\n\t[ \"${1#/}\" != \"$1\" ] && [ -x \"$1\" ] && echo \"$1\" && return\n\tfor p in \"/bin/$1\" \"/usr/bin/$1\" \"${TMP_BIN_PATH:-/tmp}/$1\"; do\n\t\t[ -x \"$p\" ] && echo \"$p\" && return\n\tdone\n\tcommand -v \"$1\" 2>/dev/null || command -v \"$2\" 2>/dev/null\n}\n\nget_enabled_anonymous_secs() {\n\tuci -q show \"${CONFIG}\" | grep \"${1}\\[.*\\.enabled='1'\" | cut -d '.' -sf2\n}\n\nget_geoip() {\n\tlocal geo_output_path=\"$TMP_PATH2/geo_output\"\n\tmkdir -p ${geo_output_path}\n\tlocal geoip_code=\"$1\"\n\tlocal geoip_type_flag=\"\"\n\tlocal output_path=\"${geo_output_path}/geoip-${geoip_code}-$2\"\n\t[ ! -s \"${output_path}\" ] && {\n\t\tlocal geoip_path=\"$(config_t_get global_rules v2ray_location_asset)\"\n\t\tgeoip_path=\"${geoip_path%*/}/geoip.dat\"\n\t\tlocal bin=\"$(first_type $(config_t_get global_app geoview_file) geoview)\"\n\t\t[ -n \"$bin\" ] && [ -s \"$geoip_path\" ] || { echo \"\"; return; }\n\t\tcase \"$2\" in\n\t\t\t\"ipv4\") geoip_type_flag=\"-ipv6=false\" ;;\n\t\t\t\"ipv6\") geoip_type_flag=\"-ipv4=false\" ;;\n\t\tesac\n\t\t\"$bin\" -input \"$geoip_path\" -list \"$geoip_code\" $geoip_type_flag -lowmem=true -output ${output_path}\n\t}\n\t[ -s \"${output_path}\" ] && cat \"${output_path}\"\n}\n\nget_host_ip() {\n\tlocal host=$2\n\tlocal count=$3\n\t[ -z \"$count\" ] && count=3\n\tlocal isip=\"\"\n\tlocal ip=\"\"\n\tif [ \"$1\" == \"ipv6\" ]; then\n\t\tisip=$(echo $host | grep -E \"([A-Fa-f0-9]{1,4}::?){1,7}[A-Fa-f0-9]{1,4}\")\n\t\tif [ -n \"$isip\" ]; then\n\t\t\tip=$(echo \"$host\" | tr -d '[]')\n\t\tfi\n\telse\n\t\tisip=$(echo $host | grep -E \"([0-9]{1,3}[\\.]){3}[0-9]{1,3}\")\n\t\t[ -n \"$isip\" ] && ip=$isip\n\tfi\n\t[ -z \"$isip\" ] && {\n\t\tlocal t=4\n\t\t[ \"$1\" == \"ipv6\" ] && t=6\n\t\tlocal vpsrip=$(resolveip -$t -t $count $host | awk 'NR==1{print}')\n\t\tip=$vpsrip\n\t}\n\t[ -n \"$ip\" ] && echo \"$ip\"\n}\n\nget_node_host_ip() {\n\tlocal ip\n\tlocal address=$(config_n_get $1 address)\n\t[ -n \"$address\" ] && {\n\t\tlocal use_ipv6=$(config_n_get $1 use_ipv6)\n\t\tlocal network_type=\"ipv4\"\n\t\t[ \"$use_ipv6\" == \"1\" ] && network_type=\"ipv6\"\n\t\tip=$(get_host_ip $network_type $address)\n\t}\n\techo $ip\n}\n\nget_ip_port_from() {\n\tlocal __host=${1}; shift 1\n\tlocal __ipv=${1}; shift 1\n\tlocal __portv=${1}; shift 1\n\tlocal __ucipriority=${1}; shift 1\n\n\tlocal val1 val2\n\tif [ -n \"${__ucipriority}\" ]; then\n\t\tval2=$(config_n_get ${__host} port $(echo $__host | sed -n 's/^.*[:#]\\([0-9]*\\)$/\\1/p'))\n\t\tval1=$(config_n_get ${__host} address \"${__host%%${val2:+[:#]${val2}*}}\")\n\telse\n\t\tval2=$(echo $__host | sed -n 's/^.*[:#]\\([0-9]*\\)$/\\1/p')\n\t\tval1=\"${__host%%${val2:+[:#]${val2}*}}\"\n\tfi\n\teval \"${__ipv}=\\\"$val1\\\"; ${__portv}=\\\"$val2\\\"\"\n}\n\nhost_from_url(){\n\tlocal f=${1}\n\n\t## Remove protocol part of url  ##\n\tf=\"${f##http://}\"\n\tf=\"${f##https://}\"\n\tf=\"${f##ftp://}\"\n\tf=\"${f##sftp://}\"\n\n\t## Remove username and/or username:password part of URL  ##\n\tf=\"${f##*:*@}\"\n\tf=\"${f##*@}\"\n\n\t## Remove rest of urls ##\n\tf=\"${f%%/*}\"\n\techo \"${f%%:*}\"\n}\n\nhosts_foreach() {\n\tlocal __hosts\n\teval \"__hosts=\\$${1}\"; shift 1\n\tlocal __func=${1}; shift 1\n\tlocal __default_port=${1}; shift 1\n\tlocal __ret=1\n\n\t[ -z \"${__hosts}\" ] && return 0\n\tlocal __ip __port\n\tfor __host in $(echo $__hosts | sed 's/[ ,]/\\n/g'); do\n\t\tget_ip_port_from \"$__host\" \"__ip\" \"__port\"\n\t\teval \"$__func \\\"${__host}\\\" \\\"\\${__ip}\\\" \\\"\\${__port:-${__default_port}}\\\" \\\"$@\\\"\"\n\t\t__ret=$?\n\t\t[ ${__ret} -ge ${ERROR_NO_CATCH:-1} ] && return ${__ret}\n\tdone\n}\n\nget_first_dns() {\n\tlocal __hosts_val=${1}; shift 1\n\t__first() {\n\t\t[ -z \"${2}\" ] && return 0\n\t\techo \"${2}#${3}\"\n\t\treturn 1\n\t}\n\teval \"hosts_foreach \\\"${__hosts_val}\\\" __first \\\"$@\\\"\"\n}\n\nget_last_dns() {\n\tlocal __hosts_val=${1}; shift 1\n\tlocal __first __last\n\t__every() {\n\t\t[ -z \"${2}\" ] && return 0\n\t\t__last=\"${2}#${3}\"\n\t\t__first=${__first:-${__last}}\n\t}\n\teval \"hosts_foreach \\\"${__hosts_val}\\\" __every \\\"$@\\\"\"\n\t[ \"${__first}\" ==  \"${__last}\" ] || echo \"${__last}\"\n}\n\ncheck_port_exists() {\n\tlocal port=$1\n\tlocal protocol=$2\n\t[ -n \"$protocol\" ] || protocol=\"tcp,udp\"\n\tlocal result=\n\tif [ \"$protocol\" = \"tcp\" ]; then\n\t\tresult=$(netstat -tln | grep -c \":$port \")\n\telif [ \"$protocol\" = \"udp\" ]; then\n\t\tresult=$(netstat -uln | grep -c \":$port \")\n\telif [ \"$protocol\" = \"tcp,udp\" ]; then\n\t\tresult=$(netstat -tuln | grep -c \":$port \")\n\tfi\n\techo \"${result}\"\n}\n\nget_new_port() {\n\tlocal default_start_port=2001\n\tlocal min_port=1025\n\tlocal max_port=49151\n\tlocal port=$1\n\tlocal last_get_new_port_auto\n\tif [ \"$1\" == \"auto\" ]; then\n\t\tlast_get_new_port_auto=$(get_cache_var \"last_get_new_port_auto\")\n\t\tif [ -n \"$last_get_new_port_auto\" ]; then\n\t\t\tport=$last_get_new_port_auto\n\t\t\tport=$(expr $port + 1)\n\t\telse\n\t\t\tport=$default_start_port\n\t\tfi\n\tfi\n\t[ \"$port\" -lt $min_port -o \"$port\" -gt $max_port ] && port=$default_start_port\n\tlocal protocol=$(echo $2 | tr 'A-Z' 'a-z')\n\tlocal result=$(check_port_exists $port $protocol)\n\tif [ \"$result\" != 0 ]; then\n\t\tlocal temp=\n\t\tif [ \"$port\" -lt $max_port ]; then\n\t\t\ttemp=$(expr $port + 1)\n\t\telif [ \"$port\" -gt $min_port ]; then\n\t\t\ttemp=$(expr $port - 1)\n\t\telse\n\t\t\ttemp=$default_start_port\n\t\tfi\n\t\tget_new_port $temp $protocol\n\telse\n\t\t[ \"$1\" == \"auto\" ] && set_cache_var \"last_get_new_port_auto\" \"$port\"\n\t\techo $port\n\tfi\n}\n\nhas_1_65535() {\n\tlocal val=\"$1\"\n\tval=${val//:/-}\n\tcase \",$val,\" in\n\t\t*,1-65535,*) return 0 ;;\n\t\t*) return 1 ;;\n\tesac\n}\n\nadd_ip2route() {\n\tlocal ip=$(get_host_ip \"ipv4\" $1)\n\t[ -z \"$ip\" ] && {\n\t\tlog 1 \"$(i18n \"Unable to resolve [%s], route table addition failed!\" \"${1}\")\"\n\t\treturn 1\n\t}\n\tlocal remarks=\"${1}\"\n\t[ \"$remarks\" != \"$ip\" ] && remarks=\"${1}(${ip})\"\n\n\tlocal gateway device\n\tnetwork_get_gateway gateway \"$2\"\n\tnetwork_get_device device \"$2\"\n\t[ -z \"${device}\" ] && device=$(ubus call \"network.interface.$2\" status 2>/dev/null | jsonfilter -e '@.device' 2>/dev/null)\n\t[ -z \"${device}\" ] && [ -d \"/sys/class/net/$2\" ] && device=\"$2\"\n\t[ -z \"${device}\" ] && device=\"$2\"\n\n\tif [ -n \"${gateway}\" ]; then\n\t\troute add -host ${ip} gw ${gateway} dev ${device} >/dev/null 2>&1\n\t\techo \"$ip\" >> $TMP_ROUTE_PATH/${device}\n\t\tlog 1 \"$(i18n \"[%s] was successfully added to the routing table of interface [%s]!\" \"${remarks}\" \"${device}\")\"\n\telse\n\t\tlog 1 \"$(i18n \"Adding [%s] to the [%s] routing table failed! The reason is that the [%s] gateway cannot be found.\" \"${remarks}\" \"${device}\" \"${device}\")\"\n\tfi\n}\n\ndelete_ip2route() {\n\t[ -d \"${TMP_ROUTE_PATH}\" ] && {\n\t\tfor interface in $(ls ${TMP_ROUTE_PATH}); do\n\t\t\tfor ip in $(cat ${TMP_ROUTE_PATH}/${interface}); do\n\t\t\t\troute del -host ${ip} dev ${interface} >/dev/null 2>&1\n\t\t\tdone\n\t\tdone\n\t}\n}\n\nln_run() {\n\tlocal queue_run=${1}\n\tlocal file_func=${2}\n\tlocal ln_name=${3}\n\tlocal output=${4}\n\tshift 4;\n\n\tif [  \"${file_func%%/*}\" != \"${file_func}\" ]; then\n\t\t[ ! -L \"${file_func}\" ] && {\n\t\t\tln -s \"${file_func}\" \"${TMP_BIN_PATH}/${ln_name}\" >/dev/null 2>&1\n\t\t\tfile_func=\"${TMP_BIN_PATH}/${ln_name}\"\n\t\t}\n\t\t[ -x \"${file_func}\" ] || log 1 \"$(i18n \"%s does not have execute permissions and cannot be started: %s %s\" \"$(readlink ${file_func})\" \"${file_func}\" \"$*\")\"\n\tfi\n\t#echo \"${file_func} $*\" >&2\n\t[ -n \"${file_func}\" ] || log 1 \"$(i18n \"%s not found, unable to start...\" \"${ln_name}\")\"\n\n\t[ \"${queue_run}\" == \"1\" ] && {\n\t\tmkdir -p $TMP_PROCESS_LIST_PATH\n\t\tprocess_count=$(ls $TMP_PROCESS_LIST_PATH | grep -v \"^_\" | wc -l)\n\t\tprocess_count=$((process_count + 1))\n\t\techo \"${file_func:-log 1 \"${ln_name}\"} $@ >${output}\" > $TMP_PROCESS_LIST_PATH/$process_count\n\t\treturn\n\t}\n\n\t${file_func:-log 1 \"${ln_name}\"} \"$@\" >${output} 2>&1 &\n\n\t[ -n \"$NO_REC_PROCESS\" ] && return\n\n\tprocess_count=$(ls $TMP_SCRIPT_FUNC_PATH | grep -v \"^_\" | wc -l)\n\tprocess_count=$((process_count + 1))\n\techo \"${file_func:-log 1 \"${ln_name}\"} $@ >${output}\" > $TMP_SCRIPT_FUNC_PATH/$process_count\n}\n\nrun_process_queue() {\n\t[ -d ${TMP_PROCESS_LIST_PATH} ] && {\n\t\tfor filename in $(ls ${TMP_PROCESS_LIST_PATH}); do\n\t\t\tcmd=$(cat ${TMP_PROCESS_LIST_PATH}/${filename})\n\t\t\tcmd_check=$(echo $cmd | awk -F '>' '{print $1}')\n\t\t\ticount=$(pgrep -f \"$(echo $cmd_check)\" | wc -l)\n\t\t\tif [ $icount = 0 ]; then\n\t\t\t\teval $(echo \"nohup ${cmd} 2>&1 &\") >/dev/null 2>&1 &\n\t\t\tfi\n\t\t\trm -rf ${TMP_PROCESS_LIST_PATH}/${filename}\n\t\tdone\n\t}\n\trm -rf ${TMP_PROCESS_LIST_PATH}\n}\n\nkill_all() {\n\tkill -9 $(pidof \"$@\") >/dev/null 2>&1\n}\n\ngen_lanlist() {\n\tcat <<-EOF\n\t\t0.0.0.0/8\n\t\t10.0.0.0/8\n\t\t100.64.0.0/10\n\t\t127.0.0.0/8\n\t\t169.254.0.0/16\n\t\t172.16.0.0/12\n\t\t192.168.0.0/16\n\t\t224.0.0.0/4\n\t\t240.0.0.0/4\n\tEOF\n}\n\ngen_lanlist_6() {\n\tcat <<-EOF\n\t\t::/128\n\t\t::1/128\n\t\t::ffff:0:0/96\n\t\t::ffff:0:0:0/96\n\t\t64:ff9b::/96\n\t\t100::/64\n\t\t2001::/32\n\t\t2001:20::/28\n\t\t2001:db8::/32\n\t\t2002::/16\n\t\tfc00::/7\n\t\tfe80::/10\n\t\tff00::/8\n\tEOF\n}\n\nget_wan_ips() {\n\tlocal family=\"$1\"\n\tlocal NET_ADDR\n\tlocal iface\n\tlocal INTERFACES=$(ubus call network.interface dump | jsonfilter -e \\\n\t\t\t'@.interface[!(@.interface ~ /lan/) && !(@.l3_device ~ /\\./) && @.route[0]].interface')\n\tfor iface in $INTERFACES; do\n\t\tlocal addr\n\t\tif [ \"$family\" = \"ip6\" ]; then\n\t\t\tnetwork_get_ipaddr6 addr \"$iface\"\n\t\t\tcase \"$addr\" in\n\t\t\t\t\"\"|fe80*) continue ;;\n\t\t\tesac\n\t\telse\n\t\t\tnetwork_get_ipaddr addr \"$iface\"\n\t\t\tcase \"$addr\" in\n\t\t\t\t\"\"|\"0.0.0.0\") continue ;;\n\t\t\tesac\n\t\tfi\n\t\tcase \" $NET_ADDR \" in\n\t\t\t*\" $addr \"*) ;;\n\t\t\t*) NET_ADDR=\"${NET_ADDR:+$NET_ADDR }$addr\" ;;\n\t\tesac\n\tdone\n\techo \"$NET_ADDR\"\n}\n\nget_local_ips() {\n\tlocal family=\"$1\"\n\tlocal ALL_IPS WAN_IPS ip NET_ADDR\n\tif [ \"$family\" = \"ip6\" ]; then\n\t\tALL_IPS=$(ip -o -6 addr show scope global | awk '{print $4}' | cut -d/ -f1)\n\t\tWAN_IPS=$(get_wan_ips ip6)\n\telse\n\t\tALL_IPS=$(ip -o -4 addr show scope global | awk '{print $4}' | cut -d/ -f1)\n\t\tWAN_IPS=$(get_wan_ips ip4)\n\tfi\n\t# Supplementary loop (not included in scope global)\n\t[ \"$family\" = \"ip6\" ] && ALL_IPS=\"$ALL_IPS ::1\"\n\t[ \"$family\" != \"ip6\" ] && ALL_IPS=\"$ALL_IPS 127.0.0.1\"\n\tfor ip in $ALL_IPS; do\n\t\tcase \"$ip\" in\n\t\t\t\"\"|0.0.0.0|::) continue ;;\n\t\tesac\n\t\tcase \" $WAN_IPS \" in\n\t\t\t*\" $ip \"*) continue ;;\n\t\tesac\n\t\tcase \" $NET_ADDR \" in\n\t\t\t*\" $ip \"*) ;;\n\t\t\t*) NET_ADDR=\"${NET_ADDR:+$NET_ADDR }$ip\" ;;\n\t\tesac\n\tdone\n\tfor ip in $NET_ADDR; do\n\t\techo \"$ip\"\n\tdone\n}\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/rpcd/acl.d/luci-app-passwall2.json",
    "content": "{\n\t\"luci-app-passwall2\": {\n\t\t\"description\": \"Grant UCI access for luci-app-passwall2\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"passwall2\", \"passwall2_server\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"passwall2\", \"passwall2_server\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2-server.json",
    "content": "{\n\t\"config\": \"passwall2_server\",\n\t\"init\": \"passwall2_server\"\n}\n"
  },
  {
    "path": "luci-app-passwall2/root/usr/share/ucitrack/luci-app-passwall2.json",
    "content": "{\n\t\"config\": \"passwall2\",\n\t\"init\": \"passwall2\"\n}\n"
  },
  {
    "path": "luci-app-poweroffdevice/luci-app-poweroffdevice/Makefile",
    "content": "#\n# provides Web UI to shut down (power off) your device. \n# Copyright (C) 2022-2026 sirpdboy <herboy2008@gmail.com>\n# This is free software, licensed under the GNU General Public License v3.\n\ninclude $(TOPDIR)/rules.mk\n\nNAME:=poweroffdevice\nPKG_NAME:=luci-app-$(NAME)\nLUCI_TITLE:=LuCI support for poweroffdevice Router\nLUCI_DESCRIPTION:=provides Web UI to shut down (power off) your device. \n\nLUCI_PKGARCH:=all\nPKG_VERSION:=2\nPKG_RELEASE:=7\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-poweroffdevice/luci-app-poweroffdevice/htdocs/luci-static/resources/view/system/poweroffdevice.js",
    "content": "'use strict';\n'require view';\n'require ui';\n'require fs';\n\nreturn view.extend({\n    render: function() {\n        return E([\n            E('div', { class: 'cbi-section' }, [\n                E('h2', { class: 'cbi-section-title' }, _('PowerOff')),\n                E('div', { class: 'cbi-section-descr' }, _('Turn off the power to the device you are using')),\n                E('hr', { style: 'margin: 15px 0' }),\n                E('div', { style: ' padding: 20px 0' }, [\n                    E('button', {\n                        class: 'btn cbi-button cbi-button-negative important',\n                        style: 'padding: 0.5rem 1rem;font-size: 1.2em;font-weight: bold;border-radius: 4px;box-shadow: 0 2px 5px rgba(0,0,0,0.2);',\n                        click: ui.createHandlerFn(this, 'handlePowerOff')\n                    }, _('⚠️ Perform Power Off'))\n                ])\n            ])\n        ]);\n    },\n\n    handlePowerOff: function() {\n        return ui.showModal(_('⚠️ PowerOff Device'), \n            E('div', { style: 'min-width: 350px' }, [\n                E('div', { class: 'alert-message warning', style: 'margin: 0 0 15px 0; padding: 10px;  background: #f0ad4e' }, [\n                    E('h4', { style: 'margin: 0 0 5px 0; ' }, _('Warning!')),\n                    E('p', { style: 'margin: 0; ' }, _('This action will immediately turn off the power to your device. Make sure to save all your work before proceeding.'))\n                ]),\n\n                E('div', { style: ' border-radius: 4px; padding: 15px; margin-bottom: 15px' }, [\n                    E('p', { style: 'margin: 0 0 10px 0; font-weight: bold' }, _('Before you continue:')),\n                    E('ul', { style: 'margin: 0; padding-left: 20px' }, [\n                        E('li', { style: 'margin-bottom: 5px' }, _('Save all unsaved settings')),\n                        E('li', { style: 'margin-bottom: 5px' }, _('Check if other users are active')),\n                        E('li', _('The device needs to be manually turned on'))\n                    ])\n                ]),\n\n                E('div', { class: 'right', style: 'margin-top: 20px; padding-top: 15px; border-top: 1px solid #ddd' }, [\n                    E('button', {\n                        'class': 'btn cbi-button cbi-button-apply',\n                        'style': 'margin-right: 10px; ',\n                        'click': ui.hideModal\n                    }, _('Cancel')),\n                    E('button', {\n                        'class': 'btn cbi-button cbi-button-negative',\n                        'style': ' font-weight: bold;',\n                        'click': ui.createHandlerFn(this, function() {\n                            ui.hideModal();\n                            \n                            // Show powering off modal\n                            ui.showModal(_('Powering Off'), \n                                E('div', { style: 'text-align: center; padding: 30px; min-width: 300px' }, [\n                                    E('div', { \n                                        class: 'spinning', \n                                        style: 'font-size: 48px; margin-bottom: 20px; color: #f0ad4e;' \n                                    }, '⚡'),\n                                    E('h3', { style: 'margin: 0 0 15px 0' }, _('Powering off device...')),\n                                    E('p', { style: 'color: #666; margin: 0' }, \n                                        _('The device should power off within a few seconds. If the device remains on, you may need to perform a manual shutdown.'))\n                                ])\n                            );\n\n                            // Execute poweroff command\n                            return fs.exec('/sbin/poweroff').catch(function(e) {\n                                ui.hideModal();\n                                ui.addNotification(null, \n                                    E('div', { style: 'padding: 10px' }, [\n                                        E('h4', { style: 'color: #d9534f; margin: 0 0 5px 0' }, _('Error!')),\n                                        E('p', { style: 'margin: 0' }, e.message)\n                                    ])\n                                );\n                            });\n                        })\n                    }, _('Confirm Power Off'))\n                ])\n            ])\n        );\n    },\n\n    handleSaveApply: null,\n    handleSave: null,\n    handleReset: null\n});"
  },
  {
    "path": "luci-app-poweroffdevice/luci-app-poweroffdevice/po/zh_Hans/poweroffdevice.po",
    "content": "# \n# provides Web UI to shut down (power off) your device. \n# routers are listed at https://github.com/sirpdboy/luci-app-poweroffdevice\n# This is free software, licensed under the GNU General Public License v3.\n\nmsgid \"PowerOff\"\nmsgstr \"关机\"\n\nmsgid \"⚠️ PowerOff Device\"\nmsgstr \"⚠️ 设备关机\"\n\nmsgid \"⚠️ Perform Power Off\"\nmsgstr \"⚠️ 执行关机\"\n\nmsgid \"Turn off the power to the device you are using\"\nmsgstr \"关闭您正在使用的设备的电源\"\n\nmsgid \"This action will immediately turn off the power to your device. Make sure to save all your work before proceeding.\"\nmsgstr \"此操作将立即关闭设备的电源。在继续之前，请确保保存所有工作\" \n\nmsgid \"Powering off device...\"\nmsgstr \"正在关机...\"\n\nmsgid \"Confirm Power Off\"\nmsgstr \"确认关机\"\n\nmsgid \"Warning!\"\nmsgstr \"警告\"\n\nmsgid \"Before you continue:\"\nmsgstr \"继续关机之前：\"\n\nmsgid \"Save all unsaved settings\"\nmsgstr \"保存所有未保存的设置\"\n\nmsgid \"Check if other users are active\"\nmsgstr \"检查其他用户是否处于活动状态\"\n\nmsgid \"The device needs to be manually turned on\"\nmsgstr \"设备需要手动开机\"\n\nmsgid \"Powering Off\"\nmsgstr \"关机中\"\n\nmsgid \"The device should power off within a few seconds. If the device remains on, you may need to perform a manual shutdown.\"\nmsgstr \"设备应在几秒钟内关闭。如果设备保持开启状态，您可能需要执行手动关机\"\n\n\n\n"
  },
  {
    "path": "luci-app-poweroffdevice/luci-app-poweroffdevice/root/usr/share/luci/menu.d/luci-app-poweroffdevice.json",
    "content": "{\n    \"admin/system/poweroffdevice\": {\n        \"title\": \"PowerOff\",\n        \"order\": 99,\n        \"action\": {\n            \"type\": \"view\",\n            \"path\": \"system/poweroffdevice\"\n        }\n    }\n}"
  },
  {
    "path": "luci-app-poweroffdevice/luci-app-poweroffdevice/root/usr/share/rpcd/acl.d/luci-app-poweroffdevice.json",
    "content": "{\n\t\"luci-app-poweroffdevice\": {\n\t  \"description\": \"Grant UCI access for luci-app-poweroffdevice\",\n\t  \"read\": {\n\t\t\"ubus\": {\n\t\t  \"system\": [ \"info\" ],\n\t\t},\n\t\t\"file\": {\n\t\t  \"/sbin/poweroff\": [ \"exec\" ],\n\t\t}\n\t  },\n\n\t  \"write\": {\n\t\t\t\"file\": {\n\t\t\t\t\"/sbin/poweroff\": [ \"exec\" ]\n\t\t\t},\n\t \"ubus\": {\n\t\t\t\t\"file\": [ \"exec\" ],\n\t\t\t\t\"system\": [ \"poweroff\" ]\n\t\t\t}\n\t\t}\n\t}\n}\n "
  },
  {
    "path": "luci-app-pppoe-server/Makefile",
    "content": "# Copyright (C) 2018-2021 Lienol <lawlienol@gmail.com>\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for PPPoE Server\nLUCI_DEPENDS:=+rp-pppoe-common +rp-pppoe-server\nLUCI_PKGARCH:=all\nPKG_VERSION:=20260426\nPKG_RELEASE:=1\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-pppoe-server/luasrc/controller/pppoe-server.lua",
    "content": "-- Copyright 2018-2021 Lienol <lawlienol@gmail.com>\nmodule(\"luci.controller.pppoe-server\", package.seeall)\n\nfunction index()\n    if not nixio.fs.access(\"/etc/config/luci-app-pppoe-server\") then return end\n\n    entry({\"admin\", \"services\", \"pppoe-server\"}, alias(\"admin\", \"services\", \"pppoe-server\", \"settings\"), _(\"PPPoE Server\"), 3)\n    entry({\"admin\", \"services\", \"pppoe-server\", \"settings\"}, cbi(\"pppoe-server/settings\"), _(\"General Settings\"), 10).leaf = true\n    entry({\"admin\", \"services\", \"pppoe-server\", \"users\"}, cbi(\"pppoe-server/users\"), _(\"Users Manager\"), 20).leaf = true\n    entry({\"admin\", \"services\", \"pppoe-server\", \"online\"}, cbi(\"pppoe-server/online\"), _(\"Online Users\"), 30).leaf = true\n    entry({\"admin\", \"services\", \"pppoe-server\", \"status\"}, call(\"status\")).leaf = true\nend\n\nfunction status()\n    local e = {}\n    e.status = luci.sys.call(\"pidof %s >/dev/null\" % \"pppoe-server\") == 0\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json(e)\nend\n"
  },
  {
    "path": "luci-app-pppoe-server/luasrc/model/cbi/pppoe-server/online.lua",
    "content": "local o = require \"luci.dispatcher\"\nlocal fs = require \"nixio.fs\"\nlocal jsonc = require \"luci.jsonc\"\n\nlocal sessions = {}\nlocal session_path = \"/var/etc/luci-app-pppoe-server/session\"\nif fs.access(session_path) then\n    for filename in fs.dir(session_path) do\n        local session_file = session_path .. \"/\" .. filename\n        local file = io.open(session_file, \"r\")\n        local t = jsonc.parse(file:read(\"*a\"))\n        if t then\n            t.session_file = session_file\n            sessions[#sessions + 1] = t\n        end\n        file:close()\n    end\nend\n\nf = SimpleForm(\"processes\", translate(\"PPPoE Server\"), translate(\"The PPPoE server is a broadband access authentication server that prevents ARP spoofing.\"))\nf.reset = false\nf.submit = false\n\nt = f:section(Table, sessions, translate(\"Online Users\"))\nt:option(DummyValue, \"username\", translate(\"Username\"))\nt:option(DummyValue, \"interface\", translate(\"Interface\"))\nt:option(DummyValue, \"ip\", translate(\"Client IP\"))\nt:option(DummyValue, \"mac\", translate(\"MAC address\"))\nt:option(DummyValue, \"login_time\", translate(\"Login Time\"))\n\n_kill = t:option(Button, \"_kill\", translate(\"Forced offline\"))\n_kill.inputstyle = \"reset\"\nfunction _kill.write(t, s)\n    luci.util.execi(\"rm -f \" .. t.map:get(s, \"session_file\"))\n    null, t.tag_error[t] = luci.sys.process.signal(t.map:get(s, \"pid\"), 9)\n    luci.http.redirect(o.build_url(\"admin/services/pppoe-server/online\"))\nend\n\nreturn f\n"
  },
  {
    "path": "luci-app-pppoe-server/luasrc/model/cbi/pppoe-server/settings.lua",
    "content": "local sys = require \"luci.sys\"\nlocal ifaces = sys.net:devices()\nlocal net = require \"luci.model.network\".init()\n\nm = Map(\"luci-app-pppoe-server\", translate(\"PPPoE Server\"))\nm.description = translate(\"The PPPoE server is a broadband access authentication server that prevents ARP spoofing.\")\nm.template = \"pppoe-server/index\"\n\ns = m:section(TypedSection, \"service\")\ns.anonymous = true\n\no = s:option(DummyValue, \"_status\", translate(\"Current Condition\"))\no.template = \"pppoe-server/status\"\no.value = translate(\"Collecting data...\")\n\no = s:option(Flag, \"enabled\", translate(\"Enable\"))\no.rmempty = false\n\no = s:option(ListValue, \"client_interface\", translate(\"Client Interface\"), translate(\"Listen in this interface\"))\nfor _, iface in ipairs(ifaces) do\n    if (iface:match(\"^br\") or iface:match(\"^eth*\") or iface:match(\"^pppoe*\") or iface:match(\"wlan*\")) then\n        local nets = net:get_interface(iface)\n        nets = nets and nets:get_networks() or {}\n        for k, v in pairs(nets) do nets[k] = nets[k].sid end\n        nets = table.concat(nets, \",\")\n        o:value(iface, ((#nets > 0) and \"%s (%s)\" % {iface, nets} or iface))\n    end\nend\n\no = s:option(Value, \"localip\", translate(\"Server IP\"), translate(\"PPPoE Server IP address.default: 10.0.1.1\"))\no.datatype = \"ipaddr\"\no.placeholder = \"10.0.1.1\"\no.default = o.placeholder\n\no = s:option(Value, \"remoteip\", translate(\"Client IP\"), translate(\"PPPoE Client IP address.default: 10.0.1.100-254\"))\no.placeholder = \"10.0.1.100-254\"\no.default = o.placeholder\n\no = s:option(Value, \"count\", translate(\"Client upper limit\"), translate(\"Specify how many clients can connect to the server simultaneously.\"))\no.placeholder = \"50\"\no.default = o.placeholder\n\no = s:option(Value, \"dns1\", translate(\"Preferred DNS server\"))\no.placeholder = \"10.0.1.1\"\no.datatype = \"ipaddr\"\n\no = s:option(Value, \"dns2\", translate(\"Alternate DNS server\"))\no.datatype = \"ipaddr\"\no.placeholder = \"119.29.29.29\"\n\nreturn m\n"
  },
  {
    "path": "luci-app-pppoe-server/luasrc/model/cbi/pppoe-server/users.lua",
    "content": "m = Map(\"luci-app-pppoe-server\", translate(\"PPPoE Server\"))\nm.description = translate(\"The PPPoE server is a broadband access authentication server that prevents ARP spoofing.\")\n\ns = m:section(TypedSection, \"user\", translate(\"Users Manager\"))\ns.addremove = true\ns.anonymous = true\ns.template = \"cbi/tblsection\"\n\no = s:option(Flag, \"enabled\", translate(\"Enabled\"))\no.rmempty = false\n\no = s:option(Value, \"username\", translate(\"User name\"))\no.placeholder = translate(\"User name\")\no.rmempty = true\n\no = s:option(Value, \"password\", translate(\"Password\"))\no.rmempty = true\n\no = s:option(Value, \"ipaddress\", translate(\"IP address\"))\no.placeholder = translate(\"Automatically\")\no.datatype = \"ipaddr\"\no.rmempty = true\nfunction o.cfgvalue(e, t)\n\tvalue = e.map:get(t, \"ipaddress\")\n\treturn value == \"*\" and \"\" or value\nend\nfunction o.remove(e, t)\n\tValue.write(e, t, \"*\")\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-pppoe-server/luasrc/view/pppoe-server/index.htm",
    "content": "<% include(\"cbi/map\") %>\n<script type=\"text/javascript\">//<![CDATA[\n\tXHR.poll(2, '<%=luci.dispatcher.build_url(\"admin\", \"services\", \"pppoe-server\", \"status\")%>', null,\n\t\tfunction(x, result)\n\t\t{\n\t\t\tvar status = document.getElementsByClassName('pppoe_server_status')[0];\n\t\t\tstatus.setAttribute(\"style\",\"font-weight:bold;\");\n\t\t\tstatus.setAttribute(\"color\",result.status ? \"green\":\"red\");\n\t\t\tstatus.innerHTML = result.status?'<%=translate(\"RUNNING\")%>':'<%=translate(\"NOT RUNNING\")%>';\n\t\t}\n\t)\n//]]>\n</script>\n"
  },
  {
    "path": "luci-app-pppoe-server/luasrc/view/pppoe-server/status.htm",
    "content": "<%+cbi/valueheader%>\n<font class=\"pppoe_server_status\"><%=pcdata(self:cfgvalue(section) or self.default or \"\")%></font>\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-pppoe-server/po/zh_Hans/pppoe-server.po",
    "content": "msgid \"PPPoE Server\"\nmsgstr \"PPPoE 服务器\"\n\nmsgid \"The PPPoE server is a broadband access authentication server that prevents ARP spoofing.\"\nmsgstr \"PPPoE服务器是一个宽带接入认证服务器，可以防止ARP欺骗.\"\n\nmsgid \"Current Condition\"\nmsgstr \"当前状态\"\n\nmsgid \"General settings\"\nmsgstr \"基本设置\"\n\nmsgid \"Client Interface\"\nmsgstr \"客户端接口\"\n\nmsgid \"Listen in this interface\"\nmsgstr \"监听客户端接口\"\n\nmsgid \"Server IP\"\nmsgstr \"服务器 IP 地址\"\n\nmsgid \"PPPoE Server IP address.default: 10.0.1.1\"\nmsgstr \"PPPoE 服务器远程地址。默认：10.0.1.1\"\n\nmsgid \"Client IP\"\nmsgstr \"客户端 IP 地址\"\n\nmsgid \"PPPoE Client IP address.default: 10.0.1.100-254\"\nmsgstr \"分配给客户端的 IP 地址范围。默认：10.0.1.100-254\"\n\nmsgid \"Preferred DNS server\"\nmsgstr \"首选 DNS 服务器\"\n\nmsgid \"Alternate DNS server\"\nmsgstr \"备用 DNS 服务器\"\n\nmsgid \"Client upper limit\"\nmsgstr \"客户端上限数\"\n\nmsgid \"Specify how many clients can connect to the server simultaneously.\"\nmsgstr \"指定有多少客户端可以同时连接到服务器\"\n\nmsgid \"Users Manager\"\nmsgstr \"用户管理\"\n\nmsgid \"Enabled\"\nmsgstr \"启用\"\n\nmsgid \"User name\"\nmsgstr \"用户名\"\n\nmsgid \"Password\"\nmsgstr \"密码\"\n\nmsgid \"IP address\"\nmsgstr \"IP 地址\"\n\nmsgid \"Automatically\"\nmsgstr \"自动分配\"\n\nmsgid \"Online Users\"\nmsgstr \"在线用户\"\n\nmsgid \"Login Time\"\nmsgstr \"登录时间\"\n\nmsgid \"Forced offline\"\nmsgstr \"强制下线\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\nmsgid \"RUNNING\"\nmsgstr \"运行中\""
  },
  {
    "path": "luci-app-pppoe-server/root/etc/config/luci-app-pppoe-server",
    "content": "\nconfig service\n\toption client_interface 'br-lan'\n\toption localip '10.0.1.1'\n\toption remoteip '10.0.1.100-254'\n\toption count '50'\n\toption dns1 '223.5.5.5'\n\toption dns2 '119.29.29.29'\n\toption enabled '0'\n"
  },
  {
    "path": "luci-app-pppoe-server/root/etc/init.d/luci-app-pppoe-server",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2018-2021 Lienol <lawlienol@gmail.com>\n\nSTART=99\n\nCONFIG=\"luci-app-pppoe-server\"\nCONFIG_PATH=/var/etc/${CONFIG}\nOPTIONS_FILE=${CONFIG_PATH}/options\nCHAP_SECRETS=/etc/ppp/chap-secrets\n\nipt_flag=\"PPPoE Server\"\n\nconfig_t_get() {\n\tlocal index=0\n\t[ -n \"$4\" ] && index=$4\n\tlocal ret=$(uci -q get ${CONFIG}.@$1[$index].$2 2>/dev/null)\n\techo ${ret:=$3}\n}\n\nlocalip=$(config_t_get service localip 10.0.1.1)\n\nipt_rule() {\n\tif [ \"$1\" = \"add\" ]; then\n\t\tiptables -t nat -I postrouting_rule -s ${localip%.*}.0/24 -m comment --comment \"${ipt_flag}\" -j MASQUERADE 2>/dev/null\n\t\tiptables -I forwarding_rule -s ${localip%.*}.0/24 -m comment --comment \"${ipt_flag}\" -j ACCEPT 2>/dev/null\n\telse\n\t\tipt_del() {\n\t\t\tfor i in $(seq 1 $($1 -nL $2 | grep -c \"${ipt_flag}\")); do\n\t\t\t\tlocal index=$($1 --line-number -nL $2 | grep \"${ipt_flag}\" | head -1 | awk '{print $1}')\n\t\t\t\t$1 -w -D $2 $index 2>/dev/null\n\t\t\tdone\n\t\t}\n\t\tipt_del \"iptables\" \"forwarding_rule\"\n\t\tipt_del \"iptables -t nat\" \"postrouting_rule\"\n\tfi\n}\n\ngen_include() {\n\techo '#!/bin/sh' > /var/etc/${CONFIG}.include\n\textract_rules() {\n\t\techo \"*$1\"\n\t\tiptables-save -t $1 | grep \"${ipt_flag}\" | \\\n\t\tsed -e \"s/^-A \\(INPUT\\)/-I \\1 1/\"\n\t\techo 'COMMIT'\n\t}\n\tcat <<-EOF >> /var/etc/${CONFIG}.include\n\t\tiptables-save -c | grep -v \"${ipt_flag}\" | iptables-restore -c\n\t\tiptables-restore -n <<-EOT\n\t\t$(extract_rules filter)\n\t\t$(extract_rules nat)\n\t\tEOT\n\tEOF\n\treturn 0\n}\n\nstart() {\n\tlocal enabled=$(config_t_get service enabled)\n\t[ \"$enabled\" -eq 1 ]  || return 1\n\ttouch ${CHAP_SECRETS}\n\tmkdir -p ${CONFIG_PATH}\n\tlocal ms_dns1=\"\"\n\tlocal dns1=$(config_t_get service dns1)\n\t[ -n \"${dns1}\" ] && ms_dns1=\"ms-dns ${dns1}\"\n\tlocal ms_dns2=\"\"\n\tlocal dns2=$(config_t_get service dns2)\n\t[ -n \"${dns2}\" ] && ms_dns2=\"ms-dns ${dns2}\"\n\t\n\tcat <<-EOF >> ${OPTIONS_FILE}\n\t\t# PPP options for the PPPoE server\n\t\t# LIC: GPL\n\t\tname $CONFIG\n\t\tlogin\n\t\trequire-mschap-v2\n\t\trefuse-chap\n\t\trequire-pap\n\t\tlcp-echo-interval 10\n\t\tlcp-echo-failure 2\n\t\tmru 1492\n\t\tmtu 1492\n\t\t${ms_dns1}\n\t\t${ms_dns2}\n\t\tlogfile ${CONFIG_PATH}/log.log\n\t\tip-up-script /usr/share/${CONFIG}/ip-up\n\t\tip-down-script /usr/share/${CONFIG}/ip-down\n\tEOF\n\t\n\tlocal _users=$(uci show ${CONFIG} | grep \"=user\" | cut -d '.' -sf 2 | cut -d '=' -sf 1)\n\t[ -n \"${_users}\" ] && {\n\t\tfor _user in ${_users}; do\n\t\t\tlocal u_enabled=$(uci -q get ${CONFIG}.${_user}.enabled)\n\t\t\t[ \"${u_enabled}\" -eq 1 ] || continue\n\t\t\t\n\t\t\tlocal u_username=$(uci -q get ${CONFIG}.${_user}.username)\n\t\t\t[ -n \"${u_username}\" ] || continue\n\t\t\t\n\t\t\tlocal u_password=$(uci -q get ${CONFIG}.${_user}.password)\n\t\t\t[ -n \"${u_password}\" ] || continue\n\t\t\t\n\t\t\tlocal u_ipaddress=$(uci -q get ${CONFIG}.${_user}.ipaddress)\n\t\t\t[ -n \"${u_ipaddress}\" ] || u_ipaddress=\"*\"\n\t\t\t\n\t\t\techo \"${u_username} ${CONFIG} ${u_password} ${u_ipaddress}\" >> ${CHAP_SECRETS}\n\t\tdone\n\t}\n\t\n\t/usr/sbin/pppoe-server -O ${OPTIONS_FILE} -k -I $(config_t_get service client_interface) -L ${localip} -R $(config_t_get service remoteip) -N $(config_t_get service count)\n\t\n\tipt_rule add\n\tgen_include\n}\n\nstop() {\n\tsed -i \"/${CONFIG}/d\" ${CHAP_SECRETS}\n\ttop -bn1 | grep \"${CONFIG_PATH}\" | grep -v \"grep\" | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1\n\tipt_rule del\n\trm -rf /var/etc/${CONFIG}.include\n\trm -rf ${CONFIG_PATH}\n}\n"
  },
  {
    "path": "luci-app-pppoe-server/root/etc/uci-defaults/luci-app-pppoe-server",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete firewall.luci_app_pppoe_server\n\tset firewall.luci_app_pppoe_server=include\n\tset firewall.luci_app_pppoe_server.type=script\n\tset firewall.luci_app_pppoe_server.path=/var/etc/luci-app-pppoe-server.include\n\tset firewall.luci_app_pppoe_server.reload=1\nEOF\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@luci-app-pppoe-server[-1]\n\tadd ucitrack luci-app-pppoe-server\n\tset ucitrack.@luci-app-pppoe-server[-1].init=luci-app-pppoe-server\n\tcommit ucitrack\nEOF\n\nrm -rf /tmp/luci-*cache\nexit 0\n"
  },
  {
    "path": "luci-app-pppoe-server/root/usr/share/luci-app-pppoe-server/ip-down",
    "content": "#!/bin/sh\n\n_LOGOUT_TIME=\"$(date \"+%Y-%m-%d %H:%M:%S\")\"\nCONFIG=\"luci-app-pppoe-server\"\nCONFIG_PATH=/var/etc/${CONFIG}\nSESSION_PATH=${CONFIG_PATH}/session\n\n_USERNAME=${PEERNAME}\n_IFACE=${1}\n_TTY=${2}\n_SPEED=${3}\n_LOCALIP=${4}\n_PEERIP=${5}\n_REMOTEIP=${6}\n_BYTES_SENT=${BYTES_SENT}\n_BYTES_RCVD=${BYTES_RCVD}\n_CONNECT_TIME=${CONNECT_TIME}\n\nrm -f ${SESSION_PATH}/${_USERNAME}.${_IFACE}\nrm -f /var/run/${_IFACE}.pid\n\n#可根据退出的账号自定义脚本，如静态路由表，组网等。\nSCRIPT=\"/usr/share/${CONFIG}/ip-down.d/${_USERNAME}\"\n[ -s \"$SCRIPT\" ] && {\n\t[ ! -x \"$SCRIPT\" ] && chmod 0755 \"$SCRIPT\"\n\t\"$SCRIPT\" \"$@\"\n}\n"
  },
  {
    "path": "luci-app-pppoe-server/root/usr/share/luci-app-pppoe-server/ip-up",
    "content": "#!/bin/sh\n\n_LOGIN_TIME=\"$(date \"+%Y-%m-%d %H:%M:%S\")\"\nCONFIG=\"luci-app-pppoe-server\"\nCONFIG_PATH=/var/etc/${CONFIG}\nSESSION_PATH=${CONFIG_PATH}/session\n\n_USERNAME=${PEERNAME}\n_IFACE=${1}\n_TTY=${2}\n_SPEED=${3}\n_LOCALIP=${4}\n_PEERIP=${5}\n_REMOTEIP=${6}\n\n_PID=\"$(cat /var/run/${_IFACE}.pid 2>/dev/null)\"\n_MAC=$(top -bn1 | grep -v grep | grep \"${CONFIG}\" | grep \"${_PID}\" | grep -E -o \"[0-9a-fA-F]{2}(:[0-9a-fA-F]{2}){5}\")\n\nmkdir -p ${SESSION_PATH}\n\ncat <<-EOF > ${SESSION_PATH}/${_USERNAME}.${_IFACE}\n\t{\n\t    \"username\": \"${_USERNAME}\",\n\t    \"interface\": \"${_IFACE}\",\n\t    \"tty\": \"${_TTY}\",\n\t    \"speed\": \"${_SPEED}\",\n\t    \"ip\": \"${_PEERIP}\",\n\t    \"mac\": \"${_MAC}\",\n\t    \"pid\": \"${_PID}\",\n\t    \"login_time\": \"${_LOGIN_TIME}\"\n\t}\nEOF\n\n#只能单用户使用\ncfgid=$(uci show ${CONFIG} | grep \"@user\" | grep \"\\.username='${_USERNAME}'\" | cut -d '.' -sf 2)\n[ -n \"$cfgid\" ] && {\n\tHAS_LOGIN=$(ls ${SESSION_PATH} | grep \"^${_USERNAME}\\.ppp\" | grep -v \"${_IFACE}\")\n\t[ -n \"$HAS_LOGIN\" ] && {\n\t\t#踢出之前的用户\n\t\tKO_IFACE=$(echo $HAS_LOGIN | awk -F '.' '{print $2}')\n\t\tKO_PID=$(cat /var/run/${KO_IFACE}.pid 2>/dev/null)\n\t\t[ -n \"$KO_PID\" ] && kill -9 ${KO_PID} >/dev/null 2>&1\n\t\trm -f ${SESSION_PATH}/${HAS_LOGIN}\n\t\trm -f /var/run/${KO_IFACE}.pid\n\t}\n\troutes=$(uci -q get ${CONFIG}.${cfgid}.routes)\n\t[ -n \"$routes\" ] && {\n\t\tfor router in ${routes}; do\n\t\t\troute add -net ${router} dev ${_IFACE} >/dev/null 2>&1\n\t\tdone\n\t}\n}\n\n#可根据登录的账号自定义脚本，如组网、日志、限速、权限等特殊待遇。\nSCRIPT=\"/usr/share/${CONFIG}/ip-up.d/${_USERNAME}\"\n[ -s \"$SCRIPT\" ] && {\n\t[ ! -x \"$SCRIPT\" ] && chmod 0755 \"$SCRIPT\"\n\t\"$SCRIPT\" \"$@\"\n}\n"
  },
  {
    "path": "luci-app-pppoe-server/root/usr/share/rpcd/acl.d/luci-app-pppoe-server.json",
    "content": "{\n\t\"luci-app-pppoe-server\": {\n\t\t\"description\": \"Grant UCI access for luci-app-pppoe-server\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"luci-app-pppoe-server\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"luci-app-pppoe-server\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-pppoe-server/root/usr/share/ucitrack/luci-app-pppoe-server.json",
    "content": "{\n\t\"config\": \"luci-app-pppoe-server\",\n\t\"init\": \"luci-app-pppoe-server\"\n}\n"
  },
  {
    "path": "luci-app-pushbot/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-pushbot\nPKG_VERSION:=3.60\nPKG_RELEASE:=1\n\nPKG_MAINTAINER:=tty228 <tty228@yeah.net>  zzsj0928\n\nLUCI_TITLE:=LuCI support for Pushbot\nLUCI_PKGARCH:=all\nLUCI_DEPENDS:=+iputils-arping +curl +jq\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/pushbot\n/usr/bin/pushbot/api/diy.json\n/usr/bin/pushbot/api/ipv4.list\n/usr/bin/pushbot/api/ipv6.list\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-pushbot/luasrc/controller/pushbot.lua",
    "content": "module(\"luci.controller.pushbot\",package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/pushbot\") then\n\t\treturn\n\tend\n\n\tentry({\"admin\", \"services\", \"pushbot\"}, alias(\"admin\", \"services\", \"pushbot\", \"setting\"),_(\"全能推送\"), 30).dependent = true\n\tentry({\"admin\", \"services\", \"pushbot\", \"setting\"}, cbi(\"pushbot/setting\"),_(\"配置\"), 40).leaf = true\n\tentry({\"admin\", \"services\", \"pushbot\", \"advanced\"}, cbi(\"pushbot/advanced\"),_(\"高级设置\"), 50).leaf = true\n\tentry({\"admin\", \"services\", \"pushbot\", \"client\"}, form(\"pushbot/client\"), \"在线设备\", 80)\n\tentry({\"admin\", \"services\", \"pushbot\", \"log\"}, form(\"pushbot/log\"),_(\"日志\"), 99).leaf = true\n\tentry({\"admin\", \"services\", \"pushbot\", \"get_log\"}, call(\"get_log\")).leaf = true\n\tentry({\"admin\", \"services\", \"pushbot\", \"clear_log\"}, call(\"clear_log\")).leaf = true\n\tentry({\"admin\", \"services\", \"pushbot\", \"status\"}, call(\"act_status\")).leaf = true\nend\n\nfunction act_status()\n\tlocal e={}\n\te.running=luci.sys.call(\"busybox ps|grep -v grep|grep -c pushbot >/dev/null\")==0\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n\nfunction get_log()\n\tluci.http.write(luci.sys.exec(\n\t\t\"[ -f '/tmp/pushbot/pushbot.log' ] && cat /tmp/pushbot/pushbot.log\"))\nend\n\nfunction clear_log()\n\tluci.sys.call(\"echo '' > /tmp/pushbot/pushbot.log\")\nend\n"
  },
  {
    "path": "luci-app-pushbot/luasrc/model/cbi/pushbot/advanced.lua",
    "content": "local nt = require \"luci.sys\".net\nlocal fs=require\"nixio.fs\"\n\nm=Map(\"pushbot\",translate(\"提示\"),\ntranslate(\"如果你不了解这些选项的含义，请不要修改这些选项。\"))\n\ns = m:section(TypedSection, \"pushbot\", \"高级设置\")\ns.anonymous = true\ns.addremove = false\n\na=s:option(Value,\"up_timeout\",translate('设备上线检测超时（s）'))\na.default = \"2\"\na.optional=false\na.datatype=\"uinteger\"\n\na=s:option(Value,\"down_timeout\",translate('设备离线检测超时（s）'))\na.default = \"20\"\na.optional=false\na.datatype=\"uinteger\"\n\na=s:option(Value,\"timeout_retry_count\",translate('离线检测次数'))\na.default = \"2\"\na.optional=false\na.datatype=\"uinteger\"\na.description = translate(\"若无二级路由设备，信号强度良好，可以减少以上数值<br/>因夜间 wifi 休眠较为玄学，遇到设备频繁推送断开，烦请自行调整参数<br/>..╮(╯_╰）╭..\")\n\na=s:option(Value,\"thread_num\",translate('最大并发进程数'))\na.default = \"3\"\na.datatype=\"uinteger\"\n\na=s:option(Value, \"soc_code\", \"自定义温度读取命令\")\na.rmempty = true \na:value(\"\",translate(\"默认\"))\na:value(\"pve\",translate(\"PVE 虚拟机\"))\na.description = translate(\"请尽量避免使用特殊符号，如双引号、$、!等，执行结果需为数字，用于温度对比\")\n\na=s:option(Value,\"pve_host\",translate(\"宿主机地址\"))\na.rmempty=true\na.default=\"10.0.0.2\"\na.description = translate(\"请确认已经设置好密钥登陆，否则会引起脚本无法运行等错误！<br/>PVE 安装 sensors 命令自行百度<br/>密钥登陆例：<br/>opkg update #更新列表<br/>opkg install openssh-client openssh-keygen #安装openssh客户端<br/>ssh-keygen -t rsa # 生成密钥文件（自行设定密码等信息）<br/>ssh root@10.0.0.2 \\\"tee -a ~/.ssh/id_rsa.pub\\\" < ~/.ssh/id_rsa.pub # 传送公钥到 PVE<br/>ssh root@10.0.0.2 \\\"cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys\\\" # 写入公钥到 PVE<br/>ssh -i ~/.ssh/id_rsa root@10.0.0.2 sensors # 测试温度命令\")\na:depends({soc_code=\"pve\"})\n\na=s:option(Value,\"pve_port\",translate(\"SSH端口\"))\na.rmempty=true\na.default=\"22\"\na.description = translate(\"默认为22，如有自定义，请填写自定义SSH端口\")\na:depends({soc_code=\"pve\"})\n\na=s:option(Button,\"soc\",translate(\"测试温度命令\"))\na.inputtitle = translate(\"输出信息\")\na.write = function()\n\tluci.sys.call(\"/usr/bin/pushbot/pushbot soc\")\n\tluci.http.redirect(luci.dispatcher.build_url(\"admin\",\"services\",\"pushbot\",\"advanced\"))\nend\n\nif nixio.fs.access(\"/tmp/pushbot/soc_tmp\") then\ne=s:option(TextValue,\"soc_tmp\")\ne.rows=2\ne.readonly=true\ne.cfgvalue = function()\n\treturn luci.sys.exec(\"cat /tmp/pushbot/soc_tmp && rm -f /tmp/pushbot/soc_tmp\")\nend\nend\n\na=s:option(Flag,\"err_enable\",translate(\"无人值守任务\"))\na.default=0\na.rmempty=true\na.description = translate(\"请确认脚本可以正常运行，否则可能造成频繁重启等错误！\")\n\na=s:option(Flag,\"err_sheep_enable\",translate(\"仅在免打扰时段重拨\"))\na.default=0\na.rmempty=true\na.description = translate(\"避免白天重拨 ddns 域名等待解析，此功能不影响断网检测<br/>因夜间跑流量问题，该功能可能不稳定\")\na:depends({err_enable=\"1\"})\n\na= s:option(DynamicList, \"err_device_aliases\", translate(\"关注列表\"))\na.rmempty = true \na.description = translate(\"只会在列表中设备都不在线时才会执行<br/>免打扰时段一小时后，关注设备五分钟低流量（约100kb/m）将视为离线\")\nnt.mac_hints(function(mac, name) a :value(mac, \"%s (%s)\" %{ mac, name }) end)\na:depends({err_enable=\"1\"})\n\na=s:option(ListValue,\"network_err_event\",translate(\"网络断开时\"))\na.default=\"\"\na:depends({err_enable=\"1\"})\na:value(\"\",translate(\"无操作\"))\na:value(\"1\",translate(\"重启路由器\"))\na:value(\"2\",translate(\"重新拨号\"))\na:value(\"3\",translate(\"修改相关设置项，尝试自动修复网络\"))\na.description = translate(\"选项 1 选项 2 不会修改设置，并最多尝试 2 次。<br/>选项 3 会将设置项备份于 /usr/bin/pushbot/configbak 目录，并在失败后还原。<br/>【！！无法保证兼容性！！】不熟悉系统设置项，不会救砖请勿使用\")\n\na=s:option(ListValue,\"system_time_event\",translate(\"定时重启\"))\na.default=\"\"\na:depends({err_enable=\"1\"})\na:value(\"\",translate(\"无操作\"))\na:value(\"1\",translate(\"重启路由器\"))\na:value(\"2\",translate(\"重新拨号\"))\n\na= s:option(Value, \"autoreboot_time\", \"系统运行时间大于\")\na.rmempty = true \na.default = \"24\"\na.datatype=\"uinteger\"\na:depends({system_time_event=\"1\"})\na.description = translate(\"单位为小时\")\n\na=s:option(Value, \"network_restart_time\", \"网络在线时间大于\")\na.rmempty = true \na.default = \"24\"\na.datatype=\"uinteger\"\na:depends({system_time_event=\"2\"})\na.description = translate(\"单位为小时\")\n\na=s:option(Flag,\"public_ip_event\",translate(\"重拨尝试获取公网 ip\"))\na.default=0\na.rmempty=true\na:depends({err_enable=\"1\"})\na.description = translate(\"重拨时不会推送 ip 变动通知，并会导致你的域名无法及时更新 ip 地址<br/>请确认你可以通过重拨获取公网 ip，否则这不仅徒劳无功还会引起频繁断网<br/>移动等大内网你就别挣扎了！！\")\n\na= s:option(Value, \"public_ip_retry_count\", \"当天最大重试次数\")\na.rmempty = true \na.default = \"10\"\na.datatype=\"uinteger\"\na:depends({public_ip_event=\"1\"})\n\nreturn m\n"
  },
  {
    "path": "luci-app-pushbot/luasrc/model/cbi/pushbot/client.lua",
    "content": "f = SimpleForm(\"pushbot\")\nluci.sys.call(\"/usr/bin/pushbot/pushbot client\")\nf.reset = false\nf.submit = false\nf:append(Template(\"pushbot/pushbot_client\"))\nreturn f\n"
  },
  {
    "path": "luci-app-pushbot/luasrc/model/cbi/pushbot/log.lua",
    "content": "f = SimpleForm(\"pushbot\")\nf.reset = false\nf.submit = false\nf:append(Template(\"pushbot/pushbot_log\"))\nreturn f\n"
  },
  {
    "path": "luci-app-pushbot/luasrc/model/cbi/pushbot/setting.lua",
    "content": "\nlocal nt = require \"luci.sys\".net\nlocal fs=require\"nixio.fs\"\nlocal e=luci.model.uci.cursor()\nlocal net = require \"luci.model.network\".init()\nlocal sys = require \"luci.sys\"\nlocal ifaces = sys.net:devices()\n\nm=Map(\"pushbot\",translate(\"PushBot\"),\ntranslate(\"「全能推送」，英文名「PushBot」，是一款从服务器推送报警信息和日志到各平台的工具。<br>支持钉钉推送，企业微信推送，PushPlus推送。<br>本插件由tty228/luci-app-serverchan创建，然后七年修改为全能推送自用。<br /><br />如果你在使用中遇到问题，请到这里提交：\")\n.. [[<a href=\"https://github.com/zzsj0928/luci-app-pushbot\" target=\"_blank\">]]\n.. translate(\"github 项目地址\")\n.. [[</a>]]\n)\n\nm:section(SimpleSection).template  = \"pushbot/pushbot_status\"\n\ns=m:section(NamedSection,\"pushbot\",\"pushbot\",translate(\"\"))\ns:tab(\"basic\", translate(\"基本设置\"))\ns:tab(\"content\", translate(\"推送内容\"))\ns:tab(\"crontab\", translate(\"定时推送\"))\ns:tab(\"disturb\", translate(\"免打扰\"))\ns.addremove = false\ns.anonymous = true\n\n--基本设置\na=s:taboption(\"basic\", Flag,\"pushbot_enable\",translate(\"启用\"))\na.default=0\na.rmempty = true\n\n--精简模式\na = s:taboption(\"basic\", MultiValue, \"lite_enable\", translate(\"精简模式\"))\na:value(\"device\", translate(\"精简当前设备列表\"))\na:value(\"nowtime\", translate(\"精简当前时间\"))\na:value(\"content\", translate(\"只推送标题\"))\na.widget = \"checkbox\"\na.default = nil\na.optional = true\n\n--推送模式\na=s:taboption(\"basic\", ListValue,\"jsonpath\",translate(\"推送模式\"))\na.default=\"/usr/bin/pushbot/api/dingding.json\"\na.rmempty = true\na:value(\"/usr/bin/pushbot/api/dingding.json\",translate(\"钉钉\"))\na:value(\"/usr/bin/pushbot/api/ent_wechat.json\",translate(\"企业微信\"))\na:value(\"/usr/bin/pushbot/api/feishu.json\",translate(\"飞书\"))\na:value(\"/usr/bin/pushbot/api/bark.json\",translate(\"Bark\"))\na:value(\"/usr/bin/pushbot/api/pushplus.json\",translate(\"PushPlus\"))\na:value(\"/usr/bin/pushbot/api/pushdeer.json\",translate(\"PushDeer\"))\na:value(\"/usr/bin/pushbot/api/diy.json\",translate(\"自定义推送\"))\n\na=s:taboption(\"basic\", Value,\"dd_webhook\",translate('Webhook'), translate(\"钉钉机器人 Webhook\")..\"，只输入access_token=后面的即可<br>调用代码获取<a href='https://developers.dingtalk.com/document/robots/custom-robot-access' target='_blank'>点击这里</a><br><br>\")\na.rmempty = true\na:depends(\"jsonpath\",\"/usr/bin/pushbot/api/dingding.json\")\n\na=s:taboption(\"basic\", Value, \"we_webhook\", translate(\"Webhook\"),translate(\"企业微信机器人 Webhook\")..\"，只输入key=后面的即可<br>调用代码获取<a href='https://work.weixin.qq.com/api/doc/90000/90136/91770' target='_blank'>点击这里</a><br><br>\")\na.rmempty = true\na:depends(\"jsonpath\",\"/usr/bin/pushbot/api/ent_wechat.json\")\n\na=s:taboption(\"basic\", Value,\"pp_token\",translate('PushPlus Token'), translate(\"PushPlus Token\")..\"<br>调用代码获取<a href='http://pushplus.plus/doc/' target='_blank'>点击这里</a><br><br>\")\na.rmempty = true\na:depends(\"jsonpath\",\"/usr/bin/pushbot/api/pushplus.json\")\n\na=s:taboption(\"basic\", ListValue,\"pp_channel\",translate('PushPlus Channel'))\na.rmempty = true\na:depends(\"jsonpath\",\"/usr/bin/pushbot/api/pushplus.json\")\na:value(\"wechat\",translate(\"wechat：PushPlus微信公众号\"))\na:value(\"cp\",translate(\"cp：企业微信应用\"))\na:value(\"webhook\",translate(\"webhook：第三方webhook\"))\na:value(\"sms\",translate(\"sms：短信\"))\na:value(\"mail\",translate(\"mail：邮箱\"))\na.description = translate(\"第三方webhook：企业微信、钉钉、飞书、server酱<br>sms短信/mail邮箱：PushPlus暂未开放<br>具体channel设定参见：<a href='http://pushplus.plus/doc/extend/webhook.html' target='_blank'>点击这里</a>\")\n\na=s:taboption(\"basic\", Value,\"pp_webhook\",translate('PushPlus Custom Webhook'), translate(\"PushPlus 自定义Webhook\")..\"<br>第三方webhook或企业微信调用<br>具体自定义Webhook设定参见：<a href='http://pushplus.plus/doc/extend/webhook.html' target='_blank'>点击这里</a><br><br>\")\na.rmempty = true\na:depends(\"pp_channel\",\"cp\")\na:depends(\"pp_channel\",\"webhook\")\n\na=s:taboption(\"basic\", Flag,\"pp_topic_enable\",translate(\"PushPlus 一对多推送\"))\na.default=0\na.rmempty = true\na:depends(\"pp_channel\",\"wechat\")\n\na=s:taboption(\"basic\", Value,\"pp_topic\",translate('PushPlus Topic'), translate(\"PushPlus 群组编码\")..\"<br>一对多推送时指定的群组编码<br>具体群组编码Topic设定参见：<a href='http://www.pushplus.plus/push2.html' target='_blank'>点击这里</a><br><br>\")\na.rmempty = true\na:depends(\"pp_topic_enable\",\"1\")\n\na=s:taboption(\"basic\", Value,\"pushdeer_key\",translate('PushDeer Key'), translate(\"PushDeer Key\")..\"<br>调用代码获取<a href='http://www.pushdeer.com/' target='_blank'>点击这里</a><br><br>\")\na.rmempty = true\na:depends(\"jsonpath\",\"/usr/bin/pushbot/api/pushdeer.json\")\n\na=s:taboption(\"basic\", Flag,\"pushdeer_srv_enable\",translate(\"自建 PushDeer 服务器\"))\na.default=0\na.rmempty = true\na:depends(\"jsonpath\",\"/usr/bin/pushbot/api/pushdeer.json\")\n\na=s:taboption(\"basic\", Value,\"pushdeer_srv\",translate('PushDeer Server'), translate(\"PushDeer 自建服务器地址\")..\"<br>如https://your.domain:port<br>具体自建服务器设定参见：<a href='http://www.pushdeer.com/selfhosted.html' target='_blank'>点击这里</a><br><br>\")\na.rmempty = true\na:depends(\"pushdeer_srv_enable\",\"1\")\n\na=s:taboption(\"basic\", Value,\"fs_webhook\",translate('WebHook'), translate(\"飞书 WebHook\")..\"<br>调用代码获取<a href='https://www.feishu.cn/hc/zh-CN/articles/360024984973' target='_blank'>点击这里</a><br><br>\")\na.rmempty = true\na:depends(\"jsonpath\",\"/usr/bin/pushbot/api/feishu.json\")\n\na=s:taboption(\"basic\", Value,\"bark_token\",translate('Bark Token'), translate(\"Bark Token\")..\"<br>调用代码获取<a href='https://github.com/Finb/Bark' target='_blank'>点击这里</a><br><br>\")\na.rmempty = true\na:depends(\"jsonpath\",\"/usr/bin/pushbot/api/bark.json\")\n\na=s:taboption(\"basic\", Flag,\"bark_srv_enable\",translate(\"自建 Bark 服务器\"))\na.default=0\na.rmempty = true\na:depends(\"jsonpath\",\"/usr/bin/pushbot/api/bark.json\")\n\na=s:taboption(\"basic\", Value,\"bark_srv\",translate('Bark Server'), translate(\"Bark 自建服务器地址\")..\"<br>如https://your.domain:port<br>具体自建服务器设定参见：<a href='https://github.com/Finb/Bark' target='_blank'>点击这里</a><br><br>\")\na.rmempty = true\na:depends(\"bark_srv_enable\",\"1\")\n\na=s:taboption(\"basic\", Value,\"bark_sound\",translate('Bark Sound'), translate(\"Bark 通知声音\")..\"<br>如silence.caf<br>具体设定参见：<a href='https://github.com/Finb/Bark/tree/master/Sounds' target='_blank'>点击这里</a><br><br>\")\na.rmempty = true\na.default = \"silence.caf\"\na:depends(\"jsonpath\",\"/usr/bin/pushbot/api/bark.json\")\n\na=s:taboption(\"basic\", Flag,\"bark_icon_enable\",translate(\" Bark 通知图标\"))\na.default=0\na.rmempty = true\na:depends(\"jsonpath\",\"/usr/bin/pushbot/api/bark.json\")\n\na=s:taboption(\"basic\", Value,\"bark_icon\",translate('Bark Icon'), translate(\"Bark 通知图标\")..\"(仅 iOS15 或以上支持)<br>如http://day.app/assets/images/avatar.jpg<br>具体设定参见：<a href='https://github.com/Finb/Bark#%E5%85%B6%E4%BB%96%E5%8F%82%E6%95%B0' target='_blank'>点击这里</a><br><br>\")\na.rmempty = true\na.default = \"http://day.app/assets/images/avatar.jpg\"\na:depends(\"bark_icon_enable\",\"1\")\n\na=s:taboption(\"basic\", Value,\"bark_level\",translate('Bark Level'), translate(\"Bark 时效性通知\")..\"<br>可选参数值：<br/>active：不设置时的默认值，系统会立即亮屏显示通知。<br/>timeSensitive：时效性通知，可在专注状态下显示通知。<br/>passive：仅将通知添加到通知列表，不会亮屏提醒。\")\na.rmempty = true\na.default = \"active\"\na:depends(\"jsonpath\",\"/usr/bin/pushbot/api/bark.json\")\n\na=s:taboption(\"basic\", TextValue, \"diy_json\", translate(\"自定义推送\"))\na.optional = false\na.rows = 28\na.wrap = \"soft\"\na.cfgvalue = function(self, section)\n    return fs.readfile(\"/usr/bin/pushbot/api/diy.json\")\nend\na.write = function(self, section, value)\n    fs.writefile(\"/usr/bin/pushbot/api/diy.json\", value:gsub(\"\\r\\n\", \"\\n\"))\nend\na:depends(\"jsonpath\",\"/usr/bin/pushbot/api/diy.json\")\n\na=s:taboption(\"basic\", Button,\"__add\",translate(\"发送测试\"))\na.inputtitle=translate(\"发送\")\na.inputstyle = \"apply\"\nfunction a.write(self, section)\n\tluci.sys.call(\"cbi.apply\")\n\tluci.sys.call(\"/usr/bin/pushbot/pushbot test &\")\nend\n\na=s:taboption(\"basic\", Value,\"device_name\",translate('本设备名称'))\na.rmempty = true\na.description = translate(\"在推送信息标题中会标识本设备名称，用于区分推送信息的来源设备\")\n\na=s:taboption(\"basic\", Value,\"sleeptime\",translate('检测时间间隔'))\na.rmempty = true\na.optional = false\na.default = \"60\"\na.datatype = \"and(uinteger,min(10))\"\na.description = translate(\"越短的时间时间响应越及时，但会占用更多的系统资源\")\n\na=s:taboption(\"basic\", ListValue,\"oui_data\",translate(\"MAC设备信息数据库\"))\na.rmempty = true\na.default=\"\"\na:value(\"\",translate(\"关闭\"))\na:value(\"1\",translate(\"简化版\"))\na:value(\"2\",translate(\"完整版\"))\na:value(\"3\",translate(\"网络查询\"))\na.description = translate(\"需下载 4.36m 原始数据，处理后完整版约 1.2M，简化版约 250kb <br/>若无梯子，请勿使用网络查询\")\n\na=s:taboption(\"basic\", Flag,\"oui_dir\",translate(\"下载到内存\"))\na.rmempty = true\na:depends(\"oui_data\",\"1\")\na:depends(\"oui_data\",\"2\")\na.description = translate(\"懒得做自动更新了，下载到内存中，重启会重新下载 <br/>若无梯子，还是下到机身吧\")\n\na=s:taboption(\"basic\", Flag,\"reset_regularly\",translate(\"每天零点重置流量数据\"))\na.rmempty = true\n\na=s:taboption(\"basic\", Flag,\"debuglevel\",translate(\"开启日志\"))\na.rmempty = true\n\na= s:taboption(\"basic\", DynamicList, \"device_aliases\", translate(\"设备别名\"))\na.rmempty = true\na.description = translate(\"<br/> 请输入设备 MAC 和设备别名，用“-”隔开，如：<br/> XX:XX:XX:XX:XX:XX-我的手机\")\n\n--设备状态\na=s:taboption(\"content\", ListValue,\"pushbot_ipv4\",translate(\"IPv4 变更通知\"))\na.rmempty = true\na.default=\"\"\na:value(\"\",translate(\"关闭\"))\na:value(\"1\",translate(\"通过接口获取\"))\na:value(\"2\",translate(\"通过URL获取\"))\n\na = s:taboption(\"content\", ListValue, \"ipv4_interface\", translate(\"接口名称\"))\na.rmempty = true\na:depends({pushbot_ipv4=\"1\"})\nfor _, iface in ipairs(ifaces) do\n\tif not (iface == \"lo\" or iface:match(\"^ifb.*\")) then\n\t\tlocal nets = net:get_interface(iface)\n\t\tnets = nets and nets:get_networks() or {}\n\t\tfor k, v in pairs(nets) do\n\t\t\tnets[k] = nets[k].sid\n\t\tend\n\t\tnets = table.concat(nets, \",\")\n\t\ta:value(iface, ((#nets > 0) and \"%s (%s)\" % {iface, nets} or iface))\n\tend\nend\na.description = translate(\"<br/>一般选择 wan 接口，多拨环境请自行选择\")\n\na=s:taboption(\"content\", TextValue, \"ipv4_list\", translate(\"IPv4 API列表\"))\na.optional = false\na.rows = 8\na.wrap = \"soft\"\na.cfgvalue = function(self, section)\n    return fs.readfile(\"/usr/bin/pushbot/api/ipv4.list\")\nend\na.write = function(self, section, value)\n    fs.writefile(\"/usr/bin/pushbot/api/ipv4.list\", value:gsub(\"\\r\\n\", \"\\n\"))\nend\na.description = translate(\"<br/>会因服务器稳定性、连接频繁等原因导致获取失败<br/>如接口可以正常获取 IP，不推荐使用<br/>从以上列表中随机地址访问\")\na:depends({pushbot_ipv4=\"2\"})\n\na=s:taboption(\"content\", ListValue,\"pushbot_ipv6\",translate(\"IPv6 变更通知\"))\na.rmempty = true\na.default=\"disable\"\na:value(\"0\",translate(\"关闭\"))\na:value(\"1\",translate(\"通过接口获取\"))\na:value(\"2\",translate(\"通过URL获取\"))\n\na = s:taboption(\"content\", ListValue, \"ipv6_interface\", translate(\"接口名称\"))\na.rmempty = true\na:depends({pushbot_ipv6=\"1\"})\nfor _, iface in ipairs(ifaces) do\n\tif not (iface == \"lo\" or iface:match(\"^ifb.*\")) then\n\t\tlocal nets = net:get_interface(iface)\n\t\tnets = nets and nets:get_networks() or {}\n\t\tfor k, v in pairs(nets) do\n\t\t\tnets[k] = nets[k].sid\n\t\tend\n\t\tnets = table.concat(nets, \",\")\n\t\ta:value(iface, ((#nets > 0) and \"%s (%s)\" % {iface, nets} or iface))\n\tend\nend\na.description = translate(\"<br/>一般选择 wan 接口，多拨环境请自行选择\")\n\na=s:taboption(\"content\", TextValue, \"ipv6_list\", translate(\"IPv6 API列表\"))\na.optional = false\na.rows = 8\na.wrap = \"soft\"\na.cfgvalue = function(self, section)\n    return fs.readfile(\"/usr/bin/pushbot/api/ipv6.list\")\nend\na.write = function(self, section, value)\n    fs.writefile(\"/usr/bin/pushbot/api/ipv6.list\", value:gsub(\"\\r\\n\", \"\\n\"))\nend\na.description = translate(\"<br/>会因服务器稳定性、连接频繁等原因导致获取失败<br/>如接口可以正常获取 IP，不推荐使用<br/>从以上列表中随机地址访问\")\na:depends({pushbot_ipv6=\"2\"})\n\na=s:taboption(\"content\", Flag,\"pushbot_up\",translate(\"设备上线通知\"))\na.default=1\na.rmempty = true\n\na=s:taboption(\"content\", Flag,\"pushbot_down\",translate(\"设备下线通知\"))\na.default=1\na.rmempty = true\n\na=s:taboption(\"content\", Flag,\"cpuload_enable\",translate(\"CPU 负载报警\"))\na.default=1\na.rmempty = true\n\na= s:taboption(\"content\", Value, \"cpuload\", \"负载报警阈值\")\na.default = 2\na.rmempty = true\na:depends({cpuload_enable=\"1\"})\n\na=s:taboption(\"content\", Flag,\"temperature_enable\",translate(\"CPU 温度报警\"))\na.default=1\na.rmempty = true\na.description = translate(\"请确认设备可以获取温度，如需修改命令，请移步高级设置\")\n\na= s:taboption(\"content\", Value, \"temperature\", \"温度报警阈值\")\na.rmempty = true\na.default = \"80\"\na.datatype=\"uinteger\"\na:depends({temperature_enable=\"1\"})\na.description = translate(\"<br/>设备报警只会在连续五分钟超过设定值时才会推送<br/>而且一个小时内不会再提醒第二次\")\n\na=s:taboption(\"content\", Flag,\"client_usage\",translate(\"设备异常流量\"))\na.default=0\na.rmempty = true\n\na= s:taboption(\"content\", Value, \"client_usage_max\", \"每分钟流量限制\")\na.default = \"10M\"\na.rmempty = true\na:depends({client_usage=\"1\"})\na.description = translate(\"设备异常流量警报（byte），你可以追加 K 或者 M\")\n\na=s:taboption(\"content\", Flag,\"client_usage_disturb\",translate(\"异常流量免打扰\"))\na.default=1\na.rmempty = true\na:depends({client_usage=\"1\"})\n\na = s:taboption(\"content\", DynamicList, \"client_usage_whitelist\", translate(\"异常流量关注列表\"))\nnt.mac_hints(function(mac, name) a:value(mac, \"%s (%s)\" %{ mac, name }) end)\na.rmempty = true\na:depends({client_usage_disturb=\"1\"})\na.description = translate(\"请输入设备 MAC\")\n\n--LoginNoti\na=s:taboption(\"content\", Flag,\"web_logged\",translate(\"Web 登录提醒\"))\na.default=0\na.rmempty = true\n\na=s:taboption(\"content\", Flag,\"ssh_logged\",translate(\"SSH 登录提醒\"))\na.default=0\na.rmempty = true\n\na=s:taboption(\"content\", Flag,\"web_login_failed\",translate(\"Web 错误尝试提醒\"))\na.default=0\na.rmempty = true\n\na=s:taboption(\"content\", Flag,\"ssh_login_failed\",translate(\"SSH 错误尝试提醒\"))\na.default=0\na.rmempty = true\n\na= s:taboption(\"content\", Value, \"login_max_num\", \"错误尝试次数\")\na.default = \"3\"\na.datatype=\"and(uinteger,min(1))\"\na:depends(\"web_login_failed\",\"1\")\na:depends(\"ssh_login_failed\",\"1\")\na.description = translate(\"超过次数后推送提醒\")\n\na=s:taboption(\"content\", Flag,\"web_login_black\",translate(\"自动拉黑\"))\na.default=0\na.rmempty = true\na:depends(\"web_login_failed\",\"1\")\na:depends(\"ssh_login_failed\",\"1\")\na.description = translate(\"直到重启前都不会重置次数，请先添加白名单\")\n\na= s:taboption(\"content\", Value, \"ip_black_timeout\", \"拉黑时间(秒)\")\na.default = \"86400\"\na.datatype=\"and(uinteger,min(0))\"\na:depends(\"web_login_black\",\"1\")\na.description = translate(\"0 为永久拉黑，慎用<br>如不幸误操作，请更改设备 IP 进入 LUCI 界面清空规则\")\n\na=s:taboption(\"content\", DynamicList, \"ip_white_list\", translate(\"白名单 IP 列表\"))\na.datatype = \"ipaddr\"\na.rmempty = true\nluci.ip.neighbors({family = 4}, function(entry)\n\tif entry.reachable then\n\t\ta:value(entry.dest:string())\n\tend\nend)\na:depends(\"web_logged\",\"1\")\na:depends(\"ssh_logged\",\"1\")\na:depends(\"web_login_failed\",\"1\")\na:depends(\"ssh_login_failed\",\"1\")\na.description = translate(\"忽略白名单登陆提醒和拉黑操作，暂不支持掩码位表示\")\n\na=s:taboption(\"content\", TextValue, \"ip_black_list\", translate(\"IP 黑名单列表\"))\na.optional = false\na.rows = 8\na.wrap = \"soft\"\na.cfgvalue = function(self, section)\n    return fs.readfile(\"/usr/bin/pushbot/api/ip_blacklist\")\nend\na.write = function(self, section, value)\n    fs.writefile(\"/usr/bin/pushbot/api/ip_blacklist\", value:gsub(\"\\r\\n\", \"\\n\"))\nend\na:depends(\"web_login_black\",\"1\")\n\n--定时推送\na=s:taboption(\"crontab\", ListValue,\"crontab\",translate(\"定时任务设定\"))\na.rmempty = true\na.default=\"\"\na:value(\"\",translate(\"关闭\"))\na:value(\"1\",translate(\"定时发送\"))\na:value(\"2\",translate(\"间隔发送\"))\n\na=s:taboption(\"crontab\", ListValue,\"regular_time\",translate(\"发送时间\"))\na.rmempty = true\nfor t=0,23 do\na:value(t,translate(\"每天\"..t..\"点\"))\nend\na.default=8\na.datatype=uinteger\na:depends(\"crontab\",\"1\")\n\na=s:taboption(\"crontab\", ListValue,\"regular_time_2\",translate(\"发送时间\"))\na.rmempty = true\na:value(\"\",translate(\"关闭\"))\nfor t=0,23 do\na:value(t,translate(\"每天\"..t..\"点\"))\nend\na.default=\"关闭\"\na.datatype=uinteger\na:depends(\"crontab\",\"1\")\n\na=s:taboption(\"crontab\", ListValue,\"regular_time_3\",translate(\"发送时间\"))\na.rmempty = true\n\na:value(\"\",translate(\"关闭\"))\nfor t=0,23 do\na:value(t,translate(\"每天\"..t..\"点\"))\nend\na.default=\"关闭\"\na.datatype=uinteger\na:depends(\"crontab\",\"1\")\n\na=s:taboption(\"crontab\", ListValue,\"interval_time\",translate(\"发送间隔\"))\na.rmempty = true\nfor t=1,23 do\na:value(t,translate(t..\"小时\"))\nend\na.default=6\na.datatype=uinteger\na:depends(\"crontab\",\"2\")\na.description = translate(\"<br/>从 00:00 开始，每 * 小时发送一次\")\n\na= s:taboption(\"crontab\", Value, \"send_title\", translate(\"推送标题\"))\na:depends(\"crontab\",\"1\")\na:depends(\"crontab\",\"2\")\na.placeholder = \"OpenWrt By tty228 路由状态：\"\na.description = translate(\"<br/>使用特殊符号可能会造成发送失败\")\n\na=s:taboption(\"crontab\", Flag,\"router_status\",translate(\"系统运行情况\"))\na.default=1\na:depends(\"crontab\",\"1\")\na:depends(\"crontab\",\"2\")\n\na=s:taboption(\"crontab\", Flag,\"router_temp\",translate(\"设备温度\"))\na.default=1\na:depends(\"crontab\",\"1\")\na:depends(\"crontab\",\"2\")\n\na=s:taboption(\"crontab\", Flag,\"router_wan\",translate(\"WAN信息\"))\na.default=1\na:depends(\"crontab\",\"1\")\na:depends(\"crontab\",\"2\")\n\na=s:taboption(\"crontab\", Flag,\"client_list\",translate(\"客户端列表\"))\na.default=1\na:depends(\"crontab\",\"1\")\na:depends(\"crontab\",\"2\")\n\na=s:taboption(\"crontab\", Value,\"google_check_timeout\",translate(\"全球互联检测超时时间\"))\na.rmempty = true\na.optional = false\na.default = \"10\"\na.datatype = \"and(uinteger,min(3))\"\na.description = translate(\"过短的时间可能导致检测不准确\")\n\ne=s:taboption(\"crontab\", Button,\"_add\",translate(\"手动发送\"))\ne.inputtitle=translate(\"发送\")\ne:depends(\"crontab\",\"1\")\ne:depends(\"crontab\",\"2\")\ne.inputstyle = \"apply\"\nfunction e.write(self, section)\nluci.sys.call(\"cbi.apply\")\n        luci.sys.call(\"/usr/bin/pushbot/pushbot send &\")\nend\n\n--免打扰\na=s:taboption(\"disturb\", ListValue,\"pushbot_sheep\",translate(\"免打扰时段设置\"),translate(\"在指定整点时间段内，暂停推送消息<br/>免打扰时间中，定时推送也会被阻止。\"))\na.rmempty = true\n\na:value(\"\",translate(\"关闭\"))\na:value(\"1\",translate(\"模式一：脚本挂起\"))\na:value(\"2\",translate(\"模式二：静默模式\"))\na.description = translate(\"模式一停止一切检测，包括无人值守。\")\na=s:taboption(\"disturb\", ListValue,\"starttime\",translate(\"免打扰开始时间\"))\na.rmempty = true\n\nfor t=0,23 do\na:value(t,translate(\"每天\"..t..\"点\"))\nend\na.default=0\na.datatype=uinteger\na:depends({pushbot_sheep=\"1\"})\na:depends({pushbot_sheep=\"2\"})\na=s:taboption(\"disturb\", ListValue,\"endtime\",translate(\"免打扰结束时间\"))\na.rmempty = true\n\nfor t=0,23 do\na:value(t,translate(\"每天\"..t..\"点\"))\nend\na.default=8\na.datatype=uinteger\na:depends({pushbot_sheep=\"1\"})\na:depends({pushbot_sheep=\"2\"})\n\na=s:taboption(\"disturb\", ListValue,\"macmechanism\",translate(\"MAC过滤\"))\na:value(\"\",translate(\"disable\"))\na:value(\"allow\",translate(\"忽略列表内设备\"))\na:value(\"block\",translate(\"仅通知列表内设备\"))\na:value(\"interface\",translate(\"仅通知此接口设备\"))\na.rmempty = true\n\n\na = s:taboption(\"disturb\", DynamicList, \"pushbot_whitelist\", translate(\"忽略列表\"))\nnt.mac_hints(function(mac, name) a :value(mac, \"%s (%s)\" %{ mac, name }) end)\na.rmempty = true\na:depends({macmechanism=\"allow\"})\na.description = translate(\"AA:AA:AA:AA:AA:AA\\\\|BB:BB:BB:BB:BB:B 可以将多个 MAC 视为同一用户<br/>任一设备在线后不再推送，设备全部离线时才会推送，避免双 wifi 频繁推送\")\n\na = s:taboption(\"disturb\", DynamicList, \"pushbot_blacklist\", translate(\"关注列表\"))\nnt.mac_hints(function(mac, name) a:value(mac, \"%s (%s)\" %{ mac, name }) end)\na.rmempty = true\na:depends({macmechanism=\"block\"})\na.description = translate(\"AA:AA:AA:AA:AA:AA\\\\|BB:BB:BB:BB:BB:B 可以将多个 MAC 视为同一用户<br/>任一设备在线后不再推送，设备全部离线时才会推送，避免双 wifi 频繁推送\")\n\na = s:taboption(\"disturb\", ListValue, \"pushbot_interface\", translate(\"接口名称\"))\na:depends({macmechanism=\"interface\"})\na.rmempty = true\n\nfor _, iface in ipairs(ifaces) do\n\tif not (iface == \"lo\" or iface:match(\"^ifb.*\")) then\n\t\tlocal nets = net:get_interface(iface)\n\t\tnets = nets and nets:get_networks() or {}\n\t\tfor k, v in pairs(nets) do\n\t\t\tnets[k] = nets[k].sid\n\t\tend\n\t\tnets = table.concat(nets, \",\")\n\t\ta:value(iface, ((#nets > 0) and \"%s (%s)\" % {iface, nets} or iface))\n\tend\nend\n\na=s:taboption(\"disturb\", ListValue,\"macmechanism2\",translate(\"MAC过滤2\"))\na:value(\"\",translate(\"disable\"))\na:value(\"MAC_online\",translate(\"列表内任意设备在线时免打扰\"))\na:value(\"MAC_offline\",translate(\"列表内设备都离线后免打扰\"))\na.rmempty = true\n\na = s:taboption(\"disturb\", DynamicList, \"MAC_online_list\", translate(\"在线免打扰列表\"))\nnt.mac_hints(function(mac, name) a:value(mac, \"%s (%s)\" %{ mac, name }) end)\na.rmempty = true\na:depends({macmechanism2=\"MAC_online\"})\n\na = s:taboption(\"disturb\", DynamicList, \"MAC_offline_list\", translate(\"任意离线免打扰列表\"))\nnt.mac_hints(function(mac, name) a:value(mac, \"%s (%s)\" %{ mac, name }) end)\na.rmempty = true\na:depends({macmechanism2=\"MAC_offline\"})\n\nreturn m\n"
  },
  {
    "path": "luci-app-pushbot/luasrc/view/pushbot/pushbot_log.htm",
    "content": "<%\nlocal dsp = require \"luci.dispatcher\"\n-%>\n\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tfunction clearlog(btn) {\n\t\tXHR.get('<%=dsp.build_url(\"admin/services/pushbot/clear_log\")%>', null,\n\t\t\tfunction(x, data) {\n\t\t\t\tif(x && x.status == 200) {\n\t\t\t\t\tvar log_textarea = document.getElementById('log_textarea');\n\t\t\t\t\tlog_textarea.innerHTML = \"\";\n\t\t\t\t\tlog_textarea.scrollTop = log_textarea.scrollHeight;\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\tXHR.poll(2, '<%=dsp.build_url(\"admin/services/pushbot/get_log\")%>', null,\n\t\tfunction(x, data) {\n\t\t\tif(x && x.status == 200 && document.getElementById(\"checkbox1\").checked == true) {\n\t\t\t\tvar log_textarea = document.getElementById('log_textarea');\n\t\t\t\tlog_textarea.innerHTML = x.responseText;\n\t\t\t\tlog_textarea.scrollTop = log_textarea.scrollHeight;\n\t\t\t}\n\t\t}\n\t);\n\t//]]>\n</script>\n<fieldset class=\"cbi-section\" id=\"_log_fieldset\">\n\t<input type=\"checkbox\" id=\"checkbox1\" style=\"vertical-align:middle;height: auto;\"checked><%:自动刷新%></input>\n\t<input class=\"cbi-button cbi-input-remove\" type=\"button\" onclick=\"clearlog()\" value=\"<%:清除日志%>\" />\n\t<textarea id=\"log_textarea\" class=\"cbi-input-textarea\" style=\"width: 100%;margin-top: 10px;\" data-update=\"change\" rows=\"30\" wrap=\"off\" readonly=\"readonly\"></textarea>\n</fieldset>\n"
  },
  {
    "path": "luci-app-pushbot/luasrc/view/pushbot/pushbot_status.htm",
    "content": "<script type=\"text/javascript\">//<![CDATA[\nXHR.poll(3, '<%=url([[admin]], [[services]], [[pushbot]], [[status]])%>', null,\n\tfunction(x, data) {\n\t\tvar tb = document.getElementById('pushbot_status');\n\t\tif (data && tb) {\n\t\t\tif (data.running) {\n\t\t\t\tvar links = '<em><b><font color=green>pushbot <%:RUNNING%></font></b></em>';\n\t\t\t\ttb.innerHTML = links;\n\t\t\t} else {\n\t\t\t\ttb.innerHTML = '<em><b><font color=red>pushbot <%:NOT RUNNING%></font></b></em>';\n\t\t\t}\n\t\t}\n\t}\n);\n//]]>\n</script>\n<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>\n<fieldset class=\"cbi-section\">\n\t<p id=\"pushbot_status\">\n\t\t<em><%:Collecting data...%></em>\n\t</p>\n</fieldset>\n"
  },
  {
    "path": "luci-app-pushbot/root/etc/config/pushbot",
    "content": "\nconfig pushbot 'pushbot'\n\toption pushbot_enable '0'\n\toption sleeptime '60'\n\toption pushbot_ipv6 '0'\n\toption pushbot_up '1'\n\toption pushbot_down '1'\n\toption cpuload_enable '1'\n\toption cpuload '2'\n\toption temperature_enable '0'\n"
  },
  {
    "path": "luci-app-pushbot/root/etc/init.d/pushbot",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=99\nSTOP=10\n\nstart() {\n\tstate=`pgrep -f \"/usr/bin/pushbot/pushbot\"`\n\tif [ ! -z \"$state\" ]; then\n\t\trestart\n\telse\n\t\t/usr/bin/pushbot/pushbot &\n\tfi\n\techo \"pushbot is starting now ...\"\n}\n\nstop() {\n\tkill -9 `pgrep -f \"/usr/bin/pushbot/pushbot\"` 2>/dev/null\n\techo \"pushbot exit ...\"\n}\n\nrestart(){\n\tstop\n\tsleep 1\n\tstart\n\techo \"restarted.\"\n}\n"
  },
  {
    "path": "luci-app-pushbot/root/etc/uci-defaults/luci-pushbot",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@pushbot[-1]\n\tadd ucitrack pushbot\n\tset ucitrack.@pushbot[-1].init=pushbot\n\tcommit ucitrack\nEOF\n\nrm -rf /tmp/luci-*\nexit 0\n"
  },
  {
    "path": "luci-app-pushbot/root/usr/bin/pushbot/api/bark.json",
    "content": "{\n    \"_api\": \"这是Bark推送 post 模板信息 api 文件\",\n    \"_api\": \"【Bark推送】\",\n    \n    \"url\": \"${bark_srv}/push\",\n    \"data\": \"@${tempjsonpath}\",\n    \"content_type\": \"Content-Type: application/json; charset=utf-8\",\n    \"str_title_start\": \"【\",\n    \"str_title_end\": \"】\",\n    \"str_linefeed\": \"\\\\n\",\n    \"str_splitline\": \"\\\\n\\\\n\",\n    \"str_space\": \" \",\n    \"str_tab\": \" \",\n    \"table_tab\": \"\",\n    \"font_green\": \"\",\n    \"font_green2\": \"\",\n    \"font_red\": \"\",\n    \"font_blue\": \"\",\n    \"font_purple\": \"\",\n    \"font_end\": \"\",\n    \"font_end2\": \"\",\n    \"percentsym\": \"\",\n    \"boldstar\": \"\",\n    \"type\": {\n        \"device_key\": \"\\\"${bark_token}\\\"\",\n        \"title\": \"\\\"${1}\\\"\",\n        \"body\": \"\\\"${nowtime}${str_linefeed}${2}\\\"\",\n        \"ext_params\": {\n            \"group\": \"\\\"${device_name}\\\"\",\n            \"isArchive\": \"1\",\n            \"icon\": \"\\\"${bark_icon}\\\"\",\n            \"level\": \"\\\"${bark_level}\\\"\"\n        },\n        \"sound\": \"\\\"${bark_sound}\\\"\"\n    }\n}"
  },
  {
    "path": "luci-app-pushbot/root/usr/bin/pushbot/api/dingding.json",
    "content": "{\n    \"_api\": \"这是 Pushbot:钉钉 api 文件\",\n    \"_api\": \"【钉钉推送】\",\n    \n    \"url\": \"\\\"https://oapi.dingtalk.com/robot/send?access_token=${dd_webhook}\\\"\",\n    \"data\": \"@${tempjsonpath}\",\n    \"content_type\": \"Content-Type:application/json\",\n    \"str_title_start\": \"**\",\n    \"str_title_end\": \"**\",\n    \"str_linefeed\": \"\\\\n\\\\n\",\n    \"str_splitline\": \"\\\\n\\\\n---\\\\n\\\\n\",\n    \"str_space\": \" \",\n    \"str_tab\": \" \",\n    \"table_tab\": \"<font color=#76CCFF>┋</font>\",\n    \"font_green\": \"<font color=#92D050>\",\n    \"font_green2\": \"<font color=#92D050>\",\n    \"font_red\": \"<font color=#FF6666>\",\n    \"font_blue\": \"<font color=#76CCFF>\",\n    \"font_purple\": \"<font color=#6A65FF>\",\n    \"font_end\": \"</font>\",\n    \"font_end2\": \"</font>\",\n    \"percentsym\": \"\",\n    \"boldstar\": \"**\",\n    \"type\":\n      {\n\t      \"msgtype\": \"\\\"markdown\\\"\",\n\t      \"markdown\": {\n\t\t      \t\"title\": \"\\\"${1}\\\"\",\n\t\t\t\"text\": \"\\\"${str_title_start}${font_purple}${1}${font_end}${str_title_end}${str_linefeed}${nowtime}${str_linefeed}${2}${str_linefeed}${font_purple}${1}${font_end}\\\"\"\n\t      }\n      }\n}\n"
  },
  {
    "path": "luci-app-pushbot/root/usr/bin/pushbot/api/diy.json",
    "content": "{\n\t\"_//\": \"-------------------------------------------------------------------------------\",\n    \"_readme\": \"这是 自定义 api 文件，这里以 telegram 为例\",\n    \"_readme\": \"特殊符号请使用斜杠转义，变量使用 ${var} 表示\",\n    \"_//\": \"-------------------------------------------------------------------------------\",\n    \"_api\": \"【DIY 推送】\",\n    \"_url\": \"api 地址\",\n    \"_data\": \"生成的 json 文件路径，一般不需要改，如 api 不支持 json，请参考 serverchan 推送接口\",\n    \"_content_type\": \"post 内容类型，这里为 json\",\n    \"_//\": \"-------------------------------------------------------------------------------\",\n    \"_str_title_start\": \"标题粗体字开始符号\",\n    \"_str_title_end\": \"标题粗体字结束符号\",\n    \"_str_linefeed\": \"换行符号\",\n    \"_str_splitline\": \"换行+分隔符\",\n    \"_str_space\": \"空格\",\n    \"_str_tab\": \"TAB（用在行首，生成文字区块）\",\n    \"_//\": \"-------------------------------------------------------------------------------\",\n    \"_type\":\n      {\n\t\t\"_readme\": \"type 对象因为需要转义变量，前后必须使用 斜杠+双引号 转义\",\n\t\t\"_readme\": \"参照上文说明，填写下文相关参数\"\n      },\n    \"_//\": \"-------------------------------------------------------------------------------\",\n    \n    \"url\": \"https://api.telegram.org/bot${tg_token}/sendMessage\",\n    \"data\": \"@${tempjsonpath}\",\n    \"content_type\": \"Content-Type: application/json\",\n    \"str_title_start\": \"<b>\",\n    \"str_title_end\": \"</b>\",\n    \"str_linefeed\": \"\\\\n\",\n    \"str_splitline\": \"\\\\n----\\\\n\",\n    \"str_space\": \" \",\n    \"str_tab\": \"    \",\n    \"table_tab\": \"<font color=#76CCFF>┋</font>\",\n    \"font_green\": \"<font color=#92D050>\",\n    \"font_green2\": \"<font color=#92D050>\",\n    \"font_red\": \"<font color=#FF6666>\",\n    \"font_blue\": \"<font color=#76CCFF>\",\n    \"font_purple\": \"<font color=#6A65FF>\",\n    \"font_end\": \"</font>\",\n    \"font_end2\": \"</font>\",\n    \"percentsym\": \"25\",\n    \"boldstar\": \"**\",\n    \"type\":\n      {\n\t\t\"text\":\"\\\"${str_title_start}${1}${str_title_end}${str_splitline}${nowtime}${2}\\\"\",\n\t\t\"chat_id\":\"\\\"${chat_id}\\\"\",\n        \"parse_mode\":\"\\\"HTML\\\"\"\n      }\n}\n"
  },
  {
    "path": "luci-app-pushbot/root/usr/bin/pushbot/api/ent_wechat.json",
    "content": "{\n    \"_api\": \"这是企业微信 markdown 模板信息 api 文件\",\n    \"_api\": \"【企业微信】\",\n    \n    \"url\": \"https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=${we_webhook}\",\n    \"data\": \"@${tempjsonpath}\",\n    \"content_type\": \"Content-Type: application/json\",\n    \"str_title_start\": \"#### \",\n    \"str_title_end\": \"\",\n    \"str_linefeed\": \"\\\\n\",\n    \"str_splitline\": \"\\\\n------\\\\n\",\n    \"str_space\": \" \",\n    \"str_tab\": \" \",\n    \"table_tab\": \"<font color=#76CCFF>┋</font>\",\n    \"font_green\": \"<font color=#92D050>\",\n    \"font_green2\": \"<font color=#92D050>\",\n    \"font_red\": \"<font color=#FF6666>\",\n    \"font_blue\": \"<font color=#76CCFF>\",\n    \"font_purple\": \"<font color=#6A65FF>\",\n    \"font_end\": \"</font>\",\n    \"font_end2\": \"</font>\",\n    \"percentsym\": \"\",\n    \"boldstar\": \"**\",\n    \"type\":\n      {\n\t      \"msgtype\": \"\\\"markdown\\\"\",\n\t      \"markdown\": {\n\t\t      \t\"title\": \"\\\"${1}\\\"\",\n\t\t\t\"content\": \"\\\"${str_title_start}${font_purple}${1}${font_end}${str_title_end}${str_linefeed}${nowtime}${str_linefeed}${2}\\\"\"\n\t      }\n        }\n}\n"
  },
  {
    "path": "luci-app-pushbot/root/usr/bin/pushbot/api/feishu.json",
    "content": "{\n    \"_api\": \"这是飞书推送 post 模板信息 api 文件\",\n    \"_api\": \"【飞书推送】\",\n    \n    \"url\": \"https://open.feishu.cn/open-apis/bot/v2/hook/${fs_webhook}\",\n    \"data\": \"@${tempjsonpath}\",\n    \"content_type\": \"Content-Type: application/json\",\n    \"str_title_start\": \"**\",\n    \"str_title_end\": \"**\",\n    \"str_linefeed\": \"\\\\n\",\n    \"str_splitline\": \"\\\\n\\\\n\",\n    \"str_space\": \" \",\n    \"str_tab\": \" \",\n    \"table_tab\": \"\",\n    \"font_green\": \"\",\n    \"font_green\": \"\",\n    \"font_red\": \"\",\n    \"font_blue\": \"\",\n    \"font_purple\": \"\",\n    \"font_end\": \"\",\n    \"font_end2\": \"\",\n    \"percentsym\": \"\",\n    \"boldstar\": \"**\",\n    \"type\":\n\t{\n\t\t\"msg_type\": \"\\\"interactive\\\"\",\n\t\t\"card\": {\n\t\t\t\"config\": {\n\t\t\t\t\"wide_screen_mode\": \"true\"\n\t\t\t},\n\t\t\t\"header\": {\n\t\t\t\t\"template\": \"\\\"purple\\\"\",\n\t\t\t\t\"title\": {\n\t\t\t\t\t\"content\": \"\\\"${1}\\\"\",\n\t\t\t\t\t\"tag\": \"\\\"plain_text\\\"\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t\"elements\": [\n\t\t\t{\n\t\t\t\t\"tag\": \"\\\"div\\\"\",\n\t\t\t\t\"text\": {\n\t\t\t\t\t\"content\": \"\\\"${nowtime}${str_linefeed}${2}\\\"\",\n\t\t\t\t\t\"tag\": \"\\\"lark_md\\\"\"\n\t\t\t\t}\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"tag\": \"\\\"hr\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"elements\": [\n\t\t\t\t{\n\t\t\t\t\t\"content\": \"\\\"来自${device_name}\\\"\",\n\t\t\t\t\t\"tag\": \"\\\"lark_md\\\"\"\n\t\t\t\t}\n\t\t\t\t],\n\t\t\t\"tag\": \"\\\"note\\\"\"\n\t\t\t}\n\t\t\t]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-pushbot/root/usr/bin/pushbot/api/ip_blacklist",
    "content": "\n"
  },
  {
    "path": "luci-app-pushbot/root/usr/bin/pushbot/api/ipv4.list",
    "content": "www.cip.cc\nipv4.ddnspod.com\nifcfg.cn\nspeed.neu.edu.cn/getIP.php\nddns.oray.com/checkip\nwww.net.cn/static/customercare/yourip.asp\n"
  },
  {
    "path": "luci-app-pushbot/root/usr/bin/pushbot/api/ipv6.list",
    "content": "ip.sb\nipv6.ddnspod.com\napi-ipv6.ip.sb/ip\nspeed.neu6.edu.cn/getIP.php\nv6.myip.la/json\n"
  },
  {
    "path": "luci-app-pushbot/root/usr/bin/pushbot/api/pushdeer.json",
    "content": "{\n    \"_api\": \"这是 PushDeer推送 api 文件\",\n    \"_api\": \"【PushDeer推送】\",\n    \n    \"url\": \"${pushdeer_srv}/message/push\",\n    \"data\": \"@${tempjsonpath}\",\n    \"content_type\": \"Content-Type:application/json\",\n    \"str_title_start\": \"**【\",\n    \"str_title_end\": \"】**\",\n    \"str_linefeed\": \"\\\\n\\\\n\",\n    \"str_splitline\": \"\\\\n\\\\n---\\\\n\\\\n\",\n    \"str_space\": \" \",\n    \"str_tab\": \" \",\n    \"table_tab\": \"┋\",\n    \"font_green\": \"\",\n    \"font_green2\": \"\",\n    \"font_red\": \"\",\n    \"font_blue\": \"\",\n    \"font_purple\": \"\",\n    \"font_end\": \"\",\n    \"font_end2\": \"\",\n    \"percentsym\": \"\",\n    \"boldstar\": \"**\",\n    \"type\":\n      {\n\t      \"pushkey\": \"\\\"${pushdeer_key}\\\"\",\n\t      \"type\": \"\\\"markdown\\\"\",\n\t      \"text\": \"\\\"${1}\\\"\",\n\t      \"desp\": \"\\\"${nowtime}${str_linefeed}${2}\\\"\"\n      }\n}\n"
  },
  {
    "path": "luci-app-pushbot/root/usr/bin/pushbot/api/pushplus.json",
    "content": "{\n    \"_api\": \"这是 Pushbot:PushPlus api 文件\",\n    \"_api\": \"【PushPlus推送】\",\n    \n    \"url\": \"http://www.pushplus.plus/send\",\n    \"data\": \"@${tempjsonpath}\",\n    \"content_type\": \"Content-Type:application/json\",\n    \"str_title_start\": \"#### \",\n    \"str_title_end\": \"\",\n    \"str_linefeed\": \"\\\\n\\\\n\",\n    \"str_splitline\": \"\\\\n----\\\\n\",\n    \"str_space\": \" \",\n    \"str_tab\": \"    \",\n    \"table_tab\": \"\",\n    \"font_green\": \"<font color=#92D050>\",\n    \"font_green2\": \"\",\n    \"font_red\": \"<font color=#FF6666>\",\n    \"font_blue\": \"<font color=#76CCFF>\",\n    \"font_purple\": \"<font color=#6A65FF>\",\n    \"font_end\": \"</font>\",\n    \"font_end2\": \"\",\n    \"percentsym\": \"\",\n    \"boldstar\": \"\",\n    \"type\":\n      {\n\t      \t\"token\": \"\\\"${pp_token}\\\"\",\n\t      \t\"channel\": \"\\\"${pp_channel}\\\"\",\n\t      \t\"webhook\": \"\\\"${pp_webhook}\\\"\",\n\t      \t\"topic\": \"\\\"${pp_topic}\\\"\",\n\t\t\"title\": \"\\\"${1}\\\"\",\n\t\t\"content\": \"\\\"${2}\\\"\",\n\t\t\"template\": \"\\\"markdown\\\"\"\n      }\n}\n"
  },
  {
    "path": "luci-app-pushbot/root/usr/bin/pushbot/pushbot",
    "content": "#!/bin/sh\n\n# 读取设置文件\nfunction get_config(){\n\twhile [[ \"$*\" != \"\" ]]; do\n\t\teval ${1}='`uci get pushbot.pushbot.$1`' 2>/dev/null\n\t\tshift\n\tdone\n}\n\n# 初始化设置信息\nfunction read_config(){\n\tget_config \"pushbot_enable\" \"lite_enable\" \"device_name\" \"sleeptime\" \"oui_dir\" \"oui_data\" \"reset_regularly\" \"debuglevel\" \"device_aliases\" \\\n\t\"pushbot_ipv4\" \"ipv4_interface\" \"pushbot_ipv6\" \"ipv6_interface\" \"pushbot_up\" \"pushbot_down\" \"cpuload_enable\" \"cpuload\" \"temperature_enable\" \"temperature\" \\\n\t\"regular_time\" \"regular_time_2\" \"regular_time_3\" \"interval_time\" \\\n\t\"client_usage\" \"client_usage_max\" \"client_usage_disturb\" \"client_usage_whitelist\" \\\n\t\"web_logged\" \"ssh_logged\" \"web_login_failed\" \"ssh_login_failed\" \"login_max_num\" \"web_login_black\" \"ip_white_list\" \"ip_black_timeout\" \\\n\t\"pushbot_sheep\" \"starttime\" \"endtime\" \"pushbot_whitelist\" \"pushbot_blacklist\" \"pushbot_interface\" \"MAC_online_list\" \"MAC_offline_list\" \\\n\t\"up_timeout\" \"down_timeout\" \"timeout_retry_count\" \"thread_num\" \"soc_code\" \"pve_host\" \"pve_port\"\\\n\t\"err_enable\" \"err_sheep_enable\" \"err_device_aliases\" \"network_err_event\" \"system_time_event\" \"autoreboot_time\" \"network_restart_time\" \"public_ip_event\" \"public_ip_retry_count\" \\\n\t\"jsonpath\" \"dd_webhook\" \"we_webhook\" \"pp_token\" \"pp_channel\" \"pp_webhook\" \"pp_topic_enable\" \"pp_topic\" \"fs_webhook\" \"pushdeer_key\" \"pushdeer_srv_enable\" \"pushdeer_srv\" \"bark_srv_enable\" \"bark_srv\" \"bark_token\" \"bark_sound\" \"bark_icon\" \"bark_icon_enable\" \"bark_level\"\n\t\n\tfor str_version in \"wrtbwmon\" \"iputils-arping\" \"curl\" \"iw\"; do\n\t\teval `echo ${str_version:0:2}\"_version\"`=`opkg list-installed|grep -w ^${str_version}|awk '{print $3}'` 2>/dev/null\n\tdone\n\tdir=\"/tmp/pushbot/\" && mkdir -p ${dir}\n\ttempjsonpath=\"/tmp/pushbot/temp.json\"\n\tip_blacklist_path=\"/usr/bin/pushbot/api/ip_blacklist\"\n\t[ ! -z \"$oui_dir\" ] && [ \"$oui_dir\" -eq \"1\" ] && oui_base=\"${dir}oui_base.txt\" || oui_base=\"/usr/bin/pushbot/oui_base.txt\"\n\tdebuglevel=`echo \"$debuglevel\"` && [ -z \"$debuglevel\" ] && logfile=\"/dev/null\" || logfile=\"${dir}pushbot.log\"\n\tpushbot_blacklist=`echo \"$pushbot_blacklist\"|sed 's/ /\\n/g'` 2>/dev/null\n\tpushbot_whitelist=`echo \"$pushbot_whitelist\"|sed 's/ /\\n/g'` 2>/dev/null\n\tdevice_aliases=`echo \"$device_aliases\"|sed 's/ /\\n/g'|sed 's/-/ /'` 2>/dev/null\n\terr_device_aliases=`echo \"$err_device_aliases\"|sed 's/ /\\n/g'` 2>/dev/null\n\tclient_usage_whitelist=`echo \"$client_usage_whitelist\"|sed 's/ /\\n/g'` 2>/dev/null\n\tip_white_list=`echo \"$ip_white_list\"|sed 's/ /\\n/g'` 2>/dev/null\n\tmark_mac_list=\"${MAC_online_list} ${MAC_offline_list}\"\n\tmark_mac_list=`echo \"$mark_mac_list\"|sed 's/ /\\n/g'|sed 's/-/ /'` 2>/dev/null\n\tipv4_urllist=`cat /usr/bin/pushbot/api/ipv4.list` 2>/dev/null\n\tipv6_urllist=`cat /usr/bin/pushbot/api/ipv6.list` 2>/dev/null\n\t[ -z \"$pushbot_ipv4\" ] && pushbot_ipv4=0\n\t[ -z \"$pushbot_ipv6\" ] && pushbot_ipv6=0\n\t[ \"$iw_version\" ] && wlan_interface=`iw dev|grep Interface|awk '{print $2}'` >/dev/null 2>&1\n\t[ -z \"$up_timeout\" ] || [ \"$up_timeout\" -eq \"0\" ] && up_timeout=\"2\"\n\t[ -z \"$down_timeout\" ] || [ \"$down_timeout\" -eq \"0\" ] && down_timeout=\"20\";down_timeout=`expr ${down_timeout} / 2 + 1`\n\t[ -z \"$timeout_retry_count\" ] && timeout_retry_count=\"2\";[ \"$timeout_retry_count\" -eq \"0\" ] && timeout_retry_count=\"1\"\n\t[ ! -z \"$bark_token\" ] && [ -z \"$bark_srv\" ] && bark_srv=\"https://api.day.app\"\n\t[ ! -z \"$pushdeer_key\" ] && [ -z \"$pushdeer_srv\" ] && pushdeer_srv=\"https://api2.pushdeer.com\"\n\t\n# 字符串读取\n\tstr_title_start=`/usr/bin/jq -r '.str_title_start' ${jsonpath}`\n\tstr_title_end=`/usr/bin/jq -r '.str_title_end' ${jsonpath}`\n\tstr_linefeed=`/usr/bin/jq -r '.str_linefeed' ${jsonpath}`\n\tstr_splitline=`/usr/bin/jq -r '.str_splitline' ${jsonpath}`\n\tstr_space=`/usr/bin/jq -r '.str_space' ${jsonpath}`\n\tstr_tab=`/usr/bin/jq -r '.str_tab' ${jsonpath}`\n\tfont_red=`/usr/bin/jq -r '.font_red' ${jsonpath}`\n\tfont_green=`/usr/bin/jq -r '.font_green' ${jsonpath}`\n\tfont_green2=`/usr/bin/jq -r '.font_green2' ${jsonpath}`\n\tfont_blue=`/usr/bin/jq -r '.font_blue' ${jsonpath}`\n\tfont_purple=`/usr/bin/jq -r '.font_purple' ${jsonpath}`\n\tfont_end=`/usr/bin/jq -r '.font_end' ${jsonpath}`\n\tfont_end2=`/usr/bin/jq -r '.font_end2' ${jsonpath}`\n\tpercentsym=`/usr/bin/jq -r '.percentsym' ${jsonpath}`\n\tboldstar=`/usr/bin/jq -r '.boldstar' ${jsonpath}`\n\ttable_tab=`/usr/bin/jq -r '.tabletab' ${jsonpath}`\n\t( echo \"$lite_enable\"|grep -q \"content\" ) && str_title_start=\"\" && str_title_end=\"\" && str_splitline=\"\" && str_linefeed=\"\" && str_tab=\"\"\n}\n\t\n\t\n\n# 初始化\nfunction pushbot_init(){\n\tenable_detection\n\tif [ -f \"/usr/bin/pushbot/errlog\" ]; then\n\t\tcat /usr/bin/pushbot/errlog > ${logfile}\n\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】载入上次重启前日志\" >> ${logfile}\n\t\techo \"--------------------------------------------------------\" >> ${logfile}\n\tfi\n\tdown_oui &\n\tdeltemp\n\tget_syslog\n\tadd_ip_black\n\t\n\trm -f ${dir}fd1 ${dir}sheep_usage ${dir}old_sheep_usage ${dir}client_usage_aliases ${dir}old_client_usage_aliases /usr/bin/pushbot/errlog >/dev/null 2>&1\n\t[ ! -f \"/usr/sbin/wrtbwmon\" ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】未安装 wrtbwmon ，流量统计不可用\" >> ${logfile}\n\t[ -z \"$ip_version\" ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】无法获取依赖项 iputils-arping 版本号，请确认插件是否正常运行\" >> ${logfile}\n\t[ -z \"$cu_version\" ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】无法获取依赖项 curl 版本号，请确认插件是否正常运行\" >> ${logfile}\n\t[ -z \"${dd_webhook}${pp_token}${we_webhook}${fs_webhook}${bark_token}${pushdeer_key}\" ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】请填写正确的Token/Webhook \" >> ${logfile} && return 1\n\tlocal interfacelist=`getinterfacelist` && [ -z \"$interfacelist\" ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】无法正确获取接口信息，请确认插件是否正常运行\" >> ${logfile}\n\treturn 0\n}\n\n# 推送\nfunction diy_send(){\n\t( ! echo \"$lite_enable\"|grep -q \"content\" ) && ( ! echo \"$lite_enable\"|grep -q \"nowtime\" ) && local nowtime=`date \"+%Y-%m-%d %H:%M:%S\"`\n\tlocal diyurl=`/usr/bin/jq -r .url ${3}` && local diyurl=`eval echo ${diyurl}`\n\tlocal type=`/usr/bin/jq -r '.type' ${3}` && local type=`eval echo ${type}`\n\tlocal data=`/usr/bin/jq -r '.data' ${3}` && local data=`eval echo ${data}`\n\tlocal content_type=`/usr/bin/jq -r '.content_type' ${3}`\n\t/usr/bin/jq \".type + $type\" ${jsonpath} > ${tempjsonpath}\n\t/usr/bin/jq -r '.[]' ${tempjsonpath}|grep -w \"null\" && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】参数值错误，请检查设置项  `/usr/bin/jq -r '.' ${tempjsonpath}|grep \"null\"`\" >> ${logfile} && return 1\n\t[ -f ${tempjsonpath} ] && local logrow=$(grep -c \"\" ${tempjsonpath}) || local logrow=\"0\"\n\t[ $logrow -eq \"0\" ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】json 文件生成失败，请检查文件格式\" >> ${logfile} && return 1\n\t/usr/bin/jq -r '.[]' ${tempjsonpath}|grep \"null\" && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】参数变量生成失败，请检查设置项 `/usr/bin/jq -r '.' ${tempjsonpath}|grep \"null\"`\" >> ${logfile}\n\t\n\tcurl -X POST -H \"$content_type\" -d \"${data}\" \"${diyurl}\"\n}\n\n# 下载设备MAC厂商信息\nfunction down_oui(){\n\t[ -f ${oui_base} ] && local logrow=$(grep -c \"\" ${oui_base}) || local logrow=\"0\"\n\t[ $logrow -lt \"10\" ] && rm -f ${oui_base} >/dev/null 2>&1\n\tif [ ! -z \"$oui_data\" ] && [ \"$oui_data\" -ne \"3\" ] && [ ! -f ${oui_base} ]; then\n\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【初始化】设备MAC厂商信息不存在，重新下载\" >> ${logfile}\n\t\twget --no-check-certificate -t 3 -T 15 -O ${dir}oui.txt https://standards-oui.ieee.org/oui/oui.txt >/dev/null 2>&1\n\t\tif [ -f ${dir}oui.txt ] && [ \"$oui_data\" -eq \"1\" ]; then\n\t\t\tcat ${dir}oui.txt|grep \"base 16\"|grep -i \"apple\\|aruba\\|asus\\|autelan\\|belkin\\|bhu\\|buffalo\\|cctf\\|cisco\\|comba\\|datang\\|dell\\|dlink\\|dowell\\|ericsson\\|fast\\|feixun\\|\\\nfiberhome\\|fujitsu\\|grentech\\|h3c\\|hisense\\|hiwifi\\|honghai\\|honghao\\|hp\\|htc\\|huawei\\|intel\\|jinli\\|jse\\|lenovo\\|lg\\|liteon\\|malata\\|meizu\\|mercury\\|meru\\|moto\\|netcore\\|\\\nnetgear\\|nokia\\|omron\\|oneplus\\|oppo\\|philips\\|router_unkown\\|samsung\\|shanzhai\\|sony\\|start_net\\|sunyuanda\\|tcl\\|tenda\\|texas\\|tianyu\\|tp-link\\|ubq\\|undefine\\|VMware\\|\\\nutstarcom\\|volans\\|xerox\\|xiaomi\\|zdc\\|zhongxing\\|smartisan\" > ${oui_base} && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【初始化】设备MAC厂商信息下载成功\" >> ${logfile} || echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】设备MAC厂商信息下载失败\" >> ${logfile} \n\t\tfi\n\t\tif [ -f ${dir}oui.txt ] && [ \"$oui_data\" -eq \"2\" ]; then\n\t\t\tcat ${dir}oui.txt|grep \"base 16\" > ${oui_base} && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【初始化】设备MAC厂商信息下载成功\" >> ${logfile} || echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】设备MAC厂商信息下载失败\" >> ${logfile}\n\t\tfi\n\t\trm -f ${dir}oui.txt >/dev/null 2>&1\n\tfi\n}\n\n# 清理临时文件\nfunction deltemp(){\n\tunset title\tcontent ipAddress_logrow online_list online_mac mac_online_status\n\trm -f ${dir}title ${dir}content ${dir}tmp_downlist ${dir}send_enable.lock ${tempjsonpath} >/dev/null 2>&1\n\tLockFile unlock\n\t[ -f ${logfile} ] && local logrow=$(grep -c \"\" ${logfile}) || local logrow=\"0\"\n\t[ $logrow -gt 500 ] && sed -i '1,100d' ${logfile} && echo \"`date \"+%Y-%m-%d %H:%M:%S\"`  【清理】日志超出上限，删除前 100 条\" >> ${logfile}\n}\n\n# 检测程序开关\nfunction enable_detection(){\n\t[ ! \"$1\" ] && local time_n=1\n\tfor i in `seq 1 $time_n`; do\n\t\tget_config pushbot_enable;[ -z \"$pushbot_enable\" ] || [ \"$pushbot_enable\" -eq \"0\" ] && `/etc/init.d/pushbot stop` || sleep 1\n\tdone\n}\n\n# 获取 ip\nfunction getip(){\n\t[ ! \"$1\" ] && return\n\tif [ $1 == \"wanipv4\" ] ;then\n\t\t[ ! -z \"$ipv4_interface\" ] && local wanIP=$(/sbin/ifconfig ${ipv4_interface}|awk '/inet addr/ {print $2}'|awk -F: '{print $2}'|grep -oE '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}')\n\t\t[ -z \"$ipv4_interface\" ] && local wanIP=$(getinterfacelist|grep '\\\"address\\\"'|grep -oE '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}')\n\t\techo \"$wanIP\"\n\telif [ $1 == \"hostipv4\" ] ;then\n\t\tfunction get_hostipv4()\n\t\t{\n\t\t\tlocal url_number=`echo \"$ipv4_urllist\"|wc -l`\n\t\t\tlocal ipv4_URL=`echo \"$ipv4_urllist\"| sed -n \"$(rand 1 $url_number)p\"|sed -e 's/\\r//g'`\n\t\t\t[ ! -z \"$ipv4_interface\" ] && local hostIP=$(curl -k -s -4 --interface ${ipv4_interface} -m 5 ${ipv4_URL}) || local hostIP=$(curl -k -s -4 -m 5 ${ipv4_URL})\n\t\t\techo $hostIP|grep -oE '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}'|head -n1\n\t\t}\n\t\tlocal hostIP=`get_hostipv4`\n\t\t[ -z \"$hostIP\" ] && local hostIP=`get_hostipv4`\n\t\t[ -z \"$hostIP\" ] && local hostIP=`get_hostipv4`\n\t\techo $hostIP # 重试，偷懒，有空再优化\n\telif [ $1 == \"wanipv6\" ] ;then\n\t\t[ ! -z \"$ipv6_interface\" ] && local wanIPv6=$(ip addr show ${ipv6_interface}|grep -v deprecated|grep -A1 'inet6 [^f:]'|sed -nr ':a;N;s#^ +inet6 ([a-f0-9:]+)/.+? scope global .*? valid_lft ([0-9]+sec) .*#\\2 \\1#p;ta'|sort -nr|head -n1|awk '{print $2}')\n\t\t[ -z \"$ipv6_interface\" ] && local wanIPv6=$(ip addr show|grep -v deprecated|grep -A1 'inet6 [^f:]'|sed -nr ':a;N;s#^ +inet6 ([a-f0-9:]+)/.+? scope global .*? valid_lft ([0-9]+sec) .*#\\2 \\1#p;ta'|sort -nr|head -n1|awk '{print $2}')\n\t\techo \"$wanIPv6\"\n\telif [ $1 == \"hostipv6\" ] ;then\n\t\tfunction get_hostipv6()\n\t\t{\n\t\t\tlocal urlv6_number=`echo \"$ipv6_urllist\"|wc -l`\n\t\t\tlocal ipv6_URL=`echo \"$ipv6_urllist\"| sed -n \"$(rand 1 $urlv6_number)p\"|sed -e 's/\\r//g'`\n\t\t\t[ ! -z \"$ipv6_interface\" ] && local hostIPv6=$(curl -k -s -6 --interface ${ipv6_interface} -m 5 ${ipv6_URL}) || local hostIPv6=$(curl -k -s -6 -m 5 ${ipv6_URL})\n\t\t\techo $hostIPv6|grep -oE '([\\da-fA-F0-9]{1,4}(:{1,2})){1,15}[\\da-fA-F0-9]{1,4}'|head -n1\n\t\t}\n\t\tlocal hostIPv6=`get_hostipv6`\n\t\t[ -z \"$hostIPv6\" ] && local hostIPv6=`get_hostipv6`\n\t\t[ -z \"$hostIPv6\" ] && local hostIPv6=`get_hostipv6`\n\t\techo $hostIPv6 # 重试，偷懒，有空再优化\n\tfi\n}\n\n# 获取接口信息\nfunction getinterfacelist(){\n\t[ `ubus list|grep -w -i \"network.interface.wan\"|wc -l` -ge \"1\" ] && ubus call network.interface.wan status && return\n\t[ `ubus list|grep -i \"network.interface.\"|grep -v \"loopback\"|grep -v \"wan6\"|wc -l` -eq \"1\" ] && ubus call `ubus list|grep \"network.interface.\"|grep -v \"loopback\"` status && return\n}\n\n# 获取接口在线时间\nfunction getinterfaceuptime(){\n\tgetinterfacelist|grep \\\"uptime\\\"|sed $'s/\\\"uptime\": //g'|sed $'s/\\,//g'\n}\n\n# 查询 mac 地址\nfunction getmac(){\n\t( echo \"$tmp_mac\"|grep -q \"unknown\" ) && unset tmp_mac # 为unknown时重新读取\n\t[ -f \"${dir}ipAddress\" ] && [ -z \"$tmp_mac\" ] && local tmp_mac=`cat ${dir}ipAddress|grep -w ${1}|awk '{print $2}'|grep -v \"^$\"|sort -u|head -n1`\n\t[ -f \"${dir}tmp_downlist\" ] && [ -z \"$tmp_mac\" ] && local tmp_mac=`cat ${dir}tmp_downlist|grep -w ${1}|awk '{print $2}'|grep -v \"^$\"|sort -u|head -n1`\n\t[ -f \"/var/dhcp.leases\" ] && [ -z \"$tmp_mac\" ] && local tmp_mac=`cat /var/dhcp.leases|grep -w ${1}|awk '{print $2}'|grep -v \"^$\"|sort -u|head -n1`\n\t[ -z \"$tmp_mac\" ] && local tmp_mac=`cat /proc/net/arp|grep \"0x2\\|0x6\"|grep -w ${1}|awk '{print $4}'|grep -v \"^$\"|sort -u|head -n1`\n\t[ -z \"$tmp_mac\" ] && local tmp_mac=\"unknown\"\n\techo \"$tmp_mac\"\n}\n\n# 查询主机名\nfunction getname(){\n\t[ -z \"$tmp_name\" ] && local tmp_name=`echo \"$device_aliases\"|grep -i $2|awk '{print $2}'|grep -v \"^$\"|sort -u|head -n1`\n\t[ -f \"${dir}ipAddress\" ] && [ -z \"$tmp_name\" ] && local tmp_name=`cat ${dir}ipAddress|grep -w ${1}|awk '{print $3}'|grep -v \"^$\"|sort -u|head -n1`\n\t[ -f \"${dir}tmp_downlist\" ] && [ -z \"$tmp_name\" ] && local tmp_name=`cat ${dir}tmp_downlist|grep -w ${1}|awk '{print $3}'|grep -v \"^$\"|sort -u|head -n1`\n\t( ! echo \"$tmp_name\"|grep -q -w \"unknown\\|*\" ) && [ ! -z \"$tmp_name\" ] && echo \"$tmp_name\" && return || unset tmp_name # 为unknown时重新读取\n\t[ -f \"/var/dhcp.leases\" ] && [ -z \"$tmp_name\" ] && local tmp_name=`cat /var/dhcp.leases|grep -w ${1}|awk '{print $4}'|grep -v \"^$\"|sort -u|head -n1`\n\t( ! echo \"$tmp_name\"|grep -q -w \"unknown\\|*\" ) && [ ! -z \"$tmp_name\" ] && echo \"$tmp_name\" && return || unset tmp_name # 为unknown时重新读取\n\t[ -z \"$dhcp_config\" ] && dhcp_config=`uci show dhcp|grep \"ip\\|mac\\|name\"`\n\tfor dhcp_config_str in \"host\" \"domain\"; do\n\t\tlocal dhcp_ip_n=`echo \"$dhcp_config\"|grep -w ^dhcp.@${dhcp_config_str}.*ip=.${1}|sed -nr 's#^dhcp.(.*).ip.*#\\1#gp'` 2>/dev/null\n\t\t[ ! -z \"$dhcp_ip_n\" ] && [ -z \"$tmp_name\" ] && local tmp_name=`uci get dhcp.${dhcp_ip_n}.name` 2>/dev/null\n\t\tlocal dhcp_mac_n=`echo \"$dhcp_config\"|grep -i ^dhcp.@${dhcp_config_str}.*mac=.${2}|sed -nr 's#^dhcp.(.*).mac.*#\\1#gp'` 2>/dev/null\n\t\t[ ! -z \"$dhcp_mac_n\" ] && [ -z \"$tmp_name\" ] && local tmp_name=`uci get dhcp.${dhcp_ip_n}.name` 2>/dev/null\n\t\t[ ! -z \"$tmp_name\" ] && break\n\tdone\n\t( ! echo \"$tmp_name\"|grep -q -w \"unknown\\|*\" ) && [ ! -z \"$tmp_name\" ] && echo \"$tmp_name\" && return || unset tmp_name # 为unknown时重新读取\n\t[ -f \"$oui_base\" ] && local tmp_name=$(cat $oui_base|grep -i $(echo \"$2\"|cut -c 1,2,4,5,7,8)|sed -nr 's#^.*16)..(.*)#\\1#gp'|sed 's/ /_/g')\n\t[ ! -z \"$oui_data\" ] && [ \"$oui_data\" -eq \"4\" ] && local tmp_name=$(curl -sS \"https://standards-oui.ieee.org/oui/oui.txt\"|grep -i $(echo \"$2\"|cut -c 1,2,4,5,7,8)|sed -nr 's#^.*16)..(.*)#\\1#gp'|sed 's/ /_/g')\n\t[ -z \"$tmp_name\" ] && local tmp_name=\"unknown\"\n\techo \"$tmp_name\"\n}\n\n# 查询设备接口\nfunction getinterface(){\n\t[ -f \"${dir}ipAddress\" ] && local ip_interface=`cat ${dir}ipAddress|grep -w ${1}|awk '{print $5}'|grep -v \"^$\"|sort -u|head -n1`\n\t[ -f \"${dir}tmp_downlist\" ] && [ -z \"$ip_interface\" ] && local ip_interface=`cat ${dir}tmp_downlist|grep -w ${1}|awk '{print $5}'|grep -v \"^$\"|sort -u|head -n1`\n\tif [ -z \"$ip_interface\" ] && [ ! -z \"$wlan_interface\" ]; then\n\t\tfor interface in $wlan_interface; do\n\t\t\tlocal ip_interface=`iw dev $interface station dump 2>/dev/null|grep Station|grep -i -w ${1}|sed -nr 's#^.*on (.*))#\\1#gp'` >/dev/null 2>&1\n\t\t\t[ ! -z \"$ip_interface\" ] && echo \"$ip_interface\" && return\n\t\tdone\n\tfi\n\t[ -z \"$ip_interface\" ] && local ip_interface=`cat /proc/net/arp|grep \"0x2\\|0x6\"|grep -i -w ${1}|awk '{print $6}'|grep -v \"^$\"|sort -u|head -n1`\n\techo \"$ip_interface\"\n}\n\n# ping\nfunction getping(){\n\t[ \"$iw_version\" ] && local wlan_online=`iw dev ${ip_interface} station dump|grep -i -w ${ip_mac}|grep Station` >/dev/null 2>&1\n\t[ \"$wlan_online\" ] && return 0\n\tfor i in `seq 1 ${3}`; do\n\t\t( ! echo \"$ip_ms\"|grep -q \"ms\" ) && local ip_ms=$( arping -I `cat /proc/net/arp|grep -w ${1}|awk '{print $6}'|grep -v \"^$\"|sort -u|head -n1` -c 20 -f -w ${2} $1 ) 2>/dev/null\n\t\t( ! echo \"$ip_ms\"|grep -q \"ms\" ) && local ip_ms=`ping -c 5 -w ${2} ${1}|grep -v '100% packet loss'` 2>/dev/null\n\t\t( ! echo \"$ip_ms\"|grep -q \"ms\" ) && sleep 1\n\tdone\n\t( echo \"$ip_ms\"|grep -q \"ms\" )\n}\n\n# CPU 占用率\nfunction getcpu(){\n\tlocal AT=$(cat /proc/stat|grep \"^cpu \"|awk '{print $2+$3+$4+$5+$6+$7+$8 \" \" $2+$3+$4+$7+$8}')\n\tsleep 3\n\tlocal BT=$(cat /proc/stat|grep \"^cpu \"|awk '{print $2+$3+$4+$5+$6+$7+$8 \" \" $2+$3+$4+$7+$8}')\n\tprintf \"%.01f%%\" $(echo ${AT} ${BT}|awk '{print (($4-$2)/($3-$1))*100}')\n}\n\n# 获取SOC温度 （取所有传感器温度最大值）\nfunction soc_temp(){\n\t[ -z \"$soc_code\" ] && local soctemp=`sensors 2>/dev/null|grep °C|sed -nr 's#^.*:.*\\+(.*)°C .*#\\1#gp'|sort -nr|head -n1`\n\t[ -z \"$soc_code\" ] && [ -z \"$soctemp\" ] && local soctemp=`cat /sys/class/thermal/thermal_zone*/temp 2>/dev/null|sort -nr|head -n1|cut -c-2`\n\t[ \"$soc_code\" == \"pve\" ] && [ ! -z \"$pve_host\" ] && local soctemp=`ssh -i ~/.ssh/id_rsa root@${pve_host} -p ${pve_port} sensors 2>/dev/null|grep °C|sed -nr 's#^.*:.*\\+(.*)°C .*#\\1#gp'|sort -nr|head -n1`\n\t[ ! -z \"$soctemp\" ] && echo \"$soctemp\" && return\n\t[ ! -z \"$soc_code\" ] && eval `echo \"$soc_code\"` 2>/dev/null\n}\n\n# 流量数据\nfunction usage(){\n\t[ ! -f \"/usr/sbin/wrtbwmon\" ] || [ ! \"$1\" ] && return\n\tif [ $1 == \"update\" ] ;then\n\t\tfunction version_le() { test \"$(echo \"$@\"|tr \" \" \"\\n\"|sort -n|head -n 1)\" == \"$1\"; }\n\t\tfunction version_ge() { test \"$(echo \"$@\"|tr \" \" \"\\n\"|sort -r|head -n 1)\" == \"$1\"; }\n\t\t[ ! -z \"$wr_version\" ] && ( version_ge \"${wr_version}\" \"1.2.0\" ) && wrtbwmon -f ${dir}usage.db 2>/dev/null && return\n\t\t[ ! -z \"$wr_version\" ] && ( version_le \"${wr_version}\" \"1.0.0\" ) || [ -z \"$wr_version\" ] && wrtbwmon update ${dir}usage.db 2>/dev/null && return\n\telif [ $1 == \"get\" ] ;then\n\t\t[ ! -f \"${dir}usage.db\" ] && [ ! \"$3\" ] && echo `bytes_for_humans 0` && return\n\t\t[ ! -f \"${dir}usage.db\" ] && [ \"$3\" ] && echo 0 && return\n\t\t[ -z \"$total_n\" ] && total_n=`cat ${dir}usage.db|head -n1|grep \"total\"|sed 's/,/\\n/g'|awk '/total/{print NR}'` 2>/dev/null\n\t\t[ -z \"$total_n\" ] && total_n=\"6\"\n\t\t[ \"$2\" ] && local tmptotal=`cat ${dir}usage.db|sed 's/,,,/,0,0,/g'|sed 's/,,/,0,/g'|sed 's/,/ /g'|grep -i -w ${2}|awk \"{print \"'$'$total_n\"}\"|grep -v \"^$\"|sort -u|head -n1` 2>/dev/null\n\t\t[ -z \"$tmptotal\" ] && local tmptotal=\"0\"\n\t\t[ ! \"$3\" ] && echo `bytes_for_humans ${tmptotal}` || echo \"$tmptotal\"\n\telif [ $1 == \"down\" ] ;then\n\t\t[ \"$2\" ] && sed -i \"/,${2},/d\" ${dir}usage.db 2>/dev/null\n\tfi\n}\n\n# 流量数据单位换算\nfunction bytes_for_humans {\n\t[ ! \"$1\" ] && return\n\t[ \"$1\" -gt 1073741824 ] && echo \"`awk 'BEGIN{printf \"%.2f\\n\",'$1'/'1073741824'}'` G\" && return\n\t[ \"$1\" -gt 1048576 ] && echo \"`awk 'BEGIN{printf \"%.2f\\n\",'$1'/'1048576'}'` M\" && return\n\t[ \"$1\" -gt 1024 ] && echo \"`awk 'BEGIN{printf \"%.2f\\n\",'$1'/'1024'}'` K\" && return\n\techo \"${1} bytes\"\n}\n\n# 设备异常流量检测\nfunction get_client_usage(){\n\t[ -z \"$client_usage\" ] && return\n\t[ \"$client_usage\" -ne \"1\" ] && return\n\t[ -z \"$client_usage_max\" ] && return\n\t[ -z \"$get_client_usage_time\" ] && get_client_usage_time=`date +%s`\n\t( echo $client_usage_max|sed -r 's/.*(.)$/\\1/'|grep -q \"K\\|k\" ) && client_usage_max=`expr ${client_usage_max%?} \\* 1024`\n\t( echo $client_usage_max|sed -r 's/.*(.)$/\\1/'|grep -q \"M\\|m\" ) && client_usage_max=`expr ${client_usage_max%?} \\* 1048576`\n\t( echo $client_usage_max|sed -r 's/.*(.)$/\\1/'|grep -q \"G\\|g\" ) && client_usage_max=`expr ${client_usage_max%?} \\* 1073741824`\n\t[ -z \"$client_usage_disturb\" ] && client_usage_disturb=\"0\"\n\t[ \"$client_usage_disturb\" -eq \"0\" ] && [ -f \"${dir}ipAddress\" ] && local MACLIST=`cat ${dir}ipAddress|awk '{print $2}'|grep -v \"^$\"|sort -u`\n\t[ \"$client_usage_disturb\" -eq \"1\" ] && [ ! -z \"$client_usage_whitelist\" ] && local MACLIST=`echo \"$client_usage_whitelist\"`\n\t[ -z \"$MACLIST\" ] && return\n\n\tif [ \"$((`date +%s`-$get_client_usage_time))\" -ge \"60\" ]; then\n\t\t> ${dir}client_usage_aliases\n\t\tfor mac in $MACLIST; do\n\t\t\t( ! cat ${dir}ipAddress|grep -q -i -w $mac|grep -v \"^$\"|sort -u|head -n1 ) && continue\n\t\t\techo \"$mac\" `usage get ${mac} bytes` >> ${dir}client_usage_aliases\n\t\t\t[ -f \"${dir}old_client_usage_aliases\" ] && get_client_usage_bytes=`cat ${dir}old_client_usage_aliases|grep -i -w $mac|awk '{print $2}'|grep -v \"^$\"|sort -u|head -n1` || continue\n\t\t\t[ -z \"$get_client_usage_bytes\" ] && get_client_usage_bytes=\"0\"\n\t\t\tif [ \"$((`usage get ${mac} bytes`-$get_client_usage_bytes))\" -ge \"$client_usage_max\" ]; then\n\t\t\t\tlocal ip=`cat ${dir}ipAddress|grep -i -w $mac|awk '{print $1}'|grep -v \"^$\"|sort -u|head -n1`\n\t\t\t\tlocal ip_name=`getname ${ip} ${mac}`\n\t\t\t\tlocal tmp_usage=$(bytes_for_humans $(expr `usage get ${mac} bytes` - ${get_client_usage_bytes}))\n\t\t\t\tlocal time_up=`cat ${dir}ipAddress|grep -w ${ip}|awk '{print $4}'|grep -v \"^$\"|sort -u|head -n1`\n\t\t\t\tlocal ip_total=`usage get $mac` && [ ! -z \"$ip_total\" ] && local ip_total=\"${str_linefeed}${str_tab}总计流量： ${str_space}${str_space}${str_space}${str_space}${ip_total}\"\n\t\t\t\tlocal time1=`date +%s`\n\t\t\t\tlocal time1=$(time_for_humans `expr ${time1} - ${time_up}`)\n\t\t\t\tif [ -z \"$title\" ]; then\n\t\t\t\t\ttitle=\"${ip_name} 流量异常\"\n\t\t\t\t\tcontent=\"${content}${str_splitline}${str_title_start}${font_red} 设备流量异常${font_end}${str_title_end}${str_linefeed}${str_tab}客户端名：${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP： ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC：${str_space}${str_space}${str_space}${str_space}${mac}$ip_total${str_linefeed}${str_tab}一分钟内流量： ${str_space}${str_space}${tmp_usage}${str_linefeed}${str_tab}在线时间： ${str_space}${str_space}${str_space}${str_space}${time1}\"\n\t\t\t\telif ( echo \"$title\"|grep -q \"流量异常\" ); then\n\t\t\t\t\ttitle=\"${ip_name} ${title}\"\n\t\t\t\t\tcontent=\"${content}${str_splitline}${str_tab}客户端名：${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP： ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC：${str_space}${str_space}${str_space}${str_space}${mac}$ip_total${str_linefeed}${str_tab}一分钟内流量： ${str_space}${str_space}${str_space}${tmp_usage}${str_linefeed}${str_tab}在线时间： ${str_space}${str_space}${str_space}${str_space}${time1}\"\n\t\t\t\telse\n\t\t\t\t\ttitle=\"设备状态变化\"\n\t\t\t\t\tcontent=\"${content}${str_splitline}${str_title_start}${font_red} 设备流量异常${font_end}${str_title_end}${str_linefeed}${str_tab}客户端名：${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP： ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC：${str_space}${str_space}${str_space}${str_space}${mac}$ip_total${str_linefeed}${str_tab}一分钟内流量： ${str_space}${str_space}${str_space}${tmp_usage}${str_linefeed}${str_tab}在线时间： ${str_space}${str_space}${str_space}${str_space}${time1}\"\n\t\t\t\tfi\n\t\t\tfi\n\t\tdone\n\t\tcat ${dir}client_usage_aliases > ${dir}old_client_usage_aliases\n\t\tget_client_usage_time=`date +%s`\n\tfi\n}\n\n# 时间单位换算\nfunction time_for_humans {\n\t[ ! \"$1\" ] && return\n\tif [ \"$1\" -lt 60 ]; then\n\t\techo \"${1} 秒\"\n\telif [ \"$1\" -lt 3600 ]; then\n\t\tlocal usetime_min=`expr $1 / 60`\n\t\tlocal usetime_sec=`expr $usetime_min \\* 60`\n\t\tlocal usetime_sec=`expr $1 - $usetime_sec`\n\t\techo \"${usetime_min} 分 ${usetime_sec} 秒\"\n\telif [ \"$1\" -lt 86400 ]; then\n\t\tlocal usetime_hour=`expr $1 / 3600`\n\t\tlocal usetime_min=`expr $usetime_hour \\* 3600`\n\t\tlocal usetime_min=`expr $1 - $usetime_min`\n\t\tlocal usetime_min=`expr $usetime_min / 60`\n\t\techo \"${usetime_hour} 小时 ${usetime_min} 分\"\n\telse\n\t\tlocal usetime_day=`expr $1 / 86400`\n\t\tlocal usetime_hour=`expr $usetime_day \\* 86400`\n\t\tlocal usetime_hour=`expr $1 - $usetime_hour`\n\t\tlocal usetime_hour=`expr $usetime_hour / 3600`\n\t\techo \"${usetime_day} 天 ${usetime_hour} 小时\"\n\tfi\n}\n\n# 计算字符真实长度\nfunction length_str {\n\t[ ! \"$1\" ] && return\n\tlocal length_zh=`echo \"$1\"|awk '{print gensub(/[\\u4e00-\\u9FA5A-Za-z0-9_]/,\"\",\"g\",$0)}'|awk -F \"\" '{print NF}'`\n\tlocal length_en=`echo \"$1\"|awk '{print gensub(/[^\\u4e00-\\u9FA5A-Za-z0-9_]/,\"\",\"g\",$0)}'|awk -F \"\" '{print NF}'`\n\techo `expr $length_zh / 3 \\* 2 + $length_en`\n}\n\n# 截取字符，避免中文乱码\nfunction cut_str {\n\t[ ! \"$1\" ] && return\n\t[ ! \"$2\" ] && return\n\t[ `length_str $1` -le \"$2\" ] && echo \"$1\" && return\n\tlocal temp_length=$2\n\twhile [ $(length_str `echo \"$1\"|cut -c -$temp_length`) -lt \"$2\" ]; do\n\t\ttemp_length=`expr $temp_length + 1`\n\tdone\n\twhile [ $(printf \"%d\" \\'`echo \"$1\"|cut -c $temp_length`) -ge \"128\" ] && [ $(printf \"%d\" \\'`echo \"$1\"|cut -c $temp_length`) -lt \"224\" ]; do\n\t\ttemp_length=`expr $temp_length + 1`\n\tdone\n\ttemp_length=`expr $temp_length - 1`\n\techo $(echo \"$1\"|cut -c -$temp_length)\"...\"\n}\n\n# 随机数\nfunction rand(){\n    local min=$1\n    local max=$(($2- $min + 1))\n    local num=$(date +%s%N)\n    echo $(($num % $max + $min))\n}\n\n# 在线设备列表\nfunction pushbot_first(){\n\t[ -f \"${dir}ipAddress\" ] && local IPLIST=`cat ${dir}ipAddress|awk '{print $1}'|grep -v \"^$\"|sort -u`\n\tfor ip in $IPLIST; do\n\t\tread -u 5\n\t\t{\n\t\t\tdown $ip\n\t\t\techo \"\" >&5\n\t\t}&\n\tdone\n\twait\n\tunset ip IPLIST\n\tlocal IPLIST=`cat /proc/net/arp|grep \"0x2\\|0x6\"|awk '{print $1}'|grep -v \"^169.254.\"|grep -v \"^$\"|sort -u|grep -oE '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}'`\n\tfor ip in $IPLIST; do\n\t\tread -u 5\n\t\t{\n\t\t\tup $ip\n\t\t\techo \"\" >&5\n\t\t}&\n\tdone\n\twait\n}\n# 创建计划任务\nfunction pushbot_cron(){\n\tfunction del_cron(){\n\t\t( echo `crontab -l 2>/dev/null`|grep -q \"pushbot\" ) && crontab -l > conf && sed -i \"/pushbot/d\" conf && crontab conf && rm -f conf >/dev/null 2>&1\n\t}\n\tfunction re_cron(){\n\t\t/etc/init.d/cron stop\n\t\t/etc/init.d/cron start\n\t}\n\tdel_cron\n\tif [ -z \"$pushbot_enable\" ]; then\n\t\tre_cron\n\t\treturn\n\tfi\n\n\t# 重置流量\n\tif [ ! -z \"$reset_regularly\" ] && [ \"$reset_regularly\" -eq \"1\" ]; then\n\t\tcrontab -l 2>/dev/null > conf && echo -e \"0 0 * * * rm /tmp/pushbot/usage.db >/dev/null 2>&1\" >> conf && crontab conf && rm -f conf >/dev/null 2>&1\n\t\tcrontab -l 2>/dev/null > conf && echo -e \"0 0 * * * rm /tmp/pushbot/usage6.db >/dev/null 2>&1\" >> conf && crontab conf && rm -f conf >/dev/null 2>&1\n\tfi\n\t[ ! -z \"$regular_time_2\" ] && local regular_time_2=\",${regular_time_2}\"\n\t[ ! -z \"$regular_time_3\" ] && local regular_time_3=\",${regular_time_3}\"\n\t# 定时发送\n\tif [ ! -z \"$regular_time\" ] || [ ! -z \"$regular_time_2\" ] || [ ! -z \"$regular_time_3\" ]; then\n\t\tcrontab -l 2>/dev/null > conf && echo -e \"0 $regular_time$regular_time_2$regular_time_3 * * * /usr/bin/pushbot/pushbot send &\" >> conf && crontab conf && rm -f conf >/dev/null 2>&1\n\t# 间隔发送\n\telif [ ! -z \"$interval_time\" ]; then\n\t\tcrontab -l 2>/dev/null > conf && echo -e \"0 */$interval_time * * * /usr/bin/pushbot/pushbot send &\" >> conf && crontab conf && rm -f conf >/dev/null 2>&1\n\tfi\n\tre_cron\n}\n\n# 免打扰检测\nfunction pushbot_disturb(){\n\t[ -z \"$pushbot_sheep\" ] || [ -z \"$starttime\" ] || [ -z \"$endtime\" ] && return 0\n\tif [ `date +%H` -ge $endtime -a $starttime -lt $endtime ] || [ `date +%H` -lt $starttime -a $starttime -lt $endtime ] || [ `date +%H` -lt $starttime -a `date +%H` -ge $endtime -a $starttime -gt $endtime ]; then\n\t\tunset sheep_starttime\n\t\trm -f ${dir}sheep_usage ${dir}old_sheep_usage  2>/dev/null\n\t\tdisturb_text=`/usr/bin/jq -r '._api' ${jsonpath}`\n\t\treturn 0\n\telse\n\t\t[ -z \"$sheep_starttime\" ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【免打扰】夜深了，该休息了\" >> ${logfile} && sheep_starttime=`date +%s`\n\t\tif [ \"$pushbot_sheep\" -eq \"1\" ] ;then\n\t\t\twhile [ `date +%H` -lt \"$endtime\" ]; do\n\t\t\t\tenable_detection\n\t\t\t\tsleep $sleeptime\n\t\t\tdone\n\t\telif  [ \"$pushbot_sheep\" -eq \"2\" ] ;then\n\t\t\tdisturb_text=\"【免打扰】\"\n\t\t\treturn 1\n\t\tfi\n\tfi\n}\n\n# 文件锁\nfunction LockFile(){\n\tif [ $1 = \"lock\" ] ;then\n\t\t[ ! -f \"${dir}pushbot.lock\" ] && > ${dir}pushbot.lock && return\n\t\twhile [ -f \"${dir}pushbot.lock\" ]; do\n\t\t\tenable_detection 1\n\t\tdone\n\t\tLockFile lock\n\tfi\n\t[ $1 = \"unlock\" ] && rm -f ${dir}pushbot.lock >/dev/null 2>&1\n\treturn 0\n}\n\n# 检测黑白名单\nfunction blackwhitelist(){\n\t[ ! \"$1\" ] && return 1\n\t[ -z \"$pushbot_whitelist\" ] && [ -z \"$pushbot_blacklist\" ] && [ -z \"$pushbot_interface\" ] && [ -z \"$MAC_online_list\" ] && [ -z \"$MAC_offline_list\" ] && return 0\n\t[ ! -z \"$pushbot_whitelist\" ] && ( echo \"$pushbot_whitelist\"|grep -q -i -w $1 ) && return 1\n\t[ ! -z \"$pushbot_blacklist\" ] && ( ! echo \"$pushbot_blacklist\"|grep -q -i -w $1 ) && return 1\n\t[ ! -z \"$pushbot_interface\" ] && ( ! echo `getinterface ${1}`|grep -q -i -w $pushbot_interface ) && return 1\n\t[ ! -z \"$MAC_online_list\" ] && [ ! -z \"$mac_online_status\" ] && return 1\n\t[ ! -z \"$MAC_online_list\" ] && ( echo \"$MAC_online_list\"|grep -q -i -w $1 ) && return 1\n\t[ ! -z \"$MAC_offline_list\" ] && [ -z \"$mac_online_status\" ] && return 1\n\treturn 0\n}\n\nfunction get_client(){\n\tif [ -f \"${dir}ipAddress\" ]; then\n\twhile read line; do\n\t\tlocal js_str=\"${js_str}<div class='tr placeholder'>\"\n\t\tlocal js_str=\"${js_str}<div class='th'><%:`echo \"$line\"|awk '{print $3}'`%></div>\"\n\t\tlocal tmp_mac=`echo \"$line\"|awk '{print $2}'`\n\t\tlocal js_str=\"${js_str}<div class='th'><%:${tmp_mac}%></div>\"\n\t\tlocal js_str=\"${js_str}<div class='th'><%:`echo \"$line\"|awk '{print $1}'`%></div>\"\n\t\tlocal tmp_usage=`usage get ${tmp_mac}`\n\t\tlocal js_str=\"${js_str}<div class='th'><%:${tmp_usage}%></div>\"\n\t\tlocal tmp_uptime=`echo \"$line\"|awk '{print $4}'`\n\t\tlocal tmp_timenow=`date +%s`\n\t\tlocal tmp_uptime=$(time_for_humans `expr ${tmp_timenow} - ${tmp_uptime}`)\n\t\tlocal js_str=\"${js_str}<div class='th'><%:${tmp_uptime}%></div></div>\"\n\tdone < ${dir}ipAddress\n\tfi\ncat>/usr/lib/lua/luci/view/pushbot/pushbot_client.htm<<EOF\n<h2><%:在线设备列表%></h2><div class=\"table\" id=\"traffic\"><div class=\"tr table-titles\"><div class=\"th\" id=\"thClient\" style=\"width:17%\"><%:客户端名%></div><div class=\"th\" id=\"thMAC\" style=\"width:10%\"><%:MAC%></div><div class=\"th\" id=\"thIP\" style=\"width:17%\"><%:IP%></div><div class=\"th\" id=\"thTotal\" style=\"width:9%\"><%:总计流量%></div><div class=\"th\" id=\"thFirstSeen\" style=\"width:15%\"><%:在线时间%></div></div>\n$js_str\n</div>\nEOF\n}\n\n# 重启网络服务\nfunction network_restart(){\ncat>${dir}network_restart<<EOF\n#!/bin/sh\n/etc/init.d/network restart >/dev/null 2>&1 &\n/etc/init.d/firewall restart >/dev/null 2>&1 &\n/etc/init.d/dnsmasq restart >/dev/null 2>&1 &\nEOF\n\tchmod 0755 ${dir}network_restart && ${dir}network_restart\n\trm -f ${dir}network_restart >/dev/null 2>&1\n}\n\n# 查看无人值守任务设备是否在线\nfunction geterrdevicealiases(){\n\t[ -z \"$err_device_aliases\" ] && return\n\t[ -f ${dir}ipAddress ] && local logrow=$(grep -c \"\" ${dir}ipAddress) || local logrow=\"0\";[ $logrow -eq \"0\" ] && return\n\tlocal MACLIST=`cat ${dir}ipAddress|awk '{print $2}'|grep -v \"^$\"|sort -u`\n\tfor mac in $MACLIST; do\n\t\t[ -z \"$err_mac\" ] && [ ! -z \"$mac\" ] && local err_mac=`echo \"$err_device_aliases\"|grep -i $mac|grep -v \"^$\"|sort -u|head -n1`\n\tdone\n\t# 进入免打扰时间已经超过一小时\n\tif [ ! -z \"$sheep_starttime\" ] && [ \"$((`date +%s`-$sheep_starttime))\" -ge \"3600\" ]; then\n\t\t> ${dir}sheep_usage\n\t\tlocal MACLIST=`echo \"$err_device_aliases\"|grep -v \"^$\"|sort -u`\n\t\tfor mac in $MACLIST; do\n\t\t\t[ ! -z \"$mac\" ] && local tmptotal=`usage get ${mac} bytes`\n\t\t\t[ ! -z \"$tmptotal\" ] && awk 'BEGIN{printf \"%.0f\\n\",'$tmptotal'/'204800'}' 2>/dev/null >> ${dir}sheep_usage\n\t\tdone\n\t\told_sheep_usage=`cat ${dir}old_sheep_usage` 2>/dev/null\n\t\tsheep_usage=`cat ${dir}sheep_usage` 2>/dev/null\n\t\t[ \"$old_sheep_usage\" == \"$sheep_usage\" ] && [ -z \"$sheep_nousage_starttime\" ] && sheep_nousage_starttime=`date +%s`\n\t\t[ \"$old_sheep_usage\" != \"$sheep_usage\" ] && unset sheep_nousage_starttime && cat ${dir}sheep_usage 2>/dev/null > ${dir}old_sheep_usage\n\t\t[ ! -z \"$sheep_nousage_starttime\" ] && [ \"$((`date +%s`-$sheep_nousage_starttime))\" -ge \"300\" ] && unset err_mac\n\tfi\n\t[ -z \"$err_mac\" ]\n}\n\n# 无人值守任务\nfunction unattended(){\n\t[ -z \"$err_enable\" ] || [ \"$err_enable\" -ne \"1\" ] && return\n\t[ ! -z \"$err_sheep_enable\" ] && [ \"$err_sheep_enable\" -eq \"1\" ] && [ -z \"$sheep_starttime\" ] && return\n\tgeterrdevicealiases;[ $? -eq \"1\" ] && return\n\n\tif [ ! -z \"$system_time_event\" ]; then\n\t\tlocal interfaceuptime=`getinterfaceuptime`\n\t\tif [ ! -z \"$autoreboot_time\" ] && [ `cat /proc/uptime|awk -F. '{run_hour=$1/3600;printf(\"%d\",run_hour)}'` -ge \"$autoreboot_time\" ] && [ \"$system_time_event\" -eq \"1\" ]; then\n\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【无人值守任务】重启路由器咯\" >> ${logfile}\n\t\t\tcat ${logfile} > /usr/bin/pushbot/errlog\n\t\t\tsleep 2 && reboot && exit\n\t\telif [ ! -z \"$network_restart_time\" ] && [ ! -z \"$interfaceuptime\" ] && [ `echo \"$interfaceuptime\"|awk -F. '{run_hour=$1/3600;printf(\"%d\",run_hour)}'` -ge \"$network_restart_time\" ] && [ \"$system_time_event\" -eq \"2\" ]; then\n\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【无人值守任务】重新拨号咯\" >> ${logfile}\n\t\t\tifup wan >/dev/null 2>&1\n\t\t\tsleep 60\n\t\tfi\n\tfi\n\n\t[ -z \"$public_ip_today\" ] && public_ip_today=`date +\"%d\"`\n\t[ -z \"$public_ip_count\" ] && public_ip_count=\"0\"\n\t[ $public_ip_today -ne `date +\"%d\"` ] && public_ip_today=`date +\"%d\"` && public_ip_count=1\n\tif [ ! -z \"$public_ip_event\" ] && [ ! -z \"$public_ip_retry_count\" ] && [ \"$public_ip_count\" -le \"$public_ip_retry_count\" ]; then\n\t\tpublic_ip_count=`expr $public_ip_count + 1`\n\t\tlocal wanIP=`getip wanipv4`\n\t\tlocal hostIP=`getip hostipv4`\n\t\tif [ ! -z \"$wanIP\" ] && [ ! -z \"$hostIP\" ] && ( ! echo \"$wanIP\"|grep -q -w ${hostIP} );then\n\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【无人值守任务】重拨尝试获取公网 ip，当前第 $public_ip_count 次 \" >> ${logfile}\n\t\t\tifup wan >/dev/null 2>&1\n\t\t\tsleep 60\n\t\t\tlocal wanIP=`getip wanipv4` && local hostIP=`getip hostipv4`\n\t\t\t[ ! -z \"$pushbot_ipv4\" ] && [ \"$pushbot_ipv4\" -eq \"1\" ] && local IPv4=${wanIP}\n\t\t\t[ ! -z \"$pushbot_ipv4\" ] && [ \"$pushbot_ipv4\" -eq \"2\" ] && local IPv4=${hostIP}\n\t\t\t[ ! -z \"$pushbot_ipv6\" ] && [ \"$pushbot_ipv6\" -eq \"1\" ] && local IPv6=`getip wanipv6`\n\t\t\t[ ! -z \"$pushbot_ipv6\" ] && [ \"$pushbot_ipv6\" -eq \"2\" ] && local IPv6=`getip hostipv6`\n\t\t\t[ ! -z \"$wanIP\" ] && [ ! -z \"$hostIP\" ] && ( ! echo \"$wanIP\"|grep -q -w ${hostIP} ) && echo IPv4 $IPv4 > ${dir}ip && echo -e IPv6 $last_IPv6 >> ${dir}ip\n\t\tfi\n\tfi\n}\n\n# 检测网络状态\nfunction rand_geturl(){\n\tfunction getcheck(){\n\t\tlocal urllist=\"https://www.163.com https://www.qq.com https://www.baidu.com https://www.qidian.com https://www.douban.com\"\n\t\tlocal url_number=`expr $(echo \"$urllist\"|grep -o ' '|wc -l) + 1`\n\t\tlocal url_str=`echo \"$urllist\"|awk -v i=$(rand 1 $url_number) '{print $i}'`\n\t\techo `curl -k -s -w \"%{http_code}\" -m 5 ${url_str} -A \"Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36\" -o /dev/null`\n\t}\n\tlocal check=`getcheck`\n\twhile [ -z \"$check\" ] || [ \"$check\" -ne \"200\" ]; do\n\t\tlocal check=`getcheck`\n\t\tif [ ! -z \"$check\" ] && [ \"$check\" -eq \"200\" ]; then\n\t\t\t[ ! -z \"$network_enable\" ] && [ \"$network_enable\" -eq \"404\" ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【网络状态】网络恢复正常..\" >> ${logfile}\n\t\t\tlocal network_enable=\"200\"\n\t\telse\n\t\t\t[ -z \"$network_enable\" ] || [ \"$network_enable\" -eq \"200\" ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！！】当前网络不通！停止检测！ \" >> ${logfile}\n\t\t\tlocal network_enable=\"404\"\n\t\t\t[ -z \"$network_err_time\" ] && network_err_time=`date +%s`\n\t\t\tif [ ! -z \"$network_err_event\" ] && [ \"$((`date +%s`-$network_err_time))\" -ge \"600\" ]; then\n\t\t\t\t> ${dir}send_enable.lock && pushbot_first && deltemp\n\t\t\t\tgeterrdevicealiases\n\t\t\t\tif [ \"$?\" -eq \"0\" ]; then\n\t\t\t\t\t[ -f /usr/bin/pushbot/autoreboot_count ] && retry_count=`cat /usr/bin/pushbot/autoreboot_count` && rm -f /usr/bin/pushbot/autoreboot_count >/dev/null 2>&1\n\t\t\t\t\t[ ! -z ${retry_count} ] && retry_count=0;retry_count=`expr $retry_count + 1`\n\t\t\t\t\tif [ \"$network_err_event\" -eq \"1\" ] ;then\n\t\t\t\t\t\tif [ \"$retry_count\" -lt \"3\" ] ;then\n\t\t\t\t\t\t\techo \"$retry_count\" > /usr/bin/pushbot/autoreboot_count\n\t\t\t\t\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！！】正在尝试重启路由，当前第 $retry_count 次 \" >> ${logfile}\n\t\t\t\t\t\t\tcat ${logfile} > /usr/bin/pushbot/errlog\n\t\t\t\t\t\t\tsleep 2 && reboot && exit\n\t\t\t\t\t\tfi\n\t\t\t\t\t\t[ \"$retry_count\" -eq \"3\" ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！！】已经重启路由2次，修复失败，请主人自行修复哦\" >> ${logfile}\n\t\t\t\t\telif [ \"$network_err_event\" -eq \"2\" ] ;then\n\t\t\t\t\t\t[ \"$retry_count\" -lt \"3\" ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！！】正在尝试重启网络，当前第 $retry_count 次 \" >> ${logfile} && ifup wan >/dev/null 2>&1\n\t\t\t\t\t\t[ \"$retry_count\" -eq \"3\" ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！！】已经重启网络2次，修复失败，请主人自行修复哦 \" >> ${logfile}\n\t\t\t\t\telif [ \"$network_err_event\" -eq \"3\" ] ;then\n\t\t\t\t\t\tif [ \"$retry_count\" -eq \"1\" ] ;then\n\t\t\t\t\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！！】正在尝试修复网络，当前第 1 次，重启网络服务中 \" >> ${logfile} && network_restart\n\t\t\t\t\t\telif [ \"$retry_count\" -eq \"2\" ] ;then\n\t\t\t\t\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！！】正在尝试修复网络，当前第 2 次，关闭可能造成网络断开的软件\" >> ${logfile}\n\t\t\t\t\t\t\t[ `uci get koolproxy.@global[0].enabled 2>/dev/null` -eq \"1\" ] && [ `uci get koolproxy.@global[0].koolproxy_mode 2>/dev/null` -eq \"1\" ] && /etc/init.d/koolproxy stop >/dev/null 2>&1\n\t\t\t\t\t\t\t[ `uci get adbyby.@adbyby[0].enable 2>/dev/null` -eq \"1\" ] && [ `uci get adbyby.@adbyby[0].wan_mode 2>/dev/null` -eq \"0\" ] && /etc/init.d/adbyby stop >/dev/null 2>&1\n\t\t\t\t\t\t\t[ `uci get passwall.@global[0].enabled 2>/dev/null` -eq \"1\" ] && [ `uci get passwall.@global[0].proxy_mode 2>/dev/null|grep global` ] && /etc/init.d/koolproxy stop >/dev/null 2>&1\n\t\t\t\t\t\t\tlocal shadowsocksr_enabled=`uci get shadowsocksr.@global[0].global_server 2>/dev/null|grep nil`\n\t\t\t\t\t\t\tlocal shadowsocksr_run_mode=`uci get shadowsocksr.@global[0].run_mode 2>/dev/null|grep all`\n\t\t\t\t\t\t\t[ -z \"$shadowsocksr_enabled\" ] && [ ! -z \"$shadowsocksr_run_mode\" ] && /etc/init.d/shadowsocksr stop >/dev/null 2>&1\n\t\t\t\t\t\t\tsleep 60 && network_restart\n\t\t\t\t\t\telif [ \"$retry_count\" -eq \"3\" ] ;then\n\t\t\t\t\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！！】正在尝试修复网络，当前第 3 次，备份设置项，并修改相关设置\" >> ${logfile}\n\t\t\t\t\t\t\tmkdir -p /usr/bin/pushbot/configbak\n\t\t\t\t\t\t\tcp -p -f /etc/config/network /usr/bin/pushbot/configbak/network\n\t\t\t\t\t\t\tcp -p -f /etc/config/dhcp /usr/bin/pushbot/configbak/dhcp\n\t\t\t\t\t\t\tcp -p -f /etc/config/firewall /usr/bin/pushbot/configbak/firewall\n\t\t\t\t\t\t\tcp -p -f /etc/firewall.user /usr/bin/pushbot/configbak/firewall.user\n\t\t\t\t\t\t\tuci set network.wan.peerdns='0'\n\t\t\t\t\t\t\tuci delete network.wan.dns\n\t\t\t\t\t\t\tuci add_list network.wan.dns='223.5.5.5'\n\t\t\t\t\t\t\tuci add_list network.wan.dns='119.29.29.29'\n\t\t\t\t\t\t\tuci delete network.wan.mtu\n\t\t\t\t\t\t\tuci commit network\n\t\t\t\t\t\t\tuci set dhcp.@dnsmasq[0].port='53'\n\t\t\t\t\t\t\tuci set dhcp.@dnsmasq[0].resolvfile='/tmp/resolv.conf.auto'\n\t\t\t\t\t\t\tuci delete dhcp.@dnsmasq[0].server\n\t\t\t\t\t\t\tuci delete dhcp.@dnsmasq[0].noresolv\n\t\t\t\t\t\t\tuci commit dhcp\n\t\t\t\t\t\t\tuci delete firewall.redirect\n\t\t\t\t\t\t\t>/etc/firewall.user\n\t\t\t\t\t\t\tuci commit firewall\n\t\t\t\t\t\t\tsleep 60 && network_restart\n\t\t\t\t\t\telif [ \"$retry_count\" -eq \"4\" ] ;then\n\t\t\t\t\t\t\techo \"$retry_count\" > /usr/bin/pushbot/autoreboot_count\n\t\t\t\t\t\t\tcat ${logfile} > /usr/bin/pushbot/errlog\n\t\t\t\t\t\t\tsleep 2 && reboot && exit\n\t\t\t\t\t\telif [ \"$retry_count\" -eq \"5\" ] ;then\n\t\t\t\t\t\t\techo \"$retry_count\" > /usr/bin/pushbot/autoreboot_count\n\t\t\t\t\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！！】修复失败，还原设置中，请自行检查网络设置\" >> ${logfile}\n\t\t\t\t\t\t\tcp -p -f /usr/bin/pushbot/configbak/network /etc/config/network\n\t\t\t\t\t\t\tcp -p -f /usr/bin/pushbot/configbak/dhcp /etc/config/dhcp\n\t\t\t\t\t\t\tcp -p -f /usr/bin/pushbot/configbak/firewall /etc/config/firewall\n\t\t\t\t\t\t\tcp -p -f /usr/bin/pushbot/configbak/firewall.user /etc/firewall.user\n\t\t\t\t\t\t\tcat ${logfile} > /usr/bin/pushbot/errlog\n\t\t\t\t\t\t\tsleep 2 && reboot && exit\n\t\t\t\t\t\tfi\n\t\t\t\t\tfi\n\t\t\t\tfi\n\t\t\telif [ -f /usr/bin/pushbot/autoreboot_count ]; then\n\t\t\t\tnetwork_err_time=`expr $network_err_time - 600` && sleep 60\n\t\t\tfi\n\t\t\tenable_detection\n\t\t\tsleep $sleeptime\n\t\tfi\n\tcontinue\n\tdone\n\trm -f /usr/bin/pushbot/autoreboot_count >/dev/null 2>&1\n}\n\n# 检测 ip 状况\nfunction ip_changes(){\n\t[ ! -z \"$pushbot_ipv4\" ] && [ \"$pushbot_ipv4\" -eq \"1\" ] && local IPv4=`getip wanipv4`\n\t[ ! -z \"$pushbot_ipv4\" ] && [ \"$pushbot_ipv4\" -eq \"2\" ] && local IPv4=`getip hostipv4`\n\t[ ! -z \"$pushbot_ipv6\" ] && [ \"$pushbot_ipv6\" -eq \"1\" ] && local IPv6=`getip wanipv6`\n\t[ ! -z \"$pushbot_ipv6\" ] && [ \"$pushbot_ipv6\" -eq \"2\" ] && local IPv6=`getip hostipv6`\n\n\tif [ -f ${dir}ip ]; then\n\t\tlocal last_IPv4=$(cat \"${dir}ip\"|grep IPv4|awk '{print $2}'|grep -v \"^$\"|sort -u|head -n1)\n\t\tlocal last_IPv6=$(cat \"${dir}ip\"|grep IPv6|awk '{print $2}'|grep -v \"^$\"|sort -u|head -n1)\n\t\tif [ ! -z \"$pushbot_ipv4\" ] && [ \"$pushbot_ipv4\" -ne \"0\" ] && [ ! -z \"$IPv4\" ] && ( ! echo ${IPv4}|grep -w -q ${last_IPv4} ); then\n\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` ${disturb_text}当前IP：${IPv4}\" >> ${logfile}\n\t\t\techo IPv4 $IPv4 > ${dir}ip && echo -e IPv6 $last_IPv6 >> ${dir}ip\n\t\t\ttitle=\"IP 地址变化\"\n\t\t\tcontent=\"${content}${str_splitline}${str_title_start}${font_green} IP 地址变化${font_end}${str_title_end}${str_linefeed}${str_tab}当前 IP：${IPv4}\"\n\t\telif [ ! -z \"$pushbot_ipv4\" ] && [ \"$pushbot_ipv4\" -ne \"0\" ] && [ -z \"$IPv4\" ]; then\n\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】获取 IPv4 地址失败\" >> ${logfile}\n\t\tfi\n\n\t\tif [ ! -z \"$pushbot_ipv6\" ] && [ \"$pushbot_ipv6\" -ne \"0\" ] && [ ! -z \"$IPv6\" ] && ( ! echo \"$IPv6\"|grep -w -q ${last_IPv6} ); then\n\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` ${disturb_text}当前IPv6：${IPv6}\" >> ${logfile}\n\t\t\techo IPv4 $IPv4 > ${dir}ip && echo -e IPv6 $IPv6 >> ${dir}ip\n\t\t\t[ -z \"$title\" ] && title=\"IPv6 地址变化\"\n\t\t\t[ ! -z \"$title\" ] && title=\"IP 地址变化\"\n\t\t\tcontent=\"${content}${str_splitline}${str_title_start}${font_green} IPv6 地址变化${font_end}${str_title_end}${str_linefeed}${str_tab}当前 IPv6：${IPv6}\"\n\t\telif [ ! -z \"$pushbot_ipv6\" ] && [ \"$pushbot_ipv6\" -ne \"0\" ] && [ -z \"$IPv6\" ]; then\n\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】获取 IPv6 地址失败\" >> ${logfile}\n\t\tfi\n\n\telse\n\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` ${disturb_text}路由器已经重启!\" >> ${logfile}\n\t\t[ ! -z \"$pushbot_ipv4\" ] && [ \"$pushbot_ipv4\" -ne \"0\" ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"`  当前IP: ${IPv4}\" >> ${logfile}\n\t\t[ ! -z \"$pushbot_ipv6\" ] && [ \"$pushbot_ipv6\" -ne \"0\" ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"`  当前IPv6: ${IPv6}\" >> ${logfile}\n\t\techo IPv4 $IPv4 > ${dir}ip && echo -e IPv6 $IPv6 >> ${dir}ip\t\n\t\ttitle=\"路由器重新启动\"\n\t\tcontent=\"${content}${str_splitline}${str_title_start}${font_green} 路由器重新启动${font_end}${str_title_end}\"\n\t\t[ ! -z \"$pushbot_ipv4\" ] && [ \"$pushbot_ipv4\" -ne \"0\" ] && content=\"${content}${str_linefeed}${str_tab}当前IP：${IPv4}\"\n\t\t[ ! -z \"$pushbot_ipv6\" ] && [ \"$pushbot_ipv6\" -ne \"0\" ] && content=\"${content}${str_linefeed}${str_tab}当前IPv6：${IPv6}\"\n\tfi\n\n\tif [ ! -z \"$content\" ] ;then\n\t\t[ -z \"$ddns_enabled\" ] && ddns_enabled=$(uci show ddns|grep \"enabled\"|grep \"1\")\n\t\t[ -z \"$ddns_enabled\" ] && ddns_logrow=0 || ddns_logrow=$(echo \"$ddns_enabled\"|wc -l)\n\t\tif [ $ddns_logrow -ge 1 ]; then\n\t\t\t/etc/init.d/ddns restart >/dev/null 2>&1\n\t\tfi\n\t\t[ -z \"$zerotier_enabled\" ] && zerotier_enabled=$(uci get zerotier.sample_config.enabled)\n\t\tif [ ! -z \"$zerotier_enabled\" ] && [ $zerotier_enabled -eq \"1\" ] ; then\n\t\t\t/etc/init.d/zerotier restart >/dev/null 2>&1\n\t\tfi\n\tfi\n}\n\n# 检测设备上线\nfunction up(){\n\t[ -f ${dir}ipAddress ] && ( cat ${dir}ipAddress|grep -q -w $1 ) && return\n\tlocal ip_mac=`getmac $1`\n\tlocal ip_name=`getname ${1} ${ip_mac}`\n\tlocal ip_interface=`getinterface ${ip_mac}`\n\tgetping ${1} ${up_timeout} \"1\";local ping_online=$?\n\tif [ \"$ping_online\" -eq \"0\" ]; then\n\t\tLockFile lock\n\t\t[ ! -z \"$pushbot_blacklist\" ] && local tmp_mac=`echo \"${pushbot_blacklist}\"|grep -w -i ${ip_mac}`\n\t\t[ ! -z \"$pushbot_whitelist\" ] && local tmp_mac=`echo \"${pushbot_whitelist}\"|grep -w -i ${ip_mac}`\n\t\tif [ ! -z \"$tmp_mac\" ] && ( cat ${dir}ipAddress|grep -q -w -i ${tmp_mac} ); then\n\t\t\tusage down $1\n\t\t\techo \"$1 ${ip_mac} ${ip_name} `date +%s` ${ip_interface}\" >> ${dir}ipAddress\n\t\t\tLockFile unlock && return\n\t\telif [ ! -z \"$tmp_mac\" ] && [ -f \"${dir}tmp_downlist\" ] && ( cat ${dir}tmp_downip|grep -q -w -i ${tmp_mac} ); then\n\t\t\tlocal tmp_downip=`cat ${dir}tmp_downlist|grep -w -i ${tmp_mac}|awk '{print $1}'|grep -v \"^$\"|sort -u|head -n1`\n\t\t\tusage down $tmp_downip\n\t\t\tsed -i \"/^${tmp_downip} /d\" ${dir}tmp_downlist\n\t\t\tLockFile unlock && return\n\t\tfi\n\t\t[ -f \"${dir}tmp_downlist\" ] && local tmp_downip=`cat ${dir}tmp_downlist|grep -w ${1}|grep -v \"^$\"|sort -u|head -n1`\n\t\tif [ ! -z \"$tmp_downip\" ]; then\n\t\t\tcat ${dir}tmp_downlist|grep -w ${1}|grep -v \"^$\"|sort -u|head -n1 >> ${dir}ipAddress\n\t\t\tsed -i \"/^${1} /d\" ${dir}tmp_downlist\n\t\telse\n\t\t\tusage down $1\n\t\t\techo \"$1 ${ip_mac} ${ip_name} `date +%s` ${ip_interface}\" >> ${dir}ipAddress\n\t\t\tblackwhitelist ${ip_mac};local ip_blackwhite=$?\n\t\t\t[ -f \"${dir}send_enable.lock\" ] || [ -z \"$pushbot_up\" ] || [ -z \"$ip_blackwhite\" ] && LockFile unlock && return\n\t\t\t[ ! -z \"$pushbot_up\" ] && [ \"$pushbot_up\" -ne \"1\" ] && LockFile unlock && return\n\t\t\t[ -z \"$ip_blackwhite\" ] || [ \"$ip_blackwhite\" -ne \"0\" ] && LockFile unlock && return\n\t\t\t[ -f \"${dir}title\" ] && local title=`cat ${dir}title`\n\t\t\t[ -f \"${dir}content\" ] && local content=`cat ${dir}content`\n\t\t\tif [ -z \"$title\" ]; then\n\t\t\t\tlocal title=\"$ip_name 连接了你的路由器\"\n\t\t\t\tlocal content=\"${str_splitline}${str_title_start}${font_green} 新设备连接${font_end}${str_title_end}${str_linefeed}${str_tab}客户端名：${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP： ${str_space}${str_space}${str_space}${str_space}${1}${str_linefeed}${str_tab}客户端MAC：${str_space}${str_space}${str_space}${str_space}${ip_mac}${str_linefeed}${str_tab}网络接口：${str_space}${str_space}${str_space}${str_space}${str_space}${ip_interface}\"\n\t\t\telif ( echo ${title}|grep -q \"连接了你的路由器\" ); then\n\t\t\t\tlocal title=\"${ip_name} ${title}\"\n\t\t\t\tlocal content=\"${str_splitline}${str_tab}客户端名：${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP： ${str_space}${str_space}${str_space}${str_space}${1}${str_linefeed}${str_tab}客户端MAC：${str_space}${str_space}${str_space}${str_space}${ip_mac}${str_linefeed}${str_tab}网络接口：${str_space}${str_space}${str_space}${str_space}${str_space}${ip_interface}\"\n\t\t\telse\n\t\t\t\tlocal title=\"设备状态变化\"\n\t\t\t\tlocal content=\"${str_splitline}${str_title_start}${font_green} 新设备连接${font_end}${str_title_end}${str_linefeed}${str_tab}客户端名：${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP： ${str_space}${str_space}${str_space}${str_space}${1}${str_linefeed}${str_tab}客户端MAC：${str_space}${str_space}${str_space}${str_space}${ip_mac}${str_linefeed}${str_tab}网络接口：${str_space}${str_space}${str_space}${str_space}${str_space}${ip_interface}\"\n\t\t\tfi\n\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` ${disturb_text}新设备 ${ip_name} ${1} 连接了\">> ${logfile}\n\t\t\t#[ ! -z \"$pushbot_blacklist\" ] && local title=\"你偷偷关注的设备上线了\"\n\t\t\t[ ! -z \"$title\" ] && echo \"$title\" >${dir}title\n\t\t\t[ ! -z \"$content\" ] && echo -n \"$content\" >>${dir}content\n\t\tfi\n\tfi\n\tLockFile unlock\n}\n\n# 检测设备离线\nfunction down(){\n\tlocal ip_mac=`getmac $1`\n\tlocal ip_name=`getname ${1} ${ip_mac}`\n\tlocal ip_interface=`getinterface ${ip_mac}`\n\tgetping ${1} ${down_timeout} ${timeout_retry_count};local ping_online=$?\n\tif [ \"$ping_online\" -eq \"1\" ]; then\n\t\tLockFile lock\n\t\t[ ! -f \"${dir}send_enable.lock\" ] && cat ${dir}ipAddress|grep -w ${1}|grep -v \"^$\"|sort -u|head -n1 >> ${dir}tmp_downlist\n\t\tsed -i \"/^${1} /d\" ${dir}ipAddress\n\t\tLockFile unlock\n\telse\n\t\tlocal tmp_name=`cat ${dir}ipAddress|grep -w ${1}|awk '{print $3}'|grep -v \"^$\"|sort -u|head -n1`\n\t\tif [ \"$ip_name\" != \"$tmp_name\" ]; then\n\t\t\tLockFile lock\n\t\t\tlocal tmp_str=$(echo \"$1 ${ip_mac} ${ip_name} `cat ${dir}ipAddress|grep -w ${1}|awk '{print $4}'|grep -v \"^$\"|sort -u|head -n1` ${ip_interface}\")\n\t\t\tsed -i \"/^${1} /d\" ${dir}ipAddress\n\t\t\techo \"$tmp_str\" >> ${dir}ipAddress\n\t\t\tLockFile unlock\n\t\tfi\n\tfi\n}\n\n# 设备离线通知\nfunction down_send(){\n\t[ ! -f \"${dir}tmp_downlist\" ] && return\n\tlocal IPLIST=`cat ${dir}tmp_downlist|awk '{print $1}'`\n\tfor ip in $IPLIST; do\n\t\tlocal ip_mac=`getmac ${ip}`\n\t\tblackwhitelist ${ip_mac};local ip_blackwhite=$?\n\t\t[ -z \"$pushbot_down\" ] || [ -z \"$ip_blackwhite\" ] && continue\n\t\t[ ! -z \"$pushbot_down\" ] && [ \"$pushbot_down\" -ne \"1\" ] && continue\n\t\t[ -z \"$ip_blackwhite\" ] || [ \"$ip_blackwhite\" -ne \"0\" ] && continue\n\t\t[ ! -z \"$pushbot_blacklist\" ] && local tmp_mac=`echo \"${pushbot_blacklist}\"|grep -w -i ${ip_mac}`\n\t\t[ ! -z \"$pushbot_whitelist\" ] && local tmp_mac=`echo \"${pushbot_whitelist}\"|grep -w -i ${ip_mac}`\n\t\t[ ! -z \"$tmp_mac\" ] && ( cat ${dir}ipAddress|grep -q -w -i ${tmp_mac} ) && continue\n\t\tlocal ip_name=`getname ${ip} ${ip_mac}`\n\t\tlocal time_up=`cat ${dir}tmp_downlist|grep -w ${ip}|awk '{print $4}'|grep -v \"^$\"|sort -u|head -n1`\n\t\tlocal ip_total=`usage get $ip_mac` && [ ! -z \"$ip_total\" ] && local ip_total=\"${str_linefeed}${str_tab}总计流量： ${str_space}${str_space}${str_space}${str_space}${ip_total}\"\n\t\tlocal time1=`date +%s`\n\t\tlocal time1=$(time_for_humans `expr ${time1} - ${time_up}`)\n\t\tif [ -z \"$title\" ]; then\n\t\t\ttitle=\"${ip_name} 断开连接\"\n\t\t\tcontent=\"${content}${str_splitline}${str_title_start}${font_red} 设备断开连接${font_end}${str_title_end}${str_linefeed}${str_tab}客户端名：${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP： ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC：${str_space}${str_space}${str_space}${str_space}${ip_mac}$ip_total${str_linefeed}${str_tab}在线时间： ${str_space}${str_space}${str_space}${str_space}${time1}\"\n\t\telif ( echo \"$title\"|grep -q \"断开连接\" ); then\n\t\t\ttitle=\"${ip_name} ${title}\"\n\t\t\tcontent=\"${content}${str_splitline}${str_tab}客户端名：${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP： ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC：${str_space}${str_space}${str_space}${str_space}${ip_mac}$ip_total${str_linefeed}${str_tab}在线时间： ${str_space}${str_space}${str_space}${str_space}${time1}\"\n\t\telse\n\t\t\ttitle=\"设备状态变化\"\n\t\t\tcontent=\"${content}${str_splitline}${str_title_start}${font_red} 设备断开连接${font_end}${str_title_end}${str_linefeed}${str_tab}客户端名：${str_space}${str_space}${str_space}${str_space}${str_space}${ip_name}${str_linefeed}${str_tab}客户端IP： ${str_space}${str_space}${str_space}${str_space}${ip}${str_linefeed}${str_tab}客户端MAC：${str_space}${str_space}${str_space}${str_space}${ip_mac}$ip_total${str_linefeed}${str_tab}在线时间： ${str_space}${str_space}${str_space}${str_space}${time1}\"\n\t\tfi\n\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` ${disturb_text}设备 ${ip_name} ${ip} 断开连接 \" >> ${logfile}\n\tdone\n\trm -f ${dir}tmp_downlist >/dev/null 2>&1\n}\n\n# 当前设备列表\nfunction current_device(){\n\t( echo \"$lite_enable\"|grep -q \"content\" ) || ( echo \"$lite_enable\"|grep -q \"device\" ) && return\n\t[ -f ${dir}ipAddress ] && local logrow=$(grep -c \"\" ${dir}ipAddress) || local logrow=\"0\";[ $logrow -eq \"0\" ] && return\n\t[ -f ${dir}usage.db ] && local ip_total_db=\"总计流量${str_space}${str_space}${str_space}${str_space}\"\n\tcontent=\"${content}${str_splitline}${str_title_start}${font_blue} 现有在线设备 ${logrow} 台，具体如下${font_end}${str_title_end}${str_linefeed}${str_tab}IP 地址${str_space}${str_space}${str_space}${str_space}${str_space}${str_space}${str_space}${str_space}${str_space}${ip_total_db}${boldstar}客户端名${boldstar}\"\n\tlocal IPLIST=`cat ${dir}ipAddress|awk '{print $1}'`\n\tfor ip in $IPLIST; do\n\t\tlocal ip_mac=`getmac ${ip}`\n\t\tlocal ip_total=`usage get ${ip_mac}`\n\t\tlocal ip_name=`getname ${ip} ${ip_mac}`\n\t\tlocal ip_name=`cut_str $ip_name 15`\n\t\tif [ \"${#ip}\" -lt \"15\" ]; then\n\t\t\tlocal n=`expr 15 - ${#ip}`\n\t\t\tfor i in `seq 1 $n`; do\n\t\t\t\tlocal ip=\"${ip}${str_space}\"\n\t\t\tdone\n\t\t\tunset i n\n\t\tfi\n\t\tif [ ! -z \"$ip_total\" ]; then\n\t\t\tlocal n=`expr 11 - ${#ip_total}`\n\t\t\tfor i in `seq 1 $n`; do\n\t\t\t\tlocal ip_total=\"${ip_total}${str_space}\"\n\t\t\tdone\n\t\tfi\n\t\tcontent=\"${content}${str_linefeed}${str_tab}${ip}${ip_total}${boldstar}${font_green2}${ip_name}${font_end2}${boldstar}\"\n\t\tunset i n ip_total ip_mac ip_name\n\tdone\n}\n\n# 检测 cpu 状态\nfunction cpu_load(){\n\tif [ ! -z \"$temperature_enable\" ] && [ \"$temperature_enable\" -eq \"1\" ] && [ ! -z \"$temperature\" ]; then\n\t\t[ -z \"$temperature_time\" ] && temperature_time=`date +%s`\n\t\tlocal cpu_wendu=`soc_temp`;\n\t\t[ -z \"$cpu_wendu\" ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"`  【！！！】无法读取设备温度，请检查命令\" >> ${logfile}\n\n\t\tif [ `expr $cpu_wendu \\> $temperature` -eq \"1\" ]; then\n\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！警报！！】 CPU 温度过高: ${cpu_wendu}\" >> ${logfile}\n\t\telse\n\t\t\ttemperature_time=`date +%s`\n\t\tfi\n\n\t\tif [ \"$((`date +%s`-$temperature_time))\" -ge \"300\" ] && [ -z \"$temperaturecd_time\" ]; then\n\t\t\ttitle=\"CPU 温度过高！\"\n\t\t\ttemperaturecd_time=`date +%s`\n\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` ${disturb_text} CPU 温度过高: ${cpu_wendu}\" >> ${logfile}\n\t\t\tcontent=\"${content}${str_splitline}${str_title_start}${font_red} CPU 温度过高${font_end}${str_title_end}${str_linefeed}${str_tab}CPU 温度已连续五分钟超过预设${str_linefeed}${str_tab}接下来一小时不再提示${str_linefeed}${str_tab}当前温度：${cpu_wendu}℃\"\n\t\telif [ ! -z \"$temperaturecd_time\" ] && [ \"$((`date +%s`-$temperaturecd_time))\" -ge \"3300\" ] ;then\n\t\t\tunset temperaturecd_time\n\t\tfi\n\tfi\n\n\tif [ ! -z \"$cpuload_enable\" ] && [ \"$cpuload_enable\" -eq \"1\" ] && [ ! -z \"$cpuload\" ]; then\n\t\t[ -z \"$cpuload_time\" ] && cpuload_time=`date +%s`\n\t\tlocal cpu_fuzai=`cat /proc/loadavg|awk '{print $1}'` 2>/dev/null\n\t\t[ -z \"$cpu_fuzai\" ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"`  【！！！】无法读取设备负载，请检查命令\" >> ${logfile}\n\n\t\tif [ `expr $cpu_fuzai \\> $cpuload` -eq \"1\" ]; then\n\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！警报！！】 CPU 负载过高: ${cpu_fuzai}\" >> ${logfile}\n\t\t\tcputop log\n\t\telse\n\t\t\tcpuload_time=`date +%s`\n\t\tfi\n\n\t\tif [ \"$((`date +%s`-$cpuload_time))\" -ge \"300\" ] && [ -z \"$cpucd_time\" ]; then\n\t\t\tunset getlogtop\n\t\t\tif [ ! -z \"$title\" ] && ( echo \"$title\"|grep -q \"过高\" ); then\n\t\t\t\ttitle=\"设备报警！\"\n\t\t\telse\n\t\t\t\ttitle=\"CPU 负载过高！\"\n\t\t\tfi\n\t\t\tcpucd_time=`date +%s`\n\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` ${disturb_text} CPU 负 载过高: ${cpu_fuzai}\" >> ${logfile}\n\t\t\tcontent=\"${content}${str_splitline}${font_red}CPU 负载过高${font_end}${str_linefeed}${str_tab}CPU 负载已连续五分钟超过预设${str_linefeed}${str_tab}接下来一小时不再提示${str_linefeed}${str_tab}当前负载：${cpu_fuzai}\"\n\t\t\tcputop\n\t\telif [ ! -z \"$cpucd_time\" ] && [ \"$((`date +%s`-$cpucd_time))\" -ge \"3300\" ] ;then\n\t\t\tunset cpucd_time\n\t\tfi\n\tfi\n}\n\nfunction cputop(){\n\t[ -z \"$1\" ] && content=\"${content}${str_splitline}${str_title_start} 当前 CPU 占用前三的进程${str_title_end}\"\n\tlocal gettop=`top -bn 1|grep -v \"top -bn 1\"`\n\tfor i in `seq 5 7`; do\n\t\tlocal top_name=`echo \"${gettop}\"|awk 'NR=='${i}|awk '{print ($8 ~ /\\/bin\\/sh|\\/bin\\/bash/) ? $9 : $8}'`\n\t\tlocal top_load=`echo \"${gettop}\"|awk 'NR=='${i}|awk '{print $7}'`\n\t\tlocal temp_top=\"${top_name} ${top_load}\"\n\t\t[ ! -z \"$1\" ] && local logtop=\"$logtop  $temp_top\"\n\t\t[ -z \"$1\" ] && content=\"${content}${str_linefeed}${str_tab}${temp_top}\"\n\tdone\n\tunset i\n\t[ ! -z \"$1\" ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！警报！！】 CPU 占用前三: ${logtop}\" >> ${logfile}\n}\n\n# 生成日志监控文件，避免后台影响 wait 语句\nfunction get_syslog(){\n\tkill -9 `pgrep -f \"logread -f -p notice\"` 2>/dev/null\n\t[ -z \"$web_logged\" ] && [ -z \"$ssh_logged\" ] && [ -z \"$web_login_failed\" ] && [ -z \"$ssh_login_failed\" ] && return\n\trm -f ${dir}login_monitor >/dev/null 2>&1\n\ncat>${dir}get_syslog<<EOF\n#!/bin/sh\nlogread -f -p notice >> ${dir}login_monitor &\nEOF\n\tchmod 0755 ${dir}get_syslog && ${dir}get_syslog\n\trm -f ${dir}get_syslog >/dev/null 2>&1\n}\n\n# 登录提醒通知\nfunction login_send(){\n\t[ -z \"$web_logged\" ] && [ -z \"$ssh_logged\" ] && [ -z \"$web_login_failed\" ] && [ -z \"$ssh_login_failed\" ] && return\n\t[ ! -f ${dir}login_monitor ] && return\n\tcat ${dir}login_monitor|grep -i \"accepted login\"|awk '{print $4\" \"$NF}' >> ${dir}web_login\n\tcat ${dir}login_monitor|grep -i \"Password auth succeeded\\|Pubkey auth succeeded\"|grep -Eo \"[0-9]{2}:[0-9]{2}:[0-9]{2}.*[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\"|awk '{print $1\" \"$NF\" \"$5}' >> ${dir}ssh_login\n\tcat ${dir}login_monitor|grep -i \"failed login\"|grep -Eo \"[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\" >> ${dir}web_failed\n\tcat ${dir}login_monitor|grep -i \"Bad password attempt\\|Login attempt for nonexistent user from\"|grep -Eo \"[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\" >> ${dir}ssh_failed\n\techo \"\" > ${dir}login_monitor\n\tadd_ip_black\n\t\n\tlocal login_ip_list=`cat ${dir}web_login|awk '{print $2}'|grep -v \"^$\"|sort -u|head -n1`\n\tfor login_ip in $login_ip_list; do\n\t\t[ -z \"$login_ip\" ] && continue\n\t\techo \"$ip_white_list\"|grep -w -q \"$login_ip\" && continue\n\t\tlocal web_login_time=`cat ${dir}web_login|grep -w ${login_ip}|awk '{print $1}'|grep -v \"^$\"|sort -u|head -n1`\n\t\tlocal web_login_mode=`cat ${dir}web_login|grep -w ${login_ip}|awk '{print $3}'|grep -v \"^$\"|sort -u|head -n1`\n\t\tif [ ! -z \"$web_logged\" ] && [ \"$web_logged\" -eq \"1\" ]; then\n\t\t\tif [ -z \"$title\" ]; then\n\t\t\t\ttitle=\"${login_ip} 通过 Web 登录了路由器\"\n\t\t\t\tcontent=\"${content}${str_splitline}${str_title_start}${font_green} 登录信息${font_end}${str_title_end}${str_linefeed}${str_tab}时间：${str_space}${str_space}${str_space}${str_space}${str_space}${web_login_time}${str_linefeed}${str_tab}设备 IP： ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}\"\n\t\t\telif ( echo \"$title\"|grep -q \"登录了路由器\" ); then\n\t\t\t\ttitle=\"${login_ip} ${title}\"\n\t\t\t\tcontent=\"${content}${str_splitline}${str_tab}时间：${str_space}${str_space}${str_space}${str_space}${str_space}${web_login_time}${str_linefeed}${str_tab}设备 IP： ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}\"\n\t\t\telse\n\t\t\t\ttitle=\"设备状态变化\"\n\t\t\t\tcontent=\"${content}${str_splitline}${str_title_start}${font_green} 登录成功来源${font_end}${str_title_end}${str_linefeed}${str_tab}时间：${str_space}${str_space}${str_space}${str_space}${str_space}${web_login_time}${str_linefeed}${str_tab}设备 IP： ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}\"\n\t\t\tfi\n\t\tfi\n\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` ${disturb_text}设备 ${login_ip} 通过 web ${web_login_mode} 登录了路由器 \" >> ${logfile}\n\tdone\n\techo \"\" > ${dir}web_login\n\tunset login_ip login_ip_list\n\n\tlocal login_ip_list=`cat ${dir}ssh_login|awk '{print $2}'|grep -v \"^$\"|sort -u|head -n1`\n\tfor login_ip in $login_ip_list; do\n\t\t[ -z \"$login_ip\" ] && continue\n\t\techo \"$ip_white_list\"|grep -w -q \"$login_ip\" && continue\n\t\tlocal ssh_login_time=`cat ${dir}ssh_login|grep -w ${login_ip}|awk '{print $1}'|grep -v \"^$\"|sort -u|head -n1`\n\t\tlocal ssh_login_mode=`cat ${dir}ssh_login|grep -w ${login_ip}|awk '{print $3}'|grep -v \"^$\"|sort -u|head -n1`\n\t\t[ ! -z \"$ssh_login_mode\" ] && local content_mode=\"${str_linefeed}${str_tab}登录方式： ${str_space}${str_space}${str_space}${str_space}${ssh_login_mode}\"\n\t\tif [ ! -z \"$ssh_logged\" ] && [ \"$ssh_logged\" -eq \"1\" ]; then\n\t\t\tif [ -z \"$title\" ]; then\n\t\t\t\ttitle=\"${login_ip} 通过 SSH 登录了路由器\"\n\t\t\t\tcontent=\"${content}${str_splitline}${str_title_start}${font_green} 登录成功来源${font_end}${str_title_end}${str_linefeed}${str_tab}时间：${str_space}${str_space}${str_space}${str_space}${str_space}${ssh_login_time}${str_linefeed}${str_tab}设备 IP： ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}\"\n\t\t\telif ( echo \"$title\"|grep -q \"登录了路由器\" ); then\n\t\t\t\ttitle=\"${login_ip} ${title}\"\n\t\t\t\tcontent=\"${content}${str_splitline}${str_tab}时间：${str_space}${str_space}${str_space}${str_space}${str_space}${ssh_login_time}${str_linefeed}${str_tab}设备 IP： ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}\"\n\t\t\telse\n\t\t\t\ttitle=\"设备状态变化\"\n\t\t\t\tcontent=\"${content}${str_splitline}${str_title_start}${font_green} 登录成功来源${str_title_end}${str_linefeed}${str_tab}时间：${str_space}${str_space}${str_space}${str_space}${str_space}${ssh_login_time}${str_linefeed}${str_tab}设备 IP： ${str_space}${str_space}${str_space}${str_space}${login_ip}${content_mode}\"\n\t\t\tfi\n\t\tfi\n\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【info】设备 ${login_ip} 通过 SSH ${ssh_login_mode} 登录了路由器 \" >> ${logfile}\n\tdone\n\techo \"\" > ${dir}ssh_login\n\tunset login_ip login_ip_list\n\n\tlocal login_ip_list=`cat ${dir}web_failed|awk '{print $1}'|grep -v \"^$\"|sort -u|head -n1`\n\tfor login_ip in $login_ip_list; do\n\t\t[ -z \"$login_ip\" ] && continue\n\t\techo \"$ip_white_list\"|grep -w -q \"$login_ip\" && continue\n\t\tlocal web_login_sum=`cat ${dir}web_failed|grep -w \"${login_ip}\"|wc -l`\n\t\tif [ \"$web_login_sum\" -ge \"$login_max_num\" ] ;then\n\t\t\tif [ ! -z \"$web_login_failed\" ] && [ \"$web_login_failed\" -eq \"1\" ]; then\n\t\t\t\tif [ -z \"$title\" ]; then\n\t\t\t\t\ttitle=\"${login_ip} 通过 Web 频繁尝试登录\"\n\t\t\t\t\tcontent=\"${content}${str_splitline}${str_title_start}${font_red} 登录失败来源${font_end}${str_title_end}${str_linefeed}${str_tab}设备 IP： ${str_space}${str_space}${str_space}${str_space}${login_ip}\"\n\t\t\t\t\telif ( echo \"$title\"|grep -q \"频繁尝试登录\" ); then\n\t\t\t\t\t\ttitle=\"${login_ip} ${title}\"\n\t\t\t\t\t\tcontent=\"${content}${str_splitline}${str_tab}设备 IP： ${str_space}${str_space}${str_space}${str_space}${login_ip}\"\n\t\t\t\t\telse\n\t\t\t\t\t\ttitle=\"设备状态变化\"\n\t\t\t\t\t\tcontent=\"${content}${str_splitline}${str_title_start}${font_red} 登录失败来源${font_end}${str_title_end}${str_linefeed}${str_tab}设备 IP： ${str_space}${str_space}${str_space}${str_space}${login_ip}\"\n\t\t\t\tfi\n\t\t\tfi\n\t\t\tsed -i \"/^${login_ip}$/d\" ${dir}web_failed\n\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】设备 ${login_ip} 通过 Web 频繁尝试登录\" >> ${logfile}\n\t\t\tadd_ip_black $login_ip\n\t\tfi\n\tdone\n\tunset login_ip\n\n\tlocal login_ip_list=`cat ${dir}ssh_failed|awk '{print $1}'|grep -v \"^$\"|sort -u|head -n1`\n\tfor login_ip in $login_ip_list; do\n\t\t[ -z \"$login_ip\" ] && continue\n\t\techo \"$ip_white_list\"|grep -w -q \"$login_ip\" && continue\n\t\tlocal ssh_login_sum=`cat ${dir}ssh_failed|grep -w \"${login_ip}\"|wc -l`\n\t\tif [ \"$ssh_login_sum\" -ge \"$login_max_num\" ] ;then\n\t\t\tif [ ! -z \"$ssh_login_failed\" ] && [ \"$ssh_login_failed\" -eq \"1\" ]; then\n\t\t\t\tif [ -z \"$title\" ]; then\n\t\t\t\t\ttitle=\"${login_ip} 通过 SSH 频繁尝试登录\"\n\t\t\t\t\tcontent=\"${content}${str_splitline}${str_title_start}${font_red} 登录失败来源${font_end}${str_title_end}${str_linefeed}${str_tab}设备 IP： ${str_space}${str_space}${str_space}${str_space}${login_ip}\"\n\t\t\t\t\telif ( echo \"$title\"|grep -q \"频繁尝试登录\" ); then\n\t\t\t\t\t\ttitle=\"${login_ip} ${title}\"\n\t\t\t\t\t\tcontent=\"${content}${str_splitline}${str_tab}设备 IP： ${str_space}${str_space}${str_space}${str_space}${login_ip}\"\n\t\t\t\t\telse\n\t\t\t\t\t\ttitle=\"设备状态变化\"\n\t\t\t\t\t\tcontent=\"${content}${str_splitline}${str_title_start}${font_red} 登录失败来源${font_end}${str_title_end}${str_linefeed}${str_tab}设备 IP： ${str_space}${str_space}${str_space}${str_space}${login_ip}\"\n\t\t\t\tfi\n\t\t\tfi\n\t\t\tsed -i \"/^${login_ip}$/d\" ${dir}ssh_failed\n\t\t\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】设备 ${login_ip} 通过 SSH 频繁尝试登录\" >> ${logfile}\n\t\t\tadd_ip_black $login_ip\n\t\tfi\n\tdone\n\tunset login_ip\n\n}\n\n# 添加黑名单\nfunction add_ip_black(){\n\t[ -f \"${ip_blacklist_path}\" ] && local logrow=$(grep -c \"\" ${ip_blacklist_path}) || local logrow=\"0\"\n\t[ ! -f \"${ip_blacklist_path}\" ] && local logrow=\"0\"\n\t[ ! -z \"$web_login_black\" ] && [ \"$web_login_black\" -eq \"0\" ] || [ -z \"$web_login_black\" ] && local logrow=\"0\"\n\tipset flush ip_blacklist >/dev/null 2>&1\n\t\n\tif [ $logrow -le \"0\" ]; then\n\t\tiptables -D INPUT -m set --match-set ip_blacklist src -j DROP >/dev/null 2>&1\n\t\tipset destroy ip_blacklist >/dev/null 2>&1\n\t\treturn\n\tfi\n\t\n\tipset list ip_blacklist >/dev/null 2>&1 || ipset create ip_blacklist hash:ip timeout ${ip_black_timeout} >/dev/null 2>&1\n\tiptables -C INPUT -m set --match-set ip_blacklist src -j DROP >/dev/null 2>&1 || iptables -I INPUT -m set --match-set ip_blacklist src -j DROP >/dev/null 2>&1\n\techo \"$1\" >> ${ip_blacklist_path}\n\tfor ip_black in `cat ${ip_blacklist_path}`; do\n\t\tip_black=`echo \"$ip_black\"|grep -Eo \"[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\"`\n\t\tipset -! add ip_blacklist $ip_black >/dev/null 2>&1\n\tdone\n\tipset list ip_blacklist|grep -Eo \"[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\" > ${ip_blacklist_path}\n}\n\n# 发送定时数据\nfunction send(){\n\techo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【定时数据】创建定时任务\" >> ${logfile}\n\tpushbot_disturb;local send_disturb=$?\n\tget_config \"send_title\" \"router_status\" \"router_temp\" \"router_wan\" \"client_list\" \"google_check_timeout\"\n\n\t[ -z \"$send_title\" ] && local send_title=\"路由状态：\"\n\t[ -z \"$google_check_timeout\" ] && local google_check_timeout=\"10\"\n\t[ ! -z \"$1\" ] && local send_title=\"发送测试：\" && local send_content=\"${str_splitline}${str_title_start}内容1${str_title_end}${str_linefeed}${str_tab}设备1${str_linefeed}${str_tab}设备2${str_splitline}${str_title_start}内容2${str_title_end}${str_linefeed}${str_tab}设备3${str_linefeed}${str_tab}设备4\"\n\t[ -z \"$1\" ] && [ ! -z \"$client_list\" ] && [ \"$client_list\" -eq \"1\" ] && > ${dir}send_enable.lock && pushbot_first &\n\n\tif [ -z \"$1\" ] && [ ! -z \"$router_status\" ] && [ \"$router_status\" -eq \"1\" ]; then\n\t\tlocal systemload=`cat /proc/loadavg|awk '{print $1\" \"$2\" \"$3}'`\n\t\tlocal cpuload=`getcpu`\n\t\tlocal ramload=`free -m|sed -n '2p'|awk '{printf \"%.2f%%\\n\",($3/$2)*100}'`\n\t\tlocal Qwai=`curl -o /dev/null --connect-timeout ${google_check_timeout} -s -w %{http_code} www.google.com`\n\t\tif [[ \"$Qwai\" -eq \"200\" ]] || [[ \"$Qwai\" -eq \"301\" ]] || [[ \"$Qwai\" -eq \"302\" ]]; then\n\t\t\tlocal Qwai_status=\"已连通！\"\n\t\telse\n\t\t\tlocal Qwai_status=\"已断开！\"\n\t\tfi\n\t\tlocal systemstatustime=`cat /proc/uptime|awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf(\"运行时间：%d天%d时%d分%d秒\",run_days,run_hour,run_minute,run_second)}'`;unset run_days run_hour run_minute run_second\n\t\tlocal send_content=\"${send_content}${str_splitline}${str_title_start}${font_blue} 系统运行状态${font_end}${str_title_end}\"\n\t\tlocal send_content=\"${send_content}${str_linefeed}${str_tab}平均负载：${systemload}\"\n\t\tlocal send_content=\"${send_content}${str_linefeed}${str_tab}CPU占用：${cpuload}${percentsym}\"\n\t\tlocal send_content=\"${send_content}${str_linefeed}${str_tab}内存占用：${ramload}${percentsym}\"\n\t\tlocal send_content=\"${send_content}${str_linefeed}${str_tab}全球互联：${Qwai_status}\"\n\t\tlocal send_content=\"${send_content}${str_linefeed}${str_tab}${systemstatustime}\"\n\tfi\n\n\tif [ -z \"$1\" ] && [ ! -z \"$router_temp\" ] && [ \"$router_temp\" -eq \"1\" ]; then\n\t\tlocal cputemp=`soc_temp`\n\t\t[ ! -z \"$cputemp\" ] && local send_content=\"${send_content}${str_splitline}${str_title_start}${font_blue} 设备温度${font_end}${str_title_end}${str_linefeed}${str_tab}CPU：${cputemp}℃\"\n\t\t[ -z \"$cputemp\" ] && local send_content=\"${send_content}${str_splitline}${str_title_start}${font_red} 设备温度${font_end}${str_title_end}${str_linefeed}${str_tab}无法获取设备温度\"\n\tfi\n\n\tif [ -z \"$1\" ] && [ ! -z \"$router_wan\" ] && [ \"$router_wan\" -eq \"1\" ]; then\n\t\tlocal send_wanIP=`getip wanipv4`;local send_hostIP=`getip hostipv4`\n\t\tlocal send_content=\"${send_content}${str_splitline}${str_title_start}${font_blue} WAN 口信息${font_end}${str_title_end}${str_linefeed}${str_tab}接口ip:${send_wanIP}\"\n\t\tlocal send_content=\"${send_content}${str_linefeed}${str_tab}外网ip:${send_hostIP}\"\n\t\tif [ ! -z \"$pushbot_ipv6\" ] && [ \"$pushbot_ipv6\" -ne \"0\" ]; then\n\t\t\tlocal send_wanIPv6=`getip wanipv6`;local send_hostIPv6=`getip hostipv6`\n\t\t\tlocal send_content=\"${send_content}${str_linefeed}${str_tab}ipv6 :${send_wanIPv6}\"\n\t\t\tlocal send_content=\"${send_content}${str_linefeed}${str_tab}外网v6:${send_hostIPv6}\"\n\t\tfi\n\t\t( ! echo \"$send_wanIP\"|grep -q -w ${send_hostIP} ) && local send_content=\"${send_content}${str_linefeed}${str_tab}外网 ip 与接口 ip 不一致，你的 ip 不是公网 ip\"\n\t\tlocal interfaceuptime=`getinterfaceuptime`\n\t\t[ ! -z \"$interfaceuptime\" ] && local wanstatustime=`getinterfaceuptime|awk -F. '{run_days=$1 / 86400;run_hour=($1 % 86400)/3600;run_minute=($1 % 3600)/60;run_second=$1 % 60;printf(\"在线时间：%d天%d时%d分%d秒\",run_days,run_hour,run_minute,run_second)}'` && unset run_days run_hour run_minute run_second\n\t\tlocal send_content=\"${send_content}${str_linefeed}${str_tab}${wanstatustime}\"\n\tfi\n\n\tif [ -z \"$1\" ] && [ ! -z \"$client_list\" ] && [ \"$client_list\" -eq \"1\" ]; then\n\t\twait\n\t\tlocal IPLIST=`cat ${dir}ipAddress 2>/dev/null|awk '{print $1}'`\n\t\t[ -f ${dir}ipAddress ] && local logrow=$(grep -c \"\" ${dir}ipAddress) || local logrow=\"0\"\n\t\t[ \"$logrow\" -eq \"0\" ] && local send_content=\"${send_content}${str_splitline}${str_title_start}${font_red} 当前无在线设备${font_end}${str_title_end}\" || local send_content=\"${send_content}${str_splitline}${str_title_start}${font_blue} 现有在线设备 ${logrow} 台${font_end}${str_title_end}\"\n\t\tfor ip in $IPLIST; do\n\t\t\tlocal time_up=`cat ${dir}ipAddress|grep -w ${ip}|awk '{print $4}'|grep -v \"^$\"|sort -u|head -n1`\n\t\t\tlocal time1=`date +%s`\n\t\t\tlocal time1=$(time_for_humans `expr ${time1} - ${time_up}`)\n\t\t\tlocal ip_mac=`getmac ${ip}`\n\t\t\tlocal ip_name=`getname ${ip} ${ip_mac}`\n\t\t\tlocal ip_total=`usage get ${ip_mac}`;[ ! -z \"$ip_total\" ] && local ip_total=\"总计流量：${ip_total}  \"\n\t\t\tlocal ip_name=`cut_str $ip_name 18`\n\t\t\tlocal send_content=\"${send_content}${str_linefeed}${str_tab}${font_green2}【${ip_name}】${font_end2}  ${ip}${str_linefeed}${str_tab}${ip_total}在线 ${time1}\"\n\t\t\tunset ip_total time_down time_up time1 ip_mac ip_name\n\t\tdone\n\tfi\n\n\t[ ! -z \"$device_name\" ] && local send_title=\"【$device_name】${send_title}\"\n\t[ -z \"$send_content\" ] && local send_content=\"${str_splitline}${str_title_start} 我遇到了一个难题${str_title_end}${str_linefeed}${str_tab}定时发送选项错误，你没有选择需要发送的项目，该怎么办呢${str_splitline}\"\n\t[ \"$send_disturb\" -eq \"0\" ] && diy_send \"${send_title}\" \"${send_content}\" \"${jsonpath}\" >/dev/null 2>&1\n\t[ $? -eq 1 ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】定时推送失败，请检查网络或设置信息\" >> ${logfile} || echo \"`date \"+%Y-%m-%d %H:%M:%S\"` ${disturb_text}定时推送任务完成\" >> ${logfile}\n\tdeltemp\n}\n\n# 初始化\nread_config\ndeltemp\npushbot_cron\n\n# 限制并发进程\n[ -z \"$thread_num\" ] || [ \"$thread_num\" -eq \"0\" ] && thread_num=5\n[ -e ${dir}fd1 ] || mkfifo ${dir}fd1\nexec 5<>${dir}fd1\nrm -f ${dir}fd1 >/dev/null 2>&1\nfor i in `seq 1 $thread_num`; do\n\techo >&5\ndone\nunset i\n\n# 启动参数\nif [ \"$1\" ] ;then\n\t[ $1 == \"send\" ] && send\n\t[ $1 == \"soc\" ] && echo `soc_temp` > ${dir}soc_tmp\n\t[ $1 == \"client\" ] && get_client\n\t[ $1 == \"test\" ] && send test\n\texit\nfi\n\n# 载入在线设备\npushbot_init;[ $? -eq 1 ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】读取设置出错，请检查设置项 \" >> ${logfile} && exit\necho \"`date \"+%Y-%m-%d %H:%M:%S\"` 【初始化】载入在线设备\" >> ${logfile}\n> ${dir}send_enable.lock && pushbot_first && deltemp\necho \"`date \"+%Y-%m-%d %H:%M:%S\"` 【初始化】初始化完成\" >> ${logfile}\n\n# 循环\nwhile [ \"$pushbot_enable\" -eq \"1\" ]; do\n\tdeltemp\n\tusage update\n\tpushbot_disturb;disturb=$?\n\n\t# 外网IP变化检测\n\t[ -f ${dir}ipAddress ] && ipAddress_logrow=$(grep -c \"\" ${dir}ipAddress) || ipAddress_logrow=\"0\";\n\tif [ $ipAddress_logrow -ne \"0\" ]; then\n\t\tonline_list=`cat ${dir}ipAddress|awk '{print $2}'|grep -v \"^$\"|sort -u`\n\t\tfor online_mac in $online_list; do\n\t\t\t[ ! -z \"$online_mac\" ] && mac_online_status=\"`echo \"$mark_mac_list\"|grep -i $online_mac|grep -v \"^$\"|sort -u|head -n1`${mac_online_status}\"\n\t\tdone\n\tfi\n\n\tif [ \"$pushbot_ipv4\" -ne \"0\" ] || [ \"$pushbot_ipv6\" -ne \"0\" ]; then\n\t\trand_geturl\n\t\tip_changes\n\tfi\n\n\t# 设备列表\n\tif [ ! -f \"${dir}send_enable.lock\" ]; then\n\t\t[ ! -z \"$title\" ] && echo \"$title\" > ${dir}title\n\t\t[ ! -z \"$content\" ] && echo \"$content\" > ${dir}content\n\t\tpushbot_first\n\t\t[ -f \"${dir}title\" ] && title=`cat ${dir}title` && rm -f ${dir}title >/dev/null 2>&1\n\t\t[ -f \"${dir}content\" ] && content=`cat ${dir}content` && rm -f ${dir}content >/dev/null 2>&1\n\tfi\n\n\t# 离线缓存区推送\n\t[ ! -f \"${dir}send_enable.lock\" ] && down_send\n\n\t# 当前设备列表\n\t[ ! -z \"$content\" ] && [ ! -f \"${dir}send_enable.lock\" ] && current_device\n\n\t# 无人值守任务\n\t[ ! -f \"${dir}send_enable.lock\" ] && unattended\n\n\t# CPU 检测\n\t[ ! -f \"${dir}send_enable.lock\" ] && cpu_load\n\n\t# 异常流量检测\n\t[ ! -f \"${dir}send_enable.lock\" ] && get_client_usage\n\n\t# 登录提醒通知\n\t[ ! -f \"${dir}send_enable.lock\" ] && login_send\n\n\t# 通知\n\tif [ ! -f \"${dir}send_enable.lock\" ] && [ ! -z \"$title\" ] && [ ! -z \"$content\" ]; then\n\t\t[ ! -z \"$device_name\" ] && title=\"【$device_name】$title\"\n\t\t( echo \"$lite_enable\"|grep -q \"content\" ) && content=\"$title\"\n\t\t[ \"$disturb\" -eq \"0\" ] && diy_send \"${title}\" \"${content}\" \"${jsonpath}\" >/dev/null 2>&1\n\t\t[ $? -eq 1 ] && echo \"`date \"+%Y-%m-%d %H:%M:%S\"` 【！！！】推送失败，请检查网络或设置信息 \" >> ${logfile}\n\tfi\n\t\n\twhile [ -f \"${dir}send_enable.lock\" ]; do\n\t\tsleep $sleeptime\n\tdone\n\tsleep $sleeptime\ndone\n"
  },
  {
    "path": "luci-app-pushbot/root/usr/share/rpcd/acl.d/luci-app-pushbot.json",
    "content": "{\n\t\"luci-app-pushbot\": {\n\t\t\"description\": \"Grant UCI access for luci-app-pushbot\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"pushbot\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"pushbot\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-qfirehose/Makefile",
    "content": "# Copyright (C) 2024-2026 Zag <ntbowen2001@gmail.com>\n# This is free software, licensed under the GNU General Public License v3.\n# See /LICENSE for more information.\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-qfirehose\nPKG_VERSION:=2.1.0\nPKG_RELEASE:=1\nPKG_MAINTAINER:=Zag <ntbowen2001@gmail.com>\nPKG_LICENSE:=GPLv3\nPKG_LICENSE_FILES:=LICENSE\n\nLUCI_TITLE:=LuCI support for QFirehose\nLUCI_DESCRIPTION:=Web interface for QFirehose (v1.4.17), a tool for flashing Qualcomm firmware on OpenWrt\nLUCI_DEPENDS:=+luci-base +cgi-io +qfirehose +socat\nLUCI_PKGARCH:=all\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-qfirehose/htdocs/luci-static/resources/view/qfirehose.js",
    "content": "'use strict';\n'require fs';\n'require ui';\n'require view';\n'require poll';\n'require uci';\n\nreturn view.extend({\n    _state: 'idle',\n    _polling: false,\n    _pollFn: null,\n    _flashBtn: null,\n    _statusEl: null,\n    _logEl: null,\n\n    load: function() {\n        return Promise.all([\n            L.resolveDefault(fs.exec('/usr/bin/qfirehose'), {}),\n            L.resolveDefault(fs.list('/dev'), []),\n            L.resolveDefault(fs.list('/sys/bus/usb/devices'), []),\n            L.resolveDefault(fs.exec('/usr/sbin/qfirehose-status'), {}),\n            uci.load('qfirehose'),\n            L.resolveDefault(fs.exec('/usr/sbin/qfirehose-modem-info'), {})\n        ]);\n    },\n\n    setState: function(state) {\n        this._state = state;\n        if (!this._statusEl || !this._flashBtn) return;\n\n        var labels = {\n            'idle':     [_('Idle'),     '#6c757d'],\n            'flashing': [_('Flashing'), '#fd7e14'],\n            'completed':[_('Success'),  '#28a745'],\n            'failed':   [_('Failed'),   '#dc3545'],\n            'error':    [_('Error'),    '#dc3545']\n        };\n        var info = labels[state] || labels['idle'];\n        this._statusEl.textContent = info[0];\n        this._statusEl.style.color = info[1];\n\n        var resetEl = document.getElementById('qf-reset-btn');\n\n        if (state === 'flashing') {\n            this._flashBtn.disabled = true;\n            this._flashBtn.textContent = _('Flashing...');\n            if (resetEl) resetEl.style.display = 'none';\n        } else {\n            this._flashBtn.disabled = false;\n            this._flashBtn.textContent = _('Flash Firmware');\n            if (resetEl && (state === 'completed' || state === 'failed' || state === 'error'))\n                resetEl.style.display = '';\n        }\n    },\n\n    getFormValue: function(id) {\n        var el = document.getElementById('qf-' + id);\n        if (!el) return '';\n        if (el.type === 'checkbox') return el.checked ? '1' : '0';\n        return el.value || '';\n    },\n\n    buildArgs: function() {\n        var args = [];\n        var firmware = this.getFormValue('firmware');\n        if (firmware)\n            args.push('-f', firmware);\n\n        var port = this.getFormValue('port');\n        if (port)\n            args.push('-p', port);\n\n        var device = this.getFormValue('device');\n        if (device)\n            args.push('-s', device);\n\n        var deviceType = this.getFormValue('device_type');\n        if (deviceType && deviceType !== 'nand')\n            args.push('-d', deviceType);\n\n        if (this.getFormValue('skip_md5') === '1')\n            args.push('-n');\n\n        if (this.getFormValue('erase_all') === '1')\n            args.push('-e');\n\n        if (this.getFormValue('signed_firmware') === '1')\n            args.push('-v');\n\n        if (this.getFormValue('capture_usbmon') === '1')\n            args.push('-u', '/tmp/qfirehose_log/usbmon.log');\n\n        return args;\n    },\n\n    handleFlashClick: function() {\n        var firmware = this.getFormValue('firmware');\n        if (!firmware) {\n            ui.addNotification(null, E('p', _('Please select a firmware file first.')), 'warning');\n            return;\n        }\n\n        if (this.getFormValue('erase_all') === '1') {\n            return this.showEraseWarning();\n        }\n\n        this.showFlashWarning();\n    },\n\n    showEraseWarning: function() {\n        var self = this;\n        ui.showModal(_('Danger'), [\n            E('div', { 'class': 'alert-message danger', 'style': 'border-left:4px solid #dc3545;padding:12px;background:#fff5f5;' }, [\n                E('p', { 'style': 'font-weight:bold;color:#dc3545;' },\n                    _('You have enabled \"Erase All Before Download\"!')),\n                E('p', {},\n                    _('This will erase ALL data on the modem, including calibration data. The modem may become permanently unusable if calibration data is lost.')),\n                E('p', { 'style': 'font-weight:bold;' },\n                    _('Are you absolutely sure you want to continue?'))\n            ]),\n            E('div', { 'class': 'right' }, [\n                E('button', { 'class': 'btn', 'click': ui.hideModal }, _('Cancel')),\n                ' ',\n                E('button', {\n                    'class': 'btn cbi-button-negative',\n                    'click': function() { ui.hideModal(); self.showFlashWarning(); }\n                }, _('I understand the risk, continue'))\n            ])\n        ]);\n    },\n\n    showFlashWarning: function() {\n        var self = this;\n        var continueBtn = E('button', {\n            'class': 'btn cbi-button-positive',\n            'disabled': true\n        }, _('Continue') + ' (10)');\n\n        ui.showModal(_('Confirm Firmware Flash'), [\n            E('div', { 'class': 'alert-message warning' }, [\n                E('p', { 'style': 'font-weight:bold;' }, _('Please ensure before proceeding:')),\n                E('ul', {}, [\n                    E('li', {}, _('The firmware is from official channels and compatible with your modem.')),\n                    E('li', {}, _('The firmware version should be higher than the current version.')),\n                    E('li', {}, _('Flashing wrong firmware can brick your modem permanently.')),\n                    E('li', {}, _('Do not flash if you are not willing to take this risk.'))\n                ]),\n                E('details', { 'style': 'margin-top:8px;' }, [\n                    E('summary', { 'style': 'cursor:pointer;color:#6c757d;' }, _('Additional notes...')),\n                    E('ul', { 'style': 'margin-top:6px;font-size:90%;color:#6c757d;' }, [\n                        E('li', {}, _('After flashing, use AT&F command to factory reset modem settings.')),\n                        E('li', {}, _('mPCIe users: If modem disappears after flashing, it may have switched to USB3 mode. Use mPCIe-to-USB adapter and send AT+QUSBCFG=\"SS\",0 to switch back to USB2.'))\n                    ])\n                ])\n            ]),\n            E('div', { 'class': 'right' }, [\n                E('button', { 'class': 'btn', 'click': ui.hideModal }, _('Cancel')),\n                ' ',\n                continueBtn\n            ])\n        ]);\n\n        var countdown = 10;\n        var timer = setInterval(function() {\n            countdown--;\n            if (countdown > 0) {\n                continueBtn.textContent = _('Continue') + ' (' + countdown + ')';\n            } else {\n                clearInterval(timer);\n                continueBtn.textContent = _('Continue');\n                continueBtn.disabled = false;\n                continueBtn.onclick = function() {\n                    ui.hideModal();\n                    self.doFlash();\n                };\n            }\n        }, 1000);\n    },\n\n    doFlash: function() {\n        var args = this.buildArgs();\n        this.setState('flashing');\n\n        if (this._logEl) {\n            this._logEl.value = _('Starting firmware flash process...') + '\\n';\n        }\n\n        this.startLogPolling();\n\n        var self = this;\n        return fs.exec('/usr/sbin/qfirehose-start', args).catch(function(err) {\n            self.setState('error');\n            ui.addNotification(null, E('p', _('Failed to start flash process: ') + err.message), 'error');\n        });\n    },\n\n    startLogPolling: function() {\n        if (this._polling) return;\n        this._polling = true;\n\n        var self = this;\n        this._pollFn = function() {\n            return Promise.all([\n                fs.exec('/usr/sbin/qfirehose-status'),\n                fs.exec('cat', ['/tmp/qfirehose_log/current.log'])\n            ]).then(function(results) {\n                var statusRes = results[0];\n                var logRes = results[1];\n\n                // 更新日志\n                if (self._logEl && logRes && logRes.stdout) {\n                    self._logEl.value = logRes.stdout;\n                    self._logEl.scrollTop = self._logEl.scrollHeight;\n                }\n\n                // 根据 qfirehose-status 返回的状态更新 UI\n                var status = (statusRes && statusRes.stdout) ? statusRes.stdout.trim() : 'idle';\n                if (status === 'completed') {\n                    self.stopLogPolling();\n                    self.setState('completed');\n                    ui.addNotification(null, E('p', _('Firmware upgrade completed successfully!')), 'success');\n                } else if (status === 'failed') {\n                    self.stopLogPolling();\n                    self.setState('failed');\n                    ui.addNotification(null, E('p', _('Firmware upgrade failed.')), 'error');\n                } else if (status === 'flashing') {\n                    self.setState('flashing');\n                } else {\n                    self.stopLogPolling();\n                    self.setState(status);\n                }\n            }).catch(function() {});\n        };\n\n        poll.add(this._pollFn, 2);\n    },\n\n    stopLogPolling: function() {\n        if (this._polling && this._pollFn) {\n            poll.remove(this._pollFn);\n            this._polling = false;\n            this._pollFn = null;\n        }\n    },\n\n    createSelect: function(id, options, defaultVal) {\n        var sel = E('select', {\n            'id': 'qf-' + id,\n            'class': 'cbi-input-select',\n            'style': 'width:100%;'\n        });\n        options.forEach(function(opt) {\n            var o = E('option', { 'value': opt[0] }, opt[1]);\n            if (opt[0] === defaultVal) o.selected = true;\n            sel.appendChild(o);\n        });\n        return sel;\n    },\n\n    createCheckbox: function(id, label, description, isDanger) {\n        var cb = E('div', { 'class': 'cbi-value', 'style': 'padding:4px 0;' }, [\n            E('label', { 'class': 'cbi-value-title', 'style': isDanger ? 'color:#dc3545;font-weight:bold;' : 'font-weight:bold;' }, label),\n            E('div', { 'class': 'cbi-value-field' }, [\n                E('label', { 'style': 'display:inline-flex;align-items:center;gap:6px;cursor:pointer;' }, [\n                    E('input', {\n                        'type': 'checkbox',\n                        'id': 'qf-' + id,\n                        'class': 'cbi-input-checkbox'\n                    }),\n                    description ? E('span', { 'style': 'font-size:85%;' + (isDanger ? 'color:#dc3545;' : '') }, description) : ''\n                ])\n            ])\n        ]);\n        return cb;\n    },\n\n    render: function(data) {\n        var self = this;\n\n        var version = '';\n        if (data[0] && data[0].stdout) {\n            var match = data[0].stdout.match(/Version:\\s*([^\\n]+)/);\n            if (match) version = match[1].trim();\n        }\n\n        var ttyDevices = (data[1] || []).filter(function(dev) {\n            return /^ttyUSB/.test(dev.name) || /^mhi_/.test(dev.name) || /^wwan/.test(dev.name);\n        }).map(function(dev) { return dev.name; });\n\n        var usbDevices = (data[2] || []).filter(function(dev) {\n            return /^\\d+-\\d+/.test(dev.name);\n        }).map(function(dev) { return dev.name; });\n\n        var initStatus = 'idle';\n        if (data[3] && data[3].stdout) {\n            var st = data[3].stdout.trim();\n            if (st === 'flashing' || st === 'completed' || st === 'failed') {\n                initStatus = st;\n            }\n        }\n\n        var modemModel = '', modemFirmware = '';\n        if (data[5] && data[5].stdout) {\n            var lines = data[5].stdout.split('\\n');\n            lines.forEach(function(line) {\n                var kv = line.split('=');\n                if (kv.length >= 2) {\n                    var k = kv[0].trim(), v = kv.slice(1).join('=').trim();\n                    if (k === 'model' && v !== 'N/A') modemModel = v;\n                    if (k === 'firmware' && v !== 'N/A') modemFirmware = v;\n                }\n            });\n        }\n\n        var savedCfg = {\n            port: uci.get('qfirehose', 'config', 'port') || '',\n            device: uci.get('qfirehose', 'config', 'device') || '',\n            device_type: uci.get('qfirehose', 'config', 'device_type') || 'nand',\n            skip_md5: uci.get('qfirehose', 'config', 'skip_md5') || '0',\n            erase_all: uci.get('qfirehose', 'config', 'erase_all') || '0',\n            signed_firmware: uci.get('qfirehose', 'config', 'signed_firmware') || '0'\n        };\n\n        var statusEl = E('span', {\n            'style': 'font-weight:bold;'\n        }, _('Idle'));\n        this._statusEl = statusEl;\n\n        var portOpts = [['', _('Auto Detect')]];\n        ttyDevices.forEach(function(d) { portOpts.push(['/dev/' + d, '/dev/' + d]); });\n\n        var deviceOpts = [['', _('Auto Detect')]];\n        usbDevices.forEach(function(d) { deviceOpts.push(['/sys/bus/usb/devices/' + d, d]); });\n\n        var typeOpts = [\n            ['nand', _('NAND (Default)')],\n            ['emmc', _('eMMC')],\n            ['ufs', _('UFS')]\n        ];\n\n        var firmwareInput = E('input', {\n            'type': 'text',\n            'id': 'qf-firmware',\n            'class': 'cbi-input-text',\n            'style': 'flex:1;',\n            'placeholder': _('Upload firmware or enter path...')\n        });\n\n        var progressWrap = E('div', {\n            'id': 'qf-progress-wrap',\n            'style': 'display:none;margin-top:6px;'\n        }, [\n            E('div', { 'style': 'display:flex;align-items:center;gap:8px;' }, [\n                E('div', {\n                    'style': 'flex:1;height:6px;background:#e9ecef;border-radius:3px;overflow:hidden;'\n                }, [\n                    E('div', {\n                        'id': 'qf-progress-bar',\n                        'style': 'width:0%;height:100%;background:#28a745;border-radius:3px;transition:width 0.3s;'\n                    })\n                ]),\n                E('span', {\n                    'id': 'qf-progress-text',\n                    'style': 'font-size:12px;color:#6c757d;min-width:40px;text-align:right;'\n                }, '0%')\n            ])\n        ]);\n\n        var fileInput = E('input', {\n            'type': 'file',\n            'style': 'display:none;',\n            'change': function(ev) {\n                var file = ev.target.files[0];\n                if (!file) return;\n\n                var path = '/tmp/qfirehoseupload/' + file.name;\n                firmwareInput.value = path;\n\n                var uploadBtn = document.getElementById('qf-upload-btn');\n                var pWrap = document.getElementById('qf-progress-wrap');\n                var pBar = document.getElementById('qf-progress-bar');\n                var pText = document.getElementById('qf-progress-text');\n\n                if (uploadBtn) {\n                    uploadBtn.disabled = true;\n                    uploadBtn.textContent = _('Uploading...');\n                }\n                if (pWrap) pWrap.style.display = '';\n                if (pBar) pBar.style.width = '0%';\n                if (pText) pText.textContent = '0%';\n\n                var formData = new FormData();\n                formData.append('sessionid', L.env.sessionid);\n                formData.append('filename', path);\n                formData.append('filedata', file);\n\n                var xhr = new XMLHttpRequest();\n                xhr.upload.onprogress = function(e) {\n                    if (e.lengthComputable) {\n                        var pct = Math.round(e.loaded / e.total * 100);\n                        if (pBar) pBar.style.width = pct + '%';\n                        if (pText) pText.textContent = pct + '%';\n                    }\n                };\n                xhr.open('POST', L.env.cgi_base + '/cgi-upload');\n                xhr.onload = function() {\n                    if (uploadBtn) {\n                        uploadBtn.disabled = false;\n                        uploadBtn.textContent = _('Select File');\n                    }\n                    if (xhr.status === 200) {\n                        if (pBar) pBar.style.background = '#28a745';\n                        ui.addNotification(null, E('p', _('File uploaded successfully.')), 'info');\n                    } else {\n                        if (pBar) pBar.style.background = '#dc3545';\n                        ui.addNotification(null, E('p', _('File upload failed.')), 'error');\n                        firmwareInput.value = '';\n                    }\n                    setTimeout(function() { if (pWrap) pWrap.style.display = 'none'; }, 3000);\n                };\n                xhr.onerror = function() {\n                    if (uploadBtn) {\n                        uploadBtn.disabled = false;\n                        uploadBtn.textContent = _('Select File');\n                    }\n                    if (pBar) pBar.style.background = '#dc3545';\n                    if (pText) pText.textContent = _('Error');\n                    ui.addNotification(null, E('p', _('File upload failed.')), 'error');\n                    firmwareInput.value = '';\n                    setTimeout(function() { if (pWrap) pWrap.style.display = 'none'; }, 3000);\n                };\n                xhr.send(formData);\n            }\n        });\n\n        var advancedBody = E('div', {\n            'id': 'qf-advanced-body',\n            'style': 'display:none;'\n        }, [\n            E('div', { 'class': 'cbi-section-node' }, [\n                this.createCheckbox('skip_md5', _('Skip MD5 Check'), _('Skip MD5 checksum verification'), false),\n                this.createCheckbox('signed_firmware', _('Signed Firmware'), _('For AG215S-GLR signed firmware packages'), false),\n                this.createCheckbox('capture_usbmon', _('Capture USBMon Log'), _('Capture USB monitor log for debugging (-u)'), false)\n            ]),\n            E('hr', { 'style': 'border:none;border-top:1px dashed #dc3545;margin:12px 0;opacity:0.5;' }),\n            E('div', { 'class': 'cbi-section-node' }, [\n                this.createCheckbox('erase_all', _('Erase All Before Download'),\n                    _('Erase ALL data including calibration data — modem may become permanently unusable!'), true)\n            ])\n        ]);\n\n        var advancedToggle = E('div', {\n            'class': 'cbi-section-node',\n            'style': 'display:flex;align-items:center;justify-content:space-between;padding:10px 16px;cursor:pointer;user-select:none;border:1px solid;border-color:inherit;border-radius:4px;',\n            'click': function() {\n                var body = document.getElementById('qf-advanced-body');\n                var arrow = document.getElementById('qf-advanced-arrow');\n                if (body.style.display === 'none') {\n                    body.style.display = '';\n                    arrow.textContent = '▼';\n                } else {\n                    body.style.display = 'none';\n                    arrow.textContent = '▶';\n                }\n            }\n        }, [\n            E('strong', {}, _('Advanced Options')),\n            E('span', { 'id': 'qf-advanced-arrow', 'style': 'font-size:12px;' }, '▶')\n        ]);\n\n        var flashBtn = E('button', {\n            'class': 'btn cbi-button-positive',\n            'style': 'font-size:16px;padding:10px 40px;',\n            'click': ui.createHandlerFn(this, 'handleFlashClick')\n        }, _('Flash Firmware'));\n        this._flashBtn = flashBtn;\n\n        var resetBtn = E('button', {\n            'id': 'qf-reset-btn',\n            'class': 'btn cbi-button',\n            'style': 'font-size:14px;padding:8px 24px;display:none;',\n            'click': ui.createHandlerFn(this, function() {\n                this.stopLogPolling();\n                this.setState('idle');\n                if (this._logEl) this._logEl.value = '';\n                var rb = document.getElementById('qf-reset-btn');\n                if (rb) rb.style.display = 'none';\n                fs.exec('rm', ['-f', '/tmp/qfirehose_log/status', '/tmp/qfirehose_log/pid']);\n            })\n        }, _('Reset'));\n\n        var logEl = E('textarea', {\n            'id': 'qfirehose-log',\n            'readonly': 'readonly',\n            'wrap': 'off',\n            'rows': 20,\n            'placeholder': _('Waiting for flash process to start...'),\n            'style': 'width:100%;font-family:monospace;font-size:12px;white-space:pre;resize:vertical;background:#1e1e1e;color:#d4d4d4;border:1px solid #333;border-radius:4px;padding:8px;'\n        }, '');\n        this._logEl = logEl;\n\n        var view = E('div', { 'class': 'cbi-map' }, [\n\n            E('h2', {}, _('QFirehose')),\n            E('div', { 'class': 'cbi-map-descr' },\n                _('Qualcomm firmware flash tool for Quectel modems. Supports firmware directory, zip and 7z packages.')),\n\n            E('div', { 'class': 'cbi-section' }, [\n                E('div', { 'class': 'cbi-section-node' }, [\n                    E('div', { 'class': 'cbi-value' }, [\n                        E('label', { 'class': 'cbi-value-title' }, _('Modem Model')),\n                        E('div', { 'class': 'cbi-value-field' }, [\n                            E('span', { 'id': 'qf-modem-model' }, modemModel || _('Not detected'))\n                        ])\n                    ]),\n                    E('div', { 'class': 'cbi-value' }, [\n                        E('label', { 'class': 'cbi-value-title' }, _('Current Firmware')),\n                        E('div', { 'class': 'cbi-value-field' }, [\n                            E('span', { 'id': 'qf-modem-firmware' }, modemFirmware || _('Not detected'))\n                        ])\n                    ]),\n                    E('div', { 'class': 'cbi-value' }, [\n                        E('label', { 'class': 'cbi-value-title' }, _('Tool Version')),\n                        E('div', { 'class': 'cbi-value-field' }, [\n                            E('span', {}, version || _('Unknown'))\n                        ])\n                    ]),\n                    E('div', { 'class': 'cbi-value' }, [\n                        E('label', { 'class': 'cbi-value-title' }, _('Status')),\n                        E('div', { 'class': 'cbi-value-field' }, [\n                            statusEl\n                        ])\n                    ])\n                ])\n            ]),\n\n            E('div', { 'class': 'cbi-section' }, [\n                E('h3', {}, _('Firmware File')),\n                E('div', { 'style': 'display:flex;gap:8px;align-items:center;' }, [\n                    firmwareInput,\n                    E('button', {\n                        'id': 'qf-upload-btn',\n                        'class': 'btn cbi-button-action',\n                        'click': function() { fileInput.click(); }\n                    }, _('Select File')),\n                    fileInput\n                ]),\n                progressWrap,\n                E('div', { 'style': 'font-size:90%;color:#6c757d;margin-top:4px;' },\n                    _('Supports .zip, .7z packages and firmware directories'))\n            ]),\n\n            E('div', { 'class': 'cbi-section' }, [\n                E('div', { 'style': 'display:flex;align-items:center;justify-content:space-between;' }, [\n                    E('h3', { 'style': 'margin:0;' }, _('Device Settings')),\n                    E('button', {\n                        'class': 'btn cbi-button',\n                        'style': 'font-size:12px;padding:2px 10px;',\n                        'click': function(ev) {\n                            var btn = ev.target;\n                            btn.disabled = true;\n                            btn.textContent = _('Refreshing...');\n                            Promise.all([\n                                fs.list('/dev'),\n                                fs.list('/sys/bus/usb/devices'),\n                                L.resolveDefault(fs.exec('/usr/sbin/qfirehose-modem-info'), {})\n                            ]).then(function(results) {\n                                var newTty = (results[0] || []).filter(function(dev) {\n                                    return /^ttyUSB/.test(dev.name) || /^mhi_/.test(dev.name) || /^wwan/.test(dev.name);\n                                }).map(function(dev) { return dev.name; });\n                                var newUsb = (results[1] || []).filter(function(dev) {\n                                    return /^\\d+-\\d+/.test(dev.name);\n                                }).map(function(dev) { return dev.name; });\n\n                                var portSel = document.getElementById('qf-port');\n                                var devSel = document.getElementById('qf-device');\n                                if (portSel) {\n                                    var curPort = portSel.value;\n                                    portSel.innerHTML = '';\n                                    portSel.appendChild(E('option', { 'value': '' }, _('Auto Detect')));\n                                    newTty.forEach(function(d) {\n                                        var o = E('option', { 'value': '/dev/' + d }, '/dev/' + d);\n                                        if ('/dev/' + d === curPort) o.selected = true;\n                                        portSel.appendChild(o);\n                                    });\n                                }\n                                if (devSel) {\n                                    var curDev = devSel.value;\n                                    devSel.innerHTML = '';\n                                    devSel.appendChild(E('option', { 'value': '' }, _('Auto Detect')));\n                                    newUsb.forEach(function(d) {\n                                        var o = E('option', { 'value': '/sys/bus/usb/devices/' + d }, d);\n                                        if ('/sys/bus/usb/devices/' + d === curDev) o.selected = true;\n                                        devSel.appendChild(o);\n                                    });\n                                }\n\n                                var modemInfo = results[2];\n                                if (modemInfo && modemInfo.stdout) {\n                                    var modelEl = document.getElementById('qf-modem-model');\n                                    var fwEl = document.getElementById('qf-modem-firmware');\n                                    modemInfo.stdout.split('\\n').forEach(function(line) {\n                                        var kv = line.split('=');\n                                        if (kv.length >= 2) {\n                                            var k = kv[0].trim(), v = kv.slice(1).join('=').trim();\n                                            if (k === 'model' && modelEl) modelEl.textContent = (v && v !== 'N/A') ? v : _('Not detected');\n                                            if (k === 'firmware' && fwEl) fwEl.textContent = (v && v !== 'N/A') ? v : _('Not detected');\n                                        }\n                                    });\n                                }\n\n                                btn.disabled = false;\n                                btn.textContent = _('Refresh Devices');\n                            }).catch(function() {\n                                btn.disabled = false;\n                                btn.textContent = _('Refresh Devices');\n                            });\n                        }\n                    }, _('Refresh Devices'))\n                ]),\n                E('div', { 'class': 'cbi-section-node' }, [\n                    E('div', { 'class': 'cbi-value' }, [\n                        E('label', { 'class': 'cbi-value-title' }, _('Communication Port')),\n                        E('div', { 'class': 'cbi-value-field' }, [\n                            this.createSelect('port', portOpts, savedCfg.port)\n                        ])\n                    ]),\n                    E('div', { 'class': 'cbi-value' }, [\n                        E('label', { 'class': 'cbi-value-title' }, _('USB Device')),\n                        E('div', { 'class': 'cbi-value-field' }, [\n                            this.createSelect('device', deviceOpts, savedCfg.device)\n                        ])\n                    ]),\n                    E('div', { 'class': 'cbi-value' }, [\n                        E('label', { 'class': 'cbi-value-title' }, _('Device Type')),\n                        E('div', { 'class': 'cbi-value-field' }, [\n                            this.createSelect('device_type', typeOpts, savedCfg.device_type)\n                        ])\n                    ])\n                ])\n            ]),\n\n            E('div', { 'class': 'cbi-section', 'style': 'padding:0;' }, [\n                advancedToggle,\n                advancedBody\n            ]),\n\n            E('div', {\n                'class': 'cbi-section',\n                'style': 'text-align:center;padding:16px;display:flex;justify-content:center;gap:12px;align-items:center;'\n            }, [flashBtn, resetBtn]),\n\n            E('div', { 'class': 'cbi-section' }, [\n                E('div', { 'style': 'display:flex;align-items:center;justify-content:space-between;margin-bottom:8px;' }, [\n                    E('h3', { 'style': 'margin:0;' }, _('Flash Log')),\n                    E('div', { 'style': 'display:flex;gap:6px;' }, [\n                        E('button', {\n                            'class': 'btn cbi-button-action',\n                            'style': 'font-size:12px;padding:2px 10px;',\n                            'click': function() {\n                                var log = document.getElementById('qfirehose-log');\n                                if (log && log.value) {\n                                    navigator.clipboard.writeText(log.value).then(function() {\n                                        ui.addNotification(null, E('p', _('Log copied to clipboard.')), 'info');\n                                    });\n                                }\n                            }\n                        }, _('Copy')),\n                        E('button', {\n                            'class': 'btn cbi-button-reset',\n                            'style': 'font-size:12px;padding:2px 10px;',\n                            'click': function() {\n                                var log = document.getElementById('qfirehose-log');\n                                if (log) log.value = '';\n                            }\n                        }, _('Clear'))\n                    ])\n                ]),\n                logEl\n            ])\n        ]);\n\n        if (savedCfg.skip_md5 === '1')\n            document.getElementById && setTimeout(function() {\n                var el = document.getElementById('qf-skip_md5');\n                if (el) el.checked = true;\n            }, 0);\n        if (savedCfg.erase_all === '1')\n            setTimeout(function() {\n                var el = document.getElementById('qf-erase_all');\n                if (el) el.checked = true;\n            }, 0);\n        if (savedCfg.signed_firmware === '1')\n            setTimeout(function() {\n                var el = document.getElementById('qf-signed_firmware');\n                if (el) el.checked = true;\n            }, 0);\n\n        if (initStatus === 'flashing') {\n            setTimeout(function() {\n                self.setState('flashing');\n                self.startLogPolling();\n            }, 100);\n        }\n\n        return view;\n    },\n\n    handleSaveApply: null,\n    handleSave: null,\n    handleReset: null\n});\n"
  },
  {
    "path": "luci-app-qfirehose/po/zh_Hans/qfirehose.po",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\\n\"\n\nmsgid \"QFirehose\"\nmsgstr \"QFirehose\"\n\nmsgid \"Qualcomm firmware flash tool for Quectel modems. Supports firmware directory, zip and 7z packages.\"\nmsgstr \"移远（Quectel）模组高通固件烧写工具。支持固件目录、zip 和 7z 压缩包。\"\n\nmsgid \"Tool Version\"\nmsgstr \"工具版本\"\n\nmsgid \"Unknown\"\nmsgstr \"未知\"\n\nmsgid \"Status\"\nmsgstr \"状态\"\n\nmsgid \"Idle\"\nmsgstr \"空闲\"\n\nmsgid \"Flashing\"\nmsgstr \"烧写中\"\n\nmsgid \"Success\"\nmsgstr \"成功\"\n\nmsgid \"Failed\"\nmsgstr \"失败\"\n\nmsgid \"Error\"\nmsgstr \"错误\"\n\nmsgid \"Flashing...\"\nmsgstr \"烧写中...\"\n\nmsgid \"Firmware File\"\nmsgstr \"固件文件\"\n\nmsgid \"Upload firmware or enter path...\"\nmsgstr \"上传固件或输入路径...\"\n\nmsgid \"Select File\"\nmsgstr \"选择文件\"\n\nmsgid \"Uploading...\"\nmsgstr \"上传中...\"\n\nmsgid \"File uploaded successfully.\"\nmsgstr \"文件上传成功。\"\n\nmsgid \"File upload failed.\"\nmsgstr \"文件上传失败。\"\n\nmsgid \"Supports .zip, .7z packages and firmware directories\"\nmsgstr \"支持 .zip、.7z 压缩包和固件目录\"\n\nmsgid \"Device Settings\"\nmsgstr \"设备设置\"\n\nmsgid \"Communication Port\"\nmsgstr \"通讯端口\"\n\nmsgid \"USB Device\"\nmsgstr \"USB 设备\"\n\nmsgid \"Device Type\"\nmsgstr \"设备类型\"\n\nmsgid \"Auto Detect\"\nmsgstr \"自动检测\"\n\nmsgid \"NAND (Default)\"\nmsgstr \"NAND（默认）\"\n\nmsgid \"eMMC\"\nmsgstr \"eMMC\"\n\nmsgid \"UFS\"\nmsgstr \"UFS\"\n\nmsgid \"Advanced Options\"\nmsgstr \"高级选项\"\n\nmsgid \"Skip MD5 Check\"\nmsgstr \"跳过 MD5 校验\"\n\nmsgid \"Skip MD5 checksum verification\"\nmsgstr \"跳过 MD5 校验和验证\"\n\nmsgid \"Signed Firmware\"\nmsgstr \"签名固件\"\n\nmsgid \"For AG215S-GLR signed firmware packages\"\nmsgstr \"用于 AG215S-GLR 签名固件包\"\n\nmsgid \"Erase All Before Download\"\nmsgstr \"下载前擦除所有数据\"\n\nmsgid \"Erase ALL data including calibration data — modem may become permanently unusable!\"\nmsgstr \"擦除所有数据（包括校准数据）— 模组可能永久无法使用！\"\n\nmsgid \"Flash Firmware\"\nmsgstr \"开始烧写\"\n\nmsgid \"Flash Log\"\nmsgstr \"烧写日志\"\n\nmsgid \"Copy\"\nmsgstr \"复制\"\n\nmsgid \"Clear\"\nmsgstr \"清空\"\n\nmsgid \"Log copied to clipboard.\"\nmsgstr \"日志已复制到剪贴板。\"\n\nmsgid \"Please select a firmware file first.\"\nmsgstr \"请先选择固件文件。\"\n\nmsgid \"Danger\"\nmsgstr \"危险\"\n\nmsgid \"You have enabled \\\"Erase All Before Download\\\"!\"\nmsgstr \"您已启用\"下载前擦除所有数据\"！\"\n\nmsgid \"This will erase ALL data on the modem, including calibration data. The modem may become permanently unusable if calibration data is lost.\"\nmsgstr \"这将擦除模组上的所有数据，包括校准数据。如果校准数据丢失，模组可能永久无法使用。\"\n\nmsgid \"Are you absolutely sure you want to continue?\"\nmsgstr \"您确定要继续吗？\"\n\nmsgid \"I understand the risk, continue\"\nmsgstr \"我了解风险，继续\"\n\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\nmsgid \"Confirm Firmware Flash\"\nmsgstr \"确认烧写固件\"\n\nmsgid \"Please ensure before proceeding:\"\nmsgstr \"请在继续之前确认：\"\n\nmsgid \"The firmware is from official channels and compatible with your modem.\"\nmsgstr \"固件来自官方渠道并且与您的模组兼容。\"\n\nmsgid \"The firmware version should be higher than the current version.\"\nmsgstr \"要烧写的固件版本应高于当前版本。\"\n\nmsgid \"Flashing wrong firmware can brick your modem permanently.\"\nmsgstr \"烧写错误的固件可能会永久损坏您的模组。\"\n\nmsgid \"Do not flash if you are not willing to take this risk.\"\nmsgstr \"如果您不愿意承担此风险，请不要烧写。\"\n\nmsgid \"Additional notes...\"\nmsgstr \"补充说明...\"\n\nmsgid \"After flashing, use AT&F command to factory reset modem settings.\"\nmsgstr \"烧写完成后，建议使用 AT&F 命令对模组进行出厂重置。\"\n\nmsgid \"mPCIe users: If modem disappears after flashing, it may have switched to USB3 mode. Use mPCIe-to-USB adapter and send AT+QUSBCFG=\\\"SS\\\",0 to switch back to USB2.\"\nmsgstr \"mPCIe 用户注意：如果烧写后模组消失，可能是固件将默认模式设为 USB3。请使用 mPCIe 转 USB 适配器连接模组，然后发送 AT+QUSBCFG=\\\"SS\\\",0 切换回 USB2。\"\n\nmsgid \"Continue\"\nmsgstr \"继续\"\n\nmsgid \"Starting firmware flash process...\"\nmsgstr \"开始固件烧写...\"\n\nmsgid \"Failed to start flash process: \"\nmsgstr \"启动烧写进程失败：\"\n\nmsgid \"Firmware upgrade completed successfully!\"\nmsgstr \"固件升级成功完成！\"\n\nmsgid \"Firmware upgrade failed.\"\nmsgstr \"固件升级失败。\"\n\nmsgid \"Refresh Devices\"\nmsgstr \"刷新设备\"\n\nmsgid \"Refreshing...\"\nmsgstr \"刷新中...\"\n\nmsgid \"Reset\"\nmsgstr \"重置\"\n\nmsgid \"Waiting for flash process to start...\"\nmsgstr \"等待烧写进程启动...\"\n\nmsgid \"Capture USBMon Log\"\nmsgstr \"捕获 USBMon 日志\"\n\nmsgid \"Capture USB monitor log for debugging (-u)\"\nmsgstr \"捕获 USB 监控日志用于调试（-u 参数）\"\n\nmsgid \"Modem Model\"\nmsgstr \"模组型号\"\n\nmsgid \"Current Firmware\"\nmsgstr \"当前固件\"\n\nmsgid \"Not detected\"\nmsgstr \"未检测到\"\n"
  },
  {
    "path": "luci-app-qfirehose/qfirehose/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=qfirehose\nPKG_VERSION:=1.4.17\nPKG_RELEASE:=1\n\nPKG_SOURCE_PROTO:=git\nPKG_SOURCE_URL:=https://github.com/nippynetworks/qfirehose.git\nPKG_SOURCE_VERSION:=fbbb4feeea19c265a1ed01d5eedf72e33974bac5\nPKG_MIRROR_HASH:=ec9b0b6655077b81966bf41c8cf4e631366c307579d408757dac9605694ccb72\n\nPKG_MAINTAINER:=Oskari Rauta <oskari.rauta@gmail.com>\nPKG_LICENSE:=\nPKG_LICENSE_FILES:=NOTICE\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/qfirehose\n  SECTION:=utils\n  CATEGORY:=Utilities\n  TITLE:=Quectel Firehose Recovery application\n  DEPENDS:=+unzip +p7zip\n  URL:=https://github.com/nippynetworks/qfirehose\nendef\n\ndefine Package/qfirehose/description\n  Utility that is able to flash firmwares on Quectel's modems.\n  Supports upgrading using firmware directory, zip and 7z packages.\n  Usage: qfirehose -f FW_PATH\n\n  Warning.\n\n   - Use of software is completely on your own risk.\n     Flashing wrong firmware or failed flash can brick your modem permanently.\n     Avoid flashing, if device works without issues and updated firmware does not contain new necessary changes.\n     Do not flash, if you are not willing to take this risk or do not know what you are doing.\n\n   - After succesful flashing, you should use terminal to issue factory reset for modem settings with AT&F command.\n\n   - mPCIe users (mostly): If modem has completely disappeared after succesful flashing, reason might be that some firmware updates\n     set default mode to USB3 which is unsupported by some mPCIe slots, in this case, you should connect it to USB\n     port using mPCIe -> USB adapter, even most of cheap chinese modules can reveal device. After this you should issue\n     a command to use USB2, which may vary between models, but on most Quectel modems is: AT+QUSBCFG=\"SS\",0\n     Changing value on end of AT command 0 to 1, selects USB3 instead. Refer to documents of your modem.\nendef\n\ndefine Build/Configure\n\t$(RM) $(PKG_BUILD_DIR)/QFirehose\nendef\n\nMAKE_ARGS += linux\n\ndefine Package/qfirehose/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/QFirehose $(1)/usr/bin/qfirehose\nendef\n\n$(eval $(call BuildPackage,qfirehose))\n"
  },
  {
    "path": "luci-app-qfirehose/root/etc/config/qfirehose",
    "content": "config qfirehose 'config'\n    option skip_md5 '0'\n    option erase_all '0'\n    option signed_firmware '0'\n    option device_type 'nand'\n"
  },
  {
    "path": "luci-app-qfirehose/root/etc/init.d/qfirehose",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=99\n\nstart() {\n    mkdir -p /tmp/qfirehoseupload\n    mkdir -p /tmp/qfirehose_log\n}\n\nstop() {\n    rm -f /tmp/qfirehose_log/pid\n    rm -f /tmp/qfirehose_log/status\n}\n"
  },
  {
    "path": "luci-app-qfirehose/root/usr/sbin/qfirehose-modem-info",
    "content": "#!/bin/sh\n\n# 获取模组信息（模组名称、固件版本）\n# 通过 AT 命令查询，需要 socat 工具\n# 输出格式：每行一个 key=value\n\n# 尝试的 AT 端口列表（优先 ttyUSB2，移远模组通常用 USB2 作 AT 口）\nAT_PORTS=\"/dev/ttyUSB2 /dev/ttyUSB1 /dev/ttyUSB3 /dev/ttyUSB0\"\n\n# 检查 socat 是否可用\nif ! command -v socat >/dev/null 2>&1; then\n    echo \"model=N/A\"\n    echo \"firmware=N/A\"\n    echo \"error=socat not found\"\n    exit 0\nfi\n\n# 发送 AT 命令并获取响应\nsend_at() {\n    local port=\"$1\"\n    local cmd=\"$2\"\n    local result\n    result=$(echo -e \"${cmd}\\r\" | socat -T1 - \"$port\",crnl,rawer,nonblock=1,b115200,echo=0 2>/dev/null)\n    echo \"$result\"\n}\n\n# 尝试各个端口\nfor port in $AT_PORTS; do\n    [ -c \"$port\" ] || continue\n\n    # 先测试端口是否响应\n    resp=$(send_at \"$port\" \"AT\")\n    echo \"$resp\" | grep -q \"OK\" || continue\n\n    # 获取模组型号（ATI 命令）\n    ati=$(send_at \"$port\" \"ATI\")\n    model=$(echo \"$ati\" | sed -n '3p' | tr -d '\\r')\n\n    # 获取固件版本（AT+QGMR 或 AT+CGMR）\n    gmr=$(send_at \"$port\" \"AT+QGMR\")\n    if echo \"$gmr\" | grep -q \"OK\"; then\n        firmware=$(echo \"$gmr\" | sed -n '2p' | tr -d '\\r')\n    else\n        gmr=$(send_at \"$port\" \"AT+CGMR\")\n        firmware=$(echo \"$gmr\" | sed -n '2p' | tr -d '\\r')\n    fi\n\n    # 获取 IMEI（可选）\n    imei_resp=$(send_at \"$port\" \"AT+CGSN\")\n    if echo \"$imei_resp\" | grep -q \"OK\"; then\n        imei=$(echo \"$imei_resp\" | sed -n '2p' | tr -d '\\r')\n    fi\n\n    echo \"model=${model:-N/A}\"\n    echo \"firmware=${firmware:-N/A}\"\n    [ -n \"$imei\" ] && echo \"imei=$imei\"\n    echo \"port=$port\"\n    exit 0\ndone\n\n# 没有找到可用端口\necho \"model=N/A\"\necho \"firmware=N/A\"\necho \"error=No AT port found\"\n"
  },
  {
    "path": "luci-app-qfirehose/root/usr/sbin/qfirehose-start",
    "content": "#!/bin/sh\n\n# QFirehose 启动脚本\n# 上游 v1.4.17 已内置 zip/7z 解压功能，可直接传入压缩包路径\n#\n# 日志实时性说明：\n#   qfirehose 的 dbg_time() 宏在每次 fprintf(stdout) 后都调用了 fflush(stdout)，\n#   因此只要 stdout 直接重定向到文件（不经过管道/tee），每条日志都会立即写入磁盘。\n#   不使用 -l 参数，因为 -l 写入的 loghandler 没有 fflush，反而有缓冲延迟。\n#   前端 buildArgs() 也不应传 -l 参数。\n\nLOG_DIR=\"/tmp/qfirehose_log\"\n\n# 确保目录存在\nmkdir -p /tmp/qfirehoseupload\nmkdir -p \"$LOG_DIR\"\n\n# 生成带时间戳的日志文件名\ntimestamp=$(date +%Y%m%d_%H%M%S)\nlog_file=\"$LOG_DIR/qfirehose_${timestamp}.log\"\npid_file=\"$LOG_DIR/pid\"\nstatus_file=\"$LOG_DIR/status\"\n\n# 创建符号链接指向最新的日志文件\nln -sf \"$log_file\" \"$LOG_DIR/current.log\"\n\n# 初始化状态\necho \"flashing\" > \"$status_file\"\n\n# 检查 qfirehose 是否可执行\nif [ ! -x /usr/bin/qfirehose ]; then\n    echo \"Error: qfirehose not found or not executable\" > \"$log_file\"\n    echo \"failed\" > \"$status_file\"\n    exit 1\nfi\n\n# 记录执行命令\necho \"QFirehose start at $(date)\" > \"$log_file\"\necho \"Command: /usr/bin/qfirehose $*\" >> \"$log_file\"\necho \"---\" >> \"$log_file\"\n\n# 启动 qfirehose 并将其放入后台运行\n# stdout 直接重定向到文件（非管道），利用 qfirehose 内部的 fflush(stdout) 实现实时写入\n# stderr 也合并到 stdout，确保错误信息不丢失\n(\n    /usr/bin/qfirehose \"$@\" >> \"$log_file\" 2>&1\n    ret=$?\n    # 通过退出码和日志关键字双重判断结果\n    if [ \"$ret\" = \"0\" ] && grep -q \"Upgrade module successfully\" \"$log_file\" 2>/dev/null; then\n        echo \"completed\" > \"$status_file\"\n    else\n        echo \"failed\" > \"$status_file\"\n    fi\n) &\necho $! > \"$pid_file\"\n"
  },
  {
    "path": "luci-app-qfirehose/root/usr/sbin/qfirehose-status",
    "content": "#!/bin/sh\n\n# QFirehose 状态查询脚本\n# 只返回状态字符串（不含日志），日志由前端直接 cat current.log 获取\n# 状态值：idle / flashing / completed / failed\n\nLOG_DIR=\"/tmp/qfirehose_log\"\nstatus_file=\"$LOG_DIR/status\"\npid_file=\"$LOG_DIR/pid\"\nlog_file=\"$LOG_DIR/current.log\"\n\n# 检查状态文件\nif [ ! -f \"$status_file\" ]; then\n    echo \"idle\"\n    exit 0\nfi\n\nstatus=$(cat \"$status_file\" 2>/dev/null)\n\n# 检查进程是否仍在运行\nif [ -f \"$pid_file\" ]; then\n    PID=$(cat \"$pid_file\" 2>/dev/null)\n    if [ -n \"$PID\" ] && kill -0 \"$PID\" 2>/dev/null; then\n        # 进程仍在运行\n        status=\"flashing\"\n    elif [ \"$status\" = \"flashing\" ]; then\n        # 进程已退出但状态文件未更新（异常退出），检查日志判断结果\n        if [ -f \"$log_file\" ] && grep -q \"Upgrade module successfully\" \"$log_file\" 2>/dev/null; then\n            status=\"completed\"\n        else\n            status=\"failed\"\n        fi\n        echo \"$status\" > \"$status_file\"\n    fi\nfi\n\n# 输出纯文本状态（不用 JSON，避免转义问题）\necho \"$status\"\n"
  },
  {
    "path": "luci-app-qfirehose/root/usr/share/luci/menu.d/luci-app-qfirehose.json",
    "content": "{\n    \"admin/modem/qfirehose\": {\n        \"title\": \"QFirehose\",\n        \"order\": 90,\n        \"action\": {\n            \"type\": \"view\",\n            \"path\": \"qfirehose\"\n        },\n        \"depends\": {\n            \"acl\": [ \"luci-app-qfirehose\" ],\n            \"uci\": [ \"qfirehose\" ]\n        }\n    }\n}\n"
  },
  {
    "path": "luci-app-qfirehose/root/usr/share/rpcd/acl.d/luci-app-qfirehose.json",
    "content": "{\n    \"luci-app-qfirehose\": {\n        \"description\": \"Grant access to QFirehose configuration\",\n        \"read\": {\n            \"cgi-io\": [ \"upload\" ],\n            \"file\": {\n                \"/usr/bin/qfirehose\": [ \"exec\" ],\n                \"/usr/sbin/qfirehose-start\": [ \"exec\" ],\n                \"/usr/sbin/qfirehose-status\": [ \"exec\" ],\n                \"/usr/sbin/qfirehose-modem-info\": [ \"exec\" ],\n                \"/bin/cat\": [ \"exec\" ],\n                \"/bin/rm\": [ \"exec\" ],\n                \"/tmp/qfirehoseupload\": [ \"read\", \"write\" ],\n                \"/tmp/qfirehoseupload/*\": [ \"read\", \"write\" ],\n                \"/tmp/qfirehose_log\": [ \"read\", \"write\" ],\n                \"/tmp/qfirehose_log/*\": [ \"read\", \"write\" ]\n            },\n            \"ubus\": {\n                \"file\": [ \"read\", \"write\", \"exec\", \"stat\", \"list\" ],\n                \"system\": [ \"info\" ]\n            },\n            \"uci\": [ \"qfirehose\" ]\n        },\n        \"write\": {\n            \"cgi-io\": [ \"upload\" ],\n            \"file\": {\n                \"/tmp/qfirehoseupload\": [ \"write\" ],\n                \"/tmp/qfirehoseupload/*\": [ \"write\" ],\n                \"/tmp/qfirehose_log/*\": [ \"write\" ]\n            },\n            \"ubus\": {\n                \"file\": [ \"write\", \"exec\", \"list\" ]\n            },\n            \"uci\": [ \"qfirehose\" ]\n        }\n    }\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/ndisc6/Makefile",
    "content": "#\n# Copyright (C) 2006-2012 OpenWrt.org\n#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=ndisc6\nPKG_VERSION:=1.0.2\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2\nPKG_SOURCE_URL:=http://www.remlab.net/files/ndisc6\nPKG_MD5SUM:=50cb4c19606cf6ff2b7388e71832f579\n\nPKG_INSTALL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/ndisc\n  SECTION:=ipv6\n  CATEGORY:=IPv6\n  SUBMENU:=IPv6 discovery tools\n  TITLE:=IPv6 discovery tools\n  URL:=http://www.remlab.net/ndisc6/\n  DEPENDS:=+libpthread +librt\nendef\n\ndefine Package/ndisc/description\nIPv6 discovery tools\nendef\n\ndefine Package/ndisc6\n  $(call Package/ndisc)\n  TITLE:=An ICMPv6 neighbour discovery tool\nendef\n\ndefine Package/ndisc6/description\nAn ICMPv6 neighbour discovery tools\nendef\n\ndefine Package/rdisc6\n  $(call Package/ndisc)\n  TITLE:=An ICMPv6 router discovery tool\nendef\n\ndefine Package/rdisc6/description\nAn ICMPv6 router discovery tool\nendef\n\ndefine Package/traceroute6\n  $(call Package/ndisc)\n  TITLE:=An IPv6-based traceroute implementation\nendef\n\ndefine Package/traceroute6/description\nAn IPv6-based traceroute implementation\nendef\n\ndefine Package/rdnssd\n  $(call Package/ndisc)\n  TITLE:=DNS server discovery daemon\nendef\n\ndefine Package/rdnssd/description\nA recursive DNS server discovery daemon gathering\ninformation through stateless IPv6 autoconfiguration (RFC5006)\nendef\n\nTARGET_CFLAGS += -std=c99\n\ndefine Package/ndisc6/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/ndisc6 $(1)/usr/bin/\nendef\n\ndefine Package/rdisc6/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/rdisc6 $(1)/usr/bin/\nendef\n\ndefine Package/traceroute6/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/{rl,tcp}traceroute6 $(1)/usr/bin/\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/tracert6 $(1)/usr/bin/\nendef\n\ndefine Package/rdnssd/install\n\t$(INSTALL_DIR) $(1)/usr/sbin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/rdnssd $(1)/usr/sbin/\nendef\n\n$(eval $(call BuildPackage,ndisc6))\n$(eval $(call BuildPackage,rdisc6))\n$(eval $(call BuildPackage,traceroute6))\n$(eval $(call BuildPackage,rdnssd))"
  },
  {
    "path": "luci-app-qmodem/application/ndisc6/patches/100-favor_bsd.patch",
    "content": "--- a/src/trace-tcp.c\n+++ b/src/trace-tcp.c\n@@ -24,6 +24,7 @@\n \n #undef _GNU_SOURCE\n #define _BSD_SOURCE 1\n+#define __FAVOR_BSD 1\n \n #include <string.h>\n #include <inttypes.h>\n--- a/src/trace-udp.c\n+++ b/src/trace-udp.c\n@@ -24,6 +24,7 @@\n \n #undef _GNU_SOURCE\n #define _BSD_SOURCE 1\n+#define __FAVOR_BSD 1\n \n #include <string.h>\n #include <stdbool.h>\n"
  },
  {
    "path": "luci-app-qmodem/application/ndisc6/patches/110-strverscmp.patch",
    "content": "--- a/rdnssd/Makefile.am\n+++ b/rdnssd/Makefile.am\n@@ -30,7 +30,8 @@ conf_SCRIPTS = merge-hook\n # rdnssd\n rdnssd_SOURCES = rdnssd.c rdnssd.h \\\n \ticmp.c \\\n-\tnetlink.c\n+\tnetlink.c \\\n+\tstrverscmp.c\n rdnssd_LDADD = $(LIBRT) \\\n \t\t@top_builddir@/compat/libcompat.a\n \n--- a/rdnssd/Makefile.in\n+++ b/rdnssd/Makefile.in\n@@ -60,7 +60,7 @@ CONFIG_CLEAN_FILES =\n CONFIG_CLEAN_VPATH_FILES =\n am__installdirs = \"$(DESTDIR)$(sbindir)\" \"$(DESTDIR)$(confdir)\"\n PROGRAMS = $(sbin_PROGRAMS)\n-am_rdnssd_OBJECTS = rdnssd.$(OBJEXT) icmp.$(OBJEXT) netlink.$(OBJEXT)\n+am_rdnssd_OBJECTS = rdnssd.$(OBJEXT) icmp.$(OBJEXT) netlink.$(OBJEXT) strverscmp.$(OBJEXT)\n rdnssd_OBJECTS = $(am_rdnssd_OBJECTS)\n am__DEPENDENCIES_1 =\n rdnssd_DEPENDENCIES = $(am__DEPENDENCIES_1) \\\n@@ -251,7 +251,8 @@ conf_SCRIPTS = merge-hook\n # rdnssd\n rdnssd_SOURCES = rdnssd.c rdnssd.h \\\n \ticmp.c \\\n-\tnetlink.c\n+\tnetlink.c \\\n+\tstrverscmp.c\n \n rdnssd_LDADD = $(LIBRT) \\\n \t\t@top_builddir@/compat/libcompat.a\n@@ -373,6 +374,7 @@ distclean-compile:\n \n @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/icmp.Po@am__quote@\n @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/netlink.Po@am__quote@\n+@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/strverscmp.Po@am__quote@\n @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rdnssd.Po@am__quote@\n \n .c.o:\n--- /dev/null\n+++ b/rdnssd/strverscmp.c\n@@ -0,0 +1,131 @@\n+/* Compare strings while treating digits characters numerically.\n+   Copyright (C) 1997, 2000, 2002, 2004 Free Software Foundation, Inc.\n+   This file is part of the GNU C Library.\n+   Contributed by Jean-François Bignolles <bignolle@ecoledoc.ibp.fr>, 1997.\n+\n+   This program is free software; you can redistribute it and/or modify\n+   it under the terms of the GNU General Public License as published by\n+   the Free Software Foundation; either version 2, or (at your option)\n+   any later version.\n+\n+   This program is distributed in the hope that it will be useful,\n+   but WITHOUT ANY WARRANTY; without even the implied warranty of\n+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n+   GNU General Public License for more details.\n+\n+   You should have received a copy of the GNU General Public License along\n+   with this program; if not, write to the Free Software Foundation,\n+   Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.  */\n+\n+#ifdef HAVE_CONFIG_H\n+# include <config.h>\n+#endif\n+\n+#include <string.h>\n+#include <ctype.h>\n+\n+/* states: S_N: normal, S_I: comparing integral part, S_F: comparing\n+           fractional parts, S_Z: idem but with leading Zeroes only */\n+#define S_N    0x0\n+#define S_I    0x4\n+#define S_F    0x8\n+#define S_Z    0xC\n+\n+/* result_type: CMP: return diff; LEN: compare using len_diff/diff */\n+#define CMP    2\n+#define LEN    3\n+\n+\n+/* ISDIGIT differs from isdigit, as follows:\n+   - Its arg may be any int or unsigned int; it need not be an unsigned char.\n+   - It's guaranteed to evaluate its argument exactly once.\n+   - It's typically faster.\n+   POSIX says that only '0' through '9' are digits.  Prefer ISDIGIT to\n+   ISDIGIT_LOCALE unless it's important to use the locale's definition\n+   of `digit' even when the host does not conform to POSIX.  */\n+#define ISDIGIT(c) ((unsigned int) (c) - '0' <= 9)\n+\n+#undef __strverscmp\n+#undef strverscmp\n+\n+#ifndef weak_alias\n+# define __strverscmp strverscmp\n+#endif\n+\n+/* Compare S1 and S2 as strings holding indices/version numbers,\n+   returning less than, equal to or greater than zero if S1 is less than,\n+   equal to or greater than S2 (for more info, see the texinfo doc).\n+*/\n+\n+int\n+__strverscmp (const char *s1, const char *s2)\n+{\n+  const unsigned char *p1 = (const unsigned char *) s1;\n+  const unsigned char *p2 = (const unsigned char *) s2;\n+  unsigned char c1, c2;\n+  int state;\n+  int diff;\n+\n+  /* Symbol(s)    0       [1-9]   others  (padding)\n+     Transition   (10) 0  (01) d  (00) x  (11) -   */\n+  static const unsigned int next_state[] =\n+  {\n+      /* state    x    d    0    - */\n+      /* S_N */  S_N, S_I, S_Z, S_N,\n+      /* S_I */  S_N, S_I, S_I, S_I,\n+      /* S_F */  S_N, S_F, S_F, S_F,\n+      /* S_Z */  S_N, S_F, S_Z, S_Z\n+  };\n+\n+  static const int result_type[] =\n+  {\n+      /* state   x/x  x/d  x/0  x/-  d/x  d/d  d/0  d/-\n+                 0/x  0/d  0/0  0/-  -/x  -/d  -/0  -/- */\n+\n+      /* S_N */  CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,\n+                 CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,\n+      /* S_I */  CMP, -1,  -1,  CMP,  1,  LEN, LEN, CMP,\n+                  1,  LEN, LEN, CMP, CMP, CMP, CMP, CMP,\n+      /* S_F */  CMP, CMP, CMP, CMP, CMP, LEN, CMP, CMP,\n+                 CMP, CMP, CMP, CMP, CMP, CMP, CMP, CMP,\n+      /* S_Z */  CMP,  1,   1,  CMP, -1,  CMP, CMP, CMP,\n+                 -1,  CMP, CMP, CMP\n+  };\n+\n+  if (p1 == p2)\n+    return 0;\n+\n+  c1 = *p1++;\n+  c2 = *p2++;\n+  /* Hint: '0' is a digit too.  */\n+  state = S_N | ((c1 == '0') + (ISDIGIT (c1) != 0));\n+\n+  while ((diff = c1 - c2) == 0 && c1 != '\\0')\n+    {\n+      state = next_state[state];\n+      c1 = *p1++;\n+      c2 = *p2++;\n+      state |= (c1 == '0') + (ISDIGIT (c1) != 0);\n+    }\n+\n+  state = result_type[state << 2 | ((c2 == '0') + (ISDIGIT (c2) != 0))];\n+\n+  switch (state)\n+    {\n+    case CMP:\n+      return diff;\n+\n+    case LEN:\n+      while (ISDIGIT (*p1++))\n+\tif (!ISDIGIT (*p2++))\n+\t  return 1;\n+\n+      return ISDIGIT (*p2) ? -1 : diff;\n+\n+    default:\n+      return state;\n+    }\n+}\n+#ifdef weak_alias\n+weak_alias (__strverscmp, strverscmp)\n+#endif\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=qfirehose\nPKG_VERSION:=1.4.21\nPKG_RELEASE:=1\n\nPKG_MAINTAINER:=Oskari Rauta <oskari.rauta@gmail.com>\nPKG_LICENSE:=\nPKG_LICENSE_FILES:=NOTICE\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/qfirehose\n  SECTION:=utils\n  CATEGORY:=Utilities\n  TITLE:=Quectel Firehose Recovery application\n  URL:=https://github.com/nippynetworks/qfirehose\nendef\n\ndefine Package/qfirehose/description\n  Utility that is able to flash firmwares on Quectel's modems.\n  Usage: qfirehose -f FW_PATH\n  \n  Warning.\n\n   - Use of software is completely on your own risk.\n     Flashing wrong firmware or failed flash can brick your modem permanently.\n     Avoid flashing, if device works without issues and updated firmware does not contain new necessary changes.\n     Do not flash, if you are not willing to take this risk or do not know what you are doing.\n\n   - After succesful flashing, you should use terminal to issue factory reset for modem settings with AT&F command.\n\n   - mPCIe users (mostly): If modem has completely disappeared after succesful flashing, reason might be that some firmware updates\n     set default mode to USB3 which is unsupported by some mPCIe slots, in this case, you should connect it to USB\n     port using mPCIe -> USB adapter, even most of cheap chinese modules can reveal device. After this you should issue\n     a command to use USB2, which may vary between models, but on most Quectel modems is: AT+QUSBCFG=\"SS\",0\n     Changing value on end of AT command 0 to 1, selects USB3 instead. Refer to documents of your modem.\nendef\n\ndefine Build/Prepare\n\tmkdir -p $(PKG_BUILD_DIR)\n\t$(CP) ./src/* $(PKG_BUILD_DIR)/\nendef\n\nMAKE_ARGS += linux\n\ndefine Package/qfirehose/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/out/QFirehose $(1)/usr/bin/qfirehose\nendef\n\n$(eval $(call BuildPackage,qfirehose))\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/.clang-format",
    "content": "---\nBasedOnStyle: Google\n---\nLanguage: Cpp\nAccessModifierOffset: -4\n# AlignAfterOpenBracket: Align\n# AlignConsecutiveMacros: false\n# AlignConsecutiveAssignments: false\n# AlignConsecutiveDeclarations: false\n# AlignEscapedNewlines: Left\n# AlignOperands: true\n# AlignTrailingComments: true\n# AllowAllArgumentsOnNextLine: true\nAllowAllConstructorInitializersOnNextLine: false\n# AllowAllParametersOfDeclarationOnNextLine: true\n# AllowShortBlocksOnASingleLine: Never\nAllowShortCaseLabelsOnASingleLine: true\n# AllowShortFunctionsOnASingleLine: All\n# AllowShortLambdasOnASingleLine: All\n# AllowShortIfStatementsOnASingleLine: WithoutElse\n# AllowShortLoopsOnASingleLine: true\n# AlwaysBreakAfterDefinitionReturnType: None\n# AlwaysBreakAfterReturnType: None\nAlwaysBreakBeforeMultilineStrings: false\n# AlwaysBreakTemplateDeclarations: Yes\n# BinPackArguments: true\n# BinPackParameters: true\nBraceWrapping:\n  # AfterCaseLabel: false\n  AfterClass: true\n  AfterControlStatement: Always\n  AfterEnum: true\n  AfterFunction: true\n  # AfterNamespace: false\n  # AfterObjCDeclaration: false\n  AfterStruct: true\n  AfterUnion: true\n  AfterExternBlock: true\n  BeforeCatch: true\n  BeforeElse: true\n  # IndentBraces: false\n  # SplitEmptyFunction: true\n  # SplitEmptyRecord: true\n  # SplitEmptyNamespace: true\n# BreakBeforeBinaryOperators: None\nBreakBeforeBraces: Custom\n# BreakBeforeInheritanceComma: false\n# BreakInheritanceList: BeforeColon\n# BreakBeforeTernaryOperators: true\n# BreakConstructorInitializersBeforeComma: false\n# BreakConstructorInitializers: BeforeColon\n# BreakAfterJavaFieldAnnotations: false\n# BreakStringLiterals: true\nColumnLimit: 180\nCommentPragmas: \"^ NOLINT:\"\n# CompactNamespaces: false\n# ConstructorInitializerAllOnOneLineOrOnePerLine: true\n# ConstructorInitializerIndentWidth: 4\n# ContinuationIndentWidth: 4\n# Cpp11BracedListStyle: true\n# DeriveLineEnding: true\n# DerivePointerAlignment: true\n# DisableFormat: false\n# ExperimentalAutoDetectBinPacking: false\n# FixNamespaceComments: true\n# ForEachMacros:\n#   - foreach\n#   - Q_FOREACH\n#   - BOOST_FOREACH\n# IncludeBlocks: Regroup\n# IncludeCategories:\n#   - Regex: '^<ext/.*\\.h>'\n#     Priority: 2\n#     SortPriority: 0\n#   - Regex: '^<.*\\.h>'\n#     Priority: 1\n#     SortPriority: 0\n#   - Regex: \"^<.*\"\n#     Priority: 2\n#     SortPriority: 0\n#   - Regex: \".*\"\n#     Priority: 3\n#     SortPriority: 0\n# IncludeIsMainRegex: \"([-_](test|unittest))?$\"\n# IncludeIsMainSourceRegex: \"\"\n# IndentCaseLabels: true\n# IndentGotoLabels: true\n# IndentPPDirectives: None\nIndentWidth: 4\n# IndentWrappedFunctionNames: false\n# JavaScriptQuotes: Leave\n# JavaScriptWrapImports: true\n# KeepEmptyLinesAtTheStartOfBlocks: false\n# MacroBlockBegin: \"\"\n# MacroBlockEnd: \"\"\n# MaxEmptyLinesToKeep: 1\n# NamespaceIndentation: None\n# ObjCBinPackProtocolList: Never\n# ObjCBlockIndentWidth: 2\n# ObjCSpaceAfterProperty: false\n# ObjCSpaceBeforeProtocolList: true\n# PenaltyBreakAssignment: 2\n# PenaltyBreakBeforeFirstCallParameter: 1\n# PenaltyBreakComment: 300\n# PenaltyBreakFirstLessLess: 120\n# PenaltyBreakString: 1000\n# PenaltyBreakTemplateDeclaration: 10\n# PenaltyExcessCharacter: 1000000\n# PenaltyReturnTypeOnItsOwnLine: 200\nPointerAlignment: Right\n# RawStringFormats:\n#   - Language: Cpp\n#     Delimiters:\n#       - cc\n#       - CC\n#       - cpp\n#       - Cpp\n#       - CPP\n#       - \"c++\"\n#       - \"C++\"\n#     CanonicalDelimiter: \"\"\n#     BasedOnStyle: google\n#   - Language: TextProto\n#     Delimiters:\n#       - pb\n#       - PB\n#       - proto\n#       - PROTO\n#     EnclosingFunctions:\n#       - EqualsProto\n#       - EquivToProto\n#       - PARSE_PARTIAL_TEXT_PROTO\n#       - PARSE_TEST_PROTO\n#       - PARSE_TEXT_PROTO\n#       - ParseTextOrDie\n#       - ParseTextProtoOrDie\n#     CanonicalDelimiter: \"\"\n#     BasedOnStyle: google\n# ReflowComments: true\nSortIncludes: false\nSortUsingDeclarations: false\n# SpaceAfterCStyleCast: false\n# SpaceAfterLogicalNot: false\n# SpaceAfterTemplateKeyword: true\n# SpaceBeforeAssignmentOperators: true\n# SpaceBeforeCpp11BracedList: false\n# SpaceBeforeCtorInitializerColon: true\n# SpaceBeforeInheritanceColon: true\n# SpaceBeforeParens: ControlStatements\n# SpaceBeforeRangeBasedForLoopColon: true\n# SpaceInEmptyBlock: false\n# SpaceInEmptyParentheses: false\nSpacesBeforeTrailingComments: 1\n# SpacesInAngles: false\n# SpacesInConditionalStatement: false\nSpacesInContainerLiterals: false\n# SpacesInCStyleCastParentheses: false\n# SpacesInParentheses: false\n# SpacesInSquareBrackets: false\n# SpaceBeforeSquareBrackets: false\nStandard: Cpp11\n# StatementMacros:\n#   - Q_UNUSED\n#   - QT_REQUIRE_VERSION\nTabWidth: 4\n# UseCRLF: false\n# UseTab: Never\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/Android.mk",
    "content": "LOCAL_PATH:= $(call my-dir)\r\ninclude $(CLEAR_VARS)\r\nLOCAL_SRC_FILES:= firehose_protocol.c qfirehose.c sahara.c usb_linux.c stream_download_protocol.c md5.c usb2tcp.c\r\nLOCAL_CFLAGS += -pie -fPIE -Wall -Wextra -Werror -O1\r\nLOCAL_LDFLAGS += -pie -fPIE\r\nLOCAL_MODULE_TAGS:= optional\r\nLOCAL_MODULE:= QFirehose\r\ninclude $(BUILD_EXECUTABLE)\r\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 2.4) \n\nproject(QFirehose) \nadd_definitions(-Wall -Wextra -Werror -O1)\n\nset( QFirehose_SRCS\n     firehose_protocol.c  qfirehose.c  sahara.c usb_linux.c stream_download_protocol.c md5.c usb2tcp.c\n     )\n\nadd_executable(QFirehose ${QFirehose_SRCS})\ntarget_link_libraries(QFirehose PUBLIC pthread) \ninstall (TARGETS QFirehose DESTINATION bin)\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/Makefile",
    "content": "NDK_BUILD:=/home/aaron/share-aaron-1/android-ndk-r10e/ndk-build\r\nSRC=firehose_protocol.c  qfirehose.c  sahara.c usb_linux.c stream_download_protocol.c md5.c usb2tcp.c \r\n\r\nCFLAGS += -Wall -Wextra -Werror -g #-s\r\n# Allow incompatible-pointer-types, unused-result, and stringop-overflow warnings for vendor code compatibility\r\nCFLAGS += -Wno-error=incompatible-pointer-types -Wno-error=unused-result -Wno-error=stringop-overflow\r\nLDFLAGS += -lpthread -ldl\r\nBINPATH := ./out\r\nifeq ($(CC),cc)\r\nCC=${CROSS_COMPILE}gcc\r\nendif\r\n\r\nlinux: clean\r\n\t$(shell if [ -e  ${BINPATH}]; then echo \"file existed\";else mkdir ${BINPATH}; fi;)\r\n\t${CC} ${CFLAGS} ${SRC} -o ${BINPATH}/QFirehose ${LDFLAGS}\r\n\t\r\nandroid: clean\r\n\trm -rf android\r\n\t$(NDK_BUILD) V=0 APP_BUILD_SCRIPT=Android.mk NDK_PROJECT_PATH=`pwd` NDK_DEBUG=0 APP_ABI='armeabi-v7a,arm64-v8a' APP_PLATFORM=android-22 #16~4.1 22~5.1 25~7.1 27-32~8-12\r\n\trm -rf obj\r\n\tmv libs android\r\n\r\nclean:\r\n\trm -rf ${BINPATH}/QFirehose obj libs usb2tcp *~\r\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/NOTICE",
    "content": "Quectel hereby grants customers of Quectel a license to use, modify,\r\ndistribute and publish the Software in binary form provided that\r\ncustomers shall have no right to reverse engineer, reverse assemble,\r\ndecompile or reduce to source code form any portion of the Software. \r\nUnder no circumstances may customers modify, demonstrate, use, deliver \r\nor disclose any portion of the Software in source code form."
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/ReleaseNote.txt",
    "content": "Release Notes\r\n[QFirehose_Linux_Android_V1.4.21]\r\nDate:   08/14/2024\r\nenhancement:\r\n  1. Support EG120KEABA upgrade in RNDIS mode\r\nfix:\r\n\r\n[QFirehose_Linux_Android_V1.4.20]\r\nDate:   07/18/2024\r\nenhancement:\r\n  1. Support AG600K to upgrade using adb command let module into edl\r\n  2. Support sec-boot upgrade file to burn\r\nfix:\r\n\r\nRelease Notes\r\n[QFirehose_Linux_Android_V1.4.19]\r\nDate:   04/30/2024\r\nenhancement:\r\n  1. The input parameter can be a precise file to specify the reading of the upgrade file.\r\n  2. RG650V using rndis can use this tool to upgrade.(./QFirehose -f ${upgrade_file_path} -d emmc)\r\nfix:\r\n\r\n[QFirehose_Linux_Android_V1.4.18]\r\nDate:   12/29/2023\r\nenhancement:\r\n  1. New support for upgrading the laptop module EM120K-GL\r\n  2. New support for SA885GAPNA(ufs) upgrade\r\n  3. Added support for AG215SGLBA(with a single image greater than 40M in the firmware package) upgrade\r\n  4. New support for RM520NGL(custom PID is 0x0804) upgrade\r\nfix:\r\n\r\n[QFirehose_Linux_Android_V1.4.17]\r\nDate:   09/13/2023\r\nenhancement:\r\n  1. Added support for upgrading using zip and 7z package\r\n  2. Optimize pcie code\r\n  3. Optimize sahara code\r\nfix:\r\n\r\n[QFirehose_Linux_Android_V1.4.16]\r\nDate:   08/08/2023\r\nenhancement:\r\n  1. Update copyright\r\n  2. Hide -e full wipe, but retain this feature\r\n  3. Fix errors in klocwork scanning\r\n  4. Code optimization for erase partitioning operations for nand storage modules\r\nfix:\r\n\r\n[QFirehose_Linux_Android_V1.4.15]\r\nDate:   06/29/2023\r\nenhancement:\r\n  1. Added support for upgrading laptop EM05G-SE10\r\n  2. Modify the copyright time and add copyright to some c or h files\r\n  3. Optimize sahara protocol code\r\nfix:\r\n\r\n[QFirehose_Linux_Android_V1.4.14]\r\nDate:   04/29/2023\r\nenhancement:\r\n  1. Added support for upgrading laptop EM05-G and EM061KGL\r\n  2. Added support for AG590ECNAB upgrade\r\n  3. Added support for upgrading the RM520NGL Lenovo 5G module (with a specified PID of 0x0803)\r\n  4. Added support for upgrading AG215S-GLR signed firmware version packs\r\nfix:\r\n\r\n[QFirehose_Linux_Android_V1.4.13]\r\nDate:   02/20/2023\r\nenhancement:\r\n  1. New support for upgrading multiple PCIE modules in a specified way, with a maximum of 10 PCIE modules connected at the same time\r\n  2. Optimization module connection USB3.0 upgrade\r\nfix:\r\n\r\n[QFirehose_Linux_Android_V1.4.12]\r\nDate:   12/15/2022\r\nenhancement:\r\n  1. Added support for Qualcomm subcontracting firmware upgrade (also compatible with non subcontracting firmware)\r\n  2. Added EC20��3C93 FFFF��upgrade\r\n  3. Add BG95M3 anti misburning function\r\n  4. Add other device type full wipe upgrade functions except nand\r\nfix:\r\n\r\n[QFirehose_Linux_Android_V1.4.11]\r\nDate:   08/29/2022\r\nenhancement:\r\n  1. Better support emmc and ufs smart module\r\n  2. remove function upgrade one file by '-f filename', nobody use it\r\n     and make source code complex and difficult to understand.\r\n     if customer need this function, can by modify firehose/rawprogram_nand_p4K_b256K_factory.xml\r\n  3. if there is no md5.txt, just ignore, donot treat as error\r\n  4. New support for upgrading Qualcomm AG215SGLR module and AG215SGLBA module\r\nfix:\r\n\r\n[QFirehose_Linux_Android_V1.4.10]\r\nDate:   07/15/2022\r\nenhancement:\r\n  1. New support for laptop EM05 series and EG060K-EA module upgrade\r\nfix:\r\n\r\n[QFirehose_Linux_Android_V1.4.9]\r\nDate:   01/17/2022\r\nenhancement:\r\n  1. Solve the problem that DM upgrade is stuck because DM keeps spitting logs\r\nfix:\r\n\r\n[QFirehose_Linux_Android_V1.4.8]\r\nDate:   11/12/2021\r\nenhancement:\r\n  1. EM05CE Interface0 is a non-DM port with input and output endpoints. The actual DM port is Interface3\r\n  2. EM05-G Upgrade Process Power off and power on. The next upgrade takes a long time to switch to download mode. Increase the waiting time to 10 seconds\r\n  3. Optimized receiving and sending buf, no longer sharing one buf\r\nfix:\r\n\r\n[QFirehose_Linux_Android_V1.4.7]\r\nDate:   9/28/2021\r\nenhancement:\r\n  1. Support EM05-G, DM is at usb interface 3\r\n  2. Added support for smart platform SC600Y-EM and SC60-CE upgrade\r\n  3. Support sdx20 quallcomm default 056c/901f\r\nfix:\r\n\r\n[Quectel_LTE&5G_QFirehose_Linux&Android_V1.4.6]\r\nDate:   6/11/2021\r\nenhancement:\r\nfix:\r\n\t1. ���Ӷ�EC20������Ŀ\r\n\r\n[Quectel_LTE&5G_QFirehose_Linux&Android_V1.4.5]\r\nDate:   3/4/2021\r\nenhancement:\r\nfix:\r\n\t1. fix upgrdae fail of AG550/EM120\r\n\t\r\n[Quectel_LTE&5G_QFirehose_Linux&Android_V1.4.4]\r\nDate:   1/27/202\r\nenhancement:\r\nfix:\r\n\t1. increase timeout of erase cmd to 15 seconds (from 6 seconds)\t\r\n\t \r\n[Quectel_LTE&5G_QFirehose_Linux&Android_V1.4.3]\t \r\nDate:   12/2/2020\r\nenhancement:\r\n  1. '-u usbmon.log': The time stamp in usbmon.log is same QFirehose self\r\n  2. USB ZLP: if kernel verison <= 4.2 and usb controoler type is XHCI.\r\n     there is a USB ZLP bug which cause FW upgrade fail at 0%,\r\n     print Warnning for this bug and tell customer how to fix.\r\nfix:\r\n\t1. AG35: FW upgrade fail (A very low probability) in one customer's factory\t\r\n\t  \r\n[Quectel_LTE&5G_QFirehose_Linux&Android_V1.4]\r\nDate:   8/26/2020\r\nenhancement:\r\n  1.  release to <Technical Writer>\r\nfix:\r\n  \r\n[Quectel_LTE&5G_QFirehose_Linux&Android_V1.3.3]\t  \r\nDate:   7/27/2020 \r\nenhancement:\r\nfix:\r\n\t1. \tAG525 has more than 32 partitions, support this\r\n\r\n[Quectel_LTE&5G_QFirehose_Linux&Android_V1.3.2]\t  \r\nDate:   7/27/2020 \r\nenhancement: \r\nfix:\r\n\t1. filter out ASR/HISI modems, only support MDM/SDX modems\r\n  2. FW upgrade fail when USB3.0 modems switch EDL mode (05c6:9008),\r\n     will become usb2.0 device, and the /sys/bus/usb/devices/x-x will change\r\n\r\n[Quectel_LTE&5G_QFirehose_Linux&Android_V1.3]\r\nDate:   4/14/2020 \r\nenhancement: \r\n  1. X55 support upgrade from RAM DUMP state\r\nfix:\r\n\r\n[LTE&5G_QFirehose_Linux&Android_V1.2.4]\r\nDate:   3/26/2020\r\nenhancement:\r\n\t1. make sure 'first erase SBL, last program SBL', even The sequence in update/firehose/rawprogram*.xml is wrong\r\nfix:  \r\n\r\n[LTE&5G_QFirehose_Linux&Android_V1.2.3]\r\nDate:   2/24/2019\r\nenhancement:\r\n  1. support 'vendor' attribute in rawprogram*.xml\r\n  2. support '-u usbmon_logfile', can capture usbmon log when upgrade module.\r\nfix:  \r\n\r\n[LTE&5G_QFirehose_Linux&Android_V1.2.2]\r\nDate:   12/11/2019\r\nenhancement:\r\n  1. auto detect and detach kernel driver when modem in EDL mode (05c6:9008).\r\nfix:  \r\n  1. Do not exit if get version command fails\r\n\t   \r\n[LTE&5G_QFirehose_Linux&Android_V1.2]\r\nDate:   2019/07/31\r\nenhancement:\r\n  1. First Release Version of QFirehose Tool.\r\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/firehose_protocol.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software.\r\n    Under no circumstances may customers modify, demonstrate, use, deliver\r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include \"usb_linux.h\"\r\n#include <poll.h>\r\n#include <pthread.h>\r\n#include <sys/socket.h>\r\n/*\r\n#define error_return()                                             \\\r\n    do                                                             \\\r\n    {                                                              \\\r\n        dbg_time(\"%s %s %d fail\\n\", __FILE__, __func__, __LINE__); \\\r\n        return __LINE__;                                           \\\r\n    } while (0)\r\n    */\r\nint recv_sc600y_configure_num = 1;\r\nextern const char *q_device_type;\r\nstatic int fh_recv_cmd_sk[2];\r\nextern unsigned q_module_packet_sign;\r\n\r\nextern unsigned q_erase_all_before_download;\r\nextern int update_transfer_bytes(long long bytes_cur);\r\nextern int show_progress();\r\n\r\nchar file_name_image[128] = {0};\r\nchar file_name_image_dir[256] = {0};\r\n\r\ntypedef struct sparse_header\r\n{\r\n    uint32_t magic;          /* 0xed26ff3a */\r\n    uint16_t major_version;  /* (0x1) - reject images with higher major versions */\r\n    uint16_t minor_version;  /* (0x0) - allow images with higer minor versions */\r\n    uint16_t file_hdr_sz;    /* 28 bytes for first revision of the file format */\r\n    uint16_t chunk_hdr_sz;   /* 12 bytes for first revision of the file format */\r\n    uint32_t blk_sz;         /* block size in bytes, must be a multiple of 4 (4096) */\r\n    uint32_t total_blks;     /* total blocks in the non-sparse output image */\r\n    uint32_t total_chunks;   /* total chunks in the sparse input image */\r\n    uint32_t image_checksum; /* CRC32 checksum of the original data, counting\r\n                                \"don't care\" */\r\n                             /* as 0. Standard 802.3 polynomial, use a Public Domain */\r\n                             /* table implementation */\r\n} sparse_header_t;\r\n\r\n#define SPARSE_HEADER_MAGIC 0xed26ff3a\r\n\r\ntypedef struct chunk_header\r\n{\r\n    uint16_t chunk_type; /* 0xCAC1 -> raw; 0xCAC2 -> fill; 0xCAC3 -> don't care */\r\n    uint16_t reserved1;\r\n    uint32_t chunk_sz; /* in blocks in output image */\r\n    uint32_t total_sz; /* in bytes of chunk input file including chunk header and\r\n                          data */\r\n} chunk_header_t;\r\n\r\ntypedef struct chunk_polymerization_params\r\n{\r\n    uint32_t total_chunk_sz;\r\n    uint32_t total_sz;\r\n    uint16_t total_chunk_count;\r\n    // uint16_t file_sector_offset;\r\n} chunk_polymerization_param;\r\n\r\ntypedef struct SparseImgParams\r\n{\r\n    chunk_polymerization_param chunk_polymerization_data[100];\r\n    chunk_polymerization_param chunk_polymerization_cac3[100];\r\n    uint16_t total_count;\r\n    uint16_t total_cac3_count;\r\n    uint16_t file_first_sector_offset; //��һ����ͷ��ȡ�����涼���Լ������\r\n} SparseImgParam;\r\n\r\nSparseImgParam SparseImgData;\r\n\r\nstruct fh_configure_cmd\r\n{\r\n    const char *type;\r\n    const char *MemoryName;\r\n    uint32_t Verbose;\r\n    uint32_t AlwaysValidate;\r\n    uint32_t MaxDigestTableSizeInBytes;\r\n    uint32_t MaxPayloadSizeToTargetInBytes;\r\n    uint32_t MaxPayloadSizeFromTargetInBytes;       // 2048\r\n    uint32_t MaxPayloadSizeToTargetInByteSupported; // 16k\r\n    uint32_t ZlpAwareHost;\r\n    uint32_t SkipStorageInit;\r\n};\r\n\r\nstruct fh_erase_cmd\r\n{\r\n    const char *type;\r\n    // uint32_t PAGES_PER_BLOCK;\r\n    uint32_t SECTOR_SIZE_IN_BYTES;\r\n    // char label[32];\r\n    uint32_t last_sector;\r\n    uint32_t num_partition_sectors;\r\n    // uint32_t physical_partition_number;\r\n    uint32_t start_sector;\r\n};\r\n\r\nstruct fh_program_cmd\r\n{\r\n    const char *type;\r\n    char *filename;\r\n    char *sparse;\r\n    uint32_t filesz;\r\n    // uint32_t PAGES_PER_BLOCK;\r\n    uint32_t SECTOR_SIZE_IN_BYTES;\r\n    // char label[32];\r\n    // uint32_t last_sector;\r\n    uint32_t num_partition_sectors;\r\n    uint32_t physical_partition_number;\r\n    uint32_t start_sector;\r\n    uint32_t file_sector_offset;\r\n    uint32_t UNSPARSE_FILE_SIZE;\r\n    // char sparse[16];\r\n};\r\n\r\nstruct fh_response_cmd\r\n{\r\n    const char *type;\r\n    const char *value;\r\n    uint32_t rawmode;\r\n    uint32_t MaxPayloadSizeToTargetInBytes;\r\n};\r\n\r\nstruct fh_log_cmd\r\n{\r\n    const char *type;\r\n};\r\n\r\nstruct fh_patch_cmd\r\n{\r\n    const char *type;\r\n    char *filename;\r\n    uint32_t filesz;\r\n    uint32_t SECTOR_SIZE_IN_BYTES;\r\n    uint32_t num_partition_sectors;\r\n};\r\n\r\nstruct fh_cmd_header\r\n{\r\n    const char *type;\r\n};\r\n\r\nstruct fh_vendor_defines\r\n{\r\n    const char *type; // \"vendor\"\r\n};\r\n\r\nstruct fh_cmd\r\n{\r\n    union\r\n    {\r\n        struct fh_cmd_header cmd;\r\n        struct fh_configure_cmd cfg;\r\n        struct fh_erase_cmd erase;\r\n        struct fh_program_cmd program;\r\n        struct fh_response_cmd response;\r\n        struct fh_log_cmd log;\r\n        struct fh_patch_cmd patch;\r\n        struct fh_vendor_defines vdef;\r\n    };\r\n    int part_upgrade;\r\n    char xml_original_data[512];\r\n};\r\n\r\n#define fh_cmd_num 1024 // AG525 have more than 64 partition\r\nstruct fh_data\r\n{\r\n    const char *firehose_dir;\r\n    const void *usb_handle;\r\n    unsigned MaxPayloadSizeToTargetInBytes;\r\n    unsigned fh_cmd_count;\r\n    unsigned fh_patch_count;\r\n    unsigned ZlpAwareHost;\r\n    struct fh_cmd fh_cmd_table[fh_cmd_num];\r\n\r\n    unsigned xml_tx_size;\r\n    unsigned xml_rx_size;\r\n    char xml_tx_buf[1024];\r\n    char xml_rx_buf[1024];\r\n};\r\n\r\nstatic const char *fh_xml_find_value(const char *xml_line, const char *key, char **ppend)\r\n{\r\n    char *pchar = strstr(xml_line, key);\r\n    char *pend;\r\n\r\n    if (!pchar)\r\n    {\r\n        if (strcmp(key, \"sparse\")) dbg_time(\"%s: no key %s in %s\\n\", __func__, key, xml_line);\r\n        return NULL;\r\n    }\r\n\r\n    pchar += strlen(key);\r\n    if (pchar[0] != '=' && pchar[1] != '\"')\r\n    {\r\n        dbg_time(\"%s: no start %s in %s\\n\", __func__, \"=\\\"\", xml_line);\r\n        return NULL;\r\n    }\r\n\r\n    pchar += strlen(\"=\\\"\");\r\n    pend = strstr(pchar, \"\\\"\");\r\n    if (!pend)\r\n    {\r\n        dbg_time(\"%s: no end %s in %s\\n\", __func__, \"\\\"\", xml_line);\r\n        return NULL;\r\n    }\r\n\r\n    *ppend = pend;\r\n    return pchar;\r\n}\r\n\r\nstatic const char *fh_xml_get_value(const char *xml_line, const char *key)\r\n{\r\n    static char value[64];\r\n    char *pend;\r\n    const char *pchar = fh_xml_find_value(xml_line, key, &pend);\r\n\r\n    if (!pchar)\r\n    {\r\n        return NULL;\r\n    }\r\n\r\n    int len = pend - pchar;\r\n    if (len >= 64) return NULL;\r\n\r\n    strncpy(value, pchar, pend - pchar);\r\n    value[pend - pchar] = '\\0';\r\n\r\n    return value;\r\n}\r\n\r\nstatic void fh_xml_set_value(char *xml_line, const char *key, unsigned value)\r\n{\r\n    char *pend;\r\n    const char *pchar = fh_xml_find_value(xml_line, key, &pend);\r\n    char value_str[32];\r\n    char *tmp_line = malloc(strlen(xml_line) + 1 + sizeof(value_str));\r\n\r\n    if (!pchar || !tmp_line)\r\n    {\r\n        if (tmp_line)\r\n        {\r\n            free(tmp_line);\r\n            tmp_line = NULL;\r\n        }\r\n        return;\r\n    }\r\n\r\n    strcpy(tmp_line, xml_line);\r\n\r\n    snprintf(value_str, sizeof(value_str), \"%u\", value);\r\n    tmp_line[pchar - xml_line] = '\\0';\r\n    strcat(tmp_line, value_str);\r\n    strcat(tmp_line, pend);\r\n\r\n    strcpy(xml_line, tmp_line);\r\n    free(tmp_line);\r\n}\r\n\r\nstatic int fh_parse_xml_line(const char *xml_line, struct fh_cmd *fh_cmd)\r\n{\r\n    const char *pchar = NULL;\r\n    size_t len = strlen(xml_line);\r\n\r\n    memset(fh_cmd, 0, sizeof(struct fh_cmd));\r\n    strncpy(fh_cmd->xml_original_data, xml_line, 512);\r\n    if (fh_cmd->xml_original_data[len - 1] == '\\n') fh_cmd->xml_original_data[len - 1] = '\\0';\r\n\r\n    if (strstr(xml_line, \"vendor=\\\"quectel\\\"\"))\r\n    {\r\n        fh_cmd->vdef.type = \"vendor\";\r\n        return 0;\r\n    }\r\n    else if (!strncmp(xml_line, \"<erase \", strlen(\"<erase \")))\r\n    {\r\n        fh_cmd->erase.type = \"erase\";\r\n        if (strstr(xml_line, \"last_sector\"))\r\n        {\r\n            if ((pchar = fh_xml_get_value(xml_line, \"last_sector\"))) fh_cmd->erase.last_sector = atoi(pchar);\r\n        }\r\n        if ((pchar = fh_xml_get_value(xml_line, \"start_sector\"))) fh_cmd->erase.start_sector = atoi(pchar);\r\n        if ((pchar = fh_xml_get_value(xml_line, \"num_partition_sectors\"))) fh_cmd->erase.num_partition_sectors = atoi(pchar);\r\n        if ((pchar = fh_xml_get_value(xml_line, \"SECTOR_SIZE_IN_BYTES\"))) fh_cmd->erase.SECTOR_SIZE_IN_BYTES = atoi(pchar);\r\n\r\n        return 0;\r\n    }\r\n    else if (!strncmp(xml_line, \"<program \", strlen(\"<program \")))\r\n    {\r\n        fh_cmd->program.type = \"program\";\r\n        if ((pchar = fh_xml_get_value(xml_line, \"filename\")))\r\n        {\r\n            fh_cmd->program.filename = strdup(pchar);\r\n            if (fh_cmd->program.filename[0] == '\\0')\r\n            { // some fw version have blank program line, ignore it.\r\n                return -1;\r\n            }\r\n        }\r\n\r\n        if ((pchar = fh_xml_get_value(xml_line, \"sparse\")))\r\n        {\r\n            fh_cmd->program.sparse = strdup(pchar);\r\n        }\r\n        else\r\n            fh_cmd->program.sparse = NULL;\r\n\r\n        if ((pchar = fh_xml_get_value(xml_line, \"start_sector\"))) fh_cmd->program.start_sector = atoi(pchar);\r\n        if ((pchar = fh_xml_get_value(xml_line, \"num_partition_sectors\"))) fh_cmd->program.num_partition_sectors = atoi(pchar);\r\n        if ((pchar = fh_xml_get_value(xml_line, \"SECTOR_SIZE_IN_BYTES\"))) fh_cmd->program.SECTOR_SIZE_IN_BYTES = atoi(pchar);\r\n\r\n        if (fh_cmd->program.sparse != NULL && !strncasecmp(fh_cmd->program.sparse, \"true\", 4))\r\n        {\r\n            if ((pchar = fh_xml_get_value(xml_line, \"file_sector_offset\"))) fh_cmd->program.file_sector_offset = atoi(pchar);\r\n            if ((pchar = fh_xml_get_value(xml_line, \"physical_partition_number\"))) fh_cmd->program.physical_partition_number = atoi(pchar);\r\n        }\r\n\r\n        return 0;\r\n    }\r\n    else if (!strncmp(xml_line, \"<patch \", strlen(\"<patch \")))\r\n    {\r\n        fh_cmd->patch.type = \"patch\";\r\n        pchar = fh_xml_get_value(xml_line, \"filename\");\r\n        if (pchar && strcmp(pchar, \"DISK\")) return -1;\r\n        return 0;\r\n    }\r\n    else if (!strncmp(xml_line, \"<response \", strlen(\"<response \")))\r\n    {\r\n        fh_cmd->response.type = \"response\";\r\n        pchar = fh_xml_get_value(xml_line, \"value\");\r\n        if (pchar)\r\n        {\r\n            if (!strcmp(pchar, \"ACK\"))\r\n                fh_cmd->response.value = \"ACK\";\r\n            else if (!strcmp(pchar, \"NAK\"))\r\n                fh_cmd->response.value = \"NAK\";\r\n            else\r\n                fh_cmd->response.value = \"OTHER\";\r\n        }\r\n        if (strstr(xml_line, \"rawmode\"))\r\n        {\r\n            pchar = fh_xml_get_value(xml_line, \"rawmode\");\r\n            if (pchar)\r\n            {\r\n                fh_cmd->response.rawmode = !strcmp(pchar, \"true\");\r\n            }\r\n        }\r\n        else if (strstr(xml_line, \"MaxPayloadSizeToTargetInBytes\"))\r\n        {\r\n            pchar = fh_xml_get_value(xml_line, \"MaxPayloadSizeToTargetInBytes\");\r\n            if (pchar)\r\n            {\r\n                fh_cmd->response.MaxPayloadSizeToTargetInBytes = atoi(pchar);\r\n            }\r\n        }\r\n        return 0;\r\n    }\r\n    else if (!strncmp(xml_line, \"<log \", strlen(\"<log \")))\r\n    {\r\n        fh_cmd->program.type = \"log\";\r\n        return 0;\r\n    }\r\n\r\n    error_return();\r\n}\r\n\r\nstatic int fh_parse_xml_file(struct fh_data *fh_data, const char *xml_file)\r\n{\r\n    FILE *fp = fopen(xml_file, \"rb\");\r\n\r\n    if (fp == NULL)\r\n    {\r\n        dbg_time(\"%s fail to fopen(%s), errno: %d (%s)\\n\", __func__, xml_file, errno, strerror(errno));\r\n        error_return();\r\n    }\r\n\r\n    while (fgets(fh_data->xml_tx_buf, fh_data->xml_tx_size, fp))\r\n    {\r\n        char *xml_line = strstr(fh_data->xml_tx_buf, \"<\");\r\n        char *c_start = NULL;\r\n\r\n        if (!xml_line) continue;\r\n\r\n        c_start = strstr(xml_line, \"<!--\");\r\n        if (c_start)\r\n        {\r\n            char *c_end = strstr(c_start, \"-->\");\r\n\r\n            if (c_end)\r\n            {\r\n                /*\r\n                <erase case 1 /> <!-- xxx -->\r\n                <!-- xxx --> <erase case 2 />\r\n                <!-- <erase case 3 /> -->\r\n                */\r\n                char *tmp = strstr(xml_line, \"/>\");\r\n                if (tmp && (tmp < c_start || tmp > c_end))\r\n                {\r\n                    memset(c_start, ' ', c_end - c_start + strlen(\"-->\"));\r\n                    goto __fh_parse_xml_line;\r\n                }\r\n\r\n                continue;\r\n            }\r\n            else\r\n            {\r\n                /*\r\n                     <!-- line1\r\n                             <! -- line2 -->\r\n                      -->\r\n                */\r\n                do\r\n                {\r\n                    if (fgets(fh_data->xml_tx_buf, fh_data->xml_tx_size, fp) == NULL)\r\n                    {\r\n                        break;\r\n                    };\r\n                    xml_line = fh_data->xml_tx_buf;\r\n                } while (!strstr(xml_line, \"-->\") && strstr(xml_line, \"<!--\"));\r\n\r\n                continue;\r\n            }\r\n        }\r\n\r\n    __fh_parse_xml_line:\r\n        if (xml_line)\r\n        {\r\n            char *tag = NULL;\r\n\r\n            tag = strstr(xml_line, \"<erase \");\r\n            if (!tag)\r\n            {\r\n                tag = strstr(xml_line, \"<program \");\r\n                if (!tag)\r\n                {\r\n                    tag = strstr(xml_line, \"<patch \");\r\n                }\r\n            }\r\n\r\n            if (tag)\r\n            {\r\n                if (!fh_parse_xml_line(tag, &fh_data->fh_cmd_table[fh_data->fh_cmd_count]))\r\n                {\r\n                    fh_data->fh_cmd_count++;\r\n                    if (strstr(tag, \"<patch \")) fh_data->fh_patch_count++;\r\n                    if (fh_data->fh_cmd_count >= fh_cmd_num)\r\n                    {\r\n                        dbg_time(\"too many fh_cmd, you need to increase fh_cmd_num\\n\");\r\n                        exit(-1);\r\n                    }\r\n                }\r\n            }\r\n            else if (!strstr(xml_line, \"<?xml\") && !strcmp(xml_line, \"<data>\") && !strcmp(xml_line, \"</data>\") && !strcmp(xml_line, \"<patches>\") && !strcmp(xml_line, \"<patches>\"))\r\n            {\r\n                dbg_time(\"unspport xml_line '%s'\\n\", xml_line);\r\n                exit(-1);\r\n            }\r\n        }\r\n    }\r\n\r\n    fclose(fp);\r\n\r\n    return 0;\r\n}\r\n\r\nstatic int fh_fixup_program_cmd(struct fh_data *fh_data, struct fh_cmd *fh_cmd, long *filesize_out)\r\n{\r\n    char full_path[512] = {0};\r\n    char unix_filename_tmp[256] = {0};\r\n    char *ptmp;\r\n    FILE *fp;\r\n    long filesize = 0;\r\n    uint32_t num_partition_sectors = fh_cmd->program.num_partition_sectors;\r\n    int image_in_firehose_dir = 0;\r\n\r\n    char *unix_filename = strdup(fh_cmd->program.filename);\r\n    if (unix_filename == NULL)\r\n    {\r\n        error_return();\r\n    }\r\n\r\n    while ((ptmp = strchr(unix_filename, '\\\\')))\r\n    {\r\n        *ptmp = '/';\r\n    }\r\n\r\n    if (is_upgrade_fimeware_zip_7z)\r\n    {\r\n        int i;\r\n\r\n        char *p2 = strrchr(unix_filename, '/');\r\n        if (p2 == NULL)\r\n        {\r\n            memmove(unix_filename_tmp, unix_filename, strlen(unix_filename));\r\n            image_in_firehose_dir = 1;\r\n        }\r\n        else\r\n        {\r\n            memmove(unix_filename_tmp, p2 + 1, strlen(p2) - 1);\r\n        }\r\n\r\n        memset(file_name_image, 0, sizeof(file_name_image));\r\n        memset(file_name_image_dir, 0, sizeof(file_name_image_dir));\r\n\r\n        for (i = 0; i < file_name_b.file_name_count; i++)\r\n        {\r\n            if (strstr(file_name_b.file_backup_c[i].zip_file_name_backup, unix_filename_tmp))\r\n            {\r\n                if (image_in_firehose_dir)\r\n                {\r\n                    if (strstr(file_name_b.file_backup_c[i].zip_file_dir_backup, \"update/firehose\"))\r\n                    {\r\n                        memmove(file_name_image, file_name_b.file_backup_c[i].zip_file_name_backup, strlen(file_name_b.file_backup_c[i].zip_file_name_backup));\r\n                        memmove(file_name_image_dir, file_name_b.file_backup_c[i].zip_file_dir_backup, strlen(file_name_b.file_backup_c[i].zip_file_dir_backup));\r\n                        break;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    memmove(file_name_image, file_name_b.file_backup_c[i].zip_file_name_backup, strlen(file_name_b.file_backup_c[i].zip_file_name_backup));\r\n                    memmove(file_name_image_dir, file_name_b.file_backup_c[i].zip_file_dir_backup, strlen(file_name_b.file_backup_c[i].zip_file_dir_backup));\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (file_name_image[0] != '\\0')\r\n        {\r\n            memset(zip_cmd_buf, 0, sizeof(zip_cmd_buf));\r\n            if (is_upgrade_fimeware_only_zip)\r\n            {\r\n                snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"unzip -o -q %.240s '*%.200s' -d /tmp/ > %s\", fh_data->firehose_dir, file_name_image_dir, ZIP_PROCESS_INFO);\r\n            }\r\n            else\r\n            {\r\n                snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"7z x %.240s -o/tmp/ %.200s > %s\", fh_data->firehose_dir, file_name_image_dir, ZIP_PROCESS_INFO);\r\n            }\r\n            dbg_time(\"%s zip_cmd_buf:%s\\n\", __func__, zip_cmd_buf);\r\n            if (-1 == system(zip_cmd_buf))\r\n            {\r\n                dbg_time(\"%s system return error\\n\", __func__);\r\n                return -1;\r\n            }\r\n            usleep(1000);\r\n\r\n            snprintf(full_path, sizeof(full_path), \"/tmp/%.240s\", file_name_image_dir);\r\n            dbg_time(\"%s full_path:%s\\n\", __func__, full_path);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        snprintf(full_path, sizeof(full_path), \"%.255s/%.240s\", fh_data->firehose_dir, unix_filename);\r\n    }\r\n\r\n    if (access(full_path, R_OK))\r\n    {\r\n        fh_cmd->program.num_partition_sectors = 0;\r\n        dbg_time(\"fail to access %s, errno: %d (%s)\\n\", full_path, errno, strerror(errno));\r\n        if (unix_filename)\r\n        {\r\n            free(unix_filename);\r\n            unix_filename = NULL;\r\n        }\r\n        error_return();\r\n    }\r\n\r\n    fp = fopen(full_path, \"rb\");\r\n    if (!fp)\r\n    {\r\n        fh_cmd->program.num_partition_sectors = 0;\r\n        dbg_time(\"fail to fopen %s, errno: %d (%s)\\n\", full_path, errno, strerror(errno));\r\n        if (unix_filename)\r\n        {\r\n            free(unix_filename);\r\n            unix_filename = NULL;\r\n        }\r\n        error_return();\r\n    }\r\n\r\n    fseek(fp, 0, SEEK_END);\r\n    filesize = ftell(fp);\r\n    *filesize_out = filesize;\r\n    fclose(fp);\r\n\r\n    if (filesize <= 0)\r\n    {\r\n        dbg_time(\"fail to ftell %s, errno: %d (%s)\\n\", full_path, errno, strerror(errno));\r\n        fh_cmd->program.num_partition_sectors = 0;\r\n        fh_cmd->program.filesz = 0;\r\n        if (unix_filename)\r\n        {\r\n            free(unix_filename);\r\n            unix_filename = NULL;\r\n        }\r\n        error_return();\r\n    }\r\n    fh_cmd->program.filesz = filesize;\r\n\r\n    fh_cmd->program.num_partition_sectors = filesize / fh_cmd->program.SECTOR_SIZE_IN_BYTES;\r\n    if (filesize % fh_cmd->program.SECTOR_SIZE_IN_BYTES) fh_cmd->program.num_partition_sectors += 1;\r\n\r\n    if (!strncasecmp(unix_filename, \"gpt_empty0.bin\", 14))\r\n    {\r\n        fh_cmd->program.num_partition_sectors -= 1;\r\n    }\r\n\r\n    if (num_partition_sectors != fh_cmd->program.num_partition_sectors)\r\n    {\r\n        fh_xml_set_value(fh_cmd->xml_original_data, \"num_partition_sectors\", fh_cmd->program.num_partition_sectors);\r\n    }\r\n\r\n    if (is_upgrade_fimeware_zip_7z)\r\n    {\r\n        unlink(full_path);\r\n    }\r\n    free(unix_filename);\r\n\r\n    return 0;\r\n}\r\n\r\nstatic int _fh_recv_cmd(struct fh_data *fh_data, struct fh_cmd *fh_cmd, unsigned timeout)\r\n{\r\n    int ret;\r\n    char *xml_line;\r\n    char *pend;\r\n\r\n    memset(fh_cmd, 0, sizeof(struct fh_cmd));\r\n\r\n    ret = qusb_noblock_read(fh_data->usb_handle, fh_data->xml_rx_buf, fh_data->xml_rx_size, 1, timeout);\r\n    if (ret <= 0)\r\n    {\r\n        return -1;\r\n    }\r\n    fh_data->xml_rx_buf[ret] = '\\0';\r\n\r\n    xml_line = fh_data->xml_rx_buf;\r\n    while (*xml_line)\r\n    {\r\n        xml_line = strstr(xml_line, \"<?xml version=\");\r\n        if (xml_line == NULL)\r\n        {\r\n            if (fh_cmd->cmd.type == 0)\r\n            {\r\n                dbg_time(\"{{{%s}}}\", fh_data->xml_rx_buf);\r\n                error_return();\r\n            }\r\n            else\r\n            {\r\n                break;\r\n            }\r\n        }\r\n        xml_line += strlen(\"<?xml version=\");\r\n\r\n        xml_line = strstr(xml_line, \"<data>\");\r\n        if (xml_line == NULL)\r\n        {\r\n            dbg_time(\"{{{%s}}}\", fh_data->xml_rx_buf);\r\n            error_return();\r\n        }\r\n        xml_line += strlen(\"<data>\");\r\n        if (xml_line[0] == '\\n') xml_line++;\r\n\r\n        if (!strncmp(xml_line, \"<response \", strlen(\"<response \")))\r\n        {\r\n            fh_parse_xml_line(xml_line, fh_cmd);\r\n            pend = strstr(xml_line, \"/>\");\r\n            pend += 2;\r\n            dbg_time(\"%.*s\\n\", (int)(pend - xml_line), xml_line);\r\n            xml_line = pend + 1;\r\n        }\r\n        else if (!strncmp(xml_line, \"<log \", strlen(\"<log \")))\r\n        {\r\n            if (fh_cmd->cmd.type && strcmp(fh_cmd->cmd.type, \"log\"))\r\n            {\r\n                dbg_time(\"{{{%s}}}\", fh_data->xml_rx_buf);\r\n                break;\r\n            }\r\n            fh_parse_xml_line(xml_line, fh_cmd);\r\n            pend = strstr(xml_line, \"/>\");\r\n            pend += 2;\r\n            {\r\n                char *prn = xml_line;\r\n                while (prn < pend)\r\n                {\r\n                    if (*prn == '\\r' || *prn == '\\n') *prn = '.';\r\n                    prn++;\r\n                }\r\n            }\r\n            dbg_time(\"%.*s\\n\", (int)(pend - xml_line), xml_line);\r\n            xml_line = pend + 1;\r\n        }\r\n        else\r\n        {\r\n            dbg_time(\"unkonw %s\", xml_line);\r\n            error_return();\r\n        }\r\n    }\r\n\r\n    if (fh_cmd->cmd.type) return 0;\r\n\r\n    error_return();\r\n}\r\n\r\nstatic void *fh_recv_cmd_thread(void *arg)\r\n{\r\n    struct fh_data *fh_data = (struct fh_data *)arg;\r\n    struct fh_cmd fh_rx_cmd;\r\n\r\n    while (_fh_recv_cmd(fh_data, &fh_rx_cmd, -1) == 0)\r\n    {\r\n        if (strncmp(fh_rx_cmd.cmd.type, \"log\", strlen(\"log\")))\r\n        {\r\n            if (write(fh_recv_cmd_sk[1], &fh_rx_cmd, sizeof(fh_rx_cmd)) == -1)\r\n            {\r\n            };\r\n        }\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\nstatic int fh_recv_cmd(struct fh_data *fh_data, struct fh_cmd *fh_cmd, unsigned timeout, int ignore_timeout)\r\n{\r\n    struct pollfd pollfds[] = {{fh_recv_cmd_sk[0], POLLIN, 0}};\r\n    int ret = poll(pollfds, 1, timeout);\r\n\r\n    (void)fh_data;\r\n    if (ret == 1 && (pollfds[0].revents & POLLIN))\r\n    {\r\n        ret = read(fh_recv_cmd_sk[0], fh_cmd, sizeof(struct fh_cmd));\r\n        if (ret == sizeof(struct fh_cmd)) return 0;\r\n    }\r\n    else if (ret == 0 && ignore_timeout)\r\n    {\r\n        return __LINE__;\r\n    }\r\n\r\n    error_return();\r\n}\r\n\r\nstatic int fh_wait_response_cmd(struct fh_data *fh_data, struct fh_cmd *fh_cmd, unsigned timeout)\r\n{\r\n    while (1)\r\n    {\r\n        int ret = fh_recv_cmd(fh_data, fh_cmd, timeout, 0);\r\n\r\n        if (ret != 0) error_return();\r\n\r\n        if (strstr(fh_cmd->cmd.type, \"log\")) continue;\r\n\r\n        return 0;\r\n    }\r\n\r\n    error_return();\r\n}\r\n\r\nstatic int fh_send_cmd(struct fh_data *fh_data, const struct fh_cmd *fh_cmd)\r\n{\r\n    int tx_len = 0;\r\n    char *pstart, *pend;\r\n    char *xml_buf = fh_data->xml_tx_buf;\r\n    unsigned xml_size = fh_data->xml_tx_size;\r\n    xml_buf[0] = '\\0';\r\n\r\n    snprintf(xml_buf + strlen(xml_buf), xml_size, \"<?xml version=\\\"1.0\\\" encoding=\\\"UTF-8\\\" ?>\\n\");\r\n    snprintf(xml_buf + strlen(xml_buf), xml_size, \"<data>\\n\");\r\n\r\n    pstart = xml_buf + strlen(xml_buf);\r\n    if (!strcmp(fh_cmd->cmd.type, \"vendor\"))\r\n    {\r\n        snprintf(xml_buf + strlen(xml_buf), xml_size, \"%s\", fh_cmd->xml_original_data);\r\n    }\r\n    else if (!strcmp(fh_cmd->cmd.type, \"erase\"))\r\n    {\r\n        snprintf(xml_buf + strlen(xml_buf), xml_size, \"%s\", fh_cmd->xml_original_data);\r\n    }\r\n    else if (!strcmp(fh_cmd->cmd.type, \"program\"))\r\n    {\r\n        if (fh_cmd->program.sparse != NULL && !strncasecmp(fh_cmd->program.sparse, \"true\", 4))\r\n        {\r\n            snprintf(xml_buf + strlen(xml_buf), xml_size,\r\n                     \"<program filename=\\\"%.120s\\\" SECTOR_SIZE_IN_BYTES=\\\"%d\\\" \"\r\n                     \"num_partition_sectors=\\\"%d\\\" physical_partition_number=\\\"%d\\\" start_sector=\\\"%d\\\" \"\r\n                     \"file_sector_offset=\\\"%d\\\" sparse=\\\"%.120s\\\" UNSPARSE_FILE_SIZE=\\\"%d\\\" />\",\r\n                     fh_cmd->program.filename, fh_cmd->program.SECTOR_SIZE_IN_BYTES, fh_cmd->program.num_partition_sectors, fh_cmd->program.physical_partition_number,\r\n                     fh_cmd->program.start_sector, fh_cmd->program.file_sector_offset, fh_cmd->program.sparse, fh_cmd->program.UNSPARSE_FILE_SIZE);\r\n        }\r\n        else\r\n            snprintf(xml_buf + strlen(xml_buf), xml_size, \"%s\", fh_cmd->xml_original_data);\r\n    }\r\n    else if (!strcmp(fh_cmd->cmd.type, \"patch\"))\r\n    {\r\n        snprintf(xml_buf + strlen(xml_buf), xml_size, \"%s\", fh_cmd->xml_original_data);\r\n    }\r\n    else if (!strcmp(fh_cmd->cmd.type, \"configure\"))\r\n    {\r\n        snprintf(xml_buf + strlen(xml_buf), xml_size,\r\n                 \"<configure MemoryName=\\\"%.8s\\\" Verbose=\\\"%d\\\" AlwaysValidate=\\\"%d\\\" \"\r\n                 \"MaxDigestTableSizeInBytes=\\\"%d\\\" MaxPayloadSizeToTargetInBytes=\\\"%d\\\"  \"\r\n                 \"ZlpAwareHost=\\\"%d\\\" SkipStorageInit=\\\"%d\\\" />\",\r\n                 fh_cmd->cfg.MemoryName, fh_cmd->cfg.Verbose, fh_cmd->cfg.AlwaysValidate, fh_cmd->cfg.MaxDigestTableSizeInBytes, fh_cmd->cfg.MaxPayloadSizeToTargetInBytes,\r\n                 fh_cmd->cfg.ZlpAwareHost, fh_cmd->cfg.SkipStorageInit);\r\n    }\r\n    else if (!strcmp(fh_cmd->cmd.type, \"setbootablestoragedrive\"))\r\n    {\r\n        snprintf(xml_buf + strlen(xml_buf), xml_size, \"<setbootablestoragedrive value=\\\"%d\\\" />\", !strcmp(q_device_type, \"ufs\") ? 1 : 0);\r\n    }\r\n    else if (!strcmp(fh_cmd->cmd.type, \"reset\"))\r\n    {\r\n        snprintf(xml_buf + strlen(xml_buf), xml_size, \"<power DelayInSeconds=\\\"%u\\\" value=\\\"reset\\\" />\", 10);\r\n    }\r\n    else\r\n    {\r\n        dbg_time(\"%s unkonw fh_cmd->cmd.type=%s\\n\", __func__, fh_cmd->cmd.type);\r\n        error_return();\r\n    }\r\n\r\n    pend = xml_buf + strlen(xml_buf);\r\n    dbg_time(\"%.*s\\n\", (int)(pend - pstart), pstart);\r\n    // snprintf(xml_buf + strlen(xml_buf), xml_size, \"\\n</data>\");\r\n\r\n    if (!strcmp(fh_cmd->cmd.type, \"setbootablestoragedrive\") || !strcmp(fh_cmd->cmd.type, \"reset\") || !strcmp(fh_cmd->cmd.type, \"configure\"))\r\n    {\r\n        snprintf(xml_buf + strlen(xml_buf), xml_size, \"\\n</data>\\n\");\r\n    }\r\n    else\r\n        snprintf(xml_buf + strlen(xml_buf), xml_size, \"\\n</data>\");\r\n\r\n    tx_len = qusb_noblock_write(fh_data->usb_handle, xml_buf, strlen(xml_buf), strlen(xml_buf), 3000, fh_data->ZlpAwareHost);\r\n\r\n    if ((size_t)tx_len == strlen(xml_buf)) return 0;\r\n\r\n    error_return();\r\n}\r\n\r\nstatic int fh_send_cfg_cmd(struct fh_data *fh_data, const char *device_type)\r\n{\r\n    struct fh_cmd fh_cfg_cmd;\r\n    struct fh_cmd fh_rx_cmd;\r\n\r\n    memset(&fh_cfg_cmd, 0x00, sizeof(fh_cfg_cmd));\r\n    fh_cfg_cmd.cfg.type = \"configure\";\r\n    fh_cfg_cmd.cfg.MemoryName = device_type;\r\n    fh_cfg_cmd.cfg.Verbose = 0;\r\n    fh_cfg_cmd.cfg.AlwaysValidate = 0;\r\n    fh_cfg_cmd.cfg.SkipStorageInit = 0;\r\n    fh_cfg_cmd.cfg.ZlpAwareHost = fh_data->ZlpAwareHost; // only sdx20 support zlp set to 0 by 20180822\r\n    if (!strcmp(device_type, \"emmc\") || !strcmp(device_type, \"ufs\"))\r\n    {\r\n        fh_cfg_cmd.cfg.MaxDigestTableSizeInBytes = 8192;\r\n        fh_cfg_cmd.cfg.MaxPayloadSizeToTargetInBytes = 1048576;\r\n        fh_cfg_cmd.cfg.MaxPayloadSizeFromTargetInBytes = 8192;\r\n        fh_cfg_cmd.cfg.MaxPayloadSizeToTargetInByteSupported = 1048576;\r\n    }\r\n    else\r\n    {\r\n        fh_cfg_cmd.cfg.MaxDigestTableSizeInBytes = 2048;\r\n        fh_cfg_cmd.cfg.MaxPayloadSizeToTargetInBytes = 8192;\r\n        fh_cfg_cmd.cfg.MaxPayloadSizeFromTargetInBytes = 2048;\r\n        fh_cfg_cmd.cfg.MaxPayloadSizeToTargetInByteSupported = 8192;\r\n    }\r\n\r\n    fh_send_cmd(fh_data, &fh_cfg_cmd);\r\n    if (fh_wait_response_cmd(fh_data, &fh_rx_cmd, 3000) != 0) error_return();\r\n\r\n    if (!strcmp(fh_rx_cmd.response.value, \"NAK\") && fh_rx_cmd.response.MaxPayloadSizeToTargetInBytes)\r\n    {\r\n        fh_cfg_cmd.cfg.MaxPayloadSizeToTargetInBytes = fh_rx_cmd.response.MaxPayloadSizeToTargetInBytes;\r\n        fh_cfg_cmd.cfg.MaxPayloadSizeToTargetInByteSupported = fh_rx_cmd.response.MaxPayloadSizeToTargetInBytes;\r\n\r\n        fh_send_cmd(fh_data, &fh_cfg_cmd);\r\n        if (fh_wait_response_cmd(fh_data, &fh_rx_cmd, 3000) != 0) error_return();\r\n    }\r\n\r\n    if (strcmp(fh_rx_cmd.response.value, \"ACK\") != 0) error_return();\r\n\r\n    fh_data->MaxPayloadSizeToTargetInBytes = fh_cfg_cmd.cfg.MaxPayloadSizeToTargetInBytes;\r\n\r\n    return 0;\r\n}\r\n\r\nstatic int fh_send_setbootablestoragedrive_cmd(struct fh_data *fh_data)\r\n{\r\n    struct fh_cmd fh_0_cmd;\r\n    fh_0_cmd.cmd.type = \"setbootablestoragedrive\";\r\n\r\n    return fh_send_cmd(fh_data, &fh_0_cmd);\r\n}\r\n\r\nstatic int fh_send_reset_cmd(struct fh_data *fh_data)\r\n{\r\n    struct fh_cmd fh_reset_cmd;\r\n    fh_reset_cmd.cmd.type = \"reset\";\r\n\r\n    return fh_send_cmd(fh_data, &fh_reset_cmd);\r\n}\r\n\r\nstatic int fh_send_rawmode_image(struct fh_data *fh_data, const struct fh_cmd *fh_cmd, unsigned timeout)\r\n{\r\n    char full_path[512] = {0};\r\n    char unix_filename_tmp[256] = {0};\r\n    char read_chunk_header_buf[64] = {0};\r\n    char *ptmp;\r\n    FILE *fp;\r\n    size_t filesize, filesend;\r\n    int image_in_firehose_dir = 0;\r\n\r\n    char *unix_filename = strdup(fh_cmd->program.filename);\r\n    if (unix_filename == NULL)\r\n    {\r\n        error_return();\r\n    }\r\n\r\n    void *pbuf = malloc(fh_data->MaxPayloadSizeToTargetInBytes);\r\n    if (pbuf == NULL)\r\n    {\r\n        if (unix_filename)\r\n        {\r\n            free(unix_filename);\r\n            unix_filename = NULL;\r\n        }\r\n        error_return();\r\n    }\r\n\r\n    while ((ptmp = strchr(unix_filename, '\\\\')))\r\n    {\r\n        *ptmp = '/';\r\n    }\r\n\r\n    if (is_upgrade_fimeware_zip_7z)\r\n    {\r\n        int i;\r\n\r\n        char *p2 = strrchr(unix_filename, '/');\r\n        if (p2 == NULL)\r\n        {\r\n            memmove(unix_filename_tmp, unix_filename, strlen(unix_filename));\r\n            image_in_firehose_dir = 1;\r\n        }\r\n        else\r\n        {\r\n            memmove(unix_filename_tmp, p2 + 1, strlen(p2) - 1);\r\n        }\r\n\r\n        memset(file_name_image, 0, sizeof(file_name_image));\r\n        memset(file_name_image_dir, 0, sizeof(file_name_image_dir));\r\n\r\n        for (i = 0; i < file_name_b.file_name_count; i++)\r\n        {\r\n            if (strstr(file_name_b.file_backup_c[i].zip_file_name_backup, unix_filename_tmp))\r\n            {\r\n                if (image_in_firehose_dir)\r\n                {\r\n                    if (strstr(file_name_b.file_backup_c[i].zip_file_dir_backup, \"update/firehose\"))\r\n                    {\r\n                        memmove(file_name_image, file_name_b.file_backup_c[i].zip_file_name_backup, strlen(file_name_b.file_backup_c[i].zip_file_name_backup));\r\n                        memmove(file_name_image_dir, file_name_b.file_backup_c[i].zip_file_dir_backup, strlen(file_name_b.file_backup_c[i].zip_file_dir_backup));\r\n                        break;\r\n                    }\r\n                }\r\n                else\r\n                {\r\n                    memmove(file_name_image, file_name_b.file_backup_c[i].zip_file_name_backup, strlen(file_name_b.file_backup_c[i].zip_file_name_backup));\r\n                    memmove(file_name_image_dir, file_name_b.file_backup_c[i].zip_file_dir_backup, strlen(file_name_b.file_backup_c[i].zip_file_dir_backup));\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (file_name_image[0] != '\\0')\r\n        {\r\n            memset(zip_cmd_buf, 0, sizeof(zip_cmd_buf));\r\n            if (is_upgrade_fimeware_only_zip)\r\n            {\r\n                snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"unzip -o -q %.240s '*%.200s' -d /tmp/ > %s\", fh_data->firehose_dir, file_name_image_dir, ZIP_PROCESS_INFO);\r\n            }\r\n            else\r\n            {\r\n                snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"7z x %.240s -o/tmp/ %.200s > %s\", fh_data->firehose_dir, file_name_image_dir, ZIP_PROCESS_INFO);\r\n            }\r\n            dbg_time(\"%s zip_cmd_buf:%s\\n\", __func__, zip_cmd_buf);\r\n            if (-1 == system(zip_cmd_buf))\r\n            {\r\n                dbg_time(\"%s system return error\\n\", __func__);\r\n                return -1;\r\n            }\r\n            usleep(1000);\r\n\r\n            snprintf(full_path, sizeof(full_path), \"/tmp/%.240s\", file_name_image_dir);\r\n            dbg_time(\"%s full_path:%s\\n\", __func__, full_path);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        snprintf(full_path, sizeof(full_path), \"%.255s/%.240s\", fh_data->firehose_dir, unix_filename);\r\n    }\r\n\r\n    fp = fopen(full_path, \"rb\");\r\n    if (!fp)\r\n    {\r\n        dbg_time(\"fail to fopen %s, errno: %d (%s)\\n\", full_path, errno, strerror(errno));\r\n        if (unix_filename)\r\n        {\r\n            free(unix_filename);\r\n            unix_filename = NULL;\r\n        }\r\n\r\n        if (pbuf)\r\n        {\r\n            free(pbuf);\r\n            pbuf = NULL;\r\n        }\r\n        error_return();\r\n    }\r\n\r\n    if (fh_cmd->program.sparse != NULL && !strncasecmp(fh_cmd->program.sparse, \"true\", 4))\r\n    {\r\n        filesize = fh_cmd->program.UNSPARSE_FILE_SIZE;\r\n        filesend = 0;\r\n        fseek(fp, fh_cmd->program.file_sector_offset, SEEK_SET);\r\n    }\r\n    else\r\n    {\r\n        fseek(fp, 0, SEEK_END);\r\n        filesize = ftell(fp);\r\n        filesend = 0;\r\n        fseek(fp, 0, SEEK_SET);\r\n    }\r\n\r\n    dbg_time(\"send %s, filesize=%zd\\n\", unix_filename, filesize);\r\n\r\n    if (!strncasecmp(unix_filename, \"gpt_empty0.bin\", 14))\r\n    {\r\n        filesize -= 512;\r\n    }\r\n\r\n    int idx = -1;\r\n\r\n    if (fh_cmd->program.sparse != NULL && !strncasecmp(fh_cmd->program.sparse, \"true\", 4))\r\n    {\r\n        size_t reads = 0;\r\n\r\n        while (1)\r\n        {\r\n            chunk_header_t *chunk_header;\r\n            size_t read_header = fread(read_chunk_header_buf, 1, sizeof(chunk_header_t), fp);\r\n            if (read_header <= 0)\r\n            {\r\n                dbg_time(\"%s fread failed\\n\", __func__);\r\n            }\r\n\r\n            chunk_header = (chunk_header_t *)read_chunk_header_buf;\r\n#if 0\r\n            printf(\"chunk_header->chunk_type = %0x\\n\", chunk_header->chunk_type);\r\n            printf(\"chunk_header->reserved1 = %0x\\n\", chunk_header->reserved1);\r\n            printf(\"chunk_header->chunk_sz = %d\\n\", chunk_header->chunk_sz);\r\n            printf(\"chunk_header->total_sz = %d\\n\", chunk_header->total_sz);\r\n#endif\r\n\r\n            uint32_t chunk_data_sz = 0;\r\n            chunk_data_sz = (chunk_header->total_sz - 0xC);\r\n\r\n            update_transfer_bytes(chunk_data_sz);\r\n            if (!((++idx) % 0x80))\r\n            {\r\n                printf(\".\");\r\n                fflush(stdout);\r\n            }\r\n\r\n            while (chunk_data_sz >= fh_data->MaxPayloadSizeToTargetInBytes)\r\n            {\r\n                reads = fread(pbuf, 1, fh_data->MaxPayloadSizeToTargetInBytes, fp);\r\n                if (reads > 0)\r\n                {\r\n                    if (reads % fh_cmd->program.SECTOR_SIZE_IN_BYTES)\r\n                    {\r\n                        memset((uint8_t *)pbuf + reads, 0, fh_cmd->program.SECTOR_SIZE_IN_BYTES - (reads % fh_cmd->program.SECTOR_SIZE_IN_BYTES));\r\n                        reads += fh_cmd->program.SECTOR_SIZE_IN_BYTES - (reads % fh_cmd->program.SECTOR_SIZE_IN_BYTES);\r\n                    }\r\n                    size_t writes = qusb_noblock_write(fh_data->usb_handle, pbuf, reads, reads, timeout, fh_data->ZlpAwareHost);\r\n                    if (reads != writes)\r\n                    {\r\n                        dbg_time(\"%s send fail reads=%zd, writes=%zd\\n\", __func__, reads, writes);\r\n                        dbg_time(\"%s send fail filesend=%zd, filesize=%zd\\n\", __func__, filesend, filesize);\r\n                        break;\r\n                    }\r\n                    filesend += reads;\r\n\r\n                    // dbg_time(\"filesend=%zd, filesize=%zd\\n\", filesend, filesize);\r\n                }\r\n                else\r\n                {\r\n                    break;\r\n                }\r\n\r\n                chunk_data_sz -= fh_data->MaxPayloadSizeToTargetInBytes;\r\n            }\r\n\r\n            if (chunk_data_sz > 0)\r\n            {\r\n                reads = fread(pbuf, 1, chunk_data_sz, fp);\r\n                if (reads > 0)\r\n                {\r\n                    if (reads % fh_cmd->program.SECTOR_SIZE_IN_BYTES)\r\n                    {\r\n                        memset((uint8_t *)pbuf + reads, 0, fh_cmd->program.SECTOR_SIZE_IN_BYTES - (reads % fh_cmd->program.SECTOR_SIZE_IN_BYTES));\r\n                        reads += fh_cmd->program.SECTOR_SIZE_IN_BYTES - (reads % fh_cmd->program.SECTOR_SIZE_IN_BYTES);\r\n                    }\r\n                    size_t writes = qusb_noblock_write(fh_data->usb_handle, pbuf, reads, reads, timeout, fh_data->ZlpAwareHost);\r\n                    if (reads != writes)\r\n                    {\r\n                        dbg_time(\"%s send fail reads=%zd, writes=%zd\\n\", __func__, reads, writes);\r\n                        dbg_time(\"%s send fail filesend=%zd, filesize=%zd\\n\", __func__, filesend, filesize);\r\n                        break;\r\n                    }\r\n                    filesend += reads;\r\n\r\n                    // dbg_time(\"filesend=%zd, filesize=%zd\\n\", filesend, filesize);\r\n                }\r\n                else\r\n                {\r\n                    break;\r\n                }\r\n            }\r\n\r\n            if (filesend >= filesize)\r\n            {\r\n                dbg_time(\"%s filesend=%zd, filesize=%zd\\n\", __func__, filesend, filesize);\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    else\r\n    {\r\n        while (filesend < filesize)\r\n        {\r\n            size_t reads;\r\n            // printf(\"fh_data->MaxPayloadSizeToTargetInBytes:%d\\n\",\r\n            // fh_data->MaxPayloadSizeToTargetInBytes);\r\n            if (filesize < (filesend + fh_data->MaxPayloadSizeToTargetInBytes))\r\n            {\r\n                reads = fread(pbuf, 1, filesize - filesend, fp);\r\n            }\r\n            else\r\n                reads = fread(pbuf, 1, fh_data->MaxPayloadSizeToTargetInBytes, fp);\r\n\r\n            update_transfer_bytes(reads);\r\n            if (!((++idx) % 0x80))\r\n            {\r\n                printf(\".\");\r\n                fflush(stdout);\r\n            }\r\n\r\n            if (reads > 0)\r\n            {\r\n                if (reads % fh_cmd->program.SECTOR_SIZE_IN_BYTES)\r\n                {\r\n                    memset((uint8_t *)pbuf + reads, 0, fh_cmd->program.SECTOR_SIZE_IN_BYTES - (reads % fh_cmd->program.SECTOR_SIZE_IN_BYTES));\r\n                    reads += fh_cmd->program.SECTOR_SIZE_IN_BYTES - (reads % fh_cmd->program.SECTOR_SIZE_IN_BYTES);\r\n                }\r\n                size_t writes = qusb_noblock_write(fh_data->usb_handle, pbuf, reads, reads, timeout, fh_data->ZlpAwareHost);\r\n                if (reads != writes)\r\n                {\r\n                    dbg_time(\"%s send fail reads=%zd, writes=%zd\\n\", __func__, reads, writes);\r\n                    dbg_time(\"%s send fail filesend=%zd, filesize=%zd\\n\", __func__, filesend, filesize);\r\n                    break;\r\n                }\r\n                filesend += reads;\r\n                // dbg_time(\"filesend=%zd, filesize=%zd\\n\", filesend, filesize);\r\n            }\r\n            else\r\n            {\r\n                break;\r\n            }\r\n        }\r\n    }\r\n\r\n    printf(\"\\n\");\r\n    show_progress();\r\n    dbg_time(\"send finished\\n\");\r\n\r\n    fclose(fp);\r\n    free(unix_filename);\r\n    free(pbuf);\r\n\r\n    if (is_upgrade_fimeware_zip_7z)\r\n    {\r\n        unlink(full_path);\r\n    }\r\n\r\n    if (filesend >= filesize) return 0;\r\n\r\n    error_return();\r\n}\r\n\r\nstatic int fh_process_erase(struct fh_data *fh_data, const struct fh_cmd *fh_cmd)\r\n{\r\n    struct fh_cmd fh_rx_cmd;\r\n    unsigned timeout = 15000; // 8+8 MCP need more time\r\n\r\n    fh_send_cmd(fh_data, fh_cmd);\r\n    if (fh_wait_response_cmd(fh_data, &fh_rx_cmd, timeout) != 0) // SDX55 need 4 seconds\r\n        error_return();\r\n    if (strcmp(fh_rx_cmd.response.value, \"ACK\")) error_return();\r\n\r\n    return 0;\r\n}\r\n\r\nstatic int fh_process_patch(struct fh_data *fh_data, const struct fh_cmd *fh_cmd)\r\n{\r\n    struct fh_cmd fh_rx_cmd;\r\n    unsigned timeout = 15000; // 8+8 MCP need more time\r\n\r\n    fh_send_cmd(fh_data, fh_cmd);\r\n    if (fh_wait_response_cmd(fh_data, &fh_rx_cmd, timeout) != 0) // SDX55 need 4 seconds\r\n    {\r\n        dbg_time(\"fh_process_patch : fh_wait_response_cmd fail\\n\");\r\n        error_return();\r\n    }\r\n    if (strcmp(fh_rx_cmd.response.value, \"ACK\"))\r\n    {\r\n        dbg_time(\"fh_process_patch : response should be ACK\\n\");\r\n        error_return();\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nstatic int fh_process_sparse_program(struct fh_data *fh_data, const struct fh_cmd *fh_cmd)\r\n{\r\n    char full_path[512];\r\n    char read_header_buf[64] = {0};\r\n    char read_chunk_header_buf[64] = {0};\r\n    char *ptmp;\r\n    FILE *fp;\r\n    size_t filesize /*, filesend*/;\r\n\r\n    char *unix_filename = strdup(fh_cmd->program.filename);\r\n    if (unix_filename == NULL) error_return();\r\n\r\n    void *pbuf = malloc(fh_data->MaxPayloadSizeToTargetInBytes);\r\n    if (pbuf == NULL)\r\n    {\r\n        if (unix_filename)\r\n        {\r\n            free(unix_filename);\r\n            unix_filename = NULL;\r\n        }\r\n        error_return();\r\n    }\r\n\r\n    memset(&SparseImgData, 0, sizeof(SparseImgParam));\r\n\r\n    while ((ptmp = strchr(unix_filename, '\\\\')))\r\n    {\r\n        *ptmp = '/';\r\n    }\r\n\r\n    snprintf(full_path, sizeof(full_path), \"%.255s/%.240s\", fh_data->firehose_dir, unix_filename);\r\n    fp = fopen(full_path, \"rb\");\r\n    if (!fp)\r\n    {\r\n        dbg_time(\"fail to fopen %s, errno: %d (%s)\\n\", full_path, errno, strerror(errno));\r\n        if (unix_filename)\r\n        {\r\n            free(unix_filename);\r\n            unix_filename = NULL;\r\n        }\r\n\r\n        if (pbuf)\r\n        {\r\n            free(pbuf);\r\n            pbuf = NULL;\r\n        }\r\n        error_return();\r\n    }\r\n\r\n    fseek(fp, 0, SEEK_END);\r\n    filesize = ftell(fp);\r\n    fseek(fp, 0, SEEK_SET);\r\n\r\n    dbg_time(\"send %s, filesize=%zd\\n\", unix_filename, filesize);\r\n\r\n    if (!strncasecmp(unix_filename, \"gpt_empty0.bin\", 14))\r\n    {\r\n        filesize -= 512;\r\n    }\r\n\r\n    uint32_t total_chunk_sz = 0;\r\n    uint32_t total_chunk_count = 0;\r\n    uint32_t total_sz = 0;\r\n\r\n    uint16_t chunk_type_Last_time = 0;\r\n\r\n    if (fh_cmd->program.sparse != NULL && !strncasecmp(fh_cmd->program.sparse, \"true\", 4))\r\n    {\r\n        sparse_header_t *sparse_header;\r\n        size_t read_header = fread(read_header_buf, 1, sizeof(sparse_header_t), fp);\r\n        if (read_header <= 0)\r\n        {\r\n            dbg_time(\"%s fread failed\\n\", __func__);\r\n        }\r\n\r\n        sparse_header = (sparse_header_t *)read_header_buf;\r\n#if 0\r\n        printf(\"read_header:%ld\\n\", read_header);\r\n        printf(\"sparse_header->magic = %0x\\n\", sparse_header->magic);\r\n        printf(\"sparse_header->major_version = %0x\\n\", sparse_header->major_version);\r\n        printf(\"sparse_header->minor_version = %0x\\n\", sparse_header->minor_version);\r\n        printf(\"sparse_header->file_hdr_sz = %d\\n\", sparse_header->file_hdr_sz);\r\n        printf(\"sparse_header->chunk_hdr_sz = %d\\n\", sparse_header->chunk_hdr_sz);\r\n        printf(\"sparse_header->blk_sz = %d\\n\", sparse_header->blk_sz);\r\n        printf(\"sparse_header->total_blks = %d\\n\", sparse_header->total_blks);\r\n        printf(\"sparse_header->total_chunks = %d\\n\", sparse_header->total_chunks);\r\n        printf(\"sparse_header->image_checksum = %d\\n\", sparse_header->image_checksum);\r\n#endif\r\n\r\n        SparseImgData.file_first_sector_offset = sparse_header->file_hdr_sz;\r\n\r\n        uint32_t m;\r\n\r\n        for (m = 0; m < (sparse_header->total_chunks); m++)\r\n        {\r\n            chunk_header_t *chunk_header;\r\n            read_header = fread(read_chunk_header_buf, 1, sizeof(chunk_header_t), fp);\r\n            chunk_header = (chunk_header_t *)read_chunk_header_buf;\r\n#if 0\r\n            printf(\"chunk_header->chunk_type = %0x\\n\", chunk_header->chunk_type);\r\n            printf(\"chunk_header->reserved1 = %0x\\n\", chunk_header->reserved1);\r\n            printf(\"chunk_header->chunk_sz = %d\\n\", chunk_header->chunk_sz);\r\n            printf(\"chunk_header->total_sz = %d\\n\", chunk_header->total_sz);\r\n#endif\r\n\r\n            if (chunk_header->chunk_type == 0xCAC1 || chunk_header->chunk_type == 0xCAC2)\r\n            {\r\n                if ((chunk_type_Last_time != 0xCAC1 && chunk_type_Last_time != 0xCAC2) && chunk_type_Last_time != 0)\r\n                {\r\n                    SparseImgData.chunk_polymerization_cac3[SparseImgData.total_cac3_count].total_chunk_sz = total_chunk_sz;\r\n                    SparseImgData.chunk_polymerization_cac3[SparseImgData.total_cac3_count].total_chunk_count = total_chunk_count;\r\n                    SparseImgData.chunk_polymerization_cac3[SparseImgData.total_cac3_count].total_sz = total_sz;\r\n                    SparseImgData.total_cac3_count += 1;\r\n                    // printf(\"%s cac3 total_sz:%d  total_chunk_count:d  total_chunk_count:%d\\n\",\r\n                    // __func__, total_sz, total_chunk_count, total_chunk_count);\r\n\r\n                    total_chunk_sz = 0;\r\n                    total_chunk_sz += chunk_header->chunk_sz;\r\n\r\n                    total_chunk_count = 0; // count from 1\r\n                    total_chunk_count += 1;\r\n                    total_sz = 0;\r\n                    total_sz += (chunk_header->total_sz - 0xC); // total data, out of size of chunk_header\r\n                    fseek(fp, chunk_header->total_sz - 0xC, SEEK_CUR);\r\n                }\r\n                else if (chunk_type_Last_time == 0) // count from 1\r\n                {\r\n                    total_chunk_sz = 0;\r\n                    total_chunk_sz += chunk_header->chunk_sz;\r\n\r\n                    total_chunk_count = 0;\r\n                    total_chunk_count += 1;\r\n                    total_sz = 0;\r\n                    total_sz += (chunk_header->total_sz - 0xC);\r\n                    fseek(fp, chunk_header->total_sz - 0xC, SEEK_CUR);\r\n                }\r\n                else\r\n                {\r\n                    fseek(fp, chunk_header->total_sz - 0xC, SEEK_CUR);\r\n                    total_sz += (chunk_header->total_sz - 0xC);\r\n                    total_chunk_count += 1;\r\n                    total_chunk_sz += chunk_header->chunk_sz;\r\n                }\r\n            }\r\n\r\n            if (chunk_header->chunk_type == 0xCAC3)\r\n            {\r\n                if (chunk_type_Last_time != 0xCAC3 && chunk_type_Last_time != 0)\r\n                {\r\n                    SparseImgData.chunk_polymerization_data[SparseImgData.total_count].total_sz = total_sz;\r\n                    SparseImgData.chunk_polymerization_data[SparseImgData.total_count].total_chunk_count = total_chunk_count;\r\n                    SparseImgData.chunk_polymerization_data[SparseImgData.total_count].total_chunk_sz = total_chunk_sz;\r\n                    SparseImgData.total_count += 1;\r\n                    // printf(\"%s cac1+2 total_sz:%d  total_chunk_count:%d  total_chunk_count:%d\\n\",\r\n                    // __func__, total_sz, total_chunk_count, total_chunk_count);\r\n\r\n                    total_chunk_sz = 0;\r\n                    total_chunk_sz += chunk_header->chunk_sz;\r\n\r\n                    total_chunk_count = 0; // count from 1\r\n                    total_chunk_count += 1;\r\n                    total_sz = 0;\r\n                    total_sz += (chunk_header->total_sz - 0xC);\r\n                    fseek(fp, chunk_header->total_sz - 0xC, SEEK_CUR);\r\n                }\r\n                else\r\n                {\r\n                    fseek(fp, chunk_header->total_sz - 0xC, SEEK_CUR);\r\n                    total_sz += (chunk_header->total_sz - 0xC);\r\n                    total_chunk_count += 1;\r\n                    total_chunk_sz += chunk_header->chunk_sz;\r\n\r\n                    // fseek(fp, chunk_header->total_sz - 0xC, SEEK_CUR);\r\n                    // total_sz = 0;\r\n                    // total_chunk_count = 0;\r\n                }\r\n            }\r\n\r\n            if (m == (sparse_header->total_chunks - 1) && (chunk_header->chunk_type == 0xCAC1 || chunk_header->chunk_type == 0xCAC2))\r\n            {\r\n                SparseImgData.chunk_polymerization_data[SparseImgData.total_count].total_sz = total_sz;\r\n                SparseImgData.chunk_polymerization_data[SparseImgData.total_count].total_chunk_count = total_chunk_count;\r\n                SparseImgData.chunk_polymerization_data[SparseImgData.total_count].total_chunk_sz = total_chunk_sz;\r\n                SparseImgData.total_count += 1;\r\n                // printf(\"%s cac1+2 total_sz:%d  total_chunk_count:%d  total_chunk_count:%d\\n\",\r\n                // __func__, total_sz, total_chunk_count, total_chunk_count);\r\n            }\r\n\r\n            chunk_type_Last_time = chunk_header->chunk_type;\r\n        }\r\n    }\r\n\r\n    fclose(fp);\r\n    free(unix_filename);\r\n    free(pbuf);\r\n\r\n    return 0;\r\n}\r\n\r\nstatic int fh_process_program(struct fh_data *fh_data, struct fh_cmd *fh_cmd)\r\n{\r\n    struct fh_cmd fh_rx_cmd;\r\n    int i;\r\n\r\n    if (fh_cmd->program.sparse != NULL && !strncasecmp(fh_cmd->program.sparse, \"true\", 4))\r\n    {\r\n        fh_process_sparse_program(fh_data, fh_cmd);\r\n        for (i = 0; i < SparseImgData.total_count; i++)\r\n        {\r\n            if (i == 0)\r\n            {\r\n                fh_cmd->program.file_sector_offset = SparseImgData.file_first_sector_offset;\r\n                // printf(\"%s --1-- fh_cmd->program.file_sector_offset = %d\\n\", __func__,\r\n                // fh_cmd->program.file_sector_offset);\r\n            }\r\n            else\r\n            {\r\n                fh_cmd->program.file_sector_offset += SparseImgData.chunk_polymerization_data[i - 1].total_sz +\r\n                                                      SparseImgData.chunk_polymerization_data[i - 1].total_chunk_count * sizeof(chunk_header_t) +\r\n                                                      SparseImgData.chunk_polymerization_cac3[i - 1].total_chunk_count * sizeof(chunk_header_t);\r\n                // printf(\"%s --2-- fh_cmd->program.file_sector_offset = %d\\n\", __func__,\r\n                // fh_cmd->program.file_sector_offset);\r\n            }\r\n\r\n            if (i == 0)\r\n            {\r\n                ; // printf(\"%s --1-- fh_cmd->program.start_sector = %d\\n\", __func__,\r\n                  // fh_cmd->program.start_sector);\r\n            }\r\n            else\r\n            {\r\n                fh_cmd->program.start_sector += fh_cmd->program.num_partition_sectors + SparseImgData.chunk_polymerization_cac3[i - 1].total_chunk_sz * 8; //��Ҫ��ʼ+CAC1,CAC2,CAC3\r\n                // printf(\"%s --2-- fh_cmd->program.start_sector = %d\\n\", __func__,\r\n                // fh_cmd->program.start_sector);\r\n            }\r\n\r\n            fh_cmd->program.UNSPARSE_FILE_SIZE = SparseImgData.chunk_polymerization_data[i].total_sz;\r\n            fh_cmd->program.num_partition_sectors = fh_cmd->program.UNSPARSE_FILE_SIZE / fh_cmd->program.SECTOR_SIZE_IN_BYTES;\r\n            if (fh_cmd->program.UNSPARSE_FILE_SIZE % fh_cmd->program.SECTOR_SIZE_IN_BYTES) fh_cmd->program.num_partition_sectors += 1;\r\n\r\n            fh_send_cmd(fh_data, fh_cmd);\r\n            if (fh_wait_response_cmd(fh_data, &fh_rx_cmd, 3000) != 0)\r\n            {\r\n                dbg_time(\"fh_wait_response_cmd fail\\n\");\r\n                error_return();\r\n            }\r\n            if (strcmp(fh_rx_cmd.response.value, \"ACK\"))\r\n            {\r\n                dbg_time(\"response should be ACK\\n\");\r\n                error_return();\r\n            }\r\n            if (fh_rx_cmd.response.rawmode != 1)\r\n            {\r\n                dbg_time(\"response should be rawmode true\\n\");\r\n                error_return();\r\n            }\r\n            if (fh_send_rawmode_image(fh_data, fh_cmd, 15000))\r\n            {\r\n                dbg_time(\"fh_send_rawmode_image fail\\n\");\r\n                error_return();\r\n            }\r\n            if (fh_wait_response_cmd(fh_data, &fh_rx_cmd, 6000) != 0)\r\n            {\r\n                dbg_time(\"fh_wait_response_cmd fail\\n\");\r\n                error_return();\r\n            }\r\n            if (strcmp(fh_rx_cmd.response.value, \"ACK\"))\r\n            {\r\n                dbg_time(\"response should be ACK\\n\");\r\n                error_return();\r\n            }\r\n            if (fh_rx_cmd.response.rawmode != 0)\r\n            {\r\n                dbg_time(\"response should be rawmode false\\n\");\r\n                error_return();\r\n            }\r\n        }\r\n\r\n        memset(&SparseImgData, 0, sizeof(SparseImgParam));\r\n    }\r\n    else\r\n    {\r\n        fh_send_cmd(fh_data, fh_cmd);\r\n        if (fh_wait_response_cmd(fh_data, &fh_rx_cmd, 3000) != 0)\r\n        {\r\n            dbg_time(\"fh_wait_response_cmd fail\\n\");\r\n            error_return();\r\n        }\r\n        if (strcmp(fh_rx_cmd.response.value, \"ACK\"))\r\n        {\r\n            dbg_time(\"response should be ACK\\n\");\r\n            error_return();\r\n        }\r\n        if (fh_rx_cmd.response.rawmode != 1)\r\n        {\r\n            dbg_time(\"response should be rawmode true\\n\");\r\n            error_return();\r\n        }\r\n        if (fh_send_rawmode_image(fh_data, fh_cmd, 15000))\r\n        {\r\n            dbg_time(\"fh_send_rawmode_image fail\\n\");\r\n            error_return();\r\n        }\r\n        if (fh_wait_response_cmd(fh_data, &fh_rx_cmd, 6000) != 0)\r\n        {\r\n            dbg_time(\"fh_wait_response_cmd fail\\n\");\r\n            error_return();\r\n        }\r\n        if (strcmp(fh_rx_cmd.response.value, \"ACK\"))\r\n        {\r\n            dbg_time(\"response should be ACK\\n\");\r\n            error_return();\r\n        }\r\n        if (fh_rx_cmd.response.rawmode != 0)\r\n        {\r\n            dbg_time(\"response should be rawmode false\\n\");\r\n            error_return();\r\n        }\r\n    }\r\n\r\n    free(fh_cmd->program.filename);\r\n\r\n    return 0;\r\n}\r\n\r\nint firehose_main(const char *firehose_dir, void *usb_handle, unsigned qusb_zlp_mode)\r\n{\r\n    unsigned x;\r\n    char rawprogram_full_path[512];\r\n    char *xmlfile_list[32];\r\n    char xmlfile_tmp[32];\r\n    unsigned xmlfile_cnt = 0;\r\n    struct fh_cmd fh_rx_cmd;\r\n    struct fh_data *fh_data;\r\n    long long filesizes = 0;\r\n    long filesize = 0;\r\n    unsigned max_num_partition_sectors = 0;\r\n    static pthread_t recv_cmd_tid;\r\n    int first_earse_and_last_programm_SBL = 0;\r\n    int rawprogram_unsparse_exist = 0;\r\n\r\n    fh_data = (struct fh_data *)malloc(sizeof(struct fh_data));\r\n    if (!fh_data) error_return();\r\n\r\n    memset(fh_data, 0x00, sizeof(struct fh_data));\r\n    fh_data->firehose_dir = firehose_dir;\r\n    fh_data->usb_handle = usb_handle;\r\n    fh_data->xml_tx_size = sizeof(fh_data->xml_tx_buf);\r\n    fh_data->xml_rx_size = sizeof(fh_data->xml_rx_buf);\r\n    fh_data->ZlpAwareHost = qusb_zlp_mode;\r\n\r\n    if (is_upgrade_fimeware_zip_7z)\r\n    {\r\n        int i;\r\n        for (i = 0; i < 32; i++)\r\n        {\r\n            xmlfile_list[i] = (char *)malloc(256);\r\n            if (xmlfile_list[i] == NULL)\r\n            {\r\n                dbg_time(\"%s xmlfile_list malloc failed\\n\", __func__);\r\n                error_return();\r\n            }\r\n        }\r\n\r\n        char rawprogram_patch_filename[128] = {0};\r\n        char rawprogram_patch_firehose_dir[256] = {0};\r\n\r\n        if (q_module_packet_sign)\r\n        {\r\n            for (x = 0; x < 10; x++)\r\n            {\r\n                snprintf(xmlfile_tmp, sizeof(xmlfile_tmp), \"rawprogram%u_secboot\",\r\n                         x); // use rawprogram%u Adaptation rawprogram%u_xxx  for AG215S-GLR\r\n\r\n                for (i = 0; i < file_name_b.file_name_count; i++)\r\n                {\r\n                    if ((strstr(file_name_b.file_backup_c[i].zip_file_name_backup, xmlfile_tmp) && strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \".xml\")))\r\n                    {\r\n                        dbg_time(\"file_name_b.file_backup_c[i].zip_file_name_backup:%s\\n\", file_name_b.file_backup_c[i].zip_file_name_backup);\r\n                        dbg_time(\"file_name_b.file_backup_c[i].zip_file_dir_backup:%s\\n\", file_name_b.file_backup_c[i].zip_file_dir_backup);\r\n\r\n                        if (strstr(file_name_b.file_backup_c[i].zip_file_dir_backup, \"update/firehose\"))\r\n                        {\r\n                            memmove(rawprogram_patch_filename, file_name_b.file_backup_c[i].zip_file_name_backup, strlen(file_name_b.file_backup_c[i].zip_file_name_backup));\r\n                            memmove(rawprogram_patch_firehose_dir, file_name_b.file_backup_c[i].zip_file_dir_backup, strlen(file_name_b.file_backup_c[i].zip_file_dir_backup));\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (rawprogram_patch_filename[0] != '\\0') // find rawprogram file\r\n                {\r\n                    memset(zip_cmd_buf, 0, sizeof(zip_cmd_buf));\r\n                    if (is_upgrade_fimeware_only_zip)\r\n                    {\r\n                        snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"unzip -o -q %.240s '*%.200s' -d /tmp/ > %s\", firehose_dir, rawprogram_patch_firehose_dir, ZIP_PROCESS_INFO);\r\n                    }\r\n                    else\r\n                    {\r\n                        snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"7z x %.240s -o/tmp/ %.200s > %s\", firehose_dir, rawprogram_patch_firehose_dir, ZIP_PROCESS_INFO);\r\n                    }\r\n                    dbg_time(\"%s zip_cmd_buf:%s\\n\", __func__, zip_cmd_buf);\r\n                    if (-1 == system(zip_cmd_buf))\r\n                    {\r\n                        dbg_time(\"%s system return error\\n\", __func__);\r\n                        for (i = 0; i < 32; i++)\r\n                        {\r\n                            if (xmlfile_list[i])\r\n                            {\r\n                                free(xmlfile_list[i]);\r\n                                xmlfile_list[i] = NULL;\r\n                            }\r\n                        }\r\n\r\n                        error_return();\r\n                    }\r\n                    usleep(1000);\r\n\r\n                    memmove(xmlfile_list[xmlfile_cnt], rawprogram_patch_firehose_dir, 240);\r\n                    dbg_time(\"xmlfile_list[xmlfile_cnt] = %s\", xmlfile_list[xmlfile_cnt]);\r\n\r\n                    xmlfile_cnt++;\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n            for (x = 0; x < 10; x++)\r\n            {\r\n                snprintf(xmlfile_tmp, sizeof(xmlfile_tmp), \"rawprogram_unsparse%u\",\r\n                         x); // smart  SA885GAPNA\r\n\r\n                memset(rawprogram_patch_filename, 0, sizeof(rawprogram_patch_filename));\r\n                memset(rawprogram_patch_firehose_dir, 0, sizeof(rawprogram_patch_firehose_dir));\r\n                for (i = 0; i < file_name_b.file_name_count; i++)\r\n                {\r\n                    if ((strstr(file_name_b.file_backup_c[i].zip_file_name_backup, xmlfile_tmp) && strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \".xml\")))\r\n                    {\r\n                        dbg_time(\"file_name_b.file_backup_c[i].zip_file_name_backup:%s\\n\", file_name_b.file_backup_c[i].zip_file_name_backup);\r\n                        dbg_time(\"file_name_b.file_backup_c[i].zip_file_dir_backup:%s\\n\", file_name_b.file_backup_c[i].zip_file_dir_backup);\r\n\r\n                        if (strstr(file_name_b.file_backup_c[i].zip_file_dir_backup, \"update/firehose\"))\r\n                        {\r\n                            memmove(rawprogram_patch_filename, file_name_b.file_backup_c[i].zip_file_name_backup, strlen(file_name_b.file_backup_c[i].zip_file_name_backup));\r\n                            memmove(rawprogram_patch_firehose_dir, file_name_b.file_backup_c[i].zip_file_dir_backup, strlen(file_name_b.file_backup_c[i].zip_file_dir_backup));\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (rawprogram_patch_filename[0] != '\\0') // find rawprogram file\r\n                {\r\n                    memset(zip_cmd_buf, 0, sizeof(zip_cmd_buf));\r\n                    if (is_upgrade_fimeware_only_zip)\r\n                    {\r\n                        snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"unzip -o -q %.240s '*%.200s' -d /tmp/ > %s\", firehose_dir, rawprogram_patch_firehose_dir, ZIP_PROCESS_INFO);\r\n                    }\r\n                    else\r\n                    {\r\n                        snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"7z x %.240s -o/tmp/ %.200s > %s\", firehose_dir, rawprogram_patch_firehose_dir, ZIP_PROCESS_INFO);\r\n                    }\r\n                    dbg_time(\"%s zip_cmd_buf:%s\\n\", __func__, zip_cmd_buf);\r\n                    if (-1 == system(zip_cmd_buf))\r\n                    {\r\n                        dbg_time(\"%s system return error\\n\", __func__);\r\n                        for (i = 0; i < 32; i++)\r\n                        {\r\n                            if (xmlfile_list[i])\r\n                            {\r\n                                free(xmlfile_list[i]);\r\n                                xmlfile_list[i] = NULL;\r\n                            }\r\n                        }\r\n\r\n                        error_return();\r\n                    }\r\n                    usleep(1000);\r\n\r\n                    memmove(xmlfile_list[xmlfile_cnt], rawprogram_patch_firehose_dir, 240);\r\n                    dbg_time(\"xmlfile_list[xmlfile_cnt] = %s\", xmlfile_list[xmlfile_cnt]);\r\n\r\n                    xmlfile_cnt++;\r\n                    rawprogram_unsparse_exist++;\r\n                }\r\n            }\r\n\r\n            if (rawprogram_unsparse_exist == 0)\r\n            {\r\n                memset(rawprogram_patch_filename, 0, sizeof(rawprogram_patch_filename));\r\n                memset(rawprogram_patch_firehose_dir, 0, sizeof(rawprogram_patch_firehose_dir));\r\n\r\n                for (i = 0; i < file_name_b.file_name_count; i++)\r\n                {\r\n                    if (strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \"rawprogram_\") && strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \".xml\"))\r\n                    {\r\n                        dbg_time(\"file_name_b.file_backup_c[i].zip_file_name_backup:%s\\n\", file_name_b.file_backup_c[i].zip_file_name_backup);\r\n                        dbg_time(\"file_name_b.file_backup_c[i].zip_file_dir_backup:%s\\n\", file_name_b.file_backup_c[i].zip_file_dir_backup);\r\n\r\n                        if (strstr(file_name_b.file_backup_c[i].zip_file_dir_backup, \"update/firehose\"))\r\n                        {\r\n                            memmove(rawprogram_patch_filename, file_name_b.file_backup_c[i].zip_file_name_backup, strlen(file_name_b.file_backup_c[i].zip_file_name_backup));\r\n                            memmove(rawprogram_patch_firehose_dir, file_name_b.file_backup_c[i].zip_file_dir_backup, strlen(file_name_b.file_backup_c[i].zip_file_dir_backup));\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (rawprogram_patch_filename[0] != '\\0') // find rawprogram file\r\n                {\r\n                    memset(zip_cmd_buf, 0, sizeof(zip_cmd_buf));\r\n                    if (is_upgrade_fimeware_only_zip)\r\n                    {\r\n                        snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"unzip -o -q %.240s '*%.200s' -d /tmp/ > %s\", firehose_dir, rawprogram_patch_firehose_dir, ZIP_PROCESS_INFO);\r\n                    }\r\n                    else\r\n                    {\r\n                        snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"7z x %.240s -o/tmp/ %.200s > %s\", firehose_dir, rawprogram_patch_firehose_dir, ZIP_PROCESS_INFO);\r\n                    }\r\n                    dbg_time(\"%s zip_cmd_buf:%s\\n\", __func__, zip_cmd_buf);\r\n                    if (-1 == system(zip_cmd_buf))\r\n                    {\r\n                        dbg_time(\"%s system return error\\n\", __func__);\r\n                        for (i = 0; i < 32; i++)\r\n                        {\r\n                            if (xmlfile_list[i])\r\n                            {\r\n                                free(xmlfile_list[i]);\r\n                                xmlfile_list[i] = NULL;\r\n                            }\r\n                        }\r\n\r\n                        error_return();\r\n                    }\r\n                    usleep(1000);\r\n\r\n                    memmove(xmlfile_list[xmlfile_cnt], rawprogram_patch_firehose_dir, 240);\r\n                    dbg_time(\"xmlfile_list[xmlfile_cnt] = %s\", xmlfile_list[xmlfile_cnt]);\r\n                    xmlfile_cnt++;\r\n                }\r\n            }\r\n\r\n            memset(rawprogram_patch_filename, 0, sizeof(rawprogram_patch_filename));\r\n            memset(rawprogram_patch_firehose_dir, 0, sizeof(rawprogram_patch_firehose_dir));\r\n\r\n            for (i = 0; i < file_name_b.file_name_count; i++)\r\n            {\r\n                if (strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \"firehose-rawprogram\") && strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \".xml\"))\r\n                {\r\n                    dbg_time(\"file_name_b.file_backup_c[i].zip_file_name_backup:%s\\n\", file_name_b.file_backup_c[i].zip_file_name_backup);\r\n                    dbg_time(\"file_name_b.file_backup_c[i].zip_file_dir_backup:%s\\n\", file_name_b.file_backup_c[i].zip_file_dir_backup);\r\n\r\n                    if (strstr(file_name_b.file_backup_c[i].zip_file_dir_backup, \"update/firehose\"))\r\n                    {\r\n                        memmove(rawprogram_patch_filename, file_name_b.file_backup_c[i].zip_file_name_backup, strlen(file_name_b.file_backup_c[i].zip_file_name_backup));\r\n                        memmove(rawprogram_patch_firehose_dir, file_name_b.file_backup_c[i].zip_file_dir_backup, strlen(file_name_b.file_backup_c[i].zip_file_dir_backup));\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (rawprogram_patch_filename[0] != '\\0') // find rawprogram file\r\n            {\r\n                memset(zip_cmd_buf, 0, sizeof(zip_cmd_buf));\r\n                if (is_upgrade_fimeware_only_zip)\r\n                {\r\n                    snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"unzip -o -q %.240s '*%.200s' -d /tmp/ > %s\", firehose_dir, rawprogram_patch_firehose_dir, ZIP_PROCESS_INFO);\r\n                }\r\n                else\r\n                {\r\n                    snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"7z x %.240s -o/tmp/ %.200s > %s\", firehose_dir, rawprogram_patch_firehose_dir, ZIP_PROCESS_INFO);\r\n                }\r\n                dbg_time(\"%s zip_cmd_buf:%s\\n\", __func__, zip_cmd_buf);\r\n                if (-1 == system(zip_cmd_buf))\r\n                {\r\n                    dbg_time(\"%s system return error\\n\", __func__);\r\n                    for (i = 0; i < 32; i++)\r\n                    {\r\n                        if (xmlfile_list[i])\r\n                        {\r\n                            free(xmlfile_list[i]);\r\n                            xmlfile_list[i] = NULL;\r\n                        }\r\n                    }\r\n\r\n                    error_return();\r\n                }\r\n                usleep(1000);\r\n\r\n                memmove(xmlfile_list[xmlfile_cnt], rawprogram_patch_firehose_dir, 240);\r\n                dbg_time(\"xmlfile_list[xmlfile_cnt] = %s\", xmlfile_list[xmlfile_cnt]);\r\n                xmlfile_cnt++;\r\n            }\r\n\r\n            for (x = 0; x < 10; x++)\r\n            {\r\n                snprintf(xmlfile_tmp, sizeof(xmlfile_tmp), \"rawprogram%u\",\r\n                         x); // use rawprogram%u Adaptation rawprogram%u_xxx\r\n\r\n                memset(rawprogram_patch_filename, 0, sizeof(rawprogram_patch_filename));\r\n                memset(rawprogram_patch_firehose_dir, 0, sizeof(rawprogram_patch_firehose_dir));\r\n                for (i = 0; i < file_name_b.file_name_count; i++)\r\n                {\r\n                    if ((strstr(file_name_b.file_backup_c[i].zip_file_name_backup, xmlfile_tmp) && strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \".xml\")))\r\n                    {\r\n                        dbg_time(\"file_name_b.file_backup_c[i].zip_file_name_backup:%s\\n\", file_name_b.file_backup_c[i].zip_file_name_backup);\r\n                        dbg_time(\"file_name_b.file_backup_c[i].zip_file_dir_backup:%s\\n\", file_name_b.file_backup_c[i].zip_file_dir_backup);\r\n\r\n                        if (strstr(file_name_b.file_backup_c[i].zip_file_dir_backup, \"update/firehose\"))\r\n                        {\r\n                            memmove(rawprogram_patch_filename, file_name_b.file_backup_c[i].zip_file_name_backup, strlen(file_name_b.file_backup_c[i].zip_file_name_backup));\r\n                            memmove(rawprogram_patch_firehose_dir, file_name_b.file_backup_c[i].zip_file_dir_backup, strlen(file_name_b.file_backup_c[i].zip_file_dir_backup));\r\n                            break;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                if (rawprogram_patch_filename[0] != '\\0') // find rawprogram file\r\n                {\r\n                    memset(zip_cmd_buf, 0, sizeof(zip_cmd_buf));\r\n                    if (is_upgrade_fimeware_only_zip)\r\n                    {\r\n                        snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"unzip -o -q %.240s '*%.200s' -d /tmp/ > %s\", firehose_dir, rawprogram_patch_firehose_dir, ZIP_PROCESS_INFO);\r\n                    }\r\n                    else\r\n                    {\r\n                        snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"7z x %.240s -o/tmp/ %.200s > %s\", firehose_dir, rawprogram_patch_firehose_dir, ZIP_PROCESS_INFO);\r\n                    }\r\n                    dbg_time(\"%s zip_cmd_buf:%s\\n\", __func__, zip_cmd_buf);\r\n                    if (-1 == system(zip_cmd_buf))\r\n                    {\r\n                        dbg_time(\"%s system return error\\n\", __func__);\r\n                        for (i = 0; i < 32; i++)\r\n                        {\r\n                            if (xmlfile_list[i])\r\n                            {\r\n                                free(xmlfile_list[i]);\r\n                                xmlfile_list[i] = NULL;\r\n                            }\r\n                        }\r\n\r\n                        error_return();\r\n                    }\r\n                    usleep(1000);\r\n\r\n                    memmove(xmlfile_list[xmlfile_cnt], rawprogram_patch_firehose_dir, 240);\r\n                    dbg_time(\"xmlfile_list[xmlfile_cnt] = %s\", xmlfile_list[xmlfile_cnt]);\r\n\r\n                    xmlfile_cnt++;\r\n                }\r\n            }\r\n        }\r\n\r\n        memset(rawprogram_patch_filename, 0, sizeof(rawprogram_patch_filename));\r\n        memset(rawprogram_patch_firehose_dir, 0, sizeof(rawprogram_patch_firehose_dir));\r\n\r\n        for (i = 0; i < file_name_b.file_name_count; i++)\r\n        {\r\n            if ((strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \"patch_\") && strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \".xml\")) ||\r\n                (strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \"patch-\") && strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \".xml\")))\r\n            {\r\n                dbg_time(\"file_name_b.file_backup_c[i].zip_file_name_backup:%s\\n\", file_name_b.file_backup_c[i].zip_file_name_backup);\r\n                dbg_time(\"file_name_b.file_backup_c[i].zip_file_dir_backup:%s\\n\", file_name_b.file_backup_c[i].zip_file_dir_backup);\r\n\r\n                if (strstr(file_name_b.file_backup_c[i].zip_file_dir_backup, \"update/firehose\"))\r\n                {\r\n                    memmove(rawprogram_patch_filename, file_name_b.file_backup_c[i].zip_file_name_backup, strlen(file_name_b.file_backup_c[i].zip_file_name_backup));\r\n                    memmove(rawprogram_patch_firehose_dir, file_name_b.file_backup_c[i].zip_file_dir_backup, strlen(file_name_b.file_backup_c[i].zip_file_dir_backup));\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (rawprogram_patch_filename[0] != '\\0') // find patch file\r\n        {\r\n            memset(zip_cmd_buf, 0, sizeof(zip_cmd_buf));\r\n            if (is_upgrade_fimeware_only_zip)\r\n            {\r\n                snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"unzip -o -q %.240s '*%.200s' -d /tmp/ > %s\", firehose_dir, rawprogram_patch_firehose_dir, ZIP_PROCESS_INFO);\r\n            }\r\n            else\r\n            {\r\n                snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"7z x %.240s -o/tmp/ %.200s > %s\", firehose_dir, rawprogram_patch_firehose_dir, ZIP_PROCESS_INFO);\r\n            }\r\n            dbg_time(\"%s zip_cmd_buf:%s\\n\", __func__, zip_cmd_buf);\r\n            if (-1 == system(zip_cmd_buf))\r\n            {\r\n                dbg_time(\"%s system return error\\n\", __func__);\r\n                for (i = 0; i < 32; i++)\r\n                {\r\n                    if (xmlfile_list[i])\r\n                    {\r\n                        free(xmlfile_list[i]);\r\n                        xmlfile_list[i] = NULL;\r\n                    }\r\n                }\r\n\r\n                error_return();\r\n            }\r\n            usleep(1000);\r\n\r\n            memmove(xmlfile_list[xmlfile_cnt], rawprogram_patch_firehose_dir, 240);\r\n            dbg_time(\"xmlfile_list[xmlfile_cnt] = %s\", xmlfile_list[xmlfile_cnt]);\r\n            xmlfile_cnt++;\r\n        }\r\n\r\n        for (x = 0; x < 10; x++)\r\n        {\r\n            snprintf(xmlfile_tmp, sizeof(xmlfile_tmp), \"patch%u.xml\", x);\r\n\r\n            memset(rawprogram_patch_filename, 0, sizeof(rawprogram_patch_filename));\r\n            memset(rawprogram_patch_firehose_dir, 0, sizeof(rawprogram_patch_firehose_dir));\r\n            for (i = 0; i < file_name_b.file_name_count; i++)\r\n            {\r\n                if ((strstr(file_name_b.file_backup_c[i].zip_file_name_backup, xmlfile_tmp) && strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \".xml\")))\r\n                {\r\n                    dbg_time(\"file_name_b.file_backup_c[i].zip_file_name_backup:%s\\n\", file_name_b.file_backup_c[i].zip_file_name_backup);\r\n                    dbg_time(\"file_name_b.file_backup_c[i].zip_file_dir_backup:%s\\n\", file_name_b.file_backup_c[i].zip_file_dir_backup);\r\n\r\n                    if (strstr(file_name_b.file_backup_c[i].zip_file_dir_backup, \"update/firehose\"))\r\n                    {\r\n                        memmove(rawprogram_patch_filename, file_name_b.file_backup_c[i].zip_file_name_backup, strlen(file_name_b.file_backup_c[i].zip_file_name_backup));\r\n                        memmove(rawprogram_patch_firehose_dir, file_name_b.file_backup_c[i].zip_file_dir_backup, strlen(file_name_b.file_backup_c[i].zip_file_dir_backup));\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (rawprogram_patch_filename[0] != '\\0') // find patch file\r\n            {\r\n                memset(zip_cmd_buf, 0, sizeof(zip_cmd_buf));\r\n                if (is_upgrade_fimeware_only_zip)\r\n                {\r\n                    snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"unzip -o -q %.240s '*%.200s' -d /tmp/ > %s\", firehose_dir, rawprogram_patch_firehose_dir, ZIP_PROCESS_INFO);\r\n                }\r\n                else\r\n                {\r\n                    snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"7z x %.240s -o/tmp/ %.200s > %s\", firehose_dir, rawprogram_patch_firehose_dir, ZIP_PROCESS_INFO);\r\n                }\r\n                dbg_time(\"%s zip_cmd_buf:%s\\n\", __func__, zip_cmd_buf);\r\n                if (-1 == system(zip_cmd_buf))\r\n                {\r\n                    dbg_time(\"%s system return error\\n\", __func__);\r\n                    for (i = 0; i < 32; i++)\r\n                    {\r\n                        if (xmlfile_list[i])\r\n                        {\r\n                            free(xmlfile_list[i]);\r\n                            xmlfile_list[i] = NULL;\r\n                        }\r\n                    }\r\n\r\n                    error_return();\r\n                }\r\n                usleep(1000);\r\n\r\n                memmove(xmlfile_list[xmlfile_cnt], rawprogram_patch_firehose_dir, 240);\r\n                dbg_time(\"xmlfile_list[xmlfile_cnt] = %s\", xmlfile_list[xmlfile_cnt]);\r\n\r\n                xmlfile_cnt++;\r\n            }\r\n        }\r\n\r\n        for (x = 0; x < xmlfile_cnt; x++)\r\n        {\r\n            snprintf(rawprogram_full_path, sizeof(rawprogram_full_path), \"/tmp/%.255s\", xmlfile_list[x]);\r\n            free(xmlfile_list[xmlfile_cnt]);\r\n            xmlfile_list[xmlfile_cnt] = NULL;\r\n            fh_parse_xml_file(fh_data, rawprogram_full_path);\r\n\r\n            unlink(rawprogram_full_path);\r\n        }\r\n\r\n        for (i = 0; i < 32; i++)\r\n        {\r\n            if (xmlfile_list[i])\r\n            {\r\n                free(xmlfile_list[i]);\r\n                xmlfile_list[i] = NULL;\r\n            }\r\n        }\r\n\r\n        if (fh_data->fh_cmd_count == 0)\r\n        {\r\n            if (fh_data)\r\n            {\r\n                free(fh_data);\r\n                fh_data = NULL;\r\n            }\r\n            error_return();\r\n        }\r\n    }\r\n    else\r\n    {\r\n        if (q_module_packet_sign)\r\n        {\r\n            for (x = 0; x < 10; x++)\r\n            {\r\n                snprintf(xmlfile_tmp, sizeof(xmlfile_tmp), \"rawprogram%u_secboot\",\r\n                         x); // use rawprogram%u Adaptation rawprogram%u_xxx  for AG215S-GLR\r\n                if (!qfile_find_file(firehose_dir, xmlfile_tmp, \".xml\", &xmlfile_list[xmlfile_cnt]))\r\n                {\r\n                    continue;\r\n                }\r\n                xmlfile_cnt++;\r\n            }\r\n\r\n            if (!qfile_find_file(firehose_dir, \"secboot_\", \".xml\", &xmlfile_list[xmlfile_cnt]))\r\n            {\r\n                dbg_time(\"secboot rawprogram namd file failed.\\n\");\r\n                // error_return();\r\n            }\r\n            else\r\n            {\r\n                xmlfile_cnt++;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            for (x = 0; x < 10; x++)\r\n            {\r\n                snprintf(xmlfile_tmp, sizeof(xmlfile_tmp), \"rawprogram_unsparse%u\",\r\n                         x); // smart  SA885GAPNA\r\n                if (!qfile_find_file(firehose_dir, xmlfile_tmp, \".xml\", &xmlfile_list[xmlfile_cnt]))\r\n                {\r\n                    continue;\r\n                }\r\n                xmlfile_cnt++;\r\n                rawprogram_unsparse_exist++;\r\n            }\r\n\r\n            if (rawprogram_unsparse_exist == 0)\r\n            {\r\n                if (!qfile_find_file(firehose_dir, \"rawprogram_\", \".xml\", &xmlfile_list[xmlfile_cnt]))\r\n                {\r\n                    dbg_time(\"retrieve rawprogram namd file failed.\\n\");\r\n                    // error_return();\r\n                }\r\n                else\r\n                {\r\n                    xmlfile_cnt++;\r\n                }\r\n            }\r\n\r\n            if (!qfile_find_file(firehose_dir, \"firehose-rawprogram\", \".xml\", &xmlfile_list[xmlfile_cnt]))\r\n            {\r\n                dbg_time(\"retrieve rawprogram namd file failed.\\n\");\r\n                // error_return();\r\n            }\r\n            else\r\n                xmlfile_cnt++;\r\n\r\n            for (x = 0; x < 10; x++)\r\n            {\r\n                snprintf(xmlfile_tmp, sizeof(xmlfile_tmp), \"rawprogram%u\",\r\n                         x); // use rawprogram%u Adaptation rawprogram%u_xxx\r\n                if (!qfile_find_file(firehose_dir, xmlfile_tmp, \".xml\", &xmlfile_list[xmlfile_cnt]))\r\n                {\r\n                    continue;\r\n                }\r\n                xmlfile_cnt++;\r\n            }\r\n        }\r\n\r\n        if (!qfile_find_file(firehose_dir, \"patch_\", \".xml\", &xmlfile_list[xmlfile_cnt]) && !qfile_find_file(firehose_dir, \"patch-\", \".xml\", &xmlfile_list[xmlfile_cnt]))\r\n        {\r\n            dbg_time(\"retrieve patch namd file failed.\\n\");\r\n            // error_return();\r\n        }\r\n        else\r\n            xmlfile_cnt++;\r\n\r\n        for (x = 0; x < 10; x++)\r\n        {\r\n            snprintf(xmlfile_tmp, sizeof(xmlfile_tmp), \"patch%u.xml\", x);\r\n            if (!qfile_find_file(firehose_dir, xmlfile_tmp, \".xml\", &xmlfile_list[xmlfile_cnt]))\r\n            {\r\n                continue;\r\n            }\r\n            xmlfile_cnt++;\r\n        }\r\n\r\n        for (x = 0; x < xmlfile_cnt; x++)\r\n        {\r\n            snprintf(rawprogram_full_path, sizeof(rawprogram_full_path), \"%.255s/%.255s\", firehose_dir, xmlfile_list[x]);\r\n            free(xmlfile_list[xmlfile_cnt]);\r\n            fh_parse_xml_file(fh_data, rawprogram_full_path);\r\n        }\r\n\r\n        if (fh_data->fh_cmd_count == 0)\r\n        {\r\n            if (fh_data)\r\n            {\r\n                free(fh_data);\r\n                fh_data = NULL;\r\n            }\r\n            error_return();\r\n        }\r\n    }\r\n\r\n    for (x = 0; x < fh_data->fh_cmd_count; x++)\r\n    {\r\n        struct fh_cmd *fh_cmd = &fh_data->fh_cmd_table[x];\r\n\r\n        if (strstr(fh_cmd->cmd.type, \"program\"))\r\n        {\r\n            fh_fixup_program_cmd(fh_data, fh_cmd, &filesize);\r\n            if (fh_cmd->program.num_partition_sectors == 0)\r\n            {\r\n                if (fh_data)\r\n                {\r\n                    free(fh_data);\r\n                    fh_data = NULL;\r\n                }\r\n                error_return();\r\n            }\r\n\r\n            // calc files size\r\n            filesizes += filesize;\r\n        }\r\n        else if (strstr(fh_cmd->cmd.type, \"erase\"))\r\n        {\r\n            if ((fh_cmd->erase.num_partition_sectors + fh_cmd->erase.start_sector) > max_num_partition_sectors)\r\n                max_num_partition_sectors = (fh_cmd->erase.num_partition_sectors + fh_cmd->erase.start_sector);\r\n        }\r\n    }\r\n\r\n    if (socketpair(AF_LOCAL, SOCK_STREAM, 0, fh_recv_cmd_sk))\r\n    {\r\n        if (fh_data)\r\n        {\r\n            free(fh_data);\r\n            fh_data = NULL;\r\n        }\r\n        error_return();\r\n    }\r\n    fcntl(fh_recv_cmd_sk[0], F_SETFL, O_NONBLOCK);\r\n    if (pthread_create(&recv_cmd_tid, NULL, fh_recv_cmd_thread, (void *)fh_data)) error_return();\r\n    set_transfer_allbytes(filesizes);\r\n    // must first read <log from mdm9x07, then send <configure, and 1 second is not enough\r\n    fh_recv_cmd(fh_data, &fh_rx_cmd, 3000, 1);\r\n    while (fh_recv_cmd(fh_data, &fh_rx_cmd, 1000, 1) == 0)\r\n        ;\r\n\r\n    if (fh_send_cfg_cmd(fh_data, q_device_type)) error_return();\r\n\r\n    if (!strcmp(q_device_type, \"nand\")) first_earse_and_last_programm_SBL = 1;\r\n\r\n    if (first_earse_and_last_programm_SBL || q_erase_all_before_download)\r\n    {\r\n        for (x = 0; x < fh_data->fh_cmd_count; x++)\r\n        {\r\n            struct fh_cmd *fh_cmd = &fh_data->fh_cmd_table[x];\r\n\r\n            if (!strstr(fh_cmd->cmd.type, \"erase\")) continue;\r\n\r\n            if (fh_cmd->erase.start_sector != 0) // Pre erase start_sector == 0 partition\r\n                continue;\r\n\r\n            if (q_erase_all_before_download)\r\n            {\r\n                fh_xml_set_value(fh_cmd->xml_original_data, \"num_partition_sectors\", max_num_partition_sectors);\r\n                if (fh_cmd->erase.last_sector)\r\n                {\r\n                    fh_xml_set_value(fh_cmd->xml_original_data, \"last_sector\", max_num_partition_sectors - 1);\r\n                }\r\n            }\r\n            // dbg_time(\"point one\");\r\n            if (fh_process_erase(fh_data, fh_cmd)) error_return();\r\n        }\r\n    }\r\n\r\n    for (x = 0; x < fh_data->fh_cmd_count; x++)\r\n    {\r\n        const struct fh_cmd *fh_cmd = &fh_data->fh_cmd_table[x];\r\n\r\n        if (strstr(fh_cmd->cmd.type, \"vendor\"))\r\n        {\r\n            fh_send_cmd(fh_data, fh_cmd);\r\n            if (fh_wait_response_cmd(fh_data, &fh_rx_cmd, 6000) != 0) error_return();\r\n            if (strcmp(fh_rx_cmd.response.value, \"ACK\")) error_return();\r\n        }\r\n    }\r\n\r\n    if (!q_erase_all_before_download)\r\n    {\r\n        for (x = 0; x < fh_data->fh_cmd_count; x++)\r\n        {\r\n            struct fh_cmd *fh_cmd = &fh_data->fh_cmd_table[x];\r\n\r\n            if (!strstr(fh_cmd->cmd.type, \"erase\")) continue;\r\n\r\n            if (fh_cmd->erase.SECTOR_SIZE_IN_BYTES == 0) //��ֹBG95 ����¼ jira id: STMDM9205-5237 ����fh_cmd->erase.num_partition_sectors ==\r\n                                                         // 0�� ��Ϊ<erase SECTOR_SIZE_IN_BYTES=\"512\" label=\"erase whole disk\"\r\n                                                         // physical_partition_number=\"0\" start_sector=\"0\" /> ��Ҫд��ģ��\r\n                continue;\r\n\r\n            if (first_earse_and_last_programm_SBL)\r\n            {\r\n                if (fh_cmd->erase.start_sector == 0) // Skip erase start_sector == 0 partition\r\n                    continue;\r\n            }\r\n            // dbg_time(\"point two\");\r\n            if (fh_process_erase(fh_data, fh_cmd)) error_return();\r\n        }\r\n    }\r\n\r\n    for (x = 0; x < fh_data->fh_cmd_count; x++)\r\n    {\r\n        struct fh_cmd *fh_cmd = &fh_data->fh_cmd_table[x];\r\n\r\n        if (!strstr(fh_cmd->cmd.type, \"program\")) continue;\r\n\r\n        if (first_earse_and_last_programm_SBL && fh_cmd->program.start_sector == 0) continue;\r\n\r\n        if (fh_process_program(fh_data, fh_cmd)) error_return();\r\n    }\r\n\r\n    if (first_earse_and_last_programm_SBL)\r\n    {\r\n        for (x = 0; x < fh_data->fh_cmd_count; x++)\r\n        {\r\n            struct fh_cmd *fh_cmd = &fh_data->fh_cmd_table[x];\r\n\r\n            if (!strstr(fh_cmd->cmd.type, \"program\")) continue;\r\n\r\n            if (fh_cmd->program.start_sector != 0) continue;\r\n\r\n            if (fh_process_program(fh_data, fh_cmd)) error_return();\r\n        }\r\n    }\r\n\r\n    if (fh_data->fh_patch_count)\r\n    {\r\n        for (x = 0; x < fh_data->fh_cmd_count; x++)\r\n        {\r\n            const struct fh_cmd *fh_cmd = &fh_data->fh_cmd_table[x];\r\n\r\n            if (!strstr(fh_cmd->cmd.type, \"patch\")) continue;\r\n\r\n            if (fh_process_patch(fh_data, fh_cmd)) error_return();\r\n        }\r\n    }\r\n\r\n    if (strcmp(q_device_type, \"nand\"))\r\n    {\r\n        fh_send_setbootablestoragedrive_cmd(fh_data);\r\n        if (fh_wait_response_cmd(fh_data, &fh_rx_cmd, 3000) != 0) error_return();\r\n    }\r\n\r\n    fh_send_reset_cmd(fh_data);\r\n    if (fh_wait_response_cmd(fh_data, &fh_rx_cmd, 3000) != 0) error_return();\r\n    while (fh_recv_cmd(fh_data, &fh_rx_cmd, 1000, 1) == 0)\r\n        ; // required by sdx20\r\n\r\n    free(fh_data);\r\n\r\n    // pthread_join(recv_cmd_tid, NULL);\r\n    close(fh_recv_cmd_sk[0]);\r\n    close(fh_recv_cmd_sk[1]);\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/hostdl_packet.h",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software.\r\n    Under no circumstances may customers modify, demonstrate, use, deliver\r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#ifndef _HOSTDL_PACKET_H_\r\n#define _HOSTDL_PACKET_H_\r\n\r\n#define UNFRAMED_MAX_DATA_LENGTH 1024\r\n#define FRAMED_MAX_DATA_LENGTH 1024\r\n#define NUMBER_OF_PACKETS 2\r\n#define HOST_REPLY_BUFFER_SIZE 1024\r\n\r\n#define PACKET_OVERHEAD_SIZE 7\r\n#define CMD_SIZE 1\r\n#define MAGIC_SIZE 32\r\n#define VERSION_SIZE 1\r\n#define COMPAT_VERSION_SIZE 1\r\n#define BLOCK_SIZE_SIZE 4\r\n#define FLASH_BASE_SIZE 4\r\n#define FLASH_ID_LEN_SIZE 1\r\n#define WINDOW_SIZE_SIZE 2\r\n#define NUM_SECTORS_SIZE 2\r\n#define FEATURE_BITS_SIZE 4\r\n\r\n#define FLASH_ID_STRING_SIZE 32\r\n\r\n#define REPLY_FIXED_SIZE                                                                           \\\r\n    (PACKET_OVERHEAD_SIZE + CMD_SIZE + MAGIC_SIZE + VERSION_SIZE + COMPAT_VERSION_SIZE +           \\\r\n     BLOCK_SIZE_SIZE + FLASH_BASE_SIZE + FLASH_ID_LEN_SIZE + WINDOW_SIZE_SIZE + NUM_SECTORS_SIZE + \\\r\n     FEATURE_BITS_SIZE + FLASH_ID_STRING_SIZE)\r\n\r\n#define REPLY_BUFFER_SIZE HOST_REPLY_BUFFER_SIZE\r\n\r\n#define MAX_SECTORS ((REPLY_BUFFER_SIZE - REPLY_FIXED_SIZE) / 4)\r\n\r\n#define DEVICE_UNKNOWN 0xFF\r\n\r\n#define MAX_PACKET_SIZE (UNFRAMED_MAX_DATA_LENGTH + 1 + 4 + 2 + 9)\r\n\r\n#define STREAM_DLOAD_MAX_VER 0x04\r\n#define STREAM_DLOAD_MIN_VER 0x02\r\n\r\n#define UNFRAMED_DLOAD_MIN_VER 0x04\r\n\r\n#define UART_DLOAD_MAX_VER 0x03\r\n\r\n#if 0\r\n#if defined(USE_UART_ONLY) && (STREAM_DLOAD_MAX_VER > UART_DLOAD_MAX_VER)\r\n#warning UART does not support protocol versions beyond UART_DLOAD_MAX_VER. \\\r\n    Reverting to an earlier protocol version.\r\n#undef STREAM_DLOAD_MAX_VER\r\n#define STREAM_DLOAD_MAX_VER UART_DLOAD_MAX_VER\r\n#endif\r\n#endif\r\n\r\n#define FEATURE_UNCOMPRESSED_DLOAD 0x00000001\r\n\r\n#define FEATURE_NAND_PRIMARY_IMAGE 0x00000002\r\n#define FEATURE_NAND_BOOTLOADER_IMAGE 0x00000004\r\n#define FEATURE_NAND_MULTI_IMAGE 0x00000008\r\n\r\n#define SUPPORTED_FEATURES (FEATURE_UNCOMPRESSED_DLOAD | FEATURE_NAND_MULTI_IMAGE)\r\n\r\n#define READ_LEN 7\r\n\r\n#define HELLO_REQ 0x01\r\n#define HELLO_RSP 0x02\r\n#define READ_RSP 0x04\r\n#define WRITE_RSP 0x06\r\n#define STREAM_WRITE_RSP 0x08\r\n#define NOP_RSP 0x0A\r\n#define RESET_RSP 0x0C\r\n#define ERROR_RSP 0x0D\r\n#define CMD_LOG 0x0E\r\n#define UNLOCK_RSP 0x10\r\n#define PWRDOWN_RSP 0x12\r\n#define OPEN_RSP 0x14\r\n#define CLOSE_RSP 0x16\r\n#define SECURITY_MODE_RSP 0x18\r\n#define PARTITION_TABLE_RSP 0x1A\r\n#define OPEN_MULTI_IMAGE_RSP 0x1C\r\n#define ERASE_RSP 0x1E\r\n\r\n#define UNFRAMED_STREAM_WRITE_CMD 0x30\r\n#define UNFRAMED_STREAM_WRITE_RSP 0x31\r\n#define DUMMY_RSP 0x32\r\n\r\n#define FIRST_COMMAND 0x01\r\n#define LAST_COMMAND 0x31\r\n\r\n#if (DUMMY_RSP != (LAST_COMMAND + 1))\r\n#error LAST_COMMAND and DUMMY_RSP mismatch. Bailing out!\r\n#endif\r\n\r\n#define SIZE_MSG_LEN 64\r\n\r\n#define HELLO_CMD_OFFSET 0\r\n#define HELLO_MAGIC_NUM_OFFSET 1\r\n#define HELLO_MAX_VER_OFFSET 33\r\n#define HELLO_MIN_VER_OFFSET 34\r\n#define HELLO_MAX_DATA_SZ_1_OFFSET 35\r\n#define HELLO_MAX_DATA_SZ_2_OFFSET 36\r\n#define HELLO_MAX_DATA_SZ_3_OFFSET 37\r\n#define HELLO_MAX_DATA_SZ_4_OFFSET 38\r\n\r\n#endif\r\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/log/MCU_local.log.txt",
    "content": "root@OpenWrt:~# ./QFirehose -f /mnt/RM500QGLAAR01A01M4G_BETA_20200428F\r\n[000.000]: QFirehose Version: Quectel_LTE&5G_QFirehose_Linux&Android_V1.3.2\r\n[000.000]: Builded: May 18 2020 11:32:04\r\n[000.000]: Find md5 check file </mnt/RM500QGLAAR01A01M4G_BETA_20200428F_factory/md5.txt>\r\n[000.002]: Totals checking 0 files md5 value, 0 file fail!\r\n[000.019]: [1] /sys/bus/usb/devices/2-1.4 2c7c/800/414\r\n[000.026]: P: /dev/bus/usb/002/006 idVendor=2c7c idProduct=0800\r\n[000.026]: C: /dev/bus/usb/002/006 bNumInterfaces: 5\r\n[000.026]: I: If#= 0 Alt= 0 #EPs= 2 Cls=ff Sub=ff Prot=30\r\n[000.026]: E: Ad=81 Atr=02 MxPS= 1024 Ivl=0ms\r\n[000.026]: E: Ad=01 Atr=02 MxPS= 1024 Ivl=0ms\r\n[000.026]: I: If#= 1 Alt= 0 #EPs= 3 Cls=ff Sub=00 Prot=00\r\n[000.027]: I: If#= 2 Alt= 0 #EPs= 3 Cls=ff Sub=00 Prot=00\r\n[000.027]: I: If#= 3 Alt= 0 #EPs= 3 Cls=ff Sub=00 Prot=00\r\n[000.027]: I: If#= 4 Alt= 0 #EPs= 3 Cls=ff Sub=ff Prot=ff\r\n[000.027]: qusb_noblock_open port_name = /dev/ttyUSB0\r\n[000.031]: old software version: RM500QGLAAR01A01M4G_BETA_20200428F\r\n[001.032]: poll_wait events=POLLIN msec=1000 timeout\r\n[001.032]: qusb_noblock_read cur=0, min_size=1\r\n[001.032]: switch to 'Emergency download mode'\r\n[001.034]: successful, wait module reboot\r\n[002.035]: fail to fopen /sys/bus/usb/devices/2-1.4/uevent, errno: 2 (No such file or directory)\r\n[003.041]: fail to fopen /sys/bus/usb/devices/2-1.4/uevent, errno: 2 (No such file or directory)\r\n[004.045]: [1] /sys/bus/usb/devices/1-1.4 5c6/9008/0\r\n[004.049]: P: /dev/bus/usb/001/012 idVendor=05c6 idProduct=9008\r\n[004.049]: C: /dev/bus/usb/001/012 bNumInterfaces: 1\r\n[004.049]: I: If#= 0 Alt= 0 #EPs= 2 Cls=ff Sub=ff Prot=11\r\n[004.049]: E: Ad=81 Atr=02 MxPS= 512 Ivl=0ms\r\n[004.049]: E: Ad=01 Atr=02 MxPS= 512 Ivl=0ms\r\n[004.050]: dir=/mnt/RM500QGLAAR01A01M4G_BETA_20200428F_factory/update/firehose\r\n[004.050]: dir=/mnt/RM500QGLAAR01A01M4G_BETA_20200428F_factory/update/firehose\r\n[004.051]: d_name=prog_firehose_sdx55.mbn\r\n[004.051]: prog_nand_firehose_filename = prog_firehose_sdx55.mbn\r\n[004.051]: STATE <-- SAHARA_WAIT_HELLO\r\n[004.052]: RECEIVED <--  SAHARA_HELLO_ID\r\n[004.052]: RECEIVED <-- SAHARA_MODE_IMAGE_TX_PENDING\r\n[004.052]: SENDING --> SAHARA_HELLO_RESPONSE\r\n[004.052]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.053]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.053]: 0x0000000d 0x00000000 0x00000034\r\n[004.056]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.056]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.056]: 0x0000000d 0x00000034 0x00000080\r\n[004.056]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.057]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.057]: 0x0000000d 0x00001000 0x00001000\r\n[004.058]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.087]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.087]: 0x0000000d 0x00002000 0x000009d0\r\n[004.087]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.088]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.088]: 0x0000000d 0x00003000 0x00001000\r\n[004.093]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.094]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.094]: 0x0000000d 0x00004000 0x00001000\r\n[004.094]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.095]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.095]: 0x0000000d 0x00005000 0x00001000\r\n[004.095]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.096]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.096]: 0x0000000d 0x00006000 0x00001000\r\n[004.096]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.097]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.097]: 0x0000000d 0x00007000 0x00001000\r\n[004.098]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.098]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.098]: 0x0000000d 0x00008000 0x00001000\r\n[004.099]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.099]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.099]: 0x0000000d 0x00009000 0x00001000\r\n[004.100]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.100]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.100]: 0x0000000d 0x0000a000 0x00001000\r\n[004.101]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.101]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.101]: 0x0000000d 0x0000b000 0x00001000\r\n[004.103]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.103]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.103]: 0x0000000d 0x0000c000 0x00001000\r\n[004.104]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.104]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.104]: 0x0000000d 0x0000d000 0x00001000\r\n[004.105]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.105]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.105]: 0x0000000d 0x0000e000 0x00001000\r\n[004.106]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.106]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.106]: 0x0000000d 0x0000f000 0x00001000\r\n[004.107]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.107]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.108]: 0x0000000d 0x00010000 0x00001000\r\n[004.108]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.108]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.109]: 0x0000000d 0x00011000 0x00001000\r\n[004.109]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.110]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.110]: 0x0000000d 0x00012000 0x00001000\r\n[004.110]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.111]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.111]: 0x0000000d 0x00013000 0x00001000\r\n[004.111]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.112]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.112]: 0x0000000d 0x00014000 0x00001000\r\n[004.113]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.113]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.113]: 0x0000000d 0x00015000 0x00001000\r\n[004.114]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.114]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.114]: 0x0000000d 0x00016000 0x00001000\r\n[004.115]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.115]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.115]: 0x0000000d 0x00017000 0x00001000\r\n[004.116]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.116]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.116]: 0x0000000d 0x00018000 0x00001000\r\n[004.117]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.117]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.117]: 0x0000000d 0x00019000 0x00001000\r\n[004.118]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.118]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.118]: 0x0000000d 0x0001a000 0x00001000\r\n[004.119]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.119]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.119]: 0x0000000d 0x0001b000 0x00001000\r\n[004.120]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.120]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.120]: 0x0000000d 0x0001c000 0x00001000\r\n[004.121]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.121]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.122]: 0x0000000d 0x0001d000 0x00001000\r\n[004.122]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.123]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.123]: 0x0000000d 0x0001e000 0x00001000\r\n[004.123]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.124]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.124]: 0x0000000d 0x0001f000 0x00001000\r\n[004.124]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.125]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.125]: 0x0000000d 0x00020000 0x00001000\r\n[004.125]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.126]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.126]: 0x0000000d 0x00021000 0x00001000\r\n[004.126]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.127]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.127]: 0x0000000d 0x00022000 0x00001000\r\n[004.127]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.128]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.128]: 0x0000000d 0x00023000 0x00001000\r\n[004.128]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.129]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.129]: 0x0000000d 0x00024000 0x00001000\r\n[004.129]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.130]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.130]: 0x0000000d 0x00025000 0x00001000\r\n[004.130]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.131]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.131]: 0x0000000d 0x00026000 0x00001000\r\n[004.131]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.132]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.132]: 0x0000000d 0x00027000 0x00001000\r\n[004.132]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.133]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.133]: 0x0000000d 0x00028000 0x00001000\r\n[004.133]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.134]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.134]: 0x0000000d 0x00029000 0x00001000\r\n[004.134]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.135]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.135]: 0x0000000d 0x0002a000 0x00001000\r\n[004.135]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.136]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.136]: 0x0000000d 0x0002b000 0x00000578\r\n[004.136]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.136]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.137]: 0x0000000d 0x0002b580 0x00001000\r\n[004.137]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.137]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.138]: 0x0000000d 0x0002c580 0x00001000\r\n[004.138]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.138]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.139]: 0x0000000d 0x0002d580 0x00001000\r\n[004.139]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.139]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.140]: 0x0000000d 0x0002e580 0x00001000\r\n[004.140]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.140]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.141]: 0x0000000d 0x0002f580 0x00001000\r\n[004.141]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.141]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.142]: 0x0000000d 0x00030580 0x00001000\r\n[004.142]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.143]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.143]: 0x0000000d 0x00031580 0x00001000\r\n[004.143]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.144]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.144]: 0x0000000d 0x00032580 0x00001000\r\n[004.144]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.145]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.145]: 0x0000000d 0x00033580 0x00001000\r\n[004.145]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.146]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.146]: 0x0000000d 0x00034580 0x00001000\r\n[004.146]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.147]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.147]: 0x0000000d 0x00035580 0x00001000\r\n[004.147]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.148]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.148]: 0x0000000d 0x00036580 0x00001000\r\n[004.148]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.149]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.149]: 0x0000000d 0x00037580 0x00001000\r\n[004.149]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.150]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.150]: 0x0000000d 0x00038580 0x00001000\r\n[004.150]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.151]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.151]: 0x0000000d 0x00039580 0x00001000\r\n[004.151]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.152]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.152]: 0x0000000d 0x0003a580 0x00001000\r\n[004.152]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.153]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.153]: 0x0000000d 0x0003b580 0x00001000\r\n[004.153]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.154]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.154]: 0x0000000d 0x0003c580 0x00001000\r\n[004.154]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.155]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.155]: 0x0000000d 0x0003d580 0x00001000\r\n[004.155]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.156]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.156]: 0x0000000d 0x0003e580 0x00001000\r\n[004.156]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.157]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.157]: 0x0000000d 0x0003f580 0x00001000\r\n[004.157]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.158]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.158]: 0x0000000d 0x00040580 0x00001000\r\n[004.158]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.159]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.159]: 0x0000000d 0x00041580 0x00001000\r\n[004.159]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.160]: RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.160]: 0x0000000d 0x00042580 0x00000800\r\n[004.160]: STATE <-- SAHARA_WAIT_COMMAND\r\n[004.163]: RECEIVED <-- SAHARA_END_IMAGE_TX_ID\r\n[004.163]: image_id = 13, status = 0\r\n[004.164]: SENDING --> SAHARA_DONE\r\n[004.164]: STATE <-- SAHARA_WAIT_DONE_RESP\r\n[004.164]: RECEIVED <-- SAHARA_DONE_RESP_ID\r\n[004.164]: image_tx_status = 1\r\n[004.164]: Successfully uploaded all images\r\n[004.164]: Sahara protocol completed\r\n[004.165]: dir=/mnt/RM500QGLAAR01A01M4G_BETA_20200428F_factory/update/firehose\r\n[004.165]: d_name=rawprogram_nand_p4K_b256K_factory.xml\r\n[005.185]: <log value=\"INFO: Binary build date: Apr 19 2020 @ 17:49:11\" />\r\n[005.185]: <log value=\"INFO: Binary build date: Apr 19 2020 @ 17:49:11.\" />\r\n[005.185]: <log value=\"INFO: Chip serial num: 0 (0x0)\" />\r\n[005.186]: <log value=\"INFO: Supported Functions (15):\" />\r\n[005.186]: <log value=\"INFO: program\" />\r\n[005.187]: <log value=\"INFO: read\" />\r\n[005.187]: <log value=\"INFO: nop\" />\r\n[005.187]: <log value=\"INFO: patch\" />\r\n[005.188]: <log value=\"INFO: configure\" />\r\n[005.188]: <log value=\"INFO: setbootablestoragedrive\" />\r\n[005.188]: <log value=\"INFO: erase\" />\r\n[005.188]: <log value=\"INFO: power\" />\r\n[005.189]: <log value=\"INFO: firmwarewrite\" />\r\n[005.189]: <log value=\"INFO: getstorageinfo\" />\r\n[005.189]: <log value=\"INFO: benchmark\" />\r\n[005.190]: <log value=\"INFO: emmc\" />\r\n[005.190]: <log value=\"INFO: ufs\" />\r\n[005.190]: <log value=\"INFO: fixgpt\" />\r\n[005.191]: <log value=\"INFO: getsha256digest\" />\r\n[005.191]: <log value=\"INFO: End of supported functions 15\" />\r\n[006.182]: inf[0] ep_in -1/1024, errno = 110 (Operation timed out), timeout=1000\r\n[006.182]: qusb_noblock_read read=0, errno: 110 (Operation timed out)\r\n[006.182]: qusb_noblock_read cur=0, min_size=1\r\n[006.182]: firehose_protocol.c fh_recv_cmd 327 fail\r\n[006.183]: <configure MemoryName=\"nand\" Verbose=\"0\" AlwaysValidate=\"0\" MaxDigestTableSizeInBytes=\"2048\" MaxPayloadSizeToTargetInBytes=\"8192\"  ZlpAwareHost=\"1\" SkipStorageInit=\"0\" />\r\n[006.184]: <log value=\"INFO: Calling handler for configure\" />\r\n[006.184]: <log value=\"INFO: Storage type set to value nand\" />\r\n[006.186]: <response value=\"ACK\" MemoryName=\"nand\" MinVersionSupported=\"1\" Version=\"1\" MaxPayloadSizeToTargetInBytes=\"8192\" MaxPayloadSizeToTargetInBytesSupported=\"8192\" MaxXMLSizeInBytes=\"4096\" DateTime=\"Apr 19 2020 - 17:49:11\" />\r\n[006.186]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"640\" physical_partition_number=\"0\" start_sector=\"0\"    />\r\n[006.187]: <log value=\"INFO: Calling handler for erase\" />\r\n[006.256]: <log value=\"INFO: [296] bbt_size:100 blocks:800.\" />\r\n[006.256]: <log value=\"INFO: [298] bbt_size:100 blocks:800.\" />\r\n[006.645]: <log value=\"INFO: Erasing start sector 0, num sectors 0\" />\r\n[006.653]: <response value=\"ACK\" rawmode=\"false\" />\r\n[006.654]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"256\" physical_partition_number=\"0\" start_sector=\"640\"    />\r\n[006.656]: <log value=\"INFO: Calling handler for erase\" />\r\n[006.657]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[006.658]: <log value=\"INFO: Erasing start sector 640, num sectors 0\" />\r\n[006.660]: <response value=\"ACK\" rawmode=\"false\" />\r\n[006.661]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"5632\" physical_partition_number=\"0\" start_sector=\"896\"    />\r\n[006.662]: <log value=\"INFO: Calling handler for erase\" />\r\n[006.663]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[006.665]: <log value=\"INFO: Erasing start sector 896, num sectors 0\" />\r\n[006.807]: <response value=\"ACK\" rawmode=\"false\" />\r\n[006.807]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"512\" physical_partition_number=\"0\" start_sector=\"8704\"    />\r\n[006.808]: <log value=\"INFO: Calling handler for erase\" />\r\n[006.810]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[006.811]: <log value=\"INFO: Erasing start sector 8704, num sectors 0\" />\r\n[006.818]: <response value=\"ACK\" rawmode=\"false\" />\r\n[006.819]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"320\" physical_partition_number=\"0\" start_sector=\"9216\"    />\r\n[006.820]: <log value=\"INFO: Calling handler for erase\" />\r\n[006.821]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[006.822]: <log value=\"INFO: Erasing start sector 9216, num sectors 0\" />\r\n[006.825]: <response value=\"ACK\" rawmode=\"false\" />\r\n[006.826]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"320\" physical_partition_number=\"0\" start_sector=\"9856\"    />\r\n[006.827]: <log value=\"INFO: Calling handler for erase\" />\r\n[006.828]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[006.829]: <log value=\"INFO: Erasing start sector 9856, num sectors 0\" />\r\n[006.832]: <response value=\"ACK\" rawmode=\"false\" />\r\n[006.833]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"320\" physical_partition_number=\"0\" start_sector=\"10176\"    />\r\n[006.834]: <log value=\"INFO: Calling handler for erase\" />\r\n[006.835]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[006.835]: <log value=\"INFO: Erasing start sector 10176, num sectors 0\" />\r\n[006.839]: <response value=\"ACK\" rawmode=\"false\" />\r\n[006.840]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"320\" physical_partition_number=\"0\" start_sector=\"10496\"    />\r\n[006.841]: <log value=\"INFO: Calling handler for erase\" />\r\n[006.842]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[006.843]: <log value=\"INFO: Erasing start sector 10496, num sectors 0\" />\r\n[006.846]: <response value=\"ACK\" rawmode=\"false\" />\r\n[006.847]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"320\" physical_partition_number=\"0\" start_sector=\"10816\"    />\r\n[006.848]: <log value=\"INFO: Calling handler for erase\" />\r\n[006.848]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[006.849]: <log value=\"INFO: Erasing start sector 10816, num sectors 0\" />\r\n[006.853]: <response value=\"ACK\" rawmode=\"false\" />\r\n[006.854]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"320\" physical_partition_number=\"0\" start_sector=\"11136\"    />\r\n[006.855]: <log value=\"INFO: Calling handler for erase\" />\r\n[006.856]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[006.856]: <log value=\"INFO: Erasing start sector 11136, num sectors 0\" />\r\n[006.860]: <response value=\"ACK\" rawmode=\"false\" />\r\n[006.861]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"320\" physical_partition_number=\"0\" start_sector=\"11456\"    />\r\n[006.862]: <log value=\"INFO: Calling handler for erase\" />\r\n[006.863]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[006.864]: <log value=\"INFO: Erasing start sector 11456, num sectors 0\" />\r\n[006.867]: <response value=\"ACK\" rawmode=\"false\" />\r\n[006.868]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"640\" physical_partition_number=\"0\" start_sector=\"11776\"    />\r\n[006.869]: <log value=\"INFO: Calling handler for erase\" />\r\n[006.870]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[006.871]: <log value=\"INFO: Erasing start sector 11776, num sectors 0\" />\r\n[006.880]: <response value=\"ACK\" rawmode=\"false\" />\r\n[006.880]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"320\" physical_partition_number=\"0\" start_sector=\"12416\"    />\r\n[006.881]: <log value=\"INFO: Calling handler for erase\" />\r\n[006.882]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[006.883]: <log value=\"INFO: Erasing start sector 12416, num sectors 0\" />\r\n[006.887]: <response value=\"ACK\" rawmode=\"false\" />\r\n[006.888]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"320\" physical_partition_number=\"0\" start_sector=\"13376\"    />\r\n[006.889]: <log value=\"INFO: Calling handler for erase\" />\r\n[006.889]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[006.890]: <log value=\"INFO: Erasing start sector 13376, num sectors 0\" />\r\n[006.894]: <response value=\"ACK\" rawmode=\"false\" />\r\n[006.894]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"3584\" physical_partition_number=\"0\" start_sector=\"13696\"    />\r\n[006.895]: <log value=\"INFO: Calling handler for erase\" />\r\n[006.896]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[006.897]: <log value=\"INFO: Erasing start sector 13696, num sectors 0\" />\r\n[006.953]: <response value=\"ACK\" rawmode=\"false\" />\r\n[006.953]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"3584\" physical_partition_number=\"0\" start_sector=\"17280\"    />\r\n[006.955]: <log value=\"INFO: Calling handler for erase\" />\r\n[006.955]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[006.956]: <log value=\"INFO: Erasing start sector 17280, num sectors 0\" />\r\n[007.014]: <response value=\"ACK\" rawmode=\"false\" />\r\n[007.014]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"28928\" physical_partition_number=\"0\" start_sector=\"27456\"    />\r\n[007.016]: <log value=\"INFO: Calling handler for erase\" />\r\n[007.016]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[007.017]: <log value=\"INFO: Erasing start sector 27456, num sectors 0\" />\r\n[007.548]: <response value=\"ACK\" rawmode=\"false\" />\r\n[007.548]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"5120\" physical_partition_number=\"0\" start_sector=\"56384\"    />\r\n[007.550]: <log value=\"INFO: Calling handler for erase\" />\r\n[007.550]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[007.551]: <log value=\"INFO: Erasing start sector 56384, num sectors 0\" />\r\n[007.628]: <response value=\"ACK\" rawmode=\"false\" />\r\n[007.628]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"32000\" physical_partition_number=\"0\" start_sector=\"61504\"    />\r\n[007.629]: <log value=\"INFO: Calling handler for erase\" />\r\n[007.630]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[007.631]: <log value=\"INFO: Erasing start sector 61504, num sectors 0\" />\r\n[008.119]: <response value=\"ACK\" rawmode=\"false\" />\r\n[008.119]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"9216\" physical_partition_number=\"0\" start_sector=\"93504\"    />\r\n[008.120]: <log value=\"INFO: Calling handler for erase\" />\r\n[008.121]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[008.122]: <log value=\"INFO: Erasing start sector 93504, num sectors 0\" />\r\n[008.228]: <response value=\"ACK\" rawmode=\"false\" />\r\n[008.229]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"28352\" physical_partition_number=\"0\" start_sector=\"102720\"    />\r\n[008.230]: <log value=\"INFO: Calling handler for erase\" />\r\n[008.230]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[008.231]: <log value=\"INFO: Erasing start sector 102720, num sectors 0\" />\r\n[008.739]: <response value=\"ACK\" rawmode=\"false\" />\r\n[008.739]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"partition_complete_p4K_b256K.mbn\" num_partition_sectors=\"4\"  physical_partition_number=\"0\" start_sector=\"640\" />\r\n[008.740]: <log value=\"INFO: Calling handler for program\" />\r\n[008.741]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[008.742]: <response value=\"ACK\" rawmode=\"true\" />\r\n[008.742]: send partition_complete_p4K_b256K.mbn, filesize=16384\r\n.\r\n[008.748]: upgrade progress 0% 16384/191864239\r\n[008.749]: send finished\r\n[008.750]: <response value=\"ACK\" rawmode=\"false\" />\r\n[008.751]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\cefs.mbn\" num_partition_sectors=\"446\"  physical_partition_number=\"0\" start_sector=\"896\" />\r\n[008.752]: <log value=\"INFO: Calling handler for program\" />\r\n[008.752]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[008.753]: <response value=\"ACK\" rawmode=\"true\" />\r\n[008.754]: send ../cefs.mbn, filesize=1826816\r\n.......................\r\n[009.198]: upgrade progress 0% 1843200/191864239\r\n[009.198]: send finished\r\n[009.200]: <response value=\"ACK\" rawmode=\"false\" />\r\n[009.200]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\tz.mbn\" num_partition_sectors=\"223\"  physical_partition_number=\"0\" start_sector=\"8704\" />\r\n[009.201]: <log value=\"INFO: Calling handler for program\" />\r\n[009.202]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[009.203]: <response value=\"ACK\" rawmode=\"true\" />\r\n[009.203]: send ../tz.mbn, filesize=913408\r\n............\r\n[009.430]: upgrade progress 1% 2756608/191864239\r\n[009.430]: send finished\r\n[009.431]: <response value=\"ACK\" rawmode=\"false\" />\r\n[009.431]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\devcfg.mbn\" num_partition_sectors=\"11\"  physical_partition_number=\"0\" start_sector=\"9216\" />\r\n[009.432]: <log value=\"INFO: Calling handler for program\" />\r\n[009.433]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[009.434]: <response value=\"ACK\" rawmode=\"true\" />\r\n[009.434]: send ../devcfg.mbn, filesize=42379\r\n.\r\n[009.455]: upgrade progress 1% 2798987/191864239\r\n[009.456]: send finished\r\n[009.456]: <response value=\"ACK\" rawmode=\"false\" />\r\n[009.457]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\apdp.mbn\" num_partition_sectors=\"4\"  physical_partition_number=\"0\" start_sector=\"9856\" />\r\n[009.458]: <log value=\"INFO: Calling handler for program\" />\r\n[009.459]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[009.459]: <response value=\"ACK\" rawmode=\"true\" />\r\n[009.460]: send ../apdp.mbn, filesize=13508\r\n.\r\n[009.466]: upgrade progress 1% 2812495/191864239\r\n[009.466]: send finished\r\n[009.468]: <response value=\"ACK\" rawmode=\"false\" />\r\n[009.468]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\xbl_cfg.elf\" num_partition_sectors=\"17\"  physical_partition_number=\"0\" start_sector=\"10176\" />\r\n[009.469]: <log value=\"INFO: Calling handler for program\" />\r\n[009.470]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[009.471]: <response value=\"ACK\" rawmode=\"true\" />\r\n[009.471]: send ../xbl_cfg.elf, filesize=65724\r\n.\r\n[009.498]: upgrade progress 1% 2878219/191864239\r\n[009.498]: send finished\r\n[009.499]: <response value=\"ACK\" rawmode=\"false\" />\r\n[009.500]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\multi_image.mbn\" num_partition_sectors=\"4\"  physical_partition_number=\"0\" start_sector=\"10496\" />\r\n[009.501]: <log value=\"INFO: Calling handler for program\" />\r\n[009.501]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[009.502]: <response value=\"ACK\" rawmode=\"true\" />\r\n[009.503]: send ../multi_image.mbn, filesize=13008\r\n.\r\n[009.515]: upgrade progress 1% 2891227/191864239\r\n[009.516]: send finished\r\n[009.517]: <response value=\"ACK\" rawmode=\"false\" />\r\n[009.518]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\hyp.mbn\" num_partition_sectors=\"21\"  physical_partition_number=\"0\" start_sector=\"11136\" />\r\n[009.519]: <log value=\"INFO: Calling handler for program\" />\r\n[009.520]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[009.520]: <response value=\"ACK\" rawmode=\"true\" />\r\n[009.521]: send ../hyp.mbn, filesize=84416\r\n..\r\n[009.547]: upgrade progress 1% 2975643/191864239\r\n[009.547]: send finished\r\n[009.548]: <response value=\"ACK\" rawmode=\"false\" />\r\n[009.549]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\abl.elf\" num_partition_sectors=\"43\"  physical_partition_number=\"0\" start_sector=\"11456\" />\r\n[009.550]: <log value=\"INFO: Calling handler for program\" />\r\n[009.551]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[009.551]: <response value=\"ACK\" rawmode=\"true\" />\r\n[009.552]: send ../abl.elf, filesize=176128\r\n...\r\n[009.599]: upgrade progress 1% 3151771/191864239\r\n[009.599]: send finished\r\n[009.600]: <response value=\"ACK\" rawmode=\"false\" />\r\n[009.601]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\uefi.elf\" num_partition_sectors=\"291\"  physical_partition_number=\"0\" start_sector=\"11776\" />\r\n[009.602]: <log value=\"INFO: Calling handler for program\" />\r\n[009.603]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[009.603]: <response value=\"ACK\" rawmode=\"true\" />\r\n[009.604]: send ../uefi.elf, filesize=1191936\r\n...............\r\n[009.897]: upgrade progress 2% 4343707/191864239\r\n[009.897]: send finished\r\n[009.898]: <response value=\"ACK\" rawmode=\"false\" />\r\n[009.898]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\tools.fv\" num_partition_sectors=\"96\"  physical_partition_number=\"0\" start_sector=\"12416\" />\r\n[009.899]: <log value=\"INFO: Calling handler for program\" />\r\n[009.900]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[009.901]: <response value=\"ACK\" rawmode=\"true\" />\r\n[009.901]: send ../tools.fv, filesize=393216\r\n.....\r\n[009.995]: upgrade progress 2% 4736923/191864239\r\n[009.995]: send finished\r\n[009.997]: <response value=\"ACK\" rawmode=\"false\" />\r\n[009.997]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\sdxprairie-boot.img\" num_partition_sectors=\"2530\"  physical_partition_number=\"0\" start_sector=\"13696\" />\r\n[009.998]: <log value=\"INFO: Calling handler for program\" />\r\n[009.999]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[010.000]: <response value=\"ACK\" rawmode=\"true\" />\r\n[010.000]: send ../sdxprairie-boot.img, filesize=10360832\r\n...............................................................................................................................\r\n[012.503]: upgrade progress 7% 15097755/191864239\r\n[012.504]: send finished\r\n[012.505]: <response value=\"ACK\" rawmode=\"false\" />\r\n[012.506]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\sdxprairie-boot.img\" num_partition_sectors=\"2530\"  physical_partition_number=\"0\" start_sector=\"17280\" />\r\n[012.507]: <log value=\"INFO: Calling handler for program\" />\r\n[012.508]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[012.508]: <response value=\"ACK\" rawmode=\"true\" />\r\n[012.509]: send ../sdxprairie-boot.img, filesize=10360832\r\n...............................................................................................................................\r\n[014.934]: upgrade progress 13% 25458587/191864239\r\n[014.935]: send finished\r\n[014.936]: <response value=\"ACK\" rawmode=\"false\" />\r\n[014.937]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\NON-HLOS.ubi\" num_partition_sectors=\"18624\"  physical_partition_number=\"0\" start_sector=\"27456\" />\r\n[014.938]: <log value=\"INFO: Calling handler for program\" />\r\n[014.939]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[014.939]: <response value=\"ACK\" rawmode=\"true\" />\r\n[014.940]: send ../NON-HLOS.ubi, filesize=76283904\r\n....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................\r\n[034.852]: upgrade progress 53% 101742491/191864239\r\n[034.852]: send finished\r\n[034.854]: <response value=\"ACK\" rawmode=\"false\" />\r\n[034.855]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\sdxprairie-recoveryfs.ubi\" num_partition_sectors=\"3520\"  physical_partition_number=\"0\" start_sector=\"56384\" />\r\n[034.856]: <log value=\"INFO: Calling handler for program\" />\r\n[034.857]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[034.857]: <response value=\"ACK\" rawmode=\"true\" />\r\n[034.858]: send ../sdxprairie-recoveryfs.ubi, filesize=14417920\r\n................................................................................................................................................................................\r\n[038.365]: upgrade progress 60% 116160411/191864239\r\n[038.365]: send finished\r\n[038.367]: <response value=\"ACK\" rawmode=\"false\" />\r\n[038.367]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\usrdata.ubi\" num_partition_sectors=\"960\"  physical_partition_number=\"0\" start_sector=\"61504\" />\r\n[038.368]: <log value=\"INFO: Calling handler for program\" />\r\n[038.369]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[038.370]: <response value=\"ACK\" rawmode=\"true\" />\r\n[038.370]: send ../usrdata.ubi, filesize=3932160\r\n................................................\r\n[039.286]: upgrade progress 62% 120092571/191864239\r\n[039.287]: send finished\r\n[039.288]: <response value=\"ACK\" rawmode=\"false\" />\r\n[039.289]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\oemdata.ubi\" num_partition_sectors=\"960\"  physical_partition_number=\"0\" start_sector=\"93504\" />\r\n[039.290]: <log value=\"INFO: Calling handler for program\" />\r\n[039.291]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[039.291]: <response value=\"ACK\" rawmode=\"true\" />\r\n[039.292]: send ../oemdata.ubi, filesize=3932160\r\n................................................\r\n[040.219]: upgrade progress 64% 124024731/191864239\r\n[040.220]: send finished\r\n[040.221]: <response value=\"ACK\" rawmode=\"false\" />\r\n[040.222]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\sdxprairie-sysfs.ubi\" num_partition_sectors=\"16384\"  physical_partition_number=\"0\" start_sector=\"102720\" />\r\n[040.223]: <log value=\"INFO: Calling handler for program\" />\r\n[040.224]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[040.224]: <response value=\"ACK\" rawmode=\"true\" />\r\n[040.225]: send ../sdxprairie-sysfs.ubi, filesize=67108864\r\n....................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................................\r\n[057.600]: upgrade progress 99% 191133595/191864239\r\n[057.600]: send finished\r\n[057.602]: <response value=\"ACK\" rawmode=\"false\" />\r\n[057.602]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\aop.mbn\" num_partition_sectors=\"38\"  physical_partition_number=\"0\" start_sector=\"10816\" />\r\n[057.603]: <log value=\"INFO: Calling handler for program\" />\r\n[057.604]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[057.605]: <response value=\"ACK\" rawmode=\"true\" />\r\n[057.605]: send ../aop.mbn, filesize=154240\r\n..\r\n[057.647]: upgrade progress 100% 191864239/191864239\r\n[057.647]: send finished\r\n[057.648]: <response value=\"ACK\" rawmode=\"false\" />\r\n[057.649]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\sbl1.mbn\" num_partition_sectors=\"141\"  physical_partition_number=\"0\" start_sector=\"0\" />\r\n[057.650]: <log value=\"INFO: Calling handler for program\" />\r\n[057.651]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[057.651]: <response value=\"ACK\" rawmode=\"true\" />\r\n[057.652]: send ../sbl1.mbn, filesize=576404\r\n........\r\n[057.789]: upgrade progress 100% 192440643/191864239\r\n[057.789]: send finished\r\n[057.790]: <response value=\"ACK\" rawmode=\"false\" />\r\n[057.790]: <power value=\"reset\" />\r\n[057.791]: <log value=\"INFO: Calling handler for power\" />\r\n[057.791]: <response value=\"ACK\" rawmode=\"false\" />\r\n[057.792]: <log value=\"INFO: Will issue reset/power off 100 useconds, if this hangs check if watchdog is enabled\" />\r\n[057.792]: <log value=\"INFO: bsp_target_reset() 1\" />\r\n[057.800]: inf[0] ep_in -1/1024, errno = 71 (Protocol error)\r\n[057.800]: qusb_noblock_read read=-1, errno: 71 (Protocol error)\r\n[057.800]: qusb_noblock_read cur=0, min_size=1\r\n[057.800]: firehose_protocol.c fh_recv_cmd 327 fail\r\n[057.800]: THE TOTAL DOWNLOAD TIME IS 53.750 s\r\n[057.801]: Upgrade module successfully.\r\nroot@OpenWrt:~# "
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/log/MCU_remote.log.txt",
    "content": "root@OpenWrt:~# ./QFirehose -p 9008\r\n[000.000]: QFirehose Version: Quectel_LTE&5G_QFirehose_Linux&Android_V1.3.2\r\n[000.000]: Builded: May 18 2020 11:32:04\r\n[000.004]: [1] /sys/bus/usb/devices/2-1.4 2c7c/800/414\r\n[000.012]: P: /dev/bus/usb/002/005 idVendor=2c7c idProduct=0800\r\n[000.012]: C: /dev/bus/usb/002/005 bNumInterfaces: 5\r\n[000.014]: I: If#= 0 Alt= 0 #EPs= 2 Cls=ff Sub=ff Prot=30\r\n[000.015]: E: Ad=81 Atr=02 MxPS= 1024 Ivl=0ms\r\n[000.015]: E: Ad=01 Atr=02 MxPS= 1024 Ivl=0ms\r\n[000.016]: I: If#= 1 Alt= 0 #EPs= 3 Cls=ff Sub=00 Prot=00\r\n[000.017]: I: If#= 2 Alt= 0 #EPs= 3 Cls=ff Sub=00 Prot=00\r\n[000.018]: I: If#= 3 Alt= 0 #EPs= 3 Cls=ff Sub=00 Prot=00\r\n[000.019]: I: If#= 4 Alt= 0 #EPs= 3 Cls=ff Sub=ff Prot=ff\r\n[000.021]: qusb_noblock_open port_name = /dev/ttyUSB0\r\n[000.024]: old software version: RM500QGLAAR01A01M4G_BETA_20200428F\r\n[001.025]: poll_wait events=POLLIN msec=1000 timeout\r\n[001.026]: qusb_noblock_read cur=0, min_size=1\r\n[001.026]: switch to 'Emergency download mode'\r\n[001.031]: successful, wait module reboot\r\n[002.034]: fail to fopen /sys/bus/usb/devices/2-1.4/uevent, errno: 2 (No such file or directory)\r\n[003.038]: fail to fopen /sys/bus/usb/devices/2-1.4/uevent, errno: 2 (No such file or directory)\r\n[004.041]: [1] /sys/bus/usb/devices/1-1.4 5c6/9008/0\r\n[004.046]: P: /dev/bus/usb/001/010 idVendor=05c6 idProduct=9008\r\n[004.046]: C: /dev/bus/usb/001/010 bNumInterfaces: 1\r\n[004.047]: I: If#= 0 Alt= 0 #EPs= 2 Cls=ff Sub=ff Prot=11\r\n[004.048]: E: Ad=81 Atr=02 MxPS= 512 Ivl=0ms\r\n[004.049]: E: Ad=01 Atr=02 MxPS= 512 Ivl=0ms\r\n[004.052]: create_tcp_server tcp_port=9008\r\n[004.053]: server_fd=4\r\n[004.055]: wait_client_connect\r\n[023.889]: clientfd = 5 192.168.1.153:58069 connect\r\n[023.889]: usb_fd = 6\r\n[083.310]: inf[0] ep_in -1/4096, errno = 71 (Protocol error)\r\n[083.310]: qusb_noblock_read read=-1, errno: 71 (Protocol error)\r\n[083.310]: qusb_noblock_read cur=0, min_size=1\r\n[083.310]: usb2tcp_main poll usb_fd = 6, revents = 0011\r\nroot@OpenWrt:~# \r\n\r\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/log/Ubuntu_remote.log.txt",
    "content": "carl@carl-Lenovo-ideapad-110-15ISK:~/Qfirehose_linux$ ./qfirehose -f ../EM20GRAR01A04V01M4G_factory -p 172.18.112.13:9008\r\n[000.000] QFirehose Version: LTE_QFirehose_Linux&Android_V1.1.8\r\n[000.000] Builded: Jul  5 2019 12:04:58\r\n[000.000] Find md5 check file <../EM20GRAR01A04V01M4G_factory/md5.txt>\r\n[000.000] Totals checking 0 files md5 value, 0 file fail!\r\n[000.001] qtcp_connect port_name = 172.18.112.13:9008\r\n[000.006] idVendor=2c7c, idProduct=0620, interfaceNum=6\r\n[001.008] poll_wait events=POLLIN msec=1000 timeout\r\n[001.008] qusb_noblock_read cur=0, min_size=1\r\n[001.008] switch to 'Emergency download mode'\r\n[001.011] successful, wait module reboot\r\n[002.011] qtcp_connect port_name = 172.18.112.13:9008\r\n[002.014] idVendor=05c6, idProduct=9008, interfaceNum=1\r\n[002.014] dir=../EM20GRAR01A04V01M4G_factory/update/firehose\r\n[002.014] dir=../EM20GRAR01A04V01M4G_factory/update/firehose\r\n[002.014] d_name=prog_firehose_sdx24.mbn\r\n[002.014] prog_nand_firehose_filename = prog_firehose_sdx24.mbn\r\n[002.015] STATE <-- SAHARA_WAIT_HELLO\r\n[002.015] RECEIVED <--  SAHARA_HELLO_ID\r\n[002.015] RECEIVED <-- SAHARA_MODE_IMAGE_TX_PENDING\r\n[002.015] SENDING --> SAHARA_HELLO_RESPONSE\r\n[002.015] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.052] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.052] 0x0000000d 0x00000000 0x00000034\r\n[002.052] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.121] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.121] 0x0000000d 0x00000034 0x00000080\r\n[002.121] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.193] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.193] 0x0000000d 0x00001000 0x00001000\r\n[002.193] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.232] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.232] 0x0000000d 0x00002000 0x000009d0\r\n[002.233] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.272] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.272] 0x0000000d 0x00003000 0x00001000\r\n[002.273] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.312] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.312] 0x0000000d 0x00004000 0x00001000\r\n[002.313] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.353] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.353] 0x0000000d 0x00005000 0x00001000\r\n[002.353] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.392] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.392] 0x0000000d 0x00006000 0x00001000\r\n[002.392] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.432] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.432] 0x0000000d 0x00007000 0x00001000\r\n[002.433] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.473] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.473] 0x0000000d 0x00008000 0x00001000\r\n[002.473] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.513] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.513] 0x0000000d 0x00009000 0x00001000\r\n[002.513] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.552] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.552] 0x0000000d 0x0000a000 0x00001000\r\n[002.553] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.592] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.592] 0x0000000d 0x0000b000 0x00001000\r\n[002.593] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.633] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.633] 0x0000000d 0x0000c000 0x00001000\r\n[002.633] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.673] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.673] 0x0000000d 0x0000d000 0x00001000\r\n[002.673] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.712] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.713] 0x0000000d 0x0000e000 0x00001000\r\n[002.713] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.756] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.757] 0x0000000d 0x0000f000 0x00001000\r\n[002.757] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.796] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.796] 0x0000000d 0x00010000 0x00001000\r\n[002.796] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.837] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.837] 0x0000000d 0x00011000 0x00001000\r\n[002.837] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.876] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.876] 0x0000000d 0x00012000 0x00001000\r\n[002.877] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.916] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.917] 0x0000000d 0x00013000 0x00001000\r\n[002.917] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.957] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.957] 0x0000000d 0x00014000 0x00001000\r\n[002.957] STATE <-- SAHARA_WAIT_COMMAND\r\n[002.997] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[002.997] 0x0000000d 0x00015000 0x00001000\r\n[002.997] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.036] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.036] 0x0000000d 0x00016000 0x00001000\r\n[003.037] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.076] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.076] 0x0000000d 0x00017000 0x00001000\r\n[003.076] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.117] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.117] 0x0000000d 0x00018000 0x00001000\r\n[003.117] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.157] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.157] 0x0000000d 0x00019000 0x00001000\r\n[003.157] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.196] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.197] 0x0000000d 0x0001a000 0x00001000\r\n[003.197] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.236] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.236] 0x0000000d 0x0001b000 0x00001000\r\n[003.237] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.276] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.276] 0x0000000d 0x0001c000 0x00001000\r\n[003.277] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.317] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.317] 0x0000000d 0x0001d000 0x00001000\r\n[003.317] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.356] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.356] 0x0000000d 0x0001e000 0x00001000\r\n[003.357] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.396] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.396] 0x0000000d 0x0001f000 0x00001000\r\n[003.397] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.437] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.437] 0x0000000d 0x00020000 0x00001000\r\n[003.437] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.476] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.477] 0x0000000d 0x00021000 0x00001000\r\n[003.477] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.516] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.517] 0x0000000d 0x00022000 0x00001000\r\n[003.517] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.556] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.556] 0x0000000d 0x00023000 0x00001000\r\n[003.557] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.597] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.597] 0x0000000d 0x00024000 0x00001000\r\n[003.597] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.637] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.637] 0x0000000d 0x00025000 0x00001000\r\n[003.637] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.676] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.676] 0x0000000d 0x00026000 0x00001000\r\n[003.677] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.716] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.716] 0x0000000d 0x00027000 0x00001000\r\n[003.717] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.757] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.757] 0x0000000d 0x00028000 0x00001000\r\n[003.757] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.797] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.797] 0x0000000d 0x00029000 0x00001000\r\n[003.797] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.836] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.837] 0x0000000d 0x0002a000 0x000005a8\r\n[003.837] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.876] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.876] 0x0000000d 0x0002a600 0x00001000\r\n[003.877] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.917] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.917] 0x0000000d 0x0002b600 0x00001000\r\n[003.917] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.957] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.957] 0x0000000d 0x0002c600 0x00001000\r\n[003.957] STATE <-- SAHARA_WAIT_COMMAND\r\n[003.996] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[003.997] 0x0000000d 0x0002d600 0x00001000\r\n[003.997] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.036] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.036] 0x0000000d 0x0002e600 0x00001000\r\n[004.036] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.076] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.077] 0x0000000d 0x0002f600 0x00001000\r\n[004.077] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.116] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.117] 0x0000000d 0x00030600 0x00001000\r\n[004.117] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.156] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.156] 0x0000000d 0x00031600 0x00001000\r\n[004.157] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.196] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.196] 0x0000000d 0x00032600 0x00001000\r\n[004.197] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.237] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.237] 0x0000000d 0x00033600 0x00001000\r\n[004.237] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.277] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.277] 0x0000000d 0x00034600 0x00001000\r\n[004.277] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.316] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.316] 0x0000000d 0x00035600 0x00001000\r\n[004.317] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.356] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.357] 0x0000000d 0x00036600 0x00001000\r\n[004.357] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.397] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.397] 0x0000000d 0x00037600 0x00001000\r\n[004.397] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.437] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.437] 0x0000000d 0x00038600 0x00001000\r\n[004.437] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.476] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.477] 0x0000000d 0x00039600 0x00001000\r\n[004.477] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.516] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.516] 0x0000000d 0x0003a600 0x00001000\r\n[004.516] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.557] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.557] 0x0000000d 0x0003b600 0x00001000\r\n[004.557] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.597] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.597] 0x0000000d 0x0003c600 0x00001000\r\n[004.597] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.636] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.637] 0x0000000d 0x0003d600 0x00001000\r\n[004.637] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.676] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.676] 0x0000000d 0x0003e600 0x00001000\r\n[004.677] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.717] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.717] 0x0000000d 0x0003f600 0x00001000\r\n[004.717] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.756] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.757] 0x0000000d 0x00040600 0x00001000\r\n[004.757] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.796] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.797] 0x0000000d 0x00041600 0x00001000\r\n[004.797] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.836] RECEIVED <-- SAHARA_READ_DATA_ID\r\n[004.836] 0x0000000d 0x00042600 0x00001000\r\n[004.837] STATE <-- SAHARA_WAIT_COMMAND\r\n[004.880] RECEIVED <-- SAHARA_END_IMAGE_TX_ID\r\n[004.880] image_id = 13, status = 0\r\n[004.880] SENDING --> SAHARA_DONE\r\n[004.881] STATE <-- SAHARA_WAIT_DONE_RESP\r\n[004.953] RECEIVED <-- SAHARA_DONE_RESP_ID\r\n[004.953] image_tx_status = 1\r\n[004.953] Successfully uploaded all images\r\n[004.953] Sahara protocol completed\r\n[004.953] dir=../EM20GRAR01A04V01M4G_factory/update/firehose\r\n[004.953] d_name=rawprogram_nand_p4K_b256K_factory.xml\r\n[005.934] <log value=\"INFO: Binary build date: Apr 15 2019 @ 00:24:50\" />\r\n[005.935] <log value=\"INFO: Binary build date: Apr 15 2019 @ 00:24:50.\" />\r\n[005.935] <log value=\"INFO: Chip serial num: 0 (0x0)\" />\r\n[005.935] <log value=\"INFO: Supported Functions (15):\" />\r\n[005.936] <log value=\"INFO: program\" />\r\n[005.936] <log value=\"INFO: read\" />\r\n[005.936] <log value=\"INFO: nop\" />\r\n[005.936] <log value=\"INFO: patch\" />\r\n[005.936] <log value=\"INFO: configure\" />\r\n[005.936] <log value=\"INFO: setbootablestoragedrive\" />\r\n[005.937] <log value=\"INFO: erase\" />\r\n[005.937] <log value=\"INFO: power\" />\r\n[005.937] <log value=\"INFO: firmwarewrite\" />\r\n[005.937] <log value=\"INFO: getstorageinfo\" />\r\n[005.938] <log value=\"INFO: benchmark\" />\r\n[005.938] <log value=\"INFO: emmc\" />\r\n[005.938] <log value=\"INFO: ufs\" />\r\n[005.938] <log value=\"INFO: fixgpt\" />\r\n[005.938] <log value=\"INFO: getsha256digest\" />\r\n[005.939] <log value=\"INFO: End of supported functions 15\" />\r\n[006.940] poll_wait events=POLLIN msec=1000 timeout\r\n[006.940] qusb_noblock_read cur=0, min_size=1\r\n[006.940] firehose_protocol.c fh_recv_cmd 294 fail\r\n[006.940] <configure MemoryName=\"nand\" Verbose=\"0\" AlwaysValidate=\"0\" MaxDigestTableSizeInBytes=\"2048\" MaxPayloadSizeToTargetInBytes=\"8192\"  ZlpAwareHost=\"1\" SkipStorageInit=\"0\" />\r\n[006.974] <log value=\"INFO: Calling handler for configure\" />\r\n[006.975] <log value=\"INFO: Storage type set to value nand\" />\r\n[006.976] <response value=\"ACK\" MemoryName=\"nand\" MinVersionSupported=\"1\" Version=\"1\" MaxPayloadSizeToTargetInBytes=\"8192\" MaxPayloadSizeToTargetInBytesSupported=\"8192\" MaxXMLSizeInBytes=\"4096\" DateTime=\"Apr 15 2019 - 00:24:50\" />\r\n[006.976] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"640\" physical_partition_number=\"0\" start_sector=\"0\"    />\r\n[007.053] <log value=\"INFO: Calling handler for erase\" />\r\n[007.159] <log value=\"INFO: [295] bbt_size:100 blocks:800.\" />\r\n[007.159] <log value=\"INFO: [297] bbt_size:100 blocks:800.\" />\r\n[007.521] <log value=\"INFO: Erasing start sector 0, num sectors 0\" />\r\n[007.530] <response value=\"ACK\" rawmode=\"false\" />\r\n[007.530] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"640\" physical_partition_number=\"0\" start_sector=\"640\"    />\r\n[007.601] <log value=\"INFO: Calling handler for erase\" />\r\n[007.601] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[007.601] <log value=\"INFO: Erasing start sector 640, num sectors 0\" />\r\n[007.601] <response value=\"ACK\" rawmode=\"false\" />\r\n[007.601] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"5632\" physical_partition_number=\"0\" start_sector=\"1280\"    />\r\n[007.673] <log value=\"INFO: Calling handler for erase\" />\r\n[007.673] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[007.673] <log value=\"INFO: Erasing start sector 1280, num sectors 0\" />\r\n[007.722] <response value=\"ACK\" rawmode=\"false\" />\r\n[007.722] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"448\" physical_partition_number=\"0\" start_sector=\"9600\"    />\r\n[007.793] <log value=\"INFO: Calling handler for erase\" />\r\n[007.793] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[007.793] <log value=\"INFO: Erasing start sector 9600, num sectors 0\" />\r\n[007.793] <response value=\"ACK\" rawmode=\"false\" />\r\n[007.793] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"256\" physical_partition_number=\"0\" start_sector=\"10048\"    />\r\n[007.873] <log value=\"INFO: Calling handler for erase\" />\r\n[007.873] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[007.873] <log value=\"INFO: Erasing start sector 10048, num sectors 0\" />\r\n[007.873] <response value=\"ACK\" rawmode=\"false\" />\r\n[007.873] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"256\" physical_partition_number=\"0\" start_sector=\"10944\"    />\r\n[007.953] <log value=\"INFO: Calling handler for erase\" />\r\n[007.953] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[007.953] <log value=\"INFO: Erasing start sector 10944, num sectors 0\" />\r\n[007.953] <response value=\"ACK\" rawmode=\"false\" />\r\n[007.953] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"256\" physical_partition_number=\"0\" start_sector=\"11200\"    />\r\n[008.033] <log value=\"INFO: Calling handler for erase\" />\r\n[008.033] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[008.033] <log value=\"INFO: Erasing start sector 11200, num sectors 0\" />\r\n[008.033] <response value=\"ACK\" rawmode=\"false\" />\r\n[008.033] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"256\" physical_partition_number=\"0\" start_sector=\"11456\"    />\r\n[008.113] <log value=\"INFO: Calling handler for erase\" />\r\n[008.113] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[008.113] <log value=\"INFO: Erasing start sector 11456, num sectors 0\" />\r\n[008.113] <response value=\"ACK\" rawmode=\"false\" />\r\n[008.113] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"256\" physical_partition_number=\"0\" start_sector=\"11712\"    />\r\n[008.193] <log value=\"INFO: Calling handler for erase\" />\r\n[008.193] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[008.193] <log value=\"INFO: Erasing start sector 11712, num sectors 0\" />\r\n[008.193] <response value=\"ACK\" rawmode=\"false\" />\r\n[008.193] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"256\" physical_partition_number=\"0\" start_sector=\"11968\"    />\r\n[008.273] <log value=\"INFO: Calling handler for erase\" />\r\n[008.273] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[008.273] <log value=\"INFO: Erasing start sector 11968, num sectors 0\" />\r\n[008.273] <response value=\"ACK\" rawmode=\"false\" />\r\n[008.273] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"640\" physical_partition_number=\"0\" start_sector=\"12224\"    />\r\n[008.353] <log value=\"INFO: Calling handler for erase\" />\r\n[008.353] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[008.353] <log value=\"INFO: Erasing start sector 12224, num sectors 0\" />\r\n[008.353] <response value=\"ACK\" rawmode=\"false\" />\r\n[008.353] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"384\" physical_partition_number=\"0\" start_sector=\"12864\"    />\r\n[008.433] <log value=\"INFO: Calling handler for erase\" />\r\n[008.433] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[008.433] <log value=\"INFO: Erasing start sector 12864, num sectors 0\" />\r\n[008.433] <response value=\"ACK\" rawmode=\"false\" />\r\n[008.433] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"256\" physical_partition_number=\"0\" start_sector=\"14016\"    />\r\n[008.513] <log value=\"INFO: Calling handler for erase\" />\r\n[008.513] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[008.513] <log value=\"INFO: Erasing start sector 14016, num sectors 0\" />\r\n[008.513] <response value=\"ACK\" rawmode=\"false\" />\r\n[008.513] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"3072\" physical_partition_number=\"0\" start_sector=\"14272\"    />\r\n[008.593] <log value=\"INFO: Calling handler for erase\" />\r\n[008.593] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[008.593] <log value=\"INFO: Erasing start sector 14272, num sectors 0\" />\r\n[008.616] <response value=\"ACK\" rawmode=\"false\" />\r\n[008.616] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"3072\" physical_partition_number=\"0\" start_sector=\"17344\"    />\r\n[008.693] <log value=\"INFO: Calling handler for erase\" />\r\n[008.693] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[008.693] <log value=\"INFO: Erasing start sector 17344, num sectors 0\" />\r\n[008.717] <response value=\"ACK\" rawmode=\"false\" />\r\n[008.717] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"23808\" physical_partition_number=\"0\" start_sector=\"27136\"    />\r\n[008.793] <log value=\"INFO: Calling handler for erase\" />\r\n[008.793] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[008.793] <log value=\"INFO: Erasing start sector 27136, num sectors 0\" />\r\n[009.236] <response value=\"ACK\" rawmode=\"false\" />\r\n[009.236] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"7872\" physical_partition_number=\"0\" start_sector=\"50944\"    />\r\n[009.313] <log value=\"INFO: Calling handler for erase\" />\r\n[009.313] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[009.313] <log value=\"INFO: Erasing start sector 50944, num sectors 0\" />\r\n[009.416] <response value=\"ACK\" rawmode=\"false\" />\r\n[009.416] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"43520\" physical_partition_number=\"0\" start_sector=\"58816\"    />\r\n[009.493] <log value=\"INFO: Calling handler for erase\" />\r\n[009.493] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[009.493] <log value=\"INFO: Erasing start sector 58816, num sectors 0\" />\r\n[010.094] <response value=\"ACK\" rawmode=\"false\" />\r\n[010.094] <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"28736\" physical_partition_number=\"0\" start_sector=\"102336\"    />\r\n[010.173] <log value=\"INFO: Calling handler for erase\" />\r\n[010.173] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[010.173] <log value=\"INFO: Erasing start sector 102336, num sectors 0\" />\r\n[010.715] <response value=\"ACK\" rawmode=\"false\" />\r\n[010.715] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"partition_complete_p4K_b256K.mbn\" num_partition_sectors=\"4\"  physical_partition_number=\"0\" start_sector=\"640\" />\r\n[010.793] <log value=\"INFO: Calling handler for program\" />\r\n[010.793] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[010.793] <response value=\"ACK\" rawmode=\"true\" />\r\n[010.793] send partition_complete_p4K_b256K.mbn, filesize=16384\r\n[010.793] Upgrade progress:   0\r\n[010.793] send finished\r\n[010.840] <response value=\"ACK\" rawmode=\"false\" />\r\n[010.840] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\cefs.mbn\" num_partition_sectors=\"355\"  physical_partition_number=\"0\" start_sector=\"1280\" />\r\n[010.913] <log value=\"INFO: Calling handler for program\" />\r\n[010.913] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[010.913] <response value=\"ACK\" rawmode=\"true\" />\r\n[010.913] send ../cefs.mbn, filesize=1454080\r\n[011.487] send finished\r\n[011.573] <response value=\"ACK\" rawmode=\"false\" />\r\n[011.573] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\tz.mbn\" num_partition_sectors=\"228\"  physical_partition_number=\"0\" start_sector=\"9600\" />\r\n[011.653] <log value=\"INFO: Calling handler for program\" />\r\n[011.653] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[011.653] <response value=\"ACK\" rawmode=\"true\" />\r\n[011.653] send ../tz.mbn, filesize=933888\r\n[011.697] Upgrade progress:   1\r\n[012.004] send finished\r\n[012.093] <response value=\"ACK\" rawmode=\"false\" />\r\n[012.093] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\devcfg.mbn\" num_partition_sectors=\"10\"  physical_partition_number=\"0\" start_sector=\"10048\" />\r\n[012.173] <log value=\"INFO: Calling handler for program\" />\r\n[012.173] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[012.173] <response value=\"ACK\" rawmode=\"true\" />\r\n[012.173] send ../devcfg.mbn, filesize=40222\r\n[012.173] send finished\r\n[012.233] <response value=\"ACK\" rawmode=\"false\" />\r\n[012.233] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\xbl_cfg.elf\" num_partition_sectors=\"14\"  physical_partition_number=\"0\" start_sector=\"10944\" />\r\n[012.313] <log value=\"INFO: Calling handler for program\" />\r\n[012.313] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[012.313] <response value=\"ACK\" rawmode=\"true\" />\r\n[012.313] send ../xbl_cfg.elf, filesize=53348\r\n[012.315] send finished\r\n[012.377] <response value=\"ACK\" rawmode=\"false\" />\r\n[012.377] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\multi_image.mbn\" num_partition_sectors=\"4\"  physical_partition_number=\"0\" start_sector=\"11200\" />\r\n[012.453] <log value=\"INFO: Calling handler for program\" />\r\n[012.453] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[012.453] <response value=\"ACK\" rawmode=\"true\" />\r\n[012.453] send ../multi_image.mbn, filesize=13064\r\n[012.453] send finished\r\n[012.500] <response value=\"ACK\" rawmode=\"false\" />\r\n[012.501] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\aop.mbn\" num_partition_sectors=\"35\"  physical_partition_number=\"0\" start_sector=\"11456\" />\r\n[012.573] <log value=\"INFO: Calling handler for program\" />\r\n[012.573] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[012.573] <response value=\"ACK\" rawmode=\"true\" />\r\n[012.573] send ../aop.mbn, filesize=142624\r\n[012.593] send finished\r\n[012.676] <response value=\"ACK\" rawmode=\"false\" />\r\n[012.676] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\hyp.mbn\" num_partition_sectors=\"20\"  physical_partition_number=\"0\" start_sector=\"11712\" />\r\n[012.753] <log value=\"INFO: Calling handler for program\" />\r\n[012.753] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[012.753] <response value=\"ACK\" rawmode=\"true\" />\r\n[012.753] send ../hyp.mbn, filesize=80192\r\n[012.759] send finished\r\n[012.829] <response value=\"ACK\" rawmode=\"false\" />\r\n[012.829] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\abl.elf\" num_partition_sectors=\"37\"  physical_partition_number=\"0\" start_sector=\"11968\" />\r\n[012.901] <log value=\"INFO: Calling handler for program\" />\r\n[012.901] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[012.901] <response value=\"ACK\" rawmode=\"true\" />\r\n[012.901] send ../abl.elf, filesize=151552\r\n[012.921] send finished\r\n[013.005] <response value=\"ACK\" rawmode=\"false\" />\r\n[013.005] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\uefi.elf\" num_partition_sectors=\"323\"  physical_partition_number=\"0\" start_sector=\"12224\" />\r\n[013.081] <log value=\"INFO: Calling handler for program\" />\r\n[013.081] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[013.081] <response value=\"ACK\" rawmode=\"true\" />\r\n[013.081] send ../uefi.elf, filesize=1323008\r\n[013.233] Upgrade progress:   2\r\n[013.598] send finished\r\n[013.685] <response value=\"ACK\" rawmode=\"false\" />\r\n[013.685] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\tools.fv\" num_partition_sectors=\"96\"  physical_partition_number=\"0\" start_sector=\"12864\" />\r\n[013.761] <log value=\"INFO: Calling handler for program\" />\r\n[013.761] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[013.761] <response value=\"ACK\" rawmode=\"true\" />\r\n[013.761] send ../tools.fv, filesize=393216\r\n[013.874] send finished\r\n[013.969] <response value=\"ACK\" rawmode=\"false\" />\r\n[013.969] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\sec.dat\" num_partition_sectors=\"1\"  physical_partition_number=\"0\" start_sector=\"14016\" />\r\n[014.041] <log value=\"INFO: Calling handler for program\" />\r\n[014.041] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[014.041] <response value=\"ACK\" rawmode=\"true\" />\r\n[014.041] send ../sec.dat, filesize=80\r\n[014.041] send finished\r\n[014.084] <response value=\"ACK\" rawmode=\"false\" />\r\n[014.085] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\sdxpoorwills-boot.img\" num_partition_sectors=\"2340\"  physical_partition_number=\"0\" start_sector=\"14272\" />\r\n[014.161] <log value=\"INFO: Calling handler for program\" />\r\n[014.161] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[014.161] <response value=\"ACK\" rawmode=\"true\" />\r\n[014.161] send ../sdxpoorwills-boot.img, filesize=9582592\r\n[014.303] Upgrade progress:   3\r\n[015.019] Upgrade progress:   4\r\n[015.731] Upgrade progress:   5\r\n[016.450] Upgrade progress:   6\r\n[017.173] Upgrade progress:   7\r\n[017.884] Upgrade progress:   8\r\n[018.196] send finished\r\n[018.289] <response value=\"ACK\" rawmode=\"false\" />\r\n[018.289] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\sdxpoorwills-boot.img\" num_partition_sectors=\"2340\"  physical_partition_number=\"0\" start_sector=\"17344\" />\r\n[018.361] <log value=\"INFO: Calling handler for program\" />\r\n[018.361] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[018.361] <response value=\"ACK\" rawmode=\"true\" />\r\n[018.361] send ../sdxpoorwills-boot.img, filesize=9582592\r\n[018.722] Upgrade progress:   9\r\n[019.442] Upgrade progress:   10\r\n[020.154] Upgrade progress:   11\r\n[020.874] Upgrade progress:   12\r\n[021.594] Upgrade progress:   13\r\n[022.320] Upgrade progress:   14\r\n[022.397] send finished\r\n[022.488] <response value=\"ACK\" rawmode=\"false\" />\r\n[022.489] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\NON-HLOS.ubi\" num_partition_sectors=\"14784\"  physical_partition_number=\"0\" start_sector=\"27136\" />\r\n[022.561] <log value=\"INFO: Calling handler for program\" />\r\n[022.561] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[022.561] <response value=\"ACK\" rawmode=\"true\" />\r\n[022.561] send ../NON-HLOS.ubi, filesize=60555264\r\n[023.140] Upgrade progress:   15\r\n[023.851] Upgrade progress:   16\r\n[024.566] Upgrade progress:   17\r\n[025.282] Upgrade progress:   18\r\n[026.022] Upgrade progress:   19\r\n[026.734] Upgrade progress:   20\r\n[027.460] Upgrade progress:   21\r\n[028.181] Upgrade progress:   22\r\n[028.903] Upgrade progress:   23\r\n[029.633] Upgrade progress:   24\r\n[030.360] Upgrade progress:   25\r\n[031.085] Upgrade progress:   26\r\n[031.812] Upgrade progress:   27\r\n[032.546] Upgrade progress:   28\r\n[033.278] Upgrade progress:   29\r\n[034.007] Upgrade progress:   30\r\n[034.738] Upgrade progress:   31\r\n[035.481] Upgrade progress:   32\r\n[036.214] Upgrade progress:   33\r\n[036.948] Upgrade progress:   34\r\n[037.683] Upgrade progress:   35\r\n[038.426] Upgrade progress:   36\r\n[039.167] Upgrade progress:   37\r\n[039.902] Upgrade progress:   38\r\n[040.649] Upgrade progress:   39\r\n[041.393] Upgrade progress:   40\r\n[042.135] Upgrade progress:   41\r\n[042.877] Upgrade progress:   42\r\n[043.629] Upgrade progress:   43\r\n[044.378] Upgrade progress:   44\r\n[045.121] Upgrade progress:   45\r\n[045.871] Upgrade progress:   46\r\n[046.627] Upgrade progress:   47\r\n[047.369] Upgrade progress:   48\r\n[048.127] Upgrade progress:   49\r\n[048.881] Upgrade progress:   50\r\n[048.917] send finished\r\n[049.013] <response value=\"ACK\" rawmode=\"false\" />\r\n[049.013] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\sdxpoorwills-recoveryfs.ubi\" num_partition_sectors=\"4224\"  physical_partition_number=\"0\" start_sector=\"50944\" />\r\n[049.093] <log value=\"INFO: Calling handler for program\" />\r\n[049.093] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[049.093] <response value=\"ACK\" rawmode=\"true\" />\r\n[049.093] send ../sdxpoorwills-recoveryfs.ubi, filesize=17301504\r\n[049.711] Upgrade progress:   51\r\n[050.425] Upgrade progress:   52\r\n[051.143] Upgrade progress:   53\r\n[051.859] Upgrade progress:   54\r\n[052.577] Upgrade progress:   55\r\n[053.303] Upgrade progress:   56\r\n[054.029] Upgrade progress:   57\r\n[054.743] Upgrade progress:   58\r\n[055.472] Upgrade progress:   59\r\n[056.197] Upgrade progress:   60\r\n[056.421] send finished\r\n[056.517] <response value=\"ACK\" rawmode=\"false\" />\r\n[056.517] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\usrdata.ubi\" num_partition_sectors=\"512\"  physical_partition_number=\"0\" start_sector=\"58816\" />\r\n[056.593] <log value=\"INFO: Calling handler for program\" />\r\n[056.593] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[056.593] <response value=\"ACK\" rawmode=\"true\" />\r\n[056.593] send ../usrdata.ubi, filesize=2097152\r\n[057.025] Upgrade progress:   61\r\n[057.422] send finished\r\n[057.517] <response value=\"ACK\" rawmode=\"false\" />\r\n[057.517] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\sdxpoorwills-sysfs.ubi\" num_partition_sectors=\"15680\"  physical_partition_number=\"0\" start_sector=\"102336\" />\r\n[057.593] <log value=\"INFO: Calling handler for program\" />\r\n[057.593] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[057.593] <response value=\"ACK\" rawmode=\"true\" />\r\n[057.593] send ../sdxpoorwills-sysfs.ubi, filesize=64225280\r\n[057.854] Upgrade progress:   62\r\n[058.563] Upgrade progress:   63\r\n[059.274] Upgrade progress:   64\r\n[059.990] Upgrade progress:   65\r\n[060.714] Upgrade progress:   66\r\n[061.435] Upgrade progress:   67\r\n[062.150] Upgrade progress:   68\r\n[062.874] Upgrade progress:   69\r\n[063.602] Upgrade progress:   70\r\n[064.318] Upgrade progress:   71\r\n[065.048] Upgrade progress:   72\r\n[065.777] Upgrade progress:   73\r\n[066.498] Upgrade progress:   74\r\n[067.232] Upgrade progress:   75\r\n[067.964] Upgrade progress:   76\r\n[068.693] Upgrade progress:   77\r\n[069.423] Upgrade progress:   78\r\n[070.161] Upgrade progress:   79\r\n[070.898] Upgrade progress:   80\r\n[071.644] Upgrade progress:   81\r\n[072.378] Upgrade progress:   82\r\n[073.122] Upgrade progress:   83\r\n[073.865] Upgrade progress:   84\r\n[074.597] Upgrade progress:   85\r\n[075.343] Upgrade progress:   86\r\n[076.087] Upgrade progress:   87\r\n[076.828] Upgrade progress:   88\r\n[077.581] Upgrade progress:   89\r\n[078.333] Upgrade progress:   90\r\n[079.080] Upgrade progress:   91\r\n[079.823] Upgrade progress:   92\r\n[080.588] Upgrade progress:   93\r\n[081.340] Upgrade progress:   94\r\n[082.088] Upgrade progress:   95\r\n[082.838] Upgrade progress:   96\r\n[083.597] Upgrade progress:   97\r\n[084.353] Upgrade progress:   98\r\n[085.107] Upgrade progress:   99\r\n[085.613] send finished\r\n[085.713] <response value=\"ACK\" rawmode=\"false\" />\r\n[085.713] <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\sbl1.mbn\" num_partition_sectors=\"136\"  physical_partition_number=\"0\" start_sector=\"0\" />\r\n[085.793] <log value=\"INFO: Calling handler for program\" />\r\n[085.793] <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\r\n[085.793] <response value=\"ACK\" rawmode=\"true\" />\r\n[085.793] send ../sbl1.mbn, filesize=556180\r\n[085.965] Upgrade progress:   100\r\n[085.976] send finished\r\n[086.069] <response value=\"ACK\" rawmode=\"false\" />\r\n[086.069] <power value=\"reset\" />\r\n[086.106] <log value=\"INFO: Calling handler for power\" />\r\n[086.107] <response value=\"ACK\" rawmode=\"false\" />\r\n[086.107] <log value=\"INFO: Will issue reset/power off 100 useconds, if this hangs check if watchdog is enabled\" />\r\n[086.107] <log value=\"INFO: bsp_target_reset() 1\" />\r\n[086.107] qtcp_read read=0, errno: 0 (Success)\r\n[086.107] qusb_noblock_read read=0, errno: 0 (Success)\r\n[086.107] qusb_noblock_read cur=0, min_size=1\r\n[086.107] firehose_protocol.c fh_recv_cmd 294 fail\r\n[086.107] THE TOTAL DOWNLOAD TIME IS 84.093 s\r\n[086.107] Upgrade module successfully.\r\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/log/pcie_mhi.log.txt",
    "content": "# ./QFirehose -p /dev/mhi_BHI -f v09\n\n[000.000]: QFirehose Version: Quectel_LTE&5G_QFirehose_Linux&Android_V1.4.5\n[000.000]: Builded: Feb 10 2021 14:14:00\n[000.000]: Find md5 check file <v09/md5.txt>\n[000.000]: Totals checking 0 files md5 value, 0 file fail!\n[000.024]: switch_to_edl_mode\n[001.027]: poll_wait events=POLLIN msec=1000 timeout\n[001.027]: qusb_noblock_read cur=0, min_size=1\n[001.027]: switch to 'Emergency download mode'\n[001.039]: successful, wait module reboot\n[002.040]: bhi_ee = 6\n[004.105]: dir=v09/update/firehose\n[004.105]: d_name=rawprogram_nand_p4K_b256K_factory.xml\n[004.108]: <log value=\"INFO: Binary build date: Dec 29 2020 @ 09:23:46\" />\n......\n[004.168]: <log value=\"INFO: End of supported functions 15\" />\n[005.170]: poll_wait events=POLLIN msec=1000 timeout\n[005.170]: qusb_noblock_read cur=0, min_size=1\n[005.170]: firehose_protocol.c fh_recv_cmd 327 fail\n[005.170]: <configure MemoryName=\"nand\" Verbose=\"0\" AlwaysValidate=\"0\" MaxDigestTableSizeInBytes=\"2048\" MaxPayloadSizeToTargetInBytes=\"8192\"  ZlpAwareHost=\"1\" SkipStorageInit=\"0\" />\n[005.178]: <log value=\"INFO: Calling handler for configure\" />\n[005.181]: <log value=\"INFO: Storage type set to value nand\" />\n[005.186]: <response value=\"ACK\" MemoryName=\"nand\" MinVersionSupported=\"1\" Version=\"1\" MaxPayloadSizeToTargetInBytes=\"8192\" MaxPayloadSizeToTargetInBytesSupported=\"8192\" MaxXMLSizeInBytes=\"4096\" DateTime=\"Dec 29 2020 - 09:23:46\" />\n[005.186]: <erase PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" num_partition_sectors=\"512\" physical_partition_number=\"0\" start_sector=\"0\"    />\n[005.193]: <log value=\"INFO: Calling handler for erase\" />\n[005.365]: <log value=\"INFO: [295] bbt_size:100 blocks:800.\" />\n[005.368]: <log value=\"INFO: [297] bbt_size:100 blocks:800.\" />\n[005.761]: <log value=\"INFO: Erasing start sector 0, num sectors 0\" />\n[005.777]: <response value=\"ACK\" rawmode=\"false\" />\n......\n[011.965]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"partition_complete_p4K_b256K.mbn\" num_partition_sectors=\"4\"  physical_partition_number=\"0\" start_sector=\"512\" />\n[011.972]: <log value=\"INFO: Calling handler for program\" />\n[011.976]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\n[011.979]: <response value=\"ACK\" rawmode=\"true\" />\n[011.979]: send partition_complete_p4K_b256K.mbn, filesize=16384\n.\n[011.979]: upgrade progress 0% 16384/144903062\n[011.979]: send finished\n[011.997]: <response value=\"ACK\" rawmode=\"false\" />\n......\n[146.314]: <program PAGES_PER_BLOCK=\"64\" SECTOR_SIZE_IN_BYTES=\"4096\" filename=\"..\\sbl1.mbn\" num_partition_sectors=\"139\"  physical_partition_number=\"0\" start_sector=\"0\" />\n[146.321]: <log value=\"INFO: Calling handler for program\" />\n[146.325]: <log value=\"INFO: NAND was previously open, returning existing handle 0.\" />\n[146.328]: <response value=\"ACK\" rawmode=\"true\" />\n[146.328]: send ../sbl1.mbn, filesize=566196\n.\n[146.616]: upgrade progress 100% 145469258/144903062\n[146.616]: send finished\n[146.834]: <response value=\"ACK\" rawmode=\"false\" />\n[146.834]: <power value=\"reset\" />\n[146.840]: <log value=\"INFO: Calling handler for power\" />\n[146.843]: <response value=\"ACK\" rawmode=\"false\" />\n[146.847]: <log value=\"INFO: Will issue reset/power off 100 useconds, if this hangs check if watchdog is enabled\" />\n[146.850]: <log value=\"INFO: bsp_target_reset() 1\" />\n[147.852]: poll_wait events=POLLIN msec=1000 timeout\n[147.852]: qusb_noblock_read cur=0, min_size=1\n[147.852]: firehose_protocol.c fh_recv_cmd 327 fail\n[147.852]: THE TOTAL DOWNLOAD TIME IS 143.747 s\n[147.852]: Upgrade module successfully.\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/md5.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software.\r\n    Under no circumstances may customers modify, demonstrate, use, deliver\r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include \"md5.h\"\r\n#include <endian.h> //for __BYTE_ORDER\r\n\r\n#define F(x, y, z) ((z) ^ ((x) & ((y) ^ (z))))\r\n#define G(x, y, z) ((y) ^ ((z) & ((x) ^ (y))))\r\n#define H(x, y, z) (((x) ^ (y)) ^ (z))\r\n#define H2(x, y, z) ((x) ^ ((y) ^ (z)))\r\n#define I(x, y, z) ((y) ^ ((x) | ~(z)))\r\n\r\n#define STEP(f, a, b, c, d, x, t, s)                         \\\r\n    (a) += f((b), (c), (d)) + (x) + (t);                     \\\r\n    (a) = (((a) << (s)) | (((a)&0xffffffff) >> (32 - (s)))); \\\r\n    (a) += (b);\r\n\r\n#if __BYTE_ORDER == __LITTLE_ENDIAN\r\n#define SET(n) (*(uint32_t *)&ptr[(n)*4])\r\n#define GET(n) SET(n)\r\n#else\r\n#define SET(n)                                                             \\\r\n    (block[(n)] = (uint32_t)ptr[(n)*4] | ((uint32_t)ptr[(n)*4 + 1] << 8) | \\\r\n                  ((uint32_t)ptr[(n)*4 + 2] << 16) | ((uint32_t)ptr[(n)*4 + 3] << 24))\r\n#define GET(n) (block[(n)])\r\n#endif\r\n\r\nextern char firehose_unzip_full_dir[256];\r\nextern char firehose_zip_name[80];\r\n\r\nstatic const void *body(md5_ctx_t *ctx, const void *data, unsigned long size)\r\n{\r\n    const unsigned char *ptr;\r\n    uint32_t a, b, c, d;\r\n    uint32_t saved_a, saved_b, saved_c, saved_d;\r\n#if __BYTE_ORDER != __LITTLE_ENDIAN\r\n    uint32_t block[16];\r\n#endif\r\n\r\n    ptr = (const unsigned char *)data;\r\n\r\n    a = ctx->a;\r\n    b = ctx->b;\r\n    c = ctx->c;\r\n    d = ctx->d;\r\n\r\n    do\r\n    {\r\n        saved_a = a;\r\n        saved_b = b;\r\n        saved_c = c;\r\n        saved_d = d;\r\n\r\n        /* Round 1 */\r\n        STEP(F, a, b, c, d, SET(0), 0xd76aa478, 7)\r\n        STEP(F, d, a, b, c, SET(1), 0xe8c7b756, 12)\r\n        STEP(F, c, d, a, b, SET(2), 0x242070db, 17)\r\n        STEP(F, b, c, d, a, SET(3), 0xc1bdceee, 22)\r\n        STEP(F, a, b, c, d, SET(4), 0xf57c0faf, 7)\r\n        STEP(F, d, a, b, c, SET(5), 0x4787c62a, 12)\r\n        STEP(F, c, d, a, b, SET(6), 0xa8304613, 17)\r\n        STEP(F, b, c, d, a, SET(7), 0xfd469501, 22)\r\n        STEP(F, a, b, c, d, SET(8), 0x698098d8, 7)\r\n        STEP(F, d, a, b, c, SET(9), 0x8b44f7af, 12)\r\n        STEP(F, c, d, a, b, SET(10), 0xffff5bb1, 17)\r\n        STEP(F, b, c, d, a, SET(11), 0x895cd7be, 22)\r\n        STEP(F, a, b, c, d, SET(12), 0x6b901122, 7)\r\n        STEP(F, d, a, b, c, SET(13), 0xfd987193, 12)\r\n        STEP(F, c, d, a, b, SET(14), 0xa679438e, 17)\r\n        STEP(F, b, c, d, a, SET(15), 0x49b40821, 22)\r\n\r\n        /* Round 2 */\r\n        STEP(G, a, b, c, d, GET(1), 0xf61e2562, 5)\r\n        STEP(G, d, a, b, c, GET(6), 0xc040b340, 9)\r\n        STEP(G, c, d, a, b, GET(11), 0x265e5a51, 14)\r\n        STEP(G, b, c, d, a, GET(0), 0xe9b6c7aa, 20)\r\n        STEP(G, a, b, c, d, GET(5), 0xd62f105d, 5)\r\n        STEP(G, d, a, b, c, GET(10), 0x02441453, 9)\r\n        STEP(G, c, d, a, b, GET(15), 0xd8a1e681, 14)\r\n        STEP(G, b, c, d, a, GET(4), 0xe7d3fbc8, 20)\r\n        STEP(G, a, b, c, d, GET(9), 0x21e1cde6, 5)\r\n        STEP(G, d, a, b, c, GET(14), 0xc33707d6, 9)\r\n        STEP(G, c, d, a, b, GET(3), 0xf4d50d87, 14)\r\n        STEP(G, b, c, d, a, GET(8), 0x455a14ed, 20)\r\n        STEP(G, a, b, c, d, GET(13), 0xa9e3e905, 5)\r\n        STEP(G, d, a, b, c, GET(2), 0xfcefa3f8, 9)\r\n        STEP(G, c, d, a, b, GET(7), 0x676f02d9, 14)\r\n        STEP(G, b, c, d, a, GET(12), 0x8d2a4c8a, 20)\r\n\r\n        /* Round 3 */\r\n        STEP(H, a, b, c, d, GET(5), 0xfffa3942, 4)\r\n        STEP(H2, d, a, b, c, GET(8), 0x8771f681, 11)\r\n        STEP(H, c, d, a, b, GET(11), 0x6d9d6122, 16)\r\n        STEP(H2, b, c, d, a, GET(14), 0xfde5380c, 23)\r\n        STEP(H, a, b, c, d, GET(1), 0xa4beea44, 4)\r\n        STEP(H2, d, a, b, c, GET(4), 0x4bdecfa9, 11)\r\n        STEP(H, c, d, a, b, GET(7), 0xf6bb4b60, 16)\r\n        STEP(H2, b, c, d, a, GET(10), 0xbebfbc70, 23)\r\n        STEP(H, a, b, c, d, GET(13), 0x289b7ec6, 4)\r\n        STEP(H2, d, a, b, c, GET(0), 0xeaa127fa, 11)\r\n        STEP(H, c, d, a, b, GET(3), 0xd4ef3085, 16)\r\n        STEP(H2, b, c, d, a, GET(6), 0x04881d05, 23)\r\n        STEP(H, a, b, c, d, GET(9), 0xd9d4d039, 4)\r\n        STEP(H2, d, a, b, c, GET(12), 0xe6db99e5, 11)\r\n        STEP(H, c, d, a, b, GET(15), 0x1fa27cf8, 16)\r\n        STEP(H2, b, c, d, a, GET(2), 0xc4ac5665, 23)\r\n\r\n        /* Round 4 */\r\n        STEP(I, a, b, c, d, GET(0), 0xf4292244, 6)\r\n        STEP(I, d, a, b, c, GET(7), 0x432aff97, 10)\r\n        STEP(I, c, d, a, b, GET(14), 0xab9423a7, 15)\r\n        STEP(I, b, c, d, a, GET(5), 0xfc93a039, 21)\r\n        STEP(I, a, b, c, d, GET(12), 0x655b59c3, 6)\r\n        STEP(I, d, a, b, c, GET(3), 0x8f0ccc92, 10)\r\n        STEP(I, c, d, a, b, GET(10), 0xffeff47d, 15)\r\n        STEP(I, b, c, d, a, GET(1), 0x85845dd1, 21)\r\n        STEP(I, a, b, c, d, GET(8), 0x6fa87e4f, 6)\r\n        STEP(I, d, a, b, c, GET(15), 0xfe2ce6e0, 10)\r\n        STEP(I, c, d, a, b, GET(6), 0xa3014314, 15)\r\n        STEP(I, b, c, d, a, GET(13), 0x4e0811a1, 21)\r\n        STEP(I, a, b, c, d, GET(4), 0xf7537e82, 6)\r\n        STEP(I, d, a, b, c, GET(11), 0xbd3af235, 10)\r\n        STEP(I, c, d, a, b, GET(2), 0x2ad7d2bb, 15)\r\n        STEP(I, b, c, d, a, GET(9), 0xeb86d391, 21)\r\n\r\n        a += saved_a;\r\n        b += saved_b;\r\n        c += saved_c;\r\n        d += saved_d;\r\n\r\n        ptr += 64;\r\n    } while (size -= 64);\r\n\r\n    ctx->a = a;\r\n    ctx->b = b;\r\n    ctx->c = c;\r\n    ctx->d = d;\r\n\r\n    return ptr;\r\n}\r\n\r\nvoid md5_begin(md5_ctx_t *ctx)\r\n{\r\n    ctx->a = 0x67452301;\r\n    ctx->b = 0xefcdab89;\r\n    ctx->c = 0x98badcfe;\r\n    ctx->d = 0x10325476;\r\n\r\n    ctx->lo = 0;\r\n    ctx->hi = 0;\r\n}\r\n\r\nvoid md5_hash(const void *data, size_t size, md5_ctx_t *ctx)\r\n{\r\n    uint32_t saved_lo;\r\n    unsigned long used, available;\r\n\r\n    saved_lo = ctx->lo;\r\n    if ((ctx->lo = (saved_lo + size) & 0x1fffffff) < saved_lo) ctx->hi++;\r\n    ctx->hi += size >> 29;\r\n\r\n    used = saved_lo & 0x3f;\r\n\r\n    if (used)\r\n    {\r\n        available = 64 - used;\r\n\r\n        if (size < available)\r\n        {\r\n            memcpy(&ctx->buffer[used], data, size);\r\n            return;\r\n        }\r\n\r\n        memcpy(&ctx->buffer[used], data, available);\r\n        data = (const unsigned char *)data + available;\r\n        size -= available;\r\n        body(ctx, ctx->buffer, 64);\r\n    }\r\n\r\n    if (size >= 64)\r\n    {\r\n        data = body(ctx, data, size & ~((size_t)0x3f));\r\n        size &= 0x3f;\r\n    }\r\n\r\n    memcpy(ctx->buffer, data, size);\r\n}\r\n\r\nvoid md5_end(void *resbuf, md5_ctx_t *ctx)\r\n{\r\n    unsigned char *result = (unsigned char *)resbuf;\r\n    unsigned long used, available;\r\n\r\n    used = ctx->lo & 0x3f;\r\n\r\n    ctx->buffer[used++] = 0x80;\r\n\r\n    available = 64 - used;\r\n\r\n    if (available < 8)\r\n    {\r\n        memset(&ctx->buffer[used], 0, available);\r\n        body(ctx, ctx->buffer, 64);\r\n        used = 0;\r\n        available = 64;\r\n    }\r\n\r\n    if (used >= 64) return (void)0;\r\n\r\n    memset(&ctx->buffer[used], 0, available - 8);\r\n\r\n    ctx->lo <<= 3;\r\n    ctx->buffer[56] = ctx->lo;\r\n    ctx->buffer[57] = ctx->lo >> 8;\r\n    ctx->buffer[58] = ctx->lo >> 16;\r\n    ctx->buffer[59] = ctx->lo >> 24;\r\n    ctx->buffer[60] = ctx->hi;\r\n    ctx->buffer[61] = ctx->hi >> 8;\r\n    ctx->buffer[62] = ctx->hi >> 16;\r\n    ctx->buffer[63] = ctx->hi >> 24;\r\n\r\n    body(ctx, ctx->buffer, 64);\r\n\r\n    result[0] = ctx->a;\r\n    result[1] = ctx->a >> 8;\r\n    result[2] = ctx->a >> 16;\r\n    result[3] = ctx->a >> 24;\r\n    result[4] = ctx->b;\r\n    result[5] = ctx->b >> 8;\r\n    result[6] = ctx->b >> 16;\r\n    result[7] = ctx->b >> 24;\r\n    result[8] = ctx->c;\r\n    result[9] = ctx->c >> 8;\r\n    result[10] = ctx->c >> 16;\r\n    result[11] = ctx->c >> 24;\r\n    result[12] = ctx->d;\r\n    result[13] = ctx->d >> 8;\r\n    result[14] = ctx->d >> 16;\r\n    result[15] = ctx->d >> 24;\r\n\r\n    memset(ctx, 0, sizeof(*ctx));\r\n}\r\n\r\nint md5sum(char *file, void *md5_buf)\r\n{\r\n    char buf[256];\r\n    md5_ctx_t ctx;\r\n    int ret = 0;\r\n    FILE *f;\r\n\r\n    f = fopen(file, \"r\");\r\n    if (!f) return -1;\r\n\r\n    md5_begin(&ctx);\r\n    do\r\n    {\r\n        int len = fread(buf, 1, sizeof(buf), f);\r\n        if (!len) break;\r\n\r\n        md5_hash(buf, len, &ctx);\r\n        ret += len;\r\n    } while (1);\r\n\r\n    md5_end(md5_buf, &ctx);\r\n    fclose(f);\r\n\r\n    return ret;\r\n}\r\n\r\nint md5_check(const char *firehose_dir)\r\n{\r\n    FILE *fp = NULL;\r\n    char md5_file_path[256], buff[256], file_name[128], file_name_tmp[128], file_full_path[256],\r\n        file_md5_value[64];\r\n    char *ps = NULL, *pe = NULL;\r\n    unsigned char compute_md5_buff[16];\r\n    char convert_md5_buff[33];\r\n    int i, file_count = 0, fail_count = 0;\r\n\r\n    if (is_upgrade_fimeware_zip_7z)\r\n    {\r\n        memset(zip_cmd_buf, 0, sizeof(zip_cmd_buf));\r\n\r\n        if (is_upgrade_fimeware_only_zip)\r\n        {\r\n            if (is_firehose_zip_7z_name_exit)\r\n            {\r\n                snprintf(zip_cmd_buf, sizeof(zip_cmd_buf),\r\n                         \"unzip -o -q %.240s %.76s/'*md5.txt' -d /tmp/ > %s\", firehose_dir,\r\n                         firehose_zip_name, ZIP_PROCESS_INFO);\r\n            }\r\n            else\r\n            {\r\n                snprintf(zip_cmd_buf, sizeof(zip_cmd_buf),\r\n                         \"unzip -o -q %.240s '*md5.txt' -d /tmp/ > %s\", firehose_dir,\r\n                         ZIP_PROCESS_INFO);\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if (is_firehose_zip_7z_name_exit)\r\n            {\r\n                snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"7z x %.240s -o/tmp/ %.76s/md5.txt > %s\",\r\n                         firehose_dir, firehose_zip_name, ZIP_PROCESS_INFO);\r\n            }\r\n            else\r\n            {\r\n                snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"7z x %.240s -o/tmp/ md5.txt > %s\",\r\n                         firehose_dir, ZIP_PROCESS_INFO);\r\n            }\r\n        }\r\n        printf(\"%s zip_cmd_buf:%s\\n\", __func__, zip_cmd_buf);\r\n\r\n        if (-1 == system(zip_cmd_buf))\r\n        {\r\n            printf(\"%s system return error\\n\", __func__);\r\n            return -1;\r\n        }\r\n        usleep(1000);\r\n        snprintf(md5_file_path, sizeof(md5_file_path), \"%.240s/md5.txt\", firehose_unzip_full_dir);\r\n        if (access(md5_file_path, R_OK))\r\n        {\r\n            dbg_time(\"Cann't find md5.txt in %s, Please check it!\\n\", md5_file_path);\r\n            return -1;\r\n        }\r\n        else\r\n        {\r\n            dbg_time(\"Find md5 check file <%s>\\n\", md5_file_path);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        snprintf(md5_file_path, sizeof(md5_file_path), \"%.240s/md5.txt\", firehose_dir);\r\n        if (access(md5_file_path, R_OK))\r\n        {\r\n            dbg_time(\"Cann't find md5.txt in %s, Please check it!\\n\", firehose_dir);\r\n            return 0; // allow skip md5 check by delete md5.txt\r\n        }\r\n        else\r\n        {\r\n            dbg_time(\"Find md5 check file <%s>\\n\", md5_file_path);\r\n        }\r\n    }\r\n\r\n    fp = fopen(md5_file_path, \"rb\");\r\n    if (fp == NULL)\r\n    {\r\n        dbg_time(\"fail to fopen(%s), error: %d (%s)\\n\", md5_file_path, errno, strerror(errno));\r\n        return -1;\r\n    }\r\n\r\n    while (fgets(buff, sizeof(buff), fp))\r\n    {\r\n        if (strstr(buff, \"targetfiles.zip\")) continue;\r\n\r\n        ps = strstr(buff, \":\\\\\");\r\n        if (ps == NULL) continue;\r\n\r\n        file_count++;\r\n        ps = ps + 1;\r\n        pe = strstr(ps, \":\");\r\n        if (pe == NULL) continue;\r\n\r\n        memcpy(file_name, ps, pe - ps);\r\n        file_name[pe - ps] = '\\0';\r\n\r\n        for (i = 0; file_name[i] != '\\0'; i++)\r\n        {\r\n            if (file_name[i] == '\\\\') file_name[i] = '/';\r\n        }\r\n\r\n        memcpy(file_md5_value, pe + 1, 32);\r\n        file_md5_value[32] = '\\0';\r\n\r\n        if (is_upgrade_fimeware_zip_7z)\r\n        {\r\n            char *p1 = strchr(file_name, '/');\r\n            memset(file_name_tmp, 0, sizeof(file_name_tmp));\r\n            strncpy(file_name_tmp, p1 + 1, strlen(p1) - 1);\r\n            memset(zip_cmd_buf, 0, sizeof(zip_cmd_buf));\r\n\r\n            if (is_upgrade_fimeware_only_zip)\r\n            {\r\n                if (is_firehose_zip_7z_name_exit)\r\n                {\r\n                    snprintf(zip_cmd_buf, sizeof(zip_cmd_buf),\r\n                             \"unzip -o -q %.240s %.76s/'*%.120s' -d /tmp/ > %s\", firehose_dir,\r\n                             firehose_zip_name, file_name_tmp, ZIP_PROCESS_INFO);\r\n                }\r\n                else\r\n                {\r\n                    snprintf(zip_cmd_buf, sizeof(zip_cmd_buf),\r\n                             \"unzip -o -q %.240s '*%.120s' -d /tmp/ > %s\", firehose_dir,\r\n                             file_name_tmp, ZIP_PROCESS_INFO);\r\n                }\r\n            }\r\n            else\r\n            {\r\n                if (is_firehose_zip_7z_name_exit)\r\n                {\r\n                    snprintf(zip_cmd_buf, sizeof(zip_cmd_buf),\r\n                             \"7z x %.240s -o/tmp/ %.76s/%.120s > %s\", firehose_dir,\r\n                             firehose_zip_name, file_name_tmp, ZIP_PROCESS_INFO);\r\n                }\r\n                else\r\n                {\r\n                    snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"7z x %.240s -o/tmp/ %.120s > %s\",\r\n                             firehose_dir, file_name_tmp, ZIP_PROCESS_INFO);\r\n                }\r\n            }\r\n            dbg_time(\"%s zip_cmd_buf:%s\\n\", __func__, zip_cmd_buf);\r\n\r\n            if (-1 == system(zip_cmd_buf))\r\n            {\r\n                dbg_time(\"%s system return error\\n\", __func__);\r\n                return -1;\r\n            }\r\n            usleep(1000);\r\n\r\n            snprintf(file_full_path, sizeof(file_full_path), \"%.160s%.80s\", firehose_unzip_full_dir,\r\n                     file_name);\r\n            dbg_time(\"%s file_full_path:%s\\n\", __func__, file_full_path);\r\n        }\r\n        else\r\n        {\r\n            snprintf(file_full_path, sizeof(file_full_path), \"%.160s%.80s\", firehose_dir,\r\n                     file_name);\r\n        }\r\n\r\n        if (access(file_full_path, R_OK))\r\n        {\r\n            continue;\r\n        }\r\n\r\n        md5sum(file_full_path, compute_md5_buff);\r\n\r\n        for (i = 0; i < 16; i++)\r\n        {\r\n            sprintf(convert_md5_buff + (i * 2), \"%02X\", compute_md5_buff[i]);\r\n        }\r\n\r\n        if (strncasecmp(file_md5_value, convert_md5_buff, 16))\r\n        {\r\n            fail_count++;\r\n            dbg_time(\"md5 checking: %s fail\\n\", file_full_path);\r\n            dbg_time(\"find %s, should be %s\\n\", file_md5_value, convert_md5_buff);\r\n        }\r\n        else\r\n        {\r\n            dbg_time(\"md5 checking: %s pass\\n\", file_full_path);\r\n        }\r\n\r\n        if (is_upgrade_fimeware_zip_7z)\r\n        {\r\n            dbg_time(\"%s delet %s ...\\n\", __func__, file_full_path);\r\n            unlink(file_full_path); // delete all file\r\n        }\r\n    }\r\n\r\n    fclose(fp);\r\n    if (is_upgrade_fimeware_zip_7z)\r\n    {\r\n        unlink(md5_file_path); // delete md5.txt\r\n    }\r\n\r\n    dbg_time(\"Totals checking %d files md5 value, %d file fail!\\n\", file_count, fail_count);\r\n\r\n    return (fail_count ? -1 : 0);\r\n}\r\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/md5.h",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software.\r\n    Under no circumstances may customers modify, demonstrate, use, deliver\r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#ifndef _QUECTEL_MD5_H\r\n#define _QUECTEL_MD5_H\r\n\r\n#include <stdio.h>\r\n#include <string.h>\r\n#include <errno.h>\r\n#include <stdint.h>\r\n#include <stddef.h>\r\n#include <unistd.h>\r\n#include \"usb_linux.h\"\r\n\r\ntypedef struct md5_ctx\r\n{\r\n    uint32_t lo, hi;\r\n    uint32_t a, b, c, d;\r\n    unsigned char buffer[64];\r\n} md5_ctx_t;\r\n\r\n// void dbg_time (const char *fmt, ...);\r\nextern int md5_check(const char *);\r\n\r\n#endif /* _QUECTEL_MD5_H */\r\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/qfirehose.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software.\r\n    Under no circumstances may customers modify, demonstrate, use, deliver\r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include <getopt.h>\r\n#include <grp.h>\r\n#include <sys/types.h>\r\n#include <pwd.h>\r\n#ifdef USE_IPC_MSG\r\n#include <sys/msg.h>\r\n#include <sys/ipc.h>\r\n#endif\r\n\r\n#include \"usb_linux.h\"\r\n#include \"md5.h\"\r\n\r\n/*\r\n[PATCH 3.10 27/54] usb: xhci: Add support for URB_ZERO_PACKET to bulk/sg transfers\r\nhttps://www.spinics.net/lists/kernel/msg2100618.html\r\n\r\ncommit 4758dcd19a7d9ba9610b38fecb93f65f56f86346\r\nAuthor: Reyad Attiyat <reyad.attiyat@gmail.com>\r\nDate:   Thu Aug 6 19:23:58 2015 +0300\r\n\r\n    usb: xhci: Add support for URB_ZERO_PACKET to bulk/sg transfers\r\n\r\n    This commit checks for the URB_ZERO_PACKET flag and creates an extra\r\n    zero-length td if the urb transfer length is a multiple of the endpoint's\r\n    max packet length.\r\n*/\r\nunsigned qusb_zlp_mode = 1; // MT7621 donot support USB ZERO PACKET\r\nunsigned q_erase_all_before_download = 0;\r\nunsigned q_module_packet_sign = 0;\r\nunsigned int g_from_ecm_to_rndis = 0;\r\nconst char *q_device_type = \"nand\"; // nand/emmc/ufs\r\nint sahara_main(const char *firehose_dir, const char *firehose_mbn, void *usb_handle, int edl_mode_05c69008);\r\nint firehose_main(const char *firehose_dir, void *usb_handle, unsigned qusb_zlp_mode);\r\nint stream_download(const char *firehose_dir, void *usb_handle, unsigned qusb_zlp_mode);\r\nint retrieve_soft_revision(void *usb_handle, uint8_t *mobile_software_revision, unsigned length);\r\nint usb2tcp_main(const void *usb_handle, int tcp_port, unsigned qusb_zlp_mode);\r\nint ql_capture_usbmon_log(const char *usbmon_logfile);\r\nvoid ql_stop_usbmon_log();\r\n\r\n// process vals\r\nstatic long long all_bytes_to_transfer = 0; // need transfered\r\nstatic long long transfer_bytes = 0;        // transfered bytes;\r\n\r\nchar zip_cmd_buf[512] = {0}; // zip cmd buf\r\nchar firehose_zip_name[80] = {0};\r\nchar firehose_unzip_full_dir[256] = {0};\r\nfile_name_backup file_name_b;\r\nint is_upgrade_fimeware_zip_7z = 0;\r\nint is_firehose_zip_7z_name_exit = 0;\r\nint is_upgrade_fimeware_only_zip = 0;\r\nint g_is_module_adb_entry_edl = 0;\r\n\r\nint g_is2mdn_path = 0;\r\n\r\nint switch_to_edl_mode(void *usb_handle)\r\n{\r\n    // DIAG commands used to switch the Qualcomm devices to EDL (Emergency download mode)\r\n    unsigned char edl_cmd[] = {0x4b, 0x65, 0x01, 0x00, 0x54, 0x0f, 0x7e};\r\n    // unsigned char edl_cmd[] = {0x3a, 0xa1, 0x6e, 0x7e}; //DL (download mode)\r\n    unsigned char *pbuf = malloc(512);\r\n    if (pbuf == NULL)\r\n    {\r\n        return 0;\r\n    }\r\n\r\n    int rx_len;\r\n    int rx_count = 0;\r\n\r\n    do\r\n    {\r\n        rx_len = qusb_noblock_read(usb_handle, pbuf, 512, 0, 1000);\r\n        if (rx_count++ > 100) break;\r\n    } while (rx_len > 0);\r\n\r\n    dbg_time(\"switch to 'Emergency download mode'\\n\");\r\n    rx_len = qusb_noblock_write(usb_handle, edl_cmd, sizeof(edl_cmd), sizeof(edl_cmd), 3000, 0);\r\n    if (rx_len < 0) return 0;\r\n\r\n    rx_count = 0;\r\n\r\n    do\r\n    {\r\n        rx_len = qusb_noblock_read(usb_handle, pbuf, 512, 0, 3000);\r\n        if (rx_len == sizeof(edl_cmd) && memcmp(pbuf, edl_cmd, sizeof(edl_cmd)) == 0)\r\n        {\r\n            dbg_time(\"successful, wait module reboot\\n\");\r\n            safe_free(pbuf);\r\n            return 1;\r\n        }\r\n\r\n        if (rx_count++ > 50) break;\r\n\r\n    } while (rx_len > 0);\r\n\r\n    safe_free(pbuf);\r\n    return 0;\r\n}\r\n\r\nint switch_to_edl_mode_in_adb_way()\r\n{\r\n    printf(\"entry switch_to_edl_mode_in_adb_way \\r\\n\");\r\n    int res = -1;\r\n    res = system(\"adb shell lxc-power1 adb host\");\r\n    // if (res == 127)\r\n    // {\r\n    //     printf(\"call /bin/sh return error \\r\\n\");\r\n    //     return res;\r\n    // }\r\n    // else if (res == -1)\r\n    // {\r\n    //     printf(\"just return: error \\r\\n\");\r\n    //     return res;\r\n    // }\r\n    // else if (res == 0)\r\n    // {\r\n    //     printf(\"no child pid create: error \\r\\n\");\r\n    //     return res;\r\n    // }\r\n\r\n    printf(\"send lxc power1 success res=[%d] \\r\\n\", res);\r\n    sleep(20);\r\n    res = system(\"adb reboot edl\");\r\n    // if (res == 127)\r\n    // {\r\n    //     printf(\"call /bin/sh return error \\r\\n\");\r\n    //     return res;\r\n    // }\r\n    // else if (res == -1)\r\n    // {\r\n    //     printf(\"just return: error \\r\\n\");\r\n    //     return res;\r\n    // }\r\n    // else if (res == 0)\r\n    // {\r\n    //     printf(\"no child pid create: error \\r\\n\");\r\n    //     return res;\r\n    // }\r\n\r\n    printf(\"send reboot edl success res=[%d] \\r\\n\", res);\r\n    return 0;\r\n}\r\n\r\nstatic void usage(int status, const char *program_name)\r\n{\r\n    if (status != EXIT_SUCCESS)\r\n    {\r\n        printf(\"Try '%s --help' for more information.\\n\", program_name);\r\n    }\r\n    else\r\n    {\r\n        dbg_time(\"Upgrade Quectel's modules with Qualcomm's firehose protocol.\\n\");\r\n        dbg_time(\"Usage: %s [options...]\\n\", program_name);\r\n        dbg_time(\"    -f [package_dir]               Upgrade package directory path\\n\");\r\n        dbg_time(\"    -p [/dev/ttyUSBx]              Diagnose port, will auto-detect if not \"\r\n                 \"specified\\n\");\r\n        dbg_time(\"    -s [/sys/bus/usb/devices/xx]   When multiple modules exist on the board, use \"\r\n                 \"-s specify which module you want to upgrade\\n\");\r\n        dbg_time(\"    -l [dir_name]                  Sync log into a file(will create \"\r\n                 \"qfirehose_timestamp.log)\\n\");\r\n        dbg_time(\"    -u [usbmon_log]                Catch usbmon log and save to file (need \"\r\n                 \"debugfs and usbmon driver)\\n\");\r\n        dbg_time(\"    -n                             Skip MD5 check\\n\");\r\n        dbg_time(\"    -d                             Device Type, default nand, support emmc/ufs\\n\");\r\n        dbg_time(\"    -v                             For AG215S-GLR signed firmware packages\\n\");\r\n    }\r\n    exit(status);\r\n}\r\n\r\n/*\r\n1. enum dir, fix up dirhose_dir\r\n2. md5 examine\r\n3. furture\r\n*/\r\nstatic char *find_firehose_mbn(char **firehose_dir, size_t size)\r\n{\r\n    char *firehose_mbn = NULL;\r\n\r\n    if (is_upgrade_fimeware_zip_7z)\r\n    {\r\n        int i;\r\n        char file_name_prog[128] = {0};\r\n        char file_name_prog_dir[256] = {0};\r\n\r\n        firehose_mbn = (char *)malloc(256);\r\n        if (firehose_mbn == NULL)\r\n        {\r\n            return NULL;\r\n        }\r\n\r\n        for (i = 0; i < file_name_b.file_name_count; i++)\r\n        {\r\n            if ((strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \"prog_nand_firehose_\") && strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \".mbn\")) ||\r\n                (strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \"prog_emmc_firehose_\") && strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \".mbn\")) ||\r\n                (strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \"prog_firehose_\") && strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \".mbn\")) ||\r\n                (strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \"prog_firehose_\") && strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \".elf\")) ||\r\n                (strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \"firehose-prog\") && strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \".mbn\")) ||\r\n                (strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \"prog_\") && strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \".mbn\")) ||\r\n                (strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \"xbl_s_devprg_Qcm8550_ns\") && strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \".melf\")) ||\r\n                (strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \"xbl_s_devprg_ns_SA52X\") && strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \".melf\")))\r\n            {\r\n                printf(\"file_name_b.file_backup_c[i].zip_file_name_backup:%s\\n\", file_name_b.file_backup_c[i].zip_file_name_backup);\r\n                printf(\"file_name_b.file_backup_c[i].zip_file_dir_backup:%s\\n\", file_name_b.file_backup_c[i].zip_file_dir_backup);\r\n\r\n                if (strstr(file_name_b.file_backup_c[i].zip_file_dir_backup, \"update/firehose\"))\r\n                {\r\n                    memmove(file_name_prog, file_name_b.file_backup_c[i].zip_file_name_backup, strlen(file_name_b.file_backup_c[i].zip_file_name_backup));\r\n                    memmove(file_name_prog_dir, file_name_b.file_backup_c[i].zip_file_dir_backup, strlen(file_name_b.file_backup_c[i].zip_file_dir_backup));\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (file_name_prog[0] != '\\0')\r\n        {\r\n            memset(zip_cmd_buf, 0, sizeof(zip_cmd_buf));\r\n            if (is_upgrade_fimeware_only_zip)\r\n            {\r\n                snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"unzip -o -q %.240s '*%.200s' -d /tmp/ > %s\", *firehose_dir, file_name_prog_dir, ZIP_PROCESS_INFO);\r\n            }\r\n            else\r\n            {\r\n                snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"7z x %.240s -o/tmp/ %.200s > %s\", *firehose_dir, file_name_prog_dir, ZIP_PROCESS_INFO);\r\n            }\r\n            printf(\"%s zip_cmd_buf:%s\\n\", __func__, zip_cmd_buf);\r\n            if (-1 == system(zip_cmd_buf))\r\n            {\r\n                printf(\"%s system return error\\n\", __func__);\r\n                return NULL;\r\n            }\r\n            usleep(1000);\r\n\r\n            memmove(firehose_mbn, file_name_prog_dir, 240);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        if (strstr(*firehose_dir, \"/update/firehose\") == NULL)\r\n        {\r\n            size_t len = strlen(*firehose_dir);\r\n\r\n            strncat(*firehose_dir, \"/update/firehose\", size);\r\n            if (access(*firehose_dir, R_OK))\r\n            {\r\n                (*firehose_dir)[len] = '\\0'; // for smart module\r\n            }\r\n        }\r\n\r\n        if (access(*firehose_dir, R_OK))\r\n        {\r\n            dbg_time(\"%s access(%s fail), errno: %d (%s)\\n\", __func__, *firehose_dir, errno, strerror(errno));\r\n            return NULL;\r\n        }\r\n\r\n        if (!qfile_find_file(*firehose_dir, \"prog_nand_firehose_\", \".mbn\", &firehose_mbn) && !qfile_find_file(*firehose_dir, \"prog_emmc_firehose_\", \".mbn\", &firehose_mbn) &&\r\n            !qfile_find_file(*firehose_dir, \"prog_firehose_\", \".mbn\", &firehose_mbn) && !qfile_find_file(*firehose_dir, \"prog_firehose_\", \".elf\", &firehose_mbn) &&\r\n            !qfile_find_file(*firehose_dir, \"firehose-prog\", \".mbn\", &firehose_mbn) && !qfile_find_file(*firehose_dir, \"prog_\", \".mbn\", &firehose_mbn) &&\r\n            !qfile_find_file(*firehose_dir, \"xbl_s_devprg_Qcm8550_ns\", \".melf\",\r\n                             &firehose_mbn) // smart  SA885GAPNA\r\n            && !qfile_find_file(*firehose_dir, \"xbl_s_devprg_ns_SA52X\", \".melf\",\r\n                                &firehose_mbn) // AG590ECNABR01A01M8G_OCPU_01.001.01\r\n        )\r\n        {\r\n            dbg_time(\"%s fail to find firehose mbn file in %s\\n\", __func__, *firehose_dir);\r\n            safe_free(firehose_mbn);\r\n            return NULL;\r\n        }\r\n    }\r\n\r\n    dbg_time(\"%s %s\\n\", __func__, firehose_mbn);\r\n    return firehose_mbn;\r\n}\r\n\r\n#if 0\r\nstatic int detect_and_judge_module_version(void *usb_handle) {\r\n    static uint8_t version[64] = {'\\0'};\r\n\r\n    if (usb_handle && version[0] == '\\0') {\r\n        retrieve_soft_revision(usb_handle, version, sizeof(version));\r\n        if (version[0]) {\r\n            size_t i = 0;\r\n            size_t length = strlen((const char *)version) - strlen(\"R00A00\");\r\n            dbg_time(\"old software version: %s\\n\", version);\r\n            for (i = 0; i < length; i++) {\r\n                if (version[i] == 'R' && isdigit(version[i+1]) &&  isdigit(version[i+2])\r\n                    && version[i+3] == 'A'  && isdigit(version[i+4]) &&  isdigit(version[i+5]))\r\n                {\r\n                    version[i] = '\\0';\r\n                    //dbg_time(\"old hardware version: %s\\n\", mobile_software_revision);\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if (version[0])\r\n        return 0;\r\n\r\n    error_return();\r\n}\r\n#endif\r\n\r\nFILE *loghandler = NULL;\r\n#ifdef FIREHOSE_ENABLE\r\nint firehose_main_entry(int argc, char *argv[])\r\n#else\r\nint main(int argc, char *argv[])\r\n#endif\r\n{\r\n    int opt;\r\n    int check_hash = 1;\r\n    int retval;\r\n    void *usb_handle = NULL;\r\n    int idVendor = 0, idProduct = 0, interfaceNum = 0;\r\n    int edl_retry = 30; // SDX55 require long time by now 20190412\r\n    double start;\r\n\r\n    // char *firehose_mbn = NULL;\r\n    int usb3_speed;\r\n    struct timespec usb3_atime;\r\n    int usb2tcp_port = 0;\r\n    char filename[128] = {'\\0'};\r\n    char *usbmon_logfile = NULL;\r\n\r\n    char *file_message = malloc(MAX_PATH);\r\n    if (file_message == NULL)\r\n    {\r\n        return -1;\r\n    }\r\n\r\n    char *firehose_mbn = malloc(MAX_PATH);\r\n    if (firehose_mbn == NULL)\r\n    {\r\n        safe_free(file_message);\r\n        return -1;\r\n    }\r\n\r\n    char *firehose_dir = malloc(MAX_PATH);\r\n    if (firehose_dir == NULL)\r\n    {\r\n        safe_free(file_message);\r\n        safe_free(firehose_mbn);\r\n        return -1;\r\n    }\r\n\r\n    char *module_port_name = malloc(MAX_PATH);\r\n    if (module_port_name == NULL)\r\n    {\r\n        safe_free(file_message);\r\n        safe_free(firehose_dir);\r\n        safe_free(file_message);\r\n        safe_free(firehose_mbn);\r\n        return -1;\r\n    }\r\n\r\n    char *module_sys_path = malloc(MAX_PATH);\r\n    if (module_sys_path == NULL)\r\n    {\r\n        safe_free(file_message);\r\n        safe_free(module_port_name);\r\n        safe_free(firehose_dir);\r\n        safe_free(file_message);\r\n        safe_free(firehose_mbn);\r\n        return -1;\r\n    }\r\n\r\n    memset(firehose_dir, 0, MAX_PATH);\r\n    memset(module_port_name, 0, MAX_PATH);\r\n    memset(module_sys_path, 0, MAX_PATH);\r\n\r\n    // firehose_dir[0] = module_port_name[0] = module_sys_path[0] = '\\0';\r\n\r\n    /* set file priviledge mask 0 */\r\n    umask(0);\r\n    /*build V1.0.8*/\r\n    dbg_time(\"Version: QFirehose_Linux_Android_V1.4.21\\n\"); // when release,\r\n                                                            // rename to V1.X\r\n#ifndef __clang__\r\n    dbg_time(\"Builded: %s %s\\n\", __DATE__, __TIME__);\r\n#endif\r\n\r\n#ifdef ANDROID\r\n    struct passwd *pd;\r\n    pd = getpwuid(getuid());\r\n    dbg_time(\"------------------\\n\");\r\n    dbg_time(\"User:\\t %s\\n\", pd->pw_name);\r\n    struct group *group;\r\n    group = getgrgid(pd->pw_gid);\r\n    dbg_time(\"Group:\\t %s\\n\", group->gr_name);\r\n    dbg_time(\"------------------\\n\");\r\n#if 0 // not all customers need this function\r\n    loghandler = fopen(\"/data/upgrade.log\", \"w+\");\r\n#endif\r\n    if (loghandler) dbg_time(\"upgrade log will be sync to /data/upgrade.log\\n\");\r\n#endif\r\n\r\n    optind = 1;\r\n    while (-1 != (opt = getopt(argc, argv, \"f:p:z:s:l:u:d:nevhr\")))\r\n    {\r\n        switch (opt)\r\n        {\r\n            case 'n': check_hash = 0; break;\r\n            case 'l':\r\n                if (loghandler) fclose(loghandler);\r\n                snprintf(filename, sizeof(filename), \"%.80s/qfirehose_%lu.log\", optarg, time(NULL));\r\n                loghandler = fopen(filename, \"w+\");\r\n                if (loghandler) dbg_time(\"upgrade log will be sync to %s\\n\", filename);\r\n                break;\r\n            case 'f': {\r\n                strncpy(file_message, optarg, MAX_PATH - 1);\r\n                if (strstr(file_message, \".mbn\") != NULL || strstr(file_message, \".elf\") != NULL)\r\n                {\r\n                    g_is2mdn_path = 1;\r\n                    char *tmp = strrchr(file_message, '/');\r\n                    strncpy(firehose_mbn, tmp + 1, strlen(tmp) - 1);\r\n                    strncpy(firehose_dir, file_message, strlen(file_message) - strlen(tmp));\r\n                    dbg_time(\"f pargram: \"\r\n                             \"g_is2mdn_path=[%d],file_message=[%s],firehose_mbn=[%s],\"\r\n                             \"firehose_dir=[%s]\\n\",\r\n                             g_is2mdn_path, file_message, firehose_mbn, firehose_dir);\r\n                    break;\r\n                }\r\n                strncpy(firehose_dir, file_message, strlen(file_message));\r\n                break;\r\n            }\r\n            case 'p':\r\n                strncpy(module_port_name, optarg, MAX_PATH - 1);\r\n                if (!strcmp(module_port_name, \"9008\"))\r\n                {\r\n                    usb2tcp_port = atoi(module_port_name);\r\n                    module_port_name[0] = '\\0';\r\n                }\r\n                break;\r\n            case 's':\r\n                strncpy(module_sys_path, optarg, MAX_PATH - 1);\r\n                int len = strlen(optarg);\r\n                if (len > 256)\r\n                {\r\n                    safe_free(module_port_name);\r\n                    safe_free(module_sys_path);\r\n                    safe_free(usbmon_logfile);\r\n                    safe_free(firehose_dir);\r\n                    safe_free(file_message);\r\n                    safe_free(firehose_mbn);\r\n                    printf(\"optarg length is longer than 256\\n\");\r\n                    return -1;\r\n                }\r\n\r\n                if (module_sys_path[strlen(optarg) - 1] == '/') module_sys_path[strlen(optarg) - 1] = '\\0';\r\n                break;\r\n            case 'z': qusb_zlp_mode = !!atoi(optarg); break;\r\n            case 'e': q_erase_all_before_download = 1; break;\r\n            case 'u':\r\n                usbmon_logfile = strdup(optarg);\r\n                if (usbmon_logfile == NULL)\r\n                {\r\n                    printf(\"usbmon_logfile is NULL\\n\");\r\n                    return -1;\r\n                }\r\n                break;\r\n            case 'd':\r\n                q_device_type = strdup(optarg);\r\n                if (q_device_type == NULL)\r\n                {\r\n                    printf(\"q_device_type is NULL\\n\");\r\n                    return -1;\r\n                }\r\n                break;\r\n            case 'v': q_module_packet_sign = 1; break;\r\n            case 'r':\r\n                g_from_ecm_to_rndis = 1;\r\n                printf(\"will use rndis mode [%d]\\r\\n\", g_from_ecm_to_rndis);\r\n                break;\r\n            case 'h': usage(EXIT_SUCCESS, argv[0]); break;\r\n            default: break;\r\n        }\r\n    }\r\n\r\n    if (usbmon_logfile) ql_capture_usbmon_log(usbmon_logfile);\r\n\r\n    update_transfer_bytes(0);\r\n    if (usb2tcp_port) goto _usb2tcp_start;\r\n\r\n    if (firehose_dir[0] == '\\0')\r\n    {\r\n        usage(EXIT_SUCCESS, argv[0]);\r\n        update_transfer_bytes(-1);\r\n        error_return();\r\n    }\r\n\r\n    if (access(firehose_dir, R_OK))\r\n    {\r\n        dbg_time(\"fail to access %s, errno: %d (%s)\\n\", firehose_dir, errno, strerror(errno));\r\n        update_transfer_bytes(-1);\r\n        safe_free(firehose_dir);\r\n        safe_free(module_port_name);\r\n        safe_free(module_sys_path);\r\n        safe_free(usbmon_logfile);\r\n        safe_free(file_message);\r\n        safe_free(firehose_mbn);\r\n        error_return();\r\n    }\r\n\r\n    opt = strlen(firehose_dir);\r\n    if (firehose_dir[opt - 1] == '/')\r\n    {\r\n        firehose_dir[opt - 1] = '\\0';\r\n    }\r\n\r\n    char buff[256] = {0};\r\n    int file_name_count = 0;\r\n\r\n    if (strstr(firehose_dir, \".zip\") || strstr(firehose_dir, \".7z\"))\r\n    {\r\n        if (strstr(firehose_dir, \".zip\"))\r\n        {\r\n            is_upgrade_fimeware_only_zip = 1;\r\n        }\r\n\r\n        unlink(ZIP_INFO);\r\n        memset(zip_cmd_buf, 0, sizeof(zip_cmd_buf));\r\n        if (is_upgrade_fimeware_only_zip)\r\n        {\r\n            snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"unzip -l -q %.240s > %s\", firehose_dir, ZIP_INFO);\r\n        }\r\n        else\r\n        {\r\n            snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"7z l %.240s > %s\", firehose_dir, ZIP_INFO);\r\n        }\r\n        if (-1 == system(zip_cmd_buf))\r\n        {\r\n            dbg_time(\"%s system return error\\n\", __func__);\r\n            return -1;\r\n        }\r\n        usleep(1000);\r\n\r\n        char *p = strrchr(firehose_dir, '/'); // firehose_dir is the absolute path of the zip/7z\r\n                                              // file\r\n        if (p)\r\n        {\r\n            if (strstr(firehose_dir, \".zip\"))\r\n            {\r\n                strncpy(firehose_zip_name, p + 1, strlen(p) - 4 - 1); // 4(.zip); 1(/)\r\n            }\r\n            else\r\n            {\r\n                strncpy(firehose_zip_name, p + 1, strlen(p) - 3 - 1); // 3(.7z); 1(/)\r\n            }\r\n        }\r\n        else\r\n        {\r\n            if (strstr(firehose_dir, \".zip\"))\r\n            {\r\n                strncpy(firehose_zip_name, firehose_dir,\r\n                        strlen(firehose_dir) - 4); // QFirehose -f RG520NEUDCR01A01M4G_01.001.01.001.zip\r\n            }\r\n            else\r\n            {\r\n                strncpy(firehose_zip_name, firehose_dir,\r\n                        strlen(firehose_dir) - 3); // QFirehose -f RG520NEUDCR01A01M4G_01.001.01.001.7z\r\n            }\r\n        }\r\n\r\n        dbg_time(\"firehose_zip_name:%s\\n\", firehose_zip_name); // RG520NEUDCR01A01M4G_01.001.01.001\r\n        is_upgrade_fimeware_zip_7z = 1;                        // Judging as a zip/7z package upgrade\r\n\r\n        if (!access(ZIP_INFO, F_OK))\r\n        {\r\n            char *p0 = NULL;\r\n            char *p01 = NULL;\r\n            char *p1 = NULL;\r\n            char *p2 = NULL;\r\n            char *p3 = NULL;\r\n            char *p4 = NULL;\r\n            FILE *fp = fopen(ZIP_INFO, \"rb\");\r\n            if (fp == NULL)\r\n            {\r\n                dbg_time(\"fail to fopen(%s), error: %d (%s)\\n\", ZIP_INFO, errno, strerror(errno));\r\n                return -1;\r\n            }\r\n\r\n            while (fgets(buff, sizeof(buff), fp))\r\n            {\r\n                p0 = strstr(buff, firehose_zip_name);\r\n                if (p0)\r\n                {\r\n                    int length_debug1 = strlen(p0);\r\n                    if (p0[length_debug1 - 1] == 0x0a) length_debug1 -= 1;\r\n\r\n                    memmove(file_name_b.file_backup_c[file_name_count].zip_file_dir_backup, p0, length_debug1);\r\n\r\n                    p01 = strrchr(p0, '/');\r\n                    if (p01 == NULL) continue;\r\n\r\n                    if (p01[0] == '/' && p01[1] == '\\0')\r\n                    {\r\n                        continue;\r\n                    }\r\n\r\n                    is_firehose_zip_7z_name_exit = 1; // Determine which type of package it is and whether it should be placed\r\n                                                      // in one folder or several files or folders after decompression\r\n\r\n                    int length_debug = strlen(p01);\r\n                    if (p01[length_debug - 1] == 0x0a) length_debug -= 1;\r\n\r\n                    memmove(file_name_b.file_backup_c[file_name_count].zip_file_name_backup, p01 + 1, length_debug - 1);\r\n\r\n                    file_name_count++;\r\n                    file_name_b.file_name_count = file_name_count;\r\n                }\r\n                else\r\n                {\r\n                    p1 = strstr(buff, \"contents.xml\");\r\n                    p2 = strstr(buff, \"md5.txt\");\r\n                    p3 = strstr(buff, \"update\");\r\n\r\n                    if (p1)\r\n                    {\r\n                        int length_debug1 = strlen(p1);\r\n                        if (p1[length_debug1 - 1] == 0x0a) length_debug1 -= 1;\r\n\r\n                        memmove(file_name_b.file_backup_c[file_name_count].zip_file_dir_backup, p1, length_debug1);\r\n\r\n                        int length_debug = strlen(p1);\r\n                        if (p1[length_debug - 1] == 0x0a) length_debug -= 1;\r\n\r\n                        memmove(file_name_b.file_backup_c[file_name_count].zip_file_name_backup, p1 + 1, length_debug - 1);\r\n\r\n                        file_name_count++;\r\n                        file_name_b.file_name_count = file_name_count;\r\n                    }\r\n                    else if (p2)\r\n                    {\r\n                        int length_debug1 = strlen(p2);\r\n                        if (p2[length_debug1 - 1] == 0x0a) length_debug1 -= 1;\r\n\r\n                        memmove(file_name_b.file_backup_c[file_name_count].zip_file_dir_backup, p2, length_debug1);\r\n\r\n                        int length_debug = strlen(p2);\r\n                        if (p2[length_debug - 1] == 0x0a) length_debug -= 1;\r\n\r\n                        memmove(file_name_b.file_backup_c[file_name_count].zip_file_name_backup, p2 + 1, length_debug - 1);\r\n\r\n                        file_name_count++;\r\n                        file_name_b.file_name_count = file_name_count;\r\n                    }\r\n                    else if (p3)\r\n                    {\r\n                        int length_debug1 = strlen(p3);\r\n                        if (p3[length_debug1 - 1] == 0x0a) length_debug1 -= 1;\r\n\r\n                        memmove(file_name_b.file_backup_c[file_name_count].zip_file_dir_backup, p3, length_debug1);\r\n\r\n                        p4 = strrchr(p3, '/');\r\n                        if (p4 == NULL) continue;\r\n\r\n                        if (p4[0] == '/' && p4[1] == '\\0')\r\n                        {\r\n                            dbg_time(\"continue..\\n\");\r\n                            continue;\r\n                        }\r\n\r\n                        int length_debug = strlen(p4);\r\n                        if (p4[length_debug - 1] == 0x0a) length_debug -= 1;\r\n\r\n                        memmove(file_name_b.file_backup_c[file_name_count].zip_file_name_backup, p4 + 1, length_debug - 1);\r\n\r\n                        file_name_count++;\r\n                        file_name_b.file_name_count = file_name_count;\r\n                    }\r\n                }\r\n            }\r\n\r\n            fclose(fp);\r\n            unlink(ZIP_INFO);\r\n\r\n            if (!is_firehose_zip_7z_name_exit)\r\n            {\r\n                memset(firehose_zip_name, 0, sizeof(firehose_zip_name));\r\n            }\r\n\r\n            if (firehose_zip_name[0] == '\\0')\r\n            {\r\n                strcpy(firehose_unzip_full_dir, \"/tmp\");\r\n            }\r\n            else\r\n            {\r\n                snprintf(firehose_unzip_full_dir, sizeof(firehose_unzip_full_dir), \"/tmp/%.76s\", firehose_zip_name);\r\n            }\r\n\r\n            dbg_time(\"%s firehose_unzip_full_dir:%s\\n\", __func__, firehose_unzip_full_dir);\r\n        }\r\n    }\r\n\r\n    if (check_hash && md5_check(firehose_dir))\r\n    {\r\n        update_transfer_bytes(-1);\r\n        safe_free(firehose_dir);\r\n        safe_free(module_port_name);\r\n        safe_free(module_sys_path);\r\n        safe_free(usbmon_logfile);\r\n        safe_free(file_message);\r\n        safe_free(firehose_mbn);\r\n        error_return();\r\n    }\r\n\r\n    if (!g_is2mdn_path) firehose_mbn = find_firehose_mbn(&firehose_dir, MAX_PATH);\r\n    if (!firehose_mbn)\r\n    {\r\n        update_transfer_bytes(-1);\r\n        safe_free(module_port_name);\r\n        safe_free(module_sys_path);\r\n        safe_free(usbmon_logfile);\r\n        safe_free(firehose_dir);\r\n        safe_free(file_message);\r\n        safe_free(firehose_mbn);\r\n        error_return();\r\n    }\r\n    dbg_time(\"%s %s\\n\", __func__, firehose_mbn);\r\n\r\n    if (module_port_name[0] && !strncmp(module_port_name, \"/dev/mhi\", strlen(\"/dev/mhi\")))\r\n    {\r\n        if (qpcie_open(firehose_dir, firehose_mbn, module_port_name))\r\n        {\r\n            update_transfer_bytes(-1);\r\n            safe_free(module_port_name);\r\n            safe_free(module_sys_path);\r\n            safe_free(usbmon_logfile);\r\n            safe_free(firehose_dir);\r\n            safe_free(file_message);\r\n            safe_free(firehose_mbn);\r\n            error_return();\r\n        }\r\n\r\n        usb_handle = &edl_pcie_mhifd;\r\n        start = get_now();\r\n        goto __firehose_main;\r\n    }\r\n    else if (module_port_name[0] && strstr(module_port_name, \":9008\"))\r\n    {\r\n        strcpy(module_sys_path, module_port_name);\r\n        goto __edl_retry;\r\n    }\r\n\r\n_usb2tcp_start:\r\n    if (module_sys_path[0] && access(module_sys_path, R_OK))\r\n    {\r\n        dbg_time(\"fail to access %s, errno: %d (%s)\\n\", module_sys_path, errno, strerror(errno));\r\n        update_transfer_bytes(-1);\r\n        safe_free(module_port_name);\r\n        safe_free(module_sys_path);\r\n        safe_free(usbmon_logfile);\r\n        safe_free(firehose_dir);\r\n        safe_free(file_message);\r\n        safe_free(firehose_mbn);\r\n        error_return();\r\n    }\r\n\r\n    if (module_port_name[0] && access(module_port_name, R_OK | W_OK))\r\n    {\r\n        dbg_time(\"fail to access %s, errno: %d (%s)\\n\", module_port_name, errno, strerror(errno));\r\n        update_transfer_bytes(-1);\r\n        safe_free(module_port_name);\r\n        safe_free(module_sys_path);\r\n        safe_free(usbmon_logfile);\r\n        safe_free(firehose_dir);\r\n        safe_free(file_message);\r\n        safe_free(firehose_mbn);\r\n        error_return();\r\n    }\r\n\r\n    if (module_sys_path[0] == '\\0' && module_port_name[0] != '\\0')\r\n    {\r\n        // get sys path by port name\r\n        quectel_get_syspath_name_by_ttyport(module_port_name, module_sys_path, MAX_PATH);\r\n    }\r\n\r\n    g_is_module_adb_entry_edl = 0;\r\n\r\n    if (module_sys_path[0] == '\\0')\r\n    {\r\n        int module_count = auto_find_quectel_modules(module_sys_path, MAX_PATH, NULL, NULL);\r\n        if (module_count <= 0)\r\n        {\r\n            dbg_time(\"Quectel module not found\\n\");\r\n            update_transfer_bytes(-1);\r\n            safe_free(module_port_name);\r\n            safe_free(module_sys_path);\r\n            safe_free(usbmon_logfile);\r\n            safe_free(firehose_dir);\r\n            safe_free(file_message);\r\n            safe_free(firehose_mbn);\r\n            error_return();\r\n        }\r\n        else if (module_count == 1)\r\n        {\r\n            if (g_is_module_adb_entry_edl > 0)\r\n            {\r\n                switch_to_edl_mode_in_adb_way();\r\n            }\r\n        }\r\n        else\r\n        {\r\n            dbg_time(\"There are multiple quectel modules in system, Please use <-s \"\r\n                     \"/sys/bus/usb/devices/xx> specify which module you want to \"\r\n                     \"upgrade!\\n\");\r\n            dbg_time(\"The module's </sys/bus/usb/devices/xx> path was printed in the \"\r\n                     \"previous log!\\n\");\r\n            update_transfer_bytes(-1);\r\n            safe_free(module_port_name);\r\n            safe_free(module_sys_path);\r\n            safe_free(usbmon_logfile);\r\n            safe_free(firehose_dir);\r\n            safe_free(file_message);\r\n            safe_free(firehose_mbn);\r\n            error_return();\r\n        }\r\n    }\r\n\r\n__edl_retry:\r\n    qusb_read_speed_atime(module_sys_path, &usb3_atime, &usb3_speed);\r\n    while (edl_retry-- > 0)\r\n    {\r\n        usb_handle = qusb_noblock_open(module_sys_path, &idVendor, &idProduct, &interfaceNum);\r\n\r\n        if (usb_handle)\r\n        {\r\n            clock_gettime(CLOCK_REALTIME, &usb3_atime);\r\n        }\r\n        else\r\n        {\r\n            sleep(1); // in reset sate, wait connect\r\n            if (usb3_speed >= 5000 && access(module_sys_path, R_OK) && errno_nodev())\r\n            {\r\n                if (auto_find_quectel_modules(module_sys_path, MAX_PATH, \"5c6/9008/\", &usb3_atime) > 1)\r\n                {\r\n                    dbg_time(\"There are multiple quectel EDL modules in system!\\n\");\r\n                    update_transfer_bytes(-1);\r\n                    safe_free(module_port_name);\r\n                    safe_free(module_sys_path);\r\n                    safe_free(usbmon_logfile);\r\n                    safe_free(firehose_dir);\r\n                    safe_free(file_message);\r\n                    safe_free(firehose_mbn);\r\n                    error_return();\r\n                }\r\n            }\r\n            continue;\r\n        }\r\n\r\n#if 0\r\n        if (idVendor == 0x2c7c && interfaceNum > 1) {\r\n            if (detect_and_judge_module_version(usb_handle)) {\r\n                // update_transfer_bytes(-1);\r\n                /* do not return here, this command will fail when modem is not ready */\r\n                // error_return();\r\n            }\r\n        }\r\n#endif\r\n\r\n        if (interfaceNum == 1)\r\n        {\r\n            if ((idVendor == 0x2C7C) && (idProduct == 0x0800))\r\n            {\r\n                // although 5G module stay in dump mode, after send edl command, it also\r\n                // can enter edl mode\r\n                dbg_time(\"5G module stay in dump mode!\\n\");\r\n            }\r\n            else\r\n            {\r\n                break;\r\n            }\r\n            dbg_time(\"something went wrong???, why only one interface left\\n\");\r\n        }\r\n\r\n        switch_to_edl_mode(usb_handle);\r\n        qusb_noblock_close(usb_handle);\r\n        usb_handle = NULL;\r\n        sleep(1); // wait usb disconnect and re-connect\r\n    }\r\n\r\n    if (usb_handle == NULL)\r\n    {\r\n        update_transfer_bytes(-1);\r\n        safe_free(module_port_name);\r\n        safe_free(module_sys_path);\r\n        safe_free(usbmon_logfile);\r\n        safe_free(firehose_dir);\r\n        safe_free(file_message);\r\n        safe_free(firehose_mbn);\r\n        error_return();\r\n    }\r\n\r\n    if (usb2tcp_port)\r\n    {\r\n        retval = usb2tcp_main(usb_handle, usb2tcp_port, qusb_zlp_mode);\r\n        qusb_noblock_close(usb_handle);\r\n        safe_free(module_port_name);\r\n        safe_free(module_sys_path);\r\n        safe_free(usbmon_logfile);\r\n        safe_free(firehose_dir);\r\n        safe_free(file_message);\r\n        safe_free(firehose_mbn);\r\n        return retval;\r\n    }\r\n\r\n    start = get_now();\r\n    retval = sahara_main(firehose_dir, firehose_mbn, usb_handle, idVendor == 0x05c6);\r\n\r\n    if (!retval)\r\n    {\r\n        if (idVendor != 0x05C6)\r\n        {\r\n            sleep(1);\r\n            stream_download(firehose_dir, usb_handle, qusb_zlp_mode);\r\n            qusb_noblock_close(usb_handle);\r\n            sleep(10); // EM05-G switching to download mode is slow and increases the waiting time\r\n                       // to 10 seconds\r\n            goto __edl_retry;\r\n        }\r\n\r\n    __firehose_main:\r\n        retval = firehose_main(firehose_dir, usb_handle, qusb_zlp_mode);\r\n        if (retval == 0)\r\n        {\r\n            get_duration(start);\r\n        }\r\n    }\r\n\r\n    qusb_noblock_close(usb_handle);\r\n\r\n    safe_free(firehose_dir);\r\n    safe_free(module_port_name);\r\n    safe_free(module_sys_path);\r\n    safe_free(file_message);\r\n    safe_free(firehose_mbn);\r\n\r\n    dbg_time(\"Upgrade module %s.\\n\", retval == 0 ? \"successfully\" : \"failed\");\r\n    if (loghandler) fclose(loghandler);\r\n    if (retval) update_transfer_bytes(-1);\r\n    if (usbmon_logfile) ql_stop_usbmon_log();\r\n    unlink(ZIP_PROCESS_INFO);\r\n\r\n    return retval;\r\n}\r\n\r\ndouble get_now()\r\n{\r\n    struct timeval tv;\r\n    gettimeofday(&tv, NULL);\r\n    return (double)tv.tv_sec + (double)tv.tv_usec / 1000000;\r\n}\r\n\r\nvoid get_duration(double start) { dbg_time(\"THE TOTAL DOWNLOAD TIME IS %.3f s\\n\", (get_now() - start)); }\r\n\r\nvoid set_transfer_allbytes(long long bytes)\r\n{\r\n    transfer_bytes = 0;\r\n    all_bytes_to_transfer = bytes;\r\n}\r\n\r\nint update_progress_msg(int percent);\r\nint update_progress_file(int percent);\r\n/*\r\nreturn percent\r\n*/\r\nint update_transfer_bytes(long long bytes_cur)\r\n{\r\n    static int last_percent = -1;\r\n    int percent = 0;\r\n\r\n    if (bytes_cur == -1 || bytes_cur == 0)\r\n    {\r\n        percent = bytes_cur;\r\n    }\r\n    else\r\n    {\r\n        transfer_bytes += bytes_cur;\r\n        percent = (transfer_bytes * 100) / all_bytes_to_transfer;\r\n    }\r\n\r\n    if (percent != last_percent)\r\n    {\r\n        last_percent = percent;\r\n#ifdef USE_IPC_FILE\r\n        update_progress_file(percent);\r\n#endif\r\n#ifdef USE_IPC_MSG\r\n        update_progress_msg(percent);\r\n#endif\r\n    }\r\n\r\n    return percent;\r\n}\r\n\r\nvoid show_progress()\r\n{\r\n    static int percent = 0;\r\n\r\n    if (all_bytes_to_transfer) percent = (transfer_bytes * 100) / all_bytes_to_transfer;\r\n    dbg_time(\"upgrade progress %d%% %lld/%lld\\n\", percent, transfer_bytes, all_bytes_to_transfer);\r\n}\r\n\r\n#ifdef USE_IPC_FILE\r\n#define IPC_FILE_ANDROID \"/data/update.conf\"\r\n#define IPC_FILE_LINUX \"/tmp/update.conf\"\r\nint update_progress_file(int percent)\r\n{\r\n    static int ipcfd = -1;\r\n    char buff[16];\r\n\r\n    if (ipcfd < 0)\r\n    {\r\n#ifdef ANDROID\r\n        const char *ipc_file = IPC_FILE_ANDROID;\r\n#else\r\n        const char *ipc_file = IPC_FILE_LINUX;\r\n#endif\r\n        /* Have set umask previous, no need to call fchmod */\r\n        ipcfd = open(ipc_file, O_TRUNC | O_CREAT | O_WRONLY | O_NONBLOCK, S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH);\r\n        if (ipcfd < 0)\r\n        {\r\n            dbg_time(\"Fail to open(O_WRONLY) %s: %s\\n\", ipc_file, strerror(errno));\r\n            return -1;\r\n        }\r\n    }\r\n\r\n    lseek(ipcfd, 0, SEEK_SET);\r\n    snprintf(buff, sizeof(buff), \"%d\", percent);\r\n    if (write(ipcfd, buff, strlen(buff)) < 0) dbg_time(\"fail to write upgrade progress into %s: %s\\n\", ipc_file, strerror(errno));\r\n\r\n    if (percent == 100 || percent < 0) close(ipcfd);\r\n    return 0;\r\n}\r\n#endif\r\n\r\n#ifdef USE_IPC_MSG\r\n#define MSGBUFFSZ 16\r\nstruct message\r\n{\r\n    long mtype;\r\n    char mtext[MSGBUFFSZ];\r\n};\r\n\r\n#define MSG_FILE \"/etc/passwd\"\r\n#define MSG_TYPE_IPC 1\r\nstatic int msg_get()\r\n{\r\n    key_t key = ftok(MSG_FILE, 'a');\r\n    int msgid = msgget(key, IPC_CREAT | 0644);\r\n\r\n    if (msgid < 0)\r\n    {\r\n        dbg_time(\"msgget fail: key %d, %s\\n\", key, strerror(errno));\r\n        return -1;\r\n    }\r\n    return msgid;\r\n}\r\n\r\nstatic int msg_rm(int msgid) { return msgctl(msgid, IPC_RMID, 0); }\r\n\r\nstatic int msg_send(int msgid, long type, const char *msg)\r\n{\r\n    struct message info;\r\n    info.mtype = type;\r\n    snprintf(info.mtext, MSGBUFFSZ, \"%s\", msg);\r\n    if (msgsnd(msgid, (void *)&info, MSGBUFFSZ, IPC_NOWAIT) < 0)\r\n    {\r\n        dbg_time(\"msgsnd faild: msg %s, %s\\n\", msg, strerror(errno));\r\n        return -1;\r\n    }\r\n    return 0;\r\n}\r\n\r\nstatic int msg_recv(int msgid, struct message *info)\r\n{\r\n    if (msgrcv(msgid, (void *)info, MSGBUFFSZ, info->mtype, IPC_NOWAIT) < 0)\r\n    {\r\n        dbg_time(\"msgrcv faild: type %ld, %s\\n\", info->mtype, strerror(errno));\r\n        return -1;\r\n    }\r\n    return 0;\r\n}\r\n\r\n/**\r\n * this function will not delete the msg queue\r\n */\r\nint update_progress_msg(int percent)\r\n{\r\n    char buff[MSGBUFFSZ];\r\n    int msgid = msg_get();\r\n    if (msgid < 0) return -1;\r\n    snprintf(buff, sizeof(buff), \"%d\", percent);\r\n\r\n#ifndef IPC_TEST\r\n    return msg_send(msgid, MSG_TYPE_IPC, buff);\r\n#else\r\n    msg_send(msgid, MSG_TYPE_IPC, buff);\r\n    struct message info;\r\n    info.mtype = MSG_TYPE_IPC;\r\n    msg_recv(msgid, &info);\r\n    printf(\"msg queue read: %s\\n\", info.mtext);\r\n#endif\r\n}\r\n#endif\r\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/sahara.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software.\r\n    Under no circumstances may customers modify, demonstrate, use, deliver\r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include \"usb_linux.h\"\r\n#include \"sahara.h\"\r\n\r\nstatic uint32_t le_uint32(uint32_t v32)\r\n{\r\n    const int is_bigendian = 1;\r\n    uint32_t tmp = v32;\r\n    if ((*(char *)&is_bigendian) == 0)\r\n    {\r\n        unsigned char *s = (unsigned char *)(&v32);\r\n        unsigned char *d = (unsigned char *)(&tmp);\r\n        d[0] = s[3];\r\n        d[1] = s[2];\r\n        d[2] = s[1];\r\n        d[3] = s[0];\r\n    }\r\n    return tmp;\r\n}\r\n\r\nstatic uint64_t le_uint64(uint64_t v64)\r\n{\r\n    const int is_bigendian = 1;\r\n    uint64_t tmp = v64;\r\n    if ((*(char *)&is_bigendian) == 0)\r\n    {\r\n        unsigned char *s = (unsigned char *)(&v64);\r\n        unsigned char *d = (unsigned char *)(&tmp);\r\n        d[0] = s[7];\r\n        d[1] = s[6];\r\n        d[2] = s[5];\r\n        d[3] = s[4];\r\n        d[4] = s[3];\r\n        d[5] = s[2];\r\n        d[6] = s[1];\r\n        d[7] = s[0];\r\n    }\r\n    return tmp;\r\n}\r\n\r\n#define dbg(log_level, fmt, arg...) \\\r\n    do                              \\\r\n    {                               \\\r\n        dbg_time(fmt \"\\n\", ##arg);  \\\r\n    } while (0)\r\n\r\nstatic int sahara_tx_data(void *usb_handle, void *tx_buffer, size_t bytes_to_send)\r\n{\r\n    int need_zlp = 0; // zlp is not mandatory\r\n    return qusb_noblock_write(usb_handle, tx_buffer, bytes_to_send, bytes_to_send, 3000, need_zlp);\r\n}\r\n\r\nint qusb_use_usbfs_interface(const void *handle);\r\nstatic int sahara_rx_data(void *usb_handle, void *rx_buffer, size_t bytes_to_read)\r\n{\r\n    q_sahara_packet_h *command_packet_header = NULL;\r\n    size_t bytes_read = 0;\r\n\r\n    const char *q_sahara_cmd_str[Q_SAHARA_NINETEEN] = {\r\n        \"Q_SAHARA_ZERO\",      //          = 0x00,\r\n        \"Q_SAHARA_ONE\",       //            = 0x01, // sent from target to host\r\n        \"Q_SAHARA_TWO\",       //       = 0x02, // sent from host to target\r\n        \"Q_SAHARA_THREE\",     //        = 0x03, // sent from target to host\r\n        \"Q_SAHARA_FOUR\",      //     = 0x04, // sent from target to host\r\n        \"Q_SAHARA_FIVE\",      //             = 0x05, // sent from host to target\r\n        \"Q_SAHARA_SIX\",       //        = 0x06, // sent from target to host\r\n        \"Q_SAHARA_SEVEN\",     //            = 0x07, // sent from host to target\r\n        \"Q_SAHARA_EIGTH\",     //       = 0x08, // sent from target to host\r\n        \"Q_SAHARA_NINE\",      //     = 0x09, // sent from target to host\r\n        \"Q_SAHARA_TEN\",       //      = 0x0A, // sent from host to target\r\n        \"Q_SAHARA_ELEVEN\",    //        = 0x0B, // sent from target to host\r\n        \"Q_SAHARA_TWELEVE\",   //  = 0x0C, // sent from host to target\r\n        \"Q_SAHARA_THIRTEEN\",  //         = 0x0D, // sent from host to target\r\n        \"Q_SAHARA_FOURTEEN\",  //    = 0x0E, // sent from target to host\r\n        \"Q_SAHARA_FIFTEEN\",   //    = 0x0F, // sent from host to target\r\n        \"Q_SAHARA_SIXTEEN\",   // \t= 0x10, // sent from target to host\r\n        \"Q_SAHARA_SEVENTEEN\", // \t\t= 0x11, // sent from host to target\r\n        \"Q_SAHARA_EIGHTEEN\",  // \t\t= 0x12,\r\n    };\r\n\r\n    if (0 == bytes_to_read)\r\n    {\r\n        if (qusb_use_usbfs_interface(usb_handle))\r\n        {\r\n            bytes_read = qusb_noblock_read(usb_handle, rx_buffer, Q_SAHARA_RAW_BUF_SZ, 0, 5000);\r\n            if (bytes_read < sizeof(q_sahara_packet_h)) return 0;\r\n        }\r\n        else\r\n        {\r\n            bytes_read =\r\n                qusb_noblock_read(usb_handle, rx_buffer, sizeof(q_sahara_packet_h), 0, 5000);\r\n            if (bytes_read != sizeof(q_sahara_packet_h)) return 0;\r\n        }\r\n\r\n        command_packet_header = (q_sahara_packet_h *)rx_buffer;\r\n        if (le_uint32(command_packet_header->q_cmd) < Q_SAHARA_NINETEEN)\r\n        {\r\n            dbg(LOG_EVENT, \"<=== %s\", q_sahara_cmd_str[le_uint32(command_packet_header->q_cmd)]);\r\n\r\n            if (!qusb_use_usbfs_interface(usb_handle))\r\n            {\r\n                bytes_read += qusb_noblock_read(\r\n                    usb_handle, (uint8_t *)rx_buffer + sizeof(q_sahara_packet_h),\r\n                    le_uint32(command_packet_header->q_len) - sizeof(q_sahara_packet_h), 0, 5000);\r\n            }\r\n\r\n            if (bytes_read != (le_uint32(command_packet_header->q_len)))\r\n            {\r\n                dbg(LOG_INFO, \"Read %zd bytes, Header indicates q_cmd %d and packet q_len %d bytes\",\r\n                    bytes_read, le_uint32(command_packet_header->q_cmd),\r\n                    le_uint32(command_packet_header->q_len));\r\n                return 0;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            dbg(LOG_EVENT, \"<=== SAHARA_CMD_UNKONOW_%d\", le_uint32(command_packet_header->q_cmd));\r\n            return 0;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        bytes_read = qusb_noblock_read(usb_handle, rx_buffer, bytes_to_read, bytes_to_read, 5000);\r\n    }\r\n\r\n    return 1;\r\n}\r\n\r\nstatic int send_reset_command(void *usb_handle, void *tx_buffer)\r\n{\r\n    struct sahara_pkt *sahara_reset;\r\n    sahara_reset = (struct sahara_pkt *)tx_buffer;\r\n    sahara_reset->q_header.q_cmd = le_uint32(Q_SAHARA_SEVEN);\r\n    sahara_reset->q_header.q_len =\r\n        le_uint32(sizeof(sahara_reset->q_sahara_reset_packet) + sizeof(q_sahara_packet_h));\r\n\r\n    /* Send the Reset Request */\r\n    dbg(LOG_EVENT, \"SAHARA_RESET ===>\");\r\n    if (0 ==\r\n        sahara_tx_data(usb_handle, tx_buffer,\r\n                       sizeof(sahara_reset->q_sahara_reset_packet) + sizeof(q_sahara_packet_h)))\r\n    {\r\n        dbg(LOG_ERROR, \"Sending RESET packet failed\");\r\n        return 0;\r\n    }\r\n\r\n    return 1;\r\n}\r\n\r\nstatic int send_done_packet(void *usb_handle, void *tx_buffer)\r\n{\r\n    struct sahara_pkt *sahara_done;\r\n    sahara_done = (struct sahara_pkt *)tx_buffer;\r\n\r\n    sahara_done->q_header.q_cmd = le_uint32(Q_SAHARA_FIVE);\r\n    sahara_done->q_header.q_len =\r\n        le_uint32(sizeof(sahara_done->q_sahara_done_packet) + sizeof(q_sahara_packet_h));\r\n    // Send the image data\r\n    dbg(LOG_EVENT, \"Q_SAHARA_FIVE ===>\");\r\n    if (0 == sahara_tx_data(usb_handle, tx_buffer,\r\n                            sizeof(sahara_done->q_sahara_done_packet) + sizeof(q_sahara_packet_h)))\r\n    {\r\n        dbg(LOG_ERROR, \"Sending DONE packet failed\");\r\n        return 0;\r\n    }\r\n    return 1;\r\n}\r\n\r\nstatic int start_image_transfer(void *usb_handle, void *tx_buffer,\r\n                                const struct sahara_pkt *pr_sahara_pkt, FILE *file_handle)\r\n{\r\n    int retval = 0;\r\n    uint32_t bytes_read = 0, bytes_to_read_next;\r\n    uint32_t q_image_id = le_uint32(pr_sahara_pkt->q_sahara_read_packet_data.q_image_id);\r\n    uint32_t DataOffset = le_uint32(pr_sahara_pkt->q_sahara_read_packet_data.q_data_offset);\r\n    uint32_t DataLength = le_uint32(pr_sahara_pkt->q_sahara_read_packet_data.q_data_length);\r\n\r\n    if (le_uint32(pr_sahara_pkt->q_header.q_cmd) == Q_SAHARA_EIGHTEEN)\r\n    {\r\n        q_image_id = le_uint64(pr_sahara_pkt->q_sahara_read_packet_data_64bit.q_image_id);\r\n        DataOffset = le_uint64(pr_sahara_pkt->q_sahara_read_packet_data_64bit.q_data_offset);\r\n        DataLength = le_uint64(pr_sahara_pkt->q_sahara_read_packet_data_64bit.q_data_length);\r\n    }\r\n\r\n    dbg(LOG_INFO, \"0x%08x 0x%08x 0x%08x\", q_image_id, DataOffset, DataLength);\r\n\r\n    if (fseek(file_handle, (long)DataOffset, SEEK_SET))\r\n    {\r\n        dbg(LOG_INFO, \"%d errno: %d (%s)\", __LINE__, errno, strerror(errno));\r\n        return 0;\r\n    }\r\n\r\n    while (bytes_read < DataLength)\r\n    {\r\n        bytes_to_read_next = MIN((uint32_t)DataLength - bytes_read, Q_SAHARA_RAW_BUF_SZ);\r\n        retval = fread(tx_buffer, 1, bytes_to_read_next, file_handle);\r\n\r\n        if (retval < 0)\r\n        {\r\n            dbg(LOG_ERROR, \"file read failed: %s\", strerror(errno));\r\n            return 0;\r\n        }\r\n\r\n        if ((uint32_t)retval != bytes_to_read_next)\r\n        {\r\n            dbg(LOG_ERROR, \"Read %d bytes, but was asked for 0x%08x bytes\", retval, DataLength);\r\n            return 0;\r\n        }\r\n\r\n        /*send the image data*/\r\n        if (0 == sahara_tx_data(usb_handle, tx_buffer, bytes_to_read_next))\r\n        {\r\n            dbg(LOG_ERROR, \"Tx Sahara Image Failed\");\r\n            return 0;\r\n        }\r\n\r\n        bytes_read += bytes_to_read_next;\r\n    }\r\n\r\n    return 1;\r\n}\r\n\r\nstatic int send_hello_response(void *usb_handle, void *tx_buffer,\r\n                               const struct sahara_pkt *sahara_hello)\r\n{\r\n    struct sahara_pkt *sahara_hello_resp;\r\n    sahara_hello_resp = (struct sahara_pkt *)tx_buffer;\r\n\r\n    // Recieved hello, send the hello response\r\n    // Create a Hello request\r\n    sahara_hello_resp->q_header.q_cmd = le_uint32(Q_SAHARA_TWO);\r\n    sahara_hello_resp->q_header.q_len = le_uint32(\r\n        sizeof(sahara_hello_resp->q_sahara_hello_packet_response) + sizeof(q_sahara_packet_h));\r\n    sahara_hello_resp->q_sahara_hello_packet_response.q_ver =\r\n        sahara_hello->q_sahara_hello_packet.q_ver;\r\n    sahara_hello_resp->q_sahara_hello_packet_response.q_ver_sup =\r\n        sahara_hello->q_sahara_hello_packet.q_ver_sup;\r\n    sahara_hello_resp->q_sahara_hello_packet_response.q_status = le_uint32(Q_SAHARA_STATUS_ZERO);\r\n    sahara_hello_resp->q_sahara_hello_packet_response.q_mode =\r\n        sahara_hello->q_sahara_hello_packet.q_mode;\r\n    sahara_hello_resp->q_sahara_hello_packet_response.q_reserve1 = le_uint32(1);\r\n    sahara_hello_resp->q_sahara_hello_packet_response.q_reserve2 = le_uint32(2);\r\n    sahara_hello_resp->q_sahara_hello_packet_response.q_reserve3 = le_uint32(3);\r\n    sahara_hello_resp->q_sahara_hello_packet_response.q_reserve4 = le_uint32(4);\r\n    sahara_hello_resp->q_sahara_hello_packet_response.q_reserve5 = le_uint32(5);\r\n    sahara_hello_resp->q_sahara_hello_packet_response.q_reserve6 = le_uint32(6);\r\n\r\n    if (le_uint32(sahara_hello->q_sahara_hello_packet.q_mode) != Q_SAHARA_MODE_ZERO)\r\n    {\r\n        dbg(LOG_ERROR, \"ERROR NOT Q_SAHARA_MODE_ZERO\");\r\n        sahara_hello_resp->q_sahara_hello_packet_response.q_mode = Q_SAHARA_MODE_ZERO;\r\n    }\r\n\r\n    /*Send the Hello  Resonse Request*/\r\n    dbg(LOG_EVENT, \"Q_SAHARA_TWO ===>\");\r\n    if (0 == sahara_tx_data(usb_handle, tx_buffer,\r\n                            sizeof(sahara_hello_resp->q_sahara_hello_packet_response) +\r\n                                sizeof(q_sahara_packet_h)))\r\n    {\r\n        dbg(LOG_ERROR, \"Tx Sahara Data Failed \");\r\n        return 0;\r\n    }\r\n\r\n    return 1;\r\n}\r\n\r\nstatic int sahara_flash_all(void *usb_handle, void *tx_buffer, void *rx_buffer, FILE *file_handle)\r\n{\r\n    uint32_t q_image_id = 0;\r\n    struct sahara_pkt *pr_sahara_pkt;\r\n\r\n    pr_sahara_pkt = (struct sahara_pkt *)rx_buffer;\r\n\r\n    if (0 == sahara_rx_data(usb_handle, rx_buffer, 0))\r\n    {\r\n        sahara_tx_data(usb_handle, tx_buffer, 1);\r\n        if (0 == sahara_rx_data(usb_handle, rx_buffer, 0)) return 0;\r\n    }\r\n\r\n    if (le_uint32(pr_sahara_pkt->q_header.q_cmd) != Q_SAHARA_ONE)\r\n    {\r\n        dbg(LOG_ERROR, \"Received a different q_cmd: %x while waiting for hello packet\",\r\n            pr_sahara_pkt->q_header.q_cmd);\r\n        send_reset_command(usb_handle, rx_buffer);\r\n        return 0;\r\n    }\r\n\r\n    if (0 == send_hello_response(usb_handle, tx_buffer, pr_sahara_pkt))\r\n    {\r\n        dbg(LOG_ERROR, \"send_hello_response failed\\n\");\r\n        return 0;\r\n    }\r\n\r\n    while (1)\r\n    {\r\n        if (0 == sahara_rx_data(usb_handle, rx_buffer, 0)) return 0;\r\n\r\n        if (le_uint32(pr_sahara_pkt->q_header.q_cmd) == Q_SAHARA_THREE)\r\n        {\r\n            start_image_transfer(usb_handle, tx_buffer, pr_sahara_pkt, file_handle);\r\n        }\r\n        else if (le_uint32(pr_sahara_pkt->q_header.q_cmd) == Q_SAHARA_EIGHTEEN)\r\n        {\r\n            start_image_transfer(usb_handle, tx_buffer, pr_sahara_pkt, file_handle);\r\n        }\r\n        else if (le_uint32(pr_sahara_pkt->q_header.q_cmd) == Q_SAHARA_FOUR)\r\n        {\r\n            dbg(LOG_EVENT, \"q_image_id = %d, q_status = %d\",\r\n                le_uint32(pr_sahara_pkt->q_sahara_end_packet_image_tx.q_image_id),\r\n                le_uint32(pr_sahara_pkt->q_sahara_end_packet_image_tx.q_status));\r\n            if (le_uint32(pr_sahara_pkt->q_sahara_end_packet_image_tx.q_status) ==\r\n                Q_SAHARA_STATUS_ZERO)\r\n            {\r\n                q_image_id = le_uint32(pr_sahara_pkt->q_sahara_end_packet_image_tx.q_image_id);\r\n                send_done_packet(usb_handle, tx_buffer);\r\n                break;\r\n            }\r\n            else\r\n            {\r\n                return 0;\r\n            }\r\n        }\r\n        else if (le_uint32(pr_sahara_pkt->q_header.q_cmd) == Q_SAHARA_ONE)\r\n        {\r\n            continue;\r\n        }\r\n        else\r\n        {\r\n            dbg(LOG_ERROR, \"Received an unknown q_cmd: %d \",\r\n                le_uint32(pr_sahara_pkt->q_header.q_cmd));\r\n            send_reset_command(usb_handle, tx_buffer);\r\n            return 0;\r\n        }\r\n    }\r\n\r\n    if (0 == sahara_rx_data(usb_handle, rx_buffer, 0)) return 0;\r\n\r\n    dbg(LOG_INFO, \"q_image_tx_status = %d\",\r\n        le_uint32(pr_sahara_pkt->q_sahara_done_packet_response.q_image_tx_status));\r\n\r\n    if (Q_SAHARA_MODE_ZERO ==\r\n        le_uint32(pr_sahara_pkt->q_sahara_done_packet_response.q_image_tx_status))\r\n    {\r\n        if (q_image_id == 13) // prog_nand_firehose_9x07.mbn\r\n            return 1;\r\n        if (q_image_id == 7) // NPRG9x55.mbn\r\n            return 1;\r\n        if (q_image_id == 21) // sbl1.mbn, October 22 2020 2:12 PM, AG35CEVAR05A07T4G\r\n            return 1;\r\n    }\r\n    else if (Q_SAHARA_MODE_ONE ==\r\n             le_uint32(pr_sahara_pkt->q_sahara_done_packet_response.q_image_tx_status))\r\n    {\r\n        dbg(LOG_EVENT, \"Successfully flash all images\");\r\n        return 1;\r\n    }\r\n    else\r\n    {\r\n        dbg(LOG_ERROR, \"Received unrecognized q_status %d at Q_SAHARA_WAIT_FOUR state\",\r\n            le_uint32(pr_sahara_pkt->q_sahara_done_packet_response.q_image_tx_status));\r\n        return 0;\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nint sahara_main(const char *firehose_dir, const char *firehose_mbn, void *usb_handle,\r\n                int edl_mode_05c69008)\r\n{\r\n    int retval = 0;\r\n    char full_path[512];\r\n    FILE *file_handle;\r\n    void *tx_buffer;\r\n    void *rx_buffer;\r\n\r\n    if (edl_mode_05c69008)\r\n    {\r\n        if (is_upgrade_fimeware_zip_7z)\r\n        {\r\n            snprintf(full_path, sizeof(full_path), \"/tmp/%.240s\", firehose_mbn);\r\n            dbg_time(\"%s full_path:%s\\n\", __func__, full_path);\r\n        }\r\n        else\r\n        {\r\n            snprintf(full_path, sizeof(full_path), \"%.255s/%.240s\", firehose_dir, firehose_mbn);\r\n        }\r\n    }\r\n    else\r\n    {\r\n        char *prog_nand_firehose_filename = NULL;\r\n\r\n        if (is_upgrade_fimeware_zip_7z)\r\n        {\r\n            int i;\r\n            char prog_nand_firehose_filename_tmp[128] = {0};\r\n            char prog_nand_firehose_filename_dir_tmp[256] = {0};\r\n\r\n            prog_nand_firehose_filename = (char *)malloc(256);\r\n            if (prog_nand_firehose_filename == NULL)\r\n            {\r\n                return ENOENT;\r\n            }\r\n\r\n            for (i = 0; i < file_name_b.file_name_count; i++)\r\n            {\r\n                if ((strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \"NPRG9x\") &&\r\n                     strstr(file_name_b.file_backup_c[i].zip_file_name_backup, \".mbn\")))\r\n                {\r\n                    dbg_time(\"file_name_b.file_backup_c[i].zip_file_name_backup:%s\\n\",\r\n                             file_name_b.file_backup_c[i].zip_file_name_backup);\r\n                    dbg_time(\"file_name_b.file_backup_c[i].zip_file_dir_backup:%s\\n\",\r\n                             file_name_b.file_backup_c[i].zip_file_dir_backup);\r\n\r\n                    if (strstr(file_name_b.file_backup_c[i].zip_file_dir_backup, \"update/firehose\"))\r\n                    {\r\n                        memmove(prog_nand_firehose_filename_tmp,\r\n                                file_name_b.file_backup_c[i].zip_file_name_backup,\r\n                                strlen(file_name_b.file_backup_c[i].zip_file_name_backup));\r\n                        memmove(prog_nand_firehose_filename_dir_tmp,\r\n                                file_name_b.file_backup_c[i].zip_file_dir_backup,\r\n                                strlen(file_name_b.file_backup_c[i].zip_file_dir_backup));\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (prog_nand_firehose_filename_tmp[0] != '\\0')\r\n            {\r\n                memset(zip_cmd_buf, 0, sizeof(zip_cmd_buf));\r\n                if (is_upgrade_fimeware_only_zip)\r\n                {\r\n                    snprintf(zip_cmd_buf, sizeof(zip_cmd_buf),\r\n                             \"unzip -o -q %.240s '*%.200s' -d /tmp/ > %s\", firehose_dir,\r\n                             prog_nand_firehose_filename_dir_tmp, ZIP_PROCESS_INFO);\r\n                }\r\n                else\r\n                {\r\n                    snprintf(zip_cmd_buf, sizeof(zip_cmd_buf), \"7z x %.240s -o/tmp/ %.200s > %s\",\r\n                             firehose_dir, prog_nand_firehose_filename_dir_tmp, ZIP_PROCESS_INFO);\r\n                }\r\n                dbg_time(\"%s zip_cmd_buf:%s\\n\", __func__, zip_cmd_buf);\r\n                if (-1 == system(zip_cmd_buf))\r\n                {\r\n                    dbg_time(\"%s system return error\\n\", __func__);\r\n                    safe_free(prog_nand_firehose_filename);\r\n                    return ENOENT;\r\n                }\r\n                usleep(1000);\r\n\r\n                memmove(prog_nand_firehose_filename, prog_nand_firehose_filename_dir_tmp, 240);\r\n                dbg(LOG_INFO, \"prog_nand_firehose_filename = %s\", prog_nand_firehose_filename);\r\n\r\n                snprintf(full_path, sizeof(full_path), \"/tmp/%.240s\", prog_nand_firehose_filename);\r\n            }\r\n        }\r\n        else\r\n        {\r\n            snprintf(full_path, sizeof(full_path), \"%.255s/..\", firehose_dir);\r\n            if (!qfile_find_file(full_path, \"NPRG9x\", \".mbn\", &prog_nand_firehose_filename) &&\r\n                !qfile_find_file(full_path, \"NPRG9x\", \".mbn\", &prog_nand_firehose_filename))\r\n            {\r\n                dbg(LOG_ERROR, \"retrieve NPRG MBN failed.\");\r\n                safe_free(prog_nand_firehose_filename);\r\n                return ENOENT;\r\n            }\r\n            dbg(LOG_INFO, \"prog_nand_firehose_filename = %s\", prog_nand_firehose_filename);\r\n\r\n            snprintf(full_path, sizeof(full_path), \"%.255s/../%.240s\", firehose_dir,\r\n                     prog_nand_firehose_filename);\r\n        }\r\n\r\n        safe_free(prog_nand_firehose_filename);\r\n    }\r\n\r\n    file_handle = fopen(full_path, \"rb\");\r\n    if (file_handle == NULL)\r\n    {\r\n        dbg(LOG_INFO, \"%s %d %s errno: %d (%s)\", __func__, __LINE__, full_path, errno,\r\n            strerror(errno));\r\n        return ENOENT;\r\n    }\r\n\r\n    rx_buffer = malloc(Q_SAHARA_RAW_BUF_SZ);\r\n    tx_buffer = malloc(Q_SAHARA_RAW_BUF_SZ);\r\n\r\n    if (NULL == rx_buffer || NULL == tx_buffer)\r\n    {\r\n        dbg(LOG_ERROR, \"Failed to allocate sahara buffers\");\r\n        safe_free(rx_buffer);\r\n        safe_free(tx_buffer);\r\n        fclose(file_handle);\r\n        file_handle = NULL;\r\n        return ENOMEM;\r\n    }\r\n\r\n    retval = sahara_flash_all(usb_handle, tx_buffer, rx_buffer, file_handle);\r\n    if (0 == retval)\r\n    {\r\n        dbg(LOG_ERROR, \"Sahara protocol error\");\r\n    }\r\n    else\r\n    {\r\n        dbg(LOG_STATUS, \"Sahara protocol completed\");\r\n    }\r\n\r\n    safe_free(rx_buffer);\r\n    safe_free(tx_buffer);\r\n    fclose(file_handle);\r\n    file_handle = NULL;\r\n\r\n    if (is_upgrade_fimeware_zip_7z)\r\n    {\r\n        unlink(full_path);\r\n    }\r\n\r\n    if (retval) return 0;\r\n\r\n    return __LINE__;\r\n}\r\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/sahara.h",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software.\r\n    Under no circumstances may customers modify, demonstrate, use, deliver\r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#ifndef SAHARA_H\r\n#define SAHARA_H\r\n\r\n#define Q_SAHARA_RAW_BUF_SZ (4*1024)\r\n#define Q_SAHARA_STATUS_ZERO 0x00\r\n#define Q_SAHARA_MODE_ZERO 0x00\r\n#define Q_SAHARA_MODE_ONE 0x01\r\n\r\n#define Q_SAHARA_ZERO 0x00\r\n#define Q_SAHARA_ONE 0x01\r\n#define Q_SAHARA_TWO 0x02\r\n#define Q_SAHARA_THREE 0x03\r\n#define Q_SAHARA_FOUR 0x04\r\n#define Q_SAHARA_FIVE 0x05\r\n#define Q_SAHARA_SEVEN 0x07\r\n#define Q_SAHARA_EIGHTEEN 0x12\r\n#define Q_SAHARA_NINETEEN 0x13\r\n\r\ntypedef struct\r\n{\r\n  uint32_t q_cmd;\r\n  uint32_t q_len;\r\n} q_sahara_packet_h;\r\n\r\nstruct sahara_pkt\r\n{\r\n    q_sahara_packet_h q_header;\r\n\r\n    union\r\n    {\r\n        struct\r\n        {\r\n            uint32_t q_ver;\r\n            uint32_t q_ver_sup;\r\n            uint32_t q_cmd_packet_len;\r\n            uint32_t q_mode;\r\n        } q_sahara_hello_packet;\r\n        struct\r\n        {\r\n            uint32_t q_ver;\r\n            uint32_t q_ver_sup;\r\n            uint32_t q_status;\r\n            uint32_t q_mode;\r\n            uint32_t q_reserve1;\r\n            uint32_t q_reserve2;\r\n            uint32_t q_reserve3;\r\n            uint32_t q_reserve4;\r\n            uint32_t q_reserve5;\r\n            uint32_t q_reserve6;\r\n        } q_sahara_hello_packet_response;\r\n        struct\r\n        {\r\n            uint32_t q_image_id;\r\n            uint32_t q_data_offset;\r\n            uint32_t q_data_length;\r\n        } q_sahara_read_packet_data;\r\n        struct\r\n        {\r\n            uint32_t q_image_id;\r\n            uint32_t q_status;\r\n        } q_sahara_end_packet_image_tx;\r\n        struct\r\n        {\r\n        } q_sahara_done_packet;\r\n        struct\r\n        {\r\n            uint32_t q_image_tx_status;\r\n        } q_sahara_done_packet_response;\r\n        struct\r\n        {\r\n            uint64_t q_image_id;\r\n            uint64_t q_data_offset;\r\n            uint64_t q_data_length;\r\n        } q_sahara_read_packet_data_64bit;\r\n        struct\r\n        {\r\n        } q_sahara_reset_packet;\r\n        struct\r\n        {\r\n        } q_sahara_reset_packet_response;\r\n    };\r\n};\r\n#endif\r\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/stream_download_protocol.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software.\r\n    Under no circumstances may customers modify, demonstrate, use, deliver\r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include \"usb_linux.h\"\r\n#include \"hostdl_packet.h\"\r\n\r\n#define true (1 == 1)\r\n#define false (1 != 1)\r\n\r\n#define MAX_SEND_BUFFER_SIZE 1280\r\n#define MAX_RECEIVE_BUFFER_SIZE 1280\r\nunsigned char g_Transmit_Buffer[MAX_SEND_BUFFER_SIZE];\r\nint g_Transmit_Length;\r\n\r\nunsigned char g_Receive_Buffer[MAX_RECEIVE_BUFFER_SIZE];\r\nint g_Receive_Bytes;\r\n\r\nstatic void *stream_usb_handle;\r\n\r\nstatic void dump_buffer(unsigned char *buff, int len)\r\n{\r\n    int i = 0;\r\n\r\n    dbg_time(\"dump buffer: %d bytes\\n\", len);\r\n    for (i = 0; i < len; i++)\r\n    {\r\n        dbg_time(\"%02x \", buff[i]);\r\n    }\r\n    dbg_time(\"\\nend\\n\");\r\n}\r\n\r\n#define CRC_16_L_SEED 0xFFFF\r\n#define CRC_TAB_SIZE 256 /* 2^CRC_TAB_BITS      */\r\n#define CRC_16_L_POLYNOMIAL 0x8408\r\n\r\nstatic const uint16_t crc_16_l_table[CRC_TAB_SIZE] = {\r\n    0x0000, 0x1189, 0x2312, 0x329b, 0x4624, 0x57ad, 0x6536, 0x74bf, 0x8c48, 0x9dc1, 0xaf5a, 0xbed3,\r\n    0xca6c, 0xdbe5, 0xe97e, 0xf8f7, 0x1081, 0x0108, 0x3393, 0x221a, 0x56a5, 0x472c, 0x75b7, 0x643e,\r\n    0x9cc9, 0x8d40, 0xbfdb, 0xae52, 0xdaed, 0xcb64, 0xf9ff, 0xe876, 0x2102, 0x308b, 0x0210, 0x1399,\r\n    0x6726, 0x76af, 0x4434, 0x55bd, 0xad4a, 0xbcc3, 0x8e58, 0x9fd1, 0xeb6e, 0xfae7, 0xc87c, 0xd9f5,\r\n    0x3183, 0x200a, 0x1291, 0x0318, 0x77a7, 0x662e, 0x54b5, 0x453c, 0xbdcb, 0xac42, 0x9ed9, 0x8f50,\r\n    0xfbef, 0xea66, 0xd8fd, 0xc974, 0x4204, 0x538d, 0x6116, 0x709f, 0x0420, 0x15a9, 0x2732, 0x36bb,\r\n    0xce4c, 0xdfc5, 0xed5e, 0xfcd7, 0x8868, 0x99e1, 0xab7a, 0xbaf3, 0x5285, 0x430c, 0x7197, 0x601e,\r\n    0x14a1, 0x0528, 0x37b3, 0x263a, 0xdecd, 0xcf44, 0xfddf, 0xec56, 0x98e9, 0x8960, 0xbbfb, 0xaa72,\r\n    0x6306, 0x728f, 0x4014, 0x519d, 0x2522, 0x34ab, 0x0630, 0x17b9, 0xef4e, 0xfec7, 0xcc5c, 0xddd5,\r\n    0xa96a, 0xb8e3, 0x8a78, 0x9bf1, 0x7387, 0x620e, 0x5095, 0x411c, 0x35a3, 0x242a, 0x16b1, 0x0738,\r\n    0xffcf, 0xee46, 0xdcdd, 0xcd54, 0xb9eb, 0xa862, 0x9af9, 0x8b70, 0x8408, 0x9581, 0xa71a, 0xb693,\r\n    0xc22c, 0xd3a5, 0xe13e, 0xf0b7, 0x0840, 0x19c9, 0x2b52, 0x3adb, 0x4e64, 0x5fed, 0x6d76, 0x7cff,\r\n    0x9489, 0x8500, 0xb79b, 0xa612, 0xd2ad, 0xc324, 0xf1bf, 0xe036, 0x18c1, 0x0948, 0x3bd3, 0x2a5a,\r\n    0x5ee5, 0x4f6c, 0x7df7, 0x6c7e, 0xa50a, 0xb483, 0x8618, 0x9791, 0xe32e, 0xf2a7, 0xc03c, 0xd1b5,\r\n    0x2942, 0x38cb, 0x0a50, 0x1bd9, 0x6f66, 0x7eef, 0x4c74, 0x5dfd, 0xb58b, 0xa402, 0x9699, 0x8710,\r\n    0xf3af, 0xe226, 0xd0bd, 0xc134, 0x39c3, 0x284a, 0x1ad1, 0x0b58, 0x7fe7, 0x6e6e, 0x5cf5, 0x4d7c,\r\n    0xc60c, 0xd785, 0xe51e, 0xf497, 0x8028, 0x91a1, 0xa33a, 0xb2b3, 0x4a44, 0x5bcd, 0x6956, 0x78df,\r\n    0x0c60, 0x1de9, 0x2f72, 0x3efb, 0xd68d, 0xc704, 0xf59f, 0xe416, 0x90a9, 0x8120, 0xb3bb, 0xa232,\r\n    0x5ac5, 0x4b4c, 0x79d7, 0x685e, 0x1ce1, 0x0d68, 0x3ff3, 0x2e7a, 0xe70e, 0xf687, 0xc41c, 0xd595,\r\n    0xa12a, 0xb0a3, 0x8238, 0x93b1, 0x6b46, 0x7acf, 0x4854, 0x59dd, 0x2d62, 0x3ceb, 0x0e70, 0x1ff9,\r\n    0xf78f, 0xe606, 0xd49d, 0xc514, 0xb1ab, 0xa022, 0x92b9, 0x8330, 0x7bc7, 0x6a4e, 0x58d5, 0x495c,\r\n    0x3de3, 0x2c6a, 0x1ef1, 0x0f78};\r\n\r\nunsigned short crc_16_l_calc(unsigned char *buf_ptr, int len)\r\n{\r\n    int data, crc_16;\r\n    for (crc_16 = CRC_16_L_SEED; len >= 8; len -= 8, buf_ptr++)\r\n    {\r\n        crc_16 = crc_16_l_table[(crc_16 ^ *buf_ptr) & 0x00ff] ^ (crc_16 >> 8);\r\n    }\r\n    if (len != 0)\r\n    {\r\n        data = ((int)(*buf_ptr)) << (16 - 8);\r\n\r\n        while (len-- != 0)\r\n        {\r\n            if (((crc_16 ^ data) & 0x01) != 0)\r\n            {\r\n                crc_16 >>= 1;\r\n                crc_16 ^= CRC_16_L_POLYNOMIAL;\r\n            }\r\n            else\r\n            {\r\n                crc_16 >>= 1;\r\n            }\r\n\r\n            data >>= 1;\r\n        }\r\n    }\r\n    return (~crc_16);\r\n}\r\n\r\nvoid compute_reply_crc()\r\n{\r\n    unsigned short crc = crc_16_l_calc(g_Transmit_Buffer, g_Transmit_Length * 8);\r\n    g_Transmit_Buffer[g_Transmit_Length] = crc & 0xFF;\r\n    g_Transmit_Buffer[g_Transmit_Length + 1] = crc >> 8;\r\n    g_Transmit_Length += 2;\r\n}\r\n\r\nstatic void compose_packet(unsigned char cmd, unsigned char *parameter, uint32_t parameter_len,\r\n                           unsigned char *data, uint32_t data_len)\r\n{\r\n    uint32_t i;\r\n\r\n    g_Transmit_Buffer[0] = cmd;\r\n    if (parameter == NULL) parameter_len = 0;\r\n    if (data == NULL) data_len = 0;\r\n    for (i = 0; i < parameter_len; i++)\r\n    {\r\n        g_Transmit_Buffer[1 + i] = parameter[i];\r\n    }\r\n    for (i = 0; i < data_len; i++)\r\n    {\r\n        g_Transmit_Buffer[1 + parameter_len + i] = data[i];\r\n    }\r\n    g_Transmit_Length = 1 + parameter_len + data_len;\r\n    g_Transmit_Buffer[g_Transmit_Length] = 0;\r\n}\r\n\r\nstatic unsigned char stream_tx_buf[1280];\r\n#define CHECK_FOR_DATA() \\\r\n    do                   \\\r\n    {                    \\\r\n    } while (0)\r\n#define TRANSMIT_BYTE(_byte)        \\\r\n    do                              \\\r\n    {                               \\\r\n        stream_tx_buf[j++] = _byte; \\\r\n    } while (0)\r\n\r\nstatic int send_packet(int flag)\r\n{\r\n    int i;\r\n    int ch;\r\n    int j;\r\n\r\n    j = 0;\r\n\r\n    CHECK_FOR_DATA();\r\n\r\n    /* Since we don't know how long it's been. */\r\n    if (!!flag)\r\n    {\r\n        TRANSMIT_BYTE(0x7E);\r\n    }\r\n\r\n    for (i = 0; i < g_Transmit_Length; i++)\r\n    {\r\n        /* we only need to check once every 31 characters, since RX and TX\r\n         * run at about the same speed, and our RX FIFO is 64 characters\r\n         */\r\n        if ((i & 31) == 31) CHECK_FOR_DATA();\r\n\r\n        ch = g_Transmit_Buffer[i];\r\n\r\n        if (ch == 0x7E || ch == 0x7D)\r\n        {\r\n            TRANSMIT_BYTE(0x7D);\r\n            TRANSMIT_BYTE(0x20 ^ ch); /*lint !e734 */\r\n        }\r\n        else\r\n        {\r\n            TRANSMIT_BYTE(ch); /*lint !e734 */\r\n        }\r\n    }\r\n\r\n    CHECK_FOR_DATA();\r\n    TRANSMIT_BYTE(0x7E);\r\n\r\n#if 0\r\n  /* Hack for USB protocol.  If we have an exact multiple of the USB frame\r\n   * size, then the last frame will not be sent out.  The USB standard says\r\n   * that a \"short packet\" needs to be sent to flush the data.  Two flag\r\n   * characters can serve as the short packet.  Doing it this way, we only\r\n   * perform this test once on every entire packet from the target, so the\r\n   * over head is not too much.\r\n   */\r\n    if ((j%512) == 0)\r\n    {\r\n        TRANSMIT_BYTE (0x7E);\r\n        TRANSMIT_BYTE (0x7E);\r\n    }\r\n#endif\r\n\r\n    return (qusb_noblock_write(stream_usb_handle, stream_tx_buf, j, j, 3000, 1) == j) ? 0 : -1;\r\n}\r\n\r\nstatic int remove_escape_hdlc_flag(unsigned char *buffer, int len)\r\n{\r\n    int i = 0;\r\n    int index = 0;\r\n    int escape = 0;\r\n    // dump_buffer(buffer, len);\r\n    if (len == 0) return 0;\r\n    // ignore the first HDLC FLAG bytes\r\n    while (buffer[i] == 0x7e)\r\n    {\r\n        i++;\r\n    }\r\n    // all bytes is HDLC FLAG\r\n    if (i == len) return 0;\r\n    for (; i < len; i++)\r\n    {\r\n        if (buffer[i] == 0x7D)\r\n        {\r\n            escape = 1;\r\n            continue;\r\n        }\r\n        if (escape == 1)\r\n        {\r\n            escape = 0;\r\n            buffer[i] ^= 0x20;\r\n        }\r\n        buffer[index++] = buffer[i];\r\n    }\r\n    buffer[index] = 0;\r\n    // dump_buffer(buffer, index);\r\n    return index;\r\n}\r\n\r\nstatic int receive_packet(void)\r\n{\r\n    int bytesread = 0;\r\n    unsigned char *buff = g_Receive_Buffer;\r\n    if (buff == NULL)\r\n    {\r\n        return -1;\r\n    }\r\n\r\n    int idx = 0;\r\n    do\r\n    {\r\n        bytesread =\r\n            qusb_noblock_read(stream_usb_handle, &buff[idx], MAX_RECEIVE_BUFFER_SIZE, 0, 3000);\r\n        if (bytesread == 0)\r\n        {\r\n            // timeout may be error\r\n            dbg_time(\"%s timeout\\n\", __FUNCTION__);\r\n            break;\r\n        }\r\n        // dump_buffer(&buff[idx], bytesread);\r\n        idx += bytesread;\r\n        if (buff[idx - 1] == 0x7e)\r\n        {\r\n            // check the packet whether valid.\r\n            g_Receive_Bytes = remove_escape_hdlc_flag(buff, idx);\r\n            if (g_Receive_Bytes == 0)\r\n            {\r\n                continue;\r\n            }\r\n            else\r\n            {\r\n                return 1;\r\n            }\r\n        }\r\n    } while (1);\r\n\r\n    return 0;\r\n}\r\n\r\nstatic int handle_hello(void)\r\n{\r\n    static const char host_header[] = \"QCOM fast download protocol host\";\r\n    // static const char target_header[] = \"QCOM fast download protocol targ\";\r\n    // char string1[64];\r\n    // int size;\r\n    int err;\r\n    dbg_time(\"%s\\n\", __func__);\r\n\r\n    memset(&g_Transmit_Buffer[0], 0, sizeof(g_Transmit_Buffer));\r\n    g_Transmit_Buffer[HELLO_CMD_OFFSET] = HELLO_REQ;\r\n    memcpy(&g_Transmit_Buffer[HELLO_MAGIC_NUM_OFFSET], host_header, 32);\r\n    g_Transmit_Buffer[HELLO_MAX_VER_OFFSET] = STREAM_DLOAD_MAX_VER;\r\n    g_Transmit_Buffer[HELLO_MIN_VER_OFFSET] = STREAM_DLOAD_MIN_VER;\r\n    g_Transmit_Buffer[HELLO_MAX_DATA_SZ_1_OFFSET] = 0;\r\n    g_Transmit_Length = 36;\r\n\r\n    compute_reply_crc();\r\n    send_packet(1);\r\n\r\n    int timeout = 5;\r\n    do\r\n    {\r\n        err = receive_packet();\r\n        if (err == 1)\r\n        {\r\n            switch (g_Receive_Buffer[0])\r\n            {\r\n                case 0x02: return 1;\r\n                case 0x0d: continue;\r\n                default:\r\n                    // dump_buffer(g_Receive_Buffer, 64);\r\n                    return 0;\r\n            }\r\n        }\r\n        else if (err == -1)\r\n        {\r\n            dbg_time(\"error = %d, strerr = %s\\n\", errno, strerror(errno));\r\n            return 0;\r\n        }\r\n        timeout--;\r\n    } while (timeout);\r\n\r\n    return 0;\r\n}\r\n\r\nstatic int handle_security_mode(unsigned char trusted)\r\n{\r\n    dbg_time(\"%s trusted = %d\\n\", __func__, trusted);\r\n    compose_packet(0x17, &trusted, 1, NULL, 0);\r\n    compute_reply_crc();\r\n    send_packet(1);\r\n    int timeout = 5;\r\n    do\r\n    {\r\n        if (receive_packet() == 1)\r\n        {\r\n            switch (g_Receive_Buffer[0])\r\n            {\r\n                case 0x18: return 1;\r\n                default: return 0;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            timeout--;\r\n            if (timeout == 0)\r\n            {\r\n                dbg_time(\"%s timeout\\n\", __FUNCTION__);\r\n                break; // return 0; -Werror,-Wunreachable-code-return\r\n            }\r\n        }\r\n    } while (1);\r\n    return 0;\r\n}\r\n/*\r\nset download flag in module, quectel custom command,\r\nif flag : reboot, module will enter DM\r\nif not flag: reboot normal\r\n*/\r\nstatic int handle_quectel_download_flag(unsigned char mode)\r\n{\r\n    // byte mode = 1;\r\n    compose_packet(0x60, &mode, 1, NULL, 0);\r\n    compute_reply_crc();\r\n    send_packet(1);\r\n    int timeout = 5;\r\n    do\r\n    {\r\n        if (receive_packet() == 1)\r\n        {\r\n            switch (g_Receive_Buffer[0])\r\n            {\r\n                case 0x61:\r\n                    switch (g_Receive_Buffer[1])\r\n                    {\r\n                        case 0x00: return 1;\r\n                        default: return 0;\r\n                    }\r\n                    break;\r\n                case 0x0E: dbg_time(\"Invalid command\"); return 2;\r\n                default: dump_buffer(g_Receive_Buffer, 64); return 0;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            timeout--;\r\n            if (timeout == 0)\r\n            {\r\n                dbg_time(\"%s timeout\\n\", __FUNCTION__);\r\n                return 0;\r\n            }\r\n        }\r\n    } while (1);\r\n}\r\n\r\nstatic const char *stream_firehose_dir;\r\nstatic int stread_fread(const char *filename, void **pp_filebuf)\r\n{\r\n    int filesize = 0;\r\n    FILE *fp;\r\n    char fullpath[MAX_PATH * 2];\r\n\r\n    snprintf(fullpath, sizeof(fullpath), \"%.240s/../%.240s\", stream_firehose_dir, filename);\r\n    fp = fopen(fullpath, \"rb\");\r\n    if (fp == NULL)\r\n    {\r\n        dbg_time(\"fail to fope %s, errno: %d (%s)\\n\", fullpath, errno, strerror(errno));\r\n        return 0;\r\n    }\r\n\r\n    fseek(fp, 0, SEEK_END);\r\n    filesize = ftell(fp);\r\n\r\n    *pp_filebuf = malloc(filesize);\r\n    if (pp_filebuf == NULL)\r\n    {\r\n        dbg_time(\"fail to malloc %d, errno: %d (%s)\\n\", filesize, errno, strerror(errno));\r\n        if (fp)\r\n        {\r\n            fclose(fp);\r\n            fp = NULL;\r\n        }\r\n        return 0;\r\n    }\r\n\r\n    fseek(fp, 0, SEEK_SET);\r\n    filesize = fread(*pp_filebuf, 1, filesize, fp);\r\n    fclose(fp);\r\n\r\n    dbg_time(\"%s filename=%s, filesize=%d\\n\", __func__, filename, filesize);\r\n    return filesize;\r\n}\r\n\r\nstatic int handle_parti_tbl(unsigned char override)\r\n{\r\n    int timeout = 5;\r\n    int filesize;\r\n    void *filebuf;\r\n    const char *partition_path = \"partition.mbn\";\r\n    dbg_time(\"%s override = %d\\n\", __func__, override);\r\n\r\n    filesize = stread_fread(partition_path, &filebuf);\r\n    if (filesize <= 0)\r\n    {\r\n        if (filebuf)\r\n        {\r\n            free(filebuf);\r\n            filebuf = NULL;\r\n        }\r\n        return 0;\r\n    }\r\n\r\n    compose_packet(0x19, &override, 1, filebuf, filesize);\r\n    compute_reply_crc();\r\n    send_packet(1);\r\n    free(filebuf);\r\n\r\n    do\r\n    {\r\n        if (receive_packet() == 1)\r\n        {\r\n            dbg_time(\"handle_parti_tbl command = %02x, status = %02x\\n\", g_Receive_Buffer[0],\r\n                     g_Receive_Buffer[1]);\r\n            switch (g_Receive_Buffer[0])\r\n            {\r\n                case 0x1a:\r\n                    switch (g_Receive_Buffer[1])\r\n                    {\r\n                        case 0x00: return 1;\r\n                        case 0x01: // 0x1 this means that the original partition is different from\r\n                                   // the current partition,try to send partition\r\n                            return 0;\r\n                        case 0x02: // 0x2 Partition table format not recognized, does not accept\r\n                                   // override\r\n                            return 0;\r\n                        case 0x03: // 0x3  Erase operation failed\r\n                            return 0;\r\n                            break;\r\n                        default: return 0;\r\n                    }\r\n                default: return 0;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            timeout--;\r\n            if (timeout == 0)\r\n            {\r\n                dbg_time(\"%s timeout\\n\", __FUNCTION__);\r\n                return 0;\r\n            }\r\n        }\r\n    } while (1);\r\n}\r\n\r\nstatic int handle_reset(void)\r\n{\r\n    dbg_time(\"%s\\n\", __func__);\r\n    compose_packet(0x0b, NULL, 0, NULL, 0);\r\n    compute_reply_crc();\r\n    send_packet(1);\r\n#if 1\r\n    return 1;\r\n#else\r\n    int timeout = 5;\r\n    do\r\n    {\r\n        if (receive_packet() == 1)\r\n        {\r\n            switch (g_Receive_Buffer[0])\r\n            {\r\n                case 0x0c: return 1;\r\n                case 0x0d: continue;\r\n                default: dump_buffer(g_Receive_Buffer, 64); return 0;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            timeout--;\r\n            if (timeout == 0)\r\n            {\r\n                dbg_time(\"%s timeout\\n\", __FUNCTION__);\r\n                return 0;\r\n            }\r\n        }\r\n    } while (1);\r\n#endif\r\n}\r\n\r\n/******pkt_open_multi_image*******/\r\n\r\nstatic void pkt_open_multi_image(unsigned char mode, unsigned char *data, uint32_t size)\r\n{\r\n    compose_packet(0x1b, &mode, 1, data, size);\r\n    compute_reply_crc();\r\n}\r\n\r\nstatic int handle_openmulti(uint32_t size, unsigned char *data)\r\n{\r\n    int timeout = 5;\r\n    unsigned char mode = 0x0e;\r\n\r\n    pkt_open_multi_image(mode, data, size);\r\n    send_packet(1);\r\n    do\r\n    {\r\n        if (receive_packet() == 1)\r\n        {\r\n            switch (g_Receive_Buffer[0])\r\n            {\r\n                case 0x1c: return 1;\r\n                case 0x0d: continue;\r\n                default: return 0;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            timeout--;\r\n            if (timeout == 0)\r\n            {\r\n                dbg_time(\"%s timeout\\n\", __FUNCTION__);\r\n                break;\r\n            }\r\n        }\r\n    } while (1);\r\n    return 0;\r\n}\r\n\r\n/******pkt_write_multi_image*******/\r\nstatic void pkt_write_multi_image(uint32_t addr, unsigned char *data, uint16_t size)\r\n{\r\n    unsigned char parameter[4] = {(unsigned char)(addr)&0xff, (unsigned char)(addr >> 8) & 0xff,\r\n                                  (unsigned char)(addr >> 16) & 0xff,\r\n                                  (unsigned char)(addr >> 24) & 0xff};\r\n    compose_packet(0x07, parameter, 4, data, size);\r\n    compute_reply_crc();\r\n}\r\n\r\nstatic int handle_write(unsigned char *data, uint32_t size)\r\n{\r\n    // uint32_t total_size;\r\n    uint32_t addr = 0;\r\n    uint32_t writesize;\r\n    uint32_t buffer_size = 1024;\r\n    // int loop = 1;\r\n    int retry_cnt = 3; // if send failed,send again\r\n    int ret;\r\n\r\n    // total_size = size;\r\n    while (size)\r\n    {\r\n        writesize = (size < buffer_size) ? size : buffer_size;\r\n\r\n        pkt_write_multi_image(addr, data, writesize);\r\n    start_send_packet:\r\n        ret = send_packet(1);\r\n        if (0 != ret)\r\n        {\r\n            dbg_time(\"io read/write failed\\n\");\r\n            return 0;\r\n        }\r\n        if (receive_packet() == 1)\r\n        {\r\n            switch (g_Receive_Buffer[0])\r\n            {\r\n                case 0x08:\r\n                    size -= writesize;\r\n                    addr += writesize;\r\n                    // retry_cnt=5;\r\n                    break;\r\n                default:\r\n                    goto retry_send_packet;\r\n                    // return 0;\r\n            }\r\n        }\r\n        else\r\n        {\r\n        retry_send_packet:\r\n            retry_cnt--;\r\n            if (retry_cnt > 0)\r\n            {\r\n                goto start_send_packet;\r\n            }\r\n            else\r\n            {\r\n                dbg_time(\"value is [0x%02x]\", g_Receive_Buffer[0]);\r\n                return 0;\r\n            }\r\n        }\r\n    }\r\n\r\n    return 1;\r\n}\r\n/******PARTITION*******/\r\nstatic int handle_close(void)\r\n{\r\n    int timeout = 5;\r\n    compose_packet(0x15, NULL, 0, NULL, 0);\r\n    compute_reply_crc();\r\n    send_packet(1);\r\n\r\n    do\r\n    {\r\n        if (receive_packet() == 1)\r\n        {\r\n            switch (g_Receive_Buffer[0])\r\n            {\r\n                case 0x16: return 1;\r\n                default: return 0;\r\n            }\r\n        }\r\n        else\r\n        {\r\n            timeout--;\r\n            if (timeout == 0)\r\n            {\r\n                dbg_time(\"%s timeout\\n\", __FUNCTION__);\r\n                break;\r\n            }\r\n        }\r\n    } while (1);\r\n    return 0;\r\n}\r\n\r\nstatic int do_flash_mbn(const char *partion, const char *filepath)\r\n{\r\n    int result = false;\r\n    void *filebuf = NULL;\r\n    int filesize = 0;\r\n\r\n    dbg_time(\"%s %s\\n\", __func__, partion);\r\n\r\n    if (filepath)\r\n    {\r\n        filesize = stread_fread(filepath, &filebuf);\r\n        if (filesize <= 0)\r\n        {\r\n            if (filebuf)\r\n            {\r\n                free(filebuf);\r\n                filebuf = NULL;\r\n            }\r\n            return 0;\r\n        }\r\n    }\r\n    else\r\n    {\r\n        filesize = 4 * 1024;\r\n        filebuf = (unsigned char *)malloc(filesize);\r\n        if (filebuf == NULL)\r\n        {\r\n            return 0;\r\n        }\r\n\r\n        memset(filebuf, 0x00, filesize);\r\n    }\r\n\r\n    result = handle_openmulti(strlen(partion) + 1, (unsigned char *)partion);\r\n    if (result == false)\r\n    {\r\n        dbg_time(\"%s open failed\\n\", partion);\r\n        goto __fail;\r\n    }\r\n\r\n    dbg_time(\"sending '%s' (%dKB)\\n\", partion, (int)(filesize / 1024));\r\n\r\n    result = handle_write(filebuf, filesize);\r\n    if (result == false)\r\n    {\r\n        dbg_time(\"%s download failed\\n\", partion);\r\n        goto __fail;\r\n    }\r\n\r\n    result = handle_close();\r\n    if (result == false)\r\n    {\r\n        dbg_time(\"%s close failed.\\n\", partion);\r\n        goto __fail;\r\n    }\r\n\r\n    dbg_time(\"OKAY\\n\");\r\n\r\n__fail:\r\n    free(filebuf);\r\n\r\n    return result;\r\n}\r\n\r\nint stream_download(const char *firehose_dir, void *usb_handle, unsigned qusb_zlp_mode)\r\n{\r\n    (void)qusb_zlp_mode;\r\n    stream_usb_handle = usb_handle;\r\n    stream_firehose_dir = firehose_dir;\r\n\r\n    if (handle_hello() == false)\r\n    {\r\n        dbg_time(\"Send hello command fail\\n\");\r\n        return false;\r\n    }\r\n\r\n    /*\r\n    hello packet will set dload flag in module, when upgrade interrup, restart module,module will\r\n    enter dm(quectel sbl)\r\n    */\r\n    if (handle_security_mode(1) == false)\r\n    {\r\n        dbg_time(\"Send trust command fail\\n\");\r\n        return false;\r\n    }\r\n\r\n    if (handle_parti_tbl(0) == false)\r\n    {\r\n        dbg_time(\"----------------------------------\\n\");\r\n        dbg_time(\"Detect partition mismatch.\\n\");\r\n        dbg_time(\"Download parition with override.\\n\");\r\n        dbg_time(\"----------------------------------\\n\");\r\n\r\n        if (handle_parti_tbl(1) == false)\r\n        {\r\n            dbg_time(\"override failed. \\n\");\r\n            return false;\r\n        }\r\n\r\n        /*\r\n        partition is not match, the download flag will be clear, so set it again, reset will clear\r\n        it\r\n        */\r\n        if (handle_quectel_download_flag(1) == false)\r\n        {\r\n            dbg_time(\"Set Quectel download flag failed\\n\");\r\n        }\r\n        else\r\n        {\r\n            dbg_time(\"Set Quectel download flag successfully\\n\");\r\n        }\r\n    }\r\n\r\n#if 1\r\n    if (do_flash_mbn(\"0:SBL\", \"sbl1.mbn\") == false)\r\n    {\r\n        return false;\r\n    }\r\n#endif\r\n\r\n    if (handle_reset() == false)\r\n    {\r\n        dbg_time(\"Send reset command failed\\n\");\r\n        return false;\r\n    }\r\n\r\n    dbg_time(\"%s successful\\n\", __func__);\r\n\r\n    return true;\r\n}\r\n\r\n// retrieve module soft revision\r\n\r\ntypedef struct\r\n{\r\n    unsigned char cmd_code;\r\n    unsigned char version;\r\n    unsigned char reserved[2];\r\n    unsigned char msm[4];\r\n    unsigned char mobile_modle_number[4];\r\n    unsigned char mobile_software_revision[1];\r\n} __attribute__((packed)) extended_build_id_response_t;\r\n\r\nint retrieve_soft_revision(void *usb_handle, uint8_t *mobile_software_revision, unsigned length)\r\n{\r\n    /*\r\n    80-v1294-1_yyd_serial_interface_control_document_(icd)_for_cdma_dual-mode_subscriber_station_data\r\n    3.4.122 Extended Build ID\r\n    */\r\n    uint8_t req1[] = {0x7E, 0x7C, 0x93, 0x49, 0x7E};\r\n    int ret;\r\n    uint8_t *rx_buff = malloc(2048);\r\n\r\n    memset(mobile_software_revision, 0x00, length);\r\n\r\n    if (rx_buff == NULL) return 0;\r\n\r\n    ret = qusb_noblock_write(usb_handle, req1, sizeof(req1), sizeof(req1), 1000, 0);\r\n    if (ret > 0)\r\n    {\r\n        ret = qusb_noblock_read(usb_handle, rx_buff, 2048, 1, 3000);\r\n        if (ret > 0)\r\n        {\r\n            if (rx_buff[0] == 0x7C && rx_buff[ret - 1] == 0x7E)\r\n            {\r\n                extended_build_id_response_t *rsp = (extended_build_id_response_t *)rx_buff;\r\n                (void)length;\r\n                memcpy(mobile_software_revision, rsp->mobile_software_revision,\r\n                       strlen((const char *)rsp->mobile_software_revision));\r\n            }\r\n        }\r\n    }\r\n\r\n    free(rx_buff);\r\n    return (mobile_software_revision[0] != '\\0');\r\n}\r\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/usb2tcp.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software.\r\n    Under no circumstances may customers modify, demonstrate, use, deliver\r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include <stdio.h>\r\n#include <ctype.h>\r\n#include <fcntl.h>\r\n#include <stdlib.h>\r\n#include <stdint.h>\r\n#include <string.h>\r\n#include <stdio.h>\r\n#include <unistd.h>\r\n#include <errno.h>\r\n#include <time.h>\r\n#include <termios.h>\r\n#include <dirent.h>\r\n#include <pthread.h>\r\n#include <sys/socket.h>\r\n#include <sys/ioctl.h>\r\n#include <poll.h>\r\n#include <netinet/in.h>\r\n#include <linux/un.h>\r\n#include <linux/usbdevice_fs.h>\r\n#include <linux/version.h>\r\n#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 20)\r\n#include <linux/usb/ch9.h>\r\n#else\r\n#include <linux/usb_ch9.h>\r\n#endif\r\n//#include <asm/byteorder.h>\r\n#include \"usb_linux.h\"\r\n#include <endian.h> //for __BYTE_ORDER\r\nchar *inet_ntoa(struct in_addr in);\r\n\r\n#define dprintf dbg_time\r\n\r\n#define MIN(a, b) ((a) < (b) ? (a) : (b))\r\n\r\n#define MAX_USBFS_BULK_IN_SIZE (4 * 1024)\r\n#define MAX_USBFS_BULK_OUT_SIZE (16 * 1024)\r\n\r\nstatic uint32_t cpu_to_le32(uint32_t v32)\r\n{\r\n    uint32_t tmp = v32;\r\n#if __BYTE_ORDER == __LITTLE_ENDIAN\r\n#else\r\n    unsigned char *s = (unsigned char *)(&v32);\r\n    unsigned char *d = (unsigned char *)(&tmp);\r\n    d[0] = s[3];\r\n    d[1] = s[2];\r\n    d[2] = s[1];\r\n    d[3] = s[0];\r\n#endif\r\n    return tmp;\r\n}\r\n#define le32_to_cpu(_v32) cpu_to_le32(_v32)\r\n\r\nstatic int qusb_control[2];\r\n\r\nstatic int noblock_full_read(int fd, void *pbuf, ssize_t size)\r\n{\r\n    ssize_t cur = 0;\r\n\r\n    while (cur < size)\r\n    {\r\n        ssize_t ret = read(fd, (char *)pbuf + cur, size - cur);\r\n\r\n        if (ret > 0)\r\n            cur += ret;\r\n        else if (ret < 0 && errno == EAGAIN)\r\n        {\r\n            struct pollfd pollfds[] = {{fd, POLLIN, 0}};\r\n            poll(pollfds, 1, -1);\r\n            if (pollfds[0].revents & (POLLERR | POLLHUP | POLLNVAL)) break;\r\n        }\r\n        else\r\n        {\r\n            dprintf(\"fd=%d read=%zd, errno: %d (%s)\\n\", fd, ret, errno, strerror(errno));\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (cur != size)\r\n    {\r\n        dprintf(\"%s fd=%d cur=%zd, size=%zd\\n\", __func__, fd, cur, size);\r\n    }\r\n\r\n    return cur;\r\n}\r\n\r\nstatic ssize_t noblock_full_write(int fd, const void *pbuf, ssize_t size)\r\n{\r\n    ssize_t cur = 0;\r\n\r\n    while (cur < size)\r\n    {\r\n        ssize_t ret = write(fd, (char *)pbuf + cur, size - cur);\r\n        if (ret > 0)\r\n            cur += ret;\r\n        else if (ret <= 0 && errno == EAGAIN)\r\n        {\r\n            struct pollfd pollfds[] = {{fd, POLLOUT, 0}};\r\n            poll(pollfds, 1, -1);\r\n            if (pollfds[0].revents & (POLLERR | POLLHUP | POLLNVAL)) break;\r\n        }\r\n        else\r\n        {\r\n            dprintf(\"fd=%d write=%zd, errno: %d (%s)\\n\", fd, ret, errno, strerror(errno));\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (cur != size)\r\n    {\r\n        dprintf(\"%s fd=%d cur=%zd, size=%zd\\n\", __func__, fd, cur, size);\r\n    }\r\n\r\n    return cur;\r\n}\r\n\r\nstatic void *usb_bulk_read_thread(void *arg)\r\n{\r\n    const void *usb_handle = arg;\r\n    void *buf = malloc(MAX_USBFS_BULK_IN_SIZE);\r\n    int fd = qusb_control[1];\r\n\r\n    if (buf == NULL) return NULL;\r\n\r\n    while (usb_handle)\r\n    {\r\n        int count = qusb_noblock_read(usb_handle, buf, MAX_USBFS_BULK_IN_SIZE, 1, 30000);\r\n\r\n        if (count > 0)\r\n        {\r\n            count = write(fd, buf, count);\r\n            count = read(fd, buf, 32); // wait usb2tcp_main read\r\n            if (count <= 0)\r\n            {\r\n                dprintf(\"read=%d\\n\", count);\r\n                break;\r\n            }\r\n        }\r\n        else if (count <= 0)\r\n        {\r\n            break;\r\n        }\r\n    }\r\n\r\n    close(fd);\r\n    free(buf);\r\n    return NULL;\r\n}\r\n\r\nstatic int qusb_open(const void *usb_handle)\r\n{\r\n    int fd = -1;\r\n    pthread_t thread_id;\r\n\r\n    pthread_attr_t usb_thread_attr;\r\n    pthread_attr_init(&usb_thread_attr);\r\n    pthread_attr_setdetachstate(&usb_thread_attr, PTHREAD_CREATE_DETACHED);\r\n\r\n    socketpair(AF_LOCAL, SOCK_STREAM, 0, qusb_control);\r\n    pthread_create(&thread_id, &usb_thread_attr, usb_bulk_read_thread, (void *)usb_handle);\r\n\r\n    fd = qusb_control[0];\r\n\r\n    // pthread_attr_destroy(&usb_thread_attr);     //aaron 2023.07.27\r\n    return fd;\r\n}\r\n\r\nstatic ssize_t qusb_read(int fd, void *pbuf, size_t size) { return read(fd, pbuf, size); }\r\n\r\nstatic int create_tcp_server(int socket_port)\r\n{\r\n    int sockfd = -1;\r\n    int reuse_addr = 1;\r\n    struct sockaddr_in sockaddr;\r\n\r\n    dprintf(\"%s tcp_port=%d\\n\", __func__, socket_port);\r\n    /*Create server socket*/\r\n    sockfd = socket(AF_INET, SOCK_STREAM, 0);\r\n    if (sockfd <= 0) return sockfd;\r\n\r\n    memset(&sockaddr, 0, sizeof(sockaddr));\r\n    sockaddr.sin_family = AF_INET;\r\n    sockaddr.sin_addr.s_addr = htonl(INADDR_ANY);\r\n    sockaddr.sin_port = htons(socket_port);\r\n\r\n    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse_addr, sizeof(reuse_addr));\r\n    if (bind(sockfd, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) < 0)\r\n    {\r\n        close(sockfd);\r\n        dprintf(\"%s bind %d errno: %d (%s)\\n\", __func__, socket_port, errno, strerror(errno));\r\n        return -1;\r\n    }\r\n\r\n    return sockfd;\r\n}\r\n\r\nstatic int wait_client_connect(int server_fd)\r\n{\r\n    int client_fd = -1;\r\n    unsigned char addr[128];\r\n    socklen_t alen = sizeof(addr);\r\n\r\n    dprintf(\"%s\\n\", __func__);\r\n    listen(server_fd, 1);\r\n    client_fd = accept(server_fd, (struct sockaddr *)addr, &alen);\r\n    if (client_fd <= 0) return client_fd;\r\n\r\n    if (client_fd > 0)\r\n    {\r\n        struct sockaddr_in *addr_in = (struct sockaddr_in *)addr;\r\n        dprintf(\"clientfd = %d %s:%d connect\\n\", client_fd, inet_ntoa(addr_in->sin_addr),\r\n                addr_in->sin_port);\r\n    }\r\n\r\n    return client_fd;\r\n}\r\n\r\nint usb2tcp_main(const void *usb_handle, int tcp_port, unsigned qusb_zlp_mode)\r\n{\r\n    void *pbuf = malloc(MAX_USBFS_BULK_OUT_SIZE);\r\n    int server_fd = -1, client_fd = -1, usb_fd = -1, size = -1;\r\n    TLV_USB tlv_usb;\r\n\r\n    if (pbuf == NULL) return -1;\r\n\r\n    server_fd = create_tcp_server(tcp_port);\r\n    dprintf(\"server_fd=%d\\n\", server_fd);\r\n    if (server_fd <= 0)\r\n    {\r\n        dprintf(\"Fail create_tcp_server\\n\");\r\n        goto _out;\r\n    }\r\n\r\n    if (client_fd <= 0)\r\n    {\r\n        client_fd = wait_client_connect(server_fd);\r\n        if (client_fd < 0)\r\n        {\r\n            dprintf(\"Fail wait_client_connect\\n\");\r\n            goto _out;\r\n        }\r\n    }\r\n\r\n    usb_fd = qusb_open(usb_handle);\r\n    dprintf(\"usb_fd = %d\\n\", usb_fd);\r\n\r\n    tlv_usb.tag = cpu_to_le32(Q_USB2TCP_VERSION);\r\n    tlv_usb.length = cpu_to_le32(12);\r\n    tlv_usb.idVendor = cpu_to_le32(0x05c6);\r\n    tlv_usb.idProduct = cpu_to_le32(0x9008);\r\n    tlv_usb.interfaceNum = cpu_to_le32(1);\r\n    if (write(client_fd, &tlv_usb, sizeof(tlv_usb)) == -1)\r\n    {\r\n    };\r\n\r\n    fcntl(usb_fd, F_SETFL, fcntl(usb_fd, F_GETFL) | O_NONBLOCK);\r\n    fcntl(client_fd, F_SETFL, fcntl(client_fd, F_GETFL) | O_NONBLOCK);\r\n\r\n    while (usb_fd > 0 && client_fd > 0)\r\n    {\r\n        struct pollfd pollfds[] = {{usb_fd, POLLIN, 0}, {client_fd, POLLIN, 0}};\r\n        int ne, ret, nevents = sizeof(pollfds) / sizeof(pollfds[0]);\r\n\r\n        do\r\n        {\r\n            ret = poll(pollfds, nevents, -1);\r\n        } while (ret < 0 && errno == EINTR);\r\n\r\n        if (ret <= 0)\r\n        {\r\n            dprintf(\"%s poll=%d, errno: %d (%s)\\n\", __func__, ret, errno, strerror(errno));\r\n            goto _hangup;\r\n        }\r\n\r\n        if (pollfds[0].revents & (POLLERR | POLLHUP | POLLNVAL))\r\n        {\r\n            dprintf(\"%s poll usb_fd = %d, revents = %04x\\n\", __func__, usb_fd, pollfds[0].revents);\r\n            goto _hangup;\r\n        }\r\n\r\n        if (pollfds[1].revents & (POLLERR | POLLHUP | POLLNVAL))\r\n        {\r\n            dprintf(\"%s poll client_fd = %d, revents = %04x\\n\", __func__, client_fd,\r\n                    pollfds[1].revents);\r\n            goto _hangup;\r\n        }\r\n\r\n        for (ne = 0; ne < nevents; ne++)\r\n        {\r\n            int fd = pollfds[ne].fd;\r\n            TLV tlv = {Q_USB2TCP_VERSION, 0};\r\n\r\n            if ((pollfds[ne].revents & POLLIN) == 0) continue;\r\n\r\n            if (fd == usb_fd)\r\n            {\r\n                size = qusb_read(usb_fd, pbuf, MAX_USBFS_BULK_IN_SIZE);\r\n                if (size <= 0)\r\n                {\r\n                    dprintf(\"usb_fd=%d read=%d, errno: %d (%s)\\n\", fd, size, errno,\r\n                            strerror(errno));\r\n                    goto _hangup;\r\n                    ;\r\n                }\r\n                if (write(usb_fd, pbuf, 1) == -1)\r\n                {\r\n                }; // wakeup usb_bulk_read_thread\r\n\r\n                tlv.tag = cpu_to_le32(Q_USB2TCP_VERSION);\r\n                tlv.length = cpu_to_le32(size);\r\n                if (sizeof(tlv) != noblock_full_write(client_fd, &tlv, sizeof(tlv)))\r\n                {\r\n                    goto _hangup;\r\n                    break;\r\n                }\r\n\r\n                if (size != noblock_full_write(client_fd, pbuf, size))\r\n                {\r\n                    goto _hangup;\r\n                    break;\r\n                }\r\n            }\r\n            else if (fd == client_fd)\r\n            {\r\n                size = noblock_full_read(client_fd, &tlv, sizeof(tlv));\r\n                if (size != sizeof(tlv))\r\n                {\r\n                    dprintf(\"client_fd=%d read=%d, errno: %d (%s)\\n\", fd, size, errno,\r\n                            strerror(errno));\r\n                    goto _hangup;\r\n                }\r\n\r\n                if (le32_to_cpu(tlv.tag) != Q_USB2TCP_VERSION)\r\n                {\r\n                    break;\r\n                }\r\n\r\n                size = le32_to_cpu(tlv.length);\r\n                if (size != noblock_full_read(client_fd, pbuf, size))\r\n                {\r\n                    goto _hangup;\r\n                    break;\r\n                }\r\n                qusb_noblock_write(usb_handle, pbuf, size, size, 3000, qusb_zlp_mode);\r\n            }\r\n        }\r\n    }\r\n\r\n_hangup:\r\n    if (usb_fd > 0)\r\n    {\r\n        close(usb_fd);\r\n        usb_fd = -1;\r\n    }\r\n    if (client_fd > 0)\r\n    {\r\n        close(client_fd);\r\n        client_fd = -1;\r\n    }\r\n\r\n_out:\r\n    if (server_fd > 0)\r\n    {\r\n        close(server_fd);\r\n        server_fd = -1;\r\n    }\r\n\r\n    free(pbuf);\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/usb_linux.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software.\r\n    Under no circumstances may customers modify, demonstrate, use, deliver\r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include <stdio.h>\r\n#include <ctype.h>\r\n#include <fcntl.h>\r\n#include <stdlib.h>\r\n#include <stdint.h>\r\n#include <string.h>\r\n#include <stdio.h>\r\n#include <unistd.h>\r\n#include <errno.h>\r\n#include <time.h>\r\n#include <termios.h>\r\n#include <dirent.h>\r\n#include <pthread.h>\r\n#include <poll.h>\r\n#include <sys/socket.h>\r\n#include <sys/ioctl.h>\r\n#include <sys/utsname.h>\r\n#include <netinet/in.h>\r\n#include <linux/un.h>\r\n#include <linux/usbdevice_fs.h>\r\n#include <linux/version.h>\r\n#if LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 20)\r\n#include <linux/usb/ch9.h>\r\n#else\r\n#include <linux/usb_ch9.h>\r\n#endif\r\n#include <sys/time.h>\r\n#include <stdarg.h>\r\n#include <sys/sysmacros.h>\r\n#include \"usb_linux.h\"\r\n\r\nint edl_pcie_mhifd = -1;\r\nint switch_to_edl_mode(void *usb_handle);\r\n\r\nextern uint32_t inet_addr(const char *);\r\n\r\n#define MAX_USBFS_BULK_IN_SIZE (4 * 1024)\r\n#define EC20_MAX_INF 4\r\n#define MKDEV(__ma, __mi) (((__ma & 0xfff) << 8) | (__mi & 0xff) | ((__mi & 0xfff00) << 12))\r\n\r\nstruct quectel_usb_device\r\n{\r\n    char devname[64];\r\n    int desc;\r\n    int ttyfd;\r\n    int idVendor;\r\n    int idProduct;\r\n    uint8_t bNumInterfaces;\r\n    uint8_t intr_ep[EC20_MAX_INF];\r\n    uint8_t bulk_ep_in[EC20_MAX_INF];\r\n    uint8_t bulk_ep_out[EC20_MAX_INF];\r\n    int wMaxPacketSize[EC20_MAX_INF];\r\n    int control[EC20_MAX_INF][2];\r\n};\r\n\r\nstatic struct quectel_usb_device quectel_9x07;\r\nstatic int tcp_socket_fd = -1;\r\nstatic int usb_dm_interface = 0;\r\n\r\ntypedef struct\r\n{\r\n    char diag[32];\r\n    char edl[32];\r\n    char bhi[32];\r\n} pcie_port_classification;\r\n\r\ntypedef struct\r\n{\r\n    pcie_port_classification pcie_port_one[10];\r\n    int pcie_port_number;\r\n} pcie_port;\r\n\r\nstatic pcie_port pcie_port_defult = {{{\"/dev/mhi_DIAG\", \"/dev/mhi_EDL\", \"/dev/mhi_BHI\"},\r\n                                      {\"/dev/mhi_DIAG1\", \"/dev/mhi_EDL1\", \"/dev/mhi_BHI1\"},\r\n                                      {\"/dev/mhi_DIAG2\", \"/dev/mhi_EDL2\", \"/dev/mhi_BHI2\"},\r\n                                      {\"/dev/mhi_DIAG3\", \"/dev/mhi_EDL3\", \"/dev/mhi_BHI3\"},\r\n                                      {\"/dev/mhi_DIAG4\", \"/dev/mhi_EDL4\", \"/dev/mhi_BHI4\"},\r\n                                      {\"/dev/mhi_DIAG5\", \"/dev/mhi_EDL5\", \"/dev/mhi_BHI5\"},\r\n                                      {\"/dev/mhi_DIAG6\", \"/dev/mhi_EDL6\", \"/dev/mhi_BHI6\"},\r\n                                      {\"/dev/mhi_DIAG7\", \"/dev/mhi_EDL7\", \"/dev/mhi_BHI7\"},\r\n                                      {\"/dev/mhi_DIAG8\", \"/dev/mhi_EDL8\", \"/dev/mhi_BHI8\"},\r\n                                      {\"/dev/mhi_DIAG9\", \"/dev/mhi_EDL9\", \"/dev/mhi_BHI9\"}},\r\n                                     10};\r\n\r\nstatic int strStartsWith(const char *line, const char *prefix)\r\n{\r\n    if (!prefix || prefix[0] == '\\0') return 1;\r\n\r\n    for (; *line != '\\0' && *prefix != '\\0'; line++, prefix++)\r\n    {\r\n        if (*line != *prefix)\r\n        {\r\n            return 0;\r\n        }\r\n    }\r\n\r\n    return *prefix == '\\0';\r\n}\r\n\r\nstatic int strEndsWith(const char *line, const char *suffix)\r\n{\r\n    size_t a, b;\r\n\r\n    if (!suffix || suffix[0] == '\\0') return 1;\r\n\r\n    a = strlen(line);\r\n    b = strlen(suffix);\r\n    return (a >= b) && (strcmp(line + (a - b), suffix) == 0);\r\n}\r\n\r\nstatic const char *ctimespec(const struct timespec *ts, char *time_name, size_t len)\r\n{\r\n    time_t ltime = ts->tv_sec;\r\n    struct tm *currtime = localtime(&ltime);\r\n    if (currtime == NULL)\r\n    {\r\n        return NULL;\r\n    }\r\n\r\n    snprintf(time_name, len, \"%04d%02d%02d_%02d:%02d:%02d\", (currtime->tm_year + 1900), (currtime->tm_mon + 1), currtime->tm_mday, currtime->tm_hour, currtime->tm_min,\r\n             currtime->tm_sec);\r\n    return time_name;\r\n}\r\n\r\nstatic int quectel_get_sysinfo_by_uevent(const char *uevent, MODULE_SYS_INFO *pSysInfo)\r\n{\r\n    FILE *fp;\r\n    char line[MAX_PATH];\r\n\r\n    if (!pSysInfo)\r\n    {\r\n        dbg_time(\"pSysInfo is NULL, errno: %d (%s)\\n\", errno, strerror(errno));\r\n        return 0;\r\n    }\r\n\r\n    memset(pSysInfo, 0x00, sizeof(MODULE_SYS_INFO));\r\n\r\n    fp = fopen(uevent, \"r\");\r\n    if (fp == NULL)\r\n    {\r\n        dbg_time(\"fail to fopen %s, errno: %d (%s)\\n\", uevent, errno, strerror(errno));\r\n        return 0;\r\n    }\r\n\r\n    // dbg_time(\"%s\\n\", uevent);\r\n    while (fgets(line, sizeof(line), fp))\r\n    {\r\n        if (line[strlen(line) - 1] == '\\n' || line[strlen(line) - 1] == '\\r')\r\n        {\r\n            line[strlen(line) - 1] = '\\0';\r\n        }\r\n\r\n        // dbg_time(\"%s\\n\", line);\r\n        if (strStartsWith(line, \"MAJOR=\"))\r\n        {\r\n            pSysInfo->MAJOR = atoi(&line[strlen(\"MAJOR=\")]);\r\n        }\r\n        else if (strStartsWith(line, \"MINOR=\"))\r\n        {\r\n            pSysInfo->MINOR = atoi(&line[strlen(\"MINOR=\")]);\r\n        }\r\n        else if (strStartsWith(line, \"DEVNAME=\"))\r\n        {\r\n            strncpy(pSysInfo->DEVNAME, &line[strlen(\"DEVNAME=\")], sizeof(pSysInfo->DEVNAME));\r\n        }\r\n        else if (strStartsWith(line, \"DEVTYPE=\"))\r\n        {\r\n            strncpy(pSysInfo->DEVTYPE, &line[strlen(\"DEVTYPE=\")], sizeof(pSysInfo->DEVTYPE));\r\n        }\r\n        else if (strStartsWith(line, \"PRODUCT=\"))\r\n        {\r\n            strncpy(pSysInfo->PRODUCT, &line[strlen(\"PRODUCT=\")], sizeof(pSysInfo->PRODUCT));\r\n        }\r\n    }\r\n\r\n    fclose(fp);\r\n\r\n    return 1;\r\n}\r\n\r\n// the return value is the number of quectel modules\r\nint auto_find_quectel_modules(char *module_sys_path, unsigned size, const char *product, const struct timespec *atime)\r\n{\r\n    const char *base = \"/sys/bus/usb/devices\";\r\n    DIR *busdir = NULL;\r\n    struct dirent *de = NULL;\r\n    int count = 0;\r\n\r\n    busdir = opendir(base);\r\n    if (busdir == NULL) return -1;\r\n\r\n    while ((de = readdir(busdir)))\r\n    {\r\n        static char uevent[MAX_PATH];\r\n        static MODULE_SYS_INFO sysinfo;\r\n\r\n        if (!isdigit(de->d_name[0])) continue;\r\n\r\n        snprintf(uevent, sizeof(uevent), \"%.24s/%.16s/uevent\", base, de->d_name);\r\n        if (!quectel_get_sysinfo_by_uevent(uevent, &sysinfo)) continue;\r\n\r\n        if (sysinfo.MAJOR != 189) continue;\r\n\r\n        // dbg_time(\"MAJOR=%d, MINOR=%d, DEVNAME=%s, DEVTYPE=%s, PRODUCT=%s\\n\",\r\n        //    sysinfo.MAJOR, sysinfo.MINOR, sysinfo.DEVNAME, sysinfo.DEVTYPE, sysinfo.PRODUCT);\r\n\r\n        if (sysinfo.DEVTYPE[0] == '\\0' || strStartsWith(sysinfo.DEVTYPE, \"usb_device\") == 0) continue;\r\n\r\n        if (sysinfo.PRODUCT[0] == '\\0')\r\n        {\r\n            continue;\r\n        }\r\n\r\n        if (!(strStartsWith(sysinfo.PRODUCT, \"2c7c/\")        //\r\n              || strStartsWith(sysinfo.PRODUCT, \"5c6/9008\")  //\r\n              || strStartsWith(sysinfo.PRODUCT, \"5c6/901f\")  //\r\n              || strStartsWith(sysinfo.PRODUCT, \"5c6/9091\")  //\r\n              || strStartsWith(sysinfo.PRODUCT, \"5c6/90db\")  //\r\n              || strStartsWith(sysinfo.PRODUCT, \"3c93/ffff\") //\r\n              || strStartsWith(sysinfo.PRODUCT, \"3763/3c93\")))\r\n        {\r\n            continue;\r\n        }\r\n\r\n        if (strStartsWith(sysinfo.PRODUCT, \"5c6/90db\"))\r\n        {\r\n            g_is_module_adb_entry_edl += 1;\r\n        }\r\n\r\n        if ((strStartsWith(sysinfo.PRODUCT, \"2c7c/6\") || strStartsWith(sysinfo.PRODUCT, \"2c7c/8\")) && (sysinfo.PRODUCT[strlen(\"2c7c/6000\")] == '/')) // skip ASR&HISI modules\r\n        {\r\n            if ((strStartsWith(sysinfo.PRODUCT, \"2c7c/6008\")) || strStartsWith(sysinfo.PRODUCT, \"2c7c/6009\"))\r\n            {\r\n                // EM061KGL, not ASR module, do not skip\r\n            }\r\n            else\r\n                continue;\r\n        }\r\n\r\n        if (product && !strStartsWith(sysinfo.PRODUCT, product))\r\n        {\r\n            dbg_time(\"skip %.24s/%s for PRODUCT %s is not %s\\n\", base, de->d_name, sysinfo.PRODUCT, product);\r\n            continue;\r\n        }\r\n\r\n        if (atime)\r\n        {\r\n            struct timespec this_atime;\r\n            int speed;\r\n\r\n            snprintf(uevent, sizeof(uevent), \"%.24s/%.16s\", base, de->d_name);\r\n            if (qusb_read_speed_atime(uevent, &this_atime, &speed))\r\n            {\r\n                if ((this_atime.tv_sec < atime->tv_sec) || (this_atime.tv_sec == atime->tv_sec && this_atime.tv_nsec < atime->tv_nsec))\r\n                {\r\n                    char t1[64], t2[64];\r\n\r\n                    dbg_time(\"skip %.24s/%s for atime {%s} old than {%s}\\n\", base, de->d_name, ctimespec(&this_atime, t1, sizeof(t1)), ctimespec(atime, t2, sizeof(t2)));\r\n                    continue;\r\n                }\r\n            }\r\n        }\r\n\r\n        snprintf(module_sys_path, size, \"%.24s/%s\", base, de->d_name);\r\n        count++;\r\n        dbg_time(\"[%d] %s %s\\n\", count, module_sys_path, sysinfo.PRODUCT);\r\n    }\r\n\r\n    closedir(busdir);\r\n    return count;\r\n}\r\n\r\nvoid quectel_get_ttyport_by_syspath(const char *module_sys_path, char *module_port_name, unsigned size)\r\n{\r\n    char infname[256];\r\n    DIR *infdir = NULL;\r\n    struct dirent *de = NULL;\r\n\r\n    module_port_name[0] = '\\0';\r\n\r\n    sprintf(infname, \"%s:1.%d\", module_sys_path, usb_dm_interface);\r\n    infdir = opendir(infname);\r\n    if (infdir == NULL) return;\r\n\r\n    while ((de = readdir(infdir)))\r\n    {\r\n        if (strStartsWith(de->d_name, \"ttyUSB\"))\r\n        {\r\n            snprintf(module_port_name, size, \"/dev/%s\", de->d_name);\r\n            break;\r\n        }\r\n        else if (!strncmp(de->d_name, \"tty\", strlen(\"tty\")))\r\n        {\r\n            sprintf(infname, \"%s:1.%d/tty\", module_sys_path, usb_dm_interface);\r\n            closedir(infdir);\r\n            infdir = opendir(infname);\r\n            if (infdir == NULL) break;\r\n        }\r\n    }\r\n\r\n    if (infdir) closedir(infdir);\r\n}\r\n\r\nstatic void quectel_fixup_sysport(const char *module_port_name, char *sysport, unsigned size)\r\n{\r\n    char syspath[MAX_PATH + 16];\r\n    const char *sys_base = \"/sys/class/tty\";\r\n    DIR *sys_dir = NULL;\r\n    struct dirent *dev = NULL;\r\n\r\n    sysport[0] = '\\0';\r\n    sys_dir = opendir(sys_base);\r\n    if (!sys_dir)\r\n    {\r\n        dbg_time(\"fail to opendir('%s'), errno: %d (%s)\\n\", sys_base, errno, strerror(errno));\r\n        return;\r\n    }\r\n\r\n    while (NULL != (dev = readdir(sys_dir)))\r\n    {\r\n        if (!strncasecmp(\"ttyUSB\", dev->d_name, strlen(\"ttyUSB\")))\r\n        {\r\n            MODULE_SYS_INFO sysinfo;\r\n\r\n            snprintf(syspath, sizeof(syspath), \"%.24s/%.16s/uevent\", sys_base, dev->d_name);\r\n            if (quectel_get_sysinfo_by_uevent(syspath, &sysinfo))\r\n            {\r\n                struct stat buf;\r\n                dev_t devt;\r\n\r\n                devt = makedev(sysinfo.MAJOR, sysinfo.MINOR);\r\n                if (!stat(module_port_name, &buf) && buf.st_rdev == devt)\r\n                {\r\n                    snprintf(sysport, size, \"/sys/class/tty/%.16s\", dev->d_name);\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n    }\r\n    closedir(sys_dir);\r\n}\r\n\r\nvoid quectel_get_syspath_name_by_ttyport(const char *module_port_name, char *module_sys_path, unsigned size)\r\n{\r\n    char syspath[MAX_PATH];\r\n    char sysport[64];\r\n    int count;\r\n    char *pchar = NULL;\r\n    char dm_tty[24];\r\n\r\n    snprintf(dm_tty, sizeof(dm_tty), \":1.%d/tty\", usb_dm_interface);\r\n    module_sys_path[0] = '\\0';\r\n\r\n    snprintf(sysport, sizeof(sysport), \"/sys/class/tty/%.48s\", &module_port_name[strlen(\"/dev/\")]);\r\n    if (access(sysport, F_OK) && errno == ENOENT)\r\n    {\r\n        quectel_fixup_sysport(module_port_name, sysport, sizeof(sysport)); // query real name\r\n    }\r\n    if (access(sysport, F_OK) && errno == ENOENT) return;\r\n    count = readlink(sysport, syspath, sizeof(syspath) - 1);\r\n    if (count < (int)strlen(dm_tty)) return;\r\n\r\n    // ttyUSB0 ->\r\n    // ../../devices/soc0/soc/2100000.aips-bus/2184200.usb/ci_hdrc.1/usb1/1-1/1-1:1.0/ttyUSB0/tty/ttyUSB0\r\n    pchar = strstr(syspath, dm_tty);\r\n    if (pchar == NULL) return;\r\n\r\n    *pchar = '\\0';\r\n    while (*pchar != '/') pchar--;\r\n\r\n    snprintf(module_sys_path, size, \"/sys/bus/usb/devices/%.232s\", pchar + 1);\r\n}\r\n\r\nstatic void quectel_get_usb_device_info(const char *module_sys_path, struct quectel_usb_device *udev)\r\n{\r\n    static unsigned char devdesc[1024];\r\n    size_t desclength, len;\r\n    char devname[64];\r\n    int desc_fd;\r\n    __u8 bInterfaceNumber = 0;\r\n    int dev_mknod_and_delete_after_use = 0;\r\n\r\n    MODULE_SYS_INFO sysinfo;\r\n    snprintf(devname, sizeof(devname), \"%.56s/%s\", module_sys_path, \"uevent\");\r\n    if (!quectel_get_sysinfo_by_uevent(devname, &sysinfo)) return;\r\n\r\n    snprintf(devname, sizeof(devname), \"/dev/%.56s\", sysinfo.DEVNAME);\r\n    if (access(devname, R_OK) && errno_nodev())\r\n    {\r\n        // maybe Linux have create /sys/ device, but not ready to create /dev/ device.\r\n        usleep(100 * 1000);\r\n    }\r\n\r\n    if (access(devname, R_OK) && errno_nodev())\r\n    {\r\n        char *p = strstr(devname + strlen(\"/dev/\"), \"/\");\r\n\r\n        while (p)\r\n        {\r\n            p[0] = '_';\r\n            p = strstr(p, \"/\");\r\n        }\r\n\r\n        if (mknod(devname, S_IFCHR | 0666, MKDEV(sysinfo.MAJOR, sysinfo.MINOR)))\r\n        {\r\n            devname[1] = 't';\r\n            devname[2] = 'm';\r\n            devname[3] = 'p';\r\n\r\n            if (mknod(devname, S_IFCHR | 0666, MKDEV(sysinfo.MAJOR, sysinfo.MINOR)))\r\n            {\r\n                dbg_time(\"Fail to mknod %s, errno : %d (%s)\\n\", devname, errno, strerror(errno));\r\n                return;\r\n            }\r\n        }\r\n\r\n        dev_mknod_and_delete_after_use = 1;\r\n    }\r\n\r\n    desc_fd = open(devname, O_RDWR | O_NOCTTY);\r\n\r\n    if (dev_mknod_and_delete_after_use)\r\n    {\r\n        remove(devname);\r\n    }\r\n\r\n    if (desc_fd <= 0)\r\n    {\r\n        dbg_time(\"fail to open %s, errno: %d (%s)\\n\", devname, errno, strerror(errno));\r\n        return;\r\n    }\r\n\r\n    desclength = read(desc_fd, devdesc, sizeof(devdesc));\r\n    len = 0;\r\n    while (len < desclength)\r\n    {\r\n        struct usb_descriptor_header *h = (struct usb_descriptor_header *)(&devdesc[len]);\r\n\r\n        if (h->bLength == sizeof(struct usb_device_descriptor) && h->bDescriptorType == USB_DT_DEVICE)\r\n        {\r\n            struct usb_device_descriptor *device = (struct usb_device_descriptor *)h;\r\n\r\n            udev->idVendor = device->idVendor;\r\n            udev->idProduct = device->idProduct;\r\n            dbg_time(\"P: %s idVendor=%04x idProduct=%04x\\n\", devname, device->idVendor, device->idProduct);\r\n        }\r\n        else if (h->bLength == sizeof(struct usb_config_descriptor) && h->bDescriptorType == USB_DT_CONFIG)\r\n        {\r\n            struct usb_config_descriptor *config = (struct usb_config_descriptor *)h;\r\n\r\n            dbg_time(\"C: %s bNumInterfaces: %d\\n\", devname, config->bNumInterfaces);\r\n            udev->bNumInterfaces = config->bNumInterfaces;\r\n        }\r\n        else if (h->bLength == sizeof(struct usb_interface_descriptor) && h->bDescriptorType == USB_DT_INTERFACE)\r\n        {\r\n            struct usb_interface_descriptor *interface = (struct usb_interface_descriptor *)h;\r\n\r\n            dbg_time(\"I: If#= %d Alt= %d #EPs= %d Cls=%02x Sub=%02x Prot=%02x\\n\", interface->bInterfaceNumber, interface->bAlternateSetting, interface->bNumEndpoints,\r\n                     interface->bInterfaceClass, interface->bInterfaceSubClass, interface->bInterfaceProtocol);\r\n            bInterfaceNumber = interface->bInterfaceNumber;\r\n        }\r\n        else if (h->bLength == USB_DT_ENDPOINT_SIZE && h->bDescriptorType == USB_DT_ENDPOINT)\r\n        {\r\n            if (bInterfaceNumber < EC20_MAX_INF)\r\n            {\r\n                struct usb_endpoint_descriptor *endpoint = (struct usb_endpoint_descriptor *)h;\r\n\r\n                dbg_time(\"E: Ad=%02x Atr=%02x MxPS= %d Ivl=%dms\\n\", endpoint->bEndpointAddress, endpoint->bmAttributes, endpoint->wMaxPacketSize, endpoint->bInterval);\r\n\r\n                if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_BULK)\r\n                {\r\n                    if (endpoint->bEndpointAddress & USB_ENDPOINT_DIR_MASK)\r\n                        udev->bulk_ep_in[bInterfaceNumber] = endpoint->bEndpointAddress;\r\n                    else\r\n                        udev->bulk_ep_out[bInterfaceNumber] = endpoint->bEndpointAddress;\r\n                    udev->wMaxPacketSize[bInterfaceNumber] = endpoint->wMaxPacketSize;\r\n                }\r\n                else if ((endpoint->bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) == USB_ENDPOINT_XFER_INT)\r\n                {\r\n                    udev->intr_ep[bInterfaceNumber] = endpoint->bEndpointAddress;\r\n                }\r\n            }\r\n        }\r\n        else\r\n        {\r\n        }\r\n\r\n        len += h->bLength;\r\n    }\r\n\r\n    if (len == desclength)\r\n    {\r\n        strcpy(udev->devname, devname);\r\n        udev->desc = desc_fd;\r\n    }\r\n\r\n    usb_dm_interface = 0;\r\n\r\n    if ((udev->idVendor == 0x2c7c && udev->idProduct == 0x0127)     // EM05CEFC-LNV  Laptop\r\n        || (udev->idVendor == 0x2c7c && udev->idProduct == 0x0310)  // EM05-CN       Laptop\r\n        || (udev->idVendor == 0x2c7c && udev->idProduct == 0x030a)  // EM05-G        Laptop\r\n        || (udev->idVendor == 0x2c7c && udev->idProduct == 0x0311)  // EM05-G-SE10   Laptop\r\n        || (udev->idVendor == 0x2c7c && udev->idProduct == 0x0315)  // EM05-G STD    Laptop\r\n        || (udev->idVendor == 0x2c7c && udev->idProduct == 0x0309)  // EM05E-EDU     Laptop\r\n        || (udev->idVendor == 0x2c7c && udev->idProduct == 0x6008)  // EM061KGL      laptop\r\n        || (udev->idVendor == 0x2c7c && udev->idProduct == 0x0128)  // Google EM060KGL laptop\r\n        || (udev->idVendor == 0x2c7c && udev->idProduct == 0x6009)  // EM061KGL      laptop\r\n        || (udev->idVendor == 0x2c7c && udev->idProduct == 0x0803)  // RM520NGL      thinkpad 5G module dedicated pid\r\n        || (udev->idVendor == 0x2c7c && udev->idProduct == 0x012E)  // EM120K-GL     laptop\r\n        || (udev->idVendor == 0x2c7c && udev->idProduct == 0x012F)  // EM120K-GL     laptop\r\n        || (udev->idVendor == 0x2c7c && udev->idProduct == 0x0804)  // Customized PID for Zebra project     laptop\r\n        || (udev->idVendor == 0x2c7c && udev->idProduct == 0x030d)) // EM05G-FCCL    Laptop\r\n    {\r\n        usb_dm_interface = 3;\r\n    }\r\n    else if ((udev->idVendor == 0x2c7c && udev->idProduct == 0x0514)     // EG060K-EA\r\n             || (udev->idVendor == 0x2c7c && udev->idProduct == 0x0133)) // RG650VEU-rndis\r\n    {\r\n        usb_dm_interface = 2;\r\n    }\r\n    else if (udev->idVendor == 0x3c93 && udev->idProduct == 0xffff) // EG060K-EA\r\n    {\r\n        usb_dm_interface = 8;\r\n    }\r\n    else if (udev->idVendor == 0x05c6 && udev->idProduct == 0x90db) // (udev->idVendor == 0x05c6 && udev->idProduct == 0x90db)  // AG600K-EM\r\n    {\r\n        usb_dm_interface = 2;\r\n    }\r\n    else if (udev->idVendor == 0x2c7c && udev->idProduct == 0x030b) // EG120KEABA-RNDIS\r\n    {\r\n        usb_dm_interface = 0;\r\n        if (g_from_ecm_to_rndis) usb_dm_interface = 2;\r\n    }\r\n}\r\n\r\nstatic int usbfs_bulk_write(struct quectel_usb_device *udev, const void *data, int len, int timeout_msec, int need_zlp)\r\n{\r\n    struct usbdevfs_urb bulk;\r\n    struct usbdevfs_urb *urb = &bulk;\r\n    int n = -1;\r\n    int bInterfaceNumber = usb_dm_interface;\r\n\r\n    (void)timeout_msec;\r\n    // if (urb->type == 0)\r\n    {\r\n        memset(urb, 0, sizeof(struct usbdevfs_urb));\r\n        urb->type = USBDEVFS_URB_TYPE_BULK;\r\n        urb->endpoint = udev->bulk_ep_out[bInterfaceNumber];\r\n    }\r\n\r\n    urb->status = -1;\r\n    urb->buffer = (void *)data;\r\n    urb->buffer_length = len;\r\n    urb->usercontext = urb;\r\n\r\n    if (need_zlp && (len % udev->wMaxPacketSize[bInterfaceNumber]) == 0)\r\n    {\r\n        // dbg_time(\"USBDEVFS_URB_ZERO_PACKET\\n\");\r\n#ifndef USBDEVFS_URB_ZERO_PACKET\r\n#define USBDEVFS_URB_ZERO_PACKET 0x40\r\n#endif\r\n        urb->flags = USBDEVFS_URB_ZERO_PACKET;\r\n    }\r\n    else\r\n    {\r\n        urb->flags = 0;\r\n    }\r\n\r\n    do\r\n    {\r\n        n = ioctl(udev->desc, USBDEVFS_SUBMITURB, urb);\r\n    } while ((n < 0) && (errno == EINTR));\r\n\r\n    if (n != 0)\r\n    {\r\n        dbg_time(\"inf[%d] USBDEVFS_SUBMITURB %d/%d, errno = %d (%s)\\n\", bInterfaceNumber, n, urb->buffer_length, errno, strerror(errno));\r\n        return -1;\r\n    }\r\n\r\n    do\r\n    {\r\n        urb = NULL;\r\n        n = ioctl(udev->desc, USBDEVFS_REAPURB, &urb);\r\n    } while ((n < 0) && (errno == EINTR));\r\n\r\n    if (n != 0)\r\n    {\r\n        dbg_time(\"inf[%d] ep_out %d/%d, errno = %d (%s)\\n\", bInterfaceNumber, n, urb->buffer_length, errno, strerror(errno));\r\n    }\r\n\r\n    // dbg_time(\"[ urb @%p status = %d, actual = %d ]\\n\", urb, urb->status, urb->actual_length);\r\n\r\n    if (urb && urb->status == 0 && urb->actual_length) return urb->actual_length;\r\n\r\n    return -1;\r\n}\r\n\r\nstatic int poll_wait(int poll_fd, short events, int timeout_msec)\r\n{\r\n    struct pollfd pollfds[] = {{poll_fd, events, 0}};\r\n    int ret;\r\n\r\n    do\r\n    {\r\n        ret = poll(pollfds, 1, timeout_msec);\r\n    } while (ret == -1 && errno == EINTR);\r\n\r\n    if (ret == 1 && (pollfds[0].revents & (events)))\r\n        return 0;\r\n    else if (ret == 0)\r\n    { // timeout\r\n        dbg_time(\"poll_wait events=%s msec=%d timeout\\n\", (events & POLLIN) ? \"POLLIN\" : \"POLLOUT\", timeout_msec);\r\n        return ETIMEDOUT;\r\n    }\r\n\r\n    return EIO;\r\n}\r\n\r\nstatic int usbfs_bulk_read(struct quectel_usb_device *udev, void *pbuf, int len, int timeout)\r\n{\r\n    struct usbdevfs_bulktransfer bulk;\r\n    int n = -1;\r\n    int bInterfaceNumber = usb_dm_interface;\r\n\r\n    if (len < 512)\r\n    {\r\n        dbg_time(\"%s len=%d is too short\\n\", __func__, len);\r\n        return 0;\r\n    }\r\n\r\n    bulk.ep = udev->bulk_ep_in[bInterfaceNumber];\r\n    bulk.len = (len > MAX_USBFS_BULK_IN_SIZE) ? MAX_USBFS_BULK_IN_SIZE : len;\r\n    bulk.data = (void *)pbuf;\r\n    bulk.timeout = timeout;\r\n\r\n    n = ioctl(udev->desc, USBDEVFS_BULK, &bulk);\r\n    if (n <= 0)\r\n    {\r\n        if (errno == ETIMEDOUT)\r\n        {\r\n            dbg_time(\"inf[%d] ep_in %d/%d, errno = %d (%s), timeout=%d\\n\", bInterfaceNumber, n, bulk.len, errno, strerror(errno), timeout);\r\n            n = 0;\r\n        }\r\n        else\r\n            dbg_time(\"inf[%d] ep_in %d/%d, errno = %d (%s)\\n\", bInterfaceNumber, n, bulk.len, errno, strerror(errno));\r\n    }\r\n\r\n    return n;\r\n}\r\n\r\nstatic int qtcp_connect(const char *port_name, int *idVendor, int *idProduct, int *interfaceNum)\r\n{\r\n    int fd = -1;\r\n    char *tcp_host = strdup(port_name);\r\n    if (tcp_host == NULL) return -1;\r\n\r\n    char *tcp_port = strchr(tcp_host, ':');\r\n    struct sockaddr_in sockaddr;\r\n    TLV_USB tlv_usb;\r\n\r\n    dbg_time(\"%s port_name = %s\\n\", __func__, port_name);\r\n\r\n    if (tcp_port == NULL)\r\n    {\r\n        if (tcp_host)\r\n        {\r\n            free(tcp_host);\r\n            tcp_host = NULL;\r\n        }\r\n        return -1;\r\n    }\r\n\r\n    *tcp_port++ = '\\0';\r\n    if (atoi(tcp_port) < 1 || atoi(tcp_port) > 0xFFFF)\r\n    {\r\n        if (tcp_host)\r\n        {\r\n            free(tcp_host);\r\n            tcp_host = NULL;\r\n        }\r\n        return -1;\r\n    }\r\n\r\n    fd = socket(AF_INET, SOCK_STREAM, 0);\r\n\r\n    if (fd <= 0)\r\n    {\r\n        if (tcp_host)\r\n        {\r\n            free(tcp_host);\r\n            tcp_host = NULL;\r\n        }\r\n        dbg_time(\"Device could not be socket: Linux System Errno: %s\\n\", strerror(errno));\r\n        return -1;\r\n    }\r\n\r\n    memset(&sockaddr, 0, sizeof(sockaddr));\r\n    sockaddr.sin_family = AF_INET;\r\n    sockaddr.sin_addr.s_addr = inet_addr(tcp_host);\r\n    sockaddr.sin_port = htons(atoi(tcp_port));\r\n\r\n    if (tcp_host)\r\n    {\r\n        free(tcp_host);\r\n        tcp_host = NULL;\r\n    }\r\n    if (connect(fd, (struct sockaddr *)&sockaddr, sizeof(sockaddr)) < 0)\r\n    {\r\n        close(fd);\r\n        fd = -1;\r\n        dbg_time(\"Device could not be connect: Linux System Errno: %s\\n\", strerror(errno));\r\n        return -1;\r\n    }\r\n\r\n    // block read, untill usb2tcp tell me the usb device information\r\n    memset(&tlv_usb, 0x00, sizeof(tlv_usb));\r\n    if (read(fd, &tlv_usb, sizeof(tlv_usb)) == -1)\r\n    {\r\n    };\r\n    *idVendor = tlv_usb.idVendor;\r\n    *idProduct = tlv_usb.idProduct;\r\n    *interfaceNum = tlv_usb.interfaceNum;\r\n\r\n    dbg_time(\"idVendor=%04x, idProduct=%04x, interfaceNum=%d\\n\", *idVendor, *idProduct, *interfaceNum);\r\n\r\n    return fd;\r\n}\r\n\r\nstatic int qtcp_read(int fd, void *pbuf, int size, int timeout_msec)\r\n{\r\n    static TLV tlv = {Q_USB2TCP_VERSION, 0};\r\n    int cur = 0;\r\n    int len;\r\n\r\n    if (tlv.length == 0)\r\n    {\r\n        len = read(fd, &tlv, sizeof(tlv));\r\n        if (len != sizeof(tlv))\r\n        {\r\n            dbg_time(\"%s read=%d, errno: %d (%s)\\n\", __func__, len, errno, strerror(errno));\r\n            return 0;\r\n        }\r\n\r\n        if (tlv.tag != Q_USB2TCP_VERSION)\r\n        {\r\n            dbg_time(\"%s tlv->tag=0x%x\\n\", __func__, tlv.tag);\r\n            return 0;\r\n        }\r\n    }\r\n\r\n    if (size > tlv.length) size = tlv.length;\r\n    tlv.length -= size;\r\n\r\n    while (cur < size)\r\n    {\r\n        if (poll_wait(fd, POLLIN, timeout_msec)) break;\r\n\r\n        len = read(fd, (uint8_t *)pbuf + cur, size - cur);\r\n        if (len > 0)\r\n        {\r\n            cur += len;\r\n        }\r\n        else\r\n        {\r\n            dbg_time(\"%s read=%d, errno: %d (%s)\\n\", __func__, len, errno, strerror(errno));\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (cur != size)\r\n    {\r\n        dbg_time(\"%s cur=%d, size=%d\\n\", __func__, cur, size);\r\n    }\r\n\r\n    return cur;\r\n}\r\n\r\nstatic int qtcp_write(int fd, void *pbuf, int size, int timeout_msec)\r\n{\r\n    TLV tlv = {Q_USB2TCP_VERSION, size};\r\n    int cur = 0;\r\n    int len;\r\n\r\n    len = write(fd, &tlv, sizeof(tlv));\r\n    if (len != sizeof(tlv))\r\n    {\r\n        dbg_time(\"%s write=%d, errno: %d (%s)\\n\", __func__, len, errno, strerror(errno));\r\n        return 0;\r\n    }\r\n\r\n    while (cur < size)\r\n    {\r\n        if (poll_wait(fd, POLLOUT, timeout_msec)) break;\r\n\r\n        len = write(fd, (uint8_t *)pbuf + cur, size - cur);\r\n        if (len > 0)\r\n        {\r\n            cur += len;\r\n        }\r\n        else\r\n        {\r\n            dbg_time(\"%s write=%d, errno: %d (%s)\\n\", __func__, len, errno, strerror(errno));\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (cur != size)\r\n    {\r\n        dbg_time(\"%s cur=%d, size=%d\\n\", __func__, cur, size);\r\n    }\r\n\r\n    return cur;\r\n}\r\n\r\nstruct usbfs_getdriver\r\n{\r\n    unsigned int interface;\r\n    char driver[255 + 1];\r\n};\r\n\r\nstruct usbfs_ioctl\r\n{\r\n    int ifno;       /* interface 0..N ; negative numbers reserved */\r\n    int ioctl_code; /* MUST encode size + direction of data so the\r\n                     * macros in <asm/ioctl.h> give correct values */\r\n    void *data;     /* param buffer (in, or out) */\r\n};\r\n\r\n#define IOCTL_USBFS_DISCONNECT _IO('U', 22)\r\n#define IOCTL_USBFS_CONNECT _IO('U', 23)\r\n\r\nint usbfs_is_kernel_driver_alive(int fd, int ifnum)\r\n{\r\n    struct usbfs_getdriver getdrv;\r\n    getdrv.interface = ifnum;\r\n    if (ioctl(fd, USBDEVFS_GETDRIVER, &getdrv) < 0)\r\n    {\r\n        if (errno != ENODATA) dbg_time(\"%s ioctl USBDEVFS_GETDRIVER failed, errno: %d (%s)\\n\", __func__, errno, strerror(errno));\r\n        return 0;\r\n    }\r\n    dbg_time(\"%s find interface %d has match the driver %s\\n\", __func__, ifnum, getdrv.driver);\r\n    return 1;\r\n}\r\n\r\nvoid usbfs_detach_kernel_driver(int fd, int ifnum)\r\n{\r\n    struct usbfs_ioctl operate;\r\n    operate.data = NULL;\r\n    operate.ifno = ifnum;\r\n    operate.ioctl_code = IOCTL_USBFS_DISCONNECT;\r\n    if (ioctl(fd, USBDEVFS_IOCTL, &operate) < 0)\r\n    {\r\n        dbg_time(\"%s detach kernel driver failed\\n\", __func__);\r\n    }\r\n    else\r\n    {\r\n        dbg_time(\"%s detach kernel driver success\\n\", __func__);\r\n    }\r\n}\r\n\r\n#define KVERSION(j, n, p) ((j)*1000000 + (n)*1000 + (p))\r\nstatic struct utsname utsname; /* for the kernel version */\r\nstatic int ql_get_kernel_version(void)\r\n{\r\n    int osmaj, osmin, ospatch;\r\n    int kernel_version;\r\n\r\n    uname(&utsname);\r\n    osmaj = osmin = ospatch = 0;\r\n    sscanf(utsname.release, \"%d.%d.%d\", &osmaj, &osmin, &ospatch);\r\n    kernel_version = KVERSION(osmaj, osmin, ospatch);\r\n\r\n    return kernel_version;\r\n}\r\n\r\nstatic int detect_xhci_usb_zero_packet_bug_not_fix(const char *module_sys_path)\r\n{\r\n    char buf[256];\r\n    int tmp;\r\n    char *driver;\r\n\r\n    tmp = snprintf(buf, sizeof(buf), \"/sys/bus/usb/devices/usb%c/../driver\", module_sys_path[strlen(\"/sys/bus/usb/devices/\")]);\r\n    driver = buf + (++tmp);\r\n    *driver = '\\0';\r\n\r\n    tmp = readlink(buf, driver, sizeof(buf) - tmp);\r\n    if (tmp <= 0) return 0;\r\n    driver[tmp] = '\\0';\r\n    dbg_time(\"tmp=%s, driver=%s\\n\", buf, driver);\r\n\r\n    if (!strstr(driver, \"xhci\")) return 0;\r\n\r\n    tmp = ql_get_kernel_version();\r\n    if (tmp >= KVERSION(4, 3, 0)) return 0;\r\n\r\n    dbg_time(\"WARNNING ON File:%s Function:%s Line:%d\\n\", __FILE__, __func__, __LINE__);\r\n    dbg_time(\"The module attach to XHCI controller, but your kernel verison less than V4.3.0\\n\");\r\n    dbg_time(\"Please make sure your kernel had apply patch 'usb: xhci: Add support for \"\r\n             \"URB_ZERO_PACKET to bulk/sg transfers'\\n\");\r\n    dbg_time(\"https://git.kernel.org/pub/scm/linux/kernel/git/next/linux-next.git/commit/drivers/\"\r\n             \"usb/host/xhci-ring.c?id=4758dcd19a7d9ba9610b38fecb93f65f56f86346\\n\");\r\n    sleep(2); // sleep 2 seconds, make sure FAE/customers can notice this warnning.\r\n\r\n    return 1;\r\n}\r\n\r\nvoid *qusb_noblock_open(const char *module_sys_path, int *idVendor, int *idProduct, int *interfaceNum)\r\n{\r\n    struct termios ios;\r\n    int retval;\r\n    int fd = -1;\r\n    struct quectel_usb_device *udev = &quectel_9x07;\r\n\r\n    *idVendor = *idProduct = *interfaceNum = 0;\r\n    tcp_socket_fd = -1;\r\n\r\n    if (module_sys_path && module_sys_path[0] == '/')\r\n    {\r\n        char port_name[64];\r\n\r\n        memset(udev, 0, sizeof(struct quectel_usb_device));\r\n        quectel_get_usb_device_info(module_sys_path, udev);\r\n        if (udev->desc <= 0) return NULL;\r\n        quectel_get_ttyport_by_syspath(module_sys_path, port_name, sizeof(port_name));\r\n        detect_xhci_usb_zero_packet_bug_not_fix(module_sys_path);\r\n\r\n        *idVendor = udev->idVendor;\r\n        *idProduct = udev->idProduct;\r\n        *interfaceNum = udev->bNumInterfaces;\r\n\r\n        if (port_name[0] == '\\0' || (port_name[0] != '\\0' && access(port_name, R_OK)) || (udev->idVendor == 0x05c6 && udev->idProduct == 0x9008))\r\n        {\r\n            int bInterfaceNumber = usb_dm_interface;\r\n\r\n            if (usbfs_is_kernel_driver_alive(udev->desc, bInterfaceNumber))\r\n            {\r\n                usbfs_detach_kernel_driver(udev->desc, bInterfaceNumber);\r\n            }\r\n            retval = ioctl(udev->desc, USBDEVFS_CLAIMINTERFACE, &bInterfaceNumber);\r\n            if (retval != 0)\r\n            {\r\n                dbg_time(\"Fail to claim interface %d, errno: %d (%s)\\n\", bInterfaceNumber, errno, strerror(errno));\r\n                if (udev->idVendor == 0x05c6)\r\n                {\r\n                    int n;\r\n                    struct\r\n                    {\r\n                        char infname[255 * 2];\r\n                        char driver[255 * 2];\r\n                    } *pl;\r\n                    const char *driver = NULL;\r\n\r\n                    pl = (typeof(pl))malloc(sizeof(*pl));\r\n                    if (pl == NULL)\r\n                    {\r\n                        dbg_time(\"pl is NULL\\n\");\r\n                        return NULL;\r\n                    }\r\n\r\n                    snprintf(pl->infname, sizeof(pl->infname), \"%.255s:1.%d/driver\", module_sys_path, usb_dm_interface);\r\n                    n = readlink(pl->infname, pl->driver, sizeof(pl->driver));\r\n                    if (n > 0 && n < 510)\r\n                    {\r\n                        pl->driver[n] = '\\0';\r\n                        while (pl->driver[n] != '/') n--;\r\n                        driver = (&pl->driver[n + 1]);\r\n                    }\r\n\r\n                    dbg_time(\"Error: when module in 'Emergency download mode', should not register \"\r\n                             \"any usb driver\\n\");\r\n                    if (driver)\r\n                        dbg_time(\"Error: it register to usb driver ' %s ' now, should delete \"\r\n                                 \"05c6&9008 from the source file of this driver\\n\",\r\n                                 driver);\r\n                    if (driver && !strcmp(driver, \"qcserial\"))\r\n                        dbg_time(\"Delete 05c6&9008 from 'drivers/usb/serial/qcserial.c' or disable \"\r\n                                 \"qcserial from kernel config\\n\");\r\n                    qusb_noblock_close(udev);\r\n                    free(pl);\r\n                }\r\n                return NULL;\r\n            }\r\n\r\n            udev->ttyfd = -1;\r\n            return udev;\r\n        }\r\n        else if (!access(port_name, R_OK))\r\n        {\r\n            dbg_time(\"%s port_name = %s\\n\", __func__, port_name);\r\n\r\n            fd = open(port_name, O_RDWR | O_SYNC);\r\n\r\n            if (fd <= 0)\r\n            {\r\n                dbg_time(\"Device %s could not be open: Linux System Errno: %s\", port_name, strerror(errno));\r\n                return NULL;\r\n            }\r\n\r\n            retval = tcgetattr(fd, &ios);\r\n            if (-1 == retval)\r\n            {\r\n                dbg_time(\"ermio settings could not be fetched Linux System Error:%s\", strerror(errno));\r\n                if (fd > 0)\r\n                {\r\n                    close(fd);\r\n                    fd = -1;\r\n                }\r\n                return NULL;\r\n            }\r\n\r\n            cfmakeraw(&ios);\r\n            cfsetispeed(&ios, B115200);\r\n            cfsetospeed(&ios, B115200);\r\n\r\n            retval = tcsetattr(fd, TCSANOW, &ios);\r\n            if (-1 == retval)\r\n            {\r\n                dbg_time(\"Device could not be configured: Linux System Errno: %s\", strerror(errno));\r\n            }\r\n            udev->ttyfd = fd;\r\n            fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);\r\n\r\n            return udev;\r\n        }\r\n        else\r\n        {\r\n            dbg_time(\"fail to access %s errno: %d (%s)\\n\", port_name, errno, strerror(errno));\r\n        }\r\n    }\r\n    else if (module_sys_path && module_sys_path[0] != '/')\r\n    {\r\n        fd = qtcp_connect(module_sys_path, idVendor, idProduct, interfaceNum);\r\n        if (fd > 0)\r\n        {\r\n            tcp_socket_fd = fd;\r\n            fcntl(fd, F_SETFL, fcntl(fd, F_GETFL) | O_NONBLOCK);\r\n            return &tcp_socket_fd;\r\n        }\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\nint qusb_noblock_close(void *handle)\r\n{\r\n    struct quectel_usb_device *udev = &quectel_9x07;\r\n\r\n    if (handle == &tcp_socket_fd)\r\n    {\r\n        close(tcp_socket_fd);\r\n        tcp_socket_fd = -1;\r\n    }\r\n    if (handle == udev && udev->ttyfd > 0)\r\n    {\r\n        close(udev->ttyfd);\r\n        udev->ttyfd = -1;\r\n        close(udev->desc);\r\n        udev->desc = -1;\r\n    }\r\n    else if (handle == udev && udev->desc > 0)\r\n    {\r\n        int bInterfaceNumber = usb_dm_interface;\r\n        ioctl(udev->desc, USBDEVFS_RELEASEINTERFACE, &bInterfaceNumber);\r\n        close(udev->desc);\r\n        udev->desc = -1;\r\n    }\r\n    else if (handle == &edl_pcie_mhifd && edl_pcie_mhifd > 0)\r\n    {\r\n        close(edl_pcie_mhifd);\r\n        edl_pcie_mhifd = -1;\r\n    }\r\n    memset(udev, 0, sizeof(*udev));\r\n\r\n    return 0;\r\n}\r\n\r\nint qusb_use_usbfs_interface(const void *handle)\r\n{\r\n    struct quectel_usb_device *udev = &quectel_9x07;\r\n\r\n    return (handle == udev && udev->ttyfd <= 0 && udev->desc > 0);\r\n}\r\n\r\nint qusb_read_speed_atime(const char *module_sys_path, struct timespec *out_time, int *out_speed)\r\n{\r\n    char speed[256];\r\n    int fd;\r\n    struct stat stat;\r\n\r\n    snprintf(speed, sizeof(speed), \"%.240s/speed\", module_sys_path);\r\n    fd = open(speed, O_RDONLY);\r\n    if (fd == -1) return 0;\r\n\r\n    if (read(fd, speed, sizeof(speed)))\r\n    {\r\n    }\r\n    fstat(fd, &stat);\r\n    close(fd);\r\n    fd = -1;\r\n\r\n    *out_speed = atoi(speed);\r\n\r\n#ifdef ANDROID\r\n    struct timespec out_time_tmp;\r\n    memset(&out_time_tmp, 0, sizeof(struct timespec));\r\n    out_time_tmp.tv_sec = stat.st_atime;\r\n    *out_time = out_time_tmp;\r\n#else\r\n    *out_time = stat.st_atim;\r\n#endif\r\n\r\n    dbg_time(\"%s speed: %d, st_atime: %s\\n\", __func__, *out_speed, ctimespec(out_time, speed, sizeof(speed)));\r\n    return 1;\r\n}\r\n\r\nint qusb_noblock_read(const void *handle, void *pbuf, int max_size, int min_size, int timeout_msec)\r\n{\r\n    struct quectel_usb_device *udev = &quectel_9x07;\r\n    int cur = 0;\r\n    int poll_ret = 0;\r\n\r\n    if (min_size == 0) min_size = 1;\r\n    if (timeout_msec == 0) timeout_msec = 3000;\r\n\r\n#if 0 // depend on your worst net speed\r\n    if (handle == &tcp_socket_fd) {\r\n        if (timeout_msec > 1000) //before sahala&firebose, we allow read timeout occurs\r\n            timeout_msec = 120*1000;\r\n    }\r\n#endif\r\n\r\n    while (cur < min_size)\r\n    {\r\n        int len = 0;\r\n\r\n        if (handle == &tcp_socket_fd)\r\n        {\r\n            if ((poll_ret = poll_wait(tcp_socket_fd, POLLIN, timeout_msec))) break;\r\n            len = qtcp_read(tcp_socket_fd, (uint8_t *)pbuf + cur, max_size - cur, timeout_msec);\r\n        }\r\n        else if (handle == udev && udev->ttyfd > 0)\r\n        {\r\n            if ((poll_ret = poll_wait(udev->ttyfd, POLLIN, timeout_msec))) break;\r\n            len = read(udev->ttyfd, (uint8_t *)pbuf + cur, max_size - cur);\r\n        }\r\n        else if (handle == udev && udev->desc > 0)\r\n        {\r\n            len = usbfs_bulk_read(udev, (uint8_t *)pbuf + cur, max_size - cur, timeout_msec);\r\n        }\r\n        else if (handle == &edl_pcie_mhifd && edl_pcie_mhifd > 0)\r\n        {\r\n            if ((poll_ret = poll_wait(edl_pcie_mhifd, POLLIN, timeout_msec))) break;\r\n            len = read(edl_pcie_mhifd, (uint8_t *)pbuf + cur, max_size - cur);\r\n        }\r\n        else\r\n        {\r\n            break;\r\n        }\r\n\r\n        if (len > 0)\r\n        {\r\n            cur += len;\r\n        }\r\n        else\r\n        {\r\n            dbg_time(\"%s read=%d, errno: %d (%s)\\n\", __func__, len, errno, strerror(errno));\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (poll_ret == EIO)\r\n        return -1;\r\n    else if (poll_ret == ETIMEDOUT)\r\n        return cur;\r\n\r\n    if (cur < min_size)\r\n    {\r\n        dbg_time(\"%s cur=%d, min_size=%d\\n\", __func__, cur, min_size);\r\n    }\r\n\r\n    return cur;\r\n}\r\n\r\nint qusb_noblock_write(const void *handle, void *pbuf, int max_size, int min_size, int timeout_msec, int need_zlp)\r\n{\r\n    struct quectel_usb_device *udev = &quectel_9x07;\r\n    int cur = 0;\r\n\r\n    if (min_size == 0) min_size = 1;\r\n    if (timeout_msec == 0) timeout_msec = 3000;\r\n\r\n#if 0 // depend on your worst net speed\r\n    if (handle == &tcp_socket_fd) {\r\n        timeout_msec = 120*1000;\r\n    }\r\n#endif\r\n\r\n    while (cur < min_size)\r\n    {\r\n        int len = 0;\r\n\r\n        if (handle == &tcp_socket_fd)\r\n        {\r\n            if (poll_wait(tcp_socket_fd, POLLOUT, timeout_msec)) break;\r\n            len = qtcp_write(tcp_socket_fd, (uint8_t *)pbuf + cur, max_size - cur, timeout_msec);\r\n        }\r\n        else if (handle == udev && udev->ttyfd > 0)\r\n        {\r\n            if (poll_wait(udev->ttyfd, POLLOUT, timeout_msec)) break;\r\n            len = write(udev->ttyfd, (uint8_t *)pbuf + cur, max_size - cur);\r\n        }\r\n        else if (handle == udev && udev->desc > 0)\r\n        {\r\n            len = usbfs_bulk_write(udev, (uint8_t *)pbuf + cur, max_size - cur, timeout_msec, need_zlp);\r\n        }\r\n        else if (handle == &edl_pcie_mhifd && edl_pcie_mhifd > 0)\r\n        {\r\n            if (poll_wait(edl_pcie_mhifd, POLLOUT, timeout_msec)) break;\r\n            len = write(edl_pcie_mhifd, (uint8_t *)pbuf + cur, max_size - cur);\r\n        }\r\n        else\r\n        {\r\n            break;\r\n        }\r\n\r\n        if (len > 0)\r\n        {\r\n            cur += len;\r\n        }\r\n        else\r\n        {\r\n            dbg_time(\"%s write=%d, errno: %d (%s)\\n\", __func__, len, errno, strerror(errno));\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (cur < min_size)\r\n    {\r\n        dbg_time(\"%s cur=%d, min_size=%d\\n\", __func__, cur, min_size);\r\n    }\r\n\r\n    return cur;\r\n}\r\n\r\nint qfile_find_file(const char *dir, const char *prefix, const char *suffix, char **filename)\r\n{\r\n    DIR *pdir;\r\n    struct dirent *ent = NULL;\r\n    pdir = opendir(dir);\r\n    if (pdir == NULL)\r\n    {\r\n        return 0;\r\n    }\r\n\r\n    *filename = NULL;\r\n    if (pdir)\r\n    {\r\n        while ((ent = readdir(pdir)) != NULL)\r\n        {\r\n            if (strStartsWith(ent->d_name, prefix) && strEndsWith(ent->d_name, suffix))\r\n            {\r\n                dbg_time(\"find '%s'\\n\", ent->d_name);\r\n                *filename = strdup(ent->d_name);\r\n                break;\r\n            }\r\n        }\r\n    }\r\n\r\n    closedir(pdir);\r\n    return *filename != NULL;\r\n}\r\n\r\nconst char *firehose_get_time(void)\r\n{\r\n    static char time_buf[50];\r\n    struct timeval tv;\r\n    static int s_start_msec = -1;\r\n    int now_msec, cost_msec;\r\n\r\n    gettimeofday(&tv, NULL);\r\n    now_msec = tv.tv_sec * 1000;\r\n    now_msec += (tv.tv_usec + 500) / 1000;\r\n\r\n    if (s_start_msec == -1)\r\n    {\r\n        s_start_msec = now_msec;\r\n    }\r\n\r\n    cost_msec = now_msec - s_start_msec;\r\n\r\n    sprintf(time_buf, \"[%03d.%03d]\", cost_msec / 1000, cost_msec % 1000);\r\n    return time_buf;\r\n}\r\n\r\n// void dbg_time (const char *fmt, ...) {\r\n//     va_list args;\r\n//     va_start(args, fmt);\r\n//     static char line[2048];\r\n//     snprintf(line, sizeof(line), \"%s \", firehose_get_time());\r\n//     vsnprintf(line + strlen(line), sizeof(line) - strlen(line), fmt, args);\r\n//     fprintf(stdout, \"%s\", line);\r\n//     fflush(stdout);\r\n// }\r\n\r\nint qpcie_open(const char *firehose_dir, const char *firehose_mbn, const char *module_port_name)\r\n{\r\n    int bhifd, edlfd, diagfd;\r\n    long ret;\r\n    FILE *fp;\r\n    char prog_firehose_sdx24[256 + 32];\r\n    size_t filesize;\r\n    void *filebuf;\r\n    int cur_number = 0;\r\n\r\n    BHI_INFO_TYPE *bhi_info = malloc(sizeof(BHI_INFO_TYPE));\r\n    if (bhi_info == NULL)\r\n    {\r\n        dbg_time(\"bhi_info is NULL, errno: %d (%s)\\n\", errno, strerror(errno));\r\n        error_return();\r\n    }\r\n\r\n    if (is_upgrade_fimeware_zip_7z)\r\n    {\r\n        snprintf(prog_firehose_sdx24, sizeof(prog_firehose_sdx24), \"/tmp/%.240s\", firehose_mbn);\r\n        dbg_time(\"%s prog_firehose_sdx24:%s\\n\", __func__, prog_firehose_sdx24);\r\n    }\r\n    else\r\n    {\r\n        snprintf(prog_firehose_sdx24, sizeof(prog_firehose_sdx24), \"%.240s/%.32s\", firehose_dir, firehose_mbn);\r\n    }\r\n\r\n    fp = fopen(prog_firehose_sdx24, \"rb\");\r\n    if (fp == NULL)\r\n    {\r\n        dbg_time(\"fail to fopen %s, errno: %d (%s)\\n\", prog_firehose_sdx24, errno, strerror(errno));\r\n        if (bhi_info)\r\n        {\r\n            free(bhi_info);\r\n            bhi_info = NULL;\r\n        }\r\n        error_return();\r\n    }\r\n\r\n    fseek(fp, 0, SEEK_END);\r\n    filesize = ftell(fp);\r\n    fseek(fp, 0, SEEK_SET);\r\n\r\n    filebuf = malloc(sizeof(filesize) + filesize);\r\n    if (filebuf == NULL)\r\n    {\r\n        dbg_time(\"filebuf is NULL, errno: %d (%s)\\n\", errno, strerror(errno));\r\n        if (bhi_info)\r\n        {\r\n            free(bhi_info);\r\n            bhi_info = NULL;\r\n        }\r\n\r\n        if (fp)\r\n        {\r\n            fclose(fp);\r\n            fp = NULL;\r\n        }\r\n        error_return();\r\n    }\r\n    memcpy(filebuf, &filesize, sizeof(filesize));\r\n    if (fread((uint8_t *)filebuf + sizeof(filesize), 1, filesize, fp) == (size_t)0)\r\n    {\r\n    };\r\n    fclose(fp);\r\n\r\n    if (is_upgrade_fimeware_zip_7z)\r\n    {\r\n        unlink(prog_firehose_sdx24);\r\n    }\r\n\r\n    int i;\r\n    for (i = 0; i < pcie_port_defult.pcie_port_number; i++)\r\n    {\r\n        if (!strncasecmp(module_port_name, pcie_port_defult.pcie_port_one[i].bhi, 28))\r\n        {\r\n            cur_number = i;\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (i == pcie_port_defult.pcie_port_number)\r\n    {\r\n        dbg_time(\"PCIE port assignment error\\n\");\r\n        if (bhi_info)\r\n        {\r\n            free(bhi_info);\r\n            bhi_info = NULL;\r\n        }\r\n\r\n        if (filebuf)\r\n        {\r\n            free(filebuf);\r\n            filebuf = NULL;\r\n        }\r\n        error_return();\r\n    }\r\n\r\n    diagfd = open(pcie_port_defult.pcie_port_one[cur_number].diag, O_RDWR | O_NOCTTY);\r\n    if (diagfd > 0)\r\n    {\r\n        int edl_retry = 30; // SDX55 require long time by now 20190412\r\n        void *usb_handle = &edl_pcie_mhifd;\r\n        edl_pcie_mhifd = diagfd;\r\n\r\n        while (access(pcie_port_defult.pcie_port_one[cur_number].diag, R_OK) == 0 && edl_retry-- > 0)\r\n        {\r\n            dbg_time(\"switch_to_edl_mode\\n\");\r\n            switch_to_edl_mode(usb_handle);\r\n            sleep(1);\r\n        }\r\n\r\n        close(diagfd);\r\n        diagfd = -1;\r\n        edl_pcie_mhifd = -1;\r\n    }\r\n\r\n    sleep(1); // see https://ticket.quectel.com/browse/FAE-39737\r\n    bhifd = open(pcie_port_defult.pcie_port_one[cur_number].bhi, O_RDWR | O_NOCTTY);\r\n    if (bhifd <= 0)\r\n    {\r\n        dbg_time(\"fail to open %s, errno: %d (%s)\\n\", \"/dev/mhi_BHI\", errno, strerror(errno));\r\n        if (bhi_info)\r\n        {\r\n            free(bhi_info);\r\n            bhi_info = NULL;\r\n        }\r\n\r\n        if (filebuf)\r\n        {\r\n            free(filebuf);\r\n            filebuf = NULL;\r\n        }\r\n\r\n        if (diagfd > 0)\r\n        {\r\n            close(diagfd);\r\n            diagfd = -1;\r\n        }\r\n        error_return();\r\n    }\r\n\r\n    ret = ioctl(bhifd, IOCTL_BHI_GETDEVINFO, bhi_info);\r\n    if (ret)\r\n    {\r\n        dbg_time(\"fail to ioctl IOCTL_BHI_GETDEVINFO, errno: %d (%s)\\n\", errno, strerror(errno));\r\n        if (bhi_info)\r\n        {\r\n            free(bhi_info);\r\n            bhi_info = NULL;\r\n        }\r\n\r\n        if (filebuf)\r\n        {\r\n            free(filebuf);\r\n            filebuf = NULL;\r\n        }\r\n\r\n        if (diagfd > 0)\r\n        {\r\n            close(diagfd);\r\n            diagfd = -1;\r\n        }\r\n\r\n        if (bhifd > 0)\r\n        {\r\n            close(bhifd);\r\n            bhifd = -1;\r\n        }\r\n        error_return();\r\n    }\r\n\r\n    dbg_time(\"bhi_ee = %d\\n\", bhi_info->bhi_ee);\r\n    if (bhi_info->bhi_ee != MHI_EE_EDL)\r\n    {\r\n        dbg_time(\"bhi_ee is not MHI_EE_EDL\\n\");\r\n        close(bhifd);\r\n        bhifd = -1;\r\n        free(filebuf);\r\n        filebuf = NULL;\r\n        if (bhi_info)\r\n        {\r\n            free(bhi_info);\r\n            bhi_info = NULL;\r\n        }\r\n\r\n        if (diagfd > 0)\r\n        {\r\n            close(diagfd);\r\n            diagfd = -1;\r\n        }\r\n        error_return();\r\n    }\r\n\r\n    if (bhi_info)\r\n    {\r\n        free(bhi_info);\r\n        bhi_info = NULL;\r\n    }\r\n\r\n    ret = ioctl(bhifd, IOCTL_BHI_WRITEIMAGE, filebuf);\r\n    if (ret)\r\n    {\r\n        dbg_time(\"fail to ioctl IOCTL_BHI_GETDEVINFO, errno: %d (%s)\\n\", errno, strerror(errno));\r\n        if (filebuf)\r\n        {\r\n            free(filebuf);\r\n            filebuf = NULL;\r\n        }\r\n\r\n        if (diagfd > 0)\r\n        {\r\n            close(diagfd);\r\n            diagfd = -1;\r\n        }\r\n\r\n        if (bhifd > 0)\r\n        {\r\n            close(bhifd);\r\n            bhifd = -1;\r\n        }\r\n        error_return();\r\n    }\r\n\r\n    if (bhifd > 0)\r\n    {\r\n        close(bhifd);\r\n        bhifd = -1;\r\n    }\r\n    if (filebuf)\r\n    {\r\n        free(filebuf);\r\n        filebuf = NULL;\r\n    }\r\n\r\n    sleep(1);\r\n    edlfd = open(pcie_port_defult.pcie_port_one[cur_number].edl, O_RDWR | O_NOCTTY);\r\n    if (edlfd <= 0)\r\n    {\r\n        dbg_time(\"fail to access %s, errno: %d (%s)\\n\", pcie_port_defult.pcie_port_one[cur_number].edl, errno, strerror(errno));\r\n        if (diagfd > 0)\r\n        {\r\n            close(diagfd);\r\n            diagfd = -1;\r\n        }\r\n        error_return();\r\n    }\r\n\r\n    edl_pcie_mhifd = edlfd;\r\n\r\n    if (diagfd > 0)\r\n    {\r\n        close(diagfd);\r\n        diagfd = -1;\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nint usbmon_fd = -1;\r\nint usbmon_logfile_fd = -1;\r\n\r\nvoid *catch_log(void *arg)\r\n{\r\n    int nreads = 0;\r\n    char tbuff[256];\r\n    size_t off = strlen(\"[999.999] \");\r\n\r\n    (void)arg;\r\n    tbuff[off - 1] = ' ';\r\n    while (1)\r\n    {\r\n        nreads = read(usbmon_fd, tbuff + off, sizeof(tbuff) - off - 1);\r\n        if (nreads == -1 && errno == EINTR) continue;\r\n        if (nreads <= 0) break;\r\n\r\n        tbuff[off + nreads] = '\\0';\r\n        memcpy(tbuff, firehose_get_time(), off - 1);\r\n\r\n        if (write(usbmon_logfile_fd, tbuff, strlen(tbuff)) == -1)\r\n        {\r\n        };\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\nint ql_capture_usbmon_log(const char *usbmon_logfile)\r\n{\r\n    const char *usbmon_path = \"/sys/kernel/debug/usb/usbmon/0u\";\r\n    pthread_t pt;\r\n    pthread_attr_t attr;\r\n\r\n    if (access(\"/sys/kernel/debug/usb\", F_OK))\r\n    {\r\n        dbg_time(\"debugfs is not mount, please execute \\\"mount -t debugfs none_debugs \"\r\n                 \"/sys/kernel/debug\\\"\\n\");\r\n        return -1;\r\n    }\r\n    if (access(\"/sys/kernel/debug/usb/usbmon\", F_OK))\r\n    {\r\n        dbg_time(\"usbmon is not load, please execute \\\"modprobe usbmon\\\" or \\\"insmod usbmon.ko\\\"\\n\");\r\n        return -1;\r\n    }\r\n\r\n    usbmon_fd = open(usbmon_path, O_RDONLY);\r\n    if (usbmon_fd < 0)\r\n    {\r\n        dbg_time(\"open %s error(%d) (%s)\\n\", usbmon_path, errno, strerror(errno));\r\n        return -1;\r\n    }\r\n\r\n    usbmon_logfile_fd = open(usbmon_logfile, O_WRONLY | O_CREAT | O_TRUNC, 0666);\r\n    if (usbmon_logfile_fd < 0)\r\n    {\r\n        dbg_time(\"open %s error(%d) (%s)\\n\", usbmon_logfile, errno, strerror(errno));\r\n        close(usbmon_fd);\r\n        usbmon_fd = -1;\r\n        return -1;\r\n    }\r\n\r\n    pthread_attr_init(&attr);\r\n    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\r\n    pthread_create(&pt, &attr, catch_log, NULL);\r\n\r\n    // pthread_attr_destroy(&attr);     //aaron 2023.07.27\r\n    return 0;\r\n}\r\n\r\nvoid ql_stop_usbmon_log()\r\n{\r\n    if (usbmon_logfile_fd > 0)\r\n    {\r\n        close(usbmon_logfile_fd);\r\n        usbmon_logfile_fd = -1;\r\n    }\r\n    if (usbmon_fd > 0)\r\n    {\r\n        close(usbmon_fd);\r\n        usbmon_fd = -1;\r\n    }\r\n}\r\n"
  },
  {
    "path": "luci-app-qmodem/application/qfirehose/src/usb_linux.h",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software.\r\n    Under no circumstances may customers modify, demonstrate, use, deliver\r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#ifndef __QFIREHOSE_USB_LINUX_H__\r\n#define __QFIREHOSE_USB_LINUX_H__\r\n#include <stdio.h>\r\n#include <ctype.h>\r\n#include <stdlib.h>\r\n#include <stdint.h>\r\n#include <string.h>\r\n#include <stdio.h>\r\n#include <unistd.h>\r\n#include <errno.h>\r\n#include <sys/time.h>\r\n#include <time.h>\r\n#include <sys/stat.h>\r\n#include <dirent.h>\r\n#include <fcntl.h>\r\n\r\n#define MAX_PATH 256\r\n#define MIN(a, b) ((a) < (b) ? (a) : (b))\r\n#define ZIP_INFO \"/tmp/zip_info.txt\"\r\n#define ZIP_PROCESS_INFO \"/tmp/zip_process_info.txt\"\r\n\r\n#define safe_free(p)         \\\r\n    do                       \\\r\n    {                        \\\r\n        if (p != NULL)       \\\r\n        {                    \\\r\n            free((void *)p); \\\r\n            p = NULL;        \\\r\n        }                    \\\r\n    } while (0)\r\n\r\nextern char zip_cmd_buf[512];\r\nextern int g_is_module_adb_entry_edl;\r\n\r\ntypedef struct module_sys_info\r\n{\r\n    /*\r\n    MAJOR=189\r\n    MINOR=1\r\n    DEVNAME=bus/usb/001/002\r\n    DEVTYPE=usb_device\r\n    DRIVER=usb\r\n    PRODUCT=2c7c/415/318\r\n    TYPE=239/2/1\r\n    BUSNUM=001\r\n    */\r\n    // char sys_path[MAX_PATH];\r\n    int MAJOR;\r\n    int MINOR;\r\n    char DEVNAME[64];\r\n    char DEVTYPE[64];\r\n    char PRODUCT[64];\r\n} MODULE_SYS_INFO;\r\n\r\nvoid *qusb_noblock_open(const char *module_sys_path, int *idVendor, int *idProduct, int *interfaceNum);\r\nint qusb_noblock_close(void *handle);\r\nint qusb_noblock_write(const void *handle, void *pbuf, int max_size, int min_size, int timeout_msec, int need_zlp);\r\nint qusb_noblock_read(const void *handle, void *pbuf, int max_size, int min_size, int timeout_msec);\r\nint qusb_read_speed_atime(const char *module_sys_path, struct timespec *out_time, int *out_speed);\r\nint qfile_find_file(const char *dir, const char *prefix, const char *suffix, char **filename);\r\n#define errno_nodev() (errno == ENOENT || errno == ENODEV)\r\n// void dbg_time (const char *fmt, ...);\r\nconst char *firehose_get_time(void);\r\nextern FILE *loghandler;\r\n#ifdef FH_DEBUG\r\n#define dbg_time(fmt, args...)                                                                                       \\\r\n    do                                                                                                               \\\r\n    {                                                                                                                \\\r\n        fprintf(stdout, \"[%15s-%04d]%s: \" fmt, __FILE__, __LINE__, firehose_get_time(), ##args);                     \\\r\n        fflush(stdout);                                                                                              \\\r\n        if (loghandler) fprintf(loghandler, \"[%15s-%04d]%s: \" fmt, __FILE__, __LINE__, firehose_get_time(), ##args); \\\r\n    } while (0);\r\n#else\r\n#define dbg_time(fmt, args...)                                                        \\\r\n    do                                                                                \\\r\n    {                                                                                 \\\r\n        fprintf(stdout, \"%s: \" fmt, firehose_get_time(), ##args);                     \\\r\n        fflush(stdout);                                                               \\\r\n        if (loghandler) fprintf(loghandler, \"%s: \" fmt, firehose_get_time(), ##args); \\\r\n    } while (0);\r\n#endif\r\ndouble get_now();\r\nvoid get_duration(double start);\r\nint update_transfer_bytes(long long bytes_cur);\r\nvoid set_transfer_allbytes(long long bytes);\r\nint auto_find_quectel_modules(char *module_sys_path, unsigned size, const char *product, const struct timespec *atime);\r\nvoid quectel_get_syspath_name_by_ttyport(const char *module_port_name, char *module_sys_path, unsigned size);\r\nvoid quectel_get_ttyport_by_syspath(const char *module_sys_path, char *module_port_name, unsigned size);\r\n#define error_return()                                             \\\r\n    do                                                             \\\r\n    {                                                              \\\r\n        dbg_time(\"%s %s %d fail\\n\", __FILE__, __func__, __LINE__); \\\r\n        return __LINE__;                                           \\\r\n    } while (0)\r\n\r\nextern int edl_pcie_mhifd;\r\n\r\n#define IOCTL_BHI_GETDEVINFO 0x8BE0 + 1\r\n#define IOCTL_BHI_WRITEIMAGE 0x8BE0 + 2\r\n\r\ntypedef unsigned int ULONG;\r\n\r\ntypedef struct _bhi_info_type\r\n{\r\n    ULONG bhi_ver_minor;\r\n    ULONG bhi_ver_major;\r\n    ULONG bhi_image_address_low;\r\n    ULONG bhi_image_address_high;\r\n    ULONG bhi_image_size;\r\n    ULONG bhi_rsvd1;\r\n    ULONG bhi_imgtxdb;\r\n    ULONG bhi_rsvd2;\r\n    ULONG bhi_msivec;\r\n    ULONG bhi_rsvd3;\r\n    ULONG bhi_ee;\r\n    ULONG bhi_status;\r\n    ULONG bhi_errorcode;\r\n    ULONG bhi_errdbg1;\r\n    ULONG bhi_errdbg2;\r\n    ULONG bhi_errdbg3;\r\n    ULONG bhi_sernum;\r\n    ULONG bhi_sblantirollbackver;\r\n    ULONG bhi_numsegs;\r\n    ULONG bhi_msmhwid[6];\r\n    ULONG bhi_oempkhash[48];\r\n    ULONG bhi_rsvd5;\r\n} BHI_INFO_TYPE, *PBHI_INFO_TYPE;\r\n\r\nenum MHI_EE\r\n{\r\n    MHI_EE_PBL = 0x0,  /* Primary Boot Loader                                                */\r\n    MHI_EE_SBL = 0x1,  /* Secondary Boot Loader                                              */\r\n    MHI_EE_AMSS = 0x2, /* AMSS Firmware                                                      */\r\n    MHI_EE_RDDM = 0x3, /* WIFI Ram Dump Debug Module                                         */\r\n    MHI_EE_WFW = 0x4,  /* WIFI (WLAN) Firmware                                               */\r\n    MHI_EE_PT = 0x5,   /* PassThrough, Non PCIe BOOT (PCIe is BIOS locked, not used for boot */\r\n    MHI_EE_EDL = 0x6,  /* PCIe enabled in PBL for emergency download (Non PCIe BOOT)         */\r\n    MHI_EE_FP = 0x7,   /* FlashProg, Flash Programmer Environment                            */\r\n    MHI_EE_BHIE = MHI_EE_FP,\r\n    MHI_EE_UEFI = 0x8, /* UEFI                                                               */\r\n\r\n    MHI_EE_DISABLE_TRANSITION = 0x9,\r\n    MHI_EE_MAX\r\n};\r\nint qpcie_open(const char *firehose_dir, const char *firehose_mbn, const char *module_port_name);\r\n\r\n#define Q_USB2TCP_VERSION 0x12345678\r\ntypedef struct\r\n{\r\n    int tag;\r\n    int length;\r\n    int value[];\r\n} TLV;\r\n\r\ntypedef struct\r\n{\r\n    int tag;\r\n    int length;\r\n    int idVendor;\r\n    int idProduct;\r\n    int interfaceNum;\r\n} TLV_USB;\r\n\r\ntypedef struct\r\n{\r\n    char zip_file_name_backup[128];\r\n    char zip_file_dir_backup[256];\r\n} file_name_backup_count;\r\n\r\ntypedef struct\r\n{\r\n    int file_name_count;\r\n    file_name_backup_count file_backup_c[256]; // smart  SA885GAPNA number of image file is 96\r\n} file_name_backup;\r\n\r\nextern file_name_backup file_name_b;\r\n\r\nextern int is_upgrade_fimeware_zip_7z;\r\nextern int is_firehose_zip_7z_name_exit;\r\nextern int is_upgrade_fimeware_only_zip;\r\nextern unsigned int g_from_ecm_to_rndis;\r\n#endif\r\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/Makefile",
    "content": "include $(TOPDIR)/rules.mk\ninclude $(INCLUDE_DIR)/kernel.mk\n\n# Include unified version\ninclude ../../version.mk\n\nPKG_NAME:=qmodem\nPKG_RELEASE:=$(QMODEM_RELEASE)\nPKG_VERSION:=$(QMODEM_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n  PKGARCH:=all\n  SECTION:=utils\n  CATEGORY:=Utilities\n  TITLE:=QModem scripts\n  DEPENDS:=\t\\\n  \t\t+kmod-usb2 +kmod-usb3 \\\n\t\t+kmod-usb-serial +kmod-usb-serial-option +kmod-usb-serial-qualcomm \\\n\t\t+kmod-usb-net +kmod-usb-acm \\\n\t\t+kmod-usb-wdm \\\n\t\t+kmod-usb-net-cdc-ether \\\n\t\t+kmod-usb-net-cdc-mbim \\\n\t\t+kmod-usb-net-rndis \\\n\t\t+kmod-usb-net-cdc-ncm +kmod-usb-net-huawei-cdc-ncm \\\n  \t\t+ubus-at-daemon +tom_modem +terminfo +sms-tool_q \\\n\t\t+jq +bc\\\n\t\t+coreutils +coreutils-stat \\\n\t\t+usbutils \\\n\t\t+PACKAGE_luci-app-qmodem_INCLUDE_rdisc6:rdisc6 \\\n\t\t+PACKAGE_luci-app-qmodem_INCLUDE_ndisc6:ndisc6 \\\n\t\t+PACKAGE_luci-app-qmodem_INCLUDE_generic-qmi-wwan:kmod-usb-net-qmi-wwan \\\n\t\t+PACKAGE_luci-app-qmodem_INCLUDE_vendor-qmi-wwan:kmod-qmi_wwan_q \\\n\t\t+PACKAGE_luci-app-qmodem_INCLUDE_vendor-qmi-wwan:kmod-qmi_wwan_f \\\n\t\t+PACKAGE_luci-app-qmodem_INCLUDE_vendor-qmi-wwan:kmod-qmi_wwan_s \\\n\t\t+PACKAGE_luci-app-qmodem_VENDOR_MHI_PCIe_DRIVER:kmod-pcie_mhi \\\n\t\t+PACKAGE_luci-app-qmodem_GENERIC_MHI_PCIe_DRIVER:kmod-mhi-wwan \\\n\t\t+PACKAGE_luci-app-qmodem_GENERIC_MHI_PCIe_DRIVER:kmod-mhi-pci-generic \\\n\t\t+PACKAGE_luci-app-qmodem_GENERIC_MHI_PCIe_DRIVER:kmod-mhi-pci-generic \\\n\t\t+PACKAGE_luci-app-qmodem_GENERIC_MHI_PCIe_DRIVER:kmod-mhi-wwan-ctrl \\\n\t\t+PACKAGE_luci-app-qmodem_GENERIC_MHI_PCIe_DRIVER:kmod-mhi-wwan-mbim \\\n\t\t+PACKAGE_luci-app-qmodem_INCLUDE_ADD_PCI_SUPPORT:pciutils \\\n\t\t+PACKAGE_luci-app-qmodem_INCLUDE_ADD_MTK_T7XX_SUPPORT:umbim \\\n\t\t+PACKAGE_luci-app-qmodem_INCLUDE_ADD_MTK_T7XX_SUPPORT:kmod-mtk-t7xx \\\n\t\t+PACKAGE_luci-app-qmodem_INCLUDE_ADD_QFIREHOSE_SUPPORT:qfirehose \\\n\t\t+PACKAGE_luci-app-qmodem_USE_TOM_CUSTOMIZED_QUECTEL_CM:quectel-CM-5G-M \\\n\t\t+PACKAGE_luci-app-qmodem_USING_QWRT_QUECTEL_CM_5G:quectel-CM-5G \\\n\t\t+PACKAGE_luci-app-qmodem_USING_NORMAL_QUECTEL_CM:quectel-cm\nendef\n\ndefine Package/$(PKG_NAME)/description\n\tQModem scripts\nendef\n\ndefine Build/Prepare\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t\t$(CP) ./files/* $(1)/\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/etc/config/qmodem",
    "content": "config main 'main'\n\toption enable_dial '1'\n\toption try_preset_usb \"1\"\n\toption try_preset_pcie \"1\"\n\toption enable_pcie_scan '1'\n\toption start_delay '0'\n\toption usage_stats_nvram_save '0'\n\toption usage_stats_nvram_interval '300'\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/etc/hotplug.d/iface/80-wwan-led",
    "content": ". /lib/functions.sh\n\n[ \"${ACTION}\" = \"ifup\" ] || exit\necho \"${DEVICE}\" | grep -q -e \"usb\" -e \"wwan\" -e \"cpewan\" || exit\n\nlogger -t hotplug \"QModem WWAN LED: ${DEVICE} / Action: ${ACTION} set led.\"\n\ncase $(board_name) in\n  HC,HC-G80*)\n    uci delete system.wwan\n    uci set system.wwan=led\n    uci set system.wwan.name='wwan'\n    uci set system.wwan.sysfs='wwan'\n    uci set system.wwan.trigger='netdev'\n    uci set system.wwan.dev=\"${DEVICE}\"\n    uci set system.wwan.mode='link tx rx'\n    uci commit system\n    /etc/init.d/led restart\n  ;;\nesac\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/etc/hotplug.d/net/20-modem-net",
    "content": "#!/bin/sh\n# Copyright (C) 2024 Tom <fjrcn@outlook.com>\nmanual=$(uci -q get qmodem.main.block_auto_probe)\n[ \"${manual}\" -eq 1 ] && exit\n\nlogger -t modem_hotplug \"net slot: ${DEVPATH} action: ${ACTION}\"\n#网络设备名称不存在，退出\n[ -z \"${INTERFACE}\" ] && exit\n#网络设备路径不存在，退出\n[ -z \"${DEVPATH}\" ] && exit\n\nslot_path=$(readlink -f \"/sys/${DEVPATH}/device\")\n[ -z \"${slot_path}\" ] && exit\n\nslot=$(basename \"$(dirname \"${slot_path}\")\")\n\nif [ -d \"/sys/bus/usb/devices/${slot}\" ]; then\n    slot_type=\"usb\"\nelif [ -d \"/sys/bus/pci/devices/${slot}\" ]; then\n    slot_type=\"pcie\"\nelse\n    exit\nfi\n\nif [ \"${slot_type}\" = \"usb\" ]; then\n    vendor_file=\"/sys/bus/usb/devices/${slot}/idVendor\"\n    product_file=\"/sys/bus/usb/devices/${slot}/idProduct\"\n    \n    if [ -f \"${vendor_file}\" ] && [ -f \"${product_file}\" ]; then\n        slot_vid=$(cat \"${vendor_file}\")\n        slot_pid=$(cat \"${product_file}\")\n        \n        if [ -n \"$slot_vid\" ] && [ -n \"$slot_pid\" ]; then\n            modem_port_rule=$(cat /usr/share/qmodem/modem_port_rule.json)\n            modem_port_config=$(echo $modem_port_rule | jq '.modem_port_rule.\"'$slot_type'\".\"'$slot_vid:$slot_pid'\"')\n\n            if [ \"$modem_port_config\" != \"null\" ] && [ -n \"$modem_port_config\" ]; then\n                config_modem_name=$(echo $modem_port_config | jq -r '.name')\n                include_ports=$(echo $modem_port_config | jq -r '.include[]')\n\n                [ -n \"$include_ports\" ] && {\n                    logger -t modem_hotplug \"using special config for $config_modem_name($slot_vid:$slot_pid) with ports: $include_ports\"\n                    echo \"$slot_vid $slot_pid\" > /sys/bus/usb-serial/drivers/option1/new_id 2>/dev/null || \n                        logger -t modem_hotplug \"failed to set option driver\"\n                }\n            fi\n        else\n            logger -t modem_hotplug \"Unable to read VID/PID from device: $slot\"\n        fi\n    fi\nfi\n\nlogger -t modem_hotplug \"net slot: ${slot} action: ${ACTION} slot_type: ${slot_type}\"\ncase \"${ACTION}\" in\n    add|\\\n    bind)\n        /usr/share/qmodem/modem_scan.sh add \"${slot}\" \"${slot_type}\"\n        ;;\nesac\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/etc/hotplug.d/usb/20-modem-usb",
    "content": "#!/bin/sh\n# Copyright (C) 2024 Tom <fjrcn@outlook.com>\nmanual=$(uci -q get qmodem.main.block_auto_probe)\n[ \"${manual}\" -eq 1 ] && exit\nlogger -t modem_hotplug \"usb_event slot: ${DEVPATH} action: ${ACTION}\"\n[ -z \"${DEVNUM}\" ] && exit\n\n\nslot=$(basename \"${DEVPATH}\")\nlogger -t modem_hotplug \"usb_event run slot: ${slot} action: ${ACTION}\"\ncase \"${ACTION}\" in\n    bind|\\\n    add)\n        /usr/share/qmodem/modem_scan.sh add \"${slot}\" usb\n        ;;\n    remove)\n        /usr/share/qmodem/modem_scan.sh disable \"${slot}\" usb\n        ;;\nesac\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/etc/init.d/qmodem_init",
    "content": "#!/bin/sh /etc/rc.common\nSTART=80\nSTOP=30\nUSE_PROCD=1\n\n. $IPKG_INSTROOT/lib/functions.sh\n\nstart_service() {\n\tconfig_load qmodem\n    config_foreach _mk_rundir modem-device\n    config_get block_auto_probe main block_auto_probe 0\n    config_get enable_pcie_scan main enable_pcie_scan 0\n    config_get enable_usb_scan main enable_usb_scan 0\n    config_get try_preset_usb main try_preset_usb 1\n    config_get try_preset_pcie main try_preset_pcie 1\n    #once enabled, skip all check or scan\n    [ \"$block_auto_probe\" -eq 1 ] && return\n\n    #enabled by default\n    if [ \"$try_preset_pcie\" -eq 1 ];then\n        _try_vendor_preset_pcie\n    fi\n    if [ \"$try_preset_usb\" -eq 1 ];then\n        _try_vendor_preset_usb\n    fi\n\n    #not enabled by default\n    if [ \"$enable_usb_scan\" -eq 1 ];then\n        _scan_usb\n    fi\n    if [ \"$enable_pcie_scan\" -eq 1 ];then\n        _scan_pcie\n    fi\n}\n\nboot() {\n    local delay=$(uci -q get qmodem.main.start_delay || echo 0)\n    if [ \"$delay\" -gt 0 ]; then\n        logger \"Delay QModem Boot init scan for $delay S\"\n        sleep $delay\n        /usr/share/qmodem/modem_scan.sh scan >/dev/null 2>&1 &\n    fi\n    start\n}\n\n_try_vendor_preset_usb()\n{\n    config_foreach _try_usb_device modem-device\n    config_foreach _try_usb_slot modem-slot\n}\n\n_try_vendor_preset_pcie()\n{\n    config_foreach _try_pcie_device modem-device\n    config_foreach _try_pcie_slot modem-slot\n}\n\n_try_pcie_slot()\n{\n    config_get type \"$1\" type\n    [ \"$type\" == \"pcie\" ] && _try_slot $1\n}\n\n_try_usb_slot()\n{\n    config_get type \"$1\" type\n    [ \"$type\" == \"usb\" ] && _try_slot $1\n}\n\n_try_usb_device()\n{\n    config_get data_interface $1 data_interface\n    [ \"$data_interface\" == \"usb\" ] && _try_device $1\n}\n\n_try_pcie_device()\n{\n    config_get data_interface $1 data_interface\n    [ \"$data_interface\" == \"pcie\" ] && _try_device $1\n}\n\n_scan_usb()\n{\n    procd_open_instance \"scan_usb\"\n    #delay 15 second ,scan all usb device\n    procd_set_param command  \"ash\" \"/usr/share/qmodem/modem_scan.sh\" \"scan\" \"15\" \"usb\"\n    procd_close_instance\n}\n\n_scan_pcie()\n{\n    procd_open_instance \"scan_pcie\"\n    #delay 15 second ,scan all pcie device\n    procd_set_param command  \"ash\" \"/usr/share/qmodem/modem_scan.sh\" \"scan\" \"15\" \"pcie\"\n    procd_close_instance\n}\n\n_mk_rundir()\n{\n    modem_cfg=\"$1\"\n    mkdir -p \"/var/run/qmodem/${modem_cfg}_dir\"\n}\n\n_try_slot()\n{\n    config_get slot \"$1\" slot\n    config_get type \"$1\" type\n    case \"$type\" in\n        usb)\n            path=\"/sys/bus/usb/devices/${slot}\"\n            ;;\n        pcie)\n            path=\"/sys/bus/pci/devices/${slot}\"\n            ;;\n    esac\n\n    if [ -d \"$path\" ]; then\n        logger -t modem_init \"try modem $1\"\n        procd_open_instance \"try_$1\"\n        procd_set_param command  \"ash\" \"/usr/share/qmodem/modem_scan.sh\" \"add\" \"$slot\" \"$type\"\n        procd_close_instance\n    else\n        /usr/share/qmodem/modem_scan.sh disable \"$slot\"\n    fi\n}\n\n_try_device()\n{\n    config_get path \"$1\" path\n    config_get network \"$1\" network\n    if [ ! -d \"$path\" ]; then\n        /usr/share/qmodem/modem_scan.sh disable \"$1\"\n        uci delete network.$1\n        uci delete network.${1}v6\n        uci commit network\n        /etc/init.d/network reload\n        return\n    fi\n    # if device_path not parent of netdevice_path,then disable device path an scan again\n    netdevice_path=`readlink -f /sys/class/net/$network/device/`\n    device_path=`readlink -f $path`\n    is_parent=`echo \"$device_path\" | grep -q \"^$netdevice_path\"`\n    if [ -z \"$is_parent\" ] || [ ! -d \"$netdevice_path\" ]; then\n        /usr/share/qmodem/modem_scan.sh disable \"$1\"\n        /usr/share/qmodem/modem_scan.sh add \"$path\" \"$slot\" \n    fi\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/etc/init.d/qmodem_led",
    "content": "#!/bin/sh /etc/rc.common\nSTART=99\nSTOP=13\nUSE_PROCD=1\n\nservice_triggers()\n{\n\tprocd_add_reload_trigger \"qmodem\"\n\n}\n\nstart_service(){\n    load_led_services\n}\n\nstop_service(){\n    config_load qmodem\n    config_foreach _turn_off_leds modem-device\n}\n\nload_led_services(){\n    config_load qmodem\n    config_foreach _led_services modem-device\n}\n\n\n_led_services()\n{\n    local led_script\n    config_get led_script \"$1\" led_script\n    if [ -n \"$led_script\" ] && [ -x \"/usr/share/qmodem/led_scripts/${led_script}.sh\" ]; then\n        procd_open_instance led_$1\n        procd_set_param command \"/usr/share/qmodem/led_scripts/${led_script}.sh\" \"$1\"\n        procd_set_param respawn 120 15 10\n        procd_close_instance\n    fi\n}\n\n_turn_off_leds(){\n    local led_script\n    config_get led_script \"$1\" led_script\n    if [ -n \"$led_script\" ] && [ -x \"/usr/share/qmodem/led_scripts/${led_script}.sh\" ]; then\n        /usr/share/qmodem/led_scripts/${led_script}.sh \"$1\" \"off\"\n    fi\n}"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/etc/init.d/qmodem_network",
    "content": "#!/bin/sh /etc/rc.common\nSTART=99\nSTOP=13\nUSE_PROCD=1\nservice=\"$(basename ${basescript:-$initscript})\"\n#脚本目录\nSCRIPT_DIR=\"/usr/share/qmodem\"\n\n#运行目录\nMODEM_RUNDIR=\"/var/run/qmodem\"\n\nextra_command \"dial\" \"<modem_cfg> run dial script\"\nextra_command \"hang\" \"<modem_cfg> run hang script\"\nextra_command \"redial\" \"<modem_cfg> stop previous dial script. run hang script. and run dial script\"\nextra_command \"modem_status\" \"<modem_cfg> Check dial script status\" \nextra_command \"start_led_service\" \"<modem_cfg> add led service for modem\"\nextra_command \"stop_led_service\" \"<modem_cfg> stop led service for modem\"\n\nservice_triggers()\n{\n\tprocd_add_reload_trigger \"qmodem\"\n\n}\n\nstart_service(){\n    force_stop=0\n    mkdir -p $MODEM_RUNDIR\n    update_modem\n}\n\nstop_service(){\n    force_stop=1\n    update_modem\n    \n}\n\nreload_service()\n{\n    force_stop=0\n    mkdir -p $MODEM_RUNDIR\n    sleep 1\n    update_modem\n}\n\n\nupdate_modem(){\n    config_load qmodem\n    config_get g_enabled main enable_dial\n    config_foreach _update_modem modem-device\n}\n\ndial()\n{\n    rc_procd _dial $1\n    start_led_service $1\n}\n\nhang()\n{\n    _hang $1\n    stop_led_service $1\n}\n\nmodem_status()\n{\n    _modem_status $1\n}\n\nredial()\n{\n    hang $1\n    dial $1\n}\n\n_update_modem()\n{\n    local target\n    target=1\n    config_get enabled $1 enable_dial\n    config_get state $1 state\n    if [ \"$state\" = \"disabled\" ] || [ \"$enabled\" = \"0\" ] || [ \"$g_enabled\" = \"0\" ] || [ \"$force_stop\" = \"1\" ];then\n        target=0\n    fi\n    data=$(_procd_ubus_call list | jq -r  \".$service.instances.modem_$1\")\n    [ \"$data\" == \"null\" ] && current_status=0 || current_status=1\n    logger -t qmodem_network \"cfg:$1 current:$current_status;target:$target \"\n    if [ \"$current_status\" != \"$target\" ];then\n        [ \"$target\" -eq 1 ] && dial $1 || hang $1\n        logger -t qmodem_network \"update modem cfg: $1 dial:$target\"\n    fi\n}\n\n_dial()\n{\n    procd_open_instance \"modem_$1\"\n    procd_set_param command \"/usr/share/qmodem/modem_dial.sh\" \"$1\" dial\n    procd_set_param respawn 120 15 10\n    procd_close_instance\n    logger -t qmodem_network \"Modem $1 Start Dial Now\"\n}\n\n_hang()\n{\n    procd_kill $service \"modem_$1\"\n    /usr/share/qmodem/modem_dial.sh \"$1\" hang\n    logger -t qmodem_network \"Modem $1 Stop Dial and Hang\"\n}\n\n_modem_status()\n{ \n\tlocal instances=\"modem_$1\"\n\tlocal data\n    data=$(_procd_ubus_call list | jq  -r \".$service.instances.$instances\")\n    [ \"$data\" == \"null\" ] && echo \"$instances Not Running\"  || echo \"$data\"\n}\n\nstart_led_service()\n{\n    rc_procd _led_service \"$1\"\n}\n\n_led_service(){\n    local led_script\n    config_load qmodem\n    config_get led_script \"$1\" led_script\n    if [ -n \"$led_script\" ] && [ -x \"/usr/share/qmodem/led_scripts/${led_script}.sh\" ]; then\n        config_load qmodem\n        config_get led_script \"$1\" led_script\n        procd_open_instance led_$1\n        procd_set_param command \"/usr/share/qmodem/led_scripts/${led_script}.sh\" \"$1\"\n        procd_set_param respawn 120 15 10\n        procd_close_instance\n        logger -t qmodem_network \"Start LED service for modem $1 with script $led_script\"\n    fi\n}\n\nstop_led_service(){\n    local led_script\n    config_load qmodem\n    config_get led_script \"$1\" led_script\n    if [ -n \"$led_script\" ] && [ -x \"/usr/share/qmodem/led_scripts/${led_script}.sh\" ]; then\n        /usr/share/qmodem/led_scripts/${led_script}.sh \"$1\" \"off\"\n    fi\n    # remove led service instance\n    procd_kill $service \"led_$1\"\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/etc/init.d/qmodem_reboot",
    "content": "#!/bin/sh /etc/rc.common\nSTART=95\nSTOP=0\nUSE_PROCD=1\n\nstart_service() {\n\t:\n}\n\nstop_service() {\n\tprocd_set_param timeout 30\n\tconfig_load qmodem\n\tconfig_foreach _soft_reboot modem-device\n}\n\n_soft_reboot() {\n\tconfig_get soft_reboot $1 soft_reboot\n\t[ \"$soft_reboot\" != \"1\" ] && return 0\n\n\tconfig_get at_port $1 at_port\n\t[ -z \"$at_port\" ] && return 0\n\n\tfor i in $(seq 1 3); do\n\t\tresponse=$(tom_modem -d \"$at_port\" -o a -c \"AT+CFUN=1,1\")\n\t\techo \"$response\" | grep -qi \"ok\" && break\n\t\tsleep 1\n\tdone\n\n\treturn 0\n}"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/etc/init.d/qmodem_usage_stats",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=96\nSTOP=10\nUSE_PROCD=1\n\n. $IPKG_INSTROOT/lib/functions.sh\n\nMIN_INTERVAL=60\nDEFAULT_INTERVAL=300\n\nsanitize_interval()\n{\n    local interval=\"$1\"\n\n    case \"$interval\" in\n        ''|*[!0-9]*)\n            interval=\"$DEFAULT_INTERVAL\"\n            ;;\n    esac\n\n    [ \"$interval\" -lt \"$MIN_INTERVAL\" ] && interval=\"$MIN_INTERVAL\"\n    echo \"$interval\"\n}\n\nstart_modem_usage_stats_instance()\n{\n    local config_section=\"$1\"\n    local state manufacturer interval vendor_key instance_name\n\n    config_get state \"$config_section\" state\n    [ \"$state\" = \"disabled\" ] && return 0\n\n    config_get manufacturer \"$config_section\" manufacturer\n    vendor_key=$(echo \"$manufacturer\" | tr 'A-Z' 'a-z')\n    [ \"$vendor_key\" = \"quectel\" ] || return 0\n\n    config_get interval \"$config_section\" usage_stats_nvram_interval \"$global_usage_stats_nvram_interval\"\n    interval=$(sanitize_interval \"$interval\")\n    instance_name=\"usage_stats_${config_section}\"\n\n    procd_open_instance \"$instance_name\"\n    procd_set_param command /bin/sh /usr/share/qmodem/usage_stats.sh loop \"$interval\" \"$config_section\"\n    procd_set_param stdout 1\n    procd_set_param stderr 1\n    procd_set_param respawn 3600 5 5\n    procd_close_instance\n}\n\nservice_triggers()\n{\n    procd_add_reload_trigger \"qmodem\"\n}\n\nstart_service()\n{\n    config_load qmodem\n    config_get usage_stats_nvram_save main usage_stats_nvram_save 0\n    [ \"$usage_stats_nvram_save\" = \"1\" ] || return 0\n\n    config_get global_usage_stats_nvram_interval main usage_stats_nvram_interval \"$DEFAULT_INTERVAL\"\n    global_usage_stats_nvram_interval=$(sanitize_interval \"$global_usage_stats_nvram_interval\")\n    config_foreach start_modem_usage_stats_instance modem-device\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/etc/uci-defaults/99-add-5g-handler",
    "content": "#!/bin/sh\n\n. /lib/functions.sh\n. /lib/functions/uci-defaults.sh\n. /lib/functions/system.sh\n\nmodem_settings()\n{\n\tlocal board=\"$1\"\n\n\tcase $board in\n\tarcadyan,aw1000)\n\t\t#usb slot\n\t\tuci set qmodem.usb0=\"modem-slot\"\n\t\tuci set qmodem.usb0.slot=\"4-1\"\n\t\tuci set qmodem.usb0.type=\"usb\"\n\t\tuci set qmodem.usb0.net_led=\"ipq::led9\"\n\t\tuci set qmodem.usb0.sim_led=\"ipq::led2\"\n\t\tuci set qmodem.usb0.alias=\"wwan0\"\n\t\t#pcie slot\n\t\tuci set qmodem.pcie0=\"modem-slot\"\n\t\tuci set qmodem.pcie0.slot=\"0000:01:00.0\"\n\t\tuci set qmodem.pcie0.type=\"pcie\"\n\t\tuci set qmodem.pcie0.net_led=\"ipq::led9\"\n\t\tuci set qmodem.pcie0.sim_led=\"ipq::led2\"\n\t\tuci set\tqmodem.pcie0.associated_usb='4-1'\n\t\tuci set qmodem.pcie0.alias=\"wwan1\"\n\t\tuci commit qmodem\n\t\t;;\n\talwaylink,m60k63|\\\n\tfeiyan,m60k63)\n\t\t#usb slot 2-1\n\t\tadd_usb_slot_cfg \"wwan0\" \"2-1\" \"wwan0\" \"\" \"\" \"5g-power\" \"0\" \"1\" \"5\"\\\n\t\t#set led script\n\t\tuci set qmodem.wwan0.led_script=\"m60k63\"\n\t\t;;\n\tnradio,c2000-max)\n\t\t#usb slot 2-1\n\t\tadd_usb_slot_cfg \"eth2\" \"2-1\" \"eth2\" \"\" \"\" \"\" \"\" \"\" \"\"\\\n\t\t#set led script\n\t\tuci set qmodem.eth2.led_script=\"c2000_max\"\n\t\t;;\n\thiveton,h5000m)\n\t\t#usb slot\n\t\tuci set qmodem.usb0=\"modem-slot\"\n\t\tuci set qmodem.usb0.slot=\"2-1\"\n\t\tuci set qmodem.usb0.type=\"usb\"\n\t\tuci set qmodem.usb0.alias=\"USB\"\n\t\tuci set qmodem.main.enable_pcie_scan='0'\n\t\tuci set qmodem.main.start_delay='9'\n\t\tuci commit qmodem\n\t\t;;\n\tHC,HC-G80*)\n\t\t#mini pci slot\n\t\tuci set qmodem.mini_pci=\"modem-slot\"\n\t\tuci set qmodem.mini_pci.slot=\"1-1.4\"\n\t\tuci set qmodem.mini_pci.type=\"usb\"\n\t\t#m.2 slot (usb2.0)\n\t\tuci set qmodem.m2_u2=\"modem-slot\"\n\t\tuci set qmodem.m2_u2.slot=\"1-1.1\"\n\t\tuci set qmodem.m2_u2.type=\"usb\"\n\t\tuci set qmodem.m2_u2.ethernet_5g=\"cpewan0\"\n\t\t#m.2 slot (usb3.0)\n\t\tuci set qmodem.m2_u3=\"modem-slot\"\n\t\tuci set qmodem.m2_u3.slot=\"2-1\"\n\t\tuci set qmodem.m2_u3.type=\"usb\"\n\t\tuci set qmodem.m2_u3.ethernet_5g=\"cpewan0\"\n\t\tuci commit qmodem\n\t\t;;\n\thuasifei,wh3000-pro)\n\t\tadd_usb_slot_cfg \"5g0\" \"2-1.4\" \"wwan0\" \"\" \"\" \"modem_power\" \"0\" \"1\" \"6\"\n\t\t;;\n\thuasifei,ws1610)\n\t\t#m2 usb3.0 \n\t\t#(slot 2)\n\t\tadd_usb_slot_cfg \"m2_0\" \"2-1\" \"m2_0\" \"green:5g\" \"green:sim1\" \"m2_reset_1\" \"1\" \"0\" \"5\"\n\t\t#minipci usb2.0 \n\t\t#(slot 1)\n\t\tadd_usb_slot_cfg \"minipci_0\" \"1-1\" \"minipci_0\" \"green:5g\" \"green:sim2\" \"\" \"\" \"\" \"10\"\n\t\tuci commit qmodem\n\t\t;;\n\tailf,gs2410|\\\n\thuasifei,ws3006)\n\t\t#m2 usb3.0 \n\t\t#(slot 2)\n\t\tadd_usb_slot_cfg \"5g1\" \"2-1.2\" \"5g1\" \"green:5g2\" \"green:sim2\" \"m2_reset_2\" \"1\" \"0\" \"5\"\n\t\t#(slot 1)\n\t\tadd_usb_slot_cfg \"5g0\" \"2-1.4\" \"5g0\" \"green:5g1\" \"green:sim1\" \"m2_reset_1\" \"1\" \"0\" \"6\"\n\t\t#m2 usb2.0 \n\t\t#(slot 2)\n\t\tadd_usb_slot_cfg \"4g3\" \"1-1.1\" \"4g3\" \"green:5g2\" \"green:sim2\" \"m2_reset_2\" \"1\" \"0\" \"20\"\n\t\t#(slot 1)\n\t\tadd_usb_slot_cfg \"4g2\" \"1-1.4\" \"4g2\" \"green:5g1\" \"green:5g1\" \"m2_reset_1\" \"1\" \"0\" \"21\"\n\t\t#mini pci slot\n\t\t#(slot 2)\n\t\tadd_usb_slot_cfg \"4g1\" \"1-1.2\" \"4g1\" \"green:5g2\" \"green:sim2\" \"\" \"\" \"\" \"22\"\n\t\t#(slot 1)\n\t\tadd_usb_slot_cfg \"4g0\" \"1-1.3\" \"4g0\" \"green:5g1\" \"green:sim1\" \"\" \"\" \"\" \"23\"\n\t\tuci commit qmodem\n\t\t;;\n\thuasifei,ws3009)\n\t\t#m2 usb3.0 \n\n\t\t#(slot 2)\n\t\tadd_usb_slot_cfg \"5g1\" \"2-1.2\" \"5g1\" \"green:network1\" \"\" \"m2_reset_1\" \"1\" \"0\" \"5\"\n\t\t#(slot 1)\n\t\tadd_usb_slot_cfg \"5g0\" \"2-1.4\" \"5g0\" \"green:network2\" \"\" \"m2_reset_1\" \"1\" \"0\" \"6\"\n\t\t#(slot 2)\n\t\tadd_usb_slot_cfg \"5g2\" \"2-1.1\" \"5g2\" \"green:network3\" \"\" \"m2_reset_2\" \"1\" \"0\" \"7\"\n\t\t#m2/pcie usb2.0 \n\t\t#(slot 1)\n\t\tadd_usb_slot_cfg \"4g0\" \"1-1.3\" \"4g0\" \"green:network1\" \"\" \"\" \"\" \"\" \"20\"\n\t\t#(slot 2)\n\t\tadd_usb_slot_cfg \"4g1\" \"1-1.4\" \"4g3\" \"green:network2\" \"\" \"\" \"\" \"\" \"21\"\n\t\t#(slot 3)\n\t\tadd_usb_slot_cfg \"4g2\" \"1-1.1\" \"4g4\" \"green:network3\" \"\" \"\" \"\" \"\" \"22\"\n\t\tuci commit qmodem\n\t\t;;\n\tmisectel,m02k45)\n\t\t#usb slot\n\t\tuci set qmodem.usb0=\"modem-slot\"\n\t\tuci set qmodem.usb0.slot=\"2-1\"\n\t\tuci set qmodem.usb0.type=\"usb0\"\n\t\tuci set qmodem.usb0.alias=\"wwan0\"\n\t\t#pcie slot\n\t\tuci set qmodem.pcie0=\"modem-slot\"\n\t\tuci set qmodem.pcie0.slot=\"0002:01:00.0\"\n\t\tuci set qmodem.pcie0.type=\"pcie\"\n\t\tuci set\tqmodem.pcie0.associated_usb='2-1'\n\t\tuci set qmodem.pcie0.alias=\"pcie0\"\n\t\tuci commit qmodem\n\t\t;;\n\tp2w,r619ac*)\n\t\tadd_usb_slot_cfg \"minipcie\" \"3-1\" \"wwan0\" \"blue:power\" \"\" \"\" \"\" \"\" \"10\"\n\t\tuci commit qmodem\n\t\t;;\n\tsagemcom,5866t)\n\t\tadd_usb_slot_cfg \"5g_usb\" \"1-1\" \"5g_usb\" \"LED5_G\" \"LED4_G\" \"\" \"\" \"\" \"10\"\n\t\tadd_pcie_slot_cfg \"5g_pcie\" \"0000:01:00.0\" \"5g_pcie\" \"LED5_G\" \"LED4_G\" \"1-1\" \"\" \"\" \"\" \"10\"\n\t\tuci commit qmodem\n\t\t;;\n\tcyber,cyber3588-aib)\n\t\tadd_usb_slot_cfg \"5g_usb0\" \"8-1\" \"5g_usb0\" \"blue:status\" \"green:status\" \"\" \"\" \"\" \"10\"\n\t\tadd_pcie_slot_cfg \"5g_pcie0\" \"0001:11:00.0\" \"5g_pcie0\" \"blue:status\" \"green:status\" \"8-1\" \"\" \"\" \"\" \"10\"\n\t\tuci commit qmodem\n\t\t;;\n\tmt7981,stx1170-gsw)\n\t\tadd_usb_slot_cfg \"5g_usb0\" \"2-1\" \"5g_usb0\" \"\" \"\" \"\" \"\" \"\" \"10\"\n\t\tuci commit qmodem\n\t\t;;\n\tesac\n}\n\nadd_usb_slot_cfg()\n{\n\tcfg=$1\n\tcfg_slot=$2\n\talias=$3\n\tnet_led=$4\n\tsim_led=$5\n\tgpio=$6\n\tgpio_up=$7\n\tgpio_down=$8\n\tdefault_metric=$9\n\tuci set qmodem.${cfg}=modem-slot\n\tuci set qmodem.${cfg}.type=usb\n\t[ -n \"$cfg_slot\" ] && uci set qmodem.${cfg}.slot=${cfg_slot}\n\t[ -n \"$net_led\" ] && uci set qmodem.${cfg}.net_led=${net_led}\n\t[ -n \"$alias\" ] && uci set qmodem.${cfg}.alias=${alias}\n\t[ -n \"$sim_led\" ] && uci set qmodem.${cfg}.sim_led=${sim_led}\n\t[ -n \"$associated_usb\" ] && uci set qmodem.${cfg}.associated_usb=${associated_usb}\n\t[ -n \"$gpio\" ] && uci set qmodem.${cfg}.gpio=${gpio}\n\t[ -n \"$gpio_up\" ] && uci set qmodem.${cfg}.gpio_up=${gpio_up}\n\t[ -n \"$gpio_down\" ] && uci set qmodem.${cfg}.gpio_down=${gpio_down}\n\t[ -n \"$default_metric\" ] && uci set qmodem.${cfg}.default_metric=${default_metric}\n}\n\n\nadd_pcie_slot_cfg()\n{\n\tcfg=$1\n\tcfg_slot=$2\n\talias=$3\n\tnet_led=$4\n\tsim_led=$5\n\tassociated_usb=$6\n\tgpio=$7\n\tgpio_up=$8\n\tgpio_down=${9}\n\tdefault_metric=${10}\n\tuci set qmodem.${cfg}=modem-slot\n\tuci set qmodem.${cfg}.type=pcie\n\t[ -n \"$cfg_slot\" ] && uci set qmodem.${cfg}.slot=${cfg_slot}\n\t[ -n \"$net_led\" ] && uci set qmodem.${cfg}.net_led=${net_led}\n\t[ -n \"$alias\" ] && uci set qmodem.${cfg}.alias=${alias}\n\t[ -n \"$sim_led\" ] && uci set qmodem.${cfg}.sim_led=${sim_led}\n\t[ -n \"$associated_usb\" ] && uci set qmodem.${cfg}.associated_usb=${associated_usb}\n\t[ -n \"$gpio\" ] && uci set qmodem.${cfg}.gpio=${gpio}\n\t[ -n \"$gpio_up\" ] && uci set qmodem.${cfg}.gpio_up=${gpio_up}\n\t[ -n \"$gpio_down\" ] && uci set qmodem.${cfg}.gpio_down=${gpio_down}\n\t[ -n \"$default_metric\" ] && uci set qmodem.${cfg}.default_metric=${default_metric}\n}\n\nboard=$(board_name)\nmodem_settings $board\nexit 0\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/etc/uci-defaults/luci-app-qmodem",
    "content": "#!/bin/sh\n# Copyright (C) 2024 Tom <fjrcn@outlook.com>\n\n/etc/init.d/qmodem_reboot enable\n/etc/init.d/qmodem_usage_stats enable\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@qmodem[-1]\n\tdelete ucitrack.@qmodem[-1]\n\tadd ucitrack qmodem\n\tset ucitrack.@qmodem[-1].init=qmodem_network\n\tadd ucitrack qmodem\n\tset ucitrack.@qmodem[-1].init=qmodem_mwan\n\tcommit ucitrack\nEOF\n\nif [ -f /www/luci-static/resources/luci.js ]; then \n  rm -f /usr/lib/lua/luci/view/admin_status/index/modem_overview.htm\nfi\n\nrm -rf /tmp/luci-*cache\nexit 0\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/lib/lua/luci/view/admin_status/index/modem_overview.htm",
    "content": "<style type=\"text/css\">\n    #warning_message_box  {\n\t\tmargin: 1rem;\n\t\tpadding: 1rem;\n\t\theight: auto;\n\n\t}\n    \n    .table {\n        display: table;\n    }\n    \n    .compat-progressbar {\n\tborder: 1px solid var(--border-color-high,var(--progressbarColor,var(--background-color)));\n\tborder-radius: 3px;\n\tposition: relative;\n\tmin-width: 170px;\n\theight: 8px;\n\tmargin: 1.4em 0 4px 0;\n\tbackground: var(--background-color-medium,var(--progressbarColor));\n    }\n\n    .compat-progressbar > div {\n        background: var(--progressbar, var(--primary, var(--primary-color-medium)));\n        height: 100%;\n        transition: width .25s ease-in;\n        width: 0%;\n        border-radius: 2px;\n    }\n\n    .compat-progressbar::before {\n        position: absolute;\n        top: -1.4em;\n        left: 0;\n        content: attr(title);\n        white-space: pre;\n        overflow: hidden;\n        text-overflow: ellipsis;\n    }\n</style>\n\n<script>\n    function hasCssClass(className) {\n        // 获取所有样式表\n        const styleSheets = document.styleSheets;\n\n        // 遍历每个样式表\n        for (let i = 0; i < styleSheets.length; i++) {\n            const rules = styleSheets[i].cssRules || styleSheets[i].rules; // 兼容不同浏览器\n\n            // 遍历每个样式规则\n            for (let j = 0; j < rules.length; j++) {\n                if (rules[j].selectorText && rules[j].selectorText.includes(className)) {\n                    return true; // 找到定义，返回 true\n                }\n            }\n        }\n\n        return false; // 没有找到定义，返回 false\n    }\n\n    const progressbar_className = hasCssClass('.cbi-progressbar') ? 'cbi-progressbar' : 'compat-progressbar';\n    class LuciTable{\n            constructor(){\n                this.rows = [];\n                this.tbody;\n                this.fieldset;\n                this.init_table();\n            }\n    \n            init_table(){\n                //create a luci fieldset (class cbi-section)\n                var fieldset = document.createElement('fieldset');\n                fieldset.className=\"cbi-section\";\n                //set fieldset Header name\n                var legend = document.createElement('legend');\n                var title_span = document.createElement('h2');\n                title_span.className=\"panel-title\"\n                //init table\n                var table = document.createElement('table');\n                var tbody = document.createElement('tbody');\n                table.className=\"table\"\n                //save\n                this.fieldset = fieldset;\n                this.tbody = tbody\n                this.title_span = title_span\n                this.legend = legend\n                \n                fieldset.appendChild(legend);\n                fieldset.appendChild(title_span);\n                table.appendChild(tbody)\n                fieldset.appendChild(table)\n            }\n    \n            new_tr(data,index){\n                var type = data.type;\n                switch(type){\n                    case \"plain_text\":\n                        var key,value,full_name;\n                        key = data.key;\n                        value = data.value;\n                        full_name = data.full_name ? data.full_name : key;\n                        this.rows[index].left.innerHTML = full_name;\n                        this.rows[index].right.innerHTML = value;\n    \n                        if (value == null || value == \"\") {\n                            this.rows[index].row.style.display = \"none\";\n                        }\n                        else{\n                            this.rows[index].row.style.display = \"\";\n                        }\n                        break;\n                    case \"progress_bar\":\n                        var key,title,min,max,precentage,full_name;\n                        key = data.key;\n                        full_name = data.full_name ? data.full_name : key;\n                        title = `(${data.value}/${data.max_value}${data.unit})`\n                        min = data.min_value;\n                        max = data.max_value;\n                        precentage = (data.value - min) / (max - min) * 100;\n                        this.rows[index].left.innerHTML = full_name;\n                        var progress_bar = document.createElement('div')\n                        progress_bar.className = progressbar_className\n                        progress_bar.title = title;\n                        var progress_bar_bar = document.createElement('div')\n                        progress_bar_bar.setAttribute(\"style\",\"width:\"+precentage+\"%\")\n                        progress_bar.appendChild(progress_bar_bar)\n                        this.rows[index].right.innerHTML = \"\"\n                        this.rows[index].right.appendChild(progress_bar)\n                        break;\n                    }\n            }\n    \n    \n            set title(value){\n                this.legend.innerHTML = value;\n                this.title_span.innerHTML = value;\n            }\n    \n            set object_data(value){\n                var row_length = this.rows.length;\n                var value_length = Object.keys(value).length;\n                if (row_length < value_length) {\n                    for ( let i = row_length; i < value_length; i++) {\n                        let row = document.createElement('tr');\n                        row.className = \"tr\"\n                        let cell_left = document.createElement('td');\n                        cell_left.classList.add(\"td\")\n                        cell_left.setAttribute(\"width\",\"33%\")\n                        let cell_right = document.createElement('td');\n                        cell_right.classList.add(\"td\")\n                        row.appendChild(cell_left);\n                        row.appendChild(cell_right);\n                        this.tbody.appendChild(row);\n                        var row_dict = {\n                            \"row\":row,\n                            \"left\":cell_left,\n                            \"right\":cell_right,\n                        }\n                        this.rows.push(row_dict);\n                    }\n                }\n                else if(row_length > value_length){\n                    for (let i = value_length; i < row_length; i++) {\n                        this.tbody.removeChild(this.rows[i].row);\n                    }\n                    this.rows = this.rows.slice(0,value_length);\n                }\n                var index = 0;\n                for (var key in value) {\n                    this.rows[index].left.innerHTML = key;\n                    this.rows[index].right.innerHTML = value[key];\n                    index++;\n                }\n            }\n            \n            set array_data(value){\n                var row_length = this.rows.length;\n                var value_length = value.length;\n                if (row_length < value_length) {\n                    for ( let i = row_length; i < value_length; i++) {\n                        let row = document.createElement('tr');\n                        row.className = \"tr\"\n                        let cell_left = document.createElement('td');\n                        cell_left.classList.add(\"td\")\n                        cell_left.setAttribute(\"width\",\"33%\")\n                        let cell_right = document.createElement('td');\n                        cell_right.classList.add(\"td\")\n                        row.appendChild(cell_left);\n                        row.appendChild(cell_right);\n                        this.tbody.appendChild(row);\n                        var row_dict = {\n                            \"row\":row,\n                            \"left\":cell_left,\n                            \"right\":cell_right,\n                        }\n                        this.rows.push(row_dict);\n                    }\n                }\n                else if(row_length > value_length){\n                    for (let i = value_length; i < row_length; i++) {\n                        this.tbody.removeChild(this.rows[i].row);\n                    }\n                    this.rows = this.rows.slice(0,value_length);\n                }\n                for (let i = 0; i < value.length; i++) {\n                    this.new_tr(value[i],i);\n                }\n            }\n    \n            set data(value){\n                if (value == null) {\n                    return;\n                }\n                if (Array.isArray(value)) {\n                    this.array_data = value;\n                }\n                else{\n                    this.object_data = value;\n                }\n            }\n        }\n    \n    class ModemInfo {\n        constructor(cfg_id) {\n            this.data = null;\n            this.cfg_id = null;\n            this.modem_cfg_list = [];\n            this.tables = {};\n            this.cbi_map = document.getElementById(\"modem_\" + cfg_id)\n            this.init_warning_message_box();\n            this.cfg_id = cfg_id;\n        }\n    \n        init_warning_message_box()\n        {\n            var warning_message_box,title,message_box;\n            warning_message_box = document.createElement('div');\n            warning_message_box.className = \"alert-message alert-danger\";\n            warning_message_box.id = \"warning_message_box\";\n            title=document.createElement('strong');\n            title.innerHTML = \"<%:Warning!%>\";\n            message_box=document.createElement('div');\n            message_box.id = \"warning_message\";\n            warning_message_box.style.display = \"none\";\n            warning_message_box.appendChild(title);\n            warning_message_box.appendChild(message_box);\n            this.cbi_map.appendChild(warning_message_box);\n            this.message_box = message_box;\n            this.warning_message_box = warning_message_box;\n        }\n    \n        warning_message(node_list)\n        {\n            this.warning_message_box.style.display = \"\";\n            this.message_box.innerHTML = \"\"\n            this.message_box.appendChild(node_list);\n        }\n    \n        hide_warning_message()\n        {\n            this.warning_message_box.style.display = \"none\";\n        }\n    \n        poll_info(){\n            if (this.cfg_id == null){\n                return;\n            }\n            XHR.poll(10,'<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"modem_ctrl\")%>',{\n                \"cfg\": this.cfg_id,\n                \"action\": \"info\",\n                \"translate\": \"1\"\n            }, (x,data) => {\n                this.view = data;\n            });\n        }\n    \n        update(){\n            XHR.get('<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"modem_ctrl\")%>',{\n                \"cfg\": this.cfg_id,\n                \"action\": \"info\",\n                \"translate\": \"1\"\n            }, (x,data) => {\n                this.view = data;\n            });\n        }\n    \n        update_modem_cfg_list(){\n            XHR.poll(5,'<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"get_modem_cfg\")%>',{},(x,data)=>{\n                var new_cfg_list = [];\n                var cfgs = data.cfgs;\n                for (let i = 0; i < cfgs.length; i++) {\n                    var cfg = cfgs[i];\n                    var name = cfg.name;\n                    var value = cfg.cfg;\n                    new_cfg_list.push({\"value\":value,\"name\":name});\n                }\n                if (new_cfg_list != this.modem_cfg_list) {\n                    this.cfg_options = new_cfg_list;\n                }\n            });\n        }\n    \n        set cfg_options(value){\n            var longger = this.modem_cfg_list.length > value.length ? this.modem_cfg_list : value;\n            if (longger.length == 0) {\n                return;\n            }\n            for (let i = 0; i < longger.length; i++) {\n                var option = this.selector.options[i];\n                if (i < value.length) {\n                    if (i >= this.selector.options.length) {\n                        option = document.createElement('option');\n                        this.selector.appendChild(option);\n                    }\n                    option.value = value[i].value;\n                    option.innerHTML = value[i].name;\n                    \n                }\n                else{\n                    this.selector.removeChild(option);\n                }\n            }\n            this.cfg_id = this.selector.value;\n            this.modem_cfg_list = value;\n            this.update();\n        }\n    \n        set view(data){\n            this.data = data;\n            if (data == null) {\n                return;\n            }\n            var keys = []\n            \n            var tables_map = {}\n    \n            var warning_message = [];\n            for (let entry of data){\n                let class_name,class_no_translate,full_name,value,type;\n                class_no_translate = entry.class_origin;\n                class_name = this.cfg_id + \" <%:Base Information%>\";\n                if (entry.type == \"warning_message\") {\n                    continue;\n                }\n                if (class_no_translate != \"Base Information\" && entry.type != \"progress_bar\"){\n                    continue\n                }\n                if (tables_map[class_name] == null) {\n                    tables_map[class_name] = []\n                }\n                tables_map[class_name].push(entry);\n            }\n            for (let class_name in tables_map) {\n                if (this.tables[class_name] == null) {\n                    this.tables[class_name] = new LuciTable();\n                    this.cbi_map.appendChild(this.tables[class_name].fieldset);\n                }\n                this.tables[class_name].title = class_name;\n                this.tables[class_name].data = tables_map[class_name];\n            }\n            for (let table in this.tables) {\n                if (tables_map[table] == null) {\n                    this.cbi_map.removeChild(this.tables[table].fieldset);\n                    delete this.tables[table];\n                }\n            }\n    \n            if (warning_message.length > 0) {\n                for (let i = 0; i < warning_message.length; i++) {\n                    let entry = warning_message[i];\n                    let full_name = entry.full_name ? entry.full_name : entry.key;\n    \n                    let node = document.createElement('p');\n                    node.innerHTML = full_name + entry.value;\n                    this.warning_message(node);\n                }\n            }\n            else{\n                this.hide_warning_message();\n            }\n        }\n    }\n\n    </script>\n\n\n<% \nlocal uci = luci.model.uci.cursor()\nmodem_configs = {}\nlocal modem = uci:foreach(\"qmodem\", \"modem-device\",function(s)\n    table.insert(modem_configs,s[\".name\"])\n    end)\nfor _,v in ipairs(modem_configs) do\n%>\n<div id=\"modem_<%=v%>\">\n    \n</div>\n<script>\n    const modem_info_<%=v%> = new ModemInfo(\"<%=v%>\");\n    modem_info_<%=v%>.poll_info();\n    modem_info_<%=v%>.update();\n</script>\n\n<%\nend\n%>\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/libexec/rpcd/modem_ctrl",
    "content": "#!/bin/sh\n. /lib/functions.sh\ninfo()\n{\n    state=$(uci get qmodem.$1.state)\n    if [ \"$state\" = \"disabled\" ]; then\n        return\n    fi\n    info=$(/usr/share/qmodem/modem_ctrl.sh info $1)\n    json_array=$(echo $json_array | jq \". += [ $info ]\")\n}\n\nsim_info()\n{\n    state=$(uci get qmodem.$1.state)\n    if [ \"$state\" = \"disabled\" ]; then\n        return\n    fi\n    /usr/share/qmodem/modem_ctrl.sh sim_info $1\n}\n\nbase_info()\n{\n    state=$(uci get modem.$1.state)\n    if [ \"$state\" = \"disabled\" ]; then\n        return\n    fi\n    /usr/share/qmodem/modem_ctrl.sh base_info $1\n}\n\nnetwork_info()\n{\n    state=$(uci get qmodem.$1.state)\n    if [ \"$state\" = \"disabled\" ]; then\n        return\n    fi\n    /usr/share/qmodem/modem_ctrl.sh network_info $1\n}\n\ncell_info()\n{\n    state=$(uci get qmodem.$1.state)\n    if [ \"$state\" = \"disabled\" ]; then\n        return\n    fi\n    /usr/share/qmodem/modem_ctrl.sh cell_info $1\n}\ncase \"$1\" in\n\tlist)\n\t\techo '{ \"info\": {  }, \"base_info\": { }, \"failme\": {} }'\n\t;;\n\tcall)\n\t\tcase \"$2\" in\n\t\t\t\"info\")\n                json_array=\"[]\"\n                config_load qmodem\n                config_foreach info modem-device\n                echo \"{\\\"info\\\":$json_array}\"\n\t\t\t;;\n            \"base_info\")\n                config_load qmodem\n                config_foreach base_info modem-device\n            ;;\n            \"sim_info\")\n                config_load qmodem\n                config_foreach sim_info modem-device\n            ;;\n            \"network_info\")\n                config_load qmodem\n                config_foreach network_info modem-device\n            ;;\n            \"cell_info\")\n                config_load qmodem\n                config_foreach cell_info modem-device\n            ;;\n\t\tesac\n\t;;\nesac\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/libexec/rpcd/qmodem",
    "content": "#!/bin/sh\n# RPCD interface for QModem control\n# This script provides ubus methods for modem management\n\n. /usr/share/libubox/jshn.sh\n. /usr/share/qmodem/generic.sh\n\nTRAFFIC_RESET_CRON_FILE=\"/etc/crontabs/root\"\nTRAFFIC_RESET_DEFAULT_ENABLED=0\nTRAFFIC_RESET_DEFAULT_TYPE=\"monthly\"\nTRAFFIC_RESET_DEFAULT_HOUR=0\nTRAFFIC_RESET_DEFAULT_DAY=1\nTRAFFIC_RESET_DEFAULT_MINUTE=0\n\n# Helper function for caching\ntry_cache() {\n    cache_timeout=$1\n    cache_file=$2\n    function_name=$3\n    current_time=$(date +%s)\n    file_time=$(stat -t \"$cache_file\" 2>/dev/null | awk '{print $14}')\n    [ -z \"$file_time\" ] && file_time=0\n    if [ ! -f \"$cache_file\" ] || [ $((current_time - file_time)) -gt $cache_timeout ]; then\n        touch \"$cache_file\"\n        json_add_array modem_info\n        $function_name\n        json_close_array\n        json_dump > \"$cache_file\"\n        cat \"$cache_file\"\n    else\n        cat \"$cache_file\"\n    fi\n}\n\n# Helper function for SMS retrieval\nget_sms() {\n    [ -n \"$sms_at_port\" ] && at_port=$sms_at_port\n    cache_timeout=$1\n    cache_file=$2\n    current_time=$(date +%s)\n    file_time=$(stat -t \"$cache_file\" 2>/dev/null | awk '{print $14}')\n    [ -z \"$file_time\" ] && file_time=0\n    get_sms_capabilities\n    if [ ! -f \"$cache_file\" ] || [ $((current_time - file_time)) -gt $cache_timeout ]; then\n        touch \"$cache_file\"\n        tom_modem $use_ubus_flag -d \"$at_port\" -o r > \"$cache_file\"\n        echo \"$(cat \"$cache_file\" ; json_dump)\" | jq -s 'add'\n    else\n        echo \"$(cat \"$cache_file\" ; json_dump)\" | jq -s 'add'\n    fi\n}\n\n# Helper function to load vendor-specific script\nload_vendor_script() {\n    local vendor=\"$1\"\n    local vendor_script_prefix=\"/usr/share/qmodem/vendor\"\n    local dynamic_load_json=\"$vendor_script_prefix/dynamic_load.json\"\n    local vendor_file=\"${vendor_script_prefix}/$(jq -r --arg vendor \"$vendor\" '.[$vendor]' \"$dynamic_load_json\" 2>/dev/null)\"\n    \n    if [ -z \"$vendor\" ] || [ ! -f \"$vendor_file\" ]; then\n        . /usr/share/qmodem/generic.sh\n    else\n        . \"$vendor_file\"\n    fi\n}\n\n# Helper function to get modem configuration\nget_modem_config() {\n    local section=\"$1\"\n    at_port=$(uci get qmodem.$section.at_port 2>/dev/null)\n    override_at_port=$(uci get qmodem.$section.override_at_port 2>/dev/null)\n    [ -n \"$override_at_port\" ] && at_port=$override_at_port\n    sms_at_port=$(uci -q get qmodem.$section.sms_at_port 2>/dev/null)\n    vendor=$(uci get qmodem.$section.manufacturer 2>/dev/null)\n    manufacturer=\"$vendor\"\n    platform=$(uci get qmodem.$section.platform 2>/dev/null)\n    pdp_index=$(uci get qmodem.$section.pdp_index 2>/dev/null)\n    [ -z \"$pdp_index\" ] && pdp_index=$(uci get qmodem.$section.suggest_pdp_index 2>/dev/null)\n    use_ubus=$(uci get qmodem.$section.use_ubus 2>/dev/null)\n    modem_path=$(uci get qmodem.$section.path 2>/dev/null)\n    modem_slot=$(basename \"$modem_path\" 2>/dev/null)\n    \n    [ -z \"$pdp_index\" ] && pdp_index=\"1\"\n    [ \"$use_ubus\" = \"1\" ] && use_ubus_flag=\"-u\"\n}\n\n# Helper function to get AT port configuration (for SMS and AT commands)\nget_at_port_config() {\n    local section=\"$1\"\n    local use_sms_port=\"$2\"\n    at_port=$(uci get qmodem.$section.at_port 2>/dev/null)\n    override_at_port=$(uci get qmodem.$section.override_at_port 2>/dev/null)\n    [ -n \"$override_at_port\" ] && at_port=$override_at_port\n    \n    if [ \"$use_sms_port\" = \"1\" ]; then\n        sms_at_port=$(uci -q get qmodem.$section.sms_at_port 2>/dev/null)\n        [ -n \"$sms_at_port\" ] && at_port=$sms_at_port\n    fi\n    \n    use_ubus=$(uci get qmodem.$section.use_ubus 2>/dev/null)\n    [ \"$use_ubus\" = \"1\" ] && use_ubus_flag=\"-u\"\n}\n\n# Helper function to get vendor information\nget_vendor_info() {\n    local section=\"$1\"\n    vendor=$(uci get qmodem.$section.manufacturer 2>/dev/null)\n    platform=$(uci get qmodem.$section.platform 2>/dev/null)\n}\n\n# Helper function for AT configuration\nget_at_cfg() {\n    json_add_object at_cfg\n    duns=$(ls /dev/mhi_DUN* 2>/dev/null)\n    ttys=$(ls /dev/ttyUSB* 2>/dev/null)\n    ttyacms=$(ls /dev/ttyACM* 2>/dev/null)\n    wwanNatN=$(ls /dev/wwan* 2>/dev/null | grep -E 'wwan[0-9]at[0-9]')\n    all_ttys=\"$duns $ttys $ttyacms $wwanNatN\"\n    json_add_array other_ttys\n    for tty in $all_ttys; do\n        [ -n \"$tty\" ] && json_add_string \"\" \"$tty\"\n    done\n    json_close_array\n    json_add_array ports\n    ports=$(uci get qmodem.$config_section.ports 2>/dev/null)\n    for port in $ports; do\n        json_add_string \"\" \"$port\"\n    done\n    json_close_array\n    json_add_array valid_ports\n    v_ports=$(uci get qmodem.$config_section.valid_at_ports 2>/dev/null)\n    for port in $v_ports; do\n        json_add_string \"\" \"$port\"\n    done\n    json_close_array\n    override_at_port=$(uci get qmodem.$config_section.override_at_port 2>/dev/null)\n    at_port=$(uci get qmodem.$config_section.at_port 2>/dev/null)\n    [ -n \"$override_at_port\" ] && at_port=$override_at_port\n    json_add_string using_port \"$at_port\"\n    json_add_array cmds\n    \n    # Determine language and select appropriate AT commands file\n    lang=$(uci get luci.main.lang 2>/dev/null || echo \"en\")\n    case \"$lang\" in\n        zh*|cn|auto)\n            at_commands_file=\"/usr/share/qmodem/at_commands_zh.json\"\n            ;;\n        *)\n            at_commands_file=\"/usr/share/qmodem/at_commands_en.json\"\n            ;;\n    esac\n    \n    # Fallback to default file if language-specific file doesn't exist\n    [ ! -f \"$at_commands_file\" ] && at_commands_file=\"/usr/share/qmodem/at_commands.json\"\n    \n    general_cmd=$(jq -rc '.general[]|to_entries| .[] | @sh \"key=\\(.key) value=\\(.value)\"' \"$at_commands_file\" 2>/dev/null)\n    platform_cmd=$(jq -rc \".${vendor}.${platform}[]|to_entries| .[] | @sh \\\"key=\\(.key) value=\\(.value)\\\"\" \"$at_commands_file\" 2>/dev/null)\n    [ -z \"$platform_cmd\" ] && platform_cmd=$(jq -rc \".$vendor.general[]|to_entries| .[] | @sh \\\"key=\\(.key) value=\\(.value)\\\"\" \"$at_commands_file\" 2>/dev/null)\n    cmds=$(echo -e \"$general_cmd\\n$platform_cmd\")\n    IFS=$'\\n'\n    for cmd in $cmds; do\n        json_add_object cmd\n        eval $cmd\n        json_add_string \"name\" \"$key\"\n        json_add_string \"value\" \"$value\"\n        json_close_object\n    done\n    json_close_array\n    json_close_object\n    json_dump\n    unset IFS\n}\n\ntraffic_reset_fail()\n{\n    echo \"$1\" >&2\n    exit 1\n}\n\ntraffic_reset_is_integer()\n{\n    case \"$1\" in\n        ''|*[!0-9]*)\n            return 1\n            ;;\n        *)\n            return 0\n            ;;\n    esac\n}\n\ntraffic_reset_normalize_bool()\n{\n    case \"$1\" in\n        1|true|TRUE|True|yes|on)\n            echo \"1\"\n            ;;\n        *)\n            echo \"0\"\n            ;;\n    esac\n}\n\ntraffic_reset_get_marker()\n{\n    printf \"QMODEM_TRAFFIC_RESET_SECTION='%s'\" \"$1\"\n}\n\ntraffic_reset_get_line()\n{\n    local config_section=\"$1\"\n    local marker\n\n    marker=$(traffic_reset_get_marker \"$config_section\")\n    [ -f \"$TRAFFIC_RESET_CRON_FILE\" ] || return 0\n    grep -F \"$marker\" \"$TRAFFIC_RESET_CRON_FILE\" | head -n 1\n}\n\ntraffic_reset_remove_old_lines()\n{\n    local config_section=\"$1\"\n    local marker tmp_file\n\n    marker=$(traffic_reset_get_marker \"$config_section\")\n    tmp_file=$(mktemp) || return 1\n\n    if [ -f \"$TRAFFIC_RESET_CRON_FILE\" ]; then\n        grep -Fv \"$marker\" \"$TRAFFIC_RESET_CRON_FILE\" > \"$tmp_file\" || true\n    fi\n\n    cat \"$tmp_file\" > \"$TRAFFIC_RESET_CRON_FILE\"\n    rm -f \"$tmp_file\"\n}\n\ntraffic_reset_reload_cron()\n{\n    /etc/init.d/cron reload >/dev/null 2>&1 || /etc/init.d/cron restart >/dev/null 2>&1\n}\n\ntraffic_reset_build_line()\n{\n    local config_section=\"$1\"\n    local reset_type=\"$2\"\n    local hour=\"$3\"\n    local day=\"$4\"\n    local minute=\"$TRAFFIC_RESET_DEFAULT_MINUTE\"\n    local marker\n\n    marker=$(traffic_reset_get_marker \"$config_section\")\n\n    if [ \"$reset_type\" = \"daily\" ]; then\n        printf \"%s %s * * * %s ubus call qmodem clear_stats '{\\\"config_section\\\":\\\"%s\\\"}' >/dev/null 2>&1\" \\\n            \"$minute\" \"$hour\" \"$marker\" \"$config_section\"\n    else\n        printf \"%s %s %s * * %s ubus call qmodem clear_stats '{\\\"config_section\\\":\\\"%s\\\"}' >/dev/null 2>&1\" \\\n            \"$minute\" \"$hour\" \"$day\" \"$marker\" \"$config_section\"\n    fi\n}\n\ntraffic_reset_dump_json()\n{\n    local enabled=\"$1\"\n    local reset_type=\"$2\"\n    local hour=\"$3\"\n    local day=\"$4\"\n    local minute=\"$5\"\n    local line=\"$6\"\n\n    if [ -n \"$line\" ]; then\n        jq -n \\\n            --argjson enabled \"$enabled\" \\\n            --arg reset_type \"$reset_type\" \\\n            --argjson hour \"$hour\" \\\n            --argjson day \"$day\" \\\n            --argjson minute \"$minute\" \\\n            --arg line \"$line\" \\\n            '{\n                enabled: ($enabled == 1),\n                reset_type: $reset_type,\n                hour: $hour,\n                day: $day,\n                minute: $minute,\n                line: $line\n            }'\n    else\n        jq -n \\\n            --argjson enabled \"$enabled\" \\\n            --arg reset_type \"$reset_type\" \\\n            --argjson hour \"$hour\" \\\n            --argjson day \"$day\" \\\n            --argjson minute \"$minute\" \\\n            '{\n                enabled: ($enabled == 1),\n                reset_type: $reset_type,\n                hour: $hour,\n                day: $day,\n                minute: $minute,\n                line: null\n            }'\n    fi\n}\n\ntraffic_reset_dump_set_json()\n{\n    local result=\"$1\"\n    local config_section=\"$2\"\n    local enabled=\"$3\"\n    local reset_type=\"$4\"\n    local hour=\"$5\"\n    local day=\"$6\"\n    local minute=\"$7\"\n    local line=\"$8\"\n\n    if [ -n \"$line\" ]; then\n        jq -n \\\n            --argjson result \"$result\" \\\n            --arg config_section \"$config_section\" \\\n            --argjson enabled \"$enabled\" \\\n            --arg reset_type \"$reset_type\" \\\n            --argjson hour \"$hour\" \\\n            --argjson day \"$day\" \\\n            --argjson minute \"$minute\" \\\n            --arg line \"$line\" \\\n            '{\n                result: $result,\n                config_section: $config_section,\n                enabled: ($enabled == 1),\n                reset_type: $reset_type,\n                hour: $hour,\n                day: $day,\n                minute: $minute,\n                line: $line\n            }'\n    else\n        jq -n \\\n            --argjson result \"$result\" \\\n            --arg config_section \"$config_section\" \\\n            --argjson enabled \"$enabled\" \\\n            --arg reset_type \"$reset_type\" \\\n            --argjson hour \"$hour\" \\\n            --argjson day \"$day\" \\\n            --argjson minute \"$minute\" \\\n            '{\n                result: $result,\n                config_section: $config_section,\n                enabled: ($enabled == 1),\n                reset_type: $reset_type,\n                hour: $hour,\n                day: $day,\n                minute: $minute,\n                line: null\n            }'\n    fi\n}\n\ntraffic_reset_get_schedule()\n{\n    local config_section=\"$1\"\n    local enabled reset_type hour day line\n\n    enabled=$(traffic_reset_normalize_bool \"$(uci -q get \"qmodem.${config_section}.usage_reset_enabled\")\")\n    reset_type=$(uci -q get \"qmodem.${config_section}.usage_reset_type\")\n    hour=$(uci -q get \"qmodem.${config_section}.usage_reset_hour\")\n    day=$(uci -q get \"qmodem.${config_section}.usage_reset_day\")\n\n    [ -n \"$reset_type\" ] || reset_type=\"$TRAFFIC_RESET_DEFAULT_TYPE\"\n    [ -n \"$hour\" ] || hour=\"$TRAFFIC_RESET_DEFAULT_HOUR\"\n    [ -n \"$day\" ] || day=\"$TRAFFIC_RESET_DEFAULT_DAY\"\n\n    if [ \"$reset_type\" != \"daily\" ] && [ \"$reset_type\" != \"monthly\" ]; then\n        reset_type=\"$TRAFFIC_RESET_DEFAULT_TYPE\"\n    fi\n\n    if ! traffic_reset_is_integer \"$hour\" || [ \"$hour\" -lt 0 ] || [ \"$hour\" -gt 23 ]; then\n        hour=\"$TRAFFIC_RESET_DEFAULT_HOUR\"\n    fi\n\n    if ! traffic_reset_is_integer \"$day\" || [ \"$day\" -lt 1 ] || [ \"$day\" -gt 31 ]; then\n        day=\"$TRAFFIC_RESET_DEFAULT_DAY\"\n    fi\n\n    line=$(traffic_reset_get_line \"$config_section\")\n    traffic_reset_dump_json \"$enabled\" \"$reset_type\" \"$hour\" \"$day\" \"$TRAFFIC_RESET_DEFAULT_MINUTE\" \"$line\"\n}\n\ntraffic_reset_set_schedule()\n{\n    local input_json=\"$1\"\n    local config_section enabled reset_type hour day line cron_backup\n\n    config_section=$(echo \"$input_json\" | jsonfilter -e '@.config_section')\n    enabled=$(traffic_reset_normalize_bool \"$(echo \"$input_json\" | jsonfilter -e '@.enabled')\")\n    reset_type=$(echo \"$input_json\" | jsonfilter -e '@.reset_type')\n    hour=$(echo \"$input_json\" | jsonfilter -e '@.hour')\n    day=$(echo \"$input_json\" | jsonfilter -e '@.day')\n\n    [ -n \"$config_section\" ] || traffic_reset_fail \"Missing config_section\"\n\n    case \"$reset_type\" in\n        daily|monthly)\n            ;;\n        *)\n            traffic_reset_fail \"Invalid reset_type: $reset_type\"\n            ;;\n    esac\n\n    traffic_reset_is_integer \"$hour\" || traffic_reset_fail \"Invalid hour: $hour\"\n    [ \"$hour\" -ge 0 ] && [ \"$hour\" -le 23 ] || traffic_reset_fail \"Hour out of range: $hour\"\n\n    traffic_reset_is_integer \"$day\" || traffic_reset_fail \"Invalid day: $day\"\n    [ \"$day\" -ge 1 ] && [ \"$day\" -le 31 ] || traffic_reset_fail \"Day out of range: $day\"\n\n    cron_backup=$(mktemp) || traffic_reset_fail \"Failed to allocate cron backup\"\n    if [ -f \"$TRAFFIC_RESET_CRON_FILE\" ]; then\n        cat \"$TRAFFIC_RESET_CRON_FILE\" > \"$cron_backup\" || {\n            rm -f \"$cron_backup\"\n            traffic_reset_fail \"Failed to back up traffic reset schedule\"\n        }\n    fi\n\n    traffic_reset_remove_old_lines \"$config_section\" || {\n        rm -f \"$cron_backup\"\n        traffic_reset_fail \"Failed to remove old traffic reset schedule\"\n    }\n\n    uci -q set \"qmodem.${config_section}.usage_reset_enabled=$enabled\" || {\n        cat \"$cron_backup\" > \"$TRAFFIC_RESET_CRON_FILE\" 2>/dev/null || true\n        rm -f \"$cron_backup\"\n        traffic_reset_fail \"Failed to update usage_reset_enabled\"\n    }\n    uci -q set \"qmodem.${config_section}.usage_reset_type=$reset_type\" || {\n        uci -q revert qmodem\n        cat \"$cron_backup\" > \"$TRAFFIC_RESET_CRON_FILE\" 2>/dev/null || true\n        rm -f \"$cron_backup\"\n        traffic_reset_fail \"Failed to update usage_reset_type\"\n    }\n    uci -q set \"qmodem.${config_section}.usage_reset_hour=$hour\" || {\n        uci -q revert qmodem\n        cat \"$cron_backup\" > \"$TRAFFIC_RESET_CRON_FILE\" 2>/dev/null || true\n        rm -f \"$cron_backup\"\n        traffic_reset_fail \"Failed to update usage_reset_hour\"\n    }\n    uci -q set \"qmodem.${config_section}.usage_reset_day=$day\" || {\n        uci -q revert qmodem\n        cat \"$cron_backup\" > \"$TRAFFIC_RESET_CRON_FILE\" 2>/dev/null || true\n        rm -f \"$cron_backup\"\n        traffic_reset_fail \"Failed to update usage_reset_day\"\n    }\n\n    if [ \"$enabled\" = \"1\" ]; then\n        line=$(traffic_reset_build_line \"$config_section\" \"$reset_type\" \"$hour\" \"$day\")\n        printf \"%s\\n\" \"$line\" >> \"$TRAFFIC_RESET_CRON_FILE\" || {\n            uci -q revert qmodem\n            cat \"$cron_backup\" > \"$TRAFFIC_RESET_CRON_FILE\" 2>/dev/null || true\n            rm -f \"$cron_backup\"\n            traffic_reset_fail \"Failed to write traffic reset schedule\"\n        }\n    else\n        line=\"\"\n    fi\n\n    uci commit qmodem || {\n        uci -q revert qmodem\n        cat \"$cron_backup\" > \"$TRAFFIC_RESET_CRON_FILE\" 2>/dev/null || true\n        rm -f \"$cron_backup\"\n        traffic_reset_fail \"Failed to commit qmodem config\"\n    }\n    traffic_reset_reload_cron || {\n        cat \"$cron_backup\" > \"$TRAFFIC_RESET_CRON_FILE\" 2>/dev/null || true\n        rm -f \"$cron_backup\"\n        traffic_reset_fail \"Failed to reload cron service\"\n    }\n\n    rm -f \"$cron_backup\"\n\n    traffic_reset_dump_set_json \"true\" \"$config_section\" \"$enabled\" \"$reset_type\" \"$hour\" \"$day\" \"$TRAFFIC_RESET_DEFAULT_MINUTE\" \"$line\"\n}\n\ncase \"$1\" in\n    list)\n        cat <<EOF\n{\n    \"base_info\": {\n        \"config_section\": \"string\"\n    },\n    \"cell_info\": {\n        \"config_section\": \"string\"\n    },\n    \"clear_dial_log\": {\n        \"config_section\": \"string\"\n    },\n    \"dial_status\": {\n        \"config_section\": \"string\"\n    },\n    \"get_dial_log\": {\n        \"config_section\": \"string\"\n    },\n    \"modem_dial\": {\n        \"config_section\": \"string\"\n    },\n    \"modem_hang\": {\n        \"config_section\": \"string\"\n    },\n    \"modem_redial\": {\n        \"config_section\": \"string\"\n    },\n    \"delete_sms\": {\n        \"config_section\": \"string\",\n        \"index\": \"string\"\n    },\n    \"clear_stats\": {\n        \"config_section\": \"string\"\n    },\n    \"save_stats\": {\n        \"config_section\": \"string\"\n    },\n    \"do_reboot\": {\n        \"config_section\": \"string\",\n        \"params\": \"object\"\n    },\n    \"get_at_cfg\": {\n        \"config_section\": \"string\"\n    },\n    \"get_copyright\": {\n        \"config_section\": \"string\"\n    },\n    \"get_disabled_features\": {\n        \"config_section\": \"string\"\n    },\n    \"get_dns\": {\n        \"config_section\": \"string\"\n    },\n    \"get_imei\": {\n        \"config_section\": \"string\"\n    },\n    \"get_lockband\": {\n        \"config_section\": \"string\"\n    },\n    \"get_mode\": {\n        \"config_section\": \"string\"\n    },\n    \"get_neighborcell\": {\n        \"config_section\": \"string\"\n    },\n    \"get_network_prefer\": {\n        \"config_section\": \"string\"\n    },\n    \"get_reboot_caps\": {\n        \"config_section\": \"string\"\n    },\n    \"get_stats\": {\n        \"config_section\": \"string\"\n    },\n    \"get_traffic_reset_schedule\": {\n        \"config_section\": \"string\"\n    },\n    \"get_sms\": {\n        \"config_section\": \"string\"\n    },\n    \"get_connect_status\": {\n        \"config_section\": \"string\"\n    },\n    \"info\": {\n        \"config_section\": \"string\"\n    },\n    \"network_info\": {\n        \"config_section\": \"string\"\n    },\n    \"send_at\": {\n        \"config_section\": \"string\",\n        \"params\": \"object\"\n    },\n    \"send_raw_pdu\": {\n        \"config_section\": \"string\",\n        \"cmd\": \"string\"\n    },\n    \"send_sms\": {\n        \"config_section\": \"string\",\n        \"params\": \"object\"\n    },\n    \"set_imei\": {\n        \"config_section\": \"string\",\n        \"imei\": \"string\"\n    },\n    \"set_lockband\": {\n        \"config_section\": \"string\",\n        \"params\": \"object\"\n    },\n    \"set_mode\": {\n        \"config_section\": \"string\",\n        \"mode\": \"string\"\n    },\n    \"set_neighborcell\": {\n        \"config_section\": \"string\",\n        \"params\": \"object\"\n    },\n    \"set_network_prefer\": {\n        \"config_section\": \"string\",\n        \"params\": \"object\"\n    },\n    \"set_sms_storage\": {\n        \"config_section\": \"string\",\n        \"storage\": \"string\"\n    },\n    \"set_traffic_reset_schedule\": {\n        \"config_section\": \"string\",\n        \"enabled\": \"bool\",\n        \"reset_type\": \"string\",\n        \"hour\": \"int\",\n        \"day\": \"int\"\n    },\n    \"sim_info\": {\n        \"config_section\": \"string\"\n    },\n    \"remove_modem\": {\n        \"config_section\": \"string\"\n    },\n    \"scan_pcie\": {},\n    \"scan_usb\": {},\n    \"scan_all\": {},\n    \"get_pcie_devices\": {},\n    \"get_usb_devices\": {},\n    \"get_available_devices\": {},\n    \"get_leds\": {},\n    \"get_network_interfaces\": {},\n    \"get_tty_ports\": {},\n    \"get_sim_switch_capabilities\": {\n        \"config_section\": \"string\"\n    },\n    \"get_sim_slot\": {\n        \"config_section\": \"string\"\n    },\n    \"set_sim_slot\": {\n        \"config_section\": \"string\",\n        \"slot\": \"string\"\n    }\n}\nEOF\n        ;;\n    call)\n        read -r input\n        config_section=$(echo \"$input\" | jsonfilter -e '@.config_section')\n        if [ -n \"$config_section\" ]; then\n            get_modem_config \"$config_section\" > /dev/null\n            load_vendor_script \"$vendor\" > /dev/null\n            . /usr/share/qmodem/modem_util.sh\n        fi\n\n        case \"$2\" in\n            base_info|cell_info|info|network_info|sim_info|get_copyright|\\\n            get_disabled_features|get_dns|get_imei|get_lockband|get_mode|\\\n            get_neighborcell|get_network_prefer|get_reboot_caps|get_stats|save_stats|\\\n            get_traffic_reset_schedule|\\\n            get_sms|\\\n            get_at_cfg|clear_dial_log|dial_status|get_dial_log|get_connect_status|\\\n            remove_modem|\\\n            get_sim_switch_capabilities|get_sim_slot)\n                # Execute method\n                case \"$2\" in\n                    base_info)\n                        json_init\n                        cache_file=\"/tmp/cache_base_info_$config_section\"\n                        try_cache 10 \"$cache_file\" base_info\n                        ;;\n                    cell_info)\n                        json_init\n                        cache_file=\"/tmp/cache_cell_info_$config_section\"\n                        try_cache 10 \"$cache_file\" cell_info\n                        ;;\n                    clear_dial_log)\n                        json_init\n                        json_add_object result\n                        log_file=\"/var/run/qmodem/${config_section}_dir/dial_log\"\n                        if [ -f \"$log_file\" ]; then\n                            echo \"\" > \"$log_file\"\n                            json_add_string status \"1\"\n                        else\n                            json_add_string status \"0\"\n                        fi\n                        json_close_object\n                        json_dump\n                        ;;\n                    dial_status)\n                        status_output=$(/etc/init.d/qmodem_network modem_status \"$config_section\" 2>/dev/null)\n                        json_init\n                        if [[ \"$status_output\" != *\"Not Running\"* ]]; then\n                            json_add_string running true\n                        else\n                            json_add_string running false\n                        fi\n                        json_dump\n                        ;;\n                    get_dial_log)\n                        json_init\n                        log_file=\"/var/run/qmodem/${config_section}_dir/dial_log\"\n                        if [ -f \"$log_file\" ]; then\n                            log_content=$(cat \"$log_file\" | tail -n 100)\n                            json_add_string log \"$log_content\"\n                        else\n                            json_add_string log \"\"\n                        fi\n                        json_dump\n                        ;;\n                    get_at_cfg)\n                        json_init\n                        get_at_cfg\n                        ;;\n                    get_copyright)\n                        json_init\n                        _copyright\n                        json_dump\n                        ;;\n                    get_disabled_features)\n                        json_init\n                        json_add_array disabled_features\n                        vendor_get_disabled_features\n                        get_modem_disabled_features\n                        get_global_disabled_features\n                        json_close_array\n                        json_dump\n                        ;;\n                    get_dns)\n                        json_init\n                        get_dns\n                        json_dump\n                        ;;\n                    get_imei)\n                        json_init\n                        get_imei\n                        json_dump\n                        ;;\n                    get_lockband)\n                        json_init\n                        get_lockband\n                        json_dump\n                        ;;\n                    get_mode)\n                        json_init\n                        get_mode\n                        json_dump\n                        ;;\n                    get_neighborcell)\n                        json_init\n                        get_neighborcell\n                        json_dump\n                        ;;\n                    get_network_prefer)\n                        json_init\n                        get_network_prefer\n                        json_dump\n                        ;;\n                    get_reboot_caps)\n                        json_init\n                        get_reboot_caps\n                        json_dump\n                        ;;\n                    get_stats)\n                        json_init\n                        get_usage_stats\n                        json_dump\n                        ;;\n                    save_stats)\n                        json_init\n                        json_add_object result\n                        if write_usage_stats; then\n                            json_add_string status \"1\"\n                        else\n                            json_add_string status \"0\"\n                        fi\n                        json_close_object\n                        json_dump\n                        ;;\n                    get_traffic_reset_schedule)\n                        traffic_reset_get_schedule \"$config_section\"\n                        ;;\n                    get_sms)\n                        get_sms 10 \"/tmp/cache_sms_$config_section\"\n                        ;;\n                    info)\n                        json_init\n                        cache_file=\"/tmp/cache_info_$config_section\"\n                        try_cache 10 \"$cache_file\" get_info\n                        ;;\n                    network_info)\n                        json_init\n                        cache_file=\"/tmp/cache_network_info_$config_section\"\n                        try_cache 10 \"$cache_file\" network_info\n                        ;;\n                    sim_info)\n                        json_init\n                        cache_file=\"/tmp/cache_sim_info_$config_section\"\n                        try_cache 10 \"$cache_file\" sim_info\n                        ;;\n                    get_connect_status)\n                        json_init\n                        get_connect_status\n                        json_add_string connection_status \"$connect_status\"\n                        json_dump\n                        ;;\n                    remove_modem)\n                        json_init\n                        /usr/share/qmodem/modem_scan.sh remove \"$config_section\" >/dev/null 2>&1\n                        json_add_string status \"$?\"\n                        json_dump\n                        ;;\n                    get_sim_switch_capabilities)\n                        json_init\n                        sim_switch_capabilities\n                        json_dump\n                        ;;\n                    get_sim_slot)\n                        json_init\n                        get_sim_slot\n                        json_dump\n                        ;;\n                esac\n                ;;\n                \n            delete_sms)\n                read -r input\n                index=$(echo \"$input\" | jsonfilter -e '@.index')\n                \n                # Source helper functions and get configuration\n                . /usr/share/qmodem/modem_util.sh\n                get_at_port_config \"$config_section\" 1\n                \n                json_init\n                json_add_object result\n                for i in $index; do\n                    tom_modem $use_ubus_flag -d \"$at_port\" -o d -i \"$i\"\n                    if [ \"$?\" = \"0\" ]; then\n                        json_add_string status \"1\"\n                        json_add_string \"index$i\" \"tom_modem $use_ubus_flag -d $at_port -o d -i $i\"\n                    else\n                        json_add_string status \"0\"\n                    fi\n                done\n                json_close_object\n                json_dump\n                rm -rf \"/tmp/cache_sms_$config_section\"\n                ;;\n\n            clear_stats)\n                json_init\n                clear_usage_stats\n                json_dump\n                ;;\n                \n            do_reboot)\n                params=$(echo \"$input\" | jsonfilter -e '@.params')\n                reboot_method=$(echo \"$params\" | jq -r '.method')\n                \n                case \"$reboot_method\" in\n                    \"hard\")\n                        hard_reboot\n                        ;;\n                    \"soft\")\n                        soft_reboot\n                        ;;\n                esac\n                \n                json_init\n                json_add_object result\n                json_add_string status \"1\"\n                json_add_string method \"$reboot_method\"\n                json_close_object\n                json_dump\n                ;;\n                \n            send_at)\n\n                params=$(echo \"$input\" | jsonfilter -e '@.params')\n                cmd=$(echo \"$params\" | jq -r '.at')\n                port=$(echo \"$params\" | jq -r '.port')\n                use_ubus_flag=$(echo \"$params\" | jq -r '.use_ubus_flag')\n                if [ \"$use_ubus_flag\" = \"1\" ]; then\n                    use_ubus_flag=\"-u\"\n                else\n                    use_ubus_flag=\"\"\n                fi\n                res=$(at \"$port\" \"$cmd\")\n                ret=$?\n                \n                json_init\n                json_add_object at_cfg\n                if [ \"$ret\" = \"0\" ]; then\n                    json_add_string status \"1\"\n                    json_add_string cmd \"at $port $cmd\"\n                    json_add_string res \"$res\"\n                else\n                    json_add_string status \"0\"\n                fi\n                json_close_object\n                json_dump\n                ;;\n                \n            send_raw_pdu)\n                read -r input\n                cmd=$(echo \"$input\" | jsonfilter -e '@.cmd')\n                \n                # Source helper functions and get configuration\n                . /usr/share/qmodem/modem_util.sh\n                get_at_port_config \"$config_section\" 1\n                \n                res=$(tom_modem $use_ubus_flag -d \"$at_port\" -o s -p \"$cmd\")\n                ret=$?\n                \n                json_init\n                json_add_object result\n                if [ \"$ret\" = \"0\" ]; then\n                    json_add_string status \"1\"\n                    json_add_string cmd \"tom_modem $use_ubus_flag -d $at_port -o s -p \\\"$cmd\\\"\"\n                    json_add_string res \"$res\"\n                else\n                    json_add_string status \"0\"\n                fi\n                json_close_object\n                json_dump\n                ;;\n                \n            send_sms)\n                read -r input\n                params=$(echo \"$input\" | jsonfilter -e '@.params')\n                phone_number=$(echo \"$params\" | jq -r '.phone_number')\n                message_content=$(echo \"$params\" | jq -r '.message_content')\n                \n                # Source helper functions and get configuration\n                . /usr/share/qmodem/modem_util.sh\n                get_at_port_config \"$config_section\" 1\n                \n                sms_tool_q -d \"$at_port\" send \"$phone_number\" \"$message_content\" > /dev/null\n                ret=$?\n                \n                json_init\n                json_add_object result\n                if [ \"$ret\" = \"0\" ]; then\n                    json_add_string status \"1\"\n                    json_add_string cmd \"sms_tool_q -d $at_port send \\\"$phone_number\\\" \\\"$message_content\\\"\"\n                    json_add_string cmd_json \"$params\"\n                else\n                    json_add_string status \"0\"\n                fi\n                json_close_object\n                json_dump\n                ;;\n                \n            set_imei)\n                imei=$(echo \"$input\" | jsonfilter -e '@.imei')\n                json_init\n                json_add_string imei \"$imei\"\n                json_add_object result\n                json_add_string status \"1\"\n                json_close_object\n                set_imei \"$imei\"\n                json_dump\n                ;;\n                \n            set_lockband|set_neighborcell|set_network_prefer)\n                config_section=$(echo \"$input\" | jsonfilter -e '@.config_section')\n                params=$(echo \"$input\" | jsonfilter -e '@.params')\n                \n                # Source helper functions and get configuration\n                . /usr/share/qmodem/modem_util.sh\n                get_modem_config \"$config_section\"\n                \n                # Load vendor-specific script\n                load_vendor_script \"$vendor\"\n                \n                json_init\n                case \"$2\" in\n                    set_lockband)\n                        set_lockband \"$params\"\n                        ;;\n                    set_neighborcell)\n                        set_neighborcell \"$params\"\n                        ;;\n                    set_network_prefer)\n                        set_network_prefer \"$params\"\n                        ;;\n                esac\n                json_dump\n                ;;\n                \n            set_mode)\n                mode=$(echo \"$input\" | jsonfilter -e '@.mode')\n                json_init\n                set_mode \"$mode\"\n                json_add_string result \"$mode\"\n                json_dump\n                ;;\n                \n            set_sms_storage)\n                storage=$(echo \"$input\" | jsonfilter -e '@.storage')\n                json_init\n                set_sms_storage \"$storage\"\n                json_dump\n                ;;\n\n            set_traffic_reset_schedule)\n                traffic_reset_set_schedule \"$input\"\n                ;;\n\n            set_sim_slot)\n                slot=$(echo \"$input\" | jsonfilter -e '@.slot')\n                json_init\n                set_sim_slot \"$slot\"\n                json_dump\n                ;;\n            \n            modem_dial)\n                json_init\n                /etc/init.d/qmodem_network dial \"$config_section\" >/dev/null 2>&1\n                ret=$?\n                json_add_object result\n                if [ \"$ret\" = \"0\" ]; then\n                    json_add_string status \"1\"\n                    json_add_string message \"Dial command executed successfully\"\n                else\n                    json_add_string status \"0\"\n                    json_add_string message \"Dial command failed\"\n                fi\n                json_close_object\n                json_dump\n                ;;\n            \n            modem_hang)\n                json_init\n                /etc/init.d/qmodem_network hang \"$config_section\" >/dev/null 2>&1\n                ret=$?\n                json_add_object result\n                if [ \"$ret\" = \"0\" ]; then\n                    json_add_string status \"1\"\n                    json_add_string message \"Hang command executed successfully\"\n                else\n                    json_add_string status \"0\"\n                    json_add_string message \"Hang command failed\"\n                fi\n                json_close_object\n                json_dump\n                ;;\n            \n            modem_redial)\n                json_init\n                /etc/init.d/qmodem_network redial \"$config_section\" >/dev/null 2>&1\n                ret=$?\n                json_add_object result\n                if [ \"$ret\" = \"0\" ]; then\n                    json_add_string status \"1\"\n                    json_add_string message \"Redial command executed successfully\"\n                else\n                    json_add_string status \"0\"\n                    json_add_string message \"Redial command failed\"\n                fi\n                json_close_object\n                json_dump\n                ;;\n            \n            scan_pcie)\n                json_init\n                if [ -x \"/usr/share/qmodem/modem_scan.sh\" ]; then\n                    output=$(/usr/share/qmodem/modem_scan.sh scan 0 pcie 2>&1)\n                    scan_result=$?\n                    json_add_int \"code\" \"$scan_result\"\n                    if [ \"$scan_result\" -eq 0 ]; then\n                        json_add_string \"message\" \"PCIe scan completed successfully\"\n                    else\n                        json_add_string \"message\" \"PCIe scan failed with exit code: $scan_result\"\n                        json_add_string \"output\" \"$output\"\n                    fi\n                else\n                    json_add_int \"code\" 127\n                    json_add_string \"message\" \"Scan script not found or not executable\"\n                fi\n                json_dump\n                ;;\n            \n            scan_usb)\n                json_init\n                if [ -x \"/usr/share/qmodem/modem_scan.sh\" ]; then\n                    output=$(/usr/share/qmodem/modem_scan.sh scan 0 usb 2>&1)\n                    scan_result=$?\n                    json_add_int \"code\" \"$scan_result\"\n                    if [ \"$scan_result\" -eq 0 ]; then\n                        json_add_string \"message\" \"USB scan completed successfully\"\n                    else\n                        json_add_string \"message\" \"USB scan failed with exit code: $scan_result\"\n                        json_add_string \"output\" \"$output\"\n                    fi\n                else\n                    json_add_int \"code\" 127\n                    json_add_string \"message\" \"Scan script not found or not executable\"\n                fi\n                json_dump\n                ;;\n            \n            scan_all)\n                json_init\n                if [ -x \"/usr/share/qmodem/modem_scan.sh\" ]; then\n                    output=$(/usr/share/qmodem/modem_scan.sh scan 2>&1)\n                    scan_result=$?\n                    json_add_int \"code\" \"$scan_result\"\n                    if [ \"$scan_result\" -eq 0 ]; then\n                        json_add_string \"message\" \"Full scan completed successfully\"\n                    else\n                        json_add_string \"message\" \"Full scan failed with exit code: $scan_result\"\n                        json_add_string \"output\" \"$output\"\n                    fi\n                else\n                    json_add_int \"code\" 127\n                    json_add_string \"message\" \"Scan script not found or not executable\"\n                fi\n                json_dump\n                ;;\n            \n            get_pcie_devices)\n                json_init\n                json_add_array \"devices\"\n                if [ -d \"/sys/bus/pci/devices/\" ]; then\n                    for device in /sys/bus/pci/devices/*; do\n                        [ -e \"$device\" ] || continue\n                        device_id=$(basename \"$device\")\n                        json_add_object\n                        json_add_string \"id\" \"$device_id\"\n                        json_add_string \"label\" \"$device_id [pcie]\"\n                        json_close_object\n                    done\n                fi\n                json_close_array\n                json_dump\n                ;;\n            \n            get_usb_devices)\n                json_init\n                json_add_array \"devices\"\n                if [ -d \"/sys/bus/usb/devices/\" ]; then\n                    for device in /sys/bus/usb/devices/*; do\n                        [ -e \"$device\" ] || continue\n                        device_id=$(basename \"$device\")\n                        # Skip root hubs (usb1, usb2, etc.)\n                        echo \"$device_id\" | grep -q '^usb[0-9]\\+$' && continue\n                        json_add_object\n                        json_add_string \"id\" \"$device_id\"\n                        json_add_string \"label\" \"$device_id [usb]\"\n                        json_close_object\n                    done\n                fi\n                json_close_array\n                json_dump\n                ;;\n            \n            get_available_devices)\n                json_init\n                json_add_object \"devices\"\n                # Add PCIe devices\n                if [ -d \"/sys/bus/pci/devices/\" ]; then\n                    for device in /sys/bus/pci/devices/*; do\n                        [ -e \"$device\" ] || continue\n                        device_id=$(basename \"$device\")\n                        # Convert to UCI-safe name\n                        uci_name=$(echo \"$device_id\" | sed 's/\\./_/g; s/:/_/g; s/-/_/g')\n                        json_add_object \"$uci_name\"\n                        json_add_string \"label\" \"$device_id [pcie]\"\n                        json_add_string \"type\" \"pcie\"\n                        json_add_string \"path\" \"/sys/bus/pci/devices/$device_id\"\n                        json_close_object\n                    done\n                fi\n                # Add USB devices\n                if [ -d \"/sys/bus/usb/devices/\" ]; then\n                    for device in /sys/bus/usb/devices/*; do\n                        [ -e \"$device\" ] || continue\n                        device_id=$(basename \"$device\")\n                        # Skip root hubs (usb1, usb2, etc.)\n                        echo \"$device_id\" | grep -q '^usb[0-9]\\+$' && continue\n                        # Convert to UCI-safe name\n                        uci_name=$(echo \"$device_id\" | sed 's/\\./_/g; s/:/_/g; s/-/_/g')\n                        json_add_object \"$uci_name\"\n                        json_add_string \"label\" \"$device_id [usb]\"\n                        json_add_string \"type\" \"usb\"\n                        json_add_string \"path\" \"/sys/bus/usb/devices/$device_id\"\n                        json_close_object\n                    done\n                fi\n                json_close_object\n                json_dump\n                ;;\n            \n            get_leds)\n                json_init\n                json_add_array \"leds\"\n                if [ -d \"/sys/class/leds/\" ]; then\n                    for led in /sys/class/leds/*; do\n                        [ -e \"$led\" ] || continue\n                        led_name=$(basename \"$led\")\n                        json_add_object\n                        json_add_string \"id\" \"$led_name\"\n                        json_add_string \"label\" \"$led_name\"\n                        json_close_object\n                    done\n                fi\n                json_close_array\n                json_dump\n                ;;\n            \n            get_network_interfaces)\n                json_init\n                json_add_array \"interfaces\"\n                if [ -d \"/sys/class/net/\" ]; then\n                    for iface in /sys/class/net/*; do\n                        [ -e \"$iface\" ] || continue\n                        iface_name=$(basename \"$iface\")\n                        json_add_object\n                        json_add_string \"id\" \"$iface_name\"\n                        json_add_string \"label\" \"$iface_name\"\n                        json_close_object\n                    done\n                fi\n                json_close_array\n                json_dump\n                ;;\n            \n            get_tty_ports)\n                json_init\n                json_add_array \"ports\"\n                # Add ttyUSB ports (USB modems)\n                for i in 0 1 2 3 4 5 6 7; do\n                    if [ -e \"/dev/ttyUSB$i\" ]; then\n                        json_add_object\n                        json_add_string \"id\" \"/dev/ttyUSB$i\"\n                        json_add_string \"label\" \"/dev/ttyUSB$i\"\n                        json_close_object\n                    fi\n                done\n                # Add ttyACM ports (CDC ACM modems)\n                for i in 0 1 2 3; do\n                    if [ -e \"/dev/ttyACM$i\" ]; then\n                        json_add_object\n                        json_add_string \"id\" \"/dev/ttyACM$i\"\n                        json_add_string \"label\" \"/dev/ttyACM$i\"\n                        json_close_object\n                    fi\n                done\n                # Add mhi ports (PCIe modems with MHI interface)\n                for port in /dev/mhi_*; do\n                    if [ -e \"$port\" ]; then\n                        port_name=$(basename \"$port\")\n                        json_add_object\n                        json_add_string \"id\" \"$port\"\n                        json_add_string \"label\" \"$port_name\"\n                        json_close_object\n                    fi\n                done\n                # Add wwan ports\n                for port in /dev/wwan*at; do\n                    if [ -e \"$port\" ]; then\n                        port_name=$(basename \"$port\")\n                        json_add_object\n                        json_add_string \"id\" \"$port\"\n                        json_add_string \"label\" \"$port_name\"\n                        json_close_object\n                    fi\n                done\n                json_close_array\n                json_dump\n                ;;\n                \n            *)\n                json_init\n                json_add_object error\n                json_add_string message \"Unknown method: $2\"\n                json_close_object\n                json_dump\n                return 1\n                ;;\n        esac\n        ;;\nesac\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/at_commands_en.json",
    "content": "{\n    \"general\": [\n        {\n            \"Module Information > ATI\": \"ATI\"\n        },\n        {\n            \"Query SIM Card Status > AT+CPIN?\": \"AT+CPIN?\"\n        },\n        {\n            \"Query Network Signal Quality (4G) > AT+CSQ\": \"AT+CSQ\"\n        },\n        {\n            \"Query Network Signal Quality (5G) > AT+CESQ\": \"AT+CESQ\"\n        },\n        {\n            \"Query Network Information > AT+COPS?\": \"AT+COPS?\"\n        },\n        {\n            \"Query PDP Information > AT+CGDCONT?\": \"AT+CGDCONT?\"\n        },\n        {\n            \"Query PDP Address > AT+CGPADDR\": \"AT+CGPADDR\"\n        },\n        {\n            \"Query Module IMEI > AT+CGSN\": \"AT+CGSN\"\n        },\n        {\n            \"Query Module IMEI > AT+GSN\": \"AT+GSN\"\n        },\n        {\n            \"Check Current Voltage > AT+CBC\": \"AT+CBC\"\n        },\n        {\n            \"Minimum Function Mode > AT+CFUN=0\": \"AT+CFUN=0\"\n        },\n        {\n            \"Full Function Mode > AT+CFUN=1\": \"AT+CFUN=1\"\n        },\n        {\n            \"Restart Module > AT+CFUN=1,1\": \"AT+CFUN=1,1\"\n        }\n    ],\n    \"quectel\": {\n        \"qualcomm\": [\n            {\n                \"SIM Card Status Report > AT+QSIMSTAT?\": \"AT+QSIMSTAT?\"\n            },\n            {\n                \"Set Current SIM to Slot 1 > AT+QUIMSLOT=1\": \"AT+QUIMSLOT=1\"\n            },\n            {\n                \"Set Current SIM to Slot 2 > AT+QUIMSLOT=2\": \"AT+QUIMSLOT=2\"\n            },\n            {\n                \"Query Network Information > AT+QNWINFO\": \"AT+QNWINFO\"\n            },\n            {\n                \"Query Carrier Aggregation Parameters > AT+QCAINFO\": \"AT+QCAINFO\"\n            },\n            {\n                \"Query 5G Signal Strength (RSRP) > AT+QRSRP\": \"AT+QRSRP\"\n            },\n            {\n                \"Query Current Dial Mode > AT+QCFG=\\\"usbnet\\\"\": \"AT+QCFG=\\\"usbnet\\\"\"\n            },\n            {\n                \"QMI/GobiNet Dial Mode > AT+QCFG=\\\"usbnet\\\",0\": \"AT+QCFG=\\\"usbnet\\\",0\"\n            },\n            {\n                \"ECM Dial Mode > AT+QCFG=\\\"usbnet\\\",1\": \"AT+QCFG=\\\"usbnet\\\",1\"\n            },\n            {\n                \"MBIM Dial Mode > AT+QCFG=\\\"usbnet\\\",2\": \"AT+QCFG=\\\"usbnet\\\",2\"\n            },\n            {\n                \"RNDIS Dial Mode > AT+QCFG=\\\"usbnet\\\",3\": \"AT+QCFG=\\\"usbnet\\\",3\"\n            },\n            {\n                \"NCM Dial Mode > AT+QCFG=\\\"usbnet\\\",5\": \"AT+QCFG=\\\"usbnet\\\",5\"\n            },\n            {\n                \"Lock to 4G > AT+QNWPREFCFG=\\\"mode_pref\\\",LTE\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",LTE\"\n            },\n            {\n                \"Lock to 5G > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G\"\n            },\n            {\n                \"Lock to 5G NSA > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-NSA\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-NSA\"\n            },\n            {\n                \"Lock to 5G SA > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-SA\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-SA\"\n            },\n            {\n                \"Restore Automatic Network Search > AT+QNWPREFCFG=\\\"mode_pref\\\",AUTO\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",AUTO\"\n            },\n            {\n                \"Query Module IMEI > AT+EGMR=0,7\": \"AT+EGMR=0,7\"\n            },\n            {\n                \"Change Module IMEI > AT+EGMR=1,7,\\\"IMEI\\\"\": \"AT+EGMR=1,7,\\\"Set IMEI here\\\"\"\n            },\n            {\n                \"Get Module Temperature > AT+QTEMP\": \"AT+QTEMP\"\n            },\n            {\n                \"Switch to USB Communication Port > AT+QCFG=\\\"data_interface\\\",0,0\": \"AT+QCFG=\\\"data_interface\\\",0,0\"\n            },\n            {\n                \"Switch to PCIE Communication Port > AT+QCFG=\\\"data_interface\\\",1,0\": \"AT+QCFG=\\\"data_interface\\\",1,0\"\n            },\n            {\n                \"Check Current USB Speed > AT+QCFG=\\\"usbspeed\\\"\": \"AT+QCFG=\\\"usbspeed\\\"\"\n            },\n            {\n                \"Switch to USB2.0 > AT+QCFG=\\\"usbspeed\\\",\\\"20\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"20\\\"\"\n            },\n            {\n                \"Switch to USB3.1 Gen1 (5Gbps) > AT+QCFG=\\\"usbspeed\\\",\\\"311\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"311\\\"\"\n            },\n            {\n                \"Switch to USB3.1 Gen1 (10Gbps) > AT+QCFG=\\\"usbspeed\\\",\\\"312\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"312\\\"\"\n            },\n            {\n                \"Reset Module > AT+QCFG=\\\"ResetFactory\\\"\": \"AT+QCFG=\\\"ResetFactory\\\"\"\n            }\n        ],\n        \"unisoc\": [\n            {\n                \"SIM Card Status Report > AT+QSIMSTAT?\": \"AT+QSIMSTAT?\"\n            },\n            {\n                \"Set Current SIM to Slot 1 > AT+QUIMSLOT=1\": \"AT+QUIMSLOT=1\"\n            },\n            {\n                \"Set Current SIM to Slot 2 > AT+QUIMSLOT=2\": \"AT+QUIMSLOT=2\"\n            },\n            {\n                \"Query Network Information > AT+QNWINFO\": \"AT+QNWINFO\"\n            },\n            {\n                \"Query Carrier Aggregation Parameters > AT+QCAINFO\": \"AT+QCAINFO\"\n            },\n            {\n                \"Query Current Dial Mode > AT+QCFG=\\\"usbnet\\\"\": \"AT+QCFG=\\\"usbnet\\\"\"\n            },\n            {\n                \"ECM Dial Mode > AT+QCFG=\\\"usbnet\\\",1\": \"AT+QCFG=\\\"usbnet\\\",1\"\n            },\n            {\n                \"MBIM Dial Mode > AT+QCFG=\\\"usbnet\\\",2\": \"AT+QCFG=\\\"usbnet\\\",2\"\n            },\n            {\n                \"RNDIS Dial Mode > AT+QCFG=\\\"usbnet\\\",3\": \"AT+QCFG=\\\"usbnet\\\",3\"\n            },\n            {\n                \"NCM Dial Mode > AT+QCFG=\\\"usbnet\\\",5\": \"AT+QCFG=\\\"usbnet\\\",5\"\n            },\n            {\n                \"Lock to 4G > AT+QNWPREFCFG=\\\"mode_pref\\\",LTE\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",LTE\"\n            },\n            {\n                \"Lock to 5G > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G\"\n            },\n            {\n                \"Lock to 5G NSA > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-NSA\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-NSA\"\n            },\n            {\n                \"Lock to 5G SA > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-SA\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-SA\"\n            },\n            {\n                \"Restore Automatic Network Search > AT+QNWPREFCFG=\\\"mode_pref\\\",AUTO\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",AUTO\"\n            },\n            {\n                \"Query Module IMEI > AT+EGMR=0,7\": \"AT+EGMR=0,7\"\n            },\n            {\n                \"Change Module IMEI > AT+EGMR=1,7,\\\"IMEI\\\"\": \"AT+EGMR=1,7,\\\"Set IMEI here\\\"\"\n            },\n            {\n                \"Get Module Temperature > AT+QTEMP\": \"AT+QTEMP\"\n            },\n            {\n                \"Switch to USB Communication Port > AT+QCFG=\\\"data_interface\\\",0,0\": \"AT+QCFG=\\\"data_interface\\\",0,0\"\n            },\n            {\n                \"Switch to PCIE Communication Port > AT+QCFG=\\\"data_interface\\\",1,0\": \"AT+QCFG=\\\"data_interface\\\",1,0\"\n            },\n            {\n                \"Check Current USB Speed > AT+QCFG=\\\"usbspeed\\\"\": \"AT+QCFG=\\\"usbspeed\\\"\"\n            },\n            {\n                \"Switch to USB2.0 > AT+QCFG=\\\"usbspeed\\\",\\\"20\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"20\\\"\"\n            },\n            {\n                \"Switch to USB3.1 Gen1 (5Gbps) > AT+QCFG=\\\"usbspeed\\\",\\\"311\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"311\\\"\"\n            },\n            {\n                \"Switch to USB3.1 Gen1 (10Gbps) > AT+QCFG=\\\"usbspeed\\\",\\\"312\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"312\\\"\"\n            },\n            {\n                \"Reset Module > AT+QCFG=\\\"ResetFactory\\\"\": \"AT+QCFG=\\\"ResetFactory\\\"\"\n            }\n        ],\n        \"general\": [\n            {\n                \"SIM Card Status Report > AT+QSIMSTAT?\": \"AT+QSIMSTAT?\"\n            },\n            {\n                \"Set Current SIM to Slot 1 > AT+QUIMSLOT=1\": \"AT+QUIMSLOT=1\"\n            },\n            {\n                \"Set Current SIM to Slot 2 > AT+QUIMSLOT=2\": \"AT+QUIMSLOT=2\"\n            },\n            {\n                \"Query Network Information > AT+QNWINFO\": \"AT+QNWINFO\"\n            },\n            {\n                \"Query Carrier Aggregation Parameters > AT+QCAINFO\": \"AT+QCAINFO\"\n            },\n            {\n                \"Query Current Dial Mode > AT+QCFG=\\\"usbnet\\\"\": \"AT+QCFG=\\\"usbnet\\\"\"\n            },\n            {\n                \"QMI/GobiNet Dial Mode > AT+QCFG=\\\"usbnet\\\",0\": \"AT+QCFG=\\\"usbnet\\\",0\"\n            },\n            {\n                \"ECM Dial Mode > AT+QCFG=\\\"usbnet\\\",1\": \"AT+QCFG=\\\"usbnet\\\",1\"\n            },\n            {\n                \"MBIM Dial Mode > AT+QCFG=\\\"usbnet\\\",2\": \"AT+QCFG=\\\"usbnet\\\",2\"\n            },\n            {\n                \"RNDIS Dial Mode > AT+QCFG=\\\"usbnet\\\",3\": \"AT+QCFG=\\\"usbnet\\\",3\"\n            },\n            {\n                \"NCM Dial Mode > AT+QCFG=\\\"usbnet\\\",5\": \"AT+QCFG=\\\"usbnet\\\",5\"\n            },\n            {\n                \"Lock to 4G > AT+QNWPREFCFG=\\\"mode_pref\\\",LTE\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",LTE\"\n            },\n            {\n                \"Lock to 5G > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G\"\n            },\n            {\n                \"Lock to 5G NSA > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-NSA\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-NSA\"\n            },\n            {\n                \"Lock to 5G SA > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-SA\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-SA\"\n            },\n            {\n                \"Restore Automatic Network Search > AT+QNWPREFCFG=\\\"mode_pref\\\",AUTO\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",AUTO\"\n            },\n            {\n                \"Query Module IMEI > AT+EGMR=0,7\": \"AT+EGMR=0,7\"\n            },\n            {\n                \"Change Module IMEI > AT+EGMR=1,7,\\\"IMEI\\\"\": \"AT+EGMR=1,7,\\\"Set IMEI here\\\"\"\n            },\n            {\n                \"Get Module Temperature > AT+QTEMP\": \"AT+QTEMP\"\n            },\n            {\n                \"Switch to USB Communication Port > AT+QCFG=\\\"data_interface\\\",0,0\": \"AT+QCFG=\\\"data_interface\\\",0,0\"\n            },\n            {\n                \"Switch to PCIE Communication Port > AT+QCFG=\\\"data_interface\\\",1,0\": \"AT+QCFG=\\\"data_interface\\\",1,0\"\n            },\n            {\n                \"Check Current USB Speed > AT+QCFG=\\\"usbspeed\\\"\": \"AT+QCFG=\\\"usbspeed\\\"\"\n            },\n            {\n                \"Switch to USB2.0 > AT+QCFG=\\\"usbspeed\\\",\\\"20\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"20\\\"\"\n            },\n            {\n                \"Switch to USB3.1 Gen1 (5Gbps) > AT+QCFG=\\\"usbspeed\\\",\\\"311\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"311\\\"\"\n            },\n            {\n                \"Switch to USB3.1 Gen1 (10Gbps) > AT+QCFG=\\\"usbspeed\\\",\\\"312\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"312\\\"\"\n            },\n            {\n                \"Reset Module > AT+QCFG=\\\"ResetFactory\\\"\": \"AT+QCFG=\\\"ResetFactory\\\"\"\n            }\n        ]\n    },\n    \"fibocom\": {\n        \"qualcomm\": [\n            {\n                \"Set Current SIM to Slot 1 > AT+GTDUALSIM=0\": \"AT+GTDUALSIM=0\"\n            },\n            {\n                \"Set Current SIM to Slot 2 > AT+GTDUALSIM=1\": \"AT+GTDUALSIM=1\"\n            },\n            {\n                \"ECM Manual Dial > AT+GTRNDIS=1,1\": \"AT+GTRNDIS=1,1\"\n            },\n            {\n                \"ECM Dial Disconnect > AT+GTRNDIS=0,1\": \"AT+GTRNDIS=0,1\"\n            },\n            {\n                \"Query Current Port Mode > AT+GTUSBMODE?\": \"AT+GTUSBMODE?\"\n            },\n            {\n                \"QMI/GobiNet Dial Mode > AT+GTUSBMODE=32\": \"AT+GTUSBMODE=32\"\n            },\n            {\n                \"ECM Dial Mode > AT+GTUSBMODE=18\": \"AT+GTUSBMODE=18\"\n            },\n            {\n                \"MBIM Dial Mode > AT+GTUSBMODE=30\": \"AT+GTUSBMODE=30\"\n            },\n            {\n                \"RNDIS Dial Mode > AT+GTUSBMODE=24\": \"AT+GTUSBMODE=24\"\n            },\n            {\n                \"NCM Dial Mode > AT+GTUSBMODE=18\": \"AT+GTUSBMODE=18\"\n            },\n            {\n                \"Lock to 4G > AT+GTACT=2\": \"AT+GTACT=2\"\n            },\n            {\n                \"Lock to 5G > AT+GTACT=14\": \"AT+GTACT=14\"\n            },\n            {\n                \"Restore Automatic Network Search > AT+GTACT=20\": \"AT+GTACT=20\"\n            },\n            {\n                \"Query Current Connected Network Type > AT+PSRAT?\": \"AT+PSRAT?\"\n            },\n            {\n                \"Query Module IMEI > AT+GTSN=0,7\": \"AT+GTSN=0,7\"\n            },\n            {\n                \"Change Module IMEI > AT+GTSN=1,7,\\\"IMEI\\\"\": \"AT+GTSN=1,7,\\\"Set IMEI here\\\"\"\n            },\n            {\n                \"Report Current BBIC Temperature > AT+MTSM=1,6\": \"AT+MTSM=1,6\"\n            },\n            {\n                \"Report Current RF Temperature > AT+MTSM=1,7\": \"AT+MTSM=1,7\"\n            },\n            {\n                \"Restart Module > AT+CFUN=15\": \"AT+CFUN=15\"\n            }\n        ],\n        \"unisoc\": [\n            {\n                \"Set Current SIM to Slot 1 > AT+GTDUALSIM=0\": \"AT+GTDUALSIM=0\"\n            },\n            {\n                \"Set Current SIM to Slot 2 > AT+GTDUALSIM=1\": \"AT+GTDUALSIM=1\"\n            },\n            {\n                \"ECM Manual Dial > AT+GTRNDIS=1,1\": \"AT+GTRNDIS=1,1\"\n            },\n            {\n                \"ECM Dial Disconnect > AT+GTRNDIS=0,1\": \"AT+GTRNDIS=0,1\"\n            },\n            {\n                \"Query Current Port Mode > AT+GTUSBMODE?\": \"AT+GTUSBMODE?\"\n            },\n            {\n                \"ECM Dial Mode > AT+GTUSBMODE=18\": \"AT+GTUSBMODE=18\"\n            },\n            {\n                \"MBIM Dial Mode > AT+GTUSBMODE=30\": \"AT+GTUSBMODE=30\"\n            },\n            {\n                \"RNDIS Dial Mode > AT+GTUSBMODE=24\": \"AT+GTUSBMODE=24\"\n            },\n            {\n                \"NCM Dial Mode > AT+GTUSBMODE=18\": \"AT+GTUSBMODE=18\"\n            },\n            {\n                \"Lock to 4G > AT+GTACT=2\": \"AT+GTACT=2\"\n            },\n            {\n                \"Lock to 5G > AT+GTACT=14\": \"AT+GTACT=14\"\n            },\n            {\n                \"Restore Automatic Network Search > AT+GTACT=20\": \"AT+GTACT=20\"\n            },\n            {\n                \"Query Current Connected Network Type > AT+PSRAT?\": \"AT+PSRAT?\"\n            },\n            {\n                \"Query Module IMEI > AT+GTSN=0,7\": \"AT+GTSN=0,7\"\n            },\n            {\n                \"Change Module IMEI > AT+GTSN=1,7,\\\"IMEI\\\"\": \"AT+GTSN=1,7,\\\"Set IMEI here\\\"\"\n            },\n            {\n                \"Report Current BBIC Temperature > AT+MTSM=1,6\": \"AT+MTSM=1,6\"\n            },\n            {\n                \"Report Current RF Temperature > AT+MTSM=1,7\": \"AT+MTSM=1,7\"\n            },\n            {\n                \"Restart Module > AT+CFUN=15\": \"AT+CFUN=15\"\n            }\n        ],\n        \"mediatek\": [\n            {\n                \"Set Current SIM to Slot 1 > AT+GTDUALSIM=0\": \"AT+GTDUALSIM=0\"\n            },\n            {\n                \"Set Current SIM to Slot 2 > AT+GTDUALSIM=1\": \"AT+GTDUALSIM=1\"\n            },\n            {\n                \"Manual Set Access Point > AT+CGDCONT=3,\\\"IPV4V6\\\",\\\"APN\\\"\": \"AT+CGDCONT=3,\\\"IPV4V6\\\",\\\"Set APN here\\\"\"\n            },\n            {\n                \"Manual Dial > AT+CGACT=1,3\": \"AT+CGACT=1,3\"\n            },\n            {\n                \"Stop Dialing > AT+CGACT=0,3\": \"AT+CGACT=0,3\"\n            },\n            {\n                \"Query Current Port Mode > AT+GTUSBMODE?\": \"AT+GTUSBMODE?\"\n            },\n            {\n                \"RNDIS Dial Mode (40) > AT+GTUSBMODE=40\": \"AT+GTUSBMODE=40\"\n            },\n            {\n                \"RNDIS Dial Mode (41) > AT+GTUSBMODE=41\": \"AT+GTUSBMODE=41\"\n            },\n            {\n                \"Lock to 4G > AT+GTACT=2\": \"AT+GTACT=2\"\n            },\n            {\n                \"Lock to 5G > AT+GTACT=14\": \"AT+GTACT=14\"\n            },\n            {\n                \"Restore Automatic Network Search > AT+GTACT=20\": \"AT+GTACT=20\"\n            },\n            {\n                \"Query Current Connected Network Type > AT+PSRAT?\": \"AT+PSRAT?\"\n            },\n            {\n                \"Query Carrier Aggregation Cell Information > AT+GTCAINFO?\": \"AT+GTCAINFO?\"\n            },\n            {\n                \"Query Module IMEI > AT+GTSN=0,7\": \"AT+GTSN=0,7\"\n            },\n            {\n                \"Change Module IMEI > AT+GTSN=1,7,\\\"IMEI\\\"\": \"AT+GTSN=1,7,\\\"Set IMEI here\\\"\"\n            },\n            {\n                \"Unlock FCC > AT+GTFCCLOCKMODE=0\": \"AT+GTFCCLOCKMODE=0\"\n            },\n            {\n                \"Unlock ESIM > AT+GTESIMCFG=0,0,0\": \"AT+GTESIMCFG=0,0,0\"\n            },\n            {\n                \"Disable Thermal Control > AT+GTTHERMAL=0\": \"AT+GTTHERMAL=0\"\n            },\n            {\n                \"Get Current Temperature > AT+GTSENRDTEMP=0\": \"AT+GTSENRDTEMP=0\"\n            },\n            {\n                \"Restart Module > AT+CFUN=15\": \"AT+CFUN=15\"\n            }\n        ]\n    },\n    \"meig\": {\n        \"qualcomm\": [\n            {\n                \"SIM Card Status Report > AT^SIMSLOTURC=1\": \"AT^SIMSLOTURC=1\"\n            },\n            {\n                \"Get SIM Card Slot Status > AT^SIMSLOT?\": \"AT^SIMSLOT?\"\n            },\n            {\n                \"Set Current SIM to Slot 1 > AT^SIMSLOT=1\": \"AT^SIMSLOT=1\"\n            },\n            {\n                \"Set Current SIM to Slot 2 > AT^SIMSLOT=2\": \"AT^SIMSLOT=2\"\n            },\n            {\n                \"Query Network Information > AT^SYSINFOEX\": \"AT^SYSINFOEX\"\n            },\n            {\n                \"Query Carrier Aggregation Cell Information > AT^CELLINFO=1\": \"AT^CELLINFO=1\"\n            },\n            {\n                \"Query Current Dial Mode > AT+SER?\": \"AT+SER?\"\n            },\n            {\n                \"QMI/GobiNet Dial Mode > AT+SER=1,1\": \"AT+SER=1,1\"\n            },\n            {\n                \"ECM Dial Mode > AT+SER=2,1\": \"AT+SER=2,1\"\n            },\n            {\n                \"MBIM Dial Mode > AT+SER=3,1\": \"AT+SER=3,1\"\n            },\n            {\n                \"RNDIS Dial Mode > AT+SER=3,1\": \"AT+SER=3,1\"\n            },\n            {\n                \"NCM Dial Mode > AT+SER=2,1\": \"AT+SER=2,1\"\n            },\n            {\n                \"Lock to 4G > AT^SYSCFGEX=\\\"03\\\",all,0,2,all,all,all,all,1\": \"AT^SYSCFGEX=\\\"03\\\",all,0,2,all,all,all,all,1\"\n            },\n            {\n                \"Lock to 5G > AT^SYSCFGEX=\\\"04\\\",all,0,2,all,all,all,all,1\": \"AT^SYSCFGEX=\\\"04\\\",all,0,2,all,all,all,all,1\"\n            },\n            {\n                \"Restore Automatic Network Search > AT^SYSCFGEX=\\\"00\\\",all,0,2,all,all,all,all,1\": \"AT^SYSCFGEX=\\\"00\\\",all,0,2,all,all,all,all,1\"\n            },\n            {\n                \"Query Module IMEI > AT+LCTSN=0,7\": \"AT+LCTSN=0,7\"\n            },\n            {\n                \"Change Module IMEI > AT+LCTSN=1,7,\\\"IMEI\\\"\": \"AT+LCTSN=1,7,\\\"Set IMEI here\\\"\"\n            },\n            {\n                \"Get Module Temperature > AT+TEMP\": \"AT+TEMP\"\n            },\n            {\n                \"Restart Module > AT+RESET\": \"AT+RESET\"\n            }\n        ]\n    },\n    \"foxconn\": {\n        \"qualcomm\": [\n            {\n                \"SIM Card Status Report > AT^SIMSLOTURC=1\": \"AT^SIMSLOTURC=1\"\n            },\n            {\n                \"Get SIM Card Slot Status > AT^SWITCH_SLOT?\": \"AT^SWITCH_SLOT?\"\n            },\n            {\n                \"Set Current SIM to Slot 1 > at^switch_slot=0\": \"at^switch_slot=0\"\n            },\n            {\n                \"Set Current SIM to ESIM > at^switch_slot=1\": \"at^switch_slot=1\"\n            },\n            {\n                \"Query Network and Carrier Information > AT^DEBUG?\": \"AT^DEBUG?\"\n            },\n            {\n                \"Get Module Temperature > AT^TEMP?\": \"AT^TEMP?\"\n            },\n            {\n                \"Restart Module > AT+RESET\": \"AT+RESET\"\n            }\n        ]\n    },\n    \"huawei\": {\n        \"hisilicon\": [\n            {\n                \"Set Current SIM to Slot 0 > AT^SCICHG=0,1\": \"AT^SCICHG=0,1\"\n            },\n            {\n                \"Set Current SIM to Slot 1 > AT^SCICHG=1,0\": \"AT^SCICHG=1,0\"\n            },\n            {\n                \"Query Network Information > AT^SYSINFOEX\": \"AT^SYSINFOEX\"\n            },\n            {\n                \"Query Current Dial Mode > AT^SETMODE?\": \"AT^SETMODE?\"\n            },\n            {\n                \"ECM Dial Mode (Linux) > AT^SETMODE=0\": \"AT^SETMODE=0\"\n            },\n            {\n                \"NCM Dial Mode (Windows) > AT^SETMODE=1\": \"AT^SETMODE=1\"\n            },\n            {\n                \"ECM Dial Mode (Linux, Debug) > AT^SETMODE=2\": \"AT^SETMODE=2\"\n            },\n            {\n                \"NCM Dial Mode (Windows, Debug) > AT^SETMODE=3\": \"AT^SETMODE=3\"\n            },\n            {\n                \"Lock to 4G > AT^SYSCFGEX=\\\"03\\\",40000000,1,2,7FFFFFFFFFFFFFFF,,\": \"AT^SYSCFGEX=\\\"03\\\",40000000,1,2,7FFFFFFFFFFFFFFF,,\"\n            },\n            {\n                \"Lock to 5G > AT^SYSCFGEX=\\\"08\\\",40000000,1,2,7FFFFFFFFFFFFFFF,,\": \"AT^SYSCFGEX=\\\"08\\\",40000000,1,2,7FFFFFFFFFFFFFFF,,\"\n            },\n            {\n                \"Restore Automatic Network Search > AT^SYSCFGEX=\\\"00\\\",3FFFFFFF,1,2,7FFFFFFFFFFFFFFF,,\": \"AT^SYSCFGEX=\\\"00\\\",3FFFFFFF,1,2,7FFFFFFFFFFFFFFF,,\"\n            },\n            {\n                \"Get Module Temperature > AT^CHIPTEMP?\": \"AT^CHIPTEMP?\"\n            },\n            {\n                \"Restart Module > AT^RESET\": \"AT^RESET\"\n            }\n        ]\n    },\n    \"simcom\": {\n        \"qualcomm\": [\n            {\n                \"Query Band Lock Mode > \": \"AT+CNMP?\"\n            },\n            {\n                \"Set Band Lock Mode > Automatic\": \"AT+CNMP=2\"\n            },\n            {\n                \"Set Band Lock Mode > WCDMA Only\": \"AT+CNMP=14\"\n            },\n            {\n                \"Set Band Lock Mode > LTE Only\": \"AT+CNMP=38\"\n            },\n            {\n                \"Set Band Lock Mode > NR5G\": \"AT+CNMP=71\"\n            },\n            {\n                \"Set Band Lock Mode > WCDMA+LTE Only\": \"AT+CNMP=54\"\n            },\n            {\n                \"Set Band Lock Mode > WCDMA+LTE+NR5G\": \"AT+CNMP=55\"\n            },\n            {\n                \"Set Band Lock Mode > LTE+NR5G\": \"AT+CNMP=109\"\n            },\n            {\n                \"Reset Module > AT+CRESET\": \"AT+CRESET\"\n            },\n            {\n                \"Reset Module > AT+CFUN=6\": \"AT+CFUN=6\"\n            },\n            {\n                \"Reset Module > ATZ\": \"ATZ\"\n            },\n            {\n                \"Enable Uplink/Downlink Display Mode > AT+CNWINFO=1\": \"AT+CNWINFO=1\"\n            },\n            {\n                \"Disable Uplink/Downlink Display Mode > AT+CNWINFO=0\": \"AT+CNWINFO=0\"\n            },\n            {\n                \"Switch to PCIE Mode > AT+CPCIEMODE=EP\": \"AT+CPCIEMODE=EP\"\n            },\n            {\n                \"Switch to USB Mode > AT+CPCIEMODE=HOST\": \"AT+CPCIEMODE=HOST\"\n            },\n            {\n                \"Enable SIM Hot Swap > AT+UIMHOTSWAPON=1\": \"AT+UIMHOTSWAPON=1\"\n            },\n            {\n                \"Disable SIM Hot Swap > AT+UIMHOTSWAPON=0\": \"AT+UIMHOTSWAPON=0\"\n            },\n            {\n                \"Unlock LTE Cell Lock > AT+CCELLCFG=0\": \"AT+CCELLCFG=0\"\n            },\n            {\n                \"Unlock 5G Cell Lock > AT+C5GCELLCFG=\\\"unlock\\\"\": \"AT+C5GCELLCFG=\\\"unlock\\\"\"\n            },\n            {\n                \"Change IMEI > AT+SIMEI=imei\": \"AT+SIMEI=imei\"\n            },\n            {\n                \"Switch SIM Card Slot > Slot 1\": \"AT+SMSIMCFG=0,1\"\n            },\n            {\n                \"Switch SIM Card Slot > Slot 2\": \"AT+SMSIMCFG=0,2\"\n            },\n            {\n                \"Set Module Function > Minimum Function\": \"AT+CFUN=0\"\n            },\n            {\n                \"Set Module Function > Maximum Function\": \"AT+CFUN=1\"\n            },\n            {\n                \"Set Module Function > Offline Mode\": \"AT+CFUN=7\"\n            }\n        ]\n    }\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/at_commands_zh.json",
    "content": "{\n\t\"general\": [\n\t\t{\n\t\t\t\"模组信息 > ATI\": \"ATI\"\n\t\t},\n\t\t{\n\t\t\t\"查询SIM卡状态 > AT+CPIN?\": \"AT+CPIN?\"\n\t\t},\n\t\t{\n\t\t\t\"查询网络信号质量（4G） > AT+CSQ\": \"AT+CSQ\"\n\t\t},\n\t\t{\n\t\t\t\"查询网络信号质量（5G） > AT+CESQ\": \"AT+CESQ\"\n\t\t},\n\t\t{\n\t\t\t\"查询网络信息 > AT+COPS?\": \"AT+COPS?\"\n\t\t},\n\t\t{\n\t\t\t\"查询PDP信息 > AT+CGDCONT?\": \"AT+CGDCONT?\"\n\t\t},\n\t\t{\n\t\t\t\"查询PDP地址 > AT+CGPADDR\": \"AT+CGPADDR\"\n\t\t},\n\t\t{\n\t\t\t\"查询模组IMEI > AT+CGSN\": \"AT+CGSN\"\n\t\t},\n\t\t{\n\t\t\t\"查询模组IMEI > AT+GSN\": \"AT+GSN\"\n\t\t},\n\t\t{\n\t\t\t\"查看当前电压 > AT+CBC\": \"AT+CBC\"\n\t\t},\n\t\t{\n\t\t\t\"最小功能模式 > AT+CFUN=0\": \"AT+CFUN=0\"\n\t\t},\n\t\t{\n\t\t\t\"全功能模式 > AT+CFUN=1\": \"AT+CFUN=1\"\n\t\t},\n\t\t{\n\t\t\t\"重启模组 > AT+CFUN=1,1\": \"AT+CFUN=1,1\"\n\t\t}\n\t],\n\t\"quectel\": {\n\t\t\"qualcomm\": [\n\t\t\t{\n\t\t\t\t\"SIM卡状态上报 > AT+QSIMSTAT?\": \"AT+QSIMSTAT?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡1 > AT+QUIMSLOT=1\": \"AT+QUIMSLOT=1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡2 > AT+QUIMSLOT=2\": \"AT+QUIMSLOT=2\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询网络信息 > AT+QNWINFO\": \"AT+QNWINFO\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询载波聚合参数 > AT+QCAINFO\": \"AT+QCAINFO\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询5G信号强度（RSRP） > AT+QRSRP\": \"AT+QRSRP\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询当前拨号模式 > AT+QCFG=\\\"usbnet\\\"\": \"AT+QCFG=\\\"usbnet\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"QMI/GobiNet拨号模式 > AT+QCFG=\\\"usbnet\\\",0\": \"AT+QCFG=\\\"usbnet\\\",0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"ECM拨号模式 > AT+QCFG=\\\"usbnet\\\",1\": \"AT+QCFG=\\\"usbnet\\\",1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"MBIM拨号模式 > AT+QCFG=\\\"usbnet\\\",2\": \"AT+QCFG=\\\"usbnet\\\",2\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"RNDIS拨号模式 > AT+QCFG=\\\"usbnet\\\",3\": \"AT+QCFG=\\\"usbnet\\\",3\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"NCM拨号模式 > AT+QCFG=\\\"usbnet\\\",5\": \"AT+QCFG=\\\"usbnet\\\",5\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁4G > AT+QNWPREFCFG=\\\"mode_pref\\\",LTE\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",LTE\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁5G > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁5G NSA > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-NSA\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-NSA\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁5G SA > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-SA\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-SA\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"恢复自动搜索网络 > AT+QNWPREFCFG=\\\"mode_pref\\\",AUTO\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",AUTO\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询模组IMEI > AT+EGMR=0,7\": \"AT+EGMR=0,7\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"更改模组IMEI > AT+EGMR=1,7,\\\"IMEI\\\"\": \"AT+EGMR=1,7,\\\"在此设置IMEI\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"获取模组温度 > AT+QTEMP\": \"AT+QTEMP\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换为USB通信端口 > AT+QCFG=\\\"data_interface\\\",0,0\": \"AT+QCFG=\\\"data_interface\\\",0,0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换为PCIE通信端口 > AT+QCFG=\\\"data_interface\\\",1,0\": \"AT+QCFG=\\\"data_interface\\\",1,0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查看当前USB速率 > AT+QCFG=\\\"usbspeed\\\"\": \"AT+QCFG=\\\"usbspeed\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换为USB2.0 > AT+QCFG=\\\"usbspeed\\\",\\\"20\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"20\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换为USB3.1 Gen1（5Gbps） > AT+QCFG=\\\"usbspeed\\\",\\\"311\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"311\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换为USB3.1 Gen1（10Gbps） > AT+QCFG=\\\"usbspeed\\\",\\\"312\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"312\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"重置模组 > AT+QCFG=\\\"ResetFactory\\\"\": \"AT+QCFG=\\\"ResetFactory\\\"\"\n\t\t\t}\n\t\t],\n\t\t\"unisoc\": [\n\t\t\t{\n\t\t\t\t\"SIM卡状态上报 > AT+QSIMSTAT?\": \"AT+QSIMSTAT?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡1 > AT+QUIMSLOT=1\": \"AT+QUIMSLOT=1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡2 > AT+QUIMSLOT=2\": \"AT+QUIMSLOT=2\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询网络信息 > AT+QNWINFO\": \"AT+QNWINFO\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询载波聚合参数 > AT+QCAINFO\": \"AT+QCAINFO\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询当前拨号模式 > AT+QCFG=\\\"usbnet\\\"\": \"AT+QCFG=\\\"usbnet\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"ECM拨号模式 > AT+QCFG=\\\"usbnet\\\",1\": \"AT+QCFG=\\\"usbnet\\\",1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"MBIM拨号模式 > AT+QCFG=\\\"usbnet\\\",2\": \"AT+QCFG=\\\"usbnet\\\",2\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"RNDIS拨号模式 > AT+QCFG=\\\"usbnet\\\",3\": \"AT+QCFG=\\\"usbnet\\\",3\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"NCM拨号模式 > AT+QCFG=\\\"usbnet\\\",5\": \"AT+QCFG=\\\"usbnet\\\",5\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁4G > AT+QNWPREFCFG=\\\"mode_pref\\\",LTE\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",LTE\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁5G > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁5G NSA > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-NSA\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-NSA\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁5G SA > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-SA\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-SA\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"恢复自动搜索网络 > AT+QNWPREFCFG=\\\"mode_pref\\\",AUTO\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",AUTO\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询模组IMEI > AT+EGMR=0,7\": \"AT+EGMR=0,7\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"更改模组IMEI > AT+EGMR=1,7,\\\"IMEI\\\"\": \"AT+EGMR=1,7,\\\"在此设置IMEI\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"获取模组温度 > AT+QTEMP\": \"AT+QTEMP\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换为USB通信端口 > AT+QCFG=\\\"data_interface\\\",0,0\": \"AT+QCFG=\\\"data_interface\\\",0,0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换为PCIE通信端口 > AT+QCFG=\\\"data_interface\\\",1,0\": \"AT+QCFG=\\\"data_interface\\\",1,0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查看当前USB速率 > AT+QCFG=\\\"usbspeed\\\"\": \"AT+QCFG=\\\"usbspeed\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换为USB2.0 > AT+QCFG=\\\"usbspeed\\\",\\\"20\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"20\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换为USB3.1 Gen1（5Gbps） > AT+QCFG=\\\"usbspeed\\\",\\\"311\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"311\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换为USB3.1 Gen1（10Gbps） > AT+QCFG=\\\"usbspeed\\\",\\\"312\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"312\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"重置模组 > AT+QCFG=\\\"ResetFactory\\\"\": \"AT+QCFG=\\\"ResetFactory\\\"\"\n\t\t\t}\n\t\t],\n\t\t\"general\": [\n\t\t\t{\n\t\t\t\t\"SIM卡状态上报 > AT+QSIMSTAT?\": \"AT+QSIMSTAT?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡1 > AT+QUIMSLOT=1\": \"AT+QUIMSLOT=1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡2 > AT+QUIMSLOT=2\": \"AT+QUIMSLOT=2\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询网络信息 > AT+QNWINFO\": \"AT+QNWINFO\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询载波聚合参数 > AT+QCAINFO\": \"AT+QCAINFO\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询当前拨号模式 > AT+QCFG=\\\"usbnet\\\"\": \"AT+QCFG=\\\"usbnet\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"QMI/GobiNet拨号模式 > AT+QCFG=\\\"usbnet\\\",0\": \"AT+QCFG=\\\"usbnet\\\",0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"ECM拨号模式 > AT+QCFG=\\\"usbnet\\\",1\": \"AT+QCFG=\\\"usbnet\\\",1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"MBIM拨号模式 > AT+QCFG=\\\"usbnet\\\",2\": \"AT+QCFG=\\\"usbnet\\\",2\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"RNDIS拨号模式 > AT+QCFG=\\\"usbnet\\\",3\": \"AT+QCFG=\\\"usbnet\\\",3\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"NCM拨号模式 > AT+QCFG=\\\"usbnet\\\",5\": \"AT+QCFG=\\\"usbnet\\\",5\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁4G > AT+QNWPREFCFG=\\\"mode_pref\\\",LTE\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",LTE\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁5G > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁5G NSA > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-NSA\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-NSA\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁5G SA > AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-SA\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",NR5G-SA\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"恢复自动搜索网络 > AT+QNWPREFCFG=\\\"mode_pref\\\",AUTO\": \"AT+QNWPREFCFG=\\\"mode_pref\\\",AUTO\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询模组IMEI > AT+EGMR=0,7\": \"AT+EGMR=0,7\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"更改模组IMEI > AT+EGMR=1,7,\\\"IMEI\\\"\": \"AT+EGMR=1,7,\\\"在此设置IMEI\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"获取模组温度 > AT+QTEMP\": \"AT+QTEMP\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换为USB通信端口 > AT+QCFG=\\\"data_interface\\\",0,0\": \"AT+QCFG=\\\"data_interface\\\",0,0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换为PCIE通信端口 > AT+QCFG=\\\"data_interface\\\",1,0\": \"AT+QCFG=\\\"data_interface\\\",1,0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查看当前USB速率 > AT+QCFG=\\\"usbspeed\\\"\": \"AT+QCFG=\\\"usbspeed\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换为USB2.0 > AT+QCFG=\\\"usbspeed\\\",\\\"20\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"20\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换为USB3.1 Gen1（5Gbps） > AT+QCFG=\\\"usbspeed\\\",\\\"311\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"311\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换为USB3.1 Gen1（10Gbps） > AT+QCFG=\\\"usbspeed\\\",\\\"312\\\"\": \"AT+QCFG=\\\"usbspeed\\\",\\\"312\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"重置模组 > AT+QCFG=\\\"ResetFactory\\\"\": \"AT+QCFG=\\\"ResetFactory\\\"\"\n\t\t\t}\n\t\t]\n\t},\n\t\"fibocom\": {\n\t\t\"qualcomm\": [\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡1 > AT+GTDUALSIM=0\": \"AT+GTDUALSIM=0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡2 > AT+GTDUALSIM=1\": \"AT+GTDUALSIM=1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"ECM手动拨号 > AT+GTRNDIS=1,1\": \"AT+GTRNDIS=1,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"ECM拨号断开 > AT+GTRNDIS=0,1\": \"AT+GTRNDIS=0,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询当前端口模式 > AT+GTUSBMODE?\": \"AT+GTUSBMODE?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"QMI/GobiNet拨号模式 > AT+GTUSBMODE=32\": \"AT+GTUSBMODE=32\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"ECM拨号模式 > AT+GTUSBMODE=18\": \"AT+GTUSBMODE=18\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"MBIM拨号模式 > AT+GTUSBMODE=30\": \"AT+GTUSBMODE=30\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"RNDIS拨号模式 > AT+GTUSBMODE=24\": \"AT+GTUSBMODE=24\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"NCM拨号模式 > AT+GTUSBMODE=18\": \"AT+GTUSBMODE=18\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁4G > AT+GTACT=2\": \"AT+GTACT=2\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁5G > AT+GTACT=14\": \"AT+GTACT=14\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"恢复自动搜索网络 > AT+GTACT=20\": \"AT+GTACT=20\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询当前连接的网络类型 > AT+PSRAT?\": \"AT+PSRAT?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询模组IMEI > AT+GTSN=0,7\": \"AT+GTSN=0,7\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"更改模组IMEI > AT+GTSN=1,7,\\\"IMEI\\\"\": \"AT+GTSN=1,7,\\\"在此设置IMEI\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"报告一次当前BBIC的温度 > AT+MTSM=1,6\": \"AT+MTSM=1,6\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"报告一次当前射频的温度 > AT+MTSM=1,7\": \"AT+MTSM=1,7\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"重启模组 > AT+CFUN=15\": \"AT+CFUN=15\"\n\t\t\t}\n\t\t],\n\t\t\"unisoc\": [\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡1 > AT+GTDUALSIM=0\": \"AT+GTDUALSIM=0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡2 > AT+GTDUALSIM=1\": \"AT+GTDUALSIM=1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"ECM手动拨号 > AT+GTRNDIS=1,1\": \"AT+GTRNDIS=1,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"ECM拨号断开 > AT+GTRNDIS=0,1\": \"AT+GTRNDIS=0,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询当前端口模式 > AT+GTUSBMODE?\": \"AT+GTUSBMODE?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"ECM拨号模式 > AT+GTUSBMODE=18\": \"AT+GTUSBMODE=18\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"MBIM拨号模式 > AT+GTUSBMODE=30\": \"AT+GTUSBMODE=30\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"RNDIS拨号模式 > AT+GTUSBMODE=24\": \"AT+GTUSBMODE=24\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"NCM拨号模式 > AT+GTUSBMODE=18\": \"AT+GTUSBMODE=18\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁4G > AT+GTACT=2\": \"AT+GTACT=2\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁5G > AT+GTACT=14\": \"AT+GTACT=14\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"恢复自动搜索网络 > AT+GTACT=20\": \"AT+GTACT=20\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询当前连接的网络类型 > AT+PSRAT?\": \"AT+PSRAT?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询模组IMEI > AT+GTSN=0,7\": \"AT+GTSN=0,7\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"更改模组IMEI > AT+GTSN=1,7,\\\"IMEI\\\"\": \"AT+GTSN=1,7,\\\"在此设置IMEI\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"报告一次当前BBIC的温度 > AT+MTSM=1,6\": \"AT+MTSM=1,6\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"报告一次当前射频的温度 > AT+MTSM=1,7\": \"AT+MTSM=1,7\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"重启模组 > AT+CFUN=15\": \"AT+CFUN=15\"\n\t\t\t}\n\t\t],\n\t\t\"mediatek\": [\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡1 > AT+GTDUALSIM=0\": \"AT+GTDUALSIM=0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡2 > AT+GTDUALSIM=1\": \"AT+GTDUALSIM=1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"手动设置接入点 > AT+CGDCONT=3,\\\"IPV4V6\\\",\\\"APN\\\"\": \"AT+CGDCONT=3,\\\"IPV4V6\\\",\\\"在此设置APN\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"手动拨号 > AT+CGACT=1,3\": \"AT+CGACT=1,3\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"停止拨号 > AT+CGACT=0,3\": \"AT+CGACT=0,3\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询当前端口模式 > AT+GTUSBMODE?\": \"AT+GTUSBMODE?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"RNDIS拨号模式（40） > AT+GTUSBMODE=40\": \"AT+GTUSBMODE=40\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"RNDIS拨号模式（41） > AT+GTUSBMODE=41\": \"AT+GTUSBMODE=41\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁4G > AT+GTACT=2\": \"AT+GTACT=2\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁5G > AT+GTACT=14\": \"AT+GTACT=14\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"恢复自动搜索网络 > AT+GTACT=20\": \"AT+GTACT=20\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询当前连接的网络类型 > AT+PSRAT?\": \"AT+PSRAT?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询载波聚合小区信息 > AT+GTCAINFO?\": \"AT+GTCAINFO?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询模组IMEI > AT+GTSN=0,7\": \"AT+GTSN=0,7\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"更改模组IMEI > AT+GTSN=1,7,\\\"IMEI\\\"\": \"AT+GTSN=1,7,\\\"在此设置IMEI\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"解锁FCC > AT+GTFCCLOCKMODE=0\": \"AT+GTFCCLOCKMODE=0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"解除ESIM锁定 > AT+GTESIMCFG=0,0,0\": \"AT+GTESIMCFG=0,0,0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"解除温控 > AT+GTTHERMAL=0\": \"AT+GTTHERMAL=0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"获取当前温度 > AT+GTSENRDTEMP=0\": \"AT+GTSENRDTEMP=0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"重启模组 > AT+CFUN=15\": \"AT+CFUN=15\"\n\t\t\t}\n\t\t]\n\t},\n\t\"meig\": {\n\t\t\"qualcomm\": [\n\t\t\t{\n\t\t\t\t\"SIM卡状态上报 > AT^SIMSLOTURC=1\": \"AT^SIMSLOTURC=1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"获取SIM卡卡槽状态 > AT^SIMSLOT?\": \"AT^SIMSLOT?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡1 > AT^SIMSLOT=1\": \"AT^SIMSLOT=1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡2 > AT^SIMSLOT=2\": \"AT^SIMSLOT=2\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询网络信息 > AT^SYSINFOEX\": \"AT^SYSINFOEX\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询载波聚合小区信息 > AT^CELLINFO=1\": \"AT^CELLINFO=1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询当前拨号模式 > AT+SER?\": \"AT+SER?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"QMI/GobiNet拨号模式 > AT+SER=1,1\": \"AT+SER=1,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"ECM拨号模式 > AT+SER=2,1\": \"AT+SER=2,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"MBIM拨号模式 > AT+SER=3,1\": \"AT+SER=3,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"RNDIS拨号模式 > AT+SER=3,1\": \"AT+SER=3,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"NCM拨号模式 > AT+SER=2,1\": \"AT+SER=2,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁4G > AT^SYSCFGEX=\\\"03\\\",all,0,2,all,all,all,all,1\": \"AT^SYSCFGEX=\\\"03\\\",all,0,2,all,all,all,all,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁5G > AT^SYSCFGEX=\\\"04\\\",all,0,2,all,all,all,all,1\": \"AT^SYSCFGEX=\\\"04\\\",all,0,2,all,all,all,all,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"恢复自动搜索网络 > AT^SYSCFGEX=\\\"00\\\",all,0,2,all,all,all,all,1\": \"AT^SYSCFGEX=\\\"00\\\",all,0,2,all,all,all,all,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询模组IMEI > AT+LCTSN=0,7\": \"AT+LCTSN=0,7\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"更改模组IMEI > AT+LCTSN=1,7,\\\"IMEI\\\"\": \"AT+LCTSN=1,7,\\\"在此设置IMEI\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"获取模组温度 > AT+TEMP\": \"AT+TEMP\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"重启模组 > AT+RESET\": \"AT+RESET\"\n\t\t\t}\n\t\t],\n\t\t\"unisoc\": [\n\t\t\t{\n\t\t\t\t\"获取SIM卡卡槽状态 > AT^SIMSLOT?\": \"AT^SIMSLOT?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡1 > AT^SIMSLOT=1\": \"AT^SIMSLOT=1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡2 > AT^SIMSLOT=2\": \"AT^SIMSLOT=2\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询网络信息 > AT^SYSINFOEX\": \"AT^SYSINFOEX\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询载波聚合小区信息 > AT^CELLINFO=1\": \"AT^CELLINFO=1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询当前拨号模式 > AT+SER?\": \"AT+SER?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"ECM拨号模式 > AT+SER=2,1\": \"AT+SER=2,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"MBIM拨号模式 > AT+SER=3,1\": \"AT+SER=3,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"RNDIS拨号模式 > AT+SER=3,1\": \"AT+SER=3,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"NCM拨号模式 > AT+SER=1,1\": \"AT+SER=1,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁4G > AT^SYSCFGEX=\\\"03\\\",all,0,2,all,all,all,all,1\": \"AT^SYSCFGEX=\\\"03\\\",all,0,2,all,all,all,all,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁5G > AT^SYSCFGEX=\\\"04\\\",all,0,2,all,all,all,all,1\": \"AT^SYSCFGEX=\\\"04\\\",all,0,2,all,all,all,all,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"恢复自动搜索网络 > AT^SYSCFGEX=\\\"00\\\",all,0,2,all,all,all,all,1\": \"AT^SYSCFGEX=\\\"00\\\",all,0,2,all,all,all,all,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询模组IMEI > AT+LCTSN=0,7\": \"AT+LCTSN=0,7\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"更改模组IMEI > AT+LCTSN=1,7,\\\"IMEI\\\"\": \"AT+LCTSN=1,7,\\\"在此设置IMEI\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"开启转网口 > AT+MGCFGEX=\\\"ETH_SWITCH\\\",1\": \"AT+MGCFGEX=\\\"ETH_SWITCH\\\",1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"获取模组温度 > AT+TEMP\": \"AT+TEMP\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"重启模组 > AT+RESET\": \"AT+RESET\"\n\t\t\t}\n\t\t]\n\t},\n\t\"foxconn\": {\n\t\t\"qualcomm\": [\n\t\t\t{\n\t\t\t\t\"SIM卡状态上报 > AT^SIMSLOTURC=1\": \"AT^SIMSLOTURC=1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"获取SIM卡卡槽状态 > AT^SWITCH_SLOT?\": \"AT^SWITCH_SLOT?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡1 > at^switch_slot=0\": \"at^switch_slot=0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置当前使用的为ESIM > at^switch_slot=1\": \"at^switch_slot=1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询网络及载波信息 > AT^DEBUG?\": \"AT^DEBUG?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"获取模组温度 > AT^TEMP?\": \"AT^TEMP?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"重启模组 > AT+RESET\": \"AT+RESET\"\n\t\t\t}\n\t\t]\n\t},\n\t\"huawei\": {\n\t\t\"hisilicon\": [\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡0 > AT^SCICHG=0,1\": \"AT^SCICHG=0,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置当前使用的为卡1 > AT^SCICHG=1,0\": \"AT^SCICHG=1,0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询网络信息 > AT^SYSINFOEX\": \"AT^SYSINFOEX\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"查询当前拨号模式 > AT^SETMODE?\": \"AT^SETMODE?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"ECM拨号模式（Linux） > AT^SETMODE=0\": \"AT^SETMODE=0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"NCM拨号模式（Windows） > AT^SETMODE=1\": \"AT^SETMODE=1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"ECM拨号模式（Linux，Debug） > AT^SETMODE=2\": \"AT^SETMODE=2\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"NCM拨号模式（Windows,Debug） > AT^SETMODE=3\": \"AT^SETMODE=3\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁4G > AT^SYSCFGEX=\\\"03\\\",40000000,1,2,7FFFFFFFFFFFFFFF,,\": \"AT^SYSCFGEX=\\\"03\\\",40000000,1,2,7FFFFFFFFFFFFFFF,,\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"锁5G > AT^SYSCFGEX=\\\"08\\\",40000000,1,2,7FFFFFFFFFFFFFFF,,\": \"AT^SYSCFGEX=\\\"08\\\",40000000,1,2,7FFFFFFFFFFFFFFF,,\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"恢复自动搜索网络 > AT^SYSCFGEX=\\\"00\\\",3FFFFFFF,1,2,7FFFFFFFFFFFFFFF,,\": \"AT^SYSCFGEX=\\\"00\\\",3FFFFFFF,1,2,7FFFFFFFFFFFFFFF,,\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"获取模组温度 > AT^CHIPTEMP?\": \"AT^CHIPTEMP?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"重启模组 > AT^RESET\": \"AT^RESET\"\n\t\t\t}\n\t\t]\n\t},\n\t\"simcom\": {\n\t\t\"qualcomm\": [\n\t\t\t{\n\t\t\t\t\"查询锁频模式 > \": \"AT+CNMP?\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置锁频模式 > 自动\": \"AT+CNMP=2\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置锁频模式 > 仅限 WCDMA\": \"AT+CNMP=14\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置锁频模式 > 仅限 LTE\": \"AT+CNMP=38\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置锁频模式 > NR5G\": \"AT+CNMP=71\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置锁频模式 > WCDMA+LTE Only\": \"AT+CNMP=54\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置锁频模式 > WCDMA+LTE+NR5G\": \"AT+CNMP=55\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置锁频模式 > LTE+NR5G\": \"AT+CNMP=109\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"重置模组 > AT+CRESET\": \"AT+CRESET\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"重置模组 > AT+CFUN=6\": \"AT+CFUN=6\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"重置模组 > ATZ\": \"ATZ\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"开启显示上下行模式 > AT+CNWINFO=1\": \"AT+CNWINFO=1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"关闭显示上下行模式 > AT+CNWINFO=0\": \"AT+CNWINFO=0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换PCIE模式 > AT+CPCIEMODE=EP\": \"AT+CPCIEMODE=EP\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换USB模式 > AT+CPCIEMODE=HOST\": \"AT+CPCIEMODE=HOST\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"开启sim热插拔 > AT+UIMHOTSWAPON=1\": \"AT+UIMHOTSWAPON=1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"关闭sim热插拔 > AT+UIMHOTSWAPON=0\": \"AT+UIMHOTSWAPON=0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"解除LTE小区锁定 > AT+CCELLCFG=0\": \"AT+CCELLCFG=0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"解除5G小区锁定 > AT+C5GCELLCFG=\\\"unlock\\\"\": \"AT+C5GCELLCFG=\\\"unlock\\\"\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"更改imei > AT+SIMEI=imei\": \"AT+SIMEI=imei\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换sim卡槽 > 卡槽1\": \"AT+SMSIMCFG=0,1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"切换sim卡槽 > 卡槽2\": \"AT+SMSIMCFG=0,2\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置模块功能 > 最小功能\": \"AT+CFUN=0\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置模块功能 > 最大功能\": \"AT+CFUN=1\"\n\t\t\t},\n\t\t\t{\n\t\t\t\t\"设置模块功能 > 离线模式\": \"AT+CFUN=7\"\n\t\t\t}\n\t\t]\n\t}\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/generic.sh",
    "content": "#!/bin/sh\nSCRIPT_DIR=\"/usr/share/qmodem\"\nsource /usr/share/libubox/jshn.sh\nsource \"${SCRIPT_DIR}/modem_util.sh\"\nadd_plain_info_entry()\n{\n    key=$1\n    value=$2\n    key_full_name=$3\n    class_overwrite=$4\n    if [ -n \"$class_overwrite\" ]; then\n        class=\"$class_overwrite\"\n    fi\n    if [ -z \"$value\" ]; then\n        return\n    fi\n    json_add_object \"\"\n    json_add_string  key \"$key\"\n    json_add_string  value \"$value\"\n    json_add_string \"full_name\" \"$key_full_name\"\n    json_add_string \"type\" \"plain_text\"\n    if [ -n \"$class\" ]; then\n        json_add_string \"class\" \"$class\"\n        json_add_string \"class_origin\" \"$class\"\n    fi\n    if [ -n \"$extra_info\" ]; then\n        json_add_string \"extra_info\" \"$extra_info\"\n    fi\n    json_close_object\n}\n\nadd_warning_message_entry()\n{\n    key=$1\n    value=$2\n    key_full_name=$3\n    class_overwrite=$4\n    if [ -n \"$class_overwrite\" ]; then\n        class=\"$class_overwrite\"\n    fi\n    if [ -z \"$value\" ]; then\n        return\n    fi\n    json_add_object \"\"\n    json_add_string  key \"$key\"\n    json_add_string  value \"$value\"\n    json_add_string \"full_name\" \"$key_full_name\"\n    json_add_string \"type\" \"warning_message\"\n    json_add_string \"class\" \"warning\"\n    json_add_string \"class_origin\" \"warning\"\n    if [ -n \"$extra_info\" ]; then\n        json_add_string \"extra_info\" \"$extra_info\"\n    fi\n    json_close_object\n}\n\nadd_bar_info_entry()\n{\n    key=$1\n    value=$2\n    key_full_name=$3\n    min_value=$4\n    max_value=$5\n    unit=$6\n    class_overwrite=$7\n    if [ -n \"$class_overwrite\" ]; then\n        class=\"$class_overwrite\"\n    fi\n    if [ -z \"$value\" ]; then\n        return\n    fi\n    json_add_object \"\"\n    json_add_string  key \"$key\"\n    json_add_string  value \"$value\"\n    json_add_string  min_value \"$min_value\"\n    json_add_string  max_value \"$max_value\"\n    json_add_string \"full_name\" \"$key_full_name\"\n    json_add_string \"unit\" \"$unit\"\n    json_add_string \"type\" \"progress_bar\"\n    if [ -n \"$class\" ]; then\n        json_add_string \"class\" \"$class\"\n        json_add_string \"class_origin\" \"$class\"\n    fi\n    if [ -n \"$extra_info\" ]; then\n        json_add_string \"extra_info\" \"$extra_info\"\n    fi\n    json_close_object\n}\n\nadd_speed_entry()\n{\n    rate=$1\n    type=$2\n    if [ -z \"$rate\" ]; then\n        return\n    fi\n    rate=`rate_convert $rate`\n    case $type in\n        \"rx\")\n            add_plain_info_entry \"Rx Rate\" \"$rate\" \"Transmit Rate\"\n            ;;\n        \"tx\")\n            add_plain_info_entry \"Tx Rate\" \"$rate\" \"Receive Rate\"\n            ;;\n        *)\n            return\n            ;;\n    esac\n\n}\n\nadd_avalible_band_entry()\n{\n    band_id=$1\n    band_name=$2\n    if [ -z \"$band_id\" ] || [ -z \"$band_name\" ]; then\n        return\n    fi\n    json_add_object \"\"\n    json_add_string  band_id \"$band_id\"\n    json_add_string  band_name \"$band_name\"\n    json_add_string \"type\" \"avalible_band\"\n    json_close_object\n}\n\n# Helper function for 3G cell info\n# Usage: set_3g_cell_info mcc mnc lac cell_id uarfcn psc band ul_bw dl_bw rscp rsrq ecio rxlev rac\nset_3g_cell_info() {\n    local mcc=\"$1\"\n    local mnc=\"$2\"\n    local lac=\"$3\"\n    local cell_id=\"$4\"\n    local uarfcn=\"$5\"\n    local psc=\"$6\"\n    local band=\"$7\"\n    local ul_bw=\"$8\"\n    local dl_bw=\"$9\"\n    local rscp=\"${10}\"\n    local rsrq=\"${11}\"\n    local ecio=\"${12}\"\n    local rxlev=\"${13}\"\n    local rac=\"${14}\"\n    \n    add_plain_info_entry \"MCC\" \"$mcc\" \"Mobile Country Code\"\n    add_plain_info_entry \"MNC\" \"$mnc\" \"Mobile Network Code\"\n    add_plain_info_entry \"LAC\" \"$lac\" \"Location Area Code\"\n    add_plain_info_entry \"Cell ID\" \"$cell_id\" \"Cell ID\"\n    add_plain_info_entry \"UARFCN\" \"$uarfcn\" \"UTRA Absolute Radio Frequency Channel Number\"\n    add_plain_info_entry \"PSC\" \"$psc\" \"Primary Scrambling Code\"\n    add_plain_info_entry \"Band\" \"$band\" \"Band\"\n    add_plain_info_entry \"UL Bandwidth\" \"$ul_bw\" \"UL Bandwidth\"\n    add_plain_info_entry \"DL Bandwidth\" \"$dl_bw\" \"DL Bandwidth\"\n    add_bar_info_entry \"RSCP\" \"$rscp\" \"Received Signal Code Power\" -120 -25 dBm\n    add_bar_info_entry \"RSRQ\" \"$rsrq\" \"Reference Signal Received Quality\" -19.5 -3 dB\n    add_plain_info_entry \"Ec/Io\" \"$ecio\" \"Ec/Io\"\n    add_bar_info_entry \"RxLev\" \"$rxlev\" \"Received Signal Level\" -120 -25 dBm\n    add_plain_info_entry \"RAC\" \"$rac\" \"Routing Area Code\"\n    \n    unset extra_info\n}\n\n# Helper function for 4G cell info\n# Usage: set_4g_cell_info mcc mnc tac cell_id earfcn pci band ul_bw dl_bw rsrp rsrq sinr rssnr rxlev\nset_4g_cell_info() {\n    local mcc=\"$1\"\n    local mnc=\"$2\"\n    local tac=\"$3\"\n    local cell_id=\"$4\"\n    local earfcn=\"$5\"\n    local pci=\"$6\"\n    local band=\"$7\"\n    local ul_bw=\"$8\"\n    local dl_bw=\"$9\"\n    local rsrp=\"${10}\"\n    local rsrq=\"${11}\"\n    local sinr=\"${12}\"\n    local rssnr=\"${13}\"\n    local rxlev=\"${14}\"\n    \n    add_plain_info_entry \"MCC\" \"$mcc\" \"Mobile Country Code\"\n    add_plain_info_entry \"MNC\" \"$mnc\" \"Mobile Network Code\"\n    add_plain_info_entry \"TAC\" \"$tac\" \"Tracking Area Code\"\n    add_plain_info_entry \"Cell ID\" \"$cell_id\" \"Cell ID\"\n    add_plain_info_entry \"Physical Cell ID\" \"$pci\" \"Physical Cell ID\"\n    add_plain_info_entry \"EARFCN\" \"$earfcn\" \"E-UTRA Absolute Radio Frequency Channel Number\"\n    add_plain_info_entry \"Band\" \"$band\" \"Band\"\n    add_plain_info_entry \"UL Bandwidth\" \"$ul_bw\" \"UL Bandwidth\"\n    add_plain_info_entry \"DL Bandwidth\" \"$dl_bw\" \"DL Bandwidth\"\n    add_bar_info_entry \"RSRP\" \"$rsrp\" \"Reference Signal Received Power\" -140 -44 dBm\n    add_bar_info_entry \"RSRQ\" \"$rsrq\" \"Reference Signal Received Quality\" -19.5 -3 dB\n    add_bar_info_entry \"SINR\" \"$sinr\" \"Signal to Interference plus Noise Ratio\" 0 30 dB\n    add_plain_info_entry \"RSSNR\" \"$rssnr\" \"Radio Signal Strength Noise Ratio\"\n    add_bar_info_entry \"RxLev\" \"$rxlev\" \"Received Signal Level\" -120 -25 dBm\n    \n    unset extra_info\n}\n\n# Helper function for 5G cell info\n# Usage: set_5g_cell_info mcc mnc tac cell_id arfcn pci band ul_bw dl_bw rsrp rsrq sinr rssnr rxlev\nset_5g_cell_info() {\n    local mcc=\"$1\"\n    local mnc=\"$2\"\n    local tac=\"$3\"\n    local cell_id=\"$4\"\n    local arfcn=\"$5\"\n    local pci=\"$6\"\n    local band=\"$7\"\n    local ul_bw=\"$8\"\n    local dl_bw=\"$9\"\n    local rsrp=\"${10}\"\n    local rsrq=\"${11}\"\n    local sinr=\"${12}\"\n    local rssnr=\"${13}\"\n    local rxlev=\"${14}\"\n    \n    add_plain_info_entry \"MCC\" \"$mcc\" \"Mobile Country Code\"\n    add_plain_info_entry \"MNC\" \"$mnc\" \"Mobile Network Code\"\n    add_plain_info_entry \"TAC\" \"$tac\" \"Tracking Area Code\"\n    add_plain_info_entry \"Cell ID\" \"$cell_id\" \"Cell ID\"\n    add_plain_info_entry \"Physical Cell ID\" \"$pci\" \"Physical Cell ID\"\n    add_plain_info_entry \"ARFCN\" \"$arfcn\" \"Absolute Radio-Frequency Channel Number\"\n    add_plain_info_entry \"Band\" \"$band\" \"Band\"\n    add_plain_info_entry \"UL Bandwidth\" \"$ul_bw\" \"UL Bandwidth\"\n    add_plain_info_entry \"DL Bandwidth\" \"$dl_bw\" \"DL Bandwidth\"\n    add_bar_info_entry \"RSRP\" \"$rsrp\" \"Reference Signal Received Power\" -140 -44 dBm\n    add_bar_info_entry \"RSRQ\" \"$rsrq\" \"Reference Signal Received Quality\" -19.5 -3 dB\n    add_bar_info_entry \"SINR\" \"$sinr\" \"Signal to Interference plus Noise Ratio\" 0 30 dB\n    add_plain_info_entry \"RSSNR\" \"$rssnr\" \"Radio Signal Strength Noise Ratio\"\n    add_bar_info_entry \"RxLev\" \"$rxlev\" \"Received Signal Level\" -120 -25 dBm\n    \n    unset extra_info\n}\n\n# Helper function to add CA (Carrier Aggregation) info\n# Usage: add_ca_info rat ca_arfcn ca_pci ca_band ca_ul_bw ca_dl_bw\n# rat should be \"4G\" or \"5G\"\nadd_ca_info() {\n    local rat=\"$1\"\n    local ca_arfcn=\"$2\"\n    local ca_pci=\"$3\"\n    local ca_band=\"$4\"\n    local ca_ul_bw=\"$5\"\n    local ca_dl_bw=\"$6\"\n    \n    [ -z \"$ca_arfcn\" ] && [ -z \"$ca_pci\" ] && [ -z \"$ca_band\" ] && return\n    \n    case \"$rat\" in\n        \"4G\")\n            extra_info=\"CA-LTE\"\n            local arfcn_label=\"EARFCN (CA)\"\n            ;;\n        \"5G\")\n            extra_info=\"CA-NR\"\n            local arfcn_label=\"ARFCN (CA)\"\n            ;;\n        *)\n            return\n            ;;\n    esac\n    \n    add_plain_info_entry \"Physical Cell ID (CA)\" \"$ca_pci\" \"Physical Cell ID (CA)\"\n    add_plain_info_entry \"$arfcn_label\" \"$ca_arfcn\" \"$arfcn_label\"\n    add_plain_info_entry \"Band (CA)\" \"$ca_band\" \"Band (CA)\"\n    add_plain_info_entry \"UL Bandwidth (CA)\" \"$ca_ul_bw\" \"UL Bandwidth (CA)\"\n    add_plain_info_entry \"DL Bandwidth (CA)\" \"$ca_dl_bw\" \"DL Bandwidth (CA)\"\n    \n    unset extra_info\n}\n\nget_driver()\n{\n    for i in $(find $modem_path -name driver);do\n        lsfile=$(ls -l $i)\n        type=${lsfile:0:1}\n        if [ \"$type\" == \"l\" ];then\n            link=$(basename $(ls -l $i | awk '{print $11}'))\n            case $link in\n                \"mtk_t7xx\")\n                    mode=\"mtk_pcie\"\n                    break\n                    ;;\n                \"qmi_wwan\"*) \n                    mode=\"qmi\"\n                    break\n                ;;\n                \"cdc_mbim\")\n                    mode=\"mbim\"\n                    break\n                    ;;\n                \"cdc_ncm\")\n                    mode=\"ncm\"\n                    break\n                    ;;\n                \"cdc_ether\")\n                    mode=\"ecm\"\n                    break\n                    ;;\n                \"rndis_host\")\n                    mode=\"rndis\"\n                    break\n                    ;;\n                \"mhi_netdev\")\n                    mode=\"mhi\"\n                    break\n                    ;;\n                *)\n                    if [ -z \"$mode\" ]; then\n                        mode=\"unknown\"\n                    fi\n                ;;\n            esac\n        fi\n    done\n    echo $mode\n}\n\nget_dns()\n{\n    [ -z \"$pdp_index\" ] && {\n        pdp_index=\"1\"\n    }\n\n    local public_dns1_ipv4=\"223.5.5.5\"\n    local public_dns2_ipv4=\"119.29.29.29\"\n    local public_dns1_ipv6=\"2400:3200::1\" #下一代互联网北京研究中心：240C::6666，阿里：2400:3200::1，腾讯：2402:4e00::\n    local public_dns2_ipv6=\"2402:4e00::\"\n\n    #获取DNS地址\n    at_command=\"AT+GTDNS=${pdp_index}\"\n    local response=$(at ${at_port} ${at_command} | grep \"+GTDNS: \")\n\n    local ipv4_dns1=$(echo \"${response}\" | awk -F'\"' '{print $2}' | awk -F',' '{print $1}')\n    [ -z \"$ipv4_dns1\" ] && {\n        ipv4_dns1=\"${public_dns1_ipv4}\"\n    }\n\n    local ipv4_dns2=$(echo \"${response}\" | awk -F'\"' '{print $4}' | awk -F',' '{print $1}')\n    [ -z \"$ipv4_dns2\" ] && {\n        ipv4_dns2=\"${public_dns2_ipv4}\"\n    }\n\n    local ipv6_dns1=$(echo \"${response}\" | awk -F'\"' '{print $2}' | awk -F',' '{print $2}')\n    [ -z \"$ipv6_dns1\" ] && {\n        ipv6_dns1=\"${public_dns1_ipv6}\"\n    }\n\n    local ipv6_dns2=$(echo \"${response}\" | awk -F'\"' '{print $4}' | awk -F',' '{print $2}')\n    [ -z \"$ipv6_dns2\" ] && {\n        ipv6_dns2=\"${public_dns2_ipv6}\"\n    }\n    json_add_object \"dns\"\n    json_add_string \"ipv4_dns1\" \"$ipv4_dns1\"\n    json_add_string \"ipv4_dns2\" \"$ipv4_dns2\"\n    json_add_string \"ipv6_dns1\" \"$ipv6_dns1\"\n    json_add_string \"ipv6_dns2\" \"$ipv6_dns2\"\n    json_close_object\n}\n\nget_sim_status()\n{\n    local sim_status\n    case $1 in\n        \"\") \n            sim_status=\"miss\"\n            sim_state_code=0\n            ;;\n        *\"ERROR\"*) \n            sim_status=\"miss\"\n            sim_state_code=0\n            ;;\n        *\"READY\"*) \n            sim_status=\"ready\" \n            sim_state_code=1\n            ;;\n        *\"SIM PIN\"*) \n            sim_status=\"MT is waiting SIM PIN to be given\"\n            sim_state_code=2\n             ;;\n        *\"SIM PUK\"*) \n            sim_status=\"MT is waiting SIM PUK to be given\"\n            sim_state_code=3\n            ;;\n        *\"PH-FSIM PIN\"*)\n            sim_status=\"MT is waiting phone-to-SIM card password to be given\"\n            sim_state_code=4\n            ;;\n        *\"PH-FSIM PIN\"*) \n            sim_status=\"MT is waiting phone-to-very first SIM card password to be given\"\n            sim_state_code=5\n            ;;\n        *\"PH-FSIM PUK\"*) \n            sim_status=\"MT is waiting phone-to-very first SIM card unblocking password to be given\"\n            sim_state_code=6\n            ;;\n        *\"SIM PIN2\"*) \n            sim_status=\"MT is waiting SIM PIN2 to be given\"\n            sim_state_code=7\n            ;;\n        *\"SIM PUK2\"*) \n            sim_status=\"MT is waiting SIM PUK2 to be given\" \n            sim_state_code=8\n            ;;\n        *\"PH-NET PIN\"*) \n            sim_status=\"MT is waiting network personalization password to be given\" \n            sim_state_code=9\n            ;;\n        *\"PH-NET PUK\"*) \n            sim_status=\"MT is waiting network personalization unblocking password to be given\" \n            sim_state_code=10\n            ;;\n        *\"PH-NETSUB PIN\"*) \n            sim_status=\"MT is waiting network subset personalization password to be given\" \n            sim_state_code=11\n            ;;\n        *\"PH-NETSUB PUK\"*) \n            sim_status=\"MT is waiting network subset personalization unblocking password to be given\" \n            sim_state_code=12\n            ;;\n        *\"PH-SP PIN\"*) \n            sim_status=\"MT is waiting service provider personalization password to be given\" \n            sim_state_code=13\n            ;;\n        *\"PH-SP PUK\"*)\n            sim_status=\"MT is waiting service provider personalization unblocking password to be given\"\n            sim_state_code=14\n            ;;\n        *\"PH-CORP PIN\"*) \n            sim_status=\"MT is waiting corporate personalization password to be given\" \n            sim_state_code=16\n            ;;\n\n        *\"PH-CORP PUK\"*) \n            sim_status=\"MT is waiting corporate personalization unblocking password to be given\" \n            sim_state_code=17\n            ;;\n        *) \n            sim_status=\"unknown\" \n            sim_state_code=99\n            ;;\n    esac\n    echo \"$sim_status\"\n}\n\n#获取信号强度指示\n# $1:信号强度指示数字\nget_rssi()\n{\n    local rssi\n    case $1 in\n\t\t\"99\") rssi=\"unknown\" ;;\n\t\t* )  rssi=$((2 * $1 - 113)) ;;\n\tesac\n    echo \"$rssi\"\n}\n\n#获取网络类型\n# $1:网络类型数字\nget_rat()\n{\n    local rat\n    case $1 in\n\t\t\"0\"|\"1\"|\"3\"|\"8\") rat=\"GSM\" ;;\n\t\t\"2\"|\"4\"|\"5\"|\"6\"|\"9\"|\"10\") rat=\"WCDMA\" ;;\n        \"7\") rat=\"LTE\" ;;\n        \"11\"|\"12\") rat=\"NR\" ;;\n        \"13\") rat=\"LTE-NR\" ;;\n\tesac\n    echo \"${rat}\"\n}\n\n#获取连接状态\n#return raw data\nget_connect_status()\n{\n    connect_status=\"No\"\n    driver=$(get_driver)\n    if [ \"$driver\" = \"mtk_pcie\" ]; then\n        mbim_port=$(echo \"$at_port\" | sed 's/at/mbim/g')\n        local config=$(umbim -d $mbim_port config)\n        local ipv4=$(echo \"$config\" | grep \"ipv4address:\" | awk '{print $2}' | cut -d'/' -f1)\n        local ipv6=$(echo \"$config\" | grep \"ipv6address:\" | awk '{print $2}' | cut -d'/' -f1)\n\n        disallow_ipv4=\"0.0.0.0\"\n        if [ -n \"$ipv4\" ] && [ \"$ipv4\" != \"$disallow_ipv4\" ] || [ -n \"$ipv6\" ] && [ \"$ipv6\" != \"::\" ]; then\n            connect_status=\"Yes\"\n        fi\n    else\n        at_cmd=\"AT+CGACT?\"\n        expect=\"+CGACT:\"\n        result=`at  $at_port $at_cmd | grep $expect|tr '\\r' '\\n'`\n        # for fm350 pdp_index 0, GGACT will return empty,so we need to add it manually\n        if [ -z \"$result\" ]; then\n            case $vendor in\n                \"fibocom\")\n                    case $platform in\n                        \"mediatek\")\n                            result=\"+CGACT: 0,1\"\n                            ;;\n                    esac\n                    ;;\n                esac\n        fi\n        \n        for pdp_index in `echo  \"$result\" | tr -d \"\\r\" | awk -F'[,:]' '$3 == 1 {print $2}'`; do\n            at_cmd=\"AT+CGPADDR=%s\"\n            at_cmd=$(printf \"$at_cmd\" \"$pdp_index\")\n            expect=\"+CGPADDR:\"\n\n            result=$(at  $at_port $at_cmd | grep $expect)\n            if [ -n \"$result\" ];then\n                ipv6=$(echo $result | grep -oE \"\\b([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}\\b\")\n                ipv4=$(echo $result | grep -oE \"\\b([0-9]{1,3}\\.){3}[0-9]{1,3}\\b\")\n                disallow_ipv4=\"0.0.0.0\"\n                #remove the disallow ip\n                if [ \"$ipv4\" == \"$disallow_ipv4\" ];then\n                    ipv4=\"\"\n                fi\n            fi\n            if [ -n \"$ipv4\" ] || [ -n \"$ipv6\" ];then\n                connect_status=\"Yes\"\n                break\n            else\n                connect_status=\"No\"\n            fi\n        done\n    fi\n    add_plain_info_entry \"connect_status\" \"$connect_status\" \"Connect Status\"\n}\n\n#获取移远模组信息\n# $1:AT串口\n# $2:平台\n# $3:连接定义\nget_info()\n{\n    #基本信息\n    base_info\n\n\t#SIM卡信息\n    sim_info\n    if [ \"$sim_status\" != \"ready\" ]; then\n        [ -n \"$sim_status\" ] && add_warning_message_entry \"sim_status\" \"$sim_status\" \"SIM Error,Error code:\" \"warning\"\n        [ -z \"$sim_status\" ] && add_warning_message_entry \"sim_status\" \"\" \"Modem Offline\" \"warning\"\n        return\n    fi\n\n    #网络信息\n    network_info\n    if [ \"$connect_status\" != \"Yes\" ]; then\n        return\n    fi\n\n    #小区信息\n    cell_info\n\n    return\n\n}\n\nsoft_reboot()\n{\n    at_command=\"AT+CFUN=1,1\"\n    at $at_port $at_command\n}\n\nhard_reboot()\n{\n    #get power_gpio_pin\n    source /lib/functions.sh\n    config_load qmodem\n    config_foreach get_gpio_by_slot modem-slot\n    gpio=\"/sys/class/gpio/$gpio/value\"\n    [ ! -f \"$gpio\" ] || [ -z \"$gpio_up\" ] || [ -z \"$gpio_down\" ] && {\n        soft_reboot\n        m_debug \"gpio not found, failback to soft reboot\"\n        return\n    }\n    echo $gpio_down > $gpio\n    sleep 1\n    echo $gpio_up > $gpio\n    \n}\n\nget_gpio_by_slot()\n{\n    local cfg=\"$1\"\n    config_get slot \"$cfg\" slot\n    if [ \"$modem_slot\" = \"$slot\" ];then\n        config_get gpio \"$cfg\" gpio\n        config_get gpio_up \"$cfg\" gpio_up\n        config_get gpio_down \"$cfg\" gpio_down\n    fi\n}\n\nget_reboot_caps()\n{\n    source /lib/functions.sh\n    config_load qmodem\n    config_foreach get_gpio_by_slot modem-slot\n    json_init\n    json_add_object \"reboot_caps\"\n    json_add_int \"soft_reboot_caps\" \"1\"\n    if [ -n \"$gpio\" ] && [ -n \"$gpio_up\" ] && [ -n \"$gpio_down\" ];then\n         json_add_int \"hard_reboot_caps\" \"1\" \n    else\n        json_add_int \"hard_reboot_caps\" \"0\"\n    fi\n    json_close_object\n    json_dump\n}\n\nrate_convert()\n{\n    #check if bc is installed\n    is_bc_installed=$(which bc)\n    local rate=$1\n    rate_units=\"bps Kbps Mbps Gbps\"\n    if [ -z \"$is_bc_installed\" ]; then\n        for i in $(seq 0 3); do\n            if [ $rate -lt 1024 ]; then\n                break\n            fi\n            rate=$(($rate / 1024))\n        done\n    else\n        for i in $(seq 0 3); do\n            if [ $(echo \"$rate < 1024\" | bc) -eq 1 ]; then\n                break\n            fi\n            rate=$(echo \"scale=2; $rate / 1024\" | bc)\n        done\n    fi\n    echo \"$rate `echo $rate_units | cut -d ' ' -f $(($i+1))`\"\n}\n\nget_modem_disabled_features()\n{\n    . /lib/functions.sh\n    config_load qmodem \n    config_list_foreach $config_section disabled_features _add_disabled_features\n}\n\nget_sms_capabilities() {\n    local res sms_cap\n    res=$(at $at_port \"AT+CPMS?\" | grep \"CPMS:\" | xargs)\n    [ -z \"$res\" ] && return\n\n    sms_cap=${res##*+CPMS:}\n    set -- $(echo \"$sms_cap\" | tr ',' ' ')\n    local mem1=$1 used1=$2 total1=$3\n    local mem2=$4 used2=$5 total2=$6\n    local mem3=$7 used3=$8 total3=$9\n\n    json_add_object \"sms_capabilities\"\n    json_add_string \"mem1\" \"$mem1\"\n    json_add_string \"mem2\" \"$mem2\"\n    json_add_string \"mem3\" \"$mem3\"\n    json_add_object \"ME\"\n    json_close_object\n    json_add_object \"SM\"\n    json_close_object\n\n    for idx in 1 2 3; do\n        eval \"mem=\\$mem$idx\"\n        eval \"used=\\$used$idx\"\n        eval \"total=\\$total$idx\"\n\n        case \"$mem\" in\n            \"SM\")\n                json_select \"SM\"\n                ;;\n            \"MT\"|\"ME\")\n                json_select \"ME\"\n                ;;\n            *)\n                continue\n                ;;\n        esac\n\n        json_add_string \"used\" \"$used\"\n        json_add_string \"total\" \"$total\"\n        json_close_object\n    done\n}\n\nset_sms_storage()\n{\n    mem1=$(echo $1 | jq -r '.mem1')\n    mem2=$(echo $1 | jq -r '.mem2')\n    mem3=$(echo $1 | jq -r '.mem3')\n    json_add_string \"raw\" \"$1\"\n    if [ -z \"$mem1\" ] || [ -z \"$mem2\" ]; then\n        return\n    fi\n    if [ \"$mem3\" == \"Loading\" ];then\n        res=$(at $at_port \"AT+CPMS=\\\"$mem1\\\",\\\"$mem2\\\"\")\n    else\n        res=$(at $at_port \"AT+CPMS=\\\"$mem1\\\",\\\"$mem2\\\",\\\"$mem3\\\"\")\n    fi\n    \n    json_select \"result\"\n    json_add_string \"result\" \"$res\"\n}\n\nget_sim_switch_capabilities(){\n    json_add_string \"supportSwitch\" \"0\"\n}\n\nget_usage_stats()\n{\n    json_add_boolean \"available\" 0\n    json_add_int \"updated_at\" 0\n    json_add_int \"total_rx_bytes\" 0\n    json_add_int \"total_tx_bytes\" 0\n}\n\nwrite_usage_stats()\n{\n    return 1\n}\n\nclear_usage_stats()\n{\n    json_add_boolean \"result\" 0\n}\n\nget_global_disabled_features()\n{\n    . /lib/functions.sh\n    config_load qmodem \n    config_list_foreach main disabled_features _add_disabled_features\n}\n\n_add_disabled_features()\n{\n    json_add_string \"\" \"$1\"\n}\n\n_copyright()\n{\n    json_add_object \"copyright\"\n    json_add_string \"Vendor\" \"${_Vendor}\"\n    json_add_string \"Author\" \"${_Author}\"\n    json_add_string \"Maintainer\" \"${_Maintainer}\"\n    json_close_object\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/led_scripts/c2000_max.sh",
    "content": "#!/bin/sh\n# Copyright (C) 2026 x-shark\n_Vendor=\"nradio c2000-max\"\n_Author=\"x-shark\"\n_Maintainer=\"x-shark <unknown>\"\n# envs\n# led names\n# LED_4G_POOR=\"red:4g\"\n# LED_4G_GOOD=\"blue:4g\"\n# LED_5G_POOR=\"red:5g\"\n# LED_5G_GOOD=\"blue:5g\"\n# LED_INTERNET_BLUE=\"blue:internet\"\n# LED_INTERNET_RED=\"red:internet\"\n# modem_cfg\n# MODEM_CFG / AT_PORT / NET_DEV / USE_UBUS_DAEMON\n\n. /usr/share/qmodem/modem_util.sh\n. /lib/functions.sh\nLED_SIG1=\"hc:blue:sig1\"\nLED_SIG2=\"hc:blue:sig2\"\nLED_SIG3=\"hc:blue:sig3\"\nLED_STATUS=\"hc:blue:status\"\nLED_ERROR=\"hc:red:error\"\nMODEM_CFG=$1\nON_OFF=$2\n\nupdate_cfg(){\n\tconfig_load qmodem\n\tconfig_get AT_PORT \"$MODEM_CFG\" at_port\n\tconfig_get ALIAS \"$MODEM_CFG\" alias\n\tconfig_get USE_UBUS \"$MODEM_CFG\" use_ubus\n\t[ \"$USE_UBUS\" = \"1\" ] && use_ubus_flag=\"-u\"\n}\n\nupdate_netdev(){\n\t# if alias is set, network config name is alias else modem_cfg name\n\tconfig_load network\n\tif [ -n \"$ALIAS\" ]; then\n\t\tconfig_get NET_DEV \"$ALIAS\" ifname\n\telse\n\t\tconfig_get NET_DEV \"$MODEM_CFG\" ifname\n\tfi\n}\nlast_siminserted=\"\"\nlast_netstat=\"\"\npoll_counter=0\n\nled_turn() {\n\tlocal path=\"/sys/class/leds/$1\"\n\tlocal value=\"$2\"\n\tmax_brightness=$(cat \"$path/max_brightness\")\n\tif [ \"$value\" = \"1\" ]; then\n\t\tbrightness=$max_brightness\n\telse\n\t\tbrightness=\"0\"\n\tfi\n\techo \"$brightness\" > \"$path/brightness\"\n}\n\nled_heartbeat() {\n\tlocal path=\"/sys/class/leds/$1\"\n\tmax_brightness=$(cat \"$path/max_brightness\")\n\n\techo \"$max_brightness\" > \"$path/brightness\"\n\techo \"heartbeat\" > \"$path/trigger\"\n}\n\nled_netdev() {\n\tlocal path=\"/sys/class/leds/$1\"\n\tlocal device=\"$2\"\n\n\techo \"1\" > \"$path/brightness\"\n\techo \"netdev\" > \"$path/trigger\"\n\techo \"$device\" > \"$path/device_name\"\n\techo \"1\" > \"$path/link\"\n\techo \"1\" > \"$path/rx\"\n\techo \"1\" > \"$path/tx\"\n}\n\nled_off_all() {\n\tled_turn \"${LED_SIG1}\" \"0\"\n\tled_turn \"${LED_SIG2}\" \"0\"\n\tled_turn \"${LED_SIG3}\" \"0\"\n}\n\nsim_inserted() {\n\tsim_status=$(ubus call qmodem sim_info \"{\\\"config_section\\\":\\\"$MODEM_CFG\\\"}\" | jq -r '.modem_info[] | select(.key==\"SIM Status\") | .value')\n\tif [ \"$sim_status\" = \"ready\" ]; then\n\t\techo \"1\"\n\telse\n\t\techo \"0\"\n\tfi\n}\n\ninternet_led() {\n\tif wget-ssl --spider --quiet --tries=1 --timeout=3 www.baidu.com; then\n\t\tled_turn \"${LED_STATUS}\" \"1\"\n\t\tled_turn \"${LED_ERROR}\" \"0\"\n\telse\n\t\tled_turn \"${LED_STATUS}\" \"0\"\n\t\tled_turn \"${LED_ERROR}\" \"1\"\n\tfi\n}\n\nget_mode() {\n\tlocal network_mode=$(ubus call qmodem cell_info \"{\\\"config_section\\\":\\\"$MODEM_CFG\\\"}\" | jq -r '.modem_info[] | select(.key==\"network_mode\") | .value')\n\tif [[ \"$network_mode\" == *\"5G\"* ]] || [[ \"$network_mode\" == *\"NR\"* ]]; then\n\t\techo \"1\"\n\telse\n\t\techo \"0\"\n\tfi\n}\n\nget_rsrq() {\n\trsrq=$(ubus call qmodem cell_info \"{\\\"config_section\\\":\\\"$MODEM_CFG\\\"}\" | jq -r '.modem_info[] | select(.key==\"RSRQ\") | .value')\n\t# if rsrq is empty or null, return -1 to indicate no signal\n\tif [ -z \"$rsrq\" ] || [ \"$rsrq\" = \"null\" ]; then\n\t\techo \"-1\"\n\t\treturn\n\tfi\n\t# if rsrq out of range, return -1\n\tif [ \"$rsrq\" -gt \"20\" ] || [ \"$rsrq\" -lt \"-43\" ]; then\n\t\techo \"-1\"\n\telse\n\t\techo \"$rsrq\"\n\tfi\n}\n\nmain() {\n\tlocal siminserted=\"$(sim_inserted)\"\n\tif [ \"$siminserted\" = \"0\" ] && [ \"$siminserted\" = \"$last_siminserted\" ]; then\n\t\t# there's no update, return\n\t\treturn\n\tfi\n\n\tlast_siminserted=\"$siminserted\"\n\n\tif [ \"$siminserted\" = \"0\" ]; then\n\t\tled_off_all\n\t\tled_turn \"${LED_ERROR}\" \"1\"\n\n\t\tlast_netstat=\"\"\n\t\treturn\n\tfi\n\n\tlocal is_nr=$(get_mode)\n\tlocal rsrq=$(get_rsrq)\n\tlocal signal=\"0\"\n\t\n\t# 根据RSRQ信号质量划分三档\n\t# RSRQ >= -12 dBm: 高信号\n\t# -19 dBm <= RSRQ < -12 dBm: 中信号\n\t# RSRQ < -19 dBm: 低信号\n\tif [ \"$rsrq\" = \"-1\" ]; then\n\t\tsignal=\"-1\"\n\telif [ \"$rsrq\" -ge \"-12\" ]; then\n\t\tsignal=\"2\"\n\telif [ \"$rsrq\" -ge \"-19\" ]; then\n\t\tsignal=\"1\"\n\telse\n\t\tsignal=\"0\"\n\tfi\n\t\n\tnetstat=\"${NET_DEV}_${is_nr}_${signal}\"\n\t\n\t# 非轮询模式才检查是否有更新\n\tif [ \"$signal\" != \"-1\" ] && [ \"$netstat\" = \"$last_netstat\" ]; then\n\t\t# there's no update, return\n\t\treturn\n\tfi\n\tlast_netstat=\"$netstat\"\n\n\tcase \"$signal\" in\n\t\"0\")\n\t\tled_off_all\n\t\tled_turn \"${LED_SIG3}\" \"1\"\n\t\t;;\n\t\"1\")\n\t\tled_off_all\n\t\tled_turn \"${LED_SIG2}\" \"1\"\n\t\t;;\n\t\"2\")\n\t\tled_off_all\n\t\tled_turn \"${LED_SIG1}\" \"1\"\n\t\t;;\n\tesac\n}\n\npolling_display() {\n\tlocal count=$1\n\tled_off_all\n\tcase $((poll_counter % 3)) in\n\t\t\"0\")\n\t\t\tled_turn \"${LED_SIG1}\" \"1\"\n\t\t\t;;\n\t\t\"1\")\n\t\t\tled_turn \"${LED_SIG2}\" \"1\"\n\t\t\t;;\n\t\t\"2\")\n\t\t\tled_turn \"${LED_SIG3}\" \"1\"\n\t\t\t;;\n\tesac\n\tpoll_counter=$((poll_counter + 1))\n}\n\n# Loop forever\nupdate_cfg\nif [ \"$ON_OFF\" = \"off\" ]; then\n\tled_off_all\n\texit 0\nfi\nwhile true; do\n\tupdate_netdev\n\t\n\t# 检查是否进入轮询模式\n\tsiminserted=\"$(sim_inserted)\"\n\tif [ \"$siminserted\" = \"1\" ]; then\n\t\trsrq=$(ubus call qmodem cell_info \"{\\\"config_section\\\":\\\"$MODEM_CFG\\\"}\" | jq -r '.modem_info[] | select(.key==\"RSRQ\") | .value')\n\t\t# 当rsrq为空时进入轮询模式\n\t\tif [ -z \"$rsrq\" ] || [ \"$rsrq\" = \"null\" ]; then\n\t\t\t# 进入轮询模式：在5秒内以1秒间隔轮询显示\n\t\t\tfor i in 1 2 3 4 5; do\n\t\t\t\tpolling_display\n\t\t\t\tsleep 1s\n\t\t\tdone\n\t\telse\n\t\t\t# 正常模式：执行主程序并等待5秒\n\t\t\tmain\n\t\t\tinternet_led\n\t\t\tsleep 5s\n\t\tfi\n\telse\n\t\t# SIM卡未插入\n\t\tmain\n\t\tinternet_led\n\t\tsleep 5s\n\tfi\ndone\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/led_scripts/m60k63.sh",
    "content": "#!/bin/sh\n\n# envs\n# led names\n# LED_4G_POOR=\"red:4g\"\n# LED_4G_GOOD=\"blue:4g\"\n# LED_5G_POOR=\"red:5g\"\n# LED_5G_GOOD=\"blue:5g\"\n# LED_INTERNET_BLUE=\"blue:internet\"\n# LED_INTERNET_RED=\"red:internet\"\n# modem_cfg\n# MODEM_CFG / AT_PORT / NET_DEV / USE_UBUS_DAEMON\n\n. /usr/share/qmodem/modem_util.sh\n. /lib/functions.sh\nLED_4G_POOR=\"red:4g\"\nLED_4G_GOOD=\"blue:4g\"\nLED_5G_POOR=\"red:5g\"\nLED_5G_GOOD=\"blue:5g\"\nLED_INTERNET_BLUE=\"blue:internet\"\nLED_INTERNET_RED=\"red:internet\"\nMODEM_CFG=$1\nON_OFF=$2\n\nupdate_cfg(){\n\tconfig_load qmodem\n\tconfig_get AT_PORT \"$MODEM_CFG\" at_port\n\tconfig_get ALIAS \"$MODEM_CFG\" alias\n\tconfig_get USE_UBUS \"$MODEM_CFG\" use_ubus\n\t[ \"$USE_UBUS\" = \"1\" ] && use_ubus_flag=\"-u\"\n}\n\nupdate_netdev(){\n\t# if alias is set, network config name is alias else modem_cfg name\n\tconfig_load network\n\tif [ -n \"$ALIAS\" ]; then\n\t\tconfig_get NET_DEV \"$ALIAS\" ifname\n\telse\n\t\tconfig_get NET_DEV \"$MODEM_CFG\" ifname\n\tfi\n}\nlast_siminserted=\"\"\nlast_netstat=\"\"\n\nled_turn() {\n\tlocal path=\"/sys/class/leds/$1\"\n\tlocal value=\"$2\"\n\tmax_brightness=$(cat \"$path/max_brightness\")\n\tif [ \"$value\" = \"1\" ]; then\n\t\tbrightness=$max_brightness\n\telse\n\t\tbrightness=\"0\"\n\tfi\n\techo \"$brightness\" > \"$path/brightness\"\n}\n\nled_heartbeat() {\n\tlocal path=\"/sys/class/leds/$1\"\n\tmax_brightness=$(cat \"$path/max_brightness\")\n\n\techo \"$max_brightness\" > \"$path/brightness\"\n\techo \"heartbeat\" > \"$path/trigger\"\n}\n\nled_netdev() {\n\tlocal path=\"/sys/class/leds/$1\"\n\tlocal device=\"$2\"\n\n\techo \"1\" > \"$path/brightness\"\n\techo \"netdev\" > \"$path/trigger\"\n\techo \"$device\" > \"$path/device_name\"\n\techo \"1\" > \"$path/link\"\n\techo \"1\" > \"$path/rx\"\n\techo \"1\" > \"$path/tx\"\n}\n\nled_off_all() {\n\tled_turn \"${LED_4G_POOR}\" \"0\"\n\tled_turn \"${LED_4G_GOOD}\" \"0\"\n\tled_turn \"${LED_5G_POOR}\" \"0\"\n\tled_turn \"${LED_5G_GOOD}\" \"0\"\n}\n\nsim_inserted() {\n\n\tif at $AT_PORT \"AT+CPIN?\" | grep -q \"CPIN: READY\"; then\n\t\techo \"1\"\n\telse\n\t\techo \"0\"\n\tfi\n}\n\ninternet_led() {\n\tif wget-ssl --spider --quiet --tries=1 --timeout=3 www.baidu.com; then\n\t\tled_turn \"${LED_INTERNET_BLUE}\" \"1\"\n\t\tled_turn \"${LED_INTERNET_RED}\" \"0\"\n\telse\n\t\tled_turn \"${LED_INTERNET_BLUE}\" \"0\"\n\t\tled_turn \"${LED_INTERNET_RED}\" \"1\"\n\tfi\n}\n\nget_mode() {\n\tlocal rat_mode=\"$1\"\n\trat_code=$(at $AT_PORT \"AT+COPS?\" | grep +COPS: | awk -F, '{print $4}' | tr -d '\"')\n\t[ \"$rat_code\" -le \"7\" ] && echo \"0\" || echo \"1\"\n}\n\nget_rsrp() {\n\trsrp=$(/usr/share/qmodem/modem_ctrl.sh cell_info \"$MODEM_CFG\" | jq -r '.modem_info[] | select(.key==\"RSRP\") | .value')\n\t# if rsrp is empty, return 0\n\t[ -z \"$rsrp\" ] && rsrp=\"0\"\n\t# if rsrp out of range, return 0\n\tif [ \"$rsrp\" -gt \"0\" ] || [ \"$rsrp\" -lt \"-140\" ]; then\n\t\trsrp=\"0\"\n\tfi\n\techo \"$rsrp\"\n}\n\nmain() {\n\tlocal siminserted=\"$(sim_inserted)\"\n\tif [ \"$siminserted\" = \"0\" ] && [ \"$siminserted\" = \"$last_siminserted\" ]; then\n\t\t# there's no update, return\n\t\treturn\n\tfi\n\n\tlast_siminserted=\"$siminserted\"\n\n\tif [ \"$siminserted\" = \"0\" ]; then\n\t\tled_off_all\n\t\tled_heartbeat ${LED_4G_POOR}\n\t\tled_heartbeat ${LED_5G_POOR}\n\n\t\tlast_netstat=\"\"\n\t\treturn\n\tfi\n\n\tlocal is_nr=$(get_mode)\n\tlocal rsrp=$(get_rsrp)\n\tlocal signal=\"0\"\n\t\n\t#三档singal\n\tif [ \"$rsrp\" -ge \"-95\" ] && [ \"$rsrp\" -lt \"0\" ]; then\n\t\tsignal=\"2\"\n\telif [ \"$rsrp\" -ge \"-110\" ] && [ \"$rsrp\" -lt \"-95\" ]; then\n\t\tsignal=\"1\"\n\telse\n\t\tsignal=\"0\"\n\tfi\n\t\n\tnetstat=\"${NET_DEV}_${is_nr}_${signal}\"\n\tif [ \"$netstat\" = \"$last_netstat\" ]; then\n\t\t# there's no update, return\n\t\treturn\n\tfi\n\tlast_netstat=\"$netstat\"\n\n\tcase \"$signal\" in\n\t\"0\")\n\t\tled_off_all\n\t\tcase \"$is_nr\" in\n\t\t\t\"0\")\n\t\t\t\tled_heartbeat \"${LED_4G_POOR}\"\n\t\t\t\t;;\n\t\t\t\"1\")\n\t\t\t\tled_heartbeat \"${LED_5G_POOR}\"\n\t\t\t\t;;\n\t\tesac\n\t\t;;\n\t\"1\")\n\t\tled_off_all\n\t\tcase \"$is_nr\" in\n\t\t\t\"0\")\n\t\t\t\tled_netdev \"${LED_4G_POOR}\" \"$NET_DEV\"\n\t\t\t\t;;\n\t\t\t\"1\")\n\t\t\t\tled_netdev \"${LED_4G_POOR}\" \"$NET_DEV\"\n\t\t\t\t;;\n\t\tesac\n\t\t;;\n\t\"2\")\n\t\tled_off_all\n\t\tcase \"$is_nr\" in\n\t\t\t\"0\")\n\t\t\t\tled_netdev \"${LED_4G_GOOD}\" \"$NET_DEV\"\n\t\t\t\t;;\n\t\t\t\"1\")\n\t\t\t\tled_netdev \"${LED_5G_GOOD}\" \"$NET_DEV\"\n\t\t\t\t;;\n\t\tesac\n\t\t;;\n\tesac\n}\n\n# Loop forever\nupdate_cfg\nif [ \"$ON_OFF\" = \"off\" ]; then\n\tled_off_all\n\texit 0\nfi\nwhile true; do\n\tupdate_netdev\n\tmain\n\tinternet_led\n\tsleep 5s\ndone\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/modem_ctrl.sh",
    "content": "#!/bin/sh\nsource /usr/share/libubox/jshn.sh\nmethod=$1\nconfig_section=$2\nat_port=$(uci -q get qmodem.$config_section.at_port)\noverride_at_port=$(uci -q get qmodem.$config_section.override_at_port)\n[ -n \"$override_at_port\" ] && at_port=$override_at_port\nuci -q get qmodem.$config_section.sms_at_port >/dev/null && sms_at_port=$(uci -q get qmodem.$config_section.sms_at_port)\nvendor=$(uci -q get qmodem.$config_section.manufacturer)\nplatform=$(uci -q get qmodem.$config_section.platform)\npdp_index=$(uci -q get qmodem.$config_section.pdp_index)\n[ -z \"$pdp_index\" ] && pdp_index=$(uci -q get qmodem.$config_section.suggest_pdp_index)\nuse_ubus=$(uci -q get qmodem.$config_section.use_ubus)\nmodem_path=$(uci -q get qmodem.$config_section.path)\nmodem_slot=$(basename $modem_path)\n\n[ -z \"$pdp_index\" ] && {\n    pdp_index=\"1\"\n}\n\n[ $use_ubus -eq 1 ] && use_ubus_flag=\"-u\"\n\n#please update dynamic_load.json to add new vendor\nvendor_script_prefix=\"/usr/share/qmodem/vendor\"\ndynamic_load_json=\"$vendor_script_prefix/dynamic_load.json\"\nvendor_file=\"${vendor_script_prefix}/`jq -r --arg vendor $vendor '.[$vendor]' $dynamic_load_json`\"\nif [ -z \"$vendor\" ] || [ ! -f \"$vendor_file\" ]; then\n    logger -t modem_ctrl \"vendor $vendor not support\"\n    . /usr/share/qmodem/generic.sh\nfi\n. $vendor_file\n\ntry_cache() {\n    cache_timeout=$1\n    cache_file=$2\n    function_name=$3\n    current_time=$(date +%s)\n    file_time=$(stat -t $cache_file | awk '{print $14}')\n    [ -z \"$file_time\" ] && file_time=0\n    if [ ! -f $cache_file ] || [ $(($current_time - $file_time)) -gt $cache_timeout ]; then\n        touch $cache_file\n        json_add_array modem_info\n        $function_name\n        json_close_array\n        json_dump > $cache_file\n        return 1\n    else\n        cat $cache_file\n        exit 0\n    fi\n}\n\nget_sms(){\n    [ -n \"$sms_at_port\" ] && at_port=$sms_at_port\n    cache_timeout=$1\n    cache_file=$2\n    current_time=$(date +%s)\n    file_time=$(stat -t $cache_file | awk '{print $14}')\n    [ -z \"$file_time\" ] && file_time=0\n    get_sms_capabilities\n    if [ ! -f $cache_file ] || [ $(($current_time - $file_time)) -gt $cache_timeout ]; then\n        touch $cache_file\n        #sms_tool_q -d $at_port -j recv > $cache_file\n        tom_modem $use_ubus_flag  -d $at_port -o r > $cache_file\n        echo $(cat $cache_file ; json_dump) | jq -s 'add'\n    else\n        echo $(cat $cache_file ; json_dump) | jq -s 'add'\n    fi\n}\n\nget_at_cfg(){\n    json_add_object at_cfg\n    duns=$(ls /dev/mhi_DUN*)\n    ttys=$(ls /dev/ttyUSB*)\n    ttyacms=$(ls /dev/ttyACM*)\n    wwanNatN=$(ls /dev/wwan* |grep -E wwan[0-9]at[0-9])\n    all_ttys=\"$duns $ttys $ttyacms $wwanNatN\"\n    json_add_array other_ttys\n    for tty in $all_ttys; do\n        [ -n \"$tty\" ] && json_add_string \"\" \"$tty\"\n    done\n    json_close_array\n    json_add_array ports\n    ports=$(uci -q get qmodem.$config_section.ports)\n    for port in $ports; do\n        json_add_string \"\" \"$port\"\n    done\n    json_close_array\n    json_add_array valid_ports\n    v_ports=$(uci -q get qmodem.$config_section.valid_at_ports)\n    for port in $v_ports; do\n        json_add_string \"\" \"$port\"\n    done\n    json_close_array\n    override_at_port=$(uci -q get qmodem.$config_section.override_at_port)\n    at_port=$(uci -q get qmodem.$config_section.at_port)\n    [ -n \"$override_at_port\" ] && at_port=$override_at_port\n    json_add_string using_port \"$at_port\"\n    json_add_array cmds\n    \n    # Determine language and select appropriate AT commands file\n    lang=$(uci -q get luci.main.lang 2>/dev/null || echo \"en\")\n    case \"$lang\" in\n        zh*|cn|auto)\n            at_commands_file=\"/usr/share/qmodem/at_commands_zh.json\"\n            ;;\n        *)\n            at_commands_file=\"/usr/share/qmodem/at_commands_en.json\"\n            ;;\n    esac\n    \n    # Fallback to default file if language-specific file doesn't exist\n    [ ! -f \"$at_commands_file\" ] && at_commands_file=\"/usr/share/qmodem/at_commands.json\"\n    \n    general_cmd=$(jq -rc '.general[]|to_entries| .[] | @sh \"key=\\(.key) value=\\(.value)\"' \"$at_commands_file\")\n    platform_cmd=$(jq -rc \".${vendor}.${platform}[]|to_entries| .[] | @sh \\\"key=\\(.key) value=\\(.value)\\\"\" \"$at_commands_file\")\n    [ -z \"$platform_cmd\" ] && platform_cmd=$(jq -rc \".$vendor.general[]|to_entries| .[] | @sh \\\"key=\\(.key) value=\\(.value)\\\"\" \"$at_commands_file\")\n    cmds=$(echo -e \"$general_cmd\\n$platform_cmd\")\n    IFS=$'\\n'\n    for cmd in $cmds; do\n        json_add_object cmd\n        eval $cmd\n        json_add_string \"name\" \"$key\"\n        json_add_string \"value\" \"$value\"\n        json_close_object\n    done\n    json_close_array\n    json_close_object\n    json_dump\n    unset IFS\n}\n\n#会初始化一个json对象 命令执行结果会保存在json对象中\njson_init\njson_add_object result\njson_close_object\ncase $method in\n    \"base_info\")\n        cache_file=\"/tmp/cache_$1_$2\"\n        try_cache 10 $cache_file base_info\n        ;;\n    \"cell_info\")\n        cache_file=\"/tmp/cache_$1_$2\"\n        try_cache 10 $cache_file cell_info\n        ;;\n    \"clear_stats\")\n        json_init\n        clear_usage_stats\n        ;;\n    \"clear_dial_log\")\n        json_select result\n        log_file=\"/var/run/qmodem/${config_section}_dir/dial_log\"\n        [ -f $log_file ] && echo \"\" > $log_file && json_add_string status \"1\" || json_add_string status \"0\"\n        json_close_object\n        ;;\n    \"delete_sms\")\n        json_select result\n        index=$3\n        [ -n \"$sms_at_port\" ] && at_port=$sms_at_port\n        for i in $index; do\n            tom_modem $use_ubus_flag  -d $at_port -o d -i $i\n            touch /tmp/cache_sms_$2\n            if [ \"$?\" == 0 ]; then\n                json_add_string status \"1\"\n                json_add_string \"index$i\" \"tom_modem $use_ubus_flag  -d $at_port -o d -i $i\"\n            else\n                json_add_string status \"0\"\n            fi\n        done\n        json_close_object\n        rm -rf /tmp/cache_sms_$2\n        ;;\n    \"do_reboot\")\n        reboot_method=$(echo $3 |jq -r '.method')\n        echo $3 > /tmp/555/reboot\n        case $reboot_method in\n            \"hard\")\n                hard_reboot\n                ;;\n            \"soft\")\n                soft_reboot\n                ;;\n        esac\n        ;;\n    \"get_at_cfg\")\n        get_at_cfg\n        exit\n        ;;\n    \"get_copyright\")\n        _copyright\n        ;;\n    \"get_disabled_features\")\n        json_add_array disabled_features\n        vendor_get_disabled_features\n        get_modem_disabled_features\n        get_global_disabled_features\n        json_close_array\n        ;;\n    \"get_dns\")\n        get_dns\n        ;;\n    \"get_imei\")\n        get_imei\n        ;;\n    \"get_lockband\")\n        get_lockband\n        ;;\n    \"get_mode\")\n        get_mode\n        ;;\n    \"get_neighborcell\")\n        get_neighborcell\n        ;;\n    \"get_network_prefer\")\n        get_network_prefer\n        ;;\n    \"get_reboot_caps\")\n        get_reboot_caps\n        exit\n        ;;\n    \"get_stats\")\n        json_init\n        get_usage_stats\n        ;;\n    \"get_sms\")\n        get_sms 10 /tmp/cache_sms_$2\n        exit\n        ;;\n    \"info\")\n        cache_file=\"/tmp/cache_$1_$2\"\n        try_cache 10 $cache_file get_info\n        ;;\n    \"network_info\")\n        cache_file=\"/tmp/cache_$1_$2\"\n        try_cache 10 $cache_file network_info\n        ;;\n    \"send_at\")\n        cmd=$(echo \"$3\" | jq -r '.at')\n        port=$(echo \"$3\" | jq -r '.port')\n        res=$(at $port $cmd)\n        json_add_object at_cfg\n        if [ \"$?\" == 0 ]; then\n            json_add_string status \"1\"\n            json_add_string cmd \"at $port $cmd\"\n            json_add_string \"res\" \"$res\"\n        else\n            json_add_string status \"0\"\n        fi\n        ;;\n    \"send_raw_pdu\")\n        cmd=$3\n        [ -n \"$sms_at_port\" ] && at_port=$sms_at_port\n        res=$(tom_modem $use_ubus_flag  -d $at_port -o s -p \"$cmd\")\n        json_select result\n        if [ \"$?\" == 0 ]; then\n            json_add_string status \"1\"\n            json_add_string cmd \"tom_modem $use_ubus_flag  -d $at_port -o s -p \\\"$cmd\\\"\"\n            json_add_string \"res\" \"$res\"\n        else\n            json_add_string status \"0\"\n        fi\n        ;;\n    \"send_sms\")\n        cmd_json=$3\n        phone_number=$(echo $cmd_json | jq -r '.phone_number')\n        message_content=$(echo $cmd_json | jq -r '.message_content')\n        [ -n \"$sms_at_port\" ] && at_port=$sms_at_port\n        sms_tool_q -d $at_port send \"$phone_number\" \"$message_content\" > /dev/null\n        json_select result\n        if [ \"$?\" == 0 ]; then\n            json_add_string status \"1\"\n            json_add_string cmd \"sms_tool_q -d $at_port send \\\"$phone_number\\\" \\\"$message_content\\\"\"\n            json_add_string \"cmd_json\" \"$cmd_json\"\n        else\n            json_add_string status \"0\"\n        fi\n        json_close_object\n        ;;\n    \"set_imei\")\n        set_imei $3\n        ;;\n    \"set_lockband\")\n        set_lockband $3\n        ;;\n    \"set_mode\")\n        set_mode $3\n        ;;\n    \"set_neighborcell\")\n        set_neighborcell $3\n        ;;\n    \"set_network_prefer\")\n        set_network_prefer $3\n        ;;\n    \"set_sms_storage\")\n        set_sms_storage $3\n        ;;\n    \"sim_info\")\n        cache_file=\"/tmp/cache_$1_$2\"\n        try_cache 10 $cache_file sim_info\n        ;;\n    #sim_switch\n    \"get_sim_switch_capabilities\")\n        get_sim_switch_capabilities\n        ;;\n    \"get_sim_slot\")\n        get_sim_slot\n        ;;\n    \"set_sim_slot\")\n        set_sim_slot $3\n        ;;\nesac\njson_dump\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/modem_dial.sh",
    "content": "#!/bin/sh\nsource /lib/functions.sh\n#运行目录\nMODEM_RUNDIR=\"/var/run/qmodem\"\nSCRIPT_DIR=\"/usr/share/qmodem\"\n\nmodem_config=$1\nmkdir -p \"${MODEM_RUNDIR}/${modem_config}_dir\"\nlog_file=\"${MODEM_RUNDIR}/${modem_config}_dir/dial_log\"\ndebug_subject=\"modem_dial\"\nsource \"${SCRIPT_DIR}/generic.sh\"\ntouch $log_file\n\nexec_pre_dial()\n{\n    section=$1\n    /usr/share/qmodem/modem_hook.sh $section pre_dial\n}\n\nget_led()\n{\n    config_foreach get_led_by_slot modem-slot\n}\n\nget_led_by_slot()\n{\n    local cfg=\"$1\"\n    config_get slot \"$cfg\" slot\n    if [ \"$modem_slot\" = \"$slot\" ];then\n        config_get sim_led \"$cfg\" sim_led\n        config_get net_led \"$cfg\" net_led\n    fi\n}\n\nget_slot_network_config()\n{\n    local cfg=\"$1\"\n    local slot\n    config_get slot \"$cfg\" slot\n    if [ \"$modem_slot\" = \"$slot\" ];then\n        config_get ethernet_5g \"$cfg\" ethernet_5g\n        config_get slot_bridge_port \"$cfg\" bridge_port\n    fi\n}\n\nsanitize_bridge_id()\n{\n    local value=\"$1\"\n    value=$(printf '%s' \"$value\" | tr -c 'A-Za-z0-9_-' '_')\n    value=$(printf '%s' \"$value\" | sed 's/^_\\\\+//; s/_\\\\+$//')\n    echo \"$value\"\n}\n\nmake_bridge_device_name()\n{\n    local source=\"$1\"\n    local sanitized\n\n    sanitized=$(sanitize_bridge_id \"$source\")\n    [ -z \"$sanitized\" ] && return 1\n    printf 'b%s\\n' \"$sanitized\" | cut -c1-15\n}\n\nget_bridge_device_section()\n{\n    local safe_cfg\n    safe_cfg=$(sanitize_bridge_id \"$modem_config\")\n    [ -z \"$safe_cfg\" ] && safe_cfg=\"modem\"\n    echo \"qmodem_bridge_${safe_cfg}\"\n}\n\nget_bridge_backup_section()\n{\n    local bridge_cfg=\"$1\"\n    local safe_cfg\n    local safe_bridge\n\n    safe_cfg=$(sanitize_bridge_id \"$modem_config\")\n    safe_bridge=$(sanitize_bridge_id \"$bridge_cfg\")\n    [ -z \"$safe_cfg\" ] && safe_cfg=\"modem\"\n    [ -z \"$safe_bridge\" ] && safe_bridge=\"bridge\"\n    echo \"qmodem_bridge_backup_${safe_cfg}_${safe_bridge}\"\n}\n\nbridge_name_conflict_cb()\n{\n    local cfg=\"$1\"\n    local name\n\n    [ \"$cfg\" = \"$bridge_name_allow_section\" ] && return\n    config_get name \"$cfg\" name\n    [ \"$name\" = \"$bridge_name_candidate\" ] && bridge_name_conflict=1\n}\n\nbridge_name_in_use()\n{\n    local candidate=\"$1\"\n    local allow_section=\"$2\"\n    local current_name\n\n    [ -z \"$candidate\" ] && return 0\n\n    bridge_name_candidate=\"$candidate\"\n    bridge_name_allow_section=\"$allow_section\"\n    bridge_name_conflict=0\n    config_load network\n    config_foreach bridge_name_conflict_cb device\n    current_name=$(uci -q get network.${allow_section}.name)\n    if [ -d \"/sys/class/net/$candidate\" ] && [ \"$current_name\" != \"$candidate\" ]; then\n        bridge_name_conflict=1\n    fi\n    [ \"$bridge_name_conflict\" = \"1\" ]\n}\n\nresolve_bridge_device_name()\n{\n    local bridge_section\n    local preferred_name\n    local fallback_name\n    local current_name\n    local seed\n    local suffix\n\n    bridge_section=$(get_bridge_device_section)\n    current_name=$(uci -q get network.${bridge_section}.name)\n    preferred_name=$(make_bridge_device_name \"$alias\")\n    fallback_name=$(make_bridge_device_name \"$modem_config\")\n\n    if [ -n \"$preferred_name\" ] && ! bridge_name_in_use \"$preferred_name\" \"$bridge_section\"; then\n        echo \"$preferred_name\"\n        return\n    fi\n\n    if [ -n \"$fallback_name\" ] && ! bridge_name_in_use \"$fallback_name\" \"$bridge_section\"; then\n        echo \"$fallback_name\"\n        return\n    fi\n\n    if [ -n \"$current_name\" ]; then\n        echo \"$current_name\"\n        return\n    fi\n\n    seed=$(sanitize_bridge_id \"$modem_config\")\n    [ -z \"$seed\" ] && seed=\"modem\"\n    suffix=$(printf '%s' \"$modem_config\" | cksum | awk '{print $1}' | cut -c1-4)\n    printf 'b%s%s\\n' \"$(printf '%s' \"$seed\" | cut -c1-10)\" \"$suffix\" | cut -c1-15\n}\n\ncollect_bridge_ports()\n{\n    local port=\"$1\"\n\n    [ -n \"$bridge_ports\" ] && bridge_ports=\"$bridge_ports $port\" || bridge_ports=\"$port\"\n    [ \"$port\" = \"$bridge_scan_target_port\" ] && bridge_port_found=1\n}\n\nsave_bridge_port_backup()\n{\n    local source_section=\"$1\"\n    local source_ports=\"$2\"\n    local backup_section\n\n    backup_section=$(get_bridge_backup_section \"$source_section\")\n    [ -n \"$(uci -q get qmodem.${backup_section})\" ] && return\n\n    uci -q set qmodem.${backup_section}=bridge-port-backup\n    uci -q set qmodem.${backup_section}.modem_config=\"${modem_config}\"\n    uci -q set qmodem.${backup_section}.device_section=\"${source_section}\"\n    uci -q set qmodem.${backup_section}.bridge_port=\"${bridge_port}\"\n    uci -q delete qmodem.${backup_section}.ports\n    for port in $source_ports; do\n        uci -q add_list qmodem.${backup_section}.ports=\"${port}\"\n    done\n    bridge_qmodem_dirty=1\n    m_debug \"backup bridge device $source_section ports: $source_ports\"\n}\n\nremove_bridge_port_from_device()\n{\n    local cfg=\"$1\"\n    local type\n\n    [ \"$cfg\" = \"$bridge_device_section\" ] && return\n    config_get type \"$cfg\" type\n    [ \"$type\" = \"bridge\" ] || return\n\n    bridge_ports=\"\"\n    bridge_port_found=0\n    config_list_foreach \"$cfg\" ports collect_bridge_ports\n    [ \"$bridge_port_found\" = \"1\" ] || return\n\n    save_bridge_port_backup \"$cfg\" \"$bridge_ports\"\n    uci -q delete network.${cfg}.ports\n    for port in $bridge_ports; do\n        [ \"$port\" = \"$bridge_scan_target_port\" ] && continue\n        uci -q add_list network.${cfg}.ports=\"${port}\"\n    done\n    bridge_network_dirty=1\n    m_debug \"remove bridge port $bridge_scan_target_port from bridge device $cfg\"\n}\n\nensure_bridge_device()\n{\n    local wwan_port=\"$1\"\n    local bridge_section\n    local desired_ports\n    local current_type\n    local current_name\n    local current_ports\n\n    bridge_section=$(get_bridge_device_section)\n    bridge_device_section=\"$bridge_section\"\n    bridge_device_name=$(resolve_bridge_device_name)\n    current_type=$(uci -q get network.${bridge_section}.type)\n    current_name=$(uci -q get network.${bridge_section}.name)\n    current_ports=$(uci -q get network.${bridge_section}.ports)\n\n    desired_ports=\"$bridge_port\"\n    [ -n \"$wwan_port\" ] && [ \"$wwan_port\" != \"$bridge_port\" ] && desired_ports=\"$desired_ports $wwan_port\"\n\n    if [ \"$(uci -q get network.${bridge_section})\" != \"device\" ] || [ \"$current_type\" != \"bridge\" ] || [ \"$current_name\" != \"$bridge_device_name\" ] || [ \"$current_ports\" != \"$desired_ports\" ]; then\n        uci -q set network.${bridge_section}=device\n        uci -q set network.${bridge_section}.name=\"${bridge_device_name}\"\n        uci -q set network.${bridge_section}.type='bridge'\n        uci -q delete network.${bridge_section}.ports\n        uci -q add_list network.${bridge_section}.ports=\"${bridge_port}\"\n        [ -n \"$wwan_port\" ] && [ \"$wwan_port\" != \"$bridge_port\" ] && uci -q add_list network.${bridge_section}.ports=\"${wwan_port}\"\n        bridge_network_dirty=1\n        m_debug \"set dedicated bridge ${bridge_device_name} ports: ${desired_ports}\"\n    fi\n}\n\nensure_bridge_passthrough()\n{\n    local wwan_port=\"$1\"\n\n    bridge_device_name=\"\"\n    bridge_device_section=$(get_bridge_device_section)\n    bridge_scan_target_port=\"$bridge_port\"\n\n    config_load network\n    config_foreach remove_bridge_port_from_device device\n    ensure_bridge_device \"$wwan_port\"\n}\n\nrestore_bridge_backup_ports()\n{\n    local port=\"$1\"\n\n    [ -n \"$port\" ] && uci -q add_list network.${restore_bridge_section}.ports=\"${port}\"\n}\n\nrestore_bridge_port_backup()\n{\n    local cfg=\"$1\"\n    local bind_modem_config\n    local source_section\n\n    config_get bind_modem_config \"$cfg\" modem_config\n    [ \"$bind_modem_config\" = \"$modem_config\" ] || return\n\n    config_get source_section \"$cfg\" device_section\n    if [ -n \"$source_section\" ] && [ -n \"$(uci -q get network.${source_section})\" ]; then\n        uci -q delete network.${source_section}.ports\n        restore_bridge_section=\"$source_section\"\n        config_list_foreach \"$cfg\" ports restore_bridge_backup_ports\n        bridge_network_dirty=1\n        m_debug \"restore bridge device $source_section\"\n    fi\n\n    uci -q delete qmodem.${cfg}\n    bridge_qmodem_dirty=1\n}\n\ncleanup_bridge_passthrough()\n{\n    local bridge_section\n\n    bridge_network_dirty=0\n    bridge_qmodem_dirty=0\n\n    config_load qmodem\n    config_foreach restore_bridge_port_backup bridge-port-backup\n\n    bridge_section=$(get_bridge_device_section)\n    if [ -n \"$(uci -q get network.${bridge_section})\" ]; then\n        uci -q delete network.${bridge_section}\n        bridge_network_dirty=1\n        m_debug \"delete dedicated bridge section $bridge_section\"\n    fi\n}\n\nset_led()\n{\n    local type=$1\n    local modem_config=$2\n    local value=$3\n    get_led \"$modem_slot\"\n    case $type in\n        sim)\n            [ -z \"$sim_led\" ] && return\n            echo $value > /sys/class/leds/$sim_led/brightness\n            ;;\n        net)\n            [ -z \"$net_led\" ] && return\n            cfg_name=$(echo $net_led |tr \":\" \"_\") \n            uci batch << EOF\nset system.n${cfg_name}=led\nset system.n${cfg_name}.name=${modem_slot}_net_indicator\nset system.n${cfg_name}.sysfs=${net_led}\nset system.n${cfg_name}.trigger=netdev\nset system.n${cfg_name}.dev=${value:-$modem_netcard}\nset system.n${cfg_name}.mode=\"link tx rx\"\ncommit system\nEOF\n\n            /etc/init.d/led restart\n            ;;\n    esac\n}\n\nunlock_sim()\n{\n    pin=$1\n    sim_lock_file=\"/var/run/qmodem/${modem_config}_dir/pincode\"\n    lock ${sim_lock_file}.lock\n    if [ -f $sim_lock_file ] && [ \"$pin\" == \"$(cat $sim_lock_file)\"];then\n        m_debug \"pin code is already try\"\n    else\n        \n        res=$(at \"$at_port\" \"AT+CPIN=\\\"$pin\\\"\")\n        case \"$?\" in\n            0)\n                m_debug \"unlock sim card with pin code $pin success\"\n                ;;\n            *)\n                echo $pin > $sim_lock_file\n                m_debug \"info\" \"unlock sim card with pin code $pin failed,block try until nextboot\"\n                ;;\n        esac\n    fi\n    lock -u ${sim_lock_file}.lock\n\n}\n\nget_platform_suggest_pdp_index()\n{\n    case $manufacturer in\n    quectel)\n        case $platform in\n            lte)\n                echo 3\n                ;;\n            *)\n                echo 1\n                ;;\n        esac\n    ;;\n    fibocom)\n        case $platform in\n            mediatek)\n                echo 3\n                ;;\n            *)\n                echo 1\n                ;;\n        esac\n    ;;\n    *)\n        echo 1\n        ;;\n    esac\n}\n\nupdate_config()\n{\n    config_load qmodem\n    config_get state $modem_config state\n    config_get enable_dial $modem_config enable_dial\n    config_get modem_path $modem_config path\n    config_get dial_tool $modem_config dial_tool\n    config_get pdp_type $modem_config pdp_type\n    config_get network_bridge $modem_config network_bridge\n    config_get metric $modem_config metric\n    config_get at_port $modem_config at_port\n    config_get manufacturer $modem_config manufacturer\n    config_get platform $modem_config platform\n    config_get use_ubus $modem_config use_ubus\n    config_get force_set_apn $modem_config force_set_apn\n    config_get pdp_index $modem_config pdp_index\n    [ -n \"$pdp_index\" ] && userset_pdp_index=\"1\" || userset_pdp_index=\"0\"\n    config_get suggest_pdp_index $modem_config suggest_pdp_index\n    [ -z \"$suggest_pdp_index\"] && suggest_pdp_index=$(get_platform_suggest_pdp_index)\n    [ -z \"$pdp_index\" ] && pdp_index=$suggest_pdp_index\n    config_get ra_master $modem_config ra_master\n    config_get extend_prefix $modem_config extend_prefix\n    config_get en_bridge $modem_config en_bridge\n    config_get do_not_add_dns $modem_config do_not_add_dns\n    config_get dns_list $modem_config dns_list\n    config_get huawei_dial_mode $modem_config huawei_dial_mode\n    config_get donot_nat $modem_config donot_nat 0\n    config_get global_dial main enable_dial\n    modem_slot=$(basename $modem_path)\n    slot_bridge_port=\"\"\n    ethernet_5g=\"\"\n    bridge_port=\"\"\n    bridge_enabled=0\n    # config_get ethernet_5g u$modem_config ethernet 转往口获取命令更新，待测试\n    config_foreach get_slot_network_config modem-slot\n    config_get alias $modem_config alias\n    config_get device_bridge_port $modem_config bridge_port\n    bridge_port=\"$slot_bridge_port\"\n    [ -n \"$device_bridge_port\" ] && bridge_port=\"$device_bridge_port\"\n    [ \"$en_bridge\" = \"1\" ] && [ -n \"$bridge_port\" ] && bridge_enabled=1\n    driver=$(get_driver)\n    update_sim_slot\n    case $sim_slot in\n        1)\n        config_get apn $modem_config apn\n        config_get username $modem_config username\n        config_get password $modem_config password\n        config_get auth $modem_config auth\n        config_get pincode $modem_config pincode\n        ;;\n        2)\n        config_get apn $modem_config apn2\n        config_get username $modem_config username2\n        config_get password $modem_config password2\n        config_get auth $modem_config auth2\n        config_get pincode $modem_config pincode2\n        [ -z \"$apn\" ] && config_get apn $modem_config apn\n        [ -z \"$username\" ] && config_get username $modem_config username\n        [ -z \"$password\" ] && config_get password $modem_config password\n        [ -z \"$auth\" ] && config_get auth $modem_config auth\n        [ -z \"$pin\" ] && config_get pincode $modem_config pincode\n        ;;\n        *)\n            config_get apn $modem_config apn\n            config_get username $modem_config username\n            config_get password $modem_config password\n            config_get auth $modem_config auth\n            config_get pincode $modem_config pincode\n            ;;\n    esac\n    modem_net=$(find $modem_path -name net |tail -1)\n    modem_netcard=$(ls $modem_net)\n    interface_name=$modem_config\n    [ -n \"$alias\" ] && interface_name=$alias\n    interface6_name=${interface_name}v6\n    if [ \"$use_ubus\" = \"1\" ]; then\n        use_ubus_flag=\"-u\"\n    else\n        use_ubus_flag=\"\"\n    fi\n}\n\ncheck_dial_prepare()\n{\n    cpin=$(at \"$at_port\" \"AT+CPIN?\")\n    get_sim_status \"$cpin\"\n    [ \"$manufacturer\" = \"neoway\" ] && {\n        local res\n        res=$(at $at_port 'AT+SIMCROSS=1,1;$MYCCID' | grep -q \"ERROR\")\n        if [ $? -ne 0 ]; then\n            sim_state_code=\"1\"\n        else\n            sim_state_code=\"0\"\n        fi\n    }\n    case $sim_state_code in\n        \"0\")\n            m_debug \"info sim card is miss\"\n            ;;\n        \"1\")\n            m_debug \"info sim card is ready\"\n            sim_fullfill=1\n            ;;\n        \"2\")\n            m_debug \"pin code required\"\n            [ -n \"$pincode\" ] && unlock_sim $pincode\n            ;;\n        *)\n            m_debug \"info sim card state is $sim_state_code\"\n            ;;\n    esac\n    \n    if [ \"$sim_fullfill\" = \"1\" ];then\n        set_led \"sim\" $modem_config 255\n    else\n        set_led \"sim\" $modem_config 0\n    fi\n    if [ -n \"$modem_netcard\" ] && [ -d \"/sys/class/net/$modem_netcard\" ];then\n        netdev_fullfill=1\n    else\n        netdev_fullfill=0\n    fi\n\n    if [ \"$enable_dial\" = \"1\" ] && [ \"$sim_fullfill\" = \"1\" ] && [ \"$state\" != \"disabled\" ] ;then\n        config_fullfill=1\n    fi\n    if [ \"$config_fullfill\" = \"1\" ] && [ \"$sim_fullfill\" = \"1\" ] && [ \"$netdev_fullfill\" = \"1\" ] ;then\n        at \"$at_port\" \"AT+CFUN=1\"\n        return 1\n    else\n        return 0\n    fi\n}\n\ncheck_ip()\n{\n    case $manufacturer in\n            \"simcom\")\n                case $platform in\n                    \"qualcomm\")\n                        check_ip_command=\"AT+CGPADDR=6\"\n                        ;;\n                esac\n                ;;\n            \"neoway\")\n                case $platform in\n                    \"unisoc\")\n                        check_ip_command=\"AT+CGPADDR=1\"\n                        ;;\n                esac\n                ;;\n            *)\n                check_ip_command=\"AT+CGPADDR=$pdp_index\"\n                ;;\n        esac\n\n        if [ \"$driver\" = \"mtk_pcie\" ]; then\n            mbim_port=$(echo \"$at_port\" | sed 's/at/mbim/g')\n            local config=$(umbim -d $mbim_port config)\n            ipaddr=$(echo \"$config\" | grep \"ipv4address:\" | awk '{print $2}' | cut -d'/' -f1)\n            ipaddr=\"$ipaddr $(echo \"$config\" | grep \"ipv6address:\" | awk '{print $2}' | cut -d'/' -f1)\"\n        else\n            ipaddr=$(at \"$at_port\" \"$check_ip_command\" | grep +CGPADDR:)\n        fi\n\n        if [ -n \"$ipaddr\" ];then\n            ipv6=$(echo $ipaddr | grep -oE \"\\b([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}\\b\")\n            ipv4=$(echo $ipaddr | grep -oE \"\\b([0-9]{1,3}\\.){3}[0-9]{1,3}\\b\")\n            if [ \"$manufacturer\" = \"simcom\" ];then\n                ipv4=$(echo $ipaddr | grep -oE \"\\b([0-9]{1,3}\\.){3}[0-9]{1,3}\\b\" | grep -v \"0\\.0\\.0\\.0\" | head -n 1)\n                ipv6=$(echo $ipaddr | grep -oE \"\\b([0-9a-fA-F]{0,4}.){2,7}[0-9a-fA-F]{0,4}\\b\")\n            fi\n            # disallow_ipv4=\"0.0.0.0\"\n            # #remove the disallow ip\n            # if [[ \"$ipv4\" == *\"$disallow_ipv4\"* ]];then\n            #     ipv4=\"\"\n            # fi\n            connection_status=0\n            if [ -n \"$ipv4\" ];then\n                connection_status=1\n            fi\n            if [ -n \"$ipv6\" ];then\n                connection_status=2\n            fi\n            if [ -n \"$ipv4\" ] && [ -n \"$ipv6\" ];then\n                connection_status=3\n            fi\n        else\n            connection_status=\"-1\"\n            m_debug \"at port response unexpected $ipaddr\"\n        fi\n}\n\nappend_to_fw_zone()\n{\n    local fw_zone=$1\n    local if_name=$2\n    source /etc/os-release\n    local os_version=${VERSION_ID:0:2}\n    if [ \"$os_version\" -le 21 ];then\n        has_ifname=0\n        origin_line=$(uci -q get firewall.@zone[${fw_zone}].network)\n        for i in $origin_line\n        do\n            if [ \"$i\" = \"$if_name\" ];then\n                has_ifname=1\n            fi\n        done\n        if [ -n \"$origin_line\" ] && [ \"$has_ifname\" -eq 0 ];then\n            uci set firewall.@zone[${fw_zone}].network=\"${origin_line} ${if_name}\"\n        elif [ -z \"$origin_line\" ];then\n            uci set firewall.@zone[${fw_zone}].network=\"${if_name}\"\n        fi\n    else\n        uci add_list firewall.@zone[${fw_zone}].network=${if_name}\n    fi\n}\n\nset_if()\n{\n    firewall_reload_flag=0\n    dhcp_reload_flag=0\n    network_reload_flag=0\n    interface_update_flag=0\n    bridge_network_dirty=0\n    bridge_qmodem_dirty=0\n    #check if exist\n    proto=\"dhcp\"\n    protov6=\"dhcpv6\"\n    case $manufacturer in\n        \"quectel\")\n            case $platform in\n                \"unisoc\")\n                    case $driver in\n                        \"mbim\")\n                            proto=\"none\"\n                            protov6=\"none\"\n                            ;;\n                        esac\n                    ;;\n            esac\n            ;; \n        \"fibocom\")\n            case $platform in\n                \"mediatek\")\n                    proto=\"static\"\n                    protov6=\"dhcpv6\"\n                    ;;\n                esac\n            ;;\n    esac\n    if [ \"$bridge_enabled\" = \"1\" ]; then\n        proto=\"none\"\n        protov6=\"none\"\n    fi\n    case $pdp_type in\n        \"ip\")\n            env4=\"1\"\n            env6=\"0\"\n            ;;\n        \"ipv6\")\n            env4=\"0\"\n            env6=\"1\"\n            ;;\n        \"ipv4v6\")\n            env4=\"1\"\n            env6=\"1\"\n            ;;\n    esac\n    if [ \"$bridge_enabled\" = \"1\" ]; then\n        env4=\"1\"\n        env6=\"0\"\n    fi\n    interface=$(uci -q get network.$interface_name)\n    interfacev6=$(uci -q get network.$interface6_name)\n    num=$(uci show firewall | grep \"name='wan'\" | wc -l)\n    if [ \"$env4\" -eq 1 ];then\n        if [ -z \"$interface\" ];then\n            uci set network.${interface_name}=interface\n            uci set network.${interface_name}.modem_config=\"${modem_config}\"\n            uci set network.${interface_name}.proto=\"${proto}\"\n            uci set network.${interface_name}.defaultroute='1'\n            uci set network.${interface_name}.metric=\"${metric}\"\n            uci del network.${interface_name}.dns\n            if [ -n \"$dns_list\" ];then\n                uci set network.${interface_name}.peerdns='0'\n                for dns in $dns_list;do\n                    uci add_list network.${interface_name}.dns=\"${dns}\"\n                done\n            else\n                uci del network.${interface_name}.peerdns\n            fi\n            local wwan_num=$(uci -q get firewall.@zone[$num].network | grep -w \"${interface_name}\" | wc -l)\n            if [ \"$wwan_num\" = \"0\" ]; then\n                append_to_fw_zone $num ${interface_name}\n            fi\n            network_reload_flag=1\n            firewall_reload_flag=1\n            m_debug \"create interface $interface_name with proto $proto and metric $metric\"\n        fi\n    else\n        if [ -n \"$interface\" ];then\n            uci delete network.${interface_name}\n            network_reload_flag=1\n            m_debug \"delete interface $interface_name\"\n        fi\n    fi\n    if [ \"$env6\" -eq 1 ];then\n        if [ -z \"$interfacev6\" ];then\n            # uci set network.lan.ipv6='1' # user decide themself whether to enable IPv6 on LAN.\n            # uci set network.lan.ip6assign='64'\n            uci set network.${interface6_name}='interface'\n            uci set network.${interface6_name}.modem_config=\"${modem_config}\"\n            uci set network.${interface6_name}.proto=\"${protov6}\"\n            uci set network.${interface6_name}.ifname=\"@${interface_name}\"\n            uci set network.${interface6_name}.device=\"@${interface_name}\"\n            uci set network.${interface6_name}.metric=\"${metric}\"\n            \n            local wwan6_num=$(uci -q get firewall.@zone[$num].network | grep -w \"${interface6_name}\" | wc -l)\n            if [ \"$wwan6_num\" = \"0\" ]; then\n                append_to_fw_zone $num ${interface6_name}\n            fi\n            network_reload_flag=1\n            firewall_reload_flag=1\n            m_debug \"create interface $interface6_name with proto $protov6 and metric $metric\"\n        fi\n        if [ \"$ra_master\" = \"1\" ];then\n            uci set dhcp.${interface6_name}='dhcp'\n            uci set dhcp.${interface6_name}.interface=\"${interface6_name}\"\n            uci set dhcp.${interface6_name}.ra='relay'\n            uci set dhcp.${interface6_name}.ndp='relay'\n            uci set dhcp.${interface6_name}.master='1'\n            uci set dhcp.${interface6_name}.ignore='1'\n            uci set dhcp.lan.ra='relay'\n            uci set dhcp.lan.ndp='relay'\n            uci set dhcp.lan.dhcpv6='relay'\n            dhcp_reload_flag=1\n        elif [ \"$extend_prefix\" = \"1\" ];then\n            uci set network.${interface6_name}.extendprefix=1\n            dhcpv6=$(uci -q get dhcp.${interface6_name})\n            if [ -n \"$dhcpv6\" ];then\n                uci delete dhcp.${interface6_name}\n                dhcp_reload_flag=1\n            fi\n        else\n            dhcpv6=$(uci -q get dhcp.${interface6_name})\n            if [ -n \"$dhcpv6\" ];then\n                uci delete dhcp.${interface6_name}\n                dhcp_reload_flag=1\n            fi\n        fi\n    else\n        if [ -n \"$interfacev6\" ];then\n            uci delete network.${interface6_name}\n            network_reload_flag=1\n            dhcpv6=$(uci -q get dhcp.${interface6_name})\n            if [ -n \"$dhcpv6\" ];then\n                dhcp_reload_flag=1\n            fi\n            m_debug \"delete interface $interface6_name\"\n        fi\n    fi\n\n\n    set_modem_netcard=$modem_netcard\n    if [ -z \"$set_modem_netcard\" ];then\n        m_debug \"no netcard found\"\n    fi\n    ethernet_check=$(handle_5gethernet)\n    if [ -n \"$ethernet_check\" ] && [ -n \"/sys/class/net/$ethernet_5g\" ] && [ -n \"$ethernet_5g\" ];then\n        set_modem_netcard=$ethernet_5g\n    fi\n    if [ \"$bridge_enabled\" = \"1\" ]; then\n        ensure_bridge_passthrough \"$set_modem_netcard\"\n        target_netcard=\"$bridge_device_name\"\n    else\n        cleanup_bridge_passthrough\n        target_netcard=\"$set_modem_netcard\"\n    fi\n    [ -z \"$target_netcard\" ] && target_netcard=\"$set_modem_netcard\"\n\n    #set led\n    set_led \"net\" $modem_config $set_modem_netcard\n    origin_netcard=$(uci -q get network.$interface_name.ifname)\n    origin_device=$(uci -q get network.$interface_name.device)\n    origin_metric=$(uci -q get network.$interface_name.metric)\n    origin_proto=$(uci -q get network.$interface_name.proto)\n    if [ \"$origin_netcard\" == \"$target_netcard\" ] && [ \"$origin_device\" == \"$target_netcard\" ] && [ \"$origin_metric\" == \"$metric\" ] && [ \"$origin_proto\" == \"$proto\" ];then\n        m_debug \"interface $interface_name already set to $target_netcard\"\n    else\n        uci set network.${interface_name}.ifname=\"${target_netcard}\"\n        uci set network.${interface_name}.device=\"${target_netcard}\"\n        uci set network.${interface_name}.modem_config=\"${modem_config}\"\n        if [ \"$env4\" -eq 1 ];then\n            uci set network.${interface_name}.proto=\"${proto}\"\n            uci set network.${interface_name}.metric=\"${metric}\"\n        fi\n        if [ \"$env6\" -eq 1 ];then\n            uci set network.${interface6_name}.proto=\"${protov6}\"\n            uci set network.${interface6_name}.metric=\"${metric}\"\n        fi\n        interface_update_flag=1\n        m_debug \"set interface $interface_name to $target_netcard\"\n    fi\n\n    if [ \"$bridge_qmodem_dirty\" -eq 1 ]; then\n        uci commit qmodem\n    fi\n    if [ \"$network_reload_flag\" -eq 1 ] || [ \"$interface_update_flag\" -eq 1 ] || [ \"$bridge_network_dirty\" -eq 1 ];then\n        uci commit network\n        if [ \"$bridge_network_dirty\" -eq 1 ]; then\n            /etc/init.d/network reload\n            m_debug \"network reload\"\n        else\n            ifup ${interface_name}\n            ifup ${interface6_name}\n            m_debug \"network reload\"\n        fi\n    fi\n    if [ \"$firewall_reload_flag\" -eq 1 ];then\n        uci commit firewall\n        /etc/init.d/firewall restart\n        m_debug \"firewall reload\"\n    fi\n    if [ \"$dhcp_reload_flag\" -eq 1 ];then\n        uci commit dhcp\n        /etc/init.d/dhcp restart\n        m_debug \"dhcp reload\"\n    fi\n}\n\nflush_if()\n{\n    network_reload_needed=0\n    qmodem_reload_needed=0\n    ifdown ${interface_name} >/dev/null 2>&1\n    ifdown ${interface6_name} >/dev/null 2>&1\n    config_load network\n    remove_target=\"$modem_config\"\n    config_foreach flush_ip_cb \"interface\"\n    cleanup_bridge_passthrough\n    [ \"$bridge_network_dirty\" -eq 1 ] && network_reload_needed=1\n    [ \"$bridge_qmodem_dirty\" -eq 1 ] && qmodem_reload_needed=1\n    set_led \"net\" $modem_config\n    set_led \"sim\" $modem_config 0\n    m_debug \"delete interface $interface_name\"\n    uci commit network\n    uci commit dhcp\n    [ \"$qmodem_reload_needed\" -eq 1 ] && uci commit qmodem\n    if [ \"$network_reload_needed\" -eq 1 ]; then\n        /etc/init.d/network reload\n    fi\n}\n\nflush_ip_cb()\n{\n    local network_cfg=$1\n    local bind_modem_config\n    config_get bind_modem_config \"$network_cfg\" modem_config\n    if [ \"$remove_target\" = \"$bind_modem_config\" ];then\n        uci delete network.$network_cfg\n        network_reload_needed=1\n    fi\n    \n}\n\ndial(){\n    update_config\n    m_debug \"modem_path=$modem_path,driver=$driver,interface=$interface_name,at_port=$at_port,using_sim_slot:$sim_slot,dns_list:$dns_list,bridge_enabled:$bridge_enabled,bridge_port:$bridge_port\"\n    while [ \"$dial_prepare\" != 1 ] ; do\n        sleep 5\n        update_config\n        check_dial_prepare\n        dial_prepare=$?\n    done\n    set_if\n    m_debug \"dialing $modem_path driver $driver\"\n    exec_pre_dial $modem_config\n    case $driver in\n        \"qmi\")\n            qmi_dial\n            ;;\n        \"mbim\")\n            mbim_dial\n            ;;\n        \"mhi\")\n            mhi_dial\n            ;;\n        \"ncm\")\n            at_dial_monitor\n            ;;\n        \"ecm\")\n            at_dial_monitor\n            ;;\n        \"rndis\")\n            at_dial_monitor\n            ;;\n        \"mtk_pcie\")\n            at_dial_monitor\n            ;;\n        *)\n            mbim_dial\n            ;;\n    esac\n}\n\nwwan_hang()\n{\n    pid=$(cat \"${MODEM_RUNDIR}/${modem_config}_dir/$modem_config.pid\")\n    m_debug \"wwan_hang, pid = $pid\"\n    if [ -n $pid ]; then\n        kill $pid\n    fi\n}\n\necm_hang()\n{\n    m_debug \"ecm_hang\"\n    auto_dial_hang_fail=0\n    auto_dial_hang\n    auto_dial_hang_fail=$?\n    if [ $auto_dial_hang_fail -eq 0 ]; then\n        return\n    fi\n    case \"$manufacturer\" in\n        \"quectel\")\n            at_command=\"AT+QNETDEVCTL=$pdp_index,2,1\"\n            ;;\n        \"fibocom\")\n            case \"$platform\" in\n                \"mediatek\")\n                    at_command=\"AT+CGACT=0,$pdp_index\"\n                    ;;\n                *)\n                    at_command=\"AT+GTRNDIS=0,$pdp_index\"\n                    ;;\n            esac\n            ;;\n        \"meig\")\n            at_command='AT$QCRMCALL=0,0,3,2,'$pdp_index\n            ;;\n        \"huawei\")\n            at_command=\"AT^NDISDUP=0,0\"\n            ;;\n        \"neoway\")\n            delay=3\n            at_command='AT$MYUSBNETACT=0,0'\n            ;;\n        \"gosuncn\")\n            at_command=\"AT+ZECMCALL=0\"\n            ;;\n        *)\n            at_command=\"ATI\"\n            ;;\n    esac\n    at \"${at_port}\" \"${at_command}\"\n    [ -n \"$delay\" ] && sleep \"$delay\"\n}\n\nauto_dial_stop(){\n    m_debug \"stop auto dial\"\n    case \"$manufacturer\" in\n        \"huawei\")\n        case \"$platform\" in\n            \"unisoc\")\n            ;;\n        esac\n        ;;\n    esac\n}\n\n\nhang()\n{\n    m_debug \"hang up $modem_path driver $driver\"\n    case $driver in\n        \"ncm\")\n            ecm_hang\n            ;;\n        \"ecm\")\n            ecm_hang\n            ;;\n        \"rndis\")\n            ecm_hang\n            ;;\n        \"qmi\")\n            wwan_hang\n            ;;\n        \"mbim\")\n            wwan_hang\n            ;;\n        \"mhi\")\n            wwan_hang\n            ;;\n    esac\n    flush_if\n}\n\nmbim_dial(){\n    if [ -z \"$apn\" ];then\n        apn=\"auto\"\n    fi\n    qmi_dial\n}\n\nmhi_dial()\n{\n    qmi_dial\n}\n\nqmi_dial()\n{\n    cmd_line=\"quectel-CM\"\n    [ -e \"/usr/bin/quectel-CM-M\" ] && cmd_line=\"quectel-CM-M\" && tom_modified=1\n    case $pdp_type in\n        \"ip\") cmd_line=\"$cmd_line -4\" ;;\n        \"ipv6\") cmd_line=\"$cmd_line -6\" ;;\n        \"ipv4v6\") cmd_line=\"$cmd_line -4 -6\" ;;\n        *) cmd_line=\"$cmd_line -4 -6\" ;;\n    esac\n\n    if [ -n \"$pdp_index\" ] && [ \"$userset_pdp_index\" = \"1\" ]; then\n        cmd_line=\"$cmd_line -n $pdp_index\"\n    fi\n    if [ \"$manufacturer\" = \"telit\" ] && [ \"$force_set_apn\" != \"1\" ];then\n        m_debug 'please use force apn set for telit modem'\n    fi\n    if [ -n \"$apn\" ]; then\n        cmd_line=\"$cmd_line -s $apn\"\n    fi\n    if [ -n \"$username\" ]; then\n        cmd_line=\"$cmd_line $username\"\n    fi\n    if [ -n \"$password\" ]; then\n        cmd_line=\"$cmd_line $password\"\n    fi\n    if [ \"$auth\" != \"none\" ]; then\n        cmd_line=\"$cmd_line $auth\"\n    fi\n    if [ -n \"$modem_netcard\" ]; then\n    qmi_if=$modem_netcard\n    #if is wwan* ,use the first part of the name\n    if  [[ \"$modem_netcard\" = \"wwan\"* ]];then\n        qmi_if=$(echo \"$modem_netcard\" | cut -d_ -f1)\n    fi\n    #if is rmnet* ,use the first part of the name\n    if [[ \"$modem_netcard\" = \"rmnet\"* ]];then\n        qmi_if=$(echo \"$modem_netcard\" | cut -d. -f1)\n    fi\n        cmd_line=\"${cmd_line} -i ${qmi_if}\"\n    fi\n    if [ \"$bridge_enabled\" = \"1\" ];then\n        cmd_line=\"${cmd_line} -b\"\n    fi\n    if [ \"$do_not_add_dns\" = \"1\" ];then\n        cmd_line=\"${cmd_line} -D\"\n    fi\n    if [ -e \"/usr/bin/quectel-CM-M\" ];then\n        [ -n \"$metric\" ] && cmd_line=\"$cmd_line -d -M $metric\"\n        [ \"$force_set_apn\" == \"1\" ] && cmd_line=\"$cmd_line -F\"\n    else\n        [ -n \"$metric\" ] && cmd_line=\"$cmd_line\"\n    fi\n    cmd_line=\"$cmd_line -f $log_file\"\n    while true; do\n        m_debug \"dialing: $cmd_line\"\n        $cmd_line &\n        echo \"$!\" > \"${MODEM_RUNDIR}/${modem_config}_dir/$modem_config.pid\"\n        m_debug \"pid: $!\"\n        wait\n        m_debug \"quectel-CM exited, retrying dial\"\n    done\n}\n\nat_dial()\n{\n    if [ -z \"$pdp_type\" ];then\n        pdp_type=\"IP\"\n    fi\n    [ -n \"$apn\" ] && apn_append=\",\\\"$apn\\\"\" || apn_append=\"\"\n    local at_command='AT+COPS=0,0'\n    tmp=$(at \"${at_port}\" \"${at_command}\")\n    pdp_type=$(echo $pdp_type | tr 'a-z' 'A-Z')\n    case $manufacturer in\n        \"quectel\")\n            [ \"$donot_nat\" = \"1\" ] && nat_cfg=\"AT+QCFG=\\\"nat\\\",0\" || nat_cfg=\"AT+QCFG=\\\"nat\\\",1\"\n            case $platform in\n                \"hisilicon\")\n                    at_command=\"AT+QNETDEVCTL=1,1,1\"\n                    cgdcont_command=\"\"\n                    ;;\n\n                \"unisoc\")\n                    at_command=\"AT+QNETDEVCTL=1,$pdp_index,1\" # +QNETDEVCTL: <cid>,<op>,<state> \n                    cgdcont_command=\"AT+CGDCONT=$pdp_index,\\\"$pdp_type\\\"\"$apn_append\n                    ;;\n                *)\n                    at_command=\"AT+QNETDEVCTL=3,$pdp_index,1\" #LTE Standard AT+QNETDEVCTL=<connect_type>[,<CID>[,<URC_switch>]] \n                    cgdcont_command=\"AT+CGDCONT=$pdp_index,\\\"$pdp_type\\\"\"$apn_append\n                    ;;\n            esac\n            ;;\n        \"fibocom\")\n            case $platform in\n                \"mediatek\")\n                    # delay=3\n                    # [ \"$apn\" = \"auto\" ] || [ -z \"$apn\" ] && apn=\"cbnet\"\n                    if [ \"$pdp_index\" = \"3\" ];then\n                        delay=3\n                        [ \"$apn\" = \"auto\" ] || [ -z \"$apn\" ] && apn=\"cbnet\"\n                        m_debug \"Due to a historical issue (https://github.com/FUjr/QModem/issues/179#issuecomment-3968653343), the fm350 pdp_index was incorrectly set to 3, which caused dialing to work but remain unstable. In version 2026.2.27, we have fixed this issue.\"\n                        m_debug \"To avoid unexpectedly removing legacy configuration files, we applied additional handling to ensure consistent behavior with previous versions. However, if you see this message, please manually set the pdp_index to 0. We apologize for any inconvenience caused.\"\n                    fi\n                    at_command=\"AT+CGACT=1,$pdp_index\"\n                    cgdcont_command=\"AT+CGDCONT=$pdp_index,\\\"$pdp_type\\\",\\\"$apn\\\"\"\n                    ;;\n                \"lte\")\n                    at_command=\"AT+GTRNDIS=1,$pdp_index\"\n                    cgdcont_command=\"AT+CGDCONT=$pdp_index,\\\"$pdp_type\\\"\"$apn_append\n                    if [ -n \"$auth\" ]; then\n                        case $auth in\n                            \"pap\") \n                                auth_num=1 ;;\n                            \"chap\") \n                                auth_num=2 ;;\n                            \"auto\"|\"both\"|\"MsChapV2\") \n                                auth_num=3 ;;\n                            *) \n                                auth_num=0 ;;\n                        esac\n                        if [ -n \"$username\" ] || [ -n \"$password\" ] && [ \"$auth_num\" != \"0\" ] ; then\n                            ppp_auth_command=\"AT+MGAUTH=$pdp_index,$auth_num,\\\"$username\\\",\\\"$password\\\"\"\n                        fi\n                    fi\n                    ;;\n                \"unisoc\")\n                    at_command=\"AT+GTRNDIS=1,$pdp_index\"\n                    cgdcont_command=\"AT+CGDCONT=$pdp_index,\\\"$pdp_type\\\"\"$apn_append\n                    if [ -n \"$auth\" ]; then\n                        case $auth in\n                            \"pap\") \n                                auth_num=1 ;;\n                            \"chap\") \n                                auth_num=2 ;;\n                            \"auto\"|\"both\"|\"MsChapV2\") \n                                auth_num=3 ;;\n                            *) \n                                auth_num=0 ;;\n                        esac\n                        if [ -n \"$username\" ] || [ -n \"$password\" ] && [ \"$auth_num\" != \"0\" ] ; then\n                            ppp_auth_command=\"AT+MGAUTH=$pdp_index,$auth_num,\\\"$username\\\",\\\"$password\\\"\"\n                        fi\n                    fi\n            esac\n            ;;\n        \"huawei\")\n            case $platform in\n                \"hisilicon\")\n                    at_command=\"AT^NDISDUP=1,$pdp_index\"\n                    cgdcont_command=\"AT+CGDCONT=$pdp_index,\\\"$pdp_type\\\"\"$apn_append\n                    if [ -n \"$auth\" ]; then\n                        case $auth in\n                            \"pap\") \n                                auth_num=1 ;;\n                            \"chap\") \n                                auth_num=2 ;;\n                            \"auto\"|\"both\"|\"MsChapV2\") \n                                auth_num=3 ;;\n                            *) \n                                auth_num=0 ;;\n                        esac\n                        if [ -n \"$username\" ] || [ -n \"$password\" ] && [ \"$auth_num\" != \"0\" ] ; then\n                            plmn=$(at ${at_port} \"AT+COPS=3,2;+COPS?\" | grep \"+COPS:\" | sed 's/+COPS: //g' | cut -d',' -f3 | sed 's/\\\"//g' | cut -c1-5 | grep -o  -o '[0-9]\\{5\\}')\n                            [ -z \"$plmn\" ] && plmn=\"00000\"\n                            ppp_auth_command=\"AT^AUTHDATA=$pdp_index,$auth_num,$plmn,\\\"$username\\\",\\\"$password\\\"\"\n                        fi\n                    fi\n                    ;;\n            esac\n            ;;\n        \"simcom\")\n            case $platform in\n                \"asrmicro\")                    \n                    at_command=\"AT+CGACT=1,$pdp_index\"\n                    cgdcont_command=\"AT+CGDCONT=$pdp_index,\\\"$pdp_type\\\"\"$apn_append\n                    ;;\n                \"qualcomm\")\n                    local cnmp=$(at ${at_port} \"AT+CNMP?\" | grep \"+CNMP:\" | sed 's/+CNMP: //g' | sed 's/\\r//g')\n                    at_command=\"AT+CNMP=$cnmp;+CNWINFO=1\"\n                    cgdcont_command=\"AT+CGDCONT=1,\\\"$pdp_type\\\"\"$apn_append\n                    ;;\n                \"lte\")\n                    at_command=\"AT+CGACT=1,$pdp_index\"\n                    cgdcont_command=\"AT+CGDCONT=$pdp_index,\\\"$pdp_type\\\"\"$apn_append\n                    ;;\n            esac\n            ;;\n        \"meig\")\n            case $platform in\n                \"qualcomm\")\n                    at_command='AT$QCRMCALL=1,0,3,2,'$pdp_index\n                    cgdcont_command=\"AT+CGDCONT=1,\\\"$pdp_type\\\"\"$apn_append\n                    ;;\n            esac\n            ;;\n        \"neoway\")\n            case $platform in\n                \"unisoc\")\n                    at_command='AT$MYUSBNETACT=0,1'\n                    cgdcont_command=\"AT+CGDCONT=1,\\\"$pdp_type\\\"\"$apn_append\n                    ;;\n            esac\n            ;;\n        \"telit\")\n            case $platform in\n                \"qualcomm\")\n                    at_command=\"AT#ICMAUTOCONN=1,$pdp_index\"\n                    cgdcont_command=\"AT+CGDCONT=$pdp_index,\\\"$pdp_type\\\"\"$apn_append\n                    ;;\n            esac\n            ;;\n        \"gosuncn\")\n            case $platform in\n                \"lte\")\n                    at_command=\"AT+ZECMCALL=1\"\n                    cgdcont_command=\"AT+CGDCONT=$pdp_index,\\\"$pdp_type\\\"\"$apn_append\n                    ;;\n            esac\n            ;;\n    esac\n\tm_debug \"dialing: vendor:$manufacturer; platform:$platform; driver:$driver; apn:$apn; command:$at_command pdp_index:$pdp_index\"\n    m_debug \"dial_cmd: $at_command; cgdcont_cmd: $cgdcont_command; ppp_auth_cmd: $ppp_auth_command\"\n\tcase $driver in\n        \"mtk_pcie\")\n            mbim_port=$(echo \"$at_port\" | sed 's/at/mbim/g')\n            [ -n \"$apn\" ] || apn=\"auto\"\n        \trf_status=$(umbim -d  $mbim_port radio|sed -n 's/.*swradiostate: *//p')\n        \t[ \"$rf_status\" = \"off\" ] && umbim -d  $mbim_port radio on\n        \tumbim -d $mbim_port disconnect\n        \tsleep 1\n        \tumbim -d $mbim_port connect 0 --apn $apn\n\t\t \t;;\n\t\t*)\n  \t\t\tat \"${at_port}\" \"${cgdcont_command}\"\n            [ -n \"$ppp_auth_command\" ] && at \"${at_port}\" \"$ppp_auth_command\"\n            [ -n \"$nat_cfg\" ] && at \"${at_port}\" \"$nat_cfg\"\n        \tat \"${at_port}\" \"$at_command\"\n\t\t \t;;\n\tesac\n}\n\nat_auto_dial()\n{\n    case $manufacturer in\n        \"huawei\")\n            case $platform in\n                \"unisoc\")\n                    huawei_auto_dial_unisoc\n                    return 0\n                    ;;\n            esac\n            ;;\n    esac\n    return 1\n}\n\nhuawei_auto_dial_unisoc()\n{\n    m_debug \"huawei_auto_dial: auto dial(no monitor)\"\n    m_debug \"huawei_auto_dial: vendor:$manufacturer; platform:$platform; driver:$driver; apn:$apn; command:$at_command; pdp_index:$pdp_index; huawei_dial_mode:$huawei_dial_mode; at_port:$at_port\"\n    # dial prepare\n    cgdcont_command=\"AT+CGDCONT=$pdp_index,\\\"$pdp_type\\\",\\\"$apn\\\"\"\n    at \"$at_port\" \"$cgdcont_command\"\n    # get current auto dial setting\n    at_command='AT^SETAUTODIAL?'\n    at_res=$(at \"$at_port\" \"$at_command\" | grep 'SETAUTO')\n    # return ^SETAUTODAIL:1,x\n    current_setting=${at_res##*:}\n    dial_status=$(echo \"$current_setting\" | cut -d ',' -f 1)\n    current_dial_mode=$(echo \"$current_setting\" | cut -d ',' -f 2)\n    m_debug \"current dial status: $dial_status, current dial mode: $current_dial_mode\"\n    # if dial stat is disabled, or when huawei_dial_mode is not empty and current dial mode is not equal to huawei_dial_mode, enable dial\n    if [ \"$dial_status\" = \"0\" ] || [ ! -z \"$huawei_dial_mode\" ] && [ \"$current_dial_mode\" != \"$huawei_dial_mode\" ]; then\n        [ -n \"$huawei_dial_mode\" ] && dial_mode=\",$huawei_dial_mode\" || dial_mode=\",4\"\n        at_command=\"AT^SETAUTODIAL=1$dial_mode\"\n        at \"$at_port\" \"$at_command\"\n    fi\n}\n\nauto_dial_hang_huawei_unisoc()\n{\n    m_debug \"huawei_auto_hang\"\n    at_command='AT^SETAUTODIAL?'\n    current_setting=$(at \"$at_port\" \"$at_command\" | grep 'SETAUTO')\n    # return ^SETAUTODAIL:1,x\n    current_setting=${current_setting##*:}\n    dial_status=$(echo \"$current_setting\" | cut -d ',' -f 1)\n    if [ \"$dial_status\" = \"1\" ]; then \n        at_command=\"AT^SETAUTODIAL=0\"\n        at \"$at_port\" \"$at_command\"\n        m_debug \"huawei_at_hang: auto hang done\"\n        m_debug \"huawei_at_hang: turning radio off\"\n        off_cmd=\"AT+CFUN=0\"\n        on_cmd=\"AT+CFUN=1\"\n        at \"$at_port\" \"$off_cmd\"\n        m_debug \"huawei_at_hang: turning radio on\"\n        at \"$at_port\" \"$on_cmd\"\n        return 0\n    fi\n    return 1\n}\n\nauto_dial_hang(){\n    m_debug \"auto_dial_hang\"\n    case \"$manufacturer\" in \n        \"huawei\")\n            case \"$platform\" in\n                \"unisoc\")\n                    auto_dial_hang_huawei_unisoc\n                    return $?\n                    ;;\n            esac\n            ;;\n    esac\n    return 1\n}\n\nip_change_fm350()\n{\n    m_debug \"ip_change_fm350\"\n    local public_dns1_ipv4=\"223.5.5.5\"\n    local public_dns2_ipv4=\"119.29.29.29\"\n    local netmask=\"255.255.255.0\"\n\n    if [ \"$driver\" = \"mtk_pcie\" ]; then\n        mbim_port=$(echo \"$at_port\" | sed 's/at/mbim/g')\n\n        local config=$(umbim -d $mbim_port config)\n        ipv4_config=$(echo \"$config\" | grep \"ipv4address:\" | awk '{print $2}' | cut -d'/' -f1)\n        gateway=$(echo \"$config\" | grep \"ipv4gateway:\" | awk '{print $2}')\n\n        ipv4_dns1=$(echo \"$config\" | grep \"ipv4dnsserver:\" | head -n 1 | awk '{print $2}')\n        ipv4_dns2=$(echo \"$config\" | grep \"ipv4dnsserver:\" | tail -n 1 | awk '{print $2}')\n        [ -z \"$ipv4_dns1\" ] && ipv4_dns1=\"$public_dns1_ipv4\"\n        [ -z \"$ipv4_dns2\" ] && ipv4_dns2=\"$public_dns2_ipv4\"\n        # m_debug \"umbim config: ipv4=$ipv4_config, gateway=$gateway, netmask=$netmask, dns1=$ipv4_dns1, dns2=$ipv4_dns2\"\n    else\n        at_command=\"AT+CGPADDR=$pdp_index\"\n        response=$(at ${at_port} ${at_command})\n        ipv4_config=$(echo \"$response\" | grep \"+CGPADDR:\" | grep -o '\"[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+\"' | head -1 | tr -d '\"')\n        gateway=\"${ipv4_config%.*}.1\"\n\n        response=$(at ${at_port} \"AT+GTDNS=$pdp_index\")\n        ipv4_dns=$(echo \"$response\" | grep \"+GTDNS:\" | head -1)\n        ipv4_dns1=$(echo \"$ipv4_dns\" | grep -o '\"[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+\"' | head -1 | tr -d '\"')\n        ipv4_dns2=$(echo \"$ipv4_dns\" | grep -o '\"[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+\"' | tail -1 | tr -d '\"')\n        [ -z \"$ipv4_dns1\" ] && ipv4_dns1=\"$public_dns1_ipv4\"\n        [ -z \"$ipv4_dns2\" ] && ipv4_dns2=\"$public_dns2_ipv4\"\n        uci_ipv4=$(uci -q get network.$interface_name.ipaddr)\n    fi\n    uci set network.${interface_name}.proto='static'\n    uci set network.${interface_name}.ipaddr=\"${ipv4_config}\"\n    uci set network.${interface_name}.netmask=\"${netmask}\"\n    uci set network.${interface_name}.gateway=\"${gateway}\"\n    uci set network.${interface_name}.peerdns='0'\n    uci -q del network.${interface_name}.dns\n    uci add_list network.${interface_name}.dns=\"${ipv4_dns1}\"\n    uci add_list network.${interface_name}.dns=\"${ipv4_dns2}\"\n    uci commit network\n    ifdown ${interface_name}\n    ifup ${interface_name}\n    m_debug \"set interface $interface_name to $ipv4_config\"\n\n}\n\nhandle_5gethernet()\n{\n    case $manufacturer in\n        \"quectel\")\n            case $platform in\n                \"qualcomm\")\n                    quectel_qualcomm_ethernet\n                    ;;\n                \"unisoc\")\n                    quectel_unisoc_ethernet\n                    ;;\n            esac\n            ;;\n    esac\n}\n\nquectel_unisoc_ethernet()\n{\n    case \"$driver\" in\n        \"ncm\"|\\\n        \"ecm\"|\\\n        \"rndis\")\n            check_ethernet_cmd=\"AT+QCFG=\\\"ethernet\\\"\"\n            time=0\n            while [ $time -lt 5 ]; do\n                result=$(at $at_port $check_ethernet_cmd | grep \"+QCFG:\")\n                if [ -n \"$result\" ]; then\n                    if [ -n \"$(echo $result | grep \"ethernet\\\",1\")\" ]; then\n                        echo \"1\"\n                        m_debug \"5G Ethernet mode is enabled\"\n                        break\n                    fi\n                fi\n                sleep 5\n                time=$((time+1))\n            done\n        ;;\n    esac\n}\n\nquectel_qualcomm_ethernet()\n{\n     case \"$driver\" in\n        \"mbim\")\n            eth_driver_at=\"AT+QETH=\\\"eth_driver\\\"\"\n            data_interface_at=\"AT+QCFG=\\\"data_interface\\\"\"\n            ehter_driver_expect=\"\\\"r8125\\\",1\"\n            data_interface_expect=\"\\\"data_interface\\\",1\"\n\n            time=0\n            while [ $time -lt 5 ]; do\n                eth_driver_result=$(at $at_port $eth_driver_at | grep \"+QETH:\")\n                time=$(($time+1))\n                sleep 1\n                if [ -n \"$eth_driver_result\" ];then\n                    break\n                fi\n            done\n            time=0\n            while [ $time -lt 5 ]; do\n                data_interface_result=$(at $at_port $data_interface_at | grep \"+QCFG:\")\n                time=$(($time+1))\n                sleep 1\n                if [ -n \"$data_interface_result\" ];then\n                    break\n                fi\n            done\n            eth_driver_pass=$(echo $eth_driver_result | grep \"$ehter_driver_expect\")\n            data_interface_pass=$(echo $data_interface_result | grep \"$data_interface_expect\")\n            if  [ -n \"$eth_driver_pass\" ] && [ -n \"$data_interface_pass\" ];then\n                echo \"1\"\n                m_debug \"5G Ethernet mode is enabled\"\n            fi\n            ;;\n    esac\n}\n\nhandle_ip_change()\n{\n    export ipv4\n    export ipv6\n    export connection_status\n    m_debug  \"ip changed from $ipv6_cache,$ipv4_cache to $ipv6,$ipv4\"\n    case $manufacturer in\n        \"fibocom\")\n            case $platform in\n                \"mediatek\")\n                    ip_change_fm350\n                    ;;\n            esac\n            ;;\n    esac\n}\n\ncheck_cfun(){\n    at_command=\"AT+CFUN?\"\n    response=$(at ${at_port} \"${at_command}\")\n    cfun_status=$(echo \"$response\" | tr -d \"\\r\" | grep \"+CFUN:\" | awk '{print $2}')\n    cfun_status=$(echo \"$cfun_status\" | cut -d',' -f1)\n    if [ \"$cfun_status\" = \"1\" ]; then\n        return 0\n    else\n        at_command=\"AT+CFUN=1\"\n        response=$(at ${at_port} \"${at_command}\")\n        return 1\n    fi\n}\n\ncheck_logfile_line()\n{\n    local line=$(wc -l $log_file | awk '{print $1}')\n    if [ $line -gt 300 ];then\n        echo \"\" > $log_file\n        m_debug  \"log file line is over 300,clear it\"\n    fi\n}\n\nunexpected_response_count=0\nat_dial_monitor()\n{\n    #check if support auto dial\n    check_cfun\n    if [ $? -ne 0 ]; then\n        m_debug \"CFUN is not 1, try to set it to 1\"\n        sleep 5\n        check_cfun\n        if [ $? -ne 0 ]; then\n            m_debug \"Failed to set CFUN to 1, dailing may not work properly\"\n        else\n            m_debug \"Successfully set CFUN to 1\"\n        fi\n    fi\n    auto_dial_support=0\n    at_auto_dial\n    auto_dial_support=$?\n    if [ $auto_dial_support -eq 0 ]; then\n        m_debug \"dialing service is managed by modem(auto dial), do not need monitor\"\n        while true; do\n            sleep 30\n        done\n    fi\n    at_dial\n    ipv4_cache=$ipv4\n    ipv6_cache=$ipv6\n    sleep 5\n    while true; do\n        check_ip\n        case $connection_status in\n            0)\n                at_dial\n                sleep 3\n                ;;\n            -1)\n                unexpected_response_count=$((unexpected_response_count+1))\n                if [ $unexpected_response_count -gt 3 ]; then\n                    at_dial\n                    unexpected_response_count=0\n                fi\n                sleep 5\n                ;;\n            *)\n                if [ \"$ipv4\" != \"$ipv4_cache\" ] || [ \"$ipv6\" != \"$ipv6_cache\" ]; then\n                    handle_ip_change\n                    ipv4_cache=$ipv4\n                    ipv6_cache=$ipv6\n                fi\n\n                pdp_type=$(echo $pdp_type | tr 'A-Z' 'a-z')\n                if [ \"$pdp_type\" = \"ipv4v6\" ]; then\n                    local ifup_time=$(ubus call network.interface.$interface6_name status 2>/dev/null | jsonfilter -e '@.uptime' 2>/dev/null || echo 0)\n                    local origin_device=$(uci -q get network.$interface_name.device 2>/dev/null || echo \"\")\n                    [ \"$ifup_time\" -lt 5 ] && continue\n                    rdisc6 $origin_device &\n                    ndisc6 fe80::1 $origin_device &\n                fi\n                sleep 15\n                ;;\n        esac\n        check_logfile_line\n    done\n}\n\ncase \"$2\" in\n    \"hang\")\n        debug_subject=\"modem_hang\"\n        update_config\n        hang;;\n    \"dial\")\n        case \"$state\" in\n            \"disabled\")\n                debug_subject=\"modem_hang\"\n                hang;;\n            *)\n                dial;;\n        esac\nesac\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/modem_hook.sh",
    "content": "#!/bin/sh\n. /lib/functions.sh\n\nconfig_name=\"qmodem\"\nconfig_section=$1\ninit_type=$2\n\ncase $init_type in\n    post_init)\n        # pre-add at commands\n        cfg_prefix=\"post_init\"\n        debug_subject=\"post_init\"\n        ;;\n    pre_dial)\n        # pre-dial at commands\n        cfg_prefix=\"pre_dial\"\n        debug_subject=\"pre_dial\"\n        ;;\n    *)\n        m_debug \"init_type error\"\n        exit 1\n        ;;\nesac\n\n_execute_ats(){\n    command=$1\n    res=$(at $at_port $command | tr -d '\\r')\n    m_debug \"execute_ats $config_section: $command $at_port\"\n    m_debug \"execute_ats_result $config_section: $res\"\n}\n\n. /usr/share/qmodem/modem_util.sh\nconfig_load ${config_name}\n\nconfig_get ${cfg_prefix}_delay $config_section delay\n\nconfig_get at_port $config_section  at_port\n\nif [ -f \"$at_port\" ] || [ -z \"$at_port\" ]; then\n    m_debug \"$config_section:at_port is not set or not a file\"\n    m_debug \"at_port $config_section: $at_port\"\n    exit 1\nfi\n\nif [ -n \"$delay\"  ]; then\n    sleep $delay\nfi\n\n\n\nconfig_list_foreach $config_section ${cfg_prefix}_at_cmds   _execute_ats\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/modem_port_rule.json",
    "content": "{\n    \"modem_port_rule\": {\n        \"usb\": {\n            \"305a:1421\": {\n                \"name\": \"gm800\",\n                \"mode\": \"qmi\",\n                \"option_driver\": 1,\n                \"include\": [\n                    \"1.1\"\n                ]\n            },\n            \"305a:1404\": {\n                \"name\": \"gm800\",\n                \"mode\": \"rndis\",\n                \"option_driver\": 0,\n                \"include\": [\n                    \"1.1\"\n                ]\n            },\n            \"2dee:4d23\": {\n                \"name\": \"srm825xeu\",\n                \"mode\": \"ecm\",\n                \"option_driver\": 1,\n                \"include\": [\n                    \"1.1\"\n                ]\n            },\n            \"2dee:4d38\": {\n                \"name\": \"srm825xeu\",\n                \"mode\": \"rndis\",\n                \"option_driver\": 1,\n                \"include\": [\n                    \"1.3\"\n                ]\n            },\n            \"3466:3301\": {\n                \"name\": \"mt5700m-cn\",\n                \"option_driver\": 1\n            },\n            \"2c7c:8101\": {\n                \"name\": \"rg801\",\n                \"option_driver\": 1\n            },\n            \"1782:4039\": {\n                \"name\": \"nu313-m2\",\n                \"mode\": \"ecm\",\n                \"option_driver\": 1,\n                \"include\": [\n                    \"1.2\"\n                ]\n            },\n            \"1782:4038\": {\n                \"name\": \"nu313-m2\",\n                \"mode\": \"rndis\",\n                \"option_driver\": 1,\n                \"include\": [\n                    \"1.2\"\n                ]\n            },\n            \"1782:4040\": {\n                \"name\": \"nu313-m2\",\n                \"mode\": \"ncm\",\n                \"option_driver\": 1,\n                \"include\": [\n                    \"1.2\"\n                ]\n            },\n            \"3763:3c93\": {\n                \"name\": \"nari-m601\",\n                \"mode\": \"ecm\",\n                \"option_driver\": 1,\n                \"include\": [\n                    \"1.1\"\n                ]\n            },\n            \"1782:4056\": {\n                \"name\": \"TDTECH MH5000-82M\",\n                \"mode\": \"rndis\",\n                \"option_driver\": 1,\n                \"include\": [\n                    \"1.2\"\n                ]\n            },\n            \"1782:4057\": {\n                \"name\": \"TDTECH MH5000-82M\",\n                \"mode\": \"ecm\",\n                \"option_driver\": 1,\n                \"include\": [\n                    \"1.2\"\n                ]\n            },\n            \"1782:4058\": {\n                \"name\": \"TDTECH MH5000-82M\",\n                \"mode\": \"ncm\",\n                \"option_driver\": 1,\n                \"include\": [\n                    \"1.2\"\n                ]\n            },\n            \"1e0e:9011\": {\n                \"name\": \"simcom_a8200_serias\",\n                \"mode\": \"rndis\",\n                \"option_driver\": 0,\n                \"include\": [\n                    \"1.4\",\n                    \"1.5\"\n                ]\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/modem_scan.sh",
    "content": "#/bin/sh\n\naction=$1\nconfig=$2\nslot_type=$3\nmodem_support=$(cat /usr/share/qmodem/modem_support.json)\ndebug_subject=\"modem_scan\"\nsource /lib/functions.sh\nsource /usr/share/qmodem/modem_util.sh\n\nexec_post_init()\n{\n    section_name=$1\n    /usr/share/qmodem/modem_hook.sh $section_name post_init\n}\n\nget_associate_usb()\n{\n    target_slot=$1\n    config_load qmodem\n    config_foreach _get_associated_usb_by_path modem-slot\n}\n\nget_default_alias()\n{\n    target_slot=$1\n    config_load qmodem\n    config_foreach _get_default_alias_by_slot\n}\n\nget_led_sript_by_slot()\n{\n    target_slot=$1\n    config_load qmodem\n    config_foreach _get_led_sript_by_slot\n}\n\nget_default_metric()\n{\n    target_slot=$1\n    config_load qmodem\n    config_foreach _get_default_metric_by_slot\n}\n\n_get_associated_usb_by_path()\n{\n    local cfg=\"$1\"\n    m_debug $target_slot\n    config_get _get_slot $cfg slot\n    if [ \"$target_slot\" == \"$_get_slot\" ];then\n        config_get associated_usb $cfg associated_usb\n        m_debug \\[$target_slot\\]associated_usb:$associated_usb\n    fi\n    \n}\n\n_get_default_alias_by_slot()\n{\n    local cfg=\"$1\"\n    config_get _get_slot $cfg slot\n    if [ \"$target_slot\" == \"$_get_slot\" ];then\n        config_get default_alias $cfg  alias\n    fi\n\n}\n\n_get_default_metric_by_slot()\n{\n    local cfg=\"$1\"\n    config_get _get_slot $cfg slot\n    if [ \"$target_slot\" == \"$_get_slot\" ];then\n        config_get default_metric $cfg  default_metric\n    fi\n\n}\n\n_get_led_sript_by_slot()\n{\n    local cfg=\"$1\"\n    config_get _get_slot $cfg slot\n    if [ \"$target_slot\" == \"$_get_slot\" ];then\n        config_get led_script $cfg  led_script\n    fi\n}\n\nscan()\n{\n    local slot_type=$1\n    if [ \"$slot_type\" == \"usb\" ] || [ -z \"$slot_type\" ];then\n        scan_usb\n        usb_slots=$(echo $usb_slots | uniq )\n        for slot in $usb_slots; do\n            slot_type=\"usb\"\n            add $slot\n        done\n    fi\n    if [ \"$slot_type\" == \"pcie\" ] || [ -z \"$slot_type\" ];then\n        scan_pcie\n        pcie_slots=$(echo $pcie_slots | uniq )\n        for slot in $pcie_slots; do\n            slot_type=\"pcie\"\n            add $slot\n        done\n    fi\n}\n\nscan_usb()\n{\n    usb_net_device_prefixs=\"usb eth wwan\"\n    usb_slots=\"\"\n    for usb_net_device_prefix in $usb_net_device_prefixs; do\n        usb_netdev=$(ls /sys/class/net | grep -E \"${usb_net_device_prefix}\")\n        for netdev in $usb_netdev; do\n            netdev_path=$(readlink -f \"/sys/class/net/$netdev/device/\")\n            [ -z \"$netdev_path\" ] && continue\n            [ -z \"$(echo $netdev_path | grep usb)\" ] && continue\n            usb_slot=$(basename $(dirname $netdev_path))\n            m_debug \"netdev_path: $netdev_path usb slot: $usb_slot\"\n            [ -z \"$usb_slots\" ] && usb_slots=\"$usb_slot\" || usb_slots=\"$usb_slots $usb_slot\"\n        done\n    done\n}\n\nscan_pcie()\n{\n    #beta\n    m_debug \"scan_pcie\"\n    echo 1 > /sys/bus/pci/rescan\n    sleep 1\n    pcie_net_device_prefixs=\"rmnet wwan\"\n    pcie_slots=\"\"\n    for pcie_net_device_prefix in $pcie_net_device_prefixs; do\n        pcie_netdev=$(ls /sys/class/net | grep -E \"${pcie_net_device_prefix}\")\n        for netdev in $pcie_netdev; do\n            netdev_path=$(readlink -f \"/sys/class/net/$netdev/device/\")\n            [ -z \"$netdev_path\" ] && continue\n            [ -z \"$(echo $netdev_path | grep pci)\" ] && continue\n            # pcie_slot=$(basename $(dirname $netdev_path))\n\t    pcie_slot=$(echo \"$netdev_path\" | tr '/' '\\n' | grep -E '^[0-9a-fA-F]{4}:[0-9a-fA-F:.]+$' | tail -n1)\n            [ \"$pcie_slot\" == \"net\" ] && continue\n            m_debug \"netdev_path: $netdev_path pcie slot: $pcie_slot\"\n            [ -z \"$pcie_slots\" ] && pcie_slots=\"$pcie_slot\" || pcie_slots=\"$pcie_slots $pcie_slot\"\n        done\n    done\n}\n\nscan_pcie_slot_interfaces()\n{\n    local slot=$1\n    local slot_path=\"/sys/bus/pci/devices/$slot\"\n    net_devices=\"\"\n    dun_devices=\"\"\n    [ ! -d \"$slot_path\" ] && return\n    local short_slot_name=`echo ${slot:2:-2} |tr \":\" \".\"`\n    local slot_interfaces=$(ls $slot_path | grep -E \"_*${short_slot_name}_\")\n    for interface in $slot_interfaces; do\n        unset device\n        unset dun_device\n        interface_driver_path=\"$slot_path/$interface/driver\"\n        [ ! -d \"$interface_driver_path\" ] && continue\n        interface_driver=$(basename $(readlink $interface_driver_path))\n        [ -z \"$interface_driver\" ] && continue\n        case $interface_driver in\n            mhi_netdev)\n                net_path=\"$slot_path/$interface/net\"\n                [ ! -d \"$net_path\" ] && continue\n                device=$(ls $net_path)\n                [ -z \"$net_devices\" ] && net_devices=\"$device\" || net_devices=\"$net_devices $device\"\n                ;;\n            mhi_uci_q)\n                dun_device=$(ls \"$slot_path/$interface/mhi_uci_q\" | grep mhi_DUN)\n                [ -z \"$dun_device\" ] && continue\n                dun_device_path=\"$slot_path/$interface/mhi_uci_q/$dun_device\"\n                [ ! -d \"$dun_device_path\" ] && continue\n                dun_device_path=$(readlink -f \"$dun_device_path\")\n                [ ! -d \"$dun_device_path\" ] && continue\n                dun_device=$(basename \"$dun_device_path\")\n                [ -z \"$dun_device\" ] && continue\n                [ -z \"$dun_devices\" ] && dun_devices=\"$dun_device\" || dun_devices=\"$dun_devices $dun_device\"\n                ;;\n        esac\n    done\n    interface_mhi_path=\"$slot_path/mhi0\"\n    if [ ! -z \"$interface_mhi_path\" ]; then\n        wwan0_path=\"$slot_path/mhi0/wwan/wwan0\"\n        if [  -d \"$wwan0_path\" ];then\n          dun_device=$(ls \"$wwan0_path\" | grep wwan0at0)\n          [ ! -z \"$dun_device\" ] &&  dun_device_path=\"$wwan0_path/$dun_device\"\n          [ ! -z \"$dun_device_path\" ] &&  dun_devices=$(basename \"$dun_device_path\") \n        fi\n    fi\n    #mt_t7xx device\n    wwan_path=\"$slot_path/wwan\"\n    if [  -d \"$wwan_path\" ]; then\n        net_devices=$(ls \"$wwan_path\" | grep -E \"wwan[0-9]\")\n        devices_path=\"$wwan_path/$net_devices\"\n        if [ -d \"$devices_path\" ];then\n            mbim_devices=$(ls \"$devices_path\" | grep -E \"wwan[0-9]mbim[0-9]\")\n            dun_devices=$(ls \"$devices_path\" | grep -E \"wwan[0-9]at[0-9]\")\n        fi\n    fi\n    m_debug \"net_devices: $net_devices dun_devices: $dun_devices\"\n    at_ports=\"$dun_devices\" \n    [ -n \"$net_devices\" ] && get_associate_usb $slot\n    if [ -n \"$associated_usb\" ] && [ -d \"/sys/bus/usb/devices/$associated_usb\" ]; then\n        echo checking associated_usb: $associated_usb\n        local assoc_usb_path=\"/sys/bus/usb/devices/$associated_usb\"\n        local slot_interfaces=$(ls $assoc_usb_path | grep -E \"$associated_usb:[0-9]\\.[0-9]+\")\n        echo checking slot_interfaces: $slot_interfaces\n        slot_vid=$(cat \"$assoc_usb_path/$interface/idVendor\")\n        slot_pid=$(cat \"$assoc_usb_path/$interface/idProduct\")\n        modem_port_rule=$(cat /usr/share/qmodem/modem_port_rule.json)\n        modem_port_config=$(echo $modem_port_rule | jq --arg id \"$slot_vid:$slot_pid\" '.modem_port_rule.usb[$id]')\n        included_ports=$(echo $modem_port_config | jq -r '.include // empty')\n        for interface in $slot_interfaces; do\n            unset device\n            unset ttyUSB_device\n            unset ttyACM_device\n            interface_driver_path=\"$assoc_usb_path/$interface/driver\"\n            if_port=$(echo \"$interface\" | grep -oE \"[0-9]+\\.[0-9]+$\" || echo \"\")\n            include_ports=$(echo $included_ports | jq --arg port \"$if_port\" 'index($port)')\n            [ ! -d \"$interface_driver_path\" ] && continue\n            interface_driver=$(basename $(readlink $interface_driver_path))\n            [ -z \"$interface_driver\" ] && continue\n            case $interface_driver in\n                option|\\\n                cdc_acm|\\\n                usbserial_generic|\\\n                qcserial|\\\n                usbserial)\n                    ttyUSB_device=$(ls \"$assoc_usb_path/$interface/\" | grep ttyUSB)\n                    ttyACM_device=$(ls \"$assoc_usb_path/$interface/\" | grep ttyACM)\n                    [ -z \"$ttyUSB_device\" ] && [ -z \"$ttyACM_device\" ] && continue\n                    if [ -n \"$included_ports\" ]; then\n                        if [ -n \"$if_port\" ]; then\n                            index=$(echo $included_ports | jq --arg port \"$if_port\" 'index($port)')\n                            m_debug \"included_ports: $included_ports if_port: $if_port index: $index\"\n                            [ \"$index\" != \"null\" ] || continue\n                        fi\n                    fi\n                    [ -n \"$ttyUSB_device\" ] && device=\"$ttyUSB_device\"\n                    [ -n \"$ttyACM_device\" ] && device=\"$ttyACM_device\"\n                    [ -z \"$tty_devices\" ] && tty_devices=\"$device\" || tty_devices=\"$tty_devices $device\"\n                ;;\n            esac \n        done\n        at_ports=\"$dun_devices $tty_devices\"\n    fi\n    validate_at_port\n}\n\nscan_usb_slot_interfaces()\n{\n    local slot=$1\n    local slot_path=\"/sys/bus/usb/devices/$slot\"\n    net_devices=\"\"\n    tty_devices=\"\"\n    [ ! -d \"$slot_path\" ] && return\n    slot_vid=$(cat \"$slot_path/$interface/idVendor\")\n    slot_pid=$(cat \"$slot_path/$interface/idProduct\")\n    local slot_interfaces=$(ls $slot_path | grep -E \"$slot:[0-9]\\.[0-9]+\")\n    for interface in $slot_interfaces; do\n        unset device\n        unset ttyUSB_device\n        unset ttyACM_device\n        interface_driver_path=\"$slot_path/$interface/driver\"\n        [ ! -d \"$interface_driver_path\" ] && continue\n        interface_driver=$(basename $(readlink \"$interface_driver_path\"))\n        modem_port_rule=$(cat /usr/share/qmodem/modem_port_rule.json)\n        modem_port_config=$(echo $modem_port_rule | jq --arg id \"$slot_vid:$slot_pid\" '.modem_port_rule.usb[$id]')\n        included_ports=$(echo $modem_port_config | jq -r '.include // empty')\n        [ -z \"$interface_driver\" ] && continue\n\n        local if_port=$(echo \"$interface\" | grep -oE \"[0-9]+\\.[0-9]+$\" || echo \"\")\n\n        case $interface_driver in\n            option|\\\n            cdc_acm|\\\n            qcserial|\\\n            usbserial_generic|\\\n            usbserial)\n                ttyUSB_device=$(ls \"$slot_path/$interface/\" | grep ttyUSB)\n                ttyACM_device=$(ls \"$slot_path/$interface/\" | grep ttyACM)\n                [ -z \"$ttyUSB_device\" ] && [ -z \"$ttyACM_device\" ] && continue\n                [ -n \"$ttyUSB_device\" ] && device=\"$ttyUSB_device\"\n                [ -n \"$ttyACM_device\" ] && device=\"$ttyACM_device\"\n\n                local if_port=$(echo \"$interface\" | grep -oE \"[0-9]+\\.[0-9]+$\" || echo \"\")\n                if [ -n \"$included_ports\" ]; then\n                    if [ -n \"$if_port\" ]; then\n                        index=$(echo $included_ports | jq --arg port \"$if_port\" 'index($port)')\n                        m_debug \"included_ports: $included_ports if_port: $if_port index: $index\"\n                        [ \"$index\" != \"null\" ] || continue\n                    fi\n                fi\n                [ -z \"$tty_devices\" ] && tty_devices=\"$device\" || tty_devices=\"$tty_devices $device\"\n                \n            ;;\n            qmi_wwan*|\\\n            cdc_mbim|\\\n            *cdc_ncm|\\\n            cdc_ether|\\\n            rndis_host)\n                net_path=\"$slot_path/$interface/net\"\n                [ ! -d \"$net_path\" ] && continue\n                device=$(ls $net_path)\n                [ -z \"$net_devices\" ] && net_devices=\"$device\" || net_devices=\"$net_devices $device\"\n            ;;\n        esac \n    done\n    m_debug \"net_devices: $net_devices tty_devices: $tty_devices\"\n    at_ports=\"$tty_devices\"\n    validate_at_port\n}\n\nvalidate_at_port()\n{\n    valid_at_ports=\"\"\n    for at_port in $at_ports; do\n        dev_path=\"/dev/$at_port\"\n        [ ! -e \"$dev_path\" ] && continue\n        #disable at-daemon binding\n        ubus call at-daemon close '{ \"at_port\": \"'$dev_path'\" }' 2>/dev/null\n        res=$(fastat $dev_path \"ATI\")\n        [ -z \"$res\" ] && continue\n        !(echo \"$res\" | grep -qE 'OK|ATI') && continue\n        valid_at_port=\"$at_port\"\n        [ -z \"$valid_at_ports\" ] && valid_at_ports=\"$valid_at_port\" || valid_at_ports=\"$valid_at_ports $valid_at_port\"\n    done\n}\n\nmatch_config()\n{\n    local name=$(echo $1 | sed 's/\\r//g' | tr 'A-Z' 'a-z')\n    [[ \"$name\" = *\"nl668\"* ]] && name=\"nl668\"\n    [[ \"$name\" = *\"nl678\"* ]] && name=\"nl678\"\n\n    [[ \"$name\" = *\"em120k\"* ]] && name=\"em120k\"\n\n    #FM350-GL-00 5G Module\n    [[ \"$name\" = *\"fm350-gl\"* ]] && name=\"fm350-gl\"\n    \n    #FM190W-GL 5G Module\n    [[ \"$name\" = *\"fm190w-gl\"* ]] && name=\"fm190w-gl\"\n\n    [[ \"$name\" = *\"rm500u-ea\"* ]] && name=\"rm500u-ea\"\n    #t99w175\n    [[ \"$name\" = *\"mv31-w\"* ]] || [[ \"$name\" = *\"T99W175\"* ]] && name=\"t99w175\"\n\n    [[ \"$name\" = *\"T99W373\"* ]] && name=\"t99w373\"\n\n    [[ \"$name\" = *\"dp25-42843-47\"* ]] && name=\"t99w640\"\n\n    [[ \"$name\" = *\"SIM8380G\"* ]] && name=\"SIM8380G-M2\"\n\n    #rg200u-cn\n    [[ \"$name\" = *\"rg200u-cn\"* ]] && name=\"rg200u-cn\"\n    \n    #nu313-m2\n    [[ \"$name\" = *\"nu313-m2\"* ]] && name=\"srm821\"\n\n    #nari-m601\n    [[ \"$name\" = *\"m601\"* ]] && name=\"n510m\"\n\n    modem_config=$(echo $modem_support | jq '.modem_support.\"'$slot_type'\".\"'$name'\"')\n    [ \"$modem_config\" == \"null\"  ] && return\n    [ -z \"$modem_config\"  ] && return\n    modem_name=$name\n    manufacturer=$(echo $modem_config | jq -r \".manufacturer\")\n    platform=$(echo $modem_config | jq -r \".platform\")\n    suggest_pdp_index=$(echo $modem_config | jq -r \".pdp_index\")\n    modes=$(echo $modem_config | jq -r \".modes[]\")\n    wcdma_available_band=$(echo $modem_config | jq -r \".wcdma_band\")\n    lte_available_band=$(echo $modem_config | jq -r \".lte_band\")\n    nsa_available_band=$(echo $modem_config | jq -r \".nsa_band\")\n    sa_available_band=$(echo $modem_config | jq -r \".sa_band\")\n}\n\nget_model_name_by_id()\n{\n    local id=$1\n    local name=$(echo $modem_support | jq -r '.modem_support.\"'$slot_type'\" | to_entries[] | select(.value.id==\"'$id'\") | .key')\n    modem_config=$(echo $modem_support | jq '.modem_support.\"'$slot_type'\".\"'$name'\"')\n    [ \"$modem_config\" == \"null\"  ] && return\n    [ -z \"$modem_config\"  ] && return\n    modem_name=$name\n    manufacturer=$(echo $modem_config | jq -r \".manufacturer\")\n    platform=$(echo $modem_config | jq -r \".platform\")\n    suggest_pdp_index=$(echo $modem_config | jq -r \".pdp_index\")\n    modes=$(echo $modem_config | jq -r \".modes[]\")\n    wcdma_available_band=$(echo $modem_config | jq -r \".wcdma_band\")\n    lte_available_band=$(echo $modem_config | jq -r \".lte_band\")\n    nsa_available_band=$(echo $modem_config | jq -r \".nsa_band\")\n    sa_available_band=$(echo $modem_config | jq -r \".sa_band\")\n}\n\nget_modem_model()\n{\n    local at_port=$1\n    sleep 1\n    cgmm=$(at $at_port \"AT+CGMM\")\n    sleep 1\n    cgmm_1=$(at $at_port \"AT+CGMM?\")\n    sleep 1\n    gmm=$(at $at_port \"AT+GMM\")\n    name_1=$(echo -e \"$cgmm\" |grep \"+CGMM: \" | awk -F': ' '{print $2}')\n    name_2=$(echo -e \"$cgmm_1\" |grep \"+CGMM: \" | awk -F'\"' '{print $2} '| cut -d ' ' -f 1)\n    name_3=$(echo -e \"$cgmm\" | sed -n '2p')\n    name_4=$(echo -e \"$cgmm\" | sed -n '3p')\n    name_5=$(echo -e \"$cgmm\" |grep \"+CGMM: \" | awk -F'\"' '{print $2} '| cut -d ' ' -f 1)\n    name_6=$(echo -e \"$gmm\" | sed -n '2p')\n    name_7=$(echo -e \"$gmm\" | sed -n '3p')\n    modem_name=\"\"\n\n    [ -n \"$name_1\" ] && match_config \"$name_1\"\n    [ -n \"$name_2\" ] && [ -z \"$modem_name\" ] && match_config \"$name_2\"\n    [ -n \"$name_3\" ] && [ -z \"$modem_name\" ] && match_config \"$name_3\"\n    [ -n \"$name_4\" ] && [ -z \"$modem_name\" ] && match_config \"$name_4\"\n    [ -n \"$name_5\" ] && [ -z \"$modem_name\" ] && match_config \"$name_5\"\n    [ -n \"$name_6\" ] && [ -z \"$modem_name\" ] && match_config \"$name_6\"\n    [ -n \"$name_7\" ] && [ -z \"$modem_name\" ] && match_config \"$name_7\"\n    [ -z \"$modem_name\" ] && return 1\n    return 0\n}\n\nadd()\n{\n    local slot=$1\n    lock -n /tmp/lock/modem_add_$slot\n    [ $? -eq 0 ] || return\n    #slot_type is usb or pcie\n    #section name is replace slot .:- with _ \n    section_name=$(echo $slot | sed 's/[\\.:-]/_/g')\n    is_exist=$(uci -q get qmodem.$section_name)\n    is_fixed_device=$(uci -q get qmodem.${section_name}.fixed_device)\n    if [ \"$is_fixed_device\" == \"1\" ];then\n        m_debug \"modem $modem_name slot $slot slot_type $slot_type is fixed device, skip\"\n        lock -u /tmp/lock/modem_add_$slot\n        exec_post_init $section_name\n        return\n    fi\n    case $slot_type in\n        \"usb\")\n            scan_usb_slot_interfaces $slot\n            modem_path=\"/sys/bus/usb/devices/$slot/\"\n            ;;\n        \"pcie\")\n            #under test\n            scan_pcie_slot_interfaces $slot\n            modem_path=\"/sys/bus/pci/devices/$slot/\"\n            ;;\n    esac\n    #if no netdev return\n    [ -z \"$net_devices\" ] && lock -u /tmp/lock/modem_add_$slot && return\n    for trys in $(seq 1 3);do\n        for at_port in $valid_at_ports; do\n            m_debug \"try at port $at_port;time $trys\"\n            get_modem_model \"/dev/$at_port\"\n            [ $? -eq 0 ] && break || modem_name=\"\"\n        done\n        [ -n \"$modem_name\" ] && break\n        sleep 1\n    done\n    if [ -z \"$modem_name\" ];then\n        m_debug \"modem $modem_name not found, try to get modem model by id\"\n        product_id=$(cat $modem_path/idProduct)\n        vendor_id=$(cat $modem_path/idVendor)\n        id=\"$vendor_id:$product_id\"\n        get_model_name_by_id $id\n    fi\n    [ -z \"$modem_name\" ] && lock -u /tmp/lock/modem_add_$slot && return\n    m_debug  \"add modem $modem_name slot $slot slot_type $slot_type\"\n    if [ -n \"$is_exist\" ]; then\n        #network at_port state name 不变，则不需要重启网络\n        orig_network=$(uci -q get qmodem.$section_name.network)\n        orig_at_port=$(uci -q get qmodem.$section_name.at_port)\n        orig_state=$(uci -q get qmodem.$section_name.state)\n        orig_name=$(uci -q get qmodem.$section_name.name)\n        uci -q del qmodem.$section_name.modes\n        uci -q del qmodem.$section_name.valid_at_ports\n        uci -q del qmodem.$section_name.tty_devices\n        uci -q del qmodem.$section_name.net_devices\n        uci -q del qmodem.$section_name.ports\n        uci -q set qmodem.$section_name.state=\"enabled\"\n    else\n    \n    #aqcuire lock\n        lock /tmp/lock/modem_add\n        unset default_alias\n        unset default_metric\n        get_default_alias $slot\n        get_default_metric $slot\n        get_led_sript_by_slot $slot\n        modem_count=$(uci -q get qmodem.main.modem_count)\n        [ -z \"$modem_count\" ] && modem_count=0\n        modem_count=$(($modem_count+1))\n        uci -q set qmodem.main.modem_count=$modem_count\n        uci -q set qmodem.$section_name=modem-device\n        [ -n \"$default_alias\" ] && uci -q set  qmodem.${section_name}.alias=\"$default_alias\"\n        [ -n \"$led_script\" ] && uci -q set qmodem.${section_name}.led_script=\"$led_script\"\n        uci commit qmodem\n        lock -u /tmp/lock/modem_add\n    #release lock\n        metric=$(($modem_count+10))\n        [ -n \"$default_metric\" ] && metric=$default_metric\n        uci -q batch << EOF\nset qmodem.$section_name.path=\"$modem_path\"\nset qmodem.$section_name.data_interface=\"$slot_type\"\nset qmodem.$section_name.enable_dial=\"1\"\nset qmodem.$section_name.soft_reboot=\"1\"\nset qmodem.$section_name.extend_prefix=\"1\"\nset qmodem.$section_name.pdp_type=\"ipv4v6\"\nset qmodem.$section_name.state=\"enabled\"\nset qmodem.$section_name.metric=$metric\nEOF\n    fi\n    uci -q batch <<EOF\nset qmodem.$section_name.name=$modem_name\nset qmodem.$section_name.network=$net_devices\nset qmodem.$section_name.manufacturer=$manufacturer\nset qmodem.$section_name.platform=$platform\nset qmodem.$section_name.suggest_pdp_index=$pdp_index\nEOF\n\n    [ -n \"$wcdma_available_band\" ] && uci -q set qmodem.$section_name.wcdma_band=$wcdma_available_band\n    [ -n \"$lte_available_band\" ] && uci -q set qmodem.$section_name.lte_band=$lte_available_band\n    [ -n \"$nsa_available_band\" ] && uci -q set qmodem.$section_name.nsa_band=$nsa_available_band\n    [ -n \"$sa_available_band\" ] && uci -q set qmodem.$section_name.sa_band=$sa_available_band\n\n    for mode in $modes; do\n        uci -q add_list qmodem.$section_name.modes=$mode\n    done\n    for at_port in $valid_at_ports; do\n        uci -q add_list qmodem.$section_name.valid_at_ports=\"/dev/$at_port\"\n        uci -q set qmodem.$section_name.at_port=\"/dev/$at_port\"\n    done\n    for at_port in $at_ports; do\n        uci -q add_list qmodem.$section_name.ports=\"/dev/$at_port\"\n    done\n    [ \"$option_driver\" == \"1\" ] && uci -q set qmodem.$section_name.option_driver=\"1\"\n    uci commit qmodem\n    mkdir -p /var/run/qmodem/${section_name}_dir\n    lock -u /tmp/lock/modem_add_$slot\n#增加预初始化脚本\n    exec_post_init $section_name\n#判断是否重启网络\n    [ -n \"$is_exist\" ] && [ \"$orig_network\" == \"$net_devices\" ] && [ \"$orig_at_port\" == \"/dev/$at_port\" ] && [ \"$orig_state\" == \"enabled\" ] && [ \"$orig_name\" == \"$modem_name\" ] && return\n    /etc/init.d/qmodem_network reload\n}\n\nremove()\n{\n    section_name=$1\n    m_debug  \"remove $section_name\"\n    is_exist=$(uci -q get qmodem.$section_name)\n    [ -z \"$is_exist\" ] && return\n    lock /tmp/lock/modem_remove\n    modem_count=$(uci -q get qmodem.main.modem_count)\n    [ -z \"$modem_count\" ] && modem_count=0\n    modem_count=$(($modem_count-1))\n    uci -q set qmodem.main.modem_count=$modem_count\n    uci commit qmodem\n    uci -q batch <<EOF\ndel qmodem.${section_name}\ndel network.${section_name}\ndel network.${section_name}v6\ndel dhcp.${section_name}\ncommit network\ncommit dhcp\ncommit qmodem\nEOF\n    lock -u /tmp/lock/modem_remove    \n}\n\ndisable()\n{\n    local slot=$1\n    section_name=$(echo $slot | sed 's/[\\.:-]/_/g')\n    #reorder to first\n    uci -q reorder qmodem.$section_name=\"1\"\n    uci -q set qmodem.$section_name.state=\"disabled\"\n    uci commit qmodem\n}\n\ncase $action in\n    \"add\")\n        debug_subject=\"modem_scan_add\"\n        add $config $slot_type\n        ;;\n    \"remove\")\n        debug_subject=\"modem_scan_remove\"\n        [ -z \"$config\" ] && exit 1\n        remove $config\n        ;;\n    \"disable\")\n        debug_subject=\"modem_scan_disable\"\n        disable $config\n        ;;\n    \"scan\")\n        debug_subject=\"modem_scan_scan\"\n        [ -n \"$config\" ] && delay=$config && sleep $delay\n        lock -n /tmp/lock/modem_scan \n        [ $? -eq 1 ] && exit 0\n        scan $slot_type\n        lock -u /tmp/lock/modem_scan\n        ;;\nesac\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/modem_support.json",
    "content": "{\n    \"modem_support\": {\n        \"usb\": {\n            \"s10\": {\n                \"manufacturer_id\": \"12dc\",\n                \"manufacturer\": \"huawei\",\n                \"platform\": \"hisilicon\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/18/19/20/25/26/28/66/71/38/39/40/41/66/71\",\n                \"nsa_band\": \"0\",\n                \"sa_band\": \"0\",\n                \"modes\": [\n                    \"rndis\"\n                ]\n            },\n            \"em05\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"lte\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/18/19/20/25/26/28/66/71/38/39/40/41/66/71\",\n                \"nsa_band\": \"0\",\n                \"sa_band\": \"0\",\n                \"modes\": [\n                    \"qmi\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\"\n                ]\n            },\n            \"em05-cn\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"lte\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/18/19/20/25/26/28/66/71/38/39/40/41/66/71\",\n                \"nsa_band\": \"0\",\n                \"sa_band\": \"0\",\n                \"modes\": [\n                    \"qmi\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\"\n                ]\n            },\n            \"ep06\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"lte\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/3/5/8\",\n                \"lte_band\": \"1/3/5/7/8/20/28/32/38/40/41\",\n                \"nsa_band\": \"0\",\n                \"sa_band\": \"0\",\n                \"modes\": [\n                    \"qmi\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\"\n                ]\n            },\n            \"em12\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"lte\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/8/9/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/9/12/13/14/17/18/19/20/21/25/26/28/29/30/32/66\",\n                \"nsa_band\": \"0\",\n                \"sa_band\": \"0\",\n                \"modes\": [\n                    \"qmi\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\"\n                ]\n            },\n            \"em120k\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"lte12\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/31/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"0\",\n                \"sa_band\": \"0\",\n                \"modes\": [\n                    \"qmi\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\"\n                ]\n            },\n            \"em160r-gl\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"lte12\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66\",\n                \"nsa_band\": \"0\",\n                \"sa_band\": \"0\",\n                \"modes\": [\n                    \"qmi\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\"\n                ]\n            },\n            \"mt5700m-cn\": {\n                \"manufacturer_id\": \"3466\",\n                \"manufacturer\": \"huawei\",\n                \"platform\": \"hisilicon\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/8\",\n                \"lte_band\": \"1/3/5/8/34/38/39/40/41\",\n                \"nsa_band\": \"41/78/79\",\n                \"sa_band\": \"1/28/41/78/79\",\n                \"modes\": [\n                    \"ecm\",\n                    \"ncm\"\n                ]\n            },\n            \"mt5710_cn\": {\n                \"manufacturer_id\": \"3466\",\n                \"manufacturer\": \"huawei\",\n                \"platform\": \"hisilicon\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/8\",\n                \"lte_band\": \"1/3/5/8/34/38/39/40/41\",\n                \"nsa_band\": \"41/78/79\",\n                \"sa_band\": \"1/28/41/78/79\",\n                \"modes\": [\n                    \"ecm\",\n                    \"ncm\"\n                ]\n            },\n            \"mh5000-31\": {\n                \"manufacturer_id\": \"12d1\",\n                \"manufacturer\": \"huawei\",\n                \"platform\": \"hisilicon\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/8\",\n                \"lte_band\": \"1/3/5/8/34/38/39/40/41\",\n                \"nsa_band\": \"41/78/79\",\n                \"sa_band\": \"1/41/78/79\",\n                \"modes\": [\n                    \"ecm\"\n                ]\n            },\n            \"mh5000-82\": {\n                \"manufacturer_id\": \"12d1\",\n                \"manufacturer\": \"huawei\",\n                \"platform\": \"unisoc\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/8\",\n                \"lte_band\": \"1/3/5/8/34/38/39/40/41\",\n                \"nsa_band\": \"41/78/79\",\n                \"sa_band\": \"1/41/78/79\",\n                \"modes\": [\n                    \"ecm\",\n                    \"ncm\",\n                    \"rndis\"\n                ]\n            },\n            \"mh5000-82m\": {\n                \"manufacturer_id\": \"12d1\",\n                \"manufacturer\": \"huawei\",\n                \"platform\": \"unisoc\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/8\",\n                \"lte_band\": \"1/3/5/8/34/38/39/40/41\",\n                \"nsa_band\": \"41/78/79\",\n                \"sa_band\": \"1/41/78/79\",\n                \"modes\": [\n                    \"ecm\",\n                    \"ncm\",\n                    \"rndis\"\n                ]\n            },\n            \"rg200u-cn\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"unisoc\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/8\",\n                \"lte_band\": \"1/3/5/8/34/38/39/40/41\",\n                \"nsa_band\": \"1/3/5/8/28/41/77/78/79\",\n                \"sa_band\": \"1/3/5/8/28/41/77/78/79\",\n                \"modes\": [\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rg801\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"hisilicon\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/8\",\n                \"lte_band\": \"1/3/5/8/34/38/39/40/41\",\n                \"nsa_band\": \"41/78/79\",\n                \"sa_band\": \"1/28/41/78/79\",\n                \"modes\": [\n                    \"ecm\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm500u-cn\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"unisoc\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/5/8\",\n                \"lte_band\": \"1/3/5/8/34/38/39/40/41\",\n                \"nsa_band\": \"1/3/5/8/28/41/77/78/79\",\n                \"sa_band\": \"1/3/5/8/28/41/77/78/79\",\n                \"modes\": [\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm500u-cnv\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"unisoc\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/5/8\",\n                \"lte_band\": \"1/3/5/8/34/38/39/40/41\",\n                \"nsa_band\": \"41/78/79\",\n                \"sa_band\": \"1/3/5/8/28/41/77/78/79\",\n                \"modes\": [\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm500u-ea\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"unisoc\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/5/8\",\n                \"lte_band\": \"1/2/3/4/5/7/8/20/28/38/40/41/66\",\n                \"nsa_band\": \"1/3/5/7/8/20/28/38/40/41/66/77/78\",\n                \"sa_band\": \"1/3/5/7/8/20/28/38/40/41/66/77/78\",\n                \"modes\": [\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm500s-ce\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/5/8\",\n                \"lte_band\": \"1/2/3/4/5/7/8/20/28/38/40/41/66\",\n                \"nsa_band\": \"1/3/5/7/8/20/28/38/40/41/66/77/78\",\n                \"sa_band\": \"1/3/5/7/8/20/28/38/40/41/66/77/78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm500q-cn\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/8\",\n                \"lte_band\": \"1/3/5/8/34/38/39/40/41\",\n                \"nsa_band\": \"41/78/79\",\n                \"sa_band\": \"1/28/41/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm510q-gl\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79/257/258/260/261\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79/257/258/260/261\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm510q-glha\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79/257/258/260/261\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79/257/258/260/261\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rg500q-ea\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/3/5/6/8/19\",\n                \"lte_band\": \"1/3/5/7/8/18/19/20/26/28/32/34/38/39/40/41/42/43\",\n                \"nsa_band\": \"1/3/5/7/8/20/28/38/40/41/77/78/79\",\n                \"sa_band\": \"1/3/5/7/8/20/28/38/40/41/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm500q-ae\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm500q-gl\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm502q-ae\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm502q-gl\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm505q-ae\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm520n-cn\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/8\",\n                \"lte_band\": \"1/3/5/8/34/38/39/40/41\",\n                \"nsa_band\": \"41/78/79\",\n                \"sa_band\": \"1/3/5/8/28/41/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm520n-eu\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/5/8\",\n                \"lte_band\": \"1/3/5/7/8/20/28/32/38/40/41/42/43\",\n                \"nsa_band\": \"1/3/5/7/8/20/28/38/40/41/75/76/77/78\",\n                \"sa_band\": \"1/3/5/7/8/20/28/38/40/41/75/76/77/78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm520n-gl\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/4/5/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm520f-gl\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/4/5/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm520f-bl\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"0\",\n                \"lte_band\": \"2/4/7/25/41/42/43/66\",\n                \"nsa_band\": \"2/7/25/41/66/77/78\",\n                \"sa_band\": \"2/7/25/41/66/77/78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm521f-gl\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/4/5/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm530n-gl\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/4/5/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rm551e-gl\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/4/5/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rg501q-eu\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/5/8\",\n                \"lte_band\": \"1/3/5/7/8/20/28/32/38/40/41/42/43\",\n                \"nsa_band\": \"1/3/5/7/8/20/28/38/40/41/77/78\",\n                \"sa_band\": \"1/3/5/7/8/20/28/38/40/41/77/78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rg520n-eu\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/5/8\",\n                \"lte_band\": \"1/3/5/7/8/20/28/32/38/40/41/42/43\",\n                \"nsa_band\": \"1/3/5/7/8/20/28/38/40/41/75/76/77/78\",\n                \"sa_band\": \"1/3/5/7/8/20/28/38/40/41/75/76/77/78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rg520n-eb\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/5/8\",\n                \"lte_band\": \"1/3/5/7/8/20/28/32/38/40/41/42/43/71\",\n                \"nsa_band\": \"1/3/5/7/8/20/28/38/40/41/71/75/76/77/78\",\n                \"sa_band\": \"1/3/5/7/8/20/28/38/40/41/71/75/76/77/78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"mh8001-eu\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rg520f-eu\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/5/8\",\n                \"lte_band\": \"1/3/5/7/8/20/28/32/38/40/41/42/43\",\n                \"nsa_band\": \"1/3/5/7/8/20/28/38/40/41/75/76/77/78\",\n                \"sa_band\": \"1/3/5/7/8/20/28/38/40/41/75/76/77/78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rg520f-eb\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/5/8\",\n                \"lte_band\": \"1/3/5/7/8/20/28/32/38/40/41/42/43/71\",\n                \"nsa_band\": \"1/3/5/7/8/20/28/38/40/41/71/75/76/77/78\",\n                \"sa_band\": \"1/3/5/7/8/20/28/38/40/41/71/75/76/77/78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rg520f-jo\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"0\",\n                \"lte_band\": \"0\",\n                \"nsa_band\": \"0\",\n                \"sa_band\": \"78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rg530f-na\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"0\",\n                \"lte_band\": \"2/4/5/7/12/13/14/17/25/26/29/30/38/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"2/5/7/12/13/14/25/26/29/30/38/41/48/66/70/71/77/78/257/258/260/261\",\n                \"sa_band\": \"2/5/7/12/13/14/25/26/29/30/38/41/48/66/70/71/77/78/257/258/260/261\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"rg650v-eu\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/3/5\",\n                \"lte_band\": \"1/3/5/7/8/20/28/32/38/40/41/42/43/71\",\n                \"nsa_band\": \"1/3/5/7/8/20/26/28/38/40/41/71/75/76/77/78\",\n                \"sa_band\": \"1/3/5/7/8/20/26/28/38/40/41/71/75/76/77/78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"fm650-cn\": {\n                \"manufacturer_id\": \"2cb7\",\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"unisoc\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"fm350-gl\": {\n                \"manufacturer_id\": \"0e8d\",\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"mediatek\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"0\",\n                \"modes\": [\n                    \"rndis\"\n                ]\n            },\n            \"fm350-gl-00\": {\n                \"manufacturer_id\": \"0e8d\",\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"mediatek\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"0\",\n                \"modes\": [\n                    \"rndis\"\n                ]\n            },\n            \"fm350r-gl\": {\n                \"manufacturer_id\": \"0e8d\",\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"mediatek\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"0\",\n                \"modes\": [\n                    \"rndis\"\n                ]\n            },\n            \"rw350r-gl\": {\n                \"manufacturer_id\": \"0e8d\",\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"mediatek\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"0\",\n                \"modes\": [\n                    \"rndis\"\n                ]\n            },\n            \"fm150-ae\": {\n                \"manufacturer_id\": \"2cb7\",\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"fm160-cn\": {\n                \"manufacturer_id\": \"2cb7\",\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"fm160-eau\": {\n                \"manufacturer_id\": \"2cb7\",\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"fm160-na\": {\n                \"manufacturer_id\": \"2cb7\",\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"fm190w-gl\": {\n                \"manufacturer_id\": \"2cb7\",\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"l610-eu\": {\n                \"manufacturer_id\": \"1782\",\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"unisoc\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"ecm\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"nl668\": {\n                \"manufacturer_id\": \"1508\",\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"lte\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"ecm\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"nl678\": {\n                \"manufacturer_id\": \"2cb7\",\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"lte\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"qmi\",\n                    \"ecm\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"srm815\": {\n                \"manufacturer_id\": \"2dee\",\n                \"manufacturer\": \"meig\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"ecm\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"srm825\": {\n                \"manufacturer_id\": \"2dee\",\n                \"manufacturer\": \"meig\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"ecm\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"ec20f\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"lte\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"ec25\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"lte\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"eg25\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"lte\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"ec21\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"lte\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"ec200a\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"lte\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"ecm\",\n                    \"mbim\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"srm825n\": {\n                \"manufacturer_id\": \"2dee\",\n                \"manufacturer\": \"meig\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"ecm\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"em9190\": {\n                \"manufacturer_id\": \"1199\",\n                \"manufacturer\": \"sierra\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"mbim\",\n                    \"rmnet\"\n                ]\n            },\n            \"mc7354\": {\n                \"manufacturer_id\": \"1199\",\n                \"manufacturer\": \"sierra\",\n                \"platform\": \"lte\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"qmi\"\n                ]\n            },\n            \"mc7355\": {\n                \"manufacturer_id\": \"1199\",\n                \"manufacturer\": \"sierra\",\n                \"platform\": \"lte\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"qmi\"\n                ]\n            },\n            \"fn990a40\": {\n                \"manufacturer_id\": \"1bc7\",\n                \"manufacturer\": \"telit\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"mbim\",\n                    \"rndis\",\n                    \"qmi\",\n                    \"ecm\"\n                ]\n            },\n            \"simcom_a8200_serias\": {\n                \"manufacturer_id\": \"1a0e\",\n                \"id\": \"1e0e:9011\",\n                \"manufacturer\": \"simcom\",\n                \"platform\": \"asrmicro\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/8\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/28/38/40/41/48/66/71/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/28/38/40/41/48/66/71/77/78/79\",\n                \"modes\": [\n                    \"ecm\",\n                    \"rndis\"\n                ]\n            },\n            \"a8200c-m2\": {\n                \"manufacturer_id\": \"1a0e\",\n                \"manufacturer\": \"simcom\",\n                \"platform\": \"asrmicro\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/8\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/28/38/40/41/48/66/71/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/28/38/40/41/48/66/71/77/78/79\",\n                \"modes\": [\n                    \"ecm\",\n                    \"rndis\"\n                ]\n            },\n            \"a7605c\": {\n                \"manufacturer_id\": \"1a0e\",\n                \"manufacturer\": \"simcom\",\n                \"platform\": \"lte\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"23/50\",\n                \"lte_band\": \"1/3/5/8/34/38/39/40/41\",\n                \"modes\": [\n                    \"ecm\",\n                    \"rndis\",\n                    \"auto\"\n                ]\n            },\n            \"simcom_d8200g\": {\n                \"manufacturer_id\": \"1a0e\",\n                \"manufacturer\": \"simcom\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/8\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/28/38/40/41/48/66/71/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/28/38/40/41/48/66/71/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"rndis\"\n                ]\n            },\n            \"simcom_sim8200ea-m2\": {\n                \"manufacturer\": \"simcom\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/8\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/28/40/41/48/66/71/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/28/40/41/48/66/71/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"rndis\"\n                ]\n            },\n            \"simcom_sim8202g-m2\": {\n                \"manufacturer\": \"simcom\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/6/8/9/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/67/71\",\n                \"nsa_band\": \"41/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/28/38/40/41/48/66/71/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"rndis\",\n                    \"mbim\"\n                ]\n            },\n            \"simcom_sim8380g-m2\": {\n                \"manufacturer\": \"simcom\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/8\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/28/40/41/48/66/71/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/28/40/41/48/66/71/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"rndis\"\n                ]\n            },\n            \"t77w968\": {\n                \"manufacturer_id\": \"413c\",\n                \"manufacturer\": \"foxconn\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/38/39/40/41/42/43/46/66\",\n                \"nsa_band\": \"0\",\n                \"sa_band\": \"0\",\n                \"modes\": [\n                    \"qmi\",\n                    \"mbim\"\n                ]\n            },\n            \"t99w175\": {\n                \"manufacturer_id\": \"05c6\",\n                \"manufacturer\": \"foxconn\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"mbim\",\n                    \"rmnet\"\n                ]\n            },\n            \"t99w373\": {\n                \"manufacturer_id\": \"05c6\",\n                \"manufacturer\": \"foxconn\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"mbim\",\n                    \"rmnet\"\n                ]\n            },\n            \"srm821\": {\n                \"manufacturer_id\": \"1782\",\n                \"manufacturer\": \"meig\",\n                \"platform\": \"unisoc\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"ecm\",\n                    \"rndis\",\n                    \"ncm\"\n                ]\n            },\n            \"n510m\": {\n                \"manufacturer_id\": \"3763\",\n                \"manufacturer\": \"neoway\",\n                \"platform\": \"unisoc\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"ecm\"\n                ]\n            },\n            \"me3630-w\" :{\n                \"manufacturer\" : \"gosuncn\",\n                \"platform\" : \"lte\",\n                \"data_interface\" : \"usb\",\n                \"pdp_index\" : \"1\",\n                \"modes\" : [\n                    \"ecm\"\n                ],\n                \"lte_band\" : \"1/3/5/8/38/39/40/41\"\n            }\n        },\n        \"pcie\": {\n            \"rm510q-gl\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79/257/258/260/261\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79/257/258/260/261\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rm500s-ce\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"t99w175\": {\n                \"manufacturer\": \"foxconn\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"mbim\"\n                ]\n            },\n            \"t99w373\": {\n                \"manufacturer\": \"foxconn\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"mbim\"\n                ]\n            },\n            \"t99w640\": {\n                \"manufacturer\": \"foxconn\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"mbim\"\n                ]\n            },\n            \"simcom_sim8380g-m2\": {\n                \"manufacturer\": \"simcom\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/8\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/28/40/41/48/66/71/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/28/40/41/48/66/71/77/78/79\",\n                \"modes\": [\n                    \"qmi\"\n                ]\n            },\n            \"rm500q-gl\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rm500q-ae\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rg500q-ea\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/3/5/6/8/19\",\n                \"lte_band\": \"1/3/5/7/8/18/19/20/26/28/32/34/38/39/40/41/42/43\",\n                \"nsa_band\": \"1/3/5/7/8/20/28/38/40/41/77/78/79\",\n                \"sa_band\": \"1/3/5/7/8/20/28/38/40/41/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rg501q-eu\": {\n                \"manufacturer_id\": \"2c7c\",\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/5/8\",\n                \"lte_band\": \"1/3/5/7/8/20/28/32/38/40/41/42/43\",\n                \"nsa_band\": \"1/3/5/7/8/20/28/38/40/41/77/78\",\n                \"sa_band\": \"1/3/5/7/8/20/28/38/40/41/77/78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rm502q-gl\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rm502q-ae\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/3/4/5/6/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/20/25/28/38/40/41/48/66/71/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rm520n-eu\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/5/8\",\n                \"lte_band\": \"1/3/5/7/8/20/28/32/38/40/41/42/43\",\n                \"nsa_band\": \"1/3/5/7/8/20/28/38/40/41/75/76/77/78\",\n                \"sa_band\": \"1/3/5/7/8/20/28/38/40/41/75/76/77/78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rm520n-gl\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/4/5/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rm520f-gl\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/4/5/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rm520f-bl\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"0\",\n                \"lte_band\": \"2/4/7/25/41/42/43/66\",\n                \"nsa_band\": \"2/7/25/41/66/77/78\",\n                \"sa_band\": \"2/7/25/41/66/77/78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rm521f-gl\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/4/5/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rm530n-gl\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/4/5/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rm551e-gl\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/2/4/5/8/19\",\n                \"lte_band\": \"1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"sa_band\": \"1/2/3/5/7/8/12/13/14/18/20/25/26/28/29/30/38/40/41/48/66/70/71/75/76/77/78/79\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rg520n-eu\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/5/8\",\n                \"lte_band\": \"1/3/5/7/8/20/28/32/38/40/41/42/43\",\n                \"nsa_band\": \"1/3/5/7/8/20/28/38/40/41/75/76/77/78\",\n                \"sa_band\": \"1/3/5/7/8/20/28/38/40/41/75/76/77/78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rg520n-eb\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/5/8\",\n                \"lte_band\": \"1/3/5/7/8/20/28/32/38/40/41/42/43/71\",\n                \"nsa_band\": \"1/3/5/7/8/20/28/38/40/41/71/75/76/77/78\",\n                \"sa_band\": \"1/3/5/7/8/20/28/38/40/41/71/75/76/77/78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"mh8001-eu\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rg520f-eb\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/5/8\",\n                \"lte_band\": \"1/3/5/7/8/20/28/32/38/40/41/42/43/71\",\n                \"nsa_band\": \"1/3/5/7/8/20/28/38/40/41/71/75/76/77/78\",\n                \"sa_band\": \"1/3/5/7/8/20/28/38/40/41/71/75/76/77/78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rg520f-eu\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/5/8\",\n                \"lte_band\": \"1/3/5/7/8/20/28/32/38/40/41/42/43\",\n                \"nsa_band\": \"1/3/5/7/8/20/28/38/40/41/75/76/77/78\",\n                \"sa_band\": \"1/3/5/7/8/20/28/38/40/41/75/76/77/78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rg520f-jo\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"0\",\n                \"lte_band\": \"0\",\n                \"nsa_band\": \"0\",\n                \"sa_band\": \"78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rg530f-na\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"0\",\n                \"lte_band\": \"2/4/5/7/12/13/14/17/25/26/29/30/38/41/42/43/46/48/66/71\",\n                \"nsa_band\": \"2/5/7/12/13/14/25/26/29/30/38/41/48/66/70/71/77/78/257/258/260/261\",\n                \"sa_band\": \"2/5/7/12/13/14/25/26/29/30/38/41/48/66/70/71/77/78/257/258/260/261\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"rg650v-eu\": {\n                \"manufacturer\": \"quectel\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"wcdma_band\": \"1/3/5\",\n                \"lte_band\": \"1/3/5/7/8/20/28/32/38/40/41/42/43/71\",\n                \"nsa_band\": \"1/3/5/7/8/20/26/28/38/40/41/71/75/76/77/78\",\n                \"sa_band\": \"1/3/5/7/8/20/26/28/38/40/41/71/75/76/77/78\",\n                \"modes\": [\n                    \"qmi\",\n                    \"gobinet\",\n                    \"mbim\"\n                ]\n            },\n            \"fm350-gl\": {\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"mediatek\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"0\",\n                \"modes\": [\n                    \"mbim\"\n                ]\n            },\n            \"fm350r-gl\": {\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"mediatek\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"0\",\n                \"modes\": [\n                    \"mbim\"\n                ]\n            },\n            \"rw350r-gl\": {\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"mediatek\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"mbim\"\n                ]\n            },\n            \"fm150-ae\": {\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"qmi\",\n                    \"mbim\"\n                ]\n            },\n            \"fm190w-gl\": {\n                \"manufacturer\": \"fibocom\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"qmi\"\n                ]\n            },\n            \"em9190\": {\n                \"manufacturer\": \"sierra\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"pcie\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"mbim\",\n                    \"rmnet\"\n                ]\n            },\n            \"fn990a40\": {\n                \"manufacturer\": \"telit\",\n                \"platform\": \"qualcomm\",\n                \"data_interface\": \"usb\",\n                \"pdp_index\": \"1\",\n                \"modes\": [\n                    \"mbim\",\n                    \"qmi\"\n                ]\n            }\n        },\n        \"device\": {\n            \"quectel\": {\n                \"unisoc\": {\n                    \"vendor_id\": [\n                        \"2c7c\"\n                    ],\n                    \"product_id\": [\n                        \"6001\",\n                        \"6002\",\n                        \"6004\",\n                        \"6005\",\n                        \"6006\",\n                        \"6007\",\n                        \"0900\",\n                        \"0901\",\n                        \"0902\",\n                        \"0903\",\n                        \"0904\"\n                    ]\n                },\n                \"qualcomm\": {\n                    \"vendor_id\": [\n                        \"2c7c\"\n                    ],\n                    \"product_id\": [\n                        \"0121\",\n                        \"0122\",\n                        \"0125\",\n                        \"0133\",\n                        \"0191\",\n                        \"0195\",\n                        \"0296\",\n                        \"0306\",\n                        \"030b\",\n                        \"0435\",\n                        \"0452\",\n                        \"0455\",\n                        \"0512\",\n                        \"0620\",\n                        \"0800\",\n                        \"0801\"\n                    ]\n                },\n                \"mediatek\": {\n                    \"vendor_id\": [\n                        \"2c7c\"\n                    ],\n                    \"product_id\": [\n                        \"0700\",\n                        \"7001\",\n                        \"7003\"\n                    ]\n                }\n            },\n            \"fibocom\": {\n                \"unisoc\": {\n                    \"vendor_id\": [\n                        \"2cb7\",\n                        \"3c93\",\n                        \"3763\"\n                    ],\n                    \"product_id\": [\n                        \"0a04\",\n                        \"0a05\",\n                        \"0a06\",\n                        \"0a07\",\n                        \"3c93\",\n                        \"ffff\"\n                    ]\n                },\n                \"qualcomm\": {\n                    \"vendor_id\": [\n                        \"2cb7\"\n                    ],\n                    \"product_id\": [\n                        \"0104\",\n                        \"0105\",\n                        \"0106\",\n                        \"0107\",\n                        \"0108\",\n                        \"0109\",\n                        \"010A\",\n                        \"010B\",\n                        \"010F\",\n                        \"0110\",\n                        \"0111\"\n                    ]\n                },\n                \"mediatek\": {\n                    \"vendor_id\": [\n                        \"0e8d\"\n                    ],\n                    \"product_id\": [\n                        \"7126\",\n                        \"7127\"\n                    ]\n                }\n            },\n            \"meig\": {\n                \"unisoc\": {\n                    \"vendor_id\": [\n                        \"2dee\",\n                        \"1782\"\n                    ],\n                    \"product_id\": [\n                        \"4d50\",\n                        \"4d51\",\n                        \"4d52\",\n                        \"4d53\",\n                        \"4039\",\n                        \"4038\",\n                        \"4040\"\n                    ]\n                },\n                \"qualcomm\": {\n                    \"vendor_id\": [\n                        \"2dee\",\n                        \"05c6\"\n                    ],\n                    \"product_id\": [\n                        \"4d22\",\n                        \"4d23\",\n                        \"4d38\",\n                        \"4d45\",\n                        \"f601\"\n                    ]\n                },\n                \"hisilicon\": {\n                    \"vendor_id\": [\n                        \"2dee\",\n                        \"4d20\"\n                    ],\n                    \"product_id\": [\n                        \"7126\",\n                        \"7127\"\n                    ]\n                },\n                \"asrmicro\": {\n                    \"vendor_id\": [\n                        \"2dee\"\n                    ],\n                    \"product_id\": [\n                        \"4d57\",\n                        \"4d58\",\n                        \"4d59\"\n                    ]\n                }\n            },\n            \"simcom\": {\n                \"qualcomm\": {\n                    \"vendor_id\": [\n                        \"1a0e\",\n                        \"1e0e\",\n                        \"17cb\"\n                    ],\n                    \"product_id\": [\n                        \"9001\",\n                        \"9011\",\n                        \"0308\"\n                    ]\n                }\n            },\n            \"foxconn\": {\n                \"qualcomm\": {\n                    \"vendor_id\": [\n                        \"17cb\",\n                        \"05c6\",\n                        \"105b\",\n                        \"413c\",\n                        \"03f0\"\n                    ],\n                    \"product_id\": [\n                        \"0306\",\n                        \"0308\",\n                        \"90d5\",\n                        \"9025\",\n                        \"e0ab\",\n                        \"81d7\",\n                        \"0a6c\"\n                    ]\n                }\n            },\n            \"neoway\": {\n                \"unisoc\": {\n                    \"vendor_id\": [\n                        \"3763\"\n                    ],\n                    \"product_id\": [\n                        \"3c93\"\n                    ]\n                }\n            },\n            \"telit\": {\n                \"qualcomm\": {\n                    \"vendor_id\": [\n                        \"1bc7\"\n                    ],\n                    \"product_id\": [\n                        \"1075\"\n                    ]\n                }\n            }\n        }\n    }\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/modem_util.sh",
    "content": "#!/bin/sh\n# Copyright (C) 2024 Tom <fjrcn@outlook.com>\n\nat()\n{\n  local at_port=$1\n  local new_str=\"${2/[$]/$}\"\n  local atcmd=\"${new_str/\\\"/\\\"}\"\n  [ \"$clear_buffer\" == \"1\" ] && options=\"$options -M\"\n  #过滤空行\n  if [ \"$(uci get qmodem.main.at_tool 2>/dev/null)\" == \"1\" ]; then\n   sms_tool_q -d $at_port at \"$atcmd\"\n  else\n   tom_modem $use_ubus_flag  -d $at_port -o a -c \"$atcmd\" $options\n  fi\n}\n\nfastat()\n{\n  local at_port=$1\n  local new_str=\"${2/[$]/$}\"\n  local atcmd=\"${new_str/\\\"/\\\"}\"\n  #过滤空行\n  if [ \"$(uci get qmodem.main.at_tool 2>/dev/null)\" == \"1\" ]; then\n   sms_tool_q -t 1 -d $at_port at \"$atcmd\"\n  else\n   tom_modem -d $at_port -o a -c \"$atcmd\" -t 1\n  fi\n}\n\nlog2file()\n{\n\tlocal subject=\"$1\"\n    local msg=\"$2\"\n\tlocal path=\"$3\"\n\n\t#打印日志\n    local update_time=$(date +\"%Y-%m-%d %H:%M:%S\")\n    echo \"[${update_time}] ${subject}:${msg} \" >> \"${path}\"\n}\n\nlog2sys()\n{\n    local subject=\"$1\"\n    local msg=\"$2\"\n    logger -t \"$subject\" \"$msg\"\n}\n\nm_debug ()\n{\n\t[ -z \"$debug_subject\" ] && subject=\"modem_util\" || subject=\"$debug_subject\"\n\t[ -n \"$direct_debug\" ] && echo \"$subject\" \"$1\"\n\tif [ -n \"$log_file\" ];then\n\t\tlog2file \"$subject\" \"$1\" \"$log_file\"\n\telse\n\t\tlog2sys \"$subject\" \"$1\"\n\tfi\n}\n\nupdate_sim_slot()\n{\n\t. /lib/functions.sh\n\tboard=$(board_name)\n\tcase $board in\n\t\tHC,HC-G80*)\n\t\t\tsim_pin=\"/sys/class/gpio/sim/value\"\n\t\t\tsim_pin_value=$(cat $sim_pin)\n\t\t\t[ \"$sim_pin_value\" == \"0\" ] && sim_slot=\"2\" || sim_slot=\"1\"\n\t\t\t#电平高表示SIM卡在卡槽1，电平低表示SIM卡在卡槽2\n\t\t\tdebug \"update_sim_slot:sim_slot=$sim_slot\"\n\t\t\t;;\n\t\tailf,gs2410|\\\n\t\thuasifei,ws3006)\n\t\t\tsim_pin=\"/sys/class/gpio/dual_sim/value\"\n\t\t\t#电平高则都在卡槽1，电平低则需要使用at查询\n\t\t\t[ \"$(cat $sim_pin)\" == \"1\" ] && sim_slot=\"1\" || at_get_slot\n\t\t\t;;\n\t\t*)\n\t\t\tat_get_slot\n\t\t\t;;\n\tesac\n}\n\nat_get_slot()\n{\n\tcase $vendor in\n\t\t\"quectel\")\n\t\t\tat_res=$(at $at_port AT+QSIMDET? |grep +QSIMDET: |awk -F: '{print $2}')\n\t\t\tcase \"$at_res\" in\n\t\t\t\t\"1\")\n\t\t\t\t\tsim_slot=\"1\"\n\t\t\t\t\t;;\n\t\t\t\t\"2\")\n\t\t\t\t\tsim_slot=\"2\"\n\t\t\t\t\t;;\n\t\t\t\t*)\n\t\t\t\t\tsim_slot=\"1\"\n\t\t\t\t\t;;\n\t\t\t*)\n\t\t\t\tsim_slot=\"1\"\n\t\t\t\t;;\n\t\t\tesac\n\t\t\t;;\n\t\t\"fibocom\")\n\t\t\tat_res=$(at $at_port AT+GTDUALSIM? |grep +GTDUALSIM: |awk -F: '{print $2}')\n\t\t\tcase $at_res in\n\t\t\t\t\"0\")\n\t\t\t\t\tsim_slot=\"1\"\n\t\t\t\t\t;;\n\t\t\t\t\"1\")\n\t\t\t\t\tsim_slot=\"2\"\n\t\t\t\t\t;;\n\t\t\t\t*)\n\t\t\t\t\tsim_slot=\"1\"\n\t\t\t\t\t;;\n\t\t\t*)\n\t\t\t\tsim_slot=\"1\"\n\t\t\t\t;;\n\t\t\tesac\n\t\t\t;;\n\t\t\"simcom\")\n\t\t\tat_res=$(at $at_port AT+SMSIMCFG? | grep \"+SMSIMCFG:\" | awk -F',' '{print $2}' | sed 's/\\r//g')\n\t\t\tcase $at_res in\n\t\t\t\t\"1\")\n\t\t\t\t\tsim_slot=\"1\"\n\t\t\t\t\t;;\n\t\t\t\t\"2\")\n\t\t\t\t\tsim_slot=\"2\"\n\t\t\t\t\t;;\n\t\t\t\t*)\n\t\t\t\t\tsim_slot=\"1\"\n\t\t\t\t\t;;\n\t\t\t*)\n\t\t\t\tsim_slot=\"1\"\n\t\t\t\t;;\n\t\t\tesac\n\t\t\t;;\n\t\t\"meig\")\n\t\t\tat_res=$(at $at_port AT^SIMSLOT? | grep \"\\^SIMSLOT:\" | awk -F': ' '{print $2}' | awk -F',' '{print $2}')\n\t\t\tcase $at_res in\n\t\t\t\t\"1\")\n\t\t\t\t\tsim_slot=\"1\"\n\t\t\t\t\t;;\n\t\t\t\t\"0\")\n\t\t\t\t\tsim_slot=\"2\"\n\t\t\t\t\t;;\n\t\t\t\t*)\n\t\t\t\t\tsim_slot=\"1\"\n\t\t\t\t\t;;\n\t\t\t*)\n\t\t\t\tsim_slot=\"1\"\n\t\t\t\t;;\n\t\t\tesac\n\t\t\t;;\n\t\t\"neoway\")\n\t\t\tat_res=$(at $at_port 'AT+SIMCROSS?' | grep \"+SIMCROSS:\" | awk -F'[ ,]' '{print $2}' | sed 's/\\r//g')\n\t\t\tcase $at_res in\n\t\t\t\t\"1\")\n\t\t\t\t\tsim_slot=\"1\"\n\t\t\t\t\t;;\n\t\t\t\t\"2\")\n\t\t\t\t\tsim_slot=\"2\"\n\t\t\t\t\t;;\n\t\t\t\t*)\n\t\t\t\t\tsim_slot=\"1\"\n\t\t\t\t\t;;\n\t\t\t*)\n\t\t\t\tsim_slot=\"1\"\n\t\t\t\t;;\n\t\t\tesac\n\t\t\t;;\n\t\t\"telit\")\n\t\t\tat_res=$(at $at_port AT#QSS? | grep \"#QSS:\" | awk -F',' '{print $3}' | sed 's/\\r//g')\n\t\t\tcase $at_res in\n\t\t\t\t\"0\")\n\t\t\t\t\tsim_slot=\"1\"\n\t\t\t\t\t;;\n\t\t\t\t\"1\")\n\t\t\t\t\tsim_slot=\"2\"\n\t\t\t\t\t;;\n\t\t\t\t*)\n\t\t\t\t\tsim_slot=\"1\"\n\t\t\t\t\t;;\n\t\t\t*)\n\t\t\t\tsim_slot=\"1\"\n\t\t\t\t;;\n\t\t\tesac\n\t\t\t;;\n\t\t*)\n\t\t\tat_q_res=$(at $at_port AT+QSIMDET? |grep +QSIMDET: |awk -F: '{print $2}')\n\t\t\tat_f_res=$(at $at_port AT+GTDUALSIM? |grep +GTDUALSIM: |awk -F: '{print $2}')\n\t\t\t[ \"$at_q_res\" == \"1\" ] && sim_slot=\"1\" && return\n\t\t\t[ \"$at_q_res\" == \"2\" ] && sim_slot=\"2\" && return\n\t\t\t[ \"$at_f_res\" == \"0\" ] && sim_slot=\"1\" && return\n\t\t\t[ \"$at_f_res\" == \"1\" ] && sim_slot=\"2\" && return\n\t\t\tsim_slot=\"1\"\n\t\t;;\n\n\tesac\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/usage_stats.sh",
    "content": "#!/bin/sh\n\n. /usr/share/libubox/jshn.sh\n\nQMODEM_UBUS_OBJECT=\"qmodem\"\nQMODEM_UBUS_METHOD=\"save_stats\"\n\nis_valid_interval()\n{\n    case \"$1\" in\n        ''|*[!0-9]*)\n            return 1\n            ;;\n        *)\n            return 0\n            ;;\n    esac\n}\n\nbuild_payload()\n{\n    local config_section=\"$1\"\n\n    json_init\n    json_add_string config_section \"$config_section\"\n    json_dump\n}\n\nsave_usage_stats()\n{\n    local config_section=\"$1\"\n    local payload response status\n\n    payload=$(build_payload \"$config_section\")\n    response=$(ubus call \"$QMODEM_UBUS_OBJECT\" \"$QMODEM_UBUS_METHOD\" \"$payload\" 2>/dev/null) || {\n        logger -t qmodem_usage_stats \"ubus call failed for $config_section\"\n        return 1\n    }\n\n    status=$(jsonfilter -s \"$response\" -e '@.result.status' 2>/dev/null)\n    if [ \"$status\" != \"1\" ]; then\n        logger -t qmodem_usage_stats \"failed to persist usage stats for $config_section\"\n        return 1\n    fi\n}\n\nloop()\n{\n    local interval=\"$1\"\n    local config_section=\"$2\"\n\n    is_valid_interval \"$interval\" || exit 1\n    [ -n \"$config_section\" ] || exit 1\n\n    while true; do\n        save_usage_stats \"$config_section\"\n        sleep \"$interval\"\n    done\n}\n\nrun_once()\n{\n    local config_section=\"$1\"\n\n    [ -n \"$config_section\" ] || exit 1\n\n    save_usage_stats \"$config_section\"\n}\n\ncase \"$1\" in\n    loop)\n        shift\n        loop \"$@\"\n        ;;\n    run_once)\n        shift\n        run_once \"$@\"\n        ;;\n    *)\n        echo \"Usage: $0 {loop <interval> <config_section>|run_once <config_section>}\" >&2\n        exit 1\n        ;;\nesac\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/vendor/dynamic_load.json",
    "content": "{\n    \"tdtech\" : \"tdtech.sh\",\n    \"quectel\" : \"quectel.sh\",\n    \"fibocom\" : \"fibocom.sh\",\n    \"meig\" : \"meig.sh\",\n    \"sierra\" : \"sierra.sh\",\n    \"simcom\" : \"simcom.sh\",\n    \"huawei\" : \"huawei.sh\",\n    \"foxconn\" : \"foxconn.sh\",\n    \"neoway\" : \"neoway.sh\",\n    \"telit\" : \"telit.sh\",\n    \"nk\" : \"nk.sh\",\n    \"gosuncn\" : \"gosuncn.sh\"\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/vendor/fibocom.sh",
    "content": "#!/bin/sh\n# Copyright (C) 2023 Siriling <siriling@qq.com>\n# Copyright (C) 2025 Fujr <fjrcn@outlook.com>\n_Vendor=\"fibocom\"\n_Author=\"Siriling Fujr\"\n_Maintainer=\"Fujr <fjrcn@outlook.com>\"\nsource /usr/share/qmodem/generic.sh\n\nvendor_get_disabled_features(){\n    json_add_string \"\" \"\"\n}\n\ndebug_subject=\"fibocom_ctrl\"\n#获取拨号模式\n# $1:AT串口\n# $2:平台\nget_mode()\n{\n    local at_command=\"AT+GTUSBMODE?\"\n    local mode_num=$(at ${at_port} ${at_command} | grep \"+GTUSBMODE:\" | sed 's/+GTUSBMODE: //g' | sed 's/\\r//g')\n\n    local mode\n    case \"$platform\" in\n        \"lte\"|\\\n        \"qualcomm\")\n            case \"$mode_num\" in\n                \"17\") mode=\"qmi\" ;; #-\n                \"31\") mode=\"qmi\" ;; #-\n                \"32\") mode=\"qmi\" ;;\n                \"34\") mode=\"qmi\" ;;\n                # \"32\") mode=\"gobinet\" ;;\n                \"18\") mode=\"ecm\" ;;\n                \"23\") mode=\"ecm\" ;; #-\n                \"33\") mode=\"ecm\" ;; #-\n                \"35\") mode=\"ecm\" ;; #-\n                \"29\") mode=\"mbim\" ;; #-\n                \"30\") mode=\"mbim\" ;;\n                \"24\") mode=\"rndis\" ;;\n                \"18\") mode=\"ncm\" ;;\n                *) mode=\"$mode_num\" ;;\n            esac\n        ;;\n        \"unisoc\")\n            case \"$mode_num\" in\n                \"31\") mode=\"ncm\" ;;\n                \"32\") mode=\"ecm\" ;;\n                \"33\") mode=\"rndis\" ;;\n                \"34\") mode=\"ecm\" ;;\n                \"35\") mode=\"ecm\" ;; #-\n                \"40\") mode=\"mbim\" ;;\n                \"41\") mode=\"mbim\" ;; #-\n                \"38\") mode=\"rndis\" ;;\n                \"39\") mode=\"rndis\" ;; #-\n                \"36\") mode=\"ncm\" ;;\n                \"37\") mode=\"ncm\" ;; #-\n                *) mode=\"$mode_num\" ;;\n            esac\n        ;;\n        \"mediatek\")\n            case \"$mode_num\" in\n                \"29\") mode=\"mbim\" ;;\n                \"40\") mode=\"rndis\" ;; #-\n                \"41\") mode=\"rndis\" ;;\n                *) mode=\"$mode_num\" ;;\n            esac\n            driver=$(get_driver)\n            case \"$driver\" in\n                \"mtk_pcie\")\n                    mode=\"mbim\" ;;\n            esac\n        ;;\n        *)\n            mode=\"$mode_num\"\n        ;;\n    esac\n    available_modes=$(uci -q get qmodem.$config_section.modes)\n    json_add_object \"mode\"\n    for available_mode in $available_modes; do\n        if [ \"$mode\" = \"$available_mode\" ]; then\n            json_add_string \"$available_mode\" \"1\"\n        else\n            json_add_string \"$available_mode\" \"0\"\n        fi\n    done\n    json_close_object\n}\n\n#设置拨号模式\nset_mode()\n{\n    local mode_config=$1\n    case \"$platform\" in\n        \"qualcomm\")\n            case \"$mode_config\" in\n                \"qmi\") mode_num=\"32\" ;;\n                # \"gobinet\")  mode_num=\"32\" ;;\n                \"ecm\") mode_num=\"18\" ;;\n                \"mbim\") mode_num=\"30\" ;;\n                \"rndis\") mode_num=\"24\" ;;\n                \"ncm\") mode_num=\"18\" ;;\n                *) mode_num=\"32\" ;;\n            esac\n        ;;\n        \"unisoc\")\n            case \"$mode_config\" in\n                \"ecm\") mode_num=\"34\" ;;\n                \"mbim\") mode_num=\"40\" ;;\n                \"rndis\") mode_num=\"38\" ;;\n                \"ncm\") mode_num=\"36\" ;;\n                *) mode_num=\"34\" ;;\n            esac\n        ;;\n        \"mediatek\")\n            case \"$mode_config\" in\n                # \"mbim\") mode_num=\"40\" ;;\n                # \"rndis\") mode_num=\"40\" ;;\n                \"rndis\") mode_num=\"41\" ;;\n                *) mode_num=\"41\" ;;\n            esac\n        ;;\n        \"lte\")\n            case \"$mode_config\" in\n                    \"qmi\") mode_num=\"17\" ;;\n                    \"ecm\") mode_num=\"18\" ;;\n                    \"rndis\") mode_num=\"24\" ;;\n                    \"ncm\") mode_num=\"18\" ;;\n                    *) mode_num=\"32\" ;;\n                esac\n            ;;\n        *)\n            mode_num=\"32\"\n        ;;\n    esac\n\n    #设置模组\n    at_command=\"AT+GTUSBMODE=${mode_num}\"\n    res=$(at \"${at_port}\" \"${at_command}\")\n    json_select \"result\"\n    json_add_string \"set_mode\" \"$res\"\n    json_add_string \"mode\" \"$mode_config\"\n    json_close_object\n}\n\n#获取网络偏好\nget_network_prefer_nr()\n{\n    at_command=\"AT+GTACT?\"\n    local network_prefer_num=$(at $at_port $at_command | grep \"+GTACT:\" | awk -F',' '{print $1}' | sed 's/+GTACT: //g')\n    \n    local network_prefer_3g=\"0\";\n    local network_prefer_4g=\"0\";\n    local network_prefer_5g=\"0\";\n\n    #匹配不同的网络类型\n    case \"$network_prefer_num\" in\n        \"1\") network_prefer_3g=\"1\" ;;\n        \"2\") network_prefer_4g=\"1\" ;;\n        \"4\")\n            network_prefer_3g=\"1\"\n            network_prefer_4g=\"1\"\n        ;;\n        \"10\")\n            network_prefer_3g=\"1\"\n            network_prefer_4g=\"1\"\n            network_prefer_5g=\"1\"\n        ;;\n        \"14\") network_prefer_5g=\"1\" ;;\n        \"16\")\n            network_prefer_3g=\"1\"\n            network_prefer_5g=\"1\"\n        ;;\n        \"17\")\n            network_prefer_4g=\"1\"\n            network_prefer_5g=\"1\"\n        ;;\n        \"20\")\n            network_prefer_3g=\"1\"\n            network_prefer_4g=\"1\"\n            network_prefer_5g=\"1\"\n        ;;\n        *)\n            network_prefer_3g=\"1\"\n            network_prefer_4g=\"1\"\n            network_prefer_5g=\"1\"\n        ;;\n    esac\n\n    json_add_object network_prefer\n    json_add_string 3G $network_prefer_3g\n    json_add_string 4G $network_prefer_4g\n    json_add_string 5G $network_prefer_5g\n    json_close_array\n}\n\n#设置网络偏好\n# $1:网络偏好配置\nset_network_prefer_nr()\n{\n    network_prefer_3g=$(echo $1 |jq -r 'contains([\"3G\"])')\n    network_prefer_4g=$(echo $1 |jq -r 'contains([\"4G\"])')\n    network_prefer_5g=$(echo $1 |jq -r 'contains([\"5G\"])')\n    count=$(echo $1 |jq -r 'length')\n    case \"$count\" in\n        \"1\")\n            if [ \"$network_prefer_3g\" = \"true\" ]; then\n                network_prefer_num=\"true\"\n            elif [ \"$network_prefer_4g\" = \"true\" ]; then\n                network_prefer_num=\"2\"\n            elif [ \"$network_prefer_5g\" = \"true\" ]; then\n                network_prefer_num=\"14\"\n            fi\n        ;;\n        \"2\")\n            if [ \"$network_prefer_3g\" = \"true\" ] && [ \"$network_prefer_4g\" = \"true\" ]; then\n                network_prefer_num=\"4\"\n            elif [ \"$network_prefer_3g\" = \"true\" ] && [ \"$network_prefer_5g\" = \"true\" ]; then\n                network_prefer_num=\"16\"\n            elif [ \"$network_prefer_4g\" = \"true\" ] && [ \"$network_prefer_5g\" = \"true\" ]; then\n                network_prefer_num=\"17\"\n            fi\n        ;;\n        \"3\") network_prefer_num=\"20\" ;;\n        *) network_prefer_num=\"10\" ;;\n    esac\n\n    #设置模组\n    case \"$network_prefer_num\" in\n        \"1\")\n            at_command=\"AT+GTACT=$network_prefer_num\"\n        ;;\n        \"2\")\n            at_command=\"AT+GTACT=$network_prefer_num\"\n        ;;\n        \"4\")\n            at_command=\"AT+GTACT=$network_prefer_num\"\n        ;;        \n        \"14\")\n            at_command=\"AT+GTACT=$network_prefer_num\"\n        ;;\n        \"17\")\n            at_command=\"AT+GTACT=$network_prefer_num\"\n        ;;        \n        \"20\")\n            at_command=\"AT+GTACT=$network_prefer_num,6,3\"\n        ;;        \n        *) network_prefer_num=\"10\" ;;\n    esac\n    res=$(at $at_port \"$at_command\")\n    json_select_object \"result\"\n    json_add_string \"status\" \"$res\"\n    json_close_object\n}\n\n#获取网络偏好\nget_network_prefer_lte()\n{\n    at_command=\"AT+GTACT?\"\n    local network_prefer_num=$(at $at_port $at_command | grep \"+GTACT:\" | awk -F',' '{print $1}' | sed 's/+GTACT: //g')\n    \n    local network_prefer_3g=\"0\";\n    local network_prefer_4g=\"0\";\n\n    #匹配不同的网络类型\n    case \"$network_prefer_num\" in\n        \"1\") network_prefer_3g=\"1\" ;;\n        \"2\") network_prefer_4g=\"1\" ;;\n        \"4\")\n            network_prefer_3g=\"1\"\n            network_prefer_4g=\"1\"\n        ;;\n        \"10\")\n            network_prefer_3g=\"1\"\n            network_prefer_4g=\"1\"\n        ;;\n        *)\n            network_prefer_3g=\"1\"\n            network_prefer_4g=\"1\"\n        ;;\n    esac\n\n    json_add_object network_prefer\n    json_add_string 3G $network_prefer_3g\n    json_add_string 4G $network_prefer_4g\n    json_close_array\n}\n\n#设置网络偏好\n# $1:网络偏好配置\nset_network_prefer_lte()\n{\n    network_prefer_3g=$(echo $1 |jq -r 'contains([\"3G\"])')\n    network_prefer_4g=$(echo $1 |jq -r 'contains([\"4G\"])')\n    count=$(echo $1 |jq -r 'length')\n    case \"$count\" in\n        \"1\")\n            if [ \"$network_prefer_3g\" = \"true\" ]; then\n                network_prefer_num=\"1\"\n            elif [ \"$network_prefer_4g\" = \"true\" ]; then\n                network_prefer_num=\"2\"\n            fi\n        ;;\n        \"2\")\n            if [ \"$network_prefer_3g\" = \"true\" ] && [ \"$network_prefer_4g\" = \"true\" ]; then\n                network_prefer_num=\"10\"\n            fi\n        ;;\n        *) network_prefer_num=\"10\" ;;\n    esac\n\n    #设置模组\n    at_command=\"AT+GTACT=$network_prefer_num\"\n    res=$(at $at_port \"$at_command\")\n    json_select_object \"result\"\n    json_add_string \"status\" \"$res\"\n    json_add_string raw \"$1\"\n    json_add_string \"network_prefer_num\" \"$network_prefer_num\"\n    json_add_string \"network_prefer_3g\" \"$network_prefer_3g\"\n    json_add_string \"network_prefer_4g\" \"$network_prefer_4g\"\n    json_close_object\n}\n\nget_network_prefer()\n{\n    case $platform in\n        \"qualcomm\")\n            get_network_prefer_nr\n            ;;\n        \"unisoc\")\n            get_network_prefer_nr\n            ;;\n        \"mediatek\")\n            get_network_prefer_nr\n            ;;\n        \"lte\")\n            get_network_prefer_lte\n            ;;\n        *)\n            get_network_prefer_nr\n            ;;\n    esac\n}\n\nset_network_prefer()\n{\n    case $platform in\n        \"qualcomm\")\n            set_network_prefer_nr $1\n            ;;\n        \"unisoc\")\n            set_network_prefer_nr $1\n            ;;\n        \"mediatek\")\n            set_network_prefer_nr $1\n            ;;\n        \"lte\")\n            set_network_prefer_lte $1\n            ;;\n        *)\n            set_network_prefer_nr $1\n            ;;\n    esac\n}\n#获取电压\n# $1:AT串口\nget_voltage()\n{\n    at_command=\"AT+CBC\"\n\tlocal voltage=$(at $at_port $at_command | grep \"+CBC:\" | awk -F',' '{print $2}' | sed 's/\\r//g')\n    [ -n $voltage ] && {\n        voltage=\"${voltage}mV\"\n    }\n    add_plain_info_entry \"voltage\" \"$voltage\" \"Voltage\"\n}\n\n#获取温度\n# $1:AT串口\nget_temperature()\n{\n    #Temperature（温度）\n    at_command=\"AT+MTSM=1,6\"\n    response=$(at $at_port $at_command | grep \"+MTSM: \" | sed 's/+MTSM: //g' | sed 's/\\r//g')\n\n    [ -z \"$response\" ] && {\n        #Fx160及以后型号\n        at_command=\"AT+GTLADC\"\n\t    response=$(at $at_port $at_command | grep \"cpu\" | awk -F' ' '{print $2}' | sed 's/\\r//g')\n        response=\"${response:0:2}\"\n    }\n\n    [ -z \"$response\" ] && {\n        #联发科平台\n        at_command=\"AT+GTSENRDTEMP=1\"\n        response=$(at $at_port $at_command | grep \"+GTSENRDTEMP: \" | awk -F',' '{print $2}' | sed 's/\\r//g')\n        response=\"${response:0:2}\"\n    }\n    \n    [ -z \"$response\" ] && {\n        #紫光平台\n        at_command=\"AT+MTSM=1\"\n        response=$(at $at_port $at_command | grep \"+MTSM: \" | sed 's/+MTSM: //g' | sed 's/\\r//g')\n    }\n\n    local temperature\n    [ -n \"$response\" ] && {\n        temperature=\"${response}$(printf \"\\xc2\\xb0\")C\"\n    }\n\n    add_plain_info_entry \"temperature\" \"$temperature\" \"Temperature\"\n}\n\n\n\n#基本信息\nbase_info()\n{\n    m_debug \"Fibocom base info\"\n\n    #Name（名称）\n    at_command=\"AT+CGMM?\"\n    name=$(at $at_port $at_command | grep \"+CGMM: \" | awk -F'\"' '{print $2}')\n    #Manufacturer（制造商）\n    at_command=\"AT+CGMI?\"\n    manufacturer=$(at $at_port $at_command | grep \"+CGMI: \" | awk -F'\"' '{print $2}')\n    #Revision（固件版本）\n    at_command=\"AT+CGMR?\"\n    revision=$(at $at_port $at_command | grep \"+CGMR: \" | awk -F'\"' '{print $2}')\n\n    class=\"Base Information\"\n    add_plain_info_entry \"name\" \"$name\" \"Name\"\n    add_plain_info_entry \"manufacturer\" \"$manufacturer\" \"Manufacturer\"\n    add_plain_info_entry \"revision\" \"$revision\" \"Revision\"\n    add_plain_info_entry \"at_port\" \"$at_port\" \"AT Port\"\n    get_temperature\n    get_voltage\n    get_connect_status\n}\n\n#获取SIM卡状态\n# $1:SIM卡状态标志\n\n\n#SIM卡信息\nsim_info()\n{\n    m_debug \"Fibocom sim info\"\n    \n    #SIM Slot（SIM卡卡槽）\n    at_command=\"AT+GTDUALSIM?\"\n\tsim_slot=$(at ${at_port} ${at_command} | grep \"+GTDUALSIM\" | awk -F'\"' '{print $2}' | sed 's/SUB//g')\n\n    #IMEI（国际移动设备识别码）\n    at_command=\"AT+CGSN?\"\n\timei=$(at ${at_port} ${at_command} | grep \"+CGSN: \" | awk -F'\"' '{print $2}')\n\n    #SIM Status（SIM状态）\n    at_command=\"AT+CPIN?\"\n\tsim_status_flag=$(at ${at_port} ${at_command} | grep \"+CPIN: \")\n    [ -z \"$sim_status_flag\" ] && {\n        sim_status_flag=$(at ${at_port} ${at_command} | grep \"+CME\")\n    }\n    sim_status=$(get_sim_status \"$sim_status_flag\")\n\n    if [ \"$sim_status\" != \"ready\" ]; then\n        return\n    fi\n\n    #ISP（互联网服务提供商）\n    at_command=\"AT+COPS?\"\n    isp=$(at ${at_port} ${at_command} | grep \"+COPS\" | awk -F'\"' '{print $2}')\n    # if [ \"$isp\" = \"CHN-CMCC\" ] || [ \"$isp\" = \"CMCC\" ]|| [ \"$isp\" = \"46000\" ]; then\n    #     isp=\"中国移动\"\n    # elif [ \"$isp\" = \"CHN-UNICOM\" ] || [ \"$isp\" = \"UNICOM\" ] || [ \"$isp\" = \"46001\" ]; then\n    #     isp=\"中国联通\"\n    # elif [ \"$isp\" = \"CHN-CT\" ] || [ \"$isp\" = \"CT\" ] || [ \"$isp\" = \"46011\" ]; then\n    #     isp=\"中国电信\"\n    # fi\n\n    #SIM Number（SIM卡号码，手机号）\n    at_command=\"AT+CNUM\"\n    sim_number=$(at ${at_port} ${at_command} | grep \"+CNUM: \" | awk -F'\"' '{print $2}')\n    [ -z \"$sim_number\" ] && {\n        sim_number=$(at ${at_port} ${at_command} | grep \"+CNUM: \" | awk -F'\"' '{print $4}')\n    }\n\t\n    #IMSI（国际移动用户识别码）\n    at_command=\"AT+CIMI?\"\n    imsi=$(at ${at_port} ${at_command} | grep \"+CIMI: \" | awk -F' ' '{print $2}' | sed 's/\"//g' | sed 's/\\r//g')\n    [ -z \"$sim_number\" ] && {\n        imsi=$(at ${at_port} ${at_command} | grep \"+CIMI: \" | awk -F'\"' '{print $2}')\n    }\n\n    #ICCID（集成电路卡识别码）\n    at_command=\"AT+ICCID\"\n    iccid=$(at ${at_port} ${at_command} | grep -o \"+ICCID:[ ]*[-0-9]\\+\" | grep -o \"[-0-9]\\{1,4\\}\")\n\t\t[ -z \"$iccid\" ] && {\n        iccid=$(at ${at_port} \"AT+CCID\" | grep -o \"+CCID:[ ]*[-0-9]\\+\" | awk -F' ' '{print $2}')\n    }\n    class=\"SIM Information\"\n    case \"$sim_status\" in\n        \"ready\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\"\n            add_plain_info_entry \"ISP\" \"$isp\" \"Internet Service Provider\"\n            add_plain_info_entry \"SIM Slot\" \"$sim_slot\" \"SIM Slot\"\n            add_plain_info_entry \"SIM Number\" \"$sim_number\" \"SIM Number\"\n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\"\n            add_plain_info_entry \"IMSI\" \"$imsi\" \"International Mobile Subscriber Identity\"\n            add_plain_info_entry \"ICCID\" \"$iccid\" \"Integrate Circuit Card Identity\"\n        ;;\n        \"miss\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\"\n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\"\n        ;;\n        \"unknown\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\"\n        ;;\n        *)\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\"\n            add_plain_info_entry \"SIM Slot\" \"$sim_slot\" \"SIM Slot\"\n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\"\n            add_plain_info_entry \"IMSI\" \"$imsi\" \"International Mobile Subscriber Identity\"\n            add_plain_info_entry \"ICCID\" \"$iccid\" \"Integrate Circuit Card Identity\"\n        ;;\n    esac\n}\n\nget_imei()\n{\n    at_command=\"AT+CGSN?\"\n    imei=$(at ${at_port} ${at_command} | grep \"+CGSN: \" | awk -F'\"' '{print $2}'| grep -E '[0-9]+')\n    json_add_string \"imei\" \"$imei\"\n}\n\nset_imei()\n{\n    imei=\"$1\"\n    case \"$platform\" in\n        \"qualcomm\")\n            at_command=\"AT+GTSN=1,7,\\\"$imei\\\"\"\n            ;;\n        \"unisoc\")\n            at_command=\"AT+GTSN=1,7,\\\"$imei\\\"\"\n            ;;\n        \"mediatek\")\n            at_command=\"AT+EGMREXT=1,7,\\\"$imei\\\"\"\n            ;;\n        \"lte\")\n            at_command=\"AT+LCTSN=1,7,\\\"$imei\\\"\"\n            ;;\n        *)\n            at_command=\"AT+GTSN=1,7,\\\"$imei\\\"\"\n            ;;\n    esac\n    #重定向stderr\n    res=$(at ${at_port} \"${at_command}\") 2>&1\n    json_select \"result\"\n    json_add_string \"set_imei\" \"$res\"\n    json_close_object\n    get_imei\n\n}\n\n#网络信息\nnetwork_info()\n{\n    m_debug \"Fibocom network info\"\n    class=\"Network Information\"\n    #Network Type（网络类型）\n    at_command=\"AT+PSRAT?\"\n    network_type=$(at ${at_port} ${at_command} | grep \"+PSRAT:\" | sed 's/+PSRAT: //g' | sed 's/\\r//g')\n\n    [ -z \"$network_type\" ] && {\n        at_command='AT+COPS?'\n        local rat_num=$(at ${at_port} ${at_command} | grep \"+COPS:\" | awk -F',' '{print $4}' | sed 's/\\r//g')\n        network_type=$(get_rat ${rat_num})\n    }\n    add_plain_info_entry \"Network Type\" \"$network_type\" \"Network Type\"\n    case $platform in\n        #qualcomm only command\n        \"qualcomm\")\n            #CSQ（信号强度）\n            #速率统计\n            at_command=\"AT+GTSTATIS?\"\n            response=$(at $at_port $at_command | grep \"+GTSTATIS:\" | sed 's/+GTSTATIS: //g' | sed 's/\\r//g')\n\n            #当前上传速率（单位，Byte/s）\n            tx_rate=$(echo $response | awk -F',' '{print $2}')\n\n            #当前下载速率（单位，Byte/s）\n            rx_rate=$(echo $response | awk -F',' '{print $1}')\n            if [ -z \"$tx_rate\" ] || [ -z \"$rx_rate\" ]; then\n                return\n            fi\n            add_speed_entry rx $rx_rate\n            add_speed_entry tx $tx_rate\n        ;;\n    esac\n}\n\nget_lockband(){\n    json_add_object \"lockband\"\n    case $platform in\n        \"qualcomm\")\n            get_lockband_nr\n            ;;\n        \"unisoc\")\n            get_lockband_nr\n            ;;\n        \"mediatek\")\n            get_lockband_nr\n            ;;\n        \"lte\")\n            get_lockband_lte\n            ;;\n        *)\n            get_lockband_nr\n            ;;\n    esac\n    json_close_object\n}\n\n#锁频信息\nget_lockband_nr()\n{\n    m_debug \"Fibocom get lockband info nr\"\n    get_lockband_config_command=\"AT+GTACT?\"\n    get_available_band_command=\"AT+GTACT=?\"\n    get_lockband_config_res=$(at $at_port $get_lockband_config_command)\n    get_available_band_res=$(at $at_port $get_available_band_command)\n    json_add_object \"UMTS\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_object\n    json_close_object\n    json_add_object \"LTE\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_object\n    json_close_object\n    json_add_object \"NR\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n    index=0\n    for i in $(echo \"$get_available_band_res\"| sed 's/\\r//g' | awk -F\"[()]\" '{for(j=8; j<NF;j+=2) if ($j) print $j; else print 0;}' ); do\n        case $index in\n            0) \n            #\"gsm\"\n            ;;\n            1) \n            #\"umts_band\" \n            for j in $(echo \"$i\" | awk -F\",\" '{for(k=1; k<=NF; k++) print $k}'); do\n                json_select \"UMTS\"\n                json_select \"available_band\"\n                add_avalible_band_entry  \"$j\" \"UMTS_$j\"\n                json_select \"..\"\n                json_select \"..\"\n            done\n            ;;\n            2) \n            #\"LTE\" \"$i\" \n            for j in $(echo \"$i\" | awk -F\",\" '{for(k=1; k<=NF; k++) print $k}'); do\n                trim_first_letter=$(echo \"$j\" | sed 's/^.//')\n                json_select \"LTE\"\n                json_select \"available_band\"\n                add_avalible_band_entry  \"$j\" \"LTE_$trim_first_letter\"\n                json_select \"..\"\n                json_select \"..\"\n            done\n            ;;\n            3)  \n            #\"cdma_band\"\n            ;;\n            4) \n            #\"evno\"\n            ;;\n            5)\n            #\"nr5g\"\n            for j in $(echo \"$i\" | awk -F\",\" '{for(k=1; k<=NF; k++) print $k}'); do\n                trim_first_letter=$(echo \"$j\" | sed 's/^.//')\n                json_select \"NR\"\n                json_select \"available_band\"\n                add_avalible_band_entry  \"$j\" \"NR_$trim_first_letter\"\n                json_select \"..\"\n                json_select \"..\"\n            done\n            ;;\n        esac\n        index=$((index+1))\n    done\n    \n    for i in $(echo \"$get_lockband_config_res\" | sed 's/\\r//g' | awk -F\",\" '{for(k=4; k<=NF; k++) print $k}' ); do\n        # i 0,100 UMTS\n        # i 100,5000 LTE\n        # i 5000,10000 NR\n        if [ -z \"$i\" ]; then\n            continue\n        fi\n        if [ $i -lt 100 ]; then\n            json_select \"UMTS\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select \"..\"\n            json_select \"..\"\n        elif [ $i -lt 500 ]; then\n            json_select \"LTE\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select \"..\"\n            json_select \"..\"\n        else\n            json_select \"NR\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select \"..\"\n            json_select \"..\"\n        fi\n    done\n    json_close_array\n}\n\n#锁频信息\nget_lockband_lte()\n{\n    m_debug \"Fibocom get lockband info lte\"\n    get_lockband_config_command=\"AT+GTACT?\"\n    get_available_band_command=\"AT+GTACT=?\"\n    get_lockband_config_res=$(at $at_port $get_lockband_config_command |grep GTACT: | sed 's/\\r//g')\n    get_available_band_res=$(at $at_port $get_available_band_command |grep GTACT: | sed 's/\\r//g')\n    json_add_object \"UMTS\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n    json_add_object \"LTE\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n    #+GTACT: (1,2,4,10),(2,3),(),0,1,3,5,8,101,103,105,107,108,120,128,132,138,140,141\n    #means avalible band = 1,3,5,8,101,103,105,107,108,120,128,132,138,140,141\n    lockband_type=$(echo \"$get_lockband_config_res\" | cut -d: -f2 | cut -d, -f1|tr -d ' ')\n    first_bandcfg=$(echo \"$get_lockband_config_res\" | cut -d, -f2)\n    [ \"$first_bandcfg\" -eq 0 ] && select_all_band=1 || select_all_band=0\n    [ \"$lockband_type\" -lt 10 ] && seq=2 || seq=4\n    for i in $(echo \"$get_available_band_res\"| sed 's/\\r//g' | awk -F\",\" '{for(j=9; j<=NF;j+=1) if ($j) print $j; else print 0;}' ); do\n        if [ -z \"$i\" ]; then\n            continue\n        fi\n        # $i < 100 UMTS, i >= 100 LTE\n        if [ $i -lt 100 ]; then\n            json_select \"UMTS\"\n            json_select \"available_band\"\n            add_avalible_band_entry  \"$i\" \"UMTS_$i\"\n            json_select \"..\"\n            json_select \"..\"\n            if [ $select_all_band -eq 1 ]; then\n                json_select \"UMTS\"\n                json_select \"lock_band\"\n                json_add_string \"\" \"$i\"\n                json_select \"..\"\n                json_select \"..\"\n            fi\n        else\n            json_select \"LTE\"\n            json_select \"available_band\"\n            trim_first_letter=$(echo \"$i\" | sed 's/^.//')\n            add_avalible_band_entry  \"$i\" \"LTE_$trim_first_letter\"\n            json_select \"..\"\n            json_select \"..\"\n            if [ $select_all_band -eq 1 ]; then\n                json_select \"LTE\"\n                json_select \"lock_band\"\n                json_add_string \"\" \"$i\"\n                json_select \"..\"\n                json_select \"..\"\n            fi\n        fi\n    done\n    \n    for i in $(echo \"$get_lockband_config_res\" | sed 's/\\r//g' | awk -F\",\" '{for(k='$seq'; k<=NF; k++) print $k}' ); do\n        # i 0,100 UMTS\n        # i 100,5000 LTE\n        # i 5000,10000 NR\n        if [ -z \"$i\" ]; then\n            continue\n        fi\n        if [ $i -lt 100 ]; then\n            json_select \"UMTS\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select \"..\"\n            json_select \"..\"\n        elif [ $i -lt 500 ]; then\n            json_select \"LTE\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select \"..\"\n            json_select \"..\"\n        fi\n    done\n    json_close_array\n}\n\nset_lockband()\n{\n    config=$1\n    band_class=$(echo $config | jq -r '.band_class')\n    lock_band=$(echo $config | jq -r '.lock_band')\n    case $platform in\n        \"qualcomm\")\n            set_lockband_nr\n            ;;\n        \"unisoc\")\n            set_lockband_nr\n            ;;\n        \"mediatek\")\n            set_lockband_nr_mediatek\n            ;;\n        \"lte\")\n            set_lockband_lte\n            ;;\n        *)\n            set_lockband_nr\n            ;;\n    esac\n    json_select \"result\"\n    json_add_string \"set_lockband\" \"$res\"\n    json_add_string \"config\" \"$config\"\n    json_add_string \"band_class\" \"$band_class\"\n    json_add_string \"lock_band\" \"$lock_band\"\n    json_close_object\n}\n\n#设置锁频\nset_lockband_nr_mediatek()\n{\n    m_debug \"Fibocom set lockband info\"\n    get_lockband_config_command=\"AT+GTACT?\"\n    get_lockband_config_res=$(at $at_port $get_lockband_config_command)\n    network_prefer_config=$(echo $get_lockband_config_res |cut -d : -f 2| awk -F\",\" '{print $1}' |tr -d ' ')\n    local lock_band=\"$network_prefer_config,6,3,$lock_band\"\n    local set_lockband_command=\"AT+GTACT=$lock_band\"\n    res=$(at $at_port $set_lockband_command)\n}\n\nset_lockband_nr()\n{\n    m_debug \"Fibocom set lockband info nr\"\n\n    # 获取当前band配置\n    get_lockband_config_command=\"AT+GTACT?\"\n    get_lockband_config_res=$(at $at_port $get_lockband_config_command | grep \"+GTACT:\" | head -n1)\n    band_params=$(echo \"$get_lockband_config_res\" | sed 's/+GTACT:[ ]*//' | tr -d '\\r')\n    prefix=$(echo \"$band_params\" | cut -d',' -f1-3)\n    bands=$(echo \"$band_params\" | cut -d',' -f4- | tr -d '\\r')\n\n    # 获取全选band\n    get_available_band_res=$(at $at_port \"AT+GTACT=?\" | grep \"+GTACT:\" | head -n1)\n    available_band_params=$(echo \"$get_available_band_res\" | sed 's/+GTACT:[ ]*//' | tr -d '\\r')\n    ALL_UMTS=$(echo \"$available_band_params\" | awk -F'[()]' '{print $10}' | tr -d ' ')\n    ALL_LTE=$(echo \"$available_band_params\" | awk -F'[()]' '{print $12}' | tr -d ' ')\n    ALL_NR=$(echo \"$available_band_params\" | awk -F'[()]' '{print $18}' | tr -d ' ')\n\n    band_class=$(echo \"$config\" | jq -r '.band_class')\n\n    umts_bands=\"\"\n    lte_bands=\"\"\n    nr_bands=\"\"\n    for b in $(echo \"$bands\" | tr ',' ' '); do\n        [ -z \"$b\" ] && continue\n        if [ \"$b\" -ge 1 ] && [ \"$b\" -lt 100 ]; then\n            umts_bands=\"$umts_bands,$b\"\n        elif [ \"$b\" -ge 100 ] && [ \"$b\" -lt 500 ]; then\n            lte_bands=\"$lte_bands,$b\"\n        elif { [ \"$b\" -ge 500 ] && [ \"$b\" -lt 600 ]; } || [ \"$b\" -ge 5000 ]; then\n            nr_bands=\"$nr_bands,$b\"\n        fi\n    done\n    umts_bands=\"${umts_bands#,}\"\n    lte_bands=\"${lte_bands#,}\"\n    nr_bands=\"${nr_bands#,}\"\n\n    # 替换对应 band_class\n    case \"$band_class\" in\n        \"UMTS\")\n            umts_bands=\"$lock_band\"\n            ;;\n        \"LTE\")\n            lte_bands=\"$lock_band\"\n            ;;\n        \"NR\")\n            nr_bands=\"$lock_band\"\n            ;;\n    esac\n\n    # 拼接所有band\n    bands_str=\"\"\n    [ -n \"$umts_bands\" ] && bands_str=\"$umts_bands\"\n    [ -n \"$lte_bands\" ] && [ -n \"$bands_str\" ] && bands_str=\"$bands_str,$lte_bands\"\n    [ -n \"$lte_bands\" ] && [ -z \"$bands_str\" ] && bands_str=\"$lte_bands\"\n    [ -n \"$nr_bands\" ] && [ -n \"$bands_str\" ] && bands_str=\"$bands_str,$nr_bands\"\n    [ -n \"$nr_bands\" ] && [ -z \"$bands_str\" ] && bands_str=\"$nr_bands\"\n    [ -z \"$bands_str\" ] && prefix=$(echo \"$prefix\" | sed 's/,$//')\n\n    # 判断全选情况\n    if [ \"$nr_bands\" = \"$ALL_NR\" ] && [ \"$lte_bands\" = \"$ALL_LTE\" ] && [ \"$umts_bands\" = \"$ALL_UMTS\" ]; then\n        set_lockband_command=\"AT+GTACT=20\"\n    elif [ \"$nr_bands\" = \"$ALL_NR\" ] && [ -z \"$lte_bands\" ] && [ -z \"$umts_bands\" ]; then\n        set_lockband_command=\"AT+GTACT=14\"\n    elif [ \"$lte_bands\" = \"$ALL_LTE\" ] && [ -z \"$nr_bands\" ] && [ -z \"$umts_bands\" ]; then\n        set_lockband_command=\"AT+GTACT=2\"\n    elif [ \"$umts_bands\" = \"$ALL_UMTS\" ] && [ -z \"$lte_bands\" ] && [ -z \"$nr_bands\" ]; then\n        set_lockband_command=\"AT+GTACT=1\"\n    elif [ \"$nr_bands\" = \"$ALL_NR\" ] && [ \"$lte_bands\" = \"$ALL_LTE\" ] && [ -z \"$umts_bands\" ]; then\n        set_lockband_command=\"AT+GTACT=17\"\n    elif [ \"$nr_bands\" = \"$ALL_NR\" ] && [ \"$umts_bands\" = \"$ALL_UMTS\" ] && [ -z \"$lte_bands\" ]; then\n        set_lockband_command=\"AT+GTACT=16\"\n    elif [ \"$lte_bands\" = \"$ALL_LTE\" ] && [ \"$umts_bands\" = \"$ALL_UMTS\" ] && [ -z \"$nr_bands\" ]; then\n        set_lockband_command=\"AT+GTACT=4\"\n    else\n        if [ -n \"$bands_str\" ]; then\n            set_lockband_command=\"AT+GTACT=,,,$bands_str\"\n        else\n            set_lockband_command=\"AT+GTACT=$prefix\"\n        fi\n    fi\n\n    res=$(at $at_port \"$set_lockband_command\")\n    json_select \"result\"\n    json_add_string \"set_lockband\" \"$res\"\n    json_add_string \"config\" \"$config\"\n    json_add_string \"band_class\" \"$band_class\"\n    json_add_string \"lock_band\" \"$lock_band\"\n    json_close_object\n}\n\nset_lockband_lte()\n{\n    m_debug \"Fibocom set lte lockband\"\n    get_lockband_config_command=\"AT+GTACT?\"\n    get_lockband_config_res=$(at $at_port $get_lockband_config_command)\n    network_prefer_config=$(echo $get_lockband_config_res |cut -d : -f 2| awk -F\",\" '{ print $1}' |tr -d ' ')\n    local lock_band=\"$network_prefer_config,,,$lock_band\"\n    local set_lockband_command=\"AT+GTACT=$lock_band\"\n    res=$(at $at_port $set_lockband_command)\n}\n\nget_neighborcell()\n{\n    m_debug \"Fibocom get neighborcell info\"\n    get_neighborcell_command=\"AT+GTCCINFO?\"\n    get_lockcell_command=\"AT+GTCELLLOCK?\"\n    cell_type=\"undefined\"\n    json_add_object \"neighborcell\"\n    json_add_array \"NR\"\n    json_close_array\n    json_add_array \"LTE\"\n    json_close_array\n    at $at_port $get_neighborcell_command > /tmp/neighborcell\n     while IFS= read -r line; do\n        #跳过空行\n        line=$(echo $line | sed 's/\\r//g')\n        if [ -z \"$line\" ]; then\n            continue\n        fi\n        case $line in\n            \"2,9\"*)\n                m_debug \"NR line:$line\"\n                tac=$(echo \"$line\" | awk -F',' '{print $5}')\n                cellid=$(echo \"$line\" | awk -F',' '{print $6}')\n                arfcn=$(echo \"$line\" | awk -F',' '{print $7}')\n                pci=$(echo \"$line\" | awk -F',' '{print $8}')\n                ss_sinr=$(echo \"$line\" | awk -F',' '{print $10}')\n                rxlev=$(echo \"$line\" | awk -F',' '{print $11}')\n                ss_rsrp=$(echo \"$line\" | awk -F',' '{print $12}')\n                json_select \"NR\"\n                json_add_object \"\"\n                json_add_string \"tac\" \"$tac\"\n                json_add_string \"cellid\" \"$cellid\"\n                json_add_string \"arfcn\" \"$arfcn\"\n                json_add_string \"pci\" \"$pci\"\n                json_add_string \"bandwidth\" \"$bandwidth\"\n                json_add_string \"ss_sinr\" \"$ss_sinr\"\n                json_add_string \"rxlev\" \"$rxlev\"\n                json_add_string \"ss_rsrp\" \"$ss_rsrp\"\n                json_close_object\n                json_select \"..\"\n                ;;\n            \"2,4\"*)\n                tac=$(echo \"$line\" | awk -F',' '{print $5}')\n                cellid=$(echo \"$line\" | awk -F',' '{print $6}')\n                arfcn=$(echo \"$line\" | awk -F',' '{print $7}')\n                pci=$(echo \"$line\" | awk -F',' '{print $8}')\n                bandwidth=$(echo \"$line\" | awk -F',' '{print $9}')\n                rxlev=$(echo \"$line\" | awk -F',' '{print $10}')\n                rsrp=$(echo \"$line\" | awk -F',' '{print $11}')\n                rsrq=$(echo \"$line\" | awk -F',' '{print $12}')\n                arfcn=$(echo 'ibase=16;' \"$arfcn\"   | bc)\n                pci=$(echo 'ibase=16;' \"$pci\"  | bc)\n                json_select \"LTE\"\n                json_add_object \"\"\n                json_add_string \"tac\" \"$tac\"\n                json_add_string \"cellid\" \"$cellid\"\n                json_add_string \"arfcn\" \"$arfcn\"\n                json_add_string \"pci\" \"$pci\"\n                json_add_string \"bandwidth\" \"$bandwidth\"\n                json_add_string \"rxlev\" \"$rxlev\"\n                json_add_string \"rsrp\" \"$rsrp\"\n                json_add_string \"rsrq\" \"$rsrq\"\n                json_close_object\n                json_select \"..\"\n                ;;\n        esac\n    done < \"/tmp/neighborcell\"\n\n    result=`at $at_port $get_lockcell_command | grep \"+GTCELLLOCK:\" | sed 's/+GTCELLLOCK: //g' | sed 's/\\r//g'`\n    #$1:lockcell_status $2:cell_type $3:lock_type $4:arfcn $5:pci $6:scs $7:nr_band\n    json_add_object \"lockcell_status\"\n    if [ -n \"$result\" ]; then\n        lockcell_status=$(echo \"$result\" | awk -F',' '{print $1}')\n        if [ \"$lockcell_status\" = \"1\" ]; then\n            lockcell_status=\"lock\"\n        else\n            lockcell_status=\"unlock\"\n        fi\n        cell_type=$(echo \"$result\" | awk -F',' '{print $2}')\n        if [ \"$cell_type\" = \"1\" ]; then\n            cell_type=\"NR\"\n        elif [ \"$cell_type\" = \"0\" ]; then\n            cell_type=\"LTE\"\n        fi\n        lock_type=$(echo \"$result\" | awk -F',' '{print $3}')\n        if [ \"$lock_type\" = \"1\" ]; then\n            lock_type=\"arfcn\"\n        elif [ \"$lock_type\" = \"0\" ]; then\n            lock_type=\"pci\"\n        fi\n        arfcn=$(echo \"$result\" | awk -F',' '{print $4}')\n        pci=$(echo \"$result\" | awk -F',' '{print $5}')\n        scs=$(echo \"$result\" | awk -F',' '{print $6}')\n        nr_band=$(echo \"$result\" | awk -F',' '{print $7}')\n        json_add_string \"Status\" \"$lockcell_status\"\n        json_add_string \"Rat\" \"$cell_type\"\n        json_add_string \"Lock Type\" \"$lock_type\"\n        json_add_string \"ARFCN\" \"$arfcn\"\n        json_add_string \"PCI\" \"$pci\"\n        json_add_string \"SCS\" \"$scs\"\n        json_add_string \"NR BAND\" \"$nr_band\"\n    fi\n    json_close_object\n    json_close_object\n}\n\nset_neighborcell(){\n    json_param=$1\n    rat=$(echo $json_param | jq -r '.rat')\n    pci=$(echo $json_param | jq -r '.pci')\n    arfcn=$(echo $json_param | jq -r '.arfcn')\n    band=$(echo $json_param | jq -r '.band')\n    scs=$(echo $json_param | jq -r '.scs')\n    lockcell_all\n    json_select \"result\"\n    json_add_string \"setlockcell\" \"$res\"\n    json_add_string \"rat\" \"$rat\"\n    json_add_string \"pci\" \"$pci\"\n    json_add_string \"arfcn\" \"$arfcn\"\n    json_add_string \"band\" \"$band\"\n    json_add_string \"scs\" \"$scs\"\n    json_close_object\n}\n\nlockcell_all(){\n    if [ -z \"$pci\" ] && [ -z \"$arfcn\" ]; then\n        local unlockcell=\"AT+GTCELLLOCK=0\"\n        res1=$(at $at_port $unlockcell)\n        res=$res1\n    else\n        if [ -z $pci ] && [ -n $arfcn ]; then\n            lockpci_nr=\"AT+GTCELLLOCK=1,1,1,$arfcn\"\n            lockpci_lte=\"AT+GTCELLLOCK=1,0,1,$arfcn\"\n            \n        elif [ -n $pci ] && [ -n $arfcn ]; then\n            lockpci_nr=\"AT+GTCELLLOCK=1,1,0,$arfcn,$pci,$scs,50$band\"\n            lockpci_lte=\"AT+GTCELLLOCK=1,0,0,$arfcn,$pci\"\n        fi\n        if [ \"$pci\" -eq 0 ] && [ \"$arfcn\" -eq 0 ]; then\n            lockpci_nr=\"AT+GTCELLLOCK=1\"\n            lockpci_lte=\"AT+GTCELLLOCK=1\"\n        fi\n        if [ \"$rat\" -eq 1 ]; then\n            res=$(at $at_port $lockpci_nr)\n        elif [ \"$rat\" -eq 0 ]; then\n            res=$(at $at_port $lockpci_lte)\n        fi\n    fi\n}\n\nget_band()\n{\n    local band\n    case $1 in\n\t\t\"WCDMA\") band=\"$2\" ;;\n\t\t\"LTE\") band=\"$(($2-100))\" ;;\n        \"NR\") band=\"$2\" band=\"${band#*50}\" ;;\n\tesac\n    echo \"$band\"\n}\n\n#获取带宽\n# $1:网络类型\n# $2:带宽数字\nget_bandwidth()\n{\n    local network_type=\"$1\"\n    local bandwidth_num=\"$2\"\n\n    local bandwidth\n    case $network_type in\n\t\t\"LTE\")\n            case $bandwidth_num in\n                \"6\") bandwidth=\"1.4\" ;;\n                \"15\"|\"25\"|\"50\"|\"75\"|\"100\") bandwidth=$(( $bandwidth_num / 5 )) ;;\n            esac\n        ;;\n        \"NR\")\n            case $bandwidth_num in\n                \"0\") bandwidth=\"5\" ;;\n                *) bandwidth=$(( $bandwidth_num / 5 )) ;;\n            esac\n        ;;\n\tesac\n    echo \"$bandwidth\"\n}\n\n#获取信噪比\n# $1:网络类型\n# $2:信噪比数字\nget_sinr()\n{\n    local sinr\n    case $1 in\n        \"LTE\") sinr=$(awk \"BEGIN{ printf \\\"%.2f\\\", $2 * 0.5 - 23.5 }\" | sed 's/\\.*0*$//') ;;\n        \"NR\") sinr=$(awk \"BEGIN{ printf \\\"%.2f\\\", $2 * 0.5 - 23.5 }\" | sed 's/\\.*0*$//') ;;\n\tesac\n    echo \"$sinr\"\n}\n\n#获取接收信号功率\n# $1:网络类型\n# $2:接收信号功率数字\nget_rxlev()\n{\n    local rxlev\n    case $1 in\n        \"GSM\") rxlev=$(($2-110)) ;;\n        \"WCDMA\") rxlev=$(($2-121)) ;;\n        \"LTE\") rxlev=$(($2-141)) ;;\n        \"NR\") rxlev=$(($2-157)) ;;\n\tesac\n    echo \"$rxlev\"\n}\n\n#获取参考信号接收功率\n# $1:网络类型\n# $2:参考信号接收功率数字\nget_rsrp()\n{\n    local rsrp\n    case $1 in\n        \"LTE\") rsrp=$(($2-141)) ;;\n        \"NR\") rsrp=$(($2-157)) ;;\n\tesac\n    echo \"$rsrp\"\n}\n\n#获取参考信号接收质量\n# $1:网络类型\n# $2:参考信号接收质量数字\nget_rsrq()\n{\n    local rsrq\n    case $1 in\n        \"LTE\") rsrq=$(awk \"BEGIN{ printf \\\"%.2f\\\", $2 * 0.5 - 20 }\" | sed 's/\\.*0*$//') ;;\n        \"NR\") rsrq=$(awk -v num=\"$2\" \"BEGIN{ printf \\\"%.2f\\\", (num+1) * 0.5 - 44 }\" | sed 's/\\.*0*$//') ;;\n\tesac\n    echo \"$rsrq\"\n}\n\n#获取信号干扰比\n# $1:信号干扰比数字\nget_rssnr()\n{\n    #去掉小数点后的0\n    local rssnr=$(awk \"BEGIN{ printf \\\"%.2f\\\", $1 / 2 }\" | sed 's/\\.*0*$//')\n    echo \"$rssnr\"\n}\n\n#获取Ec/Io\n# $1:Ec/Io数字\nget_ecio()\n{\n    local ecio=$(awk \"BEGIN{ printf \\\"%.2f\\\", $1 * 0.5 - 24.5 }\" | sed 's/\\.*0*$//')\n    echo \"$ecio\"\n}\n\n#小区信息\ncell_info()\n{\n    m_debug \"Fibocom cell info\"\n\n    at_command='AT+GTCCINFO?'\n    response=$(at $at_port $at_command)\n\n    at_command='AT+GTCAINFO?'\n    ca_response=$(at $at_port $at_command)\n\n    local rat=$(echo \"$response\" | grep \"service\" | awk -F' ' '{print $1}')\n\n    #适配联发科平台（FM350-GL）\n    [ -z \"$rat\" ] && {\n        at_command='AT+COPS?'\n        rat_num=$(at $at_port $at_command | grep \"+COPS:\" | awk -F',' '{print $4}' | sed 's/\\r//g')\n        rat=$(get_rat ${rat_num})\n    }\n    \n    #CSQ（信号强度）\n    at_command=\"AT+CSQ\"\n    csqinfo=$(at ${at_port} ${at_command} | grep \"+CSQ:\" | sed 's/+CSQ: //g' | sed 's/\\r//g')\n    \n    #RSSI（信号强度指示）\n    rssi_num=$(echo $csqinfo | awk -F',' '{print $1}')\n    rssi=$(get_rssi $rssi_num)\n    [ -n \"$rssi\" ] && rssi_actual=$(printf \"%.1f\" $(echo \"$rssi / 10\" | bc -l 2>/dev/null))\n    ca_count=1\n    scc_pci=\"\"\n    scc_arfcn=\"\"\n    scc_band=\"\"\n    scc_dl_bandwidth=\"\"\n    scc_ul_bandwidth=\"\"\n    for response in $response; do\n        #排除+GTCCINFO:、NR service cell:还有空行\n        [ -n \"$response\" ] && [[ \"$response\" = *\",\"* ]] && {\n\n            case $rat in\n                \"NR\")\n                    network_mode=\"NR5G-SA Mode\"\n                    IFS=$'\\n'\n                    for ca_res in $ca_response; do\n                        if echo \"$ca_res\" | grep -q \"SCC\"; then\n                            ca_count=$((ca_count+1))\n                            scc_ul_ca=$(echo \"$ca_res\" | awk -F',' '{print $2}')\n                            scc_band_num=$(echo \"$ca_res\" | awk -F',' '{print $3}')\n                            scc_pci_new=$(echo \"$ca_res\" | awk -F',' '{print $4}')\n                            if [ -z \"$scc_pci\" ]; then\n                                scc_pci=\"$scc_pci_new\"\n                            else\n                                scc_pci=\"$scc_pci / $scc_pci_new\"\n                            fi\n                            scc_arfcn_new=$(echo \"$ca_res\" | awk -F',' '{print $5}')\n                            if [ -z \"$scc_arfcn\" ]; then\n                                scc_arfcn=\"$scc_arfcn_new\"\n                            else\n                                scc_arfcn=\"$scc_arfcn / $scc_arfcn_new\"\n                            fi\n                            scc_band_new=$(get_band \"NR\" ${scc_band_num})\n                            if [ -z \"$scc_band\" ]; then\n                                scc_band=\"$scc_band_new\"\n                            else\n                                scc_band=\"$scc_band / $scc_band_new\"\n                            fi\n                            scc_dl_bandwidth_num=$(echo \"$ca_res\" | awk -F',' '{print $6}')\n                            scc_dl_bandwidth_new=$(get_bandwidth \"NR\" ${scc_dl_bandwidth_num})\n                            if [ -z \"$scc_dl_bandwidth\" ]; then\n                                scc_dl_bandwidth=\"$scc_dl_bandwidth_new\"\n                            else\n                                scc_dl_bandwidth=\"$scc_dl_bandwidth / $scc_dl_bandwidth_new\"\n                            fi\n                            if [ \"$scc_ul_ca\" = \"1\" ]; then\n                                scc_ul_bandwidth_new=$scc_dl_bandwidth_new\n                            else\n                                scc_ul_bandwidth_num=\"-\"\n                            fi\n                            if [ -z \"$scc_ul_bandwidth\" ]; then\n                                scc_ul_bandwidth=\"$scc_ul_bandwidth_new\"\n                            else\n                                scc_ul_bandwidth=\"$scc_ul_bandwidth / $scc_ul_bandwidth_new\"\n                            fi\n                        fi\n                    done\n                    IFS=' '\n                    [ $ca_count -gt 1 ] && network_mode=\"$network_mode with $ca_count CA\"\n                    nr_mcc=$(echo \"$response\" | awk -F',' '{print $3}')\n                    nr_mnc=$(echo \"$response\" | awk -F',' '{print $4}')\n                    nr_tac=$(echo \"$response\" | awk -F',' '{print $5}')\n                    nr_tac=$(echo 'ibase=16;' \"$nr_tac\" | bc)\n                    nr_cell_id=$(echo \"$response\" | awk -F',' '{print $6}')\n                    nr_cell_id=$(echo 'ibase=16;' \"$nr_cell_id\" | bc)\n                    nr_arfcn=$(echo \"$response\" | awk -F',' '{print $7}')\n                    nr_physical_cell_id=$(echo \"$response\" | awk -F',' '{print $8}')\n                    nr_band_num=$(echo \"$response\" | awk -F',' '{print $9}')\n                    nr_band=$(get_band \"NR\" ${nr_band_num})\n                    nr_dl_bandwidth_num=$(echo \"$ca_response\" | grep \"PCC\" | sed 's/\\r//g' | awk -F',' '{print $4}')\n                    nr_dl_bandwidth=$(get_bandwidth \"NR\" ${nr_dl_bandwidth_num})\n                    nr_ul_bandwidth_num=$(echo \"$ca_response\" | grep \"PCC\" | sed 's/\\r//g' | awk -F',' '{print $5}')\n                    nr_ul_bandwidth=$(get_bandwidth \"NR\" ${nr_ul_bandwidth_num})\n                    nr_sinr_num=$(echo \"$response\" | awk -F',' '{print $11}')\n                    nr_sinr=$(get_sinr \"NR\" ${nr_sinr_num})\n                    nr_rxlev_num=$(echo \"$response\" | awk -F',' '{print $12}')\n                    nr_rxlev=$(get_rxlev \"NR\" ${nr_rxlev_num})\n                    nr_rsrp_num=$(echo \"$response\" | awk -F',' '{print $13}')\n                    nr_rsrp=$(get_rsrp \"NR\" ${nr_rsrp_num})\n                    nr_rsrq_num=$(echo \"$response\" | awk -F',' '{print $14}' | sed 's/\\r//g')\n                    nr_rsrq=$(get_rsrq \"NR\" ${nr_rsrq_num})\n                ;;\n                \"LTE-NR\")\n                    network_mode=\"EN-DC Mode\"\n                    #LTE\n                    endc_lte_mcc=$(echo \"$response\" | awk -F',' '{print $3}')\n                    endc_lte_mnc=$(echo \"$response\" | awk -F',' '{print $4}')\n                    endc_lte_tac=$(echo \"$response\" | awk -F',' '{print $5}')\n                    endc_lte_cell_id=$(echo \"$response\" | awk -F',' '{print $6}')\n                    endc_lte_earfcn=$(echo \"$response\" | awk -F',' '{print $7}')\n                    endc_lte_physical_cell_id=$(echo \"$response\" | awk -F',' '{print $8}')\n                    endc_lte_band_num=$(echo \"$response\" | awk -F',' '{print $9}')\n                    endc_lte_band=$(get_band \"LTE\" ${endc_lte_band_num})\n                    ul_bandwidth_num=$(echo \"$response\" | awk -F',' '{print $10}')\n                    endc_lte_ul_bandwidth=$(get_bandwidth \"LTE\" ${ul_bandwidth_num})\n                    endc_lte_dl_bandwidth=\"$endc_lte_ul_bandwidth\"\n                    endc_lte_rssnr_num=$(echo \"$response\" | awk -F',' '{print $11}')\n                    endc_lte_rssnr=$(get_rssnr ${endc_lte_rssnr_num})\n                    endc_lte_rxlev_num=$(echo \"$response\" | awk -F',' '{print $12}')\n                    endc_lte_rxlev=$(get_rxlev \"LTE\" ${endc_lte_rxlev_num})\n                    endc_lte_rsrp_num=$(echo \"$response\" | awk -F',' '{print $13}')\n                    endc_lte_rsrp=$(get_rsrp \"LTE\" ${endc_lte_rsrp_num})\n                    endc_lte_rsrq_num=$(echo \"$response\" | awk -F',' '{print $14}' | sed 's/\\r//g')\n                    endc_lte_rsrq=$(get_rsrq \"LTE\" ${endc_lte_rsrq_num})\n                    #NR5G-NSA\n                    endc_nr_mcc=$(echo \"$response\" | awk -F',' '{print $3}')\n                    endc_nr_mnc=$(echo \"$response\" | awk -F',' '{print $4}')\n                    endc_nr_tac=$(echo \"$response\" | awk -F',' '{print $5}')\n                    endc_nr_cell_id=$(echo \"$response\" | awk -F',' '{print $6}')\n                    endc_nr_arfcn=$(echo \"$response\" | awk -F',' '{print $7}')\n                    endc_nr_physical_cell_id=$(echo \"$response\" | awk -F',' '{print $8}')\n                    endc_nr_band_num=$(echo \"$response\" | awk -F',' '{print $9}')\n                    endc_nr_band=$(get_band \"NR\" ${endc_nr_band_num})\n                    nr_dl_bandwidth_num=$(echo \"$response\" | awk -F',' '{print $10}')\n                    endc_nr_dl_bandwidth=$(get_bandwidth \"NR\" ${nr_dl_bandwidth_num})\n                    endc_nr_sinr_num=$(echo \"$response\" | awk -F',' '{print $11}')\n                    endc_nr_sinr=$(get_sinr \"NR\" ${endc_nr_sinr_num})\n                    endc_nr_rxlev_num=$(echo \"$response\" | awk -F',' '{print $12}')\n                    endc_nr_rxlev=$(get_rxlev \"NR\" ${endc_nr_rxlev_num})\n                    endc_nr_rsrp_num=$(echo \"$response\" | awk -F',' '{print $13}')\n                    endc_nr_rsrp=$(get_rsrp \"NR\" ${endc_nr_rsrp_num})\n                    endc_nr_rsrq_num=$(echo \"$response\" | awk -F',' '{print $14}' | sed 's/\\r//g')\n                    endc_nr_rsrq=$(get_rsrq \"NR\" ${endc_nr_rsrq_num})\n                    ;;\n                \"LTE\"|\"eMTC\"|\"NB-IoT\")\n                    network_mode=\"LTE Mode\"\n                    lte_mcc=$(echo \"$response\" | awk -F',' '{print $3}')\n                    lte_mnc=$(echo \"$response\" | awk -F',' '{print $4}')\n                    lte_tac=$(echo \"$response\" | awk -F',' '{print $5}')\n                    lte_cell_id=$(echo \"$response\" | awk -F',' '{print $6}')\n                    lte_earfcn=$(echo \"$response\" | awk -F',' '{print $7}')\n                    lte_physical_cell_id=$(echo \"$response\" | awk -F',' '{print $8}')\n                    lte_band_num=$(echo \"$response\" | awk -F',' '{print $9}')\n                    lte_band=$(get_band \"LTE\" ${lte_band_num})\n                    ul_bandwidth_num=$(echo \"$response\" | awk -F',' '{print $10}')\n                    lte_ul_bandwidth=$(get_bandwidth \"LTE\" ${ul_bandwidth_num})\n                    lte_dl_bandwidth=\"$lte_ul_bandwidth\"\n                    lte_rssnr=$(echo \"$response\" | grep \",\" | head -n1 | awk -F',' '{print $11}')\n                    lte_rxlev_num=$(echo \"$response\" | awk -F',' '{print $12}')\n                    lte_rxlev=$(get_rxlev \"LTE\" ${lte_rxlev_num})\n                    lte_rsrp_num=$(echo \"$response\" | awk -F',' '{print $13}')\n                    lte_rsrp=$(get_rsrp \"LTE\" ${lte_rsrp_num})\n                    lte_rsrq_num=$(echo \"$response\" | awk -F',' '{print $14}' | sed 's/\\r//g')\n                    lte_rsrq=$(get_rsrq \"LTE\" ${lte_rsrq_num})\n                    lte_rssi=\"$rssi_actual\"\n                ;;\n                \"WCDMA\"|\"UMTS\")\n                    network_mode=\"WCDMA Mode\"\n                    wcdma_mcc=$(echo \"$response\" | awk -F',' '{print $3}')\n                    wcdma_mnc=$(echo \"$response\" | awk -F',' '{print $4}')\n                    wcdma_lac=$(echo \"$response\" | awk -F',' '{print $5}')\n                    wcdma_cell_id=$(echo \"$response\" | awk -F',' '{print $6}')\n                    wcdma_uarfcn=$(echo \"$response\" | awk -F',' '{print $7}')\n                    wcdma_psc=$(echo \"$response\" | awk -F',' '{print $8}')\n                    wcdma_band_num=$(echo \"$response\" | awk -F',' '{print $9}')\n                    wcdma_band=$(get_band \"WCDMA\" ${wcdma_band_num})\n                    wcdma_ecno=$(echo \"$response\" | awk -F',' '{print $10}')\n                    wcdma_rscp=$(echo \"$response\" | awk -F',' '{print $11}')\n                    wcdma_rac=$(echo \"$response\" | awk -F',' '{print $12}')\n                    wcdma_rxlev_num=$(echo \"$response\" | awk -F',' '{print $13}')\n                    wcdma_rxlev=$(get_rxlev \"WCDMA\" ${wcdma_rxlev_num})\n                    wcdma_reserved=$(echo \"$response\" | awk -F',' '{print $14}')\n                    wcdma_ecio_num=$(echo \"$response\" | awk -F',' '{print $15}' | sed 's/\\r//g')\n                    wcdma_ecio=$(get_ecio ${wcdma_ecio_num})\n                ;;\n            esac\n\n            #联发科平台特殊处理（FM350-GL）\n            [[ \"$platform\" = \"mediatek\" ]] && {\n                nr_sinr=\"${nr_sinr_num}\"\n                endc_nr_sinr=\"${endc_nr_sinr_num}\"\n            }\n\n            #只选择第一个，然后退出\n            break\n        }\n    done\n    class=\"Cell Information\"\n    add_plain_info_entry \"network_mode\" \"$network_mode\" \"Network Mode\"\n    case $network_mode in\n    \"NR5G-SA Mode\"*)\n        # Use helper function for 5G\n        extra_info=\"NR5G-SA\"\n        set_5g_cell_info \"$nr_mcc\" \"$nr_mnc\" \"$nr_tac\" \"$nr_cell_id\" \"$nr_arfcn\" \\\n            \"$nr_physical_cell_id\" \"$nr_band\" \"${nr_ul_bandwidth}M\" \"${nr_dl_bandwidth}M\" \\\n            \"$nr_rsrp\" \"$nr_rsrq\" \"$nr_sinr\" \"\" \"$nr_rxlev\"\n        add_plain_info_entry \"SCS\" \"$nr_scs\" \"SCS\"\n        add_plain_info_entry \"Srxlev\" \"$nr_srxlev\" \"Serving Cell Receive Level\"\n        # Add CA info if present\n        if [ $ca_count -gt 1 ]; then\n            add_ca_info \"5G\" \"$scc_arfcn\" \"$scc_pci\" \"$scc_band\" \"${scc_ul_bandwidth}M\" \"${scc_dl_bandwidth}M\"\n            [ -n \"$scc_ul_bandwidth\" ] && add_plain_info_entry \"UL CA\" \"Yes\" \"UL CA\"\n        fi\n        ;;\n    \"EN-DC Mode\"*)\n        # LTE part\n        add_plain_info_entry \"LTE\" \"LTE\" \"\"\n        extra_info=\"LTE\"\n        set_4g_cell_info \"$endc_lte_mcc\" \"$endc_lte_mnc\" \"$endc_lte_tac\" \"$endc_lte_cell_id\" \\\n            \"$endc_lte_earfcn\" \"$endc_lte_physical_cell_id\" \"$endc_lte_band\" \\\n            \"$endc_lte_ul_bandwidth\" \"$endc_lte_dl_bandwidth\" \"$endc_lte_rsrp\" \"$endc_lte_rsrq\" \\\n            \"\" \"$endc_lte_rssnr\" \"$endc_lte_rxlev\"\n        add_plain_info_entry \"CQI\" \"$endc_lte_cql\" \"Channel Quality Indicator\"\n        add_plain_info_entry \"TX Power\" \"$endc_lte_tx_power\" \"TX Power\"\n        add_plain_info_entry \"Srxlev\" \"$endc_lte_srxlev\" \"Serving Cell Receive Level\"\n        # NR5G-NSA part\n        add_plain_info_entry \"NR5G-NSA\" \"NR5G-NSA\" \"\"\n        extra_info=\"NR5G-NSA\"\n        set_5g_cell_info \"$endc_nr_mcc\" \"$endc_nr_mnc\" \"$endc_nr_tac\" \"$endc_nr_cell_id\" \\\n            \"$endc_nr_arfcn\" \"$endc_nr_physical_cell_id\" \"$endc_nr_band\" \"\" \"$endc_nr_dl_bandwidth\" \\\n            \"$endc_nr_rsrp\" \"$endc_nr_rsrq\" \"$endc_nr_sinr\" \"\" \"$endc_nr_rxlev\"\n        add_plain_info_entry \"SCS\" \"$endc_nr_scs\" \"SCS\"\n        ;;\n    \"LTE Mode\"*)\n        extra_info=\"LTE\"\n        set_4g_cell_info \"$lte_mcc\" \"$lte_mnc\" \"$lte_tac\" \"$lte_cell_id\" \"$lte_earfcn\" \\\n            \"$lte_physical_cell_id\" \"$lte_band\" \"$lte_ul_bandwidth\" \"$lte_dl_bandwidth\" \\\n            \"$lte_rsrp\" \"$lte_rsrq\" \"\" \"$lte_rssnr\" \"$lte_rxlev\"\n        add_bar_info_entry \"RSSI\" \"$lte_rssi\" \"Received Signal Strength Indicator\" -120 -20 dBm\n        add_plain_info_entry \"CQI\" \"$lte_cql\" \"Channel Quality Indicator\"\n        add_plain_info_entry \"TX Power\" \"$lte_tx_power\" \"TX Power\"\n        add_plain_info_entry \"Srxlev\" \"$lte_srxlev\" \"Serving Cell Receive Level\"\n        ;;\n    \"WCDMA Mode\")\n        extra_info=\"WCDMA\"\n        set_3g_cell_info \"$wcdma_mcc\" \"$wcdma_mnc\" \"$wcdma_lac\" \"$wcdma_cell_id\" \\\n            \"$wcdma_uarfcn\" \"$wcdma_psc\" \"$wcdma_band\" \"\" \"\" \"$wcdma_rscp\" \"\" \"$wcdma_ecio\" \\\n            \"$wcdma_rxlev\" \"$wcdma_rac\"\n        add_plain_info_entry \"Ec/No\" \"$wcdma_ecno\" \"Ec/No\"\n        add_plain_info_entry \"Physical Channel\" \"$wcdma_phych\" \"Physical Channel\"\n        add_plain_info_entry \"Spreading Factor\" \"$wcdma_sf\" \"Spreading Factor\"\n        add_plain_info_entry \"Slot\" \"$wcdma_slot\" \"Slot\"\n        add_plain_info_entry \"Speech Code\" \"$wcdma_speech_code\" \"Speech Code\"\n        add_plain_info_entry \"Compression Mode\" \"$wcdma_com_mod\" \"Compression Mode\"\n        ;;\n    esac\n}\n\n# get sim switch capabilities\nsim_switch_capabilities(){\n    case $platform in\n        \"qualcomm\") sim_switch=\"1\" ;;\n        \"mediatek\") sim_switch=\"1\" ;;\n        *) sim_switch=\"0\" ;;\n    esac\n    json_add_string \"supportSwitch\" \"$sim_switch\"\n    json_add_array \"simSlots\"\n    json_add_string \"\" \"0\"\n    json_add_string \"\" \"1\"\n    json_close_array\n}\n\nget_sim_slot(){\n    local at_command=\"AT+GTDUALSIM?\"\n\tlocal expect_response=\"+GTDUALSIM\"\n    response=$(at $at_port $at_command |grep $expect_response)\n    case $platform in\n        \"qualcomm\")\n            sim_slot=$(echo \"$response\" | awk -F': ' '{print $2}' | awk -F',' '{print $1}' | tr -d '\\r')\n            ;;\n        \"mediatek\")\n            sim_slot=$(echo \"$response\" | awk -F': ' '{print $2}' | awk -F',' '{print $1}' | xargs)\n            ;;\n        *)\n            sim_slot=\"unknown\"\n            ;;\n    esac\n    json_add_string \"sim_slot\" \"$sim_slot\"\n}\n\nset_sim_slot(){\n    local sim_slot_param=$1\n    local at_command=\"AT+GTDUALSIM=$sim_slot_param\"\n    response=$(at $at_port $at_command)\n    json_add_string \"result\" \"$response\"\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/vendor/foxconn.sh",
    "content": "#!/bin/sh\n# Copyright (C) 2025 x-shark\n_Vendor=\"foxconn\"\n_Author=\"x-shark\"\n_Maintainer=\"x-shark <unknown>\"\nsource /usr/share/qmodem/generic.sh\ndebug_subject=\"foxconn_ctrl\"\n\nname=$(uci -q get qmodem.$config_section.name)\ncase \"$name\" in\n    \"t99w640\")\n        at_pre=\"AT+\"\n    ;;\n    *)\n        at_pre=\"AT^\"\n    ;;\nesac\n\nfunction get_imei(){\n    imei=$(at $at_port \"ATI\" | awk -F': ' '/^IMEI:/ {print $2}' | xargs)\n    json_add_string imei $imei\n}\n\nfunction set_imei(){\n    imei=$1\n    # 添加 80A 前缀\n    extended=\"80A${imei}\"\n    swapped=\"\"\n    len=${#extended}\n    i=0\n    while [ $i -lt $len ]; do\n        pair=$(echo \"$extended\" | cut -c$((i+1))-$((i+2)))\n        if [ ${#pair} -eq 2 ]; then\n            swapped=\"${swapped}${pair:1:1}${pair:0:1}\"\n        elif [ ${#pair} -eq 1 ]; then\n            swapped=\"${swapped}${pair:0:1}\"\n        fi\n        i=$((i+2))\n    done\n\n    # 两位分组加逗号，并转小写\n    formatted=$(echo \"$swapped\" | sed 's/../&,/g' | sed 's/,$//' | tr 'A-Z' 'a-z')\n\n    at $at_port $at_pre'nv=550,\"0\"'\n    at_command=$at_pre'nv=550,9,\"'$formatted'\"'\n    res=$(at $at_port \"$at_command\")\n    json_select \"result\"\n    json_add_string \"set_imei\" \"$res\"\n    json_close_object\n    get_imei\n}\n\nfunction get_mode(){\n    local mode_num\n    local mode\n    cfg=$(at $at_port $at_pre\"PCIEMODE?\")\n    config_type=`echo -e \"$cfg\" | grep -o '[0-9]'`\n    if [ \"$config_type\" = \"1\" ]; then\n        mode_num=\"0\"\n    json_add_int disable_mode_btn 1\n\n    else\n          ucfg=$(at $at_port $at_pre\"USBSWITCH?\")\n          config_type=$(echo \"$ucfg\" | grep USBSWITCH: |cut -d':' -f2|xargs)\n          if [ \"$config_type\" = \"9025\" ]; then\n             mode_num=\"1\"\n          elif [ \"$config_type\" = \"90D5\" ]; then\n             mode_num=\"0\"\n        fi\n    fi\n    case \"$platform\" in\n        \"qualcomm\")\n            case \"$mode_num\" in\n                \"0\") mode=\"mbim\" ;;\n                \"1\") mode=\"rmnet\" ;;\n                *) mode=\"${mode_num}\" ;;\n            esac\n        ;;\n        *)\n            mode=\"${mode_num}\"\n        ;;\n    esac\n    available_modes=$(uci -q get qmodem.$config_section.modes)\n    json_add_object \"mode\"\n    for available_mode in $available_modes; do\n        if [ \"$mode\" = \"$available_mode\" ]; then\n            json_add_string \"$available_mode\" \"1\"\n        else\n            json_add_string \"$available_mode\" \"0\"\n        fi\n    done\n    json_close_object\n\n}\n\nset_mode(){\n    local mode=$1\n    case \"$platform\" in\n        \"qualcomm\")\n            case \"$mode\" in\n                \"mbim\") mode_num=\"90d5\" ;;\n                \"rmnet\") mode_num=\"9025\" ;;\n                *) mode=\"90d5\" ;;\n            esac\n        ;;\n        *)\n            mode_num=\"90d5\"\n        ;;\n    esac\n    #设置模组\n    at_command=$at_pre\"USBSWITCH=${mode_num}\"\n    res=$(at \"${at_port}\" \"${at_command}\")\n    json_select \"result\"\n    json_add_string \"set_mode\" \"$res\"\n    json_close_object\n}\n\nfunction get_network_prefer(){\n    res=$(at $at_port $at_pre\"SLMODE?\"| grep -o '[0-9]\\+' | tr -d '\\n' | tr -d ' ')\n# (RAT index): \n# 0 Automatically \n# 1 WCDMA Only\n# 2 LTE Only \n# 3 WCDMA And LTE \n# 4 NR5G Only \n# 5 WCDMA And NR5G \n# 6 LTE And NR5G \n# 7 WCDMA And LTE And NR5G\n    local network_prefer_3g=\"0\"\n    local network_prefer_4g=\"0\"\n    local network_prefer_5g=\"0\"\n   case $res in\n        \"10\")\n            network_prefer_3g=\"1\"\n            network_prefer_4g=\"1\"\n            network_prefer_5g=\"1\"\n            ;;\n        \"11\")\n            network_prefer_3g=\"1\"\n            ;;\n        \"12\")\n            network_prefer_4g=\"1\"\n            ;;\n        \"13\")\n            network_prefer_3g=\"1\"\n            network_prefer_4g=\"1\"\n            ;;\n        \"14\")\n            network_prefer_5g=\"1\"\n            ;;\n        \"15\")\n            network_prefer_3g=\"1\"\n            network_prefer_5g=\"1\"\n            ;;\n        \"16\")\n            network_prefer_4g=\"1\"\n            network_prefer_5g=\"1\"\n            ;;\n        \"17\")\n            network_prefer_3g=\"1\"\n            network_prefer_4g=\"1\"\n            network_prefer_5g=\"1\"\n            ;;\n        *)\n            network_prefer_3g=\"0\"\n            network_prefer_4g=\"0\"\n            network_prefer_5g=\"0\"\n            ;;\n    esac\n    json_add_object network_prefer\n    json_add_string 3G $network_prefer_3g\n    json_add_string 4G $network_prefer_4g\n    json_add_string 5G $network_prefer_5g\n    json_close_array\n}\n\nfunction set_network_prefer(){\n    local network_prefer_3g=$(echo $1 |jq -r 'contains([\"3G\"])')\n    local network_prefer_4g=$(echo $1 |jq -r 'contains([\"4G\"])')\n    local network_prefer_5g=$(echo $1 |jq -r 'contains([\"5G\"])')\n    count=$(echo $1 | jq -r 'length')\n    case \"$count\" in\n        \"1\")\n            if [ \"$network_prefer_3g\" = \"true\" ]; then\n                code=\"11\"\n            elif [ \"$network_prefer_4g\" = \"true\" ]; then\n                code=\"12\"\n            elif [ \"$network_prefer_5g\" = \"true\" ]; then\n                code=\"14\"\n            fi\n            ;;\n        \"2\")\n            if [ \"$network_prefer_3g\" = \"true\" ] && [ \"$network_prefer_4g\" = \"true\" ]; then\n                code=\"13\"\n            elif [ \"$network_prefer_4g\" = \"true\" ] && [ \"$network_prefer_5g\" = \"true\" ]; then\n                code=\"16\"\n            elif [ \"$network_prefer_3g\" = \"true\" ] && [ \"$network_prefer_5g\" = \"true\" ]; then\n                code=\"15\"\n            fi\n            ;;\n        \"3\")\n            code=\"17\"\n            ;;\n        *)\n            code=\"10\"\n            ;;\n    esac\n    res=$(at $at_port $at_pre\"SLMODE=$(echo \"$code\" | awk '{print substr($0,1,1) \",\" substr($0,2,1)}')\")\n    json_add_string \"code\" \"$code\"\n    json_add_string \"result\" \"$res\"\n}\n\n\n\nfunction get_lockband(){\n    json_add_object \"lockband\"\n    case $platform in\n        \"qualcomm\")\n            get_lockband_nr\n            ;;\n    esac\n    json_close_object\n}\n\nfunction sim_info()\n{\n    class=\"SIM Information\"\n\n    #IMEI（国际移动设备识别码）\n    imei=$(at $at_port \"ATI\" | awk -F': ' '/^IMEI:/ {print $2}' | xargs)\n    \n    at_command=$at_pre\"switch_slot?\"\n    sim_slot=$(at $at_port $at_command | grep ENABLE|grep -o 'SIM[0-9]*')\n\n    #SIM Status（SIM状态）\n    at_command=\"AT+CPIN?\"\n    sim_status=$(at $at_port $at_command | grep \"+CPIN:\")\n    sim_status=${sim_status:7:-1}\n    #lowercase\n    sim_status=$(echo $sim_status | tr  A-Z a-z)\n\n    if [ \"$sim_status\" != \"ready\" ]; then\n        return\n    fi\n    \n    at_command=\"AT+COPS?\"\n    isp=$(at $at_port $at_command | sed -n '2p' | awk -F'\"' '{print $2}')\n    if [ \"$isp\" = \"CHN-CMCC\" ] || [ \"$isp\" = \"CMCC\" ]|| [ \"$isp\" = \"46000\" ]; then\n         isp=\"中国移动\"\n    # # elif [ \"$isp\" = \"CHN-UNICOM\" ] || [ \"$isp\" = \"UNICOM\" ] || [ \"$isp\" = \"46001\" ]; then\n    elif [ \"$isp\" = \"CHN-UNICOM\" ] || [ \"$isp\" = \"CUCC\" ] || [ \"$isp\" = \"46001\" ]; then\n         isp=\"中国联通\"\n    elif [ \"$isp\" = \"CHN-CT\" ] || [ \"$isp\" = \"CT\" ] || [ \"$isp\" = \"46011\" ]; then\n    # elif [ \"$isp\" = \"CHN-TELECOM\" ] || [ \"$isp\" = \"CTCC\" ] || [ \"$isp\" = \"46011\" ]; then\n         isp=\"中国电信\"\n    fi\n\n    at_command=\"AT+CNUM\"\n    sim_number=$(at $at_port $at_command | awk -F'\"' '{print $2}'|xargs)\n\n    #IMSI（国际移动用户识别码）\n    at_command=\"AT+CIMI\"\n    imsi=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n\n    #ICCID（集成电路卡识别码）\n    at_command=\"AT+ICCID\"\n    iccid=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g'|sed 's/[^0-9]*//g')\n    case \"$sim_status\" in\n        \"ready\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"ISP\" \"$isp\" \"Internet Service Provider\"\n            add_plain_info_entry \"SIM Slot\" \"$sim_slot\" \"SIM Slot\"\n            add_plain_info_entry \"SIM Number\" \"$sim_number\" \"SIM Number\"\n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n            add_plain_info_entry \"IMSI\" \"$imsi\" \"International Mobile Subscriber Identity\" \n            add_plain_info_entry \"ICCID\" \"$iccid\" \"Integrate Circuit Card Identity\" \n        ;;\n        \"miss\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n        ;;\n        \"unknown\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n        ;;\n        *)\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"SIM Slot\" \"$sim_slot\" \"SIM Slot\" \n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n            add_plain_info_entry \"IMSI\" \"$imsi\" \"International Mobile Subscriber Identity\" \n            add_plain_info_entry \"ICCID\" \"$iccid\" \"Integrate Circuit Card Identity\" \n        ;;\n    esac\n}\n\nfunction base_info(){\n        #Name（名称）\n    at_command=\"ATI\"\n    baseinfos=$(at $at_port $at_command)\n    name=$(echo \"$baseinfos\"| awk -F': ' '/^Manufacturer:/ {print $2}' |xargs)\n    #Manufacturer（制造商）\n    manufacturer=$(echo \"$baseinfos\"|awk -F': ' '/^Manufacturer:/ {print $2}' |xargs)\n    #Revision（固件版本）\n    revision=$(echo \"$baseinfos\"|awk -F': ' '/^Revision:/ {print $2}' | xargs)\n    class=\"Base Information\"\n    add_plain_info_entry \"manufacturer\" \"$manufacturer\" \"Manufacturer\"\n    add_plain_info_entry \"revision\" \"$revision\" \"Revision\"\n    add_plain_info_entry \"at_port\" \"$at_port\" \"AT Port\"\n    get_connect_status\n    _get_temperature\n    _get_voltage\n}\n\nfunction network_info() {\n    class=\"Network Information\"\n    [ -z \"$network_type\" ] && {\n        at_command='AT+COPS?'\n        local rat_num=$(at ${at_port} ${at_command} | grep \"+COPS:\" | awk -F',' '{print $4}' | sed 's/\\r//g')\n        network_type=$(get_rat ${rat_num})\n    }\n    #at_command='AT+debug?'\n    #response=$(at $at_port $at_command)\n    #lte_sinr=$(echo \"$response\"|awk -F'lte_snr:' '{print $2}'|awk '{print $1}|xargs)\n    add_plain_info_entry \"Network Type\" \"$network_type\" \"Network Type\"\n}\n\nfunction vendor_get_disabled_features(){\n    json_add_string \"\" \"NeighborCell\"\n}\n\nget_lockband_nr()\n{\n    m_debug  \"Quectel sdx55 get lockband info\"\n    bands_command=$at_pre\"BAND_PREF?\"\n    get_lockbans=$(at $at_port $bands_command)\n\n    # WCDMA\n    wcdma_enable=$(echo \"$get_lockbans\" | grep \"WCDMA,Enable Bands\" | cut -d':' -f2 | tr -d ' ' | tr ',' ' ')\n    wcdma_disable=$(echo \"$get_lockbans\" | grep \"WCDMA,Disable Bands\" | cut -d':' -f2 | tr -d ' ' | tr ',' ' ')\n    wcdma_enable=$(echo \"$wcdma_enable\" | tr ' ' '\\n' | grep -v '^$')\n    wcdma_disable=$(echo \"$wcdma_disable\" | tr ' ' '\\n' | grep -v '^$')\n    wcdma_all=$(echo \"$wcdma_enable $wcdma_disable\" | tr ' ' '\\n' | grep -v '^$' | sort -n | uniq)\n\n    # LTE\n    lte_enable=$(echo \"$get_lockbans\" | grep \"LTE,Enable Bands\" | cut -d':' -f2 | tr -d ' ' | tr ',' ' ')\n    lte_disable=$(echo \"$get_lockbans\" | grep \"LTE,Disable Bands\" | cut -d':' -f2 | tr -d ' ' | tr ',' ' ')\n    lte_enable=$(echo \"$lte_enable\" | tr ' ' '\\n' | grep -v '^$')\n    lte_disable=$(echo \"$lte_disable\" | tr ' ' '\\n' | grep -v '^$')\n    lte_all=$(echo \"$lte_enable $lte_disable\" | tr ' ' '\\n' | grep -v '^$' | sort -n | uniq)\n\n    # NR5G_NSA\n    nr_nsa_enable=$(echo \"$get_lockbans\" | grep \"NR5G_NSA,Enable Bands\" | cut -d':' -f2 | tr -d ' ' | tr ',' ' ')\n    nr_nsa_disable=$(echo \"$get_lockbans\" | grep \"NR5G_NSA,Disable Bands\" | cut -d':' -f2 | tr -d ' ' | tr ',' ' ')\n    nr_nsa_enable=$(echo \"$nr_nsa_enable\" | tr ' ' '\\n' | grep -v '^$')\n    nr_nsa_disable=$(echo \"$nr_nsa_disable\" | tr ' ' '\\n' | grep -v '^$')\n    nr_nsa_all=$(echo \"$nr_nsa_enable $nr_nsa_disable\" | tr ' ' '\\n' | grep -v '^$' | sort -n | uniq)\n\n    # NR5G_SA\n    nr_sa_enable=$(echo \"$get_lockbans\" | grep \"NR5G_SA,Enable Bands\" | cut -d':' -f2 | tr -d ' ' | tr ',' ' ')\n    nr_sa_disable=$(echo \"$get_lockbans\" | grep \"NR5G_SA,Disable Bands\" | cut -d':' -f2 | tr -d ' ' | tr ',' ' ')\n    nr_sa_enable=$(echo \"$nr_sa_enable\" | tr ' ' '\\n' | grep -v '^$')\n    nr_sa_disable=$(echo \"$nr_sa_disable\" | tr ' ' '\\n' | grep -v '^$')\n    nr_sa_all=$(echo \"$nr_sa_enable $nr_sa_disable\" | tr ' ' '\\n' | grep -v '^$' | sort -n | uniq)\n\n    # UMTS\n    json_add_object \"UMTS\"\n    json_add_array \"available_band\"\n    for i in $wcdma_all; do\n        echo \"$i\" | grep -Eq '^[0-9]+$' && add_avalible_band_entry \"$i\" \"UMTS_$i\"\n    done\n    json_close_array\n    json_add_array \"lock_band\"\n    for i in $wcdma_enable; do\n        echo \"$i\" | grep -Eq '^[0-9]+$' && json_add_string \"\" \"$i\"\n    done\n    json_close_array\n    json_close_object\n\n    # LTE\n    json_add_object \"LTE\"\n    json_add_array \"available_band\"\n    for i in $lte_all; do\n        echo \"$i\" | grep -Eq '^[0-9]+$' && add_avalible_band_entry \"$i\" \"LTE_B$i\"\n    done\n    json_close_array\n    json_add_array \"lock_band\"\n    for i in $lte_enable; do\n        echo \"$i\" | grep -Eq '^[0-9]+$' && json_add_string \"\" \"$i\"\n    done\n    json_close_array\n    json_close_object\n\n    # NR_NSA\n    json_add_object \"NR_NSA\"\n    json_add_array \"available_band\"\n    for i in $nr_nsa_all; do\n        echo \"$i\" | grep -Eq '^[0-9]+$' && add_avalible_band_entry \"$i\" \"NR_NSA_N$i\"\n    done\n    json_close_array\n    json_add_array \"lock_band\"\n    for i in $nr_nsa_enable; do\n        echo \"$i\" | grep -Eq '^[0-9]+$' && json_add_string \"\" \"$i\"\n    done\n    json_close_array\n    json_close_object\n\n    # NR_SA\n    json_add_object \"NR_SA\"\n    json_add_array \"available_band\"\n    for i in $nr_sa_all; do\n        echo \"$i\" | grep -Eq '^[0-9]+$' && add_avalible_band_entry \"$i\" \"NR_SA_N$i\"\n    done\n    json_close_array\n    json_add_array \"lock_band\"\n    for i in $nr_sa_enable; do\n        echo \"$i\" | grep -Eq '^[0-9]+$' && json_add_string \"\" \"$i\"\n    done\n    json_close_array\n    json_close_object\n}\n\nset_lockband_nr(){\n    #lock_band=$(echo $lock_band | tr ',' ':')\n    case \"$band_class\" in\n        \"UMTS\") \n        lock_band=$(echo $lock_band)\n            at_command=$at_pre\"BAND_PREF=WCDMA,2,$lock_band\"\n            res=$(at $at_port $at_command)\n            ;;\n        \"LTE\") \n            at_command=$at_pre\"BAND_PREF=LTE,2,$lock_band\"\n            res=$(at $at_port $at_command)\n            ;;\n        \"NR\")\n            at_command=$at_pre\"BAND_PREF=NR5G,2,$lock_band\"\n            res=$(at $at_port $at_command)\n            ;;\n    esac\n}\n\nset_lockband()\n{\n    m_debug  \"quectel set lockband info\"\n    config=$1\n    #{\"band_class\":\"NR\",\"lock_band\":\"41,78,79\"}\n    band_class=$(echo $config | jq -r '.band_class')\n    lock_band=$(echo $config | jq -r '.lock_band')\n    case \"$platform\" in\n        *)\n            set_lockband_nr\n        ;;\n    esac\n    json_select \"result\"\n    json_add_string \"set_lockband\" \"$res\"\n    json_add_string \"config\" \"$config\"\n    json_add_string \"band_class\" \"$band_class\"\n    json_add_string \"lock_band\" \"$lock_band\"\n    json_close_object\n}\n\nfunction _get_voltage(){\n    voltage=$(at $at_port \"AT!PCVOLT?\" | grep -o 'Power supply voltage: [0-9]* mV'|grep -o '[0-9]*' )\n    [ -n \"$voltage\" ] && {\n        add_plain_info_entry \"voltage\" \"$voltage mV\" \"Voltage\" \n    }\n}\n\nfunction _get_temperature(){\n    temperature=$(at $at_port $at_pre\"temp?\" | sed -n 's/.*TSENS: \\([0-9]*\\)C.*/\\1/p' )\n    [ -n \"$temperature\" ] && {\n        add_plain_info_entry \"temperature\" \"$temperature C\" \"Temperature\" \n    }\n}\n\nfunction _add_avalible_band(){\n    add_avalible_band_entry $1 $1\n}\n\nfunction _add_lock_band(){\n    json_add_string \"\" $1\n}\n\nfunction _mask_to_band()\n{\n    func=$1\n    low_band=$2\n    high_band=$3\n    low_band=$(echo \"obase=2; ibase=16; $low_band\" | bc)\n    low_band=$(printf \"%064s\" $low_band)\n    for i in $(seq 1 64); do\n        if [ \"${low_band: -$i:1}\" = \"1\" ]; then\n            band=$i\n            $func $band\n        fi\n    done\n    [ -z \"$high_band\" ] && return\n    high_band=$(echo \"obase=2; ibase=16; $high_band\" | bc)\n    high_band=$(printf \"%064s\" $high_band)\n    for i in $(seq 1 64); do\n        if [ \"${high_band: -$i:1}\" = \"1\" ]; then\n            band=$((64+i))\n            $func $band\n        fi\n    done\n\n}\n\nfunction _band_list_to_mask()\n{\n    local band_list=$1\n    local low=0\n    local high=0\n    #以逗号分隔\n    IFS=\",\"\n    for band in $band_list;do\n        if [ \"$band\" -le 64 ]; then\n            #使用bc计算2的band次方\n            res=$(echo \"2^($band-1)\" | bc)\n            low=$(echo \"$low+$res\" | bc)\n\n        else\n            tmp_band=$((band-64))\n            res=$(echo \"2^($tmp_band-1)\" | bc)\n            high=$(echo \"$high+$res\" | bc)\n        fi\n    done\n    #十六进制输出，padding到16位\n    low=$(printf \"%016x\" $low)\n    high=$(printf \"%016x\" $high)\n    echo \"$low,$high\"\n}\n\nfunction process_signal_value() {\n    local value=\"$1\"\n    local numbers=$(echo \"$value\" | grep -oE '[-+]?[0-9]+(\\.[0-9]+)?')\n    local count=0\n    local total=0\n\n    for num in $numbers; do\n        total=$(echo \"$total + $num\" | bc -l)\n        count=$((count+1))\n    done\n\n    if [ $count -gt 0 ]; then\n        echo \"scale=2; $total / $count\" | bc -l | sed 's/^\\./0./' | sed 's/^-\\./-0./'\n    else\n        echo \"\"\n    fi\n}\n\ncell_info(){\n    class=\"Cell Information\"\n    at_command=$at_pre\"debug?\"\n    response=$(at $at_port $at_command)\n    network_mode=$(echo \"$response\"|awk -F'RAT:' '{print $2}'|xargs)\n    #add_plain_info_entry \"network_mode\" \"$network_mode\" \"Network Mode\"\n\n    case $network_mode in\n    \"LTE\")\n        lte_mcc=$(echo \"$response\"|awk -F'mcc:' '{print $2}'|awk -F',' '{print $1}'|xargs)\n        lte_mnc=$(echo \"$response\"|awk -F'mnc:' '{print $2}'|xargs)\n        lte_earfcn=$(echo \"$response\"|awk -F'channel:' '{print $2}'|awk -F' ' '{print $1}'|xargs)\n        lte_physical_cell_id=$(echo \"$response\"|awk -F'pci:' '{print $2}'|awk -F' ' '{print $1}'|xargs)\n        lte_cell_id=$(echo \"$response\"|awk -F'lte_cell_id:' '{print $2}'|xargs)\n        lte_band=$(echo \"$response\"|awk -F'lte_band:' '{print $2}'|awk -F' ' '{print $1}'|xargs)\n        lte_freq_band_ind=$(echo \"$response\"|awk -F'lte_band_width:' '{print $2}'|xargs)\n        lte_sinr=$(echo \"$response\"|awk -F'lte_snr:' '{print $2}'|awk '{print $1}'|xargs)\n        lte_sinr=$(process_signal_value \"$lte_sinr\")\n        lte_rsrq=$(echo \"$response\"|awk -F'rsrq:' '{print $2}'|xargs)\n        lte_rsrq=$(process_signal_value \"$lte_rsrq\")\n        lte_rssi=$(echo \"$response\"|awk -F'lte_rssi:' '{print $2}'|awk -F',' '{print $1}'|xargs)\n        lte_rssi=$(process_signal_value \"$lte_rssi\")\n        lte_tac=$(echo \"$response\"|awk -F'lte_tac:' '{print $2}'|xargs)\n        lte_tx_power=$(echo \"$response\"|awk -F'lte_tx_pwr:' '{print $2}'|xargs)\n\n        add_plain_info_entry \"MCC\" \"$lte_mcc\" \"Mobile Country Code\"\n        add_plain_info_entry \"MNC\" \"$lte_mnc\" \"Mobile Network Code\"\n        #add_plain_info_entry \"Duplex Mode\" \"$lte_duplex_mode\" \"Duplex Mode\"\n        add_plain_info_entry \"Cell ID\" \"$lte_cell_id\" \"Cell ID\"\n        add_plain_info_entry \"Physical Cell ID\" \"$lte_physical_cell_id\" \"Physical Cell ID\"\n        add_plain_info_entry \"EARFCN\" \"$lte_earfcn\" \"E-UTRA Absolute Radio Frequency Channel Number\"\n        add_plain_info_entry \"Freq band indicator\" \"$lte_freq_band_ind\" \"Freq band indicator\"\n        add_plain_info_entry \"Band\" \"$lte_band\" \"Band\"\n        #add_plain_info_entry \"UL Bandwidth\" \"$lte_ul_bandwidth\" \"UL Bandwidth\"\n        #add_plain_info_entry \"DL Bandwidth\" \"$lte_dl_bandwidth\" \"DL Bandwidth\"\n        add_plain_info_entry \"TAC\" \"$lte_tac\" \"Tracking area code of cell served by neighbor Enb\"\n        add_bar_info_entry \"RSRQ\" \"$lte_rsrq\" \"Reference Signal Received Quality\" -19.5 -3 dB\n        add_bar_info_entry \"RSSI\" \"$lte_rssi\" \"Received Signal Strength Indicator\" -120 -20 dBm\n        add_bar_info_entry \"SINR\" \"$lte_sinr\" \"Signal to Interference plus Noise Ratio Bandwidth\" 0 30 dB\n        #add_plain_info_entry \"RxLev\" \"$lte_rxlev\" \"Received Signal Level\"\n        add_plain_info_entry \"RSSNR\" \"$lte_rssnr\" \"Radio Signal Strength Noise Ratio\"\n        #add_plain_info_entry \"CQI\" \"$lte_cql\" \"Channel Quality Indicator\"\n        add_plain_info_entry \"TX Power\" \"$lte_tx_power\" \"TX Power\"\n        #add_plain_info_entry \"Srxlev\" \"$lte_srxlev\" \"Serving Cell Receive Level\"\n        ;;\n    \"NR5G_SA\")\n        has_ca=$(echo \"$response\" | grep -c \"nr_scc1:\")\n        nr_display_mode=\"$network_mode\"\n        \n        nr_mcc=$(echo \"$response\"|awk -F'mcc:' '{print $2}'|awk -F',' '{print $1}'|xargs)\n        nr_mnc=$(echo \"$response\"|awk -F'mnc:' '{print $2}'|xargs)\n        nr_earfcn=$(echo \"$response\"|awk -F'channel:' '{print $2}'|awk -F' ' '{print $1}'|xargs)\n        nr_physical_cell_id=$(echo \"$response\"|awk -F'pci:' '{print $2}'|awk -F' ' '{print $1}'|xargs)\n        nr_cell_id=$(echo \"$response\"|awk -F'nr_cell_id:' '{print $2}'|xargs)\n        nr_band=$(echo \"$response\"|awk -F'nr_band:' '{print $2}'|awk -F' ' '{print $1}'|xargs)\n        nr_band_width=$(echo \"$response\"|awk -F'nr_band_width:' '{print $2}'|awk -F' ' '{print $1}'|xargs)\n        nr_freq_band_ind=$(echo \"$response\"|awk -F'lte_band_width:' '{print $2}'|xargs)\n        nr_sinr=$(echo \"$response\"|awk -F'nr_snr:' '{print $2}'|awk '{print $1}'|xargs)\n        nr_sinr=$(process_signal_value \"$nr_sinr\")\n        nr_rsrq=$(echo \"$response\"|awk -F'rsrq:' '{print $2}'|xargs)\n        nr_rsrq=$(process_signal_value \"$nr_rsrq\")\n        nr_rsrp=$(echo \"$response\"|awk -F'rsrp:' '{print $2}'|awk '{print $1}'|xargs)\n        nr_rsrp=$(process_signal_value \"$nr_rsrp\")\n        nr_rssi=$(echo \"$response\"|awk -F'nr_rssi:' '{print $2}'|awk -F',' '{print $1}'|xargs)\n        nr_rssi=$(process_signal_value \"$nr_rssi\")\n        nr_tac=$(echo \"$response\"|awk -F'nr_tac:' '{print $2}'|xargs)\n        nr_tx_power=$(echo \"$response\"|awk -F'nr_tx_pwr:' '{print $2}'|xargs)\n\n        if [ \"$has_ca\" -gt 0 ]; then\n            nr_display_mode=\"NR5G_SA-CA\"\n\n            scc1_band=$(echo \"$response\" | awk -F'nr_scc1:' '{print $2}' | awk -F'nr_band:' '{print $2}' | awk -F' ' '{print $1}' | xargs)\n            scc1_band_width=$(echo \"$response\" | awk -F'nr_scc1:' '{print $2}' | awk -F'nr_band_width:' '{print $2}' | awk -F' ' '{print $1}' | xargs)\n\n            nr_band=\"$nr_band $scc1_band\"\n            nr_band_width=\"$nr_band_width $scc1_band_width\"\n        fi\n\n        add_plain_info_entry \"Network Mode\" \"$nr_display_mode\" \"Network Mode\"\n        add_plain_info_entry \"Band\" \"$nr_band\" \"Band\"\n        add_plain_info_entry \"DL Bandwidth\" \"$nr_band_width\" \"DL Bandwidth\"\n        add_plain_info_entry \"MCC\" \"$nr_mcc\" \"Mobile Country Code\"\n        add_plain_info_entry \"MNC\" \"$nr_mnc\" \"Mobile Network Code\"\n        #add_plain_info_entry \"Duplex Mode\" \"$lte_duplex_mode\" \"Duplex Mode\"\n        add_plain_info_entry \"Cell ID\" \"$nr_cell_id\" \"Cell ID\"\n        add_plain_info_entry \"Physical Cell ID\" \"$nr_physical_cell_id\" \"Physical Cell ID\"\n        add_plain_info_entry \"EARFCN\" \"$nr_earfcn\" \"E-UTRA Absolute Radio Frequency Channel Number\"\n        add_plain_info_entry \"Freq band indicator\" \"$nr_freq_band_ind\" \"Freq band indicator\"\n        add_plain_info_entry \"TAC\" \"$nr_tac\" \"Tracking area code of cell served by neighbor Enb\"\n        add_bar_info_entry \"RSRQ\" \"$nr_rsrq\" \"Reference Signal Received Quality\" -19.5 -3 dB\n        add_bar_info_entry \"RSRP\" \"$nr_rsrp\" \"Reference Signal Received Power\" -140 -44 dBm\n        add_bar_info_entry \"SINR\" \"$nr_sinr\" \"Signal to Interference plus Noise Ratio Bandwidth\" 0 30 dB\n        add_plain_info_entry \"TX Power\" \"$nr_tx_power\" \"TX Power\"\n        ;;\n    esac\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/vendor/gosuncn.sh",
    "content": "#!/bin/sh\n# Copyright (C) 2025 Fujr <fjrcn@outlook.com>\n_Vendor=\"Gosuncn\"\n_Author=\"Fujr\"\n_Maintainer=\"Fujr <fjrcn@outlook.com>\"\nsource /usr/share/qmodem/generic.sh\ndebug_subject=\"gosuncn_ctrl\"\n\n#获取LTE带宽\n# $1:带宽数字\nget_lte_bw() {\n    local bw_num=\"$1\"\n    local bw\n    case \"$bw_num\" in\n        \"0\") bw=\"1.4\" ;;\n        \"1\") bw=\"3\" ;;\n        \"2\"|\"3\"|\"4\"|\"5\") bw=\"$(((bw_num - 1) * 5))\" ;;\n        *) bw=\"\" ;;\n    esac\n    echo \"$bw\"\n}\n\n#将十六进制频段掩码转换为频段号列表\nconvert2band()\n{\n    local hex_band=\"$1\"\n    local hex=$(echo \"$hex_band\" | grep -o \"[0-9A-Fa-f]\\{1,16\\}\" | tr 'a-f' 'A-F')\n    if [ -z \"$hex\" ]; then\n        return\n    fi\n    local band_list=\"\"\n    local bin=$(echo \"ibase=16;obase=2;$hex\" | bc)\n    local len=${#bin}\n    local i\n    for i in $(seq 1 ${#bin}); do\n        if [ \"${bin:$((i-1)):1}\" = \"1\" ]; then\n            band_list=\"$band_list $((len - i + 1))\"\n        fi\n    done\n    echo \"$band_list\" | tr ' ' '\\n' | sort -n | tr '\\n' ' '\n}\n\n#将频段号列表转换为十六进制掩码\nconvert2hex()\n{\n    local band_list=\"$1\"\n    band_list=$(echo \"$band_list\" | tr ',' '\\n' | sort -n | uniq)\n    local hex=\"0\"\n    local band\n    for band in $band_list; do\n        local add_hex=$(echo \"obase=16;2^($band - 1)\" | bc)\n        hex=$(echo \"obase=16;ibase=16;$hex + $add_hex\" | bc)\n    done\n    if [ -n \"$hex\" ]; then\n        echo \"$hex\"\n    fi\n}\n\nget_imei(){\n    imei=$(at $at_port \"AT+CGSN\" | grep -o '[0-9]\\{15\\}')\n    json_add_string imei \"$imei\"\n}\n\nset_imei(){\n    local imei=\"$1\"\n    at $at_port \"AT+EGMR=1,7,\\\"$imei\\\"\"\n}\n\n#获取拨号模式\nget_mode()\n{\n    case \"$platform\" in\n        \"qualcomm\")\n            local mode_raw=$(at $at_port \"AT+ZSWITCH?\" | grep -o \"+ZSWITCH: [a-zA-Z]\" | cut -d' ' -f2)\n            case \"$mode_raw\" in\n                \"e\") mode=\"mbim\" ;;\n                \"x\") mode=\"rmnet\" ;;\n                \"r\") mode=\"rndis\" ;;\n                \"E\") mode=\"ecm\" ;;\n                *) mode=\"$mode_raw\" ;;\n            esac\n        ;;\n        \"lte\")\n            local mode_raw=$(at $at_port \"AT+ZSWITCH?\" | grep -o \"+ZSWITCH: [a-zA-Z]\" | cut -d' ' -f2)\n            case \"$mode_raw\" in\n                \"e\") mode=\"mbim\" ;;\n                \"x\") mode=\"rmnet\" ;;\n                \"r\") mode=\"rndis\" ;;\n                \"l\") mode=\"ecm\" ;;\n                *) mode=\"$mode_raw\" ;;\n            esac\n        ;;\n        *)\n            local mode_raw=$(at $at_port \"AT+ZSWITCH?\" | grep -o \"+ZSWITCH: [a-zA-Z]\" | cut -d' ' -f2)\n            case \"$mode_raw\" in\n                \"e\") mode=\"mbim\" ;;\n                \"x\") mode=\"rmnet\" ;;\n                \"r\") mode=\"rndis\" ;;\n                \"E\") mode=\"ecm\" ;;\n                *) mode=\"$mode_raw\" ;;\n            esac\n        ;;\n    esac\n    available_modes=$(uci -q get qmodem.$config_section.modes)\n    json_add_object \"mode\"\n    for available_mode in $available_modes; do\n        if [ \"$mode\" = \"$available_mode\" ]; then\n            json_add_string \"$available_mode\" \"1\"\n        else\n            json_add_string \"$available_mode\" \"0\"\n        fi\n    done\n    json_close_object\n}\n\n#设置拨号模式\nset_mode()\n{\n    local mode=$1\n    case $mode in\n        \"mbim\")\n            at $at_port \"AT+ZSWITCH=e\"\n            ;;\n        \"rmnet\")\n            at $at_port \"AT+ZSWITCH=x\"\n            ;;\n        \"rndis\")\n            at $at_port \"AT+ZSWITCH=r\"\n            ;;\n        \"ecm\")\n            at $at_port \"AT+ZSWITCH=E\"\n            ;;\n        *)\n            echo \"Invalid mode\"\n            return 1\n            ;;\n    esac\n}\n\n#获取网络偏好\nget_network_prefer()\n{\n    case \"$platform\" in\n        \"qualcomm\")\n            get_network_prefer_qualcomm\n        ;;\n        \"lte\")\n            get_network_prefer_lte\n        ;;\n        *)\n            get_network_prefer_lte\n        ;;\n    esac\n}\n\nget_network_prefer_lte()\n{\n    # AT+ZSNT? 返回格式: +ZSNT: cm_mode,net_sel_mode,pref_acq\n    # cm_mode: 0=自动, 2=WCDMA, 6=LTE\n    local res=$(at $at_port \"AT+ZSNT?\" | grep -o \"+ZSNT: [0-9,]*\" | cut -d' ' -f2)\n    local cm_mode=$(echo $res | cut -d',' -f1)\n\n    network_prefer_3g=\"0\"\n    network_prefer_4g=\"0\"\n\n    case \"$cm_mode\" in\n        \"0\") network_prefer_3g=\"1\"; network_prefer_4g=\"1\" ;;\n        \"2\") network_prefer_3g=\"1\" ;;\n        \"6\") network_prefer_4g=\"1\" ;;\n    esac\n\n    json_add_object network_prefer\n    json_add_string 3G \"$network_prefer_3g\"\n    json_add_string 4G \"$network_prefer_4g\"\n    json_close_object\n}\n\nget_network_prefer_qualcomm()\n{\n    local res=$(at $at_port \"AT+ZSNT?\" | grep -o \"+ZSNT: [0-9,]*\" | cut -d' ' -f2)\n    local cm_mode=$(echo $res | cut -d',' -f1)\n\n    network_prefer_3g=\"0\"\n    network_prefer_4g=\"0\"\n    network_prefer_5g=\"0\"\n\n    case \"$cm_mode\" in\n        \"0\") network_prefer_3g=\"1\"; network_prefer_4g=\"1\"; network_prefer_5g=\"1\" ;;\n        \"2\") network_prefer_3g=\"1\" ;;\n        \"6\") network_prefer_4g=\"1\" ;;\n    esac\n\n    json_add_object network_prefer\n    json_add_string 3G \"$network_prefer_3g\"\n    json_add_string 4G \"$network_prefer_4g\"\n    json_add_string 5G \"$network_prefer_5g\"\n    json_close_object\n}\n\n#设置网络偏好\nset_network_prefer()\n{\n    network_prefer_3g=$(echo $1 | jq -r 'contains([\"3G\"])')\n    network_prefer_4g=$(echo $1 | jq -r 'contains([\"4G\"])')\n    network_prefer_5g=$(echo $1 | jq -r 'contains([\"5G\"])')\n    local length=$(echo $1 | jq -r 'length')\n\n    case \"$platform\" in\n        \"qualcomm\")\n            set_network_prefer_qualcomm \"$length\"\n        ;;\n        \"lte\")\n            set_network_prefer_lte \"$length\"\n        ;;\n        *)\n            set_network_prefer_lte \"$length\"\n        ;;\n    esac\n}\n\nset_network_prefer_lte()\n{\n    local length=\"$1\"\n    local zsnt_mode\n\n    case \"$length\" in\n        \"1\")\n            if [ \"$network_prefer_3g\" = \"true\" ]; then\n                zsnt_mode=\"2,0,0\"\n            elif [ \"$network_prefer_4g\" = \"true\" ]; then\n                zsnt_mode=\"6,0,0\"\n            fi\n            ;;\n        \"2\")\n            zsnt_mode=\"0,0,0\"\n            ;;\n        *)\n            zsnt_mode=\"0,0,0\"\n            ;;\n    esac\n\n    at $at_port \"AT+ZSNT=$zsnt_mode\"\n}\n\nset_network_prefer_qualcomm()\n{\n    local length=\"$1\"\n    local zsnt_mode\n\n    case \"$length\" in\n        \"1\")\n            if [ \"$network_prefer_3g\" = \"true\" ]; then\n                zsnt_mode=\"2,0,0\"\n            elif [ \"$network_prefer_4g\" = \"true\" ]; then\n                zsnt_mode=\"6,0,0\"\n            fi\n            ;;\n        *)\n            zsnt_mode=\"0,0,0\"\n            ;;\n    esac\n\n    at $at_port \"AT+ZSNT=$zsnt_mode\"\n}\n\n#获取温度\nget_temperature()\n{\n    local temp=$(at $at_port \"AT+MTSM=1\" | grep '+MTSM:' | cut -d: -f2 | tr -d ' \\r')\n    if [ -n \"$temp\" ]; then\n        temp=\"${temp}$(printf \"\\xc2\\xb0\")C\"\n    fi\n    add_plain_info_entry \"temperature\" \"$temp\" \"Temperature\"\n}\n\n#获取锁频信息\nget_lockband()\n{\n    json_add_object \"lockband\"\n    case \"$platform\" in\n        \"qualcomm\")\n            get_lockband_qualcomm\n        ;;\n        \"lte\")\n            get_lockband_lte\n        ;;\n        *)\n            get_lockband_lte\n        ;;\n    esac\n    json_close_object\n}\n\nget_lockband_lte()\n{\n    m_debug \"Gosuncn LTE get lockband info\"\n    # AT+ZBAND? 返回当前锁定的LTE频段\n    # AT+ZBAND=? 返回支持的LTE频段\n    local modem_info=$(at $at_port 'AT+ZBAND?' | grep -i 'LTE' | cut -d: -f2 | tr -d '\\r ')\n    local LTE_LOCK_SUPPORTBAND=$(at $at_port 'AT+ZBAND=?' | grep -i 'LTE' | cut -d: -f2 | tr -d '() \\r')\n\n    local lte_avalible_band=\"\"\n    [ -n \"$(uci -q get qmodem.$config_section.lte_band)\" ] && lte_avalible_band=$(uci -q get qmodem.$config_section.lte_band | tr '/' ',')\n\n    json_add_object \"LTE\"\n    json_add_array \"available_band\"\n    if [ -n \"$lte_avalible_band\" ]; then\n        for band in $(echo \"$lte_avalible_band\" | tr ',' '\\n' | sort -n | uniq); do\n            add_avalible_band_entry \"$band\" \"LTE_B$band\"\n        done\n    elif [ -n \"$LTE_LOCK_SUPPORTBAND\" ]; then\n        for band in $(echo \"$LTE_LOCK_SUPPORTBAND\" | tr ',' '\\n' | sort -n | uniq); do\n            add_avalible_band_entry \"$band\" \"LTE_B$band\"\n        done\n    fi\n    json_close_array\n\n    json_add_array \"lock_band\"\n    if [ -n \"$modem_info\" ]; then\n        for band in $(echo \"$modem_info\" | tr ',' '\\n' | sort -n | uniq); do\n            json_add_string \"\" \"$band\"\n        done\n    fi\n    json_close_array\n    json_close_object\n}\n\nget_lockband_qualcomm()\n{\n    m_debug \"Gosuncn qualcomm get lockband info\"\n    local modem_info=$(at $at_port 'AT+ZBAND?' | grep -i 'LTE' | cut -d: -f2 | tr -d '\\r ')\n    local LTE_LOCK_SUPPORTBAND=$(at $at_port 'AT+ZBAND=?' | grep -i 'LTE' | cut -d: -f2 | tr -d '() \\r')\n\n    local lte_avalible_band=\"\"\n    [ -n \"$(uci -q get qmodem.$config_section.lte_band)\" ] && lte_avalible_band=$(uci -q get qmodem.$config_section.lte_band | tr '/' ',')\n\n    json_add_object \"LTE\"\n    json_add_array \"available_band\"\n    if [ -n \"$lte_avalible_band\" ]; then\n        for band in $(echo \"$lte_avalible_band\" | tr ',' '\\n' | sort -n | uniq); do\n            add_avalible_band_entry \"$band\" \"LTE_B$band\"\n        done\n    elif [ -n \"$LTE_LOCK_SUPPORTBAND\" ]; then\n        for band in $(echo \"$LTE_LOCK_SUPPORTBAND\" | tr ',' '\\n' | sort -n | uniq); do\n            add_avalible_band_entry \"$band\" \"LTE_B$band\"\n        done\n    fi\n    json_close_array\n\n    json_add_array \"lock_band\"\n    if [ -n \"$modem_info\" ]; then\n        for band in $(echo \"$modem_info\" | tr ',' '\\n' | sort -n | uniq); do\n            json_add_string \"\" \"$band\"\n        done\n    fi\n    json_close_array\n    json_close_object\n}\n\n#设置锁频\nset_lockband()\n{\n    m_debug \"Gosuncn set lockband info\"\n    local config=\"$1\"\n    local band_class=$(echo \"$config\" | jq -r '.band_class')\n    local lock_band=$(echo \"$config\" | jq -r '.lock_band')\n\n    case \"$platform\" in\n        \"qualcomm\")\n            set_lockband_qualcomm \"$band_class\" \"$lock_band\"\n        ;;\n        \"lte\")\n            set_lockband_lte \"$band_class\" \"$lock_band\"\n        ;;\n        *)\n            set_lockband_lte \"$band_class\" \"$lock_band\"\n        ;;\n    esac\n\n    json_select \"result\"\n    json_add_string \"set_lockband\" \"$res\"\n    json_add_string \"config\" \"$config\"\n    json_add_string \"band_class\" \"$band_class\"\n    json_add_string \"lock_band\" \"$lock_band\"\n    json_close_object\n}\n\nset_lockband_lte()\n{\n    local band_class=\"$1\"\n    local lock_band=\"$2\"\n\n    if [ -z \"$lock_band\" ] || [ \"$lock_band\" = \"null\" ]; then\n        # 解锁所有频段\n        res=$(at $at_port \"AT+ZBAND=all,all,all,all\")\n    else\n        local hex=$(convert2hex \"$lock_band\")\n        m_debug \"Lock LTE band hex: $hex\"\n        res=$(at $at_port \"AT+ZBAND=all,all,all,${hex}\")\n    fi\n}\n\nset_lockband_qualcomm()\n{\n    local band_class=\"$1\"\n    local lock_band=\"$2\"\n\n    if [ -z \"$lock_band\" ] || [ \"$lock_band\" = \"null\" ]; then\n        res=$(at $at_port \"AT+ZBAND=all,all,all,all\")\n    else\n        local hex=$(convert2hex \"$lock_band\")\n        m_debug \"Lock LTE band hex: $hex\"\n        res=$(at $at_port \"AT+ZBAND=all,all,all,${hex}\")\n    fi\n}\n\n#SIM卡信息\nsim_info()\n{\n    m_debug \"Gosuncn sim info\"\n    class=\"SIM Information\"\n\n    #IMEI\n    at_command=\"AT+CGSN\"\n    imei=$(at $at_port $at_command | grep -o \"[0-9]\\{15\\}\")\n\n    #SIM Status\n    at_command=\"AT+CPIN?\"\n    sim_status_flag=$(at $at_port $at_command | sed -n '2p')\n    sim_status=$(get_sim_status \"$sim_status_flag\")\n\n    if [ \"$sim_status\" != \"ready\" ]; then\n        add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\"\n        add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\"\n        return\n    fi\n\n    #ISP\n    at $at_port \"AT+COPS=3,2\" > /dev/null 2>&1\n    at_command=\"AT+COPS?\"\n    isp=$(at $at_port $at_command | sed -n '2p' | awk -F'\"' '{print $2}')\n\n    #SIM Number\n    at_command=\"AT+CNUM\"\n    sim_number=$(at $at_port $at_command | grep \"+CNUM:\" | grep -o \"[0-9]\\{9,\\}\")\n\n    #IMSI\n    at_command=\"AT+CIMI\"\n    imsi=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n\n    #ICCID\n    at_command=\"AT+ICCID\"\n    iccid=$(at $at_port $at_command | grep -o \"+ICCID:[ ]*[-0-9A-Fa-f]\\+\" | awk -F': ' '{print $2}' | tr -d ' ')\n\n    add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\"\n    add_plain_info_entry \"ISP\" \"$isp\" \"Internet Service Provider\"\n    add_plain_info_entry \"SIM Slot\" \"$sim_slot\" \"SIM Slot\"\n    add_plain_info_entry \"SIM Number\" \"$sim_number\" \"SIM Number\"\n    add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\"\n    add_plain_info_entry \"IMSI\" \"$imsi\" \"International Mobile Subscriber Identity\"\n    add_plain_info_entry \"ICCID\" \"$iccid\" \"Integrate Circuit Card Identity\"\n}\n\n#基本信息\nbase_info()\n{\n    m_debug \"Gosuncn base info\"\n    class=\"Base Information\"\n\n    #Name\n    at_command=\"AT+CGMM\"\n    name=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n\n    #Manufacturer\n    at_command=\"AT+CGMI\"\n    manufacturer=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n\n    #Revision\n    at_command=\"AT+CGMR\"\n    revision=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n\n    add_plain_info_entry \"name\" \"$name\" \"Name\"\n    add_plain_info_entry \"manufacturer\" \"$manufacturer\" \"Manufacturer\"\n    add_plain_info_entry \"revision\" \"$revision\" \"Revision\"\n    add_plain_info_entry \"at_port\" \"$at_port\" \"AT Port\"\n    get_temperature\n    get_connect_status\n}\n\n#网络信息\nnetwork_info()\n{\n    m_debug \"Gosuncn network info\"\n\n    #Network Type（网络类型）\n    at_command=\"AT+COPS?\"\n    local cops_response=$(at $at_port $at_command | grep \"+COPS:\")\n    local carrier=$(echo \"$cops_response\" | awk -F'\"' '{print $2}')\n    local rat_num=$(echo \"$cops_response\" | awk -F',' '{print $4}' | sed 's/\\r//g')\n    local network_type=$(get_rat $rat_num)\n\n    #CSQ\n    at_command=\"AT+CSQ\"\n    response=$(at $at_port $at_command | grep \"+CSQ:\" | sed 's/+CSQ: //g' | sed 's/\\r//g')\n\n    class=\"Network Information\"\n    add_plain_info_entry \"Network Type\" \"$network_type\" \"Network Type\"\n    add_plain_info_entry \"Carrier\" \"$carrier\" \"Carrier\"\n}\n\n#小区信息\ncell_info()\n{\n    m_debug \"Gosuncn cell info\"\n\n    case \"$platform\" in\n        \"qualcomm\")\n            cell_info_qualcomm\n        ;;\n        \"lte\")\n            cell_info_lte\n        ;;\n        *)\n            cell_info_lte\n        ;;\n    esac\n}\n\ncell_info_lte()\n{\n    # AT+ZCELLINFO? 返回 +ZCELLINFO: <TAC>,cellid:<CellID>,pci:<PCI>,band:<Band>\n    local zcellinfo=$(at $at_port \"AT+ZCELLINFO?\" | grep '+ZCELLINFO:' | cut -d: -f2-)\n    local cops_response=$(at $at_port \"AT+COPS?\" | grep \"+COPS:\")\n    local rat_num=$(echo \"$cops_response\" | awk -F',' '{print $4}' | sed 's/\\r//g')\n    local network_type=$(get_rat $rat_num)\n\n    if [ -z \"$zcellinfo\" ]; then\n        return\n    fi\n\n    # 解析 ZCELLINFO 字段\n    local tac=$(echo \"$zcellinfo\" | cut -d',' -f1 | tr -d ' ')\n    local cell_id=$(echo \"$zcellinfo\" | cut -d',' -f2 | tr -d ' ')\n    local pci=$(echo \"$zcellinfo\" | cut -d',' -f3 | tr -d ' ')\n    local lband=$(echo \"$zcellinfo\" | cut -d',' -f4 | tr -d '\\r' | tr -d '\\n')\n\n    # 获取信号质量\n    local cesq_response=$(at $at_port \"AT+CESQ\" | grep \"+CESQ:\")\n    local rsrp=\"\" rsrq=\"\" sinr=\"\"\n    if [ -n \"$cesq_response\" ]; then\n        # +CESQ: rxlev,ber,rscp,ecno,rsrq,rsrp\n        rsrq=$(echo \"$cesq_response\" | awk -F',' '{print $5}' | tr -d ' ')\n        rsrp=$(echo \"$cesq_response\" | awk -F',' '{print $6}' | tr -d ' \\r')\n        # 转换 RSRP: 实际值 = 报告值 - 141\n        if [ -n \"$rsrp\" ] && [ \"$rsrp\" != \"255\" ]; then\n            rsrp=$(($rsrp - 141))\n        else\n            rsrp=\"\"\n        fi\n        # 转换 RSRQ: 实际值 = (报告值 / 2) - 19.5\n        if [ -n \"$rsrq\" ] && [ \"$rsrq\" != \"255\" ]; then\n            rsrq=$(echo \"$rsrq\" | awk '{printf \"%.1f\", ($1 / 2) - 19.5}')\n        else\n            rsrq=\"\"\n        fi\n    fi\n\n    # 获取 RSSI/SINR（通过CSQ）\n    local csq_response=$(at $at_port \"AT+CSQ\" | grep \"+CSQ:\")\n    local rssi=\"\"\n    if [ -n \"$csq_response\" ]; then\n        local csq_num=$(echo \"$csq_response\" | awk -F'[:,]' '{print $2}' | tr -d ' ')\n        if [ \"$csq_num\" != \"99\" ] && [ -n \"$csq_num\" ]; then\n            rssi=\"$((2 * csq_num - 113))\"\n        fi\n    fi\n\n    # 获取MCC/MNC\n    at $at_port \"AT+COPS=3,2\" > /dev/null 2>&1\n    local cops_num=$(at $at_port \"AT+COPS?\" | grep \"+COPS:\" | awk -F'\"' '{print $2}')\n    local mcc=\"\" mnc=\"\"\n    if [ -n \"$cops_num\" ] && [ ${#cops_num} -ge 5 ]; then\n        mcc=${cops_num:0:3}\n        mnc=${cops_num:3}\n    fi\n\n    class=\"Cell Information\"\n    case \"$network_type\" in\n        \"LTE\")\n            network_mode=\"LTE Mode\"\n            add_plain_info_entry \"network_mode\" \"$network_mode\" \"Network Mode\"\n            set_4g_cell_info \"$mcc\" \"$mnc\" \"$tac\" \"$cell_id\" \"\" \"$pci\" \"$lband\" \"\" \"\" \"$rsrp\" \"$rsrq\" \"\" \"\" \"\"\n            add_bar_info_entry \"RSSI\" \"$rssi\" \"Received Signal Strength Indicator\" -120 -20 dBm\n            ;;\n        \"WCDMA\")\n            network_mode=\"WCDMA Mode\"\n            add_plain_info_entry \"network_mode\" \"$network_mode\" \"Network Mode\"\n            add_plain_info_entry \"LAC\" \"$tac\" \"Location Area Code\"\n            add_plain_info_entry \"Cell ID\" \"$cell_id\" \"Cell ID\"\n            add_plain_info_entry \"PSC\" \"$pci\" \"Primary Scrambling Code\"\n            add_plain_info_entry \"Band\" \"$lband\" \"Band\"\n            add_bar_info_entry \"RSSI\" \"$rssi\" \"Received Signal Strength Indicator\" -120 -20 dBm\n            ;;\n        *)\n            network_mode=\"${network_type} Mode\"\n            add_plain_info_entry \"network_mode\" \"$network_mode\" \"Network Mode\"\n            add_plain_info_entry \"TAC\" \"$tac\" \"Tracking Area Code\"\n            add_plain_info_entry \"Cell ID\" \"$cell_id\" \"Cell ID\"\n            add_plain_info_entry \"PCI\" \"$pci\" \"Physical Cell ID\"\n            add_plain_info_entry \"Band\" \"$lband\" \"Band\"\n            add_bar_info_entry \"RSSI\" \"$rssi\" \"Received Signal Strength Indicator\" -120 -20 dBm\n            ;;\n    esac\n}\n\ncell_info_qualcomm()\n{\n    local zcellinfo=$(at $at_port \"AT+ZCELLINFO?\" | grep '+ZCELLINFO:' | cut -d: -f2-)\n    local cops_response=$(at $at_port \"AT+COPS?\" | grep \"+COPS:\")\n    local rat_num=$(echo \"$cops_response\" | awk -F',' '{print $4}' | sed 's/\\r//g')\n    local network_type=$(get_rat $rat_num)\n\n    if [ -z \"$zcellinfo\" ]; then\n        return\n    fi\n\n    local tac=$(echo \"$zcellinfo\" | cut -d',' -f1 | tr -d ' ')\n    local cell_id=$(echo \"$zcellinfo\" | grep -o 'cellid:[^,]*' | cut -d: -f2)\n    local pci=$(echo \"$zcellinfo\" | grep -o 'pci:[^,]*' | cut -d: -f2)\n    local lband=$(echo \"$zcellinfo\" | grep -o 'band:[^,]*' | cut -d: -f2 | tr -d '\\r ')\n\n    local cesq_response=$(at $at_port \"AT+CESQ\" | grep \"+CESQ:\")\n    local rsrp=\"\" rsrq=\"\"\n    if [ -n \"$cesq_response\" ]; then\n        rsrq=$(echo \"$cesq_response\" | awk -F',' '{print $5}' | tr -d ' ')\n        rsrp=$(echo \"$cesq_response\" | awk -F',' '{print $6}' | tr -d ' \\r')\n        if [ -n \"$rsrp\" ] && [ \"$rsrp\" != \"255\" ]; then\n            rsrp=$(($rsrp - 141))\n        else\n            rsrp=\"\"\n        fi\n        if [ -n \"$rsrq\" ] && [ \"$rsrq\" != \"255\" ]; then\n            rsrq=$(echo \"$rsrq\" | awk '{printf \"%.1f\", ($1 / 2) - 19.5}')\n        else\n            rsrq=\"\"\n        fi\n    fi\n\n    local csq_response=$(at $at_port \"AT+CSQ\" | grep \"+CSQ:\")\n    local rssi=\"\"\n    if [ -n \"$csq_response\" ]; then\n        local csq_num=$(echo \"$csq_response\" | awk -F'[:,]' '{print $2}' | tr -d ' ')\n        if [ \"$csq_num\" != \"99\" ] && [ -n \"$csq_num\" ]; then\n            rssi=\"$((2 * csq_num - 113))\"\n        fi\n    fi\n\n    at $at_port \"AT+COPS=3,2\" > /dev/null 2>&1\n    local cops_num=$(at $at_port \"AT+COPS?\" | grep \"+COPS:\" | awk -F'\"' '{print $2}')\n    local mcc=\"\" mnc=\"\"\n    if [ -n \"$cops_num\" ] && [ ${#cops_num} -ge 5 ]; then\n        mcc=${cops_num:0:3}\n        mnc=${cops_num:3}\n    fi\n\n    class=\"Cell Information\"\n    case \"$network_type\" in\n        \"LTE\")\n            network_mode=\"LTE Mode\"\n            add_plain_info_entry \"network_mode\" \"$network_mode\" \"Network Mode\"\n            set_4g_cell_info \"$mcc\" \"$mnc\" \"$tac\" \"$cell_id\" \"\" \"$pci\" \"$lband\" \"\" \"\" \"$rsrp\" \"$rsrq\" \"\" \"\" \"\"\n            add_bar_info_entry \"RSSI\" \"$rssi\" \"Received Signal Strength Indicator\" -120 -20 dBm\n            ;;\n        \"WCDMA\")\n            network_mode=\"WCDMA Mode\"\n            add_plain_info_entry \"network_mode\" \"$network_mode\" \"Network Mode\"\n            add_plain_info_entry \"LAC\" \"$tac\" \"Location Area Code\"\n            add_plain_info_entry \"Cell ID\" \"$cell_id\" \"Cell ID\"\n            add_plain_info_entry \"PSC\" \"$pci\" \"Primary Scrambling Code\"\n            add_plain_info_entry \"Band\" \"$lband\" \"Band\"\n            add_bar_info_entry \"RSSI\" \"$rssi\" \"Received Signal Strength Indicator\" -120 -20 dBm\n            ;;\n        *)\n            network_mode=\"${network_type} Mode\"\n            add_plain_info_entry \"network_mode\" \"$network_mode\" \"Network Mode\"\n            add_plain_info_entry \"TAC\" \"$tac\" \"Tracking Area Code\"\n            add_plain_info_entry \"Cell ID\" \"$cell_id\" \"Cell ID\"\n            add_plain_info_entry \"PCI\" \"$pci\" \"Physical Cell ID\"\n            add_plain_info_entry \"Band\" \"$lband\" \"Band\"\n            add_bar_info_entry \"RSSI\" \"$rssi\" \"Received Signal Strength Indicator\" -120 -20 dBm\n            ;;\n    esac\n}\n\n#邻区信息（Gosuncn LTE平台暂不支持）\nget_neighborcell()\n{\n    json_add_object \"neighborcell\"\n    json_add_array \"LTE\"\n    json_close_array\n    json_add_object \"lockcell_status\"\n    json_add_string \"LTE\" \"unlock\"\n    json_close_object\n    json_close_object\n}\n\nset_neighborcell()\n{\n    json_select \"result\"\n    json_add_string \"setlockcell\" \"not supported\"\n    json_close_object\n}\n\nvendor_get_disabled_features()\n{\n    json_add_string \"\" \"NeighborCell\"\n}\n\n#重启模组\nsoft_reboot()\n{\n    at $at_port \"AT+CFUN=1,1\"\n}\n\n#重置模组\nreset_module()\n{\n    at $at_port \"AT+ZSNT=0,0,0\" 2>&1 > /dev/null\n    at $at_port \"AT+ZBAND=all,all,all,all\" 2>&1 > /dev/null\n    at $at_port \"AT&F\" 2>&1 > /dev/null\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/vendor/huawei.sh",
    "content": "#!/bin/sh\n# Copyright (C) 2025 coolsnowwolf <coolsnowwolf@gmail.com>\n_Vendor=\"huawei\"\n_Author=\"Lean\"\n_Maintainer=\"Lean <coolsnowwolf@gmail.com>\"\n. /usr/share/qmodem/generic.sh\ndebug_subject=\"huawei_ctrl\"\n\nvendor_get_disabled_features(){\n    case \"$platform\" in\n        *)\n            json_add_string \"\" \"LockBand\"\n            json_add_string \"\" \"NeighborCell\"\n            ;;\n    esac\n}\n\nfunction get_imei(){\n    imei=$(at $at_port \"AT+CGSN\" | grep -o '[0-9]\\{15\\}')\n    json_add_string imei $imei\n}\n\nfunction set_imei(){\n    imei=$1\n    res=$(at $at_port \"at^phynum=IMEI,$imei\")\n    json_add_string \"result\" \"$res\"\n}\n\nfunction get_mode(){\n    cfg=$(at $at_port \"AT^SETMODE?\")\n    \n    case $platform in\n        \"unisoc\")\n            local mode_num=$(echo -e \"$cfg\" | grep \"SETMODE\"|grep -o '\\d')\n            case $mode_num in\n                \"0\") mode=\"rndis\" ;;\n                \"1\") mode=\"ecm\" ;;\n                \"2\") mode=\"ncm\" ;;\n                *) mode=\"rndis\" ;;\n            esac\n            ;;\n        *)\n            local mode_num=$(echo -e \"$cfg\" | sed -n '2p' | sed 's/\\r//g')\n            case \"$mode_num\" in\n            \"0\"|\"2\") mode=\"ecm\" ;;\n            \"1\"|\"3\"|\"4\"|\"5\") mode=\"ncm\" ;;\n            \"6\") mode=\"rndis\" ;;\n            \"7\") mode=\"mbim\" ;;\n            \"8\") mode=\"ppp\" ;;\n            *) mode=\"rndis\" ;;\n    esac\n            ;;\n    esac\n\n    \n    available_modes=$(uci -q get qmodem.$config_section.modes)\n    json_add_object \"mode\"\n    for available_mode in $available_modes; do\n        if [ \"$mode\" = \"$available_mode\" ]; then\n            json_add_string \"$available_mode\" \"1\"\n        else\n            json_add_string \"$available_mode\" \"0\"\n        fi\n    done\n    json_close_object\n}\n\nfunction set_mode(){\n    local mode=$1\n    local mode_num\n    case \"$platform\" in\n        \"unisoc\")\n            case $mode in\n                \"rndis\")\n                    mode_num=\"0\"\n                    ;;\n                \"ecm\")\n                    mode_num=\"1\"\n                    ;;\n                \"ncm\")\n                    mode_num=\"2\"\n                    ;;\n            esac\n            ;;\n        *)\n            case $mode in\n                \"ecm\")\n                    mode_num=\"0\"\n                    ;;\n                \"ncm\")\n                    mode_num=\"4\"\n                    ;;\n                *)\n                    mode_num=\"0\"\n                    ;;\n            esac\n        ;;\n    esac\n\n    res=$(at $at_port \"AT^SETMODE=${mode_num}\")\n    json_add_string \"cmd_result\" \"$res at $at_port \"AT^SETMODE=${mode_num}\"\"\n}\n\nfunction get_scs()\n{\n    local scs\n    case $1 in\n\t\t\"0\") scs=\"15\" ;;\n\t\t\"1\") scs=\"30\" ;;\n    \"2\") scs=\"60\" ;;\n    \"3\") scs=\"120\" ;;\n    \"4\") scs=\"240\" ;;\n    *) scs=$(awk \"BEGIN{ print 2^$1 * 15 }\") ;;\n\tesac\n    echo \"$scs\"\n}\n\nfunction get_network_prefer(){\n    res=$(at $at_port \"AT^SYSCFGEX?\"| grep \"\\^SYSCFGEX:\" | sed 's/\\^SYSCFGEX://g')\n    # (RAT index): \n    # • 00 – Automatic \n    # • 01 – UMTS 3G only \n    # • 04 – LTE only \n    # • 05 – 5G only \n    # • 0E – UMTS and LTE only \n    # • 0F – LTE and NR5G only \n    # • 10 – WCDMA and NR5G only \n   local network_type_num=$(echo \"$res\" | awk -F'\"' '{print $2}')\n   \n   #获取网络类型\n   local network_prefer_3g=\"0\"\n   local network_prefer_4g=\"0\"\n   local network_prefer_5g=\"0\"\n   \n   #匹配不同的网络类型\n   local auto=$(echo \"${network_type_num}\" | grep \"00\")\n   \n   if [ -n \"$auto\" ]; then\n      network_prefer_2g=\"1\"\n      network_prefer_3g=\"1\"\n      network_prefer_4g=\"1\"\n      network_prefer_5g=\"1\"\n   else\n        local wcdma=$(echo \"${network_type_num}\" | grep \"02\")\n        local lte=$(echo \"${network_type_num}\" | grep \"03\")\n        local nr=$(echo \"${network_type_num}\" | grep \"08\")\n\n        if [ -n \"$wcdma\" ]; then\n            network_prefer_3g=\"1\"\n        fi\n        if [ -n \"$lte\" ]; then\n            network_prefer_4g=\"1\"\n        fi\n        if [ -n \"$nr\" ]; then\n            network_prefer_5g=\"1\"\n        fi\n    fi\n    json_add_object network_prefer\n    json_add_string 3G $network_prefer_3g\n    json_add_string 4G $network_prefer_4g\n    json_add_string 5G $network_prefer_5g\n    json_close_array\n}\n\nfunction set_network_prefer(){\n    local network_prefer_3g=$(echo $1 |jq -r 'contains([\"3G\"])')\n    local network_prefer_4g=$(echo $1 |jq -r 'contains([\"4G\"])')\n    local network_prefer_5g=$(echo $1 |jq -r 'contains([\"5G\"])')\n    count=$(echo $1 | jq -r 'length')\n    case \"$count\" in\n        \"1\")\n            if [ \"$network_prefer_3g\" = \"true\" ]; then\n                code=\"02\"\n            elif [ \"$network_prefer_4g\" = \"true\" ]; then\n                code=\"03\"\n            elif [ \"$network_prefer_5g\" = \"true\" ]; then\n                code=\"08\"\n            fi\n            ;;\n        \"2\")\n            if [ \"$network_prefer_3g\" = \"true\" ] && [ \"$network_prefer_4g\" = \"true\" ]; then\n                code=\"02\"\n            elif [ \"$network_prefer_4g\" = \"true\" ] && [ \"$network_prefer_5g\" = \"true\" ]; then\n                code=\"03\"\n            elif [ \"$network_prefer_3g\" = \"true\" ] && [ \"$network_prefer_5g\" = \"true\" ]; then\n                code=\"08\"\n            fi\n            ;;\n        \"3\")\n            code=\"080302\"\n            ;;\n        *)\n            code=\"00\"\n            ;;\n    esac\n    \n    at_command='AT^SYSCFGEX=\"'${code}'\",40000000,1,2,40000000,,'\n    res=$(at $at_port \"${at_command}\")\n    json_add_string \"code\" \"$code\"\n    json_add_string \"result\" \"$res\"\n}\n\nfunction get_lockband(){\n    json_add_object \"lockband\"\n    case $platform in\n        *)\n            _get_lockband_nr\n            ;;\n    esac\n    json_close_object\n}\n\nfunction set_lockband(){\n    config=$1\n    band_class=$(echo $config | jq -r '.band_class')\n    lock_band=$(echo $config | jq -r '.lock_band')\n    case $platform in\n        *)\n            _set_lockband_nr\n            ;;\n    esac\n}\n\nfunction sim_info()\n{\n    class=\"SIM Information\"\n    \n    sim_slot=$(cat /tmp/huawei_sim_slot_$config_section)||sim_slot=\"0\"\n\n    #SIM Status（SIM状态）\n    at_command=\"AT+CPIN?\"\n    sim_status=$(at $at_port $at_command | grep -E \"\\+CPIN:|\\+CME ERROR: 10\")\n    if [[ \"$sim_status\" == \"+CME ERROR:\"* ]]; then\n        sim_status=\"not inserted\"\n    else\n        sim_status=${sim_status:7:-1}\n        #lowercase\n        sim_status=$(echo $sim_status | tr  A-Z a-z)\n    fi\n\n    #SIM Number（SIM卡号码，手机号）\n    at_command=\"AT+CNUM\"\n    sim_number=$(at $at_port $at_command | grep \"+CNUM: \" | awk -F'\"' '{print $2}')\n    [ -z \"$sim_number\" ] && {\n      sim_number=$(at $at_port $at_command | grep \"+CNUM: \" | awk -F'\"' '{print $4}')\n    }\n    \n    #IMSI（国际移动用户识别码）\n    at_command=\"AT+CIMI\"\n    imsi=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n    \n    #IMEI（国际移动设备识别码）\n    at_command=\"AT+CGSN\"\n    imei=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n    \n    add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n    add_plain_info_entry \"SIM Slot\" \"$sim_slot\" \"SIM Slot\"\n    add_plain_info_entry \"SIM Number\" \"$sim_number\" \"SIM Number\"\n    add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\"\n    add_plain_info_entry \"IMSI\" \"$imsi\" \"International Mobile Subscriber Identity\"\n}\n\nfunction base_info(){\n     #Name（名称）\n    at_command=\"AT+CGMM\"\n    name=$(at $at_port $at_command | grep -v \"OK\" | sed -n '2p' | sed 's/\\r//g')\n    #Manufacturer（制造商）\n    at_command=\"AT+CGMI\"\n    manufacturer=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n    #Revision（固件版本）\n    at_command=\"ATI\"\n    revision=$(at $at_port $at_command | grep \"Revision:\" | sed 's/Revision: //g' | sed 's/\\r//g')\n    # at_command=\"AT+CGMR\"\n    # revision=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n    class=\"Base Information\"\n    add_plain_info_entry \"name\" \"$name\" \"Name\"\n    add_plain_info_entry \"manufacturer\" \"$manufacturer\" \"Manufacturer\"\n    add_plain_info_entry \"revision\" \"$revision\" \"Revision\"\n    add_plain_info_entry \"at_port\" \"$at_port\" \"AT Port\"\n    get_connect_status\n    _get_temperature\n}\n\ncell_info()\n{\n    case \"$platform\" in\n        \"unisoc\")\n            at_command=\"AT^MONSC\"\n            monsc_response=$(at $at_port $at_command | grep \"\\^MONSC:\" | sed 's/\\^MONSC: //')\n            second_cell_response=$(at $at_port \"AT^CSERSSI?\"| grep \"CSERSSI\")\n            hfreqinfo_response=$(at $at_port \"AT^HFREQINFO?\" | grep \"HFREQINFO:\")\n            _parse_hfreqinfo \"$hfreqinfo_response\"\n            cell_rat=$(echo \"$monsc_response\" | awk -F',' '{print $1}')\n            [ -n \"$second_cell_response\" ] && cell_rat=\"LTE-NR\"\n            case \"$cell_rat\" in\n                \"NR\"|\"NR-5GC\")\n                    # MCC/MNC.ARFCN/SCS/CellID/PhysicalCellID/TAC/RSRP/RSRQ/SINR\n                    network_mode=\"NR5G-SA Mode\"\n                    nr_mode=\"NR-SA\"\n                    mcc=$(echo \"$monsc_response\" | awk -F',' '{print $2}')\n                    mnc=$(echo \"$monsc_response\" | awk -F',' '{print $3}')\n                    arfcn=$(echo \"$monsc_response\" | awk -F',' '{print $4}')\n                    scs_num=$(echo \"$monsc_response\" | awk -F',' '{print $5}')\n                    scs=$(get_scs ${scs_num})\n                    cid_hex=$(echo \"$monsc_response\" | awk -F',' '{print $6}')\n                    cid=$(echo \"ibase=16; $cid_hex\" | bc)\n                    physical_cell_id_hex=$(echo \"$monsc_response\" | awk -F',' '{print $7}')\n                    physical_cell_id=$(echo \"ibase=16; $physical_cell_id_hex\" | bc)\n                    tac=$(echo \"$monsc_response\" | awk -F',' '{print $8}')\n                    nr_rsrp=$(echo \"$monsc_response\" | awk -F',' '{print $9}')\n                    nr_rsrq=$(echo \"$monsc_response\" | awk -F',' '{print $10}')\n                    nr_sinr=$(echo \"$monsc_response\" | awk -F',' '{print $11}' | sed 's/\\r//g')\n                ;;\n                \"LTE-NR\")\n                    network_mode=\"EN-DC Mode\"\n                    nr_mode=\"NR-NSA\"\n                    lte_mode=\"LTE\"\n                    #LTE monsc_response MCC/MNC/EARFCN/CellID/PhysicalCellID/TAC/RSRP/RSRQ/RxLev\n                    mcc=$(echo \"$monsc_response\" | awk -F',' '{print $2}')\n                    mnc=$(echo \"$monsc_response\" | awk -F',' '{print $3}')\n                    earfcn=$(echo \"$monsc_response\" | awk -F',' '{print $4}')\n                    cell_id_hex=$(echo \"$monsc_response\" | awk -F',' '{print $5}')\n                    cell_id=$(echo \"ibase=16; $cell_id_hex\" | bc)\n                    physical_cell_id_hex=$(echo \"$monsc_response\" | awk -F',' '{print $6}')\n                    physical_cell_id=$(echo \"ibase=16; $physical_cell_id_hex\" | bc)\n                    tac=$(echo \"$monsc_response\" | awk -F',' '{print $7}')\n                    lte_rsrp=$(echo \"$monsc_response\" | awk -F',' '{print $8}')\n                    lte_rsrq=$(echo \"$monsc_response\" | awk -F',' '{print $9}')\n                    lte_rxlev=$(echo \"$monsc_response\" | awk -F',' '{print $10}' | sed 's/\\r//g')\n                    #NR second_cell_response RSRP(12)/RSRQ(13)/SINR(14)\n                    second_nr_rsrp=$(echo \"$second_cell_response\" | awk -F',' '{print $12}')\n                    second_nr_rsrq=$(echo \"$second_cell_response\" | awk -F',' '{print $13}')\n                    second_nr_sinr=$(echo \"$second_cell_response\" | awk -F',' '{print $14}' | sed 's/\\r//g')\n                ;;\n                \"LTE\"|\"eMTC\"|\"NB-IoT\")\n                    network_mode=\"LTE Mode\"\n                    lte_mode=\"LTE\"\n                    #LTE monsc_response MCC/MNC/EARFCN/CellID/PhysicalCellID/TAC/RSRP/RSRQ/RxLev\n                    mcc=$(echo \"$monsc_response\" | awk -F',' '{print $2}')\n                    mnc=$(echo \"$monsc_response\" | awk -F',' '{print $3}')\n                    earfcn=$(echo \"$monsc_response\" | awk -F',' '{print $4}')\n                    cell_id_hex=$(echo \"$monsc_response\" | awk -F',' '{print $5}')\n                    cell_id=$(echo \"ibase=16; $cell_id_hex\" | bc)\n                    physical_cell_id_hex=$(echo \"$monsc_response\" | awk -F',' '{print $6}')\n                    physical_cell_id=$(echo \"ibase=16; $physical_cell_id_hex\" | bc)\n                    tac=$(echo \"$monsc_response\" | awk -F',' '{print $7}')\n                    lte_rsrp=$(echo \"$monsc_response\" | awk -F',' '{print $8}')\n                    lte_rsrq=$(echo \"$monsc_response\" | awk -F',' '{print $9}')\n                    lte_rxlev=$(echo \"$monsc_response\" | awk -F',' '{print $10}' | sed 's/\\r//g')\n                ;;\n                \"WCDMA\"|\"TD-SCDMA\"|\"UMTS\")\n                    network_mode=\"WCDMA Mode\"\n                    wcdma_mode=\"WCDMA\"\n                    # MCC/MNC/ARFCN/PSC/CellID/LAC/RSCP/RxLev/ECN0/DRX/URA\n                    mcc=$(echo \"$monsc_response\" | awk -F',' '{print $2}')\n                    mnc=$(echo \"$monsc_response\" | awk -F',' '{print $3}')\n                    arfcn=$(echo \"$monsc_response\" | awk -F',' '{print $4}')\n                    psc=$(echo \"$monsc_response\" | awk -F',' '{print $5}')\n                    cell_id_hex=$(echo \"$monsc_response\" | awk -F',' '{print $6}')\n                    cell_id=$(echo \"ibase=16; $cell_id_hex\" | bc)\n                    lac=$(echo \"$monsc_response\" | awk -F',' '{print $7}')\n                    rscp=$(echo \"$monsc_response\" | awk -F',' '{print $8}')\n                    wcdma_rxlev=$(echo \"$monsc_response\" | awk -F',' '{print $9}')\n                    ecn0=$(echo \"$monsc_response\" | awk -F',' '{print $10}')\n                    drx=$(echo \"$monsc_response\" | awk -F',' '{print $11}')\n                    ura=$(echo \"$monsc_response\" | awk -F',' '{print $12}' | sed 's/\\r//g')\n                ;;\n                \"GSM\")\n                    network_mode=\"GSM Mode\"\n                    #Unsupported   \n                    ;;\n            esac\n            class=\"Cell Information\"\n            add_plain_info_entry \"network_mode\" \"$network_mode\" \"Network Mode\"\n            # add primary serving cell info\n            add_plain_info_entry \"MCC\" \"$mcc\" \"Mobile Country Code\"\n            add_plain_info_entry \"MNC\" \"$mnc\" \"Mobile Network Code\"\n            add_plain_info_entry \"Duplex Mode\" \"$duplex_mode\" \"Duplex Mode\"\n            add_plain_info_entry \"Cell ID\" \"$cell_id\" \"Cell ID\"\n            add_plain_info_entry \"Physical Cell ID\" \"$physical_cell_id\" \"Physical Cell ID\"\n            add_plain_info_entry \"TAC\" \"$tac\" \"Tracking area code of cell served by neighbor Enb\"\n            add_plain_info_entry \"ARFCN/EARFCN\" \"$arfcn\" \"Absolute Radio-Frequency Channel Number\"\n            add_plain_info_entry \"Band\" \"$band\" \"Band\"\n            add_plain_info_entry \"DL Bandwidth\" \"$dl_bandwidth\" \"DL Bandwidth\"\n            #WCDMA\n            add_plain_info_entry \"WCDMA_INFO\" \"$wcdma_mode\" \"WCDMA Information\"\n            add_bar_info_entry \"RSCP\" \"$rscp\" \"Received Signal Code Power\" -120 -25 dBm\n            add_bar_info_entry \"ECN0\" \"$ecn0\" \"Energy per Chip over Noise\" -24 0 dBm\n            add_bar_info_entry \"DRX\" \"$drx\" \"Discontinuous Reception\" 0 7 dBm\n            add_bar_info_entry \"RxLev\" \"$wcdma_rxlev\" \"Received Signal Level\" -120 -25 dBm\n            #LTE\n            add_plain_info_entry \"LTE_INFO\" \"$lte_mode\" \"LTE Information\"\n            add_plain_info_entry \"LTE_BAND\" \"$LTE_INFO_BAND\" \"LTE Band\"\n            add_plain_info_entry \"LTE_DL\" \"$LTE_INFO_DL\" \"LTE DL\"\n            add_plain_info_entry \"LTE_UL\" \"$LTE_INFO_UL\" \"LTE UL\"\n            extra_info=\"LTE\"\n            add_bar_info_entry \"RSRP\" \"$lte_rsrp\" \"Reference Signal Received Power\" -140 -44 dBm\n            add_bar_info_entry \"RSRQ\" \"$lte_rsrq\" \"Reference Signal Received Quality\" -44 3 dBm\n            add_bar_info_entry \"SINR\" \"$nr_sinr\" \"Signal to Interference plus Noise Ratio Bandwidth\" -120 25 dBm\n            add_bar_info_entry \"RxLev\" \"$lte_rxlev\" \"Received Signal Level\" -120 -25 dBm\n            unset extra_info\n            #NR\n            extra_info=\"$nr_mode\"\n            add_plain_info_entry \"${nr_mode}_INFO\" \"$nr_mode\" \"Information\"\n            add_plain_info_entry \"${nr_mode}_BAND\" \"$NR_INFO_BAND\" \"NR Band\"\n            add_plain_info_entry \"${nr_mode}_DL\" \"$NR_INFO_DL\" \"DL\"\n            add_plain_info_entry \"${nr_mode}_UL\" \"$NR_INFO_UL\" \"UL\"\n            add_bar_info_entry \"RSRP\" \"$nr_rsrp\" \"Reference Signal Received Power\" -156 -31 dBm\n            add_bar_info_entry \"RSRQ\" \"$nr_rsrq\" \"Reference Signal Received Quality\" -43 20 dBm\n            add_bar_info_entry \"SINR\" \"$nr_sinr\" \"Signal to Interference plus Noise Ratio Bandwidth\" -23 40 dBm\n            #NR-NSA\n            add_bar_info_entry \"RSRP\" \"$second_nr_rsrp\" \"Reference Signal Received Power\" -156 -31 dBm\n            add_bar_info_entry \"RSRQ\" \"$second_nr_rsrq\" \"Reference Signal Received Quality\" -43 20 dBm\n            add_bar_info_entry \"SINR\" \"$second_nr_sinr\" \"Signal to Interference plus Noise Ratio Bandwidth\" -23 40 dBm\n            unset extra_info\n            ;;\n        *)\n            at_command=\"AT^MONSC\"\n            response=$(at $at_port $at_command | grep \"\\^MONSC:\" | sed 's/\\^MONSC: //')\n            cell_rat=$(echo \"$response\" | awk -F',' '{print $1}')\n            case $cell_rat in\n                \"NR\"|\"NR-5GC\")\n                    network_mode=\"NR5G-SA Mode\"\n                    nr_mcc=$(echo \"$response\" | awk -F',' '{print $2}')\n                    nr_mnc=$(echo \"$response\" | awk -F',' '{print $3}')\n                    nr_arfcn=$(echo \"$response\" | awk -F',' '{print $4}')\n                    nr_scs_num=$(echo \"$response\" | awk -F',' '{print $5}')\n                    nr_scs=$(get_scs ${nr_scs_num})\n                    nr_cell_id_hex=$(echo \"$response\" | awk -F',' '{print $6}')\n                    nr_cell_id=$(echo \"ibase=16; $nr_cell_id_hex\" | bc)\n                    nr_physical_cell_id_hex=$(echo \"$response\" | awk -F',' '{print $7}')\n                    nr_physical_cell_id=$(echo \"ibase=16; $nr_physical_cell_id_hex\" | bc)\n                    nr_tac=$(echo \"$response\" | awk -F',' '{print $8}')\n                    nr_rsrp=$(echo \"$response\" | awk -F',' '{print $9}')\n                    nr_rsrq=$(echo \"$response\" | awk -F',' '{print $10}')\n                    nr_sinr=$(echo \"$response\" | awk -F',' '{print $11}' | sed 's/\\r//g')\n                ;;\n                \"LTE-NR\")\n                    nr_response=$(at $at_port \"AT^CSERSSI?\")\n                    network_mode=\"EN-DC Mode\"\n                    #LTE\n                    endc_lte_mcc=$(echo \"$response\" | awk -F',' '{print $2}')\n                    endc_lte_mnc=$(echo \"$response\" | awk -F',' '{print $3}')\n                    endc_lte_earfcn=$(echo \"$response\" | awk -F',' '{print $4}')\n                    endc_lte_cell_id_hex=$(echo \"$response\" | awk -F',' '{print $5}')\n                    endc_lte_cell_id=$(echo \"ibase=16; $endc_lte_cell_id_hex\" | bc)\n                    endc_lte_physical_cell_id_hex=$(echo \"$response\" | awk -F',' '{print $6}')\n                    endc_lte_physical_cell_id=$(echo \"ibase=16; $endc_lte_physical_cell_id_hex\" | bc)\n                    endc_lte_tac=$(echo \"$response\" | awk -F',' '{print $7}')\n                    endc_lte_rsrp=$(echo \"$response\" | awk -F',' '{print $8}')\n                    endc_lte_rsrq=$(echo \"$response\" | awk -F',' '{print $9}')\n                    endc_lte_rxlev=$(echo \"$response\" | awk -F',' '{print $10}' | sed 's/\\r//g')\n                    #NR5G-NSA\n                    endc_nr_rsrp=$(echo \"$nr_response\" | awk -F',' '{print $12}')\n                    endc_nr_rsrq=$(echo \"$nr_response\" | awk -F',' '{print $13}')\n                    endc_nr_sinr=$(echo \"$nr_response\" | awk -F',' '{print $14}' | sed 's/\\r//g')\n                ;;\n                \"LTE\"|\"eMTC\"|\"NB-IoT\")\n                    network_mode=\"LTE Mode\"\n                    lte_mcc=$(echo \"$response\" | awk -F',' '{print $2}')\n                    lte_mnc=$(echo \"$response\" | awk -F',' '{print $3}')\n                    lte_earfcn=$(echo \"$response\" | awk -F',' '{print $4}')\n                    lte_cell_id_hex=$(echo \"$response\" | awk -F',' '{print $5}')\n                    lte_cell_id=$(echo \"ibase=16; $lte_cell_id_hex\" | bc)\n                    lte_physical_cell_id_hex=$(echo \"$response\" | awk -F',' '{print $6}')\n                    lte_physical_cell_id=$(echo \"ibase=16; $lte_physical_cell_id_hex\" | bc)\n                    lte_tac=$(echo \"$response\" | awk -F',' '{print $7}')\n                    lte_rsrp=$(echo \"$response\" | awk -F',' '{print $8}')\n                    lte_rsrq=$(echo \"$response\" | awk -F',' '{print $9}')\n                    lte_rxlev=$(echo \"$response\" | awk -F',' '{print $10}' | sed 's/\\r//g')\n                ;;\n                \"WCDMA\"|\"TD-SCDMA\"|\"UMTS\")\n                    network_mode=\"WCDMA Mode\"\n                    wcdma_mcc=$(echo \"$response\" | awk -F',' '{print $2}')\n                    wcdma_mnc=$(echo \"$response\" | awk -F',' '{print $3}')\n                    wcdma_arfcn=$(echo \"$response\" | awk -F',' '{print $4}')\n                    wcdma_psc=$(echo \"$response\" | awk -F',' '{print $5}')\n                    wcdma_cell_id_hex=$(echo \"$response\" | awk -F',' '{print $6}')\n                    wcdma_cell_id=$(echo \"ibase=16; $wcdma_cell_id_hex\" | bc)\n                    wcdma_lac=$(echo \"$response\" | awk -F',' '{print $7}')\n                    wcdma_rscp=$(echo \"$response\" | awk -F',' '{print $8}')\n                    wcdma_rxlev=$(echo \"$response\" | awk -F',' '{print $9}')\n                    wcdma_ecn0=$(echo \"$response\" | awk -F',' '{print $10}')\n                    wcdma_drx=$(echo \"$response\" | awk -F',' '{print $11}')\n                    wcdma_ura=$(echo \"$response\" | awk -F',' '{print $12}' | sed 's/\\r//g')\n                ;;\n                \"GSM\")\n                    network_mode=\"GSM Mode\"\n                    gsm_mcc=$(echo \"$response\" | awk -F',' '{print $2}')\n                    gsm_mnc=$(echo \"$response\" | awk -F',' '{print $3}')\n                    gsm_band_num=$(echo \"$response\" | awk -F',' '{print $4}')\n                    gsm_band=$(tdtech_get_band \"GSM\" ${gsm_band_num})\n                    gsm_arfcn=$(echo \"$response\" | awk -F',' '{print $5}')\n                    gsm_bsic=$(echo \"$response\" | awk -F',' '{print $6}')\n                    gsm_cell_id_hex=$(echo \"$response\" | awk -F',' '{print $7}')\n                    gsm_cell_id=$(echo \"ibase=16; $gsm_cell_id_hex\" | bc)\n                    gsm_lac=$(echo \"$response\" | awk -F',' '{print $8}')\n                    gsm_rxlev=$(echo \"$response\" | awk -F',' '{print $9}')\n                    gsm_rx_quality=$(echo \"$response\" | awk -F',' '{print $10}')\n                    gsm_ta=$(echo \"$response\" | awk -F',' '{print $11}' | sed 's/\\r//g')\n                ;;\n            esac\n            \n            class=\"Cell Information\"\n            add_plain_info_entry \"network_mode\" \"$network_mode\" \"Network Mode\"\n            case $network_mode in\n            \"NR5G-SA Mode\")\n                add_plain_info_entry \"MMC\" \"$nr_mcc\" \"Mobile Country Code\"\n                add_plain_info_entry \"MNC\" \"$nr_mnc\" \"Mobile Network Code\"\n                add_plain_info_entry \"Duplex Mode\" \"$nr_duplex_mode\" \"Duplex Mode\"\n                add_plain_info_entry \"Cell ID\" \"$nr_cell_id\" \"Cell ID\"\n                add_plain_info_entry \"Physical Cell ID\" \"$nr_physical_cell_id\" \"Physical Cell ID\"\n                add_plain_info_entry \"TAC\" \"$nr_tac\" \"Tracking area code of cell served by neighbor Enb\"\n                add_plain_info_entry \"ARFCN\" \"$nr_arfcn\" \"Absolute Radio-Frequency Channel Number\"\n                add_plain_info_entry \"Band\" \"$nr_band\" \"Band\"\n                add_plain_info_entry \"DL Bandwidth\" \"$nr_dl_bandwidth\" \"DL Bandwidth\"\n                add_bar_info_entry \"RSRP\" \"$nr_rsrp\" \"Reference Signal Received Power\" -187 -29 dBm\n                add_bar_info_entry \"RSRQ\" \"$nr_rsrq\" \"Reference Signal Received Quality\" -43 20 dBm\n                add_bar_info_entry \"SINR\" \"$nr_sinr\" \"Signal to Interference plus Noise Ratio Bandwidth\" -23 40 dB\n                add_plain_info_entry \"RxLev\" \"$nr_rxlev\" \"Received Signal Level\"\n                add_plain_info_entry \"SCS\" \"$nr_scs\" \"SCS\"\n                add_plain_info_entry \"Srxlev\" \"$nr_srxlev\" \"Serving Cell Receive Level\"\n                ;;\n            \"EN-DC Mode\")\n                add_plain_info_entry \"LTE\" \"LTE\" \"\"\n                add_plain_info_entry \"MCC\" \"$endc_lte_mcc\" \"Mobile Country Code\"\n                add_plain_info_entry \"MNC\" \"$endc_lte_mnc\" \"Mobile Network Code\"\n                add_plain_info_entry \"Duplex Mode\" \"$endc_lte_duplex_mode\" \"Duplex Mode\"\n                add_plain_info_entry \"Cell ID\" \"$endc_lte_cell_id\" \"Cell ID\"\n                add_plain_info_entry \"Physical Cell ID\" \"$endc_lte_physical_cell_id\" \"Physical Cell ID\"\n                add_plain_info_entry \"EARFCN\" \"$endc_lte_earfcn\" \"E-UTRA Absolute Radio Frequency Channel Number\"\n                add_plain_info_entry \"Freq band indicator\" \"$endc_lte_freq_band_ind\" \"Freq band indicator\"\n                add_plain_info_entry \"Band\" \"$endc_lte_band\" \"Band\"\n                add_plain_info_entry \"UL Bandwidth\" \"$endc_lte_ul_bandwidth\" \"UL Bandwidth\"\n                add_plain_info_entry \"DL Bandwidth\" \"$endc_lte_dl_bandwidth\" \"DL Bandwidth\"\n                add_plain_info_entry \"CQI\" \"$endc_lte_cql\" \"Channel Quality Indicator\"\n                add_plain_info_entry \"TX Power\" \"$endc_lte_tx_power\" \"TX Power\"\n                add_plain_info_entry \"Srxlev\" \"$endc_lte_srxlev\" \"Serving Cell Receive Level\"\n                add_plain_info_entry \"TAC\" \"$endc_lte_tac\" \"Tracking area code of cell served by neighbor Enb\"\n                add_bar_info_entry \"RSRP\" \"$endc_lte_rsrp\" \"Reference Signal Received Power\" -140 -44 dBm\n                add_bar_info_entry \"RSRQ\" \"$endc_lte_rsrq\" \"Reference Signal Received Quality\" -20 20 dBm\n                add_bar_info_entry \"SINR\" \"$endc_lte_sinr\" \"Signal to Interference plus Noise Ratio Bandwidth\" -23 40 dB\n                add_plain_info_entry \"RxLev\" \"$endc_lte_rxlev\" \"Received Signal Level\"\n                add_plain_info_entry \"RSSNR\" \"$endc_lte_rssnr\" \"Radio Signal Strength Noise Ratio\"\n                add_plain_info_entry NR5G-NSA \"NR5G-NSA\" \"\"\n                add_bar_info_entry \"RSRP\" \"$endc_nr_rsrp\" \"Reference Signal Received Power\" -187 -29 dBm\n                add_bar_info_entry \"RSRQ\" \"$endc_nr_rsrq\" \"Reference Signal Received Quality\" -43 20 dBm\n                add_bar_info_entry \"SINR\" \"$endc_nr_sinr\" \"Signal to Interference plus Noise Ratio Bandwidth\" -23 40 dB\n                ;;\n            \"LTE Mode\")\n                add_plain_info_entry \"MCC\" \"$lte_mcc\" \"Mobile Country Code\"\n                add_plain_info_entry \"MNC\" \"$lte_mnc\" \"Mobile Network Code\"\n                add_plain_info_entry \"Duplex Mode\" \"$lte_duplex_mode\" \"Duplex Mode\"\n                add_plain_info_entry \"Cell ID\" \"$lte_cell_id\" \"Cell ID\"\n                add_plain_info_entry \"Physical Cell ID\" \"$lte_physical_cell_id\" \"Physical Cell ID\"\n                add_plain_info_entry \"EARFCN\" \"$lte_earfcn\" \"E-UTRA Absolute Radio Frequency Channel Number\"\n                add_plain_info_entry \"Freq band indicator\" \"$lte_freq_band_ind\" \"Freq band indicator\"\n                add_plain_info_entry \"Band\" \"$lte_band\" \"Band\"\n                add_plain_info_entry \"UL Bandwidth\" \"$lte_ul_bandwidth\" \"UL Bandwidth\"\n                add_plain_info_entry \"DL Bandwidth\" \"$lte_dl_bandwidth\" \"DL Bandwidth\"\n                add_plain_info_entry \"TAC\" \"$lte_tac\" \"Tracking area code of cell served by neighbor Enb\"\n                add_bar_info_entry \"RSRQ\" \"$lte_rsrq\" \"Reference Signal Received Quality\" -20 20 dBm \n                add_bar_info_entry \"RSSI\" \"$lte_rssi\" \"Received Signal Strength Indicator\" -140 -44 dBm\n                add_bar_info_entry \"SINR\" \"$lte_sinr\" \"Signal to Interference plus Noise Ratio Bandwidth\" -23 40 dB\n                add_plain_info_entry \"RxLev\" \"$lte_rxlev\" \"Received Signal Level\"\n                add_plain_info_entry \"RSSNR\" \"$lte_rssnr\" \"Radio Signal Strength Noise Ratio\"\n                add_plain_info_entry \"CQI\" \"$lte_cql\" \"Channel Quality Indicator\"\n                add_plain_info_entry \"TX Power\" \"$lte_tx_power\" \"TX Power\"\n                add_plain_info_entry \"Srxlev\" \"$lte_srxlev\" \"Serving Cell Receive Level\"\n                \n                ;;\n            \"WCDMA Mode\")\n                add_plain_info_entry \"MCC\" \"$wcdma_mcc\" \"Mobile Country Code\"\n                add_plain_info_entry \"MNC\" \"$wcdma_mnc\" \"Mobile Network Code\"\n                add_plain_info_entry \"LAC\" \"$wcdma_lac\" \"Location Area Code\"\n                add_plain_info_entry \"Cell ID\" \"$wcdma_cell_id\" \"Cell ID\"\n                add_plain_info_entry \"UARFCN\" \"$wcdma_uarfcn\" \"UTRA Absolute Radio Frequency Channel Number\"\n                add_plain_info_entry \"PSC\" \"$wcdma_psc\" \"Primary Scrambling Code\"\n                add_plain_info_entry \"RAC\" \"$wcdma_rac\" \"Routing Area Code\"\n                add_plain_info_entry \"Band\" \"$wcdma_band\" \"Band\"\n                add_bar_info_entry \"RSCP\" \"$wcdma_rscp\" \"Received Signal Code Power\" -120 -25 dBm\n                add_plain_info_entry \"Ec/Io\" \"$wcdma_ecio\" \"Ec/Io\"\n                add_plain_info_entry \"Ec/No\" \"$wcdma_ecno\" \"Ec/No\"\n                add_plain_info_entry \"Physical Channel\" \"$wcdma_phych\" \"Physical Channel\"\n                add_plain_info_entry \"Spreading Factor\" \"$wcdma_sf\" \"Spreading Factor\"\n                add_plain_info_entry \"Slot\" \"$wcdma_slot\" \"Slot\"\n                add_plain_info_entry \"Speech Code\" \"$wcdma_speech_code\" \"Speech Code\"\n                add_plain_info_entry \"Compression Mode\" \"$wcdma_com_mod\" \"Compression Mode\"\n                add_plain_info_entry \"RxLev\" \"$wcdma_rxlev\" \"RxLev\"\n                \n                ;;\n            esac\n            ;;\n    esac\n    \n}\n\nfunction network_info() {\n    return 0\n}\n\nfunction _get_lockband_nr(){\n    local bandcfg=$(at $at_port \"AT!BAND?\")\n    local bandtemplate=$(at $at_port \"AT!BAND=?\")\n    local start_flag=0\n    IFS=$'\\n'\n    for line in $bandtemplate; do\n        if [ \"$start_flag\" = 0 ];then\n            if [ \"${line:0:10}\" == \"Available:\" ];then\n                start_flag=1\n            fi\n            continue\n        else\n            \n            if [  \"${line:0:2}\" == \"OK\" ];then\n                break\n            fi\n        fi\n        type_line=$(echo $line | grep '[0-9]* - .*:')\n        if [ -n \"$type_line\" ]; then\n            type=$(echo $line | grep -o '[0-9]* - .*:')\n            type=${type:4:-1}\n            json_add_object $type\n            json_add_array \"available_band\"\n            json_close_array\n            json_add_array \"lock_band\"\n            json_close_array\n            json_close_object\n        elif [ -n \"$line\" ]; then\n            band_name=${line##*-}\n            band_name=$(echo $band_name | xargs)\n            [ -z \"$band_name\" ] && continue\n            case $type in\n            \"GW\")\n                band_hex=${line%%-*}\n                band_bin=$(echo \"obase=2; ibase=16; $band_hex\" | bc)\n                band_id=$(echo $band_bin | wc -c)\n                band_id=$(($band_id - 1))\n                ;;\n            *)\n                band_id=$(echo $band_name |grep -o '^[BbNn][0-9]*' | grep -o '[0-9]*')\n                ;;\n            esac\n            json_select $type\n            json_select \"available_band\"\n            add_avalible_band_entry $band_id  ${type}_${band_name} \n            json_close_array\n            json_close_object\n        fi\n\n    done\n    for line in $bandcfg; do\n        cfg_line=$(echo $line | grep '[0-9]* - ')\n        if [ -n \"$cfg_line\" ]; then\n            type=$(echo $cfg_line | cut -d' ' -f3)\n            type=${type:0:-1}\n            low_band=${cfg_line:11:16}\n            high_band=${cfg_line:28:16}\n            json_select $type\n            json_select \"lock_band\"\n            _mask_to_band _add_lock_band  $low_band $high_band\n            json_select \"..\"\n            json_select \"..\"\n        fi\n    done\n\n    unset IFS\n}\n\nfunction _set_lockband_nr(){\n    case $band_class in\n        \"GW\")\n            band_class=0\n            ;;\n        \"LTE\")\n            band_class=1\n            ;;\n        \"NRNSA\")\n            band_class=3\n            ;;\n        \"NRSA\")\n            band_class=4\n            ;;\n    esac\n    bandlist=$(_band_list_to_mask $lock_band)\n    [ \"$band_class\" -eq 0 ] && bandlist=${bandlist:0:16}\n    cmd=\"AT!BAND=0F,1,\\\"Custom\\\",$band_class,${bandlist}\"\n    res=$(at $at_port \"$cmd\" | xargs)\n    if [ \"$res\" == \"OK\" ]; then\n        set_lockband=\"AT!BAND=0F\"\n    else\n        set_lockband=\"AT!BAND=00\"\n    fi\n    r=$(at $at_port \"$set_lockband\")\n    json_add_string \"result\" \"$res\"\n    json_add_string \"cmd\" \"$cmd\"\n}\n\nfunction _get_temperature(){\n    response=$(at $at_port \"AT^CHIPTEMP?\" | grep \"\\^CHIPTEMP\" | awk -F',' '{print $6}' | sed 's/\\r//g' )\n    \n    local temperature\n    case $platform in\n        \"unisoc\")\n            [ -n \"$response\" ] && {\n                response=$(awk \"BEGIN{ printf \\\"%.2f\\\", $response }\" | sed 's/\\.*0*$//')\n                add_plain_info_entry \"temperature\" \"$response $(printf \"\\xc2\\xb0\")C\" \"Temperature\" \n            }\n            ;;\n        *)\n            [ -n \"$response\" ] && {\n                response=$(awk \"BEGIN{ printf \\\"%.2f\\\", $response / 10 }\" | sed 's/\\.*0*$//')\n                add_plain_info_entry \"temperature\" \"$response $(printf \"\\xc2\\xb0\")C\" \"Temperature\" \n            }\n            ;;\n    esac\n\n}\n\nfunction _add_avalible_band(){\n    add_avalible_band_entry $1 $1\n}\n\nfunction _add_lock_band(){\n    json_add_string \"\" $1\n}\n\nfunction _mask_to_band()\n{\n    func=$1\n    low_band=$2\n    high_band=$3\n    low_band=$(echo \"obase=2; ibase=16; $low_band\" | bc)\n    low_band=$(printf \"%064s\" $low_band)\n    for i in $(seq 1 64); do\n        if [ \"${low_band: -$i:1}\" = \"1\" ]; then\n            band=$i\n            $func $band\n        fi\n    done\n    [ -z \"$high_band\" ] && return\n    high_band=$(echo \"obase=2; ibase=16; $high_band\" | bc)\n    high_band=$(printf \"%064s\" $high_band)\n    for i in $(seq 1 64); do\n        if [ \"${high_band: -$i:1}\" = \"1\" ]; then\n            band=$((64+i))\n            $func $band\n        fi\n    done\n\n}\n\nfunction _band_list_to_mask()\n{\n    local band_list=$1\n    local low=0\n    local high=0\n    #以逗号分隔\n    IFS=\",\"\n    for band in $band_list;do\n        if [ \"$band\" -le 64 ]; then\n            #使用bc计算2的band次方\n            res=$(echo \"2^($band-1)\" | bc)\n            low=$(echo \"$low+$res\" | bc)\n\n        else\n            tmp_band=$((band-64))\n            res=$(echo \"2^($tmp_band-1)\" | bc)\n            high=$(echo \"$high+$res\" | bc)\n        fi\n    done\n    #十六进制输出，padding到16位\n    low=$(printf \"%016x\" $low)\n    high=$(printf \"%016x\" $high)\n    echo \"$low,$high\"\n}\n\nfunction _parse_hfreqinfo(){\n    local hfreqinfo=\"$1\"\n    IFS=$'\\n'\n    for line in $hfreqinfo; do\n        #$2 为制式 1为GSM 2为CDMA 3为WCDMA 4为TD-SCDMA 6为LTE 7为NR\n        #$3 为频段 \n        #$4 为dl频点\n        #$5 为dl频率(KHz)\n        #$6 为dl带宽(KHz)\n        #$7 为ul频点\n        #$8 为ul频率(KHz)\n        #$9 为ul带宽(KHz)\n        rat=$(echo $line | awk -F ',' '{print $2}')\n        case $rat in\n            1) rat_name=\"GSM\" ;;\n            2) rat_name=\"CDMA\" ;;\n            3) rat_name=\"WCDMA\" ;;\n            4) rat_name=\"TD-SCDMA\" ;;\n            6) rat_name=\"LTE\" ;;\n            7) rat_name=\"NR\" ;;\n        esac\n        #KHz to MHz\n        band=$(echo $line | awk -F ',' '{print $3}')\n        dl_fcn=$(echo $line | awk -F ',' '{print $4}' )\n        dl_freqN=$(echo $line | awk -F ',' '{print $5}')\n        dl_freq=${dl_freqN: 0:-1}\n        dl_N=${dl_freqN: -1}\n        dl_bw=$(echo $line | awk -F ',' '{print $6}' | awk '{printf \"%.1f\", $1/1000}')\n        up_fcn=$(echo $line | awk -F ',' '{print $7}')\n        up_freqN=$(echo $line | awk -F ',' '{print $8}')\n        #去除最后一位\n        up_freq=${up_freqN: 0:-1}\n        #获取最后一位\n        up_N=${up_freqN: -1}\n        up_bw=$(echo $line | awk -F ',' '{print $9}'| awk '{printf \"%.1f\", $1/1000}')\n        \n\n        case $rat in\n            6) \n                band_prefix=\"B\"\n                LTE_INFO_BAND=\"${band_prefix}${band}\"\n                LTE_INFO_DL=\"${dl_freq} @ ${dl_bw}MHz\"\n                LTE_INFO_UL=\"${up_freq} @ ${up_bw}MHz\"\n                ;;\n            7) \n                band_prefix=\"N\"\n                NR_INFO_BAND=\"${band_prefix}${band}\"\n                NR_INFO_DL=\"${dl_freq} @ ${dl_bw}MHz\"\n                NR_INFO_UL=\"${up_freq} @ ${up_bw}MHz\"\n                ;;\n            *) \n                band_prefix=\"\"\n                OTHER_INFO_BAND=\"${band_prefix}${band}\"\n                OTHER_INFO_DL=\"${dl_freq} @ ${dl_bw}MHz\"\n                OTHER_INFO_UL=\"${up_freq} @ ${up_bw}MHz\"\n                ;;\n        esac\n    done\n    unset IFS\n}\n\n# get sim switch capabilities\nsim_switch_capabilities(){\n    json_add_string \"supportSwitch\" \"1\"\n    json_add_string \"ExtraInfo\" \"Huawei Modem does not support querying SIM slot capabilities via AT commands.Slot display may be incorrect.\"\n    json_add_array \"simSlots\"\n    json_add_string \"\" \"0\"\n    json_add_string \"\" \"1\"\n    json_close_array\n}\n\nget_sim_slot(){\n    #local at_command=\"AT^HVSST?\"\n\t#sim_slot=$(at $at_port $at_command | grep \"HVSST:\" | awk -F',' '{print $3}' | xargs)\n    sim_slot=$(cat /tmp/huawei_sim_slot_$config_section)||sim_slot=\"0\" && echo \"$sim_slot\" > /tmp/huawei_sim_slot_$config_section\n    json_add_string \"sim_slot\" \"$sim_slot\"\n}\n\nset_sim_slot(){\n    local sim_slot=$1\n    case $platform in\n        \"unisoc\")\n            at_command=\"AT^SIMSWITCH=$sim_slot\"\n            ;;\n        \"hisilicon\")\n            case $sim_slot in\n                \"0\")\n                    at_command=\"AT^SCICHG=0,1\"\n                    ;;\n                \"1\")\n                    at_command=\"AT^SCICHG=1,0\"\n                    ;;\n            esac\n            ;;\n    esac\n    echo \"$sim_slot\" > /tmp/huawei_sim_slot_$config_section\n    response=$(at $at_port $at_command | xargs)\n    json_add_string \"result\" \"$response\"\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/vendor/meig.sh",
    "content": "#!/bin/sh\n# Copyright (C) 2023 Siriling <siriling@qq.com>\n# Copyright (C) 2025 sfwtw\n_Vendor=\"meig\"\n_Author=\"Siriling,sfwtw\"\n_Maintainer=\"sfwtw <unkown>\"\nsource /usr/share/qmodem/generic.sh\ndebug_subject=\"meig_ctrl\"\n\nvendor_get_disabled_features(){\n    json_add_string \"\" \"NeighborCell\"\n    json_add_string \"\" \"LockBand\"\n}\n\n# Return raw data   \nget_imei(){\n    at_command=\"AT+CGSN\"\n    imei=$(at $at_port $at_command | grep -o \"[0-9]\\{15\\}\")\n    json_add_string \"imei\" \"$imei\"\n}\n\nset_imei(){\n    local imei=\"$1\"\n    at_command=\"AT+LCTSN=1,7,\\\"$imei\\\"\"\n    res=$(at $at_port $at_command)\n    json_select \"result\"\n    json_add_string \"set_imei\" \"$res\"\n    json_close_object\n    get_imei\n}\n\n# Get dial mode\nget_mode()\n{\n    at_command='AT+SER?'\n    local mode_num=$(at ${at_port} ${at_command} | grep \"+SER:\" | sed 's/+SER: //g' | sed 's/\\r//g')\n    local mode\n    case \"$platform\" in\n        \"qualcomm\")\n            case \"$mode_num\" in\n                \"2\") mode=\"ecm\" ;;\n                \"3\") mode=\"rndis\" ;;\n                \"2\") mode=\"ncm\" ;;\n                *) mode=\"${mode_num}\" ;;\n            esac\n        ;;\n        \"lte12\"|\"lte\")\n            case \"$mode_num\" in\n                \"2\") mode=\"ecm\" ;;\n                \"3\") mode=\"rndis\" ;;\n                \"2\") mode=\"ncm\" ;;\n                *) mode=\"${mode_num}\" ;;\n            esac\n        ;;\n        \"unisoc\")\n            case \"$mode_num\" in\n                \"2\") mode=\"ecm\" ;;\n                \"3\") mode=\"rndis\" ;;\n                \"1\") mode=\"ncm\" ;;\n                *) mode=\"${mode_num}\" ;;\n            esac\n        ;;\n        *)\n            mode=\"${mode_num}\"\n        ;;\n    esac\n    available_modes=$(uci -q get qmodem.$config_section.modes)\n    json_add_object \"mode\"\n    for available_mode in $available_modes; do\n        if [ \"$mode\" = \"$available_mode\" ]; then\n            json_add_string \"$available_mode\" \"1\"\n        else\n            json_add_string \"$available_mode\" \"0\"\n        fi\n    done\n    json_close_object\n}\n\n# Set dial mode\nset_mode()\n{\n    local mode=$1\n    case \"$platform\" in\n        \"qualcomm\"|\"lte12\"|\"lte\")\n            case \"$mode\" in\n                \"ecm\") mode_num=\"2\" ;;\n                \"rndis\") mode_num=\"3\" ;;\n                \"ncm\") mode_num=\"2\" ;;\n                *) mode_num=\"1\" ;;\n            esac\n        ;;\n        \"unisoc\")\n            case \"$mode\" in\n                \"ecm\") mode_num=\"2\" ;;\n                \"rndis\") mode_num=\"3\" ;;\n                \"ncm\") mode_num=\"1\" ;;\n                *) mode_num=\"1\" ;;\n            esac\n        ;;\n        *)\n            mode_num=\"1\"\n        ;;\n    esac\n    at_command='AT+SER='${mode_num}',1'\n    res=$(at \"${at_port}\" \"${at_command}\")\n    json_select \"result\"\n    json_add_string \"set_mode\" \"$res\"\n    json_close_object\n}\n\n# Get network preference\nget_network_prefer()\n{\n    at_command='AT^SYSCFGEX?'\n    local response=$(at ${at_port} ${at_command} | grep \"\\^SYSCFGEX:\" | sed 's/\\^SYSCFGEX://g')\n    local network_type_num=$(echo \"$response\" | awk -F'\"' '{print $2}')\n    \n    network_prefer_2g=\"0\"\n    network_prefer_3g=\"0\"\n    network_prefer_4g=\"0\"\n    network_prefer_5g=\"0\"\n    \n    local auto=$(echo \"${network_type_num}\" | grep \"00\")\n    if [ -n \"$auto\" ]; then\n        network_prefer_2g=\"1\"\n        network_prefer_3g=\"1\"\n        network_prefer_4g=\"1\"\n        network_prefer_5g=\"1\"\n    else\n        local gsm=$(echo \"${network_type_num}\" | grep \"01\")\n        local wcdma=$(echo \"${network_type_num}\" | grep \"02\")\n        local lte=$(echo \"${network_type_num}\" | grep \"03\")\n        local nr=$(echo \"${network_type_num}\" | grep \"04\")\n        if [ -n \"$gsm\" ]; then\n            network_prefer_2g=\"1\"\n        fi\n        if [ -n \"$wcdma\" ]; then\n            network_prefer_3g=\"1\"\n        fi\n        if [ -n \"$lte\" ]; then\n            network_prefer_4g=\"1\"\n        fi\n        if [ -n \"$nr\" ]; then\n            network_prefer_5g=\"1\"\n        fi\n    fi\n    json_add_object network_prefer\n    json_add_string 2G \"$network_prefer_2g\"\n    json_add_string 3G \"$network_prefer_3g\"\n    json_add_string 4G \"$network_prefer_4g\"\n    json_add_string 5G \"$network_prefer_5g\"\n    json_close_object\n}\n\n# Set network preference\nset_network_prefer()\n{\n    local networks=$1\n    local network_prefer_config=\"\"\n    network_prefer_3g=$(echo $1 |jq -r 'contains([\"3G\"])')\n    network_prefer_4g=$(echo $1 |jq -r 'contains([\"4G\"])')\n    network_prefer_5g=$(echo $1 |jq -r 'contains([\"5G\"])')\n    if [ \"$network_prefer_5g\" = \"true\" ]; then\n        network_prefer_config=\"${network_prefer_config}04\"\n    fi\n    if [ \"$network_prefer_4g\" = \"true\" ]; then\n        network_prefer_config=\"${network_prefer_config}03\"\n    fi\n    if [ \"$network_prefer_3g\" = \"true\" ]; then\n        network_prefer_config=\"${network_prefer_config}02\"\n    fi\n    if [ -z \"$network_prefer_config\" ]; then\n        network_prefer_config=\"00\"\n    fi\n    at_command='AT^SYSCFGEX=\"'${network_prefer_config}'\",all,0,2,all,all,all,all,1'\n    res=$(at \"${at_port}\" \"${at_command}\")\n    json_select \"result\"\n    json_add_string \"set_network_prefer\" \"$res\"\n    json_close_object\n}\n\nget_voltage()\n{\n    # at_command=\"AT+CBC\"\n\t# local voltage=$(at ${at_port} ${at_command} | grep \"+CBC:\" | awk -F',' '{print $3}' | sed 's/\\r//g')\n    [ -n \"$voltage\" ] && {\n        add_plain_info_entry \"voltage\" \"$voltage mV\" \"Voltage\" \n    }\n}\n\n# Get temperature\nget_temperature()\n{   \n    at_command=\"AT+TEMP\"\n    local response\n    local temp\n    local degree_symbol=$(printf \"\\xc2\\xb0\")C \n\n# 根据平台选择不同的AT命令并提取温度值\nif [ \"$platform\" = \"unisoc\" ]; then\n    response=$(at ${at_port} ${at_command} | grep 'TEMP: \"soc-thmzone\"' | awk -F'\"' '{print $4}')\nelse\n    response=$(at ${at_port} ${at_command} | grep 'TEMP: \"cpu0-0-usr\"' | awk -F'\"' '{print $4}')\n fi\n\n# 处理响应值\nif [ -n \"$response\" ]; then\n    if [ \"$platform\" = \"unisoc\" ]; then\n        # Unisoc平台需要将原始值除以1000并保留两位小数\n        temp_value=$(echo \"scale=2; $response / 1000\" | bc)\n        temp=\"${temp_value}${degree_symbol}\"\n    else\n        # 其他平台直接使用原始值\n        temp=\"${response}${degree_symbol}\"\n    fi\nelse\n    # 无响应时显示NaN\n    temp=\"NaN ${degree_symbol}\"\n    fi\n    add_plain_info_entry \"temperature\" \"$temp\" \"Temperature\"\n}\n\n# Basic information\nbase_info()\n{\n    m_debug  \"Meig base info\"\n\n    at_command=\"AT+CGMM\"\n    name=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n    at_command=\"AT+CGMI\"\n    manufacturer=$(at $at_port $at_command | sed -n '2p' | sed 's/+CGMI: //g' | sed 's/\\r//g')\n    at_command=\"AT+CGMR\"\n    revision=$(at $at_port $at_command | grep \"+CGMR: \" | awk -F': ' '{print $2}' | sed 's/\\r//g')\n    class=\"Base Information\"\n    add_plain_info_entry \"name\" \"$name\" \"Name\"\n    add_plain_info_entry \"manufacturer\" \"$manufacturer\" \"Manufacturer\"\n    add_plain_info_entry \"revision\" \"$revision\" \"Revision\"\n    add_plain_info_entry \"at_port\" \"$at_port\" \"AT Port\"\n    get_temperature\n    get_voltage\n    get_connect_status\n}\n\n# SIM card information\nsim_info()\n{\n    m_debug  \"Meig sim info\"\n    \n    at_command=\"AT^SIMSLOT?\"\n    response=$(at ${at_port} ${at_command} | grep \"\\^SIMSLOT:\" | awk -F': ' '{print $2}' | awk -F',' '{print $2}')\n    if [ \"$response\" != \"0\" ]; then\n        sim_slot=\"1\"\n    else\n        sim_slot=\"2\"\n    fi\n\n    at_command=\"AT+CGSN\"\n    imei=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n\n    at_command=\"AT+CPIN?\"\n    sim_status_flag=$(at $at_port $at_command | sed -n '2p')\n    sim_status=$(get_sim_status \"$sim_status_flag\")\n\n    if [ \"$sim_status\" != \"ready\" ]; then\n        return\n    fi\n\n    at_command=\"AT+COPS?\"\n    isp=$(at $at_port $at_command | sed -n '2p' | awk -F'\"' '{print $2}')\n\n    at_command=\"AT+CNUM\"\n    sim_number=$(at $at_port $at_command | sed -n '2p' | awk -F'\"' '{print $4}')\n\n    at_command=\"AT+CIMI\"\n    imsi=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n\n    at_command=\"AT+ICCID\"\n    iccid=$(at $at_port $at_command | grep -o \"+ICCID:[ ]*[-0-9]\\+\" | grep -o \"[-0-9]\\{1,4\\}\")\n    class=\"SIM Information\"\n    case \"$sim_status\" in\n        \"ready\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"ISP\" \"$isp\" \"Internet Service Provider\"\n            add_plain_info_entry \"SIM Slot\" \"$sim_slot\" \"SIM Slot\"\n            add_plain_info_entry \"SIM Number\" \"$sim_number\" \"SIM Number\"\n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n            add_plain_info_entry \"IMSI\" \"$imsi\" \"International Mobile Subscriber Identity\" \n            add_plain_info_entry \"ICCID\" \"$iccid\" \"Integrate Circuit Card Identity\" \n        ;;\n        \"miss\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n        ;;\n        \"unknown\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n        ;;\n        *)\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"SIM Slot\" \"$sim_slot\" \"SIM Slot\" \n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n            add_plain_info_entry \"IMSI\" \"$imsi\" \"International Mobile Subscriber Identity\" \n            add_plain_info_entry \"ICCID\" \"$iccid\" \"Integrate Circuit Card Identity\" \n        ;;\n    esac\n}\n\n# Network information\nnetwork_info()\n{\n    m_debug  \"Meig network info\"\n\n    at_command=\"AT^SYSINFOEX\"\n    network_type=$(at ${at_port} ${at_command} | grep \"\\^SYSINFOEX:\" | awk -F'\"' '{print $4}')\n\n    [ -z \"$network_type\" ] && {\n        at_command='AT+COPS?'\n        local rat_num=$(at ${at_port} ${at_command} | grep \"+COPS:\" | awk -F',' '{print $4}' | sed 's/\\r//g')\n        network_type=$(get_rat ${rat_num})\n    }\n\n    at_command=\"AT+CSQ\"\n    response=$(at ${at_port} ${at_command} | grep \"+CSQ:\" | sed 's/+CSQ: //g' | sed 's/\\r//g')\n\n    at_command=\"AT^DSAMBR=${pdp_index:-1}\"\n    response=$(at $at_port $at_command | grep \"\\^DSAMBR:\" | awk -F': ' '{print $2}')\n    \n    ambr_ul_tmp=\"0\"\n    ambr_dl_tmp=\"0\"\n    \n    if [ -n \"$response\" ]; then\n        case \"$network_type\" in\n            \"LTE\")\n                ambr_ul_tmp=$(echo \"$response\" | awk -F',' '{for(i=1;i<=NF-2;i+=2){if($i!=\"0\")tmp=$i};if(tmp==\"\")tmp=0;print tmp}')\n                ambr_dl_tmp=$(echo \"$response\" | awk -F',' '{for(i=2;i<=NF-2;i+=2){if($i!=\"0\")tmp=$i};if(tmp==\"\")tmp=0;print tmp}')\n            ;;\n            \"NR\")\n                ambr_ul_tmp=$(echo \"$response\" | awk -F',' '{print (NF>=9)?$9:\"0\"}')\n                ambr_dl_tmp=$(echo \"$response\" | awk -F',' '{print (NF>=10)?$10:\"0\"}' | sed 's/\\r//g')\n            ;;\n            *)\n                ambr_ul_tmp=$(echo \"$response\" | awk -F',' '{for(i=1;i<=NF-2;i+=2){if($i!=\"0\")tmp=$i};if(tmp==\"\")tmp=0;print tmp}')\n                ambr_dl_tmp=$(echo \"$response\" | awk -F',' '{for(i=2;i<=NF-2;i+=2){if($i!=\"0\")tmp=$i};if(tmp==\"\")tmp=0;print tmp}')\n            ;;\n        esac\n    fi\n\n    [ -z \"$ambr_ul_tmp\" ] || [ \"$ambr_ul_tmp\" = \"0\" ] || ! echo \"$ambr_ul_tmp\" | grep -q '^[0-9.]*$' && ambr_ul_tmp=\"0\"\n    [ -z \"$ambr_dl_tmp\" ] || [ \"$ambr_dl_tmp\" = \"0\" ] || ! echo \"$ambr_dl_tmp\" | grep -q '^[0-9.]*$' && ambr_dl_tmp=\"0\"\n    \n    if [ \"$ambr_ul_tmp\" = \"0\" ]; then\n        ambr_ul=\"0\"\n    else\n        ambr_ul=$(awk \"BEGIN{ printf \\\"%.2f\\\", $ambr_ul_tmp / 1024 }\" 2>/dev/null || echo \"0\")\n        ambr_ul=$(echo \"$ambr_ul\" | sed 's/\\.*0*$//')\n        [ -z \"$ambr_ul\" ] && ambr_ul=\"0\"\n    fi\n    \n    if [ \"$ambr_dl_tmp\" = \"0\" ]; then\n        ambr_dl=\"0\"\n    else\n        ambr_dl=$(awk \"BEGIN{ printf \\\"%.2f\\\", $ambr_dl_tmp / 1024 }\" 2>/dev/null || echo \"0\")\n        ambr_dl=$(echo \"$ambr_dl\" | sed 's/\\.*0*$//')\n        [ -z \"$ambr_dl\" ] && ambr_dl=\"0\"\n    fi\n\n    at_command='AT^DSFLOWQRY'\n    response=$(at $at_port $at_command | grep \"\\^DSFLOWRPT:\" | sed 's/\\^DSFLOWRPT: //g' | sed 's/\\r//g')\n    \n    tx_rate=\"0\"\n    rx_rate=\"0\"\n    \n    if [ -n \"$response\" ]; then\n        tx_rate=$(echo $response | awk -F',' '{print (NF>=1)?$1:\"0\"}')\n        rx_rate=$(echo $response | awk -F',' '{print (NF>=2)?$2:\"0\"}')\n    fi\n    \n    [ -z \"$tx_rate\" ] || ! echo \"$tx_rate\" | grep -q '^[0-9]*$' && tx_rate=\"0\"\n    [ -z \"$rx_rate\" ] || ! echo \"$rx_rate\" | grep -q '^[0-9]*$' && rx_rate=\"0\"\n    \n    class=\"Network Information\"\n    add_plain_info_entry \"Network Type\" \"$network_type\" \"Network Type\"\n    add_plain_info_entry \"AMBR UL\" \"$ambr_ul\" \"Access Maximum Bit Rate for Uplink\"\n    add_plain_info_entry \"AMBR DL\" \"$ambr_dl\" \"Access Maximum Bit Rate for Downlink\"\n    add_speed_entry rx $rx_rate\n    add_speed_entry tx $tx_rate\n}\n\n# Cell information\ncell_info()\n{\n    m_debug  \"Meig cell info\"\n\n    at_command=\"AT^CELLINFO=${pdp_index:-1}\"\n    response=$(at $at_port $at_command | grep \"\\^CELLINFO:\" | sed 's/\\^CELLINFO://')\n    \n    local rat=\"\"\n    network_mode=\"Unknown Mode\"\n\n    [ -n \"$response\" ] && {\n        rat=$(echo \"$response\" | awk -F',' '{print $1}' | tr -d ' ')\n    }\n    \n    case $rat in\n        \"5G\")\n            network_mode=\"NR5G-SA Mode\"\n            nr_duplex_mode=$(echo \"$response\" | awk -F',' '{print $2}' | tr -d ' ')\n            nr_mcc=$(echo \"$response\" | awk -F',' '{print $3}' | tr -d ' ')\n            nr_mnc=$(echo \"$response\" | awk -F',' '{print $4}' | tr -d ' ')\n            nr_cell_id=$(echo \"$response\" | awk -F',' '{print $5}' | tr -d ' ')\n            nr_physical_cell_id=$(echo \"$response\" | awk -F',' '{print $6}' | tr -d ' ')\n            nr_tac=$(echo \"$response\" | awk -F',' '{print $7}' | tr -d ' ')\n            nr_band_num=$(echo \"$response\" | awk -F',' '{print $8}' | tr -d ' ')\n            nr_band=$(get_band \"NR\" \"$nr_band_num\")\n            nr_dl_bandwidth_num=$(echo \"$response\" | awk -F',' '{print $9}' | tr -d ' ')\n            nr_dl_bandwidth=$(get_bandwidth \"NR\" \"$nr_dl_bandwidth_num\")\n            nr_scs=$(echo \"$response\" | awk -F',' '{print $10}' | tr -d ' ')\n            nr_rsrp=$(echo \"$response\" | awk -F',' '{print $15}' | tr -d ' ')\n            nr_rsrq=$(echo \"$response\" | awk -F',' '{print $16}' | tr -d ' ')\n            nr_sinr_num=$(echo \"$response\" | awk -F',' '{print $17}' | tr -d ' ')\n            \n            if [ -n \"$nr_sinr_num\" ] && echo \"$nr_sinr_num\" | grep -q '^[0-9.-]*$'; then\n                nr_sinr=$(awk \"BEGIN{ print $nr_sinr_num / 10 }\" 2>/dev/null || echo \"0\")\n            else\n                nr_sinr=\"0\"\n            fi\n        ;;\n        \"LTE-NR\")\n            network_mode=\"EN-DC Mode\"\n            endc_lte_duplex_mode=$(echo \"$response\" | awk -F',' '{print $2}' | tr -d ' ')\n            endc_lte_mcc=$(echo \"$response\" | awk -F',' '{print $3}' | tr -d ' ')\n            endc_lte_mnc=$(echo \"$response\" | awk -F',' '{print $4}' | tr -d ' ')\n            endc_lte_physical_cell_id=$(echo \"$response\" | awk -F',' '{print $6}' | tr -d ' ')\n            endc_lte_cell_id=$(echo \"$response\" | awk -F',' '{print $8}' | tr -d ' ')\n            endc_lte_tac=$(echo \"$response\" | awk -F',' '{print $9}' | tr -d ' ')\n            endc_lte_band_num=$(echo \"$response\" | awk -F',' '{print $10}' | tr -d ' ')\n            endc_lte_band=$(get_band \"LTE\" \"$endc_lte_band_num\")\n            ul_bandwidth_num=$(echo \"$response\" | awk -F',' '{print $11}' | tr -d ' ')\n            endc_lte_ul_bandwidth=$(get_bandwidth \"LTE\" \"$ul_bandwidth_num\")\n            endc_lte_dl_bandwidth=\"$endc_lte_ul_bandwidth\"\n            endc_lte_rsrp=$(echo \"$response\" | awk -F',' '{print $15}' | tr -d ' ')\n            endc_lte_rsrq=$(echo \"$response\" | awk -F',' '{print $16}' | tr -d ' ')\n            endc_lte_sinr_num=$(echo \"$response\" | awk -F',' '{print $17}' | tr -d ' ')\n            \n            if [ -n \"$endc_lte_sinr_num\" ] && echo \"$endc_lte_sinr_num\" | grep -q '^[0-9.-]*$'; then\n                endc_lte_sinr=$(awk \"BEGIN{ print $endc_lte_sinr_num / 10 }\" 2>/dev/null || echo \"0\")\n            else\n                endc_lte_sinr=\"0\"\n            fi\n            \n            endc_lte_tx_power=$(echo \"$response\" | awk -F',' '{print $22}' | tr -d ' ')\n            endc_nr_mcc=\"$endc_lte_mcc\"\n            endc_nr_mnc=\"$endc_lte_mnc\"\n            field_count=$(echo \"$response\" | awk -F',' '{print NF}')\n            \n            if [ \"$field_count\" -ge 30 ]; then\n                endc_nr_physical_cell_id=$(echo \"$response\" | awk -F',' '{print $30}' | tr -d ' ')\n            else\n                endc_nr_physical_cell_id=\"\"\n            fi\n            \n            if [ \"$field_count\" -ge 31 ]; then\n                endc_nr_rsrp=$(echo \"$response\" | awk -F',' '{print $30}' | tr -d ' ')\n            else\n                endc_nr_rsrp=\"\"\n            fi\n            \n            if [ \"$field_count\" -ge 32 ]; then\n                endc_nr_rsrq=$(echo \"$response\" | awk -F',' '{print $31}' | tr -d ' ')\n            else\n                endc_nr_rsrq=\"\"\n            fi\n            \n            if [ \"$field_count\" -ge 33 ]; then\n                endc_nr_sinr_num=$(echo \"$response\" | awk -F',' '{print $32}' | tr -d ' ')\n                if [ -n \"$endc_nr_sinr_num\" ] && echo \"$endc_nr_sinr_num\" | grep -q '^[0-9.-]*$'; then\n                    endc_nr_sinr=$(awk \"BEGIN{ print $endc_nr_sinr_num / 10 }\" 2>/dev/null || echo \"0\")\n                else\n                    endc_nr_sinr=\"0\"\n                fi\n            else\n                endc_nr_sinr=\"0\"\n            fi\n            \n            if [ \"$field_count\" -ge 34 ]; then\n                endc_nr_band_num=$(echo \"$response\" | awk -F',' '{print $33}' | tr -d ' ')\n                endc_nr_band=$(get_band \"NR\" \"$endc_nr_band_num\")\n            else\n                endc_nr_band=\"\"\n            fi\n            \n            if [ \"$field_count\" -ge 36 ]; then\n                nr_dl_bandwidth_num=$(echo \"$response\" | awk -F',' '{print $35}' | tr -d ' ')\n                endc_nr_dl_bandwidth=$(get_bandwidth \"NR\" \"$nr_dl_bandwidth_num\")\n            else\n                endc_nr_dl_bandwidth=\"\"\n            fi\n            \n            if [ \"$field_count\" -ge 38 ]; then\n                endc_nr_scs=$(echo \"$response\" | awk -F',' '{print $37}' | tr -d ' \\r')\n            else\n                endc_nr_scs=\"\"\n            fi\n        ;;\n        \"LTE\"|\"eMTC\"|\"NB-IoT\")\n            network_mode=\"LTE Mode\"\n            lte_duplex_mode=$(echo \"$response\" | awk -F',' '{print $2}' | tr -d ' ')\n            lte_mcc=$(echo \"$response\" | awk -F',' '{print $3}' | tr -d ' ')\n            lte_mnc=$(echo \"$response\" | awk -F',' '{print $4}' | tr -d ' ')\n            lte_physical_cell_id=$(echo \"$response\" | awk -F',' '{print $6}' | tr -d ' ')\n            lte_cell_id=$(echo \"$response\" | awk -F',' '{print $8}' | tr -d ' ')\n            lte_tac=$(echo \"$response\" | awk -F',' '{print $9}' | tr -d ' ')\n            lte_band_num=$(echo \"$response\" | awk -F',' '{print $10}' | tr -d ' ')\n            lte_band=$(get_band \"LTE\" \"$lte_band_num\")\n            ul_bandwidth_num=$(echo \"$response\" | awk -F',' '{print $11}' | tr -d ' ')\n            lte_ul_bandwidth=$(get_bandwidth \"LTE\" \"$ul_bandwidth_num\")\n            lte_dl_bandwidth=\"$lte_ul_bandwidth\"\n            lte_rsrp=$(echo \"$response\" | awk -F',' '{print $15}' | tr -d ' ')\n            lte_rsrq=$(echo \"$response\" | awk -F',' '{print $16}' | tr -d ' ')\n            lte_sinr_num=$(echo \"$response\" | awk -F',' '{print $17}' | tr -d ' ')\n            \n            if [ -n \"$lte_sinr_num\" ] && echo \"$lte_sinr_num\" | grep -q '^[0-9.-]*$'; then\n                lte_sinr=$(awk \"BEGIN{ print $lte_sinr_num / 10 }\" 2>/dev/null || echo \"0\")\n            else\n                lte_sinr=\"0\"\n            fi\n            \n            field_count=$(echo \"$response\" | awk -F',' '{print NF}')\n            if [ \"$field_count\" -ge 23 ]; then\n                lte_tx_power=$(echo \"$response\" | awk -F',' '{print $22}' | tr -d ' ')\n            else\n                lte_tx_power=\"\"\n            fi\n        ;;\n        \"WCDMA\"|\"UMTS\")\n            network_mode=\"WCDMA Mode\"\n            wcdma_mcc=$(echo \"$response\" | awk -F',' '{print $2}' | tr -d ' ')\n            wcdma_mnc=$(echo \"$response\" | awk -F',' '{print $3}' | tr -d ' ')\n            wcdma_psc=$(echo \"$response\" | awk -F',' '{print $5}' | tr -d ' ')\n            wcdma_cell_id=$(echo \"$response\" | awk -F',' '{print $7}' | tr -d ' ')\n            wcdma_lac=$(echo \"$response\" | awk -F',' '{print $8}' | tr -d ' ')\n            wcdma_band_num=$(echo \"$response\" | awk -F',' '{print $9}' | tr -d ' ')\n            wcdma_band=$(get_band \"WCDMA\" \"$wcdma_band_num\")\n            \n            field_count=$(echo \"$response\" | awk -F',' '{print NF}')\n            if [ \"$field_count\" -ge 14 ]; then\n                wcdma_ecio=$(echo \"$response\" | awk -F',' '{print $13}' | tr -d ' ')\n            else\n                wcdma_ecio=\"\"\n            fi\n            \n            if [ \"$field_count\" -ge 16 ]; then\n                wcdma_rscp=$(echo \"$response\" | awk -F',' '{print $15}' | tr -d ' \\r')\n            else\n                wcdma_rscp=\"\"\n            fi\n        ;;\n    esac\n    \n    class=\"Cell Information\"\n    add_plain_info_entry \"network_mode\" \"$network_mode\" \"Network Mode\"\n    case $network_mode in\n    \"NR5G-SA Mode\")\n        add_plain_info_entry \"MMC\" \"$nr_mcc\" \"Mobile Country Code\"\n        add_plain_info_entry \"MNC\" \"$nr_mnc\" \"Mobile Network Code\"\n        add_plain_info_entry \"Duplex Mode\" \"$nr_duplex_mode\" \"Duplex Mode\"\n        add_plain_info_entry \"Cell ID\" \"$nr_cell_id\" \"Cell ID\"\n        add_plain_info_entry \"Physical Cell ID\" \"$nr_physical_cell_id\" \"Physical Cell ID\"\n        add_plain_info_entry \"TAC\" \"$nr_tac\" \"Tracking area code\"\n        add_plain_info_entry \"Band\" \"$nr_band\" \"Band\"\n        add_plain_info_entry \"DL Bandwidth\" \"$nr_dl_bandwidth\" \"DL Bandwidth\"\n        add_bar_info_entry \"RSRP\" \"$nr_rsrp\" \"Reference Signal Received Power\" -140 -44 dBm\n        add_bar_info_entry \"RSRQ\" \"$nr_rsrq\" \"Reference Signal Received Quality\" -19.5 -3 dB\n        add_bar_info_entry \"SINR\" \"$nr_sinr\" \"Signal to Interference plus Noise Ratio\" 0 30 dB\n        add_plain_info_entry \"SCS\" \"$nr_scs\" \"SCS\"\n        ;;\n    \"EN-DC Mode\")\n        add_plain_info_entry \"LTE\" \"LTE\" \"\"\n        add_plain_info_entry \"MCC\" \"$endc_lte_mcc\" \"Mobile Country Code\"\n        add_plain_info_entry \"MNC\" \"$endc_lte_mnc\" \"Mobile Network Code\"\n        add_plain_info_entry \"Duplex Mode\" \"$endc_lte_duplex_mode\" \"Duplex Mode\"\n        add_plain_info_entry \"Cell ID\" \"$endc_lte_cell_id\" \"Cell ID\"\n        add_plain_info_entry \"Physical Cell ID\" \"$endc_lte_physical_cell_id\" \"Physical Cell ID\"\n        add_plain_info_entry \"TAC\" \"$endc_lte_tac\" \"Tracking area code\"\n        add_plain_info_entry \"Band\" \"$endc_lte_band\" \"Band\"\n        add_plain_info_entry \"UL Bandwidth\" \"$endc_lte_ul_bandwidth\" \"UL Bandwidth\"\n        add_plain_info_entry \"DL Bandwidth\" \"$endc_lte_dl_bandwidth\" \"DL Bandwidth\"\n        add_bar_info_entry \"RSRP\" \"$endc_lte_rsrp\" \"Reference Signal Received Power\" -140 -44 dBm\n        add_bar_info_entry \"RSRQ\" \"$endc_lte_rsrq\" \"Reference Signal Received Quality\" -19.5 -3 dB\n        add_bar_info_entry \"SINR\" \"$endc_lte_sinr\" \"Signal to Interference plus Noise Ratio\" 0 30 dB\n        add_plain_info_entry \"TX Power\" \"$endc_lte_tx_power\" \"TX Power\"\n        if [ -n \"$endc_nr_physical_cell_id\" ] || [ -n \"$endc_nr_band\" ]; then\n            add_plain_info_entry \"NR5G-NSA\" \"NR5G-NSA\" \"\"\n            add_plain_info_entry \"MCC\" \"$endc_nr_mcc\" \"Mobile Country Code\"\n            add_plain_info_entry \"MNC\" \"$endc_nr_mnc\" \"Mobile Network Code\"\n            [ -n \"$endc_nr_physical_cell_id\" ] && add_plain_info_entry \"Physical Cell ID\" \"$endc_nr_physical_cell_id\" \"Physical Cell ID\"\n            [ -n \"$endc_nr_band\" ] && add_plain_info_entry \"Band\" \"$endc_nr_band\" \"Band\"\n            [ -n \"$endc_nr_dl_bandwidth\" ] && add_plain_info_entry \"DL Bandwidth\" \"$endc_nr_dl_bandwidth\" \"DL Bandwidth\"\n            [ -n \"$endc_nr_rsrp\" ] && add_bar_info_entry \"RSRP\" \"$endc_nr_rsrp\" \"Reference Signal Received Power\" -140 -44 dBm\n            [ -n \"$endc_nr_rsrq\" ] && add_bar_info_entry \"RSRQ\" \"$endc_nr_rsrq\" \"Reference Signal Received Quality\" -19.5 -3 dB\n            [ -n \"$endc_nr_sinr\" ] && add_bar_info_entry \"SINR\" \"$endc_nr_sinr\" \"Signal to Interference plus Noise Ratio\" 0 30 dB\n            [ -n \"$endc_nr_scs\" ] && add_plain_info_entry \"SCS\" \"$endc_nr_scs\" \"SCS\"\n        fi\n        ;;\n    \"LTE Mode\")\n        add_plain_info_entry \"MCC\" \"$lte_mcc\" \"Mobile Country Code\"\n        add_plain_info_entry \"MNC\" \"$lte_mnc\" \"Mobile Network Code\"\n        add_plain_info_entry \"Duplex Mode\" \"$lte_duplex_mode\" \"Duplex Mode\"\n        add_plain_info_entry \"Cell ID\" \"$lte_cell_id\" \"Cell ID\"\n        add_plain_info_entry \"Physical Cell ID\" \"$lte_physical_cell_id\" \"Physical Cell ID\"\n        add_plain_info_entry \"TAC\" \"$lte_tac\" \"Tracking area code\"\n        add_plain_info_entry \"Band\" \"$lte_band\" \"Band\"\n        add_plain_info_entry \"UL Bandwidth\" \"$lte_ul_bandwidth\" \"UL Bandwidth\"\n        add_plain_info_entry \"DL Bandwidth\" \"$lte_dl_bandwidth\" \"DL Bandwidth\"\n        add_bar_info_entry \"RSRP\" \"$lte_rsrp\" \"Reference Signal Received Power\" -140 -44 dBm\n        add_bar_info_entry \"RSRQ\" \"$lte_rsrq\" \"Reference Signal Received Quality\" -19.5 -3 dB\n        add_bar_info_entry \"SINR\" \"$lte_sinr\" \"Signal to Interference plus Noise Ratio\" 0 30 dB\n        [ -n \"$lte_tx_power\" ] && add_plain_info_entry \"TX Power\" \"$lte_tx_power\" \"TX Power\"\n        ;;\n    \"WCDMA Mode\")\n        add_plain_info_entry \"MCC\" \"$wcdma_mcc\" \"Mobile Country Code\"\n        add_plain_info_entry \"MNC\" \"$wcdma_mnc\" \"Mobile Network Code\"\n        add_plain_info_entry \"LAC\" \"$wcdma_lac\" \"Location Area Code\"\n        add_plain_info_entry \"Cell ID\" \"$wcdma_cell_id\" \"Cell ID\"\n        add_plain_info_entry \"PSC\" \"$wcdma_psc\" \"Primary Scrambling Code\"\n        add_plain_info_entry \"Band\" \"$wcdma_band\" \"Band\"\n        [ -n \"$wcdma_rscp\" ] && add_bar_info_entry \"RSCP\" \"$wcdma_rscp\" \"Received Signal Code Power\" -120 -25 dBm\n        [ -n \"$wcdma_ecio\" ] && add_plain_info_entry \"Ec/Io\" \"$wcdma_ecio\" \"Ec/Io\"\n        ;;\n    esac\n}\n\nget_band()\n{\n    local network_type=\"$1\"\n    local band_num=\"$2\"\n    local band=\"0\"\n    \n    if [ -z \"$band_num\" ] || ! echo \"$band_num\" | grep -q '^[0-9]*$'; then\n        band=\"0\"\n    else\n        case $network_type in\n            \"WCDMA\"|\"LTE\"|\"NR\") band=\"$band_num\" ;;\n            *) band=\"0\" ;;\n        esac\n    fi\n    \n    echo \"$band\"\n}\n\nget_bandwidth()\n{\n    local network_type=\"$1\"\n    local bandwidth_num=\"$2\"\n    local bandwidth=\"0\"\n    \n    if [ -z \"$bandwidth_num\" ] || ! echo \"$bandwidth_num\" | grep -q '^[0-9]*$'; then\n        bandwidth=\"0\"\n    else\n        case $network_type in\n            \"LTE\") \n                if [ \"$bandwidth_num\" -gt 0 ]; then\n                    bandwidth=$((bandwidth_num / 5))\n                fi\n                ;;\n            \"NR\") bandwidth=\"$bandwidth_num\" ;;\n            *) bandwidth=\"0\" ;;\n        esac\n    fi\n    \n    echo \"$bandwidth\"\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/vendor/neoway.sh",
    "content": "#!/bin/sh\n# Copyright (C) 2025 sfwtw\n_Vendor=\"neoway\"\n_Author=\"sfwtw\"\n_Maintainer=\"sfwtw <unknown>\"\nsource /usr/share/qmodem/generic.sh\ndebug_subject=\"neoway_ctrl\"\n\nvendor_get_disabled_features(){\n    json_add_string \"\" \"NeighborCell\"\n    json_add_string \"\" \"DialMode\"\n}\n\nget_imei(){\n    at_command=\"AT+CGSN\"\n    imei=$(at $at_port $at_command | grep -o \"[0-9]\\{15\\}\")\n    json_add_string \"imei\" \"$imei\"\n}\n\nset_imei(){\n    local imei=\"$1\"\n    at_command=\"AT+SPIMEI=0,\\\"$imei\\\"\"\n    res=$(at $at_port $at_command)\n    json_select \"result\"\n    json_add_string \"set_imei\" \"$res\"\n    json_close_object\n    get_imei\n}\n\n#获取网络偏好\n# $1:AT串口\nget_network_prefer()\n{\n    at_command='AT$MYSYSINFO'\n    local response=$(at ${at_port} ${at_command} | grep '$MYSYSINFO:' | awk -F',' '{print $1}' | awk '{print $2}' | sed 's/\\r//g')\n\n    network_prefer_3g=\"0\";\n    network_prefer_4g=\"0\";\n    network_prefer_5g=\"0\";\n\n    case \"$response\" in\n        \"3\")\n            # 3G\n            network_prefer_3g=\"1\"\n            ;;\n        \"4\")\n            # 4G\n            network_prefer_4g=\"1\"\n            ;;\n        \"5\")\n            # 5G\n            network_prefer_5g=\"1\"\n            ;;\n        \"7\")\n            # 3G + 4G\n            network_prefer_3g=\"1\"\n            network_prefer_4g=\"1\"\n            ;;\n        \"9\")\n            # 5G\n            network_prefer_5g=\"1\"\n            ;;\n        \"11\")\n            # 3G + 5G\n            network_prefer_3g=\"1\"\n            network_prefer_5g=\"1\"\n            ;;\n        \"12\")\n            # 4G + 5G\n            network_prefer_4g=\"1\"\n            network_prefer_5g=\"1\"\n            ;;\n        \"14\")\n            # 3G + 4G + 5G\n            network_prefer_3g=\"1\"\n            network_prefer_4g=\"1\"\n            network_prefer_5g=\"1\"\n            ;;\n        \"*\")\n            # AUTO\n            network_prefer_3g=\"1\"\n            network_prefer_4g=\"1\"\n            network_prefer_5g=\"1\"\n            ;;\n    esac\n    json_add_object network_prefer\n    json_add_string 2G \"$network_prefer_2g\"\n    json_add_string 3G \"$network_prefer_3g\"\n    json_add_string 4G \"$network_prefer_4g\"\n    json_add_string 5G \"$network_prefer_5g\"\n    json_close_object\n}\n\n#设置网络偏好\n# $1:AT串口\n# $2:网络偏好配置\nset_network_prefer()\n{\n    network_prefer_3g=$(echo $1 |jq -r 'contains([\"3G\"])')\n    network_prefer_4g=$(echo $1 |jq -r 'contains([\"4G\"])')\n    network_prefer_5g=$(echo $1 |jq -r 'contains([\"5G\"])')\n    length=$(echo $1 |jq -r 'length')\n\n    local config_mode=\"1\"\n    \n    case \"$length\" in\n        \"1\")\n            if [ \"$network_prefer_3g\" = \"true\" ]; then\n                config_mode=\"3\" # 仅3G\n            elif [ \"$network_prefer_4g\" = \"true\" ]; then\n                config_mode=\"4\" # 仅4G\n            elif [ \"$network_prefer_5g\" = \"true\" ]; then\n                config_mode=\"9\" # 仅5G\n            fi\n        ;;\n        \"2\")\n            if [ \"$network_prefer_3g\" = \"true\" ] && [ \"$network_prefer_4g\" = \"true\" ]; then\n                config_mode=\"7\" # 3G + 4G\n            elif [ \"$network_prefer_3g\" = \"true\" ] && [ \"$network_prefer_5g\" = \"true\" ]; then\n                config_mode=\"11\" # 3G + 5G\n            elif [ \"$network_prefer_4g\" = \"true\" ] && [ \"$network_prefer_5g\" = \"true\" ]; then\n                config_mode=\"12\" # 4G + 5G\n            fi\n        ;;\n        \"3\") \n            config_mode=\"14\" # 3G + 4G + 5G\n        ;;\n        *) \n            config_mode=\"1\" # AUTO\n        ;;\n    esac\n\n    at_command='AT$MYSYSINFO='${config_mode}\n    res=$(at \"${at_port}\" \"${at_command}\")\n\n    json_select \"result\"\n    json_add_string \"set_network_prefer\" \"$res\"\n    json_close_object\n}\n\n#基本信息\nbase_info()\n{\n    m_debug  \"Neoway base info\"\n\n    #Name（名称）\n    at_command=\"AT+CGMM\"\n    name=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n    #Manufacturer（制造商）\n    at_command=\"AT+CGMI\"\n    manufacturer=$(at $at_port $at_command | grep \"+CGMI:\" | sed 's/+CGMI: //g' | sed 's/\\r//g')\n    #Revision（固件版本）\n    at_command=\"ATI\"\n    revision=$(at $at_port $at_command | sed -n '5p' | sed 's/\\r//g')\n    # at_command=\"AT+CGMR\"\n    # revision=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n    class=\"Base Information\"\n    add_plain_info_entry \"name\" \"$name\" \"Name\"\n    add_plain_info_entry \"manufacturer\" \"$manufacturer\" \"Manufacturer\"\n    add_plain_info_entry \"revision\" \"$revision\" \"Revision\"\n    add_plain_info_entry \"at_port\" \"$at_port\" \"AT Port\"\n    get_connect_status\n}\n\n#SIM卡信息\nsim_info()\n{\n    m_debug  \"Neoway sim info\"\n    \n    #SIM Slot（SIM卡卡槽）\n    at_command=\"AT+SIMCROSS?\"\n    sim_slot=$(at $at_port $at_command | grep \"+SIMCROSS:\" | awk -F'[ ,]' '{print $2}' | sed 's/\\r//g')\n    # m_debug \"SIM Slot: $sim_slot\"\n    #IMEI（国际移动设备识别码）\n    at_command=\"AT+CGSN\"\n\timei=$(at $at_port $at_command | sed -n '3p' | awk -F'\"' '{print $2}')\n\n    #SIM Status（SIM状态）\n    at_command=\"AT+CPIN?\"\n\tsim_status_flag=$(at $at_port $at_command | sed -n '3p')\n    sim_status=$(get_sim_status \"$sim_status_flag\")\n\n    [ \"$sim_status\" != \"ready\" ] && return\n\n    #ISP（互联网服务提供商）\n    at_command=\"AT+COPS?\"\n    isp=$(at $at_port $at_command | sed -n '2p' | awk -F'\"' '{print $2}')\n    # if [ \"$isp\" = \"CHN-CMCC\" ] || [ \"$isp\" = \"CMCC\" ]|| [ \"$isp\" = \"46000\" ]; then\n    #     isp=\"中国移动\"\n    # # elif [ \"$isp\" = \"CHN-UNICOM\" ] || [ \"$isp\" = \"UNICOM\" ] || [ \"$isp\" = \"46001\" ]; then\n    # elif [ \"$isp\" = \"CHN-UNICOM\" ] || [ \"$isp\" = \"CUCC\" ] || [ \"$isp\" = \"46001\" ]; then\n    #     isp=\"中国联通\"\n    # # elif [ \"$isp\" = \"CHN-CT\" ] || [ \"$isp\" = \"CT\" ] || [ \"$isp\" = \"46011\" ]; then\n    # elif [ \"$isp\" = \"CHN-TELECOM\" ] || [ \"$isp\" = \"CTCC\" ] || [ \"$isp\" = \"46011\" ]; then\n    #     isp=\"中国电信\"\n    # fi\n\n    #SIM Number（SIM卡号码，手机号）\n    at_command=\"AT+CNUM\"\n\tsim_number=$(at $at_port $at_command | sed -n '3p' | awk -F'\"' '{print $4}')\n\n    #IMSI（国际移动用户识别码）\n    at_command=\"AT+CIMI\"\n\timsi=$(at $at_port $at_command | sed -n '3p' | sed 's/\\r//g')\n\n    #ICCID（集成电路卡识别码）\n    iccid=$(at $at_port 'AT$MYCCID' | grep '$MYCCID:' | awk -F' \"' '{print $2}' | sed 's/\"//g')\n    [ -n \"$iccid\" ] || return\n    class=\"SIM Information\"\n    case \"$sim_status\" in\n        \"ready\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"ISP\" \"$isp\" \"Internet Service Provider\"\n            add_plain_info_entry \"SIM Slot\" \"$sim_slot\" \"SIM Slot\"\n            add_plain_info_entry \"SIM Number\" \"$sim_number\" \"SIM Number\"\n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n            add_plain_info_entry \"IMSI\" \"$imsi\" \"International Mobile Subscriber Identity\" \n            add_plain_info_entry \"ICCID\" \"$iccid\" \"Integrate Circuit Card Identity\" \n        ;;\n        \"miss\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n        ;;\n        \"unknown\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n        ;;\n        *)\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"SIM Slot\" \"$sim_slot\" \"SIM Slot\" \n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n            add_plain_info_entry \"IMSI\" \"$imsi\" \"International Mobile Subscriber Identity\" \n            add_plain_info_entry \"ICCID\" \"$iccid\" \"Integrate Circuit Card Identity\" \n        ;;\n    esac\n}\n\nrate_convert()\n{\n    #check if bc is installed\n    is_bc_installed=$(which bc)\n    local rate=$1\n    rate_units=\"Kbps Mbps Gbps Tbps\"\n    if [ -z \"$is_bc_installed\" ]; then\n        for i in $(seq 0 3); do\n            if [ $rate -lt 1024 ]; then\n                break\n            fi\n            rate=$(($rate / 1024))\n        done\n    else\n        for i in $(seq 0 3); do\n            if [ $(echo \"$rate < 1024\" | bc) -eq 1 ]; then\n                break\n            fi\n            rate=$(echo \"scale=2; $rate / 1024\" | bc)\n        done\n    fi\n    echo \"$rate `echo $rate_units | cut -d ' ' -f $(($i+1))`\"\n}\n\n#网络信息\nnetwork_info()\n{\n    m_debug  \"Neoway network info\"\n\n    #CSQ（信号强度）\n    at_command=\"AT+CSQ\"\n    response=$(at ${at_port} ${at_command} | grep \"+CSQ:\" | sed 's/+CSQ: //g' | sed 's/\\r//g')\n\n    #最大比特率，信道质量指示\n    at_command='AT+C5GQOSRDP'\n    response=$(at $at_port $at_command | grep \"+C5GQOSRDP:\")\n\n    if [ -n \"$response\" ]; then\n        # Parse 5G QoS parameters\n        # Format: +C5GQOSRDP: <cid>,<5QI>[,<DL_GFBR>,<UL_GFBR>[,<DL_MFBR>,<UL_MFBR>[,<DL_SAMBR>,<UL_SAMBR>[,<Averaging_window>]]]]] \n\n        # Extract DL_SAMBR (downlink session AMBR) and UL_SAMBR (uplink session AMBR) in kbit/s\n        ambr_dl=$(echo \"$response\" | awk -F',' '{print $7}' | sed 's/\\r//g')\n        ambr_ul=$(echo \"$response\" | awk -F',' '{print $8}' | sed 's/\\r//g')\n\n        # Convert kbit/s to Mbit/s for display if values exist\n        [ -n \"$ambr_dl\" ] && ambr_dl=$(rate_convert $ambr_dl)\n        [ -n \"$ambr_ul\" ] && ambr_ul=$(rate_convert $ambr_ul)\n    fi\n\n    class=\"Network Information\"\n    add_plain_info_entry \"AMBR UL\" \"$ambr_ul\" \"Access Maximum Bit Rate for Uplink\"\n    add_plain_info_entry \"AMBR DL\" \"$ambr_dl\" \"Access Maximum Bit Rate for Downlink\"\n}\n\nconvert_neoway_band_to_readable() {\n    local act=$1\n    local band_value=$2\n    case \"$act\" in\n        \"2\") echo \"WB$band_value\" ;; # UTRAN\n        \"3\") echo \"B$band_value\" ;; # E-UTRAN\n        \"6\") echo \"N$band_value\" ;; # NR\n        *) echo \"$band_value\" ;;\n    esac\n}\n\nconvert_readable_band_to_neoway() {\n    local band=$1\n\n    local prefix=${band:0:1}\n    local band_value\n    \n    case \"$prefix\" in\n        \"W\")\n            band_value=${band:2}\n            echo \"2 $band_value\"\n            ;;\n        \"B\")\n            band_value=${band:1}\n            echo \"3 $band_value\"\n            ;;\n        \"N\")\n            band_value=${band:1}\n            echo \"6 $band_value\"\n            ;;\n        *)\n            echo \"3 $band\"\n            ;;\n    esac\n}\n\nget_lockband() {\n    json_add_object \"lockband\"\n    \n    at_command=\"AT+NWSETBAND?\"\n    response=$(at $at_port $at_command)\n    \n    local band_num=$(echo \"$response\" | grep \"+NWSETBAND:\" | awk '{print $2}' | sed 's/\\r//g')\n    m_debug \"Band number: $band_num\"\n\n    json_add_object \"UMTS\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n    \n    json_add_object \"LTE\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n    \n    json_add_object \"NR\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n\n    at_command=\"AT+NWSETBAND=?\"\n    available_bands=$(at $at_port $at_command | grep \"+\" | awk -F',' '{for(i=2;i<=NF;i++) print $i}' | sed 's/\\r//g')\n    m_debug \"Available bands: $available_bands\"\n    for band in $available_bands; do\n        if [[ \"$band\" == WB* ]]; then\n            band_value=${band:2}\n            json_select \"UMTS\"\n            json_select \"available_band\"\n            add_avalible_band_entry \"$band_value\" \"$band\"\n            json_select ..\n            json_select ..\n        elif [[ \"$band\" == B* ]]; then\n            band_value=${band:1}\n            json_select \"LTE\"\n            json_select \"available_band\"\n            add_avalible_band_entry \"$band_value\" \"$band\"\n            json_select ..\n            json_select ..\n        elif [[ \"$band\" == N* ]]; then\n            band_value=${band:1}\n            json_select \"NR\"\n            json_select \"available_band\"\n            add_avalible_band_entry \"$band_value\" \"$band\"\n            json_select ..\n            json_select ..\n        fi\n    done\n\n    if [ \"$band_num\" != \"0\" ]; then\n        IFS=$'\\n'\n        for line in $(echo \"$response\" | grep -v \"+NWSETBAND:\" | grep -v \"OK\"); do\n            set -- $(echo $line | tr ',' ' ')\n            act=$1\n            num=$2\n            shift 2\n            for band_value in \"$@\"; do\n                if [[ \"$band\" == WB* ]]; then\n                    act=\"2\"\n                elif [[ \"$band\" == B* ]]; then\n                    act=\"3\"\n                elif [[ \"$band\" == N* ]]; then\n                    act=\"6\"\n                fi\n                band_value=$(echo \"$band_value\" | awk -F' ' '{print $3}' | sed 's/\\r//g')\n                m_debug \"Processing band: $band_value for act: $act\"\n                if [ -n \"$band_value\" ]; then\n                    case \"$act\" in\n                        \"2\")\n                            json_select \"UMTS\"\n                            json_select \"lock_band\"\n                            band_value=${band_value:2}\n                            json_add_string \"\" \"$band_value\"\n                            json_select ..\n                            json_select ..\n                            ;;\n                        \"3\")\n                            json_select \"LTE\"\n                            json_select \"lock_band\"\n                            band_value=${band_value:1}\n                            json_add_string \"\" \"$band_value\"\n                            json_select ..\n                            json_select ..\n                            ;;\n                        \"6\")\n                            json_select \"NR\"\n                            json_select \"lock_band\"\n                            band_value=${band_value:1}\n                            json_add_string \"\" \"$band_value\"\n                            json_select ..\n                            json_select ..\n                            ;;\n                    esac\n                fi\n            done\n        done\n        unset IFS\n    fi\n    \n    json_close_object\n}\n\nset_lockband() {\n    m_debug \"neoway set lockband info\"\n    config=$1\n\n    band_class=$(echo $config | jq -r '.band_class')\n    lock_band=$(echo $config | jq -r '.lock_band')\n\n    if [ -z \"$lock_band\" ] || [ \"$lock_band\" = \"null\" ]; then\n        at_command=\"AT+NWSETBAND=0\"\n        res=$(at $at_port $at_command)\n        json_select \"result\"\n        json_add_string \"set_lockband\" \"$res\"\n        json_close_object\n        return\n    fi\n\n    local act\n    case \"$band_class\" in\n        \"UMTS\") act=2 ;;\n        \"LTE\") act=3 ;;\n        \"NR\") act=6 ;;\n        *) act=3 ;; # 默认LTE\n    esac\n\n    IFS=','; set -- $lock_band\n    band_num=$#\n    at_command=\"AT+NWSETBAND=$act,$band_num\"\n    for band in \"$@\"; do\n        at_command=\"$at_command,$band\"\n    done\n    unset IFS\n\n    res=$(at $at_port $at_command)\n    \n    json_select \"result\"\n    json_add_string \"set_lockband\" \"$res\"\n    json_add_string \"config\" \"$config\"\n    json_add_string \"band_class\" \"$band_class\"\n    json_add_string \"lock_band\" \"$lock_band\"\n    json_close_object\n}\n\n#UL_bandwidth\n# $1:上行带宽数字\nget_bandwidth()\n{\n    local network_type=\"$1\"\n    local bandwidth_num=\"$2\"\n\n    local bandwidth\n    case $network_type in\n\t\t\"LTE\")\n            case $bandwidth_num in\n                \"0\") bandwidth=\"1.4\" ;;\n                \"1\") bandwidth=\"3\" ;;\n                \"2\"|\"3\"|\"4\"|\"5\") bandwidth=$((($bandwidth_num - 1) * 5)) ;;\n            esac\n        ;;\n        \"NR\")\n            case $bandwidth_num in\n                \"0\"|\"1\"|\"2\"|\"3\"|\"4\"|\"5\") bandwidth=$((($bandwidth_num + 1) * 5)) ;;\n                \"6\"|\"7\"|\"8\"|\"9\"|\"10\"|\"11\"|\"12\") bandwidth=$((($bandwidth_num - 2) * 10)) ;;\n                \"13\") bandwidth=\"200\" ;;\n                \"14\") bandwidth=\"400\" ;;\n            esac\n        ;;\n\tesac\n    echo \"$bandwidth\"\n}\n\n#获取NR子载波间隔\n# $1:NR子载波间隔数字\nget_scs()\n{\n    local scs\n\tcase $1 in\n\t\t\"0\") scs=\"15\" ;;\n\t\t\"1\") scs=\"30\" ;;\n        \"2\") scs=\"60\" ;;\n        \"3\") scs=\"120\" ;;\n        \"4\") scs=\"240\" ;;\n        *) scs=$(awk \"BEGIN{ print 2^$1 * 15 }\") ;;\n\tesac\n    echo \"$scs\"\n}\n\n#获取物理信道\n# $1:物理信道数字\nget_phych()\n{\n    local phych\n\tcase $1 in\n\t\t\"0\") phych=\"DPCH\" ;;\n        \"1\") phych=\"FDPCH\" ;;\n\tesac\n    echo \"$phych\"\n}\n\n#获取扩频因子\n# $1:扩频因子数字\nget_sf()\n{\n    local sf\n\tcase $1 in\n\t\t\"0\"|\"1\"|\"2\"|\"3\"|\"4\"|\"5\"|\"6\"|\"7\") sf=$(awk \"BEGIN{ print 2^$(($1+2)) }\") ;;\n        \"8\") sf=\"UNKNOWN\" ;;\n\tesac\n    echo \"$sf\"\n}\n\n#获取插槽格式\n# $1:插槽格式数字\nget_slot()\n{\n    local slot=$1\n\t# case $1 in\n\t\t# \"0\"|\"1\"|\"2\"|\"3\"|\"4\"|\"5\"|\"6\"|\"7\"|\"8\"|\"9\"|\"10\"|\"11\"|\"12\"|\"13\"|\"14\"|\"15\"|\"16\") slot=$1 ;;\n        # \"0\"|\"1\"|\"2\"|\"3\"|\"4\"|\"5\"|\"6\"|\"7\"|\"8\"|\"9\") slot=$1 ;;\n\t# esac\n    echo \"$slot\"\n}\n\n#小区信息\ncell_info()\n{\n    m_debug \"Neoway cell info\"\n\n    at_command='AT+NETDMSGEX'\n    response=$(at $at_port $at_command)\n    \n    if [ -n \"$(echo \"$response\" | grep \"+NETDMSGEX:\")\" ]; then\n\n        net_mode=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $1}' | sed 's/+NETDMSGEX: \"//g' | sed 's/\"//g')\n        network_mode=$(get_network_mode \"$net_mode\")\n\n        mcc_mnc=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $2}' | sed 's/\"//g')\n        mcc=$(echo \"$mcc_mnc\" | cut -d'+' -f1)\n        mnc=$(echo \"$mcc_mnc\" | cut -d'+' -f2)\n\n        band=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $3}' | sed 's/\"//g')\n\n        arfcn=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $4}' | sed 's/\\r//g')\n        \n        case \"$net_mode\" in\n            \"NR to 5GCN\"|\"NR to EPS\"|\"NR-LTE ENDC\"|\"NR-LTE NEDC\")\n\n                gnbid=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $5}' | sed 's/\\r//g')\n                pci=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $6}' | sed 's/\\r//g')\n                ss_rsrp=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $7}' | sed 's/\\r//g')\n                ss_rsrq=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $8}' | sed 's/\\r//g')\n                ss_sinr=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $9}' | sed 's/\\r//g')\n\n                [ -n \"$ss_rsrp\" ] && ss_rsrp_actual=$(printf \"%.1f\" $(echo \"$ss_rsrp / 10\" | bc -l 2>/dev/null))\n                \n                [ -n \"$ss_rsrq\" ] && ss_rsrq_actual=$(printf \"%.1f\" $(echo \"$ss_rsrq / 10\" | bc -l 2>/dev/null))\n                \n                [ -n \"$ss_sinr\" ] && ss_sinr_actual=$(printf \"%.1f\" $(echo \"$ss_sinr / 10\" | bc -l 2>/dev/null))\n\n                network_mode=\"NR5G-SA Mode\"\n                nr_mcc=\"$mcc\"\n                nr_mnc=\"$mnc\"\n                nr_cell_id=\"$gnbid\"\n                nr_physical_cell_id=\"$pci\"\n                nr_arfcn=\"$arfcn\"\n                nr_band=\"$band\"\n                nr_rsrp=\"$ss_rsrp_actual\"\n                nr_rsrq=\"$ss_rsrq_actual\"\n                nr_sinr=\"$ss_sinr_actual\"\n                ;;\n                \n            \"TDD LTE\"|\"FDD LTE\")\n\n                tac=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $5}')\n                cell_id=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $6}')\n                pci=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $7}')\n                rx_dbm=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $8}')\n                tx_dbm=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $9}')\n                rsrp=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $10}')\n                rsrq=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $11}')\n                sinr=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $12}')\n                rssi=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $13}')\n\n                if [ \"$(echo \"$response\" | grep -o ',' | wc -l)\" -ge 17 ]; then\n                    dl_bw_num=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $17}')\n                    ul_bw_num=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $18}' | sed 's/\\r//g')\n\n                    dl_bandwidth=$(get_bandwidth \"LTE\" \"$dl_bw_num\")\n                    ul_bandwidth=$(get_bandwidth \"LTE\" \"$ul_bw_num\")\n                fi\n\n                [ -n \"$rsrp\" ] && rsrp_actual=$(printf \"%.1f\" $(echo \"$rsrp / 10\" | bc -l 2>/dev/null))\n                \n                [ -n \"$rsrq\" ] && rsrq_actual=$(printf \"%.1f\" $(echo \"$rsrq / 10\" | bc -l 2>/dev/null))\n                \n                [ -n \"$sinr\" ] && sinr_actual=$(printf \"%.1f\" $(echo \"$sinr / 10\" | bc -l 2>/dev/null))\n                \n                [ -n \"$rssi\" ] && rssi_actual=$(printf \"%.1f\" $(echo \"$rssi / 10\" | bc -l 2>/dev/null))\n\n                network_mode=\"LTE Mode\"\n                lte_mcc=\"$mcc\"\n                lte_mnc=\"$mnc\"\n                lte_cell_id=\"$cell_id\"\n                lte_physical_cell_id=\"$pci\"\n                lte_earfcn=\"$arfcn\"\n                lte_freq_band_ind=\"$band\"\n                lte_tac=\"$tac\"\n                lte_rsrp=\"$rsrp_actual\"\n                lte_rsrq=\"$rsrq_actual\"\n                lte_sinr=\"$sinr_actual\"\n                lte_rssi=\"$rssi_actual\"\n                lte_cql=\"$cqi\"\n                lte_srxlev=\"$srxlev\"\n                lte_dl_bandwidth=\"$dl_bandwidth\"\n                lte_ul_bandwidth=\"$ul_bandwidth\"\n                lte_tx_power=\"$tx_dbm\"\n                lte_rx_power=\"$rx_dbm\"\n                ;;\n                \n            \"WCDMA\"|\"HSDPA\"|\"HSUPA\"|\"HSDPA and HSUPA\"|\"HSDPA+\"|\"HSDPA+ and HSUPA\")\n\n                lac=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $5}')\n                cell_id=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $6}')\n                psc=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $7}')\n                rac=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $8}')\n                rx_dbm=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $9}')\n                tx_dbm=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $10}')\n                rscp=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $11}')\n                ecio=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $12}')\n                rssi=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $13}')\n\n                if [ \"$(echo \"$response\" | grep -o ',' | wc -l)\" -ge 17 ]; then\n                    srxlev=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $14}')\n                    squal=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $15}')\n                    phych_num=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $16}')\n                    sf_num=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $17}')\n                    slot_num=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $18}')\n                    is_commod=$(echo \"$response\" | grep \"+NETDMSGEX:\" | awk -F',' '{print $19}' | sed 's/\\r//g')\n\n                    phych=$(get_phych \"$phych_num\")\n                    sf=$(get_sf \"$sf_num\")\n                    slot=$(get_slot \"$slot_num\")\n                fi\n\n                [ -n \"$rscp\" ] && rscp_actual=$(printf \"%.1f\" $(echo \"$rscp / 10\" | bc -l 2>/dev/null))\n                \n                [ -n \"$ecio\" ] && ecio_actual=$(printf \"%.1f\" $(echo \"$ecio / 10\" | bc -l 2>/dev/null))\n\n                network_mode=\"WCDMA Mode\"\n                wcdma_mcc=\"$mcc\"\n                wcdma_mnc=\"$mnc\"\n                wcdma_lac=\"$lac\"\n                wcdma_cell_id=\"$cell_id\"\n                wcdma_uarfcn=\"$arfcn\"\n                wcdma_psc=\"$psc\"\n                wcdma_rac=\"$rac\"\n                wcdma_band=\"$band\"\n                wcdma_rscp=\"$rscp_actual\"\n                wcdma_ecio=\"$ecio_actual\"\n                wcdma_phych=\"$phych\"\n                wcdma_sf=\"$sf\"\n                wcdma_slot=\"$slot\"\n                wcdma_com_mod=\"$is_commod\"\n                wcdma_rx_dbm=\"$rx_dbm\"\n                wcdma_tx_dbm=\"$tx_dbm\"\n                ;;\n                \n            *)\n                network_mode=\"Unknown Mode\"\n                ;;\n        esac\n\n        class=\"Cell Information\"\n        add_plain_info_entry \"network_mode\" \"$network_mode\" \"Network Mode\"\n        \n        case $network_mode in\n            \"NR5G-SA Mode\")\n                add_plain_info_entry \"MCC\" \"$mcc\" \"Mobile Country Code\"\n                add_plain_info_entry \"MNC\" \"$mnc\" \"Mobile Network Code\"\n                add_plain_info_entry \"Cell ID\" \"$nr_cell_id\" \"Cell ID\"\n                add_plain_info_entry \"Physical Cell ID\" \"$nr_physical_cell_id\" \"Physical Cell ID\"\n                add_plain_info_entry \"ARFCN\" \"$nr_arfcn\" \"Absolute Radio-Frequency Channel Number\"\n                add_plain_info_entry \"Band\" \"$nr_band\" \"Band\"\n                add_bar_info_entry \"RSRP\" \"$nr_rsrp\" \"Reference Signal Received Power\" -140 -44 dBm\n                add_bar_info_entry \"RSRQ\" \"$nr_rsrq\" \"Reference Signal Received Quality\" -19.5 -3 dB\n                add_bar_info_entry \"SINR\" \"$nr_sinr\" \"Signal to Interference plus Noise Ratio\" 0 30 dB\n                ;;\n            \"LTE Mode\")\n                add_plain_info_entry \"MCC\" \"$lte_mcc\" \"Mobile Country Code\"\n                add_plain_info_entry \"MNC\" \"$lte_mnc\" \"Mobile Network Code\"\n                add_plain_info_entry \"Cell ID\" \"$lte_cell_id\" \"Cell ID\"\n                add_plain_info_entry \"Physical Cell ID\" \"$lte_physical_cell_id\" \"Physical Cell ID\"\n                add_plain_info_entry \"EARFCN\" \"$lte_earfcn\" \"E-UTRA Absolute Radio Frequency Channel Number\"\n                add_plain_info_entry \"Band\" \"$lte_freq_band_ind\" \"Band\"\n                add_plain_info_entry \"TAC\" \"$lte_tac\" \"Tracking Area Code\"\n                add_plain_info_entry \"RX Power\" \"$lte_rx_power\" \"RX Power (dBm)\"\n                add_plain_info_entry \"TX Power\" \"$lte_tx_power\" \"TX Power (dBm)\"\n                add_bar_info_entry \"RSRP\" \"$lte_rsrp\" \"Reference Signal Received Power\" -140 -44 dBm\n                add_bar_info_entry \"RSRQ\" \"$lte_rsrq\" \"Reference Signal Received Quality\" -19.5 -3 dB\n                add_bar_info_entry \"SINR\" \"$lte_sinr\" \"Signal to Interference plus Noise Ratio\" 0 30 dB\n                add_bar_info_entry \"RSSI\" \"$lte_rssi\" \"Received Signal Strength Indicator\" -120 -20 dBm\n                \n                if [ -n \"$lte_cql\" ]; then\n                    add_plain_info_entry \"CQI\" \"$lte_cql\" \"Channel Quality Indicator\"\n                    add_plain_info_entry \"DL Bandwidth\" \"$lte_dl_bandwidth\" \"DL Bandwidth\"\n                    add_plain_info_entry \"UL Bandwidth\" \"$lte_ul_bandwidth\" \"UL Bandwidth\"\n                    add_plain_info_entry \"Srxlev\" \"$lte_srxlev\" \"Serving Cell Receive Level\"\n                fi\n                ;;\n                \n            \"WCDMA Mode\")\n                add_plain_info_entry \"MCC\" \"$wcdma_mcc\" \"Mobile Country Code\"\n                add_plain_info_entry \"MNC\" \"$wcdma_mnc\" \"Mobile Network Code\"\n                add_plain_info_entry \"LAC\" \"$wcdma_lac\" \"Location Area Code\"\n                add_plain_info_entry \"Cell ID\" \"$wcdma_cell_id\" \"Cell ID\"\n                add_plain_info_entry \"UARFCN\" \"$wcdma_uarfcn\" \"UTRA Absolute Radio Frequency Channel Number\"\n                add_plain_info_entry \"PSC\" \"$wcdma_psc\" \"Primary Scrambling Code\"\n                add_plain_info_entry \"RAC\" \"$wcdma_rac\" \"Routing Area Code\"\n                add_plain_info_entry \"Band\" \"$wcdma_band\" \"Band\"\n                add_plain_info_entry \"RX Power\" \"$wcdma_rx_dbm\" \"RX Power (dBm)\"\n                add_plain_info_entry \"TX Power\" \"$wcdma_tx_dbm\" \"TX Power (dBm)\"\n                add_bar_info_entry \"RSCP\" \"$wcdma_rscp\" \"Received Signal Code Power\" -120 -25 dBm\n                add_plain_info_entry \"Ec/Io\" \"$wcdma_ecio\" \"Ec/Io\"\n                \n                if [ -n \"$wcdma_phych\" ]; then\n                    add_plain_info_entry \"Physical Channel\" \"$wcdma_phych\" \"Physical Channel\"\n                    add_plain_info_entry \"Spreading Factor\" \"$wcdma_sf\" \"Spreading Factor\"\n                    add_plain_info_entry \"Slot\" \"$wcdma_slot\" \"Slot\"\n                    add_plain_info_entry \"Compression Mode\" \"$wcdma_com_mod\" \"Compression Mode\"\n                fi\n                ;;\n                \n            *)\n                add_plain_info_entry \"Network Type\" \"$net_mode\" \"Network Type\"\n                add_plain_info_entry \"MCC\" \"$mcc\" \"Mobile Country Code\"\n                add_plain_info_entry \"MNC\" \"$mnc\" \"Mobile Network Code\"\n                add_plain_info_entry \"ARFCN\" \"$arfcn\" \"Absolute Radio-Frequency Channel Number\"\n                add_plain_info_entry \"Band\" \"$band\" \"Band\"\n                ;;\n        esac\n    fi\n}\n\nget_network_mode()\n{\n    local mode=\"$1\"\n    case \"$mode\" in\n        \"NR to 5GCN\"|\"NR-LTE ENDC\"|\"NR-LTE NEDC\") echo \"NR5G-SA Mode\" ;;\n        \"NR to EPS\") echo \"NR5G-SA Mode\" ;;\n        \"TDD LTE\"|\"FDD LTE\") echo \"LTE Mode\" ;;\n        \"WCDMA\"|\"HSDPA\"|\"HSUPA\"|\"HSDPA and HSUPA\"|\"HSDPA+\"|\"HSDPA+ and HSUPA\") echo \"WCDMA Mode\" ;;\n        \"GSM\"|\"GPRS\"|\"EDGE\") echo \"GSM Mode\" ;;\n        *) echo \"$mode Mode\" ;;\n    esac\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/vendor/quectel.sh",
    "content": "#!/bin/sh\n# Copyright (C) 2023 Siriling <siriling@qq.com>\n# Copyright (C) 2025 Fujr <fjrcn@outlook.com>\n_Vendor=\"quectel\"\n_Author=\"Siriling,Fujr\"\n_Maintainer=\"Fujr <fjrcn@outlook.com>\"\nsource /usr/share/qmodem/generic.sh\ndebug_subject=\"quectel_ctrl\"\n#return raw data\nget_imei(){\n    at_command=\"AT+CGSN\"\n    imei=$(at $at_port $at_command | grep -o \"[0-9]\\{15\\}\")\n    json_add_string \"imei\" \"$imei\"\n}\n\n#return raw data\nset_imei(){\n    local imei=\"$1\"\n    at_command=\"AT+EGMR=1,7,\\\"$imei\\\"\"\n    res=$(at $at_port $at_command)\n    json_select \"result\"\n    json_add_string \"set_imei\" \"$res\"\n    json_close_object\n    get_imei\n}\n\n#获取拨号模式\n# $1:AT串口\n# $2:平台\nget_mode()\n{\n    at_command='AT+QCFG=\"usbnet\"'\n    local mode_num=$(at ${at_port} ${at_command} | grep \"+QCFG:\" | sed 's/+QCFG: \"usbnet\",//g' | sed 's/\\r//g')\n    local mode\n    case \"$platform\" in\n        \"qualcomm\")\n            case \"$mode_num\" in\n                \"0\") mode=\"qmi\" ;;\n                # \"0\") mode=\"gobinet\" ;;\n                \"1\") mode=\"ecm\" ;;\n                \"2\") mode=\"mbim\" ;;\n                \"3\") mode=\"rndis\" ;;\n                \"5\") mode=\"ncm\" ;;\n                *) mode=\"${mode_num}\" ;;\n            esac\n        ;;\n        \"unisoc\")\n            case \"$mode_num\" in\n                \"1\") mode=\"ecm\" ;;\n                \"2\") mode=\"mbim\" ;;\n                \"3\") mode=\"rndis\" ;;\n                \"5\") mode=\"ncm\" ;;\n                *) mode=\"${mode_num}\" ;;\n            esac\n        ;;\n        \"hisilicon\")\n            case \"$mode_num\" in\n                \"1\") mode=\"ecm\" ;;\n                \"3\") mode=\"rndis\" ;;\n                \"4\") mode=\"ncm\" ;;\n                \"5\") mode=\"ncm\" ;;\n                *) mode=\"ncm\" ;;\n            esac\n        ;;\n        \"lte12\"|\\\n        \"lte\")\n            case \"$mode_num\" in\n                \"0\") mode=\"qmi\" ;;\n                # \"0\") mode=\"gobinet\" ;;\n                \"1\") mode=\"ecm\" ;;\n                \"2\") mode=\"mbim\" ;;\n                \"3\") mode=\"rndis\" ;;\n                \"5\") mode=\"ncm\" ;;\n                *) mode=\"${mode_num}\" ;;\n            esac\n        ;;\n        *)\n            mode=\"${mode_num}\"\n        ;;\n    esac\n    available_modes=$(uci -q get qmodem.$config_section.modes)\n    json_add_object \"mode\"\n    for available_mode in $available_modes; do\n        if [ \"$mode\" = \"$available_mode\" ]; then\n            json_add_string \"$available_mode\" \"1\"\n        else\n            json_add_string \"$available_mode\" \"0\"\n        fi\n    done\n    json_close_object\n}\n\n#设置拨号模式\nset_mode()\n{\n    #获取拨号模式配置\n    local mode=$1\n    case \"$platform\" in\n        \"qualcomm\")\n            case \"$mode\" in\n                \"qmi\") mode_num=\"0\" ;;\n                # \"gobinet\")  mode_num=\"0\" ;;\n                \"ecm\") mode_num=\"1\" ;;\n                \"mbim\") mode_num=\"2\" ;;\n                \"rndis\") mode_num=\"3\" ;;\n                \"ncm\") mode_num=\"5\" ;;\n                *) mode_num=\"0\" ;;\n            esac\n        ;;\n        \"unisoc\")\n            case \"$mode\" in\n                \"ecm\") mode_num=\"1\" ;;\n                \"mbim\") mode_num=\"2\" ;;\n                \"rndis\") mode_num=\"3\" ;;\n                \"ncm\") mode_num=\"5\" ;;\n                *) mode_num=\"0\" ;;\n            esac\n        ;;\n        \"lte12\"|\\\n        \"lte\")\n            case \"$mode\" in\n                \"qmi\") mode_num=\"0\" ;;\n                # \"gobinet\")  mode_num=\"0\" ;;\n                \"ecm\") mode_num=\"1\" ;;\n                \"mbim\") mode_num=\"2\" ;;\n                \"rndis\") mode_num=\"3\" ;;\n                \"ncm\") mode_num=\"5\" ;;\n                *) mode_num=\"0\" ;;\n            esac\n        ;;\n        *)\n            mode_num=\"0\"\n        ;;\n\n    esac\n\n    #设置模组\n    at_command='AT+QCFG=\"usbnet\",'${mode_num}\n    res=$(at \"${at_port}\" \"${at_command}\")\n    json_select \"result\"\n    json_add_string \"set_mode\" \"$res\"\n    json_close_object\n}\n\n#获取网络偏好\n# $1:AT串口\nget_network_prefer()\n{\n    case \"$platform\" in\n        \"lte12\"|\\\n        \"qualcomm\")\n            get_network_prefer_nr\n        ;;\n        \"unisoc\")\n            get_network_prefer_nr\n        ;;\n        \"hisilicon\")\n            get_network_prefer_nr\n        ;;\n        \"lte\")\n            get_network_prefer_lte\n        ;;\n        *)\n            get_network_prefer_nr\n        ;;\n    esac\n    json_add_object network_prefer\n    json_add_string 3G $network_prefer_3g\n    json_add_string 4G $network_prefer_4g\n    case $platform in\n        \"qualcomm\")\n            json_add_string 5G $network_prefer_5g\n        ;;\n        \"unisoc\")\n            json_add_string 5G $network_prefer_5g\n        ;;\n        \"hisilicon\")\n            json_add_string 5G $network_prefer_5g\n        ;;\n    esac\n    json_close_array\n    \n}\n\nget_network_prefer_lte()\n{\n    at_command='AT+QCFG=\"nwscanmode\"'\n    response=$(at ${at_port} ${at_command} | grep \"+QCFG:\" | awk -F'\",' '{print $2}' | sed 's/\\r//g' |grep -o \"[0-9]\")\n    network_prefer_3g=\"0\";\n    network_prefer_4g=\"0\";\n    case \"$response\" in\n        \"0\") network_prefer_3g=\"1\"; network_prefer_4g=\"1\" ;;\n        \"3\") network_prefer_4g=\"1\" ;;\n    esac\n}\n\nget_network_prefer_nr()\n{\n    at_command='AT+QNWPREFCFG=\"mode_pref\"'\n    local response=$(at ${at_port} ${at_command} | grep \"+QNWPREFCFG:\" | awk -F',' '{print $2}' | sed 's/\\r//g')\n    \n    network_prefer_3g=\"0\";\n    network_prefer_4g=\"0\";\n    network_prefer_5g=\"0\";\n\n    #匹配不同的网络类型\n    local auto=$(echo \"${response}\" | grep \"AUTO\")\n    if [ -n \"$auto\" ]; then\n        network_prefer_3g=\"1\"\n        network_prefer_4g=\"1\"\n        network_prefer_5g=\"1\"\n    else\n        local wcdma=$(echo \"${response}\" | grep \"WCDMA\")\n        local lte=$(echo \"${response}\" | grep \"LTE\")\n        local nr=$(echo \"${response}\" | grep \"NR5G\")\n        if [ -n \"$wcdma\" ]; then\n            network_prefer_3g=\"1\"\n        fi\n        if [ -n \"$lte\" ]; then\n            network_prefer_4g=\"1\"\n        fi\n        if [ -n \"$nr\" ]; then\n            network_prefer_5g=\"1\"\n        fi\n    fi\n}\n\n#设置网络偏好\n# $1:AT串口\n# $2:网络偏好配置\nset_network_prefer()\n{\n    network_prefer_3g=$(echo $1 |jq -r 'contains([\"3G\"])')\n    network_prefer_4g=$(echo $1 |jq -r 'contains([\"4G\"])')\n    network_prefer_5g=$(echo $1 |jq -r 'contains([\"5G\"])')\n    length=$(echo $1 |jq -r 'length')\n\n    case \"$platform\" in\n        \"lte12\"|\\\n        \"qualcomm\")\n            set_network_prefer_nr $at_port $network_prefer\n        ;;\n        \"unisoc\")\n            set_network_prefer_nr $at_port $network_prefer\n        ;;\n        \"lte\")\n            set_network_prefer_lte $at_port $network_prefer\n        ;;\n        *)\n            set_network_prefer_nr $at_port $network_prefer\n        ;;\n    esac\n}\n\nset_network_prefer_lte()\n{\n    case \"$length\" in\n        \"1\")\n            if [ \"$network_prefer_3g\" = \"true\" ]; then\n                network_prefer_config=\"0\"\n            elif [ \"$network_prefer_4g\" = \"true\" ]; then\n                network_prefer_config=\"3\"\n            fi\n        ;;\n        \"2\")\n            network_prefer_config=\"0\"\n    esac\n\n    #设置模组\n    at_command='AT+QCFG=\"nwscanmode\",'${network_prefer_config}\n    at \"${at_port}\" \"${at_command}\"\n\n}\n\n\nset_network_prefer_nr()\n{\n    case \"$length\" in\n        \"1\")\n            if [ \"$network_prefer_3g\" = \"true\" ]; then\n                network_prefer_config=\"WCDMA\"\n            elif [ \"$network_prefer_4g\" = \"true\" ]; then\n                network_prefer_config=\"LTE\"\n            elif [ \"$network_prefer_5g\" = \"true\" ]; then\n                network_prefer_config=\"NR5G\"\n            fi\n        ;;\n        \"2\")\n            if [ \"$network_prefer_3g\" = \"true\" ] && [ \"$network_prefer_4g\" = \"true\" ]; then\n                network_prefer_config=\"WCDMA:LTE\"\n            elif [ \"$network_prefer_3g\" = \"true\" ] && [ \"$network_prefer_5g\" = \"true\" ]; then\n                network_prefer_config=\"WCDMA:NR5G\"\n            elif [ \"$network_prefer_4g\" = \"true\" ] && [ \"$network_prefer_5g\" = \"true\" ]; then\n                network_prefer_config=\"LTE:NR5G\"\n            fi\n        ;;\n        \"3\") network_prefer_config=\"AUTO\" ;;\n        *) network_prefer_config=\"AUTO\" ;;\n    esac\n\n    #设置模组\n    at_command='AT+QNWPREFCFG=\"mode_pref\",'${network_prefer_config}\n    at \"${at_port}\" \"${at_command}\"\n}\n\n#获取电压\n# $1:AT串口\nget_voltage()\n{\n    at_command=\"AT+CBC\"\n\tlocal voltage=$(at ${at_port} ${at_command} | grep \"+CBC:\" | awk -F',' '{print $3}' | sed 's/\\r//g')\n    [ -n \"$voltage\" ] && {\n        add_plain_info_entry \"voltage\" \"$voltage mV\" \"Voltage\" \n    }\n}\n\n#获取温度\n#return raw data\nget_temperature()\n{   \n    #Temperature（温度）\n    at_command=\"AT+QTEMP\"\n    local temp\n    local line=1\n    QTEMP=$(at ${at_port} ${at_command} | grep \"+QTEMP:\")\n    for line in $( echo -e \"$QTEMP\" ); do\n        templine=$(echo $line | grep -o \"[0-9]\\{1,3\\}\")\n        for tmp in $(echo $templine); do\n            [ \"$tmp\" -gt 10 ] && [ \"$tmp\" -lt 110 ] && temp=$tmp\n            if [ -n \"$temp\" ]; then\n                break\n            fi\n        done\n    done\n\tif [ -n \"$temp\" ]; then\n\t\ttemp=\"${temp}$(printf \"\\xc2\\xb0\")C\"\n\tfi\n    add_plain_info_entry \"temperature\" \"$temp\" \"Temperature\"\n}\n\n\n\n#基本信息\nbase_info()\n{\n    m_debug  \"Quectel base info\"\n\n    #Name（名称）\n    at_command=\"AT+CGMM\"\n    name=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n    #Manufacturer（制造商）\n    at_command=\"AT+CGMI\"\n    manufacturer=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n    #Revision（固件版本）\n    at_command=\"ATI\"\n    revision=$(at $at_port $at_command | grep \"Revision:\" | sed 's/Revision: //g' | sed 's/\\r//g')\n    # at_command=\"AT+CGMR\"\n    # revision=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n    class=\"Base Information\"\n    add_plain_info_entry \"name\" \"$name\" \"Name\"\n    add_plain_info_entry \"manufacturer\" \"$manufacturer\" \"Manufacturer\"\n    add_plain_info_entry \"revision\" \"$revision\" \"Revision\"\n    add_plain_info_entry \"at_port\" \"$at_port\" \"AT Port\"\n    get_temperature\n    get_voltage\n    get_connect_status\n}\n\n\n#SIM卡信息\nsim_info()\n{\n    m_debug  \"Quectel sim info\"\n    \n    #SIM Slot（SIM卡卡槽）\n    at_command=\"AT+QUIMSLOT?\"\n\tsim_slot=$(at $at_port $at_command | grep \"+QUIMSLOT:\" | awk -F' ' '{print $2}' | sed 's/\\r//g')\n\n    #IMEI（国际移动设备识别码）\n    at_command=\"AT+CGSN\"\n\timei=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n\n    #SIM Status（SIM状态）\n    at_command=\"AT+CPIN?\"\n\tsim_status_flag=$(at $at_port $at_command | sed -n '2p')\n    sim_status=$(get_sim_status \"$sim_status_flag\")\n\n    if [ \"$sim_status\" != \"ready\" ]; then\n        return\n    fi\n\n    #ISP（互联网服务提供商）\n    at $at_port \"AT+COPS=3,2\" > /dev/null 2>&1\n    at_command=\"AT+COPS?\"\n    isp=$(at $at_port $at_command | sed -n '2p' | awk -F'\"' '{print $2}')\n    # if [ \"$isp\" = \"CHN-CMCC\" ] || [ \"$isp\" = \"CMCC\" ]|| [ \"$isp\" = \"46000\" ]; then\n    #     isp=\"中国移动\"\n    # # elif [ \"$isp\" = \"CHN-UNICOM\" ] || [ \"$isp\" = \"UNICOM\" ] || [ \"$isp\" = \"46001\" ]; then\n    # elif [ \"$isp\" = \"CHN-UNICOM\" ] || [ \"$isp\" = \"CUCC\" ] || [ \"$isp\" = \"46001\" ]; then\n    #     isp=\"中国联通\"\n    # # elif [ \"$isp\" = \"CHN-CT\" ] || [ \"$isp\" = \"CT\" ] || [ \"$isp\" = \"46011\" ]; then\n    # elif [ \"$isp\" = \"CHN-TELECOM\" ] || [ \"$isp\" = \"CTCC\" ] || [ \"$isp\" = \"46011\" ]; then\n    #     isp=\"中国电信\"\n    # fi\n\n    #SIM Number（SIM卡号码，手机号）\n    at_command=\"AT+CNUM\"\n\tsim_number=$(at $at_port $at_command | sed -n '2p' | awk -F'\"' '{print $4}')\n\n    #IMSI（国际移动用户识别码）\n    at_command=\"AT+CIMI\"\n\timsi=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n\n    #ICCID（集成电路卡识别码）\n    at_command=\"AT+ICCID\"\n\ticcid=$(at $at_port $at_command | grep -o \"+ICCID:[ ]*[-0-9A-F]\\+\" | cut -d \" \" -f 2 )\n    class=\"SIM Information\"\n    case \"$sim_status\" in\n        \"ready\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"ISP\" \"$isp\" \"Internet Service Provider\"\n            add_plain_info_entry \"SIM Slot\" \"$sim_slot\" \"SIM Slot\"\n            add_plain_info_entry \"SIM Number\" \"$sim_number\" \"SIM Number\"\n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n            add_plain_info_entry \"IMSI\" \"$imsi\" \"International Mobile Subscriber Identity\" \n            add_plain_info_entry \"ICCID\" \"$iccid\" \"Integrate Circuit Card Identity\" \n        ;;\n        \"miss\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n        ;;\n        \"unknown\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n        ;;\n        *)\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"SIM Slot\" \"$sim_slot\" \"SIM Slot\" \n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n            add_plain_info_entry \"IMSI\" \"$imsi\" \"International Mobile Subscriber Identity\" \n            add_plain_info_entry \"ICCID\" \"$iccid\" \"Integrate Circuit Card Identity\" \n        ;;\n    esac\n}\n\n#网络信息\nnetwork_info()\n{\n    m_debug  \"Quectel network info\"\n\n    #Connect Status（连接状态）\n\n    #Network Type（网络类型）\n    at_command=\"AT+QNWINFO\"\n    network_type=$(at ${at_port} ${at_command} | grep \"+QNWINFO:\" | awk -F'\"' '{print $2}')\n\n    [ -z \"$network_type\" ] && {\n        at_command='AT+COPS?'\n        local rat_num=$(at ${at_port} ${at_command} | grep \"+COPS:\" | awk -F',' '{print $4}' | sed 's/\\r//g')\n        network_type=$(get_rat ${rat_num})\n    }\n\n    #CSQ（信号强度）\n    at_command=\"AT+CSQ\"\n    response=$(at ${at_port} ${at_command} | grep \"+CSQ:\" | sed 's/+CSQ: //g' | sed 's/\\r//g')\n\n    #RSSI（信号强度指示）\n    # rssi_num=$(echo $response | awk -F',' '{print $1}')\n    # rssi=$(get_rssi $rssi_num)\n    #Ber（信道误码率）\n    # ber=$(echo $response | awk -F',' '{print $2}')\n\n    #PER（信号强度）\n    # if [ -n \"$csq\" ]; then\n    #     per=$((csq * 100/31))\"%\"\n    # fi\n\n    #最大比特率，信道质量指示\n    at_command='AT+QNWCFG=\"nr5g_ambr\"'\n    response=$(at $at_port $at_command | grep \"+QNWCFG:\")\n    for context in $response; do\n        local apn=$(echo \"$context\" | awk -F'\"' '{print $4}' | tr 'a-z' 'A-Z')\n        if [ -n \"$apn\" ] && [ \"$apn\" != \"IMS\" ]; then\n            #CQL UL（上行信道质量指示）\n            cqi_ul=$(echo \"$context\" | awk -F',' '{print $5}')\n            #CQI DL（下行信道质量指示）\n            cqi_dl=$(echo \"$context\" | awk -F',' '{print $3}')\n            #AMBR UL（上行签约速率，单位，Mbps）\n            ambr_ul=$(echo \"$context\" | awk -F',' '{print $6}' | sed 's/\\r//g')\n            #AMBR DL（下行签约速率，单位，Mbps）\n            ambr_dl=$(echo \"$context\" | awk -F',' '{print $4}')\n            break\n        fi\n    done\n\n    #速率统计\n    at_command='AT+QNWCFG=\"up/down\"'\n    response=$(at $at_port $at_command | grep \"+QNWCFG:\" | sed 's/+QNWCFG: \"up\\/down\",//g' | sed 's/\\r//g')\n\n    #当前上传速率（单位，Byte/s）\n    tx_rate=$(echo $response | awk -F',' '{print $1}')\n\n    #当前下载速率（单位，Byte/s）\n    rx_rate=$(echo $response | awk -F',' '{print $2}')\n    class=\"Network Information\"\n    add_plain_info_entry \"Network Type\" \"$network_type\" \"Network Type\"\n    add_plain_info_entry \"CQI UL\" \"$cqi_ul\" \"Channel Quality Indicator for Uplink\"\n    add_plain_info_entry \"CQI DL\" \"$cqi_dl\" \"Channel Quality Indicator for Downlink\"\n    add_plain_info_entry \"AMBR UL\" \"$ambr_ul\" \"Access Maximum Bit Rate for Uplink\"\n    add_plain_info_entry \"AMBR DL\" \"$ambr_dl\" \"Access Maximum Bit Rate for Downlink\"\n    add_speed_entry rx $rx_rate\n    add_speed_entry tx $tx_rate\n}\n\n#获取频段\n# $1:网络类型\n# $2:频段数字\nget_band()\n{\n    local band\n    case $1 in\n        \"WCDMA\") band=\"$2\" ;;\n        \"LTE\") band=\"$2\" ;;\n        \"NR\") band=\"$2\" ;;\n\tesac\n    echo \"$band\"\n}\n\nget_lockband_nr()\n{\n    local at_port=\"$1\"\n    m_debug  \"Quectel sdx55 get lockband info\"\n    get_wcdma_config_command='AT+QNWPREFCFG=\"gw_band\"'\n    get_lte_config_command='AT+QNWPREFCFG=\"lte_band\"'\n    get_nsa_nr_config_command='AT+QNWPREFCFG=\"nsa_nr5g_band\"'\n    get_sa_nr_config_command='AT+QNWPREFCFG=\"nr5g_band\"'\n    wcdma_avalible_band=\"1,2,3,4,5,6,7,8,9,19\"\n    lte_avalible_band=\"1,2,3,4,5,7,8,12,13,14,17,18,19,20,25,26,28,29,30,32,34,38,39,40,41,42,66,71\"\n    nsa_nr_avalible_band=\"1,2,3,5,7,8,12,20,25,28,38,40,41,48,66,71,77,78,79,257,258,260,261\"\n    sa_nr_avalible_band=\"1,2,3,5,7,8,12,20,25,28,38,40,41,48,66,71,77,78,79\"\n    [ -n $(uci -q get qmodem.$config_section.sa_band) ] && sa_nr_avalible_band=$(uci -q get qmodem.$config_section.sa_band | tr '/' ',')\n    [ -n $(uci -q get qmodem.$config_section.nsa_band) ] && nsa_nr_avalible_band=$(uci -q get qmodem.$config_section.nsa_band | tr '/' ',')\n    [ -n $(uci -q get qmodem.$config_section.lte_band) ] && lte_avalible_band=$(uci -q get qmodem.$config_section.lte_band | tr '/' ',')\n    [ -n $(uci -q get qmodem.$config_section.wcdma_band) ] && wcdma_avalible_band=$(uci -q get qmodem.$config_section.wcdma_band | tr '/' ',')\n    gw_band=$(at $at_port  $get_wcdma_config_command |grep -e \"+QNWPREFCFG: \" )\n    lte_band=$(at $at_port $get_lte_config_command|grep -e \"+QNWPREFCFG: \")\n    nsa_nr_band=$(at $at_port $get_nsa_nr_config_command|grep -e \"+QNWPREFCFG: \")\n    sa_nr_band=$(at $at_port  $get_sa_nr_config_command|grep -e \"+QNWPREFCFG: \")\n    json_add_object \"UMTS\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_object\n    json_close_object\n    json_add_object \"LTE\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n\n    json_add_object \"NR\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n    json_add_object \"NR_NSA\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n    for i in $(echo \"$wcdma_avalible_band\" | awk -F\",\" '{for(j=1; j<=NF; j++) print $j}'); do\n        json_select \"UMTS\"\n        json_select \"available_band\"\n        add_avalible_band_entry  \"$i\" \"UMTS_$i\"\n        json_select ..\n        json_select ..\n    done\n    for i in $(echo \"$lte_avalible_band\" | awk -F\",\" '{for(j=1; j<=NF; j++) print $j}'); do\n        json_select \"LTE\"\n        json_select \"available_band\"\n        add_avalible_band_entry  \"$i\" \"LTE_B$i\"\n        json_select ..\n        json_select ..\n    done\n    for i in $(echo \"$nsa_nr_avalible_band\" | awk -F\",\" '{for(j=1; j<=NF; j++) print $j}'); do\n        json_select \"NR_NSA\"\n        json_select \"available_band\"\n        add_avalible_band_entry  \"$i\" \"NSA_NR_N$i\"\n        json_select ..\n        json_select ..\n    done\n    for i in $(echo \"$sa_nr_avalible_band\" | awk -F\",\" '{for(j=1; j<=NF; j++) print $j}'); do\n        json_select \"NR\"\n        json_select \"available_band\"\n        add_avalible_band_entry  \"$i\" \"SA_NR_N$i\"\n        json_select ..\n        json_select ..\n    done\n    #+QNWPREFCFG: \"nr5g_band\",1:3:7:20:28:40:41:71:77:78:79\n    for i in $(echo \"$gw_band\" | cut -d, -f2 |tr -d '\\r' | awk -F\":\" '{for(j=1; j<=NF; j++) print $j}'); do\n        if [ -n \"$i\" ]; then\n            json_select \"UMTS\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select ..\n            json_select ..\n        fi\n    done\n    for i in $(echo \"$lte_band\" | cut -d, -f2|tr -d '\\r' | awk -F\":\" '{for(j=1; j<=NF; j++) print $j}'); do\n        if [ -n \"$i\" ]; then\n            json_select \"LTE\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select ..\n            json_select ..\n        fi\n    done\n    for i in $(echo \"$nsa_nr_band\" | cut -d, -f2|tr -d '\\r' | awk -F\":\" '{for(j=1; j<=NF; j++) print $j}'); do\n        if [ -n \"$i\" ]; then\n            json_select \"NR_NSA\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select ..\n            json_select ..\n        fi\n    done\n    for i in $(echo \"$sa_nr_band\" | cut -d, -f2|tr -d '\\r' | awk -F\":\" '{for(j=1; j<=NF; j++) print $j}'); do\n        if [ -n \"$i\" ]; then\n            json_select \"NR\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select ..\n            json_select ..\n        fi\n    done\n    json_close_array\n}\n\nget_lockband_lte12()\n{\n    m_debug  \"Quectel sdx55 get lockband info\"\n    get_wcdma_config_command='AT+QNWPREFCFG=\"gw_band\"'\n    get_lte_config_command='AT+QNWPREFCFG=\"lte_band\"'\n    get_nsa_nr_config_command='AT+QNWPREFCFG=\"nsa_nr5g_band\"'\n    get_sa_nr_config_command='AT+QNWPREFCFG=\"nr5g_band\"'\n    wcdma_avalible_band=\"1,2,3,4,5,6,7,8,9,19\"\n    lte_avalible_band=\"1,2,3,4,5,7,8,12,13,14,17,18,19,20,25,26,28,29,30,32,34,38,39,40,41,42,66,71\"\n    nsa_nr_avalible_band=\"1,2,3,5,7,8,12,20,25,28,38,40,41,48,66,71,77,78,79,257,258,260,261\"\n    sa_nr_avalible_band=\"1,2,3,5,7,8,12,20,25,28,38,40,41,48,66,71,77,78,79\"\n    [ -n $(uci -q get qmodem.$config_section.sa_band) ] && sa_nr_avalible_band=$(uci -q get qmodem.$config_section.sa_band | tr '/' ',')\n    [ -n $(uci -q get qmodem.$config_section.nsa_band) ] && nsa_nr_avalible_band=$(uci -q get qmodem.$config_section.nsa_band | tr '/' ',')\n    [ -n $(uci -q get qmodem.$config_section.lte_band) ] && lte_avalible_band=$(uci -q get qmodem.$config_section.lte_band | tr '/' ',')\n    [ -n $(uci -q get qmodem.$config_section.wcdma_band) ] && wcdma_avalible_band=$(uci -q get qmodem.$config_section.wcdma_band | tr '/' ',')\n    gw_band=$(at $at_port  $get_wcdma_config_command |grep -e \"+QNWPREFCFG: \" )\n    lte_band=$(at $at_port $get_lte_config_command|grep -e \"+QNWPREFCFG: \")\n    nsa_nr_band=$(at $at_port $get_nsa_nr_config_command|grep -e \"+QNWPREFCFG: \")\n    sa_nr_band=$(at $at_port  $get_sa_nr_config_command|grep -e \"+QNWPREFCFG: \")\n    json_add_object \"UMTS\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_object\n    json_close_object\n    json_add_object \"LTE\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n    for i in $(echo \"$wcdma_avalible_band\" | awk -F\",\" '{for(j=1; j<=NF; j++) print $j}'); do\n        json_select \"UMTS\"\n        json_select \"available_band\"\n        add_avalible_band_entry  \"$i\" \"UMTS_$i\"\n        json_select ..\n        json_select ..\n    done\n    for i in $(echo \"$lte_avalible_band\" | awk -F\",\" '{for(j=1; j<=NF; j++) print $j}'); do\n        json_select \"LTE\"\n        json_select \"available_band\"\n        add_avalible_band_entry  \"$i\" \"LTE_B$i\"\n        json_select ..\n        json_select ..\n    done\n    #+QNWPREFCFG: \"nr5g_band\",1:3:7:20:28:40:41:71:77:78:79\n    for i in $(echo \"$gw_band\" | cut -d, -f2 |tr -d '\\r' | awk -F\":\" '{for(j=1; j<=NF; j++) print $j}'); do\n        if [ -n \"$i\" ]; then\n            json_select \"UMTS\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select ..\n            json_select ..\n        fi\n    done\n    for i in $(echo \"$lte_band\" | cut -d, -f2|tr -d '\\r' | awk -F\":\" '{for(j=1; j<=NF; j++) print $j}'); do\n        if [ -n \"$i\" ]; then\n            json_select \"LTE\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select ..\n            json_select ..\n        fi\n    done\n    json_close_array\n}\n\nget_lockband_unisoc()\n{\n    local at_port=\"$1\"\n    m_debug  \"Quectel sdx55 get lockband info\"\n    get_wcdma_config_command='AT+QNWPREFCFG=\"gw_band\"'\n    get_lte_config_command='AT+QNWPREFCFG=\"lte_band\"'\n    get_nsa_nr_config_command='AT+QNWPREFCFG=\"nsa_nr5g_band\"'\n    get_sa_nr_config_command='AT+QNWPREFCFG=\"nr5g_band\"'\n    wcdma_avalible_band=\"1,2,3,4,5,6,7,8,9,19\"\n    lte_avalible_band=\"1,2,3,4,5,7,8,12,13,14,17,18,19,20,25,26,28,29,30,32,34,38,39,40,41,42,66,71\"\n    nsa_nr_avalible_band=\"1,2,3,5,7,8,12,20,25,28,38,40,41,48,66,71,77,78,79,257,258,260,261\"\n    sa_nr_avalible_band=\"1,2,3,5,7,8,12,20,25,28,38,40,41,48,66,71,77,78,79\"\n    [ -n $(uci -q get qmodem.$config_section.sa_band) ] && sa_nr_avalible_band=$(uci -q get qmodem.$config_section.sa_band | tr '/' ',')\n    [ -n $(uci -q get qmodem.$config_section.nsa_band) ] && nsa_nr_avalible_band=$(uci -q get qmodem.$config_section.nsa_band | tr '/' ',')\n    [ -n $(uci -q get qmodem.$config_section.lte_band) ] && lte_avalible_band=$(uci -q get qmodem.$config_section.lte_band | tr '/' ',')\n    [ -n $(uci -q get qmodem.$config_section.wcdma_band) ] && wcdma_avalible_band=$(uci -q get qmodem.$config_section.wcdma_band | tr '/' ',')\n    gw_band=$(at $at_port  $get_wcdma_config_command |grep -e \"+QNWPREFCFG: \" )\n    lte_band=$(at $at_port $get_lte_config_command|grep -e \"+QNWPREFCFG: \")\n    nsa_nr_band=$(at $at_port $get_nsa_nr_config_command|grep -e \"+QNWPREFCFG: \")\n    sa_nr_band=$(at $at_port  $get_sa_nr_config_command|grep -e \"+QNWPREFCFG: \")\n    json_add_object \"UMTS\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_object\n    json_close_object\n    json_add_object \"LTE\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n    json_add_object \"NR\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n    for i in $(echo \"$wcdma_avalible_band\" | awk -F\",\" '{for(j=1; j<=NF; j++) print $j}'); do\n        json_select \"UMTS\"\n        json_select \"available_band\"\n        add_avalible_band_entry  \"$i\" \"UMTS_$i\"\n        json_select ..\n        json_select ..\n    done\n    for i in $(echo \"$lte_avalible_band\" | awk -F\",\" '{for(j=1; j<=NF; j++) print $j}'); do\n        json_select \"LTE\"\n        json_select \"available_band\"\n        add_avalible_band_entry  \"$i\" \"LTE_B$i\"\n        json_select ..\n        json_select ..\n    done\n    for i in $(echo \"$sa_nr_avalible_band\" | awk -F\",\" '{for(j=1; j<=NF; j++) print $j}'); do\n        json_select \"NR\"\n        json_select \"available_band\"\n        add_avalible_band_entry  \"$i\" \"NR_N$i\"\n        json_select ..\n        json_select ..\n    done\n    #+QNWPREFCFG: \"nr5g_band\",1:3:7:20:28:40:41:71:77:78:79\n    for i in $(echo \"$gw_band\" | cut -d, -f2 |tr -d '\\r' | awk -F\":\" '{for(j=1; j<=NF; j++) print $j}'); do\n        if [ -n \"$i\" ]; then\n            json_select \"UMTS\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select ..\n            json_select ..\n        fi\n    done\n    for i in $(echo \"$lte_band\" | cut -d, -f2|tr -d '\\r' | awk -F\":\" '{for(j=1; j<=NF; j++) print $j}'); do\n        if [ -n \"$i\" ]; then\n            json_select \"LTE\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select ..\n            json_select ..\n        fi\n    done\n    for i in $(echo \"$sa_nr_band\" | cut -d, -f2|tr -d '\\r' | awk -F\":\" '{for(j=1; j<=NF; j++) print $j}'); do\n        if [ -n \"$i\" ]; then\n            json_select \"NR\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select ..\n            json_select ..\n        fi\n    done\n    json_close_array\n}\n\nconvert2band()\n{\n    hex_band=$1\n    hex=$(echo $hex_band | grep -o \"[0-9A-F]\\{1,16\\}\")\n    if [ -z \"$hex\" ]; then\n        retrun\n    fi\n    band_list=\"\"\n    bin=$(echo \"ibase=16;obase=2;$hex\" | bc)\n    len=${#bin}\n    for i in $(seq 1 ${#bin}); do\n        if [ ${bin:$i-1:1} = \"1\" ]; then\n            band_list=$band_list\"\\n\"$((len - i + 1))\n        fi\n    done\n    echo -e $band_list | sort -n | tr '\\n' ' '\n}\n\nconvert2hex()\n{\n    band_list=$1\n    #splite band_list\n    band_list=$(echo $band_list | tr ',' '\\n' | sort -n | uniq)\n    hex=\"0\"\n    for band in $band_list; do\n        add_hex=$(echo \"obase=16;2^($band - 1 )\" | bc)\n        hex=$(echo \"obase=16;ibase=16;$hex + $add_hex\" | bc)\n    done\n    if [ -n $hex ]; then\n        echo $hex\n    else\n        echo Invalid band\n    fi\n}\n\nget_lockband_lte()\n{\n    local at_port=\"$1\"\n    local commamd=\"AT+QCFG=\\\"band\\\"\"\n    LTE_LOCK=$(at $at_port  \"$commamd\" |grep '+QCFG:'| awk -F, '{print $3}' | sed 's/\"//g' | tr '[:a-z:]' '[:A-Z:]')\n    if [ -z \"$LOCK_BAND\" ]; then\n        LOCK_BAND=\"Unknown\"\n    fi\n    LOCK_BAND=$(convert2band $LTE_LOCK)\n    json_add_object \"Lte\"\n    json_add_array available_band\n    add_avalible_band_entry \"1\" \"B01\" \n    add_avalible_band_entry \"3\" \"B03\"\n    add_avalible_band_entry \"5\" \"B05\" \n    json_adadd_avalible_band_entryd_string \"7\" \"B07\"\n    add_avalible_band_entry \"8\" \"B08\"\n    add_avalible_band_entry \"20\" \"B20\"\n    add_avalible_band_entry \"34\" \"B34\"\n    add_avalible_band_entry \"38\" \"B38\"\n    add_avalible_band_entry \"39\" \"B39\"\n    json_addadd_avalible_band_entry_string \"40\" \"B40\"\n    add_avalible_band_entry \"41\" \"B41\"\n    json_close_array\n    json_add_array \"lock_band\"\n    for band in $(echo $LOCK_BAND | tr ',' '\\n' | sort -n | uniq); do\n        json_add_string \"\" $band\n    done\n    json_close_array\n    json_close_object\n    json_close_object\n}\n\nget_lockband()\n{\n    json_add_object \"lockband\"\n    case \"$platform\" in\n        \"qualcomm\")\n            get_lockband_nr $at_port\n        ;;\n        \"unisoc\")\n            get_lockband_unisoc $at_port\n        ;;\n        'lte')\n            get_lockband_lte $at_port\n        ;;\n        \"lte12\")\n            get_lockband_lte12\n            ;;\n        *)\n            get_lockband_lte $at_port\n        ;;\n    esac\n    json_close_object\n}\n\n\nset_lockband_lte()\n{\n    hex=$(convert2hex $lock_band)\n    res=$(at $at_port 'AT+QCFG=\"band\",0,'${hex}',0'   2>&1 > /dev/null)\n}\n\nset_lockband_nr(){\n    lock_band=$(echo $lock_band | tr ',' ':')\n    case \"$band_class\" in\n        \"UMTS\") \n            at_command=\"AT+QNWPREFCFG=\\\"gw_band\\\",$lock_band\"\n            res=$(at $at_port $at_command)\n            ;;\n        \"LTE\") \n            at_command=\"AT+QNWPREFCFG=\\\"lte_band\\\",$lock_band\"\n            res=$(at $at_port $at_command)\n            ;;\n        \"NR_NSA\")\n            at_command=\"AT+QNWPREFCFG=\\\"nsa_nr5g_band\\\",$lock_band\"\n            res=$(at $at_port $at_command)\n            ;;\n        \"NR\")\n            at_command=\"AT+QNWPREFCFG=\\\"nr5g_band\\\",$lock_band\"\n            res=$(at $at_port $at_command)\n            ;;\n    esac\n}\n\n#设置锁频\nset_lockband()\n{\n    m_debug  \"quectel set lockband info\"\n    config=$1\n    #{\"band_class\":\"NR\",\"lock_band\":\"41,78,79\"}\n    band_class=$(echo $config | jq -r '.band_class')\n    lock_band=$(echo $config | jq -r '.lock_band')\n    case \"$platform\" in\n        \"lte\")\n            set_lockband_lte\n        ;;\n        *)\n            set_lockband_nr\n        ;;\n    esac\n    json_select \"result\"\n    json_add_string \"set_lockband\" \"$res\"\n    json_add_string \"config\" \"$config\"\n    json_add_string \"band_class\" \"$band_class\"\n    json_add_string \"lock_band\" \"$lock_band\"\n    json_close_object\n}\n\nget_neighborcell_qualcomm(){\n    local at_command='AT+QENG=\"neighbourcell\"'\n    nr_lock_check=\"AT+QNWLOCK=\\\"common/5g\\\"\"\n    lte_lock_check=\"AT+QNWLOCK=\\\"common/4g\\\"\"\n    lte_status=$(at $at_port $lte_lock_check | grep \"+QNWLOCK:\")\n    lte_lock_status=$(echo $lte_status | awk -F',' '{print $2}' | sed 's/\\r//g')\n    lte_lock_freq=$(echo $lte_status | awk -F',' '{print $3}' | sed 's/\\r//g')\n    lte_lock_pci=$(echo $lte_status | awk -F',' '{print $4}' | sed 's/\\r//g')\n    nr_status=$(at $at_port $nr_lock_check | grep \"+QNWLOCK:\")\n    nr_lock_status=$(echo $nr_status | awk -F',' '{print $2}' | sed 's/\\r//g')\n    nr_lock_pci=$(echo $nr_status | awk -F',' '{print $2}' | sed 's/\\r//g')\n    nr_lock_freq=$(echo $nr_status | awk -F',' '{print $3}' | sed 's/\\r//g')\n    nr_lock_scs=$(echo $nr_status | awk -F',' '{print $4}' | sed 's/\\r//g')\n    nr_lock_band=$(echo $nr_status | awk -F',' '{print $5}' | sed 's/\\r//g')\n    if [ \"$lte_lock_status\" != \"0\" ]; then\n        lte_lock_status=\"locked\"\n    else\n        lte_lock_status=\"\"\n    fi\n    if [ \"$nr_lock_status\" != \"0\" ]; then\n        nr_lock_status=\"locked\"\n    else\n        nr_lock_status=\"\"\n    fi\n\n\n    at $at_port $at_command > /tmp/neighborcell\n    json_add_object \"Feature\"\n    json_add_string \"Unlock\" \"2\"\n    json_add_string \"Lock PCI\" \"1\"\n    json_add_string \"Reboot Modem\" \"4\"\n    json_add_string \"Manually Search\" \"3\"\n    json_close_object\n    json_add_array \"NR\"\n    json_close_array\n    json_add_array \"LTE\"\n    json_close_array\n    json_add_object \"lockcell_status\"\n    if [ -n \"$lte_lock_status\" ]; then\n        json_add_string \"LTE\" \"$lte_lock_status\"\n        json_add_string \"LTE_Freq\" \"$lte_lock_freq\"\n        json_add_string \"LTE_PCI\" \"$lte_lock_pci\"\n    else\n        json_add_string \"LTE\" \"unlock\"\n    fi\n    if [ -n \"$nr_lock_status\" ]; then\n        json_add_string \"NR\" \"$nr_lock_status\"\n        json_add_string \"NR_Freq\" \"$nr_lock_freq\"\n        json_add_string \"NR_PCI\" \"$nr_lock_pci\"\n        json_add_string \"NR_SCS\" \"$nr_lock_scs\"\n        json_add_string \"NR_Band\" \"$nr_lock_band\"\n    else\n        json_add_string \"NR\" \"unlock\"\n    fi\n    json_close_object\n    while read line; do\n        if [ -n \"$(echo $line | grep \"+QENG:\")\" ]; then\n            # +QENG: \"neighbourcell intra\",\"LTE\",<earfcn>,<PCID>,<\n            # RSRQ>,<RSRP>,<RSSI>,<SINR>,<srxlev>,<cell_resel_pri\n            # ority>,<s_non_intra_search>,<thresh_serving_low>,<s_i\n            # ntra_search>\n            # …]\n            # [+QENG: \"neighbourcell inter\",\"LTE\",<earfcn>,<PCID>,<\n            # RSRQ>,<RSRP>,<RSSI>,<SINR>,<srxlev>,<cell_resel_pri\n            # ority>,<threshX_low>,<threshX_high>\n            # …]\n            # [+QENG:\"neighbourcell\",\"WCDMA\",<uarfcn>,<cell_resel\n            # _priority>,<thresh_Xhigh>,<thresh_Xlow>,<PSC>,<RSC\n            # P><eccno>,<srxlev>\n            # …]\n            line=$(echo $line | sed 's/+QENG: //g')\n            case $line in\n                *WCDMA*)\n                    type=\"WCDMA\"\n                    \n                    arfcn=$(echo $line | awk -F',' '{print $3}')\n                    pci=$(echo $line | awk -F',' '{print $4}')\n                    rscp=$(echo $line | awk -F',' '{print $6}')\n                    ecno=$(echo $line | awk -F',' '{print $7}')\n                    ;;\n                *LTE*)\n                    type=\"LTE\"\n                    neighbourcell=$(echo $line | awk -F',' '{print $1}' | tr -d '\"')\n                    arfcn=$(echo $line | awk -F',' '{print $3}')\n                    pci=$(echo $line | awk -F',' '{print $4}')\n                    rsrp=$(echo $line | awk -F',' '{print $5}')\n                    rsrq=$(echo $line | awk -F',' '{print $6}')\n\n                    ;;\n                *NR*)\n                    type=\"NR\"\n                    arfcn=$(echo $line | awk -F',' '{print $3}')\n                    pci=$(echo $line | awk -F',' '{print $4}')\n                    rsrp=$(echo $line | awk -F',' '{print $5}')\n                    rsrq=$(echo $line | awk -F',' '{print $6}')\n                    ;;\n            esac\n            json_select $type\n            json_add_object \"\"\n            json_add_string \"neighbourcell\" \"$neighbourcell\"\n            json_add_string \"arfcn\" \"$arfcn\"\n            json_add_string \"pci\" \"$pci\"\n            json_add_string \"rscp\" \"$rscp\"\n            json_add_string \"ecno\" \"$ecno\"\n            json_add_string \"rsrp\" \"$rsrp\"\n            json_add_string \"rsrq\" \"$rsrq\"\n            json_close_object\n            json_select \"..\"\n        fi\n    done < /tmp/neighborcell\n}\n\nget_neighborcell_lte(){\n    local at_command='AT+QENG=\"neighbourcell\"'\n    lte_lock_check=\"AT+QNWLOCK=\\\"common/lte\\\"\"\n    lte_status=$(at $at_port $lte_lock_check | grep \"+QNWLOCK:\")\n    lte_lock_status=$(echo $lte_status | awk -F',' '{print $2}')\n    lte_lock_freq=$(echo $lte_status | awk -F',' '{print $3}')\n    lte_lock_pci=$(echo $lte_status | awk -F',' '{print $4}')\n    lte_lock_finish=$(echo $lte_status | awk -F',' '{print $5}' | sed 's/\\r//g')\n    if [ \"$lte_lock_finish\" == \"0\" ]; then\n        lte_lock_finish=\"finish\"\n    else\n        lte_lock_finish=\"not finish\"\n    fi\n    if [ \"$lte_lock_status\" == \"1\" ]; then\n        lte_lock_status=\"locked arfcn,$lte_lock_finish\"\n    elif [ \"$lte_lock_status\" == \"2\" ]; then\n        lte_lock_status=\"lock pci,$lte_lock_finish\"\n    else\n        lte_lock_status=\"\"\n    fi\n    at $at_port $at_command > /tmp/neighborcell\n    json_add_array \"NR\"\n    json_close_array\n    json_add_array \"LTE\"\n    json_close_array\n    json_add_object \"lockcell_status\"\n    if [ -n \"$lte_lock_status\" ]; then\n        json_add_string \"lockcell_status\" \"$lte_lock_status\"\n        json_add_string \"arfcn\" \"$lte_lock_freq\"\n        json_add_string \"pci\" \"$lte_lock_pci\"\n    else\n        json_add_string \"lockcell_status\" \"unlock\"\n    fi\n    json_close_object\n    while read line; do\n        if [ -n \"$(echo $line | grep \"+QENG:\")\" ]; then\n            # +QENG: \"neighbourcell intra\",\"LTE\",<earfcn>,<PCID>,<\n            # RSRQ>,<RSRP>,<RSSI>,<SINR>,<srxlev>,<cell_resel_pri\n            # ority>,<s_non_intra_search>,<thresh_serving_low>,<s_i\n            # ntra_search>\n            # …]\n            # [+QENG: \"neighbourcell inter\",\"LTE\",<earfcn>,<PCID>,<\n            # RSRQ>,<RSRP>,<RSSI>,<SINR>,<srxlev>,<cell_resel_pri\n            # ority>,<threshX_low>,<threshX_high>\n            # …]\n            # [+QENG:\"neighbourcell\",\"WCDMA\",<uarfcn>,<cell_resel\n            # _priority>,<thresh_Xhigh>,<thresh_Xlow>,<PSC>,<RSC\n            # P><eccno>,<srxlev>\n            # …]\n            line=$(echo $line | sed 's/+QENG: //g')\n            case $line in\n                *LTE*)\n                    type=\"LTE\"\n                    neighbourcell=$(echo $line | awk -F',' '{print $1}' | tr -d '\"')\n                    arfcn=$(echo $line | awk -F',' '{print $3}')\n                    pci=$(echo $line | awk -F',' '{print $4}')\n                    rsrq=$(echo $line | awk -F',' '{print $5}')\n                    rsrp=$(echo $line | awk -F',' '{print $6}')\n\n                    ;;\n            esac\n            json_select $type\n            json_add_object \"\"\n            json_add_string \"neighbourcell\" \"$neighbourcell\"\n            json_add_string \"arfcn\" \"$arfcn\"\n            json_add_string \"pci\" \"$pci\"\n            json_add_string \"rsrp\" \"$rsrp\"\n            json_add_string \"rsrq\" \"$rsrq\"\n            json_close_object\n            json_select \"..\"\n        fi\n    done < /tmp/neighborcell\n}\n\nget_neighborcell_unisoc(){\n    local at_command='AT+QENG=\"neighbourcell\"'\n    nr_lock_check=\"AT+QNWLOCK=\\\"common/5g\\\"\"\n    lte_lock_check=\"AT+QNWLOCK=\\\"common/lte\\\"\"\n    lte_status=$(at $at_port $lte_lock_check | grep \"+QNWLOCK:\")\n    lte_lock_freq=$(echo $lte_status | awk -F',' '{print $2}')\n    lte_lock_pci=$(echo $lte_status | awk -F',' '{print $3}')\n    nr_status=$(at $at_port $nr_lock_check | grep \"+QNWLOCK:\")\n    nr_lock_pci=$(echo $nr_status | awk -F',' '{print $2}')\n    nr_lock_freq=$(echo $nr_status | awk -F',' '{print $3}')\n    [ -n \"$lte_lock_freq\" ] && lte_lock_status=\"locked\"\n    [ -n \"$nr_lock_freq\" ] && nr_lock_status=\"locked\"\n\n\n    at $at_port $at_command > /tmp/neighborcell\n    json_add_array \"NR\"\n    json_close_array\n    json_add_array \"LTE\"\n    json_close_array\n    json_add_object \"lockcell_status\"\n    if [ -n \"$lte_lock_status\" ]; then\n        json_add_string \"LTE\" \"$lte_lock_status\"\n        json_add_string \"LTE_Freq\" \"$lte_lock_freq\"\n        json_add_string \"LTE_PCI\" \"$lte_lock_pci\"\n    else\n        json_add_string \"LTE\" \"unlock\"\n    fi\n    if [ -n \"$nr_lock_status\" ]; then\n        json_add_string \"NR\" \"$nr_lock_status\"\n        json_add_string \"NR_Freq\" \"$nr_lock_freq\"\n        json_add_string \"NR_PCI\" \"$nr_lock_pci\"\n    else\n        json_add_string \"NR\" \"unlock\"\n    fi\n    json_close_object\n    while read line; do\n        if [ -n \"$(echo $line | grep \"+QENG:\")\" ]; then\n            # +QENG: \"neighbourcell intra\",\"LTE\",<earfcn>,<PCID>,<\n            # RSRQ>,<RSRP>,<RSSI>,<SINR>,<srxlev>,<cell_resel_pri\n            # ority>,<s_non_intra_search>,<thresh_serving_low>,<s_i\n            # ntra_search>\n            # …]\n            # [+QENG: \"neighbourcell inter\",\"LTE\",<earfcn>,<PCID>,<\n            # RSRQ>,<RSRP>,<RSSI>,<SINR>,<srxlev>,<cell_resel_pri\n            # ority>,<threshX_low>,<threshX_high>\n            # …]\n            # [+QENG:\"neighbourcell\",\"WCDMA\",<uarfcn>,<cell_resel\n            # _priority>,<thresh_Xhigh>,<thresh_Xlow>,<PSC>,<RSC\n            # P><eccno>,<srxlev>\n            # …]\n            line=$(echo $line | sed 's/+QENG: //g')\n            case $line in\n                *WCDMA*)\n                    type=\"WCDMA\"\n                    \n                    arfcn=$(echo $line | awk -F',' '{print $3}')\n                    pci=$(echo $line | awk -F',' '{print $4}')\n                    rscp=$(echo $line | awk -F',' '{print $6}')\n                    ecno=$(echo $line | awk -F',' '{print $7}')\n                    ;;\n                *LTE*)\n                    type=\"LTE\"\n                    neighbourcell=$(echo $line | awk -F',' '{print $1}' | tr -d '\"')\n                    arfcn=$(echo $line | awk -F',' '{print $3}')\n                    pci=$(echo $line | awk -F',' '{print $4}')\n                    rsrp=$(echo $line | awk -F',' '{print $5}')\n                    rsrq=$(echo $line | awk -F',' '{print $6}')\n\n                    ;;\n                *NR*)\n                    type=\"NR\"\n                    arfcn=$(echo $line | awk -F',' '{print $3}')\n                    pci=$(echo $line | awk -F',' '{print $4}')\n                    rsrp=$(echo $line | awk -F',' '{print $5}')\n                    rsrq=$(echo $line | awk -F',' '{print $6}')\n                    ;;\n            esac\n            json_select $type\n            json_add_object \"\"\n            json_add_string \"neighbourcell\" \"$neighbourcell\"\n            json_add_string \"arfcn\" \"$arfcn\"\n            json_add_string \"pci\" \"$pci\"\n            json_add_string \"rscp\" \"$rscp\"\n            json_add_string \"ecno\" \"$ecno\"\n            json_add_string \"rsrp\" \"$rsrp\"\n            json_add_string \"rsrq\" \"$rsrq\"\n            json_close_object\n            json_select \"..\"\n        fi\n    done < /tmp/neighborcell\n}\n\nget_neighborcell(){\n    m_debug  \"quectel set lockband info\"\n    json_add_object \"neighborcell\"\n    case \"$platform\" in\n        \"lte12\"|\\\n        \"qualcomm\")\n            get_neighborcell_qualcomm\n        ;;\n        \"unisoc\")\n            get_neighborcell_unisoc\n        ;;\n        \"lte\")\n            get_neighborcell_lte\n        ;;\n    esac\n    json_close_object\n}\n\n\n\nset_neighborcell(){\n    #at_port,func,celltype,arfcn,pci,scs,nrband\n    #  \"lockpci\" \"1\"\n    #  \"unlockcell\" \"2\"\n    #  \"manually search\" \"3\"\n    #  \"reboot modem\" \"4\"\n    json_param=$1\n# {\\\"rat\\\":1,\\\"pci\\\":\\\"113\\\",\\\"arfcn\\\":\\\"627264\\\",\\\"band\\\":\\\"\\\",\\\"scs\\\":0}\"\n    rat=$(echo $json_param | jq -r '.rat')\n    pci=$(echo $json_param | jq -r '.pci')\n    arfcn=$(echo $json_param | jq -r '.arfcn')\n    band=$(echo $json_param | jq -r '.band')\n    scs=$(echo $json_param | jq -r '.scs')\n    case $platform in\n        \"lte12\"|\\\n        \"qualcomm\")\n            lockcell_qualcomm\n            ;;\n        \"unisoc\")\n            lockcell_unisoc\n            ;;\n        \"lte\")\n            lockcell_lte\n            ;;\n    esac\n    json_select \"result\"\n    json_add_string \"setlockcell\" \"$res\"\n    json_add_string \"rat\" \"$rat\"\n    json_add_string \"pci\" \"$pci\"\n    json_add_string \"arfcn\" \"$arfcn\"\n    json_add_string \"band\" \"$band\"\n    json_add_string \"scs\" \"$scs\"\n    json_close_object\n}\n\nlockcell_qualcomm(){\n    if [ -z \"$pci\" ] && [ -z \"$arfcn\" ]; then\n        unlock4g=\"AT+QNWLOCK=\\\"common/4g\\\",0\"\n        unlocknr=\"AT+QNWLOCK=\\\"common/5g\\\",0\"\n        res1=$(at $at_port $unlocknr)\n        res2=$(at $at_port $unlock4g)\n        res=$res1,$res2\n    else\n        lock4g=\"AT+QNWLOCK=\\\"common/4g\\\",1,$arfcn,$pci\"\n        locknr=\"AT+QNWLOCK=\\\"common/5g\\\",$pci,$arfcn,$(get_scs $scs),$band\"\n        if [ $rat = \"1\" ]; then\n            res=$(at $at_port $locknr)\n        else\n            res=$(at $at_port $lock4g)\n        fi\n    fi\n   \n}\n\nlockcell_unisoc(){\n    if [ -z \"$pci\" ] && [ -z \"$arfcn\" ]; then\n        unlock4g=\"AT+QNWLOCK=\\\"common/lte\\\",0\"\n        unlocknr=\"AT+QNWLOCK=\\\"common/5g\\\",0\"\n        res1=$(at $at_port $unlocknr)\n        res2=$(at $at_port $unlock4g)\n        res=$res1,$res2\n    else\n        lock4g=\"AT+QNWLOCK=\\\"common/lte\\\",1,$arfcn,$pci\"\n        locknr=\"AT+QNWLOCK=\\\"common/5g\\\",1,$arfcn,$pci\"\n        if [ $rat = \"1\" ]; then\n            res=$(at $at_port $locknr)\n        else\n            res=$(at $at_port $lock4g)\n        fi\n    fi\n}\n\nlockcell_lte(){\n    if [ -z \"$pci\" ] && [ -z \"$arfcn\" ]; then\n        unlocklte=\"AT+QNWLOCK=\\\"common/lte\\\",0\"\n        res1=$(at $at_port $unlocklte)\n        res=$res1\n    else\n        if [ -z $pci ] && [ -n $arfcn ]; then\n            locklte=\"AT+QNWLOCK=\\\"common/lte\\\",1,$arfcn,0\"\n        elif [ -n $pci ] && [ -n $arfcn ]; then\n            locklte=\"AT+QNWLOCK=\\\"common/lte\\\",2,$arfcn,$pci\"\n        fi\n        res=$(at $at_port $locklte)\n    fi\n}\n\nunlockcell(){\n    unlock4g=\"AT+QNWLOCK=\\\"common/4g\\\",0\"\n    unlocknr=\"AT+QNWLOCK=\\\"common/5g\\\",0\"\n    res2=$(at $1 $unlocknr)\n    res3=$(at $1 $unlock4g)\n}\n\nunlockcell_unisoc(){\n    unlock4g=\"AT+QNWLOCK=\\\"common/lte\\\",0\"\n    unlocknr=\"AT+QNWLOCK=\\\"common/5g\\\",0\"\n    res2=$(at $1 $unlocknr)\n    res3=$(at $1 $unlock4g)\n}\n\nunlockcell_lte(){\n    unlocklte=\"AT+QNWLOCK=\\\"common/lte\\\",0\"\n    res1=$(at $1 $unlocklte)\n}\n\nlockpci_unisoc(){\n    local at_port=\"$1\"\n    local cell_type=\"$2\"\n    local arfcn=\"$3\"\n    local pci=\"$4\"\n    echo 1:$cell_type 2:$arfcn 3:$pci\n    case $cell_type in\n    0)\n        lock4g=\"AT+QNWLOCK=\\\"common/lte\\\",1,$arfcn,$pci\"\n        res=$(at $at_port $lock4g)\n        echo $lock4g res:$res\n        ;;\n    1)\n        locknr=\"AT+QNWLOCK=\\\"common/5g\\\",1,$arfcn,$pci\"\n        res=$(at $at_port $locknr)\n        echo $locknr res:$res\n        ;;\n    esac\n}\n\nlockpci_nr(){\n    local at_port=\"$1\"\n    local cell_type=\"$2\"\n    local arfcn=\"$3\"\n    local pci=\"$4\"\n    local scs=\"$5\"\n    local nrband=\"$6\"\n    case $scs in\n    0)\n        scs=15;;\n    1)\n        scs=30;;\n    2)\n        scs=60;;\n    esac\n\n    if [ \"$cell_type\" = \"0\" ]; then\n        lock4g=\"AT+QNWLOCK=\\\"common/4g\\\",1,$arfcn,$pci\"\n        res=$(at $at_port $locklte)\n    elif [ \"$cell_type\" = \"1\" ]; then\n        locknr=\"AT+QNWLOCK=\\\"common/5g\\\",1,$pci,$arfcn,$scs,$nrband\"\n        echo $locknr\n        res=$(at $at_port $locknr)\n    fi\n}\n\nlockpci_lte(){\n    local at_port=\"$1\"\n    local cell_type=\"$2\"\n    local arfcn=\"$3\"\n    local pci=\"$4\"\n    local scs=\"$5\"\n    local nrband=\"$6\"\n    locklte=\"AT+QNWLOCK=\\\"common/lte\\\",2,$arfcn,$pci\"\n    res=$(at $at_port $locklte)\n}\n\nlockarfn_lte(){\n    local at_port=\"$1\"\n    local cell_type=\"$2\"\n    local arfcn=\"$3\"\n    local pci=\"$4\"\n    local scs=\"$5\"\n    local nrband=\"$6\"\n    locklte=\"AT+QNWLOCK=\\\"common/lte\\\",1,$arfcn,0\"\n    res=$(at $at_port $locklte)\n}\n\n\n#UL_bandwidth\n# $1:上行带宽数字\nget_bandwidth()\n{\n    local network_type=\"$1\"\n    local bandwidth_num=\"$2\"\n\n    local bandwidth\n    case $network_type in\n\t\t\"LTE\")\n            case $bandwidth_num in\n                \"0\") bandwidth=\"1.4\" ;;\n                \"1\") bandwidth=\"3\" ;;\n                \"2\"|\"3\"|\"4\"|\"5\") bandwidth=$((($bandwidth_num - 1) * 5)) ;;\n            esac\n        ;;\n        \"NR\")\n            case $bandwidth_num in\n                \"0\"|\"1\"|\"2\"|\"3\"|\"4\"|\"5\") bandwidth=$((($bandwidth_num + 1) * 5)) ;;\n                \"6\"|\"7\"|\"8\"|\"9\"|\"10\"|\"11\"|\"12\") bandwidth=$((($bandwidth_num - 2) * 10)) ;;\n                \"13\") bandwidth=\"200\" ;;\n                \"14\") bandwidth=\"400\" ;;\n            esac\n        ;;\n\tesac\n    echo \"$bandwidth\"\n}\n\n#获取NR子载波间隔\n# $1:NR子载波间隔数字\nget_scs()\n{\n    local scs\n\tcase $1 in\n\t\t\"0\") scs=\"15\" ;;\n\t\t\"1\") scs=\"30\" ;;\n        \"2\") scs=\"60\" ;;\n        \"3\") scs=\"120\" ;;\n        \"4\") scs=\"240\" ;;\n        *) scs=$(awk \"BEGIN{ print 2^$1 * 15 }\") ;;\n\tesac\n    echo \"$scs\"\n}\n\n#获取物理信道\n# $1:物理信道数字\nget_phych()\n{\n    local phych\n\tcase $1 in\n\t\t\"0\") phych=\"DPCH\" ;;\n        \"1\") phych=\"FDPCH\" ;;\n\tesac\n    echo \"$phych\"\n}\n\n#获取扩频因子\n# $1:扩频因子数字\nget_sf()\n{\n    local sf\n\tcase $1 in\n\t\t\"0\"|\"1\"|\"2\"|\"3\"|\"4\"|\"5\"|\"6\"|\"7\") sf=$(awk \"BEGIN{ print 2^$(($1+2)) }\") ;;\n        \"8\") sf=\"UNKNOWN\" ;;\n\tesac\n    echo \"$sf\"\n}\n\n#获取插槽格式\n# $1:插槽格式数字\nget_slot()\n{\n    local slot=$1\n\t# case $1 in\n\t\t# \"0\"|\"1\"|\"2\"|\"3\"|\"4\"|\"5\"|\"6\"|\"7\"|\"8\"|\"9\"|\"10\"|\"11\"|\"12\"|\"13\"|\"14\"|\"15\"|\"16\") slot=$1 ;;\n        # \"0\"|\"1\"|\"2\"|\"3\"|\"4\"|\"5\"|\"6\"|\"7\"|\"8\"|\"9\") slot=$1 ;;\n\t# esac\n    echo \"$slot\"\n}\n\n#小区信息\ncell_info()\n{\n    m_debug  \"Quectel cell info\"\n\n    at_command='AT+QENG=\"servingcell\"'\n    response=$(at $at_port $at_command)\n    \n    local lte=$(echo \"$response\" | grep \"+QENG: \\\"LTE\\\"\")\n    local nr5g_nsa=$(echo \"$response\" | grep \"+QENG: \\\"NR5G-NSA\\\"\")\n    if [ -n \"$lte\" ] && [ -n \"$nr5g_nsa\" ] ; then\n        #EN-DC模式\n        network_mode=\"EN-DC Mode\"\n        #LTE\n        endc_lte_duplex_mode=$(echo \"$lte\" | awk -F',' '{print $2}' | sed 's/\"//g')\n        endc_lte_mcc=$(echo \"$lte\" | awk -F',' '{print $3}')\n        endc_lte_mnc=$(echo \"$lte\" | awk -F',' '{print $4}')\n        endc_lte_cell_id=$(echo \"$lte\" | awk -F',' '{print $5}')\n        endc_lte_physical_cell_id=$(echo \"$lte\" | awk -F',' '{print $6}')\n        endc_lte_earfcn=$(echo \"$lte\" | awk -F',' '{print $7}')\n        endc_lte_freq_band_ind_num=$(echo \"$lte\" | awk -F',' '{print $8}')\n        endc_lte_freq_band_ind=$(get_band \"LTE\" $endc_lte_freq_band_ind_num)\n        ul_bandwidth_num=$(echo \"$lte\" | awk -F',' '{print $9}')\n        endc_lte_ul_bandwidth=$(get_bandwidth \"LTE\" $ul_bandwidth_num)\n        dl_bandwidth_num=$(echo \"$lte\" | awk -F',' '{print $10}')\n        endc_lte_dl_bandwidth=$(get_bandwidth \"LTE\" $dl_bandwidth_num)\n        endc_lte_tac=$(echo \"$lte\" | awk -F',' '{print $11}')\n        endc_lte_rsrp=$(echo \"$lte\" | awk -F',' '{print $12}')\n        endc_lte_rsrq=$(echo \"$lte\" | awk -F',' '{print $13}')\n        endc_lte_rssi=$(echo \"$lte\" | awk -F',' '{print $14}')\n        endc_lte_sinr=$(echo \"$lte\" | awk -F',' '{print $15}')\n        endc_lte_cql=$(echo \"$lte\" | awk -F',' '{print $16}')\n        endc_lte_tx_power=$(echo \"$lte\" | awk -F',' '{print $17}')\n        endc_lte_srxlev=$(echo \"$lte\" | awk -F',' '{print $18}' | sed 's/\\r//g')\n        #NR5G-NSA\n        endc_nr_mcc=$(echo \"$nr5g_nsa\" | awk -F',' '{print $2}')\n        endc_nr_mnc=$(echo \"$nr5g_nsa\" | awk -F',' '{print $3}')\n        endc_nr_physical_cell_id=$(echo \"$nr5g_nsa\" | awk -F',' '{print $4}')\n        endc_nr_rsrp=$(echo \"$nr5g_nsa\" | awk -F',' '{print $5}')\n        endc_nr_sinr=$(echo \"$nr5g_nsa\" | awk -F',' '{print $6}')\n        endc_nr_rsrq=$(echo \"$nr5g_nsa\" | awk -F',' '{print $7}')\n        endc_nr_arfcn=$(echo \"$nr5g_nsa\" | awk -F',' '{print $8}')\n        endc_nr_band_num=$(echo \"$nr5g_nsa\" | awk -F',' '{print $9}')\n        endc_nr_band=$(get_band \"NR\" $endc_nr_band_num)\n        nr_dl_bandwidth_num=$(echo \"$nr5g_nsa\" | awk -F',' '{print $10}')\n        endc_nr_dl_bandwidth=$(get_bandwidth \"NR\" $nr_dl_bandwidth_num)\n        scs_num=$(echo \"$nr5g_nsa\" | awk -F',' '{print $16}' | sed 's/\\r//g')\n        endc_nr_scs=$(get_scs $scs_num)\n    else\n        #SA，LTE，WCDMA模式\n        response=$(echo \"$response\" | grep \"+QENG:\")\n        local rat=$(echo \"$response\" | awk -F',' '{print $3}' | sed 's/\"//g')\n        case $rat in\n            \"NR5G-SA\")\n                network_mode=\"NR5G-SA Mode\"\n                at_command=\"AT+QCAINFO\"\n                ca_response=$(at $at_port $at_command)\n                ca_scc_info=$(echo \"$ca_response\" | grep \"+QCAINFO:\" | grep \"SCC\")\n\n                if [ -n \"$ca_scc_info\" ]; then\n                    scc_count=1\n                    ca_scc_arfcn=\"\"\n                    scc_nr_dl_bandwidth=\"\"\n                    ca_scc_band_num=\"\"\n                    ca_scc_pci=\"\"\n\n                    while IFS= read -r scc_line; do\n                        [ -z \"$scc_line\" ] && continue\n                        scc_count=$((scc_count + 1))\n                        # +QCAINFO: \"SCC\",627264,12,\"NR5G BAND 78\",1,293,0,-,-\n                        arfcn=$(echo \"$scc_line\" | awk -F',' '{print $2}')\n                        bandwidth=$(get_bandwidth \"NR\" $(echo \"$scc_line\" | awk -F',' '{print $3}'))\n                        band_info=$(echo \"$scc_line\" | awk -F',' '{print $4}' | sed 's/\"//g')\n                        band=$(echo \"$band_info\" | awk -F'BAND ' '{print $2}')\n                        pci=$(echo \"$scc_line\" | awk -F',' '{print $6}')\n                        if [ -n \"$arfcn\" ] && [ \"$arfcn\" != \"-\" ]; then\n                            [ -n \"$ca_scc_arfcn\" ] && ca_scc_arfcn=\"$ca_scc_arfcn / \"\n                            ca_scc_arfcn=\"$ca_scc_arfcn$arfcn\"\n                        fi\n                        if [ -n \"$bandwidth\" ] && [ \"$bandwidth\" != \"-\" ]; then\n                            [ -n \"$scc_nr_dl_bandwidth\" ] && scc_nr_dl_bandwidth=\"$scc_nr_dl_bandwidth / \"\n                            scc_nr_dl_bandwidth=\"$scc_nr_dl_bandwidth$bandwidth\"\n                        fi\n                        if [ -n \"$band\" ] && [ \"$band\" != \"-\" ]; then\n                            [ -n \"$ca_scc_band_num\" ] && ca_scc_band_num=\"$ca_scc_band_num / \"\n                            ca_scc_band_num=\"$ca_scc_band_num$band\"\n                        fi\n                        if [ -n \"$pci\" ] && [ \"$pci\" != \"-\" ]; then\n                            [ -n \"$ca_scc_pci\" ] && ca_scc_pci=\"$ca_scc_pci / \"\n                            ca_scc_pci=\"$ca_scc_pci$pci\"\n                        fi\n                    done <<EOF\n$(echo \"$ca_scc_info\")\nEOF\n                    [ $scc_count -gt 1 ] && network_mode=\"$network_mode with $scc_count CA\"\n                fi\n                nr_duplex_mode=$(echo \"$response\" | awk -F',' '{print $4}' | sed 's/\"//g')\n                nr_mcc=$(echo \"$response\" | awk -F',' '{print $5}')\n                nr_mnc=$(echo \"$response\" | awk -F',' '{print $6}')\n                nr_cell_id=$(echo \"$response\" | awk -F',' '{print $7}')\n                nr_physical_cell_id=$(echo \"$response\" | awk -F',' '{print $8}')\n                [ -n \"$ca_scc_pci\" ] && nr_physical_cell_id=\"$nr_physical_cell_id / $ca_scc_pci\"\n                nr_tac=$(echo \"$response\" | awk -F',' '{print $9}')\n                nr_arfcn=$(echo \"$response\" | awk -F',' '{print $10}')\n                [ -n \"$ca_scc_arfcn\" ] && nr_arfcn=\"$nr_arfcn / $ca_scc_arfcn\"\n                nr_band_num=$(echo \"$response\" | awk -F',' '{print $11}')\n                nr_band=$(get_band \"NR\" $nr_band_num)\n                [ -n \"$ca_scc_band_num\" ] && nr_band=\"$nr_band / $ca_scc_band_num\"\n                nr_dl_bandwidth_num=$(echo \"$ca_response\" | grep \"+QCAINFO:\" | grep \"PCC\" | awk -F',' '{print $3}')\n                nr_dl_bandwidth=$(get_bandwidth \"NR\" $nr_dl_bandwidth_num)\n                nr_ul_bandwidth=$nr_dl_bandwidth\n                [ -n \"$scc_nr_dl_bandwidth\" ] && nr_dl_bandwidth=\"$nr_dl_bandwidth / $scc_nr_dl_bandwidth\"\n                nr_rsrp=$(echo \"$response\" | awk -F',' '{print $13}')\n                nr_rsrq=$(echo \"$response\" | awk -F',' '{print $14}')\n                nr_sinr=$(echo \"$response\" | awk -F',' '{print $15}')\n                nr_scs_num=$(echo \"$response\" | awk -F',' '{print $16}')\n                nr_scs=$(get_scs $nr_scs_num)\n                nr_srxlev=$(echo \"$response\" | awk -F',' '{print $17}' | sed 's/\\r//g')\n            ;;\n            \"LTE\"|\"CAT-M\"|\"CAT-NB\")\n                network_mode=\"LTE Mode\"\n                lte_duplex_mode=$(echo \"$response\" | awk -F',' '{print $4}' | sed 's/\"//g')\n                lte_mcc=$(echo \"$response\" | awk -F',' '{print $5}')\n                lte_mnc=$(echo \"$response\" | awk -F',' '{print $6}')\n                lte_cell_id=$(echo \"$response\" | awk -F',' '{print $7}')\n                lte_physical_cell_id=$(echo \"$response\" | awk -F',' '{print $8}')\n                lte_earfcn=$(echo \"$response\" | awk -F',' '{print $9}')\n                lte_freq_band_ind_num=$(echo \"$response\" | awk -F',' '{print $10}')\n                lte_freq_band_ind=$(get_band \"LTE\" $lte_freq_band_ind_num)\n                ul_bandwidth_num=$(echo \"$response\" | awk -F',' '{print $11}')\n                lte_ul_bandwidth=$(get_bandwidth \"LTE\" $ul_bandwidth_num)\n                dl_bandwidth_num=$(echo \"$response\" | awk -F',' '{print $12}')\n                lte_dl_bandwidth=$(get_bandwidth \"LTE\" $dl_bandwidth_num)\n                lte_tac=$(echo \"$response\" | awk -F',' '{print $13}')\n                lte_rsrp=$(echo \"$response\" | awk -F',' '{print $14}')\n                lte_rsrq=$(echo \"$response\" | awk -F',' '{print $15}')\n                lte_rssi=$(echo \"$response\" | awk -F',' '{print $16}')\n                lte_sinr=$(echo \"$response\" | awk -F',' '{print $17}')\n                lte_cql=$(echo \"$response\" | awk -F',' '{print $18}')\n                lte_tx_power=$(echo \"$response\" | awk -F',' '{print $19}')\n                lte_srxlev=$(echo \"$response\" | awk -F',' '{print $20}' | sed 's/\\r//g')\n            ;;\n            \"WCDMA\")\n                network_mode=\"WCDMA Mode\"\n                wcdma_mcc=$(echo \"$response\" | awk -F',' '{print $4}')\n                wcdma_mnc=$(echo \"$response\" | awk -F',' '{print $5}')\n                wcdma_lac=$(echo \"$response\" | awk -F',' '{print $6}')\n                wcdma_cell_id=$(echo \"$response\" | awk -F',' '{print $7}')\n                wcdma_uarfcn=$(echo \"$response\" | awk -F',' '{print $8}')\n                wcdma_psc=$(echo \"$response\" | awk -F',' '{print $9}')\n                wcdma_rac=$(echo \"$response\" | awk -F',' '{print $10}')\n                wcdma_rscp=$(echo \"$response\" | awk -F',' '{print $11}')\n                wcdma_ecio=$(echo \"$response\" | awk -F',' '{print $12}')\n                wcdma_phych_num=$(echo \"$response\" | awk -F',' '{print $13}')\n                wcdma_phych=$(get_phych $wcdma_phych_num)\n                wcdma_sf_num=$(echo \"$response\" | awk -F',' '{print $14}')\n                wcdma_sf=$(get_sf $wcdma_sf_num)\n                wcdma_slot_num=$(echo \"$response\" | awk -F',' '{print $15}')\n                wcdma_slot=$(get_slot $wcdma_slot_num)\n                wcdma_speech_code=$(echo \"$response\" | awk -F',' '{print $16}')\n                wcdma_com_mod=$(echo \"$response\" | awk -F',' '{print $17}' | sed 's/\\r//g')\n            ;;\n        esac\n    fi\n    class=\"Cell Information\"\n    add_plain_info_entry \"network_mode\" \"$network_mode\" \"Network Mode\"\n    case $network_mode in\n    \"NR5G-SA Mode\"*)\n        add_plain_info_entry \"Duplex Mode\" \"$nr_duplex_mode\" \"Duplex Mode\"\n        set_5g_cell_info \"$nr_mcc\" \"$nr_mnc\" \"$nr_tac\" \"$nr_cell_id\" \"$nr_arfcn\" \\\n            \"$nr_physical_cell_id\" \"$nr_band\" \"$nr_ul_bandwidth\" \"$nr_dl_bandwidth\" \\\n            \"$nr_rsrp\" \"$nr_rsrq\" \"$nr_sinr\" \"\" \"\"\n        add_plain_info_entry \"SCS\" \"$nr_scs\" \"SCS\"\n        add_plain_info_entry \"Srxlev\" \"$nr_srxlev\" \"Serving Cell Receive Level\"\n        # Add CA info if present\n        if [ -n \"$ca_scc_arfcn\" ] || [ -n \"$ca_scc_pci\" ] || [ -n \"$ca_scc_band_num\" ]; then\n            add_ca_info \"5G\" \"$ca_scc_arfcn\" \"$ca_scc_pci\" \"$ca_scc_band_num\" \"\" \"$scc_nr_dl_bandwidth\"\n        fi\n        ;;\n    \"EN-DC Mode\")\n        # LTE part\n        add_plain_info_entry \"LTE\" \"LTE\" \"\"\n        add_plain_info_entry \"Duplex Mode\" \"$endc_lte_duplex_mode\" \"Duplex Mode\"\n        extra_info=\"LTE\"\n        set_4g_cell_info \"$endc_lte_mcc\" \"$endc_lte_mnc\" \"$endc_lte_tac\" \"$endc_lte_cell_id\" \\\n            \"$endc_lte_earfcn\" \"$endc_lte_physical_cell_id\" \"$endc_lte_band\" \\\n            \"$endc_lte_ul_bandwidth\" \"$endc_lte_dl_bandwidth\" \"$endc_lte_rsrp\" \"$endc_lte_rsrq\" \\\n            \"$endc_lte_sinr\" \"$endc_lte_rssnr\" \"$endc_lte_rxlev\"\n        add_bar_info_entry \"RSSI\" \"$endc_lte_rssi\" \"Received Signal Strength Indicator\" -120 -20 dBm\n        add_plain_info_entry \"CQI\" \"$endc_lte_cql\" \"Channel Quality Indicator\"\n        add_plain_info_entry \"TX Power\" \"$endc_lte_tx_power\" \"TX Power\"\n        add_plain_info_entry \"Srxlev\" \"$endc_lte_srxlev\" \"Serving Cell Receive Level\"\n        # NR5G-NSA part\n        add_plain_info_entry \"NR5G-NSA\" \"NR5G-NSA\" \"\"\n        extra_info=\"NR\"\n        set_5g_cell_info \"$endc_nr_mcc\" \"$endc_nr_mnc\" \"\" \"\" \"$endc_nr_arfcn\" \\\n            \"$endc_nr_physical_cell_id\" \"$endc_nr_band\" \"\" \"$endc_nr_dl_bandwidth\" \\\n            \"$endc_nr_rsrp\" \"$endc_nr_rsrq\" \"$endc_nr_sinr\" \"\" \"\"\n        add_plain_info_entry \"SCS\" \"$endc_nr_scs\" \"SCS\"\n        ;;\n    \"LTE Mode\")\n        add_plain_info_entry \"Duplex Mode\" \"$lte_duplex_mode\" \"Duplex Mode\"\n        extra_info=\"LTE\"\n        set_4g_cell_info \"$lte_mcc\" \"$lte_mnc\" \"$lte_tac\" \"$lte_cell_id\" \"$lte_earfcn\" \\\n            \"$lte_physical_cell_id\" \"$lte_band\" \"$lte_ul_bandwidth\" \"$lte_dl_bandwidth\" \\\n            \"$lte_rsrp\" \"$lte_rsrq\" \"$lte_sinr\" \"$lte_rssnr\" \"$lte_rxlev\"\n        add_bar_info_entry \"RSSI\" \"$lte_rssi\" \"Received Signal Strength Indicator\" -120 -20 dBm\n        add_plain_info_entry \"CQI\" \"$lte_cql\" \"Channel Quality Indicator\"\n        add_plain_info_entry \"TX Power\" \"$lte_tx_power\" \"TX Power\"\n        add_plain_info_entry \"Srxlev\" \"$lte_srxlev\" \"Serving Cell Receive Level\"\n        ;;\n    \"WCDMA Mode\")\n        set_3g_cell_info \"$wcdma_mcc\" \"$wcdma_mnc\" \"$wcdma_lac\" \"$wcdma_cell_id\" \\\n            \"$wcdma_uarfcn\" \"$wcdma_psc\" \"\" \"\" \"\" \"$wcdma_rscp\" \"\" \"$wcdma_ecio\" \"\" \"$wcdma_rac\"\n        add_plain_info_entry \"Ec/No\" \"$wcdma_ecno\" \"Ec/No\"\n        add_plain_info_entry \"Physical Channel\" \"$wcdma_phych\" \"Physical Channel\"\n        add_plain_info_entry \"Spreading Factor\" \"$wcdma_sf\" \"Spreading Factor\"\n        add_plain_info_entry \"Slot\" \"$wcdma_slot\" \"Slot\"\n        add_plain_info_entry \"Speech Code\" \"$wcdma_speech_code\" \"Speech Code\"\n        add_plain_info_entry \"Compression Mode\" \"$wcdma_com_mod\" \"Compression Mode\"\n        ;;\n    esac\n}\n\n# get sim switch capabilities\nsim_switch_capabilities(){\n    json_add_string \"supportSwitch\" \"1\"\n    json_add_array \"simSlots\"\n    json_add_string \"\" \"1\"\n    json_add_string \"\" \"2\"\n    json_close_array\n}\n\nget_sim_slot(){\n    local at_command=\"AT+QUIMSLOT?\"\n\tsim_slot=$(at $at_port $at_command | grep \"+QUIMSLOT:\" | awk -F' ' '{print $2}' | sed 's/\\r//g')\n    json_add_string \"sim_slot\" \"$sim_slot\"\n}\n\nset_sim_slot(){\n    local sim_slot_param=$1\n    local at_command=\"AT+QUIMSLOT=$sim_slot_param\"\n    response=$(at $at_port $at_command)\n    json_add_string \"result\" \"$response\"\n}\n\nget_usage_stats()\n{\n    local response tx_bytes rx_bytes updated_at\n\n    response=$(at \"$at_port\" \"AT+QGDNRCNT?\")\n    tx_bytes=$(echo \"$response\" | awk -F'[:, ]+' '/\\+QGDNRCNT:/ {gsub(/\\r/, \"\", $2); print $2; exit}')\n    rx_bytes=$(echo \"$response\" | awk -F'[:, ]+' '/\\+QGDNRCNT:/ {gsub(/\\r/, \"\", $3); print $3; exit}')\n\n    case \"$tx_bytes\" in\n        ''|*[!0-9]*)\n            tx_bytes=0\n            ;;\n    esac\n    case \"$rx_bytes\" in\n        ''|*[!0-9]*)\n            rx_bytes=0\n            ;;\n    esac\n\n    if echo \"$response\" | grep -q \"+QGDNRCNT:\"; then\n        updated_at=$(date +%s)\n        json_add_boolean \"available\" 1\n        json_add_int \"updated_at\" \"$updated_at\"\n        json_add_int \"total_rx_bytes\" \"$rx_bytes\"\n        json_add_int \"total_tx_bytes\" \"$tx_bytes\"\n    else\n        json_add_boolean \"available\" 0\n        json_add_int \"updated_at\" 0\n        json_add_int \"total_rx_bytes\" 0\n        json_add_int \"total_tx_bytes\" 0\n    fi\n}\n\nwrite_usage_stats()\n{\n    local response\n\n    response=$(at \"$at_port\" \"AT+QGDNRCNT=1\")\n    echo \"$response\" | grep -qi \"OK\"\n}\n\nclear_usage_stats()\n{\n    local response\n\n    response=$(at \"$at_port\" \"AT+QGDNRCNT=0\")\n    if echo \"$response\" | grep -qi \"OK\"; then\n        json_add_boolean \"result\" 1\n    else\n        json_add_boolean \"result\" 0\n    fi\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/vendor/sierra.sh",
    "content": "#!/bin/sh\n# Copyright (C) 2025 Fujr <fjrcn@outlook.com>\n_Vendor=\"sierra\"\n_Author=\"Fujr\"\n_Maintainer=\"Fujr <fjrcn@outlook.com>\"\nsource /usr/share/qmodem/generic.sh\ndebug_subject=\"quectel_ctrl\"\nfunction unlock_advance(){\n    [ -z \"$sierra_pass\" ] && sierra_pass=\"A710\"\n    at $at_port \"AT!ENTERCND=\\\"$sierra_pass\\\"\" > /dev/null\n}\n\nfunction get_imei(){\n    imei=$(at $at_port \"AT+CGSN\" | grep -o '[0-9]\\{15\\}')\n    json_add_string imei $imei\n}\n\nfunction set_imei(){\n    imei=$1\n    at $at_port \"AT+EGMR=1,7,\\\"$imei\\\"\"\n}\n\nfunction get_mode(){\n    cfg=$(at $at_port \"AT!USBCOMP?\")\n    config_type=`echo -e \"$cfg\" | grep -o 'Config Type:  [0-9]'`\n    config_type=${config_type:14}\n    interface_mask=`echo -e \"$cfg\" | grep -o 'Interface bitmask: [0-9a-fA-F]*'`\n    interface_mask=${interface_mask:18}\n    _mask_to_mode $interface_mask\n    if [ \"$mbim_port\" = \"1\" ]; then\n        mode=\"mbim\"\n    elif [ \"$rmnet_port\" = \"1\" ]; then\n        mode=\"rmnet\"\n    fi\n    available_modes=$(uci -q get qmodem.$config_section.modes)\n    json_add_object \"mode\"\n    for available_mode in $available_modes; do\n        if [ \"$mode\" = \"$available_mode\" ]; then\n            json_add_string \"$available_mode\" \"1\"\n        else\n            json_add_string \"$available_mode\" \"0\"\n        fi\n    done\n    json_close_object\n}\n\nfunction set_mode(){\n    local mode=$1\n    case $mode in\n        \"mbim\")\n            interface_mask=0x00001009\n            ;;\n        \"rmnet\")\n            interface_mask=0x00000109\n            ;;\n        *)\n            echo \"Invalid mode\"\n            return 1\n            ;;\n    esac\n    at $at_port \"AT!USBCOMP=1,4,$interface_mask\"\n}\n\nfunction get_network_prefer(){\n    res=$(at $at_port \"at!SELRAT?\"| grep -o \"!SELRAT: [0-9A-Fa-f]*\")\n# (RAT index): \n# • 00 – Automatic \n# • 01 – UMTS 3G only \n# • 04 – LTE only \n# • 05 – 5G only \n# • 0E – UMTS and LTE only \n# • 0F – LTE and NR5G only \n# • 10 – WCDMA and NR5G only \n   code=${res:9}\n    local network_prefer_3g=\"0\"\n    local network_prefer_4g=\"0\"\n    local network_prefer_5g=\"0\"\n   case $code in\n        \"00\")\n            network_prefer_3g=\"1\"\n            network_prefer_4g=\"1\"\n            network_prefer_5g=\"1\"\n            ;;\n        \"01\")\n            network_prefer_3g=\"1\"\n            ;;\n        \"06\")\n            network_prefer_4g=\"1\"\n            ;;\n        \"20\")\n            network_prefer_5g=\"1\"\n            ;;\n        \"11\")\n            network_prefer_3g=\"1\"\n            network_prefer_4g=\"1\"\n            ;;\n        \"21\")\n            network_prefer_4g=\"1\"\n            network_prefer_5g=\"1\"\n            ;;\n        \"22\")\n            network_prefer_3g=\"1\"\n            network_prefer_5g=\"1\"\n            ;;\n        *)\n            network_prefer_3g=\"0\"\n            network_prefer_4g=\"0\"\n            network_prefer_5g=\"0\"\n            ;;\n    esac\n    json_add_object network_prefer\n    json_add_string 3G $network_prefer_3g\n    json_add_string 4G $network_prefer_4g\n    json_add_string 5G $network_prefer_5g\n    json_close_array\n}\n\nfunction set_network_prefer(){\n    local network_prefer_3g=$(echo $1 |jq -r 'contains([\"3G\"])')\n    local network_prefer_4g=$(echo $1 |jq -r 'contains([\"4G\"])')\n    local network_prefer_5g=$(echo $1 |jq -r 'contains([\"5G\"])')\n    count=$(echo $1 | jq -r 'length')\n    case \"$count\" in\n        \"1\")\n            if [ \"$network_prefer_3g\" = \"true\" ]; then\n                code=\"01\"\n            elif [ \"$network_prefer_4g\" = \"true\" ]; then\n                code=\"06\"\n            elif [ \"$network_prefer_5g\" = \"true\" ]; then\n                code=\"20\"\n            fi\n            ;;\n        \"2\")\n            if [ \"$network_prefer_3g\" = \"true\" ] && [ \"$network_prefer_4g\" = \"true\" ]; then\n                code=\"11\"\n            elif [ \"$network_prefer_4g\" = \"true\" ] && [ \"$network_prefer_5g\" = \"true\" ]; then\n                code=\"21\"\n            elif [ \"$network_prefer_3g\" = \"true\" ] && [ \"$network_prefer_5g\" = \"true\" ]; then\n                code=\"22\"\n            fi\n            ;;\n        \"3\")\n            code=\"00\"\n            ;;\n        *)\n            code=\"00\"\n            ;;\n    esac\n    res=$(at $at_port \"AT!SELRAT=$code\")\n    json_add_string \"code\" \"$code\"\n    json_add_string \"result\" \"$res\"\n}\n\nfunction get_lockband(){\n    json_add_object \"lockband\"\n    case $platform in\n        \"qualcomm\")\n            _get_lockband_nr\n            ;;\n        *)\n            _get_lockband_nr\n            ;;\n    esac\n    json_close_object\n}\n\nfunction set_lockband(){\n    config=$1\n    band_class=$(echo $config | jq -r '.band_class')\n    lock_band=$(echo $config | jq -r '.lock_band')\n    case $platform in\n        \"qualcomm\")\n            _set_lockband_nr\n            ;;\n        *)\n            _set_lockband_nr\n            ;;\n    esac\n}\n\nfunction sim_info()\n{\n    class=\"SIM Information\"\n    \n    at_command=\"AT!UIMS?\"\n\tslot=$(at $at_port $at_command | grep -o '!UIMS: [0-9]*' | grep -o '[0-9]*')\n    sim_slot=$(($slot+1))\n\n    #SIM Status（SIM状态）\n    at_command=\"AT+CPIN?\"\n\tsim_status=$(at $at_port $at_command | grep \"+CPIN:\")\n    sim_status=${sim_status:7:-1}\n    #lowercase\n    sim_status=$(echo $sim_status | tr  A-Z a-z)\n    add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n    add_plain_info_entry \"SIM Slot\" \"$sim_slot\" \"SIM Slot\"\n}\n\nfunction base_info(){\n        #Name（名称）\n    at_command=\"AT+CGMM\"\n    name=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n    #Manufacturer（制造商）\n    at_command=\"AT+CGMI\"\n    manufacturer=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n    #Revision（固件版本）\n    at_command=\"ATI\"\n    revision=$(at $at_port $at_command | grep \"Revision:\" | sed 's/Revision: //g' | sed 's/\\r//g')\n    # at_command=\"AT+CGMR\"\n    # revision=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n    class=\"Base Information\"\n    add_plain_info_entry \"name\" \"$name\" \"Name\"\n    add_plain_info_entry \"manufacturer\" \"$manufacturer\" \"Manufacturer\"\n    add_plain_info_entry \"revision\" \"$revision\" \"Revision\"\n    add_plain_info_entry \"at_port\" \"$at_port\" \"AT Port\"\n    get_connect_status\n    _get_temperature\n    _get_voltage\n}\n\nfunction network_info() {\n    class=\"Network Information\"\n    at_command=\"AT!GSTATUS?\"\n    res=$(at $at_port $at_command  |grep -i -v \"!GSTATUS\"| grep -v \"OK\")\n    _parse_gstatus \"$res\"\n}\n\nfunction vendor_get_disabled_features(){\n    json_add_string \"\" \"IMEI\"\n    json_add_string \"\" \"NeighborCell\"\n}\n\nfunction _get_lockband_nr(){\n    local bandcfg=$(at $at_port \"AT!BAND?\")\n    local bandtemplate=$(at $at_port \"AT!BAND=?\")\n    local start_flag=0\n    IFS=$'\\n'\n    for line in $bandtemplate; do\n        if [ \"$start_flag\" = 0 ];then\n            if [ \"${line:0:10}\" == \"Available:\" ];then\n                start_flag=1\n            fi\n            continue\n        else\n            \n            if [  \"${line:0:2}\" == \"OK\" ];then\n                break\n            fi\n        fi\n        type_line=$(echo $line | grep '[0-9]* - .*:')\n        if [ -n \"$type_line\" ]; then\n            type=$(echo $line | grep -o '[0-9]* - .*:')\n            type=${type:4:-1}\n            json_add_object $type\n            json_add_array \"available_band\"\n            json_close_array\n            json_add_array \"lock_band\"\n            json_close_array\n            json_close_object\n        elif [ -n \"$line\" ]; then\n            band_name=${line##*-}\n            band_name=$(echo $band_name | xargs)\n            [ -z \"$band_name\" ] && continue\n            case $type in\n            \"GW\")\n                band_hex=${line%%-*}\n                band_bin=$(echo \"obase=2; ibase=16; $band_hex\" | bc)\n                band_id=$(echo $band_bin | wc -c)\n                band_id=$(($band_id - 1))\n                ;;\n            *)\n                band_id=$(echo $band_name |grep -o '^[BbNn][0-9]*' | grep -o '[0-9]*')\n                ;;\n            esac\n            json_select $type\n            json_select \"available_band\"\n            add_avalible_band_entry $band_id  ${type}_${band_name} \n            json_close_array\n            json_close_object\n        fi\n\n    done\n    for line in $bandcfg; do\n        cfg_line=$(echo $line | grep '[0-9]* - ')\n        if [ -n \"$cfg_line\" ]; then\n            type=$(echo $cfg_line | cut -d' ' -f3)\n            type=${type:0:-1}\n            low_band=${cfg_line:11:16}\n            high_band=${cfg_line:28:16}\n            json_select $type\n            json_select \"lock_band\"\n            _mask_to_band _add_lock_band  $low_band $high_band\n            json_select \"..\"\n            json_select \"..\"\n        fi\n    done\n\n    unset IFS\n}\n\nfunction _set_lockband_nr(){\n    case $band_class in\n        \"GW\")\n            band_class=0\n            ;;\n        \"LTE\")\n            band_class=1\n            ;;\n        \"NRNSA\")\n            band_class=3\n            ;;\n        \"NRSA\")\n            band_class=4\n            ;;\n    esac\n    bandlist=$(_band_list_to_mask $lock_band)\n    [ \"$band_class\" -eq 0 ] && bandlist=${bandlist:0:16}\n    cmd=\"AT!BAND=0F,1,\\\"Custom\\\",$band_class,${bandlist}\"\n    res=$(at $at_port \"$cmd\" | xargs)\n    if [ \"$res\" == \"OK\" ]; then\n        set_lockband=\"AT!BAND=0F\"\n    else\n        set_lockband=\"AT!BAND=00\"\n    fi\n    r=$(at $at_port \"$set_lockband\")\n    json_add_string \"result\" \"$res\"\n    json_add_string \"cmd\" \"$cmd\"\n}\n\nfunction _get_voltage(){\n    voltage=$(at $at_port \"AT!PCVOLT?\" | grep -o 'Power supply voltage: [0-9]* mV'|grep -o '[0-9]*' )\n    [ -n \"$voltage\" ] && {\n        add_plain_info_entry \"voltage\" \"$voltage mV\" \"Voltage\" \n    }\n}\n\nfunction _get_temperature(){\n    temperature=$(at $at_port \"AT!PCTEMP?\" | grep -o 'Temperature: [0-9]*\\.[0-9]*'|grep -o '[0-9]*\\.[0-9]*' )\n    [ -n \"$temperature\" ] && {\n        add_plain_info_entry \"temperature\" \"$temperature C\" \"Temperature\" \n    }\n}\n\nfunction _add_avalible_band(){\n    add_avalible_band_entry $1 $1\n}\n\nfunction _add_lock_band(){\n    json_add_string \"\" $1\n}\n\nfunction _mask_to_band()\n{\n    func=$1\n    low_band=$2\n    high_band=$3\n    low_band=$(echo \"obase=2; ibase=16; $low_band\" | bc)\n    low_band=$(printf \"%064s\" $low_band)\n    for i in $(seq 1 64); do\n        if [ \"${low_band: -$i:1}\" = \"1\" ]; then\n            band=$i\n            $func $band\n        fi\n    done\n    [ -z \"$high_band\" ] && return\n    high_band=$(echo \"obase=2; ibase=16; $high_band\" | bc)\n    high_band=$(printf \"%064s\" $high_band)\n    for i in $(seq 1 64); do\n        if [ \"${high_band: -$i:1}\" = \"1\" ]; then\n            band=$((64+i))\n            $func $band\n        fi\n    done\n\n}\n\nfunction _band_list_to_mask()\n{\n    local band_list=$1\n    local low=0\n    local high=0\n    #以逗号分隔\n    IFS=\",\"\n    for band in $band_list;do\n        if [ \"$band\" -le 64 ]; then\n            #使用bc计算2的band次方\n            res=$(echo \"2^($band-1)\" | bc)\n            low=$(echo \"$low+$res\" | bc)\n\n        else\n            tmp_band=$((band-64))\n            res=$(echo \"2^($tmp_band-1)\" | bc)\n            high=$(echo \"$high+$res\" | bc)\n        fi\n    done\n    #十六进制输出，padding到16位\n    low=$(printf \"%016x\" $low)\n    high=$(printf \"%016x\" $high)\n    echo \"$low,$high\"\n}\n\nfunction _mask_to_mode()\n{\n    mask=$1\n# RmNet – 0x00000100 bin: 000100000000\n# MBIM – 0x00001000 bin: 0001000000000000\n    hex_to_bin=$(echo \"obase=2; ibase=16; $mask\" | bc)\n    #paddding to 16 bits\n    hex_to_bin=$(printf \"%016d\" $hex_to_bin)\n    adb_port=${hex_to_bin: -1}\n    diag_port=${hex_to_bin: -2:1}\n    modem_port=${hex_to_bin: -4:1}\n    rmnet_port=${hex_to_bin: -9:1}\n    mbim_port=${hex_to_bin: -13:1}\n}\n\nfunction _parse_gstatus(){\ndata=$1\nIFS=$'\\t\\r\\n'\nfor line in $data;do\n    line=${line//[$'\\t\\r\\n']}\n    key=${line%%:*}\n    value=${line##*:}\n    key=${key}\n    #trim space at value\n    value=$(echo $value | xargs)\n    if [ -z \"$value\" ] || [ \"$value\" = \"---\" ]; then\n        continue\n    fi\n   \n    \n    case $key in\n    OK)\n        continue\n        ;;\n    *SINR*)\n        add_bar_info_entry \"SINR\" \"$value\" \"$key\" 0 30 dB\n        ;;\n    *RSRP*)\n        add_bar_info_entry \"RSRP\" \"$value\" \"$key\" -140 -44 dBm\n        ;;\n    *RSRQ*)\n            add_bar_info_entry \"RSRQ\" \"$value\" \"$key\" -19.5 -3 dB\n        ;;\n    *RSSI*)\n            add_bar_info_entry \"RSSI\" \"$value\" \"$key\" -120 -20 dBm\n            ;;\n    *)\n        add_plain_info_entry $key $value $key\n        ;;\n    esac\n    \ndone\nunset IFS\n}\n\n\n\nunlock_advance\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/vendor/simcom.sh",
    "content": "#!/bin/sh\n# Copyright (C) 2025 sfwtw <sfwtw@qq.com>\n_Vendor=\"simcom\"\n_Author=\"sfwtw,fujr\"\n_Maintainer=\"sfwtw <sfwtw@qq.com>\"\nsource /usr/share/qmodem/generic.sh\ndebug_subject=\"quectel_ctrl\"\n#return raw data\nget_imei(){\n    at_command=\"AT+CGSN\"\n    imei=$(at $at_port $at_command | grep -o \"[0-9]\\{15\\}\")\n    json_add_string \"imei\" \"$imei\"\n}\n\n#return raw data\nset_imei(){\n    local imei=\"$1\"\n    at_command=\"AT+SIMEI=$imei\"\n    res=$(at $at_port $at_command)\n    json_select \"result\"\n    json_add_string \"set_imei\" \"$res\"\n    json_close_object\n    get_imei\n}\n\n#获取拨号模式\n# $1:AT串口\n# $2:平台\nget_mode()\n{\n    case \"$platform\" in\n        \"qualcomm\")\n            at_command='AT+CUSBCFG?'\n            local mode_num=$(at ${at_port} ${at_command} | grep \"USBID: \" | sed 's/USBID: 0X1E0E,0X//g' | sed 's/\\r//g')\n            local mode\n            pcie_cfg=$(at ${at_port} \"AT+CPCIEMODE?\")\n            pcie_mode=$(echo \"$pcie_cfg\"|grep +CPCIEMODE: |cut -d':' -f2|xargs)\n            if [ \"$pcie_mode\" = \"EP\" ] && [ \"$mode_num\" = \"902B\" ]; then\n                mode_num=\"9001\"\n            json_add_int disable_mode_btn 1\n            fi\n            case \"$mode_num\" in\n                \"9001\") mode=\"qmi\" ;;\n                \"9011\") mode=\"rndis\" ;;\n                *) mode=\"${mode_num}\" ;;\n            esac\n        ;;\n        \"lte\")\n            at_command='AT$MYCONFIG?'\n            config=$(at ${at_port} ${at_command} | grep \"MYCONFIG: \" | sed 's/\\r//g')\n            param1=$(echo \"$config\" | cut -d',' -f2 | xargs)\n            param2=$(echo \"$config\" | cut -d',' -f3 | xargs)\n            case $param1 in\n                \"0\") mode=\"rndis\" ;;\n                \"1\") mode=\"ecm\" ;;\n                \"2\") mode=\"auto\" ;;\n            esac\n            ;;\n\n        *)\n            mode=\"${mode_num}\"\n        ;;\n    esac\n    available_modes=$(uci -q get qmodem.$config_section.modes)\n    json_add_object \"mode\"\n    for available_mode in $available_modes; do\n        if [ \"$mode\" = \"$available_mode\" ]; then\n            json_add_string \"$available_mode\" \"1\"\n        else\n            json_add_string \"$available_mode\" \"0\"\n        fi\n    done\n    json_close_object\n}\n\n#设置拨号模式\nset_mode()\n{\n    #获取拨号模式配置\n    local mode=$1\n    case \"$platform\" in\n        \"qualcomm\")\n            case \"$mode\" in\n                \"qmi\") mode_num=\"9001\" ;;\n                \"rndis\") mode_num=\"9011\" ;;\n                *) mode_num=\"0\" ;;\n            esac\n            #设置模组\n            at_command='AT+CUSBCFG=usbid,1e0e,'${mode_num}\n            res=$(at \"${at_port}\" \"${at_command}\")\n            json_select \"result\"\n            json_add_string \"set_mode\" \"$res\"\n            json_close_object\n        ;;\n        \"lte\")\n            case \"$mode\" in\n                \"ecm\") param1=\"1\" ;;\n                \"rndis\") param1=\"0\" ;;\n                \"auto\") param1=\"2\" ;;\n                *) param1=\"0\" ;;\n            esac\n            at_command='AT$MYCONFIG=\"USBNETMODE\",'${param1}','1\n            res=$(at \"${at_port}\" \"${at_command}\")\n            json_select \"result\"\n            json_add_string \"set_mode\" \"$res\"\n            json_close_object\n        ;;\n        *)\n            mode_num=\"0\"\n        ;;\n    esac\n\n}\n\n#获取网络偏好\n# $1:AT串口\nget_network_prefer()\n{\n    case \"$platform\" in\n        \"qualcomm\")\n            get_network_prefer_nr\n        ;;\n        *)\n            get_network_prefer_nr\n        ;;\n    esac\n    json_add_object network_prefer\n    json_add_string 3G $network_prefer_3g\n    json_add_string 4G $network_prefer_4g\n    case $platform in\n        \"qualcomm\")\n            json_add_string 5G $network_prefer_5g\n        ;;\n    esac\n    json_close_array\n    \n}\n\nget_network_prefer_nr()\n{\n    at_command='AT+CNMP?'\n    local response=$(at ${at_port} ${at_command} | grep \"+CNMP:\" | awk -F': ' '{print $2}' | sed 's/\\r//g')\n    \n    network_prefer_3g=\"0\";\n    network_prefer_4g=\"0\";\n    network_prefer_5g=\"0\";\n\n    #匹配不同的网络类型\n    local auto=$(echo \"${response}\" | grep \"2\")\n    if [ -n \"$auto\" ]; then\n        network_prefer_3g=\"1\"\n        network_prefer_4g=\"1\"\n        network_prefer_5g=\"1\"\n    else\n        local wcdma=$(echo \"${response}\" | grep \"14\" || echo \"${response}\" | grep \"54\" || echo \"${response}\" | grep \"55\")\n        local lte=$(echo \"${response}\" | grep \"38\" || echo \"${response}\" | grep \"54\" || echo \"${response}\" | grep \"109\")\n        local nr=$(echo \"${response}\" | grep \"71\" || echo \"${response}\" | grep \"55\" || echo \"${response}\" | grep \"109\")\n        if [ -n \"$wcdma\" ]; then\n            network_prefer_3g=\"1\"\n        fi\n        if [ -n \"$lte\" ]; then\n            network_prefer_4g=\"1\"\n        fi\n        if [ -n \"$nr\" ]; then\n            network_prefer_5g=\"1\"\n        fi\n    fi\n}\n\n#设置网络偏好\n# $1:AT串口\n# $2:网络偏好配置\nset_network_prefer()\n{\n    network_prefer_3g=$(echo $1 |jq -r 'contains([\"3G\"])')\n    network_prefer_4g=$(echo $1 |jq -r 'contains([\"4G\"])')\n    network_prefer_5g=$(echo $1 |jq -r 'contains([\"5G\"])')\n    length=$(echo $1 |jq -r 'length')\n\n    case \"$platform\" in\n        \"qualcomm\")\n            set_network_prefer_nr $at_port $network_prefer\n        ;;\n        *)\n            set_network_prefer_nr $at_port $network_prefer\n        ;;\n    esac\n}\n\nset_network_prefer_nr()\n{\n    case \"$length\" in\n        \"1\")\n            if [ \"$network_prefer_3g\" = \"true\" ]; then\n                network_prefer_config=\"14\"\n            elif [ \"$network_prefer_4g\" = \"true\" ]; then\n                network_prefer_config=\"38\"\n            elif [ \"$network_prefer_5g\" = \"true\" ]; then\n                network_prefer_config=\"71\"\n            fi\n        ;;\n        \"2\")\n            if [ \"$network_prefer_3g\" = \"true\" ] && [ \"$network_prefer_4g\" = \"true\" ]; then\n                network_prefer_config=\"54\"\n            elif [ \"$network_prefer_3g\" = \"true\" ] && [ \"$network_prefer_5g\" = \"true\" ]; then\n                network_prefer_config=\"55\"\n            elif [ \"$network_prefer_4g\" = \"true\" ] && [ \"$network_prefer_5g\" = \"true\" ]; then\n                network_prefer_config=\"109\"\n            fi\n        ;;\n        \"3\") network_prefer_config=\"2\" ;;\n        *) network_prefer_config=\"2\" ;;\n    esac\n\n    #设置模组\n    at_command='AT+CNMP='${network_prefer_config}\n    at \"${at_port}\" \"${at_command}\"\n}\n\n#获取电压\n# $1:AT串口\nget_voltage()\n{\n    at_command=\"AT+CBC\"\n    local voltage=$(at ${at_port} ${at_command} | grep \"+CBC:\" | sed 's/+CBC: //g' | sed 's/V//g' | sed 's/\\r//g')\n    [ -n \"$voltage\" ] && {\n        add_plain_info_entry \"voltage\" \"$voltage V\" \"Voltage\" \n    }\n}\n\n#获取温度\n#return raw data\nget_temperature()\n{   \n    #Temperature（温度）\n    at_command=\"AT+CPMUTEMP\"\n    local temp\n    local line=1\n    QTEMP=$(at ${at_port} ${at_command} | grep \"+CPMUTEMP:\")\n    temp=$(echo $QTEMP | awk -F': ' '{print $2}' | sed 's/\\r//g')\n    if [ -n \"$temp\" ]; then\n        temp=\"${temp}$(printf \"\\xc2\\xb0\")C\"\n    fi\n    add_plain_info_entry \"temperature\" \"$temp\" \"Temperature\"\n}\n\n\n\n#基本信息\nbase_info()\n{\n    m_debug  \"Quectel base info\"\n\n    #Name（名称）\n    at_command=\"AT+CGMM\"\n    name=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n    #Manufacturer（制造商）\n    at_command=\"AT+CGMI\"\n    manufacturer=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n    #Revision（固件版本）\n    at_command=\"AT+SIMCOMATI\"\n    revision=$(at $at_port $at_command | grep \"Revision:\" | sed 's/Revision: //g' | sed 's/\\r//g')\n    # at_command=\"AT+CGMR\"\n    # revision=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n    class=\"Base Information\"\n    add_plain_info_entry \"name\" \"$name\" \"Name\"\n    add_plain_info_entry \"manufacturer\" \"$manufacturer\" \"Manufacturer\"\n    add_plain_info_entry \"revision\" \"$revision\" \"Revision\"\n    add_plain_info_entry \"at_port\" \"$at_port\" \"AT Port\"\n    get_temperature\n    get_voltage\n    get_connect_status\n}\n\n\n#SIM卡信息\nsim_info()\n{\n    m_debug  \"Quectel sim info\"\n    \n    #SIM Slot（SIM卡卡槽）\n    at_command=\"AT+SMSIMCFG?\"\n    sim_slot=$(at $at_port $at_command | grep \"+SMSIMCFG:\" | awk -F',' '{print $2}' | sed 's/\\r//g')\n\n    #IMEI（国际移动设备识别码）\n    at_command=\"AT+CGSN\"\n    imei=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n\n    #SIM Status（SIM状态）\n    at_command=\"AT+CPIN?\"\n    sim_status_flag=$(at $at_port $at_command | sed -n '2p')\n    sim_status=$(get_sim_status \"$sim_status_flag\")\n\n    if [ \"$sim_status\" != \"ready\" ]; then\n        return\n    fi\n\n    #ISP（互联网服务提供商）\n    at_command=\"AT+COPS?\"\n    isp=$(at $at_port $at_command | sed -n '2p' | awk -F'\"' '{print $2}')\n    # if [ \"$isp\" = \"CHN-CMCC\" ] || [ \"$isp\" = \"CMCC\" ]|| [ \"$isp\" = \"46000\" ]; then\n    #     isp=\"中国移动\"\n    # # elif [ \"$isp\" = \"CHN-UNICOM\" ] || [ \"$isp\" = \"UNICOM\" ] || [ \"$isp\" = \"46001\" ]; then\n    # elif [ \"$isp\" = \"CHN-UNICOM\" ] || [ \"$isp\" = \"CUCC\" ] || [ \"$isp\" = \"46001\" ]; then\n    #     isp=\"中国联通\"\n    # # elif [ \"$isp\" = \"CHN-CT\" ] || [ \"$isp\" = \"CT\" ] || [ \"$isp\" = \"46011\" ]; then\n    # elif [ \"$isp\" = \"CHN-TELECOM\" ] || [ \"$isp\" = \"CTCC\" ] || [ \"$isp\" = \"46011\" ]; then\n    #     isp=\"中国电信\"\n    # fi\n\n    #SIM Number（SIM卡号码，手机号）\n    at_command=\"AT+CNUM\"\n    sim_number=$(at $at_port $at_command | sed -n '2p' | awk -F'\"' '{print $4}')\n\n    #IMSI（国际移动用户识别码）\n    at_command=\"AT+CIMI\"\n    imsi=$(at $at_port $at_command | sed -n '2p' | sed 's/\\r//g')\n\n    #ICCID（集成电路卡识别码）\n    at_command=\"AT+ICCID\"\n    iccid=$(at $at_port $at_command | grep -o \"+ICCID:[ ]*[-0-9]\\+\" | grep -o \"[-0-9]\\{1,4\\}\")\n    class=\"SIM Information\"\n    case \"$sim_status\" in\n        \"ready\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"ISP\" \"$isp\" \"Internet Service Provider\"\n            add_plain_info_entry \"SIM Slot\" \"$sim_slot\" \"SIM Slot\"\n            add_plain_info_entry \"SIM Number\" \"$sim_number\" \"SIM Number\"\n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n            add_plain_info_entry \"IMSI\" \"$imsi\" \"International Mobile Subscriber Identity\" \n            add_plain_info_entry \"ICCID\" \"$iccid\" \"Integrate Circuit Card Identity\" \n        ;;\n        \"miss\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n        ;;\n        \"unknown\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n        ;;\n        *)\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"SIM Slot\" \"$sim_slot\" \"SIM Slot\" \n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n            add_plain_info_entry \"IMSI\" \"$imsi\" \"International Mobile Subscriber Identity\" \n            add_plain_info_entry \"ICCID\" \"$iccid\" \"Integrate Circuit Card Identity\" \n        ;;\n    esac\n}\n\n#网络信息\nnetwork_info()\n{\n    m_debug  \"Simcom network info\"\n\n    at_command=\"AT+CPSI?\"\n    network_type=$(at ${at_port} ${at_command} | grep \"+CPSI:\" | awk -F',' '{print $1}' | sed 's/+CPSI: //g')\n\n    [ -z \"$network_type\" ] && {\n        at_command='AT+COPS?'\n        local rat_num=$(at ${at_port} ${at_command} | grep \"+COPS:\" | awk -F',' '{print $4}' | sed 's/\\r//g')\n        network_type=$(get_rat ${rat_num})\n    }\n\n    class=\"Network Information\"\n    add_plain_info_entry \"Network Type\" \"$network_type\" \"Network Type\"\n}\n\n#获取频段\n# $1:网络类型\n# $2:频段数字\nget_band()\n{\n    local band\n    band=$(echo $1 | sed 's/^0-9//g')\n    echo \"$band\"\n}\n\nnormalize_hex_width()\n{\n    local value=\"$1\"\n    local width=\"$2\"\n    local hex\n\n    value=$(echo \"$value\" | tr -d '\\r' | xargs)\n    [ -z \"$value\" ] && value=\"0\"\n\n    case \"$value\" in\n        0x*|0X*) hex=${value#0x}; hex=${hex#0X} ;;\n        *) hex=$value ;;\n    esac\n\n    hex=$(echo \"$hex\" | tr 'a-f' 'A-F')\n    hex=$(echo \"$hex\" | grep -o '^[0-9A-F]\\+$')\n    [ -z \"$hex\" ] && hex=\"0\"\n\n    if [ ${#hex} -lt \"$width\" ]; then\n        hex=$(printf \"%0${width}s\" \"$hex\" | tr ' ' '0')\n    fi\n\n    echo \"0x$hex\"\n}\n\nget_lockband_nr()\n{\n    local at_port=\"$1\"\n    m_debug  \"Quectel sdx55 get lockband info\"\n    get_wcdma_config_command='AT+CSYSSEL=\"w_band\"'\n    get_lte_config_command='AT+CSYSSEL=\"lte_band\"'\n    get_nsa_nr_config_command='AT+CSYSSEL=\"nsa_nr5g_band\"'\n    get_sa_nr_config_command='AT+CSYSSEL=\"nr5g_band\"'\n    wcdma_avalible_band=\"1,2,3,4,5,6,8,9,19\"\n    lte_avalible_band=\"1,2,3,4,5,7,8,12,13,14,17,18,19,20,25,26,28,29,30,32,34,38,39,40,41,42,43,48,66,71\"\n    nsa_nr_avalible_band=\"1,2,3,5,7,8,12,20,28,38,40,41,48,66,71,77,78,79\"\n    sa_nr_avalible_band=\"1,2,3,5,7,8,12,20,28,38,40,41,48,66,71,77,78,79\"\n    [ -n $(uci -q get qmodem.$config_section.sa_band) ] && sa_nr_avalible_band=$(uci -q get qmodem.$config_section.sa_band | tr '/' ',')\n    [ -n $(uci -q get qmodem.$config_section.nsa_band) ] && nsa_nr_avalible_band=$(uci -q get qmodem.$config_section.nsa_band | tr '/' ',')\n    [ -n $(uci -q get qmodem.$config_section.lte_band) ] && lte_avalible_band=$(uci -q get qmodem.$config_section.lte_band | tr '/' ',')\n    [ -n $(uci -q get qmodem.$config_section.wcdma_band) ] && wcdma_avalible_band=$(uci -q get qmodem.$config_section.wcdma_band | tr '/' ',')\n    gw_band=$(at $at_port  $get_wcdma_config_command |grep -e \"+CSYSSEL: \" )\n    lte_band=$(at $at_port $get_lte_config_command|grep -e \"+CSYSSEL: \")\n    nsa_nr_band=$(at $at_port $get_nsa_nr_config_command|grep -e \"+CSYSSEL: \")\n    sa_nr_band=$(at $at_port  $get_sa_nr_config_command|grep -e \"+CSYSSEL: \")\n    json_add_object \"UMTS\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_object\n    json_close_object\n    json_add_object \"LTE\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n\n    json_add_object \"NR\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n    json_add_object \"NR_NSA\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n    for i in $(echo \"$wcdma_avalible_band\" | awk -F\",\" '{for(j=1; j<=NF; j++) print $j}'); do\n        json_select \"UMTS\"\n        json_select \"available_band\"\n        add_avalible_band_entry  \"$i\" \"UMTS_$i\"\n        json_select ..\n        json_select ..\n    done\n    for i in $(echo \"$lte_avalible_band\" | awk -F\",\" '{for(j=1; j<=NF; j++) print $j}'); do\n        json_select \"LTE\"\n        json_select \"available_band\"\n        add_avalible_band_entry  \"$i\" \"LTE_B$i\"\n        json_select ..\n        json_select ..\n    done\n    for i in $(echo \"$nsa_nr_avalible_band\" | awk -F\",\" '{for(j=1; j<=NF; j++) print $j}'); do\n        json_select \"NR_NSA\"\n        json_select \"available_band\"\n        add_avalible_band_entry  \"$i\" \"NSA_NR_N$i\"\n        json_select ..\n        json_select ..\n    done\n    for i in $(echo \"$sa_nr_avalible_band\" | awk -F\",\" '{for(j=1; j<=NF; j++) print $j}'); do\n        json_select \"NR\"\n        json_select \"available_band\"\n        add_avalible_band_entry  \"$i\" \"SA_NR_N$i\"\n        json_select ..\n        json_select ..\n    done\n    #+QNWPREFCFG: \"nr5g_band\",1:3:7:20:28:40:41:71:77:78:79\n    for i in $(echo \"$gw_band\" | cut -d, -f2 |tr -d '\\r' | awk -F\":\" '{for(j=1; j<=NF; j++) print $j}'); do\n        if [ -n \"$i\" ]; then\n            json_select \"UMTS\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select ..\n            json_select ..\n        fi\n    done\n    for i in $(echo \"$lte_band\" | cut -d, -f2|tr -d '\\r' | awk -F\":\" '{for(j=1; j<=NF; j++) print $j}'); do\n        if [ -n \"$i\" ]; then\n            json_select \"LTE\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select ..\n            json_select ..\n        fi\n    done\n    for i in $(echo \"$nsa_nr_band\" | cut -d, -f2|tr -d '\\r' | awk -F\":\" '{for(j=1; j<=NF; j++) print $j}'); do\n        if [ -n \"$i\" ]; then\n            json_select \"NR_NSA\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select ..\n            json_select ..\n        fi\n    done\n    for i in $(echo \"$sa_nr_band\" | cut -d, -f2|tr -d '\\r' | awk -F\":\" '{for(j=1; j<=NF; j++) print $j}'); do\n        if [ -n \"$i\" ]; then\n            json_select \"NR\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select ..\n            json_select ..\n        fi\n    done\n    json_close_array\n}\n\nconvert2band()\n{\n    local hex_band=\"$1\"\n    local hex\n\n    hex=$(echo \"$hex_band\" | tr -d '\\r' | tr 'a-f' 'A-F' | sed 's/^0X//')\n    hex=$(echo \"$hex\" | grep -o \"^[0-9A-F]\\{1,16\\}$\")\n    [ -z \"$hex\" ] && return\n\n    local band_list=\"\"\n    local bin\n    bin=$(echo \"ibase=16;obase=2;$hex\" | bc)\n    local len=${#bin}\n    local i\n    for i in $(seq 1 ${#bin}); do\n        if [ \"${bin:$((i-1)):1}\" = \"1\" ]; then\n            band_list=\"$band_list $((len - i + 1))\"\n        fi\n    done\n\n    echo \"$band_list\" | tr ' ' '\\n' | sort -n | tr '\\n' ' '\n}\n\nconvert2hex_lte()\n{\n    local band_list=\"$1\"\n    local hex=\"0\"\n    local band\n\n    band_list=$(echo \"$band_list\" | tr ', ' '\\n' | grep -E '^[0-9]+$' | sort -n | uniq)\n    for band in $band_list; do\n        [ \"$band\" -le 0 ] && continue\n        local add_hex\n        add_hex=$(echo \"obase=16;2^($band - 1)\" | bc)\n        hex=$(echo \"obase=16;ibase=16;$hex + $add_hex\" | bc)\n    done\n\n    hex=$(echo \"$hex\" | tr 'a-f' 'A-F')\n    echo \"0x$hex\"\n}\n\nconvert2hex_lte_ext()\n{\n    local band_list=\"$1\"\n    local hex=\"0\"\n    local band\n    local ext_band\n\n    band_list=$(echo \"$band_list\" | tr ', ' '\\n' | grep -E '^[0-9]+$' | sort -n | uniq)\n    for band in $band_list; do\n        [ \"$band\" -le 32 ] && continue\n        ext_band=$((band - 32))\n        [ \"$ext_band\" -le 0 ] && continue\n        local add_hex\n        add_hex=$(echo \"obase=16;2^($ext_band - 1)\" | bc)\n        hex=$(echo \"obase=16;ibase=16;$hex + $add_hex\" | bc)\n    done\n\n    hex=$(echo \"$hex\" | tr 'a-f' 'A-F')\n    echo \"0x$hex\"\n}\n\nget_wcdma_band_name_lte()\n{\n    #手册是傻逼，实际计算的bitmap频段和手册上标注的频段不一样，实际频段=标注频段+1\n    band_num=$(($1))\n    case \"$1\" in\n        \"8\") echo \"GSM_DCS_1800\" ;;\n        \"9\") echo \"GSM_EGSM_900\" ;;\n        \"10\") echo \"GSM_PGSM_900\" ;;\n        \"17\") echo \"GSM_450\" ;;\n        \"18\") echo \"GSM_480\" ;;\n        \"19\") echo \"GSM_750\" ;;\n        \"20\") echo \"GSM_850\" ;;\n        \"21\") echo \"GSM_RGSM_900\" ;;\n        \"22\") echo \"GSM_PCS_1900\" ;;\n        \"23\") echo \"WCDMA_IMT_2000\" ;;\n        \"24\") echo \"WCDMA_PCS_1900\" ;;\n        \"25\") echo \"WCDMA_III_1700\" ;;\n        \"26\") echo \"WCDMA_IV_1700\" ;;\n        \"27\") echo \"WCDMA_850\" ;;\n        \"28\") echo \"WCDMA_800\" ;;\n        \"49\") echo \"WCDMA_VII_2600\" ;;\n        \"50\") echo \"WCDMA_VIII_900\" ;;\n        \"51\") echo \"WCDMA_IX_1700\" ;;\n        *) echo \"UMTS_B$1\" ;;\n    esac\n}\n\nget_lockband_lte(){\n    local at_port=\"$1\"\n    m_debug \"SimCom LTE platform get lockband info\"\n    \n    # WCDMA available bands\n    local gsm_available_band=\"7,8,9,16,17,18,19,20,21\"\n    local wcdma_available_band=\"22,23,24,25,26,27,48,49,50\"\n    [ -n \"$(uci -q get qmodem.$config_section.wcdma_band)\" ] && wcdma_available_band=$(uci -q get qmodem.$config_section.wcdma_band | tr '/' ',')\n    \n    # LTE available bands  \n    local lte_available_band=\"1,2,3,4,5,7,8,12,13,14,17,18,19,20,25,26,28,29,30,32,34,38,39,40,41,42,43,48,66,71\"\n    [ -n \"$(uci -q get qmodem.$config_section.lte_band)\" ] && lte_available_band=$(uci -q get qmodem.$config_section.lte_band | tr '/' ',')\n    \n    # Get current modem settings\n    local response=$(at $at_port \"AT+CNBP?\")\n    \n    # Parse response: +CNBP:<mode>[,<lte_mode>][,<lte_modeExt>][,<saveMode>]\n    local mode=$(echo \"$response\" | grep \"+CNBP:\" | sed 's/+CNBP://g' | sed 's/\\r//g' | cut -d',' -f1 | xargs)\n    local lte_mode=$(echo \"$response\" | grep \"+CNBP:\" | sed 's/+CNBP://g' | sed 's/\\r//g' | cut -d',' -f2 | xargs)\n    local lte_modeext=$(echo \"$response\" | grep \"+CNBP:\" | sed 's/+CNBP://g' | sed 's/\\r//g' | cut -d',' -f3 | xargs)\n    \n    # Parse WCDMA locked bands from mode\n    local wcdma_locked_bands=\"\"\n    if [ -n \"$mode\" ] && [ \"$mode\" != \"0\" ]; then\n        wcdma_locked_bands=$(convert2band \"$mode\")\n    fi\n    \n    # Parse LTE locked bands from lte_mode\n    local lte_locked_bands=\"\"\n    if [ -n \"$lte_mode\" ] && [ \"$lte_mode\" != \"0\" ]; then\n        lte_locked_bands=$(convert2band \"$lte_mode\")\n    fi\n    \n    # Parse extended LTE bands from lte_modeext\n    local lte_locked_bands_ext=\"\"\n    if [ -n \"$lte_modeext\" ] && [ \"$lte_modeext\" != \"0\" ]; then\n        lte_locked_bands_ext=$(convert2band \"$lte_modeext\")\n    fi\n    \n    # Combine all LTE bands\n    [ -n \"$lte_locked_bands_ext\" ] && lte_locked_bands=\"$lte_locked_bands $lte_locked_bands_ext\"\n    lte_locked_bands=$(echo \"$lte_locked_bands\" | xargs -n1 | sort -n | uniq | tr '\\n' ' ' | xargs)\n    \n    # Output JSON\n    json_add_object \"UMTS\"\n    json_add_array \"available_band\"\n    for i in $(echo \"$wcdma_available_band\" | tr ',' ' '); do\n        add_avalible_band_entry \"$i\" \"$(get_wcdma_band_name_lte \"$i\")\"\n    done\n    json_close_array\n    json_add_array \"lock_band\"\n    for i in $wcdma_locked_bands; do\n        json_add_string \"\" \"$i\"\n    done\n    json_close_array\n    json_close_object\n    \n    json_add_object \"LTE\"\n    json_add_array \"available_band\"\n    for i in $(echo \"$lte_available_band\" | tr ',' ' '); do\n        add_avalible_band_entry \"$i\" \"LTE_B$i\"\n    done\n    json_close_array\n    json_add_array \"lock_band\"\n    for i in $lte_locked_bands; do\n        json_add_string \"\" \"$i\"\n    done\n    json_close_array\n    json_close_object\n}\n\nget_lockband()\n{\n    json_add_object \"lockband\"\n    case \"$platform\" in\n        \"qualcomm\")\n            get_lockband_nr $at_port\n        ;;\n        \"lte\")\n            get_lockband_lte $at_port\n            ;;\n        *)\n            get_lockband_nr $at_port\n        ;;\n    esac\n    json_close_object\n}\n\nset_lockband_nr(){\n    lock_band=$(echo $lock_band | tr ',' ':')\n    case \"$band_class\" in\n        \"UMTS\") \n            at_command=\"AT+CSYSSEL=\\\"w_band\\\",$lock_band\"\n            res=$(at $at_port $at_command)\n            ;;\n        \"LTE\") \n            at_command=\"AT+CSYSSEL=\\\"lte_band\\\",$lock_band\"\n            res=$(at $at_port $at_command)\n            ;;\n        \"NR_NSA\")\n            at_command=\"AT+CSYSSEL=\\\"nsa_nr5g_band\\\",$lock_band\"\n            res=$(at $at_port $at_command)\n            ;;\n        \"NR\")\n            at_command=\"AT+CSYSSEL=\\\"nr5g_band\\\",$lock_band\"\n            res=$(at $at_port $at_command)\n            ;;\n    esac\n}\n\nset_lockband_lte(){\n    m_debug \"SimCom LTE platform set lockband info\"\n    case \"$band_class\" in\n        \"UMTS\")\n            # Convert WCDMA band list to hex format using bitmap\n            local wcdma_hex=$(convert2hex_lte \"$lock_band\")\n            wcdma_hex=$(normalize_hex_width \"$wcdma_hex\" 16)\n            at_command=\"AT+CNBP=$wcdma_hex\"\n            res=$(at $at_port $at_command)\n            ;;\n        \"LTE\")\n            # Convert LTE band list to hex format using bitmap\n            local lte_bands=$(echo $lock_band | cut -d' ' -f1-32 | tr ' ' ',')\n            local lte_ext_bands=$(echo $lock_band | awk '{for(i=1;i<=NF;i++) if($i>32) print $i}' | tr '\\n' ',')\n            \n            local lte_hex=$(convert2hex_lte \"$lte_bands\")\n            local lte_ext_hex=\"0x0\"\n            [ -n \"$lte_ext_bands\" ] && lte_ext_hex=$(convert2hex_lte_ext \"$lte_ext_bands\")\n                lte_hex=$(normalize_hex_width \"$lte_hex\" 16)\n                lte_ext_hex=$(normalize_hex_width \"$lte_ext_hex\" 4)\n            \n            # Set bands: mode format is 0x<wcdma_hex>\n            # Get current WCDMA bands first by reading\n            local response=$(at $at_port \"AT+CNBP?\")\n            local current_mode=$(echo \"$response\" | grep \"+CNBP:\" | sed 's/+CNBP://g' | sed 's/\\r//g' | cut -d',' -f1 | xargs)\n            [ -z \"$current_mode\" ] && current_mode=\"0x0\"\n                current_mode=$(normalize_hex_width \"$current_mode\" 16)\n            \n            at_command=\"AT+CNBP=$current_mode,$lte_hex,$lte_ext_hex,0\"\n            res=$(at $at_port $at_command)\n            ;;\n    esac\n}\n\n#设置锁频\nset_lockband()\n{\n    m_debug \"simcom set lockband info\"\n    config=$1\n    #{\"band_class\":\"UMTS\",\"lock_band\":\"1,2,3\"} or {\"band_class\":\"LTE\",\"lock_band\":\"1,2,3\"}\n    band_class=$(echo $config | jq -r '.band_class')\n    lock_band=$(echo $config | jq -r '.lock_band')\n    case \"$platform\" in\n        \"lte\")\n            set_lockband_lte\n            ;;\n        *)\n            set_lockband_nr\n        ;;\n    esac\n    json_select \"result\"\n    json_add_string \"set_lockband\" \"$res\"\n    json_add_string \"config\" \"$config\"\n    json_add_string \"band_class\" \"$band_class\"\n    json_add_string \"lock_band\" \"$lock_band\"\n    json_close_object\n}\n\nget_neighborcell_qualcomm(){\n    local at_command='AT+CPSI?'\n    nr_lock_check=\"AT+C5GCELLCFG?\"\n    lte_lock_check=\"AT+CCELLCFG?\"\n    lte_status=$(at $at_port $lte_lock_check | grep \"+CCELLCFG:\")    \n    if [ ! -z \"$lte_status\" ]; then\n        lte_lock_status=\"locked\"\n    else\n        lte_lock_status=\"\"\n    fi\n    lte_lock_freq=$(echo $lte_status | awk -F',' '{print $2}' | sed 's/\\r//g')\n    lte_lock_pci=$(echo $lte_status | awk -F',' '{print $1}' | sed 's/+CCELLCFG: //g' | sed 's/\\r//g')\n    nr_status=$(at $at_port $nr_lock_check | grep \"+C5GCELLCFG:\")\n    nr_lock_status=$(echo \"$nr_status\" | awk -F': ' '{print $2}' | xargs)\n    nr_lock_pci=$(echo \"$nr_status\" | awk -F',' '{print $2}' | xargs)\n    nr_lock_freq=$(echo \"$nr_status\" | awk -F',' '{print $3}' | xargs)\n    nr_lock_scs=$(echo \"$nr_status\" | awk -F',' '{print $4}' | xargs)\n    nr_lock_band=$(echo \"$nr_status\" | awk -F',' '{print $5}' | xargs)\n    if [ \"$nr_lock_status\" != \"0\" ]; then\n        nr_lock_status=\"locked\"\n    else\n        nr_lock_status=\"\"\n    fi\n\n    modem_status=$(at $at_port $at_command)\n    modem_status_net=$(echo \"$modem_status\"|grep \"+CPSI:\"|awk -F',' '{print $1}'|awk -F':' '{print $2}'|xargs)\n    modem_status_band=$(echo \"$modem_status\"|grep \"+CPSI:\"|awk -F',' '{print $7}'|awk -F'_' '{print $2}'|sed 's/BAND//g'|xargs)\n    if [ $modem_status_net == \"NR5G_SA\" ];then\n        scans=$(at $at_port \"AT+CNWSEARCH=\\\"nr5g\\\"\")\n        sleep 10\n        at $at_port \"AT+CNWSEARCH=\\\"nr5g\\\",3\" > /tmp/neighborcell\n    elif [ $modem_status_net == \"LTE\" ];then\n        at $at_port \"AT+CNWSEARCH=\\\"lte\\\",1\" > /tmp/neighborcell\n        sleep 5\n    fi\n    json_add_object \"Feature\"\n    json_add_string \"Unlock\" \"2\"\n    json_add_string \"Lock PCI\" \"1\"\n    json_add_string \"Reboot Modem\" \"4\"\n    json_add_string \"Manually Search\" \"3\"\n    json_close_object\n    json_add_array \"NR\"\n    json_close_array\n    json_add_array \"LTE\"\n    json_close_array\n    json_add_object \"lockcell_status\"\n    if [ -n \"$lte_lock_status\" ]; then\n        json_add_string \"LTE\" \"$lte_lock_status\"\n        json_add_string \"LTE_Freq\" \"$lte_lock_freq\"\n        json_add_string \"LTE_PCI\" \"$lte_lock_pci\"\n    else\n        json_add_string \"LTE\" \"unlock\"\n    fi\n    if [ -n \"$nr_lock_status\" ]; then\n        json_add_string \"NR\" \"$nr_lock_status\"\n        json_add_string \"NR_Freq\" \"$nr_lock_freq\"\n        json_add_string \"NR_PCI\" \"$nr_lock_pci\"\n        json_add_string \"NR_SCS\" \"$nr_lock_scs\"\n        json_add_string \"NR_Band\" \"$nr_lock_band\"\n    else\n        json_add_string \"NR\" \"unlock\"\n    fi\n    json_close_object\n    while read line; do\n        if [ -n \"$(echo $line | grep \"+NR_NGH_CELL:\")\" ] || [ -n \"$(echo $line | grep \"+LTE_CELL:\")\" ]; then\n            # CPSI: NR5G_SA,Online,460-01,0x6F4700,29869309958,95,NR5G_BAND78,627264,-800,-110,14\n        \n            case $line in\n                *WCDMA*)\n                    type=\"WCDMA\"\n                    \n                    arfcn=$(echo $line | awk -F',' '{print $4}')\n                    pci=$(echo $line | awk -F',' '{print $7}')\n                    rscp=$(echo $line | awk -F',' '{print $11}')\n                    ecno=$(echo $line | awk -F',' '{print $10}')\n                    ;;\n                *LTE_CELL*)\n                    type=\"LTE\"\n                    arfcn=$(echo $line | awk -F',' '{print $6}')\n                    pci=$(echo $line | awk -F',' '{print $7}')\n                    rsrp=$(echo $line | awk -F',' '{print $8}')\n                    rsrq=$(echo $line | awk -F',' '{print $9}')\n            band=$(echo $line | awk -F',' '{print $5}')\n            mnc=$(echo $line | awk -F',' '{print $2}')\n                    ;;\n                *NR_NGH_CELL*)\n                    type=\"NR\"\n                    arfcn=$(echo $line | awk -F',' '{print $1}'| awk -F':' '{print $2}'| xargs)\n                    pci=$(echo $line | awk -F',' '{print $2}')\n                    rsrp=$(echo $line | awk -F',' '{print $3}')\n                    rsrq=$(echo $line | awk -F',' '{print $4}')\n            band=$modem_status_band\n                    ;;\n            esac\n            json_select $type\n            json_add_object \"\"\n        json_add_string \"mnc\" \"$mnc\"\n            json_add_string \"arfcn\" \"$arfcn\"\n            json_add_string \"pci\" \"$pci\"\n            json_add_string \"rscp\" \"$rscp\"\n            json_add_string \"ecno\" \"$ecno\"\n            json_add_string \"rsrp\" \"$rsrp\"\n            json_add_string \"rsrq\" \"$rsrq\"\n            json_add_string \"band\" \"$band\"\n            json_close_object\n            json_select \"..\"\n        fi\n    done < /tmp/neighborcell\n}\n\nget_neighborcell(){\n    m_debug  \"quectel set lockband info\"\n    json_add_object \"neighborcell\"\n    case \"$platform\" in\n        \"qualcomm\")\n            get_neighborcell_qualcomm\n        ;;\n    esac\n    json_close_object\n}\n\nset_neighborcell(){\n    #at_port,func,celltype,arfcn,pci,scs,nrband\n    #  \"lockpci\" \"1\"\n    #  \"unlockcell\" \"2\"\n    #  \"manually search\" \"3\"\n    #  \"reboot modem\" \"4\"\n    json_param=$1\n# {\\\"rat\\\":1,\\\"pci\\\":\\\"113\\\",\\\"arfcn\\\":\\\"627264\\\",\\\"band\\\":\\\"\\\",\\\"scs\\\":0}\"\n    rat=$(echo $json_param | jq -r '.rat')\n    pci=$(echo $json_param | jq -r '.pci')\n    arfcn=$(echo $json_param | jq -r '.arfcn')\n    band=$(echo $json_param | jq -r '.band')\n    scs=$(echo $json_param | jq -r '.scs')\n    case $platform in\n        \"qualcomm\")\n            lockcell_qualcomm\n            ;;\n    esac\n    json_select \"result\"\n    json_add_string \"setlockcell\" \"$res\"\n    json_add_string \"rat\" \"$rat\"\n    json_add_string \"pci\" \"$pci\"\n    json_add_string \"arfcn\" \"$arfcn\"\n    json_add_string \"band\" \"$band\"\n    json_add_string \"scs\" \"$scs\"\n    json_close_object\n}\n\nlockcell_qualcomm(){\n    if [ -z \"$pci\" ] && [ -z \"$arfcn\" ]; then\n        unlock4g=\"AT+CCELLCFG=0\"\n        unlocknr='AT+C5GCELLCFG=\"unlock\"'\n        res1=$(at $at_port $unlocknr)\n        res2=$(at $at_port $unlock4g)\n        res=$res1,$res2\n    else\n        lock4g=\"AT+CCELLCFG=1,$pci,$arfcn;+CNMP=38\"\n        locknr=\"AT+C5GCELLCFG=\\\"pci\\\",$pci,$arfcn,$scs,$band;+CNMP=71\"\n        if [ $rat = \"1\" ]; then\n            res=$(at $at_port $locknr)\n        else\n            res=$(at $at_port $lock4g)\n        fi\n    fi\n   \n}\n\nunlockcell(){\n    unlock4g=\"AT+CCELLCFG=0\"\n        unlocknr='AT+C5GCELLCFG=\"unlock\"'\n    res2=$(at $1 $unlocknr)\n    res3=$(at $1 $unlock4g)\n}\n#UL_bandwidth\n# $1:上行带宽数字\nget_bandwidth()\n{\n    local network_type=\"$1\"\n    local bandwidth_num=\"$2\"\n\n    local bandwidth\n    case $network_type in\n        \"LTE\")\n            case $bandwidth_num in\n                \"0\") bandwidth=\"1.4\" ;;\n                \"1\") bandwidth=\"3\" ;;\n                \"2\"|\"3\"|\"4\"|\"5\") bandwidth=$((($bandwidth_num - 1) * 5)) ;;\n            esac\n        ;;\n        \"NR\")\n            case $bandwidth_num in\n                \"0\"|\"1\"|\"2\"|\"3\"|\"4\"|\"5\") bandwidth=$((($bandwidth_num + 1) * 5)) ;;\n                \"6\"|\"7\"|\"8\"|\"9\"|\"10\"|\"11\"|\"12\") bandwidth=$((($bandwidth_num - 2) * 10)) ;;\n                \"13\") bandwidth=\"200\" ;;\n                \"14\") bandwidth=\"400\" ;;\n            esac\n        ;;\n    esac\n    echo \"$bandwidth\"\n}\n\n#获取NR子载波间隔\n# $1:NR子载波间隔数字\nget_scs()\n{\n    local scs\n    case $1 in\n        \"0\") scs=\"15\" ;;\n        \"1\") scs=\"30\" ;;\n        \"2\") scs=\"60\" ;;\n        \"3\") scs=\"120\" ;;\n        \"4\") scs=\"240\" ;;\n        *) scs=$(awk \"BEGIN{ print 2^$1 * 15 }\") ;;\n    esac\n    echo \"$scs\"\n}\n\n#获取物理信道\n# $1:物理信道数字\nget_phych()\n{\n    local phych\n    case $1 in\n        \"0\") phych=\"DPCH\" ;;\n        \"1\") phych=\"FDPCH\" ;;\n    esac\n    echo \"$phych\"\n}\n\n#获取扩频因子\n# $1:扩频因子数字\nget_sf()\n{\n    local sf\n    case $1 in\n        \"0\"|\"1\"|\"2\"|\"3\"|\"4\"|\"5\"|\"6\"|\"7\") sf=$(awk \"BEGIN{ print 2^$(($1+2)) }\") ;;\n        \"8\") sf=\"UNKNOWN\" ;;\n    esac\n    echo \"$sf\"\n}\n\n#获取插槽格式\n# $1:插槽格式数字\nget_slot()\n{\n    local slot=$1\n    # case $1 in\n        # \"0\"|\"1\"|\"2\"|\"3\"|\"4\"|\"5\"|\"6\"|\"7\"|\"8\"|\"9\"|\"10\"|\"11\"|\"12\"|\"13\"|\"14\"|\"15\"|\"16\") slot=$1 ;;\n        # \"0\"|\"1\"|\"2\"|\"3\"|\"4\"|\"5\"|\"6\"|\"7\"|\"8\"|\"9\") slot=$1 ;;\n    # esac\n    echo \"$slot\"\n}\n\nprocess_signal_value() {\n    local value=\"$1\"\n    echo \"scale=1; $value / 10\" | bc | awk '{printf(\"%g\", $0)}'\n}\n#小区信息\ncell_info()\n{\n    m_debug  \"Quectel cell info\"\n\n    at_command1='AT+CPSI?'\n    at_command2='AT+CNWINFO?'\n    response1=$(at $at_port $at_command1)\n    response2=$(at $at_port $at_command2)\n\n    local lte=$(echo \"$response1\" | grep \"LTE\")\n    local nr5g_nsa=$(echo \"$response1\" | grep \"NR5G_NSA\")\n    local CNWINFO=$(echo \"$response2\" | grep \"+CNWINFO:\")\n    if [ -n \"$lte\" ] && [ -n \"$nr5g_nsa\" ] ; then\n        #EN-DC模式\n        network_mode=\"EN-DC Mode\"\n        #LTE\n        # +CPSI: LTE,Online,460-01,0x7496,251941991,203,EUTRAN-BAND8,3740,3,3,-92,-672,-418,14\n        # +CPSI: LTE,<OperationMode>[,<MCC>-<MNC>,<TAC>,<SCellID>,<PCellID>,<FrequencyBand>,<earfcn>,<dlbw>,<ulbw>,<RSRQ>,<RSRP>,<RSSI>,<RSSNR>]\n        endc_lte_duplex_mode=\"\"\n        endc_lte_mcc=$(echo \"$lte\" | awk -F',' '{print $3}' | awk -F'-' '{print $1}')\n        endc_lte_mnc=$(echo \"$lte\" | awk -F',' '{print $3}' | awk -F'-' '{print $2}')\n        endc_lte_cell_id=$(echo \"$lte\" | awk -F',' '{print $5}')\n        endc_lte_physical_cell_id=$(echo \"$lte\" | awk -F',' '{print $6}')\n        endc_lte_earfcn=$(echo \"$lte\" | awk -F',' '{print $8}')\n        endc_lte_freq_band_ind_num=$(echo \"$lte\" | awk -F',' '{print $7}')\n        endc_lte_freq_band_ind=$(get_band $endc_lte_freq_band_ind_num)\n        ul_bandwidth_num=$(echo \"$lte\" | awk -F',' '{print $10}')\n        endc_lte_ul_bandwidth=$(get_bandwidth \"LTE\" $ul_bandwidth_num)\n        dl_bandwidth_num=$(echo \"$lte\" | awk -F',' '{print $9}')\n        endc_lte_dl_bandwidth=$(get_bandwidth \"LTE\" $dl_bandwidth_num)\n        endc_lte_tac=$(echo \"$lte\" | awk -F',' '{print $4}')\n        endc_lte_rsrp=$(echo \"$lte\" | awk -F',' '{print $12}')\n        endc_lte_rsrp=$(process_signal_value $endc_lte_rsrp)\n        endc_lte_rsrq=$(echo \"$lte\" | awk -F',' '{print $11}')\n        endc_lte_rsrq=$(process_signal_value $endc_lte_rsrq)\n        endc_lte_rssi=$(echo \"$lte\" | awk -F',' '{print $13}')\n        endc_lte_rssi=$(process_signal_value $endc_lte_rssi)\n        endc_lte_sinr=$(echo \"$lte\" | awk -F',' '{print $14}')\n        endc_lte_cql=$(echo \"$CNWINFO\" | awk -F',' '{print $8}')\n        endc_lte_tx_power=\"\"\n        endc_lte_srxlev=\"\"\n        #NR5G-NSA\n        # +CPSI: NR5G_NSA,[<PCellID>,<FrequencyBand>,<earfcn/ssb>,<RSRP>,<RSRQ>,<SNR>,<scs>,<NR_dl_bw>]\n        endc_nr_mcc=\"\"\n        endc_nr_mnc=\"\"\n        endc_nr_physical_cell_id=$(echo \"$nr5g_nsa\" | awk -F',' '{print $2}')\n        endc_nr_rsrp=$(echo \"$nr5g_nsa\" | awk -F',' '{print $5}')\n        endc_nr_rsrp=$(process_signal_value $endc_nr_rsrp)\n        endc_nr_sinr=$(echo \"$nr5g_nsa\" | awk -F',' '{print $7}')\n        endc_nr_sinr=$(process_signal_value $endc_nr_sinr)\n        endc_nr_rsrq=$(echo \"$nr5g_nsa\" | awk -F',' '{print $6}')\n        endc_nr_rsrq=$(process_signal_value $endc_nr_rsrq)\n        endc_nr_arfcn=$(echo \"$nr5g_nsa\" | awk -F',' '{print $4}')\n        endc_nr_band_num=$(echo \"$nr5g_nsa\" | awk -F',' '{print $3}')\n        endc_nr_band=$(get_band $endc_nr_band_num)\n        nr_dl_bandwidth_num=$(echo \"$nr5g_nsa\" | awk -F',' '{print $9}')\n        endc_nr_dl_bandwidth=$(get_bandwidth \"NR\" $nr_dl_bandwidth_num)\n        scs_num=$(echo \"$nr5g_nsa\" | awk -F',' '{print $8}' | sed 's/\\r//g')\n        endc_nr_scs=$(get_scs $scs_num)\n    else\n        #SA，LTE，WCDMA模式\n        #+CPSI: NR5G_SA,<OperationMode>[,<MCC>-<MNC>,<TAC>,<SCellID>,<PCellID>,<FrequencyBand>,<earfcn>,<RSRP>,<RSRQ>,<SNR>]\n        response=$(echo \"$response1\" | grep \"+CPSI:\")\n        local rat=$(echo \"$response\" | awk -F',' '{print $1}' | sed 's/+CPSI: //g')\n        case $rat in\n            \"NR5G_SA\")\n                network_mode=\"NR5G-SA Mode\"\n                nr_duplex_mode=$(echo \"$response\" | awk -F',' '{print $2}')\n                nr_mcc=$(echo \"$response\" | awk -F',' '{print $3}' | awk -F'-' '{print $1}')\n                nr_mnc=$(echo \"$response\" | awk -F',' '{print $3}' | awk -F'-' '{print $2}')\n                nr_cell_id=$(echo \"$response\" | awk -F',' '{print $5}')\n                nr_physical_cell_id=$(echo \"$response\" | awk -F',' '{print $6}')\n                nr_tac=$(echo \"$response\" | awk -F',' '{print $4}')\n                nr_arfcn=$(echo \"$response\" | awk -F',' '{print $8}')\n                nr_band_num=$(echo \"$response\" | awk -F',' '{print $7}')\n                nr_band=$(get_band $nr_band_num)\n                nr_dl_bandwidth=$(echo $CNWINFO | awk -F',' '{print $11}')\n                nr_rsrp=$(echo \"$response\" | awk -F',' '{print $9}')\n                nr_rsrp=$(process_signal_value $nr_rsrp)\n                nr_rsrq=$(echo \"$response\" | awk -F',' '{print $10}')\n                nr_rsrq=$(process_signal_value $nr_rsrq)\n                nr_sinr=$(echo \"$response\" | awk -F',' '{print $11}')\n                nr_scs_num=\"\"\n                nr_scs=$(get_scs $nr_scs_num)\n                nr_rxlev=$(echo \"$CNWINFO\" | awk -F',' '{print $5}')\n                nr_cql=$(echo \"$CNWINFO\" | awk -F',' '{print $14}')\n                nr_dlmod=$(echo \"$CNWINFO\" | awk -F',' '{print $8}')\n                nr_ulmod=$(echo \"$CNWINFO\" | awk -F',' '{print $9}')\n                nr_tx_power=$(echo \"$CNWINFO\" | awk -F',' '{print $12}')\n                nr_rssi=$(echo \"$CNWINFO\" | awk -F',' '{print $13}')\n                nr_rssi=$(process_signal_value $nr_rssi)\n            ;;\n            \"LTE\")\n                # +CPSI: LTE,Online,460-01,0x7496,251941991,203,EUTRAN-BAND8,3740,3,3,-92,-672,-418,14\n                # +CPSI: LTE,<OperationMode>[,<MCC>-<MNC>,<TAC>,<SCellID>,<PCellID>,<FrequencyBand>,<earfcn>,<dlbw>,<ulbw>,<RSRQ>,<RSRP>,<RSSI>,<RSSNR>]\n                network_mode=\"LTE Mode\"\n                lte_mcc=$(echo \"$response\" | awk -F',' '{print $3}' | awk -F'-' '{print $1}')\n                lte_mnc=$(echo \"$response\" | awk -F',' '{print $3}' | awk -F'-' '{print $2}')\n                lte_cell_id=$(echo \"$response\" | awk -F',' '{print $5}')\n                lte_physical_cell_id=$(echo \"$response\" | awk -F',' '{print $6}')\n                lte_earfcn=$(echo \"$response\" | awk -F',' '{print $8}')\n                lte_freq_band_ind_num=$(echo \"$response\" | awk -F',' '{print $7}')\n                lte_freq_band_ind=$(get_band $lte_freq_band_ind_num)\n                ul_bandwidth_num=$(echo \"$response\" | awk -F',' '{print $10}')\n                lte_ul_bandwidth=$(get_bandwidth \"LTE\" $ul_bandwidth_num)\n                dl_bandwidth_num=$(echo \"$response\" | awk -F',' '{print $9}')\n                lte_dl_bandwidth=$(get_bandwidth \"LTE\" $dl_bandwidth_num)\n                lte_tac=$(echo \"$response\" | awk -F',' '{print $4}')\n                lte_rsrp=$(echo \"$response\" | awk -F',' '{print $12}')\n                lte_rsrp=$(process_signal_value $lte_rsrp)\n                lte_rsrq=$(echo \"$response\" | awk -F',' '{print $11}')\n                lte_rsrq=$(process_signal_value $lte_rsrq)\n                lte_rssi=$(echo \"$response\" | awk -F',' '{print $13}')\n                lte_rssi=$(process_signal_value $lte_rssi)\n                lte_sinr=$(echo \"$response\" | awk -F',' '{print $14}')\n                lte_cql=$(echo \"$CNWINFO\" | awk -F',' '{print $8}')\n                lte_tx_power=$(echo \"$CNWINFO\" | awk -F',' '{print $9}')\n                lte_srxlev=$(echo \"$CNWINFO\" | awk -F',' '{print $4}')\n            ;;\n            \"WCDMA\")\n                # +CPSI: <SystemMode>,<OperationMode>,<MCC>-<MNC>,<LAC>,<Cell ID>,<FrequencyBand>,<PSC>,<Freq>,<SSC>,<EC/IO>,<RSCP>,<Qual>,<RxLev>,<TXPWR>\n                # +CPSI: WCDMA,Online,460-01,0xA809,11122855,WCDMAIMT2000,279,10663,0,1.5,62,33,52,500\n                network_mode=\"WCDMA Mode\"\n                wcdma_mcc=$(echo \"$response\" | awk -F',' '{print $3}' | awk -F'-' '{print $1}')\n                wcdma_mnc=$(echo \"$response\" | awk -F',' '{print $3}' | awk -F'-' '{print $2}')\n                wcdma_lac=$(echo \"$response\" | awk -F',' '{print $4}')\n                wcdma_cell_id=$(echo \"$response\" | awk -F',' '{print $5}')\n                wcdma_uarfcn=$(echo \"$response\" | awk -F',' '{print $8}')\n                wcdma_psc=$(echo \"$response\" | awk -F',' '{print $7}')\n                wcdma_rscp=$(echo \"$response\" | awk -F',' '{print $11}')\n                wcdma_rscp=$(process_signal_value $wcdma_rscp)\n                wcdma_ecio=$(echo \"$response\" | awk -F',' '{print $10}')\n                wcdma_tx_power=$(echo \"$response\" | awk -F',' '{print $14}')\n                wcdma_rxlev=$(echo \"$CNWINFO\" | awk -F',' '{print $13}')\n            ;;\n        esac\n    fi\n    class=\"Cell Information\"\n    add_plain_info_entry \"network_mode\" \"$network_mode\" \"Network Mode\"\n    case $network_mode in\n    \"NR5G-SA Mode\")\n        add_plain_info_entry \"MMC\" \"$nr_mcc\" \"Mobile Country Code\"\n        add_plain_info_entry \"MNC\" \"$nr_mnc\" \"Mobile Network Code\"\n        add_plain_info_entry \"Duplex Mode\" \"$nr_duplex_mode\" \"Duplex Mode\"\n        add_plain_info_entry \"Cell ID\" \"$nr_cell_id\" \"Cell ID\"\n        add_plain_info_entry \"Physical Cell ID\" \"$nr_physical_cell_id\" \"Physical Cell ID\"\n        add_plain_info_entry \"TAC\" \"$nr_tac\" \"Tracking area code of cell served by neighbor Enb\"\n        add_plain_info_entry \"ARFCN\" \"$nr_arfcn\" \"Absolute Radio-Frequency Channel Number\"\n        add_plain_info_entry \"Band\" \"$nr_band\" \"Band\"\n        add_plain_info_entry \"DL Bandwidth\" \"$nr_dl_bandwidth\" \"DL Bandwidth\"\n        add_plain_info_entry \"CQI\" \"$nr_cql\" \"Channel Quality Indicator\"\n        add_plain_info_entry \"TX Power\" \"$nr_tx_power\" \"TX Power\"\n        add_plain_info_entry \"DL/UL MOD\" \"$nr_dlmod / $nr_ulmod\" \"DL/UL MOD\"\n        add_bar_info_entry \"RSRP\" \"$nr_rsrp\" \"Reference Signal Received Power\" -140 -44 dBm\n        add_bar_info_entry \"RSRQ\" \"$nr_rsrq\" \"Reference Signal Received Quality\" -19.5 -3 dB\n        add_bar_info_entry \"RSSI\" \"$nr_rssi\" \"Received Signal Strength Indicator\" -120 -20 dBm\n        add_bar_info_entry \"SINR\" \"$nr_sinr\" \"Signal to Interference plus Noise Ratio Bandwidth\" 0 30 dB\n        add_plain_info_entry \"RxLev\" \"$nr_rxlev\" \"Received Signal Level\"\n        add_plain_info_entry \"SCS\" \"$nr_scs\" \"SCS\"\n        add_plain_info_entry \"Srxlev\" \"$nr_srxlev\" \"Serving Cell Receive Level\"\n        ;;\n    \"EN-DC Mode\")\n        add_plain_info_entry \"LTE\" \"LTE\" \"\"\n        add_plain_info_entry \"MCC\" \"$endc_lte_mcc\" \"Mobile Country Code\"\n        add_plain_info_entry \"MNC\" \"$endc_lte_mnc\" \"Mobile Network Code\"\n        add_plain_info_entry \"Duplex Mode\" \"$endc_lte_duplex_mode\" \"Duplex Mode\"\n        add_plain_info_entry \"Cell ID\" \"$endc_lte_cell_id\" \"Cell ID\"\n        add_plain_info_entry \"Physical Cell ID\" \"$endc_lte_physical_cell_id\" \"Physical Cell ID\"\n        add_plain_info_entry \"EARFCN\" \"$endc_lte_earfcn\" \"E-UTRA Absolute Radio Frequency Channel Number\"\n        add_plain_info_entry \"Freq band indicator\" \"$endc_lte_freq_band_ind\" \"Freq band indicator\"\n        add_plain_info_entry \"Band\" \"$endc_lte_band\" \"Band\"\n        add_plain_info_entry \"UL Bandwidth\" \"$endc_lte_ul_bandwidth\" \"UL Bandwidth\"\n        add_plain_info_entry \"DL Bandwidth\" \"$endc_lte_dl_bandwidth\" \"DL Bandwidth\"\n        add_plain_info_entry \"TAC\" \"$endc_lte_tac\" \"Tracking area code of cell served by neighbor Enb\"\n        add_bar_info_entry \"RSRP\" \"$endc_lte_rsrp\" \"Reference Signal Received Power\" -140 -44 dBm\n        add_bar_info_entry \"RSRQ\" \"$endc_lte_rsrq\" \"Reference Signal Received Quality\" -19.5 -3 dB\n        add_bar_info_entry \"RSSI\" \"$endc_lte_rssi\" \"Received Signal Strength Indicator\" -120 -20 dBm\n        add_bar_info_entry \"SINR\" \"$endc_lte_sinr\" \"Signal to Interference plus Noise Ratio Bandwidth\" 0 30 dB\n        add_plain_info_entry \"RxLev\" \"$endc_lte_rxlev\" \"Received Signal Level\"\n        add_plain_info_entry \"RSSNR\" \"$endc_lte_rssnr\" \"Radio Signal Strength Noise Ratio\"\n        add_plain_info_entry \"CQI\" \"$endc_lte_cql\" \"Channel Quality Indicator\"\n        add_plain_info_entry \"TX Power\" \"$endc_lte_tx_power\" \"TX Power\"\n        add_plain_info_entry \"Srxlev\" \"$endc_lte_srxlev\" \"Serving Cell Receive Level\"\n        add_plain_info_entry NR5G-NSA \"NR5G-NSA\" \"\"\n        add_plain_info_entry \"MCC\" \"$endc_nr_mcc\" \"Mobile Country Code\"\n        add_plain_info_entry \"MNC\" \"$endc_nr_mnc\" \"Mobile Network Code\"\n        add_plain_info_entry \"Physical Cell ID\" \"$endc_nr_physical_cell_id\" \"Physical Cell ID\"\n        add_plain_info_entry \"ARFCN\" \"$endc_nr_arfcn\" \"Absolute Radio-Frequency Channel Number\"\n        add_plain_info_entry \"Band\" \"$endc_nr_band\" \"Band\"\n        add_plain_info_entry \"DL Bandwidth\" \"$endc_nr_dl_bandwidth\" \"DL Bandwidth\"\n        add_bar_info_entry \"RSRP\" \"$endc_nr_rsrp\" \"Reference Signal Received Power\" -140 -44 dBm\n        add_bar_info_entry \"RSRQ\" \"$endc_nr_rsrq\" \"Reference Signal Received Quality\" -19.5 -3 dB\n        add_bar_info_entry \"SINR\" \"$endc_nr_sinr\" \"Signal to Interference plus Noise Ratio Bandwidth\" 0 30 dB\n        add_plain_info_entry \"SCS\" \"$endc_nr_scs\" \"SCS\"\n        ;;\n    \"LTE Mode\")\n        add_plain_info_entry \"MCC\" \"$lte_mcc\" \"Mobile Country Code\"\n        add_plain_info_entry \"MNC\" \"$lte_mnc\" \"Mobile Network Code\"\n        add_plain_info_entry \"Duplex Mode\" \"$lte_duplex_mode\" \"Duplex Mode\"\n        add_plain_info_entry \"Cell ID\" \"$lte_cell_id\" \"Cell ID\"\n        add_plain_info_entry \"Physical Cell ID\" \"$lte_physical_cell_id\" \"Physical Cell ID\"\n        add_plain_info_entry \"EARFCN\" \"$lte_earfcn\" \"E-UTRA Absolute Radio Frequency Channel Number\"\n        add_plain_info_entry \"Freq band indicator\" \"$lte_freq_band_ind\" \"Freq band indicator\"\n        add_plain_info_entry \"UL Bandwidth\" \"$lte_ul_bandwidth\" \"UL Bandwidth\"\n        add_plain_info_entry \"DL Bandwidth\" \"$lte_dl_bandwidth\" \"DL Bandwidth\"\n        add_plain_info_entry \"TAC\" \"$lte_tac\" \"Tracking area code of cell served by neighbor Enb\"\n        add_bar_info_entry \"RSRP\" \"$lte_rsrp\" \"Reference Signal Received Power\" -140 -44 dBm\n        add_bar_info_entry \"RSRQ\" \"$lte_rsrq\" \"Reference Signal Received Quality\" -19.5 -3 dB\n        add_bar_info_entry \"RSSI\" \"$lte_rssi\" \"Received Signal Strength Indicator\" -120 -22 dBm\n        add_bar_info_entry \"SINR\" \"$lte_sinr\" \"Signal to Interference plus Noise Ratio Bandwidth\" 0 30 dB\n        add_plain_info_entry \"CQI\" \"$lte_cql\" \"Channel Quality Indicator\"\n        add_plain_info_entry \"TX Power\" \"$lte_tx_power\" \"TX Power\"\n        add_plain_info_entry \"Srxlev\" \"$lte_srxlev\" \"Serving Cell Receive Level\"\n        ;;\n    \"WCDMA Mode\")\n        add_plain_info_entry \"MCC\" \"$wcdma_mcc\" \"Mobile Country Code\"\n        add_plain_info_entry \"MNC\" \"$wcdma_mnc\" \"Mobile Network Code\"\n        add_plain_info_entry \"LAC\" \"$wcdma_lac\" \"Location Area Code\"\n        add_plain_info_entry \"Cell ID\" \"$wcdma_cell_id\" \"Cell ID\"\n        add_plain_info_entry \"UARFCN\" \"$wcdma_uarfcn\" \"Uplink Absolute Radio Frequency Channel Number\"\n        add_plain_info_entry \"PSC\" \"$wcdma_psc\" \"Primary Scrambling Code\"\n        add_bar_info_entry \"RSCP\" \"$wcdma_rscp\" \"Received Signal Code Power\" -120 -24 dBm\n        add_bar_info_entry \"EC/IO\" \"$wcdma_ecio\" \"Ec/Io\" -30 -5 dB\n        add_plain_info_entry \"Tx Power\" \"$wcdma_tx_power\" \"Tx Power\"\n        add_plain_info_entry \"RxLev\" \"$wcdma_rxlev\" \"Received Signal Level\"\n        ;;\n    esac\n}\n\nfunction vendor_get_disabled_features(){\n    case $platform in\n        \"lte\")\n            json_add_string \"\" \"NeighborCell\"\n            ;;\n    esac\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/qmodem/vendor/telit.sh",
    "content": "#!/bin/sh\n# Copyright (C) 2025 sfwtw <sfwtw@qq.com>\n_Vendor=\"telit\"\n_Author=\"sfwtw\"\n_Maintainer=\"sfwtw <sfwtw@qq.com>\"\nsource /usr/share/qmodem/generic.sh\ndebug_subject=\"telit_ctrl\"\n\nvendor_get_disabled_features()\n{\n    json_add_string \"\" \"IMEI\"\n    json_add_string \"\" \"NeighborCell\"\n}\n\nget_mode()\n{\n    at_command='AT#USBCFG?'\n    local mode_num=$(at ${at_port} ${at_command} | grep -o \"#USBCFG:\" | awk -F': ' '{print $2}')\n    case \"$mode_num\" in\n        \"0\") mode=\"rndis\" ;;\n        \"1\") mode=\"qmi\" ;;\n        \"2\") mode=\"mbim\" ;;\n        \"3\") mode=\"ecm\" ;;\n        *) mode=\"${mode_num}\" ;;\n    esac\n    available_modes=$(uci -q get qmodem.$config_section.modes)\n    json_add_object \"mode\"\n    for available_mode in $available_modes; do\n        if [ \"$mode\" = \"$available_mode\" ]; then\n            json_add_string \"$available_mode\" \"1\"\n        else\n            json_add_string \"$available_mode\" \"0\"\n        fi\n    done\n    json_close_object\n}\n\nset_mode()\n{\n    local mode=$1\n    case $mode in\n        \"rndis\") mode=\"0\" ;;\n        \"qmi\") mode=\"1\" ;;\n        \"mbim\") mode=\"2\" ;;\n        \"ecm\") mode=\"3\" ;;\n        *) echo \"Invalid mode\" && return 1;;\n    esac\n    at_command='AT#USBCFG='${mode}\n    res=$(at \"${at_port}\" \"${at_command}\")\n    json_select \"result\"\n    json_add_string \"set_mode\" \"$res\"\n    json_close_object\n}\n\nget_network_prefer()\n{\n    at_command='AT+WS46?'\n    local response=$(at ${at_port} ${at_command} | grep \"+WS46:\" | awk -F': ' '{print $2}' | sed 's/\\r//g')\n    \n    network_prefer_3g=\"0\";\n    network_prefer_4g=\"0\";\n    network_prefer_5g=\"0\";\n\n    #匹配不同的网络类型\n    local auto=$(echo \"${response}\" | grep \"38\")\n    if [ -n \"$auto\" ]; then\n        network_prefer_3g=\"1\"\n        network_prefer_4g=\"1\"\n        network_prefer_5g=\"1\"\n    else\n        local wcdma=$(echo \"${response}\" | grep \"22\" || echo \"${response}\" | grep \"31\" || echo \"${response}\" | grep \"38\" || echo \"${response}\" | grep \"40\")\n        local lte=$(echo \"${response}\" | grep \"28\" || echo \"${response}\" | grep \"31\" || echo \"${response}\" | grep \"37\" || echo \"${response}\" | grep \"38\")\n        local nr=$(echo \"${response}\" | grep \"36\" || echo \"${response}\" | grep \"37\" || echo \"${response}\" | grep \"38\" || echo \"${response}\" | grep \"40\")\n        if [ -n \"$wcdma\" ]; then\n            network_prefer_3g=\"1\"\n        fi\n        if [ -n \"$lte\" ]; then\n            network_prefer_4g=\"1\"\n        fi\n        if [ -n \"$nr\" ]; then\n            network_prefer_5g=\"1\"\n        fi\n    fi\n    json_add_object network_prefer\n    json_add_string 3G $network_prefer_3g\n    json_add_string 4G $network_prefer_4g\n    json_add_string 5G $network_prefer_5g\n    json_close_object\n}\n\nset_network_prefer()\n{\n    network_prefer_3g=$(echo $1 |jq -r 'contains([\"3G\"])')\n    network_prefer_4g=$(echo $1 |jq -r 'contains([\"4G\"])')\n    network_prefer_5g=$(echo $1 |jq -r 'contains([\"5G\"])')\n    length=$(echo $1 |jq -r 'length')\n\n    case \"$length\" in\n        \"1\")\n            if [ \"$network_prefer_3g\" = \"true\" ]; then\n                network_prefer_config=\"22\"\n            elif [ \"$network_prefer_4g\" = \"true\" ]; then\n                network_prefer_config=\"28\"\n            elif [ \"$network_prefer_5g\" = \"true\" ]; then\n                network_prefer_config=\"36\"\n            fi\n        ;;\n        \"2\")\n            if [ \"$network_prefer_3g\" = \"true\" ] && [ \"$network_prefer_4g\" = \"true\" ]; then\n                network_prefer_config=\"31\"\n            elif [ \"$network_prefer_3g\" = \"true\" ] && [ \"$network_prefer_5g\" = \"true\" ]; then\n                network_prefer_config=\"40\"\n            elif [ \"$network_prefer_4g\" = \"true\" ] && [ \"$network_prefer_5g\" = \"true\" ]; then\n                network_prefer_config=\"37\"\n            fi\n        ;;\n        \"3\") network_prefer_config=\"38\" ;;\n        *) network_prefer_config=\"38\" ;;\n    esac\n\n    at_command='AT+WS46='${network_prefer_config}\n    at \"${at_port}\" \"${at_command}\"\n}\n\nget_voltage()\n{\n    at_command=\"AT#CBC\"\n    local voltage=$(at ${at_port} ${at_command} | grep \"#CBC:\" | awk -F',' '{print $2}' | sed 's/\\r//g')\n    [ -n \"$voltage\" ] && {\n        voltage=$(awk \"BEGIN {printf \\\"%.2f\\\", $voltage / 100}\")\n        add_plain_info_entry \"voltage\" \"$voltage V\" \"Voltage\" \n    }\n}\n\nget_temperature()\n{   \n    at_command=\"AT#TEMPSENS=2\"\n    local temp\n    QTEMP=$(at ${at_port} ${at_command} | grep \"#TEMPSENS: TSENS,\")\n    temp=$(echo $QTEMP | awk -F',' '{print $2}' | sed 's/\\r//g')\n    if [ -n \"$temp\" ]; then\n        temp=\"${temp}$(printf \"\\xc2\\xb0\")C\"\n    fi\n    add_plain_info_entry \"temperature\" \"$temp\" \"Temperature\"\n}\n\nbase_info()\n{\n    m_debug  \"Telit base info\"\n\n    #Name（名称）\n    at_command=\"AT+CGMM\"\n    name=$(at $at_port $at_command | sed -n '3p' | sed 's/\\r//g')\n    #Manufacturer（制造商）\n    at_command=\"AT+CGMI\"\n    manufacturer=$(at $at_port $at_command | sed -n '3p' | sed 's/\\r//g')\n    #Revision（固件版本）\n    at_command=\"AT+CGMR\"\n    revision=$(at $at_port $at_command | sed -n '3p' | sed 's/\\r//g')\n    class=\"Base Information\"\n    add_plain_info_entry \"name\" \"$name\" \"Name\"\n    add_plain_info_entry \"manufacturer\" \"$manufacturer\" \"Manufacturer\"\n    add_plain_info_entry \"revision\" \"$revision\" \"Revision\"\n    add_plain_info_entry \"at_port\" \"$at_port\" \"AT Port\"\n    get_temperature\n    get_voltage\n    get_connect_status\n}\n\nsim_info()\n{\n    m_debug  \"Telit sim info\"\n    \n    #SIM Slot（SIM卡卡槽）\n    at_command=\"AT#QSS?\"\n    sim_slot=$(at $at_port $at_command | grep \"#QSS:\" | awk -F',' '{print $3}' | sed 's/\\r//g')\n    if [ \"$sim_slot\" = \"0\" ]; then\n        sim_slot=\"1\"\n    elif [ \"$sim_slot\" = \"1\" ]; then\n        sim_slot=\"2\"\n    fi\n    #IMEI（国际移动设备识别码）\n    at_command=\"AT+CGSN\"\n    imei=$(at $at_port $at_command | sed -n '3p' | sed 's/\\r//g')\n\n    #SIM Status（SIM状态）\n    at_command=\"AT+CPIN?\"\n    sim_status_flag=$(at $at_port $at_command | sed -n '3p')\n    sim_status=$(get_sim_status \"$sim_status_flag\")\n\n    if [ \"$sim_status\" != \"ready\" ]; then\n        return\n    fi\n\n    #ISP（互联网服务提供商）\n    at_command=\"AT+COPS?\"\n    isp=$(at $at_port $at_command | sed -n '3p' | awk -F'\"' '{print $2}')\n    # if [ \"$isp\" = \"CHN-CMCC\" ] || [ \"$isp\" = \"CMCC\" ]|| [ \"$isp\" = \"46000\" ]; then\n    #     isp=\"中国移动\"\n    # # elif [ \"$isp\" = \"CHN-UNICOM\" ] || [ \"$isp\" = \"UNICOM\" ] || [ \"$isp\" = \"46001\" ]; then\n    # elif [ \"$isp\" = \"CHN-UNICOM\" ] || [ \"$isp\" = \"CUCC\" ] || [ \"$isp\" = \"46001\" ]; then\n    #     isp=\"中国联通\"\n    # # elif [ \"$isp\" = \"CHN-CT\" ] || [ \"$isp\" = \"CT\" ] || [ \"$isp\" = \"46011\" ]; then\n    # elif [ \"$isp\" = \"CHN-TELECOM\" ] || [ \"$isp\" = \"CTCC\" ] || [ \"$isp\" = \"46011\" ]; then\n    #     isp=\"中国电信\"\n    # fi\n\n    #IMSI（国际移动用户识别码）\n    at_command=\"AT+CIMI\"\n    imsi=$(at $at_port $at_command | sed -n '3p' | sed 's/\\r//g')\n\n    #ICCID（集成电路卡识别码）\n    at_command=\"AT+ICCID\"\n    iccid=$(at $at_port $at_command | grep -o \"+ICCID:[ ]*[-0-9]\\+\" | grep -o \"[-0-9]\\{1,4\\}\")\n    class=\"SIM Information\"\n    case \"$sim_status\" in\n        \"ready\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"ISP\" \"$isp\" \"Internet Service Provider\"\n            add_plain_info_entry \"SIM Slot\" \"$sim_slot\" \"SIM Slot\"\n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n            add_plain_info_entry \"IMSI\" \"$imsi\" \"International Mobile Subscriber Identity\" \n            add_plain_info_entry \"ICCID\" \"$iccid\" \"Integrate Circuit Card Identity\" \n        ;;\n        \"miss\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n        ;;\n        \"unknown\")\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n        ;;\n        *)\n            add_plain_info_entry \"SIM Status\" \"$sim_status\" \"SIM Status\" \n            add_plain_info_entry \"SIM Slot\" \"$sim_slot\" \"SIM Slot\" \n            add_plain_info_entry \"IMEI\" \"$imei\" \"International Mobile Equipment Identity\" \n            add_plain_info_entry \"IMSI\" \"$imsi\" \"International Mobile Subscriber Identity\" \n            add_plain_info_entry \"ICCID\" \"$iccid\" \"Integrate Circuit Card Identity\" \n        ;;\n    esac\n}\n\nnetwork_info()\n{\n    m_debug  \"Telit network info\"\n\n    at_command=\"AT#CAMETRICS=1;#CAMETRICS?\"\n    network_type=$(at ${at_port} ${at_command} | grep \"#CAMETRICS:\" | awk -F',' '{print $3}')\n\n    at_command=\"AT#CQI\"\n    response=$(at ${at_port} ${at_command} | grep \"#CQI:\" | sed 's/#CQI: //g' | sed 's/\\r//g')\n\n    if [ -n \"$response\" ]; then\n        cqi=$(echo \"$response\" | cut -d',' -f1)\n        second_value=$(echo \"$response\" | cut -d',' -f2)\n        [ \"$cqi\" = \"31\" ] && cqi=\"$second_value\"\n    fi\n\n    class=\"Network Information\"\n    add_plain_info_entry \"Network Type\" \"$network_type\" \"Network Type\"\n    add_plain_info_entry \"CQI DL\" \"$cqi\" \"Channel Quality Indicator for Downlink\"\n}\n\nlte_hex_to_bands() {\n    local hex_value=\"$1\"\n    local result=\"\"\n    hex_value=$(echo \"$hex_value\" | tr 'a-z' 'A-Z')\n    local decimal=$(echo \"ibase=16; $hex_value\" | bc)\n    local i=1\n    while [ \"$decimal\" != \"0\" ]; do\n        local bit=$(echo \"$decimal % 2\" | bc)\n        if [ \"$bit\" -eq 1 ]; then\n            result=\"$result B$i\"\n        fi\n        decimal=$(echo \"$decimal / 2\" | bc)\n        i=$(expr $i + 1)\n    done\n    result=$(echo \"$result\" | tr -s ' ' | sed -e 's/^ *//' -e 's/ *$//')\n    echo \"$result\"\n}\n\nlte_bands_to_hex() {\n    local bands=\"$1\"\n    local decimal_value=0\n    for band in $bands; do\n        local band_num=$(echo \"$band\" | sed 's/^B//')\n        local bit_value=$(echo \"2^($band_num-1)\" | bc)\n        decimal_value=$(echo \"$decimal_value + $bit_value\" | bc)\n    done\n    local hex_value=$(echo \"obase=16; $decimal_value\" | bc)\n    echo \"$hex_value\"\n}\n\nnr_hex_to_bands() {\n    local hex_value=\"$1\"\n    local result=\"\"\n    hex_value=$(echo \"$hex_value\" | tr 'a-z' 'A-Z')\n    local decimal=$(echo \"ibase=16; $hex_value\" | bc)\n    local j=1\n    [ \"$2\" = \"65_128\" ] && j=65\n    while [ \"$decimal\" != \"0\" ]; do\n        local bit=$(echo \"$decimal % 2\" | bc)\n        if [ \"$bit\" -eq 1 ]; then\n            result=\"$result N$j\"\n        fi\n        decimal=$(echo \"$decimal / 2\" | bc)\n        j=$(expr $j + 1)\n    done\n    result=$(echo \"$result\" | tr -s ' ' | sed -e 's/^ *//' -e 's/ *$//')\n    echo \"$result\"\n}\n\nnr_bands_to_hex() {\n    local bands=\"$1\"\n    local decimal_value=0\n    local decimal_value_ext=0\n    for band in $bands; do\n        local band_num=$(echo \"$band\" | sed 's/^N//')\n        if expr \"$band_num\" : '[0-9][0-9]*$' >/dev/null; then\n            if [ $band_num -lt 65 ]; then\n                local bit_value=$(echo \"2^($band_num-1)\" | bc)\n                decimal_value=$(echo \"$decimal_value + $bit_value\" | bc)\n            else\n                local bit_value=$(echo \"2^($band_num-65)\" | bc)\n                decimal_value_ext=$(echo \"$decimal_value_ext + $bit_value\" | bc)\n            fi\n        fi\n    done\n    local hex_value=$(echo \"obase=16; $decimal_value\" | bc)\n    if [ \"$decimal_value_ext\" != \"0\" ]; then\n        local hex_value_ext=$(echo \"obase=16; $decimal_value_ext\" | bc)\n        echo \"${hex_value_ext}\"\n    else\n        echo \"$hex_value\"\n    fi\n}\n\nget_lockband()\n{\n    json_add_object \"lockband\"\n    m_debug \"Telit get lockband info\"\n    get_lockband_config_command=\"AT#BND?\"\n    get_available_band_command=\"AT#BND=?\"\n    get_lockband_config_res=$(at $at_port $get_lockband_config_command)\n    get_available_band_res=$(at $at_port $get_available_band_command)\n    json_add_object \"LTE\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n    json_add_object \"NR_NSA\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n    json_add_object \"NR\"\n    json_add_array \"available_band\"\n    json_close_array\n    json_add_array \"lock_band\"\n    json_close_array\n    json_close_object\n    lte_avalible_band=$(echo $get_available_band_res | grep -o \"#BND: ([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*)\" | sed 's/#BND: (\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\))/\\3/')\n    lte_avalible_band=$(lte_hex_to_bands \"$lte_avalible_band\")\n    nsa_nr_avalible_band_1_64=$(echo $get_available_band_res | grep -o \"#BND: ([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*)\" | sed 's/#BND: (\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\))/\\5/')\n    nsa_nr_avalible_band_65_128=$(echo $get_available_band_res | grep -o \"#BND: ([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*)\" | sed 's/#BND: (\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\))/\\6/')\n    nsa_nr_avalible_band=\"$(nr_hex_to_bands \"$nsa_nr_avalible_band_1_64\" \"1_64\") $(nr_hex_to_bands \"$nsa_nr_avalible_band_65_128\" \"65_128\")\"\n    sa_nr_avalible_band_1_64=$(echo $get_available_band_res | grep -o \"#BND: ([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*)\" | sed 's/#BND: (\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\))/\\7/')\n    sa_nr_avalible_band_65_128=$(echo $get_available_band_res | grep -o \"#BND: ([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*),([^)]*)\" | sed 's/#BND: (\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\)),(\\([^)]*\\))/\\8/')\n    sa_nr_avalible_band=\"$(nr_hex_to_bands \"$sa_nr_avalible_band_1_64\" \"1_64\") $(nr_hex_to_bands \"$sa_nr_avalible_band_65_128\" \"65_128\")\"\n    for i in $(echo \"$lte_avalible_band\" | awk -F\" \" '{for(j=1; j<=NF; j++) print $j}'); do\n        json_select \"LTE\"\n        json_select \"available_band\"\n        add_avalible_band_entry  \"$i\" \"$i\"\n        json_select ..\n        json_select ..\n    done\n    for i in $(echo \"$nsa_nr_avalible_band\" | awk -F\" \" '{for(j=1; j<=NF; j++) print $j}'); do\n        json_select \"NR_NSA\"\n        json_select \"available_band\"\n        add_avalible_band_entry  \"$i\" \"$i\"\n        json_select ..\n        json_select ..\n    done\n    for i in $(echo \"$sa_nr_avalible_band\" | awk -F\" \" '{for(j=1; j<=NF; j++) print $j}'); do\n        json_select \"NR\"\n        json_select \"available_band\"\n        add_avalible_band_entry  \"$i\" \"$i\"\n        json_select ..\n        json_select ..\n    done\n\n    lte_band=$(echo $get_lockband_config_res | awk -F \",\" '{print $3}')\n    lte_band=$(lte_hex_to_bands \"$lte_band\")\n    nsa_nr_band_1_64=$(echo $get_lockband_config_res | awk -F \",\" '{print $5}')\n    nsa_nr_band_65_128=$(echo $get_lockband_config_res | awk -F \",\" '{print $6}')\n    nsa_nr_band=\"$(nr_hex_to_bands \"$nsa_nr_band_1_64\" \"1_64\") $(nr_hex_to_bands \"$nsa_nr_band_65_128\" \"65_128\")\"\n    sa_nr_band_1_64=$(echo $get_lockband_config_res | awk -F \",\" '{print $7}')\n    sa_nr_band_65_128=$(echo $get_lockband_config_res | awk -F \",\" '{print $8}' | sed 's/\\r//g' | sed 's/ OK//g')\n    sa_nr_band=\"$(nr_hex_to_bands \"$sa_nr_band_1_64\" \"1_64\") $(nr_hex_to_bands \"$sa_nr_band_65_128\" \"65_128\")\"\n    for i in $(echo \"$lte_band\" | cut -d, -f2|tr -d '\\r' | awk -F\" \" '{for(j=1; j<=NF; j++) print $j}'); do\n        if [ -n \"$i\" ]; then\n            json_select \"LTE\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select ..\n            json_select ..\n        fi\n    done\n    for i in $(echo \"$nsa_nr_band\" | cut -d, -f2|tr -d '\\r' | awk -F\" \" '{for(j=1; j<=NF; j++) print $j}'); do\n        if [ -n \"$i\" ]; then\n            json_select \"NR_NSA\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select ..\n            json_select ..\n        fi\n    done\n    for i in $(echo \"$sa_nr_band\" | cut -d, -f2|tr -d '\\r' | awk -F\" \" '{for(j=1; j<=NF; j++) print $j}'); do\n        if [ -n \"$i\" ]; then\n            json_select \"NR\"\n            json_select \"lock_band\"\n            json_add_string \"\" \"$i\"\n            json_select ..\n            json_select ..\n        fi\n    done\n    json_close_array\n    json_close_object\n}\n\nset_lockband()\n{\n    m_debug  \"telit set lockband info\"\n    config=$1\n    #{\"band_class\":\"NR\",\"lock_band\":\"41,78,79\"}\n    band_class=$(echo $config | jq -r '.band_class')\n    lock_band=$(echo $config | jq -r '.lock_band')\n    lock_band=$(echo $lock_band | tr ',' ' ')\n    case \"$band_class\" in\n        \"LTE\") \n            lock_band=$(lte_bands_to_hex \"$lock_band\")\n            at_command=\"AT#BND=0,22,$lock_band\"\n            res=$(at $at_port $at_command)\n            ;;\n        \"NR_NSA\")\n            orig=$(at $at_port \"AT#BND?\")\n            orig_lte=$(echo $orig | awk -F \",\" '{print $3}')\n            orig_lte_ext=$(echo $orig | awk -F \",\" '{print $4}')\n\n            nr_bands_1_64=\"\"\n            nr_bands_65_128=\"\"\n            for band in $lock_band; do\n                band_num=$(echo \"$band\" | sed 's/^N//')\n                if [ \"$band_num\" -lt 65 ]; then\n                    nr_bands_1_64=\"$nr_bands_1_64 N$band_num\"\n                else\n                    nr_bands_65_128=\"$nr_bands_65_128 N$band_num\"\n                fi\n            done\n\n            nsa_nr_1_64=$(nr_bands_to_hex \"$nr_bands_1_64\" | cut -d',' -f1)\n            nsa_nr_65_128=$(nr_bands_to_hex \"$nr_bands_65_128\" | cut -d',' -f2)\n\n            [ -z \"$nsa_nr_1_64\" ] && nsa_nr_1_64=$orig_nsa_nr_1_64\n            [ -z \"$nsa_nr_65_128\" ] && nsa_nr_65_128=$orig_nsa_nr_65_128\n            \n            at_command=\"AT#BND=0,22,$orig_lte,$orig_lte_ext,$nsa_nr_1_64,$nsa_nr_65_128\"\n            res=$(at $at_port $at_command)\n            ;;\n        \"NR\")\n            orig=$(at $at_port \"AT#BND?\")\n            orig_lte=$(echo $orig | awk -F \",\" '{print $3}')\n            orig_lte_ext=$(echo $orig | awk -F \",\" '{print $4}')\n            orig_nsa_nr_1_64=$(echo $orig | awk -F \",\" '{print $5}')\n            orig_nsa_nr_65_128=$(echo $orig | awk -F \",\" '{print $6}')\n            orig_sa_nr_1_64=$(echo $orig | awk -F \",\" '{print $7}')\n            orig_sa_nr_65_128=$(echo $orig | awk -F \",\" '{print $8}' | sed 's/\\r//g' | sed 's/ OK//g')\n            nr_bands_1_64=\"\"\n            nr_bands_65_128=\"\"\n            for band in $lock_band; do\n                band_num=$(echo \"$band\" | sed 's/^N//')\n                if [ \"$band_num\" -lt 65 ]; then\n                    nr_bands_1_64=\"$nr_bands_1_64 N$band_num\"\n                else\n                    nr_bands_65_128=\"$nr_bands_65_128 N$band_num\"\n                fi\n            done\n\n            nr_1_64=$(nr_bands_to_hex \"$nr_bands_1_64\")\n            nr_65_128=$(nr_bands_to_hex \"$nr_bands_65_128\")\n\n            [ -z \"$nr_1_64\" ] && nr_1_64=$orig_sa_nr_1_64\n            [ -z \"$nr_65_128\" ] && nr_65_128=$orig_sa_nr_65_128\n            at_command=\"AT#BND=0,22,$orig_lte,$orig_lte_ext,$orig_nsa_nr_1_64,$orig_nsa_nr_65_128,$nr_1_64,$nr_65_128\"\n            res=$(at $at_port $at_command)\n            ;;\n    esac\n    json_select \"result\"\n    json_add_string \"set_lockband\" \"$res\"\n    json_add_string \"config\" \"$config\"\n    json_add_string \"band_class\" \"$band_class\"\n    json_add_string \"lock_band\" \"$lock_band\"\n    json_close_object\n}\n\ncalc_average() {\n    local values=\"$1\"\n    local sum=0\n    local count=0\n    \n    for val in $values; do\n        if [ -n \"$val\" ] && [ \"$val\" != \"NA\" ]; then\n            sum=$(echo \"$sum + $val\" | bc -l)\n            count=$((count + 1))\n        fi\n    done\n    \n    if [ $count -gt 0 ]; then\n        printf \"%.1f\" $(echo \"$sum / $count\" | bc -l)\n    else\n        echo \"NA\"\n    fi\n}\n\nconvert_band_number() {\n    local band_num=$1\n    case \"$band_num\" in\n        120) echo \"B1\" ;;\n        121) echo \"B2\" ;;\n        122) echo \"B3\" ;;\n        123) echo \"B4\" ;;\n        124) echo \"B5\" ;;\n        125) echo \"B6\" ;;\n        126) echo \"B7\" ;;\n        127) echo \"B8\" ;;\n        128) echo \"B9\" ;;\n        129) echo \"B10\" ;;\n        130) echo \"B11\" ;;\n        131) echo \"B12\" ;;\n        132) echo \"B13\" ;;\n        133) echo \"B14\" ;;\n        134) echo \"B17\" ;;\n        135) echo \"B33\" ;;\n        136) echo \"B34\" ;;\n        137) echo \"B35\" ;;\n        138) echo \"B36\" ;;\n        139) echo \"B37\" ;;\n        140) echo \"B38\" ;;\n        141) echo \"B39\" ;;\n        142) echo \"B40\" ;;\n        143) echo \"B18\" ;;\n        144) echo \"B19\" ;;\n        145) echo \"B20\" ;;\n        146) echo \"B21\" ;;\n        147) echo \"B24\" ;;\n        148) echo \"B25\" ;;\n        149) echo \"B41\" ;;\n        150) echo \"B42\" ;;\n        151) echo \"B43\" ;;\n        152) echo \"B23\" ;;\n        153) echo \"B26\" ;;\n        154) echo \"B32\" ;;\n        155) echo \"B125\" ;;\n        156) echo \"B126\" ;;\n        157) echo \"B127\" ;;\n        158) echo \"B28\" ;;\n        159) echo \"B29\" ;;\n        160) echo \"B30\" ;;\n        161) echo \"B66\" ;;\n        162) echo \"B250\" ;;\n        163) echo \"B46\" ;;\n        166) echo \"B71\" ;;\n        167) echo \"B47\" ;;\n        168) echo \"B48\" ;;\n        250) echo \"N1\" ;;\n        251) echo \"N2\" ;;\n        252) echo \"N3\" ;;\n        253) echo \"N5\" ;;\n        254) echo \"N7\" ;;\n        255) echo \"N8\" ;;\n        256) echo \"N20\" ;;\n        257) echo \"N28\" ;;\n        258) echo \"N38\" ;;\n        259) echo \"N41\" ;;\n        260) echo \"N50\" ;;\n        261) echo \"N51\" ;;\n        262) echo \"N66\" ;;\n        263) echo \"N70\" ;;\n        264) echo \"N71\" ;;\n        265) echo \"N74\" ;;\n        266) echo \"N75\" ;;\n        267) echo \"N76\" ;;\n        268) echo \"N77\" ;;\n        269) echo \"N78\" ;;\n        270) echo \"N79\" ;;\n        271) echo \"N80\" ;;\n        272) echo \"N81\" ;;\n        273) echo \"N82\" ;;\n        274) echo \"N83\" ;;\n        275) echo \"N84\" ;;\n        276) echo \"N85\" ;;\n        277) echo \"N257\" ;;\n        278) echo \"N258\" ;;\n        279) echo \"N259\" ;;\n        280) echo \"N260\" ;;\n        281) echo \"N261\" ;;\n        282) echo \"N12\" ;;\n        283) echo \"N25\" ;;\n        284) echo \"N34\" ;;\n        285) echo \"N39\" ;;\n        286) echo \"N40\" ;;\n        287) echo \"N65\" ;;\n        288) echo \"N86\" ;;\n        289) echo \"N48\" ;;\n        290) echo \"N14\" ;;\n        291) echo \"N13\" ;;\n        292) echo \"N18\" ;;\n        293) echo \"N26\" ;;\n        294) echo \"N30\" ;;\n        295) echo \"N29\" ;;\n        296) echo \"N53\" ;;\n        *) echo \"$band_num\" ;;\n    esac\n}\n\ncell_info()\n{\n    m_debug  \"Telit cell info\"\n\n    at_command=\"AT#CAINFOEXT?\"\n    ca_response=$(at ${at_port} ${at_command})\n\n    info_line=$(echo \"$ca_response\" | grep -o \"#CAINFOEXT: [^$]*\" | head -1)\n    ca_count=$(echo \"$info_line\" | awk -F',' '{print $1}' | awk -F': ' '{print $2}')\n    network_type_raw=$(echo \"$info_line\" | awk -F',' '{print $2}')\n    network_mode=$(echo \"$network_type_raw\" | tr -d ' ')\n\n    [ \"$ca_count\" -gt 1 ] && network_mode=\"$network_mode with $ca_count CA\"\n    pcc_line=$(echo \"$ca_response\" | grep \"PCC-\")\n    band_number=$(echo \"$pcc_line\" | grep -o \"BandClass: [^,]*\" | awk -F': ' '{print $2}')\n    band=$(convert_band_number \"$band_number\")\n    bw=$(echo \"$pcc_line\" | grep -o \"BW: [^,]*\" | awk -F': ' '{print $2}')\n    if [ -z \"$bw\" ]; then\n        dl_bw_raw=$(echo \"$pcc_line\" | grep -o \"DL_BW: [^,]*\" | awk -F': ' '{print $2}')\n        case \"$dl_bw_raw\" in\n            \"0\") bw=\"1.4 MHz\" ;;\n            \"1\") bw=\"3 MHz\" ;;\n            \"2\") bw=\"5 MHz\" ;;\n            \"3\") bw=\"10 MHz\" ;;\n            \"4\") bw=\"15 MHz\" ;;\n            \"5\") bw=\"20 MHz\" ;;\n            *) bw=\"$dl_bw_raw\" ;;\n        esac\n    fi\n    arfcn=$(echo \"$pcc_line\" | grep -o \"CH: [^,]*\" | awk -F': ' '{print $2}')\n    [ -z \"$arfcn\" ] && arfcn=$(echo \"$pcc_line\" | grep -o \"RX_CH: [^,]*\" | awk -F': ' '{print $2}')\n    pci=$(echo \"$pcc_line\" | grep -o \"PCI: [^,]*\" | awk -F': ' '{print $2}')\n    rsrp=$(echo \"$pcc_line\" | grep -o \"RSRP: [^,]*\" | awk -F': ' '{print $2}')\n    rsrq=$(echo \"$pcc_line\" | grep -o \"RSRQ: [^,]*\" | awk -F': ' '{print $2}')\n    rssi=$(echo \"$pcc_line\" | grep -o \"RSSI: [^,]*\" | awk -F': ' '{print $2}')\n    sinr_raw=$(echo \"$pcc_line\" | grep -o \"SINR: [^,]*\" | awk -F': ' '{print $2}')\n    sinr=$(printf \"%.1f\" $(echo \"-20 + ($sinr_raw * 0.2)\" | bc -l))\n    tac=$(echo \"$pcc_line\" | grep -o \"TAC: [^,]*\" | awk -F': ' '{print $2}')\n    tx_power=$(echo \"$pcc_line\" | grep -o \"TX_PWR: [^,]*\" | awk -F': ' '{print $2}')\n    [ -n \"$tx_power\" ] && tx_power=$(printf \"%.1f\" $(echo \"$tx_power / 10\" | bc -l))\n    [ -z \"$tx_power\" ] && tx_power=\"0\"\n    ul_mod=$(echo \"$pcc_line\" | grep -o \"UL_MOD: [^,]*\" | awk -F': ' '{print $2}')\n    dl_mod=$(echo \"$pcc_line\" | grep -o \"DL_MOD: [^,]*\" | awk -F': ' '{print $2}' | sed 's/[^0-9]//g')\n    case \"$ul_mod\" in\n        \"0\") ul_mod=\"BPSK\" ;;\n        \"1\") ul_mod=\"QPSK\" ;;\n        \"2\") ul_mod=\"16QAM\" ;;\n        \"3\") ul_mod=\"64QAM\" ;;\n        \"4\") ul_mod=\"256QAM\" ;;\n        *) ul_mod=\"$ul_mod\" ;;\n    esac\n\n    case \"$dl_mod\" in\n        \"0\") dl_mod=\"BPSK\" ;;\n        \"1\") dl_mod=\"QPSK\" ;;\n        \"2\") dl_mod=\"16QAM\" ;;\n        \"3\") dl_mod=\"64QAM\" ;;\n        \"4\") dl_mod=\"256QAM\" ;;\n        *) dl_mod=\"$dl_mod\" ;;\n    esac\n\n    if [ \"$ca_count\" -gt 1 ]; then\n        scc_band=\"\"\n        scc_bw=\"\"\n        scc_arfcn=\"\"\n        scc_pci=\"\"\n        scc_rsrp=\"\"\n        scc_rssi=\"\"\n        scc_rsrq=\"\"\n        scc_sinr=\"\"\n        for i in $(seq 0 $((ca_count-2))); do\n            scc_line=$(echo \"$ca_response\" | grep -A 1 \"SCC$i-\" | tr '\\r\\n' ' ')\n            if [ -n \"$scc_line\" ]; then\n                scc_band_number=$(echo \"$scc_line\" | grep -o \"BandClass: [^,]*\" | awk -F': ' '{print $2}')\n                scc_band_new=$(convert_band_number \"$scc_band_number\")\n                if [ -z \"$scc_band\" ]; then\n                    scc_band=\"$scc_band_new\"\n                else\n                    scc_band=\"$scc_band / $scc_band_new\"\n                fi\n                scc_bw_new=$(echo \"$scc_line\" | grep -o \"BW: [^,]*\" | awk -F': ' '{print $2}')\n                if [ -z \"$scc_bw_new\" ]; then\n                    scc_dl_bw=$(echo \"$scc_line\" | grep -o \"DL_BW: [^,]*\" | awk -F': ' '{print $2}')\n                    case \"$scc_dl_bw\" in\n                        \"0\") scc_bw_new=\"1.4 MHz\" ;;\n                        \"1\") scc_bw_new=\"3 MHz\" ;;\n                        \"2\") scc_bw_new=\"5 MHz\" ;;\n                        \"3\") scc_bw_new=\"10 MHz\" ;;\n                        \"4\") scc_bw_new=\"15 MHz\" ;;\n                        \"5\") scc_bw_new=\"20 MHz\" ;;\n                        *) scc_bw_new=\"$scc_dl_bw\" ;;\n                    esac\n                fi\n                if [ -z \"$scc_bw\" ]; then\n                    scc_bw=\"$scc_bw_new\"\n                else\n                    scc_bw=\"$scc_bw / $scc_bw_new\"\n                fi\n                scc_arfcn_new=$(echo \"$scc_line\" | grep -o \"CH: [^,]*\" | awk -F': ' '{print $2}')\n                [ -z \"$scc_arfcn_new\" ] && scc_arfcn_new=$(echo \"$scc_line\" | grep -o \"RX_CH: [^,]*\" | awk -F': ' '{print $2}')\n                if [ -z \"$scc_arfcn\" ]; then\n                    scc_arfcn=\"$scc_arfcn_new\"\n                else\n                    scc_arfcn=\"$scc_arfcn / $scc_arfcn_new\"\n                fi\n                scc_pci_new=$(echo \"$scc_line\" | grep -o \"PCI: [^,]*\" | awk -F': ' '{print $2}')\n                if [ -z \"$scc_pci\" ]; then\n                    scc_pci=\"$scc_pci_new\"\n                else\n                    scc_pci=\"$scc_pci / $scc_pci_new\"\n                fi\n                scc_rsrp_new=$(echo \"$scc_line\" | grep -o \"RSRP: [^,]*\" | awk -F': ' '{print $2}')\n                scc_rsrp=\"$scc_rsrp $scc_rsrp_new\"\n                scc_rssi_new=$(echo \"$scc_line\" | grep -o \"RSSI: [^,]*\" | awk -F': ' '{print $2}')\n                scc_rssi=\"$scc_rssi $scc_rssi_new\"\n                scc_rsrq_new=$(echo \"$scc_line\" | grep -o \"RSRQ: [^,]*\" | awk -F': ' '{print $2}')\n                scc_rsrq=\"$scc_rsrq $scc_rsrq_new\"\n                scc_sinr_raw=$(echo \"$scc_line\" | grep -o \"SINR: [^,]*\" | awk -F': ' '{print $2}')\n                scc_sinr_new=$(printf \"%.1f\" $(echo \"-20 + ($scc_sinr_raw * 0.2)\" | bc -l))\n                scc_sinr=\"$scc_sinr $scc_sinr_new\"\n            fi\n        done\n        arfcn=\"$arfcn / $scc_arfcn\"\n        band=\"$band / $scc_band\"\n        bw=\"$bw / $scc_bw\"\n        pci=\"$pci / $scc_pci\"\n        # rsrp=$(calc_average \"$rsrp $scc_rsrp\")\n        # rssi=$(calc_average \"$rssi $scc_rssi\")\n        # rsrq=$(calc_average \"$rsrq $scc_rsrq\")\n        # sinr=$(calc_average \"$sinr $scc_sinr\")\n    fi\n\n    class=\"Cell Information\"\n    add_plain_info_entry \"network_mode\" \"$network_mode\" \"Network Mode\"\n    add_plain_info_entry \"Band\" \"$band\" \"Band\"\n    add_plain_info_entry \"Bandwidth\" \"$bw\" \"Bandwidth\"\n    add_plain_info_entry \"ARFCN\" \"$arfcn\" \"Absolute Radio-Frequency Channel Number\"\n    add_plain_info_entry \"Physical Cell ID\" \"$pci\" \"Physical Cell ID\"\n    add_plain_info_entry \"TAC\" \"$tac\" \"Tracking Area Code\"\n    add_plain_info_entry \"DL/UL MOD\" \"$dl_mod / $ul_mod\" \"DL/UL MOD\"\n    add_plain_info_entry \"TX Power\" \"$tx_power\" \"TX Power\"\n    add_bar_info_entry \"RSRP\" \"$rsrp\" \"Reference Signal Received Power\" -140 -44 dBm\n    add_bar_info_entry \"RSRQ\" \"$rsrq\" \"Reference Signal Received Quality\" -19.5 -3 dB\n    add_bar_info_entry \"RSSI\" \"$rssi\" \"Received Signal Strength Indicator\" -120 -20 dBm\n    add_bar_info_entry \"SINR\" \"$sinr\" \"Signal to Interference plus Noise Ratio Bandwidth\" 0 30 dB\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/rpcd/acl.d/luci-app-qmodem.json",
    "content": "{\n\t\"luci-app-qmodem\": {\n\t\t\"description\": \"Grant UCI access for luci-app-qmodem\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"qmodem\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"qmodem\" ]\n\t\t}\n\t},\n\t\"luci-mod-status-index\": {\n\t\t\"description\": \"Grant access to main status display\",\n\t\t\"read\": {\n\t\t\t\"ubus\": {\n\t\t\t\t\"modem_ctrl\": [ \"info\",\"base_info\" ]\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem/files/usr/share/rpcd/acl.d/qmodem.json",
    "content": "{\n\t\"qmodem\": {\n\t\t\"description\": \"QModem control interface\",\n\t\t\"read\": {\n\t\t\t\"ubus\": {\n\t\t\t\t\"qmodem\": [\n\t\t\t\t\t\"*\"\n\t\t\t\t],\n\t\t\t\t\"rc\": [\n\t\t\t\t\t\"list\"\n\t\t\t\t],\n\t\t\t\t\"luci\": [\n\t\t\t\t\t\"setInitAction\"\n\t\t\t\t]\n\t\t\t}\n\t\t},\n\t\t\"write\": {\n\t\t\t\"ubus\": {\n\t\t\t\t\"qmodem\": [\n\t\t\t\t\t\"*\"\n\t\t\t\t],\n\t\t\t\t\"rc\": [\n\t\t\t\t\t\"list\"\n\t\t\t\t],\n\t\t\t\t\"luci\": [\n\t\t\t\t\t\"setInitAction\"\n\t\t\t\t]\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem_monitor/Makefile",
    "content": "include $(TOPDIR)/rules.mk\ninclude $(INCLUDE_DIR)/kernel.mk\n\n# Include unified version\ninclude ../../version.mk\n\nPKG_NAME:=qmodem_monitor\nPKG_RELEASE:=$(QMODEM_RELEASE)\nPKG_VERSION:=$(QMODEM_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n  PKGARCH:=all\n  SECTION:=utils\n  CATEGORY:=Utilities\n  TITLE:=QModem Network Monitor scripts\n  DEPENDS:=+qmodem\nendef\n\ndefine Package/$(PKG_NAME)/description\n\tQModem Network Monitor scripts\nendef\n\ndefine Build/Prepare\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t\t$(CP) ./files/* $(1)/\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem_monitor/files/etc/init.d/qmodem_monitor",
    "content": "#!/bin/sh /etc/rc.common\nSTART=99\nSTOP=13\nUSE_PROCD=1\nservice=\"$(basename ${basescript:-$initscript})\"\n. $IPKG_INSTROOT/lib/functions.sh\nservice_triggers()\n{\n\tprocd_add_reload_trigger \"qmodem\"\n\n}\n\nstart_service(){\n    _start_instances\n}\n\nstop_service(){\n    _stop_instances\n}\n\nreload_service()\n{\n    stop\n    start\n}\n\n_start_instances(){\n    config_load qmodem\n    config_foreach _start_instance modem-device\n}\n\n_stop_instances(){\n    config_load qmodem\n    config_foreach _stop_instance modem-device\n}\n\n_start_instance(){\n    local Modem_ID\n    Modem_ID=$1\n    config_load qmodem\n    config_get enabled $Modem_ID monitor_enabled 0\n    [ \"$enabled\" != \"1\" ] && return 0\n    config_get m_method $Modem_ID monitor_method\n    config_get interval $Modem_ID monitor_interval 15\n    config_get threshold $Modem_ID monitor_threshold 10\n    config_get ping_type $Modem_ID monitor_ping_type\n    config_get ping_dest $Modem_ID monitor_ping_dest\n    config_get ping_ip_version $Modem_ID monitor_ping_ip_version\n    config_get http_url $Modem_ID monitor_http_url\n    procd_open_instance \"m_$Modem_ID\"\n    procd_set_param command /usr/share/qmodem/modem_monitor.sh\n    procd_append_param command --modem_id \"$Modem_ID\"\n    procd_append_param command --method \"$m_method\"\n    procd_append_param command --interval \"$interval\"\n    procd_append_param command --threshold \"$threshold\"\n    [ -n \"$ping_type\" ] && procd_append_param command --ping-type \"$ping_type\"\n    [ -n \"$ping_dest\" ] && procd_append_param command --ping-dest \"$ping_dest\"\n    [ -n \"$ping_ip_version\" ] && procd_append_param command --ping-ip-version \"$ping_ip_version\"\n    [ -n \"$http_url\" ] && procd_append_param command --http-url \"$http_url\"\n    procd_close_instance\n\n}\n\n_stop_instance(){\n    :\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/qmodem_monitor/files/usr/share/qmodem/modem_monitor.sh",
    "content": "#!/bin/sh\n. /lib/functions.sh\n. /usr/share/qmodem/modem_util.sh\n# Envs\n# Modem_ID\n# Modem_ID=$1\n# Method=$2\n# Interval=$3\n# Threshold=$4\n# params1=$5\n# params2=$6\nparse_args(){\n    while [ $# -gt 0 ]; do\n        case $1 in\n            --modem_id)\n                Modem_ID=$2\n                shift 2\n                ;;\n            --method)\n                Method=$2\n                shift 2\n                ;;\n            --interval)\n                Interval=$2\n                shift 2\n                ;;\n            --threshold)\n                Threshold=$2\n                shift 2\n                ;;\n            --ping-type)\n                Ping_Type=$2\n                shift 2\n                ;;\n            --ping-dest)\n                Ping_Dest=$2\n                shift 2\n                ;;\n            --ping-ip-version)\n                Ping_IP_Version=$2\n                shift 2\n                ;;\n            --http-url)\n                Http_Url=$2\n                shift 2\n                ;;\n            *)\n                log \"Unknown argument: $1\"\n                exit 1\n                ;;\n        esac\n    done\n    [ -z \"$Modem_ID\" ] && log \"Modem_ID is empty\" && exit 1\n    [ -z \"$Method\" ] && log \"Method is empty\" && exit 1\n    [ -z \"$Interval\" ] && log \"Interval is empty\" && Interval=12\n    [ -z \"$Threshold\" ] && log \"Threshold is empty\" && Threshold=5\n}\n\n\nlog(){\n    logger -t qmodem_monitor \"$Modem_ID($Method): $@\"\n    #echo \"$Modem_ID($Method): $@\"\n}\n\nupdate_cfg(){\n\tconfig_load qmodem\n\tconfig_get AT_PORT \"$Modem_ID\" at_port\n\tconfig_get ALIAS \"$Modem_ID\" alias\n\tconfig_get USE_UBUS \"$Modem_ID\" use_ubus\n\t[ \"$USE_UBUS\" = \"1\" ] && use_ubus_flag=\"-u\"\n    log \"loaded config for modem $Modem_ID: at_port=$AT_PORT, alias=$ALIAS, use_ubus=$USE_UBUS\"\n}\n\nupdate_netcfg(){\n\t# if alias is set, network config name is alias else modem_cfg name\n\tconfig_load network\n\tif [ -n \"$ALIAS\" ]; then\n\t\tconfig_get NET_DEV \"$ALIAS\" ifname\n        Ifv4=\"$ALIAS\"\n\telse\n\t\tconfig_get NET_DEV \"$Modem_ID\" ifname\n        Ifv4=\"$Modem_ID\"\n\tfi\n    Ifv6=\"$Ifv4\"v6\n    v4_info=$(ifstatus $Ifv4)\n    v6_info=$(ifstatus $Ifv6)\n    dns_v4=$(echo $v4_info | jq -r --arg \"key\" \"dns-server\" '.[$key][0]')\n    dns_v6=$(echo $v6_info | jq -r --arg \"key\" \"dns-server\" '.[$key][0]')\n    gateway_v4=$(echo $v4_info | jq -r --arg \"key\" \"route\" '.[$key][] | select(.target == \"0.0.0.0\") | .nexthop')\n    gateway_v6=$(echo $v6_info | jq -r --arg \"key\" \"route\" '.[$key][] | select(.target == \"::\") | .nexthop')\n    is_up_v4=$(echo $v4_info | jq -r --arg \"key\" \"up\" '.[$key]')\n    is_up_v6=$(echo $v6_info | jq -r --arg \"key\" \"up\" '.[$key]')\n}\n\nwait_until_ready(){\n    #nesseary variable: NET_DEV\n    if [ -z \"$NET_DEV\" ]; then\n        log \"NET_DEV is empty\"\n        return 1\n    fi\n    return 0\n}\n\n# Monitor type\n\n# Method: ping - Ping IP address to check connectivity\n# Usage: ping <Target> or ping <Modem_ID>\n# Parameters:\n# <Type> - The type of target to ping. Can be \"ip\" or \"modem\".\n# <Target> - The IP address or V4/V6 Interface name to ping.\n# <Modem_ID> - The ID of the modem to use for pinging.\n_ping() {\n    Type=$1\n    Target=$2\n    case $Type in\n        ip)\n            ping -c 1 $Target -I $NET_DEV\n            status=$?\n            ;;\n        gateway)\n            case $Target in\n                4)\n                    ping -c 1 $gateway_v4 -I $NET_DEV\n                    status=$?\n                ;;\n                6)\n                    ping -c 1 $gateway_v6 -I $NET_DEV\n                    status=$?\n                ;;\n                *)\n                    log \"Invalid target type $Target\"\n                    status=1\n                ;;\n            esac\n        ;;\n        dns)\n        case $Target in\n            4)\n                ping -c 1 $dns_v4 -I $NET_DEV\n                status=$?\n                ;;\n            6)\n                ping -c 1 $dns_v6 -I $NET_DEV\n                status=$?\n                ;;\n            *)\n                log \"Invalid target type $Target\"\n                status=1\n                ;;\n        esac\n        ;;\n        *)\n                log \"Invalid type $Type\"\n                status=1\n        ;;\n    esac\n    if [ \"$status\" -ne 0 ]; then\n        log \"Ping failed\"\n    fi\n    return $status\n}\n\n\n# Method curl - Download file using curl\n# Usage: curl <URL>\n_curl() {\n  url=$1\n  # timeout 10s\n  res=$(curl --connect-timeout 10 --interface $NET_DEV $url -o /dev/null --silent --show-error)\n  status=$?\n  if [ \"$status\" -ne 0 ]; then\n    log \"Curl failed: $res\"\n  fi\n  return $status\n}\n\n# Method: signal - Get signal strength\n# Usage: signal <Modem_ID>\n\n# Method: operator registion - Get operator registration status\n# Usage: operator <Modem_ID>\n\n# Actions\n\n# Action: log - Log the output to syslog\n# Usage: log <MESSAGE>\n\n# Action: notify - Send a notification\n# Usage: notify <TITLE> <MESSAGE>\n\n# Action: run_script - Run a custom script\n# Usage: run_script <SCRIPT_PATH> [ARGUMENTS...]\nrun_scripts(){\n    config_load qmodem\n    config_list_foreach \"$Modem_ID\" script _run_script\n}\n\n_run_script(){\n    local script_path=$1\n    shift\n    log \"Run script: $script_path $@\"\n    $script_path $@\n}\n\n\n# Action: send_at_commands - Send AT commands to modem\n# Usage: send_at_commands <Modem_ID>\nsend_at_commands() {\n  config_load qmodem\n  config_list_foreach \"$Modem_ID\" at_command _send_at_command\n}\n\n_send_at_command(){\n    local at_command\n    at_command=$1\n    log \"Send AT command: $at_command\"\n    res=$(at $AT_PORT $at_command)\n    log \"AT command response: $res\"\n}\n\n# Action: switch_sim_slot - Switch SIM slot\n# Usage: switch_sim_slot <Modem_ID>\nswitch_sim_slot() {\n  is_supported=$(ubus call qmodem get_sim_switch_capabilities '{\"config_section\": \"'$Modem_ID'\"}' | jq -r '.supportSwitch')\n  if [ \"$is_supported\" = \"1\" ]; then\n    current_slot=$(ubus call qmodem get_sim_slot '{\"config_section\": \"'$Modem_ID'\"}' | jq -r '.sim_slot')\n    available_slots=$(ubus call qmodem get_sim_switch_capabilities '{\"config_section\": \"'$Modem_ID'\"}' | jq -r '.simSlots[]')\n    for slot in $available_slots; do\n        if [ \"$slot\" != \"$current_slot\" ]; then\n            new_slot=$slot\n            break\n        fi\n    done\n    ubus call qmodem set_sim_slot '{\"config_section\": \"'$Modem_ID'\", \"slot\": '$new_slot'}'\n    log \"Switch SIM slot from $current_slot to $new_slot\"\n  else\n    log \"Switching SIM slot is not supported for modem $Modem_ID\"\n  fi\n}\n\n# Parameters:\n# <Modem_ID> - The ID of the modem to perform the action on.\n# <Interval> - The interval in seconds between each monitoring check.\n# <Threshold> - The condition to trigger the action.\n\n\nloop(){\n    case $Method in\n        ping)\n            case $Ping_Type in\n                ip)\n                    _ping $Ping_Type $Ping_Dest\n                    status=$?\n                    ;;\n                gateway|dns)\n                    _ping $Ping_Type $Ping_IP_Version\n                    status=$?\n                    ;;\n                *)\n                    log \"Invalid ping type: $Ping_Type\"\n                    status=1\n                    ;;\n            esac\n            ;;\n        curl)\n            _curl $Http_Url\n            status=$?\n            ;;\n        *)\n            log \"Invalid method\"\n            status=1\n            ;;\n    esac\n    return $status\n}\n\nrun_action(){\n    Action=$1\n    case $Action in\n        switch_sim_slot)\n            switch_sim_slot\n            ;;\n        send_at_commands)\n            send_at_commands\n            ;;\n        run_scripts)\n            run_scripts\n            ;;\n        *)\n            log \"Invalid action $Action\"\n            ;;\n    esac\n}\n\nrun_actions(){\n    config_load qmodem\n    config_list_foreach \"$Modem_ID\" monitor_action run_action\n}\n\nparse_args \"$@\"\nupdate_cfg\nupdate_netcfg\nlog \"Start monitoring $Modem_ID($Method) with interval $Interval and threshold $Threshold\"\nfailed_count=0\nwhile true; do\n    update_netcfg\n    # wait_until_ready\n    # status=$?\n    # if [ \"$status\" -ne 0 ]; then\n    #     continue\n    # fi\n    loop\n    status=$?\n    if [ \"$status\" -ne 0 ]; then\n        failed_count=$((failed_count + 1))\n        log \"Failed count: $failed_count Threshold: $Threshold\"\n    else\n        failed_count=0\n    fi\n    sleep $Interval\n    \n    if [ \"$failed_count\" -ge \"$Threshold\" ]; then\n        # log last failure time\n        log \"$Method failed $failed_count times\"\n        run_actions\n        failed_count=0\n        sleep 60\n    fi\ndone\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/Makefile",
    "content": "include $(TOPDIR)/rules.mk\ninclude $(INCLUDE_DIR)/kernel.mk\n\n# Include unified version\ninclude ../../version.mk\n\nPKG_NAME:= quectel-CM-5G-M\nPKG_RELEASE:=$(QMODEM_RELEASE)\nPKG_VERSION:=$(QMODEM_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n  SECTION:=utils\n  CATEGORY:=Utilities\n  TITLE:=quectel-CM-5G app building test with metric option ( -M )\n  DEPENDS:=+libjson-c\nendef\n\ndefine Package/$(PKG_NAME)/description\n\tquectel-CM-5G app building test\nendef\n\ndefine Build/Prepare\n\tmkdir -p $(PKG_BUILD_DIR)\n\t$(CP) src/* $(PKG_BUILD_DIR)/\nendef\n\ndefine Build/Compile\n\t$(MAKE) -C $(PKG_BUILD_DIR) \\\n\t\t$(TARGET_CONFIGURE_OPTS) CFLAGS=\"$(TARGET_CFLAGS)\"\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t\t$(INSTALL_DIR) $(1)/usr/bin $(1)/lib/netifd/proto $(1)/lib/netifd\n\t\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/quectel-CM $(1)/usr/bin/quectel-CM-M\n\t\t$(INSTALL_DIR) $(1)/usr/share/qmodem\n\t\t$(INSTALL_DATA) ./files/apns.json $(1)/usr/share/qmodem/apns.json\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/files/apns.json",
    "content": "{\r\n\t\"apns\": {\r\n\t\t\"apn\": [\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AT&T PHONE TEST SIM\",\r\n\t\t\t\t\"_carrier_id\": \"1911\",\r\n\t\t\t\t\"_mcc\": \"001\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"phone\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_proxy\": \"\",\r\n\t\t\t\t\"_port\": \"\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,hipri,fota,dun\",\r\n\t\t\t\t\"_mtu\": \"1410\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile TEST SIM\",\r\n\t\t\t\t\"_carrier_id\": \"1911\",\r\n\t\t\t\t\"_mcc\": \"001\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"phone\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_proxy\": \"\",\r\n\t\t\t\t\"_port\": \"\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,hipri,dun\",\r\n\t\t\t\t\"_mtu\": \"1440\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S.Cellular TEST SIM\",\r\n\t\t\t\t\"_carrier_id\": \"1911\",\r\n\t\t\t\t\"_mcc\": \"001\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_proxy\": \"\",\r\n\t\t\t\t\"_port\": \"\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri,dun,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Test FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1911\",\r\n\t\t\t\t\"_mcc\": \"001\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13|14\",\r\n\t\t\t\t\"_profile_id\": \"3\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Test CBS\",\r\n\t\t\t\t\"_carrier_id\": \"1911\",\r\n\t\t\t\t\"_mcc\": \"001\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"VZWAPP\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vtext.com/servlets/mms\",\r\n\t\t\t\t\"_type\": \"cbs,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13|14\",\r\n\t\t\t\t\"_profile_id\": \"4\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Test Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1911\",\r\n\t\t\t\t\"_mcc\": \"001\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Test Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1911\",\r\n\t\t\t\t\"_mcc\": \"001\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13|14\",\r\n\t\t\t\t\"_profile_id\": \"0\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Test FOTA\",\r\n\t\t\t\t\"_mcc\": \"001\",\r\n\t\t\t\t\"_mnc\": \"010\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13|14\",\r\n\t\t\t\t\"_profile_id\": \"3\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Test CBS\",\r\n\t\t\t\t\"_mcc\": \"001\",\r\n\t\t\t\t\"_mnc\": \"010\",\r\n\t\t\t\t\"_apn\": \"VZWAPP\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vtext.com/servlets/mms\",\r\n\t\t\t\t\"_type\": \"cbs,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13|14\",\r\n\t\t\t\t\"_profile_id\": \"4\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Test Internet\",\r\n\t\t\t\t\"_mcc\": \"001\",\r\n\t\t\t\t\"_mnc\": \"010\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Test Internet\",\r\n\t\t\t\t\"_mcc\": \"001\",\r\n\t\t\t\t\"_mnc\": \"010\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_profile_id\": \"0\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Test Internet\",\r\n\t\t\t\t\"_mcc\": \"001\",\r\n\t\t\t\t\"_mnc\": \"010\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_profile_id\": \"0\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cosmote Internet\",\r\n\t\t\t\t\"_carrier_id\": \"747\",\r\n\t\t\t\t\"_mcc\": \"202\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cosmote Mms\",\r\n\t\t\t\t\"_carrier_id\": \"747\",\r\n\t\t\t\t\"_mcc\": \"202\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.cosmote.gr:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.10.20\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_network_type_bitmask\": \"1|2|3|4|5|6|7|8|9|10|12|13|14|15|17|20\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"747\",\r\n\t\t\t\t\"_mcc\": \"202\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user_visible\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOS\",\r\n\t\t\t\t\"_carrier_id\": \"747\",\r\n\t\t\t\t\"_mcc\": \"202\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.cosmote.gr\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.10.20\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_network_type_bitmask\": \"18\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vf Mobile LTE\",\r\n\t\t\t\t\"_carrier_id\": \"2399\",\r\n\t\t\t\t\"_mcc\": \"202\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vf Mobile Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2399\",\r\n\t\t\t\t\"_mcc\": \"202\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"internet.vodafone.gr\",\r\n\t\t\t\t\"_type\": \"default,supl\",\r\n\t\t\t\t\"_user\": \"user\",\r\n\t\t\t\t\"_password\": \"pass\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vf MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2399\",\r\n\t\t\t\t\"_mcc\": \"202\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms.vodafone.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vodafone.gr\",\r\n\t\t\t\t\"_mmsproxy\": \"213.249.19.49\",\r\n\t\t\t\t\"_mmsport\": \"5080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Q Internet\",\r\n\t\t\t\t\"_carrier_id\": \"749\",\r\n\t\t\t\t\"_mcc\": \"202\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"myq\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Q-Telcom\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Q-Telecom MMS GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"749\",\r\n\t\t\t\t\"_mcc\": \"202\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"q-mms.myq.gr\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.myq.gr\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.80.134\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Q-Telcom\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Wind Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1519\",\r\n\t\t\t\t\"_mcc\": \"202\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"gint.b-online.gr\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Wind MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1519\",\r\n\t\t\t\t\"_mcc\": \"202\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mnet.b-online.gr\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.200.95/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.200.11\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1643\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet.tele2.nl\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"4E4C\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1643\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"4E4C\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MVNO NL\",\r\n\t\t\t\t\"_carrier_id\": \"2149\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.mvno.mobi\",\r\n\t\t\t\t\"_user\": \"mvno\",\r\n\t\t\t\t\"_password\": \"mvno\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"20403\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MVNO NL\",\r\n\t\t\t\t\"_carrier_id\": \"2149\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_mvno_match_data\": \"20403\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Jump Roam\",\r\n\t\t\t\t\"_carrier_id\": \"2138\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mobiledata\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Jump\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"truphone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.truphone.com:1981/mm1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone Internet\",\r\n\t\t\t\t\"_carrier_id\": \"20\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"live.vodafone.com\",\r\n\t\t\t\t\"_user\": \"vodafone\",\r\n\t\t\t\t\"_password\": \"vodafone\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"20\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LTE - VZW Roaming Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1839\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"BAE0000000000000\",\r\n\t\t\t\t\"_profile_id\": \"0\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LTE - VZW Roaming FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1839\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"BAE0000000000000\",\r\n\t\t\t\t\"_profile_id\": \"3\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Verizon IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1839\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"IMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"BAE0000000000000\",\r\n\t\t\t\t\"_profile_id\": \"2\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"20\",\r\n\t\t\t\t\"_max_conns_time\": \"300\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LTE - VZW Roaming CBS\",\r\n\t\t\t\t\"_carrier_id\": \"1839\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"VZWAPP\",\r\n\t\t\t\t\"_type\": \"cbs,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vtext.com/servlets/mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"BAE0000000000000\",\r\n\t\t\t\t\"_profile_id\": \"4\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CSpire international\",\r\n\t\t\t\t\"_carrier_id\": \"1836\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"internet.cs4glte.com\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_user\": \"Uniroam@inet.cs.com\",\r\n\t\t\t\t\"_password\": \"cs3g\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_mmsc\": \"http://pix.cspire.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"C Spire\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CSpire international\",\r\n\t\t\t\t\"_carrier_id\": \"1836\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"admin.cs4glte.com\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"C Spire\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CSpire international\",\r\n\t\t\t\t\"_carrier_id\": \"1836\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"tethering.cs4glte.com\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"C Spire\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SaskTel Internet\",\r\n\t\t\t\t\"_carrier_id\": \"580\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"pda.stm.sk.ca\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.sasktel.com/\",\r\n\t\t\t\t\"_mmsproxy\": \"mig.sasktel.com\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"5A\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOT mobile Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1991\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"net.hotm\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"HOT mobile\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOT mobile MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1991\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mms.hotm\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.hotmobile.co.il\",\r\n\t\t\t\t\"_mmsproxy\": \"80.246.131.99\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"HOT mobile\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CTNET\",\r\n\t\t\t\t\"_carrier_id\": \"2237\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ctnet\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_proxy\": \"\",\r\n\t\t\t\t\"_port\": \"\",\r\n\t\t\t\t\"_type\": \"default,ia,hipri,supl,fota,cbs\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"中国电信\",\r\n\t\t\t\t\"_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ice.net\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040439909\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mms.ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mms.ice.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"185.83.167.222\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040439909\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ice.net\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040438005\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mms.ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mms.ice.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"185.83.167.222\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040438005\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ice.net\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040438006\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mms.ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mms.ice.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"185.83.167.222\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040438006\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ice.net\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040438007\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mms.ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mms.ice.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"185.83.167.222\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040438007\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040438008\",\r\n\t\t\t\t\"_apn\": \"ice.net\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mms.ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mms.ice.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"185.83.167.222\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040438008\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ice.net\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040438009\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mms.ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mms.ice.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"185.83.167.222\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040438009\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ice.net\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040439904\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mms.ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mms.ice.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"185.83.167.222\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040439904\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ice.net\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040439905\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mms.ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mms.ice.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"185.83.167.222\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040439905\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ice.net\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040439505\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mms.ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mms.ice.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"185.83.167.222\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040439505\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ice.net\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040439506\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mms.ice.net\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mms.ice.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"185.83.167.222\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2040439506\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tata Move\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"move.dataxs.mobi\",\r\n\t\t\t\t\"_type\": \"default,supl,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"KPN Mobiel Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1644\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"UT-Interface\",\r\n\t\t\t\t\"_carrier_id\": \"1644\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"ut\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1644\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MVNO NL\",\r\n\t\t\t\t\"_carrier_id\": \"2149\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"internet.mvno.mobi\",\r\n\t\t\t\t\"_user\": \"mvno\",\r\n\t\t\t\t\"_password\": \"mvno\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"204080950\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Rabo Mobiel Int.\",\r\n\t\t\t\t\"_carrier_id\": \"2406\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"rabo\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"Rabo Mobiel\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"truphone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.truphone.com:1981/mm1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.nl\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telfort Mobiel Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1644\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2386\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"smartsites.t-mobile\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2386\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOS\",\r\n\t\t\t\t\"_carrier_id\": \"2386\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_user\": \"tmobilemms\",\r\n\t\t\t\t\"_password\": \"tmobilemms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ben Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2095\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"internet.ben\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mvno_match_data\": \"BEN NL\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2468\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"smartsites.t-mobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mvno_match_data\": \"8F\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2468\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"smartsites.t-mobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mvno_match_data\": \"4E4C\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2468\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"8F\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2468\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"4E4C\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOS\",\r\n\t\t\t\t\"_carrier_id\": \"2468\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_user\": \"tmobilemms\",\r\n\t\t\t\t\"_password\": \"tmobilemms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"8F\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOS\",\r\n\t\t\t\t\"_carrier_id\": \"2468\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_user\": \"tmobilemms\",\r\n\t\t\t\t\"_password\": \"tmobilemms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"4E4C\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara NL\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"internet.lebara.nl\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara NL\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara NL\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ziggo mobiel internet\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"internet.ziggo.nl\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"7A696731\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2386\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"smartsites.t-mobile\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOS\",\r\n\t\t\t\t\"_carrier_id\": \"2386\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_user\": \"tmobilemms\",\r\n\t\t\t\t\"_password\": \"tmobilemms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2386\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"truphone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.truphone.com:1981/mm1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"agms\",\r\n\t\t\t\t\"_carrier_id\": \"2351\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"65\",\r\n\t\t\t\t\"_apn\": \"agms\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"KPN Lab Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1644\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"69\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"UT-Interface\",\r\n\t\t\t\t\"_carrier_id\": \"1644\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"69\",\r\n\t\t\t\t\"_apn\": \"ut\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1644\",\r\n\t\t\t\t\"_mcc\": \"204\",\r\n\t\t\t\t\"_mnc\": \"69\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EMnify\",\r\n\t\t\t\t\"_carrier_id\": \"2326\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"em\",\r\n\t\t\t\t\"_mvno_match_data\": \"206018\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Proximus LTE\",\r\n\t\t\t\t\"_carrier_id\": \"1365\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Proximus MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1365\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"event.proximus.be\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.proximus.be/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.55.14.75\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Proximus Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1365\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.proximus.be\",\r\n\t\t\t\t\"_type\": \"default,supl\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Proximus XCAP\",\r\n\t\t\t\t\"_carrier_id\": \"1365\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Proximus IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1365\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenet Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2270\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"telenetwap.be\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"20601889\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenet MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2270\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.be\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.telenet.be\",\r\n\t\t\t\t\"_mmsproxy\": \"195.130.149.100\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"20601889\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Virgin Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"717\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"goto.virginmobile.uk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.virginmobile.co.uk:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"193.30.166.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"28\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"upcnet\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"Internet.ch.upcmobile.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"75636831\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"upcmms\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.ch.upcmobile.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ch.upcmobile.com:8080/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"62.179.127.18\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"75636831\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ziggo mobiel internet\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.ziggo.nl\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"7A696731\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Virgin Media IE\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"Internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"75696531\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tesco Mobile Internet\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"tescomobile.liffeytelecom.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmc1/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.1.11.19\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"0A\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenet Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2150\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"telenetwap.be\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenet MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2150\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms.be\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.telenet.be\",\r\n\t\t\t\t\"_mmsproxy\": \"195.130.149.100\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.be\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1366\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mms.be\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobistar.be\",\r\n\t\t\t\t\"_mmsproxy\": \"212.65.63.143\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1366\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mworld.be\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange B IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1366\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"netgprs.com\",\r\n\t\t\t\t\"_carrier_id\": \"2271\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"netgprs.com\",\r\n\t\t\t\t\"_user\": \"tsl\",\r\n\t\t\t\t\"_password\": \"tsl\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"BE-Transatel\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"netgprs.com\",\r\n\t\t\t\t\"_carrier_id\": \"2271\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"netgprs.com\",\r\n\t\t\t\t\"_user\": \"tsl\",\r\n\t\t\t\t\"_password\": \"tsl\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"BB00\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BASE Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1367\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"gprs.base.be\",\r\n\t\t\t\t\"_user\": \"base\",\r\n\t\t\t\t\"_password\": \"base\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BASE MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1367\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"mms.base.be\",\r\n\t\t\t\t\"_user\": \"base\",\r\n\t\t\t\t\"_password\": \"base\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.base.be\",\r\n\t\t\t\t\"_mmsproxy\": \"217.72.235.1\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Virgin Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"717\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"goto.virginmobile.uk\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.virginmobile.co.uk:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"193.30.166.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"28\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BICS Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2132\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"28\",\r\n\t\t\t\t\"_apn\": \"bicsapn\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Unleashed\",\r\n\t\t\t\t\"_carrier_id\": \"2144\",\r\n\t\t\t\t\"_mcc\": \"206\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"web.be\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange LTE\",\r\n\t\t\t\t\"_carrier_id\": \"32\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\",\r\n\t\t\t\t\"_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange World\",\r\n\t\t\t\t\"_carrier_id\": \"32\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"orange\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.orange.fr\",\r\n\t\t\t\t\"_type\": \"default,supl,xcap,mms,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"1|2|3|4|5|6|7|8|9|10|12|13|14|15|17|20\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange IMS\",\r\n\t\t\t\t\"_carrier_id\": \"32\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange MCX\",\r\n\t\t\t\t\"_carrier_id\": \"32\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"orange-teamconnect\",\r\n\t\t\t\t\"_type\": \"cbs,mcx\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange WiFi MMS\",\r\n\t\t\t\t\"_carrier_id\": \"32\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"vowifiorange\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.orange.fr\",\r\n\t\t\t\t\"_type\": \"mms,xcap\",\r\n\t\t\t\t\"_network_type_bitmask\": \"18\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Carrefour\",\r\n\t\t\t\t\"_carrier_id\": \"2133\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ofnew.fr\",\r\n\t\t\t\t\"_proxy\": \"192.168.10.100\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"33\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Carrefour MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2133\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"orange.acte\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.orange.fr\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.10.200\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"33\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RSO WEB\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ofnew.fr\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"4E\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RSO MMS\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"orange.acte\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.orange.fr\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.10.200\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"4E\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange World\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"orange\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Digimium\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Coriolis\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"coriolis\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"Coriolis\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Coriolis MMS\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mmscoriolis\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.coriolis.fr\",\r\n\t\t\t\t\"_mmsproxy\": \"10.12.0.1\",\r\n\t\t\t\t\"_mmsport\": \"9028\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"Coriolis\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Monaco Telecom\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.monaco-telecom.mc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"4d433032\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"楽天(rakuten.jp)\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"rakuten.jp\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user_visible\": \"true\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"iccid\",\r\n\t\t\t\t\"_mvno_match_data\": \"8981090\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SFR LTE\",\r\n\t\t\t\t\"_carrier_id\": \"27\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SFR webphone\",\r\n\t\t\t\t\"_carrier_id\": \"27\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"sl2sfr\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1\",\r\n\t\t\t\t\"_mmsproxy\": \"10.151.0.1\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SFR option modem\",\r\n\t\t\t\t\"_carrier_id\": \"27\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"websfr\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SFR IMS\",\r\n\t\t\t\t\"_carrier_id\": \"27\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Be Aliv\",\r\n\t\t\t\t\"_carrier_id\": \"2130\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"pda.newcomobile.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.bealiv.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"208090021\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"truphone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.truphone.com:1981/mm1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Coriolis\",\r\n\t\t\t\t\"_carrier_id\": \"2135\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"coriolis\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"208090036\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Coriolis MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2135\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"mmscoriolis\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.coriolis.fr\",\r\n\t\t\t\t\"_mmsproxy\": \"10.12.0.1\",\r\n\t\t\t\t\"_mmsport\": \"9028\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"208090036\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SFR LTE\",\r\n\t\t\t\t\"_carrier_id\": \"27\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SFR webphone\",\r\n\t\t\t\t\"_carrier_id\": \"27\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"sl2sfr\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1\",\r\n\t\t\t\t\"_mmsproxy\": \"10.151.0.1\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SFR option Modem\",\r\n\t\t\t\t\"_carrier_id\": \"27\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"websfr\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SFR IMS\",\r\n\t\t\t\t\"_carrier_id\": \"27\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Auchan WAP\",\r\n\t\t\t\t\"_carrier_id\": \"2272\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"wap65\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"A MOBILE\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Auchan MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2272\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_mmsc\": \"http://mms65\",\r\n\t\t\t\t\"_mmsproxy\": \"10.143.156.8\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_apn\": \"mms65\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"A MOBILE\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"WAP LeclercMobile\",\r\n\t\t\t\t\"_carrier_id\": \"2273\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_proxy\": \"192.168.21.9\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_apn\": \"wap66\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"LeclercMobile\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS LeclercMobile\",\r\n\t\t\t\t\"_carrier_id\": \"2273\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_mmsc\": \"http://mms66\",\r\n\t\t\t\t\"_mmsproxy\": \"10.143.156.9\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_apn\": \"mms66\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"LeclercMobile\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Coriolis\",\r\n\t\t\t\t\"_carrier_id\": \"2135\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"coriolis\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"12\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Coriolis MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2135\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mmscoriolis\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.coriolis.fr\",\r\n\t\t\t\t\"_mmsproxy\": \"10.12.0.1\",\r\n\t\t\t\t\"_mmsport\": \"9028\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"12\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Coriolis\",\r\n\t\t\t\t\"_carrier_id\": \"2135\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"coriolis\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Coriolis\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Coriolis MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2135\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mmscoriolis\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.coriolis.fr\",\r\n\t\t\t\t\"_mmsproxy\": \"10.12.0.1\",\r\n\t\t\t\t\"_mmsport\": \"9028\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Coriolis\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"4G La Poste Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2274\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\",\r\n\t\t\t\t\"_mvno_match_data\": \"4C\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Web La Poste Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2274\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"sl2sfr\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsdebitel\",\r\n\t\t\t\t\"_mmsproxy\": \"10.143.156.3\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,supl,mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"4C\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Darty Surf&Mails\",\r\n\t\t\t\t\"_carrier_id\": \"2275\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"wap68\",\r\n\t\t\t\t\"_proxy\": \"192.168.21.11\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"44\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Darty MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2275\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mms68\",\r\n\t\t\t\t\"_mmsc\": \"http://mms68/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.143.156.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"44\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Keyyo Mobile Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2276\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"internet68\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Keyyo Mobile\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Keyyo Mobile MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2276\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mms68\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsc\": \"http://mms68\",\r\n\t\t\t\t\"_mmsproxy\": \"10.143.156.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Keyyo Mobile\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Keyyo Mobile Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2276\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"wap68\",\r\n\t\t\t\t\"_proxy\": \"192.168.21.11\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Keyyo Mobile\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Zero forfait\",\r\n\t\t\t\t\"_carrier_id\": \"2277\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"internet68\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"ZERO FORFAIT\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Zero forfait MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2277\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mms68\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsc\": \"http://mms68\",\r\n\t\t\t\t\"_mmsproxy\": \"10.143.156.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"ZERO FORFAIT\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"WAP RegloMobile\",\r\n\t\t\t\t\"_carrier_id\": \"2273\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"wap66\",\r\n\t\t\t\t\"_proxy\": \"192.168.21.9\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"RegloMobile\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS RegloMobile\",\r\n\t\t\t\t\"_carrier_id\": \"2273\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mms66\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsc\": \"http://mms66\",\r\n\t\t\t\t\"_mmsproxy\": \"10.143.156.9\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"RegloMobile\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"truphone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.truphone.com:1981/mm1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Free\",\r\n\t\t\t\t\"_carrier_id\": \"1958\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"free\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.free.fr\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Free Re Int\",\r\n\t\t\t\t\"_carrier_id\": \"2127\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"free.re\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.free.re\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,hipri,mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"F2330002\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Free Pro\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"jn\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"f005\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Free Pro MMS\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"mmsjn\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.freepro.fr\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"f005\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telco OI Re\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"internet.telco.re\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.telco.re\",\r\n\t\t\t\t\"_mvno_match_data\": \"f006\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Free Caraibes Guadeloupe\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"free.gp\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.free.gp\",\r\n\t\t\t\t\"_mvno_match_data\": \"f007\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Free Caraibes Martinique Guyanne\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"free.mq\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.free.mq\",\r\n\t\t\t\t\"_mvno_match_data\": \"f008\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Iliad Int\",\r\n\t\t\t\t\"_carrier_id\": \"2124\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"iliad\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.iliad.it\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"F003\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Legos\",\r\n\t\t\t\t\"_carrier_id\": \"2151\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"bornsip\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Legos MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2151\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.bornsip.fr:8191\",\r\n\t\t\t\t\"_apn\": \"bornsipmms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bouygues Telecom\",\r\n\t\t\t\t\"_carrier_id\": \"1487\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"mmsbouygtel.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.bouyguestelecom.fr/mms/wapenc\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bouygues IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1487\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bouygues Telecom Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1487\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"mmsbouygtel.com\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mobiledata\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"22\",\r\n\t\t\t\t\"_apn\": \"mobiledata\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"netgprs.com\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"22\",\r\n\t\t\t\t\"_apn\": \"netgprs.com\",\r\n\t\t\t\t\"_user\": \"tsl\",\r\n\t\t\t\t\"_password\": \"tsl\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"FR-Transatel\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Virgin mobile\",\r\n\t\t\t\t\"_carrier_id\": \"1984\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"23\",\r\n\t\t\t\t\"_apn\": \"virgin-mobile.fr\",\r\n\t\t\t\t\"_proxy\": \"10.6.10.1\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VM MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1984\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"23\",\r\n\t\t\t\t\"_apn\": \"virgin-mobile.fr\",\r\n\t\t\t\t\"_mmsc\": \"http://virginmms.fr\",\r\n\t\t\t\t\"_mmsproxy\": \"10.6.10.1\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"25\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.fr\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"NRJWEB\",\r\n\t\t\t\t\"_carrier_id\": \"2005\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"26\",\r\n\t\t\t\t\"_apn\": \"fnetnrj\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"4E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"NRJMMS\",\r\n\t\t\t\t\"_carrier_id\": \"2005\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"26\",\r\n\t\t\t\t\"_apn\": \"mmsnrj\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsnrj\",\r\n\t\t\t\t\"_mmsproxy\": \"10.143.156.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"4E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Coriolis\",\r\n\t\t\t\t\"_carrier_id\": \"2135\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"27\",\r\n\t\t\t\t\"_apn\": \"coriolis\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"Coriolis\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Coriolis MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2135\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"27\",\r\n\t\t\t\t\"_apn\": \"mmscoriolis\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.coriolis.fr\",\r\n\t\t\t\t\"_mmsproxy\": \"10.12.0.1\",\r\n\t\t\t\t\"_mmsport\": \"9028\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"Coriolis\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DataPro\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"28\",\r\n\t\t\t\t\"_apn\": \"datapro\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MmsPro\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"28\",\r\n\t\t\t\t\"_apn\": \"mmspro\",\r\n\t\t\t\t\"_mmsc\": \"http://100.101.102.103:8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara France\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"38\",\r\n\t\t\t\t\"_apn\": \"fr.lebara.mobi\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara France\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"38\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara France\",\r\n\t\t\t\t\"_mcc\": \"208\",\r\n\t\t\t\t\"_mnc\": \"38\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Monaco Telecom\",\r\n\t\t\t\t\"_mcc\": \"212\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.monaco-telecom.mc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"4d433032\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobiland\",\r\n\t\t\t\t\"_carrier_id\": \"450\",\r\n\t\t\t\t\"_mcc\": \"213\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet móvil\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"airtelwap.es\",\r\n\t\t\t\t\"_user\": \"wap@wap\",\r\n\t\t\t\t\"_password\": \"wap125\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"INTERNET\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"airtelnet.es\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"vodafone\",\r\n\t\t\t\t\"_password\": \"vodafone\",\r\n\t\t\t\t\"_type\": \"dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ut.es\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ut.es\",\r\n\t\t\t\t\"_type\": \"xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS Vodafone\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ALTECOM\",\r\n\t\t\t\t\"_carrier_id\": \"2131\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"altecom.net\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"FIBRACAT\",\r\n\t\t\t\t\"_carrier_id\": \"2136\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"fibracat.cat\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"FIBRACAT\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange LTE\",\r\n\t\t\t\t\"_carrier_id\": \"678\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\",\r\n\t\t\t\t\"_mvno_match_data\": \"Orange\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Internet Móvil\",\r\n\t\t\t\t\"_carrier_id\": \"678\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"orangeworld\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Orange\",\r\n\t\t\t\t\"_type\": \"default,supl,ia\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange MMS\",\r\n\t\t\t\t\"_carrier_id\": \"678\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"orangemms\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.orange.es\",\r\n\t\t\t\t\"_mmsproxy\": \"172.22.188.25\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Orange\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Internet PC\",\r\n\t\t\t\t\"_carrier_id\": \"678\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Orange\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange IMS\",\r\n\t\t\t\t\"_carrier_id\": \"678\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"Orange\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"X by Orange Internet\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"x\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_mvno_match_data\": \"X\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"X by Orange Internet PC\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"x\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_mvno_match_data\": \"X\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Euskaltel Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1909\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.euskaltel.mobi\",\r\n\t\t\t\t\"_user\": \"CLIENTE\",\r\n\t\t\t\t\"_password\": \"EUSKALTEL\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"EUSKALTEL\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Carrefour\",\r\n\t\t\t\t\"_carrier_id\": \"2133\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"CARREFOURINTERNET\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2140352xxxxxxxx\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Carrefour MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2133\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"CARREFOURMMS\",\r\n\t\t\t\t\"_user\": \"CARREFOUR\",\r\n\t\t\t\t\"_password\": \"CARREFOUR\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.orange.es\",\r\n\t\t\t\t\"_mmsproxy\": \"172.22.188.25\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"2140352xxxxxxxx\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Happy Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2297\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internettph\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Happy\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RACC INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"2298\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.racc.net\",\r\n\t\t\t\t\"_user\": \"CLIENTERACC\",\r\n\t\t\t\t\"_password\": \"RACC\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"RACC\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RACC MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2298\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms.racc.net\",\r\n\t\t\t\t\"_user\": \"MMS\",\r\n\t\t\t\t\"_password\": \"RACC\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.racc.net\",\r\n\t\t\t\t\"_mmsproxy\": \"172.16.18.74\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"RACC\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CABLE movil Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2299\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internettph\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"CABLE movil\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MASMovil Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2300\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internetmas\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"MASMovil\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ibercom Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2301\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ibercominternet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Ibercom\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Jazztel LTE\",\r\n\t\t\t\t\"_carrier_id\": \"1974\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"JAZZTEL\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"JAZZTEL internet\",\r\n\t\t\t\t\"_carrier_id\": \"1974\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"jazzinternet\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"JAZZTEL\",\r\n\t\t\t\t\"_type\": \"default,supl,dun,ia\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"JAZZTEL MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1974\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"jazzmms\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://jazztelmms.com/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"37.132.0.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"JAZZTEL\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"JAZZTEL IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1974\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"JAZZTEL\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"simyo LTE\",\r\n\t\t\t\t\"_carrier_id\": \"2125\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"simyo\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"internet simyo\",\r\n\t\t\t\t\"_carrier_id\": \"2125\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"orangeworld\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"simyo\",\r\n\t\t\t\t\"_type\": \"default,supl,dun,ia\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"simyo MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2125\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"orangemms\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.orange.es\",\r\n\t\t\t\t\"_mmsproxy\": \"172.22.188.25\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"simyo\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"simyo IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2125\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"simyo\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"diainternet\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"diainternet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,dun\",\r\n\t\t\t\t\"_mvno_match_data\": \"MovilDIA\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"diamms\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"diamms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.orange.es\",\r\n\t\t\t\t\"_mmsproxy\": \"172.22.188.25\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"MovilDIA\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MASMOVIL\",\r\n\t\t\t\t\"_carrier_id\": \"2300\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internetmas\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,dun\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"MASMOVIL\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS MASMOVIL\",\r\n\t\t\t\t\"_carrier_id\": \"2300\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"masvidamms\",\r\n\t\t\t\t\"_user\": \"masvidamms\",\r\n\t\t\t\t\"_password\": \" MMSmasvida \",\r\n\t\t\t\t\"_mmsc\": \"http://mms.orange.es\",\r\n\t\t\t\t\"_mmsproxy\": \"172.22.188.25\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"2\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"MASMOVIL\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LCR\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"lcrinternet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,dun\",\r\n\t\t\t\t\"_mvno_match_data\": \"LCR\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Llamaya Internet\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"moreinternet\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_mvno_match_data\": \"LlamaYA\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"youmobile\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"youinternet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,dun\",\r\n\t\t\t\t\"_mvno_match_data\": \"YOU Mobile\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Virgin TELCO Internet\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"i.virgintelco.es\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"Virgin telco\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet R\",\r\n\t\t\t\t\"_carrier_id\": \"2113\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.mundo-r.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"mobilR\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet R\",\r\n\t\t\t\t\"_carrier_id\": \"2113\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.mundo-r.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"Mobil R\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"679\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tuenti\",\r\n\t\t\t\t\"_carrier_id\": \"2357\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"tuenti.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"tuenti\",\r\n\t\t\t\t\"_password\": \"tuenti\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Tuenti\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"INET Roaming\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"inet.es\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_port\": \"\",\r\n\t\t\t\t\"_proxy\": \"\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,hipri\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"214050104xxxxxx\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DIGI Spain\",\r\n\t\t\t\t\"_carrier_id\": \"2442\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"internet.digimobil.es\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"44474553\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DIGI Italy\",\r\n\t\t\t\t\"_carrier_id\": \"2443\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"digi.mobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"44474954\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar\",\r\n\t\t\t\t\"_carrier_id\": \"34\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"telefonica.es\",\r\n\t\t\t\t\"_user\": \"telefonica\",\r\n\t\t\t\t\"_password\": \"telefonica\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.movistar.com\",\r\n\t\t\t\t\"_mmsproxy\": \"10.138.255.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar\",\r\n\t\t\t\t\"_carrier_id\": \"34\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"ims\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar\",\r\n\t\t\t\t\"_carrier_id\": \"34\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TeleCable Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2112\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"internet.telecable.es\",\r\n\t\t\t\t\"_user\": \"telecable\",\r\n\t\t\t\t\"_password\": \"telecable\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"TeleCable\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TeleCable MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2112\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms.telecable.es\",\r\n\t\t\t\t\"_user\": \"telecable\",\r\n\t\t\t\t\"_password\": \"telecable\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.telecable.es/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"212.89.0.84\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"TeleCable\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet R\",\r\n\t\t\t\t\"_carrier_id\": \"2278\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"internet.mundo-r.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"2140612\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LOWI_data\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"lowi.private.omv.es\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"Eroski Movil\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LOWI_MMS\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"mms.lowi.omv.es\",\r\n\t\t\t\t\"_user\": \"wap@wap\",\r\n\t\t\t\t\"_password\": \"wap125\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.lowi.omv.es/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"212.73.32.10\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"Eroski Movil\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LOWI_data\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"lowi.private.omv.es\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lowi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LOWI_MMS\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"mms.lowi.omv.es\",\r\n\t\t\t\t\"_user\": \"wap@wap\",\r\n\t\t\t\t\"_password\": \"wap125\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.lowi.omv.es/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"212.73.32.10\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lowi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DUN\",\r\n\t\t\t\t\"_carrier_id\": \"2280\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"gprs.pepephone.com\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"pepephone\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2280\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"gprsmov.pepephone.com\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"pepephone\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2280\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"mms.pepephone.com\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_user\": \"wap@wap\",\r\n\t\t\t\t\"_password\": \"wap125\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.pepephone.com/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"212.73.32.10\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"pepephone\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hits\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"tel.hitsmobile.es\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Hits\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS Hits\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"mms.hitsmobile.es\",\r\n\t\t\t\t\"_user\": \"wap@wap\",\r\n\t\t\t\t\"_password\": \"wap125\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.hitsmobile.es/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"212.73.32.10\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Hits\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara Internet\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"gprsmov.lebaramobile.es\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lebara\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara MMS\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"mms.lebaramobile.es\",\r\n\t\t\t\t\"_user\": \"wap@wap\",\r\n\t\t\t\t\"_password\": \"wap125\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.lebaramobile.es/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"212.73.32.10\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lebara\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"PTV Telecom V\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"datos\",\r\n\t\t\t\t\"_type\": \"default,supl,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"PTV\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"PTV IMS V\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"PTV\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar\",\r\n\t\t\t\t\"_carrier_id\": \"34\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"telefonica.es\",\r\n\t\t\t\t\"_user\": \"telefonica\",\r\n\t\t\t\t\"_password\": \"telefonica\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.movistar.com\",\r\n\t\t\t\t\"_mmsproxy\": \"10.138.255.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar\",\r\n\t\t\t\t\"_carrier_id\": \"34\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"ims\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar\",\r\n\t\t\t\t\"_carrier_id\": \"34\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Euskaltel Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1909\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"internet.euskaltel.mobi\",\r\n\t\t\t\t\"_user\": \"CLIENTE\",\r\n\t\t\t\t\"_password\": \"EUSKALTEL\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"PTV Telecom\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"datos\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"default,supl,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"PTV IMS\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TeleCable Internet\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"internet.telecable.es\",\r\n\t\t\t\t\"_user\": \"telecable\",\r\n\t\t\t\t\"_password\": \"telecable\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TeleCable MMS\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"mms.telecable.es\",\r\n\t\t\t\t\"_user\": \"telecable\",\r\n\t\t\t\t\"_password\": \"telecable\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.telecable.es/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"212.89.0.84\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ONO Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1976\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"internet.ono.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ONO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1976\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"mms.ono.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ono.com/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.126.0.50\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"internet simyo\",\r\n\t\t\t\t\"_carrier_id\": \"2125\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"orangeworld\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,dun\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"simyo\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"simyo MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2125\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"orangemms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.orange.es\",\r\n\t\t\t\t\"_mmsproxy\": \"172.22.188.25\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"simyo\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"jazzinternet\",\r\n\t\t\t\t\"_carrier_id\": \"1974\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"21\",\r\n\t\t\t\t\"_apn\": \"jazzinternet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1974\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"21\",\r\n\t\t\t\t\"_apn\": \"jazzmms\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://jazztelmms.com/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"37.132.0.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DIGI Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2442\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"22\",\r\n\t\t\t\t\"_apn\": \"internet.digimobil.es\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DIGI Spain IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2442\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"22\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"25\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.es\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"27\",\r\n\t\t\t\t\"_apn\": \"truphone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.truphone.com:1981/mm1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"27\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"INET Internet\",\r\n\t\t\t\t\"_mcc\": \"214\",\r\n\t\t\t\t\"_mnc\": \"34\",\r\n\t\t\t\t\"_apn\": \"inet.es\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_port\": \"\",\r\n\t\t\t\t\"_proxy\": \"\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1534\",\r\n\t\t\t\t\"_mcc\": \"216\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.telenor.hu/\",\r\n\t\t\t\t\"_mmsproxy\": \"84.225.255.1\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor Online\",\r\n\t\t\t\t\"_carrier_id\": \"1534\",\r\n\t\t\t\t\"_mcc\": \"216\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"online\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Djuice MMS\",\r\n\t\t\t\t\"_mcc\": \"216\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsproxy\": \"84.225.255.1\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.pgsm.hu/\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mvno_match_data\": \"Djuice\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Djuice NET\",\r\n\t\t\t\t\"_mcc\": \"216\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"net\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mvno_match_data\": \"Djuice\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Djuice WAP\",\r\n\t\t\t\t\"_mcc\": \"216\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_proxy\": \"84.225.255.1\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mvno_match_data\": \"Djuice\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DIGI HU internet\",\r\n\t\t\t\t\"_mcc\": \"216\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DIGI HU IMS\",\r\n\t\t\t\t\"_mcc\": \"216\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DIGI HU Ut\",\r\n\t\t\t\t\"_mcc\": \"216\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telekom HU NET\",\r\n\t\t\t\t\"_carrier_id\": \"2401\",\r\n\t\t\t\t\"_mcc\": \"216\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"internet.telekom\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.t-mobile.hu/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"212.51.126.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"1|2|3|4|5|6|7|8|9|10|12|13|14|15|17|20\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telekom IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2401\",\r\n\t\t\t\t\"_mcc\": \"216\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOS\",\r\n\t\t\t\t\"_carrier_id\": \"2401\",\r\n\t\t\t\t\"_mcc\": \"216\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.t-mobile.hu/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"212.51.126.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_network_type_bitmask\": \"18\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1535\",\r\n\t\t\t\t\"_mcc\": \"216\",\r\n\t\t\t\t\"_mnc\": \"70\",\r\n\t\t\t\t\"_apn\": \"internet.vodafone.net\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1535\",\r\n\t\t\t\t\"_mcc\": \"216\",\r\n\t\t\t\t\"_mnc\": \"70\",\r\n\t\t\t\t\"_apn\": \"mms.vodafone.net\",\r\n\t\t\t\t\"_mmsproxy\": \"80.244.97.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vodafone.hu/servlets/mms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone Internet VitaMAX\",\r\n\t\t\t\t\"_mcc\": \"216\",\r\n\t\t\t\t\"_mnc\": \"70\",\r\n\t\t\t\t\"_apn\": \"vitamax.internet.vodafone.net\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"21670xx1xxx\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone HU IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1535\",\r\n\t\t\t\t\"_mcc\": \"216\",\r\n\t\t\t\t\"_mnc\": \"70\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"UPC Mobil Internet\",\r\n\t\t\t\t\"_mcc\": \"216\",\r\n\t\t\t\t\"_mnc\": \"71\",\r\n\t\t\t\t\"_apn\": \"Internet.hu.upcmobile.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"75687531\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"UPC MMS\",\r\n\t\t\t\t\"_mcc\": \"216\",\r\n\t\t\t\t\"_mnc\": \"71\",\r\n\t\t\t\t\"_apn\": \"mms.hu.upcmobile.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.hu.upcmobile.com:8080/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"62.179.127.18\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"75687531\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HT Eronet WEB\",\r\n\t\t\t\t\"_carrier_id\": \"1357\",\r\n\t\t\t\t\"_mcc\": \"218\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"web.eronet.ba\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ht Eronet MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1357\",\r\n\t\t\t\t\"_mcc\": \"218\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms.eronet.ba\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.gprs.eronet.ba/mms/wapenc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.12.3.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mtel\",\r\n\t\t\t\t\"_carrier_id\": \"1358\",\r\n\t\t\t\t\"_mcc\": \"218\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mtelsmart\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mtelmms\",\r\n\t\t\t\t\"_carrier_id\": \"1358\",\r\n\t\t\t\t\"_mcc\": \"218\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mtelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mtel.ba/mms/wapenc\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.61.11\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BHMobileInternet\",\r\n\t\t\t\t\"_carrier_id\": \"1359\",\r\n\t\t\t\t\"_mcc\": \"218\",\r\n\t\t\t\t\"_mnc\": \"90\",\r\n\t\t\t\t\"_apn\": \"active.bhmobile.ba\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BHMobileMMS\",\r\n\t\t\t\t\"_carrier_id\": \"1359\",\r\n\t\t\t\t\"_mcc\": \"218\",\r\n\t\t\t\t\"_mnc\": \"90\",\r\n\t\t\t\t\"_apn\": \"mms.bhmobile.ba\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.bhmobile.ba/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"195.222.56.41\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOS\",\r\n\t\t\t\t\"_carrier_id\": \"2365\",\r\n\t\t\t\t\"_mcc\": \"219\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.t-mobile.hr/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.12.0.4\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2365\",\r\n\t\t\t\t\"_mcc\": \"219\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2365\",\r\n\t\t\t\t\"_mcc\": \"219\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.ht.hr\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile UT\",\r\n\t\t\t\t\"_carrier_id\": \"2365\",\r\n\t\t\t\t\"_mcc\": \"219\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bonbon Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2091\",\r\n\t\t\t\t\"_mcc\": \"219\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"web.htgprs\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"bonbon\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bonbon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2091\",\r\n\t\t\t\t\"_mcc\": \"219\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.htgprs\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.bonbon.com.hr/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.12.0.4\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"bonbon\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2\",\r\n\t\t\t\t\"_carrier_id\": \"1529\",\r\n\t\t\t\t\"_mcc\": \"219\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet.tele2.hr\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.tele2.hr\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.tele2.hr\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"A1 internet\",\r\n\t\t\t\t\"_carrier_id\": \"1530\",\r\n\t\t\t\t\"_mcc\": \"219\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"A1 MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1530\",\r\n\t\t\t\t\"_mcc\": \"219\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.a1.hr/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"212.91.99.91\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"A1 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1530\",\r\n\t\t\t\t\"_mcc\": \"219\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor internet\",\r\n\t\t\t\t\"_carrier_id\": \"1012\",\r\n\t\t\t\t\"_mcc\": \"220\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"telenor\",\r\n\t\t\t\t\"_password\": \"gprs\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1012\",\r\n\t\t\t\t\"_mcc\": \"220\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.telenor.rs/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"217.65.192.33\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor MNE internet\",\r\n\t\t\t\t\"_carrier_id\": \"1012\",\r\n\t\t\t\t\"_mcc\": \"220\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"gprs\",\r\n\t\t\t\t\"_password\": \"gprs\",\r\n\t\t\t\t\"_proxy\": \"192.168.246.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor MNE mms\",\r\n\t\t\t\t\"_carrier_id\": \"1012\",\r\n\t\t\t\t\"_mcc\": \"220\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mm.vor.telenor.me\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.246.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTS WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1013\",\r\n\t\t\t\t\"_mcc\": \"220\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"gprswap\",\r\n\t\t\t\t\"_user\": \"mts\",\r\n\t\t\t\t\"_password\": \"064\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_server\": \"http://m.mondo.rs\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTS MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1013\",\r\n\t\t\t\t\"_mcc\": \"220\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mts\",\r\n\t\t\t\t\"_password\": \"064\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mts064.telekom.rs/mms/wapenc\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.85.131\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile MMS\",\r\n\t\t\t\t\"_carrier_id\": \"10\",\r\n\t\t\t\t\"_mcc\": \"220\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"38267\",\r\n\t\t\t\t\"_password\": \"38267\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.180.100/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.5.19\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile Internet\",\r\n\t\t\t\t\"_carrier_id\": \"10\",\r\n\t\t\t\t\"_mcc\": \"220\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"tmcg-wnw\",\r\n\t\t\t\t\"_user\": \"38267\",\r\n\t\t\t\t\"_password\": \"38267\",\r\n\t\t\t\t\"_proxy\": \"10.0.5.19\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vip GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1014\",\r\n\t\t\t\t\"_mcc\": \"220\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"vipmobile\",\r\n\t\t\t\t\"_user\": \"vipmobile\",\r\n\t\t\t\t\"_password\": \"vipmobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vip MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1014\",\r\n\t\t\t\t\"_mcc\": \"220\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"vipmobile.mms\",\r\n\t\t\t\t\"_user\": \"vipmobile\",\r\n\t\t\t\t\"_password\": \"vipmobile\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vipmobile.rs\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vala\",\r\n\t\t\t\t\"_mcc\": \"221\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"vala-int\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IPKO Telekom\",\r\n\t\t\t\t\"_mcc\": \"221\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"IPKO\",\r\n\t\t\t\t\"_proxy\": \"213.229.249.40\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TIM WAP\",\r\n\t\t\t\t\"_carrier_id\": \"33\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"wap.tim.it\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TIM Web\",\r\n\t\t\t\t\"_carrier_id\": \"33\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ibox.tim.it\",\r\n\t\t\t\t\"_type\": \"dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TIM MMS\",\r\n\t\t\t\t\"_carrier_id\": \"33\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"unico.tim.it\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.tim.it/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"213.230.130.89\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TIM UT\",\r\n\t\t\t\t\"_carrier_id\": \"33\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"xcap.tim.it\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TIM IMS\",\r\n\t\t\t\t\"_carrier_id\": \"33\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"IMS\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1912\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.iusacell3g.com/\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_apn\": \"mms.iusacellgsm.mx\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"IUSACELL\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Location\",\r\n\t\t\t\t\"_carrier_id\": \"1912\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"supl.iusacellgsm.mx\",\r\n\t\t\t\t\"_server\": \"http://supl.iusacell.com\",\r\n\t\t\t\t\"_type\": \"supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"IUSACELL\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1912\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_apn\": \"web.iusacellgsm.mx\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"IUSACELL\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1912\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.iusacellgsm.mx\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.iusacell3g.com/\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"UNEFON\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Location\",\r\n\t\t\t\t\"_carrier_id\": \"1912\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"supl.iusacellgsm.mx\",\r\n\t\t\t\t\"_server\": \"http://supl.iusacell.com\",\r\n\t\t\t\t\"_type\": \"supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"UNEFON\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1912\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"web.iusacellgsm.mx\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"UNEFON\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"GigSky\",\r\n\t\t\t\t\"_carrier_id\": \"2459\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"gigsky\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"GigSky\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CoopVoce MMS\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.coopvoce.it\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.coop.it/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"213.230.130.89\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Coop Mobile\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CoopVoce\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"web.coopvoce.it\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Coop Mobile\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Kenamobile web\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"web.kenamobile.it\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Kena Mobile R\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Kenamobile MMS\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.kenamobile.it\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.kenamobile.it/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.248.1.12\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Kena Mobile R\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Kena Mobile Web\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"web.kenamobile.it\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Kena Mobile MMS\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"mms.kenamobile.it\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.kenamobile.it\",\r\n\t\t\t\t\"_mmsproxy\": \"10.248.1.12\",\r\n\t\t\t\t\"_mmsport\": \"80\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"FW WEB\",\r\n\t\t\t\t\"_carrier_id\": \"2416\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"apn.fastweb.it\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"FW MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2416\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"apn.fastweb.it\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.fastweb.it/mms/wapenc\",\r\n\t\t\t\t\"_mmsproxy\": \"85.18.189.217\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone LTE\",\r\n\t\t\t\t\"_carrier_id\": \"29\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS Vodafone\",\r\n\t\t\t\t\"_carrier_id\": \"29\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mms.vodafone.it\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vodafone.it/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.128.224.10\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Acc. Internet da cell\",\r\n\t\t\t\t\"_carrier_id\": \"29\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mobile.vodafone.it\",\r\n\t\t\t\t\"_type\": \"default,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS Vodafone\",\r\n\t\t\t\t\"_carrier_id\": \"29\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ho.\",\r\n\t\t\t\t\"_carrier_id\": \"2455\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"web.ho-mobile.it\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,hipri,fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"ho.\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ho. (Tethering)\",\r\n\t\t\t\t\"_carrier_id\": \"2455\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"internet.ho-mobile.it\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"ho.\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"PosteMobile\",\r\n\t\t\t\t\"_carrier_id\": \"2303\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"wap.postemobile.it\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"PosteMobile\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"PosteMobile (DUN)\",\r\n\t\t\t\t\"_carrier_id\": \"2303\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"internet.postemobile.it\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"PosteMobile\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"PosteMobile MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2303\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mms.postemobile.it\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.postemobile.it/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.128.224.10\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"PosteMobile\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ErgMobile WAP\",\r\n\t\t\t\t\"_carrier_id\": \"2304\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mobile.erg.it\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"ERG\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DailyTelecomWAP\",\r\n\t\t\t\t\"_carrier_id\": \"2438\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"wap.dtm.it\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,dun\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Daily Telecom\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"PosteMobile\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"wap.postemobile.it\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"PosteMobile\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"PosteMobile MMS\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"mms.postemobile.it\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.postemobile.it/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.128.224.10\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"PosteMobile\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"35\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.it\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DIGI Italy\",\r\n\t\t\t\t\"_carrier_id\": \"2443\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"36\",\r\n\t\t\t\t\"_apn\": \"digi.mobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DIGI Italy IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2443\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"36\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Iliad\",\r\n\t\t\t\t\"_carrier_id\": \"2124\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"50\",\r\n\t\t\t\t\"_apn\": \"iliad\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.iliad.it\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,hipri,mms\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"F003\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"WEB CoopVoce\",\r\n\t\t\t\t\"_carrier_id\": \"2452\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"53\",\r\n\t\t\t\t\"_apn\": \"internet.coopvoce.it\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS CoopVoce\",\r\n\t\t\t\t\"_carrier_id\": \"2452\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"53\",\r\n\t\t\t\t\"_apn\": \"message.coopvoce.it\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.coop.it/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"213.230.130.89\",\r\n\t\t\t\t\"_mmsport\": \"80\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Italia Power\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"54\",\r\n\t\t\t\t\"_apn\": \"italiapower.it\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"Italia Power\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Plintron\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"54\",\r\n\t\t\t\t\"_apn\": \"data.plintron.it\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Plintron\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1573\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"88\",\r\n\t\t\t\t\"_apn\": \"internet.it\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1573\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"88\",\r\n\t\t\t\t\"_apn\": \"mms.it\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.windtre.it\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.windtre.it\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1575\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"99\",\r\n\t\t\t\t\"_apn\": \"internet.it\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1575\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"99\",\r\n\t\t\t\t\"_apn\": \"mms.it\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.windtre.it\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.windtre.it\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Fastweb WEB\",\r\n\t\t\t\t\"_carrier_id\": \"2039\",\r\n\t\t\t\t\"_mcc\": \"222\",\r\n\t\t\t\t\"_mnc\": \"99\",\r\n\t\t\t\t\"_apn\": \"apn.fastweb.it\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.fastweb.it/mms/wapenc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.65.9\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"FASTWEB\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live!\",\r\n\t\t\t\t\"_carrier_id\": \"2391\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"live.vodafone.com\",\r\n\t\t\t\t\"_user\": \"live\",\r\n\t\t\t\t\"_password\": \"vodafone\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2391\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telekom Romania Mobil\",\r\n\t\t\t\t\"_carrier_id\": \"1010\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telekom Romania Mobil\",\r\n\t\t\t\t\"_carrier_id\": \"1010\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"broadband\",\r\n\t\t\t\t\"_type\": \"default,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telekom Romania MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1010\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.mms.telekom.ro:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"10.252.1.62\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1959\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.10.3.133:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.3.130\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Digi.Mobil\",\r\n\t\t\t\t\"_carrier_id\": \"1959\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Digi.Mobil\",\r\n\t\t\t\t\"_carrier_id\": \"1959\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DIGI Spain\",\r\n\t\t\t\t\"_carrier_id\": \"2442\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"internet.digimobil.es\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"44474553\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DIGI Italy\",\r\n\t\t\t\t\"_carrier_id\": \"2443\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"digi.mobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"44474954\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telekom Romania Mobil\",\r\n\t\t\t\t\"_carrier_id\": \"1010\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telekom Romania Mobil\",\r\n\t\t\t\t\"_carrier_id\": \"1010\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"broadband\",\r\n\t\t\t\t\"_type\": \"default,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telekom Romania MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1010\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.mms.telekom.ro:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"10.252.1.62\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange LTE\",\r\n\t\t\t\t\"_carrier_id\": \"1011\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1011\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://wap.mms.orange.ro:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"62.217.247.252\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1011\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"net\",\r\n\t\t\t\t\"_type\": \"default\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1011\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_mcc\": \"226\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.ro\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sunrise live\",\r\n\t\t\t\t\"_carrier_id\": \"1413\",\r\n\t\t\t\t\"_mcc\": \"228\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sunrise IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1413\",\r\n\t\t\t\t\"_mcc\": \"228\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sunrise Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1413\",\r\n\t\t\t\t\"_mcc\": \"228\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Salt Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1414\",\r\n\t\t\t\t\"_mcc\": \"228\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Salt IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1414\",\r\n\t\t\t\t\"_mcc\": \"228\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Salt Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1414\",\r\n\t\t\t\t\"_mcc\": \"228\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"netgprs.com\",\r\n\t\t\t\t\"_carrier_id\": \"2271\",\r\n\t\t\t\t\"_mcc\": \"228\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"netgprs.com\",\r\n\t\t\t\t\"_user\": \"tsl\",\r\n\t\t\t\t\"_password\": \"tsl\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"CH-Transatel\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"netgprs.com\",\r\n\t\t\t\t\"_carrier_id\": \"2271\",\r\n\t\t\t\t\"_mcc\": \"228\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"netgprs.com\",\r\n\t\t\t\t\"_user\": \"tsl\",\r\n\t\t\t\t\"_password\": \"tsl\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"BB00\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"upcnet\",\r\n\t\t\t\t\"_mcc\": \"228\",\r\n\t\t\t\t\"_mnc\": \"53\",\r\n\t\t\t\t\"_apn\": \"Internet.ch.upcmobile.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"75636831\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_mcc\": \"228\",\r\n\t\t\t\t\"_mnc\": \"54\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.ch\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2394\",\r\n\t\t\t\t\"_mcc\": \"230\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile CZ\",\r\n\t\t\t\t\"_carrier_id\": \"2394\",\r\n\t\t\t\t\"_mcc\": \"230\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.t-mobile.cz\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2394\",\r\n\t\t\t\t\"_mcc\": \"230\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.t-mobile.cz\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.10\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_network_type_bitmask\": \"1|2|3|4|5|6|7|8|9|10|12|13|14|15|17|20\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOS\",\r\n\t\t\t\t\"_carrier_id\": \"2394\",\r\n\t\t\t\t\"_mcc\": \"230\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.10\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_network_type_bitmask\": \"18\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOS\",\r\n\t\t\t\t\"_mcc\": \"230\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"O2 internet\",\r\n\t\t\t\t\"_carrier_id\": \"1449\",\r\n\t\t\t\t\"_mcc\": \"230\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"O2 MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1449\",\r\n\t\t\t\t\"_mcc\": \"230\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.o2active.cz:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"160.218.160.218\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"O2 VoLTE Hlas\",\r\n\t\t\t\t\"_carrier_id\": \"1449\",\r\n\t\t\t\t\"_mcc\": \"230\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"O2 VoLTE\",\r\n\t\t\t\t\"_carrier_id\": \"1449\",\r\n\t\t\t\t\"_mcc\": \"230\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2398\",\r\n\t\t\t\t\"_mcc\": \"230\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2398\",\r\n\t\t\t\t\"_mcc\": \"230\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.11.10.111\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2398\",\r\n\t\t\t\t\"_mcc\": \"230\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange LTE\",\r\n\t\t\t\t\"_carrier_id\": \"1713\",\r\n\t\t\t\t\"_mcc\": \"231\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1713\",\r\n\t\t\t\t\"_mcc\": \"231\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1713\",\r\n\t\t\t\t\"_mcc\": \"231\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://imms.orange.sk\",\r\n\t\t\t\t\"_mmsproxy\": \"213.151.208.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1713\",\r\n\t\t\t\t\"_mcc\": \"231\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange UT\",\r\n\t\t\t\t\"_carrier_id\": \"1713\",\r\n\t\t\t\t\"_mcc\": \"231\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile internet\",\r\n\t\t\t\t\"_carrier_id\": \"2385\",\r\n\t\t\t\t\"_mcc\": \"231\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOS\",\r\n\t\t\t\t\"_carrier_id\": \"2385\",\r\n\t\t\t\t\"_mcc\": \"231\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.telekom.sk\",\r\n\t\t\t\t\"_type\": \"mms,xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2385\",\r\n\t\t\t\t\"_mcc\": \"231\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"4ka Internet\",\r\n\t\t\t\t\"_mcc\": \"231\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"4KA SK\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"O2 internet\",\r\n\t\t\t\t\"_carrier_id\": \"1988\",\r\n\t\t\t\t\"_mcc\": \"231\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"o2internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"O2 MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1988\",\r\n\t\t\t\t\"_mcc\": \"231\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"o2mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.o2world.sk:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"10.97.1.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"live!\",\r\n\t\t\t\t\"_carrier_id\": \"14\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"A1.net\",\r\n\t\t\t\t\"_user\": \"ppp@a1plus.at\",\r\n\t\t\t\t\"_password\": \"ppp\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"A1 MMS\",\r\n\t\t\t\t\"_carrier_id\": \"14\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"free.A1.net\",\r\n\t\t\t\t\"_user\": \"ppp@a1plus.at\",\r\n\t\t\t\t\"_password\": \"ppp\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.a1.net\",\r\n\t\t\t\t\"_mmsproxy\": \"194.48.124.71\",\r\n\t\t\t\t\"_mmsport\": \"8001\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"A1 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"14\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"A1 HOS\",\r\n\t\t\t\t\"_carrier_id\": \"14\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile A Internet\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.t-mobile.at\",\r\n\t\t\t\t\"_user\": \"T\",\r\n\t\t\t\t\"_password\": \"tm\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile IMS\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOS\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_user\": \"t-mobile\",\r\n\t\t\t\t\"_password\": \"tm\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.t-mobile.at/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.12.0.20\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Goodspeed\",\r\n\t\t\t\t\"_carrier_id\": \"2512\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"uros.iot\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"C5\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile A Internet\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"internet.t-mobile.at\",\r\n\t\t\t\t\"_user\": \"t-mobile\",\r\n\t\t\t\t\"_password\": \"tm\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile IMS\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOS\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_user\": \"t-mobile\",\r\n\t\t\t\t\"_password\": \"tm\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.t-mobile.at/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.12.0.20\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"xcap,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Planet 3\",\r\n\t\t\t\t\"_carrier_id\": \"1344\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"drei.at\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"213.94.78.133\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1344\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOS\",\r\n\t\t\t\t\"_carrier_id\": \"2094\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_user\": \"t-mobile\",\r\n\t\t\t\t\"_password\": \"tm\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.t-mobile.at/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.12.0.20\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2094\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile A Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2094\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet.t-mobile.at\",\r\n\t\t\t\t\"_user\": \"T\",\r\n\t\t\t\t\"_password\": \"tm\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HoT Internet\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"webaut\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"23207761\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HoT MMS\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"mmsaut\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsaut.at/send\",\r\n\t\t\t\t\"_mmsproxy\": \"212.95.31.50\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"23207761\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"0677 web\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"webaut\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"23207718\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"0677 mms\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"mmsaut\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsaut.at/send\",\r\n\t\t\t\t\"_mmsproxy\": \"212.95.31.50\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"23207718\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"0677 web\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"webaut\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"23207799\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"0677 mms\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"mmsaut\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsaut.at/send\",\r\n\t\t\t\t\"_mmsproxy\": \"212.95.31.50\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"23207799\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_carrier_id\": \"2404\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.at\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Planet 3\",\r\n\t\t\t\t\"_carrier_id\": \"1344\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"drei.at\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"213.94.78.133\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1344\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"data.bob\",\r\n\t\t\t\t\"_carrier_id\": \"14\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"bob.at\",\r\n\t\t\t\t\"_user\": \"data@bob.at\",\r\n\t\t\t\t\"_password\": \"ppp\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"data.bob MMS\",\r\n\t\t\t\t\"_carrier_id\": \"14\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"mms.bob.at\",\r\n\t\t\t\t\"_user\": \"data@bob.at\",\r\n\t\t\t\t\"_password\": \"ppp\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.bob.at\",\r\n\t\t\t\t\"_mmsproxy\": \"194.48.124.7\",\r\n\t\t\t\t\"_mmsport\": \"8001\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"WEBAPN.AT\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"webapn.at\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"UPC mobiles Internet\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"Internet.at.upcmobile.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"75617431\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Planet 3\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"drei.at\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"213.94.78.133\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 Web\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"internet.tele2.at\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Plintron\",\r\n\t\t\t\t\"_carrier_id\": \"2424\",\r\n\t\t\t\t\"_mcc\": \"232\",\r\n\t\t\t\t\"_mnc\": \"22\",\r\n\t\t\t\t\"_apn\": \"data.plintron.at\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Plintron\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"UBIQUISYS\",\r\n\t\t\t\t\"_carrier_id\": \"1491\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"O2 MOBILE WEB\",\r\n\t\t\t\t\"_carrier_id\": \"1492\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mobile.o2.co.uk\",\r\n\t\t\t\t\"_user\": \"O2web\",\r\n\t\t\t\t\"_password\": \"O2web\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"O2 MMS Prepay\",\r\n\t\t\t\t\"_carrier_id\": \"1492\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"payandgo.o2.co.uk\",\r\n\t\t\t\t\"_user\": \"payandgo\",\r\n\t\t\t\t\"_password\": \"password\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mms.o2.co.uk:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"82.132.254.1\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"O2 MMS Postpay\",\r\n\t\t\t\t\"_carrier_id\": \"1492\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"wap.o2.co.uk\",\r\n\t\t\t\t\"_user\": \"o2wap\",\r\n\t\t\t\t\"_password\": \"password\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mms.o2.co.uk:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"82.132.254.1\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Spitfire Data\",\r\n\t\t\t\t\"_carrier_id\": \"1495\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"spitfire1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Spitfire MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1495\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.spitfire.co.uk/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"87.224.55.90\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Spitfire IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1495\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BT One Phone Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2103\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"internet.btonephone.com\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"B2\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BT One Phone MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2103\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"mms.btonephone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://MMSC/\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.btonephone.com\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"B2\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"o2 Pay Monthly\",\r\n\t\t\t\t\"_carrier_id\": \"1492\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mobile.o2.co.uk\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mms.o2.co.uk:8002\",\r\n\t\t\t\t\"_user\": \"o2\",\r\n\t\t\t\t\"_password\": \"p\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,cbs,xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"o2 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1492\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"o2 Pay As You Go\",\r\n\t\t\t\t\"_carrier_id\": \"10002\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"payandgo.o2.co.uk\",\r\n\t\t\t\t\"_user\": \"o2\",\r\n\t\t\t\t\"_password\": \"p\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mms.o2.co.uk:8002\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"61\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"o2 Pay As You Go\",\r\n\t\t\t\t\"_carrier_id\": \"10002\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"payandgo.o2.co.uk\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mms.o2.co.uk:8002\",\r\n\t\t\t\t\"_user\": \"o2\",\r\n\t\t\t\t\"_password\": \"p\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"67\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"o2 Pay As You Go\",\r\n\t\t\t\t\"_carrier_id\": \"10002\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"payandgo.o2.co.uk\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mms.o2.co.uk:8002\",\r\n\t\t\t\t\"_user\": \"o2\",\r\n\t\t\t\t\"_password\": \"p\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"85\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"o2 Pay As You Go\",\r\n\t\t\t\t\"_carrier_id\": \"10002\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"payandgo.o2.co.uk\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mms.o2.co.uk:8002\",\r\n\t\t\t\t\"_user\": \"o2\",\r\n\t\t\t\t\"_password\": \"p\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"99\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TESCO\",\r\n\t\t\t\t\"_carrier_id\": \"2093\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"prepay.tesco-mobile.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mms.o2.co.uk:8002\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"tm\",\r\n\t\t\t\t\"_password\": \"p\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"0A\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"giffgaff\",\r\n\t\t\t\t\"_carrier_id\": \"2118\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"giffgaff.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"gg\",\r\n\t\t\t\t\"_password\": \"p\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mediamessaging.co.uk:8002\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"giffgaff\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Jump\",\r\n\t\t\t\t\"_carrier_id\": \"2138\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mobiledata\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Jump\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"o2 Mobile Web\",\r\n\t\t\t\t\"_carrier_id\": \"1492\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"mobile.o2.co.uk\",\r\n\t\t\t\t\"_user\": \"O2web\",\r\n\t\t\t\t\"_password\": \"O2web\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"o2 MMS Prepay\",\r\n\t\t\t\t\"_carrier_id\": \"1492\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"payandgo.o2.co.uk\",\r\n\t\t\t\t\"_user\": \"payandgo\",\r\n\t\t\t\t\"_password\": \"password\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mms.02.co.uk:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"82.132.254.1\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"o2 MMS Postpay\",\r\n\t\t\t\t\"_carrier_id\": \"1492\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"wap.o2.co.uk\",\r\n\t\t\t\t\"_user\": \"o2wap\",\r\n\t\t\t\t\"_password\": \"password\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mms.02.co.uk:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"82.132.254.1\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone UK Data\",\r\n\t\t\t\t\"_carrier_id\": \"28\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"wap.vodafone.co.uk\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"*wap\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vodafone.co.uk/servlets/mms*\",\r\n\t\t\t\t\"_mmsproxy\": \"212.183.137.12\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone UK IMS\",\r\n\t\t\t\t\"_carrier_id\": \"28\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone UK UT\",\r\n\t\t\t\t\"_carrier_id\": \"28\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Talkmobile Data\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"talkmobile.co.uk\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.talkmobile.co.uk/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"212.183.137.12\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"C1\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ASDA Mobile Data\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"MY.INTERNET\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ad.vodafone.co.uk/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"212.183.137.12\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"A1\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara Data\",\r\n\t\t\t\t\"_carrier_id\": \"2309\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"UK.LEBARA.MOBI\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.lebara.co.uk/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"212.183.137.12\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"90\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3\",\r\n\t\t\t\t\"_carrier_id\": \"1505\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"three.co.uk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.um.three.co.uk:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.three.co.uk\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"1505\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"3hotspot\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1505\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"iD Mobile Ut\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"id\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0305\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"iD Mobile\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"id\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.um.idmobile.co.uk:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.idmobile.co.uk\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0305\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"iD Mobile IMS\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0305\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"GAMMA\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"gamma\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.um.three.co.uk:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.three.co.uk\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"030B\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SMARTY Ut\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"mob.asm.net\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0309\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SMARTY\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"mob.asm.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.um.three.co.uk:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.three.co.uk\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0309\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SMARTY IMS\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0309\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Superdrug Ut\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"superdrug.net\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0310\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Superdrug\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"superdrug.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.um.three.co.uk:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.three.co.uk\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0310\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Superdrug IMS\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0310\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"25\",\r\n\t\t\t\t\"_apn\": \"truphone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.truphone.com:1981/mm1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"25\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_carrier_id\": \"2152\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"26\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.co.uk\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"lmuk\",\r\n\t\t\t\t\"_password\": \"plus\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tata Move UK\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"27\",\r\n\t\t\t\t\"_apn\": \"move.dataxs.mobi\",\r\n\t\t\t\t\"_type\": \"default,supl,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"27\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE Internet\",\r\n\t\t\t\t\"_carrier_id\": \"718\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"everywhere\",\r\n\t\t\t\t\"_user\": \"eesecure\",\r\n\t\t\t\t\"_password\": \"secure\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE ut\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"eezone\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE MMS\",\r\n\t\t\t\t\"_carrier_id\": \"718\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"eezone\",\r\n\t\t\t\t\"_user\": \"eesecure\",\r\n\t\t\t\t\"_password\": \"secure\",\r\n\t\t\t\t\"_mmsc\": \"http://mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"149.254.201.135\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE Emergency\",\r\n\t\t\t\t\"_carrier_id\": \"718\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"SOS\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"emergency\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE IMS\",\r\n\t\t\t\t\"_carrier_id\": \"718\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE Internet\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"everywhere\",\r\n\t\t\t\t\"_user\": \"eesecure\",\r\n\t\t\t\t\"_password\": \"secure\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"EE\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE MMS\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"eezone\",\r\n\t\t\t\t\"_user\": \"eesecure\",\r\n\t\t\t\t\"_password\": \"secure\",\r\n\t\t\t\t\"_mmsc\": \"http://mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"149.254.201.135\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"EE\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE IMS\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"EE\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BT OnePhone Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2103\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"internet.btonephone.com\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"B2\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BT OnePhone MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2103\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"mms.btonephone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://MMSC/\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.btonephone.com\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"B2\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BT Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2102\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"everywhere\",\r\n\t\t\t\t\"_user\": \"eesecure\",\r\n\t\t\t\t\"_password\": \"secure\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"B3\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BT MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2102\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"eezone\",\r\n\t\t\t\t\"_user\": \"eesecure\",\r\n\t\t\t\t\"_password\": \"secure\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"149.254.201.135\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"B3\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BT Emergency\",\r\n\t\t\t\t\"_carrier_id\": \"2102\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"SOS\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"B3\",\r\n\t\t\t\t\"_type\": \"emergency\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BT IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2102\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"B3\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BT Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2101\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"everywhere\",\r\n\t\t\t\t\"_user\": \"eesecure\",\r\n\t\t\t\t\"_password\": \"secure\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"C3\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BT MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2101\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"eezone\",\r\n\t\t\t\t\"_user\": \"eesecure\",\r\n\t\t\t\t\"_password\": \"secure\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"149.254.201.135\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"C3\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BT Emergency\",\r\n\t\t\t\t\"_carrier_id\": \"2101\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"SOS\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"C3\",\r\n\t\t\t\t\"_type\": \"emergency\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BT IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2101\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"C3\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE Internet\",\r\n\t\t\t\t\"_carrier_id\": \"718\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"everywhere\",\r\n\t\t\t\t\"_user\": \"eesecure\",\r\n\t\t\t\t\"_password\": \"secure\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE MMS\",\r\n\t\t\t\t\"_carrier_id\": \"718\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"eezone\",\r\n\t\t\t\t\"_user\": \"eesecure\",\r\n\t\t\t\t\"_password\": \"secure\",\r\n\t\t\t\t\"_mmsc\": \"http://mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"149.254.201.135\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE Emergency\",\r\n\t\t\t\t\"_carrier_id\": \"718\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"SOS\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"emergency\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE IMS\",\r\n\t\t\t\t\"_carrier_id\": \"718\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE Internet\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"everywhere\",\r\n\t\t\t\t\"_user\": \"eesecure\",\r\n\t\t\t\t\"_password\": \"secure\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"EE\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE ut\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"eezone\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE MMS\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"eezone\",\r\n\t\t\t\t\"_user\": \"eesecure\",\r\n\t\t\t\t\"_password\": \"secure\",\r\n\t\t\t\t\"_mmsc\": \"http://mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"149.254.201.135\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"EE\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE IMS\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"EE\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BT Internet\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"everywhere\",\r\n\t\t\t\t\"_user\": \"eesecure\",\r\n\t\t\t\t\"_password\": \"secure\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"B3\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BT MMS\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"eezone\",\r\n\t\t\t\t\"_user\": \"eesecure\",\r\n\t\t\t\t\"_password\": \"secure\",\r\n\t\t\t\t\"_mmsc\": \"http://mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"149.254.201.135\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"B3\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BT IMS\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"B3\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE IMS\",\r\n\t\t\t\t\"_carrier_id\": \"718\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"34\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Virgin IMS\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"38\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Virgin Ut\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"38\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Virgin Mobile\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"38\",\r\n\t\t\t\t\"_apn\": \"goto.virginmobile.uk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.virginmobile.co.uk:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"193.30.166.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Jump\",\r\n\t\t\t\t\"_carrier_id\": \"2138\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"39\",\r\n\t\t\t\t\"_apn\": \"Jump\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobi/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"164.39.236.69\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Jump\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gamma Data\",\r\n\t\t\t\t\"_carrier_id\": \"2137\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"39\",\r\n\t\t\t\t\"_apn\": \"gamma.co.uk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.gamma.co.uk/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"164.39.236.69\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EMnify\",\r\n\t\t\t\t\"_carrier_id\": \"2326\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"50\",\r\n\t\t\t\t\"_apn\": \"em\",\r\n\t\t\t\t\"_mvno_match_data\": \"234500022\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Jersey Telecom\",\r\n\t\t\t\t\"_carrier_id\": \"1506\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"50\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.surfmail.com/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"212.9.19.199\",\r\n\t\t\t\t\"_mmsport\": \"3130\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"pepperWEB (Jersey)\",\r\n\t\t\t\t\"_carrier_id\": \"1506\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"50\",\r\n\t\t\t\t\"_apn\": \"pepper\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MobileUC IMS\",\r\n\t\t\t\t\"_carrier_id\": \"10031\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"53\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MobileUC Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"10031\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"53\",\r\n\t\t\t\t\"_apn\": \"globalhotspot\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MobileUC\",\r\n\t\t\t\t\"_carrier_id\": \"10031\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"53\",\r\n\t\t\t\t\"_apn\": \"globaldata\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,hipri,fota\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mobileuc.global/\",\r\n\t\t\t\t\"_mmsproxy\": \"37.18.129.98\",\r\n\t\t\t\t\"_mmsport\": \"8008\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"C&W Guernsey Internet\",\r\n\t\t\t\t\"_carrier_id\": \"720\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"55\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sure Picture Messaging\",\r\n\t\t\t\t\"_carrier_id\": \"720\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"55\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.gprs.cw.com/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.3.101\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"57\",\r\n\t\t\t\t\"_apn\": \"mobile.sky\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"57\",\r\n\t\t\t\t\"_apn\": \"mms.mobile.sky\",\r\n\t\t\t\t\"_mmsc\": \"http://185.110.178.96:38090/was\",\r\n\t\t\t\t\"_mmsproxy\": \"185.110.178.97\",\r\n\t\t\t\t\"_mmsport\": \"9028\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"1|2|3|4|5|6|7|8|9|10|12|13|14|15|17|20\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sky IMS\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"57\",\r\n\t\t\t\t\"_apn\": \"IMS\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sky Ut\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"57\",\r\n\t\t\t\t\"_apn\": \"ut.mobile.sky\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sky MMS VoWiFi\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"57\",\r\n\t\t\t\t\"_apn\": \"wifi.mms.mobile.sky\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://185.110.178.96:38090/was\",\r\n\t\t\t\t\"_mmsproxy\": \"185.110.178.97\",\r\n\t\t\t\t\"_mmsport\": \"9028\",\r\n\t\t\t\t\"_network_type_bitmask\": \"18\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3G HSDPA\",\r\n\t\t\t\t\"_carrier_id\": \"1507\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"58\",\r\n\t\t\t\t\"_apn\": \"3gpronto\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Manx Telecom Contract\",\r\n\t\t\t\t\"_carrier_id\": \"1507\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"58\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Manx Telecom Contract MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1507\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"58\",\r\n\t\t\t\t\"_apn\": \"mms.manxpronto.net\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.manxpronto.net:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"195.10.99.46\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Manx Telecom Prepay\",\r\n\t\t\t\t\"_carrier_id\": \"1507\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"58\",\r\n\t\t\t\t\"_apn\": \"web.prontogo.net\",\r\n\t\t\t\t\"_user\": \"webgo\",\r\n\t\t\t\t\"_password\": \"webgo\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Manx Telecom Prepay MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1507\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"58\",\r\n\t\t\t\t\"_apn\": \"mms.prontogo.net\",\r\n\t\t\t\t\"_user\": \"mmsgo\",\r\n\t\t\t\t\"_password\": \"mmsgo\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.manxpronto.net:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"195.10.99.41\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE Internet\",\r\n\t\t\t\t\"_carrier_id\": \"718\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"86\",\r\n\t\t\t\t\"_apn\": \"everywhere\",\r\n\t\t\t\t\"_user\": \"eesecure\",\r\n\t\t\t\t\"_password\": \"secure\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EE MMS\",\r\n\t\t\t\t\"_carrier_id\": \"718\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"86\",\r\n\t\t\t\t\"_apn\": \"eezone\",\r\n\t\t\t\t\"_user\": \"eesecure\",\r\n\t\t\t\t\"_password\": \"secure\",\r\n\t\t\t\t\"_mmsc\": \"http://mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"149.254.201.135\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara UK\",\r\n\t\t\t\t\"_carrier_id\": \"2564\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"87\",\r\n\t\t\t\t\"_apn\": \"uk.lebara.mobi\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara UK\",\r\n\t\t\t\t\"_carrier_id\": \"2564\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"87\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara UK\",\r\n\t\t\t\t\"_carrier_id\": \"2564\",\r\n\t\t\t\t\"_mcc\": \"234\",\r\n\t\t\t\t\"_mnc\": \"87\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"1505\",\r\n\t\t\t\t\"_mcc\": \"235\",\r\n\t\t\t\t\"_mnc\": \"94\",\r\n\t\t\t\t\"_apn\": \"3hotspot\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3\",\r\n\t\t\t\t\"_carrier_id\": \"1505\",\r\n\t\t\t\t\"_mcc\": \"235\",\r\n\t\t\t\t\"_mnc\": \"94\",\r\n\t\t\t\t\"_apn\": \"three.co.uk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.um.three.co.uk:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.three.co.uk\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TDC Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1463\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TDC MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1463\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.tdc.dk:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"inetproxy.tdc.dk\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TDC Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1463\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TDC IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1463\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor LTE\",\r\n\t\t\t\t\"_carrier_id\": \"1464\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1464\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"Internet\",\r\n\t\t\t\t\"_type\": \"default,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1464\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"telenor\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.telenor.dk\",\r\n\t\t\t\t\"_mmsproxy\": \"212.88.64.8\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1464\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1464\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3\",\r\n\t\t\t\t\"_carrier_id\": \"1466\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"data.tre.dk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.3.dk/\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.3.dk\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"1|2|3|4|5|6|7|8|9|10|12|13|14|15|17|20\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 MMS iWLAN\",\r\n\t\t\t\t\"_carrier_id\": \"1466\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"services\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.3.dk/\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.3.dk\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"18\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 DK Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1466\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"services\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 DK IMS\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.dk\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"656\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"www.internet.mtelia.dk\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"656\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"www.mms.mtelia.dk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.telia.dk\",\r\n\t\t\t\t\"_mmsproxy\": \"193.209.134.131\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telia IMS\",\r\n\t\t\t\t\"_carrier_id\": \"656\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telia Ut\",\r\n\t\t\t\t\"_carrier_id\": \"656\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"656\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"www.internet.mtelia.dk\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"656\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"www.mms.mtelia.dk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.telia.dk\",\r\n\t\t\t\t\"_mmsproxy\": \"193.209.134.131\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telia IMS\",\r\n\t\t\t\t\"_carrier_id\": \"656\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telia Ut\",\r\n\t\t\t\t\"_carrier_id\": \"656\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"657\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"77\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"657\",\r\n\t\t\t\t\"_mcc\": \"238\",\r\n\t\t\t\t\"_mnc\": \"77\",\r\n\t\t\t\t\"_apn\": \"telenor\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.telenor.dk\",\r\n\t\t\t\t\"_mmsproxy\": \"212.88.64.8\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Halebop Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2287\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"halebop.telia.se\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"halebop\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Halebop MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2287\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.telia.se\",\r\n\t\t\t\t\"_mmsc\": \"http://mmss\",\r\n\t\t\t\t\"_mmsproxy\": \"193.209.134.132\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"halebop\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Halebop IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2287\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"halebop\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Halebop Ut\",\r\n\t\t\t\t\"_carrier_id\": \"2287\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"halebop\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3\",\r\n\t\t\t\t\"_carrier_id\": \"1691\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"data.tre.se\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.tre.se\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.tre.se\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"1|2|3|4|5|6|7|8|9|10|12|13|14|15|17|20\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 MMS iWLAN\",\r\n\t\t\t\t\"_carrier_id\": \"1691\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"services\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.tre.se\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.tre.se\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"18\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1691\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"services\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1691\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3\",\r\n\t\t\t\t\"_carrier_id\": \"1693\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"data.tre.se\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.tre.se\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.tre.se\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1694\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"4g.tele2.se\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.tele2.se\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.tele2.se\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"Tele2\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1695\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1695\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.media\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vimla IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1695\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vimla Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1695\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1696\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet.tele2.se\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.tele2.se\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.tele2.se\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1696\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 XCAP\",\r\n\t\t\t\t\"_carrier_id\": \"1696\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"HOS\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 MMS\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet.tele2.no\",\r\n\t\t\t\t\"_mmsproxy\": \"193.12.40.14\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.tele2.no\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"2400768xxxxxxxx\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 Internet\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet.tele2.no\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mvno_match_data\": \"2400768xxxxxxxx\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 Web\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet.tele2.at\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"2400764xxxxxxxx\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 Web\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet.tele2.at\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"2400765xxxxxxxx\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 Internet\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet.tele2.nl\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"4E4C\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Jump\",\r\n\t\t\t\t\"_carrier_id\": \"2138\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"Jump\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobi/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"164.39.236.69\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Jump\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gamma Data\",\r\n\t\t\t\t\"_carrier_id\": \"2137\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"gamma.co.uk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.gamma.co.uk/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"164.39.236.69\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"240075610\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sky IMS\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"IMS\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0C\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sky MMS\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"mms.mobile.sky\",\r\n\t\t\t\t\"_mmsproxy\": \"185.110.178.97\",\r\n\t\t\t\t\"_mmsport\": \"9028\",\r\n\t\t\t\t\"_mmsc\": \"http://185.110.178.96:38090/was\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_network_type_bitmask\": \"1|2|3|4|5|6|7|8|9|10|12|13|14|15|17|20\",\r\n\t\t\t\t\"_mvno_match_data\": \"0C\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sky MMS VoWiFi\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"wifi.mms.mobile.sky\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://185.110.178.96:38090/was\",\r\n\t\t\t\t\"_mmsproxy\": \"185.110.178.97\",\r\n\t\t\t\t\"_mmsport\": \"9028\",\r\n\t\t\t\t\"_network_type_bitmask\": \"18\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0C\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sky Internet\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"mobile.sky\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"0C\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sky Ut\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"ut.mobile.sky\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0C\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sberbank-Telecom Internet\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet.sberbank-tele.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"FA3207FF\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor Mobilsurf\",\r\n\t\t\t\t\"_carrier_id\": \"1695\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"services.telenor.se\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1695\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.30.253.241\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1695\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1695\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Com4\",\r\n\t\t\t\t\"_carrier_id\": \"1956\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"com4\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Spring data\",\r\n\t\t\t\t\"_carrier_id\": \"1697\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"data.springmobil.se\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Spring MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1697\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mms.springmobil.se\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.springmobil.se\",\r\n\t\t\t\t\"_mmsproxy\": \"213.88.184.37\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_carrier_id\": \"2405\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.se\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1696\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"24\",\r\n\t\t\t\t\"_apn\": \"4g.tele2.se\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.tele2.se\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.tele2.se\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"Tele2\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"netmore\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"40\",\r\n\t\t\t\t\"_apn\": \"data.rewicom.net\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Goodspeed\",\r\n\t\t\t\t\"_carrier_id\": \"2512\",\r\n\t\t\t\t\"_mcc\": \"240\",\r\n\t\t\t\t\"_mnc\": \"42\",\r\n\t\t\t\t\"_apn\": \"uros.iot\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"C5\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor LTE\",\r\n\t\t\t\t\"_carrier_id\": \"958\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor Smart\",\r\n\t\t\t\t\"_carrier_id\": \"958\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"telenor.smart\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"default,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"958\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"telenor.mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mms-proxy.telenor.no\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor IMS\",\r\n\t\t\t\t\"_carrier_id\": \"958\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor Ut\",\r\n\t\t\t\t\"_carrier_id\": \"958\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telia\",\r\n\t\t\t\t\"_carrier_id\": \"959\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"telia\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telia MMS\",\r\n\t\t\t\t\"_carrier_id\": \"959\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mm/\",\r\n\t\t\t\t\"_mmsproxy\": \"212.169.66.4\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telia IMS\",\r\n\t\t\t\t\"_carrier_id\": \"959\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telia Ut\",\r\n\t\t\t\t\"_carrier_id\": \"959\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"961\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"internet.tele2.no\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.tele2.no\",\r\n\t\t\t\t\"_mmsproxy\": \"193.12.40.14\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"OneCall Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1900\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"OneCall MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1900\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.100.100.100\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1900\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1900\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Com4\",\r\n\t\t\t\t\"_carrier_id\": \"2134\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"com4\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IXT\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"ixt\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IXT IMS\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"ixtims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ice.net\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"ice.net\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mms.ice.net\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"mms.ice.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"185.83.167.222\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ICE IMS\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"eRate Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2524\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_mvno_match_data\": \"0E\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,supl,ims,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"eRate MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2524\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.media\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"0E\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_mcc\": \"242\",\r\n\t\t\t\t\"_mnc\": \"23\",\r\n\t\t\t\t\"_apn\": \"data.lyca-mobile.no\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DNA Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1904\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DNA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1904\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.dna.fi\",\r\n\t\t\t\t\"_mmsproxy\": \"10.1.1.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Elisa Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1475\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Elisa MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1475\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.elisa.fi\",\r\n\t\t\t\t\"_mmsproxy\": \"213.161.41.57\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Elisa IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1475\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Elisa Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1475\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Saunalahti Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1479\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"internet.saunalahti\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"2440541\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Saunalahti MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1479\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms.saunalahti.fi\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.saunalahti.fi:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"62.142.4.197\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"2440541\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TDC Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1907\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"internet.song.fi\",\r\n\t\t\t\t\"_user\": \"song@internet\",\r\n\t\t\t\t\"_password\": \"songnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TDC MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1907\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mms.song.fi\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.song.fi\",\r\n\t\t\t\t\"_mmsproxy\": \"213.161.41.58\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DNA Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1904\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DNA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1904\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.dna.fi\",\r\n\t\t\t\t\"_mmsproxy\": \"10.1.1.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DNA IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1904\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DNA ut\",\r\n\t\t\t\t\"_carrier_id\": \"1904\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DNA Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1904\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DNA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1904\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"dna\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.dnafinland.fi/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.1.1.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DNA IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1904\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DNA Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1904\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Alcom\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.amt.aland.fi\",\r\n\t\t\t\t\"_mmsproxy\": \"194.110.177.70\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Saunalahti Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1479\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"21\",\r\n\t\t\t\t\"_apn\": \"internet.saunalahti\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Saunalahti MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1479\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"21\",\r\n\t\t\t\t\"_apn\": \"mms.saunalahti.fi\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.saunalahti.fi:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"62.142.4.197\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telia Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1480\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"91\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telia MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1480\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"91\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"195.156.25.33\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telia IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1480\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"91\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telia Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1480\",\r\n\t\t\t\t\"_mcc\": \"244\",\r\n\t\t\t\t\"_mnc\": \"91\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Omnitel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"892\",\r\n\t\t\t\t\"_mcc\": \"246\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"gprs.mms.lt\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.omnitel.net:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"194.176.32.149\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Omnitel Internet\",\r\n\t\t\t\t\"_carrier_id\": \"892\",\r\n\t\t\t\t\"_mcc\": \"246\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"omnitel\",\r\n\t\t\t\t\"_user\": \"omni\",\r\n\t\t\t\t\"_password\": \"omni\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Omnitel IMS\",\r\n\t\t\t\t\"_mcc\": \"246\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Omnitel Ut\",\r\n\t\t\t\t\"_mcc\": \"246\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bite Internet\",\r\n\t\t\t\t\"_carrier_id\": \"893\",\r\n\t\t\t\t\"_mcc\": \"246\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bite MMS\",\r\n\t\t\t\t\"_carrier_id\": \"893\",\r\n\t\t\t\t\"_mcc\": \"246\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.150.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 Internet LT\",\r\n\t\t\t\t\"_carrier_id\": \"894\",\r\n\t\t\t\t\"_mcc\": \"246\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.tele2.lt\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.tele2.lt/\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.tele2.lt\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LMT Internet\",\r\n\t\t\t\t\"_carrier_id\": \"898\",\r\n\t\t\t\t\"_mcc\": \"247\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.lmt.lv\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.lmt.lv/mmsc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LMT IMS\",\r\n\t\t\t\t\"_carrier_id\": \"898\",\r\n\t\t\t\t\"_mcc\": \"247\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"IMS\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LMT Ut\",\r\n\t\t\t\t\"_carrier_id\": \"898\",\r\n\t\t\t\t\"_mcc\": \"247\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 LV Internet\",\r\n\t\t\t\t\"_carrier_id\": \"899\",\r\n\t\t\t\t\"_mcc\": \"247\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet.tele2.lv\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 LV MMS\",\r\n\t\t\t\t\"_carrier_id\": \"899\",\r\n\t\t\t\t\"_mcc\": \"247\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms.tele2.lv\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.tele2.lv/\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.tele2.lv\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bite LV Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2037\",\r\n\t\t\t\t\"_mcc\": \"247\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bite LV MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2037\",\r\n\t\t\t\t\"_mcc\": \"247\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.150.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LMT Internet\",\r\n\t\t\t\t\"_mcc\": \"247\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"internet.lmt.lv\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.lmt.lv/mmsc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LMT IMS\",\r\n\t\t\t\t\"_mcc\": \"247\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"IMS\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LMT Ut\",\r\n\t\t\t\t\"_mcc\": \"247\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EMT Internet\",\r\n\t\t\t\t\"_carrier_id\": \"667\",\r\n\t\t\t\t\"_mcc\": \"248\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.emt.ee\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EMT MMS\",\r\n\t\t\t\t\"_carrier_id\": \"667\",\r\n\t\t\t\t\"_mcc\": \"248\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.emt.ee\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.emt.ee/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"217.71.32.82\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EMT IMS\",\r\n\t\t\t\t\"_carrier_id\": \"667\",\r\n\t\t\t\t\"_mcc\": \"248\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EMT Ut\",\r\n\t\t\t\t\"_carrier_id\": \"667\",\r\n\t\t\t\t\"_mcc\": \"248\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Send\",\r\n\t\t\t\t\"_carrier_id\": \"2332\",\r\n\t\t\t\t\"_mcc\": \"248\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"send.ee\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.emt.ee/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"217.71.32.82\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"248010x2\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Send\",\r\n\t\t\t\t\"_carrier_id\": \"2332\",\r\n\t\t\t\t\"_mcc\": \"248\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"send.ee\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.emt.ee/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"217.71.32.82\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"248010x3\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Send\",\r\n\t\t\t\t\"_carrier_id\": \"2332\",\r\n\t\t\t\t\"_mcc\": \"248\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"send.ee\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.emt.ee/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"217.71.32.82\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"2480101601\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Send\",\r\n\t\t\t\t\"_carrier_id\": \"2332\",\r\n\t\t\t\t\"_mcc\": \"248\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"send.ee\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.emt.ee/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"217.71.32.82\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"248010241\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Send\",\r\n\t\t\t\t\"_carrier_id\": \"2332\",\r\n\t\t\t\t\"_mcc\": \"248\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"send.ee\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.emt.ee/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"217.71.32.82\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"2480104\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Elisa Internet\",\r\n\t\t\t\t\"_carrier_id\": \"668\",\r\n\t\t\t\t\"_mcc\": \"248\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Elisa MMS\",\r\n\t\t\t\t\"_carrier_id\": \"668\",\r\n\t\t\t\t\"_mcc\": \"248\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://194.204.2.10\",\r\n\t\t\t\t\"_mmsproxy\": \"194.204.2.6\",\r\n\t\t\t\t\"_mmsport\": \"8000\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Elisa IMS\",\r\n\t\t\t\t\"_carrier_id\": \"668\",\r\n\t\t\t\t\"_mcc\": \"248\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Elisa Ut\",\r\n\t\t\t\t\"_carrier_id\": \"668\",\r\n\t\t\t\t\"_mcc\": \"248\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"669\",\r\n\t\t\t\t\"_mcc\": \"248\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.tele2.ee\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 MMS\",\r\n\t\t\t\t\"_carrier_id\": \"669\",\r\n\t\t\t\t\"_mcc\": \"248\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms.tele2.ee\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.tele2.ee\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.tele2.ee\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTS Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1678\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.mts.ru\",\r\n\t\t\t\t\"_user\": \"mts\",\r\n\t\t\t\t\"_password\": \"mts\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTS MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1678\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.mts.ru\",\r\n\t\t\t\t\"_user\": \"mts\",\r\n\t\t\t\t\"_password\": \"mts\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.192.192\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTS IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1678\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Megafon Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1016\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Megafon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1016\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.10.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Megafon IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1016\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"YOTA Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1022\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"internet.yota\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"YOTA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1022\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"mms.yota\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.10.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1028\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"internet.tele2.ru\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1028\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"mms.tele2.ru\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.tele2.ru\",\r\n\t\t\t\t\"_mmsproxy\": \"193.12.40.65\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1028\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"ims.tele2.ru\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOS\",\r\n\t\t\t\t\"_carrier_id\": \"1028\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"hos.tele2.ru\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sberbank-Telecom Internet\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"internet.sberbank-tele.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"FA3207FF\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VTB Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2448\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"26\",\r\n\t\t\t\t\"_apn\": \"vtb\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Letai Internet\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"27\",\r\n\t\t\t\t\"_apn\": \"internet.letai.ru\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Letai MMS\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"27\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsc\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VODA internet\",\r\n\t\t\t\t\"_carrier_id\": \"1029\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"28\",\r\n\t\t\t\t\"_apn\": \"vodalte.ru\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Next Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2444\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"47\",\r\n\t\t\t\t\"_apn\": \"Next\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sberbank-Telecom Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2251\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"50\",\r\n\t\t\t\t\"_apn\": \"internet.sberbank-tele.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"FA3207FF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sberbank-Telecom MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2251\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"50\",\r\n\t\t\t\t\"_apn\": \"mms.sberbank-tele.com\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.77.36.100\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"FA3207FF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sberbank-Telecom IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2251\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"50\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"FA3207\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tinkoff Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2142\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"62\",\r\n\t\t\t\t\"_apn\": \"m.tinkoff\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Beeline Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1681\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"99\",\r\n\t\t\t\t\"_apn\": \"internet.beeline.ru\",\r\n\t\t\t\t\"_user\": \"beeline\",\r\n\t\t\t\t\"_password\": \"beeline\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Beeline MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1681\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"99\",\r\n\t\t\t\t\"_apn\": \"mms.beeline.ru\",\r\n\t\t\t\t\"_user\": \"beeline\",\r\n\t\t\t\t\"_password\": \"beeline\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.94.23\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Beeline IMS\",\r\n\t\t\t\t\"_mcc\": \"250\",\r\n\t\t\t\t\"_mnc\": \"99\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTS MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1746\",\r\n\t\t\t\t\"_mcc\": \"255\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.umc.ua\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.10.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTS-internet\",\r\n\t\t\t\t\"_carrier_id\": \"1746\",\r\n\t\t\t\t\"_mcc\": \"255\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"www.umc.ua\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Beeline-internet\",\r\n\t\t\t\t\"_carrier_id\": \"12\",\r\n\t\t\t\t\"_mcc\": \"255\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet.beeline.ua\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Beeline MMS\",\r\n\t\t\t\t\"_carrier_id\": \"12\",\r\n\t\t\t\t\"_mcc\": \"255\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms.beeline.ua\",\r\n\t\t\t\t\"_mmsc\": \"http://mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"172.29.18.192\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Kyivstar MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1747\",\r\n\t\t\t\t\"_mcc\": \"255\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms.kyivstar.net\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.kyivstar.net\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.10.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Kyivstar Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1747\",\r\n\t\t\t\t\"_mcc\": \"255\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"www.kyivstar.net\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Kyivstar Internet Prepaid\",\r\n\t\t\t\t\"_carrier_id\": \"1747\",\r\n\t\t\t\t\"_mcc\": \"255\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"www.ab.kyivstar.net\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Kyivstar Internet XL\",\r\n\t\t\t\t\"_carrier_id\": \"1747\",\r\n\t\t\t\t\"_mcc\": \"255\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"xl.kyivstar.net\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Kyivstar Internet 3G\",\r\n\t\t\t\t\"_carrier_id\": \"1747\",\r\n\t\t\t\t\"_mcc\": \"255\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"3g.kyivstar.net\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Djuice MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2331\",\r\n\t\t\t\t\"_mcc\": \"255\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms.djuice.com.ua\",\r\n\t\t\t\t\"_user\": \"djuice\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.kyivstar.net\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.10.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"DJUICE\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Djuice Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2331\",\r\n\t\t\t\t\"_mcc\": \"255\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"www.djuice.com.ua\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"DJUICE\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Life:) internet\",\r\n\t\t\t\t\"_carrier_id\": \"1750\",\r\n\t\t\t\t\"_mcc\": \"255\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Life:) MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1750\",\r\n\t\t\t\t\"_mcc\": \"255\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.life.com.ua/cmmsc/post\",\r\n\t\t\t\t\"_mmsproxy\": \"212.58.162.230\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Utel Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1751\",\r\n\t\t\t\t\"_mcc\": \"255\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"3g.utel.ua\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Utel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1751\",\r\n\t\t\t\t\"_mcc\": \"255\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"3g.utel.ua\",\r\n\t\t\t\t\"_mmsc\": \"http://10.212.1.4/mms/wapenc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.212.3.148\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Velcom Internet\",\r\n\t\t\t\t\"_carrier_id\": \"568\",\r\n\t\t\t\t\"_mcc\": \"257\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"vmi.velcom.by\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Velcom Internet Privet\",\r\n\t\t\t\t\"_carrier_id\": \"568\",\r\n\t\t\t\t\"_mcc\": \"257\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"wap.privet.by\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Velcom MMS\",\r\n\t\t\t\t\"_carrier_id\": \"568\",\r\n\t\t\t\t\"_mcc\": \"257\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.velcom.by\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.200.15.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTS Internet\",\r\n\t\t\t\t\"_carrier_id\": \"569\",\r\n\t\t\t\t\"_mcc\": \"257\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mts\",\r\n\t\t\t\t\"_user\": \"mts\",\r\n\t\t\t\t\"_password\": \"mts\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTS MMS\",\r\n\t\t\t\t\"_carrier_id\": \"569\",\r\n\t\t\t\t\"_mcc\": \"257\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mts\",\r\n\t\t\t\t\"_user\": \"mts\",\r\n\t\t\t\t\"_password\": \"mts\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.192.168\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"life:) Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1950\",\r\n\t\t\t\t\"_mcc\": \"257\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"internet.life.com.by\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"life:) MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1950\",\r\n\t\t\t\t\"_mcc\": \"257\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mms.life.com.by\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.life.com.by/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.10.20\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Internet\",\r\n\t\t\t\t\"_carrier_id\": \"904\",\r\n\t\t\t\t\"_mcc\": \"259\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"wap.orange.md\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Moldcell Internet\",\r\n\t\t\t\t\"_carrier_id\": \"905\",\r\n\t\t\t\t\"_mcc\": \"259\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Moldcell MMS\",\r\n\t\t\t\t\"_carrier_id\": \"905\",\r\n\t\t\t\t\"_mcc\": \"259\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.moldcell.md/cmmsc/post\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.10.10\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Unite Internet PrePay\",\r\n\t\t\t\t\"_carrier_id\": \"2153\",\r\n\t\t\t\t\"_mcc\": \"259\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"internet3g.unite.md\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Unite Internet PostPay\",\r\n\t\t\t\t\"_carrier_id\": \"2153\",\r\n\t\t\t\t\"_mcc\": \"259\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"internet.unite.md\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Unite MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2153\",\r\n\t\t\t\t\"_mcc\": \"259\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms.unite.md\",\r\n\t\t\t\t\"_mmsc\": \"http://10.32.15.68:38090/was\",\r\n\t\t\t\t\"_mmsproxy\": \"10.32.15.164\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDC Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2447\",\r\n\t\t\t\t\"_mcc\": \"259\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDC IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2447\",\r\n\t\t\t\t\"_mcc\": \"259\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Plus Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1658\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"plus\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Plus MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1658\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.plusgsm.pl:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"212.2.96.16\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Plus IMS\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2367\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_authtype\": \"1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOS\",\r\n\t\t\t\t\"_carrier_id\": \"2367\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_mmsc\": \"http://mms/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"213.158.194.226\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"xcap,mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telekom IMS\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1659\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internetipv6\",\r\n\t\t\t\t\"_user\": \"internet\",\r\n\t\t\t\t\"_password\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1659\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.orange.pl\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.6.104\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange PL Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1659\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1659\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Play Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1662\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Play MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1662\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.play.pl/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Play UT\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Play IMS\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_carrier_id\": \"2403\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.pl\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"lmpl\",\r\n\t\t\t\t\"_password\": \"plus\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"truphone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.truphone.com:1981/mm1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Rebtel\",\r\n\t\t\t\t\"_carrier_id\": \"2229\",\r\n\t\t\t\t\"_mcc\": \"260\",\r\n\t\t\t\t\"_mnc\": \"44\",\r\n\t\t\t\t\"_apn\": \"rebtel\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rebtel.com\",\r\n\t\t\t\t\"_mmsproxy\": \"185.114.248.80\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telekom Internet\",\r\n\t\t\t\t\"_carrier_id\": \"3\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.v6.telekom\",\r\n\t\t\t\t\"_user\": \"telekom\",\r\n\t\t\t\t\"_password\": \"telekom\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,supl,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telekom IMS\",\r\n\t\t\t\t\"_carrier_id\": \"3\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOS\",\r\n\t\t\t\t\"_carrier_id\": \"3\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_user\": \"telekom\",\r\n\t\t\t\t\"_password\": \"telekom\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.t-mobile.de/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"109.237.176.193\",\r\n\t\t\t\t\"_mmsport\": \"8008\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"xcap,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telekom Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2310\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.telekom\",\r\n\t\t\t\t\"_user\": \"telekom\",\r\n\t\t\t\t\"_password\": \"telekom\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsproxy\": \"172.28.23.131\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.t-mobile.de/servlets/mms\",\r\n\t\t\t\t\"_mmsport\": \"8008\",\r\n\t\t\t\t\"_mvno_match_data\": \"debitel\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Congstar Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2092\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.v6.telekom\",\r\n\t\t\t\t\"_user\": \"congstar\",\r\n\t\t\t\t\"_password\": \"cs\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"44\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Congstar IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2092\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"44\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Congstar HOS\",\r\n\t\t\t\t\"_carrier_id\": \"2092\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_user\": \"telekom\",\r\n\t\t\t\t\"_password\": \"telekom\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.t-mobile.de/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"109.237.176.193\",\r\n\t\t\t\t\"_mmsport\": \"8008\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"xcap,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"44\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone DE LTE\",\r\n\t\t\t\t\"_carrier_id\": \"2397\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VF DE Web\",\r\n\t\t\t\t\"_carrier_id\": \"2397\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,supl,xcap\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone DE-IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2397\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone Internet\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"live.vodafone.com\",\r\n\t\t\t\t\"_type\": \"default,supl,ia\",\r\n\t\t\t\t\"_user\": \"vodafone\",\r\n\t\t\t\t\"_password\": \"vodafone\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"VNR mode\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1&1 Internet (Vodafone)\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"1&1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1&1 MMS (Vodafone)\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"event.vodafone.de\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://139.7.24.1/servlets/mms\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_mmsproxy\": \"139.7.29.17\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"1&1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"atg Mobile\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"atg Mobile\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ROSSMANN mobil\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"ROSSMANN mobil\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Willkommen\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Willkommen\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"WILLKOMMEN\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"WILLKOMMEN\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ewe.de\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"ewe.de\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TomTom\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"TomTom\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EDEKA mobil\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"EDEKA mobil\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"M2M\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"M2M\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"otelo\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"otelo\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mobilcom-debitel\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mobilcom-debitel\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Talkline\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Talkline\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"callmobile.de\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"callmobile.de\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"D3 Mobile\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"D3 Mobile\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mobi\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mobi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"klarmobil\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"klarmobil\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Tele2\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"KabelDeutschland\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.de\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"KabelDeutschland\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"o2 ut\",\r\n\t\t\t\t\"_carrier_id\": \"1453\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"o2 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1453\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_mmsc\": \"http://10.81.0.7:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"82.113.100.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"O2 DE IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1453\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MVNO DE\",\r\n\t\t\t\t\"_carrier_id\": \"2461\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.mvno.mobi\",\r\n\t\t\t\t\"_user\": \"mvno\",\r\n\t\t\t\t\"_password\": \"mvno\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"26203483\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1and1 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2536\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_mmsc\": \"http://10.81.0.7:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"82.113.100.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"26203293\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1and1 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2536\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\",\r\n\t\t\t\t\"_mvno_match_data\": \"26203293\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1and1 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2536\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_mmsc\": \"http://10.81.0.7:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"82.113.100.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"26203330\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1and1 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2536\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\",\r\n\t\t\t\t\"_mvno_match_data\": \"26203330\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telekom Internet\",\r\n\t\t\t\t\"_carrier_id\": \"3\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"internet.v6.telekom\",\r\n\t\t\t\t\"_user\": \"telekom\",\r\n\t\t\t\t\"_password\": \"telekom\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telekom IMS\",\r\n\t\t\t\t\"_carrier_id\": \"3\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HOS\",\r\n\t\t\t\t\"_carrier_id\": \"3\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_user\": \"telekom\",\r\n\t\t\t\t\"_password\": \"telekom\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.t-mobile.de/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"109.237.176.193\",\r\n\t\t\t\t\"_mmsport\": \"8008\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"xcap,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"o2 ut\",\r\n\t\t\t\t\"_carrier_id\": \"1454\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"o2 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1454\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_mmsc\": \"http://10.81.0.7:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"82.113.100.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"o2 DE IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1454\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"o2 Internet Prepaid\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"pinternet.interkom.de\",\r\n\t\t\t\t\"_mmsc\": \"http://10.81.0.7:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"82.113.100.6\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"2620749\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Drillisch\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.81.0.7:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"82.113.100.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"262074030000516\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Fonic Prepaid\",\r\n\t\t\t\t\"_carrier_id\": \"2328\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_mmsc\": \"http://10.81.0.7:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"82.113.100.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"420602\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Fonic Mobile\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_mmsc\": \"http://10.81.0.7:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"82.113.100.6\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"450605\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tchibo Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2330\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_mmsc\": \"http://10.81.0.7:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"82.113.100.7\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"030903\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1and1 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2536\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_mmsc\": \"http://10.81.0.7:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"82.113.100.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"118004\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1and1 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2536\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\",\r\n\t\t\t\t\"_mvno_match_data\": \"118004\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1and1 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2536\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_mmsc\": \"http://10.81.0.7:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"82.113.100.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"118006\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1and1 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2536\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\",\r\n\t\t\t\t\"_mvno_match_data\": \"118006\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1and1 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2536\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_mmsc\": \"http://10.81.0.7:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"82.113.100.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"250109\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1and1 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2536\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\",\r\n\t\t\t\t\"_mvno_match_data\": \"250109\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"o2 DE IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1454\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone DE LTE\",\r\n\t\t\t\t\"_carrier_id\": \"2147\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone DE Web\",\r\n\t\t\t\t\"_carrier_id\": \"2147\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"web32.testnetz-vd2.de\",\r\n\t\t\t\t\"_type\": \"default,supl,xcap\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone DE IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2147\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"ims32.testnetz-vd2.de\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara Germany\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"internet.lebara.de\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara Germany IMS\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara Germany XCAP\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MVNO DE\",\r\n\t\t\t\t\"_carrier_id\": \"2461\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"internet.mvno.mobi\",\r\n\t\t\t\t\"_user\": \"mvno\",\r\n\t\t\t\t\"_password\": \"mvno\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"26220\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1and1 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2536\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"23\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1and1 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2536\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"23\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1and1 XCAP\",\r\n\t\t\t\t\"_carrier_id\": \"2536\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"23\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1and1 MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2536\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"23\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.1und1-mobilfunk.de/\",\r\n\t\t\t\t\"_mmsproxy\": \"2a00:0fbc:2200:c999:0109:1f87:2:1\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"42\",\r\n\t\t\t\t\"_apn\": \"truphone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.truphone.com:1981/mm1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"42\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_mcc\": \"262\",\r\n\t\t\t\t\"_mnc\": \"43\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.de\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gibtel\",\r\n\t\t\t\t\"_mcc\": \"266\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"www.gibtele.com\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone Net2\",\r\n\t\t\t\t\"_carrier_id\": \"22\",\r\n\t\t\t\t\"_mcc\": \"268\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone Net2\",\r\n\t\t\t\t\"_carrier_id\": \"22\",\r\n\t\t\t\t\"_mcc\": \"268\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"net2.vodafone.pt\",\r\n\t\t\t\t\"_user\": \"vodafone\",\r\n\t\t\t\t\"_password\": \"vodafone\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vodafone.pt/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"iproxy.vodafone.pt\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"default,supl,mms,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone Internet\",\r\n\t\t\t\t\"_carrier_id\": \"22\",\r\n\t\t\t\t\"_mcc\": \"268\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.vodafone.pt\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"22\",\r\n\t\t\t\t\"_mcc\": \"268\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1668\",\r\n\t\t\t\t\"_mcc\": \"268\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"umts\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"62.169.66.5\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_mcc\": \"268\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.pt\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"tmn internet\",\r\n\t\t\t\t\"_carrier_id\": \"1670\",\r\n\t\t\t\t\"_mcc\": \"268\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"internet\",\r\n\t\t\t\t\"_carrier_id\": \"1670\",\r\n\t\t\t\t\"_mcc\": \"268\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mms\",\r\n\t\t\t\t\"_carrier_id\": \"1670\",\r\n\t\t\t\t\"_mcc\": \"268\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"mmsc.tmn.pt\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.111.2.16\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone Net2\",\r\n\t\t\t\t\"_mcc\": \"268\",\r\n\t\t\t\t\"_mnc\": \"89\",\r\n\t\t\t\t\"_apn\": \"net2.vodafone.pt\",\r\n\t\t\t\t\"_user\": \"vodafone\",\r\n\t\t\t\t\"_password\": \"vodafone\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vodafone.pt/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"iproxy.vodafone.pt\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone IMS\",\r\n\t\t\t\t\"_mcc\": \"268\",\r\n\t\t\t\t\"_mnc\": \"89\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Post MMS\",\r\n\t\t\t\t\"_carrier_id\": \"895\",\r\n\t\t\t\t\"_mcc\": \"270\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.pt.lu\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.pt.lu\",\r\n\t\t\t\t\"_mmsproxy\": \"194.154.192.88\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Post Internet\",\r\n\t\t\t\t\"_carrier_id\": \"895\",\r\n\t\t\t\t\"_mcc\": \"270\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"web.pt.lu\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Post IMS\",\r\n\t\t\t\t\"_carrier_id\": \"895\",\r\n\t\t\t\t\"_mcc\": \"270\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Post UT\",\r\n\t\t\t\t\"_carrier_id\": \"895\",\r\n\t\t\t\t\"_mcc\": \"270\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTXC\",\r\n\t\t\t\t\"_mcc\": \"270\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tango Internet\",\r\n\t\t\t\t\"_carrier_id\": \"896\",\r\n\t\t\t\t\"_mcc\": \"270\",\r\n\t\t\t\t\"_mnc\": \"77\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tango MMS\",\r\n\t\t\t\t\"_carrier_id\": \"896\",\r\n\t\t\t\t\"_mcc\": \"270\",\r\n\t\t\t\t\"_mnc\": \"77\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"tango\",\r\n\t\t\t\t\"_password\": \"tango\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.tango.lu\",\r\n\t\t\t\t\"_mmsproxy\": \"212.66.75.3\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"netgprs.com\",\r\n\t\t\t\t\"_carrier_id\": \"2271\",\r\n\t\t\t\t\"_mcc\": \"270\",\r\n\t\t\t\t\"_mnc\": \"77\",\r\n\t\t\t\t\"_apn\": \"netgprs.com\",\r\n\t\t\t\t\"_user\": \"tsl\",\r\n\t\t\t\t\"_password\": \"tsl\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"BB00\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"netgprs.com\",\r\n\t\t\t\t\"_carrier_id\": \"2271\",\r\n\t\t\t\t\"_mcc\": \"270\",\r\n\t\t\t\t\"_mnc\": \"77\",\r\n\t\t\t\t\"_apn\": \"netgprs.com\",\r\n\t\t\t\t\"_user\": \"tsl\",\r\n\t\t\t\t\"_password\": \"tsl\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"LU-Transatel\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange\",\r\n\t\t\t\t\"_carrier_id\": \"897\",\r\n\t\t\t\t\"_mcc\": \"270\",\r\n\t\t\t\t\"_mnc\": \"99\",\r\n\t\t\t\t\"_apn\": \"orange.lu\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.orange.lu\",\r\n\t\t\t\t\"_mmsproxy\": \"212.88.139.44\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone IE\",\r\n\t\t\t\t\"_carrier_id\": \"2387\",\r\n\t\t\t\t\"_mcc\": \"272\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"live.vodafone.com\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone IE-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2387\",\r\n\t\t\t\t\"_mcc\": \"272\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.vodafone.net\",\r\n\t\t\t\t\"_mmsc\": \"http://www.vodafone.ie/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.24.59.200\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ut\",\r\n\t\t\t\t\"_carrier_id\": \"2387\",\r\n\t\t\t\t\"_mcc\": \"272\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2387\",\r\n\t\t\t\t\"_mcc\": \"272\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Postmobile Internet\",\r\n\t\t\t\t\"_mcc\": \"272\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"isp.postfone.ie\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.postfone.ie\",\r\n\t\t\t\t\"_mmsproxy\": \"10.192.15.133\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_mvno_match_data\": \"Postmobile\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Three Internet\",\r\n\t\t\t\t\"_carrier_id\": \"792\",\r\n\t\t\t\t\"_mcc\": \"272\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.three.ie\",\r\n\t\t\t\t\"_mmsproxy\": \"62.40.32.40\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"eir Mobile data\",\r\n\t\t\t\t\"_carrier_id\": \"793\",\r\n\t\t\t\t\"_mcc\": \"272\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"data.myeirmobile.ie\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"eir MMS\",\r\n\t\t\t\t\"_carrier_id\": \"793\",\r\n\t\t\t\t\"_mcc\": \"272\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms.myeirmobile.ie\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mymeteor.ie\",\r\n\t\t\t\t\"_mmsproxy\": \"10.85.85.85\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"eir IMS\",\r\n\t\t\t\t\"_carrier_id\": \"793\",\r\n\t\t\t\t\"_mcc\": \"272\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"IMS\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3\",\r\n\t\t\t\t\"_carrier_id\": \"1903\",\r\n\t\t\t\t\"_mcc\": \"272\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"3ireland.ie\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.um.3ireland.ie:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.3ireland.ie\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tesco Mobile Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2154\",\r\n\t\t\t\t\"_mcc\": \"272\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"tescomobile.liffeytelecom.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmc1/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.1.11.19\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"0A\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_mcc\": \"272\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.ie\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Virgin Media IE\",\r\n\t\t\t\t\"_mcc\": \"272\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"Internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"75696531\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Siminn Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1565\",\r\n\t\t\t\t\"_mcc\": \"274\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Siminn MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1565\",\r\n\t\t\t\t\"_mcc\": \"274\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.simi.is\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.simi.is/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"213.167.138.200\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1566\",\r\n\t\t\t\t\"_mcc\": \"274\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"gprs.is\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1566\",\r\n\t\t\t\t\"_mcc\": \"274\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms.gprs.is\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.vodafone.is\",\r\n\t\t\t\t\"_mmsproxy\": \"10.22.0.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1567\",\r\n\t\t\t\t\"_mcc\": \"274\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"gprs.is\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1567\",\r\n\t\t\t\t\"_mcc\": \"274\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms.gprs.is\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.vodafone.is\",\r\n\t\t\t\t\"_mmsproxy\": \"10.22.0.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS Nova\",\r\n\t\t\t\t\"_carrier_id\": \"2155\",\r\n\t\t\t\t\"_mcc\": \"274\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"mms.nova.is\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.nova.is\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.2.60\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Net Nova\",\r\n\t\t\t\t\"_carrier_id\": \"2155\",\r\n\t\t\t\t\"_mcc\": \"274\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"net.nova.is\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"One Telecommunications\",\r\n\t\t\t\t\"_mcc\": \"276\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.t\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone\",\r\n\t\t\t\t\"_mcc\": \"276\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"vodafoneweb\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ALBTelecom\",\r\n\t\t\t\t\"_mcc\": \"276\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone MT\",\r\n\t\t\t\t\"_carrier_id\": \"2368\",\r\n\t\t\t\t\"_mcc\": \"278\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"internet\",\r\n\t\t\t\t\"_password\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone MT-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2368\",\r\n\t\t\t\t\"_mcc\": \"278\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.vodafone.com.mt\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vodafone.com.mt/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.12.0.3\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"GO postpaid\",\r\n\t\t\t\t\"_mcc\": \"278\",\r\n\t\t\t\t\"_mnc\": \"21\",\r\n\t\t\t\t\"_apn\": \"rtgsurfing\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"GO prepaid\",\r\n\t\t\t\t\"_mcc\": \"278\",\r\n\t\t\t\t\"_mnc\": \"21\",\r\n\t\t\t\t\"_apn\": \"gointernet\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cyta\",\r\n\t\t\t\t\"_carrier_id\": \"1447\",\r\n\t\t\t\t\"_mcc\": \"280\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"cytamobile\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.cyta.com.cy\",\r\n\t\t\t\t\"_mmsproxy\": \"212.31.96.161\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"epic MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1448\",\r\n\t\t\t\t\"_mcc\": \"280\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mtn.com.cy/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"172.24.97.1\",\r\n\t\t\t\t\"_mmsport\": \"3130\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"epic Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1448\",\r\n\t\t\t\t\"_mcc\": \"280\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"PrimeTel\",\r\n\t\t\t\t\"_carrier_id\": \"2156\",\r\n\t\t\t\t\"_mcc\": \"280\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"ip.primetel\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.primetel\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Armenia MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1940\",\r\n\t\t\t\t\"_mcc\": \"283\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.220.251\",\r\n\t\t\t\t\"_mmsport\": \"3128\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Armenia Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1940\",\r\n\t\t\t\t\"_mcc\": \"283\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"Internet\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_authtype\": \"1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"A1\",\r\n\t\t\t\t\"_carrier_id\": \"1370\",\r\n\t\t\t\t\"_mcc\": \"284\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.a1.bg\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"A1 MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1370\",\r\n\t\t\t\t\"_mcc\": \"284\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.a1.bg\",\r\n\t\t\t\t\"_user\": \"mtel\",\r\n\t\t\t\t\"_password\": \"mtel\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.150.0.33\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VIVACOM Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1999\",\r\n\t\t\t\t\"_mcc\": \"284\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.vivacom.bg\",\r\n\t\t\t\t\"_user\": \"vivacom\",\r\n\t\t\t\t\"_password\": \"vivacom\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VIVACOM MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1999\",\r\n\t\t\t\t\"_mcc\": \"284\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms.vivacom.bg\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.vivacom.bg\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.123.123\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VIVACOM IMS\",\r\n\t\t\t\t\"_mcc\": \"284\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VIVACOM hos\",\r\n\t\t\t\t\"_mcc\": \"284\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Yettel Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1371\",\r\n\t\t\t\t\"_mcc\": \"284\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Yettel BG\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Yettel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1371\",\r\n\t\t\t\t\"_mcc\": \"284\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.87.11\",\r\n\t\t\t\t\"_mmsport\": \"8004\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Yettel BG\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Yettel BG_IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1371\",\r\n\t\t\t\t\"_mcc\": \"284\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Yettel BG\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Yettel BG_Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1371\",\r\n\t\t\t\t\"_mcc\": \"284\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Yettel BG\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bulsatcom\",\r\n\t\t\t\t\"_carrier_id\": \"2230\",\r\n\t\t\t\t\"_mcc\": \"284\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"bulsat.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MAX TELECOM\",\r\n\t\t\t\t\"_carrier_id\": \"2231\",\r\n\t\t\t\t\"_mcc\": \"284\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"apn.maxtelecom.bg\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TURKCELL INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1735\",\r\n\t\t\t\t\"_mcc\": \"286\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TURKCELL MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1735\",\r\n\t\t\t\t\"_mcc\": \"286\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.turkcell.com.tr/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"212.252.169.217\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Turkcell IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1735\",\r\n\t\t\t\t\"_mcc\": \"286\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone internet\",\r\n\t\t\t\t\"_carrier_id\": \"1736\",\r\n\t\t\t\t\"_mcc\": \"286\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1736\",\r\n\t\t\t\t\"_mcc\": \"286\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"vodafone\",\r\n\t\t\t\t\"_password\": \"vodafone\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://217.31.233.18:6001/MM1Servlet\",\r\n\t\t\t\t\"_mmsproxy\": \"217.31.233.18\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1736\",\r\n\t\t\t\t\"_mcc\": \"286\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1736\",\r\n\t\t\t\t\"_mcc\": \"286\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Turk Telekom Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1737\",\r\n\t\t\t\t\"_mcc\": \"286\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Turk Telekom MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1737\",\r\n\t\t\t\t\"_mcc\": \"286\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.avea.com.tr/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"213.161.151.201\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Turk Telekom IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1737\",\r\n\t\t\t\t\"_mcc\": \"286\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netgsm Internet\",\r\n\t\t\t\t\"_mcc\": \"286\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"FT\",\r\n\t\t\t\t\"_mcc\": \"288\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hey\",\r\n\t\t\t\t\"_mcc\": \"288\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"gprs.fo\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tosa\",\r\n\t\t\t\t\"_mcc\": \"288\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"chili\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele Internet\",\r\n\t\t\t\t\"_carrier_id\": \"735\",\r\n\t\t\t\t\"_mcc\": \"290\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele MMS\",\r\n\t\t\t\t\"_carrier_id\": \"735\",\r\n\t\t\t\t\"_mcc\": \"290\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.tele.gl/mms/wapenc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.112.222.37\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tuullik MMS\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_mcc\": \"290\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mobile.tuullik.gl:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.tuullik.gl\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tuullik Internet\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_mcc\": \"290\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tuullik IMS\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_mcc\": \"290\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Si.mobil GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1709\",\r\n\t\t\t\t\"_mcc\": \"293\",\r\n\t\t\t\t\"_mnc\": \"40\",\r\n\t\t\t\t\"_apn\": \"internet.simobil.si\",\r\n\t\t\t\t\"_user\": \"simobil\",\r\n\t\t\t\t\"_password\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Si.mobil MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1709\",\r\n\t\t\t\t\"_mcc\": \"293\",\r\n\t\t\t\t\"_mnc\": \"40\",\r\n\t\t\t\t\"_apn\": \"mms.simobil.si\",\r\n\t\t\t\t\"_user\": \"simobil\",\r\n\t\t\t\t\"_password\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmc/\",\r\n\t\t\t\t\"_mmsproxy\": \"80.95.224.46\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"069 web\",\r\n\t\t\t\t\"_mcc\": \"293\",\r\n\t\t\t\t\"_mnc\": \"40\",\r\n\t\t\t\t\"_apn\": \"websi\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"293400130\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"069 mms\",\r\n\t\t\t\t\"_mcc\": \"293\",\r\n\t\t\t\t\"_mnc\": \"40\",\r\n\t\t\t\t\"_apn\": \"mmssi\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.hot.si\",\r\n\t\t\t\t\"_mmsproxy\": \"80.95.224.47\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"293400130\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobilni Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1710\",\r\n\t\t\t\t\"_mcc\": \"293\",\r\n\t\t\t\t\"_mnc\": \"41\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"mobitel\",\r\n\t\t\t\t\"_password\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mobitel.si/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"213.229.249.40\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T2\",\r\n\t\t\t\t\"_carrier_id\": \"1711\",\r\n\t\t\t\t\"_mcc\": \"293\",\r\n\t\t\t\t\"_mnc\": \"64\",\r\n\t\t\t\t\"_apn\": \"internet.t-2.net\",\r\n\t\t\t\t\"_mmsc\": \"http://www.mms.t-2.net:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"172.20.18.137\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"INTERNET\",\r\n\t\t\t\t\"_mcc\": \"293\",\r\n\t\t\t\t\"_mnc\": \"70\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.telemach.net:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"91.185.221.85\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile MK Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2396\",\r\n\t\t\t\t\"_mcc\": \"294\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"internet\",\r\n\t\t\t\t\"_password\": \"t-mobile\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile MK MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2396\",\r\n\t\t\t\t\"_mcc\": \"294\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.t-mobile.com.mk\",\r\n\t\t\t\t\"_mmsproxy\": \"62.162.155.227\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1609\",\r\n\t\t\t\t\"_mcc\": \"294\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"vipoperator\",\r\n\t\t\t\t\"_user\": \"vipoperator\",\r\n\t\t\t\t\"_password\": \"vipoperator\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1609\",\r\n\t\t\t\t\"_mcc\": \"294\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"vipoperator.mms\",\r\n\t\t\t\t\"_user\": \"vipoperator\",\r\n\t\t\t\t\"_password\": \"vipoperator\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.vipoperator.com.mk\",\r\n\t\t\t\t\"_mmsproxy\": \"78.40.0.1\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_mcc\": \"294\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.mk\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Swisscom Services\",\r\n\t\t\t\t\"_mcc\": \"295\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"gprs.swisscom.ch\",\r\n\t\t\t\t\"_proxy\": \"192.168.210.1\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_mcc\": \"295\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet-ofl\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_mcc\": \"295\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms-ofl\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.151.3:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.151.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"FL1\",\r\n\t\t\t\t\"_mcc\": \"295\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"fl1\",\r\n\t\t\t\t\"_user\": \"gprs@a1plus.at\",\r\n\t\t\t\t\"_password\": \"fl1\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EMnify\",\r\n\t\t\t\t\"_carrier_id\": \"2326\",\r\n\t\t\t\t\"_mcc\": \"295\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"em\",\r\n\t\t\t\t\"_mvno_match_data\": \"2950509\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EMnify\",\r\n\t\t\t\t\"_carrier_id\": \"2233\",\r\n\t\t\t\t\"_mcc\": \"295\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"em\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BICS\",\r\n\t\t\t\t\"_carrier_id\": \"2232\",\r\n\t\t\t\t\"_mcc\": \"295\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"bicsapn\",\r\n\t\t\t\t\"_mvno_match_data\": \"BICS\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor MMS\",\r\n\t\t\t\t\"_mcc\": \"297\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mm.vor.telenor.me\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.246.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor Internet\",\r\n\t\t\t\t\"_mcc\": \"297\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"gprs\",\r\n\t\t\t\t\"_password\": \"gprs\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2363\",\r\n\t\t\t\t\"_mcc\": \"297\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"tmcg-4g\",\r\n\t\t\t\t\"_user\": \"38267\",\r\n\t\t\t\t\"_password\": \"38267\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"m:tel\",\r\n\t\t\t\t\"_mcc\": \"297\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mtelinternet\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TELUS\",\r\n\t\t\t\t\"_carrier_id\": \"1404\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"220\",\r\n\t\t\t\t\"_apn\": \"sp.telus.com\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_mmsc\": \"http://aliasredirect.net/proxy/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mmscproxy.mobility.ca\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_mvno_match_data\": \"5455\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TELUS ISP\",\r\n\t\t\t\t\"_carrier_id\": \"1404\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"220\",\r\n\t\t\t\t\"_apn\": \"isp.telus.com\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_mvno_match_data\": \"5455\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1404\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"220\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_mvno_match_data\": \"5455\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"KOODO SP\",\r\n\t\t\t\t\"_carrier_id\": \"2020\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"220\",\r\n\t\t\t\t\"_apn\": \"sp.koodo.com\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,dun\",\r\n\t\t\t\t\"_mmsc\": \"http://aliasredirect.net/proxy/koodo/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mmscproxy.mobility.ca\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_mvno_match_data\": \"4B4F\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2020\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"220\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_mvno_match_data\": \"4B4F\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2053\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"220\",\r\n\t\t\t\t\"_apn\": \"sp.mb.com\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_mmsc\": \"http://aliasredirect.net/proxy/mb/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mmscproxy.mobility.ca\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_mvno_match_data\": \"5043\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tethered Mobile Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2053\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"220\",\r\n\t\t\t\t\"_apn\": \"isp.mb.com\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"5043\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2089\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"220\",\r\n\t\t\t\t\"_apn\": \"sp.mb.com\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,fota,hipri\",\r\n\t\t\t\t\"_mmsc\": \"http://aliasredirect.net/proxy/mb/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mmscproxy.mobility.ca\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"4D4F\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tethered Mobile Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2089\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"220\",\r\n\t\t\t\t\"_apn\": \"isp.mb.com\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"4D4F\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2089\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"220\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"4D4F\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TELUS ISP\",\r\n\t\t\t\t\"_carrier_id\": \"1404\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"221\",\r\n\t\t\t\t\"_apn\": \"isp.telus.com\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_mvno_match_data\": \"5455\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Koodo\",\r\n\t\t\t\t\"_carrier_id\": \"2020\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"221\",\r\n\t\t\t\t\"_apn\": \"sp.koodo.com\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_mvno_match_data\": \"4B4F\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tethered PC Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2053\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"221\",\r\n\t\t\t\t\"_apn\": \"isp.mb.com\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"5043\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Eastlink MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2252\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"270\",\r\n\t\t\t\t\"_apn\": \"mms.mobi.eastlink.ca\",\r\n\t\t\t\t\"_mmsc\": \"http://mmss.mobi.eastlink.ca\",\r\n\t\t\t\t\"_mmsproxy\": \"10.232.12.49\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Eastlink Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2252\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"270\",\r\n\t\t\t\t\"_apn\": \"wisp.mobi.eastlink.ca\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatr Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2055\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"320\",\r\n\t\t\t\t\"_apn\": \"chatrweb.apn\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.chatrwireless.com\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.chatrwireless.com\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Rogers IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1962\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"370\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Fido Tethering\",\r\n\t\t\t\t\"_carrier_id\": \"1962\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"370\",\r\n\t\t\t\t\"_apn\": \"ltedata.apn\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_mvno_match_data\": \"DD\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Fido Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1962\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"370\",\r\n\t\t\t\t\"_apn\": \"ltemobile.apn\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,fota,hipri\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.fido.ca\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.fido.ca\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_mvno_match_data\": \"DD\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Fido Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1962\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"370\",\r\n\t\t\t\t\"_apn\": \"IMS\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_mvno_match_data\": \"DD\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1895\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"490\",\r\n\t\t\t\t\"_apn\": \"internet.freedommobile.ca\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1895\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"490\",\r\n\t\t\t\t\"_apn\": \"mms.freedommobile.ca\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.freedommobile.ca\",\r\n\t\t\t\t\"_mmsproxy\": \"74.115.197.70\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Media\",\r\n\t\t\t\t\"_carrier_id\": \"2008\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"500\",\r\n\t\t\t\t\"_apn\": \"media.ng\",\r\n\t\t\t\t\"_mmsc\": \"http://media.videotron.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bell Internet\",\r\n\t\t\t\t\"_carrier_id\": \"576\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"610\",\r\n\t\t\t\t\"_apn\": \"pda.bell.ca\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_authtype\": \"2\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.bell.ca/mms/wapenc\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bell Mobility IMS\",\r\n\t\t\t\t\"_carrier_id\": \"576\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"610\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lucky Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2122\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"610\",\r\n\t\t\t\t\"_apn\": \"pda.bell.ca\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_authtype\": \"2\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.luckymobile.ca/mms/wapenc\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"42\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTS\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"660\",\r\n\t\t\t\t\"_apn\": \"sp.mts\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc2.mts.net/\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTS Tethering\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"660\",\r\n\t\t\t\t\"_apn\": \"internet.mts\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"MTS\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bell IoT CC\",\r\n\t\t\t\t\"_carrier_id\": \"576\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"690\",\r\n\t\t\t\t\"_apn\": \"mnet.bell.ca.ioe\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_authtype\": \"2\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"41\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bell IoT MC\",\r\n\t\t\t\t\"_carrier_id\": \"576\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"690\",\r\n\t\t\t\t\"_apn\": \"inet.bell.ca.m2m\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_authtype\": \"2\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"43\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Rogers LTE\",\r\n\t\t\t\t\"_carrier_id\": \"1403\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"720\",\r\n\t\t\t\t\"_apn\": \"ltemobile.apn\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.rogers.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.gprs.rogers.com\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Rogers IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1403\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"720\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatr Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2055\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"720\",\r\n\t\t\t\t\"_apn\": \"chatrweb.apn\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.chatrwireless.com\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.chatrwireless.com\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"302720x94\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatr Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2055\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"720\",\r\n\t\t\t\t\"_apn\": \"chatrweb.apn\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.chatrwireless.com\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.chatrwireless.com\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"D2\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatr Tethering\",\r\n\t\t\t\t\"_carrier_id\": \"2055\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"720\",\r\n\t\t\t\t\"_apn\": \"chatrisp.apn\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"302720x94\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tbaytel Tethering\",\r\n\t\t\t\t\"_carrier_id\": \"2090\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"720\",\r\n\t\t\t\t\"_apn\": \"ltedata.apn\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"BA\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tbaytel Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2090\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"720\",\r\n\t\t\t\t\"_apn\": \"ltemobile.apn\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.gprs.rogers.com\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.rogers.com\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"302720x92\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tbaytel Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2090\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"720\",\r\n\t\t\t\t\"_apn\": \"ltemobile.apn\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.gprs.rogers.com\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.rogers.com\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"BA\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cityfone Tethering\",\r\n\t\t\t\t\"_carrier_id\": \"2057\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"720\",\r\n\t\t\t\t\"_apn\": \"ltedata.apn\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"CITYFONE\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cityfone Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2057\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"720\",\r\n\t\t\t\t\"_apn\": \"ltemobile.apn\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.gprs.rogers.com\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.rogers.com\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"302720x97\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cityfone Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2057\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"720\",\r\n\t\t\t\t\"_apn\": \"ltemobile.apn\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.gprs.rogers.com\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.rogers.com\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"CC\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ztar Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2056\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"720\",\r\n\t\t\t\t\"_apn\": \"rogers-core-appl1.apn\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.gprs.rogers.com\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.rogers.com\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"302720x98\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ztar Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2056\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"720\",\r\n\t\t\t\t\"_apn\": \"rogers-core-appl1.apn\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.gprs.rogers.com\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsproxy.rogers.com\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"D4\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SaskTel Internet\",\r\n\t\t\t\t\"_carrier_id\": \"580\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"780\",\r\n\t\t\t\t\"_apn\": \"pda.stm.sk.ca\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.sasktel.com/\",\r\n\t\t\t\t\"_mmsproxy\": \"mig.sasktel.com\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lüm Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2638\",\r\n\t\t\t\t\"_mcc\": \"302\",\r\n\t\t\t\t\"_mnc\": \"780\",\r\n\t\t\t\t\"_apn\": \"lum\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.lum.ca/\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"3027805\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Verizon CDMA HRPD\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vzwreseller.com/servlets/mms\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri,dun,supl\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Tracfone\",\r\n\t\t\t\t\"_authtype\": \"3\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bluewire\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"bluewire\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.blueunlimited.com\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bluewire IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"bluewire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bluewire IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"bluewire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bluewire FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"bluewire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bluewire FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"bluewire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bluewire\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.blueunlimited.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"bluewire\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bluewire\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.blueunlimited.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"bluewire\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"flatwire\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"flatwire\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.cleartalk.csky.us/\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Flatwire IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"flatwire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Flatwire IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"flatwire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Flatwire FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"flatwire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Flatwire FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"flatwire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Flatwire\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.cleartalk.csky.us/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"flatwire\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Flatwire\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.cleartalk.csky.us/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"flatwire\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mobipcs\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mobipcs\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mobipcs.com\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobipcs IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mobipcs\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobipcs IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mobipcs\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobipcs FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mobipcs\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobipcs FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mobipcs\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobipcs\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mobipcs.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mobipcs\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobipcs\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mobipcs.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mobipcs\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mobilenation\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mobilenation\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mymn3g.net\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.mymn3g.net\",\r\n\t\t\t\t\"_mmsport\": \"8081\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobilenation IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mobilenation\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobilenation IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mobilenation\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobilenation FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mobilenation\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobilenation FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mobilenation\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobilenation\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mymn3g.net\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.mymn3g.net\",\r\n\t\t\t\t\"_mmsport\": \"8081\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mobilenation\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobilenation\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mymn3g.net\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.mymn3g.net\",\r\n\t\t\t\t\"_mmsport\": \"8081\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mobilenation\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mohave\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mohave\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mohavewireless.com\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mohave IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mohave\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mohave IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mohave\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mohave FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mohave\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mohave FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mohave\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mohave\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mohavewireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mohave\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mohave\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mohavewireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"mohave\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"peopleswire\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"peopleswire\",\r\n\t\t\t\t\"_mmsc\": \"http://172.16.16.130/mms/\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Peopleswire IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Peopleswire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Peopleswire IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Peopleswire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"peopleswire FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"peopleswire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"peopleswire FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"peopleswire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Peopleswire\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://172.16.16.130/mms/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Peopleswire\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Peopleswire\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://172.16.16.130/mms/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Peopleswire\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"revol\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"revol\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.revol.us/revol/mms.php\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Revol IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"revol\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Revol IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"revol\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Revol FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"revol\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Revol FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"revol\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Revol\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.revol.us/revol/mms.php\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"revol\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Revol\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.revol.us/revol/mms.php\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"revol\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Commnet\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"commnet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.cccomm.csky.us\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"distribution\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"distribution\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.dst.com/mms/\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Distribution IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"distribution\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Distribution IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"distribution\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Distribution FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"distribution\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Distribution FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"distribution\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Distribution\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.dst.com/mms/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"distribution\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Distribution\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.dst.com/mms/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"distribution\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Verizon\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"004\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,fota,cbs\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vtext.com/servlets/mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Verizon\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"004\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,fota,cbs,dun\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vtext.com/servlets/mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_profile_id\": \"1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Verizon Internet\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"004\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13|14\",\r\n\t\t\t\t\"_profile_id\": \"0\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Verizon FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"004\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13|14\",\r\n\t\t\t\t\"_profile_id\": \"3\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Verizon IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"004\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13|14\",\r\n\t\t\t\t\"_profile_id\": \"2\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Verizon CBS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"004\",\r\n\t\t\t\t\"_apn\": \"VZWAPP\",\r\n\t\t\t\t\"_type\": \"cbs,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vtext.com/servlets/mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13|14\",\r\n\t\t\t\t\"_profile_id\": \"4\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Union Wireless Data\",\r\n\t\t\t\t\"_carrier_id\": \"1781\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"020\",\r\n\t\t\t\t\"_apn\": \"smart.com\",\r\n\t\t\t\t\"_type\": \"default,ia,hipri,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Union Wireless MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1781\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"020\",\r\n\t\t\t\t\"_apn\": \"union.mms.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.unionwireless.com\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \" ALU Test-SIM Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2253\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"028\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \" ALU Test-SIM FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2253\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"028\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \" ALU Test-SIM IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2253\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"028\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \" ALU Test-SIM CBS\",\r\n\t\t\t\t\"_carrier_id\": \"2253\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"028\",\r\n\t\t\t\t\"_apn\": \"VZWAPP\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vtext.com/servlets/mms\",\r\n\t\t\t\t\"_type\": \"cbs,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Itewire IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"032\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"itewire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Itewire IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"032\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"itewire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Itewire FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"032\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"itewire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Itewire FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"032\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"itewire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Itewire\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"032\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"itewire\",\r\n\t\t\t\t\"_type\": \"default,ia,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Itewire\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"032\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"itewire\",\r\n\t\t\t\t\"_type\": \"default,ia,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"etex\",\r\n\t\t\t\t\"_carrier_id\": \"2254\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"035\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"etex\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsi.etex.mobi\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Etex IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2254\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"035\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"etex\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Etex IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2254\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"035\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"etex\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Etex FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2254\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"035\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"etex\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Etex FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2254\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"035\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"etex\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Etex\",\r\n\t\t\t\t\"_carrier_id\": \"2254\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"035\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsi.etex.mobi\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"etex\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Etex\",\r\n\t\t\t\t\"_carrier_id\": \"2254\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"035\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsi.etex.mobi\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"etex\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mta\",\r\n\t\t\t\t\"_carrier_id\": \"1784\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mta.dataonair.net/\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.85\",\r\n\t\t\t\t\"_mmsport\": \"6672\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mta IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1784\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mta IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1784\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mta FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1784\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mta FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1784\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mta\",\r\n\t\t\t\t\"_carrier_id\": \"1784\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mta.dataonair.net/\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.85\",\r\n\t\t\t\t\"_mmsport\": \"6672\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mta\",\r\n\t\t\t\t\"_carrier_id\": \"1784\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mta.dataonair.net/\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.85\",\r\n\t\t\t\t\"_mmsport\": \"6672\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"alaskacomm\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"alaskacomm\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.acsalaska.net/servlets/mms\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Alaskacomm IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"alaskacomm\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Alaskacomm IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"alaskacomm\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Alaskacomm FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"alaskacomm\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Alaskacomm FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"alaskacomm\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Alaskacomm\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.acsalaska.net/servlets/mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"alaskacomm\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Alaskacomm\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.acsalaska.net/servlets/mms\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"alaskacomm\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S.Cellular\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"066\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"*\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_password\": \"*\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Corr Wap\",\r\n\t\t\t\t\"_carrier_id\": \"1168\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"080\",\r\n\t\t\t\t\"_apn\": \"corrgprs\",\r\n\t\t\t\t\"_server\": \"http://w.iot1.com/corr/wml.php\",\r\n\t\t\t\t\"_proxy\": \"74.112.57.172\",\r\n\t\t\t\t\"_port\": \"9201\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CorrMMS\",\r\n\t\t\t\t\"_carrier_id\": \"1168\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"080\",\r\n\t\t\t\t\"_apn\": \"corrmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.iot1.com/corr/mms.php\",\r\n\t\t\t\t\"_mmsproxy\": \"66.255.55.23\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"PLATMMS\",\r\n\t\t\t\t\"_carrier_id\": \"1170\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"100\",\r\n\t\t\t\t\"_apn\": \"mms.plateau\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.23.253.206\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"PLATWEB\",\r\n\t\t\t\t\"_carrier_id\": \"1170\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"100\",\r\n\t\t\t\t\"_apn\": \"isp.plateau\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sprint\",\r\n\t\t\t\t\"_carrier_id\": \"1788\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"120\",\r\n\t\t\t\t\"_apn\": \"sprint\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,ims,cbs\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.sprintpcs.com\",\r\n\t\t\t\t\"_mmsproxy\": \"68.28.31.7\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sprint\",\r\n\t\t\t\t\"_carrier_id\": \"1788\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"120\",\r\n\t\t\t\t\"_apn\": \"sprint\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,ims,cbs,dun\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.sprintpcs.com\",\r\n\t\t\t\t\"_mmsproxy\": \"68.28.31.7\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_profile_id\": \"1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"OTA\",\r\n\t\t\t\t\"_carrier_id\": \"1788\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"120\",\r\n\t\t\t\t\"_apn\": \"otasn\",\r\n\t\t\t\t\"_type\": \"fota,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user\": \"null\",\r\n\t\t\t\t\"_password\": \"null\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SPCS Global\",\r\n\t\t\t\t\"_carrier_id\": \"1788\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"120\",\r\n\t\t\t\t\"_apn\": \"cinet.spcs\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.sprintpcs.com\",\r\n\t\t\t\t\"_mmsproxy\": \"68.28.31.7\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,dun\",\r\n\t\t\t\t\"_network_type_bitmask\": \"1|2|3|8|9|10|15\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Carolina West Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1789\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"130\",\r\n\t\t\t\t\"_apn\": \"home.cww.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,ims,cbs\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.cwwmms.com/cww/mms.php\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Carolina West Tethering\",\r\n\t\t\t\t\"_carrier_id\": \"1789\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"130\",\r\n\t\t\t\t\"_apn\": \"tethering.cww.com\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MetroPCS 160\",\r\n\t\t\t\t\"_carrier_id\": \"1949\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"160\",\r\n\t\t\t\t\"_apn\": \"fast.metropcs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://metropcs.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"6D\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"WCW-INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1792\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"internet.wcc.net\",\r\n\t\t\t\t\"_user\": \"13257630000\",\r\n\t\t\t\t\"_password\": \"mmsc\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"WCW-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1792\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"mms.wcc.net\",\r\n\t\t\t\t\"_user\": \"13257630000\",\r\n\t\t\t\t\"_password\": \"mmsc\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.wcc.net\",\r\n\t\t\t\t\"_mmsproxy\": \"209.55.70.246\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MetroPCS 200\",\r\n\t\t\t\t\"_carrier_id\": \"1949\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"200\",\r\n\t\t\t\t\"_apn\": \"fast.metropcs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://metropcs.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"6D\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MetroPCS 210\",\r\n\t\t\t\t\"_carrier_id\": \"1949\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"210\",\r\n\t\t\t\t\"_apn\": \"fast.metropcs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://metropcs.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"6D\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MetroPCS 220\",\r\n\t\t\t\t\"_carrier_id\": \"1949\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"220\",\r\n\t\t\t\t\"_apn\": \"fast.metropcs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://metropcs.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"6D\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MetroPCS 230\",\r\n\t\t\t\t\"_carrier_id\": \"1949\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"230\",\r\n\t\t\t\t\"_apn\": \"fast.metropcs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://metropcs.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"6D\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Qlink\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"240\",\r\n\t\t\t\t\"_apn\": \"qlink\",\r\n\t\t\t\t\"_mmsc\": \"http://wholesale.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"514C\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tello\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"240\",\r\n\t\t\t\t\"_apn\": \"tello\",\r\n\t\t\t\t\"_mmsc\": \"http://wholesale.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"6941\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"iWireless\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"240\",\r\n\t\t\t\t\"_apn\": \"iwireless\",\r\n\t\t\t\t\"_mmsc\": \"http://wholesale.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"6957\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MetroPCS 240\",\r\n\t\t\t\t\"_carrier_id\": \"1949\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"240\",\r\n\t\t\t\t\"_apn\": \"fast.metropcs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://metropcs.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"6D\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Google Fi - Tm\",\r\n\t\t\t\t\"_carrier_id\": \"1989\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"240\",\r\n\t\t\t\t\"_apn\": \"h2g2\",\r\n\t\t\t\t\"_type\": \"default,supl,mms,fota,cbs,ia\",\r\n\t\t\t\t\"_user\": \"none\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_password\": \"none\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.g-mms.com/mms/wapenc\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"4276\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_user_editable\": \"false\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Google Fi - Tm\",\r\n\t\t\t\t\"_carrier_id\": \"1989\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"240\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"4276\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13|20\",\r\n\t\t\t\t\"_user_editable\": \"false\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Consumer Cellular\",\r\n\t\t\t\t\"_carrier_id\": \"2023\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"240\",\r\n\t\t\t\t\"_apn\": \"wholesale\",\r\n\t\t\t\t\"_mmsc\": \"http://wholesale.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,hipri\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"2AC9\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MetroPCS 250\",\r\n\t\t\t\t\"_carrier_id\": \"1949\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"250\",\r\n\t\t\t\t\"_apn\": \"fast.metropcs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://metropcs.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"6D\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Qlink\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"260\",\r\n\t\t\t\t\"_apn\": \"qlink\",\r\n\t\t\t\t\"_mmsc\": \"http://wholesale.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"514C\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tello\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"260\",\r\n\t\t\t\t\"_apn\": \"tello\",\r\n\t\t\t\t\"_mmsc\": \"http://wholesale.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"6941\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"iWireless\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"260\",\r\n\t\t\t\t\"_apn\": \"iwireless\",\r\n\t\t\t\t\"_mmsc\": \"http://wholesale.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"6957\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Google Fi - Tm\",\r\n\t\t\t\t\"_carrier_id\": \"1989\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"260\",\r\n\t\t\t\t\"_apn\": \"h2g2\",\r\n\t\t\t\t\"_type\": \"default,supl,mms,fota,cbs,ia\",\r\n\t\t\t\t\"_user\": \"none\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_password\": \"none\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.g-mms.com/mms/wapenc\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"31026097\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_user_editable\": \"false\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Google Fi - Tm\",\r\n\t\t\t\t\"_carrier_id\": \"1989\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"260\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"31026097\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13|20\",\r\n\t\t\t\t\"_user_editable\": \"false\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MetroPCS 260\",\r\n\t\t\t\t\"_carrier_id\": \"1949\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"260\",\r\n\t\t\t\t\"_apn\": \"fast.metropcs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://metropcs.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"6D38\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SIMPLE\",\r\n\t\t\t\t\"_carrier_id\": \"2078\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"260\",\r\n\t\t\t\t\"_apn\": \"simple\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mmsc\": \"http://smpl.mms.msg.eng.t-mobile.com/mms/wapenc\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"534D\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TFWAP\",\r\n\t\t\t\t\"_carrier_id\": \"2022\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"260\",\r\n\t\t\t\t\"_apn\": \"wap.tracfone\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.tracfone.com\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"deff\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TFWAP\",\r\n\t\t\t\t\"_carrier_id\": \"2022\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"260\",\r\n\t\t\t\t\"_apn\": \"wap.tracfone\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.tracfone.com\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"ddff\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Consumer Cellular\",\r\n\t\t\t\t\"_carrier_id\": \"2023\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"260\",\r\n\t\t\t\t\"_apn\": \"wholesale\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_proxy\": \"\",\r\n\t\t\t\t\"_port\": \"\",\r\n\t\t\t\t\"_mmsc\": \"http://wholesale.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,hipri\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"2AC9\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MetroPCS 270\",\r\n\t\t\t\t\"_carrier_id\": \"1949\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"270\",\r\n\t\t\t\t\"_apn\": \"fast.metropcs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://metropcs.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"6D\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"internet\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"280\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"DDFF\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"280\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"DDFF\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"280\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"DDFF\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"internet\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"280\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"DEFF\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"280\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"DEFF\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"280\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"DEFF\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MetroPCS 300\",\r\n\t\t\t\t\"_carrier_id\": \"1949\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"300\",\r\n\t\t\t\t\"_apn\": \"fast.metropcs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://metropcs.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"6D\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"300\",\r\n\t\t\t\t\"_apn\": \"truphone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.truphone.com:1981/mm1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"300\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MetroPCS 310\",\r\n\t\t\t\t\"_carrier_id\": \"1949\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"310\",\r\n\t\t\t\t\"_apn\": \"fast.metropcs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://metropcs.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"6D\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cellular One NEAZ ISP\",\r\n\t\t\t\t\"_carrier_id\": \"1796\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"320\",\r\n\t\t\t\t\"_apn\": \"isp.cellularoneaz.net\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cellular One ClearSky MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1796\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"320\",\r\n\t\t\t\t\"_apn\": \"wap.c1csky.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.c1neaz.csky.us:6672\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.94\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"alltel2\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"330\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"alltel2\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.alltel.com/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.alltel.com\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Alltel2 IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"330\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"alltel2\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Alltel2 IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"330\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"alltel2\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Alltel2 FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"330\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"alltel2\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Alltel2 FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"330\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"alltel2\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Alltel2\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"330\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.alltel.com/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.alltel.com\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"alltel2\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Alltel2\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"330\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.alltel.com/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.alltel.com\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"alltel2\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"pioneer\",\r\n\t\t\t\t\"_carrier_id\": \"1185\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"360\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.zsend.com\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pioneer IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1185\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"360\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pioneer IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1185\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"360\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pioneer FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1185\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"360\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pioneer FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1185\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"360\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pioneer\",\r\n\t\t\t\t\"_carrier_id\": \"1185\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"360\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.zsend.com\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pioneer\",\r\n\t\t\t\t\"_carrier_id\": \"1185\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"360\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.zsend.com\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AGMS Global\",\r\n\t\t\t\t\"_carrier_id\": \"2030\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"380\",\r\n\t\t\t\t\"_apn\": \"agms.nl.gmm\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"50FF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"GigSky\",\r\n\t\t\t\t\"_carrier_id\": \"2459\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"380\",\r\n\t\t\t\t\"_apn\": \"gigsky\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"GigSky\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Celloneet MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1188\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"390\",\r\n\t\t\t\t\"_apn\": \"mms.celloneet.com\",\r\n\t\t\t\t\"_user\": \"user1@mms.celloneet.com\",\r\n\t\t\t\t\"_password\": \"celloneet\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.celloneet.com/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"63.99.231.135\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dish-ATT internet\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3442\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3442\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3442\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dish-ATT internet\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3444\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3444\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3444\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dish-ATT internet\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3446\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3446\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3446\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dish-ATT internet\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3448\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3448\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3448\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CBW Data\",\r\n\t\t\t\t\"_carrier_id\": \"1190\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"420\",\r\n\t\t\t\t\"_apn\": \"wap.gocbw.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.gocbw.com:8088/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"216.68.79.202\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"gci\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"430\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"gci\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.akdt.dataonair.net:6672/\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gci IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"430\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"gci\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gci IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"430\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"gci\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gci FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"430\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"gci\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gci FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"430\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"gci\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gci\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"430\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.akdt.dataonair.net:6672/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"gci\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gci\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"430\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.akdt.dataonair.net:6672/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"gci\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Viaero Connect\",\r\n\t\t\t\t\"_carrier_id\": \"1193\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"450\",\r\n\t\t\t\t\"_apn\": \"internet.vedge.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Viaero MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1193\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"450\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.viaero.com\",\r\n\t\t\t\t\"_mmsproxy\": \"10.168.3.23\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"nTelos Ota\",\r\n\t\t\t\t\"_carrier_id\": \"1893\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"470\",\r\n\t\t\t\t\"_apn\": \"admin.4g.ntelos.com\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"nTelos Ota\",\r\n\t\t\t\t\"_carrier_id\": \"1893\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"470\",\r\n\t\t\t\t\"_apn\": \"admin.4g.ntelos.com\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"nTelos Wireless\",\r\n\t\t\t\t\"_carrier_id\": \"1893\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"470\",\r\n\t\t\t\t\"_apn\": \"internet.4g.ntelos.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,hipri,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ntelospcs.net\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"nTelos Tether\",\r\n\t\t\t\t\"_carrier_id\": \"1893\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"470\",\r\n\t\t\t\t\"_apn\": \"tethering.4g.ntelos.com\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"nTelos Tether\",\r\n\t\t\t\t\"_carrier_id\": \"1893\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"470\",\r\n\t\t\t\t\"_apn\": \"tethering.4g.ntelos.com\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"nTelos Wireless\",\r\n\t\t\t\t\"_carrier_id\": \"1893\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"470\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ntelospcs.net/\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MetroPCS 490\",\r\n\t\t\t\t\"_carrier_id\": \"1949\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"490\",\r\n\t\t\t\t\"_apn\": \"fast.metropcs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://metropcs.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"6D\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MetroPCS 530\",\r\n\t\t\t\t\"_carrier_id\": \"1949\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"530\",\r\n\t\t\t\t\"_apn\": \"fast.metropcs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://metropcs.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"6D\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cellular One Smartphone\",\r\n\t\t\t\t\"_carrier_id\": \"1800\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"570\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cellular One MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1800\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"570\",\r\n\t\t\t\t\"_apn\": \"clearsky\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mtpcs.csky.us:6672/\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.229\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"inland\",\r\n\t\t\t\t\"_carrier_id\": \"2011\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"580\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.inland3g.com/inland/mms.php\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Inland IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2011\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"580\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Inland IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2011\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"580\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Inland FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2011\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"580\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Inland FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2011\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"580\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Inland\",\r\n\t\t\t\t\"_carrier_id\": \"2011\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"580\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.inland3g.com/inland/mms.php\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Inland\",\r\n\t\t\t\t\"_carrier_id\": \"2011\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"580\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.inland3g.com/inland/mms.php\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MetroPCS 590\",\r\n\t\t\t\t\"_carrier_id\": \"1949\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"590\",\r\n\t\t\t\t\"_apn\": \"fast.metropcs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://metropcs.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"6D\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"cellcom\",\r\n\t\t\t\t\"_carrier_id\": \"1802\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"600\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.cellcom.com/cellcom/mms.php\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cellcom IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1802\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"600\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cellcom IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1802\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"600\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cellcom FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1802\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"600\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cellcom FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1802\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"600\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cellcom\",\r\n\t\t\t\t\"_carrier_id\": \"1802\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"600\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.cellcom.com/cellcom/mms.php\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cellcom\",\r\n\t\t\t\t\"_carrier_id\": \"1802\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"600\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.cellcom.com/cellcom/mms.php\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EpicINT\",\r\n\t\t\t\t\"_carrier_id\": \"1803\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"610\",\r\n\t\t\t\t\"_apn\": \"internet.epictouch\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EpicMMS\",\r\n\t\t\t\t\"_carrier_id\": \"1803\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"610\",\r\n\t\t\t\t\"_apn\": \"mms.epictouch\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.westlinkcom.com/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"63.99.231.135\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MetroPCS 640\",\r\n\t\t\t\t\"_carrier_id\": \"1949\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"640\",\r\n\t\t\t\t\"_apn\": \"fast.metropcs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://metropcs.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"6D\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MetroPCS 660\",\r\n\t\t\t\t\"_carrier_id\": \"1949\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"660\",\r\n\t\t\t\t\"_apn\": \"fast.metropcs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://metropcs.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"6D\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"690\",\r\n\t\t\t\t\"_apn\": \"truphone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.truphone.com:1981/mm1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"690\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Limitless\",\r\n\t\t\t\t\"_carrier_id\": \"1808\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"690\",\r\n\t\t\t\t\"_apn\": \"limitless.us4g.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.limitless.csky.us:6672/\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.79\",\r\n\t\t\t\t\"_mmsport\": \"9401\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"appalachian\",\r\n\t\t\t\t\"_carrier_id\": \"1813\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"750\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ekn.com\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Appalachian IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1813\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"750\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Appalachian IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1813\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"750\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Appalachian FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1813\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"750\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Appalachian FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1813\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"750\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Appalachian\",\r\n\t\t\t\t\"_carrier_id\": \"1813\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"750\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ekn.com\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Appalachian\",\r\n\t\t\t\t\"_carrier_id\": \"1813\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"750\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ekn.com\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Web 2\",\r\n\t\t\t\t\"_carrier_id\": \"1815\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"770\",\r\n\t\t\t\t\"_apn\": \"i2.iwireless.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Web 1\",\r\n\t\t\t\t\"_carrier_id\": \"1815\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"770\",\r\n\t\t\t\t\"_apn\": \"wap1.iwireless.com\",\r\n\t\t\t\t\"_proxy\": \"209.4.229.31\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Picture Messaging\",\r\n\t\t\t\t\"_carrier_id\": \"1815\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"770\",\r\n\t\t\t\t\"_apn\": \"wap1.iwireless.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.iwireless.dataonair.net:6672\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.31\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MetroPCS 800\",\r\n\t\t\t\t\"_carrier_id\": \"1949\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"800\",\r\n\t\t\t\t\"_apn\": \"fast.metropcs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://metropcs.mmsmvno.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_match_data\": \"6D\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"nepa\",\r\n\t\t\t\t\"_carrier_id\": \"2325\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"820\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nepa\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.c1nepa.csky.us:6672/\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nepa IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2325\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"820\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nepa\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nepa IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2325\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"820\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nepa\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nepa FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2325\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"820\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nepa\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nepa FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2325\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"820\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nepa\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nepa\",\r\n\t\t\t\t\"_carrier_id\": \"2325\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"820\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.c1nepa.csky.us:6672/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nepa\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nepa\",\r\n\t\t\t\t\"_carrier_id\": \"2325\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"820\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.c1nepa.csky.us:6672/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nepa\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1821\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"840\",\r\n\t\t\t\t\"_apn\": \"isp\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1821\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"840\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.edgemobile.net/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"12.108.12.13\",\r\n\t\t\t\t\"_mmsport\": \"3128\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Edge MMS Prepay\",\r\n\t\t\t\t\"_carrier_id\": \"1821\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"840\",\r\n\t\t\t\t\"_apn\": \"ppmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.edgemobile.net/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"12.108.12.13\",\r\n\t\t\t\t\"_mmsport\": \"3128\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DTC dtcwap\",\r\n\t\t\t\t\"_carrier_id\": \"1825\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"880\",\r\n\t\t\t\t\"_apn\": \"wapdtcw.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_proxy\": \"204.181.155.218\",\r\n\t\t\t\t\"_port\": \"8080\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DTC MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1825\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"880\",\r\n\t\t\t\t\"_apn\": \"mms.adv.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.iot1.com/advantage/mms.php\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"midrivers\",\r\n\t\t\t\t\"_carrier_id\": \"1827\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"900\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.midrivers.csky.us:6672/\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.27\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Midrivers IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1827\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"900\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Midrivers IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1827\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"900\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Midrivers FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1827\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"900\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Midrivers FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1827\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"900\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Midrivers\",\r\n\t\t\t\t\"_carrier_id\": \"1827\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"900\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.midrivers.csky.us:6672/\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.27\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Midrivers\",\r\n\t\t\t\t\"_carrier_id\": \"1827\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"900\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.midrivers.csky.us:6672/\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.27\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"jamesvalley\",\r\n\t\t\t\t\"_carrier_id\": \"1829\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"920\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://m.iot1.com/jamesvalley/mms.php\",\r\n\t\t\t\t\"_mmsproxy\": \"m.iot1.com\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Jamesvalley IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1829\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"920\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Jamesvalley IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1829\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"920\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Jamesvalley FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1829\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"920\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Jamesvalley FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1829\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"920\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Jamesvalley\",\r\n\t\t\t\t\"_carrier_id\": \"1829\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"920\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://m.iot1.com/jamesvalley/mms.php\",\r\n\t\t\t\t\"_mmsproxy\": \"m.iot1.com\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Jamesvalley\",\r\n\t\t\t\t\"_carrier_id\": \"1829\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"920\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://m.iot1.com/jamesvalley/mms.php\",\r\n\t\t\t\t\"_mmsproxy\": \"m.iot1.com\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"coppervalley\",\r\n\t\t\t\t\"_carrier_id\": \"1830\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"930\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://cvwmms.com/servlets/mms\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Coppervalley IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1830\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"930\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Coppervalley IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1830\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"930\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Coppervalley FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1830\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"930\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Coppervalley FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1830\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"930\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Copper Valley\",\r\n\t\t\t\t\"_carrier_id\": \"1830\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"930\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://cvwmms.com/servlets/mms\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Copper Valley\",\r\n\t\t\t\t\"_carrier_id\": \"1830\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"930\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://cvwmms.com/servlets/mms\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tracfone AT&T\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"950\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"DEFF\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tracfone AT&T IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"950\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"DEFF\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tracfone AT&T Hotspot\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"950\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"DEFF\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"nntcwire\",\r\n\t\t\t\t\"_carrier_id\": \"2324\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nntcwire\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nntcwire IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2324\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nntcwire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nntcwire IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2324\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nntcwire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nntcwire FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2324\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nntcwire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nntcwire FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2324\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nntcwire\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nntcwire\",\r\n\t\t\t\t\"_carrier_id\": \"2324\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nntcwire\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nntcwire\",\r\n\t\t\t\t\"_carrier_id\": \"2324\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nntcwire\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"silverstar\",\r\n\t\t\t\t\"_carrier_id\": \"2323\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"silverstar\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Silverstar IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2323\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"silverstar\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Silverstar IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2323\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"silverstar\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Silverstar FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2323\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"silverstar\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Silverstar FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2323\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"silverstar\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Silverstar\",\r\n\t\t\t\t\"_carrier_id\": \"2323\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"silverstar\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Silverstar\",\r\n\t\t\t\t\"_carrier_id\": \"2323\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"silverstar\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"snakeriver\",\r\n\t\t\t\t\"_carrier_id\": \"2322\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"snakeriver\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Snakeriver IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2322\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"snakeriver\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Snakeriver IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2322\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"snakeriver\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Snakeriver FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2322\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"snakeriver\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Snakeriver FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2322\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"snakeriver\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Snakeriver\",\r\n\t\t\t\t\"_carrier_id\": \"2322\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"snakeriver\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Snakeriver\",\r\n\t\t\t\t\"_carrier_id\": \"2322\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"snakeriver\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"southcentral\",\r\n\t\t\t\t\"_carrier_id\": \"2321\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"southcentral\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Southcentral IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2321\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"southcentral\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Southcentral IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2321\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"southcentral\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Southcentral FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2321\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"southcentral\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Southcentral FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2321\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"southcentral\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Southcentral\",\r\n\t\t\t\t\"_carrier_id\": \"2321\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"southcentral\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Southcentral\",\r\n\t\t\t\t\"_carrier_id\": \"2321\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"southcentral\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"strata\",\r\n\t\t\t\t\"_carrier_id\": \"2320\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"strata\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Strata IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2320\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"strata\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Strata IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2320\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"strata\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Strata FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2320\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"strata\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Strata FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2320\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"strata\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"strata\",\r\n\t\t\t\t\"_carrier_id\": \"2320\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"strata\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"strata\",\r\n\t\t\t\t\"_carrier_id\": \"2320\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"strata\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"syringa\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"syringa\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Syringa IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"syringa\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Syringa IMS\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"syringa\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Syringa FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"syringa\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Syringa FOTA\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"syringa\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Syringa\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"syringa\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Syringa\",\r\n\t\t\t\t\"_mcc\": \"310\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"syringa\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"thumbcellular\",\r\n\t\t\t\t\"_carrier_id\": \"1241\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.thumbcell.com/thumb/mms.php\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Thumb IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1241\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Thumb IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1241\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Thumb FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1241\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Thumb FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1241\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Thumbcellular\",\r\n\t\t\t\t\"_carrier_id\": \"1241\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.thumbcell.com/thumb/mms.php\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Thumbcellular\",\r\n\t\t\t\t\"_carrier_id\": \"1241\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.thumbcell.com/thumb/mms.php\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"elementmobile\",\r\n\t\t\t\t\"_carrier_id\": \"2319\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"070\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"elementmobile\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.elementmobile.net\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Elementmobile IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2319\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"070\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"elementmobile\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Elementmobile IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2319\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"070\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"elementmobile\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Elementmobile FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2319\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"070\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"elementmobile\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Elementmobile FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2319\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"070\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"elementmobile\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Elementmobile\",\r\n\t\t\t\t\"_carrier_id\": \"2319\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"070\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.elementmobile.net\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"elementmobile\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Elementmobile\",\r\n\t\t\t\t\"_carrier_id\": \"2319\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"070\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.elementmobile.net\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"elementmobile\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"PINE WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1244\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"080\",\r\n\t\t\t\t\"_apn\": \"PINE\",\r\n\t\t\t\t\"_mmsc\": \"http://69.8.34.146/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"69.8.34.146\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"NexTech Wireless\",\r\n\t\t\t\t\"_carrier_id\": \"2255\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"100\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ntwls.net/nex-tech/mms.php\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"sprocket\",\r\n\t\t\t\t\"_carrier_id\": \"2318\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"sprocket\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.sprocketwireless.com\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sprocket IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2318\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"sprocket\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sprocket IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2318\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"sprocket\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sprocket FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2318\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"sprocket\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sprocket FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2318\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"sprocket\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sprocket\",\r\n\t\t\t\t\"_carrier_id\": \"2318\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.sprocketwireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"sprocket\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sprocket\",\r\n\t\t\t\t\"_carrier_id\": \"2318\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.sprocketwireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"sprocket\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dish-ATT internet\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3442\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3442\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3442\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dish-ATT internet\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3444\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3444\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3444\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dish-ATT internet\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3446\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3446\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3446\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dish-ATT internet\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3448\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3448\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"3448\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ISP\",\r\n\t\t\t\t\"_carrier_id\": \"1833\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"190\",\r\n\t\t\t\t\"_apn\": \"isp.cellular1.net\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tether\",\r\n\t\t\t\t\"_carrier_id\": \"1833\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"190\",\r\n\t\t\t\t\"_apn\": \"broadband.cellular1.net\",\r\n\t\t\t\t\"_type\": \"dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1833\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"190\",\r\n\t\t\t\t\"_apn\": \"mms.cellular1.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.cellular1.net\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.0.97\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_carrier_id\": \"1952\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"220\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_carrier_id\": \"1952\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"220\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_carrier_id\": \"1952\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"220\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"221\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"221\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"221\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"221\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"221\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"222\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"222\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"222\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"223\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"223\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"223\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"224\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"224\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"224\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"225\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"225\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_carrier_enabled\": \"true\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"225\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_carrier_enabled\": \"true\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"226\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"226\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"226\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"227\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"227\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"227\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"228\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"228\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"228\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"229\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"229\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"229\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CSpire ota\",\r\n\t\t\t\t\"_carrier_id\": \"1836\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"230\",\r\n\t\t\t\t\"_apn\": \"admin.cs4glte.com\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CSpire ota\",\r\n\t\t\t\t\"_carrier_id\": \"1836\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"230\",\r\n\t\t\t\t\"_apn\": \"admin.cs4glte.com\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CSpire internet\",\r\n\t\t\t\t\"_carrier_id\": \"1836\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"230\",\r\n\t\t\t\t\"_apn\": \"internet.cs4glte.com\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_mmsc\": \"http://pix.cspire.com\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CSpire tether\",\r\n\t\t\t\t\"_carrier_id\": \"1836\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"230\",\r\n\t\t\t\t\"_apn\": \"tethering.cs4glte.com\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CSpire tether\",\r\n\t\t\t\t\"_carrier_id\": \"1836\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"230\",\r\n\t\t\t\t\"_apn\": \"tethering.cs4glte.com\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CSpire\",\r\n\t\t\t\t\"_carrier_id\": \"1836\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"230\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://pix.cspire.com/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"66.175.144.91\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"leaco\",\r\n\t\t\t\t\"_carrier_id\": \"1842\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"310\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://204.181.155.217/mms/\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Leaco IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1842\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"310\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Leaco IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1842\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"310\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Leaco FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1842\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"310\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Leaco FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1842\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"310\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Leaco\",\r\n\t\t\t\t\"_carrier_id\": \"1842\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"310\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://204.181.155.217/mms/\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Leaco\",\r\n\t\t\t\t\"_carrier_id\": \"1842\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"310\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://204.181.155.217/mms/\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"illinoisvalley\",\r\n\t\t\t\t\"_carrier_id\": \"1263\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"340\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.iot1.com/ivc/mms.php\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Illinois IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1263\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"340\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Illinois IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1263\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"340\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Illinois FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1263\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"340\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Illinois FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1263\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"340\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Illinois valley\",\r\n\t\t\t\t\"_carrier_id\": \"1263\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"340\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.iot1.com/ivc/mms.php\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Illinois valley\",\r\n\t\t\t\t\"_carrier_id\": \"1263\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"340\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.iot1.com/ivc/mms.php\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"nemont\",\r\n\t\t\t\t\"_carrier_id\": \"2317\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"350\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nemont\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.nemont.mobi/mms/\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nemont IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2317\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"350\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nemont\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nemont IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2317\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"350\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nemont\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nemont FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2317\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"350\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nemont\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nemont FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2317\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"350\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nemont\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nemont\",\r\n\t\t\t\t\"_carrier_id\": \"2317\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"350\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.nemont.mobi/mms/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nemont\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nemont\",\r\n\t\t\t\t\"_carrier_id\": \"2317\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"350\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.nemont.mobi/mms/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"nemont\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"GCI WEB\",\r\n\t\t\t\t\"_carrier_id\": \"1843\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"370\",\r\n\t\t\t\t\"_apn\": \"web.gci\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"GCI MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1843\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"370\",\r\n\t\t\t\t\"_apn\": \"mms.gci\",\r\n\t\t\t\t\"_proxy\": \"24.237.158.34\",\r\n\t\t\t\t\"_port\": \"9201\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.gci.net\",\r\n\t\t\t\t\"_mmsproxy\": \"24.237.158.34\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ericsson Test-SIM Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1845\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"390\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_profile_id\": \"0\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ericsson Test-SIM Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1845\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"390\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_profile_id\": \"0\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ericsson Test-SIM FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1845\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"390\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_profile_id\": \"3\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ericsson Test-SIM FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1845\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"390\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_profile_id\": \"3\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ericsson Test-SIM IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1845\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"390\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_profile_id\": \"2\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ericsson Test-SIM IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1845\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"390\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_profile_id\": \"2\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ericsson Test-SIM CBS\",\r\n\t\t\t\t\"_carrier_id\": \"1845\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"390\",\r\n\t\t\t\t\"_apn\": \"VZWAPP\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vtext.com/servlets/mms\",\r\n\t\t\t\t\"_type\": \"cbs,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_profile_id\": \"4\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ericsson Test-SIM CBS\",\r\n\t\t\t\t\"_carrier_id\": \"1845\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"390\",\r\n\t\t\t\t\"_apn\": \"VZWAPP\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vtext.com/servlets/mms\",\r\n\t\t\t\t\"_type\": \"cbs,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_profile_id\": \"4\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"1023\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"chatmobrsa2\",\r\n\t\t\t\t\"_carrier_id\": \"1846\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.hawkeyeswitch.net/mms/\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatmobrsa2 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1846\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatmobrsa2 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1846\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatmobrsa2 FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1846\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatmobrsa2 FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1846\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatmobrsa2\",\r\n\t\t\t\t\"_carrier_id\": \"1846\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.hawkeyeswitch.net/mms/\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatmobrsa2\",\r\n\t\t\t\t\"_carrier_id\": \"1846\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"410\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.hawkeyeswitch.net/mms/\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"northwestcell\",\r\n\t\t\t\t\"_carrier_id\": \"1847\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"420\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.nwmcell.com/mms/\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"NW IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1847\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"420\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"NW IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1847\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"420\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"NW FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1847\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"420\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"NW FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1847\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"420\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Northwestcell\",\r\n\t\t\t\t\"_carrier_id\": \"1847\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"420\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.nwmcell.com/mms/\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Northwestcell\",\r\n\t\t\t\t\"_carrier_id\": \"1847\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"420\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.nwmcell.com/mms/\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"chatmobrsa1\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"430\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"chatmobrsa1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.hawkeyeswitch.net/mms/\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatmobrsa1 IMS\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"430\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"chatmobrsa1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatmobrsa1 IMS\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"430\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"chatmobrsa1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatmobrsa1 FOTA\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"430\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"chatmobrsa1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatmobrsa1 FOTA\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"430\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"chatmobrsa1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatmobrsa1\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"430\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.hawkeyeswitch.net/mms/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"chatmobrsa1\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatmobrsa1\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"430\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.hawkeyeswitch.net/mms/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"chatmobrsa1\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bluegrass\",\r\n\t\t\t\t\"_carrier_id\": \"1849\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"440\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.iot1.com/bluegrass/mms.php\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bluegrass IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1849\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"440\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bluegrass IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1849\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"440\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bluegrass FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1849\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"440\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bluegrass FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1849\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"440\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bluegrass\",\r\n\t\t\t\t\"_carrier_id\": \"1849\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"440\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.iot1.com/bluegrass/mms.php\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bluegrass\",\r\n\t\t\t\t\"_carrier_id\": \"1849\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"440\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.iot1.com/bluegrass/mms.php\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ptci\",\r\n\t\t\t\t\"_carrier_id\": \"1850\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"450\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.ptci.net\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ptci IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1850\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"450\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ptci IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1850\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"450\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ptci FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1850\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"450\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ptci FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1850\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"450\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ptci\",\r\n\t\t\t\t\"_carrier_id\": \"1850\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"450\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.ptci.net\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ptci\",\r\n\t\t\t\t\"_carrier_id\": \"1850\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"450\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.ptci.net\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LTE - Verizon Internet\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"480\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_profile_id\": \"0\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"20\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Verizon Emergency\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"480\",\r\n\t\t\t\t\"_apn\": \"vzwemergency\",\r\n\t\t\t\t\"_type\": \"emergency\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_profile_id\": \"1000\",\r\n\t\t\t\t\"_max_conns\": \"20\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LTE - Verizon FOTA\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"480\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_profile_id\": \"3\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"20\",\r\n\t\t\t\t\"_max_conns_time\": \"300\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Verizon IMS\",\r\n\t\t\t\t\"_apn\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"480\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_max_conns\": \"20\",\r\n\t\t\t\t\"_max_conns_time\": \"300\",\r\n\t\t\t\t\"_profile_id\": \"2\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LTE - Verizon CBS\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"480\",\r\n\t\t\t\t\"_apn\": \"VZWAPP\",\r\n\t\t\t\t\"_type\": \"cbs,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vzwreseller.com/servlets/mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_profile_id\": \"4\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"20\",\r\n\t\t\t\t\"_max_conns_time\": \"300\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"24-7 WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1854\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"500\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.ctc.csky.us:6672\",\r\n\t\t\t\t\"_mmsproxy\": \"9.4.229.46\",\r\n\t\t\t\t\"_mmsport\": \"9201\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mosaic WAP\",\r\n\t\t\t\t\"_carrier_id\": \"2316\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"500\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.ctc.csky.us:6672/\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.46\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Mosaic Mobile\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mosaic WAP AT&T\",\r\n\t\t\t\t\"_carrier_id\": \"2316\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"500\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.ctc.csky.us:6672/\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.46\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Mosaic RPA\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mosaic WAP T-Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2316\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"500\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.ctc.csky.us:6672/\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.46\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Mosaic RPT\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mosaic WAP Other networks\",\r\n\t\t\t\t\"_carrier_id\": \"2316\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"500\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.ctc.csky.us:6672/\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.46\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Mosaic RPO\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Norvado\",\r\n\t\t\t\t\"_carrier_id\": \"2315\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"500\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.ctc.csky.us:6672/\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.46\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Norvado Wireless\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Norvado AT&T\",\r\n\t\t\t\t\"_carrier_id\": \"2315\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"500\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.ctc.csky.us:6672/\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.46\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Norvado Wireless RPA\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Norvado T-Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2315\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"500\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.ctc.csky.us:6672/\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.46\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Norvado Wireless RPT\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Norvado Other networks\",\r\n\t\t\t\t\"_carrier_id\": \"2315\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"500\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.ctc.csky.us:6672/\",\r\n\t\t\t\t\"_mmsproxy\": \"209.4.229.46\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Norvado Wireless RPO\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Blaze\",\r\n\t\t\t\t\"_carrier_id\": \"1857\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"530\",\r\n\t\t\t\t\"_apn\": \"mms.mymobiletxt.com\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms2.mymobiletxt.net\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Duet Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1857\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"530\",\r\n\t\t\t\t\"_apn\": \"wap.mymobiletxt.com\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_mmsc\": \"http://172.16.16.103/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"172.16.16.102\",\r\n\t\t\t\t\"_mmsport\": \"8080\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_carrier_id\": \"1952\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"580\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_carrier_id\": \"1952\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"580\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_carrier_id\": \"1952\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"580\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"581\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"581\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"581\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"582\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"582\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"582\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"583\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"583\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"583\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"584\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"584\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"584\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"585\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"585\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"585\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"586\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"586\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"586\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"587\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"587\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"587\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"588\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"588\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"588\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"589\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"589\",\r\n\t\t\t\t\"_apn\": \"usccinternet\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U.S. Cellular\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"589\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.uscc.net/mmsc/MMS\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,hipri,fota\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"4|5|6|7|12\",\r\n\t\t\t\t\"_mtu\": \"1422\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"gsc\",\r\n\t\t\t\t\"_carrier_id\": \"2288\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"590\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"gsc\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.gscdata.com\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gsc IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2288\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"590\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"gsc\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gsc IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2288\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"590\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"gsc\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gsc FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2288\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"590\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"gsc\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gsc FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2288\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"590\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"gsc\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gsc\",\r\n\t\t\t\t\"_carrier_id\": \"2288\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"590\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.gscdata.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"gsc\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gsc\",\r\n\t\t\t\t\"_carrier_id\": \"2288\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"590\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc1.gscdata.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"gsc\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"cox\",\r\n\t\t\t\t\"_carrier_id\": \"1910\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"600\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.cox.net/cox/mms.php\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cox IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1910\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"600\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cox IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1910\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"600\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cox FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1910\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"600\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cox FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"1910\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"600\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cox\",\r\n\t\t\t\t\"_carrier_id\": \"1910\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"600\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.cox.net/cox/mms.php\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cox\",\r\n\t\t\t\t\"_carrier_id\": \"1910\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"600\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.cox.net/cox/mms.php\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"srtcomm\",\r\n\t\t\t\t\"_carrier_id\": \"2158\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"610\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"srtcomm\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.iot1.com/srt/mms.php\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.iot1.com\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Srtcomm IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2158\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"610\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"srtcomm\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Srtcomm IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2158\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"610\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"srtcomm\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Srtcomm FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2158\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"610\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"srtcomm\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Srtcomm FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2158\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"610\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"srtcomm\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Srtcomm\",\r\n\t\t\t\t\"_carrier_id\": \"2158\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"610\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.iot1.com/srt/mms.php\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.iot1.com\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"srtcomm\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Srtcomm\",\r\n\t\t\t\t\"_carrier_id\": \"2158\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"610\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.iot1.com/srt/mms.php\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.iot1.com\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"srtcomm\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"unitedwireless\",\r\n\t\t\t\t\"_carrier_id\": \"2159\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"650\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"unitedwireless\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.unitedwireless.com/united/mms.php\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"United IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2159\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"650\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"unitedwireless\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"United IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2159\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"650\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"unitedwireless\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"United FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2159\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"650\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"unitedwireless\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"United FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2159\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"650\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"unitedwireless\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Unitedwireless\",\r\n\t\t\t\t\"_carrier_id\": \"2159\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"650\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.unitedwireless.com/united/mms.php\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"unitedwireless\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Unitedwireless\",\r\n\t\t\t\t\"_carrier_id\": \"2159\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"650\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.unitedwireless.com/united/mms.php\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"unitedwireless\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pine Belt\",\r\n\t\t\t\t\"_carrier_id\": \"2160\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"670\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pine Belt\",\r\n\t\t\t\t\"_carrier_id\": \"2160\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"670\",\r\n\t\t\t\t\"_apn\": \"lte.ota.pinebelt.net\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pine Belt\",\r\n\t\t\t\t\"_carrier_id\": \"2160\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"670\",\r\n\t\t\t\t\"_apn\": \"lte.internet.pinebelt.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.pinebelt.net:6672/\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pine Belt\",\r\n\t\t\t\t\"_carrier_id\": \"2160\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"670\",\r\n\t\t\t\t\"_apn\": \"lte.tether.pinebelt.net\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TelAlaska Cellular\",\r\n\t\t\t\t\"_carrier_id\": \"2256\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"740\",\r\n\t\t\t\t\"_apn\": \"akcell.mobi\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cleartalk\",\r\n\t\t\t\t\"_carrier_id\": \"2257\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"750\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,dun\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.cleartalk.us/cleartalk/mms.php\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ClearTalk LTE\",\r\n\t\t\t\t\"_carrier_id\": \"2257\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"750\",\r\n\t\t\t\t\"_apn\": \"home.netamerica.com\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,dun\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.cleartalk.us/cleartalk/mms.php\",\r\n\t\t\t\t\"_mtu\": \"1428\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sprint\",\r\n\t\t\t\t\"_carrier_id\": \"1788\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"882\",\r\n\t\t\t\t\"_apn\": \"internet.curiosity.sprint.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MobileNation\",\r\n\t\t\t\t\"_carrier_id\": \"2258\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"910\",\r\n\t\t\t\t\"_apn\": \"mymn4g.net\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_mmsport\": \"8081\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.mymn3g.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mymn3g.net\",\r\n\t\t\t\t\"_type\": \"default,ia,fota,dun,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"charitonvalley\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"920\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"charitonvalley\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.cvalley.net\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chariton IMS\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"920\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"charitonvalley\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chariton IMS\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"920\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"charitonvalley\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chariton FOTA\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"920\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"charitonvalley\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chariton FOTA\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"920\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"charitonvalley\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chariton valley\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"920\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.cvalley.net\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"charitonvalley\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chariton valley\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"920\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.cvalley.net\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"charitonvalley\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Syringa Wireless\",\r\n\t\t\t\t\"_carrier_id\": \"2259\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"930\",\r\n\t\t\t\t\"_apn\": \"internet.syringawireless.com\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_type\": \"default,ia,fota,dun,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_mcc\": \"311\",\r\n\t\t\t\t\"_mnc\": \"960\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"custer\",\r\n\t\t\t\t\"_carrier_id\": \"2162\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"custer\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Custer IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2162\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"custer\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Custer IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2162\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"custer\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Custer FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2162\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"custer\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Custer FOTA\",\r\n\t\t\t\t\"_carrier_id\": \"2162\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"custer\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Custer\",\r\n\t\t\t\t\"_carrier_id\": \"2162\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"custer\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Custer\",\r\n\t\t\t\t\"_carrier_id\": \"2162\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.rinawireless.com\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"custer\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"chatmobility\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"160\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"chatmobility\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.chatmobility.com/mms/\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatmobility IMS\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"160\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"chatmobility\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chatmobility IMS\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"160\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"chatmobility\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"chatmobility FOTA\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"160\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"chatmobility\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"chatmobility FOTA\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"160\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"chatmobility\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"chatmobility\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"160\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.chatmobility.com/mms/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"chatmobility\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"chatmobility\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"160\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.chatmobility.com/mms/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"chatmobility\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"NexTech Ota\",\r\n\t\t\t\t\"_carrier_id\": \"2260\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"420\",\r\n\t\t\t\t\"_apn\": \"admin.lte.ntwls.com\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"NexTech Ota\",\r\n\t\t\t\t\"_carrier_id\": \"2260\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"420\",\r\n\t\t\t\t\"_apn\": \"admin.lte.ntwls.com\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"NexTech Wireless\",\r\n\t\t\t\t\"_carrier_id\": \"2260\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"420\",\r\n\t\t\t\t\"_apn\": \"internet.lte.ntwls.com\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ntwls.net/nex-tech/mms.php\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,hipri,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"NexTech Tether\",\r\n\t\t\t\t\"_carrier_id\": \"2260\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"420\",\r\n\t\t\t\t\"_apn\": \"modem.lte.ntwls.com\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"NexTech Tether\",\r\n\t\t\t\t\"_carrier_id\": \"2260\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"420\",\r\n\t\t\t\t\"_apn\": \"modem.lte.ntwls.com\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"NetGenuity IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2599\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"630\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"NetGenuity Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2599\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"630\",\r\n\t\t\t\t\"_apn\": \"data\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"GigSky\",\r\n\t\t\t\t\"_carrier_id\": \"2459\",\r\n\t\t\t\t\"_mcc\": \"312\",\r\n\t\t\t\t\"_mnc\": \"870\",\r\n\t\t\t\t\"_apn\": \"gigsky\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MobileUC IMS\",\r\n\t\t\t\t\"_carrier_id\": \"10030\",\r\n\t\t\t\t\"_mcc\": \"313\",\r\n\t\t\t\t\"_mnc\": \"770\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MobileUC Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"10030\",\r\n\t\t\t\t\"_mcc\": \"313\",\r\n\t\t\t\t\"_mnc\": \"770\",\r\n\t\t\t\t\"_apn\": \"globalhotspot\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MobileUC\",\r\n\t\t\t\t\"_carrier_id\": \"10030\",\r\n\t\t\t\t\"_mcc\": \"313\",\r\n\t\t\t\t\"_mnc\": \"770\",\r\n\t\t\t\t\"_apn\": \"globaldata\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,hipri,fota\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mobileuc.global/\",\r\n\t\t\t\t\"_mmsproxy\": \"37.18.129.98\",\r\n\t\t\t\t\"_mmsport\": \"8008\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet USA\",\r\n\t\t\t\t\"_carrier_id\": \"2652\",\r\n\t\t\t\t\"_mcc\": \"314\",\r\n\t\t\t\t\"_mnc\": \"720\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,hipri,fota,dun,xcap\",\r\n\t\t\t\t\"_mtu\": \"1430\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS USA\",\r\n\t\t\t\t\"_carrier_id\": \"2652\",\r\n\t\t\t\t\"_mcc\": \"314\",\r\n\t\t\t\t\"_mnc\": \"720\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"openmobile\",\r\n\t\t\t\t\"_mcc\": \"330\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"CdmaNai\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"openmobile\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.openmobilepr.com:1981/\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_carrier_enabled\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"7\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Openmobile IMS\",\r\n\t\t\t\t\"_mcc\": \"330\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"openmobile\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Openmobile IMS\",\r\n\t\t\t\t\"_mcc\": \"330\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWIMS\",\r\n\t\t\t\t\"_type\": \"ims,ia\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"openmobile\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Openmobile FOTA\",\r\n\t\t\t\t\"_mcc\": \"330\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"openmobile\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Openmobile FOTA\",\r\n\t\t\t\t\"_mcc\": \"330\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWADMIN\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"openmobile\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Openmobile\",\r\n\t\t\t\t\"_mcc\": \"330\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.openmobilepr.com:1981/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"openmobile\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"14\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Openmobile\",\r\n\t\t\t\t\"_mcc\": \"330\",\r\n\t\t\t\t\"_mnc\": \"000\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.openmobilepr.com:1981/\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"openmobile\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,dun,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Puerto Rico:Claro:LTE\",\r\n\t\t\t\t\"_carrier_id\": \"1955\",\r\n\t\t\t\t\"_mcc\": \"330\",\r\n\t\t\t\t\"_mnc\": \"110\",\r\n\t\t\t\t\"_apn\": \"lte.claropr.com\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_authtype\": \"1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS CLARO\",\r\n\t\t\t\t\"_carrier_id\": \"1955\",\r\n\t\t\t\t\"_mcc\": \"330\",\r\n\t\t\t\t\"_mnc\": \"110\",\r\n\t\t\t\t\"_apn\": \"mmslte.claropr.com\",\r\n\t\t\t\t\"_mmsproxy\": \"10.50.38.3\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsg.claropr.com:10021/mmsc\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1913\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"020\",\r\n\t\t\t\t\"_apn\": \"internet.itelcel.com\",\r\n\t\t\t\t\"_user\": \"webgprs\",\r\n\t\t\t\t\"_password\": \"webgprs2002\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mensajes Multimedia\",\r\n\t\t\t\t\"_carrier_id\": \"1913\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"020\",\r\n\t\t\t\t\"_apn\": \"mms.itelcel.com\",\r\n\t\t\t\t\"_user\": \"mmsgprs\",\r\n\t\t\t\t\"_password\": \"mmsgprs2003\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.itelcel.com/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"148.233.151.240\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1913\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"020\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1914\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"030\",\r\n\t\t\t\t\"_apn\": \"internet.movistar.mx\",\r\n\t\t\t\t\"_user\": \"movistar\",\r\n\t\t\t\t\"_password\": \"movistar\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Movistar\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1914\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"030\",\r\n\t\t\t\t\"_apn\": \"mms.movistar.mx\",\r\n\t\t\t\t\"_user\": \"movistar\",\r\n\t\t\t\t\"_password\": \"movistar\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.movistar.mx\",\r\n\t\t\t\t\"_mmsproxy\": \"10.2.20.1\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Movistar\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar MX IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1914\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"030\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Movistar\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1915\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"web.iusacellgsm.mx\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"334050x\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1915\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"mms.attmex.mx\",\r\n\t\t\t\t\"_mmsproxy\": \"129.192.129.104\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.att.com.mx\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"334050x\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Modem\",\r\n\t\t\t\t\"_carrier_id\": \"1915\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"modem.attmex.mx\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"334050x\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Location\",\r\n\t\t\t\t\"_carrier_id\": \"1915\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"supl.attmex.mx\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_server\": \"http://supl.iusacell.com\",\r\n\t\t\t\t\"_type\": \"supl\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"334050x\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Modem\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"090\",\r\n\t\t\t\t\"_apn\": \"modem.attmex.mx\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"334090x\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Location\",\r\n\t\t\t\t\"_carrier_id\": \"1912\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"090\",\r\n\t\t\t\t\"_apn\": \"supl.attmex.mx\",\r\n\t\t\t\t\"_server\": \"http://supl.iusacell.com\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"supl\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"334090x\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1912\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"090\",\r\n\t\t\t\t\"_apn\": \"mms.attmex.mx\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.att.com.mx\",\r\n\t\t\t\t\"_mmsproxy\": \"129.192.129.104\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"334090x\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1912\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"090\",\r\n\t\t\t\t\"_apn\": \"wap.attmex.mx\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"334090x\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Altan\",\r\n\t\t\t\t\"_carrier_id\": \"2469\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.altan\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Altan\",\r\n\t\t\t\t\"_carrier_id\": \"2469\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IENTC\",\r\n\t\t\t\t\"_carrier_id\": \"2470\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.ientc.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"IENTC\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"NeWWW\",\r\n\t\t\t\t\"_carrier_id\": \"2471\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.newww.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"NeWWW\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"NeWWW\",\r\n\t\t\t\t\"_carrier_id\": \"2471\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"NeWWW\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Megacable\",\r\n\t\t\t\t\"_carrier_id\": \"2473\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"mega45g.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Mega4.5 G\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Megacable\",\r\n\t\t\t\t\"_carrier_id\": \"2473\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Mega4.5 G\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netwey\",\r\n\t\t\t\t\"_carrier_id\": \"2474\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.netwey.com.mx\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"NETWEY\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netwey\",\r\n\t\t\t\t\"_carrier_id\": \"2474\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"NETWEY\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Retemex\",\r\n\t\t\t\t\"_carrier_id\": \"2475\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.retemex.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"RETEMEX\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Retemex\",\r\n\t\t\t\t\"_carrier_id\": \"2475\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"RETEMEX\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Walmart MX\",\r\n\t\t\t\t\"_carrier_id\": \"2476\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.wm.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"BAIT\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Walmart MX\",\r\n\t\t\t\t\"_carrier_id\": \"2476\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"BAIT\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Iusacomm\",\r\n\t\t\t\t\"_carrier_id\": \"2477\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.iusacomm.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"IUSATEL\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Iusacomm\",\r\n\t\t\t\t\"_carrier_id\": \"2477\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"IUSATEL\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CFE\",\r\n\t\t\t\t\"_carrier_id\": \"2478\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.cfe.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"CFE TEIPT\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CFE\",\r\n\t\t\t\t\"_carrier_id\": \"2478\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"CFE TEIPT\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Inten\",\r\n\t\t\t\t\"_carrier_id\": \"2479\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.inten.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"INTEN\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Inteni\",\r\n\t\t\t\t\"_carrier_id\": \"2479\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"INTEN\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Diveracy\",\r\n\t\t\t\t\"_carrier_id\": \"2480\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.diveracy.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"NEMI\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Diveracy\",\r\n\t\t\t\t\"_carrier_id\": \"2480\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"NEMI\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Diri\",\r\n\t\t\t\t\"_carrier_id\": \"2481\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.diri.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"DIRI\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Diri\",\r\n\t\t\t\t\"_carrier_id\": \"2481\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"DIRI\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Topos\",\r\n\t\t\t\t\"_carrier_id\": \"2482\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.turbored.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"TURBORED\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Topos\",\r\n\t\t\t\t\"_carrier_id\": \"2482\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"TURBORED\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Guruweb\",\r\n\t\t\t\t\"_carrier_id\": \"2483\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.gugacom.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Gurucomm\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Guruweb\",\r\n\t\t\t\t\"_carrier_id\": \"2483\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Gurucomm\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ubix\",\r\n\t\t\t\t\"_carrier_id\": \"2484\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.ubix.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Ubix\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ubix\",\r\n\t\t\t\t\"_carrier_id\": \"2484\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Ubix\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Rocketel\",\r\n\t\t\t\t\"_carrier_id\": \"2485\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.rocketel.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"PagaPhone\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Rocketel\",\r\n\t\t\t\t\"_carrier_id\": \"2485\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"PagaPhone\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Redpotencia\",\r\n\t\t\t\t\"_carrier_id\": \"2486\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.edilar.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Redpotencia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Redpotencia\",\r\n\t\t\t\t\"_carrier_id\": \"2486\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Redpotencia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Adinteli 1\",\r\n\t\t\t\t\"_carrier_id\": \"2487\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.plus.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"CHAMO-MOVIL\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Adinteli 1\",\r\n\t\t\t\t\"_carrier_id\": \"2487\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"CHAMO-MOVIL\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Adinteli 2\",\r\n\t\t\t\t\"_carrier_id\": \"2487\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.plus.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"BYPLUS\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Adinteli 2\",\r\n\t\t\t\t\"_carrier_id\": \"2487\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"BYPLUS\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Izzi\",\r\n\t\t\t\t\"_carrier_id\": \"2488\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.izzi.mx\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"izzi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Izzi\",\r\n\t\t\t\t\"_carrier_id\": \"2488\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"izzi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Adm\",\r\n\t\t\t\t\"_carrier_id\": \"2489\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.adm.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"MISTRAL\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Adm\",\r\n\t\t\t\t\"_carrier_id\": \"2489\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"MISTRAL\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ads\",\r\n\t\t\t\t\"_carrier_id\": \"2490\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.mexfon.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"MEXFON\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ads\",\r\n\t\t\t\t\"_carrier_id\": \"2490\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"MEXFON\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Yonder\",\r\n\t\t\t\t\"_carrier_id\": \"2491\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.yotelco.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"YO\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Yonder\",\r\n\t\t\t\t\"_carrier_id\": \"2491\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"YO\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Arlonet\",\r\n\t\t\t\t\"_carrier_id\": \"2492\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.arloesinet.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Arlonet\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Arlonet\",\r\n\t\t\t\t\"_carrier_id\": \"2492\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Arlonet\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tridex\",\r\n\t\t\t\t\"_carrier_id\": \"2493\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.valor.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"VALOR\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tridex\",\r\n\t\t\t\t\"_carrier_id\": \"2493\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"VALOR\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Wimo\",\r\n\t\t\t\t\"_carrier_id\": \"2494\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.wimo.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"WiMO\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Wimoi\",\r\n\t\t\t\t\"_carrier_id\": \"2494\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"WiMO\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Oui\",\r\n\t\t\t\t\"_carrier_id\": \"2495\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet.oui.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"OUI\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Oui\",\r\n\t\t\t\t\"_carrier_id\": \"2495\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"OUI\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Freedompop\",\r\n\t\t\t\t\"_carrier_id\": \"2496\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"Internet.mvne1.com\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"FreedomPop\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Freedompop\",\r\n\t\t\t\t\"_carrier_id\": \"2496\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"FreedomPop\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IENTC\",\r\n\t\t\t\t\"_carrier_id\": \"2470\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"IENTC\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Izzi\",\r\n\t\t\t\t\"_carrier_id\": \"2488\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"160\",\r\n\t\t\t\t\"_apn\": \"mvne.izzi.mx\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap,dun\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"izzi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Izzi\",\r\n\t\t\t\t\"_carrier_id\": \"2488\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"160\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"izzi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet Mexico\",\r\n\t\t\t\t\"_carrier_id\": \"2652\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"170\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,hipri,fota,dun,xcap\",\r\n\t\t\t\t\"_mtu\": \"1430\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS Mexico\",\r\n\t\t\t\t\"_carrier_id\": \"2652\",\r\n\t\t\t\t\"_mcc\": \"334\",\r\n\t\t\t\t\"_mnc\": \"170\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"INTERNET Digicel\",\r\n\t\t\t\t\"_carrier_id\": \"1577\",\r\n\t\t\t\t\"_mcc\": \"338\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"web\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS Digicel\",\r\n\t\t\t\t\"_carrier_id\": \"1577\",\r\n\t\t\t\t\"_mcc\": \"338\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_mmsproxy\": \"172.16.7.12\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.digicelgroup.com\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lime Internet Postpaid\",\r\n\t\t\t\t\"_carrier_id\": \"2224\",\r\n\t\t\t\t\"_mcc\": \"338\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lime Postpaid MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2224\",\r\n\t\t\t\t\"_mcc\": \"338\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lime Internet Prepaid\",\r\n\t\t\t\t\"_carrier_id\": \"2224\",\r\n\t\t\t\t\"_mcc\": \"338\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"ppinternet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lime Prepaid MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2224\",\r\n\t\t\t\t\"_mcc\": \"338\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"ppmms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"INTERNET Digicel\",\r\n\t\t\t\t\"_carrier_id\": \"1577\",\r\n\t\t\t\t\"_mcc\": \"338\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"web\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS Digicel\",\r\n\t\t\t\t\"_carrier_id\": \"1577\",\r\n\t\t\t\t\"_mcc\": \"338\",\r\n\t\t\t\t\"_mnc\": \"050\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_mmsproxy\": \"172.16.7.12\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.digicelgroup.com\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Claro Web\",\r\n\t\t\t\t\"_carrier_id\": \"2263\",\r\n\t\t\t\t\"_mcc\": \"338\",\r\n\t\t\t\t\"_mnc\": \"070\",\r\n\t\t\t\t\"_apn\": \"internet.ideasclaro.com.jm\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Claro MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2263\",\r\n\t\t\t\t\"_mcc\": \"338\",\r\n\t\t\t\t\"_mnc\": \"070\",\r\n\t\t\t\t\"_apn\": \"mms.ideasclaro.com.jm\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"190.80.147.118\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ideasclaro.com.jm/mms/wapenc\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lime Internet Postpaid\",\r\n\t\t\t\t\"_carrier_id\": \"2224\",\r\n\t\t\t\t\"_mcc\": \"338\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lime Postpaid MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2224\",\r\n\t\t\t\t\"_mcc\": \"338\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lime Internet Prepaid\",\r\n\t\t\t\t\"_carrier_id\": \"2224\",\r\n\t\t\t\t\"_mcc\": \"338\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"ppinternet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lime Prepaid MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2224\",\r\n\t\t\t\t\"_mcc\": \"338\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"ppmms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lime Internet Postpaid\",\r\n\t\t\t\t\"_carrier_id\": \"2224\",\r\n\t\t\t\t\"_mcc\": \"338\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lime Postpaid MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2224\",\r\n\t\t\t\t\"_mcc\": \"338\",\r\n\t\t\t\t\"_mnc\": \"180\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange World\",\r\n\t\t\t\t\"_carrier_id\": \"742\",\r\n\t\t\t\t\"_mcc\": \"340\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"orangeweb\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange MMS Caraïbe\",\r\n\t\t\t\t\"_carrier_id\": \"742\",\r\n\t\t\t\t\"_mcc\": \"340\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"orangewap\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_mmsc\": \"http://193.251.160.246/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.10\",\r\n\t\t\t\t\"_mmsport\": \"8082\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange IMS Caraïbe\",\r\n\t\t\t\t\"_carrier_id\": \"742\",\r\n\t\t\t\t\"_mcc\": \"340\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange CA Ut\",\r\n\t\t\t\t\"_carrier_id\": \"742\",\r\n\t\t\t\t\"_mcc\": \"340\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"orangeut\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SFR LTE\",\r\n\t\t\t\t\"_carrier_id\": \"743\",\r\n\t\t\t\t\"_mcc\": \"340\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SFR Internet\",\r\n\t\t\t\t\"_carrier_id\": \"743\",\r\n\t\t\t\t\"_mcc\": \"340\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet.sfr\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.only.fr:9091\",\r\n\t\t\t\t\"_mmsproxy\": \"mmsc.only.fr\",\r\n\t\t\t\t\"_mmsport\": \"9091\",\r\n\t\t\t\t\"_type\": \"default,hipri,mms,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Modem\",\r\n\t\t\t\t\"_carrier_id\": \"743\",\r\n\t\t\t\t\"_mcc\": \"340\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.sfr\",\r\n\t\t\t\t\"_type\": \"dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Free Caraibes Martinique Guyanne\",\r\n\t\t\t\t\"_mcc\": \"340\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"free.mq\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.free.mq\",\r\n\t\t\t\t\"_mvno_match_data\": \"f008\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Free Caraibes Guadeloupe\",\r\n\t\t\t\t\"_mcc\": \"340\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"free.gp\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.free.gp\",\r\n\t\t\t\t\"_mvno_match_data\": \"f007\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Digicel\",\r\n\t\t\t\t\"_carrier_id\": \"745\",\r\n\t\t\t\t\"_mcc\": \"340\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"digicel\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmc.digicelfr.com/servlets/mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Barbados:Lime:Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1360\",\r\n\t\t\t\t\"_mcc\": \"342\",\r\n\t\t\t\t\"_mnc\": \"600\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Barbados:Lime:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"1360\",\r\n\t\t\t\t\"_mcc\": \"342\",\r\n\t\t\t\t\"_mnc\": \"600\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Antigua:Lime:Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1325\",\r\n\t\t\t\t\"_mcc\": \"344\",\r\n\t\t\t\t\"_mnc\": \"920\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Antigua:Lime:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"1325\",\r\n\t\t\t\t\"_mcc\": \"344\",\r\n\t\t\t\t\"_mnc\": \"920\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cayman Islands:Lime:Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1587\",\r\n\t\t\t\t\"_mcc\": \"346\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cayman Islands:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"1587\",\r\n\t\t\t\t\"_mcc\": \"346\",\r\n\t\t\t\t\"_mnc\": \"140\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lime Internet Postpaid\",\r\n\t\t\t\t\"_mcc\": \"348\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lime Postpaid MMS\",\r\n\t\t\t\t\"_mcc\": \"348\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bvi:Digicel:Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2356\",\r\n\t\t\t\t\"_mcc\": \"348\",\r\n\t\t\t\t\"_mnc\": \"77\",\r\n\t\t\t\t\"_apn\": \"wap.digicelbvi.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bvi:Digicel:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"2356\",\r\n\t\t\t\t\"_mcc\": \"348\",\r\n\t\t\t\t\"_mnc\": \"77\",\r\n\t\t\t\t\"_apn\": \"wap.digicelbvi.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmc.digiceljamaica.com/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.16.7.12\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user\": \"wapbvi\",\r\n\t\t\t\t\"_password\": \"wapbvi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bvi:Lime:Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2289\",\r\n\t\t\t\t\"_mcc\": \"348\",\r\n\t\t\t\t\"_mnc\": \"170\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bvi:Lime:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"2289\",\r\n\t\t\t\t\"_mcc\": \"348\",\r\n\t\t\t\t\"_mnc\": \"170\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Grenada:Lime:Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2223\",\r\n\t\t\t\t\"_mcc\": \"352\",\r\n\t\t\t\t\"_mnc\": \"110\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Grenada:Lime:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"2223\",\r\n\t\t\t\t\"_mcc\": \"352\",\r\n\t\t\t\t\"_mnc\": \"110\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Monserrat:Lime:Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2292\",\r\n\t\t\t\t\"_mcc\": \"354\",\r\n\t\t\t\t\"_mnc\": \"860\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Monserrat:Lime:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"2292\",\r\n\t\t\t\t\"_mcc\": \"354\",\r\n\t\t\t\t\"_mnc\": \"860\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"St Kitts And Nevis:Lime:Internet\",\r\n\t\t\t\t\"_mcc\": \"356\",\r\n\t\t\t\t\"_mnc\": \"110\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"St Kitts And Nevis:Lime:Mms\",\r\n\t\t\t\t\"_mcc\": \"356\",\r\n\t\t\t\t\"_mnc\": \"110\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"St Lucia:Lime:Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2293\",\r\n\t\t\t\t\"_mcc\": \"358\",\r\n\t\t\t\t\"_mnc\": \"110\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"St Lucia:Lime:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"2293\",\r\n\t\t\t\t\"_mcc\": \"358\",\r\n\t\t\t\t\"_mnc\": \"110\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"St Vincent:Lime:Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2294\",\r\n\t\t\t\t\"_mcc\": \"360\",\r\n\t\t\t\t\"_mnc\": \"110\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"St Vincent:Lime:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"2294\",\r\n\t\t\t\t\"_mcc\": \"360\",\r\n\t\t\t\t\"_mnc\": \"110\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Curacao:Digicel:Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1332\",\r\n\t\t\t\t\"_mcc\": \"362\",\r\n\t\t\t\t\"_mnc\": \"69\",\r\n\t\t\t\t\"_apn\": \"web.digicelcuracao.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Curacao:Digicel:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"1332\",\r\n\t\t\t\t\"_mcc\": \"362\",\r\n\t\t\t\t\"_mnc\": \"69\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.digicelgroup.com\",\r\n\t\t\t\t\"_mmsproxy\": \"172.16.7.12\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SETAR Internet\",\r\n\t\t\t\t\"_carrier_id\": \"493\",\r\n\t\t\t\t\"_mcc\": \"363\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.setar.aw\",\r\n\t\t\t\t\"_type\": \"default,fota,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"true\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SETAR MMS\",\r\n\t\t\t\t\"_carrier_id\": \"493\",\r\n\t\t\t\t\"_mcc\": \"363\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.setar.aw\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.setar.aw\",\r\n\t\t\t\t\"_mmsproxy\": \"201.229.65.204\",\r\n\t\t\t\t\"_mmsport\": \"8081\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SETAR IMS\",\r\n\t\t\t\t\"_carrier_id\": \"493\",\r\n\t\t\t\t\"_mcc\": \"363\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"INTERNET Aruba\",\r\n\t\t\t\t\"_carrier_id\": \"2163\",\r\n\t\t\t\t\"_mcc\": \"363\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.digicelaruba.com\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS Digicel\",\r\n\t\t\t\t\"_carrier_id\": \"2163\",\r\n\t\t\t\t\"_mcc\": \"363\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"172.16.7.12\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.digicelgroup.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Be Aliv\",\r\n\t\t\t\t\"_carrier_id\": \"2130\",\r\n\t\t\t\t\"_mcc\": \"364\",\r\n\t\t\t\t\"_mnc\": \"49\",\r\n\t\t\t\t\"_apn\": \"pda.newcomobile.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.bealiv.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Be Aliv IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2130\",\r\n\t\t\t\t\"_mcc\": \"364\",\r\n\t\t\t\t\"_mnc\": \"49\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Anguilla:Lime:Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2295\",\r\n\t\t\t\t\"_mcc\": \"365\",\r\n\t\t\t\t\"_mnc\": \"840\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Anguilla:Lime:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"2295\",\r\n\t\t\t\t\"_mcc\": \"365\",\r\n\t\t\t\t\"_mnc\": \"840\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dominica:Lime:Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2290\",\r\n\t\t\t\t\"_mcc\": \"366\",\r\n\t\t\t\t\"_mnc\": \"110\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dominica:Lime:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"2290\",\r\n\t\t\t\t\"_mcc\": \"366\",\r\n\t\t\t\t\"_mnc\": \"110\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1444\",\r\n\t\t\t\t\"_mcc\": \"368\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cubacel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1444\",\r\n\t\t\t\t\"_mcc\": \"368\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsproxy\": \"200.13.145.52\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.cubacel.cu\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Altice\",\r\n\t\t\t\t\"_mcc\": \"370\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"altice\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet Móvil Claro\",\r\n\t\t\t\t\"_carrier_id\": \"1467\",\r\n\t\t\t\t\"_mcc\": \"370\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet.ideasclaro.com.do\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_authtype\": \"1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1467\",\r\n\t\t\t\t\"_mcc\": \"370\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms.ideasclaro.com.do\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ideasclaro.com.do/mms/wapenc\",\r\n\t\t\t\t\"_mmsproxy\": \"190.80.147.8\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_authtype\": \"1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Viva Edge (GSM)\",\r\n\t\t\t\t\"_carrier_id\": \"1469\",\r\n\t\t\t\t\"_mcc\": \"370\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"edge.viva.net.do\",\r\n\t\t\t\t\"_proxy\": \"192.168.16.10\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_user\": \"viva\",\r\n\t\t\t\t\"_password\": \"viva\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Viva MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1469\",\r\n\t\t\t\t\"_mcc\": \"370\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mms.viva.net.do\",\r\n\t\t\t\t\"_user\": \"viva\",\r\n\t\t\t\t\"_password\": \"viva\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.16.10\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_mmsc\": \"http://10.200.16.4/mms/wapenc\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Wind Telecom\",\r\n\t\t\t\t\"_carrier_id\": \"2437\",\r\n\t\t\t\t\"_mcc\": \"370\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"smart.wind4g.com.do\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Haiti:Digicel:Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1532\",\r\n\t\t\t\t\"_mcc\": \"372\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"wap.digicelha.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Haiti:Digicel:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"1532\",\r\n\t\t\t\t\"_mcc\": \"372\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"wap.digicelha.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmc.digicelhaiti.com/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.20.200.12\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user\": \"wapha\",\r\n\t\t\t\t\"_password\": \"wap01ha\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"NATCOM INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1533\",\r\n\t\t\t\t\"_mcc\": \"372\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"natcom\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile internet\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile mms\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.210.104\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.210.104/mmrelay.app\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"INTERNET Trinidad\",\r\n\t\t\t\t\"_carrier_id\": \"1740\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"web.digiceltt.com\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS Trinidad\",\r\n\t\t\t\t\"_carrier_id\": \"1740\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"wap.digiceltt.com\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_mmsproxy\": \"172.20.6.12\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mmc.digiceltt.com/servlets/mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile internet\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"120\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile mms\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"120\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.210.104\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.210.104/mmrelay.app\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile internet\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"121\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile mms\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"121\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.210.104\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.210.104/mmrelay.app\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile internet\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"122\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile mms\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"122\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.210.104\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.210.104/mmrelay.app\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile internet\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"123\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile mms\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"123\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.210.104\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.210.104/mmrelay.app\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile internet\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"124\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile mms\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"124\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.210.104\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.210.104/mmrelay.app\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile internet\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"125\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile mms\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"125\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.210.104\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.210.104/mmrelay.app\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile internet\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"126\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile mms\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"126\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.210.104\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.210.104/mmrelay.app\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile internet\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"127\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile mms\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"127\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.210.104\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.210.104/mmrelay.app\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile internet\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"128\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile mms\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"128\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.210.104\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.210.104/mmrelay.app\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile internet\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"129\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bmobile mms\",\r\n\t\t\t\t\"_carrier_id\": \"1739\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"129\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.210.104\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.210.104/mmrelay.app\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"INTERNET Trinidad\",\r\n\t\t\t\t\"_carrier_id\": \"1740\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"130\",\r\n\t\t\t\t\"_apn\": \"web.digiceltt.com\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS Trinidad\",\r\n\t\t\t\t\"_carrier_id\": \"1740\",\r\n\t\t\t\t\"_mcc\": \"374\",\r\n\t\t\t\t\"_mnc\": \"130\",\r\n\t\t\t\t\"_apn\": \"wap.digiceltt.com\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_mmsproxy\": \"172.20.6.12\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mmc.digiceltt.com/servlets/mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Turks And Caicos:Lime:Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2291\",\r\n\t\t\t\t\"_mcc\": \"376\",\r\n\t\t\t\t\"_mnc\": \"350\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Turks And Caicos:Lime:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"2291\",\r\n\t\t\t\t\"_mcc\": \"376\",\r\n\t\t\t\t\"_mnc\": \"350\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.20.5.34\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Azercell\",\r\n\t\t\t\t\"_carrier_id\": \"1354\",\r\n\t\t\t\t\"_mcc\": \"400\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bakcell\",\r\n\t\t\t\t\"_carrier_id\": \"495\",\r\n\t\t\t\t\"_mcc\": \"400\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"FONEX\",\r\n\t\t\t\t\"_carrier_id\": \"1355\",\r\n\t\t\t\t\"_mcc\": \"400\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nar Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"1356\",\r\n\t\t\t\t\"_mcc\": \"400\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Beeline Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1588\",\r\n\t\t\t\t\"_mcc\": \"401\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.beeline.kz\",\r\n\t\t\t\t\"_user\": \"@internet.beeline\",\r\n\t\t\t\t\"_password\": \"beeline\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Beeline MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1588\",\r\n\t\t\t\t\"_mcc\": \"401\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.beeline.kz\",\r\n\t\t\t\t\"_user\": \"@mms.beeline\",\r\n\t\t\t\t\"_password\": \"beeline\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.beeline.kz/mms/wapenc\",\r\n\t\t\t\t\"_mmsproxy\": \"172.27.6.93\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DOS Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1588\",\r\n\t\t\t\t\"_mcc\": \"401\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.dos.kz\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"izi\",\r\n\t\t\t\t\"_carrier_id\": \"2436\",\r\n\t\t\t\t\"_mcc\": \"401\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"izi.me\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_mvno_match_data\": \"40101568\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Kcell Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1589\",\r\n\t\t\t\t\"_mcc\": \"401\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Kcell MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1589\",\r\n\t\t\t\t\"_mcc\": \"401\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.kcell.kz/post\",\r\n\t\t\t\t\"_mmsproxy\": \"195.47.255.7\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ALTEL INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"2164\",\r\n\t\t\t\t\"_mcc\": \"401\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1986\",\r\n\t\t\t\t\"_mcc\": \"401\",\r\n\t\t\t\t\"_mnc\": \"77\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tele2 MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1986\",\r\n\t\t\t\t\"_mcc\": \"401\",\r\n\t\t\t\t\"_mnc\": \"77\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.tele2.kz/mms/wapenc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.1.26.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"B-Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"564\",\r\n\t\t\t\t\"_mcc\": \"402\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TashiCell\",\r\n\t\t\t\t\"_carrier_id\": \"2165\",\r\n\t\t\t\t\"_mcc\": \"402\",\r\n\t\t\t\t\"_mnc\": \"77\",\r\n\t\t\t\t\"_apn\": \"ticlnet\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_proxy\": \"\",\r\n\t\t\t\t\"_port\": \"\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.239.221.47/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.7\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Net\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"smartnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"smartwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.11.12.180\",\r\n\t\t\t\t\"_mmsproxy\": \"10.11.12.13\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.11.12.13\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Postpaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"aircelwebpost\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Postpaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"aircelwappost\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Prepaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Prepaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"aircelweb\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel Internet (40417)\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.239.221.47/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.7\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Net\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"smartnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"smartwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Internet (40418)\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"22\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"22\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"22\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"24\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"24\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"24\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Postpaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"25\",\r\n\t\t\t\t\"_apn\": \"aircelwebpost\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Postpaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"25\",\r\n\t\t\t\t\"_apn\": \"aircelwappost\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Prepaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"25\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Prepaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"25\",\r\n\t\t\t\t\"_apn\": \"aircelweb\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel Internet (40425)\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"25\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"25\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"27\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"27\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"27\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Postpaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"28\",\r\n\t\t\t\t\"_apn\": \"aircelwebpost\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Postpaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"28\",\r\n\t\t\t\t\"_apn\": \"aircelwappost\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Prepaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"28\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Prepaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"28\",\r\n\t\t\t\t\"_apn\": \"aircelweb\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel Internet (40428)\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"28\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"28\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Postpaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"29\",\r\n\t\t\t\t\"_apn\": \"aircelwebpost\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Postpaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"29\",\r\n\t\t\t\t\"_apn\": \"myaircelpost\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Prepaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"29\",\r\n\t\t\t\t\"_apn\": \"myaircel\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Prepaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"29\",\r\n\t\t\t\t\"_apn\": \"aircelweb\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel Internet (40429)\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"29\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel WAP (40429)\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"29\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"29\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"31\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"31\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"31\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"31\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Postpaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"aircelwebpost\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Postpaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"myaircelpost\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Prepaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"myaircel\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Prepaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"aircelweb\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel Internet (40433)\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel WAP (40433)\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"34\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"34\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"34\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Postpaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"35\",\r\n\t\t\t\t\"_apn\": \"aircelwebpost\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Postpaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"35\",\r\n\t\t\t\t\"_apn\": \"aircelwappost\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Prepaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"35\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Prepaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"35\",\r\n\t\t\t\t\"_apn\": \"aircelweb\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel Internet (40435)\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"35\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"35\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"36\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.239.221.47/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.7\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Net\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"36\",\r\n\t\t\t\t\"_apn\": \"smartnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"36\",\r\n\t\t\t\t\"_apn\": \"smartwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Internet (40436)\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"36\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Postpaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"37\",\r\n\t\t\t\t\"_apn\": \"aircelwebpost\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Postpaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"37\",\r\n\t\t\t\t\"_apn\": \"aircelwappost\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Prepaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"37\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Prepaid\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"37\",\r\n\t\t\t\t\"_apn\": \"aircelweb\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel Internet (40437)\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"37\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"37\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"38\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"38\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"38\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"40\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"40\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"40\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"40\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Postpaid\",\r\n\t\t\t\t\"_carrier_id\": \"1550\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"41\",\r\n\t\t\t\t\"_apn\": \"aircelgprs.po\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Prepaid\",\r\n\t\t\t\t\"_carrier_id\": \"1550\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"41\",\r\n\t\t\t\t\"_apn\": \"aircelgprs.pr\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Postpaid\",\r\n\t\t\t\t\"_carrier_id\": \"1550\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"41\",\r\n\t\t\t\t\"_apn\": \"aircelwap.po\",\r\n\t\t\t\t\"_proxy\": \"192.168.35.201\",\r\n\t\t\t\t\"_port\": \"8081\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Prepaid\",\r\n\t\t\t\t\"_carrier_id\": \"1550\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"41\",\r\n\t\t\t\t\"_apn\": \"aircelwap.pr\",\r\n\t\t\t\t\"_proxy\": \"192.168.35.201\",\r\n\t\t\t\t\"_port\": \"8081\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel Internet (40441)\",\r\n\t\t\t\t\"_carrier_id\": \"1550\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"41\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel WAP (40441)\",\r\n\t\t\t\t\"_carrier_id\": \"1550\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"41\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS-Postpaid\",\r\n\t\t\t\t\"_carrier_id\": \"1550\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"41\",\r\n\t\t\t\t\"_apn\": \"aircelmms.po\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/mmrelay.app\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.35.196\",\r\n\t\t\t\t\"_mmsport\": \"8081\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS-Prepaid\",\r\n\t\t\t\t\"_carrier_id\": \"1550\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"41\",\r\n\t\t\t\t\"_apn\": \"aircelmms.pr\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/mmrelay.app\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.35.196\",\r\n\t\t\t\t\"_mmsport\": \"8081\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel MMS (40441)\",\r\n\t\t\t\t\"_carrier_id\": \"1550\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"41\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://172.17.83.67/servlets/mms\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Postpaid\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"42\",\r\n\t\t\t\t\"_apn\": \"aircelgprs.po\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Prepaid\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"42\",\r\n\t\t\t\t\"_apn\": \"aircelgprs.pr\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Postpaid\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"42\",\r\n\t\t\t\t\"_apn\": \"aircelwap.po\",\r\n\t\t\t\t\"_proxy\": \"192.168.35.201\",\r\n\t\t\t\t\"_port\": \"8081\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Prepaid\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"42\",\r\n\t\t\t\t\"_apn\": \"aircelwap.pr\",\r\n\t\t\t\t\"_proxy\": \"192.168.35.201\",\r\n\t\t\t\t\"_port\": \"8081\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel Internet (40442)\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"42\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS-Postpaid\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"42\",\r\n\t\t\t\t\"_apn\": \"aircelmms.po\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/mmrelay.app\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.35.196\",\r\n\t\t\t\t\"_mmsport\": \"8081\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS-Prepaid\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"42\",\r\n\t\t\t\t\"_apn\": \"aircelmms.pr\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/mmrelay.app\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.35.196\",\r\n\t\t\t\t\"_mmsport\": \"8081\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"43\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"43\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"43\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"44\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"44\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"44\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"45\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"45\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"45\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"45\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"46\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"46\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"46\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"49\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"49\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"49\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"49\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"50\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.239.221.47/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.7\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Net\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"50\",\r\n\t\t\t\t\"_apn\": \"smartnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"50\",\r\n\t\t\t\t\"_apn\": \"smartwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"51\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"51\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"51\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"52\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.239.221.47/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.7\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Net\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"52\",\r\n\t\t\t\t\"_apn\": \"smartnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"52\",\r\n\t\t\t\t\"_apn\": \"smartwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"53\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"53\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"53\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"54\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"54\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"54\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"55\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"55\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"55\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"56\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"56\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"56\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"57\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"57\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"57\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"58\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"58\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"58\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"59\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"59\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"59\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"60\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"60\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"60\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"62\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"62\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"62\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"64\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"64\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"64\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"66\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"66\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"66\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"67\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.239.221.47/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.7\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Net\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"67\",\r\n\t\t\t\t\"_apn\": \"smartnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"67\",\r\n\t\t\t\t\"_apn\": \"smartwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTNL\",\r\n\t\t\t\t\"_carrier_id\": \"1556\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"68\",\r\n\t\t\t\t\"_apn\": \"mtnl.net\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_user\": \"mtnl\",\r\n\t\t\t\t\"_password\": \"mtnl123\",\r\n\t\t\t\t\"_mmsc\": \"http://mtnlmms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.10.10\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,fota,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTNL\",\r\n\t\t\t\t\"_carrier_id\": \"1556\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"69\",\r\n\t\t\t\t\"_apn\": \"mtnl.net\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_user\": \"mtnl\",\r\n\t\t\t\t\"_password\": \"mtnl123\",\r\n\t\t\t\t\"_mmsc\": \"http://mtnlmms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.10.10\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,fota,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1557\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"70\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1557\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"70\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1557\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"70\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1557\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"70\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"71\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"71\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"71\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"72\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"72\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"72\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"73\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"73\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"73\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"74\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"74\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"74\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"75\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"75\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"75\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"76\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"76\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"76\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"77\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"77\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"77\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"78\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"78\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"78\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"79\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"79\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"79\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"80\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"80\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"80\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlmms\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"81\",\r\n\t\t\t\t\"_apn\": \"bsnlmms\",\r\n\t\t\t\t\"_mmsc\": \"http://bsnlmmsc.in:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.210.10.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnlnet\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"81\",\r\n\t\t\t\t\"_apn\": \"bsnlnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"bsnllive\",\r\n\t\t\t\t\"_carrier_id\": \"1549\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"81\",\r\n\t\t\t\t\"_apn\": \"bsnllive\",\r\n\t\t\t\t\"_proxy\": \"10.220.67.131\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"82\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"82\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"82\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1559\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"83\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.239.221.47/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.7\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Net\",\r\n\t\t\t\t\"_carrier_id\": \"1559\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"83\",\r\n\t\t\t\t\"_apn\": \"smartnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1559\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"83\",\r\n\t\t\t\t\"_apn\": \"smartwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"84\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"84\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"84\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"85\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.239.221.47/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.7\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Net\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"85\",\r\n\t\t\t\t\"_apn\": \"smartnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"85\",\r\n\t\t\t\t\"_apn\": \"smartwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"86\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"86\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"86\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"87\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"87\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"87\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"88\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"88\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"88\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"89\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"89\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"89\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"90\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"90\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"90\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"90\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Postpaid\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"91\",\r\n\t\t\t\t\"_apn\": \"aircelwebpost\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Postpaid\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"91\",\r\n\t\t\t\t\"_apn\": \"aircelwappost\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet-Prepaid\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"91\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS-Prepaid\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"91\",\r\n\t\t\t\t\"_apn\": \"aircelweb\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"91\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"92\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"92\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"92\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"92\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"93\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"93\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"93\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"93\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"94\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"94\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"94\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"94\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"95\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"95\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"95\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"95\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"96\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"96\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"96\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"96\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"97\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"97\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"97\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"97\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"98\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"98\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"98\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"404\",\r\n\t\t\t\t\"_mnc\": \"98\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"21\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"21\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"21\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"22\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"22\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"22\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"23\",\r\n\t\t\t\t\"_apn\": \"rcommms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.rcom.co.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Netconnect\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"23\",\r\n\t\t\t\t\"_apn\": \"rcomnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RelianceMbWorld\",\r\n\t\t\t\t\"_carrier_id\": \"1543\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"23\",\r\n\t\t\t\t\"_apn\": \"rcomwap\",\r\n\t\t\t\t\"_proxy\": \"10.239.221.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"025\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"025\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"025\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"026\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"026\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"026\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"027\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"027\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"027\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"028\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"028\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"028\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"029\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"029\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"029\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"030\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"030\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"030\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"031\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"031\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"031\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"032\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"032\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"032\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"033\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"033\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"033\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"034\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"034\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"034\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"035\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"035\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"035\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"036\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"036\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"036\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"037\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"037\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"037\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"038\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"038\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"038\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"039\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"039\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"039\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"041\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"041\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"041\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"042\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"042\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"042\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"043\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"043\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"043\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"044\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"044\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"044\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"045\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"045\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"045\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"046\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"046\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"046\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"047\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.INTERNET\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO DIVE-IN\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"047\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.DIVE.IN\",\r\n\t\t\t\t\"_proxy\": \"10.124.94.7\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TATA DOCOMO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1982\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"047\",\r\n\t\t\t\t\"_apn\": \"TATA.DOCOMO.MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.124.26.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"51\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"51\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"51\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"51\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"52\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"52\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"52\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"52\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"53\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"53\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"53\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"53\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"54\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"54\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"54\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"54\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"55\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"55\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"55\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"55\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobile Office\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"56\",\r\n\t\t\t\t\"_apn\": \"airtelgprs.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIRTEL LIVE\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"56\",\r\n\t\t\t\t\"_apn\": \"airtelfun.com\",\r\n\t\t\t\t\"_proxy\": \"100.1.200.99\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"56\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1961\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"56\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"66\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"66\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"66\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"67\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"67\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"67\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"70\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"70\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"70\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"750\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"750\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"750\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"751\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"751\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"751\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"752\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"752\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"752\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"753\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"753\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"753\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"754\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"754\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"754\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"755\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"755\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"755\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"756\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms1.live.vodafone.in/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_mmsport\": \"9401\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafonemobileconnect\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"756\",\r\n\t\t\t\t\"_apn\": \"www\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live\",\r\n\t\t\t\t\"_carrier_id\": \"2378\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"756\",\r\n\t\t\t\t\"_apn\": \"portalnmms\",\r\n\t\t\t\t\"_proxy\": \"10.10.1.100\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"799\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"799\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"799\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"800\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"800\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"800\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"801\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"801\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"192.168.35.201\",\r\n\t\t\t\t\"_port\": \"8081\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"801\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/mmrelay.app\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.35.196\",\r\n\t\t\t\t\"_mmsport\": \"8081\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"802\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"802\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"802\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"803\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"803\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"192.168.35.201\",\r\n\t\t\t\t\"_port\": \"8081\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"803\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/mmrelay.app\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.35.196\",\r\n\t\t\t\t\"_mmsport\": \"8081\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"804\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"804\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"804\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"805\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"805\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"805\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"806\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"806\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"806\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"807\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"807\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"807\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"808\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"808\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"808\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"809\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"809\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"192.168.35.201\",\r\n\t\t\t\t\"_port\": \"8081\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"809\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/mmrelay.app\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.35.196\",\r\n\t\t\t\t\"_mmsport\": \"8081\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"810\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"810\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"810\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"811\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"811\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"811\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"812\",\r\n\t\t\t\t\"_apn\": \"aircelgprs\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pocket Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"812\",\r\n\t\t\t\t\"_apn\": \"aircelwap\",\r\n\t\t\t\t\"_proxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Aircel-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1551\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"812\",\r\n\t\t\t\t\"_apn\": \"aircelmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.50.1.166/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.83.69\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"813\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"813\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"813\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"814\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"814\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"814\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"815\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"815\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"815\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"816\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"816\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"816\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"817\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"817\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"817\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"818\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"818\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"818\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"819\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"819\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"819\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"820\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"820\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"820\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"821\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"821\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"821\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"822\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"822\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"822\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"823\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"823\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"824\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"824\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"825\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"825\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"826\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"826\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"827\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"827\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"828\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"828\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"829\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"829\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"830\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"830\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"831\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"831\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"832\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"832\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"833\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"833\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"834\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"834\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"835\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"835\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"836\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"836\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"837\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"837\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"838\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"838\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"839\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"839\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"840\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"840\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"841\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"841\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"842\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"842\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"843\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"843\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"844\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"844\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"844\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"845\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"845\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"845\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"846\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"846\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"846\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"847\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"847\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"847\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"848\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"848\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"848\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"849\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"849\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"849\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"850\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"850\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"850\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"851\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"851\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"851\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"852\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"852\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"852\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Idea_Internet\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"853\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"853\",\r\n\t\t\t\t\"_apn\": \"imis\",\r\n\t\t\t\t\"_proxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"853\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"854\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"854\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"855\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"855\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"856\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"856\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"857\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"857\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"858\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"858\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"859\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"859\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"860\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"860\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"861\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"861\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"862\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"862\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"863\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"863\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"864\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"864\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"865\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"865\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"866\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"866\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"867\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"867\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"868\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"868\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"869\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"869\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"870\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"870\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"871\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"871\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"872\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"872\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"873\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"873\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"874\",\r\n\t\t\t\t\"_apn\": \"jionet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Reliance Jio IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2018\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"874\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"875\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"875\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"875\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"876\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"876\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"876\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"877\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"877\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"877\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"878\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"878\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"878\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"879\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"879\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"879\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"880\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"880\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"880\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"STEL\",\r\n\t\t\t\t\"_carrier_id\": \"2265\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"881\",\r\n\t\t\t\t\"_apn\": \"gprs.stel.in\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"STEL\",\r\n\t\t\t\t\"_carrier_id\": \"2265\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"882\",\r\n\t\t\t\t\"_apn\": \"gprs.stel.in\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"STEL\",\r\n\t\t\t\t\"_carrier_id\": \"2265\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"883\",\r\n\t\t\t\t\"_apn\": \"gprs.stel.in\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"STEL\",\r\n\t\t\t\t\"_carrier_id\": \"2265\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"884\",\r\n\t\t\t\t\"_apn\": \"gprs.stel.in\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"STEL\",\r\n\t\t\t\t\"_carrier_id\": \"2265\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"885\",\r\n\t\t\t\t\"_apn\": \"gprs.stel.in\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"STEL\",\r\n\t\t\t\t\"_carrier_id\": \"2265\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"886\",\r\n\t\t\t\t\"_apn\": \"gprs.stel.in\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"908\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"908\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"909\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"909\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"910\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"910\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"911\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IDEA MMS\",\r\n\t\t\t\t\"_carrier_id\": \"802\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"911\",\r\n\t\t\t\t\"_apn\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.42.21:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.42.15\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cheers\",\r\n\t\t\t\t\"_carrier_id\": \"2266\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"912\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cheers\",\r\n\t\t\t\t\"_carrier_id\": \"2266\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"913\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cheers\",\r\n\t\t\t\t\"_carrier_id\": \"2266\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"914\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cheers\",\r\n\t\t\t\t\"_carrier_id\": \"2266\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"915\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cheers\",\r\n\t\t\t\t\"_carrier_id\": \"2266\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"916\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cheers\",\r\n\t\t\t\t\"_carrier_id\": \"2266\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"917\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cheers\",\r\n\t\t\t\t\"_carrier_id\": \"2266\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"918\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cheers\",\r\n\t\t\t\t\"_carrier_id\": \"2266\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"919\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cheers\",\r\n\t\t\t\t\"_carrier_id\": \"2266\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"920\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cheers\",\r\n\t\t\t\t\"_carrier_id\": \"2266\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"921\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cheers\",\r\n\t\t\t\t\"_carrier_id\": \"2266\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"922\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cheers\",\r\n\t\t\t\t\"_carrier_id\": \"2266\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"923\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cheers\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"924\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"925\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"925\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"925\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"926\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"926\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"926\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"927\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"927\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"927\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"928\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"928\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"928\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"929\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor Wap\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"929\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_proxy\": \"10.58.10.58\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Uninor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2002\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"929\",\r\n\t\t\t\t\"_apn\": \"uninor\",\r\n\t\t\t\t\"_mmsc\": \"http://10.58.2.120\",\r\n\t\t\t\t\"_mmsproxy\": \"10.58.10.59\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cheers\",\r\n\t\t\t\t\"_carrier_id\": \"2266\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"930\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cheers\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"931\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"932\",\r\n\t\t\t\t\"_apn\": \"vgprs.com\",\r\n\t\t\t\t\"_mmsc\": \"http://10.202.4.119:10021/mmsc/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.5.145\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Videocon\",\r\n\t\t\t\t\"_carrier_id\": \"2264\",\r\n\t\t\t\t\"_mcc\": \"405\",\r\n\t\t\t\t\"_mnc\": \"932\",\r\n\t\t\t\t\"_apn\": \"vinternet.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobilink WAP GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1656\",\r\n\t\t\t\t\"_mcc\": \"410\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"connect.mobilinkworld.com\",\r\n\t\t\t\t\"_user\": \"Mobilink\",\r\n\t\t\t\t\"_password\": \"Mobilink\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobilink MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1656\",\r\n\t\t\t\t\"_mcc\": \"410\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.mobilinkworld.com\",\r\n\t\t\t\t\"_user\": \"Mobilink\",\r\n\t\t\t\t\"_password\": \"Mobilink\",\r\n\t\t\t\t\"_mmsc\": \"http://mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"172.25.20.12\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ufone WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1657\",\r\n\t\t\t\t\"_mcc\": \"410\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"Ufone.internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ufone MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1657\",\r\n\t\t\t\t\"_mcc\": \"410\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"Ufone.mms\",\r\n\t\t\t\t\"_mmsc\": \"http://www.ufonemms.com:80/\",\r\n\t\t\t\t\"_mmsproxy\": \"172.16.13.27\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ZONG WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1980\",\r\n\t\t\t\t\"_mcc\": \"410\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"zonginternet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ZONG MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1980\",\r\n\t\t\t\t\"_mcc\": \"410\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"zongmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.81.6.11:8080\",\r\n\t\t\t\t\"_mmsproxy\": \"10.81.6.33\",\r\n\t\t\t\t\"_mmsport\": \"8000\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1975\",\r\n\t\t\t\t\"_mcc\": \"410\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1975\",\r\n\t\t\t\t\"_mcc\": \"410\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"Telenor\",\r\n\t\t\t\t\"_password\": \"Telenor\",\r\n\t\t\t\t\"_mmsc\": \"http://mmstelenor\",\r\n\t\t\t\t\"_mmsproxy\": \"172.18.19.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Warid WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1656\",\r\n\t\t\t\t\"_mcc\": \"410\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"Wap.warid\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Warid MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1656\",\r\n\t\t\t\t\"_mcc\": \"410\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"mms.warid\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.0.132/servlets/MMS\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.2.1\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AWCC\",\r\n\t\t\t\t\"_carrier_id\": \"452\",\r\n\t\t\t\t\"_mcc\": \"412\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Roshan\",\r\n\t\t\t\t\"_carrier_id\": \"453\",\r\n\t\t\t\t\"_mcc\": \"412\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN\",\r\n\t\t\t\t\"_carrier_id\": \"455\",\r\n\t\t\t\t\"_mcc\": \"412\",\r\n\t\t\t\t\"_mnc\": \"40\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Etisalat\",\r\n\t\t\t\t\"_carrier_id\": \"2221\",\r\n\t\t\t\t\"_mcc\": \"412\",\r\n\t\t\t\t\"_mnc\": \"50\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobitel\",\r\n\t\t\t\t\"_carrier_id\": \"1931\",\r\n\t\t\t\t\"_mcc\": \"413\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dialog\",\r\n\t\t\t\t\"_carrier_id\": \"1599\",\r\n\t\t\t\t\"_mcc\": \"413\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Etisalat\",\r\n\t\t\t\t\"_carrier_id\": \"1600\",\r\n\t\t\t\t\"_mcc\": \"413\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel\",\r\n\t\t\t\t\"_carrier_id\": \"1932\",\r\n\t\t\t\t\"_mcc\": \"413\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hutch\",\r\n\t\t\t\t\"_carrier_id\": \"1933\",\r\n\t\t\t\t\"_mcc\": \"413\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MPT\",\r\n\t\t\t\t\"_carrier_id\": \"1611\",\r\n\t\t\t\t\"_mcc\": \"414\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mptnet\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ooredoo Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1996\",\r\n\t\t\t\t\"_mcc\": \"414\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"Internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telenor INTERNET\",\r\n\t\t\t\t\"_mcc\": \"414\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Alfa Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1920\",\r\n\t\t\t\t\"_mcc\": \"415\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_user\": \"mic1\",\r\n\t\t\t\t\"_password\": \"mic1\",\r\n\t\t\t\t\"_apn\": \"internet.mic1.com.lb\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Alfawap\",\r\n\t\t\t\t\"_carrier_id\": \"1920\",\r\n\t\t\t\t\"_mcc\": \"415\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"wap.mic1.com.lb\",\r\n\t\t\t\t\"_user\": \"mic1\",\r\n\t\t\t\t\"_password\": \"mic1\",\r\n\t\t\t\t\"_proxy\": \"192.168.23.50\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Alfa MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1920\",\r\n\t\t\t\t\"_mcc\": \"415\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_user\": \"mic1\",\r\n\t\t\t\t\"_password\": \"mic1\",\r\n\t\t\t\t\"_apn\": \"mms.mic1.com.lb\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mic1.com.lb\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.23.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"touch\",\r\n\t\t\t\t\"_carrier_id\": \"1921\",\r\n\t\t\t\t\"_mcc\": \"415\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"touch\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"touch_WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1921\",\r\n\t\t\t\t\"_mcc\": \"415\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_proxy\": \"192.168.4.11\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"touch_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1921\",\r\n\t\t\t\t\"_mcc\": \"415\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_user\": \"touch\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms:8088/mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.4.103\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Zain JO Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1578\",\r\n\t\t\t\t\"_mcc\": \"416\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"zain\",\r\n\t\t\t\t\"_user\": \"zain\",\r\n\t\t\t\t\"_password\": \"zain\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Zain JO WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1578\",\r\n\t\t\t\t\"_mcc\": \"416\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"zain\",\r\n\t\t\t\t\"_user\": \"zain\",\r\n\t\t\t\t\"_password\": \"zain\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_proxy\": \"192.168.55.10\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Zain JO Streaming\",\r\n\t\t\t\t\"_carrier_id\": \"1578\",\r\n\t\t\t\t\"_mcc\": \"416\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"Zain\",\r\n\t\t\t\t\"_user\": \"zain\",\r\n\t\t\t\t\"_password\": \"zain\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Zain JO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1578\",\r\n\t\t\t\t\"_mcc\": \"416\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"zain\",\r\n\t\t\t\t\"_user\": \"zain\",\r\n\t\t\t\t\"_password\": \"zain\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.jo.zain.com\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.55.10\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Umniah internet\",\r\n\t\t\t\t\"_carrier_id\": \"1580\",\r\n\t\t\t\t\"_mcc\": \"416\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"net\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Umniah WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1580\",\r\n\t\t\t\t\"_mcc\": \"416\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_proxy\": \"10.1.1.10\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Umniah MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1580\",\r\n\t\t\t\t\"_mcc\": \"416\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.umniah.com/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.1.1.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange MMS\",\r\n\t\t\t\t\"_carrier_id\": \"849\",\r\n\t\t\t\t\"_mcc\": \"416\",\r\n\t\t\t\t\"_mnc\": \"77\",\r\n\t\t\t\t\"_apn\": \"mms.orange.jo\",\r\n\t\t\t\t\"_user\": \"mmc\",\r\n\t\t\t\t\"_password\": \"mmc\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://172.16.1.96/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.16.1.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Internet\",\r\n\t\t\t\t\"_carrier_id\": \"849\",\r\n\t\t\t\t\"_mcc\": \"416\",\r\n\t\t\t\t\"_mnc\": \"77\",\r\n\t\t\t\t\"_apn\": \"net.orange.jo\",\r\n\t\t\t\t\"_user\": \"net\",\r\n\t\t\t\t\"_password\": \"net\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange WAP\",\r\n\t\t\t\t\"_carrier_id\": \"849\",\r\n\t\t\t\t\"_mcc\": \"416\",\r\n\t\t\t\t\"_mnc\": \"77\",\r\n\t\t\t\t\"_apn\": \"wap.orange.jo\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_proxy\": \"172.16.1.2\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Syriatel Net\",\r\n\t\t\t\t\"_carrier_id\": \"1088\",\r\n\t\t\t\t\"_mcc\": \"417\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"net.syriatel.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Syriatel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1088\",\r\n\t\t\t\t\"_mcc\": \"417\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.syriatel.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mymms.syriatel.com/\",\r\n\t\t\t\t\"_mmsproxy\": \"172.20.5.6\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1089\",\r\n\t\t\t\t\"_mcc\": \"417\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1089\",\r\n\t\t\t\t\"_mcc\": \"417\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.110.0.134\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Rcell IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2646\",\r\n\t\t\t\t\"_mcc\": \"417\",\r\n\t\t\t\t\"_mnc\": \"50\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Rcell Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2646\",\r\n\t\t\t\t\"_mcc\": \"417\",\r\n\t\t\t\t\"_mnc\": \"50\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Asiacell Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1969\",\r\n\t\t\t\t\"_mcc\": \"418\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"net.asiacell.com\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1969\",\r\n\t\t\t\t\"_mcc\": \"418\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"wap.asiacell.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mvas.asiacell.com/uportal\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.107.50\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SanaTel\",\r\n\t\t\t\t\"_carrier_id\": \"2166\",\r\n\t\t\t\t\"_mcc\": \"418\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ZAIN-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1971\",\r\n\t\t\t\t\"_mcc\": \"418\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"atheer\",\r\n\t\t\t\t\"_password\": \"atheer\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Zain-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1971\",\r\n\t\t\t\t\"_mcc\": \"418\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"MMS\",\r\n\t\t\t\t\"_user\": \"atheer\",\r\n\t\t\t\t\"_password\": \"atheer\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"172.29.11.12\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ZAIN-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1971\",\r\n\t\t\t\t\"_mcc\": \"418\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"atheer\",\r\n\t\t\t\t\"_password\": \"atheer\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Zain-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1971\",\r\n\t\t\t\t\"_mcc\": \"418\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"MMS\",\r\n\t\t\t\t\"_user\": \"atheer\",\r\n\t\t\t\t\"_password\": \"atheer\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"172.29.11.12\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Korek 9595\",\r\n\t\t\t\t\"_carrier_id\": \"1983\",\r\n\t\t\t\t\"_mcc\": \"418\",\r\n\t\t\t\t\"_mnc\": \"40\",\r\n\t\t\t\t\"_apn\": \"internet.korek.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Korek 9191\",\r\n\t\t\t\t\"_carrier_id\": \"1983\",\r\n\t\t\t\t\"_mcc\": \"418\",\r\n\t\t\t\t\"_mnc\": \"40\",\r\n\t\t\t\t\"_apn\": \"net.korek.com\",\r\n\t\t\t\t\"_user\": \"korek\",\r\n\t\t\t\t\"_password\": \"korek\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Korek 9494\",\r\n\t\t\t\t\"_carrier_id\": \"1983\",\r\n\t\t\t\t\"_mcc\": \"418\",\r\n\t\t\t\t\"_mnc\": \"40\",\r\n\t\t\t\t\"_apn\": \"internet.korek.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"KOREK MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1983\",\r\n\t\t\t\t\"_mcc\": \"418\",\r\n\t\t\t\t\"_mnc\": \"40\",\r\n\t\t\t\t\"_apn\": \"mms.korek.com\",\r\n\t\t\t\t\"_user\": \"korek\",\r\n\t\t\t\t\"_password\": \"korek\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.korektel.com/mms/wapenc\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.18.187\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobitel\",\r\n\t\t\t\t\"_carrier_id\": \"2345\",\r\n\t\t\t\t\"_mcc\": \"418\",\r\n\t\t\t\t\"_mnc\": \"45\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Itisaluna\",\r\n\t\t\t\t\"_carrier_id\": \"2234\",\r\n\t\t\t\t\"_mcc\": \"418\",\r\n\t\t\t\t\"_mnc\": \"62\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Omnnea\",\r\n\t\t\t\t\"_carrier_id\": \"2167\",\r\n\t\t\t\t\"_mcc\": \"418\",\r\n\t\t\t\t\"_mnc\": \"92\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MI\",\r\n\t\t\t\t\"_carrier_id\": \"1585\",\r\n\t\t\t\t\"_mcc\": \"419\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"pps\",\r\n\t\t\t\t\"_user\": \"pps\",\r\n\t\t\t\t\"_password\": \"pps\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Zain WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1585\",\r\n\t\t\t\t\"_mcc\": \"419\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"pps\",\r\n\t\t\t\t\"_user\": \"pps\",\r\n\t\t\t\t\"_password\": \"pps\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_proxy\": \"10.43.4.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1585\",\r\n\t\t\t\t\"_mcc\": \"419\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"pps\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.zain\",\r\n\t\t\t\t\"_mmsproxy\": \"176.0.0.65\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ooredoo Action\",\r\n\t\t\t\t\"_carrier_id\": \"1586\",\r\n\t\t\t\t\"_mcc\": \"419\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"action.ooredoo.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ooredoo MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1586\",\r\n\t\t\t\t\"_mcc\": \"419\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms.ooredoo.com\",\r\n\t\t\t\t\"_mmsc\": \"http://action.ooredoo.com\",\r\n\t\t\t\t\"_mmsproxy\": \"194.126.53.64\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VIVA - KW\",\r\n\t\t\t\t\"_carrier_id\": \"1992\",\r\n\t\t\t\t\"_mcc\": \"419\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"viva\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsc\": \"http://172.16.128.80:38090/was\",\r\n\t\t\t\t\"_mmsproxy\": \"172.16.128.228\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"STC LTE\",\r\n\t\t\t\t\"_carrier_id\": \"1683\",\r\n\t\t\t\t\"_mcc\": \"420\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"STC Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1683\",\r\n\t\t\t\t\"_mcc\": \"420\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"jawalnet.com.sa\",\r\n\t\t\t\t\"_type\": \"default,supl,xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"STC\",\r\n\t\t\t\t\"_carrier_id\": \"1683\",\r\n\t\t\t\t\"_mcc\": \"420\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"STC MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1683\",\r\n\t\t\t\t\"_mcc\": \"420\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.net.sa\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.net.sa:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.1.1.1\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobily WEB\",\r\n\t\t\t\t\"_carrier_id\": \"1684\",\r\n\t\t\t\t\"_mcc\": \"420\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"web1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobily WEB 2\",\r\n\t\t\t\t\"_carrier_id\": \"1684\",\r\n\t\t\t\t\"_mcc\": \"420\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"web2\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobily MMS Postpaid\",\r\n\t\t\t\t\"_carrier_id\": \"1684\",\r\n\t\t\t\t\"_mcc\": \"420\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms1\",\r\n\t\t\t\t\"_mmsc\": \"http://10.3.3.133:9090/was\",\r\n\t\t\t\t\"_mmsproxy\": \"10.3.2.133\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobily MMS Prepaid\",\r\n\t\t\t\t\"_carrier_id\": \"1684\",\r\n\t\t\t\t\"_mcc\": \"420\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms2\",\r\n\t\t\t\t\"_mmsc\": \"http://10.3.3.133:9090/was\",\r\n\t\t\t\t\"_mmsproxy\": \"10.3.2.133\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Zain Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1972\",\r\n\t\t\t\t\"_mcc\": \"420\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"zain\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"zain-mms\",\r\n\t\t\t\t\"_carrier_id\": \"1972\",\r\n\t\t\t\t\"_mcc\": \"420\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"zainmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.122.200.12:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"10.122.200.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SabaFon\",\r\n\t\t\t\t\"_carrier_id\": \"1877\",\r\n\t\t\t\t\"_mcc\": \"421\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sabafon MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1877\",\r\n\t\t\t\t\"_mcc\": \"421\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.30.174\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.sabafon.com/\",\r\n\t\t\t\t\"_mmsport\": \"8080\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN\",\r\n\t\t\t\t\"_carrier_id\": \"1878\",\r\n\t\t\t\t\"_mcc\": \"421\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN MMS YE\",\r\n\t\t\t\t\"_carrier_id\": \"1878\",\r\n\t\t\t\t\"_mcc\": \"421\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"fast-mms\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.97.1\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.97.1/mmsc\",\r\n\t\t\t\t\"_mmsport\": \"3130\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HiTS-UNITEL\",\r\n\t\t\t\t\"_carrier_id\": \"2168\",\r\n\t\t\t\t\"_mcc\": \"421\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"YemenMobile\",\r\n\t\t\t\t\"_carrier_id\": \"2349\",\r\n\t\t\t\t\"_mcc\": \"421\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"ymdata\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,cbs,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"YemenMobile\",\r\n\t\t\t\t\"_carrier_id\": \"2349\",\r\n\t\t\t\t\"_mcc\": \"421\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Oman Mobile MMS\",\r\n\t\t\t\t\"_carrier_id\": \"970\",\r\n\t\t\t\t\"_mcc\": \"422\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.omanmobile.om:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.203.35\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Oman Mobile Internet\",\r\n\t\t\t\t\"_carrier_id\": \"970\",\r\n\t\t\t\t\"_mcc\": \"422\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"taif\",\r\n\t\t\t\t\"_user\": \"taif\",\r\n\t\t\t\t\"_password\": \"taif\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nawras MMS\",\r\n\t\t\t\t\"_carrier_id\": \"971\",\r\n\t\t\t\t\"_mcc\": \"422\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms.nawras.com.om\",\r\n\t\t\t\t\"_user\": \"test\",\r\n\t\t\t\t\"_password\": \"test\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://10.128.240.16/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.128.240.19\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nawras Internet\",\r\n\t\t\t\t\"_carrier_id\": \"971\",\r\n\t\t\t\t\"_mcc\": \"422\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"isp.nawras.com.om\",\r\n\t\t\t\t\"_user\": \"test\",\r\n\t\t\t\t\"_password\": \"test\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Etisalat Data Package\",\r\n\t\t\t\t\"_carrier_id\": \"451\",\r\n\t\t\t\t\"_mcc\": \"424\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"etisalat.ae\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.12.0.32\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Etisalat IMS\",\r\n\t\t\t\t\"_carrier_id\": \"451\",\r\n\t\t\t\t\"_mcc\": \"424\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Etisalat Ut\",\r\n\t\t\t\t\"_carrier_id\": \"451\",\r\n\t\t\t\t\"_mcc\": \"424\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ut\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"du LTE\",\r\n\t\t\t\t\"_carrier_id\": \"1970\",\r\n\t\t\t\t\"_mcc\": \"424\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"du Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1970\",\r\n\t\t\t\t\"_mcc\": \"424\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"du\",\r\n\t\t\t\t\"_type\": \"default,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"du IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1970\",\r\n\t\t\t\t\"_mcc\": \"424\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"du MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1970\",\r\n\t\t\t\t\"_mcc\": \"424\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"du\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.du.ae:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"10.164.208.4\",\r\n\t\t\t\t\"_mmsport\": \"8002\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3G Portal\",\r\n\t\t\t\t\"_carrier_id\": \"796\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"uwap.orange.co.il\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.220.15/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"192.118.11.55\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cellcom Internet\",\r\n\t\t\t\t\"_carrier_id\": \"797\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"sphone\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cellcom MMS\",\r\n\t\t\t\t\"_carrier_id\": \"797\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.cellcom.co.il\",\r\n\t\t\t\t\"_mmsproxy\": \"vwapm2.ain.co.il\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Multimedia Pelephone\",\r\n\t\t\t\t\"_carrier_id\": \"798\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms.pelephone.net.il\",\r\n\t\t\t\t\"_user\": \"pcl@3g\",\r\n\t\t\t\t\"_password\": \"pcl\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsu.pelephone.net.il\",\r\n\t\t\t\t\"_mmsproxy\": \"10.170.252.104\",\r\n\t\t\t\t\"_mmsport\": \"9093\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sphone Pelephone\",\r\n\t\t\t\t\"_carrier_id\": \"798\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"sphone.pelephone.net.il\",\r\n\t\t\t\t\"_user\": \"pcl@3g\",\r\n\t\t\t\t\"_password\": \"pcl\",\r\n\t\t\t\t\"_authtype\": \"2\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Jawwal internet\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Jawwal MMS\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.jawwal.ps/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"213.244.118.129\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_proxy\": \"10.100.129.111\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Wataniya_mms\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.wataniya.ps/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.100.129.111\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet HOT mobile\",\r\n\t\t\t\t\"_carrier_id\": \"1991\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"net.hotm\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"PC HOT mobile\",\r\n\t\t\t\t\"_carrier_id\": \"1991\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"pc.hotm\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_authtype\": \"0\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS HOT mobile\",\r\n\t\t\t\t\"_carrier_id\": \"1991\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"mms.hotm\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.hotmobile.co.il\",\r\n\t\t\t\t\"_mmsproxy\": \"80.246.131.99\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"GolanTelecom Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1990\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"internet.golantelecom.net.il\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"GolanTelecom MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1990\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"mms.golantelecom.net.il\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.golantelecom.co.il\",\r\n\t\t\t\t\"_mmsproxy\": \"10.224.228.81\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"we\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"we\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3G Portal\",\r\n\t\t\t\t\"_carrier_id\": \"796\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"uwap.orange.co.il\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.220.15/servlets/mms\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"YouPhone\",\r\n\t\t\t\t\"_carrier_id\": \"2169\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"data.youphone.co.il\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.220.15/servlets/mms\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Home Cellular Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2170\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"hcminternet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Home Cellular MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2170\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"hcmMMS\",\r\n\t\t\t\t\"_mmsc\": \"http://82.166.164.229:9000/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"82.166.164.229\",\r\n\t\t\t\t\"_mmsport\": \"8898\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Rami Levi 3G\",\r\n\t\t\t\t\"_carrier_id\": \"2171\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"internet.rl\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Rami Levi Multimedia\",\r\n\t\t\t\t\"_carrier_id\": \"2171\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"mms.pelephone.net.il\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsu.pelephone.net.il\",\r\n\t\t\t\t\"_mmsproxy\": \"10.170.252.104\",\r\n\t\t\t\t\"_mmsport\": \"9093\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"019\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"019\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Annatel\",\r\n\t\t\t\t\"_carrier_id\": \"2454\",\r\n\t\t\t\t\"_mcc\": \"425\",\r\n\t\t\t\t\"_mnc\": \"26\",\r\n\t\t\t\t\"_apn\": \"annatel\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Batelco Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1372\",\r\n\t\t\t\t\"_mcc\": \"426\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.batelco.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Batelco WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1372\",\r\n\t\t\t\t\"_mcc\": \"426\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"wap.batelco.com\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_proxy\": \"192.168.1.2\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Batelco MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1372\",\r\n\t\t\t\t\"_mcc\": \"426\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.batelco.com\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.36.10/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.1.2\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Zain BH Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2014\",\r\n\t\t\t\t\"_mcc\": \"426\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"internet\",\r\n\t\t\t\t\"_password\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Zain BH WAP\",\r\n\t\t\t\t\"_carrier_id\": \"2014\",\r\n\t\t\t\t\"_mcc\": \"426\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_proxy\": \"172.18.85.33\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Zain BH MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2014\",\r\n\t\t\t\t\"_mcc\": \"426\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsc\": \"http://172.18.83.129:80/\",\r\n\t\t\t\t\"_mmsproxy\": \"172.18.85.34\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VIVAGPRS\",\r\n\t\t\t\t\"_carrier_id\": \"2015\",\r\n\t\t\t\t\"_mcc\": \"426\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"viva.bh\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VIVAWAP\",\r\n\t\t\t\t\"_carrier_id\": \"2015\",\r\n\t\t\t\t\"_mcc\": \"426\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"vivawap.bh\",\r\n\t\t\t\t\"_proxy\": \"172.18.142.36\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VIVAMMS\",\r\n\t\t\t\t\"_carrier_id\": \"2015\",\r\n\t\t\t\t\"_mcc\": \"426\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"vivawap.bh\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.viva.com.bh:38090\",\r\n\t\t\t\t\"_mmsproxy\": \"172.18.142.36\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1675\",\r\n\t\t\t\t\"_mcc\": \"427\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"data\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_authtype\": \"1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1675\",\r\n\t\t\t\t\"_mcc\": \"427\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"data\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsr.ooredoomms.qa\",\r\n\t\t\t\t\"_mmsproxy\": \"10.23.8.3\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Voda internet\",\r\n\t\t\t\t\"_carrier_id\": \"2393\",\r\n\t\t\t\t\"_mcc\": \"427\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.vodafone.com.qa\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VFQ MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2393\",\r\n\t\t\t\t\"_mcc\": \"427\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"vodafone.com.qa\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vodafone.com.qa/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.101.97.102\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Unitel\",\r\n\t\t\t\t\"_carrier_id\": \"2347\",\r\n\t\t\t\t\"_mcc\": \"428\",\r\n\t\t\t\t\"_mnc\": \"88\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Skytel\",\r\n\t\t\t\t\"_carrier_id\": \"2172\",\r\n\t\t\t\t\"_mcc\": \"428\",\r\n\t\t\t\t\"_mnc\": \"91\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"G.Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2173\",\r\n\t\t\t\t\"_mcc\": \"428\",\r\n\t\t\t\t\"_mnc\": \"98\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MobiCom\",\r\n\t\t\t\t\"_carrier_id\": \"1612\",\r\n\t\t\t\t\"_mcc\": \"428\",\r\n\t\t\t\t\"_mnc\": \"99\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Namaste / NT Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"962\",\r\n\t\t\t\t\"_mcc\": \"429\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ncell\",\r\n\t\t\t\t\"_carrier_id\": \"1923\",\r\n\t\t\t\t\"_mcc\": \"429\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sky/C-Phone\",\r\n\t\t\t\t\"_carrier_id\": \"962\",\r\n\t\t\t\t\"_mcc\": \"429\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SmartCell\",\r\n\t\t\t\t\"_carrier_id\": \"1924\",\r\n\t\t\t\t\"_mcc\": \"429\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"shatelmobile\",\r\n\t\t\t\t\"_mcc\": \"432\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"shatelmobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"shatelmobile\",\r\n\t\t\t\t\"_mcc\": \"432\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"SHM-IMS\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user_visible\": \"false\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MCI-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1562\",\r\n\t\t\t\t\"_mcc\": \"432\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"mcinet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MCCI MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1562\",\r\n\t\t\t\t\"_mcc\": \"432\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"mcinet\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.193.134:38090/was\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.194.73\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MCI-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1563\",\r\n\t\t\t\t\"_mcc\": \"432\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"mcinet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MCCI MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1563\",\r\n\t\t\t\t\"_mcc\": \"432\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"MCI-GPRS\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.193.134\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MCI-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1564\",\r\n\t\t\t\t\"_mcc\": \"432\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"mcinet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MCCI MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1564\",\r\n\t\t\t\t\"_mcc\": \"432\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"MCI-GPRS\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.193.134\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"rightel\",\r\n\t\t\t\t\"_carrier_id\": \"1987\",\r\n\t\t\t\t\"_mcc\": \"432\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"rightel\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"RighTel-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1987\",\r\n\t\t\t\t\"_mcc\": \"432\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"RighTel-WAP\",\r\n\t\t\t\t\"_mmsc\": \"http://10.200.40.55:38090/was\",\r\n\t\t\t\t\"_mmsproxy\": \"10.200.39.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Irancell-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1967\",\r\n\t\t\t\t\"_mcc\": \"432\",\r\n\t\t\t\t\"_mnc\": \"35\",\r\n\t\t\t\t\"_apn\": \"mtnirancell\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Irancell-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1967\",\r\n\t\t\t\t\"_mcc\": \"432\",\r\n\t\t\t\t\"_mnc\": \"35\",\r\n\t\t\t\t\"_apn\": \"mtnirancell\",\r\n\t\t\t\t\"_mmsc\": \"http://mms:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"10.131.26.138\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MCI-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"2352\",\r\n\t\t\t\t\"_mcc\": \"432\",\r\n\t\t\t\t\"_mnc\": \"70\",\r\n\t\t\t\t\"_apn\": \"mcinet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MCCI MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2352\",\r\n\t\t\t\t\"_mcc\": \"432\",\r\n\t\t\t\t\"_mnc\": \"70\",\r\n\t\t\t\t\"_apn\": \"mcinet\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.193.134:38090/was\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.194.73\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MCI-GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"2358\",\r\n\t\t\t\t\"_mcc\": \"432\",\r\n\t\t\t\t\"_mnc\": \"93\",\r\n\t\t\t\t\"_apn\": \"mcinet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MCCI MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2358\",\r\n\t\t\t\t\"_mcc\": \"432\",\r\n\t\t\t\t\"_mnc\": \"93\",\r\n\t\t\t\t\"_apn\": \"MCI-GPRS\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.193.134\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Beeline-UZB Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1867\",\r\n\t\t\t\t\"_mcc\": \"434\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"internet.beeline.uz\",\r\n\t\t\t\t\"_user\": \"beeline\",\r\n\t\t\t\t\"_password\": \"beeline\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Beeline-UZB MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1867\",\r\n\t\t\t\t\"_mcc\": \"434\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mms.beeline.uz\",\r\n\t\t\t\t\"_user\": \"beeline\",\r\n\t\t\t\t\"_password\": \"beeline\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.30.30.166\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"UCELL Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1868\",\r\n\t\t\t\t\"_mcc\": \"434\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"UCELL MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1868\",\r\n\t\t\t\t\"_mcc\": \"434\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.64.164.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Perfectum Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2235\",\r\n\t\t\t\t\"_mcc\": \"434\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTS-UZB Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1869\",\r\n\t\t\t\t\"_mcc\": \"434\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"net.mts.uz\",\r\n\t\t\t\t\"_user\": \"mts\",\r\n\t\t\t\t\"_password\": \"mts\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTS-UZB MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1869\",\r\n\t\t\t\t\"_mcc\": \"434\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"mms.mts.uz\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc/was\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.0.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tcell\",\r\n\t\t\t\t\"_carrier_id\": \"1724\",\r\n\t\t\t\t\"_mcc\": \"436\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tcell\",\r\n\t\t\t\t\"_carrier_id\": \"1725\",\r\n\t\t\t\t\"_mcc\": \"436\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Megafon\",\r\n\t\t\t\t\"_carrier_id\": \"1726\",\r\n\t\t\t\t\"_mcc\": \"436\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Babilon-M\",\r\n\t\t\t\t\"_carrier_id\": \"1727\",\r\n\t\t\t\t\"_mcc\": \"436\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BABILON-M IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1727\",\r\n\t\t\t\t\"_mcc\": \"436\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tacom\",\r\n\t\t\t\t\"_carrier_id\": \"1728\",\r\n\t\t\t\t\"_mcc\": \"436\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tcell\",\r\n\t\t\t\t\"_carrier_id\": \"2174\",\r\n\t\t\t\t\"_mcc\": \"436\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Beeline\",\r\n\t\t\t\t\"_carrier_id\": \"867\",\r\n\t\t\t\t\"_mcc\": \"437\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Fonex\",\r\n\t\t\t\t\"_carrier_id\": \"2175\",\r\n\t\t\t\t\"_mcc\": \"437\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MegaCom\",\r\n\t\t\t\t\"_carrier_id\": \"2176\",\r\n\t\t\t\t\"_mcc\": \"437\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"O!\",\r\n\t\t\t\t\"_carrier_id\": \"2177\",\r\n\t\t\t\t\"_mcc\": \"437\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTS (BARASH Communication)\",\r\n\t\t\t\t\"_carrier_id\": \"1729\",\r\n\t\t\t\t\"_mcc\": \"438\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TM-Cell\",\r\n\t\t\t\t\"_carrier_id\": \"1730\",\r\n\t\t\t\t\"_mcc\": \"438\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IIJmio (TypeI)\",\r\n\t\t\t\t\"_mcc\": \"440\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"iijmio.jp\",\r\n\t\t\t\t\"_user\": \"mio@iij\",\r\n\t\t\t\t\"_password\": \"iij\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"vmobile.jp\",\r\n\t\t\t\t\"_mcc\": \"440\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"vmobile.jp\",\r\n\t\t\t\t\"_user\": \"vmobile@jp\",\r\n\t\t\t\t\"_password\": \"vmobile\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"docomo\",\r\n\t\t\t\t\"_mcc\": \"440\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"spmode.ne.jp\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"lte_ims\",\r\n\t\t\t\t\"_mcc\": \"440\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Emergency\",\r\n\t\t\t\t\"_mcc\": \"440\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"emergency\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"OCN モバイル ONE\",\r\n\t\t\t\t\"_mcc\": \"440\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"ocn.ne.jp\",\r\n\t\t\t\t\"_user\": \"mobileid@ocn\",\r\n\t\t\t\t\"_password\": \"mobile\",\r\n\t\t\t\t\"_authtype\": \"2\",\r\n\t\t\t\t\"_type\": \"default,supl\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"OCN モバイル ONE (LTE)\",\r\n\t\t\t\t\"_mcc\": \"440\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"lte-d.ocn.ne.jp\",\r\n\t\t\t\t\"_user\": \"mobileid@ocn\",\r\n\t\t\t\t\"_password\": \"mobile\",\r\n\t\t\t\t\"_authtype\": \"2\",\r\n\t\t\t\t\"_type\": \"default,supl\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TONE mobile\",\r\n\t\t\t\t\"_mcc\": \"440\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"tone.ne.jp\",\r\n\t\t\t\t\"_type\": \"default\",\r\n\t\t\t\t\"_user\": \"tone\",\r\n\t\t\t\t\"_password\": \"tone\",\r\n\t\t\t\t\"_authtype\": \"2\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"楽天(rakuten.jp)\",\r\n\t\t\t\t\"_carrier_id\": \"2429\",\r\n\t\t\t\t\"_mcc\": \"440\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"rakuten.jp\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2429\",\r\n\t\t\t\t\"_mcc\": \"440\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"OCN モバイル ONE\",\r\n\t\t\t\t\"_mcc\": \"440\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"ocn.ne.jp\",\r\n\t\t\t\t\"_user\": \"mobileid@ocn\",\r\n\t\t\t\t\"_password\": \"mobile\",\r\n\t\t\t\t\"_authtype\": \"2\",\r\n\t\t\t\t\"_type\": \"default,supl\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"OCN モバイル ONE (LTE)\",\r\n\t\t\t\t\"_mcc\": \"440\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"lte-d.ocn.ne.jp\",\r\n\t\t\t\t\"_user\": \"mobileid@ocn\",\r\n\t\t\t\t\"_password\": \"mobile\",\r\n\t\t\t\t\"_authtype\": \"2\",\r\n\t\t\t\t\"_type\": \"default,supl\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SBM\",\r\n\t\t\t\t\"_carrier_id\": \"1894\",\r\n\t\t\t\t\"_mcc\": \"440\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\",\r\n\t\t\t\t\"_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1894\",\r\n\t\t\t\t\"_mcc\": \"440\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"IMS\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Application\",\r\n\t\t\t\t\"_carrier_id\": \"1894\",\r\n\t\t\t\t\"_mcc\": \"440\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"plus.acs.jp\",\r\n\t\t\t\t\"_user\": \"ym\",\r\n\t\t\t\t\"_password\": \"ym\",\r\n\t\t\t\t\"_mmsproxy\": \"andmms.plusacs.ne.jp\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms-s\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,hipri\",\r\n\t\t\t\t\"_authtype\": \"2\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Rakuten\",\r\n\t\t\t\t\"_carrier_id\": \"2109\",\r\n\t\t\t\t\"_mcc\": \"440\",\r\n\t\t\t\t\"_mnc\": \"51\",\r\n\t\t\t\t\"_apn\": \"a.rmobile.jp\",\r\n\t\t\t\t\"_user\": \"rakuten@vdm\",\r\n\t\t\t\t\"_password\": \"0000\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SKT IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1891\",\r\n\t\t\t\t\"_mcc\": \"450\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"IMS\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SKT LTE INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1891\",\r\n\t\t\t\t\"_mcc\": \"450\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"lte.sktelecom.com\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,fota,cbs\",\r\n\t\t\t\t\"_mmsc\": \"http://omms.nate.com:9082/oma_mms\",\r\n\t\t\t\t\"_mmsproxy\": \"smart.nate.com\",\r\n\t\t\t\t\"_mmsport\": \"9093\",\r\n\t\t\t\t\"_server\": \"*\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LG uplus IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1892\",\r\n\t\t\t\t\"_mcc\": \"450\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"IMS\",\r\n\t\t\t\t\"_type\": \"ia,ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LG uplus\",\r\n\t\t\t\t\"_carrier_id\": \"1892\",\r\n\t\t\t\t\"_mcc\": \"450\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"internet.lguplus.co.kr\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,cbs\",\r\n\t\t\t\t\"_mmsc\": \"http://omammsc.uplus.co.kr:9084\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"KT IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1890\",\r\n\t\t\t\t\"_mcc\": \"450\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"IMS\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"KT\",\r\n\t\t\t\t\"_carrier_id\": \"1890\",\r\n\t\t\t\t\"_mcc\": \"450\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"lte.ktfwing.com\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,supl,fota,cbs\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.ktfwing.com:9082\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_server\": \"*\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobi-wap-gprs 2\",\r\n\t\t\t\t\"_carrier_id\": \"1299\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"m-wap\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobi-wap-gprs 1\",\r\n\t\t\t\t\"_carrier_id\": \"1299\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"m-wap\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_proxy\": \"203.162.21.107\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobi-gprs-mms\",\r\n\t\t\t\t\"_carrier_id\": \"1299\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"m-i090\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://203.162.21.114/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"203.162.21.114\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vina-wap-gprs\",\r\n\t\t\t\t\"_carrier_id\": \"1300\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"m3-world\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vina-gprs-mms\",\r\n\t\t\t\t\"_carrier_id\": \"1300\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"m3-mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vinaphone.com.vn\",\r\n\t\t\t\t\"_mmsproxy\": \"10.1.10.46\",\r\n\t\t\t\t\"_mmsport\": \"8000\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Viettel\",\r\n\t\t\t\t\"_carrier_id\": \"1899\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"v-internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Viettel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1899\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"v-mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.viettelmobile.com.vn/mms/wapenc\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.233.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Viettel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1899\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Viettel Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1899\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vietnamobile_GPRS3\",\r\n\t\t\t\t\"_carrier_id\": \"1994\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vietnamobile_GPRS1\",\r\n\t\t\t\t\"_carrier_id\": \"1994\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_proxy\": \"10.10.128.44\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vietnamobile_GPRS2\",\r\n\t\t\t\t\"_carrier_id\": \"1994\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vietnamobile_MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1994\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.10.128.58/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.128.44\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gmobile-wap-gprs2\",\r\n\t\t\t\t\"_carrier_id\": \"2178\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gmobile-wap-gprs\",\r\n\t\t\t\t\"_carrier_id\": \"2178\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_proxy\": \"10.16.70.199\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gmobile-gprs-mms\",\r\n\t\t\t\t\"_carrier_id\": \"2178\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.16.70.199\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gmobile MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2178\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"2\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.16.70.199\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"e-internet\",\r\n\t\t\t\t\"_carrier_id\": \"2179\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"e-internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"e-wap\",\r\n\t\t\t\t\"_carrier_id\": \"2179\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"e-wap\",\r\n\t\t\t\t\"_proxy\": \"10.18.2.183\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"e-mms\",\r\n\t\t\t\t\"_carrier_id\": \"2179\",\r\n\t\t\t\t\"_mcc\": \"452\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"e-mms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.18.2.172:38090\",\r\n\t\t\t\t\"_mmsproxy\": \"10.18.2.183\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl\",\r\n\t\t\t\t\"_carrier_id\": \"1526\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1526\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl UT\",\r\n\t\t\t\t\"_carrier_id\": \"1526\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"HOS\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1O1O\",\r\n\t\t\t\t\"_carrier_id\": \"1526\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01010000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1O1O IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1526\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01010000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl\",\r\n\t\t\t\t\"_carrier_id\": \"1526\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01020000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1526\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01020000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SUN Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2450\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"SUNMobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.61\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01030000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SUN Mobile IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2450\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01030000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Global Call\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"globalcall\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01040000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01040000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HK Prepaid\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02020001FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02020001FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HK Prepaid\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02030001FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02030001FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HK Prepaid\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02020002FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02020002FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"truphone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.truphone.com:1981/mm1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl\",\r\n\t\t\t\t\"_carrier_id\": \"759\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"759\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl UT\",\r\n\t\t\t\t\"_carrier_id\": \"759\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"HOS\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1O1O\",\r\n\t\t\t\t\"_carrier_id\": \"759\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01010000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1O1O IMS\",\r\n\t\t\t\t\"_carrier_id\": \"759\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01010000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl\",\r\n\t\t\t\t\"_carrier_id\": \"759\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01020000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl IMS\",\r\n\t\t\t\t\"_carrier_id\": \"759\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01020000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SUN Mobile\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"SUNMobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.61\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01030000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SUN Mobile IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01030000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Global Call\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"globalcall\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01040000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01040000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HK Prepaid\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02020001FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02020001FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HK Prepaid\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02030001FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02030001FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HK Prepaid\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02020002FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02020002FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hutchison HK\",\r\n\t\t\t\t\"_carrier_id\": \"760\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mobile.three.com.hk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.um.three.com.hk:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.three.com.hk\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hutchison HK Share\",\r\n\t\t\t\t\"_carrier_id\": \"760\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"share.three.com.hk\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"760\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 HOS\",\r\n\t\t\t\t\"_carrier_id\": \"760\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hutchison HK\",\r\n\t\t\t\t\"_carrier_id\": \"760\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mobile.three.com.hk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.um.three.com.hk:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.three.com.hk\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0404\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"760\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0404\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hutchison HK Share\",\r\n\t\t\t\t\"_carrier_id\": \"760\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"share.three.com.hk\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0404\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mo\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mobile.three.com.hk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.um.three.com.hk:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.three.com.hk\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0405\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mo IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0405\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mo Share\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"share.three.com.hk\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0405\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HKBN\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mobile.three.com.hk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.um.three.com.hk:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.three.com.hk\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0009\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HKBN IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0009\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HKBN Share\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"share.three.com.hk\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0009\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hutchison HK\",\r\n\t\t\t\t\"_carrier_id\": \"1960\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mobile.three.com.hk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.um.three.com.hk:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.three.com.hk\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hutchison HK Share\",\r\n\t\t\t\t\"_carrier_id\": \"1960\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"share.three.com.hk\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1960\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 HOS\",\r\n\t\t\t\t\"_carrier_id\": \"1960\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hutchison HK\",\r\n\t\t\t\t\"_carrier_id\": \"1960\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mobile.three.com.hk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.um.three.com.hk:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.three.com.hk\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hutchison HK Share\",\r\n\t\t\t\t\"_carrier_id\": \"1960\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"share.three.com.hk\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1960\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 HOS\",\r\n\t\t\t\t\"_carrier_id\": \"1960\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SmarTone\",\r\n\t\t\t\t\"_carrier_id\": \"761\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"SmarTone\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.smartone.com/server\",\r\n\t\t\t\t\"_mmsproxy\": \"10.9.9.9\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SmarTone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"761\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SmarTone UT\",\r\n\t\t\t\t\"_carrier_id\": \"761\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"smt\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone\",\r\n\t\t\t\t\"_carrier_id\": \"763\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"truphone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.truphone.com:1981/mm1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl\",\r\n\t\t\t\t\"_carrier_id\": \"765\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"hkcsl\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl UT\",\r\n\t\t\t\t\"_carrier_id\": \"765\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"HOS\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl IMS\",\r\n\t\t\t\t\"_carrier_id\": \"765\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CMHK UT\",\r\n\t\t\t\t\"_carrier_id\": \"767\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CMHK MMS\",\r\n\t\t\t\t\"_carrier_id\": \"767\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"cmhk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.hk.chinamobile.com/mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CMHK Data\",\r\n\t\t\t\t\"_carrier_id\": \"767\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"cmhk\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CMHK IMS\",\r\n\t\t\t\t\"_carrier_id\": \"767\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CMHK MMS\",\r\n\t\t\t\t\"_carrier_id\": \"767\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"cmhk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.hk.chinamobile.com/mms\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CMHK Data\",\r\n\t\t\t\t\"_carrier_id\": \"767\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"cmhk\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CMHK UT\",\r\n\t\t\t\t\"_carrier_id\": \"767\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hutchison HK\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"mobile.three.com.hk\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.um.three.com.hk:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.three.com.hk\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hutchison HK Share\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"share.three.com.hk\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 HOS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SmarTone\",\r\n\t\t\t\t\"_carrier_id\": \"761\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"SmarTone\",\r\n\t\t\t\t\"_mmsproxy\": \"10.9.9.9\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.smartone.com/server\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SmarTone UT\",\r\n\t\t\t\t\"_carrier_id\": \"761\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"smt\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl IMS\",\r\n\t\t\t\t\"_carrier_id\": \"769\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl UT\",\r\n\t\t\t\t\"_carrier_id\": \"769\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"HOS\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl\",\r\n\t\t\t\t\"_carrier_id\": \"769\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.hkcsl.com:8080\",\r\n\t\t\t\t\"_mmsproxy\": \"10.140.14.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SmarTone\",\r\n\t\t\t\t\"_carrier_id\": \"761\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"SmarTone\",\r\n\t\t\t\t\"_mmsproxy\": \"10.9.9.9\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.smartone.com/server\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SmarTone UT\",\r\n\t\t\t\t\"_carrier_id\": \"761\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"smt\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl\",\r\n\t\t\t\t\"_carrier_id\": \"770\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"770\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl UT\",\r\n\t\t\t\t\"_carrier_id\": \"770\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"HOS\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1O1O\",\r\n\t\t\t\t\"_carrier_id\": \"770\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01010000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"1O1O IMS\",\r\n\t\t\t\t\"_carrier_id\": \"770\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01010000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl\",\r\n\t\t\t\t\"_carrier_id\": \"770\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01020000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl IMS\",\r\n\t\t\t\t\"_carrier_id\": \"770\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01020000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SUN Mobile\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"SUNMobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.61\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01030000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SUN Mobile IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01030000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Global Call\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"globalcall\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01040000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01040000FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HK Prepaid\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02020001FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02020001FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HK Prepaid\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02030001FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02030001FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HK Prepaid\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.59.51\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.58.171:8002\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02020002FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02020002FFFFFFFF\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl\",\r\n\t\t\t\t\"_carrier_id\": \"1526\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"mobile\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.hkcsl.com:8080\",\r\n\t\t\t\t\"_mmsproxy\": \"10.140.14.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,mms,hipri\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1526\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl UT\",\r\n\t\t\t\t\"_carrier_id\": \"1526\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"HOS\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl UT\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"HOS\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl IMS\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"29\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"csl UT\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"29\",\r\n\t\t\t\t\"_apn\": \"HOS\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HKIA-5G Data\",\r\n\t\t\t\t\"_carrier_id\": \"772\",\r\n\t\t\t\t\"_mcc\": \"454\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"hkia-5g\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.hk.chinamobile.com/mms\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SmarTone Macau\",\r\n\t\t\t\t\"_carrier_id\": \"1613\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"smartgprs\",\r\n\t\t\t\t\"_mmsc\": \"http://momms.smartone.com/dmog/mo\",\r\n\t\t\t\t\"_mmsproxy\": \"10.9.9.29\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CTM Data\",\r\n\t\t\t\t\"_carrier_id\": \"1614\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ctm-mobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CTM MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1614\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ctmmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.wap.ctm.net:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.99.3\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CTM (Prepaid)\",\r\n\t\t\t\t\"_carrier_id\": \"1614\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ctmprepaid\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.wap.ctm.net:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.99.3\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CTM IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1614\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CTM XCAP\",\r\n\t\t\t\t\"_carrier_id\": \"1614\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"XCAP\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CTNET\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ctnet\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ims\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CTWAP\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ctwap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.vnet.mobi\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.200\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 Macau\",\r\n\t\t\t\t\"_carrier_id\": \"1615\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mobile.three.com.mo\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.three.com.mo:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.three.com.mo\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CTM Data\",\r\n\t\t\t\t\"_carrier_id\": \"1614\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ctm-mobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CTM MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1614\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ctmmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.wap.ctm.net:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.99.3\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CTM (Prepaid)\",\r\n\t\t\t\t\"_carrier_id\": \"1614\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ctmprepaid\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.wap.ctm.net:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.99.3\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CTM IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1614\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CTM XCAP\",\r\n\t\t\t\t\"_carrier_id\": \"1614\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"XCAP\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 Macau\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mobile.three.com.mo\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.three.com.mo:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.three.com.mo\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3 Macau IMS\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mobile.three.com.mo\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CTNET\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"ctnet\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ims\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CTWAP\",\r\n\t\t\t\t\"_mcc\": \"455\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"ctwap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.vnet.mobi\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.200\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cellcard\",\r\n\t\t\t\t\"_carrier_id\": \"868\",\r\n\t\t\t\t\"_mcc\": \"456\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Smart\",\r\n\t\t\t\t\"_carrier_id\": \"869\",\r\n\t\t\t\t\"_mcc\": \"456\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"qb\",\r\n\t\t\t\t\"_carrier_id\": \"2180\",\r\n\t\t\t\t\"_mcc\": \"456\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Star-Cell\",\r\n\t\t\t\t\"_carrier_id\": \"869\",\r\n\t\t\t\t\"_mcc\": \"456\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Smart\",\r\n\t\t\t\t\"_carrier_id\": \"869\",\r\n\t\t\t\t\"_mcc\": \"456\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Metfone\",\r\n\t\t\t\t\"_carrier_id\": \"2181\",\r\n\t\t\t\t\"_mcc\": \"456\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Beeline\",\r\n\t\t\t\t\"_mcc\": \"456\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Excell\",\r\n\t\t\t\t\"_carrier_id\": \"2236\",\r\n\t\t\t\t\"_mcc\": \"456\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cellcard\",\r\n\t\t\t\t\"_carrier_id\": \"871\",\r\n\t\t\t\t\"_mcc\": \"456\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LTC\",\r\n\t\t\t\t\"_carrier_id\": \"1590\",\r\n\t\t\t\t\"_mcc\": \"457\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ETL\",\r\n\t\t\t\t\"_carrier_id\": \"1591\",\r\n\t\t\t\t\"_mcc\": \"457\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Unitel\",\r\n\t\t\t\t\"_carrier_id\": \"2346\",\r\n\t\t\t\t\"_mcc\": \"457\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Beeline\",\r\n\t\t\t\t\"_carrier_id\": \"1592\",\r\n\t\t\t\t\"_mcc\": \"457\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) NET\",\r\n\t\t\t\t\"_carrier_id\": \"1435\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"cmnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) WAP&MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1435\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"cmwap\",\r\n\t\t\t\t\"_proxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.monternet.com\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) NET IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1435\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国联通 (China Unicom) NET\",\r\n\t\t\t\t\"_carrier_id\": \"1436\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"3gnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国联通 (China Unicom) WAP&MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1436\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"3gwap\",\r\n\t\t\t\t\"_proxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.myuni.com.cn\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国联通 (China Unicom) NET IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1436\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) NET\",\r\n\t\t\t\t\"_carrier_id\": \"1435\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"cmnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) WAP&MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1435\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"cmwap\",\r\n\t\t\t\t\"_proxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.monternet.com\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) NET IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1435\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国电信 (China Telecom) SOS\",\r\n\t\t\t\t\"_carrier_id\": \"2237\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"sos\",\r\n\t\t\t\t\"_type\": \"emergency\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国电信 (China Telecom) NET\",\r\n\t\t\t\t\"_carrier_id\": \"2237\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ctnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国电信 (China Telecom) WAP&MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2237\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ctwap\",\r\n\t\t\t\t\"_proxy\": \"10.0.0.200\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.vnet.mobi\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.200\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国电信 (China Telecom) NET IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2237\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) NET\",\r\n\t\t\t\t\"_carrier_id\": \"1435\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"cmnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) WAP&MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1435\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"cmwap\",\r\n\t\t\t\t\"_proxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.monternet.com\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) NET IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1435\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) NET\",\r\n\t\t\t\t\"_carrier_id\": \"1435\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"cmnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) WAP&MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1435\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"cmwap\",\r\n\t\t\t\t\"_proxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.monternet.com\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) NET IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1435\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) NET\",\r\n\t\t\t\t\"_carrier_id\": \"1435\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"cmnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) WAP&MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1435\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"cmwap\",\r\n\t\t\t\t\"_proxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.monternet.com\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) NET IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1435\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国联通 (China Unicom) NET\",\r\n\t\t\t\t\"_carrier_id\": \"1436\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"3gnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国联通 (China Unicom) WAP&MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1436\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"3gwap\",\r\n\t\t\t\t\"_proxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.myuni.com.cn\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国联通 (China Unicom) NET IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1436\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国电信 (China Telecom) NET\",\r\n\t\t\t\t\"_carrier_id\": \"2237\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"ctnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国电信 (China Telecom) WAP&MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2237\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"ctwap\",\r\n\t\t\t\t\"_proxy\": \"10.0.0.200\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.vnet.mobi\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.200\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国电信 (China Telecom) NET IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2237\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国电信 (China Telecom) SOS\",\r\n\t\t\t\t\"_carrier_id\": \"2237\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"sos\",\r\n\t\t\t\t\"_type\": \"emergency\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) NET\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"cmnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) MMS\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"cmwap\",\r\n\t\t\t\t\"_proxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.monternet.com\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国移动 (China Mobile) IMS\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国广电 (CBN) NET\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"cbnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国广电 (CBN) NET MMS\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"cmwap\",\r\n\t\t\t\t\"_proxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.monternet.com\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国广电 (CBN) NET IMS\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国广电 (CBN) NET\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"60\",\r\n\t\t\t\t\"_apn\": \"cmnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国广电 (CBN) NET MMS\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"60\",\r\n\t\t\t\t\"_apn\": \"cmwap\",\r\n\t\t\t\t\"_proxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.monternet.com\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.172\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中国广电 (CBN) NET IMS\",\r\n\t\t\t\t\"_mcc\": \"460\",\r\n\t\t\t\t\"_mnc\": \"60\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"遠傳電信(Far EasTone) (MMS)\",\r\n\t\t\t\t\"_carrier_id\": \"1881\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"fetnet01\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_mmsproxy\": \"210.241.199.199\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"遠傳電信(Far EasTone) (Internet)\",\r\n\t\t\t\t\"_carrier_id\": \"1881\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"遠傳電信(Far EasTone) (IMS)\",\r\n\t\t\t\t\"_carrier_id\": \"1881\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"遠傳電信(Far EasTone) (XCAP)\",\r\n\t\t\t\t\"_carrier_id\": \"1881\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"遠傳電信(Far EasTone) (MMS)\",\r\n\t\t\t\t\"_carrier_id\": \"1881\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"fetnet01\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_mmsproxy\": \"210.241.199.199\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"遠傳電信(Far EasTone) (Internet)\",\r\n\t\t\t\t\"_carrier_id\": \"1881\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"遠傳電信(Far EasTone) (IMS)\",\r\n\t\t\t\t\"_carrier_id\": \"1881\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"遠傳電信(Far EasTone) (XCAP)\",\r\n\t\t\t\t\"_carrier_id\": \"1881\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"亞太電信(APT) (UT)\",\r\n\t\t\t\t\"_carrier_id\": \"1882\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"gtnet\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"亞太電信(APT) (Internet)\",\r\n\t\t\t\t\"_carrier_id\": \"1882\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"gtnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"亞太電信(APT) (IMS)\",\r\n\t\t\t\t\"_carrier_id\": \"1882\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"台灣大哥大TS (Internet)\",\r\n\t\t\t\t\"_carrier_id\": \"1886\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"89\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"台灣大哥大TS (MMS)\",\r\n\t\t\t\t\"_carrier_id\": \"1886\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"89\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vibo.net.tw\",\r\n\t\t\t\t\"_mmsproxy\": \"172.24.128.36\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"台灣大哥大TS (IMS)\",\r\n\t\t\t\t\"_carrier_id\": \"1886\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"89\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中華電信(Chunghwa) (Internet)\",\r\n\t\t\t\t\"_carrier_id\": \"1884\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"92\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中華電信(Chunghwa) (MMS)\",\r\n\t\t\t\t\"_carrier_id\": \"1884\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"92\",\r\n\t\t\t\t\"_apn\": \"emome\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.emome.net:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"10.1.1.1\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中華電信(Chunghwa) (IMS)\",\r\n\t\t\t\t\"_carrier_id\": \"1884\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"92\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"中華電信(Chunghwa) (UT)\",\r\n\t\t\t\t\"_carrier_id\": \"1884\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"92\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"台灣大哥大(TW Mobile) (Internet)\",\r\n\t\t\t\t\"_carrier_id\": \"1888\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"97\",\r\n\t\t\t\t\"_apn\": \"Internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"台灣大哥大(TW Mobile) (MMS)\",\r\n\t\t\t\t\"_carrier_id\": \"1888\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"97\",\r\n\t\t\t\t\"_apn\": \"MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.catch.net.tw\",\r\n\t\t\t\t\"_mmsproxy\": \"10.1.1.2\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"台灣大哥大(TW Mobile) (IMS)\",\r\n\t\t\t\t\"_carrier_id\": \"1888\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"97\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"台灣大哥大(TW Mobile) (UT)\",\r\n\t\t\t\t\"_carrier_id\": \"1888\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"97\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"台灣大哥大(TW Mobile) (Internet)\",\r\n\t\t\t\t\"_carrier_id\": \"1889\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"99\",\r\n\t\t\t\t\"_apn\": \"Internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"台灣大哥大(TW Mobile) (MMS)\",\r\n\t\t\t\t\"_carrier_id\": \"1889\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"99\",\r\n\t\t\t\t\"_apn\": \"MMS\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.catch.net.tw\",\r\n\t\t\t\t\"_mmsproxy\": \"10.1.1.2\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"台灣大哥大(TW Mobile) (IMS)\",\r\n\t\t\t\t\"_carrier_id\": \"1889\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"99\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"台灣大哥大(TW Mobile) (UT)\",\r\n\t\t\t\t\"_carrier_id\": \"1889\",\r\n\t\t\t\t\"_mcc\": \"466\",\r\n\t\t\t\t\"_mnc\": \"99\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"GP-INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1362\",\r\n\t\t\t\t\"_mcc\": \"470\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"gpinternet\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"GP-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1362\",\r\n\t\t\t\t\"_mcc\": \"470\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"gpmms\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.gpsurf.net/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.128.1.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dhiraagu\",\r\n\t\t\t\t\"_carrier_id\": \"1624\",\r\n\t\t\t\t\"_mcc\": \"472\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"OoredooData\",\r\n\t\t\t\t\"_carrier_id\": \"2033\",\r\n\t\t\t\t\"_mcc\": \"472\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"OoredooData\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2033\",\r\n\t\t\t\t\"_mcc\": \"472\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"OoredooData\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ooredoo.mv\",\r\n\t\t\t\t\"_mmsproxy\": \"172.24.10.20\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DiGi Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1630\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"diginet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DiGi MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1630\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"digimms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.digi.com.my/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"203.92.128.160\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Unifi\",\r\n\t\t\t\t\"_carrier_id\": \"2038\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"unifi\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Maxis Internet & MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1628\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"unet\",\r\n\t\t\t\t\"_mmsproxy\": \"202.75.133.49\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_mmsc\": \"http://172.16.74.100:10021/mmsc\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Maxis ims\",\r\n\t\t\t\t\"_carrier_id\": \"1628\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Maxis UT\",\r\n\t\t\t\t\"_carrier_id\": \"1628\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Celcom Internet & MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1633\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"celcom3g\",\r\n\t\t\t\t\"_mmsproxy\": \"10.128.1.242\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.celcom.net.my\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DiGi MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1630\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"digimms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.digi.com.my/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"203.92.128.160\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DiGi Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1630\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"diginet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Maxis Internet & MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1631\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"unet\",\r\n\t\t\t\t\"_mmsproxy\": \"202.75.133.49\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_mmsc\": \"http://172.16.74.100:10021/mmsc\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U Mobile Internet & MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1632\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"my3g\",\r\n\t\t\t\t\"_mmsproxy\": \"10.30.5.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://10.30.3.11/servlets/mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Celcom Internet & MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1633\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"celcom3g\",\r\n\t\t\t\t\"_mmsproxy\": \"10.128.1.242\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.celcom.net.my\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Maxis Internet & MMS\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"142\",\r\n\t\t\t\t\"_apn\": \"unet\",\r\n\t\t\t\t\"_mmsproxy\": \"202.75.133.49\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_mmsc\": \"http://172.16.74.100:10021/mmsc\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DiGi Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1630\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"143\",\r\n\t\t\t\t\"_apn\": \"diginet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DiGi MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1630\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"143\",\r\n\t\t\t\t\"_apn\": \"digimms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.digi.com.my/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"203.92.128.160\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Celcom Internet & MMS\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"145\",\r\n\t\t\t\t\"_apn\": \"celcom3g\",\r\n\t\t\t\t\"_mmsproxy\": \"10.128.1.242\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.celcom.net.my\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DiGi Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1630\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"146\",\r\n\t\t\t\t\"_apn\": \"diginet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DiGi MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1630\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"146\",\r\n\t\t\t\t\"_apn\": \"digimms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.digi.com.my/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"203.92.128.160\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Maxis Internet & MMS\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"147\",\r\n\t\t\t\t\"_apn\": \"unet\",\r\n\t\t\t\t\"_mmsproxy\": \"202.75.133.49\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_mmsc\": \"http://172.16.74.100:10021/mmsc\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Celcom Internet & MMS\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"148\",\r\n\t\t\t\t\"_apn\": \"celcom3g\",\r\n\t\t\t\t\"_mmsproxy\": \"10.128.1.242\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.celcom.net.my\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Yes Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2017\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"152\",\r\n\t\t\t\t\"_apn\": \"yesnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Yes IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2017\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"152\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Unifi\",\r\n\t\t\t\t\"_carrier_id\": \"2038\",\r\n\t\t\t\t\"_mcc\": \"502\",\r\n\t\t\t\t\"_mnc\": \"153\",\r\n\t\t\t\t\"_apn\": \"unifi\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telstra IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1345\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telstra Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1345\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"telstra.wap\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telstra MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1345\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"telstra.mms\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.telstra.com:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.1.1.180\",\r\n\t\t\t\t\"_mmsport\": \"80\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telstra Tethering\",\r\n\t\t\t\t\"_carrier_id\": \"1345\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"telstra.internet\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telstra HOS\",\r\n\t\t\t\t\"_carrier_id\": \"1345\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Optus Yes Internet\",\r\n\t\t\t\t\"_carrier_id\": \"30\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"yesinternet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Optus MMS\",\r\n\t\t\t\t\"_carrier_id\": \"30\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.optus.com.au:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"61.88.190.10\",\r\n\t\t\t\t\"_mmsport\": \"8070\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Virgin Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2145\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"yesinternet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"505029\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Virgin MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2145\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.optus.com.au:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"61.88.190.10\",\r\n\t\t\t\t\"_mmsport\": \"8070\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"505029\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone live!\",\r\n\t\t\t\t\"_carrier_id\": \"15\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"live.vodafone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://pxt.vodafone.net.au/pxtsend\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.2.60\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"15\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara Internet\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"live.vodafone.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"01\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara MMS\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"HOS\",\r\n\t\t\t\t\"_type\": \"mms,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://pxt.vodafone.net.au/pxtsend\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.2.60\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"01\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lebara IMS\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"01\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VF AU PXT\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"live.vodafone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://pxt.vodafone.net.au/pxtsend\",\r\n\t\t\t\t\"_mmsproxy\": \"10.202.2.60\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VF Internet\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"vfinternet.au\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1351\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"3netaccess\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3\",\r\n\t\t\t\t\"_carrier_id\": \"1351\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"3services\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.three.net.au:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.176.57.25\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.com.au\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"38\",\r\n\t\t\t\t\"_apn\": \"truphone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.truphone.com:1981/mm1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,dun\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Truphone IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2143\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"38\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"547275554B3030656E\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"OptiTel\",\r\n\t\t\t\t\"_carrier_id\": \"2535\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"52\",\r\n\t\t\t\t\"_apn\": \"optitel\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"OptiTel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2535\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"52\",\r\n\t\t\t\t\"_apn\": \"optitel.ims\",\r\n\t\t\t\t\"_type\": \"ims\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"OptiTel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2535\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"52\",\r\n\t\t\t\t\"_apn\": \"optitel.mms\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.opti.tel\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"OptiTel MCX\",\r\n\t\t\t\t\"_carrier_id\": \"2535\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"52\",\r\n\t\t\t\t\"_apn\": \"optitel.mcx\",\r\n\t\t\t\t\"_type\": \"mcx\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telstra IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1345\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"71\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telstra Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1345\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"71\",\r\n\t\t\t\t\"_apn\": \"telstra.wap\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telstra MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1345\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"71\",\r\n\t\t\t\t\"_apn\": \"telstra.mms\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.telstra.com:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.1.1.180\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telstra Tethering\",\r\n\t\t\t\t\"_carrier_id\": \"1345\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"71\",\r\n\t\t\t\t\"_apn\": \"telstra.internet\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telstra HOS\",\r\n\t\t\t\t\"_carrier_id\": \"1345\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"71\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telstra IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1345\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"72\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telstra Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1345\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"72\",\r\n\t\t\t\t\"_apn\": \"telstra.wap\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telstra MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1345\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"72\",\r\n\t\t\t\t\"_apn\": \"telstra.mms\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.telstra.com:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.1.1.180\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telstra Tethering\",\r\n\t\t\t\t\"_carrier_id\": \"1345\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"72\",\r\n\t\t\t\t\"_apn\": \"telstra.internet\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telstra HOS\",\r\n\t\t\t\t\"_carrier_id\": \"1345\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"72\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pivotel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"492\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"88\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.pivotel.com.au:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"203.105.216.88\",\r\n\t\t\t\t\"_mmsport\": \"8088\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pivotel Internet\",\r\n\t\t\t\t\"_carrier_id\": \"492\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"88\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pivotel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"492\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"88\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Optus Internet\",\r\n\t\t\t\t\"_carrier_id\": \"30\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"90\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Optus MMS\",\r\n\t\t\t\t\"_carrier_id\": \"30\",\r\n\t\t\t\t\"_mcc\": \"505\",\r\n\t\t\t\t\"_mnc\": \"90\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.optus.com.au:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"61.88.190.10\",\r\n\t\t\t\t\"_mmsport\": \"8070\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1537\",\r\n\t\t\t\t\"_mcc\": \"510\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"indosatgprs\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Indosat MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1537\",\r\n\t\t\t\t\"_mcc\": \"510\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"indosatmms\",\r\n\t\t\t\t\"_user\": \"indosat\",\r\n\t\t\t\t\"_password\": \"indosat\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.indosat.com\",\r\n\t\t\t\t\"_mmsproxy\": \"10.19.19.19\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AXIS\",\r\n\t\t\t\t\"_carrier_id\": \"788\",\r\n\t\t\t\t\"_mcc\": \"510\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"AXIS\",\r\n\t\t\t\t\"_user\": \"axis\",\r\n\t\t\t\t\"_password\": \"123456\",\r\n\t\t\t\t\"_proxy\": \"10.8.3.8\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_authtype\": \"1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AXISmms\",\r\n\t\t\t\t\"_carrier_id\": \"788\",\r\n\t\t\t\t\"_mcc\": \"510\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"AXISmms\",\r\n\t\t\t\t\"_user\": \"axis\",\r\n\t\t\t\t\"_password\": \"123456\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.axis\",\r\n\t\t\t\t\"_mmsproxy\": \"10.8.3.8\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Smartfren4G\",\r\n\t\t\t\t\"_carrier_id\": \"1978\",\r\n\t\t\t\t\"_mcc\": \"510\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"Smartfren4G\",\r\n\t\t\t\t\"_user\": \"smartfren\",\r\n\t\t\t\t\"_password\": \"smartfren\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_authtype\": \"3\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"787\",\r\n\t\t\t\t\"_mcc\": \"510\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TSEL-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"787\",\r\n\t\t\t\t\"_mcc\": \"510\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap123\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.telkomsel.com\",\r\n\t\t\t\t\"_mmsproxy\": \"10.1.89.150\",\r\n\t\t\t\t\"_mmsport\": \"8000\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"788\",\r\n\t\t\t\t\"_mcc\": \"510\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"XL-MMS\",\r\n\t\t\t\t\"_carrier_id\": \"788\",\r\n\t\t\t\t\"_mcc\": \"510\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"www.xlmms.net\",\r\n\t\t\t\t\"_user\": \"xlgprs\",\r\n\t\t\t\t\"_password\": \"proxl\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmc.xl.net.id/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"202.152.240.50\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"789\",\r\n\t\t\t\t\"_mcc\": \"510\",\r\n\t\t\t\t\"_mnc\": \"21\",\r\n\t\t\t\t\"_apn\": \"indosatgprs\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Indosat MMS\",\r\n\t\t\t\t\"_carrier_id\": \"789\",\r\n\t\t\t\t\"_mcc\": \"510\",\r\n\t\t\t\t\"_mnc\": \"21\",\r\n\t\t\t\t\"_apn\": \"indosatmms\",\r\n\t\t\t\t\"_user\": \"indosat\",\r\n\t\t\t\t\"_password\": \"indosat\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.indosat.com\",\r\n\t\t\t\t\"_mmsproxy\": \"10.19.19.19\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Smartfren4G\",\r\n\t\t\t\t\"_carrier_id\": \"1978\",\r\n\t\t\t\t\"_mcc\": \"510\",\r\n\t\t\t\t\"_mnc\": \"28\",\r\n\t\t\t\t\"_apn\": \"Smartfren4G\",\r\n\t\t\t\t\"_user\": \"smartfren\",\r\n\t\t\t\t\"_password\": \"smartfren\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_authtype\": \"3\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1966\",\r\n\t\t\t\t\"_mcc\": \"510\",\r\n\t\t\t\t\"_mnc\": \"89\",\r\n\t\t\t\t\"_apn\": \"3gprs\",\r\n\t\t\t\t\"_user\": \"3gprs\",\r\n\t\t\t\t\"_password\": \"3gprs\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"3MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1966\",\r\n\t\t\t\t\"_mcc\": \"510\",\r\n\t\t\t\t\"_mnc\": \"89\",\r\n\t\t\t\t\"_apn\": \"3mms\",\r\n\t\t\t\t\"_user\": \"3mms\",\r\n\t\t\t\t\"_password\": \"3mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.three.co.id\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.0.10\",\r\n\t\t\t\t\"_mmsport\": \"3128\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telin\",\r\n\t\t\t\t\"_carrier_id\": \"2182\",\r\n\t\t\t\t\"_mcc\": \"514\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Timor Telecom\",\r\n\t\t\t\t\"_carrier_id\": \"2183\",\r\n\t\t\t\t\"_mcc\": \"514\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Viettel Timor-Leste\",\r\n\t\t\t\t\"_carrier_id\": \"2268\",\r\n\t\t\t\t\"_mcc\": \"514\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"myGlobe Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1653\",\r\n\t\t\t\t\"_mcc\": \"515\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet.globe.com.ph\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"myGlobe INET\",\r\n\t\t\t\t\"_carrier_id\": \"1653\",\r\n\t\t\t\t\"_mcc\": \"515\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"http.globe.com.ph\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"myGlobe MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1653\",\r\n\t\t\t\t\"_mcc\": \"515\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms.globe.com.ph\",\r\n\t\t\t\t\"_mmsc\": \"http://192.40.100.22:10021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"203.177.42.214\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SMART INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1654\",\r\n\t\t\t\t\"_mcc\": \"515\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Smart MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1654\",\r\n\t\t\t\t\"_mcc\": \"515\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.102.61.238:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"10.102.61.46\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sun Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1655\",\r\n\t\t\t\t\"_mcc\": \"515\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"minternet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SUN MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1655\",\r\n\t\t\t\t\"_mcc\": \"515\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmscenter.suncellular.com.ph\",\r\n\t\t\t\t\"_mmsproxy\": \"202.138.159.78\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Redinternet\",\r\n\t\t\t\t\"_carrier_id\": \"2184\",\r\n\t\t\t\t\"_mcc\": \"515\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"redinternet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Redmms\",\r\n\t\t\t\t\"_carrier_id\": \"2184\",\r\n\t\t\t\t\"_mcc\": \"515\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"real.globe.com.ph\",\r\n\t\t\t\t\"_mmsc\": \"http://10.102.61.193:8002/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.138.3.35\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TRUE-H INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1997\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"true\",\r\n\t\t\t\t\"_password\": \"true\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TRUE-H MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1997\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"hmms\",\r\n\t\t\t\t\"_user\": \"true\",\r\n\t\t\t\t\"_password\": \"true\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.trueh.com:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.7.39\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TRUE IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1997\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TRUE UT\",\r\n\t\t\t\t\"_carrier_id\": \"1997\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIS Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1097\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIS MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1097\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mobilelife.co.th\",\r\n\t\t\t\t\"_mmsproxy\": \"203.170.229.34\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIS IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1097\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIS UT\",\r\n\t\t\t\t\"_carrier_id\": \"1097\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIS Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1098\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIS MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1098\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"multimedia\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mobilelife.co.th\",\r\n\t\t\t\t\"_mmsproxy\": \"203.170.229.34\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIS IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1098\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIS UT\",\r\n\t\t\t\t\"_carrier_id\": \"1098\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TRUE-H INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1997\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"true\",\r\n\t\t\t\t\"_password\": \"true\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TRUE-H MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1997\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"hmms\",\r\n\t\t\t\t\"_user\": \"true\",\r\n\t\t\t\t\"_password\": \"true\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.trueh.com:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.7.39\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TRUE IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1997\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TRUE UT\",\r\n\t\t\t\t\"_carrier_id\": \"1997\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"dtac Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1897\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"www.dtac.co.th\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"dtac MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1897\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms2.dtac.co.th:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.10.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"dtac IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1897\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"dtac UT\",\r\n\t\t\t\t\"_carrier_id\": \"1897\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"XCAP\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TOT 3G Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1723\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TOT 3G MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1723\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.tot3g.net:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.0.72\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TOT IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1723\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TOT UT\",\r\n\t\t\t\t\"_carrier_id\": \"1723\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"dtac MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1896\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.dtac.co.th:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"203.155.200.133\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"dtac Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1896\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"www.dtac.co.th\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"dtac IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1896\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"dtac UT\",\r\n\t\t\t\t\"_carrier_id\": \"1896\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"XCAP\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"dtac Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2413\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"47\",\r\n\t\t\t\t\"_apn\": \"www.dtac.co.th\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"dtac MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2413\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"47\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms2.dtac.co.th:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.10.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"dtac IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2413\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"47\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"dtac UT\",\r\n\t\t\t\t\"_carrier_id\": \"2413\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"47\",\r\n\t\t\t\t\"_apn\": \"XCAP\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TRUE INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1898\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"99\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"true\",\r\n\t\t\t\t\"_password\": \"true\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TRUE MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1898\",\r\n\t\t\t\t\"_mcc\": \"520\",\r\n\t\t\t\t\"_mnc\": \"99\",\r\n\t\t\t\t\"_apn\": \"hmms\",\r\n\t\t\t\t\"_user\": \"true\",\r\n\t\t\t\t\"_password\": \"true\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.truelife.com:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.7.39\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Singtel (Postpaid)\",\r\n\t\t\t\t\"_carrier_id\": \"31\",\r\n\t\t\t\t\"_mcc\": \"525\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"e-ideas\",\r\n\t\t\t\t\"_mmsproxy\": \"165.21.42.84\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.singtel.com:10021/mmsc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Singtel (Prepaid)\",\r\n\t\t\t\t\"_carrier_id\": \"31\",\r\n\t\t\t\t\"_mcc\": \"525\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hicard\",\r\n\t\t\t\t\"_mmsproxy\": \"165.21.42.84\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.singtel.com:10021/mmsc\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Singtel IMS\",\r\n\t\t\t\t\"_carrier_id\": \"31\",\r\n\t\t\t\t\"_mcc\": \"525\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Singtel Ut\",\r\n\t\t\t\t\"_carrier_id\": \"31\",\r\n\t\t\t\t\"_mcc\": \"525\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"stm-ut\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sunsurf Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"1706\",\r\n\t\t\t\t\"_mcc\": \"525\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"sunsurf\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"M1 MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1706\",\r\n\t\t\t\t\"_mcc\": \"525\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"miworld\",\r\n\t\t\t\t\"_user\": \"65\",\r\n\t\t\t\t\"_password\": \"user123\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsgw:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"172.16.14.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"M1 IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1706\",\r\n\t\t\t\t\"_mcc\": \"525\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"IMS\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"M1 XCAP\",\r\n\t\t\t\t\"_carrier_id\": \"1706\",\r\n\t\t\t\t\"_mcc\": \"525\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"XCAP\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"18\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"M1 hos\",\r\n\t\t\t\t\"_carrier_id\": \"1706\",\r\n\t\t\t\t\"_mcc\": \"525\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"1|2|3|4|5|6|7|8|9|10|12|13|14|15|17|20\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"giga\",\r\n\t\t\t\t\"_carrier_id\": \"2434\",\r\n\t\t\t\t\"_mcc\": \"525\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"giga\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_match_data\": \"giga\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SH Data Postpaid\",\r\n\t\t\t\t\"_carrier_id\": \"1707\",\r\n\t\t\t\t\"_mcc\": \"525\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"shwap\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SH Data Prepaid\",\r\n\t\t\t\t\"_carrier_id\": \"1707\",\r\n\t\t\t\t\"_mcc\": \"525\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"shppd\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SH IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1707\",\r\n\t\t\t\t\"_mcc\": \"525\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SH XCAP\",\r\n\t\t\t\t\"_carrier_id\": \"1707\",\r\n\t\t\t\t\"_mcc\": \"525\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"shxcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \" 亞太電信(APT) (Internet)\",\r\n\t\t\t\t\"_carrier_id\": \"1707\",\r\n\t\t\t\t\"_mcc\": \"525\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"gtnet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"0A\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SIMBA\",\r\n\t\t\t\t\"_mcc\": \"525\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"tpg\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"B-Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2350\",\r\n\t\t\t\t\"_mcc\": \"528\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DSTCom\",\r\n\t\t\t\t\"_carrier_id\": \"1379\",\r\n\t\t\t\t\"_mcc\": \"528\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VFNZ Gateway\",\r\n\t\t\t\t\"_carrier_id\": \"2364\",\r\n\t\t\t\t\"_mcc\": \"530\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"live.vodafone.com\",\r\n\t\t\t\t\"_mmsc\": \"http://pxt.vodafone.net.nz/pxtsend\",\r\n\t\t\t\t\"_mmsproxy\": \"172.30.38.3\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VFNZ Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2364\",\r\n\t\t\t\t\"_mcc\": \"530\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"vodafone\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Spark Internet\",\r\n\t\t\t\t\"_carrier_id\": \"968\",\r\n\t\t\t\t\"_mcc\": \"530\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_mmsc\": \"http://lsmmsc.xtra.co.nz\",\r\n\t\t\t\t\"_mmsproxy\": \"210.55.11.73\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Default\",\r\n\t\t\t\t\"_carrier_id\": \"2105\",\r\n\t\t\t\t\"_mcc\": \"530\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"wapaccess.co.nz\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"Skinny\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Content\",\r\n\t\t\t\t\"_carrier_id\": \"2105\",\r\n\t\t\t\t\"_mcc\": \"530\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"wapaccess.co.nz\",\r\n\t\t\t\t\"_proxy\": \"210.55.11.73\",\r\n\t\t\t\t\"_port\": \"80\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"Skinny\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Data\",\r\n\t\t\t\t\"_carrier_id\": \"2105\",\r\n\t\t\t\t\"_mcc\": \"530\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"wapaccess.co.nz\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"Skinny\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2105\",\r\n\t\t\t\t\"_mcc\": \"530\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"wapaccess.co.nz\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mmsaccess.co.nz\",\r\n\t\t\t\t\"_mmsproxy\": \"210.55.11.73\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"Skinny\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"2Degrees Internet\",\r\n\t\t\t\t\"_carrier_id\": \"969\",\r\n\t\t\t\t\"_mcc\": \"530\",\r\n\t\t\t\t\"_mnc\": \"24\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"2Degrees MMS\",\r\n\t\t\t\t\"_carrier_id\": \"969\",\r\n\t\t\t\t\"_mcc\": \"530\",\r\n\t\t\t\t\"_mnc\": \"24\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.2degreesmobile.net.nz:48090\",\r\n\t\t\t\t\"_mmsproxy\": \"118.148.1.118\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Digicel\",\r\n\t\t\t\t\"_mcc\": \"536\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BeMobile\",\r\n\t\t\t\t\"_carrier_id\": \"1649\",\r\n\t\t\t\t\"_mcc\": \"537\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Digicel PNG LTE\",\r\n\t\t\t\t\"_carrier_id\": \"1651\",\r\n\t\t\t\t\"_mcc\": \"537\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"lte\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"PNG WEB\",\r\n\t\t\t\t\"_carrier_id\": \"1651\",\r\n\t\t\t\t\"_mcc\": \"537\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.digicelpng.com\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"PNG MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1651\",\r\n\t\t\t\t\"_mcc\": \"537\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"wap.digicelpng.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.digicelpng.com:8990\",\r\n\t\t\t\t\"_mmsproxy\": \"10.149.83.116\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EMnify\",\r\n\t\t\t\t\"_carrier_id\": \"2326\",\r\n\t\t\t\t\"_mcc\": \"537\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"em\",\r\n\t\t\t\t\"_mvno_match_data\": \"5370309\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"U-Call\",\r\n\t\t\t\t\"_carrier_id\": \"1733\",\r\n\t\t\t\t\"_mcc\": \"539\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Shoreline Communication\",\r\n\t\t\t\t\"_carrier_id\": \"1734\",\r\n\t\t\t\t\"_mcc\": \"539\",\r\n\t\t\t\t\"_mnc\": \"43\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Digicel\",\r\n\t\t\t\t\"_carrier_id\": \"2220\",\r\n\t\t\t\t\"_mcc\": \"539\",\r\n\t\t\t\t\"_mnc\": \"88\",\r\n\t\t\t\t\"_apn\": \"web.digicelpacific.com\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tonga:Digicel:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"2220\",\r\n\t\t\t\t\"_mcc\": \"539\",\r\n\t\t\t\t\"_mnc\": \"88\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsproxy\": \"172.16.7.12\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.digicelgroup.com\",\r\n\t\t\t\t\"_mmsport\": \"9201\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BREEZE\",\r\n\t\t\t\t\"_carrier_id\": \"2185\",\r\n\t\t\t\t\"_mcc\": \"540\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BeMobile\",\r\n\t\t\t\t\"_carrier_id\": \"2123\",\r\n\t\t\t\t\"_mcc\": \"540\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"AIL\",\r\n\t\t\t\t\"_carrier_id\": \"2239\",\r\n\t\t\t\t\"_mcc\": \"541\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SMILE\",\r\n\t\t\t\t\"_carrier_id\": \"1301\",\r\n\t\t\t\t\"_mcc\": \"541\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Digicel\",\r\n\t\t\t\t\"_carrier_id\": \"2219\",\r\n\t\t\t\t\"_mcc\": \"541\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"web.digicelpacific.com\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vanatu:Digicel:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"2219\",\r\n\t\t\t\t\"_mcc\": \"541\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsproxy\": \"172.16.7.12\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.digicelgroup.com\",\r\n\t\t\t\t\"_mmsport\": \"9201\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone\",\r\n\t\t\t\t\"_carrier_id\": \"1481\",\r\n\t\t\t\t\"_mcc\": \"542\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Digicel\",\r\n\t\t\t\t\"_carrier_id\": \"2186\",\r\n\t\t\t\t\"_mcc\": \"542\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.digicelpacific.com\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Fiji:Digicel:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"2186\",\r\n\t\t\t\t\"_mcc\": \"542\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsproxy\": \"172.16.7.12\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.digicelgroup.com\",\r\n\t\t\t\t\"_mmsport\": \"9201\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bluesky\",\r\n\t\t\t\t\"_carrier_id\": \"1957\",\r\n\t\t\t\t\"_mcc\": \"544\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Kiribati - TSKL\",\r\n\t\t\t\t\"_carrier_id\": \"2240\",\r\n\t\t\t\t\"_mcc\": \"545\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Kiribati - Frigate Net\",\r\n\t\t\t\t\"_carrier_id\": \"2187\",\r\n\t\t\t\t\"_mcc\": \"545\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobilis\",\r\n\t\t\t\t\"_carrier_id\": \"943\",\r\n\t\t\t\t\"_mcc\": \"546\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vini\",\r\n\t\t\t\t\"_carrier_id\": \"1648\",\r\n\t\t\t\t\"_mcc\": \"547\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telecom Cook\",\r\n\t\t\t\t\"_carrier_id\": \"1426\",\r\n\t\t\t\t\"_mcc\": \"548\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Digicel\",\r\n\t\t\t\t\"_carrier_id\": \"1302\",\r\n\t\t\t\t\"_mcc\": \"549\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bluesky\",\r\n\t\t\t\t\"_carrier_id\": \"1876\",\r\n\t\t\t\t\"_mcc\": \"549\",\r\n\t\t\t\t\"_mnc\": \"27\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"FSMTC\",\r\n\t\t\t\t\"_carrier_id\": \"1482\",\r\n\t\t\t\t\"_mcc\": \"550\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MINTA\",\r\n\t\t\t\t\"_mcc\": \"551\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"PNCC\",\r\n\t\t\t\t\"_carrier_id\": \"1671\",\r\n\t\t\t\t\"_mcc\": \"552\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Palau Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2188\",\r\n\t\t\t\t\"_mcc\": \"552\",\r\n\t\t\t\t\"_mnc\": \"80\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobinil Web\",\r\n\t\t\t\t\"_carrier_id\": \"675\",\r\n\t\t\t\t\"_mcc\": \"602\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mobinilweb\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobinil MMS\",\r\n\t\t\t\t\"_carrier_id\": \"675\",\r\n\t\t\t\t\"_mcc\": \"602\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mobinilmms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.7.13.24:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"62.241.155.45\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"vodafone internet\",\r\n\t\t\t\t\"_carrier_id\": \"2380\",\r\n\t\t\t\t\"_mcc\": \"602\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet.vodafone.net\",\r\n\t\t\t\t\"_user\": \"internet\",\r\n\t\t\t\t\"_password\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2380\",\r\n\t\t\t\t\"_mcc\": \"602\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms.vodafone.com.eg\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vodafone.com.eg/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"163.121.178.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Etisalat Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1968\",\r\n\t\t\t\t\"_mcc\": \"602\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"etisalat\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Etisalat MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1968\",\r\n\t\t\t\t\"_mcc\": \"602\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"etisalat\",\r\n\t\t\t\t\"_mmsc\": \"http://10.71.131.7:38090\",\r\n\t\t\t\t\"_mmsproxy\": \"10.71.130.29\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mobilis wap\",\r\n\t\t\t\t\"_carrier_id\": \"1470\",\r\n\t\t\t\t\"_mcc\": \"603\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_proxy\": \"172.25.49.2\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobilis internet\",\r\n\t\t\t\t\"_carrier_id\": \"1470\",\r\n\t\t\t\t\"_mcc\": \"603\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"internet\",\r\n\t\t\t\t\"_password\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobilis mms\",\r\n\t\t\t\t\"_carrier_id\": \"1470\",\r\n\t\t\t\t\"_mcc\": \"603\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://172.25.49.9/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.25.49.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"djezzy.internet\",\r\n\t\t\t\t\"_carrier_id\": \"1471\",\r\n\t\t\t\t\"_mcc\": \"603\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"djezzy.internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"djezzy.mms\",\r\n\t\t\t\t\"_carrier_id\": \"1471\",\r\n\t\t\t\t\"_mcc\": \"603\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"djezzy.mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://172.24.97.152:6021/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"172.24.97.158\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ooredoo internet\",\r\n\t\t\t\t\"_carrier_id\": \"1977\",\r\n\t\t\t\t\"_mcc\": \"603\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_authtype\": \"1\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ooredoo mms\",\r\n\t\t\t\t\"_carrier_id\": \"1977\",\r\n\t\t\t\t\"_mcc\": \"603\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ooredoomms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.10.111.1\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.52.3\",\r\n\t\t\t\t\"_mmsport\": \"3128\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"902\",\r\n\t\t\t\t\"_mcc\": \"604\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"internet.orange.ma\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MobileZone\",\r\n\t\t\t\t\"_carrier_id\": \"903\",\r\n\t\t\t\t\"_mcc\": \"604\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"wap.iamgprs.ma\",\r\n\t\t\t\t\"_proxy\": \"212.217.54.133\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"903\",\r\n\t\t\t\t\"_mcc\": \"604\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"www.iamgprs1.ma\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS IAM\",\r\n\t\t\t\t\"_carrier_id\": \"903\",\r\n\t\t\t\t\"_mcc\": \"604\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mmsiam\",\r\n\t\t\t\t\"_mmsc\": \"http://mms:8002/\",\r\n\t\t\t\t\"_mmsproxy\": \"10.16.35.50\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"WEB\",\r\n\t\t\t\t\"_carrier_id\": \"1985\",\r\n\t\t\t\t\"_mcc\": \"604\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"www.wana.ma\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1985\",\r\n\t\t\t\t\"_mcc\": \"604\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"www.wana.ma\",\r\n\t\t\t\t\"_proxy\": \"10.86.0.10\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1985\",\r\n\t\t\t\t\"_mcc\": \"604\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms.wana.ma\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.wana.ma:38090\",\r\n\t\t\t\t\"_mmsproxy\": \"10.86.0.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"weborange\",\r\n\t\t\t\t\"_carrier_id\": \"1936\",\r\n\t\t\t\t\"_mcc\": \"605\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"weborange\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS Orange\",\r\n\t\t\t\t\"_carrier_id\": \"1936\",\r\n\t\t\t\t\"_mcc\": \"605\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.otun\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.orange.tn\",\r\n\t\t\t\t\"_mmsproxy\": \"10.12.1.52\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1731\",\r\n\t\t\t\t\"_mcc\": \"605\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet.tn\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet Portail\",\r\n\t\t\t\t\"_carrier_id\": \"1731\",\r\n\t\t\t\t\"_mcc\": \"605\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"gprs.tn\",\r\n\t\t\t\t\"_user\": \"gprs\",\r\n\t\t\t\t\"_password\": \"gprs\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tunisie Telecom MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1731\",\r\n\t\t\t\t\"_mcc\": \"605\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms.tn\",\r\n\t\t\t\t\"_user\": \"mms@tt1\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.0.3:19090/was\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.0.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ooredoo TN Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1732\",\r\n\t\t\t\t\"_mcc\": \"605\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.ooredoo.tn\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ooredoo TN MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1732\",\r\n\t\t\t\t\"_mcc\": \"605\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms.ooredoo.tn\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.ooredoo.tn\",\r\n\t\t\t\t\"_mmsproxy\": \"10.3.2.100\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Libyana\",\r\n\t\t\t\t\"_carrier_id\": \"1973\",\r\n\t\t\t\t\"_mcc\": \"606\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Libyana MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1973\",\r\n\t\t\t\t\"_mcc\": \"606\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.8.148\",\r\n\t\t\t\t\"_mmsc\": \"http://62.240.62.180:80\",\r\n\t\t\t\t\"_mmsport\": \"8000\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Madar\",\r\n\t\t\t\t\"_carrier_id\": \"2006\",\r\n\t\t\t\t\"_mcc\": \"606\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"almadar IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2006\",\r\n\t\t\t\t\"_mcc\": \"606\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"almadar XCAP\",\r\n\t\t\t\t\"_carrier_id\": \"2006\",\r\n\t\t\t\t\"_mcc\": \"606\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Al-Jeel Phone\",\r\n\t\t\t\t\"_carrier_id\": \"2189\",\r\n\t\t\t\t\"_mcc\": \"606\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Libya Phone\",\r\n\t\t\t\t\"_carrier_id\": \"2348\",\r\n\t\t\t\t\"_mcc\": \"606\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hatef Libya\",\r\n\t\t\t\t\"_carrier_id\": \"2190\",\r\n\t\t\t\t\"_mcc\": \"606\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Gamcel\",\r\n\t\t\t\t\"_carrier_id\": \"736\",\r\n\t\t\t\t\"_mcc\": \"607\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Africel\",\r\n\t\t\t\t\"_carrier_id\": \"737\",\r\n\t\t\t\t\"_mcc\": \"607\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Comium\",\r\n\t\t\t\t\"_carrier_id\": \"738\",\r\n\t\t\t\t\"_mcc\": \"607\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"QCell\",\r\n\t\t\t\t\"_carrier_id\": \"2191\",\r\n\t\t\t\t\"_mcc\": \"607\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange MMS SN\",\r\n\t\t\t\t\"_carrier_id\": \"1721\",\r\n\t\t\t\t\"_mcc\": \"608\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsalize/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.16.30.9\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Wap SN\",\r\n\t\t\t\t\"_carrier_id\": \"1721\",\r\n\t\t\t\t\"_mcc\": \"608\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_proxy\": \"172.16.30.9\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Web SN\",\r\n\t\t\t\t\"_carrier_id\": \"1721\",\r\n\t\t\t\t\"_mcc\": \"608\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"internet\",\r\n\t\t\t\t\"_password\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tigo Internet SN\",\r\n\t\t\t\t\"_carrier_id\": \"1722\",\r\n\t\t\t\t\"_mcc\": \"608\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.sentel.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Expresso Internet SN\",\r\n\t\t\t\t\"_carrier_id\": \"2192\",\r\n\t\t\t\t\"_mcc\": \"608\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"expresso\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_proxy\": \"10.71.123.69\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mattel\",\r\n\t\t\t\t\"_carrier_id\": \"1616\",\r\n\t\t\t\t\"_mcc\": \"609\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Chinguitel\",\r\n\t\t\t\t\"_carrier_id\": \"1617\",\r\n\t\t\t\t\"_mcc\": \"609\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mauritel\",\r\n\t\t\t\t\"_carrier_id\": \"1618\",\r\n\t\t\t\t\"_mcc\": \"609\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange 3G/4G\",\r\n\t\t\t\t\"_carrier_id\": \"2034\",\r\n\t\t\t\t\"_mcc\": \"610\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"internet\",\r\n\t\t\t\t\"_password\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange ML MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2034\",\r\n\t\t\t\t\"_mcc\": \"610\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.109.6.2/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.109.4.35\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Wap ML\",\r\n\t\t\t\t\"_carrier_id\": \"2034\",\r\n\t\t\t\t\"_mcc\": \"610\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_proxy\": \"10.109.4.35\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange S.A.\",\r\n\t\t\t\t\"_carrier_id\": \"739\",\r\n\t\t\t\t\"_mcc\": \"611\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sotelgui\",\r\n\t\t\t\t\"_carrier_id\": \"740\",\r\n\t\t\t\t\"_mcc\": \"611\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telecel Guinee\",\r\n\t\t\t\t\"_carrier_id\": \"2193\",\r\n\t\t\t\t\"_mcc\": \"611\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN\",\r\n\t\t\t\t\"_carrier_id\": \"2225\",\r\n\t\t\t\t\"_mcc\": \"611\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cellcom\",\r\n\t\t\t\t\"_carrier_id\": \"741\",\r\n\t\t\t\t\"_mcc\": \"611\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Moov Internet CI\",\r\n\t\t\t\t\"_carrier_id\": \"1420\",\r\n\t\t\t\t\"_mcc\": \"612\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"moov\",\r\n\t\t\t\t\"_user\": \"web\",\r\n\t\t\t\t\"_password\": \"web\",\r\n\t\t\t\t\"_proxy\": \"10.172.11.17\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Oweb\",\r\n\t\t\t\t\"_carrier_id\": \"1421\",\r\n\t\t\t\t\"_mcc\": \"612\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"orangeciweb\",\r\n\t\t\t\t\"_user\": \"web\",\r\n\t\t\t\t\"_password\": \"web\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"OWORLD CI\",\r\n\t\t\t\t\"_carrier_id\": \"1421\",\r\n\t\t\t\t\"_mcc\": \"612\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"orangeciwap\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_proxy\": \"172.20.4.33\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Omms CI\",\r\n\t\t\t\t\"_carrier_id\": \"1421\",\r\n\t\t\t\t\"_mcc\": \"612\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"orangecimms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://172.20.6.1/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.20.4.33\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Koz Internet CI\",\r\n\t\t\t\t\"_carrier_id\": \"1422\",\r\n\t\t\t\t\"_mcc\": \"612\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"gprs.koz.ci\",\r\n\t\t\t\t\"_user\": \"web\",\r\n\t\t\t\t\"_password\": \"web\",\r\n\t\t\t\t\"_proxy\": \"10.20.3.10\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN Internet CI\",\r\n\t\t\t\t\"_carrier_id\": \"1423\",\r\n\t\t\t\t\"_mcc\": \"612\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"web.mtn.ci\",\r\n\t\t\t\t\"_user\": \"vide\",\r\n\t\t\t\t\"_password\": \"vide\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telmob\",\r\n\t\t\t\t\"_carrier_id\": \"1946\",\r\n\t\t\t\t\"_mcc\": \"613\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel\",\r\n\t\t\t\t\"_carrier_id\": \"1368\",\r\n\t\t\t\t\"_mcc\": \"613\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telecel Faso\",\r\n\t\t\t\t\"_carrier_id\": \"1369\",\r\n\t\t\t\t\"_mcc\": \"613\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange MMS\",\r\n\t\t\t\t\"_apn\": \"orange.mms\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_mmsc\": \"http://10.10.10.35:38090/was\",\r\n\t\t\t\t\"_mmsproxy\": \"10.10.10.36\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_carrier_id\": \"1943\",\r\n\t\t\t\t\"_mcc\": \"614\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Internet\",\r\n\t\t\t\t\"_apn\": \"orange.ne\",\r\n\t\t\t\t\"_carrier_id\": \"1943\",\r\n\t\t\t\t\"_mcc\": \"614\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Togo Cell\",\r\n\t\t\t\t\"_carrier_id\": \"1095\",\r\n\t\t\t\t\"_mcc\": \"615\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Moov\",\r\n\t\t\t\t\"_carrier_id\": \"1947\",\r\n\t\t\t\t\"_mcc\": \"615\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Libercom\",\r\n\t\t\t\t\"_carrier_id\": \"1376\",\r\n\t\t\t\t\"_mcc\": \"616\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Moov\",\r\n\t\t\t\t\"_carrier_id\": \"1377\",\r\n\t\t\t\t\"_mcc\": \"616\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN\",\r\n\t\t\t\t\"_carrier_id\": \"1378\",\r\n\t\t\t\t\"_mcc\": \"616\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BBCOM\",\r\n\t\t\t\t\"_carrier_id\": \"1944\",\r\n\t\t\t\t\"_mcc\": \"616\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Glo\",\r\n\t\t\t\t\"_carrier_id\": \"1945\",\r\n\t\t\t\t\"_mcc\": \"616\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange MMS\",\r\n\t\t\t\t\"_apn\": \"orangemms\",\r\n\t\t\t\t\"_user\": \"mmsc\",\r\n\t\t\t\t\"_password\": \"mmsc\",\r\n\t\t\t\t\"_mmsc\": \"http://10.2.1.20:8514\",\r\n\t\t\t\t\"_mmsproxy\": \"10.2.1.20\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_carrier_id\": \"1621\",\r\n\t\t\t\t\"_mcc\": \"617\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Internet\",\r\n\t\t\t\t\"_apn\": \"orange\",\r\n\t\t\t\t\"_carrier_id\": \"1621\",\r\n\t\t\t\t\"_mcc\": \"617\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lonestar Cell\",\r\n\t\t\t\t\"_carrier_id\": \"2194\",\r\n\t\t\t\t\"_mcc\": \"618\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Libercell\",\r\n\t\t\t\t\"_carrier_id\": \"2195\",\r\n\t\t\t\t\"_mcc\": \"618\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Comium\",\r\n\t\t\t\t\"_carrier_id\": \"1601\",\r\n\t\t\t\t\"_mcc\": \"618\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange\",\r\n\t\t\t\t\"_carrier_id\": \"2035\",\r\n\t\t\t\t\"_mcc\": \"618\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"Orange\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LIBTELCO\",\r\n\t\t\t\t\"_carrier_id\": \"2196\",\r\n\t\t\t\t\"_mcc\": \"618\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel\",\r\n\t\t\t\t\"_carrier_id\": \"1716\",\r\n\t\t\t\t\"_mcc\": \"619\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tigo\",\r\n\t\t\t\t\"_carrier_id\": \"1717\",\r\n\t\t\t\t\"_mcc\": \"619\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Africell\",\r\n\t\t\t\t\"_carrier_id\": \"1718\",\r\n\t\t\t\t\"_mcc\": \"619\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Comium\",\r\n\t\t\t\t\"_carrier_id\": \"1074\",\r\n\t\t\t\t\"_mcc\": \"619\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Africell\",\r\n\t\t\t\t\"_carrier_id\": \"1075\",\r\n\t\t\t\t\"_mcc\": \"619\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mobitel\",\r\n\t\t\t\t\"_carrier_id\": \"1076\",\r\n\t\t\t\t\"_mcc\": \"619\",\r\n\t\t\t\t\"_mnc\": \"25\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN Internet GH\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_carrier_id\": \"1515\",\r\n\t\t\t\t\"_mcc\": \"620\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1515\",\r\n\t\t\t\t\"_mcc\": \"620\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsproxy\": \"172.17.3.7\",\r\n\t\t\t\t\"_mmsc\": \"http://172.17.3.7\",\r\n\t\t\t\t\"_mmsport\": \"8080\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone Internet GH\",\r\n\t\t\t\t\"_apn\": \"browse\",\r\n\t\t\t\t\"_carrier_id\": \"2383\",\r\n\t\t\t\t\"_mcc\": \"620\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodafone_mms\",\r\n\t\t\t\t\"_carrier_id\": \"2383\",\r\n\t\t\t\t\"_mcc\": \"620\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsproxy\": \"172.24.97.1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vodaphone.com.gh/mms\",\r\n\t\t\t\t\"_mmsport\": \"9201\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tigo Internet GH\",\r\n\t\t\t\t\"_apn\": \"web.tigo.com.gh\",\r\n\t\t\t\t\"_carrier_id\": \"2108\",\r\n\t\t\t\t\"_mcc\": \"620\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tigo mms\",\r\n\t\t\t\t\"_carrier_id\": \"2108\",\r\n\t\t\t\t\"_mcc\": \"620\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms.tigo.com.gh\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.1.7\",\r\n\t\t\t\t\"_mmsc\": \"http://mms/\",\r\n\t\t\t\t\"_mmsport\": \"8080\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel Internet GH\",\r\n\t\t\t\t\"_apn\": \"wap\",\r\n\t\t\t\t\"_carrier_id\": \"2108\",\r\n\t\t\t\t\"_mcc\": \"620\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_proxy\": \"10.93.85.88\",\r\n\t\t\t\t\"_port\": \"9201\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel mms\",\r\n\t\t\t\t\"_carrier_id\": \"2108\",\r\n\t\t\t\t\"_mcc\": \"620\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"airtelmms.com\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsproxy\": \"100.1.201.172\",\r\n\t\t\t\t\"_mmsc\": \"http://100.1.201.171:10021/mmsc\",\r\n\t\t\t\t\"_mmsport\": \"8799\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Glo Internet GH\",\r\n\t\t\t\t\"_apn\": \"glowap\",\r\n\t\t\t\t\"_carrier_id\": \"2222\",\r\n\t\t\t\t\"_mcc\": \"620\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_user\": \"glo\",\r\n\t\t\t\t\"_password\": \"glo\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_proxy\": \"10.161.85.4\",\r\n\t\t\t\t\"_port\": \"8799\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1638\",\r\n\t\t\t\t\"_mcc\": \"621\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"internet.ng.zain.com\",\r\n\t\t\t\t\"_user\": \"internet\",\r\n\t\t\t\t\"_password\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1638\",\r\n\t\t\t\t\"_mcc\": \"621\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"mms.ng.zain.com\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://10.210.3.239:9800/mm1\",\r\n\t\t\t\t\"_mmsproxy\": \"172.18.254.5\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1638\",\r\n\t\t\t\t\"_mcc\": \"621\",\r\n\t\t\t\t\"_mnc\": \"20\",\r\n\t\t\t\t\"_apn\": \"wap.ng.zain.com\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_proxy\": \"172.18.254.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN-WEB\",\r\n\t\t\t\t\"_carrier_id\": \"1639\",\r\n\t\t\t\t\"_mcc\": \"621\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"web\",\r\n\t\t\t\t\"_password\": \"web\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN ACESS\",\r\n\t\t\t\t\"_carrier_id\": \"1639\",\r\n\t\t\t\t\"_mcc\": \"621\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"web.gprs.mtnnigeria.net\",\r\n\t\t\t\t\"_user\": \"web\",\r\n\t\t\t\t\"_password\": \"web\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1639\",\r\n\t\t\t\t\"_mcc\": \"621\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"web.gprs.mtnnigeria.net\",\r\n\t\t\t\t\"_mmsc\": \"http://10.199.212.8/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.199.212.2\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Glo Direct\",\r\n\t\t\t\t\"_carrier_id\": \"2115\",\r\n\t\t\t\t\"_mcc\": \"621\",\r\n\t\t\t\t\"_mnc\": \"50\",\r\n\t\t\t\t\"_apn\": \"glosecure\",\r\n\t\t\t\t\"_user\": \"gprs\",\r\n\t\t\t\t\"_password\": \"gprs\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Glo MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2115\",\r\n\t\t\t\t\"_mcc\": \"621\",\r\n\t\t\t\t\"_mnc\": \"50\",\r\n\t\t\t\t\"_apn\": \"glomms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.gloworld.com/mmsc\",\r\n\t\t\t\t\"_mmsproxy\": \"10.100.82.4\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"etisalat WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1979\",\r\n\t\t\t\t\"_mcc\": \"621\",\r\n\t\t\t\t\"_mnc\": \"60\",\r\n\t\t\t\t\"_apn\": \"etisalat\",\r\n\t\t\t\t\"_proxy\": \"10.71.170.5\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"etisalat MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1979\",\r\n\t\t\t\t\"_mcc\": \"621\",\r\n\t\t\t\t\"_mnc\": \"60\",\r\n\t\t\t\t\"_apn\": \"etisalat\",\r\n\t\t\t\t\"_mmsc\": \"http://10.71.170.30:38090/was\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel\",\r\n\t\t\t\t\"_carrier_id\": \"1093\",\r\n\t\t\t\t\"_mcc\": \"622\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tawali\",\r\n\t\t\t\t\"_carrier_id\": \"1094\",\r\n\t\t\t\t\"_mcc\": \"622\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tigo\",\r\n\t\t\t\t\"_carrier_id\": \"2227\",\r\n\t\t\t\t\"_mcc\": \"622\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Salam\",\r\n\t\t\t\t\"_carrier_id\": \"2197\",\r\n\t\t\t\t\"_mcc\": \"622\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CTP\",\r\n\t\t\t\t\"_carrier_id\": \"1408\",\r\n\t\t\t\t\"_mcc\": \"623\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TC\",\r\n\t\t\t\t\"_carrier_id\": \"1409\",\r\n\t\t\t\t\"_mcc\": \"623\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet browsing\",\r\n\t\t\t\t\"_carrier_id\": \"1410\",\r\n\t\t\t\t\"_mcc\": \"623\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"orangeca3g\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nationlink\",\r\n\t\t\t\t\"_carrier_id\": \"2198\",\r\n\t\t\t\t\"_mcc\": \"623\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange CM\",\r\n\t\t\t\t\"_carrier_id\": \"1434\",\r\n\t\t\t\t\"_mcc\": \"624\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"orangecmgprs\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_proxy\": \"192.168.122.101\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.orange.cm\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.122.101\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CVMOVEL\",\r\n\t\t\t\t\"_carrier_id\": \"1445\",\r\n\t\t\t\t\"_mcc\": \"625\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T+\",\r\n\t\t\t\t\"_carrier_id\": \"1446\",\r\n\t\t\t\t\"_mcc\": \"625\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CSTmovel\",\r\n\t\t\t\t\"_carrier_id\": \"1086\",\r\n\t\t\t\t\"_mcc\": \"626\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange GQ\",\r\n\t\t\t\t\"_carrier_id\": \"746\",\r\n\t\t\t\t\"_mcc\": \"627\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange GQ MMS\",\r\n\t\t\t\t\"_carrier_id\": \"746\",\r\n\t\t\t\t\"_mcc\": \"627\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"orangemms\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.17.2\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.17.34/servlets/mms\",\r\n\t\t\t\t\"_mmsport\": \"8080\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hits GQ\",\r\n\t\t\t\t\"_carrier_id\": \"2199\",\r\n\t\t\t\t\"_mcc\": \"627\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Libertis\",\r\n\t\t\t\t\"_carrier_id\": \"1488\",\r\n\t\t\t\t\"_mcc\": \"628\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Moov\",\r\n\t\t\t\t\"_carrier_id\": \"1489\",\r\n\t\t\t\t\"_mcc\": \"628\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel\",\r\n\t\t\t\t\"_carrier_id\": \"1490\",\r\n\t\t\t\t\"_mcc\": \"628\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Azur\",\r\n\t\t\t\t\"_carrier_id\": \"2200\",\r\n\t\t\t\t\"_mcc\": \"628\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel\",\r\n\t\t\t\t\"_carrier_id\": \"1411\",\r\n\t\t\t\t\"_mcc\": \"629\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Libertis Telecom\",\r\n\t\t\t\t\"_carrier_id\": \"1412\",\r\n\t\t\t\t\"_mcc\": \"629\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodacom Internet CD\",\r\n\t\t\t\t\"_carrier_id\": \"1405\",\r\n\t\t\t\t\"_mcc\": \"630\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"vodanet\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodacom MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1405\",\r\n\t\t\t\t\"_mcc\": \"630\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"vodalive\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsproxy\": \"172.24.97.1\",\r\n\t\t\t\t\"_mmsc\": \"http://172.24.97.1/mmsc\",\r\n\t\t\t\t\"_mmsport\": \"8080\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tigo Internet CD\",\r\n\t\t\t\t\"_carrier_id\": \"2036\",\r\n\t\t\t\t\"_mcc\": \"630\",\r\n\t\t\t\t\"_mnc\": \"89\",\r\n\t\t\t\t\"_apn\": \"tigo.web\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"UNITEL\",\r\n\t\t\t\t\"_carrier_id\": \"1334\",\r\n\t\t\t\t\"_mcc\": \"631\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MOVICEL\",\r\n\t\t\t\t\"_carrier_id\": \"2201\",\r\n\t\t\t\t\"_mcc\": \"631\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Areeba\",\r\n\t\t\t\t\"_carrier_id\": \"1524\",\r\n\t\t\t\t\"_mcc\": \"632\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Bissau\",\r\n\t\t\t\t\"_carrier_id\": \"1948\",\r\n\t\t\t\t\"_mcc\": \"632\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"4Gogb\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Guinetel\",\r\n\t\t\t\t\"_carrier_id\": \"2241\",\r\n\t\t\t\t\"_mcc\": \"632\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cable & Wireless\",\r\n\t\t\t\t\"_carrier_id\": \"1685\",\r\n\t\t\t\t\"_mcc\": \"633\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Mediatech International\",\r\n\t\t\t\t\"_carrier_id\": \"1686\",\r\n\t\t\t\t\"_mcc\": \"633\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel\",\r\n\t\t\t\t\"_carrier_id\": \"1687\",\r\n\t\t\t\t\"_mcc\": \"633\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Zain SD\",\r\n\t\t\t\t\"_carrier_id\": \"1688\",\r\n\t\t\t\t\"_mcc\": \"634\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN\",\r\n\t\t\t\t\"_carrier_id\": \"1689\",\r\n\t\t\t\t\"_mcc\": \"634\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sudani One\",\r\n\t\t\t\t\"_carrier_id\": \"2202\",\r\n\t\t\t\t\"_mcc\": \"634\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Privet Network\",\r\n\t\t\t\t\"_carrier_id\": \"2242\",\r\n\t\t\t\t\"_mcc\": \"634\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN\",\r\n\t\t\t\t\"_carrier_id\": \"1682\",\r\n\t\t\t\t\"_mcc\": \"635\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Rwandatel\",\r\n\t\t\t\t\"_carrier_id\": \"2243\",\r\n\t\t\t\t\"_mcc\": \"635\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tigo\",\r\n\t\t\t\t\"_carrier_id\": \"2203\",\r\n\t\t\t\t\"_mcc\": \"635\",\r\n\t\t\t\t\"_mnc\": \"13\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel\",\r\n\t\t\t\t\"_carrier_id\": \"2204\",\r\n\t\t\t\t\"_mcc\": \"635\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ETH-MTN\",\r\n\t\t\t\t\"_carrier_id\": \"681\",\r\n\t\t\t\t\"_mcc\": \"636\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telesom\",\r\n\t\t\t\t\"_carrier_id\": \"2205\",\r\n\t\t\t\t\"_mcc\": \"637\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Somafone\",\r\n\t\t\t\t\"_carrier_id\": \"2244\",\r\n\t\t\t\t\"_mcc\": \"637\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nationlink\",\r\n\t\t\t\t\"_carrier_id\": \"2206\",\r\n\t\t\t\t\"_mcc\": \"637\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hormuud\",\r\n\t\t\t\t\"_carrier_id\": \"2245\",\r\n\t\t\t\t\"_mcc\": \"637\",\r\n\t\t\t\t\"_mnc\": \"25\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Golis\",\r\n\t\t\t\t\"_carrier_id\": \"1082\",\r\n\t\t\t\t\"_mcc\": \"637\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Unittel\",\r\n\t\t\t\t\"_carrier_id\": \"2246\",\r\n\t\t\t\t\"_mcc\": \"637\",\r\n\t\t\t\t\"_mnc\": \"57\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Nationlink Telecom\",\r\n\t\t\t\t\"_mcc\": \"637\",\r\n\t\t\t\t\"_mnc\": \"60\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Somtel\",\r\n\t\t\t\t\"_carrier_id\": \"2207\",\r\n\t\t\t\t\"_mcc\": \"637\",\r\n\t\t\t\t\"_mnc\": \"71\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telcom\",\r\n\t\t\t\t\"_carrier_id\": \"2208\",\r\n\t\t\t\t\"_mcc\": \"637\",\r\n\t\t\t\t\"_mnc\": \"82\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Evatis\",\r\n\t\t\t\t\"_carrier_id\": \"1462\",\r\n\t\t\t\t\"_mcc\": \"638\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"safaricom GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"865\",\r\n\t\t\t\t\"_mcc\": \"639\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"safaricom\",\r\n\t\t\t\t\"_user\": \"saf\",\r\n\t\t\t\t\"_password\": \"data\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_proxy\": \"172.22.2.38\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"safaricom mms\",\r\n\t\t\t\t\"_carrier_id\": \"865\",\r\n\t\t\t\t\"_mcc\": \"639\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"safaricom\",\r\n\t\t\t\t\"_user\": \"saf\",\r\n\t\t\t\t\"_password\": \"data\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsproxy\": \"172.22.2.38\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.gprs.safaricom.com\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel Internet\",\r\n\t\t\t\t\"_carrier_id\": \"866\",\r\n\t\t\t\t\"_mcc\": \"639\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel mms\",\r\n\t\t\t\t\"_carrier_id\": \"866\",\r\n\t\t\t\t\"_mcc\": \"639\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ke.airtel.com:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"172.30.9.8\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel\",\r\n\t\t\t\t\"_carrier_id\": \"866\",\r\n\t\t\t\t\"_mcc\": \"639\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ke.celtel.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mms\",\r\n\t\t\t\t\"_carrier_id\": \"866\",\r\n\t\t\t\t\"_mcc\": \"639\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ke.celtel.com\",\r\n\t\t\t\t\"_mmsproxy\": \"172.30.8.50\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ke.celtel.com/servlets/mms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Yu Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2209\",\r\n\t\t\t\t\"_mcc\": \"639\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"Internet\",\r\n\t\t\t\t\"_proxy\": \"10.4.16.6\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.16.6\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.16.22/servlets/mms\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Yu mms\",\r\n\t\t\t\t\"_carrier_id\": \"2209\",\r\n\t\t\t\t\"_mcc\": \"639\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"Yu\",\r\n\t\t\t\t\"_mmsproxy\": \"10.4.16.6\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://10.4.16.22/servlets/mms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2210\",\r\n\t\t\t\t\"_mcc\": \"639\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"bew.orange.co.ke\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange net KE\",\r\n\t\t\t\t\"_carrier_id\": \"2210\",\r\n\t\t\t\t\"_mcc\": \"639\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"bew.orange.co.ke\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2210\",\r\n\t\t\t\t\"_mcc\": \"639\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"mms.orange.co.ke\",\r\n\t\t\t\t\"_mmsproxy\": \"10.36.17.130\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://10.36.16.5/servlets/mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodacom WAP\",\r\n\t\t\t\t\"_carrier_id\": \"1744\",\r\n\t\t\t\t\"_mcc\": \"640\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"Wap\",\r\n\t\t\t\t\"_proxy\": \"10.154.0.8\",\r\n\t\t\t\t\"_port\": \"9401\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"VodaCom Tanzania\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodacom MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1744\",\r\n\t\t\t\t\"_mcc\": \"640\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://10.154.0.12/mms/\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"VodaCom Tanzania\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel Internet UG\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_carrier_id\": \"1753\",\r\n\t\t\t\t\"_mcc\": \"641\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN-WEB\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_carrier_id\": \"1754\",\r\n\t\t\t\t\"_mcc\": \"641\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"UTL Internet UG\",\r\n\t\t\t\t\"_apn\": \"utweb\",\r\n\t\t\t\t\"_carrier_id\": \"1755\",\r\n\t\t\t\t\"_mcc\": \"641\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_proxy\": \"10.76.101.51\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange Internet UG\",\r\n\t\t\t\t\"_carrier_id\": \"1756\",\r\n\t\t\t\t\"_mcc\": \"641\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"orange.ug\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1756\",\r\n\t\t\t\t\"_mcc\": \"641\",\r\n\t\t\t\t\"_mnc\": \"14\",\r\n\t\t\t\t\"_apn\": \"orangemms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms/\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Warid Telecom Internet UG\",\r\n\t\t\t\t\"_apn\": \"web.waridtel.co.ug\",\r\n\t\t\t\t\"_carrier_id\": \"1757\",\r\n\t\t\t\t\"_mcc\": \"641\",\r\n\t\t\t\t\"_mnc\": \"22\",\r\n\t\t\t\t\"_proxy\": \"10.5.27.80\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_mcc\": \"641\",\r\n\t\t\t\t\"_mnc\": \"26\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.ug\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Spacetel\",\r\n\t\t\t\t\"_carrier_id\": \"1373\",\r\n\t\t\t\t\"_mcc\": \"642\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tempo\",\r\n\t\t\t\t\"_carrier_id\": \"1374\",\r\n\t\t\t\t\"_mcc\": \"642\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Onatel\",\r\n\t\t\t\t\"_carrier_id\": \"1375\",\r\n\t\t\t\t\"_mcc\": \"642\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Smart Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2355\",\r\n\t\t\t\t\"_mcc\": \"642\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HiTs Telecom\",\r\n\t\t\t\t\"_carrier_id\": \"2211\",\r\n\t\t\t\t\"_mcc\": \"642\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Leo\",\r\n\t\t\t\t\"_carrier_id\": \"2212\",\r\n\t\t\t\t\"_mcc\": \"642\",\r\n\t\t\t\t\"_mnc\": \"82\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mCel\",\r\n\t\t\t\t\"_carrier_id\": \"1634\",\r\n\t\t\t\t\"_mcc\": \"643\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movitel\",\r\n\t\t\t\t\"_carrier_id\": \"2213\",\r\n\t\t\t\t\"_mcc\": \"643\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodacom\",\r\n\t\t\t\t\"_carrier_id\": \"2381\",\r\n\t\t\t\t\"_mcc\": \"643\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel\",\r\n\t\t\t\t\"_carrier_id\": \"1319\",\r\n\t\t\t\t\"_mcc\": \"645\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN\",\r\n\t\t\t\t\"_carrier_id\": \"1320\",\r\n\t\t\t\t\"_mcc\": \"645\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ZAMTEL\",\r\n\t\t\t\t\"_carrier_id\": \"1321\",\r\n\t\t\t\t\"_mcc\": \"645\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange MG Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1606\",\r\n\t\t\t\t\"_mcc\": \"646\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"orangenet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,dun\",\r\n\t\t\t\t\"_authtype\": \"0\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange World MG\",\r\n\t\t\t\t\"_carrier_id\": \"1606\",\r\n\t\t\t\t\"_mcc\": \"646\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"orangeworld\",\r\n\t\t\t\t\"_user\": \"world\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_proxy\": \"10.150.0.115\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange MG MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1606\",\r\n\t\t\t\t\"_mcc\": \"646\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"orangemms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_mmsc\": \"http://10.152.10.70.38090\",\r\n\t\t\t\t\"_mmsproxy\": \"10.150.0.115\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange RE\",\r\n\t\t\t\t\"_carrier_id\": \"1676\",\r\n\t\t\t\t\"_mcc\": \"647\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"orangerun\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange RE IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1676\",\r\n\t\t\t\t\"_mcc\": \"647\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange RE MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1676\",\r\n\t\t\t\t\"_mcc\": \"647\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"orangerun.acte\",\r\n\t\t\t\t\"_user\": \"orange\",\r\n\t\t\t\t\"_password\": \"orange\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.orange.re\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.10.200\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Only Internet\",\r\n\t\t\t\t\"_mcc\": \"647\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"f004\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Only MMS\",\r\n\t\t\t\t\"_mcc\": \"647\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.telcooi.re:9091\",\r\n\t\t\t\t\"_mvno_match_data\": \"f004\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Free Re\",\r\n\t\t\t\t\"_carrier_id\": \"2127\",\r\n\t\t\t\t\"_mcc\": \"647\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"free.re\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.free.re\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,hipri\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telco OI Re\",\r\n\t\t\t\t\"_mcc\": \"647\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.telco.re\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.telco.re\",\r\n\t\t\t\t\"_mvno_match_data\": \"f006\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SFR LTE\",\r\n\t\t\t\t\"_carrier_id\": \"1008\",\r\n\t\t\t\t\"_mcc\": \"647\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SFR webphone\",\r\n\t\t\t\t\"_carrier_id\": \"1008\",\r\n\t\t\t\t\"_mcc\": \"647\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"sl2sfr\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.224.145\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_type\": \"default,supl,hipri,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1008\",\r\n\t\t\t\t\"_mcc\": \"647\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mmssfr\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.224.145\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SFR option modem\",\r\n\t\t\t\t\"_carrier_id\": \"1008\",\r\n\t\t\t\t\"_mcc\": \"647\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"websfr\",\r\n\t\t\t\t\"_type\": \"dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Coriolis WAP\",\r\n\t\t\t\t\"_carrier_id\": \"2135\",\r\n\t\t\t\t\"_mcc\": \"647\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"fnetcoriolis\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"12\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Coriolis MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2135\",\r\n\t\t\t\t\"_mcc\": \"647\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_mmsc\": \"http://mmscoriolis\",\r\n\t\t\t\t\"_mmsproxy\": \"10.143.156.6\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_apn\": \"mmscoriolis\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"12\",\r\n\t\t\t\t\"_mvno_type\": \"gid\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telecel\",\r\n\t\t\t\t\"_carrier_id\": \"1879\",\r\n\t\t\t\t\"_mcc\": \"648\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Econet\",\r\n\t\t\t\t\"_carrier_id\": \"1880\",\r\n\t\t\t\t\"_mcc\": \"648\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTC\",\r\n\t\t\t\t\"_carrier_id\": \"941\",\r\n\t\t\t\t\"_mcc\": \"649\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"switch\",\r\n\t\t\t\t\"_carrier_id\": \"2214\",\r\n\t\t\t\t\"_mcc\": \"649\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Leo\",\r\n\t\t\t\t\"_carrier_id\": \"942\",\r\n\t\t\t\t\"_mcc\": \"649\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TNM\",\r\n\t\t\t\t\"_carrier_id\": \"1625\",\r\n\t\t\t\t\"_mcc\": \"650\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airtel\",\r\n\t\t\t\t\"_carrier_id\": \"1626\",\r\n\t\t\t\t\"_mcc\": \"650\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VCL Internet GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"2392\",\r\n\t\t\t\t\"_mcc\": \"651\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VCL MMS GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"2392\",\r\n\t\t\t\t\"_mcc\": \"651\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.vodacom4me.co.ls\",\r\n\t\t\t\t\"_mmsproxy\": \"10.113.63.11\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange BW MMS\",\r\n\t\t\t\t\"_carrier_id\": \"567\",\r\n\t\t\t\t\"_mcc\": \"652\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms.orange.co.bw\",\r\n\t\t\t\t\"_mmsc\": \"http://10.0.0.242/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.0.226\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Orange WAP BW\",\r\n\t\t\t\t\"_carrier_id\": \"567\",\r\n\t\t\t\t\"_mcc\": \"652\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet.orange.co.bw\",\r\n\t\t\t\t\"_proxy\": \"10.0.0.226\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Swazi MTN\",\r\n\t\t\t\t\"_carrier_id\": \"1091\",\r\n\t\t\t\t\"_mcc\": \"653\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HURI - SNPT\",\r\n\t\t\t\t\"_carrier_id\": \"872\",\r\n\t\t\t\t\"_mcc\": \"654\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LTE.Vodacom\",\r\n\t\t\t\t\"_carrier_id\": \"24\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"lte.vodacom.za\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS.Vodacom\",\r\n\t\t\t\t\"_carrier_id\": \"24\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"lte.vodacom.za\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.vodacom4me.co.za\",\r\n\t\t\t\t\"_mmsproxy\": \"196.6.128.13\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Smart.Vodacom\",\r\n\t\t\t\t\"_carrier_id\": \"24\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodacom\",\r\n\t\t\t\t\"_carrier_id\": \"24\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"IMS\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vodacom\",\r\n\t\t\t\t\"_carrier_id\": \"24\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telkom Mobile Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1965\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telkom Mobile MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1965\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.8ta.com:38090/was\",\r\n\t\t\t\t\"_mmsproxy\": \"41.151.254.162\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cell C GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1308\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cell C MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1308\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.cmobile.co.za/\",\r\n\t\t\t\t\"_mmsproxy\": \"196.31.116.250\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VIRGIN_INTERNET_1\",\r\n\t\t\t\t\"_carrier_id\": \"2335\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"vdata\",\r\n\t\t\t\t\"_proxy\": \"196.31.116.241\",\r\n\t\t\t\t\"_port\": \"8080\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"6550710\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VIRGIN_INTERNET_2\",\r\n\t\t\t\t\"_carrier_id\": \"2335\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"vdata\",\r\n\t\t\t\t\"_proxy\": \"196.31.116.241\",\r\n\t\t\t\t\"_port\": \"9201\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_mvno_match_data\": \"6550710\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Virgin_MMS_1\",\r\n\t\t\t\t\"_carrier_id\": \"2335\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"vmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.virginmobile.co.za\",\r\n\t\t\t\t\"_mmsproxy\": \"196.31.116.242\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"6550710\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Virgin_MMS_2\",\r\n\t\t\t\t\"_carrier_id\": \"2335\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"vmms\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.virginmobile.co.za\",\r\n\t\t\t\t\"_mmsproxy\": \"196.31.116.242\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mvno_match_data\": \"6550710\",\r\n\t\t\t\t\"_mvno_type\": \"imsi\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"myMTN\",\r\n\t\t\t\t\"_carrier_id\": \"1309\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"myMTN\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1309\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"myMTN\",\r\n\t\t\t\t\"_user\": \"mtnmms\",\r\n\t\t\t\t\"_password\": \"mtnmms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mtn.co.za/mms/wapenc\",\r\n\t\t\t\t\"_mmsproxy\": \"196.11.240.241\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1309\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"IMS\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MTN XCAP\",\r\n\t\t\t\t\"_carrier_id\": \"1309\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Lycamobile\",\r\n\t\t\t\t\"_mcc\": \"655\",\r\n\t\t\t\t\"_mnc\": \"53\",\r\n\t\t\t\t\"_apn\": \"data.lycamobile.co.za\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Lycamobile\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Eritel\",\r\n\t\t\t\t\"_carrier_id\": \"2247\",\r\n\t\t\t\t\"_mcc\": \"657\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DigiCell\",\r\n\t\t\t\t\"_carrier_id\": \"570\",\r\n\t\t\t\t\"_mcc\": \"702\",\r\n\t\t\t\t\"_mnc\": \"67\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Smart\",\r\n\t\t\t\t\"_carrier_id\": \"2354\",\r\n\t\t\t\t\"_mcc\": \"702\",\r\n\t\t\t\t\"_mnc\": \"99\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet CLARO\",\r\n\t\t\t\t\"_carrier_id\": \"1520\",\r\n\t\t\t\t\"_mcc\": \"704\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"ba.amx\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS CLARO\",\r\n\t\t\t\t\"_carrier_id\": \"1520\",\r\n\t\t\t\t\"_mcc\": \"704\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.ideasclaro\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsproxy\": \"10.6.32.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://10.6.32.27/servlets/mms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Broadband TIGO\",\r\n\t\t\t\t\"_carrier_id\": \"1521\",\r\n\t\t\t\t\"_mcc\": \"704\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"broadband.tigo.gt\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS TIGO\",\r\n\t\t\t\t\"_carrier_id\": \"1521\",\r\n\t\t\t\t\"_mcc\": \"704\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms.tigo.gt\",\r\n\t\t\t\t\"_mmsproxy\": \"10.16.17.12\",\r\n\t\t\t\t\"_mmsport\": \"8888\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1522\",\r\n\t\t\t\t\"_mcc\": \"704\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.movistar.gt\",\r\n\t\t\t\t\"_user\": \"movistargt\",\r\n\t\t\t\t\"_password\": \"movistargt\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet CLARO\",\r\n\t\t\t\t\"_carrier_id\": \"1954\",\r\n\t\t\t\t\"_mcc\": \"706\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.ideasclaro\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS CLARO\",\r\n\t\t\t\t\"_carrier_id\": \"1954\",\r\n\t\t\t\t\"_mcc\": \"706\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.ideasclaro\",\r\n\t\t\t\t\"_mmsproxy\": \"10.6.32.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://10.6.32.27/servlets/mms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Digicel Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1087\",\r\n\t\t\t\t\"_mcc\": \"706\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"web.digicelsv.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1087\",\r\n\t\t\t\t\"_mcc\": \"706\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"wap.digicelsv.com\",\r\n\t\t\t\t\"_mmsproxy\": \"172.26.5.12\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://172.26.5.132/servlets/mms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet Tigo\",\r\n\t\t\t\t\"_carrier_id\": \"1998\",\r\n\t\t\t\t\"_mcc\": \"706\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.tigo.sv\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS Tigo\",\r\n\t\t\t\t\"_carrier_id\": \"1998\",\r\n\t\t\t\t\"_mcc\": \"706\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms.tigo.sv\",\r\n\t\t\t\t\"_mmsproxy\": \"10.16.17.12\",\r\n\t\t\t\t\"_mmsport\": \"8888\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"2009\",\r\n\t\t\t\t\"_mcc\": \"706\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"internet.movistar.sv\",\r\n\t\t\t\t\"_user\": \"movistarsv\",\r\n\t\t\t\t\"_password\": \"movistarsv\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet Claro\",\r\n\t\t\t\t\"_carrier_id\": \"773\",\r\n\t\t\t\t\"_mcc\": \"708\",\r\n\t\t\t\t\"_mnc\": \"001\",\r\n\t\t\t\t\"_apn\": \"internet.ideasclaro\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS Claro\",\r\n\t\t\t\t\"_carrier_id\": \"773\",\r\n\t\t\t\t\"_mcc\": \"708\",\r\n\t\t\t\t\"_mnc\": \"001\",\r\n\t\t\t\t\"_apn\": \"mms.ideasclaro\",\r\n\t\t\t\t\"_mmsproxy\": \"10.6.32.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://10.6.32.27/servlets/mms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"INTERNET TIGO\",\r\n\t\t\t\t\"_carrier_id\": \"1528\",\r\n\t\t\t\t\"_mcc\": \"708\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet.tigo.hn\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS TIGO\",\r\n\t\t\t\t\"_carrier_id\": \"1528\",\r\n\t\t\t\t\"_mcc\": \"708\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms.tigo.hn\",\r\n\t\t\t\t\"_mmsproxy\": \"10.16.17.12\",\r\n\t\t\t\t\"_mmsport\": \"8888\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Honduras:Digicel:Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2248\",\r\n\t\t\t\t\"_mcc\": \"708\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"web.digicelhn.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Honduras:Digicel:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"2248\",\r\n\t\t\t\t\"_mcc\": \"708\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"wap.digicelhn.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://172.026.005.132/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.26.5.12\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"INTERNET TIGO\",\r\n\t\t\t\t\"_carrier_id\": \"1528\",\r\n\t\t\t\t\"_mcc\": \"708\",\r\n\t\t\t\t\"_mnc\": \"020\",\r\n\t\t\t\t\"_apn\": \"internet.tigo.hn\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS TIGO\",\r\n\t\t\t\t\"_carrier_id\": \"1528\",\r\n\t\t\t\t\"_mcc\": \"708\",\r\n\t\t\t\t\"_mnc\": \"020\",\r\n\t\t\t\t\"_apn\": \"mms.tigo.hn\",\r\n\t\t\t\t\"_mmsproxy\": \"10.16.17.12\",\r\n\t\t\t\t\"_mmsport\": \"8888\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Honduras:Digicel:Internet:2\",\r\n\t\t\t\t\"_carrier_id\": \"2248\",\r\n\t\t\t\t\"_mcc\": \"708\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"web.digicelhn.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Honduras:Digicel:Mms:2\",\r\n\t\t\t\t\"_carrier_id\": \"2248\",\r\n\t\t\t\t\"_mcc\": \"708\",\r\n\t\t\t\t\"_mnc\": \"040\",\r\n\t\t\t\t\"_apn\": \"wap.digicelhn.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://172.026.005.132/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.26.5.12\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet CLARO\",\r\n\t\t\t\t\"_carrier_id\": \"1641\",\r\n\t\t\t\t\"_mcc\": \"710\",\r\n\t\t\t\t\"_mnc\": \"21\",\r\n\t\t\t\t\"_apn\": \"internet.ideasclaro\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Claro MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1641\",\r\n\t\t\t\t\"_mcc\": \"710\",\r\n\t\t\t\t\"_mnc\": \"21\",\r\n\t\t\t\t\"_apn\": \"mms.ideasclaro\",\r\n\t\t\t\t\"_mmsproxy\": \"10.6.32.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://10.6.32.27/servlets/mms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"2010\",\r\n\t\t\t\t\"_mcc\": \"710\",\r\n\t\t\t\t\"_mnc\": \"30\",\r\n\t\t\t\t\"_apn\": \"internet.movistar.ni\",\r\n\t\t\t\t\"_user\": \"movistarni\",\r\n\t\t\t\t\"_password\": \"movistarni\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Yota Nicaragua Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2458\",\r\n\t\t\t\t\"_mcc\": \"710\",\r\n\t\t\t\t\"_mnc\": \"70\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet CLARO\",\r\n\t\t\t\t\"_carrier_id\": \"1642\",\r\n\t\t\t\t\"_mcc\": \"710\",\r\n\t\t\t\t\"_mnc\": \"73\",\r\n\t\t\t\t\"_apn\": \"internet.ideasclaro\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Claro MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1642\",\r\n\t\t\t\t\"_mcc\": \"710\",\r\n\t\t\t\t\"_mnc\": \"73\",\r\n\t\t\t\t\"_apn\": \"mms.ideasclaro\",\r\n\t\t\t\t\"_mmsproxy\": \"10.6.32.2\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://10.6.32.27/servlets/mms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"KOLBI 3G\",\r\n\t\t\t\t\"_carrier_id\": \"627\",\r\n\t\t\t\t\"_mcc\": \"712\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"kolbi3g\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Kolbi MMS\",\r\n\t\t\t\t\"_carrier_id\": \"627\",\r\n\t\t\t\t\"_mcc\": \"712\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"kolbimundo\",\r\n\t\t\t\t\"_mmsproxy\": \"10.184.202.24\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsice\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Kolbi Internet\",\r\n\t\t\t\t\"_carrier_id\": \"627\",\r\n\t\t\t\t\"_mcc\": \"712\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"kolbi3g\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Kolbi MMS\",\r\n\t\t\t\t\"_carrier_id\": \"627\",\r\n\t\t\t\t\"_mcc\": \"712\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"kolbimundo\",\r\n\t\t\t\t\"_mmsproxy\": \"10.184.202.24\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsice\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet CLARO\",\r\n\t\t\t\t\"_carrier_id\": \"1953\",\r\n\t\t\t\t\"_mcc\": \"712\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.ideasclaro\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS CLARO\",\r\n\t\t\t\t\"_carrier_id\": \"1953\",\r\n\t\t\t\t\"_mcc\": \"712\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms.ideasclaro\",\r\n\t\t\t\t\"_mmsproxy\": \"216.230.133.66\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ideasclaro.com:8002\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"2003\",\r\n\t\t\t\t\"_mcc\": \"712\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"internet.movistar.cr\",\r\n\t\t\t\t\"_user\": \"movistarcr\",\r\n\t\t\t\t\"_password\": \"movistarcr\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"973\",\r\n\t\t\t\t\"_mcc\": \"714\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"apn01.cwpanama.com.pa\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"973\",\r\n\t\t\t\t\"_mcc\": \"714\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"apn02.cwpanama.com.pa\",\r\n\t\t\t\t\"_mmsproxy\": \"172.25.3.5\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.zonamovil.com.pa\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"974\",\r\n\t\t\t\t\"_mcc\": \"714\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet.movistar.pa\",\r\n\t\t\t\t\"_user\": \"movistarpa\",\r\n\t\t\t\t\"_password\": \"movistarpa\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"WEB Claro\",\r\n\t\t\t\t\"_carrier_id\": \"1925\",\r\n\t\t\t\t\"_mcc\": \"714\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"web.claro.com.pa\",\r\n\t\t\t\t\"_user\": \"CLAROWEB\",\r\n\t\t\t\t\"_password\": \"CLAROWEB\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Digicel Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1926\",\r\n\t\t\t\t\"_mcc\": \"714\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"web.digicelpanama.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1926\",\r\n\t\t\t\t\"_mcc\": \"714\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"wap.digicelpanama.com\",\r\n\t\t\t\t\"_mmsproxy\": \"172.27.99.99\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mmc.digicelpanama.com/servlets/mms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1929\",\r\n\t\t\t\t\"_mcc\": \"716\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"movistar.pe\",\r\n\t\t\t\t\"_user\": \"movistar@datos\",\r\n\t\t\t\t\"_password\": \"movistar\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1929\",\r\n\t\t\t\t\"_mcc\": \"716\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CLARO DATOS\",\r\n\t\t\t\t\"_carrier_id\": \"1647\",\r\n\t\t\t\t\"_mcc\": \"716\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"claro.pe\",\r\n\t\t\t\t\"_user\": \"claro\",\r\n\t\t\t\t\"_password\": \"claro\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CLARO MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1647\",\r\n\t\t\t\t\"_mcc\": \"716\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mms.claro.pe\",\r\n\t\t\t\t\"_user\": \"claro\",\r\n\t\t\t\t\"_password\": \"claro\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.231.30\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_mmsc\": \"http://claro/servlets/mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Claro PE IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1647\",\r\n\t\t\t\t\"_mcc\": \"716\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bitel - Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2359\",\r\n\t\t\t\t\"_mcc\": \"716\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"bitel\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Bitel - MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2359\",\r\n\t\t\t\t\"_mcc\": \"716\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"bitel-mms\",\r\n\t\t\t\t\"_mmsc\": \"http://181.176.241.99:8080\",\r\n\t\t\t\t\"_mmsproxy\": \"10.121.144.3\",\r\n\t\t\t\t\"_mmsport\": \"8000\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Entel PE\",\r\n\t\t\t\t\"_carrier_id\": \"1930\",\r\n\t\t\t\t\"_mcc\": \"716\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"entel.pe\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IP\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Entel PE IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1930\",\r\n\t\t\t\t\"_mcc\": \"716\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Servicio_WEB\",\r\n\t\t\t\t\"_carrier_id\": \"2249\",\r\n\t\t\t\t\"_mcc\": \"722\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.movil\",\r\n\t\t\t\t\"_user\": \"internet\",\r\n\t\t\t\t\"_password\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"02\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1337\",\r\n\t\t\t\t\"_mcc\": \"722\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"wap.gprs.unifon.com.ar\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar AR IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1337\",\r\n\t\t\t\t\"_mcc\": \"722\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1337\",\r\n\t\t\t\t\"_mcc\": \"722\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"mms.gprs.unifon.com.ar\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsproxy\": \"200.68.32.239\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.movistar.com.ar\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Servicio_WEB\",\r\n\t\t\t\t\"_carrier_id\": \"2249\",\r\n\t\t\t\t\"_mcc\": \"722\",\r\n\t\t\t\t\"_mnc\": \"010\",\r\n\t\t\t\t\"_apn\": \"internet.movil\",\r\n\t\t\t\t\"_user\": \"internet\",\r\n\t\t\t\t\"_password\": \"internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"gid\",\r\n\t\t\t\t\"_mvno_match_data\": \"01\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Personal Datos\",\r\n\t\t\t\t\"_carrier_id\": \"1341\",\r\n\t\t\t\t\"_mcc\": \"722\",\r\n\t\t\t\t\"_mnc\": \"34\",\r\n\t\t\t\t\"_apn\": \"datos.personal.com\",\r\n\t\t\t\t\"_user\": \"datos\",\r\n\t\t\t\t\"_password\": \"datos\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Personal MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1341\",\r\n\t\t\t\t\"_mcc\": \"722\",\r\n\t\t\t\t\"_mnc\": \"34\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.25.7.31\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.personal.com\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Personal IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1341\",\r\n\t\t\t\t\"_mcc\": \"722\",\r\n\t\t\t\t\"_mnc\": \"34\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Claro AR\",\r\n\t\t\t\t\"_carrier_id\": \"1338\",\r\n\t\t\t\t\"_mcc\": \"722\",\r\n\t\t\t\t\"_mnc\": \"310\",\r\n\t\t\t\t\"_apn\": \"igprs.claro.com.ar\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.claro.com.ar\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Claro AR IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1338\",\r\n\t\t\t\t\"_mcc\": \"722\",\r\n\t\t\t\t\"_mnc\": \"310\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Personal Datos\",\r\n\t\t\t\t\"_carrier_id\": \"1341\",\r\n\t\t\t\t\"_mcc\": \"722\",\r\n\t\t\t\t\"_mnc\": \"341\",\r\n\t\t\t\t\"_apn\": \"datos.personal.com\",\r\n\t\t\t\t\"_user\": \"datos\",\r\n\t\t\t\t\"_password\": \"datos\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Personal MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1341\",\r\n\t\t\t\t\"_mcc\": \"722\",\r\n\t\t\t\t\"_mnc\": \"341\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.25.7.31\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.personal.com\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Personal IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1341\",\r\n\t\t\t\t\"_mcc\": \"722\",\r\n\t\t\t\t\"_mnc\": \"341\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TIM Connect\",\r\n\t\t\t\t\"_carrier_id\": \"1385\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"timbrasil.br\",\r\n\t\t\t\t\"_user\": \"tim\",\r\n\t\t\t\t\"_password\": \"tim\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.tim.br\",\r\n\t\t\t\t\"_mmsproxy\": \"189.40.191.96\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TIM IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1385\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_type\": \"ims\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TIM Connect\",\r\n\t\t\t\t\"_carrier_id\": \"1385\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"timbrasil.br\",\r\n\t\t\t\t\"_user\": \"tim\",\r\n\t\t\t\t\"_password\": \"tim\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.tim.br\",\r\n\t\t\t\t\"_mmsproxy\": \"189.40.191.96\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TIM IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1385\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_type\": \"ims\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TIM Connect\",\r\n\t\t\t\t\"_carrier_id\": \"1385\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"timbrasil.br\",\r\n\t\t\t\t\"_user\": \"tim\",\r\n\t\t\t\t\"_password\": \"tim\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.tim.br\",\r\n\t\t\t\t\"_mmsproxy\": \"189.40.191.96\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TIM IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1385\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_type\": \"ims\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Java Session\",\r\n\t\t\t\t\"_carrier_id\": \"529\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"java.claro.com.br\",\r\n\t\t\t\t\"_user\": \"claro\",\r\n\t\t\t\t\"_password\": \"claro\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Claro Foto\",\r\n\t\t\t\t\"_carrier_id\": \"529\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms.claro.com.br\",\r\n\t\t\t\t\"_user\": \"claro\",\r\n\t\t\t\t\"_password\": \"claro\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.claro.com.br\",\r\n\t\t\t\t\"_mmsproxy\": \"200.169.126.10\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vivo MMS\",\r\n\t\t\t\t\"_carrier_id\": \"530\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"mms.vivo.com.br\",\r\n\t\t\t\t\"_user\": \"vivo\",\r\n\t\t\t\t\"_password\": \"vivo\",\r\n\t\t\t\t\"_mmsc\": \"http://termnat.vivomms.com.br:8088/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"200.142.130.104\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vivo Internet\",\r\n\t\t\t\t\"_carrier_id\": \"530\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"zap.vivo.com.br\",\r\n\t\t\t\t\"_user\": \"vivo\",\r\n\t\t\t\t\"_password\": \"vivo\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vivo IMS\",\r\n\t\t\t\t\"_carrier_id\": \"530\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_type\": \"ims\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vivo Xcap\",\r\n\t\t\t\t\"_carrier_id\": \"530\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"xcap.ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_type\": \"xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SCTL MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1388\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"mms.sercomtel.com.br\",\r\n\t\t\t\t\"_user\": \"sercomtel\",\r\n\t\t\t\t\"_password\": \"sercomtel\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.claro.com.br\",\r\n\t\t\t\t\"_mmsproxy\": \"200.169.126.10\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SCTL GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"1388\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"sercomtel.com.br\",\r\n\t\t\t\t\"_user\": \"sercomtel\",\r\n\t\t\t\t\"_password\": \"sercomtel\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vivo Internet\",\r\n\t\t\t\t\"_carrier_id\": \"530\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"zap.vivo.com.br\",\r\n\t\t\t\t\"_user\": \"vivo\",\r\n\t\t\t\t\"_password\": \"vivo\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vivo MMS\",\r\n\t\t\t\t\"_carrier_id\": \"530\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"mms.vivo.com.br\",\r\n\t\t\t\t\"_user\": \"vivo\",\r\n\t\t\t\t\"_password\": \"vivo\",\r\n\t\t\t\t\"_mmsc\": \"http://termnat.vivomms.com.br:8088/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"200.142.130.104\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vivo IMS\",\r\n\t\t\t\t\"_carrier_id\": \"530\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_type\": \"ims\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vivo Xcap\",\r\n\t\t\t\t\"_carrier_id\": \"530\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"xcap.ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_type\": \"xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vivo MMS\",\r\n\t\t\t\t\"_carrier_id\": \"530\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"mms.vivo.com.br\",\r\n\t\t\t\t\"_user\": \"vivo\",\r\n\t\t\t\t\"_password\": \"vivo\",\r\n\t\t\t\t\"_mmsc\": \"http://termnat.vivomms.com.br:8088/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"200.142.130.104\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vivo Internet\",\r\n\t\t\t\t\"_carrier_id\": \"530\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"zap.vivo.com.br\",\r\n\t\t\t\t\"_user\": \"vivo\",\r\n\t\t\t\t\"_password\": \"vivo\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vivo IMS\",\r\n\t\t\t\t\"_carrier_id\": \"530\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_type\": \"ims\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vivo Xcap\",\r\n\t\t\t\t\"_carrier_id\": \"530\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"11\",\r\n\t\t\t\t\"_apn\": \"xcap.ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_type\": \"xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sercomtel:Dados\",\r\n\t\t\t\t\"_carrier_id\": \"539\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"sercomtel.com.br\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_user\": \"sercomtel\",\r\n\t\t\t\t\"_password\": \"sercomtel\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sercomtel:MMS\",\r\n\t\t\t\t\"_carrier_id\": \"539\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"15\",\r\n\t\t\t\t\"_apn\": \"mms.sercomtel.com.br\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.claro.com.br\",\r\n\t\t\t\t\"_mmsproxy\": \"200.169.126.10\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user\": \"sercomtel\",\r\n\t\t\t\t\"_password\": \"sercomtel\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Oi Internet\",\r\n\t\t\t\t\"_carrier_id\": \"540\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"gprs.oi.com.br\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Oi MMS\",\r\n\t\t\t\t\"_carrier_id\": \"540\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"16\",\r\n\t\t\t\t\"_apn\": \"mmsgprs.oi.com.br\",\r\n\t\t\t\t\"_user\": \"oimms\",\r\n\t\t\t\t\"_password\": \"oioioi\",\r\n\t\t\t\t\"_mmsc\": \"http://200.222.42.204:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.10.50\",\r\n\t\t\t\t\"_mmsport\": \"3128\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Surf\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"internet.br\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Surf\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Surf IMS\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"17\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"Surf\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LIGUE 4G Internet\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"iot4u.br\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_user\": \"arqia\",\r\n\t\t\t\t\"_password\": \"arqia\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"LIGUE\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LIGUE 4G IMS\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"18\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_mvno_type\": \"spn\",\r\n\t\t\t\t\"_mvno_match_data\": \"LIGUE\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TelemigC GPRS\",\r\n\t\t\t\t\"_carrier_id\": \"543\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"gprs.telemigcelular.com.br\",\r\n\t\t\t\t\"_user\": \"celular\",\r\n\t\t\t\t\"_password\": \"celular\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS Telemig\",\r\n\t\t\t\t\"_carrier_id\": \"543\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"19\",\r\n\t\t\t\t\"_apn\": \"mmsgprs.telemigcelular.com.br\",\r\n\t\t\t\t\"_user\": \"celular\",\r\n\t\t\t\t\"_password\": \"celular\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.telemigcelular.com.br\",\r\n\t\t\t\t\"_mmsproxy\": \"200.192.230.142\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LIGUE Internet\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"21\",\r\n\t\t\t\t\"_apn\": \"internet.ligue.vc\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LIGUE IMS\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"21\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vivo Internet\",\r\n\t\t\t\t\"_carrier_id\": \"530\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"23\",\r\n\t\t\t\t\"_apn\": \"zap.vivo.com.br\",\r\n\t\t\t\t\"_user\": \"vivo\",\r\n\t\t\t\t\"_password\": \"vivo\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vivo MMS\",\r\n\t\t\t\t\"_carrier_id\": \"530\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"23\",\r\n\t\t\t\t\"_apn\": \"mms.vivo.com.br\",\r\n\t\t\t\t\"_user\": \"vivo\",\r\n\t\t\t\t\"_password\": \"vivo\",\r\n\t\t\t\t\"_mmsc\": \"http://termnat.vivomms.com.br:8088/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"200.142.130.104\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vivo IMS\",\r\n\t\t\t\t\"_carrier_id\": \"530\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"23\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_type\": \"ims\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vivo Xcap\",\r\n\t\t\t\t\"_carrier_id\": \"530\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"23\",\r\n\t\t\t\t\"_apn\": \"xcap.ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_type\": \"xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Oi Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1389\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"24\",\r\n\t\t\t\t\"_apn\": \"gprs.oi.com.br\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Oi MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1389\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"24\",\r\n\t\t\t\t\"_apn\": \"mmsgprs.oi.com.br\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mmsc\": \"http://200.222.42.204:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.10.50\",\r\n\t\t\t\t\"_mmsport\": \"3128\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user\": \"oimms\",\r\n\t\t\t\t\"_password\": \"oioioi\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Unifique\",\r\n\t\t\t\t\"_carrier_id\": \"548\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"29\",\r\n\t\t\t\t\"_apn\": \"unifique.br\",\r\n\t\t\t\t\"_type\": \"default,ims,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Oi Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1389\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"31\",\r\n\t\t\t\t\"_apn\": \"gprs.oi.com.br\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_authtype\": \"0\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Oi MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1389\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"31\",\r\n\t\t\t\t\"_apn\": \"mmsgprs.oi.com.br\",\r\n\t\t\t\t\"_user\": \"oimms\",\r\n\t\t\t\t\"_password\": \"oioioi\",\r\n\t\t\t\t\"_mmsc\": \"http://200.222.42.204:8002\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.10.50\",\r\n\t\t\t\t\"_mmsport\": \"3128\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Algar Telecom Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1390\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"32\",\r\n\t\t\t\t\"_apn\": \"algar.br\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"algar\",\r\n\t\t\t\t\"_password\": \"1212\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Algar MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1390\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"32\",\r\n\t\t\t\t\"_apn\": \"mms.algar.br\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ctbccelular.com.br/was\",\r\n\t\t\t\t\"_mmsproxy\": \"172.29.7.70\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user\": \"algar\",\r\n\t\t\t\t\"_password\": \"1212\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Algar Telecom Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1390\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"algar.br\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"algar\",\r\n\t\t\t\t\"_password\": \"1212\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Algar MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1390\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"33\",\r\n\t\t\t\t\"_apn\": \"mms.algar.br\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ctbccelular.com.br/was\",\r\n\t\t\t\t\"_mmsproxy\": \"172.29.7.70\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user\": \"algar\",\r\n\t\t\t\t\"_password\": \"1212\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Algar Telecom Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1390\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"34\",\r\n\t\t\t\t\"_apn\": \"algar.br\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"algar\",\r\n\t\t\t\t\"_password\": \"1212\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Algar MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1390\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"34\",\r\n\t\t\t\t\"_apn\": \"mms.algar.br\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ctbccelular.com.br/was\",\r\n\t\t\t\t\"_mmsproxy\": \"172.29.7.70\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user\": \"algar\",\r\n\t\t\t\t\"_password\": \"1212\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Porto Seguro Conecta\",\r\n\t\t\t\t\"_carrier_id\": \"2215\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"54\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_apn\": \"portoconecta.br\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TIM Connect\",\r\n\t\t\t\t\"_carrier_id\": \"1385\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"54\",\r\n\t\t\t\t\"_apn\": \"timbrasil.br\",\r\n\t\t\t\t\"_user\": \"tim\",\r\n\t\t\t\t\"_password\": \"tim\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.tim.br\",\r\n\t\t\t\t\"_mmsproxy\": \"189.40.191.96\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms,xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TIM IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1385\",\r\n\t\t\t\t\"_mcc\": \"724\",\r\n\t\t\t\t\"_mnc\": \"54\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_type\": \"ims\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet Movil\",\r\n\t\t\t\t\"_carrier_id\": \"1427\",\r\n\t\t\t\t\"_mcc\": \"730\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"bam.entelpcs.cl\",\r\n\t\t\t\t\"_user\": \"entelpcs\",\r\n\t\t\t\t\"_password\": \"entelpcs\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1428\",\r\n\t\t\t\t\"_mcc\": \"730\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"wap.tmovil.cl\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar CL IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1428\",\r\n\t\t\t\t\"_mcc\": \"730\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Claro Chile\",\r\n\t\t\t\t\"_carrier_id\": \"1429\",\r\n\t\t\t\t\"_mcc\": \"730\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"bam.clarochile.cl\",\r\n\t\t\t\t\"_user\": \"clarochile\",\r\n\t\t\t\t\"_password\": \"clarochile\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS Claro\",\r\n\t\t\t\t\"_carrier_id\": \"1429\",\r\n\t\t\t\t\"_mcc\": \"730\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms.clarochile.cl\",\r\n\t\t\t\t\"_user\": \"clarochile\",\r\n\t\t\t\t\"_password\": \"clarochile\",\r\n\t\t\t\t\"_mmsproxy\": \"172.23.200.200\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.clarochile.cl\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1429\",\r\n\t\t\t\t\"_mcc\": \"730\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Virgin Internet Movil\",\r\n\t\t\t\t\"_mcc\": \"730\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"imovil.virginmobile.cl\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2216\",\r\n\t\t\t\t\"_mcc\": \"730\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"movil.vtr.com\",\r\n\t\t\t\t\"_user\": \"vtrmovil\",\r\n\t\t\t\t\"_password\": \"vtrmovil\",\r\n\t\t\t\t\"_authtype\": \"2\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2216\",\r\n\t\t\t\t\"_mcc\": \"730\",\r\n\t\t\t\t\"_mnc\": \"08\",\r\n\t\t\t\t\"_apn\": \"mms.vtr.com\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsc\": \"http://192.168.94.162:19090/was\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.94.210\",\r\n\t\t\t\t\"_mmsport\": \"9028\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet WOM\",\r\n\t\t\t\t\"_carrier_id\": \"1430\",\r\n\t\t\t\t\"_mcc\": \"730\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1430\",\r\n\t\t\t\t\"_mcc\": \"730\",\r\n\t\t\t\t\"_mnc\": \"09\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_user_editable\": \"false\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet Movil\",\r\n\t\t\t\t\"_carrier_id\": \"1427\",\r\n\t\t\t\t\"_mcc\": \"730\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"bam.entelpcs.cl\",\r\n\t\t\t\t\"_user\": \"entelpcs\",\r\n\t\t\t\t\"_password\": \"entelpcs\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar INTERNET\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"internet.movistar.com.co\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia\",\r\n\t\t\t\t\"_user\": \"movistar\",\r\n\t\t\t\t\"_password\": \"movistar\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar MMS\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"12\",\r\n\t\t\t\t\"_apn\": \"mms.movistar.com.co\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.movistar.com.co\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.222.7\",\r\n\t\t\t\t\"_mmsport\": \"9001\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user\": \"movistar\",\r\n\t\t\t\t\"_password\": \"movistar\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Web Claro CO\",\r\n\t\t\t\t\"_carrier_id\": \"1442\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"101\",\r\n\t\t\t\t\"_apn\": \"internet.comcel.com.co\",\r\n\t\t\t\t\"_user\": \"COMCELWEB\",\r\n\t\t\t\t\"_password\": \"COMCELWEB\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS Claro CO\",\r\n\t\t\t\t\"_carrier_id\": \"1442\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"101\",\r\n\t\t\t\t\"_apn\": \"mms.comcel.com.co\",\r\n\t\t\t\t\"_user\": \"COMCELMMS\",\r\n\t\t\t\t\"_password\": \"COMCELMMS\",\r\n\t\t\t\t\"_mmsproxy\": \"198.228.90.225\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_mmsc\": \"http://www.comcel.com.co/mms/\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS Claro CO\",\r\n\t\t\t\t\"_carrier_id\": \"1442\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"101\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tigo Web\",\r\n\t\t\t\t\"_carrier_id\": \"624\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"103\",\r\n\t\t\t\t\"_apn\": \"web.colombiamovil.com.co\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TIGO Multimedia\",\r\n\t\t\t\t\"_carrier_id\": \"624\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"103\",\r\n\t\t\t\t\"_apn\": \"mms.colombiamovil.com.co\",\r\n\t\t\t\t\"_user\": \"mms-cm1900\",\r\n\t\t\t\t\"_password\": \"mms-cm1900\",\r\n\t\t\t\t\"_mmsproxy\": \"190.102.206.48\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ola.com.co\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet ETB\",\r\n\t\t\t\t\"_carrier_id\": \"2218\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"103\",\r\n\t\t\t\t\"_apn\": \"moviletb.net.co\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_user\": \"etb\",\r\n\t\t\t\t\"_password\": \"etb\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mvno_match_data\": \"ETB MOVI\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet Éxito\",\r\n\t\t\t\t\"_carrier_id\": \"2337\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"103\",\r\n\t\t\t\t\"_apn\": \"movilexito.net.co\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mvno_match_data\": \"movil exito\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"UNE\",\r\n\t\t\t\t\"_carrier_id\": \"2338\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"103\",\r\n\t\t\t\t\"_apn\": \"www.une.net.co\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_user\": \"une\",\r\n\t\t\t\t\"_password\": \"une\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mvno_match_data\": \"UNE\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tigo Web\",\r\n\t\t\t\t\"_carrier_id\": \"624\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"111\",\r\n\t\t\t\t\"_apn\": \"web.colombiamovil.com.co\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TIGO Multimedia\",\r\n\t\t\t\t\"_carrier_id\": \"624\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"111\",\r\n\t\t\t\t\"_apn\": \"mms.colombiamovil.com.co\",\r\n\t\t\t\t\"_user\": \"mms-cm1900\",\r\n\t\t\t\t\"_password\": \"mms-cm1900\",\r\n\t\t\t\t\"_mmsproxy\": \"190.102.206.48\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ola.com.co\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet ETB\",\r\n\t\t\t\t\"_carrier_id\": \"2218\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"111\",\r\n\t\t\t\t\"_apn\": \"moviletb.net.co\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_user\": \"etb\",\r\n\t\t\t\t\"_password\": \"etb\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mvno_match_data\": \"ETB MOVIL\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet Éxito\",\r\n\t\t\t\t\"_carrier_id\": \"2337\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"111\",\r\n\t\t\t\t\"_apn\": \"movilexito.net.co\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mvno_match_data\": \"movil exito\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"UNE\",\r\n\t\t\t\t\"_carrier_id\": \"2338\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"111\",\r\n\t\t\t\t\"_apn\": \"www.une.net.co\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_user\": \"une\",\r\n\t\t\t\t\"_password\": \"une\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_mvno_match_data\": \"UNE\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"625\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"123\",\r\n\t\t\t\t\"_apn\": \"internet.movistar.com.co\",\r\n\t\t\t\t\"_user\": \"movistar\",\r\n\t\t\t\t\"_password\": \"movistar\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar MMS\",\r\n\t\t\t\t\"_carrier_id\": \"625\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"123\",\r\n\t\t\t\t\"_apn\": \"mms.movistar.com.co\",\r\n\t\t\t\t\"_user\": \"movistar\",\r\n\t\t\t\t\"_password\": \"movistar\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.222.7\",\r\n\t\t\t\t\"_mmsport\": \"9001\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.movistar.com.co\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar CO IMS\",\r\n\t\t\t\t\"_carrier_id\": \"625\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"123\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar CO Ut\",\r\n\t\t\t\t\"_carrier_id\": \"625\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"123\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IP\",\r\n\t\t\t\t\"_roaming_protocol\": \"IP\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Virgin Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2339\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"123\",\r\n\t\t\t\t\"_apn\": \"web.vmc.net.co\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mvno_match_data\": \"Virgin Mobile\",\r\n\t\t\t\t\"_mvno_type\": \"spn\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Avantel\",\r\n\t\t\t\t\"_carrier_id\": \"626\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"130\",\r\n\t\t\t\t\"_apn\": \"lte.avantel.com.co\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ETB 4G\",\r\n\t\t\t\t\"_carrier_id\": \"2218\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"187\",\r\n\t\t\t\t\"_apn\": \"internetmovil.etb.net.co\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet WOM\",\r\n\t\t\t\t\"_carrier_id\": \"626\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"360\",\r\n\t\t\t\t\"_apn\": \"internet.wom.co\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mtu\": \"1500\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"WOM Vo4G\",\r\n\t\t\t\t\"_carrier_id\": \"626\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"360\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mtu\": \"1500\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ut\",\r\n\t\t\t\t\"_carrier_id\": \"626\",\r\n\t\t\t\t\"_mcc\": \"732\",\r\n\t\t\t\t\"_mnc\": \"360\",\r\n\t\t\t\t\"_apn\": \"Ut\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mtu\": \"1500\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Digitel 412\",\r\n\t\t\t\t\"_carrier_id\": \"1870\",\r\n\t\t\t\t\"_mcc\": \"734\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.digitel.ve\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1870\",\r\n\t\t\t\t\"_mcc\": \"734\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"expresate.digitel.ve\",\r\n\t\t\t\t\"_mmsproxy\": \"10.99.0.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.412.com.ve/servlets/mms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Digitel 412\",\r\n\t\t\t\t\"_carrier_id\": \"1871\",\r\n\t\t\t\t\"_mcc\": \"734\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet.digitel.ve\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1871\",\r\n\t\t\t\t\"_mcc\": \"734\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"expresate.digitel.ve\",\r\n\t\t\t\t\"_mmsproxy\": \"10.99.0.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.412.com.ve/servlets/mms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Digitel 412\",\r\n\t\t\t\t\"_carrier_id\": \"1872\",\r\n\t\t\t\t\"_mcc\": \"734\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.digitel.ve\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1872\",\r\n\t\t\t\t\"_mcc\": \"734\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"expresate.digitel.ve\",\r\n\t\t\t\t\"_mmsproxy\": \"10.99.0.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.412.com.ve/servlets/mms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1873\",\r\n\t\t\t\t\"_mcc\": \"734\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"internet.movistar.ve\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MODEM\",\r\n\t\t\t\t\"_carrier_id\": \"1874\",\r\n\t\t\t\t\"_mcc\": \"734\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"int.movilnet.com.ve\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1874\",\r\n\t\t\t\t\"_mcc\": \"734\",\r\n\t\t\t\t\"_mnc\": \"06\",\r\n\t\t\t\t\"_apn\": \"mm.movilnet.com.ve\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.16.12\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms2.movilnet.com.ve/servlets/mms\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VIVA3G\",\r\n\t\t\t\t\"_carrier_id\": \"1380\",\r\n\t\t\t\t\"_mcc\": \"736\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.nuevatel.com\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VIVAMMS\",\r\n\t\t\t\t\"_carrier_id\": \"1380\",\r\n\t\t\t\t\"_mcc\": \"736\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.nuevatel.com\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"192.168.101.4\",\r\n\t\t\t\t\"_mmsport\": \"3128\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsgw.nuevatel.com:1981\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Entel Bolivia 4G\",\r\n\t\t\t\t\"_carrier_id\": \"1381\",\r\n\t\t\t\t\"_mcc\": \"736\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"4g.entel\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ENTEL MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1381\",\r\n\t\t\t\t\"_mcc\": \"736\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"mms.movil.com.bo\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"172.27.7.10\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.movil.com.bo/servlets/mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tigo Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1382\",\r\n\t\t\t\t\"_mcc\": \"736\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"internet.tigo.bo\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMSTIGO\",\r\n\t\t\t\t\"_carrier_id\": \"1382\",\r\n\t\t\t\t\"_mcc\": \"736\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"mms.tigo.bo\",\r\n\t\t\t\t\"_user\": \"\",\r\n\t\t\t\t\"_password\": \"\",\r\n\t\t\t\t\"_mmsproxy\": \"172.25.100.8\",\r\n\t\t\t\t\"_mmsport\": \"8888\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Digicel\",\r\n\t\t\t\t\"_carrier_id\": \"1525\",\r\n\t\t\t\t\"_mcc\": \"738\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"web.digicelgy.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Guyana:Digicel:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"1525\",\r\n\t\t\t\t\"_mcc\": \"738\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"wap.digicelgy.com\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsproxy\": \"172.20.6.12\",\r\n\t\t\t\t\"_mmsc\": \"http://mmc.digicelgy.com/servlets/mms\",\r\n\t\t\t\t\"_mmsport\": \"9201\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"GT&T Cellink Plus\",\r\n\t\t\t\t\"_carrier_id\": \"2217\",\r\n\t\t\t\t\"_mcc\": \"738\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1472\",\r\n\t\t\t\t\"_mcc\": \"740\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"internet.movistar.com.ec\",\r\n\t\t\t\t\"_user\": \"movistar\",\r\n\t\t\t\t\"_password\": \"movistar\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1472\",\r\n\t\t\t\t\"_mcc\": \"740\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"mms.movistar.com.ec\",\r\n\t\t\t\t\"_user\": \"movistar\",\r\n\t\t\t\t\"_password\": \"movistar\",\r\n\t\t\t\t\"_mmsproxy\": \"10.3.5.50\",\r\n\t\t\t\t\"_mmsport\": \"9001\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.movistar.com.ec:8088/mms/\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar EC IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1472\",\r\n\t\t\t\t\"_mcc\": \"740\",\r\n\t\t\t\t\"_mnc\": \"00\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_user\": \"movistar\",\r\n\t\t\t\t\"_password\": \"movistar\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"ims,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Internet Claro\",\r\n\t\t\t\t\"_carrier_id\": \"1473\",\r\n\t\t\t\t\"_mcc\": \"740\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"internet.claro.com.ec\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS Claro\",\r\n\t\t\t\t\"_carrier_id\": \"1473\",\r\n\t\t\t\t\"_mcc\": \"740\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms.claro.com.ec\",\r\n\t\t\t\t\"_user\": \"portamms\",\r\n\t\t\t\t\"_password\": \"portamms2003\",\r\n\t\t\t\t\"_mmsproxy\": \"216.250.208.94\",\r\n\t\t\t\t\"_mmsport\": \"8799\",\r\n\t\t\t\t\"_mmsc\": \"http://iesmms.porta.com.ec/\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CNT Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1474\",\r\n\t\t\t\t\"_mcc\": \"740\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"internet.cnt.net.ec\",\r\n\t\t\t\t\"_authtype\": \"3\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VOX INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1672\",\r\n\t\t\t\t\"_mcc\": \"744\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"vox.internet\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"VOX MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1672\",\r\n\t\t\t\t\"_mcc\": \"744\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"vox.mms\",\r\n\t\t\t\t\"_user\": \"vox\",\r\n\t\t\t\t\"_password\": \"vox\",\r\n\t\t\t\t\"_mmsproxy\": \"172.24.97.29\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.vox.com.py/mmsc\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Claro PY\",\r\n\t\t\t\t\"_carrier_id\": \"1673\",\r\n\t\t\t\t\"_mcc\": \"744\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"igprs.claro.com.py\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.claro.com.py\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"TIGO PY\",\r\n\t\t\t\t\"_carrier_id\": \"1927\",\r\n\t\t\t\t\"_mcc\": \"744\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"internet.tigo.py\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS Tigo\",\r\n\t\t\t\t\"_carrier_id\": \"1927\",\r\n\t\t\t\t\"_mcc\": \"744\",\r\n\t\t\t\t\"_mnc\": \"04\",\r\n\t\t\t\t\"_apn\": \"mms.tigo.py\",\r\n\t\t\t\t\"_user\": \"tigo\",\r\n\t\t\t\t\"_password\": \"tigo\",\r\n\t\t\t\t\"_mmsproxy\": \"10.16.17.12\",\r\n\t\t\t\t\"_mmsport\": \"8888\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Personal Datos Py\",\r\n\t\t\t\t\"_carrier_id\": \"1928\",\r\n\t\t\t\t\"_mcc\": \"744\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_user\": \"personal\",\r\n\t\t\t\t\"_password\": \"personal\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Personal MMS Py\",\r\n\t\t\t\t\"_carrier_id\": \"1928\",\r\n\t\t\t\t\"_mcc\": \"744\",\r\n\t\t\t\t\"_mnc\": \"05\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_user\": \"mms\",\r\n\t\t\t\t\"_password\": \"mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.16.192.7\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mms\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telesur\",\r\n\t\t\t\t\"_carrier_id\": \"1083\",\r\n\t\t\t\t\"_mcc\": \"746\",\r\n\t\t\t\t\"_mnc\": \"02\",\r\n\t\t\t\t\"_apn\": \"default\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Suriname:Digicel:Internet\",\r\n\t\t\t\t\"_carrier_id\": \"1084\",\r\n\t\t\t\t\"_mcc\": \"746\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"web.digicelsr.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Suriname:Digicel:Mms\",\r\n\t\t\t\t\"_carrier_id\": \"1084\",\r\n\t\t\t\t\"_mcc\": \"746\",\r\n\t\t\t\t\"_mnc\": \"03\",\r\n\t\t\t\t\"_apn\": \"wap.digicelsr.com\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_mmsc\": \"http://mmc.digicelsr.com/servlets/mms\",\r\n\t\t\t\t\"_mmsproxy\": \"172.20.6.12\",\r\n\t\t\t\t\"_mmsport\": \"9201\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_user\": \"wap\",\r\n\t\t\t\t\"_password\": \"wap\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Antel mms\",\r\n\t\t\t\t\"_carrier_id\": \"1862\",\r\n\t\t\t\t\"_mcc\": \"748\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_mmsproxy\": \"200.40.246.2\",\r\n\t\t\t\t\"_mmsport\": \"3128\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mms.ancelutil.com.uy\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Vera 1\",\r\n\t\t\t\t\"_carrier_id\": \"1862\",\r\n\t\t\t\t\"_mcc\": \"748\",\r\n\t\t\t\t\"_mnc\": \"01\",\r\n\t\t\t\t\"_apn\": \"antel.lte\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar INTERNET\",\r\n\t\t\t\t\"_carrier_id\": \"1863\",\r\n\t\t\t\t\"_mcc\": \"748\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"webapn.movistar.com.uy\",\r\n\t\t\t\t\"_user\": \"movistar\",\r\n\t\t\t\t\"_password\": \"movistar\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Movistar MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1863\",\r\n\t\t\t\t\"_mcc\": \"748\",\r\n\t\t\t\t\"_mnc\": \"07\",\r\n\t\t\t\t\"_apn\": \"apnmms.movistar.com.uy\",\r\n\t\t\t\t\"_user\": \"mmsuy\",\r\n\t\t\t\t\"_password\": \"mmsuy\",\r\n\t\t\t\t\"_mmsproxy\": \"10.0.2.29\",\r\n\t\t\t\t\"_mmsport\": \"8080\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.movistar.com.uy\",\r\n\t\t\t\t\"_authtype\": \"1\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Claro UY\",\r\n\t\t\t\t\"_carrier_id\": \"1864\",\r\n\t\t\t\t\"_mcc\": \"748\",\r\n\t\t\t\t\"_mnc\": \"10\",\r\n\t\t\t\t\"_apn\": \"igprs.claro.com.uy\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.claro.com.uy\",\r\n\t\t\t\t\"_authtype\": \"0\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"CIOT Vodafone\",\r\n\t\t\t\t\"_mcc\": \"901\",\r\n\t\t\t\t\"_mnc\": \"28\",\r\n\t\t\t\t\"_apn\": \"ciot.vodafone.com\",\r\n\t\t\t\t\"_user\": \"vodafone\",\r\n\t\t\t\t\"_password\": \"vodafone\",\r\n\t\t\t\t\"_type\": \"default,ia\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mobiledata\",\r\n\t\t\t\t\"_mcc\": \"901\",\r\n\t\t\t\t\"_mnc\": \"37\",\r\n\t\t\t\t\"_apn\": \"mobiledata\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telekom\",\r\n\t\t\t\t\"_mcc\": \"901\",\r\n\t\t\t\t\"_mnc\": \"40\",\r\n\t\t\t\t\"_apn\": \"internet.m2mportal.de\",\r\n\t\t\t\t\"_type\": \"default\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"EMnify\",\r\n\t\t\t\t\"_mcc\": \"901\",\r\n\t\t\t\t\"_mnc\": \"43\",\r\n\t\t\t\t\"_apn\": \"em\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tata Move IOT\",\r\n\t\t\t\t\"_mcc\": \"901\",\r\n\t\t\t\t\"_mnc\": \"54\",\r\n\t\t\t\t\"_apn\": \"move.dataxs.mobi\",\r\n\t\t\t\t\"_type\": \"default,supl,dun\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_mcc\": \"901\",\r\n\t\t\t\t\"_mnc\": \"54\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"BICS Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2132\",\r\n\t\t\t\t\"_mcc\": \"901\",\r\n\t\t\t\t\"_mnc\": \"58\",\r\n\t\t\t\t\"_apn\": \"bicsapn\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Sparkle\",\r\n\t\t\t\t\"_mcc\": \"901\",\r\n\t\t\t\t\"_mnc\": \"78\",\r\n\t\t\t\t\"_apn\": \"ep05.tis.com\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Verizon IA\",\r\n\t\t\t\t\"_mcc\": \"999\",\r\n\t\t\t\t\"_mnc\": \"480\",\r\n\t\t\t\t\"_apn\": \"\",\r\n\t\t\t\t\"_type\": \"ia\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"LTE - Verizon Internet\",\r\n\t\t\t\t\"_mcc\": \"999\",\r\n\t\t\t\t\"_mnc\": \"480\",\r\n\t\t\t\t\"_apn\": \"VZWINTERNET\",\r\n\t\t\t\t\"_type\": \"default\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_profile_id\": \"0\",\r\n\t\t\t\t\"_modem_cognitive\": \"true\",\r\n\t\t\t\t\"_max_conns\": \"20\",\r\n\t\t\t\t\"_max_conns_time\": \"300\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile US LTE\",\r\n\t\t\t\t\"_carrier_id\": \"1\",\r\n\t\t\t\t\"_apn\": \"fast.t-mobile.com\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.msg.eng.t-mobile.com/mms/wapenc\",\r\n\t\t\t\t\"_type\": \"default,supl,mms,ia,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"T-Mobile IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Swisscom Services\",\r\n\t\t\t\t\"_carrier_id\": \"16\",\r\n\t\t\t\t\"_apn\": \"gprs.swisscom.ch\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Swisscom IMS\",\r\n\t\t\t\t\"_carrier_id\": \"16\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Swisscom Ut\",\r\n\t\t\t\t\"_carrier_id\": \"16\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ATT Nxtgenphone\",\r\n\t\t\t\t\"_carrier_id\": \"1187\",\r\n\t\t\t\t\"_apn\": \"nxtgenphone\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ATT IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1187\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ATT Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"1187\",\r\n\t\t\t\t\"_apn\": \"hotspot\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telia MMS\",\r\n\t\t\t\t\"_carrier_id\": \"1690\",\r\n\t\t\t\t\"_apn\": \"mms.telia.se\",\r\n\t\t\t\t\"_mmsc\": \"http://mmss\",\r\n\t\t\t\t\"_mmsproxy\": \"193.209.134.132\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telia\",\r\n\t\t\t\t\"_carrier_id\": \"1690\",\r\n\t\t\t\t\"_apn\": \"online.telia.se\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telia IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1690\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Telia Ut\",\r\n\t\t\t\t\"_carrier_id\": \"1690\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cricket internet\",\r\n\t\t\t\t\"_carrier_id\": \"1779\",\r\n\t\t\t\t\"_apn\": \"endo\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.aiowireless.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.aiowireless.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"1779\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cricket Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"1779\",\r\n\t\t\t\t\"_apn\": \"mht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"XCAP\",\r\n\t\t\t\t\"_carrier_id\": \"1779\",\r\n\t\t\t\t\"_apn\": \"endo\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Pure Talk internet\",\r\n\t\t\t\t\"_carrier_id\": \"2025\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2025\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"2025\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Airvoice internet\",\r\n\t\t\t\t\"_carrier_id\": \"2027\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2027\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"2027\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Ztar internet\",\r\n\t\t\t\t\"_carrier_id\": \"2028\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2028\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"2028\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Kore internet\",\r\n\t\t\t\t\"_carrier_id\": \"2031\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2031\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"2031\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ATT FirstNet-Phone\",\r\n\t\t\t\t\"_carrier_id\": \"2119\",\r\n\t\t\t\t\"_apn\": \"firstnet-phone\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ATT FirstNet IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2119\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ATT FirstNet Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"2119\",\r\n\t\t\t\t\"_apn\": \"firstnet-hotspot\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"XCAP\",\r\n\t\t\t\t\"_carrier_id\": \"2119\",\r\n\t\t\t\t\"_apn\": \"firstnet-phone\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Swisscom Services\",\r\n\t\t\t\t\"_carrier_id\": \"2366\",\r\n\t\t\t\t\"_apn\": \"gprs.swisscom.ch\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Swisscom IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2366\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Swisscom Ut\",\r\n\t\t\t\t\"_carrier_id\": \"2366\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mobi LTE\",\r\n\t\t\t\t\"_carrier_id\": \"2464\",\r\n\t\t\t\t\"_apn\": \"4g.mobi.net\",\r\n\t\t\t\t\"_type\": \"default,supl,ia,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mobi MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2464\",\r\n\t\t\t\t\"_apn\": \"mms.mobi.net\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.mobi.net\",\r\n\t\t\t\t\"_type\": \"mms\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mobi IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2464\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13|18|20\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mobi XCAP\",\r\n\t\t\t\t\"_carrier_id\": \"2464\",\r\n\t\t\t\t\"_apn\": \"hos\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_network_type_bitmask\": \"13|18|20\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"mobi OTA\",\r\n\t\t\t\t\"_carrier_id\": \"2464\",\r\n\t\t\t\t\"_apn\": \"ota.mobi.net\",\r\n\t\t\t\t\"_type\": \"fota\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"travelfy\",\r\n\t\t\t\t\"_carrier_id\": \"2472\",\r\n\t\t\t\t\"_apn\": \"travelfy\",\r\n\t\t\t\t\"_type\": \"default,ia,supl\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Liberty Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2504\",\r\n\t\t\t\t\"_apn\": \"internet\",\r\n\t\t\t\t\"_type\": \"default,ia,supl,fota,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MMS\",\r\n\t\t\t\t\"_carrier_id\": \"2504\",\r\n\t\t\t\t\"_apn\": \"mms\",\r\n\t\t\t\t\"_type\": \"mms\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobilecore.lla.com\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobilecore.lla.com\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2504\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"2504\",\r\n\t\t\t\t\"_apn\": \"hotspot\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dish-ATT internet\",\r\n\t\t\t\t\"_carrier_id\": \"2525\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2525\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"2525\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dish-ATT internet\",\r\n\t\t\t\t\"_carrier_id\": \"2526\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2526\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"2526\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dish-ATT internet\",\r\n\t\t\t\t\"_carrier_id\": \"2527\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2527\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"2527\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dish-ATT internet\",\r\n\t\t\t\t\"_carrier_id\": \"2534\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2534\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"2534\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dish-ATT internet\",\r\n\t\t\t\t\"_carrier_id\": \"2538\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2538\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"2538\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Dish-ATT internet\",\r\n\t\t\t\t\"_carrier_id\": \"2539\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2539\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"2539\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"SSi Mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2567\",\r\n\t\t\t\t\"_apn\": \"ssi992.ssimicro.com\",\r\n\t\t\t\t\"_type\": \"default,supl,ia,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.ssimicro.com\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.ssimicro.com\",\r\n\t\t\t\t\"_mmsport\": \"80\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Eeyou Mobility\",\r\n\t\t\t\t\"_carrier_id\": \"2568\",\r\n\t\t\t\t\"_apn\": \"apn.em.com\",\r\n\t\t\t\t\"_type\": \"default,supl,ia,mms\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_mmsc\": \"http://mms.eeyoumobility.com\",\r\n\t\t\t\t\"_mmsproxy\": \"mms.eeyoumobility.com\",\r\n\t\t\t\t\"_mmsport\": \"80\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MVNx #T Internet\",\r\n\t\t\t\t\"_carrier_id\": \"2575\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MVNx #T IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2575\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"MVNx #T Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"2575\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"DENT\",\r\n\t\t\t\t\"_carrier_id\": \"2583\",\r\n\t\t\t\t\"_apn\": \"global.telcoequity\",\r\n\t\t\t\t\"_type\": \"default\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"spusu\",\r\n\t\t\t\t\"_carrier_id\": \"2600\",\r\n\t\t\t\t\"_apn\": \"web\",\r\n\t\t\t\t\"_type\": \"default\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2600\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"HELP mobile\",\r\n\t\t\t\t\"_carrier_id\": \"2601\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_apn\": \"web\",\r\n\t\t\t\t\"_type\": \"default\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2601\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tchibo\",\r\n\t\t\t\t\"_carrier_id\": \"2602\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_apn\": \"web\",\r\n\t\t\t\t\"_type\": \"default\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2602\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"spusu\",\r\n\t\t\t\t\"_carrier_id\": \"2603\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_apn\": \"web\",\r\n\t\t\t\t\"_type\": \"default\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2603\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"spusu\",\r\n\t\t\t\t\"_carrier_id\": \"2604\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_apn\": \"web\",\r\n\t\t\t\t\"_type\": \"default\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2604\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"spusu\",\r\n\t\t\t\t\"_carrier_id\": \"2605\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_apn\": \"web\",\r\n\t\t\t\t\"_type\": \"default\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"2605\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Webbing\",\r\n\t\t\t\t\"_carrier_id\": \"2631\",\r\n\t\t\t\t\"_apn\": \"wbdata\",\r\n\t\t\t\t\"_type\": \"default,ia,dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Webbing\",\r\n\t\t\t\t\"_carrier_id\": \"2631\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Webbing\",\r\n\t\t\t\t\"_carrier_id\": \"2631\",\r\n\t\t\t\t\"_apn\": \"xcap\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Webbing\",\r\n\t\t\t\t\"_carrier_id\": \"2631\",\r\n\t\t\t\t\"_apn\": \"sos\",\r\n\t\t\t\t\"_type\": \"emergency\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tracfone AT&T\",\r\n\t\t\t\t\"_carrier_id\": \"10000\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tracfone AT&T IMS\",\r\n\t\t\t\t\"_carrier_id\": \"10000\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Tracfone AT&T Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"10000\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Red Pocket-ATT internet\",\r\n\t\t\t\t\"_carrier_id\": \"10012\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"10012\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"10012\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ATT 5G NSA default\",\r\n\t\t\t\t\"_carrier_id\": \"10021\",\r\n\t\t\t\t\"_apn\": \"enhancedphone\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ATT 5G NSA IMS\",\r\n\t\t\t\t\"_carrier_id\": \"10021\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_network_type_bitmask\": \"3|8|9|10|13|15|18|20\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ATT 5G NSA Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"10021\",\r\n\t\t\t\t\"_apn\": \"hotspot\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ATT 5G NSA XCAP\",\r\n\t\t\t\t\"_carrier_id\": \"10021\",\r\n\t\t\t\t\"_apn\": \"enhancedphone\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Consumer Cellular internet\",\r\n\t\t\t\t\"_carrier_id\": \"10022\",\r\n\t\t\t\t\"_apn\": \"ereseller\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota,xcap\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"10022\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"10022\",\r\n\t\t\t\t\"_apn\": \"resellermht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ATT 5G SA Default\",\r\n\t\t\t\t\"_carrier_id\": \"10028\",\r\n\t\t\t\t\"_apn\": \"nrphone\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.mobile.att.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.mobile.att.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ATT 5G SA IMS\",\r\n\t\t\t\t\"_carrier_id\": \"10028\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_network_type_bitmask\": \"3|8|9|10|13|15|18|20\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ATT 5G SA Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"10028\",\r\n\t\t\t\t\"_apn\": \"nrhotspot\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"ATT 5G SA XCAP\",\r\n\t\t\t\t\"_carrier_id\": \"10028\",\r\n\t\t\t\t\"_apn\": \"nrphone\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cricket internet\",\r\n\t\t\t\t\"_carrier_id\": \"10029\",\r\n\t\t\t\t\"_apn\": \"endo\",\r\n\t\t\t\t\"_type\": \"default,mms,supl,fota\",\r\n\t\t\t\t\"_mmsc\": \"http://mmsc.aiowireless.net\",\r\n\t\t\t\t\"_mmsproxy\": \"proxy.aiowireless.net\",\r\n\t\t\t\t\"_mmsport\": \"80\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_editable\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"IMS\",\r\n\t\t\t\t\"_carrier_id\": \"10029\",\r\n\t\t\t\t\"_apn\": \"ims\",\r\n\t\t\t\t\"_type\": \"ims\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"Cricket Hotspot\",\r\n\t\t\t\t\"_carrier_id\": \"10029\",\r\n\t\t\t\t\"_apn\": \"mht\",\r\n\t\t\t\t\"_type\": \"dun\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t},\r\n\t\t\t{\r\n\t\t\t\t\"_carrier\": \"XCAP\",\r\n\t\t\t\t\"_carrier_id\": \"10029\",\r\n\t\t\t\t\"_apn\": \"endo\",\r\n\t\t\t\t\"_type\": \"xcap\",\r\n\t\t\t\t\"_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_roaming_protocol\": \"IPV4V6\",\r\n\t\t\t\t\"_user_visible\": \"false\"\r\n\t\t\t}\r\n\t\t],\r\n\t\t\"_version\": \"8\"\r\n\t}\r\n}"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/files/dhcp",
    "content": "\nconfig dnsmasq\n\toption domainneeded '1'\n\toption boguspriv '1'\n\toption filterwin2k '0'\n\toption localise_queries '1'\n\toption rebind_protection '1'\n\toption rebind_localhost '1'\n\toption local '/lan/'\n\toption domain 'lan'\n\toption expandhosts '1'\n\toption nonegcache '0'\n\toption authoritative '1'\n\toption readethers '1'\n\toption leasefile '/tmp/dhcp.leases'\n\toption resolvfile '/tmp/resolv.conf.auto'\n\toption nonwildcard '1'\n\toption localservice '1'\n\nconfig dhcp 'lan'\n\toption interface 'lan'\n\toption start '100'\n\toption limit '150'\n\toption leasetime '12h'\n\toption ra 'relay'\n\toption dhcpv6 'disabled'\n\toption ndp 'relay'\n\nconfig dhcp 'wan'\n\toption interface 'wan'\n\toption ignore '1'\n\toption ra 'relay'\n\toption dhcpv6 'disabled'\n\toption ndp 'relay'\n\toption ndproxy_routing '0'\n\toption master '1'\n\nconfig dhcp 'wan6'\n\toption ra 'relay'\n\toption dhcpv6 'disabled'\n\toption ndp 'relay'\n\toption ndproxy_routing '0'\n\toption master '1'\n\toption interface 'wan6'\n\nconfig odhcpd 'odhcpd'\n\toption loglevel '7'\n\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/files/rmnet.script",
    "content": "#!/bin/sh\n#  Copyright (c) 2019 Qualcomm Technologies, Inc.\n#  All Rights Reserved.\n#  Confidential and Proprietary - Qualcomm Technologies, Inc.\n\n\n[ -z \"$1\" ] && echo \"Error: should be run by rmnet\" && exit 1\n[ -z \"$2\" ] && echo \"Error: should be run by rmnet\" && exit 1\n\n. /lib/functions.sh\n. /lib/functions/network.sh\n. /lib/netifd/netifd-proto.sh\nsetup_interface() {\n\tINTERFACE=$1\n\tCONFIG=/tmp/rmnet_$2_ipv4config\n\tlogger \"rmnet setup_interface $1 $2 here\"\n\t#Fetch information from lower.\n\t[ -f ${CONFIG} ] || {\n\t\tproto_notify_error \"$INTERFACE\" \"RMNET data call Not ready\"\n\t\tproto_block_restart \"$INTERFACE\"\n\t\treturn\n\t}\n\t. ${CONFIG} \n\tip=$PUBLIC_IP\n\tDNS=$DNSSERVERS\n\trouter=$GATEWAY\n\tsubnet=$NETMASK\n\tinterface=$IFNAME\n\t#Send the information to the netifd\n\tproto_init_update \"$interface\" 1 1\n\t#ip and subnet\n\tproto_add_ipv4_address \"$ip\" \"${subnet:-255.255.255.0}\"\n\n\t#Any router? if not, remove below scripts\n\t#router format should be separated by space\n\tfor i in $router; do\n\t\tproto_add_ipv4_route \"$i\" 32 \"\" \"$ip\"\n\t\tproto_add_ipv4_route 0.0.0.0 0 \"$i\" \"$ip\"\n\tdone\n\n\t#dns information tell the netifd.\n\tfor dns in $DNS; do\n\t\tproto_add_dns_server \"$dns\"\n\tdone\n\n\t#Domain information tell the netifd\n\tfor domain in $domain; do\n\t\tproto_add_dns_search \"$domain\"\n\tdone\n\n\t#proto_add_data\n\t[ -n \"$ZONE\" ] && json_add_string zone \"$ZONE\"\n\tproto_close_data\n\n\tproto_send_update \"$INTERFACE\"\n\n}\n\ncase \"$1\" in\n\trenew)\n\t\tsetup_interface $2 $3\n\t;;\nesac\n\nexit 0\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/files/rmnet.sh",
    "content": "#!/bin/sh\n#  Copyright (c) 2019 Qualcomm Technologies, Inc.\n#  All Rights Reserved.\n#  Confidential and Proprietary - Qualcomm Technologies, Inc.\n\n. /lib/functions.sh\n. /lib/functions/network.sh\n. ../netifd-proto.sh\ninit_proto \"$@\"\n\nproto_rmnet_setup() {\n\tlocal cfg=\"$1\"\n\tlocal iface=\"$2\"\n\n\tlogger \"rmnet started\"\n\t#Call rmnet management script below!!\n\tlogger \"rmnet updated ${cfg} ${iface}\"\n\t/lib/netifd/rmnet.script renew $cfg $iface\n}\n\nproto_rmnet_teardown() {\n\tlocal cfg=\"$1\"\n\t#Tear down rmnet manager script here.*/\n}\n\nproto_rmnet_init_config() {\n\t#ddno_device=1\n\tavailable=1\n}\n\nadd_protocol rmnet\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/files/rmnet6.script",
    "content": "#!/bin/sh\n#  Copyright (c) 2019 Qualcomm Technologies, Inc.\n#  All Rights Reserved.\n#  Confidential and Proprietary - Qualcomm Technologies, Inc.\n\n\n[ -z \"$1\" ] && echo \"Error: should be run by rmnet\" && exit 1\n[ -z \"$2\" ] && echo \"Error: should be run by rmnet\" && exit 1\n\n. /lib/functions.sh\n. /lib/functions/network.sh\n. /lib/netifd/netifd-proto.sh\nsetup_interface() {\n\tINTERFACE=$1\n\tCONFIG=/tmp/rmnet_$2_ipv6config\n\tlogger \"rmnet setup_interface $1 $2 here\"\n\t#Fetch information from lower.\n\t[ -f ${CONFIG} ] || {\n\t\tproto_notify_error \"$INTERFACE\" \"RMNET data call NOT ready\"\n\t\tproto_block_restart \"$INTERFACE\"\n\t\treturn\n\t}\n\t. ${CONFIG} \n\tADDRESSES=$PUBLIC_IP\n\tinterface=$IFNAME\n\t#Send the information to the netifd\n\tproto_init_update \"$interface\" 1 1\n\n\t#ip and subnet\n\tproto_add_ipv6_address \"${PUBLIC_IP}\" \"128\"\n\tproto_add_ipv6_prefix \"${PUBLIC_IP}/${PrefixLength}\"\n\n\t#router format should be separated by space\n\tproto_add_ipv6_route \"$GATEWAY\" 128\n\tproto_add_ipv6_route \"::0\" 0 \"$GATEWAY\" \"\" \"\" \"${PUBLIC_IP}/${PrefixLength}\"\n\n\t#dns information tell the netifd.\n\tfor dns in $DNSSERVERS; do\n\t\tproto_add_dns_server \"$dns\"\n\tdone\n\n\t#Domain information tell the netifd\n\tfor domain in $domain; do\n\t\tproto_add_dns_search \"$domain\"\n\tdone\n\n\t#proto_add_data\n\t[ -n \"$ZONE\" ]     && json_add_string zone \"$ZONE\"\n\tproto_close_data\n\n\tproto_send_update \"$INTERFACE\"\n}\n\ncase \"$1\" in\n\trenew|bound)\n\t\tsetup_interface $2 $3\n\t;;\nesac\n\nexit 0\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/files/rmnet6.sh",
    "content": "#!/bin/sh\n#  Copyright (c) 2019 Qualcomm Technologies, Inc.\n#  All Rights Reserved.\n#  Confidential and Proprietary - Qualcomm Technologies, Inc.\n\n. /lib/functions.sh\n. /lib/functions/network.sh\n. ../netifd-proto.sh\ninit_proto \"$@\"\n\nproto_rmnet6_setup() {\n\tlocal cfg=\"$1\"\n\tlocal iface=\"$2\"\n\n\tlogger \"rmnet6 started\"\n\t#Call rmnet management script below!!\n\t/lib/netifd/rmnet6.script renew $cfg $iface\n\tlogger \"rmnet6 updated\"\n}\n\nproto_rmnet6_teardown() {\n\tlocal cfg=\"$1\"\n\t#Tear down rmnet manager script here.*/\n}\n\nproto_rmnet6_init_config() {\n\t#ddno_device=1\n\tavailable=1\n}\n\nadd_protocol rmnet6\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/files/rmnet_init.sh",
    "content": "#!/bin/sh\n\nuci set network.wan='interface'\nuci set network.wan.ifname='wwan0'\nuci set network.wan.proto='rmnet'\n\nuci set network.wan6='interface'\nuci set network.wan6.ifname='wwan0'\nuci set network.wan6.proto='rmnet6'\n\nuci set dhcp.lan.ra='relay'\nuci set dhcp.lan.dhcpv6='disabled'\nuci set dhcp.lan.ndp='relay'\n\nuci set dhcp.wan.ra='relay'\nuci set dhcp.wan.dhcpv6='disabled'\nuci set dhcp.wan.ndp='relay'\nuci set dhcp.wan.ndproxy_routing='0'\n\nuci set dhcp.wan6=dhcp\nuci set dhcp.wan6.interface='wan6'\nuci set dhcp.wan6.ra='relay'\nuci set dhcp.wan6.dhcpv6='disabled'\nuci set dhcp.wan6.ndp='relay'\nuci set dhcp.wan6.ndproxy_routing='0'\nuci set dhcp.wan6.master='1'\n\nuci set dhcp.odhcpd=odhcpd\nuci set dhcp.odhcpd.loglevel='7'\n\nuci commit\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 2.4) \n\nproject(quectel-CM) \nadd_definitions(-Wall -Wextra -Werror -O1)\noption(USE_QRTR \"Enable QRTR\" OFF) \n\nset( QL_CM_SRC\n     QmiWwanCM.c GobiNetCM.c main.c MPQMUX.c QMIThread.c util.c qmap_bridge_mode.c mbim-cm.c device.c\n     atc.c atchannel.c at_tok.c\n     udhcpc.c\n     )\n\nif(USE_QRTR) \nadd_definitions(-DCONFIG_QRTR)\nset( QRTR_SRC qrtr.c rmnetctl.c)\nendif() \n\nadd_executable(quectel-CM ${QL_CM_SRC} ${QRTR_SRC})\ntarget_link_libraries(quectel-CM PUBLIC pthread) \ninstall (TARGETS quectel-CM DESTINATION bin)\n\nadd_executable(quectel-qmi-proxy quectel-qmi-proxy.c)\ntarget_link_libraries(quectel-qmi-proxy PUBLIC pthread) \ninstall (TARGETS quectel-qmi-proxy DESTINATION bin)\n\nadd_executable(quectel-mbim-proxy quectel-mbim-proxy.c)\ntarget_link_libraries(quectel-mbim-proxy PUBLIC pthread) \ninstall (TARGETS quectel-mbim-proxy DESTINATION bin)\n\nadd_executable(quectel-atc-proxy quectel-atc-proxy.c atchannel.c at_tok.c util.c)\ntarget_link_libraries(quectel-atc-proxy PUBLIC pthread) \ninstall (TARGETS quectel-atc-proxy DESTINATION bin)\n\nadd_executable(quectel-qrtr-proxy quectel-qrtr-proxy.c)\ntarget_link_libraries(quectel-qrtr-proxy PUBLIC pthread) \ninstall (TARGETS quectel-qrtr-proxy DESTINATION bin)\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/GobiNetCM.c",
    "content": "/******************************************************************************\n  @file    GobiNetCM.c\n  @brief   GobiNet driver.\n\n  DESCRIPTION\n  Connectivity Management Tool for USB network adapter of Quectel wireless cellular modules.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n#include <stdio.h>\n#include <string.h>\n#include <termios.h>\n#include <stdio.h>\n#include <ctype.h>\n#include \"QMIThread.h\"\n\n#ifdef CONFIG_GOBINET\nstatic int qmiclientId[QMUX_TYPE_ALL];\n\n// IOCTL to generate a client ID for this service type\n#define IOCTL_QMI_GET_SERVICE_FILE 0x8BE0 + 1\n\n// IOCTL to get the VIDPID of the device\n#define IOCTL_QMI_GET_DEVICE_VIDPID 0x8BE0 + 2\n\n// IOCTL to get the MEID of the device\n#define IOCTL_QMI_GET_DEVICE_MEID 0x8BE0 + 3\n\nstatic int GobiNetSendQMI(PQCQMIMSG pRequest) {\n    int ret, fd;\n\n    fd = qmiclientId[pRequest->QMIHdr.QMIType];\n    pRequest->QMIHdr.ClientId = (fd&0xFF) ? fd&0xFF : pRequest->QMIHdr.QMIType;\n\n    if (fd <= 0) {\n        dbg_time(\"%s QMIType: %d has no clientID\", __func__, pRequest->QMIHdr.QMIType);\n        return -ENODEV;\n    }\n\n    // Always ready to write\n    if (1 == 1) {\n        ssize_t nwrites = le16_to_cpu(pRequest->QMIHdr.Length) + 1 - sizeof(QCQMI_HDR);\n        ret = write(fd, &pRequest->MUXMsg, nwrites);\n        if (ret == nwrites) {\n            ret = 0;\n        } else {\n            dbg_time(\"%s write=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\n        }\n    } else {\n        dbg_time(\"%s poll=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\n    }\n\n    return ret;\n}\n\nstatic int GobiNetGetClientID(const char *qcqmi, UCHAR QMIType) {\n    int ClientId;\n    ClientId = cm_open_dev(qcqmi);\n    if (ClientId == -1) {\n        dbg_time(\"failed to open %s, errno: %d (%s)\", qcqmi, errno, strerror(errno));\n        return -1;\n    }\n\n    if (ioctl(ClientId, IOCTL_QMI_GET_SERVICE_FILE, QMIType) != 0) {\n        dbg_time(\"failed to get ClientID for 0x%02x errno: %d (%s)\", QMIType, errno, strerror(errno));\n        close(ClientId);\n        ClientId = 0;\n    }\n\n    switch (QMIType) {\n        case QMUX_TYPE_WDS: dbg_time(\"Get clientWDS = %d\", ClientId); break;\n        case QMUX_TYPE_DMS: dbg_time(\"Get clientDMS = %d\", ClientId); break;\n        case QMUX_TYPE_NAS: dbg_time(\"Get clientNAS = %d\", ClientId); break;\n        case QMUX_TYPE_QOS: dbg_time(\"Get clientQOS = %d\", ClientId); break;\n        case QMUX_TYPE_WMS: dbg_time(\"Get clientWMS = %d\", ClientId); break;\n        case QMUX_TYPE_PDS: dbg_time(\"Get clientPDS = %d\", ClientId); break;\n        case QMUX_TYPE_UIM: dbg_time(\"Get clientUIM = %d\", ClientId); break;\n        case QMUX_TYPE_COEX: dbg_time(\"Get clientCOEX = %d\", ClientId); break;\n        case QMUX_TYPE_WDS_ADMIN: dbg_time(\"Get clientWDA = %d\", ClientId);\n        break;\n        default: break;\n    }\n\n    return ClientId;\n}\n\nstatic int GobiNetDeInit(void) {\n    unsigned int i;\n    for (i = 0; i < sizeof(qmiclientId)/sizeof(qmiclientId[0]); i++)\n    {\n        if (qmiclientId[i] != 0)\n        {\n            close(qmiclientId[i]);\n            qmiclientId[i] = 0;\n        }\n    }\n\n    return 0;\n}\n\nstatic void * GobiNetThread(void *pData) {\n    PROFILE_T *profile = (PROFILE_T *)pData;\n    const char *qcqmi = (const char *)profile->qmichannel;\n    int wait_for_request_quit = 0;   \n    \n    qmiclientId[QMUX_TYPE_WDS] = GobiNetGetClientID(qcqmi, QMUX_TYPE_WDS);\n    if (profile->enable_ipv6)\n        qmiclientId[QMUX_TYPE_WDS_IPV6] = GobiNetGetClientID(qcqmi, QMUX_TYPE_WDS);\n    qmiclientId[QMUX_TYPE_DMS] = GobiNetGetClientID(qcqmi, QMUX_TYPE_DMS);\n    qmiclientId[QMUX_TYPE_NAS] = GobiNetGetClientID(qcqmi, QMUX_TYPE_NAS);\n    qmiclientId[QMUX_TYPE_UIM] = GobiNetGetClientID(qcqmi, QMUX_TYPE_UIM);\n#ifdef CONFIG_COEX_WWAN_STATE\n    qmiclientId[QMUX_TYPE_COEX] = GobiNetGetClientID(qcqmi, QMUX_TYPE_COEX);\n#endif\n    if (profile->qmap_mode == 0 || profile->loopback_state) {//when QMAP enabled, set data format in GobiNet Driver\n        qmiclientId[QMUX_TYPE_WDS_ADMIN] = GobiNetGetClientID(qcqmi, QMUX_TYPE_WDS_ADMIN);\n        profile->wda_client = qmiclientId[QMUX_TYPE_WDS_ADMIN];\n    }\n\n    //donot check clientWDA, there is only one client for WDA, if quectel-CM is killed by SIGKILL, i cannot get client ID for WDA again!\n    if (qmiclientId[QMUX_TYPE_WDS] == 0)  /*|| (clientWDA == -1)*/ {\n        GobiNetDeInit();\n        dbg_time(\"%s Failed to open %s, errno: %d (%s)\", __func__, qcqmi, errno, strerror(errno));\n        qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_DISCONNECTED);\n        pthread_exit(NULL);\n        return NULL;\n    }\n\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_CONNECTED);\n\n    while (1) {\n        struct pollfd pollfds[16] = {{qmidevice_control_fd[1], POLLIN, 0}};\n        int ne, ret, nevents = 1;\n        unsigned int i;\n\n        for (i = 0; i < sizeof(qmiclientId)/sizeof(qmiclientId[0]); i++)\n        {\n            if (qmiclientId[i] != 0)\n            {\n                pollfds[nevents].fd = qmiclientId[i];\n                pollfds[nevents].events = POLLIN;\n                pollfds[nevents].revents = 0;\n                nevents++;\n            }\n        }\n\n        do {\n            ret = poll(pollfds, nevents, wait_for_request_quit ? 1000: -1);\n         } while ((ret < 0) && (errno == EINTR));\n\n\tif (ret == 0 && wait_for_request_quit) {\n    \t\tQmiThreadRecvQMI(NULL); //main thread may pending on QmiThreadSendQMI()\n\t\tcontinue;\n\t}\n\n        if (ret <= 0) {\n            dbg_time(\"%s poll=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\n            break;\n        }\n\n        for (ne = 0; ne < nevents; ne++) {\n            int fd = pollfds[ne].fd;\n            short revents = pollfds[ne].revents;\n\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\n                dbg_time(\"%s poll err/hup/inval\", __func__);\n                dbg_time(\"epoll fd = %d, events = 0x%04x\", fd, revents);\n                if (fd == qmidevice_control_fd[1]) {\n                } else {\n                }\n                if (revents & (POLLERR | POLLHUP | POLLNVAL))\n                    goto __GobiNetThread_quit;\n            }\n\n            if ((revents & POLLIN) == 0)\n                continue;\n\n            if (fd == qmidevice_control_fd[1]) {\n                int triger_event;\n                if (read(fd, &triger_event, sizeof(triger_event)) == sizeof(triger_event)) {\n                    //DBG(\"triger_event = 0x%x\", triger_event);\n                    switch (triger_event) {\n                        case RIL_REQUEST_QUIT:\n                            goto __GobiNetThread_quit;\n                        break;\n                        case SIG_EVENT_STOP:\n                            wait_for_request_quit = 1;   \n                        break;\n                        default:\n                        break;\n                    }\n                }\n                continue;\n            }\n\n            {\n                ssize_t nreads;\n                PQCQMIMSG pResponse = (PQCQMIMSG)cm_recv_buf;\n\n                nreads = read(fd, &pResponse->MUXMsg, sizeof(cm_recv_buf) - sizeof(QCQMI_HDR));\n                if (nreads <= 0)\n                {\n                    dbg_time(\"%s read=%d errno: %d (%s)\",  __func__, (int)nreads, errno, strerror(errno));\n                    break;\n                }\n\n                for (i = 0; i < sizeof(qmiclientId)/sizeof(qmiclientId[0]); i++)\n                {\n                    if (qmiclientId[i] == fd)\n                    {\n                        pResponse->QMIHdr.QMIType = i;\n                    }\n                }\n\n                pResponse->QMIHdr.IFType = USB_CTL_MSG_TYPE_QMI;\n                pResponse->QMIHdr.Length = cpu_to_le16(nreads + sizeof(QCQMI_HDR)  - 1);\n                pResponse->QMIHdr.CtlFlags = 0x00;\n                pResponse->QMIHdr.ClientId = (fd&0xFF) ? fd&0xFF : pResponse->QMIHdr.QMIType;;\n\n                QmiThreadRecvQMI(pResponse);\n            }\n        }\n    }\n\n__GobiNetThread_quit:\n    GobiNetDeInit();\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_DISCONNECTED);\n    QmiThreadRecvQMI(NULL); //main thread may pending on QmiThreadSendQMI()\n    dbg_time(\"%s exit\", __func__);\n    pthread_exit(NULL);\n    return NULL;\n}\n\nconst struct qmi_device_ops gobi_qmidev_ops = {\n\t.deinit = GobiNetDeInit,\n\t.send = GobiNetSendQMI,\n\t.read = GobiNetThread,\n};\n#endif\n\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/Makefile",
    "content": "ifneq ($(CROSS_COMPILE),)\nCROSS-COMPILE:=$(CROSS_COMPILE)\nendif\n#CROSS-COMPILE:=/workspace/buildroot/buildroot-qemu_mips_malta_defconfig/output/host/usr/bin/mips-buildroot-linux-uclibc-\n#CROSS-COMPILE:=/workspace/buildroot/buildroot-qemu_arm_vexpress_defconfig/output/host/usr/bin/arm-buildroot-linux-uclibcgnueabi-\n#CROSS-COMPILE:=/workspace/buildroot-git/qemu_mips64_malta/output/host/usr/bin/mips-gnu-linux-\nifeq ($(CC),cc)\nCC:=$(CROSS-COMPILE)gcc\nendif\nLD:=$(CROSS-COMPILE)ld\n\nQL_CM_SRC=QmiWwanCM.c GobiNetCM.c main.c QCQMUX.c QMIThread.c util.c qmap_bridge_mode.c mbim-cm.c device.c\nQL_CM_SRC+=atc.c atchannel.c at_tok.c\n#QL_CM_SRC+=qrtr.c rmnetctl.c\nifeq (1,1)\nQL_CM_DHCP=udhcpc.c\nelse\nLIBMNL=libmnl/ifutils.c libmnl/attr.c libmnl/callback.c libmnl/nlmsg.c libmnl/socket.c\nDHCP=libmnl/dhcp/dhcpclient.c libmnl/dhcp/dhcpmsg.c libmnl/dhcp/packet.c\nQL_CM_DHCP=udhcpc_netlink.c\nQL_CM_DHCP+=${LIBMNL}\nendif\n\nCFLAGS += -Wall -Wextra -Werror -O1 #-s\n# Allow incompatible-pointer-types, unused-result, and stringop-overflow warnings for vendor code compatibility\nCFLAGS += -Wno-error=incompatible-pointer-types -Wno-error=unused-result -Wno-error=stringop-overflow\nLDFLAGS += -lpthread -ldl -lrt -ljson-c\n\nrelease: clean qmi-proxy mbim-proxy atc-proxy #qrtr-proxy\n\t$(CC) ${CFLAGS} ${QL_CM_SRC} ${QL_CM_DHCP} -o quectel-CM ${LDFLAGS}\n\ndebug: clean\n\t$(CC) ${CFLAGS} -g -DCM_DEBUG ${QL_CM_SRC} ${QL_CM_DHCP} -o quectel-CM -lpthread -ldl -lrt\n\nqmi-proxy:\n\t$(CC) ${CFLAGS} quectel-qmi-proxy.c -o quectel-qmi-proxy ${LDFLAGS} \n\nmbim-proxy:\n\t$(CC) ${CFLAGS} quectel-mbim-proxy.c -o quectel-mbim-proxy ${LDFLAGS} \n\nqrtr-proxy:\n\t$(CC) ${CFLAGS} quectel-qrtr-proxy.c -o quectel-qrtr-proxy ${LDFLAGS} \n\natc-proxy:\n\t$(CC) ${CFLAGS} quectel-atc-proxy.c atchannel.c at_tok.c util.c -o quectel-atc-proxy ${LDFLAGS} \n\nclean:\n\trm -rf *.o libmnl/*.o quectel-CM quectel-qmi-proxy quectel-mbim-proxy quectel-atc-proxy\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/Makefile.am",
    "content": "bin_PROGRAMS = quectel-CM\nQL_CM_SRC=QmiWwanCM.c GobiNetCM.c main.c MPQMUX.c QMIThread.c util.c qmap_bridge_mode.c mbim-cm.c device.c\nQL_CM_SRC+=atc.c atchannel.c at_tok.c\n#QL_CM_SRC+=qrtr.c rmnetctl.c\nQL_CM_DHCP=udhcpc.c\nif USE_QRTR\nquectel_CM_CFLAGS = -DCONFIG_QRTR \nQL_CM_SRC += qrtr.c rmnetctl.c\nif USE_MSM_IPC\nquectel_CM_CFLAGS += -DUSE_LINUX_MSM_IPC\nendif\nendif\n\nquectel_CM_SOURCES = ${QL_CM_SRC} ${QL_CM_DHCP} \n\nbin_PROGRAMS += quectel-qmi-proxy\nquectel_qmi_proxy_SOURCES = quectel-qmi-proxy.c\n\nbin_PROGRAMS += quectel-mbim-proxy\nquectel_mbim_proxy_SOURCES = quectel-mbim-proxy.c\nLIBS = -l pthread\nCFLAGS = -Wall -Wextra -Werror -O1\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/NOTICE",
    "content": "This program is totally open souce code, and public domain software for customers of Quectel company.\n\nThe APIs of QMI WWAMN interfaces are defined by Qualcomm. And this program complies with Qualcomm QMI WWAN interfaces specification.\n\nCustomers are free to modify the source codes and redistribute them.\n\nFor those who is not Quectel's customer, all rights are closed, and any copying and commercial development over this progrma is not allowed. \n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/QCQCTL.h",
    "content": "/******************************************************************************\n  @file    QCQCTL.h\n\n  DESCRIPTION\n  This module contains QMI QCTL module.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n\n\n#ifndef QCQCTL_H\n#define QCQCTL_H\n\n#include \"QCQMI.h\"\n\n#pragma pack(push, 1)\n\n// ================= QMICTL ==================\n\n// QMICTL Control Flags\n#define QMICTL_CTL_FLAG_CMD     0x00\n#define QMICTL_CTL_FLAG_RSP     0x01\n#define QMICTL_CTL_FLAG_IND     0x02\n\n#if 0\ntypedef struct _QMICTL_TRANSACTION_ITEM\n{\n   LIST_ENTRY  List;\n   UCHAR       TransactionId;  // QMICTL transaction id\n   PVOID       Context;        // Adapter or IocDev\n   PIRP        Irp;\n} QMICTL_TRANSACTION_ITEM, *PQMICTL_TRANSACTION_ITEM;\n#endif\n\ntypedef struct _QCQMICTL_MSG_HDR\n{\n   UCHAR  CtlFlags;  // 00-cmd, 01-rsp, 10-ind\n   UCHAR  TransactionId;\n   USHORT QMICTLType;\n   USHORT Length;\n} __attribute__ ((packed)) QCQMICTL_MSG_HDR, *PQCQMICTL_MSG_HDR;\n\n#define QCQMICTL_MSG_HDR_SIZE sizeof(QCQMICTL_MSG_HDR)\n\ntypedef struct _QCQMICTL_MSG_HDR_RESP\n{\n   UCHAR  CtlFlags;  // 00-cmd, 01-rsp, 10-ind\n   UCHAR  TransactionId;\n   USHORT QMICTLType;\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n} __attribute__ ((packed)) QCQMICTL_MSG_HDR_RESP, *PQCQMICTL_MSG_HDR_RESP;\n\ntypedef struct _QCQMICTL_MSG\n{\n   UCHAR  CtlFlags;  // 00-cmd, 01-rsp, 10-ind\n   UCHAR  TransactionId;\n   USHORT QMICTLType;\n   USHORT Length;\n   UCHAR  Payload;\n} __attribute__ ((packed)) QCQMICTL_MSG, *PQCQMICTL_MSG;\n\n// TLV Header\ntypedef struct _QCQMICTL_TLV_HDR\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n} __attribute__ ((packed)) QCQMICTL_TLV_HDR, *PQCQMICTL_TLV_HDR;\n\n#define QCQMICTL_TLV_HDR_SIZE sizeof(QCQMICTL_TLV_HDR)\n\n// QMICTL Type\n#define QMICTL_SET_INSTANCE_ID_REQ    0x0020\n#define QMICTL_SET_INSTANCE_ID_RESP   0x0020\n#define QMICTL_GET_VERSION_REQ        0x0021\n#define QMICTL_GET_VERSION_RESP       0x0021\n#define QMICTL_GET_CLIENT_ID_REQ      0x0022\n#define QMICTL_GET_CLIENT_ID_RESP     0x0022\n#define QMICTL_RELEASE_CLIENT_ID_REQ  0x0023\n#define QMICTL_RELEASE_CLIENT_ID_RESP 0x0023\n#define QMICTL_REVOKE_CLIENT_ID_IND   0x0024\n#define QMICTL_INVALID_CLIENT_ID_IND  0x0025\n#define QMICTL_SET_DATA_FORMAT_REQ    0x0026\n#define QMICTL_SET_DATA_FORMAT_RESP   0x0026\n#define QMICTL_SYNC_REQ               0x0027\n#define QMICTL_SYNC_RESP              0x0027\n#define QMICTL_SYNC_IND               0x0027\n#define QMI_MESSAGE_CTL_INTERNAL_PROXY_OPEN 0xFF00\n\n#define QMICTL_FLAG_REQUEST    0x00\n#define QMICTL_FLAG_RESPONSE   0x01\n#define QMICTL_FLAG_INDICATION 0x02\n\n// QMICTL Message Definitions\n\ntypedef struct _QMICTL_SET_INSTANCE_ID_REQ_MSG\n{\n   UCHAR  CtlFlags;        // QMICTL_FLAG_REQUEST\n   UCHAR  TransactionId;\n   USHORT QMICTLType;      // QMICTL_SET_INSTANCE_ID_REQ\n   USHORT Length;          // 4\n   UCHAR  TLVType;         // QCTLV_TYPE_REQUIRED_PARAMETER\n   USHORT TLVLength;       // 1\n   UCHAR  Value;           // Host-unique QMI instance for this device driver\n} __attribute__ ((packed)) QMICTL_SET_INSTANCE_ID_REQ_MSG, *PQMICTL_SET_INSTANCE_ID_REQ_MSG;\n\ntypedef struct _QMICTL_SET_INSTANCE_ID_RESP_MSG\n{\n   UCHAR  CtlFlags;        // QMICTL_FLAG_RESPONSE\n   UCHAR  TransactionId;\n   USHORT QMICTLType;      // QMICTL_SET_INSTANCE_ID_RESP\n   USHORT Length;\n   UCHAR  TLVType;         // QCTLV_TYPE_RESULT_CODE\n   USHORT TLVLength;       // 0x0004\n   USHORT QMIResult;\n   USHORT QMIError;\n   UCHAR  TLV2Type;        // QCTLV_TYPE_REQUIRED_PARAMETER\n   USHORT TLV2Length;      // 0x0002\n   USHORT QMI_ID;          // Upper byte is assigned by MSM,\n                           // lower assigned by host\n} __attribute__ ((packed)) QMICTL_SET_INSTANCE_ID_RESP_MSG, *PQMICTL_SET_INSTANCE_ID_RESP_MSG;\n\ntypedef struct _QMICTL_GET_VERSION_REQ_MSG\n{\n   UCHAR  CtlFlags;        // QMICTL_FLAG_REQUEST\n   UCHAR  TransactionId;\n   USHORT QMICTLType;      // QMICTL_GET_VERSION_REQ\n   USHORT Length;          // 0\n   UCHAR  TLVType;         // QCTLV_TYPE_REQUIRED_PARAMETER\n   USHORT TLVLength;       // var\n   UCHAR  QMUXTypes;       // List of one byte QMUX_TYPE values\n                           // 0xFF returns a list of versions for all\n                           // QMUX_TYPEs implemented on the device\n} __attribute__ ((packed)) QMICTL_GET_VERSION_REQ_MSG, *PQMICTL_GET_VERSION_REQ_MSG;\n\ntypedef struct _QMUX_TYPE_VERSION_STRUCT\n{\n   UCHAR  QMUXType;\n   USHORT MajorVersion;\n   USHORT MinorVersion;\n} __attribute__ ((packed)) QMUX_TYPE_VERSION_STRUCT, *PQMUX_TYPE_VERSION_STRUCT;\n\ntypedef struct _ADDENDUM_VERSION_PREAMBLE\n{\n   UCHAR LabelLength;\n   UCHAR Label;\n} __attribute__ ((packed)) ADDENDUM_VERSION_PREAMBLE, *PADDENDUM_VERSION_PREAMBLE;\n\n#define QMICTL_GET_VERSION_RSP_TLV_TYPE_VERSION     0x01\n#define QMICTL_GET_VERSION_RSP_TLV_TYPE_ADD_VERSION 0x10\n\ntypedef struct _QMICTL_GET_VERSION_RESP_MSG\n{\n   UCHAR  CtlFlags;        // QMICTL_FLAG_RESPONSE\n   UCHAR  TransactionId;\n   USHORT QMICTLType;      // QMICTL_GET_VERSION_RESP\n   USHORT Length;\n   UCHAR  TLVType;         // QCTLV_TYPE_RESULT_CODE\n   USHORT TLVLength;       // 0x0004\n   USHORT QMIResult;\n   USHORT QMIError;\n   UCHAR  TLV2Type;        // QCTLV_TYPE_REQUIRED_PARAMETER\n   USHORT TLV2Length;      // var\n   UCHAR  NumElements;     // Num of QMUX_TYPE_VERSION_STRUCT\n   QMUX_TYPE_VERSION_STRUCT TypeVersion[0];\n} __attribute__ ((packed)) QMICTL_GET_VERSION_RESP_MSG, *PQMICTL_GET_VERSION_RESP_MSG;\n\ntypedef struct _QMICTL_GET_CLIENT_ID_REQ_MSG\n{\n   UCHAR  CtlFlags;        // QMICTL_FLAG_REQUEST\n   UCHAR  TransactionId;\n   USHORT QMICTLType;      // QMICTL_GET_CLIENT_ID_REQ\n   USHORT Length;\n   UCHAR  TLVType;         // QCTLV_TYPE_REQUIRED_PARAMETER\n   USHORT TLVLength;       // 1\n   UCHAR  QMIType;         // QMUX type\n} __attribute__ ((packed)) QMICTL_GET_CLIENT_ID_REQ_MSG, *PQMICTL_GET_CLIENT_ID_REQ_MSG;\n\ntypedef struct _QMICTL_GET_CLIENT_ID_RESP_MSG\n{\n   UCHAR  CtlFlags;        // QMICTL_FLAG_RESPONSE\n   UCHAR  TransactionId;\n   USHORT QMICTLType;      // QMICTL_GET_CLIENT_ID_RESP\n   USHORT Length;\n   UCHAR  TLVType;         // QCTLV_TYPE_RESULT_CODE\n   USHORT TLVLength;       // 0x0004\n   USHORT QMIResult;       // result code\n   USHORT QMIError;        // error code\n   UCHAR  TLV2Type;        // QCTLV_TYPE_REQUIRED_PARAMETER\n   USHORT TLV2Length;      // 2\n   UCHAR  QMIType;\n   UCHAR  ClientId;\n} __attribute__ ((packed)) QMICTL_GET_CLIENT_ID_RESP_MSG, *PQMICTL_GET_CLIENT_ID_RESP_MSG;\n\ntypedef struct _QMICTL_RELEASE_CLIENT_ID_REQ_MSG\n{\n   UCHAR  CtlFlags;        // QMICTL_FLAG_REQUEST\n   UCHAR  TransactionId;\n   USHORT QMICTLType;      // QMICTL_RELEASE_CLIENT_ID_REQ\n   USHORT Length;\n   UCHAR  TLVType;         // QCTLV_TYPE_REQUIRED_PARAMETER\n   USHORT TLVLength;       // 0x0002\n   UCHAR  QMIType;\n   UCHAR  ClientId;\n} __attribute__ ((packed)) QMICTL_RELEASE_CLIENT_ID_REQ_MSG, *PQMICTL_RELEASE_CLIENT_ID_REQ_MSG;\n\ntypedef struct _QMICTL_RELEASE_CLIENT_ID_RESP_MSG\n{\n   UCHAR  CtlFlags;        // QMICTL_FLAG_RESPONSE\n   UCHAR  TransactionId;\n   USHORT QMICTLType;      // QMICTL_RELEASE_CLIENT_ID_RESP\n   USHORT Length;\n   UCHAR  TLVType;         // QCTLV_TYPE_RESULT_CODE\n   USHORT TLVLength;       // 0x0004\n   USHORT QMIResult;       // result code\n   USHORT QMIError;        // error code\n   UCHAR  TLV2Type;        // QCTLV_TYPE_REQUIRED_PARAMETER\n   USHORT TLV2Length;      // 2\n   UCHAR  QMIType;\n   UCHAR  ClientId;\n} __attribute__ ((packed)) QMICTL_RELEASE_CLIENT_ID_RESP_MSG, *PQMICTL_RELEASE_CLIENT_ID_RESP_MSG;\n\ntypedef struct _QMICTL_REVOKE_CLIENT_ID_IND_MSG\n{\n   UCHAR  CtlFlags;        // QMICTL_FLAG_INDICATION\n   UCHAR  TransactionId;\n   USHORT QMICTLType;      // QMICTL_REVOKE_CLIENT_ID_IND\n   USHORT Length;\n   UCHAR  TLVType;         // QCTLV_TYPE_REQUIRED_PARAMETER\n   USHORT TLVLength;       // 0x0002\n   UCHAR  QMIType;\n   UCHAR  ClientId;\n} __attribute__ ((packed)) QMICTL_REVOKE_CLIENT_ID_IND_MSG, *PQMICTL_REVOKE_CLIENT_ID_IND_MSG;\n\ntypedef struct _QMICTL_INVALID_CLIENT_ID_IND_MSG\n{\n   UCHAR  CtlFlags;        // QMICTL_FLAG_INDICATION\n   UCHAR  TransactionId;\n   USHORT QMICTLType;      // QMICTL_REVOKE_CLIENT_ID_IND\n   USHORT Length;\n   UCHAR  TLVType;         // QCTLV_TYPE_REQUIRED_PARAMETER\n   USHORT TLVLength;       // 0x0002\n   UCHAR  QMIType;\n   UCHAR  ClientId;\n} __attribute__ ((packed)) QMICTL_INVALID_CLIENT_ID_IND_MSG, *PQMICTL_INVALID_CLIENT_ID_IND_MSG;\n\ntypedef struct _QMICTL_SET_DATA_FORMAT_REQ_MSG\n{\n   UCHAR  CtlFlags;        // QMICTL_FLAG_REQUEST\n   UCHAR  TransactionId;\n   USHORT QMICTLType;      // QMICTL_SET_DATA_FORMAT_REQ\n   USHORT Length;\n   UCHAR  TLVType;         // QCTLV_TYPE_REQUIRED_PARAMETER\n   USHORT TLVLength;       // 1\n   UCHAR  DataFormat;      // 0-default; 1-QoS hdr present\n} __attribute__ ((packed)) QMICTL_SET_DATA_FORMAT_REQ_MSG, *PQMICTL_SET_DATA_FORMAT_REQ_MSG;\n\n#ifdef QC_IP_MODE\n#define SET_DATA_FORMAT_TLV_TYPE_LINK_PROTO 0x10\n#define SET_DATA_FORMAT_LINK_PROTO_ETH      0x0001\n#define SET_DATA_FORMAT_LINK_PROTO_IP       0x0002\ntypedef struct _QMICTL_SET_DATA_FORMAT_TLV_LINK_PROT\n{\n   UCHAR  TLVType;         // Link-Layer Protocol\n   USHORT TLVLength;       // 2\n   USHORT LinkProt;        // 0x1: ETH; 0x2: IP\n} QMICTL_SET_DATA_FORMAT_TLV_LINK_PROT, *PQMICTL_SET_DATA_FORMAT_TLV_LINK_PROT;\n\n#ifdef QCMP_UL_TLP\n#define SET_DATA_FORMAT_TLV_TYPE_UL_TLP 0x11\ntypedef struct _QMICTL_SET_DATA_FORMAT_TLV_UL_TLP\n{\n   UCHAR  TLVType;         // 0x11, Uplink TLP Setting\n   USHORT TLVLength;       // 1\n   UCHAR  UlTlpSetting;    // 0x0: Disable; 0x01: Enable\n} QMICTL_SET_DATA_FORMAT_TLV_UL_TLP, *PQMICTL_SET_DATA_FORMAT_TLV_UL_TLP;\n#endif // QCMP_UL_TLP\n\n#ifdef QCMP_DL_TLP\n#define SET_DATA_FORMAT_TLV_TYPE_DL_TLP 0x13\ntypedef struct _QMICTL_SET_DATA_FORMAT_TLV_DL_TLP\n{\n   UCHAR  TLVType;         // 0x11, Uplink TLP Setting\n   USHORT TLVLength;       // 1\n   UCHAR  DlTlpSetting;    // 0x0: Disable; 0x01: Enable\n} QMICTL_SET_DATA_FORMAT_TLV_DL_TLP, *PQMICTL_SET_DATA_FORMAT_TLV_DL_TLP;\n#endif // QCMP_DL_TLP\n\n#endif // QC_IP_MODE\n\n#ifdef MP_QCQOS_ENABLED\n#define SET_DATA_FORMAT_TLV_TYPE_QOS_SETTING 0x12\ntypedef struct _QMICTL_SET_DATA_FORMAT_TLV_QOS_SETTING\n{\n   UCHAR  TLVType;       // 0x12, QoS setting\n   USHORT TLVLength;     // 1\n   UCHAR  QosSetting;    // 0x0: Disable; 0x01: Enable\n} QMICTL_SET_DATA_FORMAT_TLV_QOS_SETTING, *PQMICTL_SET_DATA_FORMAT_TLV_QOS_SETTING;\n#endif // MP_QCQOS_ENABLED\n\ntypedef struct _QMICTL_SET_DATA_FORMAT_RESP_MSG\n{\n   UCHAR  CtlFlags;        // QMICTL_FLAG_RESPONSE\n   UCHAR  TransactionId;\n   USHORT QMICTLType;      // QMICTL_SET_DATA_FORMAT_RESP\n   USHORT Length;\n   UCHAR  TLVType;         // QCTLV_TYPE_RESULT_CODE\n   USHORT TLVLength;       // 0x0004\n   USHORT QMIResult;       // result code\n   USHORT QMIError;        // error code\n} __attribute__ ((packed)) QMICTL_SET_DATA_FORMAT_RESP_MSG, *PQMICTL_SET_DATA_FORMAT_RESP_MSG;\n\ntypedef struct _QMICTL_SYNC_REQ_MSG\n{\n   UCHAR  CtlFlags;        // QMICTL_FLAG_REQUEST\n   UCHAR  TransactionId;\n   USHORT QMICTLType;      // QMICTL_CTL_SYNC_REQ\n   USHORT Length;          // 0\n} __attribute__ ((packed)) QMICTL_SYNC_REQ_MSG, *PQMICTL_SYNC_REQ_MSG;\n\ntypedef struct _QMICTL_SYNC_RESP_MSG\n{\n   UCHAR  CtlFlags;        // QMICTL_FLAG_RESPONSE\n   UCHAR  TransactionId;\n   USHORT QMICTLType;      // QMICTL_CTL_SYNC_RESP\n   USHORT Length;\n   UCHAR  TLVType;         // QCTLV_TYPE_RESULT_CODE\n   USHORT TLVLength;       // 0x0004\n   USHORT QMIResult;\n   USHORT QMIError;\n} __attribute__ ((packed)) QMICTL_SYNC_RESP_MSG, *PQMICTL_SYNC_RESP_MSG;\n\ntypedef struct _QMICTL_SYNC_IND_MSG\n{\n   UCHAR  CtlFlags;        // QMICTL_FLAG_INDICATION\n   UCHAR  TransactionId;\n   USHORT QMICTLType;      // QMICTL_REVOKE_CLIENT_ID_IND\n   USHORT Length;\n} __attribute__ ((packed)) QMICTL_SYNC_IND_MSG, *PQMICTL_SYNC_IND_MSG;\n\ntypedef struct _QMICTL_LIBQMI_PROXY_OPEN_MSG\n{\n   UCHAR  CtlFlags;        // QMICTL_FLAG_RESPONSE\n   UCHAR  TransactionId;\n   USHORT QMICTLType;      // QMICTL_SET_DATA_FORMAT_RESP\n   USHORT Length;\n   UCHAR  TLVType;         // QCTLV_TYPE_RESULT_CODE\n   USHORT TLVLength;       // 0x0004\n   char device_path[0];       // result code\n} __attribute__ ((packed)) QMICTL_LIBQMI_PROXY_OPEN_MSG, *PQMICTL_LIBQMI_PROXY_OPEN_MSG;\n\ntypedef struct _QMICTL_MSG\n{\n   union\n   {\n      // Message Header\n      QCQMICTL_MSG_HDR                             QMICTLMsgHdr;\n      QCQMICTL_MSG_HDR_RESP                             QMICTLMsgHdrRsp;\n\n      // QMICTL Message\n      QMICTL_SET_INSTANCE_ID_REQ_MSG               SetInstanceIdReq;\n      QMICTL_SET_INSTANCE_ID_RESP_MSG              SetInstanceIdRsp;\n      QMICTL_GET_VERSION_REQ_MSG                   GetVersionReq;\n      QMICTL_GET_VERSION_RESP_MSG                  GetVersionRsp;\n      QMICTL_GET_CLIENT_ID_REQ_MSG                 GetClientIdReq;\n      QMICTL_GET_CLIENT_ID_RESP_MSG                GetClientIdRsp;\n      QMICTL_RELEASE_CLIENT_ID_REQ_MSG             ReleaseClientIdReq;\n      QMICTL_RELEASE_CLIENT_ID_RESP_MSG            ReleaseClientIdRsp;\n      QMICTL_REVOKE_CLIENT_ID_IND_MSG              RevokeClientIdInd;\n      QMICTL_INVALID_CLIENT_ID_IND_MSG             InvalidClientIdInd;\n      QMICTL_SET_DATA_FORMAT_REQ_MSG               SetDataFormatReq;\n      QMICTL_SET_DATA_FORMAT_RESP_MSG              SetDataFormatRsp;\n      QMICTL_SYNC_REQ_MSG                          SyncReq;\n      QMICTL_SYNC_RESP_MSG                         SyncRsp;\n      QMICTL_SYNC_IND_MSG                          SyncInd;\n      QMICTL_LIBQMI_PROXY_OPEN_MSG          LibQmiProxyOpenReq;\n   };\n} __attribute__ ((packed)) QMICTL_MSG, *PQMICTL_MSG;\n#pragma pack(pop)\n\n#endif //QCQCTL_H"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/QCQMI.h",
    "content": "/******************************************************************************\n  @file    QCQMI.h\n\n  DESCRIPTION\n  This module contains QMI module.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n\n\n#ifndef USBQMI_H\n#define USBQMI_H\n\ntypedef uint8_t uint8;\ntypedef int8_t int8;\ntypedef uint16_t uint16;\ntypedef int16_t int16;\ntypedef uint32_t uint32;\ntypedef uint64_t uint64;\n\ntypedef signed char    CHAR;\ntypedef unsigned char   UCHAR;\ntypedef short   SHORT;\ntypedef unsigned short   USHORT;\ntypedef int   INT;\ntypedef unsigned int   UINT;\ntypedef long    LONG;\ntypedef unsigned int   ULONG;\ntypedef unsigned long long   ULONG64;\ntypedef signed char   *PCHAR;\ntypedef unsigned char   *PUCHAR;\ntypedef int   *PINT;\ntypedef int   BOOL;\n\n#define TRUE (1 == 1)\n#define FALSE (1 != 1)\n\n#define QMICTL_SUPPORTED_MAJOR_VERSION 1\n#define QMICTL_SUPPORTED_MINOR_VERSION 0\n\n#pragma pack(push, 1)\n\n// ========= USB Control Message ==========\n\n#define USB_CTL_MSG_TYPE_QMI 0x01\n\n// USB Control Message\ntypedef struct _QCUSB_CTL_MSG_HDR\n{\n   UCHAR IFType;\n} __attribute__ ((packed)) QCUSB_CTL_MSG_HDR, *PQCUSB_CTL_MSG_HDR;\n\n#define QCUSB_CTL_MSG_HDR_SIZE sizeof(QCUSB_CTL_MSG_HDR)\n\ntypedef struct _QCUSB_CTL_MSG\n{\n   UCHAR IFType;\n   UCHAR Message;\n} __attribute__ ((packed)) QCUSB_CTL_MSG, *PQCUSB_CTL_MSG;\n\n#define QCTLV_TYPE_REQUIRED_PARAMETER 0x01\n#define QCTLV_TYPE_RESULT_CODE        0x02\n\n// ================= QMI ==================\n\n// Define QMI Type\ntypedef enum _QMI_SERVICE_TYPE\n{\n   QMUX_TYPE_CTL  = 0x00,\n   QMUX_TYPE_WDS  = 0x01,\n   QMUX_TYPE_DMS  = 0x02,\n   QMUX_TYPE_NAS  = 0x03,\n   QMUX_TYPE_QOS  = 0x04,\n   QMUX_TYPE_WMS  = 0x05,\n   QMUX_TYPE_PDS  = 0x06,\n   QMUX_TYPE_UIM  = 0x0B,\n   QMUX_TYPE_WDS_IPV6  = 0x11,\n   QMUX_TYPE_WDS_ADMIN  = 0x1A,\n   QMUX_TYPE_COEX  = 0x22,\n   QMUX_TYPE_MAX  = 0xFF,\n   QMUX_TYPE_ALL  = 0xFF\n} QMI_SERVICE_TYPE;\n\ntypedef enum _QMI_RESULT_CODE_TYPE\n{\n   QMI_RESULT_SUCCESS = 0x0000,\n   QMI_RESULT_FAILURE = 0x0001\n} QMI_RESULT_CODE_TYPE;\n\ntypedef enum _QMI_ERROR_CODE_TYPE\n{\n    QMI_ERR_NONE  = 0x0000\n    ,QMI_ERR_MALFORMED_MSG  = 0x0001\n    ,QMI_ERR_NO_MEMORY  = 0x0002\n    ,QMI_ERR_INTERNAL  = 0x0003\n    ,QMI_ERR_ABORTED  = 0x0004\n    ,QMI_ERR_CLIENT_IDS_EXHAUSTED  = 0x0005\n    ,QMI_ERR_UNABORTABLE_TRANSACTION  = 0x0006\n    ,QMI_ERR_INVALID_CLIENT_ID  = 0x0007\n    ,QMI_ERR_NO_THRESHOLDS  = 0x0008\n    ,QMI_ERR_INVALID_HANDLE  = 0x0009\n    ,QMI_ERR_INVALID_PROFILE  = 0x000A\n    ,QMI_ERR_INVALID_PINID  = 0x000B\n    ,QMI_ERR_INCORRECT_PIN  = 0x000C\n    ,QMI_ERR_NO_NETWORK_FOUND  = 0x000D\n    ,QMI_ERR_CALL_FAILED  = 0x000E\n    ,QMI_ERR_OUT_OF_CALL  = 0x000F\n    ,QMI_ERR_NOT_PROVISIONED  = 0x0010\n    ,QMI_ERR_MISSING_ARG  = 0x0011\n    ,QMI_ERR_ARG_TOO_LONG  = 0x0013\n    ,QMI_ERR_INVALID_TX_ID  = 0x0016\n    ,QMI_ERR_DEVICE_IN_USE  = 0x0017\n    ,QMI_ERR_OP_NETWORK_UNSUPPORTED  = 0x0018\n    ,QMI_ERR_OP_DEVICE_UNSUPPORTED  = 0x0019\n    ,QMI_ERR_NO_EFFECT  = 0x001A\n    ,QMI_ERR_NO_FREE_PROFILE  = 0x001B\n    ,QMI_ERR_INVALID_PDP_TYPE  = 0x001C\n    ,QMI_ERR_INVALID_TECH_PREF  = 0x001D\n    ,QMI_ERR_INVALID_PROFILE_TYPE  = 0x001E\n    ,QMI_ERR_INVALID_SERVICE_TYPE  = 0x001F\n    ,QMI_ERR_INVALID_REGISTER_ACTION  = 0x0020\n    ,QMI_ERR_INVALID_PS_ATTACH_ACTION  = 0x0021\n    ,QMI_ERR_AUTHENTICATION_FAILED  = 0x0022\n    ,QMI_ERR_PIN_BLOCKED  = 0x0023\n    ,QMI_ERR_PIN_PERM_BLOCKED  = 0x0024\n    ,QMI_ERR_SIM_NOT_INITIALIZED  = 0x0025\n    ,QMI_ERR_MAX_QOS_REQUESTS_IN_USE  = 0x0026\n    ,QMI_ERR_INCORRECT_FLOW_FILTER  = 0x0027\n    ,QMI_ERR_NETWORK_QOS_UNAWARE  = 0x0028\n    ,QMI_ERR_INVALID_QOS_ID  = 0x0029\n    ,QMI_ERR_INVALID_ID  = 0x0029\n    ,QMI_ERR_REQUESTED_NUM_UNSUPPORTED  = 0x002A\n    ,QMI_ERR_INTERFACE_NOT_FOUND  = 0x002B\n    ,QMI_ERR_FLOW_SUSPENDED  = 0x002C\n    ,QMI_ERR_INVALID_DATA_FORMAT  = 0x002D\n    ,QMI_ERR_GENERAL  = 0x002E\n    ,QMI_ERR_UNKNOWN  = 0x002F\n    ,QMI_ERR_INVALID_ARG  = 0x0030\n    ,QMI_ERR_INVALID_INDEX  = 0x0031\n    ,QMI_ERR_NO_ENTRY  = 0x0032\n    ,QMI_ERR_DEVICE_STORAGE_FULL  = 0x0033\n    ,QMI_ERR_DEVICE_NOT_READY  = 0x0034\n    ,QMI_ERR_NETWORK_NOT_READY  = 0x0035\n    ,QMI_ERR_CAUSE_CODE  = 0x0036\n    ,QMI_ERR_MESSAGE_NOT_SENT  = 0x0037\n    ,QMI_ERR_MESSAGE_DELIVERY_FAILURE  = 0x0038\n    ,QMI_ERR_INVALID_MESSAGE_ID  = 0x0039\n    ,QMI_ERR_ENCODING  = 0x003A\n    ,QMI_ERR_AUTHENTICATION_LOCK  = 0x003B\n    ,QMI_ERR_INVALID_TRANSITION  = 0x003C\n    ,QMI_ERR_NOT_A_MCAST_IFACE  = 0x003D\n    ,QMI_ERR_MAX_MCAST_REQUESTS_IN_USE  = 0x003E\n    ,QMI_ERR_INVALID_MCAST_HANDLE = 0x003F\n    ,QMI_ERR_INVALID_IP_FAMILY_PREF  = 0x0040\n    ,QMI_ERR_SESSION_INACTIVE  = 0x0041\n    ,QMI_ERR_SESSION_INVALID  = 0x0042\n    ,QMI_ERR_SESSION_OWNERSHIP  = 0x0043\n    ,QMI_ERR_INSUFFICIENT_RESOURCES  = 0x0044\n    ,QMI_ERR_DISABLED  = 0x0045\n    ,QMI_ERR_INVALID_OPERATION  = 0x0046\n    ,QMI_ERR_INVALID_QMI_CMD  = 0x0047\n    ,QMI_ERR_TPDU_TYPE  = 0x0048\n    ,QMI_ERR_SMSC_ADDR  = 0x0049\n    ,QMI_ERR_INFO_UNAVAILABLE  = 0x004A\n    ,QMI_ERR_SEGMENT_TOO_LONG  = 0x004B\n    ,QMI_ERR_SEGMENT_ORDER  = 0x004C\n    ,QMI_ERR_BUNDLING_NOT_SUPPORTED  = 0x004D\n    ,QMI_ERR_OP_PARTIAL_FAILURE  = 0x004E\n    ,QMI_ERR_POLICY_MISMATCH  = 0x004F\n    ,QMI_ERR_SIM_FILE_NOT_FOUND  = 0x0050\n    ,QMI_ERR_EXTENDED_INTERNAL  = 0x0051\n    ,QMI_ERR_ACCESS_DENIED  = 0x0052\n    ,QMI_ERR_HARDWARE_RESTRICTED  = 0x0053\n    ,QMI_ERR_ACK_NOT_SENT  = 0x0054\n    ,QMI_ERR_INJECT_TIMEOUT  = 0x0055\n    ,QMI_ERR_INCOMPATIBLE_STATE = 0x005A\n    ,QMI_ERR_FDN_RESTRICT  = 0x005B\n    ,QMI_ERR_SUPS_FAILURE_CAUSE  = 0x005C\n    ,QMI_ERR_NO_RADIO  = 0x005D\n    ,QMI_ERR_NOT_SUPPORTED  = 0x005E\n    ,QMI_ERR_NO_SUBSCRIPTION  = 0x005F\n    ,QMI_ERR_CARD_CALL_CONTROL_FAILED  = 0x0060\n    ,QMI_ERR_NETWORK_ABORTED  = 0x0061\n    ,QMI_ERR_MSG_BLOCKED  = 0x0062\n    ,QMI_ERR_INVALID_SESSION_TYPE  = 0x0064\n    ,QMI_ERR_INVALID_PB_TYPE  = 0x0065\n    ,QMI_ERR_NO_SIM  = 0x0066\n    ,QMI_ERR_PB_NOT_READY  = 0x0067\n    ,QMI_ERR_PIN_RESTRICTION  = 0x0068\n    ,QMI_ERR_PIN2_RESTRICTION  = 0x0069\n    ,QMI_ERR_PUK_RESTRICTION  = 0x006A\n    ,QMI_ERR_PUK2_RESTRICTION  = 0x006B\n    ,QMI_ERR_PB_ACCESS_RESTRICTED  = 0x006C\n    ,QMI_ERR_PB_DELETE_IN_PROG  = 0x006D\n    ,QMI_ERR_PB_TEXT_TOO_LONG  = 0x006E\n    ,QMI_ERR_PB_NUMBER_TOO_LONG  = 0x006F\n    ,QMI_ERR_PB_HIDDEN_KEY_RESTRICTION  = 0x0070\n} QMI_ERROR_CODE_TYPE;\n\n#define QCQMI_CTL_FLAG_SERVICE   0x80\n#define QCQMI_CTL_FLAG_CTL_POINT 0x00\n\ntypedef struct _QCQMI_HDR\n{\n   UCHAR  IFType;\n   USHORT Length;\n   UCHAR  CtlFlags;  // reserved\n   UCHAR  QMIType;\n   UCHAR  ClientId;\n} __attribute__ ((packed)) QCQMI_HDR, *PQCQMI_HDR;\n\n#define QCQMI_HDR_SIZE (sizeof(QCQMI_HDR)-1)\n\ntypedef struct _QCQMI\n{\n   UCHAR  IFType;\n   USHORT Length;\n   UCHAR  CtlFlags;  // reserved\n   UCHAR  QMIType;\n   UCHAR  ClientId;\n   UCHAR  SDU;\n} __attribute__ ((packed)) QCQMI, *PQCQMI;\n\ntypedef struct _QMI_SERVICE_VERSION\n{\n   USHORT Major;\n   USHORT Minor;\n   USHORT AddendumMajor;\n   USHORT AddendumMinor;\n} __attribute__ ((packed)) QMI_SERVICE_VERSION, *PQMI_SERVICE_VERSION;\n\n// ================= QMUX ==================\n\n#define QMUX_MSG_OVERHEAD_BYTES 4  // Type(USHORT) Length(USHORT) -- header\n\n#define QMUX_BROADCAST_CID 0xFF\n\ntypedef struct _QCQMUX_HDR\n{\n   UCHAR  CtlFlags;      // 0: single QMUX Msg; 1:\n   USHORT TransactionId;\n} __attribute__ ((packed)) QCQMUX_HDR, *PQCQMUX_HDR;\n\ntypedef struct _QCQMUX\n{\n   UCHAR  CtlFlags;      // 0: single QMUX Msg; 1:\n   USHORT TransactionId;\n   UCHAR  Message;  // Type(2), Length(2), Value\n} __attribute__ ((packed)) QCQMUX, *PQCQMUX;\n\n#define QCQMUX_HDR_SIZE sizeof(QCQMUX_HDR)\n\ntypedef struct _QCQMUX_MSG_HDR\n{\n   USHORT Type;\n   USHORT Length;\n} __attribute__ ((packed)) QCQMUX_MSG_HDR, *PQCQMUX_MSG_HDR;\n\n#define QCQMUX_MSG_HDR_SIZE sizeof(QCQMUX_MSG_HDR)\n\ntypedef struct _QCQMUX_MSG_HDR_RESP\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n} __attribute__ ((packed)) QCQMUX_MSG_HDR_RESP, *PQCQMUX_MSG_HDR_RESP;\n\ntypedef struct _QCQMUX_TLV\n{\n   UCHAR Type;\n   USHORT Length;\n   UCHAR  Value;\n} __attribute__ ((packed)) QCQMUX_TLV, *PQCQMUX_TLV;\n\ntypedef struct _QMI_TLV_HDR\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n} __attribute__ ((packed)) QMI_TLV_HDR, *PQMI_TLV_HDR;\n\ntypedef struct _QMI_TLV\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   union {\n        int8_t s8;\n        uint8_t u8;\n        int16_t s16;\n        uint16_t u16;\n        int32_t s32;\n        uint32_t u32;\n        uint64_t u64;\n   };\n} __attribute__ ((packed)) QMI_TLV, *PQMI_TLV;\n\n// QMUX Message Definitions -- QMI SDU\n#define QMUX_CTL_FLAG_SINGLE_MSG    0x00\n#define QMUX_CTL_FLAG_COMPOUND_MSG  0x01\n#define QMUX_CTL_FLAG_TYPE_CMD      0x00\n#define QMUX_CTL_FLAG_TYPE_RSP      0x02\n#define QMUX_CTL_FLAG_TYPE_IND      0x04\n#define QMUX_CTL_FLAG_MASK_COMPOUND 0x01\n#define QMUX_CTL_FLAG_MASK_TYPE     0x06 // 00-cmd, 01-rsp, 10-ind\n// Add these definitions to the DMS message types section\n#define QMIDMS_FOXCONN_SET_FCC_AUTH_REQ           0x555C\n#define QMIDMS_FOXCONN_SET_FCC_AUTH_RESP          0x555C\n#define QMIDMS_FOXCONN_SET_FCC_AUTH_V2_REQ        0x555D\n#define QMIDMS_FOXCONN_SET_FCC_AUTH_V2_RESP       0x555D\n\n#pragma pack(pop)\n\n#endif // USBQMI_H\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/QCQMUX.c",
    "content": "/******************************************************************************\n  @file    MPQMUX.c\n  @brief   QMI mux.\n\n  DESCRIPTION\n  Connectivity Management Tool for USB network adapter of Quectel wireless cellular modules.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n\n#include \"QMIThread.h\"\nstatic char line[1024];\nstatic pthread_mutex_t dumpQMIMutex = PTHREAD_MUTEX_INITIALIZER;\n#undef dbg\n#define dbg( format, arg... ) do {if (strlen(line) < sizeof(line)) snprintf(&line[strlen(line)], sizeof(line) - strlen(line), format, ## arg);} while (0)\n\nPQMI_TLV_HDR GetTLV (PQCQMUX_MSG_HDR pQMUXMsgHdr, int TLVType);\n\ntypedef struct {\n    UINT type;\n    const char *name;\n} QMI_NAME_T;\n\n#define qmi_name_item(type) {type, #type}\n\n#if 0\nstatic const QMI_NAME_T qmi_IFType[] = {\n{USB_CTL_MSG_TYPE_QMI, \"USB_CTL_MSG_TYPE_QMI\"},\n};\n\nstatic const QMI_NAME_T qmi_CtlFlags[] = {\nqmi_name_item(QMICTL_CTL_FLAG_CMD),\nqmi_name_item(QCQMI_CTL_FLAG_SERVICE),\n};\n\nstatic const QMI_NAME_T qmi_QMIType[] = {\nqmi_name_item(QMUX_TYPE_CTL),\nqmi_name_item(QMUX_TYPE_WDS),\nqmi_name_item(QMUX_TYPE_DMS),\nqmi_name_item(QMUX_TYPE_NAS),\nqmi_name_item(QMUX_TYPE_QOS),\nqmi_name_item(QMUX_TYPE_WMS),\nqmi_name_item(QMUX_TYPE_PDS),\nqmi_name_item(QMUX_TYPE_WDS_ADMIN),\nqmi_name_item(QMUX_TYPE_COEX),\n};\n\nstatic const QMI_NAME_T qmi_ctl_CtlFlags[] = {\nqmi_name_item(QMICTL_FLAG_REQUEST),\nqmi_name_item(QMICTL_FLAG_RESPONSE),\nqmi_name_item(QMICTL_FLAG_INDICATION),\n};\n#endif\n\nstatic const QMI_NAME_T qmux_ctl_QMICTLType[] = {\n// QMICTL Type\nqmi_name_item(QMICTL_SET_INSTANCE_ID_REQ), //    0x0020\nqmi_name_item(QMICTL_SET_INSTANCE_ID_RESP), //   0x0020\nqmi_name_item(QMICTL_GET_VERSION_REQ), //        0x0021\nqmi_name_item(QMICTL_GET_VERSION_RESP), //       0x0021\nqmi_name_item(QMICTL_GET_CLIENT_ID_REQ), //      0x0022\nqmi_name_item(QMICTL_GET_CLIENT_ID_RESP), //     0x0022\nqmi_name_item(QMICTL_RELEASE_CLIENT_ID_REQ), //  0x0023\nqmi_name_item(QMICTL_RELEASE_CLIENT_ID_RESP), // 0x0023\nqmi_name_item(QMICTL_REVOKE_CLIENT_ID_IND), //   0x0024\nqmi_name_item(QMICTL_INVALID_CLIENT_ID_IND), //  0x0025\nqmi_name_item(QMICTL_SET_DATA_FORMAT_REQ), //    0x0026\nqmi_name_item(QMICTL_SET_DATA_FORMAT_RESP), //   0x0026\nqmi_name_item(QMICTL_SYNC_REQ), //               0x0027\nqmi_name_item(QMICTL_SYNC_RESP), //              0x0027\nqmi_name_item(QMICTL_SYNC_IND), //               0x0027\n};\n\nstatic const QMI_NAME_T qmux_CtlFlags[] = {\nqmi_name_item(QMUX_CTL_FLAG_TYPE_CMD),\nqmi_name_item(QMUX_CTL_FLAG_TYPE_RSP),\nqmi_name_item(QMUX_CTL_FLAG_TYPE_IND),\n};\n\n\nstatic const QMI_NAME_T qmux_wds_Type[] = {\nqmi_name_item(QMIWDS_SET_EVENT_REPORT_REQ), //           0x0001\nqmi_name_item(QMIWDS_SET_EVENT_REPORT_RESP), //          0x0001\nqmi_name_item(QMIWDS_EVENT_REPORT_IND), //               0x0001\nqmi_name_item(QMIWDS_START_NETWORK_INTERFACE_REQ), //    0x0020\nqmi_name_item(QMIWDS_START_NETWORK_INTERFACE_RESP), //   0x0020\nqmi_name_item(QMIWDS_STOP_NETWORK_INTERFACE_REQ), //     0x0021\nqmi_name_item(QMIWDS_STOP_NETWORK_INTERFACE_RESP), //    0x0021\nqmi_name_item(QMIWDS_GET_PKT_SRVC_STATUS_REQ), //        0x0022\nqmi_name_item(QMIWDS_GET_PKT_SRVC_STATUS_RESP), //       0x0022\nqmi_name_item(QMIWDS_GET_PKT_SRVC_STATUS_IND), //        0x0022  \nqmi_name_item(QMIWDS_GET_CURRENT_CHANNEL_RATE_REQ), //   0x0023  \nqmi_name_item(QMIWDS_GET_CURRENT_CHANNEL_RATE_RESP), //  0x0023  \nqmi_name_item(QMIWDS_GET_PKT_STATISTICS_REQ), //         0x0024  \nqmi_name_item(QMIWDS_GET_PKT_STATISTICS_RESP), //        0x0024  \nqmi_name_item(QMIWDS_MODIFY_PROFILE_SETTINGS_REQ), //    0x0028\nqmi_name_item(QMIWDS_MODIFY_PROFILE_SETTINGS_RESP), //   0x0028\nqmi_name_item(QMIWDS_GET_PROFILE_SETTINGS_REQ), //    0x002B\nqmi_name_item(QMIWDS_GET_PROFILE_SETTINGS_RESP), //   0x002BD\nqmi_name_item(QMIWDS_GET_DEFAULT_SETTINGS_REQ), //       0x002C\nqmi_name_item(QMIWDS_GET_DEFAULT_SETTINGS_RESP), //      0x002C\nqmi_name_item(QMIWDS_GET_RUNTIME_SETTINGS_REQ), //       0x002D\nqmi_name_item(QMIWDS_GET_RUNTIME_SETTINGS_RESP), //      0x002D\nqmi_name_item(QMIWDS_GET_MIP_MODE_REQ), //               0x002F\nqmi_name_item(QMIWDS_GET_MIP_MODE_RESP), //              0x002F\nqmi_name_item(QMIWDS_GET_DATA_BEARER_REQ), //            0x0037\nqmi_name_item(QMIWDS_GET_DATA_BEARER_RESP), //           0x0037\nqmi_name_item(QMIWDS_DUN_CALL_INFO_REQ), //              0x0038\nqmi_name_item(QMIWDS_DUN_CALL_INFO_RESP), //             0x0038\nqmi_name_item(QMIWDS_DUN_CALL_INFO_IND), //              0x0038\nqmi_name_item(QMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ), //  0x004D  \nqmi_name_item(QMIWDS_SET_CLIENT_IP_FAMILY_PREF_RESP), // 0x004D  \nqmi_name_item(QMIWDS_SET_AUTO_CONNECT_REQ), //  0x0051  \nqmi_name_item(QMIWDS_SET_AUTO_CONNECT_RESP), // 0x0051\nqmi_name_item(QMIWDS_BIND_MUX_DATA_PORT_REQ), //         0x00A2  \nqmi_name_item(QMIWDS_BIND_MUX_DATA_PORT_RESP), //        0x00A2  \n};\n\nstatic const QMI_NAME_T qmux_dms_Type[] = {\n// ======================= DMS ==============================\nqmi_name_item(QMIDMS_SET_EVENT_REPORT_REQ), //           0x0001\nqmi_name_item(QMIDMS_SET_EVENT_REPORT_RESP), //          0x0001\nqmi_name_item(QMIDMS_EVENT_REPORT_IND), //               0x0001\nqmi_name_item(QMIDMS_GET_DEVICE_CAP_REQ), //             0x0020\nqmi_name_item(QMIDMS_GET_DEVICE_CAP_RESP), //            0x0020\nqmi_name_item(QMIDMS_GET_DEVICE_MFR_REQ), //             0x0021\nqmi_name_item(QMIDMS_GET_DEVICE_MFR_RESP), //            0x0021\nqmi_name_item(QMIDMS_GET_DEVICE_MODEL_ID_REQ), //        0x0022\nqmi_name_item(QMIDMS_GET_DEVICE_MODEL_ID_RESP), //       0x0022\nqmi_name_item(QMIDMS_GET_DEVICE_REV_ID_REQ), //          0x0023\nqmi_name_item(QMIDMS_GET_DEVICE_REV_ID_RESP), //         0x0023\nqmi_name_item(QMIDMS_GET_MSISDN_REQ), //                 0x0024\nqmi_name_item(QMIDMS_GET_MSISDN_RESP), //                0x0024\nqmi_name_item(QMIDMS_GET_DEVICE_SERIAL_NUMBERS_REQ), //  0x0025\nqmi_name_item(QMIDMS_GET_DEVICE_SERIAL_NUMBERS_RESP), // 0x0025\nqmi_name_item(QMIDMS_UIM_SET_PIN_PROTECTION_REQ), //     0x0027\nqmi_name_item(QMIDMS_UIM_SET_PIN_PROTECTION_RESP), //    0x0027\nqmi_name_item(QMIDMS_UIM_VERIFY_PIN_REQ), //             0x0028\nqmi_name_item(QMIDMS_UIM_VERIFY_PIN_RESP), //            0x0028\nqmi_name_item(QMIDMS_UIM_UNBLOCK_PIN_REQ), //            0x0029\nqmi_name_item(QMIDMS_UIM_UNBLOCK_PIN_RESP), //           0x0029\nqmi_name_item(QMIDMS_UIM_CHANGE_PIN_REQ), //             0x002A\nqmi_name_item(QMIDMS_UIM_CHANGE_PIN_RESP), //            0x002A\nqmi_name_item(QMIDMS_UIM_GET_PIN_STATUS_REQ), //         0x002B\nqmi_name_item(QMIDMS_UIM_GET_PIN_STATUS_RESP), //        0x002B\nqmi_name_item(QMIDMS_GET_DEVICE_HARDWARE_REV_REQ), //    0x002C\nqmi_name_item(QMIDMS_GET_DEVICE_HARDWARE_REV_RESP), //   0x002C\nqmi_name_item(QMIDMS_GET_OPERATING_MODE_REQ), //         0x002D \nqmi_name_item(QMIDMS_GET_OPERATING_MODE_RESP), //        0x002D \nqmi_name_item(QMIDMS_SET_OPERATING_MODE_REQ), //         0x002E \nqmi_name_item(QMIDMS_SET_OPERATING_MODE_RESP), //        0x002E \nqmi_name_item(QMIDMS_GET_ACTIVATED_STATUS_REQ), //       0x0031 \nqmi_name_item(QMIDMS_GET_ACTIVATED_STATUS_RESP), //      0x0031 \nqmi_name_item(QMIDMS_ACTIVATE_AUTOMATIC_REQ), //         0x0032\nqmi_name_item(QMIDMS_ACTIVATE_AUTOMATIC_RESP), //        0x0032\nqmi_name_item(QMIDMS_ACTIVATE_MANUAL_REQ), //            0x0033\nqmi_name_item(QMIDMS_ACTIVATE_MANUAL_RESP), //           0x0033\nqmi_name_item(QMIDMS_UIM_GET_ICCID_REQ), //              0x003C \nqmi_name_item(QMIDMS_UIM_GET_ICCID_RESP), //             0x003C \nqmi_name_item(QMIDMS_UIM_GET_CK_STATUS_REQ), //          0x0040\nqmi_name_item(QMIDMS_UIM_GET_CK_STATUS_RESP), //         0x0040\nqmi_name_item(QMIDMS_UIM_SET_CK_PROTECTION_REQ), //      0x0041\nqmi_name_item(QMIDMS_UIM_SET_CK_PROTECTION_RESP), //     0x0041\nqmi_name_item(QMIDMS_UIM_UNBLOCK_CK_REQ), //             0x0042\nqmi_name_item(QMIDMS_UIM_UNBLOCK_CK_RESP), //            0x0042\nqmi_name_item(QMIDMS_UIM_GET_IMSI_REQ), //               0x0043 \nqmi_name_item(QMIDMS_UIM_GET_IMSI_RESP), //              0x0043 \nqmi_name_item(QMIDMS_UIM_GET_STATE_REQ), //              0x0044 \nqmi_name_item(QMIDMS_UIM_GET_STATE_RESP), //             0x0044 \nqmi_name_item(QMIDMS_GET_BAND_CAP_REQ), //               0x0045 \nqmi_name_item(QMIDMS_GET_BAND_CAP_RESP), //              0x0045 \n};\n\nstatic const QMI_NAME_T qmux_qos_Type[] = {\nqmi_name_item( QMI_QOS_SET_EVENT_REPORT_REQ), //        0x0001\nqmi_name_item( QMI_QOS_SET_EVENT_REPORT_RESP), //       0x0001\nqmi_name_item( QMI_QOS_SET_EVENT_REPORT_IND), //        0x0001\nqmi_name_item( QMI_QOS_BIND_DATA_PORT_REQ), //          0x002B\nqmi_name_item( QMI_QOS_BIND_DATA_PORT_RESP), //         0x002B\nqmi_name_item( QMI_QOS_INDICATION_REGISTER_REQ), //     0x002F\nqmi_name_item( QMI_QOS_INDICATION_REGISTER_RESP), //    0x002F\nqmi_name_item( QMI_QOS_GLOBAL_QOS_FLOW_IND), //         0x0031\nqmi_name_item( QMI_QOS_GET_QOS_INFO_REQ), //            0x0033\nqmi_name_item( QMI_QOS_GET_QOS_INFO_RESP), //           0x0033\n};\n\nstatic const QMI_NAME_T qmux_nas_Type[] = {\n// ======================= NAS ==============================\nqmi_name_item(QMINAS_SET_EVENT_REPORT_REQ), //             0x0002\nqmi_name_item(QMINAS_SET_EVENT_REPORT_RESP), //            0x0002\nqmi_name_item(QMINAS_EVENT_REPORT_IND), //                 0x0002\nqmi_name_item(QMINAS_GET_SIGNAL_STRENGTH_REQ), //          0x0020\nqmi_name_item(QMINAS_GET_SIGNAL_STRENGTH_RESP), //         0x0020\nqmi_name_item(QMINAS_PERFORM_NETWORK_SCAN_REQ), //         0x0021\nqmi_name_item(QMINAS_PERFORM_NETWORK_SCAN_RESP), //        0x0021\nqmi_name_item(QMINAS_INITIATE_NW_REGISTER_REQ), //         0x0022\nqmi_name_item(QMINAS_INITIATE_NW_REGISTER_RESP), //        0x0022\nqmi_name_item(QMINAS_INITIATE_ATTACH_REQ), //              0x0023\nqmi_name_item(QMINAS_INITIATE_ATTACH_RESP), //             0x0023\nqmi_name_item(QMINAS_GET_SERVING_SYSTEM_REQ), //           0x0024\nqmi_name_item(QMINAS_GET_SERVING_SYSTEM_RESP), //          0x0024\nqmi_name_item(QMINAS_SERVING_SYSTEM_IND), //               0x0024\nqmi_name_item(QMINAS_GET_HOME_NETWORK_REQ), //             0x0025\nqmi_name_item(QMINAS_GET_HOME_NETWORK_RESP), //            0x0025\nqmi_name_item(QMINAS_GET_PREFERRED_NETWORK_REQ), //        0x0026\nqmi_name_item(QMINAS_GET_PREFERRED_NETWORK_RESP), //       0x0026\nqmi_name_item(QMINAS_SET_PREFERRED_NETWORK_REQ), //        0x0027\nqmi_name_item(QMINAS_SET_PREFERRED_NETWORK_RESP), //       0x0027\nqmi_name_item(QMINAS_GET_FORBIDDEN_NETWORK_REQ), //        0x0028\nqmi_name_item(QMINAS_GET_FORBIDDEN_NETWORK_RESP), //       0x0028\nqmi_name_item(QMINAS_SET_FORBIDDEN_NETWORK_REQ), //        0x0029\nqmi_name_item(QMINAS_SET_FORBIDDEN_NETWORK_RESP), //       0x0029\nqmi_name_item(QMINAS_SET_TECHNOLOGY_PREF_REQ), //          0x002A\nqmi_name_item(QMINAS_SET_TECHNOLOGY_PREF_RESP), //         0x002A\nqmi_name_item(QMINAS_GET_RF_BAND_INFO_REQ), //             0x0031\nqmi_name_item(QMINAS_GET_RF_BAND_INFO_RESP), //            0x0031\nqmi_name_item(QMINAS_GET_CELL_LOCATION_INFO_REQ),\nqmi_name_item(QMINAS_GET_CELL_LOCATION_INFO_RESP),\nqmi_name_item(QMINAS_GET_PLMN_NAME_REQ), //                0x0044\nqmi_name_item(QMINAS_GET_PLMN_NAME_RESP), //               0x0044\nqmi_name_item(QUECTEL_PACKET_TRANSFER_START_IND), //                0X100\nqmi_name_item(QUECTEL_PACKET_TRANSFER_END_IND), //               0X101\nqmi_name_item(QMINAS_GET_SYS_INFO_REQ), //                 0x004D\nqmi_name_item(QMINAS_GET_SYS_INFO_RESP), //                0x004D\nqmi_name_item(QMINAS_SYS_INFO_IND), //                     0x004D\nqmi_name_item(QMINAS_GET_SIG_INFO_REQ),\nqmi_name_item(QMINAS_GET_SIG_INFO_RESP),\n\n};\n\nstatic const QMI_NAME_T qmux_wms_Type[] = {\n// ======================= WMS ==============================\nqmi_name_item(QMIWMS_SET_EVENT_REPORT_REQ), //           0x0001\nqmi_name_item(QMIWMS_SET_EVENT_REPORT_RESP), //          0x0001\nqmi_name_item(QMIWMS_EVENT_REPORT_IND), //               0x0001\nqmi_name_item(QMIWMS_RAW_SEND_REQ), //                   0x0020\nqmi_name_item(QMIWMS_RAW_SEND_RESP), //                  0x0020\nqmi_name_item(QMIWMS_RAW_WRITE_REQ), //                  0x0021\nqmi_name_item(QMIWMS_RAW_WRITE_RESP), //                 0x0021\nqmi_name_item(QMIWMS_RAW_READ_REQ), //                   0x0022\nqmi_name_item(QMIWMS_RAW_READ_RESP), //                  0x0022\nqmi_name_item(QMIWMS_MODIFY_TAG_REQ), //                 0x0023\nqmi_name_item(QMIWMS_MODIFY_TAG_RESP), //                0x0023\nqmi_name_item(QMIWMS_DELETE_REQ), //                     0x0024\nqmi_name_item(QMIWMS_DELETE_RESP), //                    0x0024\nqmi_name_item(QMIWMS_GET_MESSAGE_PROTOCOL_REQ), //       0x0030\nqmi_name_item(QMIWMS_GET_MESSAGE_PROTOCOL_RESP), //      0x0030\nqmi_name_item(QMIWMS_LIST_MESSAGES_REQ), //              0x0031\nqmi_name_item(QMIWMS_LIST_MESSAGES_RESP), //             0x0031\nqmi_name_item(QMIWMS_GET_SMSC_ADDRESS_REQ), //           0x0034\nqmi_name_item(QMIWMS_GET_SMSC_ADDRESS_RESP), //          0x0034\nqmi_name_item(QMIWMS_SET_SMSC_ADDRESS_REQ), //           0x0035\nqmi_name_item(QMIWMS_SET_SMSC_ADDRESS_RESP), //          0x0035\nqmi_name_item(QMIWMS_GET_STORE_MAX_SIZE_REQ), //         0x0036\nqmi_name_item(QMIWMS_GET_STORE_MAX_SIZE_RESP), //        0x0036\n};\n\nstatic const QMI_NAME_T qmux_wds_admin_Type[] = {\nqmi_name_item(QMIWDS_ADMIN_SET_DATA_FORMAT_REQ), //      0x0020\nqmi_name_item(QMIWDS_ADMIN_SET_DATA_FORMAT_RESP), //     0x0020\nqmi_name_item(QMIWDS_ADMIN_GET_DATA_FORMAT_REQ), //      0x0021\nqmi_name_item(QMIWDS_ADMIN_GET_DATA_FORMAT_RESP), //     0x0021\nqmi_name_item(QMIWDS_ADMIN_SET_QMAP_SETTINGS_REQ), //    0x002B\nqmi_name_item(QMIWDS_ADMIN_SET_QMAP_SETTINGS_RESP), //   0x002B\nqmi_name_item(QMIWDS_ADMIN_GET_QMAP_SETTINGS_REQ), //    0x002C\nqmi_name_item(QMIWDS_ADMIN_GET_QMAP_SETTINGS_RESP), //   0x002C\nqmi_name_item(QMI_WDA_SET_LOOPBACK_CONFIG_REQ), //\t 0x002F\nqmi_name_item(QMI_WDA_SET_LOOPBACK_CONFIG_RESP), //\t 0x002F\nqmi_name_item(QMI_WDA_SET_LOOPBACK_CONFIG_IND), //\t 0x002F\n};\n\nstatic const QMI_NAME_T qmux_uim_Type[] = {\nqmi_name_item( QMIUIM_READ_TRANSPARENT_REQ), //      0x0020\nqmi_name_item( QMIUIM_READ_TRANSPARENT_RESP), //     0x0020\nqmi_name_item( QMIUIM_READ_TRANSPARENT_IND), //      0x0020\nqmi_name_item( QMIUIM_READ_RECORD_REQ), //           0x0021\nqmi_name_item( QMIUIM_READ_RECORD_RESP), //          0x0021\nqmi_name_item( QMIUIM_READ_RECORD_IND), //           0x0021\nqmi_name_item( QMIUIM_WRITE_TRANSPARENT_REQ), //     0x0022\nqmi_name_item( QMIUIM_WRITE_TRANSPARENT_RESP), //    0x0022\nqmi_name_item( QMIUIM_WRITE_TRANSPARENT_IND), //     0x0022\nqmi_name_item( QMIUIM_WRITE_RECORD_REQ), //          0x0023\nqmi_name_item( QMIUIM_WRITE_RECORD_RESP), //         0x0023\nqmi_name_item( QMIUIM_WRITE_RECORD_IND), //          0x0023\nqmi_name_item( QMIUIM_SET_PIN_PROTECTION_REQ), //    0x0025\nqmi_name_item( QMIUIM_SET_PIN_PROTECTION_RESP), //   0x0025\nqmi_name_item( QMIUIM_SET_PIN_PROTECTION_IND), //    0x0025\nqmi_name_item( QMIUIM_VERIFY_PIN_REQ), //            0x0026\nqmi_name_item( QMIUIM_VERIFY_PIN_RESP), //           0x0026\nqmi_name_item( QMIUIM_VERIFY_PIN_IND), //            0x0026\nqmi_name_item( QMIUIM_UNBLOCK_PIN_REQ), //           0x0027\nqmi_name_item( QMIUIM_UNBLOCK_PIN_RESP), //          0x0027\nqmi_name_item( QMIUIM_UNBLOCK_PIN_IND), //           0x0027\nqmi_name_item( QMIUIM_CHANGE_PIN_REQ), //            0x0028\nqmi_name_item( QMIUIM_CHANGE_PIN_RESP), //           0x0028\nqmi_name_item( QMIUIM_CHANGE_PIN_IND), //            0x0028\nqmi_name_item( QMIUIM_DEPERSONALIZATION_REQ), //     0x0029\nqmi_name_item( QMIUIM_DEPERSONALIZATION_RESP), //    0x0029\nqmi_name_item( QMIUIM_EVENT_REG_REQ), //             0x002E\nqmi_name_item( QMIUIM_EVENT_REG_RESP), //            0x002E\nqmi_name_item( QMIUIM_GET_CARD_STATUS_REQ), //       0x002F\nqmi_name_item( QMIUIM_GET_CARD_STATUS_RESP), //      0x002F\nqmi_name_item( QMIUIM_STATUS_CHANGE_IND), //         0x0032\n};\n\nstatic const QMI_NAME_T qmux_coex_Type[] = {\nqmi_name_item(QMI_COEX_GET_WWAN_STATE_REQ), //    0x0022\nqmi_name_item(QMI_COEX_GET_WWAN_STATE_RESP), //    0x0022\n};\n\nstatic const char * qmi_name_get(const QMI_NAME_T *table, size_t size, int type, const char *tag) {\n    static char unknow[40];\n    size_t i;\n\n    if (qmux_CtlFlags == table) {\n        if (!strcmp(tag, \"_REQ\"))\n            tag = \"_CMD\";\n        else  if (!strcmp(tag, \"_RESP\"))\n            tag = \"_RSP\";\n    }\n    \n    for (i = 0; i < size; i++) {\n        if (table[i].type == (UINT)type) {\n            if (!tag || (strstr(table[i].name, tag)))\n                return table[i].name;\n        }\n    }\n    sprintf(unknow, \"unknow_%x\", type);\n    return unknow;\n}\n\n#define QMI_NAME(table, type) qmi_name_get(table, sizeof(table) / sizeof(table[0]), type, 0)\n#define QMUX_NAME(table, type, tag) qmi_name_get(table, sizeof(table) / sizeof(table[0]), type, tag)\n\nvoid dump_tlv(PQCQMUX_MSG_HDR pQMUXMsgHdr) {\n    int TLVFind = 0;\n    int i;\n    //dbg(\"QCQMUX_TLV-----------------------------------\\n\");\n    //dbg(\"{Type,\\tLength,\\tValue}\\n\");\n\n    while (1) {\n        PQMI_TLV_HDR TLVHdr = GetTLV(pQMUXMsgHdr, 0x1000 + (++TLVFind));\n        if (TLVHdr == NULL)\n            break;\n\n        //if ((TLVHdr->TLVType == 0x02) && ((USHORT *)(TLVHdr+1))[0])\n        {        \n            dbg(\"{%02x,\\t%04x,\\t\", TLVHdr->TLVType, le16_to_cpu(TLVHdr->TLVLength));\n            for (i = 0; i < le16_to_cpu(TLVHdr->TLVLength); i++) {\n                dbg(\"%02x \", ((UCHAR *)(TLVHdr+1))[i]);\n            }\n            dbg(\"}\\n\");\n        }\n    }  // while\n}\n\nvoid dump_ctl(PQCQMICTL_MSG_HDR CTLHdr) {\n    const char *tag;\n    \n    //dbg(\"QCQMICTL_MSG--------------------------------------------\\n\");\n    //dbg(\"CtlFlags:           %02x\\t\\t%s\\n\", CTLHdr->CtlFlags, QMI_NAME(qmi_ctl_CtlFlags, CTLHdr->CtlFlags));\n   dbg(\"TransactionId:      %02x\\n\", CTLHdr->TransactionId);\n        switch (CTLHdr->CtlFlags) {\n            case QMICTL_FLAG_REQUEST: tag = \"_REQ\"; break;\n            case QMICTL_FLAG_RESPONSE: tag = \"_RESP\"; break;\n            case QMICTL_FLAG_INDICATION: tag = \"_IND\"; break;\n            default: tag = 0; break;\n       }\n        dbg(\"QMICTLType:         %04x\\t%s\\n\", le16_to_cpu(CTLHdr->QMICTLType),\n        QMUX_NAME(qmux_ctl_QMICTLType, le16_to_cpu(CTLHdr->QMICTLType), tag));     \n        dbg(\"Length:             %04x\\n\", le16_to_cpu(CTLHdr->Length));\n\n     dump_tlv((PQCQMUX_MSG_HDR)(&CTLHdr->QMICTLType));\n}\n\nint dump_qmux(QMI_SERVICE_TYPE serviceType, PQCQMUX_HDR QMUXHdr) {\n    PQCQMUX_MSG_HDR QMUXMsgHdr = (PQCQMUX_MSG_HDR) (QMUXHdr + 1);\n    const char *tag;\n\n    //dbg(\"QCQMUX--------------------------------------------\\n\");\n    switch (QMUXHdr->CtlFlags&QMUX_CTL_FLAG_MASK_TYPE) {\n        case QMUX_CTL_FLAG_TYPE_CMD: tag = \"_REQ\"; break;\n        case QMUX_CTL_FLAG_TYPE_RSP: tag = \"_RESP\"; break;\n        case QMUX_CTL_FLAG_TYPE_IND: tag = \"_IND\"; break;\n        default: tag = 0; break;\n    }\n    //dbg(\"CtlFlags:           %02x\\t\\t%s\\n\", QMUXHdr->CtlFlags, QMUX_NAME(qmux_CtlFlags, QMUXHdr->CtlFlags, tag));\n    dbg(\"TransactionId:    %04x\\n\", le16_to_cpu(QMUXHdr->TransactionId));\n\n    //dbg(\"QCQMUX_MSG_HDR-----------------------------------\\n\");\n    switch (serviceType) {\n        case QMUX_TYPE_DMS:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type),\n            QMUX_NAME(qmux_dms_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));\n        break;\n        case QMUX_TYPE_NAS:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type),\n            QMUX_NAME(qmux_nas_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));\n        break;\n        case QMUX_TYPE_WDS:\n        case QMUX_TYPE_WDS_IPV6:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type),\n            QMUX_NAME(qmux_wds_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));\n        break;\n        case QMUX_TYPE_WMS:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type),\n            QMUX_NAME(qmux_wms_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));\n        break;\n        case QMUX_TYPE_WDS_ADMIN:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type),\n            QMUX_NAME(qmux_wds_admin_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));\n        break;\n        case QMUX_TYPE_UIM:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type),\n            QMUX_NAME(qmux_uim_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));\n        break;\n        case QMUX_TYPE_PDS:\n        case QMUX_TYPE_QOS:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type),\n            QMUX_NAME(qmux_qos_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));\n        break;\n        case QMUX_TYPE_COEX:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type),\n            QMUX_NAME(qmux_coex_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));\n        break;\n        case QMUX_TYPE_CTL:                \n        default:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type), \"PDS/QOS/CTL/unknown!\");\n        break;    \n    }\n    dbg(\"Length:             %04x\\n\", le16_to_cpu(QMUXMsgHdr->Length));\n\n    dump_tlv(QMUXMsgHdr);\n    \n    return 0;\n}\n\nvoid dump_qmi(void *dataBuffer, int dataLen) \n{\n    PQCQMI_HDR QMIHdr = (PQCQMI_HDR)dataBuffer;\n    PQCQMUX_HDR QMUXHdr = (PQCQMUX_HDR) (QMIHdr + 1);\n    PQCQMICTL_MSG_HDR CTLHdr =  (PQCQMICTL_MSG_HDR) (QMIHdr + 1);\n\n    int i;\n\n    if (!debug_qmi)\n        return;\n\n    pthread_mutex_lock(&dumpQMIMutex);\n    line[0] = 0;\n    for (i = 0; i < dataLen; i++) {\n        dbg(\"%02x \", ((unsigned char *)dataBuffer)[i]);\n    }\n    dbg_time(\"%s\", line);\n    line[0] = 0;\n    \n    //dbg(\"QCQMI_HDR-----------------------------------------\");\n    //dbg(\"IFType:             %02x\\t\\t%s\", QMIHdr->IFType, QMI_NAME(qmi_IFType, QMIHdr->IFType));\n    //dbg(\"Length:             %04x\", le16_to_cpu(QMIHdr->Length));\n    //dbg(\"CtlFlags:           %02x\\t\\t%s\", QMIHdr->CtlFlags, QMI_NAME(qmi_CtlFlags, QMIHdr->CtlFlags));\n    //dbg(\"QMIType:            %02x\\t\\t%s\", QMIHdr->QMIType, QMI_NAME(qmi_QMIType, QMIHdr->QMIType));\n    //dbg(\"ClientId:           %02x\", QMIHdr->ClientId);\n\n    if (QMIHdr->QMIType == QMUX_TYPE_CTL) {\n        dump_ctl(CTLHdr);\n    } else {\n        dump_qmux(QMIHdr->QMIType, QMUXHdr);\n    }\n    dbg_time(\"%s\", line);\n    pthread_mutex_unlock(&dumpQMIMutex);\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/QCQMUX.h",
    "content": "/******************************************************************************\n  @file    QCQMUX.h\n\n  DESCRIPTION\n  This module contains QMI QMUX module.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n\n\n#ifndef QCQMUX_H\n#define QCQMUX_H\n\n#include \"QCQMI.h\"\n\n#pragma pack(push, 1)\n\n#define QMIWDS_SET_EVENT_REPORT_REQ           0x0001\n#define QMIWDS_SET_EVENT_REPORT_RESP          0x0001\n#define QMIWDS_EVENT_REPORT_IND               0x0001\n#define QMIWDS_START_NETWORK_INTERFACE_REQ    0x0020\n#define QMIWDS_START_NETWORK_INTERFACE_RESP   0x0020\n#define QMIWDS_STOP_NETWORK_INTERFACE_REQ     0x0021\n#define QMIWDS_STOP_NETWORK_INTERFACE_RESP    0x0021\n#define QMIWDS_GET_PKT_SRVC_STATUS_REQ        0x0022\n#define QMIWDS_GET_PKT_SRVC_STATUS_RESP       0x0022\n#define QMIWDS_GET_PKT_SRVC_STATUS_IND        0x0022\n#define QMIWDS_GET_CURRENT_CHANNEL_RATE_REQ   0x0023\n#define QMIWDS_GET_CURRENT_CHANNEL_RATE_RESP  0x0023\n#define QMIWDS_GET_PKT_STATISTICS_REQ         0x0024\n#define QMIWDS_GET_PKT_STATISTICS_RESP        0x0024\n#define QMIWDS_CREATE_PROFILE_REQ             0x0027\n#define QMIWDS_CREATE_PROFILE_RESP            0x0027\n#define QMIWDS_MODIFY_PROFILE_SETTINGS_REQ    0x0028\n#define QMIWDS_MODIFY_PROFILE_SETTINGS_RESP   0x0028\n#define QMIWDS_GET_PROFILE_LIST_REQ           0x002A\n#define QMIWDS_GET_PROFILE_LIST_RESP          0x002A\n#define QMIWDS_GET_PROFILE_SETTINGS_REQ       0x002B\n#define QMIWDS_GET_PROFILE_SETTINGS_RESP      0x002B\n#define QMIWDS_GET_DEFAULT_SETTINGS_REQ       0x002C\n#define QMIWDS_GET_DEFAULT_SETTINGS_RESP      0x002C\n#define QMIWDS_GET_RUNTIME_SETTINGS_REQ       0x002D\n#define QMIWDS_GET_RUNTIME_SETTINGS_RESP      0x002D\n#define QMIWDS_GET_MIP_MODE_REQ               0x002F\n#define QMIWDS_GET_MIP_MODE_RESP              0x002F\n#define QMIWDS_GET_DATA_BEARER_REQ            0x0037\n#define QMIWDS_GET_DATA_BEARER_RESP           0x0037\n#define QMIWDS_DUN_CALL_INFO_REQ              0x0038\n#define QMIWDS_DUN_CALL_INFO_RESP             0x0038\n#define QMIWDS_DUN_CALL_INFO_IND              0x0038\n#define QMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ  0x004D\n#define QMIWDS_SET_CLIENT_IP_FAMILY_PREF_RESP 0x004D\n#define QMIWDS_SET_AUTO_CONNECT_REQ     0x0051\n#define QMIWDS_SET_AUTO_CONNECT_RESP     0x0051\n#define QMIWDS_BIND_MUX_DATA_PORT_REQ         0x00A2\n#define QMIWDS_BIND_MUX_DATA_PORT_RESP        0x00A2\n\n\n// Stats masks\n#define QWDS_STAT_MASK_TX_PKT_OK 0x00000001\n#define QWDS_STAT_MASK_RX_PKT_OK 0x00000002\n#define QWDS_STAT_MASK_TX_PKT_ER 0x00000004\n#define QWDS_STAT_MASK_RX_PKT_ER 0x00000008\n#define QWDS_STAT_MASK_TX_PKT_OF 0x00000010\n#define QWDS_STAT_MASK_RX_PKT_OF 0x00000020\n\n// TLV Types for xfer statistics\n#define TLV_WDS_TX_GOOD_PKTS      0x10\n#define TLV_WDS_RX_GOOD_PKTS      0x11\n#define TLV_WDS_TX_ERROR          0x12\n#define TLV_WDS_RX_ERROR          0x13\n#define TLV_WDS_TX_OVERFLOW       0x14\n#define TLV_WDS_RX_OVERFLOW       0x15\n#define TLV_WDS_CHANNEL_RATE      0x16\n#define TLV_WDS_DATA_BEARER       0x17\n#define TLV_WDS_DORMANCY_STATUS   0x18\n\n#define QWDS_PKT_DATA_UNKNOW    0x00\n#define QWDS_PKT_DATA_DISCONNECTED    0x01\n#define QWDS_PKT_DATA_CONNECTED        0x02\n#define QWDS_PKT_DATA_SUSPENDED        0x03\n#define QWDS_PKT_DATA_AUTHENTICATING   0x04\n\n#define QMIWDS_ADMIN_SET_DATA_FORMAT_REQ      0x0020\n#define QMIWDS_ADMIN_SET_DATA_FORMAT_RESP     0x0020\n#define QMIWDS_ADMIN_GET_DATA_FORMAT_REQ      0x0021\n#define QMIWDS_ADMIN_GET_DATA_FORMAT_RESP     0x0021\n#define QMIWDS_ADMIN_SET_QMAP_SETTINGS_REQ    0x002B\n#define QMIWDS_ADMIN_SET_QMAP_SETTINGS_RESP   0x002B\n#define QMIWDS_ADMIN_GET_QMAP_SETTINGS_REQ    0x002C\n#define QMIWDS_ADMIN_GET_QMAP_SETTINGS_RESP   0x002C\n#define QMI_WDA_SET_LOOPBACK_CONFIG_REQ       0x002F\n#define QMI_WDA_SET_LOOPBACK_CONFIG_RESP      0x002F\n#define QMI_WDA_SET_LOOPBACK_CONFIG_IND       0x002F\n\n#define NETWORK_DESC_ENCODING_OCTET       0x00\n#define NETWORK_DESC_ENCODING_EXTPROTOCOL 0x01\n#define NETWORK_DESC_ENCODING_7BITASCII   0x02\n#define NETWORK_DESC_ENCODING_IA5         0x03\n#define NETWORK_DESC_ENCODING_UNICODE     0x04\n#define NETWORK_DESC_ENCODING_SHIFTJIS    0x05\n#define NETWORK_DESC_ENCODING_KOREAN      0x06\n#define NETWORK_DESC_ENCODING_LATINH      0x07\n#define NETWORK_DESC_ENCODING_LATIN       0x08\n#define NETWORK_DESC_ENCODING_GSM7BIT     0x09\n#define NETWORK_DESC_ENCODING_GSMDATA     0x0A\n#define NETWORK_DESC_ENCODING_UNKNOWN     0xFF\n\ntypedef struct _QMIWDS_ADMIN_SET_DATA_FORMAT\n{\n   USHORT Type;             // QMUX type 0x0000\n   USHORT Length;\n} __attribute__ ((packed)) QMIWDS_ADMIN_SET_DATA_FORMAT, *PQMIWDS_ADMIN_SET_DATA_FORMAT;\n\ntypedef struct _QMIWDS_ADMIN_SET_DATA_FORMAT_TLV_QOS\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  QOSSetting;\n} __attribute__ ((packed)) QMIWDS_ADMIN_SET_DATA_FORMAT_TLV_QOS, *PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV_QOS;\n\ntypedef struct _QMIWDS_ADMIN_SET_DATA_FORMAT_TLV\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   ULONG  Value;\n} __attribute__ ((packed)) QMIWDS_ADMIN_SET_DATA_FORMAT_TLV, *PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV;\n\ntypedef struct _QMIWDS_ENDPOINT_TLV\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   ULONG  ep_type;\n   ULONG  iface_id;\n} __attribute__ ((packed)) QMIWDS_ENDPOINT_TLV, *PQMIWDS_ENDPOINT_TLV;\n\ntypedef struct _QMIWDS_ADMIN_SET_DATA_FORMAT_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV_QOS QosDataFormatTlv;\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV UnderlyingLinkLayerProtocolTlv;\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV UplinkDataAggregationProtocolTlv;\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV DownlinkDataAggregationProtocolTlv;\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV DownlinkDataAggregationMaxDatagramsTlv;\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV DownlinkDataAggregationMaxSizeTlv;\n    QMIWDS_ENDPOINT_TLV epTlv;\n#ifdef QUECTEL_UL_DATA_AGG\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV DlMinimumPassingTlv;\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV UplinkDataAggregationMaxDatagramsTlv;\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV UplinkDataAggregationMaxSizeTlv;\n#endif\t\n} __attribute__ ((packed)) QMIWDS_ADMIN_SET_DATA_FORMAT_REQ_MSG, *PQMIWDS_ADMIN_SET_DATA_FORMAT_REQ_MSG;\n\ntypedef struct _QMI_U8_TLV\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  TLVVaule;\n} __attribute__ ((packed)) QMI_U8_TLV, *PQMI_U8_TLV;\n\ntypedef struct _QMI_U32_TLV\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   ULONG  TLVVaule;\n} __attribute__ ((packed)) QMI_U32_TLV, *PQMI_U32_TLV;\n\ntypedef struct _QMI_WDA_SET_LOOPBACK_CONFIG_REQ_MSG {\n\tUSHORT Type;\n\tUSHORT Length;\n\tQMI_U8_TLV loopback_state; //0x01\n\tQMI_U32_TLV replication_factor; //0x10\n} __attribute__ ((packed)) QMI_WDA_SET_LOOPBACK_CONFIG_REQ_MSG, *PQMI_WDA_SET_LOOPBACK_CONFIG_REQ_MSG;\n\ntypedef struct _QMI_WDA_SET_LOOPBACK_CONFIG_IND_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   QMI_U8_TLV loopback_state; //0x01\n   QMI_U32_TLV replication_factor; //0x10\n} __attribute__ ((packed)) QMI_WDA_SET_LOOPBACK_CONFIG_IND_MSG, *PQMI_WDA_SET_LOOPBACK_CONFIG_IND_MSG;\n\n#if 0\ntypedef enum _QMI_RETURN_CODES {\n   QMI_SUCCESS = 0,\n   QMI_SUCCESS_NOT_COMPLETE,\n   QMI_FAILURE\n}QMI_RETURN_CODES;\n\ntypedef struct _QMIWDS_GET_PKT_SRVC_STATUS_REQ_MSG\n{\n   USHORT Type;    // 0x0022\n   USHORT Length;  // 0x0000\n} QMIWDS_GET_PKT_SRVC_STATUS_REQ_MSG, *PQMIWDS_GET_PKT_SRVC_STATUS_REQ_MSG;\n\ntypedef struct _QMIWDS_GET_PKT_SRVC_STATUS_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n   UCHAR  TLVType2;\n   USHORT TLVLength2;\n   UCHAR  ConnectionStatus; // 0x01: QWDS_PKT_DATAC_DISCONNECTED\n                            // 0x02: QWDS_PKT_DATA_CONNECTED\n                            // 0x03: QWDS_PKT_DATA_SUSPENDED\n                            // 0x04: QWDS_PKT_DATA_AUTHENTICATING\n} QMIWDS_GET_PKT_SRVC_STATUS_RESP_MSG, *PQMIWDS_GET_PKT_SRVC_STATUS_RESP_MSG;\n\ntypedef struct _QMIWDS_GET_PKT_SRVC_STATUS_IND_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  ConnectionStatus; // 0x01: QWDS_PKT_DATAC_DISCONNECTED\n                            // 0x02: QWDS_PKT_DATA_CONNECTED\n                            // 0x03: QWDS_PKT_DATA_SUSPENDED\n   UCHAR  ReconfigRequired; // 0x00: No need to reconfigure\n                            // 0x01: Reconfiguration required\n} QMIWDS_GET_PKT_SRVC_STATUS_IND_MSG, *PQMIWDS_GET_PKT_SRVC_STATUS_IND_MSG;\n\ntypedef struct _WDS_PKT_SRVC_IP_FAMILY_TLV\n{\n   UCHAR  TLVType;     // 0x12\n   USHORT TLVLength;   // 1\n   UCHAR  IpFamily;    // IPV4-0x04, IPV6-0x06\n} WDS_PKT_SRVC_IP_FAMILY_TLV, *PWDS_PKT_SRVC_IP_FAMILY_TLV;\n\ntypedef struct _QMIWDS_DUN_CALL_INFO_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   ULONG  Mask;\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   UCHAR  ReportConnectionStatus;\n} QMIWDS_DUN_CALL_INFO_REQ_MSG, *PQMIWDS_DUN_CALL_INFO_REQ_MSG;\n\ntypedef struct _QMIWDS_DUN_CALL_INFO_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n} QMIWDS_DUN_CALL_INFO_RESP_MSG, *PQMIWDS_DUN_CALL_INFO_RESP_MSG;\n\ntypedef struct _QMIWDS_DUN_CALL_INFO_IND_MSG\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  ConnectionStatus;\n} QMIWDS_DUN_CALL_INFO_IND_MSG, *PQMIWDS_DUN_CALL_INFO_IND_MSG;\n\ntypedef struct _QMIWDS_GET_CURRENT_CHANNEL_RATE_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0040\n   USHORT Length;\n} QMIWDS_GET_CURRENT_CHANNEL_RATE_REQ_MSG, *PQMIWDS_GET_CURRENT_CHANNEL_RATE_REQ_MSG;\n\ntypedef struct _QMIWDS_GET_CURRENT_CHANNEL_RATE_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0040\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n\n   UCHAR  TLV2Type;         // 0x01\n   USHORT TLV2Length;       // 16\n   //ULONG  CallHandle;       // Context corresponding to reported channel\n   ULONG  CurrentTxRate;       // bps\n   ULONG  CurrentRxRate;       // bps\n   ULONG  ServingSystemTxRate; // bps\n   ULONG  ServingSystemRxRate; // bps\n\n} QMIWDS_GET_CURRENT_CHANNEL_RATE_RESP_MSG, *PQMIWDS_GET_CURRENT_CHANNEL_RATE_RESP;\n\n#define QWDS_EVENT_REPORT_MASK_RATES 0x01\n#define QWDS_EVENT_REPORT_MASK_STATS 0x02\n\n#ifdef QCUSB_MUX_PROTOCOL\n#error code not present\n#endif // QCUSB_MUX_PROTOCOL\n\ntypedef struct _QMIWDS_SET_EVENT_REPORT_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0042\n   USHORT Length;\n\n   UCHAR  TLVType;          // 0x10 -- current channel rate indicator\n   USHORT TLVLength;        // 1\n   UCHAR  Mode;             // 0-do not report; 1-report when rate changes\n\n   UCHAR  TLV2Type;         // 0x11\n   USHORT TLV2Length;       // 5\n   UCHAR  StatsPeriod;      // seconds between reports; 0-do not report\n   ULONG  StatsMask;        //\n\n   UCHAR  TLV3Type;          // 0x12 -- current data bearer indicator\n   USHORT TLV3Length;        // 1\n   UCHAR  Mode3;             // 0-do not report; 1-report when changes\n\n   UCHAR  TLV4Type;          // 0x13 -- dormancy status indicator\n   USHORT TLV4Length;        // 1\n   UCHAR  DormancyStatus;    // 0-do not report; 1-report when changes\n} QMIWDS_SET_EVENT_REPORT_REQ_MSG, *PQMIWDS_SET_EVENT_REPORT_REQ_MSG;\n\ntypedef struct _QMIWDS_SET_EVENT_REPORT_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0042\n   USHORT Length;\n\n   UCHAR  TLVType;          // 0x02 result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_NO_BATTERY\n                            // QMI_ERR_FAULT\n} QMIWDS_SET_EVENT_REPORT_RESP_MSG, *PQMIWDS_SET_EVENT_REPORT_RESP_MSG;\n\ntypedef struct _QMIWDS_EVENT_REPORT_IND_MSG\n{\n   USHORT Type;             // QMUX type 0x0001\n   USHORT Length;\n} QMIWDS_EVENT_REPORT_IND_MSG, *PQMIWDS_EVENT_REPORT_IND_MSG;\n\n// PQCTLV_PKT_STATISTICS\n\ntypedef struct _QMIWDS_EVENT_REPORT_IND_CHAN_RATE_TLV\n{\n   UCHAR  Type;\n   USHORT Length;  // 8\n   ULONG  TxRate;\n   ULONG  RxRate;\n} QMIWDS_EVENT_REPORT_IND_CHAN_RATE_TLV, *PQMIWDS_EVENT_REPORT_IND_CHAN_RATE_TLV;\n\n#ifdef QCUSB_MUX_PROTOCOL\n#error code not present\n#endif // QCUSB_MUX_PROTOCOL\n\ntypedef struct _QMIWDS_GET_PKT_STATISTICS_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0041\n   USHORT Length;\n   UCHAR  TLVType;          // 0x01\n   USHORT TLVLength;        // 4\n   ULONG  StateMask;        // 0x00000001  tx success packets\n                            // 0x00000002  rx success packets\n                            // 0x00000004  rx packet errors (checksum)\n                            // 0x00000008  rx packets dropped (memory)\n\n} QMIWDS_GET_PKT_STATISTICS_REQ_MSG, *PQMIWDS_GET_PKT_STATISTICS_REQ_MSG;\n\ntypedef struct _QMIWDS_GET_PKT_STATISTICS_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0041\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n} QMIWDS_GET_PKT_STATISTICS_RESP_MSG, *PQMIWDS_GET_PKT_STATISTICS_RESP_MSG;\n\n// optional TLV for stats\ntypedef struct _QCTLV_PKT_STATISTICS\n{\n   UCHAR  TLVType;          // see above definitions for TLV types\n   USHORT TLVLength;        // 4\n   ULONG  Count;\n} QCTLV_PKT_STATISTICS, *PQCTLV_PKT_STATISTICS;\n#endif\n\n//#ifdef QC_IP_MODE\n\n/*\n    �?Bit 0 �?Profile identifier\n    �?Bit 1 �?Profile name\n    �?Bit 2 �?PDP type\n    �?Bit 3 �?APN name\n    �?Bit 4 �?DNS address\n    �?Bit 5 �?UMTS/GPRS granted QoS\n    �?Bit 6 �?Username\n    �?Bit 7 �?Authentication Protocol\n    �?Bit 8 �?IP address\n    �?Bit 9 �?Gateway information (address and subnet mask)\n    �?Bit 10 �?PCSCF address using a PCO flag\n    �?Bit 11 �?PCSCF server address list\n    �?Bit 12 �?PCSCF domain name list\n    �?Bit 13 �?MTU\n    �?Bit 14 �?Domain name list\n    �?Bit 15 �?IP family\n    �?Bit 16 �?IM_CM flag\n    �?Bit 17 �?Technology name\n    �?Bit 18 �?Operator reserved PCO\n*/\n#define QMIWDS_GET_RUNTIME_SETTINGS_MASK_IPV4DNS_ADDR       (1 << 4)\n#define QMIWDS_GET_RUNTIME_SETTINGS_MASK_IPV4_ADDR          (1 << 8)\n#define QMIWDS_GET_RUNTIME_SETTINGS_MASK_IPV4GATEWAY_ADDR   (1 << 9)\n#define QMIWDS_GET_RUNTIME_SETTINGS_MASK_MTU                (1 << 13)\n#define QMIWDS_GET_RUNTIME_SETTINGS_MASK_PCSCF_SV_ADDR      (1 << 11)\n#define QMIWDS_GET_RUNTIME_SETTINGS_MASK_PCSCF_DOM_NAME     (1 << 14)\n\ntypedef struct _QMIWDS_GET_RUNTIME_SETTINGS_REQ_MSG\n{\n   USHORT Type;            // QMIWDS_GET_RUNTIME_SETTINGS_REQ\n   USHORT Length;\n   UCHAR  TLVType;         // 0x10\n   USHORT TLVLength;       // 0x0004\n   ULONG  Mask;            // mask, bit 8: IP addr -- 0x0100\n} __attribute__ ((packed)) QMIWDS_GET_RUNTIME_SETTINGS_REQ_MSG, *PQMIWDS_GET_RUNTIME_SETTINGS_REQ_MSG;\n\ntypedef struct _QMIWDS_BIND_MUX_DATA_PORT_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   ULONG  ep_type;\n   ULONG  iface_id;\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   UCHAR  MuxId;\n   UCHAR  TLV3Type;\n   USHORT TLV3Length;\n   ULONG  client_type;\n} __attribute__ ((packed)) QMIWDS_BIND_MUX_DATA_PORT_REQ_MSG, *PQMIWDS_BIND_MUX_DATA_PORT_REQ_MSG;\n\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4PRIMARYDNS 0x15\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4SECONDARYDNS 0x16\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4 0x1E\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4GATEWAY 0x20\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4SUBNET 0x21\n\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6             0x25\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6GATEWAY      0x26\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6PRIMARYDNS   0x27\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6SECONDARYDNS 0x28\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_MTU              0x29\n\ntypedef struct _QMIWDS_GET_RUNTIME_SETTINGS_TLV_MTU\n{\n   UCHAR  TLVType;         // QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_MTU\n   USHORT TLVLength;       // 4\n   ULONG  Mtu;             // MTU\n} __attribute__ ((packed)) QMIWDS_GET_RUNTIME_SETTINGS_TLV_MTU, *PQMIWDS_GET_RUNTIME_SETTINGS_TLV_MTU;\n\ntypedef struct _QMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR\n{\n   UCHAR  TLVType;         // QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4\n   USHORT TLVLength;       // 4\n   ULONG  IPV4Address;     // address\n} __attribute__ ((packed)) QMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR, *PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR;\n\ntypedef struct _QMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV6_ADDR\n{\n   UCHAR  TLVType;         // QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6\n   USHORT TLVLength;       // 16\n   UCHAR  IPV6Address[16]; // address\n   UCHAR  PrefixLength;    // prefix length\n} __attribute__ ((packed)) QMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV6_ADDR, *PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV6_ADDR;\n\ntypedef struct _QMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV6_ADDR\n{\n\tUCHAR TLVType;\n\tUSHORT TLVLength;\n\tUCHAR PCSCFNumber;\n} __attribute__ ((packed)) QMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV6_ADDR, *PQMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV6_ADDR;\n\ntypedef struct _QMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV4_ADDR\n{\n\tUCHAR TLVType;\n\tUSHORT TLVLength;\n\tUCHAR PCSCFNumber;\n} __attribute__ ((packed)) QMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV4_ADDR, *PQMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV4_ADDR;\n\ntypedef struct _QMIWDS_GET_RUNTIME_SETTINGS_RESP_MSG\n{\n   USHORT Type;            // QMIWDS_GET_RUNTIME_SETTINGS_RESP\n   USHORT Length;\n   UCHAR  TLVType;         // QCTLV_TYPE_RESULT_CODE\n   USHORT TLVLength;       // 0x0004\n   USHORT QMUXResult;      // result code\n   USHORT QMUXError;       // error code\n} __attribute__ ((packed)) QMIWDS_GET_RUNTIME_SETTINGS_RESP_MSG, *PQMIWDS_GET_RUNTIME_SETTINGS_RESP_MSG;\n\n//#endif // QC_IP_MODE\n\ntypedef struct _QMIWDS_IP_FAMILY_TLV\n{\n   UCHAR  TLVType;          // 0x12\n   USHORT TLVLength;        // 1\n   UCHAR  IpFamily;         // IPV4-0x04, IPV6-0x06\n} __attribute__ ((packed)) QMIWDS_IP_FAMILY_TLV, *PQMIWDS_IP_FAMILY_TLV;\n\ntypedef struct _QMIWDS_PKT_SRVC_TLV\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  ConnectionStatus;\n   UCHAR  ReconfigReqd;\n} __attribute__ ((packed)) QMIWDS_PKT_SRVC_TLV, *PQMIWDS_PKT_SRVC_TLV;\n\ntypedef struct _QMIWDS_CALL_END_REASON_TLV\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT CallEndReason;\n} __attribute__ ((packed)) QMIWDS_CALL_END_REASON_TLV, *PQMIWDS_CALL_END_REASON_TLV;\n\ntypedef struct _QMIWDS_CALL_END_REASON_V_TLV\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT CallEndReasonType;\n   USHORT CallEndReason;\n} __attribute__ ((packed)) QMIWDS_CALL_END_REASON_V_TLV, *PQMIWDS_CALL_END_REASON_V_TLV;\n\ntypedef struct _QMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x004D\n   USHORT Length;\n   UCHAR  TLVType;          // 0x01\n   USHORT TLVLength;        // 1\n   UCHAR  IpPreference;     // IPV4-0x04, IPV6-0x06\n} __attribute__ ((packed)) QMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ_MSG, *PQMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ_MSG;\n\ntypedef struct _QMIWDS_SET_CLIENT_IP_FAMILY_PREF_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0037\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS, QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INTERNAL, QMI_ERR_MALFORMED_MSG, QMI_ERR_INVALID_ARG\n} __attribute__ ((packed)) QMIWDS_SET_CLIENT_IP_FAMILY_PREF_RESP_MSG, *PQMIWDS_SET_CLIENT_IP_FAMILY_PREF_RESP_MSG;\n\ntypedef struct _QMIWDS_SET_AUTO_CONNECT_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0051\n   USHORT Length;\n   UCHAR  TLVType;          // 0x01\n   USHORT TLVLength;        // 1\n   UCHAR  autoconnect_setting;     //  0x00 ?C Disabled, 0x01 ?C Enabled, 0x02 ?C Paused (resume on power cycle)\n} __attribute__ ((packed)) QMIWDS_SET_AUTO_CONNECT_REQ_MSG, *PQMIWDS_SET_AUTO_CONNECT_REQ_MSG;\n\n#if 0\ntypedef struct _QMIWDS_GET_MIP_MODE_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0040\n   USHORT Length;\n} QMIWDS_GET_MIP_MODE_REQ_MSG, *PQMIWDS_GET_MIP_MODE_REQ_MSG;\n\ntypedef struct _QMIWDS_GET_MIP_MODE_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0040\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n\n   UCHAR  TLV2Type;         // 0x01\n   USHORT TLV2Length;       // 20\n   UCHAR  MipMode;          //\n} QMIWDS_GET_MIP_MODE_RESP_MSG, *PQMIWDS_GET_MIP_MODE_RESP_MSG;\n#endif\n\ntypedef struct _QMIWDS_TECHNOLOGY_PREFERECE\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  TechPreference;\n} __attribute__ ((packed)) QMIWDS_TECHNOLOGY_PREFERECE, *PQMIWDS_TECHNOLOGY_PREFERECE;\n\ntypedef struct _QMIWDS_PROFILE_IDENTIFIER\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  ProfileIndex;\n} __attribute__ ((packed)) QMIWDS_PROFILE_IDENTIFIER, *PQMIWDS_PROFILE_IDENTIFIER;\n\n#if 0\ntypedef struct _QMIWDS_IPADDRESS\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   ULONG  IPv4Address;\n}QMIWDS_IPADDRESS, *PQMIWDS_IPADDRESS;\n\n/*\ntypedef struct _QMIWDS_UMTS_QOS\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  TrafficClass;\n   ULONG  MaxUplinkBitRate;\n   ULONG  MaxDownlinkBitRate;\n   ULONG  GuarUplinkBitRate;\n   ULONG  GuarDownlinkBitRate;\n   UCHAR  QOSDevOrder;\n   ULONG  MAXSDUSize;\n   UCHAR  SDUErrorRatio;\n   UCHAR  ResidualBerRatio;\n   UCHAR  DeliveryErrorSDUs;\n   ULONG  TransferDelay;\n   ULONG  TrafficHndPri;\n}QMIWDS_UMTS_QOS, *PQMIWDS_UMTS_QOS;\n\ntypedef struct _QMIWDS_GPRS_QOS\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   ULONG  PrecedenceClass;\n   ULONG  DelayClass;\n   ULONG  ReliabilityClass;\n   ULONG  PeekThroClass;\n   ULONG  MeanThroClass;\n}QMIWDS_GPRS_QOS, *PQMIWDS_GPRS_QOS;\n*/\n#endif\n\ntypedef struct _QMIWDS_PDPCONTEXT\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  pdp_context;\n} __attribute__ ((packed)) QMIWDS_PDPCONTEXT, *PQMIWDS_PDPCONTEXT;\n\ntypedef struct _QMIWDS_PROFILELIST\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  ProfileList[1024];\n} __attribute__ ((packed)) QMIWDS_PROFILELIST, *PQMIWDS_PROFILELIST;\n\ntypedef struct _QMIWDS_PROFILENAME\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  ProfileName;\n} __attribute__ ((packed)) QMIWDS_PROFILENAME, *PQMIWDS_PROFILENAME;\n\ntypedef struct _QMIWDS_PDPTYPE\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n// 0 ?C PDP-IP (IPv4)\n// 1 ?C PDP-PPP\n// 2 ?C PDP-IPv6\n// 3 ?C PDP-IPv4v6\n    UCHAR  PdpType;\n} __attribute__ ((packed)) QMIWDS_PDPTYPE, *PQMIWDS_PDPTYPE;\n\ntypedef struct _QMIWDS_USERNAME\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  UserName;\n} __attribute__ ((packed)) QMIWDS_USERNAME, *PQMIWDS_USERNAME;\n\ntypedef struct _QMIWDS_PASSWD\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  Passwd;\n} __attribute__ ((packed)) QMIWDS_PASSWD, *PQMIWDS_PASSWD;\n\ntypedef struct _QMIWDS_AUTH_PREFERENCE\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  AuthPreference;\n} __attribute__ ((packed)) QMIWDS_AUTH_PREFERENCE, *PQMIWDS_AUTH_PREFERENCE;\n\ntypedef struct _QMIWDS_IPTYPE\n{\n    UCHAR TLVType;\n    USHORT TLVLength;\n    UCHAR IPType;\n} __attribute__ ((packed)) QMIWDS_IPTYPE, *PQMIWDS_IPTYPE;\n\ntypedef struct _QMIWDS_APNNAME\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  ApnName;\n} __attribute__ ((packed)) QMIWDS_APNNAME, *PQMIWDS_APNNAME;\n\ntypedef struct _QMIWDS_AUTOCONNECT\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  AutoConnect;\n} __attribute__ ((packed)) QMIWDS_AUTOCONNECT, *PQMIWDS_AUTOCONNECT;\n\ntypedef struct _QMIWDS_START_NETWORK_INTERFACE_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n} __attribute__ ((packed)) QMIWDS_START_NETWORK_INTERFACE_REQ_MSG, *PQMIWDS_START_NETWORK_INTERFACE_REQ_MSG;\n\ntypedef struct _QMIWDS_CALLENDREASON\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT Reason;\n}__attribute__ ((packed)) QMIWDS_CALLENDREASON, *PQMIWDS_CALLENDREASON;\n\ntypedef struct _QMIWDS_START_NETWORK_INTERFACE_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0040\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n\n   UCHAR  TLV2Type;         // 0x01\n   USHORT TLV2Length;       // 20\n   ULONG  Handle;          //\n} __attribute__ ((packed)) QMIWDS_START_NETWORK_INTERFACE_RESP_MSG, *PQMIWDS_START_NETWORK_INTERFACE_RESP_MSG;\n\ntypedef struct _QMIWDS_STOP_NETWORK_INTERFACE_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   ULONG  Handle;\n} __attribute__ ((packed)) QMIWDS_STOP_NETWORK_INTERFACE_REQ_MSG, *PQMIWDS_STOP_NETWORK_INTERFACE_REQ_MSG;\n\ntypedef struct _QMIWDS_STOP_NETWORK_INTERFACE_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0040\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n\n} __attribute__ ((packed)) QMIWDS_STOP_NETWORK_INTERFACE_RESP_MSG, *PQMIWDS_STOP_NETWORK_INTERFACE_RESP_MSG;\n\ntypedef struct _QMIWDS_GET_DEFAULT_SETTINGS_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  ProfileType;\n} __attribute__ ((packed)) QMIWDS_GET_DEFAULT_SETTINGS_REQ_MSG, *PQMIWDS_GET_DEFAULT_SETTINGS_REQ_MSG;\n\ntypedef struct _QMIWDS_GET_DEFAULT_SETTINGS_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n} __attribute__ ((packed)) QMIWDS_GET_DEFAULT_SETTINGS_RESP_MSG, *PQMIWDS_GET_DEFAULT_SETTINGS_RESP_MSG;\n\ntypedef struct _QMIWDS_MODIFY_PROFILE_SETTINGS_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  ProfileType;\n   UCHAR  ProfileIndex;\n} __attribute__ ((packed)) QMIWDS_MODIFY_PROFILE_SETTINGS_REQ_MSG, *PQMIWDS_MODIFY_PROFILE_SETTINGS_REQ_MSG;\n\ntypedef struct _QMIWDS_MODIFY_PROFILE_SETTINGS_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n} __attribute__ ((packed)) QMIWDS_MODIFY_PROFILE_SETTINGS_RESP_MSG, *PQMIWDS_MODIFY_PROFILE_SETTINGS_RESP_MSG;\n\ntypedef struct _QMIWDS_GET_PROFILE_SETTINGS_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  ProfileType;\n   UCHAR  ProfileIndex;\n} __attribute__ ((packed)) QMIWDS_GET_PROFILE_SETTINGS_REQ_MSG, *PQMIWDS_GET_PROFILE_SETTINGS_REQ_MSG;\n\ntypedef struct _QMIWDS_CREATE_PROFILE_SETTINGS_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  ProfileType;\n   UCHAR  TLV2Type; //0x25\n   USHORT TLV2Length;\n   UCHAR  pdp_context;\n} __attribute__ ((packed)) QMIWDS_CREATE_PROFILE_SETTINGS_REQ_MSG, *PQMIWDS_CREATE_PROFILE_SETTINGS_REQ_MSG;\n\ntypedef struct _QMIWDS_GET_PROFILE_LIST_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n} __attribute__ ((packed)) QMIWDS_GET_PROFILE_LIST_REQ_MSG, *PQMIWDS_GET_PROFILE_LIST_REQ_MSG;\n\ntypedef struct _QMIWDS_GET_PROFILE_LIST_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  ProfileList[1024];\n} __attribute__ ((packed)) QMIWDS_GET_PROFILE_LIST_RESP_MSG, *PQMIWDS_GET_PROFILE_LIST_RESP_MSG;\n\n#if 0\ntypedef struct _QMIWDS_EVENT_REPORT_IND_DATA_BEARER_TLV\n{\n   UCHAR  Type;\n   USHORT Length;\n   UCHAR  DataBearer;\n} QMIWDS_EVENT_REPORT_IND_DATA_BEARER_TLV, *PQMIWDS_EVENT_REPORT_IND_DATA_BEARER_TLV;\n\ntypedef struct _QMIWDS_EVENT_REPORT_IND_DORMANCY_STATUS_TLV\n{\n   UCHAR  Type;\n   USHORT Length;\n   UCHAR  DormancyStatus;\n} QMIWDS_EVENT_REPORT_IND_DORMANCY_STATUS_TLV, *PQMIWDS_EVENT_REPORT_IND_DORMANCY_STATUS_TLV;\n\n\ntypedef struct _QMIWDS_GET_DATA_BEARER_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0037\n   USHORT Length;\n} QMIWDS_GET_DATA_BEARER_REQ_MSG, *PQMIWDS_GET_DATA_BEARER_REQ_MSG;\n\ntypedef struct _QMIWDS_GET_DATA_BEARER_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0037\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INTERNAL\n                            // QMI_ERR_MALFORMED_MSG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_OUT_OF_CALL\n                            // QMI_ERR_INFO_UNAVAILABLE\n   UCHAR  TLV2Type;         // 0x01\n   USHORT TLV2Length;       //\n   UCHAR  Technology;       //\n} QMIWDS_GET_DATA_BEARER_RESP_MSG, *PQMIWDS_GET_DATA_BEARER_RESP_MSG;\n#endif\n\n// ======================= DMS ==============================\n#define QMIDMS_SET_EVENT_REPORT_REQ           0x0001\n#define QMIDMS_SET_EVENT_REPORT_RESP          0x0001\n#define QMIDMS_EVENT_REPORT_IND               0x0001\n#define QMIDMS_GET_DEVICE_CAP_REQ             0x0020\n#define QMIDMS_GET_DEVICE_CAP_RESP            0x0020\n#define QMIDMS_GET_DEVICE_MFR_REQ             0x0021\n#define QMIDMS_GET_DEVICE_MFR_RESP            0x0021\n#define QMIDMS_GET_DEVICE_MODEL_ID_REQ        0x0022\n#define QMIDMS_GET_DEVICE_MODEL_ID_RESP       0x0022\n#define QMIDMS_GET_DEVICE_REV_ID_REQ          0x0023\n#define QMIDMS_GET_DEVICE_REV_ID_RESP         0x0023\n#define QMIDMS_GET_MSISDN_REQ                 0x0024\n#define QMIDMS_GET_MSISDN_RESP                0x0024\n#define QMIDMS_GET_DEVICE_SERIAL_NUMBERS_REQ  0x0025\n#define QMIDMS_GET_DEVICE_SERIAL_NUMBERS_RESP 0x0025\n#define QMIDMS_UIM_SET_PIN_PROTECTION_REQ     0x0027\n#define QMIDMS_UIM_SET_PIN_PROTECTION_RESP    0x0027\n#define QMIDMS_UIM_VERIFY_PIN_REQ             0x0028\n#define QMIDMS_UIM_VERIFY_PIN_RESP            0x0028\n#define QMIDMS_UIM_UNBLOCK_PIN_REQ            0x0029\n#define QMIDMS_UIM_UNBLOCK_PIN_RESP           0x0029\n#define QMIDMS_UIM_CHANGE_PIN_REQ             0x002A\n#define QMIDMS_UIM_CHANGE_PIN_RESP            0x002A\n#define QMIDMS_UIM_GET_PIN_STATUS_REQ         0x002B\n#define QMIDMS_UIM_GET_PIN_STATUS_RESP        0x002B\n#define QMIDMS_GET_DEVICE_HARDWARE_REV_REQ    0x002C\n#define QMIDMS_GET_DEVICE_HARDWARE_REV_RESP   0x002C\n#define QMIDMS_GET_OPERATING_MODE_REQ         0x002D\n#define QMIDMS_GET_OPERATING_MODE_RESP        0x002D\n#define QMIDMS_SET_OPERATING_MODE_REQ         0x002E\n#define QMIDMS_SET_OPERATING_MODE_RESP        0x002E\n#define QMIDMS_GET_ACTIVATED_STATUS_REQ       0x0031\n#define QMIDMS_GET_ACTIVATED_STATUS_RESP      0x0031\n#define QMIDMS_ACTIVATE_AUTOMATIC_REQ         0x0032\n#define QMIDMS_ACTIVATE_AUTOMATIC_RESP        0x0032\n#define QMIDMS_ACTIVATE_MANUAL_REQ            0x0033\n#define QMIDMS_ACTIVATE_MANUAL_RESP           0x0033\n#define QMIDMS_UIM_GET_ICCID_REQ              0x003C\n#define QMIDMS_UIM_GET_ICCID_RESP             0x003C\n#define QMIDMS_UIM_GET_CK_STATUS_REQ          0x0040\n#define QMIDMS_UIM_GET_CK_STATUS_RESP         0x0040\n#define QMIDMS_UIM_SET_CK_PROTECTION_REQ      0x0041\n#define QMIDMS_UIM_SET_CK_PROTECTION_RESP     0x0041\n#define QMIDMS_UIM_UNBLOCK_CK_REQ             0x0042\n#define QMIDMS_UIM_UNBLOCK_CK_RESP            0x0042\n#define QMIDMS_UIM_GET_IMSI_REQ               0x0043\n#define QMIDMS_UIM_GET_IMSI_RESP              0x0043\n#define QMIDMS_UIM_GET_STATE_REQ              0x0044\n#define QMIDMS_UIM_GET_STATE_RESP             0x0044\n#define QMIDMS_GET_BAND_CAP_REQ               0x0045\n#define QMIDMS_GET_BAND_CAP_RESP              0x0045\n\n#if 0\ntypedef struct _QMIDMS_GET_DEVICE_MFR_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n} QMIDMS_GET_DEVICE_MFR_REQ_MSG, *PQMIDMS_GET_DEVICE_MFR_REQ_MSG;\n\ntypedef struct _QMIDMS_GET_DEVICE_MFR_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n   UCHAR  TLV2Type;         // 0x01 - required parameter\n   USHORT TLV2Length;       // length of the mfr string\n   UCHAR  DeviceManufacturer; // first byte of string\n} QMIDMS_GET_DEVICE_MFR_RESP_MSG, *PQMIDMS_GET_DEVICE_MFR_RESP_MSG;\n\ntypedef struct _QMIDMS_GET_DEVICE_MODEL_ID_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0004\n   USHORT Length;\n} QMIDMS_GET_DEVICE_MODEL_ID_REQ_MSG, *PQMIDMS_GET_DEVICE_MODEL_ID_REQ_MSG;\n\ntypedef struct _QMIDMS_GET_DEVICE_MODEL_ID_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0004\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n   UCHAR  TLV2Type;         // 0x01 - required parameter\n   USHORT TLV2Length;       // length of the modem id string\n   UCHAR  DeviceModelID;    // device model id\n} QMIDMS_GET_DEVICE_MODEL_ID_RESP_MSG, *PQMIDMS_GET_DEVICE_MODEL_ID_RESP_MSG;\n#endif\n\ntypedef struct _QMIDMS_GET_DEVICE_REV_ID_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0005\n   USHORT Length;\n} __attribute__ ((packed)) QMIDMS_GET_DEVICE_REV_ID_REQ_MSG, *PQMIDMS_GET_DEVICE_REV_ID_REQ_MSG;\n\ntypedef struct _DEVICE_REV_ID\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  RevisionID;\n} __attribute__ ((packed)) DEVICE_REV_ID, *PDEVICE_REV_ID;\n\n#if 0\ntypedef struct _QMIDMS_GET_DEVICE_REV_ID_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0023\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n} QMIDMS_GET_DEVICE_REV_ID_RESP_MSG, *PQMIDMS_GET_DEVICE_REV_ID_RESP_MSG;\n\ntypedef struct _QMIDMS_GET_MSISDN_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n} QMIDMS_GET_MSISDN_REQ_MSG, *PQMIDMS_GET_MSISDN_REQ_MSG;\n\ntypedef struct _QCTLV_DEVICE_VOICE_NUMBERS\n{\n   UCHAR  TLVType;            // as defined above\n   USHORT TLVLength;          // 4/7/7\n   UCHAR  VoideNumberString; // ESN, IMEI, or MEID\n\n} QCTLV_DEVICE_VOICE_NUMBERS, *PQCTLV_DEVICE_VOICE_NUMBERS;\n\n\ntypedef struct _QMIDMS_GET_MSISDN_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n} QMIDMS_GET_MSISDN_RESP_MSG, *PQMIDMS_GET_MSISDN_RESP_MSG;\n#endif\n\ntypedef struct _QMIDMS_UIM_GET_IMSI_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n} __attribute__ ((packed)) QMIDMS_UIM_GET_IMSI_REQ_MSG, *PQMIDMS_UIM_GET_IMSI_REQ_MSG;\n\ntypedef struct _QMIDMS_UIM_GET_IMSI_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   UCHAR IMSI;\n} __attribute__ ((packed)) QMIDMS_UIM_GET_IMSI_RESP_MSG, *PQMIDMS_UIM_GET_IMSI_RESP_MSG;\n\n#if 0\ntypedef struct _QMIDMS_GET_DEVICE_SERIAL_NUMBERS_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0007\n   USHORT Length;\n} QMIDMS_GET_DEVICE_SERIAL_NUMBERS_REQ_MSG, *PQMIDMS_GET_DEVICE_SERIAL_NUMBERS_REQ_MSG;\n\n#define QCTLV_TYPE_SER_NUM_ESN  0x10\n#define QCTLV_TYPE_SER_NUM_IMEI 0x11\n#define QCTLV_TYPE_SER_NUM_MEID 0x12\n\ntypedef struct _QCTLV_DEVICE_SERIAL_NUMBER\n{\n   UCHAR  TLVType;            // as defined above\n   USHORT TLVLength;          // 4/7/7\n   UCHAR  SerialNumberString; // ESN, IMEI, or MEID\n\n} QCTLV_DEVICE_SERIAL_NUMBER, *PQCTLV_DEVICE_SERIAL_NUMBER;\n\ntypedef struct _QMIDMS_GET_DEVICE_SERIAL_NUMBERS_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0007\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n  // followed by optional TLV\n} QMIDMS_GET_DEVICE_SERIAL_NUMBERS_RESP_MSG, *PQMIDMS_GET_DEVICE_SERIAL_NUMBERS_RESP;\n\ntypedef struct _QMIDMS_GET_DMS_BAND_CAP\n{\n   USHORT  Type;\n   USHORT  Length;\n} QMIDMS_GET_BAND_CAP_REQ_MSG, *PQMIDMS_GET_BAND_CAP_REQ_MSG;\n\ntypedef struct _QMIDMS_GET_BAND_CAP_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_NONE\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_MALFORMED_MSG\n                            // QMI_ERR_NO_MEMORY\n\n   UCHAR  TLV2Type;         // 0x01\n   USHORT TLV2Length;       // 2\n   ULONG64 BandCap;\n} QMIDMS_GET_BAND_CAP_RESP_MSG, *PQMIDMS_GET_BAND_CAP_RESP;\n\ntypedef struct _QMIDMS_GET_DEVICE_CAP_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0002\n   USHORT Length;\n} QMIDMS_GET_DEVICE_CAP_REQ_MSG, *PQMIDMS_GET_DEVICE_CAP_REQ_MSG;\n\ntypedef struct _QMIDMS_GET_DEVICE_CAP_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0002\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMUX_RESULT_SUCCESS\n                            // QMUX_RESULT_FAILURE\n   USHORT QMUXError;        // QMUX_ERR_INVALID_ARG\n                            // QMUX_ERR_NO_MEMORY\n                            // QMUX_ERR_INTERNAL\n                            // QMUX_ERR_FAULT\n   UCHAR  TLV2Type;         // 0x01\n   USHORT TLV2Length;       // 2\n\n   ULONG  MaxTxChannelRate;\n   ULONG  MaxRxChannelRate;\n   UCHAR  VoiceCap;\n   UCHAR  SimCap;\n\n   UCHAR  RadioIfListCnt;   // #elements in radio interface list\n   UCHAR  RadioIfList;      // N 1-byte elements\n} QMIDMS_GET_DEVICE_CAP_RESP_MSG, *PQMIDMS_GET_DEVICE_CAP_RESP_MSG;\n\ntypedef struct _QMIDMS_GET_ACTIVATED_STATUS_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0002\n   USHORT Length;\n} QMIDMS_GET_ACTIVATED_STATUS_REQ_MSG, *PQMIDMS_GET_ACTIVATES_STATUD_REQ_MSG;\n\ntypedef struct _QMIDMS_GET_ACTIVATED_STATUS_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0002\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMUX_RESULT_SUCCESS\n                            // QMUX_RESULT_FAILURE\n   USHORT QMUXError;        // QMUX_ERR_INVALID_ARG\n                            // QMUX_ERR_NO_MEMORY\n                            // QMUX_ERR_INTERNAL\n                            // QMUX_ERR_FAULT\n   UCHAR  TLV2Type;         // 0x01\n   USHORT TLV2Length;       // 2\n\n   USHORT ActivatedStatus;\n} QMIDMS_GET_ACTIVATED_STATUS_RESP_MSG, *PQMIDMS_GET_ACTIVATED_STATUS_RESP_MSG;\n\ntypedef struct _QMIDMS_GET_OPERATING_MODE_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0002\n   USHORT Length;\n} QMIDMS_GET_OPERATING_MODE_REQ_MSG, *PQMIDMS_GET_OPERATING_MODE_REQ_MSG;\n\ntypedef struct _OFFLINE_REASON\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT OfflineReason;\n} OFFLINE_REASON, *POFFLINE_REASON;\n\ntypedef struct _HARDWARE_RESTRICTED_MODE\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  HardwareControlledMode;\n} HARDWARE_RESTRICTED_MODE, *PHARDWARE_RESTRICTED_MODE;\n\ntypedef struct _QMIDMS_GET_OPERATING_MODE_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0002\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMUX_RESULT_SUCCESS\n                            // QMUX_RESULT_FAILURE\n   USHORT QMUXError;        // QMUX_ERR_INVALID_ARG\n                            // QMUX_ERR_NO_MEMORY\n                            // QMUX_ERR_INTERNAL\n                            // QMUX_ERR_FAULT\n   UCHAR  TLV2Type;         // 0x01\n   USHORT TLV2Length;       // 2\n\n   UCHAR  OperatingMode;\n} QMIDMS_GET_OPERATING_MODE_RESP_MSG, *PQMIDMS_GET_OPERATING_MODE_RESP_MSG;\n\ntypedef struct _QMIDMS_UIM_GET_ICCID_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n} QMIDMS_UIM_GET_ICCID_REQ_MSG, *PQMIDMS_UIM_GET_ICCID_REQ_MSG;\n\ntypedef struct _QMIDMS_UIM_GET_ICCID_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n   UCHAR  TLV2Type;         // 0x01 - required parameter\n   USHORT TLV2Length;       // var\n   UCHAR  ICCID;      // String of voice number\n} QMIDMS_UIM_GET_ICCID_RESP_MSG, *PQMIDMS_UIM_GET_ICCID_RESP_MSG;\n#endif\n\ntypedef struct _QMIDMS_SET_OPERATING_MODE_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0002\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   UCHAR  OperatingMode;\n} __attribute__ ((packed)) QMIDMS_SET_OPERATING_MODE_REQ_MSG, *PQMIDMS_SET_OPERATING_MODE_REQ_MSG;\n\ntypedef struct _QMIDMS_SET_OPERATING_MODE_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0002\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMUX_RESULT_SUCCESS\n                            // QMUX_RESULT_FAILURE\n   USHORT QMUXError;        // QMUX_ERR_INVALID_ARG\n                            // QMUX_ERR_NO_MEMORY\n                            // QMUX_ERR_INTERNAL\n                            // QMUX_ERR_FAULT\n} __attribute__ ((packed)) QMIDMS_SET_OPERATING_MODE_RESP_MSG, *PQMIDMS_SET_OPERATING_MODE_RESP_MSG;\n\n#if 0\ntypedef struct _QMIDMS_ACTIVATE_AUTOMATIC_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        //\n   UCHAR  ActivateCodelen;\n   UCHAR  ActivateCode;\n} QMIDMS_ACTIVATE_AUTOMATIC_REQ_MSG, *PQMIDMS_ACTIVATE_AUTOMATIC_REQ_MSG;\n\ntypedef struct _QMIDMS_ACTIVATE_AUTOMATIC_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n} QMIDMS_ACTIVATE_AUTOMATIC_RESP_MSG, *PQMIDMS_ACTIVATE_AUTOMATIC_RESP_MSG;\n\n\ntypedef struct _SPC_MSG\n{\n   UCHAR SPC[6];\n   USHORT SID;\n} SPC_MSG, *PSPC_MSG;\n\ntypedef struct _MDN_MSG\n{\n   UCHAR MDNLEN;\n   UCHAR MDN;\n} MDN_MSG, *PMDN_MSG;\n\ntypedef struct _MIN_MSG\n{\n   UCHAR MINLEN;\n   UCHAR MIN;\n} MIN_MSG, *PMIN_MSG;\n\ntypedef struct _PRL_MSG\n{\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        //\n   USHORT PRLLEN;\n   UCHAR PRL;\n} PRL_MSG, *PPRL_MSG;\n\ntypedef struct _MN_HA_KEY_MSG\n{\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        //\n   UCHAR MN_HA_KEY_LEN;\n   UCHAR MN_HA_KEY;\n} MN_HA_KEY_MSG, *PMN_HA_KEY_MSG;\n\ntypedef struct _MN_AAA_KEY_MSG\n{\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        //\n   UCHAR MN_AAA_KEY_LEN;\n   UCHAR MN_AAA_KEY;\n} MN_AAA_KEY_MSG, *PMN_AAA_KEY_MSG;\n\ntypedef struct _QMIDMS_ACTIVATE_MANUAL_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        //\n   UCHAR  Value;\n} QMIDMS_ACTIVATE_MANUAL_REQ_MSG, *PQMIDMS_ACTIVATE_MANUAL_REQ_MSG;\n\ntypedef struct _QMIDMS_ACTIVATE_MANUAL_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n} QMIDMS_ACTIVATE_MANUAL_RESP_MSG, *PQMIDMS_ACTIVATE_MANUAL_RESP_MSG;\n#endif\n\ntypedef struct _QMIDMS_UIM_GET_STATE_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n} __attribute__ ((packed)) QMIDMS_UIM_GET_STATE_REQ_MSG, *PQMIDMS_UIM_GET_STATE_REQ_MSG;\n\ntypedef struct _QMIDMS_UIM_GET_STATE_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   UCHAR  UIMState;\n} __attribute__ ((packed)) QMIDMS_UIM_GET_STATE_RESP_MSG, *PQMIDMS_UIM_GET_STATE_RESP_MSG;\n\ntypedef struct _QMIDMS_UIM_GET_PIN_STATUS_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n} __attribute__ ((packed)) QMIDMS_UIM_GET_PIN_STATUS_REQ_MSG, *PQMIDMS_UIM_GET_PIN_STATUS_REQ_MSG;\n\ntypedef struct _QMIDMS_UIM_PIN_STATUS\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  PINStatus;\n   UCHAR  PINVerifyRetriesLeft;\n   UCHAR  PINUnblockRetriesLeft;\n} __attribute__ ((packed)) QMIDMS_UIM_PIN_STATUS, *PQMIDMS_UIM_PIN_STATUS;\n\n#define QMI_PIN_STATUS_NOT_INIT      0\n#define QMI_PIN_STATUS_NOT_VERIF     1\n#define QMI_PIN_STATUS_VERIFIED      2\n#define QMI_PIN_STATUS_DISABLED      3\n#define QMI_PIN_STATUS_BLOCKED       4\n#define QMI_PIN_STATUS_PERM_BLOCKED  5\n#define QMI_PIN_STATUS_UNBLOCKED     6\n#define QMI_PIN_STATUS_CHANGED       7\n\n\ntypedef struct _QMIDMS_UIM_GET_PIN_STATUS_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n   UCHAR PinStatus;\n} __attribute__ ((packed)) QMIDMS_UIM_GET_PIN_STATUS_RESP_MSG, *PQMIDMS_UIM_GET_PIN_STATUS_RESP_MSG;\n\n#if 0\ntypedef struct _QMIDMS_UIM_GET_CK_STATUS_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  Facility;\n} QMIDMS_UIM_GET_CK_STATUS_REQ_MSG, *PQMIDMS_UIM_GET_CK_STATUS_REQ_MSG;\n\n\ntypedef struct _QMIDMS_UIM_CK_STATUS\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  FacilityStatus;\n   UCHAR  FacilityVerifyRetriesLeft;\n   UCHAR  FacilityUnblockRetriesLeft;\n} QMIDMS_UIM_CK_STATUS, *PQMIDMS_UIM_CK_STATUS;\n\ntypedef struct _QMIDMS_UIM_CK_OPERATION_STATUS\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  OperationBlocking;\n} QMIDMS_UIM_CK_OPERATION_STATUS, *PQMIDMS_UIM_CK_OPERATION_STATUS;\n\ntypedef struct _QMIDMS_UIM_GET_CK_STATUS_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n   UCHAR  CkStatus;\n} QMIDMS_UIM_GET_CK_STATUS_RESP_MSG, *PQMIDMS_UIM_GET_CK_STATUS_RESP_MSG;\n#endif\n\ntypedef struct _QMIDMS_UIM_VERIFY_PIN_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   UCHAR  PINID;\n   UCHAR  PINLen;\n   UCHAR  PINValue;\n} __attribute__ ((packed)) QMIDMS_UIM_VERIFY_PIN_REQ_MSG, *PQMIDMS_UIM_VERIFY_PIN_REQ_MSG;\n\ntypedef struct _QMIDMS_UIM_VERIFY_PIN_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   UCHAR  PINVerifyRetriesLeft;\n   UCHAR  PINUnblockRetriesLeft;\n} __attribute__ ((packed)) QMIDMS_UIM_VERIFY_PIN_RESP_MSG, *PQMIDMS_UIM_VERIFY_PIN_RESP_MSG;\n\n#if 0\ntypedef struct _QMIDMS_UIM_SET_PIN_PROTECTION_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   UCHAR  PINID;\n   UCHAR  ProtectionSetting;\n   UCHAR  PINLen;\n   UCHAR  PINValue;\n} QMIDMS_UIM_SET_PIN_PROTECTION_REQ_MSG, *PQMIDMS_UIM_SET_PIN_PROTECTION_REQ_MSG;\n\ntypedef struct _QMIDMS_UIM_SET_PIN_PROTECTION_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   UCHAR  PINVerifyRetriesLeft;\n   UCHAR  PINUnblockRetriesLeft;\n} QMIDMS_UIM_SET_PIN_PROTECTION_RESP_MSG, *PQMIDMS_UIM_SET_PIN_PROTECTION_RESP_MSG;\n\ntypedef struct _QMIDMS_UIM_SET_CK_PROTECTION_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  Facility;\n   UCHAR  FacilityState;\n   UCHAR  FacliltyLen;\n   UCHAR  FacliltyValue;\n} QMIDMS_UIM_SET_CK_PROTECTION_REQ_MSG, *PQMIDMS_UIM_SET_CK_PROTECTION_REQ_MSG;\n\ntypedef struct _QMIDMS_UIM_SET_CK_PROTECTION_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   UCHAR  FacilityRetriesLeft;\n} QMIDMS_UIM_SET_CK_PROTECTION_RESP_MSG, *PQMIDMS_UIM_SET_CK_PROTECTION_RESP_MSG;\n\n\ntypedef struct _UIM_PIN\n{\n   UCHAR  PinLength;\n   UCHAR  PinValue;\n} UIM_PIN, *PUIM_PIN;\n\ntypedef struct _QMIDMS_UIM_CHANGE_PIN_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   UCHAR  PINID;\n   UCHAR  PinDetails;\n} QMIDMS_UIM_CHANGE_PIN_REQ_MSG, *PQMIDMS_UIM_CHANGE_PIN_REQ_MSG;\n\ntypedef struct QMIDMS_UIM_CHANGE_PIN_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   UCHAR  PINVerifyRetriesLeft;\n   UCHAR  PINUnblockRetriesLeft;\n} QMIDMS_UIM_CHANGE_PIN_RESP_MSG, *PQMIDMS_UIM_CHANGE_PIN_RESP_MSG;\n\ntypedef struct _UIM_PUK\n{\n   UCHAR  PukLength;\n   UCHAR  PukValue;\n} UIM_PUK, *PUIM_PUK;\n\ntypedef struct _QMIDMS_UIM_UNBLOCK_PIN_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   UCHAR  PINID;\n   UCHAR  PinDetails;\n} QMIDMS_UIM_UNBLOCK_PIN_REQ_MSG, *PQMIDMS_UIM_BLOCK_PIN_REQ_MSG;\n\ntypedef struct QMIDMS_UIM_UNBLOCK_PIN_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0024\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   UCHAR  PINVerifyRetriesLeft;\n   UCHAR  PINUnblockRetriesLeft;\n} QMIDMS_UIM_UNBLOCK_PIN_RESP_MSG, *PQMIDMS_UIM_UNBLOCK_PIN_RESP_MSG;\n\ntypedef struct _QMIDMS_UIM_UNBLOCK_CK_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  Facility;\n   UCHAR  FacliltyUnblockLen;\n   UCHAR  FacliltyUnblockValue;\n} QMIDMS_UIM_UNBLOCK_CK_REQ_MSG, *PQMIDMS_UIM_BLOCK_CK_REQ_MSG;\n\ntypedef struct QMIDMS_UIM_UNBLOCK_CK_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   UCHAR  FacilityUnblockRetriesLeft;\n} QMIDMS_UIM_UNBLOCK_CK_RESP_MSG, *PQMIDMS_UIM_UNBLOCK_CK_RESP_MSG;\n\ntypedef struct _QMIDMS_SET_EVENT_REPORT_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n} QMIDMS_SET_EVENT_REPORT_REQ_MSG, *PQMIDMS_SET_EVENT_REPORT_REQ_MSG;\n\ntypedef struct _QMIDMS_SET_EVENT_REPORT_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\n} QMIDMS_SET_EVENT_REPORT_RESP_MSG, *PQMIDMS_SET_EVENT_REPORT_RESP_MSG;\n\ntypedef struct _PIN_STATUS\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  ReportPinState;\n} PIN_STATUS, *PPIN_STATUS;\n\ntypedef struct _POWER_STATUS\n{\n   UCHAR TLVType;\n   USHORT TLVLength;\n   UCHAR PowerStatus;\n   UCHAR BatteryLvl;\n} POWER_STATUS, *PPOWER_STATUS;\n\ntypedef struct _ACTIVATION_STATE\n{\n   UCHAR TLVType;\n   USHORT TLVLength;\n   USHORT ActivationState;\n} ACTIVATION_STATE, *PACTIVATION_STATE;\n\ntypedef struct _ACTIVATION_STATE_REQ\n{\n   UCHAR TLVType;\n   USHORT TLVLength;\n   UCHAR ActivationState;\n} ACTIVATION_STATE_REQ, *PACTIVATION_STATE_REQ;\n\ntypedef struct _OPERATING_MODE\n{\n   UCHAR TLVType;\n   USHORT TLVLength;\n   UCHAR OperatingMode;\n} OPERATING_MODE, *POPERATING_MODE;\n\ntypedef struct _UIM_STATE\n{\n   UCHAR TLVType;\n   USHORT TLVLength;\n   UCHAR UIMState;\n} UIM_STATE, *PUIM_STATE;\n\ntypedef struct _WIRELESS_DISABLE_STATE\n{\n   UCHAR TLVType;\n   USHORT TLVLength;\n   UCHAR WirelessDisableState;\n} WIRELESS_DISABLE_STATE, *PWIRELESS_DISABLE_STATE;\n\ntypedef struct _QMIDMS_EVENT_REPORT_IND_MSG\n{\n   USHORT Type;\n   USHORT Length;\n} QMIDMS_EVENT_REPORT_IND_MSG, *PQMIDMS_EVENT_REPORT_IND_MSG;\n#endif\n\n// ============================ END OF DMS ===============================\n\n// ======================= QOS ==============================\ntypedef struct _MPIOC_DEV_INFO MPIOC_DEV_INFO, *PMPIOC_DEV_INFO;\n\n#define QMI_QOS_SET_EVENT_REPORT_REQ        0x0001\n#define QMI_QOS_SET_EVENT_REPORT_RESP       0x0001\n#define QMI_QOS_SET_EVENT_REPORT_IND        0x0001\n#define QMI_QOS_BIND_DATA_PORT_REQ          0x002B\n#define QMI_QOS_BIND_DATA_PORT_RESP         0x002B\n#define QMI_QOS_INDICATION_REGISTER_REQ\t    0x002F\n#define QMI_QOS_INDICATION_REGISTER_RESP    0x002F\n#define QMI_QOS_GLOBAL_QOS_FLOW_IND\t        0x0031\n#define QMI_QOS_GET_QOS_INFO_REQ            0x0033\n#define QMI_QOS_GET_QOS_INFO_RESP           0x0033\n\n\n#if 1\ntypedef struct _QMI_QOS_SET_EVENT_REPORT_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0001\n   USHORT Length;\n   // UCHAR  TLVType;          // 0x01 - physical link state\n   // USHORT TLVLength;        // 1\n   // UCHAR  PhyLinkStatusRpt; // 0-enable; 1-disable\n   UCHAR  TLVType2;         // 0x02 = global flow reporting\n   USHORT TLVLength2;       // 1\n   UCHAR  GlobalFlowRpt;    // 1-enable; 0-disable\n} QMI_QOS_SET_EVENT_REPORT_REQ_MSG, *PQMI_QOS_SET_EVENT_REPORT_REQ_MSG;\n\ntypedef struct _QMI_QOS_SET_EVENT_REPORT_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0010\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMUX_RESULT_SUCCESS\n                            // QMUX_RESULT_FAILURE\n   USHORT QMUXError;        // QMUX_ERR_INVALID_ARG\n                            // QMUX_ERR_NO_MEMORY\n                            // QMUX_ERR_INTERNAL\n                            // QMUX_ERR_FAULT\n} QMI_QOS_SET_EVENT_REPORT_RESP_MSG, *PQMI_QOS_SET_EVENT_REPORT_RESP_MSG;\n\ntypedef struct _QMI_QOS_SET_EVENT_REPORT_IND_MSG\n{\n   USHORT Type;             // QMUX type 0x0001\n   USHORT Length;\n   UCHAR  TLVs;\n} QMI_QOS_SET_EVENT_REPORT_IND_MSG, *PQMI_QOS_SET_EVENT_REPORT_IND_MSG;\n\n\ntypedef struct _QMI_QOS_BIND_DATA_PORT_TLV_EP_ID\n{\n\tUCHAR\tTLVType;\t\t//0x10\n\tUSHORT\tTLVLength;\n\tULONG\tep_type;\n\tULONG\tiface_id;\n} __attribute__ ((packed)) QMI_QOS_BIND_DATA_PORT_TLV_EP_ID, *PQMI_QOS_BIND_DATA_PORT_TLV_EP_ID;\n\ntypedef struct _QMI_QOS_BIND_DATA_PORT_TLV_MUX_ID\n{\n\tUCHAR\tTLVType;\t\t//0x11\n\tUSHORT\tTLVLength;\n\tUCHAR\tmux_id;\n} __attribute__ ((packed)) QMI_QOS_BIND_DATA_PORT_TLV_MUX_ID, *PQMI_QOS_BIND_DATA_PORT_TLV_MUX_ID;\n\ntypedef struct _QMI_QOS_BIND_DATA_PORT_TLV_DATA_PORT\n{\n\tUCHAR\tTLVType;\t\t//0x12\n\tUSHORT\tTLVLength;\n\tUSHORT\tdata_port;\n} __attribute__ ((packed)) QMI_QOS_BIND_DATA_PORT_TLV_DATA_PORT, *PQMI_QOS_BIND_DATA_PORT_TLV_DATA_PORT;\n\ntypedef struct _QMI_QOS_BIND_DATA_PORT_REQ_MSG\n{\n\tUSHORT\tType;\n\tUSHORT\tLength;\n\tQMI_QOS_BIND_DATA_PORT_TLV_EP_ID\t\tEpIdTlv;\n\tQMI_QOS_BIND_DATA_PORT_TLV_MUX_ID\t\tMuxIdTlv;\n\t//QMI_QOS_BIND_DATA_PORT_TLV_DATA_PORT\tDataPortTlv;\n} __attribute__ ((packed)) QMI_QOS_BIND_DATA_PORT_REQ_MSG, *PQMI_QOS_BIND_DATA_PORT_REQ_MSG;\n\ntypedef struct _QMI_QOS_BIND_DATA_PORT_RESP_MSG\n{\n\tUSHORT\tType;\n\tUSHORT\tLength;\n\tUCHAR\tTLVType;\t\t//0x02\n\tUSHORT\tTLVLength;\n\tUSHORT\tQMUXResult;\n\tUSHORT\tQMUXError;\n} __attribute__ ((packed)) QMI_QOS_BIND_DATA_PORT_RESP_MSG, *PQMI_QOS_BIND_DATA_PORT_RESP_MSG;\n\ntypedef struct _QMI_QOS_INDICATION_REGISTER_TLV_REPORT_GLOBAL_QOS_FLOW\n{\n\tUCHAR\tTLVType;\t\t//0x10\n\tUSHORT\tTLVLength;\n\tUCHAR\treport_global_qos_flows;\n} __attribute__ ((packed)) QMI_QOS_INDICATION_REGISTER_TLV_REPORT_GLOBAL_QOS_FLOW, *PQMI_QOS_INDICATION_REGISTER_TLV_REPORT_GLOBAL_QOS_FLOW;\n\ntypedef struct _QMI_QOS_INDICATION_REGISTER_TLV_SUPPRESS_REPORT_FLOW_CTL\n{\n\tUCHAR\tTLVType;\t\t//0x11\n\tUSHORT\tTLVLength;\n\tUCHAR\tsuppress_report_flow_control;\n} __attribute__ ((packed)) QMI_QOS_INDICATION_REGISTER_TLV_SUPPRESS_REPORT_FLOW_CTL, *PQMI_QOS_INDICATION_REGISTER_TLV_SUPPRESS_REPORT_FLOW_CTL;\n\ntypedef struct _QMI_QOS_INDICATION_REGISTER_TLV_SUPPRESS_NW_STATUS_IND\n{\n\tUCHAR\tTLVType;\t\t//0x12\n\tUSHORT\tTLVLength;\n\tUCHAR\tsuppress_network_status_ind;\n} __attribute__ ((packed)) QMI_QOS_INDICATION_REGISTER_TLV_SUPPRESS_NW_STATUS_IND, *PQMI_QOS_INDICATION_REGISTER_TLV_SUPPRESS_NW_STATUS_IND;\n\ntypedef struct _QMI_QOS_INDICATION_REGISTER_REQ_MSG\n{\n\tUSHORT\tType;\n\tUSHORT\tLength;\n\tQMI_QOS_INDICATION_REGISTER_TLV_REPORT_GLOBAL_QOS_FLOW\t\tReportGlobalQosFlowTlv;\n \t//QMI_QOS_INDICATION_REGISTER_TLV_SUPPRESS_REPORT_FLOW_CTL\tSuppressReportFlowCtlTlv;\n\t//QMI_QOS_INDICATION_REGISTER_TLV_SUPPRESS_NW_STATUS_IND\t\tSuppressNWStatusIndTlv;\n} __attribute__ ((packed)) QMI_QOS_INDICATION_REGISTER_REQ_MSG, *PQMI_QOS_INDICATION_REGISTER_REQ_MSG;\n\ntypedef struct _QMI_QOS_INDICATION_REGISTER_RESP_MSG\n{\n\tUSHORT\tType;\n\tUSHORT\tLength;\n\tUCHAR\tTLVType;\t\t//0x02\n\tUSHORT\tTLVLength;\n\tUSHORT\tQMUXResult;\n\tUSHORT\tQMUXError;\n} __attribute__ ((packed)) QMI_QOS_INDICATION_REGISTER_RESP_MSG, *PQMI_QOS_INDICATION_REGISTER_RESP_MSG;\n\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_STATE\n{\n\tUCHAR\tTLVType;\t\t//0x01\n\tUSHORT\tTLVLength;\n\tULONG\tqos_id;\n\tUCHAR\tnew_flow;\n\tULONG\tstate_change;\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_STATE, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_STATE;\n\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED\n{\n\tUCHAR\tTLVType;\t\t//0x10 0x11\n\tUSHORT\tTLVLength;\n\tULONG64\tflow_valid_params;\n\tULONG\tip_flow_trf_cls;\n\tULONG64 data_rate_max;\n\tULONG64\tguaranteed_rate;\n\tULONG\tpeak_rate;\n\tULONG\ttoken_rate;\n\tULONG\tbucket_size;\n\tULONG\tip_flow_latency;\n\tULONG\tip_flow_jitter;\n\tUSHORT\tip_flow_pkt_error_rate_multiplier;\n\tUSHORT\tip_flow_pkt_error_rate_exponent;\n\tULONG\tip_flow_min_policed_packet_size;\n\tULONG\tip_flow_max_allowed_packet_size;\n\tULONG\tip_flow_3gpp_residual_bit_error_rate;\n\tULONG\tip_flow_3gpp_traffic_handling_priority;\n\tUSHORT\tip_flow_3gpp2_profile_id;\n\tUCHAR\tip_flow_3gpp2_flow_priority;\n\tUCHAR\tip_flow_3gpp_im_cn_flag;\n\tUCHAR\tip_flow_3gpp_sig_ind;\n\tULONG\tip_flow_lte_qci;\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED;\n\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_FILTER\n{\n\tUCHAR\tTLVType;\t\t//0x12 0x13\n\tUSHORT\tTLVLength;\n\tUCHAR\ttx_rx_qos_filter_len;\n\tUCHAR\tip_version;\n\tULONG64\tvalid_params0;\n\tULONG\tipv4_addr0;\n\tULONG\tsubnet_mask0;\n\tULONG\tipv4_addr1;\n\tULONG\tsubnet_mask1;\n\tUCHAR\tval4;\n\tUCHAR\tmask4;\n\tULONG64\tvalid_params01;\n\tUCHAR\tipv6_address00;\n\tUCHAR\tipv6_address01;\n\tUCHAR\tipv6_address02;\n\tUCHAR\tipv6_address03;\n\tUCHAR\tipv6_address04;\n\tUCHAR\tipv6_address05;\n\tUCHAR\tipv6_address06;\n\tUCHAR\tipv6_address07;\n\tUCHAR\tipv6_address08;\n\tUCHAR\tipv6_address09;\n\tUCHAR\tipv6_address010;\n\tUCHAR\tipv6_address011;\n\tUCHAR\tipv6_address012;\n\tUCHAR\tipv6_address013;\n\tUCHAR\tipv6_address014;\n\tULONG\tipv6_address015;\n\tUCHAR\tprefix_len0;\n\tUCHAR\tipv6_address10;\n\tUCHAR\tipv6_address11;\n\tUCHAR\tipv6_address12;\n\tUCHAR\tipv6_address13;\n\tUCHAR\tipv6_address14;\n\tUCHAR\tipv6_address15;\n\tUCHAR\tipv6_address16;\n\tUCHAR\tipv6_address17;\n\tUCHAR\tipv6_address18;\n\tUCHAR\tipv6_address19;\n\tUCHAR\tipv6_address110;\n\tUCHAR\tipv6_address111;\n\tUCHAR\tipv6_address112;\n\tUCHAR\tipv6_address113;\n\tUCHAR\tipv6_address114;\n\tULONG\tipv6_address115;\n\tUCHAR\tprefix_len1;\n\tUCHAR\tval6;\n\tUCHAR\tmask6;\n\tULONG\tflow_label;\n\tULONG\txport_protocol;\n\tULONG64\tvalid_params2;\n\tUSHORT\tport0;\n\tUSHORT\trange0;\n\tUSHORT\tport1;\n\tUSHORT\trange1;\n\tULONG64\tvalid_params3;\n\tUSHORT\tport2;\n\tUSHORT\trange2;\n\tUSHORT\tport3;\n\tUSHORT\trange3;\n\tULONG64\tvalid_params4;\n\tUCHAR\ttype;\n\tUCHAR\tcode;\n\tULONG64\tvalid_params5;\n\tULONG\tspi0;\n\tULONG64\tvalid_params6;\n\tULONG\tspi1;\n\tUSHORT\tfilter_id;\n\tUSHORT\tfilter_precedence;\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_FILTER, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FILTER;\n\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_TYPE\n{\n\tUCHAR\tTLVType;\t\t//0x14\n\tUSHORT\tTLVLength;\n\tULONG\tflow_type;\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_TYPE, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_TYPE;\n\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_BEARER_ID\n{\n\tUCHAR\tTLVType;\t\t//0x15\n\tUSHORT\tTLVLength;\n\tUCHAR\tbearer_id;\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_BEARER_ID, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_BEARER_ID;\n\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_CTL_SEQ_NUM\n{\n\tUCHAR\tTLVType;\t\t//0x16\n\tUSHORT\tTLVLength;\n\tUSHORT\tfc_seq_num;\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_CTL_SEQ_NUM, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_CTL_SEQ_NUM;\n\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_5G_QCI\n{\n\tUCHAR\tTLVType;\t\t//0x17 0x18\n\tUSHORT\tTLVLength;\n\tULONG\ttx_rx_5g_qci;\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_5G_QCI, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_5G_QCI;\n\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_AVG_WINDOW\n{\n\tUCHAR\tTLVType;\t\t//0x19 0x1A\n\tUSHORT\tTLVLength;\n\tUSHORT\ttx_rx_avg_window;\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_AVG_WINDOW, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_AVG_WINDOW;\n\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_TX_FILTER_MATCH_ALL\n{\n\tUCHAR\tTLVType;\t\t//0x1B\n\tUSHORT\tTLVLength;\n\tUCHAR\ttx_filter_match_all_len;\n\tUSHORT\tfilter_id;\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_TX_FILTER_MATCH_ALL, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_TX_FILTER_MATCH_ALL;\n\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_IND_MSG\n{\n\tUSHORT\tType;\n\tUSHORT\tLength;\n\tQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_STATE\t\t\tFlowStateTlv;\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED\t\tTxFlowGrantedTlv;\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED\t\tRxFlowGrantedTlv;\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_FILTER\t\t\t\tTxFilterTlv;\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_FILTER\t\t\t\tRxFilterTlv;\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_TYPE\t\t\tFlowTypeTlv;\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_BEARER_ID\t\t\tBearerIdTlv;\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_CTL_SEQ_NUM\tFlowCtlSeqNumTlv;\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_5G_QCI\t\t\t\tTx5GQciTlv;\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_5G_QCI\t\t\t\tRx5GQciTlv;\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_AVG_WINDOW\t\t\tAvgWindowTlv;\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_TX_FILTER_MATCH_ALL\tTxFilterMatchAllTlv;\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_IND_MSG, *PQMI_QOS_GLOBAL_QOS_FLOW_IND_MSG;\n\ntypedef struct _QMI_QOS_GET_QOS_INFO_TLV_QOS_ID\n{\n\tUCHAR\tTLVType;\t\t//0x01\n\tUSHORT\tTLVLength;\n\tULONG\tqos_id;\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_TLV_QOS_ID, *PQMI_QOS_GET_QOS_INFO_TLV_QOS_ID;\n\ntypedef struct _QMI_QOS_GET_QOS_INFO_TLV_FLOW_STATUS\n{\n\tUCHAR\tTLVType;\t\t//0x10\n\tUSHORT\tTLVLength;\n\tUCHAR\tflow_status;\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_TLV_FLOW_STATUS, *PQMI_QOS_GET_QOS_INFO_TLV_FLOW_STATUS;\n\ntypedef struct _QMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW\n{\n\tUCHAR\tTLVType;\t\t//0x11 0x12\n\tUSHORT\tTLVLength;\n\tULONG64\tflow_valid_params;\n\tULONG\tip_flow_trf_cls;\n\tULONG64 data_rate_max;\n\tULONG64\tguaranteed_rate;\n\tULONG\tpeak_rate;\n\tULONG\ttoken_rate;\n\tULONG\tbucket_size;\n\tULONG\tip_flow_latency;\n\tULONG\tip_flow_jitter;\n\tUSHORT\tip_flow_pkt_error_rate_multiplier;\n\tUSHORT\tip_flow_pkt_error_rate_exponent;\n\tULONG\tip_flow_min_policed_packet_size;\n\tULONG\tip_flow_max_allowed_packet_size;\n\tULONG\tip_flow_3gpp_residual_bit_error_rate;\n\tULONG\tip_flow_3gpp_traffic_handling_priority;\n\tUSHORT\tip_flow_3gpp2_profile_id;\n\tUCHAR\tip_flow_3gpp2_flow_priority;\n\tUCHAR\tip_flow_3gpp_im_cn_flag;\n\tUCHAR\tip_flow_3gpp_sig_ind;\n\tULONG\tip_flow_lte_qci;\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW, *PQMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW;\n\ntypedef struct _QMI_QOS_GET_QOS_INFO_TLV_FILTER_SPECS\n{\n\tUCHAR\tTLVType;\t\t//0x13 0x14\n\tUSHORT\tTLVLength;\n\tUCHAR\ttx_rx_qos_filter_len;\n\tUCHAR\tip_version;\n\tULONG64\tvalid_params0;\n\tULONG\tipv4_addr0;\n\tULONG\tsubnet_mask0;\n\tULONG\tipv4_addr1;\n\tULONG\tsubnet_mask1;\n\tUCHAR\tval4;\n\tUCHAR\tmask4;\n\tULONG64\tvalid_params01;\n\tUCHAR\tipv6_address00;\n\tUCHAR\tipv6_address01;\n\tUCHAR\tipv6_address02;\n\tUCHAR\tipv6_address03;\n\tUCHAR\tipv6_address04;\n\tUCHAR\tipv6_address05;\n\tUCHAR\tipv6_address06;\n\tUCHAR\tipv6_address07;\n\tUCHAR\tipv6_address08;\n\tUCHAR\tipv6_address09;\n\tUCHAR\tipv6_address010;\n\tUCHAR\tipv6_address011;\n\tUCHAR\tipv6_address012;\n\tUCHAR\tipv6_address013;\n\tUCHAR\tipv6_address014;\n\tULONG\tipv6_address015;\n\tUCHAR\tprefix_len0;\n\tUCHAR\tipv6_address10;\n\tUCHAR\tipv6_address11;\n\tUCHAR\tipv6_address12;\n\tUCHAR\tipv6_address13;\n\tUCHAR\tipv6_address14;\n\tUCHAR\tipv6_address15;\n\tUCHAR\tipv6_address16;\n\tUCHAR\tipv6_address17;\n\tUCHAR\tipv6_address18;\n\tUCHAR\tipv6_address19;\n\tUCHAR\tipv6_address110;\n\tUCHAR\tipv6_address111;\n\tUCHAR\tipv6_address112;\n\tUCHAR\tipv6_address113;\n\tUCHAR\tipv6_address114;\n\tULONG\tipv6_address115;\n\tUCHAR\tprefix_len1;\n\tUCHAR\tval6;\n\tUCHAR\tmask6;\n\tULONG\tflow_label;\n\tULONG\txport_protocol;\n\tULONG64\tvalid_params2;\n\tUSHORT\tport0;\n\tUSHORT\trange0;\n\tUSHORT\tport1;\n\tUSHORT\trange1;\n\tULONG64\tvalid_params3;\n\tUSHORT\tport2;\n\tUSHORT\trange2;\n\tUSHORT\tport3;\n\tUSHORT\trange3;\n\tULONG64\tvalid_params4;\n\tUCHAR\ttype;\n\tUCHAR\tcode;\n\tULONG64\tvalid_params5;\n\tULONG\tspi0;\n\tULONG64\tvalid_params6;\n\tULONG\tspi1;\n\tUSHORT\tfilter_id;\n\tUSHORT\tfilter_precedence;\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_TLV_FILTER_SPECS, *PQMI_QOS_GET_QOS_INFO_TLV_FILTER_SPECS;\n\ntypedef struct _QMI_QOS_GET_QOS_INFO_TLV_EXT_ERROR_INFO\n{\n\tUCHAR\tTLVType;\t\t//0x15\n\tUSHORT\tTLVLength;\n\tUSHORT\text_error_info;\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_TLV_EXT_ERROR_INFO, *PQMI_QOS_GET_QOS_INFO_TLV_EXT_ERROR_INFO;\n\ntypedef struct _QMI_QOS_GET_QOS_INFO_TLV_5G_QCI\n{\n\tUCHAR\tTLVType;\t\t//0x16 0x17\n\tUSHORT\tTLVLength;\n\tULONG\ttx_rx_5g_qci;\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_TLV_5G_QCI, *PQMI_QOS_GET_QOS_INFO_TLV_5G_QCI;\n\ntypedef struct _QMI_QOS_GET_QOS_INFO_TLV_AVG_WINDOW\n{\n\tUCHAR\tTLVType;\t\t//0x18 0x19\n\tUSHORT\tTLVLength;\n\tUSHORT\ttx_rx_averaging_window;\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_TLV_AVG_WINDOW, *PQMI_QOS_GET_QOS_INFO_TLV_AVG_WINDOW;\n\ntypedef struct _QMI_QOS_GET_QOS_INFO_TLV_TX_FILTER_MATCH_ALL\n{\n\tUCHAR\tTLVType;\t\t//0x1A\n\tUSHORT\tTLVLength;\n\tUCHAR\ttx_filter_match_all_len;\n\tUSHORT\tfilter_id;\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_TLV_TX_FILTER_MATCH_ALL, *PQMI_QOS_GET_QOS_INFO_TLV_TX_FILTER_MATCH_ALL;\n\ntypedef struct _QMI_QOS_GET_QOS_INFO_REQ_MSG\n{\n\tUSHORT\tType;\n\tUSHORT\tLength;\n\tQMI_QOS_GET_QOS_INFO_TLV_QOS_ID\t\tQosIdTlv;\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_REQ_MSG, *PQMI_QOS_GET_QOS_INFO_REQ_MSG;\n\ntypedef struct _QMI_QOS_GET_QOS_INFO_RESP_MSG\n{\n\tUSHORT\tType;\n\tUSHORT\tLength;\n\tUCHAR\tTLVType;\t\t//0x02\n\tUSHORT\tTLVLength;\n\tUSHORT\tQMUXResult;\n\tUSHORT\tQMUXError;\n\t//QMI_QOS_GET_QOS_INFO_TLV_FLOW_STATUS\t\t\tFlowStatusTlv;\n\t//QMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW\t\t\tTxGrantedFlowTlv;\n\t//QMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW\t\t\tRxGrantedFlowTlv;\n\t//QMI_QOS_GET_QOS_INFO_TLV_FILTER_SPECS\t\t\tTxFilterSpecsTlv;\n\t//QMI_QOS_GET_QOS_INFO_TLV_FILTER_SPECS\t\t\tRxFilterSpecsTlv;\n\t//QMI_QOS_GET_QOS_INFO_TLV_EXT_ERROR_INFO\t\t\tExtErrorInfoTlv;\n\t//QMI_QOS_GET_QOS_INFO_TLV_5G_QCI\t\t\t\t\tTx5GQciTlv;\n\t//QMI_QOS_GET_QOS_INFO_TLV_5G_QCI\t\t\t\t\tRx5GQciTlv;\n\t//QMI_QOS_GET_QOS_INFO_TLV_AVG_WINDOW\t\t\t\tTxAvgWindowTlv;\n\t//QMI_QOS_GET_QOS_INFO_TLV_AVG_WINDOW\t\t\t\tRxAvgWindowTlv;\n\t//QMI_QOS_GET_QOS_INFO_TLV_TX_FILTER_MATCH_ALL\tTxFilterMatchAllTlv;\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_RESP_MSG, *PQMI_QOS_GET_QOS_INFO_RESP_MSG;\n\n#define QOS_IND_FLOW_STATE_ACTIVATED 0x00\n#define QOS_IND_FLOW_STATE_MODIFIED  0x01\n#define QOS_IND_FLOW_STATE_DELETED   0x02\n#define QOS_IND_FLOW_STATE_SUSPENDED 0x03\n#define QOS_IND_FLOW_STATE_ENABLED   0x04\n#define QOS_IND_FLOW_STATE_DISABLED  0x05\n#define QOS_IND_FLOW_STATE_INVALID\t 0x06\n\n#define QOS_EVENT_RPT_IND_FLOW_ACTIVATED 0x01\n#define QOS_EVENT_RPT_IND_FLOW_MODIFIED  0x02\n#define QOS_EVENT_RPT_IND_FLOW_DELETED   0x03\n#define QOS_EVENT_RPT_IND_FLOW_SUSPENDED 0x04\n#define QOS_EVENT_RPT_IND_FLOW_ENABLED   0x05\n#define QOS_EVENT_RPT_IND_FLOW_DISABLED  0x06\n\n#define QOS_EVENT_RPT_IND_TLV_PHY_LINK_STATE_TYPE 0x01\n#define QOS_EVENT_RPT_IND_TLV_GLOBAL_FL_RPT_STATE 0x10\n#define QOS_EVENT_RPT_IND_TLV_GLOBAL_FL_RPT_TYPE  0x10\n#define QOS_EVENT_RPT_IND_TLV_TX_FLOW_TYPE        0x11\n#define QOS_EVENT_RPT_IND_TLV_RX_FLOW_TYPE        0x12\n#define QOS_EVENT_RPT_IND_TLV_TX_FILTER_TYPE      0x13\n#define QOS_EVENT_RPT_IND_TLV_RX_FILTER_TYPE      0x14\n#define QOS_EVENT_RPT_IND_TLV_FLOW_SPEC           0x10\n#define QOS_EVENT_RPT_IND_TLV_FILTER_SPEC         0x10\n\ntypedef struct _QOS_EVENT_RPT_IND_TLV_PHY_LINK_STATE\n{\n   UCHAR  TLVType;       // 0x01\n   USHORT TLVLength;     // 1\n   UCHAR  PhyLinkState;  // 0-dormant, 1-active\n} QOS_EVENT_RPT_IND_TLV_PHY_LINK_STATE, *PQOS_EVENT_RPT_IND_TLV_PHY_LINK_STATE;\n\ntypedef struct _QOS_EVENT_RPT_IND_TLV_GLOBAL_FL_RPT\n{\n   UCHAR  TLVType;       // 0x10\n   USHORT TLVLength;     // 6\n   ULONG  QosId;\n   UCHAR  NewFlow;       // 1: newly added flow; 0: existing flow\n   UCHAR  StateChange;   // 1: activated; 2: modified; 3: deleted;\n                         // 4: suspended(delete); 5: enabled; 6: disabled\n} QOS_EVENT_RPT_IND_TLV_GLOBAL_FL_RPT, *PQOS_EVENT_RPT_IND_TLV_GLOBAL_FL_RPT;\n\n// QOS Flow\n\ntypedef struct _QOS_EVENT_RPT_IND_TLV_FLOW\n{\n   UCHAR  TLVType;       // 0x10-TX flow; 0x11-RX flow\n   USHORT TLVLength;     // var\n   // embedded TLV's\n} QOS_EVENT_RPT_IND_TLV_TX_FLOW, *PQOS_EVENT_RPT_IND_TLV_TX_FLOW;\n\n#define QOS_FLOW_TLV_IP_FLOW_IDX_TYPE                    0x10\n#define QOS_FLOW_TLV_IP_FLOW_TRAFFIC_CLASS_TYPE          0x11\n#define QOS_FLOW_TLV_IP_FLOW_DATA_RATE_MIN_MAX_TYPE      0x12\n#define QOS_FLOW_TLV_IP_FLOW_DATA_RATE_TOKEN_BUCKET_TYPE 0x13\n#define QOS_FLOW_TLV_IP_FLOW_LATENCY_TYPE                0x14\n#define QOS_FLOW_TLV_IP_FLOW_JITTER_TYPE                 0x15\n#define QOS_FLOW_TLV_IP_FLOW_PKT_ERR_RATE_TYPE           0x16\n#define QOS_FLOW_TLV_IP_FLOW_MIN_PKT_SIZE_TYPE           0x17\n#define QOS_FLOW_TLV_IP_FLOW_MAX_PKT_SIZE_TYPE           0x18\n#define QOS_FLOW_TLV_IP_FLOW_3GPP_BIT_ERR_RATE_TYPE      0x19\n#define QOS_FLOW_TLV_IP_FLOW_3GPP_TRAF_PRIORITY_TYPE     0x1A\n#define QOS_FLOW_TLV_IP_FLOW_3GPP2_PROFILE_ID_TYPE       0x1B\n\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_IDX\n{\n   UCHAR  TLVType;       // 0x10\n   USHORT TLVLength;     // 1\n   UCHAR  IpFlowIndex;\n}  QOS_FLOW_TLV_IP_FLOW_IDX, *PQOS_FLOW_TLV_IP_FLOW_IDX;\n\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_TRAFFIC_CLASS\n{\n   UCHAR  TLVType;       // 0x11\n   USHORT TLVLength;     // 1\n   UCHAR  TrafficClass;\n}  QOS_FLOW_TLV_IP_FLOW_TRAFFIC_CLASS, *PQOS_FLOW_TLV_IP_FLOW_TRAFFIC_CLASS;\n\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_DATA_RATE_MIN_MAX\n{\n   UCHAR  TLVType;       // 0x12\n   USHORT TLVLength;     // 8\n   ULONG  DataRateMax;\n   ULONG  GuaranteedRate;\n}  QOS_FLOW_TLV_IP_FLOW_DATA_RATE_MIN_MAX, *PQOS_FLOW_TLV_IP_FLOW_DATA_RATE_MIN_MAX;\n\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_DATA_RATE_TOKEN_BUCKET\n{\n   UCHAR  TLVType;       // 0x13\n   USHORT TLVLength;     // 12\n   ULONG  PeakRate;\n   ULONG  TokenRate;\n   ULONG  BucketSize;\n}  QOS_FLOW_TLV_IP_FLOW_DATA_RATE_TOKEN_BUCKET, *PQOS_FLOW_TLV_IP_FLOW_DATA_RATE_TOKEN_BUCKET;\n\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_LATENCY\n{\n   UCHAR  TLVType;       // 0x14\n   USHORT TLVLength;     // 4\n   ULONG  IpFlowLatency;\n}  QOS_FLOW_TLV_IP_FLOW_LATENCY, *PQOS_FLOW_TLV_IP_FLOW_LATENCY;\n\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_JITTER\n{\n   UCHAR  TLVType;       // 0x15\n   USHORT TLVLength;     // 4\n   ULONG  IpFlowJitter;\n}  QOS_FLOW_TLV_IP_FLOW_JITTER, *PQOS_FLOW_TLV_IP_FLOW_JITTER;\n\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_PKT_ERR_RATE\n{\n   UCHAR  TLVType;       // 0x16\n   USHORT TLVLength;     // 4\n   USHORT ErrRateMultiplier;\n   USHORT ErrRateExponent;\n}  QOS_FLOW_TLV_IP_FLOW_PKT_ERR_RATE, *PQOS_FLOW_TLV_IP_FLOW_PKT_ERR_RATE;\n\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_MIN_PKT_SIZE\n{\n   UCHAR  TLVType;       // 0x17\n   USHORT TLVLength;     // 4\n   ULONG  MinPolicedPktSize;\n}  QOS_FLOW_TLV_IP_FLOW_MIN_PKT_SIZE, *PQOS_FLOW_TLV_IP_FLOW_MIN_PKT_SIZE;\n\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_MAX_PKT_SIZE\n{\n   UCHAR  TLVType;       // 0x18\n   USHORT TLVLength;     // 4\n   ULONG  MaxAllowedPktSize;\n}  QOS_FLOW_TLV_IP_FLOW_MAX_PKT_SIZE, *PQOS_FLOW_TLV_IP_FLOW_MAX_PKT_SIZE;\n\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_3GPP_BIT_ERR_RATE\n{\n   UCHAR  TLVType;       // 0x19\n   USHORT TLVLength;     // 1\n   UCHAR  ResidualBitErrorRate;\n}  QOS_FLOW_TLV_IP_FLOW_3GPP_BIT_ERR_RATE, *PQOS_FLOW_TLV_IP_FLOW_3GPP_BIT_ERR_RATE;\n\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_3GPP_TRAF_PRIORITY\n{\n   UCHAR  TLVType;       // 0x1A\n   USHORT TLVLength;     // 1\n   UCHAR  TrafficHandlingPriority;\n}  QOS_FLOW_TLV_IP_FLOW_3GPP_TRAF_PRIORITY, *PQOS_FLOW_TLV_IP_FLOW_3GPP_TRAF_PRIORITY;\n\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_3GPP2_PROFILE_ID\n{\n   UCHAR  TLVType;       // 0x1B\n   USHORT TLVLength;     // 2\n   USHORT ProfileId;\n}  QOS_FLOW_TLV_IP_FLOW_3GPP2_PROFILE_ID, *PQOS_FLOW_TLV_IP_FLOW_3GPP2_PROFILE_ID;\n\n// QOS Filter\n\n#define QOS_FILTER_TLV_IP_FILTER_IDX_TYPE          0x10\n#define QOS_FILTER_TLV_IP_VERSION_TYPE             0x11\n#define QOS_FILTER_TLV_IPV4_SRC_ADDR_TYPE          0x12\n#define QOS_FILTER_TLV_IPV4_DEST_ADDR_TYPE         0x13\n#define QOS_FILTER_TLV_NEXT_HDR_PROTOCOL_TYPE      0x14\n#define QOS_FILTER_TLV_IPV4_TYPE_OF_SERVICE_TYPE   0x15\n#define QOS_FILTER_TLV_TCP_UDP_PORT_SRC_TCP_TYPE   0x1B\n#define QOS_FILTER_TLV_TCP_UDP_PORT_DEST_TCP_TYPE  0x1C\n#define QOS_FILTER_TLV_TCP_UDP_PORT_SRC_UDP_TYPE   0x1D\n#define QOS_FILTER_TLV_TCP_UDP_PORT_DEST_UDP_TYPE  0x1E\n#define QOS_FILTER_TLV_ICMP_FILTER_MSG_TYPE_TYPE   0x1F\n#define QOS_FILTER_TLV_ICMP_FILTER_MSG_CODE_TYPE   0x20\n#define QOS_FILTER_TLV_TCP_UDP_PORT_SRC_TYPE       0x24\n#define QOS_FILTER_TLV_TCP_UDP_PORT_DEST_TYPE      0x25\n\ntypedef struct _QOS_EVENT_RPT_IND_TLV_FILTER\n{\n   UCHAR  TLVType;       // 0x12-TX filter; 0x13-RX filter\n   USHORT TLVLength;     // var\n   // embedded TLV's\n} QOS_EVENT_RPT_IND_TLV_RX_FILTER, *PQOS_EVENT_RPT_IND_TLV_RX_FILTER;\n\ntypedef struct _QOS_FILTER_TLV_IP_FILTER_IDX\n{\n   UCHAR  TLVType;       // 0x10\n   USHORT TLVLength;     // 1\n   UCHAR  IpFilterIndex;\n}  QOS_FILTER_TLV_IP_FILTER_IDX, *PQOS_FILTER_TLV_IP_FILTER_IDX;\n\ntypedef struct _QOS_FILTER_TLV_IP_VERSION\n{\n   UCHAR  TLVType;       // 0x11\n   USHORT TLVLength;     // 1\n   UCHAR  IpVersion;\n}  QOS_FILTER_TLV_IP_VERSION, *PQOS_FILTER_TLV_IP_VERSION;\n\ntypedef struct _QOS_FILTER_TLV_IPV4_SRC_ADDR\n{\n   UCHAR  TLVType;       // 0x12\n   USHORT TLVLength;     // 8\n   ULONG  IpSrcAddr;\n   ULONG  IpSrcSubnetMask;\n}  QOS_FILTER_TLV_IPV4_SRC_ADDR, *PQOS_FILTER_TLV_IPV4_SRC_ADDR;\n\ntypedef struct _QOS_FILTER_TLV_IPV4_DEST_ADDR\n{\n   UCHAR  TLVType;       // 0x13\n   USHORT TLVLength;     // 8\n   ULONG  IpDestAddr;\n   ULONG  IpDestSubnetMask;\n}  QOS_FILTER_TLV_IPV4_DEST_ADDR, *PQOS_FILTER_TLV_IPV4_DEST_ADDR;\n\ntypedef struct _QOS_FILTER_TLV_NEXT_HDR_PROTOCOL\n{\n   UCHAR  TLVType;       // 0x14\n   USHORT TLVLength;     // 1\n   UCHAR  NextHdrProtocol;\n}  QOS_FILTER_TLV_NEXT_HDR_PROTOCOL, *PQOS_FILTER_TLV_NEXT_HDR_PROTOCOL;\n\ntypedef struct _QOS_FILTER_TLV_IPV4_TYPE_OF_SERVICE\n{\n   UCHAR  TLVType;       // 0x15\n   USHORT TLVLength;     // 2\n   UCHAR  Ipv4TypeOfService;\n   UCHAR  Ipv4TypeOfServiceMask;\n}  QOS_FILTER_TLV_IPV4_TYPE_OF_SERVICE, *PQOS_FILTER_TLV_IPV4_TYPE_OF_SERVICE;\n\ntypedef struct _QOS_FILTER_TLV_TCP_UDP_PORT\n{\n   UCHAR  TLVType;       // source port: 0x1B-TCP; 0x1D-UDP\n                         // dest port:   0x1C-TCP; 0x1E-UDP\n   USHORT TLVLength;     // 4\n   USHORT FilterPort;\n   USHORT FilterPortRange;\n}  QOS_FILTER_TLV_TCP_UDP_PORT, *PQOS_FILTER_TLV_TCP_UDP_PORT;\n\ntypedef struct _QOS_FILTER_TLV_ICMP_FILTER_MSG_TYPE\n{\n   UCHAR  TLVType;       // 0x1F\n   USHORT TLVLength;     // 1\n   UCHAR  IcmpFilterMsgType;\n}  QOS_FILTER_TLV_ICMP_FILTER_MSG_TYPE, *PQOS_FILTER_TLV_ICMP_FILTER_MSG_TYPE;\n\ntypedef struct _QOS_FILTER_TLV_ICMP_FILTER_MSG_CODE\n{\n   UCHAR  TLVType;       // 0x20\n   USHORT TLVLength;     // 1\n   UCHAR  IcmpFilterMsgCode;\n}  QOS_FILTER_TLV_ICMP_FILTER_MSG_CODE, *PQOS_FILTER_TLV_ICMP_FILTER_MSG_CODE;\n\n#define QOS_FILTER_PRECEDENCE_INVALID  256\n#define QOS_FILTER_TLV_PRECEDENCE_TYPE 0x22\n#define QOS_FILTER_TLV_ID_TYPE         0x23\n\ntypedef struct _QOS_FILTER_TLV_PRECEDENCE\n{\n   UCHAR  TLVType;    // 0x22\n   USHORT TLVLength;  // 2\n   USHORT Precedence; // precedence of the filter\n}  QOS_FILTER_TLV_PRECEDENCE, *PQOS_FILTER_TLV_PRECEDENCE;\n\ntypedef struct _QOS_FILTER_TLV_ID\n{\n   UCHAR  TLVType;    // 0x23\n   USHORT TLVLength;  // 2\n   USHORT FilterId;   // filter ID\n}  QOS_FILTER_TLV_ID, *PQOS_FILTER_TLV_ID;\n\n#ifdef QCQOS_IPV6\n\n#define QOS_FILTER_TLV_IPV6_SRC_ADDR_TYPE          0x16\n#define QOS_FILTER_TLV_IPV6_DEST_ADDR_TYPE         0x17\n#define QOS_FILTER_TLV_IPV6_NEXT_HDR_PROTOCOL_TYPE 0x14  // same as IPV4\n#define QOS_FILTER_TLV_IPV6_TRAFFIC_CLASS_TYPE     0x19\n#define QOS_FILTER_TLV_IPV6_FLOW_LABEL_TYPE        0x1A\n\ntypedef struct _QOS_FILTER_TLV_IPV6_SRC_ADDR\n{\n   UCHAR  TLVType;       // 0x16\n   USHORT TLVLength;     // 17\n   UCHAR  IpSrcAddr[16];\n   UCHAR  IpSrcAddrPrefixLen;  // [0..128]\n}  QOS_FILTER_TLV_IPV6_SRC_ADDR, *PQOS_FILTER_TLV_IPV6_SRC_ADDR;\n\ntypedef struct _QOS_FILTER_TLV_IPV6_DEST_ADDR\n{\n   UCHAR  TLVType;       // 0x17\n   USHORT TLVLength;     // 17\n   UCHAR  IpDestAddr[16];\n   UCHAR  IpDestAddrPrefixLen;  // [0..128]\n}  QOS_FILTER_TLV_IPV6_DEST_ADDR, *PQOS_FILTER_TLV_IPV6_DEST_ADDR;\n\n#define QOS_FILTER_IPV6_NEXT_HDR_PROTOCOL_TCP 0x06\n#define QOS_FILTER_IPV6_NEXT_HDR_PROTOCOL_UDP 0x11\n\ntypedef struct _QOS_FILTER_TLV_IPV6_TRAFFIC_CLASS\n{\n   UCHAR  TLVType;       // 0x19\n   USHORT TLVLength;     // 2\n   UCHAR  TrafficClass;\n   UCHAR  TrafficClassMask; // compare the first 6 bits only\n}  QOS_FILTER_TLV_IPV6_TRAFFIC_CLASS, *PQOS_FILTER_TLV_IPV6_TRAFFIC_CLASS;\n\ntypedef struct _QOS_FILTER_TLV_IPV6_FLOW_LABEL\n{\n   UCHAR  TLVType;       // 0x1A\n   USHORT TLVLength;     // 4\n   ULONG  FlowLabel;\n}  QOS_FILTER_TLV_IPV6_FLOW_LABEL, *PQOS_FILTER_TLV_IPV6_FLOW_LABEL;\n\n#endif // QCQOS_IPV6\n#endif\n\n// ======================= WMS ==============================\n#define QMIWMS_SET_EVENT_REPORT_REQ           0x0001\n#define QMIWMS_SET_EVENT_REPORT_RESP          0x0001\n#define QMIWMS_EVENT_REPORT_IND               0x0001\n#define QMIWMS_RAW_SEND_REQ                   0x0020\n#define QMIWMS_RAW_SEND_RESP                  0x0020\n#define QMIWMS_RAW_WRITE_REQ                  0x0021\n#define QMIWMS_RAW_WRITE_RESP                 0x0021\n#define QMIWMS_RAW_READ_REQ                   0x0022\n#define QMIWMS_RAW_READ_RESP                  0x0022\n#define QMIWMS_MODIFY_TAG_REQ                 0x0023\n#define QMIWMS_MODIFY_TAG_RESP                0x0023\n#define QMIWMS_DELETE_REQ                     0x0024\n#define QMIWMS_DELETE_RESP                    0x0024\n#define QMIWMS_GET_MESSAGE_PROTOCOL_REQ       0x0030\n#define QMIWMS_GET_MESSAGE_PROTOCOL_RESP      0x0030\n#define QMIWMS_LIST_MESSAGES_REQ              0x0031\n#define QMIWMS_LIST_MESSAGES_RESP             0x0031\n#define QMIWMS_GET_SMSC_ADDRESS_REQ           0x0034\n#define QMIWMS_GET_SMSC_ADDRESS_RESP          0x0034\n#define QMIWMS_SET_SMSC_ADDRESS_REQ           0x0035\n#define QMIWMS_SET_SMSC_ADDRESS_RESP          0x0035\n#define QMIWMS_GET_STORE_MAX_SIZE_REQ         0x0036\n#define QMIWMS_GET_STORE_MAX_SIZE_RESP        0x0036\n\n\n#define WMS_MESSAGE_PROTOCOL_CDMA             0x00\n#define WMS_MESSAGE_PROTOCOL_WCDMA            0x01\n\n#if 0\ntypedef struct _QMIWMS_GET_MESSAGE_PROTOCOL_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n} QMIWMS_GET_MESSAGE_PROTOCOL_REQ_MSG, *PQMIWMS_GET_MESSAGE_PROTOCOL_REQ_MSG;\n\ntypedef struct _QMIWMS_GET_MESSAGE_PROTOCOL_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   UCHAR  MessageProtocol;\n} QMIWMS_GET_MESSAGE_PROTOCOL_RESP_MSG, *PQMIWMS_GET_MESSAGE_PROTOCOL_RESP_MSG;\n\ntypedef struct _QMIWMS_GET_STORE_MAX_SIZE_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  StorageType;\n} QMIWMS_GET_STORE_MAX_SIZE_REQ_MSG, *PQMIWMS_GET_STORE_MAX_SIZE_REQ_MSG;\n\ntypedef struct _QMIWMS_GET_STORE_MAX_SIZE_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   ULONG  MemStoreMaxSize;\n} QMIWMS_GET_STORE_MAX_SIZE_RESP_MSG, *PQMIWMS_GET_STORE_MAX_SIZE_RESP_MSG;\n\ntypedef struct _REQUEST_TAG\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  TagType;\n} REQUEST_TAG, *PREQUEST_TAG;\n\ntypedef struct _QMIWMS_LIST_MESSAGES_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  StorageType;\n} QMIWMS_LIST_MESSAGES_REQ_MSG, *PQMIWMS_LIST_MESSAGES_REQ_MSG;\n\ntypedef struct _QMIWMS_MESSAGE\n{\n   ULONG  MessageIndex;\n   UCHAR  TagType;\n} QMIWMS_MESSAGE, *PQMIWMS_MESSAGE;\n\ntypedef struct _QMIWMS_LIST_MESSAGES_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   ULONG  NumMessages;\n} QMIWMS_LIST_MESSAGES_RESP_MSG, *PQMIWMS_LIST_MESSAGES_RESP_MSG;\n\ntypedef struct _QMIWMS_RAW_READ_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  StorageType;\n   ULONG  MemoryIndex;\n} QMIWMS_RAW_READ_REQ_MSG, *PQMIWMS_RAW_READ_REQ_MSG;\n\ntypedef struct _QMIWMS_RAW_READ_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   UCHAR  TagType;\n   UCHAR  Format;\n   USHORT MessageLength;\n   UCHAR  Message;\n} QMIWMS_RAW_READ_RESP_MSG, *PQMIWMS_RAW_READ_RESP_MSG;\n\ntypedef struct _QMIWMS_MODIFY_TAG_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  StorageType;\n   ULONG  MemoryIndex;\n   UCHAR  TagType;\n} QMIWMS_MODIFY_TAG_REQ_MSG, *PQMIWMS_MODIFY_TAG_REQ_MSG;\n\ntypedef struct _QMIWMS_MODIFY_TAG_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n} QMIWMS_MODIFY_TAG_RESP_MSG, *PQMIWMS_MODIFY_TAG_RESP_MSG;\n\ntypedef struct _QMIWMS_RAW_SEND_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  SmsFormat;\n   USHORT SmsLength;\n   UCHAR  SmsMessage;\n} QMIWMS_RAW_SEND_REQ_MSG, *PQMIWMS_RAW_SEND_REQ_MSG;\n\ntypedef struct _RAW_SEND_CAUSE_CODE\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT CauseCode;\n} RAW_SEND_CAUSE_CODE, *PRAW_SEND_CAUSE_CODE;\n\n\ntypedef struct _QMIWMS_RAW_SEND_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n} QMIWMS_RAW_SEND_RESP_MSG, *PQMIWMS_RAW_SEND_RESP_MSG;\n\n\ntypedef struct _WMS_DELETE_MESSAGE_INDEX\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   ULONG  MemoryIndex;\n} WMS_DELETE_MESSAGE_INDEX, *PWMS_DELETE_MESSAGE_INDEX;\n\ntypedef struct _WMS_DELETE_MESSAGE_TAG\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  MessageTag;\n} WMS_DELETE_MESSAGE_TAG, *PWMS_DELETE_MESSAGE_TAG;\n\ntypedef struct _QMIWMS_DELETE_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  StorageType;\n} QMIWMS_DELETE_REQ_MSG, *PQMIWMS_DELETE_REQ_MSG;\n\ntypedef struct _QMIWMS_DELETE_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n} QMIWMS_DELETE_RESP_MSG, *PQMIWMS_DELETE_RESP_MSG;\n\n\ntypedef struct _QMIWMS_GET_SMSC_ADDRESS_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n} QMIWMS_GET_SMSC_ADDRESS_REQ_MSG, *PQMIWMS_GET_SMSC_ADDRESS_REQ_MSG;\n\ntypedef struct _QMIWMS_SMSC_ADDRESS\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  SMSCAddressType[3];\n   UCHAR  SMSCAddressLength;\n   UCHAR  SMSCAddressDigits;\n} QMIWMS_SMSC_ADDRESS, *PQMIWMS_SMSC_ADDRESS;\n\n\ntypedef struct _QMIWMS_GET_SMSC_ADDRESS_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n   UCHAR  SMSCAddress;\n} QMIWMS_GET_SMSC_ADDRESS_RESP_MSG, *PQMIWMS_GET_SMSC_ADDRESS_RESP_MSG;\n\ntypedef struct _QMIWMS_SET_SMSC_ADDRESS_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  SMSCAddress;\n} QMIWMS_SET_SMSC_ADDRESS_REQ_MSG, *PQMIWMS_SET_SMSC_ADDRESS_REQ_MSG;\n\ntypedef struct _QMIWMS_SET_SMSC_ADDRESS_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n} QMIWMS_SET_SMSC_ADDRESS_RESP_MSG, *PQMIWMS_SET_SMSC_ADDRESS_RESP_MSG;\n\ntypedef struct _QMIWMS_SET_EVENT_REPORT_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  ReportNewMessage;\n} QMIWMS_SET_EVENT_REPORT_REQ_MSG, *PQMIWMS_SET_EVENT_REPORT_REQ_MSG;\n\ntypedef struct _QMIWMS_SET_EVENT_REPORT_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n} QMIWMS_SET_EVENT_REPORT_RESP_MSG, *PQMIWMS_SET_EVENT_REPORT_RESP_MSG;\n\ntypedef struct _QMIWMS_EVENT_REPORT_IND_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  StorageType;\n   ULONG  StorageIndex;\n} QMIWMS_EVENT_REPORT_IND_MSG, *PQMIWMS_EVENT_REPORT_IND_MSG;\n#endif\n\n// ======================= End of WMS ==============================\n\n\n// ======================= NAS ==============================\n#define QMINAS_SET_EVENT_REPORT_REQ             0x0002\n#define QMINAS_SET_EVENT_REPORT_RESP            0x0002\n#define QMINAS_EVENT_REPORT_IND                 0x0002\n#define QMINAS_GET_SIGNAL_STRENGTH_REQ          0x0020\n#define QMINAS_GET_SIGNAL_STRENGTH_RESP         0x0020\n#define QMINAS_PERFORM_NETWORK_SCAN_REQ         0x0021\n#define QMINAS_PERFORM_NETWORK_SCAN_RESP        0x0021\n#define QMINAS_INITIATE_NW_REGISTER_REQ         0x0022\n#define QMINAS_INITIATE_NW_REGISTER_RESP        0x0022\n#define QMINAS_INITIATE_ATTACH_REQ              0x0023\n#define QMINAS_INITIATE_ATTACH_RESP             0x0023\n#define QMINAS_GET_SERVING_SYSTEM_REQ           0x0024\n#define QMINAS_GET_SERVING_SYSTEM_RESP          0x0024\n#define QMINAS_SERVING_SYSTEM_IND               0x0024\n#define QMINAS_GET_HOME_NETWORK_REQ             0x0025\n#define QMINAS_GET_HOME_NETWORK_RESP            0x0025\n#define QMINAS_GET_PREFERRED_NETWORK_REQ        0x0026\n#define QMINAS_GET_PREFERRED_NETWORK_RESP       0x0026\n#define QMINAS_SET_PREFERRED_NETWORK_REQ        0x0027\n#define QMINAS_SET_PREFERRED_NETWORK_RESP       0x0027\n#define QMINAS_GET_FORBIDDEN_NETWORK_REQ        0x0028\n#define QMINAS_GET_FORBIDDEN_NETWORK_RESP       0x0028\n#define QMINAS_SET_FORBIDDEN_NETWORK_REQ        0x0029\n#define QMINAS_SET_FORBIDDEN_NETWORK_RESP       0x0029\n#define QMINAS_SET_TECHNOLOGY_PREF_REQ          0x002A\n#define QMINAS_SET_TECHNOLOGY_PREF_RESP         0x002A\n#define QMINAS_GET_RF_BAND_INFO_REQ             0x0031\n#define QMINAS_GET_RF_BAND_INFO_RESP            0x0031\n#define QMINAS_GET_CELL_LOCATION_INFO_REQ  0x0043\n#define QMINAS_GET_CELL_LOCATION_INFO_RESP 0x0043\n#define QMINAS_GET_PLMN_NAME_REQ                0x0044\n#define QMINAS_GET_PLMN_NAME_RESP               0x0044\n#define QUECTEL_PACKET_TRANSFER_START_IND 0X100\n#define QUECTEL_PACKET_TRANSFER_END_IND 0X101\n#define QMINAS_GET_SYS_INFO_REQ                 0x004D\n#define QMINAS_GET_SYS_INFO_RESP                0x004D\n#define QMINAS_SYS_INFO_IND                     0x004E\n#define QMINAS_GET_SIG_INFO_REQ                 0x004F\n#define QMINAS_GET_SIG_INFO_RESP                0x004F\n\ntypedef struct _QMINAS_GET_HOME_NETWORK_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n} __attribute__ ((packed)) QMINAS_GET_HOME_NETWORK_REQ_MSG, *PQMINAS_GET_HOME_NETWORK_REQ_MSG;\n\ntypedef struct _HOME_NETWORK_SYSTEMID\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT SystemID;\n   USHORT NetworkID;\n} __attribute__ ((packed)) HOME_NETWORK_SYSTEMID, *PHOME_NETWORK_SYSTEMID;\n\ntypedef struct _HOME_NETWORK\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT MobileCountryCode;\n   USHORT MobileNetworkCode;\n   UCHAR  NetworkDesclen;\n   UCHAR  NetworkDesc;\n} __attribute__ ((packed)) HOME_NETWORK, *PHOME_NETWORK;\n\n#if 0\ntypedef struct _HOME_NETWORK_EXT\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT MobileCountryCode;\n   USHORT MobileNetworkCode;\n   UCHAR  NetworkDescDisp;\n   UCHAR  NetworkDescEncoding;\n   UCHAR  NetworkDesclen;\n   UCHAR  NetworkDesc;\n} HOME_NETWORK_EXT, *PHOME_NETWORK_EXT;\n\ntypedef struct _QMINAS_GET_HOME_NETWORK_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n} QMINAS_GET_HOME_NETWORK_RESP_MSG, *PQMINAS_GET_HOME_NETWORK_RESP_MSG;\n\ntypedef struct _QMINAS_GET_PREFERRED_NETWORK_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n} QMINAS_GET_PREFERRED_NETWORK_REQ_MSG, *PQMINAS_GET_PREFERRED_NETWORK_REQ_MSG;\n\n\ntypedef struct _PREFERRED_NETWORK\n{\n   USHORT MobileCountryCode;\n   USHORT MobileNetworkCode;\n   USHORT RadioAccess;\n} PREFERRED_NETWORK, *PPREFERRED_NETWORK;\n\ntypedef struct _QMINAS_GET_PREFERRED_NETWORK_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n   UCHAR  TLV2Type;         // 0x01 - required parameter\n   USHORT TLV2Length;       // length of the mfr string\n   USHORT NumPreferredNetwork;\n} QMINAS_GET_PREFERRED_NETWORK_RESP_MSG, *PQMINAS_GET_PREFERRED_NETWORK_RESP_MSG;\n\ntypedef struct _QMINAS_GET_FORBIDDEN_NETWORK_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n} QMINAS_GET_FORBIDDEN_NETWORK_REQ_MSG, *PQMINAS_GET_FORBIDDEN_NETWORK_REQ_MSG;\n\ntypedef struct _FORBIDDEN_NETWORK\n{\n   USHORT MobileCountryCode;\n   USHORT MobileNetworkCode;\n} FORBIDDEN_NETWORK, *PFORBIDDEN_NETWORK;\n\ntypedef struct _QMINAS_GET_FORBIDDEN_NETWORK_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n   UCHAR  TLV2Type;         // 0x01 - required parameter\n   USHORT TLV2Length;       // length of the mfr string\n   USHORT NumForbiddenNetwork;\n} QMINAS_GET_FORBIDDEN_NETWORK_RESP_MSG, *PQMINAS_GET_FORBIDDEN_NETWORK_RESP_MSG;\n\ntypedef struct _QMINAS_GET_SERVING_SYSTEM_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n} QMINAS_GET_SERVING_SYSTEM_REQ_MSG, *PQMINAS_GET_SERVING_SYSTEM_REQ_MSG;\n\ntypedef struct _QMINAS_ROAMING_INDICATOR_MSG\n{\n   UCHAR  TLVType;         // 0x01 - required parameter\n   USHORT TLVLength;       // length of the mfr string\n   UCHAR  RoamingIndicator;\n} QMINAS_ROAMING_INDICATOR_MSG, *PQMINAS_ROAMING_INDICATOR_MSG;\n#endif\n\ntypedef struct _QMINAS_DATA_CAP\n{\n   UCHAR  TLVType;         // 0x01 - required parameter\n   USHORT TLVLength;       // length of the mfr string\n   UCHAR  DataCapListLen;\n   UCHAR  DataCap;\n} __attribute__ ((packed)) QMINAS_DATA_CAP, *PQMINAS_DATA_CAP;\n\ntypedef struct _QMINAS_CURRENT_PLMN_MSG\n{\n   UCHAR  TLVType;         // 0x01 - required parameter\n   USHORT TLVLength;       // length of the mfr string\n   USHORT MobileCountryCode;\n   USHORT MobileNetworkCode;\n   UCHAR  NetworkDesclen;\n   UCHAR  NetworkDesc;\n} __attribute__ ((packed)) QMINAS_CURRENT_PLMN_MSG, *PQMINAS_CURRENT_PLMN_MSG;\n\ntypedef struct _QMINAS_GET_SERVING_SYSTEM_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n} __attribute__ ((packed)) QMINAS_GET_SERVING_SYSTEM_RESP_MSG, *PQMINAS_GET_SERVING_SYSTEM_RESP_MSG;\n\ntypedef struct _SERVING_SYSTEM\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  RegistrationState;\n   UCHAR  CSAttachedState;\n   UCHAR  PSAttachedState;\n   UCHAR  RegistredNetwork;\n   UCHAR  InUseRadioIF;\n   UCHAR  RadioIF;\n} __attribute__ ((packed)) SERVING_SYSTEM, *PSERVING_SYSTEM;\n\ntypedef struct _QMINAS_GET_SYS_INFO_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n} __attribute__ ((packed)) QMINAS_GET_SYS_INFO_RESP_MSG, *PQMINAS_GET_SYS_INFO_RESP_MSG;\n\ntypedef struct _QMINAS_SYS_INFO_IND_MSG\n{\n   USHORT Type;\n   USHORT Length;\n} __attribute__ ((packed)) QMINAS_SYS_INFO_IND_MSG, *PQMINAS_SYS_INFO_IND_MSG;\n\ntypedef struct _SERVICE_STATUS_INFO\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  SrvStatus;\n   UCHAR  true_srv_status;\n   UCHAR  IsPrefDataPath;\n} __attribute__ ((packed)) SERVICE_STATUS_INFO, *PSERVICE_STATUS_INFO;\n\ntypedef struct _CDMA_SYSTEM_INFO\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  SrvDomainValid;\n   UCHAR  SrvDomain;\n   UCHAR  SrvCapabilityValid;\n   UCHAR  SrvCapability;\n   UCHAR  RoamStatusValid;\n   UCHAR  RoamStatus;\n   UCHAR  IsSysForbiddenValid;\n   UCHAR  IsSysForbidden;\n   UCHAR  IsSysPrlMatchValid;\n   UCHAR  IsSysPrlMatch;\n   UCHAR  PRevInUseValid;\n   UCHAR  PRevInUse;\n   UCHAR  BSPRevValid;\n   UCHAR  BSPRev;\n   UCHAR  CCSSupportedValid;\n   UCHAR  CCSSupported;\n   UCHAR  CDMASysIdValid;\n   USHORT SID;\n   USHORT NID;\n   UCHAR  BSInfoValid;\n   USHORT BaseID;\n   ULONG  BaseLAT;\n   ULONG  BaseLONG;\n   UCHAR  PacketZoneValid;\n   USHORT PacketZone;\n   UCHAR  NetworkIdValid;\n   UCHAR  MCC[3];\n   UCHAR  MNC[3];\n} __attribute__ ((packed)) CDMA_SYSTEM_INFO, *PCDMA_SYSTEM_INFO;\n\ntypedef struct _HDR_SYSTEM_INFO\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  SrvDomainValid;\n   UCHAR  SrvDomain;\n   UCHAR  SrvCapabilityValid;\n   UCHAR  SrvCapability;\n   UCHAR  RoamStatusValid;\n   UCHAR  RoamStatus;\n   UCHAR  IsSysForbiddenValid;\n   UCHAR  IsSysForbidden;\n   UCHAR  IsSysPrlMatchValid;\n   UCHAR  IsSysPrlMatch;\n   UCHAR  HdrPersonalityValid;\n   UCHAR  HdrPersonality;\n   UCHAR  HdrActiveProtValid;\n   UCHAR  HdrActiveProt;\n   UCHAR  is856SysIdValid;\n   UCHAR  is856SysId[16];\n} __attribute__ ((packed)) HDR_SYSTEM_INFO, *PHDR_SYSTEM_INFO;\n\ntypedef struct _GSM_SYSTEM_INFO\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  SrvDomainValid;\n   UCHAR  SrvDomain;\n   UCHAR  SrvCapabilityValid;\n   UCHAR  SrvCapability;\n   UCHAR  RoamStatusValid;\n   UCHAR  RoamStatus;\n   UCHAR  IsSysForbiddenValid;\n   UCHAR  IsSysForbidden;\n   UCHAR  LacValid;\n   USHORT Lac;\n   UCHAR  CellIdValid;\n   ULONG  CellId;\n   UCHAR  RegRejectInfoValid;\n   UCHAR  RejectSrvDomain;\n   UCHAR  RejCause;\n   UCHAR  NetworkIdValid;\n   UCHAR  MCC[3];\n   UCHAR  MNC[3];\n   UCHAR  EgprsSuppValid;\n   UCHAR  EgprsSupp;\n   UCHAR  DtmSuppValid;\n   UCHAR  DtmSupp;\n} __attribute__ ((packed)) GSM_SYSTEM_INFO, *PGSM_SYSTEM_INFO;\n\ntypedef struct _WCDMA_SYSTEM_INFO\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  SrvDomainValid;\n   UCHAR  SrvDomain;\n   UCHAR  SrvCapabilityValid;\n   UCHAR  SrvCapability;\n   UCHAR  RoamStatusValid;\n   UCHAR  RoamStatus;\n   UCHAR  IsSysForbiddenValid;\n   UCHAR  IsSysForbidden;\n   UCHAR  LacValid;\n   USHORT Lac;\n   UCHAR  CellIdValid;\n   ULONG  CellId;\n   UCHAR  RegRejectInfoValid;\n   UCHAR  RejectSrvDomain;\n   UCHAR  RejCause;\n   UCHAR  NetworkIdValid;\n   UCHAR  MCC[3];\n   UCHAR  MNC[3];\n   UCHAR  HsCallStatusValid;\n   UCHAR  HsCallStatus;\n   UCHAR  HsIndValid;\n   UCHAR  HsInd;\n   UCHAR  PscValid;\n   UCHAR  Psc;\n} __attribute__ ((packed)) WCDMA_SYSTEM_INFO, *PWCDMA_SYSTEM_INFO;\n\ntypedef struct _LTE_SYSTEM_INFO\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  SrvDomainValid;\n   UCHAR  SrvDomain;\n   UCHAR  SrvCapabilityValid;\n   UCHAR  SrvCapability;\n   UCHAR  RoamStatusValid;\n   UCHAR  RoamStatus;\n   UCHAR  IsSysForbiddenValid;\n   UCHAR  IsSysForbidden;\n   UCHAR  LacValid;\n   USHORT Lac;\n   UCHAR  CellIdValid;\n   ULONG  CellId;\n   UCHAR  RegRejectInfoValid;\n   UCHAR  RejectSrvDomain;\n   UCHAR  RejCause;\n   UCHAR  NetworkIdValid;\n   UCHAR  MCC[3];\n   UCHAR  MNC[3];\n   UCHAR  TacValid;\n   USHORT Tac;\n} __attribute__ ((packed)) LTE_SYSTEM_INFO, *PLTE_SYSTEM_INFO;\n\ntypedef struct _TDSCDMA_SYSTEM_INFO\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  SrvDomainValid;\n   UCHAR  SrvDomain;\n   UCHAR  SrvCapabilityValid;\n   UCHAR  SrvCapability;\n   UCHAR  RoamStatusValid;\n   UCHAR  RoamStatus;\n   UCHAR  IsSysForbiddenValid;\n   UCHAR  IsSysForbidden;\n   UCHAR  LacValid;\n   USHORT Lac;\n   UCHAR  CellIdValid;\n   ULONG  CellId;\n   UCHAR  RegRejectInfoValid;\n   UCHAR  RejectSrvDomain;\n   UCHAR  RejCause;\n   UCHAR  NetworkIdValid;\n   UCHAR  MCC[3];\n   UCHAR  MNC[3];\n   UCHAR  HsCallStatusValid;\n   UCHAR  HsCallStatus;\n   UCHAR  HsIndValid;\n   UCHAR  HsInd;\n   UCHAR  CellParameterIdValid;\n   USHORT CellParameterId;\n   UCHAR  CellBroadcastCapValid;\n   ULONG  CellBroadcastCap;\n   UCHAR  CsBarStatusValid;\n   ULONG  CsBarStatus;\n   UCHAR  PsBarStatusValid;\n   ULONG  PsBarStatus;\n   UCHAR  CipherDomainValid;\n   UCHAR  CipherDomain;\n} __attribute__ ((packed)) TDSCDMA_SYSTEM_INFO, *PTDSCDMA_SYSTEM_INFO;\n\ntypedef enum {\n  NAS_SYS_SRV_STATUS_NO_SRV_V01 = 0, \n  NAS_SYS_SRV_STATUS_LIMITED_V01 = 1, \n  NAS_SYS_SRV_STATUS_SRV_V01 = 2, \n  NAS_SYS_SRV_STATUS_LIMITED_REGIONAL_V01 = 3, \n  NAS_SYS_SRV_STATUS_PWR_SAVE_V01 = 4, \n}nas_service_status_enum_type_v01;\n\ntypedef enum {\n  SYS_SRV_DOMAIN_NO_SRV_V01 = 0, \n  SYS_SRV_DOMAIN_CS_ONLY_V01 = 1, \n  SYS_SRV_DOMAIN_PS_ONLY_V01 = 2, \n  SYS_SRV_DOMAIN_CS_PS_V01 = 3, \n  SYS_SRV_DOMAIN_CAMPED_V01 = 4, \n}nas_service_domain_enum_type_v01;\n\ntypedef enum {\n    QMI_NAS_RADIO_INTERFACE_UNKNOWN     = -1,\n    QMI_NAS_RADIO_INTERFACE_NONE        = 0x00,\n    QMI_NAS_RADIO_INTERFACE_CDMA_1X     = 0x01,\n    QMI_NAS_RADIO_INTERFACE_CDMA_1XEVDO = 0x02,\n    QMI_NAS_RADIO_INTERFACE_AMPS        = 0x03,\n    QMI_NAS_RADIO_INTERFACE_GSM         = 0x04,\n    QMI_NAS_RADIO_INTERFACE_UMTS        = 0x05,\n    QMI_NAS_RADIO_INTERFACE_LTE         = 0x08,\n    QMI_NAS_RADIO_INTERFACE_TD_SCDMA    = 0x09,\n    QMI_NAS_RADIO_INTERFACE_5GNR        = 0x0C,\n} QMI_NAS_RADIO_INTERFACE_E;\n\ntypedef enum {\n    QMI_NAS_ACTIVE_BAND_BC_0 = 0,\n    QMI_NAS_ACTIVE_BAND_BC_1 = 1,\n    QMI_NAS_ACTIVE_BAND_BC_2 = 2,\n    QMI_NAS_ACTIVE_BAND_BC_3 = 3,\n    QMI_NAS_ACTIVE_BAND_BC_4 = 4,\n    QMI_NAS_ACTIVE_BAND_BC_5 = 5,\n    QMI_NAS_ACTIVE_BAND_BC_6 = 6,\n    QMI_NAS_ACTIVE_BAND_BC_7 = 7,\n    QMI_NAS_ACTIVE_BAND_BC_8 = 8,\n    QMI_NAS_ACTIVE_BAND_BC_9 = 9,\n    QMI_NAS_ACTIVE_BAND_BC_10 = 10,\n    QMI_NAS_ACTIVE_BAND_BC_11 = 11,\n    QMI_NAS_ACTIVE_BAND_BC_12 = 12,\n    QMI_NAS_ACTIVE_BAND_BC_13 = 13,\n    QMI_NAS_ACTIVE_BAND_BC_14 = 14,\n    QMI_NAS_ACTIVE_BAND_BC_15 = 15,\n    QMI_NAS_ACTIVE_BAND_BC_16 = 16,\n    QMI_NAS_ACTIVE_BAND_BC_17 = 17,\n    QMI_NAS_ACTIVE_BAND_BC_18 = 18,\n    QMI_NAS_ACTIVE_BAND_BC_19 = 19,\n    QMI_NAS_ACTIVE_BAND_GSM_450 = 40,\n    QMI_NAS_ACTIVE_BAND_GSM_480 = 41,\n    QMI_NAS_ACTIVE_BAND_GSM_750 = 42,\n    QMI_NAS_ACTIVE_BAND_GSM_850 = 43,\n    QMI_NAS_ACTIVE_BAND_GSM_900_EXTENDED = 44,\n    QMI_NAS_ACTIVE_BAND_GSM_900_PRIMARY = 45,\n    QMI_NAS_ACTIVE_BAND_GSM_900_RAILWAYS = 46,\n    QMI_NAS_ACTIVE_BAND_GSM_DCS_1800 = 47,\n    QMI_NAS_ACTIVE_BAND_GSM_PCS_1900 = 48,\n    QMI_NAS_ACTIVE_BAND_WCDMA_2100 = 80,\n    QMI_NAS_ACTIVE_BAND_WCDMA_PCS_1900 = 81,\n    QMI_NAS_ACTIVE_BAND_WCDMA_DCS_1800 = 82,\n    QMI_NAS_ACTIVE_BAND_WCDMA_1700_US = 83,\n    QMI_NAS_ACTIVE_BAND_WCDMA_850 = 84,\n    QMI_NAS_ACTIVE_BAND_WCDMA_800 = 85,\n    QMI_NAS_ACTIVE_BAND_WCDMA_2600 = 86,\n    QMI_NAS_ACTIVE_BAND_WCDMA_900 = 87,\n    QMI_NAS_ACTIVE_BAND_WCDMA_1700_JAPAN = 88,\n    QMI_NAS_ACTIVE_BAND_WCDMA_1500_JAPAN = 90,\n    QMI_NAS_ACTIVE_BAND_WCDMA_850_JAPAN = 91,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_1 = 120,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_2 = 121,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_3 = 122,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_4 = 123,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_5 = 124,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_6 = 125,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_7 = 126,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_8 = 127,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_9 = 128,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_10 = 129,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_11 = 130,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_12 = 131,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_13 = 132,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_14 = 133,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_17 = 134,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_18 = 143,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_19 = 144,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_20 = 145,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_21 = 146,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_23 = 152,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_24 = 147,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_25 = 148,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_26 = 153,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_27 = 164,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_28 = 158,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_29 = 159,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_30 = 160,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_31 = 165,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_32 = 154,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_33 = 135,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_34 = 136,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_35 = 137,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_36 = 138,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_37 = 139,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_38 = 140,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_39 = 141,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_40 = 142,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_41 = 149,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_42 = 150,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_43 = 151,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_46 = 163,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_47 = 166,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_48 = 167,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_66 = 161,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_71 = 168,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_125 = 155,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_126 = 156,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_127 = 157,\n    QMI_NAS_ACTIVE_BAND_EUTRAN_250 = 162,\n    QMI_NAS_ACTIVE_BAND_TDSCDMA_A = 200,\n    QMI_NAS_ACTIVE_BAND_TDSCDMA_B = 201,\n    QMI_NAS_ACTIVE_BAND_TDSCDMA_C = 202,\n    QMI_NAS_ACTIVE_BAND_TDSCDMA_D = 203,\n    QMI_NAS_ACTIVE_BAND_TDSCDMA_E = 204,\n    QMI_NAS_ACTIVE_BAND_TDSCDMA_F = 205,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_1  = 250,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_2  = 251,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_3  = 252,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_5  = 253,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_7  = 254,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_8  = 255,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_20 = 256,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_28 = 257,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_38 = 258,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_41 = 259,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_50 = 260,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_51 = 261,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_66 = 262,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_70 = 263,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_71 = 264,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_74 = 265,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_75 = 266,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_76 = 267,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_77 = 268,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_78 = 269,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_79 = 270,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_80 = 271,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_81 = 272,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_82 = 273,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_83 = 274,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_84 = 275,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_85 = 276,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_257= 277,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_258= 278,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_259= 279,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_260= 280,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_261= 281,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_12 = 282,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_25 = 283,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_34 = 284,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_39 = 285,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_40 = 286,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_65 = 287,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_86 = 288,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_48 = 289,\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_14 = 290\n} QMI_NAS_ACTIVE_BAND_E;\n\ntypedef struct {\n  UCHAR  TLVType;\n  USHORT TLVLength;\n\n  uint8_t srv_domain_valid;\n  uint8_t srv_domain;\n  uint8_t srv_capability_valid;\n  uint8_t srv_capability;\n  uint8_t roam_status_valid;\n  uint8_t roam_status;\n  uint8_t is_sys_forbidden_valid;\n  uint8_t is_sys_forbidden;\n\n  uint8_t lac_valid;\n  uint16_t lac;\n  uint8_t cell_id_valid;\n  uint32_t cell_id;\n  uint8_t reg_reject_info_valid;\n  uint8_t reject_srv_domain;\n  uint8_t rej_cause;\n  uint8_t network_id_valid;\n  UCHAR MCC[3];\n  UCHAR MNC[3];\n\n  uint8_t tac_valid;\n  uint16_t tac;\n} __attribute__ ((packed)) NR5G_SYSTEM_INFO, *PNR5G_SYSTEM_INFO;\n\n#if 0\ntypedef struct _QMINAS_SERVING_SYSTEM_IND_MSG\n{\n   USHORT Type;\n   USHORT Length;\n} QMINAS_SERVING_SYSTEM_IND_MSG, *PQMINAS_SERVING_SYSTEM_IND_MSG;\n\ntypedef struct _QMINAS_SET_PREFERRED_NETWORK_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT NumPreferredNetwork;\n   USHORT MobileCountryCode;\n   USHORT MobileNetworkCode;\n   USHORT RadioAccess;\n} QMINAS_SET_PREFERRED_NETWORK_REQ_MSG, *PQMINAS_SET_PREFERRED_NETWORK_REQ_MSG;\n\ntypedef struct _QMINAS_SET_PREFERRED_NETWORK_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n} QMINAS_SET_PREFERRED_NETWORK_RESP_MSG, *PQMINAS_SET_PREFERRED_NETWORK_RESP_MSG;\n\ntypedef struct _QMINAS_SET_FORBIDDEN_NETWORK_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT NumForbiddenNetwork;\n   USHORT MobileCountryCode;\n   USHORT MobileNetworkCode;\n} QMINAS_SET_FORBIDDEN_NETWORK_REQ_MSG, *PQMINAS_SET_FORBIDDEN_NETWORK_REQ_MSG;\n\ntypedef struct _QMINAS_SET_FORBIDDEN_NETWORK_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n} QMINAS_SET_FORBIDDEN_NETWORK_RESP_MSG, *PQMINAS_SET_FORBIDDEN_NETWORK_RESP_MSG;\n\ntypedef struct _QMINAS_PERFORM_NETWORK_SCAN_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n} QMINAS_PERFORM_NETWORK_SCAN_REQ_MSG, *PQMINAS_PERFORM_NETWORK_SCAN_REQ_MSG;\n\ntypedef struct _VISIBLE_NETWORK\n{\n   USHORT MobileCountryCode;\n   USHORT MobileNetworkCode;\n   UCHAR  NetworkStatus;\n   UCHAR  NetworkDesclen;\n} VISIBLE_NETWORK, *PVISIBLE_NETWORK;\n\ntypedef struct _QMINAS_PERFORM_NETWORK_SCAN_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n} QMINAS_PERFORM_NETWORK_SCAN_RESP_MSG, *PQMINAS_PERFORM_NETWORK_SCAN_RESP_MSG;\n\ntypedef struct _QMINAS_PERFORM_NETWORK_SCAN_NETWORK_INFO\n{\n   UCHAR  TLVType;         // 0x010 - required parameter\n   USHORT TLVLength;       // length\n   USHORT NumNetworkInstances;\n} QMINAS_PERFORM_NETWORK_SCAN_NETWORK_INFO, *PQMINAS_PERFORM_NETWORK_SCAN_NETWORK_INFO;\n\ntypedef struct _QMINAS_PERFORM_NETWORK_SCAN_RAT_INFO\n{\n   UCHAR  TLVType;         // 0x011 - required parameter\n   USHORT TLVLength;       // length\n   USHORT NumInst;\n} QMINAS_PERFORM_NETWORK_SCAN_RAT_INFO, *PQMINAS_PERFORM_NETWORK_SCAN_RAT_INFO;\n\ntypedef struct _QMINAS_PERFORM_NETWORK_SCAN_RAT\n{\n   USHORT MCC;\n   USHORT MNC;\n   UCHAR  RAT;\n} QMINAS_PERFORM_NETWORK_SCAN_RAT, *PQMINAS_PERFORM_NETWORK_SCAN_RAT;\n\n\ntypedef struct _QMINAS_MANUAL_NW_REGISTER\n{\n   UCHAR  TLV2Type;          // 0x02 - result code\n   USHORT TLV2Length;        // 4\n   USHORT MobileCountryCode;\n   USHORT MobileNetworkCode;\n   UCHAR  RadioAccess;\n} QMINAS_MANUAL_NW_REGISTER, *PQMINAS_MANUAL_NW_REGISTER;\n\ntypedef struct _QMINAS_INITIATE_NW_REGISTER_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   UCHAR  RegisterAction;\n} QMINAS_INITIATE_NW_REGISTER_REQ_MSG, *PQMINAS_INITIATE_NW_REGISTER_REQ_MSG;\n\ntypedef struct _QMINAS_INITIATE_NW_REGISTER_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n} QMINAS_INITIATE_NW_REGISTER_RESP_MSG, *PQMINAS_INITIATE_NW_REGISTER_RESP_MSG;\n\ntypedef struct _QMINAS_SET_TECHNOLOGY_PREF_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT TechPref;\n   UCHAR  Duration;\n} QMINAS_SET_TECHNOLOGY_PREF_REQ_MSG, *PQMINAS_SET_TECHNOLOGY_PREF_REQ_MSG;\n\ntypedef struct _QMINAS_SET_TECHNOLOGY_PREF_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n} QMINAS_SET_TECHNOLOGY_PREF_RESP_MSG, *PQMINAS_SET_TECHNOLOGY_PREF_RESP_MSG;\n\ntypedef struct _QMINAS_GET_SIGNAL_STRENGTH_REQ_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n} QMINAS_GET_SIGNAL_STRENGTH_REQ_MSG, *PQMINAS_GET_SIGNAL_STRENGTH_REQ_MSG;\n\ntypedef struct _QMINAS_SIGNAL_STRENGTH\n{\n   CHAR   SigStrength;\n   UCHAR  RadioIf;\n} QMINAS_SIGNAL_STRENGTH, *PQMINAS_SIGNAL_STRENGTH;\n\ntypedef struct _QMINAS_SIGNAL_STRENGTH_LIST\n{\n   UCHAR  TLV3Type;\n   USHORT TLV3Length;\n   USHORT NumInstance;\n} QMINAS_SIGNAL_STRENGTH_LIST, *PQMINAS_SIGNAL_STRENGTH_LIST;\n\n\ntypedef struct _QMINAS_GET_SIGNAL_STRENGTH_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   CHAR   SignalStrength;\n   UCHAR  RadioIf;\n} QMINAS_GET_SIGNAL_STRENGTH_RESP_MSG, *PQMINAS_GET_SIGNAL_STRENGTH_RESP_MSG;\n\n\ntypedef struct _QMINAS_SET_EVENT_REPORT_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  ReportSigStrength;\n   UCHAR  NumTresholds;\n   CHAR   TresholdList[2];\n} QMINAS_SET_EVENT_REPORT_REQ_MSG, *PQMINAS_SET_EVENT_REPORT_REQ_MSG;\n\ntypedef struct _QMINAS_SET_EVENT_REPORT_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n} QMINAS_SET_EVENT_REPORT_RESP_MSG, *PQMINAS_SET_EVENT_REPORT_RESP_MSG;\n\ntypedef struct _QMINAS_SIGNAL_STRENGTH_TLV\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   CHAR   SigStrength;\n   UCHAR  RadioIf;\n} QMINAS_SIGNAL_STRENGTH_TLV, *PQMINAS_SIGNAL_STRENGTH_TLV;\n\ntypedef struct _QMINAS_REJECT_CAUSE_TLV\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  ServiceDomain;\n   USHORT RejectCause;\n} QMINAS_REJECT_CAUSE_TLV, *PQMINAS_REJECT_CAUSE_TLV;\n\ntypedef struct _QMINAS_EVENT_REPORT_IND_MSG\n{\n   USHORT Type;\n   USHORT Length;\n} QMINAS_EVENT_REPORT_IND_MSG, *PQMINAS_EVENT_REPORT_IND_MSG;\n\ntypedef struct _QMINAS_GET_RF_BAND_INFO_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n} QMINAS_GET_RF_BAND_INFO_REQ_MSG, *PQMINAS_GET_RF_BAND_INFO_REQ_MSG;\n\ntypedef struct _QMINASRF_BAND_INFO\n{\n   UCHAR  RadioIf;\n   USHORT ActiveBand;\n   USHORT ActiveChannel;\n} QMINASRF_BAND_INFO, *PQMINASRF_BAND_INFO;\n\ntypedef struct _QMINAS_GET_RF_BAND_INFO_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   UCHAR  NumInstances;\n} QMINAS_GET_RF_BAND_INFO_RESP_MSG, *PQMINAS_GET_RF_BAND_INFO_RESP_MSG;\n\n\ntypedef struct _QMINAS_GET_PLMN_NAME_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT MCC;\n   USHORT MNC;\n} QMINAS_GET_PLMN_NAME_REQ_MSG, *PQMINAS_GET_PLMN_NAME_REQ_MSG;\n\ntypedef struct _QMINAS_GET_PLMN_NAME_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n} QMINAS_GET_PLMN_NAME_RESP_MSG, *PQMINAS_GET_PLMN_NAME_RESP_MSG;\n\ntypedef struct _QMINAS_GET_PLMN_NAME_SPN\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  SPN_Enc;\n   UCHAR  SPN_Len;\n} QMINAS_GET_PLMN_NAME_SPN, *PQMINAS_GET_PLMN_NAME_SPN;\n\ntypedef struct _QMINAS_GET_PLMN_NAME_PLMN\n{\n   UCHAR  PLMN_Enc;\n   UCHAR  PLMN_Ci;\n   UCHAR  PLMN_SpareBits;\n   UCHAR  PLMN_Len;\n} QMINAS_GET_PLMN_NAME_PLMN, *PQMINAS_GET_PLMN_NAME_PLMN;\n\ntypedef struct _QMINAS_INITIATE_ATTACH_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  PsAttachAction;\n} QMINAS_INITIATE_ATTACH_REQ_MSG, *PQMINAS_INITIATE_ATTACH_REQ_MSG;\n\ntypedef struct _QMINAS_INITIATE_ATTACH_RESP_MSG\n{\n   USHORT Type;             // QMUX type 0x0003\n   USHORT Length;\n   UCHAR  TLVType;          // 0x02 - result code\n   USHORT TLVLength;        // 4\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\n                            // QMI_RESULT_FAILURE\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\n                            // QMI_ERR_NO_MEMORY\n                            // QMI_ERR_INTERNAL\n                            // QMI_ERR_FAULT\n} QMINAS_INITIATE_ATTACH_RESP_MSG, *PQMINAS_INITIATE_ATTACH_RESP_MSG;\n#endif\ntypedef struct {\n    UCHAR  TLVType;\n    USHORT TLVLength;\n    CHAR rssi;\n    SHORT ecio;\n} __attribute__ ((packed)) QMINAS_SIG_INFO_CDMA_TLV_MSG, *PQMINAS_SIG_INFO_CDMA_TLV_MSG;\n\ntypedef struct {\n    UCHAR  TLVType;\n    USHORT TLVLength;\n    CHAR rssi;\n    SHORT ecio;\n    CHAR sinr;\n    INT io;\n} __attribute__ ((packed)) QMINAS_SIG_INFO_HDR_TLV_MSG, *PQMINAS_SIG_INFO_HDR_TLV_MSG;\n\ntypedef struct {\n    UCHAR  TLVType;\n    USHORT TLVLength;\n    CHAR rssi;\n} __attribute__ ((packed)) QMINAS_SIG_INFO_GSM_TLV_MSG, *PQMINAS_SIG_INFO_GSM_TLV_MSG;\n\ntypedef struct {\n    UCHAR  TLVType;\n    USHORT TLVLength;\n    CHAR rssi;\n    SHORT ecio;\n} __attribute__ ((packed)) QMINAS_SIG_INFO_WCDMA_TLV_MSG, *PQMINAS_SIG_INFO_WCDMA_TLV_MSG;\n\ntypedef struct {\n    UCHAR  TLVType;\n    USHORT TLVLength;\n    CHAR rssi;\n    CHAR rsrq;\n    SHORT rsrp;\n    SHORT snr;\n} __attribute__ ((packed)) QMINAS_SIG_INFO_LTE_TLV_MSG, *PQMINAS_SIG_INFO_LTE_TLV_MSG;\n\ntypedef struct {\n    UCHAR  TLVType;\n    USHORT TLVLength;\n    CHAR rscp;\n} __attribute__ ((packed)) QMINAS_SIG_INFO_TDSCDMA_TLV_MSG, *PQMINAS_SIG_INFO_TDSCDMA_TLV_MSG;\n\ntypedef struct {\n    UCHAR  TLVType;\n    USHORT TLVLength;\n    SHORT rsrp;\n    SHORT snr;\n} __attribute__ ((packed)) QMINAS_SIG_INFO_5G_NSA_TLV_MSG, *PQMINAS_SIG_INFO_5G_NSA_TLV_MSG;\n\ntypedef struct {\n    UCHAR  TLVType;\n    USHORT TLVLength;\n    SHORT nr5g_rsrq;\n} __attribute__ ((packed)) QMINAS_SIG_INFO_5G_SA_TLV_MSG, *PQMINAS_SIG_INFO_5G_SA_TLV_MSG;\n\ntypedef struct {\n    uint8 radio_if;\n    uint16 active_band;\n    uint16 active_channel;\n} __attribute__ ((packed)) NasGetRfBandInfo;\n\ntypedef struct {\n    UCHAR  TLVType;\n    USHORT TLVLength;\n\n    uint8 num_instances;\n    NasGetRfBandInfo bands_array[0];\n} __attribute__ ((packed)) NasGetRfBandInfoList;\n\ntypedef struct {\n    uint8 radio_if;\n    uint16 dedicated_band;\n} __attribute__ ((packed)) NasGetRfBandInfoDedicated;\n\ntypedef struct {\n    UCHAR  TLVType;\n    USHORT TLVLength;\n\n    uint8 num_instances;\n    NasGetRfBandInfoDedicated bands_array[0];\n} __attribute__ ((packed)) NasGetRfBandInfoDedicatedList;\n\ntypedef struct {\n    uint8 radio_if;\n    uint16 active_band;\n    uint32 active_channel;\n} __attribute__ ((packed)) NasGetRfBandInfoExtended;\n\ntypedef struct {\n    UCHAR  TLVType;\n    USHORT TLVLength;\n\n    uint8 num_instances;\n    NasGetRfBandInfoExtended bands_array[0];\n} __attribute__ ((packed)) NasGetRfBandInfoExtendedList;\n\ntypedef struct {\n    uint8 radio_if;\n    uint32 bandwidth;\n} __attribute__ ((packed)) NasGetRfBandInfoBandWidth;\n\ntypedef struct {\n    UCHAR  TLVType;\n    USHORT TLVLength;\n\n    uint8 num_instances;\n    NasGetRfBandInfoBandWidth bands_array[0];\n} __attribute__ ((packed)) NasGetRfBandInfoBandWidthList;\n\ntypedef struct {\n    UCHAR  TLVType;\n    USHORT TLVLength;\n\n    uint8 plmn[3];\n    uint8 tac[3];\n    uint64 global_cell_id;\n    uint16 physical_cell_id;\n    int16 rsrq;\n    int16 rsrp;\n    int16 snr;\n} __attribute__ ((packed)) NasGetCellLocationNr5gServingCell;\n\ntypedef struct {\n    uint16 physical_cell_id;\n    int16 rsrq;\n    int16 rsrp;\n    int16 rssi;\n    int16 cell_selection_rx_level;\n} __attribute__ ((packed)) NasGetCellLocationLteInfoCell;\n\ntypedef struct {\n    UCHAR  TLVType;\n    USHORT TLVLength;\n\n    uint8 ue_in_idle;\n    uint8 plmn[3];\n    uint16 tracking_area_code;\n    uint32 global_cell_id;\n    uint16 absolute_rf_channel_number;\n    uint16 serving_cell_id;\n    uint8 cell_reselection_priority;\n    uint8 s_non_intra_search_threshold;\n    uint8 serving_cell_low_threshold;\n    uint8 s_intra_search_threshold;\n    uint8 cells_len;\n    NasGetCellLocationLteInfoCell cells_array[0];\n} __attribute__ ((packed)) NasGetCellLocationLteInfoIntrafrequency;\n\ntypedef struct _QmiMessageNasGetCellLocationInfoOutputInterfrequencyLteInfoFrequencyElement {\n    uint16 eutra_absolute_rf_channel_number;\n    uint8 cell_selection_rx_level_low_threshold;\n    uint8 cell_selection_rx_level_high_threshold;\n    uint8 cell_reselection_priority;\n    uint8 cells_len;\n    NasGetCellLocationLteInfoCell cells_array[0];\n} __attribute__ ((packed)) NasGetCellLocationLteInfoInterfrequencyFrequencyElement;\n\ntypedef struct {\n    UCHAR  TLVType;\n    USHORT TLVLength;\n\n    uint8 ue_in_idle;\n    uint8 freqs_len;\n    NasGetCellLocationLteInfoInterfrequencyFrequencyElement freqs[0];\n} __attribute__ ((packed)) NasGetCellLocationLteInfoInterfrequency;\n\n// ======================= End of NAS ==============================\n\n// ======================= UIM ==============================\n#define QMIUIM_READ_TRANSPARENT_REQ      0x0020\n#define QMIUIM_READ_TRANSPARENT_RESP     0x0020\n#define QMIUIM_READ_TRANSPARENT_IND      0x0020\n#define QMIUIM_READ_RECORD_REQ           0x0021\n#define QMIUIM_READ_RECORD_RESP          0x0021\n#define QMIUIM_READ_RECORD_IND           0x0021\n#define QMIUIM_WRITE_TRANSPARENT_REQ     0x0022\n#define QMIUIM_WRITE_TRANSPARENT_RESP    0x0022\n#define QMIUIM_WRITE_TRANSPARENT_IND     0x0022\n#define QMIUIM_WRITE_RECORD_REQ          0x0023\n#define QMIUIM_WRITE_RECORD_RESP         0x0023\n#define QMIUIM_WRITE_RECORD_IND          0x0023\n#define QMIUIM_SET_PIN_PROTECTION_REQ    0x0025\n#define QMIUIM_SET_PIN_PROTECTION_RESP   0x0025\n#define QMIUIM_SET_PIN_PROTECTION_IND    0x0025\n#define QMIUIM_VERIFY_PIN_REQ            0x0026\n#define QMIUIM_VERIFY_PIN_RESP           0x0026\n#define QMIUIM_VERIFY_PIN_IND            0x0026\n#define QMIUIM_UNBLOCK_PIN_REQ           0x0027\n#define QMIUIM_UNBLOCK_PIN_RESP          0x0027\n#define QMIUIM_UNBLOCK_PIN_IND           0x0027\n#define QMIUIM_CHANGE_PIN_REQ            0x0028\n#define QMIUIM_CHANGE_PIN_RESP           0x0028\n#define QMIUIM_CHANGE_PIN_IND            0x0028\n#define QMIUIM_DEPERSONALIZATION_REQ     0x0029\n#define QMIUIM_DEPERSONALIZATION_RESP    0x0029\n#define QMIUIM_EVENT_REG_REQ             0x002E\n#define QMIUIM_EVENT_REG_RESP            0x002E\n#define QMIUIM_GET_CARD_STATUS_REQ       0x002F\n#define QMIUIM_GET_CARD_STATUS_RESP      0x002F\n#define QMIUIM_STATUS_CHANGE_IND         0x0032\n#define QMIUIM_POWER_DOWN                0x0030\n#define QMIUIM_POWER_UP                  0x0031\n\n\ntypedef struct _QMIUIM_GET_CARD_STATUS_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n} __attribute__ ((packed)) QMIUIM_GET_CARD_STATUS_RESP_MSG, *PQMIUIM_GET_CARD_STATUS_RESP_MSG;\n\n#define UIM_CARD_STATE_ABSENT     0x00\n#define UIM_CARD_STATE_PRESENT    0x01\n#define UIM_CARD_STATE_ERROR      0x02\n\ntypedef struct _QMIUIM_CARD_STATUS\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT IndexGWPri;\n   USHORT Index1XPri;\n   USHORT IndexGWSec;\n   USHORT Index1XSec;\n   UCHAR  NumSlot;\n   UCHAR  CardState;\n   UCHAR  UPINState;\n   UCHAR  UPINRetries;\n   UCHAR  UPUKRetries;\n   UCHAR  ErrorCode;\n   UCHAR  NumApp;\n   UCHAR  AppType;\n   UCHAR  AppState;\n   UCHAR  PersoState;\n   UCHAR  PersoFeature;\n   UCHAR  PersoRetries;\n   UCHAR  PersoUnblockRetries;\n   UCHAR  AIDLength;\n} __attribute__ ((packed)) QMIUIM_CARD_STATUS, *PQMIUIM_CARD_STATUS;\n\ntypedef struct _QMIUIM_PIN_STATE\n{\n   UCHAR  UnivPIN;\n   UCHAR  PIN1State;\n   UCHAR  PIN1Retries;\n   UCHAR  PUK1Retries;\n   UCHAR  PIN2State;\n   UCHAR  PIN2Retries;\n   UCHAR  PUK2Retries;\n} __attribute__ ((packed)) QMIUIM_PIN_STATE, *PQMIUIM_PIN_STATE;\n\ntypedef struct _QMIUIM_VERIFY_PIN_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  Session_Type;\n   UCHAR  Aid_Len;\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   UCHAR  PINID;\n   UCHAR  PINLen;\n   UCHAR  PINValue;\n} __attribute__ ((packed)) QMIUIM_VERIFY_PIN_REQ_MSG, *PQMIUIM_VERIFY_PIN_REQ_MSG;\n\ntypedef struct _QMIUIM_VERIFY_PIN_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   UCHAR  PINVerifyRetriesLeft;\n   UCHAR  PINUnblockRetriesLeft;\n} __attribute__ ((packed)) QMIUIM_VERIFY_PIN_RESP_MSG, *PQMIUIM_VERIFY_PIN_RESP_MSG;\n\ntypedef struct _QMIUIM_READ_TRANSPARENT_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  Session_Type;\n   UCHAR  Aid_Len;\n   UCHAR  TLV2Type;\n   USHORT TLV2Length;\n   USHORT file_id;\n   UCHAR  path_len;\n   UCHAR  path[];\n} __attribute__ ((packed)) QMIUIM_READ_TRANSPARENT_REQ_MSG, *PQMIUIM_READ_TRANSPARENT_REQ_MSG;\n\ntypedef struct _READ_TRANSPARENT_TLV\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT Offset;\n   USHORT Length;\n} __attribute__ ((packed)) READ_TRANSPARENT_TLV, *PREAD_TRANSPARENT_TLV;\n\ntypedef struct _QMIUIM_CONTENT\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT content_len;\n   UCHAR  content[];\n} __attribute__ ((packed)) QMIUIM_CONTENT, *PQMIUIM_CONTENT;\n\ntypedef struct _QMIUIM_READ_TRANSPARENT_RESP_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   USHORT QMUXResult;\n   USHORT QMUXError;\n} __attribute__ ((packed)) QMIUIM_READ_TRANSPARENT_RESP_MSG, *PQMIUIM_READ_TRANSPARENT_RESP_MSG;\n\ntypedef struct _QMIUIM_SET_CARD_SLOT_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR slot;\n} __attribute__ ((packed)) QMIUIM_SET_CARD_SLOT_REQ_MSG, *PQMIUIM_SET_CARD_SLOT_REQ_MSG;\n\n// ======================= COEX ==============================\n#define QMI_COEX_GET_WWAN_STATE_REQ 0x22\n#define QMI_COEX_GET_WWAN_STATE_RESP 0x22\n\n// Add these structure definitions after existing message structures\n\n#ifdef CONFIG_FOXCONN_FCC_AUTH\ntypedef struct _QMIDMS_FOXCONN_SET_FCC_AUTH_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   UCHAR  magic_value;\n} __attribute__ ((packed)) QMIDMS_FOXCONN_SET_FCC_AUTH_REQ_MSG, *PQMIDMS_FOXCONN_SET_FCC_AUTH_REQ_MSG;\n\ntypedef struct _QMIDMS_FOXCONN_SET_FCC_AUTH_V2_REQ_MSG\n{\n   USHORT Type;\n   USHORT Length;\n} __attribute__ ((packed)) QMIDMS_FOXCONN_SET_FCC_AUTH_V2_REQ_MSG, *PQMIDMS_FOXCONN_SET_FCC_AUTH_V2_REQ_MSG;\n#endif\n\ntypedef struct {\n\n  uint32_t freq;\n  /**<   Band center frequency in MHz. */\n\n  uint32_t bandwidth;\n  /**<   Bandwidth in MHz. */\n}coex_band_type_v01;  /* Type */\n\ntypedef struct _QMI_COEX_GET_WWAN_STATE_RESP_MSG_LTE_BAND\n{\n   UCHAR  TLVType;\n   USHORT TLVLength;\n   coex_band_type_v01 ul_band;\n   coex_band_type_v01  dl_band;\n} __attribute__ ((packed)) QMI_COEX_GET_WWAN_STATE_RESP_MSG_LTE_BAND, *PQMI_COEX_GET_WWAN_STATE_RESP_MSG_LTE_BAND;\n\n\ntypedef struct _QMUX_MSG\n{\n   QCQMUX_HDR QMUXHdr;\n   union\n   {\n      // Message Header\n      QCQMUX_MSG_HDR                           QMUXMsgHdr;\n      QCQMUX_MSG_HDR_RESP                      QMUXMsgHdrResp;\n\n      // QMIWDS Message\n#if 0\n      QMIWDS_GET_PKT_SRVC_STATUS_REQ_MSG        PacketServiceStatusReq;\n      QMIWDS_GET_PKT_SRVC_STATUS_RESP_MSG       PacketServiceStatusRsp;\n      QMIWDS_GET_PKT_SRVC_STATUS_IND_MSG        PacketServiceStatusInd;\n      QMIWDS_EVENT_REPORT_IND_MSG               EventReportInd;\n      QMIWDS_GET_CURRENT_CHANNEL_RATE_REQ_MSG   GetCurrChannelRateReq;\n      QMIWDS_GET_CURRENT_CHANNEL_RATE_RESP_MSG  GetCurrChannelRateRsp;\n      QMIWDS_GET_PKT_STATISTICS_REQ_MSG         GetPktStatsReq;\n      QMIWDS_GET_PKT_STATISTICS_RESP_MSG        GetPktStatsRsp;\n      QMIWDS_SET_EVENT_REPORT_REQ_MSG           EventReportReq;\n      QMIWDS_SET_EVENT_REPORT_RESP_MSG          EventReportRsp;\n#endif\n      //#ifdef QC_IP_MODE\n      QMIWDS_GET_RUNTIME_SETTINGS_REQ_MSG       GetRuntimeSettingsReq;\n      QMIWDS_GET_RUNTIME_SETTINGS_RESP_MSG      GetRuntimeSettingsRsp;\n      //#endif // QC_IP_MODE\n      QMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ_MSG  SetClientIpFamilyPrefReq;\n      QMIWDS_SET_CLIENT_IP_FAMILY_PREF_RESP_MSG SetClientIpFamilyPrefResp;\n      QMIWDS_SET_AUTO_CONNECT_REQ_MSG SetAutoConnectReq;\n#if 0\n      QMIWDS_GET_MIP_MODE_REQ_MSG               GetMipModeReq;\n      QMIWDS_GET_MIP_MODE_RESP_MSG              GetMipModeResp;\n#endif\n      QMIWDS_START_NETWORK_INTERFACE_REQ_MSG    StartNwInterfaceReq;\n      QMIWDS_START_NETWORK_INTERFACE_RESP_MSG   StartNwInterfaceResp;\n      QMIWDS_STOP_NETWORK_INTERFACE_REQ_MSG     StopNwInterfaceReq;\n      QMIWDS_STOP_NETWORK_INTERFACE_RESP_MSG    StopNwInterfaceResp;\n      QMIWDS_GET_DEFAULT_SETTINGS_REQ_MSG       GetDefaultSettingsReq;\n      QMIWDS_GET_DEFAULT_SETTINGS_RESP_MSG      GetDefaultSettingsResp;\n      QMIWDS_MODIFY_PROFILE_SETTINGS_REQ_MSG    ModifyProfileSettingsReq;\n      QMIWDS_MODIFY_PROFILE_SETTINGS_RESP_MSG   ModifyProfileSettingsResp;\n      QMIWDS_GET_PROFILE_SETTINGS_REQ_MSG       GetProfileSettingsReq;\n      QMIWDS_CREATE_PROFILE_SETTINGS_REQ_MSG    CreatetProfileSettingsReq;\n      QMIWDS_GET_PROFILE_LIST_REQ_MSG           GetProfileListReq;\n      QMIWDS_GET_PROFILE_LIST_RESP_MSG          GetProfileListResp;\n#if 0\n      QMIWDS_GET_DATA_BEARER_REQ_MSG            GetDataBearerReq;\n      QMIWDS_GET_DATA_BEARER_RESP_MSG           GetDataBearerResp;\n      QMIWDS_DUN_CALL_INFO_REQ_MSG              DunCallInfoReq;\n      QMIWDS_DUN_CALL_INFO_RESP_MSG             DunCallInfoResp;\n#endif\n      QMIWDS_BIND_MUX_DATA_PORT_REQ_MSG         BindMuxDataPortReq;\n\n      // QMIDMS Messages\n#if 0\n      QMIDMS_GET_DEVICE_MFR_REQ_MSG             GetDeviceMfrReq;\n      QMIDMS_GET_DEVICE_MFR_RESP_MSG            GetDeviceMfrRsp;\n      QMIDMS_GET_DEVICE_MODEL_ID_REQ_MSG        GetDeviceModeIdReq;\n      QMIDMS_GET_DEVICE_MODEL_ID_RESP_MSG       GetDeviceModeIdRsp;\n      QMIDMS_GET_DEVICE_REV_ID_REQ_MSG          GetDeviceRevIdReq;\n      QMIDMS_GET_DEVICE_REV_ID_RESP_MSG         GetDeviceRevIdRsp;\n      QMIDMS_GET_MSISDN_REQ_MSG                 GetMsisdnReq;\n      QMIDMS_GET_MSISDN_RESP_MSG                GetMsisdnRsp;\n      QMIDMS_GET_DEVICE_SERIAL_NUMBERS_REQ_MSG  GetDeviceSerialNumReq;\n      QMIDMS_GET_DEVICE_SERIAL_NUMBERS_RESP_MSG GetDeviceSerialNumRsp;\n      QMIDMS_GET_DEVICE_CAP_REQ_MSG             GetDeviceCapReq;\n      QMIDMS_GET_DEVICE_CAP_RESP_MSG            GetDeviceCapResp;\n      QMIDMS_GET_BAND_CAP_REQ_MSG               GetBandCapReq;\n      QMIDMS_GET_BAND_CAP_RESP_MSG              GetBandCapRsp;\n      QMIDMS_GET_ACTIVATED_STATUS_REQ_MSG       GetActivatedStatusReq;\n      QMIDMS_GET_ACTIVATED_STATUS_RESP_MSG      GetActivatedStatusResp;\n      QMIDMS_GET_OPERATING_MODE_REQ_MSG         GetOperatingModeReq;\n      QMIDMS_GET_OPERATING_MODE_RESP_MSG        GetOperatingModeResp;\n#endif\n      QMIDMS_SET_OPERATING_MODE_REQ_MSG         SetOperatingModeReq;\n      QMIDMS_SET_OPERATING_MODE_RESP_MSG        SetOperatingModeResp;\n#if 0\n      QMIDMS_UIM_GET_ICCID_REQ_MSG              GetICCIDReq;\n      QMIDMS_UIM_GET_ICCID_RESP_MSG             GetICCIDResp;\n      QMIDMS_ACTIVATE_AUTOMATIC_REQ_MSG         ActivateAutomaticReq;\n      QMIDMS_ACTIVATE_AUTOMATIC_RESP_MSG        ActivateAutomaticResp;\n      QMIDMS_ACTIVATE_MANUAL_REQ_MSG            ActivateManualReq;\n      QMIDMS_ACTIVATE_MANUAL_RESP_MSG           ActivateManualResp;\n#endif\n      QMIDMS_UIM_GET_PIN_STATUS_REQ_MSG         UIMGetPinStatusReq;\n      QMIDMS_UIM_GET_PIN_STATUS_RESP_MSG        UIMGetPinStatusResp;\n      QMIDMS_UIM_VERIFY_PIN_REQ_MSG             UIMVerifyPinReq;\n      QMIDMS_UIM_VERIFY_PIN_RESP_MSG            UIMVerifyPinResp;\n#if 0\n      QMIDMS_UIM_SET_PIN_PROTECTION_REQ_MSG     UIMSetPinProtectionReq;\n      QMIDMS_UIM_SET_PIN_PROTECTION_RESP_MSG    UIMSetPinProtectionResp;\n      QMIDMS_UIM_CHANGE_PIN_REQ_MSG             UIMChangePinReq;\n      QMIDMS_UIM_CHANGE_PIN_RESP_MSG            UIMChangePinResp;\n      QMIDMS_UIM_UNBLOCK_PIN_REQ_MSG            UIMUnblockPinReq;\n      QMIDMS_UIM_UNBLOCK_PIN_RESP_MSG           UIMUnblockPinResp;\n      QMIDMS_SET_EVENT_REPORT_REQ_MSG           DmsSetEventReportReq;\n      QMIDMS_SET_EVENT_REPORT_RESP_MSG          DmsSetEventReportResp;\n      QMIDMS_EVENT_REPORT_IND_MSG               DmsEventReportInd;\n#endif\n      QMIDMS_UIM_GET_STATE_REQ_MSG              UIMGetStateReq;\n      QMIDMS_UIM_GET_STATE_RESP_MSG             UIMGetStateResp;\n      QMIDMS_UIM_GET_IMSI_REQ_MSG               UIMGetIMSIReq;\n      QMIDMS_UIM_GET_IMSI_RESP_MSG              UIMGetIMSIResp;\n#if 0\n      QMIDMS_UIM_GET_CK_STATUS_REQ_MSG          UIMGetCkStatusReq;\n      QMIDMS_UIM_GET_CK_STATUS_RESP_MSG         UIMGetCkStatusResp;\n      QMIDMS_UIM_SET_CK_PROTECTION_REQ_MSG      UIMSetCkProtectionReq;\n      QMIDMS_UIM_SET_CK_PROTECTION_RESP_MSG     UIMSetCkProtectionResp;\n      QMIDMS_UIM_UNBLOCK_CK_REQ_MSG             UIMUnblockCkReq;\n      QMIDMS_UIM_UNBLOCK_CK_RESP_MSG            UIMUnblockCkResp;\n#endif\n\n      // QMIQOS Messages\n#if 1\n      QMI_QOS_SET_EVENT_REPORT_REQ_MSG          QosSetEventReportReq;\n      QMI_QOS_SET_EVENT_REPORT_RESP_MSG         QosSetEventReportRsp;\n      QMI_QOS_SET_EVENT_REPORT_IND_MSG          QosSetEventReportInd;\n\t  QMI_QOS_BIND_DATA_PORT_REQ_MSG\t\t\tQosBindDataPortReq;\n\t  QMI_QOS_BIND_DATA_PORT_RESP_MSG\t\t\tQosBindDataPortRsp;\n\t  QMI_QOS_INDICATION_REGISTER_REQ_MSG\t\tQosIndRegReq;\n\t  QMI_QOS_INDICATION_REGISTER_RESP_MSG\t\tQosIndRegRsp;\n\t  QMI_QOS_GLOBAL_QOS_FLOW_IND_MSG\t\t\tQosGlobalQosFlowInd;\n\t  QMI_QOS_GET_QOS_INFO_REQ_MSG\t\t\t\tQosGetQosInfoReq;\n\t  QMI_QOS_GET_QOS_INFO_RESP_MSG\t\t\t\tQosGetQosInfoRsp;\n#endif\n\n      // QMIWMS Messages\n#if 0\n      QMIWMS_GET_MESSAGE_PROTOCOL_REQ_MSG       GetMessageProtocolReq;\n      QMIWMS_GET_MESSAGE_PROTOCOL_RESP_MSG      GetMessageProtocolResp;\n      QMIWMS_GET_SMSC_ADDRESS_REQ_MSG           GetSMSCAddressReq;\n      QMIWMS_GET_SMSC_ADDRESS_RESP_MSG          GetSMSCAddressResp;\n      QMIWMS_SET_SMSC_ADDRESS_REQ_MSG           SetSMSCAddressReq;\n      QMIWMS_SET_SMSC_ADDRESS_RESP_MSG          SetSMSCAddressResp;\n      QMIWMS_GET_STORE_MAX_SIZE_REQ_MSG         GetStoreMaxSizeReq;\n      QMIWMS_GET_STORE_MAX_SIZE_RESP_MSG        GetStoreMaxSizeResp;\n      QMIWMS_LIST_MESSAGES_REQ_MSG              ListMessagesReq;\n      QMIWMS_LIST_MESSAGES_RESP_MSG             ListMessagesResp;\n      QMIWMS_RAW_READ_REQ_MSG                   RawReadMessagesReq;\n      QMIWMS_RAW_READ_RESP_MSG                  RawReadMessagesResp;\n      QMIWMS_SET_EVENT_REPORT_REQ_MSG           WmsSetEventReportReq;\n      QMIWMS_SET_EVENT_REPORT_RESP_MSG          WmsSetEventReportResp;\n      QMIWMS_EVENT_REPORT_IND_MSG               WmsEventReportInd;\n      QMIWMS_DELETE_REQ_MSG                     WmsDeleteReq;\n      QMIWMS_DELETE_RESP_MSG                    WmsDeleteResp;\n      QMIWMS_RAW_SEND_REQ_MSG                   RawSendMessagesReq;\n      QMIWMS_RAW_SEND_RESP_MSG                  RawSendMessagesResp;\n      QMIWMS_MODIFY_TAG_REQ_MSG                 WmsModifyTagReq;\n      QMIWMS_MODIFY_TAG_RESP_MSG                WmsModifyTagResp;\n#endif\n\n      // QMINAS Messages\n#if 0\n      QMINAS_GET_HOME_NETWORK_REQ_MSG           GetHomeNetworkReq;\n      QMINAS_GET_HOME_NETWORK_RESP_MSG          GetHomeNetworkResp;\n      QMINAS_GET_PREFERRED_NETWORK_REQ_MSG      GetPreferredNetworkReq;\n      QMINAS_GET_PREFERRED_NETWORK_RESP_MSG     GetPreferredNetworkResp;\n      QMINAS_GET_FORBIDDEN_NETWORK_REQ_MSG      GetForbiddenNetworkReq;\n      QMINAS_GET_FORBIDDEN_NETWORK_RESP_MSG     GetForbiddenNetworkResp;\n      QMINAS_GET_SERVING_SYSTEM_REQ_MSG         GetServingSystemReq;\n#endif\n      QMINAS_GET_SERVING_SYSTEM_RESP_MSG        GetServingSystemResp;\n      QMINAS_GET_SYS_INFO_RESP_MSG              GetSysInfoResp;\n      QMINAS_SYS_INFO_IND_MSG                   NasSysInfoInd;\n#if 0\n      QMINAS_SERVING_SYSTEM_IND_MSG             NasServingSystemInd;\n      QMINAS_SET_PREFERRED_NETWORK_REQ_MSG      SetPreferredNetworkReq;\n      QMINAS_SET_PREFERRED_NETWORK_RESP_MSG     SetPreferredNetworkResp;\n      QMINAS_SET_FORBIDDEN_NETWORK_REQ_MSG      SetForbiddenNetworkReq;\n      QMINAS_SET_FORBIDDEN_NETWORK_RESP_MSG     SetForbiddenNetworkResp;\n      QMINAS_PERFORM_NETWORK_SCAN_REQ_MSG       PerformNetworkScanReq;\n      QMINAS_PERFORM_NETWORK_SCAN_RESP_MSG      PerformNetworkScanResp;\n      QMINAS_INITIATE_NW_REGISTER_REQ_MSG       InitiateNwRegisterReq;\n      QMINAS_INITIATE_NW_REGISTER_RESP_MSG      InitiateNwRegisterResp;\n      QMINAS_SET_TECHNOLOGY_PREF_REQ_MSG        SetTechnologyPrefReq;\n      QMINAS_SET_TECHNOLOGY_PREF_RESP_MSG       SetTechnologyPrefResp;\n      QMINAS_GET_SIGNAL_STRENGTH_REQ_MSG        GetSignalStrengthReq;\n      QMINAS_GET_SIGNAL_STRENGTH_RESP_MSG       GetSignalStrengthResp;\n      QMINAS_SET_EVENT_REPORT_REQ_MSG           SetEventReportReq;\n      QMINAS_SET_EVENT_REPORT_RESP_MSG          SetEventReportResp;\n      QMINAS_EVENT_REPORT_IND_MSG               NasEventReportInd;\n      QMINAS_GET_RF_BAND_INFO_REQ_MSG           GetRFBandInfoReq;\n      QMINAS_GET_RF_BAND_INFO_RESP_MSG          GetRFBandInfoResp;\n      QMINAS_INITIATE_ATTACH_REQ_MSG            InitiateAttachReq;\n      QMINAS_INITIATE_ATTACH_RESP_MSG           InitiateAttachResp;\n      QMINAS_GET_PLMN_NAME_REQ_MSG              GetPLMNNameReq;\n      QMINAS_GET_PLMN_NAME_RESP_MSG             GetPLMNNameResp;\n#endif\n\n      // QMIUIM Messages\n      QMIUIM_GET_CARD_STATUS_RESP_MSG           UIMGetCardStatus;\n      QMIUIM_VERIFY_PIN_REQ_MSG                 UIMUIMVerifyPinReq;\n      QMIUIM_VERIFY_PIN_RESP_MSG                UIMUIMVerifyPinResp;\n#if 0\n      QMIUIM_SET_PIN_PROTECTION_REQ_MSG         UIMUIMSetPinProtectionReq;\n      QMIUIM_SET_PIN_PROTECTION_RESP_MSG        UIMUIMSetPinProtectionResp;\n      QMIUIM_CHANGE_PIN_REQ_MSG                 UIMUIMChangePinReq;\n      QMIUIM_CHANGE_PIN_RESP_MSG                UIMUIMChangePinResp;\n      QMIUIM_UNBLOCK_PIN_REQ_MSG                UIMUIMUnblockPinReq;\n      QMIUIM_UNBLOCK_PIN_RESP_MSG               UIMUIMUnblockPinResp;\n#endif\n      QMIUIM_READ_TRANSPARENT_REQ_MSG           UIMUIMReadTransparentReq;\n      QMIUIM_READ_TRANSPARENT_RESP_MSG          UIMUIMReadTransparentResp;\n      QMIUIM_SET_CARD_SLOT_REQ_MSG                 UIMSetCardSlotReq;\n\n      QMIWDS_ADMIN_SET_DATA_FORMAT_REQ_MSG      SetDataFormatReq;\n      QMI_WDA_SET_LOOPBACK_CONFIG_REQ_MSG       SetLoopBackReq;\n      QMI_WDA_SET_LOOPBACK_CONFIG_IND_MSG       SetLoopBackInd;\t  \n#ifdef CONFIG_FOXCONN_FCC_AUTH\n    QMIDMS_FOXCONN_SET_FCC_AUTH_REQ_MSG FoxconnSetFccAuthReq;\n    QMIDMS_FOXCONN_SET_FCC_AUTH_V2_REQ_MSG FoxconnSetFccAuthV2Req;\n#endif\n   };\n} __attribute__ ((packed)) QMUX_MSG, *PQMUX_MSG;\n\ntypedef struct _QCQMIMSG {\n    QCQMI_HDR QMIHdr;\n    union {\n        QMICTL_MSG CTLMsg;\n        QMUX_MSG MUXMsg;\n    };\n} __attribute__ ((packed)) QCQMIMSG, *PQCQMIMSG;\n\n#pragma pack(pop)\n\n#endif // QCQMUX_H\n\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/QMIThread.c",
    "content": "/******************************************************************************\n  @file    QMIThread.c\n  @brief   QMI WWAN connectivity manager.\n\n  DESCRIPTION\n  Connectivity Management Tool for USB network adapter of Quectel wireless cellular modules.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n#include \"QMIThread.h\"\n#include <inttypes.h>\n\n#ifndef MIN\n#define MIN(a, b)\t((a) < (b)? (a): (b))\n#endif\n\n#define qmi_rsp_check_and_return() do { \\\n        if (err < 0 || pResponse == NULL) { \\\n            dbg_time(\"%s err = %d\", __func__, err); \\\n            return err; \\\n        } \\\n        pMUXMsg = &pResponse->MUXMsg; \\\n        if (le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXResult) || le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError)) { \\\n            USHORT QMUXError = le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError); \\\n            dbg_time(\"%s QMUXResult = 0x%x, QMUXError = 0x%x\", __func__, \\\n                le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXResult), QMUXError); \\\n            free(pResponse); \\\n            return QMUXError; \\\n        } \\\n} while(0)\n\n#define qmi_rsp_check() do { \\\n        if (err < 0 || pResponse == NULL) { \\\n            dbg_time(\"%s err = %d\", __func__, err); \\\n            return err; \\\n        } \\\n        pMUXMsg = &pResponse->MUXMsg; \\\n        if (le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXResult) || le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError)) { \\\n            USHORT QMUXError = le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError); \\\n            dbg_time(\"%s QMUXResult = 0x%x, QMUXError = 0x%x\", __func__, \\\n                le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXResult), QMUXError); \\\n        } \\\n} while(0)\n\nstatic uint32_t WdsConnectionIPv4Handle = 0;\nstatic uint32_t WdsConnectionIPv6Handle = 0;\nstatic int s_is_cdma = 0;\nstatic int s_5g_type = WWAN_DATA_CLASS_NONE;\nstatic int s_hdr_personality = 0; // 0x01-HRPD, 0x02-eHRPD\nstatic char *qstrcpy(char *to, const char *from) { //no __strcpy_chk\n\tchar *save = to;\n\tfor (; (*to = *from) != '\\0'; ++from, ++to);\n\treturn(save);\n}\n\nstatic void uchar2char(char *dst_ptr, size_t dst_len, const UCHAR *src_ptr, size_t src_len) { \n    size_t copy = MIN(dst_len-1, src_len);\n\n    if (copy)\n        memcpy(dst_ptr, src_ptr, copy);\n    dst_ptr[copy] = 0;\n}\n\nstatic int s_9x07 = 1;\n\ntypedef USHORT (*CUSTOMQMUX)(PQMUX_MSG pMUXMsg, void *arg);\n\n// To retrieve the ith (Index) TLV\nPQMI_TLV_HDR GetTLV (PQCQMUX_MSG_HDR pQMUXMsgHdr, int TLVType) {\n    int TLVFind = 0;\n    USHORT Length = le16_to_cpu(pQMUXMsgHdr->Length);\n    PQMI_TLV_HDR pTLVHdr = (PQMI_TLV_HDR)(pQMUXMsgHdr + 1);\n\n    while (Length >= sizeof(QMI_TLV_HDR)) {\n        TLVFind++;\n        if (TLVType > 0x1000) {\n            if ((TLVFind + 0x1000) == TLVType)\n                return pTLVHdr;\n        } else  if (pTLVHdr->TLVType == TLVType) {\n            return pTLVHdr;\n        }\n\n        Length -= (le16_to_cpu((pTLVHdr->TLVLength)) + sizeof(QMI_TLV_HDR));\n        pTLVHdr = (PQMI_TLV_HDR)(((UCHAR *)pTLVHdr) + le16_to_cpu(pTLVHdr->TLVLength) + sizeof(QMI_TLV_HDR));\n    }\n\n   return NULL;\n}\n\nstatic USHORT GetQMUXTransactionId(void) {\n    static int TransactionId = 0;\n    if (++TransactionId > 0xFFFF)\n        TransactionId = 1;\n    return TransactionId;\n}\n\nstatic PQCQMIMSG ComposeQMUXMsg(UCHAR QMIType, USHORT Type, CUSTOMQMUX customQmuxMsgFunction, void *arg) {\n    UCHAR QMIBuf[WDM_DEFAULT_BUFSIZE];\n    PQCQMIMSG pRequest = (PQCQMIMSG)QMIBuf;\n    int Length;\n\n    memset(QMIBuf, 0x00, sizeof(QMIBuf));\n    pRequest->QMIHdr.IFType = USB_CTL_MSG_TYPE_QMI;\n    pRequest->QMIHdr.CtlFlags = 0x00;\n    pRequest->QMIHdr.QMIType = QMIType;\n\n    pRequest->MUXMsg.QMUXHdr.CtlFlags = QMUX_CTL_FLAG_SINGLE_MSG | QMUX_CTL_FLAG_TYPE_CMD;\n    pRequest->MUXMsg.QMUXHdr.TransactionId = cpu_to_le16(GetQMUXTransactionId());\n    pRequest->MUXMsg.QMUXMsgHdr.Type = cpu_to_le16(Type);\n    if (customQmuxMsgFunction)\n        pRequest->MUXMsg.QMUXMsgHdr.Length = cpu_to_le16(customQmuxMsgFunction(&pRequest->MUXMsg, arg) - sizeof(QCQMUX_MSG_HDR));\n    else\n        pRequest->MUXMsg.QMUXMsgHdr.Length = cpu_to_le16(0x0000);\n\n    pRequest->QMIHdr.Length = cpu_to_le16(le16_to_cpu(pRequest->MUXMsg.QMUXMsgHdr.Length) + sizeof(QCQMUX_MSG_HDR) + sizeof(QCQMUX_HDR)\n        + sizeof(QCQMI_HDR) - 1);\n    Length = le16_to_cpu(pRequest->QMIHdr.Length) + 1;\n\n    pRequest = (PQCQMIMSG)malloc(Length);\n    if (pRequest == NULL) {\n        dbg_time(\"%s fail to malloc\", __func__);\n    } else {\n        memcpy(pRequest, QMIBuf, Length);\n    }\n\n    return pRequest;\n}\n\n#if 0\nstatic USHORT NasSetEventReportReq(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->SetEventReportReq.TLVType = 0x10;\n    pMUXMsg->SetEventReportReq.TLVLength = 0x04;\n    pMUXMsg->SetEventReportReq.ReportSigStrength = 0x00;\n    pMUXMsg->SetEventReportReq.NumTresholds = 2;\n    pMUXMsg->SetEventReportReq.TresholdList[0] = -113;\n    pMUXMsg->SetEventReportReq.TresholdList[1] = -50;\n    return sizeof(QMINAS_SET_EVENT_REPORT_REQ_MSG);\n}\n\nstatic USHORT WdsSetEventReportReq(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->EventReportReq.TLVType = 0x10;          // 0x10 -- current channel rate indicator\n    pMUXMsg->EventReportReq.TLVLength = 0x0001;        // 1\n    pMUXMsg->EventReportReq.Mode = 0x00;             // 0-do not report; 1-report when rate changes\n\n    pMUXMsg->EventReportReq.TLV2Type = 0x11;         // 0x11\n    pMUXMsg->EventReportReq.TLV2Length = 0x0005;       // 5\n    pMUXMsg->EventReportReq.StatsPeriod = 0x00;      // seconds between reports; 0-do not report\n    pMUXMsg->EventReportReq.StatsMask = 0x000000ff;        //\n\n    pMUXMsg->EventReportReq.TLV3Type = 0x12;          // 0x12 -- current data bearer indicator\n    pMUXMsg->EventReportReq.TLV3Length = 0x0001;        // 1\n    pMUXMsg->EventReportReq.Mode3 = 0x01;             // 0-do not report; 1-report when changes\n\n    pMUXMsg->EventReportReq.TLV4Type = 0x13;          // 0x13 -- dormancy status indicator\n    pMUXMsg->EventReportReq.TLV4Length = 0x0001;        // 1\n    pMUXMsg->EventReportReq.DormancyStatus = 0x00;    // 0-do not report; 1-report when changes\n    return sizeof(QMIWDS_SET_EVENT_REPORT_REQ_MSG);\n}\n\nstatic USHORT DmsSetEventReportReq(PQMUX_MSG pMUXMsg) {\n    PPIN_STATUS pPinState = (PPIN_STATUS)(&pMUXMsg->DmsSetEventReportReq + 1);\n    PUIM_STATE pUimState = (PUIM_STATE)(pPinState + 1);\n    // Pin State\n    pPinState->TLVType = 0x12;\n    pPinState->TLVLength = 0x01;\n    pPinState->ReportPinState = 0x01;\n    // UIM State\n    pUimState->TLVType = 0x15;\n    pUimState->TLVLength = 0x01;\n    pUimState->UIMState = 0x01;\n    return sizeof(QMIDMS_SET_EVENT_REPORT_REQ_MSG) + sizeof(PIN_STATUS) + sizeof(UIM_STATE);\n}\n#endif\n\nstatic USHORT WdsStartNwInterfaceReq(PQMUX_MSG pMUXMsg, void *arg) {\n    PQMIWDS_TECHNOLOGY_PREFERECE pTechPref;\n    PQMIWDS_AUTH_PREFERENCE pAuthPref;\n    PQMIWDS_USERNAME pUserName;\n    PQMIWDS_PASSWD pPasswd;\n    PQMIWDS_APNNAME pApnName;\n    PQMIWDS_IP_FAMILY_TLV pIpFamily;\n    USHORT TLVLength = 0;\n    UCHAR *pTLV;\n    PROFILE_T *profile = (PROFILE_T *)arg;\n    const char *profile_user = profile->user;\n    const char *profile_password = profile->password;\n    int profile_auth = profile->auth;\n\n    if (s_is_cdma && (profile_user == NULL || profile_user[0] == '\\0') && (profile_password == NULL || profile_password[0] == '\\0')) {\n        profile_user = \"ctnet@mycdma.cn\";\n        profile_password = \"vnet.mobi\";\n        profile_auth = 2; //chap\n    }\n\n    pTLV = (UCHAR *)(&pMUXMsg->StartNwInterfaceReq + 1);\n    pMUXMsg->StartNwInterfaceReq.Length = 0;\n\n    // Set technology Preferece\n    pTechPref = (PQMIWDS_TECHNOLOGY_PREFERECE)(pTLV + TLVLength);\n    pTechPref->TLVType = 0x30;\n    pTechPref->TLVLength = cpu_to_le16(0x01);\n    if (s_is_cdma == 0)\n        pTechPref->TechPreference = 0x01;\n    else\n        pTechPref->TechPreference = 0x02;\n    TLVLength +=(le16_to_cpu(pTechPref->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n\n    // Set APN Name\n    if (profile->apn && !s_is_cdma) { //cdma no apn\n        pApnName = (PQMIWDS_APNNAME)(pTLV + TLVLength);\n        pApnName->TLVType = 0x14;\n        pApnName->TLVLength = cpu_to_le16(strlen(profile->apn));\n        qstrcpy((char *)&pApnName->ApnName, profile->apn);\n        TLVLength +=(le16_to_cpu(pApnName->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n    }\n\n    // Set User Name\n    if (profile_user) {\n        pUserName = (PQMIWDS_USERNAME)(pTLV + TLVLength);\n        pUserName->TLVType = 0x17;\n        pUserName->TLVLength = cpu_to_le16(strlen(profile_user));\n        qstrcpy((char *)&pUserName->UserName, profile_user);\n        TLVLength += (le16_to_cpu(pUserName->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n    }\n\n    // Set Password\n    if (profile_password) {\n        pPasswd = (PQMIWDS_PASSWD)(pTLV + TLVLength);\n        pPasswd->TLVType = 0x18;\n        pPasswd->TLVLength = cpu_to_le16(strlen(profile_password));\n        qstrcpy((char *)&pPasswd->Passwd, profile_password);\n\tTLVLength += (le16_to_cpu(pPasswd->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n    }\n\n    // Set Auth Protocol\n    if (profile_user && profile_password) {\n        pAuthPref = (PQMIWDS_AUTH_PREFERENCE)(pTLV + TLVLength);\n        pAuthPref->TLVType = 0x16;\n        pAuthPref->TLVLength = cpu_to_le16(0x01);\n        pAuthPref->AuthPreference = profile_auth; // 0 ~ None, 1 ~ Pap, 2 ~ Chap, 3 ~ MsChapV2\n        TLVLength += (le16_to_cpu(pAuthPref->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n    }\n\n    // Add IP Family Preference\n    pIpFamily = (PQMIWDS_IP_FAMILY_TLV)(pTLV + TLVLength);\n    pIpFamily->TLVType = 0x19;\n    pIpFamily->TLVLength = cpu_to_le16(0x01);\n    pIpFamily->IpFamily = profile->curIpFamily;\n    TLVLength += (le16_to_cpu(pIpFamily->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n\n    //Set Profile Index\n    if (profile->profile_index && !s_is_cdma) { //cdma only support one pdp, so no need to set profile index\n        PQMIWDS_PROFILE_IDENTIFIER pProfileIndex = (PQMIWDS_PROFILE_IDENTIFIER)(pTLV + TLVLength);\n        pProfileIndex->TLVLength = cpu_to_le16(0x01);\n        pProfileIndex->TLVType = 0x31;\n        pProfileIndex->ProfileIndex = profile->profile_index;\n        if (s_is_cdma && s_hdr_personality == 0x02) {\n            pProfileIndex->TLVType = 0x32; //profile_index_3gpp2\n            pProfileIndex->ProfileIndex = 101;\n        }\n        TLVLength += (le16_to_cpu(pProfileIndex->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n    }\n\n    return sizeof(QMIWDS_START_NETWORK_INTERFACE_REQ_MSG) + TLVLength;\n}\n\nstatic USHORT WdsStopNwInterfaceReq(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->StopNwInterfaceReq.TLVType = 0x01;\n    pMUXMsg->StopNwInterfaceReq.TLVLength = cpu_to_le16(0x04);\n    if (*((int *)arg) == IpFamilyV4)\n        pMUXMsg->StopNwInterfaceReq.Handle =  cpu_to_le32(WdsConnectionIPv4Handle);\n    else\n        pMUXMsg->StopNwInterfaceReq.Handle =  cpu_to_le32(WdsConnectionIPv6Handle);\n    return sizeof(QMIWDS_STOP_NETWORK_INTERFACE_REQ_MSG);\n}\n\nstatic USHORT WdsSetClientIPFamilyPref(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->SetClientIpFamilyPrefReq.TLVType = 0x01;\n    pMUXMsg->SetClientIpFamilyPrefReq.TLVLength = cpu_to_le16(0x01);\n    pMUXMsg->SetClientIpFamilyPrefReq.IpPreference = *((UCHAR *)arg);\n    return sizeof(QMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ_MSG);\n}\n\nstatic USHORT WdsSetAutoConnect(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->SetAutoConnectReq.TLVType = 0x01;\n    pMUXMsg->SetAutoConnectReq.TLVLength = cpu_to_le16(0x01);\n    pMUXMsg->SetAutoConnectReq.autoconnect_setting = *((UCHAR *)arg);\n    return sizeof(QMIWDS_SET_AUTO_CONNECT_REQ_MSG);\n}\n\nenum peripheral_ep_type {\n\tDATA_EP_TYPE_RESERVED\t= 0x0,\n\tDATA_EP_TYPE_HSIC\t= 0x1,\n\tDATA_EP_TYPE_HSUSB\t= 0x2,\n\tDATA_EP_TYPE_PCIE\t= 0x3,\n\tDATA_EP_TYPE_EMBEDDED\t= 0x4,\n\tDATA_EP_TYPE_BAM_DMUX\t= 0x5,\n};\n        \nstatic USHORT WdsSetQMUXBindMuxDataPort(PQMUX_MSG pMUXMsg, void *arg) {\n    QMAP_SETTING *qmap_settings = (QMAP_SETTING *)arg;\n\n    pMUXMsg->BindMuxDataPortReq.TLVType = 0x10;\n    pMUXMsg->BindMuxDataPortReq.TLVLength = cpu_to_le16(0x08);\n    pMUXMsg->BindMuxDataPortReq.ep_type = cpu_to_le32(qmap_settings->ep_type);\n    pMUXMsg->BindMuxDataPortReq.iface_id = cpu_to_le32(qmap_settings->iface_id);\n    pMUXMsg->BindMuxDataPortReq.TLV2Type = 0x11;\n    pMUXMsg->BindMuxDataPortReq.TLV2Length = cpu_to_le16(0x01);\n    pMUXMsg->BindMuxDataPortReq.MuxId = qmap_settings->MuxId;\n    pMUXMsg->BindMuxDataPortReq.TLV3Type = 0x13;\n    pMUXMsg->BindMuxDataPortReq.TLV3Length = cpu_to_le16(0x04);\n    pMUXMsg->BindMuxDataPortReq.client_type = cpu_to_le32(1); //WDS_CLIENT_TYPE_TETHERED\n    \n    return sizeof(QMIWDS_BIND_MUX_DATA_PORT_REQ_MSG);\n}\n\nstatic int qmap_version = 0x05;\nstatic USHORT WdaSetDataFormat(PQMUX_MSG pMUXMsg, void *arg) {\n    QMAP_SETTING *qmap_settings = (QMAP_SETTING *)arg;\n\n    if (qmap_settings->rx_urb_size == 0) {\n        PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV_QOS pWdsAdminQosTlv;\n        PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV linkProto;\n        PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV dlTlp;\n\n        pWdsAdminQosTlv = (PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV_QOS)(&pMUXMsg->QMUXMsgHdr + 1);\n        pWdsAdminQosTlv->TLVType = 0x10;\n        pWdsAdminQosTlv->TLVLength = cpu_to_le16(0x0001);\n        pWdsAdminQosTlv->QOSSetting = 0; /* no-QOS header */\n\n        linkProto = (PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV)(pWdsAdminQosTlv + 1);\n        linkProto->TLVType = 0x11;\n        linkProto->TLVLength = cpu_to_le16(4);\n        linkProto->Value = cpu_to_le32(0x01);     /* Set Ethernet  mode */\n\n        dlTlp = (PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV)(linkProto + 1);;\n        dlTlp->TLVType = 0x13;\n        dlTlp->TLVLength = cpu_to_le16(4);\n        dlTlp->Value = cpu_to_le32(0x00);\n\n        if (sizeof(*linkProto) != 7 )\n            dbg_time(\"%s sizeof(*linkProto) = %zu, is not 7!\", __func__, sizeof(*linkProto) );\n\n        return sizeof(QCQMUX_MSG_HDR) + sizeof(*pWdsAdminQosTlv) + sizeof(*linkProto) + sizeof(*dlTlp);\n    } \n    else {\n    //Indicates whether the Quality of Service(QOS) data format is used by the client.\n        pMUXMsg->SetDataFormatReq.QosDataFormatTlv.TLVType = 0x10;\n        pMUXMsg->SetDataFormatReq.QosDataFormatTlv.TLVLength = cpu_to_le16(0x0001);\n        pMUXMsg->SetDataFormatReq.QosDataFormatTlv.QOSSetting = 0; /* no-QOS header */\n\t\t\n    //Underlying Link Layer Protocol\n        pMUXMsg->SetDataFormatReq.UnderlyingLinkLayerProtocolTlv.TLVType = 0x11; \n        pMUXMsg->SetDataFormatReq.UnderlyingLinkLayerProtocolTlv.TLVLength = cpu_to_le16(4);\n        pMUXMsg->SetDataFormatReq.UnderlyingLinkLayerProtocolTlv.Value = cpu_to_le32(0x02);     /* Set IP  mode */\n\n    //Uplink (UL) data aggregation protocol to be used for uplink data transfer.\n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationProtocolTlv.TLVType = 0x12; \n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationProtocolTlv.TLVLength = cpu_to_le16(4);\n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationProtocolTlv.Value = cpu_to_le32(qmap_version); //UL QMAP is enabled\n        \n    //Downlink (DL) data aggregation protocol to be used for downlink data transfer\n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationProtocolTlv.TLVType = 0x13; \n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationProtocolTlv.TLVLength = cpu_to_le16(4);\n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationProtocolTlv.Value = cpu_to_le32(qmap_version); //DL QMAP is enabled\n        \n    //Maximum number of datagrams in a single aggregated packet on downlink\n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationMaxDatagramsTlv.TLVType = 0x15; \n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationMaxDatagramsTlv.TLVLength = cpu_to_le16(4);\n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationMaxDatagramsTlv.Value = cpu_to_le32(qmap_settings->rx_urb_size/512);\n\t\t\n    //Maximum size in bytes of a single aggregated packet allowed on downlink\n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationMaxSizeTlv.TLVType = 0x16; \n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationMaxSizeTlv.TLVLength = cpu_to_le16(4);\n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationMaxSizeTlv.Value = cpu_to_le32(qmap_settings->rx_urb_size);\n\n    //Peripheral End Point ID\n        pMUXMsg->SetDataFormatReq.epTlv.TLVType = 0x17; \n        pMUXMsg->SetDataFormatReq.epTlv.TLVLength = cpu_to_le16(8);\n        pMUXMsg->SetDataFormatReq.epTlv.ep_type = cpu_to_le32(qmap_settings->ep_type);\n        pMUXMsg->SetDataFormatReq.epTlv.iface_id = cpu_to_le32(qmap_settings->iface_id); \n\n#ifdef QUECTEL_UL_DATA_AGG\n        if (!qmap_settings->ul_data_aggregation_max_datagrams) {\n            return ((size_t)&((QMIWDS_ADMIN_SET_DATA_FORMAT_REQ_MSG *)0)->DlMinimumPassingTlv);\n        }\n        \n     //Maximum number of datagrams in a single aggregated packet on uplink\n        pMUXMsg->SetDataFormatReq.DlMinimumPassingTlv.TLVType = 0x19; \n        pMUXMsg->SetDataFormatReq.DlMinimumPassingTlv.TLVLength = cpu_to_le16(4);\n        pMUXMsg->SetDataFormatReq.DlMinimumPassingTlv.Value = cpu_to_le32(qmap_settings->dl_minimum_padding);\n\t\t\n     //Maximum number of datagrams in a single aggregated packet on uplink\n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationMaxDatagramsTlv.TLVType = 0x1B; \n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationMaxDatagramsTlv.TLVLength = cpu_to_le16(4);\n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationMaxDatagramsTlv.Value = cpu_to_le32(qmap_settings->ul_data_aggregation_max_datagrams);\n\t\t\n    //Maximum size in bytes of a single aggregated packet allowed on downlink\n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationMaxSizeTlv.TLVType = 0x1C; \n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationMaxSizeTlv.TLVLength = cpu_to_le16(4);\n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationMaxSizeTlv.Value = cpu_to_le32(qmap_settings->ul_data_aggregation_max_size);\n#endif\n\n        return sizeof(QMIWDS_ADMIN_SET_DATA_FORMAT_REQ_MSG);\n    }\n}\n\n#ifdef CONFIG_SIM\nstatic USHORT DmsUIMVerifyPinReqSend(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->UIMVerifyPinReq.TLVType = 0x01;\n    pMUXMsg->UIMVerifyPinReq.PINID = 0x01; //Pin1, not Puk\n    pMUXMsg->UIMVerifyPinReq.PINLen = strlen((const char *)arg);\n    qstrcpy((char *)&pMUXMsg->UIMVerifyPinReq.PINValue, ((const char *)arg));\n    pMUXMsg->UIMVerifyPinReq.TLVLength = cpu_to_le16(2 + strlen((const char *)arg));\n    return sizeof(QMIDMS_UIM_VERIFY_PIN_REQ_MSG) + (strlen((const char *)arg) - 1);\n}\n\nstatic USHORT UimVerifyPinReqSend(PQMUX_MSG pMUXMsg, void *arg)\n{\n    pMUXMsg->UIMUIMVerifyPinReq.TLVType = 0x01;\n    pMUXMsg->UIMUIMVerifyPinReq.TLVLength = cpu_to_le16(0x02);\n    pMUXMsg->UIMUIMVerifyPinReq.Session_Type = 0x00;\n    pMUXMsg->UIMUIMVerifyPinReq.Aid_Len = 0x00;\n    pMUXMsg->UIMUIMVerifyPinReq.TLV2Type = 0x02;\n    pMUXMsg->UIMUIMVerifyPinReq.TLV2Length = cpu_to_le16(2 + strlen((const char *)arg));\n    pMUXMsg->UIMUIMVerifyPinReq.PINID = 0x01;  //Pin1, not Puk\n    pMUXMsg->UIMUIMVerifyPinReq.PINLen= strlen((const char *)arg);\n    qstrcpy((char *)&pMUXMsg->UIMUIMVerifyPinReq.PINValue, ((const char *)arg));\n    return sizeof(QMIUIM_VERIFY_PIN_REQ_MSG) + (strlen((const char *)arg) - 1);\n}\n\n#ifdef CONFIG_IMSI_ICCID\nstatic USHORT UimReadTransparentIMSIReqSend(PQMUX_MSG pMUXMsg, void *arg) {\n    PREAD_TRANSPARENT_TLV pReadTransparent;\n\n    pMUXMsg->UIMUIMReadTransparentReq.TLVType =  0x01;\n    pMUXMsg->UIMUIMReadTransparentReq.TLVLength = cpu_to_le16(0x02);\n    if (!strcmp((char *)arg, \"EF_ICCID\")) {\n        pMUXMsg->UIMUIMReadTransparentReq.Session_Type = 0x06;\n        pMUXMsg->UIMUIMReadTransparentReq.Aid_Len = 0x00;\n\n        pMUXMsg->UIMUIMReadTransparentReq.TLV2Type = 0x02;\n        pMUXMsg->UIMUIMReadTransparentReq.file_id = cpu_to_le16(0x2FE2);\n        pMUXMsg->UIMUIMReadTransparentReq.path_len = 0x02;\n        pMUXMsg->UIMUIMReadTransparentReq.path[0] = 0x00;\n        pMUXMsg->UIMUIMReadTransparentReq.path[1] = 0x3F;\n    }\n    else if(!strcmp((char *)arg, \"EF_IMSI\")) {\n        pMUXMsg->UIMUIMReadTransparentReq.Session_Type = 0x00;\n        pMUXMsg->UIMUIMReadTransparentReq.Aid_Len = 0x00;\n\n        pMUXMsg->UIMUIMReadTransparentReq.TLV2Type = 0x02;\n        pMUXMsg->UIMUIMReadTransparentReq.file_id = cpu_to_le16(0x6F07);\n        pMUXMsg->UIMUIMReadTransparentReq.path_len = 0x04;\n        pMUXMsg->UIMUIMReadTransparentReq.path[0] = 0x00;\n        pMUXMsg->UIMUIMReadTransparentReq.path[1] = 0x3F;\n        pMUXMsg->UIMUIMReadTransparentReq.path[2] = 0xFF;\n        pMUXMsg->UIMUIMReadTransparentReq.path[3] = 0x7F;\n    }\n\n    pMUXMsg->UIMUIMReadTransparentReq.TLV2Length = cpu_to_le16(3 +  pMUXMsg->UIMUIMReadTransparentReq.path_len);\n\n    pReadTransparent = (PREAD_TRANSPARENT_TLV)(&pMUXMsg->UIMUIMReadTransparentReq.path[pMUXMsg->UIMUIMReadTransparentReq.path_len]);\n    pReadTransparent->TLVType = 0x03;\n    pReadTransparent->TLVLength = cpu_to_le16(0x04);\n    pReadTransparent->Offset = cpu_to_le16(0x00);\n    pReadTransparent->Length = cpu_to_le16(0x00);\n\n    return (sizeof(QMIUIM_READ_TRANSPARENT_REQ_MSG) + pMUXMsg->UIMUIMReadTransparentReq.path_len + sizeof(READ_TRANSPARENT_TLV));\n}\n#endif\n#endif\n\n#ifdef CONFIG_APN\n\nstatic USHORT WdsGetProfileListReqSend(PQMUX_MSG pMUXMsg, void *arg) {\n    (void)(arg);\n    pMUXMsg->GetProfileListReq.Length = cpu_to_le16(sizeof(QMIWDS_GET_PROFILE_LIST_REQ_MSG) - 4);\n    return sizeof(QMIWDS_GET_PROFILE_LIST_REQ_MSG);\n}\n\nstatic USHORT WdsCreateProfileSettingsReqSend(PQMUX_MSG pMUXMsg, void *arg) {\n    PROFILE_T *profile = (PROFILE_T *)arg;\n    pMUXMsg->CreatetProfileSettingsReq.Length = cpu_to_le16(sizeof(QMIWDS_CREATE_PROFILE_SETTINGS_REQ_MSG) - 4);\n    pMUXMsg->CreatetProfileSettingsReq.TLVType = 0x01;\n    pMUXMsg->CreatetProfileSettingsReq.TLVLength = cpu_to_le16(0x01);\n    pMUXMsg->CreatetProfileSettingsReq.ProfileType = 0x00; // 0 ~ 3GPP, 1 ~ 3GPP2\n    pMUXMsg->CreatetProfileSettingsReq.TLV2Type = 0x25;\n    pMUXMsg->CreatetProfileSettingsReq.TLV2Length = cpu_to_le16(0x01);\n    pMUXMsg->CreatetProfileSettingsReq.pdp_context = profile->pdp; // 0 ~ 3GPP, 1 ~ 3GPP2\n    return sizeof(QMIWDS_CREATE_PROFILE_SETTINGS_REQ_MSG);\n}\n\nstatic USHORT WdsGetProfileSettingsReqSend(PQMUX_MSG pMUXMsg, void *arg) {\n    PROFILE_T *profile = (PROFILE_T *)arg;\n    pMUXMsg->GetProfileSettingsReq.Length = cpu_to_le16(sizeof(QMIWDS_GET_PROFILE_SETTINGS_REQ_MSG) - 4);\n    pMUXMsg->GetProfileSettingsReq.TLVType = 0x01;\n    pMUXMsg->GetProfileSettingsReq.TLVLength = cpu_to_le16(0x02);\n    pMUXMsg->GetProfileSettingsReq.ProfileType = 0x00; // 0 ~ 3GPP, 1 ~ 3GPP2\n    pMUXMsg->GetProfileSettingsReq.ProfileIndex = profile->profile_index;\n    return sizeof(QMIWDS_GET_PROFILE_SETTINGS_REQ_MSG);\n}\n\nstatic USHORT WdsModifyProfileSettingsReq(PQMUX_MSG pMUXMsg, void *arg) {\n    USHORT TLVLength = 0;\n    UCHAR *pTLV;\n    PROFILE_T *profile = (PROFILE_T *)arg;\n    PQMIWDS_PDPTYPE pPdpType;\n\n    pMUXMsg->ModifyProfileSettingsReq.Length = cpu_to_le16(sizeof(QMIWDS_MODIFY_PROFILE_SETTINGS_REQ_MSG) - 4);\n    pMUXMsg->ModifyProfileSettingsReq.TLVType = 0x01;\n    pMUXMsg->ModifyProfileSettingsReq.TLVLength = cpu_to_le16(0x02);\n    pMUXMsg->ModifyProfileSettingsReq.ProfileType = 0x00; // 0 ~ 3GPP, 1 ~ 3GPP2\n    pMUXMsg->ModifyProfileSettingsReq.ProfileIndex = profile->profile_index;\n\n    pTLV = (UCHAR *)(&pMUXMsg->ModifyProfileSettingsReq + 1);\n\n    pPdpType = (PQMIWDS_PDPTYPE)(pTLV + TLVLength);\n    pPdpType->TLVType = 0x11;\n    pPdpType->TLVLength = cpu_to_le16(0x01);\n    pPdpType->PdpType = profile->iptype;\n    TLVLength +=(le16_to_cpu(pPdpType->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n\n    // Set APN Name\n    if (profile->apn) {\n        PQMIWDS_APNNAME pApnName = (PQMIWDS_APNNAME)(pTLV + TLVLength);\n        pApnName->TLVType = 0x14;\n        pApnName->TLVLength = cpu_to_le16(strlen(profile->apn));\n        qstrcpy((char *)&pApnName->ApnName, profile->apn);\n        TLVLength +=(le16_to_cpu(pApnName->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n    }\n\n    // Set User Name\n    if (profile->user) {\n        PQMIWDS_USERNAME pUserName = (PQMIWDS_USERNAME)(pTLV + TLVLength);\n        pUserName->TLVType = 0x1B;\n        pUserName->TLVLength = cpu_to_le16(strlen(profile->user));\n        qstrcpy((char *)&pUserName->UserName, profile->user);\n        TLVLength += (le16_to_cpu(pUserName->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n    }\n\n    // Set Password\n    if (profile->password) {\n        PQMIWDS_PASSWD pPasswd = (PQMIWDS_PASSWD)(pTLV + TLVLength);\n        pPasswd->TLVType = 0x1C;\n        pPasswd->TLVLength = cpu_to_le16(strlen(profile->password));\n        qstrcpy((char *)&pPasswd->Passwd, profile->password);\n        TLVLength +=(le16_to_cpu(pPasswd->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n    }\n\n    // Set Auth Protocol\n    if (profile->user && profile->password) {\n        PQMIWDS_AUTH_PREFERENCE pAuthPref = (PQMIWDS_AUTH_PREFERENCE)(pTLV + TLVLength);\n        pAuthPref->TLVType = 0x1D;\n        pAuthPref->TLVLength = cpu_to_le16(0x01);\n        pAuthPref->AuthPreference = profile->auth; // 0 ~ None, 1 ~ Pap, 2 ~ Chap, 3 ~ MsChapV2\n        TLVLength += (le16_to_cpu(pAuthPref->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n    }\n\n    return sizeof(QMIWDS_MODIFY_PROFILE_SETTINGS_REQ_MSG) + TLVLength;\n}\n#endif\n\nstatic USHORT WdsGetRuntimeSettingReq(PQMUX_MSG pMUXMsg, void *arg)\n{\n    (void)arg;\n    pMUXMsg->GetRuntimeSettingsReq.TLVType = 0x10;\n    pMUXMsg->GetRuntimeSettingsReq.TLVLength = cpu_to_le16(0x04);\n    // the following mask also applies to IPV6\n    pMUXMsg->GetRuntimeSettingsReq.Mask = cpu_to_le32(QMIWDS_GET_RUNTIME_SETTINGS_MASK_IPV4DNS_ADDR |\n                                                      QMIWDS_GET_RUNTIME_SETTINGS_MASK_IPV4_ADDR |\n                                                      QMIWDS_GET_RUNTIME_SETTINGS_MASK_MTU |\n                                                      QMIWDS_GET_RUNTIME_SETTINGS_MASK_IPV4GATEWAY_ADDR) |\n                                          QMIWDS_GET_RUNTIME_SETTINGS_MASK_PCSCF_SV_ADDR |\n                                          QMIWDS_GET_RUNTIME_SETTINGS_MASK_PCSCF_DOM_NAME;\n\n    return sizeof(QMIWDS_GET_RUNTIME_SETTINGS_REQ_MSG);\n}\n\nstatic PQCQMIMSG s_pRequest;\nstatic PQCQMIMSG s_pResponse;\n\nstatic int is_response(const PQCQMIMSG pRequest, const PQCQMIMSG pResponse) {\n    if ((pRequest->QMIHdr.QMIType == pResponse->QMIHdr.QMIType)\n        && (pRequest->QMIHdr.ClientId == pResponse->QMIHdr.ClientId)) {\n            USHORT requestTID, responseTID;\n        if (pRequest->QMIHdr.QMIType == QMUX_TYPE_CTL) {\n            requestTID = pRequest->CTLMsg.QMICTLMsgHdr.TransactionId;\n            responseTID = pResponse->CTLMsg.QMICTLMsgHdr.TransactionId;\n        } else {\n            requestTID = le16_to_cpu(pRequest->MUXMsg.QMUXHdr.TransactionId);\n            responseTID = le16_to_cpu(pResponse->MUXMsg.QMUXHdr.TransactionId);\n        }\n        return (requestTID == responseTID);\n    }\n    return 0;\n}\n\nint (*qmidev_send)(PQCQMIMSG pRequest);\n\nint QmiThreadSendQMITimeout(PQCQMIMSG pRequest, PQCQMIMSG *ppResponse, unsigned msecs, const char *funcname) {\n    int ret;\n    \n    if (!pRequest)\n        return -EINVAL;\n\n    pthread_mutex_lock(&cm_command_mutex);\n\n    if (ppResponse)\n        *ppResponse = NULL;\n\n    dump_qmi(pRequest, le16_to_cpu(pRequest->QMIHdr.Length) + 1);\n\n    s_pRequest = pRequest;\n    s_pResponse = NULL;\n\n    ret = qmidev_send(pRequest);\n\n    if (ret == 0) {\n        ret = pthread_cond_timeout_np(&cm_command_cond, &cm_command_mutex, msecs);\n        if (!ret) {\n            if (s_pResponse && ppResponse) {\n                *ppResponse = s_pResponse;\n            } else {\n                if (s_pResponse) {\n                    free(s_pResponse);\n                    s_pResponse = NULL;\n                }\n            }\n        } else {\n            dbg_time(\"%s message timeout\", funcname);\n        }\n    }\n\n    pthread_mutex_unlock(&cm_command_mutex);\n\n    return ret;\n}\n\nvoid QmiThreadRecvQMI(PQCQMIMSG pResponse) {\n    pthread_mutex_lock(&cm_command_mutex);\n    if (pResponse == NULL) {\n        if (s_pRequest) {\n            free(s_pRequest);\n            s_pRequest = NULL;\n            s_pResponse = NULL;\n            pthread_cond_signal(&cm_command_cond);\n        }\n        pthread_mutex_unlock(&cm_command_mutex);\n        return;\n    }\n    dump_qmi(pResponse, le16_to_cpu(pResponse->QMIHdr.Length) + 1);\n    if (s_pRequest && is_response(s_pRequest, pResponse)) {\n        free(s_pRequest);\n        s_pRequest = NULL;\n        s_pResponse = malloc(le16_to_cpu(pResponse->QMIHdr.Length) + 1);\n        if (s_pResponse != NULL) {\n            memcpy(s_pResponse, pResponse, le16_to_cpu(pResponse->QMIHdr.Length) + 1);\n        }\n        pthread_cond_signal(&cm_command_cond);\n    } else if ((pResponse->QMIHdr.QMIType == QMUX_TYPE_CTL)\n                    && (le16_to_cpu(pResponse->CTLMsg.QMICTLMsgHdrRsp.QMICTLType == QMICTL_REVOKE_CLIENT_ID_IND))) {\n        qmidevice_send_event_to_main(MODEM_REPORT_RESET_EVENT);\n    } else if ((pResponse->QMIHdr.QMIType == QMUX_TYPE_NAS)\n                    && (le16_to_cpu(pResponse->MUXMsg.QMUXMsgHdrResp.Type) == QMINAS_SERVING_SYSTEM_IND)) {\n        qmidevice_send_event_to_main(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED);\n    } else if ((pResponse->QMIHdr.QMIType == QMUX_TYPE_WDS)\n                    && (le16_to_cpu(pResponse->MUXMsg.QMUXMsgHdrResp.Type) == QMIWDS_GET_PKT_SRVC_STATUS_IND)) {\n        qmidevice_send_event_to_main(RIL_UNSOL_DATA_CALL_LIST_CHANGED);\n    } else if ((pResponse->QMIHdr.QMIType == QMUX_TYPE_NAS)\n                    && (le16_to_cpu(pResponse->MUXMsg.QMUXMsgHdrResp.Type) == QMINAS_SYS_INFO_IND)) {\n        qmidevice_send_event_to_main(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED);\n    } else if ((pResponse->QMIHdr.QMIType == QMUX_TYPE_WDS_ADMIN)\n                    && (le16_to_cpu(pResponse->MUXMsg.QMUXMsgHdrResp.Type) == QMI_WDA_SET_LOOPBACK_CONFIG_IND)) {\n    \tqmidevice_send_event_to_main_ext(RIL_UNSOL_LOOPBACK_CONFIG_IND,\n            &pResponse->MUXMsg.SetLoopBackInd, sizeof(pResponse->MUXMsg.SetLoopBackInd));\n    }\n#ifdef CONFIG_REG_QOS_IND\n    else if ((pResponse->QMIHdr.QMIType == QMUX_TYPE_QOS)\n          && (le16_to_cpu(pResponse->MUXMsg.QMUXMsgHdrResp.Type) == QMI_QOS_GLOBAL_QOS_FLOW_IND)) {\n        UINT qos_id = 0;\n        UCHAR new_flow = ql_get_global_qos_flow_ind_qos_id(pResponse, &qos_id);\n        if (qos_id != 0 && new_flow == 1)\n            qmidevice_send_event_to_main_ext(RIL_UNSOL_GLOBAL_QOS_FLOW_IND_QOS_ID, &qos_id, sizeof(qos_id));\n#ifdef CONFIG_GET_QOS_DATA_RATE\n        if (new_flow) {\n            ULONG64 max_data_rate[2] = {0};\n            if (ql_get_global_qos_flow_ind_data_rate(pResponse, (void *)max_data_rate) == 0){}\n        }\n#endif\n    }\n#endif\n    else {\n        if (debug_qmi)\n            dbg_time(\"nobody care this qmi msg!!\");\n    }\n    pthread_mutex_unlock(&cm_command_mutex);\n}\n\n#ifdef CONFIG_COEX_WWAN_STATE\nstatic int requestGetCoexWWANState(void) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    PQMI_COEX_GET_WWAN_STATE_RESP_MSG_LTE_BAND pLteBand;\n    static QMI_COEX_GET_WWAN_STATE_RESP_MSG_LTE_BAND oldLteBand = {-1, -1};\n    int err;\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_COEX, QMI_COEX_GET_WWAN_STATE_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n\n    if (err < 0 || pResponse == NULL) {\n        dbg_time(\"%s err = %d\", __func__, err);\n        return err;\n    }\n\n    pMUXMsg = &pResponse->MUXMsg;\n    if (le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXResult) || le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError)) {\n        dbg_time(\"%s QMUXResult = 0x%x, QMUXError = 0x%x\", __func__, le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXResult), le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError));\n        err = le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError);\n        free(pResponse);\n        return err;\n    } \n    pLteBand = (PQMI_COEX_GET_WWAN_STATE_RESP_MSG_LTE_BAND)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x10);\n\n    if (pLteBand && memcmp(pLteBand, &oldLteBand, sizeof(oldLteBand))) {\n        oldLteBand = *pLteBand;\n        dbg_time(\"%s ul_freq %d ul_bandwidth %d\", __func__, le32_to_cpu(pLteBand->ul_band.freq), le32_to_cpu(pLteBand->ul_band.bandwidth));\n        dbg_time(\"%s dl_freq %d dl_bandwidth %d\", __func__, le32_to_cpu(pLteBand->dl_band.freq), le32_to_cpu(pLteBand->dl_band.bandwidth));\n    }\n    free(pResponse);\n    return 0;\n}\n#endif\n\nstatic int requestSetEthMode(PROFILE_T *profile) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse = NULL;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV linkProto;\n    UCHAR IpPreference;\n    UCHAR autoconnect_setting = 0;\n    QMAP_SETTING qmap_settings = {0};\n\n    qmap_settings.size = sizeof(qmap_settings);\n    \n    if (profile->qmap_mode) {\n        profile->rawIP = 1;\n        s_9x07 = profile->rawIP;\n        \n        qmap_settings.MuxId = profile->muxid;\n\n        if (profile->hardware_interface == HARDWARE_PCIE) { //SDX20_PCIE\n            qmap_settings.rx_urb_size = profile->qmap_size; //SDX24&SDX55 support 32KB \n            qmap_settings.ep_type = DATA_EP_TYPE_PCIE;\n            qmap_settings.iface_id = 0x04;\n        }\n        else { // for MDM9x07&MDM9x40&SDX20 USB\n            qmap_settings.rx_urb_size = profile->qmap_size; //SDX24&SDX55 support 32KB\n            qmap_settings.ep_type = DATA_EP_TYPE_HSUSB;\n            qmap_settings.iface_id = 0x04;\n        }\n\n        qmap_settings.ul_data_aggregation_max_datagrams = 11; //by test result, 11 can get best TPUT\n        qmap_settings.ul_data_aggregation_max_size = 8*1024;\n        qmap_settings.dl_minimum_padding = 0; //no effect when register to real netowrk\n        if(profile->qmap_version != 0x09)\n            profile->qmap_version = 0x05;\n\n        qmap_version = profile->qmap_version;\n        if (profile->rmnet_info.size) {\n            qmap_settings.rx_urb_size = profile->rmnet_info.rx_urb_size;\n            qmap_settings.ep_type = profile->rmnet_info.ep_type;\n            qmap_settings.iface_id = profile->rmnet_info.iface_id;\n            qmap_settings.dl_minimum_padding = profile->rmnet_info.dl_minimum_padding;\n            qmap_version = profile->rmnet_info.qmap_version;\n        }\n\n        if (!profile->wda_client) {\n            if (qmidev_is_gobinet(profile->qmichannel)) {\n                //when QMAP enabled, set data format in GobiNet driver\n            }\n            else if (profile->proxy[0]) {\n                /* the first running 'quectel-cm' had alloc wda client and set data format,\n                   so we can ingore to set data format here. */\n            }\n            goto skip_WdaSetDataFormat;\n        }\n    }\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS_ADMIN, QMIWDS_ADMIN_SET_DATA_FORMAT_REQ, WdaSetDataFormat, (void *)&qmap_settings);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    linkProto = (PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n    if (linkProto != NULL) {\n        profile->rawIP = (le32_to_cpu(linkProto->Value) == 2);\n        s_9x07 = profile->rawIP; //MDM90x7 only support RAW IP, do not support Eth\n    }\n\n    linkProto = (PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x16);\n    if (linkProto != NULL && profile->qmap_mode) {\n        qmap_settings.rx_urb_size = le32_to_cpu(linkProto->Value);\n        dbg_time(\"qmap_settings.rx_urb_size = %u\", qmap_settings.rx_urb_size); //must same as rx_urb_size defined in GobiNet&qmi_wwan driver\n    }\n\n#ifdef QUECTEL_UL_DATA_AGG\n    if (qmap_settings.ul_data_aggregation_max_datagrams)\n    {\n        linkProto = (PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x17);\n        if (linkProto != NULL) {\n            qmap_settings.ul_data_aggregation_max_datagrams = MIN(qmap_settings.ul_data_aggregation_max_datagrams, le32_to_cpu(linkProto->Value));\n            dbg_time(\"qmap_settings.ul_data_aggregation_max_datagrams  = %u\", qmap_settings.ul_data_aggregation_max_datagrams);\n        }\n\n        linkProto = (PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x18);\n        if (linkProto != NULL) {\n            qmap_settings.ul_data_aggregation_max_size = MIN(qmap_settings.ul_data_aggregation_max_size, le32_to_cpu(linkProto->Value));\n            dbg_time(\"qmap_settings.ul_data_aggregation_max_size       = %u\", qmap_settings.ul_data_aggregation_max_size);\n        }\n\n        linkProto = (PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x1A);\n        if (linkProto != NULL) {\n            qmap_settings.dl_minimum_padding = le32_to_cpu(linkProto->Value);\n            dbg_time(\"qmap_settings.dl_minimum_padding                 = %u\", qmap_settings.dl_minimum_padding);\n        }\n\n\tif (qmap_settings.ul_data_aggregation_max_datagrams > 1) {\n\t\tql_set_driver_qmap_setting(profile, &qmap_settings);\n\t}\n    }\n#endif\n\n    free(pResponse);\n\nskip_WdaSetDataFormat:\n    if (profile->enable_ipv4) {\n    \tif (profile->qmapnet_adapter[0]) {\n            // bind wds mux data port\n        \tpRequest = ComposeQMUXMsg(QMUX_TYPE_WDS, QMIWDS_BIND_MUX_DATA_PORT_REQ , WdsSetQMUXBindMuxDataPort, (void *)&qmap_settings);\n        \terr = QmiThreadSendQMI(pRequest, &pResponse);\n        \tqmi_rsp_check_and_return();\n        \tif (pResponse) free(pResponse);\n        }\n\n        // set ipv4\n    \tIpPreference = IpFamilyV4;\n    \tpRequest = ComposeQMUXMsg(QMUX_TYPE_WDS, QMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ, WdsSetClientIPFamilyPref, (void *)&IpPreference);\n    \terr = QmiThreadSendQMI(pRequest, &pResponse);\n    \tif (pResponse) free(pResponse);\n    }\n\n    if (profile->enable_ipv6) {\n        if (profile->qmapnet_adapter[0]) {\n            // bind wds ipv6 mux data port\n            pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS_IPV6, QMIWDS_BIND_MUX_DATA_PORT_REQ , WdsSetQMUXBindMuxDataPort, (void *)&qmap_settings);\n            err = QmiThreadSendQMI(pRequest, &pResponse);\n            qmi_rsp_check_and_return();\n            if (pResponse) free(pResponse);\n        }\n\n        // set ipv6\n        IpPreference = IpFamilyV6;\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS_IPV6, QMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ, WdsSetClientIPFamilyPref, (void *)&IpPreference);\n        err = QmiThreadSendQMI(pRequest, &pResponse);\n        qmi_rsp_check_and_return();\n        if (pResponse) free(pResponse);\n    }\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS, QMIWDS_SET_AUTO_CONNECT_REQ , WdsSetAutoConnect, (void *)&autoconnect_setting);\n    QmiThreadSendQMI(pRequest, &pResponse);\n    if (pResponse) free(pResponse);\n\n    return 0;\n}\n\n#ifdef CONFIG_SIM\nstatic int requestGetPINStatus(SIM_Status *pSIMStatus) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    PQMIDMS_UIM_PIN_STATUS pPin1Status = NULL;\n    //PQMIDMS_UIM_PIN_STATUS pPin2Status = NULL;\n\n    if (s_9x07)\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_UIM, QMIUIM_GET_CARD_STATUS_REQ, NULL, NULL);\n    else\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_DMS, QMIDMS_UIM_GET_PIN_STATUS_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    pPin1Status = (PQMIDMS_UIM_PIN_STATUS)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n    //pPin2Status = (PQMIDMS_UIM_PIN_STATUS)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x12);\n\n    if (pPin1Status != NULL) {\n        if (pPin1Status->PINStatus == QMI_PIN_STATUS_NOT_VERIF) {\n            *pSIMStatus = SIM_PIN;\n        } else if (pPin1Status->PINStatus == QMI_PIN_STATUS_BLOCKED) {\n            *pSIMStatus = SIM_PUK;\n        } else if (pPin1Status->PINStatus == QMI_PIN_STATUS_PERM_BLOCKED) {\n            *pSIMStatus = SIM_BAD;\n        }\n    }\n\n    free(pResponse);\n    return 0;\n}\n\nstatic int requestGetSIMStatus(SIM_Status *pSIMStatus) { //RIL_REQUEST_GET_SIM_STATUS\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    const char * SIM_Status_String[] = {\n        \"SIM_ABSENT\",\n        \"SIM_NOT_READY\",\n        \"SIM_READY\", /* SIM_READY means the radio state is RADIO_STATE_SIM_READY */\n        \"SIM_PIN\",\n        \"SIM_PUK\",\n        \"SIM_NETWORK_PERSONALIZATION\"\n    };\n\n    if (s_9x07)\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_UIM, QMIUIM_GET_CARD_STATUS_REQ, NULL, NULL);\n    else\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_DMS, QMIDMS_UIM_GET_STATE_REQ, NULL, NULL);\n\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    *pSIMStatus = SIM_ABSENT;\n    if (s_9x07)\n    {\n        PQMIUIM_CARD_STATUS pCardStatus = NULL;\n        PQMIUIM_PIN_STATE pPINState = NULL;\n        UCHAR CardState = 0x01;\n        UCHAR PIN1State = QMI_PIN_STATUS_NOT_VERIF;\n        //UCHAR PIN1Retries;\n        //UCHAR PUK1Retries;\n        //UCHAR PIN2State;\n        //UCHAR PIN2Retries;\n        //UCHAR PUK2Retries;\n\n        pCardStatus = (PQMIUIM_CARD_STATUS)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x10);\n        if (pCardStatus != NULL)\n        {\n            pPINState = (PQMIUIM_PIN_STATE)((PUCHAR)pCardStatus + sizeof(QMIUIM_CARD_STATUS) + pCardStatus->AIDLength);\n            CardState  = pCardStatus->CardState;\n            if (CardState == UIM_CARD_STATE_PRESENT) {\n                if (pPINState->UnivPIN == 1)\n                {\n                   PIN1State = pCardStatus->UPINState;\n                   //PIN1Retries = pCardStatus->UPINRetries;\n                   //PUK1Retries = pCardStatus->UPUKRetries;\n                }\n                else\n                {\n                   PIN1State = pPINState->PIN1State;\n                   //PIN1Retries = pPINState->PIN1Retries;\n                   //PUK1Retries = pPINState->PUK1Retries;\n                }\n                //PIN2State = pPINState->PIN2State;\n                //PIN2Retries = pPINState->PIN2Retries;\n                //PUK2Retries = pPINState->PUK2Retries;\n            }\n        }\n\n        *pSIMStatus = SIM_ABSENT;\n        if ((CardState == 0x01) &&  ((PIN1State == QMI_PIN_STATUS_VERIFIED)|| (PIN1State == QMI_PIN_STATUS_DISABLED)))\n        {\n            *pSIMStatus = SIM_READY;\n        }\n        else if (CardState == 0x01)\n        {\n            if (PIN1State == QMI_PIN_STATUS_NOT_VERIF)\n            {\n                *pSIMStatus = SIM_PIN;\n            }\n            if ( PIN1State == QMI_PIN_STATUS_BLOCKED)\n            {\n                *pSIMStatus = SIM_PUK;\n            }\n            else if (PIN1State == QMI_PIN_STATUS_PERM_BLOCKED)\n            {\n                *pSIMStatus = SIM_BAD;\n            }\n            else if (PIN1State == QMI_PIN_STATUS_NOT_INIT || PIN1State == QMI_PIN_STATUS_VERIFIED || PIN1State == QMI_PIN_STATUS_DISABLED)\n            {\n                *pSIMStatus = SIM_READY;\n            }\n        }\n        else if (CardState == 0x00 || CardState == 0x02)\n        {\n        }\n        else\n        {\n        }\n    }\n    else\n    {\n    //UIM state. Values:\n    // 0x00  UIM initialization completed\n    // 0x01  UIM is locked or the UIM failed\n    // 0x02  UIM is not present\n    // 0x03  Reserved\n    // 0xFF  UIM state is currently\n    //unavailable\n        if (pResponse->MUXMsg.UIMGetStateResp.UIMState == 0x00) {\n            *pSIMStatus = SIM_READY;\n        } else if (pResponse->MUXMsg.UIMGetStateResp.UIMState == 0x01) {\n            *pSIMStatus = SIM_ABSENT;\n            err = requestGetPINStatus(pSIMStatus);\n        } else if ((pResponse->MUXMsg.UIMGetStateResp.UIMState == 0x02) || (pResponse->MUXMsg.UIMGetStateResp.UIMState == 0xFF)) {\n            *pSIMStatus = SIM_ABSENT;\n        } else {\n            *pSIMStatus = SIM_ABSENT;\n        }\n    }\n    dbg_time(\"%s SIMStatus: %s\", __func__, SIM_Status_String[*pSIMStatus]);\n\n    free(pResponse);\n\n    return 0;\n}\n\nstatic int requestEnterSimPin(const char *pPinCode) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n\n    if (s_9x07)\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_UIM, QMIUIM_VERIFY_PIN_REQ, UimVerifyPinReqSend, (void *)pPinCode);\n    else\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_DMS, QMIDMS_UIM_VERIFY_PIN_REQ, DmsUIMVerifyPinReqSend, (void *)pPinCode);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    free(pResponse);\n    return 0;\n}\n#endif\n\n#ifdef CONFIG_IMSI_ICCID\nstatic int requestGetICCID(void) { //RIL_REQUEST_GET_IMSI\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    PQMIUIM_CONTENT pUimContent;\n    int err;\n\n    if (s_9x07) {\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_UIM, QMIUIM_READ_TRANSPARENT_REQ, UimReadTransparentIMSIReqSend, (void *)\"EF_ICCID\");\n        err = QmiThreadSendQMI(pRequest, &pResponse);\n    } else {\n        return 0;\n    }\n    qmi_rsp_check_and_return();\n\n    pUimContent = (PQMIUIM_CONTENT)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n    if (pUimContent != NULL) {\n        static char DeviceICCID[32] = {'\\0'};\n        int i = 0, j = 0;\n\n        for (i = 0, j = 0; i < le16_to_cpu(pUimContent->content_len); ++i) {\n            char charmaps[] = \"0123456789ABCDEF\";\n\n            DeviceICCID[j++] = charmaps[(pUimContent->content[i] & 0x0F)];\n            DeviceICCID[j++] = charmaps[((pUimContent->content[i] & 0xF0) >> 0x04)];\n        }\n        DeviceICCID[j] = '\\0';\n\n        dbg_time(\"%s DeviceICCID: %s\", __func__, DeviceICCID);\n    }\n\n    free(pResponse);\n    return 0;\n}\n\nstatic int requestGetIMSI(void) { //RIL_REQUEST_GET_IMSI\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    PQMIUIM_CONTENT pUimContent;\n    int err;\n\n    if (s_9x07) {\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_UIM, QMIUIM_READ_TRANSPARENT_REQ, UimReadTransparentIMSIReqSend, (void *)\"EF_IMSI\");\n        err = QmiThreadSendQMI(pRequest, &pResponse);\n    } else {\n        return 0;\n    }\n    qmi_rsp_check_and_return();\n\n    pUimContent = (PQMIUIM_CONTENT)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n    if (pUimContent != NULL) {\n        static char DeviceIMSI[32] = {'\\0'};\n        int i = 0, j = 0;\n\n        for (i = 0, j = 0; i < le16_to_cpu(pUimContent->content[0]); ++i) {\n            if (i != 0)\n                DeviceIMSI[j++] = (pUimContent->content[i+1] & 0x0F) + '0';\n            DeviceIMSI[j++] = ((pUimContent->content[i+1] & 0xF0) >> 0x04) + '0';\n        }\n        DeviceIMSI[j] = '\\0';\n\n        dbg_time(\"%s DeviceIMSI: %s\", __func__, DeviceIMSI);\n    }\n\n    free(pResponse);\n    return 0;\n}\n#endif\n\n#if 1\nstatic void quectel_convert_cdma_mcc_2_ascii_mcc( USHORT *p_mcc, USHORT mcc )\n{\n  unsigned int d1, d2, d3, buf = mcc + 111;\n\n  if ( mcc == 0x3FF ) // wildcard\n  {\n    *p_mcc = 3;\n  }\n  else\n  {\n    d3 = buf % 10;\n    buf = ( d3 == 0 ) ? (buf-10)/10 : buf/10;\n\n    d2 = buf % 10;\n    buf = ( d2 == 0 ) ? (buf-10)/10 : buf/10;\n\n    d1 = ( buf == 10 ) ? 0 : buf;\n\n//dbg_time(\"d1:%d, d2:%d,d3:%d\",d1,d2,d3);\n    if ( d1<10 && d2<10 && d3<10 )\n    {\n    *p_mcc = d1*100+d2*10+d3;\n#if 0\n      *(p_mcc+0) = '0' + d1;\n      *(p_mcc+1) = '0' + d2;\n      *(p_mcc+2) = '0' + d3;\n#endif\n    }\n    else\n    {\n      //dbg_time( \"invalid digits %d %d %d\", d1, d2, d3 );\n      *p_mcc = 0;\n    }\n  }\n}\n\nstatic void quectel_convert_cdma_mnc_2_ascii_mnc( USHORT *p_mnc, USHORT imsi_11_12)\n{\n  unsigned int d1, d2, buf = imsi_11_12 + 11;\n\n  if ( imsi_11_12 == 0x7F ) // wildcard\n  {\n    *p_mnc = 7;\n  }\n  else\n  {\n    d2 = buf % 10;\n    buf = ( d2 == 0 ) ? (buf-10)/10 : buf/10;\n\n    d1 = ( buf == 10 ) ? 0 : buf;\n\n    if ( d1<10 && d2<10 )\n    {\n     *p_mnc = d1*10 + d2;\n    }\n    else\n    {\n      //dbg_time( \"invalid digits %d %d\", d1, d2, 0 );\n      *p_mnc = 0;\n    }\n  }\n}\n\nstatic int requestGetHomeNetwork(USHORT *p_mcc, USHORT *p_mnc, USHORT *p_sid, USHORT *p_nid) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    PHOME_NETWORK pHomeNetwork;\n    PHOME_NETWORK_SYSTEMID pHomeNetworkSystemID;\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_NAS, QMINAS_GET_HOME_NETWORK_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    pHomeNetwork = (PHOME_NETWORK)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x01);\n    if (pHomeNetwork && p_mcc && p_mnc ) {\n        *p_mcc = le16_to_cpu(pHomeNetwork->MobileCountryCode);\n        *p_mnc = le16_to_cpu(pHomeNetwork->MobileNetworkCode);\n        //dbg_time(\"%s MobileCountryCode: %d, MobileNetworkCode: %d\", __func__, *pMobileCountryCode, *pMobileNetworkCode);\n    }\n\n    pHomeNetworkSystemID = (PHOME_NETWORK_SYSTEMID)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x10);\n    if (pHomeNetworkSystemID && p_sid && p_nid) {\n        *p_sid = le16_to_cpu(pHomeNetworkSystemID->SystemID); //china-hefei: sid 14451\n        *p_nid = le16_to_cpu(pHomeNetworkSystemID->NetworkID);\n        //dbg_time(\"%s SystemID: %d, NetworkID: %d\", __func__, *pSystemID, *pNetworkID);\n    }\n\n    free(pResponse);\n\n    return 0;\n}\n#endif\n\n#if 0\n// Lookup table for carriers known to produce SIMs which incorrectly indicate MNC length.\nstatic const char * MCCMNC_CODES_HAVING_3DIGITS_MNC[] = {\n    \"302370\", \"302720\", \"310260\",\n    \"405025\", \"405026\", \"405027\", \"405028\", \"405029\", \"405030\", \"405031\", \"405032\",\n    \"405033\", \"405034\", \"405035\", \"405036\", \"405037\", \"405038\", \"405039\", \"405040\",\n    \"405041\", \"405042\", \"405043\", \"405044\", \"405045\", \"405046\", \"405047\", \"405750\",\n    \"405751\", \"405752\", \"405753\", \"405754\", \"405755\", \"405756\", \"405799\", \"405800\",\n    \"405801\", \"405802\", \"405803\", \"405804\", \"405805\", \"405806\", \"405807\", \"405808\",\n    \"405809\", \"405810\", \"405811\", \"405812\", \"405813\", \"405814\", \"405815\", \"405816\",\n    \"405817\", \"405818\", \"405819\", \"405820\", \"405821\", \"405822\", \"405823\", \"405824\",\n    \"405825\", \"405826\", \"405827\", \"405828\", \"405829\", \"405830\", \"405831\", \"405832\",\n    \"405833\", \"405834\", \"405835\", \"405836\", \"405837\", \"405838\", \"405839\", \"405840\",\n    \"405841\", \"405842\", \"405843\", \"405844\", \"405845\", \"405846\", \"405847\", \"405848\",\n    \"405849\", \"405850\", \"405851\", \"405852\", \"405853\", \"405875\", \"405876\", \"405877\",\n    \"405878\", \"405879\", \"405880\", \"405881\", \"405882\", \"405883\", \"405884\", \"405885\",\n    \"405886\", \"405908\", \"405909\", \"405910\", \"405911\", \"405912\", \"405913\", \"405914\",\n    \"405915\", \"405916\", \"405917\", \"405918\", \"405919\", \"405920\", \"405921\", \"405922\",\n    \"405923\", \"405924\", \"405925\", \"405926\", \"405927\", \"405928\", \"405929\", \"405930\",\n    \"405931\", \"405932\", \"502142\", \"502143\", \"502145\", \"502146\", \"502147\", \"502148\"\n};\n\nstatic const char * MCC_CODES_HAVING_3DIGITS_MNC[] = {\n    \"302\",    //Canada\n    \"310\",    //United States of America\n    \"311\",    //United States of America\n    \"312\",    //United States of America\n    \"313\",    //United States of America\n    \"314\",    //United States of America\n    \"315\",    //United States of America\n    \"316\",    //United States of America\n    \"334\",    //Mexico\n    \"338\",    //Jamaica\n    \"342\", //Barbados\n    \"344\",    //Antigua and Barbuda\n    \"346\",    //Cayman Islands\n    \"348\",    //British Virgin Islands\n    \"365\",    //Anguilla\n    \"708\",    //Honduras (Republic of)\n    \"722\",    //Argentine Republic\n    \"732\"    //Colombia (Republic of)\n};\n\nint requestGetIMSI(const char **pp_imsi, USHORT *pMobileCountryCode, USHORT *pMobileNetworkCode) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n\n    if (pp_imsi) *pp_imsi = NULL;\n    if (pMobileCountryCode) *pMobileCountryCode = 0;\n    if (pMobileNetworkCode) *pMobileNetworkCode = 0;\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_DMS, QMIDMS_UIM_GET_IMSI_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    if (pMUXMsg->UIMGetIMSIResp.TLV2Type == 0x01 &&  le16_to_cpu(pMUXMsg->UIMGetIMSIResp.TLV2Length) >= 5) {\n        int mnc_len = 2;\n        unsigned i;\n        char tmp[4];\n\n        if (pp_imsi) *pp_imsi = strndup((const char *)(&pMUXMsg->UIMGetIMSIResp.IMSI), le16_to_cpu(pMUXMsg->UIMGetIMSIResp.TLV2Length));\n\n        for (i = 0; i < sizeof(MCCMNC_CODES_HAVING_3DIGITS_MNC)/sizeof(MCCMNC_CODES_HAVING_3DIGITS_MNC[0]); i++) {\n            if (!strncmp((const char *)(&pMUXMsg->UIMGetIMSIResp.IMSI), MCCMNC_CODES_HAVING_3DIGITS_MNC[i], 6)) {\n                mnc_len = 3;\n                break;\n            }\n        }\n        if (mnc_len == 2) {\n            for (i = 0; i < sizeof(MCC_CODES_HAVING_3DIGITS_MNC)/sizeof(MCC_CODES_HAVING_3DIGITS_MNC[0]); i++) {\n                if (!strncmp((const char *)(&pMUXMsg->UIMGetIMSIResp.IMSI), MCC_CODES_HAVING_3DIGITS_MNC[i], 3)) {\n                    mnc_len = 3;\n                    break;\n                }\n            }\n        }\n\n        tmp[0] = (&pMUXMsg->UIMGetIMSIResp.IMSI)[0];\n        tmp[1] = (&pMUXMsg->UIMGetIMSIResp.IMSI)[1];\n        tmp[2] = (&pMUXMsg->UIMGetIMSIResp.IMSI)[2];\n        tmp[3] = 0;\n        if (pMobileCountryCode) *pMobileCountryCode = atoi(tmp);\n        tmp[0] = (&pMUXMsg->UIMGetIMSIResp.IMSI)[3];\n        tmp[1] = (&pMUXMsg->UIMGetIMSIResp.IMSI)[4];\n        tmp[2] = 0;\n        if (mnc_len == 3) {\n            tmp[2] = (&pMUXMsg->UIMGetIMSIResp.IMSI)[6];\n        }\n        if (pMobileNetworkCode) *pMobileNetworkCode = atoi(tmp);\n    }\n\n    free(pResponse);\n\n    return 0;\n}\n#endif\n\nstatic struct wwan_data_class_str class2str[] = {\n    {WWAN_DATA_CLASS_NONE, \"UNKNOWN\"},\n    {WWAN_DATA_CLASS_GPRS, \"GPRS\"},\n    {WWAN_DATA_CLASS_EDGE, \"EDGE\"},\n    {WWAN_DATA_CLASS_UMTS, \"UMTS\"},\n    {WWAN_DATA_CLASS_HSDPA, \"HSDPA\"},\n    {WWAN_DATA_CLASS_HSUPA, \"HSUPA\"},\n    {WWAN_DATA_CLASS_LTE, \"LTE\"},\n    {WWAN_DATA_CLASS_5G_NSA, \"5G_NSA\"},\n    {WWAN_DATA_CLASS_5G_SA, \"5G_SA\"},\n    {WWAN_DATA_CLASS_1XRTT, \"1XRTT\"},\n    {WWAN_DATA_CLASS_1XEVDO, \"1XEVDO\"},\n    {WWAN_DATA_CLASS_1XEVDO_REVA, \"1XEVDO_REVA\"},\n    {WWAN_DATA_CLASS_1XEVDV, \"1XEVDV\"},\n    {WWAN_DATA_CLASS_3XRTT, \"3XRTT\"},\n    {WWAN_DATA_CLASS_1XEVDO_REVB, \"1XEVDO_REVB\"},\n    {WWAN_DATA_CLASS_UMB, \"UMB\"},\n    {WWAN_DATA_CLASS_CUSTOM, \"CUSTOM\"},\n};\n\nstatic const char *wwan_data_class2str(ULONG class)\n{\n    unsigned int i = 0;\n    for (i = 0; i < sizeof(class2str)/sizeof(class2str[0]); i++) {\n        if (class2str[i].class == class) {\n            return class2str[i].str;\n        }\n    }\n    return \"UNKNOWN\";\n}\n\nstatic USHORT char2ushort(UCHAR str[3]) {\n    int i;\n    char temp[4];\n    USHORT ret= 0;\n\n    memcpy(temp, str, 3);\n    temp[3] = '\\0';\n\n    for (i = 0; i < 4; i++) {\n        if ((UCHAR)temp[i] == 0xFF) {\n            temp[i] = '\\0';\n        }\n    }\n    ret = (USHORT)atoi(temp);\n\n    return ret;\n}\n\nstatic int requestRegistrationState2(UCHAR *pPSAttachedState) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    USHORT MobileCountryCode = 0;\n    USHORT MobileNetworkCode = 0;\n    const char *pDataCapStr = \"UNKNOW\";\n    LONG remainingLen;\n    PSERVICE_STATUS_INFO pServiceStatusInfo;\n    int is_lte = 0;\n    PCDMA_SYSTEM_INFO pCdmaSystemInfo;\n    PHDR_SYSTEM_INFO pHdrSystemInfo;\n    PGSM_SYSTEM_INFO pGsmSystemInfo;\n    PWCDMA_SYSTEM_INFO pWcdmaSystemInfo;\n    PLTE_SYSTEM_INFO pLteSystemInfo;\n    PTDSCDMA_SYSTEM_INFO pTdscdmaSystemInfo;\n    PNR5G_SYSTEM_INFO pNr5gSystemInfo;\n    UCHAR DeviceClass = 0;\n    ULONG DataCapList = 0;\n    \n    /*  Additional LTE System Info - Availability of Dual connectivity of E-UTRA with NR5G */\n    uint8_t endc_available_valid = 0;  /**< Must be set to true if endc_available is being passed */\n    uint8_t endc_available = 0x00;\n    /**<  \n       Upper layer indication in LTE SIB2. Values: \\n\n       - 0x00 -- 5G Not available \\n\n       - 0x01 -- 5G Available\n       \n    */\n    /*  Additional LTE System Info - DCNR restriction Info */\n    uint8_t restrict_dcnr_valid = 0;  /**< Must be set to true if restrict_dcnr is being passed */\n    uint8_t restrict_dcnr = 0x01;\n    /**<  \n       DCNR restriction in NAS attach/TAU accept. Values: \\n\n       - 0x00 -- Not restricted \\n\n       - 0x01 -- Restricted\n    */\n\n    *pPSAttachedState = 0;\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_NAS, QMINAS_GET_SYS_INFO_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    pServiceStatusInfo = (PSERVICE_STATUS_INFO)(((PCHAR)&pMUXMsg->GetSysInfoResp) + QCQMUX_MSG_HDR_SIZE);\n    remainingLen = le16_to_cpu(pMUXMsg->GetSysInfoResp.Length);\n\n    s_is_cdma = 0;\n    s_5g_type = WWAN_DATA_CLASS_NONE;\n    s_hdr_personality = 0;\n    while (remainingLen > 0) {\n        switch (pServiceStatusInfo->TLVType) {\n        case 0x10: // CDMA\n            if (pServiceStatusInfo->SrvStatus == 0x02) {\n                DataCapList = WWAN_DATA_CLASS_1XRTT|\n                              WWAN_DATA_CLASS_1XEVDO|\n                              WWAN_DATA_CLASS_1XEVDO_REVA|\n                              WWAN_DATA_CLASS_1XEVDV|\n                              WWAN_DATA_CLASS_1XEVDO_REVB;\n                DeviceClass = DEVICE_CLASS_CDMA;\n                s_is_cdma = (0 == is_lte);\n            }\n            break;\n        case 0x11: // HDR\n            if (pServiceStatusInfo->SrvStatus == 0x02) {\n                DataCapList = WWAN_DATA_CLASS_3XRTT|\n                              WWAN_DATA_CLASS_UMB;\n                DeviceClass = DEVICE_CLASS_CDMA;\n                s_is_cdma = (0 == is_lte);\n            }\n            break;\n        case 0x12: // GSM\n            if (pServiceStatusInfo->SrvStatus == 0x02) {\n                DataCapList = WWAN_DATA_CLASS_GPRS|\n                              WWAN_DATA_CLASS_EDGE;\n                DeviceClass = DEVICE_CLASS_GSM;\n            }\n            break;\n        case 0x13: // WCDMA\n            if (pServiceStatusInfo->SrvStatus == 0x02) {\n                DataCapList = WWAN_DATA_CLASS_UMTS;\n                DeviceClass = DEVICE_CLASS_GSM;\n            }\n            break;\n        case 0x14: // LTE\n            if (pServiceStatusInfo->SrvStatus == 0x02) {\n                DataCapList = WWAN_DATA_CLASS_LTE;\n                DeviceClass = DEVICE_CLASS_GSM;\n                is_lte = 1;\n                s_is_cdma = 0;\n            }\n            break;\n        case 0x4A: // NR5G Service Status Info\n            if (pServiceStatusInfo->SrvStatus == NAS_SYS_SRV_STATUS_SRV_V01) {\n                DataCapList |= WWAN_DATA_CLASS_5G_SA;\n                DeviceClass = DEVICE_CLASS_GSM;\n                is_lte = 1;\n                s_is_cdma = 0;\n            }\n            break;\n        case 0x4B: // NR5G System Info\n            pNr5gSystemInfo = (PNR5G_SYSTEM_INFO)pServiceStatusInfo;\n            if (pNr5gSystemInfo->srv_domain_valid == 0x01) {\n                if (pNr5gSystemInfo->srv_domain & SYS_SRV_DOMAIN_PS_ONLY_V01) {\n                    *pPSAttachedState = 1;\n                }\n            }\n\n            if (pNr5gSystemInfo->network_id_valid == 0x01) {\n                MobileCountryCode = (USHORT)char2ushort(pNr5gSystemInfo->MCC);\n                MobileNetworkCode = (USHORT)char2ushort(pNr5gSystemInfo->MNC);\n            }\n            break;\n        case 0x4E: //Additional LTE System Info - Availability of Dual Connectivity of E-UTRA with NR5G\n            endc_available_valid = 1;\n            endc_available = pServiceStatusInfo->SrvStatus;\n            break;\n            \n        case 0x4F: //Additional LTE System Info - DCNR restriction Info\n            restrict_dcnr_valid = 1;\n            restrict_dcnr = pServiceStatusInfo->SrvStatus;\n            break;\n\n        case 0x24: // TDSCDMA\n            if (pServiceStatusInfo->SrvStatus == 0x02) {\n                pDataCapStr = \"TD-SCDMA\";\n            }\n            break;\n        case 0x15: // CDMA\n            // CDMA_SYSTEM_INFO\n            pCdmaSystemInfo = (PCDMA_SYSTEM_INFO)pServiceStatusInfo;\n            if (pCdmaSystemInfo->SrvDomainValid == 0x01) {\n                if (pCdmaSystemInfo->SrvDomain & 0x02) {\n                    *pPSAttachedState = 1;\n                    s_is_cdma = (0 == is_lte);\n                }\n            }\n#if 0\n            if (pCdmaSystemInfo->SrvCapabilityValid == 0x01) {\n                *pPSAttachedState = 0;\n                if (pCdmaSystemInfo->SrvCapability & 0x02) {\n                    *pPSAttachedState = 1;\n                    s_is_cdma = (0 == is_lte);\n                }\n            }\n#endif\n            if (pCdmaSystemInfo->NetworkIdValid == 0x01) {\n                MobileCountryCode = (USHORT)char2ushort(pCdmaSystemInfo->MCC);\n                MobileNetworkCode = (USHORT)char2ushort(pCdmaSystemInfo->MNC);\n            }\n            break;\n        case 0x16: // HDR\n            // HDR_SYSTEM_INFO\n            pHdrSystemInfo = (PHDR_SYSTEM_INFO)pServiceStatusInfo;\n            if (pHdrSystemInfo->SrvDomainValid == 0x01) {\n                if (pHdrSystemInfo->SrvDomain & 0x02) {\n                    *pPSAttachedState = 1;\n                    s_is_cdma = (0 == is_lte);\n                }\n            }\n#if 0\n            if (pHdrSystemInfo->SrvCapabilityValid == 0x01) {\n                *pPSAttachedState = 0;\n                if (pHdrSystemInfo->SrvCapability & 0x02) {\n                    *pPSAttachedState = 1;\n                    s_is_cdma = (0 == is_lte);\n                }\n            }\n#endif\n            if (*pPSAttachedState && pHdrSystemInfo->HdrPersonalityValid == 0x01) {\n                if (pHdrSystemInfo->HdrPersonality == 0x03)\n                    s_hdr_personality = 0x02;\n                //else if (pHdrSystemInfo->HdrPersonality == 0x02)\n                //    s_hdr_personality = 0x01;\n            }\n            USHORT cmda_mcc = 0, cdma_mnc = 0;\n            if(!requestGetHomeNetwork(&cmda_mcc, &cdma_mnc,NULL, NULL) && cmda_mcc) {\n                quectel_convert_cdma_mcc_2_ascii_mcc(&MobileCountryCode, cmda_mcc);\n                quectel_convert_cdma_mnc_2_ascii_mnc(&MobileNetworkCode, cdma_mnc);\n            }\n            break;\n        case 0x17: // GSM\n            // GSM_SYSTEM_INFO\n            pGsmSystemInfo = (PGSM_SYSTEM_INFO)pServiceStatusInfo;\n            if (pGsmSystemInfo->SrvDomainValid == 0x01) {\n                if (pGsmSystemInfo->SrvDomain & 0x02) {\n                    *pPSAttachedState = 1;\n                }\n            }\n#if 0\n            if (pGsmSystemInfo->SrvCapabilityValid == 0x01) {\n                *pPSAttachedState = 0;\n                if (pGsmSystemInfo->SrvCapability & 0x02) {\n                    *pPSAttachedState = 1;\n                }\n            }\n#endif\n            if (pGsmSystemInfo->NetworkIdValid == 0x01) {\n                MobileCountryCode = (USHORT)char2ushort(pGsmSystemInfo->MCC);\n                MobileNetworkCode = (USHORT)char2ushort(pGsmSystemInfo->MNC);\n            }\n            break;\n        case 0x18: // WCDMA\n            // WCDMA_SYSTEM_INFO\n            pWcdmaSystemInfo = (PWCDMA_SYSTEM_INFO)pServiceStatusInfo;\n            if (pWcdmaSystemInfo->SrvDomainValid == 0x01) {\n                if (pWcdmaSystemInfo->SrvDomain & 0x02) {\n                    *pPSAttachedState = 1;\n                }\n            }\n#if 0\n            if (pWcdmaSystemInfo->SrvCapabilityValid == 0x01) {\n                *pPSAttachedState = 0;\n                if (pWcdmaSystemInfo->SrvCapability & 0x02) {\n                    *pPSAttachedState = 1;\n                }\n            }\n#endif\n            if (pWcdmaSystemInfo->NetworkIdValid == 0x01) {\n                MobileCountryCode = (USHORT)char2ushort(pWcdmaSystemInfo->MCC);\n                MobileNetworkCode = (USHORT)char2ushort(pWcdmaSystemInfo->MNC);\n            }\n            break;\n        case 0x19: // LTE_SYSTEM_INFO\n            // LTE_SYSTEM_INFO\n            pLteSystemInfo = (PLTE_SYSTEM_INFO)pServiceStatusInfo;\n            if (pLteSystemInfo->SrvDomainValid == 0x01) {\n                if (pLteSystemInfo->SrvDomain & 0x02) {\n                    *pPSAttachedState = 1;\n                    is_lte = 1;\n                    s_is_cdma = 0;\n                }\n            }\n#if 0\n            if (pLteSystemInfo->SrvCapabilityValid == 0x01) {\n                *pPSAttachedState = 0;\n                if (pLteSystemInfo->SrvCapability & 0x02) {\n                    *pPSAttachedState = 1;\n                    is_lte = 1;\n                    s_is_cdma = 0;\n                }\n            }\n#endif\n            if (pLteSystemInfo->NetworkIdValid == 0x01) {\n                MobileCountryCode = (USHORT)char2ushort(pLteSystemInfo->MCC);\n                MobileNetworkCode = (USHORT)char2ushort(pLteSystemInfo->MNC);\n            }\n            break;\n        case 0x25: // TDSCDMA\n            // TDSCDMA_SYSTEM_INFO\n            pTdscdmaSystemInfo = (PTDSCDMA_SYSTEM_INFO)pServiceStatusInfo;\n            if (pTdscdmaSystemInfo->SrvDomainValid == 0x01) {\n                if (pTdscdmaSystemInfo->SrvDomain & 0x02) {\n                    *pPSAttachedState = 1;\n                }\n            }\n#if 0\n            if (pTdscdmaSystemInfo->SrvCapabilityValid == 0x01) {\n                *pPSAttachedState = 0;\n                if (pTdscdmaSystemInfo->SrvCapability & 0x02) {\n                    *pPSAttachedState = 1;\n                }\n            }\n#endif\n            if (pTdscdmaSystemInfo->NetworkIdValid == 0x01) {\n                MobileCountryCode = (USHORT)char2ushort(pTdscdmaSystemInfo->MCC);\n                MobileNetworkCode = (USHORT)char2ushort(pTdscdmaSystemInfo->MNC);\n            }\n            break;\n        default:\n            break;\n        } /* switch (pServiceStatusInfo->TLYType) */\n\n        remainingLen -= (le16_to_cpu(pServiceStatusInfo->TLVLength) + 3);\n        pServiceStatusInfo = (PSERVICE_STATUS_INFO)((PCHAR)&pServiceStatusInfo->TLVLength + le16_to_cpu(pServiceStatusInfo->TLVLength) + sizeof(USHORT));\n    } /* while (remainingLen > 0) */\n\n    if (DataCapList & WWAN_DATA_CLASS_LTE) {\n        if (endc_available_valid && restrict_dcnr_valid) {\n            if (endc_available && !restrict_dcnr) {\n                DataCapList |= WWAN_DATA_CLASS_5G_NSA;\n            }\n        }\n    }\n\n    if (DeviceClass == DEVICE_CLASS_CDMA) {\n        if (s_hdr_personality == 2) {\n            pDataCapStr = s_hdr_personality == 2 ? \"eHRPD\" : \"HRPD\";\n        } else if (DataCapList & WWAN_DATA_CLASS_1XEVDO_REVB) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_1XEVDO_REVB);\n        } else if (DataCapList & WWAN_DATA_CLASS_1XEVDO_REVA) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_1XEVDO_REVA);\n        } else if (DataCapList & WWAN_DATA_CLASS_1XEVDO) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_1XEVDO);\n        } else if (DataCapList & WWAN_DATA_CLASS_1XRTT) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_1XRTT);\n        } else if (DataCapList & WWAN_DATA_CLASS_3XRTT) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_3XRTT);\n        } else if (DataCapList & WWAN_DATA_CLASS_UMB) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_UMB);\n        }\n    } else {\n        if (DataCapList & WWAN_DATA_CLASS_5G_SA) {\n            s_5g_type = WWAN_DATA_CLASS_5G_SA;\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_5G_SA);\n        } else if (DataCapList & WWAN_DATA_CLASS_5G_NSA) {\n            s_5g_type = WWAN_DATA_CLASS_5G_NSA;\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_5G_NSA);\n        } else if (DataCapList & WWAN_DATA_CLASS_LTE) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_LTE);\n        } else if ((DataCapList & WWAN_DATA_CLASS_HSDPA) && (DataCapList & WWAN_DATA_CLASS_HSUPA)) {\n            pDataCapStr = \"HSDPA_HSUPA\";\n        } else if (DataCapList & WWAN_DATA_CLASS_HSDPA) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_HSDPA);\n        } else if (DataCapList & WWAN_DATA_CLASS_HSUPA) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_HSUPA);\n        } else if (DataCapList & WWAN_DATA_CLASS_UMTS) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_UMTS);\n        } else if (DataCapList & WWAN_DATA_CLASS_EDGE) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_EDGE);\n        } else if (DataCapList & WWAN_DATA_CLASS_GPRS) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_GPRS);\n        }\n    }\n\n    dbg_time(\"%s MCC: %d, MNC: %d, PS: %s, DataCap: %s\", __func__,\n        MobileCountryCode, MobileNetworkCode, (*pPSAttachedState == 1) ? \"Attached\" : \"Detached\" , pDataCapStr);\n\n    free(pResponse);\n\n    return 0;\n}\n\nstatic int requestRegistrationState(UCHAR *pPSAttachedState) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    PQMINAS_CURRENT_PLMN_MSG pCurrentPlmn;\n    PSERVING_SYSTEM pServingSystem;\n    PQMINAS_DATA_CAP pDataCap;\n    USHORT MobileCountryCode = 0;\n    USHORT MobileNetworkCode = 0;\n    const char *pDataCapStr = \"UNKNOW\";\n\n    if (s_9x07) {\n        return requestRegistrationState2(pPSAttachedState);\n    }\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_NAS, QMINAS_GET_SERVING_SYSTEM_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    pCurrentPlmn = (PQMINAS_CURRENT_PLMN_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x12);\n    if (pCurrentPlmn) {\n        MobileCountryCode = le16_to_cpu(pCurrentPlmn->MobileCountryCode);\n        MobileNetworkCode = le16_to_cpu(pCurrentPlmn->MobileNetworkCode);\n    }\n\n    *pPSAttachedState = 0;\n    pServingSystem = (PSERVING_SYSTEM)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x01);\n    if (pServingSystem) {\n    //Packet-switched domain attach state of the mobile.\n    //0x00    PS_UNKNOWN ?Unknown or not applicable\n    //0x01    PS_ATTACHED ?Attached\n    //0x02    PS_DETACHED ?Detached\n        *pPSAttachedState = pServingSystem->RegistrationState;\n        if (pServingSystem->RegistrationState == 0x01) //0x01 ?C REGISTERED ?C Registered with a network\n            *pPSAttachedState  = pServingSystem->PSAttachedState;\n        else {\n            //MobileCountryCode = MobileNetworkCode = 0;\n            *pPSAttachedState  = 0x02;\n        }\n    }\n\n    pDataCap = (PQMINAS_DATA_CAP)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n    if (pDataCap && pDataCap->DataCapListLen) {\n        UCHAR *DataCap = &pDataCap->DataCap;\n        if (pDataCap->DataCapListLen == 2) {\n            if ((DataCap[0] == 0x06) && ((DataCap[1] == 0x08) || (DataCap[1] == 0x0A)))\n                DataCap[0] = DataCap[1];\n        }\n        switch (DataCap[0]) {\n             case 0x01: pDataCapStr = \"GPRS\"; break;\n             case 0x02: pDataCapStr = \"EDGE\"; break;\n             case 0x03: pDataCapStr = \"HSDPA\"; break;\n             case 0x04: pDataCapStr = \"HSUPA\"; break;\n             case 0x05: pDataCapStr = \"UMTS\"; break;\n             case 0x06: pDataCapStr = \"1XRTT\"; break;\n             case 0x07: pDataCapStr = \"1XEVDO\"; break;\n             case 0x08: pDataCapStr = \"1XEVDO_REVA\"; break;\n             case 0x09: pDataCapStr = \"GPRS\"; break;\n             case 0x0A: pDataCapStr = \"1XEVDO_REVB\"; break;\n             case 0x0B: pDataCapStr = \"LTE\"; break;\n             case 0x0C: pDataCapStr = \"HSDPA\"; break;\n             case 0x0D: pDataCapStr = \"HSDPA\"; break;\n             default: pDataCapStr = \"UNKNOW\"; break;\n        }\n    }\n\n    if (pServingSystem && pServingSystem->RegistrationState == 0x01 && pServingSystem->InUseRadioIF && pServingSystem->RadioIF == 0x09) {\n        pDataCapStr = \"TD-SCDMA\";\n    }\n\n    s_is_cdma = 0;\n    if (pServingSystem && pServingSystem->RegistrationState == 0x01 && pServingSystem->InUseRadioIF && (pServingSystem->RadioIF == 0x01 || pServingSystem->RadioIF == 0x02)) {\n        USHORT cmda_mcc = 0, cdma_mnc = 0;\n        s_is_cdma = 1;\n        if(!requestGetHomeNetwork(&cmda_mcc, &cdma_mnc,NULL, NULL) && cmda_mcc) {\n            quectel_convert_cdma_mcc_2_ascii_mcc(&MobileCountryCode, cmda_mcc);\n            quectel_convert_cdma_mnc_2_ascii_mnc(&MobileNetworkCode, cdma_mnc);\n        }\n        if (1) {\n            PQCQMUX_TLV pTLV = (PQCQMUX_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x23);\n            if (pTLV)\n                s_hdr_personality = pTLV->Value;\n            else\n                s_hdr_personality = 0;\n            if (s_hdr_personality == 2)\n                pDataCapStr = \"eHRPD\";\n        }\n    }\n\n    dbg_time(\"%s MCC: %d, MNC: %d, PS: %s, DataCap: %s\", __func__,\n        MobileCountryCode, MobileNetworkCode, (*pPSAttachedState == 1) ? \"Attached\" : \"Detached\" , pDataCapStr);\n\n    free(pResponse);\n\n    return 0;\n}\n\nstatic int requestQueryDataCall(UCHAR  *pConnectionStatus, int curIpFamily) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    PQMIWDS_PKT_SRVC_TLV pPktSrvc;\n    UCHAR oldConnectionStatus = *pConnectionStatus;\n    UCHAR QMIType = (curIpFamily == IpFamilyV4) ? QMUX_TYPE_WDS : QMUX_TYPE_WDS_IPV6;\n\n    pRequest = ComposeQMUXMsg(QMIType, QMIWDS_GET_PKT_SRVC_STATUS_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    *pConnectionStatus = QWDS_PKT_DATA_DISCONNECTED;\n    pPktSrvc = (PQMIWDS_PKT_SRVC_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x01);\n    if (pPktSrvc) {\n        *pConnectionStatus = pPktSrvc->ConnectionStatus;\n        if ((le16_to_cpu(pPktSrvc->TLVLength) == 2) && (pPktSrvc->ReconfigReqd == 0x01))\n            *pConnectionStatus = QWDS_PKT_DATA_DISCONNECTED;\n    }\n\n    if (*pConnectionStatus == QWDS_PKT_DATA_DISCONNECTED) {\n        if (curIpFamily == IpFamilyV4)\n            WdsConnectionIPv4Handle = 0;\n        else\n            WdsConnectionIPv6Handle = 0;\n    }\n\n    if (oldConnectionStatus != *pConnectionStatus || debug_qmi) {\n        dbg_time(\"%s %sConnectionStatus: %s\", __func__, (curIpFamily == IpFamilyV4) ? \"IPv4\" : \"IPv6\",\n            (*pConnectionStatus == QWDS_PKT_DATA_CONNECTED) ? \"CONNECTED\" : \"DISCONNECTED\");\n    }\n\n    free(pResponse);\n    return 0;\n}\n\n// Add these implementations after existing function implementations\n\n#ifdef CONFIG_FOXCONN_FCC_AUTH\n// Make sure these functions are static to avoid symbol conflicts\nstatic USHORT DmsFoxconnSetFccAuthenticationReq(PQMUX_MSG pMUXMsg, void *arg) {\n    UCHAR magic_value = *((UCHAR *)arg);\n    \n    pMUXMsg->FoxconnSetFccAuthReq.TLVType = 0x01;\n    pMUXMsg->FoxconnSetFccAuthReq.TLVLength = cpu_to_le16(1);\n    pMUXMsg->FoxconnSetFccAuthReq.magic_value = magic_value;\n    \n    return sizeof(QMIDMS_FOXCONN_SET_FCC_AUTH_REQ_MSG);\n}\n\nstatic USHORT DmsFoxconnSetFccAuthenticationV2Req(PQMUX_MSG pMUXMsg, void *arg) {\n    FOXCONN_FCC_AUTH_V2_T *fcc_auth = (FOXCONN_FCC_AUTH_V2_T *)arg;\n    USHORT TLVLength = 0;\n    UCHAR *pTLV;\n    \n    pTLV = (UCHAR *)(&pMUXMsg->FoxconnSetFccAuthV2Req + 1);\n    \n    // Magic string TLV (0x01)\n    *pTLV++ = 0x01; // TLV Type\n    *(USHORT *)pTLV = cpu_to_le16(strlen(fcc_auth->magic_string));\n    pTLV += 2;\n    memcpy(pTLV, fcc_auth->magic_string, strlen(fcc_auth->magic_string));\n    pTLV += strlen(fcc_auth->magic_string);\n    TLVLength += 3 + strlen(fcc_auth->magic_string);\n    \n    // Magic number TLV (0x02)\n    *pTLV++ = 0x02; // TLV Type\n    *(USHORT *)pTLV = cpu_to_le16(1);\n    pTLV += 2;\n    *pTLV++ = fcc_auth->magic_number;\n    TLVLength += 4;\n    \n    return sizeof(QMIDMS_FOXCONN_SET_FCC_AUTH_V2_REQ_MSG) + TLVLength;\n}\n\n// These functions should NOT be static since they're used externally\nint requestFoxconnSetFccAuthentication(UCHAR magic_value) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n\n    dbg_time(\"%s(magic_value=0x%02x)\", __func__, magic_value);\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_DMS, QMIDMS_FOXCONN_SET_FCC_AUTH_REQ, DmsFoxconnSetFccAuthenticationReq, &magic_value);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    free(pResponse);\n    return 0;\n}\n\nint requestFoxconnSetFccAuthenticationV2(const char *magic_string, UCHAR magic_number) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    FOXCONN_FCC_AUTH_V2_T fcc_auth;\n\n    dbg_time(\"%s(magic_string='%s', magic_number=0x%02x)\", __func__, magic_string, magic_number);\n    \n    if (!magic_string || strlen(magic_string) >= sizeof(fcc_auth.magic_string)) {\n        dbg_time(\"%s: Invalid magic_string\", __func__);\n        return -1;\n    }\n\n    strcpy(fcc_auth.magic_string, magic_string);\n    fcc_auth.magic_number = magic_number;\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_DMS, QMIDMS_FOXCONN_SET_FCC_AUTH_V2_REQ, DmsFoxconnSetFccAuthenticationV2Req, &fcc_auth);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    free(pResponse);\n    return 0;\n}\n#endif\n\nstatic int requestSetupDataCall(PROFILE_T *profile, int curIpFamily) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err = 0;\n    UCHAR QMIType = (curIpFamily == IpFamilyV4) ? QMUX_TYPE_WDS : QMUX_TYPE_WDS_IPV6;\n\n//DualIPSupported means can get ipv4 & ipv6 address at the same time, one wds for ipv4, the other wds for ipv6\n    profile->curIpFamily = curIpFamily;\n    pRequest = ComposeQMUXMsg(QMIType, QMIWDS_START_NETWORK_INTERFACE_REQ, WdsStartNwInterfaceReq, profile);\n    err = QmiThreadSendQMITimeout(pRequest, &pResponse, 120 * 1000, __func__);\n    qmi_rsp_check();\n\n    if (le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXResult) || le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError)) {\n        PQMI_TLV_HDR pTLVHdr;\n\n        pTLVHdr = GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x10);\n        if (pTLVHdr) {\n            uint16_t *data16 = (uint16_t *)(pTLVHdr+1);\n            uint16_t call_end_reason = le16_to_cpu(data16[0]);\n            dbg_time(\"call_end_reason is %d\", call_end_reason);\n        }\n\n        pTLVHdr = GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n        if (pTLVHdr) {\n            uint16_t *data16 = (uint16_t *)(pTLVHdr+1);\n            uint16_t call_end_reason_type = le16_to_cpu(data16[0]);\n            uint16_t verbose_call_end_reason  = le16_to_cpu(data16[1]);\n\n            dbg_time(\"call_end_reason_type is %d\", call_end_reason_type);\n            dbg_time(\"call_end_reason_verbose is %d\", verbose_call_end_reason);\n        }\n\n        err = le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError);\n        free(pResponse);\n        return err;\n    }\n\n    if (curIpFamily == IpFamilyV4) {\n        WdsConnectionIPv4Handle = le32_to_cpu(pResponse->MUXMsg.StartNwInterfaceResp.Handle);\n        dbg_time(\"%s WdsConnectionIPv4Handle: 0x%08x\", __func__, WdsConnectionIPv4Handle);\n    } else {\n        WdsConnectionIPv6Handle = le32_to_cpu(pResponse->MUXMsg.StartNwInterfaceResp.Handle);\n        dbg_time(\"%s WdsConnectionIPv6Handle: 0x%08x\", __func__, WdsConnectionIPv6Handle);\n    }\n\n    free(pResponse);\n\n    return 0;\n}\n\nstatic int requestDeactivateDefaultPDP(PROFILE_T *profile, int curIpFamily) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    UCHAR QMIType = (curIpFamily == 0x04) ? QMUX_TYPE_WDS : QMUX_TYPE_WDS_IPV6;\n\n    (void)profile;\n    if (curIpFamily == IpFamilyV4 && WdsConnectionIPv4Handle == 0)\n        return 0;\n    if (curIpFamily == IpFamilyV6 && WdsConnectionIPv6Handle == 0)\n        return 0;\n\n    dbg_time(\"%s WdsConnectionIPv%dHandle\", __func__, curIpFamily == IpFamilyV4 ? 4 : 6);\n\n    pRequest = ComposeQMUXMsg(QMIType, QMIWDS_STOP_NETWORK_INTERFACE_REQ , WdsStopNwInterfaceReq, &curIpFamily);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    if (curIpFamily == IpFamilyV4)\n        WdsConnectionIPv4Handle = 0;\n    else\n         WdsConnectionIPv6Handle = 0;\n    free(pResponse);\n    return 0;\n}\n\nstatic int requestGetIPAddress(PROFILE_T *profile, int curIpFamily) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR pIpv4Addr;\n    PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV6_ADDR pIpv6Addr = NULL;\n    PQMIWDS_GET_RUNTIME_SETTINGS_TLV_MTU pMtu;\n    IPV4_T *pIpv4 = &profile->ipv4;\n    IPV6_T *pIpv6 = &profile->ipv6;\n    UCHAR QMIType = (curIpFamily == 0x04) ? QMUX_TYPE_WDS : QMUX_TYPE_WDS_IPV6;\n    PQMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV6_ADDR pPCSCFIpv6Addr;\n\tPQMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV4_ADDR pPCSCFIpv4Addr;\n\n    if (curIpFamily == IpFamilyV4) {\n        memset(pIpv4, 0x00, sizeof(IPV4_T));\n        if (WdsConnectionIPv4Handle == 0)\n            return 0;\n    } else if (curIpFamily == IpFamilyV6) {\n        memset(pIpv6, 0x00, sizeof(IPV6_T));\n        if (WdsConnectionIPv6Handle == 0)\n            return 0;\n    }\n\n    pRequest = ComposeQMUXMsg(QMIType, QMIWDS_GET_RUNTIME_SETTINGS_REQ, WdsGetRuntimeSettingReq, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n\tpPCSCFIpv6Addr = (PQMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV6_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x2e);    // 0x2e - pcscf ipv6 address \n\tif (pPCSCFIpv6Addr) {\n    \tif (pPCSCFIpv6Addr->PCSCFNumber == 1) {\n        \tUCHAR *PCSCFIpv6Addr1 = (UCHAR *)(pPCSCFIpv6Addr + 1);\n        \tmemcpy(profile->PCSCFIpv6Addr1, PCSCFIpv6Addr1, 16);\n        }else if (pPCSCFIpv6Addr->PCSCFNumber == 2) {\n        \tUCHAR *PCSCFIpv6Addr1 = (UCHAR *)(pPCSCFIpv6Addr + 1);\n        \tUCHAR *PCSCFIpv6Addr2 = PCSCFIpv6Addr1 + 16;\n        \tmemcpy(profile->PCSCFIpv6Addr1, PCSCFIpv6Addr1, 16);\n        \tmemcpy(profile->PCSCFIpv6Addr2, PCSCFIpv6Addr2, 16);\n        }\n    }\n    \n\tpPCSCFIpv4Addr = (PQMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV4_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x23);    // 0x23 - pcscf ipv4 address \n\tif (pPCSCFIpv4Addr) {\n    \tif (pPCSCFIpv4Addr->PCSCFNumber == 1) {\n        \tUCHAR *PCSCFIpv4Addr1 = (UCHAR *)(pPCSCFIpv4Addr + 1);\n        \tmemcpy(&profile->PCSCFIpv4Addr1, PCSCFIpv4Addr1, 4);\n        }else if (pPCSCFIpv4Addr->PCSCFNumber == 2) {\n        \tUCHAR *PCSCFIpv4Addr1 = (UCHAR *)(pPCSCFIpv4Addr + 1);\n        \tUCHAR *PCSCFIpv4Addr2 = PCSCFIpv4Addr1 + 4;\n        \tmemcpy(&profile->PCSCFIpv4Addr1, PCSCFIpv4Addr1, 4);\n        \tmemcpy(&profile->PCSCFIpv4Addr2, PCSCFIpv4Addr2, 4);\n        }\n    }\n\n    pIpv4Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4PRIMARYDNS);\n    if (pIpv4Addr) {\n        pIpv4->DnsPrimary = pIpv4Addr->IPV4Address;\n    }\n\n    pIpv4Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4SECONDARYDNS);\n    if (pIpv4Addr) {\n        pIpv4->DnsSecondary = pIpv4Addr->IPV4Address;\n    }\n\n    pIpv4Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4GATEWAY);\n    if (pIpv4Addr) {\n        pIpv4->Gateway = pIpv4Addr->IPV4Address;\n    }\n\n    pIpv4Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4SUBNET);\n    if (pIpv4Addr) {\n        pIpv4->SubnetMask = pIpv4Addr->IPV4Address;\n    }\n\n    pIpv4Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4);\n    if (pIpv4Addr) {\n        pIpv4->Address = pIpv4Addr->IPV4Address;\n    }\n\n    pIpv6Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV6_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6PRIMARYDNS);\n    if (pIpv6Addr) {\n        memcpy(pIpv6->DnsPrimary, pIpv6Addr->IPV6Address, 16);\n    }\n\n    pIpv6Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV6_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6SECONDARYDNS);\n    if (pIpv6Addr) {\n        memcpy(pIpv6->DnsSecondary, pIpv6Addr->IPV6Address, 16);\n    }\n\n    pIpv6Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV6_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6GATEWAY);\n    if (pIpv6Addr) {\n        memcpy(pIpv6->Gateway, pIpv6Addr->IPV6Address, 16);\n        pIpv6->PrefixLengthGateway = pIpv6Addr->PrefixLength;\n    }\n\n    pIpv6Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV6_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6);\n    if (pIpv6Addr) {\n        memcpy(pIpv6->Address, pIpv6Addr->IPV6Address, 16);\n        pIpv6->PrefixLengthIPAddr = pIpv6Addr->PrefixLength;\n    }\n\n    pMtu = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_MTU)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_MTU);\n    if (pMtu) {\n        if (curIpFamily == IpFamilyV4)\n            pIpv4->Mtu =  le32_to_cpu(pMtu->Mtu);\n        else\n            pIpv6->Mtu =  le32_to_cpu(pMtu->Mtu);\n    }\n\n    free(pResponse);\n    return 0;\n}\n\n#ifdef CONFIG_APN\nstatic int requestSetProfile(PROFILE_T *profile) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    const char *new_apn = profile->apn ? profile->apn : \"\";\n    const char *new_user = profile->user ? profile->user : \"\";\n    const char *new_password = profile->password ? profile->password : \"\";\n    const char *ipStr[] = {\"IPV4\", \"NULL\", \"IPV6\", \"IPV4V6\"};\n\n    dbg_time(\"%s[pdp:%d index:%d] %s/%s/%s/%d/%s\", __func__, profile->pdp, profile->profile_index, profile->apn, profile->user, profile->password, profile->auth,ipStr[profile->iptype]);\n    if (!profile->profile_index)\n        return -1;\n\n    if (profile->force_apn_set) {\n        dbg_time(\"clear APN settings\");\n        PROFILE_T *temp_profile;\n        temp_profile = (PROFILE_T *)malloc(sizeof(PROFILE_T));\n        memcpy(temp_profile, profile, sizeof(PROFILE_T));\n        temp_profile->apn = \"\";\n        temp_profile->user = \"\";\n        temp_profile->password = \"\";\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS, QMIWDS_MODIFY_PROFILE_SETTINGS_REQ, WdsModifyProfileSettingsReq, temp_profile);\n        err = QmiThreadSendQMI(pRequest, &pResponse);\n        qmi_rsp_check_and_return();\n    }\n\n    if (!profile->force_apn_set && !strcmp(profile->old_apn, new_apn) && !strcmp(profile->old_user, new_user)\n        && !strcmp(profile->old_password, new_password)\n        && profile->old_iptype == profile->iptype\n        && profile->old_auth == profile->auth)\n    {\n        dbg_time(\"no need to set skip the rest\");\n        return 0;\n    }\n\n    if (profile->force_apn_set) {\n        dbg_time(\"Force APN setting enabled, proceeding with profile update\");\n    }\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS, QMIWDS_MODIFY_PROFILE_SETTINGS_REQ, WdsModifyProfileSettingsReq, profile);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    free(pResponse);\n    return 1;\n}\n\nstatic int requestGetProfile(PROFILE_T *profile) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    PQMIWDS_APNNAME pApnName;\n    PQMIWDS_USERNAME pUserName;\n    PQMIWDS_PASSWD pPassWd;\n    PQMIWDS_AUTH_PREFERENCE pAuthPref;\n    PQMIWDS_IPTYPE pIpType;\n    PQMIWDS_PDPCONTEXT pPdpContext;\n    PQMIWDS_PROFILELIST pProfileList;\n    \n    const char *ipStr[] = {\"IPV4\", \"NULL\", \"IPV6\", \"IPV4V6\"};\n\n    profile->old_apn[0] = profile->old_user[0] = profile->old_password[0] = '\\0';\n    profile->old_auth = 0;\n    profile->old_iptype = 0;\n    if (profile->enable_ipv4 && profile->enable_ipv6)\n        profile->iptype = 3;\n    else if (profile->enable_ipv6)\n        profile->iptype = 2;\n    else\n        profile->iptype = 0;\n\n    if (!profile->pdp)\n        return 0;\n\n_re_check:\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS, QMIWDS_GET_PROFILE_LIST_REQ, WdsGetProfileListReqSend, profile);\n    err = QmiThreadSendQMI(pRequest, &pResponse);s_pResponse = malloc(le16_to_cpu(pResponse->QMIHdr.Length) + 1);\n    qmi_rsp_check_and_return();\n    \n    pProfileList = (PQMIWDS_PROFILELIST)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x01);\n    uint8 profile_indexs[42] = {0};\n    uint8 profile_num = pProfileList->ProfileList[0];\n    if(profile_num >= 1)\n    {\n        uint8 j = 0;\n        uint8 k = 2;\n        for(int i=0; i<profile_num; i++)\n        {\n            profile_indexs[j++] = pProfileList->ProfileList[k];\n            if(pProfileList->ProfileList[++k] == 0)\n                k+=2;\n            else\n                k+=2+pProfileList->ProfileList[k];\n        }\n    }\n    free(pResponse);\n    \n    for(int i=0; i<profile_num; i++)\n    {\n        profile->profile_index = profile_indexs[i];\n        \n        pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS, QMIWDS_GET_PROFILE_SETTINGS_REQ, WdsGetProfileSettingsReqSend, profile);\n        err = QmiThreadSendQMI(pRequest, &pResponse);\n        qmi_rsp_check_and_return();\n        \n        pPdpContext = (PQMIWDS_PDPCONTEXT)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x25);\n        if(pPdpContext->pdp_context == profile->pdp)\n            break;\n        else\n            free(pResponse);\n\n        if(i == profile_num-1)\n        {\n            pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS, QMIWDS_CREATE_PROFILE_REQ, WdsCreateProfileSettingsReqSend, profile);\n            err = QmiThreadSendQMI(pRequest, &pResponse);\n            qmi_rsp_check_and_return();\n            free(pResponse);\n            goto _re_check;\n        }\n    }\n    \n\n    pApnName = (PQMIWDS_APNNAME)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x14);\n    pUserName = (PQMIWDS_USERNAME)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x1B);\n    pPassWd = (PQMIWDS_PASSWD)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x1C);\n    pAuthPref = (PQMIWDS_AUTH_PREFERENCE)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x1D);\n    pIpType = (PQMIWDS_IPTYPE)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n\n    if (pApnName/* && le16_to_cpu(pApnName->TLVLength)*/)\n        uchar2char(profile->old_apn, sizeof(profile->old_apn), &pApnName->ApnName, le16_to_cpu(pApnName->TLVLength));\n    if (pUserName/*  && pUserName->UserName*/)\n        uchar2char(profile->old_user, sizeof(profile->old_user), &pUserName->UserName, le16_to_cpu(pUserName->TLVLength));\n    if (pPassWd/*  && le16_to_cpu(pPassWd->TLVLength)*/)\n        uchar2char(profile->old_password, sizeof(profile->old_password), &pPassWd->Passwd, le16_to_cpu(pPassWd->TLVLength));\n    if (pAuthPref/*  && le16_to_cpu(pAuthPref->TLVLength)*/) {\n        profile->old_auth = pAuthPref->AuthPreference;\n    }\n    if (pIpType) {\n        profile->old_iptype = pIpType->IPType;\n    }\n\n    dbg_time(\"%s[pdp:%d index:%d] %s/%s/%s/%d/%s\", __func__, profile->pdp, profile->profile_index, profile->old_apn, profile->old_user, profile->old_password, profile->old_auth, ipStr[profile->old_iptype]);\n\n    free(pResponse);\n    return 0;\n}\n#endif\n\n#ifdef CONFIG_SIGNALINFO\nstatic int requestGetSignalInfo(void)\n{\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_NAS, QMINAS_GET_SIG_INFO_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    \n    // CDMA\n    {\n        PQMINAS_SIG_INFO_CDMA_TLV_MSG ptlv = (PQMINAS_SIG_INFO_CDMA_TLV_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x10);\n        if (ptlv && ptlv->TLVLength)\n        {\n            dbg_time(\"%s CDMA: RSSI %d dBm, ECIO %.1lf dBm\", __func__,\n                ptlv->rssi, (-0.5) * (double)ptlv->ecio);\n        }\n    }\n\n    // HDR\n    {\n        PQMINAS_SIG_INFO_HDR_TLV_MSG ptlv = (PQMINAS_SIG_INFO_HDR_TLV_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n        if (ptlv && ptlv->TLVLength)\n        {\n            dbg_time(\"%s HDR: RSSI %d dBm, ECIO %.1lf dBm, IO %d dBm\", __func__,\n                ptlv->rssi, (-0.5) * (double)ptlv->ecio, ptlv->io);\n        }\n    }\n\n    // GSM\n    {\n        PQMINAS_SIG_INFO_GSM_TLV_MSG ptlv = (PQMINAS_SIG_INFO_GSM_TLV_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x12);\n        if (ptlv && ptlv->TLVLength)\n        {\n            dbg_time(\"%s GSM: RSSI %d dBm\", __func__, ptlv->rssi);\n        }\n    }\n\n    // WCDMA\n    {\n        PQMINAS_SIG_INFO_WCDMA_TLV_MSG ptlv = (PQMINAS_SIG_INFO_WCDMA_TLV_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x13);\n        if (ptlv && ptlv->TLVLength)\n        {\n            dbg_time(\"%s WCDMA: RSSI %d dBm, ECIO %.1lf dBm\", __func__,\n                ptlv->rssi, (-0.5) * (double)ptlv->ecio);\n        }\n    }\n\n    // LTE\n    {\n        PQMINAS_SIG_INFO_LTE_TLV_MSG ptlv = (PQMINAS_SIG_INFO_LTE_TLV_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x14);\n        if (ptlv && ptlv->TLVLength)\n        {\n            dbg_time(\"%s LTE: RSSI %d dBm, RSRQ %d dB, RSRP %d dBm, SNR %.1lf dB\", __func__,\n                ptlv->rssi, ptlv->rsrq, ptlv->rsrp, (0.1) * (double)ptlv->snr);\n        }\n    }\n\n    // TDSCDMA\n    {\n        PQMINAS_SIG_INFO_TDSCDMA_TLV_MSG ptlv = (PQMINAS_SIG_INFO_TDSCDMA_TLV_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x15);\n        if (ptlv && ptlv->TLVLength)\n        {\n            dbg_time(\"%s LTE: RSCP %d dBm\", __func__, ptlv->rscp);\n        }\n    }\n\n    // 5G_NSA\n    if (s_5g_type == WWAN_DATA_CLASS_5G_NSA)\n    {\n        PQMINAS_SIG_INFO_5G_NSA_TLV_MSG ptlv = (PQMINAS_SIG_INFO_5G_NSA_TLV_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x17);\n        if (ptlv && ptlv->TLVLength)\n        {\n            dbg_time(\"%s 5G_NSA: RSRP %d dBm, SNR %.1lf dB\", __func__, ptlv->rsrp, (0.1) * (double)ptlv->snr);\n        }\n    }\n\n    // 5G_SA\n    if (s_5g_type == WWAN_DATA_CLASS_5G_SA)\n    {\n        PQMINAS_SIG_INFO_5G_SA_TLV_MSG ptlv = (PQMINAS_SIG_INFO_5G_SA_TLV_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x18);\n        if (ptlv && ptlv->TLVLength)\n        {\n            dbg_time(\"%s 5G_SA: NR5G_RSRQ %d dB\", __func__, ptlv->nr5g_rsrq);\n        }\n    }\n\n    free(pResponse);\n    return 0;\n}\n#endif\n\n#ifdef CONFIG_VERSION\nstatic int requestBaseBandVersion(PROFILE_T *profile) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    PDEVICE_REV_ID revId;\n    int err;\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_DMS, QMIDMS_GET_DEVICE_REV_ID_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    revId = (PDEVICE_REV_ID)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x01);\n\n    if (revId && le16_to_cpu(revId->TLVLength))\n    {\n        uchar2char(profile->BaseBandVersion, sizeof(profile->BaseBandVersion), &revId->RevisionID, le16_to_cpu(revId->TLVLength));\n        dbg_time(\"%s %s\", __func__, profile->BaseBandVersion);\n        \n#ifdef CONFIG_FOXCONN_FCC_AUTH\n        // Check if this modem model needs FCC authentication\n        if (strstr(profile->BaseBandVersion, \"T99W175\")) {\n            profile->needs_fcc_auth = 1;\n            dbg_time(\"Modem model %s requires FCC authentication\", profile->BaseBandVersion);\n        } else {\n            profile->needs_fcc_auth = 0;\n            dbg_time(\"Modem model %s does not require FCC authentication\", profile->BaseBandVersion);\n        }\n#endif\n    }\n\n    free(pResponse);\n    return 0;\n}\n#endif\n\nstatic USHORT DmsSetOperatingModeReq(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->SetOperatingModeReq.TLVType = 0x01;\n    pMUXMsg->SetOperatingModeReq.TLVLength = cpu_to_le16(1);\n    pMUXMsg->SetOperatingModeReq.OperatingMode = *((UCHAR *)arg);\n\n    return sizeof(QMIDMS_SET_OPERATING_MODE_REQ_MSG);\n}\n\nstatic USHORT UimSetCardSlotReq(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->UIMSetCardSlotReq.TLVType = 0x01;\n    pMUXMsg->UIMSetCardSlotReq.TLVLength = cpu_to_le16(1);\n    pMUXMsg->UIMSetCardSlotReq.slot = *((UCHAR *)arg);\n\n    return sizeof(QMIUIM_SET_CARD_SLOT_REQ_MSG);\n}\n\nstatic int requestRadioPower(int state) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    UCHAR OperatingMode = (!!state) ? DMS_OP_MODE_ONLINE : DMS_OP_MODE_LOW_POWER;\n    USHORT SimOp = (!!state) ? QMIUIM_POWER_UP : QMIUIM_POWER_DOWN;\n    UCHAR cardSlot = 0x01;\n\n    dbg_time(\"%s(%d)\", __func__, state);\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_DMS, QMIDMS_SET_OPERATING_MODE_REQ, DmsSetOperatingModeReq, &OperatingMode);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n    free(pResponse);\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_UIM, SimOp, UimSetCardSlotReq, &cardSlot);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n    free(pResponse);\n\n    return 0;\n}\n\nstatic USHORT WdaSetLoopBackReq(PQMUX_MSG pMUXMsg, void *arg) {\n    (void)arg;\n\tpMUXMsg->SetLoopBackReq.loopback_state.TLVType  = 0x01;\n\tpMUXMsg->SetLoopBackReq.loopback_state.TLVLength = cpu_to_le16(1);\n\n\tpMUXMsg->SetLoopBackReq.replication_factor.TLVType\t= 0x10;\n\tpMUXMsg->SetLoopBackReq.replication_factor.TLVLength = cpu_to_le16(4);\n\n\treturn sizeof(QMI_WDA_SET_LOOPBACK_CONFIG_REQ_MSG);\n}\n\nstatic int requestSetLoopBackState(UCHAR loopback_state, ULONG replication_factor) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n\n    dbg_time(\"%s(loopback_state=%d, replication_factor=%u)\", __func__, loopback_state, replication_factor);\n    \n    pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS_ADMIN, QMI_WDA_SET_LOOPBACK_CONFIG_REQ, WdaSetLoopBackReq, NULL);\n    pRequest->MUXMsg.SetLoopBackReq.loopback_state.TLVVaule = loopback_state;\n    pRequest->MUXMsg.SetLoopBackReq.replication_factor.TLVVaule = cpu_to_le16(replication_factor);\n\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    free(pResponse);\n    return 0;\n}\n\n#ifdef CONFIG_ENABLE_QOS\nstatic USHORT QosSetBindMuxDataPort(PQMUX_MSG pMUXMsg, void *arg) {\n    PROFILE_T *profile = (PROFILE_T *)arg;\n    pMUXMsg->QosBindDataPortReq.EpIdTlv.TLVType = 0x10;\n    pMUXMsg->QosBindDataPortReq.EpIdTlv.TLVLength = cpu_to_le16(8);\n    pMUXMsg->QosBindDataPortReq.EpIdTlv.ep_type = cpu_to_le32(profile->rmnet_info.ep_type);\n    pMUXMsg->QosBindDataPortReq.EpIdTlv.iface_id = cpu_to_le32(profile->rmnet_info.iface_id);\n    pMUXMsg->QosBindDataPortReq.MuxIdTlv.TLVType = 0x11;\n    pMUXMsg->QosBindDataPortReq.MuxIdTlv.TLVLength = cpu_to_le16(1);\n    pMUXMsg->QosBindDataPortReq.MuxIdTlv.mux_id = profile->muxid;\n    return sizeof(QMI_QOS_BIND_DATA_PORT_REQ_MSG);\n}\n\n#ifdef CONFIG_REG_QOS_IND\nstatic USHORT QosIndRegReq(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->QosIndRegReq.ReportGlobalQosFlowTlv.TLVType = 0x10;\n    pMUXMsg->QosIndRegReq.ReportGlobalQosFlowTlv.TLVLength = cpu_to_le16(1);\n    pMUXMsg->QosIndRegReq.ReportGlobalQosFlowTlv.report_global_qos_flows = 1;\n    return sizeof(QMI_QOS_INDICATION_REGISTER_REQ_MSG);\n}\n#endif\n\nstatic int requestRegisterQos(PROFILE_T *profile) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse = NULL;\n    PQMUX_MSG pMUXMsg;\n    int err;\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_QOS, QMI_QOS_BIND_DATA_PORT_REQ , QosSetBindMuxDataPort, (void *)profile);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    dbg_time(\"%s QosSetBindMuxDataPort\", __func__);\n    qmi_rsp_check_and_return();\n    if (pResponse) free(pResponse);\n\t\n#ifdef CONFIG_REG_QOS_IND\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_QOS, QMI_QOS_INDICATION_REGISTER_REQ , QosIndRegReq, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    dbg_time(\"%s QosIndRegReq\", __func__);\n    qmi_rsp_check_and_return();\n    if (pResponse) free(pResponse);\n#endif\n    return 0;\n}\n\n#ifdef CONFIG_GET_QOS_INFO\nUCHAR ql_get_qos_info_data_rate(PQCQMIMSG pResponse, void *max_data_rate)\n{\n    PQMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW qos_tx_granted_flow = NULL;\n    PQMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW qos_rx_granted_flow = NULL;\n    qos_tx_granted_flow = (PQMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n    if(qos_tx_granted_flow != NULL)\n    {\n        *(ULONG64 *)(max_data_rate) = le64_to_cpu(qos_tx_granted_flow->data_rate_max);\n        dbg_time(\"GET_QOS_INFO: tx_data_rate_max=%llu\", *(ULONG64 *)(max_data_rate+0));\n    }\n    else\n        dbg_time(\"GET_QOS_INFO: No qos_tx_granted_flow\");\n    qos_rx_granted_flow = (PQMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x12);\n    if(qos_rx_granted_flow != NULL)\n    {\n        *(ULONG64 *)(max_data_rate+sizeof(ULONG64)) = le64_to_cpu(qos_rx_granted_flow->data_rate_max);\n        dbg_time(\"GET_QOS_INFO: rx_data_rate_max=%llu\", *(ULONG64 *)(max_data_rate+sizeof(ULONG64)));\n    }\n    else\n        dbg_time(\"GET_QOS_INFO: No qos_rx_granted_flow\");\n    if(qos_tx_granted_flow != NULL || qos_rx_granted_flow != NULL)\n        return 0;\n    else\n        return 1;\n}\n\nstatic USHORT QosGetQosInfoReq(PQMUX_MSG pMUXMsg, void *arg) {\n    PROFILE_T *profile = (PROFILE_T *)arg;\n    pMUXMsg->QosGetQosInfoReq.QosIdTlv.TLVType = 0x01;\n    pMUXMsg->QosGetQosInfoReq.QosIdTlv.TLVLength = cpu_to_le16(4);\n    pMUXMsg->QosGetQosInfoReq.QosIdTlv.qos_id = cpu_to_le32(profile->qos_id);\n    return sizeof(QMI_QOS_GET_QOS_INFO_REQ_MSG);\n}\n\nstatic int requestGetQosInfo(PROFILE_T *profile) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse = NULL;\n    PQMUX_MSG pMUXMsg;\n    int err;\n\n    if(profile->qos_id == 0)\n    {\n        dbg_time(\"%s request not send: invalid qos_id\", __func__);\n        return 0;\n    }\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_QOS, QMI_QOS_GET_QOS_INFO_REQ , QosGetQosInfoReq, (void *)profile);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n    if (pResponse)\n    {\n#ifdef CONFIG_GET_QOS_DATA_RATE\n        ULONG64 max_data_rate[2] = {0};\n        if(ql_get_qos_info_data_rate(pResponse, (void *)max_data_rate) == 0){}\n#endif\n        free(pResponse);\n    }\n    return 0;\n}\n#endif //#ifdef CONFIG_GET_QOS_INFO\n\n#ifdef CONFIG_REG_QOS_IND\nUCHAR ql_get_global_qos_flow_ind_qos_id(PQCQMIMSG pResponse, UINT *qos_id)\n{\n    PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_STATE qos_flow_state = NULL;\n    qos_flow_state = (PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_STATE)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x01);\n    if(qos_flow_state != NULL)\n    {\n        if(le32_to_cpu(qos_flow_state->state_change) == QOS_IND_FLOW_STATE_ACTIVATED && qos_flow_state->new_flow == 1)\n        {\n            *qos_id = le32_to_cpu(qos_flow_state->qos_id);\n            dbg_time(\"QMI_QOS_GLOBAL_QOS_FLOW_IND: qos_id=%u state=QOS_IND_FLOW_STATE_ACTIVATED\", *qos_id);\n        }\n        return (qos_flow_state->new_flow);\n    }\n    return (0);\n}\n\n#ifdef CONFIG_GET_QOS_DATA_RATE\nUCHAR ql_get_global_qos_flow_ind_data_rate(PQCQMIMSG pResponse, void *max_data_rate)\n{\n    PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED qos_tx_flow_granted = NULL;\n    PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED qos_rx_flow_granted = NULL;\n    qos_tx_flow_granted = (PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x10);\n    if(qos_tx_flow_granted != NULL)\n    {\n        *(ULONG64 *)(max_data_rate) = le64_to_cpu(qos_tx_flow_granted->data_rate_max);\n        dbg_time(\"QMI_QOS_GLOBAL_QOS_FLOW_IND: tx_data_rate_max=%llu\", *(ULONG64 *)(max_data_rate+0));\n    }\n    else\n    dbg_time(\"QMI_QOS_GLOBAL_QOS_FLOW_IND: No qos_tx_flow_granted\");\n    qos_rx_flow_granted = (PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n    if(qos_rx_flow_granted != NULL)\n    {\n        *(ULONG64 *)(max_data_rate+sizeof(ULONG64)) = le64_to_cpu(qos_rx_flow_granted->data_rate_max);\n        dbg_time(\"QMI_QOS_GLOBAL_QOS_FLOW_IND: rx_data_rate_max=%llu\", *(ULONG64 *)(max_data_rate+sizeof(ULONG64)));\n    }\n    else\n        dbg_time(\"QMI_QOS_GLOBAL_QOS_FLOW_IND: No qos_rx_flow_granted\");\n    if(qos_tx_flow_granted != NULL || qos_rx_flow_granted != NULL)\n        return 0;\n    else\n        return 1;\n}\n#endif\n#endif //#ifdef CONFIG_REG_QOS_IND\n#endif //#ifdef CONFIG_ENABLE_QOS\n\n#ifdef CONFIG_CELLINFO\n/*\n    at+qeng=\"servingcell\" and at+qeng=\"neighbourcell\"\n    https://gitlab.freedesktop.org/mobile-broadband/libqmi/-/blob/master/src/qmicli/qmicli-nas.c\n*/\nstatic int nas_get_cell_location_info(void);\nstatic int nas_get_rf_band_information(void);\n\nstatic int requestGetCellInfoList(void) {\n    dbg_time(\"%s\", __func__);\n    nas_get_cell_location_info();\n    nas_get_rf_band_information();\n    return 0;\n}\n#endif\n\nconst struct request_ops qmi_request_ops = {\n#ifdef CONFIG_VERSION\n    .requestBaseBandVersion = requestBaseBandVersion,\n#endif\n    .requestSetEthMode = requestSetEthMode,\n#ifdef CONFIG_SIM\n    .requestGetSIMStatus = requestGetSIMStatus,\n    .requestEnterSimPin = requestEnterSimPin,\n#endif\n#ifdef CONFIG_IMSI_ICCID\n    .requestGetICCID = requestGetICCID,\n    .requestGetIMSI = requestGetIMSI,\n#endif\n#ifdef CONFIG_APN\n    .requestSetProfile = requestSetProfile,\n    .requestGetProfile = requestGetProfile,\n#endif\n    .requestRegistrationState = requestRegistrationState,\n    .requestSetupDataCall = requestSetupDataCall,\n    .requestQueryDataCall = requestQueryDataCall,\n    .requestDeactivateDefaultPDP = requestDeactivateDefaultPDP,\n    .requestGetIPAddress = requestGetIPAddress,\n#ifdef CONFIG_SIGNALINFO\n    .requestGetSignalInfo = requestGetSignalInfo,\n#endif\n#ifdef CONFIG_CELLINFO\n    .requestGetCellInfoList = requestGetCellInfoList,\n#endif\n    .requestSetLoopBackState = requestSetLoopBackState,\n    .requestRadioPower = requestRadioPower,\n#ifdef CONFIG_ENABLE_QOS\n    .requestRegisterQos = requestRegisterQos,\n#endif\n#ifdef CONFIG_GET_QOS_INFO\n    .requestGetQosInfo = requestGetQosInfo,\n#endif\n#ifdef CONFIG_COEX_WWAN_STATE\n    .requestGetCoexWWANState = requestGetCoexWWANState,\n#endif\n#ifdef CONFIG_FOXCONN_FCC_AUTH\n    .requestFoxconnSetFccAuthentication = requestFoxconnSetFccAuthentication,\n    .requestFoxconnSetFccAuthenticationV2 = requestFoxconnSetFccAuthenticationV2,\n#endif\n};\n\n#ifdef CONFIG_CELLINFO\nstatic char *str_from_bcd_plmn (uint8 plmn[3])\n{\n    const char bcd_chars[] = \"0123456789*#abc\\0\\0\";\n    static char str[12];\n    int i;\n    int j = 0;\n\n    for (i = 0; i < 3; i++) {\n        str[j] = bcd_chars[plmn[i]&0xF];\n        if (str[j]) j++;\n        str[j] = bcd_chars[plmn[i]>>4];\n        if (str[j]) j++;\n    }\n\n    str[j++] = 0;\n\n    return str;\n}\n\ntypedef struct {\n    UINT type;\n    const char *name;\n} ENUM_NAME_T;\n\n#define enum_name(type) {type, #type}\n#define N_ELEMENTS(arr)\t\t(sizeof (arr) / sizeof ((arr)[0]))\n\nstatic const ENUM_NAME_T QMI_NAS_ACTIVE_BAND_NAME[] = {\n    enum_name(QMI_NAS_ACTIVE_BAND_BC_0),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_1),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_2),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_3),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_4),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_5),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_6),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_7),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_8),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_9),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_10),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_11),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_12),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_13),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_14),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_15),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_16),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_17),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_18),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_19),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_450),               \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_480),               \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_750),               \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_850),               \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_900_EXTENDED),      \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_900_PRIMARY),       \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_900_RAILWAYS),      \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_DCS_1800),          \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_PCS_1900),          \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_2100),            \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_PCS_1900),        \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_DCS_1800),        \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_1700_US),         \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_850),             \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_800),             \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_2600),            \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_900),             \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_1700_JAPAN),      \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_1500_JAPAN),      \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_850_JAPAN),       \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_1),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_2),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_3),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_4),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_5),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_6),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_7),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_8),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_9),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_10),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_11),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_12),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_13),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_14),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_17),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_18),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_19),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_20),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_21),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_23),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_24),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_25),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_26),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_27),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_28),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_29),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_30),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_31),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_32),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_33),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_34),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_35),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_36),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_37),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_38),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_39),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_40),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_41),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_42),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_43),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_46),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_47),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_48),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_66),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_71),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_125),            \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_126),            \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_127),            \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_250),            \n    enum_name(QMI_NAS_ACTIVE_BAND_TDSCDMA_A),             \n    enum_name(QMI_NAS_ACTIVE_BAND_TDSCDMA_B),             \n    enum_name(QMI_NAS_ACTIVE_BAND_TDSCDMA_C),             \n    enum_name(QMI_NAS_ACTIVE_BAND_TDSCDMA_D),             \n    enum_name(QMI_NAS_ACTIVE_BAND_TDSCDMA_E),             \n    enum_name(QMI_NAS_ACTIVE_BAND_TDSCDMA_F),             \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_1 ),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_2 ),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_3 ),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_5 ),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_7 ),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_8 ),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_20),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_28),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_38),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_41),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_50),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_51),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_66),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_70),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_71),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_74),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_75),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_76),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_77),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_78),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_79),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_80),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_81),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_82),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_83),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_84),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_85),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_257),         \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_258),         \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_259),         \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_260),         \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_261),         \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_12),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_25),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_34),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_39),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_40),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_65),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_86),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_48),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_14),          \n};\n\nstatic const char *qmi_nas_radio_interface_get_string(uint8 radio_if)\n{\n    const char *str = NULL;\n\n    switch (radio_if) {\n        case QMI_NAS_RADIO_INTERFACE_CDMA_1X: str = \"cdma-1x\"; break;\n        case QMI_NAS_RADIO_INTERFACE_CDMA_1XEVDO: str = \"cdma-1xevdo\"; break;\n        case QMI_NAS_RADIO_INTERFACE_AMPS: str = \"amps\"; break;\n        case QMI_NAS_RADIO_INTERFACE_GSM: str = \"gsm\"; break;\n        case QMI_NAS_RADIO_INTERFACE_UMTS: str = \"umts\"; break;\n        case QMI_NAS_RADIO_INTERFACE_LTE: str = \"lte\"; break;\n        case QMI_NAS_RADIO_INTERFACE_TD_SCDMA: str = \"td-scdma\"; break;\n        case QMI_NAS_RADIO_INTERFACE_5GNR: str = \"5gnr\"; break;\n        default: str = NULL; break;\n    }\n\n    return str ?  str : \"unknown\";\n}\n\nstatic const char *qmi_nas_active_band_get_string(uint32 active_band)\n{\n    size_t i;\n\n    for (i = 0; i < N_ELEMENTS(QMI_NAS_ACTIVE_BAND_NAME); i++) {\n        if (active_band == QMI_NAS_ACTIVE_BAND_NAME[i].type)\n            return QMI_NAS_ACTIVE_BAND_NAME[i].name + strlen(\"QMI_NAS_ACTIVE_BAND_\");\n    }\n\n    return \"unknown\";\n}\n\ntypedef struct {\n    uint16      min;\n    uint16      max;\n    const char *name;\n} EarfcnRange;\n\n/* http://niviuk.free.fr/lte_band.php */\nstatic const EarfcnRange earfcn_ranges[] = {\n    {     0,   599, \"E-UTRA band 1: 2100\"           },\n    {   600,  1199, \"E-UTRA band 2: 1900 PCS\"       },\n    {  1200,  1949, \"E-UTRA band 3: 1800+\"          },\n    {  1950,  2399, \"E-UTRA band 4: AWS-1\"          },\n    {  2400,  2649, \"E-UTRA band 5: 850\"            },\n    {  2650,  2749, \"E-UTRA band 6: UMTS only\"      },\n    {  2750,  3449, \"E-UTRA band 7: 2600\"           },\n    {  3450,  3799, \"E-UTRA band 8: 900\"            },\n    {  3800,  4149, \"E-UTRA band 9: 1800\"           },\n    {  4150,  4749, \"E-UTRA band 10: AWS-1+\"        },\n    {  4750,  4999, \"E-UTRA band 11: 1500 Lower\"    },\n    {  5000,  5179, \"E-UTRA band 12: 700 a\"         },\n    {  5180,  5279, \"E-UTRA band 13: 700 c\"         },\n    {  5280,  5379, \"E-UTRA band 14: 700 PS\"        },\n    {  5730,  5849, \"E-UTRA band 17: 700 b\"         },\n    {  5850,  5999, \"E-UTRA band 18: 800 Lower\"     },\n    {  6000,  6149, \"E-UTRA band 19: 800 Upper\"     },\n    {  6150,  6449, \"E-UTRA band 20: 800 DD\"        },\n    {  6450,  6599, \"E-UTRA band 21: 1500 Upper\"    },\n    {  6600,  7399, \"E-UTRA band 22: 3500\"          },\n    {  7500,  7699, \"E-UTRA band 23: 2000 S-band\"   },\n    {  7700,  8039, \"E-UTRA band 24: 1600 L-band\"   },\n    {  8040,  8689, \"E-UTRA band 25: 1900+\"         },\n    {  8690,  9039, \"E-UTRA band 26: 850+\"          },\n    {  9040,  9209, \"E-UTRA band 27: 800 SMR\"       },\n    {  9210,  9659, \"E-UTRA band 28: 700 APT\"       },\n    {  9660,  9769, \"E-UTRA band 29: 700 d\"         },\n    {  9770,  9869, \"E-UTRA band 30: 2300 WCS\"      },\n    {  9870,  9919, \"E-UTRA band 31: 450\"           },\n    {  9920, 10359, \"E-UTRA band 32: 1500 L-band\"   },\n    { 36000, 36199, \"E-UTRA band 33: TD 1900\"       },\n    { 36200, 36349, \"E-UTRA band 34: TD 2000\"       },\n    { 36350, 36949, \"E-UTRA band 35: TD PCS Lower\"  },\n    { 36950, 37549, \"E-UTRA band 36: TD PCS Upper\"  },\n    { 37550, 37749, \"E-UTRA band 37: TD PCS Center\" },\n    { 37750, 38249, \"E-UTRA band 38: TD 2600\"       },\n    { 38250, 38649, \"E-UTRA band 39: TD 1900+\"      },\n    { 38650, 39649, \"E-UTRA band 40: TD 2300\"       },\n    { 39650, 41589, \"E-UTRA band 41: TD 2500\"       },\n    { 41590, 43589, \"E-UTRA band 42: TD 3500\"       },\n    { 43590, 45589, \"E-UTRA band 43: TD 3700\"       },\n    { 45590, 46589, \"E-UTRA band 44: TD 700\"        },\n};\n\nstatic const char * earfcn_to_eutra_band_string (uint16 earfcn)\n{\n    size_t i;\n\n    for (i = 0; i < N_ELEMENTS (earfcn_ranges); i++) {\n        if (earfcn <= earfcn_ranges[i].max && earfcn >= earfcn_ranges[i].min)\n            return earfcn_ranges[i].name;\n    }\n    \n    return \"unknown\";\n}\n\nstatic int nas_get_cell_location_info(void)\n{\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    PQMI_TLV pV;\n    int err;\n    int i, j;\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_NAS, QMINAS_GET_CELL_LOCATION_INFO_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    pV = (PQMI_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x2E);\n    if (pV && pV->TLVLength) {\n        printf (\"5GNR ARFCN: '%u'\\n\", pV->u32);\n    }\n\n    {\n        NasGetCellLocationNr5gServingCell *ptlv = (NasGetCellLocationNr5gServingCell *)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x2F);\n        if (ptlv && ptlv->TLVLength)\n        {\n            printf (\"5GNR cell information:\\n\"\n                     \"\\tPLMN: '%s'\\n\"\n                     \"\\tTracking Area Code: '%u'\\n\"\n                     \"\\tGlobal Cell ID: '%\" PRIu64 \"'\\n\"\n                     \"\\tPhysical Cell ID: '%u'\\n\"\n                     \"\\tRSRQ: '%.1lf dB'\\n\"\n                     \"\\tRSRP: '%.1lf dBm'\\n\"\n                     \"\\tSNR: '%.1lf dB'\\n\",\n                     str_from_bcd_plmn(ptlv->plmn),\n                     ptlv->tac[0]<<16 | ptlv->tac[1]<<8 | ptlv->tac[2] ,\n                     ptlv->global_cell_id,\n                     ptlv->physical_cell_id,\n                     (0.1) * ((double)ptlv->rsrq),\n                     (0.1) * ((double)ptlv->rsrp),\n                     (0.1) * ((double)ptlv->snr));\n        }\n    }\n\n    {\n        NasGetCellLocationLteInfoIntrafrequency *ptlv = (NasGetCellLocationLteInfoIntrafrequency *)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x13);\n        if (ptlv && ptlv->TLVLength)\n        {\n            printf (\"Intrafrequency LTE Info:\\n\"\n                    \"\\tUE In Idle: '%s'\\n\"\n                    \"\\tPLMN: '%s'\\n\"\n                    \"\\tTracking Area Code: '%u'\\n\"\n                    \"\\tGlobal Cell ID: '%u'\\n\"\n                    \"\\tEUTRA Absolute RF Channel Number: '%u' (%s)\\n\"\n                    \"\\tServing Cell ID: '%u'\\n\",\n                    ptlv->ue_in_idle ? \"yes\" : \"no\",\n                    str_from_bcd_plmn(ptlv->plmn),\n                    ptlv->tracking_area_code,\n                    ptlv->global_cell_id,\n                    ptlv->absolute_rf_channel_number, earfcn_to_eutra_band_string(ptlv->absolute_rf_channel_number),\n                    ptlv->serving_cell_id);\n\n                if (ptlv->ue_in_idle)\n                    printf (\"\\tCell Reselection Priority: '%u'\\n\"\n                             \"\\tS Non Intra Search Threshold: '%u'\\n\"\n                             \"\\tServing Cell Low Threshold: '%u'\\n\"\n                             \"\\tS Intra Search Threshold: '%u'\\n\",\n                             ptlv->cell_reselection_priority,\n                             ptlv->s_non_intra_search_threshold,\n                             ptlv->serving_cell_low_threshold,\n                             ptlv->s_intra_search_threshold);\n\n\n                for (i = 0; i < ptlv->cells_len; i++) {\n                    NasGetCellLocationLteInfoCell *cell = &ptlv->cells_array[i];\n\n                    printf (\"\\tCell [%u]:\\n\"\n                             \"\\t\\tPhysical Cell ID: '%u'\\n\"\n                             \"\\t\\tRSRQ: '%.1lf' dB\\n\"\n                             \"\\t\\tRSRP: '%.1lf' dBm\\n\"\n                             \"\\t\\tRSSI: '%.1lf' dBm\\n\",\n                             i,\n                             cell->physical_cell_id,\n                             (double) cell->rsrq * 0.1,\n                             (double) cell->rsrp * 0.1,\n                             (double) cell->rssi * 0.1);\n\n                    if (ptlv->ue_in_idle)\n                        printf (\"\\t\\tCell Selection RX Level: '%d'\\n\",\n                                 cell->cell_selection_rx_level);\n                }\n        }\n    }\n\n    {\n        NasGetCellLocationLteInfoInterfrequency *ptlv = (NasGetCellLocationLteInfoInterfrequency *)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x14);\n        if (ptlv && ptlv->TLVLength)\n        {\n            int off = offsetof(NasGetCellLocationLteInfoInterfrequency, freqs[0]);\n            printf (\"Interfrequency LTE Info:\\n\"\n                     \"\\tUE In Idle: '%s'\\n\", ptlv->ue_in_idle ? \"yes\" : \"no\");\n\n                for (i = 0; i < ptlv->freqs_len; i++) {\n                    NasGetCellLocationLteInfoInterfrequencyFrequencyElement *freq = (((void *)ptlv) + off);\n\n                    off += sizeof(*freq);\n                    printf (\"\\tFrequency [%u]:\\n\"\n                             \"\\t\\tEUTRA Absolute RF Channel Number: '%u' (%s)\\n\"\n                             \"\\t\\tSelection RX Level Low Threshold: '%u'\\n\"\n                             \"\\t\\tCell Selection RX Level High Threshold: '%u'\\n\",\n                             i,\n                             freq->eutra_absolute_rf_channel_number, earfcn_to_eutra_band_string(freq->eutra_absolute_rf_channel_number),\n                             freq->cell_selection_rx_level_low_threshold,\n                             freq->cell_selection_rx_level_high_threshold);\n                    if (ptlv->ue_in_idle)\n                        printf (\"\\t\\tCell Reselection Priority: '%u'\\n\",\n                                 freq->cell_reselection_priority);\n\n\n                    for (j = 0; j < freq->cells_len; j++) {\n                        NasGetCellLocationLteInfoCell *cell = &freq->cells_array[j];\n\n                        off += sizeof(*cell);\n                        printf (\"\\t\\tCell [%u]:\\n\"\n                                 \"\\t\\t\\tPhysical Cell ID: '%u'\\n\"\n                                 \"\\t\\t\\tRSRQ: '%.1lf' dB\\n\"\n                                 \"\\t\\t\\tRSRP: '%.1lf' dBm\\n\"\n                                 \"\\t\\t\\tRSSI: '%.1lf' dBm\\n\"\n                                 \"\\t\\t\\tCell Selection RX Level: '%u'\\n\",\n                                 j,\n                                 cell->physical_cell_id,\n                                 (double) cell->rsrq * 0.1,\n                                 (double) cell->rsrp * 0.1,\n                                 (double) cell->rssi * 0.1,\n                                 cell->cell_selection_rx_level);\n                    }\n                }\n        }\n    }\n\n    pV = (PQMI_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x1E);\n    if (pV && pV->TLVLength) {\n        if (pV->u32 == 0xFFFFFFFF)\n            printf (\"LTE Timing Advance: 'unavailable'\\n\");\n        else\n            printf (\"LTE Timing Advance: '%u'\\n\", pV->u32);\n    }\n    \n    free(pResponse);\n    return 0;\n}\n\nstatic int nas_get_rf_band_information(void)\n{\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    int i;\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_NAS, QMINAS_GET_RF_BAND_INFO_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    {\n        NasGetRfBandInfoList *ptlv = (NasGetRfBandInfoList *)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x01);\n        if (ptlv && ptlv->TLVLength)\n        {\n            printf (\"Band Information:\\n\");\n            for (i = 0; i < ptlv->num_instances; i++) {\n                NasGetRfBandInfo *band = &ptlv->bands_array[i];\n\n                printf (\"\\tRadio Interface:   '%s'\\n\"\n                         \"\\tActive Band Class: '%s'\\n\"\n                         \"\\tActive Channel:    '%u'\\n\",\n                         qmi_nas_radio_interface_get_string (band->radio_if),\n                         qmi_nas_active_band_get_string (band->active_band),\n                         band->active_channel);\n            }\n        }\n    }\n\n    {\n        NasGetRfBandInfoExtendedList *ptlv = (NasGetRfBandInfoExtendedList *)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n        if (ptlv && ptlv->TLVLength)\n        {\n            printf (\"Band Information (Extended):\\n\");\n            for (i = 0; i < ptlv->num_instances; i++) {\n                NasGetRfBandInfoExtended *band = &ptlv->bands_array[i];\n\n                printf (\"\\tRadio Interface:   '%s'\\n\"\n                         \"\\tActive Band Class: '%s'\\n\"\n                         \"\\tActive Channel:    '%u'\\n\",\n                         qmi_nas_radio_interface_get_string (band->radio_if),\n                         qmi_nas_active_band_get_string (band->active_band),\n                         band->active_channel);\n            }\n        }\n    }\n\n    {\n        NasGetRfBandInfoBandWidthList *ptlv = (NasGetRfBandInfoBandWidthList *)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x12);\n        if (ptlv && ptlv->TLVLength)\n        {\n            printf (\"Bandwidth:\\n\");\n            for (i = 0; i < ptlv->num_instances; i++) {\n                NasGetRfBandInfoBandWidth *band = &ptlv->bands_array[i];\n\n                printf (\"\\tRadio Interface:   '%s'\\n\"\n                         \"\\tBandwidth:         '%u'\\n\",\n                     qmi_nas_radio_interface_get_string (band->radio_if),\n                     (band->bandwidth));\n            }\n        }\n    }\n\n    free(pResponse);\n    return 0;\n}\n#endif\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/QMIThread.h",
    "content": "#ifndef __QMI_THREAD_H__\n#define __QMI_THREAD_H__\n\n#define CONFIG_GOBINET\n#define CONFIG_QMIWWAN\n#define CONFIG_SIM\n#define CONFIG_APN\n#define CONFIG_VERSION\n//#define CONFIG_SIGNALINFO\n//#define CONFIG_CELLINFO\n//#define CONFIG_COEX_WWAN_STATE\n#define CONFIG_DEFAULT_PDP 1\n//#define CONFIG_IMSI_ICCID\n#define QUECTEL_UL_DATA_AGG\n//#define QUECTEL_QMI_MERGE\n//#define REBOOT_SIM_CARD_WHEN_APN_CHANGE\n//#define REBOOT_SIM_CARD_WHEN_LONG_TIME_NO_PS 60 //unit is seconds\n//#define CONFIG_QRTR\n//#define CONFIG_ENABLE_QOS\n//#define CONFIG_REG_QOS_IND\n//#define CONFIG_GET_QOS_INFO\n//#define CONFIG_GET_QOS_DATA_RATE\n#define CONFIG_FOXCONN_FCC_AUTH\n\n#if (defined(CONFIG_REG_QOS_IND) || defined(CONFIG_GET_QOS_INFO) || defined(CONFIG_GET_QOS_DATA_RATE))\n#ifndef CONFIG_REG_QOS_IND\n#define CONFIG_REG_QOS_IND\n#endif\n#ifndef CONFIG_ENABLE_QOS\n#define CONFIG_ENABLE_QOS\n#endif\n#endif\n\n#include <stdio.h>\n#include <string.h>\n#include <termios.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <time.h>\n#include <fcntl.h>\n#include <signal.h>\n#include <errno.h>\n#include <string.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <errno.h>\n#include <pthread.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <sys/epoll.h>\n#include <poll.h>\n#include <sys/ioctl.h>\n#include <sys/socket.h>\n#include <stddef.h>\n\n#include \"qendian.h\"\n#include \"QCQMI.h\"\n#include \"QCQCTL.h\"\n#include \"QCQMUX.h\"\n#include \"util.h\"\n\n#define DEVICE_CLASS_UNKNOWN           0\n#define DEVICE_CLASS_CDMA              1\n#define DEVICE_CLASS_GSM               2\n\n#define WWAN_DATA_CLASS_NONE            0x00000000\n#define WWAN_DATA_CLASS_GPRS            0x00000001\n#define WWAN_DATA_CLASS_EDGE            0x00000002 /* EGPRS */\n#define WWAN_DATA_CLASS_UMTS            0x00000004\n#define WWAN_DATA_CLASS_HSDPA           0x00000008\n#define WWAN_DATA_CLASS_HSUPA           0x00000010\n#define WWAN_DATA_CLASS_LTE             0x00000020\n#define WWAN_DATA_CLASS_5G_NSA        0x00000040\n#define WWAN_DATA_CLASS_5G_SA        0x00000080\n#define WWAN_DATA_CLASS_1XRTT           0x00010000\n#define WWAN_DATA_CLASS_1XEVDO          0x00020000\n#define WWAN_DATA_CLASS_1XEVDO_REVA     0x00040000\n#define WWAN_DATA_CLASS_1XEVDV          0x00080000\n#define WWAN_DATA_CLASS_3XRTT           0x00100000\n#define WWAN_DATA_CLASS_1XEVDO_REVB     0x00200000 /* for future use */\n#define WWAN_DATA_CLASS_UMB             0x00400000\n#define WWAN_DATA_CLASS_CUSTOM          0x80000000\n\nstruct wwan_data_class_str {\n    ULONG class;\n    const char *str;\n};\n\n#pragma pack(push, 1)\ntypedef struct __IPV4 {\n    uint32_t Address;\n    uint32_t Gateway;\n    uint32_t SubnetMask;\n    uint32_t DnsPrimary;\n    uint32_t DnsSecondary;\n    uint32_t Mtu;\n} IPV4_T;\n\ntypedef struct __IPV6 {\n    UCHAR Address[16];\n    UCHAR Gateway[16];\n    UCHAR SubnetMask[16];\n    UCHAR DnsPrimary[16];\n    UCHAR DnsSecondary[16];\n    UCHAR PrefixLengthIPAddr;\n    UCHAR PrefixLengthGateway;\n    ULONG Mtu;\n} IPV6_T;\n\ntypedef struct {\n    UINT size;\n    UINT rx_urb_size;\n    UINT ep_type;\n    UINT iface_id;\n    UINT MuxId;\n    UINT ul_data_aggregation_max_datagrams; //0x17\n    UINT ul_data_aggregation_max_size ;//0x18\n    UINT dl_minimum_padding; //0x1A\n} QMAP_SETTING;\n\n//Configured downlink data aggregationprotocol\n#define WDA_DL_DATA_AGG_DISABLED (0x00) //DL data aggregation is disabled (default)\n#define WDA_DL_DATA_AGG_TLP_ENABLED (0x01) // DL TLP is enabled\n#define WDA_DL_DATA_AGG_QC_NCM_ENABLED (0x02) // DL QC_NCM isenabled\n#define WDA_DL_DATA_AGG_MBIM_ENABLED (0x03) // DL MBIM isenabled\n#define WDA_DL_DATA_AGG_RNDIS_ENABLED (0x04) // DL RNDIS is enabled\n#define WDA_DL_DATA_AGG_QMAP_ENABLED (0x05) // DL QMAP isenabled\n#define WDA_DL_DATA_AGG_QMAP_V2_ENABLED (0x06) // DL QMAP V2 is enabled\n#define WDA_DL_DATA_AGG_QMAP_V3_ENABLED (0x07) // DL QMAP V3 is enabled\n#define WDA_DL_DATA_AGG_QMAP_V4_ENABLED (0x08) // DL QMAP V4 is enabled\n#define WDA_DL_DATA_AGG_QMAP_V5_ENABLED (0x09) // DL QMAP V5 is enabled\n\ntypedef struct {\n    unsigned int size;\n    unsigned int rx_urb_size;\n    unsigned int ep_type;\n    unsigned int iface_id;\n    unsigned int qmap_mode;\n    unsigned int qmap_version;\n    unsigned int dl_minimum_padding;\n    char ifname[8][16];\n    unsigned char mux_id[8];\n} RMNET_INFO;\n\n#define IpFamilyV4 (0x04)\n#define IpFamilyV6 (0x06)\n\nstruct __PROFILE;\nstruct qmi_device_ops {\n\tint (*init)(struct __PROFILE *profile);\n\tint (*deinit)(void);\n\tint (*send)(PQCQMIMSG pRequest);\n\tvoid* (*read)(void *pData);\n};\n#ifdef CONFIG_QRTR\nextern const struct qmi_device_ops qrtr_qmidev_ops;\n#endif\nextern const struct qmi_device_ops gobi_qmidev_ops;\nextern const struct qmi_device_ops qmiwwan_qmidev_ops;\nextern const struct qmi_device_ops mbim_dev_ops;\nextern const struct qmi_device_ops atc_dev_ops;\nextern int (*qmidev_send)(PQCQMIMSG pRequest);\n\nstruct usb_device_info {\n    int idVendor;\n    int idProduct;\n    int  busnum;\n    int devnum;\n    int bNumInterfaces;\n};\n\nstruct usb_interface_info {\n    int bNumEndpoints;\n    int bInterfaceClass;\n    int bInterfaceSubClass;\n    int bInterfaceProtocol;\n    char driver[32];\n};\n\n#define LIBQMI_PROXY \"qmi-proxy\" //src/libqmi-glib/qmi-proxy.h\n#define LIBMBIM_PROXY \"mbim-proxy\"\n#define QUECTEL_QMI_PROXY \"quectel-qmi-proxy\"\n#define QUECTEL_MBIM_PROXY \"quectel-mbim-proxy\"\n#define QUECTEL_ATC_PROXY \"quectel-atc-proxy\"\n#define QUECTEL_QRTR_PROXY \"quectel-qrtr-proxy\"\n\n#ifndef bool\n#define bool uint8_t\n#endif\nstruct request_ops;\ntypedef struct __PROFILE {\n    //user input start\n    const char *apn;\n    const char *user;\n    const char *password;\n    int auth;\n    int iptype;\n    const char *metric;\n    const char *pincode;\n    char proxy[32];\n    int pdp;//pdp_context\n    int profile_index;//profile_index\n    int enable_bridge;\n    bool enable_ipv4;\n    bool enable_ipv6;\n    bool no_dhcp;\n    bool no_dns;\n    const char *logfile;\n    const char *usblogfile;\n    char expect_adapter[32];\n    int kill_pdp;\n    int replication_factor;\n    int force_apn_set;  // Force APN setting even if old config matches\n    //user input end\n\n    char qmichannel[32];\n    char usbnet_adapter[32];\n    char qmapnet_adapter[32];\n    char driver_name[32];\n    int qmap_mode;\n    int qmap_size;\n    int qmap_version;\n    int curIpFamily;\n    int rawIP;\n    int muxid;\n#ifdef CONFIG_ENABLE_QOS\n    UINT qos_id;\n#endif\n    int wda_client;\n    uint32_t udhcpc_ip;\n    IPV4_T ipv4;\n    IPV6_T ipv6;\n    UINT PCSCFIpv4Addr1;\n    UINT PCSCFIpv4Addr2;\n    UCHAR PCSCFIpv6Addr1[16];\n    UCHAR PCSCFIpv6Addr2[16];\n    bool reattach_flag;\n    int hardware_interface;\n    int software_interface;\n\n    struct usb_device_info usb_dev;\n    struct usb_interface_info usb_intf;\n\n    int usbmon_fd;\n    FILE  *usbmon_logfile_fp;\n    bool loopback_state;\n\n    char BaseBandVersion[64];\n    char old_apn[64];\n    char old_user[64];\n    char old_password[64];\n    int old_auth;\n    int old_iptype;\n#ifdef CONFIG_FOXCONN_FCC_AUTH\n    int needs_fcc_auth;  // Add this field for FCC authentication flag\n#endif\n    const struct qmi_device_ops *qmi_ops;\n    const struct request_ops *request_ops;\n    RMNET_INFO rmnet_info;\n} PROFILE_T;\n\n#ifdef QUECTEL_QMI_MERGE\n#define MERGE_PACKET_IDENTITY 0x2c7c\n#define MERGE_PACKET_VERSION 0x0001\n#define MERGE_PACKET_MAX_PAYLOAD_SIZE 56\ntypedef struct __QMI_MSG_HEADER {\n    uint16_t idenity;\n    uint16_t version;\n    uint16_t cur_len;\n    uint16_t total_len;\n} QMI_MSG_HEADER;\n\ntypedef struct __QMI_MSG_PACKET {\n    QMI_MSG_HEADER header;\n    uint16_t len;\n    char buf[4096];\n} QMI_MSG_PACKET;\n#endif\n\ntypedef enum {\n    SIM_ABSENT = 0,\n    SIM_NOT_READY = 1,\n    SIM_READY = 2, /* SIM_READY means the radio state is RADIO_STATE_SIM_READY */\n    SIM_PIN = 3,\n    SIM_PUK = 4,\n    SIM_NETWORK_PERSONALIZATION = 5,\n    SIM_BAD = 6,\n} SIM_Status;\n\n#pragma pack(pop)\n\n#define WDM_DEFAULT_BUFSIZE\t256\n#define RIL_REQUEST_QUIT    0x1000\n#define RIL_INDICATE_DEVICE_CONNECTED    0x1002\n#define RIL_INDICATE_DEVICE_DISCONNECTED    0x1003\n#define RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED    0x1004\n#define RIL_UNSOL_DATA_CALL_LIST_CHANGED    0x1005\n#define MODEM_REPORT_RESET_EVENT 0x1006\n#define RIL_UNSOL_LOOPBACK_CONFIG_IND 0x1007\n#ifdef CONFIG_REG_QOS_IND\n#define RIL_UNSOL_GLOBAL_QOS_FLOW_IND_QOS_ID 0x1008\n#endif\n\nextern pthread_mutex_t cm_command_mutex;\nextern pthread_cond_t cm_command_cond;\nextern unsigned int cm_recv_buf[1024];\nextern int cm_open_dev(const char *dev);\nextern int cm_open_proxy(const char *name);\nextern int pthread_cond_timeout_np(pthread_cond_t *cond, pthread_mutex_t * mutex, unsigned msecs);\nextern int QmiThreadSendQMITimeout(PQCQMIMSG pRequest, PQCQMIMSG *ppResponse, unsigned msecs, const char *funcname);\n#define QmiThreadSendQMI(pRequest, ppResponse) QmiThreadSendQMITimeout(pRequest, ppResponse, 30 * 1000, __func__)\nextern void QmiThreadRecvQMI(PQCQMIMSG pResponse);\nextern void udhcpc_start(PROFILE_T *profile);\nextern void udhcpc_stop(PROFILE_T *profile);\nextern void ql_set_driver_link_state(PROFILE_T *profile, int link_state);\nextern void ql_set_driver_qmap_setting(PROFILE_T *profile, QMAP_SETTING *qmap_settings);\nextern void ql_get_driver_rmnet_info(PROFILE_T *profile, RMNET_INFO *rmnet_info);\nextern void dump_qmi(void *dataBuffer, int dataLen);\nextern void qmidevice_send_event_to_main(int triger_event);\nextern void qmidevice_send_event_to_main_ext(int triger_event, void *data, unsigned len);\nextern uint8_t qmi_over_mbim_get_client_id(uint8_t QMIType);\nextern uint8_t qmi_over_mbim_release_client_id(uint8_t QMIType, uint8_t ClientId);\n#ifdef CONFIG_REG_QOS_IND\nextern UCHAR ql_get_global_qos_flow_ind_qos_id(PQCQMIMSG pResponse, UINT *qos_id);\n#endif\n#ifdef CONFIG_GET_QOS_DATA_RATE\nextern UCHAR ql_get_global_qos_flow_ind_data_rate(PQCQMIMSG pResponse, void *max_data_rate);\n#endif\n\nstruct request_ops {\n    int (*requestBaseBandVersion)(PROFILE_T *profile);\n    int (*requestSetEthMode)(PROFILE_T *profile);\n    int (*requestSetLoopBackState)(UCHAR loopback_state, ULONG replication_factor);\n    int (*requestGetSIMStatus)(SIM_Status *pSIMStatus);\n    int (*requestEnterSimPin)(const char *pPinCode);\n    int (*requestSetProfile)(PROFILE_T *profile); // 1 ~ success and apn change, 0 ~ success and no apn change, -1 ~ fail\n    int (*requestGetProfile)(PROFILE_T *profile);\n    int (*requestRegistrationState)(UCHAR *pPSAttachedState);\n    int (*requestSetupDataCall)(PROFILE_T *profile, int curIpFamily);\n    int (*requestQueryDataCall)(UCHAR  *pConnectionStatus, int curIpFamily);\n    int (*requestDeactivateDefaultPDP)(PROFILE_T *profile, int curIpFamily);\n    int (*requestGetIPAddress)(PROFILE_T *profile, int curIpFamily);\n    int (*requestGetSignalInfo)(void);\n    int (*requestGetCellInfoList)(void);\n    int (*requestGetICCID)(void);\n    int (*requestGetIMSI)(void);\n    int (*requestRadioPower)(int state);\n    int (*requestRegisterQos)(PROFILE_T *profile);\n    int (*requestGetQosInfo)(PROFILE_T *profile);\n    int (*requestGetCoexWWANState)(void);\n#ifdef CONFIG_FOXCONN_FCC_AUTH\n    int (*requestFoxconnSetFccAuthentication)(UCHAR magic_value);\n    int (*requestFoxconnSetFccAuthenticationV2)(const char *magic_string, UCHAR magic_number);\n#endif\n};\n\n// Add structure for V2 parameters\n#ifdef CONFIG_FOXCONN_FCC_AUTH\ntypedef struct {\n    char magic_string[256];\n    UCHAR magic_number;\n} FOXCONN_FCC_AUTH_V2_T;\n#endif\n\nextern const struct request_ops qmi_request_ops;\nextern const struct request_ops mbim_request_ops;\nextern const struct request_ops atc_request_ops;\n\nextern int get_driver_type(PROFILE_T *profile);\nextern BOOL qmidevice_detect(char *qmichannel, char *usbnet_adapter, unsigned bufsize, PROFILE_T *profile);\nint mhidevice_detect(char *qmichannel, char *usbnet_adapter, PROFILE_T *profile);\nint atdevice_detect(char *atchannel, char *usbnet_adapter, PROFILE_T *profile);\nextern int ql_bridge_mode_detect(PROFILE_T *profile);\nextern int ql_enable_qmi_wwan_rawip_mode(PROFILE_T *profile);\nextern int ql_qmap_mode_detect(PROFILE_T *profile);\n#ifdef CONFIG_QRTR\nextern int rtrmnet_ctl_create_vnd(char *devname, char *vndname, uint8_t muxid,\n\t\t       uint32_t qmap_version, uint32_t ul_agg_cnt, uint32_t ul_agg_size);\n#endif\n\n#define qmidev_is_gobinet(_qmichannel) (strncmp(_qmichannel, \"/dev/qcqmi\", strlen(\"/dev/qcqmi\")) == 0)\n#define qmidev_is_qmiwwan(_qmichannel) (strncmp(_qmichannel, \"/dev/cdc-wdm\", strlen(\"/dev/cdc-wdm\")) == 0)\n#define qmidev_is_pciemhi(_qmichannel) (strncmp(_qmichannel, \"/dev/mhi_\", strlen(\"/dev/mhi_\")) == 0)\n\n#define driver_is_qmi(_drv_name) (strncasecmp(_drv_name, \"qmi_wwan\", strlen(\"qmi_wwan\")) == 0)\n#define driver_is_mbim(_drv_name) (strncasecmp(_drv_name, \"cdc_mbim\", strlen(\"cdc_mbim\")) == 0)\n\nextern FILE *logfilefp;\nextern int debug_qmi;\nextern int qmidevice_control_fd[2];\nextern int g_donot_exit_when_modem_hangup;\nextern void update_resolv_conf(int iptype, const char *ifname, const char *dns1, const char *dns2);\nvoid update_ipv4_address(const char *ifname, const char *ip, const char *gw, unsigned prefix, const char *metric);\nvoid update_ipv6_address(const char *ifname, const char *ip, const char *gw, unsigned prefix, const char *metric);\nint reattach_driver(PROFILE_T *profile);\nextern void no_trunc_strncpy(char *dest, const char *src, size_t dest_size);\n\nenum\n{\n\tDRV_INVALID,\n\tSOFTWARE_QMI,\n\tSOFTWARE_MBIM,\n\tSOFTWARE_ECM_RNDIS_NCM,\n\tSOFTWARE_QRTR,\n\tHARDWARE_PCIE,\n\tHARDWARE_USB,\n};\n\nenum\n{\n    SIG_EVENT_START,\n    SIG_EVENT_CHECK,\n    SIG_EVENT_STOP,\n};\n\ntypedef enum\n{\n    DMS_OP_MODE_ONLINE,\n    DMS_OP_MODE_LOW_POWER,\n    DMS_OP_MODE_FACTORY_TEST_MODE,\n    DMS_OP_MODE_OFFLINE,\n    DMS_OP_MODE_RESETTING,\n    DMS_OP_MODE_SHUTTING_DOWN,\n    DMS_OP_MODE_PERSISTENT_LOW_POWER,\n    DMS_OP_MODE_MODE_ONLY_LOW_POWER,\n    DMS_OP_MODE_NET_TEST_GW,\n}Device_operating_mode;\n\n#ifdef CM_DEBUG\n#define dbg_time(fmt, args...) do { \\\n    fprintf(stdout, \"[%15s-%04d: %s] \" fmt \"\\n\", __FILE__, __LINE__, get_time(), ##args); \\\n\tfflush(stdout);\\\n    if (logfilefp) fprintf(logfilefp, \"[%s-%04d: %s] \" fmt \"\\n\", __FILE__, __LINE__, get_time(), ##args); \\\n} while(0)\n#else\n#define dbg_time(fmt, args...) do { \\\n    fprintf(stdout, \"[%s] \" fmt \"\\n\", get_time(), ##args); \\\n\tfflush(stdout);\\\n    if (logfilefp) fprintf(logfilefp, \"[%s] \" fmt \"\\n\", get_time(), ##args); \\\n} while(0)\n#endif\n#endif\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/QmiWwanCM.c",
    "content": "/******************************************************************************\n  @file    QmiWwanCM.c\n  @brief   QMI WWAN connectivity manager.\n\n  DESCRIPTION\n  Connectivity Management Tool for USB network adapter of Quectel wireless cellular modules.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n\n#include <stdio.h>\n#include <string.h>\n#include <termios.h>\n#include <stdio.h>\n#include <ctype.h>\n#include \"QMIThread.h\"\n\n#ifdef CONFIG_QMIWWAN\nstatic int cdc_wdm_fd = -1;\nstatic UCHAR qmiclientId[QMUX_TYPE_ALL];\n\nstatic UCHAR GetQCTLTransactionId(void) {\n    static int TransactionId = 0;\n    if (++TransactionId > 0xFF)\n        TransactionId = 1;\n    return TransactionId;\n}\n\ntypedef USHORT (*CUSTOMQCTL)(PQMICTL_MSG pCTLMsg, void *arg);\n\nstatic PQCQMIMSG ComposeQCTLMsg(USHORT QMICTLType, CUSTOMQCTL customQctlMsgFunction, void *arg) {\n    UCHAR QMIBuf[WDM_DEFAULT_BUFSIZE];\n    PQCQMIMSG pRequest = (PQCQMIMSG)QMIBuf;\n    int Length;\n\n    pRequest->QMIHdr.IFType   = USB_CTL_MSG_TYPE_QMI;\n    pRequest->QMIHdr.CtlFlags = 0x00;\n    pRequest->QMIHdr.QMIType  = QMUX_TYPE_CTL;\n    pRequest->QMIHdr.ClientId= 0x00;\n\n    pRequest->CTLMsg.QMICTLMsgHdr.CtlFlags = QMICTL_FLAG_REQUEST;\n    pRequest->CTLMsg.QMICTLMsgHdr.TransactionId = GetQCTLTransactionId();\n    pRequest->CTLMsg.QMICTLMsgHdr.QMICTLType = cpu_to_le16(QMICTLType);\n    if (customQctlMsgFunction)\n        pRequest->CTLMsg.QMICTLMsgHdr.Length = cpu_to_le16(customQctlMsgFunction(&pRequest->CTLMsg, arg) - sizeof(QCQMICTL_MSG_HDR));\n    else\n        pRequest->CTLMsg.QMICTLMsgHdr.Length = cpu_to_le16(0x0000);\n\n    pRequest->QMIHdr.Length = cpu_to_le16(le16_to_cpu(pRequest->CTLMsg.QMICTLMsgHdr.Length) + sizeof(QCQMICTL_MSG_HDR) + sizeof(QCQMI_HDR) - 1);\n    Length = le16_to_cpu(pRequest->QMIHdr.Length) + 1;\n\n    pRequest = (PQCQMIMSG)malloc(Length);\n    if (pRequest == NULL) {\n        dbg_time(\"%s fail to malloc\", __func__);\n    } else {\n        memcpy(pRequest, QMIBuf, Length);\n    }\n\n    return pRequest;\n}\n\nstatic USHORT CtlGetVersionReq(PQMICTL_MSG QCTLMsg, void *arg)\n{\n    (void)arg;\n    QCTLMsg->GetVersionReq.TLVType = QCTLV_TYPE_REQUIRED_PARAMETER;\n    QCTLMsg->GetVersionReq.TLVLength = cpu_to_le16(0x0001);\n    QCTLMsg->GetVersionReq.QMUXTypes = QMUX_TYPE_ALL;\n    return sizeof(QMICTL_GET_VERSION_REQ_MSG);\n}\n\nstatic USHORT CtlGetClientIdReq(PQMICTL_MSG QCTLMsg, void *arg) {\n   QCTLMsg->GetClientIdReq.TLVType       = QCTLV_TYPE_REQUIRED_PARAMETER;\n   QCTLMsg->GetClientIdReq.TLVLength     = cpu_to_le16(0x0001);\n   QCTLMsg->GetClientIdReq.QMIType     = ((UCHAR *)arg)[0];\n   return sizeof(QMICTL_GET_CLIENT_ID_REQ_MSG);\n}\n\nstatic USHORT CtlReleaseClientIdReq(PQMICTL_MSG QCTLMsg, void *arg) {\n   QCTLMsg->ReleaseClientIdReq.TLVType       = QCTLV_TYPE_REQUIRED_PARAMETER;\n   QCTLMsg->ReleaseClientIdReq.TLVLength     = cpu_to_le16(0x0002);\n   QCTLMsg->ReleaseClientIdReq.QMIType     = ((UCHAR *)arg)[0];\n   QCTLMsg->ReleaseClientIdReq.ClientId = ((UCHAR *)arg)[1] ;\n   return sizeof(QMICTL_RELEASE_CLIENT_ID_REQ_MSG);\n}\n\nstatic USHORT CtlLibQmiProxyOpenReq(PQMICTL_MSG QCTLMsg, void *arg)\n{\n    (void)arg;\n    const char *device_path = (const char *)(arg);\n    QCTLMsg->LibQmiProxyOpenReq.TLVType = 0x01;\n    QCTLMsg->LibQmiProxyOpenReq.TLVLength = cpu_to_le16(strlen(device_path));\n    //strcpy(QCTLMsg->LibQmiProxyOpenReq.device_path, device_path);\n    //__builtin___strcpy_chk\n    memcpy(QCTLMsg->LibQmiProxyOpenReq.device_path, device_path, strlen(device_path));\n    return sizeof(QMICTL_LIBQMI_PROXY_OPEN_MSG) + (strlen(device_path));\n}\n\nstatic int libqmi_proxy_open(const char *cdc_wdm) {\n    int ret;\n    PQCQMIMSG pResponse;\n\n    ret = QmiThreadSendQMI(ComposeQCTLMsg(QMI_MESSAGE_CTL_INTERNAL_PROXY_OPEN,\n        CtlLibQmiProxyOpenReq, (void *)cdc_wdm), &pResponse);\n    if (!ret && pResponse\n        && pResponse->CTLMsg.QMICTLMsgHdrRsp.QMUXResult == 0\n        && pResponse->CTLMsg.QMICTLMsgHdrRsp.QMUXError == 0) {\n        ret = 0;\n    }\n    else {\n        return -1;\n    }\n\n    if (pResponse)\n            free(pResponse);\n\n    return ret;\n}\n\nstatic int QmiWwanSendQMI(PQCQMIMSG pRequest) {\n    struct pollfd pollfds[]= {{cdc_wdm_fd, POLLOUT, 0}};\n    int ret;\n\n    if (cdc_wdm_fd == -1) {\n        dbg_time(\"%s cdc_wdm_fd = -1\", __func__);\n        return -ENODEV;\n    }\n\n    if (pRequest->QMIHdr.QMIType != QMUX_TYPE_CTL) {\n        pRequest->QMIHdr.ClientId = qmiclientId[pRequest->QMIHdr.QMIType];\n        if (pRequest->QMIHdr.ClientId == 0) {\n            dbg_time(\"QMIType %d has no clientID\", pRequest->QMIHdr.QMIType);\n            return -ENODEV;\n        }\n\n        if (pRequest->QMIHdr.QMIType == QMUX_TYPE_WDS_IPV6)\n            pRequest->QMIHdr.QMIType = QMUX_TYPE_WDS;\n    }\n\n    do {\n        ret = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), 5000);\n    } while ((ret < 0) && (errno == EINTR));\n\n    if (pollfds[0].revents & POLLOUT) {\n        ssize_t nwrites = le16_to_cpu(pRequest->QMIHdr.Length) + 1;\n        ret = write(cdc_wdm_fd, pRequest, nwrites);\n        if (ret == nwrites) {\n            ret = 0;\n        } else {\n            dbg_time(\"%s write=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\n        }\n    } else {\n        dbg_time(\"%s poll=%d, revents = 0x%x, errno: %d (%s)\", __func__, ret, pollfds[0].revents, errno, strerror(errno));\n    }\n\n    return ret;\n}\n\nstatic UCHAR QmiWwanGetClientID(UCHAR QMIType) {\n    PQCQMIMSG pResponse;\n\n    QmiThreadSendQMI(ComposeQCTLMsg(QMICTL_GET_CLIENT_ID_REQ, CtlGetClientIdReq, &QMIType), &pResponse);\n\n    if (pResponse) {\n        USHORT QMUXResult = cpu_to_le16(pResponse->CTLMsg.QMICTLMsgHdrRsp.QMUXResult);       // QMI_RESULT_SUCCESS\n        USHORT QMUXError = cpu_to_le16(pResponse->CTLMsg.QMICTLMsgHdrRsp.QMUXError);        // QMI_ERR_INVALID_ARG\n        //UCHAR QMIType = pResponse->CTLMsg.GetClientIdRsp.QMIType;\n        UCHAR ClientId = pResponse->CTLMsg.GetClientIdRsp.ClientId;\n\n        if (!QMUXResult && !QMUXError && (QMIType == pResponse->CTLMsg.GetClientIdRsp.QMIType)) {\n            switch (QMIType) {\n                case QMUX_TYPE_WDS: dbg_time(\"Get clientWDS = %d\", ClientId); break;\n                case QMUX_TYPE_DMS: dbg_time(\"Get clientDMS = %d\", ClientId); break;\n                case QMUX_TYPE_NAS: dbg_time(\"Get clientNAS = %d\", ClientId); break;\n                case QMUX_TYPE_QOS: dbg_time(\"Get clientQOS = %d\", ClientId); break;\n                case QMUX_TYPE_WMS: dbg_time(\"Get clientWMS = %d\", ClientId); break;\n                case QMUX_TYPE_PDS: dbg_time(\"Get clientPDS = %d\", ClientId); break;\n                case QMUX_TYPE_UIM: dbg_time(\"Get clientUIM = %d\", ClientId); break;\n                case QMUX_TYPE_COEX: dbg_time(\"Get clientCOEX = %d\", ClientId); break;\n                case QMUX_TYPE_WDS_ADMIN: dbg_time(\"Get clientWDA = %d\", ClientId);\n                break;\n                default: break;\n            }\n            return ClientId;\n        }\n    }\n    return 0;\n}\n\nstatic int QmiWwanReleaseClientID(QMI_SERVICE_TYPE QMIType, UCHAR ClientId) {\n    UCHAR argv[] = {QMIType, ClientId};\n    QmiThreadSendQMI(ComposeQCTLMsg(QMICTL_RELEASE_CLIENT_ID_REQ, CtlReleaseClientIdReq, argv), NULL);\n    return 0;\n}\n\nstatic int QmiWwanInit(PROFILE_T *profile) {\n    unsigned i;\n    int ret;\n    PQCQMIMSG pResponse;\n\n    if (profile->proxy[0] && !strcmp(profile->proxy, LIBQMI_PROXY)) {\n        ret = libqmi_proxy_open(profile->qmichannel);\n        if (ret)\n            return ret;\n    }\n\n    if (!profile->proxy[0]) {\n        for (i = 0; i < 10; i++) {\n            ret = QmiThreadSendQMITimeout(ComposeQCTLMsg(QMICTL_SYNC_REQ, NULL, NULL), NULL, 1 * 1000, __func__);\n            if (!ret)\n                break;\n            sleep(1);\n        }\n        if (ret)\n            return ret;\n    }\n\n    QmiThreadSendQMI(ComposeQCTLMsg(QMICTL_GET_VERSION_REQ, CtlGetVersionReq, NULL), &pResponse);\n    if (profile->qmap_mode) {\n        if (pResponse) {\n            if (pResponse->CTLMsg.QMICTLMsgHdrRsp.QMUXResult == 0 && pResponse->CTLMsg.QMICTLMsgHdrRsp.QMUXError == 0) {\n                uint8_t  NumElements = 0;\n\n                for (NumElements = 0; NumElements < pResponse->CTLMsg.GetVersionRsp.NumElements; NumElements++) {\n#if 0\n                    dbg_time(\"QMUXType = %02x Version = %d.%d\",\n                        pResponse->CTLMsg.GetVersionRsp.TypeVersion[NumElements].QMUXType,\n                        pResponse->CTLMsg.GetVersionRsp.TypeVersion[NumElements].MajorVersion,\n                        pResponse->CTLMsg.GetVersionRsp.TypeVersion[NumElements].MinorVersion);\n#endif\n                    if (pResponse->CTLMsg.GetVersionRsp.TypeVersion[NumElements].QMUXType == QMUX_TYPE_WDS_ADMIN)\n                        profile->qmap_version = (pResponse->CTLMsg.GetVersionRsp.TypeVersion[NumElements].MinorVersion > 16);\n                }\n            }\n        }\n    }\n    if (pResponse) free(pResponse);\n    qmiclientId[QMUX_TYPE_WDS] = QmiWwanGetClientID(QMUX_TYPE_WDS);\n    if (profile->enable_ipv6)\n        qmiclientId[QMUX_TYPE_WDS_IPV6] = QmiWwanGetClientID(QMUX_TYPE_WDS);\n    qmiclientId[QMUX_TYPE_DMS] = QmiWwanGetClientID(QMUX_TYPE_DMS);\n    qmiclientId[QMUX_TYPE_NAS] = QmiWwanGetClientID(QMUX_TYPE_NAS);\n    qmiclientId[QMUX_TYPE_UIM] = QmiWwanGetClientID(QMUX_TYPE_UIM);\n    qmiclientId[QMUX_TYPE_WDS_ADMIN] = QmiWwanGetClientID(QMUX_TYPE_WDS_ADMIN);\n#ifdef CONFIG_COEX_WWAN_STATE\n    qmiclientId[QMUX_TYPE_COEX] = QmiWwanGetClientID(QMUX_TYPE_COEX);\n#endif\n#ifdef CONFIG_ENABLE_QOS\n    qmiclientId[QMUX_TYPE_QOS] = QmiWwanGetClientID(QMUX_TYPE_QOS);\n#endif\n    profile->wda_client = qmiclientId[QMUX_TYPE_WDS_ADMIN];\n\n    return 0;\n}\n\nstatic int QmiWwanDeInit(void) {\n    unsigned int i;\n    for (i = 0; i < sizeof(qmiclientId)/sizeof(qmiclientId[0]); i++)\n    {\n        if (qmiclientId[i] != 0)\n        {\n            QmiWwanReleaseClientID((QMUX_TYPE_WDS_IPV6 == i ? QMUX_TYPE_WDS : i), qmiclientId[i]);\n            qmiclientId[i] = 0;\n        }\n    }\n\n    return 0;\n}\n\nstatic ssize_t qmi_proxy_read (int fd, void *buf, size_t size) {\n    ssize_t nreads;\n    PQCQMI_HDR pHdr = (PQCQMI_HDR)buf;\n\n    nreads = read(fd, pHdr, sizeof(QCQMI_HDR));\n    if (nreads == sizeof(QCQMI_HDR) && le16_to_cpu(pHdr->Length) < size) {\n        nreads += read(fd, pHdr+1, le16_to_cpu(pHdr->Length) + 1 - sizeof(QCQMI_HDR));\n    }\n\n    return nreads;\n}\n\n#ifdef QUECTEL_QMI_MERGE\nstatic int QmiWwanMergeQmiRsp(void *buf, ssize_t *src_size) {\n    static QMI_MSG_PACKET s_QMIPacket;\n    QMI_MSG_HEADER *header = NULL;\n    ssize_t size = *src_size;\n\n    if((uint16_t)size < sizeof(QMI_MSG_HEADER))\n        return -1;\n\n    header = (QMI_MSG_HEADER *)buf;\n    if(le16_to_cpu(header->idenity) != MERGE_PACKET_IDENTITY || le16_to_cpu(header->version) != MERGE_PACKET_VERSION || le16_to_cpu(header->cur_len) > le16_to_cpu(header->total_len)) \n        return -1;\n\n    if(le16_to_cpu(header->cur_len) == le16_to_cpu(header->total_len)) {\n        *src_size = le16_to_cpu(header->total_len);\n        memcpy(buf, buf + sizeof(QMI_MSG_HEADER), *src_size);\n        s_QMIPacket.len = 0;  \n        return 0;\n    } \n\n    memcpy(s_QMIPacket.buf + s_QMIPacket.len, buf + sizeof(QMI_MSG_HEADER), le16_to_cpu(header->cur_len));\n    s_QMIPacket.len += le16_to_cpu(header->cur_len);\n\n    if (le16_to_cpu(header->cur_len) < MERGE_PACKET_MAX_PAYLOAD_SIZE || s_QMIPacket.len >= le16_to_cpu(header->total_len)) { \n       memcpy(buf, s_QMIPacket.buf, s_QMIPacket.len);      \n       *src_size = s_QMIPacket.len;\n       s_QMIPacket.len = 0;\n       return 0;           \n    }\n\n    return -1;\n}\n#endif\n\nstatic void * QmiWwanThread(void *pData) {\n    PROFILE_T *profile = (PROFILE_T *)pData;\n    const char *cdc_wdm = (const char *)profile->qmichannel;\n    int wait_for_request_quit = 0;\n    char num = cdc_wdm[strlen(cdc_wdm)-1];\n\t\n    if (profile->proxy[0]) {\n         if (!strncmp(profile->proxy, QUECTEL_QMI_PROXY, strlen(QUECTEL_QMI_PROXY))) {\n            snprintf(profile->proxy, sizeof(profile->proxy), \"%s%c\", QUECTEL_QMI_PROXY, num);\n         }\n    }\n    else if (!strncmp(cdc_wdm, \"/dev/mhi_IPCR\", strlen(\"/dev/mhi_IPCR\"))) {\n        snprintf(profile->proxy, sizeof(profile->proxy), \"%s%c\", QUECTEL_QRTR_PROXY, num);\n    }\n    else if (profile->qmap_mode > 1) {\n        snprintf(profile->proxy, sizeof(profile->proxy), \"%s%c\", QUECTEL_QMI_PROXY, num);\n    }\n    \n    if (profile->proxy[0])\n        cdc_wdm_fd = cm_open_proxy(profile->proxy);\n    else\n        cdc_wdm_fd = cm_open_dev(cdc_wdm);\n\n    if (cdc_wdm_fd == -1) {\n        dbg_time(\"%s Failed to open %s, errno: %d (%s)\", __func__, cdc_wdm, errno, strerror(errno));\n        qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_DISCONNECTED);\n        pthread_exit(NULL);\n        return NULL;\n    }\n\n    dbg_time(\"cdc_wdm_fd = %d\", cdc_wdm_fd);\n\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_CONNECTED);\n    while (1) {\n        struct pollfd pollfds[] = {{qmidevice_control_fd[1], POLLIN, 0}, {cdc_wdm_fd, POLLIN, 0}};\n        int ne, ret, nevents = sizeof(pollfds)/sizeof(pollfds[0]);\n\n        do {\n            ret = poll(pollfds, nevents, wait_for_request_quit ? 1000 : -1);\n         } while ((ret < 0) && (errno == EINTR));\n\n\tif (ret == 0 && wait_for_request_quit) {\n            QmiThreadRecvQMI(NULL);\n            continue;\n\t}\n\n        if (ret <= 0) {\n            dbg_time(\"%s poll=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\n            break;\n        }\n\n        for (ne = 0; ne < nevents; ne++) {\n            int fd = pollfds[ne].fd;\n            short revents = pollfds[ne].revents;\n\n            //dbg_time(\"{%d, %x, %x}\", pollfds[ne].fd, pollfds[ne].events, pollfds[ne].revents);\n\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\n                dbg_time(\"%s poll err/hup/inval\", __func__);\n                dbg_time(\"poll fd = %d, events = 0x%04x\", fd, revents);\n                if (fd == cdc_wdm_fd) {\n                } else {\n                }\n                if (revents & (POLLHUP | POLLNVAL)) //EC20 bug, Can get POLLERR\n                    goto __QmiWwanThread_quit;\n            }\n\n            if ((revents & POLLIN) == 0)\n                continue;\n\n            if (fd == qmidevice_control_fd[1]) {\n                int triger_event;\n                if (read(fd, &triger_event, sizeof(triger_event)) == sizeof(triger_event)) {\n                    //DBG(\"triger_event = 0x%x\", triger_event);\n                    switch (triger_event) {\n                        case RIL_REQUEST_QUIT:\n                            goto __QmiWwanThread_quit;\n                        break;\n                        case SIG_EVENT_STOP:\n                            wait_for_request_quit = 1;\n                        break;\n                        default:\n                        break;\n                    }\n                }\n            }\n\n            if (fd == cdc_wdm_fd) {\n                ssize_t nreads;\n                PQCQMIMSG pResponse = (PQCQMIMSG)cm_recv_buf;\n                \n                if (!profile->proxy[0])\n                    nreads = read(fd, cm_recv_buf, sizeof(cm_recv_buf));\n                else\n                    nreads = qmi_proxy_read(fd, cm_recv_buf, sizeof(cm_recv_buf));\n                //dbg_time(\"%s read=%d errno: %d (%s)\",  __func__, (int)nreads, errno, strerror(errno));\n                if (nreads <= 0) {\n                    dbg_time(\"%s read=%d errno: %d (%s)\",  __func__, (int)nreads, errno, strerror(errno));\n                    break;\n                }\n#ifdef QUECTEL_QMI_MERGE\n                if((profile->qmap_mode == 0 || profile->qmap_mode == 1) && QmiWwanMergeQmiRsp(cm_recv_buf, &nreads))\n                    continue;             \n#endif\n                if (nreads != (le16_to_cpu(pResponse->QMIHdr.Length) + 1)) {\n                    dbg_time(\"%s nreads=%d,  pQCQMI->QMIHdr.Length = %d\",  __func__, (int)nreads, le16_to_cpu(pResponse->QMIHdr.Length));\n                    continue;\n                }\n\n                QmiThreadRecvQMI(pResponse);\n            }\n        }\n    }\n\n__QmiWwanThread_quit:\n    if (cdc_wdm_fd != -1) { close(cdc_wdm_fd); cdc_wdm_fd = -1; }\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_DISCONNECTED);\n    QmiThreadRecvQMI(NULL); //main thread may pending on QmiThreadSendQMI()\n    dbg_time(\"%s exit\", __func__);\n    pthread_exit(NULL);\n    return NULL;\n}\n\nconst struct qmi_device_ops qmiwwan_qmidev_ops = {\n    .init = QmiWwanInit,\n    .deinit = QmiWwanDeInit,\n    .send = QmiWwanSendQMI,\n    .read = QmiWwanThread,\n};\n\nuint8_t qmi_over_mbim_get_client_id(uint8_t QMIType) {\n    return QmiWwanGetClientID(QMIType);\n}\n\nuint8_t qmi_over_mbim_release_client_id(uint8_t QMIType, uint8_t ClientId) {\n    return QmiWwanReleaseClientID(QMIType, ClientId);\n}\n#endif\n\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/ReleaseNote.txt",
    "content": "Release Notes\n\n[V1.6.5]\nDate:   7/3/2023\nenhancement:\n  1. Fix the issue of qmi client id leakage caused by kill 9 killing the client of quectel-qmi-proxy\n  2. Fix wds_ipv6 client ID can't be released issue\n  3. Fix wds_ipv6 client ID can't be released issue\n  4. Resolve PDP_ Context&Profile_ The issue of index mixing\n  5. Add parameter - d to obtain IP and DNS information through qmi\n  6. Fix mbim dialing. When the user does not specify apn through - s, prompt the user and exit the dialing program\n  7. Prioritize the use of IP commands for optimization, and use ifconfig if not available\n  8. Optimize and add/remove copyright\nfix:\n\n\n[V1.6.4]\nDate:   9/7/2022\nenhancement:\n  1. set cflags as -Wall -Wextra -Werror -O1, and fix compile errors\n  2. some code refactoring\n  3. add quectel-qrtr-proxy\nfix:\n  1. netmask error when use ifconfig on little endian cpu\n\n[V1.6.2]\nDate:   11/18/2021\nenhancement:\n\t1. support 'LTE && WiFi Coexistence Solution via QMI'.\n\t   If customer want use this feature, need enable CONFIG_COEX_WWAN_STATE in QMIThread.h \n\n[V1.6.1]\nDate:   7/20/2021\nenhancement:\n\t1. add requestGetCellInfoList requestRadioPower\n\t2. add QMI OVER MBIM \n\t3. support qrtr and rmnet\n\t4. support RG500U PCIE \n\t5. add qos service && get qos flow data_rate_max func\nfix:\n  1. mbim: increase mbim open timeout to 3 seconds. some modem take long time for open cmd.\n  2. support MsChapV2\n  3. mbim: invalid memory access when only get one DNS\n  4. some bug fix for use AT Command to setup data call\n\n[V1.6.0.26]\nDate:   4/22/2021\nenhancement:\n\t1. add lots of log file to show how to use this tool\n\t2. support pcie mhi multiple call\n\t3. at command: support EC200U/EC200T/EC200S/RG801H/RG500U/\nfix:\n  1. mbim-proxy: fix errors on big endian cpu, ignore mbim open/close cmd from quectel-cm \n\n[V1.6.0.25]\nDate:   4/8/2021\nenhancement:\nfix:\n  1. fix compile error when use gcc 9.3.0\n  2. fix yocto 'QA Issue: No GNU_HASH in the ELF binary'\n\n[V1.6.0.24]\nDate:   3/9/2021\nenhancement:\n  1. '-p [quectel-][qmi|mbim]-proxy', can connect to quectel/libqmi/libmbim's proxy, even only one data\n  2. set variable s_9x07 as 1 (from 0), most of modems are base on MDM90x7 and later QCOM chip.\nfix:\n  1. define CHAR as signed char\n  2. mofidy Makefile to generate more compile warnnings and fix them\n\n[V1.6.0.23]\nDate:   2/26/2021\nenhancement:\n  1. support 'AT+QNETDEVCTL' (not release)\nfix:\n   1. modify help/usage\n   2. fix some memroy access error in mbim-cm.c\n\n[V1.6.0.22]\nDate:   2/4/2021\nenhancement:\n  1. support connect to libqmi's qmi-proxy\n  2. only allow ' 0/1/2/none/pap/chap' for auth of '-s'\n  3. '-m iface-idx' bind QMAP data call to wwan0_<iface_idx>\nfix:\n\n[V1.6.0.21]\nDate:   1/28/2021\nenhancement:\n  1. print 5G signal\nfix:\n  1. fix compile errors: -Werror=format-truncation=\n  \n[V1.6.0.20]\nDate:   12/29/2020\nenhancement:\n  1. Code refactoring\n  2. support 'AT+QNETDEVCTL' (not release)\nfix:\n\n[V1.6.0.19]\nDate:   12/4/2020\nenhancement:\n  1. if 'udhcpc's default.script' missed, directy set ip/dns/route by 'ip' co,mand\nfix:\n\n[V1.6.0.18]\nDate:   12/4/2020\nenhancement:\n  1. Code refactoring\nfix:\n\n[V1.6.0.17]\nDate:   8/25/2020\nenhancement:\n  1. support MBIM multi-call\n  2. support unisoc RG500U mbim\n  3. QUECTEL_QMI_MERGE: some SOC can not read more then 64 bytes (QMI)data via USB Endpoint 0\nfix:\n\n[V1.6.0.15]\nDate:   7/24/2020\nenhancement:\nfix:\n  1. QMAP multi-call, AT+CFUN=4 then AT+CFUN=1, only one call can obtain IP by DHCP\n \t  \n[V1.6.0.14]\nDate:   6/10/2020 \nenhancement:\n  1. support X55's GobiNet LOOPBACK\nfix:\n  1. very old uclib do not support htole32 and pthread_condattr_setclock\n  2. pthread_cond_wait tv_nsec >= 1000000000U is wrong\n  3. do not close socket in udhcpc.c ifc_get_addr()\n \t                                  \n[V1.6.0.13]\nDate:   6/9/2020 \nenhancement:\n  1. add some example for openwrt, marco 'QL_OPENWER_NETWORK_SETUP'\nfix:\n\n[V1.6.0.12]\nDate:   5/29/2020 \nenhancement:\nfix:\n\t1. some EM12's usb-net-qmi/mbim interface is at 8 (not 4)\n\n[V1.6.0.11]\nDate:   5/28/2020 \nenhancement:\nfix:\n\t1. fix mbim debug on Big Endian CPU\n\n[V1.6.0.10]\nDate:   5/25/2020 \nenhancement:\nfix:\n\t1. set QMAP .ul_data_aggregation_max_datagrams to 11 (from 16)\n\n[V1.6.0.9]\nDate:   5/22/2020 \nenhancement:\nfix:\n\t1. dial fail when register to 5G-SA\n\n[V1.6.0.8]\nDate:   4/30/2020\nenhancement:\n  1. support '-b' to seletc brige mode\nfix:\n\n[V1.6.0.7]\nDate:   4/29/2020\nenhancement:\n  1. support QMAP multi-call for qmi_wwan_q and pcie_mhi 's rmnet driver\nfix:\n\n[V1.6.0.6]\nDate:   4/20/2020\nenhancement:\n  1. support '-k pdn_idx' to hangup call '-n pdn_idx'\nfix:\n  1. fix set dl_minimum_padding as 0, modems do not support this featrue\n\n[V1.6.0.5]\nDate:   4/10/2020\nenhancement:\n  1. support X55's QMAPV5 for PCIE\nfix:\n\n[V1.6.0.3]\nDate:   4/8/2020\nenhancement:\n  1. support multi-modems all use multi-data-calls\nfix:\n\n[V1.6.0.2]\nDate:   4/7/2020\nenhancement:\n  1. support X55's QMAPV5 for USB\nfix:\n\n[V1.6.0.1]\nDate:   4/1/2020\nenhancement:\n  1. support QMAP UL AGG (multi data call)\nfix:\n  1. some EM12's usb-net-qmi/mbim interface is at 8 (not 4)\n\n[V1.5.9]\nDate:   3/4/2020\nenhancement:\n  1. support pcie mhi multi-APN data call\n  3. support QMAP UL AGG (single data call)\nfix:\n  1. set 4 bytes aligned for mbim parameters, or cause dial mbim call fail\n\n[V1.5.8]\nDate:   2/18/2020\nenhancement:\n  1. support '-l 14' X55's loopback function\nfix:\n\n[V1.5.7]\nDate:   2/6/2020\nenhancement:\n  1. support '-u usbmon_log_file' to catch usbmon log\nfix:\n\n[V1.5.6]\nDate:   1/20/202\nenhancement:\n  1. show driver name and version\n  2. support PCSCF\n  3. support bridge in mbim\nfix:\n\n[V1.5.5]\nDate:   12/31/2019\nenhancement:\nfix:\n  1. fix some memory access bug in mbim-cm.c\n\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.5.4]\nDate:   12/17/2019\nenhancement:\n  1. Add copyright\n  2. auto detect pcie mhi /dev/mhi*\nfix:\n\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.5.3]\nDate:   2019/12/11\nenhancement:\n1. support show SignalInfo, controlled by macro CONFIG_SIGNALINFO\n2. support show 5G_NSA/5G_NA\n3. support Microsoft Extend MBIM message\nfix:\n1. quectel-qmi-proxy bugs on Big-Endian CPU\n\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.5.2]\nDate:   12/2/2019\nenhancement:\n  1. support requestGetSignalInfo()\nfix:\n\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.4.1]\nDate:   10/23/2019 \nenhancement:\n  1. support QMI_CTL_REVOKE_CLIENT_ID_IND (Quectel define QMI)\n  2. add copyright\nfix:\n  1. remove SIGUSR\n\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.3.10]\nDate:   10/14/2019\nenhancement:\n  1. increase retry interval\nfix:\n\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.2.1]\nDate:   2019/02/26\nenhancement:\n1. Implement help message.\n\nroot@ubuntu:# ./quectel-CM -h\n[02-26_10:39:21:353] Usage: ./quectel-CM [options]\n[02-26_10:39:21:353] -s [apn [user password auth]]          Set apn/user/password/auth get from your network provider\n[02-26_10:39:21:353] -p pincode                             Verify sim card pin if sim card is locked\n[02-26_10:39:21:353] -f logfilename                         Save log message of this program to file\n[02-26_10:39:21:353] -i interface                           Specify network interface(default auto-detect)\n[02-26_10:39:21:353] -4                                     IPv4 protocol\n[02-26_10:39:21:353] -6                                     IPv6 protocol\n[02-26_10:39:21:353] -m muxID                               Specify muxid when set multi-pdn data connection.\n[02-26_10:39:21:353] -n channelID                           Specify channelID when set multi-pdn data connection(default 1).\n[02-26_10:39:21:353] [Examples]\n[02-26_10:39:21:353] Example 1: ./quectel-CM\n[02-26_10:39:21:353] Example 2: ./quectel-CM -s 3gnet\n[02-26_10:39:21:353] Example 3: ./quectel-CM -s 3gnet carl 1234 0 -p 1234 -f gobinet_log.txt\nroot@ubuntu:#\n2. Support bridge mode when set multi-pdn data connections.\n3. Host device can access network in bridge mode.\n\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.1.46]\nDate:   2019/02/18\nenhancement:\n1. support only IPV6 data call. quectel-CM now support three dialing methods: IPV4 only, IPV6 only, IPV4V6.\n\t./quectel-CM  -4(or no argument)  only IPV4\n\t\t\t\t  -6\t        only IPV6\n\t\t\t\t  -4 -6               IPV4 && IPV6\n\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.1.45]\nDate:   2018/09/13\nenhancement:\n1. support EG12 PCIE interface\n\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.1.44]\nDate:   2018/09/10\nenhancement:\n1. support setup IPV4&IPV6 data call.\n\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.1.43]\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.1.42]\nDate:   2018/08/29\nenhancement:\n1. support QMI_WWAN's QMAP fucntion and bridge mode, please contact Quectel FAE to get qmi_wwan.c patch.\n   when enable QMI_WWAN's QMAP IP Mux function, must run 'quectel-qmi-proxy -d /dev/cdc-wdmX' before quectel-CM\n\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.1.41]\nDate:   2018/05/24\nenhancement:\n1. fix a cdma data call error\n\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.1.40]\nDate:   2018/05/12\nenhancement:\n1. support GobiNet's QMAP fucntion and bridge mode.\n\t 'Quectel_WCDMA&LTE_Linux&Android_GobiNet_Driver_V1.3.5' and later version is required to use QMAP and bridge mode.\n\t for detail, please refer to GobiNet Driver\n\t \n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/at_tok.c",
    "content": "/* //device/system/reference-ril/at_tok.c\n**\n** Copyright 2006, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\");\n** you may not use this file except in compliance with the License.\n** You may obtain a copy of the License at\n**\n**     http://www.apache.org/licenses/LICENSE-2.0\n**\n** Unless required by applicable law or agreed to in writing, software\n** distributed under the License is distributed on an \"AS IS\" BASIS,\n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n** See the License for the specific language governing permissions and\n** limitations under the License.\n*/\n\n#include \"at_tok.h\"\n#include <string.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <stdlib.h>\n#include <stdarg.h>\n\n/**\n * Starts tokenizing an AT response string\n * returns -1 if this is not a valid response string, 0 on success.\n * updates *p_cur with current position\n */\nint at_tok_start(char **p_cur)\n{\n    if (*p_cur == NULL) {\n        return -1;\n    }\n\n    // skip prefix\n    // consume \"^[^:]:\"\n\n    *p_cur = strchr(*p_cur, ':');\n\n    if (*p_cur == NULL) {\n        return -1;\n    }\n\n    (*p_cur)++;\n\n    return 0;\n}\n\nstatic void skipWhiteSpace(char **p_cur)\n{\n    if (*p_cur == NULL) return;\n\n    while (**p_cur != '\\0' && isspace(**p_cur)) {\n        (*p_cur)++;\n    }\n}\n\nstatic void skipNextComma(char **p_cur)\n{\n    if (*p_cur == NULL) return;\n\n    while (**p_cur != '\\0' && **p_cur != ',') {\n        (*p_cur)++;\n    }\n\n    if (**p_cur == ',') {\n        (*p_cur)++;\n    }\n}\n\nstatic char * nextTok(char **p_cur)\n{\n    char *ret = NULL;\n\n    skipWhiteSpace(p_cur);\n\n    if (*p_cur == NULL) {\n        ret = NULL;\n    } else if (**p_cur == '\"') {\n        (*p_cur)++;\n        ret = strsep(p_cur, \"\\\"\");\n        skipNextComma(p_cur);\n    } else {\n        ret = strsep(p_cur, \",\");\n    }\n\n    return ret;\n}\n\n\n/**\n * Parses the next integer in the AT response line and places it in *p_out\n * returns 0 on success and -1 on fail\n * updates *p_cur\n * \"base\" is the same as the base param in strtol\n */\n\nstatic int at_tok_nextint_base(char **p_cur, int *p_out, int base, int  uns)\n{\n    char *ret;\n\n    if (*p_cur == NULL) {\n        return -1;\n    }\n\n    ret = nextTok(p_cur);\n\n    if (ret == NULL) {\n        return -1;\n    } else {\n        long l;\n        char *end;\n\n        if (uns)\n            l = strtoul(ret, &end, base);\n        else\n            l = strtol(ret, &end, base);\n\n        *p_out = (int)l;\n\n        if (end == ret) {\n            return -1;\n        }\n    }\n\n    return 0;\n}\n\n/**\n * Parses the next base 10 integer in the AT response line\n * and places it in *p_out\n * returns 0 on success and -1 on fail\n * updates *p_cur\n */\nint at_tok_nextint(char **p_cur, int *p_out)\n{\n    return at_tok_nextint_base(p_cur, p_out, 10, 0);\n}\n\n/**\n * Parses the next base 16 integer in the AT response line\n * and places it in *p_out\n * returns 0 on success and -1 on fail\n * updates *p_cur\n */\nint at_tok_nexthexint(char **p_cur, int *p_out)\n{\n    return at_tok_nextint_base(p_cur, p_out, 16, 1);\n}\n\nint at_tok_nextbool(char **p_cur, char *p_out)\n{\n    int ret;\n    int result;\n\n    ret = at_tok_nextint(p_cur, &result);\n\n    if (ret < 0) {\n        return -1;\n    }\n\n    // booleans should be 0 or 1\n    if (!(result == 0 || result == 1)) {\n        return -1;\n    }\n\n    if (p_out != NULL) {\n        *p_out = (char)result;\n    }\n\n    return ret;\n}\n\nint at_tok_nextstr(char **p_cur, char **p_out)\n{\n    if (*p_cur == NULL) {\n        return -1;\n    }\n\n    *p_out = nextTok(p_cur);\n\n    return 0;\n}\n\n/** returns 1 on \"has more tokens\" and 0 if no */\nint at_tok_hasmore(char **p_cur)\n{\n    return ! (*p_cur == NULL || **p_cur == '\\0');\n}\n\nint at_tok_count(const char *in_line)\n{\n    int commas = 0;\n    const char *p;\n\n    if (!in_line)\n        return 0;\n\n    for (p = in_line; *p != '\\0' ; p++) {\n        if (*p == ',') commas++;\n    }\n\n    return commas;\n}\n\n//fmt: d ~ int, x ~ hexint, b ~ bool, s ~ str\nint at_tok_scanf(const char *in_line, const char *fmt, ...)\n{\n    int n = 0;\n    int err;\n    va_list ap;\n    const char *p = fmt;\n    void *d;\n    void *dump;\n    static char s_line[1024];\n    char *line = s_line;\n\n    if (!in_line)\n        return 0;\n\n    strncpy(s_line, in_line, sizeof(s_line) - 1);\n\n    va_start(ap, fmt);\n\n    err = at_tok_start(&line);\n    if (err < 0) goto error;\n\n    for (; *p; p++) {\n        if (*p == ',' || *p == ' ')\n            continue;\n\n        if (*p != '%') {\n            goto error;\n        }\n        p++;\n\n        d = va_arg(ap, void *);\n        if (!d)\n            d = &dump;\n\n        if (!at_tok_hasmore(&line))\n            break;\n        \n        if (*line == '-' && *(line + 1) == ',') {\n            line += 2;\n            n++;\n            if (*p == 'd')\n                *(int *)d = -1;\n            continue;\n         }\n\n        switch(*p) {\n            case 'd':\n                err = at_tok_nextint(&line, (int *)d);\n                if (err < 0) goto error;\n           break;\n            case 'x':\n                err = at_tok_nexthexint(&line, (int *)d);\n                if (err < 0) goto error;\n            break;\n            case 'b':\n                err = at_tok_nextbool(&line, (char *)d);\n                if (err < 0) goto error;\n            break;\n            case 's':\n                err = at_tok_nextstr(&line, (char **)d); //if strdup(line), here return free memory to caller\n                if (err < 0) goto error;\n            break;\n            default:\n                goto error;\n            break;\n        }\n\n        n++;\n    }\n\n    va_end(ap);\n\nerror:\n    //free(line);\n    return n;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/at_tok.h",
    "content": "/* //device/system/reference-ril/at_tok.h\n**\n** Copyright 2006, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\");\n** you may not use this file except in compliance with the License.\n** You may obtain a copy of the License at\n**\n**     http://www.apache.org/licenses/LICENSE-2.0\n**\n** Unless required by applicable law or agreed to in writing, software\n** distributed under the License is distributed on an \"AS IS\" BASIS,\n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n** See the License for the specific language governing permissions and\n** limitations under the License.\n*/\n\n#ifndef AT_TOK_H\n#define AT_TOK_H 1\n\nint at_tok_start(char **p_cur);\nint at_tok_nextint(char **p_cur, int *p_out);\nint at_tok_nexthexint(char **p_cur, int *p_out);\n\nint at_tok_nextbool(char **p_cur, char *p_out);\nint at_tok_nextstr(char **p_cur, char **out);\n\nint at_tok_hasmore(char **p_cur);\nint at_tok_count(const char *in_line);\nint at_tok_scanf(const char *line, const char *fmt, ...);\n\n#endif /*AT_TOK_H */\n\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/atc.c",
    "content": "/******************************************************************************\n  @file    atc.c\n  @brief   at command.\n\n  DESCRIPTION\n  Connectivity Management Tool for USB network adapter of Quectel wireless cellular modules.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n#include <unistd.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <fcntl.h>\n#include <stddef.h>\n#include <pthread.h>\n#include <errno.h>\n#include <time.h>\n#include <signal.h>\n#include <getopt.h>\n#include <poll.h>\n#include <sys/time.h>\n#include <endian.h>\n#include <time.h>\n#include <sys/types.h>\n#include <limits.h>\n#include <inttypes.h>\n\nextern int asprintf(char **s, const char *fmt, ...);\n\n#include \"QMIThread.h\"\n\n#include \"atchannel.h\"\n#include \"at_tok.h\"\n\nstatic int asr_style_atc = 0;\nstatic int s_pdp;\n#define safe_free(__x) do { if (__x) { free((void *)__x); __x = NULL;}} while(0)\n#define safe_at_response_free(__x) { if (__x) { at_response_free(__x); __x = NULL;}}\n\n#define at_response_error(err, p_response) \\\n    (err \\\n    || p_response == NULL \\\n    || p_response->finalResponse == NULL \\\n    || p_response->success == 0)\n\nstatic int atc_init(PROFILE_T *profile) {\n    int err;\n    char *cmd;\n    ATResponse *p_response = NULL;\n\n    if (profile->proxy[0])  {\n        s_pdp = profile->pdp;\n        err = at_send_command_singleline(\"AT+QNETDEVSTATUS=?\", \"+QNETDEVSTATUS:\", &p_response);\n        if (at_response_error(err, p_response))\n            asr_style_atc = 1; //EC200T/EC100Y do not support this AT, but RG801/RG500U support\n        safe_at_response_free(p_response);\n\t\t\n        return err;\n    }\n\n    err = at_handshake();\n    if (err) {\n        dbg_time(\"handshake fail, TODO ... \");\n        goto exit;\n    }\n\t\n    s_pdp = profile->pdp;\n    at_send_command_singleline(\"AT+QCFG=\\\"usbnet\\\"\", \"+QCFG:\", NULL);\n    at_send_command_multiline(\"AT+QNETDEVCTL=?\", \"+QNETDEVCTL:\", NULL);\n    at_send_command(\"AT+CGREG=2\", NULL); //GPRS Network Registration Status\n    at_send_command(\"AT+CEREG=2\", NULL); //EPS Network Registration Status\n    at_send_command(\"AT+C5GREG=2\", NULL); //5GS Network Registration Status\n\n    err = at_send_command_singleline(\"AT+QNETDEVSTATUS=?\", \"+QNETDEVSTATUS:\", &p_response);\n    if (at_response_error(err, p_response))\n        asr_style_atc = 1; //EC200T/EC100Y do not support this AT, but RG801/RG500U support \n    safe_at_response_free(p_response);\n\n    err = at_send_command_singleline(\"AT+QCFG=\\\"NAT\\\"\", \"+QCFG:\", &p_response);\n    if (!at_response_error(err, p_response)) {\n        int old_nat, new_nat = asr_style_atc ? 1 : 0;\n\n        err = at_tok_scanf(p_response->p_intermediates->line, \"%s%d\", NULL, &old_nat);\n        if (err == 2 && old_nat != new_nat) {\n            safe_at_response_free(p_response);\n            asprintf(&cmd, \"AT+QCFG=\\\"NAT\\\",%d\", new_nat);\n            err = at_send_command(cmd, &p_response);\n            safe_free(cmd);\n            if (!at_response_error(err, p_response)) {\n                err = at_send_command(\"at+cfun=1,1\",NULL);\n                if (!err)\n                    g_donot_exit_when_modem_hangup = 1;\n                //reboot to take effect\n            }\n            safe_at_response_free(p_response);\n        }\n        err = 0;\n    }\n    safe_at_response_free(p_response);\n\nexit:\n    return err;\n}\n\nstatic int atc_deinit(void) {\n    return 0;\n}\n\n/**\n * Called by atchannel when an unsolicited line appears\n * This is called on atchannel's reader thread. AT commands may\n * not be issued here\n */\nstatic void onUnsolicited (const char *s, const char *sms_pdu)\n{\n    (void)sms_pdu;\n\n    if (strStartsWith(s, \"+QNETDEVSTATUS:\")) {\n        qmidevice_send_event_to_main(RIL_UNSOL_DATA_CALL_LIST_CHANGED);\n    }\n    else if (strStartsWith(s, \"+CGREG:\")\n        || strStartsWith(s, \"+CEREG:\")\n        || strStartsWith(s, \"+C5GREG:\")) {\n        qmidevice_send_event_to_main(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED);\n    }\n}\n\nstatic void onTimeout(void) {\n    dbg_time(\"%s\", __func__);\n    //TODO\n}\n\nstatic void onClose(void) {\n    dbg_time(\"%s\", __func__);\n}\n\nstatic void * atc_read_thread(void *param) {\n    PROFILE_T *profile = (PROFILE_T *)param;\n    const char *cdc_wdm = (const char *)profile->qmichannel;\n    int wait_for_request_quit = 0;\n    int atc_fd;\n\n    atc_fd = cm_open_dev(cdc_wdm);\n    if (atc_fd <= 0) {\n        dbg_time(\"fail to open (%s), errno: %d (%s)\", cdc_wdm, errno, strerror(errno));\n        goto __quit;\n    }\n\n    dbg_time(\"atc_fd = %d\", atc_fd);\n\n    if (at_open(atc_fd, onUnsolicited, 0))\n        goto __quit;\n\n    at_set_on_timeout(onTimeout);\n    at_set_on_reader_closed(onClose);\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_CONNECTED);\n\n    while (atc_fd > 0) {\n        struct pollfd pollfds[] = {{atc_fd, POLLIN, 0}, {qmidevice_control_fd[1], POLLIN, 0}};\n        int ne, ret, nevents = 2;\n\n        ret = poll(pollfds, nevents, wait_for_request_quit ? 1000 : -1);\n\n        if (ret == 0 && wait_for_request_quit) {\n            break;\n        }\n\n        if (ret < 0) {\n            dbg_time(\"%s poll=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\n            break;\n        }\n\n        for (ne = 0; ne < nevents; ne++) {\n            int fd = pollfds[ne].fd;\n            short revents = pollfds[ne].revents;\n\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\n                dbg_time(\"%s poll err/hup/inval\", __func__);\n                dbg_time(\"epoll fd = %d, events = 0x%04x\", fd, revents);\n                if (revents & (POLLERR | POLLHUP | POLLNVAL))\n                goto __quit;\n            }\n\n            if ((revents & POLLIN) == 0)\n                continue;\n\n            if (atc_fd == fd) {\n                usleep(10*1000); //let atchannel.c read at response.\n            }\n            else if (fd == qmidevice_control_fd[1]) {\n                int triger_event;\n                if (read(fd, &triger_event, sizeof(triger_event)) == sizeof(triger_event)) {\n                    //dbg_time(\"triger_event = 0x%x\", triger_event);\n                    switch (triger_event) {\n                        case RIL_REQUEST_QUIT:\n                            goto __quit;\n                        break;\n                        case SIG_EVENT_STOP:\n                            wait_for_request_quit = 1;\n                        break;\n                        default:\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\n__quit:\n    at_close();\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_DISCONNECTED);\n    dbg_time(\"%s exit\", __func__);\n\n    return NULL;\n}\n\nconst struct qmi_device_ops atc_dev_ops = {\n    .init = atc_init,\n    .deinit = atc_deinit,\n    .read = atc_read_thread,\n};\n\nstatic int requestBaseBandVersion(PROFILE_T *profile) {\n    int retVal = -1;\n    int err;\n    ATResponse *p_response = NULL;\n\n    (void)profile;\n\n    err = at_send_command_multiline(\"AT+CGMR\", \"\\0\", &p_response);\n    if (at_response_error(err, p_response))\n        goto exit;\n\n    if (p_response->p_intermediates && p_response->p_intermediates->line) {\n        strncpy(profile->BaseBandVersion, p_response->p_intermediates->line, sizeof(profile->BaseBandVersion) - 1);\n        retVal = 0;\n    }\n\nexit:\n    safe_at_response_free(p_response);\n    return retVal;\n}\n\nstatic int requestGetSIMStatus(SIM_Status *pSIMStatus)\n{\n    int err;\n    ATResponse *p_response = NULL;\n    char *cpinLine;\n    char *cpinResult;\n    int ret = SIM_NOT_READY;\n\n    err = at_send_command_singleline(\"AT+CPIN?\", \"+CPIN:\", &p_response);\n    if (at_response_error(err, p_response))\n        goto done;\n\n    switch (at_get_cme_error(p_response))\n    {\n    case CME_SUCCESS:\n        break;\n\n    case CME_SIM_NOT_INSERTED:\n    case CME_OPERATION_NOT_ALLOWED:\n    case CME_FAILURE:\n        ret = SIM_ABSENT;\n        goto done;\n\n    default:\n        ret = SIM_NOT_READY;\n        goto done;\n    }\n\n    cpinLine = p_response->p_intermediates->line;\n    err = at_tok_start (&cpinLine);\n\n    if (err < 0)\n    {\n        ret = SIM_NOT_READY;\n        goto done;\n    }\n\n    err = at_tok_nextstr(&cpinLine, &cpinResult);\n\n    if (err < 0)\n    {\n        ret = SIM_NOT_READY;\n        goto done;\n    }\n\n    if (0 == strcmp (cpinResult, \"SIM PIN\"))\n    {\n        ret = SIM_PIN;\n        goto done;\n    }\n    else if (0 == strcmp (cpinResult, \"SIM PUK\"))\n    {\n        ret = SIM_PUK;\n        goto done;\n    }\n    else if (0 == strcmp (cpinResult, \"PH-NET PIN\"))\n    {\n        return SIM_NETWORK_PERSONALIZATION;\n    }\n    else if (0 != strcmp (cpinResult, \"READY\"))\n    {\n        /* we're treating unsupported lock types as \"sim absent\" */\n        ret = SIM_ABSENT;\n        goto done;\n    }\n\n    ret = SIM_READY;\n\ndone:\n    safe_at_response_free(p_response);\n    *pSIMStatus = ret;\n    return err;\n}\n\nstatic int requestEnterSimPin(const char *pPinCode) {\n    int retVal = -1;\n    int err;\n    ATResponse *p_response = NULL;\n    char *cmd = NULL;\n\n    asprintf(&cmd, \"AT+CPIN=%s\", pPinCode);\n    err = at_send_command(cmd, NULL);\n    safe_free(cmd);\n\n    if (!at_response_error(err, p_response)) {\n        retVal = 0;\n    }\n\n    safe_at_response_free(p_response);\n    return retVal;\n}\n\nstatic int requestSetProfile(PROFILE_T *profile) {\n    int err;\n    ATResponse *p_response = NULL;\n    char *cmd = NULL;\n    const char *new_apn = profile->apn ? profile->apn : \"\";\n    const char *new_user = profile->user ? profile->user : \"\";\n    const char *new_password = profile->password ? profile->password : \"\";\n    const char *ipStr[] = {\"NULL\", \"IPV4\", \"IPV6\", \"IPV4V6\"};\n\n    dbg_time(\"%s[%d] %s/%s/%s/%d/%s\", __func__,\n        profile->pdp, profile->apn, profile->user, profile->password,\n        profile->auth,ipStr[profile->iptype]);\n\n    if (profile->force_apn_set) {\n        dbg_time(\"clear APN settings\");\n        asprintf(&cmd, \"AT+QICSGP=%d,%d,\\\"\\\",\\\"\\\",\\\"\\\",0\", profile->pdp, profile->iptype);\n        err = at_send_command(cmd, &p_response);\n        safe_free(cmd);\n        if (at_response_error(err, p_response)) {\n            safe_at_response_free(p_response);\n            return -1;\n        }\n    }\n\n    if (!profile->force_apn_set && !strcmp(profile->old_apn, new_apn) && !strcmp(profile->old_user, new_user)\n        && !strcmp(profile->old_password, new_password)\n        && profile->old_iptype == profile->iptype\n        && profile->old_auth == profile->auth)\n    {\n        dbg_time(\"no need to set skip the rest\");\n        return 0;\n    }\n\n    if (profile->force_apn_set) {\n        dbg_time(\"Force APN setting enabled, proceeding with profile update\");\n    }\n\n    asprintf(&cmd, \"AT+QICSGP=%d,%d,\\\"%s\\\",\\\"%s\\\",\\\"%s\\\",%d\",\n        profile->pdp, profile->iptype, new_apn, new_user, new_password, profile->auth);\n    err = at_send_command(cmd, &p_response);\n    safe_free(cmd);\n    if (at_response_error(err, p_response)) {\n        safe_at_response_free(p_response);\n        asprintf(&cmd, \"AT+CGDCONT=%d,\\\"%s\\\",\\\"%s\\\"\", profile->pdp, ipStr[profile->iptype], new_apn);\n        err = at_send_command(cmd, &p_response);\n        safe_free(cmd);\n    }\n\n    safe_at_response_free(p_response);\n    return 1;\n}\n\nstatic int requestGetProfile(PROFILE_T *profile) {\n    int retVal = -1;\n    int err;\n    ATResponse *p_response = NULL;\n    char *cmd = NULL;\n    int pdp;\n    int old_iptype = 1; // 1 ~ IPV4, 2 ~ IPV6, 3 ~ IPV4V6\n    char *old_apn = \"\", *old_user = \"\", *old_password = \"\";\n    int old_auth = 0;\n    const char *ipStr[] = {\"NULL\", \"IPV4\", \"IPV6\", \"IPV4V6\"};\n\n    if (profile->enable_ipv4 && profile->enable_ipv6)\n        profile->iptype = 3;\n    else if (profile->enable_ipv6)\n        profile->iptype = 2;\n    else\n        profile->iptype = 1;\n\n_re_check:\n    asprintf(&cmd, \"AT+QICSGP=%d\", profile->pdp);\n    err = at_send_command_singleline(cmd, \"+QICSGP:\", &p_response);\n    safe_free(cmd);\n    if (err == AT_ERROR_INVALID_RESPONSE && p_response == NULL) {\n        //bug of RG801H\n        safe_at_response_free(p_response);\n        asprintf(&cmd, \"AT+QICSGP=%d,%d,\\\"\\\",\\\"\\\",\\\"\\\",0\", profile->pdp, profile->iptype);\n        err = at_send_command(cmd, &p_response);\n        safe_free(cmd);\n        if (!at_response_error(err, p_response)) {\n            safe_at_response_free(p_response);\n            goto _re_check;\n        }\n    }\n\n    if (!at_response_error(err, p_response)) {\n        err = at_tok_scanf(p_response->p_intermediates->line,\n            \"%d%s%s%s%d\", &old_iptype, &old_apn,  &old_user, &old_password, &old_auth);\n\n        if (err != 4 || pdp != profile->pdp)\n            goto _error;\n    }\n    else {\n        ATLine *atLine = NULL;\n        char *cgdcont_iptype = NULL;\n\n        safe_at_response_free(p_response);\n        err = at_send_command_multiline(\"AT+CGDCONT?\", \"+CGDCONT:\", &p_response);\n        if (at_response_error(err, p_response))\n            goto _error;\n\n        atLine = p_response->p_intermediates;\n        while (atLine) {\n            err = at_tok_scanf(atLine->line, \"%d%s%s\", &pdp, &cgdcont_iptype, &old_apn);\n            if (err == 3 && pdp == profile->pdp) {\n                if (!strcasecmp(cgdcont_iptype, ipStr[3]))\n                    old_iptype = 3;\n                else if (!strcasecmp(cgdcont_iptype, ipStr[2]))\n                     old_iptype = 2;\n                else\n                    old_iptype = 1;\n               break;\n            }\n            old_apn = NULL;\n            atLine = atLine->p_next;\n        }\n    }\n\n    retVal = 0;\n\n_error:\n    if (!old_apn) old_apn = \"\";\n    if (!old_user) old_user = \"\";\n    if (!old_password) old_password = \"\";\n\n    strncpy(profile->old_apn, old_apn, sizeof(profile->old_apn));\n    strncpy(profile->old_user, old_user, sizeof(profile->old_user));\n    strncpy(profile->old_password, old_password, sizeof(profile->old_password));\n    profile->old_auth = old_auth;\n    profile->old_iptype = old_iptype; \n\n    dbg_time(\"%s[%d] %s/%s/%s/%d/%s\", __func__,\n        profile->pdp, profile->old_apn, profile->old_user, profile->old_password,\n        profile->old_auth, ipStr[profile->old_iptype]);\n\n    safe_at_response_free(p_response);\n\n    return retVal;\n}\n\nstatic int requestRegistrationState(UCHAR *pPSAttachedState) {\n    int retVal = -1;\n    int err;\n    ATResponse *p_response = NULL;\n    ATLine *p_cur;\n    int i;\n    int cops_act = -1;\n    int state = 0, lac = 0, cid = 0, act = 0;\n    int commas;\n    char *line;\n\n    *pPSAttachedState = 0;\n\n    err = at_send_command_multiline(\n              \"AT+COPS=3,0;+COPS?;+COPS=3,1;+COPS?;+COPS=3,2;+COPS?\",\n              \"+COPS:\", &p_response);\n    if (at_response_error(err, p_response))\n        goto error;\n\n/*\nAT< +COPS: 0,0,\"CHINA MOBILE\",13\nAT< +COPS: 0,1,\"CMCC\",13\nAT< +COPS: 0,2,\"46000\",13\nAT< OK\n*/\n    retVal = 0;\n    for (i = 0, p_cur = p_response->p_intermediates; p_cur != NULL; p_cur = p_cur->p_next, i++) {\n        err = at_tok_scanf(p_cur->line, \"%d%d%s%d\", NULL, NULL, NULL, &cops_act);\n        if (err != 4) goto error;\n\n        break;\n    }\n\n    safe_at_response_free(p_response);\n    switch (cops_act) {\n        case 2: //UTRAN\n        case 3: //GSM W/EGPRS\n        case 4: //UTRAN W/HSDPA\n        case 5: //UTRAN W/HSUPA\n        case 6: //UTRAN W/HSDPA and HSUPA\n            //AT+CGREG  GPRS Network Registration Status\n            err = at_send_command_singleline(\"AT+CGREG?\", \"+CGREG:\", &p_response);\n        break;\n\n        case 7: //E-UTRAN\n        case 13: //E-UTRAN-NR dual connectivity\n            //AT+CEREG  EPS Network Registration Status\n            err = at_send_command_singleline(\"AT+CEREG?\", \"+CEREG:\", &p_response);\n        break;\n\n        case 10: //E-UTRAN connected to a 5GCN\n        case 11: //NR connected to a 5GCN\n        case 12: //NG-RAN\n            //AT+C5GREG  5GS Network Registration Status\n            err = at_send_command_singleline(\"AT+C5GREG?\", \"+C5GREG:\", &p_response);\n        break;\n\n        default:\n            goto error;\n        break;\n    }\n\n    if (at_response_error(err, p_response))\n        goto error;\n    if (!p_response->p_intermediates || !p_response->p_intermediates->line) goto error;\n\n    line = p_response->p_intermediates->line;\n    commas = at_tok_count(line);\n     switch (commas) {\n        case 0: /* +CREG: <stat> */\n            err = at_tok_nextint(&line, &state);\n            if (err < 0) goto error;\n            break;\n\n        case 1: /* +CREG: <n>, <stat> */\n            err = at_tok_scanf(line, \"%d%d\", NULL, &state);\n            if (err != 2) goto error;\n            break;\n\n        case 2: /* +CREG: <stat>, <lac>, <cid> */\n            err = at_tok_scanf(line, \"%d%x%x\", NULL, &state, &lac, &cid);\n            if (err != 3) goto error;\n            break;\n\n        case 3: /* +CREG: <n>, <stat>, <lac>, <cid> */\n            err = at_tok_scanf(line, \"%d%d%x%x\", NULL, &state, &lac, &cid);\n            if (err != 4) goto error;\n            break;\n\n        case 4: //<n>, <stat>, <lac>, <cid>, <networkType> */\n        case 5:\n        case 6: \n        case 7:\n            err = at_tok_scanf(line, \"%d%d%x%x%d\", NULL, &state, &lac, &cid, &act);\n            if (err != 5) goto error;\n        break;\n\n        default:\n            goto error;\n    }\n\n    //dbg_time(\"state=%d\", state);\n\n    if (state == 1 || state == 5) { //Registered, home network  / roaming\n        *pPSAttachedState = 1;\n    }\n\nerror:\n    safe_at_response_free(p_response);\n    return retVal;\n}\n\nstatic int requestSetupDataCall(PROFILE_T *profile, int curIpFamily) {\n    int err;\n    ATResponse *p_response = NULL;\n    char *cmd = NULL;\n    ATLine *p_cur = NULL;\n    int pdp = profile->pdp;\n    int state = 0;\n\n    (void)curIpFamily;\n\n    if (strStartsWith(profile->BaseBandVersion, \"RG801H\") || strStartsWith(profile->BaseBandVersion, \"EC200H\")) {\n        //RG801H will miss USB_CDC_NOTIFY_NETWORK_CONNECTION\n        asprintf(&cmd, \"ifconfig %s up\", profile->usbnet_adapter);\n        if (system(cmd)) {};\n        safe_free(cmd);\n    }\n\n    if (asr_style_atc) {\n        err = at_send_command_multiline(\"AT+CGACT?\", \"+CGACT:\", &p_response);\n        if (at_response_error(err, p_response))\n            goto _error;\n\n        for (p_cur = p_response->p_intermediates; p_cur != NULL; p_cur = p_cur->p_next) {\n            int cid = 0;\n\t\t\tstate = 0;\n\t\t\t\n            err = at_tok_scanf(p_cur->line, \"%d%d\", &cid, &state);\n            if (cid == pdp)\n                break;\n\t\t\telse if(state)\n\t\t\t\tstate = 0;\n        }\n        safe_at_response_free(p_response);\n\n        if (state == 0) {\n            asprintf(&cmd, \"AT+CGACT=1,%d\", pdp);\n            err = at_send_command(cmd, &p_response);\n            safe_free(cmd);\n            if (at_response_error(err, p_response))\n                goto _error;\n        }\n    }\n\n    if(asr_style_atc)\n        asprintf(&cmd, \"AT+QNETDEVCTL=1,%d,%d\", pdp, 1);\n    else\n        asprintf(&cmd, \"AT+QNETDEVCTL=%d,1,%d\", pdp, 1);\n    err = at_send_command(cmd, &p_response);\n    safe_free(cmd);\n\n    if (at_response_error(err, p_response))\n        goto _error;\n\n    if (!asr_style_atc) { //TODO some modems do not sync return setup call resule\n        int t = 0;\n\n        while (t++ < 15) {\n            asprintf(&cmd, \"AT+QNETDEVSTATUS=%d\", pdp);\n            err = at_send_command_singleline(cmd, \"+QNETDEVSTATUS\", &p_response);\n            safe_free(cmd);\n            if (err) goto _error;\n\n            if (!at_response_error(err, p_response)) {\n                break;\n            }\n            safe_at_response_free(p_response);\n            sleep(1);\n        }\n    }\n\n    //some modem do not report URC\n    qmidevice_send_event_to_main(RIL_UNSOL_DATA_CALL_LIST_CHANGED);\n\n_error:\n    safe_at_response_free(p_response);\n    //dbg_time(\"%s err=%d\", __func__, err);\n    return err;\n}\n\nstatic int at_netdevstatus(int pdp, unsigned int *pV4Addr) {\n    int err;\n    ATResponse *p_response = NULL;\n    char *cmd = NULL;\n    char *ipv4_address = NULL;\n    char *ipv4_gate = NULL;\n    char *ipv4_DHCP = NULL;\n    char *ipv4_pDNS = NULL;\n    char *ipv4_sDNS = NULL;\n    char *ipv6_address = NULL;\n    char *ipv6_gate = NULL;\n    char *ipv6_DHCP = NULL;\n    char *ipv6_pDNS = NULL;\n    char *ipv6_sDNS = NULL;\n\n    *pV4Addr = 0;\n\n    asprintf(&cmd, \"AT+QNETDEVSTATUS=%d\", pdp);\n    err = at_send_command_singleline(cmd, \"+QNETDEVSTATUS\", &p_response);\n    safe_free(cmd);\n    if (at_response_error(err, p_response)) goto _error;\n    if (!p_response->p_intermediates || !p_response->p_intermediates->line) goto _error;\n\n    err = at_tok_scanf(p_response->p_intermediates->line, \"%s%s%s%s%s%s%s%s%s%s\",\n        &ipv4_address, &ipv4_gate, &ipv4_DHCP, &ipv4_pDNS, &ipv4_sDNS,\n        &ipv6_address, &ipv6_gate, &ipv6_DHCP, &ipv6_pDNS, &ipv6_sDNS);\n    if (err > 0) {\n#if 0\n        dbg_time(\"%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\",\n            ipv4_address, ipv4_gate, ipv4_DHCP, ipv4_pDNS, ipv4_sDNS,\n            ipv6_address, ipv6_gate, ipv6_DHCP, ipv6_pDNS, ipv6_sDNS);\n#endif\n\n        if (ipv4_address && ipv4_address[0]) {\n            int addr[4] = {0, 0, 0, 0};\n\n            if (strstr(ipv4_address, \".\")) {\n                sscanf(ipv4_address, \"%d.%d.%d.%d\", &addr[0], &addr[1], &addr[2], &addr[3]);\n            }\n            else {\n                sscanf(ipv4_address, \"%02X%02X%02X%02X\", &addr[3], &addr[2], &addr[1], &addr[0]);\n            }\n            *pV4Addr = (addr[0]) | (addr[1]<<8) | (addr[2]<<16) | (addr[3]<<24);\n       }\n    }\n\n_error:\n    safe_at_response_free(p_response);\n    return 0;\n}\n\nstatic int requestQueryDataCall(UCHAR  *pConnectionStatus, int curIpFamily) {\n    int err;\n    ATResponse *p_response = NULL;\n    ATLine *p_cur = NULL;\n    int state = 0;\n    int bind = 0;\n    int cid;\n    int pdp = s_pdp;\n    unsigned int v4Addr = 0;\n\n    (void)curIpFamily;\n\n    *pConnectionStatus = QWDS_PKT_DATA_DISCONNECTED;\n\n    if (!asr_style_atc) {\n        err = at_netdevstatus(pdp, &v4Addr);\n        if (!err && v4Addr) {\n            *pConnectionStatus = QWDS_PKT_DATA_CONNECTED;\n            //if (profile->ipv4.Address == v4Addr) {} //TODO\n        }\n        return err;\n    }\n\n    err = at_send_command_multiline(\"AT+QNETDEVCTL?\", \"+QNETDEVCTL:\", &p_response);\n    if (at_response_error(err, p_response))\n        goto _error;\n\n    for (p_cur = p_response->p_intermediates; p_cur != NULL; p_cur = p_cur->p_next)\n    {\n        //+QNETDECTL:<op>,<cid>,<urc_en>,<state>\n        err = at_tok_scanf(p_cur->line, \"%d%d%d%d\", &bind, &cid, NULL, &state);\n        if (err != 4 || cid != pdp)\n            continue;\n        if (bind != 1)\n            bind = 0;\n    }\n    safe_at_response_free(p_response);\n\n    if (bind == 0 || state == 0)\n        goto _error;\n\n    err = at_send_command_multiline(\"AT+CGACT?\", \"+CGACT:\", &p_response);\n    if (at_response_error(err, p_response))\n        goto _error;\n\n    for (p_cur = p_response->p_intermediates; p_cur != NULL; p_cur = p_cur->p_next)\n    {\n\t\tstate = 0;\n        err = at_tok_scanf(p_cur->line, \"%d%d\", &cid, &state);\n        if (cid == pdp)\n            break;\n\t\telse if(state)\n\t\t\tstate = 0;\n    }\n    safe_at_response_free(p_response);\n\n    if (bind && state)\n        *pConnectionStatus = QWDS_PKT_DATA_CONNECTED;\n\n_error:\n    safe_at_response_free(p_response);\n    //dbg_time(\"%s err=%d, call_state=%d\", __func__, err, *pConnectionStatus);\n    return 0;\n}\n\nstatic int requestDeactivateDefaultPDP(PROFILE_T *profile, int curIpFamily) {\n    char *cmd = NULL;\n    int pdp = profile->pdp;\n\n    (void)curIpFamily;\n\n    if (asr_style_atc)\n        asprintf(&cmd, \"AT+QNETDEVCTL=0,%d,%d\", pdp, 0);\n    else\n        asprintf(&cmd, \"AT+QNETDEVCTL=%d,0,%d\", pdp, 0);\n    at_send_command(cmd, NULL);\n    safe_free(cmd);\n\n    //dbg_time(\"%s err=%d\", __func__, err);\n    return 0;\n}\n\nstatic int requestGetIPAddress(PROFILE_T *profile, int curIpFamily) {\n    int err;\n    ATResponse *p_response = NULL;\n    char *cmd = NULL;\n    ATLine *p_cur = NULL;\n    int pdp = profile->pdp;\n    unsigned int v4Addr = 0;\n\n    (void)curIpFamily;\n\n    if (!asr_style_atc) {\n        err = at_netdevstatus(pdp, &v4Addr);\n        goto _error;\n    }\n\n    asprintf(&cmd, \"AT+CGPADDR=%d\", profile->pdp);\n    err = at_send_command_singleline(cmd, \"+CGPADDR:\", &p_response);\n    safe_free(cmd);\n    if (at_response_error(err, p_response))\n        goto _error;\n\n    //+CGPADDR: 1,\"10.201.80.91\",\"2409:8930:4B3:41C7:F9B8:3D9B:A2F7:CA96\"\n    for (p_cur = p_response->p_intermediates; p_cur != NULL; p_cur = p_cur->p_next)\n    {\n        char *ipv4 = NULL;\n        char *ipv6 = NULL;\n\n        err = at_tok_scanf(p_cur->line, \"%d%s%s\", &pdp, &ipv4, &ipv6);\n        if (err < 2 || pdp != profile->pdp)\n            continue;\n\n        if (ipv4) {\n            int addr[4] = {0, 0, 0, 0};\n\n            sscanf(ipv4, \"%d.%d.%d.%d\", &addr[0], &addr[1], &addr[2], &addr[3]);\n            v4Addr = (addr[0]) | (addr[1]<<8) | (addr[2]<<16) | (addr[3]<<24);\n            break;\n        }\n    }\n\n_error:\n    if (v4Addr && profile->ipv4.Address != v4Addr) {\n        unsigned char *v4 = (unsigned char *)&v4Addr;\n\n        profile->ipv4.Address = v4Addr;\n        dbg_time(\"%s %d.%d.%d.%d\", __func__, v4[0], v4[1], v4[2], v4[3]);    \n    }\n        \n    //dbg_time(\"%s err=%d\", __func__, err);\n    return v4Addr ? 0 : -1;\n}\n\nstatic int requestGetSignalInfo(void) {\n    int retVal = -1;\n    int err;\n    ATResponse *p_response = NULL;\n    int i;\n    ATLine *p_cur = NULL;\n    char *rat = NULL;\n    int cops_act = 0;\n    int is_nr5g_nsa = 0, nr5g_sa = 0;\n    int verbose = 0;\n\n    err = at_send_command_singleline(\"at+cops?\", \"+COPS:\", &p_response);\n    if (at_response_error(err, p_response)) goto _error;\n    if (!p_response->p_intermediates || !p_response->p_intermediates->line) goto _error;\n\n    retVal = 0;\n    err = at_tok_scanf(p_response->p_intermediates->line, \"%d%d%s%d\", NULL, NULL, NULL, &cops_act);\n    if (err != 4) goto _error;\n\n    nr5g_sa = (cops_act == 11);\n\n    safe_at_response_free(p_response);\n    err = at_send_command_multiline(\"at+qeng=\\\"servingcell\\\"\", \"+QENG:\", &p_response);\n    if (at_response_error(err, p_response))\n        goto _error;\n\n    for (i = 0, p_cur = p_response->p_intermediates; p_cur != NULL; p_cur = p_cur->p_next, i++) {\n        char *type, *state;\n\n        err = at_tok_scanf(p_cur->line, \"%s%s\", &type, &state);\n        if (err != 2 || strcmp(type, \"servingcell\"))\n            continue;\n\n        if (!strcmp(state, \"SEARCH\") || !strcmp(state, \"LIMSRV\"))\n            continue;\n\n        if (!strcmp(state, \"NOCONN\") || !strcmp(state, \"CONNECT\")) {\n            err = at_tok_scanf(p_cur->line, \"%s%s%s\", &type, &state, &rat);\n            if (err != 3)\n                continue;        \n        }\n        else {\n            rat = state;\n        }\n       \n        if (!strcmp(rat, \"NR5G-SA\"))\n        {\n            //+QENG: \"servingcell\",<state>,\"NR5G-SA\",<duplex_mode>,<MCC>,<MNC>,<cellID>,<PCID>,<TAC>,<ARFCN>,<band>,<NR_DL_bandwidth>,<RSRP>,<RSRQ>,<SINR>,<tx_power>,<srxlev> \n            //+QENG: \"servingcell\",\"NOCONN\",\"NR5G-SA\",\"TDD\", 454,12,0,21,4ED,636576,78,3,-85,-11,32,0,5184\n            struct qeng_servingcell_nr5g_sa {\n                char *cell_type, *state, *rat, *is_tdd;\n                int MCC, MNC, cellID/*hex*/;\n                int PCID, TAC/*hex*/, ARFCN;\n                int band, NR_DL_bandwidth;\n                int RSRP, RSRQ, RSSI, SINR;\n            };\n            struct qeng_servingcell_nr5g_sa nr5g_sa;\n\n            memset(&nr5g_sa, 0, sizeof(nr5g_sa));\n            err = at_tok_scanf(p_cur->line, \"%s,%s,%s,%s,%d,%d,%x,%d,%x,%d,%d,%d,%d,%d,%d,%d\",\n                &nr5g_sa.cell_type, &nr5g_sa.state, &nr5g_sa.rat, &nr5g_sa.is_tdd,\n                &nr5g_sa.MCC, &nr5g_sa.MNC, &nr5g_sa.cellID, &nr5g_sa.PCID, &nr5g_sa.TAC,\n                &nr5g_sa.ARFCN, &nr5g_sa.band, &nr5g_sa.NR_DL_bandwidth,\n                &nr5g_sa.RSRP, &nr5g_sa.RSRQ, &nr5g_sa.RSSI, &nr5g_sa.SINR);\n\n            if (err >= 13 && verbose) {\n                dbg_time(\"%s,%s,%s,%s,%d,%d,%x,%d,%x,%d,%d,%d,%d,%d,%d,%d\",\n                    nr5g_sa.cell_type, nr5g_sa.state, nr5g_sa.rat, nr5g_sa.is_tdd,\n                    nr5g_sa.MCC, nr5g_sa.MNC, nr5g_sa.cellID, nr5g_sa.PCID, nr5g_sa.TAC,\n                    nr5g_sa.ARFCN, nr5g_sa.band, nr5g_sa.NR_DL_bandwidth,\n                    nr5g_sa.RSRP, nr5g_sa.RSRQ, nr5g_sa.RSSI, nr5g_sa.SINR);\n            }\n        }\n        else if (!strcmp(rat, \"NR5G-NSA\"))\n        {\n            //+QENG: \"NR5G-NSA\",<MCC>,<MNC>,<PCID>,<RSRP>,< SINR>,<RSRQ>,<ARFCN>,<band>\n            struct qeng_servingcell_nr5g_nsa {\n                char *mcc, *mnc;\n                int pcid, rsrp, sinr, rsrq;\n            };\n            struct qeng_servingcell_nr5g_nsa nr5g_nsa;\n           \n            memset(&nr5g_nsa, 0, sizeof(nr5g_nsa));\n            err = at_tok_scanf(p_cur->line, \"%s%s%s%s%d%d%d%dd\",\n                NULL, NULL, &nr5g_nsa.mcc, &nr5g_nsa.mnc, &nr5g_nsa.pcid, &nr5g_nsa.rsrp, &nr5g_nsa.sinr, &nr5g_nsa.rsrq);\n            if (err == 8 && verbose)\n            {\n                dbg_time(\"mcc=%s, mnc=%s, pcid=%d, rsrp=%d, sinr=%d, rsrq=%d\",\n                    nr5g_nsa.mcc, nr5g_nsa.mnc, nr5g_nsa.pcid, nr5g_nsa.rsrp, nr5g_nsa.sinr, nr5g_nsa.rsrq);\n            }\n\n            is_nr5g_nsa = 1;\n        }\n        else if (!strcmp(rat, \"LTE\"))\n        {\n            //+QENG: \"LTE\",<is_tdd>,<MCC>,<MNC>,<cellID>,<PCID>,<earfcn>,<freq_band_ind>,<UL_bandwidth>,<DL_bandwidth>,<TAC>,<RSRP>,<RSRQ>,<RSSI>,<SINR>,<CQI>,<tx_power>,<srxlev>\n            struct qeng_servingcell_lte {\n                char *is_tdd, *mcc, *mnc;\n                int cellID/*hex*/, pcid, earfcn, freq_band_ind, ul_bandwidth, dl_bandwidth;\n                int tac/*hex*/, rsrp, rsrq, rssi, sinr, cqi,tx_power,srxlev;\n            };\n            struct qeng_servingcell_lte lte;\n\n            memset(&lte, 0, sizeof(lte));\n            if (!strcmp(rat, state))\n                err = at_tok_scanf(p_cur->line, \"%s%s%s%s%s%x%d%d%d%d%d%x%d%d%d%d%d%d%d\",\n                    NULL, NULL, &lte.is_tdd, &lte.mcc, &lte.mnc,\n                    &lte.cellID, &lte.pcid, &lte.earfcn, &lte.freq_band_ind, &lte.ul_bandwidth, &lte.dl_bandwidth,\n                    &lte.tac, &lte.rsrp, &lte.rsrq, &lte.rssi, &lte.sinr, &lte.cqi, &lte.tx_power, &lte.srxlev);\n            else\n                 err = at_tok_scanf(p_cur->line, \"%s%s%s%s%s%s%x%d%d%d%d%d%x%d%d%d%d%d%d%d\",\n                    NULL, NULL, NULL, &lte.is_tdd, &lte.mcc, &lte.mnc,\n                    &lte.cellID, &lte.pcid, &lte.earfcn, &lte.freq_band_ind, &lte.ul_bandwidth, &lte.dl_bandwidth,\n                    &lte.tac, &lte.rsrp, &lte.rsrq, &lte.rssi, &lte.sinr, &lte.cqi, &lte.tx_power, &lte.srxlev);\n            \n                if (err >= 18 && verbose)\n                {\n                    dbg_time(\"is_tdd=%s, mcc=%s, mnc=%s\", lte.is_tdd, lte.mcc, lte.mnc);\n                    dbg_time(\"cellID=%x, pcid=%d, earfcn=%d\", lte.cellID, lte.pcid, lte.earfcn);\n                    dbg_time(\"freq_band_ind=%d, ul_bandwidth=%d, dl_bandwidth=%d\", lte.freq_band_ind, lte.ul_bandwidth, lte.dl_bandwidth);\n                    dbg_time(\"tac=%x, rsrp=%d, rsrq=%d, rssi=%d, sinr=%d\", lte.tac, lte.rsrp, lte.rsrq, lte.rssi, lte.sinr);\n                    dbg_time(\"cqi=%d, tx_power=%d, earfcn=%d\", lte.cqi, lte.tx_power, lte.srxlev);\n                }\n        }\n    }\n\n    if (is_nr5g_nsa) {\n        int endc_avl, plmn_info_list_r15_avl, endc_rstr, nr5g_basic;\n\n        is_nr5g_nsa = 0;\n        safe_at_response_free(p_response);\n        err = at_send_command_multiline(\"at+qendc\", \"+QENDC:\", &p_response);\n        if (at_response_error(err, p_response)) goto _error;\n        if (!p_response->p_intermediates || !p_response->p_intermediates->line) goto _error;\n\n        err = at_tok_scanf(p_response->p_intermediates->line, \"%d%d%d%d\",\n            &endc_avl, &plmn_info_list_r15_avl, &endc_rstr, &nr5g_basic);\n        if (err == 4 && nr5g_basic) {\n            is_nr5g_nsa = 1;\n        }\n    }\n\n    if (verbose)\n        dbg_time(\"cops_act=%d, nr5g_nsa=%d, nr5g_sa=%d\", cops_act, is_nr5g_nsa, nr5g_sa);\n\n_error:\n    safe_at_response_free(p_response);\n    return retVal;\n}\n\nstatic int requestGetICCID(void) {\n    int retVal = -1;\n    int err;\n    ATResponse *p_response = NULL;\n    char *iccid;\n\n    err = at_send_command_singleline(\"AT+QCCID\", \"+QCCID:\", &p_response);\n    if (at_response_error(err, p_response)) goto _error;\n    if (!p_response->p_intermediates || !p_response->p_intermediates->line) goto _error;\n\n    err = at_tok_scanf(p_response->p_intermediates->line, \"%s\", &iccid);\n    if (err != 1) goto _error;\n\n    if (iccid && iccid[0]) {\n        dbg_time(\"%s %s\", __func__, iccid);\n        retVal = 0;\n    }\n\n_error:\n    safe_at_response_free(p_response);\n    return retVal;\n}\n\nstatic int requestGetIMSI(void) {\n    int retVal = -1;\n    int err;\n    ATResponse *p_response = NULL;\n    char *imsi;\n\n    err = at_send_command_numeric(\"AT+CIMI\", &p_response);\n    if (at_response_error(err, p_response)) goto _error;\n    if (!p_response->p_intermediates || !p_response->p_intermediates->line) goto _error;\n\n    imsi = p_response->p_intermediates->line;\n    if (imsi) {\n        dbg_time(\"%s %s\", __func__, imsi);\n        retVal = 0;\n    }\n\n_error:\n    safe_at_response_free(p_response);\n    return retVal;\n}\n\nconst struct request_ops atc_request_ops = {\n    .requestBaseBandVersion = requestBaseBandVersion,\n    .requestGetSIMStatus = requestGetSIMStatus,\n    .requestEnterSimPin = requestEnterSimPin,\n    .requestSetProfile = requestSetProfile,\n    .requestGetProfile = requestGetProfile,\n    .requestRegistrationState = requestRegistrationState,\n    .requestSetupDataCall = requestSetupDataCall,\n    .requestQueryDataCall = requestQueryDataCall,\n    .requestDeactivateDefaultPDP = requestDeactivateDefaultPDP,\n    .requestGetIPAddress = requestGetIPAddress,\n    .requestGetSignalInfo = requestGetSignalInfo,\n    .requestGetICCID = requestGetICCID,\n    .requestGetIMSI = requestGetIMSI,\n};\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/atchannel.c",
    "content": "/* //device/system/reference-ril/atchannel.c\n**\n** Copyright 2006, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\");\n** you may not use this file except in compliance with the License.\n** You may obtain a copy of the License at\n**\n**     http://www.apache.org/licenses/LICENSE-2.0\n**\n** Unless required by applicable law or agreed to in writing, software\n** distributed under the License is distributed on an \"AS IS\" BASIS,\n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n** See the License for the specific language governing permissions and\n** limitations under the License.\n*/\n\n#include \"atchannel.h\"\n#include \"at_tok.h\"\n\n#include <stdio.h>\n#include <string.h>\n#include <pthread.h>\n#include <ctype.h>\n#include <stdlib.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <sys/time.h>\n#include <time.h>\n#include <unistd.h>\n#include <sys/timeb.h>\n#include <stdarg.h>\n\n#include \"QMIThread.h\"\n#define LOGE dbg_time\n#define LOGD dbg_time\n\n#define NUM_ELEMS(x) (sizeof(x)/sizeof(x[0]))\n\n#define MAX_AT_RESPONSE sizeof(cm_recv_buf)\n#define HANDSHAKE_RETRY_COUNT 8\n#define HANDSHAKE_TIMEOUT_MSEC 1000\n\nstatic pthread_t s_tid_reader;\nstatic int s_fd = -1;    /* fd of the AT channel */\nstatic ATUnsolHandler s_unsolHandler;\nstatic int s_atc_proxy = 0;    /* fd of the AT channel */\n\n/* for input buffering */\n\nstatic char *s_ATBuffer = (char *)cm_recv_buf;\nstatic char *s_ATBufferCur = (char *)cm_recv_buf;\n\nstatic int s_readCount = 0;\n\n#if AT_DEBUG\nvoid  AT_DUMP(const char*  prefix, const char*  buff, int  len)\n{\n    if (len < 0)\n        len = strlen(buff);\n    LOGD(\"%.*s\", len, buff);\n}\n#endif\n\n/*\n * for current pending command\n * these are protected by s_commandmutex\n */\nstatic ATCommandType s_type;\nstatic const char *s_responsePrefix = NULL;\nstatic const char *s_smsPDU = NULL;\nstatic const char *s_raw_data = NULL;\nstatic size_t s_raw_len;\nstatic ATResponse *sp_response = NULL;\n\nstatic void (*s_onTimeout)(void) = NULL;\nstatic void (*s_onReaderClosed)(void) = NULL;\nstatic int s_readerClosed;\n\nstatic void onReaderClosed();\nstatic int writeCtrlZ (const char *s);\nstatic int writeline (const char *s);\nstatic int writeraw (const char *s, size_t len);\n\nstatic void sleepMsec(long long msec)\n{\n    struct timespec ts;\n    int err;\n\n    ts.tv_sec = (msec / 1000);\n    ts.tv_nsec = (msec % 1000) * 1000 * 1000;\n\n    do {\n        err = nanosleep (&ts, &ts);\n    } while (err < 0 && errno == EINTR);\n}\n\n/** returns 1 if line starts with prefix, 0 if it does not */\nint strStartsWith(const char *line, const char *prefix)\n{\n    for ( ; *line != '\\0' && *prefix != '\\0' ; line++, prefix++) {\n        if (*line != *prefix) {\n            return 0;\n        }\n    }\n\n    return *prefix == '\\0';\n}\n\n/** add an intermediate response to sp_response*/\nstatic void addIntermediate(const char *line)\n{\n    ATLine *p_new;\n\n    p_new = (ATLine  *) malloc(sizeof(ATLine));\n\n    p_new->line = strdup(line);\n\n    /* note: this adds to the head of the list, so the list\n       will be in reverse order of lines received. the order is flipped\n       again before passing on to the command issuer */\n    p_new->p_next = sp_response->p_intermediates;\n    sp_response->p_intermediates = p_new;\n}\n\n\n/**\n * returns 1 if line is a final response indicating error\n * See 27.007 annex B\n * WARNING: NO CARRIER and others are sometimes unsolicited\n */\nstatic const char * s_finalResponsesError[] = {\n    \"ERROR\",\n    \"+CMS ERROR:\",\n    \"+CME ERROR:\",\n    \"NO CARRIER\", /* sometimes! */\n    \"NO ANSWER\",\n    \"NO DIALTONE\",\n    \"COMMAND NOT SUPPORT\",\n};\nstatic int isFinalResponseError(const char *line)\n{\n    size_t i;\n\n    for (i = 0 ; i < NUM_ELEMS(s_finalResponsesError) ; i++) {\n        if (strStartsWith(line, s_finalResponsesError[i])) {\n            return 1;\n        }\n    }\n\n    return 0;\n}\n\n/**\n * returns 1 if line is a final response indicating success\n * See 27.007 annex B\n * WARNING: NO CARRIER and others are sometimes unsolicited\n */\nstatic const char * s_finalResponsesSuccess[] = {\n    \"OK\",\n    \"+QIND: \\\"FOTA\\\",\\\"END\\\",0\",\n    \"CONNECT\"       /* some stacks start up data on another channel */\n};\n\nstatic int isFinalResponseSuccess(const char *line)\n{\n    size_t i;\n\n    for (i = 0 ; i < NUM_ELEMS(s_finalResponsesSuccess) ; i++) {\n        if (strStartsWith(line, s_finalResponsesSuccess[i])) {\n            return 1;\n        }\n    }\n\n    return 0;\n}\n\n#if 0\n/**\n * returns 1 if line is a final response, either  error or success\n * See 27.007 annex B\n * WARNING: NO CARRIER and others are sometimes unsolicited\n */\nstatic int isFinalResponse(const char *line)\n{\n    return isFinalResponseSuccess(line) || isFinalResponseError(line);\n}\n#endif\n\n/**\n * returns 1 if line is the first line in (what will be) a two-line\n * SMS unsolicited response\n */\nstatic const char * s_smsUnsoliciteds[] = {\n   \"+CMT:\",\n    \"+CDS:\",\n    \"+CBM:\",\n    \"+CMTI:\"\n};\nstatic int isSMSUnsolicited(const char *line)\n{\n    size_t i;\n\n    for (i = 0 ; i < NUM_ELEMS(s_smsUnsoliciteds) ; i++) {\n        if (strStartsWith(line, s_smsUnsoliciteds[i])) {\n            return 1;\n        }\n    }\n\n    return 0;\n}\n\n\n/** assumes s_commandmutex is held */\nstatic void handleFinalResponse(const char *line)\n{\n    sp_response->finalResponse = strdup(line);\n\n    pthread_cond_signal(&cm_command_cond);\n}\n\nstatic void handleUnsolicited(const char *line)\n{\n    if (s_unsolHandler != NULL) {\n        s_unsolHandler(line, NULL);\n    }\n}\n\nstatic void processLine(const char *line)\n{\n    pthread_mutex_lock(&cm_command_mutex);\n\n    if (sp_response == NULL) {\n        /* no command pending */\n        handleUnsolicited(line);\n    } else if (s_raw_data != NULL && 0 == strcmp(line, \"CONNECT\")) {\n        usleep(500*1000); //for EC20\n        writeraw(s_raw_data, s_raw_len);\n        s_raw_data = NULL;\n    } else if (isFinalResponseSuccess(line)) {\n        if(s_atc_proxy)\n            handleUnsolicited(line);\n        sp_response->success = 1;\n        handleFinalResponse(line);\n    } else if (isFinalResponseError(line)) {\n        if(s_atc_proxy) \n            handleUnsolicited(line);\n        sp_response->success = 0;\n        handleFinalResponse(line);\n    } else if (s_smsPDU != NULL && 0 == strcmp(line, \"> \")) {\n        // See eg. TS 27.005 4.3\n        // Commands like AT+CMGS have a \"> \" prompt\n        writeCtrlZ(s_smsPDU);\n        s_smsPDU = NULL;\n    } else switch (s_type) {\n        case NO_RESULT:\n            handleUnsolicited(line);\n            break;\n        case NUMERIC:\n            if (sp_response->p_intermediates == NULL\n                && isdigit(line[0])\n            ) {\n                addIntermediate(line);\n            } else {\n                /* either we already have an intermediate response or\n                   the line doesn't begin with a digit */\n                handleUnsolicited(line);\n            }\n            break;\n        case SINGLELINE:\n            if (sp_response->p_intermediates == NULL\n                && strStartsWith (line, s_responsePrefix)\n            ) {\n                addIntermediate(line);\n            } else {\n                /* we already have an intermediate response */\n                handleUnsolicited(line);\n            }\n            break;\n        case MULTILINE:\n            if (strStartsWith (line, s_responsePrefix)) {\n                addIntermediate(line);\n            } else {\n                handleUnsolicited(line);\n            }\n        break;\n\n        default: /* this should never be reached */\n            LOGE(\"Unsupported AT command type %d\\n\", s_type);\n            handleUnsolicited(line);\n        break;\n    }\n\n    pthread_mutex_unlock(&cm_command_mutex);\n}\n\n\n/**\n * Returns a pointer to the end of the next line\n * special-cases the \"> \" SMS prompt\n *\n * returns NULL if there is no complete line\n */\nstatic char * findNextEOL(char *cur)\n{\n    if (cur[0] == '>' && cur[1] == ' ' && cur[2] == '\\0') {\n        /* SMS prompt character...not \\r terminated */\n        return cur+2;\n    }\n\n    // Find next newline\n    while (*cur != '\\0' && *cur != '\\r' && *cur != '\\n') cur++;\n\n    return *cur == '\\0' ? NULL : cur;\n}\n\n\n/**\n * Reads a line from the AT channel, returns NULL on timeout.\n * Assumes it has exclusive read access to the FD\n *\n * This line is valid only until the next call to readline\n *\n * This function exists because as of writing, android libc does not\n * have buffered stdio.\n */\n\nstatic const char *readline()\n{\n    ssize_t count;\n\n    char *p_read = NULL;\n    char *p_eol = NULL;\n    char *ret;\n\n    /* this is a little odd. I use *s_ATBufferCur == 0 to\n     * mean \"buffer consumed completely\". If it points to a character, than\n     * the buffer continues until a \\0\n     */\n    if (*s_ATBufferCur == '\\0') {\n        /* empty buffer */\n        s_ATBufferCur = s_ATBuffer;\n        *s_ATBufferCur = '\\0';\n        p_read = s_ATBuffer;\n    } else {   /* *s_ATBufferCur != '\\0' */\n        /* there's data in the buffer from the last read */\n\n        // skip over leading newlines\n        while (*s_ATBufferCur == '\\r' || *s_ATBufferCur == '\\n')\n            s_ATBufferCur++;\n\n        p_eol = findNextEOL(s_ATBufferCur);\n\n        if (p_eol == NULL) {\n            /* a partial line. move it up and prepare to read more */\n            size_t len;\n\n            len = strlen(s_ATBufferCur);\n\n            memmove(s_ATBuffer, s_ATBufferCur, len + 1);\n            p_read = s_ATBuffer + len;\n            s_ATBufferCur = s_ATBuffer;\n        }\n        /* Otherwise, (p_eol !- NULL) there is a complete line  */\n        /* that will be returned the while () loop below        */\n    }\n\n    while (p_eol == NULL) {\n        if (0 == MAX_AT_RESPONSE - (p_read - s_ATBuffer)) {\n            LOGE(\"ERROR: Input line exceeded buffer\\n\");\n            /* ditch buffer and start over again */\n            s_ATBufferCur = s_ATBuffer;\n            *s_ATBufferCur = '\\0';\n            p_read = s_ATBuffer;\n        }\n\n        do {\n            while (s_fd > 0) {\n                struct pollfd pollfds[1] = {{s_fd, POLLIN, 0}};\n                int ret;\n            \n                do {\n                    ret = poll(pollfds, 1, -1);\n                } while ((ret < 0) && (errno == EINTR));\n\n                if (pollfds[0].revents & (POLLERR | POLLHUP | POLLNVAL)) {\n                    break;\n                } else if   (pollfds[0].revents & (POLLIN))  {\n                    break;\n                }\n            };\n\n            count = (s_fd == -1) ? 0 : read(s_fd, p_read,\n                            MAX_AT_RESPONSE - (p_read - s_ATBuffer));\n        } while (count < 0 && errno == EINTR);\n\n        if (count > 0) {\n            AT_DUMP( \"<< \", p_read, count );\n            s_readCount += count;\n\n            p_read[count] = '\\0';\n\n            // skip over leading newlines\n            while (*s_ATBufferCur == '\\r' || *s_ATBufferCur == '\\n')\n                s_ATBufferCur++;\n\n            p_eol = findNextEOL(s_ATBufferCur);\n            p_read += count;\n        } else if (count <= 0) {\n            /* read error encountered or EOF reached */\n            if(count == 0) {\n                LOGD(\"atchannel: EOF reached\");\n            } else {\n                LOGD(\"atchannel: read error %s\", strerror(errno));\n            }\n            return NULL;\n        }\n    }\n\n    /* a full line in the buffer. Place a \\0 over the \\r and return */\n\n    ret = s_ATBufferCur;\n    *p_eol = '\\0';\n    s_ATBufferCur = p_eol + 1; /* this will always be <= p_read,    */\n                              /* and there will be a \\0 at *p_read */\n\n    LOGD(\"AT< %s\", ret);\n    return ret;\n}\n\n\nstatic void onReaderClosed()\n{\n    LOGE(\"%s\", __func__);\n    if (s_onReaderClosed != NULL && s_readerClosed == 0) {\n\n        pthread_mutex_lock(&cm_command_mutex);\n\n        s_readerClosed = 1;\n\n        pthread_cond_signal(&cm_command_cond);\n\n        pthread_mutex_unlock(&cm_command_mutex);\n\n        s_onReaderClosed();\n    }\n}\n\n\nstatic void *readerLoop(void *arg)\n{\n    (void)arg;\n\n    for (;;) {\n        const char * line;\n\n        line = readline();\n\n        if (line == NULL) {\n            break;\n        }\n\n        if(isSMSUnsolicited(line)) {\n            char *line1;\n            const char *line2;\n\n            // The scope of string returned by 'readline()' is valid only\n            // till next call to 'readline()' hence making a copy of line\n            // before calling readline again.\n            line1 = strdup(line);\n            line2 = readline();\n\n            if (line2 == NULL) {\n                break;\n            }\n\n            if (s_unsolHandler != NULL) {\n                s_unsolHandler (line1, line2);\n            }\n            free(line1);\n        } else {\n            processLine(line);\n        }\n    }\n\n    onReaderClosed();\n\n    return NULL;\n}\n\n/**\n * Sends string s to the radio with a \\r appended.\n * Returns AT_ERROR_* on error, 0 on success\n *\n * This function exists because as of writing, android libc does not\n * have buffered stdio.\n */\nstatic int writeline (const char *s)\n{\n    size_t cur = 0;\n    size_t len = strlen(s);\n    ssize_t written;\n    static char at_command[64];\n\n    if (s_fd < 0 || s_readerClosed > 0) {\n        return AT_ERROR_CHANNEL_CLOSED;\n    }\n\n    LOGD(\"AT> %s\", s);\n\n    AT_DUMP( \">> \", s, strlen(s) );\n\n#if 1 //send '\\r' maybe fail via USB controller: Intel Corporation 7 Series/C210 Series Chipset Family USB xHCI Host Controller (rev 04)\n    if (len < (sizeof(at_command) - 1)) {\n        strcpy(at_command, s);\n        at_command[len++] = '\\r';\n        s = (const char *)at_command;\n    }\n#endif\n\n    /* the main string */\n    while (cur < len) {\n        do {\n            written = write (s_fd, s + cur, len - cur);\n        } while (written < 0 && errno == EINTR);\n\n        if (written < 0) {\n            return AT_ERROR_GENERIC;\n        }\n\n        cur += written;\n    }\n\n#if 1 //Quectel send '\\r' maybe fail via USB controller: Intel Corporation 7 Series/C210 Series Chipset Family USB xHCI Host Controller (rev 04)\n    if (s == (const char *)at_command) {\n        return 0;\n    }\n#endif\n\n    /* the \\r  */\n\n    do {\n        written = write (s_fd, \"\\r\" , 1);\n    } while ((written < 0 && errno == EINTR) || (written == 0));\n    \n    if (written < 0) {\n        return AT_ERROR_GENERIC;\n    }\n\n    return 0;\n}\nstatic int writeCtrlZ (const char *s)\n{\n    size_t cur = 0;\n    size_t len = strlen(s);\n    ssize_t written;\n\n    if (s_fd < 0 || s_readerClosed > 0) {\n        return AT_ERROR_CHANNEL_CLOSED;\n    }\n\n    LOGD(\"AT> %s^Z\", s);\n\n    AT_DUMP( \">* \", s, strlen(s) );\n\n    /* the main string */\n    while (cur < len) {\n        do {\n            written = write (s_fd, s + cur, len - cur);\n        } while (written < 0 && errno == EINTR);\n\n        if (written < 0) {\n            return AT_ERROR_GENERIC;\n        }\n\n        cur += written;\n    }\n\n    /* the ^Z  */\n\n    do {\n        written = write (s_fd, \"\\032\" , 1);\n    } while ((written < 0 && errno == EINTR) || (written == 0));\n\n    if (written < 0) {\n        return AT_ERROR_GENERIC;\n    }\n\n    return 0;\n}\n\nstatic int writeraw (const char *s, size_t len) {\n    size_t cur = 0;\n    ssize_t written;\n\n    if (s_fd < 0 || s_readerClosed > 0) {\n        return AT_ERROR_CHANNEL_CLOSED;\n    }\n\n    /* the main string */\n    while (cur < len) {\n        struct pollfd pollfds[1] = {{s_fd, POLLOUT, 0}};\n        int ret;\n\n        ret = poll(pollfds, 1, -1);\n        if (ret <= 0)\n            break;\n            \n        do {\n            written = write (s_fd, s + cur, len - cur);\n        } while (written < 0 && errno == EINTR);\n\n        if (written < 0) {\n            return AT_ERROR_GENERIC;\n        }\n\n        cur += written;\n    }\n\n    if (written < 0) {\n        return AT_ERROR_GENERIC;\n    }\n\n    return cur;\n}\n\nstatic void clearPendingCommand()\n{\n    if (sp_response != NULL) {\n        at_response_free(sp_response);\n    }\n\n    sp_response = NULL;\n    s_responsePrefix = NULL;\n    s_smsPDU = NULL;\n}\n\n\n/**\n * Starts AT handler on stream \"fd'\n * returns 0 on success, -1 on error\n */\nint at_open(int fd, ATUnsolHandler h, int proxy)\n{\n    int ret;\n    pthread_attr_t attr;\n\n    s_fd = fd;\n    s_unsolHandler = h;\n    s_readerClosed = 0;\n\ts_atc_proxy = proxy;\n\n    s_responsePrefix = NULL;\n    s_smsPDU = NULL;\n    sp_response = NULL;\n    \n    pthread_attr_init (&attr);\n    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n\n    ret = pthread_create(&s_tid_reader, &attr, readerLoop, NULL);\n\n    if (ret < 0) {\n        LOGE(\"readerLoop create fail!\");\n        perror (\"pthread_create\\n\");\n        return -1;\n    }\n\n    return 0;\n}\n\n/* FIXME is it ok to call this from the reader and the command thread? */\nvoid at_close()\n{\n    dbg_time(\"at_close\");\n    if (s_fd >= 0) {\n        close(s_fd);\n    }\n    s_fd = -1;\n\n    pthread_mutex_lock(&cm_command_mutex);\n\n    s_readerClosed = 1;\n\n    pthread_cond_signal(&cm_command_cond);\n\n    pthread_mutex_unlock(&cm_command_mutex);\n\n    /* the reader thread should eventually die */\n}\n\nstatic ATResponse * at_response_new()\n{\n    return (ATResponse *) calloc(1, sizeof(ATResponse));\n}\n\nvoid at_response_free(ATResponse *p_response)\n{\n    ATLine *p_line;\n\n    if (p_response == NULL) return;\n\n    p_line = p_response->p_intermediates;\n\n    while (p_line != NULL) {\n        ATLine *p_toFree;\n\n        p_toFree = p_line;\n        p_line = p_line->p_next;\n\n        free(p_toFree->line);\n        free(p_toFree);\n    }\n\n    free (p_response->finalResponse);\n    free (p_response);\n}\n\n/**\n * The line reader places the intermediate responses in reverse order\n * here we flip them back\n */\nstatic void reverseIntermediates(ATResponse *p_response)\n{\n    ATLine *pcur,*pnext;\n\n    pcur = p_response->p_intermediates;\n    p_response->p_intermediates = NULL;\n\n    while (pcur != NULL) {\n        pnext = pcur->p_next;\n        pcur->p_next = p_response->p_intermediates;\n        p_response->p_intermediates = pcur;\n        pcur = pnext;\n    }\n}\n\n/**\n * Internal send_command implementation\n * Doesn't lock or call the timeout callback\n *\n * timeoutMsec == 0 means infinite timeout\n */\nstatic int at_send_command_full_nolock (const char *command, ATCommandType type,\n                    const char *responsePrefix, const char *smspdu,\n                    long long timeoutMsec, ATResponse **pp_outResponse)\n{\n    int err = 0;\n\n    if (!timeoutMsec)\n        timeoutMsec = 15000;\n\n    if(sp_response != NULL) {\n        err = AT_ERROR_COMMAND_PENDING;\n        goto error;\n    }\n\n    if (command != NULL)\n        err = writeline (command);\n\n    if (err < 0) {\n        printf(\"%s errno: %d (%s)\\n\", __func__, errno, strerror(errno));\n        goto error;\n    }\n\n    s_type = type;\n    s_responsePrefix = responsePrefix;\n    s_smsPDU = smspdu;\n    sp_response = at_response_new();\n\n    while (sp_response->finalResponse == NULL && s_readerClosed == 0) {\n        err = pthread_cond_timeout_np(&cm_command_cond, &cm_command_mutex, timeoutMsec);\n\n        if (err == ETIMEDOUT) {\n            err = AT_ERROR_TIMEOUT;\n            goto error;\n        }\n    }\n\n    if (pp_outResponse == NULL) {\n        at_response_free(sp_response);\n    } else {\n        /* line reader stores intermediate responses in reverse order */\n        reverseIntermediates(sp_response);\n        *pp_outResponse = sp_response;\n    }\n\n    sp_response = NULL;\n\n    if(s_readerClosed > 0) {\n        err = AT_ERROR_CHANNEL_CLOSED;\n        goto error;\n    }\n\n    err = 0;\nerror:\n    clearPendingCommand();\n\n    return err;\n}\n\n/**\n * Internal send_command implementation\n *\n * timeoutMsec == 0 means infinite timeout\n */\nstatic int at_send_command_full (const char *command, ATCommandType type,\n                    const char *responsePrefix, const char *smspdu,\n                    long long timeoutMsec, ATResponse **pp_outResponse)\n{\n    int err;\n\n    if (0 != pthread_equal(s_tid_reader, pthread_self())) {\n        /* cannot be called from reader thread */\n        return AT_ERROR_INVALID_THREAD;\n    }\n\n    pthread_mutex_lock(&cm_command_mutex);\n\n    err = at_send_command_full_nolock(command, type,\n                    responsePrefix, smspdu,\n                    timeoutMsec, pp_outResponse);\n\n    pthread_mutex_unlock(&cm_command_mutex);\n\n    if (err == AT_ERROR_TIMEOUT && s_onTimeout != NULL) {\n        s_onTimeout();\n    }\n\n    return err;\n}\n\n\n/**\n * Issue a single normal AT command with no intermediate response expected\n *\n * \"command\" should not include \\r\n * pp_outResponse can be NULL\n *\n * if non-NULL, the resulting ATResponse * must be eventually freed with\n * at_response_free\n */\nint at_send_command (const char *command, ATResponse **pp_outResponse)\n{\n    int err;\n\n    err = at_send_command_full (command, NO_RESULT, NULL,\n                                    NULL, 0, pp_outResponse);\n\n    return err;\n}\n\n\nint at_send_command_singleline (const char *command,\n                                const char *responsePrefix,\n                                 ATResponse **pp_outResponse)\n{\n    int err;\n\n    err = at_send_command_full (command, SINGLELINE, responsePrefix,\n                                    NULL, 0, pp_outResponse);\n\n    if (err == 0 && pp_outResponse != NULL\n        && (*pp_outResponse)->success > 0\n        && (*pp_outResponse)->p_intermediates == NULL\n    ) {\n        /* successful command must have an intermediate response */\n        at_response_free(*pp_outResponse);\n        *pp_outResponse = NULL;\n        return AT_ERROR_INVALID_RESPONSE;\n    }\n\n    return err;\n}\n\n\nint at_send_command_numeric (const char *command,\n                                 ATResponse **pp_outResponse)\n{\n    int err;\n\n    err = at_send_command_full (command, NUMERIC, NULL,\n                                    NULL, 0, pp_outResponse);\n\n    if (err == 0 && pp_outResponse != NULL\n        && (*pp_outResponse)->success > 0\n        && (*pp_outResponse)->p_intermediates == NULL\n    ) {\n        /* successful command must have an intermediate response */\n        at_response_free(*pp_outResponse);\n        *pp_outResponse = NULL;\n        return AT_ERROR_INVALID_RESPONSE;\n    }\n\n    return err;\n}\n\n\nint at_send_command_sms (const char *command,\n                                const char *pdu,\n                                const char *responsePrefix,\n                                 ATResponse **pp_outResponse)\n{\n    int err;\n\n    err = at_send_command_full (command, SINGLELINE, responsePrefix,\n                                    pdu, 0, pp_outResponse);\n\n    if (err == 0 && pp_outResponse != NULL\n        && (*pp_outResponse)->success > 0\n        && (*pp_outResponse)->p_intermediates == NULL\n    ) {\n        /* successful command must have an intermediate response */\n        at_response_free(*pp_outResponse);\n        *pp_outResponse = NULL;\n        return AT_ERROR_INVALID_RESPONSE;\n    }\n\n    return err;\n}\n\nint at_send_command_multiline (const char *command,\n                                const char *responsePrefix,\n                                 ATResponse **pp_outResponse)\n{\n    int err;\n\n    err = at_send_command_full (command, MULTILINE, responsePrefix,\n                                    NULL, 0, pp_outResponse);\n\n    return err;\n}\n\nint at_send_command_raw (const char *command,\n                                const char *raw_data, unsigned int raw_len,\n                                const char *responsePrefix,\n                                 ATResponse **pp_outResponse)\n{\n    int err;\n\n    s_raw_data = raw_data;\n    s_raw_len = raw_len;\n    err = at_send_command_full (command, SINGLELINE, responsePrefix,\n                                    NULL, 0, pp_outResponse);\n\n    return err;\n}\n\n/**\n * Periodically issue an AT command and wait for a response.\n * Used to ensure channel has start up and is active\n */\n\nint at_handshake()\n{\n    int i;\n    int err = 0;\n\n    if (0 != pthread_equal(s_tid_reader, pthread_self())) {\n        /* cannot be called from reader thread */\n        return AT_ERROR_INVALID_THREAD;\n    }\n\n    pthread_mutex_lock(&cm_command_mutex);\n\n    for (i = 0 ; i < HANDSHAKE_RETRY_COUNT ; i++) {\n        /* some stacks start with verbose off */\n        err = at_send_command_full_nolock (\"ATE0Q0V1\", NO_RESULT,\n                    NULL, NULL, HANDSHAKE_TIMEOUT_MSEC, NULL);\n\n        if (err == 0) {\n            break;\n        }\n    }\n\n    pthread_mutex_unlock(&cm_command_mutex);\n\n    if (err == 0) {\n        /* pause for a bit to let the input buffer drain any unmatched OK's\n           (they will appear as extraneous unsolicited responses) */\n\n        sleepMsec(HANDSHAKE_TIMEOUT_MSEC);\n    }\n\n    return err;\n}\n\nAT_CME_Error at_get_cme_error(const ATResponse *p_response)\n{\n    int ret;\n    int err;\n    char *p_cur;\n\n    if (p_response == NULL)\n        return CME_ERROR_NON_CME;\n\n    if (p_response->success > 0) {\n        return CME_SUCCESS;\n    }\n\n    if (p_response->finalResponse == NULL\n        || !strStartsWith(p_response->finalResponse, \"+CME ERROR:\")\n    ) {\n        return CME_ERROR_NON_CME;\n    }\n\n    p_cur = p_response->finalResponse;\n    err = at_tok_start(&p_cur);\n\n    if (err < 0) {\n        return CME_ERROR_NON_CME;\n    }\n\n    err = at_tok_nextint(&p_cur, &ret);\n\n    if (err < 0) {\n        return CME_ERROR_NON_CME;\n    }\n\n    return (AT_CME_Error) ret;\n}\n\n/** This callback is invoked on the command thread */\nvoid at_set_on_timeout(void (*onTimeout)(void))\n{\n    s_onTimeout = onTimeout;\n}\n\n/**\n *  This callback is invoked on the reader thread (like ATUnsolHandler)\n *  when the input stream closes before you call at_close\n *  (not when you call at_close())\n *  You should still call at_close()\n */\nvoid at_set_on_reader_closed(void (*onClose)(void))\n{\n    s_onReaderClosed = onClose;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/atchannel.h",
    "content": "/* //device/system/reference-ril/atchannel.h\n**\n** Copyright 2006, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\");\n** you may not use this file except in compliance with the License.\n** You may obtain a copy of the License at\n**\n**     http://www.apache.org/licenses/LICENSE-2.0\n**\n** Unless required by applicable law or agreed to in writing, software\n** distributed under the License is distributed on an \"AS IS\" BASIS,\n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n** See the License for the specific language governing permissions and\n** limitations under the License.\n*/\n\n#ifndef ATCHANNEL_H\n#define ATCHANNEL_H 1\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* define AT_DEBUG to send AT traffic to /tmp/radio-at.log\" */\n#define AT_DEBUG  0\n\n#if AT_DEBUG\nextern void  AT_DUMP(const char* prefix, const char*  buff, int  len);\n#else\n#define  AT_DUMP(prefix,buff,len)  do{}while(0)\n#endif\n\n#define AT_ERROR_GENERIC -1\n#define AT_ERROR_COMMAND_PENDING -2\n#define AT_ERROR_CHANNEL_CLOSED -3\n#define AT_ERROR_TIMEOUT -4\n#define AT_ERROR_INVALID_THREAD -5 /* AT commands may not be issued from\n                                       reader thread (or unsolicited response\n                                       callback */\n#define AT_ERROR_INVALID_RESPONSE -6 /* eg an at_send_command_singleline that\n                                        did not get back an intermediate\n                                        response */\n\n\ntypedef enum {\n    NO_RESULT,   /* no intermediate response expected */\n    NUMERIC,     /* a single intermediate response starting with a 0-9 */\n    SINGLELINE,  /* a single intermediate response starting with a prefix */\n    MULTILINE    /* multiple line intermediate response\n                    starting with a prefix */\n} ATCommandType;\n\n/** a singly-lined list of intermediate responses */\ntypedef struct ATLine  {\n    struct ATLine *p_next;\n    char *line;\n} ATLine;\n\n/** Free this with at_response_free() */\ntypedef struct {\n    int success;              /* true if final response indicates\n                                    success (eg \"OK\") */\n    char *finalResponse;      /* eg OK, ERROR */\n    ATLine  *p_intermediates; /* any intermediate responses */\n} ATResponse;\n\n/**\n * a user-provided unsolicited response handler function\n * this will be called from the reader thread, so do not block\n * \"s\" is the line, and \"sms_pdu\" is either NULL or the PDU response\n * for multi-line TS 27.005 SMS PDU responses (eg +CMT:)\n */\ntypedef void (*ATUnsolHandler)(const char *s, const char *sms_pdu);\n\nint at_open(int fd, ATUnsolHandler h, int proxy);\nvoid at_close();\n\n/* This callback is invoked on the command thread.\n   You should reset or handshake here to avoid getting out of sync */\nvoid at_set_on_timeout(void (*onTimeout)(void));\n/* This callback is invoked on the reader thread (like ATUnsolHandler)\n   when the input stream closes before you call at_close\n   (not when you call at_close())\n   You should still call at_close()\n   It may also be invoked immediately from the current thread if the read\n   channel is already closed */\nvoid at_set_on_reader_closed(void (*onClose)(void));\n\nint at_send_command_singleline (const char *command,\n                                const char *responsePrefix,\n                                 ATResponse **pp_outResponse);\n\nint at_send_command_numeric (const char *command,\n                                 ATResponse **pp_outResponse);\n\nint at_send_command_multiline (const char *command,\n                                const char *responsePrefix,\n                                 ATResponse **pp_outResponse);\n\nint at_send_command_raw (const char *command,\n                                const char *raw_data, unsigned int raw_len,\n                                const char *responsePrefix,\n                                 ATResponse **pp_outResponse);\n\nint at_handshake();\n\nint at_send_command (const char *command, ATResponse **pp_outResponse);\n\nint at_send_command_sms (const char *command, const char *pdu,\n                            const char *responsePrefix,\n                            ATResponse **pp_outResponse);\n\nvoid at_response_free(ATResponse *p_response);\n\nint strStartsWith(const char *line, const char *prefix);\n\ntypedef enum {\n    CME_ERROR_NON_CME = -1,\n    CME_SUCCESS = 0,\n\n    CME_OPERATION_NOT_ALLOWED = 3,\n    CME_OPERATION_NOT_SUPPORTED = 4,\n    CME_PH_SIM_PIN= 5,\n    CME_PH_FSIM_PIN = 6,\n    CME_PH_FSIM_PUK = 7,\n    CME_SIM_NOT_INSERTED =10,\n    CME_SIM_PIN_REQUIRED = 11,\n    CME_SIM_PUK_REQUIRED = 12,\n    CME_FAILURE = 13,\n    CME_SIM_BUSY = 14,\n    CME_SIM_WRONG = 15,\n    CME_INCORRECT_PASSWORD = 16,\n    CME_SIM_PIN2_REQUIRED = 17,\n    CME_SIM_PUK2_REQUIRED = 18,\n    CME_MEMORY_FULL = 20,\n    CME_INVALID_INDEX = 21,\n    CME_NOT_FOUND = 22,\n    CME_MEMORY_FAILURE = 23,\n    CME_STRING_TO_LONG = 24,\n    CME_INVALID_CHAR = 25,\n    CME_DIALSTR_TO_LONG = 26,\n    CME_INVALID_DIALCHAR = 27,\n} AT_CME_Error;\n\nAT_CME_Error at_get_cme_error(const ATResponse *p_response);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /*ATCHANNEL_H*/\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/configure.ac",
    "content": "#                                               -*- Autoconf -*-\n# Process this file with autoconf to produce a configure script.\n\nAC_PREREQ([2.61])\nAC_INIT([quectel-CM], [1.0], [fae-support@quectel.com])\nAC_CONFIG_HEADERS([config.h])\n\n# Checks for programs.\nAC_PROG_CC\n\n# Checks for libraries.\n\n# Checks for header files.\n\n# Checks for typedefs, structures, and compiler characteristics.\nAC_ARG_WITH(sanitized-headers,\n      AS_HELP_STRING([--with-sanitized-headers=DIR],\n         [Specify the location of the sanitized Linux headers]),\n      [CPPFLAGS=\"$CPPFLAGS -idirafter $withval\"])\n\nAC_ARG_WITH([qrtr],\n       AC_HELP_STRING([--with-qrtr],\n          [enable qrtr, building which use qrtr]))\n\nif (test \"x${with_qrtr}\" = \"xyes\"); then\n\t#AC_DEFINE(ENABLE_USEQTRT, 1, [Define if uses qrtr])\n\tAC_CHECK_HEADERS([linux/qrtr.h linux/rmnet_data.h])\nfi\n\nAM_CONDITIONAL(USE_QRTR, test \"x${with_qrtr}\" = \"xyes\")\n\nAC_ARG_WITH([msm-ipc],\n       AC_HELP_STRING([--with-msm-ipc],\n          [enable msm-ipc, building which use qrtr]))\n\nif (test \"x${with_msm_ipc}\" = \"xyes\"); then\n\t#AC_DEFINE(ENABLE_USEQTRT, 1, [Define if uses qrtr])\n\tAC_CHECK_HEADERS([linux/msm_ipc.h linux/rmnet_data.h])\nfi\n\nAM_CONDITIONAL(USE_MSM_IPC, test \"x${with_msm_ipc}\" = \"xyes\")\n\n# Checks for library functions.\n\n# Does not strictly follow GNU Coding standards\nAM_INIT_AUTOMAKE([foreign subdir-objects])\nAC_CONFIG_FILES([Makefile])\nAC_OUTPUT\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/default.script",
    "content": "#!/bin/sh\n# Busybox udhcpc dispatcher script. Copyright (C) 2009 by Axel Beckert.\n#\n# Based on the busybox example scripts and the old udhcp source\n# package default.* scripts.\n\nRESOLV_CONF=\"/etc/resolv.conf\"\n\ncase $1 in\n    bound|renew)\n\t[ -n \"$broadcast\" ] && BROADCAST=\"broadcast $broadcast\"\n\t[ -n \"$subnet\" ] && NETMASK=\"netmask $subnet\"\n\n\t/sbin/ifconfig $interface $ip $BROADCAST $NETMASK\n\n\tif [ -n \"$router\" ]; then\n\t    echo \"$0: Resetting default routes\"\n\t    while /sbin/route del default gw 0.0.0.0 dev $interface; do :; done\n\n\t    metric=0\n\t    for i in $router; do\n\t\t/sbin/route add default gw $i dev $interface metric $metric\n\t\tmetric=$(($metric + 1))\n\t    done\n\tfi\n\n\t# Update resolver configuration file\n\tR=\"\"\n\t[ -n \"$domain\" ] && R=\"domain $domain\n\"\n\tfor i in $dns; do\n\t    echo \"$0: Adding DNS $i\"\n\t    R=\"${R}nameserver $i\n\"\n\tdone\n\n\tif [ -x /sbin/resolvconf ]; then\n\t    echo -n \"$R\" | resolvconf -a \"${interface}.udhcpc\"\n\telse\n\t    echo -n \"$R\" > \"$RESOLV_CONF\"\n\tfi\n\t;;\n\n    deconfig)\n\tif [ -x /sbin/resolvconf ]; then\n\t    resolvconf -d \"${interface}.udhcpc\"\n\tfi\n\t/sbin/ifconfig $interface 0.0.0.0\n\t;;\n\n    leasefail)\n\techo \"$0: Lease failed: $message\"\n\t;;\n\n    nak)\n\techo \"$0: Received a NAK: $message\"\n\t;;\n\n    *)\n\techo \"$0: Unknown udhcpc command: $1\";\n\texit 1;\n\t;;\nesac\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/default.script_ip",
    "content": "#!/bin/sh\n# Busybox udhcpc dispatcher script. Copyright (C) 2009 by Axel Beckert.\n#\n# Based on the busybox example scripts and the old udhcp source\n# package default.* scripts.\n\nRESOLV_CONF=\"/etc/resolv.conf\"\nIPCMD=`which ip`\n\ncase $1 in\n    bound|renew)\n\t$IPCMD address add broadcast $broadcast $ip/$subnet dev $interface\n\n\tif [ -n \"$router\" ]; then\n\t    echo \"$0: Resetting default routes\"\n\t    while $IPCMD route del default dev $interface; do :; done\n\n\t    metric=0\n\t    for i in $router; do\n\t\t$IPCMD route add default dev $interface via $router metric $metric\n\t\tmetric=$(($metric + 1))\n\t    done\n\tfi\n\n\t# Update resolver configuration file\n\tR=\"\"\n\t[ -n \"$domain\" ] && R=\"domain $domain\n\"\n\tfor i in $dns; do\n\t    echo \"$0: Adding DNS $i\"\n\t    R=\"${R}nameserver $i\n\"\n\tdone\n\n\tif [ -x /sbin/resolvconf ]; then\n\t    echo -n \"$R\" | resolvconf -a \"${interface}.udhcpc\"\n\telse\n\t    echo -n \"$R\" > \"$RESOLV_CONF\"\n\tfi\n\t;;\n\n    deconfig)\n\tif [ -x /sbin/resolvconf ]; then\n\t    resolvconf -d \"${interface}.udhcpc\"\n\tfi\n\t$IPCMD address flush dev $interface\n\t;;\n\n    leasefail)\n\techo \"$0: Lease failed: $message\"\n\t;;\n\n    nak)\n\techo \"$0: Received a NAK: $message\"\n\t;;\n\n    *)\n\techo \"$0: Unknown udhcpc command: $1\";\n\texit 1;\n\t;;\nesac\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/device.c",
    "content": "/******************************************************************************\n  @file    device.c\n  @brief   QMI device dirver.\n\n  DESCRIPTION\n  Connectivity Management Tool for USB network adapter of Quectel wireless cellular modules.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n#include <unistd.h>\n#include <sys/types.h>\n#include <fcntl.h>\n#include <dirent.h>\n#include <errno.h>\n#include <strings.h>\n#include <stdlib.h>\n#include <limits.h>\n#include <linux/usbdevice_fs.h>\n#include <linux/types.h>\n#include <sys/ioctl.h>\n#include <sys/socket.h>\n#include <net/if.h>\n#include <time.h>\n#include <pthread.h>\n\n#include \"QMIThread.h\"\n#include \"ethtool-copy.h\"\n\n#define USB_CLASS_VENDOR_SPEC\t\t0xff\n#define USB_CLASS_COMM\t\t\t2\n#define USB_CDC_SUBCLASS_ACM\t\t\t0x02\n#define USB_CDC_SUBCLASS_ETHERNET       0x06\n#define USB_CDC_SUBCLASS_NCM\t\t\t0x0d\n#define USB_CDC_SUBCLASS_MBIM\t\t\t0x0e\n#define USB_CLASS_WIRELESS_CONTROLLER\t0xe0\n\n#define CM_MAX_PATHLEN 256\n\n#define CM_INVALID_VAL (~((int)0))\n/* get first line from file 'fname'\n * And convert the content into a hex number, then return this number */\nstatic int file_get_value(const char *fname, int base)\n{\n    FILE *fp = NULL;\n    long num;\n    char buff[32 + 1] = {'\\0'};\n    char *endptr = NULL;\n\n    fp = fopen(fname, \"r\");\n    if (!fp) goto error;\n    if (fgets(buff, sizeof(buff), fp) == NULL)\n        goto error;\n    fclose(fp);\n\n    num = (int)strtol(buff, &endptr, base);\n    if (errno == ERANGE && (num == LONG_MAX || num == LONG_MIN))\n        goto error;\n    /* if there is no digit in buff */\n    if (endptr == buff)\n        goto error;\n\n    if (debug_qmi)\n        dbg_time(\"(%s) = %lx\", fname, num);\n    return (int)num;\n\nerror:\n    if (fp) fclose(fp);\n    return CM_INVALID_VAL;\n}\n\n/*\n * This function will search the directory 'dirname' and return the first child.\n * '.' and '..' is ignored by default\n */\nstatic int dir_get_child(const char *dirname, char *buff, unsigned bufsize, const char *prefix)\n{\n    struct dirent *entptr = NULL;\n    DIR *dirptr;\n\n    buff[0] = 0;\n\n    dirptr = opendir(dirname);\n    if (!dirptr)\n        return -1;\n\n    while ((entptr = readdir(dirptr))) {\n        if (entptr->d_name[0] == '.')\n            continue;\n        if (prefix && strlen(prefix) && strncmp(entptr->d_name, prefix, strlen(prefix)))\n            continue;\n        snprintf(buff, bufsize, \"%.31s\", entptr->d_name);\n        break;\n    }\n    closedir(dirptr);\n\n    return 0;\n}\n\nstatic int conf_get_val(const char *fname, const char *key)\n{\n    char buff[128] = {'\\0'};\n    FILE *fp = fopen(fname, \"r\");\n    if (!fp)\n        return CM_INVALID_VAL;\n\n    while (fgets(buff, sizeof(buff)-1, fp)) {\n        char prefix[128] = {'\\0'};\n        char tail[128] = {'\\0'};\n        /* To eliminate cppcheck warnning: Assume string length is no more than 15 */\n        sscanf(buff, \"%15[^=]=%15s\", prefix, tail);\n        if (!strncasecmp(prefix, key, strlen(key))) {\n            fclose(fp);\n            return atoi(tail);\n        }\n    }\n\n    fclose(fp);\n    return CM_INVALID_VAL;\n}\n\nstatic void query_usb_device_info(char *path, struct usb_device_info *p) {\n    size_t offset = strlen(path);\n\n    memset(p, 0, sizeof(*p));\n\n    path[offset] = '\\0';\n    strcat(path, \"/idVendor\");\n    p->idVendor = file_get_value(path, 16);\n\n    if (p->idVendor == CM_INVALID_VAL)\n        return;\n\n    path[offset] = '\\0';\n    strcat(path, \"/idProduct\");\n    p->idProduct = file_get_value(path, 16);\n\n    path[offset] = '\\0';\n    strcat(path, \"/busnum\");\n    p->busnum = file_get_value(path, 10);\n\n    path[offset] = '\\0';\n    strcat(path, \"/devnum\");\n    p->devnum = file_get_value(path, 10);\n\n    path[offset] = '\\0';\n    strcat(path, \"/bNumInterfaces\");\n    p->bNumInterfaces = file_get_value(path, 10);\n\n    path[offset] = '\\0';\n}\n\nstatic void query_usb_interface_info(char *path, struct usb_interface_info *p) {\n    char driver[128];\n    size_t offset = strlen(path);\n    int n;\n\n    memset(p, 0, sizeof(*p));\n\n    path[offset] = '\\0';\n    strcat(path, \"/bNumEndpoints\");\n    p->bInterfaceClass = file_get_value(path, 16);\n\n    path[offset] = '\\0';\n    strcat(path, \"/bInterfaceClass\");\n    p->bInterfaceClass = file_get_value(path, 16);\n\n    path[offset] = '\\0';\n    strcat(path, \"/bInterfaceSubClass\");\n    p->bInterfaceSubClass = file_get_value(path, 16);\n\n    path[offset] = '\\0';\n    strcat(path, \"/bInterfaceProtocol\");\n    p->bInterfaceProtocol = file_get_value(path, 16);\n\n    path[offset] = '\\0';\n    strcat(path, \"/driver\");\n    n = readlink(path, driver, sizeof(driver));\n    if (n > 0) {\n        driver[n] = 0;\n        if (debug_qmi) dbg_time(\"driver -> %s\", driver);\n        n = strlen(driver);\n        while (n > 0) {\n            if (driver[n] == '/')\n                break;\n            n--;\n        }\n        strncpy(p->driver, &driver[n+1], sizeof(p->driver) - 1);\n    }\n\n    path[offset] = '\\0';\n}\n\nstatic int detect_path_cdc_wdm_or_qcqmi(char *path, char *devname, size_t bufsize)\n{\n    size_t offset = strlen(path);\n    char tmp[32];\n    \n    devname[0] = 0;\n\n    if (access(path, R_OK))\n        return -1;\n\n    path[offset] = '\\0';\n    strcat(path, \"/GobiQMI\");\n    if (!access(path, R_OK))\n        goto step_1;\n\n    path[offset] = '\\0';\n    strcat(path, \"/usbmisc\");\n    if (!access(path, R_OK))\n        goto step_1;\n\n    path[offset] = '\\0';\n    strcat(path, \"/usb\");\n    if (!access(path, R_OK))\n        goto step_1;\n\n    return -1;\n\nstep_1: \n    /* get device(qcqmiX|cdc-wdmX) */\n    if (debug_qmi) dbg_time(\"%s\", path);\n    dir_get_child(path, tmp, sizeof(tmp), NULL);\n    if (tmp[0] == '\\0')\n        return -1;\n\n    /* There is a chance that, no device(qcqmiX|cdc-wdmX) is generated. We should warn user about that! */\n    snprintf(devname, bufsize, \"/dev/%s\", tmp);\n    if (access(devname, R_OK | F_OK) && errno == ENOENT)\n    {\n        int major, minor;\n\n        dbg_time(\"access %s  failed, errno: %d (%s)\", devname, errno, strerror(errno));\n        strcat(path, \"/\");\n        strcat(path, tmp);\n        strcat(path, \"/uevent\");\n        major = conf_get_val(path, \"MAJOR\");\n        minor = conf_get_val(path, \"MINOR\");\n\n        if(major == CM_INVALID_VAL || minor == CM_INVALID_VAL)\n            dbg_time(\"get major and minor failed\");\n         else if (mknod(devname, S_IFCHR|0666, (((major & 0xfff) << 8) | (minor & 0xff) | ((minor & 0xfff00) << 12))))\n            dbg_time(\"please mknod %s c %d %d\", devname, major, minor);\n    }\n\n    return 0;\n}\n\n/* To detect the device info of the modem.\n * return:\n *  FALSE -> fail\n *  TRUE -> ok\n */\nBOOL qmidevice_detect(char *qmichannel, char *usbnet_adapter, unsigned bufsize, PROFILE_T *profile) {\n    struct dirent* ent = NULL;\n    DIR *pDir;\n    const char *rootdir = \"/sys/bus/usb/devices\";\n    struct {\n        char path[255*2];\n    } *pl;\n    pl = (typeof(pl)) malloc(sizeof(*pl));\n    memset(pl, 0x00, sizeof(*pl));\n\n    pDir = opendir(rootdir);\n    if (!pDir) {\n        dbg_time(\"opendir %s failed: %s\", rootdir, strerror(errno));\n        goto error;\n    }\n\n    while ((ent = readdir(pDir)) != NULL)  {\n        char netcard[32+1] = {'\\0'};\n        char devname[32+5] = {'\\0'}; //+strlen(\"/dev/\")\n        int netIntf;\n        int driver_type;\n\n        if (ent->d_name[0] == 'u')\n            continue;\n\n        snprintf(pl->path, sizeof(pl->path), \"%s/%s\", rootdir, ent->d_name);\n        query_usb_device_info(pl->path, &profile->usb_dev);\n        if (profile->usb_dev.idVendor == CM_INVALID_VAL)\n            continue;\n\n        if (profile->usb_dev.idVendor == 0x2c7c || profile->usb_dev.idVendor == 0x05c6) {\n            dbg_time(\"Find %s/%s idVendor=0x%x idProduct=0x%x, bus=0x%03x, dev=0x%03x\",\n                rootdir, ent->d_name, profile->usb_dev.idVendor, profile->usb_dev.idProduct,\n                profile->usb_dev.busnum, profile->usb_dev.devnum);\n        }\n\n        /* get network interface */\n        /* NOTICE: there is a case that, bNumberInterface=6, but the net interface is 8 */\n        /* toolchain-mips_24kc_gcc-5.4.0_musl donot support GLOB_BRACE */\n        /* RG500U's MBIM is at inteface 0 */\n        for (netIntf = 0;  netIntf < (profile->usb_dev.bNumInterfaces + 8); netIntf++) {\n            snprintf(pl->path, sizeof(pl->path), \"%s/%s:1.%d/net\", rootdir, ent->d_name, netIntf);\n            dir_get_child(pl->path, netcard, sizeof(netcard), NULL);\n            if (netcard[0])\n                break;\n        }\n\n        if (netcard[0] == '\\0') { //for centos 2.6.x\n            const char *n= \"usb0\";\n            const char *c = \"qcqmi0\";\n\n            snprintf(pl->path, sizeof(pl->path), \"%s/%s:1.4/net:%s\", rootdir, ent->d_name, n);\n            if (!access(pl->path, F_OK)) {\n                snprintf(pl->path, sizeof(pl->path), \"%s/%s:1.4/GobiQMI:%s\", rootdir, ent->d_name, c);\n                if (!access(pl->path, F_OK)) {\n                    snprintf(qmichannel, bufsize, \"/dev/%s\", c);\n                    snprintf(usbnet_adapter, bufsize, \"%s\", n);\n                    snprintf(pl->path, sizeof(pl->path), \"%s/%s:1.4\", rootdir, ent->d_name);\n                    query_usb_interface_info(pl->path, &profile->usb_intf);\n                    break;\n                }\n            }\n        }\n\n        if (netcard[0] == '\\0')\n            continue;\n\n        /* not '-i iface' */\n        if (usbnet_adapter[0] && strcmp(usbnet_adapter, netcard))\n            continue;\n\n        snprintf(pl->path, sizeof(pl->path), \"%s/%s:1.%d\", rootdir, ent->d_name, netIntf);\n        query_usb_interface_info(pl->path, &profile->usb_intf);\n        driver_type = get_driver_type(profile);\n\n        if (driver_type == SOFTWARE_QMI || driver_type == SOFTWARE_MBIM) {\n            detect_path_cdc_wdm_or_qcqmi(pl->path, devname, sizeof(devname));\n        }\n        else if (driver_type == SOFTWARE_ECM_RNDIS_NCM)\n        {\n            int atIntf = -1;\n\n            if (profile->usb_dev.idVendor == 0x2c7c) { //Quectel\n                switch (profile->usb_dev.idProduct) { //EC200U\n                case 0x0901: //EC200U\n                case 0x8101: //RG801H\n                    atIntf = 2;\n                break;\n                case 0x0900: //RG500U\n                    atIntf = 4;\n                break;\n                case 0x6026: //EC200T\n                case 0x6005: //EC200A\n                case 0x6002: //EC200S\n                case 0x6001: //EC100Y\n                    atIntf = 3;\n                break;\n                default:\n                   dbg_time(\"unknow at interface for USB idProduct:%04x\\n\", profile->usb_dev.idProduct);\n                break;\n                }\n            }\n\n            if (atIntf != -1) {\n                snprintf(pl->path, sizeof(pl->path), \"%s/%s:1.%d\", rootdir, ent->d_name, atIntf);\n                dir_get_child(pl->path, devname, sizeof(devname), \"tty\");\n                if (devname[0] && !strcmp(devname, \"tty\")) {\n                    snprintf(pl->path, sizeof(pl->path), \"%s/%s:1.%d/tty\", rootdir, ent->d_name, atIntf);\n                    dir_get_child(pl->path, devname, sizeof(devname), \"tty\");\n                }\n            }\n        }\n        \n        if (netcard[0] && devname[0]) {\n            if (devname[0] == '/')\n                snprintf(qmichannel, bufsize, \"%s\", devname);\n            else\n                snprintf(qmichannel, bufsize, \"/dev/%s\", devname);\n            snprintf(usbnet_adapter, bufsize, \"%s\", netcard);\n            dbg_time(\"Auto find qmichannel = %s\", qmichannel);\n            dbg_time(\"Auto find usbnet_adapter = %s\", usbnet_adapter);\n            break;\n        }\n    }\n    closedir(pDir);\n\n    if (qmichannel[0] == '\\0' || usbnet_adapter[0] == '\\0') {\n        dbg_time(\"network interface '%s' or qmidev '%s' is not exist\", usbnet_adapter, qmichannel);\n        goto error;\n    }\n    free(pl);\n    return TRUE;\nerror:\n    free(pl);\n    return FALSE;\n}\n\nint mhidevice_detect(char *qmichannel, char *usbnet_adapter, PROFILE_T *profile) {\n    struct dirent* ent = NULL;\n    DIR *pDir;\n    const char *rootdir_mhi[] = {\"/sys/bus/mhi_q/devices\", \"/sys/bus/mhi/devices\", NULL};\n    int i = 0;\n    char path[256];\n    int find = 0;\n\n    while (rootdir_mhi[i]) {\n        const char *rootdir = rootdir_mhi[i++];\n\n        pDir = opendir(rootdir);\n        if (!pDir) {\n            if (errno != ENOENT)\n                    dbg_time(\"opendir %s failed: %s\", rootdir, strerror(errno));\n            continue;\n        }\n\n        while ((ent = readdir(pDir)) != NULL)  {\n            char netcard[32] = {'\\0'};\n            char devname[32] = {'\\0'};\n            int software_interface = SOFTWARE_QMI;\n            char *pNode = NULL;\n\n            pNode = strstr(ent->d_name, \"_IP_HW0\"); //0306_00.01.00_IP_HW0\n            if (!pNode)\n                continue;\n\n            snprintf(path, sizeof(path), \"%s/%.32s/net\", rootdir, ent->d_name);\n            dir_get_child(path, netcard, sizeof(netcard), NULL);\n            if (!netcard[0])\n                continue;\n\n            if (usbnet_adapter[0] && strcmp(netcard, usbnet_adapter)) //not '-i x'\n                continue;\n\n            if (!strcmp(rootdir, \"/sys/bus/mhi/devices\")) {\n                snprintf(path, sizeof(path), \"%s/%.13s_IPCR\", rootdir, ent->d_name); // 13 is sizeof(0306_00.01.00)\n                if (!access(path, F_OK)) {\n                    /* we also need 'cat /dev/mhi_0306_00.01.00_pipe_14' to enable rmnet as like USB's DTR \n                         or will get error 'requestSetEthMode QMUXResult = 0x1, QMUXError = 0x46' */\n                    sprintf(usbnet_adapter, \"%s\", netcard);\n                    sprintf(qmichannel, \"qrtr-%d\", 3); // 3 is sdx modem's node id\n                    profile->software_interface = SOFTWARE_QRTR;\n                    find = 1;\n                    break;\n                }\n                continue;\n            }\n\n            snprintf(path, sizeof(path), \"%s/%.13s_IPCR\", rootdir, ent->d_name);\n            if (access(path, F_OK)) {\n                snprintf(path, sizeof(path), \"%s/%.13s_QMI0\", rootdir, ent->d_name);\n                if (access(path, F_OK)) {\n                    snprintf(path, sizeof(path), \"%s/%.13s_MBIM\", rootdir, ent->d_name);\n                    if (!access(path, F_OK))\n                        software_interface = SOFTWARE_MBIM;\n                }\n            }\n            if (access(path, F_OK))\n                continue;\n\n            strncat(path, \"/mhi_uci_q\", sizeof(path)-1);\n            dir_get_child(path, devname, sizeof(devname), NULL);\n            if (!devname[0])\n                continue;      \n\n            sprintf(usbnet_adapter, \"%s\", netcard);\n            sprintf(qmichannel, \"/dev/%s\", devname);\n            profile->software_interface = software_interface;\n            find = 1;\n            break;\n        }\n\n        closedir(pDir);\n    }\n\n    return find;\n}\n\nint atdevice_detect(char *atchannel, char *usbnet_adapter, PROFILE_T *profile) {\n    if (!access(\"/sys/class/net/sipa_dummy0\", F_OK)) {\n\t\tstrcpy(usbnet_adapter, \"sipa_dummy0\");\n\t\tsnprintf(profile->qmapnet_adapter, sizeof(profile->qmapnet_adapter), \"%s%d\", \"pcie\", profile->pdp - 1);\n    }\n\telse {\n        dbg_time(\"atdevice_detect failed\");\n        goto error;\n    }\n\n    if (!access(\"/dev/stty_nr31\", F_OK)) {\n        strcpy(atchannel, \"/dev/stty_nr31\");\n        profile->software_interface = SOFTWARE_ECM_RNDIS_NCM;\n    }\n    else {\n        goto error;\n    }\n\n    return 1;\nerror:\n    return 0;\n}\n\n\nint get_driver_type(PROFILE_T *profile)\n{\n    /* QMI_WWAN */\n    if (profile->usb_intf.bInterfaceClass == USB_CLASS_VENDOR_SPEC) {\n        return SOFTWARE_QMI;\n    }\n    else if (profile->usb_intf.bInterfaceClass == USB_CLASS_COMM) {\n        switch (profile->usb_intf.bInterfaceSubClass) {\n            case USB_CDC_SUBCLASS_MBIM:\n                return SOFTWARE_MBIM;\n            break;\n            case USB_CDC_SUBCLASS_ETHERNET:\n            case USB_CDC_SUBCLASS_NCM:\n                return SOFTWARE_ECM_RNDIS_NCM;\n            break;\n            default:\n            break;\n        }\n    }\n    else if (profile->usb_intf.bInterfaceClass == USB_CLASS_WIRELESS_CONTROLLER) {\n        if (profile->usb_intf.bInterfaceSubClass == 1 && profile->usb_intf.bInterfaceProtocol == 3)\n            return SOFTWARE_ECM_RNDIS_NCM;\n    }\n\n    dbg_time(\"%s unknow bInterfaceClass=%d, bInterfaceSubClass=%d\", __func__,\n        profile->usb_intf.bInterfaceClass, profile->usb_intf.bInterfaceSubClass);\n    return DRV_INVALID;\n}\n\nstruct usbfs_getdriver\n{\n    unsigned int interface;\n    char driver[255 + 1];\n};\n\nstruct usbfs_ioctl\n{\n    int ifno;       /* interface 0..N ; negative numbers reserved */\n    int ioctl_code; /* MUST encode size + direction of data so the\n\t\t\t * macros in <asm/ioctl.h> give correct values */\n    void *data;     /* param buffer (in, or out) */\n};\n\n#define IOCTL_USBFS_DISCONNECT\t_IO('U', 22)\n#define IOCTL_USBFS_CONNECT\t_IO('U', 23)\n\nint usbfs_is_kernel_driver_alive(int fd, int ifnum)\n{\n    struct usbfs_getdriver getdrv;\n    getdrv.interface = ifnum;\n    if (ioctl(fd, USBDEVFS_GETDRIVER, &getdrv) < 0) {\n        dbg_time(\"%s ioctl USBDEVFS_GETDRIVER failed, kernel driver may be inactive\", __func__);\n        return 0;\n    }\n    dbg_time(\"%s find interface %d has match the driver %s\", __func__, ifnum, getdrv.driver);\n    return 1;\n}\n\nvoid usbfs_detach_kernel_driver(int fd, int ifnum)\n{\n    struct usbfs_ioctl operate;\n    operate.data = NULL;\n    operate.ifno = ifnum;\n    operate.ioctl_code = IOCTL_USBFS_DISCONNECT;\n    if (ioctl(fd, USBDEVFS_IOCTL, &operate) < 0) {\n        dbg_time(\"%s detach kernel driver failed\", __func__);\n    } else {\n        dbg_time(\"%s detach kernel driver success\", __func__);\n    }\n}\n\nvoid usbfs_attach_kernel_driver(int fd, int ifnum)\n{\n    struct usbfs_ioctl operate;\n    operate.data = NULL;\n    operate.ifno = ifnum;\n    operate.ioctl_code = IOCTL_USBFS_CONNECT;\n    if (ioctl(fd, USBDEVFS_IOCTL, &operate) < 0) {\n        dbg_time(\"%s detach kernel driver failed\", __func__);\n    } else {\n        dbg_time(\"%s detach kernel driver success\", __func__);\n    }\n}\n\nint reattach_driver(PROFILE_T *profile)\n{\n    int ifnum = 4;\n    int fd;\n    char devpath[128] = {'\\0'};\n    snprintf(devpath, sizeof(devpath), \"/dev/bus/usb/%03d/%03d\", profile->usb_dev.busnum, profile->usb_dev.devnum);\n    fd = open(devpath, O_RDWR | O_NOCTTY);\n    if (fd < 0)\n    {\n        dbg_time(\"%s fail to open %s\", __func__, devpath);\n        return -1;\n    }\n    usbfs_detach_kernel_driver(fd, ifnum);\n    usbfs_attach_kernel_driver(fd, ifnum);\n    close(fd);\n    return 0;\n}\n\n#define SIOCETHTOOL     0x8946\nint ql_get_netcard_driver_info(const char *devname)\n{\n    int fd = -1;\n    struct ethtool_drvinfo drvinfo;\n    struct ifreq ifr;\t/* ifreq suitable for ethtool ioctl */\n\n    memset(&ifr, 0, sizeof(ifr));\n    strcpy(ifr.ifr_name, devname);\n\n    fd = socket(AF_INET, SOCK_DGRAM, 0);\n    if (fd < 0) {\n        dbg_time(\"Cannot get control socket: errno(%d)(%s)\", errno, strerror(errno));\n        return -1;\n    }\n\n    drvinfo.cmd = ETHTOOL_GDRVINFO;\n    ifr.ifr_data = (void *)&drvinfo;\n\n    if (ioctl(fd, SIOCETHTOOL, &ifr) < 0) {\n        dbg_time(\"ioctl() error: errno(%d)(%s)\", errno, strerror(errno));\n        close(fd);\n        return -1;\n    }\n\n    dbg_time(\"netcard driver = %s, driver version = %s\", drvinfo.driver, drvinfo.version);\n\n    close(fd);\n\n    return 0;\n}\n\nint ql_get_netcard_carrier_state(const char *devname)\n{\n    int fd = -1;\n    struct ethtool_value edata;\n    struct ifreq ifr;\t/* ifreq suitable for ethtool ioctl */\n\n    memset(&ifr, 0, sizeof(ifr));\n    strcpy(ifr.ifr_name, devname);\n\n    fd = socket(AF_INET, SOCK_DGRAM, 0);\n    if (fd < 0) {\n        dbg_time(\"Cannot get control socket: errno(%d)(%s)\", errno, strerror(errno));\n        return -1;\n    }\n\n    edata.cmd = ETHTOOL_GLINK;\n    edata.data = 0;\n    ifr.ifr_data = (void *)&edata;\n\n    if (ioctl(fd, SIOCETHTOOL, &ifr) < 0) {\n        dbg_time(\"ioctl('%s') error: errno(%d)(%s)\", devname, errno, strerror(errno));\n        return -1;\n    }\n\n    if (!edata.data)\n        dbg_time(\"netcard carrier = %d\", edata.data);\n\n    close(fd);\n\n    return edata.data;\n}\n\nstatic void *catch_log(void *arg)\n{\n    PROFILE_T *profile = (PROFILE_T *)arg;\n    int nreads = 0;\n    char tbuff[256+32];\n    char filter[32];\n    size_t tsize = strlen(get_time()) + 1;\n\n    snprintf(filter, sizeof(filter), \":%d:%03d:\", profile->usb_dev.busnum, profile->usb_dev.devnum);\n\n    while(1) {\n        nreads = read(profile->usbmon_fd, tbuff + tsize, sizeof(tbuff) - tsize - 1);\n        if (nreads <= 0) {\n            if (nreads == -1 && errno == EINTR)\n                continue;\n            break;\n        }\n\n        tbuff[tsize+nreads] = '\\0';   // printf(\"%s\", buff);\n\n        if (!strstr(tbuff+tsize, filter))\n            continue;\n\n        snprintf(tbuff, sizeof(tbuff), \"%s\", get_time());\n        tbuff[tsize-1] = ' ';\n\n        fwrite(tbuff, strlen(tbuff), 1, profile->usbmon_logfile_fp);\n    }\n\n    return NULL;\n}\n\nint ql_capture_usbmon_log(PROFILE_T *profile, const char *log_path)\n{\n    char usbmon_path[256];\n    pthread_t pt;\n    pthread_attr_t attr;\n\n    if (access(\"/sys/module/usbmon\", F_OK)) {\n        dbg_time(\"usbmon is not load, please execute \\\"modprobe usbmon\\\" or \\\"insmod usbmon.ko\\\"\");\n        return -1;\n    }\n\n    if (access(\"/sys/kernel/debug/usb\", F_OK)) {\n        dbg_time(\"debugfs is not mount, please execute \\\"mount -t debugfs none_debugs /sys/kernel/debug\\\"\");\n        return -1;\n    }\n\n    snprintf(usbmon_path, sizeof(usbmon_path), \"/sys/kernel/debug/usb/usbmon/%du\", profile->usb_dev.busnum);\n    profile->usbmon_fd = open(usbmon_path, O_RDONLY);\n    if (profile->usbmon_fd < 0) {\n        dbg_time(\"open %s error(%d) (%s)\", usbmon_path, errno, strerror(errno));\n        return -1;\n    }\n\n    snprintf(usbmon_path, sizeof(usbmon_path), \"cat /sys/kernel/debug/usb/devices >> %s\", log_path);\n    if (system(usbmon_path) == -1) {};\n\n    profile->usbmon_logfile_fp = fopen(log_path, \"wb\");\n    if (!profile->usbmon_logfile_fp) {\n      dbg_time(\"open %s error(%d) (%s)\", log_path, errno, strerror(errno));\n      close(profile->usbmon_fd);\n      profile->usbmon_fd = -1;\n      return -1;\n    }\n\n    pthread_attr_init(&attr);\n    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n\n    pthread_create(&pt, &attr, catch_log, (void *)profile);\n\n    return 0;\n}\n\nvoid ql_stop_usbmon_log(PROFILE_T *profile) {\n    if (profile->usbmon_fd > 0)\n        close(profile->usbmon_fd);\n    if (profile->usbmon_logfile_fp)\n        fclose(profile->usbmon_logfile_fp);\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/ethtool-copy.h",
    "content": "/*\n * ethtool.h: Defines for Linux ethtool.\n *\n * Copyright (C) 1998 David S. Miller (davem@redhat.com)\n * Copyright 2001 Jeff Garzik <jgarzik@pobox.com>\n * Portions Copyright 2001 Sun Microsystems (thockin@sun.com)\n * Portions Copyright 2002 Intel (eli.kupermann@intel.com,\n *                                christopher.leech@intel.com,\n *                                scott.feldman@intel.com)\n * Portions Copyright (C) Sun Microsystems 2008\n */\n\n#ifndef _LINUX_ETHTOOL_H\n#define _LINUX_ETHTOOL_H\n\n#include <linux/types.h>\n#include <linux/if_ether.h>\n\n/* This should work for both 32 and 64 bit userland. */\nstruct ethtool_cmd {\n\t__u32\tcmd;\n\t__u32\tsupported;\t/* Features this interface supports */\n\t__u32\tadvertising;\t/* Features this interface advertises */\n\t__u16\tspeed;\t        /* The forced speed (lower bits) in\n\t\t\t\t * Mbps. Please use\n\t\t\t\t * ethtool_cmd_speed()/_set() to\n\t\t\t\t * access it */\n\t__u8\tduplex;\t\t/* Duplex, half or full */\n\t__u8\tport;\t\t/* Which connector port */\n\t__u8\tphy_address;\t/* MDIO PHY address (PRTAD for clause 45).\n\t\t\t\t * May be read-only or read-write\n\t\t\t\t * depending on the driver.\n\t\t\t\t */\n\t__u8\ttransceiver;\t/* Which transceiver to use */\n\t__u8\tautoneg;\t/* Enable or disable autonegotiation */\n\t__u8\tmdio_support;\t/* MDIO protocols supported.  Read-only.\n\t\t\t\t * Not set by all drivers.\n\t\t\t\t */\n\t__u32\tmaxtxpkt;\t/* Tx pkts before generating tx int */\n\t__u32\tmaxrxpkt;\t/* Rx pkts before generating rx int */\n\t__u16\tspeed_hi;       /* The forced speed (upper\n\t\t\t\t * bits) in Mbps. Please use\n\t\t\t\t * ethtool_cmd_speed()/_set() to\n\t\t\t\t * access it */\n\t__u8\teth_tp_mdix;\t/* twisted pair MDI-X status */\n\t__u8    eth_tp_mdix_ctrl; /* twisted pair MDI-X control, when set,\n\t\t\t\t   * link should be renegotiated if necessary\n\t\t\t\t   */\n\t__u32\tlp_advertising;\t/* Features the link partner advertises */\n\t__u32\treserved[2];\n};\n\nstatic __inline__ void ethtool_cmd_speed_set(struct ethtool_cmd *ep,\n\t\t\t\t\t __u32 speed)\n{\n\n\tep->speed = (__u16)speed;\n\tep->speed_hi = (__u16)(speed >> 16);\n}\n\nstatic __inline__ __u32 ethtool_cmd_speed(const struct ethtool_cmd *ep)\n{\n\treturn (ep->speed_hi << 16) | ep->speed;\n}\n\n/* Device supports clause 22 register access to PHY or peripherals\n * using the interface defined in <linux/mii.h>.  This should not be\n * set if there are known to be no such peripherals present or if\n * the driver only emulates clause 22 registers for compatibility.\n */\n#define ETH_MDIO_SUPPORTS_C22\t1\n\n/* Device supports clause 45 register access to PHY or peripherals\n * using the interface defined in <linux/mii.h> and <linux/mdio.h>.\n * This should not be set if there are known to be no such peripherals\n * present.\n */\n#define ETH_MDIO_SUPPORTS_C45\t2\n\n#define ETHTOOL_FWVERS_LEN\t32\n#define ETHTOOL_BUSINFO_LEN\t32\n/* these strings are set to whatever the driver author decides... */\nstruct ethtool_drvinfo {\n\t__u32\tcmd;\n\tchar\tdriver[32];\t/* driver short name, \"tulip\", \"eepro100\" */\n\tchar\tversion[32];\t/* driver version string */\n\tchar\tfw_version[ETHTOOL_FWVERS_LEN];\t/* firmware version string */\n\tchar\tbus_info[ETHTOOL_BUSINFO_LEN];\t/* Bus info for this IF. */\n\t\t\t\t/* For PCI devices, use pci_name(pci_dev). */\n\tchar\treserved1[32];\n\tchar\treserved2[12];\n\t\t\t\t/*\n\t\t\t\t * Some struct members below are filled in\n\t\t\t\t * using ops->get_sset_count().  Obtaining\n\t\t\t\t * this info from ethtool_drvinfo is now\n\t\t\t\t * deprecated; Use ETHTOOL_GSSET_INFO\n\t\t\t\t * instead.\n\t\t\t\t */\n\t__u32\tn_priv_flags;\t/* number of flags valid in ETHTOOL_GPFLAGS */\n\t__u32\tn_stats;\t/* number of u64's from ETHTOOL_GSTATS */\n\t__u32\ttestinfo_len;\n\t__u32\teedump_len;\t/* Size of data from ETHTOOL_GEEPROM (bytes) */\n\t__u32\tregdump_len;\t/* Size of data from ETHTOOL_GREGS (bytes) */\n};\n\n#define SOPASS_MAX\t6\n/* wake-on-lan settings */\nstruct ethtool_wolinfo {\n\t__u32\tcmd;\n\t__u32\tsupported;\n\t__u32\twolopts;\n\t__u8\tsopass[SOPASS_MAX]; /* SecureOn(tm) password */\n};\n\n/* for passing single values */\nstruct ethtool_value {\n\t__u32\tcmd;\n\t__u32\tdata;\n};\n\n/* for passing big chunks of data */\nstruct ethtool_regs {\n\t__u32\tcmd;\n\t__u32\tversion; /* driver-specific, indicates different chips/revs */\n\t__u32\tlen; /* bytes */\n\t__u8\tdata[0];\n};\n\n/* for passing EEPROM chunks */\nstruct ethtool_eeprom {\n\t__u32\tcmd;\n\t__u32\tmagic;\n\t__u32\toffset; /* in bytes */\n\t__u32\tlen; /* in bytes */\n\t__u8\tdata[0];\n};\n\n/**\n * struct ethtool_eee - Energy Efficient Ethernet information\n * @cmd: ETHTOOL_{G,S}EEE\n * @supported: Mask of %SUPPORTED_* flags for the speed/duplex combinations\n *\tfor which there is EEE support.\n * @advertised: Mask of %ADVERTISED_* flags for the speed/duplex combinations\n *\tadvertised as eee capable.\n * @lp_advertised: Mask of %ADVERTISED_* flags for the speed/duplex\n *\tcombinations advertised by the link partner as eee capable.\n * @eee_active: Result of the eee auto negotiation.\n * @eee_enabled: EEE configured mode (enabled/disabled).\n * @tx_lpi_enabled: Whether the interface should assert its tx lpi, given\n *\tthat eee was negotiated.\n * @tx_lpi_timer: Time in microseconds the interface delays prior to asserting\n *\tits tx lpi (after reaching 'idle' state). Effective only when eee\n *\twas negotiated and tx_lpi_enabled was set.\n */\nstruct ethtool_eee {\n\t__u32\tcmd;\n\t__u32\tsupported;\n\t__u32\tadvertised;\n\t__u32\tlp_advertised;\n\t__u32\teee_active;\n\t__u32\teee_enabled;\n\t__u32\ttx_lpi_enabled;\n\t__u32\ttx_lpi_timer;\n\t__u32\treserved[2];\n};\n\n/**\n * struct ethtool_modinfo - plugin module eeprom information\n * @cmd: %ETHTOOL_GMODULEINFO\n * @type: Standard the module information conforms to %ETH_MODULE_SFF_xxxx\n * @eeprom_len: Length of the eeprom\n *\n * This structure is used to return the information to\n * properly size memory for a subsequent call to %ETHTOOL_GMODULEEEPROM.\n * The type code indicates the eeprom data format\n */\nstruct ethtool_modinfo {\n\t__u32   cmd;\n\t__u32   type;\n\t__u32   eeprom_len;\n\t__u32   reserved[8];\n};\n\n/**\n * struct ethtool_coalesce - coalescing parameters for IRQs and stats updates\n * @cmd: ETHTOOL_{G,S}COALESCE\n * @rx_coalesce_usecs: How many usecs to delay an RX interrupt after\n *\ta packet arrives.\n * @rx_max_coalesced_frames: Maximum number of packets to receive\n *\tbefore an RX interrupt.\n * @rx_coalesce_usecs_irq: Same as @rx_coalesce_usecs, except that\n *\tthis value applies while an IRQ is being serviced by the host.\n * @rx_max_coalesced_frames_irq: Same as @rx_max_coalesced_frames,\n *\texcept that this value applies while an IRQ is being serviced\n *\tby the host.\n * @tx_coalesce_usecs: How many usecs to delay a TX interrupt after\n *\ta packet is sent.\n * @tx_max_coalesced_frames: Maximum number of packets to be sent\n *\tbefore a TX interrupt.\n * @tx_coalesce_usecs_irq: Same as @tx_coalesce_usecs, except that\n *\tthis value applies while an IRQ is being serviced by the host.\n * @tx_max_coalesced_frames_irq: Same as @tx_max_coalesced_frames,\n *\texcept that this value applies while an IRQ is being serviced\n *\tby the host.\n * @stats_block_coalesce_usecs: How many usecs to delay in-memory\n *\tstatistics block updates.  Some drivers do not have an\n *\tin-memory statistic block, and in such cases this value is\n *\tignored.  This value must not be zero.\n * @use_adaptive_rx_coalesce: Enable adaptive RX coalescing.\n * @use_adaptive_tx_coalesce: Enable adaptive TX coalescing.\n * @pkt_rate_low: Threshold for low packet rate (packets per second).\n * @rx_coalesce_usecs_low: How many usecs to delay an RX interrupt after\n *\ta packet arrives, when the packet rate is below @pkt_rate_low.\n * @rx_max_coalesced_frames_low: Maximum number of packets to be received\n *\tbefore an RX interrupt, when the packet rate is below @pkt_rate_low.\n * @tx_coalesce_usecs_low: How many usecs to delay a TX interrupt after\n *\ta packet is sent, when the packet rate is below @pkt_rate_low.\n * @tx_max_coalesced_frames_low: Maximum nuumber of packets to be sent before\n *\ta TX interrupt, when the packet rate is below @pkt_rate_low.\n * @pkt_rate_high: Threshold for high packet rate (packets per second).\n * @rx_coalesce_usecs_high: How many usecs to delay an RX interrupt after\n *\ta packet arrives, when the packet rate is above @pkt_rate_high.\n * @rx_max_coalesced_frames_high: Maximum number of packets to be received\n *\tbefore an RX interrupt, when the packet rate is above @pkt_rate_high.\n * @tx_coalesce_usecs_high: How many usecs to delay a TX interrupt after\n *\ta packet is sent, when the packet rate is above @pkt_rate_high.\n * @tx_max_coalesced_frames_high: Maximum number of packets to be sent before\n *\ta TX interrupt, when the packet rate is above @pkt_rate_high.\n * @rate_sample_interval: How often to do adaptive coalescing packet rate\n *\tsampling, measured in seconds.  Must not be zero.\n *\n * Each pair of (usecs, max_frames) fields specifies this exit\n * condition for interrupt coalescing:\n *\t(usecs > 0 && time_since_first_completion >= usecs) ||\n *\t(max_frames > 0 && completed_frames >= max_frames)\n * It is illegal to set both usecs and max_frames to zero as this\n * would cause interrupts to never be generated.  To disable\n * coalescing, set usecs = 0 and max_frames = 1.\n *\n * Some implementations ignore the value of max_frames and use the\n * condition:\n *\ttime_since_first_completion >= usecs\n * This is deprecated.  Drivers for hardware that does not support\n * counting completions should validate that max_frames == !rx_usecs.\n *\n * Adaptive RX/TX coalescing is an algorithm implemented by some\n * drivers to improve latency under low packet rates and improve\n * throughput under high packet rates.  Some drivers only implement\n * one of RX or TX adaptive coalescing.  Anything not implemented by\n * the driver causes these values to be silently ignored.\n *\n * When the packet rate is below @pkt_rate_high but above\n * @pkt_rate_low (both measured in packets per second) the\n * normal {rx,tx}_* coalescing parameters are used.\n */\nstruct ethtool_coalesce {\n\t__u32\tcmd;\n\t__u32\trx_coalesce_usecs;\n\t__u32\trx_max_coalesced_frames;\n\t__u32\trx_coalesce_usecs_irq;\n\t__u32\trx_max_coalesced_frames_irq;\n\t__u32\ttx_coalesce_usecs;\n\t__u32\ttx_max_coalesced_frames;\n\t__u32\ttx_coalesce_usecs_irq;\n\t__u32\ttx_max_coalesced_frames_irq;\n\t__u32\tstats_block_coalesce_usecs;\n\t__u32\tuse_adaptive_rx_coalesce;\n\t__u32\tuse_adaptive_tx_coalesce;\n\t__u32\tpkt_rate_low;\n\t__u32\trx_coalesce_usecs_low;\n\t__u32\trx_max_coalesced_frames_low;\n\t__u32\ttx_coalesce_usecs_low;\n\t__u32\ttx_max_coalesced_frames_low;\n\t__u32\tpkt_rate_high;\n\t__u32\trx_coalesce_usecs_high;\n\t__u32\trx_max_coalesced_frames_high;\n\t__u32\ttx_coalesce_usecs_high;\n\t__u32\ttx_max_coalesced_frames_high;\n\t__u32\trate_sample_interval;\n};\n\n/* for configuring RX/TX ring parameters */\nstruct ethtool_ringparam {\n\t__u32\tcmd;\t/* ETHTOOL_{G,S}RINGPARAM */\n\n\t/* Read only attributes.  These indicate the maximum number\n\t * of pending RX/TX ring entries the driver will allow the\n\t * user to set.\n\t */\n\t__u32\trx_max_pending;\n\t__u32\trx_mini_max_pending;\n\t__u32\trx_jumbo_max_pending;\n\t__u32\ttx_max_pending;\n\n\t/* Values changeable by the user.  The valid values are\n\t * in the range 1 to the \"*_max_pending\" counterpart above.\n\t */\n\t__u32\trx_pending;\n\t__u32\trx_mini_pending;\n\t__u32\trx_jumbo_pending;\n\t__u32\ttx_pending;\n};\n\n/**\n * struct ethtool_channels - configuring number of network channel\n * @cmd: ETHTOOL_{G,S}CHANNELS\n * @max_rx: Read only. Maximum number of receive channel the driver support.\n * @max_tx: Read only. Maximum number of transmit channel the driver support.\n * @max_other: Read only. Maximum number of other channel the driver support.\n * @max_combined: Read only. Maximum number of combined channel the driver\n *\tsupport. Set of queues RX, TX or other.\n * @rx_count: Valid values are in the range 1 to the max_rx.\n * @tx_count: Valid values are in the range 1 to the max_tx.\n * @other_count: Valid values are in the range 1 to the max_other.\n * @combined_count: Valid values are in the range 1 to the max_combined.\n *\n * This can be used to configure RX, TX and other channels.\n */\n\nstruct ethtool_channels {\n\t__u32\tcmd;\n\t__u32\tmax_rx;\n\t__u32\tmax_tx;\n\t__u32\tmax_other;\n\t__u32\tmax_combined;\n\t__u32\trx_count;\n\t__u32\ttx_count;\n\t__u32\tother_count;\n\t__u32\tcombined_count;\n};\n\n/* for configuring link flow control parameters */\nstruct ethtool_pauseparam {\n\t__u32\tcmd;\t/* ETHTOOL_{G,S}PAUSEPARAM */\n\n\t/* If the link is being auto-negotiated (via ethtool_cmd.autoneg\n\t * being true) the user may set 'autoneg' here non-zero to have the\n\t * pause parameters be auto-negotiated too.  In such a case, the\n\t * {rx,tx}_pause values below determine what capabilities are\n\t * advertised.\n\t *\n\t * If 'autoneg' is zero or the link is not being auto-negotiated,\n\t * then {rx,tx}_pause force the driver to use/not-use pause\n\t * flow control.\n\t */\n\t__u32\tautoneg;\n\t__u32\trx_pause;\n\t__u32\ttx_pause;\n};\n\n#define ETH_GSTRING_LEN\t\t32\nenum ethtool_stringset {\n\tETH_SS_TEST\t\t= 0,\n\tETH_SS_STATS,\n\tETH_SS_PRIV_FLAGS,\n\tETH_SS_NTUPLE_FILTERS,\t/* Do not use, GRXNTUPLE is now deprecated */\n\tETH_SS_FEATURES,\n};\n\n/* for passing string sets for data tagging */\nstruct ethtool_gstrings {\n\t__u32\tcmd;\t\t/* ETHTOOL_GSTRINGS */\n\t__u32\tstring_set;\t/* string set id e.c. ETH_SS_TEST, etc*/\n\t__u32\tlen;\t\t/* number of strings in the string set */\n\t__u8\tdata[0];\n};\n\nstruct ethtool_sset_info {\n\t__u32\tcmd;\t\t/* ETHTOOL_GSSET_INFO */\n\t__u32\treserved;\n\t__u64\tsset_mask;\t/* input: each bit selects an sset to query */\n\t\t\t\t/* output: each bit a returned sset */\n\t__u32\tdata[0];\t/* ETH_SS_xxx count, in order, based on bits\n\t\t\t\t   in sset_mask.  One bit implies one\n\t\t\t\t   __u32, two bits implies two\n\t\t\t\t   __u32's, etc. */\n};\n\n/**\n * enum ethtool_test_flags - flags definition of ethtool_test\n * @ETH_TEST_FL_OFFLINE: if set perform online and offline tests, otherwise\n *\tonly online tests.\n * @ETH_TEST_FL_FAILED: Driver set this flag if test fails.\n * @ETH_TEST_FL_EXTERNAL_LB: Application request to perform external loopback\n *\ttest.\n * @ETH_TEST_FL_EXTERNAL_LB_DONE: Driver performed the external loopback test\n */\n\nenum ethtool_test_flags {\n\tETH_TEST_FL_OFFLINE\t= (1 << 0),\n\tETH_TEST_FL_FAILED\t= (1 << 1),\n\tETH_TEST_FL_EXTERNAL_LB\t= (1 << 2),\n\tETH_TEST_FL_EXTERNAL_LB_DONE\t= (1 << 3),\n};\n\n/* for requesting NIC test and getting results*/\nstruct ethtool_test {\n\t__u32\tcmd;\t\t/* ETHTOOL_TEST */\n\t__u32\tflags;\t\t/* ETH_TEST_FL_xxx */\n\t__u32\treserved;\n\t__u32\tlen;\t\t/* result length, in number of u64 elements */\n\t__u64\tdata[0];\n};\n\n/* for dumping NIC-specific statistics */\nstruct ethtool_stats {\n\t__u32\tcmd;\t\t/* ETHTOOL_GSTATS */\n\t__u32\tn_stats;\t/* number of u64's being returned */\n\t__u64\tdata[0];\n};\n\nstruct ethtool_perm_addr {\n\t__u32\tcmd;\t\t/* ETHTOOL_GPERMADDR */\n\t__u32\tsize;\n\t__u8\tdata[0];\n};\n\n/* boolean flags controlling per-interface behavior characteristics.\n * When reading, the flag indicates whether or not a certain behavior\n * is enabled/present.  When writing, the flag indicates whether\n * or not the driver should turn on (set) or off (clear) a behavior.\n *\n * Some behaviors may read-only (unconditionally absent or present).\n * If such is the case, return EINVAL in the set-flags operation if the\n * flag differs from the read-only value.\n */\nenum ethtool_flags {\n\tETH_FLAG_TXVLAN\t\t= (1 << 7),\t/* TX VLAN offload enabled */\n\tETH_FLAG_RXVLAN\t\t= (1 << 8),\t/* RX VLAN offload enabled */\n\tETH_FLAG_LRO\t\t= (1 << 15),\t/* LRO is enabled */\n\tETH_FLAG_NTUPLE\t\t= (1 << 27),\t/* N-tuple filters enabled */\n\tETH_FLAG_RXHASH\t\t= (1 << 28),\n};\n\n/* The following structures are for supporting RX network flow\n * classification and RX n-tuple configuration. Note, all multibyte\n * fields, e.g., ip4src, ip4dst, psrc, pdst, spi, etc. are expected to\n * be in network byte order.\n */\n\n/**\n * struct ethtool_tcpip4_spec - flow specification for TCP/IPv4 etc.\n * @ip4src: Source host\n * @ip4dst: Destination host\n * @psrc: Source port\n * @pdst: Destination port\n * @tos: Type-of-service\n *\n * This can be used to specify a TCP/IPv4, UDP/IPv4 or SCTP/IPv4 flow.\n */\nstruct ethtool_tcpip4_spec {\n\t__be32\tip4src;\n\t__be32\tip4dst;\n\t__be16\tpsrc;\n\t__be16\tpdst;\n\t__u8    tos;\n};\n\n/**\n * struct ethtool_ah_espip4_spec - flow specification for IPsec/IPv4\n * @ip4src: Source host\n * @ip4dst: Destination host\n * @spi: Security parameters index\n * @tos: Type-of-service\n *\n * This can be used to specify an IPsec transport or tunnel over IPv4.\n */\nstruct ethtool_ah_espip4_spec {\n\t__be32\tip4src;\n\t__be32\tip4dst;\n\t__be32\tspi;\n\t__u8    tos;\n};\n\n#define\tETH_RX_NFC_IP4\t1\n\n/**\n * struct ethtool_usrip4_spec - general flow specification for IPv4\n * @ip4src: Source host\n * @ip4dst: Destination host\n * @l4_4_bytes: First 4 bytes of transport (layer 4) header\n * @tos: Type-of-service\n * @ip_ver: Value must be %ETH_RX_NFC_IP4; mask must be 0\n * @proto: Transport protocol number; mask must be 0\n */\nstruct ethtool_usrip4_spec {\n\t__be32\tip4src;\n\t__be32\tip4dst;\n\t__be32\tl4_4_bytes;\n\t__u8    tos;\n\t__u8    ip_ver;\n\t__u8    proto;\n};\n\nunion ethtool_flow_union {\n\tstruct ethtool_tcpip4_spec\t\ttcp_ip4_spec;\n\tstruct ethtool_tcpip4_spec\t\tudp_ip4_spec;\n\tstruct ethtool_tcpip4_spec\t\tsctp_ip4_spec;\n\tstruct ethtool_ah_espip4_spec\t\tah_ip4_spec;\n\tstruct ethtool_ah_espip4_spec\t\tesp_ip4_spec;\n\tstruct ethtool_usrip4_spec\t\tusr_ip4_spec;\n\tstruct ethhdr\t\t\t\tether_spec;\n\t__u8\t\t\t\t\thdata[52];\n};\n\n/**\n * struct ethtool_flow_ext - additional RX flow fields\n * @h_dest: destination MAC address\n * @vlan_etype: VLAN EtherType\n * @vlan_tci: VLAN tag control information\n * @data: user defined data\n *\n * Note, @vlan_etype, @vlan_tci, and @data are only valid if %FLOW_EXT\n * is set in &struct ethtool_rx_flow_spec @flow_type.\n * @h_dest is valid if %FLOW_MAC_EXT is set.\n */\nstruct ethtool_flow_ext {\n\t__u8\t\tpadding[2];\n\tunsigned char\th_dest[ETH_ALEN];\n\t__be16\t\tvlan_etype;\n\t__be16\t\tvlan_tci;\n\t__be32\t\tdata[2];\n};\n\n/**\n * struct ethtool_rx_flow_spec - classification rule for RX flows\n * @flow_type: Type of match to perform, e.g. %TCP_V4_FLOW\n * @h_u: Flow fields to match (dependent on @flow_type)\n * @h_ext: Additional fields to match\n * @m_u: Masks for flow field bits to be matched\n * @m_ext: Masks for additional field bits to be matched\n *\tNote, all additional fields must be ignored unless @flow_type\n *\tincludes the %FLOW_EXT or %FLOW_MAC_EXT flag\n *\t(see &struct ethtool_flow_ext description).\n * @ring_cookie: RX ring/queue index to deliver to, or %RX_CLS_FLOW_DISC\n *\tif packets should be discarded\n * @location: Location of rule in the table.  Locations must be\n *\tnumbered such that a flow matching multiple rules will be\n *\tclassified according to the first (lowest numbered) rule.\n */\nstruct ethtool_rx_flow_spec {\n\t__u32\t\tflow_type;\n\tunion ethtool_flow_union h_u;\n\tstruct ethtool_flow_ext h_ext;\n\tunion ethtool_flow_union m_u;\n\tstruct ethtool_flow_ext m_ext;\n\t__u64\t\tring_cookie;\n\t__u32\t\tlocation;\n};\n\n/**\n * struct ethtool_rxnfc - command to get or set RX flow classification rules\n * @cmd: Specific command number - %ETHTOOL_GRXFH, %ETHTOOL_SRXFH,\n *\t%ETHTOOL_GRXRINGS, %ETHTOOL_GRXCLSRLCNT, %ETHTOOL_GRXCLSRULE,\n *\t%ETHTOOL_GRXCLSRLALL, %ETHTOOL_SRXCLSRLDEL or %ETHTOOL_SRXCLSRLINS\n * @flow_type: Type of flow to be affected, e.g. %TCP_V4_FLOW\n * @data: Command-dependent value\n * @fs: Flow classification rule\n * @rule_cnt: Number of rules to be affected\n * @rule_locs: Array of used rule locations\n *\n * For %ETHTOOL_GRXFH and %ETHTOOL_SRXFH, @data is a bitmask indicating\n * the fields included in the flow hash, e.g. %RXH_IP_SRC.  The following\n * structure fields must not be used.\n *\n * For %ETHTOOL_GRXRINGS, @data is set to the number of RX rings/queues\n * on return.\n *\n * For %ETHTOOL_GRXCLSRLCNT, @rule_cnt is set to the number of defined\n * rules on return.  If @data is non-zero on return then it is the\n * size of the rule table, plus the flag %RX_CLS_LOC_SPECIAL if the\n * driver supports any special location values.  If that flag is not\n * set in @data then special location values should not be used.\n *\n * For %ETHTOOL_GRXCLSRULE, @fs.@location specifies the location of an\n * existing rule on entry and @fs contains the rule on return.\n *\n * For %ETHTOOL_GRXCLSRLALL, @rule_cnt specifies the array size of the\n * user buffer for @rule_locs on entry.  On return, @data is the size\n * of the rule table, @rule_cnt is the number of defined rules, and\n * @rule_locs contains the locations of the defined rules.  Drivers\n * must use the second parameter to get_rxnfc() instead of @rule_locs.\n *\n * For %ETHTOOL_SRXCLSRLINS, @fs specifies the rule to add or update.\n * @fs.@location either specifies the location to use or is a special\n * location value with %RX_CLS_LOC_SPECIAL flag set.  On return,\n * @fs.@location is the actual rule location.\n *\n * For %ETHTOOL_SRXCLSRLDEL, @fs.@location specifies the location of an\n * existing rule on entry.\n *\n * A driver supporting the special location values for\n * %ETHTOOL_SRXCLSRLINS may add the rule at any suitable unused\n * location, and may remove a rule at a later location (lower\n * priority) that matches exactly the same set of flows.  The special\n * values are: %RX_CLS_LOC_ANY, selecting any location;\n * %RX_CLS_LOC_FIRST, selecting the first suitable location (maximum\n * priority); and %RX_CLS_LOC_LAST, selecting the last suitable\n * location (minimum priority).  Additional special values may be\n * defined in future and drivers must return -%EINVAL for any\n * unrecognised value.\n */\nstruct ethtool_rxnfc {\n\t__u32\t\t\t\tcmd;\n\t__u32\t\t\t\tflow_type;\n\t__u64\t\t\t\tdata;\n\tstruct ethtool_rx_flow_spec\tfs;\n\t__u32\t\t\t\trule_cnt;\n\t__u32\t\t\t\trule_locs[0];\n};\n\n\n/**\n * struct ethtool_rxfh_indir - command to get or set RX flow hash indirection\n * @cmd: Specific command number - %ETHTOOL_GRXFHINDIR or %ETHTOOL_SRXFHINDIR\n * @size: On entry, the array size of the user buffer, which may be zero.\n *\tOn return from %ETHTOOL_GRXFHINDIR, the array size of the hardware\n *\tindirection table.\n * @ring_index: RX ring/queue index for each hash value\n *\n * For %ETHTOOL_GRXFHINDIR, a @size of zero means that only the size\n * should be returned.  For %ETHTOOL_SRXFHINDIR, a @size of zero means\n * the table should be reset to default values.  This last feature\n * is not supported by the original implementations.\n */\nstruct ethtool_rxfh_indir {\n\t__u32\tcmd;\n\t__u32\tsize;\n\t__u32\tring_index[0];\n};\n\n/**\n * struct ethtool_rx_ntuple_flow_spec - specification for RX flow filter\n * @flow_type: Type of match to perform, e.g. %TCP_V4_FLOW\n * @h_u: Flow field values to match (dependent on @flow_type)\n * @m_u: Masks for flow field value bits to be ignored\n * @vlan_tag: VLAN tag to match\n * @vlan_tag_mask: Mask for VLAN tag bits to be ignored\n * @data: Driver-dependent data to match\n * @data_mask: Mask for driver-dependent data bits to be ignored\n * @action: RX ring/queue index to deliver to (non-negative) or other action\n *\t(negative, e.g. %ETHTOOL_RXNTUPLE_ACTION_DROP)\n *\n * For flow types %TCP_V4_FLOW, %UDP_V4_FLOW and %SCTP_V4_FLOW, where\n * a field value and mask are both zero this is treated as if all mask\n * bits are set i.e. the field is ignored.\n */\nstruct ethtool_rx_ntuple_flow_spec {\n\t__u32\t\t flow_type;\n\tunion {\n\t\tstruct ethtool_tcpip4_spec\t\ttcp_ip4_spec;\n\t\tstruct ethtool_tcpip4_spec\t\tudp_ip4_spec;\n\t\tstruct ethtool_tcpip4_spec\t\tsctp_ip4_spec;\n\t\tstruct ethtool_ah_espip4_spec\t\tah_ip4_spec;\n\t\tstruct ethtool_ah_espip4_spec\t\tesp_ip4_spec;\n\t\tstruct ethtool_usrip4_spec\t\tusr_ip4_spec;\n\t\tstruct ethhdr\t\t\t\tether_spec;\n\t\t__u8\t\t\t\t\thdata[72];\n\t} h_u, m_u;\n\n\t__u16\t        vlan_tag;\n\t__u16\t        vlan_tag_mask;\n\t__u64\t\tdata;\n\t__u64\t\tdata_mask;\n\n\t__s32\t\taction;\n#define ETHTOOL_RXNTUPLE_ACTION_DROP\t(-1)\t/* drop packet */\n#define ETHTOOL_RXNTUPLE_ACTION_CLEAR\t(-2)\t/* clear filter */\n};\n\n/**\n * struct ethtool_rx_ntuple - command to set or clear RX flow filter\n * @cmd: Command number - %ETHTOOL_SRXNTUPLE\n * @fs: Flow filter specification\n */\nstruct ethtool_rx_ntuple {\n\t__u32\t\t\t\t\tcmd;\n\tstruct ethtool_rx_ntuple_flow_spec\tfs;\n};\n\n#define ETHTOOL_FLASH_MAX_FILENAME\t128\nenum ethtool_flash_op_type {\n\tETHTOOL_FLASH_ALL_REGIONS\t= 0,\n};\n\n/* for passing firmware flashing related parameters */\nstruct ethtool_flash {\n\t__u32\tcmd;\n\t__u32\tregion;\n\tchar\tdata[ETHTOOL_FLASH_MAX_FILENAME];\n};\n\n/**\n * struct ethtool_dump - used for retrieving, setting device dump\n * @cmd: Command number - %ETHTOOL_GET_DUMP_FLAG, %ETHTOOL_GET_DUMP_DATA, or\n * \t%ETHTOOL_SET_DUMP\n * @version: FW version of the dump, filled in by driver\n * @flag: driver dependent flag for dump setting, filled in by driver during\n *        get and filled in by ethtool for set operation.\n *        flag must be initialized by macro ETH_FW_DUMP_DISABLE value when\n *        firmware dump is disabled.\n * @len: length of dump data, used as the length of the user buffer on entry to\n * \t %ETHTOOL_GET_DUMP_DATA and this is returned as dump length by driver\n * \t for %ETHTOOL_GET_DUMP_FLAG command\n * @data: data collected for get dump data operation\n */\n\n#define ETH_FW_DUMP_DISABLE 0\n\nstruct ethtool_dump {\n\t__u32\tcmd;\n\t__u32\tversion;\n\t__u32\tflag;\n\t__u32\tlen;\n\t__u8\tdata[0];\n};\n\n/* for returning and changing feature sets */\n\n/**\n * struct ethtool_get_features_block - block with state of 32 features\n * @available: mask of changeable features\n * @requested: mask of features requested to be enabled if possible\n * @active: mask of currently enabled features\n * @never_changed: mask of features not changeable for any device\n */\nstruct ethtool_get_features_block {\n\t__u32\tavailable;\n\t__u32\trequested;\n\t__u32\tactive;\n\t__u32\tnever_changed;\n};\n\n/**\n * struct ethtool_gfeatures - command to get state of device's features\n * @cmd: command number = %ETHTOOL_GFEATURES\n * @size: in: number of elements in the features[] array;\n *       out: number of elements in features[] needed to hold all features\n * @features: state of features\n */\nstruct ethtool_gfeatures {\n\t__u32\tcmd;\n\t__u32\tsize;\n\tstruct ethtool_get_features_block features[0];\n};\n\n/**\n * struct ethtool_set_features_block - block with request for 32 features\n * @valid: mask of features to be changed\n * @requested: values of features to be changed\n */\nstruct ethtool_set_features_block {\n\t__u32\tvalid;\n\t__u32\trequested;\n};\n\n/**\n * struct ethtool_sfeatures - command to request change in device's features\n * @cmd: command number = %ETHTOOL_SFEATURES\n * @size: array size of the features[] array\n * @features: feature change masks\n */\nstruct ethtool_sfeatures {\n\t__u32\tcmd;\n\t__u32\tsize;\n\tstruct ethtool_set_features_block features[0];\n};\n\n/**\n * struct ethtool_ts_info - holds a device's timestamping and PHC association\n * @cmd: command number = %ETHTOOL_GET_TS_INFO\n * @so_timestamping: bit mask of the sum of the supported SO_TIMESTAMPING flags\n * @phc_index: device index of the associated PHC, or -1 if there is none\n * @tx_types: bit mask of the supported hwtstamp_tx_types enumeration values\n * @rx_filters: bit mask of the supported hwtstamp_rx_filters enumeration values\n *\n * The bits in the 'tx_types' and 'rx_filters' fields correspond to\n * the 'hwtstamp_tx_types' and 'hwtstamp_rx_filters' enumeration values,\n * respectively.  For example, if the device supports HWTSTAMP_TX_ON,\n * then (1 << HWTSTAMP_TX_ON) in 'tx_types' will be set.\n */\nstruct ethtool_ts_info {\n\t__u32\tcmd;\n\t__u32\tso_timestamping;\n\t__s32\tphc_index;\n\t__u32\ttx_types;\n\t__u32\ttx_reserved[3];\n\t__u32\trx_filters;\n\t__u32\trx_reserved[3];\n};\n\n/*\n * %ETHTOOL_SFEATURES changes features present in features[].valid to the\n * values of corresponding bits in features[].requested. Bits in .requested\n * not set in .valid or not changeable are ignored.\n *\n * Returns %EINVAL when .valid contains undefined or never-changeable bits\n * or size is not equal to required number of features words (32-bit blocks).\n * Returns >= 0 if request was completed; bits set in the value mean:\n *   %ETHTOOL_F_UNSUPPORTED - there were bits set in .valid that are not\n *\tchangeable (not present in %ETHTOOL_GFEATURES' features[].available)\n *\tthose bits were ignored.\n *   %ETHTOOL_F_WISH - some or all changes requested were recorded but the\n *      resulting state of bits masked by .valid is not equal to .requested.\n *      Probably there are other device-specific constraints on some features\n *      in the set. When %ETHTOOL_F_UNSUPPORTED is set, .valid is considered\n *      here as though ignored bits were cleared.\n *   %ETHTOOL_F_COMPAT - some or all changes requested were made by calling\n *      compatibility functions. Requested offload state cannot be properly\n *      managed by kernel.\n *\n * Meaning of bits in the masks are obtained by %ETHTOOL_GSSET_INFO (number of\n * bits in the arrays - always multiple of 32) and %ETHTOOL_GSTRINGS commands\n * for ETH_SS_FEATURES string set. First entry in the table corresponds to least\n * significant bit in features[0] fields. Empty strings mark undefined features.\n */\nenum ethtool_sfeatures_retval_bits {\n\tETHTOOL_F_UNSUPPORTED__BIT,\n\tETHTOOL_F_WISH__BIT,\n\tETHTOOL_F_COMPAT__BIT,\n};\n\n#define ETHTOOL_F_UNSUPPORTED   (1 << ETHTOOL_F_UNSUPPORTED__BIT)\n#define ETHTOOL_F_WISH          (1 << ETHTOOL_F_WISH__BIT)\n#define ETHTOOL_F_COMPAT        (1 << ETHTOOL_F_COMPAT__BIT)\n\n\n/* CMDs currently supported */\n#define ETHTOOL_GSET\t\t0x00000001 /* Get settings. */\n#define ETHTOOL_SSET\t\t0x00000002 /* Set settings. */\n#define ETHTOOL_GDRVINFO\t0x00000003 /* Get driver info. */\n#define ETHTOOL_GREGS\t\t0x00000004 /* Get NIC registers. */\n#define ETHTOOL_GWOL\t\t0x00000005 /* Get wake-on-lan options. */\n#define ETHTOOL_SWOL\t\t0x00000006 /* Set wake-on-lan options. */\n#define ETHTOOL_GMSGLVL\t\t0x00000007 /* Get driver message level */\n#define ETHTOOL_SMSGLVL\t\t0x00000008 /* Set driver msg level. */\n#define ETHTOOL_NWAY_RST\t0x00000009 /* Restart autonegotiation. */\n/* Get link status for host, i.e. whether the interface *and* the\n * physical port (if there is one) are up (ethtool_value). */\n#define ETHTOOL_GLINK\t\t0x0000000a\n#define ETHTOOL_GEEPROM\t\t0x0000000b /* Get EEPROM data */\n#define ETHTOOL_SEEPROM\t\t0x0000000c /* Set EEPROM data. */\n#define ETHTOOL_GCOALESCE\t0x0000000e /* Get coalesce config */\n#define ETHTOOL_SCOALESCE\t0x0000000f /* Set coalesce config. */\n#define ETHTOOL_GRINGPARAM\t0x00000010 /* Get ring parameters */\n#define ETHTOOL_SRINGPARAM\t0x00000011 /* Set ring parameters. */\n#define ETHTOOL_GPAUSEPARAM\t0x00000012 /* Get pause parameters */\n#define ETHTOOL_SPAUSEPARAM\t0x00000013 /* Set pause parameters. */\n#define ETHTOOL_GRXCSUM\t\t0x00000014 /* Get RX hw csum enable (ethtool_value) */\n#define ETHTOOL_SRXCSUM\t\t0x00000015 /* Set RX hw csum enable (ethtool_value) */\n#define ETHTOOL_GTXCSUM\t\t0x00000016 /* Get TX hw csum enable (ethtool_value) */\n#define ETHTOOL_STXCSUM\t\t0x00000017 /* Set TX hw csum enable (ethtool_value) */\n#define ETHTOOL_GSG\t\t0x00000018 /* Get scatter-gather enable\n\t\t\t\t\t    * (ethtool_value) */\n#define ETHTOOL_SSG\t\t0x00000019 /* Set scatter-gather enable\n\t\t\t\t\t    * (ethtool_value). */\n#define ETHTOOL_TEST\t\t0x0000001a /* execute NIC self-test. */\n#define ETHTOOL_GSTRINGS\t0x0000001b /* get specified string set */\n#define ETHTOOL_PHYS_ID\t\t0x0000001c /* identify the NIC */\n#define ETHTOOL_GSTATS\t\t0x0000001d /* get NIC-specific statistics */\n#define ETHTOOL_GTSO\t\t0x0000001e /* Get TSO enable (ethtool_value) */\n#define ETHTOOL_STSO\t\t0x0000001f /* Set TSO enable (ethtool_value) */\n#define ETHTOOL_GPERMADDR\t0x00000020 /* Get permanent hardware address */\n#define ETHTOOL_GUFO\t\t0x00000021 /* Get UFO enable (ethtool_value) */\n#define ETHTOOL_SUFO\t\t0x00000022 /* Set UFO enable (ethtool_value) */\n#define ETHTOOL_GGSO\t\t0x00000023 /* Get GSO enable (ethtool_value) */\n#define ETHTOOL_SGSO\t\t0x00000024 /* Set GSO enable (ethtool_value) */\n#define ETHTOOL_GFLAGS\t\t0x00000025 /* Get flags bitmap(ethtool_value) */\n#define ETHTOOL_SFLAGS\t\t0x00000026 /* Set flags bitmap(ethtool_value) */\n#define ETHTOOL_GPFLAGS\t\t0x00000027 /* Get driver-private flags bitmap */\n#define ETHTOOL_SPFLAGS\t\t0x00000028 /* Set driver-private flags bitmap */\n\n#define ETHTOOL_GRXFH\t\t0x00000029 /* Get RX flow hash configuration */\n#define ETHTOOL_SRXFH\t\t0x0000002a /* Set RX flow hash configuration */\n#define ETHTOOL_GGRO\t\t0x0000002b /* Get GRO enable (ethtool_value) */\n#define ETHTOOL_SGRO\t\t0x0000002c /* Set GRO enable (ethtool_value) */\n#define ETHTOOL_GRXRINGS\t0x0000002d /* Get RX rings available for LB */\n#define ETHTOOL_GRXCLSRLCNT\t0x0000002e /* Get RX class rule count */\n#define ETHTOOL_GRXCLSRULE\t0x0000002f /* Get RX classification rule */\n#define ETHTOOL_GRXCLSRLALL\t0x00000030 /* Get all RX classification rule */\n#define ETHTOOL_SRXCLSRLDEL\t0x00000031 /* Delete RX classification rule */\n#define ETHTOOL_SRXCLSRLINS\t0x00000032 /* Insert RX classification rule */\n#define ETHTOOL_FLASHDEV\t0x00000033 /* Flash firmware to device */\n#define ETHTOOL_RESET\t\t0x00000034 /* Reset hardware */\n#define ETHTOOL_SRXNTUPLE\t0x00000035 /* Add an n-tuple filter to device */\n#define ETHTOOL_GRXNTUPLE\t0x00000036 /* deprecated */\n#define ETHTOOL_GSSET_INFO\t0x00000037 /* Get string set info */\n#define ETHTOOL_GRXFHINDIR\t0x00000038 /* Get RX flow hash indir'n table */\n#define ETHTOOL_SRXFHINDIR\t0x00000039 /* Set RX flow hash indir'n table */\n\n#define ETHTOOL_GFEATURES\t0x0000003a /* Get device offload settings */\n#define ETHTOOL_SFEATURES\t0x0000003b /* Change device offload settings */\n#define ETHTOOL_GCHANNELS\t0x0000003c /* Get no of channels */\n#define ETHTOOL_SCHANNELS\t0x0000003d /* Set no of channels */\n#define ETHTOOL_SET_DUMP\t0x0000003e /* Set dump settings */\n#define ETHTOOL_GET_DUMP_FLAG\t0x0000003f /* Get dump settings */\n#define ETHTOOL_GET_DUMP_DATA\t0x00000040 /* Get dump data */\n#define ETHTOOL_GET_TS_INFO\t0x00000041 /* Get time stamping and PHC info */\n#define ETHTOOL_GMODULEINFO\t0x00000042 /* Get plug-in module information */\n#define ETHTOOL_GMODULEEEPROM\t0x00000043 /* Get plug-in module eeprom */\n#define ETHTOOL_GEEE\t\t0x00000044 /* Get EEE settings */\n#define ETHTOOL_SEEE\t\t0x00000045 /* Set EEE settings */\n\n/* compatibility with older code */\n#define SPARC_ETH_GSET\t\tETHTOOL_GSET\n#define SPARC_ETH_SSET\t\tETHTOOL_SSET\n\n/* Indicates what features are supported by the interface. */\n#define SUPPORTED_10baseT_Half\t\t(1 << 0)\n#define SUPPORTED_10baseT_Full\t\t(1 << 1)\n#define SUPPORTED_100baseT_Half\t\t(1 << 2)\n#define SUPPORTED_100baseT_Full\t\t(1 << 3)\n#define SUPPORTED_1000baseT_Half\t(1 << 4)\n#define SUPPORTED_1000baseT_Full\t(1 << 5)\n#define SUPPORTED_Autoneg\t\t(1 << 6)\n#define SUPPORTED_TP\t\t\t(1 << 7)\n#define SUPPORTED_AUI\t\t\t(1 << 8)\n#define SUPPORTED_MII\t\t\t(1 << 9)\n#define SUPPORTED_FIBRE\t\t\t(1 << 10)\n#define SUPPORTED_BNC\t\t\t(1 << 11)\n#define SUPPORTED_10000baseT_Full\t(1 << 12)\n#define SUPPORTED_Pause\t\t\t(1 << 13)\n#define SUPPORTED_Asym_Pause\t\t(1 << 14)\n#define SUPPORTED_2500baseX_Full\t(1 << 15)\n#define SUPPORTED_Backplane\t\t(1 << 16)\n#define SUPPORTED_1000baseKX_Full\t(1 << 17)\n#define SUPPORTED_10000baseKX4_Full\t(1 << 18)\n#define SUPPORTED_10000baseKR_Full\t(1 << 19)\n#define SUPPORTED_10000baseR_FEC\t(1 << 20)\n#define SUPPORTED_20000baseMLD2_Full\t(1 << 21)\n#define SUPPORTED_20000baseKR2_Full\t(1 << 22)\n#define SUPPORTED_40000baseKR4_Full\t(1 << 23)\n#define SUPPORTED_40000baseCR4_Full\t(1 << 24)\n#define SUPPORTED_40000baseSR4_Full\t(1 << 25)\n#define SUPPORTED_40000baseLR4_Full\t(1 << 26)\n\n/* Indicates what features are advertised by the interface. */\n#define ADVERTISED_10baseT_Half\t\t(1 << 0)\n#define ADVERTISED_10baseT_Full\t\t(1 << 1)\n#define ADVERTISED_100baseT_Half\t(1 << 2)\n#define ADVERTISED_100baseT_Full\t(1 << 3)\n#define ADVERTISED_1000baseT_Half\t(1 << 4)\n#define ADVERTISED_1000baseT_Full\t(1 << 5)\n#define ADVERTISED_Autoneg\t\t(1 << 6)\n#define ADVERTISED_TP\t\t\t(1 << 7)\n#define ADVERTISED_AUI\t\t\t(1 << 8)\n#define ADVERTISED_MII\t\t\t(1 << 9)\n#define ADVERTISED_FIBRE\t\t(1 << 10)\n#define ADVERTISED_BNC\t\t\t(1 << 11)\n#define ADVERTISED_10000baseT_Full\t(1 << 12)\n#define ADVERTISED_Pause\t\t(1 << 13)\n#define ADVERTISED_Asym_Pause\t\t(1 << 14)\n#define ADVERTISED_2500baseX_Full\t(1 << 15)\n#define ADVERTISED_Backplane\t\t(1 << 16)\n#define ADVERTISED_1000baseKX_Full\t(1 << 17)\n#define ADVERTISED_10000baseKX4_Full\t(1 << 18)\n#define ADVERTISED_10000baseKR_Full\t(1 << 19)\n#define ADVERTISED_10000baseR_FEC\t(1 << 20)\n#define ADVERTISED_20000baseMLD2_Full\t(1 << 21)\n#define ADVERTISED_20000baseKR2_Full\t(1 << 22)\n#define ADVERTISED_40000baseKR4_Full\t(1 << 23)\n#define ADVERTISED_40000baseCR4_Full\t(1 << 24)\n#define ADVERTISED_40000baseSR4_Full\t(1 << 25)\n#define ADVERTISED_40000baseLR4_Full\t(1 << 26)\n\n/* The following are all involved in forcing a particular link\n * mode for the device for setting things.  When getting the\n * devices settings, these indicate the current mode and whether\n * it was forced up into this mode or autonegotiated.\n */\n\n/* The forced speed, 10Mb, 100Mb, gigabit, 2.5Gb, 10GbE. */\n#define SPEED_10\t\t10\n#define SPEED_100\t\t100\n#define SPEED_1000\t\t1000\n#define SPEED_2500\t\t2500\n#define SPEED_10000\t\t10000\n#define SPEED_UNKNOWN\t\t-1\n\n/* Duplex, half or full. */\n#define DUPLEX_HALF\t\t0x00\n#define DUPLEX_FULL\t\t0x01\n#define DUPLEX_UNKNOWN\t\t0xff\n\n/* Which connector port. */\n#define PORT_TP\t\t\t0x00\n#define PORT_AUI\t\t0x01\n#define PORT_MII\t\t0x02\n#define PORT_FIBRE\t\t0x03\n#define PORT_BNC\t\t0x04\n#define PORT_DA\t\t\t0x05\n#define PORT_NONE\t\t0xef\n#define PORT_OTHER\t\t0xff\n\n/* Which transceiver to use. */\n#define XCVR_INTERNAL\t\t0x00\n#define XCVR_EXTERNAL\t\t0x01\n#define XCVR_DUMMY1\t\t0x02\n#define XCVR_DUMMY2\t\t0x03\n#define XCVR_DUMMY3\t\t0x04\n\n/* Enable or disable autonegotiation.  If this is set to enable,\n * the forced link modes above are completely ignored.\n */\n#define AUTONEG_DISABLE\t\t0x00\n#define AUTONEG_ENABLE\t\t0x01\n\n/* MDI or MDI-X status/control - if MDI/MDI_X/AUTO is set then\n * the driver is required to renegotiate link\n */\n#define ETH_TP_MDI_INVALID\t0x00 /* status: unknown; control: unsupported */\n#define ETH_TP_MDI\t\t0x01 /* status: MDI;     control: force MDI */\n#define ETH_TP_MDI_X\t\t0x02 /* status: MDI-X;   control: force MDI-X */\n#define ETH_TP_MDI_AUTO\t\t0x03 /*                  control: auto-select */\n\n/* Wake-On-Lan options. */\n#define WAKE_PHY\t\t(1 << 0)\n#define WAKE_UCAST\t\t(1 << 1)\n#define WAKE_MCAST\t\t(1 << 2)\n#define WAKE_BCAST\t\t(1 << 3)\n#define WAKE_ARP\t\t(1 << 4)\n#define WAKE_MAGIC\t\t(1 << 5)\n#define WAKE_MAGICSECURE\t(1 << 6) /* only meaningful if WAKE_MAGIC */\n\n/* L2-L4 network traffic flow types */\n#define\tTCP_V4_FLOW\t0x01\t/* hash or spec (tcp_ip4_spec) */\n#define\tUDP_V4_FLOW\t0x02\t/* hash or spec (udp_ip4_spec) */\n#define\tSCTP_V4_FLOW\t0x03\t/* hash or spec (sctp_ip4_spec) */\n#define\tAH_ESP_V4_FLOW\t0x04\t/* hash only */\n#define\tTCP_V6_FLOW\t0x05\t/* hash only */\n#define\tUDP_V6_FLOW\t0x06\t/* hash only */\n#define\tSCTP_V6_FLOW\t0x07\t/* hash only */\n#define\tAH_ESP_V6_FLOW\t0x08\t/* hash only */\n#define\tAH_V4_FLOW\t0x09\t/* hash or spec (ah_ip4_spec) */\n#define\tESP_V4_FLOW\t0x0a\t/* hash or spec (esp_ip4_spec) */\n#define\tAH_V6_FLOW\t0x0b\t/* hash only */\n#define\tESP_V6_FLOW\t0x0c\t/* hash only */\n#define\tIP_USER_FLOW\t0x0d\t/* spec only (usr_ip4_spec) */\n#define\tIPV4_FLOW\t0x10\t/* hash only */\n#define\tIPV6_FLOW\t0x11\t/* hash only */\n#define\tETHER_FLOW\t0x12\t/* spec only (ether_spec) */\n/* Flag to enable additional fields in struct ethtool_rx_flow_spec */\n#define\tFLOW_EXT\t0x80000000\n#define\tFLOW_MAC_EXT\t0x40000000\n\n/* L3-L4 network traffic flow hash options */\n#define\tRXH_L2DA\t(1 << 1)\n#define\tRXH_VLAN\t(1 << 2)\n#define\tRXH_L3_PROTO\t(1 << 3)\n#define\tRXH_IP_SRC\t(1 << 4)\n#define\tRXH_IP_DST\t(1 << 5)\n#define\tRXH_L4_B_0_1\t(1 << 6) /* src port in case of TCP/UDP/SCTP */\n#define\tRXH_L4_B_2_3\t(1 << 7) /* dst port in case of TCP/UDP/SCTP */\n#define\tRXH_DISCARD\t(1 << 31)\n\n#define\tRX_CLS_FLOW_DISC\t0xffffffffffffffffULL\n\n/* Special RX classification rule insert location values */\n#define RX_CLS_LOC_SPECIAL\t0x80000000\t/* flag */\n#define RX_CLS_LOC_ANY\t\t0xffffffff\n#define RX_CLS_LOC_FIRST\t0xfffffffe\n#define RX_CLS_LOC_LAST\t\t0xfffffffd\n\n/* EEPROM Standards for plug in modules */\n#define ETH_MODULE_SFF_8079\t\t0x1\n#define ETH_MODULE_SFF_8079_LEN\t\t256\n#define ETH_MODULE_SFF_8472\t\t0x2\n#define ETH_MODULE_SFF_8472_LEN\t\t512\n\n/* Reset flags */\n/* The reset() operation must clear the flags for the components which\n * were actually reset.  On successful return, the flags indicate the\n * components which were not reset, either because they do not exist\n * in the hardware or because they cannot be reset independently.  The\n * driver must never reset any components that were not requested.\n */\nenum ethtool_reset_flags {\n\t/* These flags represent components dedicated to the interface\n\t * the command is addressed to.  Shift any flag left by\n\t * ETH_RESET_SHARED_SHIFT to reset a shared component of the\n\t * same type.\n\t */\n\tETH_RESET_MGMT\t\t= 1 << 0,\t/* Management processor */\n\tETH_RESET_IRQ\t\t= 1 << 1,\t/* Interrupt requester */\n\tETH_RESET_DMA\t\t= 1 << 2,\t/* DMA engine */\n\tETH_RESET_FILTER\t= 1 << 3,\t/* Filtering/flow direction */\n\tETH_RESET_OFFLOAD\t= 1 << 4,\t/* Protocol offload */\n\tETH_RESET_MAC\t\t= 1 << 5,\t/* Media access controller */\n\tETH_RESET_PHY\t\t= 1 << 6,\t/* Transceiver/PHY */\n\tETH_RESET_RAM\t\t= 1 << 7,\t/* RAM shared between\n\t\t\t\t\t\t * multiple components */\n\n\tETH_RESET_DEDICATED\t= 0x0000ffff,\t/* All components dedicated to\n\t\t\t\t\t\t * this interface */\n\tETH_RESET_ALL\t\t= 0xffffffff,\t/* All components used by this\n\t\t\t\t\t\t * interface, even if shared */\n};\n#define ETH_RESET_SHARED_SHIFT\t16\n\n#endif /* _LINUX_ETHTOOL_H */\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/cdc_mbim.txt",
    "content": "root@ZhuoTK:/# dmesg\n[  788.920000] usb 1-1.3: new high-speed USB device number 4 using ehci-platform\n[  789.160000] cdc_mbim 1-1.3:1.4: cdc-wdm0: USB WDM device\n[  789.170000] cdc_mbim 1-1.3:1.4 wwan0: register 'cdc_mbim' at usb-101c0000.ehci-1.3, CDC MBIM, a2:58:dc:4d:dd:ca\n\nroot@ZhuoTK:/# quectel-CM -s cmnet &\n[04-13_05:24:38:767] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_05:24:38:769] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x004\n[04-13_05:24:38:771] Auto find qmichannel = /dev/cdc-wdm0\n[04-13_05:24:38:771] Auto find usbnet_adapter = wwan0\n[04-13_05:24:38:771] netcard driver = cdc_mbim, driver version = 22-Aug-2005\n[04-13_05:24:38:771] Modem works in MBIM mode\n[04-13_05:24:38:779] cdc_wdm_fd = 7\n[04-13_05:24:38:779] mbim_open_device()\n[04-13_05:24:39:624] mbim_device_caps_query()\n[04-13_05:24:39:656] DeviceId:     866758045439136\n[04-13_05:24:39:656] FirmwareInfo: EC25EFAR06A11M4G\n[04-13_05:24:39:656] HardwareInfo: QUECTEL Mobile Broadband Modul\n[04-13_05:24:39:657] mbim_device_services_query()\n[04-13_05:24:39:688] mbim_set_radio_state( 1 )\n[04-13_05:24:39:721] HwRadioState: 1, SwRadioState: 1\n[04-13_05:24:39:721] mbim_subscriber_status_query()\n[04-13_05:24:39:784] SubscriberId: 460028563800461\n[04-13_05:24:39:784] SimIccId:     89860015120716380461\n[04-13_05:24:39:785] SubscriberReadyState NotInitialized -> Initialized \n[04-13_05:24:39:785] mbim_register_state_query()\n[04-13_05:24:39:816] RegisterState Unknown -> Home \n[04-13_05:24:39:816] mbim_packet_service_query()\n[04-13_05:24:39:848] PacketServiceState Unknown -> Attached \n[04-13_05:24:39:848] mbim_query_connect(sessionID=0)\n[04-13_05:24:39:880] ActivationState Unknown -> Deactivated \n[04-13_05:24:39:881] ifconfig wwan0 0.0.0.0\n[04-13_05:24:39:899] ifconfig wwan0 down\n[04-13_05:24:39:913] mbim_set_connect(onoff=1, sessionID=0)\n[04-13_05:24:39:976] ActivationState Deactivated -> Activated \n[04-13_05:24:39:977] mbim_ip_config(sessionID=0)\n[04-13_05:24:40:008] < SessionId = 0\n[04-13_05:24:40:008] < IPv4ConfigurationAvailable = 0xf\n[04-13_05:24:40:008] < IPv6ConfigurationAvailable = 0x0\n[04-13_05:24:40:008] < IPv4AddressCount = 0x1\n[04-13_05:24:40:008] < IPv4AddressOffset = 0x3c\n[04-13_05:24:40:009] < IPv6AddressCount = 0x0\n[04-13_05:24:40:009] < IPv6AddressOffset = 0x0\n[04-13_05:24:40:009] < IPv4 = 10.129.90.29/30\n[04-13_05:24:40:009] < gw = 10.129.90.30\n[04-13_05:24:40:009] < dns1 = 211.138.180.2\n[04-13_05:24:40:009  < dns2 = 211.138.180.3\n[04-13_05:24:40:009] < ipv4 mtu = 1500\n[04-13_05:24:40:041] ifconfig wwan0 up\n[04-13_05:24:40:063] ip -4 address flush dev wwan0\n[04-13_05:24:40:073] ip -4 address add 10.129.90.29/30 dev wwan0\n[04-13_05:24:40:084] ip -4 route add default via 10.129.90.30 dev wwan0\n\nroot@ZhuoTK:/# ifconfig wwan0\nwwan0     Link encap:Ethernet  HWaddr A2:58:DC:4D:DD:CA  \n          inet addr:10.129.90.29  Bcast:0.0.0.0  Mask:255.255.255.252\n          inet6 addr: fe80::a058:dcff:fe4d:ddca/64 Scope:Link\n          UP BROADCAST RUNNING NOARP MULTICAST  MTU:1500  Metric:1\n          RX packets:0 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:0 (0.0 B)  TX bytes:380 (380.0 B)\n\nroot@ZhuoTK:/# ip ro show\ndefault via 10.129.90.30 dev wwan0 \n10.129.90.28/30 dev wwan0  proto kernel  scope link  src 10.129.90.29 \n192.168.1.0/24 dev br-lan  proto kernel  scope link  src 192.168.1.251 \n\nroot@ZhuoTK:/# ping www.qq.com\nPING www.qq.com (183.194.238.117): 56 data bytes\n64 bytes from 183.194.238.117: seq=0 ttl=53 time=58.674 ms"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/cdc_mbim_vlan.txt",
    "content": "root@ZhuoTK:/# dmesg\n[  788.920000] usb 1-1.3: new high-speed USB device number 4 using ehci-platform\n[  789.160000] cdc_mbim 1-1.3:1.4: cdc-wdm0: USB WDM device\n[  789.170000] cdc_mbim 1-1.3:1.4 wwan0: register 'cdc_mbim' at usb-101c0000.ehci-1.3, CDC MBIM, a2:58:dc:4d:dd:ca\n\nroot@ZhuoTK:/#  ip link add link wwan0 name wwan0.1 type vlan id 1\nroot@ZhuoTK:/#  ip link add link wwan0 name wwan0.2 type vlan id 2\nroot@ZhuoTK:/# ifconfig wwan0.1\nwwan0.1   Link encap:Ethernet  HWaddr A2:58:DC:4D:DD:CA  \n          BROADCAST NOARP MULTICAST  MTU:1500  Metric:1\n          RX packets:0 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:0 \n          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)\n\nroot@ZhuoTK:/# ifconfig wwan0.2\nwwan0.2   Link encap:Ethernet  HWaddr A2:58:DC:4D:DD:CA  \n          BROADCAST NOARP MULTICAST  MTU:1500  Metric:1\n          RX packets:0 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:0 \n          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)\n\nroot@ZhuoTK:/# quectel-mbim-proxy &\nroot@ZhuoTK:/# [04-13_07:04:27:543] mbim_dev_fd=3\n[04-13_07:04:27:543] mbim_send_open_msg()\n[04-13_07:04:28:321] receive MBIM_OPEN_DONE, status=0\n[04-13_07:04:28:321] mbim_server_fd=4\n\nroot@ZhuoTK:/# quectel-CM -n 1 -s cmnet &\n[04-13_07:04:34:256] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_07:04:34:259] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x004\n[04-13_07:04:34:260] Auto find qmichannel = /dev/cdc-wdm0\n[04-13_07:04:34:260] Auto find usbnet_adapter = wwan0\n[04-13_07:04:34:260] netcard driver = cdc_mbim, driver version = 22-Aug-2005\n[04-13_07:04:34:261] mbim_qmap_mode = 4, vlan_id = 0x01, qmap_netcard = wwan0.1\n[04-13_07:04:34:261] Modem works in MBIM mode\n[04-13_07:04:34:261] handle_client_connect client_fd=5, client_idx=1\n[04-13_07:04:34:262] connect to quectel-mbim-proxy sockfd = 7\n[04-13_07:04:34:262] cdc_wdm_fd = 7\n[04-13_07:04:34:262] mbim_open_device()\n[04-13_07:04:35:106] mbim_device_caps_query()\n[04-13_07:04:35:139] DeviceId:     866758045439136\n[04-13_07:04:35:139] FirmwareInfo: EC25EFAR06A11M4G\n[04-13_07:04:35:139] HardwareInfo: QUECTEL Mobile Broadband Modul\n[04-13_07:04:35:139] mbim_device_services_query()\n[04-13_07:04:35:170] mbim_set_radio_state( 1 )\n[04-13_07:04:35:202] HwRadioState: 1, SwRadioState: 1\n[04-13_07:04:35:202] mbim_subscriber_status_query()\n[04-13_07:04:35:267] SubscriberId: 460028563800461\n[04-13_07:04:35:267] SimIccId:     89860015120716380461\n[04-13_07:04:35:267] SubscriberReadyState NotInitialized -> Initialized \n[04-13_07:04:35:267] mbim_register_state_query()\n[04-13_07:04:35:297] RegisterState Unknown -> Home \n[04-13_07:04:35:298] mbim_packet_service_query()\n[04-13_07:04:35:329] PacketServiceState Unknown -> Attached \n[04-13_07:04:35:330] mbim_query_connect(sessionID=1)\n[04-13_07:04:35:361] ActivationState Unknown -> Deactivated \n[04-13_07:04:35:362] ifconfig wwan0.1 0.0.0.0\n[04-13_07:04:35:373] ifconfig wwan0.1 down\n[04-13_07:04:35:383] mbim_set_connect(onoff=1, sessionID=1)\n[04-13_07:04:35:426] ActivationState Deactivated -> Activated \n[04-13_07:04:35:426] mbim_ip_config(sessionID=1)\n[04-13_07:04:35:457] < SessionId = 1\n[04-13_07:04:35:457] < IPv4ConfigurationAvailable = 0xf\n[04-13_07:04:35:457] < IPv6ConfigurationAvailable = 0x0\n[04-13_07:04:35:457] < IPv4AddressCount = 0x1\n[04-13_07:04:35:458] < IPv4AddressOffset = 0x3c\n[04-13_07:04:35:458] < IPv6AddressCount = 0x0\n[04-13_07:04:35:458] < IPv6AddressOffset = 0x0\n[04-13_07:04:35:458] < IPv4 = 10.129.90.29/30\n[04-13_07:04:35:458] < gw = 10.129.90.30\n[04-13_07:04:35:458] < dns1 = 211.138.180.2\n[04-13_07:04:35:458] < dns2 = 211.138.180.3\n[04-13_07:04:35:458] < ipv4 mtu = 1500\n[04-13_07:04:35:489] ifconfig wwan0 up\n[04-13_07:04:35:509] ifconfig wwan0.1 down\n[04-13_07:04:35:522] ifconfig wwan0.1 up\n[04-13_07:04:35:535] ip -4 address flush dev wwan0.1\n[04-13_07:04:35:545] ip -4 address add 10.129.90.29/30 dev wwan0.1\n[04-13_07:04:35:556] ip -4 route add default via 10.129.90.30 dev wwan0.1\n\nroot@ZhuoTK:/# quectel-CM -n 2 -s 4gnet &\n[04-13_07:04:45:150] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_07:04:45:152] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x004\n[04-13_07:04:45:154] Auto find qmichannel = /dev/cdc-wdm0\n[04-13_07:04:45:154] Auto find usbnet_adapter = wwan0\n[04-13_07:04:45:154] netcard driver = cdc_mbim, driver version = 22-Aug-2005\n[04-13_07:04:45:155] mbim_qmap_mode = 4, vlan_id = 0x02, qmap_netcard = wwan0.2\n[04-13_07:04:45:155] Modem works in MBIM mode\n[04-13_07:04:45:155] handle_client_connect client_fd=6, client_idx=2\n[04-13_07:04:45:156] connect to quectel-mbim-proxy sockfd = 7\n[04-13_07:04:45:156] cdc_wdm_fd = 7\n[04-13_07:04:45:156] mbim_open_device()\n[04-13_07:04:46:025] mbim_device_caps_query()\n[04-13_07:04:46:056] DeviceId:     866758045439136\n[04-13_07:04:46:056] FirmwareInfo: EC25EFAR06A11M4G\n[04-13_07:04:46:056] HardwareInfo: QUECTEL Mobile Broadband Modul\n[04-13_07:04:46:056] mbim_device_services_query()\n[04-13_07:04:46:088] mbim_set_radio_state( 1 )\n[04-13_07:04:46:119] HwRadioState: 1, SwRadioState: 1\n[04-13_07:04:46:119] mbim_subscriber_status_query()\n[04-13_07:04:46:183] SubscriberId: 460028563800461\n[04-13_07:04:46:184] SimIccId:     89860015120716380461\n[04-13_07:04:46:184] SubscriberReadyState NotInitialized -> Initialized \n[04-13_07:04:46:184] mbim_register_state_query()\n[04-13_07:04:46:216] RegisterState Unknown -> Home \n[04-13_07:04:46:216] mbim_packet_service_query()\n[04-13_07:04:46:248] PacketServiceState Unknown -> Attached \n[04-13_07:04:46:248] mbim_query_connect(sessionID=2)\n[04-13_07:04:46:280] ActivationState Unknown -> Deactivated \n[04-13_07:04:46:280] ifconfig wwan0.2 0.0.0.0\n[04-13_07:04:46:291] ifconfig wwan0.2 down\n[04-13_07:04:46:304] mbim_set_connect(onoff=1, sessionID=2)\n[04-13_07:04:46:504] ActivationState Deactivated -> Activated \n[04-13_07:04:46:505] mbim_ip_config(sessionID=2)\n[04-13_07:04:46:537] < SessionId = 2\n[04-13_07:04:46:537] < IPv4ConfigurationAvailable = 0xf\n[04-13_07:04:46:537] < IPv6ConfigurationAvailable = 0x0\n[04-13_07:04:46:538] < IPv4AddressCount = 0x1\n[04-13_07:04:46:538] < IPv4AddressOffset = 0x3c\n[04-13_07:04:46:538] < IPv6AddressCount = 0x0\n[04-13_07:04:46:538] < IPv6AddressOffset = 0x0\n[04-13_07:04:46:538] < IPv4 = 10.129.37.205/30\n[04-13_07:04:46:538] < gw = 10.129.37.206\n[04-13_07:04:46:538] < dns1 = 211.138.180.2\n[04-13_07:04:46:538] < dns2 = 211.138.180.3\n[04-13_07:04:46:538] < ipv4 mtu = 1500\n[04-13_07:04:46:569] ifconfig wwan0 up\n[04-13_07:04:46:579] ifconfig wwan0.2 up\n[04-13_07:04:46:592] ip -4 address flush dev wwan0.2\n[04-13_07:04:46:602] ip -4 address add 10.129.37.205/30 dev wwan0.2\n[04-13_07:04:46:613] ip -4 route add default via 10.129.37.206 dev wwan0.2\n\nroot@ZhuoTK:/# ifconfig wwan0.1\nwwan0.1   Link encap:Ethernet  HWaddr A2:58:DC:4D:DD:CA  \n          inet addr:10.129.90.29  Bcast:0.0.0.0  Mask:255.255.255.252\n          inet6 addr: fe80::a058:dcff:fe4d:ddca/64 Scope:Link\n          UP BROADCAST RUNNING NOARP MULTICAST  MTU:1500  Metric:1\n          RX packets:4 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:13 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:0 \n          RX bytes:304 (304.0 B)  TX bytes:1170 (1.1 KiB)\n\nroot@ZhuoTK:/# ifconfig wwan0.2\nwwan0.2   Link encap:Ethernet  HWaddr A2:58:DC:4D:DD:CA  \n          inet addr:10.129.37.205  Bcast:0.0.0.0  Mask:255.255.255.252\n          inet6 addr: fe80::a058:dcff:fe4d:ddca/64 Scope:Link\n          UP BROADCAST RUNNING NOARP MULTICAST  MTU:1500  Metric:1\n          RX packets:0 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:0 \n          RX bytes:0 (0.0 B)  TX bytes:720 (720.0 B)\n\nroot@ZhuoTK:/# ip ro del 8.8.8.8/32 \nRTNETLINK answers: No such process\nroot@ZhuoTK:/# ip ro add 8.8.8.8/32 dev wwan0.1\nroot@ZhuoTK:/# ping 8.8.8.8\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=98.584 ms\n\nroot@ZhuoTK:/# ip ro del 8.8.8.8/32 \nroot@ZhuoTK:/# ip ro del 8.8.8.8/32 \nRTNETLINK answers: No such process\nroot@ZhuoTK:/# ip ro add 8.8.8.8/32 dev wwan0.2\nroot@ZhuoTK:/# ping 8.8.8.8\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\n64 bytes from 8.8.8.8: seq=0 ttl=111 time=101.770 ms"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/ecm_ncm_rndis.txt",
    "content": "# ./quectel-CM -s cmnet &\n[04-21_17:35:14:362] Quectel_QConnectManager_Linux_V1.6.0.26\n[04-21_17:35:14:363] Find /sys/bus/usb/devices/2-4 idVendor=0x2c7c idProduct=0x8101, bus=0x002, dev=0x016\n[04-21_17:35:14:363] Auto find qmichannel = /dev/ttyUSB0\n[04-21_17:35:14:363] Auto find usbnet_adapter = usb0\n[04-21_17:35:14:363] netcard driver = cdc_ncm, driver version = 22-Aug-2005\n[04-21_17:35:14:363] Modem works in ECM_RNDIS_NCM mode\n[04-21_17:35:14:371] atc_fd = 7\n[04-21_17:35:14:371] AT> ATE0Q0V1\n[04-21_17:35:14:372] AT< RDATE0Q0V1\n[04-21_17:35:14:372] AT< COMMAND NOT SUPPORT\n[04-21_17:35:15:373] AT> AT+QCFG=\"usbnet\"\n[04-21_17:35:15:373] AT< +QCFG: \"usbnet\",5\n[04-21_17:35:15:373] AT< OK\n[04-21_17:35:15:373] AT> AT+QNETDEVCTL=?\n[04-21_17:35:15:374] AT< +QNETDEVCTL: (1-11),(0,1),(0,1)\n[04-21_17:35:15:374] AT< OK\n[04-21_17:35:15:374] AT> AT+CGREG=2\n[04-21_17:35:15:376] AT< OK\n[04-21_17:35:15:376] AT> AT+CEREG=2\n[04-21_17:35:15:381] AT< OK\n[04-21_17:35:15:381] AT> AT+C5GREG=2\n[04-21_17:35:15:384] AT< OK\n[04-21_17:35:15:384] AT> AT+QNETDEVSTATUS=?\n[04-21_17:35:15:385] AT< +QNETDEVSTATUS: (1-11)\n[04-21_17:35:15:385] AT< OK\n[04-21_17:35:15:385] AT> AT+QCFG=\"NAT\"\n[04-21_17:35:15:385] AT< +QCFG: \"nat\",0\n[04-21_17:35:15:385] AT< OK\n[04-21_17:35:15:385] AT> AT+CGMR\n[04-21_17:35:15:386] AT< RG801HEAAAR03A01M8G\n[04-21_17:35:15:386] AT< OK\n[04-21_17:35:15:386] AT> AT+CPIN?\n[04-21_17:35:15:388] AT< +CPIN: READY\n[04-21_17:35:15:388] AT< OK\n[04-21_17:35:15:389] AT> AT+QCCID\n[04-21_17:35:15:393] AT< +QCCID: 89860015120716380461\n[04-21_17:35:15:393] AT< OK\n[04-21_17:35:15:393] requestGetICCID 89860015120716380461\n[04-21_17:35:15:393] AT> AT+CIMI\n[04-21_17:35:15:409] AT< 460028563800461\n[04-21_17:35:15:409] AT< OK\n[04-21_17:35:15:409] requestGetIMSI 460028563800461\n[04-21_17:35:15:409] AT> AT+QICSGP=1\n[04-21_17:35:15:411] AT< +QICSGP: 1,1,\"cment\",\"\",\"\",0,,0,\n[04-21_17:35:15:411] AT< OK\n[04-21_17:35:15:411] AT> AT+QICSGP=1\n[04-21_17:35:15:415] AT< +QICSGP: 1,1,\"cment\",\"\",\"\",0,,0,\n[04-21_17:35:15:415] AT< OK\n[04-21_17:35:15:415] AT> AT+COPS=3,0;+COPS?;+COPS=3,1;+COPS?;+COPS=3,2;+COPS?\n[04-21_17:35:15:421] AT< +COPS: 0,0,\"CHINA  MOBILE\",12\n[04-21_17:35:15:421] AT< +COPS: 0,1,\"CMCC\",12\n[04-21_17:35:15:421] AT< +COPS: 0,2,\"46000\",12\n[04-21_17:35:15:421] AT< OK\n[04-21_17:35:15:421] AT> AT+C5GREG?\n[04-21_17:35:15:424] AT< +C5GREG: 2,1,\"46550B\",\"0000000170C23000\",11,1,\"01\"\n[04-21_17:35:15:424] AT< OK\n[04-21_17:35:15:424] AT> at+cops?\n[04-21_17:35:15:427] AT< +COPS: 0,2,\"46000\",12\n[04-21_17:35:15:427] AT< OK\n[04-21_17:35:15:427] AT> at+qeng=\"servingcell\"\n[04-21_17:35:15:441] AT< +QENG: \"servingcell\",\"NOCONN\",\"NR5G-SA\",\"TDD\",460,00,170C23000,901,46550B,504990,41,-,-54,-10,16,-,-\n[04-21_17:35:15:441] AT< OK\n[04-21_17:35:15:441] AT> AT+QNETDEVSTATUS=1\n[04-21_17:35:15:445] AT< ERROR\n[04-21_17:35:15:445] ifconfig usb0 0.0.0.0\n[04-21_17:35:15:446] ifconfig usb0 down\n[04-21_17:35:15:448] AT> AT+QNETDEVCTL=1,1,0\n[04-21_17:35:15:454] AT< OK\n[04-21_17:35:15:456] AT> AT+QNETDEVSTATUS=1\n[04-21_17:35:15:458] AT< ERROR\n[04-21_17:35:15:989] AT< +QNETDEVSTATUS:1,1,\"IPV4\"\n[04-21_17:35:16:459] AT> AT+QNETDEVSTATUS=1\n[04-21_17:35:16:461] AT< +QNETDEVSTATUS: 4F10190A,E0FFFFFF,4110190A,4110190A,02B48AD3,03B48AD3, 85600, 85600\n[04-21_17:35:16:461] AT< OK\n[04-21_17:35:16:461] AT> AT+QNETDEVSTATUS=1\n[04-21_17:35:16:462] AT< +QNETDEVSTATUS: 4F10190A,E0FFFFFF,4110190A,4110190A,02B48AD3,03B48AD3, 85600, 85600\n[04-21_17:35:16:462] AT< OK\n[04-21_17:35:16:462] requestGetIPAddress 10.25.16.79\n[04-21_17:35:16:462] AT> at+cops?\n[04-21_17:35:16:463] AT< +COPS: 0,2,\"46000\",12\n[04-21_17:35:16:463] AT< OK\n[04-21_17:35:16:463] AT> at+qeng=\"servingcell\"\n[04-21_17:35:16:465] AT< +QENG: \"servingcell\",\"CONNECT\",\"NR5G-SA\",\"TDD\",460,00,170C23000,901,46550B,504990,41,-,-52,-11,15,-,-\n[04-21_17:35:16:465] AT< OK\n[04-21_17:35:16:465] AT> AT+QNETDEVSTATUS=1\n[04-21_17:35:16:466] AT< +QNETDEVSTATUS: 4F10190A,E0FFFFFF,4110190A,4110190A,02B48AD3,03B48AD3, 85600, 85600\n[04-21_17:35:16:466] AT< OK\n[04-21_17:35:16:466] ifconfig usb0 up\n[04-21_17:35:16:470] busybox udhcpc -f -n -q -t 5 -i usb0\nudhcpc: started, v1.30.1\nudhcpc: sending discover\nudhcpc: sending select for 10.25.16.79\nudhcpc: lease of 10.25.16.79 obtained, lease time 518400\n[04-21_17:35:16:602] /etc/udhcpc/default.script: Resetting default routes\nSIOCDELRT: No such process\nSIOCADDRT: Network is unreachable\n[04-21_17:35:16:606] /etc/udhcpc/default.script: Adding DNS 211.138.180.2\n[04-21_17:35:16:606] /etc/udhcpc/default.script: Adding DNS 211.138.180.3\n[04-21_17:35:16:655] AT> at+cops?\n[04-21_17:35:16:656] AT< +COPS: 0,2,\"46000\",12\n[04-21_17:35:16:656] AT< OK\n[04-21_17:35:16:656] AT> at+qeng=\"servingcell\"\n[04-21_17:35:16:657] AT< +QENG: \"servingcell\",\"CONNECT\",\"NR5G-SA\",\"TDD\",460,00,170C23000,901,46550B,504990,41,-,-50,-11,17,-,-\n[04-21_17:35:16:658] AT< OK\nerr = 16\n[04-21_17:35:16:658] AT> AT+QNETDEVSTATUS=1\n[04-21_17:35:16:659] AT< +QNETDEVSTATUS: 4F10190A,E0FFFFFF,4110190A,4110190A,02B48AD3,03B48AD3, 85600, 85600\n[04-21_17:35:16:659] AT< OK\n\nroot@carl-ThinkPad-X1-Carbon-7th:/home/carl/q/quectel-CM# ifconfig usb0\nusb0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500\n        inet 10.25.16.79  netmask 255.255.255.224  broadcast 10.25.16.95\n        inet6 fe80::5c98:e9d4:c82d:5f  prefixlen 64  scopeid 0x20<link>\n        ether 0c:5b:8f:27:9a:64  txqueuelen 1000  (Ethernet)\n        RX packets 7  bytes 1656 (1.6 KB)\n        RX errors 0  dropped 0  overruns 0  frame 0\n        TX packets 32  bytes 5112 (5.1 KB)\n        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n\nroot@carl-ThinkPad-X1-Carbon-7th:/home/carl/q/quectel-CM# [04-21_17:35:31:670] AT> at+cops?\n[04-21_17:35:31:671] AT< +COPS: 0,2,\"46000\",12\n[04-21_17:35:31:671] AT< OK\n[04-21_17:35:31:671] AT> at+qeng=\"servingcell\"\n[04-21_17:35:31:673] AT< +QENG: \"servingcell\",\"CONNECT\",\"NR5G-SA\",\"TDD\",460,00,170C23000,901,46550B,504990,41,-,-48,-10,17,-,-\n[04-21_17:35:31:673] AT< OK\n[04-21_17:35:31:673] AT> AT+QNETDEVSTATUS=1\n[04-21_17:35:31:674] AT< +QNETDEVSTATUS: 4F10190A,E0FFFFFF,4110190A,4110190A,02B48AD3,03B48AD3, 85600, 85600\n[04-21_17:35:31:674] AT< OK\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/gobinet.txt",
    "content": "root@ZhuoTK:/# dmesg\n[  230.590000] GobiNet 1-1.3:1.4 usb0: register 'GobiNet' at usb-101c0000.ehci-1.3, GobiNet Ethernet Device, 02:50:f4:00:00:00\n[  230.600000] creating qcqmi0\n\nroot@ZhuoTK:/# quectel-CM -s cmnet &\n[04-13_03:24:58:213] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_03:24:58:216] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x004\n[04-13_03:24:58:218] Auto find qmichannel = /dev/qcqmi0\n[04-13_03:24:58:218] Auto find usbnet_adapter = usb0\n[04-13_03:24:58:218] netcard driver = GobiNet, driver version = V1.6.2.13\n[04-13_03:24:58:219] Modem works in QMI mode\n[04-13_03:24:58:260] Get clientWDS = 7\n[04-13_03:24:58:292] Get clientDMS = 8\n[04-13_03:24:58:324] Get clientNAS = 9\n[04-13_03:24:58:355] Get clientUIM = 10\n[04-13_03:24:58:388] Get clientWDA = 11\n[04-13_03:24:58:420] requestBaseBandVersion EC25EFAR06A11M4G\n[04-13_03:24:58:548] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_03:24:58:549] requestSetProfile[1] cmnet///0\n[04-13_03:24:58:613] requestGetProfile[1] cmnet///0\n[04-13_03:24:58:645] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\n[04-13_03:24:58:677] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-13_03:24:58:677] ifconfig usb0 0.0.0.0\n[04-13_03:24:58:696] ifconfig usb0 down\n[04-13_03:24:59:028] requestSetupDataCall WdsConnectionIPv4Handle: 0x87245bd0\n[04-13_03:24:59:189] ifconfig usb0 up\n[04-13_03:24:59:214] you are use OpenWrt?\n[04-13_03:24:59:215] should not calling udhcpc manually?\n[04-13_03:24:59:215] should modify /etc/config/network as below?\n[04-13_03:24:59:215] config interface wan\n[04-13_03:24:59:215] \toption ifname\tusb0\n[04-13_03:24:59:215] \toption proto\tdhcp\n[04-13_03:24:59:215] should use \"/sbin/ifstaus wan\" to check usb0 's status?\n[04-13_03:24:59:216] busybox udhcpc -f -n -q -t 5 -i usb0\n[04-13_03:24:59:226] udhcpc (v1.23.2) started\n[04-13_03:24:59:238] Sending discover...\n[04-13_03:24:59:248] Sending select for 10.198.78.154...\n[04-13_03:24:59:251] Lease of 10.198.78.154 obtained, lease time 7200\n[04-13_03:24:59:257] udhcpc: ifconfig usb0 10.198.78.154 netmask 255.255.255.252 broadcast +\n[04-13_03:24:59:266] udhcpc: setting default routers: 10.198.78.153\n\nroot@ZhuoTK:/# ifconfig usb0\nusb0      Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \n          inet addr:10.198.78.154  Mask:255.255.255.252\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\n          UP RUNNING NOARP  MTU:1500  Metric:1\n          RX packets:6 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:916 (916.0 B)  TX bytes:960 (960.0 B)\n\nroot@ZhuoTK:/# ip ro show\ndefault via 10.198.78.153 dev usb0 \n10.198.78.152/30 dev usb0  proto kernel  scope link  src 10.198.78.154 \n192.168.1.0/24 dev br-lan  proto kernel  scope link  src 192.168.1.251 \n\nroot@ZhuoTK:/# killall quectel-CM\n[04-13_03:25:38:779] requestDeactivateDefaultPDP WdsConnectionIPv4Handle\n[04-13_03:25:39:061] ifconfig usb0 0.0.0.0\n[04-13_03:25:39:072] ifconfig usb0 down\n[04-13_03:25:39:284] GobiNetThread exit\n[04-13_03:25:39:285] qmi_main exit\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/gobinet_bridge.txt",
    "content": "root@ZhuoTK:/# insmod GobiNet.ko \n[   80.460000] GobiNet: Quectel_Linux&Android_GobiNet_Driver_V1.6.2.13\n[   80.460000] usbcore: registered new interface driver GobiNet\n[   97.710000] usb 1-1.3: new high-speed USB device number 3 using ehci-platform\n[   97.930000] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB103\n[   97.950000] GobiNet 1-1.3:1.4 usb0: register 'GobiNet' at usb-101c0000.ehci-1.3, GobiNet Ethernet Device, 02:50:f4:00:00:00\n[   97.960000] creating qcqmi0\n\nroot@ZhuoTK:/# brctl addbr br0\nroot@ZhuoTK:/# brctl addif br0 eth0.1\nroot@ZhuoTK:/# brctl addif br0 usb0\nroot@ZhuoTK:/# brctl show\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\nbr0\t\t8000.00ca019197b9\tno\t\teth0.1\n\t\t\t\t\t\t\t                usb0\n\t\t\t\t\t\t\t                \nroot@ZhuoTK:/# quectel-CM -s cment -b &\n[04-13_05:13:18:213] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_05:13:18:216] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x003\n[  122.270000] net usb0: bridge_mode change to 0x1\n[04-13_05:13:18:218] Auto find qmichannel = /dev/qcqmi0\n[04-13_05:13:18:218] Auto find usbnet_adapter = usb0\n[04-13_05:13:18:218] netcard driver = GobiNet, driver version = V1.6.2.13\n[04-13_05:13:18:224] Modem works in QMI mode\n[04-13_05:13:18:251] Get clientWDS = 7\n[04-13_05:13:18:282] Get clientDMS = 8\n[04-13_05:13:18:316] Get clientNAS = 9\n[04-13_05:13:18:347] Get clientUIM = 10\n[04-13_05:13:18:379] Get clientWDA = 11\n[04-13_05:13:18:411] requestBaseBandVersion EC25EFAR06A11M4G\n[04-13_05:13:18:539] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_05:13:18:540] requestSetProfile[1] cment///0\n[04-13_05:13:18:603] requestGetProfile[1] cment///0\n[04-13_05:13:18:637] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\n[04-13_05:13:18:666] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-13_05:13:18:667] ifconfig usb0 0.0.0.0\n[04-13_05:13:18:687] ifconfig usb0 down\n[04-13_05:13:19:083] requestSetupDataCall WdsConnectionIPv4Handle: 0x8724d220\n[04-13_05:13:19:243] ifconfig usb0 up\n[04-13_05:13:19:270] echo '0xa218480' > /sys/class/net/usb0/bridge_ipv4\n\nroot@ZhuoTK:/# ifconfig br0 up\n[  135.530000] usb0 PC Mac Address: 00:0e:c6:a6:6c:f1\n[  135.570000] usb0 PC Mac Address: 00:0e:c6:a6:6c:f1\n[  135.580000] usb0 PC Mac Address: 00:0e:c6:a6:6c:f1\n[  135.610000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\n[  135.620000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\n[  135.910000] usb0 sip = 0.0.0.0, tip=10.33.132.128, ipv4=10.33.132.128\n[  136.000000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\n[  136.910000] usb0 sip = 0.0.0.0, tip=10.33.132.128, ipv4=10.33.132.128\n[  137.910000] usb0 sip = 0.0.0.0, tip=10.33.132.128, ipv4=10.33.132.128\n[  138.740000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\n[  138.910000] usb0 sip = 10.33.132.128, tip=10.33.132.128, ipv4=10.33.132.128\n[  139.000000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\n[  140.860000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\n[  143.160000] br0: port 2(usb0) entered forwarding state\n[  143.160000] br0: port 1(eth0.1) entered forwarding state\n[  148.870000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\n[  149.010000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\n[  165.630000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/gobinet_qmap=1.txt",
    "content": "root@ZhuoTK:/# insmod GobiNet.ko qmap_mode=1\n[  798.480000] GobiNet: Quectel_Linux&Android_GobiNet_Driver_V1.6.2.13\n[  798.490000] GobiNet 1-1.3:1.4 usb0: register 'GobiNet' at usb-101c0000.ehci-1.3, GobiNet Ethernet Device, 02:50:f4:00:00:00\n[  798.510000] creating qcqmi0\n[  798.510000] usbcore: registered new interface driver GobiNet\n[  799.620000] GobiNet::QMIWDASetDataFormat qmap settings qmap_version=5, rx_size=4096, tx_size=4096\n[  799.630000] GobiNet::QMIWDASetDataFormat qmap settings ul_data_aggregation_max_size=4096, ul_data_aggregation_max_datagrams=16\n\nroot@ZhuoTK:/# quectel-CM -s cmnet &\n[04-13_03:32:31:248] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_03:32:31:251] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x005\n[04-13_03:32:31:253] Auto find qmichannel = /dev/qcqmi0\n[04-13_03:32:31:253] Auto find usbnet_adapter = usb0\n[04-13_03:32:31:253] netcard driver = GobiNet, driver version = V1.6.2.13\n[04-13_03:32:31:253] qmap_mode = 1, qmap_version = 5, qmap_size = 4096, muxid = 0x81, qmap_netcard = usb0\n[04-13_03:32:31:254] Modem works in QMI mode\n[04-13_03:32:31:289] Get clientWDS = 7\n[04-13_03:32:31:320] Get clientDMS = 8\n[04-13_03:32:31:353] Get clientNAS = 9\n[04-13_03:32:31:385] Get clientUIM = 10\n[04-13_03:32:31:417] requestBaseBandVersion EC25EFAR06A11M4G\n[04-13_03:32:31:545] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_03:32:31:545] requestSetProfile[1] cmnet///0\n[04-13_03:32:31:609] requestGetProfile[1] cmnet///0\n[04-13_03:32:31:641] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\n[04-13_03:32:31:673] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-13_03:32:31:674] ifconfig usb0 0.0.0.0\n[04-13_03:32:31:698] ifconfig usb0 down\n[04-13_03:32:31:770] requestSetupDataCall WdsConnectionIPv4Handle: 0x872481a0\n[  857.000000] net usb0: link_state 0x0 -> 0x1\n[04-13_03:32:31:902] ifconfig usb0 up\n[04-13_03:32:31:928] you are use OpenWrt?\n[04-13_03:32:31:928] should not calling udhcpc manually?\n[04-13_03:32:31:928] should modify /etc/config/network as below?\n[04-13_03:32:31:928] config interface wan\n[04-13_03:32:31:928] \toption ifname\tusb0\n[04-13_03:32:31:929] \toption proto\tdhcp\n[04-13_03:32:31:929] should use \"/sbin/ifstaus wan\" to check usb0 's status?\n[04-13_03:32:31:929] busybox udhcpc -f -n -q -t 5 -i usb0\n[04-13_03:32:31:939] udhcpc (v1.23.2) started\n[04-13_03:32:31:951] Sending discover...\n[04-13_03:32:31:956] Sending select for 10.199.102.71...\n[04-13_03:32:31:959] Lease of 10.199.102.71 obtained, lease time 7200\n[04-13_03:32:31:964] udhcpc: ifconfig usb0 10.199.102.71 netmask 255.255.255.240 broadcast +\n[04-13_03:32:31:974] udhcpc: setting default routers: 10.199.102.72\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/gobinet_qmap=1_bridge.txt",
    "content": "root@ZhuoTK:/# insmod GobiNet.ko qmap_mode=1\n[   41.540000] GobiNet: Quectel_Linux&Android_GobiNet_Driver_V1.6.2.13\n[   41.550000] GobiNet 1-1.3:1.4 usb0: register 'GobiNet' at usb-101c0000.ehci-1.3, GobiNet Ethernet Device, 02:50:f4:00:00:00\n[   41.570000] creating qcqmi0\n[   41.570000] usbcore: registered new interface driver GobiNet\n[   42.700000] GobiNet::QMIWDASetDataFormat qmap settings qmap_version=5, rx_size=4096, tx_size=4096\n[   42.710000] GobiNet::QMIWDASetDataFormat qmap settings ul_data_aggregation_max_size=4096, ul_data_aggregation_max_datagrams=16\n\nroot@ZhuoTK:/# brctl addbr br0\nroot@ZhuoTK:/# brctl addif br0 eth0.1\nroot@ZhuoTK:/# brctl addif br0 usb0\nroot@ZhuoTK:/# brctl show\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\nbr0\t\t8000.00ca019197b9\tno\t\t eth0.1\n\t\t\t\t\t\t\t                 usb0\n\t\t\t\t\t\t\t                 \nroot@ZhuoTK:/# quectel-CM -s cmnet -b &\n# [04-13_05:12:29:338] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_05:12:29:340] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x003\n[   73.380000] net usb0: bridge_mode change to 0x1\n[04-13_05:12:29:342] Auto find qmichannel = /dev/qcqmi0\n[04-13_05:12:29:342] Auto find usbnet_adapter = usb0\n[04-13_05:12:29:342] netcard driver = GobiNet, driver version = V1.6.2.13\n[04-13_05:12:29:343] qmap_mode = 1, qmap_version = 5, qmap_size = 4096, muxid = 0x81, qmap_netcard = usb0\n[04-13_05:12:29:348] Modem works in QMI mode\n[04-13_05:12:29:382] Get clientWDS = 7\n[04-13_05:12:29:414] Get clientDMS = 8\n[04-13_05:12:29:447] Get clientNAS = 9\n[04-13_05:12:29:479] Get clientUIM = 10\n[04-13_05:12:29:512] requestBaseBandVersion EC25EFAR06A11M4G\n[04-13_05:12:29:640] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_05:12:29:640] requestSetProfile[1] cmnet///0\n[04-13_05:12:29:704] requestGetProfile[1] cmnet///0\n[04-13_05:12:29:735] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\n[04-13_05:12:29:767] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-13_05:12:29:768] ifconfig usb0 0.0.0.0\n[04-13_05:12:29:792] ifconfig usb0 down\n[04-13_05:12:29:863] requestSetupDataCall WdsConnectionIPv4Handle: 0x8724d820\n[   74.030000] net usb0: link_state 0x0 -> 0x1\n[04-13_05:12:29:996] ifconfig usb0 up\n[04-13_05:12:30:022] echo '0xa16b769' > /sys/class/net/usb0/bridge_ipv4\n\nroot@ZhuoTK:/# ifconfig br0 up\n[   82.210000] br0: port 2(usb0) entered forwarding state\n[   82.210000] br0: port 2(usb0) entered forwarding state\n[   82.220000] br0: port 1(eth0.1) entered forwarding state\n[   82.220000] br0: port 1(eth0.1) entered forwarding state\n[   88.830000] rt305x-esw 10110000.esw: link changed 0x01\n[   89.010000] usb0 PC Mac Address: 00:0e:c6:a6:6c:f1\n[   89.040000] usb0 PC Mac Address: 00:0e:c6:a6:6c:f1\n[   89.050000] usb0 PC Mac Address: 00:0e:c6:a6:6c:f1\n[   89.120000] usb0 sip = 10.22.183.105, tip=10.22.183.106, ipv4=10.22.183.105\n[   89.350000] usb0 sip = 0.0.0.0, tip=10.22.183.105, ipv4=10.22.183.105\n[   89.400000] usb0 sip = 10.22.183.105, tip=10.22.183.106, ipv4=10.22.183.105\n[   89.520000] usb0 sip = 10.22.183.105, tip=10.22.183.106, ipv4=10.22.183.105\n[   90.350000] usb0 sip = 0.0.0.0, tip=10.22.183.105, ipv4=10.22.183.105\n[   91.350000] usb0 sip = 0.0.0.0, tip=10.22.183.105, ipv4=10.22.183.105\n[   92.350000] usb0 sip = 10.22.183.105, tip=10.22.183.105, ipv4=10.22.183.105\n[   92.430000] usb0 sip = 10.22.183.105, tip=10.22.183.106, ipv4=10.22.183.105\n[   92.660000] usb0 sip = 10.22.183.105, tip=10.22.183.106, ipv4=10.22.183.105\n[   97.240000] br0: port 2(usb0) entered forwarding state\n[   97.240000] br0: port 1(eth0.1) entered forwarding state\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/gobinet_qmap=4.txt",
    "content": "root@ZhuoTK:/# insmod GobiNet.ko qmap_mode=4\n[  970.380000] GobiNet: Quectel_Linux&Android_GobiNet_Driver_V1.6.2.13\n[  970.380000] usbcore: registered new interface driver GobiNet\n[  989.620000] usb 1-1.3: new high-speed USB device number 6 using ehci-platform\n[  989.860000] GobiNet 1-1.3:1.4 usb0: register 'GobiNet' at usb-101c0000.ehci-1.3, GobiNet Ethernet Device, 02:50:f4:00:00:00\n[  989.870000] creating qcqmi0\n[  989.880000] GobiNet::qmap_register_device usb0.1\n[  989.880000] GobiNet::qmap_register_device usb0.2\n[  989.890000] GobiNet::qmap_register_device usb0.3\n[  989.890000] GobiNet::qmap_register_device usb0.4\n[  994.820000] GobiNet::QMIWDASetDataFormat qmap settings qmap_version=5, rx_size=4096, tx_size=4096\n[  994.830000] GobiNet::QMIWDASetDataFormat qmap settings ul_data_aggregation_max_size=4096, ul_data_aggregation_max_datagrams=16\n\nroot@ZhuoTK:/# quectel-CM -n 1 -s cmnet &\n[04-13_03:35:31:878] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_03:35:31:881] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x006\n[04-13_03:35:31:882] Auto find qmichannel = /dev/qcqmi0\n[04-13_03:35:31:882] Auto find usbnet_adapter = usb0\n[04-13_03:35:31:883] netcard driver = GobiNet, driver version = V1.6.2.13\n[04-13_03:35:31:883] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x81, qmap_netcard = usb0.1\n[04-13_03:35:31:883] Modem works in QMI mode\n[04-13_03:35:31:896] Get clientWDS = 7\n[04-13_03:35:31:927] Get clientDMS = 8\n[04-13_03:35:31:959] Get clientNAS = 9\n[04-13_03:35:31:992] Get clientUIM = 10\n[04-13_03:35:32:024] requestBaseBandVersion EC25EFAR06A11M4G\n[04-13_03:35:32:152] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_03:35:32:152] requestSetProfile[1] cmnet///0\n[04-13_03:35:32:216] requestGetProfile[1] cmnet///0\n[04-13_03:35:32:248] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\n[04-13_03:35:32:279] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-13_03:35:32:280] ifconfig usb0 down\n[04-13_03:35:32:290] ifconfig usb0.1 0.0.0.0\n[04-13_03:35:32:301] ifconfig usb0.1 down\n[04-13_03:35:32:344] requestSetupDataCall WdsConnectionIPv4Handle: 0x8723eef0\n[ 1037.570000] net usb0: link_state 0x0 -> 0x1\n[04-13_03:35:32:477] ifconfig usb0 up\n[04-13_03:35:32:496] ifconfig usb0.1 up\n[04-13_03:35:32:508] you are use OpenWrt?\n[04-13_03:35:32:509] should not calling udhcpc manually?\n[04-13_03:35:32:509] should modify /etc/config/network as below?\n[04-13_03:35:32:509] config interface wan\n[04-13_03:35:32:509] \toption ifname\tusb0.1\n[04-13_03:35:32:509] \toption proto\tdhcp\n[04-13_03:35:32:509] should use \"/sbin/ifstaus wan\" to check usb0.1 's status?\n[04-13_03:35:32:510] busybox udhcpc -f -n -q -t 5 -i usb0.1\n[04-13_03:35:32:520] udhcpc (v1.23.2) started\n[04-13_03:35:32:532] Sending discover...\n[04-13_03:35:32:540] Sending select for 10.187.142.20...\n[04-13_03:35:32:545] Lease of 10.187.142.20 obtained, lease time 7200\n[04-13_03:35:32:550] udhcpc: ifconfig usb0.1 10.187.142.20 netmask 255.255.255.248 broadcast +\n[04-13_03:35:32:560] udhcpc: setting default routers: 10.187.142.21\n\nroot@ZhuoTK:/# quectel-CM -n 2 -s 4gnet &\n[04-13_03:35:38:766] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_03:35:38:769] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x006\n[04-13_03:35:38:770] Auto find qmichannel = /dev/qcqmi0\n[04-13_03:35:38:770] Auto find usbnet_adapter = usb0\n[04-13_03:35:38:771] netcard driver = GobiNet, driver version = V1.6.2.13\n[04-13_03:35:38:771] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x82, qmap_netcard = usb0.2\n[04-13_03:35:38:771] Modem works in QMI mode\n[04-13_03:35:38:809] Get clientWDS = 7\n[04-13_03:35:38:841] Get clientDMS = 8\n[04-13_03:35:38:873] Get clientNAS = 9\n[04-13_03:35:38:905] Get clientUIM = 10\n[04-13_03:35:38:937] requestBaseBandVersion EC25EFAR06A11M4G\n[04-13_03:35:39:065] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_03:35:39:065] requestSetProfile[2] 4gnet///0\n[04-13_03:35:39:129] requestGetProfile[2] 4gnet///0\n[04-13_03:35:39:161] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\n[04-13_03:35:39:193] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-13_03:35:39:193] ifconfig usb0.2 0.0.0.0\n[04-13_03:35:39:206] ifconfig usb0.2 down\n[04-13_03:35:39:417] requestSetupDataCall WdsConnectionIPv4Handle: 0x87252eb0\n[ 1044.650000] net usb0: link_state 0x1 -> 0x3\n[04-13_03:35:39:550] ifconfig usb0 up\n[04-13_03:35:39:560] ifconfig usb0.2 up\n[04-13_03:35:39:573] you are use OpenWrt?\n[04-13_03:35:39:573] should not calling udhcpc manually?\n[04-13_03:35:39:573] should modify /etc/config/network as below?\n[04-13_03:35:39:573] config interface wan\n[04-13_03:35:39:573] \toption ifname\tusb0.2\n[04-13_03:35:39:573] \toption proto\tdhcp\n[04-13_03:35:39:573] should use \"/sbin/ifstaus wan\" to check usb0.2 's status?\n[04-13_03:35:39:574] busybox udhcpc -f -n -q -t 5 -i usb0.2\n[04-13_03:35:39:585] udhcpc (v1.23.2) started\n[04-13_03:35:39:597] Sending discover...\n[04-13_03:35:39:601] Sending select for 10.197.125.183...\n[04-13_03:35:39:606] Lease of 10.197.125.183 obtained, lease time 7200\n[04-13_03:35:39:611] udhcpc: ifconfig usb0.2 10.197.125.183 netmask 255.255.255.240 broadcast +\n[04-13_03:35:39:621] udhcpc: setting default routers: 10.197.125.184\n\nroot@ZhuoTK:/# ifconfig usb0.1\nusb0.1    Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \n          inet addr:10.187.142.20  Mask:255.255.255.248\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\n          UP RUNNING NOARP  MTU:1500  Metric:1\n          RX packets:4 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:764 (764.0 B)  TX bytes:1824 (1.7 KiB)\n\nroot@ZhuoTK:/# ifconfig usb0.2\nusb0.2    Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \n          inet addr:10.197.125.183  Mask:255.255.255.240\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\n          UP RUNNING NOARP  MTU:1500  Metric:1\n          RX packets:3 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:688 (688.0 B)  TX bytes:1224 (1.1 KiB)\n\nroot@ZhuoTK:/# ip ro add 8.8.8.8/32 dev usb0.1\nroot@ZhuoTK:/# ping 8.8.8.8\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=74.450 ms\n\nroot@ZhuoTK:/# ip ro del 8.8.8.8/32\nroot@ZhuoTK:/# ip ro del 8.8.8.8/32\nRTNETLINK answers: No such process\n\nroot@ZhuoTK:/# ip ro add 8.8.8.8/32 dev usb0.2\nroot@ZhuoTK:/# ping 8.8.8.8\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=257.851 ms\n\nroot@ZhuoTK:/# quectel-CM -k 2\n[04-13_03:39:16:986] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_03:39:16:988] /proc/2294/cmdline: quectel-CM -n 2 -s 4gnet\n[04-13_03:39:16:988] send SIGINT to process 2294\n[04-13_03:39:16:989] requestDeactivateDefaultPDP WdsConnectionIPv4Handle\n[ 1262.310000] net usb0: link_state 0x3 -> 0x1\n[04-13_03:39:17:216] ifconfig usb0.2 0.0.0.0\n[04-13_03:39:17:228] ifconfig usb0.2 down\n[04-13_03:39:17:370] GobiNetThread exit\n[04-13_03:39:17:371] qmi_main exit\n\n[2]+  Done                       quectel-CM -n 2 -s 4gnet\n\nroot@ZhuoTK:/# ifconfig usb0.2\nusb0.2    Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \n          NOARP  MTU:1500  Metric:1\n          RX packets:30 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:35 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:2816 (2.7 KiB)  TX bytes:3408 (3.3 KiB)\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/gobinet_qmap=4_bridge.txt",
    "content": "root@ZhuoTK:/# insmod GobiNet.ko qmap_mode=4\n[   42.120000] GobiNet: Quectel_Linux&Android_GobiNet_Driver_V1.6.2.13\n[   42.130000] GobiNet 1-1.3:1.4 usb0: register 'GobiNet' at usb-101c0000.ehci-1.3, GobiNet Ethernet Device, 02:50:f4:00:00:00\n[   42.140000] creating qcqmi0\n[   42.150000] GobiNet::qmap_register_device usb0.1\n[   42.150000] GobiNet::qmap_register_device usb0.2\n[   42.160000] GobiNet::qmap_register_device usb0.3\n[   42.160000] GobiNet::qmap_register_device usb0.4\n[   42.170000] usbcore: registered new interface driver GobiNet\n[   43.270000] GobiNet::QMIWDASetDataFormat qmap settings qmap_version=5, rx_size=4096, tx_size=4096\n[   43.280000] GobiNet::QMIWDASetDataFormat qmap settings ul_data_aggregation_max_size=4096, ul_data_aggregation_max_datagrams=16\n\nroot@ZhuoTK:/# brctl addbr br0\nroot@ZhuoTK:/# brctl addif br0 eth0.1\nroot@ZhuoTK:/# brctl addif br0 usb0.1\nroot@ZhuoTK:/# brctl show\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\nbr0\t\t8000.00ca019197b9\tno\t\teth0.1\n\t\t\t\t\t\t\t                usb0.1\n\t\t\t\t\t\t\t                \nroot@ZhuoTK:/# quectel-CM -n 1 -s cmnet -b &\n[04-13_05:12:42:155] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_05:12:42:158] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x003\n[   86.130000] net usb0.1: bridge_mode change to 0x1\n[04-13_05:12:42:159] Auto find qmichannel = /dev/qcqmi0\n[04-13_05:12:42:160] Auto find usbnet_adapter = usb0\n[04-13_05:12:42:160] netcard driver = GobiNet, driver version = V1.6.2.13\n[04-13_05:12:42:160] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x81, qmap_netcard = usb0.1\n[04-13_05:12:42:166] Modem works in QMI mode\n[04-13_05:12:42:181] Get clientWDS = 7\n[04-13_05:12:42:213] Get clientDMS = 8\n[04-13_05:12:42:246] Get clientNAS = 9\n[04-13_05:12:42:278] Get clientUIM = 10\n[04-13_05:12:42:310] requestBaseBandVersion EC25EFAR06A11M4G\n[04-13_05:12:42:438] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_05:12:42:439] requestSetProfile[1] cmnet///0\n[04-13_05:12:42:502] requestGetProfile[1] cmnet///0\n[04-13_05:12:42:534] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\n[04-13_05:12:42:565] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-13_05:12:42:566] ifconfig usb0 down\n[04-13_05:12:42:576] ifconfig usb0.1 0.0.0.0\n[04-13_05:12:42:587] ifconfig usb0.1 down\n[04-13_05:12:42:629] requestSetupDataCall WdsConnectionIPv4Handle: 0x8724d740\n[   86.730000] net usb0: link_state 0x0 -> 0x1\n[04-13_05:12:42:762] ifconfig usb0 up\n[04-13_05:12:42:782] ifconfig usb0.1 up\n[04-13_05:12:42:794] echo '0xa16b769' > /sys/class/net/usb0.1/bridge_ipv4\n\nroot@ZhuoTK:/# ifconfig br0 up\n[   98.270000] usb0.1 PC Mac Address: 00:0e:c6:a6:6c:f1\n[   98.360000] usb0.1 sip = 0.0.0.0, tip=10.22.183.105, ipv4=10.22.183.105\n[   98.370000] usb0.1 sip = 10.22.183.105, tip=10.22.183.106, ipv4=10.22.183.105\n[   99.360000] usb0.1 sip = 0.0.0.0, tip=10.22.183.105, ipv4=10.22.183.105\n[  100.360000] usb0.1 sip = 0.0.0.0, tip=10.22.183.105, ipv4=10.22.183.105\n[  100.500000] usb0.1 sip = 10.22.183.105, tip=10.22.183.106, ipv4=10.22.183.105\n\nroot@ZhuoTK:/# quectel-CM -n 2 -s 4gnet &\n[04-13_05:13:05:715] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_05:13:05:717] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x003\n[04-13_05:13:05:719] Auto find qmichannel = /dev/qcqmi0\n[04-13_05:13:05:719] Auto find usbnet_adapter = usb0\n[04-13_05:13:05:719] netcard driver = GobiNet, driver version = V1.6.2.13\n[04-13_05:13:05:719] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x82, qmap_netcard = usb0.2\n[04-13_05:13:05:720] Modem works in QMI mode\n[04-13_05:13:05:734] Get clientWDS = 7\n[04-13_05:13:05:766] Get clientDMS = 8\n[04-13_05:13:05:798] Get clientNAS = 9\n[04-13_05:13:05:830] Get clientUIM = 10\n[04-13_05:13:05:861] requestBaseBandVersion EC25EFAR06A11M4G\n[04-13_05:13:05:990] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_05:13:05:991] requestSetProfile[2] 4gnet///0\n[04-13_05:13:06:054] requestGetProfile[2] 4gnet///0\n[04-13_05:13:06:086] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\n[04-13_05:13:06:118] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-13_05:13:06:119] ifconfig usb0.2 0.0.0.0\n[04-13_05:13:06:131] ifconfig usb0.2 down\n[04-13_05:13:06:375] requestSetupDataCall WdsConnectionIPv4Handle: 0x872b8c50\n[  110.470000] net usb0: link_state 0x1 -> 0x3\n[04-13_05:13:06:507] ifconfig usb0 up\n[04-13_05:13:06:518] ifconfig usb0.2 up\n[04-13_05:13:06:539] you are use OpenWrt?\n[04-13_05:13:06:540] should not calling udhcpc manually?\n[04-13_05:13:06:540] should modify /etc/config/network as below?\n[04-13_05:13:06:540] config interface wan\n[04-13_05:13:06:540] \toption ifname\tusb0.2\n[04-13_05:13:06:540] \toption proto\tdhcp\n[04-13_05:13:06:540] should use \"/sbin/ifstaus wan\" to check usb0.2 's status?\n[04-13_05:13:06:540] busybox udhcpc -f -n -q -t 5 -i usb0.2\n[04-13_05:13:06:554] udhcpc (v1.23.2) started\n[04-13_05:13:06:614] Sending discover...\n[04-13_05:13:06:619] Sending select for 10.22.58.141...\n[04-13_05:13:06:623] Lease of 10.22.58.141 obtained, lease time 7200\n[04-13_05:13:06:629] udhcpc: ifconfig usb0.2 10.22.58.141 netmask 255.255.255.252 broadcast +\n[04-13_05:13:06:638] udhcpc: setting default routers: 10.22.58.142\n\nroot@ZhuoTK:/# ifconfig usb0.2\nusb0.2    Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \n          inet addr:10.22.58.141  Mask:255.255.255.252\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\n          UP RUNNING NOARP  MTU:1500  Metric:1\n          RX packets:2 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:612 (612.0 B)  TX bytes:1064 (1.0 KiB)\n\nroot@ZhuoTK:/# ip ro show\ndefault via 10.22.58.142 dev usb0.2 \n10.22.58.140/30 dev usb0.2  proto kernel  scope link  src 10.22.58.141 \n192.168.1.0/24 dev br-lan  proto kernel  scope link  src 192.168.1.251 \n\nroot@ZhuoTK:/# ping 8.8.8.8\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=69.822 ms\n\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/pcie_mhi_mbim.txt",
    "content": "root@OpenWrt:/# lspci\n00:00.0 Class 0604: 17cb:1001\n01:00.0 Class ff00: 17cb:0306\n\nroot@OpenWrt:/# insmod pcie_mhi.ko mhi_mbim_enabled=1\n[   63.094154] mhi_init Quectel_Linux_PCIE_MHI_Driver_V1.3.0.17\n[   63.094739] mhi_pci_probe pci_dev->name = 0000:01:00.0, domain=0, bus=1, slot=0, vendor=17CB, device=0306\n[   63.099373] mhi_q 0000:01:00.0: BAR 0: assigned [mem 0x48000000-0x48000fff 64bit]\n[   63.108476] mhi_q 0000:01:00.0: enabling device (0140 -> 0142)\n[   63.293451] [I][mhi_netdev_enable_iface] Prepare the channels for transfer\n[   63.324757] [I][mhi_netdev_enable_iface] Exited.\n[   63.326265] rmnet_vnd_register_device(rmnet_mhi0.1)=0\n\nroot@OpenWrt:/# quectel-CM -s cment &\n[04-13_09:25:23:910] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_09:25:23:912] network interface '' or qmidev '' is not exist\n[04-13_09:25:23:912] netcard driver = pcie_mhi, driver version = V1.3.0.17\n[04-13_09:25:23:913] mbim_qmap_mode = 1, vlan_id = 0x00, qmap_netcard = rmnet_mhi0.1\n[04-13_09:25:23:913] Modem works in MBIM mode\n[04-13_09:25:23:965] cdc_wdm_fd = 7\n[04-13_09:25:23:965] mbim_open_device()\n[04-13_09:25:24:549] mbim_device_caps_query()\n[04-13_09:25:24:575] DeviceId:     869710030002905\n[04-13_09:25:24:575] FirmwareInfo: RM500QGLABR10A03M4G_01.001.03\n[04-13_09:25:24:575] HardwareInfo: RM500QGL_VH\n[04-13_09:25:24:576] mbim_device_services_query()\n[04-13_09:25:24:585] mbim_set_radio_state( 1 )\n[04-13_09:25:24:588] HwRadioState: 1, SwRadioState: 1\n[04-13_09:25:24:588] mbim_subscriber_status_query()\n[04-13_09:25:24:612] SubscriberId: 460028563800461\n[04-13_09:25:24:612] SimIccId:     89860015120716380461\n[04-13_09:25:24:613] SubscriberReadyState NotInitialized -> Initialized \n[04-13_09:25:24:613] mbim_register_state_query()\n[04-13_09:25:24:617] RegisterState Unknown -> Home \n[04-13_09:25:24:617] mbim_packet_service_query()\n[04-13_09:25:24:619] PacketServiceState Unknown -> Attached \n[04-13_09:25:24:619] CurrentDataClass = 5G_NSA\n[04-13_09:25:24:620] mbim_query_connect(sessionID=0)\n[04-13_09:25:24:631] ActivationState Unknown -> Deactivated \n[04-13_09:25:24:631] ifconfig rmnet_mhi0 down\n[04-13_09:25:24:657] ifconfig rmnet_mhi0.1 0.0.0.0\nifconfig: SIOCSIFFLAGS: Network is down\n[04-13_09:25:24:681] ifconfig rmnet_mhi0.1 down\n[04-13_09:25:24:705] mbim_register_state_query()\n[04-13_09:25:24:709] mbim_packet_service_query()\n[04-13_09:25:24:713] CurrentDataClass = 5G_NSA\n[04-13_09:25:24:713] mbim_set_connect(onoff=1, sessionID=0)\n[04-13_09:25:25:096] ActivationState Deactivated -> Activated \n[04-13_09:25:25:097] mbim_ip_config(sessionID=0)\n[04-13_09:25:25:100] < SessionId = 0\n[04-13_09:25:25:100] < IPv4ConfigurationAvailable = 0xf\n[04-13_09:25:25:100] < IPv6ConfigurationAvailable = 0x0\n[04-13_09:25:25:101] < IPv4AddressCount = 0x1\n[04-13_09:25:25:101] < IPv4AddressOffset = 0x3c\n[04-13_09:25:25:101] < IPv6AddressCount = 0x0\n[04-13_09:25:25:102] < IPv6AddressOffset = 0x0\n[04-13_09:25:25:102] < IPv4 = 10.190.166.229/30\n[04-13_09:25:25:103] < gw = 10.190.166.230\n[04-13_09:25:25:103] < dns1 = 211.138.180.2\n[04-13_09:25:25:103] < dns2 = 211.138.180.3\n[04-13_09:25:25:104] < ipv4 mtu = 1500\n[04-13_09:25:25:112] ifconfig rmnet_mhi0 up\n[04-13_09:25:25:141] ifconfig rmnet_mhi0.1 up\n[04-13_09:25:25:170] ip -4 address flush dev rmnet_mhi0.1\n[04-13_09:25:25:190] ip -4 address add 10.190.166.229/30 dev rmnet_mhi0.1\n[04-13_09:25:25:213] ip -4 route add default via 10.190.166.230 dev rmnet_mhi0.1\n\nroot@OpenWrt:/# ifconfig rmnet_mhi0.1\nrmnet_mhi0.1 Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \n          inet addr:10.190.166.229  Mask:255.255.255.252\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\n          UP RUNNING NOARP  MTU:1500  Metric:1\n          RX packets:19 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:29 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:2326 (2.2 KiB)  TX bytes:2991 (2.9 KiB)\n\nroot@OpenWrt:/# ping 8.8.8.8\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=278.561 ms\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/pcie_mhi_mbim_qmap=4.txt",
    "content": "root@OpenWrt:/# lspci\n00:00.0 Class 0604: 17cb:1001\n01:00.0 Class ff00: 17cb:0304\nroot@OpenWrt:/# insmod pcie_mhi.ko mhi_mbim_enabled=1 qmap_mode=4\n[   76.596827] mhi_init Quectel_Linux_PCIE_MHI_Driver_V1.3.0.17\n[   76.598596] mhi_pci_probe pci_dev->name = 0000:01:00.0, domain=0, bus=1, slot=0, vendor=17CB, device=0304\n[   76.602863] mhi_q 0000:01:00.0: BAR 0: assigned [mem 0x48000000-0x48000fff 64bit]\n[   76.611323] mhi_q 0000:01:00.0: enabling device (0140 -> 0142)\n[   76.760239] [I][mhi_netdev_enable_iface] Prepare the channels for transfer\n[   76.828699] [I][mhi_netdev_enable_iface] Exited.\n[   76.832727] rmnet_vnd_register_device(rmnet_mhi0.1)=0\n[   76.836596] rmnet_vnd_register_device(rmnet_mhi0.2)=0\n[   76.841170] rmnet_vnd_register_device(rmnet_mhi0.3)=0\n[   76.846373] rmnet_vnd_register_device(rmnet_mhi0.4)=0\n\nroot@OpenWrt:~# quectel-mbim-proxy -d /dev/mhi_MBIM &\nroot@OpenWrt:~# [04-14_03:05:36:296] mbim_dev_fd=3\n[04-14_03:05:36:297] mbim_send_open_msg()\n[04-14_03:05:36:669] receive MBIM_OPEN_DONE, status=0\n[04-14_03:05:36:670] mbim_server_fd=4\n\nroot@OpenWrt:~# quectel-CM -n 1 -s cmnet &\n[04-14_03:05:45:955] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-14_03:05:45:956] network interface '' or qmidev '' is not exist\n[04-14_03:05:45:957] netcard driver = pcie_mhi, driver version = V1.3.0.17\n[04-14_03:05:45:957] mbim_qmap_mode = 4, vlan_id = 0x01, qmap_netcard = rmnet_mhi0.1\n[04-14_03:05:45:958] Modem works in MBIM mode\n[04-14_03:05:45:959] connect to quectel-mbim-proxy sockfd = 7\n[04-14_03:05:45:959] handle_client_connect client_fd=5, client_idx=1\n[04-14_03:05:45:959] cdc_wdm_fd = 7\n[04-14_03:05:45:960] mbim_open_device()\n[04-14_03:05:45:961] mbim_device_caps_query()\n[04-14_03:05:45:967] DeviceId:     860459050041596\n[04-14_03:05:45:968] FirmwareInfo: EM120RGLAPR02A03M4G_01.001.07\n\n[04-14_03:05:45:968] HardwareInfo: EM120R_GL\n[04-14_03:05:45:968] mbim_device_services_query()\n[04-14_03:05:45:972] mbim_set_radio_state( 1 )\n[04-14_03:05:45:976] HwRadioState: 1, SwRadioState: 1\n[04-14_03:05:45:976] mbim_subscriber_status_query()\n[04-14_03:05:45:985] SubscriberId: 460028563800461\n[04-14_03:05:45:985] SimIccId:     89860015120716380461\n[04-14_03:05:45:986] SubscriberReadyState NotInitialized -> Initialized \n[04-14_03:05:45:986] mbim_register_state_query()\n[04-14_03:05:45:991] RegisterState Unknown -> Home \n[04-14_03:05:45:991] mbim_packet_service_query()\n[04-14_03:05:45:995] PacketServiceState Unknown -> Attached \n[04-14_03:05:45:996] mbim_query_connect(sessionID=1)\n[04-14_03:05:46:000] ActivationState Unknown -> Deactivated \n[04-14_03:05:46:000] ifconfig rmnet_mhi0 down\n[04-14_03:05:46:024] ifconfig rmnet_mhi0.1 0.0.0.0\nifconfig: SIOCSIFFLAGS: Network is down\n[04-14_03:05:46:049] ifconfig rmnet_mhi0.1 down\n[04-14_03:05:46:072] mbim_set_connect(onoff=1, sessionID=1)\n[04-14_03:05:46:099] ActivationState Deactivated -> Activated \n[04-14_03:05:46:099] mbim_ip_config(sessionID=1)\n[  222.484298] net rmnet_mhi0: link_state 0x0 -> 0x1\n[04-14_03:05:46:103] < SessionId = 1\n[04-14_03:05:46:104] < IPv4ConfigurationAvailable = 0xf\n[04-14_03:05:46:104] < IPv6ConfigurationAvailable = 0x0\n[04-14_03:05:46:104] < IPv4AddressCount = 0x1\n[04-14_03:05:46:105] < IPv4AddressOffset = 0x3c\n[  222.507775] [I][mhi_netdev_open] Opened net dev interface\n[04-14_03:05:46:105] < IPv6AddressCount = 0x0\n[04-14_03:05:46:105] < IPv6AddressOffset = 0x0\n[04-14_03:05:46:106] < IPv4 = 10.38.21.158/30\n[04-14_03:05:46:106] < gw = 10.38.21.157\n[04-14_03:05:46:106] < dns1 = 211.138.180.2\n[04-14_03:05:46:107] < dns2 = 211.138.180.3\n[04-14_03:05:46:107] < ipv4 mtu = 1500\n[04-14_03:05:46:112] ifconfig rmnet_mhi0 up\n[04-14_03:05:46:140] ifconfig rmnet_mhi0.1 up\n[04-14_03:05:46:168] ip -4 address flush dev rmnet_mhi0.1\n[04-14_03:05:46:190] ip -4 address add 10.38.21.158/30 dev rmnet_mhi0.1\n[04-14_03:05:46:212] ip -4 route add default via 10.38.21.157 dev rmnet_mhi0.1\n[04-14_03:05:50:730] handle_client_connect client_fd=6, client_idx=2\n[  227.558631] net rmnet_mhi0: link_state 0x1 -> 0x3\n\nroot@OpenWrt:~# quectel-CM -n 2 -s 4gnet \n[04-14_03:05:50:725] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-14_03:05:50:726] network interface '' or qmidev '' is not exist\n[04-14_03:05:50:727] netcard driver = pcie_mhi, driver version = V1.3.0.17\n[04-14_03:05:50:728] mbim_qmap_mode = 4, vlan_id = 0x02, qmap_netcard = rmnet_mhi0.2\n[04-14_03:05:50:729] Modem works in MBIM mode\n[04-14_03:05:50:730] connect to quectel-mbim-proxy sockfd = 8\n[04-14_03:05:50:730] cdc_wdm_fd = 8\n[04-14_03:05:50:731] mbim_open_device()\n[04-14_03:05:50:732] mbim_device_caps_query()\n[04-14_03:05:50:738] DeviceId:     860459050041596\n[04-14_03:05:50:739] FirmwareInfo: EM120RGLAPR02A03M4G_01.001.07\n\n[04-14_03:05:50:739] HardwareInfo: EM120R_GL\n[04-14_03:05:50:740] mbim_device_services_query()\n[04-14_03:05:50:744] mbim_set_radio_state( 1 )\n[04-14_03:05:50:747] HwRadioState: 1, SwRadioState: 1\n[04-14_03:05:50:747] mbim_subscriber_status_query()\n[04-14_03:05:50:757] SubscriberId: 460028563800461\n[04-14_03:05:50:758] SimIccId:     89860015120716380461\n[04-14_03:05:50:758] SubscriberReadyState NotInitialized -> Initialized \n[04-14_03:05:50:759] mbim_register_state_query()\n[04-14_03:05:50:763] RegisterState Unknown -> Home \n[04-14_03:05:50:764] mbim_packet_service_query()\n[04-14_03:05:50:768] PacketServiceState Unknown -> Attached \n[04-14_03:05:50:769] mbim_query_connect(sessionID=2)\n[04-14_03:05:50:772] ActivationState Unknown -> Deactivated \n[04-14_03:05:50:773] ifconfig rmnet_mhi0.2 0.0.0.0\n[04-14_03:05:50:799] ifconfig rmnet_mhi0.2 down\n[04-14_03:05:50:834] mbim_set_connect(onoff=1, sessionID=2)\n[04-14_03:05:51:170] ActivationState Deactivated -> Activated \n[04-14_03:05:51:171] mbim_ip_config(sessionID=2)\n[04-14_03:05:51:174] < SessionId = 2\n[04-14_03:05:51:174] < IPv4ConfigurationAvailable = 0xf\n[04-14_03:05:51:175] < IPv6ConfigurationAvailable = 0x0\n[04-14_03:05:51:175] < IPv4AddressCount = 0x1\n[04-14_03:05:51:175] < IPv4AddressOffset = 0x3c\n[04-14_03:05:51:176] < IPv6AddressCount = 0x0\n[04-14_03:05:51:176] < IPv6AddressOffset = 0x0\n[04-14_03:05:51:176] < IPv4 = 10.36.109.217/30\n[04-14_03:05:51:177] < gw = 10.36.109.218\n[04-14_03:05:51:177] < dns1 = 211.138.180.2\n[04-14_03:05:51:178] < dns2 = 211.138.180.3\n[04-14_03:05:51:178] < ipv4 mtu = 1500\n[04-14_03:05:51:182] ifconfig rmnet_mhi0 up\n[04-14_03:05:51:206] ifconfig rmnet_mhi0.2 up\n[04-14_03:05:51:233] ip -4 address flush dev rmnet_mhi0.2\n[04-14_03:05:51:254] ip -4 address add 10.36.109.217/30 dev rmnet_mhi0.2\n[04-14_03:05:51:277] ip -4 route add default via 10.36.109.218 dev rmnet_mhi0.2\n\nroot@OpenWrt:~# ifconfig rmnet_mhi0.1\nrmnet_mhi0.1 Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \n          inet addr:10.38.21.158  Mask:255.255.255.252\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\n          UP RUNNING NOARP  MTU:1500  Metric:1\n          RX packets:37 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:29 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:9907 (9.6 KiB)  TX bytes:2764 (2.6 KiB)\n\nroot@OpenWrt:~# ifconfig rmnet_mhi0.2\nrmnet_mhi0.2 Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \n          inet addr:10.36.109.217  Mask:255.255.255.252\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\n          UP RUNNING NOARP  MTU:1500  Metric:1\n          RX packets:5 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:18 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:344 (344.0 B)  TX bytes:1152 (1.1 KiB)\n\nroot@OpenWrt:~# ip ro del 8.8.8.8/32\nRTNETLINK answers: No such process\nroot@OpenWrt:~# ip ro add 8.8.8.8/32 dev rmnet_mhi0.1\nroot@OpenWrt:~# ping 8.8.8.8\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=73.248 ms\n\nroot@OpenWrt:~# ip ro del 8.8.8.8/32\nroot@OpenWrt:~# ip ro del 8.8.8.8/32\nRTNETLINK answers: No such process\nroot@OpenWrt:~# ip ro add 8.8.8.8/32 dev rmnet_mhi0.2\nroot@OpenWrt:~# ping 8.8.8.8\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=99.637 ms\n\nroot@OpenWrt:~# quectel-CM -k 2\n[04-14_03:06:58:912] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-14_03:06:59:063] /proc/3565/cmdline: quectel-CM -n 2 -s 4gnet\n[04-14_03:06:59:064] send SIGINT to process 3565\n[  295.719442] net rmnet_mhi0: link_state 0x3 -> 0x1\n[04-14_03:06:59:407] proxy_loop poll fd = 6, revents = 0011\n[04-14_03:06:59:408] handle_client_disconnect client_fd=6, client_idx=2\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/pcie_mhi_qmap=1.txt",
    "content": "root@OpenWrt:/# cat /sys/class/net/rmnet_mhi0/qmap_mode \n1\nroot@OpenWrt:/# cat /sys/module/pcie_mhi/parameters/mhi_mbim_enabled \n0\nroot@OpenWrt:/# dmesg | grep mhi\n[   18.442226] mhi_init Quectel_Linux_PCIE_MHI_Driver_V1.3.0.17\n[   18.443032] mhi_pci_probe pci_dev->name = 0000:01:00.0, domain=0, bus=1, slot=0, vendor=17CB, device=0306\n[   18.447488] mhi_q 0000:01:00.0: BAR 0: assigned [mem 0x48000000-0x48000fff 64bit]\n[   18.456563] mhi_q 0000:01:00.0: enabling device (0140 -> 0142)\n[   18.464184] [I][mhi_init_pci_dev] msi_required = 5, msi_allocated = 5, msi_irq = 197\n[   18.464215] [I][mhi_power_up] dev_state:RESET\n[   18.464225] [I][mhi_async_power_up] Requested to power on\n[   18.464432] [I][mhi_alloc_coherent] size = 114688, dma_handle = 8d400000\n[   18.464445] [I][mhi_init_dev_ctxt] mhi_ctxt->ctrl_seg = d1766000\n[   18.466003] [I][mhi_async_power_up] dev_state:RESET ee:AMSS\n[   18.466080] [I][mhi_pm_st_worker] Transition to state:READY\n[   18.466109] [I][mhi_pm_st_worker] INVALID_EE -> AMSS\n[   18.466135] [I][mhi_ready_state_transition] Waiting to enter READY state\n[   18.466224] [I][mhi_async_power_up] Power on setup success\n[   18.466265] [I][mhi_pci_probe] Return successful\n[   18.577299] [I][mhi_intvec_threaded_handlr] device ee:AMSS dev_state:READY, pm_state:POR\n[   18.577312] [I][mhi_ready_state_transition] Device in READY State\n[   18.577325] [I][mhi_intvec_threaded_handlr] device ee:AMSS dev_state:READY, INVALID_EE\n[   18.577329] [I][mhi_tryset_pm_state] Transition to pm state from:POR to:POR\n[   18.577337] [I][mhi_init_mmio] Initializing MMIO\n[   18.577344] [I][mhi_init_mmio] CHDBOFF:0x300\n[   18.577361] [I][mhi_init_mmio] ERDBOFF:0x700\n[   18.577372] [I][mhi_init_mmio] Programming all MMIO values.\n[   18.690834] [I][mhi_dump_tre] carl_ev evt_state_change mhistate=2\n[   18.690854] [I][mhi_process_ctrl_ev_ring] MHI state change event to state:M0\n[   18.690866] [I][mhi_pm_m0_transition] Entered With State:READY PM_STATE:POR\n[   18.690879] [I][mhi_tryset_pm_state] Transition to pm state from:POR to:M0\n[   18.694229] [I][mhi_dump_tre] carl_ev evt_ee_state execenv=2\n[   18.694241] [I][mhi_process_ctrl_ev_ring] MHI EE received event:AMSS\n[   18.694293] [I][mhi_pm_st_worker] Transition to state:MISSION MODE\n[   18.694310] [I][mhi_pm_st_worker] INVALID_EE -> AMSS\n[   18.694319] [I][mhi_pm_mission_mode_transition] Processing Mission Mode Transition\n[   18.694341] [I][mhi_init_timesync] No timesync capability found\n[   18.694350] [I][mhi_pm_mission_mode_transition] Adding new devices\n[   18.696365] [I][mhi_dtr_probe] Enter for DTR control channel\n[   18.696383] [I][__mhi_prepare_channel] Entered: preparing channel:18\n[   18.703113] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1, type=33\n[   18.703164] [I][__mhi_prepare_channel] Chan:18 successfully moved to start state\n[   18.703174] [I][__mhi_prepare_channel] Entered: preparing channel:19\n[   18.710681] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1, type=33\n[   18.710734] [I][__mhi_prepare_channel] Chan:19 successfully moved to start state\n[   18.710804] [I][mhi_dtr_probe] Exit with ret:0\n[   18.711774] [I][mhi_netdev_enable_iface] Prepare the channels for transfer\n[   18.711811] [I][__mhi_prepare_channel] Entered: preparing channel:100\n[   18.732097] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1, type=33\n[   18.732151] [I][__mhi_prepare_channel] Chan:100 successfully moved to start state\n[   18.732162] [I][__mhi_prepare_channel] Entered: preparing channel:101\n[   18.744170] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1, type=33\n[   18.744219] [I][__mhi_prepare_channel] Chan:101 successfully moved to start state\n[   18.749132] [I][mhi_netdev_enable_iface] Exited.\n[   18.750306] rmnet_vnd_register_device(rmnet_mhi0.1)=0\n[   18.752927] [I][mhi_pm_mission_mode_transition] Exit with ret:0\n\nroot@OpenWrt:/# busybox microcom /dev/mhi_DUN \nat+cpin?\n+CPIN: READY\n\nOK\nat+cops?\n+COPS: 0,0,\"CHINA MOBILE\",13\n\nOK\nat+csq\n+csq: 23,99\n\nOK\n\nroot@OpenWrt:/# quectel-CM -s cmnet &\n[04-13_09:26:58:077] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_09:26:58:078] network interface '' or qmidev '' is not exist\n[04-13_09:26:58:079] netcard driver = pcie_mhi, driver version = V1.3.0.17\n[04-13_09:26:58:080] qmap_mode = 1, qmap_version = 9, qmap_size = 16384, muxid = 0x81, qmap_netcard = rmnet_mhi0.1\n[04-13_09:26:58:080] Modem works in QMI mode\n[04-13_09:26:58:131] cdc_wdm_fd = 7\n[04-13_09:26:59:132] QmiWwanInit message timeout\n[04-13_09:27:00:140] Get clientWDS = 15\n[04-13_09:27:00:144] Get clientDMS = 1\n[04-13_09:27:00:147] Get clientNAS = 4\n[04-13_09:27:00:151] Get clientUIM = 1\n[04-13_09:27:00:155] Get clientWDA = 1\n[04-13_09:27:00:158] requestBaseBandVersion RM500QGLABR10A03M4G\n[04-13_09:27:00:161] qmap_settings.rx_urb_size = 16384\n[04-13_09:27:00:162] qmap_settings.ul_data_aggregation_max_datagrams  = 11\n[04-13_09:27:00:162] qmap_settings.ul_data_aggregation_max_size       = 8192\n[04-13_09:27:00:163] qmap_settings.dl_minimum_padding                 = 0\n[04-13_09:27:00:176] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_09:27:00:177] requestSetProfile[1] cmnet///0\n[04-13_09:27:00:190] requestGetProfile[1] cmnet///0\n[04-13_09:27:00:193] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\n[04-13_09:27:00:197] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-13_09:27:00:198] ifconfig rmnet_mhi0 down\n[04-13_09:27:00:222] ifconfig rmnet_mhi0.1 0.0.0.0\n[04-13_09:27:00:247] ifconfig rmnet_mhi0.1 down\n[04-13_09:27:00:281] requestSetupDataCall WdsConnectionIPv4Handle: 0x1228bb20\n[  245.284909] net rmnet_mhi0: link_state 0x0 -> 0x1\n[04-13_09:27:00:293] ifconfig rmnet_mhi0 up\n[  245.308696] [I][mhi_netdev_open] Opened net dev interface\n[04-13_09:27:00:318] ifconfig rmnet_mhi0.1 up\n[04-13_09:27:00:353] you are use OpenWrt?\n[04-13_09:27:00:354] should not calling udhcpc manually?\n[04-13_09:27:00:354] should modify /etc/config/network as below?\n[04-13_09:27:00:355] config interface wan\n[04-13_09:27:00:355] \toption ifname\trmnet_mhi0.1\n[04-13_09:27:00:355] \toption proto\tdhcp\n[04-13_09:27:00:356] should use \"/sbin/ifstaus wan\" to check rmnet_mhi0.1 's status?\n[04-13_09:27:00:356] busybox udhcpc -f -n -q -t 5 -i rmnet_mhi0.1\nudhcpc: started, v1.28.3\nudhcpc: sending discover\nudhcpc: sending select for 10.128.73.23\nudhcpc: lease of 10.128.73.23 obtained, lease time 7200\n[04-13_09:27:00:710] udhcpc: ifconfig rmnet_mhi0.1 10.128.73.23 netmask 255.255.255.240 broadcast +\n[04-13_09:27:00:742] udhcpc: setting default routers: 10.128.73.24\n\nroot@OpenWrt:/# ifconfig rmnet_mhi0.1\nrmnet_mhi0.1 Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \n          inet addr:10.128.73.23  Mask:255.255.255.240\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\n          UP RUNNING NOARP  MTU:1500  Metric:1\n          RX packets:2 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:612 (612.0 B)  TX bytes:684 (684.0 B)\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/pcie_mhi_qmap=1_bridge.txt",
    "content": "root@OpenWrt:/# lspci\n00:00.0 Class 0604: 17cb:1001\n01:00.0 Class ff00: 17cb:0306\n\nroot@OpenWrt:~# insmod pcie_mhi.ko \n[   77.949271] mhi_init Quectel_Linux_PCIE_MHI_Driver_V1.3.0.17\n[   77.950949] mhi_pci_probe pci_dev->name = 0000:01:00.0, domain=0, bus=1, slot=0, vendor=17CB, device=0306\n[   77.955331] mhi_q 0000:01:00.0: BAR 0: assigned [mem 0x48000000-0x48000fff 64bit]\n[   77.963756] mhi_q 0000:01:00.0: enabling device (0140 -> 0142)\n[   78.048911] [I][mhi_netdev_enable_iface] Prepare the channels for transfer\n[   78.092304] [I][mhi_netdev_enable_iface] Exited.\n[   78.096580] rmnet_vnd_register_device(rmnet_mhi0.1)=0\n\nroot@OpenWrt:~# brctl addbr br0\nroot@OpenWrt:~# brctl addif br0 rmnet_mhi0.1\nroot@OpenWrt:~# brctl addif br0 eth1\n[  250.017213] device eth1 entered promiscuous mode\nroot@OpenWrt:~# brctl show\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\nbr0\t\t8000.00001c353487\tno\t\teth1\n\t\t\t\t\t\t\t                rmnet_mhi0.1\n\t\t\t\t\t\t\t                \nroot@OpenWrt:~# quectel-CM -s cmnet -b &\n[04-14_06:43:28:473] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-14_06:43:28:474] network interface '' or qmidev '' is not exist\n[04-14_06:43:28:475] netcard driver = pcie_mhi, driver version = V1.3.0.17\n[04-14_06:43:28:476] qmap_mode = 1, qmap_version = 9, qmap_size = 16384, muxid = 0x81, qmap_netcard = rmnet_mhi0.1\n[04-14_06:43:28:477] Modem works in QMI mode\n[04-14_06:43:28:531] cdc_wdm_fd = 7\n[04-14_06:43:29:532] QmiWwanInit message timeout\n[04-14_06:43:30:540] Get clientWDS = 15\n[04-14_06:43:30:543] Get clientDMS = 1\n[04-14_06:43:30:546] Get clientNAS = 4\n[04-14_06:43:30:550] Get clientUIM = 1\n[04-14_06:43:30:553] Get clientWDA = 1\n[04-14_06:43:30:557] requestBaseBandVersion RM500QGLABR10A03M4G\n[04-14_06:43:30:560] qmap_settings.rx_urb_size = 16384\n[04-14_06:43:30:561] qmap_settings.ul_data_aggregation_max_datagrams  = 11\n[04-14_06:43:30:561] qmap_settings.ul_data_aggregation_max_size       = 8192\n[04-14_06:43:30:561] qmap_settings.dl_minimum_padding                 = 0\n[04-14_06:43:30:575] requestGetSIMStatus SIMStatus: SIM_READY\n[04-14_06:43:30:575] requestSetProfile[1] cmnet///0\n[04-14_06:43:30:588] requestGetProfile[1] cmnet///0\n[04-14_06:43:30:591] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\n[04-14_06:43:30:595] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-14_06:43:30:595] ifconfig rmnet_mhi0 down\n[04-14_06:43:30:620] ifconfig rmnet_mhi0.1 0.0.0.0\nifconfig: SIOCSIFFLAGS: Network is down\n[04-14_06:43:30:644] ifconfig rmnet_mhi0.1 down\n[04-14_06:43:30:679] requestSetupDataCall WdsConnectionIPv4Handle: 0xb41f47d0\n[  263.869899] net rmnet_mhi0: link_state 0x0 -> 0x1\n[04-14_06:43:30:693] ifconfig rmnet_mhi0 up\n[  263.892647] [I][mhi_netdev_open] Opened net dev interface\n[04-14_06:43:30:718] ifconfig rmnet_mhi0.1 up\n[04-14_06:43:30:746] echo '0xa59316b' > /sys/class/net/rmnet_mhi0.1/bridge_ipv4\n\nroot@OpenWrt:~# ifconfig br0 up\n[  268.800026] br0: port 2(eth1) entered forwarding state\n[  268.800336] br0: port 2(eth1) entered forwarding state\n[  268.804251] br0: port 1(rmnet_mhi0.1) entered forwarding state\n[  268.809465] br0: port 1(rmnet_mhi0.1) entered forwarding state\n[  283.845790] br0: port 2(eth1) entered forwarding state\n\n[  296.512489] rmnet_mhi0.1 PC Mac Address: 00:0e:c6:a6:6c:f1\n[  296.515756] rmnet_mhi0.1 PC Mac Address: 00:0e:c6:a6:6c:f1\n[  296.586584] rmnet_mhi0.1 sip = 10.89.49.107, tip=10.89.49.108, ipv4=10.89.49.107\n[  296.672356] rmnet_mhi0.1 sip = 10.89.49.107, tip=10.89.49.108, ipv4=10.89.49.107\n[  296.792061] rmnet_mhi0.1 sip = 10.89.49.107, tip=10.89.49.108, ipv4=10.89.49.107\n[  296.832822] rmnet_mhi0.1 sip = 10.89.49.107, tip=10.89.49.108, ipv4=10.89.49.107\n[  296.941073] rmnet_mhi0.1 sip = 0.0.0.0, tip=10.89.49.107, ipv4=10.89.49.107\n[  297.941310] rmnet_mhi0.1 sip = 0.0.0.0, tip=10.89.49.107, ipv4=10.89.49.107\n[  298.941528] rmnet_mhi0.1 sip = 0.0.0.0, tip=10.89.49.107, ipv4=10.89.49.107\n[  299.941704] rmnet_mhi0.1 sip = 10.89.49.107, tip=10.89.49.107, ipv4=10.89.49.107\n[  300.024484] rmnet_mhi0.1 sip = 10.89.49.107, tip=10.89.49.108, ipv4=10.89.49.107\n[  300.051995] rmnet_mhi0.1 sip = 10.89.49.107, tip=10.89.49.108, ipv4=10.89.49.107\n[  303.915933] rmnet_mhi0.1 sip = 10.89.49.107, tip=10.89.49.108, ipv4=10.89.49.107\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/pcie_mhi_qmap=4.txt",
    "content": "root@OpenWrt:/# lspci\n00:00.0 Class 0604: 17cb:1001\n01:00.0 Class ff00: 17cb:0306\n\nroot@OpenWrt:/# insmod pcie_mhi.ko qmap_mode=4\n[   61.988878] mhi_init Quectel_Linux_PCIE_MHI_Driver_V1.3.0.17\n[   61.989484] mhi_pci_probe pci_dev->name = 0000:01:00.0, domain=0, bus=1, slot=0, vendor=17CB, device=0306\n[   61.994039] mhi_q 0000:01:00.0: BAR 0: assigned [mem 0x48000000-0x48000fff 64bit]\n[   62.003208] mhi_q 0000:01:00.0: enabling device (0140 -> 0142)\n[   62.191947] [I][mhi_netdev_enable_iface] Prepare the channels for transfer\n[   62.224065] [I][mhi_netdev_enable_iface] Exited.\n[   62.225619] rmnet_vnd_register_device(rmnet_mhi0.1)=0\n[   62.229289] rmnet_vnd_register_device(rmnet_mhi0.2)=0\n[   62.234378] rmnet_vnd_register_device(rmnet_mhi0.3)=0\n[   62.240039] rmnet_vnd_register_device(rmnet_mhi0.4)=0\n\nroot@OpenWrt:/# quectel-qmi-proxy -d /dev/mhi_QMI0 &\n[04-13_09:25:12:278] Will use cdc-wdm='/dev/mhi_QMI0', proxy='quectel-qmi-proxy0'\n[04-13_09:25:12:297] qmi_proxy_init enter\n[04-13_09:25:12:297] qmi_proxy_loop enter thread_id 0xb6e88d44\n[04-13_09:25:14:298] qmi_proxy_init succful\n[04-13_09:25:14:299] local server: quectel-qmi-proxy0 sockfd = 4\n[04-13_09:25:14:299] qmi_proxy_server_fd = 4\n\nroot@OpenWrt:/# quectel-CM -n 1 -s cmnet &\n[04-13_09:25:32:336] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_09:25:32:337] network interface '' or qmidev '' is not exist\n[04-13_09:25:32:338] netcard driver = pcie_mhi, driver version = V1.3.0.17\n[04-13_09:25:32:339] qmap_mode = 4, qmap_version = 9, qmap_size = 16384, muxid = 0x81, qmap_netcard = rmnet_mhi0.1\n[04-13_09:25:32:340] Modem works in QMI mode\n[04-13_09:25:32:341] connect to quectel-qmi-proxy0 sockfd = 7\n[04-13_09:25:32:342] cdc_wdm_fd = 7\n[04-13_09:25:32:380] requestBaseBandVersion RM500QGLABR10A03M4G\n[04-13_09:25:32:382] qmap_settings.rx_urb_size = 16384\n[04-13_09:25:32:383] qmap_settings.ul_data_aggregation_max_datagrams  = 11\n[04-13_09:25:32:383] qmap_settings.ul_data_aggregation_max_size       = 8192\n[04-13_09:25:32:384] qmap_settings.dl_minimum_padding                 = 0\n[04-13_09:25:32:394] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_09:25:32:395] requestSetProfile[1] cmnet///0\n[04-13_09:25:32:409] requestGetProfile[1] cmnet///0\n[04-13_09:25:32:414] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\n[04-13_09:25:32:418] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-13_09:25:32:419] ifconfig rmnet_mhi0 down\n[04-13_09:25:32:448] ifconfig rmnet_mhi0.1 0.0.0.0\n[04-13_09:25:32:473] ifconfig rmnet_mhi0.1 down\n[04-13_09:25:32:514] requestSetupDataCall WdsConnectionIPv4Handle: 0x2313a2a0\n[  121.648172] net rmnet_mhi0: link_state 0x0 -> 0x1\n[04-13_09:25:32:525] ifconfig rmnet_mhi0 up\n[  121.671210] [I][mhi_netdev_open] Opened net dev interface\n[04-13_09:25:32:551] ifconfig rmnet_mhi0.1 up\n[04-13_09:25:32:586] you are use OpenWrt?\n[04-13_09:25:32:587] should not calling udhcpc manually?\n[04-13_09:25:32:587] should modify /etc/config/network as below?\n[04-13_09:25:32:587] config interface wan\n[04-13_09:25:32:588] \toption ifname\trmnet_mhi0.1\n[04-13_09:25:32:588] \toption proto\tdhcp\n[04-13_09:25:32:589] should use \"/sbin/ifstaus wan\" to check rmnet_mhi0.1 's status?\n[04-13_09:25:32:589] busybox udhcpc -f -n -q -t 5 -i rmnet_mhi0.1\nudhcpc: started, v1.28.3\nudhcpc: sending discover\nudhcpc: sending select for 10.174.91.70\nudhcpc: lease of 10.174.91.70 obtained, lease time 7200\n[04-13_09:25:32:980] udhcpc: ifconfig rmnet_mhi0.1 10.174.91.70 netmask 255.255.255.252 broadcast +\n[04-13_09:25:33:007] udhcpc: setting default routers: 10.174.91.69\n\nroot@OpenWrt:/# quectel-CM -n 2 -s 4gnet &\n[04-13_09:25:42:976] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_09:25:42:977] network interface '' or qmidev '' is not exist\n[04-13_09:25:42:978] netcard driver = pcie_mhi, driver version = V1.3.0.17\n[04-13_09:25:42:978] qmap_mode = 4, qmap_version = 9, qmap_size = 16384, muxid = 0x82, qmap_netcard = rmnet_mhi0.2\n[04-13_09:25:42:979] Modem works in QMI mode\n[04-13_09:25:42:981] connect to quectel-qmi-proxy0 sockfd = 7\n[04-13_09:25:42:982] cdc_wdm_fd = 7\n[04-13_09:25:43:010] requestBaseBandVersion RM500QGLABR10A03M4G\n[04-13_09:25:43:013] qmap_settings.rx_urb_size = 16384\n[04-13_09:25:43:014] qmap_settings.ul_data_aggregation_max_datagrams  = 11\n[04-13_09:25:43:014] qmap_settings.ul_data_aggregation_max_size       = 8192\n[04-13_09:25:43:015] qmap_settings.dl_minimum_padding                 = 0\n[04-13_09:25:43:030] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_09:25:43:030] requestSetProfile[2] 4gnet///0\n[04-13_09:25:43:046] requestGetProfile[2] 4gnet///0\n[04-13_09:25:43:050] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\n[04-13_09:25:43:054] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-13_09:25:43:055] ifconfig rmnet_mhi0.2 0.0.0.0\n[04-13_09:25:43:082] ifconfig rmnet_mhi0.2 down\n[04-13_09:25:43:507] requestSetupDataCall WdsConnectionIPv4Handle: 0x2332a780\n[  132.641313] net rmnet_mhi0: link_state 0x1 -> 0x3\n[04-13_09:25:43:519] ifconfig rmnet_mhi0 up\n[04-13_09:25:43:543] ifconfig rmnet_mhi0.2 up\n[04-13_09:25:43:570] you are use OpenWrt?\n[04-13_09:25:43:570] should not calling udhcpc manually?\n[04-13_09:25:43:571] should modify /etc/config/network as below?\n[04-13_09:25:43:571] config interface wan\n[04-13_09:25:43:571] \toption ifname\trmnet_mhi0.2\n[04-13_09:25:43:572] \toption proto\tdhcp\n[04-13_09:25:43:572] should use \"/sbin/ifstaus wan\" to check rmnet_mhi0.2 's status?\n[04-13_09:25:43:573] busybox udhcpc -f -n -q -t 5 -i rmnet_mhi0.2\nudhcpc: started, v1.28.3\nudhcpc: sending discover\nudhcpc: sending select for 10.163.253.197\nudhcpc: lease of 10.163.253.197 obtained, lease time 7200\n[04-13_09:25:43:810] udhcpc: ifconfig rmnet_mhi0.2 10.163.253.197 netmask 255.255.255.252 broadcast +\n[04-13_09:25:43:836] udhcpc: setting default routers: 10.163.253.198\n\nroot@OpenWrt:/# ifconfig rmnet_mhi0.1\nrmnet_mhi0.1 Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \n          inet addr:10.174.91.70  Mask:255.255.255.252\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\n          UP RUNNING NOARP  MTU:1500  Metric:1\n          RX packets:2 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:612 (612.0 B)  TX bytes:1380 (1.3 KiB)\n\nroot@OpenWrt:/# ifconfig rmnet_mhi0.2\nrmnet_mhi0.2 Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \n          inet addr:10.163.253.197  Mask:255.255.255.252\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\n          UP RUNNING NOARP  MTU:1500  Metric:1\n          RX packets:2 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:612 (612.0 B)  TX bytes:684 (684.0 B)\n\nroot@OpenWrt:/# ip ro del 8.8.8.8/32 \nRTNETLINK answers: No such process\nroot@OpenWrt:/# ip ro add 8.8.8.8/32 dev rmnet_mhi0.1\nroot@OpenWrt:/# ping 8.8.8.8\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=390.869 ms\n\nroot@OpenWrt:/# ip ro del 8.8.8.8/32 \nroot@OpenWrt:/# ip ro del 8.8.8.8/32 \nRTNETLINK answers: No such process\nroot@OpenWrt:/# ip ro add 8.8.8.8/32 dev rmnet_mhi0.2\nroot@OpenWrt:/# ping 8.8.8.8\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\n64 bytes from 8.8.8.8: seq=0 ttl=111 time=314.395 ms"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/pcie_mhi_qmap=4_bridge.txt",
    "content": "root@OpenWrt:~# lspci\n00:00.0 Class 0604: 17cb:1001\n01:00.0 Class ff00: 17cb:0306\nroot@OpenWrt:~# \n\nroot@OpenWrt:~# insmod pcie_mhi.ko qmap_mode=4\n[  200.906104] mhi_init Quectel_Linux_PCIE_MHI_Driver_V1.3.0.17\n[  200.907913] mhi_pci_probe pci_dev->name = 0000:01:00.0, domain=0, bus=1, slot=0, vendor=17CB, device=0306\n[  200.912164] mhi_q 0000:01:00.0: BAR 0: assigned [mem 0x48000000-0x48000fff 64bit]\n[  200.920593] mhi_q 0000:01:00.0: enabling device (0140 -> 0142)\nroot@OpenWrt:~# [  201.112214] [I][mhi_netdev_enable_iface] Prepare the channels for transfer\n[  201.154640] [I][mhi_netdev_enable_iface] Exited.\n[  201.159271] rmnet_vnd_register_device(rmnet_mhi0.1)=0\n[  201.162953] rmnet_vnd_register_device(rmnet_mhi0.2)=0\n[  201.167698] rmnet_vnd_register_device(rmnet_mhi0.3)=0\n[  201.172178] rmnet_vnd_register_device(rmnet_mhi0.4)=0\n\nroot@OpenWrt:~# brctl addbr br0\nroot@OpenWrt:~# brctl addif br0 eth1\nroot@OpenWrt:~# brctl addif br0 rmnet_mhi0.2\nroot@OpenWrt:~# brctl show\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\nbr0\t\t8000.00001c353487\tno\t\teth1\n\t\t\t\t\t\t\t                rmnet_mhi0.2\n\t\t\t\t\t\t\t                \nroot@OpenWrt:~# quectel-qmi-proxy -d /dev/mhi_QMI0 &\n[04-14_06:44:01:556] Will use cdc-wdm='/dev/mhi_QMI0', proxy='quectel-qmi-proxy0'\n[04-14_06:44:01:573] qmi_proxy_init enter\n[04-14_06:44:01:573] qmi_proxy_loop enter thread_id 0xb6f20d44\n[04-14_06:44:03:574] qmi_proxy_init succful\n[04-14_06:44:03:574] local server: quectel-qmi-proxy0 sockfd = 4\n[04-14_06:44:03:575] qmi_proxy_server_fd = 4\n\n\nroot@OpenWrt:~# quectel-CM -n 1 -s cmnet &\n[04-14_06:47:53:303] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-14_06:47:53:314] network interface '' or qmidev '' is not exist\n[04-14_06:47:53:315] netcard driver = pcie_mhi, driver version = V1.3.0.17\n[04-14_06:47:53:316] qmap_mode = 4, qmap_version = 9, qmap_size = 16384, muxid = 0x81, qmap_netcard = rmnet_mhi0.1\n[04-14_06:47:53:316] Modem works in QMI mode\n[04-14_06:47:53:318] connect to quectel-qmi-proxy0 sockfd = 7\n[04-14_06:47:53:318] cdc_wdm_fd = 7\n[04-14_06:47:53:326] Get clientWDS = 15\n[04-14_06:47:53:329] Get clientDMS = 2\n[04-14_06:47:53:334] Get clientNAS = 4\n[04-14_06:47:53:338] Get clientUIM = 1\n[04-14_06:47:53:343] Get clientWDA = 1\n[04-14_06:47:53:347] requestBaseBandVersion RM500QGLABR10A03M4G\n[04-14_06:47:53:351] qmap_settings.rx_urb_size = 16384\n[04-14_06:47:53:352] qmap_settings.ul_data_aggregation_max_datagrams  = 11\n[04-14_06:47:53:352] qmap_settings.ul_data_aggregation_max_size       = 8192\n[04-14_06:47:53:352] qmap_settings.dl_minimum_padding                 = 0\n[04-14_06:47:53:369] requestGetSIMStatus SIMStatus: SIM_READY\n[04-14_06:47:53:370] requestSetProfile[1] cmnet///0\n[04-14_06:47:53:402] requestGetProfile[1] cmnet///0\n[04-14_06:47:53:407] requestRegistrationState2 MCC: 0, MNC: 0, PS: Detached, DataCap: UNKNOW\n[04-14_06:47:53:411] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-14_06:47:53:412] ifconfig rmnet_mhi0 down\n[04-14_06:47:53:436] ifconfig rmnet_mhi0.1 0.0.0.0\n[04-14_06:47:53:460] ifconfig rmnet_mhi0.1 down\n[04-14_06:48:26:399] requestRegistrationState2 MCC: 460, MNC: 0, PS: Detached, DataCap: UNKNOW\n[04-14_06:48:26:405] requestRegistrationState2 MCC: 460, MNC: 0, PS: Detached, DataCap: UNKNOW\n[04-14_06:48:26:411] requestRegistrationState2 MCC: 460, MNC: 0, PS: Detached, DataCap: UNKNOW\n[04-14_06:48:26:970] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\n[04-14_06:48:26:992] requestSetupDataCall WdsConnectionIPv4Handle: 0x34176710\n[04-14_06:48:27:005] ifconfig rmnet_mhi0 up\n[04-14_06:48:27:031] ifconfig rmnet_mhi0.1 up\n[04-14_06:48:27:057] you are use OpenWrt?\n[04-14_06:48:27:057] should not calling udhcpc manually?\n[04-14_06:48:27:080] should use \"/sbin/ifstaus wan\" to check rmnet_mhi0.1 's status?\n[04-14_06:48:27:081] busybox udhcpc -f -n -q -t 5 -i rmnet_mhi0.1\n[04-14_06:48:27:363] udhcpc: ifconfig rmnet_mhi0.1 10.245.22.3 netmask 255.255.255.248 broadcast +\n[04-14_06:48:27:398] udhcpc: setting default routers: 10.245.22.4\n[04-14_06:48:27:491] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\n\nroot@OpenWrt:~# quectel-CM -n 2 -s 4gnet -b  &\n[04-14_06:48:06:842] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-14_06:48:06:853] network interface '' or qmidev '' is not exist\n[04-14_06:48:06:854] netcard driver = pcie_mhi, driver version = V1.3.0.17\n[04-14_06:48:06:855] qmap_mode = 4, qmap_version = 9, qmap_size = 16384, muxid = 0x82, qmap_netcard = rmnet_mhi0.2\n[04-14_06:48:06:855] Modem works in QMI mode\n[04-14_06:48:06:857] connect to quectel-qmi-proxy0 sockfd = 7\n[04-14_06:48:06:858] cdc_wdm_fd = 7\n[04-14_06:48:06:864] Get clientWDS = 16\n[04-14_06:48:06:867] Get clientDMS = 3\n[04-14_06:48:06:871] Get clientNAS = 5\n[04-14_06:48:06:874] Get clientUIM = 2\n[04-14_06:48:06:879] Get clientWDA = 2\n[04-14_06:48:06:886] requestBaseBandVersion RM500QGLABR10A03M4G\n[04-14_06:48:06:891] qmap_settings.rx_urb_size = 16384\n[04-14_06:48:06:891] qmap_settings.ul_data_aggregation_max_datagrams  = 11\n[04-14_06:48:06:892] qmap_settings.ul_data_aggregation_max_size       = 8192\n[04-14_06:48:06:892] qmap_settings.dl_minimum_padding                 = 0\n[04-14_06:48:06:909] requestGetSIMStatus SIMStatus: SIM_READY\n[04-14_06:48:06:909] requestSetProfile[2] 4gnet///0\n[04-14_06:48:06:940] requestGetProfile[2] 4gnet///0\n[04-14_06:48:06:944] requestRegistrationState2 MCC: 0, MNC: 0, PS: Detached, DataCap: UNKNOW\n[04-14_06:48:06:949] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-14_06:48:06:949] ifconfig rmnet_mhi0 down\n[04-14_06:48:06:973] ifconfig rmnet_mhi0.2 0.0.0.0\n[04-14_06:48:06:998] ifconfig rmnet_mhi0.2 down\n[04-14_06:48:26:400] requestRegistrationState2 MCC: 460, MNC: 0, PS: Detached, DataCap: UNKNOW\n[04-14_06:48:26:405] requestRegistrationState2 MCC: 460, MNC: 0, PS: Detached, DataCap: UNKNOW\n[04-14_06:48:26:411] requestRegistrationState2 MCC: 460, MNC: 0, PS: Detached, DataCap: UNKNOW\n[04-14_06:48:26:970] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\n[04-14_06:48:27:220] requestSetupDataCall WdsConnectionIPv4Handle: 0x341450a0\n[04-14_06:48:27:228] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\n[04-14_06:48:27:238] ifconfig rmnet_mhi0 up\n[04-14_06:48:27:263] ifconfig rmnet_mhi0.2 up\n[04-14_06:48:27:313] echo '0xaf51be9' > /sys/class/net/rmnet_mhi0.2/bridge_ipv4\n\nroot@OpenWrt:~# ifconfig rmnet_mhi0.1\nrmnet_mhi0.1 Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \n          inet addr:10.245.22.3  Mask:255.255.255.248\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\n          UP RUNNING NOARP  MTU:1500  Metric:1\n          RX packets:6 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:1836 (1.7 KiB)  TX bytes:2052 (2.0 KiB)\n\nroot@OpenWrt:~# ifconfig rmnet_mhi0.2\nrmnet_mhi0.2 Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\n          UP RUNNING NOARP  MTU:1500  Metric:1\n          RX packets:347 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:795 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:119871 (117.0 KiB)  TX bytes:121254 (118.4 KiB)\n\nroot@OpenWrt:~# ifconfig br0 up\n[  520.005476] rmnet_mhi0.2 PC Mac Address: 00:0e:c6:a6:6c:f1\n[  520.025896] rmnet_mhi0.2 PC Mac Address: 00:0e:c6:a6:6c:f1\n[  520.028002] rmnet_mhi0.2 PC Mac Address: 00:0e:c6:a6:6c:f1\n[  520.144371] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.234, ipv4=10.245.27.233\n[  520.410052] rmnet_mhi0.2 sip = 0.0.0.0, tip=10.245.27.233, ipv4=10.245.27.233\n[  520.414504] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.234, ipv4=10.245.27.233\n[  520.847074] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.234, ipv4=10.245.27.233\n[  521.410241] rmnet_mhi0.2 sip = 0.0.0.0, tip=10.245.27.233, ipv4=10.245.27.233\n[  522.410455] rmnet_mhi0.2 sip = 0.0.0.0, tip=10.245.27.233, ipv4=10.245.27.233\n[  522.822594] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.234, ipv4=10.245.27.233\n[  523.410638] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.233, ipv4=10.245.27.233\n[  523.510028] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.234, ipv4=10.245.27.233\n[  523.997961] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.234, ipv4=10.245.27.233\n[  543.799483] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.234, ipv4=10.245.27.233\n[  543.929301] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.234, ipv4=10.245.27.233\n\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/qmi_wwan_q.txt",
    "content": "root@ZhuoTK:/# dmesg\n[   15.840000] qmi_wwan_q 1-1.3:1.4: cdc-wdm0: USB WDM device\n[   15.860000] qmi_wwan_q 1-1.3:1.4: Quectel Android work on RawIP mode\n[   15.860000] qmi_wwan_q 1-1.3:1.4: rx_urb_size = 1520\n[   15.870000] qmi_wwan_q 1-1.3:1.4 wwan0: register 'qmi_wwan_q' at usb-101c0000.ehci-1.3, WWAN/QMI device, da:0b:ce:b2:db:21\n\nroot@ZhuoTK:/# quectel-CM -s cment &\n[04-13_03:20:20:456] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_03:20:20:459] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x003\n[04-13_03:20:20:460] Auto find qmichannel = /dev/cdc-wdm0\n[04-13_03:20:20:460] Auto find usbnet_adapter = wwan0\n[04-13_03:20:20:461] netcard driver = qmi_wwan_q, driver version = V1.2.0.23\n[04-13_03:20:20:461] Modem works in QMI mode\n[04-13_03:20:20:469] cdc_wdm_fd = 7\n[04-13_03:20:20:547] Get clientWDS = 4\n[04-13_03:20:20:579] Get clientDMS = 1\n[04-13_03:20:20:611] Get clientNAS = 4\n[04-13_03:20:20:643] Get clientUIM = 1\n[04-13_03:20:20:675] Get clientWDA = 1\n[04-13_03:20:20:707] requestBaseBandVersion EC25EFAR06A11M4G\n[04-13_03:20:20:836] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_03:20:20:836] requestSetProfile[1] cment///0\n[04-13_03:20:20:899] requestGetProfile[1] cment///0\n[04-13_03:20:20:931] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\n[04-13_03:20:20:963] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-13_03:20:20:963] ifconfig wwan0 0.0.0.0\n[04-13_03:20:20:976] ifconfig wwan0 down\n[04-13_03:20:21:186] requestSetupDataCall WdsConnectionIPv4Handle: 0x8723e780\n[04-13_03:20:21:316] ifconfig wwan0 up\n[04-13_03:20:21:329] you are use OpenWrt?\n[04-13_03:20:21:330] should not calling udhcpc manually?\n[04-13_03:20:21:330] should modify /etc/config/network as below?\n[04-13_03:20:21:330] config interface wan\n[04-13_03:20:21:330] \toption ifname\twwan0\n[04-13_03:20:21:330] \toption proto\tdhcp\n[04-13_03:20:21:330] should use \"/sbin/ifstaus wan\" to check wwan0 's status?\n[04-13_03:20:21:331] busybox udhcpc -f -n -q -t 5 -i wwan0\n[04-13_03:20:21:341] udhcpc (v1.23.2) started\n[04-13_03:20:21:353] Sending discover...\n[04-13_03:20:21:362] Sending select for 10.90.1.113...\n[04-13_03:20:21:365] Lease of 10.90.1.113 obtained, lease time 7200\n[04-13_03:20:21:370] udhcpc: ifconfig wwan0 10.90.1.113 netmask 255.255.255.252 broadcast +\n[04-13_03:20:21:380] udhcpc: setting default routers: 10.90.1.114\n\nroot@ZhuoTK:/# ifconfig wwan0\nwwan0     Link encap:Ethernet  HWaddr 00:CA:01:91:97:BA  \n          inet addr:10.90.1.113  Mask:255.255.255.252\n          inet6 addr: fe80::2ca:1ff:fe91:97ba/64 Scope:Link\n          UP RUNNING NOARP  MTU:1500  Metric:1\n          RX packets:38 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:46 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:5244 (5.1 KiB)  TX bytes:6964 (6.8 KiB)\n\nroot@ZhuoTK:/# ip ro show\ndefault via 10.90.1.114 dev wwan0 \n10.90.1.112/30 dev wwan0  proto kernel  scope link  src 10.90.1.113 \n192.168.1.0/24 dev br-lan  proto kernel  scope link  src 192.168.1.251 \n\nroot@ZhuoTK:/# killall quectel-CM\n[04-13_03:20:46:130] requestDeactivateDefaultPDP WdsConnectionIPv4Handle\n[04-13_03:20:46:406] ifconfig wwan0 0.0.0.0\n[04-13_03:20:46:418] ifconfig wwan0 down\n[04-13_03:20:46:600] QmiWwanThread exit\n[04-13_03:20:46:600] qmi_main exit\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/qmi_wwan_q_bridge.txt",
    "content": "root@ZhuoTK:/# insmod qmi_wwan_q.ko \n[  116.910000] qmi_wwan_q 1-1.3:1.4: cdc-wdm0: USB WDM device\n[  116.930000] qmi_wwan_q 1-1.3:1.4: Quectel Android work on RawIP mode\n[  116.930000] qmi_wwan_q 1-1.3:1.4: rx_urb_size = 1520\n[  116.940000] qmi_wwan_q 1-1.3:1.4 wwan0: register 'qmi_wwan_q' at usb-101c0000.ehci-1.3, WWAN/QMI device, 06:fb:51:a3:d6:c5\n[  116.950000] usbcore: registered new interface driver qmi_wwan_q\n\nroot@ZhuoTK:/# brctl addbr br0\nroot@ZhuoTK:/# brctl addif br0 eth0.1\nroot@ZhuoTK:/# brctl addif br0 wwan0\nroot@ZhuoTK:/# brctl show\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\nbr0\t\t8000.00ca019197b9\tno\t\teth0.1\n\t\t\t\t\t\t\t                wwan0\n\nroot@ZhuoTK:/# quectel-CM -s cmnet -b &\nroot@ZhuoTK:/# [04-13_05:13:39:369] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_05:13:39:372] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x003\n[  143.340000] net wwan0: bridge_mode change to 0x1\n[04-13_05:13:39:373] Auto find qmichannel = /dev/cdc-wdm0\n[04-13_05:13:39:374] Auto find usbnet_adapter = wwan0\n[04-13_05:13:39:374] netcard driver = qmi_wwan_q, driver version = V1.2.0.23\n[04-13_05:13:39:380] Modem works in QMI mode\n[04-13_05:13:39:388] cdc_wdm_fd = 7\n[04-13_05:13:39:466] Get clientWDS = 5\n[04-13_05:13:39:496] Get clientDMS = 2\n[04-13_05:13:39:527] Get clientNAS = 4\n[04-13_05:13:39:559] Get clientUIM = 1\n[04-13_05:13:39:592] Get clientWDA = 1\n[04-13_05:13:39:626] requestBaseBandVersion EC25EFAR06A11M4G\n[04-13_05:13:39:752] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_05:13:39:752] requestSetProfile[1] cmnet///0\n[04-13_05:13:39:816] requestGetProfile[1] cmnet///0\n[04-13_05:13:39:848] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\n[04-13_05:13:39:879] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-13_05:13:39:880] ifconfig wwan0 0.0.0.0\n[04-13_05:13:39:893] ifconfig wwan0 down\n[04-13_05:13:39:943] requestSetupDataCall WdsConnectionIPv4Handle: 0x872627c0\n[04-13_05:13:40:073] ifconfig wwan0 up\n[04-13_05:13:40:085] echo '0xa8d9237' > /sys/class/net/wwan0/bridge_ipv4\n\nroot@ZhuoTK:/# ifconfig br0 up\n[  165.730000] wwan0 PC Mac Address: 00:0e:c6:a6:6c:f1\n[  165.750000] wwan0 PC Mac Address: 00:0e:c6:a6:6c:f1\n[  165.860000] wwan0 sip = 10.141.146.55, tip=10.141.146.56, ipv4=10.141.146.55\n[  165.870000] wwan0 sip = 10.141.146.55, tip=10.141.146.56, ipv4=10.141.146.55\n[  165.990000] wwan0 sip = 10.141.146.55, tip=10.141.146.56, ipv4=10.141.146.55\n[  166.010000] wwan0 sip = 0.0.0.0, tip=10.141.146.55, ipv4=10.141.146.55\n[  166.070000] wwan0 sip = 10.141.146.55, tip=10.141.146.56, ipv4=10.141.146.55\n[  167.010000] wwan0 sip = 0.0.0.0, tip=10.141.146.55, ipv4=10.141.146.55\n[  167.480000] br0: port 2(wwan0) entered forwarding state\n[  167.520000] br0: port 1(eth0.1) entered forwarding state\n[  168.020000] wwan0 sip = 0.0.0.0, tip=10.141.146.55, ipv4=10.141.146.55\n[  169.010000] wwan0 sip = 10.141.146.55, tip=10.141.146.55, ipv4=10.141.146.55\n[  169.120000] wwan0 sip = 10.141.146.55, tip=10.141.146.56, ipv4=10.141.146.55\n[  169.130000] wwan0 sip = 10.141.146.55, tip=10.141.146.56, ipv4=10.141.146.55\n[  176.620000] wwan0 sip = 10.141.146.55, tip=10.141.146.56, ipv4=10.141.146.55\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/qmi_wwan_q_qmap=1.txt",
    "content": "root@ZhuoTK:/# insmod qmi_wwan_q.ko qmap_mode=1\n[ 1367.200000] usbcore: registered new interface driver qmi_wwan_q\n[ 1383.840000] usb 1-1.3: new high-speed USB device number 7 using ehci-platform\n[ 1384.080000] qmi_wwan_q 1-1.3:1.4: cdc-wdm0: USB WDM device\n[ 1384.080000] qmi_wwan_q 1-1.3:1.4: Quectel Android work on RawIP mode\n[ 1384.100000] qmi_wwan_q 1-1.3:1.4: rx_urb_size = 4096\n[ 1384.100000] qmi_wwan_q 1-1.3:1.4 wwan0: register 'qmi_wwan_q' at usb-101c0000.ehci-1.3, WWAN/QMI device, da:0b:ce:b2:db:21\n\nroot@ZhuoTK:/# quectel-CM -s cmnet &\n[04-13_03:41:28:144] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_03:41:28:146] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x007\n[04-13_03:41:28:148] Auto find qmichannel = /dev/cdc-wdm0\n[04-13_03:41:28:148] Auto find usbnet_adapter = wwan0\n[04-13_03:41:28:148] netcard driver = qmi_wwan_q, driver version = V1.2.0.23\n[04-13_03:41:28:149] qmap_mode = 1, qmap_version = 5, qmap_size = 4096, muxid = 0x81, qmap_netcard = wwan0\n[04-13_03:41:28:150] Modem works in QMI mode\n[04-13_03:41:28:158] cdc_wdm_fd = 7\n[04-13_03:41:28:238] Get clientWDS = 4\n[04-13_03:41:28:271] Get clientDMS = 1\n[04-13_03:41:28:302] Get clientNAS = 4\n[04-13_03:41:28:334] Get clientUIM = 1\n[04-13_03:41:28:365] Get clientWDA = 1\n[04-13_03:41:28:397] requestBaseBandVersion EC25EFAR06A11M4G\n[04-13_03:41:28:430] qmap_settings.rx_urb_size = 4096\n[ 1393.530000] net wwan0: ul_data_aggregation_max_datagrams=11, ul_data_aggregation_max_size=4096, dl_minimum_padding=0\n[04-13_03:41:28:431] qmap_settings.ul_data_aggregation_max_datagrams  = 11\n[04-13_03:41:28:431] qmap_settings.ul_data_aggregation_max_size       = 4096\n[04-13_03:41:28:431] qmap_settings.dl_minimum_padding                 = 0\n[04-13_03:41:28:557] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_03:41:28:558] requestSetProfile[1] cmnet///0\n[04-13_03:41:28:622] requestGetProfile[1] cmnet///0\n[04-13_03:41:28:654] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\n[04-13_03:41:28:685] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[ 1393.790000] net wwan0: link_state 0x1 -> 0x0\n[04-13_03:41:28:692] ifconfig wwan0 0.0.0.0\n[04-13_03:41:28:703] ifconfig wwan0 down\n[04-13_03:41:28:751] requestSetupDataCall WdsConnectionIPv4Handle: 0x8729a6b0\n[ 1393.980000] net wwan0: link_state 0x0 -> 0x1\n[04-13_03:41:28:882] ifconfig wwan0 up\n[04-13_03:41:28:895] you are use OpenWrt?\n[04-13_03:41:28:895] should not calling udhcpc manually?\n[04-13_03:41:28:895] should modify /etc/config/network as below?\n[04-13_03:41:28:896] config interface wan\n[04-13_03:41:28:896] \toption ifname\twwan0\n[04-13_03:41:28:896] \toption proto\tdhcp\n[04-13_03:41:28:896] should use \"/sbin/ifstaus wan\" to check wwan0 's status?\n[04-13_03:41:28:896] busybox udhcpc -f -n -q -t 5 -i wwan0\n[04-13_03:41:28:907] udhcpc (v1.23.2) started\n[04-13_03:41:28:919] Sending discover...\n[04-13_03:41:28:925] Sending select for 10.129.198.20...\n[04-13_03:41:28:929] Lease of 10.129.198.20 obtained, lease time 7200\n[04-13_03:41:28:934] udhcpc: ifconfig wwan0 10.129.198.20 netmask 255.255.255.248 broadcast +\n[04-13_03:41:28:949] udhcpc: setting default routers: 10.129.198.21\n\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/qmi_wwan_q_qmap=1_bridge.txt",
    "content": "root@ZhuoTK:/# insmod qmi_wwan_q.ko qmap_mode=1\n[   49.000000] qmi_wwan_q 1-1.3:1.4: cdc-wdm0: USB WDM device\n[   49.000000] qmi_wwan_q 1-1.3:1.4: Quectel Android work on RawIP mode\n[   49.020000] qmi_wwan_q 1-1.3:1.4: rx_urb_size = 4096\n[   49.020000] qmi_wwan_q 1-1.3:1.4 wwan0: register 'qmi_wwan_q' at usb-101c0000.ehci-1.3, WWAN/QMI device, de:ae:5c:82:b5:b2\n[   49.030000] usbcore: registered new interface driver qmi_wwan_q\n\nroot@ZhuoTK:/# brctl addbr br0\nroot@ZhuoTK:/# brctl addif br0 eth0.1\nroot@ZhuoTK:/# brctl addif br0 wwan0\nroot@ZhuoTK:/# brctl show\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\nbr0\t\t    8000.00ca019197b9\tno\t\teth0.1\n\t\t\t\t\t\t\t                    wwan0\n\nroot@ZhuoTK:/# quectel-CM -s cmnet -b &\n[04-13_05:11:46:442] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_05:11:46:444] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x003\n[   84.340000] net wwan0: bridge_mode change to 0x1\n[04-13_05:11:46:446] Auto find qmichannel = /dev/cdc-wdm0\n[04-13_05:11:46:446] Auto find usbnet_adapter = wwan0\n[04-13_05:11:46:446] netcard driver = qmi_wwan_q, driver version = V1.2.0.23\n[04-13_05:11:46:447] qmap_mode = 1, qmap_version = 5, qmap_size = 4096, muxid = 0x81, qmap_netcard = wwan0\n[04-13_05:11:46:454] Modem works in QMI mode\n[04-13_05:11:46:462] cdc_wdm_fd = 7\n[04-13_05:11:46:537] Get clientWDS = 5\n[04-13_05:11:46:569] Get clientDMS = 1\n[04-13_05:11:46:601] Get clientNAS = 4\n[04-13_05:11:46:633] Get clientUIM = 1\n[04-13_05:11:46:666] Get clientWDA = 1\n[04-13_05:11:46:697] requestBaseBandVersion EC25EFAR06A11M4G\n[04-13_05:11:46:730] qmap_settings.rx_urb_size = 4096\n[   84.620000] net wwan0: ul_data_aggregation_max_datagrams=11, ul_data_aggregation_max_size=4096, dl_minimum_padding=0\n[04-13_05:11:46:730] qmap_settings.ul_data_aggregation_max_datagrams  = 11\n[04-13_05:11:46:730] qmap_settings.ul_data_aggregation_max_size       = 4096\n[04-13_05:11:46:730] qmap_settings.dl_minimum_padding                 = 0\n[04-13_05:11:46:859] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_05:11:46:859] requestSetProfile[1] cmnet///0\n[04-13_05:11:46:922] requestGetProfile[1] cmnet///0\n[04-13_05:11:46:954] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\n[04-13_05:11:46:986] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[   84.880000] net wwan0: link_state 0x1 -> 0x0\n[04-13_05:11:46:992] ifconfig wwan0 0.0.0.0\n[04-13_05:11:47:005] ifconfig wwan0 down\n[04-13_05:11:47:050] requestSetupDataCall WdsConnectionIPv4Handle: 0x872a5830\n[   85.070000] net wwan0: link_state 0x0 -> 0x1\n[04-13_05:11:47:183] ifconfig wwan0 up\n[04-13_05:11:47:195] echo '0xa54a78b' > /sys/class/net/wwan0/bridge_ipv4\n\nroot@ZhuoTK:/# ifconfig wwan0\nwwan0     Link encap:Ethernet  HWaddr DE:AE:5C:82:B5:B2  \n          inet6 addr: fe80::dcae:5cff:fe82:b5b2/64 Scope:Link\n          UP RUNNING NOARP  MTU:1500  Metric:1\n          RX packets:3792 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:3271 errors:0 dropped:36 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:2271762 (2.1 MiB)  TX bytes:565184 (551.9 KiB)\n\nroot@ZhuoTK:/# ifconfig br0 up\n[   89.530000] br0: port 2(wwan0) entered forwarding state\n[   89.530000] br0: port 2(wwan0) entered forwarding state\n[   89.540000] br0: port 1(eth0.1) entered forwarding state\n[   89.540000] br0: port 1(eth0.1) entered forwarding state\n\nroot@ZhuoTK:/#\n[   93.720000] wwan0 sip = 192.168.1.153, tip=10.84.167.140, ipv4=10.84.167.139\n[  104.560000] br0: port 2(wwan0) entered forwarding state\n[  104.560000] br0: port 1(eth0.1) entered forwarding state\n[  111.750000] rt305x-esw 10110000.esw: link changed 0x00\n[  116.440000] rt305x-esw 10110000.esw: link changed 0x01\n[  116.620000] wwan0 PC Mac Address: 00:0e:c6:a6:6c:f1\n[  116.680000] wwan0 PC Mac Address: 00:0e:c6:a6:6c:f1\n[  116.690000] wwan0 PC Mac Address: 00:0e:c6:a6:6c:f1\n[  116.760000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\n[  117.050000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\n[  117.220000] wwan0 sip = 0.0.0.0, tip=10.84.167.139, ipv4=10.84.167.139\n[  117.820000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\n[  118.220000] wwan0 sip = 0.0.0.0, tip=10.84.167.139, ipv4=10.84.167.139\n[  118.300000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\n[  119.220000] wwan0 sip = 0.0.0.0, tip=10.84.167.139, ipv4=10.84.167.139\n[  120.220000] wwan0 sip = 10.84.167.139, tip=10.84.167.139, ipv4=10.84.167.139\n[  120.300000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\n[  121.430000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\n[  141.730000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\n[  144.390000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\n[  144.510000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/qmi_wwan_q_qmap=4.txt",
    "content": "root@ZhuoTK:/# insmod qmi_wwan_q.ko qmap_mode=4\n[ 1515.180000] usbcore: registered new interface driver qmi_wwan_q\n[ 1530.260000] usb 1-1.3: new high-speed USB device number 8 using ehci-platform\n[ 1530.500000] qmi_wwan_q 1-1.3:1.4: cdc-wdm0: USB WDM device\n[ 1530.500000] qmi_wwan_q 1-1.3:1.4: Quectel Android work on RawIP mode\n[ 1530.520000] qmi_wwan_q 1-1.3:1.4: rx_urb_size = 4096\n[ 1530.520000] qmi_wwan_q 1-1.3:1.4 wwan0: register 'qmi_wwan_q' at usb-101c0000.ehci-1.3, RMNET/USB device, da:0b:ce:b2:db:21\n[ 1530.530000] net wwan0: qmap_register_device wwan0_1\n[ 1530.540000] net wwan0: qmap_register_device wwan0_2\n[ 1530.550000] net wwan0: qmap_register_device wwan0_3\n[ 1530.550000] net wwan0: qmap_register_device wwan0_4\n\nroot@ZhuoTK:~# quectel-qmi-proxy &\n[04-13_03:44:53:958] Will use cdc-wdm='/dev/cdc-wdm0', proxy='quectel-qmi-proxy0'\n[04-13_03:44:53:959] qmi_proxy_init enter\n[04-13_03:44:53:960] qmi_proxy_loop enter thread_id 0x77c07530\n[04-13_03:44:54:960] qmi_proxy_init succful\n[04-13_03:44:54:960] local server: quectel-qmi-proxy0 sockfd = 4\n[04-13_03:44:54:960] qmi_proxy_server_fd = 4\n[04-13_03:45:04:346] +++ ClientFd=5\n[04-13_03:45:04:410] +++ ClientFd=5 QMIType=1 ClientId=4\n[04-13_03:45:04:442] +++ ClientFd=5 QMIType=2 ClientId=1\n[04-13_03:45:04:474] +++ ClientFd=5 QMIType=3 ClientId=4\n[04-13_03:45:04:506] +++ ClientFd=5 QMIType=11 ClientId=1\n[04-13_03:45:04:539] +++ ClientFd=5 QMIType=26 ClientId=1\n[04-13_03:45:10:770] +++ ClientFd=6\n[04-13_03:45:10:811] +++ ClientFd=6 QMIType=1 ClientId=21\n[04-13_03:45:10:843] +++ ClientFd=6 QMIType=2 ClientId=2\n[04-13_03:45:10:875] +++ ClientFd=6 QMIType=3 ClientId=5\n[04-13_03:45:10:907] +++ ClientFd=6 QMIType=11 ClientId=2\n[04-13_03:46:31:419] --- ClientFd=6 QMIType=1 ClientId=21\n[04-13_03:46:31:451] --- ClientFd=6 QMIType=2 ClientId=2\n[04-13_03:46:31:484] --- ClientFd=6 QMIType=3 ClientId=5\n[04-13_03:46:31:517] --- ClientFd=6 QMIType=11 ClientId=2\n[04-13_03:46:31:518] qmi_proxy_loop poll fd = 6, revents = 0011\n[04-13_03:46:31:519] --- ClientFd=6\n\nroot@ZhuoTK:/# quectel-CM -n 1 -s cmnet &\nroot@ZhuoTK:/# [04-13_03:45:04:340] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_03:45:04:343] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x008\n[04-13_03:45:04:344] Auto find qmichannel = /dev/cdc-wdm0\n[04-13_03:45:04:344] Auto find usbnet_adapter = wwan0\n[04-13_03:45:04:345] netcard driver = qmi_wwan_q, driver version = V1.2.0.23\n[04-13_03:45:04:345] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x81, qmap_netcard = wwan0_1\n[04-13_03:45:04:345] Modem works in QMI mode\n[04-13_03:45:04:347] connect to quectel-qmi-proxy0 sockfd = 7\n[04-13_03:45:04:347] cdc_wdm_fd = 7\n[04-13_03:45:04:411] Get clientWDS = 4\n[04-13_03:45:04:443] Get clientDMS = 1\n[04-13_03:45:04:475] Get clientNAS = 4\n[04-13_03:45:04:507] Get clientUIM = 1\n[04-13_03:45:04:540] Get clientWDA = 1\n[04-13_03:45:04:571] requestBaseBandVersion EC25EFAR06A11M4G\n[04-13_03:45:04:602] qmap_settings.rx_urb_size = 4096\n[ 1609.700000] net wwan0: ul_data_aggregation_max_datagrams=11, ul_data_aggregation_max_size=4096, dl_minimum_padding=0\n[04-13_03:45:04:603] qmap_settings.ul_data_aggregation_max_datagrams  = 11\n[04-13_03:45:04:603] qmap_settings.ul_data_aggregation_max_size       = 4096\n[04-13_03:45:04:603] qmap_settings.dl_minimum_padding                 = 0\n[04-13_03:45:04:731] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_03:45:04:731] requestSetProfile[1] cmnet///0\n[04-13_03:45:04:795] requestGetProfile[1] cmnet///0\n[04-13_03:45:04:827] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\n[04-13_03:45:04:858] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[ 1609.960000] net wwan0: link_state 0x1 -> 0x0\n[04-13_03:45:04:865] ifconfig wwan0 down\n[04-13_03:45:04:879] ifconfig wwan0_1 0.0.0.0\n[04-13_03:45:04:889] ifconfig wwan0_1 down\n[04-13_03:45:04:955] requestSetupDataCall WdsConnectionIPv4Handle: 0x87253410\n[ 1610.180000] net wwan0: link_state 0x0 -> 0x1\n[04-13_03:45:05:087] ifconfig wwan0 up\n[ 1610.200000] IPv6: ADDRCONF(NETDEV_UP): wwan0: link is not ready\n[04-13_03:45:05:105] ifconfig wwan0_1 up\n[ 1610.220000] IPv6: ADDRCONF(NETDEV_CHANGE): wwan0: link becomes ready\n[04-13_03:45:05:125] you are use OpenWrt?\n[04-13_03:45:05:125] should not calling udhcpc manually?\n[04-13_03:45:05:125] should modify /etc/config/network as below?\n[04-13_03:45:05:125] config interface wan\n[04-13_03:45:05:125] \toption ifname\twwan0_1\n[04-13_03:45:05:125] \toption proto\tdhcp\n[04-13_03:45:05:126] should use \"/sbin/ifstaus wan\" to check wwan0_1 's status?\n[04-13_03:45:05:126] busybox udhcpc -f -n -q -t 5 -i wwan0_1\n[04-13_03:45:05:136] udhcpc (v1.23.2) started\n[04-13_03:45:05:148] Sending discover...\n[04-13_03:45:05:155] Sending select for 10.244.10.206...\n[04-13_03:45:05:160] Lease of 10.244.10.206 obtained, lease time 7200\n[04-13_03:45:05:165] udhcpc: ifconfig wwan0_1 10.244.10.206 netmask 255.255.255.252 broadcast +\n[04-13_03:45:05:174] udhcpc: setting default routers: 10.244.10.205\n\nroot@ZhuoTK:/# quectel-CM -n 2 -s 4gnet &\n[04-13_03:45:10:764] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_03:45:10:767] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x008\n[04-13_03:45:10:768] Auto find qmichannel = /dev/cdc-wdm0\n[04-13_03:45:10:768] Auto find usbnet_adapter = wwan0\n[04-13_03:45:10:768] netcard driver = qmi_wwan_q, driver version = V1.2.0.23\n[04-13_03:45:10:769] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x82, qmap_netcard = wwan0_2\n[04-13_03:45:10:769] Modem works in QMI mode\n[04-13_03:45:10:771] connect to quectel-qmi-proxy0 sockfd = 7\n[04-13_03:45:10:771] cdc_wdm_fd = 7\n[04-13_03:45:10:812] Get clientWDS = 21\n[04-13_03:45:10:844] Get clientDMS = 2\n[04-13_03:45:10:876] Get clientNAS = 5\n[04-13_03:45:10:908] Get clientUIM = 2\n[04-13_03:45:10:971] requestBaseBandVersion EC25EFAR06A11M4G\n[04-13_03:45:11:099] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_03:45:11:099] requestSetProfile[2] 4gnet///0\n[04-13_03:45:11:163] requestGetProfile[2] 4gnet///0\n[04-13_03:45:11:195] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\n[04-13_03:45:11:227] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-13_03:45:11:227] ifconfig wwan0_2 0.0.0.0\n[ 1616.340000] IPv6: ADDRCONF(NETDEV_UP): wwan0_2: link is not ready\n[04-13_03:45:11:246] ifconfig wwan0_2 down\n[04-13_03:45:11:642] requestSetupDataCall WdsConnectionIPv4Handle: 0x87254580\n[ 1616.870000] net wwan0: link_state 0x1 -> 0x3\n[04-13_03:45:11:775] ifconfig wwan0 up\n[04-13_03:45:11:785] ifconfig wwan0_2 up\n[04-13_03:45:11:798] you are use OpenWrt?\n[04-13_03:45:11:798] should not calling udhcpc manually?\n[04-13_03:45:11:798] should modify /etc/config/network as below?\n[04-13_03:45:11:798] config interface wan\n[04-13_03:45:11:798] \toption ifname\twwan0_2\n[04-13_03:45:11:798] \toption proto\tdhcp\n[04-13_03:45:11:798] should use \"/sbin/ifstaus wan\" to check wwan0_2 's status?\n[04-13_03:45:11:799] busybox udhcpc -f -n -q -t 5 -i wwan0_2\n[04-13_03:45:11:809] udhcpc (v1.23.2) started\n[04-13_03:45:11:821] Sending discover...\n[04-13_03:45:11:830] Sending select for 10.245.78.212...\n[04-13_03:45:11:836] Lease of 10.245.78.212 obtained, lease time 7200\n[04-13_03:45:11:842] udhcpc: ifconfig wwan0_2 10.245.78.212 netmask 255.255.255.248 broadcast +\n[04-13_03:45:11:852] udhcpc: setting default routers: 10.245.78.213\n\nroot@ZhuoTK:/# ifconfig wwan0_1\nwwan0_1   Link encap:Ethernet  HWaddr DA:0B:CE:B2:DB:21  \n          inet addr:10.244.10.206  Mask:255.255.255.252\n          inet6 addr: fe80::d80b:ceff:feb2:db21/64 Scope:Link\n          UP RUNNING NOARP  MTU:1500  Metric:1\n          RX packets:2 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:640 (640.0 B)  TX bytes:1344 (1.3 KiB)\n\nroot@ZhuoTK:/# ifconfig wwan0_2\nwwan0_2   Link encap:Ethernet  HWaddr DA:0B:CE:B2:DB:21  \n          inet addr:10.245.78.212  Mask:255.255.255.248\n          inet6 addr: fe80::d80b:ceff:feb2:db21/64 Scope:Link\n          UP RUNNING NOARP  MTU:1500  Metric:1\n          RX packets:8 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:1193 (1.1 KiB)  TX bytes:1028 (1.0 KiB)\n\nroot@ZhuoTK:/# ip ro del 8.8.8.8/32\nRTNETLINK answers: No such process\n\nroot@ZhuoTK:/# ip ro add 8.8.8.8/32 dev wwan0_1\nroot@ZhuoTK:/# ping 8.8.8.8\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=113.508 ms\n\nroot@ZhuoTK:/# ip ro del 8.8.8.8/32\nroot@ZhuoTK:/# ip ro del 8.8.8.8/32\nRTNETLINK answers: No such process\n\nroot@ZhuoTK:/# ip ro add 8.8.8.8/32 dev wwan0_2\nroot@ZhuoTK:/# ping 8.8.8.8\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\n64 bytes from 8.8.8.8: seq=0 ttl=111 time=123.651 ms\n\nroot@ZhuoTK:/# quectel-CM -k 2\n[04-13_03:46:30:808] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_03:46:30:811] /proc/2834/cmdline: quectel-CM -n 2 -s 4gnet\n[04-13_03:46:30:811] send SIGINT to process 2834\n[04-13_03:46:30:811] requestDeactivateDefaultPDP WdsConnectionIPv4Handle\n[ 1696.460000] net wwan0: link_state 0x3 -> 0x1\n[04-13_03:46:31:361] ifconfig wwan0_2 0.0.0.0\n[04-13_03:46:31:373] ifconfig wwan0_2 down\n[04-13_03:46:31:516] QmiWwanThread exit\n[04-13_03:46:31:516] qmi_main exit\n\nroot@ZhuoTK:/# ifconfig wwan0_2\nwwan0_2   Link encap:Ethernet  HWaddr DA:0B:CE:B2:DB:21  \n          NOARP  MTU:1500  Metric:1\n          RX packets:16 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:15 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:1865 (1.8 KiB)  TX bytes:1620 (1.5 KiB)\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/qmi_wwan_q_qmap=4_bridge.txt",
    "content": "root@ZhuoTK:/# brctl addbr br0\nbrctl: bridge br0: File exists\nroot@ZhuoTK:/# brctl delbr br0\nroot@ZhuoTK:/# brctl addbr br0\nroot@ZhuoTK:/# brctl addif br0 eth0.1\n\nroot@ZhuoTK:/# insmod qmi_wwan_q.ko qmap_mode=4\n[  365.340000] usbcore: registered new interface driver qmi_wwan_q\n[  380.860000] usb 1-1.3: new high-speed USB device number 4 using ehci-platform\n[  381.100000] qmi_wwan_q 1-1.3:1.4: cdc-wdm0: USB WDM device\n[  381.100000] qmi_wwan_q 1-1.3:1.4: Quectel Android work on RawIP mode\n[  381.120000] qmi_wwan_q 1-1.3:1.4: rx_urb_size = 4096\n[  381.120000] qmi_wwan_q 1-1.3:1.4 wwan0: register 'qmi_wwan_q' at usb-101c0000.ehci-1.3, RMNET/USB device, fa:24:73:b5:39:a8\n[  381.130000] net wwan0: qmap_register_device wwan0_1\n[  381.140000] net wwan0: qmap_register_device wwan0_2\n[  381.150000] net wwan0: qmap_register_device wwan0_3\n[  381.150000] net wwan0: qmap_register_device wwan0_4\n\nroot@ZhuoTK:/# brctl addbr br0\nroot@ZhuoTK:/# brctl addif br0 eth0.1\nroot@ZhuoTK:/# brctl addif br0 wwan0_2\nroot@ZhuoTK:/# brctl show\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\nbr0\t\t8000.00ca019197b9\tno\t\teth0.1\n\t\t\t\t\t\t\t                wwan0_2\n\t\t\t\t\t\t\t                \t\t\t\t\t\t\t                \nroot@ZhuoTK:/# quectel-qmi-proxy &\n[04-13_05:18:10:832] Will use cdc-wdm='/dev/cdc-wdm0', proxy='quectel-qmi-proxy0'\n[04-13_05:18:10:833] qmi_proxy_init enter\n[04-13_05:18:10:833] qmi_proxy_loop enter thread_id 0x77995530\n[04-13_05:18:11:833] qmi_proxy_init succful\n[04-13_05:18:11:833] local server: quectel-qmi-proxy0 sockfd = 4\n[04-13_05:18:11:833] qmi_proxy_server_fd = 4\n\nroot@ZhuoTK:/# quectel-CM -n 2 -s 4gnet -b &\n[04-13_05:18:20:144] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_05:18:20:146] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x004\n[04-13_05:18:20:147] Auto find qmichannel = /dev/cdc-wdm0\n[04-13_05:18:20:148] Auto find usbnet_adapter = wwan0\n[04-13_05:18:20:148] netcard driver = qmi_wwan_q, driver version = V1.2.0.23\n[04-13_05:18:20:148] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x82, qmap_netcard = wwan0_2\n[04-13_05:18:20:149] Modem works in QMI mode\n[04-13_05:18:20:150] connect to quectel-qmi-proxy0 sockfd = 7\n[04-13_05:18:20:150] cdc_wdm_fd = 7\n[04-13_05:18:20:370] requestBaseBandVersion EC25EFAR06A11M4G\n[04-13_05:18:20:403] qmap_settings.rx_urb_size = 4096\n[04-13_05:18:20:404] qmap_settings.ul_data_aggregation_max_datagrams  = 11\n[04-13_05:18:20:404] qmap_settings.ul_data_aggregation_max_size       = 4096\n[04-13_05:18:20:404] qmap_settings.dl_minimum_padding                 = 0\n[04-13_05:18:20:530] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_05:18:20:530] requestSetProfile[2] 4gnet///0\n[04-13_05:18:20:594] requestGetProfile[2] 4gnet///0\n[04-13_05:18:20:626] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\n[04-13_05:18:20:657] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-13_05:18:20:658] ifconfig wwan0_2 0.0.0.0\n[04-13_05:18:20:669] ifconfig wwan0_2 down\n[04-13_05:18:21:010] requestSetupDataCall WdsConnectionIPv4Handle: 0x87249650\n[  425.100000] net wwan0: link_state 0x1 -> 0x3\n[04-13_05:18:21:143] ifconfig wwan0 up\n[04-13_05:18:21:156] ifconfig wwan0_2 up\n[04-13_05:18:21:168] echo '0xa8ceec7' > /sys/class/net/wwan0_2/bridge_ipv4\n\nroot@ZhuoTK:/# ifconfig br0 up\n\n[  450.520000] br0: port 2(wwan0_2) entered forwarding state\n[  450.520000] br0: port 1(eth0.1) entered forwarding state\n[  450.770000] wwan0_2 PC Mac Address: 00:0e:c6:a6:6c:f1\n[  450.790000] wwan0_2 PC Mac Address: 00:0e:c6:a6:6c:f1\n[  450.840000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\n[  450.950000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\n[  450.950000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\n[  451.120000] wwan0_2 sip = 0.0.0.0, tip=10.140.238.199, ipv4=10.140.238.199\n[  451.180000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\n[  452.120000] wwan0_2 sip = 0.0.0.0, tip=10.140.238.199, ipv4=10.140.238.199\n[  453.080000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\n[  453.120000] wwan0_2 sip = 0.0.0.0, tip=10.140.238.199, ipv4=10.140.238.199\n[  454.120000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.199, ipv4=10.140.238.199\n[  454.220000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\n[  456.200000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\n[  458.120000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\n[  459.240000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\n\nroot@ZhuoTK:/# quectel-CM -n 1 -s cmnet &\n[04-13_05:19:21:122] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_05:19:21:125] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x004\n[04-13_05:19:21:126] Auto find qmichannel = /dev/cdc-wdm0\n[04-13_05:19:21:126] Auto find usbnet_adapter = wwan0\n[04-13_05:19:21:127] netcard driver = qmi_wwan_q, driver version = V1.2.0.23\n[04-13_05:19:21:127] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x81, qmap_netcard = wwan0_1\n[04-13_05:19:21:127] Modem works in QMI mode\n[04-13_05:19:21:128] connect to quectel-qmi-proxy0 sockfd = 7\n[04-13_05:19:21:129] cdc_wdm_fd = 7\n[04-13_05:19:21:331] requestBaseBandVersion EC25EFAR06A11M4G\n[04-13_05:19:21:459] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_05:19:21:459] requestSetProfile[1] cmnet///0\n[04-13_05:19:21:522] requestGetProfile[1] cmnet///0\n[04-13_05:19:21:554] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\n[04-13_05:19:21:585] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[  485.550000] net wwan0: link_state 0x3 -> 0x2\n[04-13_05:19:21:592] ifconfig wwan0_1 0.0.0.0\n[  485.570000] IPv6: ADDRCONF(NETDEV_UP): wwan0_1: link is not ready\n[04-13_05:19:21:610] ifconfig wwan0_1 down\n[04-13_05:19:21:682] requestSetupDataCall WdsConnectionIPv4Handle: 0x8725ed70\n[  485.780000] net wwan0: link_state 0x2 -> 0x3\n[04-13_05:19:21:815] ifconfig wwan0 up\n[04-13_05:19:21:826] ifconfig wwan0_1 up\n[04-13_05:19:21:845] you are use OpenWrt?\n[04-13_05:19:21:845] should not calling udhcpc manually?\n[04-13_05:19:21:845] should modify /etc/config/network as below?\n[04-13_05:19:21:845] config interface wan\n[04-13_05:19:21:845] \toption ifname\twwan0_1\n[04-13_05:19:21:845] \toption proto\tdhcp\n[04-13_05:19:21:845] should use \"/sbin/ifstaus wan\" to check wwan0_1 's status?\n[04-13_05:19:21:846] busybox udhcpc -f -n -q -t 5 -i wwan0_1\n[04-13_05:19:21:863] udhcpc (v1.23.2) started\n[04-13_05:19:21:923] Sending discover...\n[04-13_05:19:21:927] Sending select for 10.141.146.55...\n[04-13_05:19:21:932] Lease of 10.141.146.55 obtained, lease time 7200\n[04-13_05:19:21:938] udhcpc: ifconfig wwan0_1 10.141.146.55 netmask 255.255.255.240 broadcast +\n[04-13_05:19:21:949] udhcpc: setting default routers: 10.141.146.56\n\nroot@ZhuoTK:/# ip ro show\ndefault via 10.141.146.56 dev wwan0_1 \n10.141.146.48/28 dev wwan0_1  proto kernel  scope link  src 10.141.146.55 \n192.168.1.0/24 dev br-lan  proto kernel  scope link  src 192.168.1.251 \n\nroot@ZhuoTK:/# ping 8.8.8.8\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\n64 bytes from 8.8.8.8: seq=0 ttl=111 time=86.006 ms\n64 bytes from 8.8.8.8: seq=1 ttl=111 time=74.763 ms\n64 bytes from 8.8.8.8: seq=2 ttl=111 time=85.501 ms\n64 bytes from 8.8.8.8: seq=3 ttl=111 time=74.231 ms\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/qmi_wwan_qmap=4.txt",
    "content": "# dmesg\n[ 1737.738025] usb 1-1.2: new high-speed USB device number 5 using xhci-hcd\n[ 1737.838917] usb 1-1.2: New USB device found, idVendor=2c7c, idProduct=0512, bcdDevice= 3.18\n[ 1737.838948] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3\n[ 1737.838963] usb 1-1.2: Product: EG12-EA\n[ 1737.838975] usb 1-1.2: Manufacturer: Quectel\n[ 1737.838986] usb 1-1.2: SerialNumber: 0123456789ABCDE\n[ 1737.994955] option 1-1.2:1.0: GSM modem (1-port) converter detected\n[ 1737.995430] usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB0\n[ 1737.995978] option 1-1.2:1.1: GSM modem (1-port) converter detected\n[ 1737.996409] usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB1\n[ 1737.996963] option 1-1.2:1.2: GSM modem (1-port) converter detected\n[ 1737.997351] usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB2\n[ 1737.997909] option 1-1.2:1.3: GSM modem (1-port) converter detected\n[ 1737.998976] usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB3\n[ 1825.835796] qmi_wwan 1-1.2:1.4: cdc-wdm0: USB WDM device\n[ 1825.839685] qmi_wwan 1-1.2:1.4 wwan0: register 'qmi_wwan' at usb-fe9c0000.xhci-1.2, WWAN/QMI device, 0e:80:14:b1:f6:b9\n[ 1825.840062] usbcore: registered new interface driver qmi_wwan\n\n# ifconfig wwan0 down\n# echo Y > /sys/class/net/wwan0/qmi/raw_ip \n\n# echo 1 > /sys/class/net/wwan0/qmi/add_mux \n# ifconfig qmimux0\nqmimux0: flags=4240<POINTOPOINT,NOARP,MULTICAST>  mtu 1500\n        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)\n        RX packets 0  bytes 0 (0.0 B)\n        RX errors 0  dropped 0  overruns 0  frame 0\n        TX packets 0  bytes 0 (0.0 B)\n        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n        \n# echo 2 > /sys/class/net/wwan0/qmi/add_mux \n# echo 3 > /sys/class/net/wwan0/qmi/add_mux \n# echo 4 > /sys/class/net/wwan0/qmi/add_mux \n# ifconfig qmimux3\nqmimux3: flags=4240<POINTOPOINT,NOARP,MULTICAST>  mtu 1500\n        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)\n        RX packets 0  bytes 0 (0.0 B)\n        RX errors 0  dropped 0  overruns 0  frame 0\n        TX packets 0  bytes 0 (0.0 B)\n        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n        \nset wwan0's mtu to max qmap packet size, for usbnet.c:usbnet_change_mtu() do not accept         \n# ifconfig wwan0 mtu 16385\n        \nrun qmi proxy programm, \n# quectel-CM/quectel-qmi-proxy -d /dev/cdc-wdm0\nor libqmi's qmi-proxy, if use libqmi's qmi-proxy, you can use qmicli to setup data call.\n# /usr/libexec/qmi-proxy --verbose --no-exit\n\nuse quectel-CM to setup data call, if use libqmi's qmi-proxy, use '-p qmi-proxy' instead of '-p quectel-qmi-proxy'\n# quectel-CM -p quectel-qmi-proxy -n 4 -s cmnet4\n# quectel-CM -p quectel-qmi-proxy -n 1 -s cmnet\n\nfor how to use libqmi to setup data call, please refer to https://knowledge.quectel.com/display/SWSYSTLinuxAndroid/libqmi_How+to+using+QMAP+multiplexing"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/usage_of_argument/6.txt",
    "content": "root@OpenWrt:~# quectel-CM -s cmnet -4 -6\n[04-14_06:56:51:778] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-14_06:56:51:779] network interface '' or qmidev '' is not exist\n[04-14_06:56:51:780] netcard driver = pcie_mhi, driver version = V1.3.0.17\n[04-14_06:56:51:781] qmap_mode = 4, qmap_version = 9, qmap_size = 16384, muxid = 0x81, qmap_netcard = rmnet_mhi0.1\n[04-14_06:56:51:782] Modem works in QMI mode\n[04-14_06:56:51:783] connect to quectel-qmi-proxy0 sockfd = 7\n[04-14_06:56:51:783] cdc_wdm_fd = 7\n[04-14_06:56:51:789] Get clientWDS = 15\n[04-14_06:56:51:792] Get clientWDS = 16\n[04-14_06:56:51:794] Get clientDMS = 3\n[04-14_06:56:51:798] Get clientNAS = 4\n[04-14_06:56:51:801] Get clientUIM = 1\n[04-14_06:56:51:805] Get clientWDA = 1\n[04-14_06:56:51:809] requestBaseBandVersion RM500QGLABR10A03M4G\n[04-14_06:56:51:813] qmap_settings.rx_urb_size = 16384\n[04-14_06:56:51:813] qmap_settings.ul_data_aggregation_max_datagrams  = 11\n[04-14_06:56:51:814] qmap_settings.ul_data_aggregation_max_size       = 8192\n[04-14_06:56:51:814] qmap_settings.dl_minimum_padding                 = 0\n[04-14_06:56:51:835] requestGetSIMStatus SIMStatus: SIM_READY\n[04-14_06:56:51:836] requestSetProfile[1] cmnet///0\n[04-14_06:56:51:848] requestGetProfile[1] cmnet///0\n[04-14_06:56:51:852] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\n[04-14_06:56:51:857] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-14_06:56:51:860] requestQueryDataCall IPv6ConnectionStatus: DISCONNECTED\n[04-14_06:56:51:861] ifconfig rmnet_mhi0 down\n[04-14_06:56:51:885] ifconfig rmnet_mhi0.1 0.0.0.0\nifconfig: SIOCSIFFLAGS: Network is down\n[04-14_06:56:51:909] ifconfig rmnet_mhi0.1 down\n[04-14_06:56:51:943] requestSetupDataCall WdsConnectionIPv4Handle: 0x341450a0\n[04-14_06:56:52:423] requestSetupDataCall WdsConnectionIPv6Handle: 0x341439f0\n[ 1001.561353] net rmnet_mhi0: link_state 0x0 -> 0x1\n[04-14_06:56:52:441] ifconfig rmnet_mhi0 up\n[ 1001.584623] [I][mhi_netdev_open] Opened net dev interface\n[04-14_06:56:52:467] ifconfig rmnet_mhi0.1 up\n[04-14_06:56:52:495] you are use OpenWrt?\n[04-14_06:56:52:496] should not calling udhcpc manually?\n[04-14_06:56:52:496] should modify /etc/config/network as below?\n[04-14_06:56:52:497] config interface wan\n[04-14_06:56:52:497] \toption ifname\trmnet_mhi0.1\n[04-14_06:56:52:497] \toption proto\tdhcp\n[04-14_06:56:52:498] should use \"/sbin/ifstaus wan\" to check rmnet_mhi0.1 's status?\n[04-14_06:56:52:498] busybox udhcpc -f -n -q -t 5 -i rmnet_mhi0.1\nudhcpc: started, v1.28.3\nudhcpc: sending discover\nudhcpc: sending select for 10.245.22.3\nudhcpc: lease of 10.245.22.3 obtained, lease time 7200\n[04-14_06:56:52:713] udhcpc: ifconfig rmnet_mhi0.1 10.245.22.3 netmask 255.255.255.248 broadcast +\n[04-14_06:56:52:754] udhcpc: setting default routers: 10.245.22.4\n[04-14_06:56:52:838] ip -6 address flush dev rmnet_mhi0.1\n[04-14_06:56:52:861] ip -6 address add 2409:8930:463:3daa:7c8e:429a:c902:c6cc/64 dev rmnet_mhi0.1\n[04-14_06:56:52:884] ip -6 route add default dev rmnet_mhi0.1\n\nroot@OpenWrt:~# cat /etc/resolv.conf \nnameserver 2409:8030:2000:0:0:0:0:1 # IPV6 rmnet_mhi0.1\nnameserver 2409:8030:2000:0:0:0:0:2 # IPV6 rmnet_mhi0.1\nsearch lan\nnameserver 127.0.0.1\n\nroot@OpenWrt:~# ip -6 ro show\n2409:8930:463:96df::/64 dev rmnet_mhi0.1  proto kernel  metric 256 \nfe80::/64 dev br-lan  proto kernel  metric 256 \nfe80::/64 dev br0  proto kernel  metric 256 \ndefault dev rmnet_mhi0.1  metric 1024 \n\nroot@OpenWrt:~# ping6 www.qq.com\nPING www.qq.com (2402:4e00:1430:1301::9227:79cc:76f2): 56 data bytes\n64 bytes from 2402:4e00:1430:1301::9227:79cc:76f2: seq=0 ttl=51 time=97.230 ms\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/log/usage_of_argument/m.txt",
    "content": "root@ZhuoTK:/# quectel-CM -n 1 -m 4 -s cmnet &\n[04-13_05:12:07:455] Quectel_QConnectManager_Linux_V1.6.0.25\n[04-13_05:12:07:458] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x003\n[04-13_05:12:07:459] Auto find qmichannel = /dev/qcqmi0\n[04-13_05:12:07:459] Auto find usbnet_adapter = usb0\n[04-13_05:12:07:467] netcard driver = GobiNet, driver version = V1.6.2.13\n[04-13_05:12:07:467] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x84, qmap_netcard = usb0.4\n[04-13_05:12:07:467] Modem works in QMI mode\n[04-13_05:12:07:495] Get clientWDS = 7\n[04-13_05:12:07:529] Get clientDMS = 8\n[04-13_05:12:07:561] Get clientNAS = 9\n[04-13_05:12:07:591] Get clientUIM = 10\n[04-13_05:12:07:623] requestBaseBandVersion EC25EFAR06A11M4G\n[04-13_05:12:07:752] requestGetSIMStatus SIMStatus: SIM_READY\n[04-13_05:12:07:752] requestSetProfile[1] cmnet///0\n[04-13_05:12:07:817] requestGetProfile[1] cmnet///0\n[04-13_05:12:07:849] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\n[04-13_05:12:07:881] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\n[04-13_05:12:07:881] ifconfig usb0 down\n[04-13_05:12:07:892] ifconfig usb0.4 0.0.0.0\n[04-13_05:12:07:903] ifconfig usb0.4 down\n[04-13_05:12:07:944] requestSetupDataCall WdsConnectionIPv4Handle: 0x87265c40\n[   52.020000] net usb0: link_state 0x0 -> 0x8\n[04-13_05:12:08:077] ifconfig usb0 up\n[04-13_05:12:08:096] ifconfig usb0.4 up\n[04-13_05:12:08:116] you are use OpenWrt?\n[04-13_05:12:08:116] should not calling udhcpc manually?\n[04-13_05:12:08:116] should modify /etc/config/network as below?\n[04-13_05:12:08:116] config interface wan\n[04-13_05:12:08:116] \toption ifname\tusb0.4\n[04-13_05:12:08:116] \toption proto\tdhcp\n[04-13_05:12:08:116] should use \"/sbin/ifstaus wan\" to check usb0.4 's status?\n[04-13_05:12:08:117] busybox udhcpc -f -n -q -t 5 -i usb0.4\n[04-13_05:12:08:134] udhcpc (v1.23.2) started\n[04-13_05:12:08:193] Sending discover...\n[04-13_05:12:08:197] Sending select for 10.84.241.180...\n[04-13_05:12:08:203] Lease of 10.84.241.180 obtained, lease time 7200\n[04-13_05:12:08:208] udhcpc: ifconfig usb0.4 10.84.241.180 netmask 255.255.255.248 broadcast +\n[04-13_05:12:08:221] udhcpc: setting default routers: 10.84.241.181\n\nroot@ZhuoTK:/# ifconfig usb0.4\nusb0.4    Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \n          inet addr:10.84.241.180  Mask:255.255.255.248\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\n          UP RUNNING NOARP  MTU:1500  Metric:1\n          RX packets:2 errors:0 dropped:0 overruns:0 frame:0\n          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0\n          collisions:0 txqueuelen:1000 \n          RX bytes:612 (612.0 B)  TX bytes:984 (984.0 B)\n\nroot@ZhuoTK:/# ip ro show\ndefault via 10.84.241.181 dev usb0.4 \n10.84.241.176/29 dev usb0.4  proto kernel  scope link  src 10.84.241.180 \n192.168.1.0/24 dev br-lan  proto kernel  scope link  src 192.168.1.251 \n\nroot@ZhuoTK:/# ping 8.8.8.8\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=99.431 ms\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/main.c",
    "content": "/******************************************************************************\n  @file    main.c\n  @brief   The entry program.\n\n  DESCRIPTION\n  Connectivity Management Tool for USB network adapter of Quectel wireless cellular modules.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 -2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n\n#include \"QMIThread.h\"\n#include <sys/wait.h>\n#include <sys/utsname.h>\n#include <sys/time.h>\n#include <dirent.h>\n\n#include \"util.h\"\n//#define CONFIG_PID_FILE_FORMAT \"/var/run/quectel-CM-%s.pid\" //for example /var/run/quectel-CM-wwan0.pid\n\nstatic PROFILE_T s_profile;\nint debug_qmi = 0;\nint qmidevice_control_fd[2];\nstatic int signal_control_fd[2];\nint g_donot_exit_when_modem_hangup = 0;\nextern int ql_ifconfig(int argc, char *argv[]);\nextern int ql_get_netcard_driver_info(const char*);\nextern int ql_capture_usbmon_log(PROFILE_T *profile, const char *log_path);\nextern void ql_stop_usbmon_log(PROFILE_T *profile);\n//UINT ifc_get_addr(const char *ifname);\nstatic int s_link = -1;\nstatic void usbnet_link_change(int link, PROFILE_T *profile) {\n    if (s_link == link)\n        return;\n\n    s_link = link;\n\n    if (!(link & (1<<IpFamilyV4)))\n        memset(&profile->ipv4, 0, sizeof(IPV4_T));\n\n    if (!(link & (1<<IpFamilyV6)))\n        memset(&profile->ipv6, 0, sizeof(IPV6_T));\n\n    if (link) {\n        udhcpc_start(profile);\n    } else {\n        udhcpc_stop(profile);\n    }\n}\n\nstatic int check_ipv4_address(PROFILE_T *profile) {\n    uint32_t oldAddress = profile->ipv4.Address;\n\n    if (profile->request_ops == &mbim_request_ops)\n        return 1; //we will get a new ipv6 address per requestGetIPAddress()\n    if (profile->request_ops == &atc_request_ops) {\n       if (!profile->udhcpc_ip) return 1;\n       oldAddress = profile->udhcpc_ip;\n    }\n\n    if (profile->request_ops->requestGetIPAddress(profile, IpFamilyV4) == 0) {\n         if (profile->ipv4.Address != oldAddress || debug_qmi) {\n             unsigned char *l = (unsigned char *)&oldAddress;\n             unsigned char *r = (unsigned char *)&profile->ipv4.Address;\n             dbg_time(\"localIP: %d.%d.%d.%d VS remoteIP: %d.%d.%d.%d\",\n                     l[3], l[2], l[1], l[0], r[3], r[2], r[1], r[0]);\n        }\n        return (profile->ipv4.Address == oldAddress);\n    }\n\n    return 0;\n}\n\nstatic void main_send_event_to_qmidevice(int triger_event) {\n     if (write(qmidevice_control_fd[0], &triger_event, sizeof(triger_event)) == -1) {};\n}\n\nstatic void send_signo_to_main(int signo) {\n     if (write(signal_control_fd[0], &signo, sizeof(signo)) == -1) {};\n}\n\nvoid qmidevice_send_event_to_main(int triger_event) {\n     if (write(qmidevice_control_fd[1], &triger_event, sizeof(triger_event)) == -1) {};\n}\n\nvoid qmidevice_send_event_to_main_ext(int triger_event, void *data, unsigned len) {\n     if (write(qmidevice_control_fd[1], &triger_event, sizeof(triger_event)) == -1) {};\n     if (write(qmidevice_control_fd[1], data, len) == -1) {};\n}\n\n#define MAX_PATH 256\n\nstatic int ls_dir(const char *dir, int (*match)(const char *dir, const char *file, void *argv[]), void *argv[])\n{\n    DIR *pDir;\n    struct dirent* ent = NULL;\n    int match_times = 0;\n\n    pDir = opendir(dir);\n    if (pDir == NULL)  {\n        dbg_time(\"Cannot open directory: %s, errno: %d (%s)\", dir, errno, strerror(errno));\n        return 0;\n    }\n\n    while ((ent = readdir(pDir)) != NULL)  {\n        match_times += match(dir, ent->d_name, argv);\n    }\n    closedir(pDir);\n\n    return match_times;\n}\n\nstatic int is_same_linkfile(const char *dir, const char *file,  void *argv[])\n{\n    const char *qmichannel = (const char *)argv[1];\n    char linkname[MAX_PATH*2+6];\n    char filename[MAX_PATH];\n    int linksize;\n\n    snprintf(linkname, sizeof(linkname), \"%.256s/%s\", dir, file);\n    linksize = readlink(linkname, filename, sizeof(filename));\n    if (linksize <= 0)\n        return 0;\n\n    filename[linksize] = 0;\n    if (strcmp(filename, qmichannel))\n        return 0;\n\n    dbg_time(\"%s -> %s\", linkname, filename);\n    return 1;\n}\n\nstatic int is_brother_process(const char *dir, const char *file, void *argv[])\n{\n    //const char *myself = (const char *)argv[0];\n    char linkname[MAX_PATH*2+6];\n    char filename[MAX_PATH];\n    int linksize;\n    int i = 0, kill_timeout = 15;\n    pid_t pid;\n\n    //dbg_time(\"%s\", file);\n    while (file[i]) {\n        if (!isdigit(file[i]))\n            break;\n        i++;\n    }\n\n    if (file[i]) {\n        //dbg_time(\"%s not digit\", file);\n        return 0;\n    }\n\n    snprintf(linkname, sizeof(linkname), \"%s/%s/exe\", dir, file);\n    linksize = readlink(linkname, filename, sizeof(filename));\n    if (linksize <= 0)\n        return 0;\n\n    filename[linksize] = 0;\n\n    pid = atoi(file);\n    if (pid >= getpid())\n        return 0;\n\n    snprintf(linkname, sizeof(linkname), \"%s/%s/fd\", dir, file);\n    if (!ls_dir(linkname, is_same_linkfile, argv))\n        return 0;\n\n    dbg_time(\"%s/%s/exe -> %s\", dir, file, filename);\n    while (kill_timeout-- && !kill(pid, 0))\n    {\n        kill(pid, SIGTERM);\n        sleep(1);\n    }\n    if (!kill(pid, 0))\n    {\n        dbg_time(\"force kill %s/%s/exe -> %s\", dir, file, filename);\n        kill(pid, SIGKILL);\n        sleep(1);\n    }\n\n    return 1;\n}\n\nstatic int kill_brothers(const char *qmichannel)\n{\n    char myself[MAX_PATH];\n    int filenamesize;\n    void *argv[2] = {myself, (void *)qmichannel};\n\n    filenamesize = readlink(\"/proc/self/exe\", myself, sizeof(myself));\n    if (filenamesize <= 0)\n        return 0;\n    myself[filenamesize] = 0;\n\n    if (ls_dir(\"/proc\", is_brother_process, argv))\n        sleep(1);\n\n    return 0;\n}\n\nstatic int kill_data_call_pdp(int pdp, char *self) {\n    int pid;\n    char *p = NULL;\n\n    p = self;\n    while (*self) {\n        if (*self == '/')\n            p = self+1;\n        self++;\n    }\n\n    pid = getpid_by_pdp(pdp, p);\n    if (pid > 0) {\n        dbg_time(\"send SIGINT to process %d\", pid);\n        return kill(pid, SIGINT);\n    }\n\n    return -1;\n}\n\nstatic void ql_sigaction(int signo) {\n     if (SIGALRM == signo)\n         send_signo_to_main(SIG_EVENT_START);\n     else\n     {\n        g_donot_exit_when_modem_hangup = 0;\n        send_signo_to_main(SIG_EVENT_STOP);\n        main_send_event_to_qmidevice(SIG_EVENT_STOP); //main may be wating qmi response\n    }\n}\n\nstatic int usage(const char *progname) {\n    dbg_time(\"Usage: %s [options]\", progname);\n    dbg_time(\"-s [apn [user password auth]]          Set apn/user/password/auth get from your network provider. auth: 1~pap, 2~chap, 3~MsChapV2\");\n    dbg_time(\"-p pincode                             Verify sim card pin if sim card is locked\");\n    dbg_time(\"-p [quectel-][qmi|mbim]-proxy          Request to use proxy\");\n    dbg_time(\"-f logfilename                         Save log message of this program to file\");\n    dbg_time(\"-u usbmonlog filename                  Save usbmon log to file\");\n    dbg_time(\"-i interface                           Specify which network interface to setup data call when multi-modems exits\");\n    dbg_time(\"-4                                     Setup IPv4 data call (default)\");\n    dbg_time(\"-6                                     Setup IPv6 data call\");\n    dbg_time(\"-n pdn                                 Specify which pdn to setup data call (default 1 for QMI, 0 for MBIM)\");\n    dbg_time(\"-k pdn                                 Specify which pdn to hangup data call (by send SIGINT to 'quectel-CM -n pdn')\");\n    dbg_time(\"-m iface-idx                           Bind QMI data call to wwan0_<iface idx> when QMAP used. E.g '-n 7 -m 1' bind pdn-7 data call to wwan0_1\");\n    dbg_time(\"-b                                     Enable network interface bridge function (default 0)\");\n    dbg_time(\"-v                                     Verbose log mode, for debug purpose.\");\n    dbg_time(\"-d                                     Obtain the IP address and dns through qmi\");\n    dbg_time(\"-D                                     Do not Append DNS servers to /etc/resolv.conf\");\n    dbg_time(\"-F                                     Force APN setting even if profile parameters match\");\n    dbg_time(\"-M metric                              Specify the metric of the default route\");\n    dbg_time(\"[Examples]\");\n    dbg_time(\"Example 1: %s \", progname);\n    dbg_time(\"Example 2: %s -s 3gnet \", progname);\n    dbg_time(\"Example 3: %s -s 3gnet carl 1234 1 -p 1234 -f gobinet_log.txt\", progname);\n    return 0;\n}\n\nstatic int qmi_main(PROFILE_T *profile)\n{\n    int triger_event = 0;\n    int signo;\n#ifdef CONFIG_SIM\n    SIM_Status SIMStatus = SIM_ABSENT;\n#endif\n    UCHAR PSAttachedState = 0;\n    UCHAR  IPv4ConnectionStatus = QWDS_PKT_DATA_UNKNOW;\n    UCHAR  IPv6ConnectionStatus = QWDS_PKT_DATA_UNKNOW; \n    unsigned SetupCallFail = 0;\n    unsigned long SetupCallAllowTime = clock_msec();\n#ifdef REBOOT_SIM_CARD_WHEN_LONG_TIME_NO_PS\n    unsigned PsAttachFail = 0;\n    unsigned long PsAttachTime = clock_msec();\n#endif\n    int qmierr = 0;\n    const struct request_ops *request_ops = profile ->request_ops;\n    pthread_t gQmiThreadID = 0;\n\n//sudo apt-get install udhcpc\n//sudo apt-get remove ModemManager\n    if (profile->reattach_flag) {\n        if (!reattach_driver(profile)) \n            sleep(2);\n    }\n\n    /* try to recreate FDs*/\n    if (socketpair( AF_LOCAL, SOCK_STREAM, 0, signal_control_fd) < 0 ) {\n        dbg_time(\"%s Faild to create main_control_fd: %d (%s)\", __func__, errno, strerror(errno));\n        return -1;\n    }\n\n    if ( socketpair( AF_LOCAL, SOCK_STREAM, 0, qmidevice_control_fd ) < 0 ) {\n        dbg_time(\"%s Failed to create thread control socket pair: %d (%s)\", __func__, errno, strerror(errno));\n        return 0;\n    }\n\n    if ((profile->qmap_mode == 0 || profile->qmap_mode == 1)\n        && (!profile->proxy[0] || strstr(profile->qmichannel, \"_IPCR\"))) {\n        kill_brothers(profile->qmichannel);\n     }\n\n    if (pthread_create( &gQmiThreadID, 0, profile->qmi_ops->read, (void *)profile) != 0) {\n        dbg_time(\"%s Failed to create QMIThread: %d (%s)\", __func__, errno, strerror(errno));\n        return 0;\n    }\n\n    if ((read(qmidevice_control_fd[0], &triger_event, sizeof(triger_event)) != sizeof(triger_event))\n        || (triger_event != RIL_INDICATE_DEVICE_CONNECTED)) {\n        dbg_time(\"%s Failed to init QMIThread: %d (%s)\", __func__, errno, strerror(errno));\n        return 0;\n    }\n\n    if (profile->qmi_ops->init && profile->qmi_ops->init(profile)) {\n        dbg_time(\"%s Failed to qmi init: %d (%s)\", __func__, errno, strerror(errno));\n        return 0;\n    }\n\n    if (request_ops->requestBaseBandVersion)\n        request_ops->requestBaseBandVersion(profile);\n\n    if (request_ops->requestSetEthMode)\n        request_ops->requestSetEthMode(profile);\n\n#ifdef CONFIG_FOXCONN_FCC_AUTH\n    // Only execute FCC authentication if the modem model requires it\n    if (profile->needs_fcc_auth) {\n        dbg_time(\"Executing FCC authentication for modem model: %s\", profile->BaseBandVersion);\n\n        // Check if the fcc auth was successful\n        char fcc_auth_success = 0;\n        if (request_ops->requestFoxconnSetFccAuthentication) {\n            // Use magic value 0x01 as seen in libqmi\n            qmierr = request_ops->requestFoxconnSetFccAuthentication(0x01);\n            if (!qmierr) {\n                dbg_time(\"Foxconn FCC Authentication successful\");\n                fcc_auth_success = 1;\n            }\n        }\n        if(fcc_auth_success != 1) {\n            if (request_ops->requestFoxconnSetFccAuthenticationV2) {\n                // Based on libqmi, use \"FOXCONN\" as magic string for Foxconn modems\n                const char *magic_string = \"FOXCONN\";  // Correct magic string for Foxconn\n                UCHAR magic_number = 0x01;  // Standard magic number from libqmi\n                \n                qmierr = request_ops->requestFoxconnSetFccAuthenticationV2(magic_string, magic_number);\n                if (!qmierr) {\n                    dbg_time(\"Foxconn FCC Authentication V2 successful\");\n                }\n      \n            }\n        }\n    } else {\n        dbg_time(\"Skipping FCC authentication - not required for this modem model\");\n    }\n#endif\n    if (request_ops->requestSetLoopBackState && profile->loopback_state) {\n    \tqmierr = request_ops->requestSetLoopBackState(profile->loopback_state, profile->replication_factor);\n    \tif (qmierr != QMI_ERR_INVALID_QMI_CMD) //X20 return this error \n            profile->loopback_state = 0; //wait for RIL_UNSOL_LOOPBACK_CONFIG_IND\n    }\n\n    if (request_ops->requestGetSIMStatus) {\n        qmierr = request_ops->requestGetSIMStatus(&SIMStatus);\n\n        while (qmierr == QMI_ERR_OP_DEVICE_UNSUPPORTED) {\n            sleep(1);\n            qmierr = request_ops->requestGetSIMStatus(&SIMStatus);\n        }\n\n        if ((SIMStatus == SIM_PIN) && profile->pincode && request_ops->requestEnterSimPin) {\n            request_ops->requestEnterSimPin(profile->pincode);\n        }\n    }\n\n    if (SIMStatus == SIM_READY) {\n        if (request_ops->requestGetICCID)\n            request_ops->requestGetICCID();\n\n        if (request_ops->requestGetIMSI)\n            request_ops->requestGetIMSI();\n    }\n\n    if (request_ops->requestGetProfile)\n        request_ops->requestGetProfile(profile);\n\n    if (request_ops->requestSetProfile && (profile->apn || profile->user || profile->password)) {\n        if (request_ops->requestSetProfile(profile) == 1) {\n#ifdef REBOOT_SIM_CARD_WHEN_APN_CHANGE //enable at only when customer asked \n            if (request_ops->requestRadioPower) {\n                request_ops->requestRadioPower(0);\n                request_ops->requestRadioPower(1);\n            }\n#endif\n        }\n    }\n\n    request_ops->requestRegistrationState(&PSAttachedState);\n\n#ifdef CONFIG_ENABLE_QOS\n    request_ops->requestRegisterQos(profile);\n#endif\n\n#if 1 //USB disconnnect and re-connect, but not reboot modem, will get this bug\n    if (profile->enable_ipv4\n        && profile->request_ops == &atc_request_ops\n        && !request_ops->requestQueryDataCall(&IPv4ConnectionStatus, IpFamilyV4)\n        && IPv4ConnectionStatus == QWDS_PKT_DATA_CONNECTED) {\n        request_ops->requestDeactivateDefaultPDP(profile, IpFamilyV4);\n    }\n#endif\n\n    send_signo_to_main(SIG_EVENT_CHECK);\n\n    while (1)\n    {\n        struct pollfd pollfds[] = {{signal_control_fd[1], POLLIN, 0}, {qmidevice_control_fd[0], POLLIN, 0}};\n        int ne, ret, nevents = sizeof(pollfds)/sizeof(pollfds[0]);\n\n        do {\n            ret = poll(pollfds, nevents,  15*1000);\n        } while ((ret < 0) && (errno == EINTR));\n\n        if (ret == 0)\n        {\n            send_signo_to_main(SIG_EVENT_CHECK);\n            continue;\n        }\n\n        if (ret <= 0) {\n            dbg_time(\"%s poll=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\n            goto __main_quit;\n        }\n\n        for (ne = 0; ne < nevents; ne++) {\n            int fd = pollfds[ne].fd;\n            short revents = pollfds[ne].revents;\n\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\n                dbg_time(\"%s poll err/hup\", __func__);\n                dbg_time(\"epoll fd = %d, events = 0x%04x\", fd, revents);\n                main_send_event_to_qmidevice(RIL_REQUEST_QUIT);\n                if (revents & POLLHUP)\n                    goto __main_quit;\n            }\n\n            if ((revents & POLLIN) == 0)\n                continue;\n\n            if (fd == signal_control_fd[1])\n            {\n                if (read(fd, &signo, sizeof(signo)) == sizeof(signo))\n                {\n                    alarm(0);\n                    switch (signo)\n                    {\n                        case SIG_EVENT_START:\n                            if (PSAttachedState != 1 && profile->loopback_state == 0)\n                                break;\n                            \n                            if (SetupCallAllowTime > clock_msec()) {\n                                alarm((SetupCallAllowTime - clock_msec()+999)/1000);\n                                break;\n                            }\n\n                            if (profile->enable_ipv4 && IPv4ConnectionStatus !=  QWDS_PKT_DATA_CONNECTED) {\n                                qmierr = request_ops->requestSetupDataCall(profile, IpFamilyV4);\n\n                                if ((qmierr > 0) && profile->user && profile->user[0] && profile->password && profile->password[0]) {\n                                    int old_auto =  profile->auth;\n\n                                    //may be fail because wrong auth mode, try pap->chap, or chap->pap\n                                    profile->auth = (profile->auth == 1) ? 2 : 1;\n                                \tqmierr = request_ops->requestSetupDataCall(profile, IpFamilyV4);\n\n                                    if (qmierr)\n                                        profile->auth = old_auto; //still fail, restore old auth moe\n                                }\n\n                                if (!qmierr) {\n                                    qmierr = request_ops->requestGetIPAddress(profile, IpFamilyV4);\n                                    if (!qmierr)\n                                        IPv4ConnectionStatus = QWDS_PKT_DATA_CONNECTED;\n                                }\n                                        \n                            }\n\n                            if (profile->enable_ipv6 && IPv6ConnectionStatus !=  QWDS_PKT_DATA_CONNECTED) {\n                                if (profile->enable_ipv4 && profile->request_ops != &qmi_request_ops) {\n                                    IPv6ConnectionStatus = IPv4ConnectionStatus;\n                                }\n                                else {\n                                    qmierr = request_ops->requestSetupDataCall(profile, IpFamilyV6);\n\n                                    if (!qmierr) {\n                                        qmierr = request_ops->requestGetIPAddress(profile, IpFamilyV6);\n                                        if (!qmierr)\n                                            IPv6ConnectionStatus = QWDS_PKT_DATA_CONNECTED;\n                                    }\n                                }\n                            }\n                                \n                            if ((profile->enable_ipv4 && IPv4ConnectionStatus ==  QWDS_PKT_DATA_DISCONNECTED)\n                                    || (profile->enable_ipv6 && IPv6ConnectionStatus ==  QWDS_PKT_DATA_DISCONNECTED)) {\n                                const unsigned allow_time[] = {5, 10, 20, 40, 60};\n\n                                if (SetupCallFail < (sizeof(allow_time)/sizeof(unsigned)))\n                                    SetupCallAllowTime = allow_time[SetupCallFail];\n                                else\n                                    SetupCallAllowTime = 60;\n                                SetupCallFail++;\n                                dbg_time(\"try to requestSetupDataCall %ld second later\", SetupCallAllowTime);\n                                alarm(SetupCallAllowTime);\n                                SetupCallAllowTime = SetupCallAllowTime*1000 + clock_msec();\n                            }\n                            else if (IPv4ConnectionStatus ==  QWDS_PKT_DATA_CONNECTED || IPv6ConnectionStatus ==  QWDS_PKT_DATA_CONNECTED) {\n                                SetupCallFail = 0;\n                                SetupCallAllowTime = clock_msec();\n                            }\n                        break;\n\n                        case SIG_EVENT_CHECK:\n                            if (request_ops->requestGetSignalInfo)\n                                request_ops->requestGetSignalInfo();\n                            \n                            if (request_ops->requestGetCellInfoList)\n                                request_ops->requestGetCellInfoList();\n\t\t\t\t\t\t\t\n                            if (request_ops->requestGetCoexWWANState)\n                                request_ops->requestGetCoexWWANState();\n\t\t\t\t\t\t\t\n                            if (PSAttachedState != 1)\n                                request_ops->requestRegistrationState(&PSAttachedState);\n\n#ifdef REBOOT_SIM_CARD_WHEN_LONG_TIME_NO_PS\n                            if (PSAttachedState) {\n                                PsAttachTime = clock_msec();\n                                PsAttachFail = 0;\n                            }\n                            else {\n                                unsigned long diff = (clock_msec() - PsAttachTime) / 1000;\n                                unsigned long threshold = REBOOT_SIM_CARD_WHEN_LONG_TIME_NO_PS << PsAttachFail;\n\n                                if (diff > threshold || diff > 960) {\n                                    //interval time is 60 -> 120 - > 240 - > 480 -> 960\n                                    PsAttachTime = clock_msec();\n                                    PsAttachFail++;\n\n                                    if (request_ops->requestRadioPower) {\n                                        request_ops->requestRadioPower(0);\n                                        request_ops->requestRadioPower(1);\n                                    }\n                                }\n                            }\n#endif\n\n                            if (profile->enable_ipv4 && IPv4ConnectionStatus != QWDS_PKT_DATA_DISCONNECTED\n                                && !request_ops->requestQueryDataCall(&IPv4ConnectionStatus, IpFamilyV4))\n                            {\n                                if (QWDS_PKT_DATA_CONNECTED == IPv4ConnectionStatus && profile->ipv4.Address == 0) {\n                                    //killall -9 quectel-CM for MBIM and ATC call\n                                    qmierr = request_ops->requestGetIPAddress(profile, IpFamilyV4);\n                                    if (qmierr)\n                                        IPv4ConnectionStatus = QWDS_PKT_DATA_DISCONNECTED;\n                                }\n\n                                //local ip is different with remote ip\n                                if (QWDS_PKT_DATA_CONNECTED == IPv4ConnectionStatus && check_ipv4_address(profile) == 0) {\n                                    request_ops->requestDeactivateDefaultPDP(profile, IpFamilyV4);\n                                    IPv4ConnectionStatus = QWDS_PKT_DATA_DISCONNECTED;\n                                }\n                            }\n                            else {\n                                IPv4ConnectionStatus = QWDS_PKT_DATA_DISCONNECTED;\n                            }\n\n                            if (profile->enable_ipv6 && IPv6ConnectionStatus != QWDS_PKT_DATA_DISCONNECTED) {\n                                if (profile->enable_ipv4 && profile->request_ops != &qmi_request_ops) {\n                                    IPv6ConnectionStatus = IPv4ConnectionStatus;\n                                }\n                                else {\n                                    request_ops->requestQueryDataCall(&IPv6ConnectionStatus, IpFamilyV6);\n                                }\n                            }\n                            else {\n                                IPv6ConnectionStatus = QWDS_PKT_DATA_DISCONNECTED;\n                            }\n\n                            if (IPv4ConnectionStatus ==  QWDS_PKT_DATA_DISCONNECTED && IPv6ConnectionStatus ==  QWDS_PKT_DATA_DISCONNECTED) {\n                                usbnet_link_change(0, profile);\n                            }\n                            else if (IPv4ConnectionStatus ==  QWDS_PKT_DATA_CONNECTED || IPv6ConnectionStatus ==  QWDS_PKT_DATA_CONNECTED) {\n                                int link = 0;\n                                if (IPv4ConnectionStatus == QWDS_PKT_DATA_CONNECTED)\n                                    link |= (1<<IpFamilyV4);\n                                if (IPv6ConnectionStatus == QWDS_PKT_DATA_CONNECTED)\n                                    link |= (1<<IpFamilyV6);\n                                usbnet_link_change(link, profile);\n                            }\n                            \n                            if ((profile->enable_ipv4 && IPv4ConnectionStatus ==  QWDS_PKT_DATA_DISCONNECTED)\n                                || (profile->enable_ipv6 && IPv6ConnectionStatus ==  QWDS_PKT_DATA_DISCONNECTED)) {\n                                send_signo_to_main(SIG_EVENT_START);\n                            }\n                        break;\n\n                        case SIG_EVENT_STOP:\n                            if (profile->enable_ipv4 && IPv4ConnectionStatus ==  QWDS_PKT_DATA_CONNECTED) {\n                                request_ops->requestDeactivateDefaultPDP(profile, IpFamilyV4);\n                            }\n                            if (profile->enable_ipv6 && IPv6ConnectionStatus ==  QWDS_PKT_DATA_CONNECTED) {\n                                if (profile->enable_ipv4 && profile->request_ops != &qmi_request_ops) {\n                                    \n                                }\n                                else {\n                                    request_ops->requestDeactivateDefaultPDP(profile, IpFamilyV6);\n                                }\n                            }\n                            usbnet_link_change(0, profile);\n                            if (profile->qmi_ops->deinit)\n                                profile->qmi_ops->deinit();\n                            main_send_event_to_qmidevice(RIL_REQUEST_QUIT);\n                            goto __main_quit;\n                        break;\n\n                        default:\n                        break;\n                    }\n                }\n            }\n\n            if (fd == qmidevice_control_fd[0]) {\n                if (read(fd, &triger_event, sizeof(triger_event)) == sizeof(triger_event)) {\n                    switch (triger_event) {\n                        case RIL_INDICATE_DEVICE_DISCONNECTED:\n                            usbnet_link_change(0, profile);                            \n                            goto __main_quit;\n                        break;\n\n                        case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:\n                            request_ops->requestRegistrationState(&PSAttachedState);\n                            if (PSAttachedState == 1) {\n                                if ((profile->enable_ipv4 && IPv4ConnectionStatus ==  QWDS_PKT_DATA_DISCONNECTED)\n                                    || (profile->enable_ipv6 && IPv6ConnectionStatus ==  QWDS_PKT_DATA_DISCONNECTED)) {\n                                    send_signo_to_main(SIG_EVENT_START);\n                                }\n                             } else {\n                                SetupCallAllowTime = clock_msec();\n                             }\n                        break;\n\n                        case RIL_UNSOL_DATA_CALL_LIST_CHANGED:\n                            if (IPv4ConnectionStatus ==  QWDS_PKT_DATA_CONNECTED || IPv6ConnectionStatus ==  QWDS_PKT_DATA_CONNECTED) {\n                                SetupCallAllowTime = clock_msec() + 1000; //from connect -> disconnect, do not re-dail immediately, wait network stable\n                            }\n                            send_signo_to_main(SIG_EVENT_CHECK);\n                        break;\n\n                        case MODEM_REPORT_RESET_EVENT:\n                        {\n                            dbg_time(\"main recv MODEM RESET SIGNAL\");\n                            main_send_event_to_qmidevice(RIL_REQUEST_QUIT);\n                            g_donot_exit_when_modem_hangup = 1;\n                            goto __main_quit;\n                        }\n                        break;\n\n                    \tcase RIL_UNSOL_LOOPBACK_CONFIG_IND:\n                        {\n                        \tQMI_WDA_SET_LOOPBACK_CONFIG_IND_MSG SetLoopBackInd;\n                        \tif (read(fd, &SetLoopBackInd, sizeof(SetLoopBackInd)) == sizeof(SetLoopBackInd)) {\n                            \tprofile->loopback_state = SetLoopBackInd.loopback_state.TLVVaule;\n                            \tprofile->replication_factor = le32_to_cpu(SetLoopBackInd.replication_factor.TLVVaule);\n                            \tdbg_time(\"SetLoopBackInd: loopback_state=%d, replication_factor=%u\",\n                                \tprofile->loopback_state, profile->replication_factor);\n                            \tif (profile->loopback_state)\n                                \tsend_signo_to_main(SIG_EVENT_START);\n                            }\n                        }\n                    \tbreak;\n#ifdef CONFIG_REG_QOS_IND\n                        case RIL_UNSOL_GLOBAL_QOS_FLOW_IND_QOS_ID:\n                        {\n                            UINT qos_id = 0;\n                            if (read(fd, &qos_id, sizeof(qos_id)) == sizeof(qos_id)) {\n                                profile->qos_id = qos_id;\n                            }\n                        }\n                    \tbreak;\n#endif\n                        default:\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\n__main_quit:\n    usbnet_link_change(0, profile);\n    if (gQmiThreadID && pthread_join(gQmiThreadID, NULL)) {\n        dbg_time(\"%s Error joining to listener thread (%s)\", __func__, strerror(errno));\n    }\n\n    close(signal_control_fd[0]);\n    close(signal_control_fd[1]);\n    close(qmidevice_control_fd[0]);\n    close(qmidevice_control_fd[1]);\n    dbg_time(\"%s exit\", __func__);\n\n    return 0;\n}\n\nstatic int quectel_CM(PROFILE_T *profile)\n{\n    int ret = 0;\n    char qmichannel[32] = {'\\0'};\n    char usbnet_adapter[32] = {'\\0'};\n\n    if (profile->expect_adapter[0])\n        strncpy(usbnet_adapter, profile->expect_adapter, sizeof(usbnet_adapter));\n    \n    if (qmidevice_detect(qmichannel, usbnet_adapter, sizeof(qmichannel), profile)) {\n    \tprofile->hardware_interface = HARDWARE_USB;\n    }\n    else if (mhidevice_detect(qmichannel, usbnet_adapter, profile)) {\n        profile->hardware_interface = HARDWARE_PCIE;\n    }\n\telse if (atdevice_detect(qmichannel, usbnet_adapter, profile)) {\n        profile->hardware_interface = HARDWARE_PCIE;\n    }\n#ifdef CONFIG_QRTR\n    else if (1) {\n        strcpy(qmichannel, \"qrtr\");\n        strcpy(usbnet_adapter, \"rmnet_mhi0\");\n        profile->hardware_interface = HARDWARE_PCIE;\n        profile->software_interface = SOFTWARE_QRTR;\n    }\n#endif\n    else {\n        dbg_time(\"qmidevice_detect failed\");\n        goto error;\n    }\n\n    strncpy(profile->qmichannel, qmichannel, sizeof(profile->qmichannel));\n    strncpy(profile->usbnet_adapter, usbnet_adapter, sizeof(profile->usbnet_adapter));\n    ql_get_netcard_driver_info(profile->usbnet_adapter);\n\n    if ((profile->hardware_interface == HARDWARE_USB) && profile->usblogfile)\n        ql_capture_usbmon_log(profile, profile->usblogfile);\n\n    if (profile->hardware_interface == HARDWARE_USB) {\n        profile->software_interface = get_driver_type(profile);\n    }\n  \n    ql_qmap_mode_detect(profile);\n\n    if (profile->software_interface == SOFTWARE_MBIM) {\n        dbg_time(\"Modem works in MBIM mode\");\n        profile->request_ops = &mbim_request_ops;\n        profile->qmi_ops = &mbim_dev_ops;\n        if (!profile->apn || !profile->apn[0]) {\n            //see FAE-51804  FAE-59811\n            dbg_time(\"When MBIM mode, must specify APN with '-s', or setup data call may fail!\");\n            exit(-404); //if no such issue on your side, please comment this\n        }\n        ret = qmi_main(profile);\n    }\n    else if (profile->software_interface == SOFTWARE_QMI) {\n        dbg_time(\"Modem works in QMI mode\");\n        profile->request_ops = &qmi_request_ops;\n        if (qmidev_is_gobinet(profile->qmichannel))\n            profile->qmi_ops = &gobi_qmidev_ops;\n        else\n            profile->qmi_ops = &qmiwwan_qmidev_ops;\n        qmidev_send = profile->qmi_ops->send;\n        ret = qmi_main(profile);\n    }\n    else if (profile->software_interface == SOFTWARE_ECM_RNDIS_NCM) {\n        dbg_time(\"Modem works in ECM_RNDIS_NCM mode\");\n        profile->request_ops = &atc_request_ops;\n        profile->qmi_ops = &atc_dev_ops;\n        ret = qmi_main(profile);\n    }\n#ifdef CONFIG_QRTR\n    else if (profile->software_interface == SOFTWARE_QRTR) {\n        dbg_time(\"Modem works in QRTR mode\");\n        profile->request_ops = &qmi_request_ops;\n        profile->qmi_ops = &qrtr_qmidev_ops;\n        qmidev_send = profile->qmi_ops->send;\n        ret = qmi_main(profile);\n    }\n#endif\n    else {\n        dbg_time(\"unsupport software_interface %d\", profile->software_interface);\n    }\n\n    ql_stop_usbmon_log(profile);\n\nerror:\n    return ret;\n}\n\nstatic int parse_user_input(int argc, char **argv, PROFILE_T *profile) {\n    int opt = 1;\n\n    profile->pdp = CONFIG_DEFAULT_PDP;\n    profile->profile_index = CONFIG_DEFAULT_PDP;\n    profile->force_apn_set = 0;  // Default: use normal APN comparison check\n\n    if (!strcmp(argv[argc-1], \"&\"))\n        argc--;\n\n#define has_more_argv() ((opt < argc) && (argv[opt][0] != '-'))\n    while  (opt < argc) {\n        if (argv[opt][0] != '-') {\n            return usage(argv[0]);\n        }\n\n        switch (argv[opt++][1])\n        {\n            case 's':\n                profile->apn = profile->user = profile->password = \"\";\n                if (has_more_argv()) {\n                    profile->apn = argv[opt++];\n                }\n                if (has_more_argv()) {\n                    profile->user = argv[opt++];\n                }\n                if (has_more_argv()) {\n                    profile->password = argv[opt++];\n                    if (profile->password && profile->password[0])\n                        profile->auth = 2; //default chap, customers may miss auth\n                }\n                if (has_more_argv()) {\n                    const char *auth = argv[opt++];\n\n                    if (!strcmp(auth, \"0\") || !strcasecmp(auth, \"none\")) {\n                        profile->auth = 0;\n                    }\n                    else if (!strcmp(auth, \"1\") || !strcasecmp(auth, \"pap\")) {\n                        profile->auth = 1;\n                    }\n                    else if (!strcmp(auth, \"2\") || !strcasecmp(auth, \"chap\")) {\n                        profile->auth = 2;\n                    }\n\t\t\t\t\telse if (!strcmp(auth, \"3\") || !strcasecmp(auth, \"MsChapV2\")) {\n                        profile->auth = 3;\n                    }\n                    else {\n                        dbg_time(\"unknow auth '%s'\", auth);\n                        return usage(argv[0]);\n                    }\n                }\n            break;\n\n            case 'p':\n                if (has_more_argv()) {\n                    const char *arg = argv[opt++];\n\n                    if (!strcmp(arg, QUECTEL_QMI_PROXY) || !strcmp(arg, QUECTEL_MBIM_PROXY)\n                        || !strcmp(arg, LIBQMI_PROXY) || !strcmp(arg, LIBMBIM_PROXY) || !strcmp(arg, QUECTEL_ATC_PROXY)) {\n                        strncpy(profile->proxy, arg, sizeof(profile->proxy) - 1);\n                    }\n                    else if ((999 < atoi(arg)) && (atoi(arg) < 10000)) {\n                        profile->pincode = arg;\n                    }\n                    else {\n                        dbg_time(\"unknow -p '%s'\", arg);\n                        return usage(argv[0]);\n                    }\n                }\n            break;\n\n            case 'm':\n                if (has_more_argv())\n                    profile->muxid = argv[opt++][0] - '0' + 0x80;\n            break;\n\n            case 'n':\n                if (has_more_argv())\n                    profile->pdp = argv[opt++][0] - '0';\n            break;\n\n            case 'f':\n                if (has_more_argv()) {\n                    profile->logfile = argv[opt++];\n                }\n            break;\n\n            case 'i':\n                if (has_more_argv()) {\n                    strncpy(profile->expect_adapter, argv[opt++], sizeof(profile->expect_adapter) - 1);\n                }\n            break;\n\n            case 'v':\n                debug_qmi = 1;\n            break;\n\n            case 'l':\n            \tif (has_more_argv()) {\n                    profile->replication_factor = atoi(argv[opt++]);\n                \tif (profile->replication_factor > 0) {\n                        \tprofile->loopback_state = 1;\n                     }\n                }\n            break;\n\n            case '4':\n                profile->enable_ipv4 = 1; \n            break;\n\n            case '6':\n                profile->enable_ipv6 = 1;\n            break;\n\n            case 'd':\n                profile->no_dhcp = 1;\n            break;\n\n            case 'u':\n                if (has_more_argv()) {\n                    profile->usblogfile = argv[opt++];\n                }\n            break;\n\n            case 'b':\n                profile->enable_bridge = 1;\n            break;\n\t\t\t\n            case 'k':\n                if (has_more_argv()) {\n                    profile->kill_pdp = argv[opt++][0] - '0';\n                }\n                break;\n\n            case 'M':\n                if (has_more_argv()) {\n                    const char *arg = argv[opt++];\n                    if (atoi(arg) > 0) {\n                        profile->metric = arg;\n                    }\n                    else {\n                        dbg_time(\"unknow metric '%s'\", arg);\n                        return usage(argv[0]);\n                    }\n                }\n                break;\n            \n            case 'D':\n                profile->no_dns = 1;\n            break;\n\n            case 'F':\n                profile->force_apn_set = 1;\n            break;\n\n            default:\n                return usage(argv[0]);\n            break;\n        }\n    }\n\n    if (!profile->metric){\n        profile->metric = \"0\";\n    }\n\n    if (profile->enable_ipv4 != 1 && profile->enable_ipv6 != 1) { // default enable IPv4\n        profile->enable_ipv4 = 1;\n    }\n\n    return 1;\n}\n\nint main(int argc, char *argv[])\n{\n    int ret;\n    PROFILE_T *ctx = &s_profile;\n\n    dbg_time(\"QConnectManager_Linux_V1.6.5\");\n\n    ret = parse_user_input(argc, argv, ctx);\n    if (!ret)\n        return ret;\n\n    if (ctx->kill_pdp) {\n        return kill_data_call_pdp(ctx->kill_pdp, argv[0]);\n    }\n\n    if (ctx->logfile) {\n        logfilefp = fopen(ctx->logfile, \"a+\");\n        if (!logfilefp) {\n            dbg_time(\"Fail to open %s, errno: %d(%s)\", ctx->logfile, errno, strerror(errno));\n        }\n    }\n\n    signal(SIGINT, ql_sigaction);\n    signal(SIGTERM, ql_sigaction);\n    signal(SIGALRM, ql_sigaction);\n\n    do {\n        ret = quectel_CM(ctx);\n        if (g_donot_exit_when_modem_hangup > 0)\n            sleep(3);\n    } while (g_donot_exit_when_modem_hangup > 0);\n\n    if (logfilefp) {\n        fclose(logfilefp);\n    }\n\n    return ret;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/mbim-cm.c",
    "content": "/******************************************************************************\n  @file    mbim-cm.c\n  @brief   MIBIM drivers.\n\n  DESCRIPTION\n  Connectivity Management Tool for USB network adapter of Quectel wireless cellular modules.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n#include <unistd.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <fcntl.h>\n#include <stddef.h>\n#include <pthread.h>\n#include <errno.h>\n#include <time.h>\n#include <signal.h>\n#include <getopt.h>\n#include <poll.h>\n#include <sys/time.h>\n#include <time.h>\n#include <sys/types.h>\n#include <limits.h>\n#include <inttypes.h>\n#include \"QMIThread.h\"\n\n#define mbim_debug dbg_time\n\n#define UUID_BASIC_CONNECT \"a289cc33-bcbb-8b4f-b6b0-133ec2aae6df\"\n//https://docs.microsoft.com/en-us/windows-hardware/drivers/network/mb-5g-data-class-support\n#define UUID_BASIC_CONNECT_EXT \"3d01dcc5-fef5-4d05-0d3a-bef7058e9aaf\"\n#define UUID_SMS             \"533fbeeb-14fe-4467-9f90-33a223e56c3f\"\n#define UUID_USSD             \"e550a0c8-5e82-479e-82f7-10abf4c3351f\"\n#define UUID_PHONEBOOK     \"4bf38476-1e6a-41db-b1d8-bed289c25bdb\"\n#define UUID_STK             \"d8f20131-fcb5-4e17-8602-d6ed3816164c\"\n#define UUID_AUTH             \"1d2b5ff7-0aa1-48b2-aa52-50f15767174e\"\n#define UUID_DSS             \"c08a26dd-7718-4382-8482-6e0d583c4d0e\"\n#define uuid_ext_qmux \"d1a30bc2-f97a-6e43-bf65-c7e24fb0f0d3\"\n#define uuid_mshsd \"883b7c26-985f-43fa-9804-27d7fb80959c\"\n#define uuid_qmbe \"2d0c12c9-0e6a-495a-915c-8d174fe5d63c\"\n#define UUID_MSFWID \"e9f7dea2-feaf-4009-93ce-90a3694103b6\"\n#define uuid_atds \"5967bdcc-7fd2-49a2-9f5c-b2e70e527db3\"\n#define uuid_qdu \"6427015f-579d-48f5-8c54-f43ed1e76f83\"\n#define UUID_MS_UICC_LOW_LEVEL \"c2f6588e-f037-4bc9-8665-f4d44bd09367\"\n#define UUID_MS_SARControl \"68223D04-9F6C-4E0F-822D-28441FB72340\"\n#define UUID_VOICEEXTENSIONS\t\"8d8b9eba-37be-449b-8f1e-61cb034a702e\"\n#define UUID_LIBMBIM_PROXY \"838cf7fb-8d0d-4d7f-871e-d71dbefbb39b\"\n\n#define UUID_MBIMContextTypeInternet \"7E5E2A7E-4E6F-7272-736B-656E7E5E2A7E\"\n\ntypedef unsigned char UINT8;\ntypedef unsigned short UINT16;\ntypedef unsigned int UINT32;\ntypedef unsigned long long UINT64;\n\n#pragma pack(4)\ntypedef enum {\n    MBIM_CID_CMD_TYPE_QUERY = 0,\n    MBIM_CID_CMD_TYPE_SET = 1,\n} MBIM_CID_CMD_TYPE_E;\n\ntypedef enum {\n     MBIM_CID_DEVICE_CAPS = 1, \n     MBIM_CID_SUBSCRIBER_READY_STATUS = 2, \n     MBIM_CID_RADIO_STATE = 3, MBIM_CID_PIN = 4,\n     MBIM_CID_PIN_LIS = 5,\n     MBIM_CID_HOME_PROVIDER = 6,\n     MBIM_CID_PREFERRED_PROVIDERS = 7,\n     MBIM_CID_VISIBLE_PROVIDERS = 8,\n     MBIM_CID_REGISTER_STATE = 9,\n     MBIM_CID_PACKET_SERVICE = 10,\n     MBIM_CID_SIGNAL_STATE = 11,\n     MBIM_CID_CONNECT = 12,\n     MBIM_CID_PROVISIONED_CONTEXTS = 13,\n     MBIM_CID_SERVICE_ACTIVATION = 14,\n     MBIM_CID_IP_CONFIGURATION =       15,\n     MBIM_CID_DEVICE_SERVICES = 16,\n     MBIM_CID_DEVICE_SERVICE_SUBSCRIBE_LIST = 19, \n     MBIM_CID_PACKET_STATISTICS = 20, \n     MBIM_CID_NETWORK_IDLE_HINT = 21,\n     MBIM_CID_EMERGENCY_MODE = 22,\n     MBIM_CID_IP_PACKET_FILTERS = 23, \n     MBIM_CID_MULTICARRIER_PROVIDERS = 24,\n} UUID_BASIC_CONNECT_CID_E;\n\ntypedef enum{\n    MBIM_CID_MS_PROVISIONED_CONTEXT_V2 = 1, \n    MBIM_CID_MS_NETWORK_BLACKLIST = 2,\n    MBIM_CID_MS_LTE_ATTACH_CONFIG = 3, \n    MBIM_CID_MS_LTE_ATTACH_STATUS = 4, \n    MBIM_CID_MS_SYS_CAPS = 5, \n    MBIM_CID_MS_DEVICE_CAPS_V2 = 6, \n    MBIM_CID_MS_DEVICE_SLOT_MAPPING = 7, \n    MBIM_CID_MS_SLOT_INFO_STATUS = 8, \n    MBIM_CID_MS_PCO = 9, \n    MBIM_CID_MS_DEVICE_RESET = 10, \n    MBIM_CID_MS_BASE_STATIONS_INFO = 11, \n    MBIM_CID_MS_LOCATION_INFO_STATUS = 12, \n    MBIM_CID_NOT_DEFINED = 13, \n    MBIM_CID_MS_PIN_EX = 14, \n    MBIM_CID_MS_VERSION = 15,\n} UUID_BASIC_CONNECT_EXT_CID_E;\n\ntypedef enum {\n    MBIM_CID_SMS_CONFIGURATION = 1, // Y Y Y\n    MBIM_CID_SMS_READ = 2, // N Y Y\n    MBIM_CID_SMS_SEND = 3, // Y N N\n    MBIM_CID_SMS_DELETE = 4, // Y N N\n    MBIM_CID_SMS_MESSAGE_STORE_STATUS = 5, // N Y Y\n} UUID_SMS_CID_E;\n\ntypedef enum {\n    MBIM_CID_DSS_CONNECT = 1, // Y N N\n} UUID_DSS_CID_E;\n\ntypedef enum{\n    MBIM_OPEN_MSG = 1, \n    MBIM_CLOSE_MSG = 2, \n    MBIM_COMMAND_MSG = 3, \n    MBIM_HOST_ERROR_MSG = 4,\n    MBIM_OPEN_DONE = 0x80000001, \n    MBIM_CLOSE_DONE = 0x80000002, \n    MBIM_COMMAND_DONE = 0x80000003, \n    MBIM_FUNCTION_ERROR_MSG = 0x80000004,       \n    MBIM_INDICATE_STATUS_MSG = 0x80000007,\n} MBIM_MSG_Type_E;\n \ntypedef enum { /*< since=1.10 >*/\n    MBIM_CID_PROXY_CONTROL_UNKNOWN       = 0,\n    MBIM_CID_PROXY_CONTROL_CONFIGURATION = 1\n} UUID_LIBMBIM_PROXY_CID_E;\n\ntypedef enum {\n    MBIM_CID_MS_UICC_ATR = 1,\n    MBIM_CID_MS_UICC_OPEN_CHANNEL = 2,\n    MBIM_CID_MS_UICC_CLOSE_CHANNEL  = 3,\n    MBIM_CID_MS_UICC_APDU = 4,\n    MBIM_CID_MS_UICC_TERMINAL_CAPABILITY = 5,\n    MBIM_CID_MS_UICC_RESET = 6,\n    MBIM_CID_MS_APP_LIST = 7,\n} UUID_MS_UICC_CID_E;\n\ntypedef enum {\n    MBIM_ERROR_TIMEOUT_FRAGMENT = 1,\n    MBIM_ERROR_FRAGMENT_OUT_OF_SEQUENCE = 2,\n    MBIM_ERROR_LENGTH_MISMATCH = 3,\n    MBIM_ERROR_DUPLICATED_TID = 4,\n    MBIM_ERROR_NOT_OPENED = 5,\n    MBIM_ERROR_UNKNOWN = 6,\n    MBIM_ERROR_CANCEL = 7,\n    MBIM_ERROR_MAX_TRANSFER = 8,\n} MBIM_ERROR_E;\n\ntypedef enum {\n    MBIM_STATUS_SUCCESS = 0,\n    MBIM_STATUS_BUSY =  1,\n    MBIM_STATUS_FAILURE = 2,\n    MBIM_STATUS_SIM_NOT_INSERTED = 3,\n    MBIM_STATUS_BAD_SIM = 4,\n    MBIM_STATUS_PIN_REQUIRED = 5,\n    MBIM_STATUS_PIN_DISABLED = 6,\n    MBIM_STATUS_NOT_REGISTERED = 7,\n    MBIM_STATUS_PROVIDERS_NOT_FOUND = 8,\n    MBIM_STATUS_NO_DEVICE_SUPPORT = 9,\n    MBIM_STATUS_PROVIDER_NOT_VISIBLE = 10,\n    MBIM_STATUS_DATA_CLASS_NOT_AVAILABL = 11,\n    MBIM_STATUS_PACKET_SERVICE_DETACHED = 12,\n}  MBIM_STATUS_CODES_E;\n\ntypedef enum {\n    MBIMPacketServiceActionAttach = 0,\n    MBIMPacketServiceActionDetach = 1,\n} MBIM_PACKET_SERVICE_ACTION_E;\n\ntypedef enum {\n    MBIMPacketServiceStateUnknown = 0,\n    MBIMPacketServiceStateAttaching = 1,\n    MBIMPacketServiceStateAttached = 2,\n    MBIMPacketServiceStateDetaching = 3,\n    MBIMPacketServiceStateDetached = 4,\n} MBIM_PACKET_SERVICE_STATE_E;\n\nstatic const char *MBIMPacketServiceStateStr(int _val) {\n    struct { int val;char *name;} _enumstr[] = {\n        {MBIMPacketServiceStateUnknown, \"Unknown\"},\n        {MBIMPacketServiceStateAttaching, \"Attaching\"},\n        {MBIMPacketServiceStateAttached, \"Attached\"},\n        {MBIMPacketServiceStateDetaching, \"Detaching\"},\n        {MBIMPacketServiceStateDetached, \"Detached\"},\n    };\n    int idx;\n\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\n        if (_val == _enumstr[idx].val)\n            return _enumstr[idx].name;\n    }\n\n    return \"Undefined\";\n};\n\ntypedef enum {\n    MBIMDataClassNone = 0x0,\n    MBIMDataClassGPRS = 0x1,\n    MBIMDataClassEDGE = 0x2,\n    MBIMDataClassUMTS = 0x4,\n    MBIMDataClassHSDPA = 0x8,\n    MBIMDataClassHSUPA = 0x10,\n    MBIMDataClassLTE = 0x20,\n    MBIMDataClass5G_NSA = 0x40,\n    MBIMDataClass5G_SA = 0x80,\n    MBIMDataClass1XRTT = 0x10000,\n    MBIMDataClass1XEVDO = 0x20000,\n    MBIMDataClass1XEVDORevA = 0x40000,\n    MBIMDataClass1XEVDV = 0x80000,\n    MBIMDataClass3XRTT = 0x100000,\n    MBIMDataClass1XEVDORevB = 0x200000,\n    MBIMDataClassUMB = 0x400000,\n    MBIMDataClassCustom = 0x80000000,\n} MBIM_DATA_CLASS_E;\n\nstatic const char *MBIMDataClassStr(int _val) {\n    struct { int val;char *name;} _enumstr[] = {\n        {MBIMDataClassNone, \"None\"},\n        {MBIMDataClassGPRS, \"GPRS\"},\n        {MBIMDataClassEDGE, \"EDGE\"},\n        {MBIMDataClassUMTS, \"UMTS\"},\n        {MBIMDataClassHSDPA, \"HSDPA\"},\n        {MBIMDataClassHSUPA, \"HSUPA\"},\n        {MBIMDataClassLTE, \"LTE\"},\n        {MBIMDataClass5G_NSA, \"5G_NSA\"},\n        {MBIMDataClass5G_SA, \"5G_SA\"},\n        {MBIMDataClass1XRTT, \"1XRTT\"},\n        {MBIMDataClass1XEVDO, \"1XEVDO\"},\n        {MBIMDataClass1XEVDORevA, \"1XEVDORevA\"},\n        {MBIMDataClass1XEVDV, \"1XEVDV\"},\n        {MBIMDataClass3XRTT, \"3XRTT\"},\n        {MBIMDataClass1XEVDORevB, \"1XEVDORevB\"},\n        {MBIMDataClassUMB, \"UMB\"},\n        {MBIMDataClassCustom, \"Custom\"},\n    };\n    int idx;\n\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\n        if (_val == _enumstr[idx].val)\n            return _enumstr[idx].name;\n    }\n\n    return \"Unknow\";\n};\n\ntypedef struct {\n    UINT32 NwError;\n    UINT32 PacketServiceState; //MBIM_PACKET_SERVICE_STATE_E\n    UINT32 HighestAvailableDataClass; //MBIM_DATA_CLASS_E\n    UINT64 UplinkSpeed;\n    UINT64 DownlinkSpeed;\n} MBIM_PACKET_SERVICE_INFO_T;\n\ntypedef struct {\n    UINT32 NwError;\n    UINT32 PacketServiceState; //MBIM_PACKET_SERVICE_STATE_E\n    UINT32 CurrentDataClass; //MBIM_DATA_CLASS_E\n    UINT64 UplinkSpeed;\n    UINT64 DownlinkSpeed;\n    UINT32 FrequencyRange;\n} MBIM_PACKET_SERVICE_INFO_V2_T;\n\ntypedef enum {\n    MBIMSubscriberReadyStateNotInitialized = 0,\n    MBIMSubscriberReadyStateInitialized = 1,\n    MBIMSubscriberReadyStateSimNotInserted = 2,\n    MBIMSubscriberReadyStateBadSim = 3,\n    MBIMSubscriberReadyStateFailure = 4,\n    MBIMSubscriberReadyStateNotActivated = 5,\n    MBIMSubscriberReadyStateDeviceLocked = 6,\n}MBIM_SUBSCRIBER_READY_STATE_E;\n\nstatic const char *MBIMSubscriberReadyStateStr(int _val) {\n    struct { int val;char *name;} _enumstr[] = {\n        {MBIMSubscriberReadyStateNotInitialized, \"NotInitialized\"},\n        {MBIMSubscriberReadyStateInitialized, \"Initialized\"},\n        {MBIMSubscriberReadyStateSimNotInserted, \"NotInserted\"},\n        {MBIMSubscriberReadyStateBadSim, \"BadSim\"},\n        {MBIMSubscriberReadyStateFailure, \"Failure\"},\n        {MBIMSubscriberReadyStateNotActivated, \"NotActivated\"},\n        {MBIMSubscriberReadyStateDeviceLocked, \"DeviceLocked\"},\n    };\n    int idx;\n\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\n        if (_val == _enumstr[idx].val)\n            return _enumstr[idx].name;\n    }\n\n    return \"Undefined\";\n};\n\ntypedef struct {\n    UINT32 DeviceType; //MBIM_DEVICE_TYPE\n    UINT32 CellularClass; //MBIM_CELLULAR_CLASS\n    UINT32 VoiceClass; //MBIM_VOICE_CLASS\n    UINT32 SimClass; //MBIM_SIM_CLASS\n    UINT32 DataClass; //MBIM_DATA_CLASS\n    UINT32 SmsCaps; //MBIM_SMS_CAPS\n    UINT32 ControlCaps; //MBIM_CTRL_CAPS\n    UINT32 MaxSessions;\n    UINT32 CustomDataClassOffset;\n    UINT32 CustomDataClassSize;\n    UINT32 DeviceIdOffset;\n    UINT32 DeviceIdSize;\n    UINT32 FirmwareInfoOffset;\n    UINT32 FirmwareInfoSize;\n    UINT32 HardwareInfoOffset;\n    UINT32 HardwareInfoSize;\n    UINT8 DataBuffer[0]; //DeviceId FirmwareInfo HardwareInfo\n} MBIM_DEVICE_CAPS_INFO_T;\n\ntypedef enum {\n    MBIMRadioOff = 0,\n    MBIMRadioOn = 1,\n} MBIM_RADIO_SWITCH_STATE_E;\n\ntypedef struct {\n    MBIM_RADIO_SWITCH_STATE_E RadioState;\n} MBIM_SET_RADIO_STATE_T;\n\ntypedef struct {\n    MBIM_RADIO_SWITCH_STATE_E HwRadioState;\n    MBIM_RADIO_SWITCH_STATE_E SwRadioState;\n} MBIM_RADIO_STATE_INFO_T;\n\ntypedef enum {\n    MBIMReadyInfoFlagsNone,\n    MBIMReadyInfoFlagsProtectUniqueID,\n}MBIM_UNIQUE_ID_FLAGS;\n\ntypedef struct {\n    UINT32 ReadyState;\n    UINT32 SubscriberIdOffset;\n    UINT32 SubscriberIdSize;\n    UINT32 SimIccIdOffset;\n    UINT32 SimIccIdSize;\n    UINT32 ReadyInfo;\n    UINT32 ElementCount;\n    UINT8 *TelephoneNumbersRefList;\n    UINT8 *DataBuffer;\n} MBIM_SUBSCRIBER_READY_STATUS_T;\n\ntypedef enum {\n    MBIMRegisterActionAutomatic,\n    MBIMRegisterActionManual,\n}MBIM_REGISTER_ACTION_E;\n\ntypedef enum {\n    MBIMRegisterStateUnknown = 0,\n    MBIMRegisterStateDeregistered = 1,\n    MBIMRegisterStateSearching = 2,\n    MBIMRegisterStateHome = 3,\n    MBIMRegisterStateRoaming = 4,\n    MBIMRegisterStatePartner = 5,\n    MBIMRegisterStateDenied = 6,\n}MBIM_REGISTER_STATE_E;\n\ntypedef enum {\n    MBIMRegisterModeUnknown = 0,\n    MBIMRegisterModeAutomatic = 1,\n    MBIMRegisterModeManual = 2,\n}MBIM_REGISTER_MODE_E;\n\nstatic const char *MBIMRegisterStateStr(int _val) {\n    struct { int val;char *name;} _enumstr[] ={\n        {MBIMRegisterStateUnknown, \"Unknown\"},\n        {MBIMRegisterStateDeregistered, \"Deregistered\"},\n        {MBIMRegisterStateSearching, \"Searching\"},\n        {MBIMRegisterStateHome, \"Home\"},\n        {MBIMRegisterStateRoaming, \"Roaming\"},\n        {MBIMRegisterStatePartner, \"Partner\"},\n        {MBIMRegisterStateDenied, \"Denied\"},\n    };\n    int idx;\n\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\n        if (_val == _enumstr[idx].val)\n            return _enumstr[idx].name;\n    }\n\n    return \"Undefined\";\n};\n\nstatic const char *MBIMRegisterModeStr(int _val) {\n    struct { int val;char *name;} _enumstr[] = {\n        {MBIMRegisterModeUnknown, \"Unknown\"},\n        {MBIMRegisterModeAutomatic, \"Automatic\"},\n        {MBIMRegisterModeManual, \"Manual\"},\n    };\n    int idx;\n\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\n        if (_val == _enumstr[idx].val)\n            return _enumstr[idx].name;\n    }\n\n    return \"Undefined\";\n};\n\ntypedef enum {\n    MBIM_REGISTRATION_NONE,\n    MBIM_REGISTRATION_MANUAL_SELECTION_NOT_AVAILABLE,\n    MBIM_REGISTRATION_PACKET_SERVICE_AUTOMATIC_ATTACH,\n}MBIM_REGISTRATION_FLAGS_E;\n\ntypedef struct {\n    UINT32 NwError;\n    UINT32 RegisterState; //MBIM_REGISTER_STATE_E\n    UINT32 RegisterMode;\n    UINT32 AvailableDataClasses;\n    UINT32 CurrentCellularClass;\n    UINT32 ProviderIdOffset;\n    UINT32 ProviderIdSize;\n    UINT32 ProviderNameOffset;\n    UINT32 ProviderNameSize;\n    UINT32 RoamingTextOffset;\n    UINT32 RoamingTextSize;\n    UINT32 RegistrationFlag;\n    UINT8 *DataBuffer;\n} MBIM_REGISTRATION_STATE_INFO_T;\n\ntypedef struct {\n    UINT32 NwError;\n    UINT32 RegisterState; //MBIM_REGISTER_STATE_E\n    UINT32 RegisterMode;\n    UINT32 AvailableDataClasses;\n    UINT32 CurrentCellularClass;\n    UINT32 ProviderIdOffset;\n    UINT32 ProviderIdSize;\n    UINT32 ProviderNameOffset;\n    UINT32 ProviderNameSize;\n    UINT32 RoamingTextOffset;\n    UINT32 RoamingTextSize;\n    UINT32 RegistrationFlag;\n    UINT32 PreferredDataClass;\n    UINT8 *DataBuffer;\n} MBIM_REGISTRATION_STATE_INFO_V2_T;\n\ntypedef struct {\n    UINT32 MessageType; //Specifies the MBIM message type.\n    UINT32 MessageLength; //Specifies the total length of this MBIM message in bytes.\n    /* Specifies the MBIM message id value.  This value is used to match host sent messages with function responses.\n    This value must be unique among all outstanding transactions.\n    For notifications, the TransactionId must be set to 0 by the function */\n    UINT32 TransactionId;\n} MBIM_MESSAGE_HEADER;\n\ntypedef struct {\n    UINT32 TotalFragments; //this field indicates how many fragments there are intotal.\n    UINT32 CurrentFragment; //This field indicates which fragment this message is.  Values are 0 to TotalFragments?\\1\n} MBIM_FRAGMENT_HEADER;\n\ntypedef struct {\n    MBIM_MESSAGE_HEADER MessageHeader;\n    UINT32 MaxControlTransfer;\n} MBIM_OPEN_MSG_T;\n\ntypedef struct {\n    MBIM_MESSAGE_HEADER MessageHeader;\n    UINT32 Status; //MBIM_STATUS_CODES_E\n} MBIM_OPEN_DONE_T;\n\ntypedef struct {\n    MBIM_MESSAGE_HEADER MessageHeader;\n} MBIM_CLOSE_MSG_T;\n\ntypedef struct {\n    MBIM_MESSAGE_HEADER MessageHeader;\n    UINT32 Status;\n} MBIM_CLOSE_DONE_T;\n\ntypedef struct {\n    UINT8 uuid[16];\n} UUID_T;\n\ntypedef struct {\n    MBIM_MESSAGE_HEADER MessageHeader;\n    MBIM_FRAGMENT_HEADER FragmentHeader;\n    UUID_T DeviceServiceId; //A 16 byte UUID that identifies the device service the following CID value applies.\n    UINT32 CID; //Specifies the CID that identifies the parameter being queried for\n    UINT32 CommandType; //0 for a query operation, 1 for a Set operation\n    UINT32 InformationBufferLength; //Size of the Total InformationBuffer, may be larger than current message if fragmented.\n    UINT8 InformationBuffer[0]; //Data supplied to device specific to the CID\n} MBIM_COMMAND_MSG_T;\n\ntypedef struct {\n    MBIM_MESSAGE_HEADER MessageHeader;\n    MBIM_FRAGMENT_HEADER FragmentHeader;\n    UUID_T DeviceServiceId; //A 16 byte UUID that identifies the device service the following CID value applies.\n    UINT32 CID; //Specifies the CID that identifies the parameter being queried for\n    UINT32 Status;\n    UINT32 InformationBufferLength; //Size of the Total InformationBuffer, may be larger than current message if fragmented.\n    UINT8 InformationBuffer[0]; //Data supplied to device specific to the CID\n} MBIM_COMMAND_DONE_T;\n\ntypedef struct {\n    MBIM_MESSAGE_HEADER MessageHeader;\n    UINT32 ErrorStatusCode;\n} MBIM_HOST_ERROR_MSG_T;\n\ntypedef struct {\n    MBIM_MESSAGE_HEADER MessageHeader;\n    UINT32 ErrorStatusCode;\n} MBIM_FUNCTION_ERROR_MSG_T;\n\ntypedef struct {\n    MBIM_MESSAGE_HEADER MessageHeader;\n    MBIM_FRAGMENT_HEADER FragmentHeader;\n    UUID_T DeviceServiceId; //A 16 byte UUID that identifies the device service the following CID value applies.\n    UINT32 CID; //Specifies the CID that identifies the parameter being queried for\n    UINT32 InformationBufferLength; //Size of the Total InformationBuffer, may be larger than current message if fragmented.\n    UINT8 InformationBuffer[0]; //Data supplied to device specific to the CID\n} MBIM_INDICATE_STATUS_MSG_T;\n\ntypedef struct {\n    UINT32 offset;\n    UINT32 size;\n} OL_PAIR_LIST;\n\ntypedef struct {\n    UUID_T DeviceServiceId;\n    UINT32 DssPayload;\n    UINT32 MaxDssInstances;\n    UINT32 CidCount;\n    UINT32 CidList[];\n} MBIM_DEVICE_SERVICE_ELEMENT_T;\n\ntypedef struct {\n    UINT32 DeviceServicesCount;\n    UINT32 MaxDssSessions;\n    OL_PAIR_LIST DeviceServicesRefList[];\n} MBIM_DEVICE_SERVICES_INFO_T;\n\ntypedef enum {\n    MBIMActivationCommandDeactivate = 0,\n    MBIMActivationCommandActivate = 1,\n} MBIM_ACTIVATION_COMMAND_E;\n\ntypedef enum {\n    MBIMCompressionNone =  0,\n    MBIMCompressionEnable =  1,\n} MBIM_COMPRESSION_E;\n\ntypedef enum {\n    MBIMAuthProtocolNone = 0,\n    MBIMAuthProtocolPap = 1,\n    MBIMAuthProtocolChap = 2,\n    MBIMAuthProtocolMsChapV2 = 3,\n} MBIM_AUTH_PROTOCOL_E;\n\ntypedef enum {\n    MBIMContextIPTypeDefault = 0, \n    MBIMContextIPTypeIPv4 = 1, \n    MBIMContextIPTypeIPv6 = 2, \n    MBIMContextIPTypeIPv4v6 = 3, \n    MBIMContextIPTypeIPv4AndIPv6 = 4,\n} MBIM_CONTEXT_IP_TYPE_E;\n\ntypedef enum {\n    MBIMActivationStateUnknown = 0,\n    MBIMActivationStateActivated = 1,\n    MBIMActivationStateActivating = 2,\n    MBIMActivationStateDeactivated = 3,\n    MBIMActivationStateDeactivating = 4,\n} MBIM_ACTIVATION_STATE_E;\n\ntypedef enum {\n    MBIMVoiceCallStateNone = 0,\n    MBIMVoiceCallStateInProgress = 1,\n    MBIMVoiceCallStateHangUp = 2,\n} MBIM_VOICECALL_STATE_E;\n\nstatic const char *MBIMMSGTypeStr(int _val) {\n    struct { int val;char *name;} _enumstr[] = { \n        {MBIM_OPEN_MSG, \"MBIM_OPEN_MSG\"}, \n        {MBIM_CLOSE_MSG, \"MBIM_CLOSE_MSG\"}, \n        {MBIM_COMMAND_MSG, \"MBIM_COMMAND_MSG\"}, \n        {MBIM_HOST_ERROR_MSG, \"MBIM_HOST_ERROR_MSG\"}, \n        {MBIM_OPEN_DONE, \"MBIM_OPEN_DONE\"}, \n        {MBIM_CLOSE_DONE, \"MBIM_CLOSE_DONE\"}, \n        {MBIM_COMMAND_DONE, \"MBIM_COMMAND_DONE\"}, \n        {MBIM_FUNCTION_ERROR_MSG, \"MBIM_FUNCTION_ERROR_MSG\"}, \n        {MBIM_INDICATE_STATUS_MSG, \"MBIM_INDICATE_STATUS_MSG\"}, \n    }; \n    int idx;\n\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) { \n        if (_val == _enumstr[idx].val) \n            return _enumstr[idx].name;\n    } \n\n    return \"MBIMMSGTypeUnknow\"; \n};\n\nstatic const char *MBIMContextIPTypeStr(int _val) { \n    struct { int val;char *name;} _enumstr[] = { \n        {MBIMContextIPTypeDefault, \"MBIMContextIPTypeDefault\"}, \n        {MBIMContextIPTypeIPv4, \"MBIMContextIPTypeIPv4\"}, \n        {MBIMContextIPTypeIPv6, \"MBIMContextIPTypeIPv6\"}, \n        {MBIMContextIPTypeIPv4v6, \"MBIMContextIPTypeIPv4v6\"}, \n        {MBIMContextIPTypeIPv4AndIPv6, \"MBIMContextIPTypeIPv4AndIPv6\"}, \n    }; \n    int idx; \n\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\n        if (_val == _enumstr[idx].val)\n            return _enumstr[idx].name;\n    } \n\n    return \"MBIMContextIPTypeUnknow\"; \n}\n\nstatic const char *MBIMActivationStateStr(int _val) {\n    struct { int val;char *name;} _enumstr[] = {\n        {MBIMActivationStateUnknown, \"Unknown\"},\n        {MBIMActivationStateActivated, \"Activated\"},\n        {MBIMActivationStateActivating, \"Activating\"},\n        {MBIMActivationStateDeactivated, \"Deactivated\"},\n        {MBIMActivationStateDeactivating, \"Deactivating\"},\n    };\n    int idx;\n\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\n        if (_val == _enumstr[idx].val)\n            return _enumstr[idx].name;\n    }\n\n    return \"Undefined\";\n};\n\nstatic const char *MBIMVoiceCallStateStr(int _val) {\n    struct { int val;char *name;} _enumstr[] = {\n        {MBIMVoiceCallStateNone, \"None\"},\n        {MBIMVoiceCallStateInProgress, \"InProgress\"},\n        {MBIMVoiceCallStateHangUp, \"HangUp\"},\n    };\n    int idx;\n\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\n        if (_val == _enumstr[idx].val)\n        return _enumstr[idx].name;\n    }\n\n    return \"Undefined\";\n};\n\ntypedef struct {\n    const char *uuid;\n    UINT32 cid;\n    const char *name;\n} UUID_CID_STR;\n\nstatic const  UUID_CID_STR uuid_cid_string[] = { \n    {UUID_BASIC_CONNECT, MBIM_CID_DEVICE_CAPS, \"MBIM_CID_DEVICE_CAPS\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_SUBSCRIBER_READY_STATUS, \"MBIM_CID_SUBSCRIBER_READY_STATUS\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_RADIO_STATE, \"MBIM_CID_RADIO_STATE\"},\n    {UUID_BASIC_CONNECT, MBIM_CID_PIN, \"MBIM_CID_PIN\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_PIN_LIS, \"MBIM_CID_PIN_LIS\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_HOME_PROVIDER, \"MBIM_CID_HOME_PROVIDER\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_PREFERRED_PROVIDERS, \"MBIM_CID_PREFERRED_PROVIDERS\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_VISIBLE_PROVIDERS, \"MBIM_CID_VISIBLE_PROVIDERS\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_REGISTER_STATE, \"MBIM_CID_REGISTER_STATE\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_PACKET_SERVICE, \"MBIM_CID_PACKET_SERVICE\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_SIGNAL_STATE, \"MBIM_CID_SIGNAL_STATE\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_CONNECT, \"MBIM_CID_CONNECT\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_PROVISIONED_CONTEXTS, \"MBIM_CID_PROVISIONED_CONTEXTS\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_SERVICE_ACTIVATION, \"MBIM_CID_SERVICE_ACTIVATION\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_IP_CONFIGURATION, \"MBIM_CID_IP_CONFIGURATION\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_DEVICE_SERVICES, \"MBIM_CID_DEVICE_SERVICES\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_DEVICE_SERVICE_SUBSCRIBE_LIST, \"MBIM_CID_DEVICE_SERVICE_SUBSCRIBE_LIST\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_PACKET_STATISTICS, \"MBIM_CID_PACKET_STATISTICS\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_NETWORK_IDLE_HINT, \"MBIM_CID_NETWORK_IDLE_HINT\"},\n    {UUID_BASIC_CONNECT, MBIM_CID_EMERGENCY_MODE, \"MBIM_CID_EMERGENCY_MODE\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_IP_PACKET_FILTERS, \"MBIM_CID_IP_PACKET_FILTERS\"}, \n    {UUID_BASIC_CONNECT, MBIM_CID_MULTICARRIER_PROVIDERS, \"MBIM_CID_MULTICARRIER_PROVIDERS\"},\n\n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_PROVISIONED_CONTEXT_V2, \"MBIM_CID_MS_PROVISIONED_CONTEXT_V2\"}, \n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_NETWORK_BLACKLIST, \"MBIM_CID_MS_NETWORK_BLACKLIST\"}, \n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_LTE_ATTACH_CONFIG, \"MBIM_CID_MS_LTE_ATTACH_CONFIG\"}, \n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_LTE_ATTACH_STATUS, \"MBIM_CID_MS_LTE_ATTACH_STATUS\"}, \n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_SYS_CAPS, \"MBIM_CID_MS_SYS_CAPS\"},\n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_DEVICE_CAPS_V2, \"MBIM_CID_MS_DEVICE_CAPS_V2\"}, \n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_DEVICE_SLOT_MAPPING, \"MBIM_CID_MS_DEVICE_SLOT_MAPPING\"}, \n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_SLOT_INFO_STATUS, \"MBIM_CID_MS_SLOT_INFO_STATUS\"}, \n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_PCO, \"MBIM_CID_MS_PCO\"}, \n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_DEVICE_RESET, \"MBIM_CID_MS_DEVICE_RESET\"}, \n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_BASE_STATIONS_INFO, \"MBIM_CID_MS_BASE_STATIONS_INFO\"}, \n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_LOCATION_INFO_STATUS, \"MBIM_CID_MS_LOCATION_INFO_STATUS\"}, \n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_NOT_DEFINED, \"MBIM_CID_NOT_DEFINED\"}, \n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_PIN_EX, \"MBIM_CID_MS_PIN_EX\"}, \n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_VERSION, \"MBIM_CID_MS_VERSION\"}, \n\n    {UUID_MS_UICC_LOW_LEVEL, MBIM_CID_MS_UICC_ATR, \"MBIM_CID_MS_UICC_ATR\"}, \n    {UUID_MS_UICC_LOW_LEVEL, MBIM_CID_MS_UICC_OPEN_CHANNEL, \"MBIM_CID_MS_UICC_OPEN_CHANNEL\"}, \n    {UUID_MS_UICC_LOW_LEVEL, MBIM_CID_MS_UICC_CLOSE_CHANNEL, \"MBIM_CID_MS_UICC_CLOSE_CHANNEL\"}, \n    {UUID_MS_UICC_LOW_LEVEL, MBIM_CID_MS_UICC_APDU, \"MBIM_CID_MS_UICC_APDU\"}, \n    {UUID_MS_UICC_LOW_LEVEL, MBIM_CID_MS_UICC_TERMINAL_CAPABILITY, \"MBIM_CID_MS_UICC_TERMINAL_CAPABILITY\"}, \n    {UUID_MS_UICC_LOW_LEVEL, MBIM_CID_MS_UICC_RESET, \"MBIM_CID_MS_UICC_RESET\"}, \n    {UUID_MS_UICC_LOW_LEVEL, MBIM_CID_MS_APP_LIST, \"MBIM_CID_MS_APP_LIST\"}, \n}; \n\ntypedef struct {\n    UINT32 SessionId;\n    UINT32 ActivationCommand; //MBIM_ACTIVATION_COMMAND_E\n    UINT32 AccessStringOffset;\n    UINT32 AccessStringSize;\n    UINT32 UserNameOffset;\n    UINT32 UserNameSize;\n    UINT32 PasswordOffset;\n    UINT32 PasswordSize;\n    UINT32 Compression; //MBIM_COMPRESSION_E\n    UINT32 AuthProtocol; //MBIM_AUTH_PROTOCOL_E\n    UINT32 IPType; //MBIM_CONTEXT_IP_TYPE_E\n    UUID_T ContextType;\n    UINT8 DataBuffer[0];  /* apn, username, password */\n} MBIM_SET_CONNECT_T;\n\ntypedef struct {\n    UINT32 SessionId;\n    UINT32 ActivationState; //MBIM_ACTIVATION_STATE_E\n    UINT32 VoiceCallState;\n    UINT32 IPType; //MBIM_CONTEXT_IP_TYPE_E\n    UUID_T ContextType;\n    UINT32 NwError;\n} MBIM_CONNECT_T;\n\ntypedef struct {\n    UINT32 OnLinkPrefixLength;\n    UINT8 IPv4Address[4];\n} MBIM_IPV4_ELEMENT_T;\n\ntypedef struct {\n    UINT32 OnLinkPrefixLength;\n    UINT8 IPv6Address[16];\n} MBIM_IPV6_ELEMENT_T;\n\ntypedef struct {\n    UINT32 SessionId;\n    UINT32 IPv4ConfigurationAvailable; //bit0~Address, bit1~gateway, bit2~DNS, bit3~MTU\n    UINT32 IPv6ConfigurationAvailable; //bit0~Address, bit1~gateway, bit2~DNS, bit3~MTU\n    UINT32 IPv4AddressCount;\n    UINT32 IPv4AddressOffset;\n    UINT32 IPv6AddressCount;\n    UINT32 IPv6AddressOffset;\n    UINT32 IPv4GatewayOffset;\n    UINT32 IPv6GatewayOffset;\n    UINT32 IPv4DnsServerCount;\n    UINT32 IPv4DnsServerOffset;\n    UINT32 IPv6DnsServerCount;\n    UINT32 IPv6DnsServerOffset;\n    UINT32 IPv4Mtu;\n    UINT32 IPv6Mtu;\n    UINT8 DataBuffer[];\n} MBIM_IP_CONFIGURATION_INFO_T;\n\ntypedef struct {\n    UINT32 RSRP;\n    UINT32 SNR;\n    UINT32 RSRPThreshold;\n    UINT32 SNRThreshold;\n    UINT32 SystemType;\n} MBIM_RSRP_SNR_INFO_T;\n\ntypedef struct {\n    UINT32 Elementcount;\n    MBIM_RSRP_SNR_INFO_T RsrpSnr[0];\n} MBIM_RSRP_SNR_T;\n\ntypedef struct {\n    UINT32 Rssi;\n    UINT32 ErrorRate;\n    UINT32 SignalStrengthInterval;\n    UINT32 RssiThreshold;\n    UINT32 ErrorRateThreshold;\n} MBIM_SIGNAL_STATE_INFO_T;\n\ntypedef struct {\n    UINT32 Rssi;\n    UINT32 ErrorRate;\n    UINT32 SignalStrengthInterval;\n    UINT32 RssiThreshold;\n    UINT32 ErrorRateThreshold;\n    UINT32 RsrpSnrOffset;\n    UINT32 RsrpSnrSize;\n    UINT8 DataBuffer[];\n} MBIM_SIGNAL_STATE_INFO_V2_T;\n\ntypedef struct {\n    UINT32 SignalStrengthInterval;\n    UINT32 RssiThreshold;\n    UINT32 ErrorRateThreshold;\n} MBIM_SET_SIGNAL_STATE_T;\n\ntypedef struct {\n    UINT32 DevicePathOffset;\n    UINT32 DevicePathSize;\n    UINT32 Timeout;\n    UINT8 DataBuffer[];\n} MBIM_LIBQMI_PROXY_CONFIG_T;\n\ntypedef struct {\n    UINT32 AtrSize;\n    UINT32 AtrOffset;\n    UINT8 DataBuffer[];\n} MBIM_MS_ATR_INFO_T;\n\n#pragma pack()\n\nstatic pthread_t s_tid_reader = 0;\nstatic int mbim_verbose = 0;\nstatic UINT32 TransactionId = 1;\nstatic unsigned mbim_default_timeout  = 30000;\nstatic const char *mbim_apn = NULL;\nstatic const char *mbim_user = NULL;\nstatic const char *mbim_passwd = NULL;\nstatic int mbim_iptype = MBIMContextIPTypeDefault;\nstatic int mbim_auth = MBIMAuthProtocolNone;\nstatic int mbim_sessionID = 0;\nstatic int mbim_fd = -1;\nstatic MBIM_MESSAGE_HEADER *mbim_pRequest;\nstatic MBIM_MESSAGE_HEADER *mbim_pResponse;\n\nstatic unsigned int qmi_over_mbim_support = 0;\nstatic int qmi_over_mbim_sk[2] = {-1, -1};\nstatic pthread_mutex_t mbim_command_mutex = PTHREAD_MUTEX_INITIALIZER;\nstatic pthread_cond_t mbim_command_cond = PTHREAD_COND_INITIALIZER;\nstatic int mbim_ms_version = 1;\nstatic uint8_t qmi_over_mbim_nas = 0;\nstatic uint8_t qmi_over_mbim_dms = 0; // Add DMS client ID\n\nint qmi_over_mbim_qmidev_send(PQCQMIMSG pQMI);\n\nstatic const UUID_T * str2uuid(const char *str) {\n    static UUID_T uuid;\n    UINT32 d[16];\n    char tmp[16*2+4+1];\n    unsigned i = 0;\n\n    while (str[i]) {\n        tmp[i] = tolower(str[i]);\n        i++;\n    }\n    tmp[i] = '\\0';\n\n    sscanf(tmp, \"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\",\n        &d[0], &d[1], &d[2], &d[3], &d[4], &d[5], &d[6], &d[7],\n        &d[8], &d[9], &d[10], &d[11], &d[12], &d[13], &d[14], &d[15]);\n\n    for (i = 0; i < 16; i++) {\n        uuid.uuid[i] = d[i]&0xFF;\n    }\n\n    return &uuid;\n}\n\nstatic void wchar2char(const char *src, size_t src_size, char *dst, size_t dst_len) {\n    size_t i;\n    \n    for (i = 0; i < (dst_len-1) && i < (src_size/2); i++)\n        dst[i] = src[i*2];\n    dst[i] = 0;\n}\n\nstatic size_t char2wchar(const char *src, size_t src_len, uint8_t *dst, size_t dst_len) {\n    size_t i;\n\n    if (src_len > (dst_len/2))\n        src_len = (dst_len/2);\n\n    for (i = 0; i < src_len; i++) {\n        *dst++ = *src++;\n        *dst++ = 0;\n    }\n\n    return i*2;\n}\n\n#define mbim_alloc( _size)  malloc(_size)\n#define mbim_free(_mem) do { if (_mem) { free(_mem); _mem = NULL;}} while(0)\n\nstatic int mbim_open_state = 0;\nstatic MBIM_SUBSCRIBER_READY_STATE_E ReadyState = MBIMSubscriberReadyStateNotInitialized;\nstatic MBIM_REGISTER_STATE_E RegisterState = MBIMRegisterStateUnknown;\nstatic MBIM_PACKET_SERVICE_STATE_E PacketServiceState = MBIMPacketServiceStateUnknown;\nstatic MBIM_ACTIVATION_STATE_E ActivationState = MBIMActivationStateUnknown;\nstatic MBIM_SUBSCRIBER_READY_STATE_E oldReadyState = MBIMSubscriberReadyStateNotInitialized;\nstatic MBIM_REGISTER_STATE_E oldRegisterState = MBIMRegisterStateUnknown;\nstatic MBIM_PACKET_SERVICE_STATE_E oldPacketServiceState = MBIMPacketServiceStateUnknown;\nstatic MBIM_ACTIVATION_STATE_E oldActivationState = MBIMActivationStateUnknown;\nstatic int mbim_update_state(void);\n\nstatic __inline uint32_t mbim2qmi_ipv4addr(uint32_t addr) {\n    return (addr>>24) | (addr>>8&0xff00) | (addr<<8&0xff0000) | (addr<<24);\n}\n\nstatic __inline void mbim2qmi_ipv6addr(const unsigned char *src, unsigned char *dst) {\n    int i;\n\n    for (i = 0; i < 16 ; i++) {\n        dst[i] = src[i];\n    }\n}\n\nstatic MBIM_MESSAGE_HEADER *compose_open_command(UINT32 MaxControlTransfer)\n{\n    MBIM_OPEN_MSG_T *pRequest = (MBIM_OPEN_MSG_T *)mbim_alloc(sizeof(MBIM_OPEN_MSG_T));\n\n    if(!pRequest)\n        return NULL;\n\n    pRequest->MessageHeader.MessageType = htole32(MBIM_OPEN_MSG);\n    pRequest->MessageHeader.MessageLength = htole32(sizeof(MBIM_OPEN_MSG_T));\n    pRequest->MessageHeader.TransactionId = htole32(TransactionId++);\n    pRequest->MaxControlTransfer = htole32(MaxControlTransfer);\n\n    return &pRequest->MessageHeader;\n}\n\nstatic MBIM_MESSAGE_HEADER *compose_close_command(void)\n{\n    MBIM_CLOSE_MSG_T *pRequest = (MBIM_CLOSE_MSG_T *)mbim_alloc(sizeof(MBIM_CLOSE_MSG_T));\n\n    if(!pRequest)\n        return NULL;\n\n    pRequest->MessageHeader.MessageType = htole32(MBIM_CLOSE_MSG);\n    pRequest->MessageHeader.MessageLength = htole32(sizeof(MBIM_CLOSE_MSG_T));\n    pRequest->MessageHeader.TransactionId = htole32(TransactionId++);\n\n    return &pRequest->MessageHeader;\n}\n\nstatic MBIM_MESSAGE_HEADER *compose_basic_connect_command(UINT32 CID, UINT32 CommandType, void *pInformationBuffer, UINT32 InformationBufferLength)\n{\n    MBIM_COMMAND_MSG_T *pRequest = (MBIM_COMMAND_MSG_T *)mbim_alloc(sizeof(MBIM_COMMAND_MSG_T) + InformationBufferLength);\n\n    if (!pRequest)\n        return NULL;\n\n    pRequest->MessageHeader.MessageType = htole32(MBIM_COMMAND_MSG);\n    pRequest->MessageHeader.MessageLength = htole32((sizeof(MBIM_COMMAND_MSG_T) + InformationBufferLength));\n    pRequest->MessageHeader.TransactionId = htole32(TransactionId++);\n\n    pRequest->FragmentHeader.TotalFragments = htole32(1);\n    pRequest->FragmentHeader.CurrentFragment= htole32(0);\n\n    memcpy(pRequest->DeviceServiceId.uuid, str2uuid(UUID_BASIC_CONNECT), 16);\n\n    pRequest->CID = htole32(CID);\n    pRequest->CommandType = htole32(CommandType);\n    if (InformationBufferLength && pInformationBuffer) {\n        pRequest->InformationBufferLength = htole32(InformationBufferLength);\n        memcpy(pRequest->InformationBuffer, pInformationBuffer, InformationBufferLength);\n    } else {\n        pRequest->InformationBufferLength = htole32(0);\n    }\n\n    return &pRequest->MessageHeader;\n}\n\nstatic MBIM_MESSAGE_HEADER *compose_basic_connect_ext_command(UINT32 CID, UINT32 CommandType, void *pInformationBuffer, UINT32 InformationBufferLength)\n{\n    MBIM_COMMAND_MSG_T *pRequest = (MBIM_COMMAND_MSG_T *)compose_basic_connect_command(CID, CommandType, pInformationBuffer, InformationBufferLength);\n\n    if (!pRequest)\n        return NULL;\n\n    memcpy(pRequest->DeviceServiceId.uuid, str2uuid(UUID_BASIC_CONNECT_EXT), 16);\n\n    return &pRequest->MessageHeader;\n}\n\nstatic MBIM_MESSAGE_HEADER *compose_qmi_over_mbim_command(UINT32 CID, UINT32 CommandType, void *pInformationBuffer, UINT32 InformationBufferLength)\n{\n    MBIM_COMMAND_MSG_T *pRequest = (MBIM_COMMAND_MSG_T *)compose_basic_connect_command(CID, CommandType, pInformationBuffer, InformationBufferLength);\n\n    if (!pRequest)\n        return NULL;\n\n    memcpy(pRequest->DeviceServiceId.uuid, str2uuid(uuid_ext_qmux), 16);\n\n    return &pRequest->MessageHeader;\n}\n\nstatic const char * uuid2str(const UUID_T *pUUID) {\n    static char str[16*2+4+1];\n    const UINT8 *d = pUUID->uuid;\n\n    snprintf(str, sizeof(str), \"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\",\n        d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7],\n        d[8], d[9], d[10], d[11], d[12], d[13], d[14], d[15]);\n\n    return str;\n}\n\nstatic const char *DeviceServiceId2str(const UUID_T *pUUID) {\n    const char *str = uuid2str(pUUID);\n\n    struct { char *val;char *name;} _enumstr[] = {\n        {UUID_BASIC_CONNECT, \"UUID_BASIC_CONNECT\"},\n        {UUID_BASIC_CONNECT_EXT, \"UUID_BASIC_CONNECT_EXT\"},\n        {UUID_SMS, \"UUID_SMS\"},\n        {UUID_USSD, \"UUID_USSD\"},\n        {UUID_PHONEBOOK, \"UUID_PHONEBOOK\"},\n        {UUID_STK, \"UUID_STK\"},\n        {UUID_AUTH, \"UUID_AUTH\"},\n        {UUID_DSS, \"UUID_DSS\"},\n        {uuid_ext_qmux, \"uuid_ext_qmux\"},\n        {uuid_mshsd, \"uuid_mshsd\"},\n        {uuid_qmbe, \"uuid_qmbe\"},\n        {UUID_MSFWID, \"UUID_MSFWID\"},\n        {uuid_atds, \"uuid_atds\"},\n        {uuid_qdu, \"uuid_qdu\"},\n        {UUID_MS_UICC_LOW_LEVEL, \"UUID_MS_UICC_LOW_LEVEL\"},\n        {UUID_MS_SARControl, \"UUID_MS_SARControl\"},\n        {UUID_VOICEEXTENSIONS, \"UUID_VOICEEXTENSIONS\"},\n        {UUID_LIBMBIM_PROXY, \"UUID_LIBMBIM_PROXY\"},\n    };\n    int idx;\n\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\n        if (!strcasecmp(str, _enumstr[idx].val))\n            return _enumstr[idx].name;\n    }\n\n    return str;\n}\n\nstatic const char *mbim_get_segment(void *_pMsg, UINT32 offset, UINT32 len)\n{\n    int idx;\n    static char buff[256] = {'\\0'};\n    UINT8 *pMsg = (UINT8*)_pMsg;\n\n    for (idx = 0; idx < (int)(len/2); idx++)\n        buff[idx] = pMsg[offset+idx*2];\n    buff[idx] = '\\0';\n    return buff;\n}\n\nstatic void mbim_dump_header(MBIM_MESSAGE_HEADER *pMsg, const char *direction) {\n    mbim_debug(\"%s Header:\", direction);\n    mbim_debug(\"%s MessageLength = %u\", direction, le32toh(pMsg->MessageLength));\n    mbim_debug(\"%s MessageType =  %s (0x%08x)\", direction, MBIMMSGTypeStr(le32toh(pMsg->MessageType)), le32toh(pMsg->MessageType));\n    mbim_debug(\"%s TransactionId = %u\", direction, le32toh(pMsg->TransactionId));\n    mbim_debug(\"%s Contents:\", direction);\n}\n\nstatic void mbim_dump_uuid_cid(const UUID_T *pUUID, UINT32 CID, const char *direction) {\n    size_t idx;\n    const char *uuidStr = uuid2str(pUUID);\n    const char *cidStr = \"unknow\";\n\n    for (idx = 0; idx < (sizeof(uuid_cid_string)/sizeof(uuid_cid_string[0])); idx++) {\n        if (!strcmp(uuidStr, uuid_cid_string[idx].uuid) && uuid_cid_string[idx].cid == CID) {\n            cidStr = uuid_cid_string[idx].name;\n        }\n    }\n\n    mbim_debug(\"%s DeviceServiceId = %s (%s)\", direction, DeviceServiceId2str(pUUID), uuidStr);\n    mbim_debug(\"%s CID = %s (%u)\", direction, cidStr, le32toh(CID));\n}\n\n\nstatic void mbim_dump_command_msg(MBIM_COMMAND_MSG_T *pCmdMsg, const char *direction) {\n    mbim_dump_uuid_cid(&pCmdMsg->DeviceServiceId, le32toh(pCmdMsg->CID), direction);\n    mbim_debug(\"%s CommandType = %s (%u)\", direction, le32toh(pCmdMsg->CommandType) ? \"set\" : \"query\", le32toh(pCmdMsg->CommandType));\n    mbim_debug(\"%s InformationBufferLength = %u\", direction, le32toh(pCmdMsg->InformationBufferLength));\n}\n\nstatic void mbim_dump_command_done(MBIM_COMMAND_DONE_T *pCmdDone, const char *direction) {\n    mbim_dump_uuid_cid(&pCmdDone->DeviceServiceId, le32toh(pCmdDone->CID), direction);\n    mbim_debug(\"%s Status = %u\", direction, le32toh(pCmdDone->Status));\n    mbim_debug(\"%s InformationBufferLength = %u\", direction, le32toh(pCmdDone->InformationBufferLength));\n}\n\nstatic void mbim_dump_indicate_msg(MBIM_INDICATE_STATUS_MSG_T *pIndMsg, const char *direction) {\n    mbim_dump_uuid_cid(&pIndMsg->DeviceServiceId, le32toh(pIndMsg->CID), direction);\n    mbim_debug(\"%s InformationBufferLength = %u\", direction, le32toh(pIndMsg->InformationBufferLength));\n}\n\nstatic void mbim_dump_connect(MBIM_CONNECT_T *pInfo, const char *direction) {\n    mbim_debug(\"%s SessionId = %u\", direction, le32toh(pInfo->SessionId));\n    mbim_debug(\"%s ActivationState = %s (%u)\", direction, MBIMActivationStateStr(le32toh(pInfo->ActivationState)), le32toh(pInfo->ActivationState));\n    mbim_debug(\"%s IPType = %s\", direction, MBIMContextIPTypeStr(le32toh(pInfo->IPType)));\n    mbim_debug(\"%s VoiceCallState = %s\", direction, MBIMVoiceCallStateStr(le32toh(pInfo->VoiceCallState)));\n    mbim_debug(\"%s ContextType = %s\", direction, uuid2str(&pInfo->ContextType));\n    mbim_debug(\"%s NwError = %u\", direction, le32toh(pInfo->NwError));\n}\n\nstatic void mbim_dump_signal_state(MBIM_SIGNAL_STATE_INFO_T *pInfo, const char *direction)\n{\n    mbim_debug(\"%s Rssi = %u\", direction, le32toh(pInfo->Rssi));\n    mbim_debug(\"%s ErrorRate = %u\", direction, le32toh(pInfo->ErrorRate));\n    mbim_debug(\"%s SignalStrengthInterval = %u\", direction, le32toh(pInfo->SignalStrengthInterval));\n    mbim_debug(\"%s RssiThreshold = %u\", direction, le32toh(pInfo->RssiThreshold));\n    mbim_debug(\"%s ErrorRateThreshold = %u\", direction, le32toh(pInfo->ErrorRateThreshold));\n}\n\nstatic void mbim_dump_packet_service(MBIM_PACKET_SERVICE_INFO_T *pInfo, const char *direction)\n{\n    mbim_debug(\"%s NwError = %u\", direction, le32toh(pInfo->NwError));\n    mbim_debug(\"%s PacketServiceState = %s\", direction, MBIMPacketServiceStateStr(le32toh(pInfo->PacketServiceState)));\n    mbim_debug(\"%s HighestAvailableDataClass = %s\", direction, MBIMDataClassStr(le32toh(pInfo->HighestAvailableDataClass)));\n    mbim_debug(\"%s UplinkSpeed = %ld\", direction, (long)le64toh(pInfo->UplinkSpeed));\n    mbim_debug(\"%s DownlinkSpeed = %ld\", direction, (long)le64toh(pInfo->DownlinkSpeed));\n}\n\nstatic void mbim_dump_subscriber_status(MBIM_SUBSCRIBER_READY_STATUS_T *pInfo, const char *direction)\n{\n    mbim_debug(\"%s ReadyState = %s\", direction, MBIMSubscriberReadyStateStr(le32toh(pInfo->ReadyState)));\n    mbim_debug(\"%s SIMICCID = %s\", direction, mbim_get_segment(pInfo, le32toh(pInfo->SimIccIdOffset), le32toh(pInfo->SimIccIdSize)));\n    mbim_debug(\"%s SubscriberID = %s\", direction, mbim_get_segment(pInfo, le32toh(pInfo->SubscriberIdOffset), le32toh(pInfo->SubscriberIdSize)));\n    /* maybe more than one number */\n    uint32_t idx;\n    for (idx = 0; idx < le32toh(pInfo->ElementCount); idx++) {\n        UINT32 offset = ((UINT32*)((UINT8*)pInfo+offsetof(MBIM_SUBSCRIBER_READY_STATUS_T, TelephoneNumbersRefList)))[0];\n        UINT32 length = ((UINT32*)((UINT8*)pInfo+offsetof(MBIM_SUBSCRIBER_READY_STATUS_T, TelephoneNumbersRefList)))[1];\n        mbim_debug(\"%s Number = %s\", direction, mbim_get_segment(pInfo, le32toh(offset), le32toh(length)));\n    }\n}\n\nstatic void mbim_dump_regiester_status(MBIM_REGISTRATION_STATE_INFO_T *pInfo, const char *direction)\n{\n    mbim_debug(\"%s NwError = %u\", direction, le32toh(pInfo->NwError));\n    mbim_debug(\"%s RegisterState = %s\", direction, MBIMRegisterStateStr(le32toh(pInfo->RegisterState)));\n    mbim_debug(\"%s RegisterMode = %s\", direction, MBIMRegisterModeStr(le32toh(pInfo->RegisterMode)));\n}\n\nstatic void mbim_dump_ipconfig(MBIM_IP_CONFIGURATION_INFO_T *pInfo, const char *direction)\n{\n    UINT8 prefix = 0, *ipv4=NULL, *ipv6=NULL, *gw=NULL, *dns1=NULL, *dns2=NULL;\n\n    mbim_debug(\"%s SessionId = %u\", direction, le32toh(pInfo->SessionId));\n    mbim_debug(\"%s IPv4ConfigurationAvailable = 0x%x\", direction, le32toh(pInfo->IPv4ConfigurationAvailable));\n    mbim_debug(\"%s IPv6ConfigurationAvailable = 0x%x\", direction, le32toh(pInfo->IPv6ConfigurationAvailable));\n    mbim_debug(\"%s IPv4AddressCount = 0x%x\", direction, le32toh(pInfo->IPv4AddressCount));\n    mbim_debug(\"%s IPv4AddressOffset = 0x%x\", direction, le32toh(pInfo->IPv4AddressOffset));\n    mbim_debug(\"%s IPv6AddressCount = 0x%x\", direction, le32toh(pInfo->IPv6AddressCount));\n    mbim_debug(\"%s IPv6AddressOffset = 0x%x\", direction, le32toh(pInfo->IPv6AddressOffset));\n\n    /* IPv4 */\n    if (le32toh(pInfo->IPv4ConfigurationAvailable)&0x1) {\n        MBIM_IPV4_ELEMENT_T *pAddress = (MBIM_IPV4_ELEMENT_T *)(&pInfo->DataBuffer[le32toh(pInfo->IPv4AddressOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\n        prefix = le32toh(pAddress->OnLinkPrefixLength);\n        ipv4 = pAddress->IPv4Address;\n        mbim_debug(\"%s IPv4 = %u.%u.%u.%u/%u\", direction, ipv4[0], ipv4[1], ipv4[2], ipv4[3], prefix);\n    }\n    if (le32toh(pInfo->IPv4ConfigurationAvailable)&0x2) {\n        gw = (UINT8 *)(&pInfo->DataBuffer[le32toh(pInfo->IPv4GatewayOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\n        mbim_debug(\"%s gw = %u.%u.%u.%u\", direction, gw[0], gw[1], gw[2], gw[3]);\n    }\n    if (le32toh(pInfo->IPv4ConfigurationAvailable)&0x3) {\n        dns1 = (UINT8 *)(&pInfo->DataBuffer[le32toh(pInfo->IPv4DnsServerOffset) -sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\n        mbim_debug(\"%s dns1 = %u.%u.%u.%u\", direction, dns1[0], dns1[1], dns1[2], dns1[3]);\n        if (le32toh(pInfo->IPv4DnsServerCount) == 2) {\n            dns2 = dns1 + 4;\n            mbim_debug(\"%s dns2 = %u.%u.%u.%u\", direction, dns2[0], dns2[1], dns2[2], dns2[3]);\n        }\n    }\n    if (le32toh(pInfo->IPv4Mtu)) mbim_debug(\"%s ipv4 mtu = %u\", direction, le32toh(pInfo->IPv4Mtu));\n\n    /* IPv6 */\n    if (le32toh(pInfo->IPv6ConfigurationAvailable)&0x1) {\n        MBIM_IPV6_ELEMENT_T *pAddress = (MBIM_IPV6_ELEMENT_T *)(&pInfo->DataBuffer[le32toh(pInfo->IPv6AddressOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\n        prefix = le32toh(pAddress->OnLinkPrefixLength);\n        ipv6 = pAddress->IPv6Address;\n        mbim_debug(\"%s IPv6 = %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x/%d\", \\\n            direction, ipv6[0], ipv6[1], ipv6[2], ipv6[3], ipv6[4], ipv6[5], ipv6[6], ipv6[7], \\\n            ipv6[8], ipv6[9], ipv6[10], ipv6[11], ipv6[12], ipv6[13], ipv6[14], ipv6[15], prefix);\n    }\n    if (le32toh(pInfo->IPv6ConfigurationAvailable)&0x2) {\n        gw = (UINT8 *)(&pInfo->DataBuffer[le32toh(pInfo->IPv6GatewayOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\n        mbim_debug(\"%s gw = %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\", \\\n            direction, gw[0], gw[1], gw[2], gw[3], gw[4], gw[5], gw[6], gw[7], \\\n            gw[8], gw[9], gw[10], gw[11], gw[12], gw[13], gw[14], gw[15]);\n    }\n    if (le32toh(pInfo->IPv6ConfigurationAvailable)&0x3) {\n        dns1 = (UINT8 *)(&pInfo->DataBuffer[le32toh(pInfo->IPv6DnsServerOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\n        mbim_debug(\"%s dns1 = %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\", \\\n            direction, dns1[0], dns1[1], dns1[2], dns1[3], dns1[4], dns1[5], dns1[6], dns1[7], \\\n            dns1[8], dns1[9], dns1[10], dns1[11], dns1[12], dns1[13], dns1[14], dns1[15]);\n        if (le32toh(pInfo->IPv6DnsServerCount) == 2) {\n            dns2 = dns1 + 16;\n            mbim_debug(\"%s dns2 = %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\", \\\n                direction, dns2[0], dns2[1], dns2[2], dns2[3], dns1[4], dns1[5], dns1[6], dns1[7],\n                dns2[8], dns2[9], dns2[10], dns2[11], dns2[12], dns2[13], dns2[14], dns2[15]);\n        }\n    }\n    if (le32toh(pInfo->IPv6Mtu)) mbim_debug(\"%s ipv6 mtu = %u\", direction, le32toh(pInfo->IPv6Mtu));\n}\n\nstatic void mbim_dump(MBIM_MESSAGE_HEADER *pMsg, int mbim_verbose) {\n    unsigned char *data = (unsigned char *)pMsg;\n    const char *direction = (le32toh(pMsg->MessageType) & 0x80000000) ? \"<\" : \">\";\n\n    if (!mbim_verbose)\n        return;\n\n    if (mbim_verbose) {\n        unsigned i;\n        static char *_tmp = NULL;\n\n        if (!_tmp)\n            _tmp = (char *)malloc(4096);\n\n        if (_tmp) {\n            _tmp[0] = (le32toh(pMsg->MessageType) & 0x80000000) ? '<' : '>';\n            _tmp[1] = '\\0';\n            for (i = 0; i < le32toh(pMsg->MessageLength) && i < 4096; i++)\n                snprintf(_tmp + strlen(_tmp), 4096 - strlen(_tmp), \"%02X:\", data[i]);\n            mbim_debug(\"%s\", _tmp);\n        }\n    }\n\n    mbim_dump_header(pMsg, direction);\n\n    switch (le32toh(pMsg->MessageType)) {\n    case MBIM_OPEN_MSG: {\n        MBIM_OPEN_MSG_T *pOpenMsg = (MBIM_OPEN_MSG_T *)pMsg;\n        mbim_debug(\"%s MaxControlTransfer = %u\", direction, le32toh(pOpenMsg->MaxControlTransfer));\n    }\n    break;\n    case MBIM_OPEN_DONE: {\n        MBIM_OPEN_DONE_T *pOpenDone = (MBIM_OPEN_DONE_T *)pMsg;\n        mbim_debug(\"%s Status = %u\", direction, le32toh(pOpenDone->Status));\n    }\n    break;\n    case MBIM_CLOSE_MSG: {\n\n    }\n    break;\n    case MBIM_CLOSE_DONE: {\n        MBIM_CLOSE_DONE_T *pCloseDone = (MBIM_CLOSE_DONE_T *)pMsg;\n        mbim_debug(\"%s Status = %u\", direction, le32toh(pCloseDone->Status));\n    }\n    break;\n    case MBIM_COMMAND_MSG: {\n        MBIM_COMMAND_MSG_T *pCmdMsg = (MBIM_COMMAND_MSG_T *)pMsg;\n\n        mbim_dump_command_msg(pCmdMsg, direction);\n        if (!memcmp(pCmdMsg->DeviceServiceId.uuid, str2uuid(UUID_BASIC_CONNECT), 16)) {\n            switch (le32toh(pCmdMsg->CID)) {\n               case  MBIM_CID_CONNECT: {\n                    MBIM_SET_CONNECT_T *pInfo = (MBIM_SET_CONNECT_T *)pCmdMsg->InformationBuffer;\n                    mbim_debug(\"%s SessionId = %u\", direction, le32toh(pInfo->SessionId));\n                }\n                break;\n                case MBIM_CID_IP_CONFIGURATION: {\n                    MBIM_IP_CONFIGURATION_INFO_T *pInfo = (MBIM_IP_CONFIGURATION_INFO_T *)pCmdMsg->InformationBuffer;\n                    mbim_debug(\"%s SessionId = %u\", direction, le32toh(pInfo->SessionId));\n                }\n                break;\n                default:\n                break;\n            }\n        }\n    }\n    break;\n    case MBIM_COMMAND_DONE: {\n        MBIM_COMMAND_DONE_T *pCmdDone = (MBIM_COMMAND_DONE_T *)pMsg;\n\n        mbim_dump_command_done(pCmdDone, direction);\n        if (le32toh(pCmdDone->InformationBufferLength) == 0)\n            return;\n\n        if (!memcmp(pCmdDone->DeviceServiceId.uuid, str2uuid(UUID_BASIC_CONNECT), 16)) {\n            switch (le32toh(pCmdDone->CID)) {\n                case MBIM_CID_CONNECT: {\n                MBIM_CONNECT_T *pInfo = (MBIM_CONNECT_T *)pCmdDone->InformationBuffer;\n                mbim_dump_connect(pInfo, direction);\n                }\n                break;\n                case MBIM_CID_IP_CONFIGURATION: {\n                    //MBIM_IP_CONFIGURATION_INFO_T *pInfo = (MBIM_IP_CONFIGURATION_INFO_T *)pCmdDone->InformationBuffer;\n                    //mbim_dump_ipconfig(pInfo, direction);\n                }\n                break;\n                case MBIM_CID_PACKET_SERVICE: {\n                    MBIM_PACKET_SERVICE_INFO_T *pInfo = (MBIM_PACKET_SERVICE_INFO_T *)pCmdDone->InformationBuffer;\n                    mbim_dump_packet_service(pInfo, direction);\n                }\n                break;\n                case MBIM_CID_SUBSCRIBER_READY_STATUS: {\n                    MBIM_SUBSCRIBER_READY_STATUS_T *pInfo = (MBIM_SUBSCRIBER_READY_STATUS_T *)pCmdDone->InformationBuffer;\n                    mbim_dump_subscriber_status(pInfo, direction);\n                }\n                break;\n                case MBIM_CID_REGISTER_STATE: {\n                    MBIM_REGISTRATION_STATE_INFO_T *pInfo = (MBIM_REGISTRATION_STATE_INFO_T *)pCmdDone->InformationBuffer;\n                    mbim_dump_regiester_status(pInfo, direction);\n                }\n                break;\n                default:\n                break;\n            }\n        }\n    }\n    break;\n    case MBIM_INDICATE_STATUS_MSG: {\n        MBIM_INDICATE_STATUS_MSG_T *pIndMsg = (MBIM_INDICATE_STATUS_MSG_T *)pMsg;\n\n        mbim_dump_indicate_msg(pIndMsg, direction);\n        if (le32toh(pIndMsg->InformationBufferLength) == 0)\n            return;\n\n        if (!memcmp(pIndMsg->DeviceServiceId.uuid, str2uuid(UUID_BASIC_CONNECT), 16)) {\n            switch (le32toh(pIndMsg->CID)) {\n                case MBIM_CID_CONNECT: {\n                    MBIM_CONNECT_T *pInfo = (MBIM_CONNECT_T *)pIndMsg->InformationBuffer;\n                    mbim_dump_connect(pInfo, direction);\n                }\n                break;\n                case MBIM_CID_SIGNAL_STATE: {\n                    MBIM_SIGNAL_STATE_INFO_T *pInfo = (MBIM_SIGNAL_STATE_INFO_T *)pIndMsg->InformationBuffer;\n                    mbim_dump_signal_state(pInfo, direction);\n                }\n                break;\n                case MBIM_CID_SUBSCRIBER_READY_STATUS: {\n                    MBIM_SUBSCRIBER_READY_STATUS_T *pInfo = (MBIM_SUBSCRIBER_READY_STATUS_T *)pIndMsg->InformationBuffer;\n                    mbim_dump_subscriber_status(pInfo, direction);\n                }\n                break;\n                case MBIM_CID_REGISTER_STATE: {\n                    MBIM_REGISTRATION_STATE_INFO_T *pInfo = (MBIM_REGISTRATION_STATE_INFO_T *)pIndMsg->InformationBuffer;\n                    mbim_dump_regiester_status(pInfo, direction);\n                }\n                break;\n                case MBIM_CID_PACKET_SERVICE: {\n                    MBIM_PACKET_SERVICE_INFO_T *pInfo = (MBIM_PACKET_SERVICE_INFO_T *)pIndMsg->InformationBuffer;\n                    mbim_dump_packet_service(pInfo, direction);\n                }\n                break;\n                default:\n                break;\n            }\n        }\n        else if (!memcmp(pIndMsg->DeviceServiceId.uuid, str2uuid(UUID_BASIC_CONNECT_EXT), 16)) {\n        }\n    }\n    break;\n    case MBIM_FUNCTION_ERROR_MSG: {\n        MBIM_FUNCTION_ERROR_MSG_T *pErrMsg = (MBIM_FUNCTION_ERROR_MSG_T*)pMsg;\n        mbim_debug(\"%s ErrorStatusCode = %u\", direction, le32toh(pErrMsg->ErrorStatusCode));\n    }\n    break;\n    default:\n    break;\n    }\n}\n\nstatic void mbim_recv_command(MBIM_MESSAGE_HEADER *pResponse, unsigned size)\n{\n    (void)size;\n    pthread_mutex_lock(&mbim_command_mutex);\n\n    if (pResponse)\n        mbim_dump(pResponse, mbim_verbose);\n\n    if (pResponse == NULL) {\n        pthread_cond_signal(&mbim_command_cond);\n    }\n    else if (mbim_pRequest && le32toh(mbim_pRequest->TransactionId) == le32toh(pResponse->TransactionId)) {\n        mbim_pResponse = mbim_alloc(le32toh(pResponse->MessageLength));\n        if (mbim_pResponse)\n            memcpy(mbim_pResponse, pResponse, le32toh(pResponse->MessageLength));\n        pthread_cond_signal(&mbim_command_cond);\n    }\n    else if (le32toh(pResponse->MessageType) ==  MBIM_INDICATE_STATUS_MSG) {\n        MBIM_INDICATE_STATUS_MSG_T *pIndMsg = (MBIM_INDICATE_STATUS_MSG_T *)pResponse;\n\n        if (!memcmp(pIndMsg->DeviceServiceId.uuid, str2uuid(UUID_BASIC_CONNECT), 16))\n        {\n            switch (le32toh(pIndMsg->CID)) {\n                case MBIM_CID_SUBSCRIBER_READY_STATUS: {\n                    MBIM_SUBSCRIBER_READY_STATUS_T *pInfo = (MBIM_SUBSCRIBER_READY_STATUS_T *)pIndMsg->InformationBuffer;\n                    if (oldReadyState != le32toh(pInfo->ReadyState))\n                        qmidevice_send_event_to_main(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED);\n                }\n                break;\n                case MBIM_CID_REGISTER_STATE: {\n                    MBIM_REGISTRATION_STATE_INFO_T *pInfo = (MBIM_REGISTRATION_STATE_INFO_T *)pIndMsg->InformationBuffer;\n                    if (oldRegisterState != le32toh(pInfo->RegisterState))\n                        qmidevice_send_event_to_main(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED);\n                }\n                break;\n                case MBIM_CID_PACKET_SERVICE: {\n                    MBIM_PACKET_SERVICE_INFO_T *pInfo = (MBIM_PACKET_SERVICE_INFO_T *)pIndMsg->InformationBuffer;\n                    MBIM_PACKET_SERVICE_STATE_E state = le32toh(pInfo->PacketServiceState);\n\n                    if (oldPacketServiceState != state\n                            && (1 || MBIMPacketServiceStateAttached == state || MBIMPacketServiceStateDetached == state))\n                        qmidevice_send_event_to_main(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED);\n                }\n                break;\n                case MBIM_CID_CONNECT: {\n                    MBIM_CONNECT_T *pInfo = (MBIM_CONNECT_T *)pIndMsg->InformationBuffer;\n                    if (pInfo->SessionId == (uint32_t)mbim_sessionID) {\n                        MBIM_ACTIVATION_STATE_E state = le32toh(pInfo->ActivationState);\n\n                        if (oldActivationState != state\n                            && (1 || MBIMActivationStateActivated == state || MBIMActivationStateDeactivated == state))\n                            qmidevice_send_event_to_main(RIL_UNSOL_DATA_CALL_LIST_CHANGED);\n                    }\n                }\n                break;\n                default:\n                break;\n            }\n        }\n    }\n\n    pthread_mutex_unlock(&mbim_command_mutex);\n}\n\nstatic int mbim_send_command(MBIM_MESSAGE_HEADER *pRequest, MBIM_COMMAND_DONE_T **ppCmdDone, unsigned msecs) {\n    int ret;\n\n    if (ppCmdDone)\n         *ppCmdDone = NULL;\n\n    if (mbim_fd <= 0)\n        return -ENODEV;\n\n   if (s_tid_reader == 0)\n      return -EINVAL;\n\n    if (!pRequest)\n        return -ENOMEM;\n\n    pthread_mutex_lock(&mbim_command_mutex);\n\n    if (pRequest) {\n        if (pRequest->TransactionId == (0xFFFFFF + 1)) { //quectel-mbim-proxy need 0xFF000000 to indicat client\n            TransactionId = 1;\n            pRequest->TransactionId = htole32(TransactionId++);\n        }\n        mbim_dump(pRequest, mbim_verbose);\n    }\n\n    mbim_pRequest = pRequest;\n    mbim_pResponse = NULL;\n\n    ret = write(mbim_fd, pRequest, le32toh(pRequest->MessageLength));\n\n    if (ret > 0 && (uint32_t)ret == le32toh(pRequest->MessageLength)) {\n        ret = pthread_cond_timeout_np(&mbim_command_cond, &mbim_command_mutex, msecs);\n        if (!ret) {\n            if (mbim_pResponse && ppCmdDone) {\n                *ppCmdDone = (MBIM_COMMAND_DONE_T *)mbim_pResponse;\n            }\n        }\n    } else {\n        mbim_debug(\"%s pthread_cond_timeout_np=%d\", __func__, ret);\n    }\n\n    mbim_pRequest = mbim_pResponse = NULL;\n\n    pthread_mutex_unlock(&mbim_command_mutex);\n\n    return ret;\n}\n\nstatic ssize_t mbim_proxy_read (int fd, MBIM_MESSAGE_HEADER *pResponse, size_t size) {\n    ssize_t nreads;\n\n    nreads = read(fd, pResponse, sizeof(MBIM_MESSAGE_HEADER));\n    if (nreads == sizeof(MBIM_MESSAGE_HEADER) && le32toh(pResponse->MessageLength) <= size) {\n        nreads += read(fd, pResponse+1, le32toh(pResponse->MessageLength) - sizeof(MBIM_MESSAGE_HEADER));\n    }\n\n    return nreads;\n}\n\nstatic void * mbim_read_thread(void *param) {\n    PROFILE_T *profile = (PROFILE_T *)param;\n    const char *cdc_wdm = (const char *)profile->qmichannel;\n    int wait_for_request_quit = 0;\n\n    mbim_verbose = debug_qmi;\n    s_tid_reader = pthread_self();\n\n    if (profile->qmap_mode > 1 && profile->qmapnet_adapter[0]) {\n        if (!profile->proxy[0])\n             sprintf(profile->proxy, \"%s\", QUECTEL_MBIM_PROXY);\n        mbim_sessionID = profile->pdp;\n    }\n\n    if (profile->proxy[0]) {\n        mbim_fd = cm_open_proxy(profile->proxy);\n    } \n    else {\n        mbim_fd = cm_open_dev(cdc_wdm);\n    }\n\n    if (mbim_fd <= 0) {\n        mbim_debug(\"fail to open (%s), errno: %d (%s)\", cdc_wdm, errno, strerror(errno));\n        goto __quit;\n    }\n\n    dbg_time(\"cdc_wdm_fd = %d\", mbim_fd);\n\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_CONNECTED);\n\n    while (mbim_fd > 0) {\n        struct pollfd pollfds[] = {{mbim_fd, POLLIN, 0}, {qmidevice_control_fd[1], POLLIN, 0}, {qmi_over_mbim_sk[1], POLLIN, 0}};\n        int ne, ret, nevents = 2;\n\n        if (pollfds[nevents].fd != -1)\n            nevents++;\n\n        ret = poll(pollfds, nevents, wait_for_request_quit ? 1000 : -1);\n\n        if (ret == 0 && wait_for_request_quit) {\n            break;\n        }\n\n        if (ret < 0) {\n            mbim_debug(\"%s poll=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\n            break;\n        }\n\n        for (ne = 0; ne < nevents; ne++) {\n            int fd = pollfds[ne].fd;\n            short revents = pollfds[ne].revents;\n\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\n                mbim_debug(\"%s poll err/hup/inval\", __func__);\n                mbim_debug(\"epoll fd = %d, events = 0x%04x\", fd, revents);\n                if (revents & (POLLERR | POLLHUP | POLLNVAL))\n                goto __quit;\n            }\n\n            if ((revents & POLLIN) == 0)\n                continue;\n\n            if (mbim_fd == fd) {\n                ssize_t nreads;\n                MBIM_MESSAGE_HEADER *pResponse = (MBIM_MESSAGE_HEADER *) cm_recv_buf;\n\n                if (profile->proxy[0])\n                    nreads = mbim_proxy_read(fd, pResponse, sizeof(cm_recv_buf));\n                else\n                    nreads = read(fd, pResponse, sizeof(cm_recv_buf));\n\n                if (nreads <= 0) {\n                    mbim_debug(\"%s read=%d errno: %d (%s)\",  __func__, (int)nreads, errno, strerror(errno));\n                    break;\n                }\n\n                mbim_recv_command(pResponse, nreads);\n            }\n            else if (fd == qmidevice_control_fd[1]) {\n                int triger_event;\n                if (read(fd, &triger_event, sizeof(triger_event)) == sizeof(triger_event)) {\n                    //mbim_debug(\"triger_event = 0x%x\", triger_event);\n                    switch (triger_event) {\n                        case RIL_REQUEST_QUIT:\n                            goto __quit;\n                        break;\n                        case SIG_EVENT_STOP:\n                            wait_for_request_quit = 1;\n                        break;\n                        default:\n                        break;\n                    }\n                }\n            }\n            else if (fd == qmi_over_mbim_sk[1]) {\n                    ssize_t nreads = read(fd, cm_recv_buf, sizeof(cm_recv_buf));\n                    if (nreads > 0)\n                        QmiThreadRecvQMI((PQCQMIMSG)cm_recv_buf);\n            }\n        }\n    }\n\n__quit:\n    if (mbim_fd != -1) { close(mbim_fd); mbim_fd = -1; }\n    mbim_recv_command(NULL, 0);\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_DISCONNECTED);\n    mbim_debug(\"%s exit\", __func__);\n    s_tid_reader = 0;\n\n    return NULL;\n}\n\nstatic int mbim_status_code(MBIM_MESSAGE_HEADER *pMsgHdr) {\n    int status = 0;\n\n    if (!pMsgHdr)\n        return 0;\n\n    switch (le32toh(pMsgHdr->MessageType)) {\n        case MBIM_OPEN_DONE: {\n            MBIM_OPEN_DONE_T *pOpenDone = (MBIM_OPEN_DONE_T *)pMsgHdr;\n            status = le32toh(pOpenDone->Status);\n        }\n        break;\n        case MBIM_CLOSE_DONE: {\n            MBIM_CLOSE_DONE_T *pCloseDone = (MBIM_CLOSE_DONE_T *)pMsgHdr;\n            status = le32toh(pCloseDone->Status);\n        }\n        break;\n        case MBIM_COMMAND_DONE: {\n            MBIM_COMMAND_DONE_T *pCmdDone = (MBIM_COMMAND_DONE_T *)pMsgHdr;\n            status = le32toh(pCmdDone->Status);\n        }\n        break;\n        case MBIM_FUNCTION_ERROR_MSG: {\n            MBIM_FUNCTION_ERROR_MSG_T *pErrMsg = (MBIM_FUNCTION_ERROR_MSG_T *)pMsgHdr;\n            status = le32toh(pErrMsg->ErrorStatusCode);\n            if (status == MBIM_ERROR_NOT_OPENED)\n                mbim_open_state = 0; //EM06ELAR03A05M4G when suspend/resume, may get this error\n        }\n        break;\n        default:\n        break;\n    }\n\n    return status;\n}\n\n#define mbim_check_err(err, pRequest, pCmdDone) do { \\\n    int _status = mbim_status_code(pCmdDone ? &pCmdDone->MessageHeader : NULL); \\\n    if (err || _status || !pCmdDone) { \\\n        if (pCmdDone) { mbim_dump(&pCmdDone->MessageHeader, (mbim_verbose == 0)); } \\\n        mbim_free(pRequest); mbim_free(pCmdDone); \\\n        mbim_debug(\"%s:%d err=%d, Status=%d\", __func__, __LINE__, err, _status); \\\n        if (err) return err; \\\n        if (_status) return _status; \\\n        return 8888; \\\n    } \\\n} while(0)\n\n/*\n * MBIM device can be open repeatly without error\n * So, we can call the function, no matter it have been opened or not\n */\nstatic int mbim_open_device(uint32_t MaxControlTransfer) {\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\n    MBIM_OPEN_DONE_T *pOpenDone = NULL;\n    int err = 0;\n\n    mbim_debug(\"%s()\", __func__);\n    pRequest = compose_open_command(MaxControlTransfer);\n    err = mbim_send_command(pRequest, (MBIM_COMMAND_DONE_T **)&pOpenDone, 3*1000); //EM06ELAR03A09M4G take about 2.5 seconds\n    mbim_check_err(err, pRequest, pOpenDone);\n\n    err = le32toh(pOpenDone->Status);\n    mbim_free(pRequest); mbim_free(pOpenDone);\n\n    return err;\n}\n\nstatic int mbim_close_device(void) {\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\n    MBIM_CLOSE_DONE_T *pCloseDone = NULL;\n    int err = 0;\n\n    mbim_debug(\"%s()\", __func__);\n    pRequest = compose_close_command();\n    err = mbim_send_command(pRequest, (MBIM_COMMAND_DONE_T **)&pCloseDone, mbim_default_timeout);\n    mbim_check_err(err, pRequest, pCloseDone);\n\n    err = le32toh(pCloseDone->Status);\n    mbim_free(pRequest); mbim_free(pCloseDone);\n\n    return err;\n}\n\nstatic int mbim_query_connect(int sessionID) {\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\n    MBIM_SET_CONNECT_T set_connect;\n    int err;\n\n    if (ActivationState != MBIMActivationStateActivated  || mbim_verbose)\n        mbim_debug(\"%s(sessionID=%d)\", __func__, sessionID); //avoid two many log\n    set_connect.SessionId = htole32(sessionID);\n    pRequest = compose_basic_connect_command(MBIM_CID_CONNECT, MBIM_CID_CMD_TYPE_QUERY, &set_connect, sizeof(set_connect));\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\n    mbim_check_err(err, pRequest, pCmdDone);\n\n    if (le32toh(pCmdDone->InformationBufferLength))\n    {\n        MBIM_CONNECT_T *pInfo = (MBIM_CONNECT_T *)pCmdDone->InformationBuffer;\n        ActivationState = le32toh(pInfo->ActivationState);\n        mbim_update_state();\n    }\n    mbim_free(pRequest); mbim_free(pCmdDone);\n    return err;\n}\n\nstatic int mbim_ms_version_query(void) {\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\n    int err;\n\n    struct _bc_ext_version {\n            UINT8 ver_minor;\n            UINT8 ver_major;\n            UINT8 ext_ver_minor;\n            UINT8 ext_ver_major;\n    } __attribute__ ((packed)) bc_ext_version;\n\n    bc_ext_version.ver_major = 1;\n    bc_ext_version.ver_minor = 0;\n    bc_ext_version.ext_ver_major = 2;\n    bc_ext_version.ext_ver_minor = 0;\n\n    pRequest = compose_basic_connect_ext_command(MBIM_CID_MS_VERSION, MBIM_CID_CMD_TYPE_QUERY, &bc_ext_version, sizeof(bc_ext_version));\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\n    mbim_check_err(err, pRequest, pCmdDone);\n\n    if (le32toh(pCmdDone->InformationBufferLength)) {\n        struct _bc_ext_version *pInfo = (struct _bc_ext_version *)pCmdDone->InformationBuffer;\n        //mbim_debug(\"%s ext_rel_ver major=%d, minor=%d\", __func__, pInfo->ext_ver_major, pInfo->ext_ver_minor);\n        mbim_ms_version = pInfo->ext_ver_major;\n    }\n\n    mbim_free(pRequest); mbim_free(pCmdDone);\n    return err;\n}\n\nstatic int mbim_device_services_query(void) {\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\n    int err;\n    int mbim_v2_support = 0;\n\n    mbim_debug(\"%s()\", __func__);\n    pRequest = compose_basic_connect_command(MBIM_CID_DEVICE_SERVICES, MBIM_CID_CMD_TYPE_QUERY, NULL, 0);\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\n    mbim_check_err(err, pRequest, pCmdDone);\n\n    if (pCmdDone->InformationBufferLength) {\n         MBIM_DEVICE_SERVICES_INFO_T *pInfo = (MBIM_DEVICE_SERVICES_INFO_T *)pCmdDone->InformationBuffer;\n         UINT32 i;\n\n        for (i = 0; i < le32toh(pInfo->DeviceServicesCount) ; i++) {\n            //UINT32 size = pInfo->DeviceServicesRefList[i].size;\n            UINT32 offset = le32toh(pInfo->DeviceServicesRefList[i].offset);\n            MBIM_DEVICE_SERVICE_ELEMENT_T *pSrvEle = (MBIM_DEVICE_SERVICE_ELEMENT_T *)((void *)pInfo + offset);\n\n            //mbim_debug(\"\\t[%2d] %s (%s)\", i, DeviceServiceId2str(&pSrvEle->DeviceServiceId), uuid2str(&pSrvEle->DeviceServiceId));\n            if (!strcasecmp(UUID_BASIC_CONNECT_EXT, uuid2str(&pSrvEle->DeviceServiceId))) {\n                UINT32 cid = 0;\n\n                for (cid = 0; cid < le32toh(pSrvEle->CidCount); cid++) {\n                  if (MBIM_CID_MS_VERSION == le32toh(pSrvEle->CidList[cid])) {\n                        mbim_v2_support = 1;\n                    }\n                }\n            }\n            else if (!strcasecmp(uuid_ext_qmux, uuid2str(&pSrvEle->DeviceServiceId))) {\n                qmi_over_mbim_support = 1;\n            }\n        }\n    }\n    mbim_free(pRequest); mbim_free(pCmdDone);\n\n    if (mbim_v2_support) {\n        mbim_ms_version_query();\n    }\n\n    return err;\n}\n\nstatic int mbim_device_caps_query(PROFILE_T *profile) {\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\n    int err;\n\n    mbim_debug(\"%s()\", __func__);\n    pRequest = compose_basic_connect_command(MBIM_CID_DEVICE_CAPS, MBIM_CID_CMD_TYPE_QUERY, NULL, 0);\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\n    mbim_check_err(err, pRequest, pCmdDone);\n\n    if (le32toh(pCmdDone->InformationBufferLength)) {\n         MBIM_DEVICE_CAPS_INFO_T *pInfo = (MBIM_DEVICE_CAPS_INFO_T *)pCmdDone->InformationBuffer;\n         char tmp[32];\n\n         if (le32toh(pInfo->DeviceIdOffset) && le32toh(pInfo->DeviceIdSize)) {\n            wchar2char((const char *)pInfo + le32toh(pInfo->DeviceIdOffset), le32toh(pInfo->DeviceIdSize), tmp, sizeof(tmp));\n            mbim_debug(\"DeviceId:     %s\", tmp);\n         }\n         if (le32toh(pInfo->FirmwareInfoOffset) && le32toh(pInfo->FirmwareInfoSize)) {\n            wchar2char((const char *)pInfo + le32toh(pInfo->FirmwareInfoOffset), le32toh(pInfo->FirmwareInfoSize), tmp, sizeof(tmp));\n            strncpy(profile->BaseBandVersion, tmp, sizeof(profile->BaseBandVersion));\n            mbim_debug(\"FirmwareInfo: %s\", tmp);\n#ifdef CONFIG_FOXCONN_FCC_AUTH\n            // Check if this modem model needs FCC authentication\n            if (strstr(profile->BaseBandVersion, \"T99W175\")) {\n                profile->needs_fcc_auth = 1;\n                mbim_debug(\"Modem model %s requires FCC authentication\", profile->BaseBandVersion);\n            } else {\n                profile->needs_fcc_auth = 0;\n                mbim_debug(\"Modem model %s does not require FCC authentication\", profile->BaseBandVersion);\n            }\n#endif\n         }\n         if (le32toh(pInfo->HardwareInfoOffset) && le32toh(pInfo->HardwareInfoSize)) {\n            wchar2char((const char *)pInfo + le32toh(pInfo->HardwareInfoOffset), le32toh(pInfo->HardwareInfoSize), tmp, sizeof(tmp));\n            mbim_debug(\"HardwareInfo: %s\", tmp);\n         }\n    }\n    mbim_free(pRequest); mbim_free(pCmdDone);\n    return err;\n}\n\n#if 0\nstatic int mbim_radio_state_query(void) {\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\n    int err;\n\n    mbim_debug(\"%s()\", __func__);\n    pRequest = compose_basic_connect_command(MBIM_CID_RADIO_STATE, MBIM_CID_CMD_TYPE_QUERY, NULL, 0);\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\n    mbim_check_err(err, pRequest, pCmdDone);\n\n    if (pCmdDone->InformationBufferLength) {\n         MBIM_RADIO_STATE_INFO_T *pInfo = (MBIM_RADIO_STATE_INFO_T *)pCmdDone->InformationBuffer;\n        mbim_debug(\"HwRadioState: %d, SwRadioState: %d\", pInfo->HwRadioState, pInfo->SwRadioState);\n    }\n    mbim_free(pRequest); mbim_free(pCmdDone);\n    return err;\n}\n#endif\n\nstatic int mbim_set_radio_state(MBIM_RADIO_SWITCH_STATE_E RadioState) {\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\n    UINT32 value = htole32(RadioState);\n    int err;\n\n    mbim_debug(\"%s( %d )\", __func__, RadioState);\n    pRequest = compose_basic_connect_command(MBIM_CID_RADIO_STATE, MBIM_CID_CMD_TYPE_SET, &value, sizeof(value));\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\n    mbim_check_err(err, pRequest, pCmdDone);\n\n    if (le32toh(pCmdDone->InformationBufferLength)) {\n         MBIM_RADIO_STATE_INFO_T *pInfo = (MBIM_RADIO_STATE_INFO_T *)pCmdDone->InformationBuffer;\n        mbim_debug(\"HwRadioState: %d, SwRadioState: %d\", le32toh(pInfo->HwRadioState), le32toh(pInfo->SwRadioState));\n    }\n    mbim_free(pRequest); mbim_free(pCmdDone);\n    return err;\n}\n\nstatic int mbim_subscriber_status_query(void) {\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\n    int err;\n\n    mbim_debug(\"%s()\", __func__);\n    pRequest = compose_basic_connect_command(MBIM_CID_SUBSCRIBER_READY_STATUS, MBIM_CID_CMD_TYPE_QUERY, NULL, 0);\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\n    mbim_check_err(err, pRequest, pCmdDone);\n\n    if (le32toh(pCmdDone->InformationBufferLength)) {\n         MBIM_SUBSCRIBER_READY_STATUS_T *pInfo = (MBIM_SUBSCRIBER_READY_STATUS_T *)pCmdDone->InformationBuffer;\n         char tmp[32];\n\n        wchar2char((const char *)pInfo + le32toh(pInfo->SubscriberIdOffset), le32toh(pInfo->SubscriberIdSize), tmp, sizeof(tmp));\n        mbim_debug(\"SubscriberId: %s\", tmp);\n        wchar2char((const char *)pInfo + le32toh(pInfo->SimIccIdOffset), le32toh(pInfo->SimIccIdSize), tmp, sizeof(tmp));\n        mbim_debug(\"SimIccId:     %s\", tmp);\n        ReadyState = le32toh(pInfo->ReadyState);\n        mbim_update_state();\n    }\n    mbim_free(pRequest); mbim_free(pCmdDone);\n    return err;\n}\n\nstatic int mbim_register_state_query(void) {\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\n    int err;\n\n    mbim_debug(\"%s()\", __func__);\n    pRequest = compose_basic_connect_command(MBIM_CID_REGISTER_STATE, MBIM_CID_CMD_TYPE_QUERY, NULL, 0);\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\n    mbim_check_err(err, pRequest, pCmdDone);\n\n    if (le32toh(pCmdDone->InformationBufferLength)) {\n        MBIM_REGISTRATION_STATE_INFO_T *pInfo = (MBIM_REGISTRATION_STATE_INFO_T *)pCmdDone->InformationBuffer;;\n        RegisterState = le32toh(pInfo->RegisterState);\n        mbim_update_state();\n    }\n    mbim_free(pRequest); mbim_free(pCmdDone);\n    return err;\n}\n\nstatic int mbim_packet_service_query(void) {\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\n    int err;\n\n    mbim_debug(\"%s()\", __func__);\n    pRequest = compose_basic_connect_command(MBIM_CID_PACKET_SERVICE, MBIM_CID_CMD_TYPE_QUERY, NULL, 0);\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\n    mbim_check_err(err, pRequest, pCmdDone);\n\n    if (le32toh(pCmdDone->InformationBufferLength)) {\n        MBIM_PACKET_SERVICE_INFO_T *pInfo = (MBIM_PACKET_SERVICE_INFO_T *)pCmdDone->InformationBuffer;\n        PacketServiceState = le32toh(pInfo->PacketServiceState);\n        mbim_update_state();\n\n        if (le32toh(pCmdDone->InformationBufferLength) == sizeof(MBIM_PACKET_SERVICE_INFO_V2_T)) {\n            MBIM_PACKET_SERVICE_INFO_V2_T *pInfo = (MBIM_PACKET_SERVICE_INFO_V2_T *)pCmdDone->InformationBuffer;\n            mbim_debug(\"CurrentDataClass = %s\", MBIMDataClassStr(le32toh(pInfo->CurrentDataClass)));\n        }\n    }\n    mbim_free(pRequest); mbim_free(pCmdDone);\n    return err;\n}\n\nstatic int mbim_packet_service_set(MBIM_PACKET_SERVICE_ACTION_E action) {\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\n    UINT32 value = htole32(action);\n    int err;\n\n    mbim_debug(\"%s()\", __func__);\n    pRequest = compose_basic_connect_command(MBIM_CID_PACKET_SERVICE, MBIM_CID_CMD_TYPE_SET, &value, sizeof(value));\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\n    mbim_check_err(err, pRequest, pCmdDone);\n\n    if (le32toh(pCmdDone->InformationBufferLength)) {\n        MBIM_PACKET_SERVICE_INFO_T *pInfo = (MBIM_PACKET_SERVICE_INFO_T *)pCmdDone->InformationBuffer;\n        PacketServiceState = le32toh(pInfo->PacketServiceState);\n        mbim_update_state();\n    }\n    mbim_free(pRequest); mbim_free(pCmdDone);\n    return err;\n}\n\n#define _align_32(len) {len += (len % 4) ? (4 - (len % 4)) : 0;}\nstatic int mbim_populate_connect_data(MBIM_SET_CONNECT_T **connect_req_ptr) {\n    int offset;\n    int buflen = 0;\n\n    if (mbim_apn && strlen(mbim_apn) > 0) buflen += 2*strlen(mbim_apn) ;\n    _align_32(buflen);\n    if (mbim_user && strlen(mbim_user) > 0) buflen += 2*strlen(mbim_user);\n    _align_32(buflen);\n    if (mbim_passwd && strlen(mbim_passwd) > 0) buflen += 2*strlen(mbim_passwd);\n    _align_32(buflen);\n\n    *connect_req_ptr = (MBIM_SET_CONNECT_T*)malloc(sizeof(MBIM_SET_CONNECT_T) + buflen);\n    if (! *connect_req_ptr) {\n        mbim_debug(\"not enough memory\\n\");\n        return -1;\n    }\n    memset(*connect_req_ptr, 0, sizeof(MBIM_SET_CONNECT_T) + buflen);\n\n    offset = 0;\n    if (mbim_apn && strlen(mbim_apn) > 0) {\n        (*connect_req_ptr)->AccessStringSize = htole32(2*strlen(mbim_apn));\n        (*connect_req_ptr)->AccessStringOffset = htole32(offset + sizeof(MBIM_SET_CONNECT_T));\n        offset = char2wchar(mbim_apn, strlen(mbim_apn), &(*connect_req_ptr)->DataBuffer[offset], buflen - offset);\n        _align_32(offset);\n    }\n\n    if (mbim_user && strlen(mbim_user) > 0) {\n        (*connect_req_ptr)->UserNameSize = htole32(2*strlen(mbim_user));\n        (*connect_req_ptr)->UserNameOffset = htole32(offset + sizeof(MBIM_SET_CONNECT_T));\n        offset = char2wchar(mbim_user, strlen(mbim_user), &(*connect_req_ptr)->DataBuffer[offset], buflen - offset);\n        _align_32(offset);\n    }\n\n    if (mbim_passwd && strlen(mbim_passwd) > 0) {\n        (*connect_req_ptr)->PasswordSize = htole32(2*strlen(mbim_passwd));\n        (*connect_req_ptr)->PasswordOffset = htole32(offset + sizeof(MBIM_SET_CONNECT_T));\n        offset = char2wchar(mbim_passwd, strlen(mbim_passwd), &(*connect_req_ptr)->DataBuffer[offset], buflen - offset);\n    }\n\n    return buflen;\n}\n\nstatic int mbim_set_connect(int onoff, int sessionID) {\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\n    MBIM_SET_CONNECT_T *set_connect = NULL;\n    int err;\n\n    mbim_debug(\"%s(onoff=%d, sessionID=%d)\", __func__, onoff, sessionID);\n    /* alloc memory then populate APN USERNAME PASSWORD */\n    int buflen = mbim_populate_connect_data(&set_connect);\n    if (buflen < 0) {\n        return ENOMEM;\n     }\n\n    set_connect->SessionId = htole32(sessionID);\n    if (onoff == 0)\n        set_connect->ActivationCommand = htole32(MBIMActivationCommandDeactivate);\n    else\n        set_connect->ActivationCommand = htole32(MBIMActivationCommandActivate);\n\n    set_connect->Compression = htole32(MBIMCompressionNone);\n    set_connect->AuthProtocol = htole32(mbim_auth);\n    set_connect->IPType = htole32(mbim_iptype);\n    memcpy(set_connect->ContextType.uuid, str2uuid(UUID_MBIMContextTypeInternet), 16);\n\n    pRequest = compose_basic_connect_command(MBIM_CID_CONNECT, MBIM_CID_CMD_TYPE_SET, set_connect, sizeof(MBIM_SET_CONNECT_T) + buflen);\n    mbim_free(set_connect);\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout*10);\n    mbim_check_err(err, pRequest, pCmdDone);\n\n    if (le32toh(pCmdDone->InformationBufferLength)) {\n        MBIM_CONNECT_T *pInfo = (MBIM_CONNECT_T *)pCmdDone->InformationBuffer;\n        ActivationState = le32toh(pInfo->ActivationState);\n        mbim_update_state();\n    }\n\n    mbim_free(pRequest); mbim_free(pCmdDone);\n    return err;\n}\n\nstatic int mbim_ip_config(PROFILE_T *profile, int sessionID) {\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\n    MBIM_IP_CONFIGURATION_INFO_T ip_info;\n    int err;\n\n    if (profile->ipv4.Address == 0 || mbim_verbose)\n        mbim_debug(\"%s(sessionID=%d)\", __func__, sessionID);\n    ip_info.SessionId = htole32(sessionID);\n    pRequest = compose_basic_connect_command(MBIM_CID_IP_CONFIGURATION, MBIM_CID_CMD_TYPE_QUERY, &ip_info, sizeof(ip_info));\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\n    mbim_check_err(err, pRequest, pCmdDone);\n\n    if (le32toh(pCmdDone->InformationBufferLength)) {\n        UINT8 prefix, *ipv4=NULL, *ipv6=NULL, *gw=NULL, *dns1=NULL, *dns2=NULL;\n        UINT32 mtu = 1500;\n        MBIM_IP_CONFIGURATION_INFO_T *pInfo = (MBIM_IP_CONFIGURATION_INFO_T *)pCmdDone->InformationBuffer;\n\n        /* IPv4 network configration */\n        if (le32toh(pInfo->IPv4ConfigurationAvailable)&0x1) {\n            MBIM_IPV4_ELEMENT_T *pAddress = (MBIM_IPV4_ELEMENT_T *)(&pInfo->DataBuffer[le32toh(pInfo->IPv4AddressOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\n            prefix = le32toh(pAddress->OnLinkPrefixLength);\n            ipv4 = pAddress->IPv4Address;\n\n            if (le32toh(pInfo->IPv4ConfigurationAvailable)&0x2)\n                gw = (UINT8 *)(&pInfo->DataBuffer[le32toh(pInfo->IPv4GatewayOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\n\n            if (le32toh(pInfo->IPv4ConfigurationAvailable)&0x4) {\n                dns1 = (UINT8 *)(&pInfo->DataBuffer[le32toh(pInfo->IPv4DnsServerOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\n                if (le32toh(pInfo->IPv4DnsServerCount) == 2)\n                    dns2 = dns1 + 4;\n            }\n\n            if (le32toh(pInfo->IPv4ConfigurationAvailable)&0x8)\n                mtu =  le32toh(pInfo->IPv4Mtu);\n\n            if (profile->ipv4.Address != mbim2qmi_ipv4addr(*(uint32_t *)ipv4) || mbim_verbose) {\n                mbim_dump_ipconfig(pInfo, \"<\");\n                profile->ipv4.Address = mbim2qmi_ipv4addr(*(uint32_t *)ipv4);\n            }\n\n\t\t\tif(gw != NULL)\n            \tprofile->ipv4.Gateway = mbim2qmi_ipv4addr(*(uint32_t *)gw);\n            profile->ipv4.SubnetMask = mbim2qmi_ipv4addr(0xFFFFFFFF>>(32-prefix)<<(32-prefix));\n\t\t\tif(dns1 != NULL)\n            \tprofile->ipv4.DnsPrimary = mbim2qmi_ipv4addr(*(uint32_t *)dns1);\n\t\t\tif(dns2 != NULL)\n            \tprofile->ipv4.DnsSecondary = mbim2qmi_ipv4addr(*(uint32_t *)dns2);\n            profile->ipv4.Mtu = mbim2qmi_ipv4addr(mtu);\n        }\n\n        /* IPv6 network configration */\n        if (le32toh(pInfo->IPv6ConfigurationAvailable)&0x1) {\n\t\t\tgw = NULL; dns1 = NULL; dns2 = NULL;\n            MBIM_IPV6_ELEMENT_T *pAddress = (MBIM_IPV6_ELEMENT_T *)(&pInfo->DataBuffer[le32toh(pInfo->IPv6AddressOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\n            prefix = le32toh(pAddress->OnLinkPrefixLength);\n            ipv6 = pAddress->IPv6Address;\n\n            if (le32toh(pInfo->IPv6ConfigurationAvailable)&0x2)\n                gw = (UINT8 *)(&pInfo->DataBuffer[le32toh(pInfo->IPv6GatewayOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\n\n            if (le32toh(pInfo->IPv6ConfigurationAvailable)&0x4) {\n                dns1 = (UINT8 *)(&pInfo->DataBuffer[le32toh(pInfo->IPv6DnsServerOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\n                if (le32toh(pInfo->IPv6DnsServerCount) == 2)\n                    dns2 = dns1 + 16;\n            }\n\n            if (le32toh(pInfo->IPv6ConfigurationAvailable)&0x8)\n                mtu =  le32toh(pInfo->IPv6Mtu);\n\n            if(ipv6 != NULL)\n            \tmbim2qmi_ipv6addr(ipv6, profile->ipv6.Address);\n\t\t\tif(gw != NULL)\n            \tmbim2qmi_ipv6addr(gw, profile->ipv6.Gateway);\n\t\t\tif(dns1 != NULL)\n            \tmbim2qmi_ipv6addr(dns1, profile->ipv6.DnsPrimary);\n\t\t\tif(dns2 != NULL)\n            \tmbim2qmi_ipv6addr(dns2, profile->ipv6.DnsSecondary);\n            profile->ipv6.PrefixLengthIPAddr = prefix;\n            profile->ipv6.PrefixLengthGateway = prefix;\n            profile->ipv6.Mtu = mbim2qmi_ipv4addr(mtu);\n        }\n    }\n    return err;\n}\n\nint mbim_proxy_configure(const char *dev) {\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\n    MBIM_LIBQMI_PROXY_CONFIG_T *cfg;\n    int err;\n\n    pRequest = compose_basic_connect_command(\n                                                    MBIM_CID_PROXY_CONTROL_CONFIGURATION,\n                                                    MBIM_CID_CMD_TYPE_SET,\n                                                    NULL,\n                                                    sizeof(*cfg) + strlen(dev)*2);\n    if (pRequest) {\n        memcpy(((MBIM_COMMAND_MSG_T *)pRequest)->DeviceServiceId.uuid, str2uuid(UUID_LIBMBIM_PROXY), 16);\n        cfg = (MBIM_LIBQMI_PROXY_CONFIG_T *)((MBIM_COMMAND_MSG_T *)pRequest)->InformationBuffer;\n\n        cfg->DevicePathOffset = sizeof(*cfg);\n        cfg->DevicePathSize = char2wchar(dev, strlen(dev), cfg->DataBuffer, strlen(dev)*2);\n        cfg->Timeout = 15;\n    }\n\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\n    mbim_check_err(err, pRequest, pCmdDone);\n\n    mbim_free(pRequest); mbim_free(pCmdDone);\n    return err;\n}\n\nstatic int mbim_update_state(void) {\n    int chages = 0;\n\n    if (oldReadyState != ReadyState) {\n        mbim_debug(\"SubscriberReadyState %s -> %s \", MBIMSubscriberReadyStateStr(oldReadyState), MBIMSubscriberReadyStateStr(ReadyState));\n        oldReadyState = ReadyState; chages++;\n    }\n    if (oldRegisterState != RegisterState) {\n        mbim_debug(\"RegisterState %s -> %s \", MBIMRegisterStateStr(oldRegisterState), MBIMRegisterStateStr(RegisterState));\n        oldRegisterState = RegisterState; chages++;\n    }\n    if (oldPacketServiceState != PacketServiceState) {\n        mbim_debug(\"PacketServiceState %s -> %s \", MBIMPacketServiceStateStr(oldPacketServiceState), MBIMPacketServiceStateStr(PacketServiceState));\n        oldPacketServiceState = PacketServiceState; chages++;\n    }\n    if (oldActivationState != ActivationState) {\n        mbim_debug(\"ActivationState %s -> %s \", MBIMActivationStateStr(oldActivationState), MBIMActivationStateStr(ActivationState));\n        oldActivationState = ActivationState; chages++;\n    }\n\n    return chages;\n}\n\nstatic int mbim_init(PROFILE_T *profile) {\n    int retval;\n    int t = 0;\n\n    if (profile->proxy[0] && !strcmp(profile->proxy, LIBMBIM_PROXY)) {\n        retval = mbim_proxy_configure(profile->qmichannel);\n        if (retval) goto exit;\n    }\n\n    while (t++ < 10) {\n        retval = mbim_open_device(4096);\n        if (retval != ETIMEDOUT)\n            break;\n    }\n    if (retval) goto exit;\n    retval = mbim_device_caps_query(profile);\n    if (retval) goto exit;\n    mbim_update_state();\n    retval = mbim_device_services_query();\n    if (retval) goto exit;\n    mbim_update_state();\n    retval = mbim_set_radio_state(MBIMRadioOn);\n    if (retval) goto exit;\n    mbim_update_state();\n\n    if (qmi_over_mbim_support) {\n        if (!socketpair( AF_LOCAL, SOCK_STREAM, 0, qmi_over_mbim_sk)) {\n            qmidev_send = qmi_over_mbim_qmidev_send;\n#ifdef CONFIG_CELLINFO //by now, only this function need QMI OVER MBIM\n            qmi_over_mbim_nas = qmi_over_mbim_get_client_id(QMUX_TYPE_NAS);\n#endif\n#ifdef CONFIG_FOXCONN_FCC_AUTH\n            // Get DMS client ID for FCC authentication\n            qmi_over_mbim_dms = qmi_over_mbim_get_client_id(QMUX_TYPE_DMS);\n            mbim_debug(\"Got DMS client ID: %d for FCC authentication\", qmi_over_mbim_dms);\n#endif\n        }\n    }\n\n    return 0;\n\nexit:\n    return retval;\n}\n\nstatic int mbim_deinit(void) {\n    if (qmi_over_mbim_nas) {\n        qmi_over_mbim_release_client_id(QMUX_TYPE_NAS, qmi_over_mbim_nas);\n        qmi_over_mbim_nas = 0;\n    }\n#ifdef CONFIG_FOXCONN_FCC_AUTH\n    if (qmi_over_mbim_dms) {\n        qmi_over_mbim_release_client_id(QMUX_TYPE_DMS, qmi_over_mbim_dms);\n        qmi_over_mbim_dms = 0;\n    }\n#endif    \n    mbim_close_device();\n\n    if (qmi_over_mbim_sk[0] != -1) {\n        close(qmi_over_mbim_sk[0]);\n        close(qmi_over_mbim_sk[1]);\n    }\n\n    return 0;\n}\n\nconst struct qmi_device_ops mbim_dev_ops = {\n    .init = mbim_init,\n    .deinit = mbim_deinit,\n    .read = mbim_read_thread,\n};\n\nstatic int requestBaseBandVersion(PROFILE_T *profile) {\n    (void)profile;\n    return 0;\n}\n\nstatic int requestGetSIMStatus(SIM_Status *pSIMStatus)\n{\n    int retval;\n\n    *pSIMStatus = SIM_ABSENT;\n    retval = mbim_subscriber_status_query();\n    if (retval)\n        goto exit;\n    mbim_update_state();\n\n     switch(ReadyState) {\n        case MBIMSubscriberReadyStateNotInitialized: *pSIMStatus = SIM_NOT_READY; break;\n        case MBIMSubscriberReadyStateInitialized: *pSIMStatus = SIM_READY; break;\n        case MBIMSubscriberReadyStateSimNotInserted: *pSIMStatus = SIM_ABSENT; break;\n        case MBIMSubscriberReadyStateBadSim: *pSIMStatus = SIM_BAD; break;\n        case MBIMSubscriberReadyStateFailure: *pSIMStatus = SIM_ABSENT; break;\n        case MBIMSubscriberReadyStateNotActivated: *pSIMStatus = SIM_ABSENT; break;\n        case MBIMSubscriberReadyStateDeviceLocked: *pSIMStatus = SIM_PIN; break;\n        default: *pSIMStatus = SIM_ABSENT; break;\n    }\n\nexit:\n    return retval;\n}\n\nstatic int requestRegistrationState(UCHAR *pPSAttachedState) {\n    int retval;\n\n    *pPSAttachedState = 0;\n    retval = mbim_register_state_query();\n    if (retval)\n        goto exit;\n    mbim_update_state();\n\n    switch (RegisterState) {\n        case MBIMRegisterStateUnknown: *pPSAttachedState = 0; break;\n        case MBIMRegisterStateDeregistered: *pPSAttachedState = 0; break;\n        case MBIMRegisterStateSearching: *pPSAttachedState = 0; break;\n        case MBIMRegisterStateHome: *pPSAttachedState = 1; break;\n        case MBIMRegisterStateRoaming: *pPSAttachedState = 1; break;\n        case MBIMRegisterStatePartner: *pPSAttachedState = 0; break;\n        case MBIMRegisterStateDenied: *pPSAttachedState = 0; break;\n        default: *pPSAttachedState = 0; break;\n    }\n\n    if (*pPSAttachedState == 0)\n        goto exit;\n\n    retval =  mbim_packet_service_query();\n    if (retval)\n        goto exit;\n\n    switch (PacketServiceState) {\n        case MBIMPacketServiceStateUnknown: *pPSAttachedState = 0; break;\n        case MBIMPacketServiceStateAttaching: *pPSAttachedState = 0; break;\n        case MBIMPacketServiceStateAttached: *pPSAttachedState = 1; break;\n        case MBIMPacketServiceStateDetaching: *pPSAttachedState = 0; break;\n        case MBIMPacketServiceStateDetached: *pPSAttachedState = 0; break;\n        default: *pPSAttachedState = 0; break;\n    }\n\n    if (*pPSAttachedState == 0)\n        mbim_packet_service_set(MBIMPacketServiceActionAttach);\n\nexit:\n    return retval;\n}\n\n#include <json-c/json.h>\nstatic int mbim_get_imsi(char *imsi_buf, size_t buf_len) {\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\n    int err;\n\n    // Clear the output buffer first\n    if (buf_len > 0) {\n        imsi_buf[0] = '\\0';\n    }\n\n    mbim_debug(\"%s()\", __func__);\n\n    pRequest = compose_basic_connect_command(MBIM_CID_SUBSCRIBER_READY_STATUS, MBIM_CID_CMD_TYPE_QUERY, NULL, 0);\n    if (!pRequest) {\n        return -ENOMEM;\n    }\n\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\n\n    if (err || !pCmdDone || le32toh(pCmdDone->Status) != MBIM_STATUS_SUCCESS) {\n        mbim_debug(\"%s failed: send_command err=%d, response status=%d\\n\", __func__, err, \n                   pCmdDone ? le32toh(pCmdDone->Status) : -1);\n        mbim_free(pRequest);\n        mbim_free(pCmdDone);\n        return (err != 0) ? err : -1;\n    }\n\n    if (le32toh(pCmdDone->InformationBufferLength)) {\n         MBIM_SUBSCRIBER_READY_STATUS_T *pInfo = (MBIM_SUBSCRIBER_READY_STATUS_T *)pCmdDone->InformationBuffer;\n\n         if (le32toh(pInfo->SubscriberIdSize) > 0) {\n            wchar2char((const char *)pInfo + le32toh(pInfo->SubscriberIdOffset),\n                       le32toh(pInfo->SubscriberIdSize),\n                       imsi_buf,\n                       buf_len);\n            mbim_debug(\"IMSI successfully retrieved: %s\", imsi_buf);\n         }\n    }\n\n    mbim_free(pRequest);\n    mbim_free(pCmdDone);\n    if (imsi_buf[0] == '\\0') {\n        return -1;\n    }\n\n    return 0;\n}\n\nstatic int GetAPNConfig(PROFILE_T *profile, const char *json_path)\n{\n    mbim_debug(\"GetAPNConfig\");    \n    if (!json_path) return -1;\n    \n    char imsi[32];\n    int result = mbim_get_imsi(imsi, sizeof(imsi));\n    if (result != 0) {\n        mbim_debug(\"Failed to retrieve IMSI. Error code: %d\", result);\n        return -1;\n    }\n    mbim_debug(\"Successfully retrieved IMSI: %s\", imsi);\n    char sim_mcc[4] = {0};\n    char sim_mnc3[4] = {0};\n    char sim_mnc2[3] = {0};\n\n    strncpy(sim_mcc, imsi, 3);\n    strncpy(sim_mnc3, imsi + 3, 3);\n    strncpy(sim_mnc2, imsi + 3, 2);\n\n    FILE *fp = fopen(json_path, \"r\");\n    if (!fp) {\n        mbim_debug(\"Failed to open JSON file: %s\", json_path);\n        return -1;\n    }\n\n    fseek(fp, 0, SEEK_END);\n    long size = ftell(fp);\n    fseek(fp, 0, SEEK_SET);\n\n    char *buffer = malloc(size + 1);\n    if (!buffer) { fclose(fp); return -1; }\n\n    fread(buffer, 1, size, fp);\n    buffer[size] = 0;\n    fclose(fp);\n\n    json_object *root = json_tokener_parse(buffer);\n    free(buffer);\n    if (!root) return -1;\n\n    json_object *apns_obj;\n    if (!json_object_object_get_ex(root, \"apns\", &apns_obj)) { json_object_put(root); return -1; }\n\n    json_object *apn_array;\n    if (!json_object_object_get_ex(apns_obj, \"apn\", &apn_array)) { json_object_put(root); return -1; }\n\n    int array_len = json_object_array_length(apn_array);\n    json_object *best_entry = NULL;\n\n    for (int i = 0; i < array_len; i++) {\n        json_object *entry = json_object_array_get_idx(apn_array, i);\n        const char *mcc = json_object_get_string(json_object_object_get(entry, \"_mcc\"));\n        const char *mnc = json_object_get_string(json_object_object_get(entry, \"_mnc\"));\n        const char *type = json_object_get_string(json_object_object_get(entry, \"_type\"));\n\n        if (!mcc || !mnc || !type) continue;\n\n        if (strcmp(mcc, sim_mcc) == 0 && strcmp(mnc, sim_mnc3) == 0 &&\n            strstr(type, \"default\")) {\n            best_entry = entry;\n            break;\n        }\n    }\n    if (!best_entry) {\n        for (int i = 0; i < array_len; i++) {\n            json_object *entry = json_object_array_get_idx(apn_array, i);\n            const char *mcc = json_object_get_string(json_object_object_get(entry, \"_mcc\"));\n            const char *mnc = json_object_get_string(json_object_object_get(entry, \"_mnc\"));\n            const char *type = json_object_get_string(json_object_object_get(entry, \"_type\"));\n\n            if (!mcc || !mnc || !type) continue;\n\n            if (strcmp(mcc, sim_mcc) == 0 && strlen(mnc) >= 2 &&\n                strncmp(mnc, sim_mnc2, 2) == 0 &&\n                strstr(type, \"default\")) {\n                best_entry = entry;\n                break;\n            }\n        }\n    }\n    if (!best_entry) {\n        mbim_debug(\"Failed to resolve APN\");\n    }\n\n    if (best_entry) {\n        const char *apn = json_object_get_string(json_object_object_get(best_entry, \"_apn\"));\n        const char *user = json_object_get_string(json_object_object_get(best_entry, \"_user\"));\n        const char *pass = json_object_get_string(json_object_object_get(best_entry, \"_password\"));\n\n        if (apn && strlen(apn) > 0) profile->apn = strdup(apn);\n        if (user) profile->user = strdup(user);\n        if (pass) profile->password = strdup(pass);\n        mbim_debug(\"Select APN: %s\",profile->apn);\n    }\n\n    json_object_put(root);\n    return 0;\n}\n\nstatic int requestSetupDataCall(PROFILE_T *profile, int curIpFamily) {\n    int retval;\n\n    (void)curIpFamily;\n    if (strcmp(profile->apn, \"auto\") == 0)\n    {\n        mbim_debug(\"No APN is set, start automatic selection\");\n        GetAPNConfig(profile, \"/usr/share/qmodem/apns.json\");\n    }else {\n        mbim_debug(\"Use the APN set by the user\");\n    }\n    if (profile->apn)\n        mbim_apn = profile->apn;\n    if (profile->user)\n        mbim_user = profile->user;\n    if (profile->password)\n        mbim_passwd = profile->password;\n    if (profile->auth)\n        mbim_auth = profile->auth;\n    if (profile->enable_ipv4)\n        mbim_iptype = MBIMContextIPTypeIPv4;\n    if (profile->enable_ipv6)\n        mbim_iptype = MBIMContextIPTypeIPv6;\n    if (profile->enable_ipv4 && profile->enable_ipv6)\n        mbim_iptype = MBIMContextIPTypeIPv4AndIPv6;\n\n    retval = mbim_set_connect(1, mbim_sessionID);\n    if (retval)\n        goto exit;\n\nexit:\n    return retval;\n}\n\nstatic int requestQueryDataCall(UCHAR  *pConnectionStatus, int curIpFamily) {\n    int retval;\n\n    (void)curIpFamily;\n\n    *pConnectionStatus = QWDS_PKT_DATA_DISCONNECTED;\n\n    retval = mbim_query_connect(mbim_sessionID);\n    if (retval)\n        goto exit;\n\n    switch(ActivationState) {\n        case MBIMActivationStateUnknown: *pConnectionStatus = QWDS_PKT_DATA_UNKNOW; break;\n        case MBIMActivationStateActivated: *pConnectionStatus = QWDS_PKT_DATA_CONNECTED; break;\n        case MBIMActivationStateActivating: *pConnectionStatus = QWDS_PKT_DATA_DISCONNECTED; break;\n        case MBIMActivationStateDeactivated: *pConnectionStatus = QWDS_PKT_DATA_DISCONNECTED; break;\n        case MBIMActivationStateDeactivating: *pConnectionStatus = QWDS_PKT_DATA_DISCONNECTED; break;\n        default: *pConnectionStatus = QWDS_PKT_DATA_DISCONNECTED; break;\n    }\n\nexit:\n    return retval;\n}\n\nstatic int requestDeactivateDefaultPDP(PROFILE_T *profile, int curIpFamily) {\n    int retval;\n    \n    (void)profile;\n    (void)curIpFamily;\n\n    retval = mbim_set_connect(0, mbim_sessionID);\n    if (retval)\n        goto exit;\n\nexit:\n    return retval;\n}\n\nstatic int requestGetIPAddress(PROFILE_T *profile, int curIpFamily) {\n    int retval;\n    \n    (void)curIpFamily;\n    retval = mbim_ip_config(profile, mbim_sessionID);\n    if (retval)\n        goto exit;\n\nexit:\n    return retval;\n}\n\n#ifdef CONFIG_CELLINFO\nstatic int requestGetCellInfoList(void) {\n    if (qmi_over_mbim_nas) {\n        if (qmi_request_ops.requestGetCellInfoList)\n            return qmi_request_ops.requestGetCellInfoList();\n    }\n\n    return 0;\n}\n#endif\n\n#ifdef CONFIG_FOXCONN_FCC_AUTH\n// Use QMI over MBIM for Foxconn FCC authentication\nstatic int requestFoxconnSetFccAuthentication(UCHAR magic_value) {\n    if (qmi_over_mbim_support && qmi_request_ops.requestFoxconnSetFccAuthentication) {\n        mbim_debug(\"%s(magic_value=0x%02x) via QMI over MBIM\", __func__, magic_value);\n        return qmi_request_ops.requestFoxconnSetFccAuthentication(magic_value);\n    }\n    \n    mbim_debug(\"%s: QMI over MBIM not available for FCC auth\", __func__);\n    return -ENOTSUP;\n}\n\nstatic int requestFoxconnSetFccAuthenticationV2(const char *magic_string, UCHAR magic_number) {\n    if (qmi_over_mbim_support && qmi_request_ops.requestFoxconnSetFccAuthenticationV2) {\n        mbim_debug(\"%s(magic_string='%s', magic_number=0x%02x) via QMI over MBIM\", __func__, magic_string, magic_number);\n        return qmi_request_ops.requestFoxconnSetFccAuthenticationV2(magic_string, magic_number);\n    }\n    \n    mbim_debug(\"%s: QMI over MBIM not available for FCC auth\", __func__);\n    return -ENOTSUP;\n}\n#endif\n\nconst struct request_ops mbim_request_ops = {\n    .requestBaseBandVersion = requestBaseBandVersion,\n    .requestGetSIMStatus = requestGetSIMStatus,\n    .requestRegistrationState = requestRegistrationState,\n    .requestSetupDataCall = requestSetupDataCall,\n    .requestQueryDataCall = requestQueryDataCall,\n    .requestDeactivateDefaultPDP = requestDeactivateDefaultPDP,\n    .requestGetIPAddress = requestGetIPAddress,\n#ifdef CONFIG_CELLINFO\n    .requestGetCellInfoList = requestGetCellInfoList,\n#endif\n#ifdef CONFIG_FOXCONN_FCC_AUTH\n    .requestFoxconnSetFccAuthentication = requestFoxconnSetFccAuthentication,\n    .requestFoxconnSetFccAuthenticationV2 = requestFoxconnSetFccAuthenticationV2,\n#endif\n};\n\nint qmi_over_mbim_qmidev_send(PQCQMIMSG pQMI) {\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\n    int err;\n    size_t len = le16toh(pQMI->QMIHdr.Length) + 1;\n\n    if (pQMI->QMIHdr.QMIType != QMUX_TYPE_CTL) {\n        if (pQMI->QMIHdr.QMIType == QMUX_TYPE_NAS)\n            pQMI->QMIHdr.ClientId = qmi_over_mbim_nas;\n        else if (pQMI->QMIHdr.QMIType == QMUX_TYPE_DMS)\n            pQMI->QMIHdr.ClientId = qmi_over_mbim_dms;\n\n\n        if (pQMI->QMIHdr.ClientId == 0) {\n            dbg_time(\"QMIType %d has no clientID\", pQMI->QMIHdr.QMIType);\n            return -ENODEV;\n        }\n    }\n\n    pRequest = compose_qmi_over_mbim_command(1, MBIM_CID_CMD_TYPE_SET, pQMI, len);\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\n    mbim_check_err(err, pRequest, pCmdDone);\n\n    err = -1;\n    len = le32toh(pCmdDone->InformationBufferLength);\n    if (len) {\n        if (write(qmi_over_mbim_sk[0], pCmdDone->InformationBuffer, len) == (long)len) {\n            err = 0;\n        };\n    }\n\n    mbim_free(pRequest); mbim_free(pCmdDone);\n    return err;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/qendian.h",
    "content": "#ifndef __QUECTEL_ENDIAN_H__\n#define __QUECTEL_ENDIAN_H__\n#include <endian.h>\n\n#ifndef htole32 \n#if __BYTE_ORDER == __LITTLE_ENDIAN\n#define htole16(x) (uint16_t)(x)\n#define le16toh(x) (uint16_t)(x)\n#define letoh16(x) (uint16_t)(x)\n#define htole32(x) (uint32_t)(x)\n#define le32toh(x) (uint32_t)(x)\n#define letoh32(x) (uint32_t)(x)\n#define htole64(x) (uint64_t)(x)\n#define le64toh(x) (uint64_t)(x)\n#define letoh64(x) (uint64_t)(x)\n#else\nstatic __inline uint16_t __bswap16(uint16_t __x) {\n    return (__x<<8) | (__x>>8);\n}\n\nstatic __inline uint32_t __bswap32(uint32_t __x) {\n    return (__x>>24) | (__x>>8&0xff00) | (__x<<8&0xff0000) | (__x<<24);\n}\n\nstatic __inline uint64_t __bswap64(uint64_t __x) {\n    return (__bswap32(__x)+0ULL<<32) | (__bswap32(__x>>32));\n}\n\n#define htole16(x) __bswap16(x)\n#define le16toh(x) __bswap16(x)\n#define letoh16(x) __bswap16(x)\n#define htole32(x) __bswap32(x)\n#define le32toh(x) __bswap32(x)\n#define letoh32(x) __bswap32(x)\n#define htole64(x) __bswap64(x)\n#define le64toh(x) __bswap64(x)\n#define letoh64(x) __bswap64(x)\n#endif\n#endif\n\n#define le16_to_cpu(x) le16toh((uint16_t)(x))\n#define le32_to_cpu(x) le32toh((uint32_t)(x))\n#define le64_to_cpu(x) le64toh((uint64_t)(x))\n#define cpu_to_le16(x) htole16((uint16_t)(x))\n#define cpu_to_le32(x) htole32((uint32_t)(x))\n#define cpu_to_le64(x) htole64((uint64_t)(x))\n\nstatic __inline uint32_t ql_swap32(uint32_t __x) {\n    return (__x>>24) | (__x>>8&0xff00) | (__x<<8&0xff0000) | (__x<<24);\n}\n#endif //__QUECTEL_ENDIAN_H__\n\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/qlist.h",
    "content": "#ifndef __QUECTEL_LIST_H__\n#define __QUECTEL_LIST_H__\nstruct qlistnode\n{\n    struct qlistnode *next;\n    struct qlistnode *prev;\n};\n\n#define qnode_to_item(node, container, member) \\\n    (container *) (((char*) (node)) - offsetof(container, member))\n\n#define qlist_for_each(node, list) \\\n    for (node = (list)->next; node != (list); node = node->next)\n\n#define qlist_empty(list) ((list) == (list)->next)\n#define qlist_head(list) ((list)->next)\n#define qlist_tail(list) ((list)->prev)\n\nstatic void qlist_init(struct qlistnode *node)\n{\n    node->next = node;\n    node->prev = node;\n}\n\nstatic void qlist_add_tail(struct qlistnode *head, struct qlistnode *item)\n{\n    item->next = head;\n    item->prev = head->prev;\n    head->prev->next = item;\n    head->prev = item;\n}\n\nstatic void qlist_remove(struct qlistnode *item)\n{\n    item->next->prev = item->prev;\n    item->prev->next = item->next;\n}\n#endif"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/qmap_bridge_mode.c",
    "content": "/******************************************************************************\n  @file    qmap_bridge_mode.c\n  @brief   Connectivity bridge manager.\n\n  DESCRIPTION\n  Connectivity Management Tool for USB network adapter of Quectel wireless cellular modules.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n#include \"QMIThread.h\"\n\nstatic size_t ql_fread(const char *filename, void *buf, size_t size) {\n    FILE *fp = fopen(filename , \"r\");\n    size_t n = 0;\n\n    memset(buf, 0x00, size);\n\n    if (fp) {\n        n = fread(buf, 1, size, fp);\n        if (n <= 0 || n == size) {\n            dbg_time(\"warnning: fail to fread(%s), fread=%zu, buf_size=%zu: (%s)\", filename, n, size, strerror(errno));\n        }\n        fclose(fp);\n    }\n\n    return n > 0 ? n : 0;\n}\n\nstatic size_t ql_fwrite(const char *filename, const void *buf, size_t size) {\n    FILE *fp = fopen(filename , \"w\");\n    size_t n = 0;\n\n    if (fp) {\n        n = fwrite(buf, 1, size, fp);\n        if (n != size) {\n            dbg_time(\"warnning: fail to fwrite(%s), fwrite=%zu, buf_size=%zu: (%s)\", filename, n, size, strerror(errno));\n        }\n        fclose(fp);\n    }\n\n    return n > 0 ? n : 0;\n}\n\nint ql_bridge_mode_detect(PROFILE_T *profile) {\n    const char *ifname = profile->qmapnet_adapter[0] ? profile->qmapnet_adapter : profile->usbnet_adapter;\n    const char *driver;\n    char bridge_mode[128];\n    char bridge_ipv4[128];\n    char ipv4[128];\n    char buf[64];\n    size_t n;\n    int in_bridge = 0;\n\n    driver = profile->driver_name;\n    snprintf(bridge_mode, sizeof(bridge_mode), \"/sys/class/net/%s/bridge_mode\", ifname);\n    snprintf(bridge_ipv4, sizeof(bridge_ipv4), \"/sys/class/net/%s/bridge_ipv4\", ifname);\n\n    if (access(bridge_ipv4, R_OK)) {\n        if (errno != ENOENT) {\n            dbg_time(\"fail to access %s, errno: %d (%s)\", bridge_mode, errno, strerror(errno));\n            return 0;\n        }\n\n        snprintf(bridge_mode, sizeof(bridge_mode), \"/sys/module/%s/parameters/bridge_mode\", driver);\n        snprintf(bridge_ipv4, sizeof(bridge_ipv4), \"/sys/module/%s/parameters/bridge_ipv4\", driver);\n\n        if (access(bridge_mode, R_OK)) {\n            if (errno != ENOENT) {\n                dbg_time(\"fail to access %s, errno: %d (%s)\", bridge_mode, errno, strerror(errno));\n            }\n            return 0;\n        }\n    }\n\n    n = ql_fread(bridge_mode, buf, sizeof(buf));\n    if (n > 0) {\n        in_bridge = (buf[0] != '0');\n    }\n    if (!in_bridge)\n        return 0;\n   \n    memset(ipv4, 0, sizeof(ipv4));\n\n    if (strstr(bridge_ipv4, \"/sys/class/net/\") || profile->qmap_mode == 0 || profile->qmap_mode == 1) {\n        snprintf(ipv4, sizeof(ipv4), \"0x%x\", profile->ipv4.Address);\n        dbg_time(\"echo '%s' > %s\", ipv4, bridge_ipv4);\n        ql_fwrite(bridge_ipv4, ipv4, strlen(ipv4));\n    }\n    else {\n        snprintf(ipv4, sizeof(ipv4), \"0x%x:%d\", profile->ipv4.Address, profile->muxid);\n        dbg_time(\"echo '%s' > %s\", ipv4, bridge_ipv4);\n        ql_fwrite(bridge_ipv4, ipv4, strlen(ipv4));\n    }\n\n    return in_bridge;\n}\n\nint ql_enable_qmi_wwan_rawip_mode(PROFILE_T *profile) {\n    char filename[256];\n    char buf[4];\n    size_t n;\n    FILE *fp;\n\n    if (!qmidev_is_qmiwwan(profile->qmichannel))\n        return 0;\n\n    snprintf(filename, sizeof(filename), \"/sys/class/net/%s/qmi/rawip\", profile->usbnet_adapter);\n    n = ql_fread(filename, buf, sizeof(buf));\n\n    if (n == 0)\n        return 0;\n\n    if (buf[0] == '1' || buf[0] == 'Y')\n        return 0;\n\n    fp = fopen(filename , \"w\");\n    if (fp == NULL) {\n        dbg_time(\"Fail to fopen(%s, \\\"w\\\"), errno: %d (%s)\", filename, errno, strerror(errno));\n        return 1;\n    }\n\n    buf[0] = 'Y';\n    n = fwrite(buf, 1, 1, fp);\n    if (n != 1) {\n        dbg_time(\"Fail to fwrite(%s), errno: %d (%s)\", filename, errno, strerror(errno));\n        fclose(fp);\n        return 1;\n    }\n    fclose(fp);\n\n    return 0;\n}\n\nint ql_driver_type_detect(PROFILE_T *profile) {\n    if (qmidev_is_gobinet(profile->qmichannel)) {\n        profile->qmi_ops = &gobi_qmidev_ops;\n    }\n    else {\n        profile->qmi_ops = &qmiwwan_qmidev_ops;\n    }\n    qmidev_send = profile->qmi_ops->send;\n\n    return 0;\n}\n\nvoid ql_set_driver_bridge_mode(PROFILE_T *profile) {\n    char enable[16];\n    char filename[256];\n\n    if(profile->qmap_mode)\n        snprintf(filename, sizeof(filename), \"/sys/class/net/%s/bridge_mode\", profile->qmapnet_adapter);\n    else\n        snprintf(filename, sizeof(filename), \"/sys/class/net/%s/bridge_mode\", profile->usbnet_adapter);\n    snprintf(enable, sizeof(enable), \"%02d\\n\", profile->enable_bridge);\n    ql_fwrite(filename, enable, sizeof(enable));\n}\n\nstatic int ql_qmi_qmap_mode_detect(PROFILE_T *profile) {\n    char buf[128];\n    int n;\n    struct {\n        char filename[255 * 2];\n        char linkname[255 * 2];\n    } *pl;\n\n    pl = (typeof(pl)) malloc(sizeof(*pl));\n\n    snprintf(pl->linkname, sizeof(pl->linkname), \"/sys/class/net/%s/device/driver\", profile->usbnet_adapter);\n    n = readlink(pl->linkname, pl->filename, sizeof(pl->filename));\n    pl->filename[n] = '\\0';\n    while (pl->filename[n] != '/')\n        n--;\n    strncpy(profile->driver_name, &pl->filename[n+1], sizeof(profile->driver_name) - 1);\n\n    ql_get_driver_rmnet_info(profile, &profile->rmnet_info);\n    if (profile->rmnet_info.size) {\n        profile->qmap_mode = profile->rmnet_info.qmap_mode;\n        if (profile->qmap_mode) {\n            int offset_id = (profile->muxid == 0)? profile->pdp - 1 : profile->muxid - 0x81;\n\n            if (profile->qmap_mode == 1)\n                offset_id = 0;\n            profile->muxid = profile->rmnet_info.mux_id[offset_id];\n            strncpy(profile->qmapnet_adapter, profile->rmnet_info.ifname[offset_id], sizeof(profile->qmapnet_adapter) - 1);\n            profile->qmap_size = profile->rmnet_info.rx_urb_size;\n            profile->qmap_version = profile->rmnet_info.qmap_version;\n        }\n\n        goto _out;\n    }\n\n    snprintf(pl->filename, sizeof(pl->filename), \"/sys/class/net/%s/qmap_mode\", profile->usbnet_adapter);\n    if (access(pl->filename, R_OK)) {\n        if (errno != ENOENT) {\n            dbg_time(\"fail to access %s, errno: %d (%s)\", pl->filename, errno, strerror(errno));\n            goto _out;\n        }\n        \n        snprintf(pl->filename, sizeof(pl->filename), \"/sys/module/%s/parameters/qmap_mode\", profile->driver_name);\n        if (access(pl->filename, R_OK)) {\n            if (errno != ENOENT) {\n                dbg_time(\"fail to access %s, errno: %d (%s)\", pl->filename, errno, strerror(errno));\n                goto _out;\n            }\n            \n            snprintf(pl->filename, sizeof(pl->filename), \"/sys/class/net/%s/device/driver/module/parameters/qmap_mode\", profile->usbnet_adapter);\n            if (access(pl->filename, R_OK)) {\n                if (errno != ENOENT) {\n                    dbg_time(\"fail to access %s, errno: %d (%s)\", pl->filename, errno, strerror(errno));\n                    goto _out;\n                }\n            }\n        }\n    }\n\n    if (!access(pl->filename, R_OK)) {\n        n = ql_fread(pl->filename, buf, sizeof(buf));\n        if (n > 0) {\n            profile->qmap_mode = atoi(buf);\n            \n            if (profile->qmap_mode > 1) {\n                if(!profile->muxid)\n                \tprofile->muxid = profile->pdp + 0x80; //muxis is 0x8X for PDN-X\n                snprintf(profile->qmapnet_adapter, sizeof(profile->qmapnet_adapter),\n                    \"%.16s.%d\", profile->usbnet_adapter, profile->muxid - 0x80);\n           } if (profile->qmap_mode == 1) {\n                profile->muxid = 0x81;\n                strncpy(profile->qmapnet_adapter, profile->usbnet_adapter, sizeof(profile->qmapnet_adapter));\n           }\n        }\n    }\n    else if (qmidev_is_qmiwwan(profile->qmichannel)) {\n        snprintf(pl->filename, sizeof(pl->filename), \"/sys/class/net/qmimux%d\", profile->pdp - 1);\n        if (access(pl->filename, R_OK)) {\n            if (errno != ENOENT) {\n                dbg_time(\"fail to access %s, errno: %d (%s)\", pl->filename, errno, strerror(errno));\n            }\n            goto _out;\n        }\n\n        //upstream Kernel Style QMAP qmi_wwan.c\n        snprintf(pl->filename, sizeof(pl->filename), \"/sys/class/net/%s/qmi/add_mux\", profile->usbnet_adapter);\n        n = ql_fread(pl->filename, buf, sizeof(buf));\n        if (n >= 5) {\n            dbg_time(\"If use QMAP by /sys/class/net/%s/qmi/add_mux\", profile->usbnet_adapter);\n            #if 1\n            dbg_time(\"Please set mtu of wwan0 >= max dl qmap packet size\");\n            #else\n            dbg_time(\"File:%s Line:%d Please make sure add next patch to qmi_wwan.c\", __func__, __LINE__);\n            /*\n            diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c\n            index 74bebbd..db8a777 100644\n            --- a/drivers/net/usb/qmi_wwan.c\n            +++ b/drivers/net/usb/qmi_wwan.c\n            @@ -379,6 +379,24 @@ static ssize_t add_mux_store(struct device *d,  struct device_attribute *attr, c\n                if (!ret) {\n                        info->flags |= QMI_WWAN_FLAG_MUX;\n                        ret = len;\n            +#if 1 //Add by Quectel\n            +               if (le16_to_cpu(dev->udev->descriptor.idVendor) == 0x2c7c) {\n            +                       int idProduct = le16_to_cpu(dev->udev->descriptor.idProduct);\n            +\n            +                       if (idProduct == 0x0121 || idProduct == 0x0125 || idProduct == 0x0435) //MDM9x07\n            +                               dev->rx_urb_size = 4*1024;\n            +                       else if (idProduct == 0x0306) //MDM9x40\n            +                               dev->rx_urb_size = 16*1024;\n            +                       else if (idProduct == 0x0512) //SDX20\n            +                               dev->rx_urb_size = 32*1024;\n            +                       else if (idProduct == 0x0620) //SDX24\n            +                               dev->rx_urb_size = 32*1024;\n            +                       else if (idProduct == 0x0800) //SDX55\n            +                               dev->rx_urb_size = 32*1024;\n            +                       else\n            +                               dev->rx_urb_size = 32*1024;\n            +               }\n            +#endif\n                }\n            err:\n                rtnl_unlock();\n            */\n            #endif\n            profile->qmap_mode = n/5; //0x11\\n0x22\\n0x33\\n\n            if (profile->qmap_mode > 1) {\n                //PDN-X map to qmimux-X\n                if(!profile->muxid) {\n                    profile->muxid = (buf[5*(profile->pdp - 1) + 2] - '0')*16 + (buf[5*(profile->pdp - 1) + 3] - '0');\n                    snprintf(profile->qmapnet_adapter, sizeof(profile->qmapnet_adapter), \"qmimux%d\", profile->pdp - 1);\n                } else {\n                    profile->muxid = (buf[5*(profile->muxid - 0x81) + 2] - '0')*16 + (buf[5*(profile->muxid - 0x81) + 3] - '0');\n                    snprintf(profile->qmapnet_adapter, sizeof(profile->qmapnet_adapter), \"qmimux%d\", profile->muxid - 0x81);\n                }\n            } else if (profile->qmap_mode == 1) {\n                profile->muxid = (buf[5*0 + 2] - '0')*16 + (buf[5*0 + 3] - '0');\n                snprintf(profile->qmapnet_adapter, sizeof(profile->qmapnet_adapter),\n                    \"qmimux%d\", 0);\n            }\n        }\n    } \n\n_out:\n    if (profile->qmap_mode) {\n        if (profile->qmap_size == 0) {\n            profile->qmap_size = 16*1024;\n            snprintf(pl->filename, sizeof(pl->filename), \"/sys/class/net/%s/qmap_size\", profile->usbnet_adapter);\n            if (!access(pl->filename, R_OK)) {\n                size_t n;\n                char buf[32];\n                n = ql_fread(pl->filename, buf, sizeof(buf));\n                if (n > 0) {\n                    profile->qmap_size = atoi(buf);\n                }\n            }\n        }\n\n        if (profile->qmap_version == 0) {\n            profile->qmap_version = WDA_DL_DATA_AGG_QMAP_ENABLED;\n        }\n\n        dbg_time(\"qmap_mode = %d, qmap_version = %d, qmap_size = %d, muxid = 0x%02x, qmap_netcard = %s\",\n            profile->qmap_mode, profile->qmap_version, profile->qmap_size, profile->muxid, profile->qmapnet_adapter);\n    }\n    ql_set_driver_bridge_mode(profile);\n    free(pl);\n\n    return 0;\n}\n\nstatic int ql_mbim_usb_vlan_mode_detect(PROFILE_T *profile) {\n    char tmp[128];\n\n    snprintf(tmp, sizeof(tmp), \"/sys/class/net/%s.%d\", profile->usbnet_adapter, profile->pdp);\n    if (!access(tmp, F_OK)) {\n        profile->qmap_mode = 4;\n        profile->muxid = profile->pdp;\n        no_trunc_strncpy(profile->qmapnet_adapter, tmp + strlen(\"/sys/class/net/\"), sizeof(profile->qmapnet_adapter) - 1);\n\n        dbg_time(\"mbim_qmap_mode = %d, vlan_id = 0x%02x, qmap_netcard = %s\",\n            profile->qmap_mode, profile->muxid, profile->qmapnet_adapter);\n    }\n\n    return 0;\n}\n\nstatic int ql_mbim_mhi_qmap_mode_detect(PROFILE_T *profile) {\n    ql_get_driver_rmnet_info(profile, &profile->rmnet_info);\n    if (profile->rmnet_info.size) {\n        profile->qmap_mode = profile->rmnet_info.qmap_mode;\n        if (profile->qmap_mode) {\n            int offset_id = profile->pdp - 1;\n\n            if (profile->qmap_mode == 1)\n                offset_id = 0;\n            profile->muxid = profile->pdp;\n            strcpy(profile->qmapnet_adapter, profile->rmnet_info.ifname[offset_id]);\n            profile->qmap_size = profile->rmnet_info.rx_urb_size;\n            profile->qmap_version = profile->rmnet_info.qmap_version;\n        \n            dbg_time(\"mbim_qmap_mode = %d, vlan_id = 0x%02x, qmap_netcard = %s\",\n                profile->qmap_mode, profile->muxid, profile->qmapnet_adapter);\n        }\n\n        goto _out;\n    }\n    \n_out:\n    return 0;\n}\n\nint ql_qmap_mode_detect(PROFILE_T *profile) {\n    if (profile->software_interface == SOFTWARE_MBIM) {\n        if (profile->hardware_interface == HARDWARE_USB)\n            return ql_mbim_usb_vlan_mode_detect(profile);\n        else if (profile->hardware_interface == HARDWARE_PCIE)\n            return ql_mbim_mhi_qmap_mode_detect(profile);\n    } else if (profile->software_interface == SOFTWARE_QMI) {\n        return ql_qmi_qmap_mode_detect(profile);\n    }\n#ifdef CONFIG_QRTR\n    else if(profile->software_interface == SOFTWARE_QRTR) {\n        char tmp[128];\n\n        profile->qmap_mode = 4;\n        profile->qmap_version = WDA_DL_DATA_AGG_QMAP_V5_ENABLED;\n        profile->qmap_size = 31*1024;\n        profile->muxid = 0x80 | profile->pdp;\n        snprintf(profile->qmapnet_adapter, sizeof(profile->qmapnet_adapter), \"rmnet_data%d\", profile->muxid&0xF);\n\n        snprintf(tmp, sizeof(tmp), \"/sys/class/net/%s\", profile->qmapnet_adapter);\n        if (access(tmp, F_OK)) {\n            rtrmnet_ctl_create_vnd(profile->usbnet_adapter, profile->qmapnet_adapter,\n                profile->muxid, profile->qmap_version, 11, 4096);\n        }\n    }\n#endif\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/qrtr.c",
    "content": "//https://github.com/andersson/qrtr\n/******************************************************************************\n  @file    QrtrCM.c\n  @brief   GobiNet driver.\n\n  DESCRIPTION\n  Connectivity Management Tool for USB network adapter of Quectel wireless cellular modules.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n#include <stdio.h>\n#include <string.h>\n#include <termios.h>\n#include <stdio.h>\n#include <ctype.h>\n#include \"QMIThread.h\"\n\ntypedef struct {\n    uint32_t service;\n    uint32_t version;\n    uint32_t instance;\n    uint32_t node;\n    uint32_t port;\n} QrtrService;\n\n#define QRTR_MAX (QMUX_TYPE_WDS_ADMIN + 1)\nstatic QrtrService service_list[QRTR_MAX];\nstatic int qmiclientId[QRTR_MAX];\nstatic int get_client(UCHAR QMIType);\nstatic uint32_t node_modem = 3; //IPQ ~ 3, QCM ~ 0\n\n#ifdef USE_LINUX_MSM_IPC\n#include <linux/msm_ipc.h>\n\nstruct xport_ipc_router_server_addr {\n        uint32_t service;\n        uint32_t instance;\n        uint32_t node_id;\n        uint32_t port_id;\n};\n\nunion ctl_msg {\n        uint32_t cmd;\n                struct {\n                uint32_t cmd;\n                        uint32_t service;\n                        uint32_t instance;\n                uint32_t node_id;\n                uint32_t port_id;\n        } srv;\n                struct {\n                uint32_t cmd;\n                uint32_t node_id;\n                uint32_t port_id;\n        } cli;\n        };\n#define CTL_CMD_NEW_SERVER          4\n#define CTL_CMD_REMOVE_SERVER       5\n\n#define VERSION_MASK 0xff\n#define GET_VERSION(x) (x & 0xff)\n#define GET_XPORT_SVC_INSTANCE(x) GET_VERSION(x)\n#define GET_INSTANCE(x) ((x & 0xff00) >> 8)\n\nstatic int msm_ipc_socket(const char *name)\n{\n    int sock;\n    int flags;\n\n    sock = socket(AF_MSM_IPC, SOCK_DGRAM, 0);\n    if (sock < 0) {\n        dbg_time(\"%s(%s) errno: %d (%s)\\n\", __func__, name, errno, strerror(errno));\n        return -1;\n    }\n\n    fcntl(sock, F_SETFD, FD_CLOEXEC);\n    flags = fcntl(sock, F_GETFL, 0);\n    fcntl(sock, F_SETFL, flags | O_NONBLOCK);\n\n    return sock;\n}\n\nstatic uint32_t xport_lookup\n(\n int lookup_sock_fd,\n uint32_t service_id,\n uint32_t version\n)\n{\n  uint32_t num_servers_found = 0;\n  uint32_t num_entries_to_fill = 4;\n  struct server_lookup_args *lookup_arg;\n  int i;\n\n  lookup_arg = (struct server_lookup_args *)malloc(sizeof(*lookup_arg)\n      + (num_entries_to_fill * sizeof(struct msm_ipc_server_info)));\n  if (!lookup_arg)\n  {\n    dbg_time(\"%s: Malloc failed\\n\", __func__);\n    return 0;\n  }\n\n  lookup_arg->port_name.service = service_id;\n  lookup_arg->port_name.instance = GET_XPORT_SVC_INSTANCE(version);\n  lookup_arg->num_entries_in_array = num_entries_to_fill;\n  lookup_arg->lookup_mask =  VERSION_MASK;\n  lookup_arg->num_entries_found = 0;\n  if (ioctl(lookup_sock_fd, IPC_ROUTER_IOCTL_LOOKUP_SERVER, lookup_arg) < 0)\n  {\n    dbg_time(\"%s: Lookup failed for %08x: %08x\\n\", __func__, service_id, version);\n    free(lookup_arg);\n    return 0;\n  }\n\n  dbg_time(\"%s: num_entries_found %d for type=%d instance=%d\", __func__,\n    lookup_arg->num_entries_found, service_id, version);\n  num_servers_found = 0;\n  for (i = 0; ((i < (int)num_entries_to_fill) && (i < lookup_arg->num_entries_found)); i++)\n  {\n     QrtrService service_info[1];\n\n    if (lookup_arg->srv_info[i].node_id != node_modem)\n        continue;\n    num_servers_found++;\n\n    service_info[0].service = lookup_arg->srv_info[i].service;\n    service_info[0].version = GET_VERSION(lookup_arg->srv_info[i].instance);\n    service_info[0].instance = GET_INSTANCE(lookup_arg->srv_info[i].instance);\n    service_info[0].node = lookup_arg->srv_info[i].node_id;\n    service_info[0].port = lookup_arg->srv_info[i].port_id;\n\n    service_list[service_id] = service_info[0];\n    qmiclientId[service_id] = get_client(service_id);\n  }\n\n  free(lookup_arg);\n  return num_servers_found;\n}\n\nstatic int xport_send(int sock, uint32_t node, uint32_t port, const void *data, unsigned int sz)\n{\n    struct sockaddr_msm_ipc addr = {};\n    int rc;\n\n    addr.family = AF_MSM_IPC;\n    addr.address.addrtype = MSM_IPC_ADDR_ID;\n    addr.address.addr.port_addr.node_id = node;\n    addr.address.addr.port_addr.port_id = port;\n\n    rc = sendto(sock, data, sz, MSG_DONTWAIT, (void *)&addr, sizeof(addr));\n    if (rc < 0) {\n        dbg_time(\"xport_send errno: %d (%s)\\n\", errno, strerror(errno));\n        return -1;\n    }\n\n    return 0;\n}\n\nstatic int xport_recv(int sock, void *data, unsigned int sz, uint32_t *node, uint32_t *port)\n{\n    struct sockaddr_msm_ipc addr = {};\n    socklen_t addr_size = sizeof(struct sockaddr_msm_ipc);\n    int rc;\n\n    rc = recvfrom(sock, data, sz, MSG_DONTWAIT, (void *)&addr, &addr_size);\n    if (rc < 0) {\n        dbg_time(\"xport_recv errno: %d (%s)\\n\", errno, strerror(errno));\n    }\n    else if (addr.address.addrtype != MSM_IPC_ADDR_ID) {\n        dbg_time(\"xport_recv addrtype is NOT MSM_IPC_ADDR_ID\\n\");\n        rc = -1;\n    }\n\n    *node = addr.address.addr.port_addr.node_id;\n    *port = addr.address.addr.port_addr.port_id;\n    return rc;\n}\n#define qmi_recv xport_recv\n\nstatic int xport_ctrl_init(void)\n{\n    int ctrl_sock;\n    int rc;\n    uint32_t instance = 1; //modem\n    uint32_t version;\n\n    ctrl_sock = msm_ipc_socket(\"ctrl_port\");\n    if (ctrl_sock == -1)\n        return -1;\n\n    rc = ioctl(ctrl_sock, IPC_ROUTER_IOCTL_GET_VERSION, &version);\n    if (rc < 0) {\n        dbg_time(\"%s: failed to get ipc version\\n\", __func__);\n        goto init_close_ctrl_fd;\n    }\n    dbg_time(\"%s ipc_version = %d\", __func__, version);\n\n    rc = ioctl(ctrl_sock, IPC_ROUTER_IOCTL_BIND_CONTROL_PORT, NULL);\n    if (rc < 0) {\n        dbg_time(\"%s: failed to bind as control port\\n\", __func__);\n        goto init_close_ctrl_fd;\n    }\n\n    //cat /sys/kernel/debug/msm_ipc_router/dump_servers\n    rc = 0;\n    rc += xport_lookup(ctrl_sock, QMUX_TYPE_WDS, instance);\n    if (service_list[QMUX_TYPE_WDS].port) {\n        qmiclientId[QMUX_TYPE_WDS_IPV6] = get_client(QMUX_TYPE_WDS);\n    }\n    rc += xport_lookup(ctrl_sock, QMUX_TYPE_NAS, instance);\n    rc += xport_lookup(ctrl_sock, QMUX_TYPE_UIM, instance);\n    rc += xport_lookup(ctrl_sock, QMUX_TYPE_DMS, instance);\n    rc += xport_lookup(ctrl_sock, QMUX_TYPE_WDS_ADMIN, instance);\n\n    if (rc == 0) {\n        dbg_time(\"%s: failed to lookup qmi service\\n\", __func__);\n        goto init_close_ctrl_fd;\n    }\n\n    return ctrl_sock;\n\ninit_close_ctrl_fd:\n    close(ctrl_sock);\n    return -1;\n}\n\nstatic void handle_ctrl_pkt(int sock) {\n    union ctl_msg pkt;\n    uint32_t type;\n    int rc;\n\n    rc = recvfrom(sock, &pkt, sizeof(pkt), 0, NULL, NULL);\n    if (rc < 0)\n        return;\n\n    type = le32toh(pkt.cmd);\n    if (CTL_CMD_NEW_SERVER == type || CTL_CMD_REMOVE_SERVER == type) {\n        QrtrService s;\n\n        s.service = le32toh(pkt.srv.service);\n        s.version = le32toh(pkt.srv.instance) & 0xff;\n        s.instance = le32toh(pkt.srv.instance) >> 8;\n        s.node = le32toh(pkt.srv.node_id);\n        s.port = le32toh(pkt.srv.port_id);\n\n        if (debug_qmi)\n            dbg_time (\"[qrtr] %s  server on %u:%u -> service %u, version %u, instance %u\",\n                    CTL_CMD_NEW_SERVER == type ? \"add\" : \"remove\",\n                     s.node, s.port, s.service, s.version, s.instance);\n\n        if (CTL_CMD_NEW_SERVER == type) {\n            if (s.service < QRTR_MAX) {\n                service_list[s.service] = s;\n            }\n        }\n        else if (CTL_CMD_REMOVE_SERVER == type) {\n            if (s.service < QRTR_MAX) {\n                memset(&service_list[s.service], 0, sizeof(QrtrService));\n            }\n        }\n    }\n}\n#else\n#include <linux/socket.h>\n#include \"qrtr.h\"\n#endif\n\nstatic int qrtr_socket(void)\n{\n    struct sockaddr_qrtr sq;\n    socklen_t sl = sizeof(sq);\n    int sock;\n    int rc;\n\n    sock = socket(AF_QIPCRTR, SOCK_DGRAM, 0);\n    if (sock < 0) {\n        dbg_time(\"qrtr_socket errno: %d (%s)\\n\", errno, strerror(errno));\n        return -1;\n    }\n\n    rc = getsockname(sock, (void *)&sq, &sl);\n    if (rc || sq.sq_family != AF_QIPCRTR || sl != sizeof(sq)) {\n        dbg_time(\"getsockname: %d (%s)\\n\", errno, strerror(errno));\n        close(sock);\n        return -1;\n    }\n\n    return sock;\n}\n\nstatic int qrtr_send(int sock, uint32_t node, uint32_t port, const void *data, unsigned int sz)\n{\n    struct sockaddr_qrtr sq = {};\n    int rc;\n\n    sq.sq_family = AF_QIPCRTR;\n    sq.sq_node = node;\n    sq.sq_port = port;\n\n    rc = sendto(sock, data, sz, MSG_DONTWAIT, (void *)&sq, sizeof(sq));\n    if (rc < 0) {\n        dbg_time(\"sendto errno: %d (%s)\\n\", errno, strerror(errno));\n        return -1;\n    }\n\n    return 0;\n}\n\nstatic int qrtr_recv(int sock, void *data, unsigned int sz, uint32_t *node, uint32_t *port)\n{\n    struct sockaddr_qrtr sq = {};\n    socklen_t sl = sizeof(sq);\n    int rc;\n\n    rc = recvfrom(sock, data, sz, MSG_DONTWAIT, (void *)&sq, &sl);\n    if (rc < 0) {\n        dbg_time(\"qrtr_recv errno: %d (%s)\\n\", errno, strerror(errno));\n    }\n\n    *node  = sq.sq_node;\n    *port  = sq.sq_port;\n    return rc;\n    }\n#define qmi_recv qrtr_recv\n\nstatic int qrtr_ctrl_init(void) {\n    int sock;\n    int rc;\n    struct qrtr_ctrl_pkt pkt;\n    struct sockaddr_qrtr sq;\n    socklen_t sl = sizeof(sq);\n\n    sock = qrtr_socket();\n    if (sock == -1)\n        return -1;\n\n    memset(&pkt, 0, sizeof(pkt));\n    pkt.cmd = htole32(QRTR_TYPE_NEW_LOOKUP);\n\n    getsockname(sock, (void *)&sq, &sl);\n    rc = qrtr_send(sock, sq.sq_node, QRTR_PORT_CTRL, &pkt, sizeof(pkt));\n    if (rc == -1) {\n        dbg_time(\"qrtr_send errno: %d (%s)\\n\", errno, strerror(errno));\n        close(sock);\n        return -1;\n    }\n\n    return sock;\n}\n\nstatic void handle_server_change(uint32_t type, struct qrtr_ctrl_pkt *ppkt) {\n    struct qrtr_ctrl_pkt pkt = *ppkt;\n        QrtrService s;\n\n        s.service = le32toh(pkt.server.service);\n        s.version = le32toh(pkt.server.instance) & 0xff;\n        s.instance = le32toh(pkt.server.instance) >> 8;\n        s.node = le32toh(pkt.server.node);\n        s.port = le32toh(pkt.server.port);\n\n        if (debug_qmi)\n            dbg_time (\"[qrtr] %s  server on %u:%u -> service %u, version %u, instance %u\",\n                    QRTR_TYPE_NEW_SERVER == type ? \"add\" : \"remove\",\n                     s.node, s.port, s.service, s.version, s.instance);\n\n        if (s.node != node_modem)\n            return; //we only care modem\n\n        if (QRTR_TYPE_NEW_SERVER == type) {\n            if (s.service < QRTR_MAX) {\n                service_list[s.service] = s;\n            }\n        }\n        else if (QRTR_TYPE_DEL_SERVER == type) {\n            if (s.service < QRTR_MAX) {\n                memset(&service_list[s.service], 0, sizeof(QrtrService));\n            }\n        }\n    }\n\nstatic void handle_ctrl_pkt(int sock) {\n    struct qrtr_ctrl_pkt pkt;\n    struct sockaddr_qrtr sq;\n    socklen_t sl = sizeof(sq);\n    uint32_t type;\n    int rc;\n\n    rc = recvfrom(sock, &pkt, sizeof(pkt), 0, (void *)&sq, &sl);\n    if (rc < 0)\n        return;\n\n    type = le32toh(pkt.cmd);\n    if (debug_qmi)\n        dbg_time(\"type %u, node %u, sq.port %x, len: %d\", type, sq.sq_node, sq.sq_port, rc);\n\n    if (sq.sq_port != QRTR_PORT_CTRL)\n        return;\n\n    if (QRTR_TYPE_NEW_SERVER == type || QRTR_TYPE_DEL_SERVER == type) {\n        handle_server_change(type, &pkt);\n    }\n}\n\nstatic int get_client(UCHAR QMIType) {\n    int ClientId;\n    QrtrService *s = &service_list[QMIType];\n\n    if (!s ->service) {\n        dbg_time(\"%s service: %d for QMIType: %d\", __func__, s ->service, QMIType);\n        return -ENODEV;\n    }\n\n#ifdef USE_LINUX_MSM_IPC\n    ClientId = msm_ipc_socket(\"xport\");\n#else\n    ClientId = qrtr_socket();\n#endif\n    if (ClientId == -1) {\n        return 0;\n    }\n\n    switch (QMIType) {\n        case QMUX_TYPE_WDS: dbg_time(\"Get clientWDS = %d\", ClientId); break;\n        case QMUX_TYPE_DMS: dbg_time(\"Get clientDMS = %d\", ClientId); break;\n        case QMUX_TYPE_NAS: dbg_time(\"Get clientNAS = %d\", ClientId); break;\n        case QMUX_TYPE_QOS: dbg_time(\"Get clientQOS = %d\", ClientId); break;\n        case QMUX_TYPE_WMS: dbg_time(\"Get clientWMS = %d\", ClientId); break;\n        case QMUX_TYPE_PDS: dbg_time(\"Get clientPDS = %d\", ClientId); break;\n        case QMUX_TYPE_UIM: dbg_time(\"Get clientUIM = %d\", ClientId); break;\n        case QMUX_TYPE_WDS_ADMIN: dbg_time(\"Get clientWDA = %d\", ClientId);\n        break;\n        default: break;\n    }\n\n    return ClientId;\n}\n\nstatic void handle_alloc_client(PROFILE_T *profile) {\n    int srv_list[] = {QMUX_TYPE_WDS, QMUX_TYPE_NAS, QMUX_TYPE_UIM, QMUX_TYPE_DMS, QMUX_TYPE_WDS_ADMIN};\n    size_t i = 0, srv_ready = 0;\n    static int report = -1;\n\n    if (report != -1)\n        return;\n\n    for(i = 0; i < sizeof(srv_list)/sizeof(srv_list[0]); i++) {\n        int srv = srv_list[i];\n\n        if (service_list[srv].service)\n            srv_ready++;\n        else\n            continue;\n\n        if (qmiclientId[srv] == 0) {\n            qmiclientId[srv] = get_client(srv);\n\n            if (qmiclientId[srv] != 0) {\n                if (srv == QMUX_TYPE_WDS) {\n                    qmiclientId[QMUX_TYPE_WDS_IPV6] = get_client(QMUX_TYPE_WDS);\n                }\n                else if (srv == QMUX_TYPE_WDS_ADMIN) {\n                     profile->wda_client = qmiclientId[QMUX_TYPE_WDS_ADMIN];\n                }\n            }\n        }\n    }\n\n    if (srv_ready == sizeof(srv_list)/sizeof(srv_list[0])) {\n        if (qmiclientId[QMUX_TYPE_WDS]) {\n            qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_CONNECTED);\n        } else {\n            qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_DISCONNECTED);\n        }\n        report = 1;\n    }\n}\n\nstatic int qmi_send(PQCQMIMSG pRequest) {\n    uint8_t QMIType = pRequest->QMIHdr.QMIType;\n    int sock;\n    QrtrService *s = &service_list[QMIType == QMUX_TYPE_WDS_IPV6 ? QMUX_TYPE_WDS: QMIType];\n    sock = qmiclientId[QMIType];\n\n    pRequest->QMIHdr.ClientId = 0xaa;\n    if (!s ->service || !sock) {\n        dbg_time(\"%s service: %d, sock: %d for QMIType: %d\", __func__, s ->service, sock, QMIType);\n        return -ENODEV;\n    }\n\n#ifdef USE_LINUX_MSM_IPC\n    return xport_send(sock, s->node, s->port, &pRequest->MUXMsg,\n            le16_to_cpu(pRequest->QMIHdr.Length) + 1 - sizeof(QCQMI_HDR));\n#else\n    return qrtr_send(sock, s->node, s->port, &pRequest->MUXMsg,\n            le16_to_cpu(pRequest->QMIHdr.Length) + 1 - sizeof(QCQMI_HDR));\n#endif\n}\n\nstatic int qmi_deinit(void) {\n    unsigned int i;\n\n    for (i = 0; i < sizeof(qmiclientId)/sizeof(qmiclientId[0]); i++)\n    {\n        if (qmiclientId[i] != 0)\n        {\n            close(qmiclientId[i]);\n            qmiclientId[i] = 0;\n        }\n    }\n\n    return 0;\n}\n\nstatic void * qmi_read(void *pData) {\n    PROFILE_T *profile = (PROFILE_T *)pData;\n    int ctrl_sock;\n    int wait_for_request_quit = 0;   \n\n#ifdef USE_LINUX_MSM_IPC\n    ctrl_sock = xport_ctrl_init();\n    if (ctrl_sock != -1)\n        qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_CONNECTED);\n#else\n    ctrl_sock = qrtr_ctrl_init();\n#endif\n\n    if (ctrl_sock == -1)\n        goto _quit;\n\n    while (1) {\n        struct pollfd pollfds[16] = {{qmidevice_control_fd[1], POLLIN, 0}, {ctrl_sock, POLLIN, 0}};\n        int ne, ret, nevents = 2;\n        unsigned int i;\n\n        for (i = 0; i < sizeof(qmiclientId)/sizeof(qmiclientId[0]); i++)\n        {\n            if (qmiclientId[i] != 0)\n            {\n                pollfds[nevents].fd = qmiclientId[i];\n                pollfds[nevents].events = POLLIN;\n                pollfds[nevents].revents = 0;\n                nevents++;\n            }\n        }\n\n        do {\n            ret = poll(pollfds, nevents, wait_for_request_quit ? 1000 : -1);\n         } while ((ret < 0) && (errno == EINTR));\n\n\tif (ret == 0 && wait_for_request_quit) {\n            QmiThreadRecvQMI(NULL); //main thread may pending on QmiThreadSendQMI()\n            continue;\n\t}\n\n        if (ret <= 0) {\n            dbg_time(\"%s poll=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\n            break;\n        }\n\n        for (ne = 0; ne < nevents; ne++) {\n            int fd = pollfds[ne].fd;\n            short revents = pollfds[ne].revents;\n\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\n                dbg_time(\"%s poll err/hup/inval\", __func__);\n                dbg_time(\"epoll fd = %d, events = 0x%04x\", fd, revents);\n                if (fd == qmidevice_control_fd[1]) {\n                } else {\n                }\n                if (revents & (POLLERR | POLLHUP | POLLNVAL))\n                    goto _quit;\n            }\n\n            if ((revents & POLLIN) == 0)\n                continue;\n\n            if (fd == qmidevice_control_fd[1]) {\n                int triger_event;\n                if (read(fd, &triger_event, sizeof(triger_event)) == sizeof(triger_event)) {\n                    //DBG(\"triger_event = 0x%x\", triger_event);\n                    switch (triger_event) {\n                        case RIL_REQUEST_QUIT:\n                            goto _quit;\n                        break;\n                        case SIG_EVENT_STOP:\n                            wait_for_request_quit = 1;   \n                        break;\n                        default:\n                        break;\n                    }\n                }\n            }\n            else  if (fd == ctrl_sock) {\n                handle_ctrl_pkt(ctrl_sock);\n                handle_alloc_client(profile);\n            }\n            else\n            {\n                PQCQMIMSG pResponse = (PQCQMIMSG)cm_recv_buf;\n                int rc;\n                uint32_t sq_node = 0;\n                uint32_t sq_port = 0;\n\n                rc = qmi_recv(fd, &pResponse->MUXMsg, sizeof(cm_recv_buf) - sizeof(QCQMI_HDR), &sq_node, &sq_port);\n                if (debug_qmi)\n                    dbg_time(\"fd %d, node %u, port %x, len: %d\", fd, sq_node, sq_port, rc);\n\n                if (rc <= 0)\n                {\n                    dbg_time(\"%s read=%d errno: %d (%s)\",  __func__, rc, errno, strerror(errno));\n                    break;\n                }\n\n                for (i = 0; i < sizeof(qmiclientId)/sizeof(qmiclientId[0]); i++)\n                {\n                    if (qmiclientId[i] == fd)\n                    {\n                        pResponse->QMIHdr.QMIType = i;\n\n                        if (service_list[i].node != sq_node || service_list[i].port != sq_port) {\n                            continue;\n                        }\n                    }\n                }\n\n                pResponse->QMIHdr.IFType = USB_CTL_MSG_TYPE_QMI;\n                pResponse->QMIHdr.Length = cpu_to_le16(rc + sizeof(QCQMI_HDR)  - 1);\n                pResponse->QMIHdr.CtlFlags = 0x00;\n                pResponse->QMIHdr.ClientId = 0xaa;\n\n                QmiThreadRecvQMI(pResponse);\n            }\n        }\n    }\n\n_quit:\n    qmi_deinit();\n    close(ctrl_sock);\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_DISCONNECTED);\n    QmiThreadRecvQMI(NULL); //main thread may pending on QmiThreadSendQMI()\n    dbg_time(\"%s exit\", __func__);\n    pthread_exit(NULL);\n    return NULL;\n}\n\nconst struct qmi_device_ops qrtr_qmidev_ops = {\n\t.deinit = qmi_deinit,\n\t.send = qmi_send,\n\t.read = qmi_read,\n};\n\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/qrtr.h",
    "content": "/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */\n#ifndef _LINUX_QRTR_H\n#define _LINUX_QRTR_H\n\n#include <linux/socket.h>\n#include <linux/types.h>\n\n#ifndef AF_QIPCRTR\n#define AF_QIPCRTR 42\n#endif\n\n#define QRTR_NODE_BCAST\t0xffffffffu\n#define QRTR_PORT_CTRL\t0xfffffffeu\n\nstruct sockaddr_qrtr {\n\t__kernel_sa_family_t sq_family;\n\t__u32 sq_node;\n\t__u32 sq_port;\n};\n\nenum qrtr_pkt_type {\n\tQRTR_TYPE_DATA\t\t= 1,\n\tQRTR_TYPE_HELLO\t\t= 2,\n\tQRTR_TYPE_BYE\t\t= 3,\n\tQRTR_TYPE_NEW_SERVER\t= 4,\n\tQRTR_TYPE_DEL_SERVER\t= 5,\n\tQRTR_TYPE_DEL_CLIENT\t= 6,\n\tQRTR_TYPE_RESUME_TX\t= 7,\n\tQRTR_TYPE_EXIT          = 8,\n\tQRTR_TYPE_PING          = 9,\n\tQRTR_TYPE_NEW_LOOKUP\t= 10,\n\tQRTR_TYPE_DEL_LOOKUP\t= 11,\n};\n\n#define QRTR_TYPE_DEL_PROC 13\n\nstruct qrtr_ctrl_pkt {\n\t__le32 cmd;\n\n\tunion {\n\t\tstruct {\n\t\t\t__le32 service;\n\t\t\t__le32 instance;\n\t\t\t__le32 node;\n\t\t\t__le32 port;\n\t\t} server;\n\n\t\tstruct {\n\t\t\t__le32 node;\n\t\t\t__le32 port;\n\t\t} client;\n\n\t\tstruct {\n\t\t\t__le32 rsvd;\n\t\t\t__le32 node;\n\t\t} proc;\n\n\t};\n} __attribute__ ((packed));\n\n#define QRTR_PROTO_VER_1 1\n\nstruct qrtr_hdr_v1 {\n\t__le32 version;\n\t__le32 type;\n\t__le32 src_node_id;\n\t__le32 src_port_id;\n\t__le32 confirm_rx;\n\t__le32 size;\n\t__le32 dst_node_id;\n\t__le32 dst_port_id;\n} __attribute__ ((packed));\n\n#endif /* _LINUX_QRTR_H */\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/quectel-atc-proxy.c",
    "content": "/******************************************************************************\n  @file    quectel-atc-proxy.c\n  @brief   atc proxy.\n\n  DESCRIPTION\n  Connectivity Management Tool for USB network adapter of Quectel wireless cellular modules.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n#include <unistd.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <fcntl.h>\n#include <stddef.h>\n#include <pthread.h>\n#include <errno.h>\n#include <time.h>\n#include <signal.h>\n#include <getopt.h>\n#include <poll.h>\n#include <sys/time.h>\n#include <endian.h>\n#include <time.h>\n#include <sys/types.h>\n#include <limits.h>\n#include <inttypes.h>\n#include <sys/socket.h>\n#include <unistd.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <fcntl.h>\n#include <pthread.h>\n#include <poll.h>\n#include <sys/socket.h>\n#include <sys/time.h>\n#include <sys/ioctl.h>\n#include <linux/un.h>\n#include <linux/if.h>\n#include <dirent.h>\n#include <signal.h>\n#include <endian.h>\n#include <inttypes.h>\n\n#include \"qlist.h\"\n#include \"QMIThread.h\"\n#include \"atchannel.h\"\n#include \"at_tok.h\"\n\n#define dprintf(fmt, args...) do { fprintf(stdout, \"%s \" fmt, get_time(), ##args); } while(0);\n#define SYSCHECK(c) do{if((c)<0) {dprintf(\"%s %d error: '%s' (code: %d)\\n\", __func__, __LINE__, strerror(errno), errno); return -1;}}while(0)\n#define cfmakenoblock(fd) do{fcntl(fd, F_SETFL, fcntl(fd,F_GETFL) | O_NONBLOCK);}while(0)\n\n#define safe_free(__x) do { if (__x) { free((void *)__x); __x = NULL;}} while(0)\n#define safe_at_response_free(__x) { if (__x) { at_response_free(__x); __x = NULL;}}\n\n#define at_response_error(err, p_response) \\\n    (err \\\n    || p_response == NULL \\\n    || p_response->finalResponse == NULL \\\n    || p_response->success == 0)\n\ntypedef struct {\n    struct qlistnode qnode;\n    int ClientFd;\n    unsigned AccessTime;\n} ATC_PROXY_CONNECTION;\n\nstatic int atc_proxy_quit = 0;\nstatic pthread_t thread_id = 0;\nstatic int atc_dev_fd = -1;\nstatic int atc_proxy_server_fd = -1;\nstatic struct qlistnode atc_proxy_connection;\nstatic int verbose_debug = 0;\nstatic int modem_reset_flag = 0;\nstatic uint8_t atc_buf[4096];\nstatic int asr_style_atc =  0;\nextern int asprintf(char **s, const char *fmt, ...);\nstatic ATC_PROXY_CONNECTION *current_client_fd = NULL;\n\nstatic void dump_atc(uint8_t *pATC, int fd,int size, const char flag)\n{\n    if (verbose_debug) {\n        printf(\"%c %d:\\n\", flag, fd);\n        printf(\"%.*s\\n\", size, pATC);\n    }\n}\n\nstatic int send_atc_to_client(int clientFd, uint8_t *pATC, int size) {\n    struct pollfd pollfds[]= {{clientFd, POLLOUT, 0}};\n    ssize_t ret = 0;\n\n    do {\n        ret = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), 5000);\n    } while (ret == -1 && errno == EINTR && atc_proxy_quit == 0);\n\n    if (pollfds[0].revents & POLLOUT) {\n        ret = write(clientFd, pATC, size);\n    }\n\n    return ret;\n}\n\nstatic void onUnsolicited (const char *s, const char *sms_pdu)\n{\n    struct qlistnode *con_node;\n    int ret;\n    char buf[1024];\n\n    if(s) {\n        strcpy(buf, s);\n        strcat(buf, \"\\r\\n\");\n    }\n    if(sms_pdu) {\n        strcat(buf, sms_pdu);\n        strcat(buf, \"\\r\\n\");\n    }\n\n    if(current_client_fd) {\n        ATC_PROXY_CONNECTION *atc_con = current_client_fd;\n        ret = send_atc_to_client(atc_con->ClientFd, (uint8_t *)buf, strlen(buf));\n        if(ret < 0) {\n            close(atc_con->ClientFd);\n            qlist_remove(&atc_con->qnode);\n            free(atc_con); \n        }\n        return;\n    }\n\n    qlist_for_each(con_node, &atc_proxy_connection) {\n        ATC_PROXY_CONNECTION *atc_con = qnode_to_item(con_node, ATC_PROXY_CONNECTION, qnode);\n        if(atc_con && atc_con->ClientFd > 0) {\n            ret = send_atc_to_client(atc_con->ClientFd, (uint8_t *)buf, strlen(buf));\n            if(ret < 0) {\n                close(atc_con->ClientFd);\n                con_node = con_node->prev;\n                qlist_remove(&atc_con->qnode); \n                free(atc_con);\n                continue;\n            }\n        }\n    }\n}\n\nstatic void onTimeout(void) {\n    dprintf(\"%s\", __func__);\n    //TODO\n}\n\nstatic void onClose(void) {\n    dprintf(\"%s\", __func__);\n}\n\nstatic int create_local_server(const char *name) {\n    int sockfd = -1;\n    int reuse_addr = 1;\n    struct sockaddr_un sockaddr;\n    socklen_t alen;\n\n    /*Create server socket*/\n    SYSCHECK(sockfd = socket(AF_LOCAL, SOCK_STREAM, 0));\n\n    memset(&sockaddr, 0, sizeof(sockaddr));\n    sockaddr.sun_family = AF_LOCAL;\n    sockaddr.sun_path[0] = 0;\n    memcpy(sockaddr.sun_path + 1, name, strlen(name) );\n\n    alen = strlen(name) + offsetof(struct sockaddr_un, sun_path) + 1;\n    SYSCHECK(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse_addr,sizeof(reuse_addr)));\n    if(bind(sockfd, (struct sockaddr *)&sockaddr, alen) < 0) {\n        close(sockfd);\n        dprintf(\"bind %s errno: %d (%s)\\n\", name, errno, strerror(errno));\n        return -1;\n    }\n\n    dprintf(\"local server: %s sockfd = %d\\n\", name, sockfd);\n    cfmakenoblock(sockfd);\n    listen(sockfd, 1);    \n\n    return sockfd;\n}\n\nstatic void accept_atc_connection(int serverfd) {\n    int clientfd = -1;\n    unsigned char addr[128];\n    socklen_t alen = sizeof(addr);\n    ATC_PROXY_CONNECTION *atc_con;\n\n    clientfd = accept(serverfd, (struct sockaddr *)addr, &alen);\n\n    atc_con = (ATC_PROXY_CONNECTION *)malloc(sizeof(ATC_PROXY_CONNECTION));\n    if (atc_con) {\n        qlist_init(&atc_con->qnode);\n        atc_con->ClientFd= clientfd;\n        atc_con->AccessTime = 0;\n        dprintf(\"+++ ClientFd=%d\\n\", atc_con->ClientFd);\n        qlist_add_tail(&atc_proxy_connection, &atc_con->qnode);\n    }\n\n    cfmakenoblock(clientfd);\n}\n\nstatic void cleanup_atc_connection(int clientfd) {\n    struct qlistnode *con_node;\n    \n    qlist_for_each(con_node, &atc_proxy_connection) {\n        ATC_PROXY_CONNECTION *atc_con = qnode_to_item(con_node, ATC_PROXY_CONNECTION, qnode);\n        if (atc_con->ClientFd == clientfd) {\n            dprintf(\"--- ClientFd=%d\\n\", atc_con->ClientFd);    \n            close(atc_con->ClientFd);\n            qlist_remove(&atc_con->qnode);\n            free(atc_con);\n            if (current_client_fd == atc_con)\n                current_client_fd = NULL;\n            break;\n        }\n    }\n}\n\nstatic int atc_proxy_init(void) {\n    int err;\n    char *cmd;\n    ATResponse *p_response = NULL;\n\n    err = at_handshake();\n    if (err) {\n        dprintf(\"handshake fail, TODO ... \");\n        goto exit;\n    }\n\t\n    at_send_command_singleline(\"AT+QCFG=\\\"usbnet\\\"\", \"+QCFG:\", NULL);\n    at_send_command_multiline(\"AT+QNETDEVCTL=?\", \"+QNETDEVCTL:\", NULL);\n    at_send_command(\"AT+CGREG=2\", NULL); //GPRS Network Registration Status\n    at_send_command(\"AT+CEREG=2\", NULL); //EPS Network Registration Status\n    at_send_command(\"AT+C5GREG=2\", NULL); //5GS Network Registration Status\n\n    at_send_command_singleline(\"AT+QNETDEVSTATUS=?\", \"+QNETDEVSTATUS:\", &p_response);\n    if (at_response_error(err, p_response))\n        asr_style_atc = 1; //EC200T/EC100Y do not support this AT, but RG801/RG500U support \n\t\n    safe_at_response_free(p_response);\n\n    err = at_send_command_singleline(\"AT+QCFG=\\\"NAT\\\"\", \"+QCFG:\", &p_response);\n    if (!at_response_error(err, p_response)) {\n        int old_nat, new_nat = asr_style_atc ? 1 : 0;\n\n        err = at_tok_scanf(p_response->p_intermediates->line, \"%s%d\", NULL, &old_nat);\n        if (err == 2 && old_nat != new_nat) {\n            safe_at_response_free(p_response);\n            asprintf(&cmd, \"AT+QCFG=\\\"NAT\\\",%d\", new_nat);\n            err = at_send_command(cmd, &p_response);\n            safe_free(cmd);\n            if (!at_response_error(err, p_response)) {\n                err = at_send_command(\"at+cfun=1,1\",NULL);\n            }\n            safe_at_response_free(p_response);\n        }\n        err = 0;\n    }\n    safe_at_response_free(p_response);\n\nexit:\n    return err;\n}\n\nstatic void atc_start_server(const char* servername) {\n    atc_proxy_server_fd = create_local_server(servername);\n    dprintf(\"atc_proxy_server_fd = %d\\n\", atc_proxy_server_fd);\n    if (atc_proxy_server_fd == -1) {\n        dprintf(\"Failed to create %s, errno: %d (%s)\\n\", servername, errno, strerror(errno));\n    }\n}\n\nstatic void atc_close_server(const char* servername) {\n    if (atc_proxy_server_fd != -1) {\n        dprintf(\"%s %s close server\\n\", __func__, servername);\n        close(atc_proxy_server_fd);\n        atc_proxy_server_fd = -1;\n    }\n}\n\nstatic void *atc_proxy_loop(void *param)\n{\n    uint8_t *pATC = atc_buf;\n    struct qlistnode *con_node;\n    ATC_PROXY_CONNECTION *atc_con;\n\n    (void)param;\n    dprintf(\"%s enter thread_id %p\\n\", __func__, (void *)pthread_self());\n\n    qlist_init(&atc_proxy_connection);\n    while (atc_dev_fd > 0 && atc_proxy_quit == 0) {\n        struct pollfd pollfds[2+64];\n        int ne, ret, nevents = 0;\n        ssize_t nreads;\n\n        pollfds[nevents].fd = atc_dev_fd;\n        pollfds[nevents].events = POLLIN;\n        pollfds[nevents].revents= 0;\n        nevents++;\n        \n        if (atc_proxy_server_fd > 0) {\n            pollfds[nevents].fd = atc_proxy_server_fd;\n            pollfds[nevents].events = POLLIN;\n            pollfds[nevents].revents= 0;\n            nevents++;\n        }\n\n        qlist_for_each(con_node, &atc_proxy_connection) {\n            atc_con = qnode_to_item(con_node, ATC_PROXY_CONNECTION, qnode);\n            \n            pollfds[nevents].fd = atc_con->ClientFd;\n            pollfds[nevents].events = POLLIN;\n            pollfds[nevents].revents= 0;\n            nevents++;\n\n            if (nevents == (sizeof(pollfds)/sizeof(pollfds[0])))\n                break;\n        }\n\n        do {\n            ret = poll(pollfds, nevents, (atc_proxy_server_fd > 0) ? -1 : 200);\n         } while (ret == -1 && errno == EINTR && atc_proxy_quit == 0);\n         \n        if (ret < 0) {\n            dprintf(\"%s poll=%d, errno: %d (%s)\\n\", __func__, ret, errno, strerror(errno));\n            goto atc_proxy_loop_exit;\n        }\n\n        for (ne = 0; ne < nevents; ne++) {\n            int fd = pollfds[ne].fd;\n            short revents = pollfds[ne].revents;\n\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\n                dprintf(\"%s poll fd = %d, revents = %04x\\n\", __func__, fd, revents);\n                if (fd == atc_dev_fd) {\n                    goto atc_proxy_loop_exit;\n                } else if(fd == atc_proxy_server_fd) {\n                \n                } else {\n                    cleanup_atc_connection(fd);\n                }\n                continue;\n            }\n\n            if (!(pollfds[ne].revents & POLLIN)) {\n                continue;\n            }\n\n            if (fd == atc_proxy_server_fd) {\n                accept_atc_connection(fd);\n            }\n            else if (fd == atc_dev_fd) {\n                usleep(10*1000); //let atchannel.c read at response.\n                if (modem_reset_flag)\n                    goto atc_proxy_loop_exit;\n            }\n            else {\n                memset(atc_buf, 0x0, sizeof(atc_buf));\n                nreads = read(fd, pATC, sizeof(atc_buf));\n                if (nreads <= 0) {\n                    dprintf(\"%s read=%d errno: %d (%s)\",  __func__, (int)nreads, errno, strerror(errno));\n                    cleanup_atc_connection(fd);\n                    break;\n                }\n\n                dump_atc(pATC, fd, nreads, 'r');\n                qlist_for_each(con_node, &atc_proxy_connection) {\n                    atc_con = qnode_to_item(con_node, ATC_PROXY_CONNECTION, qnode);\n                    if (atc_con->ClientFd == pollfds[nevents].fd) {\n                        current_client_fd = atc_con;\n                        break;\n                    }\n                }\n                at_send_command ((const char *)pATC, NULL);\n                current_client_fd = NULL;\n            }\n        }\n    }\n\natc_proxy_loop_exit:\n    at_close();\n    while (!qlist_empty(&atc_proxy_connection)) {\n        ATC_PROXY_CONNECTION *atc_con = qnode_to_item(qlist_head(&atc_proxy_connection), ATC_PROXY_CONNECTION, qnode);\n        cleanup_atc_connection(atc_con->ClientFd);\n    }\n    dprintf(\"%s exit, thread_id %p\\n\", __func__, (void *)pthread_self());\n\n    return NULL;\n}\n\nstatic void usage(void) {\n    dprintf(\" -d <device_name>                      A valid atc device\\n\"\n            \"                                       default /dev/ttyUSB2, but /dev/ttyUSB2 may be invalid\\n\"\n            \" -i <netcard_name>                     netcard name\\n\"\n            \" -v                                    Will show all details\\n\");\n}\n\nstatic void sig_action(int sig) {\n    if (atc_proxy_quit == 0) {\n        atc_proxy_quit = 1;\n        if (thread_id)\n            pthread_kill(thread_id, sig);\n    }\n}\n\nint main(int argc, char *argv[]) {\n    int opt;\n    char atc_dev[32+1] = \"/dev/ttyUSB2\";\n    int retry_times = 0;\n    char servername[64] = {0};\n\n    optind = 1;\n    signal(SIGINT, sig_action);\n\n    while ( -1 != (opt = getopt(argc, argv, \"d:i:vh\"))) {\n        switch (opt) {\n            case 'd':\n                strcpy(atc_dev, optarg);\n                break;\n            case 'v':\n                verbose_debug = 1;\n                break;\n            default:\n                usage();\n                return 0;\n        }\n    }\n\n    if (access(atc_dev, R_OK | W_OK)) {\n        dprintf(\"Fail to access %s, errno: %d (%s). break\\n\", atc_dev, errno, strerror(errno));\n        return -1;\n    }\n\n          sprintf(servername, \"quectel-atc-proxy%c\", atc_dev[strlen(atc_dev) - 1]);\n    dprintf(\"Will use atc-dev='%s', proxy='%s'\\n\", atc_dev, servername);\n\n    while (atc_proxy_quit == 0) {\n        if (access(atc_dev, R_OK | W_OK)) {\n            dprintf(\"Fail to access %s, errno: %d (%s). continue\\n\", atc_dev, errno, strerror(errno));\n            // wait device\n            sleep(3);\n            continue;\n        }\n\n        atc_dev_fd = open(atc_dev, O_RDWR | O_NONBLOCK | O_NOCTTY);\n        if (atc_dev_fd == -1) {\n            dprintf(\"Failed to open %s, errno: %d (%s). break\\n\", atc_dev, errno, strerror(errno));\n            return -1;\n        }\n        cfmakenoblock(atc_dev_fd);\n        if (at_open(atc_dev_fd, onUnsolicited, 1)) {\n            close(atc_dev_fd);\n            atc_dev_fd = -1;\n        }\n        at_set_on_timeout(onTimeout);\n        at_set_on_reader_closed(onClose);\n\n        /* no atc_proxy_loop lives, create one */\n        pthread_create(&thread_id, NULL, atc_proxy_loop, NULL);\n        /* try to redo init if failed, init function must be successfully */\n        while (atc_proxy_init() != 0) {\n            if (retry_times < 5) {\n                dprintf(\"fail to init proxy, try again in 2 seconds.\\n\");\n                sleep(2);\n                retry_times++;\n            } else {\n                dprintf(\"has failed too much times, restart the modem and have a try...\\n\");\n                break;\n            }\n            /* break loop if modem is detached */\n            if (access(atc_dev, F_OK|R_OK|W_OK))\n                break;\n        }\n        retry_times = 0;\n        atc_start_server(servername);\n        if (atc_proxy_server_fd == -1)\n            pthread_cancel(thread_id); \n        pthread_join(thread_id, NULL);\n\n        /* close local server at last */\n        atc_close_server(servername);\n        close(atc_dev_fd);\n        /* DO RESTART IN 20s IF MODEM RESET ITSELF */\n        if (modem_reset_flag) {\n            unsigned int time_to_wait = 20;\n            while (time_to_wait) {\n                time_to_wait = sleep(time_to_wait);\n            }\n            modem_reset_flag = 0;\n        }\n    }\n\n    return 0;\n}"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/quectel-mbim-proxy.c",
    "content": "#include <unistd.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <fcntl.h>\n#include <pthread.h>\n#include <poll.h>\n#include <sys/socket.h>\n#include <sys/time.h>\n#include <sys/ioctl.h>\n#include <linux/un.h>\n#include <linux/in.h>\n#include <linux/if.h>\n#include <dirent.h>\n#include <signal.h>\n#include <inttypes.h>\n#include <getopt.h>\n#include \"qendian.h\"\n\n#define QUECTEL_MBIM_PROXY \"quectel-mbim-proxy\"\n#define safe_close(_fd) do { if (_fd > 0) { close(_fd); _fd = -1; } } while(0)\n\n#define CM_MAX_CLIENT 32\n#define TID_MASK (0xFFFFFF)\n#define TID_SHIFT (24)\n\ntypedef enum {\n    MBIM_OPEN_MSG = 1,\n    MBIM_CLOSE_MSG = 2,\n    MBIM_OPEN_DONE = 0x80000001,\n    MBIM_CLOSE_DONE = 0x80000002,\n} MBIM_MSG;\n\ntypedef struct {\n    unsigned int  MessageType;\n    unsigned int  MessageLength;\n    unsigned int  TransactionId;\n} MBIM_MESSAGE_HEADER;\n\ntypedef struct {\n    MBIM_MESSAGE_HEADER MessageHeader;\n    unsigned int MaxControlTransfer;\n} MBIM_OPEN_MSG_T;\n\ntypedef struct {\n    MBIM_MESSAGE_HEADER MessageHeader;\n    unsigned int Status;\n} MBIM_OPEN_DONE_T;\n\ntypedef struct {\n    int client_fd;\n    int client_idx;\n} CM_CLIENT_T;\n\nstatic unsigned char cm_recv_buffer[4096];\nstatic CM_CLIENT_T cm_clients[CM_MAX_CLIENT];\nstatic int verbose = 0;\n\nconst char * get_time(void) {\n    static char time_buf[128];\n    struct timeval  tv;\n    time_t time;\n    suseconds_t millitm;\n    struct tm *ti;\n\n    gettimeofday (&tv, NULL);\n\n    time= tv.tv_sec;\n    millitm = (tv.tv_usec + 500) / 1000;\n\n    if (millitm == 1000) {\n        ++time;\n        millitm = 0;\n    }\n\n    ti = localtime(&time);\n    sprintf(time_buf, \"[%02d-%02d_%02d:%02d:%02d:%03d]\", ti->tm_mon+1, ti->tm_mday, ti->tm_hour, ti->tm_min, ti->tm_sec, (int)millitm);\n    return time_buf;\n}\n\n#define mbim_debug(fmt, args...) do { fprintf(stdout, \"%s \" fmt, get_time(), ##args); } while(0);\n\nstatic int non_block_write(int fd, void *data, int len)\n{\n    int ret;\n    struct pollfd pollfd = {fd, POLLOUT, 0};\n    ret = poll(&pollfd, 1, 3000);\n\n    if (ret <= 0) {\n        mbim_debug(\"%s poll ret=%d, errno: %d(%s)\\n\", __func__, ret, errno, strerror(errno));\n    }\n\n    ret = write (fd, data, len);\n    if (ret != len)\n        mbim_debug(\"%s write ret=%d, errno: %d(%s)\\n\", __func__, ret, errno, strerror(errno));\n\n    return len;\n}\n\nstatic int mbim_send_open_msg(int mbim_dev_fd, uint32_t MaxControlTransfer) {\n    MBIM_OPEN_MSG_T open_msg;\n    MBIM_OPEN_MSG_T *pRequest = &open_msg;\n\n    pRequest->MessageHeader.MessageType = htole32(MBIM_OPEN_MSG);\n    pRequest->MessageHeader.MessageLength = htole32(sizeof(MBIM_OPEN_MSG_T));\n    pRequest->MessageHeader.TransactionId = htole32(1);\n    pRequest->MaxControlTransfer = htole32(MaxControlTransfer);\n\n    mbim_debug(\"%s()\\n\", __func__);\n    return non_block_write(mbim_dev_fd, pRequest, sizeof(MBIM_OPEN_MSG_T));\n}\n\n/*\n * parameter: proxy name\n * return: local proxy server fd or -1\n*/\nstatic int proxy_make_server(const char *proxy_name)\n{\n    int len, flag;\n    struct sockaddr_un sockaddr;\n    int mbim_server_fd;\n\n    mbim_server_fd = socket(AF_LOCAL, SOCK_STREAM, 0);\n    if (mbim_server_fd < 0) {\n        mbim_debug(\"socket failed: %s\\n\", strerror(errno));\n        return -1;\n    }\n    if (fcntl(mbim_server_fd, F_SETFL, fcntl(mbim_server_fd, F_GETFL) | O_NONBLOCK) < 0)\n        mbim_debug(\"fcntl set server(%d) NONBLOCK attribute failed: %s\\n\", mbim_server_fd, strerror(errno));\n\n    memset(&sockaddr, 0, sizeof(sockaddr));\n    sockaddr.sun_family = AF_LOCAL;\n    sockaddr.sun_path[0] = 0;\n    snprintf(sockaddr.sun_path, UNIX_PATH_MAX, \"0%s\", proxy_name);\n    sockaddr.sun_path[0] = '\\0';  // string starts with leading '\\0'\n    flag = 1;\n    if (setsockopt(mbim_server_fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)) < 0) {\n        safe_close(mbim_server_fd);\n        mbim_debug(\"setsockopt failed\\n\");\n    }\n\n    len = strlen(proxy_name) + offsetof(struct sockaddr_un, sun_path) + 1;\n    if (bind(mbim_server_fd, (struct sockaddr*)&sockaddr, len) < 0) {\n        safe_close(mbim_server_fd);\n        mbim_debug(\"bind failed: %s\\n\", strerror(errno));\n        return -1;\n    }\n\n    listen(mbim_server_fd, 4);\n    return mbim_server_fd;\n}\n\nstatic int handle_client_connect(int server_fd)\n{\n    int i, client_fd;\n    struct sockaddr_in cli_addr;\n    socklen_t len = sizeof(cli_addr);\n\n    client_fd = accept(server_fd, (struct sockaddr *)&cli_addr, &len);\n    if (client_fd < 0) {\n        mbim_debug(\"proxy accept failed: %s\\n\", strerror(errno));\n        return -1;\n    }\n\n    if (fcntl(client_fd, F_SETFL, fcntl(client_fd, F_GETFL) | O_NONBLOCK) < 0)\n        mbim_debug(\"fcntl set client(%d) NONBLOCK attribute failed: %s\\n\", client_fd, strerror(errno));\n\n    for (i = 0; i < CM_MAX_CLIENT; i++) {\n        if (cm_clients[i].client_fd <= 0) {\n            cm_clients[i].client_fd = client_fd;\n            cm_clients[i].client_idx= i+1;\n            mbim_debug(\"%s client_fd=%d, client_idx=%d\\n\", __func__, cm_clients[i].client_fd, cm_clients[i].client_idx);\n            return 0;\n        }\n    }\n\n    close(client_fd);\n    return -1;\n}\n\nstatic void handle_client_disconnect(int client_fd)\n{\n    int i;\n\n    for (i = 0; i < CM_MAX_CLIENT; i++) {\n        if (cm_clients[i].client_fd == client_fd) {\n            mbim_debug(\"%s client_fd=%d, client_idx=%d\\n\", __func__, cm_clients[i].client_fd, cm_clients[i].client_idx);\n            safe_close(cm_clients[i].client_fd);\n            return;\n        }\n    }\n}\n\nstatic int handle_client_request(int mbim_dev_fd, int client_fd, void *pdata, int len)\n{\n    int i;\n    int client_idx = -1;\n    int ret;\n    MBIM_MESSAGE_HEADER *pRequest = (MBIM_MESSAGE_HEADER *)pdata;\n    unsigned int  TransactionId = le32toh(pRequest->TransactionId);\n\n    for (i = 0; i < CM_MAX_CLIENT; i++) {\n        if (cm_clients[i].client_fd == client_fd) {\n            client_idx = cm_clients[i].client_idx;\n            break;\n        }\n    }\n\n    if (client_idx == -1) {\n        goto error;\n    }\n\n    if (le32toh(pRequest->MessageType) == MBIM_OPEN_MSG\n        || le32toh(pRequest->MessageType) == MBIM_CLOSE_MSG) {\n        MBIM_OPEN_DONE_T OpenDone;\n        OpenDone.MessageHeader.MessageType = htole32(le32toh(pRequest->MessageType) | 0x80000000);\n        OpenDone.MessageHeader.MessageLength = htole32(sizeof(OpenDone));\n        OpenDone.MessageHeader.TransactionId = htole32(TransactionId);\n        OpenDone.Status = htole32(0);\n        non_block_write (client_fd, &OpenDone, sizeof(OpenDone));\n        return 0;\n    }\n\n    /* transfer TransicationID to proxy transicationID and record in sender list */\n    pRequest->TransactionId = htole32(TransactionId | (client_idx << TID_SHIFT));\n    if (verbose) mbim_debug(\"REQ client_fd=%d, client_idx=%d, tid=%u\\n\",\n        cm_clients[client_idx].client_fd, cm_clients[client_idx].client_idx, TransactionId);\n    ret = non_block_write (mbim_dev_fd, pRequest, len);\n    if (ret == len)\n        return 0;\n\nerror:\n    return -1;\n}\n\n/*\n * Will read message from device and transfer it to clients/client\n * Notice:\n *  unsocial message will be send to all clients\n */\nstatic int handle_device_response(void *pdata, int len)\n{\n    int i;\n    MBIM_MESSAGE_HEADER *pResponse = (MBIM_MESSAGE_HEADER *)pdata;\n    unsigned int  TransactionId = le32toh(pResponse->TransactionId);\n\n    /* unsocial/function error message */\n    if (TransactionId == 0) {\n        for (i = 0; i < CM_MAX_CLIENT; i++) {\n            if (cm_clients[i].client_fd > 0) {\n                non_block_write(cm_clients[i].client_fd, pResponse, len);\n            }\n        }\n    }\n    else {\n        /* try to find the sender */\n        int client_idx = (TransactionId >> TID_SHIFT);\n\n        for (i = 0; i < CM_MAX_CLIENT; i++) {\n            if (cm_clients[i].client_idx == client_idx && cm_clients[i].client_fd > 0) {\n                TransactionId &= TID_MASK;\n                pResponse->TransactionId = htole32(TransactionId);\n                if (verbose) mbim_debug(\"RSP client_fd=%d, client_idx=%d, tid=%u\\n\",\n                    cm_clients[i].client_fd, cm_clients[i].client_idx, TransactionId);\n                non_block_write(cm_clients[i].client_fd, pResponse, len);\n                break;\n            }\n        }\n\n        if (i == CM_MAX_CLIENT) {\n           mbim_debug(\"%s nobody care tid=%u\\n\", __func__, TransactionId);     \n        }\n    }\n\n    return 0;\n}\n\nstatic int proxy_loop(int mbim_dev_fd)\n{\n    int i;\n    int mbim_server_fd = -1;\n\n    while (mbim_dev_fd > 0) {\n        struct pollfd pollfds[2+CM_MAX_CLIENT];\n        int ne, ret, nevents = 0;\n\n        pollfds[nevents].fd = mbim_dev_fd;\n        pollfds[nevents].events = POLLIN;\n        pollfds[nevents].revents= 0;\n        nevents++;\n        \n        if (mbim_server_fd > 0) {\n            pollfds[nevents].fd = mbim_server_fd;\n            pollfds[nevents].events = POLLIN;\n            pollfds[nevents].revents= 0;\n            nevents++;\n\n            for (i = 0; i < CM_MAX_CLIENT; i++) {\n                if (cm_clients[i].client_fd > 0) {\n                    pollfds[nevents].fd = cm_clients[i].client_fd;\n                    pollfds[nevents].events = POLLIN;\n                    pollfds[nevents].revents= 0;\n                    nevents++;\n                }\n            }\n        }\n\n        ret = poll(pollfds, nevents, (mbim_server_fd > 0) ? -1 : (10*1000));\n        if (ret <= 0) {\n            goto error;\n        }\n\n        for (ne = 0; ne < nevents; ne++) {\n            int fd = pollfds[ne].fd;\n            short revents = pollfds[ne].revents;\n\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\n                mbim_debug(\"%s poll fd = %d, revents = %04x\\n\", __func__, fd, revents);\n                if (fd == mbim_dev_fd) {\n                    goto error;\n                } else if(fd == mbim_server_fd) {\n                \n                } else {\n                    handle_client_disconnect(fd);\n                }\n                continue;\n            }\n\n            if (!(pollfds[ne].revents & POLLIN)) {\n                continue;\n            }\n\n            if (fd == mbim_server_fd) {\n                handle_client_connect(fd);\n            }\n            else {\n                    int len = read(fd, cm_recv_buffer, sizeof(cm_recv_buffer));\n\n                    if (len <= 0) {\n                        mbim_debug(\"%s read fd=%d, len=%d, errno: %d(%s)\\n\", __func__, fd, len, errno, strerror(errno));\n                        if (fd == mbim_dev_fd)\n                            goto error;\n                        else\n                            handle_client_disconnect(fd);\n\n                        return len;\n                    }\n\n                    if (fd == mbim_dev_fd) {\n                        if (mbim_server_fd == -1) {\n                            MBIM_OPEN_DONE_T *pOpenDone = (MBIM_OPEN_DONE_T *)cm_recv_buffer;\n\n                            if (le32toh(pOpenDone->MessageHeader.MessageType) == MBIM_OPEN_DONE) {\n                                mbim_debug(\"receive MBIM_OPEN_DONE, status=%d\\n\", htole32(pOpenDone->Status));\n                                if (htole32(pOpenDone->Status))\n                                    goto error;\n                                mbim_server_fd = proxy_make_server(QUECTEL_MBIM_PROXY);\n                                mbim_debug(\"mbim_server_fd=%d\\n\", mbim_server_fd);\n                            }\n                        }\n                        else {\n                            handle_device_response(cm_recv_buffer, len);\n                        }\n                    }\n                    else {\n                        handle_client_request(mbim_dev_fd, fd, cm_recv_buffer, len);\n                    }\n            }\n        }\n    }\n\nerror:\n    safe_close(mbim_server_fd);\n    for (i = 0; i < CM_MAX_CLIENT; i++) {\n        safe_close(cm_clients[i].client_fd);\n    }\n\n    mbim_debug(\"%s exit\\n\", __func__);\n    return 0;\n}\n\n/*\n * How to use this proxy?\n * 1. modprobe -a 8021q\n * 2. Create network interface for channels: \n *      ip link add link wwan0 name wwan0.1 type vlan id 1\n *      ip link add link wwan0 name wwan0.2 type vlan id 2\n * 3. Start './mbim-proxy' with -d 'device'\n * 4. Start Clients: ./quectel-CM -n id1\n * 5. Start Clients: ./quectel-CM -n id2\n * ...\n * Notice:\n *      mbim-proxy can work in backgroud as a daemon\n *      '-n' sessionID\n *  The modem may not support multi-PDN mode or how many PDN it supports is undefined. It depends!!!\n *  Besides, some modem also may not support some sessionID. For instance EC20 doesn't support SessionId 1... \n */\nint main(int argc, char **argv)\n{\n    int optidx = 0;\n    int opt;\n    char *optstr = \"d:vh\";\n    const char *device = \"/dev/cdc-wdm0\";\n\n    struct option options[] = {\n        {\"verbose\", no_argument,        NULL, 'v'},\n        {\"device\", required_argument,   NULL, 'd'},\n        {0, 0, 0, 0},\n    };\n    while ((opt = getopt_long(argc, argv, optstr, options, &optidx)) != -1) {\n        switch (opt) {\n        case 'v':\n            verbose = 1;\n            break;\n        case 'd':\n            device = optarg;\n            break;\n        case 'h':\n            mbim_debug(\"-h              Show this message\\n\");\n            mbim_debug(\"-v              Verbose\\n\");\n            mbim_debug(\"-d [device]     MBIM device\\n\");\n            return 0;\n        default:\n            mbim_debug(\"illegal argument\\n\");\n            return -1;\n        }\n    }\n\n    if (!device) {\n        mbim_debug(\"Missing parameter: device\\n\");\n        return -1;\n    }\n\n    while (1) {\n        int mbim_dev_fd = open(device, O_RDWR | O_NONBLOCK | O_NOCTTY);\n        if (mbim_dev_fd < 0) {\n            mbim_debug(\"cannot open mbim_device %s: %s\\n\", device, strerror(errno));\n            sleep(2);\n            continue;\n        }\n        mbim_debug (\"mbim_dev_fd=%d\\n\", mbim_dev_fd);\n\n        memset(cm_clients, 0, sizeof(cm_clients));\n        mbim_send_open_msg(mbim_dev_fd, sizeof(cm_recv_buffer));\n        proxy_loop(mbim_dev_fd);\n        safe_close(mbim_dev_fd);\n    }\n\n    return -1;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/quectel-qmi-proxy.c",
    "content": "/******************************************************************************\n  @file    quectel-qmi-proxy.c\n  @brief   The qmi proxy.\n\n  DESCRIPTION\n  Connectivity Management Tool for USB network adapter of Quectel wireless cellular modules.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n#include <unistd.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <fcntl.h>\n#include <pthread.h>\n#include <poll.h>\n#include <sys/socket.h>\n#include <sys/time.h>\n#include <sys/ioctl.h>\n#include <linux/un.h>\n#include <linux/if.h>\n#include <dirent.h>\n#include <signal.h>\n#include <inttypes.h>\n\n#include \"qendian.h\"\n#include \"qlist.h\"\n#include \"QCQMI.h\"\n#include \"QCQCTL.h\"\n#include \"QCQMUX.h\"\n\n#ifndef MIN\n#define MIN(a, b)\t((a) < (b)? (a): (b))\n#endif\n\nconst char * get_time(void) {\n    static char time_buf[128];\n    struct timeval  tv;\n    time_t time;\n    suseconds_t millitm;\n    struct tm *ti;\n\n    gettimeofday (&tv, NULL);\n\n    time= tv.tv_sec;\n    millitm = (tv.tv_usec + 500) / 1000;\n\n    if (millitm == 1000) {\n        ++time;\n        millitm = 0;\n    }\n\n    ti = localtime(&time);\n    sprintf(time_buf, \"[%02d-%02d_%02d:%02d:%02d:%03d]\", ti->tm_mon+1, ti->tm_mday, ti->tm_hour, ti->tm_min, ti->tm_sec, (int)millitm);\n    return time_buf;\n}\n\n#define dprintf(fmt, args...) do { fprintf(stdout, \"%s \" fmt, get_time(), ##args); } while(0);\n#define SYSCHECK(c) do{if((c)<0) {dprintf(\"%s %d error: '%s' (code: %d)\\n\", __func__, __LINE__, strerror(errno), errno); return -1;}}while(0)\n#define cfmakenoblock(fd) do{fcntl(fd, F_SETFL, fcntl(fd,F_GETFL) | O_NONBLOCK);}while(0)\n\ntypedef struct {\n    struct qlistnode qnode;\n    int ClientFd;\n    QCQMIMSG qmi[0];\n} QMI_PROXY_MSG;\n\ntypedef struct {\n    struct qlistnode qnode;\n    uint8_t QMIType;\n    uint8_t ClientId;\n    unsigned AccessTime;\n} QMI_PROXY_CLINET;\n\ntypedef struct {\n    struct qlistnode qnode;\n    struct qlistnode client_qnode;\n    int ClientFd;\n    unsigned AccessTime;\n} QMI_PROXY_CONNECTION;\n\n#ifdef QUECTEL_QMI_MERGE\n#define MERGE_PACKET_IDENTITY 0x2c7c\n#define MERGE_PACKET_VERSION 0x0001\n#define MERGE_PACKET_MAX_PAYLOAD_SIZE 56\ntypedef struct __QMI_MSG_HEADER {\n    uint16_t idenity;\n    uint16_t version;\n    uint16_t cur_len;\n    uint16_t total_len;\n} QMI_MSG_HEADER;\n\ntypedef struct __QMI_MSG_PACKET {\n    QMI_MSG_HEADER header;\n    uint16_t len;\n    char buf[4096];\n} QMI_MSG_PACKET;\n#endif\n\nstatic int qmi_proxy_quit = 0;\nstatic pthread_t thread_id = 0;\nstatic int cdc_wdm_fd = -1;\nstatic int qmi_proxy_server_fd = -1;\nstatic struct qlistnode qmi_proxy_connection;\nstatic struct qlistnode qmi_proxy_ctl_msg;\nstatic int verbose_debug = 0;\nstatic int modem_reset_flag = 0;\nstatic int qmi_sync_done = 0;\nstatic uint8_t qmi_buf[4096];\n\nstatic int send_qmi_to_cdc_wdm(PQCQMIMSG pQMI);\n\n#ifdef QUECTEL_QMI_MERGE\nstatic int merge_qmi_rsp_packet(void *buf, ssize_t *src_size) {\n    static QMI_MSG_PACKET s_QMIPacket;\n    QMI_MSG_HEADER *header = NULL;\n    ssize_t size = *src_size;\n\n    if((uint16_t)size < sizeof(QMI_MSG_HEADER))\n        return -1;\n\n    header = (QMI_MSG_HEADER *)buf;\n    if(le16toh(header->idenity) != MERGE_PACKET_IDENTITY || le16toh(header->version) != MERGE_PACKET_VERSION || le16toh(header->cur_len) > le16toh(header->total_len)) \n        return -1;\n\n    if(le16toh(header->cur_len) == le16toh(header->total_len)) {\n        *src_size = le16toh(header->total_len);\n        memcpy(buf, buf + sizeof(QMI_MSG_HEADER), *src_size);\n        s_QMIPacket.len = 0;  \n        return 0;\n    } \n\n    memcpy(s_QMIPacket.buf + s_QMIPacket.len, buf + sizeof(QMI_MSG_HEADER), le16toh(header->cur_len));\n    s_QMIPacket.len += le16toh(header->cur_len);\n\n    if (le16toh(header->cur_len) < MERGE_PACKET_MAX_PAYLOAD_SIZE || s_QMIPacket.len >= le16toh(header->total_len)) { \n       memcpy(buf, s_QMIPacket.buf, s_QMIPacket.len);      \n       *src_size = s_QMIPacket.len;\n       s_QMIPacket.len = 0;\n       return 0;           \n    }\n\n    return -1;\n}\n#endif\n\nstatic int create_local_server(const char *name) {\n    int sockfd = -1;\n    int reuse_addr = 1;\n    struct sockaddr_un sockaddr;\n    socklen_t alen;\n\n    /*Create server socket*/\n    SYSCHECK(sockfd = socket(AF_LOCAL, SOCK_STREAM, 0));\n\n    memset(&sockaddr, 0, sizeof(sockaddr));\n    sockaddr.sun_family = AF_LOCAL;\n    sockaddr.sun_path[0] = 0;\n    memcpy(sockaddr.sun_path + 1, name, strlen(name) );\n\n    alen = strlen(name) + offsetof(struct sockaddr_un, sun_path) + 1;\n    SYSCHECK(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse_addr,sizeof(reuse_addr)));\n    if(bind(sockfd, (struct sockaddr *)&sockaddr, alen) < 0) {\n        dprintf(\"bind %s errno: %d (%s)\\n\", name, errno, strerror(errno));\n        close(sockfd);\n        return -1;\n    }\n\n    dprintf(\"local server: %s sockfd = %d\\n\", name, sockfd);\n    cfmakenoblock(sockfd);\n    listen(sockfd, 1);    \n\n    return sockfd;\n}\n\nstatic void accept_qmi_connection(int serverfd) {\n    int clientfd = -1;\n    unsigned char addr[128];\n    socklen_t alen = sizeof(addr);\n    QMI_PROXY_CONNECTION *qmi_con;\n\n    clientfd = accept(serverfd, (struct sockaddr *)addr, &alen);\n\n    qmi_con = (QMI_PROXY_CONNECTION *)malloc(sizeof(QMI_PROXY_CONNECTION));\n    if (qmi_con) {\n        qlist_init(&qmi_con->qnode);\n        qlist_init(&qmi_con->client_qnode);\n        qmi_con->ClientFd= clientfd;\n        qmi_con->AccessTime = 0;\n        dprintf(\"+++ ClientFd=%d\\n\", qmi_con->ClientFd);\n        qlist_add_tail(&qmi_proxy_connection, &qmi_con->qnode);\n    }\n\n    cfmakenoblock(clientfd);\n}\n\nstatic void cleanup_qmi_connection(int clientfd, int clientDisconnect) {\n    struct qlistnode *con_node, *qmi_node;\n    \n    qlist_for_each(con_node, &qmi_proxy_connection) {\n        QMI_PROXY_CONNECTION *qmi_con = qnode_to_item(con_node, QMI_PROXY_CONNECTION, qnode);\n\n        if (qmi_con->ClientFd == clientfd) {\n            while (!qlist_empty(&qmi_con->client_qnode)) {\n                QMI_PROXY_CLINET *qmi_client = qnode_to_item(qlist_head(&qmi_con->client_qnode), QMI_PROXY_CLINET, qnode);\n\n                if (clientDisconnect) {\n                    int size = 17;\n                    QMI_PROXY_MSG *qmi_msg = malloc(sizeof(QMI_PROXY_MSG) + size);\n                    PQCQMIMSG pQMI = &qmi_msg->qmi[0];\n\n                    dprintf(\"xxx ClientFd=%d QMIType=%d ClientId=%d\\n\", qmi_con->ClientFd, qmi_client->QMIType, qmi_client->ClientId);\n                    qlist_init(&qmi_msg->qnode);\n                    qmi_msg->ClientFd = qmi_proxy_server_fd;\n                    pQMI->QMIHdr.IFType   = USB_CTL_MSG_TYPE_QMI;\n                    pQMI->QMIHdr.Length = htole16(16);\n                    pQMI->QMIHdr.CtlFlags = 0x00;\n                    pQMI->QMIHdr.QMIType  = QMUX_TYPE_CTL;\n                    pQMI->QMIHdr.ClientId= 0x00;\n                    pQMI->CTLMsg.ReleaseClientIdReq.CtlFlags = QMICTL_FLAG_REQUEST;\n                    pQMI->CTLMsg.ReleaseClientIdReq.TransactionId = 255;    \n                    pQMI->CTLMsg.ReleaseClientIdReq.QMICTLType = htole16(QMICTL_RELEASE_CLIENT_ID_REQ);\n                    pQMI->CTLMsg.ReleaseClientIdReq.Length = htole16(5);\n                    pQMI->CTLMsg.ReleaseClientIdReq.TLVType = QCTLV_TYPE_REQUIRED_PARAMETER;\n                    pQMI->CTLMsg.ReleaseClientIdReq.TLVLength = htole16(2);\n                    pQMI->CTLMsg.ReleaseClientIdReq.QMIType = qmi_client->QMIType;\n                    pQMI->CTLMsg.ReleaseClientIdReq.ClientId = qmi_client->ClientId;\n\n                    if (qlist_empty(&qmi_proxy_ctl_msg))\n                        send_qmi_to_cdc_wdm(pQMI);\n                    qlist_add_tail(&qmi_proxy_ctl_msg, &qmi_msg->qnode);\n                }\n                \n                qlist_remove(&qmi_client->qnode);\n                free(qmi_client);\n            }\n           \n            qlist_for_each(qmi_node, &qmi_proxy_ctl_msg) {\n                QMI_PROXY_MSG *qmi_msg = qnode_to_item(qmi_node, QMI_PROXY_MSG, qnode);\n\n                if (qmi_msg->ClientFd == qmi_con->ClientFd) {\n                    qlist_remove(&qmi_msg->qnode);\n                    free(qmi_msg);\n                    break;\n                 }\n            }\n\n            dprintf(\"--- ClientFd=%d\\n\", qmi_con->ClientFd);    \n            close(qmi_con->ClientFd);\n            qlist_remove(&qmi_con->qnode);\n            free(qmi_con);\n            break;\n        }\n    }\n}\n\nstatic void get_client_id(QMI_PROXY_CONNECTION *qmi_con, PQMICTL_GET_CLIENT_ID_RESP_MSG pClient) {\n    if (pClient->QMIResult == 0 && pClient->QMIError == 0) {\n        QMI_PROXY_CLINET *qmi_client = (QMI_PROXY_CLINET *)malloc(sizeof(QMI_PROXY_CLINET));\n\n        qlist_init(&qmi_client->qnode);\n        qmi_client->QMIType = pClient->QMIType;\n        qmi_client->ClientId = pClient->ClientId;\n        qmi_client->AccessTime = 0;\n\n        dprintf(\"+++ ClientFd=%d QMIType=%d ClientId=%d\\n\", qmi_con->ClientFd, qmi_client->QMIType, qmi_client->ClientId);\n        qlist_add_tail(&qmi_con->client_qnode, &qmi_client->qnode);\n    }\n}\n\nstatic void release_client_id(QMI_PROXY_CONNECTION *qmi_con, PQMICTL_RELEASE_CLIENT_ID_RESP_MSG pClient) {\n    struct qlistnode *client_node;\n    \n    if (pClient->QMIResult == 0 && pClient->QMIError == 0) {\n        qlist_for_each (client_node, &qmi_con->client_qnode) {\n            QMI_PROXY_CLINET *qmi_client = qnode_to_item(client_node, QMI_PROXY_CLINET, qnode);\n            \n            if (pClient->QMIType == qmi_client->QMIType && pClient->ClientId == qmi_client->ClientId) {\n                dprintf(\"--- ClientFd=%d QMIType=%d ClientId=%d\\n\", qmi_con->ClientFd, qmi_client->QMIType, qmi_client->ClientId);\n                qlist_remove(&qmi_client->qnode);\n                free(qmi_client);\n                break;\n            }\n        }\n    }\n}\n\nstatic void dump_qmi(PQCQMIMSG pQMI, int fd, const char flag)\n{\n    if (verbose_debug)\n    {\n        unsigned i;\n        unsigned size = le16toh(pQMI->QMIHdr.Length) + 1;\n        char buf[128];\n        int cnt = 0;\n\n        cnt += snprintf(buf + cnt, sizeof(buf) - cnt, \"%c %d %u: \", flag, fd, size);\n        for (i = 0; i < size && i < 24; i++)\n            cnt += snprintf(buf + cnt, sizeof(buf) - cnt, \"%02x \", ((uint8_t *)pQMI)[i]);\n        dprintf(\"%s\\n\", buf)\n    }\n}\n\nstatic int send_qmi_to_cdc_wdm(PQCQMIMSG pQMI) {\n    struct pollfd pollfds[]= {{cdc_wdm_fd, POLLOUT, 0}};\n    ssize_t ret = 0;\n\n    do {\n        ret = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), 5000);\n    } while (ret == -1 && errno == EINTR && qmi_proxy_quit == 0);\n\n    if (pollfds[0].revents & POLLOUT) {\n        ssize_t size = le16toh(pQMI->QMIHdr.Length) + 1;\n        ret = write(cdc_wdm_fd, pQMI, size);\n        dump_qmi(pQMI, cdc_wdm_fd, 'w');\n    }\n\n    return ret;\n}\n\nstatic int send_qmi_to_client(PQCQMIMSG pQMI, int clientFd) {\n    struct pollfd pollfds[]= {{clientFd, POLLOUT, 0}};\n    ssize_t ret = 0;\n\n    do {\n        ret = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), 5000);\n    } while (ret == -1 && errno == EINTR && qmi_proxy_quit == 0);\n\n    if (pollfds[0].revents & POLLOUT) {\n        ssize_t size = le16toh(pQMI->QMIHdr.Length) + 1;\n        ret = write(clientFd, pQMI, size);\n        dump_qmi(pQMI, clientFd, 'w');\n    }\n\n    return ret;\n}\n\nstatic void recv_qmi_from_dev(PQCQMIMSG pQMI) {\n    struct qlistnode *con_node, *client_node;\n\n    if (qmi_proxy_server_fd == -1) {\n        qmi_sync_done = 1;\n    }\n    else if (pQMI->QMIHdr.QMIType == QMUX_TYPE_CTL) {\n        if (pQMI->CTLMsg.QMICTLMsgHdr.CtlFlags == QMICTL_CTL_FLAG_RSP) {            \n            if (!qlist_empty(&qmi_proxy_ctl_msg)) {\n                QMI_PROXY_MSG *qmi_msg = qnode_to_item(qlist_head(&qmi_proxy_ctl_msg), QMI_PROXY_MSG, qnode);\n\n                if (qmi_msg->qmi[0].CTLMsg.QMICTLMsgHdrRsp.TransactionId != pQMI->CTLMsg.QMICTLMsgHdrRsp.TransactionId\n                    || qmi_msg->qmi[0].CTLMsg.QMICTLMsgHdrRsp.QMICTLType != pQMI->CTLMsg.QMICTLMsgHdrRsp.QMICTLType) {\n                    dprintf(\"ERROR: ctl rsp tid:%d, type:%d - ctl req %d, %d\\n\",\n                        pQMI->CTLMsg.QMICTLMsgHdrRsp.TransactionId, pQMI->CTLMsg.QMICTLMsgHdrRsp.QMICTLType,\n                        qmi_msg->qmi[0].CTLMsg.QMICTLMsgHdrRsp.TransactionId, qmi_msg->qmi[0].CTLMsg.QMICTLMsgHdrRsp.QMICTLType);\n                }\n                else if (qmi_msg->ClientFd == qmi_proxy_server_fd) {\n                    if (le16toh(pQMI->CTLMsg.QMICTLMsgHdrRsp.QMICTLType) == QMICTL_RELEASE_CLIENT_ID_RESP) {\n                        dprintf(\"--- ClientFd=%d QMIType=%d ClientId=%d\\n\", qmi_proxy_server_fd,\n                                pQMI->CTLMsg.ReleaseClientIdRsp.QMIType,  pQMI->CTLMsg.ReleaseClientIdRsp.ClientId);\n                    }\n                }\n                else {\n                    qlist_for_each(con_node, &qmi_proxy_connection) {\n                        QMI_PROXY_CONNECTION *qmi_con = qnode_to_item(con_node, QMI_PROXY_CONNECTION, qnode);\n\n                        if (qmi_con->ClientFd == qmi_msg->ClientFd) {\n                            send_qmi_to_client(pQMI, qmi_msg->ClientFd);\n\n                            if (le16toh(pQMI->CTLMsg.QMICTLMsgHdrRsp.QMICTLType) == QMICTL_GET_CLIENT_ID_RESP) {\n                                get_client_id(qmi_con, &pQMI->CTLMsg.GetClientIdRsp);                                                        \n                            }\n                            else if (le16toh(pQMI->CTLMsg.QMICTLMsgHdrRsp.QMICTLType) == QMICTL_RELEASE_CLIENT_ID_RESP) {\n                                release_client_id(qmi_con, &pQMI->CTLMsg.ReleaseClientIdRsp);\n                            }\n                            else {\n                            }\n                        }\n                    }\n                }\n\n                qlist_remove(&qmi_msg->qnode);\n                free(qmi_msg);\n\n                if (!qlist_empty(&qmi_proxy_ctl_msg)) {\n                    QMI_PROXY_MSG *qmi_msg = qnode_to_item(qlist_head(&qmi_proxy_ctl_msg), QMI_PROXY_MSG, qnode);\n\n                    send_qmi_to_cdc_wdm(qmi_msg->qmi);\n                }\n            }\n        } \n        else if (pQMI->QMIHdr.QMIType == QMICTL_CTL_FLAG_IND) {\n            if (le16toh(pQMI->CTLMsg.QMICTLMsgHdrRsp.QMICTLType) == QMICTL_REVOKE_CLIENT_ID_IND) {\n                modem_reset_flag = 1;\n            }\n        }\n    }\n    else  {\n        qlist_for_each(con_node, &qmi_proxy_connection) {\n            QMI_PROXY_CONNECTION *qmi_con = qnode_to_item(con_node, QMI_PROXY_CONNECTION, qnode);\n            \n            qlist_for_each(client_node, &qmi_con->client_qnode) {\n                QMI_PROXY_CLINET *qmi_client = qnode_to_item(client_node, QMI_PROXY_CLINET, qnode);\n                if (pQMI->QMIHdr.QMIType == qmi_client->QMIType) {\n                    if (pQMI->QMIHdr.ClientId == 0 || pQMI->QMIHdr.ClientId == qmi_client->ClientId) {\n                        send_qmi_to_client(pQMI, qmi_con->ClientFd);\n                    }\n                }\n            }\n        }\n    }\n}\n\nstatic int recv_qmi_from_client(PQCQMIMSG pQMI, unsigned size, int clientfd) {\n    if (qmi_proxy_server_fd == -1)\n        return -1;\n\n    if (pQMI->QMIHdr.QMIType == QMUX_TYPE_CTL) {  \n        QMI_PROXY_MSG *qmi_msg;\n\n        if (pQMI->CTLMsg.QMICTLMsgHdr.QMICTLType == QMICTL_SYNC_REQ) {\n            dprintf(\"do not allow client send QMICTL_SYNC_REQ\\n\");\n            return 0;\n        }\n\n        qmi_msg = malloc(sizeof(QMI_PROXY_MSG) + size);\n        qlist_init(&qmi_msg->qnode);\n        qmi_msg->ClientFd = clientfd;\n        memcpy(qmi_msg->qmi, pQMI, size);\n\n        if (qlist_empty(&qmi_proxy_ctl_msg))\n            send_qmi_to_cdc_wdm(pQMI);\n        qlist_add_tail(&qmi_proxy_ctl_msg, &qmi_msg->qnode);\n    }\n    else {\n        send_qmi_to_cdc_wdm(pQMI);\n    }\n\n    return 0;\n}\n\nstatic int qmi_proxy_init(unsigned retry) {\n    unsigned i;\n    QCQMIMSG _QMI;\n    PQCQMIMSG pQMI = &_QMI;\n\n    dprintf(\"%s enter\\n\", __func__);\n\n    pQMI->QMIHdr.IFType   = USB_CTL_MSG_TYPE_QMI;\n    pQMI->QMIHdr.CtlFlags = 0x00;\n    pQMI->QMIHdr.QMIType  = QMUX_TYPE_CTL;\n    pQMI->QMIHdr.ClientId= 0x00;\n    \n    pQMI->CTLMsg.QMICTLMsgHdr.CtlFlags = QMICTL_FLAG_REQUEST;\n\n    qmi_sync_done = 0;\n    for (i = 0; i < retry; i++) {\n        pQMI->CTLMsg.SyncReq.TransactionId = i+1;    \n        pQMI->CTLMsg.SyncReq.QMICTLType = htole16(QMICTL_SYNC_REQ);\n        pQMI->CTLMsg.SyncReq.Length = htole16(0);\n\n        pQMI->QMIHdr.Length = \n            htole16(le16toh(pQMI->CTLMsg.QMICTLMsgHdr.Length) + sizeof(QCQMI_HDR) + sizeof(QCQMICTL_MSG_HDR) - 1);\n\n        if (send_qmi_to_cdc_wdm(pQMI) <= 0)\n            break;\n\n        sleep(1);\n        if (qmi_sync_done)\n            break;\n    }\n\n    dprintf(\"%s %s\\n\", __func__, qmi_sync_done ? \"succful\" : \"fail\");\n    return qmi_sync_done ? 0 : -1;\n}\n\nstatic void *qmi_proxy_loop(void *param)\n{\n    PQCQMIMSG pQMI = (PQCQMIMSG)qmi_buf;\n    struct qlistnode *con_node;\n    QMI_PROXY_CONNECTION *qmi_con;\n\n    (void)param;\n    dprintf(\"%s enter thread_id %p\\n\", __func__, (void *)pthread_self());\n\n    qlist_init(&qmi_proxy_connection);\n    qlist_init(&qmi_proxy_ctl_msg);\n\n    while (cdc_wdm_fd > 0 && qmi_proxy_quit == 0) {\n        struct pollfd pollfds[2+64];\n        int ne, ret, nevents = 0;\n        ssize_t nreads;\n\n        pollfds[nevents].fd = cdc_wdm_fd;\n        pollfds[nevents].events = POLLIN;\n        pollfds[nevents].revents= 0;\n        nevents++;\n        \n        if (qmi_proxy_server_fd > 0) {\n            pollfds[nevents].fd = qmi_proxy_server_fd;\n            pollfds[nevents].events = POLLIN;\n            pollfds[nevents].revents= 0;\n            nevents++;\n        }\n\n        qlist_for_each(con_node, &qmi_proxy_connection) {\n            qmi_con = qnode_to_item(con_node, QMI_PROXY_CONNECTION, qnode);\n            \n            pollfds[nevents].fd = qmi_con->ClientFd;\n            pollfds[nevents].events = POLLIN;\n            pollfds[nevents].revents= 0;\n            nevents++;\n\n            if (nevents == (sizeof(pollfds)/sizeof(pollfds[0])))\n                break;\n        }\n\n#if 0\n        dprintf(\"poll \");\n        for (ne = 0; ne < nevents; ne++) {\n            dprintf(\"%d \", pollfds[ne].fd);\n        }\n        dprintf(\"\\n\");\n#endif\n\n        do {\n            //ret = poll(pollfds, nevents, -1);\n            ret = poll(pollfds, nevents, (qmi_proxy_server_fd > 0) ? -1 : 200);\n        } while (ret == -1 && errno == EINTR && qmi_proxy_quit == 0);\n         \n        if (ret < 0) {\n            dprintf(\"%s poll=%d, errno: %d (%s)\\n\", __func__, ret, errno, strerror(errno));\n            goto qmi_proxy_loop_exit;\n        }\n\n        for (ne = 0; ne < nevents; ne++) {\n            int fd = pollfds[ne].fd;\n            short revents = pollfds[ne].revents;\n\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\n                dprintf(\"%s poll fd = %d, revents = %04x\\n\", __func__, fd, revents);\n                if (fd == cdc_wdm_fd) {\n                    goto qmi_proxy_loop_exit;\n                } else if(fd == qmi_proxy_server_fd) {\n                \n                } else {\n                    cleanup_qmi_connection(fd, 1);\n                }\n\n                continue;\n            }\n\n            if (!(pollfds[ne].revents & POLLIN)) {\n                continue;\n            }\n\n            if (fd == qmi_proxy_server_fd) {\n                accept_qmi_connection(fd);\n            }\n            else if (fd == cdc_wdm_fd) {\n                nreads = read(fd, pQMI, sizeof(qmi_buf));\n                if (nreads <= 0) {\n                    dprintf(\"%s read=%d errno: %d (%s)\\n\",  __func__, (int)nreads, errno, strerror(errno));\n                    goto qmi_proxy_loop_exit;\n                }\n#ifdef QUECTEL_QMI_MERGE\n                if(merge_qmi_rsp_packet(pQMI, &nreads))\n                    continue;             \n#endif\n                if (nreads != (le16toh(pQMI->QMIHdr.Length) + 1)) {\n                    dprintf(\"%s nreads=%d,  pQCQMI->QMIHdr.Length = %d\\n\",  __func__, (int)nreads, le16toh(pQMI->QMIHdr.Length));\n                    continue;\n                }\n\n                dump_qmi(pQMI, fd, 'r');\n                recv_qmi_from_dev(pQMI);\n                if (modem_reset_flag)\n                    goto qmi_proxy_loop_exit;\n            }\n            else {\n                nreads = read(fd, pQMI, sizeof(qmi_buf));\n  \n                if (nreads <= 0) {\n                    dprintf(\"%s read=%d errno: %d (%s)\",  __func__, (int)nreads, errno, strerror(errno));\n                    cleanup_qmi_connection(fd, 1);\n                    break;\n                }\n\n                if (nreads != (le16toh(pQMI->QMIHdr.Length) + 1)) {\n                    dprintf(\"%s nreads=%d,  pQCQMI->QMIHdr.Length = %d\\n\",  __func__, (int)nreads, le16toh(pQMI->QMIHdr.Length));\n                    continue;\n                }\n\n                dump_qmi(pQMI, fd, 'r');\n                recv_qmi_from_client(pQMI, nreads, fd);\n            }\n        }\n    }\n\nqmi_proxy_loop_exit:\n    while (!qlist_empty(&qmi_proxy_connection)) {\n        QMI_PROXY_CONNECTION *qmi_con = qnode_to_item(qlist_head(&qmi_proxy_connection), QMI_PROXY_CONNECTION, qnode);\n\n        cleanup_qmi_connection(qmi_con->ClientFd, 0);\n    }\n    \n    dprintf(\"%s exit, thread_id %p\\n\", __func__, (void *)pthread_self());\n\n    return NULL;\n}\n\nstatic void usage(void) {\n    dprintf(\" -d <device_name>                      A valid qmi device\\n\"\n            \"                                       default /dev/cdc-wdm0, but cdc-wdm0 may be invalid\\n\"\n            \" -i <netcard_name>                     netcard name\\n\"\n            \" -v                                    Will show all details\\n\");\n}\n\nstatic void sig_action(int sig) {\n    if (qmi_proxy_quit++ == 0) {\n        if (thread_id)\n            pthread_kill(thread_id, sig);\n    }\n}\n\nint main(int argc, char *argv[]) {\n    int opt;\n    char cdc_wdm[32+1] = \"/dev/cdc-wdm0\";\n    char servername[64] = {0};\n\n    optind = 1;\n\n    signal(SIGINT, sig_action);\n\n    while ( -1 != (opt = getopt(argc, argv, \"d:i:vh\"))) {\n        switch (opt) {\n            case 'd':\n                strcpy(cdc_wdm, optarg);\n                break;\n            case 'v':\n                verbose_debug = 1;\n                break;\n            default:\n                usage();\n                return 0;\n        }\n    }\n\n    sprintf(servername, \"quectel-qmi-proxy%c\", cdc_wdm[strlen(cdc_wdm)-1]);\n    dprintf(\"Will use cdc-wdm='%s', proxy='%s'\\n\", cdc_wdm, servername);\n\n    while (qmi_proxy_quit == 0) {\n        cdc_wdm_fd = open(cdc_wdm, O_RDWR | O_NONBLOCK | O_NOCTTY);\n        if (cdc_wdm_fd == -1) {\n            dprintf(\"Failed to open %s, errno: %d (%s)\\n\", cdc_wdm, errno, strerror(errno));\n            sleep(3);\n            continue;\n        }\n        cfmakenoblock(cdc_wdm_fd);\n        \n        /* no qmi_proxy_loop lives, create one */\n        pthread_create(&thread_id, NULL, qmi_proxy_loop, NULL);\n\n        if (qmi_proxy_init(60) == 0) {\n            qmi_proxy_server_fd = create_local_server(servername);\n            dprintf(\"qmi_proxy_server_fd = %d\\n\", qmi_proxy_server_fd);\n            if (qmi_proxy_server_fd == -1) {\n                dprintf(\"Failed to create %s, errno: %d (%s)\\n\", servername, errno, strerror(errno));\n                pthread_cancel(thread_id);\n            }\n        }\n        else {\n            pthread_cancel(thread_id);\n        }\n\n        pthread_join(thread_id, NULL);\n        thread_id = 0;\n\n        if (qmi_proxy_server_fd != -1) {\n            dprintf(\"close server %s\\n\", servername);\n            close(qmi_proxy_server_fd);\n            qmi_proxy_server_fd = -1;\n        }\n        close(cdc_wdm_fd);\n        cdc_wdm_fd = -1;\n\n        if (qmi_proxy_quit == 0)\n            sleep(modem_reset_flag ? 30 : 3);\n        modem_reset_flag = 0;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/quectel-qrtr-proxy.c",
    "content": "/******************************************************************************\n  @file    quectel-qrtr-proxy.c\n  @brief   The qrtr proxy.\n\n  DESCRIPTION\n  Connectivity Management Tool for USB/PCIE network adapter of Quectel wireless cellular modules.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n#include <unistd.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <fcntl.h>\n#include <pthread.h>\n#include <poll.h>\n#include <sys/socket.h>\n#include <sys/time.h>\n#include <sys/ioctl.h>\n#include <linux/un.h>\n#include <linux/if.h>\n#include <dirent.h>\n#include <signal.h>\n#include <inttypes.h>\n#include <linux/socket.h>\n#include \"qrtr.h\"\n\n#include \"qendian.h\"\n#include \"qlist.h\"\n#include \"QCQMI.h\"\n#include \"QCQCTL.h\"\n#include \"QCQMUX.h\"\n\nstatic const char * get_time(void) {\n    static char time_buf[128];\n    struct timeval  tv;\n    time_t time;\n    suseconds_t millitm;\n    struct tm *ti;\n\n    gettimeofday (&tv, NULL);\n\n    time= tv.tv_sec;\n    millitm = (tv.tv_usec + 500) / 1000;\n\n    if (millitm == 1000) {\n        ++time;\n        millitm = 0;\n    }\n\n    ti = localtime(&time);\n    sprintf(time_buf, \"[%02d-%02d_%02d:%02d:%02d:%03d]\", ti->tm_mon+1, ti->tm_mday, ti->tm_hour, ti->tm_min, ti->tm_sec, (int)millitm);\n    return time_buf;\n}\n\n#define dprintf(fmt, args...) do { fprintf(stdout, \"%s \" fmt, get_time(), ##args); } while(0);\n#define SYSCHECK(c) do{if((c)<0) {dprintf(\"%s %d error: '%s' (code: %d)\\n\", __func__, __LINE__, strerror(errno), errno); return -1;}}while(0)\n#define cfmakenoblock(fd) do{fcntl(fd, F_SETFL, fcntl(fd,F_GETFL) | O_NONBLOCK);}while(0)\n#define align_4(_len) (((_len) + 3) & ~3)\n\ntypedef struct {\n    struct qlistnode qnode;\n    int ClientFd;\n    QCQMIMSG qrtr[0];\n} QRTR_PROXY_MSG;\n\ntypedef struct {\n    struct qlistnode qnode;\n    uint8_t QMIType;\n    uint8_t ClientId;\n    uint32_t node_id;\n    uint32_t port_id;\n    unsigned AccessTime;\n} QRTR_PROXY_CLINET;\n\ntypedef struct {\n    struct qlistnode qnode;\n    struct qlistnode client_qnode;\n    int ClientFd;\n    unsigned AccessTime;\n} QRTR_PROXY_CONNECTION;\n\ntypedef struct {\n    struct qlistnode qnode;\n    uint32_t service;\n    uint32_t version;\n    uint32_t instance;\n    uint32_t node;\n    uint32_t port;\n\n    __le32 src_node_id;\n    __le32 src_port_id;\n} QRTR_SERVICE;\n\nstatic int qrtr_proxy_quit = 0;\nstatic pthread_t thread_id = 0;\nstatic int cdc_wdm_fd = -1;\nstatic int qrtr_proxy_server_fd = -1;\nstatic struct qlistnode qrtr_proxy_connection;\nstatic struct qlistnode qrtr_server_list;\nstatic int verbose_debug = 0;\nstatic uint32_t node_modem = 3; //IPQ ~ 3, QCM ~ 0\nstatic uint32_t node_myself = 1;\n\nstatic QRTR_SERVICE *find_qrtr_service(uint8_t QMIType)\n{\n    struct qlistnode *node;\n\n    qlist_for_each (node, &qrtr_server_list) {\n        QRTR_SERVICE *srv = qnode_to_item(node, QRTR_SERVICE, qnode);\n        if (srv->service == QMIType)\n            return srv;\n    }\n        \n    return NULL;\n}\n\nstatic uint8_t client_bitmap[0xf0];\nstatic uint8_t port_bitmap[0xff0];\nstatic int alloc_client_id(void) {\n    int id = 1;\n\n    for (id = 1; id < (int)sizeof(client_bitmap); id++) {\n        if (client_bitmap[id] == 0) {\n            client_bitmap[id] = id;\n            return id;\n        }\n    }\n\n    dprintf(\"NOT find %s()\\n\", __func__);\n    return 0;\n}\n\nstatic void free_client_id(int id) {\n    if (id < (int)sizeof(client_bitmap) && client_bitmap[id] == id) {\n        client_bitmap[id] = 0;\n        return;\n    }\n    dprintf(\"NOT find %s(id=%d)\\n\", __func__, id);\n}\n\nstatic int alloc_port_id(void) {\n    int id = 1;\n\n    for (id = 1; id < (int)sizeof(port_bitmap); id++) {\n        if (port_bitmap[id] == 0) {\n            port_bitmap[id] = id;\n            return id;\n        }\n    }\n\n    dprintf(\"NOT find %s()\\n\", __func__);\n   return 0;\n}\n\nstatic void free_port_id(int id) {\n    if (id < (int)sizeof(port_bitmap) && port_bitmap[id] == id) {\n        port_bitmap[id] = 0;\n        return;\n    }\n    dprintf(\"NOT find %s(id=%d)\\n\", __func__, id);\n}\n\nstatic void dump_qrtr(void *buf, size_t len, char flag)\n{\n    size_t i;\n    static char printf_buf[1024];\n    int cnt = 0, limit=1024;\n    unsigned char *d = (unsigned char *)buf;\n    struct qrtr_hdr_v1 *hdr = (struct qrtr_hdr_v1 *)buf;\n    const char *ctrl_pkt_strings[] = {\n    \t[QRTR_TYPE_DATA]\t= \"data\",\n    \t[QRTR_TYPE_HELLO]\t= \"hello\",\n    \t[QRTR_TYPE_BYE]\t\t= \"bye\",\n    \t[QRTR_TYPE_NEW_SERVER]\t= \"new-server\",\n    \t[QRTR_TYPE_DEL_SERVER]\t= \"del-server\",\n    \t[QRTR_TYPE_DEL_CLIENT]\t= \"del-client\",\n    \t[QRTR_TYPE_RESUME_TX]\t= \"resume-tx\",\n    \t[QRTR_TYPE_EXIT]\t= \"exit\",\n    \t[QRTR_TYPE_PING]\t= \"ping\",\n    \t[QRTR_TYPE_NEW_LOOKUP]\t= \"new-lookup\",\n    \t[QRTR_TYPE_DEL_LOOKUP]\t= \"del-lookup\",\n    };\n\n    for (i = 0; i < len && i < 64; i++) {\n        if (i%4 == 0)\n            cnt += snprintf(printf_buf+cnt, limit-cnt, \" \");\n        cnt += snprintf(printf_buf+cnt, limit-cnt, \"%02x\", d[i]);\n    }\n    dprintf(\"%s\\n\", printf_buf);\n\n    dprintf(\"%c ver=%d, type=%d(%s), %x,%x -> %x,%x, confirm_rx=%d, size=%u\\n\",\n        flag,\n        le32toh(hdr->version), le32toh(hdr->type), ctrl_pkt_strings[le32toh(hdr->type)],\n        le32toh(hdr->src_node_id), le32toh(hdr->src_port_id), le32toh(hdr->dst_node_id), le32toh(hdr->dst_port_id),\n        le32toh(hdr->confirm_rx), le32toh(hdr->size));\n}\n\nstatic int send_qmi_to_client(PQCQMIMSG pQMI, int fd) {\n    struct pollfd pollfds[]= {{fd, POLLOUT, 0}};\n    ssize_t ret = 0;\n    ssize_t size = le16toh(pQMI->QMIHdr.Length) + 1;\n\n    do {\n        ret = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), 5000);\n    } while (ret == -1 && errno == EINTR && qrtr_proxy_quit == 0);\n\n    if (pollfds[0].revents & POLLOUT) {\n        ret = write(fd, pQMI, size);\n    }\n\n    return ret == size ? 0 : -1;\n}\n\nstatic int send_qrtr_to_dev(struct qrtr_hdr_v1 *hdr, int fd) {\n    struct pollfd pollfds[]= {{fd, POLLOUT, 0}};\n    ssize_t ret = 0;\n    ssize_t size = align_4(le32toh(hdr->size) + sizeof(*hdr));\n\n    do {\n        ret = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), 5000);\n    } while (ret == -1 && errno == EINTR && qrtr_proxy_quit == 0);\n\n    if (pollfds[0].revents & POLLOUT) {\n        ret = write(fd, hdr, size);\n    }\n\n    return ret == size ? 0 : -1;\n}\n\nstatic int qrtr_node_enqueue(const void *data, size_t len,\n\t\t\t     int type, struct sockaddr_qrtr *from,\n\t\t\t     struct sockaddr_qrtr *to, unsigned int confirm_rx)\n{\n    int rc = -1;\n    size_t size = sizeof(struct qrtr_hdr_v1) + len;\n    struct qrtr_hdr_v1 *hdr = (struct qrtr_hdr_v1 *)malloc(align_4(size));\n\n    if (hdr) {\n        hdr->version = htole32(QRTR_PROTO_VER_1);\n        hdr->type = htole32(type);\n        hdr->src_node_id = htole32(from->sq_node);\n        hdr->src_port_id = htole32(from->sq_port);\n        hdr->dst_node_id = htole32(to->sq_node);\n        hdr->dst_port_id = htole32(to->sq_port);\n        hdr->size = htole32(len);\n        hdr->confirm_rx = htole32(!!confirm_rx);\n\n        memcpy(hdr + 1, data, len);\n        dump_qrtr(hdr, size, '>');\n        send_qrtr_to_dev(hdr, cdc_wdm_fd);\n        free(hdr);\n    }\n\n    return rc;\n}\n\nstatic int send_ctrl_hello(__u32 sq_node, __u32 sq_port)\n{\n    struct qrtr_ctrl_pkt pkt;\n    int rc;\n    struct sockaddr_qrtr to = {AF_QIPCRTR, sq_node, sq_port};\n    struct sockaddr_qrtr from = {AF_QIPCRTR, node_myself, QRTR_PORT_CTRL};\n\n    memset(&pkt, 0, sizeof(pkt));\n    pkt.cmd =  htole32(QRTR_TYPE_HELLO);\n\n    rc = qrtr_node_enqueue(&pkt, sizeof(pkt), QRTR_TYPE_HELLO, &from, &to, 0);\n    if (rc < 0)\n        return rc;\n\n    return 0;\n}\n\nstatic int ctrl_cmd_del_client(__u32 sq_node, __u32 sq_port, uint8_t QMIType) \n{\n    struct qrtr_ctrl_pkt pkt;\n    int rc;\n    struct sockaddr_qrtr to = {AF_QIPCRTR, QRTR_NODE_BCAST, QRTR_PORT_CTRL};\n    struct sockaddr_qrtr from = {AF_QIPCRTR, sq_node, sq_port};\n    QRTR_SERVICE *srv = find_qrtr_service(QMIType);\n\n    if (srv) {\n        to.sq_node = srv->src_node_id;\n    }\n\n    memset(&pkt, 0, sizeof(pkt));\n    pkt.cmd = htole32(QRTR_TYPE_DEL_CLIENT);\n    pkt.client.node = htole32(sq_node);\n    pkt.client.port = htole32(sq_port);\n\n    rc = qrtr_node_enqueue(&pkt, sizeof(pkt), QRTR_TYPE_DATA, &from, &to, 0);\n    if (rc < 0)\n        return rc;\n\n    return 0;\n}\n\nstatic void handle_server_change(struct qrtr_hdr_v1 *hdr) {\n    struct qrtr_ctrl_pkt *pkt = (struct qrtr_ctrl_pkt *)(hdr + 1);\n    QRTR_SERVICE *s;\n\n    dprintf (\"[qrtr] %s  server on %u:%u(%u:%u) -> service %u, instance %x\\n\",\n            QRTR_TYPE_NEW_SERVER == hdr->type ? \"add\" : \"remove\",\n             le32toh(pkt->server.node), le32toh(pkt->server.port),\n             le32toh(hdr->src_node_id),  le32toh(hdr->src_port_id),\n             le32toh(pkt->server.service), le32toh(pkt->server.instance));\n\n    if (le32toh(pkt->server.node) != node_modem) {\n        return; //we only care modem\n    }\n\n    s = (QRTR_SERVICE *)malloc(sizeof(QRTR_SERVICE));\n    if (!s)\n        return;\n\n    qlist_init(&s->qnode);\n    s->service = le32toh(pkt->server.service);\n    s->version = le32toh(pkt->server.instance) & 0xff;\n    s->instance = le32toh(pkt->server.instance) >> 8;\n    s->node = le32toh(pkt->server.node);\n    s->port = le32toh(pkt->server.port);\n\n    s->src_node_id = le32toh(hdr->src_node_id);\n    s->src_port_id = le32toh(hdr->src_port_id);\n\n    if (QRTR_TYPE_NEW_SERVER == hdr->type) {\n        qlist_add_tail(&qrtr_server_list, &s->qnode);\n    }\n    else if (QRTR_TYPE_DEL_SERVER == hdr->type) {\n        qlist_remove(&s->qnode);\n    }\n}\n\nstatic int create_local_server(const char *name) {\n    int sockfd = -1;\n    int reuse_addr = 1;\n    struct sockaddr_un sockaddr;\n    socklen_t alen;\n\n    /*Create server socket*/\n    SYSCHECK(sockfd = socket(AF_LOCAL, SOCK_STREAM, 0));\n\n    memset(&sockaddr, 0, sizeof(sockaddr));\n    sockaddr.sun_family = AF_LOCAL;\n    sockaddr.sun_path[0] = 0;\n    memcpy(sockaddr.sun_path + 1, name, strlen(name) );\n\n    alen = strlen(name) + offsetof(struct sockaddr_un, sun_path) + 1;\n    SYSCHECK(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse_addr,sizeof(reuse_addr)));\n    if(bind(sockfd, (struct sockaddr *)&sockaddr, alen) < 0) {\n        close(sockfd);\n        dprintf(\"bind %s errno: %d (%s)\\n\", name, errno, strerror(errno));\n        return -1;\n    }\n\n    dprintf(\"local server: %s sockfd = %d\\n\", name, sockfd);\n    cfmakenoblock(sockfd);\n    listen(sockfd, 1);    \n\n    return sockfd;\n}\n\nstatic uint8_t alloc_qrtr_client_id(QRTR_PROXY_CONNECTION *qrtr_con, uint8_t QMIType) {\n    QRTR_PROXY_CLINET *qrtr_client = (QRTR_PROXY_CLINET *)malloc(sizeof(QRTR_PROXY_CLINET));\n\n    qlist_init(&qrtr_client->qnode);\n    qrtr_client->QMIType = QMIType;\n    qrtr_client->ClientId = alloc_client_id();\n    qrtr_client->node_id = 1;\n    qrtr_client->port_id = alloc_port_id();\n    qrtr_client->AccessTime = 0;\n\n    dprintf(\"+++ ClientFd=%d QMIType=%d ClientId=%d, node_id=%d, port_id=%d\\n\",\n        qrtr_con->ClientFd, qrtr_client->QMIType, qrtr_client->ClientId,\n        qrtr_client->node_id, qrtr_client->port_id);\n    qlist_add_tail(&qrtr_con->client_qnode, &qrtr_client->qnode);\n\n    return qrtr_client->ClientId;\n}\n\nstatic void release_qrtr_client_id(QRTR_PROXY_CONNECTION *qrtr_con, uint8_t QMIType, uint8_t ClientId) {\n    struct qlistnode *client_node;\n    int find = 0;\n\n    qlist_for_each (client_node, &qrtr_con->client_qnode) {\n        QRTR_PROXY_CLINET *qrtr_client = qnode_to_item(client_node, QRTR_PROXY_CLINET, qnode);\n        \n        if (QMIType == qrtr_client->QMIType && ClientId == qrtr_client->ClientId) {\n            dprintf(\"--- ClientFd=%d QMIType=%d ClientId=%d, node_id=%d, port_id=%d\\n\",\n                qrtr_con->ClientFd, qrtr_client->QMIType, qrtr_client->ClientId,\n                qrtr_client->node_id, qrtr_client->port_id);\n            ctrl_cmd_del_client(qrtr_client->node_id, qrtr_client->port_id, qrtr_client->QMIType);\n            free_client_id(qrtr_client->ClientId);\n            free_port_id(qrtr_client->port_id);\n            qlist_remove(&qrtr_client->qnode);\n            free(qrtr_client);\n            find++;\n            break;\n        }\n    }\n\n    if (!find) {\n        dprintf(\"NOT find on %s(ClientFd=%d, QMIType=%d, ClientId=%d)\\n\",\n            __func__, qrtr_con->ClientFd, QMIType, ClientId);\n    }\n}\n\nstatic void accept_qrtr_connection(int serverfd) {\n    int clientfd = -1;\n    unsigned char addr[128];\n    socklen_t alen = sizeof(addr);\n    QRTR_PROXY_CONNECTION *qrtr_con;\n\n    clientfd = accept(serverfd, (struct sockaddr *)addr, &alen);\n\n    qrtr_con = (QRTR_PROXY_CONNECTION *)malloc(sizeof(QRTR_PROXY_CONNECTION));\n    if (qrtr_con) {\n        qlist_init(&qrtr_con->qnode);\n        qlist_init(&qrtr_con->client_qnode);\n        qrtr_con->ClientFd= clientfd;\n        qrtr_con->AccessTime = 0;\n        dprintf(\"+++ ClientFd=%d\\n\", qrtr_con->ClientFd);\n        qlist_add_tail(&qrtr_proxy_connection, &qrtr_con->qnode);\n    }\n\n    cfmakenoblock(clientfd);\n}\n\nstatic void cleanup_qrtr_connection(int clientfd) {\n    struct qlistnode *con_node;\n    int find = 0;\n    \n    qlist_for_each(con_node, &qrtr_proxy_connection) {\n        QRTR_PROXY_CONNECTION *qrtr_con = qnode_to_item(con_node, QRTR_PROXY_CONNECTION, qnode);\n\n        if (qrtr_con->ClientFd == clientfd) {\n            while (!qlist_empty(&qrtr_con->client_qnode)) {\n                QRTR_PROXY_CLINET *qrtr_client = qnode_to_item(qlist_head(&qrtr_con->client_qnode), QRTR_PROXY_CLINET, qnode);\n\n                release_qrtr_client_id(qrtr_con, qrtr_client->QMIType, qrtr_client->ClientId);\n            }\n           \n            dprintf(\"--- ClientFd=%d\\n\", qrtr_con->ClientFd);    \n            close(qrtr_con->ClientFd);\n            qlist_remove(&qrtr_con->qnode);\n            free(qrtr_con);\n            find = 1;\n            break;\n        }\n    }\n\n    if (!find) {\n        dprintf(\"NOT find on %s(ClientFd=%d)\\n\", __func__, clientfd);\n    }\n}\n\nstatic void recv_qrtr_from_dev(struct qrtr_hdr_v1 *hdr) {\n    int find = 0;\n    uint32_t type = le32toh(hdr->type);\n\n    if (type == QRTR_TYPE_HELLO) {\n        send_ctrl_hello(le32toh(hdr->src_node_id), le32toh(hdr->src_port_id));\n        find++;\n    }\n    else if (type == QRTR_TYPE_NEW_SERVER || type == QRTR_TYPE_DEL_SERVER) {\n        handle_server_change(hdr);\n        find++;\n    }\n    else if (type == QRTR_TYPE_DATA) {\n        struct qlistnode *con_node, *client_node;\n\n        qlist_for_each(con_node, &qrtr_proxy_connection) {\n            QRTR_PROXY_CONNECTION *qrtr_con = qnode_to_item(con_node, QRTR_PROXY_CONNECTION, qnode);\n            \n            qlist_for_each(client_node, &qrtr_con->client_qnode) {\n                QRTR_PROXY_CLINET *qrtr_client = qnode_to_item(client_node, QRTR_PROXY_CLINET, qnode);\n\n                if (qrtr_client->node_id == le32toh(hdr->dst_node_id) && qrtr_client->port_id == le32toh(hdr->dst_port_id)) {\n                    PQCQMIMSG pQMI = (PQCQMIMSG)malloc(hdr->size + sizeof(QCQMI_HDR));\n\n                    if (pQMI) {\n                        pQMI->QMIHdr.IFType = USB_CTL_MSG_TYPE_QMI;\n                        pQMI->QMIHdr.Length = htole16(hdr->size + sizeof(QCQMI_HDR) - 1);\n                        pQMI->QMIHdr.CtlFlags = 0x00;\n                        pQMI->QMIHdr.QMIType = qrtr_client->QMIType;\n                        pQMI->QMIHdr.ClientId = qrtr_client->ClientId;\n                        memcpy(&pQMI->MUXMsg, hdr + 1, hdr->size);\n                        send_qmi_to_client(pQMI, qrtr_con->ClientFd);\n                        free(pQMI);\n                        find++;\n                    }\n                }\n            }\n        }\n\n        if (hdr->confirm_rx) {\n            struct qrtr_ctrl_pkt pkt;\n            struct sockaddr_qrtr from = {AF_QIPCRTR, le32toh(hdr->dst_node_id), le32toh(hdr->dst_port_id)};\n            struct sockaddr_qrtr to = {AF_QIPCRTR, le32toh(hdr->src_node_id), le32toh(hdr->src_port_id)};\n\n            memset(&pkt, 0, sizeof(pkt));\n            pkt.cmd = htole32(QRTR_TYPE_RESUME_TX);\n            pkt.client.node = hdr->dst_node_id;\n            pkt.client.port = hdr->dst_port_id;\n\n            qrtr_node_enqueue(&pkt, sizeof(pkt), QRTR_TYPE_RESUME_TX, &from, &to, 0);\n        }\n    }\n    else if (type == QRTR_TYPE_RESUME_TX) {\n    }\n\n    if (!find) {\n        dprintf(\"NOT find on %s()\\n\", __func__);\n    }    \n}\n\nstatic int recv_qmi_from_client(PQCQMIMSG pQMI, int clientfd) {\n    QRTR_PROXY_CONNECTION *qrtr_con;\n    struct qlistnode *con_node, *client_node;\n    int find = 0;\n\n    qlist_for_each(con_node, &qrtr_proxy_connection) {\n        qrtr_con = qnode_to_item(con_node, QRTR_PROXY_CONNECTION, qnode);\n        if (qrtr_con->ClientFd == clientfd)\n            break;\n        qrtr_con = NULL;\n    }\n\n    if (!qrtr_con) {\n        return -1;\n    }\n            \n    if (le16toh(pQMI->QMIHdr.QMIType) == QMUX_TYPE_CTL) {  \n        if (pQMI->CTLMsg.QMICTLMsgHdr.QMICTLType == QMICTL_SYNC_REQ) {\n            dprintf(\"do not allow client send QMICTL_SYNC_REQ\\n\");\n            return 0;\n        }\n        else if (le16toh(pQMI->CTLMsg.QMICTLMsgHdr.QMICTLType) == QMICTL_GET_CLIENT_ID_REQ) {\n            uint8_t QMIType = pQMI->CTLMsg.GetClientIdReq.QMIType;\n            PQCQMIMSG pRsp = (PQCQMIMSG)malloc(256);\n\n            if (pRsp) {\n                uint8_t ClientId = 0;\n\n                if (find_qrtr_service(QMIType)) {\n                    ClientId = alloc_qrtr_client_id(qrtr_con, QMIType);\n                }\n\n                pRsp->QMIHdr.IFType = USB_CTL_MSG_TYPE_QMI;\n                pRsp->QMIHdr.Length = htole16(sizeof(pRsp->CTLMsg.GetClientIdRsp) + sizeof(pRsp->QMIHdr) - 1);\n                pRsp->QMIHdr.CtlFlags = 0x00;\n                pRsp->QMIHdr.QMIType = QMUX_TYPE_CTL;\n                pRsp->QMIHdr.ClientId = 0;\n\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.CtlFlags = QMICTL_FLAG_RESPONSE;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TransactionId = pQMI->CTLMsg.QMICTLMsgHdr.TransactionId;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMICTLType = pQMI->CTLMsg.QMICTLMsgHdr.QMICTLType;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.Length = htole16(sizeof(pRsp->CTLMsg.GetClientIdRsp) - sizeof(pRsp->CTLMsg.QMICTLMsgHdr));\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TLVType = QCTLV_TYPE_RESULT_CODE;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TLVLength = htole16(4);\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMUXResult = htole16(ClientId ? 0 : QMI_RESULT_FAILURE);\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMUXError = htole16(ClientId ? 0 : QMI_ERR_INTERNAL);\n                pRsp->CTLMsg.GetClientIdRsp.TLV2Type = QCTLV_TYPE_REQUIRED_PARAMETER;\n                pRsp->CTLMsg.GetClientIdRsp.TLV2Length = htole16(2);\n                pRsp->CTLMsg.GetClientIdRsp.QMIType = QMIType;\n                pRsp->CTLMsg.GetClientIdRsp.ClientId = ClientId;\n\n                send_qmi_to_client(pRsp, clientfd);\n                free(pRsp);\n                find++;\n            }\n        }\n        else if (le16toh(pQMI->CTLMsg.QMICTLMsgHdr.QMICTLType) == QMICTL_RELEASE_CLIENT_ID_REQ) {\n            PQCQMIMSG pRsp = (PQCQMIMSG)malloc(256);\n            release_qrtr_client_id(qrtr_con, pQMI->CTLMsg.ReleaseClientIdReq.QMIType, pQMI->CTLMsg.ReleaseClientIdReq.ClientId);\n\n            if (pRsp) {\n                pRsp->QMIHdr.IFType = USB_CTL_MSG_TYPE_QMI;\n                pRsp->QMIHdr.Length = htole16(sizeof(pRsp->CTLMsg.ReleaseClientIdRsp) + sizeof(pRsp->QMIHdr) - 1);\n                pRsp->QMIHdr.CtlFlags = 0x00;\n                pRsp->QMIHdr.QMIType = QMUX_TYPE_CTL;\n                pRsp->QMIHdr.ClientId = 0;\n\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.CtlFlags = QMICTL_FLAG_RESPONSE;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TransactionId = pQMI->CTLMsg.QMICTLMsgHdr.TransactionId;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMICTLType = pQMI->CTLMsg.QMICTLMsgHdr.QMICTLType;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.Length = htole16(sizeof(pRsp->CTLMsg.ReleaseClientIdRsp) - sizeof(pRsp->CTLMsg.QMICTLMsgHdr));\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TLVType = QCTLV_TYPE_RESULT_CODE;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TLVLength = htole16(4);\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMUXResult = htole16(0);\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMUXError = htole16(0);\n                pRsp->CTLMsg.ReleaseClientIdRsp.TLV2Type = QCTLV_TYPE_REQUIRED_PARAMETER;\n                pRsp->CTLMsg.ReleaseClientIdRsp.TLV2Length = htole16(2);\n                pRsp->CTLMsg.ReleaseClientIdRsp.QMIType = pQMI->CTLMsg.ReleaseClientIdReq.QMIType;\n                pRsp->CTLMsg.ReleaseClientIdRsp.ClientId = pQMI->CTLMsg.ReleaseClientIdReq.ClientId;\n\n                send_qmi_to_client(pRsp, clientfd);\n                free(pRsp);\n                find++;\n            }\n        }\n        else if (le16toh(pQMI->CTLMsg.QMICTLMsgHdr.QMICTLType) == QMICTL_GET_VERSION_REQ) {\n            PQCQMIMSG pRsp = (PQCQMIMSG)malloc(256);\n\n            if (pRsp) {\n                pRsp->QMIHdr.IFType = USB_CTL_MSG_TYPE_QMI;\n                pRsp->QMIHdr.Length = htole16(sizeof(pRsp->CTLMsg.GetVersionRsp) + sizeof(pRsp->QMIHdr) - 1);\n                pRsp->QMIHdr.CtlFlags = 0x00;\n                pRsp->QMIHdr.QMIType = QMUX_TYPE_CTL;\n                pRsp->QMIHdr.ClientId = 0;\n\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.CtlFlags = QMICTL_FLAG_RESPONSE;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TransactionId = pQMI->CTLMsg.QMICTLMsgHdr.TransactionId;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMICTLType = pQMI->CTLMsg.QMICTLMsgHdr.QMICTLType;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.Length = htole16(sizeof(pRsp->CTLMsg.GetVersionRsp) - sizeof(pRsp->CTLMsg.QMICTLMsgHdr));\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TLVType = QCTLV_TYPE_RESULT_CODE;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TLVLength = htole16(4);\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMUXResult = htole16(0);\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMUXError = htole16(0);\n                pRsp->CTLMsg.GetVersionRsp.TLV2Type = QCTLV_TYPE_REQUIRED_PARAMETER;\n                pRsp->CTLMsg.GetVersionRsp.TLV2Length = htole16(1);\n                pRsp->CTLMsg.GetVersionRsp.NumElements = 0;\n\n                send_qmi_to_client(pRsp, clientfd);\n                free(pRsp);\n                find++;\n            }\n        }\n    }\n    else {\n        qlist_for_each (client_node, &qrtr_con->client_qnode) {\n            QRTR_PROXY_CLINET *qrtr_client = qnode_to_item(client_node, QRTR_PROXY_CLINET, qnode);\n            \n            if (pQMI->QMIHdr.QMIType == qrtr_client->QMIType && pQMI->QMIHdr.ClientId == qrtr_client->ClientId) {\n                QRTR_SERVICE *srv = find_qrtr_service(pQMI->QMIHdr.QMIType);\n\n                if (srv && srv->service) {\n                    struct sockaddr_qrtr from = {AF_QIPCRTR, qrtr_client->node_id, qrtr_client->port_id};\n                    struct sockaddr_qrtr to = {AF_QIPCRTR, srv->node, srv->port};\n\n                    qrtr_node_enqueue(&pQMI->MUXMsg, le16toh(pQMI->QMIHdr.Length) + 1 - sizeof(QCQMI_HDR),\n                        QRTR_TYPE_DATA, &from, &to, 0);\n                    find++;\n                }\n                break;\n            }\n        }\n    }\n\n    if (!find) {\n        dprintf(\"NOT find on %s()\\n\", __func__);\n    } \n\n    return 0;\n}\n\nstatic int qrtr_proxy_init(void) {\n    unsigned i;\n    int qrtr_sync_done = 0;\n\n    dprintf(\"%s enter\\n\", __func__);\n    send_ctrl_hello(QRTR_NODE_BCAST, QRTR_PORT_CTRL);\n\n    for (i = 0; i < 10; i++) {\n        sleep(1);\n        qrtr_sync_done = !qlist_empty(&qrtr_server_list);\n        if (qrtr_sync_done)\n            break;\n    }\n\n    dprintf(\"%s %s\\n\", __func__, qrtr_sync_done ? \"succful\" : \"fail\");\n    return qrtr_sync_done ? 0 : -1;\n}\n\nstatic void qrtr_start_server(const char* servername) {\n    qrtr_proxy_server_fd = create_local_server(servername);\n    dprintf(\"qrtr_proxy_server_fd = %d\\n\", qrtr_proxy_server_fd);\n    if (qrtr_proxy_server_fd == -1) {\n        dprintf(\"Failed to create %s, errno: %d (%s)\\n\", servername, errno, strerror(errno));\n    }\n}\n\nstatic void qrtr_close_server(const char* servername) {\n    if (qrtr_proxy_server_fd != -1) {\n        dprintf(\"%s %s\\n\", __func__, servername);\n        close(qrtr_proxy_server_fd);\n        qrtr_proxy_server_fd = -1;\n    }\n}\n\nstatic void *qrtr_proxy_loop(void *param)\n{\n    void *rx_buf;\n    struct qlistnode *con_node;\n    QRTR_PROXY_CONNECTION *qrtr_con;\n\n    (void)param;\n    dprintf(\"%s enter thread_id %p\\n\", __func__, (void *)pthread_self());\n    \n    rx_buf = malloc(8192);\n    if (!rx_buf)\n        return NULL;\n\n    while (cdc_wdm_fd > 0 && qrtr_proxy_quit == 0) {\n        struct pollfd pollfds[32];\n        int ne, ret, nevents = 0;\n        ssize_t nreads;\n\n        pollfds[nevents].fd = cdc_wdm_fd;\n        pollfds[nevents].events = POLLIN;\n        pollfds[nevents].revents= 0;\n        nevents++;\n        \n        if (qrtr_proxy_server_fd > 0) {\n            pollfds[nevents].fd = qrtr_proxy_server_fd;\n            pollfds[nevents].events = POLLIN;\n            pollfds[nevents].revents= 0;\n            nevents++;\n        }\n\n        qlist_for_each(con_node, &qrtr_proxy_connection) {\n            qrtr_con = qnode_to_item(con_node, QRTR_PROXY_CONNECTION, qnode);\n            \n            pollfds[nevents].fd = qrtr_con->ClientFd;\n            pollfds[nevents].events = POLLIN;\n            pollfds[nevents].revents= 0;\n            nevents++;\n\n            if (nevents == (sizeof(pollfds)/sizeof(pollfds[0])))\n                break;\n        }\n\n        do {\n            //ret = poll(pollfds, nevents, -1);\n            ret = poll(pollfds, nevents, (qrtr_proxy_server_fd > 0) ? -1 : 200);\n         } while (ret == -1 && errno == EINTR && qrtr_proxy_quit == 0);\n         \n        if (ret < 0) {\n            dprintf(\"%s poll=%d, errno: %d (%s)\\n\", __func__, ret, errno, strerror(errno));\n            goto qrtr_proxy_loop_exit;\n        }\n\n        for (ne = 0; ne < nevents; ne++) {\n            int fd = pollfds[ne].fd;\n            short revents = pollfds[ne].revents;\n\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\n                dprintf(\"%s poll fd = %d, revents = %04x\\n\", __func__, fd, revents);\n                if (fd == cdc_wdm_fd) {\n                    goto qrtr_proxy_loop_exit;\n                }\n                else if (fd == qrtr_proxy_server_fd) {\n                \n                }\n                else {\n                    cleanup_qrtr_connection(fd);\n                }\n\n                continue;\n            }\n\n            if (!(pollfds[ne].revents & POLLIN)) {\n                continue;\n            }\n\n            if (fd == qrtr_proxy_server_fd) {\n                accept_qrtr_connection(fd);\n            }\n            else if (fd == cdc_wdm_fd) {\n                struct qrtr_hdr_v1 *hdr = (struct qrtr_hdr_v1 *)rx_buf;\n\n                nreads = read(fd, rx_buf, 8192);\n                if (nreads <= 0) {\n                    dprintf(\"%s read=%d errno: %d (%s)\\n\",  __func__, (int)nreads, errno, strerror(errno));\n                    goto qrtr_proxy_loop_exit;\n                }\n                else if (nreads != (int)align_4(le32toh(hdr->size) + sizeof(*hdr))) {\n                    dprintf(\"%s nreads=%d,  hdr->size = %d\\n\",  __func__, (int)nreads, le32toh(hdr->size));\n                    continue;\n                }\n\n                dump_qrtr(hdr, nreads, '<');\n                recv_qrtr_from_dev(hdr);\n            }\n            else {\n                PQCQMIMSG pQMI = (PQCQMIMSG)rx_buf;\n\n                nreads = read(fd, rx_buf, 8192);\n                if (nreads <= 0) {\n                    dprintf(\"%s read=%d errno: %d (%s)\",  __func__, (int)nreads, errno, strerror(errno));\n                    cleanup_qrtr_connection(fd);\n                    break;\n                }\n                else if (nreads != (le16toh(pQMI->QMIHdr.Length) + 1)) {\n                    dprintf(\"%s nreads=%d,  pQCQMI->QMIHdr.Length = %d\\n\",  __func__, (int)nreads, le16toh(pQMI->QMIHdr.Length));\n                    continue;\n                }\n\n                recv_qmi_from_client(pQMI, fd);\n            }\n        }\n    }\n\nqrtr_proxy_loop_exit:\n    while (!qlist_empty(&qrtr_proxy_connection)) {\n        QRTR_PROXY_CONNECTION *qrtr_con = qnode_to_item(qlist_head(&qrtr_proxy_connection), QRTR_PROXY_CONNECTION, qnode);\n\n        cleanup_qrtr_connection(qrtr_con->ClientFd);\n    }\n    \n    dprintf(\"%s exit, thread_id %p\\n\", __func__, (void *)pthread_self());\n    free(rx_buf);\n\n    return NULL;\n}\n\nstatic void usage(void) {\n    dprintf(\" -d <device_name>                      A valid qrtr device\\n\"\n            \"                                       default /dev/mhi_IPCR, but mhi_IPCR may be invalid\\n\"\n            \" -i <netcard_name>                     netcard name\\n\"\n            \" -v                                    Will show all details\\n\");\n}\n\nstatic void sig_action(int sig) {\n    if (qrtr_proxy_quit == 0) {\n        qrtr_proxy_quit = 1;\n        if (thread_id)\n            pthread_kill(thread_id, sig);\n    }\n}\n\nint main(int argc, char *argv[]) {\n    int opt;\n    char cdc_wdm[32+1] = \"/dev/mhi_IPCR\";\n    char servername[64] = {0};\n\n    signal(SIGINT, sig_action);\n    signal(SIGTERM, sig_action);\n\n    optind = 1;\n    while ( -1 != (opt = getopt(argc, argv, \"d:i:vh\"))) {\n        switch (opt) {\n            case 'd':\n                strcpy(cdc_wdm, optarg);\n                break;\n            case 'v':\n                verbose_debug = 1;\n                break;\n            default:\n                usage();\n                return 0;\n        }\n    }\n\n    sprintf(servername, \"quectel-qrtr-proxy%c\", cdc_wdm[strlen(cdc_wdm)-1]);\n    dprintf(\"Will use cdc-wdm='%s', proxy='%s'\\n\", cdc_wdm, servername);\n\n    while (qrtr_proxy_quit == 0) {\n        cdc_wdm_fd = open(cdc_wdm, O_RDWR | O_NONBLOCK | O_NOCTTY);\n        if (cdc_wdm_fd == -1) {\n            dprintf(\"Failed to open %s, errno: %d (%s)\\n\", cdc_wdm, errno, strerror(errno));\n            sleep(5);\n            continue;\n        }\n        cfmakenoblock(cdc_wdm_fd);\n        qlist_init(&qrtr_proxy_connection);\n        qlist_init(&qrtr_server_list);\n        pthread_create(&thread_id, NULL, qrtr_proxy_loop, NULL);\n\n        if (qrtr_proxy_init() == 0) {\n            qrtr_start_server(servername);\n            pthread_join(thread_id, NULL);\n            qrtr_close_server(servername);\n        }\n        else {\n            pthread_cancel(thread_id);\n            pthread_join(thread_id, NULL);\n        }\n\n        close(cdc_wdm_fd);\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/rmnetctl.c",
    "content": "//https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/dataservices/tree/rmnetctl\n#include <sys/socket.h>\n#include <stdint.h>\n#include <linux/netlink.h>\n#include <string.h>\n#include <stdio.h>\n#include <unistd.h>\n#include <stdlib.h>\n#include <errno.h>\n#include <linux/rtnetlink.h>\n#include <linux/gen_stats.h>\n#include <net/if.h>\n#include <asm/types.h>\n#include <linux/rmnet_data.h>\n\n#define RMNETCTL_SUCCESS 0\n#define RMNETCTL_LIB_ERR 1\n#define RMNETCTL_KERNEL_ERR 2\n#define RMNETCTL_INVALID_ARG 3\n\nenum rmnetctl_error_codes_e {\n\tRMNETCTL_API_SUCCESS = 0,\n\n\tRMNETCTL_API_FIRST_ERR = 1,\n\tRMNETCTL_API_ERR_MESSAGE_SEND = 3,\n\tRMNETCTL_API_ERR_MESSAGE_RECEIVE = 4,\n\n\tRMNETCTL_INIT_FIRST_ERR = 5,\n\tRMNETCTL_INIT_ERR_PROCESS_ID = RMNETCTL_INIT_FIRST_ERR,\n\tRMNETCTL_INIT_ERR_NETLINK_FD = 6,\n\tRMNETCTL_INIT_ERR_BIND = 7,\n\n\tRMNETCTL_API_SECOND_ERR = 9,\n\tRMNETCTL_API_ERR_HNDL_INVALID = RMNETCTL_API_SECOND_ERR,\n\tRMNETCTL_API_ERR_RETURN_TYPE = 13,\n};\n\nstruct rmnetctl_hndl_s {\n\t uint32_t pid;\n\t uint32_t transaction_id;\n\t int netlink_fd;\n\t struct sockaddr_nl src_addr, dest_addr;\n};\ntypedef struct rmnetctl_hndl_s rmnetctl_hndl_t;\n\n#define NLMSG_TAIL(nmsg) \\\n    ((struct rtattr *) (((char *)(nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))\n\nstruct nlmsg {\n\tstruct nlmsghdr nl_addr;\n\tstruct ifinfomsg ifmsg;\n\tchar data[500];\n};\n\n#define MIN_VALID_PROCESS_ID 0\n#define MIN_VALID_SOCKET_FD 0\n#define KERNEL_PROCESS_ID 0\n#define UNICAST 0\n\nenum {\n\tIFLA_RMNET_UL_AGG_PARAMS = __IFLA_RMNET_MAX,\n\t__IFLA_RMNET_EXT_MAX,\n};\n\nstruct rmnet_egress_agg_params {\n\tuint16_t agg_size;\n\tuint16_t agg_count;\n\tuint32_t agg_time;\n};\n\nstatic int rmnet_get_ack(rmnetctl_hndl_t *hndl, uint16_t *error_code)\n{\n\tstruct nlack {\n\t\tstruct nlmsghdr ackheader;\n\t\tstruct nlmsgerr ackdata;\n\t\tchar   data[256];\n\n\t} ack;\n\tint i;\n\n\tif (!hndl || !error_code)\n\t\treturn RMNETCTL_INVALID_ARG;\n\n\tif ((i = recv(hndl->netlink_fd, &ack, sizeof(ack), 0)) < 0) {\n\t\t*error_code = errno;\n\t\treturn RMNETCTL_API_ERR_MESSAGE_RECEIVE;\n\t}\n\n\t/*Ack should always be NLMSG_ERROR type*/\n\tif (ack.ackheader.nlmsg_type == NLMSG_ERROR) {\n\t\tif (ack.ackdata.error == 0) {\n\t\t\t*error_code = RMNETCTL_API_SUCCESS;\n\t\t\treturn RMNETCTL_SUCCESS;\n\t\t} else {\n\t\t\t*error_code = -ack.ackdata.error;\n\t\t\treturn RMNETCTL_KERNEL_ERR;\n\t\t}\n\t}\n\n\t*error_code = RMNETCTL_API_ERR_RETURN_TYPE;\n\treturn RMNETCTL_API_FIRST_ERR;\n}\n\nstatic int rtrmnet_ctl_init(rmnetctl_hndl_t **hndl, uint16_t *error_code)\n{\n\tstruct sockaddr_nl __attribute__((__may_alias__)) *saddr_ptr;\n\tint netlink_fd = -1;\n\tpid_t pid = 0;\n\n\tif (!hndl || !error_code)\n\t\treturn RMNETCTL_INVALID_ARG;\n\n\t*hndl = (rmnetctl_hndl_t *)malloc(sizeof(rmnetctl_hndl_t));\n\tif (!*hndl) {\n\t\t*error_code = RMNETCTL_API_ERR_HNDL_INVALID;\n\t\treturn RMNETCTL_LIB_ERR;\n\t}\n\n\tmemset(*hndl, 0, sizeof(rmnetctl_hndl_t));\n\n\tpid = getpid();\n\tif (pid  < MIN_VALID_PROCESS_ID) {\n\t\tfree(*hndl);\n\t\t*error_code = RMNETCTL_INIT_ERR_PROCESS_ID;\n\t\treturn RMNETCTL_LIB_ERR;\n\t}\n\t(*hndl)->pid = KERNEL_PROCESS_ID;\n\tnetlink_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);\n\tif (netlink_fd < MIN_VALID_SOCKET_FD) {\n\t\tfree(*hndl);\n\t\t*error_code = RMNETCTL_INIT_ERR_NETLINK_FD;\n\t\treturn RMNETCTL_LIB_ERR;\n\t}\n\n\t(*hndl)->netlink_fd = netlink_fd;\n\n\tmemset(&(*hndl)->src_addr, 0, sizeof(struct sockaddr_nl));\n\n\t(*hndl)->src_addr.nl_family = AF_NETLINK;\n\t(*hndl)->src_addr.nl_pid = (*hndl)->pid;\n\n\tsaddr_ptr = &(*hndl)->src_addr;\n\tif (bind((*hndl)->netlink_fd,\n\t\t(struct sockaddr *)saddr_ptr,\n\t\tsizeof(struct sockaddr_nl)) < 0) {\n\t\tclose((*hndl)->netlink_fd);\n\t\tfree(*hndl);\n\t\t*error_code = RMNETCTL_INIT_ERR_BIND;\n\t\treturn RMNETCTL_LIB_ERR;\n\t}\n\n\tmemset(&(*hndl)->dest_addr, 0, sizeof(struct sockaddr_nl));\n\n\t(*hndl)->dest_addr.nl_family = AF_NETLINK;\n\t(*hndl)->dest_addr.nl_pid = KERNEL_PROCESS_ID;\n\t(*hndl)->dest_addr.nl_groups = UNICAST;\n\n\treturn RMNETCTL_SUCCESS;\n}\n\nstatic int rtrmnet_ctl_deinit(rmnetctl_hndl_t *hndl)\n{\n\tif (!hndl)\n\t\treturn RMNETCTL_SUCCESS;\n\n\tclose(hndl->netlink_fd);\n\tfree(hndl);\n\n\treturn RMNETCTL_SUCCESS;\n}\n\nstatic int rtrmnet_ctl_newvnd(rmnetctl_hndl_t *hndl, char *devname, char *vndname,\n\t\t       uint16_t *error_code, uint8_t  index,\n\t\t       uint32_t flagconfig, uint32_t ul_agg_cnt, uint32_t ul_agg_size)\n{\n\tstruct rtattr *attrinfo, *datainfo, *linkinfo;\n\tstruct ifla_vlan_flags flags;\n\tint devindex = 0, val = 0;\n\tchar *kind = \"rmnet\";\n\tstruct nlmsg req;\n\tshort id;\n\n\tif (!hndl || !devname || !vndname || !error_code)\n\t\treturn RMNETCTL_INVALID_ARG;\n\n\tmemset(&req, 0, sizeof(req));\n\treq.nl_addr.nlmsg_type = RTM_NEWLINK;\n\treq.nl_addr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));\n\treq.nl_addr.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL |\n\t\t\t\t  NLM_F_ACK;\n\treq.nl_addr.nlmsg_seq = hndl->transaction_id;\n\thndl->transaction_id++;\n\n\t/* Get index of devname*/\n\tdevindex = if_nametoindex(devname);\n\tif (devindex < 0) {\n\t\t*error_code = errno;\n\t\treturn RMNETCTL_KERNEL_ERR;\n\t}\n\n\t/* Setup link attr with devindex as data */\n\tval = devindex;\n\tattrinfo = (struct rtattr *)(((char *)&req) +\n\t\t\t\t     NLMSG_ALIGN(req.nl_addr.nlmsg_len));\n\tattrinfo->rta_type = IFLA_LINK;\n\tattrinfo->rta_len = RTA_ALIGN(RTA_LENGTH(sizeof(val)));\n\tmemcpy(RTA_DATA(attrinfo), &val, sizeof(val));\n\treq.nl_addr.nlmsg_len = NLMSG_ALIGN(req.nl_addr.nlmsg_len) +\n\t\t\t\tRTA_ALIGN(RTA_LENGTH(sizeof(val)));\n\n\t/* Set up IFLA info kind  RMNET that has linkinfo and type */\n\tattrinfo = (struct rtattr *)(((char *)&req) +\n\t\t\t\t     NLMSG_ALIGN(req.nl_addr.nlmsg_len));\n\tattrinfo->rta_type =  IFLA_IFNAME;\n\tattrinfo->rta_len = RTA_ALIGN(RTA_LENGTH(strlen(vndname) + 1));\n\tmemcpy(RTA_DATA(attrinfo), vndname, strlen(vndname) + 1);\n\treq.nl_addr.nlmsg_len = NLMSG_ALIGN(req.nl_addr.nlmsg_len) +\n\t\t\t\tRTA_ALIGN(RTA_LENGTH(strlen(vndname) + 1));\n\n\tlinkinfo = (struct rtattr *)(((char *)&req) +\n\t\t\t\t     NLMSG_ALIGN(req.nl_addr.nlmsg_len));\n\tlinkinfo->rta_type = IFLA_LINKINFO;\n\tlinkinfo->rta_len = RTA_ALIGN(RTA_LENGTH(0));\n\treq.nl_addr.nlmsg_len = NLMSG_ALIGN(req.nl_addr.nlmsg_len) +\n\t\t\t\tRTA_ALIGN(RTA_LENGTH(0));\n\n\tattrinfo = (struct rtattr *)(((char *)&req) +\n\t\t\t\t     NLMSG_ALIGN(req.nl_addr.nlmsg_len));\n\tattrinfo->rta_type =  IFLA_INFO_KIND;\n\tattrinfo->rta_len = RTA_ALIGN(RTA_LENGTH(strlen(kind)));\n\tmemcpy(RTA_DATA(attrinfo), kind, strlen(kind));\n\treq.nl_addr.nlmsg_len = NLMSG_ALIGN(req.nl_addr.nlmsg_len) +\n\t\t\t\tRTA_ALIGN(RTA_LENGTH(strlen(kind)));\n\n\tdatainfo = (struct rtattr *)(((char *)&req) +\n\t\t\t\t     NLMSG_ALIGN(req.nl_addr.nlmsg_len));\n\tdatainfo->rta_type =  IFLA_INFO_DATA;\n\tdatainfo->rta_len = RTA_ALIGN(RTA_LENGTH(0));\n\treq.nl_addr.nlmsg_len = NLMSG_ALIGN(req.nl_addr.nlmsg_len) +\n\t\t\t\tRTA_ALIGN(RTA_LENGTH(0));\n\n\tid = index;\n\tattrinfo = (struct rtattr *)(((char *)&req) +\n\t\t\t\t     NLMSG_ALIGN(req.nl_addr.nlmsg_len));\n\tattrinfo->rta_type =  IFLA_VLAN_ID;\n\tattrinfo->rta_len = RTA_LENGTH(sizeof(id));\n\tmemcpy(RTA_DATA(attrinfo), &id, sizeof(id));\n\treq.nl_addr.nlmsg_len = NLMSG_ALIGN(req.nl_addr.nlmsg_len) +\n\t\t\t\tRTA_ALIGN(RTA_LENGTH(sizeof(id)));\n\n\tif (flagconfig != 0) {\n\t\tflags.mask  = flagconfig;\n\t\tflags.flags = flagconfig;\n\n\t\tattrinfo = (struct rtattr *)(((char *)&req) +\n\t\t\t\t\t     NLMSG_ALIGN(req.nl_addr.nlmsg_len));\n\t\tattrinfo->rta_type =  IFLA_VLAN_FLAGS;\n\t\tattrinfo->rta_len = RTA_LENGTH(sizeof(flags));\n\t\tmemcpy(RTA_DATA(attrinfo), &flags, sizeof(flags));\n\t\treq.nl_addr.nlmsg_len = NLMSG_ALIGN(req.nl_addr.nlmsg_len) +\n\t\t\t\t\tRTA_ALIGN(RTA_LENGTH(sizeof(flags)));\n\t}\n\n\tif (ul_agg_cnt > 1) {\n            struct rmnet_egress_agg_params agg_params;\n\n            agg_params.agg_size = ul_agg_size;\n            agg_params.agg_count = ul_agg_cnt;\n            agg_params.agg_time = 3000000;\n\n\t\tattrinfo = (struct rtattr *)(((char *)&req) +\n\t\t\t\t\t     NLMSG_ALIGN(req.nl_addr.nlmsg_len));\n\t\tattrinfo->rta_type =  IFLA_RMNET_UL_AGG_PARAMS;\n\t\tattrinfo->rta_len = RTA_LENGTH(sizeof(agg_params));\n\t\tmemcpy(RTA_DATA(attrinfo), &agg_params, sizeof(agg_params));\n\t\treq.nl_addr.nlmsg_len = NLMSG_ALIGN(req.nl_addr.nlmsg_len) +\n\t\t\t\t\tRTA_ALIGN(RTA_LENGTH(sizeof(agg_params)));\n\t}\n\n\tdatainfo->rta_len = (char *)NLMSG_TAIL(&req.nl_addr) - (char *)datainfo;\n\n\tlinkinfo->rta_len = (char *)NLMSG_TAIL(&req.nl_addr) - (char *)linkinfo;\n\n\tif (send(hndl->netlink_fd, &req, req.nl_addr.nlmsg_len, 0) < 0) {\n\t\t*error_code = RMNETCTL_API_ERR_MESSAGE_SEND;\n\t\treturn RMNETCTL_LIB_ERR;\n\t}\n\n\treturn rmnet_get_ack(hndl, error_code);\n}\n\nint rtrmnet_ctl_create_vnd(char *devname, char *vndname, uint8_t muxid,\n\t\t       uint32_t qmap_version, uint32_t ul_agg_cnt, uint32_t ul_agg_size)\n{\n    struct rmnetctl_hndl_s *handle;\n    uint16_t error_code;\n    int return_code;\n    uint32_t flagconfig = RMNET_FLAGS_INGRESS_DEAGGREGATION;\n\n    printf(\"%s devname: %s, vndname: %s, muxid: %d, qmap_version: %d\\n\",\n        __func__, devname, vndname, muxid, qmap_version);\n\n    ul_agg_cnt = 0; //TODO\n\n    if (ul_agg_cnt > 1)\n        flagconfig |= RMNET_EGRESS_FORMAT_AGGREGATION;\n\n    if (qmap_version == 9) { //QMAPV5\n#ifdef RMNET_FLAGS_INGRESS_MAP_CKSUMV5\n        flagconfig |= RMNET_FLAGS_INGRESS_MAP_CKSUMV5;\n        flagconfig |= RMNET_FLAGS_EGRESS_MAP_CKSUMV5;\n#else\n        return -1001;\n#endif\n    }\n    else if (qmap_version == 8) { //QMAPV4\n        flagconfig |= RMNET_FLAGS_INGRESS_MAP_CKSUMV4;\n        flagconfig |= RMNET_FLAGS_EGRESS_MAP_CKSUMV4;\n    }\n    else if (qmap_version == 5) { //QMAPV1\n    }\n    else {\n        flagconfig = 0;\n    }\n    \n    return_code = rtrmnet_ctl_init(&handle, &error_code);\n    if (return_code) {\n        printf(\"rtrmnet_ctl_init error_code: %d, return_code: %d, errno: %d (%s)\\n\",\n            error_code, return_code, errno, strerror(errno));\n    }\n    if (return_code == RMNETCTL_SUCCESS) {\n        return_code = rtrmnet_ctl_newvnd(handle, devname, vndname, &error_code,\n            muxid, flagconfig, ul_agg_cnt, ul_agg_size);\n            if (return_code) {\n                printf(\"rtrmnet_ctl_newvnd error_code: %d, return_code: %d, errno: %d (%s)\\n\",\n                    error_code, return_code, errno, strerror(errno));\n            }\n        rtrmnet_ctl_deinit(handle);\n    }\n\n    return return_code;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/udhcpc.c",
    "content": "/******************************************************************************\n  @file    udhcpc.c\n  @brief   call DHCP tools to obtain IP address.\n\n  DESCRIPTION\n  Connectivity Management Tool for USB network adapter of Quectel wireless cellular modules.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n#include <sys/socket.h>\n#include <sys/select.h>\n#include <sys/types.h>\n#include <net/if.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <endian.h>\n\n#include \"util.h\"\n#include \"QMIThread.h\"\nextern int ql_get_netcard_carrier_state(const char *devname);\n\nstatic __inline in_addr_t qmi2addr(uint32_t __x) {\n    return (__x>>24) | (__x>>8&0xff00) | (__x<<8&0xff0000) | (__x<<24);\n}\n\nstatic int ql_system(const char *shell_cmd) {\n    dbg_time(\"%s\", shell_cmd);\n    return system(shell_cmd);\n}\n\nstatic void ifc_init_ifr(const char *name, struct ifreq *ifr)\n{\n    memset(ifr, 0, sizeof(struct ifreq));\n    no_trunc_strncpy(ifr->ifr_name, name, IFNAMSIZ);\n    ifr->ifr_name[IFNAMSIZ - 1] = 0;\n}\n\nstatic void ql_set_mtu(const char *ifname, int ifru_mtu) {\n    int inet_sock;\n    struct ifreq ifr;\n\n    inet_sock = socket(AF_INET, SOCK_DGRAM, 0);\n\n    if (inet_sock > 0) {\n        ifc_init_ifr(ifname, &ifr);\n\n        if (!ioctl(inet_sock, SIOCGIFMTU, &ifr)) {\n            if (ifr.ifr_ifru.ifru_mtu != ifru_mtu) {\n                dbg_time(\"change mtu %d -> %d\", ifr.ifr_ifru.ifru_mtu , ifru_mtu);\n                ifr.ifr_ifru.ifru_mtu = ifru_mtu;\n                ioctl(inet_sock, SIOCSIFMTU, &ifr);\n            }\n        }\n\n        close(inet_sock);\n    }\n}\n\nstatic int ifc_get_addr(const char *name, in_addr_t *addr)\n{\n    int inet_sock;\n    struct ifreq ifr;\n    int ret = 0;\n\n    inet_sock = socket(AF_INET, SOCK_DGRAM, 0);\n\n    ifc_init_ifr(name, &ifr);\n    if (addr != NULL) {\n        ret = ioctl(inet_sock, SIOCGIFADDR, &ifr);\n        if (ret < 0) {\n            *addr = 0;\n        } else {\n            *addr = ((struct sockaddr_in*) &ifr.ifr_addr)->sin_addr.s_addr;\n        }\n    }\n    close(inet_sock);\n    return ret;\n}\n\nstatic short ifc_get_flags(const char *ifname)\n{\n    int inet_sock;\n    struct ifreq ifr;\n    int ret = 0;\n\n    inet_sock = socket(AF_INET, SOCK_DGRAM, 0);\n\n    if (inet_sock > 0) {\n        ifc_init_ifr(ifname, &ifr);\n\n        if (!ioctl(inet_sock, SIOCGIFFLAGS, &ifr)) {\n            ret = ifr.ifr_ifru.ifru_flags;\n        }\n\n        close(inet_sock);\n    }\n\n    return ret;\n}\n\nstatic void ifc_set_state(const char *ifname, int state) {\n    char shell_cmd[128];\n\n    if (!access(\"/sbin/ip\", X_OK)) {\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip link set dev %s %s\", ifname, state ? \"up\" : \"down\");\n    } else {\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ifconfig %s %s\", ifname, state ? \"up\" : \"down\");\n    }\n    ql_system(shell_cmd);\n}\n\nstatic int ql_netcard_ipv4_address_check(const char *ifname, in_addr_t ip) {\n    in_addr_t addr = 0;\n\n    ifc_get_addr(ifname, &addr);\n    return addr == ip;\n}\n\nstatic int ql_raw_ip_mode_check(const char *ifname, uint32_t ip) {\n    int fd;\n    char raw_ip[128];\n    char mode[2] = \"X\";\n    int mode_change = 0;\n\n    if (ql_netcard_ipv4_address_check(ifname, qmi2addr(ip)))\n        return 0;\n    \n    snprintf(raw_ip, sizeof(raw_ip), \"/sys/class/net/%s/qmi/raw_ip\", ifname);\n    if (access(raw_ip, F_OK))\n        return 0;\n\n    fd = open(raw_ip, O_RDWR | O_NONBLOCK | O_NOCTTY);\n    if (fd < 0) {\n        dbg_time(\"%s %d fail to open(%s), errno:%d (%s)\", __FILE__, __LINE__, raw_ip, errno, strerror(errno));\n        return 0;\n    }\n\n    if (read(fd, mode, 2) == -1) {};\n    if (mode[0] == '0' || mode[0] == 'N') {\n        dbg_time(\"File:%s Line:%d udhcpc fail to get ip address, try next:\", __func__, __LINE__);\n        ifc_set_state(ifname, 0);\n        dbg_time(\"echo Y > /sys/class/net/%s/qmi/raw_ip\", ifname);\n        mode[0] = 'Y';\n        if (write(fd, mode, 2) == -1) {};\n        mode_change = 1;\n        ifc_set_state(ifname, 1);\n    }\n\n    close(fd);\n    return mode_change;\n}\n\nstatic void* udhcpc_thread_function(void* arg) {\n    FILE * udhcpc_fp;\n    char *udhcpc_cmd = (char *)arg;\n\n    if (udhcpc_cmd == NULL)\n        return NULL;\n\n    dbg_time(\"%s\", udhcpc_cmd);\n    udhcpc_fp = popen(udhcpc_cmd, \"r\");\n    free(udhcpc_cmd);\n    if (udhcpc_fp) {\n        char buf[0xff];\n\n        buf[sizeof(buf)-1] = '\\0';\n        while((fgets(buf, sizeof(buf)-1, udhcpc_fp)) != NULL) {\n            if ((strlen(buf) > 1) && (buf[strlen(buf) - 1] == '\\n'))\n                buf[strlen(buf) - 1] = '\\0';\n            dbg_time(\"%s\", buf);\n        }\n\n        pclose(udhcpc_fp);\n    }\n\n    return NULL;\n}\n\n//#define USE_DHCLIENT\n#ifdef USE_DHCLIENT\nstatic int dhclient_alive = 0;\n#endif\nstatic int dibbler_client_alive = 0;\n\nvoid ql_set_driver_link_state(PROFILE_T *profile, int link_state) {\n    char link_file[128];\n    int fd;\n    int new_state = 0;\n\n    snprintf(link_file, sizeof(link_file), \"/sys/class/net/%s/link_state\", profile->usbnet_adapter);\n    fd = open(link_file, O_RDWR | O_NONBLOCK | O_NOCTTY);\n    if (fd == -1) {\n        if (errno != ENOENT)\n            dbg_time(\"Fail to access %s, errno: %d (%s)\", link_file, errno, strerror(errno));\n        return;\n    }\n\n    if (profile->qmap_mode <= 1)\n        new_state = !!link_state;\n    else {\n        //0x80 means link off this pdp\n        new_state = (link_state ? 0x00 : 0x80) + (profile->muxid & 0x7F);\n    }\n\n    snprintf(link_file, sizeof(link_file), \"%d\\n\", new_state);\n    if (write(fd, link_file, sizeof(link_file)) == -1) {};\n\n    if (link_state == 0 && profile->qmapnet_adapter[0]\n        && strcmp(profile->qmapnet_adapter, profile->usbnet_adapter)) {\n        size_t rc;\n\n        lseek(fd, 0, SEEK_SET);\n        rc = read(fd, link_file, sizeof(link_file));\n        if (rc > 1 && (!strncasecmp(link_file, \"0\\n\", 2) || !strncasecmp(link_file, \"0x0\\n\", 4))) {\n            ifc_set_state(profile->usbnet_adapter, 0);\n        }\n    }\n\n    close(fd);\n}\n\nstatic const char *ipv4Str(const uint32_t Address) {\n    static char str[] = {\"255.225.255.255\"};\n    uint8_t *ip = (uint8_t *)&Address;\n\n    snprintf(str, sizeof(str), \"%d.%d.%d.%d\", ip[3], ip[2], ip[1], ip[0]);\n    return str;\n}\n\nstatic const char *ipv6Str(const UCHAR Address[16]) {\n    static char str[64];\n    uint16_t ip[8];\n    int i;\n    for (i = 0; i < 8; i++) {\n        ip[i] = (Address[i*2]<<8) + Address[i*2+1];\n    }\n\n    snprintf(str, sizeof(str), \"%x:%x:%x:%x:%x:%x:%x:%x\",\n        ip[0], ip[1], ip[2], ip[3], ip[4], ip[5], ip[6], ip[7]);\n\n    return str;\n}\n\nvoid update_ipv4_address(const char *ifname, const char *ip, const char *gw, unsigned prefix, const char *metric)\n{\n    char shell_cmd[128];\n\n    if (!ifname)\n        return;\n\n    if (!access(\"/sbin/ip\", X_OK)) {\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip -%d address flush dev %s\", 4, ifname);\n        ql_system(shell_cmd);\n\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip -%d address add %s/%u dev %s\", 4, ip, prefix, ifname);\n        ql_system(shell_cmd);\n\n        //ping6 www.qq.com\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip -%d route add default via %s dev %s metric %s\", 4, gw, ifname, metric);\n        ql_system(shell_cmd);\n    } else {\n        unsigned n =  (0xFFFFFFFF >> (32 - prefix)) << (32 - prefix);\n       // n = (n>>24) | (n>>8&0xff00) | (n<<8&0xff0000) | (n<<24);\n\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ifconfig %s %s netmask %s\", ifname, ip, ipv4Str(n));\n        ql_system(shell_cmd);\n\n        //Resetting default routes\n        dbg_time(\"Resetting default routes\");\n        //snprintf(shell_cmd, sizeof(shell_cmd), \"route del default dev %s\", ifname);\n        while(!system(shell_cmd));\n\n        snprintf(shell_cmd, sizeof(shell_cmd), \"route add default gw %s dev %s metric %s \", gw, ifname, metric);\n        ql_system(shell_cmd);\n    }\n}\n\nvoid update_ipv6_address(const char *ifname, const char *ip, const char *gw, unsigned prefix,const char* metric) {\n    char shell_cmd[128];\n\n    (void)gw;\n    if (!access(\"/sbin/ip\", X_OK)) {\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip -%d address flush dev %s\", 6, ifname);\n        ql_system(shell_cmd);\n\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip -%d address add %s/%u dev %s\", 6, ip, prefix, ifname);\n        ql_system(shell_cmd);\n\n        //ping6 www.qq.com\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip -%d route add default dev %s metric %s \", 6, ifname, metric);\n        ql_system(shell_cmd);\n    } else {\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ifconfig %s %s/%d\", ifname, ip, prefix);\n        ql_system(shell_cmd);\n\n        snprintf(shell_cmd, sizeof(shell_cmd), \"route -A inet6 add default dev %s metric %s \", ifname ,metric);\n        ql_system(shell_cmd);\n    }\n}\n\nstatic void update_ip_address_by_qmi(const char *ifname, const IPV4_T *ipv4, const IPV6_T *ipv6,const PROFILE_T *profile) {\n    char *d1, *d2;\n\n    if (ipv4 && ipv4->Address) {\n        d1 = strdup(ipv4Str(ipv4->Address));\n        d2 = strdup(ipv4Str(ipv4->Gateway));\n        unsigned prefix = 0;\n        unsigned n = 0;\n\n        for (n = 0; n < 32; n++) {\n            if (ipv4->SubnetMask&((unsigned)1<<n)) {\n                prefix++;\n            }\n        }\n\n        update_ipv4_address(ifname, d1, d2, prefix,profile->metric);\n        free(d1); free(d2);\n\n        //Adding DNS\n        if (ipv4->DnsPrimary && !profile->no_dns) {\n            d1 = strdup(ipv4Str(ipv4->DnsPrimary));\n            d2 = strdup(ipv4Str(ipv4->DnsSecondary ? ipv4->DnsSecondary : ipv4->DnsPrimary));\n            update_resolv_conf(4, ifname, d1, d2);\n            free(d1); free(d2);\n        }\n    }\n\n    if (ipv6 && ipv6->Address[0] && ipv6->PrefixLengthIPAddr) {\n        d1 = strdup(ipv6Str(ipv6->Address));\n        d2 = strdup(ipv6Str(ipv6->Gateway));\n\n        update_ipv6_address(ifname, d1, d2, ipv6->PrefixLengthIPAddr,profile->metric);\n        free(d1); free(d2);\n\n        //Adding DNS\n        if (ipv6->DnsPrimary[0]  && !profile->no_dns) {\n            d1 = strdup(ipv6Str(ipv6->DnsPrimary));\n            d2 = strdup(ipv6Str(ipv6->DnsSecondary[0] ? ipv6->DnsSecondary : ipv6->DnsPrimary));\n            update_resolv_conf(6, ifname, d1, d2);\n            free(d1); free(d2);\n        }\n    }\n}\n\n//#define QL_OPENWER_NETWORK_SETUP\n#ifdef QL_OPENWER_NETWORK_SETUP\nstatic const char *openwrt_lan = \"br-lan\";\nstatic const char *openwrt_wan = \"wwan0\";\n\nstatic int ql_openwrt_system(const char *cmd) {\n    int i;\n    int ret = 1;\n    char shell_cmd[128];\n\n    snprintf(shell_cmd, sizeof(shell_cmd), \"%s 2>1 > /dev/null\", cmd);\n    \n    for (i = 0; i < 15; i++) {\n        dbg_time(\"%s\", cmd);\n        ret = system(shell_cmd);\n        if (!ret)\n            break;\n        sleep(1);\n    }\n\n    return ret;\n}\n\nstatic int ql_openwrt_is_wan(const char *ifname) {\n    if (openwrt_lan == NULL) {\n        system(\"uci show network.wan.ifname\");\n    }\n\n    if (strcmp(ifname, openwrt_wan))\n        return 0;\n\n    return 1;\n}\n\nstatic void ql_openwrt_setup_wan(const char *ifname, const IPV4_T *ipv4) {\n    FILE *fp = NULL;\n    char config[64];\n\n    snprintf(config, sizeof(config), \"/tmp/rmnet_%s_ipv4config\", ifname);\n     \n    if (ipv4 == NULL) {\n        if (ql_openwrt_is_wan(ifname))\n            ql_openwrt_system(\"ifdown wan\");\n        return;\n    }\n\n    fp = fopen(config, \"w\");\n    if (fp == NULL)\n        return;\n\n    fprintf(fp, \"IFNAME=\\\"%s\\\"\\n\", ifname);\n    fprintf(fp, \"PUBLIC_IP=\\\"%s\\\"\\n\", ipv4Str(ipv4->Address));\n    fprintf(fp, \"NETMASK=\\\"%s\\\"\\n\", ipv4Str(ipv4->SubnetMask));\n    fprintf(fp, \"GATEWAY=\\\"%s\\\"\\n\", ipv4Str(ipv4->Gateway));\n    fprintf(fp, \"DNSSERVERS=\\\"%s\", ipv4Str(ipv4->DnsPrimary));\n    if (ipv4->DnsSecondary != 0)\n        fprintf(fp, \" %s\", ipv4Str(ipv4->DnsSecondary));\n    fprintf(fp, \"\\\"\\n\");\n\n    fclose(fp);\n\n    if (!ql_openwrt_is_wan(ifname))\n        return;\n    \n    ql_openwrt_system(\"ifup wan\");\n}\n\nstatic void ql_openwrt_setup_wan6(const char *ifname, const IPV6_T *ipv6) {\n    FILE *fp = NULL;\n    char config[64];\n    int first_ifup;\n     \n    snprintf(config, sizeof(config), \"/tmp/rmnet_%s_ipv6config\", ifname);\n     \n    if (ipv6 == NULL) {\n        if (ql_openwrt_is_wan(ifname))\n            ql_openwrt_system(\"ifdown wan6\");\n        return;\n    }\n\n    first_ifup = (access(config, F_OK) != 0);\n\n    fp = fopen(config, \"w\");\n    if (fp == NULL)\n        return;\n\n    fprintf(fp, \"IFNAME=\\\"%s\\\"\\n\", ifname);\n    fprintf(fp, \"PUBLIC_IP=\\\"%s\\\"\\n\", ipv6Str(ipv6->Address));\n    fprintf(fp, \"NETMASK=\\\"%s\\\"\\n\", ipv6Str(ipv6->SubnetMask));\n    fprintf(fp, \"GATEWAY=\\\"%s\\\"\\n\", ipv6Str(ipv6->Gateway));\n    fprintf(fp, \"PrefixLength=\\\"%d\\\"\\n\", ipv6->PrefixLengthIPAddr);\n    fprintf(fp, \"DNSSERVERS=\\\"%s\", ipv6Str(ipv6->DnsPrimary));\n    if (ipv6->DnsSecondary[0])\n        fprintf(fp, \" %s\", ipv6Str(ipv6->DnsSecondary));\n    fprintf(fp, \"\\\"\\n\");\n\n    fclose(fp);\n\n    if (!ql_openwrt_is_wan(ifname))\n        return;\n\n    if (first_ifup)\n        ql_openwrt_system(\"ifup wan6\");\n    else\n        ql_openwrt_system(\"/etc/init.d/network restart\"); //make PC to release old IPV6 address, and RS new IPV6 address\n\n#if 1 //TODO? why need this?\n    if (openwrt_lan) {\n        int i;\n        char shell_cmd[128];\n        UCHAR Address[16] = {0};\n\n        ql_openwrt_system((\"ifstatus lan\"));\n\n        for (i = 0; i < (ipv6->PrefixLengthIPAddr/8); i++)\n            Address[i] = ipv6->Address[i];\n\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip route del %s/%u dev %s\", ipv6Str(Address), ipv6->PrefixLengthIPAddr, ifname);\n        ql_openwrt_system(shell_cmd);\n\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip route add %s/%u dev %s\", ipv6Str(Address), ipv6->PrefixLengthIPAddr, openwrt_lan);\n        ql_system(shell_cmd);        \n    }\n#endif\n}\n#endif\n\nvoid udhcpc_start(PROFILE_T *profile) {\n    char *ifname = profile->usbnet_adapter;\n\n    ql_set_driver_link_state(profile, 1);\n\n    if (profile->qmapnet_adapter[0]) {\n        ifname = profile->qmapnet_adapter;\n    }\n\n    if (profile->rawIP && profile->ipv4.Address && profile->ipv4.Mtu) {\n        ql_set_mtu(ifname, (profile->ipv4.Mtu));\n    }\n\n    if (strcmp(ifname, profile->usbnet_adapter)) {\n        ifc_set_state(profile->usbnet_adapter, 1);\n        if (ifc_get_flags(ifname)&IFF_UP) {\n            ifc_set_state(ifname, 0);\n        }\n    }\n\n    ifc_set_state(ifname, 1);\n    if (profile->ipv4.Address) {\n        if (profile->PCSCFIpv4Addr1)\n            dbg_time(\"pcscf1: %s\", ipv4Str(profile->PCSCFIpv4Addr1));\n        if (profile->PCSCFIpv4Addr2)\n            dbg_time(\"pcscf2: %s\", ipv4Str(profile->PCSCFIpv4Addr2));\n    }\n\n    if (profile->ipv6.Address[0] && profile->ipv6.PrefixLengthIPAddr) {\n        if (profile->PCSCFIpv6Addr1[0])\n            dbg_time(\"pcscf1: %s\", ipv6Str(profile->PCSCFIpv6Addr1));\n        if (profile->PCSCFIpv6Addr2[0])\n            dbg_time(\"pcscf2: %s\", ipv6Str(profile->PCSCFIpv6Addr2));\n    }\n\n#if 1 //for bridge mode, only one public IP, so do udhcpc manually\n    if (ql_bridge_mode_detect(profile)) {\n        return;\n    }\n#endif\n\n//because must use udhcpc to obtain IP when working on ETH mode,\n//so it is better also use udhcpc to obtain IP when working on IP mode.\n//use the same policy for all modules\n#if 0\n    if (profile->rawIP != 0) //mdm9x07/ec25,ec20 R2.0\n    {\n        update_ip_address_by_qmi(ifname, &profile->ipv4, profile->ipv6, profile);\n        return;\n    }\n#endif\n\n    if (profile->ipv4.Address == 0)\n        goto set_ipv6;\n\n    if (profile->no_dhcp || profile->request_ops == &mbim_request_ops) { //lots of mbim modem do not support DHCP\n        update_ip_address_by_qmi(ifname, &profile->ipv4, NULL, profile);\n    }\n    else\n/* Do DHCP using busybox tools */\n    {\n        char udhcpc_cmd[128];\n        pthread_attr_t udhcpc_thread_attr;\n        pthread_t udhcpc_thread_id;\n\n        pthread_attr_init(&udhcpc_thread_attr);\n        pthread_attr_setdetachstate(&udhcpc_thread_attr, PTHREAD_CREATE_DETACHED);\n\n#ifdef USE_DHCLIENT\n            snprintf(udhcpc_cmd, sizeof(udhcpc_cmd), \"dhclient -4 -d --no-pid %s\", ifname);\n            dhclient_alive++;\n#else\n            if (access(\"/usr/share/udhcpc/default.script\", X_OK)\n                && access(\"/etc//udhcpc/default.script\", X_OK)) {\n                dbg_time(\"No default.script found, it should be in '/usr/share/udhcpc/' or '/etc//udhcpc' depend on your udhcpc version!\");\n            }\n\n            //-f,--foreground    Run in foreground\n            //-b,--background    Background if lease is not obtained\n            //-n,--now        Exit if lease is not obtained\n            //-q,--quit        Exit after obtaining lease\n            //-t,--retries N        Send up to N discover packets (default 3)\n            snprintf(udhcpc_cmd, sizeof(udhcpc_cmd), \"busybox udhcpc -f -n -q -t 5 -i %s\", ifname);\n#endif\n\n#if 1 //for OpenWrt\n            if (!access(\"/lib/netifd/dhcp.script\", X_OK) && !access(\"/sbin/ifup\", X_OK) && !access(\"/sbin/ifstatus\", X_OK)) {\n#if 0 //20210415 do not promot these message\n                dbg_time(\"you are use OpenWrt?\");\n                dbg_time(\"should not calling udhcpc manually?\");\n                dbg_time(\"should modify /etc/config/network as below?\");\n                dbg_time(\"config interface wan\");\n                dbg_time(\"\\toption ifname\t%s\", ifname);\n                dbg_time(\"\\toption proto\tdhcp\");\n                dbg_time(\"should use \\\"/sbin/ifstaus wan\\\" to check %s 's status?\", ifname);\n#endif\n            }\n#endif\n\n#ifdef USE_DHCLIENT            \n            pthread_create(&udhcpc_thread_id, &udhcpc_thread_attr, udhcpc_thread_function, (void*)strdup(udhcpc_cmd));\n            sleep(1);\n#else\n            pthread_create(&udhcpc_thread_id, NULL, udhcpc_thread_function, (void*)strdup(udhcpc_cmd));\n            pthread_join(udhcpc_thread_id, NULL);\n            if (profile->request_ops == &atc_request_ops) {\n                profile->udhcpc_ip = 0;\n                ifc_get_addr(ifname, &profile->udhcpc_ip);\n                if (profile->udhcpc_ip != profile->ipv4.Address) {\n                    unsigned char *l = (unsigned char *)&profile->udhcpc_ip;\n                    unsigned char *r = (unsigned char *)&profile->ipv4.Address;\n                    dbg_time(\"ERROR: IP from udhcpc (%d.%d.%d.%d) is different to IP from ATC (%d.%d.%d.%d)!\",\n                              l[0], l[1], l[2], l[3], r[0], r[1], r[2], r[3]);\n                    ql_get_netcard_carrier_state(ifname); //miss udhcpc default.script or modem not report usb-net-cdc-linkup\n                }\n            }\n\n            if (profile->request_ops != &qmi_request_ops) { //only QMI modem support next fixup!\n                goto set_ipv6;\n            }\n\n            if (ql_raw_ip_mode_check(ifname, profile->ipv4.Address)) {\n                pthread_create(&udhcpc_thread_id, NULL, udhcpc_thread_function, (void*)strdup(udhcpc_cmd));\n                pthread_join(udhcpc_thread_id, NULL);\n            }\n\n            if (!ql_netcard_ipv4_address_check(ifname, qmi2addr(profile->ipv4.Address))) {\n                //no udhcpc's default.script exist, directly set ip and dns\n                update_ip_address_by_qmi(ifname, &profile->ipv4, NULL, profile);\n            }\n            //Add by Demon. check default route \n            FILE *rt_fp = NULL;\n            char rt_cmd[128] = {0};\n            \n            //Check if there is a default route. \n            snprintf(rt_cmd, sizeof(rt_cmd), \"route -n | grep %s | awk '{print $1}' | grep 0.0.0.0\", ifname);\n            rt_fp = popen((const char *)rt_cmd, \"r\");\n            if (rt_fp != NULL) {\n              char buf[20] = {0};\n              int found_default_rt = 0;\n\n              if (fgets(buf, sizeof(buf), rt_fp) != NULL) {\n                //Find the specified interface\n                found_default_rt = 1;\n              }\n\n              if (1 == found_default_rt) {\n                //dbg_time(\"Route items found for %s\", ifname);\n              }\n              else {\n                dbg_time(\"Warning: No route items found for %s\", ifname);\n              }\n\n              pclose(rt_fp);\n            }\n            //End by Demon.\n#endif\n    }\n\n#ifdef QL_OPENWER_NETWORK_SETUP\n    ql_openwrt_setup_wan(ifname, &profile->ipv4);\n#endif\n\nset_ipv6:\n    if (profile->ipv6.Address[0] && profile->ipv6.PrefixLengthIPAddr) {\n#if 1\n        //module do not support DHCPv6, only support 'Router Solicit'\n        //and it seem if enable /proc/sys/net/ipv6/conf/all/forwarding, Kernel do not send RS\n        const char *forward_file = \"/proc/sys/net/ipv6/conf/all/forwarding\";\n        int forward_fd = open(forward_file, O_RDONLY);\n        if (forward_fd > 0) {\n            char forward_state[2];\n            if (read(forward_fd, forward_state, 2) == -1) {};\n            if (forward_state[0] == '1') {\n                //dbg_time(\"%s enabled, kernel maybe donot send 'Router Solicit'\", forward_file);\n            }\n            close(forward_fd);\n        }\n\n        update_ip_address_by_qmi(ifname, NULL, &profile->ipv6, profile);\n\n        if (profile->ipv6.DnsPrimary[0] || profile->ipv6.DnsSecondary[0]) {\n            char dns1str[64], dns2str[64];\n\n            if (profile->ipv6.DnsPrimary[0]) {\n                strcpy(dns1str, ipv6Str(profile->ipv6.DnsPrimary));\n            }\n\n            if (profile->ipv6.DnsSecondary[0]) {\n                strcpy(dns2str, ipv6Str(profile->ipv6.DnsSecondary));\n            }\n            if (!profile->no_dns)\n                update_resolv_conf(6, ifname, profile->ipv6.DnsPrimary[0] ? dns1str : NULL,\n                               profile->ipv6.DnsSecondary[0] != '\\0' ? dns2str : NULL);\n        }\n\n#ifdef QL_OPENWER_NETWORK_SETUP\n            ql_openwrt_setup_wan6(ifname, &profile->ipv6);\n#endif\n#else\n#ifdef USE_DHCLIENT\n        snprintf(udhcpc_cmd, sizeof(udhcpc_cmd), \"dhclient -6 -d --no-pid %s\",  ifname);\n        dhclient_alive++;\n#else\n        /*\n            DHCPv6: Dibbler - a portable DHCPv6\n            1. download from http://klub.com.pl/dhcpv6/\n            2. cross-compile\n                2.1 ./configure --host=arm-linux-gnueabihf\n                2.2 copy dibbler-client to your board\n            3. mkdir -p /var/log/dibbler/ /var/lib/ on your board\n            4. create /etc/dibbler/client.conf on your board, the content is\n                log-mode short\n                log-level 7\n                iface wwan0 {\n                    ia\n                    option dns-server\n                }\n             5. run \"dibbler-client start\" to get ipV6 address\n             6. run \"route -A inet6 add default dev wwan0\" to add default route\n        */\n        snprintf(shell_cmd, sizeof(shell_cmd), \"route -A inet6 add default %s\", ifname);\n        ql_system(shell_cmd);\n        snprintf(udhcpc_cmd, sizeof(udhcpc_cmd), \"dibbler-client run\");\n        dibbler_client_alive++;\n#endif\n\n        pthread_create(&udhcpc_thread_id, &udhcpc_thread_attr, udhcpc_thread_function, (void*)strdup(udhcpc_cmd));\n#endif\n    }\n}\n\nvoid udhcpc_stop(PROFILE_T *profile) {\n    char *ifname = profile->usbnet_adapter;\n    char shell_cmd[128];\n\n    ql_set_driver_link_state(profile, 0);\n\n    if (profile->qmapnet_adapter[0]) {\n        ifname = profile->qmapnet_adapter;\n    }\n\n#ifdef USE_DHCLIENT\n    if (dhclient_alive) {\n        system(\"killall dhclient\");\n        dhclient_alive = 0;\n    }\n#endif\n    if (dibbler_client_alive) {\n        if (system(\"killall dibbler-client\")) {};\n        dibbler_client_alive = 0;\n    }\n\n    profile->udhcpc_ip = 0;\n//it seems when call netif_carrier_on(), and netcard 's IP is \"0.0.0.0\", will cause netif_queue_stopped()\n    if (!access(\"/sbin/ip\", X_OK))\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip addr flush dev %s\", ifname);\n    else\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ifconfig %s 0.0.0.0\", ifname);\n    ql_system(shell_cmd);\n    ifc_set_state(ifname, 0);\n\n#ifdef QL_OPENWER_NETWORK_SETUP\n    ql_openwrt_setup_wan(ifname, NULL);\n    ql_openwrt_setup_wan6(ifname, NULL);\n#endif\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/udhcpc_netlink.c",
    "content": "#include <sys/socket.h>\n#include <sys/select.h>\n#include <sys/types.h>\n#include <net/if.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <endian.h>\n\n#include \"libmnl/ifutils.h\"\n#include \"libmnl/dhcp/dhcp.h\"\n#include \"util.h\"\n#include \"QMIThread.h\"\n\nstatic int ql_raw_ip_mode_check(const char *ifname)\n{\n    int fd;\n    char raw_ip[128];\n    char mode[2] = \"X\";\n    int mode_change = 0;\n\n    snprintf(raw_ip, sizeof(raw_ip), \"/sys/class/net/%s/qmi/raw_ip\", ifname);\n    if (access(raw_ip, F_OK))\n        return 0;\n\n    fd = open(raw_ip, O_RDWR | O_NONBLOCK | O_NOCTTY);\n    if (fd < 0)\n    {\n        dbg_time(\"%s %d fail to open(%s), errno:%d (%s)\", __FILE__, __LINE__, raw_ip, errno, strerror(errno));\n        return 0;\n    }\n\n    read(fd, mode, 2);\n    if (mode[0] == '0' || mode[0] == 'N')\n    {\n        if_link_down(ifname);\n        dbg_time(\"echo Y > /sys/class/net/%s/qmi/raw_ip\", ifname);\n        mode[0] = 'Y';\n        write(fd, mode, 2);\n        mode_change = 1;\n        if_link_up(ifname);\n    }\n\n    close(fd);\n    return mode_change;\n}\n\nvoid ql_set_driver_link_state(PROFILE_T *profile, int link_state)\n{\n    char link_file[128];\n    int fd;\n    int new_state = 0;\n\n    snprintf(link_file, sizeof(link_file), \"/sys/class/net/%s/link_state\", profile->usbnet_adapter);\n    fd = open(link_file, O_RDWR | O_NONBLOCK | O_NOCTTY);\n    if (fd == -1)\n    {\n        if (errno != ENOENT)\n            dbg_time(\"Fail to access %s, errno: %d (%s)\", link_file, errno, strerror(errno));\n        return;\n    }\n\n    if (profile->qmap_mode <= 1)\n        new_state = !!link_state;\n    else\n    {\n        //0x80 means link off this pdp\n        new_state = (link_state ? 0x00 : 0x80) + profile->pdp;\n    }\n\n    snprintf(link_file, sizeof(link_file), \"%d\\n\", new_state);\n    write(fd, link_file, sizeof(link_file));\n\n    if (link_state == 0 && profile->qmap_mode > 1)\n    {\n        size_t rc;\n\n        lseek(fd, 0, SEEK_SET);\n        rc = read(fd, link_file, sizeof(link_file));\n        if (rc > 1 && (!strcasecmp(link_file, \"0\\n\") || !strcasecmp(link_file, \"0x0\\n\")))\n        {\n            if_link_down(profile->usbnet_adapter);\n        }\n    }\n\n    close(fd);\n}\n\nvoid udhcpc_start(PROFILE_T *profile)\n{\n    char *ifname = profile->usbnet_adapter;\n\n    ql_set_driver_link_state(profile, 1);\n    ql_raw_ip_mode_check(ifname);\n\n    if (profile->qmapnet_adapter)\n    {\n        ifname = profile->qmapnet_adapter;\n    }\n    if (profile->rawIP && profile->ipv4.Address && profile->ipv4.Mtu)\n    {\n        if_set_mtu(ifname, (profile->ipv4.Mtu));\n    }\n\n    if (strcmp(ifname, profile->usbnet_adapter))\n    {\n        if_link_up(profile->usbnet_adapter);\n    }\n\n    if_link_up(ifname);\n\n#if 1 //for bridge mode, only one public IP, so do udhcpc manually\n    if (ql_bridge_mode_detect(profile))\n    {\n        return;\n    }\n#endif\n    // if use DHCP(should make with ${DHCP} src files)\n    // do_dhcp(ifname);\n    // return 0;\n    /* IPv4 Addr Info */\n    if (profile->ipv4.Address)\n    {\n        dbg_time(\"IPv4 MTU: %d\", profile->ipv4.Mtu);\n        dbg_time(\"IPv4 Address: %s\", ipaddr_to_string_v4(ntohl(profile->ipv4.Address)));\n        dbg_time(\"IPv4 Netmask: %d\", mask_to_prefix_v4(ntohl(profile->ipv4.SubnetMask)));\n        dbg_time(\"IPv4 Gateway: %s\", ipaddr_to_string_v4(ntohl(profile->ipv4.Gateway)));\n        dbg_time(\"IPv4 DNS1: %s\", ipaddr_to_string_v4(ntohl(profile->ipv4.DnsPrimary)));\n        dbg_time(\"IPv4 DNS2: %s\", ipaddr_to_string_v4(ntohl(profile->ipv4.DnsSecondary)));\n        if_set_network_v4(ifname, ntohl(profile->ipv4.Address),\n                       mask_to_prefix_v4(profile->ipv4.SubnetMask),\n                       ntohl(profile->ipv4.Gateway),\n                       ntohl(profile->ipv4.DnsPrimary),\n                       ntohl(profile->ipv4.DnsSecondary));\n    }\n\n    if (profile->ipv6.Address[0] && profile->ipv6.PrefixLengthIPAddr)\n    {\n        //module do not support DHCPv6, only support 'Router Solicit'\n        //and it seem if enable /proc/sys/net/ipv6/conf/all/forwarding, Kernel do not send RS\n        const char *forward_file = \"/proc/sys/net/ipv6/conf/all/forwarding\";\n        int forward_fd = open(forward_file, O_RDONLY);\n        if (forward_fd > 0)\n        {\n            char forward_state[2];\n            read(forward_fd, forward_state, 2);\n            if (forward_state[0] == '1')\n            {\n                dbg_time(\"%s enabled, kernel maybe donot send 'Router Solicit'\", forward_file);\n            }\n            close(forward_fd);\n        }\n\n        dbg_time(\"IPv6 MTU: %d\", profile->ipv6.Mtu);\n        dbg_time(\"IPv6 Address: %s\", ipaddr_to_string_v6(profile->ipv6.Address));\n        dbg_time(\"IPv6 Netmask: %d\", profile->ipv6.PrefixLengthIPAddr);\n        dbg_time(\"IPv6 Gateway: %s\", ipaddr_to_string_v6(profile->ipv6.Gateway));\n        dbg_time(\"IPv6 DNS1: %s\", ipaddr_to_string_v6(profile->ipv6.DnsPrimary));\n        dbg_time(\"IPv6 DNS2: %s\", ipaddr_to_string_v6(profile->ipv6.DnsSecondary));\n        if_set_network_v6(ifname, profile->ipv6.Address, profile->ipv6.PrefixLengthIPAddr,\n                       profile->ipv6.Gateway, profile->ipv6.DnsPrimary, profile->ipv6.DnsSecondary);\n    }\n}\n\nvoid udhcpc_stop(PROFILE_T *profile)\n{\n    char *ifname = profile->usbnet_adapter;\n\n    ql_set_driver_link_state(profile, 0);\n\n    if (profile->qmapnet_adapter)\n    {\n        ifname = profile->qmapnet_adapter;\n    }\n\n    if_link_down(ifname);\n    if_flush_v4_addr(ifname);\n    if_flush_v6_addr(ifname);\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/udhcpc_script.c",
    "content": "/******************************************************************************\n  @file    udhcpc.c\n  @brief   call DHCP tools to obtain IP address.\n\n  DESCRIPTION\n  Connectivity Management Tool for USB network adapter of Quectel wireless cellular modules.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n#include <sys/socket.h>\n#include <sys/select.h>\n#include <sys/types.h>\n#include <net/if.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <endian.h>\n\n#include \"util.h\"\n#include \"QMIThread.h\"\n\n#define IFDOWN_SCRIPT \"/etc/quectel/ifdown.sh\"\n#define IFUP_SCRIPT \"/etc/quectel/ifup.sh\"\n\nstatic int ql_system(const char *shell_cmd)\n{\n    dbg_time(\"%s\", shell_cmd);\n    return system(shell_cmd);\n}\n\nuint32_t mask_to_prefix_v4(uint32_t mask)\n{\n    uint32_t prefix = 0;\n    while (mask)\n    {\n        mask = mask & (mask - 1);\n        prefix++;\n    }\n    return prefix;\n}\n\nuint32_t mask_from_prefix_v4(uint32_t prefix)\n{\n    return ~((1 << (32 - prefix)) - 1);\n}\n\n/* mask in int */\nuint32_t broadcast_from_mask(uint32_t ip, uint32_t mask)\n{\n    return (ip & mask) | (~mask);\n}\n\nconst char *ipaddr_to_string_v4(in_addr_t ipaddr, char *buf, size_t size)\n{\n    //    static char buf[INET6_ADDRSTRLEN] = {'\\0'};\n    buf[0] = '\\0';\n    uint32_t addr = ipaddr;\n    return inet_ntop(AF_INET, &addr, buf, size);\n}\n\nconst char *ipaddr_to_string_v6(uint8_t *ipaddr, char *buf, size_t size)\n{\n    buf[0] = '\\0';\n    return inet_ntop(AF_INET6, ipaddr, buf, size);\n}\n\n/**\n * For more details see default.script\n * \n * The main aim of this function is offload ip management to script, CM has not interest in manage IP address.\n * just tell script all the info about ip, mask, router, dns...\n */\nvoid udhcpc_start(PROFILE_T *profile)\n{\n    char shell_cmd[1024];\n    char ip[128];\n    char subnet[128];\n    char broadcast[128];\n    char router[128];\n    char domain1[128];\n    char domain2[128];\n\n    if (NULL == getenv(IFUP_SCRIPT))\n        return;\n\n    // manage IPv4???\n    // check rawip ???\n    snprintf(shell_cmd, sizeof(shell_cmd),\n             \" netiface=%s interface=%s mtu=%u ip=%s subnet=%s broadcast=%s router=%s\"\n             \" domain=\\\"%s %s\\\" %s\",\n             profile->usbnet_adapter,\n             profile->qmapnet_adapter ? profile->qmapnet_adapter : profile->usbnet_adapter,\n             profile->ipv4.Mtu,\n             ipaddr_to_string_v4(ntohl(profile->ipv4.Address), ip, sizeof(ip)),\n             ipaddr_to_string_v4(ntohl(profile->ipv4.SubnetMask), subnet, sizeof(subnet)),\n             ipaddr_to_string_v4(ntohl(broadcast_from_mask(profile->ipv4.Address, profile->ipv4.SubnetMask)),\n                                 broadcast, sizeof(broadcast)),\n             ipaddr_to_string_v4(ntohl(profile->ipv4.Gateway), router, sizeof(router)),\n             ipaddr_to_string_v4(ntohl(profile->ipv4.DnsPrimary), domain1, sizeof(domain1)),\n             ipaddr_to_string_v4(ntohl(profile->ipv4.DnsSecondary), domain2, sizeof(domain2)),\n             getenv(IFUP_SCRIPT));\n    ql_system(shell_cmd);\n\n    // manage IPv6???\n}\n\n/**\n * For more details see default.script\n * \n * The main aim of this function is offload ip management to script, CM has not interest in manage IP address.\n * just tell script all the info about ip, mask, router, dns...\n */\nvoid udhcpc_stop(PROFILE_T *profile)\n{\n    char shell_cmd[1024];\n\n    if (NULL == getenv(IFDOWN_SCRIPT))\n        return;\n\n    snprintf(shell_cmd, sizeof(shell_cmd),\n             \"netiface=%s interface=%s %s\",\n             profile->usbnet_adapter,\n             profile->qmapnet_adapter ? profile->qmapnet_adapter : profile->usbnet_adapter,\n             getenv(IFDOWN_SCRIPT));\n    ql_system(shell_cmd);\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/util.c",
    "content": "/******************************************************************************\n  @file    util.c\n  @brief   some utils for this QCM tool.\n\n  DESCRIPTION\n  Connectivity Management Tool for USB network adapter of Quectel wireless cellular modules.\n\n  INITIALIZATION AND SEQUENCING REQUIREMENTS\n  None.\n\n  ---------------------------------------------------------------------------\n  Copyright (c) 2016 - 2023 Quectel Wireless Solution, Co., Ltd.  All Rights Reserved.\n  Quectel Wireless Solution Proprietary and Confidential.\n  ---------------------------------------------------------------------------\n******************************************************************************/\n\n#include <sys/time.h>\n#include <net/if.h>\ntypedef unsigned short sa_family_t;\n#include <linux/un.h>\n\n#if defined(__STDC__)\n#include <stdarg.h>\n#define __V(x)\tx\n#else\n#include <varargs.h>\n#define __V(x)\t(va_alist) va_dcl\n#define const\n#define volatile\n#endif\n\n#include <syslog.h>\n\n#include \"QMIThread.h\"\n\npthread_mutex_t cm_command_mutex = PTHREAD_MUTEX_INITIALIZER;\npthread_cond_t cm_command_cond = PTHREAD_COND_INITIALIZER;\nunsigned int cm_recv_buf[1024];\n\nint cm_open_dev(const char *dev) {\n    int fd;\n\n    fd = open(dev, O_RDWR | O_NONBLOCK | O_NOCTTY);\n    if (fd != -1) {\n        fcntl(fd, F_SETFL, fcntl(fd,F_GETFL) | O_NONBLOCK);\n        fcntl(fd, F_SETFD, FD_CLOEXEC);\n\n        if (!strncmp(dev, \"/dev/tty\", strlen(\"/dev/tty\")))\n        {\n            //disable echo on serial ports \n            struct termios  ios;\n\n            memset(&ios, 0, sizeof(ios));\n            tcgetattr( fd, &ios );\n            cfmakeraw(&ios);\n            cfsetispeed(&ios, B115200);\n            cfsetospeed(&ios, B115200);\n            tcsetattr( fd, TCSANOW, &ios );\n            tcflush(fd, TCIOFLUSH);\n        }\n    } else {\n        dbg_time(\"Failed to open %s, errno: %d (%s)\", dev, errno, strerror(errno));\n    }\n\n    return fd;\n}\n\nint cm_open_proxy(const char *name) {\n    int sockfd = -1;\n    int reuse_addr = 1;\n    struct sockaddr_un sockaddr;\n    socklen_t alen;\n\n    /*Create server socket*/\n    sockfd = socket(AF_LOCAL, SOCK_STREAM, 0);\n    if (sockfd < 0)\n        return sockfd;\n\n    memset(&sockaddr, 0, sizeof(sockaddr));\n    sockaddr.sun_family = AF_LOCAL;\n    sockaddr.sun_path[0] = 0;\n    memcpy(sockaddr.sun_path + 1, name, strlen(name) );\n\n    alen = strlen(name) + offsetof(struct sockaddr_un, sun_path) + 1;\n    if(connect(sockfd, (struct sockaddr *)&sockaddr, alen) < 0) {\n        close(sockfd);\n        dbg_time(\"connect %s errno: %d (%s)\", name, errno, strerror(errno));\n        return -1;\n    }\n    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse_addr,sizeof(reuse_addr));\n    fcntl(sockfd, F_SETFL, fcntl(sockfd,F_GETFL) | O_NONBLOCK);\n    fcntl(sockfd, F_SETFD, FD_CLOEXEC);\n\n    dbg_time(\"connect to %s sockfd = %d\", name, sockfd);\n\n    return sockfd;\n}\n\nstatic void setTimespecRelative(struct timespec *p_ts, long long msec)\n{\n    struct timeval tv;\n\n    gettimeofday(&tv, (struct timezone *) NULL);\n\n    /* what's really funny about this is that I know\n       pthread_cond_timedwait just turns around and makes this\n       a relative time again */\n    p_ts->tv_sec = tv.tv_sec + (msec / 1000);\n    p_ts->tv_nsec = (tv.tv_usec + (msec % 1000) * 1000L ) * 1000L;\n    if ((unsigned long)p_ts->tv_nsec >= 1000000000UL) {\n        p_ts->tv_sec += 1;\n        p_ts->tv_nsec -= 1000000000UL;\n    }\n}\n\nint pthread_cond_timeout_np(pthread_cond_t *cond, pthread_mutex_t * mutex, unsigned msecs) {\n    if (msecs != 0) {\n        unsigned i;\n        unsigned t = msecs/4;\n        int ret = 0;\n\n        if (t == 0)\n            t = 1;\n\n        for (i = 0; i < msecs; i += t) {\n            struct timespec ts;\n            setTimespecRelative(&ts, t);\n//very old uclibc do not support pthread_condattr_setclock(CLOCK_MONOTONIC)\n            ret = pthread_cond_timedwait(cond, mutex, &ts); //to advoid system time change\n            if (ret != ETIMEDOUT) {\n                if(ret) dbg_time(\"ret=%d, msecs=%u, t=%u\", ret, msecs, t);\n                break;\n            }\n        }\n\n        return ret;\n    } else {\n        return pthread_cond_wait(cond, mutex);\n    }\n}\n\nconst char * get_time(void) {\n    static char time_buf[128];\n    struct timeval  tv;\n    time_t time;\n    suseconds_t millitm;\n    struct tm *ti;\n\n    gettimeofday (&tv, NULL);\n\n    time= tv.tv_sec;\n    millitm = (tv.tv_usec + 500) / 1000;\n\n    if (millitm == 1000) {\n        ++time;\n        millitm = 0;\n    }\n\n    ti = localtime(&time);\n    sprintf(time_buf, \"%02d-%02d_%02d:%02d:%02d:%03d\", ti->tm_mon+1, ti->tm_mday, ti->tm_hour, ti->tm_min, ti->tm_sec, (int)millitm);\n    return time_buf;\n}\n\nunsigned long clock_msec(void)\n{\n\tstruct timespec tm;\n\tclock_gettime( CLOCK_MONOTONIC, &tm);\n\treturn (unsigned long)(tm.tv_sec*1000 + (tm.tv_nsec/1000000));\n}\n\nFILE *logfilefp = NULL;\n\nvoid update_resolv_conf(int iptype, const char *ifname, const char *dns1, const char *dns2) {\n    const char *dns_file = \"/etc/resolv.conf\";\n    FILE *dns_fp;\n    char dns_line[256];\n    #define MAX_DNS 16\n    char *dns_info[MAX_DNS];\n    char dns_tag[64];\n    int dns_match = 0;\n    int i;\n\n    snprintf(dns_tag, sizeof(dns_tag), \"# IPV%d %s\", iptype, ifname);\n\n    for (i = 0; i < MAX_DNS; i++)\n        dns_info[i] = NULL;\n    \n    dns_fp = fopen(dns_file, \"r\");\n    if (dns_fp) {\n        i = 0;    \n        dns_line[sizeof(dns_line)-1] = '\\0';\n        \n        while((fgets(dns_line, sizeof(dns_line)-1, dns_fp)) != NULL) {\n            if ((strlen(dns_line) > 1) && (dns_line[strlen(dns_line) - 1] == '\\n'))\n                dns_line[strlen(dns_line) - 1] = '\\0';\n            //dbg_time(\"%s\", dns_line);\n            if (strstr(dns_line, dns_tag)) {\n                dns_match++;\n                continue;\n            }\n            dns_info[i++] = strdup(dns_line);\n            if (i == MAX_DNS)\n                break;\n        }\n\n        fclose(dns_fp);\n    }\n    else if (errno != ENOENT) {\n        dbg_time(\"fopen %s fail, errno:%d (%s)\", dns_file, errno, strerror(errno));\n        return;\n    }\n    \n    if (dns1 == NULL && dns_match == 0)\n        return;\n\n    dns_fp = fopen(dns_file, \"w\");\n    if (dns_fp) {\n        if (dns1)\n            fprintf(dns_fp, \"nameserver %s %s\\n\", dns1, dns_tag);\n        if (dns2)\n            fprintf(dns_fp, \"nameserver %s %s\\n\", dns2, dns_tag);\n        \n        for (i = 0; i < MAX_DNS && dns_info[i]; i++)\n            fprintf(dns_fp, \"%s\\n\", dns_info[i]);\n        fclose(dns_fp);\n    }\n    else {\n        dbg_time(\"fopen %s fail, errno:%d (%s)\", dns_file, errno, strerror(errno));\n    }\n\n    for (i = 0; i < MAX_DNS && dns_info[i]; i++)\n        free(dns_info[i]);\n}\n\npid_t getpid_by_pdp(int pdp, const char* program_name)\n{\n    glob_t gt;\n    int ret;\n    char filter[16];\n    pid_t pid;\n\n    snprintf(filter, sizeof(filter), \"-n %d\", pdp);\n    ret = glob(\"/proc/*/cmdline\", GLOB_NOSORT, NULL, &gt);\n    if (ret != 0) {\n        dbg_time(\"glob error, errno = %d(%s)\", errno, strerror(errno));\n\t\treturn -1;\n    } else {\n        int i = 0, fd = -1;\n        ssize_t nreads;\n        char cmdline[512] = {0};\n\n\t\tfor (i = 0; i < (int)gt.gl_pathc; i++) {\n            fd = open(gt.gl_pathv[i], O_RDONLY);\n            if (fd == -1) {\n                dbg_time(\"open %s failed, errno = %d(%s)\", gt.gl_pathv[i], errno, strerror(errno));\n                globfree(&gt);\n                return -1;\n            }\n            \n            nreads = read(fd, cmdline, sizeof(cmdline));\n            if (nreads > 0) {\n                int pos = 0;\n                while (pos < nreads-1) {\n                    if (cmdline[pos] == '\\0')\n                        cmdline[pos] = ' ';  // space\n                    pos++;\n                }\n                // printf(\"%s\\n\", cmdline);\n            }\n\n            if (strstr(cmdline, program_name) && strstr(cmdline, filter)) {\n            \tchar path[64] = {0};\n            \tchar pidstr[64] = {0};\n            \tchar *p;\n            \t\n                dbg_time(\"%s: %s\", gt.gl_pathv[i], cmdline);\n            \tstrcpy(path, gt.gl_pathv[i]);\n            \tp = strstr(gt.gl_pathv[i], \"/cmdline\");\n            \t*p = '\\0';\n            \twhile (*(--p) != '/') ;\n            \t\t\n            \tstrcpy(pidstr, p+1);\n            \tpid = atoi(pidstr);\n            \tglobfree(&gt);\n                \n                return pid;\n            }\n        }\n    }\n\n    globfree(&gt);\n    return -1;\n}\n\nvoid ql_get_driver_rmnet_info(PROFILE_T *profile, RMNET_INFO *rmnet_info) {\n    int ifc_ctl_sock;\n    struct ifreq ifr;\n    int rc;\n    int request = 0x89F3;\n    unsigned char data[512];\n\n    memset(rmnet_info, 0x00, sizeof(*rmnet_info));\n\n    ifc_ctl_sock = socket(AF_INET, SOCK_DGRAM, 0);\n    if (ifc_ctl_sock <= 0) {\n        dbg_time(\"socket() failed: %s\\n\", strerror(errno));\n        return;\n    }\n    \n    memset(&ifr, 0, sizeof(struct ifreq));\n    strncpy(ifr.ifr_name, profile->usbnet_adapter, IFNAMSIZ);\n    ifr.ifr_name[IFNAMSIZ - 1] = 0;    \n    ifr.ifr_ifru.ifru_data = (void *)data;\n        \n    rc = ioctl(ifc_ctl_sock, request, &ifr);\n    if (rc < 0) {\n        if (errno != ENOTSUP)\n            dbg_time(\"ioctl(0x%x, qmap_settings) errno:%d (%s), rc=%d\", request, errno, strerror(errno), rc);\n    }\n    else {\n        memcpy(rmnet_info, data, sizeof(*rmnet_info));\n    }\n\n    close(ifc_ctl_sock);\n}\n\nvoid ql_set_driver_qmap_setting(PROFILE_T *profile, QMAP_SETTING *qmap_settings) {\n    int ifc_ctl_sock;\n    struct ifreq ifr;\n    int rc;\n    int request = 0x89F2;\n\n    ifc_ctl_sock = socket(AF_INET, SOCK_DGRAM, 0);\n    if (ifc_ctl_sock <= 0) {\n        dbg_time(\"socket() failed: %s\\n\", strerror(errno));\n        return;\n    }\n    \n    memset(&ifr, 0, sizeof(struct ifreq));\n    strncpy(ifr.ifr_name, profile->usbnet_adapter, IFNAMSIZ);\n    ifr.ifr_name[IFNAMSIZ - 1] = 0;    \n    ifr.ifr_ifru.ifru_data = (void *)qmap_settings;\n        \n    rc = ioctl(ifc_ctl_sock, request, &ifr);\n    if (rc < 0) {\n        dbg_time(\"ioctl(0x%x, qmap_settings) failed: %s, rc=%d\", request, strerror(errno), rc);\n    }\n\n    close(ifc_ctl_sock);\t\n}\n\nvoid no_trunc_strncpy(char *dest, const char *src, size_t dest_size)\n{\n    size_t i = 0;\n\n    for (i = 0; i < dest_size && *src; i++) {\n        *dest++ = *src++;\n    }\n\n    *dest = 0;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/quectel_CM_5G_M/src/util.h",
    "content": "/**  \n  @file\n  util.h\n\n  @brief\n  This file provides the definitions, and declares some common APIs for list-algorithm.\n\n */\n\n#ifndef _UTILS_H_\n#define _UTILS_H_\n\n#include <stddef.h>\n#include <glob.h>\n\nstruct listnode\n{\n    struct listnode *next;\n    struct listnode *prev;\n};\n\n#define node_to_item(node, container, member) \\\n    (container *) (((char*) (node)) - offsetof(container, member))\n\n#define list_declare(name) \\\n    struct listnode name = { \\\n        .next = &name, \\\n        .prev = &name, \\\n    }\n\n#define list_for_each(node, list) \\\n    for (node = (list)->next; node != (list); node = node->next)\n\n#define list_for_each_reverse(node, list) \\\n    for (node = (list)->prev; node != (list); node = node->prev)\n\nvoid list_init(struct listnode *list);\nvoid list_add_tail(struct listnode *list, struct listnode *item);\nvoid list_add_head(struct listnode *head, struct listnode *item);\nvoid list_remove(struct listnode *item);\n\n#define list_empty(list) ((list) == (list)->next)\n#define list_head(list) ((list)->next)\n#define list_tail(list) ((list)->prev)\n\nint epoll_register(int  epoll_fd, int  fd, unsigned int events);\nint epoll_deregister(int  epoll_fd, int  fd);\nconst char * get_time(void);\nunsigned long clock_msec(void);\npid_t getpid_by_pdp(int, const char*);\n\n#endif\n"
  },
  {
    "path": "luci-app-qmodem/application/sms-tool_q/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\n# Include unified version\ninclude ../../version.mk\n\nPKG_NAME:=sms-tool_q\nPKG_RELEASE:=$(QMODEM_RELEASE)\nPKG_VERSION:=$(QMODEM_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/sms-tool_q\n  SECTION:=utils\n  CATEGORY:=Utilities\n  TITLE:=sms tool\n  URL:=https://github.com/obsy/sms_tool\nendef\n\ndefine Package/sms-tool_q/description\n\tSMS Tool for 3G/4G/5G modem\nendef\n\ndefine Package/sms-tool_q/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/sms_tool $(1)/usr/bin/sms_tool_q\nendef\n\n$(eval $(call BuildPackage,sms-tool_q))\n"
  },
  {
    "path": "luci-app-qmodem/application/sms-tool_q/patches/0001-send_raw_pdu.patch",
    "content": "--- a/sms_main.c\t2024-10-08 23:11:01.169908895 +0800\n+++ b/sms_main.c\t2024-10-08 23:10:52.929909691 +0800\n@@ -200,7 +200,12 @@\n \t{\n \t\tif(argc < 2)\n \t\t\tusage();\n-\t}else if (!strcmp(\"recv\", argv[0]))\n+\t}\n+\telse if (!strcmp(\"send_raw_pdu\", argv[0])){\n+\t\tif(argc < 2)\n+\t\t\tusage();\n+\t}\n+\telse if (!strcmp(\"recv\", argv[0]))\n \t{\n \t}else if (!strcmp(\"status\", argv[0]))\n \t{\n@@ -288,6 +293,48 @@\n \t\tfprintf(stderr,\"reading port\\n\");\n \t}\n \n+\tif (!strcmp(\"send_raw_pdu\", argv[0]))\n+\t{\n+\t\tint pdu_len;\n+\t\tint pdu_len_except_smsc;\n+\t\tchar pdustr[1024];\n+\t\t\n+\t\talarm(5);\n+\t\tpdu_len_except_smsc = strlen(argv[1]) / 2 - 1;\n+\t\tsprintf(pdustr, \"%s%c\\r\\n\", argv[1],0x1A);\n+\t\tsprintf(cmdstr,  \"AT+CMGS=%d\\r\\n\", pdu_len_except_smsc);\n+\t\t//set to pdu mode\n+\t\tfputs(\"AT+CMGF=0\\r\\n\", pf);\n+\t\twhile(fgets(buf, sizeof(buf), pfi)) {\n+\t\t\tif(starts_with(\"OK\", buf))\n+\t\t\t\tbreak;\n+\t\t}\n+\t\tfputs(cmdstr, pf);\n+\t\tsleep(1);\n+\t\tfputs(pdustr, pf);\n+\n+\t\terrno = 0;\n+\n+\t\twhile(fgets(buf, sizeof(buf), pfi))\n+\t\t{\n+\t\t\tif(starts_with(\"+CMGS:\", buf))\n+\t\t\t{\n+\t\t\t\tprintf(\"sms sent sucessfully: %s\", buf + 7);\n+\t\t\t\treturn 0;\n+\t\t\t} else if(starts_with(\"+CMS ERROR:\", buf))\n+\t\t\t{\n+\t\t\t\tfprintf(stderr,\"sms not sent, code: %s\\n\", buf + 11);\n+\t\t\t} else if(starts_with(\"ERROR\", buf))\n+\t\t\t{\n+\t\t\t\tfprintf(stderr,\"sms not sent, command error\\n\");\n+\t\t\t} else if(starts_with(\"OK\", buf))\n+\t\t\t{\n+\t\t\t\treturn 0;\n+\t\t\t}\n+\t\t}\n+\t\tfprintf(stderr,\"reading port\\n\");\n+\t}\n+\t\n \tif (!strcmp(\"recv\", argv[0]))\n \t{\n \t\talarm(10);\n"
  },
  {
    "path": "luci-app-qmodem/application/sms-tool_q/patches/0002-add_timeout_option.patch",
    "content": "--- a/sms_main.c\t2024-10-08 23:11:01.169908895 +0800\n+++ b/sms_main.c\t2024-10-08 23:10:52.929909691 +0800\n@@ -46,7 +46,8 @@\n static const char* dev = \"/dev/ttyUSB0\";\n static const char* storage = \"\";\n static const char* dateformat = \"%D %T\";\n-\n+FILE* pf;\n+FILE* pfi;\n static void setserial(int baudrate)\n {\n \tstruct termios t;\n@@ -115,7 +116,9 @@\n static void timeout()\n {\n \tfprintf(stderr,\"No response from modem.\\n\");\n-\texit(2);\n+\t if (pf) fclose(pf);\n+    if (pfi) fclose(pfi);\n+    exit(2);\n }\n \n static int starts_with(const char* prefix, const char* str)\n@@ -168,12 +171,14 @@\n \tint rawoutput = 0;\n \tint jsonoutput = 0;\n \tint debug = 0;\n+\tint user_set_timeout = 5;\n \tint dcs = -1;\n \n-\twhile ((ch = getopt(argc, argv, \"b:c:d:Ds:f:jRr\")) != -1){\n+\twhile ((ch = getopt(argc, argv, \"b:c:t:d:Ds:f:jRr\")) != -1){\n \t\tswitch (ch) {\n \t\tcase 'b': baudrate = atoi(optarg); break;\n \t\tcase 'c': dcs = atoi(optarg); break;\n+\t\tcase 't': user_set_timeout = atoi(optarg);break;\n \t\tcase 'd': dev = optarg; break;\n \t\tcase 'D': debug = 1; break;\n \t\tcase 's': storage = optarg; break;\n@@ -237,8 +242,8 @@\n \tif (port < 0)\n \t\tfprintf(stderr,\"reopen(%s)\\n\", dev);\n \n-\tFILE* pf = fdopen(port, \"w\");\n-\tFILE* pfi = fdopen(port, \"r\");\n+\tpf = fdopen(port, \"w\");\n+\tpfi = fdopen(port, \"r\");\n \tif (!pf || ! pfi)\n \t\tfprintf(stderr,\"open port failed\\n\");\n \tif(setvbuf(pf, NULL, _IOLBF, 0))\n@@ -758,7 +763,8 @@\n \n \tif (!strcmp(\"at\", argv[0]))\n \t{\n-\t\talarm(5);\n+\t\t\n+\t\talarm(user_set_timeout);\n \t\tfputs(argv[1], pf);\n \t\tfputs(\"\\r\\n\", pf);\n \n"
  },
  {
    "path": "luci-app-qmodem/application/sms-tool_q/src/LICENSE-2.0.txt",
    "content": "\n                                 Apache License\n                           Version 2.0, January 2004\n                        http://www.apache.org/licenses/\n\n   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION\n\n   1. Definitions.\n\n      \"License\" shall mean the terms and conditions for use, reproduction,\n      and distribution as defined by Sections 1 through 9 of this document.\n\n      \"Licensor\" shall mean the copyright owner or entity authorized by\n      the copyright owner that is granting the License.\n\n      \"Legal Entity\" shall mean the union of the acting entity and all\n      other entities that control, are controlled by, or are under common\n      control with that entity. For the purposes of this definition,\n      \"control\" means (i) the power, direct or indirect, to cause the\n      direction or management of such entity, whether by contract or\n      otherwise, or (ii) ownership of fifty percent (50%) or more of the\n      outstanding shares, or (iii) beneficial ownership of such entity.\n\n      \"You\" (or \"Your\") shall mean an individual or Legal Entity\n      exercising permissions granted by this License.\n\n      \"Source\" form shall mean the preferred form for making modifications,\n      including but not limited to software source code, documentation\n      source, and configuration files.\n\n      \"Object\" form shall mean any form resulting from mechanical\n      transformation or translation of a Source form, including but\n      not limited to compiled object code, generated documentation,\n      and conversions to other media types.\n\n      \"Work\" shall mean the work of authorship, whether in Source or\n      Object form, made available under the License, as indicated by a\n      copyright notice that is included in or attached to the work\n      (an example is provided in the Appendix below).\n\n      \"Derivative Works\" shall mean any work, whether in Source or Object\n      form, that is based on (or derived from) the Work and for which the\n      editorial revisions, annotations, elaborations, or other modifications\n      represent, as a whole, an original work of authorship. For the purposes\n      of this License, Derivative Works shall not include works that remain\n      separable from, or merely link (or bind by name) to the interfaces of,\n      the Work and Derivative Works thereof.\n\n      \"Contribution\" shall mean any work of authorship, including\n      the original version of the Work and any modifications or additions\n      to that Work or Derivative Works thereof, that is intentionally\n      submitted to Licensor for inclusion in the Work by the copyright owner\n      or by an individual or Legal Entity authorized to submit on behalf of\n      the copyright owner. For the purposes of this definition, \"submitted\"\n      means any form of electronic, verbal, or written communication sent\n      to the Licensor or its representatives, including but not limited to\n      communication on electronic mailing lists, source code control systems,\n      and issue tracking systems that are managed by, or on behalf of, the\n      Licensor for the purpose of discussing and improving the Work, but\n      excluding communication that is conspicuously marked or otherwise\n      designated in writing by the copyright owner as \"Not a Contribution.\"\n\n      \"Contributor\" shall mean Licensor and any individual or Legal Entity\n      on behalf of whom a Contribution has been received by Licensor and\n      subsequently incorporated within the Work.\n\n   2. Grant of Copyright License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      copyright license to reproduce, prepare Derivative Works of,\n      publicly display, publicly perform, sublicense, and distribute the\n      Work and such Derivative Works in Source or Object form.\n\n   3. Grant of Patent License. Subject to the terms and conditions of\n      this License, each Contributor hereby grants to You a perpetual,\n      worldwide, non-exclusive, no-charge, royalty-free, irrevocable\n      (except as stated in this section) patent license to make, have made,\n      use, offer to sell, sell, import, and otherwise transfer the Work,\n      where such license applies only to those patent claims licensable\n      by such Contributor that are necessarily infringed by their\n      Contribution(s) alone or by combination of their Contribution(s)\n      with the Work to which such Contribution(s) was submitted. If You\n      institute patent litigation against any entity (including a\n      cross-claim or counterclaim in a lawsuit) alleging that the Work\n      or a Contribution incorporated within the Work constitutes direct\n      or contributory patent infringement, then any patent licenses\n      granted to You under this License for that Work shall terminate\n      as of the date such litigation is filed.\n\n   4. Redistribution. You may reproduce and distribute copies of the\n      Work or Derivative Works thereof in any medium, with or without\n      modifications, and in Source or Object form, provided that You\n      meet the following conditions:\n\n      (a) You must give any other recipients of the Work or\n          Derivative Works a copy of this License; and\n\n      (b) You must cause any modified files to carry prominent notices\n          stating that You changed the files; and\n\n      (c) You must retain, in the Source form of any Derivative Works\n          that You distribute, all copyright, patent, trademark, and\n          attribution notices from the Source form of the Work,\n          excluding those notices that do not pertain to any part of\n          the Derivative Works; and\n\n      (d) If the Work includes a \"NOTICE\" text file as part of its\n          distribution, then any Derivative Works that You distribute must\n          include a readable copy of the attribution notices contained\n          within such NOTICE file, excluding those notices that do not\n          pertain to any part of the Derivative Works, in at least one\n          of the following places: within a NOTICE text file distributed\n          as part of the Derivative Works; within the Source form or\n          documentation, if provided along with the Derivative Works; or,\n          within a display generated by the Derivative Works, if and\n          wherever such third-party notices normally appear. The contents\n          of the NOTICE file are for informational purposes only and\n          do not modify the License. You may add Your own attribution\n          notices within Derivative Works that You distribute, alongside\n          or as an addendum to the NOTICE text from the Work, provided\n          that such additional attribution notices cannot be construed\n          as modifying the License.\n\n      You may add Your own copyright statement to Your modifications and\n      may provide additional or different license terms and conditions\n      for use, reproduction, or distribution of Your modifications, or\n      for any such Derivative Works as a whole, provided Your use,\n      reproduction, and distribution of the Work otherwise complies with\n      the conditions stated in this License.\n\n   5. Submission of Contributions. Unless You explicitly state otherwise,\n      any Contribution intentionally submitted for inclusion in the Work\n      by You to the Licensor shall be under the terms and conditions of\n      this License, without any additional terms or conditions.\n      Notwithstanding the above, nothing herein shall supersede or modify\n      the terms of any separate license agreement you may have executed\n      with Licensor regarding such Contributions.\n\n   6. Trademarks. This License does not grant permission to use the trade\n      names, trademarks, service marks, or product names of the Licensor,\n      except as required for reasonable and customary use in describing the\n      origin of the Work and reproducing the content of the NOTICE file.\n\n   7. Disclaimer of Warranty. Unless required by applicable law or\n      agreed to in writing, Licensor provides the Work (and each\n      Contributor provides its Contributions) on an \"AS IS\" BASIS,\n      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or\n      implied, including, without limitation, any warranties or conditions\n      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A\n      PARTICULAR PURPOSE. You are solely responsible for determining the\n      appropriateness of using or redistributing the Work and assume any\n      risks associated with Your exercise of permissions under this License.\n\n   8. Limitation of Liability. In no event and under no legal theory,\n      whether in tort (including negligence), contract, or otherwise,\n      unless required by applicable law (such as deliberate and grossly\n      negligent acts) or agreed to in writing, shall any Contributor be\n      liable to You for damages, including any direct, indirect, special,\n      incidental, or consequential damages of any character arising as a\n      result of this License or out of the use or inability to use the\n      Work (including but not limited to damages for loss of goodwill,\n      work stoppage, computer failure or malfunction, or any and all\n      other commercial damages or losses), even if such Contributor\n      has been advised of the possibility of such damages.\n\n   9. Accepting Warranty or Additional Liability. While redistributing\n      the Work or Derivative Works thereof, You may choose to offer,\n      and charge a fee for, acceptance of support, warranty, indemnity,\n      or other liability obligations and/or rights consistent with this\n      License. However, in accepting such obligations, You may act only\n      on Your own behalf and on Your sole responsibility, not on behalf\n      of any other Contributor, and only if You agree to indemnify,\n      defend, and hold each Contributor harmless for any liability\n      incurred by, or claims asserted against, such Contributor by reason\n      of your accepting any such warranty or additional liability.\n\n   END OF TERMS AND CONDITIONS\n\n   APPENDIX: How to apply the Apache License to your work.\n\n      To apply the Apache License to your work, attach the following\n      boilerplate notice, with the fields enclosed by brackets \"[]\"\n      replaced with your own identifying information. (Don't include\n      the brackets!)  The text should be enclosed in the appropriate\n      comment syntax for the file format. We also recommend that a\n      file or class name and description of purpose be included on the\n      same \"printed page\" as the copyright notice for easier\n      identification within third-party archives.\n\n   Copyright [yyyy] [name of copyright owner]\n\n   Licensed under the Apache License, Version 2.0 (the \"License\");\n   you may not use this file except in compliance with the License.\n   You may obtain a copy of the License at\n\n       http://www.apache.org/licenses/LICENSE-2.0\n\n   Unless required by applicable law or agreed to in writing, software\n   distributed under the License is distributed on an \"AS IS\" BASIS,\n   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n   See the License for the specific language governing permissions and\n   limitations under the License.\n"
  },
  {
    "path": "luci-app-qmodem/application/sms-tool_q/src/Makefile",
    "content": "DIRS = pdu_lib\n\n#CROSS_COMPILE=mips-openwrt-linux-\n#CC = $(CROSS_COMPILE)gcc\n#STRIP = $(CROSS_COMPILE)strip\n#CFLAGS = -O2\nEXE = sms_tool\n\nOBJS = pdu_lib/pdu.o pdu_lib/ucs2_to_utf8.o\n\nall: $(EXE)\n\n$(EXE): sms_main.o pdu_lib\n\t$(CC) $(CFLAGS) sms_main.o $(OBJS) -lm -o $(EXE)\n\nsms_main.o:\n\t$(CC) $(CFLAGS) sms_main.c -c\n\npdu_lib: force_look\n\tcd pdu_lib; CROSS_COMPILE=$(CROSS_COMPILE) $(MAKE) $(MFLAGS)\n\nclean:\n\trm -rf *.o sms_tool\n\tfor d in $(DIRS); do (cd $$d; $(MAKE) clean); done\n\nstrip:\n\t$(STRIP) -s sms_tool\n\nforce_look:\n\ttrue\n\n"
  },
  {
    "path": "luci-app-qmodem/application/sms-tool_q/src/pdu_lib/Makefile",
    "content": "ALL: pdu_decoder\n\n#CROSS_COMPILE=mips-openwrt-linux-\n\n#CC = $(CROSS_COMPILE)gcc\n\n#CFLAGS = -O2\n\npdu.o:\n\t$(CC) $(CFLAGS) -c pdu.c\npdu_decoder.o:\n\t$(CC) $(CFLAGS) -c pdu_decoder.c\nucs2_to_utf8:\n\t$(CC) $(CFLAGS) -c ucs2_to_utf8.c\npdu_decoder: pdu.o pdu_decoder.o ucs2_to_utf8\n\t$(CC) $(CFLAGS) ucs2_to_utf8.o pdu.o pdu_decoder.o -lm -o pdu_decoder\nclean:\n\trm -f *.o pdu_decoder\ntest: clean ALL\n\techo \"0891683108501405F8240BA10156686616F60008414090912385235C6D4191CF6C4752A860015BC67801FF1A00350030003900360036FF0C4EB2FF0C8BB05F9762BD59566BCF592990FD8981676554E6FF0C611F89C9597D76848BDD63A883507ED960A87684670B53CBFF019884795D60A84E2D5956FF01\"|./pdu_decoder\n\techo \"0891683108501405F8640BA10156686616F6000841400100957423830608048A3002026B21767B5F556D4191CF6C475373900100356D4191CF5E01FF0853EF63620035004D6D4191CFFF09FF0C731B623394FE63A5FF1A0068007400740070003A002F002F007300680061006B0065002E00730064002E006300680069006E0061006D006F00620069006C0065002E0063006F006D30025C714E1C79FB52A8\"|./pdu_decoder\n"
  },
  {
    "path": "luci-app-qmodem/application/sms-tool_q/src/pdu_lib/pdu.c",
    "content": "/*\n * 2017 - 2021 Cezary Jackiewicz <cezary@eko.one.pl>\n * 2014 lovewilliam <ztong@vt.edu>\n */\n// Copyright 2011 The Avalon Project Authors. All rights reserved.\n// Use of this source code is governed by the Apache License 2.0\n// that can be found in the LICENSE file.\n//\n//  SMS encoding/decoding functions, which are based on examples from:\n//  http://www.dreamfabric.com/sms/\n\n#include \"pdu.h\"\n\n#include <string.h>\n#include <time.h>\n#include <math.h>\n\nenum {\n\tBITMASK_7BITS = 0x7F,\n\tBITMASK_8BITS = 0xFF,\n\tBITMASK_HIGH_4BITS = 0xF0,\n\tBITMASK_LOW_4BITS = 0x0F,\n\n\tTYPE_OF_ADDRESS_UNKNOWN = 0x81,\n\tTYPE_OF_ADDRESS_INTERNATIONAL_PHONE = 0x91,\n\tTYPE_OF_ADDRESS_NATIONAL_SUBSCRIBER = 0xC8,\n\tTYPE_OF_ADDRESS_ALPHANUMERIC = 0xD0,\n\n\tSMS_DELIVER_ONE_MESSAGE = 0x04,\n\tSMS_SUBMIT              = 0x11,\n\n\tSMS_MAX_7BIT_TEXT_LENGTH  = 160,\n};\n\n// Swap decimal digits of a number (e.g. 12 -> 21).\nstatic unsigned char \nSwapDecimalNibble(const unsigned char x)\n{\n\treturn (x / 16) + ((x % 16) * 10);\n}\n\n// Encode/Decode PDU: Translate ASCII 7bit characters to 8bit buffer.\n// SMS encoding example from: http://www.dreamfabric.com/sms/.\n//\n// 7-bit ASCII: \"hellohello\"\n// [0]:h   [1]:e   [2]:l   [3]:l   [4]:o   [5]:h   [6]:e   [7]:l   [8]:l   [9]:o\n// 1101000 1100101 1101100 1101100 1101111 1101000 1100101 1101100 1101100 1101111\n//               |             |||           ||||| |               |||||||  ||||||\n// /-------------/   ///-------///     /////-///// \\------------\\  |||||||  \\\\\\\\\\\\ .\n// |                 |||               |||||                    |  |||||||   ||||||\n// input buffer position\n// 10000000 22111111 33322222 44443333 55555333 66666655 77777776 98888888 --999999\n// |                 |||               |||||                    |  |||||||   ||||||\n// 8bit encoded buffer\n// 11101000 00110010 10011011 11111101 01000110 10010111 11011001 11101100 00110111\n// E8       32       9B       FD       46       97       D9       EC       37\n\n\n// Encode PDU message by merging 7 bit ASCII characters into 8 bit octets.\nint\nEncodePDUMessage(const char* sms_text, int sms_text_length, unsigned char* output_buffer, int buffer_size)\n{\n\t// Check if output buffer is big enough.\n\tif ((sms_text_length * 7 + 7) / 8 > buffer_size)\n\t\treturn -1;\n\n\tint output_buffer_length = 0;\n\tint carry_on_bits = 1;\n\tint i = 0;\n\n\tfor (; i < sms_text_length - 1; ++i) {\n\t\toutput_buffer[output_buffer_length++] =\n\t\t\t((sms_text[i] & BITMASK_7BITS) >> (carry_on_bits - 1)) |\n\t\t\t((sms_text[i + 1] & BITMASK_7BITS) << (8 - carry_on_bits));\n\t\tcarry_on_bits++;\n\t\tif (carry_on_bits == 8) {\n\t\t\tcarry_on_bits = 1;\n\t\t\t++i;\n\t\t}\n\t}\n\n\tif (i <= sms_text_length)\n\t\toutput_buffer[output_buffer_length++] =\t(sms_text[i] & BITMASK_7BITS) >> (carry_on_bits - 1);\n\n\treturn output_buffer_length;\n}\n\n// Decode PDU message by splitting 8 bit encoded buffer into 7 bit ASCII\n// characters.\nint\nDecodePDUMessage_GSM_7bit(const unsigned char* buffer, int buffer_length, char* output_sms_text, int sms_text_length)\n{\n\tint output_text_length = 0;\n\tif (buffer_length > 0)\n\t\toutput_sms_text[output_text_length++] = BITMASK_7BITS & buffer[0];\n\n\tif (sms_text_length > 1) {\n\t\tint carry_on_bits = 1;\n\t\tint i = 1;\n\t\tfor (; i < buffer_length; ++i) {\n\n\t\t\toutput_sms_text[output_text_length++] = BITMASK_7BITS &\t((buffer[i] << carry_on_bits) | (buffer[i - 1] >> (8 - carry_on_bits)));\n\n\t\t\tif (output_text_length == sms_text_length) break;\n\n\t\t\tcarry_on_bits++;\n\n\t\t\tif (carry_on_bits == 8) {\n\t\t\t\tcarry_on_bits = 1;\n\t\t\t\toutput_sms_text[output_text_length++] = buffer[i] & BITMASK_7BITS;\n\t\t\t\tif (output_text_length == sms_text_length) break;\n\t\t\t}\n\n\t\t}\n\t\tif (output_text_length < sms_text_length)  // Add last remainder.\n\t\t\toutput_sms_text[output_text_length++] =\tbuffer[i - 1] >> (8 - carry_on_bits);\n\t}\n\n\treturn output_text_length;\n}\n\n#define  GSM_7BITS_ESCAPE   0x1b\n\nstatic const unsigned char gsm7bits_to_latin1[128] = {\n  '@', 0xa3,  '$', 0xa5, 0xe8, 0xe9, 0xf9, 0xec, 0xf2, 0xc7, '\\n', 0xd8, 0xf8, '\\r', 0xc5, 0xe5,\n    0,  '_',    0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 0xc6, 0xe6, 0xdf, 0xc9,\n  ' ',  '!',  '\"',  '#', 0xa4,  '%',  '&', '\\'',  '(',  ')',  '*',  '+',  ',',  '-',  '.',  '/',\n  '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',  '8',  '9',  ':',  ';',  '<',  '=',  '>',  '?',\n 0xa1,  'A',  'B',  'C',  'D',  'E',  'F',  'G',  'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',\n  'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',  'X',  'Y',  'Z', 0xc4, 0xd6, 0xd1, 0xdc, 0xa7,\n 0xbf,  'a',  'b',  'c',  'd',  'e',  'f',  'g',  'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',\n  'p',  'q',  'r',  's',  't',  'u',  'v',  'w',  'x',  'y',  'z', 0xe4, 0xf6, 0xf1, 0xfc, 0xe0,\n};\n\nstatic const unsigned char gsm7bits_extend_to_latin1[128] = {\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,'\\f',   0,   0,   0,   0,   0,\n    0,   0,   0,   0, '^',   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,   0,   0,   0,   0,   0,   0,   0, '{', '}',   0,   0,   0,   0,   0,'\\\\',\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, '[', '~', ']',   0,\n  '|',   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n};\n\nstatic int\nG7bitToAscii(char* buffer, int buffer_length)\n{\n\tint i;\n\n\tfor (i = 0; i<buffer_length; i++) {\n\t\tif (buffer[i] < 128) {\n\t\t\tif (buffer[i] == GSM_7BITS_ESCAPE) {\n\t\t\t\tbuffer[i] = gsm7bits_extend_to_latin1[buffer[i + 1]];\n\t\t\t\tmemmove(&buffer[i + 1], &buffer[i + 2], buffer_length - i - 1);\n\t\t\t\tbuffer_length--;\n\t\t\t} else {\n\t\t\t\tbuffer[i] = gsm7bits_to_latin1[buffer[i]];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn buffer_length;\n}\n\n#define NPC '?'\n\nstatic const int latin1_to_gsm7bits[256] = {\n  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC, 0x0a,  NPC,-0x0a, 0x0d,  NPC,  NPC,\n  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,\n 0x20, 0x21, 0x22, 0x23, 0x02, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,\n 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,\n 0x00, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,\n 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,-0x3c,-0x2f,-0x3e,-0x14, 0x11,\n  NPC, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,\n 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,-0x28,-0x40,-0x29,-0x3d,  NPC,\n  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,\n  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,\n  NPC, 0x40,  NPC, 0x01, 0x24, 0x03,  NPC, 0x5f,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,\n  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC, 0x60,\n  NPC,  NPC,  NPC,  NPC, 0x5b, 0x0e, 0x1c, 0x09,  NPC, 0x1f,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,\n  NPC, 0x5d,  NPC,  NPC,  NPC,  NPC, 0x5c,  NPC, 0x0b,  NPC,  NPC,  NPC, 0x5e,  NPC,  NPC, 0x1e,\n 0x7f,  NPC,  NPC,  NPC, 0x7b, 0x0f, 0x1d,  NPC, 0x04, 0x05,  NPC,  NPC, 0x07,  NPC,  NPC,  NPC,\n  NPC, 0x7d, 0x08,  NPC,  NPC,  NPC, 0x7c,  NPC, 0x0c, 0x06,  NPC,  NPC, 0x7e,  NPC,  NPC,  NPC,\n};\n\nstatic int\nAsciiToG7bit(const char* buffer, int buffer_length, unsigned char* output_buffer)\n{\n\tint i, j, val;\n\n\tj=0;\n\tfor (i = 0; i < buffer_length; i++) {\n\t\tval = latin1_to_gsm7bits[buffer[i] & 0xFF];\n\t\tif (val < 0) {\n\t\t\toutput_buffer[j++] = GSM_7BITS_ESCAPE;\n\t\t\toutput_buffer[j++] = -1*val;\n\t\t} else {\n\t\t\tif (((buffer[i] & 0xFF) & 0xE0) == 0xC0) { /* test for two byte utf8 char */\n\t\t\t\tval = NPC;\n\t\t\t\ti++;\n\t\t\t} else if (((buffer[i] & 0xFF) & 0xF0) == 0xE0) { /* test for three byte utf8 char */\n\t\t\t\tval = NPC;\n\t\t\t\ti++;\n\t\t\t\ti++;\n\t\t\t}\n\t\t\toutput_buffer[j++] = val;\n\t\t}\n\t}\n\treturn j;\n}\n\n// Encode a digit based phone number for SMS based format.\nstatic int\nEncodePhoneNumber(const char* phone_number, unsigned char* output_buffer, int buffer_size)\n{\n\tint output_buffer_length = 0;  \n\tconst int phone_number_length = strlen(phone_number);\n\n\t// Check if the output buffer is big enough.\n\tif ((phone_number_length + 1) / 2 > buffer_size)\n\t\treturn -1;\n\n\tint i = 0;\n\tfor (; i < phone_number_length; ++i) {\n\n\t\tif (phone_number[i] < '0' && phone_number[i] > '9')\n\t\t\treturn -1;\n\n\t\tif (i % 2 == 0) {\n\t\t\toutput_buffer[output_buffer_length++] =\tBITMASK_HIGH_4BITS | (phone_number[i] - '0');\n\t\t} else {\n\t\t\toutput_buffer[output_buffer_length - 1] =\n\t\t\t\t(output_buffer[output_buffer_length - 1] & BITMASK_LOW_4BITS) |\n\t\t\t\t((phone_number[i] - '0') << 4); \n\t\t}\n\t}\n\n\treturn output_buffer_length;\n}\n\n// Decode a digit based phone number for SMS based format.\nstatic int\nDecodePhoneNumber(const unsigned char* buffer, int phone_number_length, char* output_phone_number)\n{\n\tint i = 0;\n\tfor (; i < phone_number_length; ++i) {\n\t\tif (i % 2 == 0)\n\t\t\toutput_phone_number[i] = (buffer[i / 2] & BITMASK_LOW_4BITS) + '0';\n\t        else\n\t\t\toutput_phone_number[i] = ((buffer[i / 2] & BITMASK_HIGH_4BITS) >> 4) + '0';\n\t}\n\toutput_phone_number[phone_number_length] = '\\0';  // Terminate C string.\n\treturn phone_number_length;\n}\n\n// Encode a SMS message to PDU\nint\npdu_encode(const char* service_center_number, const char* phone_number, const char* sms_text,\n\t   unsigned char* output_buffer, int buffer_size)\n{\t\n\tif (buffer_size < 2)\n\t\treturn -1;\n\n\tint output_buffer_length = 0;\n\n\t// 1. Set SMS center number.\n\tint length = 0;\n\tif (service_center_number && strlen(service_center_number) > 0) {\n\t\toutput_buffer[1] = TYPE_OF_ADDRESS_INTERNATIONAL_PHONE;\n\t\tlength = EncodePhoneNumber(service_center_number,\n\t\t\t\t\t   output_buffer + 2, buffer_size - 2);\n\t\tif (length < 0 && length >= 254)\n\t\t\treturn -1;\n\t\tlength++;  // Add type of address.\n\t}\n\toutput_buffer[0] = length;\n\toutput_buffer_length = length + 1;\n\tif (output_buffer_length + 4 > buffer_size)\n\t\treturn -1;  // Check if it has space for four more bytes.\n\n\t// 2. Set type of message.\n\toutput_buffer[output_buffer_length++] = SMS_SUBMIT;\n\toutput_buffer[output_buffer_length++] = 0x00;  // Message reference.\n\n\t// 3. Set phone number.\n\toutput_buffer[output_buffer_length] = strlen(phone_number);\n\n\tif (strlen(phone_number) < 6) {\n\t\toutput_buffer[output_buffer_length + 1] = TYPE_OF_ADDRESS_UNKNOWN;\n\t} else {\n\t\toutput_buffer[output_buffer_length + 1] = TYPE_OF_ADDRESS_INTERNATIONAL_PHONE;\n\t}\n\n\tlength = EncodePhoneNumber(phone_number,\n\t\t\t\t   output_buffer + output_buffer_length + 2,\n\t\t\t\t   buffer_size - output_buffer_length - 2);\n\toutput_buffer_length += length + 2;\n\tif (output_buffer_length + 4 > buffer_size)\n\t\treturn -1;  // Check if it has space for four more bytes.\n\n\n\t// 4. Protocol identifiers.\n\toutput_buffer[output_buffer_length++] = 0x00;  // TP-PID: Protocol identifier.\n\toutput_buffer[output_buffer_length++] = 0x00;  // TP-DCS: Data coding scheme.\n\toutput_buffer[output_buffer_length++] = 0xB0;  // TP-VP: Validity: 10 days\n\n\t// 5. SMS message.\n\tint sms_text_length = strlen(sms_text);\n\tchar sms_text_7bit[2*SMS_MAX_7BIT_TEXT_LENGTH];\n\tsms_text_length = AsciiToG7bit(sms_text, sms_text_length, sms_text_7bit);\n\tif (sms_text_length > SMS_MAX_7BIT_TEXT_LENGTH)\n\t\treturn -1;\n\toutput_buffer[output_buffer_length++] = sms_text_length;\n\tlength = EncodePDUMessage(sms_text_7bit, sms_text_length,\n\t\t\t\t  output_buffer + output_buffer_length, \n\t\t\t\t  buffer_size - output_buffer_length);\n\tif (length < 0)\n\t\treturn -1;\n\toutput_buffer_length += length;\n\n\treturn output_buffer_length;\n}\n\nint pdu_decode(const unsigned char* buffer, int buffer_length,\n\t       time_t* output_sms_time,\n\t       char* output_sender_phone_number, int sender_phone_number_size,\n\t       char* output_sms_text, int sms_text_size,\n\t       int* tp_dcs,\n\t       int* ref_number,\n\t       int* total_parts,\n\t       int* part_number,\n\t       int* skip_bytes)\n{\n\t\n\tif (buffer_length <= 0)\n\t\treturn -1;\n\n\tconst int sms_deliver_start = 1 + buffer[0];\n\tif (sms_deliver_start + 1 > buffer_length)\n\t\treturn -2;\n\n\tconst int user_data_header_length = (buffer[sms_deliver_start]>>4);\n\n\tconst int sender_number_length = buffer[sms_deliver_start + 1];\n\tif (sender_number_length + 1 > sender_phone_number_size)\n\t\treturn -3;  // Buffer too small to hold decoded phone number.\n\n\tconst int sender_type_of_address = buffer[sms_deliver_start + 2];\n\tif (sender_type_of_address == TYPE_OF_ADDRESS_ALPHANUMERIC) {\n\t\tint sender_len1 = DecodePDUMessage_GSM_7bit(buffer + sms_deliver_start + 3, ceil(sender_number_length * 1.0 / 2), output_sender_phone_number, sender_number_length);\n\t\tif (output_sender_phone_number[sender_len1 - 1] == '\\0')\n\t\t\tsender_len1--;\n\t\tint sender_len2 = G7bitToAscii(output_sender_phone_number, sender_len1);\n\t\toutput_sender_phone_number[sender_len2] = 0;\n\t} else {\n\t\tDecodePhoneNumber(buffer + sms_deliver_start + 3, sender_number_length, output_sender_phone_number);\n\t}\n\n\tconst int sms_pid_start = sms_deliver_start + 3 + (buffer[sms_deliver_start + 1] + 1) / 2;\n\n\t// Decode timestamp.\n\tstruct tm sms_broken_time;\n\tsms_broken_time.tm_year = 100 + SwapDecimalNibble(buffer[sms_pid_start + 2]);\n\tsms_broken_time.tm_mon  = SwapDecimalNibble(buffer[sms_pid_start + 3]) - 1;\n\tsms_broken_time.tm_mday = SwapDecimalNibble(buffer[sms_pid_start + 4]);\n\tsms_broken_time.tm_hour = SwapDecimalNibble(buffer[sms_pid_start + 5]);\n\tsms_broken_time.tm_min  = SwapDecimalNibble(buffer[sms_pid_start + 6]);\n\tsms_broken_time.tm_sec  = SwapDecimalNibble(buffer[sms_pid_start + 7]);\n\t(*output_sms_time) = timegm(&sms_broken_time);\n\n\tconst int sms_start = sms_pid_start + 2 + 7;\n\tif (sms_start + 1 > buffer_length) return -1;  // Invalid input buffer.\n\n\tint tmp;\n\tif((user_data_header_length&0x04)==0x04) {\n\t\ttmp = buffer[sms_start + 1] + 1;\n\t\t*skip_bytes = tmp;\n\t\t*ref_number = 0x000000FF&buffer[sms_start + tmp - 2];\n\t\t*total_parts = 0x000000FF&buffer[sms_start + tmp - 1];\n\t\t*part_number = 0x000000FF&buffer[sms_start + tmp];\n\t} else {\n\t\ttmp = 0;\n\t\t*skip_bytes = tmp;\n\t\t*ref_number = tmp;\n\t\t*total_parts = tmp;\n\t\t*part_number = tmp;\n\t}\n\n\tint output_sms_text_length = buffer[sms_start];\n\tif (sms_text_size < output_sms_text_length) return -1;  // Cannot hold decoded buffer.\n\n\tconst int sms_tp_dcs_start = sms_pid_start + 1;\n\t*tp_dcs = buffer[sms_tp_dcs_start];\n\n\tswitch((*tp_dcs / 4) % 4)\n\t{\n\t\tcase 0:\n\t\t\t{\n\t\t\t\t// GSM 7 bit\n\t\t\t\tint decoded_sms_text_size = DecodePDUMessage_GSM_7bit(buffer + sms_start + 1, buffer_length - (sms_start + 1),\n\t\t\t\t\t\t\t   output_sms_text, output_sms_text_length);\n\t\t\t\tif (decoded_sms_text_size != output_sms_text_length) return -1;  // Decoder length is not as expected.\n\t\t\t\toutput_sms_text_length = G7bitToAscii(output_sms_text, output_sms_text_length);\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase 2:\n\t\t\t{\n\t\t\t\t// UCS2\n\t\t\t\tmemcpy(output_sms_text, buffer + sms_start + 1, output_sms_text_length);\n\t\t\t\tbreak;\n\t\t\t}\n\t\tdefault:\n\t\tbreak;\n\t}\n\n\t// Add a C string end.\n\tif (output_sms_text_length < sms_text_size)\n\t\toutput_sms_text[output_sms_text_length] = 0;\n\telse\n\t\toutput_sms_text[sms_text_size-1] = 0;\n\n\treturn output_sms_text_length;\n}\n\n"
  },
  {
    "path": "luci-app-qmodem/application/sms-tool_q/src/pdu_lib/pdu.h",
    "content": "/*\n * 2017 - 2021 Cezary Jackiewicz <cezary@eko.one.pl>\n * 2014 lovewilliam <ztong@vt.edu>\n */\n// Copyright 2011 The Avalon Project Authors. All rights reserved.\n// Use of this source code is governed by the Apache License 2.0\n// that can be found in the LICENSE file.\n#ifndef SMS_PDU_H_\n#define SMS_PDU_H_\n\n#include <time.h>\n\nenum { SMS_MAX_PDU_LENGTH  = 256 };\n\n/* \n * Encode an SMS message. Output the encoded message into output pdu buffer.\n * Returns the length of the SMS encoded message in the output buffer or\n * a negative number in case encoding failed (for example provided output buffer\n * does not have enough space).\n */\nint pdu_encode(const char* service_center_number, const char* phone_number, const char* text,\n\t      unsigned char* pdu, int pdu_size);\n\n/* \n * Decode an SMS message. Output the decoded message into the sms text buffer.\n * Returns the length of the SMS dencoded message or a negative number in\n * case encoding failed (for example provided output buffer has not enough\n * space).\n */\nint pdu_decode(const unsigned char* pdu, int pdu_len,\n\t       time_t* sms_time,\n\t       char* phone_number, int phone_number_size,\n\t       char* text, int text_size,\n\t       int* tp_dcs,\n\t       int* ref_number,\n\t       int* total_parts,\n\t       int* part_number,\n\t       int* skip_bytes);\n\nint ucs2_to_utf8 (int ucs2, unsigned char * utf8);\n\nint DecodePDUMessage_GSM_7bit(const unsigned char* buffer,\n\t\t\t      int buffer_length,\n\t\t\t      char* output_sms_text,\n\t\t\t      int sms_text_length);\n\nint EncodePDUMessage(const char* sms_text,\n\t\t     int sms_text_length,\n\t\t     unsigned char* output_buffer,\n\t\t     int buffer_size);\n\n#endif   // SMS_SMS_H_\n"
  },
  {
    "path": "luci-app-qmodem/application/sms-tool_q/src/pdu_lib/pdu_decoder.c",
    "content": "/*\n * 2014 lovewilliam <ztong@vt.edu>\n * SMS PDU Decoder\n */\n#include \"pdu.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n#include <wchar.h>\n\nint ucs2_to_utf8 (int ucs2, unsigned char * utf8);\n\nint sms_decode()\n{\n\tchar buffer[2*SMS_MAX_PDU_LENGTH+4];\n\tchar *p = buffer;\n\tchar t[2];\n\tint d;\n\tdo\n\t{\n\t\tt[0] = getchar();\n\t\tif(t[0]=='\\n')\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\tt[1] = getchar();\n\t\tif(t[1]=='\\n')\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\t*p = strtol(t,NULL,16);\n\t\tp++;\n\t}while(1);\n\n\ttime_t sms_time;\n\tchar sms_phone[40];\n\tchar sms_text[161];\n\tint tp_dcs_type;\n\tint ref_number;\n\tint total_parts;\n\tint part_number;\n\tint skip_bytes;\n\n\tint sms_text_length = pdu_decode((const unsigned char*)buffer,\n\t\t\t\t\tsizeof(buffer),\n\t\t\t\t\t&sms_time,\n\t\t\t\t\tsms_phone, sizeof(sms_phone),\n\t\t\t\t\tsms_text, sizeof(sms_text),\n\t\t\t\t\t&tp_dcs_type,\n\t\t\t\t\t&ref_number,\n\t\t\t\t\t&total_parts,\n\t\t\t\t\t&part_number,\n\t\t\t\t\t&skip_bytes);\n\n\tprintf(\"From:%s\\n\",sms_phone);\n\tprintf(\"Textlen=%d\\n\",sms_text_length);\n\tchar time_data_str[64];\n\tstrftime(time_data_str,64,\"%D %T\", localtime(&sms_time));\n\tprintf(\"Date/Time:%s\\n\",time_data_str);\n\n\tif (total_parts > 0) {\n\t\tprintf(\"Reference number: %d\\n\", ref_number);\n\t\tprintf(\"SMS segment %d of %d\\n\", part_number, total_parts);\n\t}\n\n\tswitch((tp_dcs_type / 4) % 4)\n\t{\n\t\tcase 0:\n\t\t\t{\n\t\t\t\t// GSM7 bit\n\t\t\t\tint i = skip_bytes;\n\t\t\t\tif(skip_bytes > 0) i = (skip_bytes*8+6)/7;\n\t\t\t\tfor(;i<sms_text_length;i++)\n\t\t\t\t{\n\t\t\t\t\tprintf(\"%c\", sms_text[i]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase 2:\n\t\t\t{\n\t\t\t\t// UCS2\n\t\t\t\tfor(int i = skip_bytes;i<sms_text_length;i+=2)\n\t\t\t\t{\n\t\t\t\t\tint ucs2_char = 0x000000FF&sms_text[i+1];\n\t\t\t\t\tucs2_char|=(0x0000FF00&(sms_text[i]<<8));\n\t\t\t\t\tunsigned char utf8_char[5];\n\t\t\t\t\tint len = ucs2_to_utf8(ucs2_char,utf8_char);\n\t\t\t\t\tint j;\n\t\t\t\t\tfor(j=0;j<len;j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tprintf(\"%c\",utf8_char[j]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tprintf(\"\\n\");\n\n\treturn 0;\n}\n\nint main()\n{\n\treturn sms_decode();\n}\n\n"
  },
  {
    "path": "luci-app-qmodem/application/sms-tool_q/src/pdu_lib/ucs2_to_utf8.c",
    "content": "/*\n * 2014 lovewilliam <ztong@vt.edu>\n * from http://www.lemoda.net/c/ucs2-to-utf8/ucs2-to-utf8.c\n */\n/* Input: a Unicode code point, \"ucs2\". \n\n   Output: UTF-8 characters in buffer \"utf8\". \n\n   Return value: the number of bytes written into \"utf8\", or -1 if\n   there was an error.\n\n   This adds a zero byte to the end of the string. It assumes that the\n   buffer \"utf8\" has at least four bytes of space to write to. */\n\n#define UNICODE_SURROGATE_PAIR -2\n#define UNICODE_BAD_INPUT -1\n\nint ucs2_to_utf8 (int ucs2, unsigned char * utf8)\n{\n    if (ucs2 < 0x80) {\n        utf8[0] = ucs2;\n        utf8[1] = '\\0';\n        return 1;\n    }\n    if (ucs2 >= 0x80  && ucs2 < 0x800) {\n        utf8[0] = (ucs2 >> 6)   | 0xC0;\n        utf8[1] = (ucs2 & 0x3F) | 0x80;\n        utf8[2] = '\\0';\n        return 2;\n    }\n    if (ucs2 >= 0x800 && ucs2 < 0xFFFF) {\n\tif (ucs2 >= 0xD800 && ucs2 <= 0xDFFF) {\n\t    /* Ill-formed. */\n\t    return UNICODE_SURROGATE_PAIR;\n\t}\n        utf8[0] = ((ucs2 >> 12)       ) | 0xE0;\n        utf8[1] = ((ucs2 >> 6 ) & 0x3F) | 0x80;\n        utf8[2] = ((ucs2      ) & 0x3F) | 0x80;\n        utf8[3] = '\\0';\n        return 3;\n    }\n    if (ucs2 >= 0x10000 && ucs2 < 0x10FFFF) {\n\t/* http://tidy.sourceforge.net/cgi-bin/lxr/source/src/utf8.c#L380 */\n\tutf8[0] = 0xF0 | (ucs2 >> 18);\n\tutf8[1] = 0x80 | ((ucs2 >> 12) & 0x3F);\n\tutf8[2] = 0x80 | ((ucs2 >> 6) & 0x3F);\n\tutf8[3] = 0x80 | ((ucs2 & 0x3F));\n        utf8[4] = '\\0';\n        return 4;\n    }\n    return UNICODE_BAD_INPUT;\n}\n\n"
  },
  {
    "path": "luci-app-qmodem/application/sms-tool_q/src/sms_main.c",
    "content": "/*\n * 2017 - 2024 Cezary Jackiewicz <cezary@eko.one.pl>\n * 2014 lovewilliam <ztong@vt.edu>\n * sms tool for various of 3G/4G/5G modem\n */\n#define _GNU_SOURCE\n\n#include <ctype.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <unistd.h>\n#include <getopt.h>\n#include <signal.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <termios.h>\n\n#include \"pdu_lib/pdu.h\"\n\nstatic void usage()\n{\n\tfprintf(stderr,\n\t\t\"usage: [options] send phoneNumber message\\n\"\n\t\t\"       [options] recv\\n\"\n\t\t\"       [options] delete msg_index | all\\n\"\n\t\t\"       [options] status\\n\"\n\t\t\"       [options] ussd code\\n\"\n\t\t\"       [options] at command\\n\"\n\t\t\"options:\\n\"\n\t\t\"\\t-b <baudrate> (default: 115200)\\n\"\n\t\t\"\\t-c coding scheme (for ussd, 0 - 7BIT, 2 - UCS2, default: detect)\\n\"\n\t\t\"\\t-d <tty device> (default: /dev/ttyUSB0)\\n\"\n\t\t\"\\t-D debug (for ussd and at)\\n\"\n\t\t\"\\t-f <date/time format> (for sms/recv)\\n\"\n\t\t\"\\t-j json output (for sms/recv)\\n\"\n\t\t\"\\t-R use raw input (for ussd)\\n\"\n\t\t\"\\t-r use raw output (for ussd and sms/recv)\\n\"\n\t\t\"\\t-s <preferred storage> (for sms/recv/status)\\n\"\n\t\t);\n\texit(2);\n}\n\nstatic struct termios save_tio;\nstatic int port = -1;\nstatic const char* dev = \"/dev/ttyUSB0\";\nstatic const char* storage = \"\";\nstatic const char* dateformat = \"%D %T\";\n\nstatic void setserial(int baudrate)\n{\n\tstruct termios t;\n\tif (tcgetattr(port, &t) < 0)\n\t\tfprintf(stderr,\"tcgetattr(%s)\\n\", dev);\n\n\tmemmove(&save_tio, &t, sizeof(t));\n\n\tcfmakeraw(&t);\n\n\tt.c_cflag |=CLOCAL;\n\tt.c_cflag |=CREAD;\n\n// data bits\n\tt.c_cflag &=~CSIZE;\n\tt.c_cflag |= CS8;\n// parity\n\tt.c_cflag &= ~PARENB;\n// stop bits\n\tt.c_cflag &=~CSTOPB;\n// flow control\n\tt.c_cflag &=~CRTSCTS;\n\n\tt.c_oflag &=~OPOST;\n\tt.c_cc[VMIN]=1;\n\n\tswitch (baudrate)\n\t{\n\t\tcase 0:\n\t\t\tbreak;\n\t\tcase 4800:\n\t\t\tcfsetspeed(&t, B4800);\n\t\t\tbreak;\n\t\tcase 9600:\n\t\t\tcfsetspeed(&t, B9600);\n\t\t\tbreak;\n\t\tcase 19200:\n\t\t\tcfsetspeed(&t, B19200);\n\t\t\tbreak;\n\t\tcase 38400:\n\t\t\tcfsetspeed(&t, B38400);\n\t\t\tbreak;\n\t\tcase 57600:\n\t\t\tcfsetspeed(&t, B57600);\n\t\t\tbreak;\n\t\tcase 115200:\n\t\t\tcfsetspeed(&t, B115200);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tfprintf(stderr,\"Unsupported baudrate: %d\\n\", baudrate);\n\t}\n\tif (tcsetattr(port, TCSANOW, &t) < 0)\n\t{\n\t\tfprintf(stderr,\"tcsetattr(%s)\\n\", dev);\n\t}\n}\n\nstatic void resetserial()\n{\n\tif (tcsetattr(port, TCSANOW, &save_tio) < 0)\n\t\tfprintf(stderr, \"failed tcsetattr(%s): %s\\n\", dev, strerror(errno));\n\ttcflush(port, TCIOFLUSH);\n\tclose(port);\n}\n\nstatic void timeout(int sig __attribute__((unused)))\n{\n\tfprintf(stderr,\"No response from modem.\\n\");\n\texit(2);\n}\n\nstatic int starts_with(const char* prefix, const char* str)\n{\n\twhile(*prefix)\n\t{\n\t\tif (*prefix++ != *str++)\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t}\n\treturn 1;\n}\n\nstatic int char_to_hex(char c)\n{\n\tif (isdigit(c))\n\t\treturn c - '0';\n\tif (islower(c))\n\t\treturn 10 + c - 'a';\n\tif (isupper(c))\n\t\treturn 10 + c - 'A';\n\treturn -1;\n}\n\nstatic void print_json_escape_char(char c1, char c2)\n{\n\tif (c1 == 0x0) {\n\t\tif(c2 == '\"') printf(\"\\\\\\\"\");\n\t\telse if(c2 == '\\\\') printf(\"\\\\\\\\\");\n\t\telse if(c2 == '\\b') printf(\"\\\\b\");\n\t\telse if(c2 == '\\n') printf(\"\\\\n\");\n\t\telse if(c2 == '\\f') printf(\"\\\\f\");\n\t\telse if(c2 == '\\r') printf(\"\\\\r\");\n\t\telse if(c2 == '\\t') printf(\"\\\\t\");\n\t\telse if(c2 == '\"') printf(\"\\\\\\\"\");\n\t\telse if(c2 == '/') printf(\"\\\\/\");\n\t\telse if(c2 < ' ') printf(\"\\\\u00%02x\", c2);\n\t\telse printf(\"%c\", c2);\n\t} else {\n\t\tprintf(\"\\\\u%02x%02x\", (unsigned char)c1, (unsigned char)c2);\n\t}\n}\n\nint main(int argc, char* argv[])\n{\n\tint ch;\n\tint baudrate = 115200;\n\tint rawinput = 0;\n\tint rawoutput = 0;\n\tint jsonoutput = 0;\n\tint debug = 0;\n\tint dcs = -1;\n\n\twhile ((ch = getopt(argc, argv, \"b:c:d:Ds:f:jRr\")) != -1){\n\t\tswitch (ch) {\n\t\tcase 'b': baudrate = atoi(optarg); break;\n\t\tcase 'c': dcs = atoi(optarg); break;\n\t\tcase 'd': dev = optarg; break;\n\t\tcase 'D': debug = 1; break;\n\t\tcase 's': storage = optarg; break;\n\t\tcase 'f': dateformat = optarg; break;\n\t\tcase 'j': jsonoutput = 1; break;\n\t\tcase 'R': rawinput = 1; break;\n\t\tcase 'r': rawoutput = 1; break;\n\t\tdefault:\n\t\t\tusage();\n\t\t}\n\t}\n\n\targv += optind; argc -= optind;\n\n\tif (argc < 1)\n\t\tusage();\n\tif (!strcmp(\"send\", argv[0]))\n\t{\n\t\tif(argc < 3)\n\t\t\tusage();\n\t\tif(strlen(argv[2]) > 160)\n\t\t\tfprintf(stderr,\"sms message too long: '%s'\\n\", argv[2]);\n\t}else if (!strcmp(\"delete\",argv[0]))\n\t{\n\t\tif(argc < 2)\n\t\t\tusage();\n\t}else if (!strcmp(\"recv\", argv[0]))\n\t{\n\t}else if (!strcmp(\"status\", argv[0]))\n\t{\n\t}else if (!strcmp(\"ussd\", argv[0]))\n\t{\n\t}else if (!strcmp(\"at\", argv[0]))\n\t{\n\t\tif(argc < 2)\n\t\t\tusage();\n\t}else\n\t\tusage();\n\n\tsignal(SIGALRM,timeout);\n\n\tchar cmdstr[100];\n\tchar pdustr[2*SMS_MAX_PDU_LENGTH+4];\n\tunsigned char pdu[SMS_MAX_PDU_LENGTH];\n\n\t// open the port\n\n\tport = open(dev, O_RDWR|O_NONBLOCK|O_NOCTTY);\n\tif (port < 0)\n\t\tfprintf(stderr,\"open(%s)\\n\", dev);\n\tsetserial(baudrate);\n\tatexit(resetserial);\n\n\tclose(port);\n\tport = open(dev, O_RDWR|O_NOCTTY);\n\tif (port < 0)\n\t\tfprintf(stderr,\"reopen(%s)\\n\", dev);\n\n\tFILE* pf = fdopen(port, \"w\");\n\tFILE* pfi = fdopen(port, \"r\");\n\tif (!pf || ! pfi)\n\t\tfprintf(stderr,\"open port failed\\n\");\n\tif(setvbuf(pf, NULL, _IOLBF, 0))\n\t{\n\t\tfprintf(stderr, \"failed to make serial port linebuffered\\n\");\n\t}\n\n\tchar buf[1024];\n\tif (!strcmp(\"send\", argv[0]))\n\t{\n\t\tint pdu_len = pdu_encode(\"\", argv[1], argv[2], pdu, sizeof(pdu));\n\t\tif (pdu_len < 0)\n\t\t\tfprintf(stderr,\"error encoding to PDU: %s \\\"%s\\n\", argv[1], argv[2]);\n\n\t\tconst int pdu_len_except_smsc = pdu_len - 1 - pdu[0];\n\t\tsnprintf(cmdstr, sizeof(cmdstr), \"AT+CMGS=%d\\r\\n\", pdu_len_except_smsc);\n\n\t\tint i;\n\t\tfor (i = 0; i < pdu_len; ++i)\n\t\t\tsprintf(pdustr+2*i, \"%02X\", pdu[i]);\n\t\tsprintf(pdustr+2*i, \"%c\\r\\n\", 0x1A);   // End PDU mode with Ctrl-Z.\n\n\t\tfputs(\"AT+CMGF=0\\r\\n\", pf);\n\t\twhile(fgets(buf, sizeof(buf), pfi)) {\n\t\t\tif(starts_with(\"OK\", buf))\n\t\t\t\tbreak;\n\t\t}\n\t\tfputs(cmdstr, pf);\n\t\tsleep(1);\n\t\tfputs(pdustr, pf);\n\n\t\talarm(5);\n\t\terrno = 0;\n\n\t\twhile(fgets(buf, sizeof(buf), pfi))\n\t\t{\n\t\t\tif(starts_with(\"+CMGS:\", buf))\n\t\t\t{\n\t\t\t\tprintf(\"sms sent sucessfully: %s\", buf + 7);\n\t\t\t\treturn 0;\n\t\t\t} else if(starts_with(\"+CMS ERROR:\", buf))\n\t\t\t{\n\t\t\t\tfprintf(stderr,\"sms not sent, code: %s\\n\", buf + 11);\n\t\t\t} else if(starts_with(\"ERROR\", buf))\n\t\t\t{\n\t\t\t\tfprintf(stderr,\"sms not sent, command error\\n\");\n\t\t\t} else if(starts_with(\"OK\", buf))\n\t\t\t{\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\tfprintf(stderr,\"reading port\\n\");\n\t}\n\n\tif (!strcmp(\"recv\", argv[0]))\n\t{\n\t\talarm(10);\n\t\tif (strlen(storage) > 0) {\n\t\t\tfputs(\"AT+CPMS=\\\"\", pf);\n\t\t\tfputs(storage, pf);\n\t\t\tfputs(\"\\\"\\r\\n\", pf);\n\t\t\twhile(fgets(buf, sizeof(buf), pfi)) {\n\t\t\t\tif(starts_with(\"OK\", buf))\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfputs(\"AT+CMGF=0\\r\\n\", pf);\n\t\twhile(fgets(buf, sizeof(buf), pfi)) {\n\t\t\tif(starts_with(\"OK\", buf))\n\t\t\t\tbreak;\n\t\t}\n\t\tfputs(\"AT+CMGL=4\\r\\n\", pf);\n\t\tint idx[1024];\n\t\tint count  = 0;\n\t\tif(jsonoutput == 1) {\n\t\t\tprintf(\"{\\\"msg\\\":[\");\n\t\t}\n\t\twhile(fgets(buf, sizeof buf, pfi))\n\t\t{\n\t\t\tif(starts_with(\"OK\", buf))\n\t\t\t\tbreak;\n\t\t\tif(starts_with(\"+CMGL:\", buf))\n\t\t\t{\n\t\t\t\tif(sscanf(buf, \"+CMGL: %d,\", &idx[count]) != 1)\n\t\t\t\t{\n\t\t\t\t\tfprintf(stderr, \"unparsable CMGL response: %s\\n\", buf+7);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tif(!fgets(buf, sizeof buf, pfi))\n\t\t\t\t\tfprintf(stderr,\"reading pdu %d\\n\", count);\n\n\t\t\t\tif(jsonoutput == 1) {\n\t\t\t\t\tif (count > 0) {\n\t\t\t\t\t\tprintf(\",\");\n\t\t\t\t\t}\n\t\t\t\t\tprintf(\"{\\\"index\\\":%d,\",idx[count]);\n\t\t\t\t} else {\n\t\t\t\t\tprintf(\"MSG: %d\\n\",idx[count]);\n\t\t\t\t}\n\n\t\t\t\t++count;\n\n\t\t\t\tif(rawoutput == 1)\n\t\t\t\t{\n\t\t\t\t\tif(jsonoutput == 1) {\n\t\t\t\t\t\tprintf(\"\\\"content\\\":\\\"%s\\\"\", buf);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprintf(\"%s\\n\", buf);\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tint l = strlen(buf);\n\t\t\t\tint i;\n\t\t\t\tfor(i = 0; i < l; i+=2)\n\t\t\t\t\tpdu[i/2] = 16*char_to_hex(buf[i]) + char_to_hex(buf[i+1]);\n\n\t\t\t\ttime_t sms_time;\n\t\t\t\tchar phone_str[40];\n\t\t\t\tchar sms_txt[161];\n\n\t\t\t\tint tp_dcs_type;\n\t\t\t\tint ref_number;\n\t\t\t\tint total_parts;\n\t\t\t\tint part_number;\n\t\t\t\tint skip_bytes;\n\n\t\t\t\tint sms_len = pdu_decode(pdu, l/2, &sms_time, phone_str, sizeof(phone_str), sms_txt, sizeof(sms_txt),&tp_dcs_type,&ref_number,&total_parts,&part_number,&skip_bytes);\n\t\t\t\tif (sms_len <= 0) {\n\t\t\t\t\tfprintf(stderr, \"error decoding pdu %d: %s\\n\", count-1, buf);\n\t\t\t\t\tif(jsonoutput == 1) {\n\t\t\t\t\t\tprintf(\"\\\"error\\\":\\\"error decoding pdu\\\",\\\"sender\\\":\\\"\\\",\\\"timestamp\\\":\\\"\\\",\\\"content\\\":\\\"\\\"}\");\n\t\t\t\t\t}\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tif(jsonoutput == 1) {\n\t\t\t\t\tprintf(\"\\\"sender\\\":\\\"%s\\\",\",phone_str);\n\t\t\t\t} else {\n\t\t\t\t\tprintf(\"From: %s\\n\",phone_str);\n\t\t\t\t}\n\t\t\t\tchar time_data_str[64];\n\t\t\t\tstrftime(time_data_str, 64, dateformat, gmtime(&sms_time));\n\t\t\t\tif(jsonoutput == 1) {\n\t\t\t\t\tprintf(\"\\\"timestamp\\\":\\\"%s\\\",\",time_data_str);\n\t\t\t\t} else {\n\t\t\t\t\tprintf(\"Date/Time: %s\\n\",time_data_str);\n\t\t\t\t}\n\n\t\t\t\tif(total_parts > 0) {\n\t\t\t\t\tif(jsonoutput == 1) {\n\t\t\t\t\t\tprintf(\"\\\"reference\\\":%d,\\\"part\\\":%d,\\\"total\\\":%d,\", ref_number, part_number, total_parts);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tprintf(\"Reference number: %d\\n\", ref_number);\n\t\t\t\t\t\tprintf(\"SMS segment %d of %d\\n\", part_number, total_parts);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(jsonoutput == 1) {\n\t\t\t\t\tprintf(\"\\\"content\\\":\\\"\");\n\t\t\t\t}\n\t\t\t\tswitch((tp_dcs_type / 4) % 4)\n\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\t{\n\t\t\t\t\t\t// GSM 7 bit\n\t\t\t\t\t\tint i = skip_bytes;\n\t\t\t\t\t\tif(skip_bytes > 0) i = (skip_bytes*8+6)/7;\n\t\t\t\t\t\tfor(; i<sms_len; i++)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(jsonoutput == 1) {\n\t\t\t\t\t\t\t\tprint_json_escape_char(0x0, sms_txt[i]);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tprintf(\"%c\", sms_txt[i]);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase 2:\n\t\t\t\t\t{\n\t\t\t\t\t\t// UCS2\n\t\t\t\t\t\tfor(int i = skip_bytes;i<sms_len;i+=2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tif(jsonoutput == 1) {\n\t\t\t\t\t\t\t\tprint_json_escape_char(sms_txt[i],sms_txt[i+1]);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tint ucs2_char = 0x000000FF&sms_txt[i+1];\n\t\t\t\t\t\t\t\tucs2_char|=(0x0000FF00&(sms_txt[i]<<8));\n\t\t\t\t\t\t\t\tunsigned char utf8_char[5];\n\t\t\t\t\t\t\t\tint len = ucs2_to_utf8(ucs2_char,utf8_char);\n\t\t\t\t\t\t\t\tint j;\n\t\t\t\t\t\t\t\tfor(j=0;j<len;j++)\n\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\tprintf(\"%c\", utf8_char[j]);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(jsonoutput == 1) {\n\t\t\t\t\tprintf(\"\\\"}\");\n\t\t\t\t} else {\n\t\t\t\t\tprintf(\"\\n\\n\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif(jsonoutput == 1) {\n\t\t\tprintf(\"]}\\n\");\n\t\t}\n\n\t}\n\n\tif (!strcmp(\"delete\",argv[0]))\n\t{\n\t\tint i = atoi(argv[1]);\n\t\tint j = i;\n\t\tif(!strcmp(\"all\",argv[1]))\n\t\t{\n\t\t\ti = 0;\n\t\t\tj = 49;\n\t\t}\n\t\tprintf(\"delete msg from %d to %d\\n\",i,j);\n\t\tfor(;i<=j;i++)\n\t\t{\n\t\t\tfprintf(pf, \"AT+CMGD=%d\\r\\n\", i);\n\t\t\twhile(fgets(buf, sizeof buf, pfi))\n\t\t\t{\n\t\t\t\tif(starts_with(\"OK\", buf))\n\t\t\t\t{\n\t\t\t\t\tprintf(\"Deleted message %d\\n\", i);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tif(starts_with(\"+CMS ERROR:\", buf))\n\t\t\t\t{\n\t\t\t\t\tprintf(\"Error deleting message %d: %s\\n\", i, buf+12);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!strcmp(\"status\", argv[0]))\n\t{\n\t\talarm(10);\n\t\tif (strlen(storage) > 0) {\n\t\t\tfputs(\"AT+CPMS=\\\"\", pf);\n\t\t\tfputs(storage, pf);\n\t\t\tfputs(\"\\\"\\r\\n\", pf);\n\t\t\twhile(fgets(buf, sizeof(buf), pfi)) {\n\t\t\t\tif(starts_with(\"OK\", buf))\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfputs(\"AT+CPMS?\\r\\n\", pf);\n\t\twhile(fgets(buf, sizeof buf, pfi))\n\t\t{\n\t\t\tif(starts_with(\"+CPMS:\", buf))\n\t\t\t{\n\t\t\t\tchar mem1[9];\n\t\t\t\tint mem1_used, mem1_total;\n\t\t\t\tif(sscanf(buf, \"+CPMS: \\\"%2s\\\",%d,%d,\", mem1, &mem1_used, &mem1_total) != 3)\n\t\t\t\t{\n\t\t\t\t\tfprintf(stderr, \"unparsable CPMS response: %s\\n\", buf);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\tprintf(\"Storage type: %s, used: %d, total: %d\\n\", mem1, mem1_used, mem1_total);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(starts_with(\"OK\", buf))\n\t\t\t{\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!strcmp(\"ussd\", argv[0]))\n\t{\n\t\tenum sms_charset {\n\t\t\tSMS_CHARSET_7BIT = 0,\n\t\t\tSMS_CHARSET_8BIT = 1,\n\t\t\tSMS_CHARSET_UCS2 = 2,\n\t\t};\n\n\t\tif (rawinput==1)\n\t\t{\n\t\t\tsnprintf(cmdstr, sizeof(cmdstr), \"AT+CUSD=1,\\\"%s\\\",15\\r\\n\", argv[1]);\n\t\t}\n\t\telse\n\t\t{\n\t\t\tint pdu_len = EncodePDUMessage(argv[1], strlen(argv[1]), pdu, SMS_MAX_PDU_LENGTH);\n\t\t\tif (pdu_len > 0)\n\t\t\t{\n\t\t\t\tif (pdu[pdu_len - 1] == 0) {pdu[pdu_len - 1] = 0x1d;}\n\t\t\t\tfor (int i = 0; i < pdu_len; ++i)\n\t\t\t\t\tsprintf(pdustr+2*i, \"%02X\", pdu[i]);\n\t\t\t\tsnprintf(cmdstr, sizeof(cmdstr), \"AT+CUSD=1,\\\"%s\\\",15\\r\\n\", pdustr);\n\t\t\t}\n\t\t\telse\n\t\t\t\tfprintf(stderr, \"error encoding to PDU: %s\\n\", argv[1]);\n\t\t}\n\t\tif (debug == 1)\n\t\t\tprintf(\"debug: %s\\n\", cmdstr);\n\n\t\tfputs(cmdstr, pf);\n\t\talarm(10);\n\t\tchar ussd_buf[320];\n\t\tchar ussd_txt[800];\n\t\tint rc, multiline = 0, tp_dcs_type = 0;\n\t\twhile(fgets(buf, sizeof buf, pfi))\n\t\t{\n\t\t\tif(starts_with(\"OK\", buf))\n\t\t\t\tcontinue;\n\t\t\tif(starts_with(\"+CME ERROR:\", buf))\n\t\t\t{\n\t\t\t\tfprintf(stderr, \"error: %s\\n\", buf+12);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif(starts_with(\"+CUSD:\", buf))\n\t\t\t{\n\t\t\t\tif (debug == 1)\n\t\t\t\t\tprintf(\"debug: %s\\n\", buf);\n\n\t\t\t\tchar tmp[8];\n\t\t\t\trc = sscanf(buf, \"+CUSD:%7[^\\\"]\\\"%[^\\\"]\\\",%d\", tmp, ussd_buf, &tp_dcs_type);\n\t\t\t\tif(rc == 2)\n\t\t\t\t{\n\t\t\t\t\tif(rawoutput == 1)\n\t\t\t\t\t{\n\t\t\t\t\t\tmultiline = 1;\n\t\t\t\t\t\trc = 3;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif(rc != 3)\n\t\t\t\t{\n\t\t\t\t\tfprintf(stderr, \"unparsable CUSD response: %s\\n\", buf);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tif(rawoutput == 1)\n\t\t\t\t{\n\t\t\t\t\tprintf(\"%s\", ussd_buf);\n\t\t\t\t\tif (multiline == 1)\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\telse\n\t\t\t\t\t{\n\t\t\t\t\t\tprintf(\"\\n\");\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tint l = strlen(ussd_buf);\n\t\t\t\tfor(int i = 0; i < l; i+=2)\n\t\t\t\t\tpdu[i/2] = 16*char_to_hex(ussd_buf[i]) + char_to_hex(ussd_buf[i+1]);\n\n\t\t\t\tint upper = (tp_dcs_type & 0xf0) >> 4;\n\t\t\t\tint lower = tp_dcs_type & 0xf;\n\t\t\t\tint coding = -1;\n\n\t\t\t\tif (upper == 0x3 || upper == 0x8 || (upper >= 0xA && upper <= 0xE))\n\t\t\t\t\tcoding = -1;\n\n\t\t\t\tswitch (upper)\n\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\tcoding = SMS_CHARSET_7BIT;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\tif (lower == 0)\n\t\t\t\t\t\t\tcoding = SMS_CHARSET_7BIT;\n\t\t\t\t\t\tif (lower == 1)\n\t\t\t\t\t\t\tcoding = SMS_CHARSET_UCS2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 2:\n\t\t\t\t\t\tif (lower <= 4)\n\t\t\t\t\t\t\tcoding = SMS_CHARSET_7BIT;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 4:\n\t\t\t\t\tcase 5:\n\t\t\t\t\tcase 6:\n\t\t\t\t\tcase 7:\n\t\t\t\t\t\tif (((tp_dcs_type & 0x0c) >> 2) < 3)\n\t\t\t\t\t\t\tcoding = (enum sms_charset) ((tp_dcs_type & 0x0c) >> 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 9:\n\t\t\t\t\t\tif (((tp_dcs_type & 0x0c) >> 2) < 3)\n\t\t\t\t\t\t\tcoding = (enum sms_charset) ((tp_dcs_type & 0x0c) >> 2);\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 15:\n\t\t\t\t\t\tif (lower & 0x4 == 0)\n\t\t\t\t\t\t\tcoding = SMS_CHARSET_7BIT;\n\t\t\t\t\t\tbreak;\n\t\t\t\t};\n\n\t\t\t\tswitch(dcs)\n\t\t\t\t{\n\t\t\t\t\tcase SMS_CHARSET_7BIT:\n\t\t\t\t\t{\n\t\t\t\t\t\tcoding = SMS_CHARSET_7BIT;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SMS_CHARSET_UCS2:\n\t\t\t\t\t{\n\t\t\t\t\t\tcoding = SMS_CHARSET_UCS2;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tswitch(coding)\n\t\t\t\t{\n\t\t\t\t\tcase SMS_CHARSET_7BIT:\n\t\t\t\t\t{\n\t\t\t\t\t\t// GSM 7 bit\n\t\t\t\t\t\tl = DecodePDUMessage_GSM_7bit(pdu, l/2, ussd_txt, sizeof(ussd_txt));\n\t\t\t\t\t\tif (l > 0) {\n\t\t\t\t\t\t\tif (l < sizeof(ussd_txt))\n\t\t\t\t\t\t\t\tussd_txt[l] = 0;\n\n\t\t\t\t\t\t\tprintf(\"%s\\n\", ussd_txt);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfprintf(stderr, \"error decoding pdu: %s\\n\", ussd_buf);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tcase SMS_CHARSET_UCS2:\n\t\t\t\t\t{\n\t\t\t\t\t\t// UCS2\n\t\t\t\t\t\t// FIXME: interaction with multiline, sample PDUs needed\n\t\t\t\t\t\tint utf_pos = 0;\n\t\t\t\t\t\tfor(int i = 0;i+1<l/2;i+=2)\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tint ucs2_char = 0x000000FF&pdu[i+1];\n\t\t\t\t\t\t\tucs2_char|=(0x0000FF00&(pdu[i]<<8));\n\t\t\t\t\t\t\tutf_pos += ucs2_to_utf8(ucs2_char,&ussd_txt[utf_pos]);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (utf_pos > 0) {\n\t\t\t\t\t\t\tif (utf_pos < sizeof(ussd_txt))\n\t\t\t\t\t\t\t\tussd_txt[utf_pos] = 0;\n\n\t\t\t\t\t\t\tprintf(\"%s\\n\", ussd_txt);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tfprintf(stderr, \"error decoding pdu: %s\\n\", ussd_buf);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tdefault:\n\t\t\t\t\t\tfprintf(stderr, \"unknown coding scheme: %d\\n\", tp_dcs_type);\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (multiline == 1)\n\t\t\t{\n\t\t\t\trc = sscanf(buf, \"%[^\\\"]\\\",%d\", ussd_buf, &tp_dcs_type);\n\t\t\t\tif (rc == 1)\n\t\t\t\t{\n\t\t\t\t\tprintf(\"%s\", ussd_buf);\n\t\t\t\t}\n\t\t\t\tif (rc == 2)\n\t\t\t\t{\n\t\t\t\t\tprintf(\"%s\\n\", ussd_buf);\n\t\t\t\t\tmultiline = 0;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (!strcmp(\"at\", argv[0]))\n\t{\n\t\talarm(5);\n\t\tfputs(argv[1], pf);\n\t\tfputs(\"\\r\\n\", pf);\n\n\t\twhile(fgets(buf, sizeof(buf), pfi)) {\n\t\t\tif(starts_with(\"OK\", buf)) {\n\t\t\t\tif (debug == 1)\n\t\t\t\t\tprintf(\"%s\", buf);\n\t\t\t\texit(0);\n\t\t\t}\n\t\t\tif(starts_with(\"ERROR\", buf)) {\n\t\t\t\tif (debug == 1)\n\t\t\t\t\tprintf(\"%s\", buf);\n\t\t\t\texit(1);\n\t\t\t}\n\t\t\tif(starts_with(\"COMMAND NOT SUPPORT\", buf)) {\n\t\t\t\tif (debug == 1)\n\t\t\t\t\tprintf(\"%s\", buf);\n\t\t\t\texit(1);\n\t\t\t}\n\t\t\tif(starts_with(\"+CME ERROR\", buf)) {\n\t\t\t\tif (debug == 1)\n\t\t\t\t\tprintf(\"%s\", buf);\n\t\t\t\texit(1);\n\t\t\t}\n\t\t\tprintf(\"%s\", buf);\n\t\t}\n\t}\n\n\texit(0);\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\n# Include unified version\ninclude ../../version.mk\n\nPKG_NAME:=sms-forwarder\nPKG_RELEASE:=$(QMODEM_RELEASE)\nPKG_VERSION:=$(QMODEM_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n  SECTION:=utils\n  CATEGORY:=Utilities\n  TITLE:=SMS Forward Service\n  DEPENDS:=+tom_modem +jq +curl +libjson-c\nendef\n\ndefine Package/$(PKG_NAME)/description\n  SMS forward service for QModem that supports multiple forwarding methods:\n  - Telegram Bot\n  - ServerChan\n  - Generic Webhook\n  - Custom Script\nendef\n\ndefine Build/Prepare\n\tmkdir -p $(PKG_BUILD_DIR)\n\t$(CP) src/* $(PKG_BUILD_DIR)/\nendef\n\ndefine Build/Compile\n\t$(MAKE) -C $(PKG_BUILD_DIR) \\\n\t\t$(TARGET_CONFIGURE_OPTS) \\\n\t\tCFLAGS=\"$(TARGET_CFLAGS) -I$(STAGING_DIR)/usr/include\" \\\n\t\tLDFLAGS=\"$(TARGET_LDFLAGS) -ljson-c\"\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/sms_forwarder $(1)/usr/bin/\n\t$(INSTALL_BIN) ./files/usr/bin/sms_forward_*.sh $(1)/usr/bin/\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_BIN) ./files/etc/init.d/sms_forwarder $(1)/etc/init.d/\n\t$(INSTALL_DIR) $(1)/etc/config\n\t$(INSTALL_CONF) ./files/etc/config/sms_daemon $(1)/etc/config/\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/sms_daemon\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder/files/etc/config/sms_daemon",
    "content": "config sms_forward 'sms_forward'\n\toption enable '0'\n\toption log_level 'info'\n\nconfig sms_forward_instance\n\toption enable '0'\n\toption listen_port '/dev/ttyUSB2'\n\toption poll_interval '30'\n\toption api_type 'tgbot'\n\toption tg_bot_token ''\n\toption tg_chat_id ''\n\toption api_config '{\"bot_token\":\"\",\"chat_id\":\"\"}'\n\toption delete_after_forward '0'\n\nconfig sms_forward_instance\n\toption enable '0'\n\toption listen_port '/dev/ttyUSB3'\n\toption poll_interval '60'\n\toption api_type 'webhook'\n\toption webhook_url 'https://example.com/webhook'\n\toption webhook_headers ''\n\toption api_config '{\"webhook_url\":\"https://example.com/webhook\"}'\n\toption delete_after_forward '0'\n\nconfig sms_forward_instance\n\toption enable '0'\n\toption listen_port '/dev/ttyUSB4'\n\toption poll_interval '60'\n\toption api_type 'serverchan'\n\toption serverchan_token ''\n\toption serverchan_channel ''\n\toption serverchan_noip '0'\n\toption serverchan_openid ''\n\toption api_config '{\"token\":\"\",\"channel\":\"\",\"noip\":\"\",\"openid\":\"\"}'\n\toption delete_after_forward '0'\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder/files/etc/init.d/sms_forwarder",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=90\nSTOP=10\n\nUSE_PROCD=1\nPROG=/usr/bin/sms_forwarder\n\nstart_service() {\n\tconfig_load sms_daemon\n\t\n\tlocal enabled\n\tconfig_get_bool enabled sms_forward enable 0\n\t\n\tif [ \"$enabled\" -eq 0 ]; then\n\t\techo \"SMS Forward service is disabled\"\n\t\treturn 0\n\tfi\n\t\n\t# Generate combined configuration file\n\tlocal config_file=\"/tmp/sms_forwarder_combined.json\"\n\tgenerate_combined_config \"$config_file\"\n\t\n\tif [ $? -ne 0 ]; then\n\t\techo \"Error: Failed to generate combined configuration\"\n\t\treturn 1\n\tfi\n\t\n\t# Start single SMS forwarder instance with combined config\n\tprocd_open_instance \"sms_forwarder\"\n\tprocd_set_param command \"$PROG\" \"$config_file\"\n\tprocd_set_param respawn\n\tprocd_set_param stdout 1\n\tprocd_set_param stderr 1\n\tprocd_set_param file \"$config_file\"\n\tprocd_close_instance\n}\n\ngenerate_combined_config() {\n\tlocal config_file=\"$1\"\n\tlocal temp_file=\"/tmp/sms_modem_configs.tmp\"\n\t\n\t# Clear temp file\n\t> \"$temp_file\"\n\t\n\t# Collect all modem configurations\n\tconfig_foreach collect_modem_config sms_forward_instance \"$temp_file\"\n\t\n\tif [ ! -s \"$temp_file\" ]; then\n\t\techo \"Error: No valid SMS forward instances found\"\n\t\treturn 1\n\tfi\n\t\n\t# Merge configurations by modem_port and generate final JSON\n\tmerge_and_generate_json \"$temp_file\" \"$config_file\"\n\tlocal result=$?\n\t\n\t# Clean up temp file\n\trm -f \"$temp_file\"\n\t\n\t# Validate the generated JSON\n\tif command -v jq >/dev/null 2>&1; then\n\t\tif ! jq . \"$config_file\" >/dev/null 2>&1; then\n\t\t\techo \"Error: Generated JSON config is invalid\"\n\t\t\techo \"Config file content:\"\n\t\t\tcat \"$config_file\"\n\t\t\treturn 1\n\t\tfi\n\tfi\n\t\n\treturn $result\n}\n\ncollect_modem_config() {\n\tlocal section=\"$1\"\n\tlocal temp_file=\"$2\"\n\tlocal enabled port poll_interval delete_after_forward api_type\n\t\n\tconfig_get_bool enabled \"$section\" enable 0\n\t[ \"$enabled\" -eq 0 ] && return 0\n\t\n\tconfig_get port \"$section\" listen_port\n\tconfig_get poll_interval \"$section\" poll_interval 30\n\tconfig_get_bool delete_after_forward \"$section\" delete_after_forward 0\n\tconfig_get api_type \"$section\" api_type\n\t\n\t# Validate required parameters\n\t[ -z \"$port\" ] && {\n\t\techo \"Error: No modem port specified for instance $section\"\n\t\treturn 1\n\t}\n\t\n\t[ -z \"$api_type\" ] && {\n\t\techo \"Error: No API type specified for instance $section\"\n\t\treturn 1\n\t}\n\t\n\t# Generate API config based on type\n\tlocal api_config=$(generate_api_config \"$section\" \"$api_type\")\n\tif [ -z \"$api_config\" ]; then\n\t\techo \"Error: Failed to generate API config for $api_type in instance $section\"\n\t\treturn 1\n\tfi\n\t\n\t# Write config line to temp file: PORT|POLL_INTERVAL|DELETE_FLAG|API_TYPE|API_CONFIG\n\techo \"${port}|${poll_interval}|${delete_after_forward}|${api_type}|${api_config}\" >> \"$temp_file\"\n}\n\nmerge_and_generate_json() {\n\tlocal temp_file=\"$1\"\n\tlocal config_file=\"$2\"\n\tlocal first_modem=1\n\t\n\t# Start JSON array\n\techo \"[\" > \"$config_file\"\n\t\n\t# Get unique modem ports\n\tlocal unique_ports=$(cut -d'|' -f1 \"$temp_file\" | sort -u)\n\t\n\tfor port in $unique_ports; do\n\t\t# Add comma if not first modem\n\t\tif [ \"$first_modem\" -eq 0 ]; then\n\t\t\techo \",\" >> \"$config_file\"\n\t\tfi\n\t\tfirst_modem=0\n\t\t\n\t\t# Find all configs for this port\n\t\tlocal port_configs_file=\"/tmp/port_configs_${port//\\//_}.tmp\"\n\t\tgrep \"^${port}|\" \"$temp_file\" > \"$port_configs_file\"\n\t\t\n\t\t# Get common settings from first config for this port\n\t\tlocal first_line=$(head -n1 \"$port_configs_file\")\n\t\tlocal poll_interval=$(echo \"$first_line\" | cut -d'|' -f2)\n\t\tlocal delete_after_forward=$(echo \"$first_line\" | cut -d'|' -f3)\n\t\t\n\t\t# Start modem configuration object\n\t\tprintf '{\\n\\t\"modem_port\": \"%s\",\\n\\t\"poll_interval\": %d,\\n\\t\"delete_after_forward\": %s,\\n\\t\"apis\": [\\n' \\\n\t\t\t\"$port\" \"$poll_interval\" \"$delete_after_forward\" >> \"$config_file\"\n\t\t\n\t\t# Add all APIs for this port\n\t\tlocal first_api=1\n\t\twhile IFS='|' read -r p_port p_poll p_delete p_api_type p_api_config; do\n\t\t\t# Add comma if not first API\n\t\t\tif [ \"$first_api\" -eq 0 ]; then\n\t\t\t\techo \",\" >> \"$config_file\"\n\t\t\tfi\n\t\t\tfirst_api=0\n\t\t\t\n\t\t\t# Add API configuration\n\t\t\tprintf '\\t\\t{\\n\\t\\t\\t\"api_type\": \"%s\",\\n\\t\\t\\t\"api_config\": %s\\n\\t\\t}' \\\n\t\t\t\t\"$p_api_type\" \"$p_api_config\" >> \"$config_file\"\n\t\tdone < \"$port_configs_file\"\n\t\t\n\t\t# Clean up temp file\n\t\trm -f \"$port_configs_file\"\n\t\t\n\t\t# End apis array and modem object\n\t\tprintf '\\n\\t]\\n}' >> \"$config_file\"\n\tdone\n\t\n\t# End JSON array\n\techo \"\" >> \"$config_file\"\n\techo \"]\" >> \"$config_file\"\n}\n\ngenerate_api_config() {\n\tlocal section=\"$1\"\n\tlocal api_type=\"$2\"\n\tlocal config_json=\"\"\n\t\n\tcase \"$api_type\" in\n\t\t\"tgbot\")\n\t\t\tlocal bot_token chat_id\n\t\t\tconfig_get bot_token \"$section\" tg_bot_token\n\t\t\tconfig_get chat_id \"$section\" tg_chat_id\n\t\t\t\n\t\t\t[ -z \"$bot_token\" ] || [ -z \"$chat_id\" ] && {\n\t\t\t\techo \"Error: Telegram Bot requires bot_token and chat_id\"\n\t\t\t\treturn 1\n\t\t\t}\n\t\t\t\n\t\t\tconfig_json=\"{\\\"bot_token\\\":\\\"$bot_token\\\",\\\"chat_id\\\":\\\"$chat_id\\\"}\"\n\t\t\t;;\n\t\t\t\n\t\t\"webhook\")\n\t\t\tlocal webhook_url headers format request_method format_escaped\n\t\t\tconfig_get webhook_url \"$section\" webhook_url\n\t\t\tconfig_get headers \"$section\" webhook_headers\n\t\t\tconfig_get format \"$section\" webhook_format\n\t\t\tconfig_get request_method \"$section\" webhook_request_method\n\t\t\t\n\t\t\t[ -z \"$webhook_url\" ] && {\n\t\t\t\techo \"Error: Webhook requires webhook_url\"\n\t\t\t\treturn 1\n\t\t\t}\n\t\t\t\n\t\t\t# Escape format string for JSON using awk (safe for all special characters)\n\t\t\tif [ -n \"$format\" ]; then\n\t\t\t\tformat_escaped=$(printf '%s' \"$format\" | awk '\n\t\t\t\t{\n\t\t\t\t\tgsub(/\\\\/, \"\\\\\\\\\")\n\t\t\t\t\tgsub(/\"/, \"\\\\\\\"\")\n\t\t\t\t\tgsub(/\\t/, \"\\\\t\")\n\t\t\t\t\tgsub(/\\r/, \"\\\\r\")\n\t\t\t\t\tgsub(/\\n/, \"\\\\n\")\n\t\t\t\t\tprintf \"%s\", $0\n\t\t\t\t}\n\t\t\t\tEND {\n\t\t\t\t\tif (NR > 0) printf \"\\\\n\"\n\t\t\t\t}' | sed 's/\\\\n$//')\n\t\t\tfi\n\t\t\t\n\t\t\tif [ -n \"$headers\" ]; then\n\t\t\t\tconfig_json=\"{\\\"webhook_url\\\":\\\"$webhook_url\\\",\\\"headers\\\":\\\"$headers\\\",\\\"format\\\":\\\"$format_escaped\\\",\\\"request_method\\\":\\\"$request_method\\\"}\"\n\t\t\telse\n\t\t\t\tconfig_json=\"{\\\"webhook_url\\\":\\\"$webhook_url\\\",\\\"format\\\":\\\"$format_escaped\\\",\\\"request_method\\\":\\\"$request_method\\\"}\"\n\t\t\tfi\n\t\t\t;;\n\t\t\t\n\t\t\"serverchan\")\n\t\t\tlocal token channel noip openid\n\t\t\tconfig_get token \"$section\" serverchan_token\n\t\t\tconfig_get channel \"$section\" serverchan_channel\n\t\t\tconfig_get noip \"$section\" serverchan_noip\n\t\t\tconfig_get openid \"$section\" serverchan_openid\n\t\t\t\n\t\t\t[ -z \"$token\" ] && {\n\t\t\t\techo \"Error: ServerChan requires token\"\n\t\t\t\treturn 1\n\t\t\t}\n\t\t\t\n\t\t\tconfig_json=\"{\\\"token\\\":\\\"$token\\\"\"\n\t\t\t[ -n \"$channel\" ] && config_json=\"$config_json,\\\"channel\\\":\\\"$channel\\\"\"\n\t\t\t[ \"$noip\" = \"1\" ] && config_json=\"$config_json,\\\"noip\\\":\\\"1\\\"\"\n\t\t\t[ -n \"$openid\" ] && config_json=\"$config_json,\\\"openid\\\":\\\"$openid\\\"\"\n\t\t\tconfig_json=\"$config_json}\"\n\t\t\t;;\n\t\t\t\n\t\t\"pushdeer\")\n\t\t\tlocal push_key endpoint\n\t\t\tconfig_get push_key \"$section\" pushdeer_push_key\n\t\t\tconfig_get endpoint \"$section\" pushdeer_endpoint\n\t\t\t\n\t\t\t[ -z \"$push_key\" ] && {\n\t\t\t\techo \"Error: PushDeer requires push_key\"\n\t\t\t\treturn 1\n\t\t\t}\n\t\t\t\n\t\t\tconfig_json=\"{\\\"push_key\\\":\\\"$push_key\\\"\"\n\t\t\t[ -n \"$endpoint\" ] && config_json=\"$config_json,\\\"endpoint\\\":\\\"$endpoint\\\"\"\n\t\t\tconfig_json=\"$config_json}\"\n\t\t\t;;\n\t\t\"feishu\")\n\t\t\tlocal webhook_key\n\t\t\tconfig_get webhook_key \"$section\" feishu_webhook_key\n\t\t\t\n\t\t\t[ -z \"$webhook_key\" ] && {\n\t\t\t\techo \"Error: Feishu requires webhook_key\"\n\t\t\t\treturn 1\n\t\t\t}\n\t\t\t\n\t\t\tconfig_json=\"{\\\"webhook_key\\\":\\\"$webhook_key\\\"}\"\n\t\t\t;;\n\t\t\"custom_script\")\n\t\t\tlocal script_path\n\t\t\tconfig_get script_path \"$section\" custom_script_path\n\t\t\t\n\t\t\t[ -z \"$script_path\" ] && {\n\t\t\t\techo \"Error: Custom script requires script_path\"\n\t\t\t\treturn 1\n\t\t\t}\n\t\t\t\n\t\t\tconfig_json=\"{\\\"script_path\\\":\\\"$script_path\\\"}\"\n\t\t\t;;\n\t\t\t\n\t\t*)\n\t\t\techo \"Error: Unknown API type: $api_type\"\n\t\t\treturn 1\n\t\t\t;;\n\tesac\n\t\n\techo \"$config_json\"\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"sms_daemon\"\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder/files/usr/bin/sms_forward_custom_example.sh",
    "content": "#!/bin/sh\n\n# Example Custom SMS Forward Script\n# This is a template script that can be customized for specific needs\n#\n# Environment variables available:\n# SMS_SENDER - sender phone number\n# SMS_TIME - timestamp string  \n# SMS_CONTENT - SMS content\n\n# Log the SMS to a file\nLOG_FILE=\"/tmp/sms_log.txt\"\necho \"$(date): SMS from $SMS_SENDER: $SMS_CONTENT\" >> \"$LOG_FILE\"\n\n# Send a notification to system log\nlogger -t sms_forwarder \"New SMS from $SMS_SENDER: $SMS_CONTENT\"\n\n# Example: Forward to email using sendmail (if available)\nif command -v sendmail >/dev/null 2>&1; then\n    {\n        echo \"To: admin@example.com\"\n        echo \"Subject: New SMS from $SMS_SENDER\"\n        echo \"Content-Type: text/plain; charset=UTF-8\"\n        echo \"\"\n        echo \"Time: $SMS_TIME\"\n        echo \"Sender: $SMS_SENDER\" \n        echo \"Content: $SMS_CONTENT\"\n    } | sendmail admin@example.com\nfi\n\n# Example: Write to a named pipe for other processes\nPIPE_FILE=\"/tmp/sms_pipe\"\nif [ -p \"$PIPE_FILE\" ]; then\n    echo \"$SMS_SENDER|$SMS_TIME|$SMS_CONTENT\" > \"$PIPE_FILE\"\nfi\n\n# Always return success unless there's a critical error\nexit 0\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder/files/usr/bin/sms_forward_feishu.sh",
    "content": "#!/bin/sh\n# QModem SMS → Feishu message card webhook\n# Version: 2025-11-02\n# author: XRSec <github.com/XRSec>\n\nAPI_CONFIG=\"$1\"\n# {\"webhook_key\":\"xxxxxx\"}\n\n\n# 飞书 webhook\nWEBHOOK=\"https://open.feishu.cn/open-apis/bot/v2/hook/\"\n\n# 设备 / 应用信息\nDEVICE_NAME=\"自定义\"\nAPP_NAME=\"QModem\"\nCALL_TYPE=\"SMS\"\nTITLE=\"短信通知\"\nWEBHOOK_KEY=$(echo \"$API_CONFIG\" | jq -r .webhook_key)\nWEBHOOK=\"${WEBHOOK}${WEBHOOK_KEY}\"\n\n# 从环境变量读取短信信息\nFROM=\"${SMS_SENDER:-unknown}\"\nRECEIVE_TIME=\"${SMS_TIME:-$(date '+%Y-%m-%d %H:%M:%S')}\"\nMSG=\"${SMS_CONTENT:-<empty>}\"\n\n# 限制短信长度（防止过长）\nMAX_LEN=800\nif [ \"${#MSG}\" -gt \"$MAX_LEN\" ]; then\n  MSG=\"$(printf '%s' \"$MSG\" | cut -c1-${MAX_LEN})...\"\nfi\n\n# JSON 转义\nescape_json() {\n  printf '%s' \"$1\" | sed -e 's/\\\\/\\\\\\\\/g' -e 's/\"/\\\\\"/g' -e ':a;N;$!ba;s/\\n/\\\\n/g'\n}\n\nFROM_ESC=\"$(escape_json \"$FROM\")\"\nMSG_ESC=\"$(escape_json \"$MSG\")\"\nRECEIVE_TIME_ESC=\"$(escape_json \"$RECEIVE_TIME\")\"\n\n# 构造飞书卡片 JSON\nJSON_PAYLOAD=$(cat <<EOF\n{\n  \"msg_type\": \"interactive\",\n  \"card\": {\n    \"header\": {\n      \"template\": \"blue\",\n      \"title\": {\n        \"content\": \"💬${DEVICE_NAME}\",\n        \"tag\": \"plain_text\"\n      }\n    },\n    \"elements\": [\n      {\n        \"tag\": \"div\",\n        \"fields\": [\n          {\n            \"is_short\": true,\n            \"text\": {\"tag\": \"lark_md\",\"content\": \"**🕙接收时间：** ${RECEIVE_TIME_ESC}\"}\n          },\n          {\n            \"is_short\": true,\n            \"text\": {\"tag\": \"lark_md\",\"content\": \"**📞来源号码：** ${FROM_ESC}\"}\n          }\n        ]\n      },\n      {\n        \"tag\": \"div\",\n        \"fields\": [\n          {\n            \"is_short\": true,\n            \"text\": {\"tag\": \"lark_md\",\"content\": \"**📱设备名称：** ${DEVICE_NAME}\"}\n          },\n          {\n            \"is_short\": true,\n            \"text\": {\"tag\": \"lark_md\",\"content\": \"**📲App应用名：** ${APP_NAME}\"}\n          }\n        ]\n      },\n      {\n        \"tag\": \"div\",\n        \"fields\": [\n          {\n            \"is_short\": true,\n            \"text\": {\"tag\": \"lark_md\",\"content\": \"**📞通话类型：** ${CALL_TYPE}\"}\n          },\n          {\n            \"is_short\": true,\n            \"text\": {\"tag\": \"lark_md\",\"content\": \"**📢通知标题：** ${TITLE}\"}\n          }\n        ]\n      },\n      {\n        \"tag\": \"div\",\n        \"fields\": [\n          {\n            \"is_short\": true,\n            \"text\": {\"tag\": \"lark_md\",\"content\": \"**📝通知内容：** ${MSG_ESC}\"}\n          }\n        ]\n      }\n    ]\n  }\n}\nEOF\n)\n\n# 日志输出到系统 logread\nlogger -t sms_forward \"📩 短信来自 ${FROM}，长度 ${#MSG} 字符，准备推送到飞书...\"\n\n# 简单重试机制（最多 3 次）\nRETRY=0\nMAX_RETRY=3\nwhile [ \"$RETRY\" -lt \"$MAX_RETRY\" ]; do\n  RETRY=$((RETRY + 1))\n  curl -sS -m 10 -X POST -H \"Content-Type: application/json\" \\\n    -d \"${JSON_PAYLOAD}\" \"${WEBHOOK}\" >/dev/null 2>&1\n  STATUS=$?\n\n  if [ \"$STATUS\" -eq 0 ]; then\n    logger -t sms_forward \"✅ 成功转发短信至飞书 (${FROM})\"\n    exit 0\n  else\n    logger -t sms_forward \"⚠️ 第 ${RETRY} 次发送失败 (code=${STATUS})，重试中...\"\n    sleep 3\n  fi\ndone\n\nlogger -t sms_forward \"❌ 最终发送失败 (${FROM})，放弃重试。\"\nexit 1\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder/files/usr/bin/sms_forward_pushdeer.sh",
    "content": "#!/bin/sh\n\n# PushDeer SMS Forward Script\n# Environment variables available:\n# SMS_SENDER - sender phone number\n# SMS_TIME - timestamp string\n# SMS_CONTENT - SMS content\n\n# Parse API config from environment or config file\nAPI_CONFIG=\"$1\"\n\nif [ -z \"$API_CONFIG\" ]; then\n    echo \"Error: API config not provided\"\n    exit 1\nfi\n\n# Extract configuration using jq or manual parsing\nPUSH_KEY=$(echo \"$API_CONFIG\" | jq -r '.push_key' 2>/dev/null)\nENDPOINT=$(echo \"$API_CONFIG\" | jq -r '.endpoint' 2>/dev/null)\n\n# Handle null values from jq\nif [ \"$PUSH_KEY\" = \"null\" ] || [ -z \"$PUSH_KEY\" ]; then\n    echo \"Error: Missing required PushDeer push_key\"\n    exit 1\nfi\n\n# Handle null value for endpoint\nif [ \"$ENDPOINT\" = \"null\" ]; then\n    ENDPOINT=\"\"\nfi\n\n# Set default endpoint if not provided\nif [ -z \"$ENDPOINT\" ]; then\n    ENDPOINT=\"https://api2.pushdeer.com\"\nfi\n\n# Build API URL\nAPI_URL=\"${ENDPOINT}/message/push\"\n\n# Prepare message content\nTEXT=\"QModem SMS: ($SMS_SENDER)\n\nTime: $SMS_TIME\nContent: $SMS_CONTENT\"\n\n# URL encode function for GET method\nurl_encode() {\n    echo \"$1\" | sed 's/ /%20/g; s/\\n/%0A/g; s/&/%26/g; s/?/%3F/g; s/#/%23/g; s/=/%3D/g; s/+/%2B/g; s/@/%40/g; s/!/%21/g; s/\\*/%2A/g; s/'\\''/%27/g; s/(/%28/g; s/)/%29/g; s/;/%3B/g; s/:/%3A/g; s/,/%2C/g; s/\\$/%24/g; s/\\[/%5B/g; s/\\]/%5D/g; s/{/%7B/g; s/}/%7D/g; s/|/%7C/g; s/\\\\/%5C/g; s/\\^/%5E/g; s/`/%60/g; s/\"/%22/g; s/</%3C/g; s/>/%3E/g; s/~/%7E/g'\n}\n\n# URL encode the text\nTEXT_ENCODED=$(url_encode \"$TEXT\")\n\n# Try curl first, then wget\nif command -v curl >/dev/null 2>&1; then\n    curl -X POST \"$API_URL\" \\\n        -d \"pushkey=$PUSH_KEY\" \\\n        -d \"text=$TEXT_ENCODED\" \\\n        -d \"type=text\" \\\n        --connect-timeout 10 \\\n        --max-time 30\nelif command -v wget >/dev/null 2>&1; then\n    # Create temporary file for POST data\n    TEMP_FILE=$(mktemp)\n    echo \"pushkey=$PUSH_KEY&text=$TEXT_ENCODED&type=text\" > \"$TEMP_FILE\"\n    \n    wget -O- \\\n        --post-file=\"$TEMP_FILE\" \\\n        --header=\"Content-Type: application/x-www-form-urlencoded\" \\\n        --timeout=30 \\\n        \"$API_URL\"\n    \n    rm -f \"$TEMP_FILE\"\nelse\n    echo \"Error: Neither curl nor wget available\"\n    exit 1\nfi\n\nexit $?\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder/files/usr/bin/sms_forward_serverchan.sh",
    "content": "#!/bin/sh\n\n# ServerChan SMS Forward Script (New API)\n# Environment variables available:\n# SMS_SENDER - sender phone number\n# SMS_TIME - timestamp string\n# SMS_CONTENT - SMS content\n\n# Parse API config from environment or config file\nAPI_CONFIG=\"$1\"\n\nif [ -z \"$API_CONFIG\" ]; then\n    echo \"Error: API config not provided\"\n    exit 1\nfi\n\n# Extract configuration using jq or manual parsing\nTOKEN=$(echo \"$API_CONFIG\" | jq -r '.token' 2>/dev/null)\nCHANNEL=$(echo \"$API_CONFIG\" | jq -r '.channel' 2>/dev/null)\nNOIP=$(echo \"$API_CONFIG\" | jq -r '.noip' 2>/dev/null)\nOPENID=$(echo \"$API_CONFIG\" | jq -r '.openid' 2>/dev/null)\n\nif [ -z \"$TOKEN\" ]; then\n    echo \"Error: Missing required ServerChan token\"\n    exit 1\nfi\n\n# Build API URL with token\nAPI_URL=\"https://sctapi.ftqq.com/${TOKEN}.send\"\n\n# Prepare message content\nTITLE=\"QModem SMS: ($SMS_SENDER)\"\nDESP=\"**Time:** $SMS_TIME\n\n**Sender:** $SMS_SENDER\n\n**Content:** \n$SMS_CONTENT\"\n\n# URL encode function for GET method\nurl_encode() {\n    echo \"$1\" | sed 's/ /%20/g;s/!/%21/g;s/\"/%22/g;s/#/%23/g;s/\\$/%24/g;s/&/%26/g;s/'\\''/%27/g;s/(/%28/g;s/)/%29/g;s/\\*/%2A/g;s/+/%2B/g;s/,/%2C/g;s/-/%2D/g;s/\\./%2E/g;s/\\//%2F/g;s/:/%3A/g;s/;/%3B/g;s/</%3C/g;s/=/%3D/g;s/>/%3E/g;s/?/%3F/g;s/@/%40/g;s/\\[/%5B/g;s/\\\\/%5C/g;s/\\]/%5D/g;s/\\^/%5E/g;s/_/%5F/g;s/`/%60/g;s/{/%7B/g;s/|/%7C/g;s/}/%7D/g;s/~/%7E/g'\n}\n\n# Try curl first, then wget\nif command -v curl >/dev/null 2>&1; then\n    #使用jq生成JSON_DATA\n    JSON_DATA=`\n    jq -n --arg title \"$TITLE\" --arg desp \"$DESP\" '\n        {\n            title: $title,\n            desp: $desp\n        }'`\n    [ -n \"$CHANNEL\" ] && JSON_DATA=$(echo \"$JSON_DATA\" | jq --arg channel \"$CHANNEL\" '. + {channel: $channel}')\n    [ -n \"$NOIP\" ] && JSON_DATA=$(echo \"$JSON_DATA\" | jq --arg noip \"$NOIP\" '. + {noip: $noip}')\n    [ -n \"$OPENID\" ] && JSON_DATA=$(echo \"$JSON_DATA\" | jq --arg openid \"$OPENID\" '. + {openid: $openid}')\n\n\n    curl -X POST \"$API_URL\" \\\n        -H \"Content-Type: application/json;charset=utf-8\" \\\n        -d \"$JSON_DATA\" \\\n        --connect-timeout 10 \\\n        --max-time 30\nelif command -v wget >/dev/null 2>&1; then\n    # Use GET method with URL encoding for wget\n    ENCODED_TITLE=$(url_encode \"$TITLE\")\n    ENCODED_DESP=$(url_encode \"$DESP\")\n    \n    # Build query string\n    QUERY=\"title=$ENCODED_TITLE&desp=$ENCODED_DESP\"\n    [ -n \"$CHANNEL\" ] && QUERY=\"${QUERY}&channel=$CHANNEL\"\n    [ -n \"$NOIP\" ] && QUERY=\"${QUERY}&noip=$NOIP\"\n    [ -n \"$OPENID\" ] && QUERY=\"${QUERY}&openid=$(url_encode \"$OPENID\")\"\n    \n    wget -O- \\\n        --timeout=30 \\\n        \"${API_URL}?${QUERY}\"\nelse\n    echo \"Error: Neither curl nor wget available\"\n    exit 1\nfi\n\nexit $?\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder/files/usr/bin/sms_forward_tgbot.sh",
    "content": "#!/bin/sh\n\n# Telegram Bot SMS Forward Script\n# Environment variables available:\n# SMS_SENDER - sender phone number\n# SMS_TIME - timestamp string\n# SMS_CONTENT - SMS content\n\n# Parse API config from environment or config file\nAPI_CONFIG=\"$1\"\n\nif [ -z \"$API_CONFIG\" ]; then\n    echo \"Error: API config not provided\"\n    exit 1\nfi\n\n# Extract configuration using jq or manual parsing\nBOT_TOKEN=$(echo \"$API_CONFIG\" | jq -r '.bot_token' 2>/dev/null)\nCHAT_ID=$(echo \"$API_CONFIG\" | jq -r '.chat_id' 2>/dev/null)\n\n# Fallback to manual parsing if jq fails\nif [ -z \"$BOT_TOKEN\" ] || [ \"$BOT_TOKEN\" = \"null\" ]; then\n    BOT_TOKEN=$(echo \"$API_CONFIG\" | grep -o '\"bot_token\":\"[^\"]*\"' | cut -d'\"' -f4)\nfi\n\nif [ -z \"$CHAT_ID\" ] || [ \"$CHAT_ID\" = \"null\" ]; then\n    CHAT_ID=$(echo \"$API_CONFIG\" | grep -o '\"chat_id\":\"[^\"]*\"' | cut -d'\"' -f4)\nfi\n\nif [ -z \"$BOT_TOKEN\" ] || [ -z \"$CHAT_ID\" ]; then\n    echo \"Error: Missing required Telegram Bot configuration\"\n    exit 1\nfi\n\n# Prepare message\nMESSAGE=\"QModem SMS: ($SMS_SENDER)\n\n🕒 Time: $SMS_TIME\n💬 Content: $SMS_CONTENT\"\n\n# URL encode the message\nMESSAGE_ENCODED=$(echo \"$MESSAGE\" | sed 's/ /%20/g; s/\\n/%0A/g; s/📱/%F0%9F%93%B1/g; s/📞/%F0%9F%93%9E/g; s/🕒/%F0%9F%95%92/g; s/💬/%F0%9F%92%AC/g')\n\n# Telegram API URL\nTG_URL=\"https://api.telegram.org/bot$BOT_TOKEN/sendMessage\"\n\n# Try curl first, then wget\nif command -v curl >/dev/null 2>&1; then\n    # Use jq to generate JSON payload\n    if command -v jq >/dev/null 2>&1; then\n        JSON_PAYLOAD=$(jq -n \\\n            --arg chat_id \"$CHAT_ID\" \\\n            --arg text \"$MESSAGE\" \\\n            --arg parse_mode \"HTML\" \\\n            '{\n                chat_id: $chat_id,\n                text: $text,\n                parse_mode: $parse_mode\n            }')\n        \n        curl -X POST \"$TG_URL\" \\\n            -H \"Content-Type: application/json\" \\\n            -d \"$JSON_PAYLOAD\" \\\n            --connect-timeout 10 \\\n            --max-time 30\n    else\n        # Fallback to form data if jq not available\n        curl -X POST \"$TG_URL\" \\\n            -d \"chat_id=$CHAT_ID\" \\\n            -d \"text=$MESSAGE_ENCODED\" \\\n            -d \"parse_mode=HTML\" \\\n            --connect-timeout 10 \\\n            --max-time 30\n    fi\nelif command -v wget >/dev/null 2>&1; then\n    wget -O- \\\n        --post-data=\"chat_id=$CHAT_ID&text=$MESSAGE_ENCODED&parse_mode=HTML\" \\\n        --timeout=30 \\\n        \"$TG_URL\"\nelse\n    echo \"Error: Neither curl nor wget available\"\n    exit 1\nfi\n\nexit $?\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder/files/usr/bin/sms_forward_webhook.sh",
    "content": "#!/bin/sh\n\n# Webhook SMS Forward Script\n# Environment variables available:\n# SMS_SENDER - sender phone number\n# SMS_TIME - timestamp string\n# SMS_CONTENT - SMS content\n\n# Parse API config from environment or config file\nAPI_CONFIG=\"$1\"\n\nif [ -z \"$API_CONFIG\" ]; then\n    echo \"Error: API config not provided\"\n    exit 1\nfi\n\n# Extract configuration using jq or manual parsing\nWEBHOOK_URL=$(echo \"$API_CONFIG\" | jq -r '.webhook_url' 2>/dev/null)\nHEADERS=$(echo \"$API_CONFIG\" | jq -r '.headers' 2>/dev/null)\nFORMAT=$(echo \"$API_CONFIG\" | jq -r '.format' 2>/dev/null)\nREQUEST_METHOD=$(echo \"$API_CONFIG\" | jq -r '.request_method' 2>/dev/null)\necho \"$API_CONFIG\" | jq\n# Fallback to manual parsing if jq fails\nif [ -z \"$WEBHOOK_URL\" ] || [ \"$WEBHOOK_URL\" = \"null\" ]; then\n    WEBHOOK_URL=$(echo \"$API_CONFIG\" | grep -o '\"webhook_url\":\"[^\"]*\"' | cut -d'\"' -f4)\nfi\n\nif [ -z \"$HEADERS\" ] || [ \"$HEADERS\" = \"null\" ]; then\n    HEADERS=$(echo \"$API_CONFIG\" | grep -o '\"headers\":\"[^\"]*\"' | cut -d'\"' -f4)\nfi\n\nif [ -z \"$WEBHOOK_URL\" ]; then\n    echo \"Error: Missing required webhook URL\"\n    exit 1\nfi\n\n# Prepare payload based on format\nif [ -z \"$FORMAT\" ] || [ \"$FORMAT\" = \"null\" ];then\n    payload=\"$SMS_SENDER/$SMS_CONTENT($SMS_TIME)\"\nelse\n    # Safe placeholder replacement using awk (handles all special characters)\n    payload=$(printf '%s' \"$FORMAT\" | awk -v sender=\"$SMS_SENDER\" -v time=\"$SMS_TIME\" -v content=\"$SMS_CONTENT\" '\n    {\n        gsub(/\\{SENDER\\}/, sender)\n        gsub(/\\{TIME\\}/, time)\n        gsub(/\\{CONTENT\\}/, content)\n        print\n    }')\n    \n    WEBHOOK_URL=$(printf '%s' \"$WEBHOOK_URL\" | awk -v sender=\"$SMS_SENDER\" -v time=\"$SMS_TIME\" -v content=\"$SMS_CONTENT\" '\n    {\n        gsub(/\\{SENDER\\}/, sender)\n        gsub(/\\{TIME\\}/, time)\n        gsub(/\\{CONTENT\\}/, content)\n        print\n    }')\nfi\n\n# Prepare curl command\nif [ -z \"$REQUEST_METHOD\" ] || [ \"$REQUEST_METHOD\" = \"null\" ]; then\n    REQUEST_METHOD=\"GET\"\nfi\n\n\nif [ \"$REQUEST_METHOD\" = \"POST\" ]; then\n    # Build curl arguments array-style for proper quoting\n    if [ -n \"$HEADERS\" ]; then\n        curl -X POST \"$WEBHOOK_URL\" -d \"$payload\" -H \"Content-Type: application/json\" -H \"$HEADERS\"\n    else\n        curl -X POST \"$WEBHOOK_URL\" -d \"$payload\" -H \"Content-Type: application/json\"\n    fi\nelse\n    # URL-encode payload for GET request\n    # Use jq for reliable URL encoding\n    encoded_payload=$(printf '%s' \"$payload\" | jq -sRr @uri)\n    full_url=\"${WEBHOOK_URL}/${encoded_payload}\"\n    \n    if [ -n \"$HEADERS\" ]; then\n        curl \"$full_url\" -H \"$HEADERS\"\n    else\n        curl \"$full_url\"\n    fi\nfi\n\nexit $?\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder/src/Makefile",
    "content": "CC ?= gcc\nCFLAGS += -Wall -std=c99\nLDFLAGS += -ljson-c\n\nTARGET = sms_forwarder\nSOURCES = main.c\nLDFLAGS = -L$(TARGET_DIR)/usr/lib\nLDFLAGS += -L$(TARGET_DIR)/lib\nLDFLAGS += -ljson-c\n\nall: $(TARGET)\n\n$(TARGET): $(SOURCES)\n\t$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)\n\ndebug_test: debug_test.c\n\t$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)\n\nclean:\n\trm -f $(TARGET) debug_test\n\n.PHONY: all clean\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder/src/Makefile.local",
    "content": "# Cross-compile setup for ImmortalWrt\nSTAGING_DIR ?= $(HOME)/qwrt_works/immortalwrt/staging_dir\nTARGET_DIR ?= $(STAGING_DIR)/target-aarch64_generic_musl\nTOOLCHAIN_DIR ?= $(STAGING_DIR)/toolchain-aarch64_generic_gcc-13.3.0_musl\n\n# Cross-compiler and tools\nCROSS_COMPILE ?= aarch64-openwrt-linux-musl-\nCC = $(TOOLCHAIN_DIR)/bin/$(CROSS_COMPILE)gcc\nAR = $(TOOLCHAIN_DIR)/bin/$(CROSS_COMPILE)ar\nSTRIP = $(TOOLCHAIN_DIR)/bin/$(CROSS_COMPILE)strip\n\n# Include and library paths\nCFLAGS = -Wall -Wextra -std=c99 -D_GNU_SOURCE\nCFLAGS += -I$(TARGET_DIR)/usr/include\nCFLAGS += -I$(TARGET_DIR)/usr/include/libubox\nCFLAGS += -I$(TARGET_DIR)/usr/include/json-c\n\nCC ?= gcc\nCFLAGS += -Wall -std=c99\nLDFLAGS += -ljson-c\n\nTARGET = sms_forwarder\nSOURCES = main.c\nLDFLAGS = -L$(TARGET_DIR)/usr/lib\nLDFLAGS += -L$(TARGET_DIR)/lib\nLDFLAGS += -ljson-c\n\nall: $(TARGET)\n\n$(TARGET): $(SOURCES)\n\t$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)\n\ndebug_test: debug_test.c\n\t$(CC) $(CFLAGS) -o $@ $^ $(LDFLAGS)\n\nclean:\n\trm -f $(TARGET) debug_test\n\n.PHONY: all clean\n\ninstall:\n\tscp /home/fjr/hobbies/modem_feeds/application/sms_forwarder/files/etc/init.d/sms_forwarder root@192.168.1.1:/etc/init.d/sms_forwarder\n\tssh root@192.168.1.1 \"/etc/init.d/sms_forwarder stop\"\n\tscp sms_forwarder root@192.168.1.1:/usr/bin/sms_forwarder\n\tssh root@192.168.1.1 \"/etc/init.d/sms_forwarder start\"\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder/src/main.c",
    "content": "#define _GNU_SOURCE\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n#include <signal.h>\n#include <sys/wait.h>\n#include <sys/stat.h>\n#include <time.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <syslog.h>\n#include <json-c/json.h>\n#include \"sms_forwarder.h\"\n\nstatic volatile int g_running = 1;\nstatic sms_forwarder_config_t g_config;\n\nstatic void signal_handler(int sig) {\n    switch (sig) {\n        case SIGTERM:\n        case SIGINT:\n            syslog(LOG_INFO, \"Received signal %d, shutting down\", sig);\n            g_running = 0;\n            break;\n        case SIGCHLD:\n            wait(NULL);\n            break;\n    }\n}\n\nstatic void setup_signals() {\n    signal(SIGTERM, signal_handler);\n    signal(SIGINT, signal_handler);\n    signal(SIGCHLD, signal_handler);\n    signal(SIGPIPE, SIG_IGN);\n}\n\nstatic int parse_config_file(const char *config_file, sms_forwarder_config_t *config) {\n    FILE *fp = fopen(config_file, \"r\");\n    if (!fp) {\n        syslog(LOG_ERR, \"Cannot open config file: %s\", config_file);\n        return -1;\n    }\n\n    fseek(fp, 0, SEEK_END);\n    long size = ftell(fp);\n    fseek(fp, 0, SEEK_SET);\n\n    char *json_string = malloc(size + 1);\n    if (!json_string) {\n        fclose(fp);\n        syslog(LOG_ERR, \"Memory allocation failed\");\n        return -1;\n    }\n    \n    fread(json_string, 1, size, fp);\n    json_string[size] = '\\0';\n    fclose(fp);\n\n    json_object *root = json_tokener_parse(json_string);\n    free(json_string);\n\n    if (!root) {\n        syslog(LOG_ERR, \"Invalid JSON in config file\");\n        return -1;\n    }\n\n    // Initialize config structure\n    memset(config, 0, sizeof(sms_forwarder_config_t));\n\n    // Check if root is an array (new format) or object (old format)\n    if (json_object_is_type(root, json_type_array)) {\n        // New format: array of modem configurations\n        int array_len = json_object_array_length(root);\n        config->modem_count = (array_len > MAX_API_COUNT) ? MAX_API_COUNT : array_len;\n        \n        for (int i = 0; i < config->modem_count; i++) {\n            json_object *modem_obj = json_object_array_get_idx(root, i);\n            if (!modem_obj) continue;\n            \n            // Set defaults\n            config->modems[i].poll_interval = 30;\n            config->modems[i].delete_after_forward = 0;\n            config->modems[i].api_count = 0;\n            \n            // Parse modem_port\n            json_object *obj;\n            const char *str_val;\n            \n            if (json_object_object_get_ex(modem_obj, \"modem_port\", &obj)) {\n                str_val = json_object_get_string(obj);\n                if (str_val) {\n                    strncpy(config->modems[i].modem_port, str_val, sizeof(config->modems[i].modem_port) - 1);\n                    config->modems[i].modem_port[sizeof(config->modems[i].modem_port) - 1] = '\\0';\n                }\n            }\n            \n            if (json_object_object_get_ex(modem_obj, \"poll_interval\", &obj)) {\n                config->modems[i].poll_interval = json_object_get_int(obj);\n            }\n            \n            if (json_object_object_get_ex(modem_obj, \"delete_after_forward\", &obj)) {\n                config->modems[i].delete_after_forward = json_object_get_boolean(obj);\n            }\n            \n            // Parse apis array\n            json_object *apis_array;\n            if (json_object_object_get_ex(modem_obj, \"apis\", &apis_array) && json_object_is_type(apis_array, json_type_array)) {\n                int api_array_len = json_object_array_length(apis_array);\n                config->modems[i].api_count = (api_array_len > MAX_API_COUNT) ? MAX_API_COUNT : api_array_len;\n                \n                for (int j = 0; j < config->modems[i].api_count; j++) {\n                    json_object *api_obj = json_object_array_get_idx(apis_array, j);\n                    if (!api_obj) continue;\n                    \n                    if (json_object_object_get_ex(api_obj, \"api_type\", &obj)) {\n                        str_val = json_object_get_string(obj);\n                        if (str_val) {\n                            strncpy(config->modems[i].apis[j].api_type, str_val, sizeof(config->modems[i].apis[j].api_type) - 1);\n                            config->modems[i].apis[j].api_type[sizeof(config->modems[i].apis[j].api_type) - 1] = '\\0';\n                        }\n                    }\n                    \n                    if (json_object_object_get_ex(api_obj, \"api_config\", &obj)) {\n                        const char *api_config_str = json_object_to_json_string(obj);\n                        if (api_config_str) {\n                            strncpy(config->modems[i].apis[j].api_config, api_config_str, sizeof(config->modems[i].apis[j].api_config) - 1);\n                            config->modems[i].apis[j].api_config[sizeof(config->modems[i].apis[j].api_config) - 1] = '\\0';\n                        }\n                    }\n                }\n            }\n        }\n    } else {\n        // Old format: single modem configuration - convert to new format\n        config->modem_count = 1;\n        config->modems[0].poll_interval = 30;\n        config->modems[0].delete_after_forward = 0;\n        config->modems[0].api_count = 1;\n        \n        json_object *obj;\n        const char *str_val;\n        \n        if (json_object_object_get_ex(root, \"modem_port\", &obj)) {\n            str_val = json_object_get_string(obj);\n            if (str_val) {\n                strncpy(config->modems[0].modem_port, str_val, sizeof(config->modems[0].modem_port) - 1);\n                config->modems[0].modem_port[sizeof(config->modems[0].modem_port) - 1] = '\\0';\n            }\n        }\n        \n        if (json_object_object_get_ex(root, \"poll_interval\", &obj)) {\n            config->modems[0].poll_interval = json_object_get_int(obj);\n        }\n        \n        if (json_object_object_get_ex(root, \"api_type\", &obj)) {\n            str_val = json_object_get_string(obj);\n            if (str_val) {\n                strncpy(config->modems[0].apis[0].api_type, str_val, sizeof(config->modems[0].apis[0].api_type) - 1);\n                config->modems[0].apis[0].api_type[sizeof(config->modems[0].apis[0].api_type) - 1] = '\\0';\n            }\n        }\n        \n        if (json_object_object_get_ex(root, \"api_config\", &obj)) {\n            const char *api_config_str = json_object_to_json_string(obj);\n            if (api_config_str) {\n                strncpy(config->modems[0].apis[0].api_config, api_config_str, sizeof(config->modems[0].apis[0].api_config) - 1);\n                config->modems[0].apis[0].api_config[sizeof(config->modems[0].apis[0].api_config) - 1] = '\\0';\n            }\n        }\n        \n        if (json_object_object_get_ex(root, \"delete_after_forward\", &obj)) {\n            config->modems[0].delete_after_forward = json_object_get_boolean(obj);\n        }\n    }\n\n    json_object_put(root);\n    return 0;\n}\n\nstatic int check_dependencies() {\n    // Check if curl is available\n    if (system(\"which curl > /dev/null 2>&1\") == 0) {\n        return USE_CURL;\n    }\n    \n    // Check if wget is available\n    if (system(\"which wget > /dev/null 2>&1\") == 0) {\n        return USE_WGET;\n    }\n    \n    syslog(LOG_WARNING, \"Neither curl nor wget found, only custom scripts will work\");\n    return USE_NONE;\n}\n\nstatic char* read_sms_from_modem(const char *modem_port) {\n    char cmd[256];\n    snprintf(cmd, sizeof(cmd), \"tom_modem -d %s -u -o u 2>/dev/null\", modem_port);\n    \n    FILE *fp = popen(cmd, \"r\");\n    if (!fp) {\n        syslog(LOG_ERR, \"Failed to execute tom_modem command\");\n        return NULL;\n    }\n    \n    char *result = malloc(SMS_BUFFER_SIZE);\n    if (!result) {\n        pclose(fp);\n        syslog(LOG_ERR, \"Memory allocation failed\");\n        return NULL;\n    }\n    \n    size_t total_read = 0;\n    size_t bytes_read;\n    \n    while ((bytes_read = fread(result + total_read, 1, SMS_BUFFER_SIZE - total_read - 1, fp)) > 0) {\n        total_read += bytes_read;\n        if (total_read >= SMS_BUFFER_SIZE - 1) {\n            break;\n        }\n    }\n    \n    result[total_read] = '\\0';\n    pclose(fp);\n    \n    if (total_read == 0) {\n        free(result);\n        return NULL;\n    }\n    \n    return result;\n}\n\nstatic int delete_sms_from_modem(const char *modem_port, int *indices, int count) {\n    if (!indices || count <= 0) {\n        return 0;\n    }\n    \n    for (int i = 0; i < count; i++) {\n        char cmd[256];\n        snprintf(cmd, sizeof(cmd), \"tom_modem -d %s -u -o d -i %d 2>/dev/null\", \n                 modem_port, indices[i]);\n        \n        int ret = system(cmd);\n        if (ret != 0) {\n            syslog(LOG_WARNING, \"Failed to delete SMS at index %d from modem\", indices[i]);\n        } else {\n            syslog(LOG_INFO, \"Successfully deleted SMS at index %d from modem\", indices[i]);\n        }\n    }\n    \n    return 0;\n}\n\nstatic sms_message_t* parse_sms_json(const char *json_str, int *count) {\n    json_object *root = json_tokener_parse(json_str);\n    if (!root) {\n        syslog(LOG_ERR, \"Failed to parse SMS JSON\");\n        return NULL;\n    }\n    \n    json_object *msg_array;\n    if (!json_object_object_get_ex(root, \"msg\", &msg_array)) {\n        json_object_put(root);\n        return NULL;\n    }\n    \n    int array_len = json_object_array_length(msg_array);\n    if (array_len == 0) {\n        json_object_put(root);\n        *count = 0;\n        return NULL;\n    }\n    \n    sms_message_t *messages = malloc(array_len * sizeof(sms_message_t));\n    if (!messages) {\n        json_object_put(root);\n        syslog(LOG_ERR, \"Memory allocation failed for messages\");\n        *count = 0;\n        return NULL;\n    }\n    *count = array_len;\n    \n    for (int i = 0; i < array_len; i++) {\n        json_object *msg_obj = json_object_array_get_idx(msg_array, i);\n        json_object *field;\n        const char *str_val;\n        \n        memset(&messages[i], 0, sizeof(sms_message_t));\n        \n        if (json_object_object_get_ex(msg_obj, \"index\", &field)) {\n            messages[i].index = json_object_get_int(field);\n        }\n        \n        if (json_object_object_get_ex(msg_obj, \"sender\", &field)) {\n            str_val = json_object_get_string(field);\n            if (str_val) {\n                strncpy(messages[i].sender, str_val, sizeof(messages[i].sender) - 1);\n                messages[i].sender[sizeof(messages[i].sender) - 1] = '\\0';\n            }\n        }\n        \n        if (json_object_object_get_ex(msg_obj, \"timestamp\", &field)) {\n            messages[i].timestamp = json_object_get_int64(field);\n        }\n        \n        if (json_object_object_get_ex(msg_obj, \"content\", &field)) {\n            str_val = json_object_get_string(field);\n            if (str_val) {\n                strncpy(messages[i].content, str_val, sizeof(messages[i].content) - 1);\n                messages[i].content[sizeof(messages[i].content) - 1] = '\\0';\n            }\n        }\n        \n        if (json_object_object_get_ex(msg_obj, \"reference\", &field)) {\n            messages[i].reference = json_object_get_int(field);\n        }\n        \n        if (json_object_object_get_ex(msg_obj, \"total\", &field)) {\n            messages[i].total = json_object_get_int(field);\n        }\n        \n        if (json_object_object_get_ex(msg_obj, \"part\", &field)) {\n            messages[i].part = json_object_get_int(field);\n        }\n    }\n    \n    json_object_put(root);\n    return messages;\n}\n\nstatic int find_and_process_sms_groups(sms_message_t *messages, int count, processed_sms_t **processed, int *processed_count) {\n    *processed = NULL;\n    *processed_count = 0;\n    \n    if (!messages || count == 0) {\n        return 0;\n    }\n    \n    // Track which messages have been processed\n    int *processed_flags = calloc(count, sizeof(int));\n    if (!processed_flags) {\n        syslog(LOG_ERR, \"Memory allocation failed for processed flags\");\n        return -1;\n    }\n    \n    processed_sms_t *temp_processed = malloc(count * sizeof(processed_sms_t));\n    if (!temp_processed) {\n        free(processed_flags);\n        syslog(LOG_ERR, \"Memory allocation failed for processed messages\");\n        return -1;\n    }\n    \n    int temp_count = 0;\n    \n    // First, process single part messages\n    for (int i = 0; i < count; i++) {\n        if (processed_flags[i] || messages[i].total > 1) {\n            continue;\n        }\n        \n        // Single part message\n        temp_processed[temp_count].content = malloc(strlen(messages[i].content) + 1);\n        if (!temp_processed[temp_count].content) {\n            syslog(LOG_ERR, \"Memory allocation failed for single SMS content\");\n            continue;\n        }\n        strcpy(temp_processed[temp_count].content, messages[i].content);\n        strcpy(temp_processed[temp_count].sender, messages[i].sender);\n        temp_processed[temp_count].timestamp = messages[i].timestamp;\n        \n        temp_processed[temp_count].indices = malloc(sizeof(int));\n        if (temp_processed[temp_count].indices) {\n            temp_processed[temp_count].indices[0] = messages[i].index;\n            temp_processed[temp_count].index_count = 1;\n        } else {\n            temp_processed[temp_count].index_count = 0;\n        }\n        \n        processed_flags[i] = 1;\n        temp_count++;\n    }\n    \n    // Then, process multipart messages\n    for (int i = 0; i < count; i++) {\n        if (processed_flags[i] || messages[i].total <= 1) {\n            continue;\n        }\n        \n        int ref = messages[i].reference;\n        char *sender = messages[i].sender;\n        int total_parts = messages[i].total;\n        \n        // Collect all parts for this reference and sender\n        sms_message_t *parts = malloc(total_parts * sizeof(sms_message_t));\n        if (!parts) {\n            syslog(LOG_ERR, \"Memory allocation failed for SMS parts\");\n            continue;\n        }\n        \n        int found_parts = 0;\n        for (int j = 0; j < count; j++) {\n            if (processed_flags[j]) continue;\n            \n            if (messages[j].reference == ref && \n                strcmp(messages[j].sender, sender) == 0 &&\n                messages[j].total == total_parts) {\n                parts[found_parts++] = messages[j];\n            }\n        }\n        \n        if (found_parts == total_parts) {\n            // Sort parts by part number\n            for (int x = 0; x < found_parts - 1; x++) {\n                for (int y = x + 1; y < found_parts; y++) {\n                    if (parts[x].part > parts[y].part) {\n                        sms_message_t temp = parts[x];\n                        parts[x] = parts[y];\n                        parts[y] = temp;\n                    }\n                }\n            }\n            \n            // Concatenate content\n            int total_len = 0;\n            for (int k = 0; k < found_parts; k++) {\n                total_len += strlen(parts[k].content);\n            }\n            \n            temp_processed[temp_count].content = malloc(total_len + 1);\n            if (temp_processed[temp_count].content) {\n                temp_processed[temp_count].content[0] = '\\0';\n                for (int k = 0; k < found_parts; k++) {\n                    strcat(temp_processed[temp_count].content, parts[k].content);\n                }\n                \n                strcpy(temp_processed[temp_count].sender, parts[0].sender);\n                temp_processed[temp_count].timestamp = parts[0].timestamp;\n                \n                // Store indices for deletion\n                temp_processed[temp_count].indices = malloc(found_parts * sizeof(int));\n                if (temp_processed[temp_count].indices) {\n                    for (int k = 0; k < found_parts; k++) {\n                        temp_processed[temp_count].indices[k] = parts[k].index;\n                    }\n                    temp_processed[temp_count].index_count = found_parts;\n                } else {\n                    temp_processed[temp_count].index_count = 0;\n                }\n                \n                // Mark all parts as processed\n                for (int j = 0; j < count; j++) {\n                    if (messages[j].reference == ref && \n                        strcmp(messages[j].sender, sender) == 0 &&\n                        messages[j].total == total_parts) {\n                        processed_flags[j] = 1;\n                    }\n                }\n               \n                temp_count++;\n            }\n        }\n        \n        free(parts);\n    }\n    \n    free(processed_flags);\n    \n    if (temp_count > 0) {\n        *processed = temp_processed;\n        *processed_count = temp_count;\n    } else {\n        free(temp_processed);\n    }\n    \n    return 0;\n}\n\nstatic int execute_callback(const char *api_type, const char *api_config, \n                           const char *sender, time_t timestamp, const char *content) {\n    \n    char time_str[32];\n    struct tm *tm_info = localtime(&timestamp);\n    strftime(time_str, sizeof(time_str), \"%Y-%m-%d %H:%M:%S\", tm_info);\n    \n    // Set environment variables\n    setenv(\"SMS_SENDER\", sender, 1);\n    setenv(\"SMS_TIME\", time_str, 1);\n    setenv(\"SMS_CONTENT\", content, 1);\n    \n    char script_path[256];\n    char cmd[512];\n    \n    if (strcmp(api_type, \"custom_script\") == 0) {\n        json_object *config_obj = json_tokener_parse(api_config);\n        if (!config_obj) {\n            syslog(LOG_ERR, \"Invalid API config JSON\");\n            return -1;\n        }\n        \n        json_object *script_obj;\n        if (json_object_object_get_ex(config_obj, \"script_path\", &script_obj)) {\n            strncpy(script_path, json_object_get_string(script_obj), sizeof(script_path) - 1);\n        }\n        json_object_put(config_obj);\n        \n        snprintf(cmd, sizeof(cmd), \"%s\", script_path);\n    } else {\n        snprintf(script_path, sizeof(script_path), \"/usr/bin/sms_forward_%s.sh\", api_type);\n        snprintf(cmd, sizeof(cmd), \"%s '%s'\", script_path, api_config);\n    }\n    \n    // Execute script\n    int ret = system(cmd);\n    if (ret != 0) {\n        syslog(LOG_ERR, \"Failed to execute callback script: %s\", script_path);\n        return -1;\n    }\n    \n    syslog(LOG_INFO, \"SMS forwarded successfully via %s\", api_type);\n    return 0;\n}\n\nstatic void process_sms_messages(modem_config_t *modem_config) {\n    char *sms_json = read_sms_from_modem(modem_config->modem_port);\n    if (!sms_json) {\n        return;\n    }\n    \n    int count;\n    sms_message_t *messages = parse_sms_json(sms_json, &count);\n    free(sms_json);\n    \n    if (!messages || count == 0) {\n        return;\n    }\n    \n    processed_sms_t *processed = NULL;\n    int processed_count = 0;\n    \n    if (find_and_process_sms_groups(messages, count, &processed, &processed_count) == 0 && processed) {\n        // Process all SMS messages\n        for (int i = 0; i < processed_count; i++) {\n            int success_count = 0;\n            \n            // Try to forward through all configured APIs\n            for (int j = 0; j < modem_config->api_count; j++) {\n                int ret = execute_callback(modem_config->apis[j].api_type, modem_config->apis[j].api_config,\n                                processed[i].sender, processed[i].timestamp, processed[i].content);\n                if (ret == 0) {\n                    success_count++;\n                }\n            }\n            \n            // Delete SMS messages if at least one forwarding was successful and delete option is enabled\n            if (success_count > 0 && modem_config->delete_after_forward && processed[i].indices) {\n                delete_sms_from_modem(modem_config->modem_port, processed[i].indices, processed[i].index_count);\n            }\n            \n            // Cleanup\n            if (processed[i].content) {\n                free(processed[i].content);\n            }\n            if (processed[i].indices) {\n                free(processed[i].indices);\n            }\n        }\n        \n        free(processed);\n    }\n    \n    free(messages);\n}\n\nint main(int argc, char *argv[]) {\n    printf(\"SMS Forwarder starting...\\n\");\n    fflush(stdout);\n    \n    if (argc != 2) {\n        fprintf(stderr, \"Usage: %s <config_file>\\n\", argv[0]);\n        return 1;\n    }\n    \n    printf(\"Opening syslog...\\n\");\n    fflush(stdout);\n    openlog(\"sms_forwarder\", LOG_PID, LOG_DAEMON);\n    \n    printf(\"Parsing config file: %s\\n\", argv[1]);\n    fflush(stdout);\n    \n    // Parse configuration\n    if (parse_config_file(argv[1], &g_config) < 0) {\n        syslog(LOG_ERR, \"Failed to parse config file: %s\", argv[1]);\n        printf(\"Failed to parse config file\\n\");\n        return 1;\n    }\n    \n    printf(\"Config parsed successfully\\n\");\n    printf(\"Found %d modem(s) to monitor:\\n\", g_config.modem_count);\n    for (int i = 0; i < g_config.modem_count; i++) {\n        printf(\"  Modem %d: %s (poll: %ds, APIs: %d, delete: %s)\\n\", \n               i + 1, g_config.modems[i].modem_port, g_config.modems[i].poll_interval,\n               g_config.modems[i].api_count, g_config.modems[i].delete_after_forward ? \"yes\" : \"no\");\n        for (int j = 0; j < g_config.modems[i].api_count; j++) {\n            printf(\"    API %d: %s\\n\", j + 1, g_config.modems[i].apis[j].api_type);\n        }\n    }\n    fflush(stdout);\n    \n    // Check dependencies\n    printf(\"Checking dependencies...\\n\");\n    fflush(stdout);\n    check_dependencies();\n    \n    // Setup signal handlers\n    printf(\"Setting up signal handlers...\\n\");\n    fflush(stdout);\n    setup_signals();\n    \n    syslog(LOG_INFO, \"SMS Forwarder started with config: %s, monitoring %d modems\", argv[1], g_config.modem_count);\n    printf(\"Entering main loop...\\n\");\n    fflush(stdout);\n    \n    // Main loop\n    while (g_running) {\n        for (int i = 0; i < g_config.modem_count; i++) {\n            process_sms_messages(&g_config.modems[i]);\n        }\n        \n        // Find the minimum poll interval among all modems\n        int min_poll_interval = g_config.modems[0].poll_interval;\n        for (int i = 1; i < g_config.modem_count; i++) {\n            if (g_config.modems[i].poll_interval < min_poll_interval) {\n                min_poll_interval = g_config.modems[i].poll_interval;\n            }\n        }\n        \n        fflush(stdout);\n        sleep(min_poll_interval);\n    }\n    \n    syslog(LOG_INFO, \"SMS Forwarder stopped\");\n    closelog();\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder/src/sms_forwarder.h",
    "content": "#ifndef SMS_FORWARDER_H\n#define SMS_FORWARDER_H\n\n#include <time.h>\n\n#define SMS_BUFFER_SIZE 65536\n#define MAX_PATH_LEN 256\n#define MAX_CONFIG_LEN 1024\n#define MAX_CONTENT_LEN 512\n#define MAX_SENDER_LEN 64\n#define MAX_API_COUNT 10\n\n#define USE_CURL 1\n#define USE_WGET 2\n#define USE_NONE 0\n\ntypedef struct {\n    char api_type[64];\n    char api_config[MAX_CONFIG_LEN];\n} api_config_t;\n\ntypedef struct {\n    char modem_port[MAX_PATH_LEN];\n    int poll_interval;\n    api_config_t apis[MAX_API_COUNT];\n    int api_count;\n    int delete_after_forward;\n} modem_config_t;\n\ntypedef struct {\n    modem_config_t modems[MAX_API_COUNT];\n    int modem_count;\n} sms_forwarder_config_t;\n\ntypedef struct {\n    int index;\n    char sender[MAX_SENDER_LEN];\n    time_t timestamp;\n    char content[MAX_CONTENT_LEN];\n    int reference;\n    int total;\n    int part;\n} sms_message_t;\n\ntypedef struct {\n    char *content;\n    char sender[MAX_SENDER_LEN];\n    time_t timestamp;\n    int *indices;\n    int index_count;\n} processed_sms_t;\n\n#endif\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder_next/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\n# Include unified version\ninclude ../../version.mk\n\nPKG_NAME:=sms-forwarder-next\nPKG_RELEASE:=$(QMODEM_RELEASE)\nPKG_VERSION:=$(QMODEM_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n  SECTION:=utils\n  CATEGORY:=Utilities\n  TITLE:=SMS Forward Service\n  DEPENDS:=+tom_modem +jq +curl +ucode +ucode-mod-ubus +ucode-mod-uci\nendef\n\ndefine Package/$(PKG_NAME)/description\n  SMS forward service for QModem that supports multiple forwarding methods:\n  - Telegram Bot\n  - ServerChan\n  - Generic Webhook\n  - Custom Script\nendef\n\n\ndefine Build/Compile\nendef\n\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) ./files/sms_forwarder_next $(1)/usr/bin/\n\t$(INSTALL_DIR) $(1)/usr/share/sms_forwarder\n\t$(INSTALL_BIN) ./files/scripts/sms_forward_*.sh $(1)/usr/share/sms_forwarder/\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_BIN) ./files/sms_forwarder.init $(1)/etc/init.d/sms_forwarder\n\t$(INSTALL_DIR) $(1)/etc/config\n\t$(INSTALL_CONF) ./files/sms_forwarder.example $(1)/etc/config/sms_forwarder\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/sms_forwarder\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder_next/files/scripts/sms_forward_custom_example.sh",
    "content": "#!/bin/sh\n\n# Example Custom SMS Forward Script\n# This is a template script that can be customized for specific needs\n#\n# Environment variables available:\n# SMS_SENDER - sender phone number\n# SMS_TIME - timestamp string  \n# SMS_CONTENT - SMS content\n\n# Log the SMS to a file\nLOG_FILE=\"/tmp/sms_log.txt\"\necho \"$(date): SMS from $SMS_SENDER: $SMS_CONTENT\" >> \"$LOG_FILE\"\n\n# Send a notification to system log\nlogger -t sms_forwarder \"New SMS from $SMS_SENDER: $SMS_CONTENT\"\n\n# Example: Forward to email using sendmail (if available)\nif command -v sendmail >/dev/null 2>&1; then\n    {\n        echo \"To: admin@example.com\"\n        echo \"Subject: New SMS from $SMS_SENDER\"\n        echo \"Content-Type: text/plain; charset=UTF-8\"\n        echo \"\"\n        echo \"Time: $SMS_TIME\"\n        echo \"Sender: $SMS_SENDER\" \n        echo \"Content: $SMS_CONTENT\"\n    } | sendmail admin@example.com\nfi\n\n# Example: Write to a named pipe for other processes\nPIPE_FILE=\"/tmp/sms_pipe\"\nif [ -p \"$PIPE_FILE\" ]; then\n    echo \"$SMS_SENDER|$SMS_TIME|$SMS_CONTENT\" > \"$PIPE_FILE\"\nfi\n\n# Always return success unless there's a critical error\nexit 0\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder_next/files/scripts/sms_forward_feishu.sh",
    "content": "#!/bin/sh\n# QModem SMS → Feishu message card webhook\n# Version: 2025-11-02\n# author: XRSec <github.com/XRSec>\n\nAPI_CONFIG=\"$1\"\n# {\"webhook_key\":\"xxxxxx\"}\n\n\n# 飞书 webhook\nWEBHOOK=\"https://open.feishu.cn/open-apis/bot/v2/hook/\"\n\n# 设备 / 应用信息\nDEVICE_NAME=\"自定义\"\nAPP_NAME=\"QModem\"\nCALL_TYPE=\"SMS\"\nTITLE=\"短信通知\"\nWEBHOOK_KEY=$(echo \"$API_CONFIG\" | jq -r .webhook_key)\nWEBHOOK=\"${WEBHOOK}${WEBHOOK_KEY}\"\n\n# 从环境变量读取短信信息\nFROM=\"${SMS_SENDER:-unknown}\"\nRECEIVE_TIME=\"${SMS_TIME:-$(date '+%Y-%m-%d %H:%M:%S')}\"\nMSG=\"${SMS_CONTENT:-<empty>}\"\n\n# 限制短信长度（防止过长）\nMAX_LEN=800\nif [ \"${#MSG}\" -gt \"$MAX_LEN\" ]; then\n  MSG=\"$(printf '%s' \"$MSG\" | cut -c1-${MAX_LEN})...\"\nfi\n\n# JSON 转义\nescape_json() {\n  printf '%s' \"$1\" | sed -e 's/\\\\/\\\\\\\\/g' -e 's/\"/\\\\\"/g' -e ':a;N;$!ba;s/\\n/\\\\n/g'\n}\n\nFROM_ESC=\"$(escape_json \"$FROM\")\"\nMSG_ESC=\"$(escape_json \"$MSG\")\"\nRECEIVE_TIME_ESC=\"$(escape_json \"$RECEIVE_TIME\")\"\n\n# 构造飞书卡片 JSON\nJSON_PAYLOAD=$(cat <<EOF\n{\n  \"msg_type\": \"interactive\",\n  \"card\": {\n    \"header\": {\n      \"template\": \"blue\",\n      \"title\": {\n        \"content\": \"💬${DEVICE_NAME}\",\n        \"tag\": \"plain_text\"\n      }\n    },\n    \"elements\": [\n      {\n        \"tag\": \"div\",\n        \"fields\": [\n          {\n            \"is_short\": true,\n            \"text\": {\"tag\": \"lark_md\",\"content\": \"**🕙接收时间：** ${RECEIVE_TIME_ESC}\"}\n          },\n          {\n            \"is_short\": true,\n            \"text\": {\"tag\": \"lark_md\",\"content\": \"**📞来源号码：** ${FROM_ESC}\"}\n          }\n        ]\n      },\n      {\n        \"tag\": \"div\",\n        \"fields\": [\n          {\n            \"is_short\": true,\n            \"text\": {\"tag\": \"lark_md\",\"content\": \"**📱设备名称：** ${DEVICE_NAME}\"}\n          },\n          {\n            \"is_short\": true,\n            \"text\": {\"tag\": \"lark_md\",\"content\": \"**📲App应用名：** ${APP_NAME}\"}\n          }\n        ]\n      },\n      {\n        \"tag\": \"div\",\n        \"fields\": [\n          {\n            \"is_short\": true,\n            \"text\": {\"tag\": \"lark_md\",\"content\": \"**📞通话类型：** ${CALL_TYPE}\"}\n          },\n          {\n            \"is_short\": true,\n            \"text\": {\"tag\": \"lark_md\",\"content\": \"**📢通知标题：** ${TITLE}\"}\n          }\n        ]\n      },\n      {\n        \"tag\": \"div\",\n        \"fields\": [\n          {\n            \"is_short\": true,\n            \"text\": {\"tag\": \"lark_md\",\"content\": \"**📝通知内容：** ${MSG_ESC}\"}\n          }\n        ]\n      }\n    ]\n  }\n}\nEOF\n)\n\n# 日志输出到系统 logread\nlogger -t sms_forward \"📩 短信来自 ${FROM}，长度 ${#MSG} 字符，准备推送到飞书...\"\n\n# 简单重试机制（最多 3 次）\nRETRY=0\nMAX_RETRY=3\nwhile [ \"$RETRY\" -lt \"$MAX_RETRY\" ]; do\n  RETRY=$((RETRY + 1))\n  curl -sS -m 10 -X POST -H \"Content-Type: application/json\" \\\n    -d \"${JSON_PAYLOAD}\" \"${WEBHOOK}\" >/dev/null 2>&1\n  STATUS=$?\n\n  if [ \"$STATUS\" -eq 0 ]; then\n    logger -t sms_forward \"✅ 成功转发短信至飞书 (${FROM})\"\n    exit 0\n  else\n    logger -t sms_forward \"⚠️ 第 ${RETRY} 次发送失败 (code=${STATUS})，重试中...\"\n    sleep 3\n  fi\ndone\n\nlogger -t sms_forward \"❌ 最终发送失败 (${FROM})，放弃重试。\"\nexit 1\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder_next/files/scripts/sms_forward_pushdeer.sh",
    "content": "#!/bin/sh\n\n# PushDeer SMS Forward Script\n# Environment variables available:\n# SMS_SENDER - sender phone number\n# SMS_TIME - timestamp string\n# SMS_CONTENT - SMS content\n\n# Parse API config from environment or config file\nAPI_CONFIG=\"$1\"\n\nif [ -z \"$API_CONFIG\" ]; then\n    echo \"Error: API config not provided\"\n    exit 1\nfi\n\n# Extract configuration using jq or manual parsing\nPUSH_KEY=$(echo \"$API_CONFIG\" | jq -r '.pushkey' 2>/dev/null)\nENDPOINT=$(echo \"$API_CONFIG\" | jq -r '.endpoint' 2>/dev/null)\n\n# Handle null values from jq\nif [ \"$PUSH_KEY\" = \"null\" ] || [ -z \"$PUSH_KEY\" ]; then\n    echo \"Error: Missing required PushDeer push_key\"\n    exit 1\nfi\n\n# Handle null value for endpoint\nif [ \"$ENDPOINT\" = \"null\" ]; then\n    ENDPOINT=\"\"\nfi\n\n# Set default endpoint if not provided\nif [ -z \"$ENDPOINT\" ]; then\n    ENDPOINT=\"https://api2.pushdeer.com\"\nfi\n\n# Build API URL\nAPI_URL=\"${ENDPOINT}/message/push\"\n\n# Prepare message content\nTEXT=\"QModem SMS: ($SMS_SENDER)\n\nTime: $SMS_TIME\nContent: $SMS_CONTENT\"\n\n# URL encode function for GET method\nurl_encode() {\n    echo \"$1\" | sed 's/ /%20/g; s/\\n/%0A/g; s/&/%26/g; s/?/%3F/g; s/#/%23/g; s/=/%3D/g; s/+/%2B/g; s/@/%40/g; s/!/%21/g; s/\\*/%2A/g; s/'\\''/%27/g; s/(/%28/g; s/)/%29/g; s/;/%3B/g; s/:/%3A/g; s/,/%2C/g; s/\\$/%24/g; s/\\[/%5B/g; s/\\]/%5D/g; s/{/%7B/g; s/}/%7D/g; s/|/%7C/g; s/\\\\/%5C/g; s/\\^/%5E/g; s/`/%60/g; s/\"/%22/g; s/</%3C/g; s/>/%3E/g; s/~/%7E/g'\n}\n\n# URL encode the text\nTEXT_ENCODED=$(url_encode \"$TEXT\")\n\n# Try curl first, then wget\nif command -v curl >/dev/null 2>&1; then\n    curl -X POST \"$API_URL\" \\\n        -d \"pushkey=$PUSH_KEY\" \\\n        -d \"text=$TEXT_ENCODED\" \\\n        -d \"type=text\" \\\n        --connect-timeout 10 \\\n        --max-time 30\nelif command -v wget >/dev/null 2>&1; then\n    # Create temporary file for POST data\n    TEMP_FILE=$(mktemp)\n    echo \"pushkey=$PUSH_KEY&text=$TEXT_ENCODED&type=text\" > \"$TEMP_FILE\"\n    \n    wget -O- \\\n        --post-file=\"$TEMP_FILE\" \\\n        --header=\"Content-Type: application/x-www-form-urlencoded\" \\\n        --timeout=30 \\\n        \"$API_URL\"\n    \n    rm -f \"$TEMP_FILE\"\nelse\n    echo \"Error: Neither curl nor wget available\"\n    exit 1\nfi\n\nexit $?\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder_next/files/scripts/sms_forward_serverchan.sh",
    "content": "#!/bin/sh\n\n# ServerChan SMS Forward Script (New API)\n# Environment variables available:\n# SMS_SENDER - sender phone number\n# SMS_TIME - timestamp string\n# SMS_CONTENT - SMS content\n\n# Parse API config from environment or config file\nAPI_CONFIG=\"$1\"\n\nif [ -z \"$API_CONFIG\" ]; then\n    echo \"Error: API config not provided\"\n    exit 1\nfi\n\n# Extract configuration using jq or manual parsing\nTOKEN=$(echo \"$API_CONFIG\" | jq -r '.token' 2>/dev/null)\nCHANNEL=$(echo \"$API_CONFIG\" | jq -r '.channel' 2>/dev/null)\nNOIP=$(echo \"$API_CONFIG\" | jq -r '.noip' 2>/dev/null)\nOPENID=$(echo \"$API_CONFIG\" | jq -r '.openid' 2>/dev/null)\n\nif [ -z \"$TOKEN\" ]; then\n    echo \"Error: Missing required ServerChan token\"\n    exit 1\nfi\n\n# Build API URL with token\nAPI_URL=\"https://sctapi.ftqq.com/${TOKEN}.send\"\n\n# Prepare message content\nTITLE=\"QModem SMS: ($SMS_SENDER)\"\nDESP=\"**Time:** $SMS_TIME\n\n**Sender:** $SMS_SENDER\n\n**Content:** \n$SMS_CONTENT\"\n\n# URL encode function for GET method\nurl_encode() {\n    echo \"$1\" | sed 's/ /%20/g;s/!/%21/g;s/\"/%22/g;s/#/%23/g;s/\\$/%24/g;s/&/%26/g;s/'\\''/%27/g;s/(/%28/g;s/)/%29/g;s/\\*/%2A/g;s/+/%2B/g;s/,/%2C/g;s/-/%2D/g;s/\\./%2E/g;s/\\//%2F/g;s/:/%3A/g;s/;/%3B/g;s/</%3C/g;s/=/%3D/g;s/>/%3E/g;s/?/%3F/g;s/@/%40/g;s/\\[/%5B/g;s/\\\\/%5C/g;s/\\]/%5D/g;s/\\^/%5E/g;s/_/%5F/g;s/`/%60/g;s/{/%7B/g;s/|/%7C/g;s/}/%7D/g;s/~/%7E/g'\n}\n\n# Try curl first, then wget\nif command -v curl >/dev/null 2>&1; then\n    #使用jq生成JSON_DATA\n    JSON_DATA=`\n    jq -n --arg title \"$TITLE\" --arg desp \"$DESP\" '\n        {\n            title: $title,\n            desp: $desp\n        }'`\n    [ -n \"$CHANNEL\" ] && JSON_DATA=$(echo \"$JSON_DATA\" | jq --arg channel \"$CHANNEL\" '. + {channel: $channel}')\n    [ -n \"$NOIP\" ] && JSON_DATA=$(echo \"$JSON_DATA\" | jq --arg noip \"$NOIP\" '. + {noip: $noip}')\n    [ -n \"$OPENID\" ] && JSON_DATA=$(echo \"$JSON_DATA\" | jq --arg openid \"$OPENID\" '. + {openid: $openid}')\n\n\n    curl -X POST \"$API_URL\" \\\n        -H \"Content-Type: application/json;charset=utf-8\" \\\n        -d \"$JSON_DATA\" \\\n        --connect-timeout 10 \\\n        --max-time 30\nelif command -v wget >/dev/null 2>&1; then\n    # Use GET method with URL encoding for wget\n    ENCODED_TITLE=$(url_encode \"$TITLE\")\n    ENCODED_DESP=$(url_encode \"$DESP\")\n    \n    # Build query string\n    QUERY=\"title=$ENCODED_TITLE&desp=$ENCODED_DESP\"\n    [ -n \"$CHANNEL\" ] && QUERY=\"${QUERY}&channel=$CHANNEL\"\n    [ -n \"$NOIP\" ] && QUERY=\"${QUERY}&noip=$NOIP\"\n    [ -n \"$OPENID\" ] && QUERY=\"${QUERY}&openid=$(url_encode \"$OPENID\")\"\n    \n    wget -O- \\\n        --timeout=30 \\\n        \"${API_URL}?${QUERY}\"\nelse\n    echo \"Error: Neither curl nor wget available\"\n    exit 1\nfi\n\nexit $?\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder_next/files/scripts/sms_forward_tgbot.sh",
    "content": "#!/bin/sh\n\n# Telegram Bot SMS Forward Script\n# Environment variables available:\n# SMS_SENDER - sender phone number\n# SMS_TIME - timestamp string\n# SMS_CONTENT - SMS content\n\n# Parse API config from environment or config file\nAPI_CONFIG=\"$1\"\n\nif [ -z \"$API_CONFIG\" ]; then\n    echo \"Error: API config not provided\"\n    exit 1\nfi\n\n# Extract configuration using jq or manual parsing\nBOT_TOKEN=$(echo \"$API_CONFIG\" | jq -r '.bot_token' 2>/dev/null)\nCHAT_ID=$(echo \"$API_CONFIG\" | jq -r '.chat_id' 2>/dev/null)\n\n# Fallback to manual parsing if jq fails\nif [ -z \"$BOT_TOKEN\" ] || [ \"$BOT_TOKEN\" = \"null\" ]; then\n    BOT_TOKEN=$(echo \"$API_CONFIG\" | grep -o '\"bot_token\":\"[^\"]*\"' | cut -d'\"' -f4)\nfi\n\nif [ -z \"$CHAT_ID\" ] || [ \"$CHAT_ID\" = \"null\" ]; then\n    CHAT_ID=$(echo \"$API_CONFIG\" | grep -o '\"chat_id\":\"[^\"]*\"' | cut -d'\"' -f4)\nfi\n\nif [ -z \"$BOT_TOKEN\" ] || [ -z \"$CHAT_ID\" ]; then\n    echo \"Error: Missing required Telegram Bot configuration\"\n    exit 1\nfi\n\n# Prepare message\nMESSAGE=\"QModem SMS: ($SMS_SENDER)\n\n🕒 Time: $SMS_TIME\n💬 Content: $SMS_CONTENT\"\n\n# URL encode the message\nMESSAGE_ENCODED=$(echo \"$MESSAGE\" | sed 's/ /%20/g; s/\\n/%0A/g; s/📱/%F0%9F%93%B1/g; s/📞/%F0%9F%93%9E/g; s/🕒/%F0%9F%95%92/g; s/💬/%F0%9F%92%AC/g')\n\n# Telegram API URL\nTG_URL=\"https://api.telegram.org/bot$BOT_TOKEN/sendMessage\"\n\n# Try curl first, then wget\nif command -v curl >/dev/null 2>&1; then\n    # Use jq to generate JSON payload\n    if command -v jq >/dev/null 2>&1; then\n        JSON_PAYLOAD=$(jq -n \\\n            --arg chat_id \"$CHAT_ID\" \\\n            --arg text \"$MESSAGE\" \\\n            --arg parse_mode \"HTML\" \\\n            '{\n                chat_id: $chat_id,\n                text: $text,\n                parse_mode: $parse_mode\n            }')\n        \n        curl -X POST \"$TG_URL\" \\\n            -H \"Content-Type: application/json\" \\\n            -d \"$JSON_PAYLOAD\" \\\n            --connect-timeout 10 \\\n            --max-time 30\n    else\n        # Fallback to form data if jq not available\n        curl -X POST \"$TG_URL\" \\\n            -d \"chat_id=$CHAT_ID\" \\\n            -d \"text=$MESSAGE_ENCODED\" \\\n            -d \"parse_mode=HTML\" \\\n            --connect-timeout 10 \\\n            --max-time 30\n    fi\nelif command -v wget >/dev/null 2>&1; then\n    wget -O- \\\n        --post-data=\"chat_id=$CHAT_ID&text=$MESSAGE_ENCODED&parse_mode=HTML\" \\\n        --timeout=30 \\\n        \"$TG_URL\"\nelse\n    echo \"Error: Neither curl nor wget available\"\n    exit 1\nfi\n\nexit $?\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder_next/files/scripts/sms_forward_webhook.sh",
    "content": "#!/bin/sh\n\n# Webhook SMS Forward Script\n# Environment variables available:\n# SMS_SENDER - sender phone number\n# SMS_TIME - timestamp string\n# SMS_CONTENT - SMS content\n\n# Parse API config from environment or config file\nAPI_CONFIG=\"$1\"\n\nif [ -z \"$API_CONFIG\" ]; then\n    echo \"Error: API config not provided\"\n    exit 1\nfi\n\n# Extract configuration using jq or manual parsing\nWEBHOOK_URL=$(echo \"$API_CONFIG\" | jq -r '.webhook_url' 2>/dev/null)\nHEADERS=$(echo \"$API_CONFIG\" | jq -r '.headers' 2>/dev/null)\nFORMAT=$(echo \"$API_CONFIG\" | jq -r '.format' 2>/dev/null)\nREQUEST_METHOD=$(echo \"$API_CONFIG\" | jq -r '.request_method' 2>/dev/null)\necho \"$API_CONFIG\" | jq\n# Fallback to manual parsing if jq fails\nif [ -z \"$WEBHOOK_URL\" ] || [ \"$WEBHOOK_URL\" = \"null\" ]; then\n    WEBHOOK_URL=$(echo \"$API_CONFIG\" | grep -o '\"webhook_url\":\"[^\"]*\"' | cut -d'\"' -f4)\nfi\n\nif [ -z \"$HEADERS\" ] || [ \"$HEADERS\" = \"null\" ]; then\n    HEADERS=$(echo \"$API_CONFIG\" | grep -o '\"headers\":\"[^\"]*\"' | cut -d'\"' -f4)\nfi\n\nif [ -z \"$WEBHOOK_URL\" ]; then\n    echo \"Error: Missing required webhook URL\"\n    exit 1\nfi\n\n# Prepare payload based on format\nif [ -z \"$FORMAT\" ] || [ \"$FORMAT\" = \"null\" ];then\n    payload=\"$SMS_SENDER/$SMS_CONTENT($SMS_TIME)\"\nelse\n    # Safe placeholder replacement using awk (handles all special characters)\n    payload=$(printf '%s' \"$FORMAT\" | awk -v sender=\"$SMS_SENDER\" -v time=\"$SMS_TIME\" -v content=\"$SMS_CONTENT\" '\n    {\n        gsub(/\\{SENDER\\}/, sender)\n        gsub(/\\{TIME\\}/, time)\n        gsub(/\\{CONTENT\\}/, content)\n        print\n    }')\n    \n    WEBHOOK_URL=$(printf '%s' \"$WEBHOOK_URL\" | awk -v sender=\"$SMS_SENDER\" -v time=\"$SMS_TIME\" -v content=\"$SMS_CONTENT\" '\n    {\n        gsub(/\\{SENDER\\}/, sender)\n        gsub(/\\{TIME\\}/, time)\n        gsub(/\\{CONTENT\\}/, content)\n        print\n    }')\nfi\n\n# Prepare curl command\nif [ -z \"$REQUEST_METHOD\" ] || [ \"$REQUEST_METHOD\" = \"null\" ]; then\n    REQUEST_METHOD=\"GET\"\nfi\n\n\nif [ \"$REQUEST_METHOD\" = \"POST\" ]; then\n    # Build curl arguments array-style for proper quoting\n    if [ -n \"$HEADERS\" ]; then\n        curl -X POST \"$WEBHOOK_URL\" -d \"$payload\" -H \"Content-Type: application/json\" -H \"$HEADERS\"\n    else\n        curl -X POST \"$WEBHOOK_URL\" -d \"$payload\" -H \"Content-Type: application/json\"\n    fi\nelse\n    # URL-encode payload for GET request\n    # Use jq for reliable URL encoding\n    encoded_payload=$(printf '%s' \"$payload\" | jq -sRr @uri)\n    full_url=\"${WEBHOOK_URL}/${encoded_payload}\"\n    \n    if [ -n \"$HEADERS\" ]; then\n        curl \"$full_url\" -H \"$HEADERS\"\n    else\n        curl \"$full_url\"\n    fi\nfi\n\nexit $?\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder_next/files/sms_forwarder.example",
    "content": "# SMS 转发服务配置\n# SMS Forwarder Configuration\n\n# 全局配置 / Global Configuration\nconfig sms_forward 'sms_forward'\n\toption enable '0'           # 启用服务 / Enable service (0=disabled, 1=enabled)\n\toption log_level 'info'     # 日志级别 / Log level (error/warn/info/debug)\n\n# Telegram Bot 转发示例 / Telegram Bot Example\nconfig sms_forward_instance\n\toption enable '0'\n\toption modem_cfg 'modem_1'           # 调制解调器 UCI 配置段 / Modem UCI config section\n\toption poll_interval '30'            # 轮询间隔(秒) / Poll interval in seconds\n\toption api_type 'tgbot'              # API 类型 / API type\n\toption api_config '{\"bot_token\":\"123456:ABC-DEF\",\"chat_id\":\"123456789\"}'\n\n# Webhook 转发示例 / Webhook Example\nconfig sms_forward_instance\n\toption enable '0'\n\toption modem_cfg 'modem_1'\n\toption poll_interval '60'\n\toption api_type 'webhook'\n\t# POST 请求示例 / POST request example\n\toption api_config '{\"webhook_url\":\"https://example.com/webhook\",\"request_method\":\"POST\",\"format\":\"{\\\"sender\\\":\\\"{SENDER}\\\",\\\"time\\\":\\\"{TIME}\\\",\\\"content\\\":\\\"{CONTENT}\\\"}\"}'\n\n# GET 请求示例 / GET request example\nconfig sms_forward_instance\n\toption enable '0'\n\toption modem_cfg 'modem_1'\n\toption poll_interval '60'\n\toption api_type 'webhook'\n\t# URL 中的占位符会被自动替换 / Placeholders in URL will be replaced\n\toption api_config '{\"webhook_url\":\"https://example.com/sms?from={SENDER}&time={TIME}\",\"request_method\":\"GET\",\"format\":\"{CONTENT}\"}'\n\n# Server酱 转发示例 / ServerChan Example\nconfig sms_forward_instance\n\toption enable '0'\n\toption modem_cfg 'modem_1'\n\toption poll_interval '60'\n\toption api_type 'serverchan'\n\toption api_config '{\"token\":\"SCT123456\",\"channel\":\"\",\"noip\":\"0\",\"openid\":\"\"}'\n\n# 飞书 转发示例 / Feishu Example\nconfig sms_forward_instance\n\toption enable '0'\n\toption modem_cfg 'modem_2'\n\toption poll_interval '30'\n\toption api_type 'feishu'\n\toption api_config '{\"webhook_url\":\"https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx\"}'\n\n# PushDeer 转发示例 / PushDeer Example\nconfig sms_forward_instance\n\toption enable '0'\n\toption modem_cfg 'modem_2'\n\toption poll_interval '30'\n\toption api_type 'pushdeer'\n\toption api_config '{\"server\":\"https://api2.pushdeer.com\",\"pushkey\":\"PDU123456\"}'\n\n# 注意：相同 modem_cfg 和 api_type 的实例会被自动合并，使用最小的 poll_interval\n# Note: Instances with same modem_cfg and api_type will be automatically merged, using minimum poll_interval\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder_next/files/sms_forwarder.init",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=90\nSTOP=10\n\nUSE_PROCD=1\nPROG=/usr/bin/sms_forwarder_next\n\nstart_service() {\n\tconfig_load sms_forwarder\n\t\n\tlocal enabled\n\tconfig_get_bool enabled sms_forward enable 0\n\t\n\tif [ \"$enabled\" -eq 0 ]; then\n\t\techo \"SMS Forward service is disabled\"\n\t\treturn 0\n\tfi\n\t\n\t# Start SMS forwarder instance\n\tprocd_open_instance \"sms_forwarder\"\n\tprocd_set_param command \"$PROG\"\n\tprocd_set_param respawn ${respawn_threshold:-3600} ${respawn_timeout:-5} ${respawn_retry:-5}\n\tprocd_set_param stdout 1\n\tprocd_set_param stderr 1\n\tprocd_close_instance\n\t\n\techo \"SMS Forwarder service started\"\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"sms_forwarder\"\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/sms_forwarder_next/files/sms_forwarder_next",
    "content": "#!/usr/bin/ucode\n'use strict';\n\nimport { cursor } from 'uci';\nimport { readfile, popen } from 'fs';\nimport * as ubus from 'ubus';\n\nconst SCRIPT_DIR = '/usr/share/sms_forwarder';\nconst LOG_PREFIX = '[SMS_FORWARDER]';\n\n// Log levels\nconst LOG_LEVEL = {\n\tERROR: 0,\n\tWARN: 1,\n\tINFO: 2,\n\tDEBUG: 3\n};\n\nlet current_log_level = LOG_LEVEL.DEBUG;\nlet should_exit = false;\n\n// Signal handler for graceful shutdown\nfunction handleSignal(signo) {\n\tlog(LOG_LEVEL.INFO, `Received signal ${signo}, shutting down...`);\n\tshould_exit = true;\n}\n\nfunction log(level, message) {\n\tif (level <= current_log_level) {\n\t\tlet level_str = 'INFO';\n\t\tif (level == LOG_LEVEL.ERROR) level_str = 'ERROR';\n\t\telse if (level == LOG_LEVEL.WARN) level_str = 'WARN';\n\t\telse if (level == LOG_LEVEL.DEBUG) level_str = 'DEBUG';\n\t\t\n\t\twarn(`${LOG_PREFIX} [${level_str}] ${message}\\n`);\n\t}\n}\n\n// Read SMS forwarder configuration\nfunction readConfig() {\n\tlet ctx = cursor();\n\tif (!ctx) {\n\t\tlog(LOG_LEVEL.ERROR, 'Failed to initialize UCI cursor');\n\t\treturn null;\n\t}\n\t\n\t// Read global config\n\tlet global_cfg = ctx.get_all('sms_forwarder', 'sms_forward');\n\tif (!global_cfg) {\n\t\tlog(LOG_LEVEL.ERROR, 'Failed to read sms_forward configuration');\n\t\treturn null;\n\t}\n\t\n\tlet enabled = global_cfg.enable == '1';\n\tif (!enabled) {\n\t\tlog(LOG_LEVEL.INFO, 'SMS forwarder is disabled');\n\t\treturn null;\n\t}\n\t\n\t// Set log level\n\tlet log_level_str = global_cfg.log_level || 'info';\n\tif (log_level_str == 'error') current_log_level = LOG_LEVEL.ERROR;\n\telse if (log_level_str == 'warn') current_log_level = LOG_LEVEL.WARN;\n\telse if (log_level_str == 'info') current_log_level = LOG_LEVEL.INFO;\n\telse if (log_level_str == 'debug') current_log_level = LOG_LEVEL.DEBUG;\n\t\n\t// Read all instances\n\tlet instances = [];\n\tctx.foreach('sms_forwarder', 'sms_forward_instance', (section) => {\n\t\tif (section['.type'] != 'sms_forward_instance')\n\t\t\treturn;\n\t\t\n\t\tlet enabled = section.enable == '1';\n\t\tif (!enabled) {\n\t\t\tlog(LOG_LEVEL.DEBUG, `Instance ${section['.name']} is disabled`);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (!section.modem_cfg) {\n\t\t\tlog(LOG_LEVEL.WARN, `Instance ${section['.name']} has no modem_cfg`);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (!section.api_type) {\n\t\t\tlog(LOG_LEVEL.WARN, `Instance ${section['.name']} has no api_type`);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tlet poll_interval = int(section.poll_interval || 30);\n\t\tif (poll_interval < 5) poll_interval = 5;\n\t\t\n\t\tpush(instances, {\n\t\t\tname: section['.name'],\n\t\t\tmodem_cfg: section.modem_cfg,\n\t\t\tpoll_interval: poll_interval,\n\t\t\tapi_type: section.api_type,\n\t\t\tapi_config: section.api_config || '{}'\n\t\t});\n\t});\n\t\n\tif (length(instances) == 0) {\n\t\tlog(LOG_LEVEL.INFO, 'No enabled instances found');\n\t\treturn null;\n\t}\n\t\n\tlog(LOG_LEVEL.INFO, `Loaded ${length(instances)} instance(s)`);\n\treturn instances;\n}\n\n// Merge instances with same modem_cfg and api_type\nfunction mergeInstances(instances) {\n\tlet merged = {};\n\t\n\tfor (let inst in instances) {\n\t\tlet key = `${inst.modem_cfg}`;\n\t\t\n\t\tif (!merged[key]) {\n\t\t\tmerged[key] = {\n\t\t\t\tmodem_cfg: inst.modem_cfg,\n\t\t\t\tapi_configs:[\n\t\t\t\t\t{api_type: inst.api_type, api_config: inst.api_config}\t\n\t\t\t\t],\n\t\t\t\tpoll_interval: inst.poll_interval,\n\t\t\t\tinstances: [inst.name]\n\t\t\t};\n\t\t} else {\n\t\t\t// Use minimum poll interval\n\t\t\tif (inst.poll_interval < merged[key].poll_interval) {\n\t\t\t\tmerged[key].poll_interval = inst.poll_interval;\n\t\t\t}\n\t\t\tpush(merged[key].instances, inst.name);\n\t\t\tpush(merged[key].api_configs, {api_type: inst.api_type, api_config: inst.api_config});\n\t\t}\n\t}\n\t\n\tlet result = [];\n\tfor (let key in merged) {\n\t\tpush(result, merged[key]);\n\t\tlog(LOG_LEVEL.INFO, `Merged group: modem=${merged[key].modem_cfg},  interval=${merged[key].poll_interval}s, instances=[${join(',', merged[key].instances)}]`);\n\t}\n\t\n\treturn result;\n}\n\n// Get unforwarded SMS messages\nfunction getUnforwardedSms(modem_cfg) {\n\tlet conn = ubus.connect();\n\tif (!conn) {\n\t\tlog(LOG_LEVEL.ERROR, 'Failed to connect to ubus');\n\t\treturn null;\n\t}\n\t\n\tlet result = conn.call('qmodem_sms', 'list_sms', {\n\t\tconfig_section: modem_cfg\n\t});\n\t\n\tconn.disconnect();\n\t\n\tif (!result || !result.conversations) {\n\t\tlog(LOG_LEVEL.DEBUG, `No conversations found for modem ${modem_cfg}`);\n\t\treturn [];\n\t}\n\t\n\t// Extract unforwarded messages\n\tlet unforwarded = [];\n\tfor (let conv in result.conversations) {\n\t\tfor (let msg in conv.messages) {\n\t\t\tif (msg.type == 'received' && !msg.forwarded) {\n\t\t\t\tpush(unforwarded, msg);\n\t\t\t}\n\t\t}\n\t}\n\t\n\tlog(LOG_LEVEL.DEBUG, `Found ${length(unforwarded)} unforwarded message(s) for modem ${modem_cfg}`);\n\treturn unforwarded;\n}\n\n// Mark messages as forwarded\nfunction markAsForwarded(modem_cfg, ids) {\n\tif (!ids || length(ids) == 0)\n\t\treturn true;\n\t\n\tlet conn = ubus.connect();\n\tif (!conn) {\n\t\tlog(LOG_LEVEL.ERROR, 'Failed to connect to ubus');\n\t\treturn false;\n\t}\n\t\n\tlet result = conn.call('qmodem_sms', 'mark_forwarded', {\n\t\tconfig_section: modem_cfg,\n\t\tids: ids\n\t});\n\t\n\tconn.disconnect();\n\t\n\tif (!result || !result.success) {\n\t\tlog(LOG_LEVEL.ERROR, `Failed to mark messages as forwarded for modem ${modem_cfg}`);\n\t\treturn false;\n\t}\n\t\n\tlog(LOG_LEVEL.INFO, `Marked ${result.marked} message(s) as forwarded for modem ${modem_cfg}`);\n\treturn true;\n}\n\n// Helper function to quote shell arguments\nfunction shellquote(str) {\n\tif (!str)\n\t\treturn \"''\";\n\t\n\t// Replace single quotes with '\\''\n\tlet escaped = replace(sprintf('%s', str), \"'\", \"'\\\\''\");\n\treturn sprintf(\"'%s'\", escaped);\n}\n\n// Format timestamp\nfunction formatTimestamp(timestamp) {\n\tif (!timestamp)\n\t\treturn 'Unknown';\n\t\n\tlet cmd = `date -d @${timestamp} '+%Y-%m-%d %H:%M:%S'`;\n\tlet proc = popen(cmd, 'r');\n\tif (!proc)\n\t\treturn sprintf('%d', timestamp);\n\t\n\tlet output = rtrim(proc.read('all') || '');\n\tproc.close();\n\treturn output || sprintf('%d', timestamp);\n}\n\n// Execute forward script\nfunction executeForward(msg, api_configs) {\n\tlet total_success = 0, total_count = 0;\n\tlet retries_total = 3;\n\tfor (let api in api_configs) {\n\t\ttotal_count++;\n\t\tlog(LOG_LEVEL.INFO, `Forwarding message ID ${msg.id} using API type: ${api.api_type} （${total_count}/${length(api_configs)}）`);\n\t\tlet api_type = api.api_type;\n\t\tlet api_config = api.api_config;\n\t\tlet script_path = `${SCRIPT_DIR}/sms_forward_${api_type}.sh`;\n\t\t\n\t\t// Format timestamp\n\t\tlet time_str = formatTimestamp(msg.timestamp);\n\t\t\n\t\t// Build command with environment variables\n\t\tlet cmd = sprintf(\n\t\t\t'SMS_SENDER=%s SMS_TIME=%s SMS_CONTENT=%s %s %s',\n\t\t\tshellquote(msg.sender || ''),\n\t\t\tshellquote(time_str),\n\t\t\tshellquote(msg.content || ''),\n\t\t\tshellquote(script_path),\n\t\t\tshellquote(api_config)\n\t\t);\n\t\t\n\t\tlog(LOG_LEVEL.DEBUG, `Executing: ${script_path} for message from ${msg.sender}`);\n\t\tfor (let retries = 0; retries < retries_total; retries++) {\n\t\t\tlet proc = popen(cmd, 'r');\n\t\t\tif (!proc) {\n\t\t\t\tlog(LOG_LEVEL.ERROR, `Failed to execute forward script ${api_type}: ${script_path}`);\n\t\t\t\t//not continue to retry if popen fails\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t\n\t\t\tlet output = proc.read('all') || '';\n\t\t\tlet exit_code = proc.close();\n\t\t\t\n\t\t\tif (exit_code != 0) {\n\t\t\t\tlog(LOG_LEVEL.ERROR, `Forward script failed with exit code ${exit_code} for ${api_type}: ${output}`);\n\t\t\t\tlog(LOG_LEVEL.INFO, `Retrying... (${retries + 1}/${retries_total})`);\n\t\t\t\tcontinue;  // Retry\n\t\t\t}\n\t\t\n\t\t\tlog(LOG_LEVEL.INFO, `Forward ${api_type} script output: ${output}`);\n\t\t\ttotal_success++;\n\t\t\tbreak;  // Success, exit retry loop\n\t\t}\n\t}\n\treturn (total_success > 0);\n}\n\n// Process messages for a merged instance\nfunction processInstance(inst, is_recurring)\n{\n\tlog(LOG_LEVEL.DEBUG, `Processing instance: modem=${inst.modem_cfg}, type=${inst.api_configs}, interval=${inst.poll_interval}s`);\n\t\n\tlet messages = getUnforwardedSms(inst.modem_cfg);\n\tif (!messages || length(messages) == 0) {\n\t\treturn;\n\t}\n\t\n\tlog(LOG_LEVEL.INFO, `Processing ${length(messages)} unforwarded message(s) for modem ${inst.modem_cfg}`);\n\t\n\tlet forwarded_ids = [];\n\tlet success_count = 0;\n\tlet fail_count = 0;\n\n\t\n\t\n\tfor (let msg in messages) {\n\t\t\t\t\n\t\t// 如果是递归调用，只处理指定的消息\n\t\tif (is_recurring > 0 && msg.id != is_recurring) {\n\t\t\tlog(LOG_LEVEL.DEBUG, `Skipping message ID ${msg.id} (only processing ${is_recurring})`);\n\t\t\tcontinue;\n\t\t}\n\n\t\t// Check for multipart message completeness\n\t\t// 递归调用时强制发送，不再检查完整性\n\t\tif (msg.total > 1 && length(msg.part_ids) < msg.total && is_recurring < 0) {\n\t\t\tlog(LOG_LEVEL.WARN, `Skipping incomplete multipart message ID ${msg.id} (${length(msg.part_ids)}/${msg.total} parts received)`);\n\t\t\t// 延迟后递归处理此消息，递归时强制发送\n\t\t\tsleep(500);\n\t\t\tprocessInstance(inst, msg.id);\n\t\t\t// 不完整的消息可能有多段，因此不能继续处理其他消息，否则会调用多次递归\n\t\t\tbreak;\n\t\t}\n\t\n\t\tlet success = executeForward(msg, inst.api_configs);\n\t\t\n\t\t\n\t\tif (success) {\n\t\t\t// Use part_ids if available (for multipart messages), otherwise use id\n\t\t\tif (msg.part_ids && length(msg.part_ids) > 0) {\n\t\t\t\tfor (let part_id in msg.part_ids) {\n\t\t\t\t\tpush(forwarded_ids, part_id);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tpush(forwarded_ids, msg.id);\n\t\t\t}\n\t\t\tsuccess_count++;\n\t\t} else {\n\t\t\tfail_count++;\n\t\t}\n\t}\n\t\n\t// Mark successfully forwarded messages\n\tif (length(forwarded_ids) > 0) {\n\t\tmarkAsForwarded(inst.modem_cfg, forwarded_ids);\n        log(LOG_LEVEL.INFO, `Marked ${length(forwarded_ids)} message(s) as forwarded for modem ${inst.modem_cfg}`);\n\t}\n\t\n\tlog(LOG_LEVEL.INFO, `Forwarding complete: ${success_count} success, ${fail_count} failed`);\n}\n\n// Sleep in small intervals to allow quick response to signals\nfunction interruptibleSleep(seconds) {\n\tlet remaining = seconds;\n\twhile (remaining > 0 && !should_exit) {\n\t\tlet sleep_time = remaining > 1 ? 1 : remaining;\n\t\tsleep(sleep_time * 1000);  // sleep() takes milliseconds\n\t\tremaining -= sleep_time;\n\t}\n}\n\n// Main loop\nfunction mainLoop() {\n\tlog(LOG_LEVEL.INFO, 'SMS Forwarder started');\n\t\n\twhile (!should_exit) {\n\t\t// Read and merge configuration\n\t\tlet instances = readConfig();\n\t\tif (!instances) {\n\t\t\tlog(LOG_LEVEL.DEBUG, 'No valid configuration, sleeping...');\n\t\t\tinterruptibleSleep(30);\n\t\t\tcontinue;\n\t\t}\n\t\t\n\t\tlet merged = mergeInstances(instances);\n\t\t\n\t\t// Process each merged instance\n\t\tfor (let inst in merged) {\n\t\t\tif (should_exit) break;\n\t\t\tprocessInstance(inst , -1);\n\t\t}\n\t\t\n\t\tif (should_exit) break;\n\t\t\n\t\t// Find minimum poll interval\n\t\tlet min_interval = 30;\n\t\tfor (let inst in merged) {\n\t\t\tif (inst.poll_interval < min_interval) {\n\t\t\t\tmin_interval = inst.poll_interval;\n\t\t\t}\n\t\t}\n\t\t\n\t\tlog(LOG_LEVEL.DEBUG, `Sleeping for ${min_interval} seconds`);\n\t\tinterruptibleSleep(min_interval);\n\t}\n\t\n\tlog(LOG_LEVEL.INFO, 'SMS Forwarder stopped');\n}\n\n// Register signal handlers\nsignal('SIGINT', handleSignal);\nsignal('SIGTERM', handleSignal);\n\n// Start main loop\nmainLoop();\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/Makefile",
    "content": "include $(TOPDIR)/rules.mk\ninclude $(INCLUDE_DIR)/kernel.mk\n\n# Include unified version\ninclude ../../version.mk\n\nPKG_NAME:=tom_modem\nPKG_RELEASE:=$(QMODEM_RELEASE)\nPKG_VERSION:=$(QMODEM_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n  SECTION:=utils\n  CATEGORY:=Utilities\n  TITLE:=Fujr Modem Communite Tool\n  DEPENDS:=+libubus +libubox +libjson-c +libblobmsg-json\nendef\n\ndefine Package/$(PKG_NAME)/config\n\tconfig PACKAGE_$(PKG_NAME)_EARLY_RETURN\n\t\tbool \"Early return\"\n\t\tdefault y\n\tconfig PACKAGE_$(PKG_NAME)_ENABLE_UBUS_DAEMON\n\t\tbool \"Enable UBUS daemon support\"\n\t\tdefault y\n\t\thelp\n\t\t  Enable UBUS daemon support for tom_modem.\n\t\t  When disabled, compiles tom_modem_v1 (TTY-only mode).\n\t\t  When enabled, allows switching between TTY and UBUS with -u flag.\nendef\n\ndefine Package/$(PKG_NAME)/description\n  Modem Communite Tool for 5G modem (By Fujr)\nendef\n\ndefine Build/Prepare\n\tmkdir -p $(PKG_BUILD_DIR)\n\t$(CP) src/* $(PKG_BUILD_DIR)/\nendef\n\ndefine Build/Compile\n\t$(MAKE) -C $(PKG_BUILD_DIR) \\\n\t\t$(TARGET_CONFIGURE_OPTS) \\\n\t\tCFLAGS=\"$(TARGET_CFLAGS) $(if $(CONFIG_PACKAGE_$(PKG_NAME)_ENABLE_UBUS_DAEMON),-DENABLE_UBUS_DAEMON)\" \\\n\t\tENABLE_UBUS_DAEMON=$(if $(CONFIG_PACKAGE_$(PKG_NAME)_ENABLE_UBUS_DAEMON),y,n)\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/tom_modem $(1)/usr/bin/\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/Makefile",
    "content": "TARGET = tom_modem\nENABLE_UBUS_DAEMON ?= n\n\nCFLAGS += -I$(TARGET_DIR)/usr/include\nCFLAGS += -I$(TARGET_DIR)/usr/include/libubox\nCFLAGS += -I$(TARGET_DIR)/usr/include/json-c\n\n# Check for UBUS daemon support\nifeq ($(ENABLE_UBUS_DAEMON),y)\n    LDFLAGS += -L$(TARGET_DIR)/usr/lib\n    LDFLAGS += -L$(TARGET_DIR)/lib\n    LDFLAGS += -lubus -lubox -ljson-c -lblobmsg_json\n    SRCS = main.c utils.c operations.c transport.c ttydevice.c ubus_client.c extlib/pdu.c extlib/ucs2_to_utf8.c\nelse\n    # TTY-only mode (tom_modem_v1 compatibility)\n    SRCS = main.c utils.c operations.c transport.c ttydevice.c extlib/pdu.c extlib/ucs2_to_utf8.c\nendif\n\nOBJS = $(SRCS:.c=.o)\n\n$(TARGET): $(OBJS)\n\t$(CC) $(LDFLAGS) -o $@ $^\n\n%.o: %.c\n\t$(CC) $(CFLAGS) -c $< -o $@\n\n.PHONY: clean\nclean:\n\trm -rf *.o *.*~ *~ *.swap\n\trm -rf $(TARGET)\n\trm -rf extlib/*.o\ndepend:\n\t$(CC) $(CFLAGS) -MM $(SRCS) > .depend\n\n# 包含依赖文件\nifneq \"$(wildcard .depend)\" \"\"\ninclude .depend\nendif\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/extlib/pdu.c",
    "content": "/*\n * 2017 - 2021 Cezary Jackiewicz <cezary@eko.one.pl>\n * 2014 lovewilliam <ztong@vt.edu>\n */\n// Copyright 2011 The Avalon Project Authors. All rights reserved.\n// Use of this source code is governed by the Apache License 2.0\n// that can be found in the LICENSE file.\n//\n//  SMS encoding/decoding functions, which are based on examples from:\n//  http://www.dreamfabric.com/sms/\n\n#include \"pdu.h\"\n\n#include <string.h>\n#include <time.h>\n\nenum {\n\tBITMASK_7BITS = 0x7F,\n\tBITMASK_8BITS = 0xFF,\n\tBITMASK_HIGH_4BITS = 0xF0,\n\tBITMASK_LOW_4BITS = 0x0F,\n\n\tTYPE_OF_ADDRESS_UNKNOWN = 0x81,\n\tTYPE_OF_ADDRESS_INTERNATIONAL_PHONE = 0x91,\n\tTYPE_OF_ADDRESS_NATIONAL_SUBSCRIBER = 0xC8,\n\tTYPE_OF_ADDRESS_ALPHANUMERIC = 0xD0,\n\n\tSMS_DELIVER_ONE_MESSAGE = 0x04,\n\tSMS_SUBMIT              = 0x11,\n\n\tSMS_MAX_7BIT_TEXT_LENGTH  = 160,\n};\n\n// Swap decimal digits of a number (e.g. 12 -> 21).\nstatic unsigned char \nSwapDecimalNibble(const unsigned char x)\n{\n\treturn (x / 16) + ((x % 16) * 10);\n}\n\n// Encode/Decode PDU: Translate ASCII 7bit characters to 8bit buffer.\n// SMS encoding example from: http://www.dreamfabric.com/sms/.\n//\n// 7-bit ASCII: \"hellohello\"\n// [0]:h   [1]:e   [2]:l   [3]:l   [4]:o   [5]:h   [6]:e   [7]:l   [8]:l   [9]:o\n// 1101000 1100101 1101100 1101100 1101111 1101000 1100101 1101100 1101100 1101111\n//               |             |||           ||||| |               |||||||  ||||||\n// /-------------/   ///-------///     /////-///// \\------------\\  |||||||  \\\\\\\\\\\\ .\n// |                 |||               |||||                    |  |||||||   ||||||\n// input buffer position\n// 10000000 22111111 33322222 44443333 55555333 66666655 77777776 98888888 --999999\n// |                 |||               |||||                    |  |||||||   ||||||\n// 8bit encoded buffer\n// 11101000 00110010 10011011 11111101 01000110 10010111 11011001 11101100 00110111\n// E8       32       9B       FD       46       97       D9       EC       37\n\n\n// Encode PDU message by merging 7 bit ASCII characters into 8 bit octets.\nint\nEncodePDUMessage(const char* sms_text, int sms_text_length, unsigned char* output_buffer, int buffer_size)\n{\n\t// Check if output buffer is big enough.\n\tif ((sms_text_length * 7 + 7) / 8 > buffer_size)\n\t\treturn -1;\n\n\tint output_buffer_length = 0;\n\tint carry_on_bits = 1;\n\tint i = 0;\n\n\tfor (; i < sms_text_length - 1; ++i) {\n\t\toutput_buffer[output_buffer_length++] =\n\t\t\t((sms_text[i] & BITMASK_7BITS) >> (carry_on_bits - 1)) |\n\t\t\t((sms_text[i + 1] & BITMASK_7BITS) << (8 - carry_on_bits));\n\t\tcarry_on_bits++;\n\t\tif (carry_on_bits == 8) {\n\t\t\tcarry_on_bits = 1;\n\t\t\t++i;\n\t\t}\n\t}\n\n\tif (i <= sms_text_length)\n\t\toutput_buffer[output_buffer_length++] =\t(sms_text[i] & BITMASK_7BITS) >> (carry_on_bits - 1);\n\n\treturn output_buffer_length;\n}\n\n// Decode PDU message by splitting 8 bit encoded buffer into 7 bit ASCII\n// characters.\nint\nDecodePDUMessage_GSM_7bit(const unsigned char* buffer, int buffer_length, char* output_sms_text, int sms_text_length)\n{\n\tint output_text_length = 0;\n\tif (buffer_length > 0)\n\t\toutput_sms_text[output_text_length++] = BITMASK_7BITS & buffer[0];\n\n\tif (sms_text_length > 1) {\n\t\tint carry_on_bits = 1;\n\t\tint i = 1;\n\t\tfor (; i < buffer_length; ++i) {\n\n\t\t\toutput_sms_text[output_text_length++] = BITMASK_7BITS &\t((buffer[i] << carry_on_bits) | (buffer[i - 1] >> (8 - carry_on_bits)));\n\n\t\t\tif (output_text_length == sms_text_length) break;\n\n\t\t\tcarry_on_bits++;\n\n\t\t\tif (carry_on_bits == 8) {\n\t\t\t\tcarry_on_bits = 1;\n\t\t\t\toutput_sms_text[output_text_length++] = buffer[i] & BITMASK_7BITS;\n\t\t\t\tif (output_text_length == sms_text_length) break;\n\t\t\t}\n\n\t\t}\n\t\tif (output_text_length < sms_text_length)  // Add last remainder.\n\t\t\toutput_sms_text[output_text_length++] =\tbuffer[i - 1] >> (8 - carry_on_bits);\n\t}\n\n\treturn output_text_length;\n}\n\n#define  GSM_7BITS_ESCAPE   0x1b\n\nstatic const unsigned char gsm7bits_to_latin1[128] = {\n  '@', 0xa3,  '$', 0xa5, 0xe8, 0xe9, 0xf9, 0xec, 0xf2, 0xc7, '\\n', 0xd8, 0xf8, '\\r', 0xc5, 0xe5,\n    0,  '_',    0,    0,    0,    0,    0,    0,    0,    0,    0,    0, 0xc6, 0xe6, 0xdf, 0xc9,\n  ' ',  '!',  '\"',  '#', 0xa4,  '%',  '&', '\\'',  '(',  ')',  '*',  '+',  ',',  '-',  '.',  '/',\n  '0',  '1',  '2',  '3',  '4',  '5',  '6',  '7',  '8',  '9',  ':',  ';',  '<',  '=',  '>',  '?',\n 0xa1,  'A',  'B',  'C',  'D',  'E',  'F',  'G',  'H',  'I',  'J',  'K',  'L',  'M',  'N',  'O',\n  'P',  'Q',  'R',  'S',  'T',  'U',  'V',  'W',  'X',  'Y',  'Z', 0xc4, 0xd6, 0xd1, 0xdc, 0xa7,\n 0xbf,  'a',  'b',  'c',  'd',  'e',  'f',  'g',  'h',  'i',  'j',  'k',  'l',  'm',  'n',  'o',\n  'p',  'q',  'r',  's',  't',  'u',  'v',  'w',  'x',  'y',  'z', 0xe4, 0xf6, 0xf1, 0xfc, 0xe0,\n};\n\nstatic const unsigned char gsm7bits_extend_to_latin1[128] = {\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,'\\f',   0,   0,   0,   0,   0,\n    0,   0,   0,   0, '^',   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,   0,   0,   0,   0,   0,   0,   0, '{', '}',   0,   0,   0,   0,   0,'\\\\',\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0, '[', '~', ']',   0,\n  '|',   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n    0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,   0,\n};\n\nstatic int\nG7bitToAscii(char* buffer, int buffer_length)\n{\n\tint i;\n\n\tfor (i = 0; i<buffer_length; i++) {\n\t\tif (buffer[i] < 128) {\n\t\t\tif (buffer[i] == GSM_7BITS_ESCAPE) {\n\t\t\t\tbuffer[i] = gsm7bits_extend_to_latin1[buffer[i + 1]];\n\t\t\t\tmemmove(&buffer[i + 1], &buffer[i + 2], buffer_length - i - 1);\n\t\t\t\tbuffer_length--;\n\t\t\t} else {\n\t\t\t\tbuffer[i] = gsm7bits_to_latin1[buffer[i]];\n\t\t\t}\n\t\t}\n\t}\n\n\treturn buffer_length;\n}\n\n#define NPC '?'\n\nstatic const int latin1_to_gsm7bits[256] = {\n  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC, 0x0a,  NPC,-0x0a, 0x0d,  NPC,  NPC,\n  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,\n 0x20, 0x21, 0x22, 0x23, 0x02, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f,\n 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f,\n 0x00, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4a, 0x4b, 0x4c, 0x4d, 0x4e, 0x4f,\n 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5a,-0x3c,-0x2f,-0x3e,-0x14, 0x11,\n  NPC, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6a, 0x6b, 0x6c, 0x6d, 0x6e, 0x6f,\n 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7a,-0x28,-0x40,-0x29,-0x3d,  NPC,\n  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,\n  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,\n  NPC, 0x40,  NPC, 0x01, 0x24, 0x03,  NPC, 0x5f,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,\n  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC, 0x60,\n  NPC,  NPC,  NPC,  NPC, 0x5b, 0x0e, 0x1c, 0x09,  NPC, 0x1f,  NPC,  NPC,  NPC,  NPC,  NPC,  NPC,\n  NPC, 0x5d,  NPC,  NPC,  NPC,  NPC, 0x5c,  NPC, 0x0b,  NPC,  NPC,  NPC, 0x5e,  NPC,  NPC, 0x1e,\n 0x7f,  NPC,  NPC,  NPC, 0x7b, 0x0f, 0x1d,  NPC, 0x04, 0x05,  NPC,  NPC, 0x07,  NPC,  NPC,  NPC,\n  NPC, 0x7d, 0x08,  NPC,  NPC,  NPC, 0x7c,  NPC, 0x0c, 0x06,  NPC,  NPC, 0x7e,  NPC,  NPC,  NPC,\n};\n\nstatic int\nAsciiToG7bit(const char* buffer, int buffer_length, unsigned char* output_buffer)\n{\n\tint i, j, val;\n\n\tj=0;\n\tfor (i = 0; i < buffer_length; i++) {\n\t\tval = latin1_to_gsm7bits[buffer[i] & 0xFF];\n\t\tif (val < 0) {\n\t\t\toutput_buffer[j++] = GSM_7BITS_ESCAPE;\n\t\t\toutput_buffer[j++] = -1*val;\n\t\t} else {\n\t\t\tif (((buffer[i] & 0xFF) & 0xE0) == 0xC0) { /* test for two byte utf8 char */\n\t\t\t\tval = NPC;\n\t\t\t\ti++;\n\t\t\t} else if (((buffer[i] & 0xFF) & 0xF0) == 0xE0) { /* test for three byte utf8 char */\n\t\t\t\tval = NPC;\n\t\t\t\ti++;\n\t\t\t\ti++;\n\t\t\t}\n\t\t\toutput_buffer[j++] = val;\n\t\t}\n\t}\n\treturn j;\n}\n\n// Encode a digit based phone number for SMS based format.\nstatic int\nEncodePhoneNumber(const char* phone_number, unsigned char* output_buffer, int buffer_size)\n{\n\tint output_buffer_length = 0;  \n\tconst int phone_number_length = strlen(phone_number);\n\n\t// Check if the output buffer is big enough.\n\tif ((phone_number_length + 1) / 2 > buffer_size)\n\t\treturn -1;\n\n\tint i = 0;\n\tfor (; i < phone_number_length; ++i) {\n\n\t\tif (phone_number[i] < '0' && phone_number[i] > '9')\n\t\t\treturn -1;\n\n\t\tif (i % 2 == 0) {\n\t\t\toutput_buffer[output_buffer_length++] =\tBITMASK_HIGH_4BITS | (phone_number[i] - '0');\n\t\t} else {\n\t\t\toutput_buffer[output_buffer_length - 1] =\n\t\t\t\t(output_buffer[output_buffer_length - 1] & BITMASK_LOW_4BITS) |\n\t\t\t\t((phone_number[i] - '0') << 4); \n\t\t}\n\t}\n\n\treturn output_buffer_length;\n}\n\n// Decode a digit based phone number for SMS based format.\nstatic int\nDecodePhoneNumber(const unsigned char* buffer, int phone_number_length, char* output_phone_number)\n{\n\tint i = 0;\n\tfor (; i < phone_number_length; ++i) {\n\t\tif (i % 2 == 0)\n\t\t\toutput_phone_number[i] = (buffer[i / 2] & BITMASK_LOW_4BITS) + '0';\n\t        else\n\t\t\toutput_phone_number[i] = ((buffer[i / 2] & BITMASK_HIGH_4BITS) >> 4) + '0';\n\t}\n\toutput_phone_number[phone_number_length] = '\\0';  // Terminate C string.\n\treturn phone_number_length;\n}\n\n// Encode a SMS message to PDU\nint\npdu_encode(const char* service_center_number, const char* phone_number, const char* sms_text,\n\t   unsigned char* output_buffer, int buffer_size)\n{\t\n\tif (buffer_size < 2)\n\t\treturn -1;\n\n\tint output_buffer_length = 0;\n\n\t// 1. Set SMS center number.\n\tint length = 0;\n\tif (service_center_number && strlen(service_center_number) > 0) {\n\t\toutput_buffer[1] = TYPE_OF_ADDRESS_INTERNATIONAL_PHONE;\n\t\tlength = EncodePhoneNumber(service_center_number,\n\t\t\t\t\t   output_buffer + 2, buffer_size - 2);\n\t\tif (length < 0 && length >= 254)\n\t\t\treturn -1;\n\t\tlength++;  // Add type of address.\n\t}\n\toutput_buffer[0] = length;\n\toutput_buffer_length = length + 1;\n\tif (output_buffer_length + 4 > buffer_size)\n\t\treturn -1;  // Check if it has space for four more bytes.\n\n\t// 2. Set type of message.\n\toutput_buffer[output_buffer_length++] = SMS_SUBMIT;\n\toutput_buffer[output_buffer_length++] = 0x00;  // Message reference.\n\n\t// 3. Set phone number.\n\toutput_buffer[output_buffer_length] = strlen(phone_number);\n\n\tif (strlen(phone_number) < 6) {\n\t\toutput_buffer[output_buffer_length + 1] = TYPE_OF_ADDRESS_UNKNOWN;\n\t} else {\n\t\toutput_buffer[output_buffer_length + 1] = TYPE_OF_ADDRESS_INTERNATIONAL_PHONE;\n\t}\n\n\tlength = EncodePhoneNumber(phone_number,\n\t\t\t\t   output_buffer + output_buffer_length + 2,\n\t\t\t\t   buffer_size - output_buffer_length - 2);\n\toutput_buffer_length += length + 2;\n\tif (output_buffer_length + 4 > buffer_size)\n\t\treturn -1;  // Check if it has space for four more bytes.\n\n\n\t// 4. Protocol identifiers.\n\toutput_buffer[output_buffer_length++] = 0x00;  // TP-PID: Protocol identifier.\n\toutput_buffer[output_buffer_length++] = 0x00;  // TP-DCS: Data coding scheme.\n\toutput_buffer[output_buffer_length++] = 0xB0;  // TP-VP: Validity: 10 days\n\n\t// 5. SMS message.\n\tint sms_text_length = strlen(sms_text);\n\tchar sms_text_7bit[2*SMS_MAX_7BIT_TEXT_LENGTH];\n\tsms_text_length = AsciiToG7bit(sms_text, sms_text_length, sms_text_7bit);\n\tif (sms_text_length > SMS_MAX_7BIT_TEXT_LENGTH)\n\t\treturn -1;\n\toutput_buffer[output_buffer_length++] = sms_text_length;\n\tlength = EncodePDUMessage(sms_text_7bit, sms_text_length,\n\t\t\t\t  output_buffer + output_buffer_length, \n\t\t\t\t  buffer_size - output_buffer_length);\n\tif (length < 0)\n\t\treturn -1;\n\toutput_buffer_length += length;\n\n\treturn output_buffer_length;\n}\n\nint pdu_decode(const unsigned char* buffer, int buffer_length,\n\t       time_t* output_sms_time,\n\t       char* output_sender_phone_number, int sender_phone_number_size,\n\t       char* output_sms_text, int sms_text_size,\n\t       int* tp_dcs,\n\t       int* ref_number,\n\t       int* total_parts,\n\t       int* part_number,\n\t       int* skip_bytes)\n{\n\t\n\tif (buffer_length <= 0)\n\t\treturn -1;\n\n\tconst int sms_deliver_start = 1 + buffer[0];\n\tif (sms_deliver_start + 1 > buffer_length)\n\t\treturn -2;\n\n\tconst int user_data_header_length = (buffer[sms_deliver_start]>>4);\n\n\tconst int sender_number_length = buffer[sms_deliver_start + 1];\n\tif (sender_number_length + 1 > sender_phone_number_size)\n\t\treturn -3;  // Buffer too small to hold decoded phone number.\n\n\tconst int sender_type_of_address = buffer[sms_deliver_start + 2];\n\tif (sender_type_of_address == TYPE_OF_ADDRESS_ALPHANUMERIC) {\n\t\tint sender_len1 = DecodePDUMessage_GSM_7bit(buffer + sms_deliver_start + 3, (sender_number_length + 1) / 2, output_sender_phone_number, sender_number_length);\n\t\tint sender_len2 = G7bitToAscii(output_sender_phone_number, sender_len1 - 1);\n\t\toutput_sender_phone_number[sender_len2] = 0;\n\t} else {\n\t\tDecodePhoneNumber(buffer + sms_deliver_start + 3, sender_number_length, output_sender_phone_number);\n\t}\n\n\tconst int sms_pid_start = sms_deliver_start + 3 + (buffer[sms_deliver_start + 1] + 1) / 2;\n\n\t// Decode timestamp.\n\tstruct tm sms_broken_time;\n\tsms_broken_time.tm_year = 100 + SwapDecimalNibble(buffer[sms_pid_start + 2]);\n\tsms_broken_time.tm_mon  = SwapDecimalNibble(buffer[sms_pid_start + 3]) - 1;\n\tsms_broken_time.tm_mday = SwapDecimalNibble(buffer[sms_pid_start + 4]);\n\tsms_broken_time.tm_hour = SwapDecimalNibble(buffer[sms_pid_start + 5]);\n\tsms_broken_time.tm_min  = SwapDecimalNibble(buffer[sms_pid_start + 6]);\n\tsms_broken_time.tm_sec  = SwapDecimalNibble(buffer[sms_pid_start + 7]);\n\t(*output_sms_time) = timegm(&sms_broken_time);\n\n\tconst int sms_start = sms_pid_start + 2 + 7;\n\tif (sms_start + 1 > buffer_length) return -1;  // Invalid input buffer.\n\n\tint tmp;\n\tif((user_data_header_length&0x04)==0x04) {\n\t\ttmp = buffer[sms_start + 1] + 1;\n\t\t*skip_bytes = tmp;\n\t\t*ref_number = 0x000000FF&buffer[sms_start + tmp - 2];\n\t\t*total_parts = 0x000000FF&buffer[sms_start + tmp - 1];\n\t\t*part_number = 0x000000FF&buffer[sms_start + tmp];\n\t} else {\n\t\ttmp = 0;\n\t\t*skip_bytes = tmp;\n\t\t*ref_number = tmp;\n\t\t*total_parts = tmp;\n\t\t*part_number = tmp;\n\t}\n\n\tint output_sms_text_length = buffer[sms_start];\n\tif (sms_text_size < output_sms_text_length) return -1;  // Cannot hold decoded buffer.\n\n\tconst int sms_tp_dcs_start = sms_pid_start + 1;\n\t*tp_dcs = buffer[sms_tp_dcs_start];\n\n\tswitch((*tp_dcs / 4) % 4)\n\t{\n\t\tcase 0:\n\t\t\t{\n\t\t\t\t// GSM 7 bit\n\t\t\t\tint decoded_sms_text_size = DecodePDUMessage_GSM_7bit(buffer + sms_start + 1, buffer_length - (sms_start + 1),\n\t\t\t\t\t\t\t   output_sms_text, output_sms_text_length);\n\t\t\t\tif (decoded_sms_text_size != output_sms_text_length) return -1;  // Decoder length is not as expected.\n\t\t\t\toutput_sms_text_length = G7bitToAscii(output_sms_text, output_sms_text_length);\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase 2:\n\t\t\t{\n\t\t\t\t// UCS2\n\t\t\t\tmemcpy(output_sms_text, buffer + sms_start + 1, output_sms_text_length);\n\t\t\t\tbreak;\n\t\t\t}\n\t\tdefault:\n\t\tbreak;\n\t}\n\n\t// Add a C string end.\n\tif (output_sms_text_length < sms_text_size)\n\t\toutput_sms_text[output_sms_text_length] = 0;\n\telse\n\t\toutput_sms_text[sms_text_size-1] = 0;\n\n\treturn output_sms_text_length;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/extlib/pdu.h",
    "content": "/*\n * 2017 - 2021 Cezary Jackiewicz <cezary@eko.one.pl>\n * 2014 lovewilliam <ztong@vt.edu>\n */\n// Copyright 2011 The Avalon Project Authors. All rights reserved.\n// Use of this source code is governed by the Apache License 2.0\n// that can be found in the LICENSE file.\n#ifndef SMS_PDU_H_\n#define SMS_PDU_H_\n\n#include <time.h>\n\nenum { SMS_MAX_PDU_LENGTH  = 256 };\n\n/* \n * Encode an SMS message. Output the encoded message into output pdu buffer.\n * Returns the length of the SMS encoded message in the output buffer or\n * a negative number in case encoding failed (for example provided output buffer\n * does not have enough space).\n */\nint pdu_encode(const char* service_center_number, const char* phone_number, const char* text,\n\t      unsigned char* pdu, int pdu_size);\n\n/* \n * Decode an SMS message. Output the decoded message into the sms text buffer.\n * Returns the length of the SMS dencoded message or a negative number in\n * case encoding failed (for example provided output buffer has not enough\n * space).\n */\nint pdu_decode(const unsigned char* pdu, int pdu_len,\n\t       time_t* sms_time,\n\t       char* phone_number, int phone_number_size,\n\t       char* text, int text_size,\n\t       int* tp_dcs,\n\t       int* ref_number,\n\t       int* total_parts,\n\t       int* part_number,\n\t       int* skip_bytes);\n\nint ucs2_to_utf8 (int ucs2, unsigned char * utf8);\n\nint DecodePDUMessage_GSM_7bit(const unsigned char* buffer,\n\t\t\t      int buffer_length,\n\t\t\t      char* output_sms_text,\n\t\t\t      int sms_text_length);\n\nint EncodePDUMessage(const char* sms_text,\n\t\t     int sms_text_length,\n\t\t     unsigned char* output_buffer,\n\t\t     int buffer_size);\n\n#endif   // SMS_SMS_H_\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/extlib/pdu_decoder.c",
    "content": "/*\n * 2014 lovewilliam <ztong@vt.edu>\n * SMS PDU Decoder\n */\n#include \"pdu.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n#include <wchar.h>\n\nint ucs2_to_utf8 (int ucs2, unsigned char * utf8);\n\nint sms_decode()\n{\n\tchar buffer[2*SMS_MAX_PDU_LENGTH+4];\n\tchar *p = buffer;\n\tchar t[2];\n\tint d;\n\tdo\n\t{\n\t\tt[0] = getchar();\n\t\tif(t[0]=='\\n')\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\tt[1] = getchar();\n\t\tif(t[1]=='\\n')\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\t*p = strtol(t,NULL,16);\n\t\tp++;\n\t}while(1);\n\n\ttime_t sms_time;\n\tchar sms_phone[40];\n\tchar sms_text[161];\n\tint tp_dcs_type;\n\tint ref_number;\n\tint total_parts;\n\tint part_number;\n\tint skip_bytes;\n\n\tint sms_text_length = pdu_decode((const unsigned char*)buffer,\n\t\t\t\t\tsizeof(buffer),\n\t\t\t\t\t&sms_time,\n\t\t\t\t\tsms_phone, sizeof(sms_phone),\n\t\t\t\t\tsms_text, sizeof(sms_text),\n\t\t\t\t\t&tp_dcs_type,\n\t\t\t\t\t&ref_number,\n\t\t\t\t\t&total_parts,\n\t\t\t\t\t&part_number,\n\t\t\t\t\t&skip_bytes);\n\n\tprintf(\"From:%s\\n\",sms_phone);\n\tprintf(\"Textlen=%d\\n\",sms_text_length);\n\tchar time_data_str[64];\n\tstrftime(time_data_str,64,\"%D %T\", localtime(&sms_time));\n\tprintf(\"Date/Time:%s\\n\",time_data_str);\n\n\tif (total_parts > 0) {\n\t\tprintf(\"Reference number: %d\\n\", ref_number);\n\t\tprintf(\"SMS segment %d of %d\\n\", part_number, total_parts);\n\t}\n\n\tswitch((tp_dcs_type / 4) % 4)\n\t{\n\t\tcase 0:\n\t\t\t{\n\t\t\t\t// GSM7 bit\n\t\t\t\tint i = skip_bytes;\n\t\t\t\tif(skip_bytes > 0) i = (skip_bytes*8+6)/7;\n\t\t\t\tfor(;i<sms_text_length;i++)\n\t\t\t\t{\n\t\t\t\t\tprintf(\"%c\", sms_text[i]);\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\tcase 2:\n\t\t\t{\n\t\t\t\t// UCS2\n\t\t\t\tfor(int i = skip_bytes;i<sms_text_length;i+=2)\n\t\t\t\t{\n\t\t\t\t\tint ucs2_char = 0x000000FF&sms_text[i+1];\n\t\t\t\t\tucs2_char|=(0x0000FF00&(sms_text[i]<<8));\n\t\t\t\t\tunsigned char utf8_char[5];\n\t\t\t\t\tint len = ucs2_to_utf8(ucs2_char,utf8_char);\n\t\t\t\t\tint j;\n\t\t\t\t\tfor(j=0;j<len;j++)\n\t\t\t\t\t{\n\t\t\t\t\t\tprintf(\"%c\",utf8_char[j]);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\tdefault:\n\t\t\tbreak;\n\t}\n\n\tprintf(\"\\n\");\n\n\treturn 0;\n}\n\nint main()\n{\n\treturn sms_decode();\n}\n\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/extlib/ucs2_to_utf8.c",
    "content": "/*\n * 2014 lovewilliam <ztong@vt.edu>\n * from http://www.lemoda.net/c/ucs2-to-utf8/ucs2-to-utf8.c\n */\n/* Input: a Unicode code point, \"ucs2\". \n\n   Output: UTF-8 characters in buffer \"utf8\". \n\n   Return value: the number of bytes written into \"utf8\", or -1 if\n   there was an error.\n\n   This adds a zero byte to the end of the string. It assumes that the\n   buffer \"utf8\" has at least four bytes of space to write to. */\n\n#define UNICODE_SURROGATE_PAIR -2\n#define UNICODE_BAD_INPUT -1\n\nint ucs2_to_utf8 (int ucs2, unsigned char * utf8)\n{\n    if (ucs2 < 0x80) {\n        utf8[0] = ucs2;\n        utf8[1] = '\\0';\n        return 1;\n    }\n    if (ucs2 >= 0x80  && ucs2 < 0x800) {\n        utf8[0] = (ucs2 >> 6)   | 0xC0;\n        utf8[1] = (ucs2 & 0x3F) | 0x80;\n        utf8[2] = '\\0';\n        return 2;\n    }\n    if (ucs2 >= 0x800 && ucs2 < 0xFFFF) {\n\tif (ucs2 >= 0xD800 && ucs2 <= 0xDFFF) {\n\t    /* Ill-formed. */\n\t    return UNICODE_SURROGATE_PAIR;\n\t}\n        utf8[0] = ((ucs2 >> 12)       ) | 0xE0;\n        utf8[1] = ((ucs2 >> 6 ) & 0x3F) | 0x80;\n        utf8[2] = ((ucs2      ) & 0x3F) | 0x80;\n        utf8[3] = '\\0';\n        return 3;\n    }\n    if (ucs2 >= 0x10000 && ucs2 < 0x10FFFF) {\n\t/* http://tidy.sourceforge.net/cgi-bin/lxr/source/src/utf8.c#L380 */\n\tutf8[0] = 0xF0 | (ucs2 >> 18);\n\tutf8[1] = 0x80 | ((ucs2 >> 12) & 0x3F);\n\tutf8[2] = 0x80 | ((ucs2 >> 6) & 0x3F);\n\tutf8[3] = 0x80 | ((ucs2 & 0x3F));\n        utf8[4] = '\\0';\n        return 4;\n    }\n    return UNICODE_BAD_INPUT;\n}\n\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/main.c",
    "content": "#include \"main.h\"\n\nPROFILE_T s_profile;   // global profile\ntransport_t s_transport; // global transport\n\nint parse_user_input(int argc, char *argv[], PROFILE_T *profile)\n{\n    int opt = 1;\n    int anonymous_arg = 0;\n    int option;\n    profile->sms_index = -1;\n#define has_more_argv() (opt < argc ? 1 : 0)\n    while (opt < argc)\n    {\n        if (argv[opt][0] != '-') {\n            if (anonymous_arg == 0) {\n                profile->tty_dev = argv[opt];\n            }\n            if (anonymous_arg == 1){\n                profile->at_cmd = argv[opt];\n            }\n            if (anonymous_arg >= 2) {\n                err_msg(\"Too many anonymous arguments\");\n                return INVALID_PARAM;\n            }\n            anonymous_arg++;\n            opt++;\n            continue;\n        }\n\n        option = match_option(argv[opt]);\n        if (option == -1)\n        {\n            usage(argv[0]);\n            return INVALID_PARAM;\n        }\n        opt++;\n        switch (option)\n        {\n        case AT_CMD:\n            if (!has_more_argv())\n            {\n                usage(argv[0]);\n                return INVALID_PARAM;\n            }\n            profile->at_cmd = argv[opt++];\n            break;\n        case TTY_DEV:\n            if (!has_more_argv())\n            {\n                usage(argv[0]);\n                return INVALID_PARAM;\n            }\n            profile->tty_dev = argv[opt++];\n            break;\n        case BAUD_RATE:\n            if (!has_more_argv())\n            {\n                usage(argv[0]);\n                return INVALID_PARAM;\n            }\n            profile->baud_rate = atoi(argv[opt++]);\n            break;\n        case DATA_BITS:\n            if (!has_more_argv())\n            {\n                usage(argv[0]);\n                return INVALID_PARAM;\n            }\n            profile->data_bits = atoi(argv[opt++]);\n            break;\n        case PARITY:\n            if (!has_more_argv())\n            {\n                usage(argv[0]);\n                return INVALID_PARAM;\n            }\n            profile->parity = argv[opt++];\n            break;\n        case STOP_BITS:\n            if (!has_more_argv())\n            {\n                usage(argv[0]);\n                return INVALID_PARAM;\n            }\n            profile->stop_bits = atoi(argv[opt++]);\n            break;\n        case FLOW_CONTROL:\n            if (!has_more_argv())\n            {\n                usage(argv[0]);\n                return INVALID_PARAM;\n            }\n            profile->flow_control = argv[opt++];\n            break;\n        case TIMEOUT:\n            if (!has_more_argv())\n            {\n                usage(argv[0]);\n                return INVALID_PARAM;\n            }\n            profile->timeout = atoi(argv[opt++]);\n            break;\n        case OPERATION:\n            if (!has_more_argv())\n            {\n                usage(argv[0]);\n                return INVALID_PARAM;\n            }\n            profile->op = match_operation(argv[opt++]);\n            break;\n        case DEBUG:\n            profile->debug = 1;\n            break;\n        case SMS_PDU:\n            if (!has_more_argv())\n            {\n                usage(argv[0]);\n                return INVALID_PARAM;\n            }\n            profile->sms_pdu = argv[opt++];\n            break;\n        case SMS_INDEX:\n            if (!has_more_argv())\n            {\n                usage(argv[0]);\n                return INVALID_PARAM;\n            }\n            profile->sms_index = atoi(argv[opt++]);\n            break;\n        case GREEDY_READ:\n            profile->greedy_read = 1;\n            break;\n        case USE_UBUS:\n#ifdef ENABLE_UBUS_DAEMON\n            profile->transport = TRANSPORT_UBUS;\n#else\n            err_msg(\"UBUS daemon support not compiled in\");\n            return INVALID_PARAM;\n#endif\n            break;\n        default:\n            err_msg(\"Invalid option: %s\", argv[opt]);\n            break;\n        }\n    }\n\n    // default settings:\n    if (profile->tty_dev == NULL)\n    {\n        usage(argv[0]);\n        return INVALID_PARAM;\n    }\n    if (profile->baud_rate == 0 )\n    {\n        profile->baud_rate = 115200;\n    }\n    if (profile->data_bits == 0)\n    {\n        profile->data_bits = 8;\n    }\n    if (profile->timeout == 0)\n    {\n        profile->timeout = 3;\n    }\n    if (profile->op == 0 || profile->op == -1)\n    {\n        profile->op = AT_OP;\n    }\n    \n    // Default transport is TTY\n    if (profile->transport != TRANSPORT_UBUS)\n    {\n        profile->transport = TRANSPORT_TTY;\n    }\n    \n    return SUCCESS;\n}\n\nint run_op(PROFILE_T *profile, void *transport)\n{\n    int ret;\n    switch (profile->op)\n    {\n    case AT_OP:\n        return at(profile, transport);\n    case BINARY_AT_OP:\n        return binary_at(profile, transport);\n    case SMS_READ_OP:\n        return sms_read(profile, transport);\n    case SMS_SEND_OP:\n        ret = sms_send(profile, transport);\n        switch (ret)\n        {\n        case SUCCESS:\n            printf(\"{\\\"status\\\":\\\"success\\\"}\");\n            break;\n        case SEND_SMS_FAILED:\n            printf(\"{\\\"status\\\":\\\"failed\\\",\\\"reason\\\":\\\"send_sms_failed\\\"}\");\n            break;\n        case INVALID_PARAM:\n            printf(\"{\\\"status\\\":\\\"failed\\\",\\\"reason\\\":\\\"invalid_param\\\"}\");\n            break;\n        case COMM_ERROR:\n            printf(\"{\\\"status\\\":\\\"failed\\\",\\\"reason\\\":\\\"comm_error\\\"}\");\n            break;\n        default:\n            printf(\"{\\\"status\\\":\\\"failed\\\",\\\"reason\\\":\\\"unknown_error\\\"}\");\n            break;\n        }\n        return ret;\n    case SMS_DELETE_OP:\n        return sms_delete(profile, transport);\n    case SMS_UNREAD_OP:\n        return sms_read_unread(profile, transport);\n    case SMS_MARK_READ_OP:\n        return sms_mark_read(profile, transport);\n    default:\n        err_msg(\"Invalid operation\");\n    }\n    return UNKNOWN_ERROR;\n}\n\nstatic void clean_up(int sig __attribute__((unused)))\n{\n    dbg_msg(\"Clean up success\");\n    \n    // Cleanup transport\n    transport_cleanup(&s_transport);\n    \n#ifdef USE_SEMAPHORE\n    if (s_profile.transport == TRANSPORT_TTY && unlock_at_port(s_profile.tty_dev))\n    {\n        err_msg(\"Failed to unlock tty device\");\n    }\n#endif\n}\n\nstatic void atexit_cleanup(void)\n{\n    clean_up(0);\n}\n\nstatic void signal_cleanup(int sig __attribute__((unused)))\n{\n    clean_up(sig);\n}\n\nint main(int argc, char *argv[])\n{\n    PROFILE_T *profile = &s_profile;\n    parse_user_input(argc, argv, profile);\n    dump_profile();\n    \n    // Initialize transport layer\n    if (transport_init(&s_transport, profile->transport) != SUCCESS) {\n        err_msg(\"Failed to initialize transport layer\");\n        return COMM_ERROR;\n    }\n    \n    // Setup cleanup and signal handlers\n    atexit(atexit_cleanup);\n    signal(SIGINT, signal_cleanup);\n    signal(SIGTERM, signal_cleanup);\n    \n#ifdef USE_SEMAPHORE\n    if (profile->op == CLEANUP_SEMAPHORE_OP)\n    {\n        if (unlock_at_port(profile->tty_dev))\n        {\n            err_msg(\"Failed to unlock tty device\");\n        }\n        return SUCCESS;\n    }\n    \n    // Only use semaphore locking for TTY transport\n    if (profile->transport == TRANSPORT_TTY && profile->tty_dev != NULL)\n    {\n        if (lock_at_port(profile->tty_dev))\n        {\n            err_msg(\"Failed to lock tty device\");\n            return COMM_ERROR;\n        }\n    }\n#endif\n    \n    // Open device\n    if (transport_open_device(&s_transport, profile) != SUCCESS)\n    {\n        err_msg(\"Failed to open device\");\n        return COMM_ERROR;\n    }\n    \n    // Run operation\n    if (run_op(profile, &s_transport))\n    {\n        err_msg(\"Failed to run operation %d\", profile->op);\n#ifdef USE_SEMAPHORE\n        if (profile->transport == TRANSPORT_TTY && unlock_at_port(profile->tty_dev))\n        {\n            err_msg(\"Failed to unlock tty device\");\n        }\n#endif\n        kill(getpid(), SIGINT); \n    }\n    \n    dbg_msg(\"Exit\");\n    return SUCCESS;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/main.h",
    "content": "#ifndef _MAIN_H_\n#define _MAIN_H_\n#include <stdio.h>\n#include <string.h>\n#include <unistd.h>\n#include <fcntl.h>\n#include <stdlib.h>\n#include <termios.h>\n#include <signal.h>\n#include <sys/select.h>\n#include <errno.h>\n#include \"operations.h\"\n#include \"transport.h\"\n#include \"modem_types.h\"\n#include \"utils.h\"\n\n#define DEFAULT_TIMEOUT 3\n\nextern PROFILE_T s_profile;   // global profile     \n\n// Operation dispatcher\nextern int run_op(PROFILE_T *profile, void *transport);\n\nextern void dump_profile();\n\nextern int match_option(char *option_name);\n\nextern int match_operation(char *operation_name);\n\nextern int usage(char* name);\n\n#endif\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/modem_types.h",
    "content": "\n#ifndef _MODEM_TYPES_H_\n#define _MODEM_TYPES_H_\n#include <stdio.h>\n#include <termios.h>\n#include <time.h>\n//options\n#define AT_CMD_S 'c'\n#define TTY_DEV_S 'd'\n#define BAUD_RATE_S 'b'\n#define DATA_BITS_S 'B'\n#define PARITY_S 'P'\n#define STOP_BITS_S 'S'\n#define FLOW_CONTROL_S 'F'\n#define TIMEOUT_S 't'\n#define OPERATION_S 'o'\n#define DEBUG_S 'D'\n#define SMS_PDU_S 'p'\n#define SMS_INDEX_S 'i'\n#define GREEDY_READ_S 'g'\n#define USE_UBUS_S 'u'\n\n#define AT_CMD_L \"at_cmd\"\n#define TTY_DEV_L \"tty_dev\"\n#define BAUD_RATE_L \"baud_rate\"\n#define DATA_BITS_L \"data_bits\"\n#define PARITY_L \"parity\"\n#define STOP_BITS_L \"stop_bits\"\n#define FLOW_CONTROL_L \"flow_control\"\n#define TIMEOUT_L \"timeout\"\n#define OPERATION_L \"operation\"\n#define DEBUG_L \"debug\"\n#define SMS_PDU_L \"sms_pdu\"\n#define SMS_INDEX_L \"sms_index\"\n#define GREEDY_READ_L \"greedy_read\"\n#define USE_UBUS_L \"use_ubus\"\n\n//operations\n#define AT_OP_S 'a'\n#define AT_OP_L \"at\"\n#define BINARY_AT_OP_S 'b'\n#define BINARY_AT_OP_L \"binary_at\"\n#define SMS_READ_OP_S 'r'\n#define SMS_READ_OP_L \"sms_read\"\n#define SMS_SEND_OP_S 's'\n#define SMS_SEND_OP_L \"sms_send\"\n#define SMS_DELETE_OP_S 'd'\n#define SMS_DELETE_OP_L \"sms_delete\"\n#define SMS_UNREAD_OP_S 'u'\n#define SMS_UNREAD_OP_L \"unread_sms\"\n#define SMS_MARK_READ_OP_S 'm'\n#define SMS_MARK_READ_OP_L \"mark_read\"\n#define AT_SENDONLY_OP_S 'o'\n#define AT_SENDONLY_OP_L \"at_sendonly\"\n#ifdef USE_SEMAPHORE\n#define CLEANUP_SEMAPHORE_OP_S 'C'\n#define CLEANUP_SEMAPHORE_OP_L \"cleanup\"\n#endif\n#define SET_READ_STORAGE \"AT+CPMS=\\\"%s\\\"\"\n#define SET_PDU_FORMAT \"AT+CMGF=0\"\n#define READ_ALL_SMS \"AT+CMGL=4\"\n#define READ_UNREAD_SMS \"AT+CMGL=0\"\n#define MARK_SMS_READ \"AT+CMGR=%d\"\n#define SEND_SMS \"AT+CMGS=%d\\r\\n\"\n#define DELETE_SMS \"AT+CMGD=%d\"\n\n#define SMS_BUF_SIZE 262144\n#define LINE_BUF 1024\n#define SMS_LIST_SIZE 512\n#define COMMON_BUF_SIZE 262144\n#define PHONE_NUMBER_SIZE 64\n#define SMS_TEXT_SIZE 512\n#define SMS_PDU_STR_SIZE 512\n#define SMS_PDU_HEX_SIZE 512\n\n// Transport layer enumeration\ntypedef enum {\n    TRANSPORT_TTY = 0,\n    TRANSPORT_UBUS = 1\n} transport_type_t;\n\n// at_tool profile\ntypedef struct _PROFILE {\n    // AT command\n    // TTY device\n    // Baud rate\n    // Data bits\n    // Parity\n    // Stop bits\n    // Flow control\n    // Timeout\n    // operation\n    // debug mode\n    char *at_cmd;\n    char *tty_dev;\n    int baud_rate;\n    int data_bits;\n    char *parity;\n    int stop_bits;\n    char *flow_control;\n    int timeout;\n    int op;\n    int debug;\n    char *sms_pdu;\n    int sms_index;\n    int greedy_read;\n    transport_type_t transport;  // Choose between TTY and UBUS\n    void *transport_ctx;         // Transport-specific context\n} PROFILE_T;\n\n\ntypedef struct _FDS {\n    int tty_fd;\n    struct termios old_termios;\n    FILE *fdi;\n    FILE *fdo;\n} FDS_T;\n\ntypedef struct _SMS {\n    int sms_index;\n    int sms_lenght;\n    int ref_number;\n    int segment_number;\n    time_t timestamp;\n    int total_segments;\n    int type;\n    char *sender;\n    char *sms_text;\n    char *sms_pdu;\n} SMS_T;\n\ntypedef struct _AT_MESSAGE {\n    char *message;\n    int len;\n} AT_MESSAGE_T;\n\nenum ERROR_CODES {\n    COMM_ERROR = -1,\n    SUCCESS = 0,\n    KEYWORD_NOT_MATCH,\n    TIMEOUT_WAITING_NEWLINE,\n    INVALID_PARAM,\n    INVALID_HEX,\n    UNKNOWN_ERROR,\n    BUFFER_OVERFLOW,\n    SEND_SMS_FAILED\n};\n\nenum SMS_CHARSET {\n    SMS_CHARSET_7BIT,\n    SMS_CHARSET_UCS2\n}; \n\nenum OPTIONS {\n    AT_CMD,\n    TTY_DEV,\n    BAUD_RATE,\n    DATA_BITS,\n    PARITY,\n    STOP_BITS,\n    FLOW_CONTROL,\n    TIMEOUT,\n    OPERATION,\n    DEBUG,\n    SMS_PDU,\n    SMS_INDEX,\n    GREEDY_READ,\n    USE_UBUS\n};\n\nenum OPERATIONS {\n    NULL_OP,\n    AT_OP,\n    BINARY_AT_OP,\n    SMS_READ_OP,\n    SMS_SEND_OP,\n    SMS_DELETE_OP,\n    SMS_UNREAD_OP,\n    SMS_MARK_READ_OP,\n    AT_SENDONLY_OP,\n    CLEANUP_SEMAPHORE_OP\n};\n\n#endif\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/operations.c",
    "content": "#include \"operations.h\"\n\nint at(PROFILE_T *profile, void *transport_ptr)\n{\n    transport_t *transport = (transport_t *)transport_ptr;\n    char *response_text = NULL;\n    \n    if (profile->at_cmd == NULL)\n    {\n        err_msg(\"AT command is empty\");\n        return INVALID_PARAM;\n    }\n    \n    int result = transport_send_at_with_response(transport, profile, profile->at_cmd, NULL, 0, &response_text);\n    \n    if (response_text) {\n        user_msg(\"%s\", response_text);\n        free(response_text);\n    }\n    \n    return result;\n}\n\nint binary_at(PROFILE_T *profile, void *transport_ptr)\n{\n    transport_t *transport = (transport_t *)transport_ptr;\n    char *response_text = NULL;\n    \n    if (profile->at_cmd == NULL)\n    {\n        err_msg(\"AT command is empty\");\n        return INVALID_PARAM;\n    }\n\n    if (strlen(profile->at_cmd) % 2 != 0)\n    {\n        err_msg(\"Invalid AT command length\");\n        return INVALID_PARAM;\n    }\n    \n    // Send as raw hex command\n    int result = transport_send_at_with_response(transport, profile, profile->at_cmd, \"OK\", 1, &response_text);\n    \n    if (response_text) {\n        user_msg(\"%s\", response_text);\n        free(response_text);\n    }\n    \n    return result;\n}\n\nint sms_delete(PROFILE_T *profile, void *transport_ptr)\n{\n    transport_t *transport = (transport_t *)transport_ptr;\n    \n    if (profile->sms_index < 0)\n    {\n        err_msg(\"SMS index is empty\");\n        return INVALID_PARAM;\n    }\n    \n    char delete_sms_cmd[32];\n    snprintf(delete_sms_cmd, 32, DELETE_SMS, profile->sms_index);\n    \n    int result = transport_send_at_with_response(transport, profile, delete_sms_cmd, \"OK\", 0, NULL);\n    \n    if (result != SUCCESS) {\n        dbg_msg(\"Error deleting SMS, error code: %d\", result);\n    }\n    \n    return result;\n}\n\nint sms_read(PROFILE_T *profile, void *transport_ptr)\n{\n    transport_t *transport = (transport_t *)transport_ptr;\n    SMS_T *sms_list[SMS_LIST_SIZE];\n    SMS_T *sms;\n    char *response_text = NULL;\n    int result;\n\n    // Set PDU format\n    result = transport_send_at_with_response(transport, profile, SET_PDU_FORMAT, \"OK\", 0, NULL);\n    if (result != SUCCESS)\n    {\n        dbg_msg(\"Error setting PDU format, error code: %d\", result);\n        return result;\n    }\n    dbg_msg(\"Set PDU format success\");\n\n    // Read all SMS\n    result = transport_send_at_with_response(transport, profile, READ_ALL_SMS, \"OK\", 0, &response_text);\n    if (result != SUCCESS)\n    {\n        dbg_msg(\"Error reading SMS, error code: %d\", result);\n        return result;\n    }\n\n    if (response_text)\n    {\n        char *line = strtok(response_text, \"\\n\");\n        int sms_count = 0;\n        char *pdu;\n\n        while (line != NULL)\n        {\n            if (strncmp(line, \"+CMGL:\", 6) == 0)\n            {\n                sms = (SMS_T *)malloc(sizeof(SMS_T));\n                memset(sms, 0, sizeof(SMS_T));\n                \n                pdu = strtok(NULL, \"\\n\");\n                if (pdu == NULL || strlen(pdu) < 3) {\n                    dbg_msg(\"No PDU found for line: %s\", line);\n                    pdu = strtok(NULL, \"\\n\");\n                }\n                sms->sms_pdu = (char *)malloc(strlen(pdu));\n                sms->sender = (char *)malloc(PHONE_NUMBER_SIZE);\n                sms->sms_text = (char *)malloc(SMS_TEXT_SIZE);\n                memset(sms->sms_text, 0, SMS_TEXT_SIZE);\n                sms->sms_index = get_sms_index(line);\n                memcpy(sms->sms_pdu, pdu, strlen(pdu));\n                int sms_len = decode_pdu(sms);\n                if (sms_len > 0)\n                {\n                    sms_list[sms_count] = sms;\n                    sms_count++;\n                }\n                else\n                {\n                    dbg_msg(\"Error decoding SMS in line: %s\", line);\n                    destroy_sms(sms);\n                }\n            }\n            line = strtok(NULL, \"\\n\");\n\n        }\n\n        display_sms_in_json(sms_list, sms_count);\n        free(response_text);\n    }\n\n    dbg_msg(\"Read SMS success\");\n    return SUCCESS;\n}\n\nint sms_send(PROFILE_T *profile, void *transport_ptr) \n{\n    transport_t *transport = (transport_t *)transport_ptr;\n    \n    if (profile->sms_pdu == NULL) {\n        err_msg(\"SMS PDU is empty\");\n        return INVALID_PARAM;\n    }\n\n    int pdu_len = strlen(profile->sms_pdu);\n    int pdu_expected_len = (pdu_len) / 2 - 1;\n    char send_sms_cmd[32];\n    char pdu_hex[512];\n    char send_sms_cmd2[514];\n    char *send_sms_response = NULL;\n    int result;\n    int ascii_code;\n    \n    // Set PDU format\n    result = transport_send_at_with_response(transport, profile, SET_PDU_FORMAT, \"OK\", 0, NULL);\n    if (result != SUCCESS) {\n        dbg_msg(\"Error setting PDU format, error code: %d\", result);\n        return result;\n    }\n    dbg_msg(\"Set PDU format success\");\n\n    snprintf(send_sms_cmd, 32, SEND_SMS, pdu_expected_len);\n    for (int i = 0; i < pdu_len; i++) {\n        //将字符串转换成字符串对应的十六进制的字符串\n        ascii_code = profile->sms_pdu[i];\n        snprintf(pdu_hex + (i * 2), 3, \"%02X\", ascii_code);\n    }\n    pdu_hex[pdu_len * 2] = '\\0'; // Add the end of transmission character\n    snprintf(send_sms_cmd2, 514, \"%s%s\", pdu_hex, \"1A\"); // Append Ctrl+Z to indicate end of SMS\n\n    // Send first AT command and wait for > prompt\n    transport_send_at_only(transport, profile, send_sms_cmd, 0);\n    dbg_msg(\"Send SMS command: %s\", send_sms_cmd);\n    dbg_msg(\"Write PDU command: %s\", send_sms_cmd2);\n    usleep(10000); // 10ms delay\n\n    // Send PDU data and wait for +CMGS response\n    result = transport_send_at_with_response(transport, profile, send_sms_cmd2, \"+CMGS:\", 1, &send_sms_response);\n    if (result != SUCCESS) {\n        dbg_msg(\"Error sending SMS PDU, error code: %d\", result);\n        return result;\n    }\n    // Check send SMS response (contain +CME ERROR or +CMS ERROR indicates failure and contain OK indicates success)\n    dbg_msg(\"Send SMS response: %s\", send_sms_response);\n    if (strstr(send_sms_response, \"ERROR\") != NULL) {\n        dbg_msg(\"Error sending SMS, response: %s\", send_sms_response);\n        free(send_sms_response);\n        return SEND_SMS_FAILED;\n    }\n    free(send_sms_response);\n    return SUCCESS;\n}\n\nint sms_read_unread(PROFILE_T *profile, void *transport_ptr)\n{\n    transport_t *transport = (transport_t *)transport_ptr;\n    SMS_T *sms_list[SMS_LIST_SIZE];\n    SMS_T *sms;\n    char *response_text = NULL;\n    int result;\n\n    // Set PDU format\n    result = transport_send_at_with_response(transport, profile, SET_PDU_FORMAT, \"OK\", 0, NULL);\n    if (result != SUCCESS)\n    {\n        dbg_msg(\"Error setting PDU format, error code: %d\", result);\n        return result;\n    }\n    dbg_msg(\"Set PDU format success\");\n\n    // Read unread SMS only\n    result = transport_send_at_with_response(transport, profile, READ_UNREAD_SMS, \"OK\", 0, &response_text);\n    if (result != SUCCESS)\n    {\n        dbg_msg(\"Error reading unread SMS, error code: %d\", result);\n        return result;\n    }\n\n    if (response_text)\n    {\n        char *line = strtok(response_text, \"\\n\");\n        int sms_count = 0;\n        char *pdu;\n        while (line != NULL)\n        {\n            if (strncmp(line, \"+CMGL:\", 6) == 0)\n            {\n                sms = (SMS_T *)malloc(sizeof(SMS_T));\n                memset(sms, 0, sizeof(SMS_T));\n                pdu = strtok(NULL, \"\\n\");\n                if (pdu == NULL || strlen(pdu) < 3) {\n                    dbg_msg(\"No PDU found for line: %s\", line);\n                    pdu = strtok(NULL, \"\\n\");\n                }\n                sms->sms_pdu = (char *)malloc(strlen(pdu));\n                sms->sender = (char *)malloc(PHONE_NUMBER_SIZE);\n                sms->sms_text = (char *)malloc(SMS_TEXT_SIZE);\n                memset(sms->sms_text, 0, SMS_TEXT_SIZE);\n                sms->sms_index = get_sms_index(line);\n                memcpy(sms->sms_pdu, pdu, strlen(pdu));\n                int sms_len = decode_pdu(sms);\n                if (sms_len > 0)\n                {\n                    sms_list[sms_count] = sms;\n                    sms_count++;\n                }\n                else\n                {\n                    dbg_msg(\"Error decoding SMS in line: %s\", line);\n                    destroy_sms(sms);\n                }\n            }\n            line = strtok(NULL, \"\\n\");\n        }\n\n        display_sms_in_json(sms_list, sms_count);\n        free(response_text);\n    }\n\n    dbg_msg(\"Read unread SMS success\");\n    return SUCCESS;\n}\n\nint sms_mark_read(PROFILE_T *profile, void *transport_ptr)\n{\n    transport_t *transport = (transport_t *)transport_ptr;\n    char mark_read_cmd[64];\n    int result;\n\n    if (profile->sms_index < 0)\n    {\n        err_msg(\"SMS index not specified\");\n        return INVALID_PARAM;\n    }\n\n    // Set PDU format\n    result = transport_send_at_with_response(transport, profile, SET_PDU_FORMAT, \"OK\", 0, NULL);\n    if (result != SUCCESS)\n    {\n        dbg_msg(\"Error setting PDU format, error code: %d\", result);\n        return result;\n    }\n\n    // Mark SMS as read by reading it\n    snprintf(mark_read_cmd, 64, MARK_SMS_READ, profile->sms_index);\n    result = transport_send_at_with_response(transport, profile, mark_read_cmd, \"OK\", 0, NULL);\n    if (result != SUCCESS)\n    {\n        dbg_msg(\"Error marking SMS as read, error code: %d\", result);\n        return result;\n    }\n\n    dbg_msg(\"SMS %d marked as read\", profile->sms_index);\n    return SUCCESS;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/operations.h",
    "content": "#ifndef OPERATION_H\n#define OPERATION_H\n#include \"modem_types.h\"\n#include \"transport.h\"\n#include \"utils.h\"\n\nint str_to_hex(char *str, char *hex);\n\n// Unified operations using transport layer\nint at(PROFILE_T *profile, void *transport);\nint binary_at(PROFILE_T *profile, void *transport);\nint sms_read(PROFILE_T *profile, void *transport);\nint sms_send(PROFILE_T *profile, void *transport);\nint sms_delete(PROFILE_T *profile, void *transport);\nint sms_read_unread(PROFILE_T *profile, void *transport);\nint sms_mark_read(PROFILE_T *profile, void *transport);\n\n#endif\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/transport.c",
    "content": "#include \"transport.h\"\n#include \"utils.h\"\n#include \"operations.h\"\n\n// TTY transport operations implementation\nstatic int tty_send_at_with_response(PROFILE_T *profile, const char *at_cmd, const char *end_flag, int is_raw, char **response_text) {\n    FDS_T *fds = (FDS_T *)profile->transport_ctx;\n    if (!fds || !fds->fdo || !fds->fdi) {\n        err_msg(\"TTY device not opened\");\n        return COMM_ERROR;\n    }\n\n    int w_ret, r_ret;\n    AT_MESSAGE_T message = {0};\n\n    if (is_raw) {\n        char *binary_cmd = malloc(strlen(at_cmd) / 2 + 1);\n        if (!binary_cmd) {\n            err_msg(\"Memory allocation failed\");\n            return COMM_ERROR;\n        }\n        \n        int hex_ret = str_to_hex((char*)at_cmd, binary_cmd);\n        if (hex_ret) {\n            free(binary_cmd);\n            err_msg(\"Invalid hex string\");\n            return INVALID_HEX;\n        }\n        \n        w_ret = tty_write_raw(fds->fdo, binary_cmd);\n        free(binary_cmd);\n    } else {\n        w_ret = tty_write(fds->fdo, at_cmd);\n    }\n\n    if (w_ret) {\n        err_msg(\"Failed to write AT command\");\n        return w_ret;\n    }\n\n    if (end_flag) {\n        r_ret = tty_read_keyword(fds->fdi, &message, (char*)end_flag, profile);\n    } else {\n        r_ret = tty_read(fds->fdi, &message, profile);\n    }\n\n    if (r_ret && r_ret != KEYWORD_NOT_MATCH) {\n        dbg_msg(\"Error reading AT response, error code: %d\", r_ret);\n        if (message.message) {\n            free(message.message);\n        }\n        return r_ret;\n    }\n\n    if (response_text && message.message) {\n        *response_text = message.message;\n    } else if (message.message) {\n        free(message.message);\n    }\n\n    return (r_ret == KEYWORD_NOT_MATCH) ? r_ret : SUCCESS;\n}\n\nstatic int tty_send_at_only(PROFILE_T *profile, const char *at_cmd, int is_raw) {\n    FDS_T *fds = (FDS_T *)profile->transport_ctx;\n    if (!fds || !fds->fdo) {\n        err_msg(\"TTY device not opened\");\n        return COMM_ERROR;\n    }\n\n    int w_ret;\n    if (is_raw) {\n        char *binary_cmd = malloc(strlen(at_cmd) / 2 + 1);\n        if (!binary_cmd) {\n            err_msg(\"Memory allocation failed\");\n            return COMM_ERROR;\n        }\n        \n        int hex_ret = str_to_hex((char*)at_cmd, binary_cmd);\n        if (hex_ret) {\n            free(binary_cmd);\n            err_msg(\"Invalid hex string\");\n            return INVALID_HEX;\n        }\n        \n        w_ret = tty_write_raw(fds->fdo, binary_cmd);\n        free(binary_cmd);\n    } else {\n        w_ret = tty_write(fds->fdo, at_cmd);\n    }\n\n    return w_ret;\n}\n\nstatic int tty_open_device_transport(PROFILE_T *profile, void *ctx) {\n    FDS_T *fds = (FDS_T *)ctx;\n    return tty_open_device(profile, fds);\n}\n\nstatic int tty_close_device_transport(PROFILE_T *profile, void *ctx) {\n    FDS_T *fds = (FDS_T *)ctx;\n    if (fds && fds->tty_fd >= 0) {\n        if (tcsetattr(fds->tty_fd, TCSANOW, &fds->old_termios) != 0) {\n            err_msg(\"Error restoring old tty attributes\");\n        }\n        tcflush(fds->tty_fd, TCIOFLUSH);\n        close(fds->tty_fd);\n        fds->tty_fd = -1;\n    }\n    return SUCCESS;\n}\n\nconst transport_ops_t tty_transport_ops = {\n    .send_at_with_response = tty_send_at_with_response,\n    .send_at_only = tty_send_at_only,\n    .open_device = tty_open_device_transport,\n    .close_device = tty_close_device_transport\n};\n\n#ifdef ENABLE_UBUS_DAEMON\n// UBUS transport operations implementation  \nstatic int ubus_send_at_with_response_transport(PROFILE_T *profile, const char *at_cmd, const char *end_flag, int is_raw, char **response_text) {\n    ubus_client_t *client = (ubus_client_t *)profile->transport_ctx;\n    if (!client || !client->connected) {\n        err_msg(\"UBUS client not connected\");\n        return COMM_ERROR;\n    }\n    \n    ubus_at_response_t response;\n    int result = ubus_send_at_command(client, profile->tty_dev, at_cmd, \n                                     profile->timeout, end_flag, is_raw, &response);\n    \n    if (result == 0 && response_text && response.response) {\n        *response_text = strdup(response.response);\n    }\n\n    if (result != 0) {\n        err_msg(\"UBUS AT command failed with status: %d\", response.status);\n        ubus_at_response_free(&response);\n        return COMM_ERROR;\n    }\n    \n    ubus_at_response_free(&response);\n    return SUCCESS;\n}\n\nstatic int ubus_send_at_only_transport(PROFILE_T *profile, const char *at_cmd, int is_raw) {\n    ubus_client_t *client = (ubus_client_t *)profile->transport_ctx;\n    if (!client || !client->connected) {\n        err_msg(\"UBUS client not connected\");\n        return COMM_ERROR;\n    }\n    \n    int result = ubus_send_at_command_only(client, profile->tty_dev, at_cmd, is_raw);\n    \n    if (result != 0) {\n        err_msg(\"UBUS AT command (sendonly) failed with result: %d\", result);\n        return COMM_ERROR;\n    }\n    \n    return SUCCESS;\n}\n\nstatic int ubus_open_device_transport(PROFILE_T *profile, void *ctx) {\n    ubus_client_t *client = (ubus_client_t *)ctx;\n    \n    // Try to open the device\n    int open_result = ubus_at_open_device(client, profile->tty_dev, \n                                        profile->baud_rate, profile->data_bits, \n                                        0, 1); // parity=0 (none), stopbits=1\n    if (open_result != 0) {\n        dbg_msg(\"Failed to open device %s via ubus\", profile->tty_dev);\n        return COMM_ERROR;\n    } else {\n        dbg_msg(\"Opened device %s via ubus\", profile->tty_dev);\n        return SUCCESS;\n    }\n}\n\nstatic int ubus_close_device_transport(PROFILE_T *profile, void *ctx) {\n    ubus_client_t *client = (ubus_client_t *)ctx;\n    return ubus_at_close_device(client, profile->tty_dev);\n}\n\nconst transport_ops_t ubus_transport_ops = {\n    .send_at_with_response = ubus_send_at_with_response_transport,\n    .send_at_only = ubus_send_at_only_transport,\n    .open_device = ubus_open_device_transport,\n    .close_device = ubus_close_device_transport\n};\n#endif\n\n// Global transport functions implementation\nint transport_init(transport_t *transport, transport_type_t type) {\n    if (!transport) {\n        return COMM_ERROR;\n    }\n\n    transport->type = type;\n    \n    switch (type) {\n        case TRANSPORT_TTY:\n            transport->ops = &tty_transport_ops;\n            transport->ctx.tty_fds = malloc(sizeof(FDS_T));\n            if (!transport->ctx.tty_fds) {\n                err_msg(\"Failed to allocate TTY context\");\n                return COMM_ERROR;\n            }\n            memset(transport->ctx.tty_fds, 0, sizeof(FDS_T));\n            break;\n            \n#ifdef ENABLE_UBUS_DAEMON\n        case TRANSPORT_UBUS:\n            transport->ops = &ubus_transport_ops;\n            transport->ctx.ubus_client = malloc(sizeof(ubus_client_t));\n            if (!transport->ctx.ubus_client) {\n                err_msg(\"Failed to allocate UBUS context\");\n                return COMM_ERROR;\n            }\n            memset(transport->ctx.ubus_client, 0, sizeof(ubus_client_t));\n            \n            if (ubus_client_init(transport->ctx.ubus_client) != 0) {\n                err_msg(\"Failed to initialize UBUS client\");\n                free(transport->ctx.ubus_client);\n                return COMM_ERROR;\n            }\n            break;\n#endif\n            \n        default:\n            err_msg(\"Unsupported transport type: %d\", type);\n            return COMM_ERROR;\n    }\n    \n    return SUCCESS;\n}\n\nvoid transport_cleanup(transport_t *transport) {\n    if (!transport) {\n        return;\n    }\n\n    switch (transport->type) {\n        case TRANSPORT_TTY:\n            if (transport->ctx.tty_fds) {\n                free(transport->ctx.tty_fds);\n                transport->ctx.tty_fds = NULL;\n            }\n            break;\n            \n#ifdef ENABLE_UBUS_DAEMON\n        case TRANSPORT_UBUS:\n            if (transport->ctx.ubus_client) {\n                ubus_client_cleanup(transport->ctx.ubus_client);\n                free(transport->ctx.ubus_client);\n                transport->ctx.ubus_client = NULL;\n            }\n            break;\n#endif\n    }\n}\n\n// Unified transport operations\nint transport_send_at_with_response(transport_t *transport, PROFILE_T *profile, \n                                   const char *at_cmd, const char *end_flag, \n                                   int is_raw, char **response_text) {\n    if (!transport || !transport->ops || !transport->ops->send_at_with_response) {\n        err_msg(\"Invalid transport or operations\");\n        return COMM_ERROR;\n    }\n\n    // Set transport context in profile\n    switch (transport->type) {\n        case TRANSPORT_TTY:\n            profile->transport_ctx = transport->ctx.tty_fds;\n            break;\n#ifdef ENABLE_UBUS_DAEMON\n        case TRANSPORT_UBUS:\n            profile->transport_ctx = transport->ctx.ubus_client;\n            break;\n#endif\n    }\n\n    return transport->ops->send_at_with_response(profile, at_cmd, end_flag, is_raw, response_text);\n}\n\nint transport_send_at_only(transport_t *transport, PROFILE_T *profile, \n                          const char *at_cmd, int is_raw) {\n    if (!transport || !transport->ops || !transport->ops->send_at_only) {\n        err_msg(\"Invalid transport or operations\");\n        return COMM_ERROR;\n    }\n\n    // Set transport context in profile\n    switch (transport->type) {\n        case TRANSPORT_TTY:\n            profile->transport_ctx = transport->ctx.tty_fds;\n            break;\n#ifdef ENABLE_UBUS_DAEMON\n        case TRANSPORT_UBUS:\n            profile->transport_ctx = transport->ctx.ubus_client;\n            break;\n#endif\n    }\n\n    return transport->ops->send_at_only(profile, at_cmd, is_raw);\n}\n\nint transport_open_device(transport_t *transport, PROFILE_T *profile) {\n    if (!transport || !transport->ops || !transport->ops->open_device) {\n        err_msg(\"Invalid transport or operations\");\n        return COMM_ERROR;\n    }\n\n    void *ctx = NULL;\n    switch (transport->type) {\n        case TRANSPORT_TTY:\n            ctx = transport->ctx.tty_fds;\n            break;\n#ifdef ENABLE_UBUS_DAEMON\n        case TRANSPORT_UBUS:\n            ctx = transport->ctx.ubus_client;\n            break;\n#endif\n    }\n\n    return transport->ops->open_device(profile, ctx);\n}\n\nint transport_close_device(transport_t *transport, PROFILE_T *profile) {\n    if (!transport || !transport->ops || !transport->ops->close_device) {\n        err_msg(\"Invalid transport or operations\");\n        return COMM_ERROR;\n    }\n\n    void *ctx = NULL;\n    switch (transport->type) {\n        case TRANSPORT_TTY:\n            ctx = transport->ctx.tty_fds;\n            break;\n#ifdef ENABLE_UBUS_DAEMON\n        case TRANSPORT_UBUS:\n            ctx = transport->ctx.ubus_client;\n            break;\n#endif\n    }\n\n    return transport->ops->close_device(profile, ctx);\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/transport.h",
    "content": "#ifndef _TRANSPORT_H_\n#define _TRANSPORT_H_\n\n#include \"modem_types.h\"\n#include \"ttydevice.h\"\n#include \"utils.h\"\n#ifdef ENABLE_UBUS_DAEMON\n#include \"ubus_client.h\"\n#endif\n\n// Transport operation function pointers\ntypedef struct {\n    int (*send_at_with_response)(PROFILE_T *profile, const char *at_cmd, const char *end_flag, int is_raw, char **response_text);\n    int (*send_at_only)(PROFILE_T *profile, const char *at_cmd, int is_raw);\n    int (*open_device)(PROFILE_T *profile, void *ctx);\n    int (*close_device)(PROFILE_T *profile, void *ctx);\n} transport_ops_t;\n\n// Transport context structure\ntypedef struct {\n    transport_type_t type;\n    const transport_ops_t *ops;\n    union {\n        FDS_T *tty_fds;  // For TTY transport\n#ifdef ENABLE_UBUS_DAEMON\n        ubus_client_t *ubus_client;  // For UBUS transport\n#endif\n    } ctx;\n} transport_t;\n\n// Global transport functions\nint transport_init(transport_t *transport, transport_type_t type);\nvoid transport_cleanup(transport_t *transport);\n\n// Unified transport operations\nint transport_send_at_with_response(transport_t *transport, PROFILE_T *profile, \n                                   const char *at_cmd, const char *end_flag, \n                                   int is_raw, char **response_text);\nint transport_send_at_only(transport_t *transport, PROFILE_T *profile, \n                          const char *at_cmd, int is_raw);\nint transport_open_device(transport_t *transport, PROFILE_T *profile);\nint transport_close_device(transport_t *transport, PROFILE_T *profile);\n\n// TTY-specific operations\nextern const transport_ops_t tty_transport_ops;\n\n#ifdef ENABLE_UBUS_DAEMON\n// UBUS-specific operations\nextern const transport_ops_t ubus_transport_ops;\n#endif\n\n#endif // _TRANSPORT_H_"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/ttydevice.c",
    "content": "#include \"ttydevice.h\"\nstatic int tty_set_device(PROFILE_T *profile, FDS_T *fds)\n{\n    int baud_rate, data_bits;\n    struct termios tty;\n    baud_rate = profile->baud_rate;\n    data_bits = profile->data_bits;\n    if (tcgetattr(fds->tty_fd, &tty) != 0)\n    {\n        err_msg(\"Error getting tty attributes\");\n        return COMM_ERROR;\n    }\n    memmove(&fds->old_termios, &tty, sizeof(struct termios));\n    cfmakeraw(&tty);\n    tty.c_cflag |= CLOCAL; // 忽略调制解调器控制线，允许本地连接\n    tty.c_cflag |= CREAD;  // 使能接收\n\n    // clear flow control ,stop bits parity\n    tty.c_cflag &= ~CRTSCTS;\n    tty.c_cflag &= ~CSTOPB;\n    tty.c_cflag &= ~PARENB;\n    tty.c_oflag &= ~OPOST;\n    tty.c_cc[VMIN] = 0;\n    tty.c_cc[VTIME] = 1;\n\n    // set data bits 5,6,7,8\n    tty.c_cflag &= ~CSIZE; // 清除数据位设置\n    switch (data_bits)\n    {\n    case 5:\n        tty.c_cflag |= CS5;\n        break;\n    case 6:\n        tty.c_cflag |= CS6;\n        break;\n    case 7:\n        tty.c_cflag |= CS7;\n        break;\n    case 8:\n        tty.c_cflag |= CS8;\n        break;\n    default:\n        tty.c_cflag |= CS8;\n        break;\n    }\n\n    // set baud rate\n    switch (baud_rate)\n    {\n    case 4800:\n        cfsetspeed(&tty, B4800);\n        break;\n    case 9600:\n        cfsetspeed(&tty, B9600);\n        break;\n    case 19200:\n        cfsetspeed(&tty, B19200);\n        break;\n    case 38400:\n        cfsetspeed(&tty, B38400);\n        break;\n    case 57600:\n        cfsetspeed(&tty, B57600);\n        break;\n    case 115200:\n        cfsetspeed(&tty, B115200);\n        break;\n\n    default:\n        cfsetspeed(&tty, B115200);\n        break;\n    }\n    if (tcsetattr(fds->tty_fd, TCSANOW, &tty) != 0)\n    {\n        err_msg(\"Error setting tty attributes\");\n        return COMM_ERROR;\n    }\n    return SUCCESS;\n}\nint tty_open_device(PROFILE_T *profile,FDS_T *fds)\n{\n    fds->tty_fd = open(profile->tty_dev, O_RDWR | O_NOCTTY);\n    if (fds->tty_fd < 0)\n    {\n        err_msg(\"Error opening tty device: %s\", profile->tty_dev);\n        return COMM_ERROR;\n    }\n\n    if (tty_set_device(profile,fds) != 0)\n    {\n        err_msg(\"Error setting tty device\");\n        return COMM_ERROR;\n    }\n\n    fds->tty_fd = open(profile->tty_dev, O_RDWR | O_NOCTTY | O_NONBLOCK);\n    fds->fdi = fdopen(fds->tty_fd, \"r\");\n    if (setvbuf(fds->fdi , NULL, _IOFBF, 0))\n    {\n        err_msg(\"Error setting buffer for fdi\");\n        return COMM_ERROR;\n    }\n    usleep(10000);\n    tcflush(fds->tty_fd, TCIOFLUSH);\n    if (fds->tty_fd >= 0)\n        close(fds->tty_fd);\n    else\n        return COMM_ERROR;\n    fds->tty_fd = open(profile->tty_dev, O_RDWR | O_NOCTTY | O_NONBLOCK);\n    fds->fdi = fdopen(fds->tty_fd, \"r\");\n    fds->fdo = fdopen(fds->tty_fd, \"w\");\n    if (fds->fdi == NULL || fds->fdo == NULL)\n    {\n        err_msg(\"Error opening file descriptor\");\n        return COMM_ERROR;\n    }\n\n    if (setvbuf(fds->fdo , NULL, _IOFBF, 0))\n    {\n        err_msg(\"Error setting buffer for fdi\");\n        return COMM_ERROR;\n    }\n\n    if (setvbuf(fds->fdi , NULL, _IOLBF, 0))\n    {\n        err_msg(\"Error setting buffer for fdi\");\n        return COMM_ERROR;\n    }\n    return SUCCESS;\n}\n\nint tty_read(FILE *fdi, AT_MESSAGE_T *message, PROFILE_T *profile) {\n    return tty_read_keyword(fdi, message, NULL, profile);\n}\n\nint tty_read_keyword(FILE *fdi, AT_MESSAGE_T *message, char *key_word, PROFILE_T *profile) {\n    char tmp[LINE_BUF] = {0};\n    char *dynamic_buffer = NULL;\n    int buffer_size = 0;\n    int read_flag = 0;\n    time_t start_time = time(NULL);\n    int exitcode = TIMEOUT_WAITING_NEWLINE;\n\n    while (difftime(time(NULL), start_time) < profile->timeout) {\n        memset(tmp, 0, LINE_BUF);\n        if (fgets(tmp, LINE_BUF, fdi)) {\n            read_flag = 1;\n            dbg_msg(\"%s\", tmp);\n            if (profile->greedy_read && strlen(tmp) > 0) {\n                start_time = time(NULL);\n            }\n            if (message != NULL) {\n                int tmp_len = strlen(tmp);\n                char *new_buffer = realloc(dynamic_buffer, buffer_size + tmp_len + 1);\n                if (!new_buffer) {\n                    free(dynamic_buffer);\n                    err_msg(\"Error: memory allocation failed\");\n                    exitcode = BUFFER_OVERFLOW;\n                    break;\n                }\n                dynamic_buffer = new_buffer;\n                memcpy(dynamic_buffer + buffer_size, tmp, tmp_len);\n                buffer_size += tmp_len;\n                dynamic_buffer[buffer_size] = '\\0';\n            }\n\n            if (strncmp(tmp, \"OK\", 2) == 0 ||\n                strncmp(tmp, \"ERROR\", 5) == 0 ||\n                strncmp(tmp, \"+CMS ERROR:\", 11) == 0 ||\n                strncmp(tmp, \"+CME ERROR:\", 11) == 0 ||\n                strncmp(tmp, \"NO CARRIER\", 10) == 0 ||\n                (key_word != NULL && strncmp(tmp, key_word, strlen(key_word)) == 0)) {\n                if (key_word != NULL && strncmp(tmp, key_word, strlen(key_word)) == 0) {\n                    dbg_msg(\"keyword found\");\n                    exitcode = SUCCESS;\n                } else if (key_word == NULL) {\n                    exitcode = SUCCESS;\n                } else {\n                    exitcode = KEYWORD_NOT_MATCH;\n                }\n                break;\n            }\n        }\n#ifdef EARLY_RETURN\n        else {\n            if (read_flag > 500) {\n                dbg_msg(\"early return\");\n                exitcode = TIMEOUT_WAITING_NEWLINE;\n                break;\n            }\n            if (read_flag) {\n                read_flag++;\n            }\n        }\n#endif\n        usleep(5000);\n    }\n\n    if (read_flag == 0) {\n        exitcode = COMM_ERROR;\n    }\n\n    if (message != NULL) {\n        message->message = dynamic_buffer;\n        message->len = buffer_size;\n    } else {\n        free(dynamic_buffer);\n    }\n\n    return exitcode;\n}\n\nint tty_write_raw(FILE *fdo, const char *input)\n{\n    int ret;\n    ret = fputs(input, fdo);\n    fflush(fdo);\n    usleep(100);\n    if (ret < 0)\n    {\n        err_msg(\"Error writing to tty %d\" , ret);\n        return COMM_ERROR;\n    }\n    return SUCCESS;\n}\n\nint tty_write(FILE *fdo, const char *input)\n{\n    int cmd_len, ret;\n    char *cmd_line;\n    cmd_len = strlen(input) + 3;\n    cmd_line = (char *)malloc(cmd_len);\n    if (cmd_line == NULL)\n    {\n        err_msg(\"Error allocating memory\");\n        return COMM_ERROR;\n    }\n    snprintf(cmd_line, cmd_len, \"%s\\r\\n\", input);\n    ret =  tty_write_raw(fdo, cmd_line);\n    free(cmd_line);\n    return ret;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/ttydevice.h",
    "content": "#ifndef TTYDEVICE_H\n#define TTYDEVICE_H\n#include \"modem_types.h\"\n#include \"utils.h\"\n\nint tty_open_device(PROFILE_T *profile,FDS_T *fds);\nint tty_write_raw(FILE *fdo, const char *input);\nint tty_write(FILE *fdo, const char *input);\n\n#endif\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/ubus_client.c",
    "content": "#include \"ubus_client.h\"\n#include \"utils.h\"\n\n\nstatic ubus_client_t g_ubus_client = {0};\n\nint ubus_client_init(ubus_client_t *client) {\n    if (!client) {\n        return -1;\n    }\n    \n    client->ctx = ubus_connect(NULL);\n    if (!client->ctx) {\n        err_msg(\"Failed to connect to ubus\");\n        return -1;\n    }\n    \n    client->connected = 1;\n    dbg_msg(\"Connected to ubus successfully\");\n    return 0;\n}\n\nvoid ubus_client_cleanup(ubus_client_t *client) {\n    if (client && client->ctx) {\n        ubus_free(client->ctx);\n        client->ctx = NULL;\n        client->connected = 0;\n        dbg_msg(\"Disconnected from ubus\");\n    }\n}\n\nstatic uint32_t find_service_id(struct ubus_context *ctx, const char *service_name) {\n    uint32_t id;\n    int ret = ubus_lookup_id(ctx, service_name, &id);\n    if (ret != UBUS_STATUS_OK) {\n        err_msg(\"Failed to find service %s: %s\", service_name, ubus_strerror(ret));\n        return 0;\n    }\n    return id;\n}\n\nint ubus_at_open_device(ubus_client_t *client, const char *device_path, \n                        int baud_rate, int data_bits, int parity, int stop_bits) {\n    if (!client || !client->connected || !device_path) {\n        return -1;\n    }\n    \n    uint32_t service_id = find_service_id(client->ctx, UBUS_AT_DAEMON_SERVICE);\n    if (!service_id) {\n        return -1;\n    }\n    \n    struct blob_buf b = {0};\n    blob_buf_init(&b, 0);\n    blobmsg_add_string(&b, \"at_port\", device_path);\n    blobmsg_add_u32(&b, \"baudrate\", baud_rate);\n    blobmsg_add_u32(&b, \"databits\", data_bits);\n    blobmsg_add_u32(&b, \"parity\", parity);\n    blobmsg_add_u32(&b, \"stopbits\", stop_bits);\n    \n    int ret = ubus_invoke(client->ctx, service_id, \"open\", b.head, NULL, NULL, 5000);\n    blob_buf_free(&b);\n    \n    if (ret != UBUS_STATUS_OK) {\n        err_msg(\"Failed to open AT device via ubus: %s\", ubus_strerror(ret));\n        return -1;\n    }\n    \n    dbg_msg(\"Opened AT device %s via ubus\", device_path);\n    return 0;\n}\n\nint ubus_at_close_device(ubus_client_t *client, const char *device_path) {\n    if (!client || !client->connected || !device_path) {\n        return -1;\n    }\n    \n    uint32_t service_id = find_service_id(client->ctx, UBUS_AT_DAEMON_SERVICE);\n    if (!service_id) {\n        return -1;\n    }\n    \n    struct blob_buf b = {0};\n    blob_buf_init(&b, 0);\n    blobmsg_add_string(&b, \"at_port\", device_path);\n    \n    int ret = ubus_invoke(client->ctx, service_id, \"close\", b.head, NULL, NULL, 5000);\n    blob_buf_free(&b);\n    \n    if (ret != UBUS_STATUS_OK) {\n        err_msg(\"Failed to close AT device via ubus: %s\", ubus_strerror(ret));\n        return -1;\n    }\n    \n    dbg_msg(\"Closed AT device %s via ubus\", device_path);\n    return 0;\n}\n\nstatic void ubus_sendat_callback(struct ubus_request *req, int type, struct blob_attr *msg) {\n    ubus_at_response_t *response = (ubus_at_response_t *)req->priv;\n    \n    if (!response || !msg) {\n        return;\n    }\n    \n    struct blob_attr *tb[4];\n    static const struct blobmsg_policy response_policy[] = {\n        [0] = { .name = \"response\", .type = BLOBMSG_TYPE_STRING },\n        [1] = { .name = \"status\", .type = BLOBMSG_TYPE_STRING },\n        [2] = { .name = \"end_flag_matched\", .type = BLOBMSG_TYPE_STRING },\n        [3] = { .name = \"response_time_ms\", .type = BLOBMSG_TYPE_INT32 },\n    };\n    \n    blobmsg_parse(response_policy, 4, tb, blob_data(msg), blob_len(msg));\n    \n    if (tb[0]) {\n        const char *resp_str = blobmsg_get_string(tb[0]);\n        response->response = strdup(resp_str);\n    }\n    \n    if (tb[1]) {\n        const char *status_str = blobmsg_get_string(tb[1]);\n        // Convert string status to integer: \"success\" -> 0, others -> -1\n        response->status = (strcmp(status_str, \"success\") == 0) ? 0 : -1;\n    }\n    \n    if (tb[2]) {\n        const char *end_flag = blobmsg_get_string(tb[2]);\n        response->end_flag_matched = strdup(end_flag);\n    }\n    \n    if (tb[3]) {\n        response->response_time_ms = blobmsg_get_u32(tb[3]);\n    }\n}\n\nint ubus_send_at_command(ubus_client_t *client, const char *device_path,\n                         const char *at_cmd, int timeout, const char *end_flag,\n                         int is_raw, ubus_at_response_t *response) {\n    if (!client || !client->connected || !device_path || !at_cmd || !response) {\n        return -1;\n    }\n    \n    // Initialize response\n    memset(response, 0, sizeof(ubus_at_response_t));\n    response->status = -1;\n    \n    uint32_t service_id = find_service_id(client->ctx, UBUS_AT_DAEMON_SERVICE);\n    if (!service_id) {\n        return -1;\n    }\n    \n    struct blob_buf b = {0};\n    blob_buf_init(&b, 0);\n    blobmsg_add_string(&b, \"at_port\", device_path);\n    //add boolean for sendonly\n    //blobmsg_add_u8(&b, \"sendonly\", 1);\n    if (is_raw) {\n        blobmsg_add_string(&b, \"raw_at_content\", at_cmd);\n    } else {\n        blobmsg_add_string(&b, \"at_cmd\", at_cmd);\n    }\n    \n    blobmsg_add_u32(&b, \"timeout\", timeout);\n    \n    if (end_flag && strlen(end_flag) > 0) {\n        blobmsg_add_string(&b, \"end_flag\", end_flag);\n    }\n    \n    int ret = ubus_invoke(client->ctx, service_id, \"sendat\", b.head, \n                         ubus_sendat_callback, response, timeout * 1000 + 1000);\n    blob_buf_free(&b);\n    \n    if (ret != UBUS_STATUS_OK) {\n        err_msg(\"Failed to send AT command via ubus: %s\", ubus_strerror(ret));\n        return -1;\n    }\n    \n    dbg_msg(\"Sent AT command via ubus: %s\", at_cmd);\n    return response->status;\n}\n\nint ubus_send_at_command_only(ubus_client_t *client, const char *device_path,\n                              const char *at_cmd, int is_raw) {\n    if (!client || !client->connected || !device_path || !at_cmd) {\n        return -1;\n    }\n    \n    uint32_t service_id = find_service_id(client->ctx, UBUS_AT_DAEMON_SERVICE);\n    if (!service_id) {\n        return -1;\n    }\n    \n    struct blob_buf b = {0};\n    blob_buf_init(&b, 0);\n    blobmsg_add_string(&b, \"at_port\", device_path);\n    blobmsg_add_u8(&b, \"sendonly\", 1);  // Set sendonly flag to true\n    \n    if (is_raw) {\n        blobmsg_add_string(&b, \"raw_at_content\", at_cmd);\n    } else {\n        blobmsg_add_string(&b, \"at_cmd\", at_cmd);\n    }\n    \n    blobmsg_add_u32(&b, \"timeout\", 1000);  // Set minimal timeout for sendonly mode\n    \n    int ret = ubus_invoke(client->ctx, service_id, \"sendat\", b.head, \n                         NULL, NULL, 2000);  // No callback needed for sendonly\n    blob_buf_free(&b);\n    \n    if (ret != UBUS_STATUS_OK) {\n        err_msg(\"Failed to send AT command (sendonly) via ubus: %s\", ubus_strerror(ret));\n        return -1;\n    }\n    \n    dbg_msg(\"Sent AT command (sendonly) via ubus: %s\", at_cmd);\n    return 0;\n}\n\nvoid ubus_at_response_free(ubus_at_response_t *response) {\n    if (response) {\n        if (response->response) {\n            free(response->response);\n            response->response = NULL;\n        }\n        if (response->end_flag_matched) {\n            free(response->end_flag_matched);\n            response->end_flag_matched = NULL;\n        }\n    }\n}\n\n// Global ubus client functions for easy access\nint init_global_ubus_client(void) {\n    return ubus_client_init(&g_ubus_client);\n}\n\nvoid cleanup_global_ubus_client(void) {\n    ubus_client_cleanup(&g_ubus_client);\n}\n\nubus_client_t *get_global_ubus_client(void) {\n    return &g_ubus_client;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/ubus_client.h",
    "content": "#ifndef _UBUS_CLIENT_H_\n#define _UBUS_CLIENT_H_\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n#include \"modem_types.h\"\n\n// Check if ubus is available\n#include <json-c/json.h>\n#include <libubus.h>\n#include <libubox/blobmsg_json.h>\n\n// ubus AT daemon service name\n#define UBUS_AT_DAEMON_SERVICE \"at-daemon\"\n\n// ubus client context\ntypedef struct {\n    struct ubus_context *ctx;\n    int connected;\n} ubus_client_t;\n\n// AT response structure for ubus\ntypedef struct {\n    char *response;\n    int status;\n    char *end_flag_matched;\n    long response_time_ms;\n} ubus_at_response_t;\n\n// Function declarations\nint ubus_client_init(ubus_client_t *client);\nvoid ubus_client_cleanup(ubus_client_t *client);\n\nint ubus_at_open_device(ubus_client_t *client, const char *device_path, \n                        int baud_rate, int data_bits, int parity, int stop_bits);\nint ubus_at_close_device(ubus_client_t *client, const char *device_path);\n\nint ubus_send_at_command(ubus_client_t *client, const char *device_path,\n                         const char *at_cmd, int timeout, const char *end_flag,\n                         int is_raw, ubus_at_response_t *response);\n\nint ubus_send_at_command_only(ubus_client_t *client, const char *device_path,\n                              const char *at_cmd, int is_raw);\n\nvoid ubus_at_response_free(ubus_at_response_t *response);\n\n// Global ubus client functions for easy access\nint init_global_ubus_client(void);\nvoid cleanup_global_ubus_client(void);\nubus_client_t *get_global_ubus_client(void);\n\n#endif // _UBUS_CLIENT_H_\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/utils.c",
    "content": "#include \"utils.h\"\n\n#ifdef USE_SEMAPHORE\nvoid generate_semaphore_name(const char* filename, char* semaphore_name) {\n    snprintf(semaphore_name, MAX_FILENAME_LEN, \"%s%s\", SEMAPHORE_PREFIX, filename);\n    for (int i = 0; semaphore_name[i] != '\\0'; i++) {\n        if (semaphore_name[i] == '/') {\n            semaphore_name[i] = '_';\n        }\n    }\n}\n\nint lock_at_port(char* filename){\n    char semaphore_name[MAX_FILENAME_LEN];\n    generate_semaphore_name(filename, semaphore_name);\n    dbg_msg(\"semaphore_name: %s\", semaphore_name);\n    sem_t *sem = sem_open(semaphore_name, O_CREAT, 0644, 1);\n    if (sem == SEM_FAILED) {\n        perror(\"sem_open failed\");\n        return -1;\n    }\n    sem_wait(sem);\n    return 0;\n}\n\nint unlock_at_port(char* filename){\n    char semaphore_name[MAX_FILENAME_LEN];\n    generate_semaphore_name(filename, semaphore_name);\n    dbg_msg(\"semaphore_name: %s\", semaphore_name);\n    sem_t *sem = sem_open(semaphore_name, O_CREAT, 0644, 1);\n    if (sem == SEM_FAILED) {\n        perror(\"sem_open failed\");\n        return -1;\n    }\n    sem_post(sem);\n    sem_close(sem);\n    sem_unlink(semaphore_name);\n    return 0;\n}\n\n#endif\n\n\nstatic int char_to_hex(char c)\n{\n    // convert char to hex\n    int is_digit, is_lower, is_upper;\n    is_digit = c - '0';\n    is_lower = c - 'a' + 10;\n    is_upper = c - 'A' + 10;\n    if (is_digit >= 0 && is_digit <= 9)\n    {\n        return is_digit;\n    }\n    else if (is_lower >= 10 && is_lower <= 15)\n    {\n        return is_lower;\n    }\n    else if (is_upper >= 10 && is_upper <= 15)\n    {\n        return is_upper;\n    }\n    else\n    {\n        return -1;\n    }\n}\nint decode_pdu(SMS_T *sms)\n{\n    char sms_text[SMS_TEXT_SIZE] = {0};\n    int tp_dcs;\n    int skip_bytes;\n    int pdu_str_len;\n    unsigned char hex_pdu[SMS_PDU_HEX_SIZE] = {0};\n    pdu_str_len = strlen(sms->sms_pdu);\n    for (int i = 0; i < pdu_str_len; i += 2)\n    {\n        hex_pdu[i / 2] = char_to_hex(sms->sms_pdu[i]) << 4;\n        hex_pdu[i / 2] |= char_to_hex(sms->sms_pdu[i + 1]);\n    }\n    int sms_len = pdu_decode(hex_pdu, pdu_str_len/2,\n                             &sms->timestamp,\n                             sms->sender, PHONE_NUMBER_SIZE,\n                             sms_text, SMS_TEXT_SIZE,\n                             &tp_dcs,\n                             &sms->ref_number,\n                             &sms->total_segments,\n                             &sms->segment_number,\n                             &skip_bytes);\n    if (sms_len <= 0)\n    {\n        err_msg(\"Error decoding pdu\");\n        return sms_len;\n    }\n    sms->sms_lenght = sms_len;\n\n    switch ((tp_dcs / 4) % 4)\n    {\n    case 0:\n        { \n            // GSM 7 bit\n            sms->type = SMS_CHARSET_7BIT;\n            int i;\n            i = skip_bytes;\n            if (skip_bytes > 0)\n                i = (skip_bytes * 8 + 6) / 7;\n            for (; i < strlen(sms_text); i++)\n            {\n                sprintf(sms->sms_text + i, \"%c\", sms_text[i]);\n            }\n            i++;\n            sprintf(sms->sms_text + i, \"%c\", '\\0');\n            break;\n        }\n    case 2:\n        { \n            // UCS2\n            sms->type = SMS_CHARSET_UCS2;\n            int offset = 0;\n            for (int i = skip_bytes; i < sms_len; i += 2)\n            {\n                int ucs2_char = 0x000000FF & sms_text[i + 1];\n                ucs2_char |= (0x0000FF00 & (sms_text[i] << 8));\n                unsigned char utf8_char[5];\n                int len = ucs2_to_utf8(ucs2_char, utf8_char);\n                int j;\n                for (j = 0; j < len; j++)\n                {\n                    sprintf(sms->sms_text + offset, \"%c\", utf8_char[j]);\n                    if (utf8_char[j] != '\\0')\n                    {\n                        offset++;\n                    }\n                    \n                }\n            }\n            offset++;\n            sprintf(sms->sms_text + offset, \"%c\", '\\0');\n            break;\n        }\n    default:\n        break;\n    }\n    return sms_len;\n}\nint destroy_sms(SMS_T *sms)\n{\n    if (sms->sms_pdu != NULL)\n    {\n        free(sms->sms_pdu);\n    }\n    if (sms->sender != NULL)\n    {\n        free(sms->sender);\n    }\n    if (sms->sms_text != NULL)\n    {\n        free(sms->sms_text);\n    }\n    free(sms);\n    return SUCCESS;\n}\nint dump_sms(SMS_T *sms)\n{\n    dbg_msg(\"SMS Index: %d\", sms->sms_index);\n    dbg_msg(\"SMS Text: %s\", sms->sms_text);\n    dbg_msg(\"SMS Sender: %s\", sms->sender);\n    dbg_msg(\"SMS Timestamp: %lld\", (long long)sms->timestamp);\n    dbg_msg(\"SMS Segment: %d/%d\", sms->segment_number, sms->total_segments);\n    return SUCCESS;\n}\nint match_option(char *option_name)\n{\n    char short_option;\n    char *long_option;\n    // if start with '-' then it is an single character option\n    if (option_name[0] == '-' && option_name[1] != '-')\n    {\n\n        short_option = option_name[1];\n        switch (short_option)\n        {\n        case AT_CMD_S:\n            return AT_CMD;\n        case TTY_DEV_S:\n            return TTY_DEV;\n        case BAUD_RATE_S:\n            return BAUD_RATE;\n        case DATA_BITS_S:\n            return DATA_BITS;\n        case PARITY_S:\n            return PARITY;\n        case STOP_BITS_S:\n            return STOP_BITS;\n        case FLOW_CONTROL_S:\n            return FLOW_CONTROL;\n        case TIMEOUT_S:\n            return TIMEOUT;\n        case OPERATION_S:\n            return OPERATION;\n        case DEBUG_S:\n            return DEBUG;\n        case SMS_PDU_S:\n            return SMS_PDU;\n        case SMS_INDEX_S:\n            return SMS_INDEX;\n        case GREEDY_READ_S:\n            return GREEDY_READ;\n        case USE_UBUS_S:\n            return USE_UBUS;\n        default:\n            return -1;\n        }\n    }\n    if (option_name[0] == '-' && option_name[1] == '-')\n    {\n        long_option = option_name + 2;\n        if (strcmp(long_option, AT_CMD_L) == 0)\n        {\n            return AT_CMD;\n        }\n        else if (strcmp(long_option, TTY_DEV_L) == 0)\n        {\n            return TTY_DEV;\n        }\n        else if (strcmp(long_option, BAUD_RATE_L) == 0)\n        {\n            return BAUD_RATE;\n        }\n        else if (strcmp(long_option, DATA_BITS_L) == 0)\n        {\n            return DATA_BITS;\n        }\n        else if (strcmp(long_option, PARITY_L) == 0)\n        {\n            return PARITY;\n        }\n        else if (strcmp(long_option, STOP_BITS_L) == 0)\n        {\n            return STOP_BITS;\n        }\n        else if (strcmp(long_option, FLOW_CONTROL_L) == 0)\n        {\n            return FLOW_CONTROL;\n        }\n        else if (strcmp(long_option, TIMEOUT_L) == 0)\n        {\n            return TIMEOUT;\n        }\n        else if (strcmp(long_option, OPERATION_L) == 0)\n        {\n            return OPERATION;\n        }\n        else if (strcmp(long_option, DEBUG_L) == 0)\n        {\n            return DEBUG;\n        }\n        else if (strcmp(long_option, SMS_PDU_L) == 0)\n        {\n            return SMS_PDU;\n        }\n        else if (strcmp(long_option, SMS_INDEX_L) == 0)\n        {\n            return SMS_INDEX;\n        }\n        else if (strcmp(long_option, GREEDY_READ_L) == 0)\n        {\n            return GREEDY_READ;\n        }\n        else if (strcmp(long_option, USE_UBUS_L) == 0)\n        {\n            return USE_UBUS;\n        }\n        else\n        {\n            return -1;\n        }\n    }\n    // if start with '--' then it is a long option\n    return -1;\n}\nint match_operation(char *operation_name)\n{\n\n    char short_op;\n    int opstr_len = strlen(operation_name);\n    if (opstr_len == 1)\n    {\n        short_op = operation_name[0];\n        switch (short_op)\n        {\n        case AT_OP_S:\n            return AT_OP;\n        case BINARY_AT_OP_S:\n            return BINARY_AT_OP;\n        case SMS_READ_OP_S:\n            return SMS_READ_OP;\n        case SMS_SEND_OP_S:\n            return SMS_SEND_OP;\n        case SMS_DELETE_OP_S:\n            return SMS_DELETE_OP;\n        case SMS_UNREAD_OP_S:\n            return SMS_UNREAD_OP;\n        case SMS_MARK_READ_OP_S:\n            return SMS_MARK_READ_OP;\n        case CLEANUP_SEMAPHORE_OP_S:\n            return CLEANUP_SEMAPHORE_OP;\n        default:\n            return INVALID_PARAM;\n            break;\n        }\n    }\n    else if (opstr_len > 1)\n    {\n        if (strcmp(operation_name, AT_OP_L) == 0)\n        {\n            return AT_OP;\n        }\n        else if (strcmp(operation_name, BINARY_AT_OP_L) == 0)\n        {\n            return BINARY_AT_OP;\n        }\n        else if (strcmp(operation_name, SMS_READ_OP_L) == 0)\n        {\n            return SMS_READ_OP;\n        }\n        else if (strcmp(operation_name, SMS_SEND_OP_L) == 0)\n        {\n            return SMS_SEND_OP;\n        }\n        else if (strcmp(operation_name, SMS_DELETE_OP_L) == 0)\n        {\n            return SMS_DELETE_OP;\n        }\n        else if (strcmp(operation_name, SMS_UNREAD_OP_L) == 0)\n        {\n            return SMS_UNREAD_OP;\n        }\n        else if (strcmp(operation_name, SMS_MARK_READ_OP_L) == 0)\n        {\n            return SMS_MARK_READ_OP;\n        }\n        else if (strcmp(operation_name, CLEANUP_SEMAPHORE_OP_L) == 0)\n        {\n            return CLEANUP_SEMAPHORE_OP;\n        }\n        else\n        {\n            return INVALID_PARAM;\n        }\n    }\n    return SUCCESS;\n}\nvoid escape_json(char *input, char *output)\n{\n    char *p = input;\n    char *q = output;\n    while (*p)\n    {\n        unsigned char c = (unsigned char)*p;\n        \n        if (*p == '\"')\n        {\n            *q++ = '\\\\';\n            *q++ = '\"';\n        }\n        else if (*p == '\\\\')\n        {\n            *q++ = '\\\\';\n            *q++ = '\\\\';\n        }\n        else if (*p == '/')\n        {\n            *q++ = '\\\\';\n            *q++ = '/';\n        }\n        else if (*p == '\\b')\n        {\n            *q++ = '\\\\';\n            *q++ = 'b';\n        }\n        else if (*p == '\\f')\n        {\n            *q++ = '\\\\';\n            *q++ = 'f';\n        }\n        else if (*p == '\\n')\n        {\n            *q++ = '\\\\';\n            *q++ = 'n';\n        }\n        else if (*p == '\\r')\n        {\n            *q++ = '\\\\';\n            *q++ = 'r';\n        }\n        else if (*p == '\\t')\n        {\n            *q++ = '\\\\';\n            *q++ = 't';\n        }\n        else if (c < 0x20)  // Control characters (U+0000 through U+001F)\n        {\n            *q++ = '\\\\';\n            *q++ = 'u';\n            *q++ = '0';\n            *q++ = '0';\n            *q++ = (c >> 4) < 10 ? '0' + (c >> 4) : 'a' + (c >> 4) - 10;\n            *q++ = (c & 0x0F) < 10 ? '0' + (c & 0x0F) : 'a' + (c & 0x0F) - 10;\n        }\n        else\n        {\n            *q++ = *p;\n        }\n        p++;\n    }\n    *q = '\\0';\n}\nint usage(char* name)\n{\n    err_msg(\"Usage: %s [options]\", name);\n    err_msg(\"Or %s [device_path] [AT command]\", name);\n    err_msg(\"Or %s [device_path] [operation]\", name);\n    err_msg(\"Options:\");\n    err_msg(\"  -c, --at_cmd <AT command>  AT command\");\n    err_msg(\"  -d, --tty_dev <TTY device>  TTY device **REQUIRED**\");\n    err_msg(\"  -b, --baud_rate <baud rate>  Baud rate Default: 115200 Supported: 4800,9600,19200,38400,57600,115200\");\n    err_msg(\"  -B, --data_bits <data bits>  Data bits Default: 8 Supported: 5,6,7,8\");\n    err_msg(\"  -t, --timeout <timeout>  Default: 3 Timeout in seconds, if output is more than timeout, it will be ignored unless -g option is set\");\n    err_msg(\"  -o, --operation <operation>  Operation(at[a:defualt],binary_at[b], sms_read[r], sms_send[s], sms_delete[d], unread_sms[u], mark_read[m])\");\n    err_msg(\"  -D, --debug Debug mode Default: off\");\n    err_msg(\"  -p, --sms_pdu <sms pdu>  SMS PDU\");\n    err_msg(\"  -i, --sms_index <sms index>  SMS index\");\n    err_msg(\"  -g, --greedy_read Default: off, Greedy read mode, if set, each round it get new data from tty device, it will reset the timeout\");\n#ifdef ENABLE_UBUS_DAEMON\n    err_msg(\"  -u, --use_ubus Default: off, Use UBUS AT daemon instead of direct serial access\");\n#endif\n    #ifdef USE_SEMAPHORE\n    err_msg(\"  -C, --cleanup Semaphore cleanup\");\n    #endif\n    err_msg(\"Example:\");\n    err_msg(\"  %s -c ATI -d /dev/ttyUSB2 -b 115200 -B 8 -o at #advance at mode set bautrate and data bit\", name);\n    err_msg(\"  %s -c ATI -d /dev/ttyUSB2 # normal at mode\", name);\n    err_msg(\"  %s -c ATI -d /dev/ttyUSB2 -o binary_at -c 4154490D0A # means sending ATI to ttyUSB2\", name);\n    err_msg(\"  %s -d /dev/mhi_DUN -o r # read sms\", name);\n    #ifdef USE_SEMAPHORE\n    err_msg(\"  %s -d /dev/mhi_DUN  -o C # force cleanup semaphore\", name);\n    #endif\n    exit(-1);\n}\n\nint str_to_hex(char *str, char *hex)\n{\n    int len = strlen(str)/2;\n    int high,low;\n    for (int i = 0; i < len; i++)\n    {\n        high = char_to_hex(str[i*2]);\n        low = char_to_hex(str[i*2+1]);\n        if (high == -1 || low == -1)\n        {\n            return INVALID_HEX;\n        }\n        hex[i] = (high << 4) | low;\n        dbg_msg(\"hex[%d]: %x\", i, hex[i]);\n    }\n    return SUCCESS;\n}\n\nint get_sms_index(char *cmgl_line)\n{\n    // Parse +CMGL: line to extract SMS index\n    // Format: +CMGL: <index>,<stat>,<alpha>,<length>\n    char *start_pos = strchr(cmgl_line, ':');\n    if (start_pos == NULL) {\n        return -1;\n    }\n    \n    start_pos++; // Skip ':'\n    while (*start_pos == ' ') start_pos++; // Skip spaces\n    \n    char *end_pos = strchr(start_pos, ',');\n    if (end_pos == NULL) {\n        return -1;\n    }\n    \n    char index_str[16];\n    int len = end_pos - start_pos;\n    if (len >= sizeof(index_str)) {\n        return -1;\n    }\n    \n    strncpy(index_str, start_pos, len);\n    index_str[len] = '\\0';\n    \n    return atoi(index_str);\n}\n\nvoid dump_profile()\n{\n    dbg_msg(\"AT command: %s\", s_profile.at_cmd);\n    dbg_msg(\"TTY device: %s\", s_profile.tty_dev);\n    dbg_msg(\"Baud rate: %d\", s_profile.baud_rate);\n    dbg_msg(\"Data bits: %d\", s_profile.data_bits);\n    dbg_msg(\"Parity: %s\", s_profile.parity);\n    dbg_msg(\"Stop bits: %d\", s_profile.stop_bits);\n    dbg_msg(\"Flow control: %s\", s_profile.flow_control);\n    dbg_msg(\"Timeout: %d\", s_profile.timeout);\n    dbg_msg(\"Operation: %d\", s_profile.op);\n    dbg_msg(\"Debug: %d\", s_profile.debug);\n    dbg_msg(\"SMS PDU: %s\", s_profile.sms_pdu);\n    dbg_msg(\"SMS index: %d\", s_profile.sms_index);\n    dbg_msg(\"Greedy read: %d\", s_profile.greedy_read);\n    dbg_msg(\"Transport type: %s\", s_profile.transport == TRANSPORT_UBUS ? \"UBUS\" : \"TTY\");\n}\nint display_sms_in_json(SMS_T **sms,int num)\n{\n\n    char msg_json[SMS_BUF_SIZE];\n    int offset;\n    offset = sprintf(msg_json, \"{\\\"msg\\\":[\");\n    for (int i = 0; i < num; i++)\n    {\n        char escaped_text[SMS_TEXT_SIZE];\n        escape_json(sms[i]->sms_text, escaped_text);\n        if (sms[i]->ref_number)\n            offset += sprintf(msg_json + offset, \"{\\\"index\\\":%d,\\\"sender\\\":\\\"%s\\\",\\\"timestamp\\\":%lld,\\\"content\\\":\\\"%s\\\",\\\"reference\\\":%d,\\\"total\\\":%d,\\\"part\\\":%d},\",\n                          sms[i]->sms_index, sms[i]->sender, (long long)sms[i]->timestamp, escaped_text, sms[i]->ref_number, sms[i]->total_segments, sms[i]->segment_number);\n        else\n            offset += sprintf(msg_json + offset, \"{\\\"index\\\":%d,\\\"sender\\\":\\\"%s\\\",\\\"timestamp\\\":%lld,\\\"content\\\":\\\"%s\\\"},\",\n                          sms[i]->sms_index, sms[i]->sender, (long long)sms[i]->timestamp, escaped_text);\n    }\n    \n    //if not empty msg_json,remove the last ','\n    if (offset > 10)\n    {\n        offset--;\n    }\n    offset += sprintf(msg_json + offset, \"]}\");\n    user_msg(\"%s\\n\", msg_json);\n    return SUCCESS;\n\n    \n}\n"
  },
  {
    "path": "luci-app-qmodem/application/tom_modem/src/utils.h",
    "content": "#ifndef _UTILS_H\n#define _UTILS_H\n#define USE_SEMAPHORE 1\n#include <stdio.h>\n#include <string.h>\n#include <unistd.h>\n#include <fcntl.h>\n#include <stdlib.h>\n#include <termios.h>\n#include <signal.h>\n#include <sys/select.h>\n#include <errno.h>\n#include \"modem_types.h\"\n#include \"extlib/pdu.h\"\n#include \"time.h\"\n\n#ifdef USE_SEMAPHORE\n#include <semaphore.h>\n#include <sys/wait.h>\n#include <sys/types.h>\n#define MAX_FILENAME_LEN 256\n#define SEMAPHORE_PREFIX \"tom_modem_lock\"\ntypedef struct FileLock {\n    char filename[MAX_FILENAME_LEN];\n    sem_t semaphore;\n} FileLock;\n\nvoid generate_semaphore_name(const char* filename, char* semaphore_name);\nint lock_at_port(char* filename);\nint unlock_at_port(char* filename);\n#endif\n\nextern PROFILE_T s_profile;\nextern FDS_T s_fds;\n\n#define dbg_msg(fmt, args...) do { \\\n    if (s_profile.debug) { \\\n    fprintf(stderr, \"[DBG]\" fmt, ##args); \\\n    fprintf(stderr, \"\\n\"); \\\n\tfflush(stderr); \\\n    } \\\n} while(0)\n\n#define err_msg(fmt, args...) do { \\\n    if (1) { \\\n    fprintf(stderr, \"[ERR]\"  fmt , ##args); \\\n    fprintf(stderr, \"\\n\"); \\\n\tfflush(stderr); \\\n    } \\\n} while(0)\n\n#define user_msg(fmt, args...) (fprintf(stdout, fmt , ##args))\n\nint get_sms_index(char *cmgl_line);\n\nint match_option(char *option_name);\n\nint match_operation(char *operation_name);\n\n\nint decode_pdu(SMS_T *sms);\n\n\nint tty_read(FILE *fdi, AT_MESSAGE_T *message, PROFILE_T *profile);\n\nint tty_read_keyword(FILE *fdi, AT_MESSAGE_T *message, char *key_word, PROFILE_T *profile);\n\nint dump_sms(SMS_T *sms);\n\nint destroy_sms(SMS_T *sms);\n\nint display_sms_in_json(SMS_T **sms,int num);\n#endif\n"
  },
  {
    "path": "luci-app-qmodem/application/ubus_at_daemon/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\n# Include unified version\ninclude ../../version.mk\n\nPKG_NAME:=ubus-at-daemon\nPKG_RELEASE:=$(QMODEM_RELEASE)\nPKG_VERSION:=$(QMODEM_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n  SECTION:=utils\n  CATEGORY:=Utilities\n  TITLE:=Ubus AT Command Daemon\n  DEPENDS:=+libubus +libubox +libblobmsg-json +libjson-c\nendef\n\ndefine Package/$(PKG_NAME)/description\n  A ubus daemon for handling AT commands with OpenWRT\nendef\n\ndefine Build/Prepare\n\tmkdir -p $(PKG_BUILD_DIR)\n\t$(CP) src/* $(PKG_BUILD_DIR)/\nendef\n\ndefine Build/Compile\n\t$(MAKE) -C $(PKG_BUILD_DIR) \\\n\t\t$(TARGET_CONFIGURE_OPTS) \\\n\t\tCFLAGS=\"$(TARGET_CFLAGS) -I$(STAGING_DIR)/usr/include\" \\\n\t\tLDFLAGS=\"$(TARGET_LDFLAGS) -lubus -lubox -lblobmsg_json -ljson-c\"\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/ubus-at-daemon $(1)/usr/bin/\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_BIN) ./files/etc/init.d/ubus-at-daemon $(1)/etc/init.d/\n\t$(INSTALL_DIR) $(1)/etc/config\n\t$(INSTALL_CONF) ./files/etc/config/ubus-at-daemon $(1)/etc/config/\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "luci-app-qmodem/application/ubus_at_daemon/files/etc/config/ubus-at-daemon",
    "content": "config ubus-at-daemon 'main'\n    option enabled '1'\n    option config_file '/etc/ubus-at-daemon.json'\n\nconfig port\n    option at_port '/dev/ttyUSB2'\n    option baudrate '115200'\n    option databits '8'\n    option parity '0'\n    option stopbits '1'\n    option timeout '5'\n"
  },
  {
    "path": "luci-app-qmodem/application/ubus_at_daemon/files/etc/init.d/ubus-at-daemon",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=99\nSTOP=10\n\nUSE_PROCD=1\nPROG=/usr/bin/ubus-at-daemon\n\nstart_service() {\n    procd_open_instance\n    procd_set_param command $PROG\n    procd_set_param respawn\n    procd_set_param stdout 1\n    procd_set_param stderr 1\n    procd_close_instance\n}\n\nservice_triggers() {\n    procd_add_reload_trigger \"ubus-at-daemon\"\n}\n\nreload_service() {\n    stop\n    start\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/ubus_at_daemon/src/Makefile",
    "content": "# # Cross-compile setup for ImmortalWrt\n# STAGING_DIR ?= $(HOME)/qwrt_works/immortalwrt/staging_dir\n# TARGET_DIR ?= $(STAGING_DIR)/target-aarch64_generic_musl\n# TOOLCHAIN_DIR ?= $(STAGING_DIR)/toolchain-aarch64_generic_gcc-13.3.0_musl\n\n# # Cross-compiler and tools\n# CROSS_COMPILE ?= aarch64-openwrt-linux-musl-\n# CC = $(TOOLCHAIN_DIR)/bin/$(CROSS_COMPILE)gcc\n# AR = $(TOOLCHAIN_DIR)/bin/$(CROSS_COMPILE)ar\n# STRIP = $(TOOLCHAIN_DIR)/bin/$(CROSS_COMPILE)strip\n\n# Include and library paths\nCFLAGS = -Wall -Wextra -std=c99 -D_GNU_SOURCE\nCFLAGS += -I$(TARGET_DIR)/usr/include\nCFLAGS += -I$(TARGET_DIR)/usr/include/libubox\nCFLAGS += -I$(TARGET_DIR)/usr/include/json-c\n\nLDFLAGS = -L$(TARGET_DIR)/usr/lib\nLDFLAGS += -L$(TARGET_DIR)/lib\nLDFLAGS += -lubus -lubox -lblobmsg_json -ljson-c -lpthread\n\nTARGET = ubus-at-daemon\nSOURCES = main.c port_manager.c at_handler.c event_callback.c config_loader.c\nOBJECTS = $(SOURCES:.c=.o)\n\n.PHONY: all clean install debug\n\nall: $(TARGET)\n\ndebug:\n\t@echo \"Cross-compile Environment:\"\n\t@echo \"  STAGING_DIR: $(STAGING_DIR)\"\n\t@echo \"  TARGET_DIR: $(TARGET_DIR)\"\n\t@echo \"  TOOLCHAIN_DIR: $(TOOLCHAIN_DIR)\"\n\t@echo \"  CC: $(CC)\"\n\t@echo \"  CFLAGS: $(CFLAGS)\"\n\t@echo \"  LDFLAGS: $(LDFLAGS)\"\n\n$(TARGET): $(OBJECTS)\n\t@echo \"Linking $(TARGET)...\"\n\t$(CC) $(OBJECTS) -o $@ $(LDFLAGS)\n\t$(STRIP) $@\n\n%.o: %.c\n\t@echo \"Compiling $<...\"\n\t$(CC) $(CFLAGS) -c $< -o $@\n\nclean:\n\trm -f $(OBJECTS) $(TARGET)\n\ninstall: $(TARGET)\n\tinstall -D $(TARGET) $(DESTDIR)/usr/bin/$(TARGET)\n\n# Test cross-compilation environment\ntest-env:\n\t@echo \"Testing cross-compilation environment...\"\n\t@if [ ! -d \"$(STAGING_DIR)\" ]; then \\\n\t\techo \"ERROR: STAGING_DIR not found: $(STAGING_DIR)\"; \\\n\t\texit 1; \\\n\tfi\n\t@if [ ! -d \"$(TARGET_DIR)\" ]; then \\\n\t\techo \"ERROR: TARGET_DIR not found: $(TARGET_DIR)\"; \\\n\t\texit 1; \\\n\tfi\n\t@if [ ! -d \"$(TOOLCHAIN_DIR)\" ]; then \\\n\t\techo \"ERROR: TOOLCHAIN_DIR not found: $(TOOLCHAIN_DIR)\"; \\\n\t\texit 1; \\\n\tfi\n\t@if [ ! -f \"$(CC)\" ]; then \\\n\t\techo \"ERROR: Cross compiler not found: $(CC)\"; \\\n\t\texit 1; \\\n\tfi\n\t@echo \"Cross-compilation environment OK!\"\n\n# Check available libraries\ncheck-libs:\n\t@echo \"Checking available libraries in target system...\"\n\t@find $(TARGET_DIR)/usr/lib -name \"*ubus*\" -o -name \"*ubox*\" -o -name \"*json*\" | head -10\n\t@echo \"Checking headers...\"\n\t@find $(TARGET_DIR)/usr/include -name \"libubus.h\" -o -name \"libubox.h\" -o -name \"json.h\" | head -10\n"
  },
  {
    "path": "luci-app-qmodem/application/ubus_at_daemon/src/at_handler.c",
    "content": "#include \"ubus_at_daemon.h\"\n#include <time.h>\n#include <errno.h>\n\nextern at_daemon_ctx_t g_daemon_ctx;\n\nchar *hex_to_string(const char *hex_str) {\n    size_t hex_len = strlen(hex_str);\n    if (hex_len % 2 != 0) {\n        return NULL; // Invalid hex string\n    }\n    \n    size_t result_len = hex_len / 2;\n    char *result = malloc(result_len + 1);\n    if (!result) {\n        return NULL;\n    }\n    \n    for (size_t i = 0; i < result_len; i++) {\n        char hex_byte[3] = {hex_str[i*2], hex_str[i*2+1], '\\0'};\n        result[i] = (char)strtol(hex_byte, NULL, 16);\n    }\n    result[result_len] = '\\0';\n    \n    return result;\n}\n\nvoid parse_end_flags(at_port_instance_t *port, const char *end_flag_str) {\n    port->num_end_flags = 0;\n    \n    if (end_flag_str == NULL || strlen(end_flag_str) == 0) {\n        // Use default end flags - manually defined since macro expansion has issues\n        const char *default_flags[] = { \"OK\", \"ERROR\", \"+CMS ERROR:\", \"+CME ERROR:\", \"NO CARRIER\", NULL };\n        for (int i = 0; default_flags[i] != NULL && i < 5; i++) {\n            strncpy(port->expected_end_flags[i], default_flags[i], 63);\n            port->expected_end_flags[i][63] = '\\0';\n            port->num_end_flags++;\n        }\n    } else {\n        // Parse comma-separated end flags\n        char temp_str[512];\n        strncpy(temp_str, end_flag_str, sizeof(temp_str) - 1);\n        temp_str[sizeof(temp_str) - 1] = '\\0';\n        \n        char *token = strtok(temp_str, \",\");\n        while (token != NULL && port->num_end_flags < 5) {\n            // Trim whitespace from token\n            while (*token && (*token == ' ' || *token == '\\t')) {\n                token++;\n            }\n            \n            char *end = token + strlen(token) - 1;\n            while (end > token && (*end == ' ' || *end == '\\t')) {\n                *end = '\\0';\n                end--;\n            }\n            \n            if (strlen(token) > 0) {\n                strncpy(port->expected_end_flags[port->num_end_flags], token, 63);\n                port->expected_end_flags[port->num_end_flags][63] = '\\0';\n                port->num_end_flags++;\n            }\n            \n            token = strtok(NULL, \",\");\n        }\n        \n        // If no valid flags were parsed, use default\n        if (port->num_end_flags == 0) {\n            const char *default_flags[] = { \"OK\", \"ERROR\", \"+CMS ERROR:\", \"+CME ERROR:\", \"NO CARRIER\", NULL };\n            for (int i = 0; default_flags[i] != NULL && i < 5; i++) {\n                strncpy(port->expected_end_flags[i], default_flags[i], 63);\n                port->expected_end_flags[i][63] = '\\0';\n                port->num_end_flags++;\n            }\n        }\n    }\n}\n\nint check_end_flags(at_port_instance_t *port, const char *line, char *matched_flag) {\n    // Trim whitespace from line for better matching\n    char trimmed_line[1024];\n    strncpy(trimmed_line, line, sizeof(trimmed_line) - 1);\n    trimmed_line[sizeof(trimmed_line) - 1] = '\\0';\n    \n    // Remove leading and trailing whitespace\n    char *start = trimmed_line;\n    while (*start && (*start == ' ' || *start == '\\t' || *start == '\\r' || *start == '\\n')) {\n        start++;\n    }\n    \n    char *end = start + strlen(start) - 1;\n    while (end > start && (*end == ' ' || *end == '\\t' || *end == '\\r' || *end == '\\n')) {\n        *end = '\\0';\n        end--;\n    }\n    \n    // Check each end flag\n    for (int i = 0; i < port->num_end_flags; i++) {\n        const char *flag = port->expected_end_flags[i];\n        \n        // For exact match flags like \"OK\", \"ERROR\"\n        if (strcmp(start, flag) == 0) {\n            if (matched_flag) {\n                strcpy(matched_flag, flag);\n            }\n            return 1;\n        }\n        \n        // For prefix match flags like \"+CMS ERROR:\", \"+CME ERROR:\"\n        if (strncmp(start, flag, strlen(flag)) == 0) {\n            if (matched_flag) {\n                strcpy(matched_flag, flag);\n            }\n            return 1;\n        }\n        \n        // For substring match (fallback for compatibility)\n        if (strstr(start, flag) != NULL) {\n            if (matched_flag) {\n                strcpy(matched_flag, flag);\n            }\n            return 1;\n        }\n    }\n    return 0;\n}\n\nint send_at_command_with_response(at_port_instance_t *port, const char *cmd, int timeout, const char *end_flag, int is_raw, at_response_t *response) {\n    if (!port->is_open) {\n        // Auto-open with default parameters\n        if (open_at_port(port, 115200, 8, 0, 1) != 0) {\n            return -1;\n        }\n    }\n    \n    if (!response) {\n        return -1;\n    }\n    \n    // Initialize response\n    memset(response, 0, sizeof(at_response_t));\n    response->status = -1;\n    \n    // Record start time\n    clock_gettime(CLOCK_REALTIME, &response->start_time);\n    \n    // Parse end flags\n    parse_end_flags(port, end_flag);\n    \n    pthread_mutex_lock(&port->response_mutex);\n    \n    // Clear previous response and prepare for new one\n    memset(&port->current_response, 0, sizeof(at_response_t));\n    port->current_response.start_time = response->start_time;\n    port->waiting_for_response = 1;\n    \n    pthread_mutex_unlock(&port->response_mutex);\n    \n    // Send command\n    pthread_mutex_lock(&port->write_mutex);\n    \n    char *send_data;\n    size_t send_len;\n    \n    if (is_raw) {\n        send_data = hex_to_string(cmd);\n        if (!send_data) {\n            pthread_mutex_unlock(&port->write_mutex);\n            port->waiting_for_response = 0;\n            return -1;\n        }\n        send_len = strlen(send_data);\n    } else {\n        send_len = strlen(cmd) + strlen(AT_CMD_TERMINATOR);\n        send_data = malloc(send_len + 1);\n        if (!send_data) {\n            pthread_mutex_unlock(&port->write_mutex);\n            port->waiting_for_response = 0;\n            return -1;\n        }\n        strcpy(send_data, cmd);\n        strcat(send_data, AT_CMD_TERMINATOR);\n    }\n    \n    ssize_t written = write(port->fd, send_data, send_len);\n    free(send_data);\n    \n    pthread_mutex_unlock(&port->write_mutex);\n    \n    if (written != (ssize_t)send_len) {\n        port->waiting_for_response = 0;\n        return -1;\n    }\n    \n    // Wait for response\n    pthread_mutex_lock(&port->response_mutex);\n    \n    struct timespec abs_timeout;\n    clock_gettime(CLOCK_REALTIME, &abs_timeout);\n    abs_timeout.tv_sec += timeout;\n    \n    int wait_result = 0;\n    while (port->waiting_for_response && wait_result == 0) {\n        wait_result = pthread_cond_timedwait(&port->response_cond, &port->response_mutex, &abs_timeout);\n    }\n    \n    // Copy response\n    *response = port->current_response;\n    \n    // Record end time and calculate response time\n    clock_gettime(CLOCK_REALTIME, &response->end_time);\n    \n    long start_ms = response->start_time.tv_sec * 1000 + response->start_time.tv_nsec / 1000000;\n    long end_ms = response->end_time.tv_sec * 1000 + response->end_time.tv_nsec / 1000000;\n    response->response_time_ms = end_ms - start_ms;\n    \n    if (wait_result == ETIMEDOUT) {\n        response->status = -1;  // timeout\n        port->waiting_for_response = 0;\n    }\n    \n    pthread_mutex_unlock(&port->response_mutex);\n    \n    return response->status;\n}\n\nint send_at_command(at_port_instance_t *port, const char *cmd, int timeout, const char *end_flag, int is_raw) {\n    at_response_t response;\n    return send_at_command_with_response(port, cmd, timeout, end_flag, is_raw, &response);\n}\n\nint send_at_command_only(at_port_instance_t *port, const char *cmd, int is_raw) {\n    if (!port->is_open) {\n        // Auto-open with default parameters\n        if (open_at_port(port, 115200, 8, 0, 1) != 0) {\n            return -1;\n        }\n    }\n    \n    // Send command without waiting for response\n    pthread_mutex_lock(&port->write_mutex);\n    \n    char *send_data;\n    size_t send_len;\n    \n    if (is_raw) {\n        send_data = hex_to_string(cmd);\n        if (!send_data) {\n            pthread_mutex_unlock(&port->write_mutex);\n            return -1;\n        }\n        send_len = strlen(send_data);\n    } else {\n        send_len = strlen(cmd);\n        send_data = malloc(send_len + 1);\n        if (!send_data) {\n            pthread_mutex_unlock(&port->write_mutex);\n            return -1;\n        }\n        strcpy(send_data, cmd);\n    }\n    \n    ssize_t written = write(port->fd, send_data, send_len);\n    free(send_data);\n    \n    pthread_mutex_unlock(&port->write_mutex);\n    \n    if (written != (ssize_t)send_len) {\n        return -1;\n    }\n    \n    return 0;  // Success - command sent\n}\n\nvoid *reader_thread_func(void *arg) {\n    at_port_instance_t *port = (at_port_instance_t *)arg;\n    char temp_buffer[1024];\n    \n    while (!port->should_stop) {\n        if (!port->is_open) {\n            usleep(100000); // 100ms\n            continue;\n        }\n        \n        ssize_t bytes_read = read(port->fd, temp_buffer, sizeof(temp_buffer) - 1);\n        if (bytes_read > 0) {\n            // First, handle response data if we're waiting for one\n            pthread_mutex_lock(&port->response_mutex);\n            if (port->waiting_for_response) {\n                // Append new data to current response preserving original bytes\n                int current_len = port->current_response.response_len;\n                \n                if (current_len + bytes_read < MAX_BUFFER_SIZE - 1) {\n                    memcpy(port->current_response.response + current_len, temp_buffer, bytes_read);\n                    port->current_response.response_len = current_len + bytes_read;\n                    port->current_response.response[port->current_response.response_len] = '\\0';\n                }\n            }\n            pthread_mutex_unlock(&port->response_mutex);\n            \n            // Then handle buffer management and line processing\n            pthread_mutex_lock(&port->queue_mutex);\n            \n            int remaining_space = MAX_BUFFER_SIZE - port->buffer_pos - 1;\n            if (bytes_read <= remaining_space) {\n                memcpy(port->read_buffer + port->buffer_pos, temp_buffer, bytes_read);\n                port->buffer_pos += bytes_read;\n                port->read_buffer[port->buffer_pos] = '\\0';\n                \n                // Check for complete lines\n                char *line_start = port->read_buffer;\n                char *line_end;\n                \n                while ((line_end = strstr(line_start, \"\\r\\n\")) != NULL) {\n                    *line_end = '\\0';\n                    \n                    // Process the line\n                    if (strlen(line_start) > 0) {\n                        int is_echo = (strncmp(line_start, \"AT\", 2) == 0);\n                        \n                        // Check if we're waiting for a response and this line might be end flag\n                        int should_check_end_flag = 0;\n                        pthread_mutex_lock(&port->response_mutex);\n                        if (port->waiting_for_response && !is_echo) {\n                            should_check_end_flag = 1;\n                        }\n                        pthread_mutex_unlock(&port->response_mutex);\n                        \n                        if (should_check_end_flag) {\n                            // Check for end flags\n                            char matched_flag[64];\n                            if (check_end_flags(port, line_start, matched_flag)) {\n                                pthread_mutex_lock(&port->response_mutex);\n                                if (port->waiting_for_response) {\n                                    // Record end time\n                                    clock_gettime(CLOCK_REALTIME, &port->current_response.end_time);\n                                    \n                                    strcpy(port->current_response.end_flag_matched, matched_flag);\n                                    port->current_response.status = 0;  // success\n                                    port->waiting_for_response = 0;\n                                    pthread_cond_signal(&port->response_cond);\n                                }\n                                pthread_mutex_unlock(&port->response_mutex);\n                            }\n                        }\n                        \n                        // Process for event callbacks (only when not echo)\n                        if (!is_echo) {\n                            process_incoming_data(port, line_start);\n                        }\n                    }\n                    \n                    line_start = line_end + 2;\n                }\n                \n                // Move remaining data to beginning of buffer\n                if (line_start != port->read_buffer) {\n                    int remaining_bytes = strlen(line_start);\n                    memmove(port->read_buffer, line_start, remaining_bytes + 1);\n                    port->buffer_pos = remaining_bytes;\n                }\n            } else {\n                // Buffer overflow, reset\n                port->buffer_pos = 0;\n                port->read_buffer[0] = '\\0';\n            }\n            \n            pthread_mutex_unlock(&port->queue_mutex);\n        } else if (bytes_read < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {\n            // Error reading, mark port as closed\n            fprintf(stderr, \"Error reading from port %s: %s, marking as closed\\n\", \n                    port->port_path, strerror(errno));\n            port->is_open = 0;\n            break;\n        }\n        \n        usleep(10000); // 10ms\n    }\n    \n    return NULL;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/ubus_at_daemon/src/config_loader.c",
    "content": "#include \"ubus_at_daemon.h\"\n\nextern at_daemon_ctx_t g_daemon_ctx;\n\nint load_config_from_json(const char *json_path) {\n    FILE *file = fopen(json_path, \"r\");\n    if (!file) {\n        fprintf(stderr, \"Failed to open config file: %s\\n\", json_path);\n        return -1;\n    }\n    \n    // Read file content\n    fseek(file, 0, SEEK_END);\n    long file_size = ftell(file);\n    fseek(file, 0, SEEK_SET);\n    \n    char *content = malloc(file_size + 1);\n    if (!content) {\n        fclose(file);\n        return -1;\n    }\n    \n    fread(content, 1, file_size, file);\n    content[file_size] = '\\0';\n    fclose(file);\n    \n    // Parse JSON\n    json_object *root = json_tokener_parse(content);\n    free(content);\n    \n    if (!root) {\n        fprintf(stderr, \"Failed to parse JSON config\\n\");\n        return -1;\n    }\n    \n    // Process each port configuration\n    json_object *ports_array;\n    if (json_object_object_get_ex(root, \"ports\", &ports_array) && \n        json_object_is_type(ports_array, json_type_array)) {\n        \n        int array_len = json_object_array_length(ports_array);\n        for (int i = 0; i < array_len; i++) {\n            json_object *port_config = json_object_array_get_idx(ports_array, i);\n            if (!port_config) continue;\n            \n            // Get port path\n            json_object *at_port_obj;\n            if (!json_object_object_get_ex(port_config, JSON_AT_PORT, &at_port_obj)) {\n                continue;\n            }\n            const char *at_port = json_object_get_string(at_port_obj);\n            if (!at_port) continue;\n            \n            // Find or create port instance\n            at_port_instance_t *port = find_port_instance(at_port);\n            if (!port) {\n                port = create_port_instance(at_port);\n                if (!port) continue;\n            }\n            \n            // Get terminal settings\n            int baudrate = 115200, databits = 8, parity = 0, stopbits = 1;\n            \n            json_object *baudrate_obj;\n            if (json_object_object_get_ex(port_config, JSON_BAUDRATE, &baudrate_obj)) {\n                baudrate = json_object_get_int(baudrate_obj);\n            }\n            \n            json_object *databits_obj;\n            if (json_object_object_get_ex(port_config, JSON_DATABITS, &databits_obj)) {\n                databits = json_object_get_int(databits_obj);\n            }\n            \n            json_object *parity_obj;\n            if (json_object_object_get_ex(port_config, JSON_PARITY, &parity_obj)) {\n                parity = json_object_get_int(parity_obj);\n            }\n            \n            json_object *stopbits_obj;\n            if (json_object_object_get_ex(port_config, JSON_STOPBITS, &stopbits_obj)) {\n                stopbits = json_object_get_int(stopbits_obj);\n            }\n            \n            // Open the port\n            if (open_at_port(port, baudrate, databits, parity, stopbits) != 0) {\n                fprintf(stderr, \"Failed to open port %s\\n\", at_port);\n                continue;\n            }\n            \n            // Process event callbacks\n            json_object *callbacks_array;\n            if (json_object_object_get_ex(port_config, JSON_CALLBACKS, &callbacks_array) &&\n                json_object_is_type(callbacks_array, json_type_array)) {\n                \n                int cb_array_len = json_object_array_length(callbacks_array);\n                for (int j = 0; j < cb_array_len; j++) {\n                    json_object *callback_config = json_object_array_get_idx(callbacks_array, j);\n                    if (!callback_config) continue;\n                    \n                    json_object *script_obj;\n                    if (!json_object_object_get_ex(callback_config, JSON_CALLBACK_SCRIPT, &script_obj)) {\n                        continue;\n                    }\n                    const char *script = json_object_get_string(script_obj);\n                    if (!script) continue;\n                    \n                    const char *regex = NULL, *prefix = NULL;\n                    \n                    json_object *regex_obj;\n                    if (json_object_object_get_ex(callback_config, JSON_CALLBACK_REG, &regex_obj)) {\n                        regex = json_object_get_string(regex_obj);\n                    }\n                    \n                    json_object *prefix_obj;\n                    if (json_object_object_get_ex(callback_config, JSON_CALLBACK_PREFIX, &prefix_obj)) {\n                        prefix = json_object_get_string(prefix_obj);\n                    }\n                    \n                    add_event_callback(port, script, regex, prefix);\n                }\n            }\n        }\n    }\n    \n    json_object_put(root);\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/ubus_at_daemon/src/const.h",
    "content": "#ifndef CONST_H\n#define CONST_H\n\n#include <termios.h>\n\n// Default AT port settings\n#define DEFAULT_BAUDRATE B115200\n#define DEFAULT_DATABITS 8\n#define DEFAULT_PARITY 0    // no parity\n#define DEFAULT_STOPBITS 1\n#define DEFAULT_TIMEOUT 5   // seconds\n\n// Port monitoring settings\n#define DEFAULT_CHECK_INTERVAL 30  // seconds\n#define PORT_MONITOR_INTERVAL 5    // seconds\n\n// Buffer sizes\n#define MAX_AT_PORTS 32\n#define MAX_BUFFER_SIZE 32768\n#define MAX_QUEUE_SIZE 100\n#define MAX_AT_CMD_SIZE 512\n#define MAX_PORT_PATH_SIZE 64\n#define MAX_SCRIPT_PATH_SIZE 256\n#define MAX_REGEX_SIZE 128\n#define MAX_PREFIX_SIZE 64\n#define MAX_CALLBACKS 16\n\n// AT command termination\n#define AT_CMD_TERMINATOR \"\\r\\n\"\n#define DEFAULT_END_FLAG \"OK\"\n\n// Default end flags list\n#define DEFAULT_END_FLAGS { \"OK\", \"ERROR\", \"+CMS ERROR:\", \"+CME ERROR:\", \"NO CARRIER\", NULL }\n\n// JSON config keys\n#define JSON_AT_PORT \"at_port\"\n#define JSON_BAUDRATE \"baudrate\"\n#define JSON_DATABITS \"databits\"\n#define JSON_PARITY \"parity\"\n#define JSON_STOPBITS \"stopbits\"\n#define JSON_TIMEOUT \"timeout\"\n#define JSON_CALLBACKS \"event_callbacks\"\n#define JSON_CALLBACK_SCRIPT \"callback_script\"\n#define JSON_CALLBACK_REG \"callback_reg\"\n#define JSON_CALLBACK_PREFIX \"callback_prefix\"\n\n#endif // CONST_H\n"
  },
  {
    "path": "luci-app-qmodem/application/ubus_at_daemon/src/event_callback.c",
    "content": "#include \"ubus_at_daemon.h\"\n\nvoid add_event_callback(at_port_instance_t *port, const char *script, const char *regex, const char *prefix) {\n    event_callback_t *callback = calloc(1, sizeof(event_callback_t));\n    if (!callback) {\n        return;\n    }\n    \n    strncpy(callback->callback_script, script, MAX_SCRIPT_PATH_SIZE - 1);\n    \n    callback->match_all = 1; // Default to match all\n    callback->has_regex = 0;\n    \n    if (regex && strlen(regex) > 0) {\n        strncpy(callback->callback_reg, regex, MAX_REGEX_SIZE - 1);\n        if (regcomp(&callback->compiled_regex, regex, REG_EXTENDED) == 0) {\n            callback->has_regex = 1;\n            callback->match_all = 0;\n        }\n    } else if (prefix && strlen(prefix) > 0) {\n        strncpy(callback->callback_prefix, prefix, MAX_PREFIX_SIZE - 1);\n        callback->match_all = 0;\n    }\n    \n    // Add to callback list\n    callback->next = port->callbacks;\n    port->callbacks = callback;\n}\n\nvoid remove_event_callback(at_port_instance_t *port, const char *script) {\n    event_callback_t **current = &port->callbacks;\n    \n    while (*current) {\n        if (strcmp((*current)->callback_script, script) == 0) {\n            event_callback_t *to_remove = *current;\n            *current = (*current)->next;\n            \n            if (to_remove->has_regex) {\n                regfree(&to_remove->compiled_regex);\n            }\n            free(to_remove);\n            return;\n        }\n        current = &(*current)->next;\n    }\n}\n\nvoid clear_event_callbacks(at_port_instance_t *port) {\n    event_callback_t *current = port->callbacks;\n    \n    while (current) {\n        event_callback_t *next = current->next;\n        \n        if (current->has_regex) {\n            regfree(&current->compiled_regex);\n        }\n        free(current);\n        current = next;\n    }\n    \n    port->callbacks = NULL;\n}\n\nvoid process_incoming_data(at_port_instance_t *port, const char *data) {\n    event_callback_t *callback = port->callbacks;\n    \n    while (callback) {\n        int should_trigger = 0;\n        \n        if (callback->match_all) {\n            should_trigger = 1;\n        } else if (callback->has_regex) {\n            regmatch_t match;\n            if (regexec(&callback->compiled_regex, data, 1, &match, 0) == 0) {\n                should_trigger = 1;\n            }\n        } else if (strlen(callback->callback_prefix) > 0) {\n            if (strncmp(data, callback->callback_prefix, strlen(callback->callback_prefix)) == 0) {\n                should_trigger = 1;\n            }\n        }\n        \n        if (should_trigger) {\n            // Execute callback script\n            char command[MAX_SCRIPT_PATH_SIZE + MAX_BUFFER_SIZE + 32];\n            snprintf(command, sizeof(command), \"%s \\\"%s\\\"\", callback->callback_script, data);\n            \n            pid_t pid = fork();\n            if (pid == 0) {\n                // Child process\n                system(command);\n                exit(0);\n            } else if (pid > 0) {\n                // Parent process - don't wait for child to avoid blocking\n            }\n        }\n        \n        callback = callback->next;\n    }\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/ubus_at_daemon/src/main.c",
    "content": "#include \"ubus_at_daemon.h\"\n\n#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))\n\nat_daemon_ctx_t g_daemon_ctx;\n\n// Policy for open method\nenum {\n    OPEN_AT_PORT,\n    OPEN_BAUDRATE,\n    OPEN_DATABITS,\n    OPEN_PARITY,\n    OPEN_STOPBITS,\n    OPEN_TIMEOUT,\n    __OPEN_MAX\n};\n\nstatic const struct blobmsg_policy open_policy[] = {\n    [OPEN_AT_PORT] = { .name = JSON_AT_PORT, .type = BLOBMSG_TYPE_STRING },\n    [OPEN_BAUDRATE] = { .name = JSON_BAUDRATE, .type = BLOBMSG_TYPE_INT32 },\n    [OPEN_DATABITS] = { .name = JSON_DATABITS, .type = BLOBMSG_TYPE_INT32 },\n    [OPEN_PARITY] = { .name = JSON_PARITY, .type = BLOBMSG_TYPE_INT32 },\n    [OPEN_STOPBITS] = { .name = JSON_STOPBITS, .type = BLOBMSG_TYPE_INT32 },\n    [OPEN_TIMEOUT] = { .name = JSON_TIMEOUT, .type = BLOBMSG_TYPE_INT32 },\n};\n\n// Policy for sendat method\nenum {\n    SENDAT_AT_PORT,\n    SENDAT_TIMEOUT,\n    SENDAT_END_FLAG,\n    SENDAT_AT_CMD,\n    SENDAT_RAW_AT_CONTENT,\n    SENDAT_SENDONLY,\n    __SENDAT_MAX\n};\n\nstatic const struct blobmsg_policy sendat_policy[] = {\n    [SENDAT_AT_PORT] = { .name = JSON_AT_PORT, .type = BLOBMSG_TYPE_STRING },\n    [SENDAT_TIMEOUT] = { .name = JSON_TIMEOUT, .type = BLOBMSG_TYPE_INT32 },\n    [SENDAT_END_FLAG] = { .name = \"end_flag\", .type = BLOBMSG_TYPE_STRING },\n    [SENDAT_AT_CMD] = { .name = \"at_cmd\", .type = BLOBMSG_TYPE_STRING },\n    [SENDAT_RAW_AT_CONTENT] = { .name = \"raw_at_content\", .type = BLOBMSG_TYPE_STRING },\n    [SENDAT_SENDONLY] = { .name = \"sendonly\", .type = BLOBMSG_TYPE_BOOL },\n};\n\n// Policy for close method\nenum {\n    CLOSE_AT_PORT,\n    __CLOSE_MAX\n};\n\nstatic const struct blobmsg_policy close_policy[] = {\n    [CLOSE_AT_PORT] = { .name = JSON_AT_PORT, .type = BLOBMSG_TYPE_STRING },\n};\n\n// Ubus method: open\nstatic int ubus_open_method(struct ubus_context *ctx, struct ubus_object *obj,\n                           struct ubus_request_data *req, const char *method,\n                           struct blob_attr *msg) {\n    struct blob_attr *tb[__OPEN_MAX];\n    const char *at_port;\n    int baudrate = 115200;  // Default values from const.h\n    int databits = DEFAULT_DATABITS;\n    int parity = DEFAULT_PARITY;\n    int stopbits = DEFAULT_STOPBITS;\n    int timeout = DEFAULT_TIMEOUT;\n    \n    blobmsg_parse(open_policy, __OPEN_MAX, tb, blob_data(msg), blob_len(msg));\n    \n    if (!tb[OPEN_AT_PORT]) {\n        return UBUS_STATUS_INVALID_ARGUMENT;\n    }\n    \n    at_port = blobmsg_get_string(tb[OPEN_AT_PORT]);\n    \n    if (tb[OPEN_BAUDRATE])\n        baudrate = blobmsg_get_u32(tb[OPEN_BAUDRATE]);\n    if (tb[OPEN_DATABITS])\n        databits = blobmsg_get_u32(tb[OPEN_DATABITS]);\n    if (tb[OPEN_PARITY])\n        parity = blobmsg_get_u32(tb[OPEN_PARITY]);\n    if (tb[OPEN_STOPBITS])\n        stopbits = blobmsg_get_u32(tb[OPEN_STOPBITS]);\n    if (tb[OPEN_TIMEOUT])\n        timeout = blobmsg_get_u32(tb[OPEN_TIMEOUT]);\n    \n    // Find existing port instance\n    at_port_instance_t *port = find_port_instance(at_port);\n    int is_new_port = (port == NULL);\n    \n    if (!port) {\n        // Check if port file exists before creating instance\n        if (access(at_port, F_OK) != 0) {\n            struct blob_buf b = {};\n            blob_buf_init(&b, 0);\n            blobmsg_add_string(&b, \"status\", \"error\");\n            blobmsg_add_string(&b, \"message\", \"Port file does not exist\");\n            ubus_send_reply(ctx, req, b.head);\n            blob_buf_free(&b);\n            return UBUS_STATUS_OK;\n        }\n        \n        port = create_port_instance(at_port);\n        if (!port) {\n            return UBUS_STATUS_NO_DATA;\n        }\n    }\n    \n    // Open the port\n    int result = open_at_port(port, baudrate, databits, parity, stopbits);\n    \n    struct blob_buf b = {};\n    blob_buf_init(&b, 0);\n    \n    if (result == 0) {\n        blobmsg_add_string(&b, \"status\", \"success\");\n        blobmsg_add_string(&b, \"port\", at_port);\n        blobmsg_add_u32(&b, \"baudrate\", baudrate);\n        blobmsg_add_u32(&b, \"databits\", databits);\n        blobmsg_add_u32(&b, \"parity\", parity);\n        blobmsg_add_u32(&b, \"stopbits\", stopbits);\n        ubus_send_reply(ctx, req, b.head);\n    } else {\n        blobmsg_add_string(&b, \"status\", \"error\");\n        blobmsg_add_string(&b, \"message\", \"Failed to open port\");\n        ubus_send_reply(ctx, req, b.head);\n        \n        // If this was a new port instance and opening failed, remove it from the list\n        if (is_new_port) {\n            destroy_port_instance(port);\n        }\n    }\n    \n    blob_buf_free(&b);\n    return UBUS_STATUS_OK;\n}\n\nstatic int ubus_sendat_method(struct ubus_context *ctx, struct ubus_object *obj,\n                             struct ubus_request_data *req, const char *method,\n                             struct blob_attr *msg) {\n    struct blob_attr *tb[__SENDAT_MAX];\n    const char *at_port, *at_cmd = NULL, *raw_at_content = NULL, *end_flag = NULL;\n    int timeout = DEFAULT_TIMEOUT;\n    int is_raw = 0;\n    int sendonly = 0;\n    \n    blobmsg_parse(sendat_policy, __SENDAT_MAX, tb, blob_data(msg), blob_len(msg));\n    \n    if (!tb[SENDAT_AT_PORT]) {\n        return UBUS_STATUS_INVALID_ARGUMENT;\n    }\n    \n    at_port = blobmsg_get_string(tb[SENDAT_AT_PORT]);\n    \n    if (tb[SENDAT_TIMEOUT])\n        timeout = blobmsg_get_u32(tb[SENDAT_TIMEOUT]);\n    if (tb[SENDAT_END_FLAG])\n        end_flag = blobmsg_get_string(tb[SENDAT_END_FLAG]);\n    if (tb[SENDAT_SENDONLY])\n        sendonly = blobmsg_get_bool(tb[SENDAT_SENDONLY]);\n    \n    if (tb[SENDAT_AT_CMD]) {\n        at_cmd = blobmsg_get_string(tb[SENDAT_AT_CMD]);\n        is_raw = 0;\n    } else if (tb[SENDAT_RAW_AT_CONTENT]) {\n        raw_at_content = blobmsg_get_string(tb[SENDAT_RAW_AT_CONTENT]);\n        is_raw = 1;\n    } else {\n        return UBUS_STATUS_INVALID_ARGUMENT;\n    }\n    \n    // Find or create port instance\n    at_port_instance_t *port = find_port_instance(at_port);\n    if (!port) {\n        port = create_port_instance(at_port);\n        if (!port) {\n            return UBUS_STATUS_NO_DATA;\n        }\n    }\n    \n    const char *cmd = is_raw ? raw_at_content : at_cmd;\n    int result;\n    at_response_t response;\n    \n    if (sendonly) {\n        // Send only without waiting for response\n        result = send_at_command_only(port, cmd, is_raw);\n    } else {\n        // Send AT command with response\n        result = send_at_command_with_response(port, cmd, timeout, end_flag, is_raw, &response);\n    }\n    \n    struct blob_buf b = {};\n    blob_buf_init(&b, 0);\n    \n    blobmsg_add_string(&b, \"port\", at_port);\n    blobmsg_add_string(&b, \"command\", cmd);\n    blobmsg_add_u32(&b, \"is_raw\", is_raw);\n    blobmsg_add_u32(&b, \"sendonly\", sendonly);\n    \n    if (sendonly) {\n        // For send-only mode\n        if (result == 0) {\n            blobmsg_add_string(&b, \"status\", \"success\");\n            blobmsg_add_string(&b, \"message\", \"Command sent successfully\");\n        } else {\n            blobmsg_add_string(&b, \"status\", \"error\");\n            blobmsg_add_string(&b, \"message\", \"Failed to send AT command\");\n        }\n    } else {\n        // For normal mode with response\n        blobmsg_add_u32(&b, \"timeout\", timeout);\n        blobmsg_add_string(&b, \"end_flag\", end_flag ? end_flag : \"default\");\n        \n        // Add debug info about end flags used\n        void *end_flags_array = blobmsg_open_array(&b, \"end_flags_used\");\n        for (int i = 0; i < port->num_end_flags; i++) {\n            blobmsg_add_string(&b, NULL, port->expected_end_flags[i]);\n        }\n        blobmsg_close_array(&b, end_flags_array);\n        \n        if (result == 0) {\n            blobmsg_add_string(&b, \"status\", \"success\");\n            blobmsg_add_string(&b, \"response\", response.response);\n            blobmsg_add_u32(&b, \"response_length\", response.response_len);\n            blobmsg_add_string(&b, \"end_flag_matched\", response.end_flag_matched);\n            blobmsg_add_u32(&b, \"response_time_ms\", response.response_time_ms);\n        } else if (result == -1) {\n            blobmsg_add_string(&b, \"status\", \"timeout\");\n            blobmsg_add_string(&b, \"message\", \"AT command timed out\");\n            blobmsg_add_u32(&b, \"response_time_ms\", response.response_time_ms);\n            if (strlen(response.response) > 0) {\n                blobmsg_add_string(&b, \"partial_response\", response.response);\n            }\n        } else {\n            blobmsg_add_string(&b, \"status\", \"error\");\n            blobmsg_add_string(&b, \"message\", \"Failed to send AT command\");\n            blobmsg_add_u32(&b, \"response_time_ms\", response.response_time_ms);\n        }\n    }\n    \n    ubus_send_reply(ctx, req, b.head);\n    blob_buf_free(&b);\n    return UBUS_STATUS_OK;\n}\n\n// Ubus method: list\nstatic int ubus_list_method(struct ubus_context *ctx, struct ubus_object *obj,\n                           struct ubus_request_data *req, const char *method,\n                           struct blob_attr *msg) {\n    struct blob_buf b = {};\n    blob_buf_init(&b, 0);\n    \n    void *array = blobmsg_open_array(&b, \"ports\");\n    \n    pthread_mutex_lock(&g_daemon_ctx.ports_mutex);\n    at_port_instance_t *current = g_daemon_ctx.ports;\n    \n    while (current) {\n        void *port_obj = blobmsg_open_table(&b, NULL);\n        blobmsg_add_string(&b, \"port\", current->port_path);\n        blobmsg_add_u32(&b, \"is_open\", current->is_open);\n        if (current->is_open) {\n            blobmsg_add_u32(&b, \"fd\", current->fd);\n            if (current->configured_baudrate > 0) {\n                blobmsg_add_u32(&b, \"baudrate\", current->configured_baudrate);\n                blobmsg_add_u32(&b, \"databits\", current->configured_databits);\n                blobmsg_add_u32(&b, \"parity\", current->configured_parity);\n                blobmsg_add_u32(&b, \"stopbits\", current->configured_stopbits);\n            }\n        } else {\n            // Check if file exists for closed ports\n            if (access(current->port_path, F_OK) == 0) {\n                blobmsg_add_string(&b, \"file_status\", \"exists\");\n            } else {\n                blobmsg_add_string(&b, \"file_status\", \"missing\");\n            }\n        }\n        blobmsg_add_u32(&b, \"last_check\", (uint32_t)current->last_check_time);\n        blobmsg_close_table(&b, port_obj);\n        current = current->next;\n    }\n    \n    pthread_mutex_unlock(&g_daemon_ctx.ports_mutex);\n    blobmsg_close_array(&b, array);\n    \n    ubus_send_reply(ctx, req, b.head);\n    blob_buf_free(&b);\n    return UBUS_STATUS_OK;\n}\n\n// Ubus method: close\nstatic int ubus_close_method(struct ubus_context *ctx, struct ubus_object *obj,\n                            struct ubus_request_data *req, const char *method,\n                            struct blob_attr *msg) {\n    struct blob_attr *tb[__CLOSE_MAX];\n    const char *at_port;\n    \n    blobmsg_parse(close_policy, __CLOSE_MAX, tb, blob_data(msg), blob_len(msg));\n    \n    if (!tb[CLOSE_AT_PORT]) {\n        return UBUS_STATUS_INVALID_ARGUMENT;\n    }\n    \n    at_port = blobmsg_get_string(tb[CLOSE_AT_PORT]);\n    \n    at_port_instance_t *port = find_port_instance(at_port);\n    \n    struct blob_buf b = {};\n    blob_buf_init(&b, 0);\n    \n    if (port) {\n        close_at_port(port);\n        destroy_port_instance(port);\n        blobmsg_add_string(&b, \"status\", \"success\");\n        blobmsg_add_string(&b, \"port\", at_port);\n        blobmsg_add_string(&b, \"message\", \"Port closed and removed\");\n    } else {\n        blobmsg_add_string(&b, \"status\", \"error\");\n        blobmsg_add_string(&b, \"message\", \"Port not found\");\n    }\n    \n    ubus_send_reply(ctx, req, b.head);\n    blob_buf_free(&b);\n    return UBUS_STATUS_OK;\n}\n\n// Ubus methods table\nstatic const struct ubus_method at_daemon_methods[] = {\n    UBUS_METHOD(\"open\", ubus_open_method, open_policy),\n    UBUS_METHOD(\"sendat\", ubus_sendat_method, sendat_policy),\n    UBUS_METHOD_NOARG(\"list\", ubus_list_method),\n    UBUS_METHOD(\"close\", ubus_close_method, close_policy),\n};\n\nstatic struct ubus_object_type at_daemon_object_type =\n    UBUS_OBJECT_TYPE(\"at-daemon\", at_daemon_methods);\n\nstatic struct ubus_object at_daemon_object = {\n    .name = \"at-daemon\",\n    .type = &at_daemon_object_type,\n    .methods = at_daemon_methods,\n    .n_methods = ARRAY_SIZE(at_daemon_methods),\n};\n\nstatic void server_main(void) {\n    uloop_init();\n    \n    g_daemon_ctx.ctx = ubus_connect(NULL);\n    if (!g_daemon_ctx.ctx) {\n        fprintf(stderr, \"Failed to connect to ubus\\n\");\n        return;\n    }\n    \n    ubus_add_uloop(g_daemon_ctx.ctx);\n    \n    int ret = ubus_add_object(g_daemon_ctx.ctx, &at_daemon_object);\n    if (ret) {\n        fprintf(stderr, \"Failed to add object: %s\\n\", ubus_strerror(ret));\n        return;\n    }\n    \n    g_daemon_ctx.obj = at_daemon_object;\n    \n    // Start port monitoring thread\n    start_port_monitor();\n    \n    printf(\"ubus-at-daemon started\\n\");\n    uloop_run();\n    \n    // Stop port monitoring thread\n    stop_port_monitor();\n    \n    ubus_free(g_daemon_ctx.ctx);\n    uloop_done();\n}\n\nint main(int argc, char **argv) {\n    // Initialize global context\n    memset(&g_daemon_ctx, 0, sizeof(g_daemon_ctx));\n    g_daemon_ctx.ports = NULL;\n    pthread_mutex_init(&g_daemon_ctx.ports_mutex, NULL);\n    \n    server_main();\n    \n    // Cleanup\n    pthread_mutex_lock(&g_daemon_ctx.ports_mutex);\n    at_port_instance_t *current = g_daemon_ctx.ports;\n    while (current) {\n        at_port_instance_t *next = current->next;\n        destroy_port_instance(current);\n        current = next;\n    }\n    pthread_mutex_unlock(&g_daemon_ctx.ports_mutex);\n    \n    pthread_mutex_destroy(&g_daemon_ctx.ports_mutex);\n    \n    return 0;\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/ubus_at_daemon/src/port_manager.c",
    "content": "#include \"ubus_at_daemon.h\"\n\nextern at_daemon_ctx_t g_daemon_ctx;\n\nat_port_instance_t *find_port_instance(const char *port_path) {\n    pthread_mutex_lock(&g_daemon_ctx.ports_mutex);\n    \n    at_port_instance_t *current = g_daemon_ctx.ports;\n    while (current) {\n        if (strcmp(current->port_path, port_path) == 0) {\n            pthread_mutex_unlock(&g_daemon_ctx.ports_mutex);\n            return current;\n        }\n        current = current->next;\n    }\n    \n    pthread_mutex_unlock(&g_daemon_ctx.ports_mutex);\n    return NULL;\n}\n\nat_port_instance_t *create_port_instance(const char *port_path) {\n    at_port_instance_t *port = calloc(1, sizeof(at_port_instance_t));\n    if (!port) {\n        return NULL;\n    }\n    \n    strncpy(port->port_path, port_path, MAX_PORT_PATH_SIZE - 1);\n    port->fd = -1;\n    port->is_open = 0;\n    port->should_stop = 0;\n    port->buffer_pos = 0;\n    port->queue_head = NULL;\n    port->queue_tail = NULL;\n    port->callbacks = NULL;\n    \n    // Initialize configuration fields\n    port->configured_baudrate = 0;\n    port->configured_databits = 0;\n    port->configured_parity = 0;\n    port->configured_stopbits = 0;\n    \n    // Initialize monitoring fields\n    port->last_check_time = time(NULL);\n    port->check_interval = DEFAULT_CHECK_INTERVAL;\n    \n    // Initialize response handling\n    memset(&port->current_response, 0, sizeof(at_response_t));\n    port->waiting_for_response = 0;\n    port->num_end_flags = 0;\n    \n    pthread_mutex_init(&port->queue_mutex, NULL);\n    pthread_mutex_init(&port->write_mutex, NULL);\n    pthread_mutex_init(&port->response_mutex, NULL);\n    pthread_cond_init(&port->queue_cond, NULL);\n    pthread_cond_init(&port->response_cond, NULL);\n    \n    // Add to global ports list\n    pthread_mutex_lock(&g_daemon_ctx.ports_mutex);\n    port->next = g_daemon_ctx.ports;\n    g_daemon_ctx.ports = port;\n    pthread_mutex_unlock(&g_daemon_ctx.ports_mutex);\n    \n    return port;\n}\n\nvoid destroy_port_instance(at_port_instance_t *port) {\n    if (!port) return;\n    \n    // Stop the reader thread\n    port->should_stop = 1;\n    if (port->reader_thread) {\n        pthread_join(port->reader_thread, NULL);\n    }\n    \n    // Close the port\n    close_at_port(port);\n    \n    // Clean up queue\n    pthread_mutex_lock(&port->queue_mutex);\n    at_queue_item_t *current = port->queue_head;\n    while (current) {\n        at_queue_item_t *next = current->next;\n        free(current);\n        current = next;\n    }\n    pthread_mutex_unlock(&port->queue_mutex);\n    \n    // Clean up callbacks\n    clear_event_callbacks(port);\n    \n    // Destroy mutexes\n    pthread_mutex_destroy(&port->queue_mutex);\n    pthread_mutex_destroy(&port->write_mutex);\n    pthread_mutex_destroy(&port->response_mutex);\n    pthread_cond_destroy(&port->queue_cond);\n    pthread_cond_destroy(&port->response_cond);\n    \n    // Remove from global list\n    pthread_mutex_lock(&g_daemon_ctx.ports_mutex);\n    if (g_daemon_ctx.ports == port) {\n        g_daemon_ctx.ports = port->next;\n    } else {\n        at_port_instance_t *prev = g_daemon_ctx.ports;\n        while (prev && prev->next != port) {\n            prev = prev->next;\n        }\n        if (prev) {\n            prev->next = port->next;\n        }\n    }\n    pthread_mutex_unlock(&g_daemon_ctx.ports_mutex);\n    \n    free(port);\n}\n\nint open_at_port(at_port_instance_t *port, int baudrate, int databits, int parity, int stopbits) {\n    if (port->is_open) {\n        close_at_port(port);\n    }\n    \n    // Check if file exists before trying to open\n    if (access(port->port_path, F_OK) != 0) {\n        fprintf(stderr, \"Port file %s does not exist\\n\", port->port_path);\n        return -1;\n    }\n    \n    port->fd = open(port->port_path, O_RDWR | O_NOCTTY | O_NONBLOCK);\n    if (port->fd < 0) {\n        fprintf(stderr, \"Failed to open %s: %s\\n\", port->port_path, strerror(errno));\n        return -1;\n    }\n    \n    // Configure terminal settings\n    struct termios options;\n    tcgetattr(port->fd, &options);\n    \n    // Set baud rate\n    speed_t speed;\n    switch (baudrate) {\n        case 9600: speed = B9600; break;\n        case 19200: speed = B19200; break;\n        case 38400: speed = B38400; break;\n        case 57600: speed = B57600; break;\n        case 115200: speed = B115200; break;\n        case 230400: speed = B230400; break;\n        case 460800: speed = B460800; break;\n        case 921600: speed = B921600; break;\n        default: speed = DEFAULT_BAUDRATE; break;\n    }\n    cfsetispeed(&options, speed);\n    cfsetospeed(&options, speed);\n    \n    // Configure data bits\n    options.c_cflag &= ~CSIZE;\n    switch (databits) {\n        case 5: options.c_cflag |= CS5; break;\n        case 6: options.c_cflag |= CS6; break;\n        case 7: options.c_cflag |= CS7; break;\n        case 8: options.c_cflag |= CS8; break;\n        default: options.c_cflag |= CS8; break;\n    }\n    \n    // Configure parity\n    if (parity == 1) { // odd\n        options.c_cflag |= PARENB | PARODD;\n    } else if (parity == 2) { // even\n        options.c_cflag |= PARENB;\n        options.c_cflag &= ~PARODD;\n    } else { // none\n        options.c_cflag &= ~PARENB;\n    }\n    \n    // Configure stop bits\n    if (stopbits == 2) {\n        options.c_cflag |= CSTOPB;\n    } else {\n        options.c_cflag &= ~CSTOPB;\n    }\n    \n    // Other settings\n    options.c_cflag |= CLOCAL | CREAD;\n    options.c_lflag &= ~(ICANON | ECHO | ECHOE | ISIG);\n    options.c_iflag &= ~(IXON | IXOFF | IXANY | ICRNL);\n    options.c_oflag &= ~OPOST;\n    \n    options.c_cc[VMIN] = 0;\n    options.c_cc[VTIME] = 1;\n    \n    tcsetattr(port->fd, TCSANOW, &options);\n    port->termios_config = options;\n    \n    // Store configuration for potential reconnection\n    port->configured_baudrate = baudrate;\n    port->configured_databits = databits;\n    port->configured_parity = parity;\n    port->configured_stopbits = stopbits;\n    \n    port->is_open = 1;\n    port->should_stop = 0;\n    port->buffer_pos = 0;\n    \n    // Start reader thread\n    if (pthread_create(&port->reader_thread, NULL, reader_thread_func, port) != 0) {\n        fprintf(stderr, \"Failed to create reader thread for %s\\n\", port->port_path);\n        close(port->fd);\n        port->fd = -1;\n        port->is_open = 0;\n        return -1;\n    }\n    \n    return 0;\n}\n\nvoid close_at_port(at_port_instance_t *port) {\n    if (!port->is_open) return;\n    \n    port->should_stop = 1;\n    \n    if (port->reader_thread) {\n        pthread_join(port->reader_thread, NULL);\n        port->reader_thread = 0;\n    }\n    \n    if (port->fd >= 0) {\n        close(port->fd);\n        port->fd = -1;\n    }\n    \n    port->is_open = 0;\n}\n\n// Port monitoring functions\nvoid check_and_reconnect_port(at_port_instance_t *port) {\n    time_t current_time = time(NULL);\n    \n    // Check if it's time to check this port\n    if (current_time - port->last_check_time < port->check_interval) {\n        return;\n    }\n    \n    port->last_check_time = current_time;\n    \n    if (!port->is_open) {\n        // Port is marked as closed, check if file exists and try to reopen\n        if (access(port->port_path, F_OK) == 0) {\n            // File exists, try to reopen\n            fprintf(stdout, \"Port %s exists but is closed, attempting to reopen...\\n\", port->port_path);\n            \n            // Use stored configuration or defaults\n            int baudrate = (port->configured_baudrate > 0) ? port->configured_baudrate : 115200;\n            int databits = (port->configured_databits > 0) ? port->configured_databits : DEFAULT_DATABITS;\n            int parity = port->configured_parity;\n            int stopbits = (port->configured_stopbits > 0) ? port->configured_stopbits : DEFAULT_STOPBITS;\n            \n            if (open_at_port(port, baudrate, databits, parity, stopbits) == 0) {\n                fprintf(stdout, \"Successfully reopened port %s\\n\", port->port_path);\n            } else {\n                fprintf(stderr, \"Failed to reopen port %s\\n\", port->port_path);\n            }\n        }\n    } else {\n        // Port is marked as open, verify it's still accessible\n        if (access(port->port_path, F_OK) != 0) {\n            // File no longer exists\n            fprintf(stderr, \"Port %s no longer exists, marking as closed\\n\", port->port_path);\n            close_at_port(port);\n        } else {\n            // File exists, check if file descriptor is still valid\n            if (port->fd >= 0) {\n                // Try a simple write to test if the fd is still valid\n                int test_result = fcntl(port->fd, F_GETFL);\n                if (test_result == -1 && errno == EBADF) {\n                    // File descriptor is bad, port needs to be reopened\n                    fprintf(stderr, \"Port %s file descriptor is invalid, reopening...\\n\", port->port_path);\n                    close_at_port(port);\n                    \n                    // Use stored configuration or defaults\n                    int baudrate = (port->configured_baudrate > 0) ? port->configured_baudrate : 115200;\n                    int databits = (port->configured_databits > 0) ? port->configured_databits : DEFAULT_DATABITS;\n                    int parity = port->configured_parity;\n                    int stopbits = (port->configured_stopbits > 0) ? port->configured_stopbits : DEFAULT_STOPBITS;\n                    \n                    if (open_at_port(port, baudrate, databits, parity, stopbits) == 0) {\n                        fprintf(stdout, \"Successfully reopened port %s after fd failure\\n\", port->port_path);\n                    } else {\n                        fprintf(stderr, \"Failed to reopen port %s after fd failure\\n\", port->port_path);\n                    }\n                }\n            }\n        }\n    }\n}\n\nvoid *port_monitor_thread_func(void *arg) {\n    while (!g_daemon_ctx.monitor_should_stop) {\n        pthread_mutex_lock(&g_daemon_ctx.ports_mutex);\n        \n        at_port_instance_t *current = g_daemon_ctx.ports;\n        while (current) {\n            check_and_reconnect_port(current);\n            current = current->next;\n        }\n        \n        pthread_mutex_unlock(&g_daemon_ctx.ports_mutex);\n        \n        // Sleep for monitoring interval\n        sleep(PORT_MONITOR_INTERVAL);\n    }\n    \n    return NULL;\n}\n\nvoid start_port_monitor(void) {\n    g_daemon_ctx.monitor_should_stop = 0;\n    if (pthread_create(&g_daemon_ctx.monitor_thread, NULL, port_monitor_thread_func, NULL) != 0) {\n        fprintf(stderr, \"Failed to create port monitor thread\\n\");\n    } else {\n        fprintf(stdout, \"Port monitor thread started\\n\");\n    }\n}\n\nvoid stop_port_monitor(void) {\n    g_daemon_ctx.monitor_should_stop = 1;\n    if (g_daemon_ctx.monitor_thread) {\n        pthread_join(g_daemon_ctx.monitor_thread, NULL);\n        g_daemon_ctx.monitor_thread = 0;\n        fprintf(stdout, \"Port monitor thread stopped\\n\");\n    }\n}\n"
  },
  {
    "path": "luci-app-qmodem/application/ubus_at_daemon/src/ubus_at_daemon.h",
    "content": "#ifndef UBUS_AT_DAEMON_H\n#define UBUS_AT_DAEMON_H\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <termios.h>\n#include <pthread.h>\n#include <regex.h>\n#include <time.h>\n#include <json-c/json.h>\n#include <libubus.h>\n#include <libubox/uloop.h>\n#include <libubox/blobmsg_json.h>\n\n#include \"const.h\"\n\n// AT command response structure\ntypedef struct at_response {\n    char response[MAX_BUFFER_SIZE];\n    int response_len;\n    int status;  // 0: success, -1: timeout, -2: error\n    char end_flag_matched[64];\n    struct timespec start_time;\n    struct timespec end_time;\n    long response_time_ms;  // Response time in milliseconds\n} at_response_t;\n\n// AT command queue item\ntypedef struct at_queue_item {\n    char at_cmd[MAX_AT_CMD_SIZE];\n    char raw_content[MAX_AT_CMD_SIZE];\n    int timeout;\n    char end_flag[64];\n    int is_raw;\n    struct at_queue_item *next;\n} at_queue_item_t;\n\n// Event callback structure\ntypedef struct event_callback {\n    char callback_script[MAX_SCRIPT_PATH_SIZE];\n    char callback_reg[MAX_REGEX_SIZE];\n    char callback_prefix[MAX_PREFIX_SIZE];\n    regex_t compiled_regex;\n    int has_regex;\n    int match_all;\n    struct event_callback *next;\n} event_callback_t;\n\n// AT port instance\ntypedef struct at_port_instance {\n    char port_path[MAX_PORT_PATH_SIZE];\n    int fd;\n    struct termios termios_config;\n    \n    // Port configuration for reconnection\n    int configured_baudrate;\n    int configured_databits;\n    int configured_parity;\n    int configured_stopbits;\n    \n    // Thread and synchronization\n    pthread_t reader_thread;\n    pthread_mutex_t queue_mutex;\n    pthread_mutex_t write_mutex;\n    pthread_cond_t queue_cond;\n    \n    // Queue and buffer\n    at_queue_item_t *queue_head;\n    at_queue_item_t *queue_tail;\n    char read_buffer[MAX_BUFFER_SIZE];\n    int buffer_pos;\n    \n    // Response handling\n    at_response_t current_response;\n    pthread_mutex_t response_mutex;\n    pthread_cond_t response_cond;\n    int waiting_for_response;\n    char expected_end_flags[5][64];  // Support multiple end flags\n    int num_end_flags;\n    \n    // Event callbacks\n    event_callback_t *callbacks;\n    \n    // Status\n    int is_open;\n    int should_stop;\n    \n    // Port monitoring\n    time_t last_check_time;\n    int check_interval;  // in seconds\n    \n    struct at_port_instance *next;\n} at_port_instance_t;\n\n// Global context\ntypedef struct {\n    struct ubus_context *ctx;\n    struct ubus_object obj;\n    at_port_instance_t *ports;\n    pthread_mutex_t ports_mutex;\n    \n    // Port monitoring thread\n    pthread_t monitor_thread;\n    int monitor_should_stop;\n} at_daemon_ctx_t;\n\n// Function declarations\nat_port_instance_t *find_port_instance(const char *port_path);\nat_port_instance_t *create_port_instance(const char *port_path);\nvoid destroy_port_instance(at_port_instance_t *port);\n\nint open_at_port(at_port_instance_t *port, int baudrate, int databits, int parity, int stopbits);\nvoid close_at_port(at_port_instance_t *port);\n\nint send_at_command_with_response(at_port_instance_t *port, const char *cmd, int timeout, const char *end_flag, int is_raw, at_response_t *response);\nint send_at_command(at_port_instance_t *port, const char *cmd, int timeout, const char *end_flag, int is_raw);\nint send_at_command_only(at_port_instance_t *port, const char *cmd, int is_raw);\nvoid *reader_thread_func(void *arg);\nvoid parse_end_flags(at_port_instance_t *port, const char *end_flag_str);\n\nvoid add_event_callback(at_port_instance_t *port, const char *script, const char *regex, const char *prefix);\nvoid remove_event_callback(at_port_instance_t *port, const char *script);\nvoid clear_event_callbacks(at_port_instance_t *port);\nvoid process_incoming_data(at_port_instance_t *port, const char *data);\n\nint load_config_from_json(const char *json_path);\nchar *hex_to_string(const char *hex_str);\n\n// Port monitoring functions\nvoid *port_monitor_thread_func(void *arg);\nvoid check_and_reconnect_port(at_port_instance_t *port);\nvoid start_port_monitor(void);\nvoid stop_port_monitor(void);\n\n// Ubus method handlers\nstatic int ubus_open_method(struct ubus_context *ctx, struct ubus_object *obj,\n                           struct ubus_request_data *req, const char *method,\n                           struct blob_attr *msg);\nstatic int ubus_sendat_method(struct ubus_context *ctx, struct ubus_object *obj,\n                             struct ubus_request_data *req, const char *method,\n                             struct blob_attr *msg);\nstatic int ubus_list_method(struct ubus_context *ctx, struct ubus_object *obj,\n                           struct ubus_request_data *req, const char *method,\n                           struct blob_attr *msg);\nstatic int ubus_close_method(struct ubus_context *ctx, struct ubus_object *obj,\n                            struct ubus_request_data *req, const char *method,\n                            struct blob_attr *msg);\nstatic int ubus_event_callback_method(struct ubus_context *ctx, struct ubus_object *obj,\n                                     struct ubus_request_data *req, const char *method,\n                                     struct blob_attr *msg);\nstatic int ubus_event_callback_list_method(struct ubus_context *ctx, struct ubus_object *obj,\n                                          struct ubus_request_data *req, const char *method,\n                                          struct blob_attr *msg);\nstatic int ubus_event_callback_remove_method(struct ubus_context *ctx, struct ubus_object *obj,\n                                            struct ubus_request_data *req, const char *method,\n                                            struct blob_attr *msg);\nstatic int ubus_event_callback_clear_method(struct ubus_context *ctx, struct ubus_object *obj,\n                                           struct ubus_request_data *req, const char *method,\n                                           struct blob_attr *msg);\nstatic int ubus_load_conf_method(struct ubus_context *ctx, struct ubus_object *obj,\n                                struct ubus_request_data *req, const char *method,\n                                struct blob_attr *msg);\n\nextern at_daemon_ctx_t g_daemon_ctx;\n\n#endif // UBUS_AT_DAEMON_H\n"
  },
  {
    "path": "luci-app-qmodem/driver/fibocom_QMI_WWAN/Makefile",
    "content": "#\n# Copyright (C) 2015 OpenWrt.org\n#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=qmi_wwan_f\nPKG_VERSION:=1.0\nPKG_RELEASE:=5\n\ninclude $(INCLUDE_DIR)/kernel.mk\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine KernelPackage/qmi_wwan_f\n  SUBMENU:=WWAN Support\n  TITLE:=Fibocom Linux USB QMI WWAN Driver\n  DEPENDS:=+kmod-usb-net +kmod-usb-wdm\n  KCONFIG:= \\\n\tCONFIG_USB_SUPPORT=y \\\n\tCONFIG_USB_USBNET \\\n\tCONFIG_USB_NET_DRIVERS \\\n\tCONFIG_USB_WDM\n  FILES:=$(PKG_BUILD_DIR)/qmi_wwan_f.ko\n  AUTOLOAD:=$(call AutoLoad,82,qmi_wwan_f)\nendef\n\ndefine KernelPackage/qmi_wwan_f/description\n  Fibocom Linux USB QMI WWAN Driver\nendef\n\nEXTRA_CFLAGS+= \\\n\t-Wno-unused-function \\\n\t-Wno-missing-prototypes \\\n\t-Wno-missing-declarations\n\nMAKE_OPTS:= \\\n\tARCH=\"$(LINUX_KARCH)\" \\\n\tCROSS_COMPILE=\"$(TARGET_CROSS)\" \\\n\tCXXFLAGS=\"$(TARGET_CXXFLAGS)\" \\\n\tM=\"$(PKG_BUILD_DIR)\" \\\n\tEXTRA_CFLAGS=\"$(EXTRA_CFLAGS)\" \\\n\t$(EXTRA_KCONFIG)\n\ndefine Build/Prepare\n\tmkdir -p $(PKG_BUILD_DIR)\n\t$(CP) ./src/* $(PKG_BUILD_DIR)/\nendef\n\ndefine Build/Compile\n\t$(MAKE) -C \"$(LINUX_DIR)\" \\\n\t\t$(MAKE_OPTS) \\\n\t\tmodules\nendef\n\n$(eval $(call KernelPackage,qmi_wwan_f))\n"
  },
  {
    "path": "luci-app-qmodem/driver/fibocom_QMI_WWAN/src/Makefile",
    "content": "obj-m += qmi_wwan_f.o\n\nPWD := $(shell pwd)\nOUTPUTDIR=/lib/modules/`uname -r`/kernel/drivers/net/usb/\n\nifeq ($(ARCH),)\nARCH := $(shell uname -m)\nendif\nifeq ($(CROSS_COMPILE),)\nCROSS_COMPILE :=\nendif\nifeq ($(KDIR),)\nKDIR := /lib/modules/$(shell uname -r)/build\nifeq ($(ARCH),i686)\nifeq ($(wildcard $KDIR/arch/$ARCH),)\nARCH=i386\nendif\nendif\nendif\n\nifneq ($(findstring &,${PWD}),)\n$(warning \"${PWD}\")\n$(warning \"current directory contain special char '&' !\")\n$(error \"please remove it!\")\nendif\n\ndefault:\n\t$(MAKE) ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} -C $(KDIR) M=$(PWD) modules\n\ninstall: default\n\tcp $(PWD)/qmi_wwan_f.ko /lib/modules/$(shell uname -r)/kernel/drivers/net/usb/\n\tdepmod\n\tmodprobe -r qmi_wwan_f\n\tmodprobe -r qmi_wwan\n\tmodprobe qmi_wwan_f\nclean:\n\trm -rf *~ .tmp_versions modules.order Module.symvers\n\tfind . -type f -name \"*~\" -o -name \"*.o\" -o -name \"*.ko\" -o -name \"*.cmd\" -o -name \"*.mod.c\" |  xargs rm -rf\n"
  },
  {
    "path": "luci-app-qmodem/driver/fibocom_QMI_WWAN/src/qmi_wwan_f.c",
    "content": "/*\n * Copyright (c) 2012  Bjørn Mork <bjorn@mork.no>\n *\n * The probing code is heavily inspired by cdc_ether, which is:\n * Copyright (C) 2003-2005 by David Brownell\n * Copyright (C) 2006 by Ole Andre Vadla Ravnas (ActiveSync)\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 2 as published by the Free Software Foundation.\n */\n\n#include <linux/module.h>\n#include <linux/version.h>\n#include <linux/interrupt.h>\n#include <linux/netdevice.h>\n#include <linux/ethtool.h>\n#include <linux/etherdevice.h>\n#include <linux/time.h>\n#if LINUX_VERSION_CODE > KERNEL_VERSION(3,16,0) //8b094cd03b4a3793220d8d8d86a173bfea8c285b\n#include <linux/timekeeping.h>\n#else\n#define timespec64  timespec\n#define ktime_get_ts64 ktime_get_ts\n#define timespec64_sub timespec_sub\n#endif\n#include <net/arp.h>\n#include <net/ip.h>\n#include <net/ipv6.h>\n#include <linux/mii.h>\n#include <linux/usb.h>\n#include <linux/usb/cdc.h>\n#include <linux/usb/usbnet.h>\n#include <linux/usb/cdc-wdm.h>\n\n#ifndef ETH_P_MAP\n#define ETH_P_MAP 0xDA1A\n#endif\n\n#if (ETH_P_MAP == 0x00F9)\n#undef ETH_P_MAP\n#define ETH_P_MAP 0xDA1A\n#endif\n\n#ifndef ARPHRD_RAWIP\n#define ARPHRD_RAWIP ARPHRD_NONE\n#endif\n\n#ifdef CONFIG_PINCTRL_IPQ807x\n#define CONFIG_QCA_NSS_DRV\n#endif\n\n#if 1//def CONFIG_QCA_NSS_DRV\n#define _RMNET_NSS_H_\n#define _RMENT_NSS_H_\nstruct rmnet_nss_cb {\n        int (*nss_create)(struct net_device *dev);\n        int (*nss_free)(struct net_device *dev);\n        int (*nss_tx)(struct sk_buff *skb);\n};\nstatic struct rmnet_nss_cb *rmnet_nss_callbacks __rcu __read_mostly;\n#ifdef CONFIG_QCA_NSS_DRV\nstatic uint __read_mostly qca_nss_enabled = 1;\nmodule_param( qca_nss_enabled, uint, S_IRUGO);\n#endif\n#endif\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 4,0,0 )) //1e9e39f4a29857a396ac7b669d109f697f66695e\n#define usbnet_set_skb_tx_stats(skb, packets, bytes_delta) do { dev->net->stats.tx_packets += packets; } while(0)\n#endif\n\n/* This driver supports wwan (3G/LTE/?) devices using a vendor\n * specific management protocol called Qualcomm MSM Interface (QMI) -\n * in addition to the more common AT commands over serial interface\n * management\n *\n * QMI is wrapped in CDC, using CDC encapsulated commands on the\n * control (\"master\") interface of a two-interface CDC Union\n * resembling standard CDC ECM.  The devices do not use the control\n * interface for any other CDC messages. Most likely because the\n * management protocol is used in place of the standard CDC\n * notifications NOTIFY_NETWORK_CONNECTION and NOTIFY_SPEED_CHANGE\n *\n * Alternatively, control and data functions can be combined in a\n * single USB interface.\n *\n * Handling a protocol like QMI is out of the scope for any driver.\n * It is exported as a character device using the cdc-wdm driver as\n * a subdriver, enabling userspace applications (\"modem managers\") to\n * handle it.\n *\n * These devices may alternatively/additionally be configured using AT\n * commands on a serial interface\n */\n#define VERSION_NUMBER \"V1.0.5\"\n#define FIBOCOM_WWAN_VERSION \"Fibocom_QMI_WWAN_Driver_\"VERSION_NUMBER\nstatic const char driver_name[] = \"qmi_wwan_f\";\n\n/* driver specific data */\nstruct qmi_wwan_state {\n    struct usb_driver *subdriver;\n    atomic_t pmcount;\n    unsigned long unused;\n    struct usb_interface *control;\n    struct usb_interface *data;\n};\n\n/* default ethernet address used by the modem */\nstatic const u8 default_modem_addr[ETH_ALEN] = {0x02, 0x50, 0xf3};\n\n#if 1\n#define FIBOCOM_WWAN_QMAP 4 //MAX is 7\n\n#if defined(FIBOCOM_WWAN_QMAP)\n#define FIBOCOM_QMAP_MUX_ID 0x81\n\nstatic uint __read_mostly qmap_mode = 0;\nmodule_param( qmap_mode, uint, S_IRUGO);\nmodule_param_named( rx_qmap, qmap_mode, uint, S_IRUGO );\n#endif\n\n#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)\n#define FIBOCOM_BRIDGE_MODE\n#endif\n\n#ifdef FIBOCOM_BRIDGE_MODE\nstatic uint __read_mostly bridge_mode = 0/*|BIT(1)*/;\nmodule_param( bridge_mode, uint, S_IRUGO );\n#endif\n\n#if defined(FIBOCOM_WWAN_QMAP)\n#define FIBOCOM_UL_DATA_AGG 1\n\n#if defined(FIBOCOM_UL_DATA_AGG)\nstruct tx_agg_ctx {\n    /* QMIWDS_ADMIN_SET_DATA_FORMAT_RESP TLV_0x17 and TLV_0x18 */\n    uint ul_data_aggregation_max_datagrams; //UplinkDataAggregationMaxDatagramsTlv\n    uint ul_data_aggregation_max_size; //UplinkDataAggregationMaxSizeTlv\n    uint dl_minimum_padding; //0x1A\n};\n#endif\n\ntypedef struct {\n    unsigned int size;\n    unsigned int rx_urb_size;\n    unsigned int ep_type;\n    unsigned int iface_id;\n    unsigned int qmap_mode;\n    unsigned int qmap_version;\n    unsigned int dl_minimum_padding;\n    char ifname[8][16];\n    unsigned char mux_id[8];\n} RMNET_INFO;\n\ntypedef struct sQmiWwanQmap\n{\n    struct usbnet *mpNetDev;\n    struct driver_info driver_info;\n    atomic_t refcount;\n    struct net_device *mpQmapNetDev[FIBOCOM_WWAN_QMAP];\n    uint link_state;\n    uint qmap_mode;\n    uint qmap_size;\n    uint qmap_version;\n    struct sk_buff_head skb_chain;\n\n#if defined(FIBOCOM_UL_DATA_AGG)\n    struct tx_agg_ctx tx_ctx;\n    struct tasklet_struct    txq;\n#endif\n\n#ifdef FIBOCOM_BRIDGE_MODE\n    uint bridge_mode;\n    uint bridge_ipv4;\n    unsigned char bridge_mac[ETH_ALEN];\n#endif\n    uint use_rmnet_usb;\n    RMNET_INFO rmnet_info;\n} sQmiWwanQmap;\n//2021-03-19 willa.liu@fibocom.com changed begin for support mantis 0073129\n//#if LINUX_VERSION_CODE > KERNEL_VERSION(3,10,0)\n#if LINUX_VERSION_CODE > KERNEL_VERSION(3,15,0)\n//2021-03-19 willa.liu@fibocom.com changed end for support mantis 0073129\n#define MHI_NETDEV_STATUS64\n#endif\nstruct qmap_priv {\n    struct usbnet *dev;\n    struct net_device *real_dev;\n    struct net_device *self_dev;\n    u8 offset_id;\n    u8 mux_id;\n    u8 qmap_version;\n    u8 link_state;\n\n#if defined(MHI_NETDEV_STATUS64)\n    struct pcpu_sw_netstats __percpu *stats64;\n#endif\n\n    spinlock_t agg_lock;\n    struct sk_buff *agg_skb;\n    unsigned agg_count;\n    struct timespec64 agg_time;\n    struct hrtimer agg_hrtimer;\n    struct work_struct agg_wq;\n\n#ifdef FIBOCOM_BRIDGE_MODE\n    uint bridge_mode;\n    uint bridge_ipv4;\n    unsigned char bridge_mac[ETH_ALEN];\n#endif\n};\n\nstruct qmap_hdr {\n    u8 cd_rsvd_pad;\n    u8 mux_id;\n    u16 pkt_len;\n} __packed;\n\nenum rmnet_map_v5_header_type {\n    RMNET_MAP_HEADER_TYPE_UNKNOWN,\n    RMNET_MAP_HEADER_TYPE_COALESCING = 0x1,\n    RMNET_MAP_HEADER_TYPE_CSUM_OFFLOAD = 0x2,\n    RMNET_MAP_HEADER_TYPE_ENUM_LENGTH\n};\n\n/* Main QMAP header */\nstruct rmnet_map_header {\n    u8  pad_len:6;\n    u8  next_hdr:1;\n    u8  cd_bit:1;\n    u8  mux_id;\n    __be16 pkt_len;\n}  __aligned(1);\n\n/* QMAP v5 headers */\nstruct rmnet_map_v5_csum_header {\n    u8  next_hdr:1;\n    u8  header_type:7;\n    u8  hw_reserved:7;\n    u8  csum_valid_required:1;\n    __be16 reserved;\n} __aligned(1);\n\n#ifdef FIBOCOM_BRIDGE_MODE\nstatic int is_qmap_netdev(const struct net_device *netdev);\n#endif\n#endif\n\n#ifdef FIBOCOM_BRIDGE_MODE\nstatic int bridge_arp_reply(struct net_device *net, struct sk_buff *skb, uint bridge_ipv4) {\n    struct arphdr *parp;\n    u8 *arpptr, *sha;\n    u8  sip[4], tip[4], ipv4[4];\n    struct sk_buff *reply = NULL;\n\n    ipv4[0]  = (bridge_ipv4 >> 24) & 0xFF;\n    ipv4[1]  = (bridge_ipv4 >> 16) & 0xFF;\n    ipv4[2]  = (bridge_ipv4 >> 8) & 0xFF;\n    ipv4[3]  = (bridge_ipv4 >> 0) & 0xFF;\n\n    parp = arp_hdr(skb);\n\n    if (parp->ar_hrd == htons(ARPHRD_ETHER)  && parp->ar_pro == htons(ETH_P_IP)\n        && parp->ar_op == htons(ARPOP_REQUEST) && parp->ar_hln == 6 && parp->ar_pln == 4) {\n        arpptr = (u8 *)parp + sizeof(struct arphdr);\n        sha = arpptr;\n        arpptr += net->addr_len;    /* sha */\n        memcpy(sip, arpptr, sizeof(sip));\n        arpptr += sizeof(sip);\n        arpptr += net->addr_len;    /* tha */\n        memcpy(tip, arpptr, sizeof(tip));\n\n        pr_info(\"%s sip = %d.%d.%d.%d, tip=%d.%d.%d.%d, ipv4=%d.%d.%d.%d\\n\", netdev_name(net),\n            sip[0], sip[1], sip[2], sip[3], tip[0], tip[1], tip[2], tip[3], ipv4[0], ipv4[1], ipv4[2], ipv4[3]);\n    //wwan0 sip = 10.151.137.255, tip=10.151.138.0, ipv4=10.151.137.255\n        if (tip[0] == ipv4[0] && tip[1] == ipv4[1] && (tip[2]&0xFC) == (ipv4[2]&0xFC) && tip[3] != ipv4[3])\n            reply = arp_create(ARPOP_REPLY, ETH_P_ARP, *((__be32 *)sip), net, *((__be32 *)tip), sha, default_modem_addr, sha);\n\n        if (reply) {\n            skb_reset_mac_header(reply);\n            __skb_pull(reply, skb_network_offset(reply));\n            reply->ip_summed = CHECKSUM_UNNECESSARY;\n            reply->pkt_type = PACKET_HOST;\n#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0)\n            netif_rx_ni(reply);\n#else\n            netif_rx(reply);\n#endif\n        }\n        return 1;\n    }\n\n    return 0;\n}\n\nstatic struct sk_buff *bridge_mode_tx_fixup(struct net_device *net, struct sk_buff *skb, uint bridge_ipv4, unsigned char *bridge_mac) {\n    struct ethhdr *ehdr;\n    const struct iphdr *iph;\n\n    skb_reset_mac_header(skb);\n    ehdr = eth_hdr(skb);\n\n    if (ehdr->h_proto == htons(ETH_P_ARP)) {\n        if (bridge_ipv4)\n            bridge_arp_reply(net, skb, bridge_ipv4);\n        return NULL;\n    }\n\n    iph = ip_hdr(skb);\n    //DBG(\"iphdr: \");\n    //PrintHex((void *)iph, sizeof(struct iphdr));\n\n// 1    0.000000000    0.0.0.0    255.255.255.255    DHCP    362    DHCP Request  - Transaction ID 0xe7643ad7\n    if (ehdr->h_proto == htons(ETH_P_IP) && iph->protocol == IPPROTO_UDP && iph->saddr == 0x00000000 && iph->daddr == 0xFFFFFFFF) {\n        //if (udp_hdr(skb)->dest == htons(67)) //DHCP Request\n        {\n            memcpy(bridge_mac, ehdr->h_source, ETH_ALEN);\n            pr_info(\"%s PC Mac Address: %02x:%02x:%02x:%02x:%02x:%02x\\n\", netdev_name(net),\n                bridge_mac[0], bridge_mac[1], bridge_mac[2], bridge_mac[3], bridge_mac[4], bridge_mac[5]);\n        }\n    }\n\n    if (memcmp(ehdr->h_source, bridge_mac, ETH_ALEN)) {\n        return NULL;\n    }\n\n    return skb;\n}\n\nstatic void bridge_mode_rx_fixup(sQmiWwanQmap *pQmapDev, struct net_device *net, struct sk_buff *skb) {\n    uint bridge_mode = 0;\n    unsigned char *bridge_mac;\n\n    if (pQmapDev->qmap_mode > 1 || pQmapDev->use_rmnet_usb == 1) {\n        struct qmap_priv *priv = netdev_priv(net);\n        bridge_mode = priv->bridge_mode;\n        bridge_mac = priv->bridge_mac;\n    }\n    else {\n        bridge_mode = pQmapDev->bridge_mode;\n        bridge_mac = pQmapDev->bridge_mac;\n    }\n\n    if (bridge_mode)\n        memcpy(eth_hdr(skb)->h_dest, bridge_mac, ETH_ALEN);\n    else\n        memcpy(eth_hdr(skb)->h_dest, net->dev_addr, ETH_ALEN);\n}\n#endif\n\n#if defined(FIBOCOM_WWAN_QMAP)\nstatic ssize_t qmap_mode_show(struct device *dev, struct device_attribute *attr, char *buf) {\n    struct net_device *netdev = to_net_dev(dev);\n    struct usbnet * usbnetdev = netdev_priv( netdev );\n    struct qmi_wwan_state *info = (void *)&usbnetdev->data;\n    sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\n    return snprintf(buf, PAGE_SIZE, \"%d\\n\",  pQmapDev->qmap_mode);\n}\n\nstatic DEVICE_ATTR(qmap_mode, S_IRUGO, qmap_mode_show, NULL);\n\nstatic ssize_t qmap_size_show(struct device *dev, struct device_attribute *attr, char *buf) {\n    struct net_device *netdev = to_net_dev(dev);\n    struct usbnet * usbnetdev = netdev_priv( netdev );\n    struct qmi_wwan_state *info = (void *)&usbnetdev->data;\n    sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\n    return snprintf(buf, PAGE_SIZE, \"%u\\n\",  pQmapDev->qmap_size);\n}\n\nstatic DEVICE_ATTR(qmap_size, S_IRUGO, qmap_size_show, NULL);\n\nstatic ssize_t link_state_show(struct device *dev, struct device_attribute *attr, char *buf) {\n    struct net_device *netdev = to_net_dev(dev);\n    struct usbnet * usbnetdev = netdev_priv( netdev );\n    struct qmi_wwan_state *info = (void *)&usbnetdev->data;\n    sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\n    return snprintf(buf, PAGE_SIZE, \"0x%x\\n\",  pQmapDev->link_state);\n}\n\nstatic ssize_t link_state_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {\n    struct net_device *netdev = to_net_dev(dev);\n    struct usbnet * usbnetdev = netdev_priv( netdev );\n    struct qmi_wwan_state *info = (void *)&usbnetdev->data;\n    sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n    unsigned link_state = 0;\n    unsigned old_link = pQmapDev->link_state;\n    uint offset_id = 0;\n\n    link_state = simple_strtoul(buf, NULL, 0);\n\n    if (pQmapDev->qmap_mode == 1) {\n        pQmapDev->link_state = !!link_state;\n    }\n    else if (pQmapDev->qmap_mode > 1) {\n        offset_id = ((link_state&0x7F) - 1);\n\n        if (offset_id >= pQmapDev->qmap_mode) {\n            dev_info(dev, \"%s offset_id is %d. but qmap_mode is %d\\n\", __func__, offset_id, pQmapDev->qmap_mode);\n            return count;\n        }\n\n        if (link_state&0x80)\n            pQmapDev->link_state &= ~(1 << offset_id);\n        else\n            pQmapDev->link_state |= (1 << offset_id);\n    }\n\n    if (old_link != pQmapDev->link_state) {\n        struct net_device *qmap_net = pQmapDev->mpQmapNetDev[offset_id];\n\n        if (pQmapDev->link_state) {\n            netif_carrier_on(usbnetdev->net);\n        } else {\n            netif_carrier_off(usbnetdev->net);\n        }\n\n        if (qmap_net && qmap_net != netdev) {\n            struct qmap_priv *priv = netdev_priv(qmap_net);\n\n            priv->link_state = !!(pQmapDev->link_state & (1 << offset_id));\n            if (priv->link_state) {\n                netif_carrier_on(qmap_net);\n                if (netif_queue_stopped(qmap_net) && !netif_queue_stopped(usbnetdev->net))\n                    netif_wake_queue(qmap_net);\n            }\n            else {\n                netif_carrier_off(qmap_net);\n            }\n        }\n\n        dev_info(dev, \"link_state 0x%x -> 0x%x\\n\", old_link, pQmapDev->link_state);\n    }\n\n    return count;\n}\n\n#ifdef FIBOCOM_BRIDGE_MODE\nstatic ssize_t bridge_mode_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {\n    struct net_device *netdev = to_net_dev(dev);\n    uint old_mode = 0;\n    uint bridge_mode = simple_strtoul(buf, NULL, 0);\n\n    if (netdev->type != ARPHRD_ETHER) {\n        return count;\n    }\n\n    if (is_qmap_netdev(netdev)) {\n        struct qmap_priv *priv = netdev_priv(netdev);\n        old_mode = priv->bridge_mode;\n        priv->bridge_mode = bridge_mode;\n    }\n    else {\n        struct usbnet * usbnetdev = netdev_priv( netdev );\n        struct qmi_wwan_state *info = (void *)&usbnetdev->data;\n        sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n        old_mode = pQmapDev->bridge_mode;\n        pQmapDev->bridge_mode = bridge_mode;\n    }\n\n    if (old_mode != bridge_mode) {\n        dev_info(dev, \"bridge_mode change to 0x%x\\n\", bridge_mode);\n    }\n\n    return count;\n}\n\nstatic ssize_t bridge_mode_show(struct device *dev, struct device_attribute *attr, char *buf) {\n    struct net_device *netdev = to_net_dev(dev);\n    uint bridge_mode = 0;\n\n    if (is_qmap_netdev(netdev)) {\n        struct qmap_priv *priv = netdev_priv(netdev);\n        bridge_mode = priv->bridge_mode;\n    }\n    else {\n        struct usbnet * usbnetdev = netdev_priv( netdev );\n        struct qmi_wwan_state *info = (void *)&usbnetdev->data;\n        sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n        bridge_mode = pQmapDev->bridge_mode;\n    }\n\n    return snprintf(buf, PAGE_SIZE, \"%u\\n\", bridge_mode);\n}\n\nstatic ssize_t bridge_ipv4_show(struct device *dev, struct device_attribute *attr, char *buf) {\n    struct net_device *netdev = to_net_dev(dev);\n    unsigned int bridge_ipv4 = 0;\n    unsigned char ipv4[4];\n\n    if (is_qmap_netdev(netdev)) {\n        struct qmap_priv *priv = netdev_priv(netdev);\n        bridge_ipv4 = priv->bridge_ipv4;\n    }\n    else {\n        struct usbnet * usbnetdev = netdev_priv( netdev );\n        struct qmi_wwan_state *info = (void *)&usbnetdev->data;\n        sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n        bridge_ipv4 = pQmapDev->bridge_ipv4;\n    }\n\n    ipv4[0]  = (bridge_ipv4 >> 24) & 0xFF;\n    ipv4[1]  = (bridge_ipv4 >> 16) & 0xFF;\n    ipv4[2]  = (bridge_ipv4 >> 8) & 0xFF;\n    ipv4[3]  = (bridge_ipv4 >> 0) & 0xFF;\n\n    return snprintf(buf, PAGE_SIZE, \"%d.%d.%d.%d\\n\",  ipv4[0], ipv4[1], ipv4[2], ipv4[3]);\n}\n\nstatic ssize_t bridge_ipv4_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {\n    struct net_device *netdev = to_net_dev(dev);\n\n    if (is_qmap_netdev(netdev)) {\n        struct qmap_priv *priv = netdev_priv(netdev);\n        priv->bridge_ipv4 = simple_strtoul(buf, NULL, 16);\n    }\n    else {\n        struct usbnet * usbnetdev = netdev_priv( netdev );\n        struct qmi_wwan_state *info = (void *)&usbnetdev->data;\n        sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n        pQmapDev->bridge_ipv4 = simple_strtoul(buf, NULL, 16);\n    }\n\n    return count;\n}\n#endif\n\nstatic DEVICE_ATTR(link_state, S_IWUSR | S_IRUGO, link_state_show, link_state_store);\n#ifdef FIBOCOM_BRIDGE_MODE\nstatic DEVICE_ATTR(bridge_mode, S_IWUSR | S_IRUGO, bridge_mode_show, bridge_mode_store);\nstatic DEVICE_ATTR(bridge_ipv4, S_IWUSR | S_IRUGO, bridge_ipv4_show, bridge_ipv4_store);\n#endif\n\nstatic struct attribute *qmi_wwan_sysfs_attrs[] = {\n    &dev_attr_link_state.attr,\n    &dev_attr_qmap_mode.attr,\n    &dev_attr_qmap_size.attr,\n#ifdef FIBOCOM_BRIDGE_MODE\n    &dev_attr_bridge_mode.attr,\n    &dev_attr_bridge_ipv4.attr,\n#endif\n    NULL,\n};\n\nstatic struct attribute_group qmi_wwan_sysfs_attr_group = {\n    .attrs = qmi_wwan_sysfs_attrs,\n};\n\n#ifdef FIBOCOM_BRIDGE_MODE\nstatic struct attribute *qmi_qmap_sysfs_attrs[] = {\n    &dev_attr_bridge_mode.attr,\n    &dev_attr_bridge_ipv4.attr,\n    NULL,\n};\n\nstatic struct attribute_group qmi_qmap_sysfs_attr_group = {\n    .attrs = qmi_qmap_sysfs_attrs,\n};\n#endif\n\nstatic int qmap_open(struct net_device *dev)\n{\n    struct qmap_priv *priv = netdev_priv(dev);\n    struct net_device *real_dev = priv->real_dev;\n\n    if (!(priv->real_dev->flags & IFF_UP))\n        return -ENETDOWN;\n\n    if (netif_carrier_ok(real_dev) && priv->link_state)\n        netif_carrier_on(dev);\n\n    if (netif_carrier_ok(dev)) {\n        if (netif_queue_stopped(dev) && !netif_queue_stopped(real_dev))\n            netif_wake_queue(dev);\n    }\n\n    return 0;\n}\n\nstatic int qmap_stop(struct net_device *pNet)\n{\n    netif_carrier_off(pNet);\n    return 0;\n}\n\nstatic struct sk_buff * add_qhdr(struct sk_buff *skb, u8 mux_id) {\n    struct qmap_hdr *qhdr;\n    int pad = 0;\n\n    pad = skb->len%4;\n    if (pad) {\n        pad = 4 - pad;\n        if (skb_tailroom(skb) < pad) {\n            printk(\"skb_tailroom small!\\n\");\n            pad = 0;\n        }\n        if (pad)\n            __skb_put(skb, pad);\n    }\n\n    qhdr = (struct qmap_hdr *)skb_push(skb, sizeof(struct qmap_hdr));\n    qhdr->cd_rsvd_pad = pad;\n    qhdr->mux_id = mux_id;\n    qhdr->pkt_len = cpu_to_be16(skb->len - sizeof(struct qmap_hdr));\n\n    return skb;\n}\n\nstatic struct sk_buff * add_qhdr_v5(struct sk_buff *skb, u8 mux_id) {\n    struct rmnet_map_header *map_header;\n    struct rmnet_map_v5_csum_header *ul_header;\n    u32 padding, map_datalen;\n\n    map_datalen = skb->len;\n    padding = map_datalen%4;\n    if (padding) {\n        padding = 4 - padding;\n        if (skb_tailroom(skb) < padding) {\n            printk(\"skb_tailroom small!\\n\");\n            padding = 0;\n        }\n        if (padding)\n            __skb_put(skb, padding);\n    }\n\n    map_header = (struct rmnet_map_header *)skb_push(skb, (sizeof(struct rmnet_map_header) + sizeof(struct rmnet_map_v5_csum_header)));\n    map_header->cd_bit = 0;\n    map_header->next_hdr = 1;\n    map_header->pad_len = padding;\n    map_header->mux_id = mux_id;\n    map_header->pkt_len = htons(map_datalen + padding);\n\n    ul_header = (struct rmnet_map_v5_csum_header *)(map_header + 1);\n    memset(ul_header, 0, sizeof(*ul_header));\n    ul_header->header_type = RMNET_MAP_HEADER_TYPE_CSUM_OFFLOAD;\n    if (skb->ip_summed == CHECKSUM_PARTIAL) {\n#if 0 //TODO\n        skb->ip_summed = CHECKSUM_NONE;\n        /* Ask for checksum offloading */\n        ul_header->csum_valid_required = 1;\n#endif\n    }\n\n    return skb;\n}\n\nstatic void rmnet_vnd_update_rx_stats(struct net_device *net,\n            unsigned rx_packets, unsigned rx_bytes) {\n#if defined(MHI_NETDEV_STATUS64)\n    struct qmap_priv *dev = netdev_priv(net);\n    struct pcpu_sw_netstats *stats64 = this_cpu_ptr(dev->stats64);\n\n    u64_stats_update_begin(&stats64->syncp);\n#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0)\n    stats64->rx_packets += rx_packets;\n    stats64->rx_bytes += rx_bytes;\n#else\n\tu64_stats_add(&stats64->rx_packets, rx_packets);\n\tu64_stats_add(&stats64->rx_bytes, rx_bytes);\n#endif\n    u64_stats_update_end(&stats64->syncp);\n#else\n    net->stats.rx_packets += rx_packets;\n    net->stats.rx_bytes += rx_bytes;\n#endif\n}\n\nstatic void rmnet_vnd_update_tx_stats(struct net_device *net,\n            unsigned tx_packets, unsigned tx_bytes) {\n#if defined(MHI_NETDEV_STATUS64)\n    struct qmap_priv *dev = netdev_priv(net);\n    struct pcpu_sw_netstats *stats64 = this_cpu_ptr(dev->stats64);\n\n    u64_stats_update_begin(&stats64->syncp);\n#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0)\n    stats64->tx_packets += tx_packets;\n    stats64->tx_bytes += tx_bytes;\n#else\n    u64_stats_add(&stats64->tx_packets, tx_packets);\n    u64_stats_add(&stats64->tx_bytes, tx_bytes);\n#endif\n    u64_stats_update_end(&stats64->syncp);\n#else\n    net->stats.tx_packets += tx_packets;\n    net->stats.tx_bytes += tx_bytes;\n#endif\n}\n\n#if defined(MHI_NETDEV_STATUS64)\nstatic struct rtnl_link_stats64 *_rmnet_vnd_get_stats64(struct net_device *net, struct rtnl_link_stats64 *stats)\n{\n    struct qmap_priv *dev = netdev_priv(net);\n    unsigned int start;\n    int cpu;\n    struct rmnet_nss_cb *nss_cb;\n\n    netdev_stats_to_stats64(stats, &net->stats);\n\n    nss_cb = rcu_dereference(rmnet_nss_callbacks);\n    if (nss_cb) { // rmnet_nss.c:rmnet_nss_tx() will update rx stats\n        stats->rx_packets = 0;\n        stats->rx_bytes = 0;\n    }\n\n    for_each_possible_cpu(cpu) {\n        struct pcpu_sw_netstats *stats64;\n        u64 rx_packets, rx_bytes;\n        u64 tx_packets, tx_bytes;\n\n        stats64 = per_cpu_ptr(dev->stats64, cpu);\n\n        do {\n#if LINUX_VERSION_CODE < KERNEL_VERSION(6,6,0)\n            start = u64_stats_fetch_begin_irq(&stats64->syncp);\n#else\n            start = u64_stats_fetch_begin(&stats64->syncp);\n#endif\n#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0)\n            rx_packets = stats64->rx_packets;\n            rx_bytes = stats64->rx_bytes;\n            tx_packets = stats64->tx_packets;\n            tx_bytes = stats64->tx_bytes;\n#else\n            rx_packets = u64_stats_read(&stats64->rx_packets);\n            rx_bytes = u64_stats_read(&stats64->rx_bytes);\n            tx_packets = u64_stats_read(&stats64->tx_packets);\n            tx_bytes = u64_stats_read(&stats64->tx_bytes);\n#endif\n#if LINUX_VERSION_CODE < KERNEL_VERSION(6,6,0)\n        } while (u64_stats_fetch_retry_irq(&stats64->syncp, start));\n#else\n        } while (u64_stats_fetch_retry(&stats64->syncp, start));\n#endif\n\n        stats->rx_packets += rx_packets;\n        stats->rx_bytes += rx_bytes;\n        stats->tx_packets += tx_packets;\n        stats->tx_bytes += tx_bytes;\n    }\n\n    return stats;\n}\n\n#if (LINUX_VERSION_CODE > KERNEL_VERSION( 4,10,0 )) //bc1f44709cf27fb2a5766cadafe7e2ad5e9cb221\nstatic void rmnet_vnd_get_stats64(struct net_device *net, struct rtnl_link_stats64 *stats) {\n    _rmnet_vnd_get_stats64(net, stats);\n}\n#else\nstatic struct rtnl_link_stats64 *rmnet_vnd_get_stats64(struct net_device *net, struct rtnl_link_stats64 *stats) {\n    return _rmnet_vnd_get_stats64(net, stats);\n}\n#endif\n#endif\n\n#if defined(FIBOCOM_UL_DATA_AGG)\nstatic void rmnet_usb_tx_wake_queue(unsigned long data) {\n    sQmiWwanQmap *pQmapDev = (void *)data;\n    int i;\n\n    for (i = 0; i < pQmapDev->qmap_mode; i++) {\n        struct net_device *qmap_net = pQmapDev->mpQmapNetDev[i];\n        if (qmap_net) {\n            if (netif_queue_stopped(qmap_net) && !netif_queue_stopped(pQmapDev->mpNetDev->net)) {\n                netif_wake_queue(qmap_net);\n            }\n        }\n    }\n}\n\nstatic void rmnet_usb_tx_skb_destructor(struct sk_buff *skb) {\n    struct net_device    *net = skb->dev;\n    struct usbnet * dev = netdev_priv( net );\n    struct qmi_wwan_state *info = (void *)&dev->data;\n    sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\n    if (pQmapDev && pQmapDev->use_rmnet_usb) {\n        int i;\n\n        for (i = 0; i < pQmapDev->qmap_mode; i++) {\n            struct net_device *qmap_net = pQmapDev->mpQmapNetDev[i];\n\n            if (qmap_net) {\n                if (netif_queue_stopped(qmap_net)) {\n                    tasklet_schedule(&pQmapDev->txq);\n                    break;\n                }\n            }\n        }\n    }\n}\n\nstatic int rmnet_usb_tx_agg_skip(struct sk_buff *skb, int offset)\n{\n    u8 *packet_start = skb->data + offset;\n    int ready2send = 0;\n\n    if (skb->protocol == htons(ETH_P_IP)) {\n        struct iphdr *ip4h = (struct iphdr *)(packet_start);\n\n        if (ip4h->protocol == IPPROTO_TCP) {\n            const struct tcphdr *th = (const struct tcphdr *)(packet_start + sizeof(struct iphdr));\n            if (th->psh) {\n                ready2send = 1;\n            }\n        }\n        else if (ip4h->protocol == IPPROTO_ICMP)\n            ready2send = 1;\n\n    } else if (skb->protocol == htons(ETH_P_IPV6)) {\n        struct ipv6hdr *ip6h = (struct ipv6hdr *)(packet_start);\n\n        if (ip6h->nexthdr == NEXTHDR_TCP) {\n            const struct tcphdr *th = (const struct tcphdr *)(packet_start + sizeof(struct ipv6hdr));\n            if (th->psh) {\n                ready2send = 1;\n            }\n        } else if (ip6h->nexthdr == NEXTHDR_ICMP) {\n            ready2send = 1;\n        } else if (ip6h->nexthdr == NEXTHDR_FRAGMENT) {\n            struct frag_hdr *frag;\n\n            frag = (struct frag_hdr *)(packet_start\n                           + sizeof(struct ipv6hdr));\n            if (frag->nexthdr == IPPROTO_ICMPV6)\n                ready2send = 1;\n        }\n    }\n\n    return ready2send;\n}\n\nstatic void rmnet_usb_tx_agg_work(struct work_struct *work)\n{\n    struct qmap_priv *priv =\n            container_of(work, struct qmap_priv, agg_wq);\n    struct sk_buff *skb = NULL;\n    unsigned long flags;\n\n    spin_lock_irqsave(&priv->agg_lock, flags);\n    if (likely(priv->agg_skb)) {\n        skb = priv->agg_skb;\n        priv->agg_skb = NULL;\n        priv->agg_count = 0;\n        skb->protocol = htons(ETH_P_MAP);\n        skb->dev = priv->real_dev;\n        ktime_get_ts64(&priv->agg_time);\n    }\n    spin_unlock_irqrestore(&priv->agg_lock, flags);\n\n    if (skb) {\n        int err = dev_queue_xmit(skb);\n        if (err != NET_XMIT_SUCCESS) {\n            priv->self_dev->stats.tx_errors++;\n        }\n    }\n}\n\nstatic enum hrtimer_restart  rmnet_usb_tx_agg_timer_cb(struct hrtimer *timer)\n{\n    struct qmap_priv *priv =\n            container_of(timer, struct qmap_priv, agg_hrtimer);\n\n    schedule_work(&priv->agg_wq);\n    return HRTIMER_NORESTART;\n}\n\nstatic long agg_time_limit __read_mostly = 1000000L; //reduce this time, can get better TPUT performance, but will increase USB interrupts\nmodule_param(agg_time_limit, long, S_IRUGO | S_IWUSR);\nMODULE_PARM_DESC(agg_time_limit, \"Maximum time packets sit in the agg buf\");\n\nstatic long agg_bypass_time __read_mostly = 10000000L;\nmodule_param(agg_bypass_time, long, S_IRUGO | S_IWUSR);\nMODULE_PARM_DESC(agg_bypass_time, \"Skip agg when apart spaced more than this\");\n\nstatic int rmnet_usb_tx_agg(struct sk_buff *skb, struct qmap_priv *priv) {\n    struct qmi_wwan_state *info = (void *)&priv->dev->data;\n    sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n    struct tx_agg_ctx *ctx = &pQmapDev->tx_ctx;\n    int ready2send = 0;\n    int xmit_more = 0;\n    struct timespec64 diff, now;\n    struct sk_buff *agg_skb = NULL;\n    unsigned long flags;\n    int err;\n    struct net_device *pNet = priv->self_dev;\n\n#if LINUX_VERSION_CODE < KERNEL_VERSION(5,1,0) //6b16f9ee89b8d5709f24bc3ac89ae8b5452c0d7c\n#if LINUX_VERSION_CODE > KERNEL_VERSION(3,16,0)\n    xmit_more = skb->xmit_more;\n#endif\n#else\n    xmit_more = netdev_xmit_more();\n#endif\n\n    rmnet_vnd_update_tx_stats(pNet, 1, skb->len);\n\n    if (ctx->ul_data_aggregation_max_datagrams == 1) {\n        skb->protocol = htons(ETH_P_MAP);\n        skb->dev = priv->real_dev;\n        if (!skb->destructor)\n            skb->destructor = rmnet_usb_tx_skb_destructor;\n        err = dev_queue_xmit(skb);\n        if (err != NET_XMIT_SUCCESS)\n            pNet->stats.tx_errors++;\n        return NET_XMIT_SUCCESS;\n    }\n\nnew_packet:\n    spin_lock_irqsave(&priv->agg_lock, flags);\n    agg_skb = NULL;\n    ready2send = 0;\n    ktime_get_ts64(&now);\n    diff = timespec64_sub(now, priv->agg_time);\n\n    if (priv->agg_skb) {\n        if ((priv->agg_skb->len + skb->len) < ctx->ul_data_aggregation_max_size) {\n            memcpy(skb_put(priv->agg_skb, skb->len), skb->data, skb->len);\n            priv->agg_count++;\n\n            if (diff.tv_sec > 0 || diff.tv_nsec > agg_time_limit) {\n                ready2send = 1;\n            }\n            else if (priv->agg_count == ctx->ul_data_aggregation_max_datagrams) {\n                ready2send = 1;\n            }\n            else if (xmit_more == 0) {\n                struct rmnet_map_header *map_header = (struct rmnet_map_header *)skb->data;\n                size_t offset = sizeof(struct rmnet_map_header);\n                if (map_header->next_hdr)\n                    offset += sizeof(struct rmnet_map_v5_csum_header);\n\n                ready2send = rmnet_usb_tx_agg_skip(skb, offset);\n            }\n\n            dev_kfree_skb_any(skb);\n            skb = NULL;\n        }\n        else {\n            ready2send = 1;\n        }\n\n        if (ready2send) {\n            agg_skb = priv->agg_skb;\n            priv->agg_skb = NULL;\n            priv->agg_count = 0;\n        }\n    }\n    else if (skb) {\n        if (diff.tv_sec > 0 || diff.tv_nsec > agg_bypass_time) {\n            ready2send = 1;\n        }\n        else if (xmit_more == 0) {\n            struct rmnet_map_header *map_header = (struct rmnet_map_header *)skb->data;\n            size_t offset = sizeof(struct rmnet_map_header);\n            if (map_header->next_hdr)\n                offset += sizeof(struct rmnet_map_v5_csum_header);\n\n            ready2send = rmnet_usb_tx_agg_skip(skb, offset);\n        }\n\n        if (ready2send == 0) {\n            priv->agg_skb = alloc_skb(ctx->ul_data_aggregation_max_size, GFP_ATOMIC);\n            if (priv->agg_skb) {\n                memcpy(skb_put(priv->agg_skb, skb->len), skb->data, skb->len);\n                priv->agg_count++;\n                dev_kfree_skb_any(skb);\n                skb = NULL;\n            }\n            else {\n                ready2send = 1;\n            }\n        }\n\n        if (ready2send) {\n            agg_skb = skb;\n            skb = NULL;\n        }\n    }\n\n    if (ready2send) {\n        priv->agg_time = now;\n    }\n    spin_unlock_irqrestore(&priv->agg_lock, flags);\n\n    if (agg_skb) {\n        agg_skb->protocol = htons(ETH_P_MAP);\n        agg_skb->dev = priv->real_dev;\n        if (!agg_skb->destructor)\n            agg_skb->destructor = rmnet_usb_tx_skb_destructor;\n        err = dev_queue_xmit(agg_skb);\n        if (err != NET_XMIT_SUCCESS) {\n            pNet->stats.tx_errors++;\n        }\n    }\n\n    if (skb) {\n        goto new_packet;\n    }\n\n    if (priv->agg_skb) {\n        if (!hrtimer_is_queued(&priv->agg_hrtimer))\n            hrtimer_start(&priv->agg_hrtimer, ns_to_ktime(NSEC_PER_MSEC * 2), HRTIMER_MODE_REL);\n    }\n\n    return NET_XMIT_SUCCESS;\n}\n#endif\n\nstatic netdev_tx_t rmnet_vnd_start_xmit(struct sk_buff *skb,\n                    struct net_device *pNet)\n{\n    int err;\n    struct qmap_priv *priv = netdev_priv(pNet);\n\n    if (netif_queue_stopped(priv->real_dev)) {\n        netif_stop_queue(pNet);\n        return NETDEV_TX_BUSY;\n    }\n\n    //printk(\"%s 1 skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n    if (pNet->type == ARPHRD_ETHER) {\n        skb_reset_mac_header(skb);\n\n#ifdef FIBOCOM_BRIDGE_MODE\n        if (priv->bridge_mode && bridge_mode_tx_fixup(pNet, skb, priv->bridge_ipv4, priv->bridge_mac) == NULL) {\n              dev_kfree_skb_any (skb);\n              return NETDEV_TX_OK;\n        }\n#endif\n\n        if (skb_pull(skb, ETH_HLEN) == NULL) {\n            dev_kfree_skb_any (skb);\n            return NETDEV_TX_OK;\n        }\n    }\n    //printk(\"%s 2 skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n\n    if (priv->qmap_version == 5) {\n        add_qhdr(skb, priv->mux_id);\n    }\n    else if (priv->qmap_version == 9) {\n        add_qhdr_v5(skb, priv->mux_id);\n    }\n    else {\n        dev_kfree_skb_any (skb);\n        return NETDEV_TX_OK;\n    }\n    //printk(\"%s skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n\n#if 0\n    skb->protocol = htons(ETH_P_MAP);\n    skb->dev = priv->real_dev;\n    err = dev_queue_xmit(skb);\n\n    if (err == NET_XMIT_SUCCESS) {\n        rmnet_vnd_update_tx_stats(pNet, 1, skb->len);\n    } else {\n        pNet->stats.tx_errors++;\n    }\n#else\n    err = rmnet_usb_tx_agg(skb, priv);\n#endif\n\n    return err;\n}\n\nstatic int rmnet_vnd_change_mtu(struct net_device *rmnet_dev, int new_mtu)\n{\n    if (new_mtu < 0 || new_mtu > 1500)\n        return -EINVAL;\n\n    rmnet_dev->mtu = new_mtu;\n    return 0;\n}\n\n/* drivers may override default ethtool_ops in their bind() routine */\nstatic const struct ethtool_ops rmnet_vnd_ethtool_ops = {\n    .get_link        = ethtool_op_get_link,\n};\n\nstatic int qmap_start_xmit(struct sk_buff *skb, struct net_device *pNet)\n{\n    int err;\n    struct qmap_priv *priv = netdev_priv(pNet);\n\n    //printk(\"%s 1 skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n    if (pNet->type == ARPHRD_ETHER) {\n        skb_reset_mac_header(skb);\n\n#ifdef FIBOCOM_BRIDGE_MODE\n        if (priv->bridge_mode && bridge_mode_tx_fixup(pNet, skb, priv->bridge_ipv4, priv->bridge_mac) == NULL) {\n            dev_kfree_skb_any (skb);\n            return NETDEV_TX_OK;\n        }\n#endif\n\n        if (skb_pull(skb, ETH_HLEN) == NULL) {\n            dev_kfree_skb_any (skb);\n            return NETDEV_TX_OK;\n        }\n    }\n\n\n    add_qhdr(skb, FIBOCOM_QMAP_MUX_ID + priv->offset_id);\n\n    skb->dev = priv->real_dev;\n    err = dev_queue_xmit(skb);\n    if (err == NET_XMIT_SUCCESS) {\n        pNet->stats.tx_packets++;\n        pNet->stats.tx_bytes += skb->len;\n    } else {\n        pNet->stats.tx_errors++;\n    }\n\n    return err;\n}\n\nstatic const struct net_device_ops qmap_netdev_ops = {\n    .ndo_open       = qmap_open,\n    .ndo_stop       = qmap_stop,\n    .ndo_start_xmit = qmap_start_xmit,\n};\n\nstatic const struct net_device_ops rmnet_vnd_ops = {\n    .ndo_open       = qmap_open,\n    .ndo_stop       = qmap_stop,\n    .ndo_start_xmit = rmnet_vnd_start_xmit,\n    .ndo_change_mtu = rmnet_vnd_change_mtu,\n#if defined(MHI_NETDEV_STATUS64)\n    .ndo_get_stats64    = rmnet_vnd_get_stats64,\n#endif\n};\n\nstatic void rmnet_usb_vnd_setup(struct net_device *rmnet_dev)\n{\n    rmnet_dev->needed_headroom = 16;\n\n    /* Raw IP mode */\n    rmnet_dev->header_ops = NULL;  /* No header */\n    rmnet_dev->type = ARPHRD_RAWIP;\n    rmnet_dev->hard_header_len = 0;\n    rmnet_dev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);\n}\n\nstatic rx_handler_result_t rmnet_usb_rx_priv_handler(struct sk_buff **pskb)\n{\n    struct sk_buff *skb = *pskb;\n    struct rmnet_nss_cb *nss_cb;\n\n    if (!skb)\n        return RX_HANDLER_CONSUMED;\n\n    //printk(\"%s skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n\n    if (skb->pkt_type == PACKET_LOOPBACK)\n        return RX_HANDLER_PASS;\n\n    /* Check this so that we dont loop around netif_receive_skb */\n    if (skb->cb[0] == 1) {\n        skb->cb[0] = 0;\n\n        return RX_HANDLER_PASS;\n    }\n\n    nss_cb = rcu_dereference(rmnet_nss_callbacks);\n    if (nss_cb) {\n        nss_cb->nss_tx(skb);\n        return RX_HANDLER_CONSUMED;\n    }\n\n    return RX_HANDLER_PASS;\n}\n\nstatic int qmap_register_device(sQmiWwanQmap * pDev, u8 offset_id)\n{\n    struct net_device *real_dev = pDev->mpNetDev->net;\n    struct net_device *qmap_net;\n    struct qmap_priv *priv;\n    int err;\n    struct rmnet_nss_cb *nss_cb;\n\n    qmap_net = alloc_etherdev(sizeof(*priv));\n    if (!qmap_net)\n        return -ENOBUFS;\n\n    SET_NETDEV_DEV(qmap_net, &real_dev->dev);\n    priv = netdev_priv(qmap_net);\n    priv->offset_id = offset_id;\n    priv->real_dev = real_dev;\n    priv->self_dev = qmap_net;\n    priv->dev = pDev->mpNetDev;\n    priv->qmap_version = pDev->qmap_version;\n    priv->mux_id = FIBOCOM_QMAP_MUX_ID + offset_id;\n    sprintf(qmap_net->name, \"%s.%d\", real_dev->name, offset_id + 1);\n    qmap_net->netdev_ops = &qmap_netdev_ops;\n#if LINUX_VERSION_CODE < KERNEL_VERSION(5,17,0)\n    memcpy(qmap_net->dev_addr, real_dev->dev_addr, ETH_ALEN);\n#else\n    __dev_addr_set(qmap_net, real_dev->dev_addr, ETH_ALEN);\n#endif\n\n#ifdef FIBOCOM_BRIDGE_MODE\n    priv->bridge_mode = !!(pDev->bridge_mode & BIT(offset_id));\n    qmap_net->sysfs_groups[0] = &qmi_qmap_sysfs_attr_group;\n#endif\n\n    priv->agg_skb = NULL;\n    priv->agg_count = 0;\n#if LINUX_VERSION_CODE < KERNEL_VERSION(6,18,0)\n    hrtimer_init(&priv->agg_hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);\n    priv->agg_hrtimer.function = rmnet_usb_tx_agg_timer_cb;\n#else\n    hrtimer_setup(&priv->agg_hrtimer, rmnet_usb_tx_agg_timer_cb, CLOCK_MONOTONIC, HRTIMER_MODE_REL);\n#endif\n    INIT_WORK(&priv->agg_wq, rmnet_usb_tx_agg_work);\n    ktime_get_ts64(&priv->agg_time);\n    spin_lock_init(&priv->agg_lock);\n\n    if (pDev->use_rmnet_usb) {\n        qmap_net->ethtool_ops = &rmnet_vnd_ethtool_ops;\n        qmap_net->netdev_ops = &rmnet_vnd_ops;\n#if defined(MHI_NETDEV_STATUS64)\n        priv->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);\n        if (!priv->stats64) {\n            err = -ENOBUFS;\n            goto out_free_newdev;\n        }\n#endif\n    }\n\n    nss_cb = rcu_dereference(rmnet_nss_callbacks);\n#ifdef FIBOCOM_BRIDGE_MODE\n    if(nss_cb && !priv->bridge_mode) {\n#else\n    if (nss_cb) {\n#endif\n        rmnet_usb_vnd_setup(qmap_net);\n    }\n\n    err = register_netdev(qmap_net);\n    dev_info(&real_dev->dev, \"%s(%s)=%d\\n\", __func__, qmap_net->name, err);\n    if (err < 0)\n        goto out_free_newdev;\n    netif_device_attach (qmap_net);\n    netif_carrier_off(qmap_net);\n\n    nss_cb = rcu_dereference(rmnet_nss_callbacks);\n#ifdef FIBOCOM_BRIDGE_MODE\n    if(nss_cb && !priv->bridge_mode) {\n#else\n    if (nss_cb) {\n#endif\n        int rc = nss_cb->nss_create(qmap_net);\n        if (rc) {\n            /* Log, but don't fail the device creation */\n            netdev_err(qmap_net, \"Device will not use NSS path: %d\\n\", rc);\n        } else {\n            netdev_info(qmap_net, \"NSS context created\\n\");\n            rtnl_lock();\n            netdev_rx_handler_register(qmap_net, rmnet_usb_rx_priv_handler, NULL);\n            rtnl_unlock();\n        }\n    }\n\n    if (pDev->use_rmnet_usb) {\n        strcpy(pDev->rmnet_info.ifname[offset_id], qmap_net->name);\n        pDev->rmnet_info.mux_id[offset_id] = priv->mux_id;\n    }\n\n    pDev->mpQmapNetDev[offset_id] = qmap_net;\n    qmap_net->flags |= IFF_NOARP;\n    qmap_net->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);\n\n    dev_info(&real_dev->dev, \"%s %s\\n\", __func__, qmap_net->name);\n\n    return 0;\n\nout_free_newdev:\n    free_netdev(qmap_net);\n    return err;\n}\n\nstatic void qmap_unregister_device(sQmiWwanQmap * pDev, u8 offset_id) {\n    struct net_device *qmap_net = pDev->mpQmapNetDev[offset_id];\n\n    if (qmap_net != NULL && qmap_net != pDev->mpNetDev->net) {\n        struct rmnet_nss_cb *nss_cb;\n        struct qmap_priv *priv = netdev_priv(qmap_net);\n        unsigned long flags;\n\n        pr_info(\"qmap_unregister_device(%s)\\n\", qmap_net->name);\n        pDev->mpQmapNetDev[offset_id] = NULL;\n        netif_carrier_off( qmap_net );\n        netif_stop_queue( qmap_net );\n\n        hrtimer_cancel(&priv->agg_hrtimer);\n        cancel_work_sync(&priv->agg_wq);\n        spin_lock_irqsave(&priv->agg_lock, flags);\n        if (priv->agg_skb) {\n            kfree_skb(priv->agg_skb);\n        }\n        spin_unlock_irqrestore(&priv->agg_lock, flags);\n        nss_cb = rcu_dereference(rmnet_nss_callbacks);\n\n#ifdef FIBOCOM_BRIDGE_MODE\n        if(nss_cb && !priv->bridge_mode) {\n#else\n        if (nss_cb) {\n#endif\n            rtnl_lock();\n            netdev_rx_handler_unregister(qmap_net);\n            rtnl_unlock();\n            nss_cb->nss_free(qmap_net);\n        }\n\n#if defined(MHI_NETDEV_STATUS64)\n        free_percpu(priv->stats64);\n#endif\n        unregister_netdev (qmap_net);\n        free_netdev(qmap_net);\n    }\n}\n\n#if 1//def CONFIG_ANDROID\ntypedef struct {\n    unsigned int size;\n    unsigned int rx_urb_size;\n    unsigned int ep_type;\n    unsigned int iface_id;\n    unsigned int MuxId;\n    unsigned int ul_data_aggregation_max_datagrams; //0x17\n    unsigned int ul_data_aggregation_max_size ;//0x18\n    unsigned int dl_minimum_padding; //0x1A\n} QMAP_SETTING;\n\nint qma_setting_store(struct device *dev, QMAP_SETTING *qmap_settings, size_t size) {\n    struct net_device *netdev = to_net_dev(dev);\n    struct usbnet * usbnetdev = netdev_priv( netdev );\n    struct qmi_wwan_state *info = (void *)&usbnetdev->data;\n    sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\n    if (qmap_settings->size != size) {\n        dev_err(dev, \"ERROR: qmap_settings.size donot match!\\n\");\n        return -EOPNOTSUPP;\n    }\n\n#ifdef FIBOCOM_UL_DATA_AGG\n    netif_tx_lock_bh(netdev);\n    if (pQmapDev->tx_ctx.ul_data_aggregation_max_datagrams == 1 && qmap_settings->ul_data_aggregation_max_datagrams > 1) {\n        pQmapDev->tx_ctx.ul_data_aggregation_max_datagrams = qmap_settings->ul_data_aggregation_max_datagrams;\n        pQmapDev->tx_ctx.ul_data_aggregation_max_size = qmap_settings->ul_data_aggregation_max_size;\n        pQmapDev->tx_ctx.dl_minimum_padding = qmap_settings->dl_minimum_padding;\n        dev_info(dev, \"ul_data_aggregation_max_datagrams=%d, ul_data_aggregation_max_size=%d, dl_minimum_padding=%d\\n\",\n            pQmapDev->tx_ctx.ul_data_aggregation_max_datagrams,\n            pQmapDev->tx_ctx.ul_data_aggregation_max_size,\n            pQmapDev->tx_ctx.dl_minimum_padding);\n    }\n    netif_tx_unlock_bh(netdev);\n    return 0;\n#endif\n\n    return -EOPNOTSUPP;\n}\n\nstatic int qmap_ndo_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) {\n    struct usbnet * usbnetdev = netdev_priv( dev );\n    struct qmi_wwan_state *info = (void *)&usbnetdev->data;\n    sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n    int rc = -EOPNOTSUPP;\n    uint link_state = 0;\n    QMAP_SETTING qmap_settings = {0};\n\n    switch (cmd) {\n    case 0x89F1: //SIOCDEVPRIVATE\n        rc = copy_from_user(&link_state, ifr->ifr_ifru.ifru_data, sizeof(link_state));\n        if (!rc) {\n            char buf[32];\n            snprintf(buf, sizeof(buf), \"%u\", link_state);\n            link_state_store(&dev->dev, NULL, buf, strlen(buf));\n        }\n    break;\n\n    case 0x89F2: //SIOCDEVPRIVATE\n        rc = copy_from_user(&qmap_settings, ifr->ifr_ifru.ifru_data, sizeof(qmap_settings));\n        if (!rc) {\n            rc = qma_setting_store(&dev->dev, &qmap_settings, sizeof(qmap_settings));\n        }\n    break;\n\n    case 0x89F3: //SIOCDEVPRIVATE\n        if (pQmapDev->use_rmnet_usb) {\n            uint i;\n\n            for (i = 0; i < pQmapDev->qmap_mode; i++) {\n                struct net_device *qmap_net = pQmapDev->mpQmapNetDev[i];\n\n                if (!qmap_net)\n                    break;\n\n                strcpy(pQmapDev->rmnet_info.ifname[i], qmap_net->name);\n            }\n            rc = copy_to_user(ifr->ifr_ifru.ifru_data, &pQmapDev->rmnet_info, sizeof(pQmapDev->rmnet_info));\n        }\n    break;\n\n    default:\n    break;\n    }\n\n    return rc;\n}\n#endif\n\n#ifdef FIBOCOM_BRIDGE_MODE\nstatic int is_qmap_netdev(const struct net_device *netdev) {\n    return netdev->netdev_ops == &qmap_netdev_ops || netdev->netdev_ops == &rmnet_vnd_ops;\n}\n#endif\n#endif\n\nstatic struct sk_buff *qmi_wwan_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) {\n    if ((dev->driver_info->flags & FLAG_NOARP) == 0)\n        return skb;\n\n    // Skip Ethernet header from message\n    if (dev->net->hard_header_len == 0)\n        return skb;\n    else\n        skb_reset_mac_header(skb);\n\n#ifdef FIBOCOM_BRIDGE_MODE\n{\n    struct qmi_wwan_state *info = (void *)&dev->data;\n    sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\n    if (pQmapDev->bridge_mode && bridge_mode_tx_fixup(dev->net, skb, pQmapDev->bridge_ipv4, pQmapDev->bridge_mac) == NULL) {\n          dev_kfree_skb_any (skb);\n          return NULL;\n    }\n}\n#endif\n\n    if (skb_pull(skb, ETH_HLEN)) {\n        return skb;\n    } else {\n        dev_err(&dev->intf->dev,  \"Packet Dropped \");\n    }\n\n    // Filter the packet out, release it\n    dev_kfree_skb_any(skb);\n    return NULL;\n}\n#endif\n\n/* Make up an ethernet header if the packet doesn't have one.\n *\n * A firmware bug common among several devices cause them to send raw\n * IP packets under some circumstances.  There is no way for the\n * driver/host to know when this will happen.  And even when the bug\n * hits, some packets will still arrive with an intact header.\n *\n * The supported devices are only capably of sending IPv4, IPv6 and\n * ARP packets on a point-to-point link. Any packet with an ethernet\n * header will have either our address or a broadcast/multicast\n * address as destination.  ARP packets will always have a header.\n *\n * This means that this function will reliably add the appropriate\n * header if necessary, provided our hardware address does not start\n * with 4 or 6.\n *\n * Another common firmware bug results in all packets being addressed\n * to 00:a0:c6:00:00:00 despite the host address being different.\n * This function will also fixup such packets.\n */\nstatic int qmi_wwan_rx_fixup(struct usbnet *dev, struct sk_buff *skb)\n{\n    __be16 proto;\n\n    /* This check is no longer done by usbnet */\n    if (skb->len < dev->net->hard_header_len)\n        return 0;\n\n    switch (skb->data[0] & 0xf0) {\n    case 0x40:\n        proto = htons(ETH_P_IP);\n        break;\n    case 0x60:\n        proto = htons(ETH_P_IPV6);\n        break;\n    case 0x00:\n        if (is_multicast_ether_addr(skb->data))\n            return 1;\n        /* possibly bogus destination - rewrite just in case */\n        skb_reset_mac_header(skb);\n        goto fix_dest;\n    default:\n        /* pass along other packets without modifications */\n        return 1;\n    }\n    if (skb_headroom(skb) < ETH_HLEN)\n        return 0;\n    skb_push(skb, ETH_HLEN);\n    skb_reset_mac_header(skb);\n    eth_hdr(skb)->h_proto = proto;\n    memset(eth_hdr(skb)->h_source, 0, ETH_ALEN);\n#if 1 //Added by Fibocom\n    //some kernel will drop ethernet packet which's souce mac is all zero\n    memcpy(eth_hdr(skb)->h_source, default_modem_addr, ETH_ALEN);\n#endif\n\nfix_dest:\n#ifdef FIBOCOM_BRIDGE_MODE\n{\n    struct qmi_wwan_state *info = (void *)&dev->data;\n    sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n    bridge_mode_rx_fixup(pQmapDev, dev->net, skb);\n}\n#else\n    memcpy(eth_hdr(skb)->h_dest, dev->net->dev_addr, ETH_ALEN);\n#endif\n\n    return 1;\n}\n\n#if defined(FIBOCOM_WWAN_QMAP)\nstatic struct sk_buff *qmap_qmi_wwan_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) {\n    struct qmi_wwan_state *info = (void *)&dev->data;\n    sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n    struct qmap_hdr *qhdr;\n\n    if (unlikely(pQmapDev == NULL)) {\n        goto drop_skb;\n    } else if (unlikely(pQmapDev->qmap_mode && !pQmapDev->link_state)) {\n        dev_dbg(&dev->net->dev, \"link_state 0x%x, drop skb, len = %u\\n\", pQmapDev->link_state, skb->len);\n        goto drop_skb;\n    } else if (pQmapDev->qmap_mode == 0) {\n        skb = qmi_wwan_tx_fixup(dev, skb, flags);\n    }\n    else if (pQmapDev->qmap_mode > 1) {\n        if (likely(skb)) {\n            qhdr = (struct qmap_hdr *)skb->data;\n            if ((qhdr->mux_id&0xF0) != 0x80 || ((be16_to_cpu(qhdr->pkt_len) + sizeof(struct qmap_hdr)) != skb->len)) {\n                goto drop_skb;\n            }\n        }\n    }\n    else {\n        if (likely(skb)) {\n            skb = qmi_wwan_tx_fixup(dev, skb, flags);\n\n            if (skb) {\n                add_qhdr(skb, FIBOCOM_QMAP_MUX_ID);\n            }\n            else {\n                return NULL;\n            }\n        }\n    }\n\n    if (skb && (dev->driver_info->flags&FLAG_MULTI_PACKET)) {\n        usbnet_set_skb_tx_stats(skb, 1, 0);\n     }\n\n\n    return skb;\ndrop_skb:\n    dev_kfree_skb_any (skb);\n    return NULL;\n}\n\nstatic int qmap_qmi_wwan_rx_fixup(struct usbnet *dev, struct sk_buff *skb_in)\n{\n    struct qmi_wwan_state *info = (void *)&dev->data;\n    sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n    unsigned headroom = 0;\n    const unsigned need_headroot = ETH_HLEN;\n    struct sk_buff *qmap_skb;\n\n    if (pQmapDev->qmap_mode == 0)\n        return qmi_wwan_rx_fixup(dev, skb_in);\n\n    headroom = skb_headroom(skb_in);\n\n    while (skb_in->len > sizeof(struct qmap_hdr)) {\n        struct qmap_hdr *qhdr = (struct qmap_hdr *)skb_in->data;\n        struct net_device *qmap_net;\n        int pkt_len = be16_to_cpu(qhdr->pkt_len);\n        int skb_len;\n        __be16 protocol;\n        int mux_id;\n\n        skb_len = pkt_len - (qhdr->cd_rsvd_pad&0x3F);\n        if (skb_len > 1500) {\n            dev_info(&dev->net->dev, \"drop skb_len=%x larger than 1500\\n\", skb_len);\n            goto error_pkt;\n        }\n\n        if (skb_in->len < (pkt_len + sizeof(struct qmap_hdr))) {\n            dev_info(&dev->net->dev, \"drop qmap unknow pkt, len=%d, pkt_len=%d\\n\", skb_in->len, pkt_len);\n            goto error_pkt;\n        }\n\n        if (qhdr->cd_rsvd_pad & 0x80) {\n            dev_info(&dev->net->dev, \"skip qmap command packet %x\\n\", qhdr->cd_rsvd_pad);\n            goto skip_pkt;\n        }\n\n        switch (skb_in->data[sizeof(struct qmap_hdr)] & 0xf0) {\n            case 0x40:\n                protocol = htons(ETH_P_IP);\n            break;\n            case 0x60:\n                protocol = htons(ETH_P_IPV6);\n            break;\n            default:\n                dev_info(&dev->net->dev, \"unknow skb->protocol %02x\\n\", skb_in->data[sizeof(struct qmap_hdr)]);\n                goto error_pkt;\n        }\n\n        mux_id = qhdr->mux_id - FIBOCOM_QMAP_MUX_ID;\n        if (mux_id >= pQmapDev->qmap_mode) {\n            dev_info(&dev->net->dev, \"drop qmap unknow mux_id %x\\n\", qhdr->mux_id);\n            goto error_pkt;\n        }\n\n        qmap_net = pQmapDev->mpQmapNetDev[mux_id];\n\n        if (qmap_net == NULL) {\n            dev_info(&dev->net->dev, \"drop qmap unknow mux_id %x\\n\", qhdr->mux_id);\n            goto skip_pkt;\n        }\n\n        if (headroom >= need_headroot) {\n            qmap_skb = skb_clone(skb_in, GFP_ATOMIC);\n            if (qmap_skb) {\n                qmap_skb->dev = qmap_net;\n                skb_pull(qmap_skb, sizeof(struct qmap_hdr));\n                skb_trim(qmap_skb, skb_len);\n            }\n            headroom = (qhdr->cd_rsvd_pad&0x3F);\n        }\n        else {\n            qmap_skb = netdev_alloc_skb(qmap_net, need_headroot + skb_len);\n            if (qmap_skb) {\n                skb_reserve(qmap_skb, need_headroot);\n                skb_put(qmap_skb, skb_len);\n                memcpy(qmap_skb->data, skb_in->data + sizeof(struct qmap_hdr), skb_len);\n            }\n            headroom = pkt_len;\n        }\n\n        if (qmap_skb == NULL) {\n            dev_info(&dev->net->dev, \"fail to alloc skb, pkt_len = %d\\n\", skb_len);\n            return 0;\n        }\n\n        skb_push(qmap_skb, ETH_HLEN);\n        skb_reset_mac_header(qmap_skb);\n        memcpy(eth_hdr(qmap_skb)->h_source, default_modem_addr, ETH_ALEN);\n        memcpy(eth_hdr(qmap_skb)->h_dest, qmap_net->dev_addr, ETH_ALEN);\n        eth_hdr(qmap_skb)->h_proto =  protocol;\n#ifdef FIBOCOM_BRIDGE_MODE\n        bridge_mode_rx_fixup(pQmapDev, qmap_net, qmap_skb);\n#endif\n\n        if (qmap_net != dev->net) {\n            qmap_net->stats.rx_packets++;\n            qmap_net->stats.rx_bytes += qmap_skb->len;\n        }\n\n        skb_queue_tail(&pQmapDev->skb_chain, qmap_skb);\n\nskip_pkt:\n        skb_pull(skb_in, pkt_len + sizeof(struct qmap_hdr));\n    }\n\n    while ((qmap_skb = skb_dequeue (&pQmapDev->skb_chain))) {\n        if (qmap_skb->dev != dev->net) {\n            qmap_skb->protocol = eth_type_trans (qmap_skb, qmap_skb->dev);\n            netif_rx(qmap_skb);\n        }\n        else {\n            qmap_skb->protocol = 0;\n            usbnet_skb_return(dev, qmap_skb);\n        }\n    }\n\nerror_pkt:\n    return 0;\n}\n#endif\n\n/* very simplistic detection of IPv4 or IPv6 headers */\nstatic bool possibly_iphdr(const char *data)\n{\n    return (data[0] & 0xd0) == 0x40;\n}\n\n/* disallow addresses which may be confused with IP headers */\nstatic int qmi_wwan_mac_addr(struct net_device *dev, void *p)\n{\n    int ret;\n    struct sockaddr *addr = p;\n\n    ret = eth_prepare_mac_addr_change(dev, p);\n    if (ret < 0)\n        return ret;\n    if (possibly_iphdr(addr->sa_data))\n        return -EADDRNOTAVAIL;\n    eth_commit_mac_addr_change(dev, p);\n    return 0;\n}\n\n#if (LINUX_VERSION_CODE > KERNEL_VERSION( 4,10,0 )) //bc1f44709cf27fb2a5766cadafe7e2ad5e9cb221\nstatic void (*_usbnet_get_stats64)(struct net_device *net, struct rtnl_link_stats64 *stats);\n\nstatic void qmi_wwan_get_stats64(struct net_device *net, struct rtnl_link_stats64 *stats) {\n    if (_usbnet_get_stats64) ////c8b5d129ee293bcf972e7279ac996bb8a138505c\n        return _usbnet_get_stats64(net, stats);\n\n    netdev_stats_to_stats64(stats, &net->stats);\n}\n#else\nstatic struct rtnl_link_stats64 * (*_usbnet_get_stats64)(struct net_device *net, struct rtnl_link_stats64 *stats);\n\nstatic struct rtnl_link_stats64 * qmi_wwan_get_stats64(struct net_device *net, struct rtnl_link_stats64 *stats) {\n    if (_usbnet_get_stats64)\n        return _usbnet_get_stats64(net, stats);\n\n    netdev_stats_to_stats64(stats, &net->stats);\n    return stats;\n}\n#endif\n\nstatic netdev_tx_t qmi_wwan_start_xmit (struct sk_buff *skb,\n                     struct net_device *net)\n{\n    struct usbnet * usbnetdev = netdev_priv( net );\n    struct qmi_wwan_state *info = (void *)&usbnetdev->data;\n    sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n    int retval;\n\n    retval = usbnet_start_xmit(skb, net);\n\n    if (netif_queue_stopped(net) && pQmapDev && pQmapDev->use_rmnet_usb) {\n        int i;\n\n        for (i = 0; i < pQmapDev->qmap_mode; i++) {\n            struct net_device *qmap_net = pQmapDev->mpQmapNetDev[i];\n            if (qmap_net) {\n                netif_stop_queue(qmap_net);\n            }\n        }\n    }\n\n    return retval;\n}\n\nstatic const struct net_device_ops qmi_wwan_netdev_ops = {\n    .ndo_open        = usbnet_open,\n    .ndo_stop        = usbnet_stop,\n    .ndo_start_xmit        = qmi_wwan_start_xmit,\n    .ndo_tx_timeout        = usbnet_tx_timeout,\n    .ndo_change_mtu        = usbnet_change_mtu,\n    .ndo_get_stats64    = qmi_wwan_get_stats64,\n    .ndo_set_mac_address    = qmi_wwan_mac_addr,\n    .ndo_validate_addr    = eth_validate_addr,\n#if defined(FIBOCOM_WWAN_QMAP)// && defined(CONFIG_ANDROID)\n    .ndo_do_ioctl = qmap_ndo_do_ioctl,\n#endif\n};\n\nstatic void ql_net_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *info)\n{\n    /* Inherit standard device info */\n    usbnet_get_drvinfo(net, info);\n    /* strlcpy() is deprecated in kernel 6.8.0+, using strscpy instead */\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(6,8,0))\n    strlcpy(info->driver, driver_name, sizeof(info->driver));\n    strlcpy(info->version, VERSION_NUMBER, sizeof(info->version));\n#else\n    strscpy(info->driver, driver_name, sizeof(info->driver));\n    strscpy(info->version, VERSION_NUMBER, sizeof(info->version));\n#endif\n}\n\nstatic struct ethtool_ops ql_net_ethtool_ops;\n\n/* using a counter to merge subdriver requests with our own into a\n * combined state\n */\nstatic int qmi_wwan_manage_power(struct usbnet *dev, int on)\n{\n    struct qmi_wwan_state *info = (void *)&dev->data;\n    int rv;\n\n    dev_dbg(&dev->intf->dev, \"%s() pmcount=%d, on=%d\\n\", __func__,\n        atomic_read(&info->pmcount), on);\n\n    if ((on && atomic_add_return(1, &info->pmcount) == 1) ||\n        (!on && atomic_dec_and_test(&info->pmcount))) {\n        /* need autopm_get/put here to ensure the usbcore sees\n         * the new value\n         */\n        rv = usb_autopm_get_interface(dev->intf);\n        dev->intf->needs_remote_wakeup = on;\n        if (!rv)\n            usb_autopm_put_interface(dev->intf);\n    }\n    return 0;\n}\n\nstatic int qmi_wwan_cdc_wdm_manage_power(struct usb_interface *intf, int on)\n{\n    struct usbnet *dev = usb_get_intfdata(intf);\n\n    /* can be called while disconnecting */\n    if (!dev)\n        return 0;\n    return qmi_wwan_manage_power(dev, on);\n}\n\n/* collect all three endpoints and register subdriver */\nstatic int qmi_wwan_register_subdriver(struct usbnet *dev)\n{\n    int rv;\n    struct usb_driver *subdriver = NULL;\n    struct qmi_wwan_state *info = (void *)&dev->data;\n\n    /* collect bulk endpoints */\n    rv = usbnet_get_endpoints(dev, info->data);\n    if (rv < 0)\n        goto err;\n\n    /* update status endpoint if separate control interface */\n    if (info->control != info->data)\n        dev->status = &info->control->cur_altsetting->endpoint[0];\n\n    /* require interrupt endpoint for subdriver */\n    if (!dev->status) {\n        rv = -EINVAL;\n        goto err;\n    }\n\n    /* for subdriver power management */\n    atomic_set(&info->pmcount, 0);\n\n    /* register subdriver */\n#if (LINUX_VERSION_CODE > KERNEL_VERSION( 5,12,0 )) //cac6fb015f719104e60b1c68c15ca5b734f57b9c\n\tsubdriver = usb_cdc_wdm_register(info->control, &dev->status->desc,\n\t\t\t\t\t 4096, WWAN_PORT_QMI, &qmi_wwan_cdc_wdm_manage_power);\n#else\n\tsubdriver = usb_cdc_wdm_register(info->control, &dev->status->desc,\n\t\t\t\t\t 4096, &qmi_wwan_cdc_wdm_manage_power);\n\n#endif\n    if (IS_ERR(subdriver)) {\n        dev_err(&info->control->dev, \"subdriver registration failed\\n\");\n        rv = PTR_ERR(subdriver);\n        goto err;\n    }\n\n    /* prevent usbnet from using status endpoint */\n    dev->status = NULL;\n\n    /* save subdriver struct for suspend/resume wrappers */\n    info->subdriver = subdriver;\n\nerr:\n    return rv;\n}\n\nstatic int qmi_wwan_bind(struct usbnet *dev, struct usb_interface *intf)\n{\n    int status = -1;\n    struct usb_driver *driver = driver_of(intf);\n    struct qmi_wwan_state *info = (void *)&dev->data;\n\n    BUILD_BUG_ON((sizeof(((struct usbnet *)0)->data) <\n              sizeof(struct qmi_wwan_state)));\n\n    /* set up initial state */\n    info->control = intf;\n    info->data = intf;\n\n    status = qmi_wwan_register_subdriver(dev);\n    if (status < 0 && info->control != info->data) {\n        usb_set_intfdata(info->data, NULL);\n        usb_driver_release_interface(driver, info->data);\n    }\n\n    /* Never use the same address on both ends of the link, even\n     * if the buggy firmware told us to.\n     */\n    if (ether_addr_equal(dev->net->dev_addr, default_modem_addr))\n        eth_hw_addr_random(dev->net);\n\n    /* make MAC addr easily distinguishable from an IP header */\n    if (possibly_iphdr(dev->net->dev_addr)) {\n#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0)\n        dev->net->dev_addr[0] |= 0x02;    /* set local assignment bit */\n        dev->net->dev_addr[0] &= 0xbf;    /* clear \"IP\" bit */\n#else\n\tu8 addr = dev->net->dev_addr[0];\n\n\taddr |= 0x02;\t/* set local assignment bit */\n\taddr &= 0xbf;\t/* clear \"IP\" bit */\n\tdev_addr_mod(dev->net, 0, &addr, 1);\n#endif\n    }\n\tif (!_usbnet_get_stats64)\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 6,10,0 ))\n        _usbnet_get_stats64 = dev->net->netdev_ops->ndo_get_stats64;\n#else\n\t\t/* From kernel 6.10+, usbnet sets pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS (352f5b3282), but removed ndo_get_stats64 (9cb3d523c1) */\n\t\t/* Use dev_get_tstats64 to read per-CPU stats when NETDEV_PCPU_STAT_TSTATS was set */\n\t\tif (dev->net->pcpu_stat_type == NETDEV_PCPU_STAT_TSTATS)\n\t\t\t_usbnet_get_stats64 = dev_get_tstats64;\n#endif\n    dev->net->netdev_ops = &qmi_wwan_netdev_ops;\n\n    ql_net_ethtool_ops = *dev->net->ethtool_ops;\n    ql_net_ethtool_ops.get_drvinfo = ql_net_get_drvinfo;\n    dev->net->ethtool_ops = &ql_net_ethtool_ops;\n\n#if 1 //Added by Fibocom\n    if (dev->driver_info->flags & FLAG_NOARP) {\n        int ret;\n        char buf[32] = \"Module\";\n\n        ret = usb_string(dev->udev, dev->udev->descriptor.iProduct, buf, sizeof(buf));\n        if (ret > 0) {\n            buf[ret] = '\\0';\n        }\n\n\t\tdev_err(&intf->dev, \"Fibocom %s work on RawIP mode\\n\", buf);\n\t\tdev->net->flags |= IFF_NOARP;\n\t\tdev->net->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);\n\n        usb_control_msg(\n            interface_to_usbdev(intf),\n            usb_sndctrlpipe(interface_to_usbdev(intf), 0),\n            0x22, //USB_CDC_REQ_SET_CONTROL_LINE_STATE\n            0x21, //USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE\n            1, //active CDC DTR\n            intf->cur_altsetting->desc.bInterfaceNumber,\n            NULL, 0, 100);\n    }\n\n    dev->rx_urb_size = ETH_DATA_LEN + ETH_HLEN + 6;\n\n#if defined(FIBOCOM_WWAN_QMAP)\n    if (qmap_mode > FIBOCOM_WWAN_QMAP)\n        qmap_mode = FIBOCOM_WWAN_QMAP;\n\n    if (!status)\n    {\n        sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)kzalloc(sizeof(sQmiWwanQmap), GFP_KERNEL);\n\n        if (pQmapDev == NULL)\n            return -ENODEV;\n\n#ifdef FIBOCOM_BRIDGE_MODE\n        pQmapDev->bridge_mode = bridge_mode;\n#endif\n        pQmapDev->mpNetDev = dev;\n        pQmapDev->link_state = 1;\n\n        dev->net->features |= (NETIF_F_VLAN_CHALLENGED);\n\n        skb_queue_head_init(&pQmapDev->skb_chain);\n\n        if (dev->driver_info->flags & FLAG_NOARP)\n        {\n            int idProduct = le16_to_cpu(dev->udev->descriptor.idProduct);\n            int lte_a = (idProduct == 0x0104 || idProduct == 0x0109 || idProduct == 0x0113 || idProduct == 0x1000 || idProduct == 0x1001);\n\n            pQmapDev->qmap_mode = qmap_mode;\n            if (lte_a || dev->udev->speed >= USB_SPEED_SUPER) {\n                if (pQmapDev->qmap_mode == 0) {\n                    pQmapDev->qmap_mode = 1;\n                    if(qmap_mode == 0)\n                        qmap_mode = 1;\n                }\n            }\n\n            if (pQmapDev->qmap_mode) {\n                pQmapDev->qmap_version = 5;\n                pQmapDev->qmap_size = (dev->udev->speed >= USB_SPEED_SUPER) ? 16*1024 : 4*1024;\n/*\n                switch (idProduct) {\n                    case 0x0104:\n                        pQmapDev->qmap_version = 9;\n                        pQmapDev->qmap_size = 31*1024;\n                    break;\n                    default:\n                    break;\n                }\n*/\n                dev->rx_urb_size = pQmapDev->qmap_size;\n                //for these modules, if send pakcet before qmi_start_network, or cause host PC crash, or cause modules crash\n                if (lte_a || dev->udev->speed >= USB_SPEED_SUPER)\n                    pQmapDev->link_state = 0;\n            }\n\n#if defined(FIBOCOM_UL_DATA_AGG)\n            if (pQmapDev->qmap_mode) {\n                struct tx_agg_ctx *ctx = &pQmapDev->tx_ctx;\n                ctx->ul_data_aggregation_max_datagrams = 1;\n                ctx->ul_data_aggregation_max_size = 1500;\n            }\n#endif\n\n            if (pQmapDev->qmap_mode == 0) {\n                pQmapDev->driver_info = *dev->driver_info;\n                pQmapDev->driver_info.flags &= ~(FLAG_MULTI_PACKET); //see usbnet.c rx_process()\n                dev->driver_info = &pQmapDev->driver_info;\n            }\n        }\n\n        info->unused = (unsigned long)pQmapDev;\n        dev->net->sysfs_groups[0] = &qmi_wwan_sysfs_attr_group;\n\n        dev_info(&intf->dev, \"rx_urb_size = %zd\\n\", dev->rx_urb_size);\n    }\n#endif\n#endif\n\n    return status;\n}\n\nstatic void qmi_wwan_unbind(struct usbnet *dev, struct usb_interface *intf)\n{\n    struct qmi_wwan_state *info = (void *)&dev->data;\n    struct usb_driver *driver = driver_of(intf);\n    struct usb_interface *other;\n\n    if (dev->udev && dev->udev->state == USB_STATE_CONFIGURED) {\n        usb_control_msg(\n            interface_to_usbdev(intf),\n            usb_sndctrlpipe(interface_to_usbdev(intf), 0),\n            0x22, //USB_CDC_REQ_SET_CONTROL_LINE_STATE\n            0x21, //USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE\n            0, //deactive CDC DTR\n            intf->cur_altsetting->desc.bInterfaceNumber,\n            NULL, 0, 100);\n    }\n\n    if (info->subdriver && info->subdriver->disconnect)\n        info->subdriver->disconnect(info->control);\n\n    /* allow user to unbind using either control or data */\n    if (intf == info->control)\n        other = info->data;\n    else\n        other = info->control;\n\n    /* only if not shared */\n    if (other && intf != other) {\n        usb_set_intfdata(other, NULL);\n        usb_driver_release_interface(driver, other);\n    }\n\n    info->subdriver = NULL;\n    info->data = NULL;\n    info->control = NULL;\n}\n\n/* suspend/resume wrappers calling both usbnet and the cdc-wdm\n * subdriver if present.\n *\n * NOTE: cdc-wdm also supports pre/post_reset, but we cannot provide\n * wrappers for those without adding usbnet reset support first.\n */\nstatic int qmi_wwan_suspend(struct usb_interface *intf, pm_message_t message)\n{\n    struct usbnet *dev = usb_get_intfdata(intf);\n    struct qmi_wwan_state *info = (void *)&dev->data;\n    int ret;\n\n    /* Both usbnet_suspend() and subdriver->suspend() MUST return 0\n     * in system sleep context, otherwise, the resume callback has\n     * to recover device from previous suspend failure.\n     */\n    ret = usbnet_suspend(intf, message);\n    if (ret < 0)\n        goto err;\n\n    if (intf == info->control && info->subdriver &&\n        info->subdriver->suspend)\n        ret = info->subdriver->suspend(intf, message);\n    if (ret < 0)\n        usbnet_resume(intf);\nerr:\n    return ret;\n}\n\nstatic int qmi_wwan_resume(struct usb_interface *intf)\n{\n    struct usbnet *dev = usb_get_intfdata(intf);\n    struct qmi_wwan_state *info = (void *)&dev->data;\n    int ret = 0;\n    bool callsub = (intf == info->control && info->subdriver &&\n            info->subdriver->resume);\n\n    if (callsub)\n        ret = info->subdriver->resume(intf);\n    if (ret < 0)\n        goto err;\n    ret = usbnet_resume(intf);\n    if (ret < 0 && callsub)\n        info->subdriver->suspend(intf, PMSG_SUSPEND);\nerr:\n    return ret;\n}\n\nstatic int qmi_wwan_reset_resume(struct usb_interface *intf)\n{\n    dev_info(&intf->dev, \"device do not support reset_resume\\n\");\n    intf->needs_binding = 1;\n    return -EOPNOTSUPP;\n}\n\nstatic int rmnet_usb_bind(struct usbnet *dev, struct usb_interface *intf)\n{\n    int status = qmi_wwan_bind(dev, intf);\n    dev_err(&intf->dev, \"rmnet_usb_bind\\n\");\n\n    if (!status) {\n        struct qmi_wwan_state *info = (void *)&dev->data;\n        sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\n        if (pQmapDev && pQmapDev->qmap_mode) {\n            struct net_device *rmmet_usb = dev->net;\n\n            pQmapDev->use_rmnet_usb = 1;\n            pQmapDev->rmnet_info.size = sizeof(RMNET_INFO);\n            pQmapDev->rmnet_info.rx_urb_size = pQmapDev->qmap_size;\n            pQmapDev->rmnet_info.ep_type = 2; //DATA_EP_TYPE_HSUSB\n            pQmapDev->rmnet_info.iface_id = 4;\n            pQmapDev->rmnet_info.qmap_mode = pQmapDev->qmap_mode;\n            pQmapDev->rmnet_info.qmap_version = pQmapDev->qmap_version;\n            pQmapDev->rmnet_info.dl_minimum_padding = 0;\n\n            strcpy(rmmet_usb->name, \"rmnet_usb%d\");\n\n#if 0\n            rmmet_usb->header_ops = NULL; /* No header */\n            rmmet_usb->type = ARPHRD_RAWIP;\n            rmmet_usb->hard_header_len = 0;\n            rmmet_usb->addr_len = 0;\n#endif\n            rmmet_usb->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);\n            rmmet_usb->flags |= (IFF_NOARP);\n        }\n    }\n\n    return status;\n}\n\nstatic struct sk_buff *rmnet_usb_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)\n{\n    //printk(\"%s skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n    if (skb->protocol != htons(ETH_P_MAP)) {\n        dev_kfree_skb_any(skb);\n        return NULL;\n    }\n\n    return skb;\n}\n\nstatic int rmnet_usb_rx_fixup(struct usbnet *dev, struct sk_buff *skb)\n{\n    struct net_device    *net = dev->net;\n\n    //printk(\"%s skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n    if (net->type == ARPHRD_ETHER && skb_headroom(skb) >= ETH_HLEN) {\n        //usbnet.c rx_process() usbnet_skb_return() eth_type_trans()\n        skb_push(skb, ETH_HLEN);\n        skb_reset_mac_header(skb);\n        memcpy(eth_hdr(skb)->h_source, default_modem_addr, ETH_ALEN);\n        memcpy(eth_hdr(skb)->h_dest, net->dev_addr, ETH_ALEN);\n        eth_hdr(skb)->h_proto = htons(ETH_P_MAP);\n\n        return 1;\n    }\n\n    return 0;\n}\n\nstatic void _rmnet_usb_rx_handler(struct usbnet *dev, struct sk_buff *skb_in)\n{\n    struct qmi_wwan_state *info = (void *)&dev->data;\n    sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n    struct sk_buff *qmap_skb;\n    struct sk_buff_head skb_chain;\n    uint dl_minimum_padding = 0;\n\n    if (pQmapDev->qmap_version == 9)\n        dl_minimum_padding = pQmapDev->tx_ctx.dl_minimum_padding;\n\n    __skb_queue_head_init(&skb_chain);\n\n    while (skb_in->len > sizeof(struct qmap_hdr)) {\n        struct rmnet_map_header *map_header = (struct rmnet_map_header *)skb_in->data;\n        struct rmnet_map_v5_csum_header *ul_header = NULL;\n        size_t hdr_size = sizeof(struct rmnet_map_header);\n        struct net_device *qmap_net;\n        int pkt_len = ntohs(map_header->pkt_len);\n        int skb_len;\n        __be16 protocol;\n        int mux_id;\n\n        if (map_header->next_hdr) {\n            ul_header = (struct rmnet_map_v5_csum_header *)(map_header + 1);\n            hdr_size += sizeof(struct rmnet_map_v5_csum_header);\n        }\n\n        skb_len = pkt_len - (map_header->pad_len&0x3F);\n        skb_len -= dl_minimum_padding;\n        if (skb_len > 1500) {\n            dev_info(&dev->net->dev, \"drop skb_len=%x larger than 1500\\n\", skb_len);\n            goto error_pkt;\n        }\n\n        if (skb_in->len < (pkt_len + hdr_size)) {\n            dev_info(&dev->net->dev, \"drop qmap unknow pkt, len=%d, pkt_len=%d\\n\", skb_in->len, pkt_len);\n            goto error_pkt;\n        }\n\n        if (map_header->cd_bit) {\n            dev_info(&dev->net->dev, \"skip qmap command packet\\n\");\n            goto skip_pkt;\n        }\n\n        switch (skb_in->data[hdr_size] & 0xf0) {\n            case 0x40:\n                protocol = htons(ETH_P_IP);\n            break;\n            case 0x60:\n                protocol = htons(ETH_P_IPV6);\n            break;\n            default:\n                dev_info(&dev->net->dev, \"unknow skb->protocol %02x\\n\", skb_in->data[hdr_size]);\n                goto error_pkt;\n        }\n\n        mux_id = map_header->mux_id - FIBOCOM_QMAP_MUX_ID;\n        if (mux_id >= pQmapDev->qmap_mode) {\n            dev_info(&dev->net->dev, \"drop qmap unknow mux_id %x\\n\", map_header->mux_id);\n            goto error_pkt;\n        }\n\n        qmap_net = pQmapDev->mpQmapNetDev[mux_id];\n\n        if (qmap_net == NULL) {\n            dev_info(&dev->net->dev, \"drop qmap unknow mux_id %x\\n\", map_header->mux_id);\n            goto skip_pkt;\n        }\n\n        qmap_skb = netdev_alloc_skb(qmap_net, skb_len);\n        if (qmap_skb) {\n            skb_put(qmap_skb, skb_len);\n            memcpy(qmap_skb->data, skb_in->data + hdr_size, skb_len);\n        }\n\n        if (qmap_skb == NULL) {\n            dev_info(&dev->net->dev, \"fail to alloc skb, pkt_len = %d\\n\", skb_len);\n            goto error_pkt;\n        }\n\n        skb_reset_transport_header(qmap_skb);\n        skb_reset_network_header(qmap_skb);\n        qmap_skb->pkt_type = PACKET_HOST;\n        skb_set_mac_header(qmap_skb, 0);\n        qmap_skb->protocol = protocol;\n\n        if (ul_header && ul_header->header_type == RMNET_MAP_HEADER_TYPE_CSUM_OFFLOAD\n            && ul_header->csum_valid_required) {\n#if 0 //TODO\n            qmap_skb->ip_summed = CHECKSUM_UNNECESSARY;\n#endif\n        }\n\n        if (qmap_skb->dev->type == ARPHRD_ETHER) {\n            skb_push(qmap_skb, ETH_HLEN);\n            skb_reset_mac_header(qmap_skb);\n            memcpy(eth_hdr(qmap_skb)->h_source, default_modem_addr, ETH_ALEN);\n            memcpy(eth_hdr(qmap_skb)->h_dest, qmap_net->dev_addr, ETH_ALEN);\n            eth_hdr(qmap_skb)->h_proto = protocol;\n#ifdef FIBOCOM_BRIDGE_MODE\n            bridge_mode_rx_fixup(pQmapDev, qmap_net, qmap_skb);\n#endif\n            __skb_pull(qmap_skb, ETH_HLEN);\n        }\n\n        rmnet_vnd_update_rx_stats(qmap_net, 1, skb_len);\n        __skb_queue_tail(&skb_chain, qmap_skb);\n\nskip_pkt:\n        skb_pull(skb_in, pkt_len + hdr_size);\n    }\n\nerror_pkt:\n    while ((qmap_skb = __skb_dequeue (&skb_chain))) {\n        netif_receive_skb(qmap_skb);\n    }\n}\n\nstatic rx_handler_result_t rmnet_usb_rx_handler(struct sk_buff **pskb)\n{\n    struct sk_buff *skb = *pskb;\n    struct usbnet *dev;\n\n    if (!skb)\n        goto done;\n\n    //printk(\"%s skb=%p, protocol=%x, len=%d\\n\", __func__, skb, skb->protocol, skb->len);\n\n    if (skb->pkt_type == PACKET_LOOPBACK)\n        return RX_HANDLER_PASS;\n\n    if (skb->protocol != htons(ETH_P_MAP)) {\n        WARN_ON(1);\n        return RX_HANDLER_PASS;\n    }\n    /* when open hyfi function, run cm will make system crash */\n    //dev = rcu_dereference(skb->dev->rx_handler_data);\n    dev = netdev_priv(skb->dev);\n\n    if (dev == NULL) {\n        WARN_ON(1);\n        return RX_HANDLER_PASS;\n    }\n\n    _rmnet_usb_rx_handler(dev, skb);\n    consume_skb(skb);\n\ndone:\n    return RX_HANDLER_CONSUMED;\n}\n\nstatic const struct driver_info    qmi_wwan_info = {\n    .description    = \"WWAN/QMI device\",\n    .flags        = FLAG_WWAN,\n    .bind        = qmi_wwan_bind,\n    .unbind        = qmi_wwan_unbind,\n    .manage_power    = qmi_wwan_manage_power,\n    .rx_fixup       = qmi_wwan_rx_fixup,\n};\n\nstatic const struct driver_info qmi_wwan_raw_ip_info = {\n    .description    = \"WWAN/QMI device\",\n    .flags        = FLAG_WWAN | FLAG_RX_ASSEMBLE | FLAG_NOARP | FLAG_SEND_ZLP | FLAG_MULTI_PACKET,\n    .bind        = qmi_wwan_bind,\n    .unbind        = qmi_wwan_unbind,\n    .manage_power    = qmi_wwan_manage_power,\n#if defined(FIBOCOM_WWAN_QMAP)\n    .tx_fixup       = qmap_qmi_wwan_tx_fixup,\n    .rx_fixup       = qmap_qmi_wwan_rx_fixup,\n#else\n    .tx_fixup       = qmi_wwan_tx_fixup,\n    .rx_fixup       = qmi_wwan_rx_fixup,\n#endif\n};\n\nstatic const struct driver_info rmnet_usb_info = {\n    .description = \"RMNET/USB device\",\n    .flags        =  FLAG_NOARP | FLAG_SEND_ZLP,\n    .bind = rmnet_usb_bind,\n    .unbind = qmi_wwan_unbind,\n    .manage_power = qmi_wwan_manage_power,\n    .tx_fixup = rmnet_usb_tx_fixup,\n    .rx_fixup = rmnet_usb_rx_fixup,\n};\n\n/* map QMI/wwan function by a fixed interface number */\n#define QMI_FIXED_INTF(vend, prod, num) \\\n    USB_DEVICE_INTERFACE_NUMBER(vend, prod, num), \\\n    .driver_info = (unsigned long)&qmi_wwan_info\n\n#define QMI_FIXED_RAWIP_INTF(vend, prod, num) \\\n    USB_DEVICE_INTERFACE_NUMBER(vend, prod, num), \\\n    .driver_info = (unsigned long)&qmi_wwan_raw_ip_info\n\n#define RMNET_USB_INTF(vend, prod, num) \\\n        USB_DEVICE_INTERFACE_NUMBER(vend, prod, num), \\\n        .driver_info = (unsigned long) &rmnet_usb_info\n\nstatic const struct usb_device_id products[] = {\n#if 1 //Added by Fibocom\n    { QMI_FIXED_RAWIP_INTF(0x2cb7, 0x0104, 4) },  /* Fibocom FG150/FM150/NL952/FG101 */\n    { QMI_FIXED_RAWIP_INTF(0x2cb7, 0x0109, 2) },  /* Fibocom FG150/FM150 */\n    { QMI_FIXED_RAWIP_INTF(0x2cb7, 0x0113, 0) },  /* Fibocom FG101 */\n    { QMI_FIXED_RAWIP_INTF(0x1508, 0x1000, 2) },  /* Fibocom NL668 */\n    { QMI_FIXED_RAWIP_INTF(0x1508, 0x1001, 4) },  /* Fibocom NL668 */\n    { QMI_FIXED_RAWIP_INTF(0x05c6, 0x9025, 4) },  /* Fibocom NL668 */\n#endif\n    { }                    /* END */\n};\nMODULE_DEVICE_TABLE(usb, products);\n\nstatic int qmi_wwan_probe(struct usb_interface *intf,\n              const struct usb_device_id *prod)\n{\n    struct usb_device_id *id = (struct usb_device_id *)prod;\n\n    /* Workaround to enable dynamic IDs.  This disables usbnet\n     * blacklisting functionality.  Which, if required, can be\n     * reimplemented here by using a magic \"blacklist\" value\n     * instead of 0 in the static device id table\n     */\n    if (!id->driver_info) {\n        dev_dbg(&intf->dev, \"setting defaults for dynamic device id\\n\");\n        id->driver_info = (unsigned long)&qmi_wwan_info;\n    }\n\n    if (intf->cur_altsetting->desc.bInterfaceClass != 0xff) {\n        dev_info(&intf->dev,  \"Fibocom module not qmi_wwan mode!\\n\");\n        return -ENODEV;\n    }\n\n    return usbnet_probe(intf, id);\n}\n\n#if defined(FIBOCOM_WWAN_QMAP)\nstatic int qmap_qmi_wwan_probe(struct usb_interface *intf,\n              const struct usb_device_id *prod)\n{\n    int status = qmi_wwan_probe(intf, prod);\n\n    if (!status) {\n        struct usbnet *dev = usb_get_intfdata(intf);\n        struct qmi_wwan_state *info = (void *)&dev->data;\n        sQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n        unsigned i;\n\n        if (!pQmapDev)\n            return status;\n\n        tasklet_init(&pQmapDev->txq, rmnet_usb_tx_wake_queue, (unsigned long)pQmapDev);\n\n        if (pQmapDev->qmap_mode == 1) {\n            pQmapDev->mpQmapNetDev[0] = dev->net;\n            if (pQmapDev->use_rmnet_usb) {\n                pQmapDev->mpQmapNetDev[0] = NULL;\n                qmap_register_device(pQmapDev, 0);\n            }\n        }\n        else if (pQmapDev->qmap_mode > 1) {\n            for (i = 0; i < pQmapDev->qmap_mode; i++) {\n                qmap_register_device(pQmapDev, i);\n            }\n        }\n\n        if (pQmapDev->use_rmnet_usb) {\n            rtnl_lock();\n            /* when open hyfi function, run cm will make system crash */\n            //netdev_rx_handler_register(dev->net, rmnet_usb_rx_handler, dev);\n            netdev_rx_handler_register(dev->net, rmnet_usb_rx_handler, NULL);\n            rtnl_unlock();\n        }\n\n        if (pQmapDev->link_state == 0) {\n            netif_carrier_off(dev->net);\n        }\n    }\n\n    return status;\n}\n\nstatic void qmap_qmi_wwan_disconnect(struct usb_interface *intf)\n{\n    struct usbnet *dev = usb_get_intfdata(intf);\n    struct qmi_wwan_state *info;\n    sQmiWwanQmap *pQmapDev;\n    uint i;\n\n    if (!dev)\n        return;\n\n    info = (void *)&dev->data;\n    pQmapDev = (sQmiWwanQmap *)info->unused;\n\n    if (!pQmapDev) {\n        return usbnet_disconnect(intf);\n    }\n\n    pQmapDev->link_state = 0;\n\n    if (pQmapDev->qmap_mode > 1) {\n        for (i = 0; i < pQmapDev->qmap_mode; i++) {\n            qmap_unregister_device(pQmapDev, i);\n        }\n    }\n\n    if (pQmapDev->use_rmnet_usb) {\n        qmap_unregister_device(pQmapDev, 0);\n        rtnl_lock();\n        netdev_rx_handler_unregister(dev->net);\n        rtnl_unlock();\n    }\n\n    tasklet_kill(&pQmapDev->txq);\n\n    usbnet_disconnect(intf);\n    info->unused = 0;\n    kfree(pQmapDev);\n}\n#endif\n\nstatic struct usb_driver qmi_wwan_driver = {\n    .name              = \"qmi_wwan_f\",\n    .id_table          = products,\n    .probe              = qmi_wwan_probe,\n#if defined(FIBOCOM_WWAN_QMAP)\n    .probe              = qmap_qmi_wwan_probe,\n    .disconnect          = qmap_qmi_wwan_disconnect,\n#else\n    .probe              = qmi_wwan_probe,\n    .disconnect          = usbnet_disconnect,\n#endif\n    .suspend          = qmi_wwan_suspend,\n    .resume              =    qmi_wwan_resume,\n    .reset_resume         = qmi_wwan_reset_resume,\n    .supports_autosuspend = 1,\n    .disable_hub_initiated_lpm = 1,\n};\n\n#ifdef CONFIG_QCA_NSS_DRV\n/*\n    EXTRA_CFLAGS=\"-I$(STAGING_DIR)/usr/include/qca-nss-drv  $(EXTRA_CFLAGS)\"\n    qsdk/qca/src/data-kernel/drivers/rmnet-nss/rmnet_nss.c\n*/\n#include \"rmnet_nss.c\"\n#endif\n\nstatic int __init qmi_wwan_driver_init(void)\n{\n    RCU_INIT_POINTER(rmnet_nss_callbacks, NULL);\n#ifdef CONFIG_QCA_NSS_DRV\n    if (qca_nss_enabled)\n        rmnet_nss_init();\n#endif\n    return usb_register(&qmi_wwan_driver);\n}\nmodule_init(qmi_wwan_driver_init);\nstatic void __exit qmi_wwan_driver_exit(void)\n{\n#ifdef CONFIG_QCA_NSS_DRV\n    if (qca_nss_enabled)\n        rmnet_nss_exit();\n#endif\n    usb_deregister(&qmi_wwan_driver);\n}\nmodule_exit(qmi_wwan_driver_exit);\n\nMODULE_AUTHOR(\"Bjørn Mork <bjorn@mork.no>\");\nMODULE_DESCRIPTION(\"Qualcomm MSM Interface (QMI) WWAN driver\");\nMODULE_LICENSE(\"GPL\");\nMODULE_VERSION(FIBOCOM_WWAN_VERSION);\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/Makefile",
    "content": "#\n# Copyright (C) 2015 OpenWrt.org\n#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=pcie_mhi\nPKG_VERSION:=1.3.8\nPKG_RELEASE:=3\n\ninclude $(INCLUDE_DIR)/kernel.mk\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine KernelPackage/pcie_mhi\n  SUBMENU:=WWAN Support\n  TITLE:=Kernel pcie driver for MHI device\n  FILES:=$(PKG_BUILD_DIR)/pcie_mhi.ko\n# AUTOLOAD:=$(call AutoLoad,90,pcie_mhi)\nendef\n\ndefine KernelPackage/pcie_mhi/description\n  Kernel module for register a custom pciemhi platform device.\nendef\n\nEXTRA_CFLAGS+= \\\n\t-Wno-unused-function \\\n\t-Wno-unused-variable \\\n\t-Wno-missing-prototypes \\\n\t-Wno-missing-declarations\n\nMAKE_OPTS:= \\\n\tARCH=\"$(LINUX_KARCH)\" \\\n\tCROSS_COMPILE=\"$(TARGET_CROSS)\" \\\n\tCXXFLAGS=\"$(TARGET_CXXFLAGS)\" \\\n\tM=\"$(PKG_BUILD_DIR)\" \\\n\tEXTRA_CFLAGS=\"$(EXTRA_CFLAGS)\" \\\n\t$(EXTRA_KCONFIG)\n\ndefine Build/Prepare\n\tmkdir -p $(PKG_BUILD_DIR)\n\t$(CP) ./src/* $(PKG_BUILD_DIR)/\nendef\n\ndefine Build/Compile\n\t$(MAKE) -C \"$(LINUX_DIR)\" \\\n\t\t$(MAKE_OPTS) \\\n\t\tmodules\nendef\n\ndefine KernelPackage/pcie_mhi/install\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_BIN) ./files/pcie_mhi $(1)/etc/init.d/pcie_mhi\nendef\n\n$(eval $(call KernelPackage,pcie_mhi))\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/files/pcie_mhi",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=70\n\nstart() {\n\t/sbin/modprobe -q pcie_mhi\n}\n\nstop() {\n\t[ -d \"/sys/module/pcie_mhi\" ] && /sbin/rmmod pcie_mhi\n}\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/Makefile",
    "content": "#ccflags-y += -g\nobj-m += pcie_mhi.o\npcie_mhi-objs := core/mhi_init.o core/mhi_main.o core/mhi_pm.o core/mhi_boot.o core/mhi_dtr.o  controllers/mhi_qti.o\npcie_mhi-objs += devices/mhi_uci.o\n\nifeq (1,1)\npcie_mhi-objs += devices/mhi_netdev_quectel.o\nelse\npcie_mhi-objs += devices/mhi_netdev.o\npcie_mhi-objs += devices/rmnet_handler.o\nendif\n\nPWD := $(shell pwd)\nifeq ($(ARCH),)\nARCH := $(shell uname -m)\nendif\nifeq ($(CROSS_COMPILE),)\nCROSS_COMPILE :=\nendif\nifeq ($(KDIR),)\nKDIR := /lib/modules/$(shell uname -r)/build\nendif\n\npcie_mhi: clean\n\t$(MAKE) ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} -C $(KDIR) M=$(PWD) modules\n\t#cp pcie_mhi.ko /tftpboot/\n\nclean:\n\t$(MAKE) ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} -C $(KDIR) M=$(PWD) clean\n\tfind . -name *.o.ur-safe | xargs rm -f\n\ninstall: pcie_mhi\n\tsudo cp pcie_mhi.ko /lib/modules/${shell uname -r}/kernel/drivers/pci/\n\tsudo depmod\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/README",
    "content": "1. porting pcie_mhi driver as next\r\n\r\n$ git diff drivers/Makefile\r\ndiff --git a/drivers/Makefile b/drivers/Makefile\r\nindex 77fbc52..e45837e 100644\r\n--- a/drivers/Makefile\r\n+++ b/drivers/Makefile\r\n@@ -184,3 +184,4 @@ obj-$(CONFIG_FPGA)          += fpga/\r\n obj-$(CONFIG_FSI)              += fsi/\r\n obj-$(CONFIG_TEE)              += tee/\r\n obj-$(CONFIG_MULTIPLEXER)      += mux/\r\n+obj-y          += pcie_mhi/\r\n\r\n$ tree drivers/pcie_mhi/ -L 1\r\ndrivers/pcie_mhi/\r\n controllers\r\n core\r\n devices\r\n Makefile\r\n\r\n2. check RG500 attach pcie_mhi driver successful \r\n \r\nroot@OpenWrt:/# lspci\r\n00:00.0 Class 0604: 17cb:0302\r\n01:00.0 Class ff00: 17cb:0306\r\n\r\nroot@OpenWrt:~# dmesg | grep mhi\r\n[  138.483252] mhi_init Quectel_Linux_PCIE_MHI_Driver_V1.3.0.6\r\n[  138.492350] mhi_pci_probe pci_dev->name = 0000:01:00.0, domain=0, bus=1, slot=0, vendor=17CB, device=0306\r\n\r\n3. how to use, see next logs\r\n\r\nlog/QXDM_OVER_PCIE.txt\r\nlog/AT_OVER_PCIE.txt\r\nlog/MBIM_OVER_PCIE.txt\r\nlog/QMI_OVER_PCIE.txt\r\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/ReleaseNote.txt",
    "content": "Release Notes\r\n\r\n[V1.3.4]\r\nDate:   12/8/2022\r\nenhancement:\r\n  1. only allow to enable autosuspend when module is in MHI_EE_AMSS\r\n  2. show pcie link speed and width when driver probe\r\n  3. check pcie link status by read pcie vid and pid when driver probe,\r\n     if pcie link is down, return -EIO\r\n  4. support RM520 (1eac:1004)\r\n  5. support qmap command packet\r\nfix:\r\n  1. fix tx queue is wrong stop when do uplink TPUT\r\n  2. fix after QFirehose, module fail to bootup at very small probability\r\n  3. mhi uci add mutex lock for concurrent reads/writes\r\n\r\n[V1.3.3]\r\nDate:   30/6/2022\r\nenhancement:\r\n  1. remove one un-necessary kmalloc when do qfirehose\r\n  2. support mhi monitor (like usbmon), usage: cat /sys/kernel/debug/mhi_q/0306_00\\:01.00/mhimon\r\n  3. set ring size of event 0 to 256 (from 1024), required by x6x\r\n  4. support PCIE local network card mhi_swip0 (chan 46/47), default disabled\r\n  5. porting IPQ5018 mhi rate controll code from spf11.5 \r\n  6. set pcie rmnet download max qmap packet size to 15KB (same to IPQ MHI Driver)\r\n  7. support set different mac address for rmnet net card\r\n  8. when mhi netdev fail to malloc, use delay_work instead work\r\n  9. optimize code for 'when driver load, modem is still in MHI_EE_PTHRU' \r\nfix:\r\n 1. Fix not synchronize access rp/wp when mhi_queue_xxx and mhi_process_xxx_ring run on different CPU\r\n 2. set dma mask when driver probe, some SOC like rpi_4 need it\r\n\r\n[V1.3.2]\r\nDate:   12/16/2021\r\nenhancement:\r\n  1. support Linux Kernel V5.14\r\n  2. mhi_netdev_quectel.c do not print log in softirq context\r\n\r\n[V1.3.1]\r\nDate:   9/26/2021\r\nenhancement:\r\nfix:\r\n\r\n[V1.3.0.19]\r\nDate:   9/18/2021\r\nenhancement:\r\n  1. support sdx62 (17cb:0308)\r\n\t2. support IPQ5018's NSS\r\n\t3. use 'qsdk/qca/src/data-kernel/drivers/rmnet-nss/rmnet_nss.c' instead myself rmnet_nss.c\r\n\t   and pcie_mhi.ko must load after then rmnet_nss.ko\r\n\t4. allow bhi irq is not 0 (for ipq5018)\r\nfix:\r\n\r\n[V1.3.0.18]\r\nDate:   4/14/2021\r\nenhancement:\r\n  1. support mbim multiple call, usage:\r\n     # insmod pcie_mhi.ko mhi_mbim_enabeld=1 qmap_mode=4\r\n     # quectel-mbim-proxy -d /dev/mhi_MBIM &\r\n     # quectel-CM -n X\r\nfix:\r\n\r\n[V1.3.0.17]\r\nDate:   3/11/2021\r\nenhancement:\r\nfix:\r\n  1. fix CPU loading very high when TPUT test when only one MSI interrupt\r\n  2. fix error on latest X24 modem\r\n\r\n[V1.3.0.16]\r\nDate:   11/18/2020\r\nenhancement:\r\nfix:\r\n  1. add ring size to 32, for in-bound chan, if one ring is full, modem will not generate MSI interrupt for all chan\r\n \r\n[V1.3.0.15]\r\nDate:   10/30/2020\r\nenhancement:\r\n\t1. support multi-modems, named as /dev/mhi_<chan_name>X\r\nfix:\r\n  1. fix compile error on kernel v5.8\r\n \r\n[V1.3.0.14]\r\nDate:   10/9/2020\r\nenhancement:\r\n  1. suppport EM120&EM160\r\nfix:\r\n  1. fix compile error on kernel v5.6\r\n  2. support runtime suspend\r\n\r\n[V1.3.0.13]\r\nDate:   9/7/2020 \r\nenhancement:\r\n  1. suppport EM120&EM160\r\nfix:\r\n  1. fix error on X55 + PCIE2.0(e.g IPQ4019)\r\n  2. support runtime suspend\r\n\r\n[V1.3.0.12]\r\nDate:   7/7/2020 \r\nenhancement:\r\n  1. suppport create only none netcard (enabled by marco MHI_NETDEV_ONE_CARD_MODE),\r\nfix:"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/controllers/Kconfig",
    "content": "menu \"MHI controllers\"\n\nconfig MHI_QTI\n       tristate \"MHI QTI\"\n       depends on MHI_BUS\n       help\n\t  If you say yes to this option, MHI bus support for QTI modem chipsets\n\t  will be enabled. QTI PCIe based modems uses MHI as the communication\n\t  protocol. MHI control driver is the bus master for such modems. As the\n\t  bus master driver, it oversees power management operations such as\n\t  suspend, resume, powering on and off the device.\n\nendmenu\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/controllers/Makefile",
    "content": "obj-$(CONFIG_MHI_QTI) += mhi_qti.o mhi_arch_qti.o\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/controllers/mhi_arch_qti.c",
    "content": "// SPDX-License-Identifier: GPL-2.0-only\n/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.*/\n\n#include <linux/async.h>\n#include <linux/debugfs.h>\n#include <linux/device.h>\n#include <linux/dma-direction.h>\n#include <linux/list.h>\n#include <linux/of.h>\n#include <linux/memblock.h>\n#include <linux/module.h>\n#include <linux/msm-bus.h>\n#include <linux/msm_pcie.h>\n#include <linux/pm_runtime.h>\n#include <linux/slab.h>\n#include \"../core/mhi.h\"\n#include \"mhi_qti.h\"\n\nstruct arch_info {\n\tstruct mhi_dev *mhi_dev;\n\tstruct msm_bus_scale_pdata *msm_bus_pdata;\n\tu32 bus_client;\n\tstruct pci_saved_state *pcie_state;\n\tstruct pci_saved_state *ref_pcie_state;\n\tstruct dma_iommu_mapping *mapping;\n};\n\nstruct mhi_bl_info {\n\tstruct mhi_device *mhi_device;\n\tasync_cookie_t cookie;\n\tvoid *ipc_log;\n};\n\n/* ipc log markings */\n#define DLOG \"Dev->Host: \"\n#define HLOG \"Host: \"\n\n#ifdef CONFIG_MHI_DEBUG\n\n#define MHI_IPC_LOG_PAGES (100)\nenum MHI_DEBUG_LEVEL  mhi_ipc_log_lvl = MHI_MSG_LVL_VERBOSE;\n\n#else\n\n#define MHI_IPC_LOG_PAGES (10)\nenum MHI_DEBUG_LEVEL  mhi_ipc_log_lvl = MHI_MSG_LVL_ERROR;\n\n#endif\n\nstatic int mhi_arch_set_bus_request(struct mhi_controller *mhi_cntrl, int index)\n{\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\tstruct arch_info *arch_info = mhi_dev->arch_info;\n\n\tMHI_LOG(\"Setting bus request to index %d\\n\", index);\n\n\tif (arch_info->bus_client)\n\t\treturn msm_bus_scale_client_update_request(\n\t\t\t\t\t\t\tarch_info->bus_client,\n\t\t\t\t\t\t\tindex);\n\n\t/* default return success */\n\treturn 0;\n}\n\nstatic void mhi_bl_dl_cb(struct mhi_device *mhi_dev,\n\t\t\t struct mhi_result *mhi_result)\n{\n\tstruct mhi_bl_info *mhi_bl_info = mhi_device_get_devdata(mhi_dev);\n\tchar *buf = mhi_result->buf_addr;\n\n\t/* force a null at last character */\n\tbuf[mhi_result->bytes_xferd - 1] = 0;\n\n\tipc_log_string(mhi_bl_info->ipc_log, \"%s %s\", DLOG, buf);\n}\n\nstatic void mhi_bl_dummy_cb(struct mhi_device *mhi_dev,\n\t\t\t    struct mhi_result *mhi_result)\n{\n}\n\nstatic void mhi_bl_remove(struct mhi_device *mhi_dev)\n{\n\tstruct mhi_bl_info *mhi_bl_info = mhi_device_get_devdata(mhi_dev);\n\n\tipc_log_string(mhi_bl_info->ipc_log, HLOG \"Received Remove notif.\\n\");\n\n\t/* wait for boot monitor to exit */\n\tasync_synchronize_cookie(mhi_bl_info->cookie + 1);\n}\n\nstatic void mhi_bl_boot_monitor(void *data, async_cookie_t cookie)\n{\n\tstruct mhi_bl_info *mhi_bl_info = data;\n\tstruct mhi_device *mhi_device = mhi_bl_info->mhi_device;\n\tstruct mhi_controller *mhi_cntrl = mhi_device->mhi_cntrl;\n\t/* 15 sec timeout for booting device */\n\tconst u32 timeout = msecs_to_jiffies(15000);\n\n\t/* wait for device to enter boot stage */\n\twait_event_timeout(mhi_cntrl->state_event, mhi_cntrl->ee == MHI_EE_AMSS\n\t\t\t   || mhi_cntrl->ee == MHI_EE_DISABLE_TRANSITION,\n\t\t\t   timeout);\n\n\tif (mhi_cntrl->ee == MHI_EE_AMSS) {\n\t\tipc_log_string(mhi_bl_info->ipc_log, HLOG\n\t\t\t       \"Device successfully booted to mission mode\\n\");\n\n\t\tmhi_unprepare_from_transfer(mhi_device);\n\t} else {\n\t\tipc_log_string(mhi_bl_info->ipc_log, HLOG\n\t\t\t       \"Device failed to boot to mission mode, ee = %s\\n\",\n\t\t\t       TO_MHI_EXEC_STR(mhi_cntrl->ee));\n\t}\n}\n\nstatic int mhi_bl_probe(struct mhi_device *mhi_dev,\n\t\t\tconst struct mhi_device_id *id)\n{\n\tchar node_name[32];\n\tstruct mhi_bl_info *mhi_bl_info;\n\n\tmhi_bl_info = devm_kzalloc(&mhi_dev->dev, sizeof(*mhi_bl_info),\n\t\t\t\t   GFP_KERNEL);\n\tif (!mhi_bl_info)\n\t\treturn -ENOMEM;\n\n\tsnprintf(node_name, sizeof(node_name), \"mhi_bl_%04x_%02u.%02u.%02u\",\n\t\t mhi_dev->dev_id, mhi_dev->domain, mhi_dev->bus, mhi_dev->slot);\n\n\tmhi_bl_info->ipc_log = ipc_log_context_create(MHI_IPC_LOG_PAGES,\n\t\t\t\t\t\t      node_name, 0);\n\tif (!mhi_bl_info->ipc_log)\n\t\treturn -EINVAL;\n\n\tmhi_bl_info->mhi_device = mhi_dev;\n\tmhi_device_set_devdata(mhi_dev, mhi_bl_info);\n\n\tipc_log_string(mhi_bl_info->ipc_log, HLOG\n\t\t       \"Entered SBL, Session ID:0x%x\\n\",\n\t\t       mhi_dev->mhi_cntrl->session_id);\n\n\t/* start a thread to monitor entering mission mode */\n\tmhi_bl_info->cookie = async_schedule(mhi_bl_boot_monitor, mhi_bl_info);\n\n\treturn 0;\n}\n\nstatic const struct mhi_device_id mhi_bl_match_table[] = {\n\t{ .chan = \"BL\" },\n\t{},\n};\n\nstatic struct mhi_driver mhi_bl_driver = {\n\t.id_table = mhi_bl_match_table,\n\t.remove = mhi_bl_remove,\n\t.probe = mhi_bl_probe,\n\t.ul_xfer_cb = mhi_bl_dummy_cb,\n\t.dl_xfer_cb = mhi_bl_dl_cb,\n\t.driver = {\n\t\t.name = \"MHI_BL\",\n\t\t.owner = THIS_MODULE,\n\t},\n};\n\nint mhi_arch_pcie_init(struct mhi_controller *mhi_cntrl)\n{\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\tstruct arch_info *arch_info = mhi_dev->arch_info;\n\tchar node[32];\n\n\tif (!arch_info) {\n\t\tarch_info = devm_kzalloc(&mhi_dev->pci_dev->dev,\n\t\t\t\t\t sizeof(*arch_info), GFP_KERNEL);\n\t\tif (!arch_info)\n\t\t\treturn -ENOMEM;\n\n\t\tmhi_dev->arch_info = arch_info;\n\n\t\tsnprintf(node, sizeof(node), \"mhi_%04x_%02u.%02u.%02u\",\n\t\t\t mhi_cntrl->dev_id, mhi_cntrl->domain, mhi_cntrl->bus,\n\t\t\t mhi_cntrl->slot);\n\t\tmhi_cntrl->log_buf = ipc_log_context_create(MHI_IPC_LOG_PAGES,\n\t\t\t\t\t\t\t    node, 0);\n\t\tmhi_cntrl->log_lvl = mhi_ipc_log_lvl;\n\n\t\t/* save reference state for pcie config space */\n\t\tarch_info->ref_pcie_state = pci_store_saved_state(\n\t\t\t\t\t\t\tmhi_dev->pci_dev);\n\n\t\tmhi_driver_register(&mhi_bl_driver);\n\t}\n\n\treturn mhi_arch_set_bus_request(mhi_cntrl, 1);\n}\n\nvoid mhi_arch_pcie_deinit(struct mhi_controller *mhi_cntrl)\n{\n\tmhi_arch_set_bus_request(mhi_cntrl, 0);\n}\n\nint mhi_arch_link_off(struct mhi_controller *mhi_cntrl, bool graceful)\n{\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\tstruct arch_info *arch_info = mhi_dev->arch_info;\n\tstruct pci_dev *pci_dev = mhi_dev->pci_dev;\n\tint ret;\n\n\tMHI_LOG(\"Entered\\n\");\n\n\tif (graceful) {\n\t\tpci_clear_master(pci_dev);\n\t\tret = pci_save_state(mhi_dev->pci_dev);\n\t\tif (ret) {\n\t\t\tMHI_ERR(\"Failed with pci_save_state, ret:%d\\n\", ret);\n\t\t\treturn ret;\n\t\t}\n\n\t\tarch_info->pcie_state = pci_store_saved_state(pci_dev);\n\t\tpci_disable_device(pci_dev);\n\t}\n\n\t/*\n\t * We will always attempt to put link into D3hot, however\n\t * link down may have happened due to error fatal, so\n\t * ignoring the return code\n\t */\n\tpci_set_power_state(pci_dev, PCI_D3hot);\n\n\t/* release the resources */\n\tmhi_arch_set_bus_request(mhi_cntrl, 0);\n\n\tMHI_LOG(\"Exited\\n\");\n\n\treturn 0;\n}\n\nint mhi_arch_link_on(struct mhi_controller *mhi_cntrl)\n{\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\tstruct arch_info *arch_info = mhi_dev->arch_info;\n\tstruct pci_dev *pci_dev = mhi_dev->pci_dev;\n\tint ret;\n\n\tMHI_LOG(\"Entered\\n\");\n\n\t/* request resources and establish link trainning */\n\tret = mhi_arch_set_bus_request(mhi_cntrl, 1);\n\tif (ret)\n\t\tMHI_LOG(\"Could not set bus frequency, ret:%d\\n\", ret);\n\n\tret = pci_set_power_state(pci_dev, PCI_D0);\n\tif (ret) {\n\t\tMHI_ERR(\"Failed to set PCI_D0 state, ret:%d\\n\", ret);\n\t\treturn ret;\n\t}\n\n\tret = pci_enable_device(pci_dev);\n\tif (ret) {\n\t\tMHI_ERR(\"Failed to enable device, ret:%d\\n\", ret);\n\t\treturn ret;\n\t}\n\n\tret = pci_load_and_free_saved_state(pci_dev, &arch_info->pcie_state);\n\tif (ret)\n\t\tMHI_LOG(\"Failed to load saved cfg state\\n\");\n\n\tpci_restore_state(pci_dev);\n\tpci_set_master(pci_dev);\n\n\tMHI_LOG(\"Exited\\n\");\n\n\treturn 0;\n}\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/controllers/mhi_qcom.c",
    "content": "/* Copyright (c) 2018, The Linux Foundation. All rights reserved.\r\n *\r\n * This program is free software; you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License version 2 and\r\n * only version 2 as published by the Free Software Foundation.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\n * GNU General Public License for more details.\r\n */\r\n\r\n#include <linux/debugfs.h>\r\n#include <linux/device.h>\r\n#include <linux/dma-direction.h>\r\n#include <linux/list.h>\r\n#include <linux/of.h>\r\n#include <linux/memblock.h>\r\n#include <linux/module.h>\r\n#include <linux/pci.h>\r\n#include <linux/pm_runtime.h>\r\n#include <linux/platform_device.h>\r\n#include <linux/slab.h>\r\n#include <linux/uaccess.h>\r\n#include <linux/interrupt.h>\r\n#include <linux/version.h>\r\n#include \"../core/mhi.h\"\r\n#include \"mhi_qcom.h\"\r\n\r\n#if 1\r\n#ifndef PCI_IRQ_MSI\r\n#define PCI_IRQ_MSI\t\t(1 << 1) /* Allow MSI interrupts */\r\n\r\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 3,10,53 ))\r\nint pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec)\r\n{\r\n\tint nvec = maxvec;\r\n\tint rc;\r\n\r\n\tif (maxvec < minvec)\r\n\t\treturn -ERANGE;\r\n\r\n\tdo {\r\n\t\trc = pci_enable_msi_block(dev, nvec);\r\n\t\tif (rc < 0) {\r\n\t\t\treturn rc;\r\n\t\t} else if (rc > 0) {\r\n\t\t\tif (rc < minvec)\r\n\t\t\t\treturn -ENOSPC;\r\n\t\t\tnvec = rc;\r\n\t\t}\r\n\t} while (rc);\r\n\r\n\treturn nvec;\r\n}\r\n#endif\r\n\r\nstatic int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,\r\n\t\t      unsigned int max_vecs, unsigned int flags)\r\n{\r\n\treturn pci_enable_msi_range(dev, min_vecs, max_vecs);\r\n}\r\n\r\nstatic void pci_free_irq_vectors(struct pci_dev *dev)\r\n{\r\n\tpci_disable_msi(dev);\r\n}\r\n\r\nstatic int pci_irq_vector(struct pci_dev *dev, unsigned int nr)\r\n{\r\n    return dev->irq + nr;\r\n}\r\n#endif\n#endif\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 0, 0)\n#define MHI_PCI_REQUEST_REGION(pdev, bar, name) pci_request_regions((pdev), (name))\n#define MHI_PCI_RELEASE_REGION(pdev, bar) pci_release_regions((pdev))\n#else\n#define MHI_PCI_REQUEST_REGION(pdev, bar, name) pci_request_region((pdev), (bar), (name))\n#define MHI_PCI_RELEASE_REGION(pdev, bar) pci_release_region((pdev), (bar))\n#endif\n\r\nstatic struct pci_device_id mhi_pcie_device_id[] = {\r\n\t{PCI_DEVICE(MHI_PCIE_VENDOR_ID, 0x0303)}, //SDX20\r\n\t{PCI_DEVICE(MHI_PCIE_VENDOR_ID, 0x0304)}, //SDX24\r\n\t{PCI_DEVICE(MHI_PCIE_VENDOR_ID, 0x0305)},\r\n\t{PCI_DEVICE(MHI_PCIE_VENDOR_ID, 0x0306)}, //SDX55\r\n\t{PCI_DEVICE(0x2C7C, 0x0512)},\r\n\t{PCI_DEVICE(MHI_PCIE_VENDOR_ID, MHI_PCIE_DEBUG_ID)},\r\n\t{0},\r\n};\r\n\r\nMODULE_DEVICE_TABLE(pci, mhi_pcie_device_id);\r\n\r\nstatic struct pci_driver mhi_pcie_driver;\r\n\r\nvoid mhi_deinit_pci_dev(struct mhi_controller *mhi_cntrl)\r\n{\r\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\r\n\tstruct pci_dev *pci_dev = mhi_dev->pci_dev;\r\n\r\n\tpci_free_irq_vectors(pci_dev);\r\n\tiounmap(mhi_cntrl->regs);\r\n\tmhi_cntrl->regs = NULL;\r\n\tpci_clear_master(pci_dev);\r\n\tMHI_PCI_RELEASE_REGION(pci_dev, mhi_dev->resn);\n\tpci_disable_device(pci_dev);\r\n}\r\n\r\nstatic int mhi_init_pci_dev(struct mhi_controller *mhi_cntrl)\r\n{\r\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\r\n\tstruct pci_dev *pci_dev = mhi_dev->pci_dev;\r\n\tint ret;\r\n\tresource_size_t start, len;\r\n\tint i;\r\n\r\n\tmhi_dev->resn = MHI_PCI_BAR_NUM;\r\n\tret = pci_assign_resource(pci_dev, mhi_dev->resn);\r\n\tif (ret) {\r\n\t\tMHI_ERR(\"Error assign pci resources, ret:%d\\n\", ret);\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tret = pci_enable_device(pci_dev);\r\n\tif (ret) {\r\n\t\tMHI_ERR(\"Error enabling device, ret:%d\\n\", ret);\r\n\t\tgoto error_enable_device;\r\n\t}\r\n\r\n\tret = MHI_PCI_REQUEST_REGION(pci_dev, mhi_dev->resn, \"mhi\");\n\tif (ret) {\n\t\tMHI_ERR(\"Error requesting PCI regions, ret:%d\\n\", ret);\n\t\tgoto error_request_region;\n\t}\n\r\n\tpci_set_master(pci_dev);\r\n\r\n\tstart = pci_resource_start(pci_dev, mhi_dev->resn);\r\n\tlen = pci_resource_len(pci_dev, mhi_dev->resn);\r\n\tmhi_cntrl->regs = ioremap_nocache(start, len);\r\n\tMHI_LOG(\"mhi_cntrl->regs = %p\\n\", mhi_cntrl->regs);\r\n\tif (!mhi_cntrl->regs) {\r\n\t\tMHI_ERR(\"Error ioremap region\\n\");\r\n\t\tgoto error_ioremap;\r\n\t}\r\n\r\n\tret = pci_alloc_irq_vectors(pci_dev, 1, mhi_cntrl->msi_required, PCI_IRQ_MSI);\r\n\tif (IS_ERR_VALUE((ulong)ret) || ret < mhi_cntrl->msi_required) {\r\n\t\tif (ret == -ENOSPC) {\r\n\t\t\t/* imx_3.14.52_1.1.0_ga\r\n\t\t\tdiff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c\r\n\t\t\tindex f06e8f0..6a9614f 100644\r\n\t\t\t--- a/drivers/pci/host/pcie-designware.c\r\n\t\t\t+++ b/drivers/pci/host/pcie-designware.c\r\n\t\t\t@@ -376,6 +376,13 @@ static int dw_msi_setup_irq(struct msi_chip *chip, struct pci_dev *pdev,\r\n\t\t\t\tif (msgvec > 5)\r\n\t\t\t\t\tmsgvec = 0;\r\n\r\n\t\t\t+#if 1 //Add by Quectel 20190419\r\n\t\t\t+       if (msgvec > 0 && pdev->vendor == 0x17cb) {\r\n\t\t\t+               dev_info(&pdev->dev, \"%s quectel fixup pos=%d, msg_ctr=%04x, msgvec=%d\\n\",  __func__, desc->msi_attrib.pos, msg_ctr, msgvec);\r\n\t\t\t+               msgvec = 0;\r\n\t\t\t+       }\r\n\t\t\t+#endif\r\n\t\t\t+\r\n\t\t\t\tirq = assign_irq((1 << msgvec), desc, &pos);\r\n\t\t\t\tif (irq < 0)\r\n\t\t\t\t\treturn irq;\r\n\t\t\t*/\r\n\t\t}\r\n\t\t//imx_4.1.15_2.0.0_ga & DELL_OPTIPLEX_7010 only alloc one msi interrupt for one pcie device\r\n\t\tif (ret != 1) {\r\n\t\t\tMHI_ERR(\"Failed to enable MSI, ret=%d, msi_required=%d\\n\", ret, mhi_cntrl->msi_required);\r\n\t\t\tgoto error_req_msi;\r\n\t\t}\r\n\t}\r\n\r\n\tmhi_cntrl->msi_allocated = ret;\r\n\tMHI_LOG(\"msi_required = %d, msi_allocated = %d, msi_irq = %u\\n\", mhi_cntrl->msi_required, mhi_cntrl->msi_allocated, pci_dev->irq);\r\n\r\n\tfor (i = 0; i < mhi_cntrl->msi_allocated; i++) {\r\n\t\tmhi_cntrl->irq[i] = pci_irq_vector(pci_dev, i);\r\n\t\tif (mhi_cntrl->irq[i] < 0) {\r\n\t\t\tret = mhi_cntrl->irq[i];\r\n\t\t\tgoto error_get_irq_vec;\r\n\t\t}\r\n\t}\r\n\r\n#if 0\r\n\t/* configure runtime pm */\r\n\tpm_runtime_set_autosuspend_delay(&pci_dev->dev, MHI_RPM_SUSPEND_TMR_MS);\r\n\tpm_runtime_dont_use_autosuspend(&pci_dev->dev);\r\n\tpm_suspend_ignore_children(&pci_dev->dev, true);\r\n\r\n\t/*\r\n\t * pci framework will increment usage count (twice) before\r\n\t * calling local device driver probe function.\r\n\t * 1st pci.c pci_pm_init() calls pm_runtime_forbid\r\n\t * 2nd pci-driver.c local_pci_probe calls pm_runtime_get_sync\r\n\t * Framework expect pci device driver to call\r\n\t * pm_runtime_put_noidle to decrement usage count after\r\n\t * successful probe and and call pm_runtime_allow to enable\r\n\t * runtime suspend.\r\n\t */\r\n\tpm_runtime_mark_last_busy(&pci_dev->dev);\r\n\tpm_runtime_put_noidle(&pci_dev->dev);\r\n#endif\r\n\r\n\treturn 0;\r\n\r\nerror_get_irq_vec:\r\n\tpci_free_irq_vectors(pci_dev);\r\n\r\nerror_req_msi:\r\n\tiounmap(mhi_cntrl->regs);\r\n\r\nerror_ioremap:\r\n\tpci_clear_master(pci_dev);\r\n\r\nerror_request_region:\r\n\tpci_disable_device(pci_dev);\r\n\r\nerror_enable_device:\n\tMHI_PCI_RELEASE_REGION(pci_dev, mhi_dev->resn);\n\n\treturn ret;\n}\n\r\n#ifdef CONFIG_PM\r\nstatic int mhi_runtime_idle(struct device *dev)\r\n{\r\n\tstruct mhi_controller *mhi_cntrl = dev_get_drvdata(dev);\r\n\r\n\tMHI_LOG(\"Entered returning -EBUSY\\n\");\r\n\r\n\t/*\r\n\t * RPM framework during runtime resume always calls\r\n\t * rpm_idle to see if device ready to suspend.\r\n\t * If dev.power usage_count count is 0, rpm fw will call\r\n\t * rpm_idle cb to see if device is ready to suspend.\r\n\t * if cb return 0, or cb not defined the framework will\r\n\t * assume device driver is ready to suspend;\r\n\t * therefore, fw will schedule runtime suspend.\r\n\t * In MHI power management, MHI host shall go to\r\n\t * runtime suspend only after entering MHI State M2, even if\r\n\t * usage count is 0.  Return -EBUSY to disable automatic suspend.\r\n\t */\r\n\treturn -EBUSY;\r\n}\r\n\r\nstatic int mhi_runtime_suspend(struct device *dev)\r\n{\r\n\tint ret = 0;\r\n\tstruct mhi_controller *mhi_cntrl = dev_get_drvdata(dev);\r\n\r\n\tMHI_LOG(\"Enter\\n\");\r\n\r\n\tmutex_lock(&mhi_cntrl->pm_mutex);\r\n\r\n\tret = mhi_pm_suspend(mhi_cntrl);\r\n\tif (ret) {\r\n\t\tMHI_LOG(\"Abort due to ret:%d\\n\", ret);\r\n\t\tgoto exit_runtime_suspend;\r\n\t}\r\n\r\n\tret = mhi_arch_link_off(mhi_cntrl, true);\r\n\tif (ret)\r\n\t\tMHI_ERR(\"Failed to Turn off link ret:%d\\n\", ret);\r\n\r\nexit_runtime_suspend:\r\n\tmutex_unlock(&mhi_cntrl->pm_mutex);\r\n\tMHI_LOG(\"Exited with ret:%d\\n\", ret);\r\n\r\n\treturn ret;\r\n}\r\n\r\nstatic int mhi_runtime_resume(struct device *dev)\r\n{\r\n\tint ret = 0;\r\n\tstruct mhi_controller *mhi_cntrl = dev_get_drvdata(dev);\r\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\r\n\r\n\tMHI_LOG(\"Enter\\n\");\r\n\r\n\tmutex_lock(&mhi_cntrl->pm_mutex);\r\n\r\n\tif (!mhi_dev->powered_on) {\r\n\t\tMHI_LOG(\"Not fully powered, return success\\n\");\r\n\t\tmutex_unlock(&mhi_cntrl->pm_mutex);\r\n\t\treturn 0;\r\n\t}\r\n\r\n\t/* turn on link */\r\n\tret = mhi_arch_link_on(mhi_cntrl);\r\n\tif (ret)\r\n\t\tgoto rpm_resume_exit;\r\n\r\n\t/* enter M0 state */\r\n\tret = mhi_pm_resume(mhi_cntrl);\r\n\r\nrpm_resume_exit:\r\n\tmutex_unlock(&mhi_cntrl->pm_mutex);\r\n\tMHI_LOG(\"Exited with :%d\\n\", ret);\r\n\r\n\treturn ret;\r\n}\r\n\r\nstatic int mhi_system_resume(struct device *dev)\r\n{\r\n\tint ret = 0;\r\n\tstruct mhi_controller *mhi_cntrl = dev_get_drvdata(dev);\r\n\r\n\tret = mhi_runtime_resume(dev);\r\n\tif (ret) {\r\n\t\tMHI_ERR(\"Failed to resume link\\n\");\r\n\t} else {\r\n\t\tpm_runtime_set_active(dev);\r\n\t\tpm_runtime_enable(dev);\r\n\t}\r\n\r\n\treturn ret;\r\n}\r\n\r\nint mhi_system_suspend(struct device *dev)\r\n{\r\n\tstruct mhi_controller *mhi_cntrl = dev_get_drvdata(dev);\r\n\r\n\tMHI_LOG(\"Entered\\n\");\r\n\r\n\t/* if rpm status still active then force suspend */\r\n\tif (!pm_runtime_status_suspended(dev))\r\n\t\treturn mhi_runtime_suspend(dev);\r\n\r\n\tpm_runtime_set_suspended(dev);\r\n\tpm_runtime_disable(dev);\r\n\r\n\tMHI_LOG(\"Exit\\n\");\r\n\treturn 0;\r\n}\r\n#endif\r\n\r\n/* checks if link is down */\r\nstatic int mhi_link_status(struct mhi_controller *mhi_cntrl, void *priv)\r\n{\r\n\tstruct mhi_dev *mhi_dev = priv;\r\n\tu16 dev_id;\r\n\tint ret;\r\n\r\n\t/* try reading device id, if dev id don't match, link is down */\r\n\tret = pci_read_config_word(mhi_dev->pci_dev, PCI_DEVICE_ID, &dev_id);\r\n\r\n\treturn (ret || dev_id != mhi_cntrl->dev_id) ? -EIO : 0;\r\n}\r\n\r\nstatic int mhi_runtime_get(struct mhi_controller *mhi_cntrl, void *priv)\r\n{\r\n\tstruct mhi_dev *mhi_dev = priv;\r\n\tstruct device *dev = &mhi_dev->pci_dev->dev;\r\n\r\n\treturn pm_runtime_get(dev);\r\n}\r\n\r\nstatic void mhi_runtime_put(struct mhi_controller *mhi_cntrl, void *priv)\r\n{\r\n\tstruct mhi_dev *mhi_dev = priv;\r\n\tstruct device *dev = &mhi_dev->pci_dev->dev;\r\n\r\n\tpm_runtime_put_noidle(dev);\r\n}\r\n\r\nstatic void mhi_status_cb(struct mhi_controller *mhi_cntrl,\r\n\t\t\t  void *priv,\r\n\t\t\t  enum MHI_CB reason)\r\n{\r\n\tstruct mhi_dev *mhi_dev = priv;\r\n\tstruct device *dev = &mhi_dev->pci_dev->dev;\r\n\r\n\tif (reason == MHI_CB_IDLE) {\r\n\t\tMHI_LOG(\"Schedule runtime suspend 1\\n\");\r\n\t\tpm_runtime_mark_last_busy(dev);\r\n\t\tpm_request_autosuspend(dev);\r\n\t}\r\n}\r\n\r\nint mhi_debugfs_trigger_m0(void *data, u64 val)\r\n{\r\n\tstruct mhi_controller *mhi_cntrl = data;\r\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\r\n\r\n\tMHI_LOG(\"Trigger M3 Exit\\n\");\r\n\tpm_runtime_get(&mhi_dev->pci_dev->dev);\r\n\tpm_runtime_put(&mhi_dev->pci_dev->dev);\r\n\r\n\treturn 0;\r\n}\r\n\r\nint mhi_debugfs_trigger_m3(void *data, u64 val)\r\n{\r\n\tstruct mhi_controller *mhi_cntrl = data;\r\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\r\n\r\n\tMHI_LOG(\"Trigger M3 Entry\\n\");\r\n\tpm_runtime_mark_last_busy(&mhi_dev->pci_dev->dev);\r\n\tpm_request_autosuspend(&mhi_dev->pci_dev->dev);\r\n\r\n\treturn 0;\r\n}\r\n\r\nDEFINE_SIMPLE_ATTRIBUTE(debugfs_trigger_m0_fops, NULL,\r\n\t\t\tmhi_debugfs_trigger_m0, \"%llu\\n\");\r\n\r\nDEFINE_SIMPLE_ATTRIBUTE(debugfs_trigger_m3_fops, NULL,\r\n\t\t\tmhi_debugfs_trigger_m3, \"%llu\\n\");\r\n\r\nstatic int mhi_init_debugfs_trigger_go(void *data, u64 val)\r\n{\r\n\tstruct mhi_controller *mhi_cntrl = data;\r\n\r\n\tMHI_LOG(\"Trigger power up sequence\\n\");\r\n\r\n\tmhi_async_power_up(mhi_cntrl);\r\n\r\n\treturn 0;\r\n}\r\nDEFINE_SIMPLE_ATTRIBUTE(mhi_init_debugfs_trigger_go_fops, NULL,\r\n\t\t\tmhi_init_debugfs_trigger_go, \"%llu\\n\");\r\n\r\n\r\nint mhi_init_debugfs_debug_show(struct seq_file *m, void *d)\r\n{\r\n\tseq_puts(m, \"Enable debug mode to debug  external soc\\n\");\r\n\tseq_puts(m,\r\n\t\t \"Usage:  echo 'devid,timeout,domain,smmu_cfg' > debug_mode\\n\");\r\n\tseq_puts(m, \"No spaces between parameters\\n\");\r\n\tseq_puts(m, \"\\t1.  devid : 0 or pci device id to register\\n\");\r\n\tseq_puts(m, \"\\t2.  timeout: mhi cmd/state transition timeout\\n\");\r\n\tseq_puts(m, \"\\t3.  domain: Rootcomplex\\n\");\r\n\tseq_puts(m, \"\\t4.  smmu_cfg: smmu configuration mask:\\n\");\r\n\tseq_puts(m, \"\\t\\t- BIT0: ATTACH\\n\");\r\n\tseq_puts(m, \"\\t\\t- BIT1: S1 BYPASS\\n\");\r\n\tseq_puts(m, \"\\t\\t-BIT2: FAST_MAP\\n\");\r\n\tseq_puts(m, \"\\t\\t-BIT3: ATOMIC\\n\");\r\n\tseq_puts(m, \"\\t\\t-BIT4: FORCE_COHERENT\\n\");\r\n\tseq_puts(m, \"\\t\\t-BIT5: GEOMETRY\\n\");\r\n\tseq_puts(m, \"\\tAll timeout are in ms, enter 0 to keep default\\n\");\r\n\tseq_puts(m, \"Examples inputs: '0x307,10000'\\n\");\r\n\tseq_puts(m, \"\\techo '0,10000,1'\\n\");\r\n\tseq_puts(m, \"\\techo '0x307,10000,0,0x3d'\\n\");\r\n\tseq_puts(m, \"firmware image name will be changed to debug.mbn\\n\");\r\n\r\n\treturn 0;\r\n}\r\n\r\nstatic int mhi_init_debugfs_debug_open(struct inode *node, struct file *file)\r\n{\r\n\treturn single_open(file, mhi_init_debugfs_debug_show, NULL);\r\n}\r\n\r\nstatic ssize_t mhi_init_debugfs_debug_write(struct file *fp,\r\n\t\t\t\t\t    const char __user *ubuf,\r\n\t\t\t\t\t    size_t count,\r\n\t\t\t\t\t    loff_t *pos)\r\n{\r\n\tchar *buf = kmalloc(count + 1, GFP_KERNEL);\r\n\t/* #,devid,timeout,domain,smmu-cfg */\r\n\tint args[5] = {0};\r\n\tstatic char const *dbg_fw = \"debug.mbn\";\r\n\tint ret;\r\n\tstruct mhi_controller *mhi_cntrl = fp->f_inode->i_private;\r\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\r\n\tstruct pci_device_id *id;\r\n\r\n\tif (!buf)\r\n\t\treturn -ENOMEM;\r\n\r\n\tret = copy_from_user(buf, ubuf, count);\r\n\tif (ret)\r\n\t\tgoto error_read;\r\n\tbuf[count] = 0;\r\n\tget_options(buf, ARRAY_SIZE(args), args);\r\n\tkfree(buf);\r\n\r\n\t/* override default parameters */\r\n\tmhi_cntrl->fw_image = dbg_fw;\r\n\tmhi_cntrl->edl_image = dbg_fw;\r\n\r\n\tif (args[0] >= 2 && args[2])\r\n\t\tmhi_cntrl->timeout_ms = args[2];\r\n\r\n\tif (args[0] >= 3 && args[3])\r\n\t\tmhi_cntrl->domain = args[3];\r\n\r\n\tif (args[0] >= 4 && args[4])\r\n\t\tmhi_dev->smmu_cfg = args[4];\r\n\r\n\t/* If it's a new device id register it */\r\n\tif (args[0] && args[1]) {\r\n\t\t/* find the debug_id  and overwrite it */\r\n\t\tfor (id = mhi_pcie_device_id; id->vendor; id++)\r\n\t\t\tif (id->device == MHI_PCIE_DEBUG_ID) {\r\n\t\t\t\tid->device = args[1];\r\n\t\t\t\tpci_unregister_driver(&mhi_pcie_driver);\r\n\t\t\t\tret = pci_register_driver(&mhi_pcie_driver);\r\n\t\t\t}\r\n\t}\r\n\r\n\tmhi_dev->debug_mode = true;\r\n\tdebugfs_create_file(\"go\", 0444, mhi_cntrl->parent, mhi_cntrl,\r\n\t\t\t    &mhi_init_debugfs_trigger_go_fops);\r\n\tpr_info(\r\n\t\t\"%s: ret:%d pcidev:0x%x smm_cfg:%u timeout:%u\\n\",\r\n\t\t__func__, ret, args[1], mhi_dev->smmu_cfg,\r\n\t\tmhi_cntrl->timeout_ms);\r\n\treturn count;\r\n\r\nerror_read:\r\n\tkfree(buf);\r\n\treturn ret;\r\n}\r\n\r\nstatic const struct file_operations debugfs_debug_ops = {\r\n\t.open = mhi_init_debugfs_debug_open,\r\n\t.release = single_release,\r\n\t.read = seq_read,\r\n\t.write = mhi_init_debugfs_debug_write,\r\n};\r\n\r\nstatic struct mhi_controller * mhi_platform_probe(struct pci_dev *pci_dev)\r\n{\r\n\tstruct mhi_controller *mhi_cntrl;\r\n\tstruct mhi_dev *mhi_dev;\r\n\tu64 addr_win[2];\r\n\tint ret;\r\n\r\n\tmhi_cntrl = mhi_alloc_controller(sizeof(*mhi_dev));\r\n\tif (!mhi_cntrl) {\r\n\t\tpr_err(\"mhi_alloc_controller fail\\n\");\r\n\t\treturn NULL;\r\n\t}\r\n\r\n\tmhi_dev = mhi_controller_get_devdata(mhi_cntrl);\r\n\r\n\tmhi_cntrl->dev_id = pci_dev->device;\r\n\tmhi_cntrl->domain = pci_domain_nr(pci_dev->bus);\r\n\tmhi_cntrl->bus = pci_dev->bus->number;\r\n\tmhi_cntrl->slot = PCI_SLOT(pci_dev->devfn);\r\n\tmhi_dev->smmu_cfg = 0;\r\n\t#if 0 //def CONFIG_HAVE_MEMBLOCK\r\n\taddr_win[0] = memblock_start_of_DRAM();\r\n\taddr_win[1] = memblock_end_of_DRAM();\r\n\t#else\r\n#define MHI_MEM_BASE_DEFAULT         0x000000000\r\n#define MHI_MEM_SIZE_DEFAULT         0x2000000000\r\n\taddr_win[0] = MHI_MEM_BASE_DEFAULT;\r\n\taddr_win[1] = MHI_MEM_SIZE_DEFAULT;\r\n\tif (sizeof(dma_addr_t) == 4) {\r\n\t\taddr_win[1] = 0xFFFFFFFF;\r\n\t}\r\n\t#endif\r\n\r\n\tmhi_cntrl->iova_start = addr_win[0];\r\n\tmhi_cntrl->iova_stop = addr_win[1];\r\n\r\n\tmhi_dev->pci_dev = pci_dev;\r\n\tmhi_cntrl->pci_dev = pci_dev;\r\n\r\n\t/* setup power management apis */\r\n\tmhi_cntrl->status_cb = mhi_status_cb;\r\n\tmhi_cntrl->runtime_get = mhi_runtime_get;\r\n\tmhi_cntrl->runtime_put = mhi_runtime_put;\r\n\tmhi_cntrl->link_status = mhi_link_status;\r\n\r\n\tret = mhi_arch_platform_init(mhi_dev);\r\n\tif (ret)\r\n\t\tgoto error_probe;\r\n\r\n\tret = mhi_register_mhi_controller(mhi_cntrl);\r\n\tif (ret)\r\n\t\tgoto error_register;\r\n\r\n\tif (mhi_cntrl->parent)\r\n\t\tdebugfs_create_file(\"debug_mode\", 0444, mhi_cntrl->parent,\r\n\t\t\t\t    mhi_cntrl, &debugfs_debug_ops);\r\n\r\n\treturn mhi_cntrl;\r\n\r\nerror_register:\r\n\tmhi_arch_platform_deinit(mhi_dev);\r\n\r\nerror_probe:\r\n\tmhi_free_controller(mhi_cntrl);\r\n\r\n\treturn NULL;\r\n}\t\r\n\r\nint mhi_pci_probe(struct pci_dev *pci_dev,\r\n\t\t  const struct pci_device_id *device_id)\r\n{\r\n\tstruct mhi_controller *mhi_cntrl = NULL;\r\n\tu32 domain = pci_domain_nr(pci_dev->bus);\r\n\tu32 bus = pci_dev->bus->number;\r\n\tu32 slot = PCI_SLOT(pci_dev->devfn);\r\n\tstruct mhi_dev *mhi_dev;\r\n\tint ret;\r\n\r\n\tpr_info(\"%s pci_dev->name = %s, domain=%d, bus=%d, slot=%d, vendor=%04X, device=%04X\\n\",\r\n\t\t__func__, dev_name(&pci_dev->dev), domain, bus, slot, pci_dev->vendor, pci_dev->device);\r\n\t\r\n\tmhi_cntrl = mhi_platform_probe(pci_dev);\r\n\tif (!mhi_cntrl) {\r\n\t\tpr_err(\"mhi_platform_probe fail\\n\");\r\n\t\treturn -EPROBE_DEFER;\r\n\t}\r\n\t\r\n\tmhi_cntrl->dev_id = pci_dev->device;\r\n\tmhi_dev = mhi_controller_get_devdata(mhi_cntrl);\r\n\tmhi_dev->pci_dev = pci_dev;\r\n\tmhi_dev->powered_on = true;\r\n\r\n\tret = mhi_arch_pcie_init(mhi_cntrl);\r\n\tif (ret) {\r\n\t\tMHI_ERR(\"Error mhi_arch_pcie_init, ret:%d\\n\", ret);\r\n\t\treturn ret;\r\n\t}\r\n\r\n\tret = mhi_arch_iommu_init(mhi_cntrl);\r\n\tif (ret) {\r\n\t\tMHI_ERR(\"Error mhi_arch_iommu_init, ret:%d\\n\", ret);\r\n\t\tgoto error_iommu_init;\r\n\t}\r\n\r\n\tret = mhi_init_pci_dev(mhi_cntrl);\r\n\tif (ret) {\r\n\t\tMHI_ERR(\"Error mhi_init_pci_dev, ret:%d\\n\", ret);\r\n\t\tgoto error_init_pci;\r\n\t}\r\n\r\n\t/* start power up sequence if not in debug mode */\r\n\tif (!mhi_dev->debug_mode) {\r\n\t\tret = mhi_async_power_up(mhi_cntrl);\r\n\t\tif (ret) {\r\n\t\t\tMHI_ERR(\"Error mhi_async_power_up, ret:%d\\n\", ret);\r\n\t\t\tgoto error_power_up;\r\n\t\t}\r\n\t}\r\n\r\n#if 0\r\n\tpm_runtime_mark_last_busy(&pci_dev->dev);\r\n\tpm_runtime_allow(&pci_dev->dev);\r\n\tpm_runtime_disable(&pci_dev->dev);\r\n#endif\r\n\r\n\tif (mhi_cntrl->dentry) {\r\n\t\tdebugfs_create_file(\"m0\", 0444, mhi_cntrl->dentry, mhi_cntrl,\r\n\t\t\t\t    &debugfs_trigger_m0_fops);\r\n\t\tdebugfs_create_file(\"m3\", 0444, mhi_cntrl->dentry, mhi_cntrl,\r\n\t\t\t\t    &debugfs_trigger_m3_fops);\r\n\t}\r\n\r\n\tdev_set_drvdata(&pci_dev->dev, mhi_cntrl);\r\n\tMHI_LOG(\"Return successful\\n\");\r\n\r\n\treturn 0;\r\n\r\nerror_power_up:\r\n\tmhi_deinit_pci_dev(mhi_cntrl);\r\n\r\nerror_init_pci:\r\n\tmhi_arch_iommu_deinit(mhi_cntrl);\r\n\r\nerror_iommu_init:\r\n\tmhi_arch_pcie_deinit(mhi_cntrl);\r\n\r\n\treturn ret;\r\n}\r\n\r\nstatic void mhi_pci_remove(struct pci_dev *pci_dev)\r\n{\r\n\tstruct mhi_controller *mhi_cntrl = (struct mhi_controller *)dev_get_drvdata(&pci_dev->dev);\r\n\r\n\tif (mhi_cntrl && mhi_cntrl->pci_dev == pci_dev) {\r\n\t\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\r\n\t\tMHI_LOG(\"%s\\n\", dev_name(&pci_dev->dev));\r\n\t\tif (!mhi_dev->debug_mode) {\r\n\t\t\tmhi_power_down(mhi_cntrl, 1);\r\n\t\t}\r\n\t\tmhi_deinit_pci_dev(mhi_cntrl);\r\n\t\tmhi_arch_iommu_deinit(mhi_cntrl);\r\n\t\tmhi_arch_pcie_deinit(mhi_cntrl);\r\n\t\tmhi_unregister_mhi_controller(mhi_cntrl);\r\n\t}\r\n}\r\n\r\nstatic const struct dev_pm_ops pm_ops = {\r\n\tSET_RUNTIME_PM_OPS(mhi_runtime_suspend,\r\n\t\t\t   mhi_runtime_resume,\r\n\t\t\t   mhi_runtime_idle)\r\n\tSET_SYSTEM_SLEEP_PM_OPS(mhi_system_suspend, mhi_system_resume)\r\n};\r\n\r\nstatic struct pci_driver mhi_pcie_driver = {\r\n\t.name = \"mhi\",\r\n\t.id_table = mhi_pcie_device_id,\r\n\t.probe = mhi_pci_probe,\r\n\t.remove = mhi_pci_remove,\r\n\t.driver = {\r\n\t\t.pm = &pm_ops\r\n\t}\r\n};\r\n\r\nint __init mhi_controller_qcom_init(void)\r\n{\t\r\n\treturn pci_register_driver(&mhi_pcie_driver);\r\n};\r\n\r\nvoid mhi_controller_qcom_exit(void)\r\n{\r\n\tpr_info(\"%s enter\\n\", __func__);\r\n\tpci_unregister_driver(&mhi_pcie_driver);\r\n\tpr_info(\"%s exit\\n\", __func__);\r\n}\r\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/controllers/mhi_qcom.h",
    "content": "/* Copyright (c) 2018, The Linux Foundation. All rights reserved.\r\n *\r\n * This program is free software; you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License version 2 and\r\n * only version 2 as published by the Free Software Foundation.\r\n *\r\n * This program is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\n * GNU General Public License for more details.\r\n */\r\n#ifndef _MHI_QCOM_\r\n#define _MHI_QCOM_\r\n\r\n/* iova cfg bitmask */\r\n#define MHI_SMMU_ATTACH BIT(0)\r\n#define MHI_SMMU_S1_BYPASS BIT(1)\r\n#define MHI_SMMU_FAST BIT(2)\r\n#define MHI_SMMU_ATOMIC BIT(3)\r\n#define MHI_SMMU_FORCE_COHERENT BIT(4)\r\n\r\n#define MHI_PCIE_VENDOR_ID (0x17cb)\r\n#define MHI_PCIE_DEBUG_ID (0xffff)\r\n#define MHI_RPM_SUSPEND_TMR_MS (3000)\r\n#define MHI_PCI_BAR_NUM (0)\r\n\r\nstruct mhi_dev {\r\n\tstruct pci_dev *pci_dev;\r\n\tu32 smmu_cfg;\r\n\tint resn;\r\n\tvoid *arch_info;\r\n\tbool powered_on;\r\n\tbool debug_mode;\r\n};\r\n\r\nvoid mhi_deinit_pci_dev(struct mhi_controller *mhi_cntrl);\r\nint mhi_pci_probe(struct pci_dev *pci_dev,\r\n\t\t  const struct pci_device_id *device_id);\r\n\r\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 3,10,65 ))\r\nstatic inline int dma_set_mask_and_coherent(struct device *dev, u64 mask)\r\n{\r\n\tint rc = dma_set_mask(dev, mask);\r\n\tif (rc == 0)\r\n\t\tdma_set_coherent_mask(dev, mask);\r\n\treturn rc;\r\n}\r\n#endif\r\n\r\nstatic inline int mhi_arch_iommu_init(struct mhi_controller *mhi_cntrl)\r\n{\r\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\r\n\r\n\tmhi_cntrl->dev = &mhi_dev->pci_dev->dev;\r\n\r\n\treturn dma_set_mask_and_coherent(mhi_cntrl->dev, DMA_BIT_MASK(64));\r\n}\r\n\r\nstatic inline void mhi_arch_iommu_deinit(struct mhi_controller *mhi_cntrl)\r\n{\r\n}\r\n\r\nstatic inline int mhi_arch_pcie_init(struct mhi_controller *mhi_cntrl)\r\n{\r\n\treturn 0;\r\n}\r\n\r\nstatic inline void mhi_arch_pcie_deinit(struct mhi_controller *mhi_cntrl)\r\n{\r\n}\r\n\r\nstatic inline int mhi_arch_platform_init(struct mhi_dev *mhi_dev)\r\n{\r\n\treturn 0;\r\n}\r\n\r\nstatic inline void mhi_arch_platform_deinit(struct mhi_dev *mhi_dev)\r\n{\r\n}\r\n\r\nstatic inline int mhi_arch_link_off(struct mhi_controller *mhi_cntrl,\r\n\t\t\t\t    bool graceful)\r\n{\r\n\treturn 0;\r\n}\r\n\r\nstatic inline int mhi_arch_link_on(struct mhi_controller *mhi_cntrl)\r\n{\r\n\treturn 0;\r\n}\r\n\r\n#endif /* _MHI_QCOM_ */\r\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/controllers/mhi_qti.c",
    "content": "// SPDX-License-Identifier: GPL-2.0-only\n/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.*/\n\n#include <linux/debugfs.h>\n#include <linux/delay.h>\n#include <linux/device.h>\n#include <linux/dma-direction.h>\n#include <linux/list.h>\n#include <linux/of.h>\n#include <linux/memblock.h>\n#include <linux/module.h>\n#include <linux/pci.h>\n#include <linux/pm_runtime.h>\n#include <linux/slab.h>\n#include <linux/uaccess.h>\n#include <linux/msi.h>\n#include <linux/interrupt.h>\n#define MAX_MHI 8\n#ifdef CONFIG_PCI_MSM\n#define QCOM_AP_AND_EFUSE_PCIE_SLEEP\n#ifdef QCOM_AP_AND_EFUSE_PCIE_SLEEP\n#include <linux/platform_device.h>\n#include <linux/msm_pcie.h>\n#endif\n#endif\n//#define QCOM_AP_SDM845_IOMMU_MAP\n#ifdef QCOM_AP_SDM845_IOMMU_MAP\n#include <linux/dma-mapping.h>\n#include <asm/dma-iommu.h>\n#include <linux/iommu.h>\n#endif\n#include \"../core/mhi.h\"\n#include \"../core/mhi_internal.h\"\n#include \"mhi_qti.h\"\n\n#ifdef QCOM_AP_AND_EFUSE_PCIE_SLEEP\nextern int pci_write_config_byte(const struct pci_dev *dev, int where, u8 val);\nstruct arch_info {\n\tstruct mhi_dev *mhi_dev;\n\tstruct msm_bus_scale_pdata *msm_bus_pdata;\n\tu32 bus_client;\n\tstruct pci_saved_state *pcie_state;\n\tstruct pci_saved_state *ref_pcie_state;\n\tstruct dma_iommu_mapping *mapping;\n};\n#endif\n\n#if 1\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 3,10,65 ))\nstatic inline int dma_set_mask_and_coherent(struct device *dev, u64 mask)\n{\n\tint rc = dma_set_mask(dev, mask);\n\tif (rc == 0)\n\t\tdma_set_coherent_mask(dev, mask);\n\treturn rc;\n}\n#endif\n\n#ifdef PCI_IRQ_NOMSIX\n#define PCI_IRQ_MSI PCI_IRQ_NOMSIX\n#endif\n\n#ifndef PCI_IRQ_MSI\n#define PCI_IRQ_MSI\t\t(1 << 1) /* Allow MSI interrupts */\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 3,10,53 ))\nint pci_enable_msi_range(struct pci_dev *dev, int minvec, int maxvec)\n{\n\tint nvec = maxvec;\n\tint rc;\n\n\tif (maxvec < minvec)\n\t\treturn -ERANGE;\n\n\tdo {\n\t\trc = pci_enable_msi_block(dev, nvec);\n\t\tif (rc < 0) {\n\t\t\treturn rc;\n\t\t} else if (rc > 0) {\n\t\t\tif (rc < minvec)\n\t\t\t\treturn -ENOSPC;\n\t\t\tnvec = rc;\n\t\t}\n\t} while (rc);\n\n\treturn nvec;\n}\n#endif\n\nstatic int pci_alloc_irq_vectors(struct pci_dev *dev, unsigned int min_vecs,\n\t\t      unsigned int max_vecs, unsigned int flags)\n{\n\treturn pci_enable_msi_range(dev, min_vecs, max_vecs);\n}\n\nstatic void pci_free_irq_vectors(struct pci_dev *dev)\n{\n\tpci_disable_msi(dev);\n}\n\nstatic int pci_irq_vector(struct pci_dev *dev, unsigned int nr)\n{\n#if 0//defined(CONFIG_PINCTRL_IPQ5018)\n\tstruct pcie_port *pp = dev->bus->sysdata;\n\tpp->msi[nr]; //msi maybe not continuous\n#endif\n    return dev->irq + nr;\n}\n#endif\n#endif\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 0, 0)\n#define MHI_PCI_REQUEST_REGION(pdev, bar, name) pci_request_regions((pdev), (name))\n#define MHI_PCI_RELEASE_REGION(pdev, bar) pci_release_regions((pdev))\n#else\n#define MHI_PCI_REQUEST_REGION(pdev, bar, name) pci_request_region((pdev), (bar), (name))\n#define MHI_PCI_RELEASE_REGION(pdev, bar) pci_release_region((pdev), (bar))\n#endif\n\nstruct firmware_info {\n\tunsigned int dev_id;\n\tconst char *fw_image;\n\tconst char *edl_image;\n};\n\nstatic const struct firmware_info firmware_table[] = {\n\t{.dev_id = 0x306, .fw_image = \"sdx55m/sbl1.mbn\"},\n\t{.dev_id = 0x305, .fw_image = \"sdx50m/sbl1.mbn\"},\n\t{.dev_id = 0x304, .fw_image = \"sbl.mbn\", .edl_image = \"edl.mbn\"},\n\t/* default, set to debug.mbn */\n\t{.fw_image = \"debug.mbn\"},\n};\n\nstatic int debug_mode;\nmodule_param_named(debug_mode, debug_mode, int, 0644);\n\nint mhi_debugfs_trigger_m0(void *data, u64 val)\n{\n\tstruct mhi_controller *mhi_cntrl = data;\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\n\tMHI_LOG(\"Trigger M3 Exit\\n\");\n\tpm_runtime_get(&mhi_dev->pci_dev->dev);\n\tpm_runtime_put(&mhi_dev->pci_dev->dev);\n\n\treturn 0;\n}\nDEFINE_SIMPLE_ATTRIBUTE(debugfs_trigger_m0_fops, NULL,\n\t\t\tmhi_debugfs_trigger_m0, \"%llu\\n\");\n\nint mhi_debugfs_trigger_m3(void *data, u64 val)\n{\n\tstruct mhi_controller *mhi_cntrl = data;\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\n\tMHI_LOG(\"Trigger M3 Entry\\n\");\n\tpm_runtime_mark_last_busy(&mhi_dev->pci_dev->dev);\n\tpm_request_autosuspend(&mhi_dev->pci_dev->dev);\n\n\treturn 0;\n}\nDEFINE_SIMPLE_ATTRIBUTE(debugfs_trigger_m3_fops, NULL,\n\t\t\tmhi_debugfs_trigger_m3, \"%llu\\n\");\n\nvoid mhi_deinit_pci_dev(struct mhi_controller *mhi_cntrl)\n{\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\tstruct pci_dev *pci_dev = mhi_dev->pci_dev;\n\n\tpm_runtime_mark_last_busy(&pci_dev->dev);\n\tpm_runtime_dont_use_autosuspend(&pci_dev->dev);\n\tpm_runtime_disable(&pci_dev->dev);\n\tpci_free_irq_vectors(pci_dev);\n\tkfree(mhi_cntrl->irq);\n\tmhi_cntrl->irq = NULL;\n\tiounmap(mhi_cntrl->regs);\n\tmhi_cntrl->regs = NULL;\n\tpci_clear_master(pci_dev);\n\tMHI_PCI_RELEASE_REGION(pci_dev, mhi_dev->resn);\n\tpci_disable_device(pci_dev);\n}\n\nstatic int mhi_init_pci_dev(struct mhi_controller *mhi_cntrl)\n{\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\tstruct pci_dev *pci_dev = mhi_dev->pci_dev;\n\tint ret;\n\tresource_size_t len;\n\tint i;\n\n\tmhi_dev->resn = MHI_PCI_BAR_NUM;\n\tret = pci_assign_resource(pci_dev, mhi_dev->resn);\n\tif (ret) {\n\t\tMHI_ERR(\"Error assign pci resources, ret:%d\\n\", ret);\n\t\treturn ret;\n\t}\n\n\tret = pci_enable_device(pci_dev);\n\tif (ret) {\n\t\tMHI_ERR(\"Error enabling device, ret:%d\\n\", ret);\n\t\tgoto error_enable_device;\n\t}\n\n\tret = MHI_PCI_REQUEST_REGION(pci_dev, mhi_dev->resn, \"mhi\");\n\tif (ret) {\n\t\tMHI_ERR(\"Error requesting PCI regions, ret:%d\\n\", ret);\n\t\tgoto error_request_region;\n\t}\n\n\tpci_set_master(pci_dev);\n\n#if 1 //some SOC like rpi_4b need next codes\n\tret = -EIO;\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0))\n\tif (!dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(64))) {\n\t\tret =  dma_set_coherent_mask(&pci_dev->dev, DMA_BIT_MASK(64));\n\t} else if (!dma_set_mask(&pci_dev->dev, DMA_BIT_MASK(32))) {\n\t\tret = dma_set_coherent_mask(&pci_dev->dev, DMA_BIT_MASK(32));\n\t}\n#else\n\tif (!pci_set_dma_mask(pci_dev, DMA_BIT_MASK(64))) {\n\t\tret = pci_set_consistent_dma_mask(pci_dev, DMA_BIT_MASK(64));\n\t} else if (!pci_set_dma_mask(pci_dev, DMA_BIT_MASK(32))) {\n\t\tret = pci_set_consistent_dma_mask(pci_dev, DMA_BIT_MASK(32));\n\t}\n#endif\n\tif (ret) {\n\t\tMHI_ERR(\"Error dma mask\\n\");\n\t}\n#endif\n\n\tmhi_cntrl->base_addr = pci_resource_start(pci_dev, mhi_dev->resn);\n\tlen = pci_resource_len(pci_dev, mhi_dev->resn);\n#ifndef ioremap_nocache //4bdc0d676a643140bdf17dbf7eafedee3d496a3c\n#define ioremap_nocache ioremap\n#endif\n\tmhi_cntrl->regs = ioremap_nocache(mhi_cntrl->base_addr, len);\n\tif (!mhi_cntrl->regs) {\n\t\tMHI_ERR(\"Error ioremap region\\n\");\n\t\tgoto error_ioremap;\n\t}\n\n#if 0\n\tret = pci_alloc_irq_vectors(pci_dev, mhi_cntrl->msi_required,\n\t\t\t\t    mhi_cntrl->msi_required, PCI_IRQ_NOMSIX);\n\tif (IS_ERR_VALUE((ulong)ret) || ret < mhi_cntrl->msi_required) {\n\t\tMHI_ERR(\"Failed to enable MSI, ret:%d\\n\", ret);\n\t\tgoto error_req_msi;\n\t}\n#else\n\tret = pci_alloc_irq_vectors(pci_dev, 1, mhi_cntrl->msi_required, PCI_IRQ_MSI);\n\tif (IS_ERR_VALUE((ulong)ret) || ret < mhi_cntrl->msi_required) {\n\t\tif (ret == -ENOSPC) {\n\t\t\t/* imx_3.14.52_1.1.0_ga\n\t\t\tdiff --git a/drivers/pci/host/pcie-designware.c b/drivers/pci/host/pcie-designware.c\n\t\t\tindex f06e8f0..6a9614f 100644\n\t\t\t--- a/drivers/pci/host/pcie-designware.c\n\t\t\t+++ b/drivers/pci/host/pcie-designware.c\n\t\t\t@@ -376,6 +376,13 @@ static int dw_msi_setup_irq(struct msi_chip *chip, struct pci_dev *pdev,\n\t\t\t\tif (msgvec > 5)\n\t\t\t\t\tmsgvec = 0;\n\n\t\t\t+#if 1 //Add by Quectel 20190419\n\t\t\t+       if (msgvec > 0 && pdev->vendor == 0x17cb) {\n\t\t\t+               dev_info(&pdev->dev, \"%s quectel fixup pos=%d, msg_ctr=%04x, msgvec=%d\\n\",  __func__, desc->msi_attrib.pos, msg_ctr, msgvec);\n\t\t\t+               msgvec = 0;\n\t\t\t+       }\n\t\t\t+#endif\n\t\t\t+\n\t\t\t\tirq = assign_irq((1 << msgvec), desc, &pos);\n\t\t\t\tif (irq < 0)\n\t\t\t\t\treturn irq;\n\t\t\t*/\n\t\t}\n\t\t//imx_4.1.15_2.0.0_ga & DELL_OPTIPLEX_7010 only alloc one msi interrupt for one pcie device\n\t\tif (ret != 1) {\n\t\t\tMHI_ERR(\"Failed to enable MSI, ret=%d, msi_required=%d\\n\", ret, mhi_cntrl->msi_required);\n\t\t\tgoto error_req_msi;\n\t\t}\n\t}\n\tMHI_LOG(\"msi_required = %d, msi_allocated = %d, msi_irq = %u\\n\", mhi_cntrl->msi_required, ret, pci_dev->irq);\n#endif\n\n\tmhi_cntrl->msi_allocated = ret;\n\tmhi_cntrl->irq = kmalloc_array(mhi_cntrl->msi_allocated,\n\t\t\t\t       sizeof(*mhi_cntrl->irq), GFP_KERNEL);\n\tif (!mhi_cntrl->irq) {\n\t\tret = -ENOMEM;\n\t\tgoto error_alloc_msi_vec;\n\t}\n\n\tfor (i = 0; i < mhi_cntrl->msi_allocated; i++) {\n\t\tmhi_cntrl->irq[i] = pci_irq_vector(pci_dev, i);\n\t\tif (mhi_cntrl->irq[i] < 0) {\n\t\t\tret = mhi_cntrl->irq[i];\n\t\t\tgoto error_get_irq_vec;\n\t\t}\n\t}\n\n\tdev_set_drvdata(&pci_dev->dev, mhi_cntrl);\n\n\t/* configure runtime pm */\n\tpm_runtime_set_autosuspend_delay(&pci_dev->dev, MHI_RPM_SUSPEND_TMR_MS);\n\tpm_runtime_use_autosuspend(&pci_dev->dev);\n\tpm_suspend_ignore_children(&pci_dev->dev, true);\n\n\t/*\n\t * pci framework will increment usage count (twice) before\n\t * calling local device driver probe function.\n\t * 1st pci.c pci_pm_init() calls pm_runtime_forbid\n\t * 2nd pci-driver.c local_pci_probe calls pm_runtime_get_sync\n\t * Framework expect pci device driver to call\n\t * pm_runtime_put_noidle to decrement usage count after\n\t * successful probe and and call pm_runtime_allow to enable\n\t * runtime suspend.\n\t */\n\tpm_runtime_mark_last_busy(&pci_dev->dev);\n\tpm_runtime_put_noidle(&pci_dev->dev);\n\n\treturn 0;\n\nerror_get_irq_vec:\n\tkfree(mhi_cntrl->irq);\n\tmhi_cntrl->irq = NULL;\n\nerror_alloc_msi_vec:\n\tpci_free_irq_vectors(pci_dev);\n\nerror_req_msi:\n\tiounmap(mhi_cntrl->regs);\n\nerror_ioremap:\n\tpci_clear_master(pci_dev);\n\nerror_request_region:\n\tpci_disable_device(pci_dev);\n\nerror_enable_device:\n\tMHI_PCI_RELEASE_REGION(pci_dev, mhi_dev->resn);\n\n\treturn ret;\n}\n\n#ifdef CONFIG_PM\nstatic int mhi_runtime_suspend(struct device *dev)\n{\n\tint ret = 0;\n\tstruct mhi_controller *mhi_cntrl = dev_get_drvdata(dev);\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\n\tMHI_LOG(\"Enter\\n\");\n\n\tmutex_lock(&mhi_cntrl->pm_mutex);\n\n\tif (!mhi_dev->powered_on) {\n\t\tMHI_LOG(\"Not fully powered, return success\\n\");\n\t\tmutex_unlock(&mhi_cntrl->pm_mutex);\n\t\treturn 0;\n\t}\n\n\tif (mhi_cntrl->ee != MHI_EE_AMSS) {\n\t\tMHI_LOG(\"Not AMSS, return busy\\n\");\n\t\tmutex_unlock(&mhi_cntrl->pm_mutex);\n\t\treturn -EBUSY;\n\t}\n\n\tret = mhi_pm_suspend(mhi_cntrl);\n\tif (ret) {\n\t\tMHI_LOG(\"Abort due to ret:%d\\n\", ret);\n\t\tgoto exit_runtime_suspend;\n\t}\n\n\tret = mhi_arch_link_off(mhi_cntrl, true);\n\tif (ret)\n\t\tMHI_ERR(\"Failed to Turn off link ret:%d\\n\", ret);\n\nexit_runtime_suspend:\n\tmutex_unlock(&mhi_cntrl->pm_mutex);\n\tMHI_LOG(\"Exited with ret:%d\\n\", ret);\n\n\treturn ret;\n}\n\nstatic int mhi_runtime_idle(struct device *dev)\n{\n\tstruct mhi_controller *mhi_cntrl = dev_get_drvdata(dev);\n\n\tif ((mhi_cntrl->dev_state == MHI_STATE_M0 || mhi_cntrl->dev_state == MHI_STATE_M3)\n\t\t&& mhi_cntrl->ee == MHI_EE_AMSS) {\n\t\treturn 0;\n\t}\n\tMHI_LOG(\"Entered returning -EBUSY, mhi_state:%s exec_env:%s\\n\",\n\t\t   TO_MHI_STATE_STR(mhi_get_mhi_state(mhi_cntrl)), TO_MHI_EXEC_STR(mhi_get_exec_env(mhi_cntrl)));\n\n\t/*\n\t * RPM framework during runtime resume always calls\n\t * rpm_idle to see if device ready to suspend.\n\t * If dev.power usage_count count is 0, rpm fw will call\n\t * rpm_idle cb to see if device is ready to suspend.\n\t * if cb return 0, or cb not defined the framework will\n\t * assume device driver is ready to suspend;\n\t * therefore, fw will schedule runtime suspend.\n\t * In MHI power management, MHI host shall go to\n\t * runtime suspend only after entering MHI State M2, even if\n\t * usage count is 0.  Return -EBUSY to disable automatic suspend.\n\t */\n\treturn -EBUSY;\n}\n\nstatic int mhi_runtime_resume(struct device *dev)\n{\n\tint ret = 0;\n\tstruct mhi_controller *mhi_cntrl = dev_get_drvdata(dev);\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\n\tMHI_LOG(\"Enter\\n\");\n\n\tmutex_lock(&mhi_cntrl->pm_mutex);\n\n\tif (!mhi_dev->powered_on) {\n\t\tMHI_LOG(\"Not fully powered, return success\\n\");\n\t\tmutex_unlock(&mhi_cntrl->pm_mutex);\n\t\treturn 0;\n\t}\n\n\t/* turn on link */\n\tret = mhi_arch_link_on(mhi_cntrl);\n\tif (ret)\n\t\tgoto rpm_resume_exit;\n\n\t/* enter M0 state */\n\tret = mhi_pm_resume(mhi_cntrl);\n\nrpm_resume_exit:\n\tmutex_unlock(&mhi_cntrl->pm_mutex);\n\tMHI_LOG(\"Exited with :%d\\n\", ret);\n\n\treturn ret;\n}\n\n#ifdef CONFIG_PM_SLEEP\nstatic int mhi_system_resume(struct device *dev)\n{\n\tint ret = 0;\n\tstruct mhi_controller *mhi_cntrl = dev_get_drvdata(dev);\n\n\tret = mhi_runtime_resume(dev);\n\tif (ret) {\n\t\tMHI_ERR(\"Failed to resume link\\n\");\n\t} else {\n\t\t//pm_runtime_set_active(dev);\n\t\t//pm_runtime_enable(dev);\n\t}\n\n\treturn ret;\n}\n\nint mhi_system_suspend(struct device *dev)\n{\n\tstruct mhi_controller *mhi_cntrl = dev_get_drvdata(dev);\n\tint ret;\n\n\tMHI_LOG(\"Entered\\n\");\n\n\tif (atomic_read(&mhi_cntrl->pending_pkts)) {\n\t\tMHI_LOG(\"Abort due to pending_pkts:%d\\n\", atomic_read(&mhi_cntrl->pending_pkts));\n\t\treturn -EBUSY;\n\t}\n\n\t/* if rpm status still active then force suspend */\n\tif (!pm_runtime_status_suspended(dev)) {\n\t\tret = mhi_runtime_suspend(dev);\n\t\tif (ret) {\n\t\t\tMHI_LOG(\"suspend failed ret:%d\\n\", ret);\n\t\t\treturn ret;\n\t\t}\n\t}\n\n\t//pm_runtime_set_suspended(dev);\n\t//pm_runtime_disable(dev);\n\n\tMHI_LOG(\"Exit\\n\");\n\treturn 0;\n}\n#endif\n#endif\n\n/* checks if link is down */\nstatic int mhi_link_status(struct mhi_controller *mhi_cntrl, void *priv)\n{\n\tstruct mhi_dev *mhi_dev = priv;\n\tu16 dev_id;\n\tint ret;\n\n\t/* try reading device id, if dev id don't match, link is down */\n\tret = pci_read_config_word(mhi_dev->pci_dev, PCI_DEVICE_ID, &dev_id);\n\n\treturn (ret || dev_id != mhi_cntrl->dev_id) ? -EIO : 0;\n}\n\n/* disable PCIe L1 */\nstatic int mhi_lpm_disable(struct mhi_controller *mhi_cntrl, void *priv)\n{\n\tstruct mhi_dev *mhi_dev = priv;\n\tstruct pci_dev *pci_dev = mhi_dev->pci_dev;\n\tint lnkctl = pci_dev->pcie_cap + PCI_EXP_LNKCTL;\n\tu8 val;\n\tint ret;\n\n\tret = pci_read_config_byte(pci_dev, lnkctl, &val);\n\tif (ret) {\n\t\tMHI_ERR(\"Error reading LNKCTL, ret:%d\\n\", ret);\n\t\treturn ret;\n\t}\n\n\t/* L1 is not supported or already disabled */\n\tif (!(val & PCI_EXP_LNKCTL_ASPM_L1))\n\t\treturn 0;\n\n\tval &= ~PCI_EXP_LNKCTL_ASPM_L1;\n\tret = pci_write_config_byte(pci_dev, lnkctl, val);\n\tif (ret) {\n\t\tMHI_ERR(\"Error writing LNKCTL to disable LPM, ret:%d\\n\", ret);\n\t\treturn ret;\n\t}\n\n\tmhi_dev->lpm_disabled = true;\n\n\treturn ret;\n}\n\n/* enable PCIe L1 */\nstatic int mhi_lpm_enable(struct mhi_controller *mhi_cntrl, void *priv)\n{\n\tstruct mhi_dev *mhi_dev = priv;\n\tstruct pci_dev *pci_dev = mhi_dev->pci_dev;\n\tint lnkctl = pci_dev->pcie_cap + PCI_EXP_LNKCTL;\n\tu8 val;\n\tint ret;\n\n\t/* L1 is not supported or already disabled */\n\tif (!mhi_dev->lpm_disabled)\n\t\treturn 0;\n\n\tret = pci_read_config_byte(pci_dev, lnkctl, &val);\n\tif (ret) {\n\t\tMHI_ERR(\"Error reading LNKCTL, ret:%d\\n\", ret);\n\t\treturn ret;\n\t}\n\n\tval |= PCI_EXP_LNKCTL_ASPM_L1;\n\tret = pci_write_config_byte(pci_dev, lnkctl, val);\n\tif (ret) {\n\t\tMHI_ERR(\"Error writing LNKCTL to enable LPM, ret:%d\\n\", ret);\n\t\treturn ret;\n\t}\n\n\tmhi_dev->lpm_disabled = false;\n\n\treturn ret;\n}\n\nstatic int mhi_power_up(struct mhi_controller *mhi_cntrl)\n{\n\tenum mhi_dev_state dev_state = mhi_get_mhi_state(mhi_cntrl);\n\tconst u32 delayus = 10;\n\tint itr = DIV_ROUND_UP(mhi_cntrl->timeout_ms * 1000, delayus);\n\tint ret;\n\n\tMHI_LOG(\"dev_state:%s\\n\", TO_MHI_STATE_STR(mhi_get_mhi_state(mhi_cntrl)));\n\n\t/*\n\t * It's possible device did not go thru a cold reset before\n\t * power up and still in error state. If device in error state,\n\t * we need to trigger a soft reset before continue with power\n\t * up\n\t */\n\tif (dev_state == MHI_STATE_SYS_ERR) {\n\t\tmhi_set_mhi_state(mhi_cntrl, MHI_STATE_RESET);\n\t\twhile (itr--) {\n\t\t\tdev_state = mhi_get_mhi_state(mhi_cntrl);\n\t\t\tif (dev_state != MHI_STATE_SYS_ERR)\n\t\t\t\tbreak;\n\t\t\tusleep_range(delayus, delayus << 1);\n\t\t}\n\t\tMHI_LOG(\"dev_state:%s\\n\", TO_MHI_STATE_STR(mhi_get_mhi_state(mhi_cntrl)));\n\n\t\t/* device still in error state, abort power up */\n\t\tif (dev_state == MHI_STATE_SYS_ERR)\n\t\t\treturn -EIO;\n\t}\n\n\tret = mhi_async_power_up(mhi_cntrl);\n\n\t/* power up create the dentry */\n\tif (mhi_cntrl->dentry) {\n\t\tdebugfs_create_file(\"m0\", 0444, mhi_cntrl->dentry, mhi_cntrl,\n\t\t\t\t    &debugfs_trigger_m0_fops);\n\t\tdebugfs_create_file(\"m3\", 0444, mhi_cntrl->dentry, mhi_cntrl,\n\t\t\t\t    &debugfs_trigger_m3_fops);\n\t}\n\n\treturn ret;\n}\n\nstatic int mhi_runtime_get(struct mhi_controller *mhi_cntrl, void *priv)\n{\n\tstruct mhi_dev *mhi_dev = priv;\n\tstruct device *dev = &mhi_dev->pci_dev->dev;\n\n\treturn pm_runtime_get(dev);\n}\n\nstatic void mhi_runtime_put(struct mhi_controller *mhi_cntrl, void *priv)\n{\n\tstruct mhi_dev *mhi_dev = priv;\n\tstruct device *dev = &mhi_dev->pci_dev->dev;\n\n\tpm_runtime_mark_last_busy(dev);\n\tpm_runtime_put(dev);\n}\n\nstatic void mhi_runtime_mark_last_busy(struct mhi_controller *mhi_cntrl, void *priv)\n{\n\tstruct mhi_dev *mhi_dev = priv;\n\tstruct device *dev = &mhi_dev->pci_dev->dev;\n\n\tpm_runtime_mark_last_busy(dev);\n}\n\n#ifdef QCOM_AP_AND_EFUSE_PCIE_SLEEP\nstatic void mhi_pci_event_cb(struct msm_pcie_notify *notify)\n{\n\tstruct pci_dev *pci_dev = notify->user;\n\tstruct device *dev = &pci_dev->dev;\n\n\tdev_info(&pci_dev->dev, \"Received PCIe event %d\", notify->event);\n\tswitch (notify->event) {\n\tcase MSM_PCIE_EVENT_WAKEUP:\n\tif (dev && pm_runtime_status_suspended(dev)) {\n\t\tpm_request_resume(dev);\n\t\tpm_runtime_mark_last_busy(dev);\n\t}\n\tbreak;\n\tdefault:\n\tbreak;\n\t}\n}\n\nstatic struct msm_pcie_register_event mhi_pcie_events[MAX_MHI];\n#endif\n\nstatic void mhi_status_cb(struct mhi_controller *mhi_cntrl,\n\t\t\t  void *priv,\n\t\t\t  enum MHI_CB reason)\n{\n\tstruct mhi_dev *mhi_dev = priv;\n\tstruct device *dev = &mhi_dev->pci_dev->dev;\n\n\tswitch (reason) {\n\tcase MHI_CB_FATAL_ERROR:\n\tcase MHI_CB_SYS_ERROR:\n\t\tpm_runtime_forbid(dev);\n\t\tbreak;\n\tcase MHI_CB_EE_MISSION_MODE:\n\t\t//pm_runtime_allow(dev);\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\n\n/* capture host SoC XO time in ticks */\nstatic u64 mhi_time_get(struct mhi_controller *mhi_cntrl, void *priv)\n{\n\treturn 0;\n}\n\nstatic ssize_t timeout_ms_show(struct device *dev,\n\t\t\t       struct device_attribute *attr,\n\t\t\t       char *buf)\n{\n\tstruct mhi_device *mhi_dev = to_mhi_device(dev);\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\n\t/* buffer provided by sysfs has a minimum size of PAGE_SIZE */\n\treturn snprintf(buf, PAGE_SIZE, \"%u\\n\", mhi_cntrl->timeout_ms);\n}\n\nstatic ssize_t timeout_ms_store(struct device *dev,\n\t\t\t\tstruct device_attribute *attr,\n\t\t\t\tconst char *buf,\n\t\t\t\tsize_t count)\n{\n\tstruct mhi_device *mhi_dev = to_mhi_device(dev);\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tu32 timeout_ms;\n\n\tif (kstrtou32(buf, 0, &timeout_ms) < 0)\n\t\treturn -EINVAL;\n\n\tmhi_cntrl->timeout_ms = timeout_ms;\n\n\treturn count;\n}\nstatic DEVICE_ATTR_RW(timeout_ms);\n\nstatic ssize_t power_up_store(struct device *dev,\n\t\t\t      struct device_attribute *attr,\n\t\t\t      const char *buf,\n\t\t\t      size_t count)\n{\n\tint ret;\n\tstruct mhi_device *mhi_dev = to_mhi_device(dev);\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\n\tret = mhi_power_up(mhi_cntrl);\n\tif (ret)\n\t\treturn ret;\n\n\treturn count;\n}\nstatic DEVICE_ATTR_WO(power_up);\n\nstatic struct attribute *mhi_attrs[] = {\n\t&dev_attr_timeout_ms.attr,\n\t&dev_attr_power_up.attr,\n\tNULL\n};\n\nstatic const struct attribute_group mhi_group = {\n\t.attrs = mhi_attrs,\n};\n\nstatic struct mhi_controller *mhi_register_controller(struct pci_dev *pci_dev)\n{\n\tstruct mhi_controller *mhi_cntrl;\n\tstruct mhi_dev *mhi_dev;\n\tstruct device_node *of_node = pci_dev->dev.of_node;\n\tconst struct firmware_info *firmware_info;\n\tbool use_bb;\n\tu64 addr_win[2];\n\tint ret, i;\n\n\t//if (!of_node)\n\t//\treturn ERR_PTR(-ENODEV);\n\n\tmhi_cntrl = mhi_alloc_controller(sizeof(*mhi_dev));\n\tif (!mhi_cntrl)\n\t\treturn ERR_PTR(-ENOMEM);\n\n\tmhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\n\tmhi_cntrl->dev = &pci_dev->dev;\n\tmhi_cntrl->domain = pci_domain_nr(pci_dev->bus);\n\tmhi_cntrl->vendor = pci_dev->vendor;\n\tmhi_cntrl->dev_id = pci_dev->device;\n\tmhi_cntrl->bus = pci_dev->bus->number;\n\tmhi_cntrl->slot = PCI_SLOT(pci_dev->devfn);\n\n#if 0\n\tuse_bb = of_property_read_bool(of_node, \"mhi,use-bb\");\n\n\t/*\n\t * if s1 translation enabled or using bounce buffer pull iova addr\n\t * from dt\n\t */\n\tif (use_bb || (mhi_dev->smmu_cfg & MHI_SMMU_ATTACH &&\n\t\t       !(mhi_dev->smmu_cfg & MHI_SMMU_S1_BYPASS))) {\n\t\tret = of_property_count_elems_of_size(of_node, \"qti,addr-win\",\n\t\t\t\t\t\t      sizeof(addr_win));\n\t\tif (ret != 1)\n\t\t\tgoto error_register;\n\t\tret = of_property_read_u64_array(of_node, \"qti,addr-win\",\n\t\t\t\t\t\t addr_win, 2);\n\t\tif (ret)\n\t\t\tgoto error_register;\n\t} else {\n\t\taddr_win[0] = memblock_start_of_DRAM();\n\t\taddr_win[1] = memblock_end_of_DRAM();\n\t}\n#else\n\tuse_bb = false;\n\t(void)use_bb;\n\taddr_win[0] = 0x000000000;\n\taddr_win[1] = 0x2000000000; //MHI_MEM_SIZE_DEFAULT\n\tif (sizeof(dma_addr_t) == 4) {\n\t\taddr_win[1] = 0xFFFFFFFF;\n\t}\n#endif\n\n\tmhi_dev->iova_start = addr_win[0];\n\tmhi_dev->iova_stop = addr_win[1];\n\n\t/*\n\t * If S1 is enabled, set MHI_CTRL start address to 0 so we can use low\n\t * level mapping api to map buffers outside of smmu domain\n\t */\n\tif (mhi_dev->smmu_cfg & MHI_SMMU_ATTACH &&\n\t    !(mhi_dev->smmu_cfg & MHI_SMMU_S1_BYPASS))\n\t\tmhi_cntrl->iova_start = 0;\n\telse\n\t\tmhi_cntrl->iova_start = addr_win[0];\n\n\tmhi_cntrl->iova_stop = mhi_dev->iova_stop;\n\tmhi_cntrl->of_node = of_node;\n\n\tmhi_dev->pci_dev = pci_dev;\n\n\t/* setup power management apis */\n\tmhi_cntrl->status_cb = mhi_status_cb;\n\tmhi_cntrl->runtime_get = mhi_runtime_get;\n\tmhi_cntrl->runtime_put = mhi_runtime_put;\n\tmhi_cntrl->runtime_mark_last_busy = mhi_runtime_mark_last_busy;\n\tmhi_cntrl->link_status = mhi_link_status;\n\n\tmhi_cntrl->lpm_disable = mhi_lpm_disable;\n\tmhi_cntrl->lpm_enable = mhi_lpm_enable;\n\tmhi_cntrl->time_get = mhi_time_get;\n\n\tret = of_register_mhi_controller(mhi_cntrl);\n\tif (ret)\n\t\tgoto error_register;\n\n\tfor (i = 0; i < ARRAY_SIZE(firmware_table); i++) {\n\t\tfirmware_info = firmware_table + i;\n\n\t\t/* debug mode always use default */\n\t\tif (!debug_mode && mhi_cntrl->dev_id == firmware_info->dev_id)\n\t\t\tbreak;\n\t}\n\n#if 0\n\tmhi_cntrl->fw_image = firmware_info->fw_image;\n\tmhi_cntrl->edl_image = firmware_info->edl_image;\n#endif\n\n\tif (sysfs_create_group(&mhi_cntrl->mhi_dev->dev.kobj, &mhi_group))\n\t\tMHI_ERR(\"Error while creating the sysfs group\\n\");\n\n\treturn mhi_cntrl;\n\nerror_register:\n\tmhi_free_controller(mhi_cntrl);\n\n\treturn ERR_PTR(-EINVAL);\n}\n\nstatic bool mhi_pci_is_alive(struct pci_dev *pdev)\n{\n\tu16 vendor = 0;\n\n\tif (pci_read_config_word(pdev, PCI_VENDOR_ID, &vendor))\n\t\treturn false;\n\n\tif (vendor == (u16) ~0 || vendor == 0)\n\t\treturn false;\n\n\treturn true;\n}\n\nstatic void mhi_pci_show_link(struct mhi_controller *mhi_cntrl, struct pci_dev *pci_dev)\n{\n\tint pcie_cap_reg;\n\tu16 stat;\n\tu32 caps;\n\tconst char *speed;\n\n\tpcie_cap_reg = pci_find_capability(pci_dev, PCI_CAP_ID_EXP);\n\n\tif (!pcie_cap_reg)\n\t\treturn;\n\n\tpci_read_config_word(pci_dev,\n\t\t\t     pcie_cap_reg + PCI_EXP_LNKSTA,\n\t\t\t     &stat);\n\tpci_read_config_dword(pci_dev,\n\t\t\t      pcie_cap_reg + PCI_EXP_LNKCAP,\n\t\t\t      &caps);\n\n\tswitch (caps & PCI_EXP_LNKCAP_SLS) {\n\t\tcase PCI_EXP_LNKCAP_SLS_2_5GB: speed = \"2.5\"; break;\n\t\tcase PCI_EXP_LNKCAP_SLS_5_0GB: speed = \"5\"; break;\n\t\tcase 3: speed = \"8\"; break;\n\t\tcase 4: speed = \"16\"; break;\n\t\tcase 5: speed = \"32\"; break;\n\t\tcase 6: speed = \"64\"; break;\n\t\tdefault: speed = \"0\"; break;\n\t}\n\n\tMHI_LOG(\"LnkCap:\tSpeed %sGT/s, Width x%d\\n\", speed,\n\t\t(caps & PCI_EXP_LNKCAP_MLW) >> 4);\n\n\tswitch (stat & PCI_EXP_LNKSTA_CLS) {\n\t\tcase PCI_EXP_LNKSTA_CLS_2_5GB: speed = \"2.5\"; break;\n\t\tcase PCI_EXP_LNKSTA_CLS_5_0GB: speed = \"5\"; break;\n\t\tcase 3: speed = \"8\"; break;\n\t\tcase 4: speed = \"16\"; break;\n\t\tcase 5: speed = \"32\"; break;\n\t\tcase 6: speed = \"64\"; break;\n\t\tdefault: speed = \"0\"; break;\n\t}\n\n\tMHI_LOG(\"LnkSta:\tSpeed %sGT/s, Width x%d\\n\", speed,\n\t\t(stat & PCI_EXP_LNKSTA_NLW) >> PCI_EXP_LNKSTA_NLW_SHIFT);\n\n}\n\nint mhi_pci_probe(struct pci_dev *pci_dev,\n\t\t  const struct pci_device_id *device_id)\n{\n\tstruct mhi_controller *mhi_cntrl;\n\tu32 domain = pci_domain_nr(pci_dev->bus);\n\tu32 bus = pci_dev->bus->number;\n\tu32 dev_id = pci_dev->device;\n\tu32 slot = PCI_SLOT(pci_dev->devfn);\n\tstruct mhi_dev *mhi_dev;\n\tint ret;\n\n\tpr_info(\"%s pci_dev->name = %s, domain=%d, bus=%d, slot=%d, vendor=%04X, device=%04X\\n\",\n\t\t__func__, dev_name(&pci_dev->dev), domain, bus, slot, pci_dev->vendor, pci_dev->device);\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(7, 0, 0)\n#if !defined(CONFIG_PCI_MSI) && !defined(CONFIG_GENERIC_MSI_IRQ)\n\tdev_err(&pci_dev->dev,\n\t\t\"PCI MSI is not enabled in this kernel configuration\\n\");\n\treturn -EOPNOTSUPP;\n#endif\n#else\n#if !defined(CONFIG_PCI_MSI)\n\t/* MT7621 RTL8198D EcoNet-EN7565 */\n\t#error \"pcie msi is not support by this soc! and i donot support INTx (SW1SDX55-2688)\"\n#endif\n#endif\n\n\tif (!mhi_pci_is_alive(pci_dev)) {\n\t\t/*\n\t\troot@OpenWrt:~# hexdump /sys/bus/pci/devices/0000:01:00.0/config\n\t\t0000000 ffff ffff ffff ffff ffff ffff ffff ffff\n\t\t*\n\t\t0001000\n\t\t*/\n\t\tpr_err(\"mhi_pci is not alive! pcie link is down\\n\");\n\t\tpr_err(\"double check by 'hexdump /sys/bus/pci/devices/%s/config'\\n\", dev_name(&pci_dev->dev));\n\t\treturn -EIO;\n\t}\n\n\t/* see if we already registered */\n\tmhi_cntrl = mhi_bdf_to_controller(domain, bus, slot, dev_id);\n\tif (!mhi_cntrl)\n\t\tmhi_cntrl = mhi_register_controller(pci_dev);\n\n\tif (IS_ERR(mhi_cntrl))\n\t\treturn PTR_ERR(mhi_cntrl);\n\n\tmhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\tmhi_dev->powered_on = true;\n\n\tmhi_arch_iommu_init(mhi_cntrl);\n\n\tret = mhi_arch_pcie_init(mhi_cntrl);\n\tif (ret)\n\t\tgoto error_init_pci_arch;\n\n\tmhi_cntrl->dev = &pci_dev->dev;\n\tret = mhi_init_pci_dev(mhi_cntrl);\n\tif (ret)\n\t\tgoto error_init_pci;\n\n\t/* start power up sequence */\n\tif (!debug_mode) {\n\t\tret = mhi_power_up(mhi_cntrl);\n\t\tif (ret)\n\t\t\tgoto error_power_up;\n\t}\n\n\tpm_runtime_mark_last_busy(&pci_dev->dev);\n\n\tmhi_pci_show_link(mhi_cntrl, pci_dev);\n\n#ifdef QCOM_AP_AND_EFUSE_PCIE_SLEEP\n\t{\n\t\tstruct msm_pcie_register_event *pcie_event = &mhi_pcie_events[mhi_cntrl->cntrl_idx];\n\n\t\tpcie_event->events = MSM_PCIE_EVENT_WAKEUP;\n#if (LINUX_VERSION_CODE > KERNEL_VERSION( 4,14,117 ))\n\t\tpcie_event->pcie_event.user = pci_dev;\n\t\tpcie_event->pcie_event.mode = MSM_PCIE_TRIGGER_CALLBACK;\n\t\tpcie_event->pcie_event.callback = mhi_pci_event_cb;\n#else\n\t\tpcie_event->user = pci_dev;\n\t\tpcie_event->mode = MSM_PCIE_TRIGGER_CALLBACK;\n\t\tpcie_event->callback = mhi_pci_event_cb;\n#endif\n\n\t\tret = msm_pcie_register_event(pcie_event);\n\t\tif (ret) {\n\t\t\tMHI_LOG(\"Failed to register for PCIe event\");\n\t\t}\n\t}\n#endif\n\n\tMHI_LOG(\"Return successful\\n\");\n\n\treturn 0;\n\n\tmhi_unregister_mhi_controller(mhi_cntrl);\nerror_power_up:\n\tmhi_deinit_pci_dev(mhi_cntrl);\n\nerror_init_pci:\n\tmhi_arch_pcie_deinit(mhi_cntrl);\nerror_init_pci_arch:\n\tmhi_arch_iommu_deinit(mhi_cntrl);\n\n\treturn ret;\n}\n\nvoid mhi_pci_device_removed(struct pci_dev *pci_dev)\n{\n\tstruct mhi_controller *mhi_cntrl;\n\tu32 domain = pci_domain_nr(pci_dev->bus);\n\tu32 bus = pci_dev->bus->number;\n\tu32 dev_id = pci_dev->device;\n\tu32 slot = PCI_SLOT(pci_dev->devfn);\n\n\tmhi_cntrl = mhi_bdf_to_controller(domain, bus, slot, dev_id);\n\n\tif (mhi_cntrl) {\n\n\t\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\n#ifdef QCOM_AP_AND_EFUSE_PCIE_SLEEP\n\t\t{\n\t\t\tstruct msm_pcie_register_event *pcie_event = &mhi_pcie_events[mhi_cntrl->cntrl_idx];\n\n\t\t\tmsm_pcie_deregister_event(pcie_event);\n\t\t}\n#endif\n\n\t\tpm_stay_awake(&mhi_cntrl->mhi_dev->dev);\n\n\t\t/* if link is in drv suspend, wake it up */\n\t\tpm_runtime_get_sync(&pci_dev->dev);\n\n\t\tmutex_lock(&mhi_cntrl->pm_mutex);\n\t\tif (!mhi_dev->powered_on) {\n\t\t\tMHI_LOG(\"Not in active state\\n\");\n\t\t\tmutex_unlock(&mhi_cntrl->pm_mutex);\n\t\t\tpm_runtime_put_noidle(&pci_dev->dev);\n\t\t\treturn;\n\t\t}\n\t\tmhi_dev->powered_on = false;\n\t\tmutex_unlock(&mhi_cntrl->pm_mutex);\n\n\t\tpm_runtime_put_noidle(&pci_dev->dev);\n\n\t\tMHI_LOG(\"Triggering shutdown process\\n\");\n\t\tmhi_power_down(mhi_cntrl, false);\n\n\t\t/* turn the link off */\n\t\tmhi_deinit_pci_dev(mhi_cntrl);\n\t\tmhi_arch_link_off(mhi_cntrl, false);\n\n\t\tmhi_arch_pcie_deinit(mhi_cntrl);\n\t\tmhi_arch_iommu_deinit(mhi_cntrl);\n\n\t\tpm_relax(&mhi_cntrl->mhi_dev->dev);\n\n\t\tmhi_unregister_mhi_controller(mhi_cntrl);\n\t}\n}\n\nstatic const struct dev_pm_ops pm_ops = {\n\tSET_RUNTIME_PM_OPS(mhi_runtime_suspend,\n\t\t\t   mhi_runtime_resume,\n\t\t\t   mhi_runtime_idle)\n\tSET_SYSTEM_SLEEP_PM_OPS(mhi_system_suspend, mhi_system_resume)\n};\n\nstatic struct pci_device_id mhi_pcie_device_id[] = {\n\t{PCI_DEVICE(MHI_PCIE_VENDOR_ID, 0x0303)},\n\t{PCI_DEVICE(MHI_PCIE_VENDOR_ID, 0x0304)}, //SDX20\n\t{PCI_DEVICE(MHI_PCIE_VENDOR_ID, 0x0305)}, //SDX24\n\t{PCI_DEVICE(MHI_PCIE_VENDOR_ID, 0x0306)}, //SDX55\n\t{PCI_DEVICE(MHI_PCIE_VENDOR_ID, 0x0308)}, //SDX62\n\t{PCI_DEVICE(MHI_PCIE_VENDOR_ID, 0x011a)}, //SDX35\n\t{PCI_DEVICE(MHI_PCIE_VENDOR_ID, 0x0309)}, //SDX7X\n\t{PCI_DEVICE(PCI_VENDOR_ID_FOXCONN, 0xe0f5)}, //FOXCONN SDX6X\n\t{PCI_DEVICE(0x1eac, 0x1001)}, //EM120\n\t{PCI_DEVICE(0x1eac, 0x1002)}, //EM160\n\t{PCI_DEVICE(0x1eac, 0x1004)}, //RM520\n\t{PCI_DEVICE(0x1eac, 0x100b)}, //RM255\n\t{PCI_DEVICE(0x03f0, 0x0a6c)}, //T99W175 (sdx55), HP variant\n\t{PCI_DEVICE(MHI_PCIE_VENDOR_ID, MHI_PCIE_DEBUG_ID)},\n\t{0},\n};\n\nMODULE_DEVICE_TABLE(pci, mhi_pcie_device_id);\n\nstatic struct pci_driver mhi_pcie_driver = {\n\t.name = \"mhi_q\",\n\t.id_table = mhi_pcie_device_id,\n\t.probe = mhi_pci_probe,\n\t.remove = mhi_pci_device_removed,\n\t.driver = {\n\t\t.pm = &pm_ops\n\t}\n};\n\n#if 0\nmodule_pci_driver(mhi_pcie_driver);\n#else\nint __init mhi_controller_qcom_init(void)\n{\n\treturn pci_register_driver(&mhi_pcie_driver);\n};\n\nvoid mhi_controller_qcom_exit(void)\n{\n\tpr_info(\"%s enter\\n\", __func__);\n\tpci_unregister_driver(&mhi_pcie_driver);\n\tpr_info(\"%s exit\\n\", __func__);\n}\n\n#ifdef QCOM_AP_SDM845_IOMMU_MAP\nstruct dma_iommu_mapping *mhi_smmu_mapping[MAX_MHI];\n\n#define SMMU_BASE 0x10000000\n#define SMMU_SIZE  0x40000000\nstatic struct dma_iommu_mapping * sdm845_smmu_init(struct pci_dev *pdev) {\n\tint ret = 0;\n\tint atomic_ctx = 1;\n\tint s1_bypass = 1;\n\tstruct dma_iommu_mapping *mapping;\n\n\tmapping = arm_iommu_create_mapping(&platform_bus_type, SMMU_BASE, SMMU_SIZE);\n\tif (IS_ERR(mapping)) {\n\t\tret = PTR_ERR(mapping);\n\t\tdev_err(&pdev->dev, \"Create mapping failed, err = %d\\n\", ret);\n\t\treturn NULL;\n\t}\n\n\tret = iommu_domain_set_attr(mapping->domain, DOMAIN_ATTR_ATOMIC, &atomic_ctx);\n\tif (ret < 0) {\n\t\tdev_err(&pdev->dev, \"Set atomic_ctx attribute failed, err = %d\\n\", ret);\n\t\tgoto set_attr_fail;\n\t}\n\n\tret = iommu_domain_set_attr(mapping->domain, DOMAIN_ATTR_S1_BYPASS, &s1_bypass);\n\tif (ret < 0) {\n\t\tdev_err(&pdev->dev, \"Set s1_bypass attribute failed, err = %d\\n\", ret);\n\t\tarm_iommu_release_mapping(mapping);\n\t\tgoto set_attr_fail;\n\t}\n\n\tret = arm_iommu_attach_device(&pdev->dev, mapping);\n\t\tif (ret < 0) {\n\t\tdev_err(&pdev->dev, \"Attach device failed, err = %d\\n\", ret);\n\t\tgoto attach_fail;\n\t}\n\n\treturn mapping;\n\nattach_fail:\nset_attr_fail:\n\tarm_iommu_release_mapping(mapping);\n\treturn NULL;    \n}\n#endif\n\nint mhi_arch_iommu_init(struct mhi_controller *mhi_cntrl)\n{\n#ifdef QCOM_AP_SDM845_IOMMU_MAP\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\n\tmhi_smmu_mapping[mhi_cntrl->cntrl_idx] = sdm845_smmu_init(mhi_dev->pci_dev);\n#endif\n\n    return 0;\n}\n\nvoid mhi_arch_iommu_deinit(struct mhi_controller *mhi_cntrl)\n{\n#ifdef QCOM_AP_SDM845_IOMMU_MAP\n\tif (mhi_smmu_mapping[mhi_cntrl->cntrl_idx]) {\n\t\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\n\t\tarm_iommu_detach_device(&mhi_dev->pci_dev->dev);\n\t\tarm_iommu_release_mapping(mhi_smmu_mapping[mhi_cntrl->cntrl_idx]);\n\t\tmhi_smmu_mapping[mhi_cntrl->cntrl_idx] = NULL;\n\t}\n#endif\n}\n\nstatic int mhi_arch_set_bus_request(struct mhi_controller *mhi_cntrl, int index)\n{\n\tMHI_LOG(\"Setting bus request to index %d\\n\", index);\n\treturn 0;\n}\n\nint mhi_arch_pcie_init(struct mhi_controller *mhi_cntrl)\n{\n#ifdef QCOM_AP_AND_EFUSE_PCIE_SLEEP\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\tstruct arch_info *arch_info = mhi_dev->arch_info;\n\n\tif (!arch_info) {\n\t\tarch_info = devm_kzalloc(&mhi_dev->pci_dev->dev,\n\t\t\t\t\t sizeof(*arch_info), GFP_KERNEL);\n\t\tif (!arch_info)\n\t\t\treturn -ENOMEM;\n\n\t\tmhi_dev->arch_info = arch_info;\n\n\t\t/* save reference state for pcie config space */\n\t\tarch_info->ref_pcie_state = pci_store_saved_state(\n\t\t\t\t\t\t\tmhi_dev->pci_dev);\n\t}\n#endif\n\n\treturn mhi_arch_set_bus_request(mhi_cntrl, 1);\n}\n\nvoid mhi_arch_pcie_deinit(struct mhi_controller *mhi_cntrl)\n{\n\tmhi_arch_set_bus_request(mhi_cntrl, 0);\n}\n\nint mhi_arch_platform_init(struct mhi_dev *mhi_dev)\n{\n\treturn 0;\n}\n\nvoid mhi_arch_platform_deinit(struct mhi_dev *mhi_dev)\n{\n}\n\nint mhi_arch_link_off(struct mhi_controller *mhi_cntrl,\n\t\t\t\t    bool graceful)\n{\n#ifdef QCOM_AP_AND_EFUSE_PCIE_SLEEP\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\tstruct arch_info *arch_info = mhi_dev->arch_info;\n\tstruct pci_dev *pci_dev = mhi_dev->pci_dev;\n\tint ret;\n\n\tMHI_LOG(\"Entered\\n\");\n\n\tif (graceful) {\n\t\tpci_clear_master(pci_dev);\n\t\tret = pci_save_state(mhi_dev->pci_dev);\n\t\tif (ret) {\n\t\t\tMHI_ERR(\"Failed with pci_save_state, ret:%d\\n\", ret);\n\t\t\treturn ret;\n\t\t}\n\n\t\tarch_info->pcie_state = pci_store_saved_state(pci_dev);\n\t\tpci_disable_device(pci_dev);\n\t}\n\n\t/*\n\t * We will always attempt to put link into D3hot, however\n\t * link down may have happened due to error fatal, so\n\t * ignoring the return code\n\t */\n\tpci_set_power_state(pci_dev, PCI_D3hot);\n\n\tret = msm_pcie_pm_control(MSM_PCIE_SUSPEND, mhi_cntrl->bus, pci_dev,\n\t\t\t\t    NULL, 0);\n\tMHI_ERR(\"msm_pcie_pm_control(MSM_PCIE_SUSPEND), ret:%d\\n\", ret);\n\n\t/* release the resources */\n\tmhi_arch_set_bus_request(mhi_cntrl, 0);\n\n\tMHI_LOG(\"Exited\\n\");\n#endif\n\n\treturn 0;\n}\n\nint mhi_arch_link_on(struct mhi_controller *mhi_cntrl)\n{\n#ifdef QCOM_AP_AND_EFUSE_PCIE_SLEEP\n\tstruct mhi_dev *mhi_dev = mhi_controller_get_devdata(mhi_cntrl);\n\tstruct arch_info *arch_info = mhi_dev->arch_info;\n\tstruct pci_dev *pci_dev = mhi_dev->pci_dev;\n\tint ret;\n\n\tMHI_LOG(\"Entered\\n\");\n\n\t/* request resources and establish link trainning */\n\tret = mhi_arch_set_bus_request(mhi_cntrl, 1);\n\tif (ret)\n\t\tMHI_LOG(\"Could not set bus frequency, ret:%d\\n\", ret);\n\n\tret = msm_pcie_pm_control(MSM_PCIE_RESUME, mhi_cntrl->bus, pci_dev,\n\t\t\t\t  NULL, 0);\n\tMHI_LOG(\"msm_pcie_pm_control(MSM_PCIE_RESUME), ret:%d\\n\", ret);\n\tif (ret) {\n\t\tMHI_ERR(\"Link training failed, ret:%d\\n\", ret);\n\t\treturn ret;\n\t}\n\n\tret = pci_set_power_state(pci_dev, PCI_D0);\n\tif (ret) {\n\t\tMHI_ERR(\"Failed to set PCI_D0 state, ret:%d\\n\", ret);\n\t\treturn ret;\n\t}\n\n\tret = pci_enable_device(pci_dev);\n\tif (ret) {\n\t\tMHI_ERR(\"Failed to enable device, ret:%d\\n\", ret);\n\t\treturn ret;\n\t}\n\n\tret = pci_load_and_free_saved_state(pci_dev, &arch_info->pcie_state);\n\tif (ret)\n\t\tMHI_LOG(\"Failed to load saved cfg state\\n\");\n\n\tpci_restore_state(pci_dev);\n\tpci_set_master(pci_dev);\n\n\tMHI_LOG(\"Exited\\n\");\n#endif\n\n\treturn 0;\n}\n#endif\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/controllers/mhi_qti.h",
    "content": "/* SPDX-License-Identifier: GPL-2.0-only */\n/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.*/\n\n#ifndef _MHI_QTI_\n#define _MHI_QTI_\n\n/* iova cfg bitmask */\n#define MHI_SMMU_ATTACH BIT(0)\n#define MHI_SMMU_S1_BYPASS BIT(1)\n#define MHI_SMMU_FAST BIT(2)\n#define MHI_SMMU_ATOMIC BIT(3)\n#define MHI_SMMU_FORCE_COHERENT BIT(4)\n\n#define MHI_PCIE_VENDOR_ID (0x17cb)\n#ifndef PCI_VENDOR_ID_FOXCONN\n#define PCI_VENDOR_ID_FOXCONN 0x105b\n#endif\n#define MHI_PCIE_DEBUG_ID (0xffff)\n\n/* runtime suspend timer */\n#define MHI_RPM_SUSPEND_TMR_MS (2000)\n#define MHI_PCI_BAR_NUM (0)\n\nstruct mhi_dev {\n\tstruct pci_dev *pci_dev;\n\tu32 smmu_cfg;\n\tint resn;\n\tvoid *arch_info;\n\tbool powered_on;\n\tdma_addr_t iova_start;\n\tdma_addr_t iova_stop;\n\tbool lpm_disabled;\n};\n\nvoid mhi_deinit_pci_dev(struct mhi_controller *mhi_cntrl);\nint mhi_pci_probe(struct pci_dev *pci_dev,\n\t\t  const struct pci_device_id *device_id);\n\nvoid mhi_pci_device_removed(struct pci_dev *pci_dev);\nint mhi_arch_pcie_init(struct mhi_controller *mhi_cntrl);\nvoid mhi_arch_pcie_deinit(struct mhi_controller *mhi_cntrl);\nint mhi_arch_iommu_init(struct mhi_controller *mhi_cntrl);\nvoid mhi_arch_iommu_deinit(struct mhi_controller *mhi_cntrl);\nint mhi_arch_link_off(struct mhi_controller *mhi_cntrl, bool graceful);\nint mhi_arch_link_on(struct mhi_controller *mhi_cntrl);\n\n#endif /* _MHI_QTI_ */\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/core/Makefile",
    "content": "obj-$(CONFIG_MHI_BUS) +=mhi_init.o mhi_main.o mhi_pm.o mhi_boot.o mhi_dtr.o\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/core/mhi.h",
    "content": "/* SPDX-License-Identifier: GPL-2.0-only */\n/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. */\n\n#ifndef _MHI_H_\n#define _MHI_H_\n\n#define PCIE_MHI_DRIVER_VERSION \"V1.3.8\"\n#define ENABLE_MHI_MON\n//#define ENABLE_IP_SW0\n\n// #define ENABLE_ADPL\n\n// #define ENABLE_QDSS\n\n#include <linux/miscdevice.h>\ntypedef enum\n{\n   MHI_CLIENT_LOOPBACK_OUT     = 0,\n   MHI_CLIENT_LOOPBACK_IN      = 1,\n   MHI_CLIENT_SAHARA_OUT       = 2,\n   MHI_CLIENT_SAHARA_IN        = 3,\n   MHI_CLIENT_DIAG_OUT         = 4,\n   MHI_CLIENT_DIAG_IN          = 5,\n   MHI_CLIENT_SSR_OUT          = 6,\n   MHI_CLIENT_SSR_IN           = 7,\n   MHI_CLIENT_QDSS_OUT         = 8,\n   MHI_CLIENT_QDSS_IN          = 9,\n   MHI_CLIENT_EFS_OUT          = 10,\n   MHI_CLIENT_EFS_IN           = 11,\n   MHI_CLIENT_MBIM_OUT         = 12,\n   MHI_CLIENT_MBIM_IN          = 13,\n   MHI_CLIENT_QMI_OUT          = 14,\n   MHI_CLIENT_QMI_IN           = 15,\n   MHI_CLIENT_QMI_2_OUT        = 16,\n   MHI_CLIENT_QMI_2_IN         = 17,\n   MHI_CLIENT_IP_CTRL_1_OUT    = 18,\n   MHI_CLIENT_IP_CTRL_1_IN     = 19,\n   MHI_CLIENT_IPCR_OUT         = 20,\n   MHI_CLIENT_IPCR_IN          = 21,\n   MHI_CLIENT_TEST_FW_OUT      = 22,\n   MHI_CLIENT_TEST_FW_IN       = 23,\n   MHI_CLIENT_RESERVED_0       = 24,\n   MHI_CLIENT_BOOT_LOG_IN      = 25,\n   MHI_CLIENT_DCI_OUT          = 26,\n   MHI_CLIENT_DCI_IN           = 27,\n   MHI_CLIENT_QBI_OUT          = 28,\n   MHI_CLIENT_QBI_IN           = 29,\n   MHI_CLIENT_RESERVED_1_LOWER = 30,\n   MHI_CLIENT_RESERVED_1_UPPER = 31,\n   MHI_CLIENT_DUN_OUT          = 32,\n   MHI_CLIENT_DUN_IN           = 33,\n   MHI_CLIENT_EDL_OUT          = 34,\n   MHI_CLIENT_EDL_IN           = 35,\n   MHI_CLIENT_ADB_FB_OUT       = 36,\n   MHI_CLIENT_ADB_FB_IN        = 37,\n   MHI_CLIENT_RESERVED_2_LOWER = 38,\n   MHI_CLIENT_RESERVED_2_UPPER = 41,\n   MHI_CLIENT_CSVT_OUT         = 42,\n   MHI_CLIENT_CSVT_IN          = 43,\n   MHI_CLIENT_SMCT_OUT         = 44,\n   MHI_CLIENT_SMCT_IN          = 45,\n   MHI_CLIENT_IP_SW_0_OUT      = 46,\n   MHI_CLIENT_IP_SW_0_IN       = 47,\n   MHI_CLIENT_IP_SW_1_OUT      = 48,\n   MHI_CLIENT_IP_SW_1_IN       = 49,\n   MHI_CLIENT_RESERVED_3_LOWER = 50,\n   MHI_CLIENT_RESERVED_3_UPPER = 59,\n   MHI_CLIENT_TEST_0_OUT       = 60,\n   MHI_CLIENT_TEST_0_IN        = 61,\n   MHI_CLIENT_TEST_1_OUT       = 62,\n   MHI_CLIENT_TEST_1_IN        = 63,\n   MHI_CLIENT_TEST_2_OUT       = 64,\n   MHI_CLIENT_TEST_2_IN        = 65,\n   MHI_CLIENT_TEST_3_OUT       = 66,\n   MHI_CLIENT_TEST_3_IN        = 67,\n   MHI_CLIENT_RESERVED_4_LOWER = 68,\n   MHI_CLIENT_RESERVED_4_UPPER = 91,\n   MHI_CLIENT_OEM_0_OUT        = 92,\n   MHI_CLIENT_OEM_0_IN         = 93,\n   MHI_CLIENT_OEM_1_OUT        = 94,\n   MHI_CLIENT_OEM_1_IN         = 95,\n   MHI_CLIENT_OEM_2_OUT        = 96,\n   MHI_CLIENT_OEM_2_IN         = 97,\n   MHI_CLIENT_OEM_3_OUT        = 98,\n   MHI_CLIENT_OEM_3_IN         = 99,\n   MHI_CLIENT_IP_HW_0_OUT      = 100,\n   MHI_CLIENT_IP_HW_0_IN       = 101,\n   MHI_CLIENT_ADPL             = 102,\n   MHI_CLIENT_IP_HW_QDSS       = 103,\n   // MHI_CLIENT_RESERVED_5_LOWER = 103,\n   MHI_CLIENT_RESERVED_5_UPPER = 127,\n   MHI_MAX_CHANNELS            = 128\n}MHI_CLIENT_CHANNEL_TYPE;\n\n/* Event Ring Index */\ntypedef enum\n{\n\tSW_EVT_RING       = 0,\n\tPRIMARY_EVENT_RING = SW_EVT_RING,\n#ifdef ENABLE_IP_SW0\n\tSW_0_OUT_EVT_RING,\n\tSW_0_IN_EVT_RING,\n#endif\n\tIPA_OUT_EVENT_RING,\n\tIPA_IN_EVENT_RING,\n#ifdef ENABLE_ADPL\n\tADPL_EVT_RING,\n#endif\n#ifdef ENABLE_QDSS\n\tQDSS_EVT_RING,\n#endif\n\n\tMAX_EVT_RING_IDX\n}MHI_EVT_RING_IDX;\n\n#define MHI_VERSION                  0x01000000\n#define MHIREGLEN_VALUE              0x100 /* **** WRONG VALUE *** */\n#define MHI_MSI_INDEX                1\n#define MAX_NUM_MHI_DEVICES          1\n#define NUM_MHI_XFER_RINGS           128\n#define NUM_MHI_EVT_RINGS            MAX_EVT_RING_IDX\n#define NUM_MHI_HW_EVT_RINGS         4\n#define NUM_MHI_XFER_RING_ELEMENTS   16\n#define NUM_MHI_EVT_RING_ELEMENTS    (NUM_MHI_IPA_IN_RING_ELEMENTS*2) //must *2, event ring full will make x55 dump\n#define NUM_MHI_IPA_IN_RING_ELEMENTS    512\n#define NUM_MHI_IPA_OUT_RING_ELEMENTS    512 //donot use ul agg, so increase\n#define NUM_MHI_DIAG_IN_RING_ELEMENTS    128\n#define NUM_MHI_SW_IP_RING_ELEMENTS    512\n\n#ifdef ENABLE_ADPL\n#define NUM_MHI_ADPL_RING_ELEMENTS    256\n#endif\n\n#ifdef ENABLE_QDSS\n#define NUM_MHI_QDSS_RING_ELEMENTS    256\n#endif\n\n/*\n* for if set Interrupt moderation time as 1ms,\nand transfer more than NUM_MHI_CHAN_RING_ELEMENTS data are sent to the modem in 1ms.\ne.g. firehose upgrade.\nmodem will not trigger irq for these transfer.\n*/\n#define NUM_MHI_CHAN_RING_ELEMENTS    32 //8\n#define MHI_EVT_CMD_QUEUE_SIZE       160\n#define MHI_EVT_STATE_QUEUE_SIZE     128\n#define MHI_EVT_XFER_QUEUE_SIZE      1024\n\n#define CHAN_INBOUND(_x)   ((_x)%2)\n\n#define CHAN_SBL(_x)       (((_x) == MHI_CLIENT_SAHARA_OUT)   ||  \\\n                            ((_x) == MHI_CLIENT_SAHARA_IN)    ||  \\\n                            ((_x) == MHI_CLIENT_BOOT_LOG_IN))\n\n#define CHAN_EDL(_x)       (((_x) == MHI_CLIENT_EDL_OUT)   ||  \\\n                            ((_x) == MHI_CLIENT_EDL_IN))\n               \nstruct mhi_chan;\nstruct mhi_event;\nstruct mhi_ctxt;\nstruct mhi_cmd;\nstruct image_info;\nstruct bhi_vec_entry;\nstruct mhi_timesync;\nstruct mhi_buf_info;\n\n/**\n * enum MHI_CB - MHI callback\n * @MHI_CB_IDLE: MHI entered idle state\n * @MHI_CB_PENDING_DATA: New data available for client to process\n * @MHI_CB_LPM_ENTER: MHI host entered low power mode\n * @MHI_CB_LPM_EXIT: MHI host about to exit low power mode\n * @MHI_CB_EE_RDDM: MHI device entered RDDM execution enviornment\n * @MHI_CB_EE_MISSION_MODE: MHI device entered Mission Mode exec env\n * @MHI_CB_SYS_ERROR: MHI device enter error state (may recover)\n * @MHI_CB_FATAL_ERROR: MHI device entered fatal error\n */\nenum MHI_CB {\n\tMHI_CB_IDLE,\n\tMHI_CB_PENDING_DATA,\n\tMHI_CB_LPM_ENTER,\n\tMHI_CB_LPM_EXIT,\n\tMHI_CB_EE_RDDM,\n\tMHI_CB_EE_MISSION_MODE,\n\tMHI_CB_SYS_ERROR,\n\tMHI_CB_FATAL_ERROR,\n};\n\n/**\n * enum MHI_DEBUG_LEVL - various debugging level\n */\nenum MHI_DEBUG_LEVEL {\n\tMHI_MSG_LVL_VERBOSE,\n\tMHI_MSG_LVL_INFO,\n\tMHI_MSG_LVL_ERROR,\n\tMHI_MSG_LVL_CRITICAL,\n\tMHI_MSG_LVL_MASK_ALL,\n};\n\n/*\nGSI_XFER_FLAG_BEI: Block event interrupt\n1: Event generated by this ring element must not assert an interrupt to the host\n0: Event generated by this ring element must assert an interrupt to the host\n\nGSI_XFER_FLAG_EOT: Interrupt on end of transfer\n1: If an EOT condition is encountered when processing this ring element, an event is generated by the device with its completion code set to EOT.\n0: If an EOT condition is encountered for this ring element, a completion event is not be generated by the device, unless IEOB is 1\n\nGSI_XFER_FLAG_EOB: Interrupt on end of block\n1: Device notifies host after processing this ring element by sending a completion event\n0: Completion event is not required after processing this ring element\n\nGSI_XFER_FLAG_CHAIN: Chain bit that identifies the ring elements in a TD\n*/\n\n/**\n * enum MHI_FLAGS - Transfer flags\n * @MHI_EOB: End of buffer for bulk transfer\n * @MHI_EOT: End of transfer\n * @MHI_CHAIN: Linked transfer\n */\nenum MHI_FLAGS {\n\tMHI_EOB,\n\tMHI_EOT,\n\tMHI_CHAIN,\n};\n\n/**\n * enum mhi_device_type - Device types\n * @MHI_XFER_TYPE: Handles data transfer\n * @MHI_TIMESYNC_TYPE: Use for timesync feature\n * @MHI_CONTROLLER_TYPE: Control device\n */\nenum mhi_device_type {\n\tMHI_XFER_TYPE,\n\tMHI_TIMESYNC_TYPE,\n\tMHI_CONTROLLER_TYPE,\n};\n\n/**\n * enum mhi_ee - device current execution enviornment\n * @MHI_EE_PBL - device in PBL\n * @MHI_EE_SBL - device in SBL\n * @MHI_EE_AMSS - device in mission mode (firmware fully loaded)\n * @MHI_EE_RDDM - device in ram dump collection mode\n * @MHI_EE_WFW - device in WLAN firmware mode\n * @MHI_EE_PTHRU - device in PBL but configured in pass thru mode\n * @MHI_EE_EDL - device in emergency download mode\n */\nenum mhi_ee {\n\tMHI_EE_PBL = 0x0,\n\tMHI_EE_SBL = 0x1,\n\tMHI_EE_AMSS = 0x2,\n\tMHI_EE_RDDM = 0x3,\n\tMHI_EE_WFW = 0x4,\n\tMHI_EE_PTHRU = 0x5,\n\tMHI_EE_EDL = 0x6,\n\tMHI_EE_FP   = 0x7,            /* FlashProg, Flash Programmer Environment                            */\n\tMHI_EE_MAX_SUPPORTED = MHI_EE_FP,\n\tMHI_EE_DISABLE_TRANSITION, /* local EE, not related to mhi spec */\n\tMHI_EE_MAX,\n};\n\n/**\n * enum mhi_dev_state - device current MHI state\n */\nenum mhi_dev_state {\n\tMHI_STATE_RESET = 0x0,\n\tMHI_STATE_READY = 0x1,\n\tMHI_STATE_M0 = 0x2,\n\tMHI_STATE_M1 = 0x3,\n\tMHI_STATE_M2 = 0x4,\n\tMHI_STATE_M3 = 0x5,\n\tMHI_STATE_BHI  = 0x7,\n\tMHI_STATE_SYS_ERR  = 0xFF,\n\tMHI_STATE_MAX,\n};\n\nextern const char * const mhi_ee_str[MHI_EE_MAX];\n#define TO_MHI_EXEC_STR(ee) (((ee) >= MHI_EE_MAX) ? \\\n\t\t\t     \"INVALID_EE\" : mhi_ee_str[ee])\n\n/**\n * struct image_info - firmware and rddm table table\n * @mhi_buf - Contain device firmware and rddm table\n * @entries - # of entries in table\n */\nstruct image_info {\n\tstruct mhi_buf *mhi_buf;\n\tstruct bhi_vec_entry *bhi_vec;\n\tu32 entries;\n};\n\n/**\n * struct mhi_controller - Master controller structure for external modem\n * @dev: Device associated with this controller\n * @of_node: DT that has MHI configuration information\n * @regs: Points to base of MHI MMIO register space\n * @bhi: Points to base of MHI BHI register space\n * @bhie: Points to base of MHI BHIe register space\n * @wake_db: MHI WAKE doorbell register address\n * @dev_id: PCIe device id of the external device\n * @domain: PCIe domain the device connected to\n * @bus: PCIe bus the device assigned to\n * @slot: PCIe slot for the modem\n * @iova_start: IOMMU starting address for data\n * @iova_stop: IOMMU stop address for data\n * @fw_image: Firmware image name for normal booting\n * @edl_image: Firmware image name for emergency download mode\n * @fbc_download: MHI host needs to do complete image transfer\n * @rddm_size: RAM dump size that host should allocate for debugging purpose\n * @sbl_size: SBL image size\n * @seg_len: BHIe vector size\n * @fbc_image: Points to firmware image buffer\n * @rddm_image: Points to RAM dump buffer\n * @max_chan: Maximum number of channels controller support\n * @mhi_chan: Points to channel configuration table\n * @lpm_chans: List of channels that require LPM notifications\n * @total_ev_rings: Total # of event rings allocated\n * @hw_ev_rings: Number of hardware event rings\n * @sw_ev_rings: Number of software event rings\n * @msi_required: Number of msi required to operate\n * @msi_allocated: Number of msi allocated by bus master\n * @irq: base irq # to request\n * @mhi_event: MHI event ring configurations table\n * @mhi_cmd: MHI command ring configurations table\n * @mhi_ctxt: MHI device context, shared memory between host and device\n * @timeout_ms: Timeout in ms for state transitions\n * @pm_state: Power management state\n * @ee: MHI device execution environment\n * @dev_state: MHI STATE\n * @status_cb: CB function to notify various power states to but master\n * @link_status: Query link status in case of abnormal value read from device\n * @runtime_get: Async runtime resume function\n * @runtimet_put: Release votes\n * @time_get: Return host time in us\n * @lpm_disable: Request controller to disable link level low power modes\n * @lpm_enable: Controller may enable link level low power modes again\n * @priv_data: Points to bus master's private data\n */\nstruct mhi_controller {\n\tstruct list_head node;\n\tstruct mhi_device *mhi_dev;\n\n\t/* device node for iommu ops */\n\tstruct device *dev;\n\tstruct device_node *of_node;\n\n\t/* mmio base */\n\tphys_addr_t base_addr;\n\tvoid __iomem *regs;\n\tvoid __iomem *bhi;\n\tvoid __iomem *bhie;\n\tvoid __iomem *wake_db;\n\n\t/* device topology */\n\tu32 vendor;\n\tu32 dev_id;\n\tu32 domain;\n\tu32 bus;\n\tu32 slot;\n\tu32 cntrl_idx;  \n\tstruct device *cntrl_dev;\n\n\t/* addressing window */\n\tdma_addr_t iova_start;\n\tdma_addr_t iova_stop;\n\n\t/* fw images */\n\tconst char *fw_image;\n\tconst char *edl_image;\n\n\t/* mhi host manages downloading entire fbc images */\n\tbool fbc_download;\n\tsize_t rddm_size;\n\tsize_t sbl_size;\n\tsize_t seg_len;\n\tu32 session_id;\n\tu32 sequence_id;\n\tstruct image_info *fbc_image;\n\tstruct image_info *rddm_image;\n\n\t/* physical channel config data */\n\tu32 max_chan;\n\tstruct mhi_chan *mhi_chan;\n\tstruct list_head lpm_chans; /* these chan require lpm notification */\n\n\t/* physical event config data */\n\tu32 total_ev_rings;\n\tu32 hw_ev_rings;\n\tu32 sw_ev_rings;\n\tu32 msi_required;\n\tu32 msi_allocated;\n\tu32 msi_irq_base;\n\tint *irq; /* interrupt table */\n\tstruct mhi_event *mhi_event;\n\n\t/* cmd rings */\n\tstruct mhi_cmd *mhi_cmd;\n\n\t/* mhi context (shared with device) */\n\tstruct mhi_ctxt *mhi_ctxt;\n\n\tu32 timeout_ms;\n\n\t/* caller should grab pm_mutex for suspend/resume operations */\n\tstruct mutex pm_mutex;\n\tbool pre_init;\n\trwlock_t pm_lock;\n\tu32 pm_state;\n\tenum mhi_ee ee;\n\tenum mhi_dev_state dev_state;\n\tbool wake_set;\n\tatomic_t dev_wake;\n\tatomic_t alloc_size;\n\tatomic_t pending_pkts;\n\tstruct list_head transition_list;\n\tspinlock_t transition_lock;\n\tspinlock_t wlock;\n\n\t/* debug counters */\n\tu32 M0, M2, M3;\n\n\t/* worker for different state transitions */\n\tstruct work_struct st_worker;\n\tstruct work_struct fw_worker;\n\tstruct work_struct syserr_worker;\n\tstruct delayed_work ready_worker;\n\twait_queue_head_t state_event;\n\n\t/* shadow functions */\n\tvoid (*status_cb)(struct mhi_controller *mhi_cntrl, void *priv,\n\t\t\t  enum MHI_CB reason);\n\tint (*link_status)(struct mhi_controller *mhi_cntrl, void *priv);\n\tvoid (*wake_get)(struct mhi_controller *mhi_cntrl, bool override);\n\tvoid (*wake_put)(struct mhi_controller *mhi_cntrl, bool override);\n\tint (*runtime_get)(struct mhi_controller *mhi_cntrl, void *priv);\n\tvoid (*runtime_put)(struct mhi_controller *mhi_cntrl, void *priv);\n\tvoid (*runtime_mark_last_busy)(struct mhi_controller *mhi_cntrl, void *priv);\n\tu64 (*time_get)(struct mhi_controller *mhi_cntrl, void *priv);\n\tint (*lpm_disable)(struct mhi_controller *mhi_cntrl, void *priv);\n\tint (*lpm_enable)(struct mhi_controller *mhi_cntrl, void *priv);\n\tint (*map_single)(struct mhi_controller *mhi_cntrl,\n\t\t\t  struct mhi_buf_info *buf);\n\tvoid (*unmap_single)(struct mhi_controller *mhi_cntrl,\n\t\t\t     struct mhi_buf_info *buf);\n\n\t/* channel to control DTR messaging */\n\tstruct mhi_device *dtr_dev;\n\n\t/* bounce buffer settings */\n\tbool bounce_buf;\n\tsize_t buffer_len;\n\n\t/* supports time sync feature */\n\tstruct mhi_timesync *mhi_tsync;\n\tstruct mhi_device *tsync_dev;\n\n\t/* kernel log level */\n\tenum MHI_DEBUG_LEVEL klog_lvl;\n\tint klog_slient;\n\n\t/* private log level controller driver to set */\n\tenum MHI_DEBUG_LEVEL log_lvl;\n\n\t/* controller specific data */\n\tvoid *priv_data;\n\tvoid *log_buf;\n\tstruct dentry *dentry;\n\tstruct dentry *parent;\n\n\tstruct miscdevice miscdev;\n\n#ifdef ENABLE_MHI_MON\n\tspinlock_t lock;\n\n\t/* Ref */\n\tint nreaders;\t\t\t/* Under mon_lock AND mbus->lock */\n\tstruct list_head r_list;\t/* Chain of readers (usually one) */\n\tstruct kref ref;\t\t/* Under mon_lock */\n\n\t/* Stats */\n\tunsigned int cnt_events;\n\tunsigned int cnt_text_lost;\n#endif\n};\n\n#ifdef ENABLE_MHI_MON\nstruct mhi_tre;\nstruct mon_reader {\n\tstruct list_head r_link;\n\tstruct mhi_controller *m_bus;\n\tvoid *r_data;\t\t/* Use container_of instead? */\n\n\tvoid (*rnf_submit)(void *data, u32 chan, dma_addr_t wp, struct mhi_tre *mhi_tre, void *buf, size_t len);\n\tvoid (*rnf_receive)(void *data, u32 chan, dma_addr_t wp, struct mhi_tre *mhi_tre, void *buf, size_t len);\n\tvoid (*rnf_complete)(void *data, u32 chan, dma_addr_t wp, struct mhi_tre *mhi_tre);\n};\n#endif\n\n/**\n * struct mhi_device - mhi device structure associated bind to channel\n * @dev: Device associated with the channels\n * @mtu: Maximum # of bytes controller support\n * @ul_chan_id: MHI channel id for UL transfer\n * @dl_chan_id: MHI channel id for DL transfer\n * @tiocm: Device current terminal settings\n * @priv: Driver private data\n */\nstruct mhi_device {\n\tstruct device dev;\n\tu32 vendor;\n\tu32 dev_id;\n\tu32 domain;\n\tu32 bus;\n\tu32 slot;\n\tsize_t mtu;\n\tint ul_chan_id;\n\tint dl_chan_id;\n\tint ul_event_id;\n\tint dl_event_id;\n\tu32 tiocm;\n\tconst struct mhi_device_id *id;\n\tconst char *chan_name;\n\tstruct mhi_controller *mhi_cntrl;\n\tstruct mhi_chan *ul_chan;\n\tstruct mhi_chan *dl_chan;\n\tatomic_t dev_wake;\n\tenum mhi_device_type dev_type;\n\tvoid *priv_data;\n\tint (*ul_xfer)(struct mhi_device *mhi_dev, struct mhi_chan *mhi_chan,\n\t\t       void *buf, size_t len, enum MHI_FLAGS flags);\n\tint (*dl_xfer)(struct mhi_device *mhi_dev, struct mhi_chan *mhi_chan,\n\t\t       void *buf, size_t size, enum MHI_FLAGS flags);\n\tvoid (*status_cb)(struct mhi_device *mhi_dev, enum MHI_CB reason);\n};\n\n/**\n * struct mhi_result - Completed buffer information\n * @buf_addr: Address of data buffer\n * @dir: Channel direction\n * @bytes_xfer: # of bytes transferred\n * @transaction_status: Status of last trasnferred\n */\nstruct mhi_result {\n\tvoid *buf_addr;\n\tenum dma_data_direction dir;\n\tsize_t bytes_xferd;\n\tint transaction_status;\n};\n\n/**\n * struct mhi_buf - Describes the buffer\n * @page: buffer as a page\n * @buf: cpu address for the buffer\n * @phys_addr: physical address of the buffer\n * @dma_addr: iommu address for the buffer\n * @skb: skb of ip packet\n * @len: # of bytes\n * @name: Buffer label, for offload channel configurations name must be:\n * ECA - Event context array data\n * CCA - Channel context array data\n */\nstruct mhi_buf {\n\tstruct list_head node;\n\tstruct page *page;\n\tvoid *buf;\n\tphys_addr_t phys_addr;\n\tdma_addr_t dma_addr;\n\tstruct sk_buff *skb;\n\tsize_t len;\n\tconst char *name; /* ECA, CCA */\n};\n\n/**\n * struct mhi_driver - mhi driver information\n * @id_table: NULL terminated channel ID names\n * @ul_xfer_cb: UL data transfer callback\n * @dl_xfer_cb: DL data transfer callback\n * @status_cb: Asynchronous status callback\n */\nstruct mhi_driver {\n\tconst struct mhi_device_id *id_table;\n\tint (*probe)(struct mhi_device *mhi_dev,\n\t\t     const struct mhi_device_id *id);\n\tvoid (*remove)(struct mhi_device *mhi_dev);\n\tvoid (*ul_xfer_cb)(struct mhi_device *mhi_dev, struct mhi_result *res);\n\tvoid (*dl_xfer_cb)(struct mhi_device *mhi_dev, struct mhi_result *res);\n\tvoid (*status_cb)(struct mhi_device *mhi_dev, enum MHI_CB mhi_cb);\n\tstruct device_driver driver;\n};\n\n#define to_mhi_driver(drv) container_of(drv, struct mhi_driver, driver)\n#define to_mhi_device(dev) container_of(dev, struct mhi_device, dev)\n\nstatic inline void mhi_device_set_devdata(struct mhi_device *mhi_dev,\n\t\t\t\t\t  void *priv)\n{\n\tmhi_dev->priv_data = priv;\n}\n\nstatic inline void *mhi_device_get_devdata(struct mhi_device *mhi_dev)\n{\n\treturn mhi_dev->priv_data;\n}\n\n/**\n * mhi_queue_transfer - Queue a buffer to hardware\n * All transfers are asyncronous transfers\n * @mhi_dev: Device associated with the channels\n * @dir: Data direction\n * @buf: Data buffer (skb for hardware channels)\n * @len: Size in bytes\n * @mflags: Interrupt flags for the device\n */\nstatic inline int mhi_queue_transfer(struct mhi_device *mhi_dev,\n\t\t\t\t     enum dma_data_direction dir,\n\t\t\t\t     void *buf,\n\t\t\t\t     size_t len,\n\t\t\t\t     enum MHI_FLAGS mflags)\n{\n\tif (dir == DMA_TO_DEVICE)\n\t\treturn mhi_dev->ul_xfer(mhi_dev, mhi_dev->ul_chan, buf, len,\n\t\t\t\t\tmflags);\n\telse\n\t\treturn mhi_dev->dl_xfer(mhi_dev, mhi_dev->dl_chan, buf, len,\n\t\t\t\t\tmflags);\n}\n\nstatic inline void *mhi_controller_get_devdata(struct mhi_controller *mhi_cntrl)\n{\n\treturn mhi_cntrl->priv_data;\n}\n\nstatic inline void mhi_free_controller(struct mhi_controller *mhi_cntrl)\n{\n\tkfree(mhi_cntrl);\n}\n\n/**\n * mhi_driver_register - Register driver with MHI framework\n * @mhi_drv: mhi_driver structure\n */\nint mhi_driver_register(struct mhi_driver *mhi_drv);\n\n/**\n * mhi_driver_unregister - Unregister a driver for mhi_devices\n * @mhi_drv: mhi_driver structure\n */\nvoid mhi_driver_unregister(struct mhi_driver *mhi_drv);\n\n/**\n * mhi_device_configure - configure ECA or CCA context\n * For offload channels that client manage, call this\n * function to configure channel context or event context\n * array associated with the channel\n * @mhi_div: Device associated with the channels\n * @dir: Direction of the channel\n * @mhi_buf: Configuration data\n * @elements: # of configuration elements\n */\nint mhi_device_configure(struct mhi_device *mhi_div,\n\t\t\t enum dma_data_direction dir,\n\t\t\t struct mhi_buf *mhi_buf,\n\t\t\t int elements);\n\n/**\n * mhi_device_get - disable all low power modes\n * Only disables lpm, does not immediately exit low power mode\n * if controller already in a low power mode\n * @mhi_dev: Device associated with the channels\n */\nvoid mhi_device_get(struct mhi_device *mhi_dev);\n\n/**\n * mhi_device_get_sync - disable all low power modes\n * Synchronously disable all low power, exit low power mode if\n * controller already in a low power state\n * @mhi_dev: Device associated with the channels\n */\nint mhi_device_get_sync(struct mhi_device *mhi_dev);\n\n/**\n * mhi_device_put - re-enable low power modes\n * @mhi_dev: Device associated with the channels\n */\nvoid mhi_device_put(struct mhi_device *mhi_dev);\n\n/**\n * mhi_prepare_for_transfer - setup channel for data transfer\n * Moves both UL and DL channel from RESET to START state\n * @mhi_dev: Device associated with the channels\n */\nint mhi_prepare_for_transfer(struct mhi_device *mhi_dev);\n\n/**\n * mhi_unprepare_from_transfer -unprepare the channels\n * Moves both UL and DL channels to RESET state\n * @mhi_dev: Device associated with the channels\n */\nvoid mhi_unprepare_from_transfer(struct mhi_device *mhi_dev);\n\n/**\n * mhi_get_no_free_descriptors - Get transfer ring length\n * Get # of TD available to queue buffers\n * @mhi_dev: Device associated with the channels\n * @dir: Direction of the channel\n */\nint mhi_get_no_free_descriptors(struct mhi_device *mhi_dev,\n\t\t\t\tenum dma_data_direction dir);\n\n/**\n * mhi_poll - poll for any available data to consume\n * This is only applicable for DL direction\n * @mhi_dev: Device associated with the channels\n * @budget: In descriptors to service before returning\n */\nint mhi_poll(struct mhi_device *mhi_dev, u32 budget);\n\n/**\n * mhi_ioctl - user space IOCTL support for MHI channels\n * Native support for setting  TIOCM\n * @mhi_dev: Device associated with the channels\n * @cmd: IOCTL cmd\n * @arg: Optional parameter, iotcl cmd specific\n */\nlong mhi_ioctl(struct mhi_device *mhi_dev, unsigned int cmd, unsigned long arg);\n\n/**\n * mhi_alloc_controller - Allocate mhi_controller structure\n * Allocate controller structure and additional data for controller\n * private data. You may get the private data pointer by calling\n * mhi_controller_get_devdata\n * @size: # of additional bytes to allocate\n */\nstruct mhi_controller *mhi_alloc_controller(size_t size);\n\n/**\n * of_register_mhi_controller - Register MHI controller\n * Registers MHI controller with MHI bus framework. DT must be supported\n * @mhi_cntrl: MHI controller to register\n */\nint of_register_mhi_controller(struct mhi_controller *mhi_cntrl);\n\nvoid mhi_unregister_mhi_controller(struct mhi_controller *mhi_cntrl);\n\n/**\n * mhi_bdf_to_controller - Look up a registered controller\n * Search for controller based on device identification\n * @domain: RC domain of the device\n * @bus: Bus device connected to\n * @slot: Slot device assigned to\n * @dev_id: Device Identification\n */\nstruct mhi_controller *mhi_bdf_to_controller(u32 domain, u32 bus, u32 slot,\n\t\t\t\t\t     u32 dev_id);\n\n/**\n * mhi_prepare_for_power_up - Do pre-initialization before power up\n * This is optional, call this before power up if controller do not\n * want bus framework to automatically free any allocated memory during shutdown\n * process.\n * @mhi_cntrl: MHI controller\n */\nint mhi_prepare_for_power_up(struct mhi_controller *mhi_cntrl);\n\n/**\n * mhi_async_power_up - Starts MHI power up sequence\n * @mhi_cntrl: MHI controller\n */\nint mhi_async_power_up(struct mhi_controller *mhi_cntrl);\nint mhi_sync_power_up(struct mhi_controller *mhi_cntrl);\n\n/**\n * mhi_power_down - Start MHI power down sequence\n * @mhi_cntrl: MHI controller\n * @graceful: link is still accessible, do a graceful shutdown process otherwise\n * we will shutdown host w/o putting device into RESET state\n */\nvoid mhi_power_down(struct mhi_controller *mhi_cntrl, bool graceful);\n\n/**\n * mhi_unprepare_after_powre_down - free any allocated memory for power up\n * @mhi_cntrl: MHI controller\n */\nvoid mhi_unprepare_after_power_down(struct mhi_controller *mhi_cntrl);\n\n/**\n * mhi_pm_suspend - Move MHI into a suspended state\n * Transition to MHI state M3 state from M0||M1||M2 state\n * @mhi_cntrl: MHI controller\n */\nint mhi_pm_suspend(struct mhi_controller *mhi_cntrl);\n\n/**\n * mhi_pm_resume - Resume MHI from suspended state\n * Transition to MHI state M0 state from M3 state\n * @mhi_cntrl: MHI controller\n */\nint mhi_pm_resume(struct mhi_controller *mhi_cntrl);\n\n/**\n * mhi_download_rddm_img - Download ramdump image from device for\n * debugging purpose.\n * @mhi_cntrl: MHI controller\n * @in_panic: If we trying to capture image while in kernel panic\n */\nint mhi_download_rddm_img(struct mhi_controller *mhi_cntrl, bool in_panic);\n\n/**\n * mhi_force_rddm_mode - Force external device into rddm mode\n * to collect device ramdump. This is useful if host driver assert\n * and we need to see device state as well.\n * @mhi_cntrl: MHI controller\n */\nint mhi_force_rddm_mode(struct mhi_controller *mhi_cntrl);\n\n/**\n * mhi_get_remote_time_sync - Get external soc time relative to local soc time\n * using MMIO method.\n * @mhi_dev: Device associated with the channels\n * @t_host: Pointer to output local soc time\n * @t_dev: Pointer to output remote soc time\n */\nint mhi_get_remote_time_sync(struct mhi_device *mhi_dev,\n\t\t\t     u64 *t_host,\n\t\t\t     u64 *t_dev);\n\n/**\n * mhi_get_mhi_state - Return MHI state of device\n * @mhi_cntrl: MHI controller\n */\nenum mhi_dev_state mhi_get_mhi_state(struct mhi_controller *mhi_cntrl);\n\n/**\n * mhi_set_mhi_state - Set device state\n * @mhi_cntrl: MHI controller\n * @state: state to set\n */\nvoid mhi_set_mhi_state(struct mhi_controller *mhi_cntrl,\n\t\t       enum mhi_dev_state state);\n\n\n/**\n * mhi_is_active - helper function to determine if MHI in active state\n * @mhi_dev: client device\n */\nstatic inline bool mhi_is_active(struct mhi_device *mhi_dev)\n{\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\n\treturn (mhi_cntrl->dev_state >= MHI_STATE_M0 &&\n\t\tmhi_cntrl->dev_state <= MHI_STATE_M3);\n}\n\n/**\n * mhi_debug_reg_dump - dump MHI registers for debug purpose\n * @mhi_cntrl: MHI controller\n */\nvoid mhi_debug_reg_dump(struct mhi_controller *mhi_cntrl);\n\n#ifdef CONFIG_MHI_DEBUG\n\n#define MHI_VERB(fmt, ...) do { \\\n\t\tif (mhi_cntrl->klog_lvl <= MHI_MSG_LVL_VERBOSE) \\\n\t\t\tpr_debug(\"[D][mhi%d][%s] \" fmt, mhi_cntrl->cntrl_idx, __func__, ##__VA_ARGS__);\\\n} while (0)\n\n#else\n\n#define MHI_VERB(fmt, ...)\n\n#endif\n\n#define MHI_LOG(fmt, ...) do {\t\\\n\t\tif (mhi_cntrl->klog_lvl <= MHI_MSG_LVL_INFO) \\\n\t\t\tpr_info(\"[I][mhi%d][%s] \" fmt, mhi_cntrl->cntrl_idx, __func__, ##__VA_ARGS__);\\\n\t\telse if (!mhi_cntrl->klog_slient) \\\n\t\t\tprintk(KERN_DEBUG \"[I][mhi%d][%s] \" fmt, mhi_cntrl->cntrl_idx, __func__, ##__VA_ARGS__);\\\n} while (0)\n\n#define MHI_ERR(fmt, ...) do {\t\\\n\t\tif (mhi_cntrl->klog_lvl <= MHI_MSG_LVL_ERROR) \\\n\t\t\tpr_err(\"[E][mhi%d][%s] \" fmt, mhi_cntrl->cntrl_idx, __func__, ##__VA_ARGS__); \\\n} while (0)\n\n#define MHI_CRITICAL(fmt, ...) do { \\\n\t\tif (mhi_cntrl->klog_lvl <= MHI_MSG_LVL_CRITICAL) \\\n\t\t\tpr_alert(\"[C][mhi%d][%s] \" fmt, mhi_cntrl->cntrl_idx, __func__, ##__VA_ARGS__); \\\n} while (0)\n\nint mhi_register_mhi_controller(struct mhi_controller *mhi_cntrl);\nvoid mhi_unregister_mhi_controller(struct mhi_controller *mhi_cntrl);\n\n#ifndef MHI_NAME_SIZE\n#define MHI_NAME_SIZE 32\n/**\n *  * struct mhi_device_id - MHI device identification\n *   * @chan: MHI channel name\n *    * @driver_data: driver data;\n *     */\nstruct mhi_device_id {\n\tconst char chan[MHI_NAME_SIZE];\n\tunsigned long driver_data;\n};\n#endif\n\n#endif /* _MHI_H_ */\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/core/mhi_boot.c",
    "content": "// SPDX-License-Identifier: GPL-2.0-only\n/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. */\n\n#include <linux/debugfs.h>\n#include <linux/delay.h>\n#include <linux/device.h>\n#include <linux/dma-direction.h>\n#include <linux/dma-mapping.h>\n#include <linux/firmware.h>\n#include <linux/interrupt.h>\n#include <linux/list.h>\n#include <linux/of.h>\n#include <linux/module.h>\n#include <linux/random.h>\n#include <linux/slab.h>\n#include <linux/wait.h>\n#include <linux/sched.h>\n#include <linux/uaccess.h>\n#include \"mhi.h\"\n#include \"mhi_internal.h\"\n\n/* Software defines */\n/* BHI Version */\n#define BHI_MAJOR_VERSION 0x1\n#define BHI_MINOR_VERSION 0x1\n\n#define MSMHWID_NUMDWORDS 6       /* Number of dwords that make the MSMHWID */\n#define OEMPKHASH_NUMDWORDS 48    /* Number of dwords that make the OEM PK HASH */\n\n#define IsPBLExecEnv(ExecEnv)   ((ExecEnv == MHI_EE_PBL) || (ExecEnv == MHI_EE_EDL) )\n\ntypedef u32 ULONG;\n\ntypedef struct _bhi_info_type\n{\n   ULONG bhi_ver_minor;\n   ULONG bhi_ver_major;\n   ULONG bhi_image_address_low;\n   ULONG bhi_image_address_high;\n   ULONG bhi_image_size;\n   ULONG bhi_rsvd1;\n   ULONG bhi_imgtxdb;\n   ULONG bhi_rsvd2;\n   ULONG bhi_msivec;\n   ULONG bhi_rsvd3;\n   ULONG bhi_ee;\n   ULONG bhi_status;\n   ULONG bhi_errorcode;\n   ULONG bhi_errdbg1;\n   ULONG bhi_errdbg2;\n   ULONG bhi_errdbg3;\n   ULONG bhi_sernum;\n   ULONG bhi_sblantirollbackver;\n   ULONG bhi_numsegs;\n   ULONG bhi_msmhwid[6];\n   ULONG bhi_oempkhash[48];\n   ULONG bhi_rsvd5;\n}BHI_INFO_TYPE, *PBHI_INFO_TYPE;\n\nstatic void PrintBhiInfo(struct mhi_controller *mhi_cntrl, BHI_INFO_TYPE *bhi_info)\n{\n   ULONG index;\n   char str[128];\n\n   MHI_LOG(\"BHI Device Info...\\n\");\n   MHI_LOG(\"BHI Version               = { Major = 0x%X Minor = 0x%X}\\n\", bhi_info->bhi_ver_major, bhi_info->bhi_ver_minor);\n   MHI_LOG(\"BHI Execution Environment = 0x%X\\n\", bhi_info->bhi_ee);\n   MHI_LOG(\"BHI Status                = 0x%X\\n\", bhi_info->bhi_status);\n   MHI_LOG(\"BHI Error code            = 0x%X { Dbg1 = 0x%X Dbg2 = 0x%X Dbg3 = 0x%X }\\n\", bhi_info->bhi_errorcode, bhi_info->bhi_errdbg1, bhi_info->bhi_errdbg2, bhi_info->bhi_errdbg3);\n   MHI_LOG(\"BHI Serial Number         = 0x%X\\n\", bhi_info->bhi_sernum);\n   MHI_LOG(\"BHI SBL Anti-Rollback Ver = 0x%X\\n\", bhi_info->bhi_sblantirollbackver);\n   MHI_LOG(\"BHI Number of Segments    = 0x%X\\n\", bhi_info->bhi_numsegs);\n   for (index = 0; index < 6; index++)\n   {\n      snprintf(str+3*index, sizeof(str)-3*index, \"%02x \", bhi_info->bhi_msmhwid[index]);\n   }\n   MHI_LOG(\"BHI MSM HW-Id             = %s\\n\", str);\n\n   for (index = 0; index < 24; index++)\n   {\n      snprintf(str+3*index, sizeof(str)-3*index, \"%02x \", bhi_info->bhi_oempkhash[index]);\n   }\n   MHI_LOG(\"BHI OEM PK Hash           =  %s\\n\", str);\n}\n\nstatic u32 bhi_read_reg(struct mhi_controller *mhi_cntrl, u32 offset)\n{\n\tu32 out = 0;\n\tint ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_EXECENV, &out);\n\n\treturn (ret) ? 0 : out;\n}\n\nstatic int BhiRead(struct mhi_controller *mhi_cntrl, BHI_INFO_TYPE *bhi_info)\n{\n\tULONG index;\n\n\tmemset(bhi_info, 0x00, sizeof(BHI_INFO_TYPE));\n\n\t/* bhi_ver */\n\tbhi_info->bhi_ver_minor = bhi_read_reg(mhi_cntrl, BHI_BHIVERSION_MINOR);\n\tbhi_info->bhi_ver_major = bhi_read_reg(mhi_cntrl, BHI_BHIVERSION_MINOR);\n\tbhi_info->bhi_image_address_low = bhi_read_reg(mhi_cntrl, BHI_IMGADDR_LOW);\n\tbhi_info->bhi_image_address_high = bhi_read_reg(mhi_cntrl, BHI_IMGADDR_HIGH);\n\tbhi_info->bhi_image_size = bhi_read_reg(mhi_cntrl, BHI_IMGSIZE);\n\tbhi_info->bhi_rsvd1 = bhi_read_reg(mhi_cntrl, BHI_RSVD1);\n\tbhi_info->bhi_imgtxdb = bhi_read_reg(mhi_cntrl, BHI_IMGTXDB);\n\tbhi_info->bhi_rsvd2 = bhi_read_reg(mhi_cntrl, BHI_RSVD2);\n\tbhi_info->bhi_msivec = bhi_read_reg(mhi_cntrl, BHI_INTVEC);\n\tbhi_info->bhi_rsvd3 = bhi_read_reg(mhi_cntrl, BHI_RSVD3);\n\tbhi_info->bhi_ee = bhi_read_reg(mhi_cntrl, BHI_EXECENV);\n\tbhi_info->bhi_status = bhi_read_reg(mhi_cntrl, BHI_STATUS);\n\tbhi_info->bhi_errorcode = bhi_read_reg(mhi_cntrl, BHI_ERRCODE);\n\tbhi_info->bhi_errdbg1 = bhi_read_reg(mhi_cntrl, BHI_ERRDBG1);\n\tbhi_info->bhi_errdbg2 = bhi_read_reg(mhi_cntrl, BHI_ERRDBG2);\n\tbhi_info->bhi_errdbg3 = bhi_read_reg(mhi_cntrl, BHI_ERRDBG3);\n\tbhi_info->bhi_sernum = bhi_read_reg(mhi_cntrl, BHI_SERIALNU);\n\tbhi_info->bhi_sblantirollbackver = bhi_read_reg(mhi_cntrl, BHI_SBLANTIROLLVER);\n\tbhi_info->bhi_numsegs = bhi_read_reg(mhi_cntrl, BHI_NUMSEG);\n\tfor (index = 0; index < MSMHWID_NUMDWORDS; index++)\n\t{\n\t\tbhi_info->bhi_msmhwid[index] = bhi_read_reg(mhi_cntrl, BHI_MSMHWID(index));\n\t}\n\tfor (index = 0; index < OEMPKHASH_NUMDWORDS; index++)\n\t{\n\t\tbhi_info->bhi_oempkhash[index] = bhi_read_reg(mhi_cntrl, BHI_OEMPKHASH(index));\n\t}\n\tbhi_info->bhi_rsvd5 = bhi_read_reg(mhi_cntrl, BHI_RSVD5);\n\tPrintBhiInfo(mhi_cntrl, bhi_info);\n\t/* Check the Execution Environment */\n\tif (!IsPBLExecEnv(bhi_info->bhi_ee))\n\t{\n\t\tMHI_LOG(\"E - EE: 0x%X Expected PBL/EDL\\n\", bhi_info->bhi_ee);\n\t}\n\n\t/* Return the number of bytes read */\n\treturn 0;\n}\n\n/* setup rddm vector table for rddm transfer */\nstatic void mhi_rddm_prepare(struct mhi_controller *mhi_cntrl,\n\t\t\t     struct image_info *img_info)\n{\n\tstruct mhi_buf *mhi_buf = img_info->mhi_buf;\n\tstruct bhi_vec_entry *bhi_vec = img_info->bhi_vec;\n\tint i = 0;\n\n\tfor (i = 0; i < img_info->entries - 1; i++, mhi_buf++, bhi_vec++) {\n\t\tMHI_VERB(\"Setting vector:%pad size:%zu\\n\",\n\t\t\t &mhi_buf->dma_addr, mhi_buf->len);\n\t\tbhi_vec->dma_addr = mhi_buf->dma_addr;\n\t\tbhi_vec->size = mhi_buf->len;\n\t}\n}\n\n/* collect rddm during kernel panic */\nstatic int __mhi_download_rddm_in_panic(struct mhi_controller *mhi_cntrl)\n{\n\tint ret;\n\tstruct mhi_buf *mhi_buf;\n\tu32 sequence_id;\n\tu32 rx_status;\n\tenum mhi_ee ee;\n\tstruct image_info *rddm_image = mhi_cntrl->rddm_image;\n\tconst u32 delayus = 2000;\n\tu32 retry = (mhi_cntrl->timeout_ms * 1000) / delayus;\n\tconst u32 rddm_timeout_us = 200000;\n\tint rddm_retry = rddm_timeout_us / delayus; /* time to enter rddm */\n\tvoid __iomem *base = mhi_cntrl->bhie;\n\n\tMHI_LOG(\"Entered with pm_state:%s dev_state:%s ee:%s\\n\",\n\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state),\n\t\tTO_MHI_STATE_STR(mhi_cntrl->dev_state),\n\t\tTO_MHI_EXEC_STR(mhi_cntrl->ee));\n\n\t/*\n\t * This should only be executing during a kernel panic, we expect all\n\t * other cores to shutdown while we're collecting rddm buffer. After\n\t * returning from this function, we expect device to reset.\n\t *\n\t * Normaly, we would read/write pm_state only after grabbing\n\t * pm_lock, since we're in a panic, skipping it. Also there is no\n\t * gurantee this state change would take effect since\n\t * we're setting it w/o grabbing pmlock, it's best effort\n\t */\n\tmhi_cntrl->pm_state = MHI_PM_LD_ERR_FATAL_DETECT;\n\t/* update should take the effect immediately */\n\tsmp_wmb();\n\n\t/* setup the RX vector table */\n\tmhi_rddm_prepare(mhi_cntrl, rddm_image);\n\tmhi_buf = &rddm_image->mhi_buf[rddm_image->entries - 1];\n\n\tMHI_LOG(\"Starting BHIe programming for RDDM\\n\");\n\n\tmhi_write_reg(mhi_cntrl, base, BHIE_RXVECADDR_HIGH_OFFS,\n\t\t      upper_32_bits(mhi_buf->dma_addr));\n\n\tmhi_write_reg(mhi_cntrl, base, BHIE_RXVECADDR_LOW_OFFS,\n\t\t      lower_32_bits(mhi_buf->dma_addr));\n\n\tmhi_write_reg(mhi_cntrl, base, BHIE_RXVECSIZE_OFFS, mhi_buf->len);\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0))\n\tsequence_id = get_random_u32() & BHIE_RXVECSTATUS_SEQNUM_BMSK;\n#else\n\tsequence_id = prandom_u32() & BHIE_RXVECSTATUS_SEQNUM_BMSK;\n#endif\n\tif (unlikely(!sequence_id))\n\t\tsequence_id = 1;\n\n\n\tmhi_write_reg_field(mhi_cntrl, base, BHIE_RXVECDB_OFFS,\n\t\t\t    BHIE_RXVECDB_SEQNUM_BMSK, BHIE_RXVECDB_SEQNUM_SHFT,\n\t\t\t    sequence_id);\n\n\tMHI_LOG(\"Trigger device into RDDM mode\\n\");\n\tmhi_set_mhi_state(mhi_cntrl, MHI_STATE_SYS_ERR);\n\n\tMHI_LOG(\"Waiting for device to enter RDDM\\n\");\n\twhile (rddm_retry--) {\n\t\tee = mhi_get_exec_env(mhi_cntrl);\n\t\tif (ee == MHI_EE_RDDM)\n\t\t\tbreak;\n\n\t\tudelay(delayus);\n\t}\n\n\tif (rddm_retry <= 0) {\n\t\t/* This is a hardware reset, will force device to enter rddm */\n\t\tMHI_LOG(\n\t\t\t\"Did not enter RDDM triggering host req. reset to force rddm\\n\");\n\t\tmhi_write_reg(mhi_cntrl, mhi_cntrl->regs,\n\t\t\t      MHI_SOC_RESET_REQ_OFFSET, MHI_SOC_RESET_REQ);\n\t\tudelay(delayus);\n\t}\n\n\tee = mhi_get_exec_env(mhi_cntrl);\n\tMHI_LOG(\"Waiting for image download completion, current EE:%s\\n\",\n\t\tTO_MHI_EXEC_STR(ee));\n\twhile (retry--) {\n\t\tret = mhi_read_reg_field(mhi_cntrl, base, BHIE_RXVECSTATUS_OFFS,\n\t\t\t\t\t BHIE_RXVECSTATUS_STATUS_BMSK,\n\t\t\t\t\t BHIE_RXVECSTATUS_STATUS_SHFT,\n\t\t\t\t\t &rx_status);\n\t\tif (ret)\n\t\t\treturn -EIO;\n\n\t\tif (rx_status == BHIE_RXVECSTATUS_STATUS_XFER_COMPL) {\n\t\t\tMHI_LOG(\"RDDM successfully collected\\n\");\n\t\t\treturn 0;\n\t\t}\n\n\t\tudelay(delayus);\n\t}\n\n\tee = mhi_get_exec_env(mhi_cntrl);\n\tret = mhi_read_reg(mhi_cntrl, base, BHIE_RXVECSTATUS_OFFS, &rx_status);\n\n\tMHI_ERR(\"Did not complete RDDM transfer\\n\");\n\tMHI_ERR(\"Current EE:%s\\n\", TO_MHI_EXEC_STR(ee));\n\tMHI_ERR(\"RXVEC_STATUS:0x%x, ret:%d\\n\", rx_status, ret);\n\n\treturn -EIO;\n}\n\n/* download ramdump image from device */\nint mhi_download_rddm_img(struct mhi_controller *mhi_cntrl, bool in_panic)\n{\n\tvoid __iomem *base = mhi_cntrl->bhie;\n\trwlock_t *pm_lock = &mhi_cntrl->pm_lock;\n\tstruct image_info *rddm_image = mhi_cntrl->rddm_image;\n\tstruct mhi_buf *mhi_buf;\n\tint ret;\n\tu32 rx_status;\n\tu32 sequence_id;\n\n\tif (!rddm_image)\n\t\treturn -ENOMEM;\n\n\tif (in_panic)\n\t\treturn __mhi_download_rddm_in_panic(mhi_cntrl);\n\n\tMHI_LOG(\"Waiting for device to enter RDDM state from EE:%s\\n\",\n\t\tTO_MHI_EXEC_STR(mhi_cntrl->ee));\n\n\tret = wait_event_timeout(mhi_cntrl->state_event,\n\t\t\t\t mhi_cntrl->ee == MHI_EE_RDDM ||\n\t\t\t\t MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),\n\t\t\t\t msecs_to_jiffies(mhi_cntrl->timeout_ms));\n\n\tif (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {\n\t\tMHI_ERR(\"MHI is not in valid state, pm_state:%s ee:%s\\n\",\n\t\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state),\n\t\t\tTO_MHI_EXEC_STR(mhi_cntrl->ee));\n\t\treturn -EIO;\n\t}\n\n\tmhi_rddm_prepare(mhi_cntrl, mhi_cntrl->rddm_image);\n\n\t/* vector table is the last entry */\n\tmhi_buf = &rddm_image->mhi_buf[rddm_image->entries - 1];\n\n\tread_lock_bh(pm_lock);\n\tif (!MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state)) {\n\t\tread_unlock_bh(pm_lock);\n\t\treturn -EIO;\n\t}\n\n\tMHI_LOG(\"Starting BHIe Programming for RDDM\\n\");\n\n\tmhi_write_reg(mhi_cntrl, base, BHIE_RXVECADDR_HIGH_OFFS,\n\t\t      upper_32_bits(mhi_buf->dma_addr));\n\n\tmhi_write_reg(mhi_cntrl, base, BHIE_RXVECADDR_LOW_OFFS,\n\t\t      lower_32_bits(mhi_buf->dma_addr));\n\n\tmhi_write_reg(mhi_cntrl, base, BHIE_RXVECSIZE_OFFS, mhi_buf->len);\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0))\n\tsequence_id = get_random_u32() & BHIE_RXVECSTATUS_SEQNUM_BMSK;\n#else\n\tsequence_id = prandom_u32() & BHIE_RXVECSTATUS_SEQNUM_BMSK;\n#endif\n\tmhi_write_reg_field(mhi_cntrl, base, BHIE_RXVECDB_OFFS,\n\t\t\t    BHIE_RXVECDB_SEQNUM_BMSK, BHIE_RXVECDB_SEQNUM_SHFT,\n\t\t\t    sequence_id);\n\tread_unlock_bh(pm_lock);\n\n\tMHI_LOG(\"Upper:0x%x Lower:0x%x len:0x%zx sequence:%u\\n\",\n\t\tupper_32_bits(mhi_buf->dma_addr),\n\t\tlower_32_bits(mhi_buf->dma_addr),\n\t\tmhi_buf->len, sequence_id);\n\tMHI_LOG(\"Waiting for image download completion\\n\");\n\n\t/* waiting for image download completion */\n\twait_event_timeout(mhi_cntrl->state_event,\n\t\t\t   MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state) ||\n\t\t\t   mhi_read_reg_field(mhi_cntrl, base,\n\t\t\t\t\t      BHIE_RXVECSTATUS_OFFS,\n\t\t\t\t\t      BHIE_RXVECSTATUS_STATUS_BMSK,\n\t\t\t\t\t      BHIE_RXVECSTATUS_STATUS_SHFT,\n\t\t\t\t\t      &rx_status) || rx_status,\n\t\t\t   msecs_to_jiffies(mhi_cntrl->timeout_ms));\n\n\tif (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state))\n\t\treturn -EIO;\n\n\treturn (rx_status == BHIE_RXVECSTATUS_STATUS_XFER_COMPL) ? 0 : -EIO;\n}\nEXPORT_SYMBOL(mhi_download_rddm_img);\n\nstatic int mhi_fw_load_amss(struct mhi_controller *mhi_cntrl,\n\t\t\t    const struct mhi_buf *mhi_buf)\n{\n\tvoid __iomem *base = mhi_cntrl->bhie;\n\trwlock_t *pm_lock = &mhi_cntrl->pm_lock;\n\tu32 tx_status;\n\n\tread_lock_bh(pm_lock);\n\tif (!MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state)) {\n\t\tread_unlock_bh(pm_lock);\n\t\treturn -EIO;\n\t}\n\n\tMHI_LOG(\"Starting BHIe Programming\\n\");\n\n\tmhi_write_reg(mhi_cntrl, base, BHIE_TXVECADDR_HIGH_OFFS,\n\t\t      upper_32_bits(mhi_buf->dma_addr));\n\n\tmhi_write_reg(mhi_cntrl, base, BHIE_TXVECADDR_LOW_OFFS,\n\t\t      lower_32_bits(mhi_buf->dma_addr));\n\n\tmhi_write_reg(mhi_cntrl, base, BHIE_TXVECSIZE_OFFS, mhi_buf->len);\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0))\n\tmhi_cntrl->sequence_id = get_random_u32() & BHIE_TXVECSTATUS_SEQNUM_BMSK;\n#else\n\tmhi_cntrl->sequence_id = prandom_u32() & BHIE_TXVECSTATUS_SEQNUM_BMSK;\n#endif\n\tmhi_write_reg_field(mhi_cntrl, base, BHIE_TXVECDB_OFFS,\n\t\t\t    BHIE_TXVECDB_SEQNUM_BMSK, BHIE_TXVECDB_SEQNUM_SHFT,\n\t\t\t    mhi_cntrl->sequence_id);\n\tread_unlock_bh(pm_lock);\n\n\tMHI_LOG(\"Upper:0x%x Lower:0x%x len:0x%zx sequence:%u\\n\",\n\t\tupper_32_bits(mhi_buf->dma_addr),\n\t\tlower_32_bits(mhi_buf->dma_addr),\n\t\tmhi_buf->len, mhi_cntrl->sequence_id);\n\tMHI_LOG(\"Waiting for image transfer completion\\n\");\n\n\t/* waiting for image download completion */\n\twait_event_timeout(mhi_cntrl->state_event,\n\t\t\t   MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state) ||\n\t\t\t   mhi_read_reg_field(mhi_cntrl, base,\n\t\t\t\t\t      BHIE_TXVECSTATUS_OFFS,\n\t\t\t\t\t      BHIE_TXVECSTATUS_STATUS_BMSK,\n\t\t\t\t\t      BHIE_TXVECSTATUS_STATUS_SHFT,\n\t\t\t\t\t      &tx_status) || tx_status,\n\t\t\t   msecs_to_jiffies(mhi_cntrl->timeout_ms));\n\n\tif (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state))\n\t\treturn -EIO;\n\n\treturn (tx_status == BHIE_TXVECSTATUS_STATUS_XFER_COMPL) ? 0 : -EIO;\n}\n\nstatic int mhi_fw_load_sbl(struct mhi_controller *mhi_cntrl,\n\t\t\t   dma_addr_t dma_addr,\n\t\t\t   size_t size)\n{\n\tu32 tx_status, val;\n\tu32 ImgTxDb = 0x1;\n\tint i, ret;\n\tvoid __iomem *base = mhi_cntrl->bhi;\n\trwlock_t *pm_lock = &mhi_cntrl->pm_lock;\n\tstruct {\n\t\tchar *name;\n\t\tu32 offset;\n\t} error_reg[] = {\n\t\t{ \"ERROR_CODE\", BHI_ERRCODE },\n\t\t{ \"ERROR_DBG1\", BHI_ERRDBG1 },\n\t\t{ \"ERROR_DBG2\", BHI_ERRDBG2 },\n\t\t{ \"ERROR_DBG3\", BHI_ERRDBG3 },\n\t\t{ NULL },\n\t};\n\n\tMHI_LOG(\"Starting BHI programming\\n\");\n\n\t/* program start sbl download via  bhi protocol */\n\tread_lock_bh(pm_lock);\n\tif (!MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state)) {\n\t\tread_unlock_bh(pm_lock);\n\t\tgoto invalid_pm_state;\n\t}\n\n\tmhi_write_reg(mhi_cntrl, base, BHI_STATUS, 0);\n\tmhi_write_reg(mhi_cntrl, base, BHI_IMGADDR_HIGH,\n\t\t      upper_32_bits(dma_addr));\n\tmhi_write_reg(mhi_cntrl, base, BHI_IMGADDR_LOW,\n\t\t      lower_32_bits(dma_addr));\n\tmhi_write_reg(mhi_cntrl, base, BHI_IMGSIZE, size);\n\tmhi_write_reg_field(mhi_cntrl, mhi_cntrl->regs, MHICFG, MHICFG_NER_MASK, MHICFG_NER_SHIFT, NUM_MHI_EVT_RINGS);\n\tmhi_write_reg_field(mhi_cntrl, mhi_cntrl->regs, MHICFG, MHICFG_NHWER_MASK, MHICFG_NHWER_SHIFT, NUM_MHI_HW_EVT_RINGS);\n\tmhi_write_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_INTVEC, mhi_cntrl->msi_irq_base);\n\tmhi_write_reg(mhi_cntrl, base, BHI_IMGTXDB, ImgTxDb);\n\tread_unlock_bh(pm_lock);\n\n\tMHI_LOG(\"Waiting for image transfer completion\\n\");\n\n\t/* waiting for image download completion */\n\tret = wait_event_timeout(mhi_cntrl->state_event,\n\t\t\t   MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state) ||\n\t\t\t   mhi_read_reg_field(mhi_cntrl, base, BHI_STATUS,\n\t\t\t\t\t      BHI_STATUS_MASK, BHI_STATUS_SHIFT,\n\t\t\t\t\t      &tx_status) || tx_status,\n\t\t\t   msecs_to_jiffies(mhi_cntrl->timeout_ms));\n\tif (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state))\n\t\tgoto invalid_pm_state;\n\n\tif (tx_status == BHI_STATUS_ERROR) {\n\t\tMHI_ERR(\"Image transfer failed\\n\");\n\t\tread_lock_bh(pm_lock);\n\t\tif (MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state)) {\n\t\t\tfor (i = 0; error_reg[i].name; i++) {\n\t\t\t\tret = mhi_read_reg(mhi_cntrl, base,\n\t\t\t\t\t\t   error_reg[i].offset, &val);\n\t\t\t\tif (ret)\n\t\t\t\t\tbreak;\n\t\t\t\tMHI_ERR(\"reg:%s value:0x%x\\n\",\n\t\t\t\t\terror_reg[i].name, val);\n\t\t\t}\n\t\t}\n\t\tread_unlock_bh(pm_lock);\n\t\tgoto invalid_pm_state;\n\t}\n\n\treturn (tx_status == BHI_STATUS_SUCCESS) ? 0 : -ETIMEDOUT;\n\ninvalid_pm_state:\n\n\treturn -EIO;\n}\n\nvoid mhi_free_bhie_table(struct mhi_controller *mhi_cntrl,\n\t\t\t struct image_info *image_info)\n{\n\tint i;\n\tstruct mhi_buf *mhi_buf = image_info->mhi_buf;\n\n\tfor (i = 0; i < image_info->entries; i++, mhi_buf++)\n\t\tmhi_free_coherent(mhi_cntrl, mhi_buf->len, mhi_buf->buf,\n\t\t\t\t  mhi_buf->dma_addr);\n\n\tkfree(image_info->mhi_buf);\n\tkfree(image_info);\n}\n\nint mhi_alloc_bhie_table(struct mhi_controller *mhi_cntrl,\n\t\t\t struct image_info **image_info,\n\t\t\t size_t alloc_size)\n{\n\tsize_t seg_size = mhi_cntrl->seg_len;\n\t/* requier additional entry for vec table */\n\tint segments = DIV_ROUND_UP(alloc_size, seg_size) + 1;\n\tint i;\n\tstruct image_info *img_info;\n\tstruct mhi_buf *mhi_buf;\n\n\tMHI_LOG(\"Allocating bytes:%zu seg_size:%zu total_seg:%u\\n\",\n\t\talloc_size, seg_size, segments);\n\n\timg_info = kzalloc(sizeof(*img_info), GFP_KERNEL);\n\tif (!img_info)\n\t\treturn -ENOMEM;\n\n\t/* allocate memory for entries */\n\timg_info->mhi_buf = kcalloc(segments, sizeof(*img_info->mhi_buf),\n\t\t\t\t    GFP_KERNEL);\n\tif (!img_info->mhi_buf)\n\t\tgoto error_alloc_mhi_buf;\n\n\t/* allocate and populate vector table */\n\tmhi_buf = img_info->mhi_buf;\n\tfor (i = 0; i < segments; i++, mhi_buf++) {\n\t\tsize_t vec_size = seg_size;\n\n\t\t/* last entry is for vector table */\n\t\tif (i == segments - 1)\n\t\t\tvec_size = sizeof(struct bhi_vec_entry) * i;\n\n\t\tmhi_buf->len = vec_size;\n\t\tmhi_buf->buf = mhi_alloc_coherent(mhi_cntrl, vec_size,\n\t\t\t\t\t&mhi_buf->dma_addr, GFP_KERNEL);\n\t\tif (!mhi_buf->buf)\n\t\t\tgoto error_alloc_segment;\n\n\t\tMHI_LOG(\"Entry:%d Address:0x%llx size:%zu\\n\", i,\n\t\t\t(unsigned long long)mhi_buf->dma_addr,\n\t\t\tmhi_buf->len);\n\t}\n\n\timg_info->bhi_vec = img_info->mhi_buf[segments - 1].buf;\n\timg_info->entries = segments;\n\t*image_info = img_info;\n\n\tMHI_LOG(\"Successfully allocated bhi vec table\\n\");\n\n\treturn 0;\n\nerror_alloc_segment:\n\tfor (--i, --mhi_buf; i >= 0; i--, mhi_buf--)\n\t\tmhi_free_coherent(mhi_cntrl, mhi_buf->len, mhi_buf->buf,\n\t\t\t\t  mhi_buf->dma_addr);\n\nerror_alloc_mhi_buf:\n\tkfree(img_info);\n\n\treturn -ENOMEM;\n}\n\nstatic void mhi_firmware_copy(struct mhi_controller *mhi_cntrl,\n\t\t\t      const struct firmware *firmware,\n\t\t\t      struct image_info *img_info)\n{\n\tsize_t remainder = firmware->size;\n\tsize_t to_cpy;\n\tconst u8 *buf = firmware->data;\n\tint i = 0;\n\tstruct mhi_buf *mhi_buf = img_info->mhi_buf;\n\tstruct bhi_vec_entry *bhi_vec = img_info->bhi_vec;\n\n\twhile (remainder) {\n\t\tMHI_ASSERT(i >= img_info->entries, \"malformed vector table\");\n\n\t\tto_cpy = min(remainder, mhi_buf->len);\n\t\tmemcpy(mhi_buf->buf, buf, to_cpy);\n\t\tbhi_vec->dma_addr = mhi_buf->dma_addr;\n\t\tbhi_vec->size = to_cpy;\n\n\t\tMHI_VERB(\"Setting Vector:0x%llx size: %llu\\n\",\n\t\t\t bhi_vec->dma_addr, bhi_vec->size);\n\t\tbuf += to_cpy;\n\t\tremainder -= to_cpy;\n\t\ti++;\n\t\tbhi_vec++;\n\t\tmhi_buf++;\n\t}\n}\n\nvoid mhi_fw_load_worker(struct work_struct *work)\n{\n\tint ret;\n\tstruct mhi_controller *mhi_cntrl;\n\tconst char *fw_name;\n\tconst struct firmware *firmware;\n\tstruct image_info *image_info;\n\tvoid *buf;\n\tdma_addr_t dma_addr;\n\tsize_t size;\n\n\tmhi_cntrl = container_of(work, struct mhi_controller, fw_worker);\n\n\tMHI_LOG(\"Waiting for device to enter PBL from EE:%s\\n\",\n\t\tTO_MHI_EXEC_STR(mhi_cntrl->ee));\n\n\tret = wait_event_timeout(mhi_cntrl->state_event,\n\t\t\t\t MHI_IN_PBL(mhi_cntrl->ee) ||\n\t\t\t\t MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),\n\t\t\t\t msecs_to_jiffies(mhi_cntrl->timeout_ms));\n\n\tif (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {\n\t\tMHI_ERR(\"MHI is not in valid state\\n\");\n\t\treturn;\n\t}\n\n\tMHI_LOG(\"Device current EE:%s\\n\", TO_MHI_EXEC_STR(mhi_cntrl->ee));\n\n\t/* if device in pthru, we do not have to load firmware */\n\tif (mhi_cntrl->ee == MHI_EE_PTHRU)\n\t\treturn;\n\n\tfw_name = (mhi_cntrl->ee == MHI_EE_EDL) ?\n\t\tmhi_cntrl->edl_image : mhi_cntrl->fw_image;\n\n\tif (!fw_name || (mhi_cntrl->fbc_download && (!mhi_cntrl->sbl_size ||\n\t\t\t\t\t\t     !mhi_cntrl->seg_len))) {\n\t\tMHI_ERR(\"No firmware image defined or !sbl_size || !seg_len\\n\");\n\t\treturn;\n\t}\n\n\tret = request_firmware(&firmware, fw_name, mhi_cntrl->dev);\n\tif (ret) {\n\t\tMHI_ERR(\"Error loading firmware, ret:%d\\n\", ret);\n\t\treturn;\n\t}\n\n\tsize = (mhi_cntrl->fbc_download) ? mhi_cntrl->sbl_size : firmware->size;\n\n\t/* the sbl size provided is maximum size, not necessarily image size */\n\tif (size > firmware->size)\n\t\tsize = firmware->size;\n\n\tbuf = mhi_alloc_coherent(mhi_cntrl, size, &dma_addr, GFP_KERNEL);\n\tif (!buf) {\n\t\tMHI_ERR(\"Could not allocate memory for image\\n\");\n\t\trelease_firmware(firmware);\n\t\treturn;\n\t}\n\n\t/* load sbl image */\n\tmemcpy(buf, firmware->data, size);\n\tret = mhi_fw_load_sbl(mhi_cntrl, dma_addr, size);\n\tmhi_free_coherent(mhi_cntrl, size, buf, dma_addr);\n\n\t/* error or in edl, we're done */\n\tif (ret || mhi_cntrl->ee == MHI_EE_EDL) {\n\t\trelease_firmware(firmware);\n\t\treturn;\n\t}\n\n\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->dev_state = MHI_STATE_RESET;\n\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\n\t/*\n\t * if we're doing fbc, populate vector tables while\n\t * device transitioning into MHI READY state\n\t */\n\tif (mhi_cntrl->fbc_download) {\n\t\tret = mhi_alloc_bhie_table(mhi_cntrl, &mhi_cntrl->fbc_image,\n\t\t\t\t\t   firmware->size);\n\t\tif (ret) {\n\t\t\tMHI_ERR(\"Error alloc size of %zu\\n\", firmware->size);\n\t\t\tgoto error_alloc_fw_table;\n\t\t}\n\n\t\tMHI_LOG(\"Copying firmware image into vector table\\n\");\n\n\t\t/* load the firmware into BHIE vec table */\n\t\tmhi_firmware_copy(mhi_cntrl, firmware, mhi_cntrl->fbc_image);\n\t}\n\n\t/* transitioning into MHI RESET->READY state */\n\tret = mhi_ready_state_transition(mhi_cntrl);\n\n\tMHI_LOG(\"To Reset->Ready PM_STATE:%s MHI_STATE:%s EE:%s, ret:%d\\n\",\n\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state),\n\t\tTO_MHI_STATE_STR(mhi_cntrl->dev_state),\n\t\tTO_MHI_EXEC_STR(mhi_cntrl->ee), ret);\n\n\tif (!mhi_cntrl->fbc_download) {\n\t\trelease_firmware(firmware);\n\t\treturn;\t\n\t}\n\n\tif (ret) {\n\t\tMHI_ERR(\"Did not transition to READY state\\n\");\n\t\tgoto error_read;\n\t}\n\n\t/* wait for SBL event */\n\tret = wait_event_timeout(mhi_cntrl->state_event,\n\t\t\t\t mhi_cntrl->ee == MHI_EE_SBL ||\n\t\t\t\t MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),\n\t\t\t\t msecs_to_jiffies(mhi_cntrl->timeout_ms));\n\n\tif (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {\n\t\tMHI_ERR(\"MHI did not enter BHIE\\n\");\n\t\tgoto error_read;\n\t}\n\n\t/* start full firmware image download */\n\timage_info = mhi_cntrl->fbc_image;\n\tret = mhi_fw_load_amss(mhi_cntrl,\n\t\t\t       /* last entry is vec table */\n\t\t\t       &image_info->mhi_buf[image_info->entries - 1]);\n\n\tMHI_LOG(\"amss fw_load, ret:%d\\n\", ret);\n\n\trelease_firmware(firmware);\n\n\treturn;\n\nerror_read:\n\tmhi_free_bhie_table(mhi_cntrl, mhi_cntrl->fbc_image);\n\tmhi_cntrl->fbc_image = NULL;\n\nerror_alloc_fw_table:\n\trelease_firmware(firmware);\n}\n\nint BhiWrite(struct mhi_controller *mhi_cntrl, void __user *ubuf, size_t size)\n{\n\tint ret;\n\tdma_addr_t dma_addr;\n\tvoid *dma_buf;\n\n\tMHI_LOG(\"Device current EE:%s, M:%s, PM:%s\\n\",\n\t\tTO_MHI_EXEC_STR(mhi_get_exec_env(mhi_cntrl)),\n\t\tTO_MHI_STATE_STR(mhi_get_mhi_state(mhi_cntrl)),\n\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state));\n\n#if 0\n\tif (mhi_get_exec_env(mhi_cntrl) == MHI_EE_EDL && mhi_cntrl->ee != MHI_EE_EDL) {\n\t\tmhi_cntrl->ee = MHI_EE_EDL;\n\t\twait_event_timeout(mhi_cntrl->state_event,\n\t\t\tMHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),\n\t\t\tmsecs_to_jiffies(mhi_cntrl->timeout_ms + 500));\n\t}\n#endif\n\n#if 0\n\tif (!MHI_IN_PBL(mhi_cntrl->ee) || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {\n\t\tMHI_ERR(\"MHI is not in valid BHI state\\n\");\n\t\treturn -EINVAL;\n\t}\n#endif\n\n\tif (mhi_cntrl->ee != MHI_EE_EDL) {\n\t\tMHI_ERR(\"MHI is not in EDL state\\n\");\n\t\treturn -EINVAL;\n\t}\n\n\tdma_buf = mhi_alloc_coherent(mhi_cntrl, size, &dma_addr, GFP_KERNEL);\n\tif (!dma_buf) {\n\t\tMHI_ERR(\"Could not allocate memory for image\\n\");\n\t\treturn -ENOMEM;\n\t}\n\n\tret = copy_from_user(dma_buf, ubuf, size);\n\tif (ret) {\n\t\tMHI_ERR(\"IOCTL_BHI_WRITEIMAGE copy buf error, ret = %d\\n\", ret);\n\t\tmhi_free_coherent(mhi_cntrl, size, dma_buf, dma_addr);;\n\t\treturn ret;\n\t}\n\n\tret = mhi_fw_load_sbl(mhi_cntrl, dma_addr, size);\n\tmhi_free_coherent(mhi_cntrl, size, dma_buf, dma_addr);\n\n\tif (ret) {\n\t\tMHI_ERR(\"ret = %d, ee=%d\\n\", ret, mhi_cntrl->ee);\n\t\tgoto error_state;\n\t}\n\n\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->dev_state = MHI_STATE_RESET;\n\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\n\t/* transitioning into MHI RESET->READY state */\n\tret = mhi_ready_state_transition(mhi_cntrl);\n\tif (ret) {\n\t\tMHI_ERR(\"Did not transition to READY state\\n\");\n\t\tgoto error_state;\n\t}\n\n\tMHI_LOG(\"To Reset->Ready PM_STATE:%s MHI_STATE:%s EE:%s, ret:%d\\n\",\n\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state),\n\t\tTO_MHI_STATE_STR(mhi_cntrl->dev_state),\n\t\tTO_MHI_EXEC_STR(mhi_cntrl->ee), ret);\n\n\t/* wait for BHIE event */\n\tret = wait_event_timeout(mhi_cntrl->state_event,\n\t\t\t mhi_cntrl->ee == MHI_EE_FP ||\n\t\t\t MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),\n\t\t\t msecs_to_jiffies(mhi_cntrl->timeout_ms));\n\tif (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {\n\t\tMHI_ERR(\"MHI did not enter Flash Programmer Environment\\n\");\n\t\tgoto error_state;\n\t}\n\n\tMHI_LOG(\"MHI enter Flash Programmer Environment\\n\");\n\treturn 0;\n\nerror_state:\n\tMHI_LOG(\"Device current EE:%s, M:%s\\n\",\n\t\tTO_MHI_EXEC_STR(mhi_get_exec_env(mhi_cntrl)),\n\t\tTO_MHI_STATE_STR(mhi_get_mhi_state(mhi_cntrl)));\n\n\treturn ret;\n}\n\nlong bhi_get_dev_info(struct mhi_controller *mhi_cntrl, void __user *ubuf)\n{\n\tlong ret = -EINVAL;\n\tBHI_INFO_TYPE bhi_info;\n\n\tret = BhiRead(mhi_cntrl, &bhi_info);\n\tif (ret) {\n\t\tMHI_ERR(\"IOCTL_BHI_GETDEVINFO BhiRead error, ret = %ld\\n\", ret);\n\t\treturn ret;\n\t}\n\n\tret = copy_to_user(ubuf, &bhi_info, sizeof(bhi_info));\n\tif (ret) {\n\t\tMHI_ERR(\"IOCTL_BHI_GETDEVINFO copy error, ret = %ld\\n\", ret);\n\t}\n\n\treturn ret;\n}\n\nlong bhi_write_image(struct mhi_controller *mhi_cntrl, void __user *ubuf)\n{\n\tlong ret = -EINVAL;\n\tsize_t size;\n\n\tret = copy_from_user(&size, ubuf, sizeof(size));\n\tif (ret) {\n\t\tMHI_ERR(\"IOCTL_BHI_WRITEIMAGE copy size error, ret = %ld\\n\", ret);\n\t\treturn ret;\n\t}\n\tif (size <= 0) {\n\t\tMHI_ERR(\"IOCTL_BHI_WRITEIMAGE copy size error, size\\n\");\n\t\treturn -EINVAL;\n\t}\n\tret = BhiWrite(mhi_cntrl, ubuf+sizeof(size), size);\n\tif (ret) {\n\t\tMHI_ERR(\"IOCTL_BHI_WRITEIMAGE BhiWrite error, ret = %ld\\n\", ret);\n\t}\n\n\treturn ret;\n}\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/core/mhi_dtr.c",
    "content": "// SPDX-License-Identifier: GPL-2.0-only\n/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.*/\n\n#include <linux/debugfs.h>\n#include <linux/device.h>\n#include <linux/dma-direction.h>\n#include <linux/dma-mapping.h>\n#include <linux/interrupt.h>\n#include <linux/list.h>\n#include <linux/of.h>\n#include <linux/module.h>\n#include <linux/slab.h>\n#include <linux/termios.h>\n#include <linux/wait.h>\n#include \"mhi.h\"\n#include \"mhi_internal.h\"\n\nstruct __packed dtr_ctrl_msg {\n\tu32 preamble;\n\tu32 msg_id;\n\tu32 dest_id;\n\tu32 size;\n\tu32 msg;\n};\n\n#define CTRL_MAGIC (0x4C525443)\n#define CTRL_MSG_DTR BIT(0)\n#define CTRL_MSG_RTS BIT(1)\n#define CTRL_MSG_DCD BIT(0)\n#define CTRL_MSG_DSR BIT(1)\n#define CTRL_MSG_RI BIT(3)\n#define CTRL_HOST_STATE (0x10)\n#define CTRL_DEVICE_STATE (0x11)\n#define CTRL_GET_CHID(dtr) (dtr->dest_id & 0xFF)\n\nstatic int mhi_dtr_tiocmset(struct mhi_controller *mhi_cntrl,\n\t\t\t    struct mhi_device *mhi_dev,\n\t\t\t    u32 tiocm)\n{\n\tstruct dtr_ctrl_msg *dtr_msg = NULL;\n\tstruct mhi_chan *dtr_chan = mhi_cntrl->dtr_dev->ul_chan;\n\tspinlock_t *res_lock = &mhi_dev->dev.devres_lock;\n\tu32 cur_tiocm;\n\tint ret = 0;\n\n\tcur_tiocm = mhi_dev->tiocm & ~(TIOCM_CD | TIOCM_DSR | TIOCM_RI);\n\n\ttiocm &= (TIOCM_DTR | TIOCM_RTS);\n\n\t/* state did not changed */\n\tif (cur_tiocm == tiocm)\n\t\treturn 0;\n\n\tmutex_lock(&dtr_chan->mutex);\n\n\tdtr_msg = kzalloc(sizeof(*dtr_msg), GFP_KERNEL);\n\tif (!dtr_msg) {\n\t\tret = -ENOMEM;\n\t\tgoto tiocm_exit;\n\t}\n\n\tdtr_msg->preamble = CTRL_MAGIC;\n\tdtr_msg->msg_id = CTRL_HOST_STATE;\n\tdtr_msg->dest_id = mhi_dev->ul_chan_id;\n\tdtr_msg->size = sizeof(u32);\n\tif (tiocm & TIOCM_DTR)\n\t\tdtr_msg->msg |= CTRL_MSG_DTR;\n\tif (tiocm & TIOCM_RTS)\n\t\tdtr_msg->msg |= CTRL_MSG_RTS;\n\n/*\n* 'minicom -D /dev/mhi_DUN' will send RTS:1 when open, and RTS:0 when exit.\n* RTS:0 will prevent modem output AT response.\n* But 'busybox microcom' do not send any RTS to modem.\n* [75094.969783] mhi_uci_q 0306_00.03.00_DUN: mhi_dtr_tiocmset DTR:0 RTS:1\n* [75100.210994] mhi_uci_q 0306_00.03.00_DUN: mhi_dtr_tiocmset DTR:0 RTS:0\n*/\n\tdev_dbg(&mhi_dev->dev, \"%s DTR:%d RTS:%d\\n\", __func__,\n\t\t\t\t!!(tiocm & TIOCM_DTR), !!(tiocm & TIOCM_RTS));\n\n\treinit_completion(&dtr_chan->completion);\n\tret = mhi_queue_transfer(mhi_cntrl->dtr_dev, DMA_TO_DEVICE, dtr_msg,\n\t\t\t\t sizeof(*dtr_msg), MHI_EOT);\n\tif (ret)\n\t\tgoto tiocm_exit;\n\n\tret = wait_for_completion_timeout(&dtr_chan->completion,\n\t\t\t\tmsecs_to_jiffies(mhi_cntrl->timeout_ms));\n\tif (!ret) {\n\t\tMHI_ERR(\"Failed to receive transfer callback\\n\");\n\t\tret = -EIO;\n\t\tgoto tiocm_exit;\n\t}\n\n\tret = 0;\n\tspin_lock_irq(res_lock);\n\tmhi_dev->tiocm &= ~(TIOCM_DTR | TIOCM_RTS);\n\tmhi_dev->tiocm |= tiocm;\n\tspin_unlock_irq(res_lock);\n\ntiocm_exit:\n\tkfree(dtr_msg);\n\tmutex_unlock(&dtr_chan->mutex);\n\n\treturn ret;\n}\n\nlong mhi_ioctl(struct mhi_device *mhi_dev, unsigned int cmd, unsigned long arg)\n{\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tint ret;\n\n\t/* ioctl not supported by this controller */\n\tif (!mhi_cntrl->dtr_dev)\n\t\treturn -EIO;\n\n\tswitch (cmd) {\n\tcase TIOCMGET:\n\t\treturn mhi_dev->tiocm;\n\tcase TIOCMSET:\n\t{\n\t\tu32 tiocm;\n\n\t\tret = get_user(tiocm, (u32 *)arg);\n\t\tif (ret)\n\t\t\treturn ret;\n\n\t\treturn mhi_dtr_tiocmset(mhi_cntrl, mhi_dev, tiocm);\n\t}\n\tdefault:\n\t\tbreak;\n\t}\n\n\treturn -EINVAL;\n}\nEXPORT_SYMBOL(mhi_ioctl);\n\nstatic int mhi_dtr_queue_inbound(struct mhi_controller *mhi_cntrl)\n{\n\tstruct mhi_device *mhi_dev = mhi_cntrl->dtr_dev;\n\tint nr_trbs = mhi_get_no_free_descriptors(mhi_dev, DMA_FROM_DEVICE);\n\tsize_t mtu = mhi_dev->mtu;\n\tvoid *buf;\n\tint ret = -EIO, i;\n\n\tfor (i = 0; i < nr_trbs; i++) {\n\t\tbuf = kmalloc(mtu, GFP_KERNEL);\n\t\tif (!buf)\n\t\t\treturn -ENOMEM;\n\n\t\tret = mhi_queue_transfer(mhi_dev, DMA_FROM_DEVICE, buf, mtu,\n\t\t\t\t\t MHI_EOT);\n\t\tif (ret) {\n\t\t\tkfree(buf);\n\t\t\treturn ret;\n\t\t}\n\t}\n\n\treturn ret;\n}\n\nstatic void mhi_dtr_dl_xfer_cb(struct mhi_device *mhi_dev,\n\t\t\t       struct mhi_result *mhi_result)\n{\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tstruct dtr_ctrl_msg *dtr_msg = mhi_result->buf_addr;\n\tu32 chan;\n\tspinlock_t *res_lock;\n\n\tif (mhi_result->transaction_status == -ENOTCONN) {\n\t\tkfree(mhi_result->buf_addr);\n\t\treturn;\n\t}\n\n\tif (mhi_result->bytes_xferd != sizeof(*dtr_msg)) {\n\t\tMHI_ERR(\"Unexpected length %zu received\\n\",\n\t\t\tmhi_result->bytes_xferd);\n\t\treturn;\n\t}\n\n\tMHI_LOG(\"preamble:0x%x msg_id:%u dest_id:%u msg:0x%x\\n\",\n\t\t dtr_msg->preamble, dtr_msg->msg_id, dtr_msg->dest_id,\n\t\t dtr_msg->msg);\n\n\tchan = CTRL_GET_CHID(dtr_msg);\n\tif (chan >= mhi_cntrl->max_chan)\n\t\tgoto auto_queue;\n\n\tmhi_dev = mhi_cntrl->mhi_chan[chan].mhi_dev;\n\tif (!mhi_dev)\n\t\tgoto auto_queue;\n\n\tres_lock = &mhi_dev->dev.devres_lock;\n\tspin_lock_irq(res_lock);\n\tmhi_dev->tiocm &= ~(TIOCM_CD | TIOCM_DSR | TIOCM_RI);\n\n\tif (dtr_msg->msg & CTRL_MSG_DCD)\n\t\tmhi_dev->tiocm |= TIOCM_CD;\n\n\tif (dtr_msg->msg & CTRL_MSG_DSR)\n\t\tmhi_dev->tiocm |= TIOCM_DSR;\n\n\tif (dtr_msg->msg & CTRL_MSG_RI)\n\t\tmhi_dev->tiocm |= TIOCM_RI;\n\tspin_unlock_irq(res_lock);\n\nauto_queue:\n\tmhi_queue_transfer(mhi_cntrl->dtr_dev, DMA_FROM_DEVICE, mhi_result->buf_addr,\n\t\tmhi_cntrl->dtr_dev->mtu, MHI_EOT);\n}\n\nstatic void mhi_dtr_ul_xfer_cb(struct mhi_device *mhi_dev,\n\t\t\t       struct mhi_result *mhi_result)\n{\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tstruct mhi_chan *dtr_chan = mhi_cntrl->dtr_dev->ul_chan;\n\n\tMHI_VERB(\"Received with status:%d\\n\", mhi_result->transaction_status);\n\tif (!mhi_result->transaction_status)\n\t\tcomplete(&dtr_chan->completion);\n}\n\nstatic void mhi_dtr_remove(struct mhi_device *mhi_dev)\n{\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\n\tmhi_cntrl->dtr_dev = NULL;\n}\n\nstatic int mhi_dtr_probe(struct mhi_device *mhi_dev,\n\t\t\t const struct mhi_device_id *id)\n{\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tint ret;\n\n\tMHI_LOG(\"Enter for DTR control channel\\n\");\n\n\tmhi_dev->mtu = min_t(size_t, id->driver_data, mhi_dev->mtu);\n\tret = mhi_prepare_for_transfer(mhi_dev);\n\tif (!ret)\n\t\tmhi_cntrl->dtr_dev = mhi_dev;\n\n\tif (!ret)\n\t\tret = mhi_dtr_queue_inbound(mhi_cntrl);\n\n\tMHI_LOG(\"Exit with ret:%d\\n\", ret);\n\n\treturn ret;\n}\n\nstatic const struct mhi_device_id mhi_dtr_table[] = {\n\t{ .chan = \"IP_CTRL\", .driver_data = sizeof(struct dtr_ctrl_msg) },\n\t{},\n};\n\nstatic struct mhi_driver mhi_dtr_driver = {\n\t.id_table = mhi_dtr_table,\n\t.remove = mhi_dtr_remove,\n\t.probe = mhi_dtr_probe,\n\t.ul_xfer_cb = mhi_dtr_ul_xfer_cb,\n\t.dl_xfer_cb = mhi_dtr_dl_xfer_cb,\n\t.driver = {\n\t\t.name = \"MHI_DTR\",\n\t\t.owner = THIS_MODULE,\n\t}\n};\n\nint __init mhi_dtr_init(void)\n{\n\treturn mhi_driver_register(&mhi_dtr_driver);\n}\nvoid mhi_dtr_exit(void) {\n\tmhi_driver_unregister(&mhi_dtr_driver);\n}\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/core/mhi_init.c",
    "content": "// SPDX-License-Identifier: GPL-2.0-only\n/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. */\n\n#include <linux/kernel.h>\n#include <linux/debugfs.h>\n#include <linux/device.h>\n#include <linux/dma-direction.h>\n#include <linux/dma-mapping.h>\n#include <linux/interrupt.h>\n#include <linux/list.h>\n#include <linux/of.h>\n#include <linux/module.h>\n#include <linux/slab.h>\n#include <linux/wait.h>\n#include <linux/uaccess.h>\n#include <asm/uaccess.h>\n#include <linux/version.h>\n#if (LINUX_VERSION_CODE > KERNEL_VERSION( 4,11,0 ))\n#include <linux/sched/signal.h>\n#else\n#include <linux/signal.h>\n#endif\n#include \"mhi.h\"\n#include \"mhi_internal.h\"\n\nstruct mhi_controller_map {\n\tu32 dev_id;\n\tu32 domain;\n\tu32 bus;\n\tu32 slot;\n    struct mhi_controller *mhi_cntrl;\n};\n\n#define MAX_MHI_CONTROLLER 16\nstruct mhi_controller_map mhi_controller_minors[MAX_MHI_CONTROLLER];\n\n#define MHI_CNTRL_DRIVER_NAME \"mhi_cntrl_q\"\nstruct mhi_cntrl_drv {\n\tstruct list_head head;\n\tstruct mutex lock;\n\tstruct class *class;\n\tint major;\n};\nstatic struct mhi_cntrl_drv mhi_cntrl_drv;\n\nconst char * const mhi_ee_str[MHI_EE_MAX] = {\n\t[MHI_EE_PBL] = \"PBL\",\n\t[MHI_EE_SBL] = \"SBL\",\n\t[MHI_EE_AMSS] = \"AMSS\",\n\t[MHI_EE_RDDM] = \"RDDM\",\n\t[MHI_EE_WFW] = \"WFW\",\n\t[MHI_EE_PTHRU] = \"PASS THRU\",\n\t[MHI_EE_EDL] = \"EDL\",\n\t[MHI_EE_FP] = \"FlashProg\",\n\t[MHI_EE_DISABLE_TRANSITION] = \"DISABLE\",\n};\n\nconst char * const mhi_state_tran_str[MHI_ST_TRANSITION_MAX] = {\n\t[MHI_ST_TRANSITION_PBL] = \"PBL\",\n\t[MHI_ST_TRANSITION_READY] = \"READY\",\n\t[MHI_ST_TRANSITION_SBL] = \"SBL\",\n\t[MHI_ST_TRANSITION_MISSION_MODE] = \"MISSION MODE\",\n\t[MHI_ST_TRANSITION_FP] = \"FlashProg\",\n};\n\nconst char * const mhi_state_str[MHI_STATE_MAX] = {\n\t[MHI_STATE_RESET] = \"RESET\",\n\t[MHI_STATE_READY] = \"READY\",\n\t[MHI_STATE_M0] = \"M0\",\n\t[MHI_STATE_M1] = \"M1\",\n\t[MHI_STATE_M2] = \"M2\",\n\t[MHI_STATE_M3] = \"M3\",\n\t[MHI_STATE_BHI] = \"BHI\",\n\t[MHI_STATE_SYS_ERR] = \"SYS_ERR\",\n};\n\nstatic const char * const mhi_pm_state_str[] = {\n\t[MHI_PM_BIT_DISABLE] = \"DISABLE\",\n\t[MHI_PM_BIT_POR] = \"POR\",\n\t[MHI_PM_BIT_M0] = \"M0\",\n\t[MHI_PM_BIT_M2] = \"M2\",\n\t[MHI_PM_BIT_M3_ENTER] = \"M?->M3\",\n\t[MHI_PM_BIT_M3] = \"M3\",\n\t[MHI_PM_BIT_M3_EXIT] = \"M3->M0\",\n\t[MHI_PM_BIT_FW_DL_ERR] = \"FW DL Error\",\n\t[MHI_PM_BIT_SYS_ERR_DETECT] = \"SYS_ERR Detect\",\n\t[MHI_PM_BIT_SYS_ERR_PROCESS] = \"SYS_ERR Process\",\n\t[MHI_PM_BIT_SHUTDOWN_PROCESS] = \"SHUTDOWN Process\",\n\t[MHI_PM_BIT_LD_ERR_FATAL_DETECT] = \"LD or Error Fatal Detect\",\n};\n\nstruct mhi_bus mhi_bus;\n\nconst char *to_mhi_pm_state_str(enum MHI_PM_STATE state)\n{\n\tunsigned long value = state;\n\tint index = find_last_bit(&value, 32);\n\n\tif (index >= ARRAY_SIZE(mhi_pm_state_str))\n\t\treturn \"Invalid State\";\n\n\treturn mhi_pm_state_str[index];\n}\n\n#if 0\n/* MHI protocol require transfer ring to be aligned to ring length */\nstatic int mhi_alloc_aligned_ring(struct mhi_controller *mhi_cntrl,\n\t\t\t\t  struct mhi_ring *ring,\n\t\t\t\t  u64 len)\n{\n\tring->alloc_size = len + (len - 1);\n\tring->pre_aligned = mhi_alloc_coherent(mhi_cntrl, ring->alloc_size,\n\t\t\t\t\t       &ring->dma_handle, GFP_KERNEL);\n\tif (!ring->pre_aligned)\n\t\treturn -ENOMEM;\n\n\tring->iommu_base = (ring->dma_handle + (len - 1)) & ~(len - 1);\n\tring->base = ring->pre_aligned + (ring->iommu_base - ring->dma_handle);\n\treturn 0;\n}\n#endif\n\nstatic void mhi_ring_aligned_check(struct mhi_controller *mhi_cntrl, u64 rbase, u64 rlen) {\n\tuint64_t ra;\n\n\tra = rbase;\n\tdo_div(ra, roundup_pow_of_two(rlen));\n\n\tif (rbase != ra * roundup_pow_of_two(rlen)) {\n\t\tMHI_ERR(\"bad params ring base not aligned 0x%llx align 0x%lx\\n\", rbase, roundup_pow_of_two(rlen));\n\t}\n}\n\nvoid mhi_deinit_free_irq(struct mhi_controller *mhi_cntrl)\n{\n\tint i;\n\tstruct mhi_event *mhi_event = mhi_cntrl->mhi_event;\n\n\n\tif (mhi_cntrl->msi_allocated == 1) {\n\t\tfree_irq(mhi_cntrl->irq[mhi_cntrl->msi_irq_base], mhi_cntrl);\n\t\treturn;\n\t}\n\n\tfor (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {\n\t\tif (mhi_event->offload_ev)\n\t\t\tcontinue;\n\n\t\tfree_irq(mhi_cntrl->irq[mhi_event->msi], mhi_event);\n\t}\n\n\tfree_irq(mhi_cntrl->irq[mhi_cntrl->msi_irq_base], mhi_cntrl);\n}\n\nint mhi_init_irq_setup(struct mhi_controller *mhi_cntrl)\n{\n\tint i;\n\tint ret;\n\tstruct mhi_event *mhi_event = mhi_cntrl->mhi_event;\n\n\tif (mhi_cntrl->msi_allocated == 1) {\n\t\tfor (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {\n\t\t\tmhi_event->msi = 0;\n\t\t}\n\n\t\tret = request_threaded_irq(mhi_cntrl->irq[0], NULL,\n\t\t\t\t\t\t\t\tmhi_one_msi_handlr, IRQF_ONESHOT, \"mhi\", mhi_cntrl);\n\t\tif (ret) {\n\t\t\tMHI_ERR(\"Error requesting irq:%d, ret=%d\\n\", mhi_cntrl->irq[0], ret);\n\t\t}\n\t\treturn ret;\n\t}\n\n\t/* for BHI INTVEC msi */\n\tret = request_threaded_irq(mhi_cntrl->irq[mhi_cntrl->msi_irq_base], mhi_intvec_handlr,\n\t\t\t\t   mhi_intvec_threaded_handlr, IRQF_ONESHOT,\n\t\t\t\t   \"mhi\", mhi_cntrl);\n\tif (ret)\n\t\treturn ret;\n\n\tfor (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {\n\t\tif (mhi_event->offload_ev)\n\t\t\tcontinue;\n\n\t\tret = request_irq(mhi_cntrl->irq[mhi_event->msi],\n\t\t\t\t  mhi_msi_handlr, IRQF_SHARED, \"mhi\",\n\t\t\t\t  mhi_event);\n\t\tif (ret) {\n\t\t\tMHI_ERR(\"Error requesting irq:%d for ev:%d\\n\",\n\t\t\t\tmhi_cntrl->irq[mhi_event->msi], i);\n\t\t\tgoto error_request;\n\t\t}\n\t}\n\n\treturn 0;\n\nerror_request:\n\tfor (--i, --mhi_event; i >= 0; i--, mhi_event--) {\n\t\tif (mhi_event->offload_ev)\n\t\t\tcontinue;\n\n\t\tfree_irq(mhi_cntrl->irq[mhi_event->msi], mhi_event);\n\t}\n\tfree_irq(mhi_cntrl->irq[0], mhi_cntrl);\n\n\treturn ret;\n}\n\nvoid mhi_deinit_dev_ctxt(struct mhi_controller *mhi_cntrl)\n{\n\tint i;\n\tstruct mhi_ctxt *mhi_ctxt = mhi_cntrl->mhi_ctxt;\n\tstruct mhi_cmd *mhi_cmd;\n\tstruct mhi_event *mhi_event;\n\tstruct mhi_ring *ring;\n\n\tmhi_cmd = mhi_cntrl->mhi_cmd;\n\tfor (i = 0; i < NR_OF_CMD_RINGS; i++, mhi_cmd++) {\n\t\tring = &mhi_cmd->ring;\n#if 0\n\t\tmhi_free_coherent(mhi_cntrl, ring->alloc_size,\n\t\t\t\t  ring->pre_aligned, ring->dma_handle);\n#endif\n\t\tring->base = NULL;\n\t\tring->iommu_base = 0;\n\t}\n\n#if 0\n\tmhi_free_coherent(mhi_cntrl,\n\t\t\t  sizeof(*mhi_ctxt->cmd_ctxt) * NR_OF_CMD_RINGS,\n\t\t\t  mhi_ctxt->cmd_ctxt, mhi_ctxt->cmd_ctxt_addr);\n#endif\n\n\tmhi_event = mhi_cntrl->mhi_event;\n\tfor (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {\n\t\tif (mhi_event->offload_ev)\n\t\t\tcontinue;\n\n\t\tring = &mhi_event->ring;\n#if 0\n\t\tmhi_free_coherent(mhi_cntrl, ring->alloc_size,\n\t\t\t\t  ring->pre_aligned, ring->dma_handle);\n#endif\n\t\tring->base = NULL;\n\t\tring->iommu_base = 0;\n\t}\n\n#if 0\n\tmhi_free_coherent(mhi_cntrl, sizeof(*mhi_ctxt->er_ctxt) *\n\t\t\t  mhi_cntrl->total_ev_rings, mhi_ctxt->er_ctxt,\n\t\t\t  mhi_ctxt->er_ctxt_addr);\n\n\tmhi_free_coherent(mhi_cntrl, sizeof(*mhi_ctxt->chan_ctxt) *\n\t\t\t  mhi_cntrl->max_chan, mhi_ctxt->chan_ctxt,\n\t\t\t  mhi_ctxt->chan_ctxt_addr);\n#endif\n\n\tmhi_free_coherent(mhi_cntrl, sizeof(*mhi_ctxt->ctrl_seg), mhi_ctxt->ctrl_seg, mhi_ctxt->ctrl_seg_addr);\n\tkfree(mhi_ctxt);\n\tmhi_cntrl->mhi_ctxt = NULL;\n}\n\nstatic int mhi_init_debugfs_mhi_states_open(struct inode *inode,\n\t\t\t\t\t    struct file *fp)\n{\n\treturn single_open(fp, mhi_debugfs_mhi_states_show, inode->i_private);\n}\n\nstatic int mhi_init_debugfs_mhi_event_open(struct inode *inode, struct file *fp)\n{\n\treturn single_open(fp, mhi_debugfs_mhi_event_show, inode->i_private);\n}\n\nstatic int mhi_init_debugfs_mhi_chan_open(struct inode *inode, struct file *fp)\n{\n\treturn single_open(fp, mhi_debugfs_mhi_chan_show, inode->i_private);\n}\n\nstatic const struct file_operations debugfs_state_ops = {\n\t.open = mhi_init_debugfs_mhi_states_open,\n\t.release = single_release,\n\t.read = seq_read,\n};\n\nstatic const struct file_operations debugfs_ev_ops = {\n\t.open = mhi_init_debugfs_mhi_event_open,\n\t.release = single_release,\n\t.read = seq_read,\n};\n\nstatic const struct file_operations debugfs_chan_ops = {\n\t.open = mhi_init_debugfs_mhi_chan_open,\n\t.release = single_release,\n\t.read = seq_read,\n};\n\nDEFINE_SIMPLE_ATTRIBUTE(debugfs_trigger_reset_fops, NULL,\n\t\t\t mhi_debugfs_trigger_reset, \"%llu\\n\");\n\n#ifdef ENABLE_MHI_MON\nstruct mon_event_text {\n\tstruct list_head e_link;\n\tint type;\t\t/* submit, complete, etc. */\n\tunsigned int tstamp;\n\tu32 chan;\n\tdma_addr_t wp;\n\tstruct mhi_tre mhi_tre;\n\tu8 data[32];\n\tsize_t len;\n};\n\n#define EVENT_MAX  (16*PAGE_SIZE / sizeof(struct mon_event_text))\n#define PRINTF_DFL  250\n#define SLAB_NAME_SZ  30\n\nstruct mon_reader_text {\n\tstruct kmem_cache *e_slab;\n\tint nevents;\n\tstruct list_head e_list;\n\tstruct mon_reader r;\t/* In C, parent class can be placed anywhere */\n\n\twait_queue_head_t wait;\n\tint printf_size;\n\tchar *printf_buf;\n\tint left_size;\n\tint left_pos;\n\tstruct mutex printf_lock;\n\n\tchar slab_name[SLAB_NAME_SZ];\n};\n\nstruct mon_text_ptr {\n\tint cnt, limit;\n\tchar *pbuf;\n};\n\nstatic DEFINE_MUTEX(mon_lock);\n\nstatic inline unsigned int mon_get_timestamp(void)\n{\n\tstruct timespec64 now;\n\tunsigned int stamp;\n\n\tktime_get_ts64(&now);\n\tstamp = now.tv_sec & 0xFFF;  /* 2^32 = 4294967296. Limit to 4096s. */\n\tstamp = stamp * USEC_PER_SEC + now.tv_nsec / NSEC_PER_USEC;\n\treturn stamp;\n}\n\nstatic void mon_text_event(struct mon_reader_text *rp,\n    u32 chan, dma_addr_t wp, struct mhi_tre *mhi_tre, void *buf, size_t len,\n    char ev_type)\n{\n\tstruct mon_event_text *ep;\t\n\n\tif (rp->nevents >= EVENT_MAX ||\n\t    (ep = kmem_cache_alloc(rp->e_slab, GFP_ATOMIC)) == NULL) {\n\t\trp->r.m_bus->cnt_text_lost++;\n\t\treturn;\n\t}\n\n\tep->type = ev_type;\n\tep->tstamp = mon_get_timestamp();\n\tep->chan = chan;\n\tep->wp = wp;\n\tep->mhi_tre = *mhi_tre;\n\tif (len > sizeof(ep->data))\n\t\tlen = sizeof(ep->data);\n\tmemcpy(ep->data, buf, len);\n\tep->len = len;\n\trp->nevents++;\n\tlist_add_tail(&ep->e_link, &rp->e_list);\n\twake_up(&rp->wait);\n}\n\nstatic void mon_text_submit(void *data, u32 chan, dma_addr_t wp, struct mhi_tre *mhi_tre, void *buf, size_t len)\n{\n\tstruct mon_reader_text *rp = data;\n\tmon_text_event(rp, chan, wp, mhi_tre, buf, len, 'W');\n}\n\nstatic void mon_text_receive(void *data, u32 chan, dma_addr_t wp, struct mhi_tre *mhi_tre, void *buf, size_t len)\n{\n\tstruct mon_reader_text *rp = data;\n\tmon_text_event(rp, chan, wp, mhi_tre, buf, len, 'R');\n}\n\nstatic void mon_text_complete(void *data, u32 chan, dma_addr_t wp, struct mhi_tre *mhi_tre)\n{\n\tstruct mon_reader_text *rp = data;\n\tmon_text_event(rp, chan, wp, mhi_tre, NULL, 0, 'E');\n}\n\nstatic void mon_reader_add(struct mhi_controller *mbus, struct mon_reader *r)\n{\n\tunsigned long flags;\n\n\tspin_lock_irqsave(&mbus->lock, flags);\n\tmbus->nreaders++;\n\tlist_add_tail(&r->r_link, &mbus->r_list);\n\tspin_unlock_irqrestore(&mbus->lock, flags);\n\n\tkref_get(&mbus->ref);\n}\n\nstatic void mon_bus_drop(struct kref *r)\n{\n\tstruct mhi_controller *mbus = container_of(r, struct mhi_controller, ref);\n\tkfree(mbus);\n}\n\nstatic void mon_reader_del(struct mhi_controller *mbus, struct mon_reader *r)\n{\n\tunsigned long flags;\n\n\tspin_lock_irqsave(&mbus->lock, flags);\n\tlist_del(&r->r_link);\n\t--mbus->nreaders;\n\tspin_unlock_irqrestore(&mbus->lock, flags);\n\n\tkref_put(&mbus->ref, mon_bus_drop);\n}\n\nstatic void mon_text_ctor(void *mem)\n{\n\t/*\n\t * Nothing to initialize. No, really!\n\t * So, we fill it with garbage to emulate a reused object.\n\t */\n\tmemset(mem, 0xe5, sizeof(struct mon_event_text));\n}\n\nstatic int mon_text_open(struct inode *inode, struct file *file)\n{\n\tstruct mhi_controller *mbus;\n\tstruct mon_reader_text *rp;\n\tint rc;\n\n\tmutex_lock(&mon_lock);\n\tmbus = inode->i_private;\n\n\trp = kzalloc(sizeof(struct mon_reader_text), GFP_KERNEL);\n\tif (rp == NULL) {\n\t\trc = -ENOMEM;\n\t\tgoto err_alloc;\n\t}\n\tINIT_LIST_HEAD(&rp->e_list);\n\tinit_waitqueue_head(&rp->wait);\n\tmutex_init(&rp->printf_lock);\n\n\trp->printf_size = PRINTF_DFL;\n\trp->printf_buf = kmalloc(rp->printf_size, GFP_KERNEL);\n\tif (rp->printf_buf == NULL) {\n\t\trc = -ENOMEM;\n\t\tgoto err_alloc_pr;\n\t}\n\n\trp->r.m_bus = mbus;\n\trp->r.r_data = rp;\n\trp->r.rnf_submit = mon_text_submit;\n\trp->r.rnf_receive = mon_text_receive;\n\trp->r.rnf_complete = mon_text_complete;\n\n\tsnprintf(rp->slab_name, SLAB_NAME_SZ, \"mon_text_%p\", rp);\n\trp->e_slab = kmem_cache_create(rp->slab_name,\n\t    sizeof(struct mon_event_text), sizeof(long), 0,\n\t    mon_text_ctor);\n\tif (rp->e_slab == NULL) {\n\t\trc = -ENOMEM;\n\t\tgoto err_slab;\n\t}\n\n\tmon_reader_add(mbus, &rp->r);\n\n\tfile->private_data = rp;\n\tmutex_unlock(&mon_lock);\n\treturn 0;\n\n// err_busy:\n//\tkmem_cache_destroy(rp->e_slab);\nerr_slab:\n\tkfree(rp->printf_buf);\nerr_alloc_pr:\n\tkfree(rp);\nerr_alloc:\n\tmutex_unlock(&mon_lock);\n\treturn rc;\n}\n\nstatic struct mon_event_text *mon_text_fetch(struct mon_reader_text *rp,\n    struct mhi_controller *mbus)\n{\n\tstruct list_head *p;\n\tunsigned long flags;\n\n\tspin_lock_irqsave(&mbus->lock, flags);\n\tif (list_empty(&rp->e_list)) {\n\t\tspin_unlock_irqrestore(&mbus->lock, flags);\n\t\treturn NULL;\n\t}\n\tp = rp->e_list.next;\n\tlist_del(p);\n\t--rp->nevents;\n\tspin_unlock_irqrestore(&mbus->lock, flags);\n\treturn list_entry(p, struct mon_event_text, e_link);\n}\n\nstatic struct mon_event_text *mon_text_read_wait(struct mon_reader_text *rp,\n    struct file *file)\n{\n\tstruct mhi_controller *mbus = rp->r.m_bus;\n\tDECLARE_WAITQUEUE(waita, current);\n\tstruct mon_event_text *ep;\n\n\tadd_wait_queue(&rp->wait, &waita);\n\tset_current_state(TASK_INTERRUPTIBLE);\n\twhile ((ep = mon_text_fetch(rp, mbus)) == NULL) {\n\t\tif (file->f_flags & O_NONBLOCK) {\n\t\t\tset_current_state(TASK_RUNNING);\n\t\t\tremove_wait_queue(&rp->wait, &waita);\n\t\t\treturn ERR_PTR(-EWOULDBLOCK);\n\t\t}\n\t\t/*\n\t\t * We do not count nwaiters, because ->release is supposed\n\t\t * to be called when all openers are gone only.\n\t\t */\n\t\tschedule();\n\t\tif (signal_pending(current)) {\n\t\t\tremove_wait_queue(&rp->wait, &waita);\n\t\t\treturn ERR_PTR(-EINTR);\n\t\t}\n\t\tset_current_state(TASK_INTERRUPTIBLE);\n\t}\n\tset_current_state(TASK_RUNNING);\n\tremove_wait_queue(&rp->wait, &waita);\n\treturn ep;\n}\n\nstatic ssize_t mon_text_read_u(struct file *file, char __user *buf,\n\t\t\t\tsize_t nbytes, loff_t *ppos)\n{\n\tstruct mon_reader_text *rp = file->private_data;\n\tstruct mon_event_text *ep;\n\tstruct mon_text_ptr ptr;\n\n\tif (rp->left_size) {\n\t\tint cnt = rp->left_size;\n\n\t\tif (cnt > nbytes)\n\t\t\tcnt = nbytes;\n\t\tif (copy_to_user(buf, rp->printf_buf + rp->left_pos, cnt))\n\t\t\treturn -EFAULT;\n\t\trp->left_pos += cnt;\n\t\trp->left_size -= cnt;\n\t\treturn cnt;\n\t}\n\n\tif (IS_ERR(ep = mon_text_read_wait(rp, file)))\n\t\treturn PTR_ERR(ep);\n\tmutex_lock(&rp->printf_lock);\n\tptr.cnt = 0;\n\tptr.pbuf = rp->printf_buf;\n\tptr.limit = rp->printf_size;\n\n\tptr.cnt += snprintf(ptr.pbuf + ptr.cnt, ptr.limit - ptr.cnt,\n\t\t\"%u %c %03d WP:%llx TRE: %llx %08x %08x\",\n\t\tep->tstamp, ep->type, ep->chan, (long long unsigned int)ep->wp,\n\t\tep->mhi_tre.ptr, ep->mhi_tre.dword[0], ep->mhi_tre.dword[1]);\n\n\tif (ep->len) {\n\t\tstruct mon_text_ptr *p = &ptr;\n\t\tsize_t i = 0;\n\n\t\tfor (i = 0; i < ep->len; i++) {\n\t\t\tif (i % 4 == 0) {\n\t\t\t\tp->cnt += snprintf(p->pbuf + p->cnt,\n\t\t\t\t    p->limit - p->cnt,\n\t\t\t\t    \" \");\n\t\t\t}\n\t\t\tp->cnt += snprintf(p->pbuf + p->cnt,\n\t\t\t    p->limit - p->cnt,\n\t\t\t    \"%02x\", ep->data[i]);\n\t\t}\n\n\t}\n\n\tptr.cnt += snprintf(ptr.pbuf +ptr.cnt, ptr.limit - ptr.cnt, \"\\n\");\n\n\tif (ptr.cnt > nbytes) {\n\t\trp->left_pos = nbytes;\n\t\trp->left_size = ptr.cnt - nbytes;\n\t\tptr.cnt = nbytes;\n\t}\n\n\tif (copy_to_user(buf, rp->printf_buf, ptr.cnt))\n\t\tptr.cnt = -EFAULT;\n\tmutex_unlock(&rp->printf_lock);\n\tkmem_cache_free(rp->e_slab, ep);\n\treturn ptr.cnt;\n}\n\nstatic int mon_text_release(struct inode *inode, struct file *file)\n{\n\tstruct mon_reader_text *rp = file->private_data;\n\tstruct mhi_controller *mbus;\n\t/* unsigned long flags; */\n\tstruct list_head *p;\n\tstruct mon_event_text *ep;\n\n\tmutex_lock(&mon_lock);\n\tmbus = inode->i_private;\n\n\tif (mbus->nreaders <= 0) {\n\t\tmutex_unlock(&mon_lock);\n\t\treturn 0;\n\t}\n\tmon_reader_del(mbus, &rp->r);\n\n\t/*\n\t * In theory, e_list is protected by mbus->lock. However,\n\t * after mon_reader_del has finished, the following is the case:\n\t *  - we are not on reader list anymore, so new events won't be added;\n\t *  - whole mbus may be dropped if it was orphaned.\n\t * So, we better not touch mbus.\n\t */\n\t/* spin_lock_irqsave(&mbus->lock, flags); */\n\twhile (!list_empty(&rp->e_list)) {\n\t\tp = rp->e_list.next;\n\t\tep = list_entry(p, struct mon_event_text, e_link);\n\t\tlist_del(p);\n\t\t--rp->nevents;\n\t\tkmem_cache_free(rp->e_slab, ep);\n\t}\n\t/* spin_unlock_irqrestore(&mbus->lock, flags); */\n\n\tkmem_cache_destroy(rp->e_slab);\n\tkfree(rp->printf_buf);\n\tkfree(rp);\n\n\tmutex_unlock(&mon_lock);\n\treturn 0;\n}\n\n\nstatic const struct file_operations mon_fops_text_u = {\n\t.owner =\tTHIS_MODULE,\n\t.open =\t\tmon_text_open,\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 12, 0))\n\t.llseek =\tno_llseek,\n#endif\n\t.read =\t\tmon_text_read_u,\n\t.release =\tmon_text_release,\n};\n#endif\n\nvoid mhi_init_debugfs(struct mhi_controller *mhi_cntrl)\n{\n\tstruct dentry *dentry;\n\tchar node[64];\n\n#ifdef ENABLE_MHI_MON\n\tstruct mhi_controller *mbus = mhi_cntrl;\n\n\tmbus->nreaders = 0;\n\tkref_init(&mbus->ref);\n\tspin_lock_init(&mbus->lock);\n\tINIT_LIST_HEAD(&mbus->r_list);\n#endif\n\n\tif (!mhi_cntrl->parent)\n\tsnprintf(node, sizeof(node), \"mhi_%04x_%02x:%02x.%02x\",\n\t\t mhi_cntrl->dev_id, mhi_cntrl->domain, mhi_cntrl->bus,\n\t\t mhi_cntrl->slot);\n\telse\n\tsnprintf(node, sizeof(node), \"%04x_%02x:%02x.%02x\",\n\t\t mhi_cntrl->dev_id, mhi_cntrl->domain, mhi_cntrl->bus,\n\t\t mhi_cntrl->slot);\n\n\tdentry = debugfs_create_dir(node, mhi_cntrl->parent);\n\tif (IS_ERR_OR_NULL(dentry))\n\t\treturn;\n\n\tdebugfs_create_file(\"states\", 0444, dentry, mhi_cntrl,\n\t\t\t\t   &debugfs_state_ops);\n\tdebugfs_create_file(\"events\", 0444, dentry, mhi_cntrl,\n\t\t\t\t   &debugfs_ev_ops);\n\tdebugfs_create_file(\"chan\", 0444, dentry, mhi_cntrl,\n\t\t\t\t   &debugfs_chan_ops);\n\tdebugfs_create_file(\"reset\", 0444, dentry, mhi_cntrl,\n\t\t\t\t   &debugfs_trigger_reset_fops);\n#ifdef ENABLE_MHI_MON\n\tdebugfs_create_file(\"mhimon\", 0444, dentry, mhi_cntrl,\n\t\t\t\t   &mon_fops_text_u);\n#endif\n\tmhi_cntrl->dentry = dentry;\n}\n\nvoid mhi_deinit_debugfs(struct mhi_controller *mhi_cntrl)\n{\n\tdebugfs_remove_recursive(mhi_cntrl->dentry);\n\tmhi_cntrl->dentry = NULL;\n}\n\nint mhi_init_dev_ctxt(struct mhi_controller *mhi_cntrl)\n{\n\tstruct mhi_ctxt *mhi_ctxt;\n\tstruct mhi_chan_ctxt *chan_ctxt;\n\tstruct mhi_event_ctxt *er_ctxt;\n\tstruct mhi_cmd_ctxt *cmd_ctxt;\n\tstruct mhi_chan *mhi_chan;\n\tstruct mhi_event *mhi_event;\n\tstruct mhi_cmd *mhi_cmd;\n\tint ret = -ENOMEM, i;\n\n\tatomic_set(&mhi_cntrl->dev_wake, 0);\n\tatomic_set(&mhi_cntrl->alloc_size, 0);\n\tatomic_set(&mhi_cntrl->pending_pkts, 0);\n\n\tmhi_ctxt = kzalloc(sizeof(*mhi_ctxt), GFP_KERNEL);\n\tif (!mhi_ctxt)\n\t\treturn -ENOMEM;\n\n\tmhi_ctxt->ctrl_seg = mhi_alloc_coherent(mhi_cntrl, sizeof(*mhi_ctxt->ctrl_seg),\n\t\t\t&mhi_ctxt->ctrl_seg_addr, GFP_KERNEL);\n\tMHI_LOG(\"mhi_ctxt->ctrl_seg = %p\\n\", mhi_ctxt->ctrl_seg);\n\tif (!mhi_ctxt->ctrl_seg)\n\t\tgoto error_alloc_chan_ctxt;\n\n\tif ((unsigned long)mhi_ctxt->ctrl_seg & (4096-1)) {\n\t\tmhi_free_coherent(mhi_cntrl, sizeof(*mhi_ctxt->ctrl_seg), mhi_ctxt->ctrl_seg, mhi_ctxt->ctrl_seg_addr);\n\t\tgoto error_alloc_chan_ctxt;\n\t}\n\n\t/* setup channel ctxt */\n#if 1\n\tmhi_ctxt->chan_ctxt = mhi_ctxt->ctrl_seg->chan_ctxt;\n\tmhi_ctxt->chan_ctxt_addr = mhi_ctxt->ctrl_seg_addr + offsetof(struct mhi_ctrl_seg, chan_ctxt);\n#else\n\tmhi_ctxt->chan_ctxt = mhi_alloc_coherent(mhi_cntrl,\n\t\t\tsizeof(*mhi_ctxt->chan_ctxt) * mhi_cntrl->max_chan,\n\t\t\t&mhi_ctxt->chan_ctxt_addr, GFP_KERNEL);\n\tif (!mhi_ctxt->chan_ctxt)\n\t\tgoto error_alloc_chan_ctxt;\n#endif\n\n\tmhi_chan = mhi_cntrl->mhi_chan;\n\tchan_ctxt = mhi_ctxt->chan_ctxt;\n\tfor (i = 0; i < mhi_cntrl->max_chan; i++, chan_ctxt++, mhi_chan++) {\n\t\t/* If it's offload channel skip this step */\n\t\tif (mhi_chan->offload_ch)\n\t\t\tcontinue;\n\n\t\tchan_ctxt->chstate = MHI_CH_STATE_DISABLED;\n\t\tchan_ctxt->brstmode = mhi_chan->db_cfg.brstmode;\n\t\tchan_ctxt->pollcfg = mhi_chan->db_cfg.pollcfg;\n\t\tchan_ctxt->chtype = mhi_chan->type;\n\t\tchan_ctxt->erindex = mhi_chan->er_index;\n\n\t\tmhi_chan->ch_state = MHI_CH_STATE_DISABLED;\n\t\tmhi_chan->tre_ring.db_addr = &chan_ctxt->wp;\n\t}\n\n\t/* setup event context */\n#if 1\n\tmhi_ctxt->er_ctxt = mhi_ctxt->ctrl_seg->er_ctxt;\n\tmhi_ctxt->er_ctxt_addr = mhi_ctxt->ctrl_seg_addr + offsetof(struct mhi_ctrl_seg, er_ctxt);\n#else\n\tmhi_ctxt->er_ctxt = mhi_alloc_coherent(mhi_cntrl,\n\t\t\tsizeof(*mhi_ctxt->er_ctxt) * mhi_cntrl->total_ev_rings,\n\t\t\t&mhi_ctxt->er_ctxt_addr, GFP_KERNEL);\n\tif (!mhi_ctxt->er_ctxt)\n\t\tgoto error_alloc_er_ctxt;\n#endif\n\n\ter_ctxt = mhi_ctxt->er_ctxt;\n\tmhi_event = mhi_cntrl->mhi_event;\n\tfor (i = 0; i < mhi_cntrl->total_ev_rings; i++, er_ctxt++,\n\t\t     mhi_event++) {\n\t\tstruct mhi_ring *ring = &mhi_event->ring;\n\n\t\t/* it's a satellite ev, we do not touch it */\n\t\tif (mhi_event->offload_ev)\n\t\t\tcontinue;\n\n\t\ter_ctxt->intmodc = 0;\n\t\ter_ctxt->intmodt = mhi_event->intmod;\n\t\ter_ctxt->ertype = MHI_ER_TYPE_VALID;\n\t\tif (mhi_cntrl->msi_allocated == 1) {\n\t\t\tmhi_event->msi = 0;\n\t\t}\n\t\ter_ctxt->msivec = mhi_event->msi;\n\t\tmhi_event->db_cfg.db_mode = true;\n\n\t\tring->el_size = sizeof(struct mhi_tre);\n\t\tring->len = ring->el_size * ring->elements;\n#if 1\n\t\tring->alloc_size = ring->len;\n\t\tring->pre_aligned = mhi_ctxt->ctrl_seg->event_ring[i];\n\t\tring->dma_handle = mhi_ctxt->ctrl_seg_addr + offsetof(struct mhi_ctrl_seg, event_ring[i]);\n\t\tring->iommu_base = ring->dma_handle;\n\t\tring->base = ring->pre_aligned + (ring->iommu_base - ring->dma_handle);\n#else\n\t\tret = mhi_alloc_aligned_ring(mhi_cntrl, ring, ring->len);\n\t\tif (ret)\n\t\t\tgoto error_alloc_er;\n#endif\n\n\t\tring->rp = ring->wp = ring->base;\n\t\ter_ctxt->rbase = ring->iommu_base;\n\t\ter_ctxt->rp = er_ctxt->wp = er_ctxt->rbase;\n\t\ter_ctxt->rlen = ring->len;\n\t\tring->ctxt_wp = &er_ctxt->wp;\n\n\t\tmhi_ring_aligned_check(mhi_cntrl, er_ctxt->rbase, er_ctxt->rlen);\n\t\tmemset(ring->base, 0xCC, ring->len);\n\t}\n\n\t/* setup cmd context */\n#if 1\n\tmhi_ctxt->cmd_ctxt = mhi_ctxt->ctrl_seg->cmd_ctxt;\n\tmhi_ctxt->cmd_ctxt_addr = mhi_ctxt->ctrl_seg_addr + offsetof(struct mhi_ctrl_seg, cmd_ctxt);\n#else\n\tmhi_ctxt->cmd_ctxt = mhi_alloc_coherent(mhi_cntrl,\n\t\t\t\tsizeof(*mhi_ctxt->cmd_ctxt) * NR_OF_CMD_RINGS,\n\t\t\t\t&mhi_ctxt->cmd_ctxt_addr, GFP_KERNEL);\n\tif (!mhi_ctxt->cmd_ctxt)\n\t\tgoto error_alloc_er;\n#endif\n\n\tmhi_cmd = mhi_cntrl->mhi_cmd;\n\tcmd_ctxt = mhi_ctxt->cmd_ctxt;\n\tfor (i = 0; i < NR_OF_CMD_RINGS; i++, mhi_cmd++, cmd_ctxt++) {\n\t\tstruct mhi_ring *ring = &mhi_cmd->ring;\n\n\t\tring->el_size = sizeof(struct mhi_tre);\n\t\tring->elements = CMD_EL_PER_RING;\n\t\tring->len = ring->el_size * ring->elements;\n#if 1\n\t\tring->alloc_size = ring->len;\n\t\tring->pre_aligned = mhi_ctxt->ctrl_seg->cmd_ring[i];\n\t\tring->dma_handle = mhi_ctxt->ctrl_seg_addr + offsetof(struct mhi_ctrl_seg, cmd_ring[i]);\n\t\tring->iommu_base = ring->dma_handle;\n\t\tring->base = ring->pre_aligned + (ring->iommu_base - ring->dma_handle);\n#else\n\t\tret = mhi_alloc_aligned_ring(mhi_cntrl, ring, ring->len);\n\t\tif (ret)\n\t\t\tgoto error_alloc_cmd;\n#endif\n\n\t\tring->rp = ring->wp = ring->base;\n\t\tcmd_ctxt->rbase = ring->iommu_base;\n\t\tcmd_ctxt->rp = cmd_ctxt->wp = cmd_ctxt->rbase;\n\t\tcmd_ctxt->rlen = ring->len;\n\t\tring->ctxt_wp = &cmd_ctxt->wp;\n\n\t\tmhi_ring_aligned_check(mhi_cntrl, cmd_ctxt->rbase, cmd_ctxt->rlen);\n\t}\n\n\tmhi_cntrl->mhi_ctxt = mhi_ctxt;\n\n\treturn 0;\n\n#if 0\nerror_alloc_cmd:\n\tfor (--i, --mhi_cmd; i >= 0; i--, mhi_cmd--) {\n\t\tstruct mhi_ring *ring = &mhi_cmd->ring;\n\n\t\tmhi_free_coherent(mhi_cntrl, ring->alloc_size,\n\t\t\t\t  ring->pre_aligned, ring->dma_handle);\n\t}\n\tmhi_free_coherent(mhi_cntrl,\n\t\t\t  sizeof(*mhi_ctxt->cmd_ctxt) * NR_OF_CMD_RINGS,\n\t\t\t  mhi_ctxt->cmd_ctxt, mhi_ctxt->cmd_ctxt_addr);\n\ti = mhi_cntrl->total_ev_rings;\n\tmhi_event = mhi_cntrl->mhi_event + i;\n\nerror_alloc_er:\n\tfor (--i, --mhi_event; i >= 0; i--, mhi_event--) {\n\t\tstruct mhi_ring *ring = &mhi_event->ring;\n\n\t\tif (mhi_event->offload_ev)\n\t\t\tcontinue;\n\n\t\tmhi_free_coherent(mhi_cntrl, ring->alloc_size,\n\t\t\t\t  ring->pre_aligned, ring->dma_handle);\n\t}\n\tmhi_free_coherent(mhi_cntrl, sizeof(*mhi_ctxt->er_ctxt) *\n\t\t\t  mhi_cntrl->total_ev_rings, mhi_ctxt->er_ctxt,\n\t\t\t  mhi_ctxt->er_ctxt_addr);\n\nerror_alloc_er_ctxt:\n\tmhi_free_coherent(mhi_cntrl, sizeof(*mhi_ctxt->chan_ctxt) *\n\t\t\t  mhi_cntrl->max_chan, mhi_ctxt->chan_ctxt,\n\t\t\t  mhi_ctxt->chan_ctxt_addr);\n#endif\n\nerror_alloc_chan_ctxt:\n\tkfree(mhi_ctxt);\n\n\treturn ret;\n}\n\nstatic int mhi_get_tsync_er_cfg(struct mhi_controller *mhi_cntrl)\n{\n\tint i;\n\tstruct mhi_event *mhi_event = mhi_cntrl->mhi_event;\n\n\t/* find event ring with timesync support */\n\tfor (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++)\n\t\tif (mhi_event->data_type == MHI_ER_TSYNC_ELEMENT_TYPE)\n\t\t\treturn mhi_event->er_index;\n\n\treturn -ENOENT;\n}\n\nint mhi_init_timesync(struct mhi_controller *mhi_cntrl)\n{\n\tstruct mhi_timesync *mhi_tsync;\n\tu32 time_offset, db_offset;\n\tint ret;\n\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\n\tif (!MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state)) {\n\t\tret = -EIO;\n\t\tgoto exit_timesync;\n\t}\n\n\tret = mhi_get_capability_offset(mhi_cntrl, TIMESYNC_CAP_ID,\n\t\t\t\t\t&time_offset);\n\tif (ret) {\n\t\tMHI_LOG(\"No timesync capability found\\n\");\n\t\tgoto exit_timesync;\n\t}\n\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\tif (!mhi_cntrl->time_get || !mhi_cntrl->lpm_disable ||\n\t     !mhi_cntrl->lpm_enable)\n\t\treturn -EINVAL;\n\n\t/* register method supported */\n\tmhi_tsync = kzalloc(sizeof(*mhi_tsync), GFP_KERNEL);\n\tif (!mhi_tsync)\n\t\treturn -ENOMEM;\n\n\tspin_lock_init(&mhi_tsync->lock);\n\tINIT_LIST_HEAD(&mhi_tsync->head);\n\tinit_completion(&mhi_tsync->completion);\n\n\t/* save time_offset for obtaining time */\n\tMHI_LOG(\"TIME OFFS:0x%x\\n\", time_offset);\n\tmhi_tsync->time_reg = mhi_cntrl->regs + time_offset\n\t\t\t      + TIMESYNC_TIME_LOW_OFFSET;\n\n\tmhi_cntrl->mhi_tsync = mhi_tsync;\n\n\tret = mhi_create_timesync_sysfs(mhi_cntrl);\n\tif (unlikely(ret)) {\n\t\t/* kernel method still work */\n\t\tMHI_ERR(\"Failed to create timesync sysfs nodes\\n\");\n\t}\n\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\n\tif (!MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state)) {\n\t\tret = -EIO;\n\t\tgoto exit_timesync;\n\t}\n\n\t/* get DB offset if supported, else return */\n\tret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs,\n\t\t\t   time_offset + TIMESYNC_DB_OFFSET, &db_offset);\n\tif (ret || !db_offset) {\n\t\tret = 0;\n\t\tgoto exit_timesync;\n\t}\n\n\tMHI_LOG(\"TIMESYNC_DB OFFS:0x%x\\n\", db_offset);\n\tmhi_tsync->db = mhi_cntrl->regs + db_offset;\n\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\t/* get time-sync event ring configuration */\n\tret = mhi_get_tsync_er_cfg(mhi_cntrl);\n\tif (ret < 0) {\n\t\tMHI_LOG(\"Could not find timesync event ring\\n\");\n\t\treturn ret;\n\t}\n\n\tmhi_tsync->er_index = ret;\n\n\tret = mhi_send_cmd(mhi_cntrl, NULL, MHI_CMD_TIMSYNC_CFG);\n\tif (ret) {\n\t\tMHI_ERR(\"Failed to send time sync cfg cmd\\n\");\n\t\treturn ret;\n\t}\n\n\tret = wait_for_completion_timeout(&mhi_tsync->completion,\n\t\t\tmsecs_to_jiffies(mhi_cntrl->timeout_ms));\n\n\tif (!ret || mhi_tsync->ccs != MHI_EV_CC_SUCCESS) {\n\t\tMHI_ERR(\"Failed to get time cfg cmd completion\\n\");\n\t\treturn -EIO;\n\t}\n\n\treturn 0;\n\nexit_timesync:\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\treturn ret;\n}\n\nint mhi_init_mmio(struct mhi_controller *mhi_cntrl)\n{\n\tu32 val = 0;\n\tint i, ret;\n\tstruct mhi_chan *mhi_chan;\n\tstruct mhi_event *mhi_event;\n\tvoid __iomem *base = mhi_cntrl->regs;\n\tstruct {\n\t\tu32 offset;\n\t\tu32 mask;\n\t\tu32 shift;\n\t\tu32 val;\n\t} reg_info[] = {\n\t\t{\n\t\t\tCCABAP_HIGHER, U32_MAX, 0,\n\t\t\tupper_32_bits(mhi_cntrl->mhi_ctxt->chan_ctxt_addr),\n\t\t},\n\t\t{\n\t\t\tCCABAP_LOWER, U32_MAX, 0,\n\t\t\tlower_32_bits(mhi_cntrl->mhi_ctxt->chan_ctxt_addr),\n\t\t},\n\t\t{\n\t\t\tECABAP_HIGHER, U32_MAX, 0,\n\t\t\tupper_32_bits(mhi_cntrl->mhi_ctxt->er_ctxt_addr),\n\t\t},\n\t\t{\n\t\t\tECABAP_LOWER, U32_MAX, 0,\n\t\t\tlower_32_bits(mhi_cntrl->mhi_ctxt->er_ctxt_addr),\n\t\t},\n\t\t{\n\t\t\tCRCBAP_HIGHER, U32_MAX, 0,\n\t\t\tupper_32_bits(mhi_cntrl->mhi_ctxt->cmd_ctxt_addr),\n\t\t},\n\t\t{\n\t\t\tCRCBAP_LOWER, U32_MAX, 0,\n\t\t\tlower_32_bits(mhi_cntrl->mhi_ctxt->cmd_ctxt_addr),\n\t\t},\n#if 0 //carl.yin 20190527 UDE-WIN-InitMmio\n\t\t{\n\t\t\tMHICFG, MHICFG_NER_MASK, MHICFG_NER_SHIFT,\n\t\t\tmhi_cntrl->total_ev_rings,\n\t\t},\n\t\t{\n\t\t\tMHICFG, MHICFG_NHWER_MASK, MHICFG_NHWER_SHIFT,\n\t\t\tmhi_cntrl->hw_ev_rings,\n\t\t},\n#endif\n\t\t{\n\t\t\tMHICTRLBASE_HIGHER, U32_MAX, 0,\n\t\t\tupper_32_bits(mhi_cntrl->mhi_ctxt->ctrl_seg_addr),\n\t\t},\n\t\t{\n\t\t\tMHICTRLBASE_LOWER, U32_MAX, 0,\n\t\t\tlower_32_bits(mhi_cntrl->mhi_ctxt->ctrl_seg_addr),\n\t\t},\n\t\t{\n\t\t\tMHIDATABASE_HIGHER, U32_MAX, 0,\n\t\t\tupper_32_bits(mhi_cntrl->iova_start),\n\t\t},\n\t\t{\n\t\t\tMHIDATABASE_LOWER, U32_MAX, 0,\n\t\t\tlower_32_bits(mhi_cntrl->iova_start),\n\t\t},\n\t\t{\n\t\t\tMHICTRLLIMIT_HIGHER, U32_MAX, 0,\n\t\t\tupper_32_bits(mhi_cntrl->mhi_ctxt->ctrl_seg_addr+sizeof(struct mhi_ctrl_seg)),\n\t\t},\n\t\t{\n\t\t\tMHICTRLLIMIT_LOWER, U32_MAX, 0,\n\t\t\tlower_32_bits(mhi_cntrl->mhi_ctxt->ctrl_seg_addr+sizeof(struct mhi_ctrl_seg)),\n\t\t},\n\t\t{\n\t\t\tMHIDATALIMIT_HIGHER, U32_MAX, 0,\n\t\t\tupper_32_bits(mhi_cntrl->iova_stop),\n\t\t},\n\t\t{\n\t\t\tMHIDATALIMIT_LOWER, U32_MAX, 0,\n\t\t\tlower_32_bits(mhi_cntrl->iova_stop),\n\t\t},\n\t\t{ 0, 0, 0, 0 }\n\t};\n\n\tMHI_LOG(\"Initializing MMIO\\n\");\n\n\t/* set up DB register for all the chan rings */\n\tret = mhi_read_reg_field(mhi_cntrl, base, CHDBOFF, CHDBOFF_CHDBOFF_MASK,\n\t\t\t\t CHDBOFF_CHDBOFF_SHIFT, &val);\n\tif (ret)\n\t\treturn -EIO;\n\n\tMHI_LOG(\"CHDBOFF:0x%x\\n\", val);\n\n\t/* setup wake db */\n\tmhi_cntrl->wake_db = base + val + (8 * MHI_DEV_WAKE_DB);\n#if 0 //'EM120RGLAPR02A07M4G_11' will treate as chan 127's interrput, and report complete event over cmd ring, but cmd ring is not set by now\n\tmhi_write_reg(mhi_cntrl, mhi_cntrl->wake_db, 4, 0);\n\tmhi_write_reg(mhi_cntrl, mhi_cntrl->wake_db, 0, 0);\n\tmhi_cntrl->wake_set = false;\n#endif\n\n\t/* setup channel db addresses */\n\tmhi_chan = mhi_cntrl->mhi_chan;\n\tfor (i = 0; i < mhi_cntrl->max_chan; i++, val += 8, mhi_chan++)\n\t\tmhi_chan->tre_ring.db_addr = base + val;\n\n\t/* setup event ring db addresses */\n\tret = mhi_read_reg_field(mhi_cntrl, base, ERDBOFF, ERDBOFF_ERDBOFF_MASK,\n\t\t\t\t ERDBOFF_ERDBOFF_SHIFT, &val);\n\tif (ret)\n\t\treturn -EIO;\n\n\tMHI_LOG(\"ERDBOFF:0x%x\\n\", val);\n\n\tmhi_event = mhi_cntrl->mhi_event;\n\tfor (i = 0; i < mhi_cntrl->total_ev_rings; i++, val += 8, mhi_event++) {\n\t\tif (mhi_event->offload_ev)\n\t\t\tcontinue;\n\n\t\tmhi_event->ring.db_addr = base + val;\n\t}\n\n\t/* set up DB register for primary CMD rings */\n\tmhi_cntrl->mhi_cmd[PRIMARY_CMD_RING].ring.db_addr = base + CRDB_LOWER;\n\n\tMHI_LOG(\"Programming all MMIO values.\\n\");\n\tfor (i = 0; reg_info[i].offset; i++)\n\t\tmhi_write_reg_field(mhi_cntrl, base, reg_info[i].offset,\n\t\t\t\t    reg_info[i].mask, reg_info[i].shift,\n\t\t\t\t    reg_info[i].val);\n\n\treturn 0;\n}\n\nvoid mhi_deinit_chan_ctxt(struct mhi_controller *mhi_cntrl,\n\t\t\t  struct mhi_chan *mhi_chan)\n{\n\tstruct mhi_ring *buf_ring;\n\tstruct mhi_ring *tre_ring;\n\tstruct mhi_chan_ctxt *chan_ctxt;\n\n\tbuf_ring = &mhi_chan->buf_ring;\n\ttre_ring = &mhi_chan->tre_ring;\n\tchan_ctxt = &mhi_cntrl->mhi_ctxt->chan_ctxt[mhi_chan->chan];\n\n#if 0\n\tmhi_free_coherent(mhi_cntrl, tre_ring->alloc_size,\n\t\t\t  tre_ring->pre_aligned, tre_ring->dma_handle);\n#endif\n\tkfree(buf_ring->base);\n\n\tbuf_ring->base = tre_ring->base = NULL;\n\tchan_ctxt->rbase = 0;\n}\n\nint mhi_init_chan_ctxt(struct mhi_controller *mhi_cntrl,\n\t\t       struct mhi_chan *mhi_chan)\n{\n\tstruct mhi_ring *buf_ring;\n\tstruct mhi_ring *tre_ring;\n\tstruct mhi_chan_ctxt *chan_ctxt;\n\tint ret;\n\n\tbuf_ring = &mhi_chan->buf_ring;\n\ttre_ring = &mhi_chan->tre_ring;\n\ttre_ring->el_size = sizeof(struct mhi_tre);\n\ttre_ring->len = tre_ring->el_size * tre_ring->elements;\n\tchan_ctxt = &mhi_cntrl->mhi_ctxt->chan_ctxt[mhi_chan->chan];\n#if 1\n\ttre_ring->alloc_size = tre_ring->len;\n\tif (MHI_CLIENT_IP_HW_0_IN == mhi_chan->chan) {\n\t\ttre_ring->pre_aligned = &mhi_cntrl->mhi_ctxt->ctrl_seg->hw_in_chan_ring[mhi_chan->ring];\n\t\ttre_ring->dma_handle = mhi_cntrl->mhi_ctxt->ctrl_seg_addr + offsetof(struct mhi_ctrl_seg, hw_in_chan_ring[mhi_chan->ring]);\n\t}\n\telse if (MHI_CLIENT_IP_HW_0_OUT == mhi_chan->chan) {\n\t\ttre_ring->pre_aligned = &mhi_cntrl->mhi_ctxt->ctrl_seg->hw_out_chan_ring[mhi_chan->ring];\n\t\ttre_ring->dma_handle = mhi_cntrl->mhi_ctxt->ctrl_seg_addr + offsetof(struct mhi_ctrl_seg, hw_out_chan_ring[mhi_chan->ring]);\n\t}\n#ifdef ENABLE_IP_SW0\n\telse if (MHI_CLIENT_IP_SW_0_IN == mhi_chan->chan) {\n\t\ttre_ring->pre_aligned = &mhi_cntrl->mhi_ctxt->ctrl_seg->sw_in_chan_ring[mhi_chan->ring];\n\t\ttre_ring->dma_handle = mhi_cntrl->mhi_ctxt->ctrl_seg_addr + offsetof(struct mhi_ctrl_seg, sw_in_chan_ring[mhi_chan->ring]);\n\t}\n\telse if (MHI_CLIENT_IP_SW_0_OUT == mhi_chan->chan) {\n\t\ttre_ring->pre_aligned = &mhi_cntrl->mhi_ctxt->ctrl_seg->sw_out_chan_ring[mhi_chan->ring];\n\t\ttre_ring->dma_handle = mhi_cntrl->mhi_ctxt->ctrl_seg_addr + offsetof(struct mhi_ctrl_seg, sw_out_chan_ring[mhi_chan->ring]);\n\t}\n#endif\n\n#ifdef ENABLE_ADPL\n\telse if (MHI_CLIENT_ADPL == mhi_chan->chan) {\n\t\ttre_ring->pre_aligned = &mhi_cntrl->mhi_ctxt->ctrl_seg->adpl_in_chan_ring[mhi_chan->ring];\n\t\ttre_ring->dma_handle = mhi_cntrl->mhi_ctxt->ctrl_seg_addr + offsetof(struct mhi_ctrl_seg, adpl_in_chan_ring[mhi_chan->ring]);\n\t}\n#endif\n\n#ifdef ENABLE_QDSS\n\telse if (MHI_CLIENT_IP_HW_QDSS == mhi_chan->chan) {\n\t\ttre_ring->pre_aligned = &mhi_cntrl->mhi_ctxt->ctrl_seg->qdss_in_chan_ring[mhi_chan->ring];\n\t\ttre_ring->dma_handle = mhi_cntrl->mhi_ctxt->ctrl_seg_addr + offsetof(struct mhi_ctrl_seg, qdss_in_chan_ring[mhi_chan->ring]);\n\t}\n#endif\n\n\telse if (MHI_CLIENT_DIAG_IN == mhi_chan->chan) {\n\t\ttre_ring->pre_aligned = &mhi_cntrl->mhi_ctxt->ctrl_seg->diag_in_chan_ring[mhi_chan->ring];\n\t\ttre_ring->dma_handle = mhi_cntrl->mhi_ctxt->ctrl_seg_addr + offsetof(struct mhi_ctrl_seg, diag_in_chan_ring[mhi_chan->ring]);\n\t}\n\telse {\n\t\ttre_ring->pre_aligned = &mhi_cntrl->mhi_ctxt->ctrl_seg->chan_ring[mhi_chan->ring];\n\t\ttre_ring->dma_handle = mhi_cntrl->mhi_ctxt->ctrl_seg_addr + offsetof(struct mhi_ctrl_seg, chan_ring[mhi_chan->ring]);\n\t}\n\ttre_ring->iommu_base = tre_ring->dma_handle;\n\ttre_ring->base = tre_ring->pre_aligned + (tre_ring->iommu_base - tre_ring->dma_handle);\n\tret = 0;\n#else\n\tret = mhi_alloc_aligned_ring(mhi_cntrl, tre_ring, tre_ring->len);\n#endif\n\tif (ret)\n\t\treturn -ENOMEM;\n\n\tbuf_ring->el_size = sizeof(struct mhi_buf_info);\n\tbuf_ring->len = buf_ring->el_size * buf_ring->elements;\n\tbuf_ring->base = kzalloc(buf_ring->len, GFP_KERNEL);\n\n\tif (!buf_ring->base) {\n#if 0\n\t\tmhi_free_coherent(mhi_cntrl, tre_ring->alloc_size,\n\t\t\t\t  tre_ring->pre_aligned, tre_ring->dma_handle);\n#endif\n\t\treturn -ENOMEM;\n\t}\n\n\tchan_ctxt->chstate = MHI_CH_STATE_ENABLED;\n\tchan_ctxt->rbase = tre_ring->iommu_base;\n\tchan_ctxt->rp = chan_ctxt->wp = chan_ctxt->rbase;\n\tchan_ctxt->rlen = tre_ring->len;\n\ttre_ring->ctxt_wp = &chan_ctxt->wp;\n\n\ttre_ring->rp = tre_ring->wp = tre_ring->base;\n\tbuf_ring->rp = buf_ring->wp = buf_ring->base;\n\tmhi_chan->db_cfg.db_mode = true;\n\n\tmhi_ring_aligned_check(mhi_cntrl, chan_ctxt->rbase, chan_ctxt->rlen);\n\t/* update to all cores */\n\tsmp_wmb();\n\n\treturn 0;\n}\n\nint mhi_device_configure(struct mhi_device *mhi_dev,\n\t\t\t enum dma_data_direction dir,\n\t\t\t struct mhi_buf *cfg_tbl,\n\t\t\t int elements)\n{\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tstruct mhi_chan *mhi_chan;\n\tstruct mhi_event_ctxt *er_ctxt;\n\tstruct mhi_chan_ctxt *ch_ctxt;\n\tint er_index, chan;\n\n\tswitch (dir) {\n\tcase DMA_TO_DEVICE:\n\t\tmhi_chan = mhi_dev->ul_chan;\n\t\tbreak;\n\tcase DMA_BIDIRECTIONAL:\n\tcase DMA_FROM_DEVICE:\n\tcase DMA_NONE:\n\t\tmhi_chan = mhi_dev->dl_chan;\n\t\tbreak;\n\tdefault:\n\t\treturn -EINVAL;\n\t}\n\n\ter_index = mhi_chan->er_index;\n\tchan = mhi_chan->chan;\n\n\tfor (; elements > 0; elements--, cfg_tbl++) {\n\t\t/* update event context array */\n\t\tif (!strcmp(cfg_tbl->name, \"ECA\")) {\n\t\t\ter_ctxt = &mhi_cntrl->mhi_ctxt->er_ctxt[er_index];\n\t\t\tif (sizeof(*er_ctxt) != cfg_tbl->len) {\n\t\t\t\tMHI_ERR(\n\t\t\t\t\t\"Invalid ECA size, expected:%zu actual%zu\\n\",\n\t\t\t\t\tsizeof(*er_ctxt), cfg_tbl->len);\n\t\t\t\treturn -EINVAL;\n\t\t\t}\n\t\t\tmemcpy((void *)er_ctxt, cfg_tbl->buf, sizeof(*er_ctxt));\n\t\t\tcontinue;\n\t\t}\n\n\t\t/* update channel context array */\n\t\tif (!strcmp(cfg_tbl->name, \"CCA\")) {\n\t\t\tch_ctxt = &mhi_cntrl->mhi_ctxt->chan_ctxt[chan];\n\t\t\tif (cfg_tbl->len != sizeof(*ch_ctxt)) {\n\t\t\t\tMHI_ERR(\n\t\t\t\t\t\"Invalid CCA size, expected:%zu actual:%zu\\n\",\n\t\t\t\t\tsizeof(*ch_ctxt), cfg_tbl->len);\n\t\t\t\treturn -EINVAL;\n\t\t\t}\n\t\t\tmemcpy((void *)ch_ctxt, cfg_tbl->buf, sizeof(*ch_ctxt));\n\t\t\tcontinue;\n\t\t}\n\n\t\treturn -EINVAL;\n\t}\n\n\treturn 0;\n}\n\n#if 0\nstatic int of_parse_ev_cfg(struct mhi_controller *mhi_cntrl,\n\t\t\t   struct device_node *of_node)\n{\n\tint i, ret, num = 0;\n\tstruct mhi_event *mhi_event;\n\tstruct device_node *child;\n\n\tof_node = of_find_node_by_name(of_node, \"mhi_events\");\n\tif (!of_node)\n\t\treturn -EINVAL;\n\n\tfor_each_available_child_of_node(of_node, child) {\n\t\tif (!strcmp(child->name, \"mhi_event\"))\n\t\t\tnum++;\n\t}\n\n\tif (!num)\n\t\treturn -EINVAL;\n\n\tmhi_cntrl->total_ev_rings = num;\n\tmhi_cntrl->mhi_event = kcalloc(num, sizeof(*mhi_cntrl->mhi_event),\n\t\t\t\t       GFP_KERNEL);\n\tif (!mhi_cntrl->mhi_event)\n\t\treturn -ENOMEM;\n\n\t/* populate ev ring */\n\tmhi_event = mhi_cntrl->mhi_event;\n\ti = 0;\n\tfor_each_available_child_of_node(of_node, child) {\n\t\tif (strcmp(child->name, \"mhi_event\"))\n\t\t\tcontinue;\n\n\t\tmhi_event->er_index = i++;\n\t\tret = of_property_read_u32(child, \"mhi,num-elements\",\n\t\t\t\t\t   (u32 *)&mhi_event->ring.elements);\n\t\tif (ret)\n\t\t\tgoto error_ev_cfg;\n\n\t\tret = of_property_read_u32(child, \"mhi,intmod\",\n\t\t\t\t\t   &mhi_event->intmod);\n\t\tif (ret)\n\t\t\tgoto error_ev_cfg;\n\n\t\tret = of_property_read_u32(child, \"mhi,msi\",\n\t\t\t\t\t   &mhi_event->msi);\n\t\tif (ret)\n\t\t\tgoto error_ev_cfg;\n\n\t\tret = of_property_read_u32(child, \"mhi,chan\",\n\t\t\t\t\t   &mhi_event->chan);\n\t\tif (!ret) {\n\t\t\tif (mhi_event->chan >= mhi_cntrl->max_chan)\n\t\t\t\tgoto error_ev_cfg;\n\t\t\t/* this event ring has a dedicated channel */\n\t\t\tmhi_event->mhi_chan =\n\t\t\t\t&mhi_cntrl->mhi_chan[mhi_event->chan];\n\t\t}\n\n\t\tret = of_property_read_u32(child, \"mhi,priority\",\n\t\t\t\t\t   &mhi_event->priority);\n\t\tif (ret)\n\t\t\tgoto error_ev_cfg;\n\n\t\tret = of_property_read_u32(child, \"mhi,brstmode\",\n\t\t\t\t\t   &mhi_event->db_cfg.brstmode);\n\t\tif (ret || MHI_INVALID_BRSTMODE(mhi_event->db_cfg.brstmode))\n\t\t\tgoto error_ev_cfg;\n\n\t\tmhi_event->db_cfg.process_db =\n\t\t\t(mhi_event->db_cfg.brstmode == MHI_BRSTMODE_ENABLE) ?\n\t\t\tmhi_db_brstmode : mhi_db_brstmode_disable;\n\n\t\tret = of_property_read_u32(child, \"mhi,data-type\",\n\t\t\t\t\t   &mhi_event->data_type);\n\t\tif (ret)\n\t\t\tmhi_event->data_type = MHI_ER_DATA_ELEMENT_TYPE;\n\n\t\tif (mhi_event->data_type > MHI_ER_DATA_TYPE_MAX)\n\t\t\tgoto error_ev_cfg;\n\n\t\tswitch (mhi_event->data_type) {\n\t\tcase MHI_ER_DATA_ELEMENT_TYPE:\n\t\t\tmhi_event->process_event = mhi_process_data_event_ring;\n\t\t\tbreak;\n\t\tcase MHI_ER_CTRL_ELEMENT_TYPE:\n\t\t\tmhi_event->process_event = mhi_process_ctrl_ev_ring;\n\t\t\tbreak;\n\t\tcase MHI_ER_TSYNC_ELEMENT_TYPE:\n\t\t\tmhi_event->process_event = mhi_process_tsync_event_ring;\n\t\t\tbreak;\n\t\t}\n\n\t\tmhi_event->hw_ring = of_property_read_bool(child, \"mhi,hw-ev\");\n\t\tif (mhi_event->hw_ring)\n\t\t\tmhi_cntrl->hw_ev_rings++;\n\t\telse\n\t\t\tmhi_cntrl->sw_ev_rings++;\n\t\tmhi_event->cl_manage = of_property_read_bool(child,\n\t\t\t\t\t\t\t\"mhi,client-manage\");\n\t\tmhi_event->offload_ev = of_property_read_bool(child,\n\t\t\t\t\t\t\t      \"mhi,offload\");\n\t\tmhi_event++;\n\t}\n\n\t/* we need msi for each event ring + additional one for BHI */\n\tmhi_cntrl->msi_required = mhi_cntrl->total_ev_rings + 1;\n\n\treturn 0;\n\nerror_ev_cfg:\n\n\tkfree(mhi_cntrl->mhi_event);\n\treturn -EINVAL;\n}\nstatic int of_parse_ch_cfg(struct mhi_controller *mhi_cntrl,\n\t\t\t   struct device_node *of_node)\n{\n\tint ret;\n\tstruct device_node *child;\n\tu32 chan;\n\n\tret = of_property_read_u32(of_node, \"mhi,max-channels\",\n\t\t\t\t   &mhi_cntrl->max_chan);\n\tif (ret)\n\t\treturn ret;\n\n\tof_node = of_find_node_by_name(of_node, \"mhi_channels\");\n\tif (!of_node)\n\t\treturn -EINVAL;\n\n\tmhi_cntrl->mhi_chan = kcalloc(mhi_cntrl->max_chan,\n\t\t\t\t      sizeof(*mhi_cntrl->mhi_chan), GFP_KERNEL);\n\tif (!mhi_cntrl->mhi_chan)\n\t\treturn -ENOMEM;\n\n\tINIT_LIST_HEAD(&mhi_cntrl->lpm_chans);\n\n\t/* populate channel configurations */\n\tfor_each_available_child_of_node(of_node, child) {\n\t\tstruct mhi_chan *mhi_chan;\n\n\t\tif (strcmp(child->name, \"mhi_chan\"))\n\t\t\tcontinue;\n\n\t\tret = of_property_read_u32(child, \"reg\", &chan);\n\t\tif (ret || chan >= mhi_cntrl->max_chan)\n\t\t\tgoto error_chan_cfg;\n\n\t\tmhi_chan = &mhi_cntrl->mhi_chan[chan];\n\n\t\tret = of_property_read_string(child, \"label\",\n\t\t\t\t\t      &mhi_chan->name);\n\t\tif (ret)\n\t\t\tgoto error_chan_cfg;\n\n\t\tmhi_chan->chan = chan;\n\n\t\tret = of_property_read_u32(child, \"mhi,num-elements\",\n\t\t\t\t\t   (u32 *)&mhi_chan->tre_ring.elements);\n\t\tif (!ret && !mhi_chan->tre_ring.elements)\n\t\t\tgoto error_chan_cfg;\n\n\t\t/*\n\t\t * For some channels, local ring len should be bigger than\n\t\t * transfer ring len due to internal logical channels in device.\n\t\t * So host can queue much more buffers than transfer ring len.\n\t\t * Example, RSC channels should have a larger local channel\n\t\t * than transfer ring length.\n\t\t */\n\t\tret = of_property_read_u32(child, \"mhi,local-elements\",\n\t\t\t\t\t   (u32 *)&mhi_chan->buf_ring.elements);\n\t\tif (ret)\n\t\t\tmhi_chan->buf_ring.elements =\n\t\t\t\tmhi_chan->tre_ring.elements;\n\n\t\tret = of_property_read_u32(child, \"mhi,event-ring\",\n\t\t\t\t\t   &mhi_chan->er_index);\n\t\tif (ret)\n\t\t\tgoto error_chan_cfg;\n\n\t\tret = of_property_read_u32(child, \"mhi,chan-dir\",\n\t\t\t\t\t   &mhi_chan->dir);\n\t\tif (ret)\n\t\t\tgoto error_chan_cfg;\n\n\t\t/*\n\t\t * For most channels, chtype is identical to channel directions,\n\t\t * if not defined, assign ch direction to chtype\n\t\t */\n\t\tret = of_property_read_u32(child, \"mhi,chan-type\",\n\t\t\t\t\t   &mhi_chan->type);\n\t\tif (ret)\n\t\t\tmhi_chan->type = (enum mhi_ch_type)mhi_chan->dir;\n\n\t\tret = of_property_read_u32(child, \"mhi,ee\", &mhi_chan->ee_mask);\n\t\tif (ret)\n\t\t\tgoto error_chan_cfg;\n\n\t\tof_property_read_u32(child, \"mhi,pollcfg\",\n\t\t\t\t     &mhi_chan->db_cfg.pollcfg);\n\n\t\tret = of_property_read_u32(child, \"mhi,data-type\",\n\t\t\t\t\t   &mhi_chan->xfer_type);\n\t\tif (ret)\n\t\t\tgoto error_chan_cfg;\n\n\t\tswitch (mhi_chan->xfer_type) {\n\t\tcase MHI_XFER_BUFFER:\n\t\t\tmhi_chan->gen_tre = mhi_gen_tre;\n\t\t\tmhi_chan->queue_xfer = mhi_queue_buf;\n\t\t\tbreak;\n\t\tcase MHI_XFER_SKB:\n\t\t\tmhi_chan->queue_xfer = mhi_queue_skb;\n\t\t\tbreak;\n\t\tcase MHI_XFER_SCLIST:\n\t\t\tmhi_chan->gen_tre = mhi_gen_tre;\n\t\t\tmhi_chan->queue_xfer = mhi_queue_sclist;\n\t\t\tbreak;\n\t\tcase MHI_XFER_NOP:\n\t\t\tmhi_chan->queue_xfer = mhi_queue_nop;\n\t\t\tbreak;\n\t\tcase MHI_XFER_DMA:\n\t\tcase MHI_XFER_RSC_DMA:\n\t\t\tmhi_chan->queue_xfer = mhi_queue_dma;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tgoto error_chan_cfg;\n\t\t}\n\n\t\tmhi_chan->lpm_notify = of_property_read_bool(child,\n\t\t\t\t\t\t\t     \"mhi,lpm-notify\");\n\t\tmhi_chan->offload_ch = of_property_read_bool(child,\n\t\t\t\t\t\t\t\"mhi,offload-chan\");\n\t\tmhi_chan->db_cfg.reset_req = of_property_read_bool(child,\n\t\t\t\t\t\t\t\"mhi,db-mode-switch\");\n\t\tmhi_chan->pre_alloc = of_property_read_bool(child,\n\t\t\t\t\t\t\t    \"mhi,auto-queue\");\n\t\tmhi_chan->auto_start = of_property_read_bool(child,\n\t\t\t\t\t\t\t     \"mhi,auto-start\");\n\t\tmhi_chan->wake_capable = of_property_read_bool(child,\n\t\t\t\t\t\t\t\"mhi,wake-capable\");\n\n\t\tif (mhi_chan->pre_alloc &&\n\t\t    (mhi_chan->dir != DMA_FROM_DEVICE ||\n\t\t     mhi_chan->xfer_type != MHI_XFER_BUFFER))\n\t\t\tgoto error_chan_cfg;\n\n\t\t/* bi-dir and dirctionless channels must be a offload chan */\n\t\tif ((mhi_chan->dir == DMA_BIDIRECTIONAL ||\n\t\t     mhi_chan->dir == DMA_NONE) && !mhi_chan->offload_ch)\n\t\t\tgoto error_chan_cfg;\n\n\t\t/* if mhi host allocate the buffers then client cannot queue */\n\t\tif (mhi_chan->pre_alloc)\n\t\t\tmhi_chan->queue_xfer = mhi_queue_nop;\n\n\t\tif (!mhi_chan->offload_ch) {\n\t\t\tret = of_property_read_u32(child, \"mhi,doorbell-mode\",\n\t\t\t\t\t\t   &mhi_chan->db_cfg.brstmode);\n\t\t\tif (ret ||\n\t\t\t    MHI_INVALID_BRSTMODE(mhi_chan->db_cfg.brstmode))\n\t\t\t\tgoto error_chan_cfg;\n\n\t\t\tmhi_chan->db_cfg.process_db =\n\t\t\t\t(mhi_chan->db_cfg.brstmode ==\n\t\t\t\t MHI_BRSTMODE_ENABLE) ?\n\t\t\t\tmhi_db_brstmode : mhi_db_brstmode_disable;\n\t\t}\n\n\t\tmhi_chan->configured = true;\n\n\t\tif (mhi_chan->lpm_notify)\n\t\t\tlist_add_tail(&mhi_chan->node, &mhi_cntrl->lpm_chans);\n\t}\n\n\treturn 0;\n\nerror_chan_cfg:\n\tkfree(mhi_cntrl->mhi_chan);\n\n\treturn -EINVAL;\n}\n#else\nstatic int of_parse_ev_cfg(struct mhi_controller *mhi_cntrl,\n\t\t\t   struct device_node *of_node)\n{\n\tint i, num = 0;\n\tstruct mhi_event *mhi_event;\n\n\tnum = NUM_MHI_EVT_RINGS;\n\tmhi_cntrl->total_ev_rings = num;\n\tmhi_cntrl->mhi_event = kcalloc(num, sizeof(*mhi_cntrl->mhi_event),\n\t\t\t\t       GFP_KERNEL);\n\tif (!mhi_cntrl->mhi_event)\n\t\treturn -ENOMEM;\n\n\tmhi_cntrl->msi_irq_base = 0;\n\t/* populate ev ring */\n\tmhi_event = mhi_cntrl->mhi_event;\n\ti = 0;\n\n\tfor (i = 0; i < mhi_cntrl->total_ev_rings; i++) {\n\t\tmhi_event->er_index = i;\n\n\t\tmhi_event->ring.elements = NUM_MHI_EVT_RING_ELEMENTS; //Event ring length in elements\n\t\tif (i == PRIMARY_EVENT_RING)\n\t\t\tmhi_event->ring.elements = 256; //256 is enough, and 1024 some times make driver fail to open channel (reason is x6x fail to malloc) \n\n\t\tmhi_event->intmod = 1; //Interrupt moderation time in ms\n\n#ifdef ENABLE_ADPL \n\t\tif (i == ADPL_EVT_RING)\n            mhi_event->ring.elements = 256;\n#endif\n\n#ifdef ENABLE_QDSS\n\t\tif (i == QDSS_EVT_RING)\n            mhi_event->ring.elements = 512;\n#endif\n\n\t\t/* see mhi_netdev_status_cb(), when interrupt come, the napi_poll maybe scheduled, so can reduce interrupts\n\t\troot@OpenWrt:/# cat /proc/interrupts | grep mhi\n\t\troot@OpenWrt:/# cat /sys/kernel/debug/mhi_q/mhi_netdev/pcie_mhi_0306_00.01.00_0/rx_int \n\t\t*/\n\t\tif (i == IPA_IN_EVENT_RING || i == IPA_OUT_EVENT_RING)\n\t\t\tmhi_event->intmod = 5;\n\n#ifdef ENABLE_IP_SW0\n\t\tif (i == SW_0_IN_EVT_RING)\n\t\t\tmhi_event->intmod = 5;\n#endif\n\n#ifdef ENABLE_ADPL\n\t\tif (i == ADPL_EVT_RING)\n\t\t\tmhi_event->intmod = 0;\n#endif\n\n#ifdef ENABLE_QDSS\n\t\tif (i == QDSS_EVT_RING)\n\t\t\tmhi_event->intmod = 0;\n#endif\n\n\t\tmhi_event->msi = 1 + i + mhi_cntrl->msi_irq_base;  //MSI associated with this event ring\n\n\t\tif (i == IPA_OUT_EVENT_RING)\n\t\t\tmhi_event->chan = MHI_CLIENT_IP_HW_0_OUT; //Dedicated channel number, if it's a dedicated event ring\n\t\telse if (i == IPA_IN_EVENT_RING)\n\t\t\tmhi_event->chan = MHI_CLIENT_IP_HW_0_IN; //Dedicated channel number, if it's a dedicated event ring\n#ifdef ENABLE_IP_SW0\n\t\telse if (i == SW_0_OUT_EVT_RING)\n\t\t\tmhi_event->chan = MHI_CLIENT_IP_SW_0_OUT;\n\t\telse if (i == SW_0_IN_EVT_RING)\n\t\t\tmhi_event->chan = MHI_CLIENT_IP_SW_0_IN;\n#endif\n\n#ifdef ENABLE_ADPL\n\t\telse if (i == ADPL_EVT_RING)\n\t\t\tmhi_event->chan = MHI_CLIENT_ADPL;\n#endif\n\n#ifdef ENABLE_QDSS\n\t\telse if (i == QDSS_EVT_RING)\n\t\t\tmhi_event->chan = MHI_CLIENT_IP_HW_QDSS;\n#endif\n\t\telse\n\t\t\tmhi_event->chan = 0;\n\n\t\t/* this event ring has a dedicated channel */\n\t\tmhi_event->mhi_chan =\n\t\t\t&mhi_cntrl->mhi_chan[mhi_event->chan];\n\n\t\tmhi_event->priority = 1; //Event ring priority, set to 1 for now\n\n\t\tif (mhi_event->chan && mhi_event->mhi_chan->db_cfg.brstmode == MHI_BRSTMODE_ENABLE)\n\t\t\tmhi_event->db_cfg.brstmode = MHI_BRSTMODE_ENABLE;\n\t\telse\n\t\t\tmhi_event->db_cfg.brstmode = MHI_BRSTMODE_DISABLE;\n\n\t\tmhi_event->db_cfg.process_db =\n\t\t\t(mhi_event->db_cfg.brstmode == MHI_BRSTMODE_ENABLE) ?\n\t\t\tmhi_db_brstmode : mhi_db_brstmode_disable;\n\n\t\tif (i == IPA_OUT_EVENT_RING || i == IPA_IN_EVENT_RING)\n\t\t\tmhi_event->data_type = MHI_ER_DATA_ELEMENT_TYPE;\n#ifdef ENABLE_IP_SW0\n\t\telse if (i == SW_0_OUT_EVT_RING || i == SW_0_IN_EVT_RING)\n\t\t\tmhi_event->data_type = MHI_ER_DATA_ELEMENT_TYPE;\n#endif\n\n#ifdef ENABLE_ADPL\n\t\telse if (i == ADPL_EVT_RING)\n\t\t\tmhi_event->data_type = MHI_ER_DATA_ELEMENT_TYPE;\n#endif\n\n#ifdef ENABLE_QDSS\n\t\telse if (i == QDSS_EVT_RING)\n\t\t\tmhi_event->data_type = MHI_ER_DATA_ELEMENT_TYPE;\n#endif\n\t\telse\n\t\t\tmhi_event->data_type = MHI_ER_CTRL_ELEMENT_TYPE;\n\n\t\tswitch (mhi_event->data_type) {\n\t\tcase MHI_ER_DATA_ELEMENT_TYPE:\n\t\t\tmhi_event->process_event = mhi_process_data_event_ring;\n\t\t\tbreak;\n\t\tcase MHI_ER_CTRL_ELEMENT_TYPE:\n\t\t\tmhi_event->process_event = mhi_process_ctrl_ev_ring;\n\t\t\tbreak;\n\t\tcase MHI_ER_TSYNC_ELEMENT_TYPE:\n\t\t\tmhi_event->process_event = mhi_process_tsync_event_ring;\n\t\t\tbreak;\n\t\t}\n\n\t\tif (i == IPA_OUT_EVENT_RING || i == IPA_IN_EVENT_RING\n#ifdef ENABLE_ADPL\n \t\t\t|| i == ADPL_EVT_RING\n#endif\n#ifdef ENABLE_QDSS\n\t\t\t|| i == QDSS_EVT_RING\n#endif\n\t\t)\n\t\t\tmhi_event->hw_ring = true;\n\t\telse\n\t\t\tmhi_event->hw_ring = false;\n\n\t\tif (mhi_event->hw_ring)\n\t\t\tmhi_cntrl->hw_ev_rings++;\n\t\telse\n\t\t\tmhi_cntrl->sw_ev_rings++;\n\n\t\tmhi_event->cl_manage = false;\n\t\tif (mhi_event->chan == MHI_CLIENT_IP_HW_0_IN || mhi_event->chan == MHI_CLIENT_IP_SW_0_IN)\n\t\t\tmhi_event->cl_manage = true;\n\t\tmhi_event->offload_ev = false;\n\t\tmhi_event++;\n\t}\n\n\t/* we need msi for each event ring + additional one for BHI */\n\tmhi_cntrl->msi_required = mhi_cntrl->total_ev_rings + 1 + mhi_cntrl->msi_irq_base;\n\n\treturn 0;\n}\n\nstruct chan_cfg_t {\n\tconst char *chan_name;\n\tu32 chan_id;\n\tu32 elements;\n};\n\nstatic struct chan_cfg_t chan_cfg[] = {\n//\"Qualcomm PCIe Loopback\"\n\t{\"LOOPBACK\", MHI_CLIENT_LOOPBACK_OUT, NUM_MHI_CHAN_RING_ELEMENTS},\n\t{\"LOOPBACK\", MHI_CLIENT_LOOPBACK_IN, NUM_MHI_CHAN_RING_ELEMENTS},\n//\"Qualcomm PCIe Sahara\"\n\t{\"SAHARA\", MHI_CLIENT_SAHARA_OUT, NUM_MHI_CHAN_RING_ELEMENTS},\n\t{\"SAHARA\", MHI_CLIENT_SAHARA_IN, NUM_MHI_CHAN_RING_ELEMENTS},\n//\"Qualcomm PCIe Diagnostics\"\n\t{\"DIAG\", MHI_CLIENT_DIAG_OUT, NUM_MHI_CHAN_RING_ELEMENTS},\n\t{\"DIAG\", MHI_CLIENT_DIAG_IN, NUM_MHI_DIAG_IN_RING_ELEMENTS},\n//\"Qualcomm PCIe QDSS Data\"\n//\"Do not use this QDSS. xingduo.du 2023-02-16\"\n//\t{\"QDSS\", MHI_CLIENT_QDSS_OUT, NUM_MHI_CHAN_RING_ELEMENTS},\n//\t{\"QDSS\", MHI_CLIENT_QDSS_IN, NUM_MHI_CHAN_RING_ELEMENTS},\n//\"Qualcomm PCIe EFS\"\n\t{\"EFS\", MHI_CLIENT_EFS_OUT, NUM_MHI_CHAN_RING_ELEMENTS},\n\t{\"EFS\", MHI_CLIENT_EFS_IN, NUM_MHI_CHAN_RING_ELEMENTS},\n//\"Qualcomm PCIe MBIM\"\n\t{\"MBIM\", MHI_CLIENT_MBIM_OUT, NUM_MHI_CHAN_RING_ELEMENTS},\n\t{\"MBIM\", MHI_CLIENT_MBIM_IN, NUM_MHI_CHAN_RING_ELEMENTS},\n//\"Qualcomm PCIe QMI\"\n\t{\"QMI0\", MHI_CLIENT_QMI_OUT, NUM_MHI_CHAN_RING_ELEMENTS},\n\t{\"QMI0\", MHI_CLIENT_QMI_IN, NUM_MHI_CHAN_RING_ELEMENTS},\n//\"Qualcomm PCIe QMI\"\n\t//{\"QMI1\", MHI_CLIENT_QMI_2_OUT, NUM_MHI_CHAN_RING_ELEMENTS},\n\t//{\"QMI1\", MHI_CLIENT_QMI_2_IN, NUM_MHI_CHAN_RING_ELEMENTS},\n//\"Qualcomm PCIe IP CTRL\"\n\t{\"IP_CTRL\", MHI_CLIENT_IP_CTRL_1_OUT, NUM_MHI_CHAN_RING_ELEMENTS},\n\t{\"IP_CTRL\", MHI_CLIENT_IP_CTRL_1_IN, NUM_MHI_CHAN_RING_ELEMENTS},\n#if 0 //AG15\n//\"Qualcomm PCIe IPCR\"\n\t{\"IPCR\", MHI_CLIENT_DIAG_CONS_IF_OUT, NUM_MHI_CHAN_RING_ELEMENTS},\n\t{\"IPCR\", MHI_CLIENT_DIAG_CONS_IF_IN, NUM_MHI_CHAN_RING_ELEMENTS},\n#endif\n//\"Qualcomm PCIe Boot Logging\"\n\t//{\"BL\", MHI_CLIENT_BOOT_LOG_OUT, NUM_MHI_CHAN_RING_ELEMENTS},\n\t//{\"BL\", MHI_CLIENT_BOOT_LOG_IN, NUM_MHI_CHAN_RING_ELEMENTS},\n//\"Qualcomm PCIe Modem\"\n\t{\"DUN\", MHI_CLIENT_DUN_OUT, NUM_MHI_CHAN_RING_ELEMENTS},\n\t{\"DUN\", MHI_CLIENT_DUN_IN, NUM_MHI_CHAN_RING_ELEMENTS},\n//\"Qualcomm EDL \"\n\t{\"EDL\", MHI_CLIENT_EDL_OUT, NUM_MHI_CHAN_RING_ELEMENTS},\n\t{\"EDL\", MHI_CLIENT_EDL_IN, NUM_MHI_CHAN_RING_ELEMENTS},\n#ifdef ENABLE_IP_SW0\n//\"Qualcomm PCIe LOCAL Adapter\"\n\t{\"IP_SW0\", MHI_CLIENT_IP_SW_0_OUT, NUM_MHI_SW_IP_RING_ELEMENTS},\n\t{\"IP_SW0\", MHI_CLIENT_IP_SW_0_IN, NUM_MHI_SW_IP_RING_ELEMENTS},\n#endif\n//\"Qualcomm PCIe WWAN Adapter\"\n\t{\"IP_HW0\", MHI_CLIENT_IP_HW_0_OUT, NUM_MHI_IPA_OUT_RING_ELEMENTS},\n\t{\"IP_HW0\", MHI_CLIENT_IP_HW_0_IN, NUM_MHI_IPA_IN_RING_ELEMENTS},\n#ifdef ENABLE_ADPL\n\t{\"ADPL\", MHI_CLIENT_ADPL, NUM_MHI_ADPL_RING_ELEMENTS},\n#endif\n\n#ifdef ENABLE_QDSS\n\t{\"QDSS\", MHI_CLIENT_IP_HW_QDSS, NUM_MHI_QDSS_RING_ELEMENTS},\n#endif\n};\n\nextern int mhi_netdev_mbin_enabled(void);\nextern int mhi_netdev_use_xfer_type_dma(unsigned chan);\nstatic int of_parse_ch_cfg(struct mhi_controller *mhi_cntrl,\n\t\t\t   struct device_node *of_node)\n{\n\tu32 chan;\n\tu32 i, num;\n\tu32 ring = 0;\n\n\tmhi_cntrl->max_chan = MHI_MAX_CHANNELS;\n\tnum = sizeof(chan_cfg)/sizeof(chan_cfg[0]);\n\n\tmhi_cntrl->mhi_chan = kcalloc(mhi_cntrl->max_chan,\n\t\t\t\t      sizeof(*mhi_cntrl->mhi_chan), GFP_KERNEL);\n\tif (!mhi_cntrl->mhi_chan)\n\t\treturn -ENOMEM;\n\n\tINIT_LIST_HEAD(&mhi_cntrl->lpm_chans);\n\n\t/* populate channel configurations */\n\tfor (i = 0; i < num; i++) {\n\t\tstruct mhi_chan *mhi_chan;\n\n\t\tif (!strncmp( chan_cfg[i].chan_name, \"MBIM\", 4)) {\n\t\t\tif (!mhi_netdev_mbin_enabled())\n\t\t\t\tcontinue;\n\t\t}\n\t\telse if (!strncmp( chan_cfg[i].chan_name, \"QMI\", 3)) {\n\t\t\tif (mhi_netdev_mbin_enabled())\n\t\t\t\tcontinue;\n\t\t}\n\n\t\tchan = chan_cfg[i].chan_id;\n\n\t\tmhi_chan = &mhi_cntrl->mhi_chan[chan];\n\n\t\tmhi_chan->name = chan_cfg[i].chan_name;\n\n\t\tmhi_chan->chan = chan;\n\n\t\tmhi_chan->tre_ring.elements = chan_cfg[i].elements;\n\n\t\t/*\n\t\t * For some channels, local ring len should be bigger than\n\t\t * transfer ring len due to internal logical channels in device.\n\t\t * So host can queue much more buffers than transfer ring len.\n\t\t * Example, RSC channels should have a larger local channel\n\t\t * than transfer ring length.\n\t\t */\n\t\tmhi_chan->buf_ring.elements = mhi_chan->tre_ring.elements;\n\n\t\tif (chan == MHI_CLIENT_IP_HW_0_OUT || chan == MHI_CLIENT_IP_HW_0_IN || chan == MHI_CLIENT_DIAG_IN\n\t\t\t|| chan == MHI_CLIENT_IP_SW_0_OUT || chan == MHI_CLIENT_IP_SW_0_IN\n#ifdef ENABLE_ADPL\n\t\t\t|| chan == MHI_CLIENT_ADPL\n#endif\n#ifdef ENABLE_QDSS\n\t\t\t|| chan == MHI_CLIENT_IP_HW_QDSS\n#endif\n\t\t\t) {\n\t\t\tmhi_chan->ring = 0;\n\t\t}\n\t\telse {\n\t\t\tmhi_chan->ring = ring;\n\t\t\tring += mhi_chan->buf_ring.elements;\n\t\t}\n\n\t\tif (chan == MHI_CLIENT_IP_HW_0_OUT)\n\t\t\tmhi_chan->er_index = IPA_OUT_EVENT_RING;\n\t\telse if (chan == MHI_CLIENT_IP_HW_0_IN)\n\t\t\tmhi_chan->er_index = IPA_IN_EVENT_RING;\n#ifdef ENABLE_IP_SW0\n\t\telse if (chan == MHI_CLIENT_IP_SW_0_OUT)\n\t\t\tmhi_chan->er_index = SW_0_OUT_EVT_RING;\n\t\telse if (chan == MHI_CLIENT_IP_SW_0_IN)\n\t\t\tmhi_chan->er_index = SW_0_IN_EVT_RING;\n#endif\n\n#ifdef ENABLE_ADPL\n\t\telse if (chan == MHI_CLIENT_ADPL)\n\t\t\tmhi_chan->er_index = ADPL_EVT_RING;\n#endif\t\n#ifdef ENABLE_QDSS\n\t\telse if (chan == MHI_CLIENT_IP_HW_QDSS)\n\t\t\tmhi_chan->er_index = QDSS_EVT_RING;\n#endif\t\n\t\telse\n\t\t\tmhi_chan->er_index = PRIMARY_EVENT_RING;\n\n\t\tmhi_chan->dir = CHAN_INBOUND(chan) ? DMA_FROM_DEVICE : DMA_TO_DEVICE;\n\n#ifdef ENABLE_ADPL\n\t\tif (chan == MHI_CLIENT_ADPL)\n\t\t\tmhi_chan->dir = DMA_FROM_DEVICE;\n#endif\n\n#ifdef ENABLE_QDSS\n\t\tif (chan == MHI_CLIENT_IP_HW_QDSS)\n\t\t\tmhi_chan->dir = DMA_FROM_DEVICE;\n#endif\n\t\t/*\n\t\t * For most channels, chtype is identical to channel directions,\n\t\t * if not defined, assign ch direction to chtype\n\t\t */\n\t\tmhi_chan->type = (enum mhi_ch_type)mhi_chan->dir;\n\n\t\tmhi_chan->ee_mask = BIT(MHI_EE_AMSS);\n\t\tif (CHAN_SBL(chan))\n\t\t\tmhi_chan->ee_mask = BIT(MHI_EE_SBL);\n\t\telse if (CHAN_EDL(chan))\n\t\t\tmhi_chan->ee_mask = BIT(MHI_EE_FP);\n\n\t\tmhi_chan->db_cfg.pollcfg = 0;\n\n  \t\tif (chan == MHI_CLIENT_IP_HW_0_OUT || chan == MHI_CLIENT_IP_SW_0_OUT)\n\t\t\tmhi_chan->xfer_type = MHI_XFER_SKB;\n\t\telse if (chan == MHI_CLIENT_IP_HW_0_IN)\n\t\t\tmhi_chan->xfer_type = mhi_netdev_use_xfer_type_dma(chan) ? MHI_XFER_DMA: MHI_XFER_SKB;\n\t\telse if (chan == MHI_CLIENT_IP_SW_0_IN)\n\t\t\tmhi_chan->xfer_type = MHI_XFER_SKB; //MHI_XFER_DMA;\n#ifdef ENABLE_ADPL\n  \t\telse if (chan == MHI_CLIENT_ADPL)\n\t\t\tmhi_chan->xfer_type = MHI_XFER_BUFFER;\n#endif\n#ifdef ENABLE_QDSS\n  \t\telse if (chan == MHI_CLIENT_IP_HW_QDSS)\n\t\t\tmhi_chan->xfer_type = MHI_XFER_BUFFER;\n#endif\n\t\telse\n\t\t\tmhi_chan->xfer_type = MHI_XFER_BUFFER;\n\n\t\tif (chan_cfg[i].elements == 0) {\n\t\t\tmhi_chan->dir = DMA_BIDIRECTIONAL;\n\t\t\tmhi_chan->xfer_type = MHI_XFER_NOP;\n\t\t}\n\n\t\tswitch (mhi_chan->xfer_type) {\n\t\tcase MHI_XFER_BUFFER:\n\t\t\tmhi_chan->gen_tre = mhi_gen_tre;\n\t\t\tmhi_chan->queue_xfer = mhi_queue_buf;\n\t\t\tbreak;\n\t\tcase MHI_XFER_SKB:\n\t\t\tmhi_chan->queue_xfer = mhi_queue_skb;\n\t\t\tbreak;\n\t\tcase MHI_XFER_SCLIST:\n\t\t\tmhi_chan->gen_tre = mhi_gen_tre;\n\t\t\tmhi_chan->queue_xfer = mhi_queue_sclist;\n\t\t\tbreak;\n\t\tcase MHI_XFER_NOP:\n\t\t\tmhi_chan->queue_xfer = mhi_queue_nop;\n\t\t\tbreak;\n\t\tcase MHI_XFER_DMA:\n\t\tcase MHI_XFER_RSC_DMA:\n\t\t\tmhi_chan->queue_xfer = mhi_queue_dma;\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tgoto error_chan_cfg;\n\t\t}\n\n\t\tmhi_chan->lpm_notify = false;\n\t\tmhi_chan->offload_ch = (chan_cfg[i].elements == 0);\n\t\tmhi_chan->db_cfg.reset_req = false;\n\t\tmhi_chan->pre_alloc = false;\n\t\tmhi_chan->auto_start = false;\n\t\tmhi_chan->wake_capable = false;\n\n\t\tif (mhi_chan->pre_alloc &&\n\t\t    (mhi_chan->dir != DMA_FROM_DEVICE ||\n\t\t     mhi_chan->xfer_type != MHI_XFER_BUFFER))\n\t\t\tgoto error_chan_cfg;\n\n\t\t/* bi-dir and dirctionless channels must be a offload chan */\n\t\tif ((mhi_chan->dir == DMA_BIDIRECTIONAL ||\n\t\t     mhi_chan->dir == DMA_NONE) && !mhi_chan->offload_ch)\n\t\t\tgoto error_chan_cfg;\n\n\t\t/* if mhi host allocate the buffers then client cannot queue */\n\t\tif (mhi_chan->pre_alloc)\n\t\t\tmhi_chan->queue_xfer = mhi_queue_nop;\n\n\t\tif (!mhi_chan->offload_ch) {\n\t\t\tmhi_chan->db_cfg.brstmode = MHI_BRSTMODE_DISABLE;\n\t\t\tif (chan == MHI_CLIENT_IP_HW_0_OUT || chan == MHI_CLIENT_IP_HW_0_IN)\n\t\t\t\tmhi_chan->db_cfg.brstmode = MHI_BRSTMODE_ENABLE;\n\n#ifdef ENABLE_ADPL\n \t\t\tif (chan == MHI_CLIENT_ADPL)\n \t\t\t\tmhi_chan->db_cfg.brstmode = MHI_BRSTMODE_DISABLE;\n#endif\n#ifdef ENABLE_QDSS\n\t\t\tif (chan == MHI_CLIENT_IP_HW_QDSS)\n\t\t\t\tmhi_chan->db_cfg.brstmode = MHI_BRSTMODE_DISABLE;\n#endif\n\t\t\tif (MHI_INVALID_BRSTMODE(mhi_chan->db_cfg.brstmode))\n\t\t\t\tgoto error_chan_cfg;\n\n\t\t\tmhi_chan->db_cfg.process_db =\n\t\t\t\t(mhi_chan->db_cfg.brstmode ==\n\t\t\t\t MHI_BRSTMODE_ENABLE) ?\n\t\t\t\tmhi_db_brstmode : mhi_db_brstmode_disable;\n\t\t}\n\n\t\tmhi_chan->configured = true;\n\n\t\tif (mhi_chan->lpm_notify)\n\t\t\tlist_add_tail(&mhi_chan->node, &mhi_cntrl->lpm_chans);\n\t}\n\n\treturn 0;\n\nerror_chan_cfg:\n\tkfree(mhi_cntrl->mhi_chan);\n\n\treturn -EINVAL;\n}\n#endif\n\nstatic int of_parse_dt(struct mhi_controller *mhi_cntrl,\n\t\t       struct device_node *of_node)\n{\n\tint ret;\n\n\t/* parse MHI channel configuration */\n\tret = of_parse_ch_cfg(mhi_cntrl, of_node);\n\tif (ret)\n\t\treturn ret;\n\n\t/* parse MHI event configuration */\n\tret = of_parse_ev_cfg(mhi_cntrl, of_node);\n\tif (ret)\n\t\tgoto error_ev_cfg;\n#if defined(QCOM_AP_QCA6490_DMA_IOMMU)\n\t/* for QCS6490 iommu-dma is fastmap\n\t   for SG845 iommu-dma is set in driver\n\t   for ipq iommu-dma is disabled\n\t*/\n\tconst char *str;\n\tret = of_property_read_string(of_node, \"qcom,iommu-dma\", &str);\n\tif (ret)\n\t\tMHI_ERR(\"mhi qcom,iommu-dma need set\");\n\n#endif\n#if 0\n\tret = of_property_read_u32(of_node, \"mhi,timeout\",\n\t\t\t\t   &mhi_cntrl->timeout_ms);\n\tif (ret)\n\t\tmhi_cntrl->timeout_ms = MHI_TIMEOUT_MS;\n\n\tmhi_cntrl->bounce_buf = of_property_read_bool(of_node, \"mhi,use-bb\");\n\tret = of_property_read_u32(of_node, \"mhi,buffer-len\",\n\t\t\t\t   (u32 *)&mhi_cntrl->buffer_len);\n\tif (ret)\n\t\tmhi_cntrl->buffer_len = MHI_MAX_MTU;\n#else\n\tmhi_cntrl->timeout_ms = MHI_TIMEOUT_MS;\n\tmhi_cntrl->bounce_buf = false;\n\tmhi_cntrl->buffer_len = MHI_MAX_MTU;\n#endif\n\n\treturn 0;\n\nerror_ev_cfg:\n\tkfree(mhi_cntrl->mhi_chan);\n\n\treturn ret;\n}\n\nint of_register_mhi_controller(struct mhi_controller *mhi_cntrl)\n{\n\tint ret;\n\tint i;\n\tstruct mhi_event *mhi_event;\n\tstruct mhi_chan *mhi_chan;\n\tstruct mhi_cmd *mhi_cmd;\n\tstruct mhi_device *mhi_dev;\n\n\t//if (!mhi_cntrl->of_node)\n\t//\treturn -EINVAL;\n\n\tfor (i = 0; i < MAX_MHI_CONTROLLER; i++) {\n\t\t if (mhi_controller_minors[i].dev_id == mhi_cntrl->dev_id\n\t\t\t&& mhi_controller_minors[i].domain == mhi_cntrl->domain\n\t\t\t&& mhi_controller_minors[i].bus == mhi_cntrl->bus\n\t\t\t&& mhi_controller_minors[i].slot == mhi_cntrl->slot) {\n\t\t\tmhi_cntrl->cntrl_idx = i;\n\t\t\tbreak;\n\t\t}\n\t\telse if (mhi_controller_minors[i].dev_id == 0\n\t\t\t&& mhi_controller_minors[i].domain == 0\n\t\t\t&& mhi_controller_minors[i].bus == 0\n\t\t\t&& mhi_controller_minors[i].slot == 0) {\n\t\t\tmhi_controller_minors[i].dev_id = mhi_cntrl->dev_id;\n\t\t\tmhi_controller_minors[i].domain = mhi_cntrl->domain;\n\t\t\tmhi_controller_minors[i].bus = mhi_cntrl->bus;\n\t\t\tmhi_controller_minors[i].slot = mhi_cntrl->slot;\n\t\t\tmhi_controller_minors[i].mhi_cntrl = mhi_cntrl;\n\t\t\tmhi_cntrl->cntrl_idx = i;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\tif (i == MAX_MHI_CONTROLLER)\n\t\treturn -EINVAL;\n\n\tif (!mhi_cntrl->runtime_get || !mhi_cntrl->runtime_put)\n\t\treturn -EINVAL;\n\n\tif (!mhi_cntrl->status_cb || !mhi_cntrl->link_status)\n\t\treturn -EINVAL;\n\n\tret = of_parse_dt(mhi_cntrl, mhi_cntrl->of_node);\n\tif (ret)\n\t\treturn -EINVAL;\n\n\tmhi_cntrl->mhi_cmd = kcalloc(NR_OF_CMD_RINGS,\n\t\t\t\t     sizeof(*mhi_cntrl->mhi_cmd), GFP_KERNEL);\n\tif (!mhi_cntrl->mhi_cmd) {\n\t\tret = -ENOMEM;\n\t\tgoto error_alloc_cmd;\n\t}\n\n\tINIT_LIST_HEAD(&mhi_cntrl->transition_list);\n\tmutex_init(&mhi_cntrl->pm_mutex);\n\trwlock_init(&mhi_cntrl->pm_lock);\n\tspin_lock_init(&mhi_cntrl->transition_lock);\n\tspin_lock_init(&mhi_cntrl->wlock);\n\tINIT_WORK(&mhi_cntrl->st_worker, mhi_pm_st_worker);\n\tINIT_WORK(&mhi_cntrl->fw_worker, mhi_fw_load_worker);\n\tINIT_WORK(&mhi_cntrl->syserr_worker, mhi_pm_sys_err_worker);\n\tINIT_DELAYED_WORK(&mhi_cntrl->ready_worker, mhi_pm_ready_worker);\n\tinit_waitqueue_head(&mhi_cntrl->state_event);\n\n\tmhi_cmd = mhi_cntrl->mhi_cmd;\n\tfor (i = 0; i < NR_OF_CMD_RINGS; i++, mhi_cmd++)\n\t\tspin_lock_init(&mhi_cmd->lock);\n\n\tmhi_event = mhi_cntrl->mhi_event;\n\tfor (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {\n\t\tif (mhi_event->offload_ev)\n\t\t\tcontinue;\n\n\t\tmhi_event->mhi_cntrl = mhi_cntrl;\n\t\tspin_lock_init(&mhi_event->lock);\n\t\tif (mhi_event->data_type == MHI_ER_CTRL_ELEMENT_TYPE)\n\t\t\ttasklet_init(&mhi_event->task, mhi_ctrl_ev_task,\n\t\t\t\t     (ulong)mhi_event);\n\t\telse\n\t\t\ttasklet_init(&mhi_event->task, mhi_ev_task,\n\t\t\t\t     (ulong)mhi_event);\n\t}\n\n\tmhi_chan = mhi_cntrl->mhi_chan;\n\tfor (i = 0; i < mhi_cntrl->max_chan; i++, mhi_chan++) {\n\t\tmutex_init(&mhi_chan->mutex);\n\t\tinit_completion(&mhi_chan->completion);\n\t\trwlock_init(&mhi_chan->lock);\n\t}\n\n\tif (mhi_cntrl->bounce_buf) {\n\t\tmhi_cntrl->map_single = mhi_map_single_use_bb;\n\t\tmhi_cntrl->unmap_single = mhi_unmap_single_use_bb;\n\t} else {\n\t\tmhi_cntrl->map_single = mhi_map_single_no_bb;\n\t\tmhi_cntrl->unmap_single = mhi_unmap_single_no_bb;\n\t}\n\n\t/* register controller with mhi_bus */\n\tmhi_dev = mhi_alloc_device(mhi_cntrl);\n\tif (!mhi_dev) {\n\t\tret = -ENOMEM;\n\t\tgoto error_alloc_dev;\n\t}\n\n\tmhi_dev->dev_type = MHI_CONTROLLER_TYPE;\n\tmhi_dev->mhi_cntrl = mhi_cntrl;\n\tdev_set_name(&mhi_dev->dev, \"%04x_%02u.%02u.%02u\", mhi_dev->dev_id,\n\t\t     mhi_dev->domain, mhi_dev->bus, mhi_dev->slot);\n\n\tret = device_add(&mhi_dev->dev);\n\tif (ret)\n\t\tgoto error_add_dev;\n\n\tif (mhi_cntrl->cntrl_idx)\n\t\tmhi_cntrl->cntrl_dev = device_create(mhi_cntrl_drv.class, mhi_cntrl->dev,\n\t\t\t\t\t      MKDEV(mhi_cntrl_drv.major, mhi_cntrl->cntrl_idx), NULL,\n\t\t\t\t\t      \"mhi_BHI%d\", mhi_cntrl->cntrl_idx);\n\telse\n\t\tmhi_cntrl->cntrl_dev = device_create(mhi_cntrl_drv.class, mhi_cntrl->dev,\n\t\t\t\t\t      MKDEV(mhi_cntrl_drv.major, mhi_cntrl->cntrl_idx), NULL,\n\t\t\t\t\t      \"mhi_BHI\");\n\n\tmhi_cntrl->mhi_dev = mhi_dev;\n\n\tmhi_cntrl->parent = mhi_bus.dentry;\n\tmhi_cntrl->klog_lvl = MHI_MSG_LVL_ERROR;\n\n\t/* adding it to this list only for debug purpose */\n\tmutex_lock(&mhi_bus.lock);\n\tlist_add_tail(&mhi_cntrl->node, &mhi_bus.controller_list);\n\tmutex_unlock(&mhi_bus.lock);\n\n\treturn 0;\n\nerror_add_dev:\n\tmhi_dealloc_device(mhi_cntrl, mhi_dev);\n\nerror_alloc_dev:\n\tkfree(mhi_cntrl->mhi_cmd);\n\nerror_alloc_cmd:\n\tkfree(mhi_cntrl->mhi_chan);\n\tkfree(mhi_cntrl->mhi_event);\n\n\treturn ret;\n};\nEXPORT_SYMBOL(of_register_mhi_controller);\n\nvoid mhi_unregister_mhi_controller(struct mhi_controller *mhi_cntrl)\n{\n\tstruct mhi_device *mhi_dev = mhi_cntrl->mhi_dev;\n\n\tkfree(mhi_cntrl->mhi_cmd);\n\tkfree(mhi_cntrl->mhi_event);\n\tkfree(mhi_cntrl->mhi_chan);\n\tkfree(mhi_cntrl->mhi_tsync);\n\n\tif (mhi_cntrl->cntrl_dev)\n\t\tdevice_destroy(mhi_cntrl_drv.class, MKDEV(mhi_cntrl_drv.major, mhi_cntrl->cntrl_idx));\n\tdevice_del(&mhi_dev->dev);\n\tput_device(&mhi_dev->dev);\n\n\tmutex_lock(&mhi_bus.lock);\n\tlist_del(&mhi_cntrl->node);\n\tmutex_unlock(&mhi_bus.lock);\n}\n\n/* set ptr to control private data */\nstatic inline void mhi_controller_set_devdata(struct mhi_controller *mhi_cntrl,\n\t\t\t\t\t void *priv)\n{\n\tmhi_cntrl->priv_data = priv;\n}\n\n\n/* allocate mhi controller to register */\nstruct mhi_controller *mhi_alloc_controller(size_t size)\n{\n\tstruct mhi_controller *mhi_cntrl;\n\n\tmhi_cntrl = kzalloc(size + sizeof(*mhi_cntrl), GFP_KERNEL);\n\n\tif (mhi_cntrl && size)\n\t\tmhi_controller_set_devdata(mhi_cntrl, mhi_cntrl + 1);\n\n\treturn mhi_cntrl;\n}\nEXPORT_SYMBOL(mhi_alloc_controller);\n\nint mhi_prepare_for_power_up(struct mhi_controller *mhi_cntrl)\n{\n\tint ret;\n\tu32 bhie_off;\n\n\tmutex_lock(&mhi_cntrl->pm_mutex);\n\n\tret = mhi_init_dev_ctxt(mhi_cntrl);\n\tif (ret) {\n\t\tMHI_ERR(\"Error with init dev_ctxt\\n\");\n\t\tgoto error_dev_ctxt;\n\t}\n\n\tret = mhi_init_irq_setup(mhi_cntrl);\n\tif (ret) {\n\t\tMHI_ERR(\"Error setting up irq\\n\");\n\t\tgoto error_setup_irq;\n\t}\n\n\t/*\n\t * allocate rddm table if specified, this table is for debug purpose\n\t * so we'll ignore erros\n\t */\n\tif (mhi_cntrl->rddm_size) {\n\t\tmhi_alloc_bhie_table(mhi_cntrl, &mhi_cntrl->rddm_image,\n\t\t\t\t     mhi_cntrl->rddm_size);\n\n\t\t/*\n\t\t * This controller supports rddm, we need to manually clear\n\t\t * BHIE RX registers since por values are undefined.\n\t\t */\n\t\tret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, BHIEOFF,\n\t\t\t\t   &bhie_off);\n\t\tif (ret) {\n\t\t\tMHI_ERR(\"Error getting bhie offset\\n\");\n\t\t\tgoto bhie_error;\n\t\t}\n\n\t\tmemset_io(mhi_cntrl->regs + bhie_off + BHIE_RXVECADDR_LOW_OFFS,\n\t\t\t  0, BHIE_RXVECSTATUS_OFFS - BHIE_RXVECADDR_LOW_OFFS +\n\t\t\t  4);\n\t}\n\n\tmhi_cntrl->pre_init = true;\n\n\tmutex_unlock(&mhi_cntrl->pm_mutex);\n\n\treturn 0;\n\nbhie_error:\n\tif (mhi_cntrl->rddm_image) {\n\t\tmhi_free_bhie_table(mhi_cntrl, mhi_cntrl->rddm_image);\n\t\tmhi_cntrl->rddm_image = NULL;\n\t}\n\tmhi_deinit_free_irq(mhi_cntrl);\n\nerror_setup_irq:\n\tmhi_deinit_dev_ctxt(mhi_cntrl);\n\nerror_dev_ctxt:\n\tmutex_unlock(&mhi_cntrl->pm_mutex);\n\n\treturn ret;\n}\nEXPORT_SYMBOL(mhi_prepare_for_power_up);\n\nvoid mhi_unprepare_after_power_down(struct mhi_controller *mhi_cntrl)\n{\n\tif (mhi_cntrl->fbc_image) {\n\t\tmhi_free_bhie_table(mhi_cntrl, mhi_cntrl->fbc_image);\n\t\tmhi_cntrl->fbc_image = NULL;\n\t}\n\n\tif (mhi_cntrl->rddm_image) {\n\t\tmhi_free_bhie_table(mhi_cntrl, mhi_cntrl->rddm_image);\n\t\tmhi_cntrl->rddm_image = NULL;\n\t}\n\n\tmhi_deinit_free_irq(mhi_cntrl);\n\tmhi_deinit_dev_ctxt(mhi_cntrl);\n\tmhi_cntrl->pre_init = false;\n}\n\n/* match dev to drv */\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 12, 0))\nstatic int mhi_match(struct device *dev, const struct device_driver *drv)\n#else\nstatic int mhi_match(struct device *dev, struct device_driver *drv)\n#endif\n{\n\tstruct mhi_device *mhi_dev = to_mhi_device(dev);\n\tstruct mhi_driver *mhi_drv = to_mhi_driver(drv);\n\tconst struct mhi_device_id *id;\n\n\t/* if controller type there is no client driver associated with it */\n\tif (mhi_dev->dev_type == MHI_CONTROLLER_TYPE)\n\t\treturn 0;\n\n\tfor (id = mhi_drv->id_table; id->chan[0]; id++)\n\t\tif (!strcmp(mhi_dev->chan_name, id->chan)) {\n\t\t\tmhi_dev->id = id;\n\t\t\treturn 1;\n\t\t}\n\n\treturn 0;\n};\n\nstatic void mhi_release_device(struct device *dev)\n{\n\tstruct mhi_device *mhi_dev = to_mhi_device(dev);\n\n\tif (mhi_dev->ul_chan)\n\t\tmhi_dev->ul_chan->mhi_dev = NULL;\n\n\tif (mhi_dev->dl_chan)\n\t\tmhi_dev->dl_chan->mhi_dev = NULL;\n\n\tkfree(mhi_dev);\n}\n\nstruct bus_type mhi_bus_type = {\n\t.name = \"mhi_q\",\n\t.dev_name = \"mhi_q\",\n\t.match = mhi_match,\n};\n\nstatic int mhi_driver_probe(struct device *dev)\n{\n\tstruct mhi_device *mhi_dev = to_mhi_device(dev);\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tstruct device_driver *drv = dev->driver;\n\tstruct mhi_driver *mhi_drv = to_mhi_driver(drv);\n\tstruct mhi_event *mhi_event;\n\tstruct mhi_chan *ul_chan = mhi_dev->ul_chan;\n\tstruct mhi_chan *dl_chan = mhi_dev->dl_chan;\n\tbool auto_start = false;\n\tint ret;\n\n\t/* bring device out of lpm */\n\tret = mhi_device_get_sync(mhi_dev);\n\tif (ret)\n\t\treturn ret;\n\n\tret = -EINVAL;\n\tif (ul_chan) {\n\t\t/* lpm notification require status_cb */\n\t\tif (ul_chan->lpm_notify && !mhi_drv->status_cb)\n\t\t\tgoto exit_probe;\n\n\t\tif (!ul_chan->offload_ch && !mhi_drv->ul_xfer_cb)\n\t\t\tgoto exit_probe;\n\n\t\tul_chan->xfer_cb = mhi_drv->ul_xfer_cb;\n\t\tmhi_dev->status_cb = mhi_drv->status_cb;\n\t\tauto_start = ul_chan->auto_start;\n\t}\n\n\tif (dl_chan) {\n\t\tif (dl_chan->lpm_notify && !mhi_drv->status_cb)\n\t\t\tgoto exit_probe;\n\n\t\tif (!dl_chan->offload_ch && !mhi_drv->dl_xfer_cb)\n\t\t\tgoto exit_probe;\n\n\t\tmhi_event = &mhi_cntrl->mhi_event[dl_chan->er_index];\n\n\t\t/*\n\t\t * if this channal event ring manage by client, then\n\t\t * status_cb must be defined so we can send the async\n\t\t * cb whenever there are pending data\n\t\t */\n\t\tif (mhi_event->cl_manage && !mhi_drv->status_cb)\n\t\t\tgoto exit_probe;\n\n\t\tdl_chan->xfer_cb = mhi_drv->dl_xfer_cb;\n\n\t\t/* ul & dl uses same status cb */\n\t\tmhi_dev->status_cb = mhi_drv->status_cb;\n\t\tauto_start = (auto_start || dl_chan->auto_start);\n\t}\n\n\tret = mhi_drv->probe(mhi_dev, mhi_dev->id);\n\n\tif (!ret && auto_start)\n\t\tmhi_prepare_for_transfer(mhi_dev);\n\nexit_probe:\n\tmhi_device_put(mhi_dev);\n\n\treturn ret;\n}\n\nstatic int mhi_driver_remove(struct device *dev)\n{\n\tstruct mhi_device *mhi_dev = to_mhi_device(dev);\n\tstruct mhi_driver *mhi_drv = to_mhi_driver(dev->driver);\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tstruct mhi_chan *mhi_chan;\n\tenum MHI_CH_STATE ch_state[] = {\n\t\tMHI_CH_STATE_DISABLED,\n\t\tMHI_CH_STATE_DISABLED\n\t};\n\tint dir;\n\n\t/* control device has no work to do */\n\tif (mhi_dev->dev_type == MHI_CONTROLLER_TYPE)\n\t\treturn 0;\n\n\tMHI_LOG(\"Removing device for chan:%s\\n\", mhi_dev->chan_name);\n\n\t/* reset both channels */\n\tfor (dir = 0; dir < 2; dir++) {\n\t\tmhi_chan = dir ? mhi_dev->ul_chan : mhi_dev->dl_chan;\n\n\t\tif (!mhi_chan)\n\t\t\tcontinue;\n\n\t\t/* wake all threads waiting for completion */\n\t\twrite_lock_irq(&mhi_chan->lock);\n\t\tmhi_chan->ccs = MHI_EV_CC_INVALID;\n\t\tcomplete_all(&mhi_chan->completion);\n\t\twrite_unlock_irq(&mhi_chan->lock);\n\n\t\t/* move channel state to disable, no more processing */\n\t\tmutex_lock(&mhi_chan->mutex);\n\t\twrite_lock_irq(&mhi_chan->lock);\n\t\tch_state[dir] = mhi_chan->ch_state;\n\t\tmhi_chan->ch_state = MHI_CH_STATE_SUSPENDED;\n\t\twrite_unlock_irq(&mhi_chan->lock);\n\n\t\t/* reset the channel */\n\t\tif (!mhi_chan->offload_ch)\n\t\t\tmhi_reset_chan(mhi_cntrl, mhi_chan);\n\n\t\tmutex_unlock(&mhi_chan->mutex);\n\t}\n\n\t/* destroy the device */\n\tmhi_drv->remove(mhi_dev);\n\n\t/* de_init channel if it was enabled */\n\tfor (dir = 0; dir < 2; dir++) {\n\t\tmhi_chan = dir ? mhi_dev->ul_chan : mhi_dev->dl_chan;\n\n\t\tif (!mhi_chan)\n\t\t\tcontinue;\n\n\t\tmutex_lock(&mhi_chan->mutex);\n\n\t\tif (ch_state[dir] == MHI_CH_STATE_ENABLED &&\n\t\t    !mhi_chan->offload_ch)\n\t\t\tmhi_deinit_chan_ctxt(mhi_cntrl, mhi_chan);\n\n\t\tmhi_chan->ch_state = MHI_CH_STATE_DISABLED;\n\n\t\tmutex_unlock(&mhi_chan->mutex);\n\t}\n\n\n\tif (mhi_cntrl->tsync_dev == mhi_dev)\n\t\tmhi_cntrl->tsync_dev = NULL;\n\n\t/* relinquish any pending votes */\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\twhile (atomic_read(&mhi_dev->dev_wake))\n\t\tmhi_device_put(mhi_dev);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\treturn 0;\n}\n\nint mhi_driver_register(struct mhi_driver *mhi_drv)\n{\n\tstruct device_driver *driver = &mhi_drv->driver;\n\n\tif (!mhi_drv->probe || !mhi_drv->remove)\n\t\treturn -EINVAL;\n\n\tdriver->bus = &mhi_bus_type;\n\tdriver->probe = mhi_driver_probe;\n\tdriver->remove = mhi_driver_remove;\n\treturn driver_register(driver);\n}\nEXPORT_SYMBOL(mhi_driver_register);\n\nvoid mhi_driver_unregister(struct mhi_driver *mhi_drv)\n{\n\tdriver_unregister(&mhi_drv->driver);\n}\nEXPORT_SYMBOL(mhi_driver_unregister);\n\nstruct mhi_device *mhi_alloc_device(struct mhi_controller *mhi_cntrl)\n{\n\tstruct mhi_device *mhi_dev = kzalloc(sizeof(*mhi_dev), GFP_KERNEL);\n\tstruct device *dev;\n\n\tif (!mhi_dev)\n\t\treturn NULL;\n\n\tdev = &mhi_dev->dev;\n\tdevice_initialize(dev);\n\tdev->bus = &mhi_bus_type;\n\tdev->release = mhi_release_device;\n\tdev->parent = mhi_cntrl->dev;\n\tmhi_dev->mhi_cntrl = mhi_cntrl;\n\tmhi_dev->vendor = mhi_cntrl->vendor;\n\tmhi_dev->dev_id = mhi_cntrl->dev_id;\n\tmhi_dev->domain = mhi_cntrl->domain;\n\tmhi_dev->bus = mhi_cntrl->bus;\n\tmhi_dev->slot = mhi_cntrl->slot;\n\tmhi_dev->mtu = MHI_MAX_MTU;\n\tatomic_set(&mhi_dev->dev_wake, 0);\n\n\treturn mhi_dev;\n}\n\nstatic int mhi_cntrl_open(struct inode *inode, struct file *f)\n{\n\tint ret = -ENODEV;\n\tstruct mhi_controller *mhi_cntrl;\n\n\tmutex_lock(&mhi_bus.lock);\n\tlist_for_each_entry(mhi_cntrl, &mhi_bus.controller_list, node) {\n\t\tif (MINOR(inode->i_rdev) == mhi_cntrl->cntrl_idx) {\n\t\t\tret = 0;\n\t\t\tf->private_data = mhi_cntrl;\n\t\t\tbreak;\n\t\t}\n\t}\n\tmutex_unlock(&mhi_bus.lock);\n\n\treturn ret;\n}\n\nstatic int mhi_cntrl_release(struct inode *inode, struct file *f)\n{\n\tf->private_data = NULL;\n\treturn 0;\n}\n\n#define IOCTL_BHI_GETDEVINFO 0x8BE0 + 1\n#define IOCTL_BHI_WRITEIMAGE 0x8BE0 + 2\nlong bhi_get_dev_info(struct mhi_controller *mhi_cntrl, void __user *to);\nlong bhi_write_image(struct mhi_controller *mhi_cntrl, void __user *from);\n\nstatic long mhi_cntrl_ioctl(struct file *f, unsigned int cmd, unsigned long __arg)\n{\n\tlong ret = -ENODEV;\n\tstruct mhi_controller *mhi_cntrl;\n\n\tmutex_lock(&mhi_bus.lock);\n\tlist_for_each_entry(mhi_cntrl, &mhi_bus.controller_list, node) {\n\t\tif (mhi_cntrl == (struct mhi_controller *)f->private_data) {\n\t\t\tret = 0;\n\t\t\tbreak;\n\t\t}\n\t}\n\tmutex_unlock(&mhi_bus.lock);\n\n\tif (ret)\n\t\treturn ret;\n\n\tswitch (cmd) {\n\t\tcase IOCTL_BHI_GETDEVINFO:\n\t\t\tret = bhi_get_dev_info(mhi_cntrl, (void __user *)__arg);\n\t\tbreak;\n\n\t\tcase IOCTL_BHI_WRITEIMAGE:\n\t\t\tret = bhi_write_image(mhi_cntrl, (void __user *)__arg);\n\t\tbreak;\n\n\t\tdefault:\n\t\t\tret = -EINVAL;\n\t\tbreak;\n\t}\n\n\treturn ret;\n}\n\nstatic const struct file_operations mhi_cntrl_fops = {\n\t.unlocked_ioctl =\tmhi_cntrl_ioctl,\n\t.open =\t\t\tmhi_cntrl_open,\n\t.release =\t\tmhi_cntrl_release,\n};\n\nstatic int __init mhi_cntrl_init(void)\n{\n\tint ret;\n\n\tret = register_chrdev(0, MHI_CNTRL_DRIVER_NAME, &mhi_cntrl_fops);\n\tif (ret < 0)\n\t\treturn ret;\n\n\tmhi_cntrl_drv.major = ret;\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0))\n\tmhi_cntrl_drv.class = class_create(MHI_CNTRL_DRIVER_NAME);\n#else\n\tmhi_cntrl_drv.class = class_create(THIS_MODULE, MHI_CNTRL_DRIVER_NAME);\n#endif\n\tif (IS_ERR(mhi_cntrl_drv.class)) {\n\t\tunregister_chrdev(mhi_cntrl_drv.major, MHI_CNTRL_DRIVER_NAME);\n\t\treturn -ENODEV;\n\t   }\n\n\tmutex_init(&mhi_cntrl_drv.lock);\n\tINIT_LIST_HEAD(&mhi_cntrl_drv.head);\n\n\treturn 0;\n}\n\nvoid mhi_cntrl_exit(void)\n{\n\tclass_destroy(mhi_cntrl_drv.class);\n\tunregister_chrdev(mhi_cntrl_drv.major, MHI_CNTRL_DRIVER_NAME);\n}\n\nextern int mhi_dtr_init(void);\nextern void mhi_dtr_exit(void);\nextern int mhi_device_netdev_init(struct dentry *parent);\nextern void mhi_device_netdev_exit(void);\nextern int mhi_device_uci_init(void);\nextern void mhi_device_uci_exit(void);\nextern int mhi_controller_qcom_init(void);\nextern void mhi_controller_qcom_exit(void);\n\nstatic char mhi_version[] = \"Quectel_Linux_PCIE_MHI_Driver_\"PCIE_MHI_DRIVER_VERSION;\nmodule_param_string(mhi_version, mhi_version, sizeof(mhi_version), S_IRUGO);\n\nstatic int __init mhi_init(void)\n{\n\tint ret;\n\n\tpr_info(\"%s %s\\n\", __func__, mhi_version);\n\n\tmutex_init(&mhi_bus.lock);\n\tINIT_LIST_HEAD(&mhi_bus.controller_list);\n\n\t/* parent directory */\n\tmhi_bus.dentry = debugfs_create_dir(mhi_bus_type.name, NULL);\n\n\tret = bus_register(&mhi_bus_type);\n\tif (ret) {\n\t\tpr_err(\"Error bus_register ret:%d\\n\", ret);\n\t\treturn ret;\n\t}\n\n\tret = mhi_dtr_init();\n\tif (ret) {\n\t\tpr_err(\"Error mhi_dtr_init ret:%d\\n\", ret);\n\t\tbus_unregister(&mhi_bus_type);\n\t\treturn ret;\n\t}\n\n\tret = mhi_device_netdev_init(mhi_bus.dentry);\n\tif (ret) {\n\t\tpr_err(\"Error mhi_device_netdev_init ret:%d\\n\", ret);\n\t}\n\n\tret = mhi_device_uci_init();\n\tif (ret) {\n\t\tpr_err(\"Error mhi_device_uci_init ret:%d\\n\", ret);\n\t}\n\n\tret = mhi_cntrl_init();\n\tif (ret) {\n\t\tpr_err(\"Error mhi_cntrl_init ret:%d\\n\", ret);\n\t}\n\n\tret = mhi_controller_qcom_init();\n\tif (ret) {\n\t\tpr_err(\"Error mhi_controller_qcom_init ret:%d\\n\", ret);\n\t}\n\n\treturn ret;\n}\n\nstatic void mhi_exit(void)\n{\n\tmhi_controller_qcom_exit();\n\tmhi_cntrl_exit();\n\tmhi_device_uci_exit();\n\tmhi_device_netdev_exit();\n\tmhi_dtr_exit();\n\tbus_unregister(&mhi_bus_type);\n\tdebugfs_remove_recursive(mhi_bus.dentry);\n}\n\nmodule_init(mhi_init);\nmodule_exit(mhi_exit);\n\nMODULE_LICENSE(\"GPL v2\");\nMODULE_ALIAS(\"MHI_CORE\");\nMODULE_DESCRIPTION(\"MHI Host Interface\");\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/core/mhi_internal.h",
    "content": "/* SPDX-License-Identifier: GPL-2.0-only */\n/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. */\n\n#ifndef _MHI_INT_H\n#define _MHI_INT_H\n\n#include <linux/version.h>\n#ifndef writel_relaxed\n#define writel_relaxed writel\n#endif\n\n#ifndef writel_relaxed_no_log\n#define writel_relaxed_no_log writel_relaxed\n#endif\n\n#ifndef readq\nstatic inline u64 readq(void __iomem *reg)\n{\n\treturn ((u64) readl(reg)) | (((u64) readl(reg + 4UL)) << 32);\n}\n#endif\n\n#ifndef readq_relaxed\n#define readq_relaxed readq\n#endif\n\n#ifndef readq_relaxed_no_log\n#define readq_relaxed_no_log readq_relaxed\n#endif\n\n#ifndef U32_MAX\n#define U32_MAX\t\t((u32)~0U)\n#endif\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 3,10,53 ))\nstatic inline void reinit_completion(struct completion *x)\n{\n\tx->done = 0;\n}\n#endif\n\n#ifndef __ATTR_RO\n#define __ATTR_RO(_name) {\t\t\t\t\t\t\\\n\t.attr\t= { .name = __stringify(_name), .mode = S_IRUGO },\t\\\n\t.show\t= _name##_show,\t\t\t\t\t\t\\\n}\n#endif\n#ifndef __ATTR_WO\n#define __ATTR_WO(_name) {\t\t\t\t\t\t\\\n\t.attr\t= { .name = __stringify(_name), .mode = S_IWUSR },\t\\\n\t.store\t= _name##_store,\t\t\t\t\t\\\n}\n#endif\n#ifndef __ATTR_RW\n#define __ATTR_RW(_name) __ATTR(_name, (S_IWUSR | S_IRUGO),\t\t\\\n\t\t\t _name##_show, _name##_store)\n#endif\n#ifndef DEVICE_ATTR_RO\n#define DEVICE_ATTR_RO(_name) \\\n\tstruct device_attribute dev_attr_##_name = __ATTR_RO(_name)\n#endif\n#ifndef DEVICE_ATTR_WO\n#define DEVICE_ATTR_WO(_name) \\\n\tstruct device_attribute dev_attr_##_name = __ATTR_WO(_name)\n#endif\n#ifndef DEVICE_ATTR_RW\n#define DRIVER_ATTR_RW(_name) \\\n\tstruct driver_attribute driver_attr_##_name = __ATTR_RW(_name)\n#endif\n\n#ifdef EXPORT_SYMBOL\n#undef EXPORT_SYMBOL\n#define EXPORT_SYMBOL(sym)\n#endif\n\nextern struct bus_type mhi_bus_type;\n\n/* MHI mmio register mapping */\n#define PCI_INVALID_READ(val) (val == U32_MAX)\n\n#define MHIREGLEN (0x0)\n#define MHIREGLEN_MHIREGLEN_MASK (0xFFFFFFFF)\n#define MHIREGLEN_MHIREGLEN_SHIFT (0)\n\n#define MHIVER (0x8)\n#define MHIVER_MHIVER_MASK (0xFFFFFFFF)\n#define MHIVER_MHIVER_SHIFT (0)\n\n#define MHICFG (0x10)\n#define MHICFG_NHWER_MASK (0xFF000000)\n#define MHICFG_NHWER_SHIFT (24)\n#define MHICFG_NER_MASK (0xFF0000)\n#define MHICFG_NER_SHIFT (16)\n#define MHICFG_NHWCH_MASK (0xFF00)\n#define MHICFG_NHWCH_SHIFT (8)\n#define MHICFG_NCH_MASK (0xFF)\n#define MHICFG_NCH_SHIFT (0)\n\n#define CHDBOFF (0x18)\n#define CHDBOFF_CHDBOFF_MASK (0xFFFFFFFF)\n#define CHDBOFF_CHDBOFF_SHIFT (0)\n\n#define ERDBOFF (0x20)\n#define ERDBOFF_ERDBOFF_MASK (0xFFFFFFFF)\n#define ERDBOFF_ERDBOFF_SHIFT (0)\n\n#define BHIOFF (0x28)\n#define BHIOFF_BHIOFF_MASK (0xFFFFFFFF)\n#define BHIOFF_BHIOFF_SHIFT (0)\n\n#define BHIEOFF (0x2C)\n#define BHIEOFF_BHIEOFF_MASK (0xFFFFFFFF)\n#define BHIEOFF_BHIEOFF_SHIFT (0)\n\n#define DEBUGOFF (0x30)\n#define DEBUGOFF_DEBUGOFF_MASK (0xFFFFFFFF)\n#define DEBUGOFF_DEBUGOFF_SHIFT (0)\n\n#define MHICTRL (0x38)\n#define MHICTRL_MHISTATE_MASK (0x0000FF00)\n#define MHICTRL_MHISTATE_SHIFT (8)\n#define MHICTRL_RESET_MASK (0x2)\n#define MHICTRL_RESET_SHIFT (1)\n\n#define MHISTATUS (0x48)\n#define MHISTATUS_MHISTATE_MASK (0x0000FF00)\n#define MHISTATUS_MHISTATE_SHIFT (8)\n#define MHISTATUS_SYSERR_MASK (0x4)\n#define MHISTATUS_SYSERR_SHIFT (2)\n#define MHISTATUS_READY_MASK (0x1)\n#define MHISTATUS_READY_SHIFT (0)\n\n#define CCABAP_LOWER (0x58)\n#define CCABAP_LOWER_CCABAP_LOWER_MASK (0xFFFFFFFF)\n#define CCABAP_LOWER_CCABAP_LOWER_SHIFT (0)\n\n#define CCABAP_HIGHER (0x5C)\n#define CCABAP_HIGHER_CCABAP_HIGHER_MASK (0xFFFFFFFF)\n#define CCABAP_HIGHER_CCABAP_HIGHER_SHIFT (0)\n\n#define ECABAP_LOWER (0x60)\n#define ECABAP_LOWER_ECABAP_LOWER_MASK (0xFFFFFFFF)\n#define ECABAP_LOWER_ECABAP_LOWER_SHIFT (0)\n\n#define ECABAP_HIGHER (0x64)\n#define ECABAP_HIGHER_ECABAP_HIGHER_MASK (0xFFFFFFFF)\n#define ECABAP_HIGHER_ECABAP_HIGHER_SHIFT (0)\n\n#define CRCBAP_LOWER (0x68)\n#define CRCBAP_LOWER_CRCBAP_LOWER_MASK (0xFFFFFFFF)\n#define CRCBAP_LOWER_CRCBAP_LOWER_SHIFT (0)\n\n#define CRCBAP_HIGHER (0x6C)\n#define CRCBAP_HIGHER_CRCBAP_HIGHER_MASK (0xFFFFFFFF)\n#define CRCBAP_HIGHER_CRCBAP_HIGHER_SHIFT (0)\n\n#define CRDB_LOWER (0x70)\n#define CRDB_LOWER_CRDB_LOWER_MASK (0xFFFFFFFF)\n#define CRDB_LOWER_CRDB_LOWER_SHIFT (0)\n\n#define CRDB_HIGHER (0x74)\n#define CRDB_HIGHER_CRDB_HIGHER_MASK (0xFFFFFFFF)\n#define CRDB_HIGHER_CRDB_HIGHER_SHIFT (0)\n\n#define MHICTRLBASE_LOWER (0x80)\n#define MHICTRLBASE_LOWER_MHICTRLBASE_LOWER_MASK (0xFFFFFFFF)\n#define MHICTRLBASE_LOWER_MHICTRLBASE_LOWER_SHIFT (0)\n\n#define MHICTRLBASE_HIGHER (0x84)\n#define MHICTRLBASE_HIGHER_MHICTRLBASE_HIGHER_MASK (0xFFFFFFFF)\n#define MHICTRLBASE_HIGHER_MHICTRLBASE_HIGHER_SHIFT (0)\n\n#define MHICTRLLIMIT_LOWER (0x88)\n#define MHICTRLLIMIT_LOWER_MHICTRLLIMIT_LOWER_MASK (0xFFFFFFFF)\n#define MHICTRLLIMIT_LOWER_MHICTRLLIMIT_LOWER_SHIFT (0)\n\n#define MHICTRLLIMIT_HIGHER (0x8C)\n#define MHICTRLLIMIT_HIGHER_MHICTRLLIMIT_HIGHER_MASK (0xFFFFFFFF)\n#define MHICTRLLIMIT_HIGHER_MHICTRLLIMIT_HIGHER_SHIFT (0)\n\n#define MHIDATABASE_LOWER (0x98)\n#define MHIDATABASE_LOWER_MHIDATABASE_LOWER_MASK (0xFFFFFFFF)\n#define MHIDATABASE_LOWER_MHIDATABASE_LOWER_SHIFT (0)\n\n#define MHIDATABASE_HIGHER (0x9C)\n#define MHIDATABASE_HIGHER_MHIDATABASE_HIGHER_MASK (0xFFFFFFFF)\n#define MHIDATABASE_HIGHER_MHIDATABASE_HIGHER_SHIFT (0)\n\n#define MHIDATALIMIT_LOWER (0xA0)\n#define MHIDATALIMIT_LOWER_MHIDATALIMIT_LOWER_MASK (0xFFFFFFFF)\n#define MHIDATALIMIT_LOWER_MHIDATALIMIT_LOWER_SHIFT (0)\n\n#define MHIDATALIMIT_HIGHER (0xA4)\n#define MHIDATALIMIT_HIGHER_MHIDATALIMIT_HIGHER_MASK (0xFFFFFFFF)\n#define MHIDATALIMIT_HIGHER_MHIDATALIMIT_HIGHER_SHIFT (0)\n\n#define MHI_READ_REG_FIELD(_VAR,_REG,_FIELD)                                              \\\n    ((_VAR & _REG ## _ ## _FIELD ## _MASK) >> _REG ## _ ## _FIELD ## _SHIFT)\n\n#define MHI_WRITE_REG_FIELD(_VAR,_REG,_FIELD,_VAL)                                        \\\n   do {                                                                                      \\\n      _VAR &= ~_REG ## _ ## _FIELD ## _MASK;                                       \\\n      _VAR |= (_VAL << _REG ## _ ## _FIELD ## _SHIFT);                             \\\n   }  while(0)\n\n/* Host request register */\n#define MHI_SOC_RESET_REQ_OFFSET (0xB0)\n#define MHI_SOC_RESET_REQ BIT(0)\n\n/* MHI misc capability registers */\n#define MISC_OFFSET (0x24)\n#define MISC_CAP_MASK (0xFFFFFFFF)\n#define MISC_CAP_SHIFT (0)\n\n#define CAP_CAPID_MASK (0xFF000000)\n#define CAP_CAPID_SHIFT (24)\n#define CAP_NEXT_CAP_MASK (0x00FFF000)\n#define CAP_NEXT_CAP_SHIFT (12)\n\n/* MHI Timesync offsets */\n#define TIMESYNC_CFG_OFFSET (0x00)\n#define TIMESYNC_CFG_CAPID_MASK (CAP_CAPID_MASK)\n#define TIMESYNC_CFG_CAPID_SHIFT (CAP_CAPID_SHIFT)\n#define TIMESYNC_CFG_NEXT_OFF_MASK (CAP_NEXT_CAP_MASK)\n#define TIMESYNC_CFG_NEXT_OFF_SHIFT (CAP_NEXT_CAP_SHIFT)\n#define TIMESYNC_CFG_NUMCMD_MASK (0xFF)\n#define TIMESYNC_CFG_NUMCMD_SHIFT (0)\n#define TIMESYNC_DB_OFFSET (0x4)\n#define TIMESYNC_TIME_LOW_OFFSET (0x8)\n#define TIMESYNC_TIME_HIGH_OFFSET (0xC)\n\n#define TIMESYNC_CAP_ID (2)\n\n/* MHI BHI offfsets */\n#define BHI_BHIVERSION_MINOR (0x00)\n#define BHI_BHIVERSION_MAJOR (0x04)\n#define BHI_IMGADDR_LOW (0x08)\n#define BHI_IMGADDR_HIGH (0x0C)\n#define BHI_IMGSIZE (0x10)\n#define BHI_RSVD1 (0x14)\n#define BHI_IMGTXDB (0x18)\n#define BHI_TXDB_SEQNUM_BMSK (0x3FFFFFFF)\n#define BHI_TXDB_SEQNUM_SHFT (0)\n#define BHI_RSVD2 (0x1C)\n#define BHI_INTVEC (0x20)\n#define BHI_RSVD3 (0x24)\n#define BHI_EXECENV (0x28)\n#define BHI_STATUS (0x2C)\n#define BHI_ERRCODE (0x30)\n#define BHI_ERRDBG1 (0x34)\n#define BHI_ERRDBG2 (0x38)\n#define BHI_ERRDBG3 (0x3C)\n#define BHI_SERIALNU (0x40)\n#define BHI_SBLANTIROLLVER (0x44)\n#define BHI_NUMSEG (0x48)\n#define BHI_MSMHWID(n) (0x4C + (0x4 * n))\n#define BHI_OEMPKHASH(n) (0x64 + (0x4 * n))\n#define BHI_RSVD5 (0xC4)\n#define BHI_STATUS_MASK (0xC0000000)\n#define BHI_STATUS_SHIFT (30)\n#define BHI_STATUS_ERROR (3)\n#define BHI_STATUS_SUCCESS (2)\n#define BHI_STATUS_RESET (0)\n\n/* MHI BHIE offsets */\n#define BHIE_MSMSOCID_OFFS (0x0000)\n#define BHIE_TXVECADDR_LOW_OFFS (0x002C)\n#define BHIE_TXVECADDR_HIGH_OFFS (0x0030)\n#define BHIE_TXVECSIZE_OFFS (0x0034)\n#define BHIE_TXVECDB_OFFS (0x003C)\n#define BHIE_TXVECDB_SEQNUM_BMSK (0x3FFFFFFF)\n#define BHIE_TXVECDB_SEQNUM_SHFT (0)\n#define BHIE_TXVECSTATUS_OFFS (0x0044)\n#define BHIE_TXVECSTATUS_SEQNUM_BMSK (0x3FFFFFFF)\n#define BHIE_TXVECSTATUS_SEQNUM_SHFT (0)\n#define BHIE_TXVECSTATUS_STATUS_BMSK (0xC0000000)\n#define BHIE_TXVECSTATUS_STATUS_SHFT (30)\n#define BHIE_TXVECSTATUS_STATUS_RESET (0x00)\n#define BHIE_TXVECSTATUS_STATUS_XFER_COMPL (0x02)\n#define BHIE_TXVECSTATUS_STATUS_ERROR (0x03)\n#define BHIE_RXVECADDR_LOW_OFFS (0x0060)\n#define BHIE_RXVECADDR_HIGH_OFFS (0x0064)\n#define BHIE_RXVECSIZE_OFFS (0x0068)\n#define BHIE_RXVECDB_OFFS (0x0070)\n#define BHIE_RXVECDB_SEQNUM_BMSK (0x3FFFFFFF)\n#define BHIE_RXVECDB_SEQNUM_SHFT (0)\n#define BHIE_RXVECSTATUS_OFFS (0x0078)\n#define BHIE_RXVECSTATUS_SEQNUM_BMSK (0x3FFFFFFF)\n#define BHIE_RXVECSTATUS_SEQNUM_SHFT (0)\n#define BHIE_RXVECSTATUS_STATUS_BMSK (0xC0000000)\n#define BHIE_RXVECSTATUS_STATUS_SHFT (30)\n#define BHIE_RXVECSTATUS_STATUS_RESET (0x00)\n#define BHIE_RXVECSTATUS_STATUS_XFER_COMPL (0x02)\n#define BHIE_RXVECSTATUS_STATUS_ERROR (0x03)\n\n/* convert ticks to micro seconds by dividing by 19.2 */\n#define TIME_TICKS_TO_US(x) (div_u64((x) * 10, 192))\n\nstruct mhi_event_ctxt {\n\tu32 reserved : 8;\n\tu32 intmodc : 8;\n\tu32 intmodt : 16;\n\tu32 ertype;\n\tu32 msivec;\n\n\tu64 rbase __packed __aligned(4);\n\tu64 rlen __packed __aligned(4);\n\tu64 rp __packed __aligned(4);\n\tu64 wp __packed __aligned(4);\n};\n\nstruct mhi_chan_ctxt {\n\tu32 chstate : 8;\n\tu32 brstmode : 2;\n\tu32 pollcfg : 6;\n\tu32 reserved : 16;\n\tu32 chtype;\n\tu32 erindex;\n\n\tu64 rbase __packed __aligned(4);\n\tu64 rlen __packed __aligned(4);\n\tu64 rp __packed __aligned(4);\n\tu64 wp __packed __aligned(4);\n};\n\nstruct mhi_cmd_ctxt {\n\tu32 reserved0;\n\tu32 reserved1;\n\tu32 reserved2;\n\n\tu64 rbase __packed __aligned(4);\n\tu64 rlen __packed __aligned(4);\n\tu64 rp __packed __aligned(4);\n\tu64 wp __packed __aligned(4);\n};\n\nstruct mhi_tre {\n\tu64 ptr;\n\tu32 dword[2];\n};\n\n/* Channel context state */\nenum mhi_dev_ch_ctx_state {\n\tMHI_DEV_CH_STATE_DISABLED,\n\tMHI_DEV_CH_STATE_ENABLED,\n\tMHI_DEV_CH_STATE_RUNNING,\n\tMHI_DEV_CH_STATE_SUSPENDED,\n\tMHI_DEV_CH_STATE_STOP,\n\tMHI_DEV_CH_STATE_ERROR,\n\tMHI_DEV_CH_STATE_RESERVED,\n\tMHI_DEV_CH_STATE_32BIT = 0x7FFFFFFF\n};\n\n/* Channel type */\nenum mhi_dev_ch_ctx_type {\n\tMHI_DEV_CH_TYPE_NONE,\n\tMHI_DEV_CH_TYPE_OUTBOUND_CHANNEL,\n\tMHI_DEV_CH_TYPE_INBOUND_CHANNEL,\n\tMHI_DEV_CH_RESERVED\n};\n\n/* Channel context type */\nstruct mhi_dev_ch_ctx {\n\tenum mhi_dev_ch_ctx_state\tch_state;\n\tenum mhi_dev_ch_ctx_type\tch_type;\n\tuint32_t\t\t\terr_indx;\n\tuint64_t\t\t\trbase;\n\tuint64_t\t\t\trlen;\n\tuint64_t\t\t\trp;\n\tuint64_t\t\t\twp;\n} __packed;\n\nenum mhi_dev_ring_element_type_id {\n\tMHI_DEV_RING_EL_INVALID = 0,\n\tMHI_DEV_RING_EL_NOOP = 1,\n\tMHI_DEV_RING_EL_TRANSFER = 2,\n\tMHI_DEV_RING_EL_RESET = 16,\n\tMHI_DEV_RING_EL_STOP = 17,\n\tMHI_DEV_RING_EL_START = 18,\n\tMHI_DEV_RING_EL_MHI_STATE_CHG = 32,\n\tMHI_DEV_RING_EL_CMD_COMPLETION_EVT = 33,\n\tMHI_DEV_RING_EL_TRANSFER_COMPLETION_EVENT = 34,\n\tMHI_DEV_RING_EL_EE_STATE_CHANGE_NOTIFY = 64,\n\tMHI_DEV_RING_EL_UNDEF\n};\n\nenum mhi_dev_ring_state {\n\tRING_STATE_UINT = 0,\n\tRING_STATE_IDLE,\n\tRING_STATE_PENDING,\n};\n\nenum mhi_dev_ring_type {\n\tRING_TYPE_CMD = 0,\n\tRING_TYPE_ER,\n\tRING_TYPE_CH,\n\tRING_TYPE_INVAL\n};\n\n/* Event context interrupt moderation */\nenum mhi_dev_evt_ctx_int_mod_timer {\n\tMHI_DEV_EVT_INT_MODERATION_DISABLED\n};\n\n/* Event ring type */\nenum mhi_dev_evt_ctx_event_ring_type {\n\tMHI_DEV_EVT_TYPE_DEFAULT,\n\tMHI_DEV_EVT_TYPE_VALID,\n\tMHI_DEV_EVT_RESERVED\n};\n\n/* Event ring context type */\nstruct mhi_dev_ev_ctx {\n\tuint32_t\t\t\t\tres1:16;\n\tenum mhi_dev_evt_ctx_int_mod_timer\tintmodt:16;\n\tenum mhi_dev_evt_ctx_event_ring_type\tertype;\n\tuint32_t\t\t\t\tmsivec;\n\tuint64_t\t\t\t\trbase;\n\tuint64_t\t\t\t\trlen;\n\tuint64_t\t\t\t\trp;\n\tuint64_t\t\t\t\twp;\n} __packed;\n\n/* Command context */\nstruct mhi_dev_cmd_ctx {\n\tuint32_t\t\t\t\tres1;\n\tuint32_t\t\t\t\tres2;\n\tuint32_t\t\t\t\tres3;\n\tuint64_t\t\t\t\trbase;\n\tuint64_t\t\t\t\trlen;\n\tuint64_t\t\t\t\trp;\n\tuint64_t\t\t\t\twp;\n} __packed;\n\n/* generic context */\nstruct mhi_dev_gen_ctx {\n\tuint32_t\t\t\t\tres1;\n\tuint32_t\t\t\t\tres2;\n\tuint32_t\t\t\t\tres3;\n\tuint64_t\t\t\t\trbase;\n\tuint64_t\t\t\t\trlen;\n\tuint64_t\t\t\t\trp;\n\tuint64_t\t\t\t\twp;\n} __packed;\n\n/* Transfer ring element */\nstruct mhi_dev_transfer_ring_element {\n\tuint64_t\t\t\t\tdata_buf_ptr;\n\tuint32_t\t\t\t\tlen:16;\n\tuint32_t\t\t\t\tres1:16;\n\tuint32_t\t\t\t\tchain:1;\n\tuint32_t\t\t\t\tres2:7;\n\tuint32_t\t\t\t\tieob:1;\n\tuint32_t\t\t\t\tieot:1;\n\tuint32_t\t\t\t\tbei:1;\n\tuint32_t\t\t\t\tres3:5;\n\tenum mhi_dev_ring_element_type_id\ttype:8;\n\tuint32_t\t\t\t\tres4:8;\n} __packed;\n\n/* Command ring element */\n/* Command ring No op command */\nstruct mhi_dev_cmd_ring_op {\n\tuint64_t\t\t\t\tres1;\n\tuint32_t\t\t\t\tres2;\n\tuint32_t\t\t\t\tres3:16;\n\tenum mhi_dev_ring_element_type_id\ttype:8;\n\tuint32_t\t\t\t\tchid:8;\n} __packed;\n\n/* Command ring reset channel command */\nstruct mhi_dev_cmd_ring_reset_channel_cmd {\n\tuint64_t\t\t\t\tres1;\n\tuint32_t\t\t\t\tres2;\n\tuint32_t\t\t\t\tres3:16;\n\tenum mhi_dev_ring_element_type_id\ttype:8;\n\tuint32_t\t\t\t\tchid:8;\n} __packed;\n\n/* Command ring stop channel command */\nstruct mhi_dev_cmd_ring_stop_channel_cmd {\n\tuint64_t\t\t\t\tres1;\n\tuint32_t\t\t\t\tres2;\n\tuint32_t\t\t\t\tres3:16;\n\tenum mhi_dev_ring_element_type_id\ttype:8;\n\tuint32_t\t\t\t\tchid:8;\n} __packed;\n\n/* Command ring start channel command */\nstruct mhi_dev_cmd_ring_start_channel_cmd {\n\tuint64_t\t\t\t\tres1;\n\tuint32_t\t\t\t\tseqnum;\n\tuint32_t\t\t\t\treliable:1;\n\tuint32_t\t\t\t\tres2:15;\n\tenum mhi_dev_ring_element_type_id\ttype:8;\n\tuint32_t\t\t\t\tchid:8;\n} __packed;\n\nenum mhi_dev_cmd_completion_code {\n\tMHI_CMD_COMPL_CODE_INVALID = 0,\n\tMHI_CMD_COMPL_CODE_SUCCESS = 1,\n\tMHI_CMD_COMPL_CODE_EOT = 2,\n\tMHI_CMD_COMPL_CODE_OVERFLOW = 3,\n\tMHI_CMD_COMPL_CODE_EOB = 4,\n\tMHI_CMD_COMPL_CODE_UNDEFINED = 16,\n\tMHI_CMD_COMPL_CODE_RING_EL = 17,\n\tMHI_CMD_COMPL_CODE_RES\n};\n\n/* Event ring elements */\n/* Transfer completion event */\nstruct mhi_dev_event_ring_transfer_completion {\n\tuint64_t\t\t\t\tptr;\n\tuint32_t\t\t\t\tlen:16;\n\tuint32_t\t\t\t\tres1:8;\n\tenum mhi_dev_cmd_completion_code\tcode:8;\n\tuint32_t\t\t\t\tres2:16;\n\tenum mhi_dev_ring_element_type_id\ttype:8;\n\tuint32_t\t\t\t\tchid:8;\n} __packed;\n\n/* Command completion event */\nstruct mhi_dev_event_ring_cmd_completion {\n\tuint64_t\t\t\t\tptr;\n\tuint32_t\t\t\t\tres1:24;\n\tenum mhi_dev_cmd_completion_code\tcode:8;\n\tuint32_t\t\t\t\tres2:16;\n\tenum mhi_dev_ring_element_type_id\ttype:8;\n\tuint32_t\t\t\t\tres3:8;\n} __packed;\n\n/* MHI state change event */\nstruct mhi_dev_event_ring_state_change {\n\tuint64_t\t\t\t\tptr;\n\tuint32_t\t\t\t\tres1:24;\n\tuint32_t /*enum mhi_dev_state*/\t\t\tmhistate:8;\n\tuint32_t\t\t\t\tres2:16;\n\tenum mhi_dev_ring_element_type_id\ttype:8;\n\tuint32_t\t\t\t\tres3:8;\n} __packed;\n\nenum mhi_dev_execenv {\n\tMHI_DEV_SBL_EE = 1,\n\tMHI_DEV_AMSS_EE = 2,\n\tMHI_DEV_UNRESERVED\n};\n\n/* EE state change event */\nstruct mhi_dev_event_ring_ee_state_change {\n\tuint64_t\t\t\t\tptr;\n\tuint32_t\t\t\t\tres1:24;\n\tenum mhi_dev_execenv\t\t\texecenv:8;\n\tuint32_t\t\t\t\tres2:16;\n\tenum mhi_dev_ring_element_type_id\ttype:8;\n\tuint32_t\t\t\t\tres3:8;\n} __packed;\n\n/* Generic cmd to parse common details like type and channel id */\nstruct mhi_dev_ring_generic {\n\tuint64_t\t\t\t\tptr;\n\tuint32_t\t\t\t\tres1:24;\n\tuint32_t /*enum mhi_dev_state*/\t\t\tmhistate:8;\n\tuint32_t\t\t\t\tres2:16;\n\tenum mhi_dev_ring_element_type_id\ttype:8;\n\tuint32_t\t\t\t\tchid:8;\n} __packed;\n\nstruct mhi_config {\n\tuint32_t\tmhi_reg_len;\n\tuint32_t\tversion;\n\tuint32_t\tevent_rings;\n\tuint32_t\tchannels;\n\tuint32_t\tchdb_offset;\n\tuint32_t\terdb_offset;\n};\n\n/* Possible ring element types */\nunion mhi_dev_ring_element_type {\n\tstruct mhi_dev_cmd_ring_op\t\t\tcmd_no_op;\n\tstruct mhi_dev_cmd_ring_reset_channel_cmd\tcmd_reset;\n\tstruct mhi_dev_cmd_ring_stop_channel_cmd\tcmd_stop;\n\tstruct mhi_dev_cmd_ring_start_channel_cmd\tcmd_start;\n\tstruct mhi_dev_transfer_ring_element\t\tcmd_transfer;\n\tstruct mhi_dev_event_ring_transfer_completion\tevt_tr_comp;\n\tstruct mhi_dev_event_ring_cmd_completion\tevt_cmd_comp;\n\tstruct mhi_dev_event_ring_state_change\t\tevt_state_change;\n\tstruct mhi_dev_event_ring_ee_state_change\tevt_ee_state;\n\tstruct mhi_dev_ring_generic\t\t\tgeneric;\n};\n\nstruct bhi_vec_entry {\n\tu64 dma_addr;\n\tu64 size;\n};\n\nenum mhi_cmd_type {\n\tMHI_CMD_TYPE_NOP = 1,\n\tMHI_CMD_TYPE_RESET = 16,\n\tMHI_CMD_TYPE_STOP = 17,\n\tMHI_CMD_TYPE_START = 18,\n\tMHI_CMD_TYPE_TSYNC = 24,\n};\n\n/* no operation command */\n#define MHI_TRE_CMD_NOOP_PTR (0)\n#define MHI_TRE_CMD_NOOP_DWORD0 (0)\n#define MHI_TRE_CMD_NOOP_DWORD1 (MHI_CMD_TYPE_NOP << 16)\n\n/* channel reset command */\n#define MHI_TRE_CMD_RESET_PTR (0)\n#define MHI_TRE_CMD_RESET_DWORD0 (0)\n#define MHI_TRE_CMD_RESET_DWORD1(chid) ((chid << 24) | \\\n\t\t\t\t\t(MHI_CMD_TYPE_RESET << 16))\n\n/* channel stop command */\n#define MHI_TRE_CMD_STOP_PTR (0)\n#define MHI_TRE_CMD_STOP_DWORD0 (0)\n#define MHI_TRE_CMD_STOP_DWORD1(chid) ((chid << 24) | (MHI_CMD_TYPE_STOP << 16))\n\n/* channel start command */\n#define MHI_TRE_CMD_START_PTR (0)\n#define MHI_TRE_CMD_START_DWORD0 (0)\n#define MHI_TRE_CMD_START_DWORD1(chid) ((chid << 24) | \\\n\t\t\t\t\t(MHI_CMD_TYPE_START << 16))\n\n/* time sync cfg command */\n#define MHI_TRE_CMD_TSYNC_CFG_PTR (0)\n#define MHI_TRE_CMD_TSYNC_CFG_DWORD0 (0)\n#define MHI_TRE_CMD_TSYNC_CFG_DWORD1(er) ((MHI_CMD_TYPE_TSYNC << 16) | \\\n\t\t\t\t\t  (er << 24))\n\n#define MHI_TRE_GET_CMD_CHID(tre) (((tre)->dword[1] >> 24) & 0xFF)\n#define MHI_TRE_GET_CMD_TYPE(tre) (((tre)->dword[1] >> 16) & 0xFF)\n\n/* event descriptor macros */\n#define MHI_TRE_EV_PTR(ptr) (ptr)\n#define MHI_TRE_EV_DWORD0(code, len) ((code << 24) | len)\n#define MHI_TRE_EV_DWORD1(chid, type) ((chid << 24) | (type << 16))\n#define MHI_TRE_GET_EV_PTR(tre) ((tre)->ptr)\n#define MHI_TRE_GET_EV_CODE(tre) (((tre)->dword[0] >> 24) & 0xFF)\n#define MHI_TRE_GET_EV_LEN(tre) ((tre)->dword[0] & 0xFFFF)\n#define MHI_TRE_GET_EV_CHID(tre) (((tre)->dword[1] >> 24) & 0xFF)\n#define MHI_TRE_GET_EV_TYPE(tre) (((tre)->dword[1] >> 16) & 0xFF)\n#define MHI_TRE_GET_EV_STATE(tre) (((tre)->dword[0] >> 24) & 0xFF)\n#define MHI_TRE_GET_EV_EXECENV(tre) (((tre)->dword[0] >> 24) & 0xFF)\n#define MHI_TRE_GET_EV_SEQ(tre) ((tre)->dword[0])\n#define MHI_TRE_GET_EV_TIME(tre) ((tre)->ptr)\n#define MHI_TRE_GET_EV_COOKIE(tre) lower_32_bits((tre)->ptr)\n#define MHI_TRE_GET_EV_VEID(tre) (((tre)->dword[0] >> 16) & 0xFF)\n\n/* transfer descriptor macros */\n#define MHI_TRE_DATA_PTR(ptr) (ptr)\n#define MHI_TRE_DATA_DWORD0(len) (len & MHI_MAX_MTU)\n#define MHI_TRE_DATA_DWORD1(bei, ieot, ieob, chain) ((2 << 16) | (bei << 10) \\\n\t| (ieot << 9) | (ieob << 8) | chain)\n\n/* rsc transfer descriptor macros */\n#define MHI_RSCTRE_DATA_PTR(ptr, len) (((u64)len << 48) | ptr)\n#define MHI_RSCTRE_DATA_DWORD0(cookie) (cookie)\n#define MHI_RSCTRE_DATA_DWORD1 (MHI_PKT_TYPE_COALESCING << 16)\n\nenum MHI_CMD {\n\tMHI_CMD_RESET_CHAN,\n\tMHI_CMD_START_CHAN,\n\tMHI_CMD_TIMSYNC_CFG,\n};\n\nenum MHI_PKT_TYPE {\n\tMHI_PKT_TYPE_INVALID = 0x0,\n\tMHI_PKT_TYPE_NOOP_CMD = 0x1,\n\tMHI_PKT_TYPE_TRANSFER = 0x2,\n\tMHI_PKT_TYPE_COALESCING = 0x8,\n\tMHI_PKT_TYPE_RESET_CHAN_CMD = 0x10,\n\tMHI_PKT_TYPE_STOP_CHAN_CMD = 0x11,\n\tMHI_PKT_TYPE_START_CHAN_CMD = 0x12,\n\tMHI_PKT_TYPE_STATE_CHANGE_EVENT = 0x20,\n\tMHI_PKT_TYPE_CMD_COMPLETION_EVENT = 0x21,\n\tMHI_PKT_TYPE_TX_EVENT = 0x22,\n\tMHI_PKT_TYPE_RSC_TX_EVENT = 0x28,\n\tMHI_PKT_TYPE_EE_EVENT = 0x40,\n\tMHI_PKT_TYPE_TSYNC_EVENT = 0x48,\n\tMHI_PKT_TYPE_STALE_EVENT, /* internal event */\n};\n\n/* MHI transfer completion events */\nenum MHI_EV_CCS {\n\tMHI_EV_CC_INVALID = 0x0,\n\tMHI_EV_CC_SUCCESS = 0x1,\n\tMHI_EV_CC_EOT = 0x2,\n\tMHI_EV_CC_OVERFLOW = 0x3,\n\tMHI_EV_CC_EOB = 0x4,\n\tMHI_EV_CC_OOB = 0x5,\n\tMHI_EV_CC_DB_MODE = 0x6,\n\tMHI_EV_CC_UNDEFINED_ERR = 0x10,\n\tMHI_EV_CC_BAD_TRE = 0x11,\n};\n\nenum MHI_CH_STATE {\n\tMHI_CH_STATE_DISABLED = 0x0,\n\tMHI_CH_STATE_ENABLED = 0x1,\n\tMHI_CH_STATE_RUNNING = 0x2,\n\tMHI_CH_STATE_SUSPENDED = 0x3,\n\tMHI_CH_STATE_STOP = 0x4,\n\tMHI_CH_STATE_ERROR = 0x5,\n};\n\nenum MHI_BRSTMODE {\n\tMHI_BRSTMODE_DISABLE = 0x2,\n\tMHI_BRSTMODE_ENABLE = 0x3,\n};\n\n#define MHI_INVALID_BRSTMODE(mode) (mode != MHI_BRSTMODE_DISABLE && \\\n\t\t\t\t    mode != MHI_BRSTMODE_ENABLE)\n\n#define MHI_IN_PBL(ee) (ee == MHI_EE_PBL || ee == MHI_EE_PTHRU || \\\n\t\t\tee == MHI_EE_EDL)\n\n#define MHI_IN_MISSION_MODE(ee) (ee == MHI_EE_AMSS || ee == MHI_EE_WFW)\n\nenum MHI_ST_TRANSITION {\n\tMHI_ST_TRANSITION_PBL,\n\tMHI_ST_TRANSITION_READY,\n\tMHI_ST_TRANSITION_SBL,\n\tMHI_ST_TRANSITION_MISSION_MODE,\n\tMHI_ST_TRANSITION_FP,\n\tMHI_ST_TRANSITION_MAX,\n};\n\nextern const char * const mhi_state_tran_str[MHI_ST_TRANSITION_MAX];\n#define TO_MHI_STATE_TRANS_STR(state) (((state) >= MHI_ST_TRANSITION_MAX) ? \\\n\t\t\t\t\"INVALID_STATE\" : mhi_state_tran_str[state])\n\nextern const char * const mhi_state_str[MHI_STATE_MAX];\n#define TO_MHI_STATE_STR(state) ((state >= MHI_STATE_MAX || \\\n\t\t\t\t  !mhi_state_str[state]) ? \\\n\t\t\t\t\"INVALID_STATE\" : mhi_state_str[state])\n\nenum {\n\tMHI_PM_BIT_DISABLE,\n\tMHI_PM_BIT_POR,\n\tMHI_PM_BIT_M0,\n\tMHI_PM_BIT_M2,\n\tMHI_PM_BIT_M3_ENTER,\n\tMHI_PM_BIT_M3,\n\tMHI_PM_BIT_M3_EXIT,\n\tMHI_PM_BIT_FW_DL_ERR,\n\tMHI_PM_BIT_SYS_ERR_DETECT,\n\tMHI_PM_BIT_SYS_ERR_PROCESS,\n\tMHI_PM_BIT_SHUTDOWN_PROCESS,\n\tMHI_PM_BIT_LD_ERR_FATAL_DETECT,\n\tMHI_PM_BIT_MAX\n};\n\n/* internal power states */\nenum MHI_PM_STATE {\n\tMHI_PM_DISABLE = BIT(MHI_PM_BIT_DISABLE), /* MHI is not enabled */\n\tMHI_PM_POR = BIT(MHI_PM_BIT_POR), /* reset state */\n\tMHI_PM_M0 = BIT(MHI_PM_BIT_M0),\n\tMHI_PM_M2 = BIT(MHI_PM_BIT_M2),\n\tMHI_PM_M3_ENTER = BIT(MHI_PM_BIT_M3_ENTER),\n\tMHI_PM_M3 = BIT(MHI_PM_BIT_M3),\n\tMHI_PM_M3_EXIT = BIT(MHI_PM_BIT_M3_EXIT),\n\t/* firmware download failure state */\n\tMHI_PM_FW_DL_ERR = BIT(MHI_PM_BIT_FW_DL_ERR),\n\tMHI_PM_SYS_ERR_DETECT = BIT(MHI_PM_BIT_SYS_ERR_DETECT),\n\tMHI_PM_SYS_ERR_PROCESS = BIT(MHI_PM_BIT_SYS_ERR_PROCESS),\n\tMHI_PM_SHUTDOWN_PROCESS = BIT(MHI_PM_BIT_SHUTDOWN_PROCESS),\n\t/* link not accessible */\n\tMHI_PM_LD_ERR_FATAL_DETECT = BIT(MHI_PM_BIT_LD_ERR_FATAL_DETECT),\n};\n\n#define MHI_REG_ACCESS_VALID(pm_state) ((pm_state & (MHI_PM_POR | MHI_PM_M0 | \\\n\t\tMHI_PM_M2 | MHI_PM_M3_ENTER | MHI_PM_M3_EXIT | \\\n\t\tMHI_PM_SYS_ERR_DETECT | MHI_PM_SYS_ERR_PROCESS | \\\n\t\tMHI_PM_SHUTDOWN_PROCESS | MHI_PM_FW_DL_ERR)))\n#define MHI_PM_IN_ERROR_STATE(pm_state) (pm_state >= MHI_PM_FW_DL_ERR)\n#define MHI_PM_IN_FATAL_STATE(pm_state) (pm_state == MHI_PM_LD_ERR_FATAL_DETECT)\n#define MHI_DB_ACCESS_VALID(pm_state) (pm_state & MHI_PM_M0)\n#define MHI_WAKE_DB_CLEAR_VALID(pm_state) (pm_state & (MHI_PM_M0 | \\\n\t\t\t\t\t\tMHI_PM_M2 | MHI_PM_M3_EXIT))\n#define MHI_WAKE_DB_SET_VALID(pm_state) (pm_state & MHI_PM_M2)\n#define MHI_WAKE_DB_FORCE_SET_VALID(pm_state) MHI_WAKE_DB_CLEAR_VALID(pm_state)\n#define MHI_EVENT_ACCESS_INVALID(pm_state) (pm_state == MHI_PM_DISABLE || \\\n\t\t\t\t\t    MHI_PM_IN_ERROR_STATE(pm_state))\n#define MHI_PM_IN_SUSPEND_STATE(pm_state) (pm_state & \\\n\t\t\t\t\t   (MHI_PM_M3_ENTER | MHI_PM_M3))\n\n/* accepted buffer type for the channel */\nenum MHI_XFER_TYPE {\n\tMHI_XFER_BUFFER,\n\tMHI_XFER_SKB,\n\tMHI_XFER_SCLIST,\n\tMHI_XFER_NOP, /* CPU offload channel, host does not accept transfer */\n\tMHI_XFER_DMA, /* receive dma address, already mapped by client */\n\tMHI_XFER_RSC_DMA, /* RSC type, accept premapped buffer */\n};\n\n#define NR_OF_CMD_RINGS (1)\n#define CMD_EL_PER_RING (128)\n#define PRIMARY_CMD_RING (0)\n#define MHI_DEV_WAKE_DB (127)\n#define MHI_MAX_MTU (0xffff)\n\nenum MHI_ER_TYPE {\n\tMHI_ER_TYPE_INVALID = 0x0,\n\tMHI_ER_TYPE_VALID = 0x1,\n};\n\nenum mhi_er_data_type {\n\tMHI_ER_DATA_ELEMENT_TYPE,\n\tMHI_ER_CTRL_ELEMENT_TYPE,\n\tMHI_ER_TSYNC_ELEMENT_TYPE,\n\tMHI_ER_DATA_TYPE_MAX = MHI_ER_TSYNC_ELEMENT_TYPE,\n};\n\nenum mhi_ch_ee_mask {\n\tMHI_CH_EE_PBL = BIT(MHI_EE_PBL),\n\tMHI_CH_EE_SBL = BIT(MHI_EE_SBL),\n\tMHI_CH_EE_AMSS = BIT(MHI_EE_AMSS),\n\tMHI_CH_EE_RDDM = BIT(MHI_EE_RDDM),\n\tMHI_CH_EE_PTHRU = BIT(MHI_EE_PTHRU),\n\tMHI_CH_EE_WFW = BIT(MHI_EE_WFW),\n\tMHI_CH_EE_EDL = BIT(MHI_EE_EDL),\n};\n\nenum mhi_ch_type {\n\tMHI_CH_TYPE_INVALID = 0,\n\tMHI_CH_TYPE_OUTBOUND = DMA_TO_DEVICE,\n\tMHI_CH_TYPE_INBOUND = DMA_FROM_DEVICE,\n\tMHI_CH_TYPE_INBOUND_COALESCED = 3,\n};\n\nstruct db_cfg {\n\tbool reset_req;\n\tbool db_mode;\n\tu32 pollcfg;\n\tenum MHI_BRSTMODE brstmode;\n\tdma_addr_t db_val;\n\tvoid (*process_db)(struct mhi_controller *mhi_cntrl,\n\t\t\t   struct db_cfg *db_cfg, void __iomem *io_addr,\n\t\t\t   dma_addr_t db_val);\n};\n\nstruct mhi_pm_transitions {\n\tenum MHI_PM_STATE from_state;\n\tu32 to_states;\n};\n\nstruct state_transition {\n\tstruct list_head node;\n\tenum MHI_ST_TRANSITION state;\n};\n\n/* Control Segment */\nstruct mhi_ctrl_seg\n{\n   struct mhi_tre hw_in_chan_ring[NUM_MHI_IPA_IN_RING_ELEMENTS]  __packed __aligned(NUM_MHI_IPA_IN_RING_ELEMENTS*16);\n   struct mhi_tre hw_out_chan_ring[NUM_MHI_IPA_OUT_RING_ELEMENTS]  __packed __aligned(NUM_MHI_IPA_OUT_RING_ELEMENTS*16);\n#ifdef ENABLE_IP_SW0\n   struct mhi_tre sw_in_chan_ring[NUM_MHI_SW_IP_RING_ELEMENTS]  __packed __aligned(NUM_MHI_IPA_IN_RING_ELEMENTS*16);\n   struct mhi_tre sw_out_chan_ring[NUM_MHI_SW_IP_RING_ELEMENTS]  __packed __aligned(NUM_MHI_IPA_OUT_RING_ELEMENTS*16);\n#endif\n\n#ifdef ENABLE_ADPL\n   struct mhi_tre adpl_in_chan_ring[NUM_MHI_ADPL_RING_ELEMENTS]  __packed __aligned(NUM_MHI_IPA_IN_RING_ELEMENTS*16);\n#endif\n\n#ifdef ENABLE_QDSS\n   struct mhi_tre qdss_in_chan_ring[NUM_MHI_QDSS_RING_ELEMENTS]  __packed __aligned(NUM_MHI_IPA_IN_RING_ELEMENTS*16);\n#endif\n\n   struct mhi_tre diag_in_chan_ring[NUM_MHI_DIAG_IN_RING_ELEMENTS]  __packed __aligned(NUM_MHI_IPA_OUT_RING_ELEMENTS*16);\n   struct mhi_tre chan_ring[NUM_MHI_CHAN_RING_ELEMENTS*2*12]  __packed __aligned(NUM_MHI_CHAN_RING_ELEMENTS*16);\n   struct mhi_tre event_ring[NUM_MHI_EVT_RINGS][NUM_MHI_EVT_RING_ELEMENTS]  __packed __aligned(NUM_MHI_EVT_RING_ELEMENTS*16);\n   struct mhi_tre cmd_ring[NR_OF_CMD_RINGS][CMD_EL_PER_RING]  __packed __aligned(CMD_EL_PER_RING*16);\n\n   struct mhi_chan_ctxt chan_ctxt[NUM_MHI_XFER_RINGS] __aligned(128);\n   struct mhi_event_ctxt er_ctxt[NUM_MHI_EVT_RINGS]  __aligned(128);\n   struct mhi_cmd_ctxt cmd_ctxt[NR_OF_CMD_RINGS]  __aligned(128);\n} __aligned(4096);\n\nstruct mhi_ctxt {\n\tstruct mhi_event_ctxt *er_ctxt;\n\tstruct mhi_chan_ctxt *chan_ctxt;\n\tstruct mhi_cmd_ctxt *cmd_ctxt;\n\tdma_addr_t er_ctxt_addr;\n\tdma_addr_t chan_ctxt_addr;\n\tdma_addr_t cmd_ctxt_addr;\n\tstruct mhi_ctrl_seg *ctrl_seg;\n\tdma_addr_t ctrl_seg_addr;\n};\n\nstruct mhi_ring {\n\tdma_addr_t dma_handle;\n\tdma_addr_t iommu_base;\n\tu64 *ctxt_wp; /* point to ctxt wp */\n\tvoid *pre_aligned;\n\tvoid *base;\n\tvoid *rp;\n\tvoid *wp;\n\tsize_t el_size;\n\tsize_t len;\n\tsize_t elements;\n\tsize_t alloc_size;\n\tvoid __iomem *db_addr;\n};\n\nstruct mhi_cmd {\n\tstruct mhi_ring ring;\n\tspinlock_t lock;\n};\n\nstruct mhi_buf_info {\n\tdma_addr_t p_addr;\n\tvoid *v_addr;\n\tvoid *bb_addr;\n\tvoid *wp;\n\tsize_t len;\n\tvoid *cb_buf;\n\tbool used; /* indicate element is free to use */\n\tbool pre_mapped; /* already pre-mapped by client */\n\tenum dma_data_direction dir;\n};\n\nstruct mhi_event {\n\tu32 er_index;\n\tu32 intmod;\n\tu32 msi;\n\tint chan; /* this event ring is dedicated to a channel */\n\tu32 priority;\n\tenum mhi_er_data_type data_type;\n\tstruct mhi_ring ring;\n\tstruct db_cfg db_cfg;\n\tu32 used_elements;\n\tbool hw_ring;\n\tbool cl_manage;\n\tbool offload_ev; /* managed by a device driver */\n\tspinlock_t lock;\n\tstruct mhi_chan *mhi_chan; /* dedicated to channel */\n\tstruct tasklet_struct task;\n\tint (*process_event)(struct mhi_controller *mhi_cntrl,\n\t\t\t     struct mhi_event *mhi_event,\n\t\t\t     u32 event_quota);\n\tstruct mhi_controller *mhi_cntrl;\n};\n\nstruct mhi_chan {\n\tu32 chan;\n\tconst char *name;\n\t/*\n\t * important, when consuming increment tre_ring first, when releasing\n\t * decrement buf_ring first. If tre_ring has space, buf_ring\n\t * guranteed to have space so we do not need to check both rings.\n\t */\n\tstruct mhi_ring buf_ring;\n\tstruct mhi_ring tre_ring;\n\n\tu32 used_elements;\n\tu32 used_events[MHI_EV_CC_DB_MODE+1];\n\n\tu32 er_index;\n\tu32 intmod;\n\tenum mhi_ch_type type;\n\tenum dma_data_direction dir;\n\tstruct db_cfg db_cfg;\n\tu32 ee_mask;\n\tenum MHI_XFER_TYPE xfer_type;\n\tenum MHI_CH_STATE ch_state;\n\tenum MHI_EV_CCS ccs;\n\tbool lpm_notify;\n\tbool configured;\n\tbool offload_ch;\n\tbool pre_alloc;\n\tbool auto_start;\n\tbool wake_capable; /* channel should wake up system */\n\t/* functions that generate the transfer ring elements */\n\tint (*gen_tre)(struct mhi_controller *mhi_cntrl,\n\t\t       struct mhi_chan *mhi_chan, void *buf, void *cb,\n\t\t       size_t len, enum MHI_FLAGS flags);\n\tint (*queue_xfer)(struct mhi_device *mhi_dev,\n\t\t\t  struct mhi_chan *mhi_chan, void *buf,\n\t\t\t  size_t len, enum MHI_FLAGS flags);\n\t/* xfer call back */\n\tstruct mhi_device *mhi_dev;\n\tvoid (*xfer_cb)(struct mhi_device *mhi_dev, struct mhi_result *result);\n\tstruct mutex mutex;\n\tstruct completion completion;\n\trwlock_t lock;\n\tu32 ring;\n\tu32 tiocm;\n\tstruct list_head node;\n};\n\nstruct tsync_node {\n\tstruct list_head node;\n\tu32 sequence;\n\tu64 local_time;\n\tu64 remote_time;\n\tstruct mhi_device *mhi_dev;\n\tvoid (*cb_func)(struct mhi_device *mhi_dev, u32 sequence,\n\t\t\tu64 local_time, u64 remote_time);\n};\n\nstruct mhi_timesync {\n\tu32 er_index;\n\tvoid __iomem *db;\n\tvoid __iomem *time_reg;\n\tenum MHI_EV_CCS ccs;\n\tstruct completion completion;\n\tspinlock_t lock; /* list protection */\n\tstruct mutex lpm_mutex; /* lpm protection */\n\tstruct list_head head;\n};\n\nstruct mhi_bus {\n\tstruct list_head controller_list;\n\tstruct mutex lock;\n\tstruct dentry *dentry;\n};\n\n/* default MHI timeout */\n#define MHI_TIMEOUT_MS (3000)\nextern struct mhi_bus mhi_bus;\n\n/* debug fs related functions */\nint mhi_debugfs_mhi_chan_show(struct seq_file *m, void *d);\nint mhi_debugfs_mhi_event_show(struct seq_file *m, void *d);\nint mhi_debugfs_mhi_states_show(struct seq_file *m, void *d);\nint mhi_debugfs_trigger_reset(void *data, u64 val);\n\nvoid mhi_deinit_debugfs(struct mhi_controller *mhi_cntrl);\nvoid mhi_init_debugfs(struct mhi_controller *mhi_cntrl);\n\n/* power management apis */\nenum MHI_PM_STATE __must_check mhi_tryset_pm_state(\n\t\t\t\t\tstruct mhi_controller *mhi_cntrl,\n\t\t\t\t\tenum MHI_PM_STATE state);\nconst char *to_mhi_pm_state_str(enum MHI_PM_STATE state);\nvoid mhi_reset_chan(struct mhi_controller *mhi_cntrl,\n\t\t    struct mhi_chan *mhi_chan);\nenum mhi_ee mhi_get_exec_env(struct mhi_controller *mhi_cntrl);\nint mhi_queue_state_transition(struct mhi_controller *mhi_cntrl,\n\t\t\t       enum MHI_ST_TRANSITION state);\nvoid mhi_pm_st_worker(struct work_struct *work);\nvoid mhi_fw_load_worker(struct work_struct *work);\nvoid mhi_pm_sys_err_worker(struct work_struct *work);\nvoid mhi_pm_ready_worker(struct work_struct *work);\nint mhi_ready_state_transition(struct mhi_controller *mhi_cntrl);\nvoid mhi_ctrl_ev_task(unsigned long data);\nint mhi_pm_m0_transition(struct mhi_controller *mhi_cntrl);\nvoid mhi_pm_m1_transition(struct mhi_controller *mhi_cntrl);\nint mhi_pm_m3_transition(struct mhi_controller *mhi_cntrl);\nvoid mhi_notify(struct mhi_device *mhi_dev, enum MHI_CB cb_reason);\nint mhi_process_data_event_ring(struct mhi_controller *mhi_cntrl,\n\t\t\t\tstruct mhi_event *mhi_event, u32 event_quota);\nint mhi_process_ctrl_ev_ring(struct mhi_controller *mhi_cntrl,\n\t\t\t     struct mhi_event *mhi_event, u32 event_quota);\nint mhi_process_tsync_event_ring(struct mhi_controller *mhi_cntrl,\n\t\t\t\t struct mhi_event *mhi_event, u32 event_quota);\nint mhi_send_cmd(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,\n\t\t enum MHI_CMD cmd);\nint __mhi_device_get_sync(struct mhi_controller *mhi_cntrl);\n\n/* queue transfer buffer */\nint mhi_gen_tre(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan,\n\t\tvoid *buf, void *cb, size_t buf_len, enum MHI_FLAGS flags);\nint mhi_queue_buf(struct mhi_device *mhi_dev, struct mhi_chan *mhi_chan,\n\t\t  void *buf, size_t len, enum MHI_FLAGS mflags);\nint mhi_queue_skb(struct mhi_device *mhi_dev, struct mhi_chan *mhi_chan,\n\t\t  void *buf, size_t len, enum MHI_FLAGS mflags);\nint mhi_queue_sclist(struct mhi_device *mhi_dev, struct mhi_chan *mhi_chan,\n\t\t  void *buf, size_t len, enum MHI_FLAGS mflags);\nint mhi_queue_nop(struct mhi_device *mhi_dev, struct mhi_chan *mhi_chan,\n\t\t  void *buf, size_t len, enum MHI_FLAGS mflags);\nint mhi_queue_dma(struct mhi_device *mhi_dev, struct mhi_chan *mhi_chan,\n\t\t  void *buf, size_t len, enum MHI_FLAGS mflags);\n\n/* register access methods */\nvoid mhi_db_brstmode(struct mhi_controller *mhi_cntrl, struct db_cfg *db_cfg,\n\t\t     void __iomem *db_addr, dma_addr_t wp);\nvoid mhi_db_brstmode_disable(struct mhi_controller *mhi_cntrl,\n\t\t\t     struct db_cfg *db_mode, void __iomem *db_addr,\n\t\t\t     dma_addr_t wp);\nint __must_check mhi_read_reg(struct mhi_controller *mhi_cntrl,\n\t\t\t      void __iomem *base, u32 offset, u32 *out);\nint __must_check mhi_read_reg_field(struct mhi_controller *mhi_cntrl,\n\t\t\t\t    void __iomem *base, u32 offset, u32 mask,\n\t\t\t\t    u32 shift, u32 *out);\nvoid mhi_write_reg(struct mhi_controller *mhi_cntrl, void __iomem *base,\n\t\t   u32 offset, u32 val);\nvoid mhi_write_reg_field(struct mhi_controller *mhi_cntrl, void __iomem *base,\n\t\t\t u32 offset, u32 mask, u32 shift, u32 val);\nvoid mhi_ring_er_db(struct mhi_event *mhi_event);\nvoid mhi_write_db(struct mhi_controller *mhi_cntrl, void __iomem *db_addr,\n\t\t  dma_addr_t wp);\nvoid mhi_ring_cmd_db(struct mhi_controller *mhi_cntrl, struct mhi_cmd *mhi_cmd);\nvoid mhi_ring_chan_db(struct mhi_controller *mhi_cntrl,\n\t\t      struct mhi_chan *mhi_chan);\nint mhi_get_capability_offset(struct mhi_controller *mhi_cntrl, u32 capability,\n\t\t\t      u32 *offset);\nint mhi_init_timesync(struct mhi_controller *mhi_cntrl);\nint mhi_create_timesync_sysfs(struct mhi_controller *mhi_cntrl);\nvoid mhi_destroy_timesync(struct mhi_controller *mhi_cntrl);\n\n/* memory allocation methods */\nstatic inline void *mhi_alloc_coherent(struct mhi_controller *mhi_cntrl,\n\t\t\t\t       size_t size,\n\t\t\t\t       dma_addr_t *dma_handle,\n\t\t\t\t       gfp_t gfp)\n{\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 5,0,0 ))\n\tvoid *buf = dma_zalloc_coherent(mhi_cntrl->dev, size, dma_handle, gfp);\n#else\n\tvoid *buf = dma_alloc_coherent(mhi_cntrl->dev, size, dma_handle, gfp | __GFP_ZERO);\n#endif\n\n\tMHI_LOG(\"size = %zd, dma_handle = %llx\\n\", size, (u64)*dma_handle);\n\tif (buf)\n\t\tatomic_add(size, &mhi_cntrl->alloc_size);\n\n\treturn buf;\n}\nstatic inline void mhi_free_coherent(struct mhi_controller *mhi_cntrl,\n\t\t\t\t     size_t size,\n\t\t\t\t     void *vaddr,\n\t\t\t\t     dma_addr_t dma_handle)\n{\n\tatomic_sub(size, &mhi_cntrl->alloc_size);\n\tdma_free_coherent(mhi_cntrl->dev, size, vaddr, dma_handle);\n}\nstruct mhi_device *mhi_alloc_device(struct mhi_controller *mhi_cntrl);\nstatic inline void mhi_dealloc_device(struct mhi_controller *mhi_cntrl,\n\t\t\t\t      struct mhi_device *mhi_dev)\n{\n\tkfree(mhi_dev);\n}\nint mhi_destroy_device(struct device *dev, void *data);\nvoid mhi_create_devices(struct mhi_controller *mhi_cntrl);\nint mhi_alloc_bhie_table(struct mhi_controller *mhi_cntrl,\n\t\t\t struct image_info **image_info, size_t alloc_size);\nvoid mhi_free_bhie_table(struct mhi_controller *mhi_cntrl,\n\t\t\t struct image_info *image_info);\n\nint mhi_map_single_no_bb(struct mhi_controller *mhi_cntrl,\n\t\t\t struct mhi_buf_info *buf_info);\nint mhi_map_single_use_bb(struct mhi_controller *mhi_cntrl,\n\t\t\t  struct mhi_buf_info *buf_info);\nvoid mhi_unmap_single_no_bb(struct mhi_controller *mhi_cntrl,\n\t\t\t    struct mhi_buf_info *buf_info);\nvoid mhi_unmap_single_use_bb(struct mhi_controller *mhi_cntrl,\n\t\t\t     struct mhi_buf_info *buf_info);\n\n/* initialization methods */\nint mhi_init_chan_ctxt(struct mhi_controller *mhi_cntrl,\n\t\t       struct mhi_chan *mhi_chan);\nvoid mhi_deinit_chan_ctxt(struct mhi_controller *mhi_cntrl,\n\t\t\t  struct mhi_chan *mhi_chan);\nint mhi_init_mmio(struct mhi_controller *mhi_cntrl);\nint mhi_init_dev_ctxt(struct mhi_controller *mhi_cntrl);\nvoid mhi_deinit_dev_ctxt(struct mhi_controller *mhi_cntrl);\nint mhi_init_irq_setup(struct mhi_controller *mhi_cntrl);\nvoid mhi_deinit_free_irq(struct mhi_controller *mhi_cntrl);\nint mhi_dtr_init(void);\n\n/* isr handlers */\nirqreturn_t mhi_one_msi_handlr(int irq_number, void *dev);\nirqreturn_t mhi_msi_handlr(int irq_number, void *dev);\nirqreturn_t mhi_intvec_threaded_handlr(int irq_number, void *dev);\nirqreturn_t mhi_intvec_handlr(int irq_number, void *dev);\nvoid mhi_ev_task(unsigned long data);\n\n#ifdef CONFIG_MHI_DEBUG\n\n#define MHI_ASSERT(cond, msg) do { \\\n\tif (cond) \\\n\t\tpanic(msg); \\\n} while (0)\n\n#else\n\n#define MHI_ASSERT(cond, msg) do { \\\n\tif (cond) { \\\n\t\tMHI_ERR(msg); \\\n\t\tWARN_ON(cond); \\\n\t} \\\n} while (0)\n\n#endif\n\n#endif /* _MHI_INT_H */\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/core/mhi_main.c",
    "content": "// SPDX-License-Identifier: GPL-2.0-only\n/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. */\n\n#include <linux/debugfs.h>\n#include <linux/device.h>\n#include <linux/dma-direction.h>\n#include <linux/dma-mapping.h>\n#include <linux/interrupt.h>\n#include <linux/list.h>\n#include <linux/of.h>\n#include <linux/module.h>\n#include <linux/skbuff.h>\n#include <linux/slab.h>\n#include <linux/sched.h>\n#include <linux/wait.h>\n#include <linux/io.h>\n#include \"mhi.h\"\n#include \"mhi_internal.h\"\n\nstatic void __mhi_unprepare_channel(struct mhi_controller *mhi_cntrl,\n\t\t\t\t    struct mhi_chan *mhi_chan);\n\nint __must_check mhi_read_reg(struct mhi_controller *mhi_cntrl,\n\t\t\t      void __iomem *base,\n\t\t\t      u32 offset,\n\t\t\t      u32 *out)\n{\n\tu32 tmp = readl_relaxed(base + offset);\n\n\t/* unexpected value, query the link status */\n\tif (PCI_INVALID_READ(tmp) &&\n\t    mhi_cntrl->link_status(mhi_cntrl, mhi_cntrl->priv_data))\n\t\treturn -EIO;\n\n\t*out = tmp;\n\n\treturn 0;\n}\n\nint __must_check mhi_read_reg_field(struct mhi_controller *mhi_cntrl,\n\t\t\t\t    void __iomem *base,\n\t\t\t\t    u32 offset,\n\t\t\t\t    u32 mask,\n\t\t\t\t    u32 shift,\n\t\t\t\t    u32 *out)\n{\n\tu32 tmp;\n\tint ret;\n\n\tret = mhi_read_reg(mhi_cntrl, base, offset, &tmp);\n\tif (ret)\n\t\treturn ret;\n\n\t*out = (tmp & mask) >> shift;\n\n\treturn 0;\n}\n\nint mhi_get_capability_offset(struct mhi_controller *mhi_cntrl,\n\t\t\t      u32 capability,\n\t\t\t      u32 *offset)\n{\n\tu32 cur_cap, next_offset;\n\tint ret;\n\n\t/* get the 1st supported capability offset */\n\tret = mhi_read_reg_field(mhi_cntrl, mhi_cntrl->regs, MISC_OFFSET,\n\t\t\t\t MISC_CAP_MASK, MISC_CAP_SHIFT, offset);\n\tif (ret)\n\t\treturn ret;\n\tif (*offset >= 0x1000)\n\t\treturn -ENXIO;\n\tdo {\n\t\tret = mhi_read_reg_field(mhi_cntrl, mhi_cntrl->regs, *offset,\n\t\t\t\t\t CAP_CAPID_MASK, CAP_CAPID_SHIFT,\n\t\t\t\t\t &cur_cap);\n\t\tif (ret)\n\t\t\treturn ret;\n\n\t\tif (cur_cap == capability)\n\t\t\treturn 0;\n\n\t\tret = mhi_read_reg_field(mhi_cntrl, mhi_cntrl->regs, *offset,\n\t\t\t\t\t CAP_NEXT_CAP_MASK, CAP_NEXT_CAP_SHIFT,\n\t\t\t\t\t &next_offset);\n\t\tif (ret)\n\t\t\treturn ret;\n\n\t\t*offset += next_offset;\n\t} while (next_offset);\n\n\treturn -ENXIO;\n}\n\nvoid mhi_write_reg(struct mhi_controller *mhi_cntrl,\n\t\t   void __iomem *base,\n\t\t   u32 offset,\n\t\t   u32 val)\n{\n\twritel_relaxed(val, base + offset);\n}\n\nvoid mhi_write_reg_field(struct mhi_controller *mhi_cntrl,\n\t\t\t void __iomem *base,\n\t\t\t u32 offset,\n\t\t\t u32 mask,\n\t\t\t u32 shift,\n\t\t\t u32 val)\n{\n\tint ret;\n\tu32 tmp;\n\n\tret = mhi_read_reg(mhi_cntrl, base, offset, &tmp);\n\tif (ret)\n\t\treturn;\n\n\ttmp &= ~mask;\n\ttmp |= (val << shift);\n\tmhi_write_reg(mhi_cntrl, base, offset, tmp);\n}\n\nvoid mhi_write_db(struct mhi_controller *mhi_cntrl,\n\t\t  void __iomem *db_addr,\n\t\t  dma_addr_t wp)\n{\n\tmhi_write_reg(mhi_cntrl, db_addr, 4, upper_32_bits(wp));\n\tmhi_write_reg(mhi_cntrl, db_addr, 0, lower_32_bits(wp));\n#if 0 //carl.yin 20190527  for debug\n\tif ((lower_32_bits(db_addr)&0xFFF) != 0x620)\n\t{\n\t\tu32 out = 0;\n\t\tint ret = mhi_read_reg(mhi_cntrl, db_addr, 0, &out);\n\t\tif (out != lower_32_bits(wp))\n\t\t\tMHI_ERR(\"%s db=%x, wp=w:%x - r:%x, ret=%d\\n\", __func__, lower_32_bits(db_addr), lower_32_bits(wp), out, ret);\n\t}\n#endif\n}\n\nvoid mhi_db_brstmode(struct mhi_controller *mhi_cntrl,\n\t\t     struct db_cfg *db_cfg,\n\t\t     void __iomem *db_addr,\n\t\t     dma_addr_t wp)\n{\n\tif (db_cfg->db_mode) {\n\t\tdb_cfg->db_val = wp;\n\t\tmhi_write_db(mhi_cntrl, db_addr, wp);\n\t\tdb_cfg->db_mode = false;\n\t}\n}\n\nvoid mhi_db_brstmode_disable(struct mhi_controller *mhi_cntrl,\n\t\t\t     struct db_cfg *db_cfg,\n\t\t\t     void __iomem *db_addr,\n\t\t\t     dma_addr_t wp)\n{\n\tdb_cfg->db_val = wp;\n\tmhi_write_db(mhi_cntrl, db_addr, wp);\n}\n\nvoid mhi_ring_er_db(struct mhi_event *mhi_event)\n{\n\tstruct mhi_ring *ring = &mhi_event->ring;\n\n\tmhi_event->db_cfg.process_db(mhi_event->mhi_cntrl, &mhi_event->db_cfg,\n\t\t\t\t     ring->db_addr, *ring->ctxt_wp);\n}\n\nvoid mhi_ring_cmd_db(struct mhi_controller *mhi_cntrl, struct mhi_cmd *mhi_cmd)\n{\n\tdma_addr_t db;\n\tstruct mhi_ring *ring = &mhi_cmd->ring;\n\n\tdb = ring->iommu_base + (ring->wp - ring->base);\n\t*ring->ctxt_wp = db;\n\tmhi_write_db(mhi_cntrl, ring->db_addr, db);\n}\n\n//#define DEBUG_CHAN100_DB\n#ifdef DEBUG_CHAN100_DB\nstatic atomic_t chan100_seq = ATOMIC_INIT(0);\n#define CHAN100_SIZE 0x1000\nstatic unsigned int chan100_t[CHAN100_SIZE];\n#endif\n\nvoid mhi_ring_chan_db(struct mhi_controller *mhi_cntrl,\n\t\t      struct mhi_chan *mhi_chan)\n{\n\tstruct mhi_ring *ring = &mhi_chan->tre_ring;\n\tdma_addr_t db;\n\n\tdb = ring->iommu_base + (ring->wp - ring->base);\n\t/*\n\t * Writes to the new ring element must be visible to the hardware\n\t * before letting h/w know there is new element to fetch.\n\t */\n\tdma_wmb();\n\t*ring->ctxt_wp = db;\n\tmhi_chan->db_cfg.process_db(mhi_cntrl, &mhi_chan->db_cfg, ring->db_addr,\n\t\t\t\t    db);\n}\n\nenum mhi_ee mhi_get_exec_env(struct mhi_controller *mhi_cntrl)\n{\n\tu32 exec;\n\tint ret = mhi_read_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_EXECENV, &exec);\n\n\treturn (ret) ? MHI_EE_MAX : exec;\n}\n\nenum mhi_dev_state mhi_get_mhi_state(struct mhi_controller *mhi_cntrl)\n{\n\tu32 state;\n\tint ret = mhi_read_reg_field(mhi_cntrl, mhi_cntrl->regs, MHISTATUS,\n\t\t\t\t     MHISTATUS_MHISTATE_MASK,\n\t\t\t\t     MHISTATUS_MHISTATE_SHIFT, &state);\n\treturn ret ? MHI_STATE_MAX : state;\n}\n\nint mhi_queue_sclist(struct mhi_device *mhi_dev,\n\t\t     struct mhi_chan *mhi_chan,\n\t\t     void *buf,\n\t\t     size_t len,\n\t\t     enum MHI_FLAGS mflags)\n{\n\treturn -EINVAL;\n}\n\nint mhi_queue_nop(struct mhi_device *mhi_dev,\n\t\t  struct mhi_chan *mhi_chan,\n\t\t  void *buf,\n\t\t  size_t len,\n\t\t  enum MHI_FLAGS mflags)\n{\n\treturn -EINVAL;\n}\n\nstatic void mhi_add_ring_element(struct mhi_controller *mhi_cntrl,\n\t\t\t\t struct mhi_ring *ring)\n{\n\tvoid *wp = ring->wp;\n\twp += ring->el_size;\n\tif (wp >= (ring->base + ring->len))\n\t\twp = ring->base;\n\tring->wp = wp;\n\t/* smp update */\n\tsmp_wmb();\n}\n\nstatic void mhi_del_ring_element(struct mhi_controller *mhi_cntrl,\n\t\t\t\t struct mhi_ring *ring)\n{\n\tvoid *rp = ring->rp;\n\trp += ring->el_size;\n\tif (rp >= (ring->base + ring->len))\n\t\trp = ring->base;\n\tring->rp = rp;\n\t/* smp update */\n\tsmp_wmb();\n}\n\nstatic int get_nr_avail_ring_elements(struct mhi_controller *mhi_cntrl,\n\t\t\t\t      struct mhi_ring *ring)\n{\n\tint nr_el;\n\n\tif (ring->wp < ring->rp)\n\t\tnr_el = ((ring->rp - ring->wp) / ring->el_size) - 1;\n\telse {\n\t\tnr_el = (ring->rp - ring->base) / ring->el_size;\n\t\tnr_el += ((ring->base + ring->len - ring->wp) /\n\t\t\t  ring->el_size) - 1;\n\t}\n\treturn nr_el;\n}\n\nstatic u32 get_used_ring_elements(void *rp, void *wp, u32 el_num)\n{\n\tu32 nr_el;\n\n\tif (wp >= rp)\n\t\tnr_el = (wp - rp)/sizeof(struct mhi_tre);\n\telse {\n\t\tnr_el = (rp - wp)/sizeof(struct mhi_tre);\n\t\tnr_el = el_num - nr_el;\n\t}\n\treturn nr_el;\n}\n\nstatic void *mhi_to_virtual(struct mhi_ring *ring, dma_addr_t addr)\n{\n\treturn (addr - ring->iommu_base) + ring->base;\n}\n\ndma_addr_t mhi_to_physical(struct mhi_ring *ring, void *addr)\n{\n\treturn (addr - ring->base) + ring->iommu_base;\n}\n\nstatic void mhi_recycle_ev_ring_element(struct mhi_controller *mhi_cntrl,\n\t\t\t\t\tstruct mhi_ring *ring)\n{\n\tvoid *rp, *wp;\n\n\t/* update the WP */\n\twp = ring->wp;\n\twp += ring->el_size;\n\tif (wp >= (ring->base + ring->len)) {\n\t\twp = ring->base;\n\t}\n\tring->wp = wp;\n\n\t*ring->ctxt_wp = ring->iommu_base + (ring->wp - ring->base);\n\n\t/* update the RP */\n\trp = ring->rp;\n\trp += ring->el_size;\n\tif (rp >= (ring->base + ring->len))\n\t\trp = ring->base;\n\tring->rp = rp;\n\n\t/* visible to other cores */\n\tsmp_wmb();\n}\n\nstatic bool mhi_is_ring_full(struct mhi_controller *mhi_cntrl,\n\t\t\t     struct mhi_ring *ring)\n{\n\tvoid *tmp = ring->wp + ring->el_size;\n\n\tif (tmp >= (ring->base + ring->len))\n\t\ttmp = ring->base;\n\n\treturn (tmp == ring->rp);\n}\n\nint mhi_map_single_no_bb(struct mhi_controller *mhi_cntrl,\n\t\t\t struct mhi_buf_info *buf_info)\n{\n\tbuf_info->p_addr = dma_map_single(mhi_cntrl->dev, buf_info->v_addr,\n\t\t\t\t\t  buf_info->len, buf_info->dir);\n\tif (dma_mapping_error(mhi_cntrl->dev, buf_info->p_addr))\n\t\treturn -ENOMEM;\n\n\treturn 0;\n}\n\nint mhi_map_single_use_bb(struct mhi_controller *mhi_cntrl,\n\t\t\t  struct mhi_buf_info *buf_info)\n{\n\tvoid *buf = mhi_alloc_coherent(mhi_cntrl, buf_info->len,\n\t\t\t\t       &buf_info->p_addr, GFP_ATOMIC);\n\n\tif (!buf)\n\t\treturn -ENOMEM;\n\n\tif (buf_info->dir == DMA_TO_DEVICE)\n\t\tmemcpy(buf, buf_info->v_addr, buf_info->len);\n\n\tbuf_info->bb_addr = buf;\n\n\treturn 0;\n}\n\nvoid mhi_unmap_single_no_bb(struct mhi_controller *mhi_cntrl,\n\t\t\t    struct mhi_buf_info *buf_info)\n{\n\tdma_unmap_single(mhi_cntrl->dev, buf_info->p_addr, buf_info->len,\n\t\t\t buf_info->dir);\n}\n\nvoid mhi_unmap_single_use_bb(struct mhi_controller *mhi_cntrl,\n\t\t\t    struct mhi_buf_info *buf_info)\n{\n\tif (buf_info->dir == DMA_FROM_DEVICE)\n\t\tmemcpy(buf_info->v_addr, buf_info->bb_addr, buf_info->len);\n\n\tmhi_free_coherent(mhi_cntrl, buf_info->len, buf_info->bb_addr,\n\t\t\t  buf_info->p_addr);\n}\n\n#ifdef ENABLE_MHI_MON\nstatic void mon_bus_submit(struct mhi_controller *mbus, u32 chan, dma_addr_t wp, struct mhi_tre *mhi_tre, void *buf, size_t len)\n{\n\tunsigned long flags;\n\tstruct list_head *pos;\n\tstruct mon_reader *r;\n\n\tspin_lock_irqsave(&mbus->lock, flags);\n\tmbus->cnt_events++;\n\tlist_for_each (pos, &mbus->r_list) {\n\t\tr = list_entry(pos, struct mon_reader, r_link);\n\t\tr->rnf_submit(r->r_data, chan, wp, mhi_tre, buf, len);\n\t}\n\tspin_unlock_irqrestore(&mbus->lock, flags);\n}\n\nstatic void mon_bus_receive(struct mhi_controller *mbus, u32 chan, dma_addr_t wp, struct mhi_tre *mhi_tre, void *buf, size_t len)\n{\n\tunsigned long flags;\n\tstruct list_head *pos;\n\tstruct mon_reader *r;\n\n\tspin_lock_irqsave(&mbus->lock, flags);\n\tmbus->cnt_events++;\n\tlist_for_each (pos, &mbus->r_list) {\n\t\tr = list_entry(pos, struct mon_reader, r_link);\n\t\tr->rnf_receive(r->r_data, chan, wp, mhi_tre, buf, len);\n\t}\n\tspin_unlock_irqrestore(&mbus->lock, flags);\n}\n\nstatic void mon_bus_complete(struct mhi_controller *mbus, u32 chan, dma_addr_t wp, struct mhi_tre *mhi_tre)\n{\n\tunsigned long flags;\n\tstruct list_head *pos;\n\tstruct mon_reader *r;\n\n\tspin_lock_irqsave(&mbus->lock, flags);\n\tmbus->cnt_events++;\n\tlist_for_each (pos, &mbus->r_list) {\n\t\tr = list_entry(pos, struct mon_reader, r_link);\n\t\tr->rnf_complete(r->r_data, chan, wp, mhi_tre);\n\t}\n\tspin_unlock_irqrestore(&mbus->lock, flags);\n}\n#endif\n\nint mhi_queue_skb(struct mhi_device *mhi_dev,\n\t\t  struct mhi_chan *mhi_chan,\n\t\t  void *buf,\n\t\t  size_t len,\n\t\t  enum MHI_FLAGS mflags)\n{\n\tstruct sk_buff *skb = buf;\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tstruct mhi_ring *tre_ring = &mhi_chan->tre_ring;\n\tstruct mhi_ring *buf_ring = &mhi_chan->buf_ring;\n\tstruct mhi_buf_info *buf_info;\n\tstruct mhi_tre *mhi_tre;\n\tbool assert_wake = false;\n\tint ret;\n\n\tif (mhi_is_ring_full(mhi_cntrl, tre_ring))\n\t\treturn -ENOMEM;\n\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tif (unlikely(MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state))) {\n\t\tMHI_VERB(\"MHI is not in activate state, pm_state:%s\\n\",\n\t\t\t to_mhi_pm_state_str(mhi_cntrl->pm_state));\n\t\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\t\treturn -EIO;\n\t}\n\n\t/* we're in M3 or transitioning to M3 */\n\tif (MHI_PM_IN_SUSPEND_STATE(mhi_cntrl->pm_state)) {\n\t\tmhi_cntrl->runtime_get(mhi_cntrl, mhi_cntrl->priv_data);\n\t\tmhi_cntrl->runtime_put(mhi_cntrl, mhi_cntrl->priv_data);\n\t}\n\n\t/*\n\t * For UL channels always assert WAKE until work is done,\n\t * For DL channels only assert if MHI is in a LPM\n\t */\n\tif (mhi_chan->dir == DMA_TO_DEVICE ||\n\t    (mhi_chan->dir == DMA_FROM_DEVICE &&\n\t     mhi_cntrl->pm_state != MHI_PM_M0)) {\n\t\tassert_wake = true;\n\t\tmhi_cntrl->wake_get(mhi_cntrl, false);\n\t}\n\n\t/* generate the tre */\n\tbuf_info = buf_ring->wp;\n\tbuf_info->v_addr = skb->data;\n\tbuf_info->cb_buf = skb;\n\tbuf_info->wp = tre_ring->wp;\n\tbuf_info->dir = mhi_chan->dir;\n\tbuf_info->len = len;\n\tret = mhi_cntrl->map_single(mhi_cntrl, buf_info);\n\tif (ret)\n\t\tgoto map_error;\n\n\tmhi_tre = tre_ring->wp;\n\n\tmhi_tre->ptr = MHI_TRE_DATA_PTR(buf_info->p_addr);\n\tmhi_tre->dword[0] = MHI_TRE_DATA_DWORD0(buf_info->len);\n\tmhi_tre->dword[1] = MHI_TRE_DATA_DWORD1(1, 1, 0, 0);\n\n#ifdef ENABLE_MHI_MON\n\tif (mhi_cntrl->nreaders) {\n\t\tmon_bus_submit(mhi_cntrl, mhi_chan->chan,\n\t\t\tmhi_to_physical(tre_ring, mhi_tre), mhi_tre, buf_info->v_addr, mhi_chan->chan&0x1 ? 0 : buf_info->len);\n\t}\n#endif\n\n\tMHI_VERB(\"chan:%d WP:0x%llx TRE:0x%llx 0x%08x 0x%08x\\n\", mhi_chan->chan,\n\t\t (u64)mhi_to_physical(tre_ring, mhi_tre), mhi_tre->ptr,\n\t\t mhi_tre->dword[0], mhi_tre->dword[1]);\n\n\tif (mhi_chan->dir == DMA_TO_DEVICE) {\n\t\tif (atomic_inc_return(&mhi_cntrl->pending_pkts) == 1)\n\t\t\tmhi_cntrl->runtime_get(mhi_cntrl, mhi_cntrl->priv_data);\n\t}\n\n\tread_lock_bh(&mhi_chan->lock);\n\t/* increment WP */\n\tmhi_add_ring_element(mhi_cntrl, tre_ring);\n\tmhi_add_ring_element(mhi_cntrl, buf_ring);\n\n#ifdef DEBUG_CHAN100_DB\n\tif (mhi_chan->chan == 100) {\n\t\tchan100_t[atomic_inc_return(&chan100_seq)&(CHAN100_SIZE-1)] = (((unsigned long)tre_ring->wp)&0xffff) | (mhi_chan->db_cfg.db_mode<<31) | (0<<30);\n\t}\n#endif\n\tif (likely(MHI_DB_ACCESS_VALID(mhi_cntrl->pm_state))) {\n\t\tmhi_ring_chan_db(mhi_cntrl, mhi_chan);\n\t}\n\t\tread_unlock_bh(&mhi_chan->lock);\n\n\tif (mhi_chan->dir == DMA_FROM_DEVICE && assert_wake)\n\t\tmhi_cntrl->wake_put(mhi_cntrl, true);\n\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\treturn 0;\n\nmap_error:\n\tif (assert_wake)\n\t\tmhi_cntrl->wake_put(mhi_cntrl, false);\n\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\treturn ret;\n}\n\nint mhi_queue_dma(struct mhi_device *mhi_dev,\n\t\t  struct mhi_chan *mhi_chan,\n\t\t  void *buf,\n\t\t  size_t len,\n\t\t  enum MHI_FLAGS mflags)\n{\n\tstruct mhi_buf *mhi_buf = buf;\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tstruct mhi_ring *tre_ring = &mhi_chan->tre_ring;\n\tstruct mhi_ring *buf_ring = &mhi_chan->buf_ring;\n\tstruct mhi_buf_info *buf_info;\n\tstruct mhi_tre *mhi_tre;\n\tbool assert_wake = false;\n\n\tif (mhi_is_ring_full(mhi_cntrl, tre_ring))\n\t\treturn -ENOMEM;\n\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tif (unlikely(MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state))) {\n\t\tMHI_VERB(\"MHI is not in activate state, pm_state:%s\\n\",\n\t\t\t to_mhi_pm_state_str(mhi_cntrl->pm_state));\n\t\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\t\treturn -EIO;\n\t}\n\n\t/* we're in M3 or transitioning to M3 */\n\tif (MHI_PM_IN_SUSPEND_STATE(mhi_cntrl->pm_state)) {\n\t\tmhi_cntrl->runtime_get(mhi_cntrl, mhi_cntrl->priv_data);\n\t\tmhi_cntrl->runtime_put(mhi_cntrl, mhi_cntrl->priv_data);\n\t}\n\n\t/*\n\t * For UL channels always assert WAKE until work is done,\n\t * For DL channels only assert if MHI is in a LPM\n\t */\n\tif (mhi_chan->dir == DMA_TO_DEVICE ||\n\t    (mhi_chan->dir == DMA_FROM_DEVICE &&\n\t     mhi_cntrl->pm_state != MHI_PM_M0)) {\n\t\tassert_wake = true;\n\t\tmhi_cntrl->wake_get(mhi_cntrl, false);\n\t}\n\n\t/* generate the tre */\n\tbuf_info = buf_ring->wp;\n\tMHI_ASSERT(buf_info->used, \"TRE Not Freed\\n\");\n\tbuf_info->p_addr = mhi_buf->dma_addr;\n\tbuf_info->pre_mapped = true;\n\tbuf_info->cb_buf = mhi_buf;\n\tbuf_info->wp = tre_ring->wp;\n\tbuf_info->dir = mhi_chan->dir;\n\tbuf_info->len = len;\n\n\tmhi_tre = tre_ring->wp;\n\n\tif (mhi_chan->xfer_type == MHI_XFER_RSC_DMA) {\n\t\tbuf_info->used = true;\n\t\tmhi_tre->ptr =\n\t\t\tMHI_RSCTRE_DATA_PTR(buf_info->p_addr, buf_info->len);\n\t\tmhi_tre->dword[0] =\n\t\t\tMHI_RSCTRE_DATA_DWORD0(buf_ring->wp - buf_ring->base);\n\t\tmhi_tre->dword[1] = MHI_RSCTRE_DATA_DWORD1;\n\t} else {\n\t\tmhi_tre->ptr = MHI_TRE_DATA_PTR(buf_info->p_addr);\n\t\tmhi_tre->dword[0] = MHI_TRE_DATA_DWORD0(buf_info->len);\n\t\tmhi_tre->dword[1] = MHI_TRE_DATA_DWORD1(1, 1, 0, 0);\n\t}\n\n#ifdef ENABLE_MHI_MON\n\tif (mhi_cntrl->nreaders) {\n\t\tmon_bus_submit(mhi_cntrl, mhi_chan->chan,\n\t\t\tmhi_to_physical(tre_ring, mhi_tre), mhi_tre, buf_info->v_addr, mhi_chan->chan&0x1 ? 0: buf_info->len);\n\t}\n#endif\n\n\tMHI_VERB(\"chan:%d WP:0x%llx TRE:0x%llx 0x%08x 0x%08x\\n\", mhi_chan->chan,\n\t\t (u64)mhi_to_physical(tre_ring, mhi_tre), mhi_tre->ptr,\n\t\t mhi_tre->dword[0], mhi_tre->dword[1]);\n\n\tif (mhi_chan->dir == DMA_TO_DEVICE) {\n\t\tif (atomic_inc_return(&mhi_cntrl->pending_pkts) == 1)\n\t\t\tmhi_cntrl->runtime_get(mhi_cntrl, mhi_cntrl->priv_data);\n\t}\n\n\tread_lock_bh(&mhi_chan->lock);\n\t/* increment WP */\n\tmhi_add_ring_element(mhi_cntrl, tre_ring);\n\tmhi_add_ring_element(mhi_cntrl, buf_ring);\n\n\tif (likely(MHI_DB_ACCESS_VALID(mhi_cntrl->pm_state))) {\n\t\tmhi_ring_chan_db(mhi_cntrl, mhi_chan);\n\t}\n\t\tread_unlock_bh(&mhi_chan->lock);\n\n\tif (mhi_chan->dir == DMA_FROM_DEVICE && assert_wake)\n\t\tmhi_cntrl->wake_put(mhi_cntrl, true);\n\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\treturn 0;\n}\n\nint mhi_gen_tre(struct mhi_controller *mhi_cntrl,\n\t\tstruct mhi_chan *mhi_chan,\n\t\tvoid *buf,\n\t\tvoid *cb,\n\t\tsize_t buf_len,\n\t\tenum MHI_FLAGS flags)\n{\n\tstruct mhi_ring *buf_ring, *tre_ring;\n\tstruct mhi_tre *mhi_tre;\n\tstruct mhi_buf_info *buf_info;\n\tint eot, eob, chain, bei;\n\tint ret;\n\n\tbuf_ring = &mhi_chan->buf_ring;\n\ttre_ring = &mhi_chan->tre_ring;\n\n\tbuf_info = buf_ring->wp;\n\tbuf_info->v_addr = buf;\n\tbuf_info->cb_buf = cb;\n\tbuf_info->wp = tre_ring->wp;\n\tbuf_info->dir = mhi_chan->dir;\n\tbuf_info->len = buf_len;\n\n\tret = mhi_cntrl->map_single(mhi_cntrl, buf_info);\n\tif (ret)\n\t\treturn ret;\n\n\teob = !!(flags & MHI_EOB);\n\teot = !!(flags & MHI_EOT);\n\tchain = !!(flags & MHI_CHAIN);\n\tbei = !!(mhi_chan->intmod);\n\n\tmhi_tre = tre_ring->wp;\n\tmhi_tre->ptr = MHI_TRE_DATA_PTR(buf_info->p_addr);\n\tmhi_tre->dword[0] = MHI_TRE_DATA_DWORD0(buf_len);\n\tmhi_tre->dword[1] = MHI_TRE_DATA_DWORD1(bei, eot, eob, chain);\n\n#ifdef ENABLE_MHI_MON\n\tif (mhi_cntrl->nreaders) {\n\t\tmon_bus_submit(mhi_cntrl, mhi_chan->chan,\n\t\t\tmhi_to_physical(tre_ring, mhi_tre), mhi_tre, buf_info->v_addr, mhi_chan->chan&0x1 ? 0 : buf_info->len);\n\t}\n#endif\n\tMHI_VERB(\"chan:%d WP:0x%llx TRE:0x%llx 0x%08x 0x%08x\\n\", mhi_chan->chan,\n\t\t (u64)mhi_to_physical(tre_ring, mhi_tre), mhi_tre->ptr,\n\t\t mhi_tre->dword[0], mhi_tre->dword[1]);\n\n\t/* increment WP */\n\tmhi_add_ring_element(mhi_cntrl, tre_ring);\n\tmhi_add_ring_element(mhi_cntrl, buf_ring);\n\n\treturn 0;\n}\n\nint mhi_queue_buf(struct mhi_device *mhi_dev,\n\t\t  struct mhi_chan *mhi_chan,\n\t\t  void *buf,\n\t\t  size_t len,\n\t\t  enum MHI_FLAGS mflags)\n{\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tstruct mhi_ring *tre_ring;\n\tunsigned long flags;\n\tbool assert_wake = false;\n\tint ret;\n\n\t/*\n\t * this check here only as a guard, it's always\n\t * possible mhi can enter error while executing rest of function,\n\t * which is not fatal so we do not need to hold pm_lock\n\t */\n\tif (unlikely(MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state))) {\n\t\tMHI_VERB(\"MHI is not in active state, pm_state:%s\\n\",\n\t\t\t to_mhi_pm_state_str(mhi_cntrl->pm_state));\n\n\t\treturn -EIO;\n\t}\n\n\ttre_ring = &mhi_chan->tre_ring;\n\tif (mhi_is_ring_full(mhi_cntrl, tre_ring))\n\t\treturn -ENOMEM;\n\n\tret = mhi_chan->gen_tre(mhi_cntrl, mhi_chan, buf, buf, len, mflags);\n\tif (unlikely(ret))\n\t\treturn ret;\n\n\tread_lock_irqsave(&mhi_cntrl->pm_lock, flags);\n\n\t/* we're in M3 or transitioning to M3 */\n\tif (MHI_PM_IN_SUSPEND_STATE(mhi_cntrl->pm_state)) {\n\t\tmhi_cntrl->runtime_get(mhi_cntrl, mhi_cntrl->priv_data);\n\t\tmhi_cntrl->runtime_put(mhi_cntrl, mhi_cntrl->priv_data);\n\t}\n\n\t/*\n\t * For UL channels always assert WAKE until work is done,\n\t * For DL channels only assert if MHI is in a LPM\n\t */\n\tif (mhi_chan->dir == DMA_TO_DEVICE ||\n\t    (mhi_chan->dir == DMA_FROM_DEVICE &&\n\t     mhi_cntrl->pm_state != MHI_PM_M0)) {\n\t\tassert_wake = true;\n\t\tmhi_cntrl->wake_get(mhi_cntrl, false);\n\t}\n\n\tif (mhi_chan->dir == DMA_TO_DEVICE) {\n\t\tif (atomic_inc_return(&mhi_cntrl->pending_pkts) == 1)\n\t\t\tmhi_cntrl->runtime_get(mhi_cntrl, mhi_cntrl->priv_data);\n\t}\n\n\tif (likely(MHI_DB_ACCESS_VALID(mhi_cntrl->pm_state))) {\n\t\tunsigned long flags;\n\n\t\tread_lock_irqsave(&mhi_chan->lock, flags);\n\t\tmhi_ring_chan_db(mhi_cntrl, mhi_chan);\n\t\tread_unlock_irqrestore(&mhi_chan->lock, flags);\n\t}\n\n\tif (mhi_chan->dir == DMA_FROM_DEVICE && assert_wake)\n\t\tmhi_cntrl->wake_put(mhi_cntrl, true);\n\n\tread_unlock_irqrestore(&mhi_cntrl->pm_lock, flags);\n\n\treturn 0;\n}\n\nstatic ssize_t ul_chan_id_show(struct device *dev, struct device_attribute *attr, char *buf) {\n\tstruct mhi_device *mhi_dev = to_mhi_device(dev);\n\n\treturn snprintf(buf, PAGE_SIZE, \"%d\\n\",  mhi_dev->ul_chan_id);\n}\n\nstatic DEVICE_ATTR_RO(ul_chan_id);\n\nstatic struct attribute *mhi_dev_attrs[] = {\n\t&dev_attr_ul_chan_id.attr,\n\tNULL,\n};\n\nstatic struct attribute_group mhi_dev_attr_group = {\n\t.attrs = mhi_dev_attrs,\n};\n\n/* destroy specific device */\nint mhi_destroy_device(struct device *dev, void *data)\n{\n\tstruct mhi_device *mhi_dev;\n\tstruct mhi_controller *mhi_cntrl;\n\n\tif (dev->bus != &mhi_bus_type)\n\t\treturn 0;\n\n\tmhi_dev = to_mhi_device(dev);\n\tmhi_cntrl = mhi_dev->mhi_cntrl;\n\n\t/* only destroying virtual devices thats attached to bus */\n\tif (mhi_dev->dev_type ==  MHI_CONTROLLER_TYPE)\n\t\treturn 0;\n\n\tMHI_LOG(\"destroy device for chan:%s\\n\", mhi_dev->chan_name);\n\n\tsysfs_remove_group(&mhi_dev->dev.kobj, &mhi_dev_attr_group);\n\t/* notify the client and remove the device from mhi bus */\n\tdevice_del(dev);\n\tput_device(dev);\n\n\treturn 0;\n}\n\nvoid mhi_notify(struct mhi_device *mhi_dev, enum MHI_CB cb_reason)\n{\n\tstruct mhi_driver *mhi_drv;\n\n\tif (!mhi_dev->dev.driver)\n\t\treturn;\n\n\tmhi_drv = to_mhi_driver(mhi_dev->dev.driver);\n\n\tif (mhi_drv->status_cb)\n\t\tmhi_drv->status_cb(mhi_dev, cb_reason);\n}\n\nstatic void mhi_assign_of_node(struct mhi_controller *mhi_cntrl,\n\t\t\t       struct mhi_device *mhi_dev)\n{\n\tstruct device_node *controller, *node;\n\tconst char *dt_name;\n\tint ret;\n\n\tcontroller = of_find_node_by_name(mhi_cntrl->of_node, \"mhi_devices\");\n\tif (!controller)\n\t\treturn;\n\n\tfor_each_available_child_of_node(controller, node) {\n\t\tret = of_property_read_string(node, \"mhi,chan\", &dt_name);\n\t\tif (ret)\n\t\t\tcontinue;\n\t\tif (!strcmp(mhi_dev->chan_name, dt_name)) {\n\t\t\tmhi_dev->dev.of_node = node;\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nstatic ssize_t time_show(struct device *dev,\n\t\t\t struct device_attribute *attr,\n\t\t\t char *buf)\n{\n\tstruct mhi_device *mhi_dev = to_mhi_device(dev);\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tu64 t_host, t_device;\n\tint ret;\n\n\tret = mhi_get_remote_time_sync(mhi_dev, &t_host, &t_device);\n\tif (ret) {\n\t\tMHI_ERR(\"Failed to obtain time, ret:%d\\n\", ret);\n\t\treturn ret;\n\t}\n\n\treturn scnprintf(buf, PAGE_SIZE, \"local: %llu remote: %llu (ticks)\\n\",\n\t\t\t t_host, t_device);\n}\nstatic DEVICE_ATTR_RO(time);\n\nstatic ssize_t time_us_show(struct device *dev,\n\t\t\t    struct device_attribute *attr,\n\t\t\t    char *buf)\n{\n\tstruct mhi_device *mhi_dev = to_mhi_device(dev);\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tu64 t_host, t_device;\n\tint ret;\n\n\tret = mhi_get_remote_time_sync(mhi_dev, &t_host, &t_device);\n\tif (ret) {\n\t\tMHI_ERR(\"Failed to obtain time, ret:%d\\n\", ret);\n\t\treturn ret;\n\t}\n\n\treturn scnprintf(buf, PAGE_SIZE, \"local: %llu remote: %llu (us)\\n\",\n\t\t\t TIME_TICKS_TO_US(t_host), TIME_TICKS_TO_US(t_device));\n}\nstatic DEVICE_ATTR_RO(time_us);\n\nstatic struct attribute *mhi_tsync_attrs[] = {\n\t&dev_attr_time.attr,\n\t&dev_attr_time_us.attr,\n\tNULL,\n};\n\nstatic const struct attribute_group mhi_tsync_group = {\n\t.attrs = mhi_tsync_attrs,\n};\n\nvoid mhi_destroy_timesync(struct mhi_controller *mhi_cntrl)\n{\n\tif (mhi_cntrl->mhi_tsync) {\n\t\tsysfs_remove_group(&mhi_cntrl->mhi_dev->dev.kobj,\n\t\t\t\t   &mhi_tsync_group);\n\t\tkfree(mhi_cntrl->mhi_tsync);\n\t\tmhi_cntrl->mhi_tsync = NULL;\n\t}\n}\n\nint mhi_create_timesync_sysfs(struct mhi_controller *mhi_cntrl)\n{\n\treturn sysfs_create_group(&mhi_cntrl->mhi_dev->dev.kobj,\n\t\t\t\t  &mhi_tsync_group);\n}\n\nstatic void mhi_create_time_sync_dev(struct mhi_controller *mhi_cntrl)\n{\n\tstruct mhi_device *mhi_dev;\n\tint ret;\n\n\tif (!MHI_IN_MISSION_MODE(mhi_cntrl->ee))\n\t\treturn;\n\n\tmhi_dev = mhi_alloc_device(mhi_cntrl);\n\tif (!mhi_dev)\n\t\treturn;\n\n\tmhi_dev->dev_type = MHI_TIMESYNC_TYPE;\n\tmhi_dev->chan_name = \"TIME_SYNC\";\n\tdev_set_name(&mhi_dev->dev, \"%04x_%02x.%02x.%02x_%s\", mhi_dev->dev_id,\n\t\t     mhi_dev->domain, mhi_dev->bus, mhi_dev->slot,\n\t\t     mhi_dev->chan_name);\n\n\t/* add if there is a matching DT node */\n\tmhi_assign_of_node(mhi_cntrl, mhi_dev);\n\n\tret = device_add(&mhi_dev->dev);\n\tif (ret) {\n\t\tMHI_ERR(\"Failed to register dev for  chan:%s\\n\",\n\t\t\tmhi_dev->chan_name);\n\t\tmhi_dealloc_device(mhi_cntrl, mhi_dev);\n\t\treturn;\n\t}\n\n\tmhi_cntrl->tsync_dev = mhi_dev;\n}\n\n/* bind mhi channels into mhi devices */\nvoid mhi_create_devices(struct mhi_controller *mhi_cntrl)\n{\n\tint i;\n\tstruct mhi_chan *mhi_chan;\n\tstruct mhi_device *mhi_dev;\n\tint ret;\n\n\t/*\n\t * we need to create time sync device before creating other\n\t * devices, because client may try to capture time during\n\t * clint probe.\n\t */\n\tmhi_create_time_sync_dev(mhi_cntrl);\n\n\tmhi_chan = mhi_cntrl->mhi_chan;\n\tfor (i = 0; i < mhi_cntrl->max_chan; i++, mhi_chan++) {\n\t\tif (!mhi_chan->configured || mhi_chan->mhi_dev ||\n\t\t    !(mhi_chan->ee_mask & BIT(mhi_cntrl->ee)))\n\t\t\tcontinue;\n\t\tmhi_dev = mhi_alloc_device(mhi_cntrl);\n\t\tif (!mhi_dev)\n\t\t\treturn;\n\n\t\tmhi_dev->dev_type = MHI_XFER_TYPE;\n\t\tswitch (mhi_chan->dir) {\n\t\tcase DMA_TO_DEVICE:\n\t\t\tmhi_dev->ul_chan = mhi_chan;\n\t\t\tmhi_dev->ul_chan_id = mhi_chan->chan;\n\t\t\tmhi_dev->ul_xfer = mhi_chan->queue_xfer;\n\t\t\tmhi_dev->ul_event_id = mhi_chan->er_index;\n\t\t\tbreak;\n\t\tcase DMA_NONE:\n\t\tcase DMA_BIDIRECTIONAL:\n\t\t\tmhi_dev->ul_chan_id = mhi_chan->chan;\n\t\t\tmhi_dev->ul_event_id = mhi_chan->er_index;\n\t\t\tmhi_dev->dl_chan = mhi_chan;\n\t\t\tmhi_dev->dl_chan_id = mhi_chan->chan;\n\t\t\tmhi_dev->dl_xfer = mhi_chan->queue_xfer;\n\t\t\tmhi_dev->dl_event_id = mhi_chan->er_index;\n\t\t\tbreak;\n\t\tcase DMA_FROM_DEVICE:\n\t\t\t/* we use dl_chan for offload channels */\n\t\t\tmhi_dev->dl_chan = mhi_chan;\n\t\t\tmhi_dev->dl_chan_id = mhi_chan->chan;\n\t\t\tmhi_dev->dl_xfer = mhi_chan->queue_xfer;\n\t\t\tmhi_dev->dl_event_id = mhi_chan->er_index;\n\t\t\tbreak;\n\t\t}\n\n\t\tmhi_chan->mhi_dev = mhi_dev;\n\n\t\t/* check next channel if it matches */\n\t\tif ((i + 1) < mhi_cntrl->max_chan && mhi_chan[1].configured) {\n\t\t\tif (!strcmp(mhi_chan[1].name, mhi_chan->name)) {\n\t\t\t\ti++;\n\t\t\t\tmhi_chan++;\n\t\t\t\tif (mhi_chan->dir == DMA_TO_DEVICE) {\n\t\t\t\t\tmhi_dev->ul_chan = mhi_chan;\n\t\t\t\t\tmhi_dev->ul_chan_id = mhi_chan->chan;\n\t\t\t\t\tmhi_dev->ul_xfer = mhi_chan->queue_xfer;\n\t\t\t\t\tmhi_dev->ul_event_id =\n\t\t\t\t\t\tmhi_chan->er_index;\n\t\t\t\t} else {\n\t\t\t\t\tmhi_dev->dl_chan = mhi_chan;\n\t\t\t\t\tmhi_dev->dl_chan_id = mhi_chan->chan;\n\t\t\t\t\tmhi_dev->dl_xfer = mhi_chan->queue_xfer;\n\t\t\t\t\tmhi_dev->dl_event_id =\n\t\t\t\t\t\tmhi_chan->er_index;\n\t\t\t\t}\n\t\t\t\tmhi_chan->mhi_dev = mhi_dev;\n\t\t\t}\n\t\t}\n\n\t\tmhi_dev->chan_name = mhi_chan->name;\n\t\tdev_set_name(&mhi_dev->dev, \"%04x_%02x.%02x.%02x_%s\",\n\t\t\t     mhi_dev->dev_id, mhi_dev->domain, mhi_dev->bus,\n\t\t\t     mhi_dev->slot, mhi_dev->chan_name);\n\n\t\t/* add if there is a matching DT node */\n\t\tmhi_assign_of_node(mhi_cntrl, mhi_dev);\n\n\t\t/* init wake source */\n\t\tif (mhi_dev->dl_chan && mhi_dev->dl_chan->wake_capable)\n\t\t\tdevice_init_wakeup(&mhi_dev->dev, true);\n\n\t\tret = device_add(&mhi_dev->dev);\n\t\tif (ret) {\n\t\t\tMHI_ERR(\"Failed to register dev for  chan:%s\\n\",\n\t\t\t\tmhi_dev->chan_name);\n\t\t\tmhi_dealloc_device(mhi_cntrl, mhi_dev);\n\t\t}\n\t\tret = sysfs_create_group(&mhi_dev->dev.kobj, &mhi_dev_attr_group);\n\t}\n}\n\nstatic void mhi_dump_tre(struct mhi_controller *mhi_cntrl, struct mhi_tre *_ev) {\n\tunion mhi_dev_ring_element_type *ev = (union mhi_dev_ring_element_type *)_ev;\n\n\tswitch (ev->generic.type) {\n\t\tcase MHI_DEV_RING_EL_INVALID: {\n\t\t\tMHI_ERR(\"carl_ev cmd_invalid, ptr=%llx, %x, %x\\n\", _ev->ptr, _ev->dword[0], _ev->dword[1]);\n\t\t}\n\t\tbreak;\n\t\tcase MHI_DEV_RING_EL_NOOP: {\n\t\t\tMHI_LOG(\"carl_ev cmd_no_op chan=%u\\n\", ev->cmd_no_op.chid);\n\t\t}\n\t\tbreak;\n\t\tcase MHI_DEV_RING_EL_TRANSFER: {\n\t\t\tMHI_LOG(\"carl_ev cmd_transfer data=%llx, len=%u, chan=%u\\n\",\n\t\t\t\tev->cmd_transfer.data_buf_ptr, ev->cmd_transfer.len, ev->cmd_transfer.chain);\n\t\t}\n\t\tbreak;\n\t\tcase MHI_DEV_RING_EL_RESET: {\n\t\t\tMHI_LOG(\"carl_ev cmd_reset chan=%u\\n\", ev->cmd_reset.chid);\n\t\t}\n\t\tbreak;\n\t\tcase MHI_DEV_RING_EL_STOP: {\n\t\t\tMHI_LOG(\"carl_ev cmd_stop chan=%u\\n\", ev->cmd_stop.chid);\n\t\t}\n\t\tbreak;\n\t\tcase MHI_DEV_RING_EL_START: {\n\t\t\tMHI_LOG(\"carl_ev cmd_start chan=%u\\n\", ev->cmd_start.chid);\n\t\t}\n\t\tbreak;\n\t\tcase MHI_DEV_RING_EL_MHI_STATE_CHG: {\n\t\t\tMHI_LOG(\"carl_ev evt_state_change mhistate=%u\\n\", ev->evt_state_change.mhistate);\n\t\t}\n\t\tbreak;\n\t\tcase MHI_DEV_RING_EL_CMD_COMPLETION_EVT:{\n\t\t\tMHI_LOG(\"carl_ev evt_cmd_comp code=%u, type=%u\\n\", ev->evt_cmd_comp.code, ev->evt_cmd_comp.type);\n\t\t}\n\t\tbreak;\n\t\tcase MHI_DEV_RING_EL_TRANSFER_COMPLETION_EVENT:{\n\t\t\tMHI_VERB(\"carl_ev evt_tr_comp ptr=%llx, len=%u, code=%u, chan=%u\\n\",\n\t\t\t\tev->evt_tr_comp.ptr, ev->evt_tr_comp.len, ev->evt_tr_comp.code,  ev->evt_tr_comp.chid);\n\t\t}\n\t\tbreak;\n\t\tcase MHI_DEV_RING_EL_EE_STATE_CHANGE_NOTIFY:{\n\t\t\tMHI_LOG(\"carl_ev evt_ee_state execenv=%u\\n\", ev->evt_ee_state.execenv);\n\t\t}\n\t\tbreak;\n\t\tcase MHI_DEV_RING_EL_UNDEF:\n\t\tdefault: {\n\t\t\tMHI_ERR(\"carl_ev el_undef type=%d\\n\", ev->generic.type);\n\t\t};\n\t\tbreak;\n\t}\n}\n\nstatic int parse_xfer_event(struct mhi_controller *mhi_cntrl,\n\t\t\t    struct mhi_tre *event,\n\t\t\t    struct mhi_chan *mhi_chan)\n{\n\tstruct mhi_ring *buf_ring, *tre_ring;\n\tu32 ev_code;\n\tstruct mhi_result result;\n\tunsigned long flags = 0;\n\n\tev_code = MHI_TRE_GET_EV_CODE(event);\n\tbuf_ring = &mhi_chan->buf_ring;\n\ttre_ring = &mhi_chan->tre_ring;\n\n\tresult.transaction_status = (ev_code == MHI_EV_CC_OVERFLOW) ?\n\t\t-EOVERFLOW : 0;\n\n\t/*\n\t * if it's a DB Event then we need to grab the lock\n\t * with preemption disable and as a write because we\n\t * have to update db register and another thread could\n\t * be doing same.\n\t */\n\tif (ev_code >= MHI_EV_CC_OOB)\n\t\twrite_lock_irqsave(&mhi_chan->lock, flags);\n\telse\n\t\tread_lock_bh(&mhi_chan->lock);\n\n\tif (mhi_chan->ch_state != MHI_CH_STATE_ENABLED)\n\t\tgoto end_process_tx_event;\n\n\tswitch (ev_code) {\n\tcase MHI_EV_CC_OVERFLOW:\n\tcase MHI_EV_CC_EOB:\n\tcase MHI_EV_CC_EOT:\n\t{\n\t\tdma_addr_t ptr = MHI_TRE_GET_EV_PTR(event);\n\t\tstruct mhi_tre *local_rp, *ev_tre;\n\t\tvoid *dev_rp;\n\t\tstruct mhi_buf_info *buf_info;\n\t\tu16 xfer_len;\n\n\t\t/* Get the TRB this event points to */\n\t\tev_tre = mhi_to_virtual(tre_ring, ptr);\n\n\t\t/* device rp after servicing the TREs */\n\t\tdev_rp = ev_tre + 1;\n\t\tif (dev_rp >= (tre_ring->base + tre_ring->len))\n\t\t\tdev_rp = tre_ring->base;\n\n\t\tmhi_chan->used_events[ev_code]++;\n\n\t\tresult.dir = mhi_chan->dir;\n\n\t\t/* local rp */\n\t\tlocal_rp = tre_ring->rp;\n\t\twhile (local_rp != dev_rp) {\n\t\t\tbuf_info = buf_ring->rp;\n\t\t\t/* Always get the get len from the event */\n\t\t\txfer_len = MHI_TRE_GET_EV_LEN(event);\n\n\t\t\t/* unmap if it's not premapped by client */\n\t\t\tif (likely(!buf_info->pre_mapped))\n\t\t\t\tmhi_cntrl->unmap_single(mhi_cntrl, buf_info);\n\n\t\t\tresult.buf_addr = buf_info->cb_buf;\n\t\t\tresult.bytes_xferd = xfer_len;\n#ifdef ENABLE_MHI_MON\n\t\t\tif (mhi_cntrl->nreaders) {\n\t\t\t\tvoid *buf = NULL;\n\t\t\t\tsize_t len = 0;\n\n\t\t\t\tif (mhi_chan->queue_xfer == mhi_queue_skb) {\n\t\t\t\t\tstruct sk_buff *skb = result.buf_addr;\n\t\t\t\t\tbuf = skb->data;\n\t\t\t\t\tlen = result.bytes_xferd;\n\t\t\t\t}\n\t\t\t\telse if (CHAN_INBOUND(mhi_chan->chan)) {\n\t\t\t\t\tbuf = result.buf_addr;\n\t\t\t\t\tlen = result.bytes_xferd;\n\t\t\t\t}\n\t\t\t\tmon_bus_receive(mhi_cntrl, mhi_chan->chan,\n\t\t\t\t\tmhi_to_physical(tre_ring, local_rp), local_rp, buf, len);\n\t\t\t}\n#endif\n\t\t\tmhi_del_ring_element(mhi_cntrl, buf_ring);\n\t\t\tmhi_del_ring_element(mhi_cntrl, tre_ring);\n\t\t\tlocal_rp = tre_ring->rp;\n\n\t\t\t/* notify client */\n\t\t\tmhi_chan->xfer_cb(mhi_chan->mhi_dev, &result);\n\n\t\t\tif (mhi_chan->dir == DMA_TO_DEVICE) {\n\t\t\t\tif (atomic_dec_return(&mhi_cntrl->pending_pkts) == 0) \n\t\t\t\t\tmhi_cntrl->runtime_put(mhi_cntrl, mhi_cntrl->priv_data);\n\t\t\t}\n\n\t\t\tif (mhi_chan->dir == DMA_TO_DEVICE) {\n\t\t\t\tread_lock_bh(&mhi_cntrl->pm_lock);\n\t\t\t\tmhi_cntrl->wake_put(mhi_cntrl, false);\n\t\t\t\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\t\t\t}\n\n\t\t\t/*\n\t\t\t * recycle the buffer if buffer is pre-allocated,\n\t\t\t * if there is error, not much we can do apart from\n\t\t\t * dropping the packet\n\t\t\t */\n\t\t\tif (mhi_chan->pre_alloc) {\n\t\t\t\tif (mhi_queue_buf(mhi_chan->mhi_dev, mhi_chan,\n\t\t\t\t\t\t  buf_info->cb_buf,\n\t\t\t\t\t\t  buf_info->len, MHI_EOT)) {\n\t\t\t\t\tMHI_ERR(\n\t\t\t\t\t\t\"Error recycling buffer for chan:%d\\n\",\n\t\t\t\t\t\tmhi_chan->chan);\n\t\t\t\t\tkfree(buf_info->cb_buf);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tbreak;\n\t} /* CC_EOT */\n\tcase MHI_EV_CC_OOB:\n\tcase MHI_EV_CC_DB_MODE:\n\t{\n\t\tunsigned long flags;\n\n\t\tmhi_chan->used_events[ev_code]++;\n\t\tMHI_VERB(\"DB_MODE/OOB Detected chan %d.\\n\", mhi_chan->chan);\n\t\tmhi_chan->db_cfg.db_mode = true;\n\t\tread_lock_irqsave(&mhi_cntrl->pm_lock, flags);\n#ifdef DEBUG_CHAN100_DB\n\t\tif (mhi_chan->chan == 100) {\n\t\t\tchan100_t[atomic_inc_return(&chan100_seq)&(CHAN100_SIZE-1)] = (((unsigned long)tre_ring->rp)&0xffff) | (0xf0000);\n\t\t\tchan100_t[atomic_inc_return(&chan100_seq)&(CHAN100_SIZE-1)] = (((unsigned long)tre_ring->wp)&0xffff) | (mhi_chan->db_cfg.db_mode<<31) | (1<<30);\n\t\t}\n#endif\n\t\tif (tre_ring->wp != tre_ring->rp &&\n\t\t    MHI_DB_ACCESS_VALID(mhi_cntrl->pm_state)) {\n\t\t\tmhi_ring_chan_db(mhi_cntrl, mhi_chan);\n\t\t}\n\t\tread_unlock_irqrestore(&mhi_cntrl->pm_lock, flags);\n\t\tbreak;\n\t}\n\tcase MHI_EV_CC_BAD_TRE:\n\t\tMHI_ASSERT(1, \"Received BAD TRE event for ring\");\n\t\tbreak;\n\tdefault:\n\t\tMHI_CRITICAL(\"Unknown TX completion.\\n\");\n\n\t\tbreak;\n\t} /* switch(MHI_EV_READ_CODE(EV_TRB_CODE,event)) */\n\nend_process_tx_event:\n\tif (ev_code >= MHI_EV_CC_OOB)\n\t\twrite_unlock_irqrestore(&mhi_chan->lock, flags);\n\telse\n\t\tread_unlock_bh(&mhi_chan->lock);\n\n\treturn 0;\n}\n\nstatic int parse_rsc_event(struct mhi_controller *mhi_cntrl,\n\t\t\t   struct mhi_tre *event,\n\t\t\t   struct mhi_chan *mhi_chan)\n{\n\tstruct mhi_ring *buf_ring, *tre_ring;\n\tstruct mhi_buf_info *buf_info;\n\tstruct mhi_result result;\n\tint ev_code;\n\tu32 cookie; /* offset to local descriptor */\n\tu16 xfer_len;\n\n\tbuf_ring = &mhi_chan->buf_ring;\n\ttre_ring = &mhi_chan->tre_ring;\n\n\tev_code = MHI_TRE_GET_EV_CODE(event);\n\tcookie = MHI_TRE_GET_EV_COOKIE(event);\n\txfer_len = MHI_TRE_GET_EV_LEN(event);\n\n\t/* received out of bound cookie */\n\tMHI_ASSERT(cookie >= buf_ring->len, \"Invalid Cookie\\n\");\n\n\tbuf_info = buf_ring->base + cookie;\n\n\tresult.transaction_status = (ev_code == MHI_EV_CC_OVERFLOW) ?\n\t\t-EOVERFLOW : 0;\n\tresult.bytes_xferd = xfer_len;\n\tresult.buf_addr = buf_info->cb_buf;\n\tresult.dir = mhi_chan->dir;\n\n\tread_lock_bh(&mhi_chan->lock);\n\n\tif (mhi_chan->ch_state != MHI_CH_STATE_ENABLED)\n\t\tgoto end_process_rsc_event;\n\n\tMHI_ASSERT(!buf_info->used, \"TRE already Freed\\n\");\n\n\t/* notify the client */\n\tmhi_chan->xfer_cb(mhi_chan->mhi_dev, &result);\n\n\t/*\n\t * Note: We're arbitrarily incrementing RP even though, completion\n\t * packet we processed might not be the same one, reason we can do this\n\t * is because device guaranteed to cache descriptors in order it\n\t * receive, so even though completion event is different we can re-use\n\t * all descriptors in between.\n\t * Example:\n\t * Transfer Ring has descriptors: A, B, C, D\n\t * Last descriptor host queue is D (WP) and first descriptor\n\t * host queue is A (RP).\n\t * The completion event we just serviced is descriptor C.\n\t * Then we can safely queue descriptors to replace A, B, and C\n\t * even though host did not receive any completions.\n\t */\n\tmhi_del_ring_element(mhi_cntrl, tre_ring);\n\tbuf_info->used = false;\n\nend_process_rsc_event:\n\tread_unlock_bh(&mhi_chan->lock);\n\n\treturn 0;\n}\n\nstatic void mhi_process_cmd_completion(struct mhi_controller *mhi_cntrl,\n\t\t\t\t       struct mhi_tre *tre)\n{\n\tdma_addr_t ptr = MHI_TRE_GET_EV_PTR(tre);\n\tstruct mhi_cmd *cmd_ring = &mhi_cntrl->mhi_cmd[PRIMARY_CMD_RING];\n\tstruct mhi_ring *mhi_ring = &cmd_ring->ring;\n\tstruct mhi_tre *cmd_pkt;\n\tstruct mhi_chan *mhi_chan;\n\tstruct mhi_timesync *mhi_tsync;\n\tenum mhi_cmd_type type;\n\tu32 chan;\n\n\tcmd_pkt = mhi_to_virtual(mhi_ring, ptr);\n\n\t/* out of order completion received */\n\tMHI_ASSERT(cmd_pkt != mhi_ring->rp, \"Out of order cmd completion\");\n\n\ttype = MHI_TRE_GET_CMD_TYPE(cmd_pkt);\n\n\tif (type == MHI_CMD_TYPE_TSYNC) {\n\t\tmhi_tsync = mhi_cntrl->mhi_tsync;\n\t\tmhi_tsync->ccs = MHI_TRE_GET_EV_CODE(tre);\n\t\tcomplete(&mhi_tsync->completion);\n\t} else {\n\t\tchan = MHI_TRE_GET_CMD_CHID(cmd_pkt);\n\t\tmhi_chan = &mhi_cntrl->mhi_chan[chan];\n\t\twrite_lock_bh(&mhi_chan->lock);\n\t\tmhi_chan->ccs = MHI_TRE_GET_EV_CODE(tre);\n\t\tcomplete(&mhi_chan->completion);\n\t\twrite_unlock_bh(&mhi_chan->lock);\n\t}\n\n\tmhi_del_ring_element(mhi_cntrl, mhi_ring);\n}\n\nint mhi_process_ctrl_ev_ring(struct mhi_controller *mhi_cntrl,\n\t\t\t     struct mhi_event *mhi_event,\n\t\t\t     u32 event_quota)\n{\n\tstruct mhi_tre *dev_rp, *local_rp;\n\tstruct mhi_ring *ev_ring = &mhi_event->ring;\n\tstruct mhi_event_ctxt *er_ctxt =\n\t\t&mhi_cntrl->mhi_ctxt->er_ctxt[mhi_event->er_index];\n\tint count = 0;\n\n\t/*\n\t * this is a quick check to avoid unnecessary event processing\n\t * in case we already in error state, but it's still possible\n\t * to transition to error state while processing events\n\t */\n\tif (unlikely(MHI_EVENT_ACCESS_INVALID(mhi_cntrl->pm_state))) {\n\t\tMHI_ERR(\"No EV access, PM_STATE:%s\\n\",\n\t\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state));\n\t\treturn -EIO;\n\t}\n\n\tdev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);\n\tlocal_rp = ev_ring->rp;\n\n\twhile (dev_rp != local_rp) {\n\t\tenum MHI_PKT_TYPE type = MHI_TRE_GET_EV_TYPE(local_rp);\n\n//#define QL_READ_EVENT_WA //from Quectel Windows driver\n#ifdef QL_READ_EVENT_WA\n\t\tif (mhi_event->er_index == 0) {\n\t\t\tif (local_rp->ptr == 0 && local_rp->dword[0] == 0 && local_rp->dword[1] == 0) {\n\t\t\t\t// event content no sync to memory, just break and wait next event.\n\t\t\t\tMHI_ERR(\"Zero Event!\\n\");\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n#endif\n\n\t\tmhi_dump_tre(mhi_cntrl, local_rp);\n\t\tMHI_VERB(\"Processing Event:0x%llx 0x%08x 0x%08x\\n\",\n\t\t\tlocal_rp->ptr, local_rp->dword[0], local_rp->dword[1]);\n#ifdef ENABLE_MHI_MON\n\t\tif (mhi_cntrl->nreaders) {\n\t\t\tmon_bus_complete(mhi_cntrl, mhi_event->er_index, mhi_to_physical(ev_ring, local_rp), local_rp);\n\t\t}\n#endif\n\n\t\tswitch (type) {\n\t\tcase MHI_PKT_TYPE_STATE_CHANGE_EVENT:\n\t\t{\n\t\t\tenum mhi_dev_state new_state;\n\n\t\t\tnew_state = MHI_TRE_GET_EV_STATE(local_rp);\n\n\t\t\tMHI_LOG(\"MHI state change event to state:%s\\n\",\n\t\t\t\tTO_MHI_STATE_STR(new_state));\n\n\t\t\tswitch (new_state) {\n\t\t\tcase MHI_STATE_M0:\n\t\t\t\tmhi_pm_m0_transition(mhi_cntrl);\n\t\t\t\tbreak;\n\t\t\tcase MHI_STATE_M1:\n\t\t\t\tmhi_pm_m1_transition(mhi_cntrl);\n\t\t\t\tbreak;\n\t\t\tcase MHI_STATE_M3:\n\t\t\t\tmhi_pm_m3_transition(mhi_cntrl);\n\t\t\t\tbreak;\n\t\t\tcase MHI_STATE_SYS_ERR:\n\t\t\t{\n\t\t\t\tenum MHI_PM_STATE new_state;\n\n\t\t\t\tMHI_ERR(\"MHI system error detected\\n\");\n\t\t\t\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\t\t\t\tnew_state = mhi_tryset_pm_state(mhi_cntrl,\n\t\t\t\t\t\t\tMHI_PM_SYS_ERR_DETECT);\n\t\t\t\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\t\t\t\tif (new_state == MHI_PM_SYS_ERR_DETECT)\n\t\t\t\t\tschedule_work(\n\t\t\t\t\t\t&mhi_cntrl->syserr_worker);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdefault:\n\t\t\t\tMHI_ERR(\"Unsupported STE:%s\\n\",\n\t\t\t\t\tTO_MHI_STATE_STR(new_state));\n\t\t\t}\n\n\t\t\tbreak;\n\t\t}\n\t\tcase MHI_PKT_TYPE_CMD_COMPLETION_EVENT:\n\t\t\tmhi_process_cmd_completion(mhi_cntrl, local_rp);\n\t\t\tbreak;\n\t\tcase MHI_PKT_TYPE_EE_EVENT:\n\t\t{\n\t\t\tenum MHI_ST_TRANSITION st = MHI_ST_TRANSITION_MAX;\n\t\t\tenum mhi_ee event = MHI_TRE_GET_EV_EXECENV(local_rp);\n\n\t\t\tMHI_LOG(\"MHI EE received event:%s\\n\",\n\t\t\t\tTO_MHI_EXEC_STR(event));\n\t\t\tswitch (event) {\n\t\t\tcase MHI_EE_SBL:\n\t\t\t\tst = MHI_ST_TRANSITION_SBL;\n\t\t\t\tbreak;\n\t\t\tcase MHI_EE_FP:\n\t\t\t\tst = MHI_ST_TRANSITION_FP;\n\t\t\t\tbreak;\n\t\t\tcase MHI_EE_WFW:\n\t\t\tcase MHI_EE_AMSS:\n\t\t\t\tst = MHI_ST_TRANSITION_MISSION_MODE;\n\t\t\t\tbreak;\n\t\t\tcase MHI_EE_RDDM:\n\t\t\t\tmhi_cntrl->status_cb(mhi_cntrl,\n\t\t\t\t\t\t     mhi_cntrl->priv_data,\n\t\t\t\t\t\t     MHI_CB_EE_RDDM);\n\t\t\t\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\t\t\t\tmhi_cntrl->ee = event;\n\t\t\t\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\t\t\t\twake_up_all(&mhi_cntrl->state_event);\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tMHI_ERR(\"Unhandled EE event:%s\\n\",\n\t\t\t\t\tTO_MHI_EXEC_STR(event));\n\t\t\t}\n\t\t\tif (st != MHI_ST_TRANSITION_MAX)\n\t\t\t\tmhi_queue_state_transition(mhi_cntrl, st);\n\t\t\tbreak;\n\t\t}\n#if 1 //Add by Quectel\n\t\tcase MHI_PKT_TYPE_TX_EVENT:\n\t\tcase MHI_PKT_TYPE_RSC_TX_EVENT:\n\t\t{\n\t\t\tu32 chan = MHI_TRE_GET_EV_CHID(local_rp);\n\t\t\tstruct mhi_chan *mhi_chan = &mhi_cntrl->mhi_chan[chan];\n\n\t\t\tif (likely(type == MHI_PKT_TYPE_TX_EVENT)) {\n\t\t\t\tparse_xfer_event(mhi_cntrl, local_rp, mhi_chan);\n\t\t\t} else if (type == MHI_PKT_TYPE_RSC_TX_EVENT) {\n\t\t\t\tparse_rsc_event(mhi_cntrl, local_rp, mhi_chan);\n\t\t\t}\n\t\t\tbreak;\n\t\t}\n#endif\n\t\tdefault:\n\t\t\tMHI_ASSERT(1, \"Unsupported ev type\");\n\t\t\tbreak;\n\t\t}\n\n#ifdef QL_READ_EVENT_WA\n\t\tif (mhi_event->er_index == 0) {\n\t\t\tlocal_rp->ptr = 0;\n\t\t\tlocal_rp->dword[0] = local_rp->dword[1] = 0;\n\t\t}\n#endif\n\n\t\tmhi_recycle_ev_ring_element(mhi_cntrl, ev_ring);\n\t\tlocal_rp = ev_ring->rp;\n\t\tdev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);\n\t\tcount++;\n\t}\n\n\tif (count > mhi_event->used_elements) {\n\t\tmhi_event->used_elements = count;\n\t}\n\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tif (likely(MHI_DB_ACCESS_VALID(mhi_cntrl->pm_state)))\n\t\tmhi_ring_er_db(mhi_event);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\tMHI_VERB(\"exit er_index:%u\\n\", mhi_event->er_index);\n\n\treturn count;\n}\n\nint mhi_process_data_event_ring(struct mhi_controller *mhi_cntrl,\n\t\t\t\tstruct mhi_event *mhi_event,\n\t\t\t\tu32 event_quota)\n{\n\tstruct mhi_tre *dev_rp, *local_rp;\n\tstruct mhi_ring *ev_ring = &mhi_event->ring;\n\tstruct mhi_event_ctxt *er_ctxt =\n\t\t&mhi_cntrl->mhi_ctxt->er_ctxt[mhi_event->er_index];\n\tint count = 0;\n\tu32 chan;\n\tstruct mhi_chan *mhi_chan = NULL;\n\tu32 chan_count = 0;\n\tvoid *chan_local_rp = NULL;\n\n\tif (unlikely(MHI_EVENT_ACCESS_INVALID(mhi_cntrl->pm_state))) {\n\t\tMHI_ERR(\"No EV access, PM_STATE:%s\\n\",\n\t\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state));\n\t\treturn -EIO;\n\t}\n\n\tdev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);\n\tlocal_rp = ev_ring->rp;\n\n\twhile (dev_rp != local_rp && event_quota > 0) {\n\t\tenum MHI_PKT_TYPE type = MHI_TRE_GET_EV_TYPE(local_rp);\n\n\t\tmhi_dump_tre(mhi_cntrl, local_rp);\n\t\tMHI_VERB(\"Processing Event:0x%llx 0x%08x 0x%08x\\n\",\n\t\t\tlocal_rp->ptr, local_rp->dword[0], local_rp->dword[1]);\n\n\t\tchan = MHI_TRE_GET_EV_CHID(local_rp);\n\t\tmhi_chan = &mhi_cntrl->mhi_chan[chan];\n\t\tchan_local_rp = mhi_chan->tre_ring.rp;\n\n#ifdef ENABLE_MHI_MON\n\t\tif (mhi_cntrl->nreaders) {\n\t\t\tmon_bus_complete(mhi_cntrl, mhi_event->er_index, mhi_to_physical(ev_ring, local_rp), local_rp);\n\t\t}\n#endif\n\t\tif (likely(type == MHI_PKT_TYPE_TX_EVENT)) {\n\t\t\tparse_xfer_event(mhi_cntrl, local_rp, mhi_chan);\n\t\t\tevent_quota--;\n\t\t} else if (type == MHI_PKT_TYPE_RSC_TX_EVENT) {\n\t\t\tparse_rsc_event(mhi_cntrl, local_rp, mhi_chan);\n\t\t\tevent_quota--;\n\t\t}\n\n\t\tchan_count += get_used_ring_elements(chan_local_rp, mhi_chan->tre_ring.rp, mhi_chan->tre_ring.elements);\n\t\tmhi_recycle_ev_ring_element(mhi_cntrl, ev_ring);\n\t\tlocal_rp = ev_ring->rp;\n\t\tif (local_rp == dev_rp || event_quota == 0) {\n\t\t\tif (chan_count > mhi_chan->used_elements)\n\t\t\t\tmhi_chan->used_elements = chan_count;\n\t\t\tchan_count = 0;\n\t\t\tdev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);\n\t\t}\n\t\tcount++;\n\t}\n\n\tif (count > mhi_event->used_elements) {\n\t\tmhi_event->used_elements = count;\n\t}\n\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tif (likely(MHI_DB_ACCESS_VALID(mhi_cntrl->pm_state)))\n\t\tmhi_ring_er_db(mhi_event);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\tMHI_VERB(\"exit er_index:%u\\n\", mhi_event->er_index);\n\n\treturn count;\n}\n\nint mhi_process_tsync_event_ring(struct mhi_controller *mhi_cntrl,\n\t\t\t\t struct mhi_event *mhi_event,\n\t\t\t\t u32 event_quota)\n{\n\tstruct mhi_tre *dev_rp, *local_rp;\n\tstruct mhi_ring *ev_ring = &mhi_event->ring;\n\tstruct mhi_event_ctxt *er_ctxt =\n\t\t&mhi_cntrl->mhi_ctxt->er_ctxt[mhi_event->er_index];\n\tstruct mhi_timesync *mhi_tsync = mhi_cntrl->mhi_tsync;\n\tint count = 0;\n\tu32 sequence;\n\tu64 remote_time;\n\n\tif (unlikely(MHI_EVENT_ACCESS_INVALID(mhi_cntrl->pm_state))) {\n\t\tMHI_ERR(\"No EV access, PM_STATE:%s\\n\",\n\t\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state));\n\t\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\t\treturn -EIO;\n\t}\n\n\tdev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);\n\tlocal_rp = ev_ring->rp;\n\n\twhile (dev_rp != local_rp) {\n\t\tenum MHI_PKT_TYPE type = MHI_TRE_GET_EV_TYPE(local_rp);\n\t\tstruct tsync_node *tsync_node;\n\n\t\tMHI_VERB(\"Processing Event:0x%llx 0x%08x 0x%08x\\n\",\n\t\t\tlocal_rp->ptr, local_rp->dword[0], local_rp->dword[1]);\n\n\t\tMHI_ASSERT(type != MHI_PKT_TYPE_TSYNC_EVENT, \"!TSYNC event\");\n\n\t\tsequence = MHI_TRE_GET_EV_SEQ(local_rp);\n\t\tremote_time = MHI_TRE_GET_EV_TIME(local_rp);\n\n\t\tdo {\n\t\t\tspin_lock_irq(&mhi_tsync->lock);\n\t\t\ttsync_node = list_first_entry_or_null(&mhi_tsync->head,\n\t\t\t\t\t\t      struct tsync_node, node);\n\t\t\tMHI_ASSERT(!tsync_node, \"Unexpected Event\");\n\n\t\t\tif (unlikely(!tsync_node))\n\t\t\t\tbreak;\n\n\t\t\tlist_del(&tsync_node->node);\n\t\t\tspin_unlock_irq(&mhi_tsync->lock);\n\n\t\t\t/*\n\t\t\t * device may not able to process all time sync commands\n\t\t\t * host issue and only process last command it receive\n\t\t\t */\n\t\t\tif (tsync_node->sequence == sequence) {\n\t\t\t\ttsync_node->cb_func(tsync_node->mhi_dev,\n\t\t\t\t\t\t    sequence,\n\t\t\t\t\t\t    tsync_node->local_time,\n\t\t\t\t\t\t    remote_time);\n\t\t\t\tkfree(tsync_node);\n\t\t\t} else {\n\t\t\t\tkfree(tsync_node);\n\t\t\t}\n\t\t} while (true);\n\n\t\tmhi_recycle_ev_ring_element(mhi_cntrl, ev_ring);\n\t\tlocal_rp = ev_ring->rp;\n\t\tdev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);\n\t\tcount++;\n\t}\n\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tif (likely(MHI_DB_ACCESS_VALID(mhi_cntrl->pm_state)))\n\t\tmhi_ring_er_db(mhi_event);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\tMHI_VERB(\"exit er_index:%u\\n\", mhi_event->er_index);\n\n\treturn count;\n}\n\nvoid mhi_ev_task(unsigned long data)\n{\n\tstruct mhi_event *mhi_event = (struct mhi_event *)data;\n\tstruct mhi_controller *mhi_cntrl = mhi_event->mhi_cntrl;\n\n\tMHI_VERB(\"Enter for ev_index:%d\\n\", mhi_event->er_index);\n\n\tmhi_cntrl->runtime_mark_last_busy(mhi_cntrl, mhi_cntrl->priv_data);\n\t/* process all pending events */\n\tspin_lock_bh(&mhi_event->lock);\n\tmhi_event->process_event(mhi_cntrl, mhi_event, U32_MAX);\n\tspin_unlock_bh(&mhi_event->lock);\n}\n\nvoid mhi_ctrl_ev_task(unsigned long data)\n{\n\tstruct mhi_event *mhi_event = (struct mhi_event *)data;\n\tstruct mhi_controller *mhi_cntrl = mhi_event->mhi_cntrl;\n\tenum mhi_dev_state state;\n\tenum MHI_PM_STATE pm_state = 0;\n\tint ret;\n\n\tMHI_VERB(\"Enter for ev_index:%d\\n\", mhi_event->er_index);\n\n\t/*\n\t * we can check pm_state w/o a lock here because there is no way\n\t * pm_state can change from reg access valid to no access while this\n\t * therad being executed.\n\t */\n\tif (!MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state))\n\t\treturn;\n\n\tmhi_cntrl->runtime_mark_last_busy(mhi_cntrl, mhi_cntrl->priv_data);\n\t/* process ctrl events events */\n\tret = mhi_event->process_event(mhi_cntrl, mhi_event, U32_MAX);\n\n\t/*\n\t * we received a MSI but no events to process maybe device went to\n\t * SYS_ERR state, check the state\n\t */\n\tif (!ret) {\n\t\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\t\tstate = mhi_get_mhi_state(mhi_cntrl);\n\t\tif (state == MHI_STATE_SYS_ERR) {\n\t\t\tMHI_ERR(\"MHI system error detected\\n\");\n\t\t\tpm_state = mhi_tryset_pm_state(mhi_cntrl,\n\t\t\t\t\t\t       MHI_PM_SYS_ERR_DETECT);\n\t\t}\n\t\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\t\tif (pm_state == MHI_PM_SYS_ERR_DETECT)\n\t\t\tschedule_work(&mhi_cntrl->syserr_worker);\n\t}\n}\n\nirqreturn_t mhi_msi_handlr(int irq_number, void *dev)\n{\n\tstruct mhi_event *mhi_event = dev;\n\tstruct mhi_controller *mhi_cntrl = mhi_event->mhi_cntrl;\n\tstruct mhi_event_ctxt *er_ctxt =\n\t\t&mhi_cntrl->mhi_ctxt->er_ctxt[mhi_event->er_index];\n\tstruct mhi_ring *ev_ring = &mhi_event->ring;\n\tvoid *dev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);\n\n\t/* confirm ER has pending events to process before scheduling work */\n\tif (ev_ring->rp == dev_rp)\n\t\treturn IRQ_HANDLED;\n\n\t/* client managed event ring, notify pending data */\n\tif (mhi_event->cl_manage) {\n\t\tstruct mhi_chan *mhi_chan = mhi_event->mhi_chan;\n\t\tstruct mhi_device *mhi_dev = mhi_chan->mhi_dev;\n\n\t\tif (mhi_dev)\n\t\t\tmhi_dev->status_cb(mhi_dev, MHI_CB_PENDING_DATA);\n\t} else\n\t\ttasklet_schedule(&mhi_event->task);\n\n\treturn IRQ_HANDLED;\n}\n\n/* this is the threaded fn */\nirqreturn_t mhi_intvec_threaded_handlr(int irq_number, void *dev)\n{\n\tstruct mhi_controller *mhi_cntrl = dev;\n\tenum mhi_dev_state state = MHI_STATE_MAX;\n\tenum MHI_PM_STATE pm_state = 0;\n\tenum mhi_ee ee = MHI_EE_MAX;\n\tunsigned long flags;\n\n\tMHI_VERB(\"Enter\\n\");\n\n\twrite_lock_irqsave(&mhi_cntrl->pm_lock, flags);\n\tif (MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state)) {\n\t\tstate = mhi_get_mhi_state(mhi_cntrl);\n\t\tee = mhi_get_exec_env(mhi_cntrl);\n\t \tif (mhi_cntrl->msi_allocated >= 5 ||(mhi_cntrl->msi_allocated == 1 && (mhi_cntrl->dev_state != state || mhi_cntrl->ee != ee)))\n\t\t\tMHI_LOG(\"device ee:%s dev_state:%s, pm_state:%s\\n\", TO_MHI_EXEC_STR(ee),\n\t\t\t\tTO_MHI_STATE_STR(state), to_mhi_pm_state_str(mhi_cntrl->pm_state));\n\t}\n\n\tif (state == MHI_STATE_SYS_ERR) {\n\t\tMHI_ERR(\"MHI system error detected\\n\");\n\tif (mhi_cntrl->pm_state != MHI_PM_SYS_ERR_DETECT)\n\t\tpm_state = mhi_tryset_pm_state(mhi_cntrl,\n\t\t\t\t\t       MHI_PM_SYS_ERR_DETECT);\n\t}\n\twrite_unlock_irqrestore(&mhi_cntrl->pm_lock, flags);\n\tif (pm_state == MHI_PM_SYS_ERR_DETECT) {\n\t\twake_up_all(&mhi_cntrl->state_event);\n\n\t\tif (mhi_cntrl->ee != ee) {\n\t\t\tMHI_LOG(\"device ee:%s -> %s\\n\", TO_MHI_EXEC_STR(mhi_cntrl->ee), TO_MHI_EXEC_STR(ee));\n\t\t\tschedule_work(&mhi_cntrl->syserr_worker);\n\t\t}\n\t\t/* for fatal errors, we let controller decide next step */\n\t\telse if (MHI_IN_PBL(ee))\n\t\t\tmhi_cntrl->status_cb(mhi_cntrl, mhi_cntrl->priv_data,\n\t\t\t\t\t     MHI_CB_FATAL_ERROR);\n\t\telse\n\t\t\tschedule_work(&mhi_cntrl->syserr_worker);\n\t}\n\tif (mhi_cntrl->msi_allocated >= 5||(mhi_cntrl->msi_allocated == 1 && (mhi_cntrl->dev_state != state || mhi_cntrl->ee != ee)))\n\t\tMHI_LOG(\"device ee:%s dev_state:%s, %s\\n\", TO_MHI_EXEC_STR(ee),\n\t\t\t\tTO_MHI_STATE_STR(state), TO_MHI_EXEC_STR(mhi_cntrl->ee));\n\n\tif (pm_state == MHI_PM_POR) {\n\t\twake_up_all(&mhi_cntrl->state_event);\n\t}\n\n\tMHI_VERB(\"Exit\\n\");\n\n\treturn IRQ_HANDLED;\n}\n\nirqreturn_t mhi_intvec_handlr(int irq_number, void *dev)\n{\n\n\tstruct mhi_controller *mhi_cntrl = dev;\n\n\t/* wake up any events waiting for state change */\n\tMHI_VERB(\"Enter\\n\");\n\twake_up_all(&mhi_cntrl->state_event);\n\tMHI_VERB(\"Exit\\n\");\n\n\treturn IRQ_WAKE_THREAD;\n}\n\nirqreturn_t mhi_one_msi_handlr(int irq_number, void *dev)\n{\n\tstruct mhi_controller *mhi_cntrl = dev;\n\tstruct mhi_event_ctxt *er_ctxt = mhi_cntrl->mhi_ctxt->er_ctxt;\n\tstruct mhi_event *mhi_event = mhi_cntrl->mhi_event;\n\tu32 i;\n\tu32 handle = 0;\n\n\tfor (i = 0; i < NUM_MHI_EVT_RINGS; i++, er_ctxt++, mhi_event++) {\n\t\tstruct mhi_ring *ev_ring = &mhi_event->ring;\n\t\tvoid *dev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);\n\t\tif (ev_ring->rp != dev_rp) {\n\t\t\thandle++;\n\t\t\tmhi_msi_handlr(irq_number, mhi_event);\n\t\t}\n\t}\n\n\t if (handle ==0) {\n\t\tmhi_intvec_threaded_handlr(irq_number, dev);\n\t}\n\n\treturn IRQ_HANDLED;\n}\n\nint mhi_send_cmd(struct mhi_controller *mhi_cntrl,\n\t\t struct mhi_chan *mhi_chan,\n\t\t enum MHI_CMD cmd)\n{\n\tstruct mhi_tre *cmd_tre = NULL;\n\tstruct mhi_cmd *mhi_cmd = &mhi_cntrl->mhi_cmd[PRIMARY_CMD_RING];\n\tstruct mhi_ring *ring = &mhi_cmd->ring;\n\tint chan = 0;\n\n\tMHI_VERB(\"Entered, MHI pm_state:%s dev_state:%s ee:%s\\n\",\n\t\t to_mhi_pm_state_str(mhi_cntrl->pm_state),\n\t\t TO_MHI_STATE_STR(mhi_cntrl->dev_state),\n\t\t TO_MHI_EXEC_STR(mhi_cntrl->ee));\n\n\tif (mhi_chan)\n\t\tchan = mhi_chan->chan;\n\n\tspin_lock_bh(&mhi_cmd->lock);\n\tif (!get_nr_avail_ring_elements(mhi_cntrl, ring)) {\n\t\tspin_unlock_bh(&mhi_cmd->lock);\n\t\treturn -ENOMEM;\n\t}\n\n\t/* prepare the cmd tre */\n\tcmd_tre = ring->wp;\n\tswitch (cmd) {\n\tcase MHI_CMD_RESET_CHAN:\n\t\tcmd_tre->ptr = MHI_TRE_CMD_RESET_PTR;\n\t\tcmd_tre->dword[0] = MHI_TRE_CMD_RESET_DWORD0;\n\t\tcmd_tre->dword[1] = MHI_TRE_CMD_RESET_DWORD1(chan);\n\t\tbreak;\n\tcase MHI_CMD_START_CHAN:\n\t\tcmd_tre->ptr = MHI_TRE_CMD_START_PTR;\n\t\tcmd_tre->dword[0] = MHI_TRE_CMD_START_DWORD0;\n\t\tcmd_tre->dword[1] = MHI_TRE_CMD_START_DWORD1(chan);\n\t\tbreak;\n\tcase MHI_CMD_TIMSYNC_CFG:\n\t\tcmd_tre->ptr = MHI_TRE_CMD_TSYNC_CFG_PTR;\n\t\tcmd_tre->dword[0] = MHI_TRE_CMD_TSYNC_CFG_DWORD0;\n\t\tcmd_tre->dword[1] = MHI_TRE_CMD_TSYNC_CFG_DWORD1\n\t\t\t(mhi_cntrl->mhi_tsync->er_index);\n\t\tbreak;\n\t}\n\n#ifdef ENABLE_MHI_MON\n\tif (mhi_cntrl->nreaders) {\n\t\tmon_bus_submit(mhi_cntrl, 128, mhi_to_physical(ring, cmd_tre), cmd_tre, NULL, 0);\n\t}\n#endif\t\n\tMHI_VERB(\"WP:0x%llx TRE: 0x%llx 0x%08x 0x%08x\\n\",\n\t\t (u64)mhi_to_physical(ring, cmd_tre), cmd_tre->ptr,\n\t\t cmd_tre->dword[0], cmd_tre->dword[1]);\n\n\t/* queue to hardware */\n\tmhi_add_ring_element(mhi_cntrl, ring);\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tif (likely(MHI_DB_ACCESS_VALID(mhi_cntrl->pm_state)))\n\t\tmhi_ring_cmd_db(mhi_cntrl, mhi_cmd);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\tspin_unlock_bh(&mhi_cmd->lock);\n\n\treturn 0;\n}\n\nstatic int __mhi_prepare_channel(struct mhi_controller *mhi_cntrl,\n\t\t\t\t struct mhi_chan *mhi_chan)\n{\n\tint ret = 0;\n\n\tMHI_LOG(\"Entered: preparing channel:%d\\n\", mhi_chan->chan);\n\n\tif (!(BIT(mhi_cntrl->ee) & mhi_chan->ee_mask)) {\n\t\tMHI_ERR(\"Current EE:%s Required EE Mask:0x%x for chan:%s\\n\",\n\t\t\tTO_MHI_EXEC_STR(mhi_cntrl->ee), mhi_chan->ee_mask,\n\t\t\tmhi_chan->name);\n\t\treturn -ENOTCONN;\n\t}\n\n\tmutex_lock(&mhi_chan->mutex);\n\n\t/* if channel is not disable state do not allow to start */\n\tif (mhi_chan->ch_state != MHI_CH_STATE_DISABLED) {\n\t\tret = -EIO;\n\t\tMHI_LOG(\"channel:%d is not in disabled state, ch_state%d\\n\",\n\t\t\tmhi_chan->chan, mhi_chan->ch_state);\n\t\tgoto error_init_chan;\n\t}\n\n\t/* client manages channel context for offload channels */\n\tif (!mhi_chan->offload_ch) {\n\t\tret = mhi_init_chan_ctxt(mhi_cntrl, mhi_chan);\n\t\tif (ret) {\n\t\t\tMHI_ERR(\"Error with init chan\\n\");\n\t\t\tgoto error_init_chan;\n\t\t}\n\t}\n\n\treinit_completion(&mhi_chan->completion);\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tif (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {\n\t\tMHI_ERR(\"MHI host is not in active state\\n\");\n\t\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\t\tret = -EIO;\n\t\tgoto error_pm_state;\n\t}\n\n\tmhi_cntrl->wake_get(mhi_cntrl, false);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->runtime_get(mhi_cntrl, mhi_cntrl->priv_data);\n\n\tret = mhi_send_cmd(mhi_cntrl, mhi_chan, MHI_CMD_START_CHAN);\n\tif (ret) {\n\t\tMHI_ERR(\"Failed to send start chan cmd\\n\");\n\t\tgoto error_send_cmd;\n\t}\n\n\tret = wait_for_completion_timeout(&mhi_chan->completion,\n\t\t\t\tmsecs_to_jiffies(mhi_cntrl->timeout_ms));\n\tif (!ret || mhi_chan->ccs != MHI_EV_CC_SUCCESS) {\n\t\tMHI_ERR(\"Failed to receive cmd completion for chan:%d\\n\",\n\t\t\tmhi_chan->chan);\n\t\tret = -EIO;\n\t\tgoto error_send_cmd;\n\t}\n\n\tmhi_cntrl->runtime_put(mhi_cntrl, mhi_cntrl->priv_data);\n\n\twrite_lock_irq(&mhi_chan->lock);\n\tmhi_chan->ch_state = MHI_CH_STATE_ENABLED;\n\twrite_unlock_irq(&mhi_chan->lock);\n\n\t/* pre allocate buffer for xfer ring */\n\tif (mhi_chan->pre_alloc) {\n\t\tint nr_el = get_nr_avail_ring_elements(mhi_cntrl,\n\t\t\t\t\t\t       &mhi_chan->tre_ring);\n\t\tsize_t len = mhi_cntrl->buffer_len;\n\n\t\twhile (nr_el--) {\n\t\t\tvoid *buf;\n\n\t\t\tbuf = kmalloc(len, GFP_KERNEL);\n\t\t\tif (!buf) {\n\t\t\t\tret = -ENOMEM;\n\t\t\t\tgoto error_pre_alloc;\n\t\t\t}\n\n\t\t\t/* prepare transfer descriptors */\n\t\t\tret = mhi_chan->gen_tre(mhi_cntrl, mhi_chan, buf, buf,\n\t\t\t\t\t\tlen, MHI_EOT);\n\t\t\tif (ret) {\n\t\t\t\tMHI_ERR(\"Chan:%d error prepare buffer\\n\",\n\t\t\t\t\tmhi_chan->chan);\n\t\t\t\tkfree(buf);\n\t\t\t\tgoto error_pre_alloc;\n\t\t\t}\n\t\t}\n\n\t\tread_lock_bh(&mhi_cntrl->pm_lock);\n\t\tif (MHI_DB_ACCESS_VALID(mhi_cntrl->pm_state)) {\n\t\t\tread_lock_irq(&mhi_chan->lock);\n\t\t\tmhi_ring_chan_db(mhi_cntrl, mhi_chan);\n\t\t\tread_unlock_irq(&mhi_chan->lock);\n\t\t}\n\t\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\t}\n\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->wake_put(mhi_cntrl, false);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\tmutex_unlock(&mhi_chan->mutex);\n\n\tMHI_LOG(\"Chan:%d successfully moved to start state\\n\", mhi_chan->chan);\n\n\treturn 0;\n\nerror_send_cmd:\n\tmhi_cntrl->runtime_put(mhi_cntrl, mhi_cntrl->priv_data);\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->wake_put(mhi_cntrl, false);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\nerror_pm_state:\n\tif (!mhi_chan->offload_ch)\n\t\tmhi_deinit_chan_ctxt(mhi_cntrl, mhi_chan);\n\nerror_init_chan:\n\tmutex_unlock(&mhi_chan->mutex);\n\n\treturn ret;\n\nerror_pre_alloc:\n\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->wake_put(mhi_cntrl, false);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\tmutex_unlock(&mhi_chan->mutex);\n\t__mhi_unprepare_channel(mhi_cntrl, mhi_chan);\n\n\treturn ret;\n}\n\nstatic void mhi_mark_stale_events(struct mhi_controller *mhi_cntrl,\n\t\t\t\t  struct mhi_event *mhi_event,\n\t\t\t\t  struct mhi_event_ctxt *er_ctxt,\n\t\t\t\t  int chan)\n{\n\tstruct mhi_tre *dev_rp, *local_rp;\n\tstruct mhi_ring *ev_ring;\n\tunsigned long flags;\n\n\tMHI_LOG(\"Marking all events for chan:%d as stale\\n\", chan);\n\n\tev_ring = &mhi_event->ring;\n\n\t/* mark all stale events related to channel as STALE event */\n\tspin_lock_irqsave(&mhi_event->lock, flags);\n\tdev_rp = mhi_to_virtual(ev_ring, er_ctxt->rp);\n\n\tlocal_rp = ev_ring->rp;\n\twhile (dev_rp != local_rp) {\n\t\tif (MHI_TRE_GET_EV_TYPE(local_rp) ==\n\t\t    MHI_PKT_TYPE_TX_EVENT &&\n\t\t    chan == MHI_TRE_GET_EV_CHID(local_rp))\n\t\t\tlocal_rp->dword[1] = MHI_TRE_EV_DWORD1(chan,\n\t\t\t\t\tMHI_PKT_TYPE_STALE_EVENT);\n\t\tlocal_rp++;\n\t\tif (local_rp == (ev_ring->base + ev_ring->len))\n\t\t\tlocal_rp = ev_ring->base;\n\t}\n\n\n\tMHI_LOG(\"Finished marking events as stale events\\n\");\n\tspin_unlock_irqrestore(&mhi_event->lock, flags);\n}\n\nstatic void mhi_reset_data_chan(struct mhi_controller *mhi_cntrl,\n\t\t\t\tstruct mhi_chan *mhi_chan)\n{\n\tstruct mhi_ring *buf_ring, *tre_ring;\n\tstruct mhi_result result;\n\n\t/* reset any pending buffers */\n\tbuf_ring = &mhi_chan->buf_ring;\n\ttre_ring = &mhi_chan->tre_ring;\n\tresult.transaction_status = -ENOTCONN;\n\tresult.bytes_xferd = 0;\n\twhile (tre_ring->rp != tre_ring->wp) {\n\t\tstruct mhi_buf_info *buf_info = buf_ring->rp;\n\n\t\tif (mhi_chan->dir == DMA_TO_DEVICE) {\n\t\t\tif (atomic_dec_return(&mhi_cntrl->pending_pkts) == 0) \n\t\t\t\tmhi_cntrl->runtime_put(mhi_cntrl, mhi_cntrl->priv_data);\n\t\t}\n\n\t\tif (mhi_chan->dir == DMA_TO_DEVICE)\n\t\t\tmhi_cntrl->wake_put(mhi_cntrl, false);\n\t\tif (!buf_info->pre_mapped)\n\t\t\tmhi_cntrl->unmap_single(mhi_cntrl, buf_info);\n\t\tmhi_del_ring_element(mhi_cntrl, buf_ring);\n\t\tmhi_del_ring_element(mhi_cntrl, tre_ring);\n\n\t\tif (mhi_chan->pre_alloc) {\n\t\t\tkfree(buf_info->cb_buf);\n\t\t} else {\n\t\t\tresult.buf_addr = buf_info->cb_buf;\n\t\t\tmhi_chan->xfer_cb(mhi_chan->mhi_dev, &result);\n\t\t}\n\t}\n}\n\nstatic void mhi_reset_rsc_chan(struct mhi_controller *mhi_cntrl,\n\t\t\t       struct mhi_chan *mhi_chan)\n{\n\tstruct mhi_ring *buf_ring, *tre_ring;\n\tstruct mhi_result result;\n\tstruct mhi_buf_info *buf_info;\n\n\t/* reset any pending buffers */\n\tbuf_ring = &mhi_chan->buf_ring;\n\ttre_ring = &mhi_chan->tre_ring;\n\tresult.transaction_status = -ENOTCONN;\n\tresult.bytes_xferd = 0;\n\n\tbuf_info = buf_ring->base;\n\tfor (; (void *)buf_info < buf_ring->base + buf_ring->len; buf_info++) {\n\t\tif (!buf_info->used)\n\t\t\tcontinue;\n\n\t\tresult.buf_addr = buf_info->cb_buf;\n\t\tmhi_chan->xfer_cb(mhi_chan->mhi_dev, &result);\n\t\tbuf_info->used = false;\n\t}\n}\n\nvoid mhi_reset_chan(struct mhi_controller *mhi_cntrl, struct mhi_chan *mhi_chan)\n{\n\n\tstruct mhi_event *mhi_event;\n\tstruct mhi_event_ctxt *er_ctxt;\n\tint chan = mhi_chan->chan;\n\n\t/* nothing to reset, client don't queue buffers */\n\tif (mhi_chan->offload_ch)\n\t\treturn;\n\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tmhi_event = &mhi_cntrl->mhi_event[mhi_chan->er_index];\n\ter_ctxt = &mhi_cntrl->mhi_ctxt->er_ctxt[mhi_chan->er_index];\n\n\tmhi_mark_stale_events(mhi_cntrl, mhi_event, er_ctxt, chan);\n\n\tif (mhi_chan->xfer_type == MHI_XFER_RSC_DMA)\n\t\tmhi_reset_rsc_chan(mhi_cntrl, mhi_chan);\n\telse\n\t\tmhi_reset_data_chan(mhi_cntrl, mhi_chan);\n\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\tMHI_LOG(\"Reset complete.\\n\");\n}\n\nstatic void __mhi_unprepare_channel(struct mhi_controller *mhi_cntrl,\n\t\t\t\t    struct mhi_chan *mhi_chan)\n{\n\tint ret;\n\n\tMHI_LOG(\"Entered: unprepare channel:%d\\n\", mhi_chan->chan);\n\n\t/* no more processing events for this channel */\n\tmutex_lock(&mhi_chan->mutex);\n\twrite_lock_irq(&mhi_chan->lock);\n\tif (mhi_chan->ch_state != MHI_CH_STATE_ENABLED) {\n\t\tMHI_LOG(\"chan:%d is already disabled\\n\", mhi_chan->chan);\n\t\twrite_unlock_irq(&mhi_chan->lock);\n\t\tmutex_unlock(&mhi_chan->mutex);\n\t\treturn;\n\t}\n\n\tmhi_chan->ch_state = MHI_CH_STATE_DISABLED;\n\twrite_unlock_irq(&mhi_chan->lock);\n\n\treinit_completion(&mhi_chan->completion);\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tif (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {\n\t\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\t\tgoto error_invalid_state;\n\t}\n\n\tmhi_cntrl->wake_get(mhi_cntrl, false);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\tmhi_cntrl->runtime_get(mhi_cntrl, mhi_cntrl->priv_data);\n\tret = mhi_send_cmd(mhi_cntrl, mhi_chan, MHI_CMD_RESET_CHAN);\n\tif (ret) {\n\t\tMHI_ERR(\"Failed to send reset chan cmd\\n\");\n\t\tgoto error_completion;\n\t}\n\n\t/* even if it fails we will still reset */\n\tret = wait_for_completion_timeout(&mhi_chan->completion,\n\t\t\t\tmsecs_to_jiffies(mhi_cntrl->timeout_ms));\n\tif (!ret || mhi_chan->ccs != MHI_EV_CC_SUCCESS)\n\t\tMHI_ERR(\"Failed to receive cmd completion, still resetting\\n\");\n\nerror_completion:\n\tmhi_cntrl->runtime_put(mhi_cntrl, mhi_cntrl->priv_data);\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->wake_put(mhi_cntrl, false);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\nerror_invalid_state:\n\tif (!mhi_chan->offload_ch) {\n\t\tmhi_reset_chan(mhi_cntrl, mhi_chan);\n\t\tmhi_deinit_chan_ctxt(mhi_cntrl, mhi_chan);\n\t}\n\tMHI_LOG(\"chan:%d successfully resetted\\n\", mhi_chan->chan);\n\tmutex_unlock(&mhi_chan->mutex);\n}\n\nint mhi_debugfs_mhi_states_show(struct seq_file *m, void *d)\n{\n\tstruct mhi_controller *mhi_cntrl = m->private;\n\tint reg = 0;\n\tint ret;\n\tu32 val[4];\n\n\tseq_printf(m,\n\t\t   \"pm_state:%s dev_state:%s EE:%s M0:%u M2:%u M3:%u wake:%d dev_wake:%u alloc_size:%u\\n\",\n\t\t   to_mhi_pm_state_str(mhi_cntrl->pm_state),\n\t\t   TO_MHI_STATE_STR(mhi_cntrl->dev_state),\n\t\t   TO_MHI_EXEC_STR(mhi_cntrl->ee),\n\t\t   mhi_cntrl->M0, mhi_cntrl->M2, mhi_cntrl->M3,\n\t\t   mhi_cntrl->wake_set,\n\t\t   atomic_read(&mhi_cntrl->dev_wake),\n\t\t   atomic_read(&mhi_cntrl->alloc_size));\n\n\tseq_printf(m,\n\t\t   \"mhi_state:%s exec_env:%s\\n\",\n\t\t   TO_MHI_STATE_STR(mhi_get_mhi_state(mhi_cntrl)), TO_MHI_EXEC_STR(mhi_get_exec_env(mhi_cntrl)));\n\n\tseq_printf(m, \"dump mhi reg addr:%p\\n\", mhi_cntrl->regs);\n\tfor (reg = 0; reg < 0x100; reg+=16) {\n\t\tval[0] = val[1] = val[2] = val[3] = 0xFFFFFFFF;\n\t\tret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, reg+0, &val[0]);\n\t\tret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, reg+4, &val[1]);\n\t\tret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, reg+8, &val[2]);\n\t\tret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, reg+12, &val[3]);\n\t\tseq_printf(m, \"%02x: %08x %08x %08x %08x\\n\", reg, val[0], val[1], val[2], val[3]);\n\t}\n\n\tseq_printf(m, \"dump bhi reg addr:%p\\n\", mhi_cntrl->bhi);\n\tfor (reg = 0; reg < 0x100; reg+=16) {\n\t\tval[0] = val[1] = val[2] = val[3] = 0xFFFFFFFF;\n\t\tret = mhi_read_reg(mhi_cntrl, mhi_cntrl->bhi, reg+0, &val[0]);\n\t\tret = mhi_read_reg(mhi_cntrl, mhi_cntrl->bhi, reg+4, &val[1]);\n\t\tret = mhi_read_reg(mhi_cntrl, mhi_cntrl->bhi, reg+8, &val[2]);\n\t\tret = mhi_read_reg(mhi_cntrl, mhi_cntrl->bhi, reg+12, &val[3]);\n\t\tseq_printf(m, \"%02x: %08x %08x %08x %08x\\n\", reg, val[0], val[1], val[2], val[3]);\n\t}\n\n\treturn 0;\n}\n\nint mhi_debugfs_mhi_event_show(struct seq_file *m, void *d)\n{\n\tstruct mhi_controller *mhi_cntrl = m->private;\n\tstruct mhi_event *mhi_event;\n\tstruct mhi_event_ctxt *er_ctxt;\n\n\tint i;\n\n\ter_ctxt = mhi_cntrl->mhi_ctxt->er_ctxt;\n\tmhi_event = mhi_cntrl->mhi_event;\n\tfor (i = 0; i < mhi_cntrl->total_ev_rings; i++, er_ctxt++,\n\t\t     mhi_event++) {\n\t\tstruct mhi_ring *ring = &mhi_event->ring;\n\n\t\tif (mhi_event->offload_ev) {\n\t\t\tseq_printf(m, \"Index:%d offload event ring\\n\", i);\n\t\t} else {\n\t\t\tseq_printf(m,\n\t\t\t\t   \"Index:%d modc:%d modt:%d base:0x%0llx len:0x%llx\",\n\t\t\t\t   i, er_ctxt->intmodc, er_ctxt->intmodt,\n\t\t\t\t   er_ctxt->rbase, er_ctxt->rlen);\n\t\t\tseq_printf(m,\n\t\t\t\t   \" rp:0x%llx wp:0x%llx local_rp:0x%llx local_wp:0x%llx db:0x%llx\\n\",\n\t\t\t\t   er_ctxt->rp, er_ctxt->wp,\n\t\t\t\t   (unsigned long long)mhi_to_physical(ring, ring->rp),\n\t\t\t\t   (unsigned long long)mhi_to_physical(ring, ring->wp),\n\t\t\t\t   (unsigned long long)mhi_event->db_cfg.db_val);\n\t\t\tseq_printf(m, \"used:%u\\n\", mhi_event->used_elements);\n\n#ifdef DEBUG_CHAN100_DB\n\t\t\tif (mhi_event->mhi_chan && mhi_event->chan == 100) {\n\t\t\t\tstruct mhi_tre *tre = (struct mhi_tre *)ring->base;\n\t\t\t\tsize_t j;\n\n\t\t\t\tfor (j = 0; j < ring->elements; j++, tre++) {\n\t\t\t\t\tseq_printf(m,\n\t\t\t\t\t\t\"%08x: %llx, %08x, %08x\\n\",\n\t\t\t\t\t\t(unsigned int)(j*sizeof(struct mhi_tre)),\n\t\t\t\t\ttre->ptr, tre->dword[0], tre->dword[1]);\n\t\t\t\t}\n\t\t\t}\n#endif\n\t\t}\n\t}\n\n\treturn 0;\n}\n\nint mhi_debugfs_mhi_chan_show(struct seq_file *m, void *d)\n{\n\tstruct mhi_controller *mhi_cntrl = m->private;\n\tstruct mhi_chan *mhi_chan;\n\tstruct mhi_chan_ctxt *chan_ctxt;\n\tint i;\n\n\tmhi_chan = mhi_cntrl->mhi_chan;\n\tchan_ctxt = mhi_cntrl->mhi_ctxt->chan_ctxt;\n\tfor (i = 0; i < mhi_cntrl->max_chan; i++, chan_ctxt++, mhi_chan++) {\n\t\tstruct mhi_ring *ring = &mhi_chan->tre_ring;\n\n\t\tif (mhi_chan->ch_state == MHI_CH_STATE_DISABLED)\n\t\t\tcontinue;\n\n\t\tif (mhi_chan->offload_ch) {\n\t\t\tseq_printf(m, \"%s(%u) offload channel\\n\",\n\t\t\t\t   mhi_chan->name, mhi_chan->chan);\n\t\t} else if (mhi_chan->mhi_dev) {\n\t\t\tseq_printf(m,\n\t\t\t\t   \"%s(%u) state:0x%x brstmode:0x%x pllcfg:0x%x type:0x%x erindex:%u\",\n\t\t\t\t   mhi_chan->name, mhi_chan->chan,\n\t\t\t\t   chan_ctxt->chstate, chan_ctxt->brstmode,\n\t\t\t\t   chan_ctxt->pollcfg, chan_ctxt->chtype,\n\t\t\t\t   chan_ctxt->erindex);\n\t\t\tseq_printf(m,\n\t\t\t\t   \" base:0x%llx len:0x%llx rp:%llx wp:0x%llx local_rp:0x%llx local_wp:0x%llx db:0x%llx\\n\",\n\t\t\t\t   chan_ctxt->rbase, chan_ctxt->rlen,\n\t\t\t\t   chan_ctxt->rp, chan_ctxt->wp,\n\t\t\t\t   (unsigned long long)mhi_to_physical(ring, ring->rp),\n\t\t\t\t   (unsigned long long)mhi_to_physical(ring, ring->wp),\n\t\t\t\t   (unsigned long long)mhi_chan->db_cfg.db_val);\n\t\t\tseq_printf(m, \"used:%u, EOB:%u, EOT:%u, OOB:%u, DB_MODE:%u\\n\", mhi_chan->used_elements,\n\t\t\t\tmhi_chan->used_events[MHI_EV_CC_EOB], mhi_chan->used_events[MHI_EV_CC_EOT],\n\t\t\t\tmhi_chan->used_events[MHI_EV_CC_OOB],mhi_chan->used_events[MHI_EV_CC_DB_MODE]);\n\n#ifdef DEBUG_CHAN100_DB\n\t\t\tif (mhi_chan->chan == 100) {\n\t\t\t\tunsigned int n = 0;\n\t\t\t\tseq_printf(m, \"chan100_seq = %04x\\n\", atomic_read(&chan100_seq)%CHAN100_SIZE);\n\t\t\t\tfor (n = 0; n < CHAN100_SIZE; n++) {\n\t\t\t\t\tseq_printf(m, \"%04x: %08x\\n\", n, chan100_t[n]);\n\t\t\t\t}\n\t\t\t}\n#endif\n\n#if 0\n\t\t\tif (ring->base && /*(i&1) &&*/ (i < MHI_CLIENT_IP_HW_0_OUT)) {\n\t\t\t\tstruct mhi_tre *tre = (struct mhi_tre *)ring->base;\n\t\t\t\tsize_t e;\n\n\t\t\t\tfor (e = 0; e < ring->elements; e++, tre++) {\n\t\t\t\t\tseq_printf(m, \"[%03d] %llx, %08x, %08x\\n\", i, tre->ptr, tre->dword[0], tre->dword[1]);\n\t\t\t\t}\n\t\t\t}\n#endif\n\t\t}\n\t}\n\n\treturn 0;\n}\n\n/* move channel to start state */\nint mhi_prepare_for_transfer(struct mhi_device *mhi_dev)\n{\n\tint ret, dir;\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tstruct mhi_chan *mhi_chan;\n\n\tfor (dir = 0; dir < 2; dir++) {\n\t\tmhi_chan = dir ? mhi_dev->dl_chan : mhi_dev->ul_chan;\n\n\t\tif (!mhi_chan)\n\t\t\tcontinue;\n\n\t\tret = __mhi_prepare_channel(mhi_cntrl, mhi_chan);\n\t\tif (ret) {\n\t\t\tMHI_ERR(\"Error moving chan %s,%d to START state\\n\",\n\t\t\t\tmhi_chan->name, mhi_chan->chan);\n\t\t\tgoto error_open_chan;\n\t\t}\n\n\t\tif (mhi_dev->dl_chan == mhi_dev->ul_chan) {\n\t\t\tbreak;\n\t\t}\n\t}\n\n\treturn 0;\n\nerror_open_chan:\n\tfor (--dir; dir >= 0; dir--) {\n\t\tmhi_chan = dir ? mhi_dev->dl_chan : mhi_dev->ul_chan;\n\n\t\tif (!mhi_chan)\n\t\t\tcontinue;\n\n\t\t__mhi_unprepare_channel(mhi_cntrl, mhi_chan);\n\t}\n\n\treturn ret;\n}\nEXPORT_SYMBOL(mhi_prepare_for_transfer);\n\nvoid mhi_unprepare_from_transfer(struct mhi_device *mhi_dev)\n{\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tstruct mhi_chan *mhi_chan;\n\tint dir;\n\n\tfor (dir = 0; dir < 2; dir++) {\n\t\tmhi_chan = dir ? mhi_dev->ul_chan : mhi_dev->dl_chan;\n\n\t\tif (!mhi_chan)\n\t\t\tcontinue;\n\n\t\t__mhi_unprepare_channel(mhi_cntrl, mhi_chan);\n\n\t\tif (mhi_dev->dl_chan == mhi_dev->ul_chan) {\n\t\t\tbreak;\n\t\t}\n\t}\n}\nEXPORT_SYMBOL(mhi_unprepare_from_transfer);\n\nint mhi_get_no_free_descriptors(struct mhi_device *mhi_dev,\n\t\t\t\tenum dma_data_direction dir)\n{\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tstruct mhi_chan *mhi_chan = (dir == DMA_TO_DEVICE) ?\n\t\tmhi_dev->ul_chan : mhi_dev->dl_chan;\n\tstruct mhi_ring *tre_ring = &mhi_chan->tre_ring;\n\n\tif (mhi_chan->offload_ch)\n\t\treturn 0;\n\t\n\treturn get_nr_avail_ring_elements(mhi_cntrl, tre_ring);\n}\nEXPORT_SYMBOL(mhi_get_no_free_descriptors);\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 5,3,0 ))\nstatic int __mhi_bdf_to_controller(struct device *dev, void *tmp)\n{\n\tstruct mhi_device *mhi_dev = to_mhi_device(dev);\n\tstruct mhi_device *match = tmp;\n\n\t/* return any none-zero value if match */\n\tif (mhi_dev->dev_type == MHI_CONTROLLER_TYPE &&\n\t    mhi_dev->domain == match->domain && mhi_dev->bus == match->bus &&\n\t    mhi_dev->slot == match->slot && mhi_dev->dev_id == match->dev_id)\n\t\treturn 1;\n\n\treturn 0;\n}\n#else\nstatic int __mhi_bdf_to_controller(struct device *dev, const void *tmp)\n{\n\tstruct mhi_device *mhi_dev = to_mhi_device(dev);\n\tconst struct mhi_device *match = tmp;\n\n\t/* return any none-zero value if match */\n\tif (mhi_dev->dev_type == MHI_CONTROLLER_TYPE &&\n\t    mhi_dev->domain == match->domain && mhi_dev->bus == match->bus &&\n\t    mhi_dev->slot == match->slot && mhi_dev->dev_id == match->dev_id)\n\t\treturn 1;\n\n\treturn 0;\n}\n#endif\n\nstruct mhi_controller *mhi_bdf_to_controller(u32 domain,\n\t\t\t\t\t     u32 bus,\n\t\t\t\t\t     u32 slot,\n\t\t\t\t\t     u32 dev_id)\n{\n\tstruct mhi_device tmp, *mhi_dev;\n\tstruct device *dev;\n\n\ttmp.domain = domain;\n\ttmp.bus = bus;\n\ttmp.slot = slot;\n\ttmp.dev_id = dev_id;\n\n\tdev = bus_find_device(&mhi_bus_type, NULL, &tmp,\n\t\t\t      __mhi_bdf_to_controller);\n\tif (!dev)\n\t\treturn NULL;\n\n\tmhi_dev = to_mhi_device(dev);\n\n\treturn mhi_dev->mhi_cntrl;\n}\nEXPORT_SYMBOL(mhi_bdf_to_controller);\n\nint mhi_poll(struct mhi_device *mhi_dev,\n\t     u32 budget)\n{\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tstruct mhi_chan *mhi_chan = mhi_dev->dl_chan;\n\tstruct mhi_event *mhi_event = &mhi_cntrl->mhi_event[mhi_chan->er_index];\n\tint ret;\n\n\tspin_lock_bh(&mhi_event->lock);\n\tret = mhi_event->process_event(mhi_cntrl, mhi_event, budget);\n\tspin_unlock_bh(&mhi_event->lock);\n\n\treturn ret;\n}\nEXPORT_SYMBOL(mhi_poll);\n\nint mhi_get_remote_time_sync(struct mhi_device *mhi_dev,\n\t\t\t     u64 *t_host,\n\t\t\t     u64 *t_dev)\n{\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tstruct mhi_timesync *mhi_tsync = mhi_cntrl->mhi_tsync;\n\tint ret;\n\n\t/* not all devices support time feature */\n\tif (!mhi_tsync)\n\t\treturn -EIO;\n\n\t/* bring to M0 state */\n\tret = __mhi_device_get_sync(mhi_cntrl);\n\tif (ret)\n\t\treturn ret;\n\n\tmutex_lock(&mhi_tsync->lpm_mutex);\n\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tif (unlikely(MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state))) {\n\t\tMHI_ERR(\"MHI is not in active state, pm_state:%s\\n\",\n\t\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state));\n\t\tret = -EIO;\n\t\tgoto error_invalid_state;\n\t}\n\n\t/* disable link level low power modes */\n\tret = mhi_cntrl->lpm_disable(mhi_cntrl, mhi_cntrl->priv_data);\n\tif (ret)\n\t\tgoto error_invalid_state;\n\n\t/*\n\t * time critical code to fetch device times,\n\t * delay between these two steps should be\n\t * deterministic as possible.\n\t */\n\tpreempt_disable();\n\tlocal_irq_disable();\n\n\t*t_host = mhi_cntrl->time_get(mhi_cntrl, mhi_cntrl->priv_data);\n\t*t_dev = readq_relaxed_no_log(mhi_tsync->time_reg);\n\n\tlocal_irq_enable();\n\tpreempt_enable();\n\n\tmhi_cntrl->lpm_enable(mhi_cntrl, mhi_cntrl->priv_data);\n\nerror_invalid_state:\n\tmhi_cntrl->wake_put(mhi_cntrl, false);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\tmutex_unlock(&mhi_tsync->lpm_mutex);\n\n\treturn ret;\n}\nEXPORT_SYMBOL(mhi_get_remote_time_sync);\n\n/**\n * mhi_get_remote_time - Get external modem time relative to host time\n * Trigger event to capture modem time, also capture host time so client\n * can do a relative drift comparision.\n * Recommended only tsync device calls this method and do not call this\n * from atomic context\n * @mhi_dev: Device associated with the channels\n * @sequence:unique sequence id track event\n * @cb_func: callback function to call back\n */\nint mhi_get_remote_time(struct mhi_device *mhi_dev,\n\t\t\tu32 sequence,\n\t\t\tvoid (*cb_func)(struct mhi_device *mhi_dev,\n\t\t\t\t\tu32 sequence,\n\t\t\t\t\tu64 local_time,\n\t\t\t\t\tu64 remote_time))\n{\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tstruct mhi_timesync *mhi_tsync = mhi_cntrl->mhi_tsync;\n\tstruct tsync_node *tsync_node;\n\tint ret;\n\n\t/* not all devices support time feature */\n\tif (!mhi_tsync)\n\t\treturn -EIO;\n\n\t/* tsync db can only be rung in M0 state */\n\tret = __mhi_device_get_sync(mhi_cntrl);\n\tif (ret)\n\t\treturn ret;\n\n\t/*\n\t * technically we can use GFP_KERNEL, but wants to avoid\n\t * # of times scheduling out\n\t */\n\ttsync_node = kzalloc(sizeof(*tsync_node), GFP_ATOMIC);\n\tif (!tsync_node) {\n\t\tret = -ENOMEM;\n\t\tgoto error_no_mem;\n\t}\n\n\ttsync_node->sequence = sequence;\n\ttsync_node->cb_func = cb_func;\n\ttsync_node->mhi_dev = mhi_dev;\n\n\t/* disable link level low power modes */\n\tmhi_cntrl->lpm_disable(mhi_cntrl, mhi_cntrl->priv_data);\n\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tif (unlikely(MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state))) {\n\t\tMHI_ERR(\"MHI is not in active state, pm_state:%s\\n\",\n\t\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state));\n\t\tret = -EIO;\n\t\tgoto error_invalid_state;\n\t}\n\n\tspin_lock_irq(&mhi_tsync->lock);\n\tlist_add_tail(&tsync_node->node, &mhi_tsync->head);\n\tspin_unlock_irq(&mhi_tsync->lock);\n\n\t/*\n\t * time critical code, delay between these two steps should be\n\t * deterministic as possible.\n\t */\n\tpreempt_disable();\n\tlocal_irq_disable();\n\n\ttsync_node->local_time =\n\t\tmhi_cntrl->time_get(mhi_cntrl, mhi_cntrl->priv_data);\n\twritel_relaxed_no_log(tsync_node->sequence, mhi_tsync->db);\n\t/* write must go thru immediately */\n\twmb();\n\n\tlocal_irq_enable();\n\tpreempt_enable();\n\n\tret = 0;\n\nerror_invalid_state:\n\tif (ret)\n\t\tkfree(tsync_node);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->lpm_enable(mhi_cntrl, mhi_cntrl->priv_data);\n\nerror_no_mem:\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->wake_put(mhi_cntrl, false);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\treturn ret;\n}\nEXPORT_SYMBOL(mhi_get_remote_time);\n\nvoid mhi_debug_reg_dump(struct mhi_controller *mhi_cntrl)\n{\n\tenum mhi_dev_state state;\n\tenum mhi_ee ee;\n\tint i, ret;\n\tu32 val = 0;\n\tvoid __iomem *mhi_base = mhi_cntrl->regs;\n\tvoid __iomem *bhi_base = mhi_cntrl->bhi;\n\tvoid __iomem *bhie_base = mhi_cntrl->bhie;\n\tvoid __iomem *wake_db = mhi_cntrl->wake_db;\n\tstruct {\n\t\tconst char *name;\n\t\tint offset;\n\t\tvoid *base;\n\t} debug_reg[] = {\n\t\t{ \"MHI_CNTRL\", MHICTRL, mhi_base},\n\t\t{ \"MHI_STATUS\", MHISTATUS, mhi_base},\n\t\t{ \"MHI_WAKE_DB\", 0, wake_db},\n\t\t{ \"BHI_EXECENV\", BHI_EXECENV, bhi_base},\n\t\t{ \"BHI_STATUS\", BHI_STATUS, bhi_base},\n\t\t{ \"BHI_ERRCODE\", BHI_ERRCODE, bhi_base},\n\t\t{ \"BHI_ERRDBG1\", BHI_ERRDBG1, bhi_base},\n\t\t{ \"BHI_ERRDBG2\", BHI_ERRDBG2, bhi_base},\n\t\t{ \"BHI_ERRDBG3\", BHI_ERRDBG3, bhi_base},\n\t\t{ \"BHIE_TXVEC_DB\", BHIE_TXVECDB_OFFS, bhie_base},\n\t\t{ \"BHIE_TXVEC_STATUS\", BHIE_TXVECSTATUS_OFFS, bhie_base},\n\t\t{ \"BHIE_RXVEC_DB\", BHIE_RXVECDB_OFFS, bhie_base},\n\t\t{ \"BHIE_RXVEC_STATUS\", BHIE_RXVECSTATUS_OFFS, bhie_base},\n\t\t{ NULL },\n\t};\n\n\tMHI_LOG(\"host pm_state:%s dev_state:%s ee:%s\\n\",\n\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state),\n\t\tTO_MHI_STATE_STR(mhi_cntrl->dev_state),\n\t\tTO_MHI_EXEC_STR(mhi_cntrl->ee));\n\n\tstate = mhi_get_mhi_state(mhi_cntrl);\n\tee = mhi_get_exec_env(mhi_cntrl);\n\n\tMHI_LOG(\"device ee:%s dev_state:%s\\n\", TO_MHI_EXEC_STR(ee),\n\t\tTO_MHI_STATE_STR(state));\n\n\tfor (i = 0; debug_reg[i].name; i++) {\n\t\tret = mhi_read_reg(mhi_cntrl, debug_reg[i].base,\n\t\t\t\t   debug_reg[i].offset, &val);\n\t\tMHI_LOG(\"reg:%s val:0x%x, ret:%d\\n\", debug_reg[i].name, val,\n\t\t\tret);\n\t}\n}\nEXPORT_SYMBOL(mhi_debug_reg_dump);\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/core/mhi_pm.c",
    "content": "// SPDX-License-Identifier: GPL-2.0-only\n/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved. */\n\n#include <linux/debugfs.h>\n#include <linux/delay.h>\n#include <linux/device.h>\n#include <linux/dma-direction.h>\n#include <linux/dma-mapping.h>\n#include <linux/interrupt.h>\n#include <linux/list.h>\n#include <linux/of.h>\n#include <linux/module.h>\n#include <linux/slab.h>\n#include <linux/sched.h>\n#include <linux/wait.h>\n#include \"mhi.h\"\n#include \"mhi_internal.h\"\n\n/*\n * Not all MHI states transitions are sync transitions. Linkdown, SSR, and\n * shutdown can happen anytime asynchronously. This function will transition to\n * new state only if we're allowed to transitions.\n *\n * Priority increase as we go down, example while in any states from L0, start\n * state from L1, L2, or L3 can be set.  Notable exception to this rule is state\n * DISABLE.  From DISABLE state we can transition to only POR or state.  Also\n * for example while in L2 state, user cannot jump back to L1 or L0 states.\n * Valid transitions:\n * L0: DISABLE <--> POR\n *     POR <--> POR\n *     POR -> M0 -> M2 --> M0\n *     POR -> FW_DL_ERR\n *     FW_DL_ERR <--> FW_DL_ERR\n *     M0 -> FW_DL_ERR\n *     M0 -> M3_ENTER -> M3 -> M3_EXIT --> M0\n * L1: SYS_ERR_DETECT -> SYS_ERR_PROCESS --> POR\n * L2: SHUTDOWN_PROCESS -> DISABLE\n * L3: LD_ERR_FATAL_DETECT <--> LD_ERR_FATAL_DETECT\n *     LD_ERR_FATAL_DETECT -> SHUTDOWN_PROCESS\n */\nstatic struct mhi_pm_transitions const mhi_state_transitions[] = {\n\t/* L0 States */\n\t{\n\t\tMHI_PM_DISABLE,\n\t\tMHI_PM_POR\n\t},\n\t{\n\t\tMHI_PM_POR,\n\t\tMHI_PM_POR | MHI_PM_DISABLE | MHI_PM_M0 |\n\t\tMHI_PM_SYS_ERR_DETECT | MHI_PM_SHUTDOWN_PROCESS |\n\t\tMHI_PM_LD_ERR_FATAL_DETECT | MHI_PM_FW_DL_ERR\n\t},\n\t{\n\t\tMHI_PM_M0,\n\t\tMHI_PM_M2 | MHI_PM_M3_ENTER | MHI_PM_SYS_ERR_DETECT |\n\t\tMHI_PM_SHUTDOWN_PROCESS | MHI_PM_LD_ERR_FATAL_DETECT |\n\t\tMHI_PM_FW_DL_ERR\n\t},\n\t{\n\t\tMHI_PM_M2,\n\t\tMHI_PM_M0 | MHI_PM_SYS_ERR_DETECT | MHI_PM_SHUTDOWN_PROCESS |\n\t\tMHI_PM_LD_ERR_FATAL_DETECT\n\t},\n\t{\n\t\tMHI_PM_M3_ENTER,\n\t\tMHI_PM_M3 | MHI_PM_SYS_ERR_DETECT | MHI_PM_SHUTDOWN_PROCESS |\n\t\tMHI_PM_LD_ERR_FATAL_DETECT\n\t},\n\t{\n\t\tMHI_PM_M3,\n\t\tMHI_PM_M3_EXIT | MHI_PM_SYS_ERR_DETECT |\n\t\tMHI_PM_SHUTDOWN_PROCESS | MHI_PM_LD_ERR_FATAL_DETECT\n\t},\n\t{\n\t\tMHI_PM_M3_EXIT,\n\t\tMHI_PM_M0 | MHI_PM_SYS_ERR_DETECT | MHI_PM_SHUTDOWN_PROCESS |\n\t\tMHI_PM_LD_ERR_FATAL_DETECT\n\t},\n\t{\n\t\tMHI_PM_FW_DL_ERR,\n\t\tMHI_PM_FW_DL_ERR | MHI_PM_SYS_ERR_DETECT |\n\t\tMHI_PM_SHUTDOWN_PROCESS | MHI_PM_LD_ERR_FATAL_DETECT\n\t},\n\t/* L1 States */\n\t{\n\t\tMHI_PM_SYS_ERR_DETECT,\n\t\tMHI_PM_SYS_ERR_PROCESS | MHI_PM_SHUTDOWN_PROCESS |\n\t\tMHI_PM_LD_ERR_FATAL_DETECT\n\t},\n\t{\n\t\tMHI_PM_SYS_ERR_PROCESS,\n\t\tMHI_PM_POR | MHI_PM_SHUTDOWN_PROCESS |\n\t\tMHI_PM_LD_ERR_FATAL_DETECT\n\t},\n\t/* L2 States */\n\t{\n\t\tMHI_PM_SHUTDOWN_PROCESS,\n\t\tMHI_PM_DISABLE | MHI_PM_LD_ERR_FATAL_DETECT\n\t},\n\t/* L3 States */\n\t{\n\t\tMHI_PM_LD_ERR_FATAL_DETECT,\n\t\tMHI_PM_LD_ERR_FATAL_DETECT | MHI_PM_SHUTDOWN_PROCESS\n\t},\n};\n\nenum MHI_PM_STATE __must_check mhi_tryset_pm_state(\n\t\t\t\tstruct mhi_controller *mhi_cntrl,\n\t\t\t\tenum MHI_PM_STATE state)\n{\n\tunsigned long cur_state = mhi_cntrl->pm_state;\n\tint index = find_last_bit(&cur_state, 32);\n\n\tif (unlikely(index >= ARRAY_SIZE(mhi_state_transitions))) {\n\t\tMHI_CRITICAL(\"cur_state:%s is not a valid pm_state\\n\",\n\t\t\t     to_mhi_pm_state_str(cur_state));\n\t\treturn cur_state;\n\t}\n\n\tif (unlikely(mhi_state_transitions[index].from_state != cur_state)) {\n\t\tMHI_ERR(\"index:%u cur_state:%s != actual_state: %s\\n\",\n\t\t\tindex, to_mhi_pm_state_str(cur_state),\n\t\t\tto_mhi_pm_state_str\n\t\t\t(mhi_state_transitions[index].from_state));\n\t\treturn cur_state;\n\t}\n\n\tif (unlikely(!(mhi_state_transitions[index].to_states & state))) {\n\t\tMHI_LOG(\n\t\t\t\"Not allowing pm state transition from:%s to:%s state\\n\",\n\t\t\tto_mhi_pm_state_str(cur_state),\n\t\t\tto_mhi_pm_state_str(state));\n\t\treturn cur_state;\n\t}\n\n\tMHI_LOG(\"Transition to pm state from:%s to:%s\\n\",\n\t\t to_mhi_pm_state_str(cur_state), to_mhi_pm_state_str(state));\n\n\tmhi_cntrl->pm_state = state;\n\treturn mhi_cntrl->pm_state;\n}\n\nvoid mhi_set_mhi_state(struct mhi_controller *mhi_cntrl,\n\t\t       enum mhi_dev_state state)\n{\n\tif (state == MHI_STATE_RESET) {\n\t\tmhi_write_reg_field(mhi_cntrl, mhi_cntrl->regs, MHICTRL,\n\t\t\t\t    MHICTRL_RESET_MASK, MHICTRL_RESET_SHIFT, 1);\n\t} else {\n\t\tmhi_write_reg_field(mhi_cntrl, mhi_cntrl->regs, MHICTRL,\n\t\t\tMHICTRL_MHISTATE_MASK, MHICTRL_MHISTATE_SHIFT, state);\n\t}\n}\n\n/* set device wake */\nvoid mhi_assert_dev_wake(struct mhi_controller *mhi_cntrl, bool force)\n{\n\tunsigned long flags;\n\n#if 1 //carl.yin 20200907, according to WIN driver, only in M2 state, need to assert, and do not need to deassert\n\tif (mhi_cntrl->dev_state == MHI_STATE_M2) {\n\t\tspin_lock_irqsave(&mhi_cntrl->wlock, flags);\n\t\tmhi_write_db(mhi_cntrl, mhi_cntrl->wake_db, 1);\n\t\tspin_unlock_irqrestore(&mhi_cntrl->wlock, flags);\n\t}\n\treturn;\n#endif\n\n\t/* if set, regardless of count set the bit if not set */\n\tif (unlikely(force)) {\n\t\tspin_lock_irqsave(&mhi_cntrl->wlock, flags);\n\t\tatomic_inc(&mhi_cntrl->dev_wake);\n\t\tif (MHI_WAKE_DB_FORCE_SET_VALID(mhi_cntrl->pm_state) &&\n\t\t    !mhi_cntrl->wake_set) {\n\t\t\tmhi_write_db(mhi_cntrl, mhi_cntrl->wake_db, 1);\n\t\t\tmhi_cntrl->wake_set = true;\n\t\t}\n\t\tspin_unlock_irqrestore(&mhi_cntrl->wlock, flags);\n\t} else {\n\t\t/* if resources requested already, then increment and exit */\n\t\tif (likely(atomic_add_unless(&mhi_cntrl->dev_wake, 1, 0)))\n\t\t\treturn;\n\n\t\tspin_lock_irqsave(&mhi_cntrl->wlock, flags);\n\t\tif ((atomic_inc_return(&mhi_cntrl->dev_wake) == 1) &&\n\t\t    MHI_WAKE_DB_SET_VALID(mhi_cntrl->pm_state) &&\n\t\t    !mhi_cntrl->wake_set) {\n\t\t\tmhi_write_db(mhi_cntrl, mhi_cntrl->wake_db, 1);\n\t\t\tmhi_cntrl->wake_set = true;\n\t\t}\n\t\tspin_unlock_irqrestore(&mhi_cntrl->wlock, flags);\n\t}\n}\n\n/* clear device wake */\nvoid mhi_deassert_dev_wake(struct mhi_controller *mhi_cntrl, bool override)\n{\n\tunsigned long flags;\n\n#if 1 //carl.yin 20200907, according to WIN driver, only in M2 state, need to assert, and do not need to deassert\n\treturn;\n#endif\n\n#if 1 //Add by Quectel\n\tif (atomic_read(&mhi_cntrl->dev_wake) == 0)\n\t\treturn;\n#endif\n\n\tMHI_ASSERT(atomic_read(&mhi_cntrl->dev_wake) == 0, \"dev_wake == 0\");\n\n\t/* resources not dropping to 0, decrement and exit */\n\tif (likely(atomic_add_unless(&mhi_cntrl->dev_wake, -1, 1)))\n\t\treturn;\n\n\tspin_lock_irqsave(&mhi_cntrl->wlock, flags);\n\tif ((atomic_dec_return(&mhi_cntrl->dev_wake) == 0) &&\n\t    MHI_WAKE_DB_CLEAR_VALID(mhi_cntrl->pm_state) && !override &&\n\t    mhi_cntrl->wake_set) {\n\t\tmhi_write_db(mhi_cntrl, mhi_cntrl->wake_db, 0);\n\t\tmhi_cntrl->wake_set = false;\n\t}\n\tspin_unlock_irqrestore(&mhi_cntrl->wlock, flags);\n}\n\nint mhi_ready_state_transition(struct mhi_controller *mhi_cntrl)\n{\n\tvoid __iomem *base = mhi_cntrl->regs;\n\tu32 reset = 1, ready = 0;\n\tstruct mhi_event *mhi_event;\n\tenum MHI_PM_STATE cur_state;\n\tint ret, i;\n\n\tMHI_LOG(\"Waiting to enter READY state\\n\");\n\n\t/* wait for RESET to be cleared and READY bit to be set */\n\twait_event_timeout(mhi_cntrl->state_event,\n\t\t\t   MHI_PM_IN_FATAL_STATE(mhi_cntrl->pm_state) ||\n\t\t\t   mhi_read_reg_field(mhi_cntrl, base, MHICTRL,\n\t\t\t\t\t      MHICTRL_RESET_MASK,\n\t\t\t\t\t      MHICTRL_RESET_SHIFT, &reset) ||\n\t\t\t   mhi_read_reg_field(mhi_cntrl, base, MHISTATUS,\n\t\t\t\t\t      MHISTATUS_READY_MASK,\n\t\t\t\t\t      MHISTATUS_READY_SHIFT, &ready) ||\n\t\t\t   (!reset && ready),\n\t\t\t   msecs_to_jiffies(mhi_cntrl->timeout_ms));\n\n\t/* device enter into error state */\n\tif (MHI_PM_IN_FATAL_STATE(mhi_cntrl->pm_state))\n\t\treturn -EIO;\n\n\t/* device did not transition to ready state */\n\tif (reset || !ready)\n\t\treturn -ETIMEDOUT;\n\n\tMHI_LOG(\"Device in READY State\\n\");\n\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\tcur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_POR);\n\tmhi_cntrl->dev_state = MHI_STATE_READY;\n\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\n\tif (cur_state != MHI_PM_POR) {\n\t\tMHI_ERR(\"Error moving to state %s from %s\\n\",\n\t\t\tto_mhi_pm_state_str(MHI_PM_POR),\n\t\t\tto_mhi_pm_state_str(cur_state));\n\t\treturn -EIO;\n\t}\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tif (!MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state))\n\t\tgoto error_mmio;\n\n\tret = mhi_init_mmio(mhi_cntrl);\n\tif (ret) {\n\t\tMHI_ERR(\"Error programming mmio registers\\n\");\n\t\tgoto error_mmio;\n\t}\n\n\t/* add elements to all sw event rings */\n\tmhi_event = mhi_cntrl->mhi_event;\n\tfor (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {\n\t\tstruct mhi_ring *ring = &mhi_event->ring;\n\n\t\tif (mhi_event->offload_ev || mhi_event->hw_ring)\n\t\t\tcontinue;\n\n\t\tring->wp = ring->base + ring->len - ring->el_size;\n\t\t*ring->ctxt_wp = ring->iommu_base + ring->len - ring->el_size;\n\t\t/* needs to update to all cores */\n\t\tsmp_wmb();\n\n\t\t/* ring the db for event rings */\n\t\tspin_lock_irq(&mhi_event->lock);\n\t\tmhi_ring_er_db(mhi_event);\n\t\tspin_unlock_irq(&mhi_event->lock);\n\t}\n\n\t/* set device into M0 state */\n\tmhi_set_mhi_state(mhi_cntrl, MHI_STATE_M0);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\treturn 0;\n\nerror_mmio:\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\treturn -EIO;\n}\n\nint mhi_pm_m0_transition(struct mhi_controller *mhi_cntrl)\n{\n\tenum MHI_PM_STATE cur_state;\n\tstruct mhi_chan *mhi_chan;\n\tint i;\n\n\tMHI_LOG(\"Entered With State:%s PM_STATE:%s\\n\",\n\t\tTO_MHI_STATE_STR(mhi_cntrl->dev_state),\n\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state));\n\n\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->dev_state = MHI_STATE_M0;\n\tcur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_M0);\n\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\tif (unlikely(cur_state != MHI_PM_M0)) {\n\t\tMHI_ERR(\"Failed to transition to state %s from %s\\n\",\n\t\t\tto_mhi_pm_state_str(MHI_PM_M0),\n\t\t\tto_mhi_pm_state_str(cur_state));\n\t\treturn -EIO;\n\t}\n\tmhi_cntrl->M0++;\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->wake_get(mhi_cntrl, false);\n\n\t/* ring all event rings and CMD ring only if we're in mission mode */\n\tif (MHI_IN_MISSION_MODE(mhi_cntrl->ee)) {\n\t\tstruct mhi_event *mhi_event = mhi_cntrl->mhi_event;\n\t\tstruct mhi_cmd *mhi_cmd =\n\t\t\t&mhi_cntrl->mhi_cmd[PRIMARY_CMD_RING];\n\n\t\tfor (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {\n\t\t\tif (mhi_event->offload_ev)\n\t\t\t\tcontinue;\n\n\t\t\tspin_lock_irq(&mhi_event->lock);\n\t\t\tmhi_ring_er_db(mhi_event);\n\t\t\tspin_unlock_irq(&mhi_event->lock);\n\t\t}\n\n\t\t/* only ring primary cmd ring */\n\t\tspin_lock_irq(&mhi_cmd->lock);\n\t\tif (mhi_cmd->ring.rp != mhi_cmd->ring.wp)\n\t\t\tmhi_ring_cmd_db(mhi_cntrl, mhi_cmd);\n\t\tspin_unlock_irq(&mhi_cmd->lock);\n\t}\n\n\t/* ring channel db registers */\n\tmhi_chan = mhi_cntrl->mhi_chan;\n\tfor (i = 0; i < mhi_cntrl->max_chan; i++, mhi_chan++) {\n\t\tstruct mhi_ring *tre_ring = &mhi_chan->tre_ring;\n\n\t\twrite_lock_irq(&mhi_chan->lock);\n\t\tif (mhi_chan->db_cfg.reset_req)\n\t\t\tmhi_chan->db_cfg.db_mode = true;\n\n\t\t/* only ring DB if ring is not empty */\n\t\tif (tre_ring->base && tre_ring->wp  != tre_ring->rp)\n\t\t\tmhi_ring_chan_db(mhi_cntrl, mhi_chan);\n\t\twrite_unlock_irq(&mhi_chan->lock);\n\t}\n\n\tmhi_cntrl->wake_put(mhi_cntrl, false);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\twake_up_all(&mhi_cntrl->state_event);\n\tMHI_VERB(\"Exited\\n\");\n\n\treturn 0;\n}\n\nvoid mhi_pm_m1_transition(struct mhi_controller *mhi_cntrl)\n{\n\tenum MHI_PM_STATE state;\n\n\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\t/* if it fails, means we transition to M3 */\n\tstate = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_M2);\n\tif (state == MHI_PM_M2) {\n\t\tMHI_VERB(\"Entered M2 State\\n\");\n\t\tmhi_set_mhi_state(mhi_cntrl, MHI_STATE_M2);\n\t\tmhi_cntrl->dev_state = MHI_STATE_M2;\n\t\tmhi_cntrl->M2++;\n\n\t\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\t\twake_up_all(&mhi_cntrl->state_event);\n\n\t\t/* transfer pending, exit M2 immediately */\n\t\tif (unlikely(atomic_read(&mhi_cntrl->dev_wake))) {\n\t\t\tMHI_VERB(\"Exiting M2 Immediately, count:%d\\n\",\n\t\t\t\t atomic_read(&mhi_cntrl->dev_wake));\n\t\t\tread_lock_bh(&mhi_cntrl->pm_lock);\n\t\t\tmhi_cntrl->wake_get(mhi_cntrl, true);\n\t\t\tmhi_cntrl->wake_put(mhi_cntrl, false);\n\t\t\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\t\t} else {\n\t\t\tmhi_cntrl->status_cb(mhi_cntrl, mhi_cntrl->priv_data,\n\t\t\t\t\t     MHI_CB_IDLE);\n\t\t}\n\t} else {\n\t\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\t}\n}\n\nint mhi_pm_m3_transition(struct mhi_controller *mhi_cntrl)\n{\n\tenum MHI_PM_STATE state;\n\n\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->dev_state = MHI_STATE_M3;\n\tstate = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_M3);\n\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\tif (state != MHI_PM_M3) {\n\t\tMHI_ERR(\"Failed to transition to state %s from %s\\n\",\n\t\t\tto_mhi_pm_state_str(MHI_PM_M3),\n\t\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state));\n\t\treturn -EIO;\n\t}\n\twake_up_all(&mhi_cntrl->state_event);\n\tmhi_cntrl->M3++;\n\n\tMHI_LOG(\"Entered mhi_state:%s pm_state:%s\\n\",\n\t\tTO_MHI_STATE_STR(mhi_cntrl->dev_state),\n\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state));\n\treturn 0;\n}\n\nstatic int mhi_pm_mission_mode_transition(struct mhi_controller *mhi_cntrl)\n{\n\tint i, ret;\n\tstruct mhi_event *mhi_event;\n\n\tMHI_LOG(\"Processing Mission Mode Transition\\n\");\n\tmhi_cntrl->status_cb(mhi_cntrl, mhi_cntrl->priv_data, MHI_CB_EE_MISSION_MODE);\n\n\t/* force MHI to be in M0 state before continuing */\n\tret = __mhi_device_get_sync(mhi_cntrl);\n\tif (ret)\n\t\treturn ret;\n\n\tret = -EIO;\n\n\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\tif (MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state))\n\t\tmhi_cntrl->ee = mhi_get_exec_env(mhi_cntrl);\n\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tif (!MHI_IN_MISSION_MODE(mhi_cntrl->ee))\n\t\tgoto error_mission_mode;\n\n\twake_up_all(&mhi_cntrl->state_event);\n\n\t/* add elements to all HW event rings */\n\tif (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state))\n\t\tgoto error_mission_mode;\n\n\tmhi_event = mhi_cntrl->mhi_event;\n\tfor (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {\n\t\tstruct mhi_ring *ring = &mhi_event->ring;\n\n\t\tif (mhi_event->offload_ev || !mhi_event->hw_ring)\n\t\t\tcontinue;\n\n\t\tring->wp = ring->base + ring->len - ring->el_size;\n\t\t*ring->ctxt_wp = ring->iommu_base + ring->len - ring->el_size;\n\t\t/* all ring updates must get updated immediately */\n\t\tsmp_wmb();\n\n\t\tspin_lock_irq(&mhi_event->lock);\n\t\tif (MHI_DB_ACCESS_VALID(mhi_cntrl->pm_state))\n\t\t\tmhi_ring_er_db(mhi_event);\n\t\tspin_unlock_irq(&mhi_event->lock);\n\n\t}\n\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\t/* setup support for time sync */\n\tmhi_init_timesync(mhi_cntrl);\n\n\tMHI_LOG(\"Adding new devices\\n\");\n\n\t/* add supported devices */\n\tmhi_create_devices(mhi_cntrl);\n\n\tret = 0;\n\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\nerror_mission_mode:\n\tmhi_cntrl->wake_put(mhi_cntrl, false);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\tMHI_LOG(\"Exit with ret:%d\\n\", ret);\n\n\treturn ret;\n}\n\n/* handles both sys_err and shutdown transitions */\nstatic void mhi_pm_disable_transition(struct mhi_controller *mhi_cntrl,\n\t\t\t\t      enum MHI_PM_STATE transition_state)\n{\n\tenum MHI_PM_STATE cur_state, prev_state;\n\tstruct mhi_event *mhi_event;\n\tstruct mhi_cmd_ctxt *cmd_ctxt;\n\tstruct mhi_cmd *mhi_cmd;\n\tstruct mhi_event_ctxt *er_ctxt;\n\tint ret, i;\n\n\tMHI_LOG(\"Enter with from pm_state:%s MHI_STATE:%s to pm_state:%s\\n\",\n\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state),\n\t\tTO_MHI_STATE_STR(mhi_cntrl->dev_state),\n\t\tto_mhi_pm_state_str(transition_state));\n\n\t/* We must notify MHI control driver so it can clean up first */\n\tif (transition_state == MHI_PM_SYS_ERR_PROCESS)\n\t\tmhi_cntrl->status_cb(mhi_cntrl, mhi_cntrl->priv_data,\n\t\t\t\t     MHI_CB_SYS_ERROR);\n\n\tmutex_lock(&mhi_cntrl->pm_mutex);\n\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\tprev_state = mhi_cntrl->pm_state;\n\tcur_state = mhi_tryset_pm_state(mhi_cntrl, transition_state);\n\tif (cur_state == transition_state) {\n\t\tmhi_cntrl->ee = MHI_EE_DISABLE_TRANSITION;\n\t\tmhi_cntrl->dev_state = MHI_STATE_RESET;\n\t}\n\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\n\t/* wake up any threads waiting for state transitions */\n\twake_up_all(&mhi_cntrl->state_event);\n\n\t/* not handling sys_err, could be middle of shut down */\n\tif (cur_state != transition_state) {\n\t\tMHI_LOG(\"Failed to transition to state:0x%x from:0x%x\\n\",\n\t\t\ttransition_state, cur_state);\n\t\tmutex_unlock(&mhi_cntrl->pm_mutex);\n\t\treturn;\n\t}\n\n\t/* trigger MHI RESET so device will not access host ddr */\n\tif (MHI_REG_ACCESS_VALID(prev_state)) {\n\t\tu32 in_reset = -1;\n\t\tunsigned long timeout = msecs_to_jiffies(mhi_cntrl->timeout_ms);\n\n\t\tMHI_LOG(\"Trigger device into MHI_RESET\\n\");\n\t\tmhi_set_mhi_state(mhi_cntrl, MHI_STATE_RESET);\n\n\t\t/* wait for reset to be cleared */\n\t\tret = wait_event_timeout(mhi_cntrl->state_event,\n\t\t\t\t\t mhi_read_reg_field(mhi_cntrl,\n\t\t\t\t\t\tmhi_cntrl->regs, MHICTRL,\n\t\t\t\t\t\tMHICTRL_RESET_MASK,\n\t\t\t\t\t\tMHICTRL_RESET_SHIFT, &in_reset)\n\t\t\t\t\t || !in_reset, timeout);\n\t\tif ((!ret || in_reset) && cur_state == MHI_PM_SYS_ERR_PROCESS) {\n\t\t\tMHI_CRITICAL(\"Device failed to exit RESET state\\n\");\n\t\t\tmutex_unlock(&mhi_cntrl->pm_mutex);\n\t\t\treturn;\n\t\t}\n\n\t\t/* Set the numbers of Event Rings supported */\n\t\tmhi_write_reg_field(mhi_cntrl, mhi_cntrl->regs, MHICFG, MHICFG_NER_MASK, MHICFG_NER_SHIFT, NUM_MHI_EVT_RINGS);\n\t\tmhi_write_reg_field(mhi_cntrl, mhi_cntrl->regs, MHICFG, MHICFG_NHWER_MASK, MHICFG_NHWER_SHIFT, NUM_MHI_HW_EVT_RINGS);\n\n\t\t/*\n\t\t * device cleares INTVEC as part of RESET processing,\n\t\t * re-program it\n\t\t */\n\t\tmhi_write_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_INTVEC, mhi_cntrl->msi_irq_base);\n\t}\n\n\tMHI_LOG(\"Waiting for all pending event ring processing to complete\\n\");\n\tmhi_event = mhi_cntrl->mhi_event;\n\tfor (i = 0; i < mhi_cntrl->total_ev_rings; i++, mhi_event++) {\n\t\tif (mhi_event->offload_ev)\n\t\t\tcontinue;\n\t\ttasklet_kill(&mhi_event->task);\n\t}\n\n\tmutex_unlock(&mhi_cntrl->pm_mutex);\n\n\tMHI_LOG(\"Reset all active channels and remove mhi devices\\n\");\n\tmhi_cntrl->klog_slient = 1;\n\tdevice_for_each_child(mhi_cntrl->dev, NULL, mhi_destroy_device);\n\tmhi_cntrl->klog_slient = 0;\n\n\tMHI_LOG(\"Finish resetting channels\\n\");\n\n\tMHI_LOG(\"Waiting for all pending threads to complete\\n\");\n\twake_up_all(&mhi_cntrl->state_event);\n\tflush_delayed_work(&mhi_cntrl->ready_worker);\n\tflush_work(&mhi_cntrl->st_worker);\n\tflush_work(&mhi_cntrl->fw_worker);\n\n\tmutex_lock(&mhi_cntrl->pm_mutex);\n\n\tMHI_ASSERT(atomic_read(&mhi_cntrl->dev_wake), \"dev_wake != 0\");\n\n\t/* reset the ev rings and cmd rings */\n\tMHI_LOG(\"Resetting EV CTXT and CMD CTXT\\n\");\n\tmhi_cmd = mhi_cntrl->mhi_cmd;\n\tcmd_ctxt = mhi_cntrl->mhi_ctxt->cmd_ctxt;\n\tfor (i = 0; i < NR_OF_CMD_RINGS; i++, mhi_cmd++, cmd_ctxt++) {\n\t\tstruct mhi_ring *ring = &mhi_cmd->ring;\n\n\t\tring->rp = ring->base;\n\t\tring->wp = ring->base;\n\t\tcmd_ctxt->rp = cmd_ctxt->rbase;\n\t\tcmd_ctxt->wp = cmd_ctxt->rbase;\n\t}\n\n\tmhi_event = mhi_cntrl->mhi_event;\n\ter_ctxt = mhi_cntrl->mhi_ctxt->er_ctxt;\n\tfor (i = 0; i < mhi_cntrl->total_ev_rings; i++, er_ctxt++,\n\t\t     mhi_event++) {\n\t\tstruct mhi_ring *ring = &mhi_event->ring;\n\n\t\t/* do not touch offload er */\n\t\tif (mhi_event->offload_ev)\n\t\t\tcontinue;\n\n\t\tring->rp = ring->base;\n\t\tring->wp = ring->base;\n\t\ter_ctxt->rp = er_ctxt->rbase;\n\t\ter_ctxt->wp = er_ctxt->rbase;\n\t}\n\n\t/* remove support for time sync */\n\tmhi_destroy_timesync(mhi_cntrl);\n\n\tif (cur_state == MHI_PM_SYS_ERR_PROCESS) {\n\t\tif (mhi_get_exec_env(mhi_cntrl) == MHI_EE_EDL && mhi_get_mhi_state(mhi_cntrl) == MHI_STATE_RESET) {\n\t\t\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\t\t\tmhi_cntrl->ee = MHI_EE_EDL;\n\t\t\tcur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_POR);\n\t\t\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\t\t}\n\t\telse\n\t\tmhi_ready_state_transition(mhi_cntrl);\n\t} else {\n\t\t/* move to disable state */\n\t\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\t\tcur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_DISABLE);\n\t\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\t\tif (unlikely(cur_state != MHI_PM_DISABLE))\n\t\t\tMHI_ERR(\"Error moving from pm state:%s to state:%s\\n\",\n\t\t\t\tto_mhi_pm_state_str(cur_state),\n\t\t\t\tto_mhi_pm_state_str(MHI_PM_DISABLE));\n\t}\n\n\tMHI_LOG(\"Exit with pm_state:%s mhi_state:%s\\n\",\n\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state),\n\t\tTO_MHI_STATE_STR(mhi_cntrl->dev_state));\n\n\tmutex_unlock(&mhi_cntrl->pm_mutex);\n}\n\nint mhi_debugfs_trigger_reset(void *data, u64 val)\n{\n\tstruct mhi_controller *mhi_cntrl = data;\n\tenum MHI_PM_STATE cur_state;\n\tint ret;\n\n\tMHI_LOG(\"Trigger MHI Reset\\n\");\n\n\t/* exit lpm first */\n\tmhi_cntrl->runtime_get(mhi_cntrl, mhi_cntrl->priv_data);\n\tmhi_cntrl->runtime_put(mhi_cntrl, mhi_cntrl->priv_data);\n\n\tret = wait_event_timeout(mhi_cntrl->state_event,\n\t\t\t\t mhi_cntrl->dev_state == MHI_STATE_M0 ||\n\t\t\t\t MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),\n\t\t\t\t msecs_to_jiffies(mhi_cntrl->timeout_ms));\n\n\tif (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {\n\t\tMHI_ERR(\"Did not enter M0 state, cur_state:%s pm_state:%s\\n\",\n\t\t\tTO_MHI_STATE_STR(mhi_cntrl->dev_state),\n\t\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state));\n\t\treturn -EIO;\n\t}\n\n\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\tcur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_SYS_ERR_DETECT);\n\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\n\tif (cur_state == MHI_PM_SYS_ERR_DETECT)\n\t\tschedule_work(&mhi_cntrl->syserr_worker);\n\n\treturn 0;\n}\n\n/* queue a new work item and scheduler work */\nint mhi_queue_state_transition(struct mhi_controller *mhi_cntrl,\n\t\t\t       enum MHI_ST_TRANSITION state)\n{\n\tstruct state_transition *item = kmalloc(sizeof(*item), GFP_ATOMIC);\n\tunsigned long flags;\n\n\tif (!item)\n\t\treturn -ENOMEM;\n\n\titem->state = state;\n\tspin_lock_irqsave(&mhi_cntrl->transition_lock, flags);\n\tlist_add_tail(&item->node, &mhi_cntrl->transition_list);\n\tspin_unlock_irqrestore(&mhi_cntrl->transition_lock, flags);\n\n\tschedule_work(&mhi_cntrl->st_worker);\n\n\treturn 0;\n}\n\nvoid mhi_pm_sys_err_worker(struct work_struct *work)\n{\n\tstruct mhi_controller *mhi_cntrl = container_of(work,\n\t\t\t\t\t\t\tstruct mhi_controller,\n\t\t\t\t\t\t\tsyserr_worker);\n\n\tMHI_LOG(\"Enter with pm_state:%s MHI_STATE:%s\\n\",\n\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state),\n\t\tTO_MHI_STATE_STR(mhi_cntrl->dev_state));\n\n\tmhi_pm_disable_transition(mhi_cntrl, MHI_PM_SYS_ERR_PROCESS);\n}\n\nvoid mhi_pm_ready_worker(struct work_struct *work)\n{\n\tstruct mhi_controller *mhi_cntrl = container_of(work,\n\t\t\t\t\t\t\tstruct mhi_controller,\n\t\t\t\t\t\t\tready_worker.work);\n\tenum mhi_ee ee = MHI_EE_MAX;\n\n\tif (mhi_cntrl->dev_state != MHI_STATE_RESET)\n\t\treturn;\n\n\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\tif (MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state))\n\t\tee = mhi_get_exec_env(mhi_cntrl);\n\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\n\tif (ee == MHI_EE_PTHRU)\n\t\tschedule_delayed_work(&mhi_cntrl->ready_worker, msecs_to_jiffies(10));\n\telse if (ee == MHI_EE_AMSS || ee == MHI_EE_SBL)\n\t\tmhi_queue_state_transition(mhi_cntrl, MHI_ST_TRANSITION_READY);\n\telse if (ee == MHI_EE_EDL)\n\t\tmhi_queue_state_transition(mhi_cntrl, MHI_ST_TRANSITION_PBL);\n}\n\nvoid mhi_pm_st_worker(struct work_struct *work)\n{\n\tstruct state_transition *itr, *tmp;\n\tLIST_HEAD(head);\n\tstruct mhi_controller *mhi_cntrl = container_of(work,\n\t\t\t\t\t\t\tstruct mhi_controller,\n\t\t\t\t\t\t\tst_worker);\n\tspin_lock_irq(&mhi_cntrl->transition_lock);\n\tlist_splice_tail_init(&mhi_cntrl->transition_list, &head);\n\tspin_unlock_irq(&mhi_cntrl->transition_lock);\n\n\tlist_for_each_entry_safe(itr, tmp, &head, node) {\n\t\tlist_del(&itr->node);\n\t\tMHI_LOG(\"Transition to state:%s\\n\",\n\t\t\tTO_MHI_STATE_TRANS_STR(itr->state));\n\n\t\tif (mhi_cntrl->ee != mhi_get_exec_env(mhi_cntrl)) {\n\t\t\tMHI_LOG(\"%s -> %s\\n\", TO_MHI_EXEC_STR(mhi_cntrl->ee),\n\t\t\t\tTO_MHI_EXEC_STR(mhi_get_exec_env(mhi_cntrl)));\n\t\t}\n\n\t\tswitch (itr->state) {\n\t\tcase MHI_ST_TRANSITION_PBL:\n\t\t\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\t\t\tif (MHI_REG_ACCESS_VALID(mhi_cntrl->pm_state))\n\t\t\t\tmhi_cntrl->ee = mhi_get_exec_env(mhi_cntrl);\n\t\t\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\t\t\tif (MHI_IN_PBL(mhi_cntrl->ee))\n\t\t\t\twake_up_all(&mhi_cntrl->state_event);\n\t\t\tbreak;\n\t\tcase MHI_ST_TRANSITION_SBL:\n\t\t\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\t\t\tmhi_cntrl->ee = MHI_EE_SBL;\n\t\t\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\t\t\twake_up_all(&mhi_cntrl->state_event);\n\t\t\tmhi_create_devices(mhi_cntrl);\n\t\t\tbreak;\n\t\tcase MHI_ST_TRANSITION_MISSION_MODE:\n\t\t\tmhi_pm_mission_mode_transition(mhi_cntrl);\n\t\t\tbreak;\n\t\tcase MHI_ST_TRANSITION_READY:\n\t\t\tmhi_ready_state_transition(mhi_cntrl);\n\t\t\tbreak;\n\t\tcase MHI_ST_TRANSITION_FP:\n\t\t\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\t\t\tmhi_cntrl->ee = MHI_EE_FP;\n\t\t\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\t\t\twake_up(&mhi_cntrl->state_event);\n\t\t\tmhi_create_devices(mhi_cntrl);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\tbreak;\n\t\t}\n\t\tkfree(itr);\n\t}\n}\n\nint mhi_async_power_up(struct mhi_controller *mhi_cntrl)\n{\n\tint ret;\n\tu32 val, regVal;\n\tenum mhi_ee current_ee;\n\tenum MHI_ST_TRANSITION next_state;\n\n\tMHI_LOG(\"Requested to power on\\n\");\n\n#if 0\n\tif (mhi_cntrl->msi_allocated < mhi_cntrl->total_ev_rings)\n\t\treturn -EINVAL;\n#endif\n\n\t if (mhi_get_mhi_state(mhi_cntrl) >= MHI_STATE_M0) {\n\t\tMHI_LOG(\"mhi_state = %s\\n\", mhi_state_str[mhi_get_mhi_state(mhi_cntrl)]);\n\t\tMHI_LOG(\"Trigger device into MHI_RESET\\n\");\n\t\tmhi_set_mhi_state(mhi_cntrl, MHI_STATE_RESET);\n\t\tmsleep(50);\n\t\tMHI_LOG(\"mhi_state = %s\\n\", mhi_state_str[mhi_get_mhi_state(mhi_cntrl)]);\n\t }\n\n#if 1 //GLUE.SDX55_LE.1.0-00098-NOOP_TEST-1\\common\\hostdrivers\\win\\MhiHost MhiInitNewDev()\n\t/* Check device Channels support */\n\tret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, MHICFG, &regVal);\n#if 0\n\tval = MHI_READ_REG_FIELD(regVal, MHICFG, NCH);\n\tMHI_LOG(\"Device CHs: %d\\n\", val);\n\tval = MHI_READ_REG_FIELD(regVal, MHICFG, NHWCH);\n\tMHI_LOG(\"Device HW CHs: %d\\n\", val);\n\tval = MHI_READ_REG_FIELD(regVal, MHICFG, NER);\n\tMHI_LOG(\"Device ERs: %d\\n\", val);\n\tval = MHI_READ_REG_FIELD(regVal, MHICFG, NHWER);\n\tMHI_LOG(\"Device HW ERs: %d\\n\", val);\n#endif\n\t/* Set the numbers of Event Rings supported */\n\tMHI_WRITE_REG_FIELD(regVal, MHICFG, NER, NUM_MHI_EVT_RINGS);\n\tMHI_WRITE_REG_FIELD(regVal, MHICFG, NHWER, NUM_MHI_HW_EVT_RINGS);\n\tmhi_write_reg(mhi_cntrl, mhi_cntrl->regs, MHICFG, regVal);\n#endif\n\n\t/* set to default wake if not set */\n\tif (!mhi_cntrl->wake_get || !mhi_cntrl->wake_put) {\n\t\tmhi_cntrl->wake_get = mhi_assert_dev_wake;\n\t\tmhi_cntrl->wake_put = mhi_deassert_dev_wake;\n\t}\n\n\tmutex_lock(&mhi_cntrl->pm_mutex);\n\tmhi_cntrl->pm_state = MHI_PM_DISABLE;\n\tmhi_cntrl->dev_state = MHI_STATE_RESET;\n\n\tif (!mhi_cntrl->pre_init) {\n\t\t/* setup device context */\n\t\tret = mhi_init_dev_ctxt(mhi_cntrl);\n\t\tif (ret) {\n\t\t\tMHI_ERR(\"Error setting dev_context\\n\");\n\t\t\tgoto error_dev_ctxt;\n\t\t}\n\n\t\tret = mhi_init_irq_setup(mhi_cntrl);\n\t\tif (ret) {\n\t\t\tMHI_ERR(\"Error setting up irq\\n\");\n\t\t\tgoto error_setup_irq;\n\t\t}\n\t}\n\n\t/* setup bhi offset & intvec */\n\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\tret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, BHIOFF, &val);\n\tif (ret) {\n\t\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\t\tMHI_ERR(\"Error getting bhi offset\\n\");\n\t\tgoto error_bhi_offset;\n\t}\n\n\tmhi_cntrl->bhi = mhi_cntrl->regs + val;\n\n\t/* setup bhie offset */\n\tif (mhi_cntrl->fbc_download || true) {\n\t\tret = mhi_read_reg(mhi_cntrl, mhi_cntrl->regs, BHIEOFF, &val);\n\t\tif (ret) {\n\t\t\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\t\t\tMHI_ERR(\"Error getting bhie offset\\n\");\n\t\t\tgoto error_bhi_offset;\n\t\t}\n\n\t\tmhi_cntrl->bhie = mhi_cntrl->regs + val;\n\t}\n\n\tmhi_write_reg(mhi_cntrl, mhi_cntrl->bhi, BHI_INTVEC, mhi_cntrl->msi_irq_base);\n\tmhi_cntrl->pm_state = MHI_PM_POR;\n\tmhi_cntrl->ee = MHI_EE_MAX;\n\tcurrent_ee = mhi_get_exec_env(mhi_cntrl);\n\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\n\tMHI_LOG(\"dev_state:%s ee:%s\\n\",\n\t\tTO_MHI_STATE_STR(mhi_get_mhi_state(mhi_cntrl)),\n\t\tTO_MHI_EXEC_STR(mhi_get_exec_env(mhi_cntrl)));\n\n\t/* confirm device is in valid exec env */\n\tif (!MHI_IN_PBL(current_ee) && current_ee != MHI_EE_AMSS) {\n\t\t//MHI_ERR(\"Not a valid ee for power on\\n\");\n\t\t//ret = -EIO;\n\t\t//goto error_bhi_offset;\n\t}\n\n\t/* transition to next state */\n\tnext_state = MHI_IN_PBL(current_ee) ?\n\t\tMHI_ST_TRANSITION_PBL : MHI_ST_TRANSITION_READY;\n\n\t//if (next_state == MHI_ST_TRANSITION_PBL)\n\t//\tschedule_work(&mhi_cntrl->fw_worker);\n\n\tif (next_state == MHI_ST_TRANSITION_PBL)\n\t\tschedule_delayed_work(&mhi_cntrl->ready_worker, msecs_to_jiffies(10));\n\telse\n\t\tmhi_queue_state_transition(mhi_cntrl, next_state);\n\n\tmhi_init_debugfs(mhi_cntrl);\n\n\tmutex_unlock(&mhi_cntrl->pm_mutex);\n\n\tMHI_LOG(\"Power on setup success\\n\");\n\n\treturn 0;\n\nerror_bhi_offset:\n\tif (!mhi_cntrl->pre_init)\n\t\tmhi_deinit_free_irq(mhi_cntrl);\n\nerror_setup_irq:\n\tif (!mhi_cntrl->pre_init)\n\t\tmhi_deinit_dev_ctxt(mhi_cntrl);\n\nerror_dev_ctxt:\n\tmutex_unlock(&mhi_cntrl->pm_mutex);\n\n\treturn ret;\n}\nEXPORT_SYMBOL(mhi_async_power_up);\n\nvoid mhi_power_down(struct mhi_controller *mhi_cntrl, bool graceful)\n{\n\tenum MHI_PM_STATE cur_state;\n\n\t/* if it's not graceful shutdown, force MHI to a linkdown state */\n\tif (!graceful) {\n\t\tmutex_lock(&mhi_cntrl->pm_mutex);\n\t\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\t\tcur_state = mhi_tryset_pm_state(mhi_cntrl,\n\t\t\t\t\t\tMHI_PM_LD_ERR_FATAL_DETECT);\n\t\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\t\tmutex_unlock(&mhi_cntrl->pm_mutex);\n\t\tif (cur_state != MHI_PM_LD_ERR_FATAL_DETECT)\n\t\t\tMHI_ERR(\"Failed to move to state:%s from:%s\\n\",\n\t\t\t\tto_mhi_pm_state_str(MHI_PM_LD_ERR_FATAL_DETECT),\n\t\t\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state));\n\t}\n\tmhi_pm_disable_transition(mhi_cntrl, MHI_PM_SHUTDOWN_PROCESS);\n\n\tmhi_deinit_debugfs(mhi_cntrl);\n\n\tif (!mhi_cntrl->pre_init) {\n\t\t/* free all allocated resources */\n\t\tif (mhi_cntrl->fbc_image) {\n\t\t\tmhi_free_bhie_table(mhi_cntrl, mhi_cntrl->fbc_image);\n\t\t\tmhi_cntrl->fbc_image = NULL;\n\t\t}\n\t\tmhi_deinit_free_irq(mhi_cntrl);\n\t\tmhi_deinit_dev_ctxt(mhi_cntrl);\n\t}\n}\nEXPORT_SYMBOL(mhi_power_down);\n\nint mhi_sync_power_up(struct mhi_controller *mhi_cntrl)\n{\n\tint ret = mhi_async_power_up(mhi_cntrl);\n\n\tif (ret)\n\t\treturn ret;\n\n\twait_event_timeout(mhi_cntrl->state_event,\n\t\t\t   MHI_IN_MISSION_MODE(mhi_cntrl->ee) ||\n\t\t\t   MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),\n\t\t\t   msecs_to_jiffies(mhi_cntrl->timeout_ms));\n\n\treturn (MHI_IN_MISSION_MODE(mhi_cntrl->ee)) ? 0 : -EIO;\n}\nEXPORT_SYMBOL(mhi_sync_power_up);\n\nint mhi_pm_suspend(struct mhi_controller *mhi_cntrl)\n{\n\tint ret;\n\tenum MHI_PM_STATE new_state;\n\tstruct mhi_chan *itr, *tmp;\n\n\tif (mhi_cntrl->pm_state == MHI_PM_DISABLE)\n\t\treturn -EINVAL;\n\n\tif (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state))\n\t\treturn -EIO;\n\n\t/* do a quick check to see if any pending data, then exit */\n\tif (atomic_read(&mhi_cntrl->dev_wake)) {\n\t\tMHI_VERB(\"Busy, aborting M3\\n\");\n\t\treturn -EBUSY;\n\t}\n\n\t/* exit MHI out of M2 state */\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->wake_get(mhi_cntrl, false);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\tret = wait_event_timeout(mhi_cntrl->state_event,\n\t\t\t\t mhi_cntrl->dev_state == MHI_STATE_M0 ||\n\t\t\t\t mhi_cntrl->dev_state == MHI_STATE_M1 ||\n\t\t\t\t MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),\n\t\t\t\t msecs_to_jiffies(mhi_cntrl->timeout_ms));\n\n\tif (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {\n\t\tMHI_ERR(\n\t\t\t\"Did not enter M0||M1 state, cur_state:%s pm_state:%s\\n\",\n\t\t\tTO_MHI_STATE_STR(mhi_cntrl->dev_state),\n\t\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state));\n\t\tret = -EIO;\n\t\tgoto error_m0_entry;\n\t}\n\n\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\n\t/* we're asserting wake so count would be @ least 1 */\n\tif (atomic_read(&mhi_cntrl->dev_wake) > 1) {\n\t\tMHI_VERB(\"Busy, aborting M3\\n\");\n\t\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\t\tret = -EBUSY;\n\t\tgoto error_m0_entry;\n\t}\n\n\t/* anytime after this, we will resume thru runtime pm framework */\n\tMHI_LOG(\"Allowing M3 transition\\n\");\n\tnew_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_M3_ENTER);\n\tif (new_state != MHI_PM_M3_ENTER) {\n\t\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\t\tMHI_ERR(\"Error setting to pm_state:%s from pm_state:%s\\n\",\n\t\t\tto_mhi_pm_state_str(MHI_PM_M3_ENTER),\n\t\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state));\n\n\t\tret = -EIO;\n\t\tgoto error_m0_entry;\n\t}\n\n\t/* set dev to M3 and wait for completion */\n\tmhi_set_mhi_state(mhi_cntrl, MHI_STATE_M3);\n\tmhi_cntrl->wake_put(mhi_cntrl, false);\n\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\tMHI_LOG(\"Wait for M3 completion\\n\");\n\n\tret = wait_event_timeout(mhi_cntrl->state_event,\n\t\t\t\t mhi_cntrl->dev_state == MHI_STATE_M3 ||\n\t\t\t\t MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),\n\t\t\t\t msecs_to_jiffies(mhi_cntrl->timeout_ms));\n\n\tif (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {\n\t\tMHI_ERR(\"Did not enter M3 state, cur_state:%s pm_state:%s\\n\",\n\t\t\tTO_MHI_STATE_STR(mhi_cntrl->dev_state),\n\t\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state));\n\t\treturn -EIO;\n\t}\n\n\t/* notify any clients we enter lpm */\n\tlist_for_each_entry_safe(itr, tmp, &mhi_cntrl->lpm_chans, node) {\n\t\tmutex_lock(&itr->mutex);\n\t\tif (itr->mhi_dev)\n\t\t\tmhi_notify(itr->mhi_dev, MHI_CB_LPM_ENTER);\n\t\tmutex_unlock(&itr->mutex);\n\t}\n\n\treturn 0;\n\nerror_m0_entry:\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->wake_put(mhi_cntrl, false);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\treturn ret;\n}\nEXPORT_SYMBOL(mhi_pm_suspend);\n\nint mhi_pm_resume(struct mhi_controller *mhi_cntrl)\n{\n\tenum MHI_PM_STATE cur_state;\n\tint ret;\n\tstruct mhi_chan *itr, *tmp;\n\n\tMHI_LOG(\"Entered with pm_state:%s dev_state:%s\\n\",\n\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state),\n\t\tTO_MHI_STATE_STR(mhi_cntrl->dev_state));\n\n\tif (mhi_cntrl->pm_state == MHI_PM_DISABLE)\n\t\treturn 0;\n\n\tif (MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state))\n\t\treturn -EIO;\n\n\tMHI_ASSERT(mhi_cntrl->pm_state != MHI_PM_M3, \"mhi_pm_state != M3\");\n\n\t/* notify any clients we enter lpm */\n\tlist_for_each_entry_safe(itr, tmp, &mhi_cntrl->lpm_chans, node) {\n\t\tmutex_lock(&itr->mutex);\n\t\tif (itr->mhi_dev)\n\t\t\tmhi_notify(itr->mhi_dev, MHI_CB_LPM_EXIT);\n\t\tmutex_unlock(&itr->mutex);\n\t}\n\n\twrite_lock_irq(&mhi_cntrl->pm_lock);\n\tcur_state = mhi_tryset_pm_state(mhi_cntrl, MHI_PM_M3_EXIT);\n\tif (cur_state != MHI_PM_M3_EXIT) {\n\t\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\t\tMHI_ERR(\"Error setting to pm_state:%s from pm_state:%s\\n\",\n\t\t\tto_mhi_pm_state_str(MHI_PM_M3_EXIT),\n\t\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state));\n\t\treturn -EIO;\n\t}\n\n\t/* set dev to M0 and wait for completion */\n\tmhi_cntrl->wake_get(mhi_cntrl, true);\n\tmhi_set_mhi_state(mhi_cntrl, MHI_STATE_M0);\n\twrite_unlock_irq(&mhi_cntrl->pm_lock);\n\n\tret = wait_event_timeout(mhi_cntrl->state_event,\n\t\t\t\t mhi_cntrl->dev_state == MHI_STATE_M0 ||\n\t\t\t\t MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),\n\t\t\t\t msecs_to_jiffies(mhi_cntrl->timeout_ms));\n\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->wake_put(mhi_cntrl, false);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\tif (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {\n\t\tMHI_ERR(\"Did not enter M0 state, cur_state:%s pm_state:%s\\n\",\n\t\t\tTO_MHI_STATE_STR(mhi_cntrl->dev_state),\n\t\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state));\n\n\t\t/*\n\t\t * It's possible device already in error state and we didn't\n\t\t * process it due to low power mode, force a check\n\t\t */\n\t\tmhi_intvec_threaded_handlr(0, mhi_cntrl);\n\t\treturn -EIO;\n\t}\n\n\treturn 0;\n}\n\nint __mhi_device_get_sync(struct mhi_controller *mhi_cntrl)\n{\n\tint ret;\n\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->wake_get(mhi_cntrl, true);\n\tif (MHI_PM_IN_SUSPEND_STATE(mhi_cntrl->pm_state)) {\n\t\tmhi_cntrl->runtime_get(mhi_cntrl, mhi_cntrl->priv_data);\n\t\tmhi_cntrl->runtime_put(mhi_cntrl, mhi_cntrl->priv_data);\n\t}\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\n\tret = wait_event_timeout(mhi_cntrl->state_event,\n\t\t\t\t mhi_cntrl->pm_state == MHI_PM_M0 ||\n\t\t\t\t MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state),\n\t\t\t\t msecs_to_jiffies(mhi_cntrl->timeout_ms));\n\n\tif (!ret || MHI_PM_IN_ERROR_STATE(mhi_cntrl->pm_state)) {\n\t\tMHI_ERR(\"Did not enter M0 state, cur_state:%s pm_state:%s\\n\",\n\t\t\tTO_MHI_STATE_STR(mhi_cntrl->dev_state),\n\t\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state));\n\t\tread_lock_bh(&mhi_cntrl->pm_lock);\n\t\tmhi_cntrl->wake_put(mhi_cntrl, false);\n\t\tread_unlock_bh(&mhi_cntrl->pm_lock);\n\t\treturn -EIO;\n\t}\n\n\treturn 0;\n}\n\nvoid mhi_device_get(struct mhi_device *mhi_dev)\n{\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\n\tatomic_inc(&mhi_dev->dev_wake);\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->wake_get(mhi_cntrl, true);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n}\nEXPORT_SYMBOL(mhi_device_get);\n\nint mhi_device_get_sync(struct mhi_device *mhi_dev)\n{\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\tint ret;\n\n\tret = __mhi_device_get_sync(mhi_cntrl);\n\tif (!ret)\n\t\tatomic_inc(&mhi_dev->dev_wake);\n\n\treturn ret;\n}\nEXPORT_SYMBOL(mhi_device_get_sync);\n\nvoid mhi_device_put(struct mhi_device *mhi_dev)\n{\n\tstruct mhi_controller *mhi_cntrl = mhi_dev->mhi_cntrl;\n\n\tatomic_dec(&mhi_dev->dev_wake);\n\tread_lock_bh(&mhi_cntrl->pm_lock);\n\tmhi_cntrl->wake_put(mhi_cntrl, false);\n\tread_unlock_bh(&mhi_cntrl->pm_lock);\n}\nEXPORT_SYMBOL(mhi_device_put);\n\nint mhi_force_rddm_mode(struct mhi_controller *mhi_cntrl)\n{\n\tint ret;\n\n\tMHI_LOG(\"Enter with pm_state:%s ee:%s\\n\",\n\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state),\n\t\tTO_MHI_EXEC_STR(mhi_cntrl->ee));\n\n\tMHI_LOG(\"Triggering SYS_ERR to force rddm state\\n\");\n\tmhi_set_mhi_state(mhi_cntrl, MHI_STATE_SYS_ERR);\n\n\t/* wait for rddm event */\n\tMHI_LOG(\"Waiting for device to enter RDDM state\\n\");\n\tret = wait_event_timeout(mhi_cntrl->state_event,\n\t\t\t\t mhi_cntrl->ee == MHI_EE_RDDM,\n\t\t\t\t msecs_to_jiffies(mhi_cntrl->timeout_ms));\n\tret = ret ? 0 : -EIO;\n\n\tMHI_LOG(\"Exiting with pm_state:%s ee:%s ret:%d\\n\",\n\t\tto_mhi_pm_state_str(mhi_cntrl->pm_state),\n\t\tTO_MHI_EXEC_STR(mhi_cntrl->ee), ret);\n\n\treturn ret;\n}\nEXPORT_SYMBOL(mhi_force_rddm_mode);\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/core/mhi_sdx20.h",
    "content": "#ifndef __SDX20_MHI_H\r\n#define __SDX20_MHI_H\r\n\r\n#include <linux/types.h>\r\n\r\n/* MHI control data structures alloted by the host, including\r\n * channel context array, event context array, command context and rings */\r\n\r\n/* Channel context state */\r\nenum mhi_dev_ch_ctx_state {\r\n\tMHI_DEV_CH_STATE_DISABLED,\r\n\tMHI_DEV_CH_STATE_ENABLED,\r\n\tMHI_DEV_CH_STATE_RUNNING,\r\n\tMHI_DEV_CH_STATE_SUSPENDED,\r\n\tMHI_DEV_CH_STATE_STOP,\r\n\tMHI_DEV_CH_STATE_ERROR,\r\n\tMHI_DEV_CH_STATE_RESERVED,\r\n\tMHI_DEV_CH_STATE_32BIT = 0x7FFFFFFF\r\n};\r\n\r\n/* Channel type */\r\nenum mhi_dev_ch_ctx_type {\r\n\tMHI_DEV_CH_TYPE_NONE,\r\n\tMHI_DEV_CH_TYPE_OUTBOUND_CHANNEL,\r\n\tMHI_DEV_CH_TYPE_INBOUND_CHANNEL,\r\n\tMHI_DEV_CH_RESERVED\r\n};\r\n\r\n/* Channel context type */\r\nstruct mhi_dev_ch_ctx {\r\n\tenum mhi_dev_ch_ctx_state\tch_state;\r\n\tenum mhi_dev_ch_ctx_type\tch_type;\r\n\tuint32_t\t\t\terr_indx;\r\n\tuint64_t\t\t\trbase;\r\n\tuint64_t\t\t\trlen;\r\n\tuint64_t\t\t\trp;\r\n\tuint64_t\t\t\twp;\r\n} __packed;\r\n\r\nenum mhi_dev_ring_element_type_id {\r\n\tMHI_DEV_RING_EL_INVALID = 0,\r\n\tMHI_DEV_RING_EL_NOOP = 1,\r\n\tMHI_DEV_RING_EL_TRANSFER = 2,\r\n\tMHI_DEV_RING_EL_RESET = 16,\r\n\tMHI_DEV_RING_EL_STOP = 17,\r\n\tMHI_DEV_RING_EL_START = 18,\r\n\tMHI_DEV_RING_EL_MHI_STATE_CHG = 32,\r\n\tMHI_DEV_RING_EL_CMD_COMPLETION_EVT = 33,\r\n\tMHI_DEV_RING_EL_TRANSFER_COMPLETION_EVENT = 34,\r\n\tMHI_DEV_RING_EL_EE_STATE_CHANGE_NOTIFY = 64,\r\n\tMHI_DEV_RING_EL_UNDEF\r\n};\r\n\r\nenum mhi_dev_ring_state {\r\n\tRING_STATE_UINT = 0,\r\n\tRING_STATE_IDLE,\r\n\tRING_STATE_PENDING,\r\n};\r\n\r\nenum mhi_dev_ring_type {\r\n\tRING_TYPE_CMD = 0,\r\n\tRING_TYPE_ER,\r\n\tRING_TYPE_CH,\r\n\tRING_TYPE_INVAL\r\n};\r\n\r\n/* Event context interrupt moderation */\r\nenum mhi_dev_evt_ctx_int_mod_timer {\r\n\tMHI_DEV_EVT_INT_MODERATION_DISABLED\r\n};\r\n\r\n/* Event ring type */\r\nenum mhi_dev_evt_ctx_event_ring_type {\r\n\tMHI_DEV_EVT_TYPE_DEFAULT,\r\n\tMHI_DEV_EVT_TYPE_VALID,\r\n\tMHI_DEV_EVT_RESERVED\r\n};\r\n\r\n/* Event ring context type */\r\nstruct mhi_dev_ev_ctx {\r\n\tuint32_t\t\t\t\tres1:16;\r\n\tenum mhi_dev_evt_ctx_int_mod_timer\tintmodt:16;\r\n\tenum mhi_dev_evt_ctx_event_ring_type\tertype;\r\n\tuint32_t\t\t\t\tmsivec;\r\n\tuint64_t\t\t\t\trbase;\r\n\tuint64_t\t\t\t\trlen;\r\n\tuint64_t\t\t\t\trp;\r\n\tuint64_t\t\t\t\twp;\r\n} __packed;\r\n\r\n/* Command context */\r\nstruct mhi_dev_cmd_ctx {\r\n\tuint32_t\t\t\t\tres1;\r\n\tuint32_t\t\t\t\tres2;\r\n\tuint32_t\t\t\t\tres3;\r\n\tuint64_t\t\t\t\trbase;\r\n\tuint64_t\t\t\t\trlen;\r\n\tuint64_t\t\t\t\trp;\r\n\tuint64_t\t\t\t\twp;\r\n} __packed;\r\n\r\n/* generic context */\r\nstruct mhi_dev_gen_ctx {\r\n\tuint32_t\t\t\t\tres1;\r\n\tuint32_t\t\t\t\tres2;\r\n\tuint32_t\t\t\t\tres3;\r\n\tuint64_t\t\t\t\trbase;\r\n\tuint64_t\t\t\t\trlen;\r\n\tuint64_t\t\t\t\trp;\r\n\tuint64_t\t\t\t\twp;\r\n} __packed;\r\n\r\n/* Transfer ring element */\r\nstruct mhi_dev_transfer_ring_element {\r\n\tuint64_t\t\t\t\tdata_buf_ptr;\r\n\tuint32_t\t\t\t\tlen:16;\r\n\tuint32_t\t\t\t\tres1:16;\r\n\tuint32_t\t\t\t\tchain:1;\r\n\tuint32_t\t\t\t\tres2:7;\r\n\tuint32_t\t\t\t\tieob:1;\r\n\tuint32_t\t\t\t\tieot:1;\r\n\tuint32_t\t\t\t\tbei:1;\r\n\tuint32_t\t\t\t\tres3:5;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tres4:8;\r\n} __packed;\r\n\r\n/* Command ring element */\r\n/* Command ring No op command */\r\nstruct mhi_dev_cmd_ring_op {\r\n\tuint64_t\t\t\t\tres1;\r\n\tuint32_t\t\t\t\tres2;\r\n\tuint32_t\t\t\t\tres3:16;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tchid:8;\r\n} __packed;\r\n\r\n/* Command ring reset channel command */\r\nstruct mhi_dev_cmd_ring_reset_channel_cmd {\r\n\tuint64_t\t\t\t\tres1;\r\n\tuint32_t\t\t\t\tres2;\r\n\tuint32_t\t\t\t\tres3:16;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tchid:8;\r\n} __packed;\r\n\r\n/* Command ring stop channel command */\r\nstruct mhi_dev_cmd_ring_stop_channel_cmd {\r\n\tuint64_t\t\t\t\tres1;\r\n\tuint32_t\t\t\t\tres2;\r\n\tuint32_t\t\t\t\tres3:16;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tchid:8;\r\n} __packed;\r\n\r\n/* Command ring start channel command */\r\nstruct mhi_dev_cmd_ring_start_channel_cmd {\r\n\tuint64_t\t\t\t\tres1;\r\n\tuint32_t\t\t\t\tseqnum;\r\n\tuint32_t\t\t\t\treliable:1;\r\n\tuint32_t\t\t\t\tres2:15;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tchid:8;\r\n} __packed;\r\n\r\nenum mhi_dev_cmd_completion_code {\r\n\tMHI_CMD_COMPL_CODE_INVALID = 0,\r\n\tMHI_CMD_COMPL_CODE_SUCCESS = 1,\r\n\tMHI_CMD_COMPL_CODE_EOT = 2,\r\n\tMHI_CMD_COMPL_CODE_OVERFLOW = 3,\r\n\tMHI_CMD_COMPL_CODE_EOB = 4,\r\n\tMHI_CMD_COMPL_CODE_UNDEFINED = 16,\r\n\tMHI_CMD_COMPL_CODE_RING_EL = 17,\r\n\tMHI_CMD_COMPL_CODE_RES\r\n};\r\n\r\n/* Event ring elements */\r\n/* Transfer completion event */\r\nstruct mhi_dev_event_ring_transfer_completion {\r\n\tuint64_t\t\t\t\tptr;\r\n\tuint32_t\t\t\t\tlen:16;\r\n\tuint32_t\t\t\t\tres1:8;\r\n\tenum mhi_dev_cmd_completion_code\tcode:8;\r\n\tuint32_t\t\t\t\tres2:16;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tchid:8;\r\n} __packed;\r\n\r\n/* Command completion event */\r\nstruct mhi_dev_event_ring_cmd_completion {\r\n\tuint64_t\t\t\t\tptr;\r\n\tuint32_t\t\t\t\tres1:24;\r\n\tenum mhi_dev_cmd_completion_code\tcode:8;\r\n\tuint32_t\t\t\t\tres2:16;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tres3:8;\r\n} __packed;\r\n\r\nenum mhi_dev_state {\r\n\tMHI_DEV_RESET_STATE = 0,\r\n\tMHI_DEV_READY_STATE,\r\n\tMHI_DEV_M0_STATE,\r\n\tMHI_DEV_M1_STATE,\r\n\tMHI_DEV_M2_STATE,\r\n\tMHI_DEV_M3_STATE,\r\n\tMHI_DEV_MAX_STATE,\r\n\tMHI_DEV_SYSERR_STATE = 0xff\r\n};\r\n\r\n/* MHI state change event */\r\nstruct mhi_dev_event_ring_state_change {\r\n\tuint64_t\t\t\t\tptr;\r\n\tuint32_t\t\t\t\tres1:24;\r\n\tenum mhi_dev_state\t\t\tmhistate:8;\r\n\tuint32_t\t\t\t\tres2:16;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tres3:8;\r\n} __packed;\r\n\r\nenum mhi_dev_execenv {\r\n\tMHI_DEV_SBL_EE = 1,\r\n\tMHI_DEV_AMSS_EE = 2,\r\n\tMHI_DEV_UNRESERVED\r\n};\r\n\r\n/* EE state change event */\r\nstruct mhi_dev_event_ring_ee_state_change {\r\n\tuint64_t\t\t\t\tptr;\r\n\tuint32_t\t\t\t\tres1:24;\r\n\tenum mhi_dev_execenv\t\t\texecenv:8;\r\n\tuint32_t\t\t\t\tres2:16;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tres3:8;\r\n} __packed;\r\n\r\n/* Generic cmd to parse common details like type and channel id */\r\nstruct mhi_dev_ring_generic {\r\n\tuint64_t\t\t\t\tptr;\r\n\tuint32_t\t\t\t\tres1:24;\r\n\tenum mhi_dev_state\t\t\tmhistate:8;\r\n\tuint32_t\t\t\t\tres2:16;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tchid:8;\r\n} __packed;\r\n\r\nstruct mhi_config {\r\n\tuint32_t\tmhi_reg_len;\r\n\tuint32_t\tversion;\r\n\tuint32_t\tevent_rings;\r\n\tuint32_t\tchannels;\r\n\tuint32_t\tchdb_offset;\r\n\tuint32_t\terdb_offset;\r\n};\r\n\r\n#define NUM_CHANNELS\t\t\t128\r\n#define HW_CHANNEL_BASE\t\t\t100\r\n#define HW_CHANNEL_END\t\t\t107\r\n#define MHI_ENV_VALUE\t\t\t2\r\n#define MHI_MASK_ROWS_CH_EV_DB\t\t4\r\n#define TRB_MAX_DATA_SIZE\t\t8192\r\n#define MHI_CTRL_STATE\t\t\t25\r\n#define IPA_DMA_SYNC                    1\r\n#define IPA_DMA_ASYNC                   0\r\n\r\n/*maximum trasnfer completion events buffer*/\r\n#define MAX_TR_EVENTS\t\t\t50\r\n/*maximum event requests */\r\n#define MHI_MAX_EVT_REQ\t\t\t50\r\n\r\n/* Possible ring element types */\r\nunion mhi_dev_ring_element_type {\r\n\tstruct mhi_dev_cmd_ring_op\t\t\tcmd_no_op;\r\n\tstruct mhi_dev_cmd_ring_reset_channel_cmd\tcmd_reset;\r\n\tstruct mhi_dev_cmd_ring_stop_channel_cmd\tcmd_stop;\r\n\tstruct mhi_dev_cmd_ring_start_channel_cmd\tcmd_start;\r\n\tstruct mhi_dev_transfer_ring_element\t\tcmd_transfer;\r\n\tstruct mhi_dev_event_ring_transfer_completion\tevt_tr_comp;\r\n\tstruct mhi_dev_event_ring_cmd_completion\tevt_cmd_comp;\r\n\tstruct mhi_dev_event_ring_state_change\t\tevt_state_change;\r\n\tstruct mhi_dev_event_ring_ee_state_change\tevt_ee_state;\r\n\tstruct mhi_dev_ring_generic\t\t\tgeneric;\r\n};\r\n\r\n/* Transfer ring element type */\r\nunion mhi_dev_ring_ctx {\r\n\tstruct mhi_dev_cmd_ctx\t\tcmd;\r\n\tstruct mhi_dev_ev_ctx\t\tev;\r\n\tstruct mhi_dev_ch_ctx\t\tch;\r\n\tstruct mhi_dev_gen_ctx\t\tgeneric;\r\n};\r\n\r\n/* MHI host Control and data address region */\r\nstruct mhi_host_addr {\r\n\tuint32_t\tctrl_base_lsb;\r\n\tuint32_t\tctrl_base_msb;\r\n\tuint32_t\tctrl_limit_lsb;\r\n\tuint32_t\tctrl_limit_msb;\r\n\tuint32_t\tdata_base_lsb;\r\n\tuint32_t\tdata_base_msb;\r\n\tuint32_t\tdata_limit_lsb;\r\n\tuint32_t\tdata_limit_msb;\r\n};\r\n\r\n/* MHI physical and virtual address region */\r\nstruct mhi_meminfo {\r\n\tstruct device\t*dev;\r\n\tuintptr_t\tpa_aligned;\r\n\tuintptr_t\tpa_unaligned;\r\n\tuintptr_t\tva_aligned;\r\n\tuintptr_t\tva_unaligned;\r\n\tuintptr_t\tsize;\r\n};\r\n\r\nstruct mhi_addr {\r\n\tuint64_t\thost_pa;\r\n\tuintptr_t\tdevice_pa;\r\n\tuintptr_t\tdevice_va;\r\n\tsize_t\t\tsize;\r\n\tdma_addr_t\tphy_addr;\r\n\tvoid\t\t*virt_addr;\r\n\tbool\t\tuse_ipa_dma;\r\n};\r\n\r\nstruct mhi_interrupt_state {\r\n\tuint32_t\tmask;\r\n\tuint32_t\tstatus;\r\n};\r\n\r\nenum mhi_dev_channel_state {\r\n\tMHI_DEV_CH_UNINT,\r\n\tMHI_DEV_CH_STARTED,\r\n\tMHI_DEV_CH_PENDING_START,\r\n\tMHI_DEV_CH_PENDING_STOP,\r\n\tMHI_DEV_CH_STOPPED,\r\n\tMHI_DEV_CH_CLOSED,\r\n};\r\n\r\nenum mhi_dev_ch_operation {\r\n\tMHI_DEV_OPEN_CH,\r\n\tMHI_DEV_CLOSE_CH,\r\n\tMHI_DEV_READ_CH,\r\n\tMHI_DEV_READ_WR,\r\n\tMHI_DEV_POLL,\r\n};\r\n\r\nenum mhi_ctrl_info {\r\n\tMHI_STATE_CONFIGURED = 0,\r\n\tMHI_STATE_CONNECTED = 1,\r\n\tMHI_STATE_DISCONNECTED = 2,\r\n\tMHI_STATE_INVAL,\r\n};\r\n\r\nenum mhi_dev_tr_compl_evt_type {\r\n\tSEND_EVENT_BUFFER,\r\n\tSEND_EVENT_RD_OFFSET,\r\n};\r\n\r\nenum mhi_dev_transfer_type {\r\n\tMHI_DEV_DMA_SYNC,\r\n\tMHI_DEV_DMA_ASYNC,\r\n};\r\n#endif /* _SDX20_MHI_H_ */\r\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/core/sdx20_mhi.h",
    "content": "#ifndef __SDX20_MHI_H\r\n#define __SDX20_MHI_H\r\n\r\n#include <linux/types.h>\r\n\r\n/* MHI control data structures alloted by the host, including\r\n * channel context array, event context array, command context and rings */\r\n\r\n/* Channel context state */\r\nenum mhi_dev_ch_ctx_state {\r\n\tMHI_DEV_CH_STATE_DISABLED,\r\n\tMHI_DEV_CH_STATE_ENABLED,\r\n\tMHI_DEV_CH_STATE_RUNNING,\r\n\tMHI_DEV_CH_STATE_SUSPENDED,\r\n\tMHI_DEV_CH_STATE_STOP,\r\n\tMHI_DEV_CH_STATE_ERROR,\r\n\tMHI_DEV_CH_STATE_RESERVED,\r\n\tMHI_DEV_CH_STATE_32BIT = 0x7FFFFFFF\r\n};\r\n\r\n/* Channel type */\r\nenum mhi_dev_ch_ctx_type {\r\n\tMHI_DEV_CH_TYPE_NONE,\r\n\tMHI_DEV_CH_TYPE_OUTBOUND_CHANNEL,\r\n\tMHI_DEV_CH_TYPE_INBOUND_CHANNEL,\r\n\tMHI_DEV_CH_RESERVED\r\n};\r\n\r\n/* Channel context type */\r\nstruct mhi_dev_ch_ctx {\r\n\tenum mhi_dev_ch_ctx_state\tch_state;\r\n\tenum mhi_dev_ch_ctx_type\tch_type;\r\n\tuint32_t\t\t\terr_indx;\r\n\tuint64_t\t\t\trbase;\r\n\tuint64_t\t\t\trlen;\r\n\tuint64_t\t\t\trp;\r\n\tuint64_t\t\t\twp;\r\n} __packed;\r\n\r\nenum mhi_dev_ring_element_type_id {\r\n\tMHI_DEV_RING_EL_INVALID = 0,\r\n\tMHI_DEV_RING_EL_NOOP = 1,\r\n\tMHI_DEV_RING_EL_TRANSFER = 2,\r\n\tMHI_DEV_RING_EL_RESET = 16,\r\n\tMHI_DEV_RING_EL_STOP = 17,\r\n\tMHI_DEV_RING_EL_START = 18,\r\n\tMHI_DEV_RING_EL_MHI_STATE_CHG = 32,\r\n\tMHI_DEV_RING_EL_CMD_COMPLETION_EVT = 33,\r\n\tMHI_DEV_RING_EL_TRANSFER_COMPLETION_EVENT = 34,\r\n\tMHI_DEV_RING_EL_EE_STATE_CHANGE_NOTIFY = 64,\r\n\tMHI_DEV_RING_EL_UNDEF\r\n};\r\n\r\nenum mhi_dev_ring_state {\r\n\tRING_STATE_UINT = 0,\r\n\tRING_STATE_IDLE,\r\n\tRING_STATE_PENDING,\r\n};\r\n\r\nenum mhi_dev_ring_type {\r\n\tRING_TYPE_CMD = 0,\r\n\tRING_TYPE_ER,\r\n\tRING_TYPE_CH,\r\n\tRING_TYPE_INVAL\r\n};\r\n\r\n/* Event context interrupt moderation */\r\nenum mhi_dev_evt_ctx_int_mod_timer {\r\n\tMHI_DEV_EVT_INT_MODERATION_DISABLED\r\n};\r\n\r\n/* Event ring type */\r\nenum mhi_dev_evt_ctx_event_ring_type {\r\n\tMHI_DEV_EVT_TYPE_DEFAULT,\r\n\tMHI_DEV_EVT_TYPE_VALID,\r\n\tMHI_DEV_EVT_RESERVED\r\n};\r\n\r\n/* Event ring context type */\r\nstruct mhi_dev_ev_ctx {\r\n\tuint32_t\t\t\t\tres1:16;\r\n\tenum mhi_dev_evt_ctx_int_mod_timer\tintmodt:16;\r\n\tenum mhi_dev_evt_ctx_event_ring_type\tertype;\r\n\tuint32_t\t\t\t\tmsivec;\r\n\tuint64_t\t\t\t\trbase;\r\n\tuint64_t\t\t\t\trlen;\r\n\tuint64_t\t\t\t\trp;\r\n\tuint64_t\t\t\t\twp;\r\n} __packed;\r\n\r\n/* Command context */\r\nstruct mhi_dev_cmd_ctx {\r\n\tuint32_t\t\t\t\tres1;\r\n\tuint32_t\t\t\t\tres2;\r\n\tuint32_t\t\t\t\tres3;\r\n\tuint64_t\t\t\t\trbase;\r\n\tuint64_t\t\t\t\trlen;\r\n\tuint64_t\t\t\t\trp;\r\n\tuint64_t\t\t\t\twp;\r\n} __packed;\r\n\r\n/* generic context */\r\nstruct mhi_dev_gen_ctx {\r\n\tuint32_t\t\t\t\tres1;\r\n\tuint32_t\t\t\t\tres2;\r\n\tuint32_t\t\t\t\tres3;\r\n\tuint64_t\t\t\t\trbase;\r\n\tuint64_t\t\t\t\trlen;\r\n\tuint64_t\t\t\t\trp;\r\n\tuint64_t\t\t\t\twp;\r\n} __packed;\r\n\r\n/* Transfer ring element */\r\nstruct mhi_dev_transfer_ring_element {\r\n\tuint64_t\t\t\t\tdata_buf_ptr;\r\n\tuint32_t\t\t\t\tlen:16;\r\n\tuint32_t\t\t\t\tres1:16;\r\n\tuint32_t\t\t\t\tchain:1;\r\n\tuint32_t\t\t\t\tres2:7;\r\n\tuint32_t\t\t\t\tieob:1;\r\n\tuint32_t\t\t\t\tieot:1;\r\n\tuint32_t\t\t\t\tbei:1;\r\n\tuint32_t\t\t\t\tres3:5;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tres4:8;\r\n} __packed;\r\n\r\n/* Command ring element */\r\n/* Command ring No op command */\r\nstruct mhi_dev_cmd_ring_op {\r\n\tuint64_t\t\t\t\tres1;\r\n\tuint32_t\t\t\t\tres2;\r\n\tuint32_t\t\t\t\tres3:16;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tchid:8;\r\n} __packed;\r\n\r\n/* Command ring reset channel command */\r\nstruct mhi_dev_cmd_ring_reset_channel_cmd {\r\n\tuint64_t\t\t\t\tres1;\r\n\tuint32_t\t\t\t\tres2;\r\n\tuint32_t\t\t\t\tres3:16;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tchid:8;\r\n} __packed;\r\n\r\n/* Command ring stop channel command */\r\nstruct mhi_dev_cmd_ring_stop_channel_cmd {\r\n\tuint64_t\t\t\t\tres1;\r\n\tuint32_t\t\t\t\tres2;\r\n\tuint32_t\t\t\t\tres3:16;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tchid:8;\r\n} __packed;\r\n\r\n/* Command ring start channel command */\r\nstruct mhi_dev_cmd_ring_start_channel_cmd {\r\n\tuint64_t\t\t\t\tres1;\r\n\tuint32_t\t\t\t\tseqnum;\r\n\tuint32_t\t\t\t\treliable:1;\r\n\tuint32_t\t\t\t\tres2:15;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tchid:8;\r\n} __packed;\r\n\r\nenum mhi_dev_cmd_completion_code {\r\n\tMHI_CMD_COMPL_CODE_INVALID = 0,\r\n\tMHI_CMD_COMPL_CODE_SUCCESS = 1,\r\n\tMHI_CMD_COMPL_CODE_EOT = 2,\r\n\tMHI_CMD_COMPL_CODE_OVERFLOW = 3,\r\n\tMHI_CMD_COMPL_CODE_EOB = 4,\r\n\tMHI_CMD_COMPL_CODE_UNDEFINED = 16,\r\n\tMHI_CMD_COMPL_CODE_RING_EL = 17,\r\n\tMHI_CMD_COMPL_CODE_RES\r\n};\r\n\r\n/* Event ring elements */\r\n/* Transfer completion event */\r\nstruct mhi_dev_event_ring_transfer_completion {\r\n\tuint64_t\t\t\t\tptr;\r\n\tuint32_t\t\t\t\tlen:16;\r\n\tuint32_t\t\t\t\tres1:8;\r\n\tenum mhi_dev_cmd_completion_code\tcode:8;\r\n\tuint32_t\t\t\t\tres2:16;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tchid:8;\r\n} __packed;\r\n\r\n/* Command completion event */\r\nstruct mhi_dev_event_ring_cmd_completion {\r\n\tuint64_t\t\t\t\tptr;\r\n\tuint32_t\t\t\t\tres1:24;\r\n\tenum mhi_dev_cmd_completion_code\tcode:8;\r\n\tuint32_t\t\t\t\tres2:16;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tres3:8;\r\n} __packed;\r\n\r\nenum mhi_dev_state {\r\n\tMHI_DEV_RESET_STATE = 0,\r\n\tMHI_DEV_READY_STATE,\r\n\tMHI_DEV_M0_STATE,\r\n\tMHI_DEV_M1_STATE,\r\n\tMHI_DEV_M2_STATE,\r\n\tMHI_DEV_M3_STATE,\r\n\tMHI_DEV_MAX_STATE,\r\n\tMHI_DEV_SYSERR_STATE = 0xff\r\n};\r\n\r\n/* MHI state change event */\r\nstruct mhi_dev_event_ring_state_change {\r\n\tuint64_t\t\t\t\tptr;\r\n\tuint32_t\t\t\t\tres1:24;\r\n\tenum mhi_dev_state\t\t\tmhistate:8;\r\n\tuint32_t\t\t\t\tres2:16;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tres3:8;\r\n} __packed;\r\n\r\nenum mhi_dev_execenv {\r\n\tMHI_DEV_SBL_EE = 1,\r\n\tMHI_DEV_AMSS_EE = 2,\r\n\tMHI_DEV_UNRESERVED\r\n};\r\n\r\n/* EE state change event */\r\nstruct mhi_dev_event_ring_ee_state_change {\r\n\tuint64_t\t\t\t\tptr;\r\n\tuint32_t\t\t\t\tres1:24;\r\n\tenum mhi_dev_execenv\t\t\texecenv:8;\r\n\tuint32_t\t\t\t\tres2:16;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tres3:8;\r\n} __packed;\r\n\r\n/* Generic cmd to parse common details like type and channel id */\r\nstruct mhi_dev_ring_generic {\r\n\tuint64_t\t\t\t\tptr;\r\n\tuint32_t\t\t\t\tres1:24;\r\n\tenum mhi_dev_state\t\t\tmhistate:8;\r\n\tuint32_t\t\t\t\tres2:16;\r\n\tenum mhi_dev_ring_element_type_id\ttype:8;\r\n\tuint32_t\t\t\t\tchid:8;\r\n} __packed;\r\n\r\nstruct mhi_config {\r\n\tuint32_t\tmhi_reg_len;\r\n\tuint32_t\tversion;\r\n\tuint32_t\tevent_rings;\r\n\tuint32_t\tchannels;\r\n\tuint32_t\tchdb_offset;\r\n\tuint32_t\terdb_offset;\r\n};\r\n\r\n#define NUM_CHANNELS\t\t\t128\r\n#define HW_CHANNEL_BASE\t\t\t100\r\n#define HW_CHANNEL_END\t\t\t107\r\n#define MHI_ENV_VALUE\t\t\t2\r\n#define MHI_MASK_ROWS_CH_EV_DB\t\t4\r\n#define TRB_MAX_DATA_SIZE\t\t8192\r\n#define MHI_CTRL_STATE\t\t\t25\r\n#define IPA_DMA_SYNC                    1\r\n#define IPA_DMA_ASYNC                   0\r\n\r\n/*maximum trasnfer completion events buffer*/\r\n#define MAX_TR_EVENTS\t\t\t50\r\n/*maximum event requests */\r\n#define MHI_MAX_EVT_REQ\t\t\t50\r\n\r\n/* Possible ring element types */\r\nunion mhi_dev_ring_element_type {\r\n\tstruct mhi_dev_cmd_ring_op\t\t\tcmd_no_op;\r\n\tstruct mhi_dev_cmd_ring_reset_channel_cmd\tcmd_reset;\r\n\tstruct mhi_dev_cmd_ring_stop_channel_cmd\tcmd_stop;\r\n\tstruct mhi_dev_cmd_ring_start_channel_cmd\tcmd_start;\r\n\tstruct mhi_dev_transfer_ring_element\t\ttre;\r\n\tstruct mhi_dev_event_ring_transfer_completion\tevt_tr_comp;\r\n\tstruct mhi_dev_event_ring_cmd_completion\tevt_cmd_comp;\r\n\tstruct mhi_dev_event_ring_state_change\t\tevt_state_change;\r\n\tstruct mhi_dev_event_ring_ee_state_change\tevt_ee_state;\r\n\tstruct mhi_dev_ring_generic\t\t\tgeneric;\r\n};\r\n\r\n/* Transfer ring element type */\r\nunion mhi_dev_ring_ctx {\r\n\tstruct mhi_dev_cmd_ctx\t\tcmd;\r\n\tstruct mhi_dev_ev_ctx\t\tev;\r\n\tstruct mhi_dev_ch_ctx\t\tch;\r\n\tstruct mhi_dev_gen_ctx\t\tgeneric;\r\n};\r\n\r\n/* MHI host Control and data address region */\r\nstruct mhi_host_addr {\r\n\tuint32_t\tctrl_base_lsb;\r\n\tuint32_t\tctrl_base_msb;\r\n\tuint32_t\tctrl_limit_lsb;\r\n\tuint32_t\tctrl_limit_msb;\r\n\tuint32_t\tdata_base_lsb;\r\n\tuint32_t\tdata_base_msb;\r\n\tuint32_t\tdata_limit_lsb;\r\n\tuint32_t\tdata_limit_msb;\r\n};\r\n\r\n/* MHI physical and virtual address region */\r\nstruct mhi_meminfo {\r\n\tstruct device\t*dev;\r\n\tuintptr_t\tpa_aligned;\r\n\tuintptr_t\tpa_unaligned;\r\n\tuintptr_t\tva_aligned;\r\n\tuintptr_t\tva_unaligned;\r\n\tuintptr_t\tsize;\r\n};\r\n\r\nstruct mhi_addr {\r\n\tuint64_t\thost_pa;\r\n\tuintptr_t\tdevice_pa;\r\n\tuintptr_t\tdevice_va;\r\n\tsize_t\t\tsize;\r\n\tdma_addr_t\tphy_addr;\r\n\tvoid\t\t*virt_addr;\r\n\tbool\t\tuse_ipa_dma;\r\n};\r\n\r\nstruct mhi_interrupt_state {\r\n\tuint32_t\tmask;\r\n\tuint32_t\tstatus;\r\n};\r\n\r\nenum mhi_dev_channel_state {\r\n\tMHI_DEV_CH_UNINT,\r\n\tMHI_DEV_CH_STARTED,\r\n\tMHI_DEV_CH_PENDING_START,\r\n\tMHI_DEV_CH_PENDING_STOP,\r\n\tMHI_DEV_CH_STOPPED,\r\n\tMHI_DEV_CH_CLOSED,\r\n};\r\n\r\nenum mhi_dev_ch_operation {\r\n\tMHI_DEV_OPEN_CH,\r\n\tMHI_DEV_CLOSE_CH,\r\n\tMHI_DEV_READ_CH,\r\n\tMHI_DEV_READ_WR,\r\n\tMHI_DEV_POLL,\r\n};\r\n\r\nenum mhi_ctrl_info {\r\n\tMHI_STATE_CONFIGURED = 0,\r\n\tMHI_STATE_CONNECTED = 1,\r\n\tMHI_STATE_DISCONNECTED = 2,\r\n\tMHI_STATE_INVAL,\r\n};\r\n\r\nenum mhi_dev_tr_compl_evt_type {\r\n\tSEND_EVENT_BUFFER,\r\n\tSEND_EVENT_RD_OFFSET,\r\n};\r\n\r\nenum mhi_dev_transfer_type {\r\n\tMHI_DEV_DMA_SYNC,\r\n\tMHI_DEV_DMA_ASYNC,\r\n};\r\n\r\n#if 0\r\n/* SW channel client list */\r\nenum mhi_client_channel {\r\n\tMHI_CLIENT_LOOPBACK_OUT = 0,\r\n\tMHI_CLIENT_LOOPBACK_IN = 1,\r\n\tMHI_CLIENT_SAHARA_OUT = 2,\r\n\tMHI_CLIENT_SAHARA_IN = 3,\r\n\tMHI_CLIENT_DIAG_OUT = 4,\r\n\tMHI_CLIENT_DIAG_IN = 5,\r\n\tMHI_CLIENT_SSR_OUT = 6,\r\n\tMHI_CLIENT_SSR_IN = 7,\r\n\tMHI_CLIENT_QDSS_OUT = 8,\r\n\tMHI_CLIENT_QDSS_IN = 9,\r\n\tMHI_CLIENT_EFS_OUT = 10,\r\n\tMHI_CLIENT_EFS_IN = 11,\r\n\tMHI_CLIENT_MBIM_OUT = 12,\r\n\tMHI_CLIENT_MBIM_IN = 13,\r\n\tMHI_CLIENT_QMI_OUT = 14,\r\n\tMHI_CLIENT_QMI_IN = 15,\r\n\tMHI_CLIENT_IP_CTRL_0_OUT = 16,\r\n\tMHI_CLIENT_IP_CTRL_0_IN = 17,\r\n\tMHI_CLIENT_IP_CTRL_1_OUT = 18,\r\n\tMHI_CLIENT_IP_CTRL_1_IN = 19,\r\n\tMHI_CLIENT_DCI_OUT = 20,\r\n\tMHI_CLIENT_DCI_IN = 21,\r\n\tMHI_CLIENT_IP_CTRL_3_OUT = 22,\r\n\tMHI_CLIENT_IP_CTRL_3_IN = 23,\r\n\tMHI_CLIENT_IP_CTRL_4_OUT = 24,\r\n\tMHI_CLIENT_IP_CTRL_4_IN = 25,\r\n\tMHI_CLIENT_IP_CTRL_5_OUT = 26,\r\n\tMHI_CLIENT_IP_CTRL_5_IN = 27,\r\n\tMHI_CLIENT_IP_CTRL_6_OUT = 28,\r\n\tMHI_CLIENT_IP_CTRL_6_IN = 29,\r\n\tMHI_CLIENT_IP_CTRL_7_OUT = 30,\r\n\tMHI_CLIENT_IP_CTRL_7_IN = 31,\r\n\tMHI_CLIENT_DUN_OUT = 32,\r\n\tMHI_CLIENT_DUN_IN = 33,\r\n\tMHI_CLIENT_IP_SW_0_OUT = 34,\r\n\tMHI_CLIENT_IP_SW_0_IN = 35,\r\n\tMHI_CLIENT_IP_SW_1_OUT = 36,\r\n\tMHI_CLIENT_IP_SW_1_IN = 37,\r\n\tMHI_CLIENT_IP_SW_2_OUT = 38,\r\n\tMHI_CLIENT_IP_SW_2_IN = 39,\r\n\tMHI_CLIENT_IP_SW_3_OUT = 40,\r\n\tMHI_CLIENT_IP_SW_3_IN = 41,\r\n\tMHI_CLIENT_CSVT_OUT = 42,\r\n\tMHI_CLIENT_CSVT_IN = 43,\r\n\tMHI_CLIENT_SMCT_OUT = 44,\r\n\tMHI_CLIENT_SMCT_IN = 45,\r\n\tMHI_CLIENT_IP_SW_4_OUT  = 46,\r\n\tMHI_CLIENT_IP_SW_4_IN  = 47,\r\n\tMHI_MAX_SOFTWARE_CHANNELS = 48,\r\n\tMHI_CLIENT_TEST_OUT = 60,\r\n\tMHI_CLIENT_TEST_IN = 61,\r\n\tMHI_CLIENT_RESERVED_1_LOWER = 62,\r\n\tMHI_CLIENT_RESERVED_1_UPPER = 99,\r\n\tMHI_CLIENT_IP_HW_0_OUT = 100,\r\n\tMHI_CLIENT_IP_HW_0_IN = 101,\r\n\tMHI_CLIENT_RESERVED_2_LOWER = 102,\r\n\tMHI_CLIENT_RESERVED_2_UPPER = 127,\r\n\tMHI_MAX_CHANNELS = 102,\r\n};\r\n#endif\r\n#endif /* _SDX20_MHI_H_ */\r\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/devices/Kconfig",
    "content": "menu \"MHI device support\"\n\nconfig MHI_NETDEV\n       tristate \"MHI NETDEV\"\n       depends on MHI_BUS\n       help\n\t  MHI based net device driver for transferring IP traffic\n\t  between host and modem. By enabling this driver, clients\n\t  can transfer data using standard network interface. Over\n\t  the air traffic goes thru mhi netdev interface.\n\nconfig MHI_UCI\n       tristate \"MHI UCI\"\n       depends on MHI_BUS\n       help\n\t  MHI based uci driver is for transferring data between host and\n\t  modem using standard file operations from user space. Open, read,\n\t  write, ioctl, and close operations are supported by this driver.\n\t  Please check mhi_uci_match_table for all supported channels that\n\t  are exposed to userspace.\n\nconfig MHI_SATELLITE\n       tristate \"MHI SATELLITE\"\n       depends on MHI_BUS\n       help\n\t  MHI proxy satellite device driver enables NON-HLOS MHI satellite\n\t  drivers to communicate with device over PCIe link without host\n\t  involvement. Host facilitates propagation of events from device\n\t  to NON-HLOS MHI satellite drivers, channel states, and power\n\t  management over IPC communication. It helps in HLOS power\n\t  savings.\n\nendmenu\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/devices/Makefile",
    "content": "obj-$(CONFIG_MHI_NETDEV) +=mhi_netdev.o\nobj-$(CONFIG_MHI_UCI) +=mhi_uci.o\nobj-$(CONFIG_MHI_SATELLITE) +=mhi_satellite.o\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/devices/mhi_netdev.c",
    "content": "// SPDX-License-Identifier: GPL-2.0-only\n/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.*/\n\n#include <linux/module.h>\n#include <linux/kernel.h>\n#include <linux/netdevice.h>\n#include <linux/skbuff.h>\n//#include <linux/msm_rmnet.h>\n#include <linux/if_arp.h>\n#include <linux/dma-mapping.h>\n#include <linux/debugfs.h>\n//#include <linux/ipc_logging.h>\n#if 1\nstatic inline void *ipc_log_context_create(int max_num_pages,\n        const char *modname, uint16_t user_version)\n{ return NULL; }\nstatic inline int ipc_log_string(void *ilctxt, const char *fmt, ...)\n{ return -EINVAL; }\n#endif\n#include <linux/device.h>\n#include <linux/errno.h>\n#include <linux/of_device.h>\n#include <linux/rtnetlink.h>\n#include <linux/etherdevice.h>\n#include \"../core/mhi.h\"\n\n#define QUECTEL_NO_DTS\n\nextern void rmnet_data_init(struct net_device *real_dev, u32 nr_rmnet_devs);\nextern void rmnet_data_deinit(struct net_device *real_dev, u32 nr_rmnet_devs);\n\t\nstatic const unsigned char node_id[ETH_ALEN] = {0x02, 0x50, 0xf4, 0x00, 0x00, 0x00};\nstatic const unsigned char default_modem_addr[ETH_ALEN] = {0x02, 0x50, 0xf3, 0x00, 0x00, 0x00};\nstatic void qmap_hex_dump(const char *tag, unsigned char *data, unsigned len) {\n\tuint i;\n\tuint *d = (uint *)data;\n\n\tprintk(KERN_DEBUG \"%s data=%p, len=%x\\n\", tag, data, len);\n\tlen = (len+3)/4;\n\tfor (i = 0; i < len; i+=4) {\n\t\tprintk(KERN_DEBUG \"%08x %08x %08x %08x %08x\\n\", i*4, d[i+0], d[i+1], d[i+2], d[i+3]);\n\t}\n}\n\n#define MHI_NETDEV_DRIVER_NAME \"mhi_netdev\"\n#define WATCHDOG_TIMEOUT (30 * HZ)\n#define IPC_LOG_PAGES (100)\n#define MAX_NETBUF_SIZE (128)\n\n#ifdef CONFIG_MHI_DEBUG\n\n#define IPC_LOG_LVL (MHI_MSG_LVL_VERBOSE)\n\n#define MHI_ASSERT(cond, msg) do { \\\n\tif (cond) \\\n\t\tpanic(msg); \\\n} while (0)\n\n#define MSG_VERB(fmt, ...) do { \\\n\tif (mhi_netdev->msg_lvl <= MHI_MSG_LVL_VERBOSE) \\\n\t\tpr_err(\"[D][%s] \" fmt, __func__, ##__VA_ARGS__);\\\n\tif (mhi_netdev->ipc_log && (mhi_netdev->ipc_log_lvl <= \\\n\t\t\t\t    MHI_MSG_LVL_VERBOSE)) \\\n\t\tipc_log_string(mhi_netdev->ipc_log, \"[D][%s] \" fmt, \\\n\t\t\t       __func__, ##__VA_ARGS__); \\\n} while (0)\n\n#else\n\n#define IPC_LOG_LVL (MHI_MSG_LVL_ERROR)\n\n#define MHI_ASSERT(cond, msg) do { \\\n\tif (cond) { \\\n\t\tMSG_ERR(msg); \\\n\t\tWARN_ON(cond); \\\n\t} \\\n} while (0)\n\n#define MSG_VERB(fmt, ...)\n\n#endif\n\n#define MSG_LOG(fmt, ...) do { \\\n\tif (mhi_netdev->msg_lvl <= MHI_MSG_LVL_INFO) \\\n\t\tpr_err(\"[I][%s] \" fmt, __func__, ##__VA_ARGS__);\\\n\tif (mhi_netdev->ipc_log && (mhi_netdev->ipc_log_lvl <= \\\n\t\t\t\t    MHI_MSG_LVL_INFO)) \\\n\t\tipc_log_string(mhi_netdev->ipc_log, \"[I][%s] \" fmt, \\\n\t\t\t       __func__, ##__VA_ARGS__); \\\n} while (0)\n\n#define MSG_ERR(fmt, ...) do { \\\n\tif (mhi_netdev->msg_lvl <= MHI_MSG_LVL_ERROR) \\\n\t\tpr_err(\"[E][%s] \" fmt, __func__, ##__VA_ARGS__); \\\n\tif (mhi_netdev->ipc_log && (mhi_netdev->ipc_log_lvl <= \\\n\t\t\t\t    MHI_MSG_LVL_ERROR)) \\\n\t\tipc_log_string(mhi_netdev->ipc_log, \"[E][%s] \" fmt, \\\n\t\t\t       __func__, ##__VA_ARGS__); \\\n} while (0)\n\nstruct mhi_net_chain {\n\tstruct sk_buff *head, *tail; /* chained skb */\n};\n\nstruct mhi_netdev {\n\tint alias;\n\tstruct mhi_device *mhi_dev;\n\tstruct mhi_netdev *rsc_dev; /* rsc linked node */\n\tbool is_rsc_dev;\n\tint wake;\n\n\tu32 mru;\n\tu32 order;\n\tconst char *interface_name;\n\tstruct napi_struct *napi;\n\tstruct net_device *ndev;\n\tbool ethernet_interface;\n\n\tstruct mhi_netbuf **netbuf_pool;\n\tint pool_size; /* must be power of 2 */\n\tint current_index;\n\tbool chain_skb;\n\tstruct mhi_net_chain *chain;\n\n\tstruct dentry *dentry;\n\tenum MHI_DEBUG_LEVEL msg_lvl;\n\tenum MHI_DEBUG_LEVEL ipc_log_lvl;\n\tvoid *ipc_log;\n\n\t//struct rmnet_port port;\n};\n\nstruct mhi_netdev_priv {\n\tstruct mhi_netdev *mhi_netdev;\n};\n\n/* Try not to make this structure bigger than 128 bytes, since this take space\n * in payload packet.\n * Example: If MRU = 16K, effective MRU = 16K - sizeof(mhi_netbuf)\n */\nstruct mhi_netbuf {\n\tstruct mhi_buf mhi_buf; /* this must be first element */\n\tvoid (*unmap)(struct device *dev, dma_addr_t addr, size_t size,\n\t\t      enum dma_data_direction dir);\n};\n\nstatic struct mhi_driver mhi_netdev_driver;\nstatic void mhi_netdev_create_debugfs(struct mhi_netdev *mhi_netdev);\n\nstatic __be16 mhi_netdev_ip_type_trans(u8 data)\n{\n\t__be16 protocol = 0;\n\n\t/* determine L3 protocol */\n\tswitch (data & 0xf0) {\n\tcase 0x40:\n\t\tprotocol = htons(ETH_P_IP);\n\t\tbreak;\n\tcase 0x60:\n\t\tprotocol = htons(ETH_P_IPV6);\n\t\tbreak;\n\tdefault:\n\t\t/* default is QMAP */\n\t\tprotocol = htons(ETH_P_MAP);\n\t\tbreak;\n\t}\n\tprotocol = htons(ETH_P_MAP); //carl.yin fix set\n\treturn protocol;\n}\n\nstatic struct mhi_netbuf *mhi_netdev_alloc(struct device *dev,\n\t\t\t\t\t   gfp_t gfp,\n\t\t\t\t\t   unsigned int order)\n{\n\tstruct page *page;\n\tstruct mhi_netbuf *netbuf;\n\tstruct mhi_buf *mhi_buf;\n\tvoid *vaddr;\n\n\tpage = __dev_alloc_pages(gfp, order);\n\tif (!page)\n\t\treturn NULL;\n\n\tvaddr = page_address(page);\n\n\t/* we going to use the end of page to store cached data */\n\tnetbuf = vaddr + (PAGE_SIZE << order) - sizeof(*netbuf);\n\n\tmhi_buf = (struct mhi_buf *)netbuf;\n\tmhi_buf->page = page;\n\tmhi_buf->buf = vaddr;\n\tmhi_buf->len = (void *)netbuf - vaddr;\n\tmhi_buf->dma_addr = dma_map_page(dev, page, 0, mhi_buf->len,\n\t\t\t\t\t DMA_FROM_DEVICE);\n\tif (dma_mapping_error(dev, mhi_buf->dma_addr)) {\n\t\t__free_pages(mhi_buf->page, order);\n\t\treturn NULL;\n\t}\n\n\treturn netbuf;\n}\n\nstatic void mhi_netdev_unmap_page(struct device *dev,\n\t\t\t\t  dma_addr_t dma_addr,\n\t\t\t\t  size_t len,\n\t\t\t\t  enum dma_data_direction dir)\n{\n\tdma_unmap_page(dev, dma_addr, len, dir);\n}\n\nstatic int mhi_netdev_tmp_alloc(struct mhi_netdev *mhi_netdev, int nr_tre)\n{\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\tstruct device *dev = mhi_dev->dev.parent;\n\tconst u32 order = mhi_netdev->order;\n\tint i, ret;\n\n\tfor (i = 0; i < nr_tre; i++) {\n\t\tstruct mhi_buf *mhi_buf;\n\t\tstruct mhi_netbuf *netbuf = mhi_netdev_alloc(dev, GFP_ATOMIC,\n\t\t\t\t\t\t\t     order);\n\t\tif (!netbuf)\n\t\t\treturn -ENOMEM;\n\n\t\tmhi_buf = (struct mhi_buf *)netbuf;\n\t\tnetbuf->unmap = mhi_netdev_unmap_page;\n\n\t\tret = mhi_queue_transfer(mhi_dev, DMA_FROM_DEVICE, mhi_buf,\n\t\t\t\t\t mhi_buf->len, MHI_EOT);\n\t\tif (unlikely(ret)) {\n\t\t\tMSG_ERR(\"Failed to queue transfer, ret:%d\\n\", ret);\n\t\t\tmhi_netdev_unmap_page(dev, mhi_buf->dma_addr,\n\t\t\t\t\t      mhi_buf->len, DMA_FROM_DEVICE);\n\t\t\t__free_pages(mhi_buf->page, order);\n\t\t\treturn ret;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\nstatic void mhi_netdev_queue(struct mhi_netdev *mhi_netdev)\n{\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\tstruct device *dev = mhi_dev->dev.parent;\n\tstruct mhi_netbuf *netbuf;\n\tstruct mhi_buf *mhi_buf;\n\tstruct mhi_netbuf **netbuf_pool = mhi_netdev->netbuf_pool;\n\tint nr_tre = mhi_get_no_free_descriptors(mhi_dev, DMA_FROM_DEVICE);\n\tint i, peak, cur_index, ret;\n\tconst int pool_size = mhi_netdev->pool_size - 1, max_peak = 4;\n\n\tMSG_VERB(\"Enter free_desc:%d\\n\", nr_tre);\n\n\tif (!nr_tre)\n\t\treturn;\n\n\t/* try going thru reclaim pool first */\n\tfor (i = 0; i < nr_tre; i++) {\n\t\t/* peak for the next buffer, we going to peak several times,\n\t\t * and we going to give up if buffers are not yet free\n\t\t */\n\t\tcur_index = mhi_netdev->current_index;\n\t\tnetbuf = NULL;\n\t\tfor (peak = 0; peak < max_peak; peak++) {\n\t\t\tstruct mhi_netbuf *tmp = netbuf_pool[cur_index];\n\n\t\t\tmhi_buf = &tmp->mhi_buf;\n\n\t\t\tcur_index = (cur_index + 1) & pool_size;\n\n\t\t\t/* page == 1 idle, buffer is free to reclaim */\n\t\t\tif (page_count(mhi_buf->page) == 1) {\n\t\t\t\tnetbuf = tmp;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t/* could not find a free buffer */\n\t\tif (!netbuf)\n\t\t\tbreak;\n\n\t\t/* increment reference count so when network stack is done\n\t\t * with buffer, the buffer won't be freed\n\t\t */\n\t\tget_page(mhi_buf->page);\n\t\tdma_sync_single_for_device(dev, mhi_buf->dma_addr, mhi_buf->len,\n\t\t\t\t\t   DMA_FROM_DEVICE);\n\t\tret = mhi_queue_transfer(mhi_dev, DMA_FROM_DEVICE, mhi_buf,\n\t\t\t\t\t mhi_buf->len, MHI_EOT);\n\t\tif (unlikely(ret)) {\n\t\t\tMSG_ERR(\"Failed to queue buffer, ret:%d\\n\", ret);\n\t\t\tnetbuf->unmap(dev, mhi_buf->dma_addr, mhi_buf->len,\n\t\t\t\t      DMA_FROM_DEVICE);\n\t\t\tput_page(mhi_buf->page);\n\t\t\treturn;\n\t\t}\n\t\tmhi_netdev->current_index = cur_index;\n\t}\n\n\t/* recyling did not work, buffers are still busy allocate temp pkts */\n\tif (i < nr_tre)\n\t\tmhi_netdev_tmp_alloc(mhi_netdev, nr_tre - i);\n}\n\n/* allocating pool of memory */\nstatic int mhi_netdev_alloc_pool(struct mhi_netdev *mhi_netdev)\n{\n\tint i;\n\tstruct mhi_netbuf *netbuf, **netbuf_pool;\n\tstruct mhi_buf *mhi_buf;\n\tconst u32 order = mhi_netdev->order;\n\tstruct device *dev = mhi_netdev->mhi_dev->dev.parent;\n\n\tnetbuf_pool = kmalloc_array(mhi_netdev->pool_size, sizeof(*netbuf_pool),\n\t\t\t\t    GFP_KERNEL);\n\tif (!netbuf_pool)\n\t\treturn -ENOMEM;\n\n\tfor (i = 0; i < mhi_netdev->pool_size; i++) {\n\t\t/* allocate paged data */\n\t\tnetbuf = mhi_netdev_alloc(dev, GFP_KERNEL, order);\n\t\tif (!netbuf)\n\t\t\tgoto error_alloc_page;\n\n\t\tnetbuf->unmap = dma_sync_single_for_cpu;\n\t\tnetbuf_pool[i] = netbuf;\n\t}\n\n\tmhi_netdev->netbuf_pool = netbuf_pool;\n\n\treturn 0;\n\nerror_alloc_page:\n\tfor (--i; i >= 0; i--) {\n\t\tnetbuf = netbuf_pool[i];\n\t\tmhi_buf = &netbuf->mhi_buf;\n\t\tdma_unmap_page(dev, mhi_buf->dma_addr, mhi_buf->len,\n\t\t\t       DMA_FROM_DEVICE);\n\t\t__free_pages(mhi_buf->page, order);\n\t}\n\n\tkfree(netbuf_pool);\n\n\treturn -ENOMEM;\n}\n\nstatic void mhi_netdev_free_pool(struct mhi_netdev *mhi_netdev)\n{\n\tint i;\n\tstruct mhi_netbuf *netbuf, **netbuf_pool = mhi_netdev->netbuf_pool;\n\tstruct device *dev = mhi_netdev->mhi_dev->dev.parent;\n\tstruct mhi_buf *mhi_buf;\n\n\tfor (i = 0; i < mhi_netdev->pool_size; i++) {\n\t\tnetbuf = netbuf_pool[i];\n\t\tmhi_buf = &netbuf->mhi_buf;\n\t\tdma_unmap_page(dev, mhi_buf->dma_addr, mhi_buf->len,\n\t\t\t       DMA_FROM_DEVICE);\n\t\t__free_pages(mhi_buf->page, mhi_netdev->order);\n\t}\n\n\tkfree(mhi_netdev->netbuf_pool);\n\tmhi_netdev->netbuf_pool = NULL;\n}\n\nstatic int mhi_netdev_poll(struct napi_struct *napi, int budget)\n{\n\tstruct net_device *dev = napi->dev;\n\tstruct mhi_netdev_priv *mhi_netdev_priv = netdev_priv(dev);\n\tstruct mhi_netdev *mhi_netdev = mhi_netdev_priv->mhi_netdev;\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\tstruct mhi_netdev *rsc_dev = mhi_netdev->rsc_dev;\n\tstruct mhi_net_chain *chain = mhi_netdev->chain;\n\tint rx_work = 0;\n\n\tMSG_VERB(\"Entered\\n\");\n\n\trx_work = mhi_poll(mhi_dev, budget);\n\n\t/* chained skb, push it to stack */\n\tif (chain && chain->head) {\n\t\tnetif_receive_skb(chain->head);\n\t\tchain->head = NULL;\n\t}\n\n\tif (rx_work < 0) {\n\t\tMSG_ERR(\"Error polling ret:%d\\n\", rx_work);\n\t\tnapi_complete(napi);\n\t\treturn 0;\n\t}\n\n\t/* queue new buffers */\n\tmhi_netdev_queue(mhi_netdev);\n\n\tif (rsc_dev)\n\t\tmhi_netdev_queue(rsc_dev);\n\n\t/* complete work if # of packet processed less than allocated budget */\n\tif (rx_work < budget)\n\t\tnapi_complete(napi);\n\n\tMSG_VERB(\"polled %d pkts\\n\", rx_work);\n\n\treturn rx_work;\n}\n\nstatic int mhi_netdev_open(struct net_device *dev)\n{\n\tstruct mhi_netdev_priv *mhi_netdev_priv = netdev_priv(dev);\n\tstruct mhi_netdev *mhi_netdev = mhi_netdev_priv->mhi_netdev;\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\n\tMSG_LOG(\"Opened net dev interface\\n\");\n\n\t/* tx queue may not necessarily be stopped already\n\t * so stop the queue if tx path is not enabled\n\t */\n\tif (!mhi_dev->ul_chan)\n\t\tnetif_stop_queue(dev);\n\telse\n\t\tnetif_start_queue(dev);\n\n\treturn 0;\n\n}\n\nstatic int mhi_netdev_change_mtu(struct net_device *dev, int new_mtu)\n{\n\tstruct mhi_netdev_priv *mhi_netdev_priv = netdev_priv(dev);\n\tstruct mhi_netdev *mhi_netdev = mhi_netdev_priv->mhi_netdev;\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\n\tif (new_mtu < 0 || mhi_dev->mtu < new_mtu)\n\t\treturn -EINVAL;\n\n\tdev->mtu = new_mtu;\n\treturn 0;\n}\n\nstatic int mhi_netdev_xmit(struct sk_buff *skb, struct net_device *dev)\n{\n\tstruct mhi_netdev_priv *mhi_netdev_priv = netdev_priv(dev);\n\tstruct mhi_netdev *mhi_netdev = mhi_netdev_priv->mhi_netdev;\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\tint res = 0;\n\n\tMSG_VERB(\"Entered\\n\");\n\n\t//printk(\"%s skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n\t//qmap_hex_dump(__func__, skb->data, 32);\n\tif (skb->protocol != htons(ETH_P_MAP)) {\n\t\tdev_kfree_skb_any(skb);\n\t\treturn NETDEV_TX_OK;\n\t}\n\n\tres = mhi_queue_transfer(mhi_dev, DMA_TO_DEVICE, skb, skb->len,\n\t\t\t\t MHI_EOT);\n\tif (res) {\n\t\tMSG_VERB(\"Failed to queue with reason:%d\\n\", res);\n\t\tnetif_stop_queue(dev);\n\t\tres = NETDEV_TX_BUSY;\n\t}\n\n\tMSG_VERB(\"Exited\\n\");\n\n\treturn res;\n}\n\n#if 0\nstatic int mhi_netdev_ioctl_extended(struct net_device *dev, struct ifreq *ifr)\n{\n\tstruct rmnet_ioctl_extended_s ext_cmd;\n\tint rc = 0;\n\tstruct mhi_netdev_priv *mhi_netdev_priv = netdev_priv(dev);\n\tstruct mhi_netdev *mhi_netdev = mhi_netdev_priv->mhi_netdev;\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\n\trc = copy_from_user(&ext_cmd, ifr->ifr_ifru.ifru_data,\n\t\t\t    sizeof(struct rmnet_ioctl_extended_s));\n\tif (rc)\n\t\treturn rc;\n\n\tswitch (ext_cmd.extended_ioctl) {\n\tcase RMNET_IOCTL_GET_SUPPORTED_FEATURES:\n\t\text_cmd.u.data = 0;\n\t\tbreak;\n\tcase RMNET_IOCTL_GET_DRIVER_NAME:\n\t\tstrlcpy(ext_cmd.u.if_name, mhi_netdev->interface_name,\n\t\t\tsizeof(ext_cmd.u.if_name));\n\t\tbreak;\n\tcase RMNET_IOCTL_SET_SLEEP_STATE:\n\t\tif (ext_cmd.u.data && mhi_netdev->wake) {\n\t\t\t/* Request to enable LPM */\n\t\t\tMSG_VERB(\"Enable MHI LPM\");\n\t\t\tmhi_netdev->wake--;\n\t\t\tmhi_device_put(mhi_dev);\n\t\t} else if (!ext_cmd.u.data && !mhi_netdev->wake) {\n\t\t\t/* Request to disable LPM */\n\t\t\tMSG_VERB(\"Disable MHI LPM\");\n\t\t\tmhi_netdev->wake++;\n\t\t\tmhi_device_get(mhi_dev);\n\t\t}\n\t\tbreak;\n\tdefault:\n\t\trc = -EINVAL;\n\t\tbreak;\n\t}\n\n\trc = copy_to_user(ifr->ifr_ifru.ifru_data, &ext_cmd,\n\t\t\t  sizeof(struct rmnet_ioctl_extended_s));\n\treturn rc;\n}\n\nstatic int mhi_netdev_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd)\n{\n\tint rc = 0;\n\tstruct rmnet_ioctl_data_s ioctl_data;\n\n\tswitch (cmd) {\n\tcase RMNET_IOCTL_SET_LLP_IP: /* set RAWIP protocol */\n\t\tbreak;\n\tcase RMNET_IOCTL_GET_LLP: /* get link protocol state */\n\t\tioctl_data.u.operation_mode = RMNET_MODE_LLP_IP;\n\t\tif (copy_to_user(ifr->ifr_ifru.ifru_data, &ioctl_data,\n\t\t    sizeof(struct rmnet_ioctl_data_s)))\n\t\t\trc = -EFAULT;\n\t\tbreak;\n\tcase RMNET_IOCTL_GET_OPMODE: /* get operation mode */\n\t\tioctl_data.u.operation_mode = RMNET_MODE_LLP_IP;\n\t\tif (copy_to_user(ifr->ifr_ifru.ifru_data, &ioctl_data,\n\t\t    sizeof(struct rmnet_ioctl_data_s)))\n\t\t\trc = -EFAULT;\n\t\tbreak;\n\tcase RMNET_IOCTL_SET_QOS_ENABLE:\n\t\trc = -EINVAL;\n\t\tbreak;\n\tcase RMNET_IOCTL_SET_QOS_DISABLE:\n\t\trc = 0;\n\t\tbreak;\n\tcase RMNET_IOCTL_OPEN:\n\tcase RMNET_IOCTL_CLOSE:\n\t\t/* we just ignore them and return success */\n\t\trc = 0;\n\t\tbreak;\n\tcase RMNET_IOCTL_EXTENDED:\n\t\trc = mhi_netdev_ioctl_extended(dev, ifr);\n\t\tbreak;\n\tdefault:\n\t\t/* don't fail any IOCTL right now */\n\t\trc = 0;\n\t\tbreak;\n\t}\n\n\treturn rc;\n}\n#endif\n\nstatic void mhi_netdev_get_drvinfo (struct net_device *ndev, struct ethtool_drvinfo *info)\n{\n\t//struct mhi_netdev *mhi_netdev = ndev_to_mhi(ndev);\n\t/* strlcpy() is deprecated in kernel 6.8.0+, using strscpy instead */\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(6,8,0))\n\tstrlcpy(info->driver, \"pcie_mhi\", sizeof(info->driver));\n\tstrlcpy(info->version, PCIE_MHI_DRIVER_VERSION, sizeof(info->version));\n#else\n\tstrscpy(info->driver, \"pcie_mhi\", sizeof(info->driver));\n\tstrscpy(info->version, PCIE_MHI_DRIVER_VERSION, sizeof(info->version));\n#endif\n}\n\nstatic const struct ethtool_ops mhi_netdev_ethtool_ops = {\n\t.get_drvinfo\t\t= mhi_netdev_get_drvinfo,\n};\n\nstatic const struct net_device_ops mhi_netdev_ops_ip = {\n\t.ndo_open = mhi_netdev_open,\n\t.ndo_start_xmit = mhi_netdev_xmit,\n\t//.ndo_do_ioctl = mhi_netdev_ioctl,\n\t.ndo_change_mtu = mhi_netdev_change_mtu,\n\t.ndo_set_mac_address = 0,\n\t.ndo_validate_addr = 0,\n};\n\nstatic void mhi_netdev_setup(struct net_device *dev)\n{\n\tdev->netdev_ops = &mhi_netdev_ops_ip;\n\tether_setup(dev);\n\t\n\t/* set this after calling ether_setup */\n\tdev->header_ops = 0;  /* No header */\n\tdev->type = ARPHRD_RAWIP;\n\tdev->hard_header_len = 0;\n\tdev->addr_len = 0;\n\tdev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);\n\tdev->watchdog_timeo = WATCHDOG_TIMEOUT;\n\n\tdev->ethtool_ops = &mhi_netdev_ethtool_ops;\n\tmemcpy (dev->dev_addr, node_id, sizeof node_id);\n\tdev->flags |= IFF_NOARP;\n}\n\n/* enable mhi_netdev netdev, call only after grabbing mhi_netdev.mutex */\nstatic int mhi_netdev_enable_iface(struct mhi_netdev *mhi_netdev)\n{\n\tint ret = 0;\n\tchar ifalias[IFALIASZ];\n\tchar ifname[IFNAMSIZ];\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n#ifndef QUECTEL_NO_DTS\n\tstruct device_node *of_node = mhi_dev->dev.of_node;\n#endif\n\tstruct mhi_netdev_priv *mhi_netdev_priv;\n\n\tmhi_netdev->alias = 0;//of_alias_get_id(of_node, \"mhi-netdev\");\n\tif (mhi_netdev->alias < 0)\n\t\tmhi_netdev->alias = 0;\n\n#ifdef QUECTEL_NO_DTS\n\tmhi_netdev->interface_name = \"rmnet_mhi\";\n#else\n\n\tret = of_property_read_string(of_node, \"mhi,interface-name\",\n\t\t\t\t      &mhi_netdev->interface_name);\n#endif\n\tif (ret)\n\t\tmhi_netdev->interface_name = mhi_netdev_driver.driver.name;\n\n\tsnprintf(ifalias, sizeof(ifalias), \"%s_%04x_%02u.%02u.%02u_%u\",\n\t\t mhi_netdev->interface_name, mhi_dev->dev_id, mhi_dev->domain,\n\t\t mhi_dev->bus, mhi_dev->slot, mhi_netdev->alias);\n\n\tsnprintf(ifname, sizeof(ifname), \"%s%%d\", mhi_netdev->interface_name);\n\n#ifdef QUECTEL_NO_DTS\n\tmhi_netdev->ethernet_interface = 0;\n#else\n\tmhi_netdev->ethernet_interface = of_property_read_bool(of_node,\n\t\t\t\"mhi,ethernet-interface\");\n#endif\n\trtnl_lock();\n\tmhi_netdev->ndev = alloc_netdev(sizeof(*mhi_netdev_priv),\n\t\t\t\t\tifname, NET_NAME_PREDICTABLE,\n\t\t\t\t\tmhi_netdev_setup);\n\tif (!mhi_netdev->ndev) {\n\t\trtnl_unlock();\n\t\treturn -ENOMEM;\n\t}\n\n\tmhi_netdev->ndev->mtu = mhi_dev->mtu;\n\tSET_NETDEV_DEV(mhi_netdev->ndev, &mhi_dev->dev);\n\t//dev_set_alias(mhi_netdev->ndev, ifalias, strlen(ifalias));\n\tmhi_netdev_priv = netdev_priv(mhi_netdev->ndev);\n\tmhi_netdev_priv->mhi_netdev = mhi_netdev;\n\trtnl_unlock();\n\n\tmhi_netdev->napi = devm_kzalloc(&mhi_dev->dev,\n\t\t\t\t\tsizeof(*mhi_netdev->napi), GFP_KERNEL);\n\tif (!mhi_netdev->napi) {\n\t\tret = -ENOMEM;\n\t\tgoto napi_alloc_fail;\n\t}\n\n\tnetif_napi_add(mhi_netdev->ndev, mhi_netdev->napi,\n\t\t       mhi_netdev_poll, NAPI_POLL_WEIGHT);\n\tret = register_netdev(mhi_netdev->ndev);\n\tif (ret) {\n\t\tMSG_ERR(\"Network device registration failed\\n\");\n\t\tgoto net_dev_reg_fail;\n\t}\n\n\tnapi_enable(mhi_netdev->napi);\n\n\tMSG_LOG(\"Exited.\\n\");\n\n\treturn 0;\n\nnet_dev_reg_fail:\n\tnetif_napi_del(mhi_netdev->napi);\n\nnapi_alloc_fail:\n\tfree_netdev(mhi_netdev->ndev);\n\tmhi_netdev->ndev = NULL;\n\n\treturn ret;\n}\n\nstatic void mhi_netdev_xfer_ul_cb(struct mhi_device *mhi_dev,\n\t\t\t\t  struct mhi_result *mhi_result)\n{\n\tstruct mhi_netdev *mhi_netdev = mhi_device_get_devdata(mhi_dev);\n\tstruct sk_buff *skb = mhi_result->buf_addr;\n\tstruct net_device *ndev = mhi_netdev->ndev;\n\n\tndev->stats.tx_packets++;\n\tndev->stats.tx_bytes += skb->len;\n\tdev_kfree_skb(skb);\n\n\tif (netif_queue_stopped(ndev))\n\t\tnetif_wake_queue(ndev);\n}\n\nstatic void mhi_netdev_push_skb(struct mhi_netdev *mhi_netdev,\n\t\t\t\tstruct mhi_buf *mhi_buf,\n\t\t\t\tstruct mhi_result *mhi_result)\n{\n\tstruct sk_buff *skb;\n\n\tskb = alloc_skb(0, GFP_ATOMIC);\n\tif (!skb) {\n\t\t__free_pages(mhi_buf->page, mhi_netdev->order);\n\t\treturn;\n\t}\n\n\tif (!mhi_netdev->ethernet_interface) {\n\t\tskb_add_rx_frag(skb, 0, mhi_buf->page, 0,\n\t\t\t\tmhi_result->bytes_xferd, mhi_netdev->mru);\n\t\tskb->dev = mhi_netdev->ndev;\n\t\tskb->protocol = mhi_netdev_ip_type_trans(*(u8 *)mhi_buf->buf);\n\t\tif (skb_linearize(skb))\n\t\t\treturn;\n\t} else {\n\t\tskb_add_rx_frag(skb, 0, mhi_buf->page, ETH_HLEN,\n\t\t\t\tmhi_result->bytes_xferd - ETH_HLEN,\n\t\t\t\tmhi_netdev->mru);\n\t\tskb->dev = mhi_netdev->ndev;\n\t\tskb->protocol = mhi_netdev_ip_type_trans(((u8 *)mhi_buf->buf)[ETH_HLEN]);\n\t}\n\tnetif_receive_skb(skb);\n}\n\nstatic void mhi_netdev_xfer_dl_cb(struct mhi_device *mhi_dev,\n\t\t\t\t  struct mhi_result *mhi_result)\n{\n\tstruct mhi_netdev *mhi_netdev = mhi_device_get_devdata(mhi_dev);\n\tstruct mhi_netbuf *netbuf = mhi_result->buf_addr;\n\tstruct mhi_buf *mhi_buf = &netbuf->mhi_buf;\n\tstruct sk_buff *skb;\n\tstruct net_device *ndev = mhi_netdev->ndev;\n\tstruct device *dev = mhi_dev->dev.parent;\n\tstruct mhi_net_chain *chain = mhi_netdev->chain;\n\n\tnetbuf->unmap(dev, mhi_buf->dma_addr, mhi_buf->len, DMA_FROM_DEVICE);\n\n\t/* modem is down, drop the buffer */\n\tif (mhi_result->transaction_status == -ENOTCONN) {\n\t\t__free_pages(mhi_buf->page, mhi_netdev->order);\n\t\treturn;\n\t}\n\n\tndev->stats.rx_packets++;\n\tndev->stats.rx_bytes += mhi_result->bytes_xferd;\n\n\tif (unlikely(!chain)) {\n\t\tmhi_netdev_push_skb(mhi_netdev, mhi_buf, mhi_result);\n\t\treturn;\n\t}\n\n\t/* we support chaining */\n\tskb = alloc_skb(0, GFP_ATOMIC);\n\tif (likely(skb)) {\n\t\tif (!mhi_netdev->ethernet_interface) {\n\t\t\tskb_add_rx_frag(skb, 0, mhi_buf->page, 0,\n\t\t\t\t\tmhi_result->bytes_xferd, mhi_netdev->mru);\n\t\t} else {\n\t\t\tskb_add_rx_frag(skb, 0, mhi_buf->page, ETH_HLEN,\n\t\t\t\t\tmhi_result->bytes_xferd - ETH_HLEN,\n\t\t\t\t\tmhi_netdev->mru);\n\t\t}\n\n\t\t/* this is first on list */\n\t\tif (!chain->head) {\n\t\t\tskb->dev = ndev;\n\t\t\tif (!mhi_netdev->ethernet_interface) {\n\t\t\t\tskb->protocol =\n\t\t\t\t\tmhi_netdev_ip_type_trans(*(u8 *)mhi_buf->buf);\n\t\t\t} else {\n\t\t\t\tskb->protocol =\n\t\t\t\t\tmhi_netdev_ip_type_trans(((u8 *)mhi_buf->buf)[ETH_HLEN]);\n\t\t\t}\n\t\t\tchain->head = skb;\n\t\t} else {\n\t\t\tskb_shinfo(chain->tail)->frag_list = skb;\n\t\t}\n\n\t\tchain->tail = skb;\n\t} else {\n\t\t__free_pages(mhi_buf->page, mhi_netdev->order);\n\t}\n}\n\nstatic void mhi_netdev_status_cb(struct mhi_device *mhi_dev, enum MHI_CB mhi_cb)\n{\n\tstruct mhi_netdev *mhi_netdev = mhi_device_get_devdata(mhi_dev);\n\n\tif (mhi_cb != MHI_CB_PENDING_DATA)\n\t\treturn;\n\n\tnapi_schedule(mhi_netdev->napi);\n}\n\n#ifdef CONFIG_DEBUG_FS\n\nstruct dentry *dentry;\n\nstatic void mhi_netdev_create_debugfs(struct mhi_netdev *mhi_netdev)\n{\n\tchar node_name[32];\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\n\t/* Both tx & rx client handle contain same device info */\n\tsnprintf(node_name, sizeof(node_name), \"%s_%04x_%02u.%02u.%02u_%u\",\n\t\t mhi_netdev->interface_name, mhi_dev->dev_id, mhi_dev->domain,\n\t\t mhi_dev->bus, mhi_dev->slot, mhi_netdev->alias);\n\n\tif (IS_ERR_OR_NULL(dentry))\n\t\treturn;\n\n\tmhi_netdev->dentry = debugfs_create_dir(node_name, dentry);\n\tif (IS_ERR_OR_NULL(mhi_netdev->dentry))\n\t\treturn;\n}\n\nstatic void mhi_netdev_create_debugfs_dir(void)\n{\n\tdentry = debugfs_create_dir(MHI_NETDEV_DRIVER_NAME, 0);\n}\n\n#else\n\nstatic void mhi_netdev_create_debugfs(struct mhi_netdev_private *mhi_netdev)\n{\n}\n\nstatic void mhi_netdev_create_debugfs_dir(void)\n{\n}\n\n#endif\n\nstatic void mhi_netdev_remove(struct mhi_device *mhi_dev)\n{\n\tstruct mhi_netdev *mhi_netdev = mhi_device_get_devdata(mhi_dev);\n\n\tMSG_LOG(\"Remove notification received\\n\");\n\n\t/* rsc parent takes cares of the cleanup */\n\tif (mhi_netdev->is_rsc_dev) {\n\t\tmhi_netdev_free_pool(mhi_netdev);\n\t\treturn;\n\t}\n\n\trmnet_data_deinit(mhi_netdev->ndev, 1);\n\tnetif_stop_queue(mhi_netdev->ndev);\n\tnapi_disable(mhi_netdev->napi);\n\tunregister_netdev(mhi_netdev->ndev);\n\tnetif_napi_del(mhi_netdev->napi);\n\tfree_netdev(mhi_netdev->ndev);\n\tmhi_netdev_free_pool(mhi_netdev);\n\n\tif (!IS_ERR_OR_NULL(mhi_netdev->dentry))\n\t\tdebugfs_remove_recursive(mhi_netdev->dentry);\n}\n\nstatic int mhi_netdev_match(struct device *dev, void *data)\n{\n\t/* if phandle dt == device dt, we found a match */\n\treturn (dev->of_node == data);\n}\n\nstatic void mhi_netdev_clone_dev(struct mhi_netdev *mhi_netdev,\n\t\t\t\t struct mhi_netdev *parent)\n{\n\tmhi_netdev->ndev = parent->ndev;\n\tmhi_netdev->napi = parent->napi;\n\tmhi_netdev->ipc_log = parent->ipc_log;\n\tmhi_netdev->msg_lvl = parent->msg_lvl;\n\tmhi_netdev->ipc_log_lvl = parent->ipc_log_lvl;\n\tmhi_netdev->is_rsc_dev = true;\n\tmhi_netdev->chain = parent->chain;\n}\n\nstatic int mhi_netdev_probe(struct mhi_device *mhi_dev,\n\t\t\t    const struct mhi_device_id *id)\n{\n\tint ret;\n\tstruct mhi_netdev *mhi_netdev, *p_netdev = NULL;\n#ifndef QUECTEL_NO_DTS\n\tstruct device_node *of_node = mhi_dev->dev.of_node;\n#endif\n\tint nr_tre;\n\tchar node_name[32];\n\tstruct device_node *phandle;\n\tbool no_chain;\n\n#ifndef QUECTEL_NO_DTS\n\tif (!of_node)\n\t\treturn -ENODEV;\n#endif\n\n\tmhi_netdev = devm_kzalloc(&mhi_dev->dev, sizeof(*mhi_netdev),\n\t\t\t\t  GFP_KERNEL);\n\tif (!mhi_netdev)\n\t\treturn -ENOMEM;\n\n\tmhi_netdev->mhi_dev = mhi_dev;\n\tmhi_device_set_devdata(mhi_dev, mhi_netdev);\n\n#ifdef QUECTEL_NO_DTS\n\tmhi_netdev->mru = 16384;\n\tret = 0;\n#else\n\tret = of_property_read_u32(of_node, \"mhi,mru\", &mhi_netdev->mru);\n#endif\n\tif (ret)\n\t\treturn -ENODEV;\n\n\t/* MRU must be multiplication of page size */\n\tmhi_netdev->order = __ilog2_u32(mhi_netdev->mru / PAGE_SIZE);\n\tif ((PAGE_SIZE << mhi_netdev->order) < mhi_netdev->mru)\n\t\treturn -EINVAL;\n\n\t/* check if this device shared by a parent device */\n#ifdef QUECTEL_NO_DTS\n\tphandle = NULL;\n#else\n\tphandle = of_parse_phandle(of_node, \"mhi,rsc-parent\", 0);\n#endif\n\tif (phandle) {\n\t\tstruct device *dev;\n\t\tstruct mhi_device *pdev;\n\t\t/* find the parent device */\n\t\tdev = driver_find_device(mhi_dev->dev.driver, NULL, phandle,\n\t\t\t\t\t mhi_netdev_match);\n\t\tif (!dev)\n\t\t\treturn -ENODEV;\n\n\t\t/* this device is shared with parent device. so we won't be\n\t\t * creating a new network interface. Clone parent\n\t\t * information to child node\n\t\t */\n\t\tpdev = to_mhi_device(dev);\n\t\tp_netdev = mhi_device_get_devdata(pdev);\n\t\tmhi_netdev_clone_dev(mhi_netdev, p_netdev);\n\t\tput_device(dev);\n\t} else {\n\t\tmhi_netdev->msg_lvl = MHI_MSG_LVL_ERROR;\n#ifdef QUECTEL_NO_DTS\n\t\tno_chain = 0;\n#else\n\t\tno_chain = of_property_read_bool(of_node,\n\t\t\t\t\t\t \"mhi,disable-chain-skb\");\n#endif\n\t\tif (!no_chain) {\n\t\t\tmhi_netdev->chain = devm_kzalloc(&mhi_dev->dev,\n\t\t\t\t\t\tsizeof(*mhi_netdev->chain),\n\t\t\t\t\t\tGFP_KERNEL);\n\t\t\tif (!mhi_netdev->chain)\n\t\t\t\treturn -ENOMEM;\n\t\t}\n\n\t\tret = mhi_netdev_enable_iface(mhi_netdev);\n\t\tif (ret)\n\t\t\treturn ret;\n\n\t\t/* create ipc log buffer */\n\t\tsnprintf(node_name, sizeof(node_name),\n\t\t\t \"%s_%04x_%02u.%02u.%02u_%u\",\n\t\t\t mhi_netdev->interface_name, mhi_dev->dev_id,\n\t\t\t mhi_dev->domain, mhi_dev->bus, mhi_dev->slot,\n\t\t\t mhi_netdev->alias);\n\t\tmhi_netdev->ipc_log = ipc_log_context_create(IPC_LOG_PAGES,\n\t\t\t\t\t\t\t     node_name, 0);\n\t\tmhi_netdev->ipc_log_lvl = IPC_LOG_LVL;\n\n\t\tmhi_netdev_create_debugfs(mhi_netdev);\n\t}\n\n\t/* move mhi channels to start state */\n\tret = mhi_prepare_for_transfer(mhi_dev);\n\tif (ret) {\n\t\tMSG_ERR(\"Failed to start channels ret %d\\n\", ret);\n\t\tgoto error_start;\n\t}\n\n\trmnet_data_init(mhi_netdev->ndev, 1);\n\n\t/* setup pool size ~2x ring length*/\n\tnr_tre = mhi_get_no_free_descriptors(mhi_dev, DMA_FROM_DEVICE);\n\tmhi_netdev->pool_size = 1 << __ilog2_u32(nr_tre);\n\tif (nr_tre > mhi_netdev->pool_size)\n\t\tmhi_netdev->pool_size <<= 1;\n\tmhi_netdev->pool_size <<= 1;\n\n\t/* allocate memory pool */\n\tret = mhi_netdev_alloc_pool(mhi_netdev);\n\tif (ret)\n\t\tgoto error_start;\n\n\t/* link child node with parent node if it's children dev */\n\tif (p_netdev)\n\t\tp_netdev->rsc_dev = mhi_netdev;\n\n\t/* now we have a pool of buffers allocated, queue to hardware\n\t * by triggering a napi_poll\n\t */\n\tnapi_schedule(mhi_netdev->napi);\n\n\treturn 0;\n\nerror_start:\n\tif (phandle)\n\t\treturn ret;\n\n\tnetif_stop_queue(mhi_netdev->ndev);\n\tnapi_disable(mhi_netdev->napi);\n\tunregister_netdev(mhi_netdev->ndev);\n\tnetif_napi_del(mhi_netdev->napi);\n\tfree_netdev(mhi_netdev->ndev);\n\n\treturn ret;\n}\n\nstatic const struct mhi_device_id mhi_netdev_match_table[] = {\n\t{ .chan = \"IP_HW0\" },\n\t{ .chan = \"IP_HW_ADPL\" },\n\t{ .chan = \"IP_HW0_RSC\" },\n\t{ .chan = \"IP_SW0\" },\n\t{},\n};\n\nstatic struct mhi_driver mhi_netdev_driver = {\n\t.id_table = mhi_netdev_match_table,\n\t.probe = mhi_netdev_probe,\n\t.remove = mhi_netdev_remove,\n\t.ul_xfer_cb = mhi_netdev_xfer_ul_cb,\n\t.dl_xfer_cb = mhi_netdev_xfer_dl_cb,\n\t.status_cb = mhi_netdev_status_cb,\n\t.driver = {\n\t\t.name = \"mhi_netdev\",\n\t\t.owner = THIS_MODULE,\n\t}\n};\n\nstatic int __init mhi_netdev_init(void)\n{\n\tBUILD_BUG_ON(sizeof(struct mhi_netbuf) > MAX_NETBUF_SIZE);\n\tmhi_netdev_create_debugfs_dir();\n\n\treturn mhi_driver_register(&mhi_netdev_driver);\n}\n//module_init(mhi_netdev_init);\n\nint __init mhi_device_netdev_init(struct dentry *parent)\n{\n\tBUILD_BUG_ON(sizeof(struct mhi_netbuf) > MAX_NETBUF_SIZE);\n\n\treturn mhi_netdev_init();\n}\n\nvoid mhi_device_netdev_exit(void)\n{\n#ifdef CONFIG_DEBUG_FS\n\tdebugfs_remove_recursive(dentry);\n#endif\n\tmhi_driver_unregister(&mhi_netdev_driver);\n}\n\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/devices/mhi_netdev_quectel.c",
    "content": "/* Copyright (c) 2018, The Linux Foundation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License version 2 and\n * only version 2 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n */\n\n#include <linux/module.h>\n#include <linux/version.h>\n#include <linux/kernel.h>\n#include <linux/interrupt.h>\n#include <linux/netdevice.h>\n#include <linux/ethtool.h>\n#include <linux/etherdevice.h>\n#include <linux/skbuff.h>\n#include <linux/if_arp.h>\n#include <linux/dma-mapping.h>\n#include <linux/debugfs.h>\n#include <linux/device.h>\n#include <linux/errno.h>\n#include <linux/rtnetlink.h>\n#include <linux/time.h>\n#include <net/arp.h>\n#include <net/ip.h>\n#include <net/ipv6.h>\n#include <net/tcp.h>\n#include <linux/usb/cdc.h>\n\n//#define CONFIG_IPQ5018_RATE_CONTROL //Only used with spf11.5 for IPQ5018\n#if defined(CONFIG_IPQ5018_RATE_CONTROL)\n//#include <linux/jiffies.h>\n#include <asm/arch_timer.h>\n#endif\n\n#include \"../core/mhi.h\"\n//#define MHI_NETDEV_ONE_CARD_MODE\n//#define ANDROID_gki //some fuction not allow used in this TEST\n\n#ifndef ETH_P_MAP\n#define ETH_P_MAP 0xDA1A\n#endif\n\n#ifndef ARPHRD_RAWIP\n#define ARPHRD_RAWIP ARPHRD_NONE\n#endif\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 4,2,0 ))\nstatic bool netdev_is_rx_handler_busy(struct net_device *dev)\n{\n\tASSERT_RTNL();\n\treturn dev && rtnl_dereference(dev->rx_handler);\n}\n#endif\n\nstruct rmnet_nss_cb {\n\tint (*nss_create)(struct net_device *dev);\n\tint (*nss_free)(struct net_device *dev);\n\tint (*nss_tx)(struct sk_buff *skb);\n};\nstatic struct rmnet_nss_cb __read_mostly *nss_cb = NULL;\n#if defined(CONFIG_PINCTRL_IPQ807x) || defined(CONFIG_PINCTRL_IPQ5018)\n#ifdef CONFIG_RMNET_DATA\n#define CONFIG_QCA_NSS_DRV\n#define CONFIG_USE_RMNET_DATA_FOR_SKIP_MEMCPY\n/* define at qca/src/linux-4.4/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c */ //for spf11.x\n/* define at qsdk/qca/src/datarmnet/core/rmnet_config.c */ //for spf12.x\n/* set at qsdk/qca/src/data-kernel/drivers/rmnet-nss/rmnet_nss.c */\n/* need add DEPENDS:= kmod-rmnet-core in feeds/makefile */\nextern struct rmnet_nss_cb *rmnet_nss_callbacks __rcu __read_mostly;\n#endif\n#endif\n\t\n\nint mhi_netdev_use_xfer_type_dma(unsigned chan)\n{\n\t(void)chan;\n#ifdef CONFIG_USE_RMNET_DATA_FOR_SKIP_MEMCPY\n\treturn 1;\n#endif\n\treturn 0;\n}\n\n\nstatic const unsigned char node_id[ETH_ALEN] = {0x02, 0x50, 0xf4, 0x00, 0x00, 0x00};\nstatic const unsigned char default_modem_addr[ETH_ALEN] = {0x02, 0x50, 0xf3, 0x00, 0x00, 0x00};\n\n#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE)\n#define QUECTEL_BRIDGE_MODE\n#endif\n\n#define QUECTEL_RMNET_MODE\n\n#ifdef QUECTEL_BRIDGE_MODE\nstatic uint __read_mostly bridge_mode = 0/*|BIT(1)*/;\nmodule_param( bridge_mode, uint, S_IRUGO );\n#endif\n\nstruct qmap_hdr {\n    u8 cd_rsvd_pad;\n    u8 mux_id;\n    u16 pkt_len;\n} __packed;\n#define QUECTEL_QMAP_MUX_ID 0x81\n\nenum rmnet_map_v5_header_type {\n\tRMNET_MAP_HEADER_TYPE_UNKNOWN,\n\tRMNET_MAP_HEADER_TYPE_COALESCING = 0x1,\n\tRMNET_MAP_HEADER_TYPE_CSUM_OFFLOAD = 0x2,\n\tRMNET_MAP_HEADER_TYPE_ENUM_LENGTH\n};\n\nenum rmnet_map_commands {\n\tRMNET_MAP_COMMAND_NONE,\n\tRMNET_MAP_COMMAND_FLOW_DISABLE,\n\tRMNET_MAP_COMMAND_FLOW_ENABLE,\n\tRMNET_MAP_COMMAND_FLOW_START = 7,\n\tRMNET_MAP_COMMAND_FLOW_END = 8,\n\t/* These should always be the last 2 elements */\n\tRMNET_MAP_COMMAND_UNKNOWN,\n\tRMNET_MAP_COMMAND_ENUM_LENGTH\n};\n\n#define RMNET_MAP_COMMAND_REQUEST     0\n#define RMNET_MAP_COMMAND_ACK         1\n#define RMNET_MAP_COMMAND_UNSUPPORTED 2\n#define RMNET_MAP_COMMAND_INVALID     3\n\n/* Main QMAP header */\nstruct rmnet_map_header {\n\tu8  pad_len:6;\n\tu8  next_hdr:1;\n\tu8  cd_bit:1;\n\tu8  mux_id;\n\t__be16 pkt_len;\n}  __aligned(1);\n\n/* QMAP v5 headers */\nstruct rmnet_map_v5_csum_header {\n\tu8  next_hdr:1;\n\tu8  header_type:7;\n\tu8  hw_reserved:7;\n\tu8  csum_valid_required:1;\n\t__be16 reserved;\n} __aligned(1);\n\nstruct rmnet_map_control_command {\n\tu8  command_name;\n\tu8  cmd_type:2;\n\tu8  reserved:6;\n\tu16 reserved2;\n\tu32 transaction_id;\n\tunion {\n\t\tstruct {\n\t\t\tu8 reserved2;\n\t\t\tu8 ip_family:2;\n\t\t\tu8 reserved:6;\n\t\t\t__be16 flow_control_seq_num;\n\t\t\t__be32 qos_id;\n\t\t} flow_control;\n\t\tu8 data[0];\n\t};\n}  __aligned(1);\n\nstruct mhi_mbim_hdr {\n\tstruct usb_cdc_ncm_nth16 nth16;\n\tstruct usb_cdc_ncm_ndp16 ndp16;\n\tstruct usb_cdc_ncm_dpe16 dpe16[2];\n} __attribute__ ((packed));\n\n#define QCUSB_MRECEIVE_MAX_BUFFER_SIZE (1024*32) //maybe 31KB is enough\n#define QCUSB_MTRANSMIT_MAX_BUFFER_SIZE (1024*16)\n#define NTB_OUT_MAX_DATAGRAMS        16\n\nstatic const struct usb_cdc_ncm_ntb_parameters ncmNTBParams = {\n\t.bmNtbFormatsSupported = USB_CDC_NCM_NTB16_SUPPORTED,\n\t.dwNtbInMaxSize = QCUSB_MRECEIVE_MAX_BUFFER_SIZE,\n\t.wNdpInDivisor = 0x04,\n\t.wNdpInPayloadRemainder = 0x0,\n\t.wNdpInAlignment = 0x4,\n\n\t.dwNtbOutMaxSize = QCUSB_MTRANSMIT_MAX_BUFFER_SIZE,\n\t.wNdpOutDivisor = 0x04,\n\t.wNdpOutPayloadRemainder = 0x0,\n\t.wNdpOutAlignment = 0x4,\n\t.wNtbOutMaxDatagrams = NTB_OUT_MAX_DATAGRAMS,\n};\n\n#if 0\nstatic void qmap_hex_dump(const char *tag, unsigned char *data, unsigned len) {\n\tuint i;\n\tuint *d = (uint *)data;\n\n\tprintk(KERN_DEBUG \"%s data=%p, len=%x\\n\", tag, data, len);\n\tlen = (len+3)/4;\n\tfor (i = 0; i < len; i+=4) {\n\t\tprintk(KERN_DEBUG \"%08x %08x %08x %08x %08x\\n\", i*4, d[i+0], d[i+1], d[i+2], d[i+3]);\n\t}\n}\n#else\nstatic void qmap_hex_dump(const char *tag, unsigned char *data, unsigned len) {\n}\n#endif\n\n#define MBIM_MUX_ID_SDX7X\t112\t//sdx7x is 112-126, others is 0-14\n\nstatic uint __read_mostly mhi_mbim_enabled = 0;\nmodule_param(mhi_mbim_enabled, uint, S_IRUGO);\nint mhi_netdev_mbin_enabled(void) { return mhi_mbim_enabled; }\n\nstatic uint __read_mostly qmap_mode = 1;\nmodule_param(qmap_mode, uint, S_IRUGO);\n\nstatic uint __read_mostly poll_weight = NAPI_POLL_WEIGHT;\nmodule_param(poll_weight, uint, S_IRUGO);\n\n#define MHI_NETDEV_DRIVER_NAME \"mhi_netdev\"\n#define WATCHDOG_TIMEOUT (30 * HZ)\n\n#define MSG_VERB(fmt, ...) do { \\\n\tif (mhi_netdev->msg_lvl <= MHI_MSG_LVL_VERBOSE) \\\n\t\tpr_err(\"[D][%s] \" fmt, __func__, ##__VA_ARGS__);\\\n} while (0)\n\n#define MHI_ASSERT(cond, msg) do { \\\n\tif (cond) { \\\n\t\tMSG_ERR(msg); \\\n\t\tWARN_ON(cond); \\\n\t} \\\n} while (0)\n\n#define MSG_LOG(fmt, ...) do { \\\n\tif (mhi_netdev->msg_lvl <= MHI_MSG_LVL_INFO) \\\n\t\tpr_err(\"[I][%s] \" fmt, __func__, ##__VA_ARGS__);\\\n} while (0)\n\n#define MSG_ERR(fmt, ...) do { \\\n\tif (mhi_netdev->msg_lvl <= MHI_MSG_LVL_ERROR) \\\n\t\tpr_err(\"[E][%s] \" fmt, __func__, ##__VA_ARGS__); \\\n} while (0)\n\nstruct mhi_stats {\n\tu32 rx_int;\n\tu32 tx_full;\n\tu32 tx_pkts;\n\tu32 rx_budget_overflow;\n\tu32 tx_allocated;\n\tu32 rx_allocated;\n\tu32 alloc_failed;\n};\n\n/* important: do not exceed sk_buf->cb (48 bytes) */\nstruct mhi_skb_priv {\n\tvoid *buf;\n\tsize_t size;\n\tstruct mhi_netdev *bind_netdev;\n};\n\nstruct skb_data {\t/* skb->cb is one of these */\n\tstruct mhi_netdev *bind_netdev;\n\tunsigned int length;\n\tunsigned int packets;\n};\n\n#define MHI_NETDEV_STATUS64 1\n\ntypedef struct {\n    uint size;\n    uint rx_urb_size;\n    uint ep_type;\n    uint iface_id;\n    uint MuxId;\n    uint ul_data_aggregation_max_datagrams; //0x17\n    uint ul_data_aggregation_max_size ;//0x18\n    uint dl_minimum_padding; //0x1A\n} QMAP_SETTING;\n\ntypedef struct {\n    unsigned int size;\n    unsigned int rx_urb_size;\n    unsigned int ep_type;\n    unsigned int iface_id;\n    unsigned int qmap_mode;\n    unsigned int qmap_version;\n    unsigned int dl_minimum_padding;\n    char ifname[8][16];\n    unsigned char mux_id[8];\n} RMNET_INFO;\n\ntypedef struct {\n\tu16 tx_seq;\n\tu16 rx_seq;\n\tu32 rx_max;\n} MHI_MBIM_CTX;\n\nenum mhi_net_type {\n\tMHI_NET_UNKNOW,\n\tMHI_NET_RMNET,\n\tMHI_NET_MBIM,\n\tMHI_NET_ETHER\n};\n\n#ifdef CONFIG_USE_RMNET_DATA_FOR_SKIP_MEMCPY\n/* Try not to make this structure bigger than 128 bytes, since this take space\n * in payload packet.\n * Example: If MRU = 16K, effective MRU = 16K - sizeof(mhi_netbuf)\n */\nstruct mhi_netbuf {\n\tstruct mhi_buf mhi_buf; /* this must be first element */\n\tvoid (*unmap)(struct device *dev, dma_addr_t addr, size_t size,\n\t\t      enum dma_data_direction dir);\n};\n\nstruct mhi_net_chain {\n\tstruct sk_buff *head, *tail; /* chained skb */\n};\n#endif\n\n//#define TS_DEBUG\nstruct mhi_netdev {\n\tint alias;\n\tstruct mhi_device *mhi_dev;\n\tspinlock_t rx_lock;\n\tbool enabled;\n\trwlock_t pm_lock; /* state change lock */\n\tint (*rx_queue)(struct mhi_netdev *mhi_netdev, gfp_t gfp_t);\n\tstruct delayed_work alloc_work;\n\tint wake;\n\n\tstruct sk_buff_head tx_allocated;\n\tstruct sk_buff_head rx_allocated;\n\tstruct sk_buff_head qmap_chain;\n\tstruct sk_buff_head skb_chain;\n#ifdef TS_DEBUG\n\tuint clear_ts;\n\tstruct timespec diff_ts;\n\tstruct timespec qmap_ts;\n\tstruct timespec skb_ts;\n#endif\n\n\tMHI_MBIM_CTX mbim_ctx;\n\tu32 mbim_mux_id;\n\n\tu32 mru;\n\tu32 max_mtu;\n\tconst char *interface_name;\n\tstruct napi_struct napi;\n\tstruct net_device *ndev;\n\tenum mhi_net_type net_type;\n\tstruct sk_buff *frag_skb;\n\tbool recycle_buf;\n\n#ifdef CONFIG_USE_RMNET_DATA_FOR_SKIP_MEMCPY\n\tu32 order;\n\tstruct mhi_netbuf **netbuf_pool;\n\tint pool_size; /* must be power of 2 */\n\tint current_index;\n\tstruct mhi_net_chain chain;\n#endif\n\n#if defined(MHI_NETDEV_STATUS64)\n\tstruct pcpu_sw_netstats __percpu *stats64;\n#endif\n\tstruct mhi_stats stats;\n\n\tstruct dentry *dentry;\n\tenum MHI_DEBUG_LEVEL msg_lvl;\n\n\tstruct net_device *mpQmapNetDev[8];\n\tu32 qmap_mode;\n\tu32 qmap_version; // 5 ~ QMAP V1, 9 ~ QMAP V5\n\tu32 qmap_size;\n\tu32 link_state;\n\tu32 flow_control;\n\tu32 dl_minimum_padding;\n\n#ifdef QUECTEL_BRIDGE_MODE\n\tuint bridge_mode;\n\tuint bridge_ipv4;\n\tunsigned char bridge_mac[ETH_ALEN];\n#endif\n\tuint use_rmnet_usb;\n\tRMNET_INFO rmnet_info;\n\n#if defined(CONFIG_IPQ5018_RATE_CONTROL)\n\tu64 first_jiffy;\n\tu64 bytes_received_1;\n\tu64 bytes_received_2;\n\tu32 cntfrq_per_msec;\n\tbool mhi_rate_control;\n#endif\n\n\tu32 rmnet_map_command_stats[RMNET_MAP_COMMAND_ENUM_LENGTH];\n};\n\nstruct mhi_netdev_priv {\n\tstruct mhi_netdev *mhi_netdev;\n};\n\nstruct qmap_priv {\n\tvoid *pQmapDev;\n\tstruct net_device *real_dev;\n\tstruct net_device *self_dev;\n\tu8 offset_id;\n\tu8 mux_id;\n\tu8 qmap_version; // 5~v1, 9~v5\n\n#if defined(MHI_NETDEV_STATUS64)\n\tstruct pcpu_sw_netstats __percpu *stats64;\n#endif\n\n\tspinlock_t agg_lock;\n\tstruct sk_buff *agg_skb;\n\tunsigned agg_count;\n\tstruct timespec64 agg_time;\n\tstruct hrtimer agg_hrtimer;\n\tstruct work_struct agg_wq;\n\t\n#ifdef QUECTEL_BRIDGE_MODE\n\tuint bridge_mode;\n\tuint bridge_ipv4;\n\tunsigned char bridge_mac[ETH_ALEN];\n#endif\n\tuint use_qca_nss;\t\n};\n\nstatic struct mhi_netdev *ndev_to_mhi(struct net_device *ndev) {\n\tstruct mhi_netdev_priv *mhi_netdev_priv = netdev_priv(ndev);\n\tstruct mhi_netdev *mhi_netdev = mhi_netdev_priv->mhi_netdev;\n\treturn mhi_netdev;\n}\n\nstatic struct mhi_driver mhi_netdev_driver;\nstatic void mhi_netdev_create_debugfs(struct mhi_netdev *mhi_netdev);\n\n#if 0\nstatic void mhi_netdev_skb_destructor(struct sk_buff *skb)\n{\n\tstruct mhi_skb_priv *skb_priv = (struct mhi_skb_priv *)(skb->cb);\n\tstruct mhi_netdev *mhi_netdev = skb_priv->mhi_netdev;\n\n\tskb->data = skb->head;\n\tskb_reset_tail_pointer(skb);\n\tskb->len = 0;\n\tMHI_ASSERT(skb->data != skb_priv->buf, \"incorrect buf\");\n\tskb_queue_tail(&mhi_netdev->rx_allocated, skb);\n}\n#endif\n\t\n#ifdef QUECTEL_BRIDGE_MODE\nstatic const struct net_device_ops mhi_netdev_ops_ip;\nstatic const struct net_device_ops rmnet_vnd_ops;\n\nstatic int is_qmap_netdev(const struct net_device *ndev) {\n\treturn ndev->netdev_ops == &rmnet_vnd_ops;\n}\n\nstatic int bridge_arp_reply(struct net_device *net, struct sk_buff *skb, uint bridge_ipv4) {\n\tstruct arphdr *parp;\n\tu8 *arpptr, *sha;\n\tu8  sip[4], tip[4], ipv4[4];\n\tstruct sk_buff *reply = NULL;\n\n\tipv4[0]  = (bridge_ipv4 >> 24) & 0xFF;\n\tipv4[1]  = (bridge_ipv4 >> 16) & 0xFF;\n\tipv4[2]  = (bridge_ipv4 >> 8) & 0xFF;\n\tipv4[3]  = (bridge_ipv4 >> 0) & 0xFF;\n\n\tparp = arp_hdr(skb);\n\n\tif (parp->ar_hrd == htons(ARPHRD_ETHER)  && parp->ar_pro == htons(ETH_P_IP)\n\t\t&& parp->ar_op == htons(ARPOP_REQUEST) && parp->ar_hln == 6 && parp->ar_pln == 4) {\n\t\tarpptr = (u8 *)parp + sizeof(struct arphdr);\n\t\tsha = arpptr;\n\t\tarpptr += net->addr_len;\t/* sha */\n\t\tmemcpy(sip, arpptr, sizeof(sip));\n\t\tarpptr += sizeof(sip);\n\t\tarpptr += net->addr_len;\t/* tha */\n\t\tmemcpy(tip, arpptr, sizeof(tip));\n\n\t\tpr_info(\"%s sip = %d.%d.%d.%d, tip=%d.%d.%d.%d, ipv4=%d.%d.%d.%d\\n\", netdev_name(net),\n\t\tsip[0], sip[1], sip[2], sip[3], tip[0], tip[1], tip[2], tip[3], ipv4[0], ipv4[1], ipv4[2], ipv4[3]);\n\t\t//wwan0 sip = 10.151.137.255, tip=10.151.138.0, ipv4=10.151.137.255\n#ifndef ANDROID_gki\n\t\tif (tip[0] == ipv4[0] && tip[1] == ipv4[1] && (tip[2]&0xFC) == (ipv4[2]&0xFC) && tip[3] != ipv4[3])\n\t\t\treply = arp_create(ARPOP_REPLY, ETH_P_ARP, *((__be32 *)sip), net, *((__be32 *)tip), sha, default_modem_addr, sha);\n#endif\n\n\t\tif (reply) {\n\t\t\tskb_reset_mac_header(reply);\n\t\t\t__skb_pull(reply, skb_network_offset(reply));\n\t\t\treply->ip_summed = CHECKSUM_UNNECESSARY;\n\t\t\treply->pkt_type = PACKET_HOST;\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 18, 0))\n\t\t\tnetif_rx(reply);\n#else\n\t\t\tnetif_rx_ni(reply);\n#endif\n\t\t}\n\t\treturn 1;\n\t}\n\n    return 0;\n}\n\nstatic struct sk_buff *bridge_mode_tx_fixup(struct net_device *net, struct sk_buff *skb, uint bridge_ipv4, unsigned char *bridge_mac) {\n\tstruct ethhdr *ehdr;\n\tconst struct iphdr *iph;\n\n\tskb_reset_mac_header(skb);\n\tehdr = eth_hdr(skb);\n\n\tif (ehdr->h_proto == htons(ETH_P_ARP)) {\n\t\tif (bridge_ipv4)\n\t\t\tbridge_arp_reply(net, skb, bridge_ipv4);\n\t\treturn NULL;\n\t}\n\n\tiph = ip_hdr(skb);\n\t//DBG(\"iphdr: \");\n\t//PrintHex((void *)iph, sizeof(struct iphdr));\n\n// 1\t0.000000000\t0.0.0.0\t255.255.255.255\tDHCP\t362\tDHCP Request  - Transaction ID 0xe7643ad7\n\tif (ehdr->h_proto == htons(ETH_P_IP) && iph->protocol == IPPROTO_UDP && iph->saddr == 0x00000000 && iph->daddr == 0xFFFFFFFF) {\n\t\t//if (udp_hdr(skb)->dest == htons(67)) //DHCP Request\n\t\t{\n\t\t\tmemcpy(bridge_mac, ehdr->h_source, ETH_ALEN);\n\t\t\tpr_info(\"%s PC Mac Address: %02x:%02x:%02x:%02x:%02x:%02x\\n\", netdev_name(net),\n\t\t\t\tbridge_mac[0], bridge_mac[1], bridge_mac[2], bridge_mac[3], bridge_mac[4], bridge_mac[5]);\n\t\t}\n\t}\n\n\tif (memcmp(ehdr->h_source, bridge_mac, ETH_ALEN)) {\n\t\treturn NULL;\n\t}\n\n\treturn skb;\n}\n\nstatic void bridge_mode_rx_fixup(struct mhi_netdev *mhi_netdev, struct net_device *net, struct sk_buff *skb) {\n\tuint bridge_mode = 0;\n\tunsigned char *bridge_mac;\n\n\tif (mhi_netdev->qmap_mode > 0) {\n\t\tstruct qmap_priv *priv = netdev_priv(net);\n\t\tbridge_mode = priv->bridge_mode;\n\t\tbridge_mac = priv->bridge_mac;\n\t}\n\telse {\n\t\tbridge_mode = mhi_netdev->bridge_mode;\n\t\tbridge_mac = mhi_netdev->bridge_mac;\n\t}\n\n\tif (bridge_mode)\n\t\tmemcpy(eth_hdr(skb)->h_dest, bridge_mac, ETH_ALEN);\n}\n\nstatic ssize_t bridge_mode_show(struct device *dev, struct device_attribute *attr, char *buf) {\n\tstruct net_device *ndev = to_net_dev(dev);\n\tuint bridge_mode = 0;\n\n\tif (is_qmap_netdev(ndev)) {\n\t\tstruct qmap_priv *priv = netdev_priv(ndev);\n\t\tbridge_mode = priv->bridge_mode;\n\t}\n\telse {\n\t\tstruct mhi_netdev *mhi_netdev = ndev_to_mhi(ndev);\n\t\tbridge_mode = mhi_netdev->bridge_mode;\n\t}\n\n\treturn snprintf(buf, PAGE_SIZE, \"%u\\n\", bridge_mode);\n}\n\nstatic ssize_t bridge_mode_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {\n\tstruct net_device *ndev = to_net_dev(dev);\n\tuint bridge_mode = simple_strtoul(buf, NULL, 0);\n\t\n\tif (ndev->type != ARPHRD_ETHER) {\n\t\tif (bridge_mode)\n\t\t\tnetdev_err(ndev, \"netdevice is not ARPHRD_ETHER\\n\");\n\t\treturn count;\n\t}\n\n\tif (is_qmap_netdev(ndev)) {\n\t\tstruct qmap_priv *priv = netdev_priv(ndev);\n\t\tpriv->bridge_mode = bridge_mode;\n\t}\n\telse {\n\t\tstruct mhi_netdev *mhi_netdev = ndev_to_mhi(ndev);\n\t\tmhi_netdev->bridge_mode = bridge_mode;\n\t}\n\n\treturn count;\n}\n\n\nstatic ssize_t bridge_ipv4_show(struct device *dev, struct device_attribute *attr, char *buf) {\n\tstruct net_device *ndev = to_net_dev(dev);\n\tunsigned int bridge_ipv4 = 0;\n\tunsigned char ipv4[4];\n\n\tif (is_qmap_netdev(ndev)) {\n\t\tstruct qmap_priv *priv = netdev_priv(ndev);\n\t\tbridge_ipv4 = priv->bridge_ipv4;\n\t}\n\telse {\n\t\tstruct mhi_netdev *mhi_netdev = ndev_to_mhi(ndev);\n\t\tbridge_ipv4 = mhi_netdev->bridge_ipv4;\n\t}\n\n\tipv4[0]  = (bridge_ipv4 >> 24) & 0xFF;\n\tipv4[1]  = (bridge_ipv4 >> 16) & 0xFF;\n\tipv4[2]  = (bridge_ipv4 >> 8) & 0xFF;\n\tipv4[3]  = (bridge_ipv4 >> 0) & 0xFF;\n\n\treturn snprintf(buf, PAGE_SIZE, \"%d.%d.%d.%d\\n\",  ipv4[0], ipv4[1], ipv4[2], ipv4[3]);\n}\n\nstatic ssize_t bridge_ipv4_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {\n\tstruct net_device *ndev = to_net_dev(dev);\n\n\tif (is_qmap_netdev(ndev)) {\n\t\tstruct qmap_priv *priv = netdev_priv(ndev);\n\t\tpriv->bridge_ipv4 = simple_strtoul(buf, NULL, 16);\n\t}\n\telse {\n\t\tstruct mhi_netdev *mhi_netdev = ndev_to_mhi(ndev);\n\t\tmhi_netdev->bridge_ipv4 = simple_strtoul(buf, NULL, 16);\n\t}\n\n\treturn count;\n}\n\nstatic DEVICE_ATTR(bridge_mode, S_IWUSR | S_IRUGO, bridge_mode_show, bridge_mode_store);\nstatic DEVICE_ATTR(bridge_ipv4, S_IWUSR | S_IRUGO, bridge_ipv4_show, bridge_ipv4_store);\n\n#ifndef MHI_NETDEV_ONE_CARD_MODE\nstatic struct attribute *pcie_mhi_qmap_sysfs_attrs[] = {\n\t&dev_attr_bridge_mode.attr,\n\t&dev_attr_bridge_ipv4.attr,\n\tNULL,\n};\n\nstatic struct attribute_group pcie_mhi_qmap_sysfs_attr_group = {\n\t.attrs = pcie_mhi_qmap_sysfs_attrs,\n};\n#endif\n#endif\n\nstatic struct sk_buff * add_mbim_hdr(struct sk_buff *skb, u8 mux_id) {\n\tstruct mhi_mbim_hdr *mhdr;\n\t__le32 sign;\n\tu8 *c;\n\tu16 tci = mux_id;\n\tunsigned int skb_len = skb->len;\n\n\tif (qmap_mode > 1)\n\t\ttci += 1; //rmnet_mhi0.X map to session X\n\n\tif (skb_headroom(skb) < sizeof(struct mhi_mbim_hdr)) {\n\t\tprintk(\"skb_headroom small! headroom is %u, need %zd\\n\", skb_headroom(skb), sizeof(struct mhi_mbim_hdr));\n\t\treturn NULL;\n\t}\n\n\tskb_push(skb, sizeof(struct mhi_mbim_hdr));\n\n\tmhdr = (struct mhi_mbim_hdr *)skb->data;\n\n\t//printk(\"%s %p\\n\", __func__, skb->data);\n\tmhdr->nth16.dwSignature = cpu_to_le32(USB_CDC_NCM_NTH16_SIGN);\n\tmhdr->nth16.wHeaderLength = cpu_to_le16(sizeof(struct usb_cdc_ncm_nth16));\n/*\n\tSequence number. The transmitter of a block shall set this to zero in the first NTB transferred after every 'function reset' event,\n\tand shall increment for every NTB subsequently transferred.\n\tThe effect of an out-of-sequence block on the receiver is not specified.\n\tThespecification allows the receiver to decide whether tocheck the sequence number, \n\tand to decide how to respond if it's incorrect. The sequence number is pri-marily supplied for debugging purposes.\n*/\n\t//mhdr->nth16.wSequence = cpu_to_le16(mhi_netdev->tx_seq++);\n/*\n\tSize of this NTB in bytes. Represented in little-endian form.\n\tNTB size (IN/OUT) shall not exceed dwNtbInMaxSize or dwNtbOutMaxSize respectively\n*/\n\tmhdr->nth16.wBlockLength = cpu_to_le16(skb->len);\n/*\n\tOffset, in little endian, of the first NDP16 from byte zeroof the NTB.\n\tThis value must be a multiple of 4, and must be >= 0x000C\n*/\n\tmhdr->nth16.wNdpIndex = cpu_to_le16(sizeof(struct usb_cdc_ncm_nth16));\n\n\tsign = cpu_to_le32(USB_CDC_MBIM_NDP16_IPS_SIGN);\n\tc = (u8 *)&sign;\n\tc[3] = tci;\n\n\tmhdr->ndp16.dwSignature = sign;\n\tmhdr->ndp16.wLength = cpu_to_le16(sizeof(struct usb_cdc_ncm_ndp16) + sizeof(struct usb_cdc_ncm_dpe16) * 2);\n\tmhdr->ndp16.wNextNdpIndex = 0;\n\n\tmhdr->ndp16.dpe16[0].wDatagramIndex = sizeof(struct mhi_mbim_hdr);\n\tmhdr->ndp16.dpe16[0].wDatagramLength = skb_len;\n\n\tmhdr->ndp16.dpe16[1].wDatagramIndex = 0;\n\tmhdr->ndp16.dpe16[1].wDatagramLength = 0;\n\n\treturn skb;\n}\n\nstatic struct sk_buff * add_qhdr(struct sk_buff *skb, u8 mux_id) {\n\tstruct qmap_hdr *qhdr;\n\tint pad = 0;\n\tstruct sk_buff *new_skb = NULL;\n\n\tpad = skb->len%4;\n\tif (pad) {\n\t\tpad = 4 - pad;\n\t\tif (skb_tailroom(skb) < pad) {\n\t\t\tprintk(\"skb_tailroom small!\\n\");\n\t\t\tpad = 0;\n\t\t}\n\t\tif (pad)\n\t\t\t__skb_put(skb, pad);\n\t}\n\t\t\t\t\t\n\tqhdr = (struct qmap_hdr *)skb_push(skb, sizeof(struct qmap_hdr));\n\tqhdr->cd_rsvd_pad = pad;\n\tqhdr->mux_id = mux_id;\n\tqhdr->pkt_len = cpu_to_be16(skb->len - sizeof(struct qmap_hdr));\n\n\treturn skb;\n}\n\nstatic struct sk_buff * add_qhdr_v5(struct sk_buff *skb, u8 mux_id) {\n\tstruct rmnet_map_header *map_header;\n\tstruct rmnet_map_v5_csum_header *ul_header;\n\tu32 padding, map_datalen;\n\tstruct sk_buff *new_skb = NULL;\n\n\tmap_datalen = skb->len;\n\tpadding = map_datalen%4;\n\tif (padding) {\n\t\tpadding = 4 - padding;\n\t\tif (skb_tailroom(skb) < padding) {\n\t\t\tprintk(\"skb_tailroom small!\\n\");\n\t\t\tpadding = 0;\n\t\t}\n\t\tif (padding)\n\t\t\t__skb_put(skb, padding);\n\t}\n\t\t\t\t\t\n\tmap_header = (struct rmnet_map_header *)skb_push(skb, (sizeof(struct rmnet_map_header) + sizeof(struct rmnet_map_v5_csum_header)));\n\tmap_header->cd_bit = 0;\n\tmap_header->next_hdr = 1;\n\tmap_header->pad_len = padding;\n\tmap_header->mux_id = mux_id;\n\tmap_header->pkt_len = htons(map_datalen + padding);\n\n\tul_header = (struct rmnet_map_v5_csum_header *)(map_header + 1);\n\tmemset(ul_header, 0, sizeof(*ul_header));\n\tul_header->header_type = RMNET_MAP_HEADER_TYPE_CSUM_OFFLOAD;\n\tif (skb->ip_summed == CHECKSUM_PARTIAL) {\n#if 0 //TODO\n\t\tskb->ip_summed = CHECKSUM_NONE;\n\t\t/* Ask for checksum offloading */\n\t\tul_header->csum_valid_required = 1;\n#endif\n\t}\n\n\treturn skb;\n}\n\nstatic void rmnet_map_send_ack(struct mhi_netdev *pQmapDev,\n\t\t\t\t\t unsigned char type,\t\n\t\t\t\t\t struct rmnet_map_header *map_header)\n{\n\tstruct rmnet_map_control_command *cmd;\n\tstruct sk_buff *skb;\n\tsize_t skb_len = sizeof(struct rmnet_map_header) + sizeof(struct rmnet_map_control_command);\n\n\tskb = alloc_skb(skb_len, GFP_ATOMIC);\n\tif (!skb)\n\t\treturn;\n\t\n\tskb_put(skb, skb_len);\n\tmemcpy(skb->data, map_header, skb_len);\n\tcmd = (struct rmnet_map_control_command *)(skb->data + sizeof(struct rmnet_map_header));\n\tcmd->cmd_type = type & 0x03;\n\tskb->protocol = htons(ETH_P_MAP);\n\tskb->dev = pQmapDev->ndev;\n\tdev_queue_xmit(skb);\n}\n\nstatic int rmnet_data_vnd_do_flow_control(struct net_device *dev,\n\t\t\t       uint32_t map_flow_id,\n\t\t\t       uint16_t v4_seq,\n\t\t\t       uint16_t v6_seq,\n\t\t\t       int enable)\n{\n\t//TODO\n\treturn 0;\n}\n\nstatic uint8_t rmnet_map_do_flow_control(struct mhi_netdev *pQmapDev,\n\t\t\t\t\t struct rmnet_map_header *map_header,\n\t\t\t\t\t int enable) {\n\tstruct net_device *ndev = pQmapDev->ndev;\n\tstruct rmnet_map_control_command *cmd;\n\tstruct net_device *vnd;\n\tuint8_t mux_id;\n\tuint16_t  ip_family;\n\tuint16_t  fc_seq;\n\tuint32_t  qos_id;\n\tint r;\n\n\tcmd = (struct rmnet_map_control_command *)(map_header + 1);\n\n\tmux_id = map_header->mux_id - QUECTEL_QMAP_MUX_ID;\n\tif (mux_id >= pQmapDev->qmap_mode) {\n\t\tnetdev_info(ndev, \"drop qmap unknow mux_id %x\\n\", map_header->mux_id);\n\t\treturn RMNET_MAP_COMMAND_UNSUPPORTED;\n\t}\n\n\tvnd = pQmapDev->mpQmapNetDev[mux_id];\n\tif (vnd == NULL) {\n\t\tnetdev_info(ndev, \"drop qmap unknow mux_id %x\\n\", map_header->mux_id);\n\t\treturn RMNET_MAP_COMMAND_UNSUPPORTED;\n\t}\n\n\tip_family = cmd->flow_control.ip_family;\n\tfc_seq = ntohs(cmd->flow_control.flow_control_seq_num);\n\tqos_id = ntohl(cmd->flow_control.qos_id);\n\n\t if (enable)\n\t\t pQmapDev->flow_control |= (1 << mux_id);\n\t else\n\t\t pQmapDev->flow_control &= ~(1 << mux_id);\n\t/* Ignore the ip family and pass the sequence number for both v4 and v6\n\t * sequence. User space does not support creating dedicated flows for\n\t * the 2 protocols\n\t */\n\tr = rmnet_data_vnd_do_flow_control(vnd, qos_id, fc_seq, fc_seq, enable);\n\tnetdev_dbg(vnd, \"qos_id:0x%08X, ip_family:%hd, fc_seq %hd, en:%d\",\n\t     qos_id, ip_family & 3, fc_seq, enable);\n\n\treturn RMNET_MAP_COMMAND_ACK;\n}\n\nstatic void rmnet_data_map_command(struct mhi_netdev *pQmapDev,\n\t\t\t\t\t struct rmnet_map_header *map_header) {\n\tstruct net_device *ndev = pQmapDev->ndev;\n\tstruct rmnet_map_control_command *cmd;\n\tunsigned char command_name;\n\tunsigned char rc = 0;\n\n\tcmd = (struct rmnet_map_control_command *)(map_header + 1);\n\tcommand_name = cmd->command_name;\n\n\tif (command_name < RMNET_MAP_COMMAND_ENUM_LENGTH)\n\t\tpQmapDev->rmnet_map_command_stats[command_name]++;\n\n\tswitch (command_name) {\n\tcase RMNET_MAP_COMMAND_FLOW_ENABLE:\n\t\trc = rmnet_map_do_flow_control(pQmapDev, map_header, 1);\n\t\tbreak;\n\n\tcase RMNET_MAP_COMMAND_FLOW_DISABLE:\n\t\trc = rmnet_map_do_flow_control(pQmapDev, map_header, 0);\n\t\tbreak;\n\n\tdefault:\n\t\tpQmapDev->rmnet_map_command_stats[RMNET_MAP_COMMAND_UNKNOWN]++;\n\t\tnetdev_info(ndev, \"UNSupport MAP command: %d\", command_name);\n\t\trc = RMNET_MAP_COMMAND_UNSUPPORTED;\n\t\tbreak;\n\t}\n\n\tif (rc == RMNET_MAP_COMMAND_ACK)\n\t\trmnet_map_send_ack(pQmapDev, rc, map_header);\n\n\treturn;\n}\n\n#ifndef MHI_NETDEV_ONE_CARD_MODE\nstatic void rmnet_vnd_upate_rx_stats(struct net_device *net,\n\t\t\tunsigned rx_packets, unsigned rx_bytes) {\n#if defined(MHI_NETDEV_STATUS64)\n\tstruct qmap_priv *dev = netdev_priv(net);\n\tstruct pcpu_sw_netstats *stats64 = this_cpu_ptr(dev->stats64);\n\n\tu64_stats_update_begin(&stats64->syncp);\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0))\n\tstats64->rx_packets += rx_packets;\n\tstats64->rx_bytes += rx_bytes;\n#else\n\tu64_stats_add(&stats64->rx_packets, rx_packets);\n\tu64_stats_add(&stats64->rx_bytes, rx_bytes);\n#endif\n\tu64_stats_update_end(&stats64->syncp);\n#else\n\tpriv->self_dev->stats.rx_packets += rx_packets;\n\tpriv->self_dev->stats.rx_bytes += rx_bytes;\n#endif\n}\n\nstatic void rmnet_vnd_upate_tx_stats(struct net_device *net,\n\t\t\tunsigned tx_packets, unsigned tx_bytes) {\t\n#if defined(MHI_NETDEV_STATUS64)\n\tstruct qmap_priv *dev = netdev_priv(net);\n\tstruct pcpu_sw_netstats *stats64 = this_cpu_ptr(dev->stats64);\n\n\tu64_stats_update_begin(&stats64->syncp);\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0))\n\tstats64->tx_packets += tx_packets;\n\tstats64->tx_bytes += tx_bytes;\n#else\n\tu64_stats_add(&stats64->tx_packets, tx_packets);\n\tu64_stats_add(&stats64->tx_bytes, tx_bytes);\n#endif\n\tu64_stats_update_end(&stats64->syncp);\n#else\n\tnet->stats.rx_packets += tx_packets;\n\tnet->stats.rx_bytes += tx_bytes;\n#endif\n}\n\n#if defined(MHI_NETDEV_STATUS64)\n#ifdef ANDROID_gki\nstatic void _netdev_stats_to_stats64(struct rtnl_link_stats64 *stats64,\n\t\t\t     const struct net_device_stats *netdev_stats)\n{\n#if BITS_PER_LONG == 64\n\tBUILD_BUG_ON(sizeof(*stats64) < sizeof(*netdev_stats));\n\tmemcpy(stats64, netdev_stats, sizeof(*netdev_stats));\n\t/* zero out counters that only exist in rtnl_link_stats64 */\n\tmemset((char *)stats64 + sizeof(*netdev_stats), 0,\n\t       sizeof(*stats64) - sizeof(*netdev_stats));\n#else\n\tsize_t i, n = sizeof(*netdev_stats) / sizeof(unsigned long);\n\tconst unsigned long *src = (const unsigned long *)netdev_stats;\n\tu64 *dst = (u64 *)stats64;\n\n\tBUILD_BUG_ON(n > sizeof(*stats64) / sizeof(u64));\n\tfor (i = 0; i < n; i++)\n\t\tdst[i] = src[i];\n\t/* zero out counters that only exist in rtnl_link_stats64 */\n\tmemset((char *)stats64 + n * sizeof(u64), 0,\n\t       sizeof(*stats64) - n * sizeof(u64));\n#endif\n}\n#else\nstatic void my_netdev_stats_to_stats64(struct rtnl_link_stats64 *stats64,\n\t\t\t     const struct net_device_stats *netdev_stats)\n{\n\tnetdev_stats_to_stats64(stats64, netdev_stats);\n}\n#endif\n\nstatic struct rtnl_link_stats64 *_rmnet_vnd_get_stats64(struct net_device *net, struct rtnl_link_stats64 *stats)\n{\n\tstruct qmap_priv *dev = netdev_priv(net);\n\tunsigned int start;\n\tint cpu;\n\n\tmy_netdev_stats_to_stats64(stats, &net->stats);\n\n\tif (nss_cb && dev->use_qca_nss) { // rmnet_nss.c:rmnet_nss_tx() will update rx stats\n\t\tstats->rx_packets = 0;\n\t\tstats->rx_bytes = 0;\n\t}\n\n\tfor_each_possible_cpu(cpu) {\n\t\tstruct pcpu_sw_netstats *stats64;\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0))\n\t\tu64 rx_packets, rx_bytes;\n\t\tu64 tx_packets, tx_bytes;\n\n\t\tstats64 = per_cpu_ptr(dev->stats64, cpu);\n\n\t\tdo {\n\t\t\tstart = u64_stats_fetch_begin_irq(&stats64->syncp);\n\t\t\trx_packets = stats64->rx_packets;\n\t\t\trx_bytes = stats64->rx_bytes;\n\t\t\ttx_packets = stats64->tx_packets;\n\t\t\ttx_bytes = stats64->tx_bytes;\n\t\t} while (u64_stats_fetch_retry_irq(&stats64->syncp, start));\n\n\t\tstats->rx_packets += rx_packets;\n\t\tstats->rx_bytes += rx_bytes;\n\t\tstats->tx_packets += tx_packets;\n\t\tstats->tx_bytes += tx_bytes;\n#else\n\t\tu64_stats_t rx_packets, rx_bytes;\n\t\tu64_stats_t tx_packets, tx_bytes;\n\n\t\tstats64 = per_cpu_ptr(dev->stats64, cpu);\n\n\t\tdo {\n\t\t\tstart = u64_stats_fetch_begin(&stats64->syncp);\n\t\t\trx_packets = stats64->rx_packets;\n\t\t\trx_bytes = stats64->rx_bytes;\n\t\t\ttx_packets = stats64->tx_packets;\n\t\t\ttx_bytes = stats64->tx_bytes;\n\t\t} while (u64_stats_fetch_retry(&stats64->syncp, start));\n\n\t\tstats->rx_packets += u64_stats_read(&rx_packets);\n\t\tstats->rx_bytes += u64_stats_read(&rx_bytes);\n\t\tstats->tx_packets += u64_stats_read(&tx_packets);\n\t\tstats->tx_bytes += u64_stats_read(&tx_bytes);\n#endif\n\t}\n\n\treturn stats;\n}\n\n#if (LINUX_VERSION_CODE > KERNEL_VERSION( 4,10,0 )) //bc1f44709cf27fb2a5766cadafe7e2ad5e9cb221\nstatic void rmnet_vnd_get_stats64(struct net_device *net, struct rtnl_link_stats64 *stats) {\n\t_rmnet_vnd_get_stats64(net, stats);\n}\n#else\nstatic struct rtnl_link_stats64 *rmnet_vnd_get_stats64(struct net_device *net, struct rtnl_link_stats64 *stats) {\n\treturn _rmnet_vnd_get_stats64(net, stats);\n}\n#endif\n#endif\n\nstatic void rmnet_vnd_tx_agg_work(struct work_struct *work)\n{\n\tstruct qmap_priv *priv =\n\t\t\tcontainer_of(work, struct qmap_priv, agg_wq);\n\tstruct sk_buff *skb = NULL;\n\tunsigned long flags;\n\n\tspin_lock_irqsave(&priv->agg_lock, flags);\n\tif (likely(priv->agg_skb)) {\n\t\tskb = priv->agg_skb;\n\t\tpriv->agg_skb = NULL;\n\t\tpriv->agg_count = 0;\n\t\tskb->protocol = htons(ETH_P_MAP);\n\t\tskb->dev = priv->real_dev;\n\t\tktime_get_ts64(&priv->agg_time);\n\t}\n\tspin_unlock_irqrestore(&priv->agg_lock, flags);\n\t\n\tif (skb)\n\t\tdev_queue_xmit(skb);\n}\n\nstatic enum hrtimer_restart  rmnet_vnd_tx_agg_timer_cb(struct hrtimer *timer)\n{\n\tstruct qmap_priv *priv =\n\t\t\tcontainer_of(timer, struct qmap_priv, agg_hrtimer);\n\n\tschedule_work(&priv->agg_wq);\n\treturn HRTIMER_NORESTART;\n}\n\nstatic int rmnet_vnd_tx_agg(struct sk_buff *skb, struct qmap_priv *priv) {\n\tskb->protocol = htons(ETH_P_MAP);\n\tskb->dev = priv->real_dev;\n\n\treturn dev_queue_xmit(skb);\n}\n\n\nstatic int rmnet_vnd_open(struct net_device *dev)\n{\n\tstruct qmap_priv *priv = netdev_priv(dev);\n\tstruct net_device *real_dev = priv->real_dev;\n\n\tif (!(priv->real_dev->flags & IFF_UP))\n\t\treturn -ENETDOWN;\n\n\tif (netif_carrier_ok(real_dev))\n\t\tnetif_carrier_on(dev);\n\n\treturn 0;\n}\n\nstatic int rmnet_vnd_stop(struct net_device *pNet)\n{\n\tnetif_carrier_off(pNet);\n\treturn 0;\n}\n\nstatic netdev_tx_t rmnet_vnd_start_xmit(struct sk_buff *skb,\n\t\t\t\t\tstruct net_device *pNet)\n{\n\tint err;\n\tstruct qmap_priv *priv = netdev_priv(pNet);\n\tstruct mhi_netdev *mhi_netdev = ndev_to_mhi(priv->real_dev);\n\tint skb_len = skb->len;\n\n\tif (netif_queue_stopped(priv->real_dev)) {\n\t\tnetif_stop_queue(pNet);\n\t\treturn NETDEV_TX_BUSY;\n\t}\n\n\t//printk(\"%s 1 skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n\tif (pNet->type == ARPHRD_ETHER) {\n\t\tskb_reset_mac_header(skb);\n\n#ifdef QUECTEL_BRIDGE_MODE\n\t\tif (priv->bridge_mode && bridge_mode_tx_fixup(pNet, skb, priv->bridge_ipv4, priv->bridge_mac) == NULL) {\n\t\t\tdev_kfree_skb_any (skb);\n\t\t\treturn NETDEV_TX_OK;\n\t\t}\n#endif\n\n\t\tif (skb_pull(skb, ETH_HLEN) == NULL) {\n\t\t\tdev_kfree_skb_any (skb);\n\t\t\treturn NETDEV_TX_OK;\n\t\t}\n\t}\n\t//printk(\"%s 2 skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n\tif (mhi_netdev->net_type == MHI_NET_MBIM) {\n\t\tif (add_mbim_hdr(skb, priv->mux_id) == NULL) {\n\t\t\tdev_kfree_skb_any (skb);\n\t\t\treturn NETDEV_TX_OK;\n\t\t}\n\t}\n\telse {\n\t\tif (priv->qmap_version == 5) {\n\t\t\tstruct sk_buff *new_skb = add_qhdr(skb, priv->mux_id);\n\t\t\tif (!new_skb) {\n\t\t\t\t// print error\n\t\t\t\tprintk(KERN_ERR\"add_qhdr failed, drop skb\\n\");\n\t\t\t\tdev_kfree_skb_any(skb);\n\t\t\t\treturn NETDEV_TX_OK;\n\t\t\t}\n\t\t\tskb = new_skb;\n\t\t}\n\t\telse if (priv->qmap_version == 9) {\n\t\t\tstruct sk_buff *new_skb = add_qhdr_v5(skb, priv->mux_id);\n\t\t\tif (!new_skb) {\n\t\t\t\t// print error\n\t\t\t\tprintk(KERN_ERR\"add_qhdr_v5 failed, drop skb\\n\");\n\t\t\t\tdev_kfree_skb_any(skb);\n\t\t\t\treturn NETDEV_TX_OK;\n\t\t\t}\n\t\t\tskb = new_skb;\n\t\t}\n\t\telse {\n\t\t\tdev_kfree_skb_any (skb);\n\t\t\treturn NETDEV_TX_OK;\n\t\t}\n\t}\n\t//printk(\"%s skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n\n\terr = rmnet_vnd_tx_agg(skb, priv);\n\tif (err == NET_XMIT_SUCCESS) {\n\t\trmnet_vnd_upate_tx_stats(pNet, 1, skb_len);\n\t} else {\n\t\tpNet->stats.tx_errors++;\n\t}\n\n\treturn err;\n}\n\nstatic int rmnet_vnd_change_mtu(struct net_device *rmnet_dev, int new_mtu)\n{\n\tstruct mhi_netdev *mhi_netdev;\n\n\tmhi_netdev = (struct mhi_netdev *)ndev_to_mhi(rmnet_dev);\n\t\n\tif (mhi_netdev == NULL) {\n\t\tprintk(\"warning, mhi_netdev == null\\n\");\n\t\treturn -EINVAL;\n\t}\n\n\tif (new_mtu < 0 )\t\n\t\treturn -EINVAL;\n\n\tif (new_mtu > mhi_netdev->max_mtu) {\n\t\tprintk(\"warning, set mtu=%d greater than max mtu=%d\\n\", new_mtu, mhi_netdev->max_mtu);\n\t\treturn -EINVAL;\n\t}\n\n\trmnet_dev->mtu = new_mtu;\n\treturn 0;\n}\n\n/* drivers may override default ethtool_ops in their bind() routine */\nstatic const struct ethtool_ops rmnet_vnd_ethtool_ops = {\n\t.get_link\t\t= ethtool_op_get_link,\n};\n\nstatic void rmnet_vnd_rawip_setup(struct net_device *rmnet_dev)\n{\n\trmnet_dev->needed_headroom = 16;\n\n\t/* Raw IP mode */\n\trmnet_dev->header_ops = NULL;  /* No header */\n//for Qualcomm's NSS, must set type as ARPHRD_RAWIP, or NSS performace is very bad.\n\trmnet_dev->type = ARPHRD_RAWIP; // do not support moify mac, for dev_set_mac_address() need ARPHRD_ETHER\n\trmnet_dev->hard_header_len = 0;\n//for Qualcomm's SFE, do not add IFF_POINTOPOINT to type, or SFE donot work.\n\trmnet_dev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);\n}\n\nstatic const struct net_device_ops rmnet_vnd_ops = {\n\t.ndo_open       = rmnet_vnd_open,\n\t.ndo_stop       = rmnet_vnd_stop,\n\t.ndo_start_xmit = rmnet_vnd_start_xmit,\n#if defined(MHI_NETDEV_STATUS64)\n\t.ndo_get_stats64\t= rmnet_vnd_get_stats64,\n#endif\n\t.ndo_change_mtu = rmnet_vnd_change_mtu,\n\t.ndo_set_mac_address \t= eth_mac_addr,\n\t.ndo_validate_addr\t= eth_validate_addr,\n};\n\nstatic rx_handler_result_t qca_nss_rx_handler(struct sk_buff **pskb)\n{\n\tstruct sk_buff *skb = *pskb;\n\n\tif (!skb)\n\t\treturn RX_HANDLER_CONSUMED;\n\t\n\t//printk(\"%s skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n\n\tif (skb->pkt_type == PACKET_LOOPBACK)\n\t\treturn RX_HANDLER_PASS;\n\n\t/* Check this so that we dont loop around netif_receive_skb */\n\tif (skb->cb[0] == 1) {\n\t\tskb->cb[0] = 0;\n\n\t\treturn RX_HANDLER_PASS;\n\t}\n\n\tif (nss_cb) {\n\t\tnss_cb->nss_tx(skb);\n\t\treturn RX_HANDLER_CONSUMED;\n\t}\n\n\treturn RX_HANDLER_PASS;\n}\n#endif\n\nstatic void rmnet_mbim_rx_handler(void *dev, struct sk_buff *skb_in)\n{\n\tstruct mhi_netdev *pQmapDev = (struct mhi_netdev *)dev;\n\tstruct mhi_netdev *mhi_netdev = (struct mhi_netdev *)dev;\n\tMHI_MBIM_CTX *ctx = &pQmapDev->mbim_ctx;\n\t//struct net_device *ndev = pQmapDev->ndev;\n\tstruct usb_cdc_ncm_nth16 *nth16;\n\tint ndpoffset, len;\n\tu16 wSequence;\n\tstruct sk_buff_head skb_chain;\n\tstruct sk_buff *qmap_skb;\n\n\t__skb_queue_head_init(&skb_chain);\n\n\tif (skb_in->len < (sizeof(struct usb_cdc_ncm_nth16) + sizeof(struct usb_cdc_ncm_ndp16))) {\n\t\tMSG_ERR(\"frame too short\\n\");\n\t\tgoto error;\n\t}\n\n\tnth16 = (struct usb_cdc_ncm_nth16 *)skb_in->data;\n\n\tif (nth16->dwSignature != cpu_to_le32(USB_CDC_NCM_NTH16_SIGN)) {\n\t\tMSG_ERR(\"invalid NTH16 signature <%#010x>\\n\", le32_to_cpu(nth16->dwSignature));\n\t\tgoto error;\n\t}\n\n\tlen = le16_to_cpu(nth16->wBlockLength);\n\tif (len > ctx->rx_max) {\n\t\tMSG_ERR(\"unsupported NTB block length %u/%u\\n\", len, ctx->rx_max);\n\t\tgoto error;\n\t}\n\n\twSequence = le16_to_cpu(nth16->wSequence);\n\tif (ctx->rx_seq !=  wSequence) {\n\t\tMSG_ERR(\"sequence number glitch prev=%d curr=%d\\n\", ctx->rx_seq, wSequence);\n\t}\n\tctx->rx_seq = wSequence + 1;\n\n\tndpoffset = nth16->wNdpIndex;\n\n\twhile (ndpoffset > 0) {\n\t\tstruct usb_cdc_ncm_ndp16 *ndp16 ;\n\t\tstruct usb_cdc_ncm_dpe16 *dpe16;\n\t\tint nframes, x;\n\t\tu8 *c;\n\t\tu16 tci = 0;\n\t\tstruct net_device *qmap_net;\n\n\t\tif (skb_in->len < (ndpoffset + sizeof(struct usb_cdc_ncm_ndp16))) {\n\t\t\tMSG_ERR(\"invalid NDP offset  <%u>\\n\", ndpoffset);\n\t\t\tgoto error;\n\t\t}\n\n\t\tndp16 = (struct usb_cdc_ncm_ndp16 *)(skb_in->data + ndpoffset);\n\n\t\tif (le16_to_cpu(ndp16->wLength) < 0x10) {\n\t\t\tMSG_ERR(\"invalid DPT16 length <%u>\\n\", le16_to_cpu(ndp16->wLength));\n\t\t\tgoto error;\n\t\t}\n\n\t\tnframes = ((le16_to_cpu(ndp16->wLength) - sizeof(struct usb_cdc_ncm_ndp16)) / sizeof(struct usb_cdc_ncm_dpe16));\n\n\t\tif (skb_in->len < (sizeof(struct usb_cdc_ncm_ndp16) + nframes * (sizeof(struct usb_cdc_ncm_dpe16)))) {\n\t\t\tMSG_ERR(\"Invalid nframes = %d\\n\", nframes);\n\t\t\tgoto error;\n\t\t}\n\n\t\tswitch (ndp16->dwSignature & cpu_to_le32(0x00ffffff)) {\n\t\t\tcase cpu_to_le32(USB_CDC_MBIM_NDP16_IPS_SIGN):\n\t\t\t\tc = (u8 *)&ndp16->dwSignature;\n\t\t\t\ttci = c[3];\n\t\t\t\t/* tag IPS<0> packets too if MBIM_IPS0_VID exists */\n\t\t\t\t//if (!tci && info->flags & FLAG_IPS0_VLAN)\n\t\t\t\t//\ttci = MBIM_IPS0_VID;\n\t\t\tbreak;\n\t\t\tcase cpu_to_le32(USB_CDC_MBIM_NDP16_DSS_SIGN):\n\t\t\t\tc = (u8 *)&ndp16->dwSignature;\n\t\t\t\ttci = c[3] + 256;\n\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tMSG_ERR(\"unsupported NDP signature <0x%08x>\\n\", le32_to_cpu(ndp16->dwSignature));\n\t\t\tgoto error;\n\t\t}\n\n\t\tif ((qmap_mode == 1 && tci != mhi_netdev->mbim_mux_id) || (qmap_mode > 1 && (tci - mhi_netdev->mbim_mux_id) > qmap_mode)){\n\t\t\tMSG_ERR(\"unsupported tci %d by now\\n\", tci);\n\t\t\tgoto error;\n\t\t}\n\t\ttci = abs(tci);\n\t\tqmap_net = pQmapDev->mpQmapNetDev[qmap_mode == 1 ? 0 : tci - 1 - mhi_netdev->mbim_mux_id];\n\n\t\tdpe16 = ndp16->dpe16;\n\n\t\tfor (x = 0; x < nframes; x++, dpe16++) {\n\t\t\tint offset = le16_to_cpu(dpe16->wDatagramIndex);\n\t\t\tint skb_len = le16_to_cpu(dpe16->wDatagramLength);\n\n\t\t\tif (offset == 0 || skb_len == 0) {\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\t/* sanity checking */\n\t\t\tif (((offset + skb_len) > skb_in->len) || (skb_len > ctx->rx_max)) {\n\t\t\t\tMSG_ERR(\"invalid frame detected (ignored) x=%d, offset=%d, skb_len=%u\\n\", x, offset, skb_len);\n\t\t\t\tgoto error;\n\t\t\t}\n\n\t\t\tqmap_skb = netdev_alloc_skb(qmap_net,  skb_len);\n\t\t\tif (!qmap_skb) {\n\t\t\t\tmhi_netdev->stats.alloc_failed++;\n\t\t\t\t//MSG_ERR(\"skb_clone fail\\n\"); //do not print in softirq\n\t\t\t\tgoto error;\n\t\t\t}\n\n\t\t\tswitch (skb_in->data[offset] & 0xf0) {\n\t\t\t\tcase 0x40:\n#ifdef CONFIG_QCA_NSS_PACKET_FILTER\n\t\t\t\t\t{\n\t\t\t\t\t\tstruct iphdr *ip4h = (struct iphdr *)(&skb_in->data[offset]);\n\t\t\t\t\t\tif (ip4h->protocol == IPPROTO_ICMP) {\n\t\t\t\t\t\t\tqmap_skb->cb[0] = 1;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n#endif\n\t\t\t\t\tqmap_skb->protocol = htons(ETH_P_IP);\n\t\t\t\tbreak;\n\t\t\t\tcase 0x60:\n#ifdef CONFIG_QCA_NSS_PACKET_FILTER\n\t\t\t\t\t{\n\t\t\t\t\t\tstruct ipv6hdr *ip6h = (struct ipv6hdr *)(&skb_in->data[offset]);\n\t\t\t\t\t\tif (ip6h->nexthdr == NEXTHDR_ICMP) {\n\t\t\t\t\t\t\tqmap_skb->cb[0] = 1;\n\t\t\t\t\t\t}\n\t\t  }\n#endif\n\t\t\t\t\tqmap_skb->protocol = htons(ETH_P_IPV6);\n\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tMSG_ERR(\"unknow skb->protocol %02x\\n\", skb_in->data[offset]);\n\t\t\t\t\tgoto error;\n\t\t\t}\n\t\t\t\n\t\t\tskb_put(qmap_skb, skb_len);\n\t\t\tmemcpy(qmap_skb->data, skb_in->data + offset, skb_len);\n\n\t\t\tskb_reset_transport_header(qmap_skb);\n\t\t\tskb_reset_network_header(qmap_skb);\n\t\t\tqmap_skb->pkt_type = PACKET_HOST;\n\t\t\tskb_set_mac_header(qmap_skb, 0);\n\n\t\t\tif (qmap_skb->dev->type == ARPHRD_ETHER) {\n\t\t\t\tskb_push(qmap_skb, ETH_HLEN);\n\t\t\t\tskb_reset_mac_header(qmap_skb);\n\t\t\t\tmemcpy(eth_hdr(qmap_skb)->h_source, default_modem_addr, ETH_ALEN);\n\t\t\t\tmemcpy(eth_hdr(qmap_skb)->h_dest, qmap_net->dev_addr, ETH_ALEN);\n\t\t\t\teth_hdr(qmap_skb)->h_proto = qmap_skb->protocol;\n#ifdef QUECTEL_BRIDGE_MODE\n\t\t\t\tbridge_mode_rx_fixup(pQmapDev, qmap_net, qmap_skb);\n#endif\n\t\t\t\t__skb_pull(qmap_skb, ETH_HLEN);\n\t\t\t}\n\n#ifndef MHI_NETDEV_ONE_CARD_MODE\n\t\t\trmnet_vnd_upate_rx_stats(qmap_net, 1, skb_len);\n#endif\n\t\t\t__skb_queue_tail(&skb_chain, qmap_skb);\n\t\t}\n\n\t\t/* are there more NDPs to process? */\n\t\tndpoffset = le16_to_cpu(ndp16->wNextNdpIndex);\n\t}\n\nerror:\n\twhile ((qmap_skb = __skb_dequeue (&skb_chain))) {\n\t\tnetif_receive_skb(qmap_skb);\n\t}\t\n}\n\nstatic void rmnet_qmi_rx_handler(void *dev, struct sk_buff *skb_in)\n{\n\tstruct mhi_netdev *pQmapDev = (struct mhi_netdev *)dev;\n\tstruct net_device *ndev = pQmapDev->ndev;\n\tstruct sk_buff *qmap_skb;\n\tstruct sk_buff_head skb_chain;\n\tuint dl_minimum_padding = 0;\n\n\tif (pQmapDev->qmap_version == 9)\n\t\tdl_minimum_padding = pQmapDev->dl_minimum_padding;\n\n\t__skb_queue_head_init(&skb_chain);\n\n\twhile (skb_in->len > sizeof(struct qmap_hdr)) {\n\t\tstruct rmnet_map_header *map_header = (struct rmnet_map_header *)skb_in->data;\n\t\tstruct rmnet_map_v5_csum_header *ul_header = NULL;\n\t\tsize_t hdr_size = sizeof(struct rmnet_map_header);\t\n\t\tstruct net_device *qmap_net;\n\t\tint pkt_len = ntohs(map_header->pkt_len);\n\t\tint skb_len;\n\t\t__be16 protocol;\n\t\tint mux_id;\n\t\tint skip_nss = 0;\n\n\t\tif (map_header->next_hdr) {\n\t\t\tul_header = (struct rmnet_map_v5_csum_header *)(map_header + 1);\n\t\t\thdr_size += sizeof(struct rmnet_map_v5_csum_header);\n\t\t}\n\t\t\t\n\t\tskb_len = pkt_len - (map_header->pad_len&0x3F);\n#if 0 //just for debug dl_minimum_padding BUG\n\t\tif ((skb_in->data[hdr_size] & 0xf0) == 0x45) {\n\t\t\tstruct iphdr *ip4h = (struct iphdr *)(&skb_in->data[hdr_size]);\n\t\t\tif (ntohs(ip4h->tot_len) != skb_len) {\n\t\t\t\tnetdev_info(ndev, \"tot_len=%d skb_len=%d\\n\", ntohs(ip4h->tot_len), skb_len);\n\t\t\t}\n\t\t}\n#endif\n\t\tskb_len -= dl_minimum_padding;\n\n\t\tmux_id = map_header->mux_id - QUECTEL_QMAP_MUX_ID;\n\t\tif (mux_id >= pQmapDev->qmap_mode) {\n\t\t\tnetdev_info(ndev, \"drop qmap unknow mux_id %x\\n\", map_header->mux_id);\n\t\t\tgoto error_pkt;\n\t\t}\n\t\tmux_id = abs(mux_id);\n\t\tqmap_net = pQmapDev->mpQmapNetDev[mux_id];\n\t\tif (qmap_net == NULL) {\n\t\t\tnetdev_info(ndev, \"drop qmap unknow mux_id %x\\n\", map_header->mux_id);\n\t\t\tgoto skip_pkt;\n\t\t}\n\n\t\tif (skb_len > qmap_net->mtu) {\n\t\t\tnetdev_info(ndev, \"drop skb_len=%x larger than qmap mtu=%d\\n\", skb_len, qmap_net->mtu);\n\t\t\tgoto error_pkt;\n\t\t}\n\n\t\tif (skb_in->len < (pkt_len + hdr_size)) {\n\t\t\tnetdev_info(ndev, \"drop qmap unknow pkt, len=%d, pkt_len=%d\\n\", skb_in->len, pkt_len);\n\t\t\tgoto error_pkt;\n\t\t}\n\n\t\tif (map_header->cd_bit) {\n\t\t\trmnet_data_map_command(pQmapDev, map_header);\n\t\t\tgoto skip_pkt;\n\t\t}\n\n\t\tswitch (skb_in->data[hdr_size] & 0xf0) {\n\t\t\tcase 0x40:\n#ifdef CONFIG_QCA_NSS_PACKET_FILTER\n\t\t\t\t{\n\t\t\t\t\tstruct iphdr *ip4h = (struct iphdr *)(&skb_in->data[hdr_size]);\n\t\t\t\t\tif (ip4h->protocol == IPPROTO_ICMP) {\n\t\t\t\t\t\tskip_nss = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n#endif\n\t\t\t\tprotocol = htons(ETH_P_IP);\n\t\t\tbreak;\n\t\t\tcase 0x60:\n#ifdef CONFIG_QCA_NSS_PACKET_FILTER\n\t\t\t\t{\n\t\t\t\t\tstruct ipv6hdr *ip6h = (struct ipv6hdr *)(&skb_in->data[hdr_size]);\n\t\t\t\t\tif (ip6h->nexthdr == NEXTHDR_ICMP) {\n\t\t\t\t\t\tskip_nss = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n#endif\n\t\t\t\tprotocol = htons(ETH_P_IPV6);\n\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tnetdev_info(ndev, \"unknow skb->protocol %02x\\n\", skb_in->data[hdr_size]);\n\t\t\t\tgoto error_pkt;\n\t\t}\n\n//for Qualcomm's SFE, do not use skb_clone(), or SFE 's performace is very bad.\n//for Qualcomm's NSS, do not use skb_clone(), or NSS 's performace is very bad.\n\t\tqmap_skb = netdev_alloc_skb(qmap_net,  skb_len);\n\t\tif (qmap_skb) {\n\t\t\tskb_put(qmap_skb, skb_len);\n\t\t\tmemcpy(qmap_skb->data, skb_in->data + hdr_size, skb_len);\n\t\t}\n\n\t\tif (qmap_skb == NULL) {\n\t\t\tpQmapDev->stats.alloc_failed++;\n\t\t\t//netdev_info(ndev, \"fail to alloc skb, pkt_len = %d\\n\", skb_len); //do not print in softirq\n\t\t\tgoto error_pkt;\n\t\t}\n\n\t\tskb_reset_transport_header(qmap_skb);\n\t\tskb_reset_network_header(qmap_skb);\n\t\tqmap_skb->pkt_type = PACKET_HOST;\n\t\tskb_set_mac_header(qmap_skb, 0);\n\t\tqmap_skb->protocol = protocol;\n\n\t\tif(skip_nss)\n\t\t\tqmap_skb->cb[0] = 1;\n\n\t\tif (ul_header && ul_header->header_type == RMNET_MAP_HEADER_TYPE_CSUM_OFFLOAD\n\t\t\t&& ul_header->csum_valid_required) {\n#if 0 //TODO\n\t\t\tqmap_skb->ip_summed = CHECKSUM_UNNECESSARY;\n#endif\n\t\t}\n\n\t\tif (qmap_skb->dev->type == ARPHRD_ETHER) {\n\t\t\tskb_push(qmap_skb, ETH_HLEN);\n\t\t\tskb_reset_mac_header(qmap_skb);\n\t\t\tmemcpy(eth_hdr(qmap_skb)->h_source, default_modem_addr, ETH_ALEN);\n\t\t\tmemcpy(eth_hdr(qmap_skb)->h_dest, qmap_net->dev_addr, ETH_ALEN);\n\t\t\teth_hdr(qmap_skb)->h_proto = protocol;\n#ifdef QUECTEL_BRIDGE_MODE\n\t\t\tbridge_mode_rx_fixup(pQmapDev, qmap_net, qmap_skb);\n#endif\n\t\t\t__skb_pull(qmap_skb, ETH_HLEN);\n\t\t}\n\n#ifndef MHI_NETDEV_ONE_CARD_MODE\n\t\trmnet_vnd_upate_rx_stats(qmap_net, 1, skb_len);\n#endif\n\t\t__skb_queue_tail(&skb_chain, qmap_skb);\n\nskip_pkt:\n\t\tskb_pull(skb_in, pkt_len + hdr_size);\n\t}\n\nerror_pkt:\n\twhile ((qmap_skb = __skb_dequeue (&skb_chain))) {\n\t\tnetif_receive_skb(qmap_skb);\n\t}\n}\n\n#ifndef MHI_NETDEV_ONE_CARD_MODE\nstatic rx_handler_result_t rmnet_rx_handler(struct sk_buff **pskb)\n{\n\tstruct sk_buff *skb = *pskb;\n\tstruct mhi_netdev *mhi_netdev;\n\n\tif (!skb)\n\t\tgoto done;\n\n\t//printk(\"%s skb=%p, protocol=%x, len=%d\\n\", __func__, skb, skb->protocol, skb->len);\n\n\tif (skb->pkt_type == PACKET_LOOPBACK)\n\t\treturn RX_HANDLER_PASS;\n\n\tif (skb->protocol != htons(ETH_P_MAP)) {\n\t\tWARN_ON(1);\n\t\treturn RX_HANDLER_PASS;\n\t}\n\t/* when open hyfi function, run cm will make system crash */\n\t//dev = rcu_dereference(skb->dev->rx_handler_data);\n\tmhi_netdev = (struct mhi_netdev *)ndev_to_mhi(skb->dev);\n\t\n\tif (mhi_netdev == NULL) {\n\t\tWARN_ON(1);\n\t\treturn RX_HANDLER_PASS;\n\t}\n\n\tif (mhi_netdev->net_type == MHI_NET_MBIM)\n\t\trmnet_mbim_rx_handler(mhi_netdev, skb);\n\telse\n\t\trmnet_qmi_rx_handler(mhi_netdev, skb);\n\n\tif (!skb_cloned(skb)) {\n\t\tif (skb_queue_len(&mhi_netdev->rx_allocated) < 128) {\n\t\t\tskb->data = skb->head;\n\t\t\tskb_reset_tail_pointer(skb);\n\t\t\tskb->len = 0;\n\t\t\tskb_queue_tail(&mhi_netdev->rx_allocated, skb);\n\t\t\treturn RX_HANDLER_CONSUMED;\n\t\t}\n\t}\n\n\tconsume_skb(skb);\n\ndone:\n\treturn RX_HANDLER_CONSUMED;\n}\n\nstatic struct net_device * rmnet_vnd_register_device(struct mhi_netdev *pQmapDev, u8 offset_id, u8 mux_id)\n{\n\tstruct net_device *real_dev = pQmapDev->ndev;\n\tstruct net_device *qmap_net;\n\tstruct qmap_priv *priv;\n\tint err;\n\tint use_qca_nss = !!nss_cb;\n\tunsigned char temp_addr[ETH_ALEN];\n\n\tqmap_net = alloc_etherdev(sizeof(*priv));\n\tif (!qmap_net)\n\t\treturn NULL;\n\n\tSET_NETDEV_DEV(qmap_net, &real_dev->dev);\n\tpriv = netdev_priv(qmap_net);\n\tpriv->offset_id = offset_id;\n\tpriv->real_dev = pQmapDev->ndev;\n\tpriv->self_dev = qmap_net;\n\tpriv->pQmapDev = pQmapDev;\n\tpriv->qmap_version = pQmapDev->qmap_version;\n\tpriv->mux_id = mux_id;\n\tsprintf(qmap_net->name, \"%.12s.%d\", real_dev->name, offset_id + 1);\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0))\n\t__dev_addr_set(qmap_net, real_dev->dev_addr, ETH_ALEN);\n#else\n\tmemcpy (qmap_net->dev_addr, real_dev->dev_addr, ETH_ALEN);\n#endif\n\t//qmap_net->dev_addr[5] = offset_id + 1;\n\t//eth_random_addr(qmap_net->dev_addr);\t\n\tmemcpy(temp_addr, qmap_net->dev_addr, ETH_ALEN);\n\ttemp_addr[5] = offset_id + 1;\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0))\n\t__dev_addr_set(qmap_net, temp_addr, ETH_ALEN);\n#else\n\tmemcpy(qmap_net->dev_addr, temp_addr, ETH_ALEN);\n#endif\n#if defined(MHI_NETDEV_STATUS64)\n\tpriv->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);\n\tif (!priv->stats64)\n\t\tgoto out_free_newdev;\n#endif\n\n#ifdef QUECTEL_BRIDGE_MODE\n\tpriv->bridge_mode = !!(pQmapDev->bridge_mode & BIT(offset_id));\n\tqmap_net->sysfs_groups[0] = &pcie_mhi_qmap_sysfs_attr_group;\n\tif (priv->bridge_mode)\n\t\tuse_qca_nss = 0;\n#endif\n\n\tpriv->agg_skb = NULL;\n\tpriv->agg_count = 0;\n#if LINUX_VERSION_CODE < KERNEL_VERSION(6,18,0)\n\thrtimer_init(&priv->agg_hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);\n\tpriv->agg_hrtimer.function = rmnet_vnd_tx_agg_timer_cb;\n#else\n\thrtimer_setup(&priv->agg_hrtimer, rmnet_vnd_tx_agg_timer_cb, CLOCK_MONOTONIC, HRTIMER_MODE_REL);\n#endif\n\tINIT_WORK(&priv->agg_wq, rmnet_vnd_tx_agg_work);\n\tktime_get_ts64(&priv->agg_time);\n\tspin_lock_init(&priv->agg_lock);\n\tpriv->use_qca_nss = 0;\n\n\tqmap_net->ethtool_ops = &rmnet_vnd_ethtool_ops;\n\tqmap_net->netdev_ops = &rmnet_vnd_ops;\n\tqmap_net->flags |= IFF_NOARP;\n\tqmap_net->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)\n\tqmap_net->max_mtu = pQmapDev->max_mtu;\n#endif\n\n\tif (nss_cb && use_qca_nss) {\n\t\trmnet_vnd_rawip_setup(qmap_net);\n\t}\n#ifdef CONFIG_PINCTRL_IPQ9574\n\trmnet_vnd_rawip_setup(qmap_net);\n#endif\n\tif (pQmapDev->net_type == MHI_NET_MBIM) {\n\t\tqmap_net->needed_headroom = sizeof(struct mhi_mbim_hdr);\n\t}\n\t\n\terr = register_netdev(qmap_net);\n\tpr_info(\"%s(%s)=%d\\n\", __func__, qmap_net->name, err);\n\tif (err == -EEXIST) {\n\t\t//'ifdown wan' for openwrt, why?\n\t}\n\tif (err < 0)\n\t\tgoto out_free_newdev;\n\n\tnetif_device_attach (qmap_net);\n\tnetif_carrier_off(qmap_net);\n\n\tif (nss_cb && use_qca_nss) {\n\t\tint rc = nss_cb->nss_create(qmap_net);\n\t\tWARN_ON(rc);\n\t\tif (rc) {\n\t\t\t/* Log, but don't fail the device creation */\n\t\t\tnetdev_err(qmap_net, \"Device will not use NSS path: %d\\n\", rc);\n\t\t} else {\n\t\t\tpriv->use_qca_nss = 1;\n\t\t\tnetdev_info(qmap_net, \"NSS context created\\n\");\n\t\t\trtnl_lock();\n\t\t\tnetdev_rx_handler_register(qmap_net, qca_nss_rx_handler, NULL);\n\t\t\trtnl_unlock();\t\t\t\n\t\t}\n\t}\n\n\treturn qmap_net;\n\nout_free_newdev:\n\tfree_netdev(qmap_net);\n\treturn NULL;\n}\n\nstatic void  rmnet_vnd_unregister_device(struct net_device *qmap_net) {\n\tstruct qmap_priv *priv;\n\tunsigned long flags;\n\n\tpr_info(\"%s(%s)\\n\", __func__, qmap_net->name);\n\tnetif_carrier_off(qmap_net);\n\n\tpriv = netdev_priv(qmap_net);\n\thrtimer_cancel(&priv->agg_hrtimer);\n\tcancel_work_sync(&priv->agg_wq);\n\n\tspin_lock_irqsave(&priv->agg_lock, flags);\n\tif (priv->agg_skb) {\n\t\tkfree_skb(priv->agg_skb);\n\t\tpriv->agg_skb = NULL;\n\t\tpriv->agg_count = 0;\n\t}\n\tspin_unlock_irqrestore(&priv->agg_lock, flags);\n\n\tif (nss_cb && priv->use_qca_nss) {\n\t\trtnl_lock();\n\t\tnetdev_rx_handler_unregister(qmap_net);\n\t\trtnl_unlock();\n\t\tnss_cb->nss_free(qmap_net);\n\t}\n#if defined(MHI_NETDEV_STATUS64)\n\tfree_percpu(priv->stats64);\n#endif\n\tunregister_netdev (qmap_net);\n\tfree_netdev(qmap_net);\n}\n#endif\n\nstatic void rmnet_info_set(struct mhi_netdev *pQmapDev, RMNET_INFO *rmnet_info)\n{\t\n\trmnet_info->size = sizeof(RMNET_INFO);\n\trmnet_info->rx_urb_size = pQmapDev->qmap_size;\n\trmnet_info->ep_type = 3; //DATA_EP_TYPE_PCIE\n\trmnet_info->iface_id = 4;\n\trmnet_info->qmap_mode = pQmapDev->qmap_mode;\n\trmnet_info->qmap_version = pQmapDev->qmap_version;\n\trmnet_info->dl_minimum_padding = 0;\n}\n\nstatic ssize_t qmap_mode_show(struct device *dev, struct device_attribute *attr, char *buf) {\n\tstruct net_device *ndev = to_net_dev(dev);\n\tstruct mhi_netdev *mhi_netdev = ndev_to_mhi(ndev);\n\n\treturn snprintf(buf, PAGE_SIZE, \"%u\\n\",  mhi_netdev->qmap_mode);\n}\n\nstatic DEVICE_ATTR(qmap_mode, S_IRUGO, qmap_mode_show, NULL);\n\nstatic ssize_t qmap_size_show(struct device *dev, struct device_attribute *attr, char *buf) {\n\tstruct net_device *ndev = to_net_dev(dev);\n\tstruct mhi_netdev *mhi_netdev = ndev_to_mhi(ndev);\n\n\treturn snprintf(buf, PAGE_SIZE, \"%u\\n\",  mhi_netdev->qmap_size);\n}\n\nstatic DEVICE_ATTR(qmap_size, S_IRUGO, qmap_size_show, NULL);\n\nstatic ssize_t link_state_show(struct device *dev, struct device_attribute *attr, char *buf) {\n\tstruct net_device *ndev = to_net_dev(dev);\n\tstruct mhi_netdev *mhi_netdev = ndev_to_mhi(ndev);\n\n\treturn snprintf(buf, PAGE_SIZE, \"0x%x\\n\",  mhi_netdev->link_state);\n}\n\nstatic ssize_t link_state_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {\n\tstruct net_device *ndev = to_net_dev(dev);\n\tstruct mhi_netdev *mhi_netdev = ndev_to_mhi(ndev);\n\t//struct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\tunsigned link_state = 0;\n\tunsigned old_link = mhi_netdev->link_state;\n\tuint offset_id = 0;\n\n\tlink_state = simple_strtoul(buf, NULL, 0);\n\tif (mhi_netdev->qmap_mode > 1) {\n\t\toffset_id = ((link_state&0xF) - 1);\n\n\t\tif (0 < link_state && link_state <= mhi_netdev->qmap_mode)\n\t\t\tmhi_netdev->link_state |= (1 << offset_id);\n\t\telse if (0x80 < link_state && link_state <= (0x80 + mhi_netdev->qmap_mode))\n\t\t\tmhi_netdev->link_state &= ~(1 << offset_id);\n\t}\n\telse {\n\t\tmhi_netdev->link_state = !!link_state;\n\t}\n\n\tif (old_link != mhi_netdev->link_state) {\n\t\tstruct net_device *qmap_net = mhi_netdev->mpQmapNetDev[offset_id];\n\n\t\tif (mhi_netdev->link_state)\n\t\t\tnetif_carrier_on(mhi_netdev->ndev);\n\t\telse {\n\t\t\tnetif_carrier_off(mhi_netdev->ndev);\n\t\t}\n\n\t\tif (qmap_net) {\n\t\t\tif (mhi_netdev->link_state & (1 << offset_id))\n\t\t\t\tnetif_carrier_on(qmap_net);\n\t\t\telse\n\t\t\t\tnetif_carrier_off(qmap_net);\n\t\t}\n\n\t\tdev_info(dev, \"link_state 0x%x -> 0x%x\\n\", old_link, mhi_netdev->link_state);\n\t}\n\n\treturn count;\n}\n\nstatic DEVICE_ATTR(link_state, S_IWUSR | S_IRUGO, link_state_show, link_state_store);\n\nstatic struct attribute *pcie_mhi_sysfs_attrs[] = {\n\t&dev_attr_qmap_mode.attr,\n\t&dev_attr_qmap_size.attr,\n\t&dev_attr_link_state.attr,\n#ifdef QUECTEL_BRIDGE_MODE\n\t&dev_attr_bridge_mode.attr,\n\t&dev_attr_bridge_ipv4.attr,\n#endif\n\tNULL,\n};\n\nstatic struct attribute_group pcie_mhi_sysfs_attr_group = {\n\t.attrs = pcie_mhi_sysfs_attrs,\n};\n\nstatic void mhi_netdev_upate_rx_stats(struct mhi_netdev *mhi_netdev,\n\t\t\tunsigned rx_packets, unsigned rx_bytes) {\n#if defined(MHI_NETDEV_STATUS64)\n\tstruct pcpu_sw_netstats *stats64 = this_cpu_ptr(mhi_netdev->stats64);\n\n\tu64_stats_update_begin(&stats64->syncp);\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0))\n\tstats64->rx_packets += rx_packets;\n\tstats64->rx_bytes += rx_bytes;\n#else\n\tu64_stats_add(&stats64->rx_packets, rx_packets);\n\tu64_stats_add(&stats64->rx_bytes, rx_bytes);\n#endif\t\n\tu64_stats_update_begin(&stats64->syncp);\n#else\n\tmhi_netdev->ndev->stats.rx_packets += rx_packets;\n\tmhi_netdev->ndev->stats.rx_bytes += rx_bytes;\n#endif\n}\n\nstatic void mhi_netdev_upate_tx_stats(struct mhi_netdev *mhi_netdev,\n\t\t\tunsigned tx_packets, unsigned tx_bytes) {\n#if defined(MHI_NETDEV_STATUS64)\n\tstruct pcpu_sw_netstats *stats64 = this_cpu_ptr(mhi_netdev->stats64);\n\n\tu64_stats_update_begin(&stats64->syncp);\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0))\n\tstats64->tx_packets += tx_packets;\n\tstats64->tx_bytes += tx_bytes;\n#else\n\tu64_stats_add(&stats64->tx_packets, tx_packets);\n\tu64_stats_add(&stats64->tx_bytes, tx_bytes);\n#endif\n\tu64_stats_update_begin(&stats64->syncp);\n#else\n\tmhi_netdev->ndev->stats.tx_packets += tx_packets;\n\tmhi_netdev->ndev->stats.tx_bytes += tx_bytes;\n#endif\n}\n\nstatic __be16 mhi_netdev_ip_type_trans(u8 data)\n{\n\t__be16 protocol = 0;\n\n\t/* determine L3 protocol */\n\tswitch (data & 0xf0) {\n\tcase 0x40:\n\t\tprotocol = htons(ETH_P_IP);\n\t\tbreak;\n\tcase 0x60:\n\t\tprotocol = htons(ETH_P_IPV6);\n\t\tbreak;\n\tdefault:\n\t\tprotocol = htons(ETH_P_MAP);\n\t\tbreak;\n\t}\n\n\treturn protocol;\n}\n\nstatic int mhi_netdev_alloc_skb(struct mhi_netdev *mhi_netdev, gfp_t gfp_t)\n{\n\tu32 cur_mru = mhi_netdev->mru;\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\tstruct mhi_skb_priv *skb_priv;\n\tint ret;\n\tstruct sk_buff *skb;\n\tint no_tre = mhi_get_no_free_descriptors(mhi_dev, DMA_FROM_DEVICE);\n\tint i;\n\n\tfor (i = 0; i < no_tre; i++) {\n\t\tskb = skb_dequeue(&mhi_netdev->rx_allocated);\n\t\tif (!skb) {\n\t\t\tskb = alloc_skb(/*32+*/cur_mru, gfp_t);\n\t\t\tif (skb)\n\t\t\t\tmhi_netdev->stats.rx_allocated++;\n\t\t}\n\t\tif (!skb)\n\t\t\treturn -ENOMEM;\n\n\t\tread_lock_bh(&mhi_netdev->pm_lock);\n\t\tif (unlikely(!mhi_netdev->enabled)) {\n\t\t\tMSG_ERR(\"Interface not enabled\\n\");\n\t\t\tret = -EIO;\n\t\t\tgoto error_queue;\n\t\t}\n\n\t\tskb_priv = (struct mhi_skb_priv *)skb->cb;\n\t\tskb_priv->buf = skb->data;\n\t\tskb_priv->size = cur_mru;\n\t\tskb_priv->bind_netdev = mhi_netdev;\n\t\tskb->dev = mhi_netdev->ndev;\n\t\t//skb_reserve(skb, 32); //for ethernet header\n\n\t\tspin_lock_bh(&mhi_netdev->rx_lock);\n\t\tret = mhi_queue_transfer(mhi_dev, DMA_FROM_DEVICE, skb,\n\t\t\t\t\t skb_priv->size, MHI_EOT);\n\t\tspin_unlock_bh(&mhi_netdev->rx_lock);\n\n\t\tif (ret) {\n\t\t\tskb_priv->bind_netdev = NULL;\n\t\t\tMSG_ERR(\"Failed to queue skb, ret:%d\\n\", ret);\n\t\t\tret = -EIO;\n\t\t\tgoto error_queue;\n\t\t}\n\n\t\tread_unlock_bh(&mhi_netdev->pm_lock);\n\t}\n\n\treturn 0;\n\nerror_queue:\n\tskb->destructor = NULL;\n\tread_unlock_bh(&mhi_netdev->pm_lock);\n\tdev_kfree_skb_any(skb);\n\n\treturn ret;\n}\n\nstatic void mhi_netdev_alloc_work(struct work_struct *work)\n{\n\tstruct mhi_netdev *mhi_netdev = container_of(work, struct mhi_netdev,\n\t\t\t\t\t\t   alloc_work.work);\n\t/* sleep about 1 sec and retry, that should be enough time\n\t * for system to reclaim freed memory back.\n\t */\n\tconst int sleep_ms =  1000;\n\tint retry = 60;\n\tint ret;\n\n\tMSG_LOG(\"Entered\\n\");\n\tdo {\n\t\tret = mhi_netdev_alloc_skb(mhi_netdev, GFP_KERNEL);\n\t\t/* sleep and try again */\n\t\tif (ret == -ENOMEM) {\n\t\t\tschedule_delayed_work(&mhi_netdev->alloc_work, msecs_to_jiffies(20));\n\t\t\treturn;\n\t\t\tmsleep(sleep_ms);\n\t\t\tretry--;\n\t\t}\n\t} while (ret == -ENOMEM && retry);\n\n\tMSG_LOG(\"Exit with status:%d retry:%d\\n\", ret, retry);\n}\n\nstatic void mhi_netdev_dealloc(struct mhi_netdev *mhi_netdev)\n{\n\tstruct sk_buff *skb;\n\n\tskb = skb_dequeue(&mhi_netdev->rx_allocated);\n\twhile (skb) {\n\t\tskb->destructor = NULL;\n\t\tkfree_skb(skb);\n\t\tskb = skb_dequeue(&mhi_netdev->rx_allocated);\n\t}\n}\n\n#ifdef CONFIG_USE_RMNET_DATA_FOR_SKIP_MEMCPY\nstatic struct mhi_netbuf *mhi_netdev_alloc(struct device *dev,\n\t\t\t\t\t   gfp_t gfp,\n\t\t\t\t\t   unsigned int order)\n{\n\tstruct page *page;\n\tstruct mhi_netbuf *netbuf;\n\tstruct mhi_buf *mhi_buf;\n\tvoid *vaddr;\n\n\tpage = __dev_alloc_pages(gfp, order);\n\tif (!page)\n\t\treturn NULL;\n\n\tvaddr = page_address(page);\n\n\t/* we going to use the end of page to store cached data */\n\tnetbuf = vaddr + (PAGE_SIZE << order) - sizeof(*netbuf);\n\n\tmhi_buf = (struct mhi_buf *)netbuf;\n\tmhi_buf->page = page;\n\tmhi_buf->buf = vaddr;\n\tmhi_buf->len = (void *)netbuf - vaddr;\n\tmhi_buf->dma_addr = dma_map_page(dev, page, 0, mhi_buf->len,\n\t\t\t\t\t DMA_FROM_DEVICE);\n\tif (dma_mapping_error(dev, mhi_buf->dma_addr)) {\n\t\t__free_pages(mhi_buf->page, order);\n\t\treturn NULL;\n\t}\n\n\treturn netbuf;\n}\n\nstatic void mhi_netdev_unmap_page(struct device *dev,\n\t\t\t\t  dma_addr_t dma_addr,\n\t\t\t\t  size_t len,\n\t\t\t\t  enum dma_data_direction dir)\n{\n\tdma_unmap_page(dev, dma_addr, len, dir);\n}\n\nstatic int mhi_netdev_tmp_alloc(struct mhi_netdev *mhi_netdev, int nr_tre)\n{\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\tstruct device *dev = mhi_dev->dev.parent;\n\tconst u32 order = mhi_netdev->order;\n\tint i, ret;\n\n\tfor (i = 0; i < nr_tre; i++) {\n\t\tstruct mhi_buf *mhi_buf;\n\t\tstruct mhi_netbuf *netbuf = mhi_netdev_alloc(dev, GFP_ATOMIC,\n\t\t\t\t\t\t\t     order);\n\t\tif (!netbuf)\n\t\t\treturn -ENOMEM;\n\n\t\tmhi_buf = (struct mhi_buf *)netbuf;\n\t\tnetbuf->unmap = mhi_netdev_unmap_page;\n\n\t\tret = mhi_queue_transfer(mhi_dev, DMA_FROM_DEVICE, mhi_buf,\n\t\t\t\t\t mhi_buf->len, MHI_EOT);\n\t\tif (unlikely(ret)) {\n\t\t\tMSG_ERR(\"Failed to queue transfer, ret:%d\\n\", ret);\n\t\t\tmhi_netdev_unmap_page(dev, mhi_buf->dma_addr,\n\t\t\t\t\t      mhi_buf->len, DMA_FROM_DEVICE);\n\t\t\t__free_pages(mhi_buf->page, order);\n\t\t\treturn ret;\n\t\t}\n\t}\n\n\treturn 0;\n}\n\nstatic void mhi_netdev_queue(struct mhi_netdev *mhi_netdev)\n{\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\tstruct device *dev = mhi_dev->dev.parent;\n\tstruct mhi_netbuf *netbuf;\n\tstruct mhi_buf *mhi_buf;\n\tstruct mhi_netbuf **netbuf_pool = mhi_netdev->netbuf_pool;\n\tint nr_tre = mhi_get_no_free_descriptors(mhi_dev, DMA_FROM_DEVICE);\n\tint i, peak, cur_index, ret;\n\tconst int pool_size = mhi_netdev->pool_size - 1, max_peak = 4;\n\n\tMSG_VERB(\"Enter free_desc:%d\\n\", nr_tre);\n\n\tif (!nr_tre)\n\t\treturn;\n\n\t/* try going thru reclaim pool first */\n\tfor (i = 0; i < nr_tre; i++) {\n\t\t/* peak for the next buffer, we going to peak several times,\n\t\t * and we going to give up if buffers are not yet free\n\t\t */\n\t\tcur_index = mhi_netdev->current_index;\n\t\tnetbuf = NULL;\n\t\tfor (peak = 0; peak < max_peak; peak++) {\n\t\t\tstruct mhi_netbuf *tmp = netbuf_pool[cur_index];\n\n\t\t\tmhi_buf = &tmp->mhi_buf;\n\n\t\t\tcur_index = (cur_index + 1) & pool_size;\n\n\t\t\t/* page == 1 idle, buffer is free to reclaim */\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 5,4,0 ))\n\t\t\tif (atomic_read(&mhi_buf->page->_count) == 1)\n#else\n\t\t\tif (atomic_read(&mhi_buf->page->_refcount) == 1)\n#endif\n\t\t\t{\n\t\t\t\tnetbuf = tmp;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\t/* could not find a free buffer */\n\t\tif (!netbuf)\n\t\t\tbreak;\n\n\t\t/* increment reference count so when network stack is done\n\t\t * with buffer, the buffer won't be freed\n\t\t */\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 5,4,0 ))\n\t\tatomic_inc(&mhi_buf->page->_count);\n#else\n\t\tatomic_inc(&mhi_buf->page->_refcount);\n#endif\n\t\tdma_sync_single_for_device(dev, mhi_buf->dma_addr, mhi_buf->len,\n\t\t\t\t\t   DMA_FROM_DEVICE);\n\t\tret = mhi_queue_transfer(mhi_dev, DMA_FROM_DEVICE, mhi_buf,\n\t\t\t\t\t mhi_buf->len, MHI_EOT);\n\t\tif (unlikely(ret)) {\n\t\t\tMSG_ERR(\"Failed to queue buffer, ret:%d\\n\", ret);\n\t\t\tnetbuf->unmap(dev, mhi_buf->dma_addr, mhi_buf->len,\n\t\t\t\t      DMA_FROM_DEVICE);\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 5,4,0 ))\n\t\t\tatomic_dec(&mhi_buf->page->_count);\n#else\n\t\t\tatomic_dec(&mhi_buf->page->_refcount);\n#endif\n\t\t\treturn;\n\t\t}\n\t\tmhi_netdev->current_index = cur_index;\n\t}\n\n\t/* recyling did not work, buffers are still busy allocate temp pkts */\n\tif (i < nr_tre)\n\t\tmhi_netdev_tmp_alloc(mhi_netdev, nr_tre - i);\n}\n\n/* allocating pool of memory */\nstatic int mhi_netdev_alloc_pool(struct mhi_netdev *mhi_netdev)\n{\n\tint i;\n\tstruct mhi_netbuf *netbuf, **netbuf_pool;\n\tstruct mhi_buf *mhi_buf;\n\tconst u32 order = mhi_netdev->order;\n\tstruct device *dev = mhi_netdev->mhi_dev->dev.parent;\n\n\tnetbuf_pool = kmalloc_array(mhi_netdev->pool_size, sizeof(*netbuf_pool),\n\t\t\t\t    GFP_KERNEL);\n\tif (!netbuf_pool)\n\t\treturn -ENOMEM;\n\n\tfor (i = 0; i < mhi_netdev->pool_size; i++) {\n\t\t/* allocate paged data */\n\t\tnetbuf = mhi_netdev_alloc(dev, GFP_KERNEL, order);\n\t\tif (!netbuf)\n\t\t\tgoto error_alloc_page;\n\n\t\tnetbuf->unmap = dma_sync_single_for_cpu;\n\t\tnetbuf_pool[i] = netbuf;\n\t}\n\n\tmhi_netdev->netbuf_pool = netbuf_pool;\n\n\treturn 0;\n\nerror_alloc_page:\n\tfor (--i; i >= 0; i--) {\n\t\tnetbuf = netbuf_pool[i];\n\t\tmhi_buf = &netbuf->mhi_buf;\n\t\tdma_unmap_page(dev, mhi_buf->dma_addr, mhi_buf->len,\n\t\t\t       DMA_FROM_DEVICE);\n\t\t__free_pages(mhi_buf->page, order);\n\t}\n\n\tkfree(netbuf_pool);\n\n\treturn -ENOMEM;\n}\n\nstatic void mhi_netdev_free_pool(struct mhi_netdev *mhi_netdev)\n{\n\tint i;\n\tstruct mhi_netbuf *netbuf, **netbuf_pool = mhi_netdev->netbuf_pool;\n\tstruct device *dev = mhi_netdev->mhi_dev->dev.parent;\n\tstruct mhi_buf *mhi_buf;\n\n\tfor (i = 0; i < mhi_netdev->pool_size; i++) {\n\t\tnetbuf = netbuf_pool[i];\n\t\tmhi_buf = &netbuf->mhi_buf;\n\t\tdma_unmap_page(dev, mhi_buf->dma_addr, mhi_buf->len,\n\t\t\t       DMA_FROM_DEVICE);\n\t\t__free_pages(mhi_buf->page, mhi_netdev->order);\n\t}\n\n\tkfree(mhi_netdev->netbuf_pool);\n\tmhi_netdev->netbuf_pool = NULL;\n}\n\nstatic int mhi_netdev_poll(struct napi_struct *napi, int budget)\n{\n\tstruct net_device *dev = napi->dev;\n\tstruct mhi_netdev_priv *mhi_netdev_priv = netdev_priv(dev);\n\tstruct mhi_netdev *mhi_netdev = mhi_netdev_priv->mhi_netdev;\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\tstruct mhi_net_chain *chain = &mhi_netdev->chain;\n\tint rx_work = 0;\n\n\tMSG_VERB(\"Entered\\n\");\n\n\trx_work = mhi_poll(mhi_dev, budget);\n\n\t/* chained skb, push it to stack */\n\tif (chain && chain->head) {\n\t\tnetif_receive_skb(chain->head);\n\t\tchain->head = NULL;\n\t}\n\n\tif (rx_work < 0) {\n\t\tMSG_ERR(\"Error polling ret:%d\\n\", rx_work);\n\t\tnapi_complete(napi);\n\t\treturn 0;\n\t}\n\n\t/* queue new buffers */\n\tmhi_netdev_queue(mhi_netdev);\n\n\t/* complete work if # of packet processed less than allocated budget */\n\tif (rx_work < budget)\n\t\tnapi_complete(napi);\n\n\tMSG_VERB(\"polled %d pkts\\n\", rx_work);\n\n\treturn rx_work;\n}\n#else\nstatic int mhi_netdev_poll(struct napi_struct *napi, int budget)\n{\n\tstruct net_device *dev = napi->dev;\n\tstruct mhi_netdev_priv *mhi_netdev_priv = netdev_priv(dev);\n\tstruct mhi_netdev *mhi_netdev = mhi_netdev_priv->mhi_netdev;\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\tstruct sk_buff\t\t*skb;\n\tint rx_work = 0;\n\tint ret;\n\n\tMSG_VERB(\"Entered\\n\");\n\n\trx_work = mhi_poll(mhi_dev, budget);\n\n\tif (rx_work < 0) {\n\t\tMSG_ERR(\"Error polling ret:%d\\n\", rx_work);\n\t\tnapi_complete(napi);\n\t\treturn 0;\n\t}\n\n\tif (mhi_netdev->net_type == MHI_NET_MBIM || mhi_netdev->net_type == MHI_NET_RMNET) {\n\twhile ((skb = skb_dequeue (&mhi_netdev->qmap_chain))) {\n#ifdef MHI_NETDEV_ONE_CARD_MODE\n\t\tint recly_skb = 0;\n\n\t\tmhi_netdev_upate_rx_stats(mhi_netdev, 1, skb->len);\n\t\tif (mhi_netdev->net_type == MHI_NET_MBIM)\n\t\t\trmnet_mbim_rx_handler(mhi_netdev, skb);\n\t\telse\n\t\t\trmnet_qmi_rx_handler(mhi_netdev, skb);\n\n\t\tif (!skb_cloned(skb)) {\n\t\t\tif (skb_queue_len(&mhi_netdev->rx_allocated) < 128) {\n\t\t\t\tskb->data = skb->head;\n\t\t\t\tskb_reset_tail_pointer(skb);\n\t\t\t\tskb->len = 0;\n\t\t\t\tskb_queue_tail(&mhi_netdev->rx_allocated, skb);\n\t\t\t\trecly_skb = 1;\n\t\t\t}\n\t\t}\n\t\tif (recly_skb == 0)\n\t\t\tdev_kfree_skb(skb);\n#else\n\t\tmhi_netdev_upate_rx_stats(mhi_netdev, 1, skb->len);\n\t\tskb->dev = mhi_netdev->ndev;\n\t\tskb->protocol = htons(ETH_P_MAP);\n\t\tnetif_receive_skb(skb);\n#endif\n\t}\n\t}\n\telse  if (mhi_netdev->net_type == MHI_NET_ETHER) {\n\t\twhile ((skb = skb_dequeue (&mhi_netdev->qmap_chain))) {\n\t\t\tmhi_netdev_upate_rx_stats(mhi_netdev, 1, skb->len);\n\t\t\tskb->dev = mhi_netdev->ndev;\n\t\t\tskb->protocol = mhi_netdev_ip_type_trans(skb->data[0]);\n\t\t\tnetif_receive_skb(skb);\n\t\t}\n\t}\n\n\t/* queue new buffers */\n  \tif (!delayed_work_pending(&mhi_netdev->alloc_work)) {\n\t\tret = mhi_netdev->rx_queue(mhi_netdev, GFP_ATOMIC);\n\t\tif (ret == -ENOMEM) {\n\t\t\t//MSG_LOG(\"out of tre, queuing bg worker\\n\"); //do not print in softirq\n\t\t\tmhi_netdev->stats.alloc_failed++;\n\t\t\tschedule_delayed_work(&mhi_netdev->alloc_work, msecs_to_jiffies(20));\n\t\t}\n  \t}\n\t\n\t/* complete work if # of packet processed less than allocated budget */\n\tif (rx_work < budget)\n\t\tnapi_complete(napi);\n\n\tMSG_VERB(\"polled %d pkts\\n\", rx_work);\n\n\treturn rx_work;\n}\n#endif\n\nstatic int mhi_netdev_open(struct net_device *ndev)\n{\n\tstruct mhi_netdev *mhi_netdev = ndev_to_mhi(ndev);\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\n\tMSG_LOG(\"Opened net dev interface\\n\");\n\n\t/* tx queue may not necessarily be stopped already\n\t * so stop the queue if tx path is not enabled\n\t */\n\tif (!mhi_dev->ul_chan)\n\t\tnetif_stop_queue(ndev);\n\telse\n\t\tnetif_start_queue(ndev);\n\n\treturn 0;\n\n}\n\nstatic int mhi_netdev_change_mtu(struct net_device *ndev, int new_mtu)\n{\n\tstruct mhi_netdev *mhi_netdev = ndev_to_mhi(ndev);\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\n\tif (new_mtu < 0 || mhi_dev->mtu < new_mtu)\n\t\treturn -EINVAL;\n\n\tndev->mtu = new_mtu;\n\treturn 0;\n}\n\nstatic netdev_tx_t mhi_netdev_xmit(struct sk_buff *skb, struct net_device *dev)\n{\n\tstruct mhi_netdev_priv *mhi_netdev_priv = netdev_priv(dev);\n\tstruct mhi_netdev *mhi_netdev = mhi_netdev_priv->mhi_netdev;\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\tint res = 0;\n\tstruct skb_data *entry = (struct skb_data *)(skb->cb);\n\n\tentry->packets = 1;\n\tentry->length = skb->len;\n\tentry->bind_netdev = mhi_netdev;\n\t\t\n\tMSG_VERB(\"Entered\\n\");\n\n\t//printk(\"%s skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n\t//qmap_hex_dump(__func__, skb->data, 32);\n\t\n#ifdef MHI_NETDEV_ONE_CARD_MODE\n\t//printk(\"%s dev->type=%d\\n\", __func__, dev->type);\n\n\tif (dev->type == ARPHRD_ETHER) {\t\t\n\t\tskb_reset_mac_header(skb);\n\n#ifdef QUECTEL_BRIDGE_MODE\n\t\tif (mhi_netdev->bridge_mode && bridge_mode_tx_fixup(dev, skb, mhi_netdev->bridge_ipv4, mhi_netdev->bridge_mac) == NULL) {\n\t\t\tdev_kfree_skb_any (skb);\n\t\t\treturn NETDEV_TX_OK;\n\t\t}\n#endif\n\n\t\tif ((mhi_netdev->net_type == MHI_NET_RMNET || mhi_netdev->net_type == MHI_NET_MBIM)\n\t\t\t&& (skb_pull(skb, ETH_HLEN) == NULL)) {\n\t\t\tdev_kfree_skb_any (skb);\n\t\t\treturn NETDEV_TX_OK;\n\t\t}\n\t}\n\n\tif (mhi_netdev->net_type == MHI_NET_MBIM) {\n\t\tif (add_mbim_hdr(skb, mhi_netdev->mbim_mux_id) == NULL) {\n\t\t\tdev_kfree_skb_any (skb);\n\t\t\treturn NETDEV_TX_OK;\n\t\t}\n\t}\n\telse if (mhi_netdev->net_type == MHI_NET_RMNET) {\n\t\tif (mhi_netdev->qmap_version == 5) {\n\t\t\tstruct sk_buff *new_skb = add_qhdr(skb, QUECTEL_QMAP_MUX_ID);\n\t\t\tif (!new_skb) {\n\t\t\t\t// print error\n\t\t\t\tprintk(\"add_qhdr failed, drop skb, mode MHI_NET_RMNET\\n\");\n\t\t\t\tdev_kfree_skb_any(skb);\n\t\t\t\treturn NETDEV_TX_OK;\n\t\t\t}\n\t\t\tskb = new_skb;\n\t\t}\n\t\telse if (mhi_netdev->qmap_version == 9) {\n\t\t\tstruct sk_buff *new_skb = add_qhdr_v5(skb, QUECTEL_QMAP_MUX_ID);\n\t\t\tif (!new_skb) {\n\t\t\t\t// print error\n\t\t\t\tprintk(\"add_qhdr_v5 failed, drop skb, mode MHI_NET_RMNET\\n\");\n\t\t\t\tdev_kfree_skb_any(skb);\n\t\t\t\treturn NETDEV_TX_OK;\n\t\t\t}\n\t\t\tskb = new_skb;\n\t\t}\n\t\telse {\n\t\t\tdev_kfree_skb_any (skb);\n\t\t\treturn NETDEV_TX_OK;\n\t\t}\n\t}\n#else\n\tif ((mhi_netdev->net_type == MHI_NET_RMNET || mhi_netdev->net_type == MHI_NET_MBIM)\n\t\t&& skb->protocol != htons(ETH_P_MAP)) {\n\t\tdev_kfree_skb_any(skb);\n\t\treturn NETDEV_TX_OK;\n\t}\n#endif\n\n\tif (mhi_netdev->net_type == MHI_NET_MBIM) {\n\t\tstruct mhi_mbim_hdr *mhdr = (struct mhi_mbim_hdr *)skb->data;\n\t\tmhdr->nth16.wSequence = cpu_to_le16(mhi_netdev->mbim_ctx.tx_seq++);\n\t}\n\n\tif (unlikely(mhi_get_no_free_descriptors(mhi_dev, DMA_TO_DEVICE) < 16)) {\n\t\tu32 i = 0;\n\t\tfor (i = 0; i < mhi_netdev->qmap_mode; i++) {\n\t\t\tstruct net_device *qmap_net = mhi_netdev->mpQmapNetDev[i];\n\t\t\tif (qmap_net) {\n\t\t\t\tnetif_stop_queue(qmap_net);\n\t\t\t}\n\t\t}\t\t\t\n\n\t\tnetif_stop_queue(dev);\n\t}\n\n\tres = mhi_queue_transfer(mhi_dev, DMA_TO_DEVICE, skb, skb->len,\n\t\t\t\t MHI_EOT);\n\n\t//printk(\"%s transfer res=%d\\n\", __func__, res);\n\tif (unlikely(res)) {\n\t\tdev_kfree_skb_any(skb);\n\t\tdev->stats.tx_errors++;\n\t}\n\n\tMSG_VERB(\"Exited\\n\");\n\n\treturn NETDEV_TX_OK;\n}\n\n#if defined(MHI_NETDEV_STATUS64)\nstatic struct rtnl_link_stats64 * _mhi_netdev_get_stats64(struct net_device *ndev, struct rtnl_link_stats64 *stats)\n{\n\tstruct mhi_netdev *mhi_netdev = ndev_to_mhi(ndev);\n\n\tunsigned int start;\n\tint cpu;\n\n\tnetdev_stats_to_stats64(stats, &ndev->stats);\n\n\tfor_each_possible_cpu(cpu) {\n\t\tstruct pcpu_sw_netstats *stats64;\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 1, 0))\t\n\t\tu64 rx_packets, rx_bytes;\n\t\tu64 tx_packets, tx_bytes;\n\n\t\tstats64 = per_cpu_ptr(mhi_netdev->stats64, cpu);\n\n\t\tdo {\n\t\t\tstart = u64_stats_fetch_begin_irq(&stats64->syncp);\n\t\t\trx_packets = stats64->rx_packets;\n\t\t\trx_bytes = stats64->rx_bytes;\n\t\t\ttx_packets = stats64->tx_packets;\n\t\t\ttx_bytes = stats64->tx_bytes;\n\t\t} while (u64_stats_fetch_retry_irq(&stats64->syncp, start));\n\n\t\tstats->rx_packets += rx_packets;\n\t\tstats->rx_bytes += rx_bytes;\n\t\tstats->tx_packets += tx_packets;\n\t\tstats->tx_bytes += tx_bytes;\n#else\n\t\tu64_stats_t rx_packets, rx_bytes;\n\t\tu64_stats_t tx_packets, tx_bytes;\n\n\t\tstats64 = per_cpu_ptr(mhi_netdev->stats64, cpu);\n\n\t\tdo {\n\t\t\tstart = u64_stats_fetch_begin(&stats64->syncp);\n\t\t\trx_packets = stats64->rx_packets;\n\t\t\trx_bytes = stats64->rx_bytes;\n\t\t\ttx_packets = stats64->tx_packets;\n\t\t\ttx_bytes = stats64->tx_bytes;\n\t\t} while (u64_stats_fetch_retry(&stats64->syncp, start));\n\n\t\tstats->rx_packets += u64_stats_read(&rx_packets);\n\t\tstats->rx_bytes += u64_stats_read(&rx_bytes);\n\t\tstats->tx_packets += u64_stats_read(&tx_packets);\n\t\tstats->tx_bytes += u64_stats_read(&tx_bytes);\n#endif\t\t\t\n\t}\n\n\treturn stats;\n}\n\n#if (LINUX_VERSION_CODE > KERNEL_VERSION( 4,10,0 )) //bc1f44709cf27fb2a5766cadafe7e2ad5e9cb221\nstatic void mhi_netdev_get_stats64(struct net_device *ndev, struct rtnl_link_stats64 *stats) {\n\t_mhi_netdev_get_stats64(ndev, stats);\n}\n#else\nstatic struct rtnl_link_stats64 * mhi_netdev_get_stats64(struct net_device *ndev, struct rtnl_link_stats64 *stats) {\n\t_mhi_netdev_get_stats64(ndev, stats);\n\treturn stats;\n}\n#endif\n#endif\n\nstatic int qmap_setting_store(struct mhi_netdev *mhi_netdev, QMAP_SETTING *qmap_settings, size_t size) {\t\n\tif (qmap_settings->size != size) {\n\t\tnetdev_err(mhi_netdev->ndev, \"ERROR: qmap_settings.size donot match!\\n\");\n\t\treturn -EOPNOTSUPP;\n\t}\n\n\tmhi_netdev->dl_minimum_padding = qmap_settings->dl_minimum_padding;\n\n\treturn 0;\n}\n\nstatic int qmap_ndo_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) {\n\tstruct mhi_netdev *mhi_netdev = ndev_to_mhi(dev);\n\tint rc = -EOPNOTSUPP;\n\tuint link_state = 0;\n \tQMAP_SETTING qmap_settings = {0};\n \n\tswitch (cmd) {\n\tcase 0x89F1: //SIOCDEVPRIVATE\n\t\trc = copy_from_user(&link_state, ifr->ifr_ifru.ifru_data, sizeof(link_state));\n\t\tif (!rc) {\n\t\t\tchar buf[32];\n\t\t\tsnprintf(buf, sizeof(buf), \"%u\", link_state);\n\t\t\tlink_state_store(&dev->dev, NULL, buf, strlen(buf));\n\t\t}\n\tbreak;\n\n\tcase 0x89F2: //SIOCDEVPRIVATE\n\t\trc = copy_from_user(&qmap_settings, ifr->ifr_ifru.ifru_data, sizeof(qmap_settings));\n\t\tif (!rc) {\n\t\t\trc = qmap_setting_store(mhi_netdev, &qmap_settings, sizeof(qmap_settings));\n\t\t}\n\tbreak;\n\n\tcase 0x89F3: //SIOCDEVPRIVATE\n\t\tif (mhi_netdev->use_rmnet_usb) {\n\t\t\trc = copy_to_user(ifr->ifr_ifru.ifru_data, &mhi_netdev->rmnet_info, sizeof(mhi_netdev->rmnet_info));\n\t\t}\n\tbreak;\n\n\tdefault:\n\tbreak;\n\t}\n\n\treturn rc;\n}\n\n#if (LINUX_VERSION_CODE > KERNEL_VERSION( 5,14,0 )) //b9067f5dc4a07c8e24e01a1b277c6722d91be39e\n#define use_ndo_siocdevprivate\n#endif\n#ifdef use_ndo_siocdevprivate\nstatic int qmap_ndo_siocdevprivate(struct net_device *dev, struct ifreq *ifr, void __user *data, int cmd) {\n\treturn qmap_ndo_do_ioctl(dev, ifr, cmd);\n}\n#endif\n\nstatic const struct net_device_ops mhi_netdev_ops_ip = {\n\t.ndo_open = mhi_netdev_open,\n\t.ndo_start_xmit = mhi_netdev_xmit,\n\t//.ndo_do_ioctl = mhi_netdev_ioctl,\n\t.ndo_change_mtu = mhi_netdev_change_mtu,\n#if defined(MHI_NETDEV_STATUS64)\n\t.ndo_get_stats64\t= mhi_netdev_get_stats64,\n#endif\n\t.ndo_set_mac_address = eth_mac_addr,\n\t.ndo_validate_addr = eth_validate_addr,\n\t.ndo_do_ioctl = qmap_ndo_do_ioctl,\n#ifdef use_ndo_siocdevprivate\n\t.ndo_siocdevprivate = qmap_ndo_siocdevprivate,\n#endif\n};\n\nstatic void mhi_netdev_get_drvinfo (struct net_device *ndev, struct ethtool_drvinfo *info)\n{\n\t//struct mhi_netdev *mhi_netdev = ndev_to_mhi(ndev);\n\t/* strlcpy() is deprecated in kernel 6.8.0+, using strscpy instead */\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(6,8,0))\n\tstrlcpy(info->driver, \"pcie_mhi\", sizeof(info->driver));\n\tstrlcpy(info->version, PCIE_MHI_DRIVER_VERSION, sizeof(info->version));\n#else\n\tstrscpy(info->driver, \"pcie_mhi\", sizeof(info->driver));\n\tstrscpy(info->version, PCIE_MHI_DRIVER_VERSION, sizeof(info->version));\n#endif\n}\n\nstatic const struct ethtool_ops mhi_netdev_ethtool_ops = {\n\t.get_drvinfo\t\t= mhi_netdev_get_drvinfo,\n\t.get_link\t\t= ethtool_op_get_link,\n};\n\nstatic void mhi_netdev_setup(struct net_device *dev)\n{\n\tdev->netdev_ops = &mhi_netdev_ops_ip;\n\tether_setup(dev);\n\n\tdev->ethtool_ops = &mhi_netdev_ethtool_ops;\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(5, 15, 0))\n\t__dev_addr_set (dev, node_id, sizeof node_id);\n#else\n\tmemcpy (dev->dev_addr, node_id, sizeof node_id);\n#endif\n\t/* set this after calling ether_setup */\n\tdev->header_ops = 0;  /* No header */\n\tdev->hard_header_len = 0;\n\tdev->type = ARPHRD_NONE;\n\tdev->addr_len = 0;\n\tdev->flags |= IFF_NOARP;\n\tdev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST); //POINTOPOINT will make SFE work wrong\n\tdev->watchdog_timeo = WATCHDOG_TIMEOUT;\n\t//on OpenWrt, if set rmnet_mhi0.1 as WAN, '/sbin/netifd' will auto create VLAN for rmnet_mhi0\n\tdev->features |= (NETIF_F_VLAN_CHALLENGED);\n\n#ifdef MHI_NETDEV_ONE_CARD_MODE\n\tif (mhi_mbim_enabled) {\n\t\tdev->needed_headroom = sizeof(struct mhi_mbim_hdr);\n\t}\n#endif\n}\n\n/* enable mhi_netdev netdev, call only after grabbing mhi_netdev.mutex */\nstatic int mhi_netdev_enable_iface(struct mhi_netdev *mhi_netdev)\n{\n\tint ret = 0;\n#if 0\n\tchar ifalias[IFALIASZ];\n#endif\n\tchar ifname[IFNAMSIZ];\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\tint no_tre;\n\n\tMSG_LOG(\"Prepare the channels for transfer\\n\");\n\n\tret = mhi_prepare_for_transfer(mhi_dev);\n\tif (ret) {\n\t\tMSG_ERR(\"Failed to start TX chan ret %d\\n\", ret);\n\t\tgoto mhi_failed_to_start;\n\t}\n\n\t/* first time enabling the node */\n\tif (!mhi_netdev->ndev) {\n\t\tstruct mhi_netdev_priv *mhi_netdev_priv;\n\n#if 0\n\t\tsnprintf(ifalias, sizeof(ifalias), \"%s_%04x_%02u.%02u.%02u_%u\",\n\t\t\t mhi_netdev->interface_name, mhi_dev->dev_id,\n\t\t\t mhi_dev->domain, mhi_dev->bus, mhi_dev->slot,\n\t\t\t mhi_netdev->alias);\n#endif\n\n\t\tsnprintf(ifname, sizeof(ifname), \"%s%d\",\n\t\t\t mhi_netdev->interface_name, mhi_netdev->mhi_dev->mhi_cntrl->cntrl_idx);\n\n\t\trtnl_lock();\n#ifdef NET_NAME_PREDICTABLE\n\t\tmhi_netdev->ndev = alloc_netdev(sizeof(*mhi_netdev_priv),\n\t\t\t\t\tifname, NET_NAME_PREDICTABLE,\n\t\t\t\t\tmhi_netdev_setup);\n#else\n\t\tmhi_netdev->ndev = alloc_netdev(sizeof(*mhi_netdev_priv),\n\t\t\t\t\tifname,\n\t\t\t\t\tmhi_netdev_setup);\n#endif\n\n\t\tif (!mhi_netdev->ndev) {\n\t\t\tret = -ENOMEM;\n\t\t\trtnl_unlock();\n\t\t\tgoto net_dev_alloc_fail;\n\t\t}\n\n\t\t//mhi_netdev->ndev->mtu = mhi_dev->mtu;\n\t\tSET_NETDEV_DEV(mhi_netdev->ndev, &mhi_dev->dev);\n#if 0\n\t\tdev_set_alias(mhi_netdev->ndev, ifalias, strlen(ifalias));\n#endif\n\t\tmhi_netdev_priv = netdev_priv(mhi_netdev->ndev);\n\t\tmhi_netdev_priv->mhi_netdev = mhi_netdev;\n\n\t\tif (mhi_netdev->net_type == MHI_NET_RMNET || mhi_netdev->net_type == MHI_NET_MBIM) {\n#ifdef QUECTEL_BRIDGE_MODE\n\t\tmhi_netdev->bridge_mode = bridge_mode;\n#endif\n\t\tmhi_netdev->ndev->sysfs_groups[0] = &pcie_mhi_sysfs_attr_group;\n\t\t}\n\t\telse if (mhi_netdev->net_type == MHI_NET_ETHER) {\n\t\t\tmhi_netdev->ndev->mtu = mhi_netdev->mru;\n\t\t}\n\t\trtnl_unlock();\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,10,0)\n\t\tmhi_netdev->ndev->max_mtu = mhi_netdev->max_mtu; //first net card\n#endif\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0))\n\t\tnetif_napi_add_weight(mhi_netdev->ndev, &mhi_netdev->napi, mhi_netdev_poll, poll_weight);\n#else\n\t\tnetif_napi_add(mhi_netdev->ndev, &mhi_netdev->napi, mhi_netdev_poll, poll_weight);\n#endif\n\t\tret = register_netdev(mhi_netdev->ndev);\n\t\tif (ret) {\n\t\t\tMSG_ERR(\"Network device registration failed\\n\");\n\t\t\tgoto net_dev_reg_fail;\n\t\t}\n\n\t\tnetif_carrier_off(mhi_netdev->ndev);\n\t}\n\n\twrite_lock_irq(&mhi_netdev->pm_lock);\n\tmhi_netdev->enabled =  true;\n\twrite_unlock_irq(&mhi_netdev->pm_lock);\n\n#ifdef CONFIG_USE_RMNET_DATA_FOR_SKIP_MEMCPY\n\t/* MRU must be multiplication of page size */\n\tmhi_netdev->order = 1;\n\twhile ((PAGE_SIZE << mhi_netdev->order) < mhi_netdev->mru)\n\t\tmhi_netdev->order += 1;\n\n\t/* setup pool size ~2x ring length*/\n\tno_tre = mhi_get_no_free_descriptors(mhi_dev, DMA_FROM_DEVICE);\n\tmhi_netdev->pool_size = 1 << __ilog2_u32(no_tre);\n\tif (no_tre > mhi_netdev->pool_size)\n\t\tmhi_netdev->pool_size <<= 1;\n\tmhi_netdev->pool_size <<= 1;\n\n\t/* allocate memory pool */\n\tret = mhi_netdev_alloc_pool(mhi_netdev);\n\tif (ret) {\n\t\tMSG_ERR(\"mhi_netdev_alloc_pool Fail!\\n\");\n\t\tgoto error_start;\n\t}\n\n\tnapi_enable(&mhi_netdev->napi);\n\n\t/* now we have a pool of buffers allocated, queue to hardware\n\t * by triggering a napi_poll\n\t */\n\tnapi_schedule(&mhi_netdev->napi);\nerror_start:\n#else\n\t/* queue buffer for rx path */\n\tno_tre = mhi_get_no_free_descriptors(mhi_dev, DMA_FROM_DEVICE);\n\tret = mhi_netdev_alloc_skb(mhi_netdev, GFP_KERNEL);\n\tif (ret)\n\t\tschedule_delayed_work(&mhi_netdev->alloc_work, msecs_to_jiffies(20));\n\n\tnapi_enable(&mhi_netdev->napi);\n#endif\n\n\tMSG_LOG(\"Exited.\\n\");\n\n\treturn 0;\n\nnet_dev_reg_fail:\n\tnetif_napi_del(&mhi_netdev->napi);\n\tfree_netdev(mhi_netdev->ndev);\n\tmhi_netdev->ndev = NULL;\n\nnet_dev_alloc_fail:\n\tmhi_unprepare_from_transfer(mhi_dev);\n\nmhi_failed_to_start:\n\tMSG_ERR(\"Exited ret %d.\\n\", ret);\n\n\treturn ret;\n}\n\nstatic void mhi_netdev_xfer_ul_cb(struct mhi_device *mhi_dev,\n\t\t\t\t  struct mhi_result *mhi_result)\n{\n\tstruct mhi_netdev *mhi_netdev = mhi_device_get_devdata(mhi_dev);\n\tstruct sk_buff *skb = mhi_result->buf_addr;\n\tstruct net_device *ndev = mhi_netdev->ndev;\n\tstruct skb_data *entry = (struct skb_data *)(skb->cb);\n\n\tif (entry->bind_netdev != mhi_netdev) {\n\t\tMSG_ERR(\"%s error!\\n\", __func__);\n\t\treturn;\n\t}\n\n\tif (likely(mhi_result->transaction_status == 0)) {\n\t\tmhi_netdev_upate_tx_stats(mhi_netdev, entry->packets, entry->length);\n\n\t\tif (netif_queue_stopped(ndev) && mhi_netdev->enabled\n\t\t\t&& mhi_get_no_free_descriptors(mhi_dev, DMA_TO_DEVICE) > 32) {\n\t\t\tint i = 0;\n\n\t\t\tnetif_wake_queue(ndev);\n\t\t\tfor (i = 0; i < mhi_netdev->qmap_mode; i++) {\n\t\t\t\tstruct net_device *qmap_net = mhi_netdev->mpQmapNetDev[i];\n\t\t\t\tif (qmap_net) {\n\t\t\t\t\tif (netif_queue_stopped(qmap_net))\n\t\t\t\t\t\tnetif_wake_queue(qmap_net);\n\t\t\t\t}\n\t\t\t}\t\t\t\n\t\t}\n\t}\n\n\tentry->bind_netdev = NULL;\n\tentry->packets = 1;\n\tentry->length = 0;\n\tdev_kfree_skb(skb);\n}\n\n#ifdef CONFIG_USE_RMNET_DATA_FOR_SKIP_MEMCPY\nstatic void mhi_netdev_xfer_dl_cb(struct mhi_device *mhi_dev,\n\t\t\t\t  struct mhi_result *mhi_result)\n{\n\tstruct mhi_netdev *mhi_netdev = mhi_device_get_devdata(mhi_dev);\n\tstruct mhi_netbuf *netbuf = mhi_result->buf_addr;\n\tstruct mhi_buf *mhi_buf = &netbuf->mhi_buf;\n\tstruct sk_buff *skb;\n\tstruct net_device *ndev = mhi_netdev->ndev;\n\tstruct device *dev = mhi_dev->dev.parent;\n\tstruct mhi_net_chain *chain = &mhi_netdev->chain;\n\n\tnetbuf->unmap(dev, mhi_buf->dma_addr, mhi_buf->len, DMA_FROM_DEVICE);\n\n\t/* modem is down, drop the buffer */\n\tif (mhi_result->transaction_status == -ENOTCONN) {\n\t\t__free_pages(mhi_buf->page, mhi_netdev->order);\n\t\treturn;\n\t}\n\n\tmhi_netdev_upate_rx_stats(mhi_netdev, 1, mhi_result->bytes_xferd);\n\n\t/* we support chaining */\n\tskb = alloc_skb(0, GFP_ATOMIC);\n\tif (likely(skb)) {\n\t\tskb_add_rx_frag(skb, 0, mhi_buf->page, 0,\n\t\t\t\tmhi_result->bytes_xferd, mhi_netdev->mru);\n\n\t\t/* this is first on list */\n\t\tif (!chain->head) {\n\t\t\tskb->dev = ndev;\n\t\t\tskb->protocol = htons(ETH_P_MAP);\n\t\t\tchain->head = skb;\n\t\t} else {\n\t\t\tskb_shinfo(chain->tail)->frag_list = skb;\n\t\t}\n\n\t\tchain->tail = skb;\n\t} else {\n\t\t__free_pages(mhi_buf->page, mhi_netdev->order);\n\t}\n}\n#else\nstatic void mhi_netdev_xfer_dl_cb(struct mhi_device *mhi_dev,\n\t\t\t\t  struct mhi_result *mhi_result)\n{\n\tstruct mhi_netdev *mhi_netdev = mhi_device_get_devdata(mhi_dev);\n\tstruct sk_buff *skb = mhi_result->buf_addr;\n\tstruct mhi_skb_priv *skb_priv = (struct mhi_skb_priv *)(skb->cb);\n\n\tif (unlikely(skb_priv->bind_netdev != mhi_netdev)) {\n\t\tMSG_ERR(\"%s error!\\n\", __func__);\n\t\treturn;\n\t}\n\n\tif (unlikely(mhi_result->transaction_status)) {\n\t\tif (mhi_result->transaction_status != -ENOTCONN)\n\t\t\tMSG_ERR(\"%s transaction_status = %d!\\n\", __func__, mhi_result->transaction_status);\n\t\tskb_priv->bind_netdev = NULL;\n\t\tdev_kfree_skb(skb);\n\t\treturn;\n\t}\n\n#if defined(CONFIG_IPQ5018_RATE_CONTROL)\n\tif (likely(mhi_netdev->mhi_rate_control)) {\n\t\tu32 time_interval = 0;\n\t\tu32 time_difference = 0;\n\t\tu32 cntfrq;\n\t\tu64 second_jiffy;\n\t\tu64 bytes_received_2;\n\t\tstruct net_device *ndev = mhi_netdev->ndev;\n\n\t\tif (mhi_netdev->first_jiffy) {\n\t\t\t#if LINUX_VERSION_CODE < KERNEL_VERSION(5,2,0)\n\t\t\tsecond_jiffy = arch_counter_get_cntvct();\n\t\t\t#else\n\t\t\tsecond_jiffy = __arch_counter_get_cntvct();\n\t\t\t#endif\n\t\t\tbytes_received_2 = mhi_netdev->bytes_received_2;\n\t\t\tif ((second_jiffy > mhi_netdev->first_jiffy) &&\n\t\t\t\t\t(bytes_received_2 > mhi_netdev->bytes_received_1)) {\n\n\t\t\t\ttime_difference = (second_jiffy - mhi_netdev->first_jiffy);\n\t\t\t\ttime_interval = (time_difference / mhi_netdev->cntfrq_per_msec);\n\n\t\t\t\t/* 1.8Gbps is 225,000,000bytes per second */\n\t\t\t\t/* We wills sample at 100ms interval */\n\t\t\t\t/* For 1ms 225000 bytes */\n\t\t\t\t/* For 100ms 22,500,000 bytes */\n\t\t\t\t/* For 10ms 2,250,000 bytes */\n\n\t\t\t\t/* 1.7Gbps is 212,500,000bytes per second */\n\t\t\t\t/* We wills sample at 100ms interval */\n\t\t\t\t/* For 1ms 212500 bytes */\n\t\t\t\t/* For 100ms 21,250,000 bytes */\n\t\t\t\t/* For 10ms 2,125,000 bytes */\n\n\t\t\t\t/* 1.6Gbps is 200,000,000bytes per second */\n\t\t\t\t/* We wills sample at 100ms interval */\n\t\t\t\t/* For 1ms 200,000 bytes */\n\t\t\t\t/* For 100ms 20,000,000 bytes */\n\t\t\t\t/* For 10ms 2,000,000 bytes */\n\n\t\t\t\tif (time_interval < 100) {\n\t\t\t\t\tif ((bytes_received_2 - mhi_netdev->bytes_received_1) > 22500000) {\n\t\t\t\t\t\tndev->stats.rx_dropped ++;\n\t\t\t\t\t\tdev_kfree_skb(skb);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tmhi_netdev->first_jiffy = second_jiffy;\n\t\t\t\t\tmhi_netdev->bytes_received_1 = bytes_received_2;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tmhi_netdev->first_jiffy = second_jiffy;\n\t\t\t\tmhi_netdev->bytes_received_1 = bytes_received_2;\n\t\t\t}\n\t\t} else {\n\t\t\t#if LINUX_VERSION_CODE < KERNEL_VERSION(5,2,0)\n\t\t\tmhi_netdev->first_jiffy = arch_counter_get_cntvct();\n\t\t\t#else\n\t\t\tmhi_netdev->first_jiffy = __arch_counter_get_cntvct();\n\t\t\t#endif\n\n\t\t\tcntfrq = arch_timer_get_cntfrq();\n\t\t\tmhi_netdev->cntfrq_per_msec = cntfrq / 1000;\n\t\t}\n\t\tmhi_netdev->bytes_received_2 += mhi_result->bytes_xferd;\n\t}\n#endif\n\n#if 0\n\t{\n\t\tstatic size_t bytes_xferd = 0;\n\t\tif (mhi_result->bytes_xferd > bytes_xferd) {\n\t\t\tbytes_xferd = mhi_result->bytes_xferd;\n\t\t\tprintk(KERN_DEBUG \"bytes_xferd=%zd\\n\", bytes_xferd);\n\t\t}\n\t}\n#endif\n\n\tskb_put(skb, mhi_result->bytes_xferd);\n\n\tqmap_hex_dump(__func__, skb->data, skb->len);\n\n\tskb_priv->bind_netdev = NULL;\n\tskb_queue_tail(&mhi_netdev->qmap_chain, skb);\t\n}\n#endif\n\nstatic void mhi_netdev_status_cb(struct mhi_device *mhi_dev, enum MHI_CB mhi_cb)\n{\n\tstruct mhi_netdev *mhi_netdev = mhi_device_get_devdata(mhi_dev);\n\n\tif (mhi_cb != MHI_CB_PENDING_DATA)\n\t\treturn;\n\n\tif (napi_schedule_prep(&mhi_netdev->napi)) {\n\t\t__napi_schedule(&mhi_netdev->napi);\n\t\tmhi_netdev->stats.rx_int++;\n\t\treturn;\n\t}\n}\n\n#ifdef CONFIG_DEBUG_FS\n\nstruct dentry *mhi_netdev_debugfs_dentry;\n\nstatic int mhi_netdev_init_debugfs_states_show(struct seq_file *m, void *d)\n{\n\tstruct mhi_netdev *mhi_netdev = m->private;\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\n#ifdef TS_DEBUG\n\tstruct timespec now_ts, diff_ts;\n\tgetnstimeofday(&now_ts);\n\tdiff_ts = timespec_sub(now_ts, mhi_netdev->diff_ts);\n\tmhi_netdev->diff_ts = now_ts;\n#endif\n\n\tseq_printf(m,\n\t\t   \"tx_tre:%d rx_tre:%d qmap_chain:%u skb_chain:%u tx_allocated:%u rx_allocated:%u\\n\",\n\t\t    mhi_get_no_free_descriptors(mhi_dev, DMA_TO_DEVICE),\n\t\t    mhi_get_no_free_descriptors(mhi_dev, DMA_FROM_DEVICE),\n\t\t    mhi_netdev->qmap_chain.qlen,\n\t\t    mhi_netdev->skb_chain.qlen,\n\t\t    mhi_netdev->tx_allocated.qlen,\n\t\t    mhi_netdev->rx_allocated.qlen);\n\n\tseq_printf(m,\n\t\t   \"netif_queue_stopped:%d, link_state:0x%x, flow_control:0x%x\\n\",\n\t\t    netif_queue_stopped(mhi_netdev->ndev), mhi_netdev->link_state, mhi_netdev->flow_control);\n\n\tseq_printf(m,\n\t\t   \"rmnet_map_command_stats: %u, %u, %u, %u, %u, %u, %u, %u, %u, %u\\n\",\n\t\t    mhi_netdev->rmnet_map_command_stats[RMNET_MAP_COMMAND_NONE],\n\t\t    mhi_netdev->rmnet_map_command_stats[RMNET_MAP_COMMAND_FLOW_DISABLE],\n\t\t    mhi_netdev->rmnet_map_command_stats[RMNET_MAP_COMMAND_FLOW_ENABLE],\n\t\t    mhi_netdev->rmnet_map_command_stats[3],\n\t\t    mhi_netdev->rmnet_map_command_stats[4],\n\t\t    mhi_netdev->rmnet_map_command_stats[5],\n\t\t    mhi_netdev->rmnet_map_command_stats[6],\n\t\t    mhi_netdev->rmnet_map_command_stats[RMNET_MAP_COMMAND_FLOW_START],\n\t\t    mhi_netdev->rmnet_map_command_stats[RMNET_MAP_COMMAND_FLOW_END],\n\t\t    mhi_netdev->rmnet_map_command_stats[RMNET_MAP_COMMAND_UNKNOWN]);\n\n#ifdef TS_DEBUG\n\tseq_printf(m,\n\t\t   \"qmap_ts:%ld.%ld, skb_ts:%ld.%ld, diff_ts:%ld.%ld\\n\",\n\t\t    mhi_netdev->qmap_ts.tv_sec, mhi_netdev->qmap_ts.tv_nsec,\n\t\t    mhi_netdev->skb_ts.tv_sec, mhi_netdev->skb_ts.tv_nsec,\n\t\t    diff_ts.tv_sec, diff_ts.tv_nsec);\n\tmhi_netdev->clear_ts = 1;\n#endif\n\n\treturn 0;\n}\n\nstatic int mhi_netdev_init_debugfs_states_open(struct inode *inode,\n\t\t\t\t\t    struct file *fp)\n{\n\treturn single_open(fp, mhi_netdev_init_debugfs_states_show, inode->i_private);\n}\n\nstatic const struct file_operations mhi_netdev_debugfs_state_ops = {\n\t.open = mhi_netdev_init_debugfs_states_open,\n\t.release = single_release,\n\t.read = seq_read,\n};\n\nstatic int mhi_netdev_debugfs_trigger_reset(void *data, u64 val)\n{\n\tstruct mhi_netdev *mhi_netdev = data;\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\tint ret;\n\n\tMSG_LOG(\"Triggering channel reset\\n\");\n\n\t/* disable the interface so no data processing */\n\twrite_lock_irq(&mhi_netdev->pm_lock);\n\tmhi_netdev->enabled = false;\n\twrite_unlock_irq(&mhi_netdev->pm_lock);\n\tnapi_disable(&mhi_netdev->napi);\n\n\t/* disable all hardware channels */\n\tmhi_unprepare_from_transfer(mhi_dev);\n\n\t/* clean up all alocated buffers */\n\tmhi_netdev_dealloc(mhi_netdev);\n\n\tMSG_LOG(\"Restarting iface\\n\");\n\n\tret = mhi_netdev_enable_iface(mhi_netdev);\n\tif (ret)\n\t\treturn ret;\n\n\treturn 0;\n}\nDEFINE_SIMPLE_ATTRIBUTE(mhi_netdev_debugfs_trigger_reset_fops, NULL,\n\t\t\tmhi_netdev_debugfs_trigger_reset, \"%llu\\n\");\n\nstatic void mhi_netdev_create_debugfs(struct mhi_netdev *mhi_netdev)\n{\n\tchar node_name[32];\n\tint i;\n\tconst umode_t mode = 0600;\n\tstruct mhi_device *mhi_dev = mhi_netdev->mhi_dev;\n\tstruct dentry *dentry = mhi_netdev_debugfs_dentry;\n\n\tconst struct {\n\t\tchar *name;\n\t\tu32 *ptr;\n\t} debugfs_table[] = {\n\t\t{\n\t\t\t\"rx_int\",\n\t\t\t&mhi_netdev->stats.rx_int\n\t\t},\n\t\t{\n\t\t\t\"tx_full\",\n\t\t\t&mhi_netdev->stats.tx_full\n\t\t},\n\t\t{\n\t\t\t\"tx_pkts\",\n\t\t\t&mhi_netdev->stats.tx_pkts\n\t\t},\n\t\t{\n\t\t\t\"rx_budget_overflow\",\n\t\t\t&mhi_netdev->stats.rx_budget_overflow\n\t\t},\n\t\t{\n\t\t\t\"rx_allocated\",\n\t\t\t&mhi_netdev->stats.rx_allocated\n\t\t},\n\t\t{\n\t\t\t\"tx_allocated\",\n\t\t\t&mhi_netdev->stats.tx_allocated\n\t\t},\n\t\t{\n\t\t\t\"alloc_failed\",\n\t\t\t&mhi_netdev->stats.alloc_failed\n\t\t},\n\t\t{\n\t\t\tNULL, NULL\n\t\t},\n\t};\n\n\t/* Both tx & rx client handle contain same device info */\n\tsnprintf(node_name, sizeof(node_name), \"%s_%04x_%02u.%02u.%02u_%u\",\n\t\t mhi_netdev->interface_name, mhi_dev->dev_id, mhi_dev->domain,\n\t\t mhi_dev->bus, mhi_dev->slot, mhi_netdev->alias);\n\n\tif (IS_ERR_OR_NULL(dentry))\n\t\treturn;\n\n\tmhi_netdev->dentry = debugfs_create_dir(node_name, dentry);\n\tif (IS_ERR_OR_NULL(mhi_netdev->dentry))\n\t\treturn;\n\n\tdebugfs_create_u32(\"msg_lvl\", mode, mhi_netdev->dentry,\n\t\t\t\t  (u32 *)&mhi_netdev->msg_lvl);\n\n\t/* Add debug stats table */\n\tfor (i = 0; debugfs_table[i].name; i++) {\n\t\tdebugfs_create_u32(debugfs_table[i].name, mode,\n\t\t\t\t\t  mhi_netdev->dentry,\n\t\t\t\t\t  debugfs_table[i].ptr);\n\t}\n\n\tdebugfs_create_file(\"reset\", mode, mhi_netdev->dentry, mhi_netdev,\n\t\t\t&mhi_netdev_debugfs_trigger_reset_fops);\n\tdebugfs_create_file(\"states\", 0444, mhi_netdev->dentry, mhi_netdev,\n\t\t\t\t   &mhi_netdev_debugfs_state_ops);\n}\n\nstatic void mhi_netdev_create_debugfs_dir(struct dentry *parent)\n{\n\tmhi_netdev_debugfs_dentry = debugfs_create_dir(MHI_NETDEV_DRIVER_NAME, parent);\n}\n\n#else\n\nstatic void mhi_netdev_create_debugfs(struct mhi_netdev *mhi_netdev)\n{\n}\n\nstatic void mhi_netdev_create_debugfs_dir(struct dentry *parent)\n{\n}\n\n#endif\n\nstatic void mhi_netdev_remove(struct mhi_device *mhi_dev)\n{\n\tstruct mhi_netdev *mhi_netdev = mhi_device_get_devdata(mhi_dev);\n\tstruct sk_buff *skb;\n\n\tMSG_LOG(\"Remove notification received\\n\");\n#ifndef MHI_NETDEV_ONE_CARD_MODE\n#ifndef\tCONFIG_USE_RMNET_DATA_FOR_SKIP_MEMCPY\n\n\tunsigned i;\n\twrite_lock_irq(&mhi_netdev->pm_lock);\n\tmhi_netdev->enabled = false;\n\twrite_unlock_irq(&mhi_netdev->pm_lock);\n\n\tfor (i = 0; i < mhi_netdev->qmap_mode; i++) {\n\t\tif (mhi_netdev->mpQmapNetDev[i]\n\t\t\t&& mhi_netdev->mpQmapNetDev[i] != mhi_netdev->ndev) {\n\t\t\trmnet_vnd_unregister_device(mhi_netdev->mpQmapNetDev[i]);\n\t\t}\n\t\tmhi_netdev->mpQmapNetDev[i] = NULL;\n\t}\n\t\t\n\trtnl_lock();\n\tif (mhi_netdev->ndev \n\t\t&& rtnl_dereference(mhi_netdev->ndev->rx_handler) == rmnet_rx_handler)\n\t\tnetdev_rx_handler_unregister(mhi_netdev->ndev);\n\trtnl_unlock();\n#endif\n#endif\n\twhile ((skb = skb_dequeue (&mhi_netdev->skb_chain)))\n\t\tdev_kfree_skb_any(skb);\n\twhile ((skb = skb_dequeue (&mhi_netdev->qmap_chain)))\n\t\tdev_kfree_skb_any(skb);\n\twhile ((skb = skb_dequeue (&mhi_netdev->rx_allocated)))\n\t\tdev_kfree_skb_any(skb);\n\twhile ((skb = skb_dequeue (&mhi_netdev->tx_allocated)))\n\t\tdev_kfree_skb_any(skb);\n\t\n\tnapi_disable(&mhi_netdev->napi);\n\tnetif_napi_del(&mhi_netdev->napi);\n\tmhi_netdev_dealloc(mhi_netdev);\n\tunregister_netdev(mhi_netdev->ndev);\n#if defined(MHI_NETDEV_STATUS64)\n\tfree_percpu(mhi_netdev->stats64);\n#endif\n\tfree_netdev(mhi_netdev->ndev);\n\tflush_delayed_work(&mhi_netdev->alloc_work);\n#ifdef CONFIG_USE_RMNET_DATA_FOR_SKIP_MEMCPY\n\tmhi_netdev_free_pool(mhi_netdev);\n#endif\n\n\tif (!IS_ERR_OR_NULL(mhi_netdev->dentry))\n\t\tdebugfs_remove_recursive(mhi_netdev->dentry);\n}\n\nstatic int mhi_netdev_probe(struct mhi_device *mhi_dev,\n\t\t\t    const struct mhi_device_id *id)\n{\n\tint ret;\n\tstruct mhi_netdev *mhi_netdev;\n\tunsigned i;\n\n\tmhi_netdev = devm_kzalloc(&mhi_dev->dev, sizeof(*mhi_netdev),\n\t\t\t\t  GFP_KERNEL);\n\tif (!mhi_netdev)\n\t\treturn -ENOMEM;\n\n\tif (!strcmp(id->chan, \"IP_HW0\")) {\n\t\tif (mhi_mbim_enabled)\n\t\t\tmhi_netdev->net_type = MHI_NET_MBIM;\n\t\telse\n\t\t\tmhi_netdev->net_type = MHI_NET_RMNET;\n\t}\n\telse if (!strcmp(id->chan, \"IP_SW0\")) {\n\t\tmhi_netdev->net_type = MHI_NET_ETHER;\n\t}\n\telse {\n\t\treturn -EINVAL;\n\t}\n\n\tmhi_netdev->alias = 0;\n\n\tmhi_netdev->mhi_dev = mhi_dev;\n\tmhi_device_set_devdata(mhi_dev, mhi_netdev);\n\n\tmhi_netdev->mru = (15*1024); ///etc/data/qnicorn_config.xml dataformat_agg_dl_size 15*1024\n\tmhi_netdev->max_mtu = mhi_netdev->mru - (sizeof(struct rmnet_map_v5_csum_header) + sizeof(struct rmnet_map_header));\n\tif (mhi_netdev->net_type == MHI_NET_MBIM) {\n\t\tmhi_netdev->mru = ncmNTBParams.dwNtbInMaxSize;\n\t\tmhi_netdev->mbim_ctx.rx_max = mhi_netdev->mru;\n\t\tmhi_netdev->max_mtu = mhi_netdev->mru - sizeof(struct mhi_mbim_hdr);\n\t}\n\telse if (mhi_netdev->net_type == MHI_NET_ETHER) {\n\t\tmhi_netdev->mru = 8*1024;\n\t\tmhi_netdev->max_mtu = mhi_netdev->mru;\n\t}\n\tmhi_netdev->qmap_size = mhi_netdev->mru;\n\n#if defined(MHI_NETDEV_STATUS64)\n\tmhi_netdev->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);\n\tif (!mhi_netdev->stats64)\n\t\treturn -ENOMEM;\n#endif\n\n\tif (!strcmp(id->chan, \"IP_HW0\"))\n\t\tmhi_netdev->interface_name = \"rmnet_mhi\";\n\telse if (!strcmp(id->chan, \"IP_SW0\"))\n\t\tmhi_netdev->interface_name = \"mhi_swip\";\n\telse\n\t\tmhi_netdev->interface_name = id->chan;\n\n\tmhi_netdev->qmap_mode = qmap_mode;\n\tmhi_netdev->qmap_version = 5; \n\tmhi_netdev->use_rmnet_usb = 1;\n\tif ((mhi_dev->vendor == 0x17cb && mhi_dev->dev_id == 0x0306)\n\t\t|| (mhi_dev->vendor == 0x17cb && mhi_dev->dev_id == 0x0308)\n\t\t|| (mhi_dev->vendor == 0x17cb && mhi_dev->dev_id == 0x0309)\n\t\t|| (mhi_dev->vendor == 0x17cb && mhi_dev->dev_id == 0x011a)\n\t\t|| (mhi_dev->vendor == 0x1eac && mhi_dev->dev_id == 0x1004)\n\t\t|| (mhi_dev->vendor == 0x1eac && mhi_dev->dev_id == 0x100b)\n\t\t|| (mhi_dev->vendor == 0x105b && mhi_dev->dev_id == 0xe0f5)\n\t\t|| (mhi_dev->vendor == 0x03f0 && mhi_dev->dev_id == 0x0a6c)\n\t) {\n\t\tmhi_netdev->qmap_version = 9;\n\t}\n\tif (mhi_netdev->net_type == MHI_NET_ETHER) {\n\t\tmhi_netdev->qmap_mode = 1;\n\t\tmhi_netdev->qmap_version = 0; \n\t\tmhi_netdev->use_rmnet_usb = 0;\n\t}\n\n\tmhi_netdev->mbim_mux_id = 0;\n\tif (mhi_dev->vendor == 0x17cb && mhi_dev->dev_id == 0x0309) {\n\t\tmhi_netdev->mbim_mux_id = MBIM_MUX_ID_SDX7X;\n\t}\n\trmnet_info_set(mhi_netdev, &mhi_netdev->rmnet_info);\n\n\tmhi_netdev->rx_queue = mhi_netdev_alloc_skb;\n\n\tspin_lock_init(&mhi_netdev->rx_lock);\n\trwlock_init(&mhi_netdev->pm_lock);\n\tINIT_DELAYED_WORK(&mhi_netdev->alloc_work, mhi_netdev_alloc_work);\n\tskb_queue_head_init(&mhi_netdev->qmap_chain);\n\tskb_queue_head_init(&mhi_netdev->skb_chain);\n\tskb_queue_head_init(&mhi_netdev->tx_allocated);\n\tskb_queue_head_init(&mhi_netdev->rx_allocated);\n\n\tmhi_netdev->msg_lvl = MHI_MSG_LVL_INFO;\n\n\t/* setup network interface */\n\tret = mhi_netdev_enable_iface(mhi_netdev);\n\tif (ret) {\n\t\tpr_err(\"Error mhi_netdev_enable_iface ret:%d\\n\", ret);\n\t\treturn ret;\n\t}\n\n\tmhi_netdev_create_debugfs(mhi_netdev);\n\n\tif (mhi_netdev->net_type == MHI_NET_ETHER) {\n\t\tmhi_netdev->mpQmapNetDev[0] = mhi_netdev->ndev;\n\t\tnetif_carrier_on(mhi_netdev->ndev);\n\t}\n#ifdef MHI_NETDEV_ONE_CARD_MODE\n\telse if (1) {\n\t\tmhi_netdev->mpQmapNetDev[0] = mhi_netdev->ndev;\n\t\tstrcpy(mhi_netdev->rmnet_info.ifname[0], mhi_netdev->mpQmapNetDev[0]->name);\n\t\tmhi_netdev->rmnet_info.mux_id[0] = QUECTEL_QMAP_MUX_ID;\n\t\tif (mhi_mbim_enabled) {\n\t\t\tmhi_netdev->rmnet_info.mux_id[0] = mhi_netdev->mbim_mux_id;\n\t\t}\n\t}\n#else\n\n#ifdef CONFIG_USE_RMNET_DATA_FOR_SKIP_MEMCPY\n\telse if (1) {\n\t\tBUG_ON(mhi_netdev->net_type != MHI_NET_RMNET);\n\t\tfor (i = 0; i < mhi_netdev->qmap_mode; i++) {\n\t\t\tmhi_netdev->rmnet_info.mux_id[i] = QUECTEL_QMAP_MUX_ID + i;\n\t\t\tstrcpy(mhi_netdev->rmnet_info.ifname[i], \"use_rmnet_data\");\n\t\t}\n\t}\n#endif\n\telse if (mhi_netdev->use_rmnet_usb) {\n\t\tfor (i = 0; i < mhi_netdev->qmap_mode; i++) {\n\t\t\tu8 mux_id = QUECTEL_QMAP_MUX_ID + i;\n\t\t\tif (mhi_mbim_enabled) {\n\t\t\t\tmux_id = mhi_netdev->mbim_mux_id + i;\n\t\t\t}\t\t\t\n\t\t\tmhi_netdev->mpQmapNetDev[i] = rmnet_vnd_register_device(mhi_netdev, i, mux_id);\n\t\t\tif (mhi_netdev->mpQmapNetDev[i]) {\n\t\t\t\tstrcpy(mhi_netdev->rmnet_info.ifname[i], mhi_netdev->mpQmapNetDev[i]->name);\n\t\t\t\tmhi_netdev->rmnet_info.mux_id[i] = mux_id;\n\t\t\t}\n\t\t}\n\n\t\trtnl_lock();\n\t\t/* when open hyfi function, run cm will make system crash */\n\t\t//netdev_rx_handler_register(mhi_netdev->ndev, rmnet_rx_handler, mhi_netdev);\n\t\tnetdev_rx_handler_register(mhi_netdev->ndev, rmnet_rx_handler, NULL);\n\t\trtnl_unlock();\n\t}\n\n#if defined(CONFIG_IPQ5018_RATE_CONTROL)\n\tmhi_netdev->mhi_rate_control = 1;\n#endif\n#endif\n\n\treturn 0;\n}\n\nstatic const struct mhi_device_id mhi_netdev_match_table[] = {\n\t{ .chan = \"IP_HW0\" },\n\t{ .chan = \"IP_SW0\" },\n\t// ADPL do not register as a netcard. xingduo.du 2023-02-20\n\t// { .chan = \"IP_HW_ADPL\" },\n\t{ },\n};\n\nstatic struct mhi_driver mhi_netdev_driver = {\n\t.id_table = mhi_netdev_match_table,\n\t.probe = mhi_netdev_probe,\n\t.remove = mhi_netdev_remove,\n\t.ul_xfer_cb = mhi_netdev_xfer_ul_cb,\n\t.dl_xfer_cb = mhi_netdev_xfer_dl_cb,\n\t.status_cb = mhi_netdev_status_cb,\n\t.driver = {\n\t\t.name = \"mhi_netdev\",\n\t\t.owner = THIS_MODULE,\n\t}\n};\n\nint __init mhi_device_netdev_init(struct dentry *parent)\n{\n#ifdef CONFIG_QCA_NSS_DRV\n\tnss_cb = rcu_dereference(rmnet_nss_callbacks);\n\tif (!nss_cb) {\n\t\tprintk(KERN_ERR \"mhi_device_netdev_init: driver load must after '/etc/modules.d/42-rmnet-nss'\\n\");\n\t}\n#endif\n\n\tmhi_netdev_create_debugfs_dir(parent);\n\n\treturn mhi_driver_register(&mhi_netdev_driver);\n}\n\nvoid mhi_device_netdev_exit(void)\n{\n#ifdef CONFIG_DEBUG_FS\n\tdebugfs_remove_recursive(mhi_netdev_debugfs_dentry);\n#endif\n\tmhi_driver_unregister(&mhi_netdev_driver);\n}\n\nvoid mhi_netdev_quectel_avoid_unused_function(void) {\n#ifdef CONFIG_USE_RMNET_DATA_FOR_SKIP_MEMCPY\n\tqmap_hex_dump(NULL, NULL, 0);\n\tmhi_netdev_ip_type_trans(0);\n#else\n#endif\n}\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/devices/mhi_satellite.c",
    "content": "// SPDX-License-Identifier: GPL-2.0-only\n/* Copyright (c) 2019, The Linux Foundation. All rights reserved.*/\n\n#include <linux/debugfs.h>\n#include <linux/device.h>\n#include <linux/dma-direction.h>\n#include <linux/dma-mapping.h>\n#include <linux/errno.h>\n#include <linux/ipc_logging.h>\n#include <linux/kernel.h>\n#include <linux/module.h>\n#include <linux/of_device.h>\n#include <linux/rpmsg.h>\n#include <linux/slab.h>\n#include <linux/types.h>\n#include <linux/uaccess.h>\n#include <linux/wait.h>\n#include <linux/mhi.h>\n\n#define MHI_SAT_DRIVER_NAME \"mhi_satellite\"\n\nstatic bool mhi_sat_defer_init = true; /* set by default */\n\n/* logging macros */\n#define IPC_LOG_PAGES (10)\n#define IPC_LOG_LVL (MHI_MSG_LVL_INFO)\n#define KLOG_LVL (MHI_MSG_LVL_ERROR)\n\n#define MHI_SUBSYS_LOG(fmt, ...) do { \\\n\tif (!subsys) \\\n\t\tbreak; \\\n\tif (mhi_sat_driver.klog_lvl <= MHI_MSG_LVL_INFO) \\\n\t\tpr_info(\"[I][%s][%s] \" fmt, __func__, subsys->name, \\\n\t\t\t##__VA_ARGS__);\\\n\tif (subsys->ipc_log && mhi_sat_driver.ipc_log_lvl <= \\\n\t    MHI_MSG_LVL_INFO) \\\n\t\tipc_log_string(subsys->ipc_log, \"[I][%s] \" fmt, __func__, \\\n\t\t\t       ##__VA_ARGS__); \\\n} while (0)\n\n#define MHI_SAT_LOG(fmt, ...) do { \\\n\tif (!subsys || !sat_cntrl) \\\n\t\tbreak; \\\n\tif (mhi_sat_driver.klog_lvl <= MHI_MSG_LVL_INFO) \\\n\t\tpr_info(\"[I][%s][%s][%x] \" fmt, __func__, subsys->name, \\\n\t\t\tsat_cntrl->dev_id, ##__VA_ARGS__);\\\n\tif (subsys->ipc_log && mhi_sat_driver.ipc_log_lvl <= \\\n\t    MHI_MSG_LVL_INFO) \\\n\t\tipc_log_string(subsys->ipc_log, \"[I][%s][%x] \" fmt, __func__, \\\n\t\t\t       sat_cntrl->dev_id, ##__VA_ARGS__); \\\n} while (0)\n\n#define MHI_SAT_ERR(fmt, ...) do { \\\n\tif (!subsys || !sat_cntrl) \\\n\t\tbreak; \\\n\tif (mhi_sat_driver.klog_lvl <= MHI_MSG_LVL_ERROR) \\\n\t\tpr_err(\"[E][%s][%s][%x] \" fmt, __func__, subsys->name, \\\n\t\t       sat_cntrl->dev_id, ##__VA_ARGS__); \\\n\tif (subsys->ipc_log && mhi_sat_driver.ipc_log_lvl <= \\\n\t    MHI_MSG_LVL_ERROR) \\\n\t\tipc_log_string(subsys->ipc_log, \"[E][%s][%x] \" fmt, __func__, \\\n\t\t\t       sat_cntrl->dev_id, ##__VA_ARGS__); \\\n} while (0)\n\n#define MHI_SAT_ASSERT(cond, msg) do { \\\n\tif (cond) \\\n\t\tpanic(msg); \\\n} while (0)\n\n/* mhi sys error command */\n#define MHI_TRE_CMD_SYS_ERR_PTR (0)\n#define MHI_TRE_CMD_SYS_ERR_D0 (0)\n#define MHI_TRE_CMD_SYS_ERR_D1 (MHI_PKT_TYPE_SYS_ERR_CMD << 16)\n\n/* mhi state change event */\n#define MHI_TRE_EVT_MHI_STATE_PTR (0)\n#define MHI_TRE_EVT_MHI_STATE_D0(state) (state << 24)\n#define MHI_TRE_EVT_MHI_STATE_D1 (MHI_PKT_TYPE_STATE_CHANGE_EVENT << 16)\n\n/* mhi exec env change event */\n#define MHI_TRE_EVT_EE_PTR (0)\n#define MHI_TRE_EVT_EE_D0(ee) (ee << 24)\n#define MHI_TRE_EVT_EE_D1 (MHI_PKT_TYPE_EE_EVENT << 16)\n\n/* mhi config event */\n#define MHI_TRE_EVT_CFG_PTR(base_addr) (base_addr)\n#define MHI_TRE_EVT_CFG_D0(er_base, num) ((er_base << 16) | (num & 0xFFFF))\n#define MHI_TRE_EVT_CFG_D1 (MHI_PKT_TYPE_CFG_EVENT << 16)\n\n/* command completion event */\n#define MHI_TRE_EVT_CMD_COMPLETION_PTR(ptr) (ptr)\n#define MHI_TRE_EVT_CMD_COMPLETION_D0(code) (code << 24)\n#define MHI_TRE_EVT_CMD_COMPLETION_D1 (MHI_PKT_TYPE_CMD_COMPLETION_EVENT << 16)\n\n/* packet parser macros */\n#define MHI_TRE_GET_PTR(tre) ((tre)->ptr)\n#define MHI_TRE_GET_SIZE(tre) ((tre)->dword[0])\n#define MHI_TRE_GET_CCS(tre) (((tre)->dword[0] >> 24) & 0xFF)\n#define MHI_TRE_GET_ID(tre) (((tre)->dword[1] >> 24) & 0xFF)\n#define MHI_TRE_GET_TYPE(tre) (((tre)->dword[1] >> 16) & 0xFF)\n#define MHI_TRE_IS_ER_CTXT_TYPE(tre) (((tre)->dword[1]) & 0x1)\n\n/* creates unique device ID based on connection topology */\n#define MHI_SAT_CREATE_DEVICE_ID(dev, domain, bus, slot) \\\n\t((dev & 0xFFFF) << 16 | (domain & 0xF) << 12 | (bus & 0xFF) << 4 | \\\n\t(slot & 0xF))\n\n/* mhi core definitions */\n#define MHI_CTXT_TYPE_GENERIC (0xA)\n\nstruct __packed mhi_generic_ctxt {\n\tu32 reserved0;\n\tu32 type;\n\tu32 reserved1;\n\tu64 ctxt_base;\n\tu64 ctxt_size;\n\tu64 reserved[2];\n};\n\nenum mhi_pkt_type {\n\tMHI_PKT_TYPE_INVALID = 0x0,\n\tMHI_PKT_TYPE_RESET_CHAN_CMD = 0x10,\n\tMHI_PKT_TYPE_STOP_CHAN_CMD = 0x11,\n\tMHI_PKT_TYPE_START_CHAN_CMD = 0x12,\n\tMHI_PKT_TYPE_STATE_CHANGE_EVENT = 0x20,\n\tMHI_PKT_TYPE_CMD_COMPLETION_EVENT = 0x21,\n\tMHI_PKT_TYPE_EE_EVENT = 0x40,\n\tMHI_PKT_TYPE_CTXT_UPDATE_CMD = 0x64,\n\tMHI_PKT_TYPE_IOMMU_MAP_CMD = 0x65,\n\tMHI_PKT_TYPE_CFG_EVENT = 0x6E,\n\tMHI_PKT_TYPE_SYS_ERR_CMD = 0xFF,\n};\n\nenum mhi_cmd_type {\n\tMHI_CMD_TYPE_RESET = 0x10,\n\tMHI_CMD_TYPE_STOP = 0x11,\n\tMHI_CMD_TYPE_START = 0x12,\n};\n\n/* mhi event completion codes */\nenum mhi_ev_ccs {\n\tMHI_EV_CC_INVALID = 0x0,\n\tMHI_EV_CC_SUCCESS = 0x1,\n\tMHI_EV_CC_BAD_TRE = 0x11,\n};\n\n/* satellite subsystem definitions */\nenum subsys_id {\n\tSUBSYS_ADSP,\n\tSUBSYS_CDSP,\n\tSUBSYS_SLPI,\n\tSUBSYS_MODEM,\n\tSUBSYS_MAX,\n};\n\nstatic const char * const subsys_names[SUBSYS_MAX] = {\n\t[SUBSYS_ADSP] = \"adsp\",\n\t[SUBSYS_CDSP] = \"cdsp\",\n\t[SUBSYS_SLPI] = \"slpi\",\n\t[SUBSYS_MODEM] = \"modem\",\n};\n\nstruct mhi_sat_subsys {\n\tconst char *name;\n\n\tstruct rpmsg_device *rpdev; /* rpmsg device */\n\n\t/*\n\t * acquire either mutex or spinlock to walk controller list\n\t * acquire both when modifying list\n\t */\n\tstruct list_head cntrl_list; /* controllers list */\n\tstruct mutex cntrl_mutex; /* mutex to walk/modify controllers list */\n\tspinlock_t cntrl_lock; /* lock to walk/modify controllers list */\n\n\tvoid *ipc_log;\n};\n\n/* satellite IPC definitions */\n#define SAT_MAJOR_VERSION (1)\n#define SAT_MINOR_VERSION (0)\n#define SAT_RESERVED_SEQ_NUM (0xFFFF)\n#define SAT_MSG_SIZE(n) (sizeof(struct sat_header) + \\\n\t\t\t     (n * sizeof(struct sat_tre)))\n#define SAT_TRE_SIZE(msg_size) (msg_size  - sizeof(struct sat_header))\n#define SAT_TRE_OFFSET(msg) (msg + sizeof(struct sat_header))\n#define SAT_TRE_NUM_PKTS(payload_size) ((payload_size) / sizeof(struct sat_tre))\n\n/* satellite IPC msg type */\nenum sat_msg_id {\n\tSAT_MSG_ID_ACK = 0xA,\n\tSAT_MSG_ID_CMD = 0xC,\n\tSAT_MSG_ID_EVT = 0xE,\n};\n\n/* satellite IPC context type */\nenum sat_ctxt_type {\n\tSAT_CTXT_TYPE_CHAN = 0x0,\n\tSAT_CTXT_TYPE_EVENT = 0x1,\n\tSAT_CTXT_TYPE_MAX,\n};\n\n/* satellite IPC context string */\n#define TO_SAT_CTXT_TYPE_STR(type) (type >= SAT_CTXT_TYPE_MAX ? \"INVALID\" : \\\n\t\t\t\t\tsat_ctxt_str[type])\n\nconst char * const sat_ctxt_str[SAT_CTXT_TYPE_MAX] = {\n\t[SAT_CTXT_TYPE_CHAN] = \"CCA\",\n\t[SAT_CTXT_TYPE_EVENT] = \"ECA\",\n};\n\n/* satellite IPC transfer ring element */\nstruct __packed sat_tre {\n\tu64 ptr;\n\tu32 dword[2];\n};\n\n/* satellite IPC header */\nstruct __packed sat_header {\n\tu16 major_ver;\n\tu16 minor_ver;\n\tu16 msg_id;\n\tu16 seq;\n\tu16 reply_seq;\n\tu16 payload_size;\n\tu32 dev_id;\n\tu8 reserved[8];\n};\n\n/* satellite driver definitions */\nstruct mhi_sat_packet {\n\tstruct list_head node;\n\n\tstruct mhi_sat_cntrl *cntrl; /* satellite controller reference */\n\tvoid *msg; /* incoming message */\n};\n\nstruct mhi_sat_cntrl {\n\tstruct list_head node;\n\n\tstruct mhi_controller *mhi_cntrl; /* device MHI controller reference */\n\tstruct mhi_sat_subsys *subsys;\n\n\tstruct list_head dev_list;\n\tstruct list_head addr_map_list; /* IOMMU mapped addresses list */\n\tstruct mutex list_mutex; /* mutex for devices and address map lists */\n\n\tstruct list_head packet_list;\n\tspinlock_t pkt_lock; /* lock to walk/modify received packets list */\n\n\tstruct work_struct connect_work; /* subsystem connection worker */\n\tstruct work_struct process_work; /* incoming packets processor */\n\n\t/* mhi core/controller configurations */\n\tu32 dev_id; /* unique device ID with BDF as per connection topology */\n\tint er_base; /* event rings base index */\n\tint er_max; /* event rings max index */\n\tint num_er; /* total number of event rings */\n\n\t/* satellite controller function counts */\n\tint num_devices; /* mhi devices current count */\n\tint max_devices; /* count of maximum devices for subsys/controller */\n\tu16 seq; /* internal sequence number for all outgoing packets */\n\tbool active; /* flag set if hello packet/MHI_CFG event was sent */\n\n\t/* command completion variables */\n\tu16 last_cmd_seq; /* sequence number of last sent command packet */\n\tenum mhi_ev_ccs last_cmd_ccs; /* last command completion event code */\n\tstruct completion completion; /* command completion event wait */\n\tstruct mutex cmd_wait_mutex; /* command completion wait mutex */\n};\n\nstruct mhi_sat_device {\n\tstruct list_head node;\n\n\tstruct mhi_device *mhi_dev; /* mhi device pointer */\n\tstruct mhi_sat_cntrl *cntrl; /* parent controller */\n\n\tbool chan_started;\n};\n\nstruct mhi_sat_driver {\n\tenum MHI_DEBUG_LEVEL ipc_log_lvl; /* IPC log level */\n\tenum MHI_DEBUG_LEVEL klog_lvl; /* klog/dmesg levels */\n\n\tstruct mhi_sat_subsys *subsys; /* pointer to subsystem array */\n\tunsigned int num_subsys;\n\n\tstruct dentry *dentry; /* debugfs directory */\n\tbool deferred_init_done; /* flag for deferred init protection */\n};\n\nstatic struct mhi_sat_driver mhi_sat_driver;\n\nstatic struct mhi_sat_subsys *find_subsys_by_name(const char *name)\n{\n\tint i;\n\tstruct mhi_sat_subsys *subsys = mhi_sat_driver.subsys;\n\n\tfor (i = 0; i < mhi_sat_driver.num_subsys; i++, subsys++) {\n\t\tif (!strcmp(name, subsys->name))\n\t\t\treturn subsys;\n\t}\n\n\treturn NULL;\n}\n\nstatic struct mhi_sat_cntrl *find_sat_cntrl_by_id(struct mhi_sat_subsys *subsys,\n\t\t\t\t\t\t  u32 dev_id)\n{\n\tstruct mhi_sat_cntrl *sat_cntrl;\n\tunsigned long flags;\n\n\tspin_lock_irqsave(&subsys->cntrl_lock, flags);\n\tlist_for_each_entry(sat_cntrl, &subsys->cntrl_list, node) {\n\t\tif (sat_cntrl->dev_id == dev_id) {\n\t\t\tspin_unlock_irqrestore(&subsys->cntrl_lock, flags);\n\t\t\treturn sat_cntrl;\n\t\t}\n\t}\n\tspin_unlock_irqrestore(&subsys->cntrl_lock, flags);\n\n\treturn NULL;\n}\n\nstatic struct mhi_sat_device *find_sat_dev_by_id(\n\t\t\t\tstruct mhi_sat_cntrl *sat_cntrl, int id,\n\t\t\t\tenum sat_ctxt_type evt)\n{\n\tstruct mhi_sat_device *sat_dev;\n\tint compare_id;\n\n\tmutex_lock(&sat_cntrl->list_mutex);\n\tlist_for_each_entry(sat_dev, &sat_cntrl->dev_list, node) {\n\t\tcompare_id = (evt == SAT_CTXT_TYPE_EVENT) ?\n\t\t\t\tsat_dev->mhi_dev->dl_event_id :\n\t\t\t\tsat_dev->mhi_dev->dl_chan_id;\n\n\t\tif (compare_id == id) {\n\t\t\tmutex_unlock(&sat_cntrl->list_mutex);\n\t\t\treturn sat_dev;\n\t\t}\n\t}\n\tmutex_unlock(&sat_cntrl->list_mutex);\n\n\treturn NULL;\n}\n\nstatic bool mhi_sat_isvalid_header(struct sat_header *hdr, int len)\n{\n\t/* validate payload size */\n\tif (len >= sizeof(*hdr) && (len != hdr->payload_size + sizeof(*hdr)))\n\t\treturn false;\n\n\t/* validate SAT IPC version */\n\tif (hdr->major_ver != SAT_MAJOR_VERSION &&\n\t    hdr->minor_ver != SAT_MINOR_VERSION)\n\t\treturn false;\n\n\t/* validate msg ID */\n\tif (hdr->msg_id != SAT_MSG_ID_CMD && hdr->msg_id != SAT_MSG_ID_EVT)\n\t\treturn false;\n\n\treturn true;\n}\n\nstatic int mhi_sat_wait_cmd_completion(struct mhi_sat_cntrl *sat_cntrl)\n{\n\tstruct mhi_sat_subsys *subsys = sat_cntrl->subsys;\n\tint ret;\n\n\treinit_completion(&sat_cntrl->completion);\n\n\tMHI_SAT_LOG(\"Wait for command completion\\n\");\n\tret = wait_for_completion_timeout(&sat_cntrl->completion,\n\t\tmsecs_to_jiffies(sat_cntrl->mhi_cntrl->timeout_ms));\n\tif (!ret || sat_cntrl->last_cmd_ccs != MHI_EV_CC_SUCCESS) {\n\t\tMHI_SAT_ERR(\"Command completion failure:seq:%u:ret:%d:ccs:%d\\n\",\n\t\t\tsat_cntrl->last_cmd_seq, ret, sat_cntrl->last_cmd_ccs);\n\t\treturn -EIO;\n\t}\n\n\tMHI_SAT_LOG(\"Command completion successful for seq:%u\\n\",\n\t\t    sat_cntrl->last_cmd_seq);\n\n\treturn 0;\n}\n\nstatic int mhi_sat_send_msg(struct mhi_sat_cntrl *sat_cntrl,\n\t\t\t    enum sat_msg_id type, u16 reply_seq,\n\t\t\t    void *msg, u16 msg_size)\n{\n\tstruct mhi_sat_subsys *subsys = sat_cntrl->subsys;\n\tstruct sat_header *hdr = msg;\n\n\t/* create sequence number for controller */\n\tsat_cntrl->seq++;\n\tif (sat_cntrl->seq == SAT_RESERVED_SEQ_NUM)\n\t\tsat_cntrl->seq = 0;\n\n\t/* populate header */\n\thdr->major_ver = SAT_MAJOR_VERSION;\n\thdr->minor_ver = SAT_MINOR_VERSION;\n\thdr->msg_id = type;\n\thdr->seq = sat_cntrl->seq;\n\thdr->reply_seq = reply_seq;\n\thdr->payload_size = SAT_TRE_SIZE(msg_size);\n\thdr->dev_id = sat_cntrl->dev_id;\n\n\t/* save last sent command sequence number for completion event */\n\tif (type == SAT_MSG_ID_CMD)\n\t\tsat_cntrl->last_cmd_seq = sat_cntrl->seq;\n\n\treturn rpmsg_send(subsys->rpdev->ept, msg, msg_size);\n}\n\nstatic void mhi_sat_process_cmds(struct mhi_sat_cntrl *sat_cntrl,\n\t\t\t\t struct sat_header *hdr, struct sat_tre *pkt)\n{\n\tstruct mhi_sat_subsys *subsys = sat_cntrl->subsys;\n\tint num_pkts = SAT_TRE_NUM_PKTS(hdr->payload_size), i;\n\n\tfor (i = 0; i < num_pkts; i++, pkt++) {\n\t\tenum mhi_ev_ccs code = MHI_EV_CC_INVALID;\n\n\t\tswitch (MHI_TRE_GET_TYPE(pkt)) {\n\t\tcase MHI_PKT_TYPE_IOMMU_MAP_CMD:\n\t\t{\n\t\t\tstruct mhi_buf *buf;\n\t\t\tstruct mhi_controller *mhi_cntrl = sat_cntrl->mhi_cntrl;\n\t\t\tdma_addr_t iova = DMA_ERROR_CODE;\n\n\t\t\tbuf = kmalloc(sizeof(*buf), GFP_ATOMIC);\n\t\t\tif (!buf)\n\t\t\t\tgoto iommu_map_cmd_completion;\n\n\t\t\tbuf->phys_addr = MHI_TRE_GET_PTR(pkt);\n\t\t\tbuf->len = MHI_TRE_GET_SIZE(pkt);\n\n\t\t\tiova = dma_map_resource(mhi_cntrl->dev, buf->phys_addr,\n\t\t\t\t\t\tbuf->len, DMA_BIDIRECTIONAL, 0);\n\t\t\tif (dma_mapping_error(mhi_cntrl->dev, iova)) {\n\t\t\t\tkfree(buf);\n\t\t\t\tgoto iommu_map_cmd_completion;\n\t\t\t}\n\n\t\t\tbuf->dma_addr = iova;\n\n\t\t\tmutex_lock(&sat_cntrl->list_mutex);\n\t\t\tlist_add_tail(&buf->node,\n\t\t\t\t      &sat_cntrl->addr_map_list);\n\t\t\tmutex_unlock(&sat_cntrl->list_mutex);\n\n\t\t\tcode = MHI_EV_CC_SUCCESS;\n\niommu_map_cmd_completion:\n\t\t\tMHI_SAT_LOG(\"IOMMU MAP 0x%llx CMD processing %s\\n\",\n\t\t\t\t   MHI_TRE_GET_PTR(pkt),\n\t\t\t\t   (code == MHI_EV_CC_SUCCESS) ? \"successful\" :\n\t\t\t\t   \"failed\");\n\n\t\t\tpkt->ptr = MHI_TRE_EVT_CMD_COMPLETION_PTR(iova);\n\t\t\tpkt->dword[0] = MHI_TRE_EVT_CMD_COMPLETION_D0(code);\n\t\t\tpkt->dword[1] = MHI_TRE_EVT_CMD_COMPLETION_D1;\n\t\t\tbreak;\n\t\t}\n\t\tcase MHI_PKT_TYPE_CTXT_UPDATE_CMD:\n\t\t{\n\t\t\tu64 ctxt_ptr = MHI_TRE_GET_PTR(pkt);\n\t\t\tu64 ctxt_size = MHI_TRE_GET_SIZE(pkt);\n\t\t\tint id = MHI_TRE_GET_ID(pkt);\n\t\t\tenum sat_ctxt_type evt = MHI_TRE_IS_ER_CTXT_TYPE(pkt);\n\t\t\tstruct mhi_generic_ctxt gen_ctxt;\n\t\t\tstruct mhi_buf buf;\n\t\t\tstruct mhi_sat_device *sat_dev = find_sat_dev_by_id(\n\t\t\t\t\t\t\t sat_cntrl, id, evt);\n\t\t\tint ret;\n\n\t\t\tMHI_SAT_ASSERT(!sat_dev,\n\t\t\t\t      \"No device with given chan/evt ID\");\n\n\t\t\tmemset(&gen_ctxt, 0, sizeof(gen_ctxt));\n\t\t\tmemset(&buf, 0, sizeof(buf));\n\n\t\t\tgen_ctxt.type = MHI_CTXT_TYPE_GENERIC;\n\t\t\tgen_ctxt.ctxt_base = ctxt_ptr;\n\t\t\tgen_ctxt.ctxt_size = ctxt_size;\n\n\t\t\tbuf.buf = &gen_ctxt;\n\t\t\tbuf.len = sizeof(gen_ctxt);\n\t\t\tbuf.name = TO_SAT_CTXT_TYPE_STR(evt);\n\n\t\t\tret = mhi_device_configure(sat_dev->mhi_dev,\n\t\t\t\t\t\t   DMA_BIDIRECTIONAL, &buf, 1);\n\t\t\tif (!ret)\n\t\t\t\tcode = MHI_EV_CC_SUCCESS;\n\n\t\t\tMHI_SAT_LOG(\"CTXT UPDATE CMD %s:%d processing %s\\n\",\n\t\t\t\tbuf.name, id, (code == MHI_EV_CC_SUCCESS) ?\n\t\t\t\t\"successful\" : \"failed\");\n\n\t\t\tpkt->ptr = MHI_TRE_EVT_CMD_COMPLETION_PTR(0);\n\t\t\tpkt->dword[0] = MHI_TRE_EVT_CMD_COMPLETION_D0(code);\n\t\t\tpkt->dword[1] = MHI_TRE_EVT_CMD_COMPLETION_D1;\n\t\t\tbreak;\n\t\t}\n\t\tcase MHI_PKT_TYPE_START_CHAN_CMD:\n\t\t{\n\t\t\tint id = MHI_TRE_GET_ID(pkt);\n\t\t\tstruct mhi_sat_device *sat_dev = find_sat_dev_by_id(\n\t\t\t\t\t\t\t sat_cntrl, id,\n\t\t\t\t\t\t\t SAT_CTXT_TYPE_CHAN);\n\t\t\tint ret;\n\n\t\t\tMHI_SAT_ASSERT(!sat_dev,\n\t\t\t\t      \"No device with given channel ID\\n\");\n\n\t\t\tMHI_SAT_ASSERT(sat_dev->chan_started,\n\t\t\t\t       \"Channel already started!\");\n\n\t\t\tret = mhi_prepare_for_transfer(sat_dev->mhi_dev);\n\t\t\tif (!ret) {\n\t\t\t\tsat_dev->chan_started = true;\n\t\t\t\tcode = MHI_EV_CC_SUCCESS;\n\t\t\t}\n\n\t\t\tMHI_SAT_LOG(\"START CHANNEL %d CMD processing %s\\n\",\n\t\t\t\tid, (code == MHI_EV_CC_SUCCESS) ? \"successful\" :\n\t\t\t\t\"failure\");\n\n\t\t\tpkt->ptr = MHI_TRE_EVT_CMD_COMPLETION_PTR(0);\n\t\t\tpkt->dword[0] = MHI_TRE_EVT_CMD_COMPLETION_D0(code);\n\t\t\tpkt->dword[1] = MHI_TRE_EVT_CMD_COMPLETION_D1;\n\t\t\tbreak;\n\t\t}\n\t\tcase MHI_PKT_TYPE_RESET_CHAN_CMD:\n\t\t{\n\t\t\tint id = MHI_TRE_GET_ID(pkt);\n\t\t\tstruct mhi_sat_device *sat_dev =\n\t\t\t\tfind_sat_dev_by_id(sat_cntrl, id,\n\t\t\t\t\t\t   SAT_CTXT_TYPE_CHAN);\n\n\t\t\tMHI_SAT_ASSERT(!sat_dev,\n\t\t\t\t\"No device with given channel ID\\n\");\n\n\t\t\tMHI_SAT_ASSERT(!sat_dev->chan_started,\n\t\t\t\t\"Resetting unstarted channel!\");\n\n\t\t\tmhi_unprepare_from_transfer(sat_dev->mhi_dev);\n\t\t\tsat_dev->chan_started = false;\n\n\t\t\tMHI_SAT_LOG(\n\t\t\t\t\"RESET CHANNEL %d CMD processing successful\\n\",\n\t\t\t\tid);\n\n\t\t\tpkt->ptr = MHI_TRE_EVT_CMD_COMPLETION_PTR(0);\n\t\t\tpkt->dword[0] = MHI_TRE_EVT_CMD_COMPLETION_D0(\n\t\t\t\t\tMHI_EV_CC_SUCCESS);\n\t\t\tpkt->dword[1] = MHI_TRE_EVT_CMD_COMPLETION_D1;\n\t\t\tbreak;\n\t\t}\n\t\tdefault:\n\t\t\tMHI_SAT_ASSERT(1, \"Unhandled command!\");\n\t\t\tbreak;\n\t\t}\n\t}\n}\n\nstatic void mhi_sat_process_worker(struct work_struct *work)\n{\n\tstruct mhi_sat_cntrl *sat_cntrl = container_of(work,\n\t\t\t\t\tstruct mhi_sat_cntrl, process_work);\n\tstruct mhi_sat_subsys *subsys = sat_cntrl->subsys;\n\tstruct mhi_sat_packet *packet, *tmp;\n\tstruct sat_header *hdr;\n\tstruct sat_tre *pkt;\n\tLIST_HEAD(head);\n\n\tMHI_SAT_LOG(\"Entered\\n\");\n\n\tspin_lock_irq(&sat_cntrl->pkt_lock);\n\tlist_splice_tail_init(&sat_cntrl->packet_list, &head);\n\tspin_unlock_irq(&sat_cntrl->pkt_lock);\n\n\tlist_for_each_entry_safe(packet, tmp, &head, node) {\n\t\thdr = packet->msg;\n\t\tpkt = SAT_TRE_OFFSET(packet->msg);\n\n\t\tlist_del(&packet->node);\n\n\t\tmhi_sat_process_cmds(sat_cntrl, hdr, pkt);\n\n\t\t/* send response event(s) */\n\t\tmhi_sat_send_msg(sat_cntrl, SAT_MSG_ID_EVT, hdr->seq,\n\t\t\t\t packet->msg,\n\t\t\t\t SAT_MSG_SIZE(SAT_TRE_NUM_PKTS(\n\t\t\t\t\t      hdr->payload_size)));\n\n\t\tkfree(packet);\n\t}\n\n\tMHI_SAT_LOG(\"Exited\\n\");\n}\n\nstatic void mhi_sat_connect_worker(struct work_struct *work)\n{\n\tstruct mhi_sat_cntrl *sat_cntrl = container_of(work,\n\t\t\t\t\tstruct mhi_sat_cntrl, connect_work);\n\tstruct mhi_sat_subsys *subsys = sat_cntrl->subsys;\n\tstruct sat_tre *pkt;\n\tvoid *msg;\n\tint ret;\n\n\tif (!subsys->rpdev || sat_cntrl->max_devices != sat_cntrl->num_devices\n\t    || sat_cntrl->active)\n\t\treturn;\n\n\tMHI_SAT_LOG(\"Entered\\n\");\n\n\tmsg = kmalloc(SAT_MSG_SIZE(3), GFP_ATOMIC);\n\tif (!msg)\n\t\treturn;\n\n\tsat_cntrl->active = true;\n\n\tpkt = SAT_TRE_OFFSET(msg);\n\n\t/* prepare #1 MHI_CFG HELLO event */\n\tpkt->ptr = MHI_TRE_EVT_CFG_PTR(sat_cntrl->mhi_cntrl->base_addr);\n\tpkt->dword[0] = MHI_TRE_EVT_CFG_D0(sat_cntrl->er_base,\n\t\t\t\t\t   sat_cntrl->num_er);\n\tpkt->dword[1] = MHI_TRE_EVT_CFG_D1;\n\tpkt++;\n\n\t/* prepare M0 event */\n\tpkt->ptr = MHI_TRE_EVT_MHI_STATE_PTR;\n\tpkt->dword[0] = MHI_TRE_EVT_MHI_STATE_D0(MHI_STATE_M0);\n\tpkt->dword[1] = MHI_TRE_EVT_MHI_STATE_D1;\n\tpkt++;\n\n\t/* prepare AMSS event */\n\tpkt->ptr = MHI_TRE_EVT_EE_PTR;\n\tpkt->dword[0] = MHI_TRE_EVT_EE_D0(MHI_EE_AMSS);\n\tpkt->dword[1] = MHI_TRE_EVT_EE_D1;\n\n\tret = mhi_sat_send_msg(sat_cntrl, SAT_MSG_ID_EVT, SAT_RESERVED_SEQ_NUM,\n\t\t\t       msg, SAT_MSG_SIZE(3));\n\tkfree(msg);\n\tif (ret) {\n\t\tMHI_SAT_ERR(\"Failed to send hello packet:%d\\n\", ret);\n\t\tsat_cntrl->active = false;\n\t\treturn;\n\t}\n\n\tMHI_SAT_LOG(\"Device 0x%x sent hello packet\\n\", sat_cntrl->dev_id);\n}\n\nstatic void mhi_sat_process_events(struct mhi_sat_cntrl *sat_cntrl,\n\t\t\t\t   struct sat_header *hdr, struct sat_tre *pkt)\n{\n\tint num_pkts = SAT_TRE_NUM_PKTS(hdr->payload_size);\n\tint i;\n\n\tfor (i = 0; i < num_pkts; i++, pkt++) {\n\t\tif (MHI_TRE_GET_TYPE(pkt) ==\n\t\t    MHI_PKT_TYPE_CMD_COMPLETION_EVENT) {\n\t\t\tif (hdr->reply_seq != sat_cntrl->last_cmd_seq)\n\t\t\t\tcontinue;\n\n\t\t\tsat_cntrl->last_cmd_ccs = MHI_TRE_GET_CCS(pkt);\n\t\t\tcomplete(&sat_cntrl->completion);\n\t\t}\n\t}\n}\n\nstatic int mhi_sat_rpmsg_cb(struct rpmsg_device *rpdev, void *data, int len,\n\t\t\t    void *priv, u32 src)\n{\n\tstruct mhi_sat_subsys *subsys = dev_get_drvdata(&rpdev->dev);\n\tstruct sat_header *hdr = data;\n\tstruct sat_tre *pkt = SAT_TRE_OFFSET(data);\n\tstruct mhi_sat_cntrl *sat_cntrl;\n\tstruct mhi_sat_packet *packet;\n\n\tMHI_SAT_ASSERT(!mhi_sat_isvalid_header(hdr, len), \"Invalid header!\\n\");\n\n\t/* find controller packet was sent for */\n\tsat_cntrl = find_sat_cntrl_by_id(subsys, hdr->dev_id);\n\n\tMHI_SAT_ASSERT(!sat_cntrl, \"Packet for unknown device!\\n\");\n\n\t/* handle events directly regardless of controller active state */\n\tif (hdr->msg_id == SAT_MSG_ID_EVT) {\n\t\tmhi_sat_process_events(sat_cntrl, hdr, pkt);\n\t\treturn 0;\n\t}\n\n\t/* Inactive controller cannot process incoming commands */\n\tif (unlikely(!sat_cntrl->active)) {\n\t\tMHI_SAT_ERR(\"Message for inactive controller!\\n\");\n\t\treturn 0;\n\t}\n\n\t/* offload commands to process worker */\n\tpacket = kmalloc(sizeof(*packet) + len, GFP_ATOMIC);\n\tif (!packet)\n\t\treturn 0;\n\n\tpacket->cntrl = sat_cntrl;\n\tpacket->msg = packet + 1;\n\tmemcpy(packet->msg, data, len);\n\n\tspin_lock_irq(&sat_cntrl->pkt_lock);\n\tlist_add_tail(&packet->node, &sat_cntrl->packet_list);\n\tspin_unlock_irq(&sat_cntrl->pkt_lock);\n\n\tschedule_work(&sat_cntrl->process_work);\n\n\treturn 0;\n}\n\nstatic void mhi_sat_rpmsg_remove(struct rpmsg_device *rpdev)\n{\n\tstruct mhi_sat_subsys *subsys = dev_get_drvdata(&rpdev->dev);\n\tstruct mhi_sat_cntrl *sat_cntrl;\n\tstruct mhi_sat_device *sat_dev;\n\tstruct mhi_buf *buf, *tmp;\n\n\tMHI_SUBSYS_LOG(\"Enter\\n\");\n\n\t/* unprepare each controller/device from transfer */\n\tmutex_lock(&subsys->cntrl_mutex);\n\tlist_for_each_entry(sat_cntrl, &subsys->cntrl_list, node) {\n\t\tsat_cntrl->active = false;\n\n\t\tflush_work(&sat_cntrl->connect_work);\n\t\tflush_work(&sat_cntrl->process_work);\n\n\t\tmutex_lock(&sat_cntrl->list_mutex);\n\t\tlist_for_each_entry(sat_dev, &sat_cntrl->dev_list, node) {\n\t\t\tif (sat_dev->chan_started) {\n\t\t\t\tmhi_unprepare_from_transfer(sat_dev->mhi_dev);\n\t\t\t\tsat_dev->chan_started = false;\n\t\t\t}\n\t\t}\n\n\t\tlist_for_each_entry_safe(buf, tmp, &sat_cntrl->addr_map_list,\n\t\t\t\t\t node) {\n\t\t\tdma_unmap_resource(sat_cntrl->mhi_cntrl->dev,\n\t\t\t\t\t   buf->dma_addr, buf->len,\n\t\t\t\t\t   DMA_BIDIRECTIONAL, 0);\n\t\t\tlist_del(&buf->node);\n\t\t\tkfree(buf);\n\t\t}\n\t\tmutex_unlock(&sat_cntrl->list_mutex);\n\n\t\tMHI_SAT_LOG(\"Removed RPMSG link\\n\");\n\t}\n\tmutex_unlock(&subsys->cntrl_mutex);\n\n\tsubsys->rpdev = NULL;\n}\n\nstatic int mhi_sat_rpmsg_probe(struct rpmsg_device *rpdev)\n{\n\tstruct mhi_sat_subsys *subsys;\n\tstruct mhi_sat_cntrl *sat_cntrl;\n\tconst char *subsys_name;\n\tint ret;\n\n\tret = of_property_read_string(rpdev->dev.parent->of_node, \"label\",\n\t\t\t\t\t&subsys_name);\n\tif (ret)\n\t\treturn ret;\n\n\t/* find which subsystem has probed */\n\tsubsys = find_subsys_by_name(subsys_name);\n\tif (!subsys)\n\t\treturn -EINVAL;\n\n\tMHI_SUBSYS_LOG(\"Received RPMSG probe\\n\");\n\n\tdev_set_drvdata(&rpdev->dev, subsys);\n\n\tsubsys->rpdev = rpdev;\n\n\t/* schedule work for each controller as GLINK has connected */\n\tspin_lock_irq(&subsys->cntrl_lock);\n\tlist_for_each_entry(sat_cntrl, &subsys->cntrl_list, node)\n\t\tschedule_work(&sat_cntrl->connect_work);\n\tspin_unlock_irq(&subsys->cntrl_lock);\n\n\treturn 0;\n}\n\nstatic struct rpmsg_device_id mhi_sat_rpmsg_match_table[] = {\n\t{ .name = \"mhi_sat\" },\n\t{ },\n};\n\nstatic struct rpmsg_driver mhi_sat_rpmsg_driver = {\n\t.id_table = mhi_sat_rpmsg_match_table,\n\t.probe = mhi_sat_rpmsg_probe,\n\t.remove = mhi_sat_rpmsg_remove,\n\t.callback = mhi_sat_rpmsg_cb,\n\t.drv = {\n\t\t.name = \"mhi,sat_rpmsg\",\n\t},\n};\n\nstatic void mhi_sat_dev_status_cb(struct mhi_device *mhi_dev,\n\t\t\t\t  enum MHI_CB mhi_cb)\n{\n}\n\nstatic void mhi_sat_dev_remove(struct mhi_device *mhi_dev)\n{\n\tstruct mhi_sat_device *sat_dev = mhi_device_get_devdata(mhi_dev);\n\tstruct mhi_sat_cntrl *sat_cntrl = sat_dev->cntrl;\n\tstruct mhi_sat_subsys *subsys = sat_cntrl->subsys;\n\tstruct mhi_buf *buf, *tmp;\n\tstruct sat_tre *pkt;\n\tvoid *msg;\n\tint ret;\n\n\t/* remove device node from probed list */\n\tmutex_lock(&sat_cntrl->list_mutex);\n\tlist_del(&sat_dev->node);\n\tmutex_unlock(&sat_cntrl->list_mutex);\n\n\tsat_cntrl->num_devices--;\n\n\t/* prepare SYS_ERR command if first device is being removed */\n\tif (sat_cntrl->active) {\n\t\tsat_cntrl->active = false;\n\n\t\t/* flush all pending work */\n\t\tflush_work(&sat_cntrl->connect_work);\n\t\tflush_work(&sat_cntrl->process_work);\n\n\t\tmsg = kmalloc(SAT_MSG_SIZE(1), GFP_KERNEL);\n\n\t\tMHI_SAT_ASSERT(!msg, \"Unable to malloc for SYS_ERR message!\\n\");\n\n\t\tpkt = SAT_TRE_OFFSET(msg);\n\t\tpkt->ptr = MHI_TRE_CMD_SYS_ERR_PTR;\n\t\tpkt->dword[0] = MHI_TRE_CMD_SYS_ERR_D0;\n\t\tpkt->dword[1] = MHI_TRE_CMD_SYS_ERR_D1;\n\n\t\t/* acquire cmd_wait_mutex before sending command */\n\t\tmutex_lock(&sat_cntrl->cmd_wait_mutex);\n\n\t\tret = mhi_sat_send_msg(sat_cntrl, SAT_MSG_ID_CMD,\n\t\t\t\t       SAT_RESERVED_SEQ_NUM, msg,\n\t\t\t\t       SAT_MSG_SIZE(1));\n\t\tkfree(msg);\n\t\tif (ret) {\n\t\t\tMHI_SAT_ERR(\"Failed to notify SYS_ERR\\n\");\n\t\t\tmutex_unlock(&sat_cntrl->cmd_wait_mutex);\n\t\t\tgoto exit_sys_err_send;\n\t\t}\n\n\t\tMHI_SAT_LOG(\"SYS_ERR command sent\\n\");\n\n\t\t/* blocking call to wait for command completion event */\n\t\tmhi_sat_wait_cmd_completion(sat_cntrl);\n\n\t\tmutex_unlock(&sat_cntrl->cmd_wait_mutex);\n\t}\n\nexit_sys_err_send:\n\t/* exit if some devices are still present */\n\tif (sat_cntrl->num_devices)\n\t\treturn;\n\n\t/* remove address mappings */\n\tmutex_lock(&sat_cntrl->list_mutex);\n\tlist_for_each_entry_safe(buf, tmp, &sat_cntrl->addr_map_list, node) {\n\t\tdma_unmap_resource(sat_cntrl->mhi_cntrl->dev, buf->dma_addr,\n\t\t\t\t   buf->len, DMA_BIDIRECTIONAL, 0);\n\t\tlist_del(&buf->node);\n\t\tkfree(buf);\n\t}\n\tmutex_unlock(&sat_cntrl->list_mutex);\n\n\t/* remove controller */\n\tmutex_lock(&subsys->cntrl_mutex);\n\tspin_lock_irq(&subsys->cntrl_lock);\n\tlist_del(&sat_cntrl->node);\n\tspin_unlock_irq(&subsys->cntrl_lock);\n\tmutex_unlock(&subsys->cntrl_mutex);\n\n\tmutex_destroy(&sat_cntrl->cmd_wait_mutex);\n\tmutex_destroy(&sat_cntrl->list_mutex);\n\tMHI_SAT_LOG(\"Satellite controller node removed\\n\");\n\tkfree(sat_cntrl);\n}\n\nstatic int mhi_sat_dev_probe(struct mhi_device *mhi_dev,\n\t\t\t     const struct mhi_device_id *id)\n{\n\tstruct mhi_sat_device *sat_dev;\n\tstruct mhi_sat_cntrl *sat_cntrl;\n\tstruct device_node *of_node = mhi_dev->dev.of_node;\n\tstruct mhi_sat_subsys *subsys = &mhi_sat_driver.subsys[id->driver_data];\n\tu32 dev_id = MHI_SAT_CREATE_DEVICE_ID(mhi_dev->dev_id, mhi_dev->domain,\n\t\t\t\t\t      mhi_dev->bus, mhi_dev->slot);\n\tint ret;\n\n\t/* find controller with unique device ID based on topology */\n\tsat_cntrl = find_sat_cntrl_by_id(subsys, dev_id);\n\tif (!sat_cntrl) {\n\t\tsat_cntrl = kzalloc(sizeof(*sat_cntrl), GFP_KERNEL);\n\t\tif (!sat_cntrl)\n\t\t\treturn -ENOMEM;\n\n\t\t/*\n\t\t * max_devices will be read from device tree node. Set it to\n\t\t * -1 before it is populated to avoid false positive when\n\t\t * RPMSG probe schedules connect worker but no device has\n\t\t * probed in which case num_devices and max_devices are both\n\t\t * zero.\n\t\t */\n\t\tsat_cntrl->max_devices = -1;\n\t\tsat_cntrl->dev_id = dev_id;\n\t\tsat_cntrl->er_base = mhi_dev->dl_event_id;\n\t\tsat_cntrl->mhi_cntrl = mhi_dev->mhi_cntrl;\n\t\tsat_cntrl->last_cmd_seq = SAT_RESERVED_SEQ_NUM;\n\t\tsat_cntrl->subsys = subsys;\n\t\tinit_completion(&sat_cntrl->completion);\n\t\tmutex_init(&sat_cntrl->list_mutex);\n\t\tmutex_init(&sat_cntrl->cmd_wait_mutex);\n\t\tspin_lock_init(&sat_cntrl->pkt_lock);\n\t\tINIT_WORK(&sat_cntrl->connect_work, mhi_sat_connect_worker);\n\t\tINIT_WORK(&sat_cntrl->process_work, mhi_sat_process_worker);\n\t\tINIT_LIST_HEAD(&sat_cntrl->dev_list);\n\t\tINIT_LIST_HEAD(&sat_cntrl->addr_map_list);\n\t\tINIT_LIST_HEAD(&sat_cntrl->packet_list);\n\n\t\tmutex_lock(&subsys->cntrl_mutex);\n\t\tspin_lock_irq(&subsys->cntrl_lock);\n\t\tlist_add(&sat_cntrl->node, &subsys->cntrl_list);\n\t\tspin_unlock_irq(&subsys->cntrl_lock);\n\t\tmutex_unlock(&subsys->cntrl_mutex);\n\n\t\tMHI_SAT_LOG(\"Controller allocated for 0x%x\\n\", dev_id);\n\t}\n\n\t/* set maximum devices for subsystem from device tree */\n\tif (of_node) {\n\t\tret = of_property_read_u32(of_node, \"mhi,max-devices\",\n\t\t\t\t\t   &sat_cntrl->max_devices);\n\t\tif (ret) {\n\t\t\tMHI_SAT_ERR(\"Could not find max-devices in DT node\\n\");\n\t\t\treturn -EINVAL;\n\t\t}\n\t}\n\n\t/* get event ring base and max indexes */\n\tsat_cntrl->er_base = min(sat_cntrl->er_base, mhi_dev->dl_event_id);\n\tsat_cntrl->er_max = max(sat_cntrl->er_base, mhi_dev->dl_event_id);\n\n\tsat_dev = devm_kzalloc(&mhi_dev->dev, sizeof(*sat_dev), GFP_KERNEL);\n\tif (!sat_dev)\n\t\treturn -ENOMEM;\n\n\tsat_dev->mhi_dev = mhi_dev;\n\tsat_dev->cntrl = sat_cntrl;\n\n\tmutex_lock(&sat_cntrl->list_mutex);\n\tlist_add(&sat_dev->node, &sat_cntrl->dev_list);\n\tmutex_unlock(&sat_cntrl->list_mutex);\n\n\tmhi_device_set_devdata(mhi_dev, sat_dev);\n\n\tsat_cntrl->num_devices++;\n\n\t/* schedule connect worker if all devices for controller have probed */\n\tif (sat_cntrl->num_devices == sat_cntrl->max_devices) {\n\t\t/* number of event rings is 1 more than difference in IDs */\n\t\tsat_cntrl->num_er = (sat_cntrl->er_max - sat_cntrl->er_base) +\n\t\t\t\t     1;\n\t\tMHI_SAT_LOG(\"All satellite channels probed!\\n\");\n\t\tschedule_work(&sat_cntrl->connect_work);\n\t}\n\n\treturn 0;\n}\n\n/* .driver_data stores subsys id */\nstatic const struct mhi_device_id mhi_sat_dev_match_table[] = {\n\t/* ADSP */\n\t{ .chan = \"ADSP_0\", .driver_data = SUBSYS_ADSP },\n\t{ .chan = \"ADSP_1\", .driver_data = SUBSYS_ADSP },\n\t{ .chan = \"ADSP_2\", .driver_data = SUBSYS_ADSP },\n\t{ .chan = \"ADSP_3\", .driver_data = SUBSYS_ADSP },\n\t{ .chan = \"ADSP_4\", .driver_data = SUBSYS_ADSP },\n\t{ .chan = \"ADSP_5\", .driver_data = SUBSYS_ADSP },\n\t{ .chan = \"ADSP_6\", .driver_data = SUBSYS_ADSP },\n\t{ .chan = \"ADSP_7\", .driver_data = SUBSYS_ADSP },\n\t{ .chan = \"ADSP_8\", .driver_data = SUBSYS_ADSP },\n\t{ .chan = \"ADSP_9\", .driver_data = SUBSYS_ADSP },\n\t/* CDSP */\n\t{ .chan = \"CDSP_0\", .driver_data = SUBSYS_CDSP },\n\t{ .chan = \"CDSP_1\", .driver_data = SUBSYS_CDSP },\n\t{ .chan = \"CDSP_2\", .driver_data = SUBSYS_CDSP },\n\t{ .chan = \"CDSP_3\", .driver_data = SUBSYS_CDSP },\n\t{ .chan = \"CDSP_4\", .driver_data = SUBSYS_CDSP },\n\t{ .chan = \"CDSP_5\", .driver_data = SUBSYS_CDSP },\n\t{ .chan = \"CDSP_6\", .driver_data = SUBSYS_CDSP },\n\t{ .chan = \"CDSP_7\", .driver_data = SUBSYS_CDSP },\n\t{ .chan = \"CDSP_8\", .driver_data = SUBSYS_CDSP },\n\t{ .chan = \"CDSP_9\", .driver_data = SUBSYS_CDSP },\n\t/* SLPI */\n\t{ .chan = \"SLPI_0\", .driver_data = SUBSYS_SLPI },\n\t{ .chan = \"SLPI_1\", .driver_data = SUBSYS_SLPI },\n\t{ .chan = \"SLPI_2\", .driver_data = SUBSYS_SLPI },\n\t{ .chan = \"SLPI_3\", .driver_data = SUBSYS_SLPI },\n\t{ .chan = \"SLPI_4\", .driver_data = SUBSYS_SLPI },\n\t{ .chan = \"SLPI_5\", .driver_data = SUBSYS_SLPI },\n\t{ .chan = \"SLPI_6\", .driver_data = SUBSYS_SLPI },\n\t{ .chan = \"SLPI_7\", .driver_data = SUBSYS_SLPI },\n\t{ .chan = \"SLPI_8\", .driver_data = SUBSYS_SLPI },\n\t{ .chan = \"SLPI_9\", .driver_data = SUBSYS_SLPI },\n\t/* MODEM */\n\t{ .chan = \"MODEM_0\", .driver_data = SUBSYS_MODEM },\n\t{ .chan = \"MODEM_1\", .driver_data = SUBSYS_MODEM },\n\t{ .chan = \"MODEM_2\", .driver_data = SUBSYS_MODEM },\n\t{ .chan = \"MODEM_3\", .driver_data = SUBSYS_MODEM },\n\t{ .chan = \"MODEM_4\", .driver_data = SUBSYS_MODEM },\n\t{ .chan = \"MODEM_5\", .driver_data = SUBSYS_MODEM },\n\t{ .chan = \"MODEM_6\", .driver_data = SUBSYS_MODEM },\n\t{ .chan = \"MODEM_7\", .driver_data = SUBSYS_MODEM },\n\t{ .chan = \"MODEM_8\", .driver_data = SUBSYS_MODEM },\n\t{ .chan = \"MODEM_9\", .driver_data = SUBSYS_MODEM },\n\t{},\n};\n\nstatic struct mhi_driver mhi_sat_dev_driver = {\n\t.id_table = mhi_sat_dev_match_table,\n\t.probe = mhi_sat_dev_probe,\n\t.remove = mhi_sat_dev_remove,\n\t.status_cb = mhi_sat_dev_status_cb,\n\t.driver = {\n\t\t.name = MHI_SAT_DRIVER_NAME,\n\t\t.owner = THIS_MODULE,\n\t},\n};\n\nint mhi_sat_trigger_init(void *data, u64 val)\n{\n\tstruct mhi_sat_subsys *subsys;\n\tint i, ret;\n\n\tif (mhi_sat_driver.deferred_init_done)\n\t\treturn -EIO;\n\n\tret = register_rpmsg_driver(&mhi_sat_rpmsg_driver);\n\tif (ret)\n\t\tgoto error_sat_trigger_init;\n\n\tret = mhi_driver_register(&mhi_sat_dev_driver);\n\tif (ret)\n\t\tgoto error_sat_trigger_register;\n\n\tmhi_sat_driver.deferred_init_done = true;\n\n\treturn 0;\n\nerror_sat_trigger_register:\n\tunregister_rpmsg_driver(&mhi_sat_rpmsg_driver);\n\nerror_sat_trigger_init:\n\tsubsys = mhi_sat_driver.subsys;\n\tfor (i = 0; i < mhi_sat_driver.num_subsys; i++, subsys++) {\n\t\tipc_log_context_destroy(subsys->ipc_log);\n\t\tmutex_destroy(&subsys->cntrl_mutex);\n\t}\n\tkfree(mhi_sat_driver.subsys);\n\tmhi_sat_driver.subsys = NULL;\n\n\treturn ret;\n}\n\nDEFINE_SIMPLE_ATTRIBUTE(mhi_sat_debugfs_fops, NULL,\n\t\t\tmhi_sat_trigger_init, \"%llu\\n\");\n\nstatic int mhi_sat_init(void)\n{\n\tstruct mhi_sat_subsys *subsys;\n\tint i, ret;\n\n\tsubsys = kcalloc(SUBSYS_MAX, sizeof(*subsys), GFP_KERNEL);\n\tif (!subsys)\n\t\treturn -ENOMEM;\n\n\tmhi_sat_driver.subsys = subsys;\n\tmhi_sat_driver.num_subsys = SUBSYS_MAX;\n\tmhi_sat_driver.klog_lvl = KLOG_LVL;\n\tmhi_sat_driver.ipc_log_lvl = IPC_LOG_LVL;\n\n\tfor (i = 0; i < mhi_sat_driver.num_subsys; i++, subsys++) {\n\t\tchar log[32];\n\n\t\tsubsys->name = subsys_names[i];\n\t\tmutex_init(&subsys->cntrl_mutex);\n\t\tspin_lock_init(&subsys->cntrl_lock);\n\t\tINIT_LIST_HEAD(&subsys->cntrl_list);\n\t\tscnprintf(log, sizeof(log), \"mhi_sat_%s\", subsys->name);\n\t\tsubsys->ipc_log = ipc_log_context_create(IPC_LOG_PAGES, log, 0);\n\t}\n\n\t/* create debugfs entry if defer_init is enabled */\n\tif (mhi_sat_defer_init) {\n\t\tmhi_sat_driver.dentry = debugfs_create_dir(\"mhi_sat\", NULL);\n\t\tif (IS_ERR_OR_NULL(mhi_sat_driver.dentry)) {\n\t\t\tret = -ENODEV;\n\t\t\tgoto error_sat_init;\n\t\t}\n\n\t\tdebugfs_create_file(\"debug\", 0444, mhi_sat_driver.dentry, NULL,\n\t\t\t\t    &mhi_sat_debugfs_fops);\n\n\t\treturn 0;\n\t}\n\n\tret = register_rpmsg_driver(&mhi_sat_rpmsg_driver);\n\tif (ret)\n\t\tgoto error_sat_init;\n\n\tret = mhi_driver_register(&mhi_sat_dev_driver);\n\tif (ret)\n\t\tgoto error_sat_register;\n\n\treturn 0;\n\nerror_sat_register:\n\tunregister_rpmsg_driver(&mhi_sat_rpmsg_driver);\n\nerror_sat_init:\n\tsubsys = mhi_sat_driver.subsys;\n\tfor (i = 0; i < mhi_sat_driver.num_subsys; i++, subsys++) {\n\t\tipc_log_context_destroy(subsys->ipc_log);\n\t\tmutex_destroy(&subsys->cntrl_mutex);\n\t}\n\tkfree(mhi_sat_driver.subsys);\n\tmhi_sat_driver.subsys = NULL;\n\n\treturn ret;\n}\n\nmodule_init(mhi_sat_init);\n\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/devices/mhi_uci.c",
    "content": "// SPDX-License-Identifier: GPL-2.0-only\n/* Copyright (c) 2018-2019, The Linux Foundation. All rights reserved.*/\n\n#include <linux/cdev.h>\n#include <linux/device.h>\n#include <linux/dma-direction.h>\n#include <linux/errno.h>\n#include <linux/fs.h>\n#include <linux/mm.h>\n#include <linux/delay.h>\n#include <linux/version.h>\n#if 1\nstatic inline void *ipc_log_context_create(int max_num_pages,\n        const char *modname, uint16_t user_version)\n{ return NULL; }\nstatic inline int ipc_log_string(void *ilctxt, const char *fmt, ...)\n{ return -EINVAL; }\n#endif\n#include <linux/kernel.h>\n#include <linux/module.h>\n#include <linux/of_device.h>\n#include <linux/poll.h>\n#include <linux/slab.h>\n#include <linux/types.h>\n#include <linux/sched.h>\n#include <linux/wait.h>\n#include <linux/uaccess.h>\n#include <linux/tty.h>\n#include \"../core/mhi.h\"\n\n#define DEVICE_NAME \"mhi\"\n#define MHI_UCI_DRIVER_NAME \"mhi_uci_q\"\n\nstruct uci_chan {\n\twait_queue_head_t wq;\n\tspinlock_t lock;\n\tstruct list_head pending; /* user space waiting to read */\n\tstruct uci_buf *cur_buf; /* current buffer user space reading */\n\tsize_t rx_size;\n};\n\nstruct uci_buf {\n\tstruct page *page;\n\tvoid *data;\n\tsize_t len;\n\tunsigned nr_trb;\n\tstruct list_head node;\n};\n\nstruct uci_dev {\n\tstruct list_head node;\n\tdev_t devt;\n\tstruct device *dev;\n\tstruct mhi_device *mhi_dev;\n\tconst char *chan;\n\tstruct mutex mutex; /* sync open and close */\n\tstruct mutex r_mutex;\n\tstruct mutex w_mutex;\n\tstruct uci_chan ul_chan;\n\tstruct uci_chan dl_chan;\n\tsize_t mtu;\n\tint ref_count;\n\tbool enabled;\n\tunsigned rx_error;\n\tunsigned nr_trb;\n\tunsigned nr_trbs;\n\tstruct uci_buf *uci_buf;\n\tstruct ktermios\ttermios;\n\tsize_t bytes_xferd;\n};\n\nstruct mhi_uci_drv {\n\tstruct list_head head;\n\tstruct mutex lock;\n\tstruct class *class;\n\tint major;\n\tdev_t dev_t;\n};\n\nstatic int uci_msg_lvl = MHI_MSG_LVL_ERROR;\nmodule_param( uci_msg_lvl, uint, S_IRUGO | S_IWUSR);\n\n#define MSG_VERB(fmt, ...) do { \\\n\t\tif (uci_msg_lvl <= MHI_MSG_LVL_VERBOSE) \\\n\t\t\tpr_err(\"[D][%s] \" fmt, __func__, ##__VA_ARGS__); \\\n\t} while (0)\n\n#define MSG_LOG(fmt, ...) do { \\\n\t\tif (uci_msg_lvl <= MHI_MSG_LVL_INFO) \\\n\t\t\tpr_err(\"[I][%s] \" fmt, __func__, ##__VA_ARGS__); \\\n\t} while (0)\n\n#define MSG_ERR(fmt, ...) do { \\\n\t\tif (uci_msg_lvl <= MHI_MSG_LVL_ERROR) \\\n\t\t\tpr_err(\"[E][%s] \" fmt, __func__, ##__VA_ARGS__); \\\n\t} while (0)\n\n#define MAX_UCI_DEVICES (64)\n#define QUEC_MHI_UCI_ALWAYS_OPEN //by now, sdx20 can not handle \"start-reset-start\" operation, so the simply solution is keep start state\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 1, 0))\n#ifdef TCGETS2\n__weak int user_termios_to_kernel_termios(struct ktermios *k,\n\t\t\t\t\t\t struct termios2 __user *u)\n{\n\treturn copy_from_user(k, u, sizeof(struct termios2));\n}\n__weak int kernel_termios_to_user_termios(struct termios2 __user *u,\n\t\t\t\t\t\t struct ktermios *k)\n{\n\treturn copy_to_user(u, k, sizeof(struct termios2));\n}\n__weak int user_termios_to_kernel_termios_1(struct ktermios *k,\n\t\t\t\t\t\t   struct termios __user *u)\n{\n\treturn copy_from_user(k, u, sizeof(struct termios));\n}\n__weak int kernel_termios_to_user_termios_1(struct termios __user *u,\n\t\t\t\t\t\t   struct ktermios *k)\n{\n\treturn copy_to_user(u, k, sizeof(struct termios));\n}\n\n#else\n\n__weak int user_termios_to_kernel_termios(struct ktermios *k,\n\t\t\t\t\t\t struct termios __user *u)\n{\n\treturn copy_from_user(k, u, sizeof(struct termios));\n}\n__weak int kernel_termios_to_user_termios(struct termios __user *u,\n\t\t\t\t\t\t struct ktermios *k)\n{\n\treturn copy_to_user(u, k, sizeof(struct termios));\n}\n#endif /* TCGETS2 */\n#endif\n\nstatic DECLARE_BITMAP(uci_minors, MAX_UCI_DEVICES);\nstatic struct mhi_uci_drv mhi_uci_drv;\n\nstatic int mhi_queue_inbound(struct uci_dev *uci_dev)\n{\n\tstruct mhi_device *mhi_dev = uci_dev->mhi_dev;\n\tint nr_trbs = mhi_get_no_free_descriptors(mhi_dev, DMA_FROM_DEVICE);\n\tsize_t mtu = uci_dev->mtu;\n\tvoid *buf;\n\tstruct uci_buf *uci_buf;\n\tint ret = -EIO, i;\n\n\tif (uci_dev->uci_buf == NULL) {\n\t\tuci_dev->nr_trb = 0;\n\t\tuci_dev->nr_trbs = (nr_trbs + 1);\n\t\tuci_dev->uci_buf = kmalloc_array(uci_dev->nr_trbs, sizeof(*uci_buf), GFP_KERNEL);\n\t\tif (!uci_dev->uci_buf)\n\t\t\treturn -ENOMEM;\n\n\t\tuci_buf = uci_dev->uci_buf;\n\t\tfor (i = 0; i < uci_dev->nr_trbs; i++, uci_buf++) {\n\t\t\tuci_buf->page = alloc_pages(GFP_KERNEL, get_order(mtu));\n\t\t\tif (!uci_buf->page)\n\t\t\t\treturn -ENOMEM;\n\t\t\tuci_buf->data = page_address(uci_buf->page);\n\t\t\tuci_buf->len = 0;\n\t\t\tuci_buf->nr_trb = i;\n\t\t\tif (mhi_dev->dl_chan_id == MHI_CLIENT_DUN_IN) {\n\t\t\t\t//MSG_ERR(\"[%d] = %p\\n\", i, uci_buf->data);\n\t\t\t}\n\t\t}\n\t}\n\n\tfor (i = 0; i < nr_trbs; i++) {\n\t\t#if 0\n\t\tbuf = kmalloc(mtu + sizeof(*uci_buf), GFP_KERNEL);\n\t\tif (!buf)\n\t\t\treturn -ENOMEM;\n\n\t\tuci_buf = buf + mtu;\n\t\tuci_buf->data = buf;\n\t\t#else\n\t\tuci_buf = &uci_dev->uci_buf[i];\n\t\tbuf = uci_buf->data;\n\t\t#endif\n\n\t\tMSG_VERB(\"Allocated buf %d of %d size %zu\\n\", i, nr_trbs, mtu);\n\n\t\tret = mhi_queue_transfer(mhi_dev, DMA_FROM_DEVICE, buf, mtu,\n\t\t\t\t\t MHI_EOT);\n\t\tif (ret) {\n\t\t\t#if 0\n\t\t\tkfree(buf);\n\t\t\t#endif\n\t\t\tMSG_ERR(\"Failed to queue buffer %d\\n\", i);\n\t\t\treturn ret;\n\t\t}\n\t}\n\n\treturn ret;\n}\n\nstatic long mhi_uci_ioctl(struct file *file,\n\t\t\t  unsigned int cmd,\n\t\t\t  unsigned long arg)\n{\n\tstruct uci_dev *uci_dev = file->private_data;\n\tstruct mhi_device *mhi_dev = uci_dev->mhi_dev;\n\tlong ret = -ERESTARTSYS;\n\n\tmutex_lock(&uci_dev->mutex);\n\tif (uci_dev->enabled)\n\t\tret = mhi_ioctl(mhi_dev, cmd, arg);\n\n\tif (uci_dev->enabled) {\n\t\tswitch (cmd) {\n\t\tcase TCGETS:\n#ifndef TCGETS2\n\t\t\tret = kernel_termios_to_user_termios((struct termios __user *)arg, &uci_dev->termios);\n#else\n\t\t\tret = kernel_termios_to_user_termios_1((struct termios __user *)arg, &uci_dev->termios);\n#endif\n\t\tbreak;\n\n\t\tcase TCSETSF:\n\t\tcase TCSETS:\n#ifndef TCGETS2\n\t\t\tret = user_termios_to_kernel_termios(&uci_dev->termios, (struct termios __user *)arg);\n#else\n\t\t\tret = user_termios_to_kernel_termios_1(&uci_dev->termios, (struct termios __user *)arg);\n#endif\n\t\tbreak;\n\n\t\tcase TCFLSH:\n\t\t\tret = 0;\n\t\tbreak;\n\n\t\tdefault:\n\t\tbreak;\n\t\t}\n\t}\n\tmutex_unlock(&uci_dev->mutex);\n\n\treturn ret;\n}\n\nstatic int mhi_uci_release(struct inode *inode, struct file *file)\n{\n\tstruct uci_dev *uci_dev = file->private_data;\n\n\tmutex_lock(&uci_dev->mutex);\n\tuci_dev->ref_count--;\n\tif (!uci_dev->ref_count) {\n\t\tstruct uci_chan *uci_chan;\n\n\t\tMSG_LOG(\"Last client left, closing node\\n\");\n\n\t\tif (uci_dev->enabled)\n\t\t\tmhi_unprepare_from_transfer(uci_dev->mhi_dev);\n\n\t\t/* clean inbound channel */\n\t\tuci_chan = &uci_dev->dl_chan;\n\t\tif (uci_dev->uci_buf) {\n\t\t\tunsigned nr_trb = 0;\n\n\t\t\tfor (nr_trb = 0; nr_trb < uci_dev->nr_trbs; nr_trb++) {\n\t\t\t\tif (uci_dev->uci_buf[nr_trb].page)\n\t\t\t\t\t__free_pages(uci_dev->uci_buf[nr_trb].page, get_order(uci_dev->mtu));\n\t\t\t}\n\t\t\tkfree(uci_dev->uci_buf);\n\t\t}\n\n\t\tuci_chan->cur_buf = NULL;\n\n\t\tif (!uci_dev->enabled) {\n\t\t\tMSG_LOG(\"Node is deleted, freeing dev node\\n\");\n\t\t\tmutex_unlock(&uci_dev->mutex);\n\t\t\tmutex_destroy(&uci_dev->mutex);\n\t\t\tclear_bit(MINOR(uci_dev->devt), uci_minors);\n\t\t\tkfree(uci_dev);\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tMSG_LOG(\"exit: ref_count:%d\\n\", uci_dev->ref_count);\n\n\tmutex_unlock(&uci_dev->mutex);\n\n\treturn 0;\n}\n\nstatic unsigned int mhi_uci_poll(struct file *file, poll_table *wait)\n{\n\tstruct uci_dev *uci_dev = file->private_data;\n\tstruct mhi_device *mhi_dev = uci_dev->mhi_dev;\n\tstruct uci_chan *uci_chan;\n\tunsigned int mask = 0;\n\n\tpoll_wait(file, &uci_dev->dl_chan.wq, wait);\n\t// ADPL and QDSS do not need poll write. xingduo.du 2023-02-16\n\t// poll_wait(file, &uci_dev->ul_chan.wq, wait);\n\n\tuci_chan = &uci_dev->dl_chan;\n\tspin_lock_bh(&uci_chan->lock);\n\tif (!uci_dev->enabled) {\n\t\tmask = POLLERR;\n\t} else if (!list_empty(&uci_chan->pending) || uci_chan->cur_buf) {\n\t\tMSG_VERB(\"Client can read from node\\n\");\n\t\tmask |= POLLIN | POLLRDNORM;\n\t}\n\tspin_unlock_bh(&uci_chan->lock);\n\n\t// ADPL and QDSS are single channel, ul_chan not be initilized. xingduo.du 2023-02-27\n\tif (mhi_dev->ul_chan) {\n\t\tpoll_wait(file, &uci_dev->ul_chan.wq, wait);\n\t\tuci_chan = &uci_dev->ul_chan;\n\t\tspin_lock_bh(&uci_chan->lock);\n\t\tif (!uci_dev->enabled) {\n\t\t\tmask |= POLLERR;\n\t\t} else if (mhi_get_no_free_descriptors(mhi_dev, DMA_TO_DEVICE) > 0) {\n\t\t\tMSG_VERB(\"Client can write to node\\n\");\n\t\t\tmask |= POLLOUT | POLLWRNORM;\n\t\t}\n\n\t\tif (!uci_dev->enabled)\n\t\t\tmask |= POLLHUP;\n\t\tif (uci_dev->rx_error)\n\t\t\tmask |= POLLERR;\n\n\t\tspin_unlock_bh(&uci_chan->lock);\n\t}\n\n\tMSG_LOG(\"Client attempted to poll, returning mask 0x%x\\n\", mask);\n\n\treturn mask;\n}\n\nstatic ssize_t mhi_uci_write(struct file *file,\n\t\t\t     const char __user *buf,\n\t\t\t     size_t count,\n\t\t\t     loff_t *offp)\n{\n\tstruct uci_dev *uci_dev = file->private_data;\n\tstruct mhi_device *mhi_dev = uci_dev->mhi_dev;\n\tstruct uci_chan *uci_chan = &uci_dev->ul_chan;\n\tsize_t bytes_xfered = 0;\n\tint ret, nr_avail;\n\n\tif (!buf || !count || uci_dev->rx_error)\n\t\treturn -EINVAL;\n\n\t/* confirm channel is active */\n\tspin_lock_bh(&uci_chan->lock);\n\tif (!uci_dev->enabled) {\n\t\tspin_unlock_bh(&uci_chan->lock);\n\t\treturn -ERESTARTSYS;\n\t}\n\n\tMSG_VERB(\"Enter: to xfer:%zu bytes\\n\", count);\n\n\twhile (count) {\n\t\tsize_t xfer_size;\n\t\tvoid *kbuf;\n\t\tenum MHI_FLAGS flags;\n\n\t\tspin_unlock_bh(&uci_chan->lock);\n\n\t\tnr_avail = mhi_get_no_free_descriptors(mhi_dev, DMA_TO_DEVICE);\n \t\tif ((nr_avail == 0) && (file->f_flags & O_NONBLOCK))\n\t\t\treturn -EAGAIN;\n\n\t\t/* wait for free descriptors */\n\t\tret = wait_event_interruptible(uci_chan->wq,\n\t\t\t(!uci_dev->enabled) ||\n\t\t\t(nr_avail = mhi_get_no_free_descriptors(mhi_dev,\n\t\t\t\t\t\t\tDMA_TO_DEVICE)) > 0);\n\n\t\tif (ret == -ERESTARTSYS || !uci_dev->enabled) {\n\t\t\tMSG_LOG(\"Exit signal caught for node or not enabled\\n\");\n\t\t\treturn -ERESTARTSYS;\n\t\t}\n\n\t\txfer_size = min_t(size_t, count, uci_dev->mtu);\n\t\tkbuf = kmalloc(xfer_size, GFP_KERNEL);\n\t\tif (!kbuf) {\n\t\t\tMSG_ERR(\"Failed to allocate memory %zu\\n\", xfer_size);\n\t\t\treturn -ENOMEM;\n\t\t}\n\n\t\tret = copy_from_user(kbuf, buf, xfer_size);\n\t\tif (unlikely(ret)) {\n\t\t\tkfree(kbuf);\n\t\t\treturn ret;\n\t\t}\n\n\t\tspin_lock_bh(&uci_chan->lock);\n\n\t\t/* if ring is full after this force EOT */\n\t\tif (nr_avail > 1 && (count - xfer_size))\n\t\t\tflags = MHI_CHAIN;\n\t\telse\n\t\t\tflags = MHI_EOT;\n\n\t\tif (uci_dev->enabled)\n\t\t\tret = mhi_queue_transfer(mhi_dev, DMA_TO_DEVICE, kbuf,\n\t\t\t\t\t\t xfer_size, flags);\n\t\telse\n\t\t\tret = -ERESTARTSYS;\n\n\t\tif (ret) {\n\t\t\tkfree(kbuf);\n\t\t\tgoto sys_interrupt;\n\t\t}\n\n\t\tbytes_xfered += xfer_size;\n\t\tcount -= xfer_size;\n\t\tbuf += xfer_size;\n\t}\n\n\tspin_unlock_bh(&uci_chan->lock);\n\tMSG_VERB(\"Exit: Number of bytes xferred:%zu\\n\", bytes_xfered);\n\n\treturn bytes_xfered;\n\nsys_interrupt:\n\tspin_unlock_bh(&uci_chan->lock);\n\n\treturn ret;\n}\n\nstatic ssize_t mhi_uci_read(struct file *file,\n\t\t\t    char __user *buf,\n\t\t\t    size_t count,\n\t\t\t    loff_t *ppos)\n{\n\tstruct uci_dev *uci_dev = file->private_data;\n\tstruct mhi_device *mhi_dev = uci_dev->mhi_dev;\n\tstruct uci_chan *uci_chan = &uci_dev->dl_chan;\n\tstruct uci_buf *uci_buf;\n\tchar *ptr;\n\tsize_t to_copy;\n\tint ret = 0;\n\n\tif (!buf || uci_dev->rx_error)\n\t\treturn -EINVAL;\n\n\tMSG_VERB(\"Client provided buf len:%zu\\n\", count);\n\n\t/* confirm channel is active */\n\tspin_lock_bh(&uci_chan->lock);\n\tif (!uci_dev->enabled) {\n\t\tspin_unlock_bh(&uci_chan->lock);\n\t\treturn -ERESTARTSYS;\n\t}\n\n\t/* No data available to read, wait */\n\tif (!uci_chan->cur_buf && list_empty(&uci_chan->pending)) {\n\t\tMSG_VERB(\"No data available to read waiting\\n\");\n\n\t\tspin_unlock_bh(&uci_chan->lock);\n\n\t\tif (file->f_flags & O_NONBLOCK)\n\t\t\treturn -EAGAIN;\n\n\t\tret = wait_event_interruptible(uci_chan->wq,\n\t\t\t\t(!uci_dev->enabled ||\n\t\t\t\t !list_empty(&uci_chan->pending)));\n\t\tif (ret == -ERESTARTSYS) {\n\t\t\tMSG_LOG(\"Exit signal caught for node\\n\");\n\t\t\treturn -ERESTARTSYS;\n\t\t}\n\n\t\tspin_lock_bh(&uci_chan->lock);\n\t\tif (!uci_dev->enabled) {\n\t\t\tMSG_LOG(\"node is disabled\\n\");\n\t\t\tret = -ERESTARTSYS;\n\t\t\tgoto read_error;\n\t\t}\n\t}\n\n\t/* new read, get the next descriptor from the list */\n\tif (!uci_chan->cur_buf) {\n\t\tuci_buf = list_first_entry_or_null(&uci_chan->pending,\n\t\t\t\t\t\t   struct uci_buf, node);\n\t\tif (unlikely(!uci_buf)) {\n\t\t\tret = -EIO;\n\t\t\tgoto read_error;\n\t\t}\n\n\t\tif (uci_buf->node.next == LIST_POISON1 || uci_buf->node.prev == LIST_POISON1) {\n\t\t\tdump_stack();\n\t\t\tret = -EIO;\n\t\t\tMSG_ERR(\"chan[%d] data=%p, len=%zd, nr_trb=%d\\n\",\n\t\t\t\tmhi_dev->dl_chan_id, uci_buf->data, uci_buf->len, uci_buf->nr_trb);\n\t\t\tgoto read_error;\n\t\t}\n\n\t\tlist_del(&uci_buf->node);\n\t\tuci_chan->cur_buf = uci_buf;\n\t\tuci_chan->rx_size = uci_buf->len;\n\t\tMSG_VERB(\"Got pkt of size:%zu\\n\", uci_chan->rx_size);\n\t}\n\n\tuci_buf = uci_chan->cur_buf;\n\tspin_unlock_bh(&uci_chan->lock);\n\n\t/* Copy the buffer to user space */\n\tto_copy = min_t(size_t, count, uci_chan->rx_size);\n\tptr = uci_buf->data + (uci_buf->len - uci_chan->rx_size);\n\tret = copy_to_user(buf, ptr, to_copy);\n\tif (ret)\n\t\treturn ret;\n\n\tMSG_VERB(\"Copied %zu of %zu bytes\\n\", to_copy, uci_chan->rx_size);\n\tuci_chan->rx_size -= to_copy;\n\n\t/* we finished with this buffer, queue it back to hardware */\n\tif (!uci_chan->rx_size) {\n\t\tspin_lock_bh(&uci_chan->lock);\n\t\tuci_chan->cur_buf = NULL;\n\n\t\tif (uci_dev->enabled)\n#if 1 //this can make the address in ring do not change\n\t\t{\n\t\t\tif (uci_buf->page) {\n\t\t\t\tunsigned nr_trb = uci_buf->nr_trb ? (uci_buf->nr_trb - 1) : (uci_dev->nr_trbs - 1);\n\n\t\t\t\tuci_buf = &uci_dev->uci_buf[nr_trb];\n\t\t\t\tret = mhi_queue_transfer(mhi_dev, DMA_FROM_DEVICE,\n\t\t\t\t\t\t\t uci_buf->data, uci_dev->mtu,\n\t\t\t\t\t\t\t MHI_EOT);\n\t\t\t} else {\n\t\t\t\tkfree(uci_buf);\n\t\t\t\tret = 0;\n\t\t\t}\n\t\t}\n#endif\n\t\telse\n\t\t\tret = -ERESTARTSYS;\n\n\t\tif (ret) {\n\t\t\tMSG_ERR(\"Failed to recycle element for chan:%d , ret=%d\\n\", mhi_dev->ul_chan_id, ret);\n#if 0\n\t\t\tkfree(uci_buf->data);\n#endif\n\t\t\tgoto read_error;\n\t\t}\n\n\t\tspin_unlock_bh(&uci_chan->lock);\n\t}\n\n\tMSG_VERB(\"Returning %zu bytes\\n\", to_copy);\n\n\treturn to_copy;\n\nread_error:\n\tspin_unlock_bh(&uci_chan->lock);\n\n\treturn ret;\n}\n\nstatic ssize_t mhi_uci_write_mutex(struct file *file,\n\t\t\t     const char __user *buf,\n\t\t\t     size_t count,\n\t\t\t     loff_t *offp)\n{\n\tstruct uci_dev *uci_dev = file->private_data;\n\tint ret;\n\n\tret = mutex_lock_interruptible(&uci_dev->w_mutex); /*concurrent writes */\n\tif (ret < 0)\n\t\treturn -ERESTARTSYS;\n\n\tret = mhi_uci_write(file, buf, count, offp);\n\tmutex_unlock(&uci_dev->w_mutex);\n\n\treturn ret;\n}\n\nstatic ssize_t mhi_uci_read_mutex(struct file *file,\n\t\t\t    char __user *buf,\n\t\t\t    size_t count,\n\t\t\t    loff_t *ppos)\n{\n\tstruct uci_dev *uci_dev = file->private_data;\n\tint ret;\n\n\tret = mutex_lock_interruptible(&uci_dev->r_mutex); /*concurrent reads */\n\tif (ret < 0)\n\t\treturn -ERESTARTSYS;\n\n\tret = mhi_uci_read(file, buf, count, ppos);\n\tmutex_unlock(&uci_dev->r_mutex);\n\n\treturn ret;\n}\n\nstatic int mhi_uci_open(struct inode *inode, struct file *filp)\n{\n\tstruct uci_dev *uci_dev = NULL, *tmp_dev;\n\tint ret = -EIO;\n\tstruct uci_chan *dl_chan;\n\n\tmutex_lock(&mhi_uci_drv.lock);\n\tlist_for_each_entry(tmp_dev, &mhi_uci_drv.head, node) {\n\t\tif (tmp_dev->devt == inode->i_rdev) {\n\t\t\tuci_dev = tmp_dev;\n\t\t\tbreak;\n\t\t}\n\t}\n\n\t/* could not find a minor node */\n\tif (!uci_dev)\n\t\tgoto error_exit;\n\n\tmutex_lock(&uci_dev->mutex);\n\tif (!uci_dev->enabled) {\n\t\tMSG_ERR(\"Node exist, but not in active state!\\n\");\n\t\tgoto error_open_chan;\n\t}\n\n\tuci_dev->ref_count++;\n\n\tMSG_LOG(\"Node open, ref counts %u\\n\", uci_dev->ref_count);\n\n\tif (uci_dev->ref_count == 1) {\n\t\tMSG_LOG(\"Starting channel\\n\");\n\t\tret = mhi_prepare_for_transfer(uci_dev->mhi_dev);\n\t\tif (ret) {\n\t\t\tMSG_ERR(\"Error starting transfer channels\\n\");\n\t\t\tuci_dev->ref_count--;\n\t\t\tgoto error_open_chan;\n\t\t}\n\n\t\tret = mhi_queue_inbound(uci_dev);\n\t\tif (ret)\n\t\t\tgoto error_rx_queue;\n\n#ifdef QUEC_MHI_UCI_ALWAYS_OPEN\n\t\tuci_dev->ref_count++;\n#endif\n\t}\n\n\tfilp->private_data = uci_dev;\n\tmutex_unlock(&uci_dev->mutex);\n\tmutex_unlock(&mhi_uci_drv.lock);\n\n\treturn 0;\n\n error_rx_queue:\n\tdl_chan = &uci_dev->dl_chan;\n\tmhi_unprepare_from_transfer(uci_dev->mhi_dev);\n\tif (uci_dev->uci_buf) {\n\t\tunsigned nr_trb = 0;\n\n\t\tfor (nr_trb = 0; nr_trb < uci_dev->nr_trbs; nr_trb++) {\n\t\t\tif (uci_dev->uci_buf[nr_trb].page)\n\t\t\t\t__free_pages(uci_dev->uci_buf[nr_trb].page, get_order(uci_dev->mtu));\n\t\t}\n\t\tkfree(uci_dev->uci_buf);\n\t}\n\n error_open_chan:\n\tmutex_unlock(&uci_dev->mutex);\n\nerror_exit:\n\tmutex_unlock(&mhi_uci_drv.lock);\n\n\treturn ret;\n}\n\nstatic const struct file_operations mhidev_fops = {\n\t.open = mhi_uci_open,\n\t.release = mhi_uci_release,\n\t.read = mhi_uci_read_mutex,\n\t.write = mhi_uci_write_mutex,\n\t.poll = mhi_uci_poll,\n\t.unlocked_ioctl = mhi_uci_ioctl,\n};\n\nstatic void mhi_uci_remove(struct mhi_device *mhi_dev)\n{\n\tstruct uci_dev *uci_dev = mhi_device_get_devdata(mhi_dev);\n\n\tMSG_LOG(\"Enter\\n\");\n\n\n\tmutex_lock(&mhi_uci_drv.lock);\n\tmutex_lock(&uci_dev->mutex);\n\n\t/* disable the node */\n\tspin_lock_irq(&uci_dev->dl_chan.lock);\n\tspin_lock_irq(&uci_dev->ul_chan.lock);\n\tuci_dev->enabled = false;\n\tspin_unlock_irq(&uci_dev->ul_chan.lock);\n\tspin_unlock_irq(&uci_dev->dl_chan.lock);\n\twake_up(&uci_dev->dl_chan.wq);\n\twake_up(&uci_dev->ul_chan.wq);\n\n\t/* delete the node to prevent new opens */\n\tdevice_destroy(mhi_uci_drv.class, uci_dev->devt);\n\tuci_dev->dev = NULL;\n\tlist_del(&uci_dev->node);\n\n#ifdef QUEC_MHI_UCI_ALWAYS_OPEN\n\tif (uci_dev->ref_count > 0)\n\t\tuci_dev->ref_count--;\n#endif\n\n\t/* safe to free memory only if all file nodes are closed */\n\tif (!uci_dev->ref_count) {\n\t\tmutex_unlock(&uci_dev->mutex);\n\t\tmutex_destroy(&uci_dev->mutex);\n\t\tclear_bit(MINOR(uci_dev->devt), uci_minors);\n\t\tkfree(uci_dev);\n\t\tmutex_unlock(&mhi_uci_drv.lock);\n\t\treturn;\n\t}\n\n\tMSG_LOG(\"Exit\\n\");\n\tmutex_unlock(&uci_dev->mutex);\n\tmutex_unlock(&mhi_uci_drv.lock);\n\n}\n\nstatic int mhi_uci_probe(struct mhi_device *mhi_dev,\n\t\t\t const struct mhi_device_id *id)\n{\n\tstruct uci_dev *uci_dev;\n\tint minor;\n\tchar node_name[32];\n\tint dir;\n\n\tuci_dev = kzalloc(sizeof(*uci_dev), GFP_KERNEL);\n\tif (!uci_dev)\n\t\treturn -ENOMEM;\n\n\tmutex_init(&uci_dev->mutex);\n\tmutex_init(&uci_dev->r_mutex);\n\tmutex_init(&uci_dev->w_mutex);\n\tuci_dev->mhi_dev = mhi_dev;\n\n\tminor = find_first_zero_bit(uci_minors, MAX_UCI_DEVICES);\n\tif (minor >= MAX_UCI_DEVICES) {\n\t\tkfree(uci_dev);\n\t\treturn -ENOSPC;\n\t}\n\n\tmutex_lock(&uci_dev->mutex);\n\tmutex_lock(&mhi_uci_drv.lock);\n\n\tuci_dev->devt = MKDEV(mhi_uci_drv.major, minor);\n#if 1\n\tif (mhi_dev->mhi_cntrl->cntrl_idx)\n\t\tuci_dev->dev = device_create(mhi_uci_drv.class, &mhi_dev->dev,\n\t\t\t\t\t     uci_dev->devt, uci_dev,\n\t\t\t\t\t     DEVICE_NAME \"_%s%d\",\n\t\t\t\t\t     mhi_dev->chan_name, mhi_dev->mhi_cntrl->cntrl_idx);\n\telse\n\t\tuci_dev->dev = device_create(mhi_uci_drv.class, &mhi_dev->dev,\n\t\t\t\t\t     uci_dev->devt, uci_dev,\n\t\t\t\t\t     DEVICE_NAME \"_%s\",\n\t\t\t\t\t     mhi_dev->chan_name);\n#else\n\tuci_dev->dev = device_create(mhi_uci_drv.class, &mhi_dev->dev,\n\t\t\t\t     uci_dev->devt, uci_dev,\n\t\t\t\t     DEVICE_NAME \"_%04x_%02u.%02u.%02u%s%d\",\n\t\t\t\t     mhi_dev->dev_id, mhi_dev->domain,\n\t\t\t\t     mhi_dev->bus, mhi_dev->slot, \"_pipe_\",\n\t\t\t\t     mhi_dev->ul_chan_id);\n#endif\n\n\tset_bit(minor, uci_minors);\n\n\t/* create debugging buffer */\n\tsnprintf(node_name, sizeof(node_name), \"mhi_uci_%04x_%02u.%02u.%02u_%d\",\n\t\t mhi_dev->dev_id, mhi_dev->domain, mhi_dev->bus, mhi_dev->slot,\n\t\t mhi_dev->ul_chan_id);\n\n\tfor (dir = 0; dir < 2; dir++) {\n\t\tstruct uci_chan *uci_chan = (dir) ?\n\t\t\t&uci_dev->ul_chan : &uci_dev->dl_chan;\n\t\tspin_lock_init(&uci_chan->lock);\n\t\tinit_waitqueue_head(&uci_chan->wq);\n\t\tINIT_LIST_HEAD(&uci_chan->pending);\n\t}\n\n\tuci_dev->termios = tty_std_termios;\n\n\tuci_dev->mtu = min_t(size_t, id->driver_data, mhi_dev->mtu);\n\tmhi_device_set_devdata(mhi_dev, uci_dev);\n\tuci_dev->enabled = true;\n\n\tlist_add(&uci_dev->node, &mhi_uci_drv.head);\n\tmutex_unlock(&mhi_uci_drv.lock);\n\tmutex_unlock(&uci_dev->mutex);\n\n\tMSG_LOG(\"channel:%s successfully probed\\n\", mhi_dev->chan_name);\n\n\treturn 0;\n};\n\nstatic void mhi_ul_xfer_cb(struct mhi_device *mhi_dev,\n\t\t\t   struct mhi_result *mhi_result)\n{\n\tstruct uci_dev *uci_dev = mhi_device_get_devdata(mhi_dev);\n\tstruct uci_chan *uci_chan = &uci_dev->ul_chan;\n\n\tMSG_VERB(\"status:%d xfer_len:%zu\\n\", mhi_result->transaction_status,\n\t\t mhi_result->bytes_xferd);\n\n\tkfree(mhi_result->buf_addr);\n\tif (!mhi_result->transaction_status)\n\t\twake_up(&uci_chan->wq);\n}\n\nstatic void mhi_dl_xfer_cb(struct mhi_device *mhi_dev,\n\t\t\t   struct mhi_result *mhi_result)\n{\n\tstruct uci_dev *uci_dev = mhi_device_get_devdata(mhi_dev);\n\tstruct uci_chan *uci_chan = &uci_dev->dl_chan;\n\tunsigned long flags;\n\tstruct uci_buf *buf;\n\tunsigned nr_trb = uci_dev->nr_trb;\n\n\tbuf = &uci_dev->uci_buf[nr_trb];\n\tif (buf == NULL) {\n\t\tMSG_ERR(\"buf = NULL\");\n\t\treturn;\n\t}\n\tif (buf->nr_trb != nr_trb || buf->data != mhi_result->buf_addr)\n\t{\n\t\tuci_dev->rx_error++;\n\t\tMSG_ERR(\"chan[%d]: uci_buf[%u] = %p , mhi_result[%u] = %p\\n\",\n\t\t\tmhi_dev->dl_chan_id, buf->nr_trb, buf->data, nr_trb, mhi_result->buf_addr);\n\t\treturn;\n\t}\n\n\tuci_dev->nr_trb++;\n\tif (uci_dev->nr_trb == uci_dev->nr_trbs)\n\t\tuci_dev->nr_trb = 0;\n\n\tif (mhi_result->transaction_status == -ENOTCONN) {\n\t\treturn;\n\t}\n\n\tif (mhi_result->bytes_xferd > uci_dev->mtu || mhi_result->bytes_xferd <= 0)\n\t{\n\t\tMSG_ERR(\"chan[%d]: bytes_xferd = %zd , mtu = %zd\\n\",\n\t\t\tmhi_dev->dl_chan_id, mhi_result->bytes_xferd, uci_dev->mtu);\n\t\treturn;\n\t}\n\tif (mhi_result->bytes_xferd > uci_dev->bytes_xferd)\n\t{\n\t\tuci_dev->bytes_xferd = mhi_result->bytes_xferd;\n\t\t//MSG_ERR(\"chan[%d]: bytes_xferd = %zd , mtu = %zd\\n\",\n\t\t//\tmhi_dev->dl_chan_id, mhi_result->bytes_xferd, uci_dev->mtu);\n\t}\n\n\tMSG_VERB(\"status:%d receive_len:%zu\\n\", mhi_result->transaction_status,\n\t\t mhi_result->bytes_xferd);\n\n\tspin_lock_irqsave(&uci_chan->lock, flags);\n#if 0\n\tbuf = mhi_result->buf_addr + uci_dev->mtu;\n\tbuf->data = mhi_result->buf_addr;\n#endif\n\tbuf->len = mhi_result->bytes_xferd;\n\tif (mhi_dev->dl_chan_id ==  MHI_CLIENT_DUN_IN\n\t\t|| mhi_dev->dl_chan_id == MHI_CLIENT_QMI_IN\n\t\t|| mhi_dev->dl_chan_id ==  MHI_CLIENT_MBIM_IN) \n\t{\n\t\tstruct uci_buf *tmp_buf = NULL;\n\t\tint skip_buf = 0;\n\n#ifdef QUEC_MHI_UCI_ALWAYS_OPEN\n\t\tif (uci_dev->ref_count == 1)\n\t\t\tskip_buf++;\n#endif\n\t\tif (!skip_buf)\n\t\t\ttmp_buf = (struct uci_buf *)kmalloc(buf->len + sizeof(struct uci_buf), GFP_ATOMIC);;\n\t\t\n\t\tif (tmp_buf) {\n\t\t\ttmp_buf->page = NULL;\n\t\t\ttmp_buf->data = ((void *)tmp_buf) + sizeof(struct uci_buf);\n\t\t\ttmp_buf->len = buf->len;\n\t\t\tmemcpy(tmp_buf->data, buf->data, buf->len);\n\t\t}\n\n\t\tif (buf) {\n\t\t\tstruct uci_buf *uci_buf = buf;\n\t\t\tunsigned nr_trb = uci_buf->nr_trb ? (uci_buf->nr_trb - 1) : (uci_dev->nr_trbs - 1);\n\n\t\t\tuci_buf = &uci_dev->uci_buf[nr_trb];\n\t\t\tmhi_queue_transfer(mhi_dev, DMA_FROM_DEVICE, uci_buf->data, uci_dev->mtu, MHI_EOT);\n\t\t}\n\n\t\tbuf = tmp_buf;\n\t}\n\n\tif (buf)\n\t\tlist_add_tail(&buf->node, &uci_chan->pending);\n\tspin_unlock_irqrestore(&uci_chan->lock, flags);\n\n#ifdef CONFIG_PM_SLEEP\n\tif (mhi_dev->dev.power.wakeup)\n\t\t__pm_wakeup_event(mhi_dev->dev.power.wakeup, 0);\n#endif\n\n\twake_up(&uci_chan->wq);\n}\n\n// repaire sdx6x module can not read qdb file. xingduo.du 2023-01-18\n#define DIAG_MAX_PCIE_PKT_SZ\t8192 //define by module\n\n/* .driver_data stores max mtu */\nstatic const struct mhi_device_id mhi_uci_match_table[] = {\n\t{ .chan = \"LOOPBACK\", .driver_data = 0x1000 },\n\t{ .chan = \"SAHARA\", .driver_data = 0x4000 },\n\t{ .chan = \"EDL\", .driver_data = 0x4000 },\n\t{ .chan = \"DIAG\", .driver_data = DIAG_MAX_PCIE_PKT_SZ },\n\t{ .chan = \"MBIM\", .driver_data = 0x1000 },\n\t{ .chan = \"QMI0\", .driver_data = 0x1000 },\n\t{ .chan = \"QMI1\", .driver_data = 0x1000 },\n\t{ .chan = \"DUN\", .driver_data = 0x1000 },\n#ifdef ENABLE_ADPL\n\t{ .chan = \"ADPL\", .driver_data = 0x1000 },\n#endif\n#ifdef ENABLE_QDSS\n\t{ .chan = \"QDSS\", .driver_data = 0x1000 },\n#endif\n\t{},\n};\n\nstatic struct mhi_driver mhi_uci_driver = {\n\t.id_table = mhi_uci_match_table,\n\t.remove = mhi_uci_remove,\n\t.probe = mhi_uci_probe,\n\t.ul_xfer_cb = mhi_ul_xfer_cb,\n\t.dl_xfer_cb = mhi_dl_xfer_cb,\n\t.driver = {\n\t\t.name = MHI_UCI_DRIVER_NAME,\n\t\t.owner = THIS_MODULE,\n\t},\n};\n\nint mhi_device_uci_init(void)\n{\n\tint ret;\n\n\tret = register_chrdev(0, MHI_UCI_DRIVER_NAME, &mhidev_fops);\n\tif (ret < 0)\n\t\treturn ret;\n\n\tmhi_uci_drv.major = ret;\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION(6, 4, 0))\n\tmhi_uci_drv.class = class_create(MHI_UCI_DRIVER_NAME);\n#else\n\tmhi_uci_drv.class = class_create(THIS_MODULE, MHI_UCI_DRIVER_NAME);\n#endif\n\tif (IS_ERR(mhi_uci_drv.class)) {\n\t\tunregister_chrdev(mhi_uci_drv.major, MHI_UCI_DRIVER_NAME);\n\t\treturn -ENODEV;\n       }\n\n\tmutex_init(&mhi_uci_drv.lock);\n\tINIT_LIST_HEAD(&mhi_uci_drv.head);\n\n\tret = mhi_driver_register(&mhi_uci_driver);\n\tif (ret) {\n\t\tclass_destroy(mhi_uci_drv.class);\n\t\tunregister_chrdev(mhi_uci_drv.major, MHI_UCI_DRIVER_NAME);\n\t}\n\n\treturn ret;\n}\n\nvoid mhi_device_uci_exit(void)\n{\n\tmhi_driver_unregister(&mhi_uci_driver);\n\tclass_destroy(mhi_uci_drv.class);\n\tunregister_chrdev(mhi_uci_drv.major, MHI_UCI_DRIVER_NAME);\n}\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/log/AT_OVER_PCIE.txt",
    "content": "root@imx6qsabresd:~# busybox microcom /dev/mhi_DUN \r\n[  384.652992] [I][mhi_uci_open] Node open, ref counts 1\r\n[  384.658144] [I][mhi_uci_open] Starting channel\r\n[  384.662612] [I][__mhi_prepare_channel] Entered: preparing channel:32\r\n[  384.680397] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1\r\n[  384.685890] [I][__mhi_prepare_channel] Chan:32 successfully moved to start state\r\n[  384.693312] [I][__mhi_prepare_channel] Entered: preparing channel:33\r\n[  384.708692] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1\r\n[  384.714324] [I][__mhi_prepare_channel] Chan:33 successfully moved to start state\r\n\r\nRDY\r\n\r\n+CFUN: 1\r\n\r\n+CPIN: READY\r\n\r\n+QUSIM: 1\r\n\r\n+QIND: SMS DONE\r\n\r\n+QIND: PB DONE\r\nati\r\nQuectel\r\nEM20\r\nRevision: EM20GR01A01M4G\r\n\r\nOK\r\nat+cpin?\r\n+CPIN: READY\r\n\r\nOK\r\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/log/MBIM_OVER_PCIE.txt",
    "content": "root@OpenWrt:~# insmod pcie_mhi.ko mhi_mbim_enabled=1\r\nroot@OpenWrt:~# dmesg | grep mhi\r\n[   65.587160] mhi_init Quectel_Linux_PCIE_MHI_Driver_V1.3.0.6\r\n[   65.597089] mhi_pci_probe pci_dev->name = 0000:01:00.0, domain=0, bus=1, slot=0, vendor=17CB, device=0306\r\n[   65.602250] mhi_q 0000:01:00.0: BAR 0: assigned [mem 0x20300000-0x20300fff 64bit]\r\n[   65.611690] mhi_q 0000:01:00.0: enabling device (0140 -> 0142)\r\n[   65.619307] [I][mhi_init_pci_dev] msi_required = 5, msi_allocated = 5, msi_irq = 63\r\n[   65.619327] [I][mhi_power_up] dev_state:RESET\r\n[   65.619331] [I][mhi_async_power_up] Requested to power on\r\n[   65.619449] [I][mhi_alloc_coherent] size = 114688, dma_handle = 6fca0000\r\n[   65.619462] [I][mhi_init_dev_ctxt] mhi_ctxt->ctrl_seg = c221e000\r\n[   65.619731] [I][mhi_async_power_up] dev_state:RESET ee:AMSS\r\n[   65.619747] [I][mhi_pm_st_worker] Transition to state:READY\r\n[   65.619760] [I][mhi_pm_st_worker] INVALID_EE -> AMSS\r\n[   65.619764] [I][mhi_ready_state_transition] Waiting to enter READY state\r\n[   65.619885] [I][mhi_async_power_up] Power on setup success\r\n[   65.619897] [I][mhi_pci_probe] Return successful\r\n[   65.665114] [I][mhi_ready_state_transition] Device in READY State\r\n[   65.665125] [I][mhi_intvec_threaded_handlr] device ee:AMSS dev_state:READY, pm_state:POR\r\n[   65.665131] [I][mhi_intvec_threaded_handlr] device ee:AMSS dev_state:READY, INVALID_EE\r\n[   65.665133] [I][mhi_tryset_pm_state] Transition to pm state from:POR to:POR\r\n[   65.665137] [I][mhi_init_mmio] Initializing MMIO\r\n[   65.665142] [I][mhi_init_mmio] CHDBOFF:0x300\r\n[   65.665151] [I][mhi_init_mmio] ERDBOFF:0x700\r\n[   65.665156] [I][mhi_init_mmio] Programming all MMIO values.\r\n[   65.786283] [I][mhi_dump_tre] carl_ev evt_state_change mhistate=2\r\n[   65.786289] [I][mhi_process_ctrl_ev_ring] MHI state change event to state:M0\r\n[   65.786295] [I][mhi_pm_m0_transition] Entered With State:READY PM_STATE:POR\r\n[   65.786300] [I][mhi_tryset_pm_state] Transition to pm state from:POR to:M0\r\n[   65.789734] [I][mhi_dump_tre] carl_ev evt_ee_state execenv=2\r\n[   65.789739] [I][mhi_process_ctrl_ev_ring] MHI EE received event:AMSS\r\n[   65.789756] [I][mhi_pm_st_worker] Transition to state:MISSION MODE\r\n[   65.789767] [I][mhi_pm_st_worker] INVALID_EE -> AMSS\r\n[   65.789771] [I][mhi_pm_mission_mode_transition] Processing Mission Mode Transition\r\n[   65.789787] [I][mhi_init_timesync] No timesync capability found\r\n[   65.789791] [I][mhi_pm_mission_mode_transition] Adding new devices\r\n[   65.790570] [I][mhi_dtr_probe] Enter for DTR control channel\r\n[   65.790577] [I][__mhi_prepare_channel] Entered: preparing channel:18\r\n[   65.797036] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1\r\n[   65.797051] [I][__mhi_prepare_channel] Chan:18 successfully moved to start state\r\n[   65.797055] [I][__mhi_prepare_channel] Entered: preparing channel:19\r\n[   65.802457] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1\r\n[   65.802469] [I][__mhi_prepare_channel] Chan:19 successfully moved to start state\r\n[   65.802485] [I][mhi_dtr_probe] Exit with ret:0\r\n[   65.802748] [I][mhi_netdev_enable_iface] Prepare the channels for transfer\r\n[   65.802772] [I][__mhi_prepare_channel] Entered: preparing channel:100\r\n[   65.825279] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1\r\n[   65.825293] [I][__mhi_prepare_channel] Chan:100 successfully moved to start state\r\n[   65.825297] [I][__mhi_prepare_channel] Entered: preparing channel:101\r\n[   65.835565] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1\r\n[   65.835578] [I][__mhi_prepare_channel] Chan:101 successfully moved to start state\r\n[   65.839141] [I][mhi_netdev_enable_iface] Exited.\r\n[   65.839875] rmnet_vnd_register_device(rmnet_mhi0.1)=0\r\n[   65.843278] net rmnet_mhi0 rmnet_mhi0.1: NSS context created\r\n[   65.861808] [I][mhi_pm_mission_mode_transition] Exit with ret:0\r\n[   68.625595] [I][__mhi_prepare_channel] Entered: preparing channel:12\r\n[   68.634610] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1\r\n[   68.634622] [I][__mhi_prepare_channel] Chan:12 successfully moved to start state\r\n[   68.634625] [I][__mhi_prepare_channel] Entered: preparing channel:13\r\n[   68.644978] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1\r\n[   68.644987] [I][__mhi_prepare_channel] Chan:13 successfully moved to start state\r\n[   69.170666] net rmnet_mhi0: link_state 0x0 -> 0x1\r\n[   69.177035] [I][mhi_netdev_open] Opened net dev interface\r\n[   71.655431] [I][mhi_netdev_open] Opened net dev interface\r\n\r\nroot@OpenWrt:~# ./quectel-CM &\r\n[04-02_04:14:12:134] Quectel_QConnectManager_Linux_V1.6.0.5\r\n[04-02_04:14:12:134] Find /sys/bus/usb/devices/4-1 idVendor=0x2c7c idProduct=0x800, bus=0x004, dev=0x002\r\n[04-02_04:14:12:135] network interface '' or qmidev '' is not exist\r\n[04-02_04:14:12:135] netcard driver = pcie_mhi, driver version = V1.3.0.6\r\n[04-02_04:14:12:135] Modem works in MBIM mode\r\n[04-02_04:14:12:135] apn (null), user (null), passwd (null), auth 0\r\n[04-02_04:14:12:135] IP Proto MBIMContextIPTypeIPv4\r\n[04-02_04:14:12:154] mbim_read_thread is created\r\nsh: can't create /sys/class/net/rmnet_mhi0/mbim/link_state: nonexistent directory\r\n[04-02_04:14:12:156] system(echo 0 > /sys/class/net/rmnet_mhi0/mbim/link_state)=256\r\n[04-02_04:14:12:185] system(ip address flush dev rmnet_mhi0)=0\r\n[04-02_04:14:12:187] system(ip link set dev rmnet_mhi0 down)=0\r\n[04-02_04:14:12:188] mbim_open_device()\r\n[04-02_04:14:12:605] mbim_device_caps_query()\r\n[04-02_04:14:12:610] DeviceId:     869710030002905\r\n[04-02_04:14:12:610] HardwareInfo: 0\r\n[04-02_04:14:12:610] mbim_set_radio_state( 1 )\r\n[04-02_04:14:12:613] HwRadioState: 1, SwRadioState: 1\r\n[04-02_04:14:12:613] mbim_subscriber_status_query()\r\n[04-02_04:14:12:620] SubscriberReadyState NotInitialized -> Initialized \r\n[04-02_04:14:12:620] mbim_register_state_query()\r\n[04-02_04:14:12:625] RegisterState Unknown -> Home \r\n[04-02_04:14:12:625] mbim_packet_service_query()\r\n[04-02_04:14:12:629] PacketServiceState Unknown -> Attached \r\n[04-02_04:14:12:629] mbim_query_connect(sessionID=0)\r\n[04-02_04:14:12:633] ActivationState Unknown -> Deactivated \r\n[04-02_04:14:12:633] mbim_set_connect(onoff=1, sessionID=0)\r\n[   69.170666] net rmnet_mhi0: link_state 0x0 -> 0x1\r\n[04-02_04:14:12:680] ActivationState Deactivated -> Activated \r\n[   69.177035] [I][mhi_netdev_open] Opened net dev interface\r\n[04-02_04:14:12:680] mbim_ip_config(sessionID=0)\r\n[04-02_04:14:12:683] < SessionId = 0\r\n[04-02_04:14:12:683] < IPv4ConfigurationAvailable = 0xf\r\n[04-02_04:14:12:683] < IPv6ConfigurationAvailable = 0x0\r\n[04-02_04:14:12:683] < IPv4AddressCount = 0x1\r\n[04-02_04:14:12:683] < IPv4AddressOffset = 0x3c\r\n[04-02_04:14:12:683] < IPv6AddressCount = 0x0\r\n[04-02_04:14:12:683] < IPv6AddressOffset = 0x0\r\n[04-02_04:14:12:683] < IPv4 = 10.129.59.93/30\r\n[04-02_04:14:12:683] < gw = 10.129.59.94\r\n[04-02_04:14:12:683] < dns1 = 211.138.180.2\r\n[04-02_04:14:12:683] < dns2 = 211.138.180.3\r\n[04-02_04:14:12:683] < ipv4 mtu = 1500\r\nsh: can't create /sys/class/net/rmnet_mhi0/mbim/link_state: nonexistent directory\r\n[04-02_04:14:12:684] system(echo 1 > /sys/class/net/rmnet_mhi0/mbim/link_state)=256\r\n[04-02_04:14:12:689] system(ip link set dev rmnet_mhi0 up)=0\r\n[04-02_04:14:12:692] system(ip -4 address flush dev rmnet_mhi0)=0\r\n[04-02_04:14:12:694] system(ip -4 address add 10.129.59.93/30 dev rmnet_mhi0)=0\r\n[04-02_04:14:12:697] system(ip -4 route add default via 10.129.59.94 dev rmnet_mhi0)=0\r\n[04-02_04:14:12:699] system(ip -4 link set dev rmnet_mhi0 mtu 1500)=0\r\n\r\nroot@OpenWrt:~# ifconfig rmnet_mhi0\r\nrmnet_mhi0 Link encap:UNSPEC  HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  \r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:99379 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:176569 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:1528181052 (1.4 GiB)  TX bytes:62467192 (59.5 MiB)\r\n\r\nroot@OpenWrt:~# ifconfig rmnet_mhi0.1\r\nrmnet_mhi0.1 Link encap:UNSPEC  HWaddr 02-50-F4-00-00-00-00-00-00-00-00-00-00-00-00-00  \r\n          inet addr:10.129.59.93  Mask:255.255.255.252\r\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:1089360 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:176581 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:1521449058 (1.4 GiB)  TX bytes:57525792 (54.8 MiB)\r\n\r\n# adjust CPU load balancing\r\nroot@OpenWrt:~# echo 2 > /sys/class/net/rmnet_mhi0/queues/rx-0/rps_cpus \r\nroot@OpenWrt:~# echo 4 > /sys/class/net/rmnet_mhi0.1/queues/rx-0/rps_cpus \r\nroot@OpenWrt:~# echo 2000 > /proc/sys/net/core/netdev_max_backlog \r\nroot@OpenWrt:~# cat /sys/class/net/rmnet_mhi0/queues/rx-0/rps_cpus\r\n2\r\nroot@OpenWrt:~# cat /sys/class/net/rmnet_mhi0.1/queues/rx-0/rps_cpus\r\n4\r\nroot@OpenWrt:~# cat /proc/sys/net/core/netdev_max_backlog\r\n2000\r\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/log/QMI_OVER_PCIE.txt",
    "content": "disable ccflags-y += -DCONFIG_MHI_NETDEV_MBIM in pcie_mhi/Makefile\r\n\r\nroot@OpenWrt:~# insmod pcie_mhi.ko \r\n\r\nroot@OpenWrt:~# dmesg | grep mhi\r\n[  138.483252] mhi_init Quectel_Linux_PCIE_MHI_Driver_V1.3.0.6\r\n[  138.492350] mhi_pci_probe pci_dev->name = 0000:01:00.0, domain=0, bus=1, slot=0, vendor=17CB, device=0306\r\n[  138.497564] mhi_q 0000:01:00.0: BAR 0: assigned [mem 0x20300000-0x20300fff 64bit]\r\n[  138.506952] mhi_q 0000:01:00.0: enabling device (0140 -> 0142)\r\n[  138.514562] [I][mhi_init_pci_dev] msi_required = 5, msi_allocated = 5, msi_irq = 63\r\n[  138.514581] [I][mhi_power_up] dev_state:RESET\r\n[  138.514587] [I][mhi_async_power_up] Requested to power on\r\n[  138.514728] [I][mhi_alloc_coherent] size = 114688, dma_handle = 72160000\r\n[  138.514734] [I][mhi_init_dev_ctxt] mhi_ctxt->ctrl_seg = c221f000\r\n[  138.515030] [I][mhi_async_power_up] dev_state:RESET ee:AMSS\r\n[  138.515056] [I][mhi_pm_st_worker] Transition to state:READY\r\n[  138.515067] [I][mhi_pm_st_worker] INVALID_EE -> AMSS\r\n[  138.515073] [I][mhi_ready_state_transition] Waiting to enter READY state\r\n[  138.515210] [I][mhi_async_power_up] Power on setup success\r\n[  138.515227] [I][mhi_pci_probe] Return successful\r\n[  138.589013] [I][mhi_ready_state_transition] Device in READY State\r\n[  138.589029] [I][mhi_intvec_threaded_handlr] device ee:AMSS dev_state:READY, pm_state:POR\r\n[  138.589038] [I][mhi_intvec_threaded_handlr] device ee:AMSS dev_state:READY, INVALID_EE\r\n[  138.589041] [I][mhi_tryset_pm_state] Transition to pm state from:POR to:POR\r\n[  138.589046] [I][mhi_init_mmio] Initializing MMIO\r\n[  138.589050] [I][mhi_init_mmio] CHDBOFF:0x300\r\n[  138.589060] [I][mhi_init_mmio] ERDBOFF:0x700\r\n[  138.589065] [I][mhi_init_mmio] Programming all MMIO values.\r\n[  138.706124] [I][mhi_dump_tre] carl_ev evt_state_change mhistate=2\r\n[  138.706132] [I][mhi_process_ctrl_ev_ring] MHI state change event to state:M0\r\n[  138.706140] [I][mhi_pm_m0_transition] Entered With State:READY PM_STATE:POR\r\n[  138.706146] [I][mhi_tryset_pm_state] Transition to pm state from:POR to:M0\r\n[  138.708699] [I][mhi_dump_tre] carl_ev evt_ee_state execenv=2\r\n[  138.708706] [I][mhi_process_ctrl_ev_ring] MHI EE received event:AMSS\r\n[  138.708726] [I][mhi_pm_st_worker] Transition to state:MISSION MODE\r\n[  138.708736] [I][mhi_pm_st_worker] INVALID_EE -> AMSS\r\n[  138.708742] [I][mhi_pm_mission_mode_transition] Processing Mission Mode Transition\r\n[  138.708758] [I][mhi_init_timesync] No timesync capability found\r\n[  138.708764] [I][mhi_pm_mission_mode_transition] Adding new devices\r\n[  138.709785] [I][mhi_dtr_probe] Enter for DTR control channel\r\n[  138.709794] [I][__mhi_prepare_channel] Entered: preparing channel:18\r\n[  138.715378] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1\r\n[  138.715397] [I][__mhi_prepare_channel] Chan:18 successfully moved to start state\r\n[  138.715403] [I][__mhi_prepare_channel] Entered: preparing channel:19\r\n[  138.720201] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1\r\n[  138.720218] [I][__mhi_prepare_channel] Chan:19 successfully moved to start state\r\n[  138.720236] [I][mhi_dtr_probe] Exit with ret:0\r\n[  138.720590] [I][mhi_netdev_enable_iface] Prepare the channels for transfer\r\n[  138.720630] [I][__mhi_prepare_channel] Entered: preparing channel:100\r\n[  138.757230] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1\r\n[  138.757253] [I][__mhi_prepare_channel] Chan:100 successfully moved to start state\r\n[  138.757259] [I][__mhi_prepare_channel] Entered: preparing channel:101\r\n[  138.774352] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1\r\n[  138.774370] [I][__mhi_prepare_channel] Chan:101 successfully moved to start state\r\n[  138.778137] [I][mhi_netdev_enable_iface] Exited.\r\n[  138.779018] rmnet_vnd_register_device(rmnet_mhi0.1)=0\r\n[  138.782283] net rmnet_mhi0 rmnet_mhi0.1: NSS context created\r\n[  138.800865] [I][mhi_pm_mission_mode_transition] Exit with ret:0\r\n\r\nroot@OpenWrt:~# ./quectel-CM &\r\nroot@OpenWrt:~# [04-02_04:12:16:477] Quectel_QConnectManager_Linux_V1.6.0.5\r\n[04-02_04:12:16:477] Find /sys/bus/usb/devices/4-1 idVendor=0x2c7c idProduct=0x800, bus=0x004, dev=0x002\r\n[04-02_04:12:16:478] network interface '' or qmidev '' is not exist\r\n[04-02_04:12:16:478] netcard driver = pcie_mhi, driver version = V1.3.0.6\r\n[04-02_04:12:16:479] qmap_mode = 1, qmap_version = 9, qmap_size = 16384, muxid = 0x81, qmap_netcard = rmnet_mhi0.1\r\n[04-02_04:12:16:479] Modem works in QMI mode\r\n[04-02_04:12:16:505] cdc_wdm_fd = 7\r\n[04-02_04:12:17:506] QmiThreadSendQMITimeout pthread_cond_timeout_np timeout\r\n[04-02_04:12:18:516] Get clientWDS = 19\r\n[04-02_04:12:18:520] Get clientDMS = 1\r\n[04-02_04:12:18:524] Get clientNAS = 3\r\n[04-02_04:12:18:527] Get clientUIM = 1\r\n[04-02_04:12:18:531] Get clientWDA = 1\r\n[04-02_04:12:18:535] requestBaseBandVersion RM500QGLAAR03A01M4G_BETA_20200107F  1  [Dec 30 2019 17:00:00]\r\n[04-02_04:12:18:539] qmap_settings.rx_urb_size = 16384\r\n[04-02_04:12:18:539] qmap_settings.ul_data_aggregation_max_datagrams  = 16\r\n[04-02_04:12:18:539] qmap_settings.ul_data_aggregation_max_size       = 8192\r\n[04-02_04:12:18:539] qmap_settings.dl_minimum_padding                 = 0\r\n[04-02_04:12:18:550] requestSetLoopBackState(loopback_state=1, replication_factor=14)\r\n[04-02_04:12:18:557] requestGetSIMStatus SIMStatus: SIM_ABSENT\r\n[04-02_04:12:18:560] requestGetProfile[1] ///0\r\n[04-02_04:12:18:563] requestRegistrationState2 MCC: 0, MNC: 0, PS: Detached, DataCap: UNKNOW\r\n[04-02_04:12:18:565] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-02_04:12:18:566] ifconfig rmnet_mhi0.1 down\r\n[04-02_04:12:18:571] ifconfig rmnet_mhi0.1 0.0.0.0\r\nifconfig: SIOCSIFFLAGS: Network is down\r\n[04-02_04:12:18:575] SetLoopBackInd: loopback_state=1, replication_factor=14\r\n[04-02_04:12:18:591] requestSetupDataCall WdsConnectionIPv4Handle: 0xe40182a0\r\n[04-02_04:12:18:601] ifconfig rmnet_mhi0 up\r\n[04-02_04:12:18:607] ifconfig rmnet_mhi0.1 up\r\n[04-02_04:12:18:613] you are use OpenWrt?\r\n[04-02_04:12:18:614] should not calling udhcpc manually?\r\n[04-02_04:12:18:614] should modify /etc/config/network as below?\r\n[04-02_04:12:18:614] config interface wan\r\n[04-02_04:12:18:614] \toption ifname\trmnet_mhi0.1\r\n[04-02_04:12:18:614] \toption proto\tdhcp\r\n[04-02_04:12:18:614] should use \"/sbin/ifstaus wan\" to check rmnet_mhi0.1 's status?\r\n[04-02_04:12:18:614] busybox udhcpc -f -n -q -t 5 -i rmnet_mhi0.1\r\nudhcpc: started, v1.28.3\r\nudhcpc: sending discover\r\nudhcpc: sending select for 192.168.48.171\r\nudhcpc: lease of 192.168.48.171 obtained, lease time 7200\r\n[04-02_04:12:18:809] udhcpc: ifconfig rmnet_mhi0.1 192.168.48.171 netmask 255.255.255.248 broadcast +\r\n[04-02_04:12:18:819] udhcpc: setting default routers: 192.168.48.172\r\n\r\nroot@OpenWrt:~# ifconfig rmnet_mhi0\r\nrmnet_mhi0 Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \r\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:2 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:608 (608.0 B)  TX bytes:672 (672.0 B)\r\n\r\nroot@OpenWrt:~# ifconfig rmnet_mhi0.1\r\nrmnet_mhi0.1 Link encap:UNSPEC  HWaddr 02-50-F4-00-00-00-00-00-00-00-00-00-00-00-00-00  \r\n          inet addr:192.168.48.171  Mask:255.255.255.248\r\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:2 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:592 (592.0 B)  TX bytes:656 (656.0 B)\r\n\r\n# adjust CPU load balancing\r\nroot@OpenWrt:~# echo 2 > /sys/class/net/rmnet_mhi0/queues/rx-0/rps_cpus \r\nroot@OpenWrt:~# echo 4 > /sys/class/net/rmnet_mhi0.1/queues/rx-0/rps_cpus \r\nroot@OpenWrt:~# echo 2000 > /proc/sys/net/core/netdev_max_backlog \r\nroot@OpenWrt:~# cat /sys/class/net/rmnet_mhi0/queues/rx-0/rps_cpus\r\n2\r\nroot@OpenWrt:~# cat /sys/class/net/rmnet_mhi0.1/queues/rx-0/rps_cpus\r\n4\r\nroot@OpenWrt:~# cat /proc/sys/net/core/netdev_max_backlog\r\n2000"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_MHI/src/log/QXDM_OVER_PCIE.txt",
    "content": "root@imx6qsabresd:~# ./QLog -p /dev/mhi_DIAG -s log &\r\nroot@imx6qsabresd:~# [000.000]QLog Version: Quectel_QLog_Linux&Android_V1.2.4\r\n[  298.597963] [I][mhi_uci_open] Node open, ref counts 1\r\n[  298.605601] [I][mhi_uci_open] Starting channel\r\n[  298.612159] [I][__mhi_prepare_channel] Entered: preparing channel:4\r\n[  298.629906] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1\r\n[  298.635415] [I][__mhi_prepare_channel] Chan:4 successfully moved to start state\r\n[  298.642749] [I][__mhi_prepare_channel] Entered: preparing channel:5\r\n[  298.658043] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1\r\n[  298.663543] [I][__mhi_prepare_channel] Chan:5 successfully moved to start state\r\n[000.075]open /dev/mhi_DIAG ttyfd = 3\r\n[000.075]Press CTRL+C to stop catch log.\r\n[000.096]qlog_logfile_create log/20160920_145758_0000.qmdl logfd=4\r\n[005.268]recv: 0M 70K 490B  in 5181 msec\r\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_QMI_WWAN/Makefile",
    "content": "#\n# Copyright (C) 2015 OpenWrt.org\n#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=qmi_wwan_q\nPKG_VERSION:=1.2.9\nPKG_RELEASE:=3\n\ninclude $(INCLUDE_DIR)/kernel.mk\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine KernelPackage/qmi_wwan_q\n  SUBMENU:=WWAN Support\n  TITLE:=Quectel Linux USB QMI WWAN Driver\n  DEPENDS:=+kmod-usb-net +kmod-usb-wdm\n  KCONFIG:= \\\n\tCONFIG_USB_USBNET \\\n\tCONFIG_USB_NET_DRIVERS \\\n\tCONFIG_USB_WDM\n  FILES:=$(PKG_BUILD_DIR)/qmi_wwan_q.ko\n  AUTOLOAD:=$(call AutoLoad,81,qmi_wwan_q)\nendef\n\ndefine KernelPackage/qmi_wwan_q/description\n  Quectel Linux USB QMI WWAN Driver\nendef\n\nEXTRA_CFLAGS+= \\\n\t-Wno-unused-function \\\n\t-Wno-missing-prototypes \\\n\t-Wno-missing-declarations\n\nMAKE_OPTS:= \\\n\tARCH=\"$(LINUX_KARCH)\" \\\n\tCROSS_COMPILE=\"$(TARGET_CROSS)\" \\\n\tCXXFLAGS=\"$(TARGET_CXXFLAGS)\" \\\n\tM=\"$(PKG_BUILD_DIR)\" \\\n\tEXTRA_CFLAGS=\"$(EXTRA_CFLAGS)\" \\\n\t$(EXTRA_KCONFIG)\n\ndefine Build/Prepare\n\tmkdir -p $(PKG_BUILD_DIR)\n\t$(CP) ./src/* $(PKG_BUILD_DIR)/\nendef\n\ndefine Build/Compile\n\t$(MAKE) -C \"$(LINUX_DIR)\" \\\n\t\t$(MAKE_OPTS) \\\n\t\tmodules\nendef\n\n$(eval $(call KernelPackage,qmi_wwan_q))\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_QMI_WWAN/src/Makefile",
    "content": "obj-m += qmi_wwan_q.o\n\nPWD := $(shell pwd)\nOUTPUTDIR=/lib/modules/`uname -r`/kernel/drivers/net/usb/\n\nifeq ($(ARCH),)\nARCH := $(shell uname -m)\nendif\nifeq ($(CROSS_COMPILE),)\nCROSS_COMPILE :=\nendif\nifeq ($(KDIR),)\nKDIR := /lib/modules/$(shell uname -r)/build\nifeq ($(ARCH),i686)\nifeq ($(wildcard $KDIR/arch/$ARCH),)\nARCH=i386\nendif\nendif\nendif\n\nifneq ($(findstring &,${PWD}),)\n$(warning \"${PWD}\")\n$(warning \"current directory contain special char '&' !\")\n$(error \"please remove it!\")\nendif\n\ndefault:\n\t$(MAKE) ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} -C $(KDIR) M=$(PWD) modules\n\ninstall: default\n\tcp $(PWD)/qmi_wwan_q.ko /lib/modules/$(shell uname -r)/kernel/drivers/net/usb/\n\tdepmod\n\nclean:\n\trm -rf *~ .tmp_versions modules.order Module.symvers\n\tfind . -type f -name \"*~\" -o -name \"*.o\" -o -name \"*.ko\" -o -name \"*.cmd\" -o -name \"*.mod.c\" |  xargs rm -rf\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_QMI_WWAN/src/ReleaseNote.txt",
    "content": "Release Notes\n\n[V1.2.2]\nDate:   9/7/2022\nenhancement:\n\t1. Optimization, the network card send queue wakeup is changed from callback to tasklet\n\t2. Add the function of returning LAN packets in bridge mode\n\t3. support ndo ioctl on kernel>5.14\n\t4. Allow setting MTU greater than 1500\nfix:\n\n[V1.2.1]\nDate:   9/26/2021\nenhancement:\n\t1. support IPQ5018's NSS\n\t2. use 'qsdk/qca/src/data-kernel/drivers/rmnet-nss/rmnet_nss.c' instead myself rmnet_nss.c\n\t   and qmi_wwan_q.ko must load after rmnet_nss.ko\nfix:\n\n[V1.2.0.25]\nDate:   9/17/2021\nenhancement:\nfix:\n  1. add sdx6x platfrom support\n\n[V1.2.0.24]\nDate:   9/6/2021\nenhancement:\nfix:\n  1. add BG95 support\n  2. support Linux 5.14.0\n\n[V1.2.0.23]\nDate:   3/23/2021\nenhancement:\nfix:\n  1. add sdx12 platfrom support\n\n[V1.2.0.22]\nDate:   2/5/2021\nenhancement:\nfix:\n  1. fix panic (memory-access-after-free) when do modem reboot stress test\n\n[V1.2.0.21]\nDate:   2/4/2021\nenhancement:\n  1. Code refactoring - QMAP and rmnet\nfix:\n  1. qmap_qmi_wwan_rx_fixup: change skb_dequeue to __skb_dequeue\n \n[V1.2.0.20]\nDate:   11/2/2020\nenhancement:\nfix:\n  1. LTE-A modems can not obtain IP by DHCP\n \n[V1.2.0.19]\nDate:   10/9/2020\nenhancement:\nfix:\n  1. X55 can not access internet after usb resume\n\n[V1.2.0.18]\nDate:   10/9/2020\nenhancement:\nfix:\n  1. X55: rename rmnet_usb0.1 to wwan0_1\n     1.1 if there is '.', openwrt will think it is vlan, and auto create vlan\n     1.2 if there is '.', android will think it is not vaild\n     1.3 if named as rmnet_usb0, and SOC is QCOM, QCOM's netmgr will auto manager it\n\n[V1.2.0.17]\nDate:   9/14/2020\nenhancement:\n  1. Code refactoring - QMAP size and version\nfix:\n\n[V1.2.0.16]\nDate:   9/14/2020\nenhancement:\n  1. rx_fixup() check if this is enough skb_headroom() to fill ethernet header\nfix:\n\t1. fix \"WARNING: suspicious RCU usage\"\n\n[V1.2.0.15]\nDate:   9/10/2020\nenhancement:\nfix:\n\t1. fix compile errors on kernel 3.10~3.13\n\n[V1.2.0.14]\nDate:   7/24/2020\nenhancement:\nfix:\n\t1. fix QMAP V5 bug on Big Endian CPU\n\n[V1.2.0.13]\nDate:   6/22/2020\nenhancement:\nfix:\n\t1. fix no data traffic when do Upload TPUT test\n\n[V1.2.0.12]\nDate:   5/29/2020\nenhancement:\nfix:\n\t1. IPQ8074: when enable hyfi, quectel-CM will crash system crash\n\n[V1.2.0.9]\nDate:   5/13/2020\nenhancement:\nfix:\n  1. IPQ8074: enable CONFIG_QCA_NSS_DRV by CONFIG_PINCTRL_IPQ807x (from CONFIG_ARCH_IPQ807x)\n\n[V1.2.0.8]\nDate:   5/9/2020\nenhancement:\nfix:\n  1. fix compile errors on kernel V3.10\n\n[V1.2.0.7]\nDate:   4/25/2020\nenhancement:\n  1. X55 support bridge mode\nfix:\n\n[V1.2.0.6]\nDate:   4/20/2020\nenhancement:\n  1. add stat64, or the rx/tx statics will become to 0 when data > 4G\n  2. do not use skb_clone, will make QCOM's NSS and SFE 's cpu loading very high\nfix:\n\n[V1.2.0.5]\nDate:   4/8/2020\nenhancement:\n  1. add attrite link_state, change carrier state accoring link_state\n     quectel-CM will set link_state to 1 when QMI setup call success.\nfix:\n\n[V1.2.0.4]\nDate:   4/8/2020\nenhancement:\n  1. support X55's QMAP V5\nfix:\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_QMI_WWAN/src/qmi_wwan_q.c",
    "content": "/*\n    Copyright (c) Bjørn Mork of author <bjorn@mork.no>\n\n    This program is free software; you can redistribute it and/ormodify it under the terms of the GNU General\n    Public licenseas published byFree Software Foundation; either version 2theof the License,(at your option)\n    any later version.O1\n    This program isdistributed in the hope that it will be useful,but WITHOUT ANY WARRANTY; without even the\n    implied warranty ofOr FITNESS FOR A PARTICULAR PURPOSE.MERCHANTABILITYSee theGNU General Public License\n    for more details.\n    You should have received a copy of the GNU General Public licensealong withthis program; if not, write to\n    the Free SoftwareFoundation, Inc.r51 Franklin Street, Fifth Floor，Boston，MA 02110-1301，USA.\n\n    Based on version modification, the author is Quectel <fae-support@quectel.com>\n */\n\n#include <linux/module.h>\n#include <linux/version.h>\n#include <linux/interrupt.h>\n#include <linux/netdevice.h>\n#include <linux/ethtool.h>\n#include <linux/etherdevice.h>\n#include <linux/time.h>\n#if LINUX_VERSION_CODE > KERNEL_VERSION(3,16,0) //8b094cd03b4a3793220d8d8d86a173bfea8c285b\n#include <linux/timekeeping.h>\n#else\n#define timespec64  timespec\n#define ktime_get_ts64 ktime_get_ts\n#define timespec64_sub timespec_sub\n#endif\n#include <net/arp.h>\n#include <net/ip.h>\n#include <net/ipv6.h>\n#include <linux/mii.h>\n#include <linux/usb.h>\n#include <linux/usb/cdc.h>\n#include <linux/usb/usbnet.h>\n#include <linux/usb/cdc-wdm.h>\n\n#ifndef ETH_P_MAP\n#define ETH_P_MAP 0xDA1A\n#endif\n\n#if (ETH_P_MAP == 0x00F9)\n#undef ETH_P_MAP\n#define ETH_P_MAP 0xDA1A\n#endif\n\n#ifndef ARPHRD_RAWIP\n#define ARPHRD_RAWIP ARPHRD_NONE\n#endif\n\n#ifdef CONFIG_PINCTRL_IPQ807x\n#define CONFIG_QCA_NSS_DRV\n//#define CONFIG_QCA_NSS_PACKET_FILTER\n#endif\n\n#define _RMNET_NSS_H_\n#define _RMENT_NSS_H_\nstruct rmnet_nss_cb {\n        int (*nss_create)(struct net_device *dev);\n        int (*nss_free)(struct net_device *dev);\n        int (*nss_tx)(struct sk_buff *skb);\n};\nstatic struct rmnet_nss_cb __read_mostly *nss_cb = NULL;\n#if defined(CONFIG_PINCTRL_IPQ807x) || defined(CONFIG_PINCTRL_IPQ5018)\n#ifdef CONFIG_RMNET_DATA\n#define CONFIG_QCA_NSS_DRV\n/* define at qsdk/qca/src/linux-4.4/net/rmnet_data/rmnet_data_main.c */ //for spf11.x\n/* define at qsdk/qca/src/datarmnet/core/rmnet_config.c */ //for spf12.x\n/* set at qsdk/qca/src/data-kernel/drivers/rmnet-nss/rmnet_nss.c */\n/* need add DEPENDS:= kmod-rmnet-core in feeds/makefile */\nextern struct rmnet_nss_cb *rmnet_nss_callbacks __rcu __read_mostly;\n#endif\n#endif\n\n/* This driver supports wwan (3G/LTE/?) devices using a vendor\n * specific management protocol called Qualcomm MSM Interface (QMI) -\n * in addition to the more common AT commands over serial interface\n * management\n *\n * QMI is wrapped in CDC, using CDC encapsulated commands on the\n * control (\"master\") interface of a two-interface CDC Union\n * resembling standard CDC ECM.  The devices do not use the control\n * interface for any other CDC messages.  Most likely because the\n * management protocol is used in place of the standard CDC\n * notifications NOTIFY_NETWORK_CONNECTION and NOTIFY_SPEED_CHANGE\n *\n * Alternatively, control and data functions can be combined in a\n * single USB interface.\n *\n * Handling a protocol like QMI is out of the scope for any driver.\n * It is exported as a character device using the cdc-wdm driver as\n * a subdriver, enabling userspace applications (\"modem managers\") to\n * handle it.\n *\n * These devices may alternatively/additionally be configured using AT\n * commands on a serial interface\n */\n#define VERSION_NUMBER \"V1.2.9\"\n#define QUECTEL_WWAN_VERSION \"Quectel_Linux&Android_QMI_WWAN_Driver_\"VERSION_NUMBER\nstatic const char driver_name[] = \"qmi_wwan_q\";\n\n/* driver specific data */\nstruct qmi_wwan_state {\n\tstruct usb_driver *subdriver;\n\tatomic_t pmcount;\n\tunsigned long unused;\n\tstruct usb_interface *control;\n\tstruct usb_interface *data;\n};\n\n/* default ethernet address used by the modem */\nstatic const u8 default_modem_addr[ETH_ALEN] = {0x02, 0x50, 0xf3};\n\n#if 1 //Added by Quectel\n/*\n    Quectel_WCDMA&LTE_Linux_USB_Driver_User_Guide_V1.9.pdf\n    5.6.\tTest QMAP on GobiNet or QMI WWAN\n    0 - no QMAP\n    1 - QMAP (Aggregation protocol)\n    X - QMAP (Multiplexing and Aggregation protocol)\n*/\n//#define CONFIG_CLEAR_HALT\n#define QUECTEL_WWAN_QMAP 4 //MAX is 7\n\n#if defined(QUECTEL_WWAN_QMAP)\n#define QUECTEL_QMAP_MUX_ID 0x81\n\nstatic uint __read_mostly qmap_mode = 0;\nmodule_param( qmap_mode, uint, S_IRUGO);\nmodule_param_named( rx_qmap, qmap_mode, uint, S_IRUGO );\n#endif\n\n#if defined(CONFIG_BRIDGE) || defined(CONFIG_BRIDGE_MODULE) || defined(CONFIG_BRIDGE_LAN)\n#define QUECTEL_BRIDGE_MODE\n#endif\n\n#ifdef QUECTEL_BRIDGE_MODE\nstatic uint __read_mostly bridge_mode = 0/*|BIT(1)*/;\nmodule_param( bridge_mode, uint, S_IRUGO );\n#endif\n\n#ifdef CONFIG_BRIDGE_LAN\nstatic const u8 broadcast_mac_addr[ETH_ALEN] = {0xff, 0xff, 0xff, 0xff, 0xff, 0xff};\n#endif\n\n//#define QMI_NETDEV_ONE_CARD_MODE\nstatic uint __read_mostly one_card_mode = 0;\n\n#if defined(QUECTEL_WWAN_QMAP)\n#define QUECTEL_UL_DATA_AGG 1\n\n#if defined(QUECTEL_UL_DATA_AGG)\nstruct tx_agg_ctx {\n\t/* QMIWDS_ADMIN_SET_DATA_FORMAT_RESP TLV_0x17 and TLV_0x18 */\n\tuint ul_data_aggregation_max_datagrams; //UplinkDataAggregationMaxDatagramsTlv\n\tuint ul_data_aggregation_max_size; //UplinkDataAggregationMaxSizeTlv\n\tuint dl_minimum_padding; //0x1A\n};\n#endif\n\ntypedef struct {\n    unsigned int size;\n    unsigned int rx_urb_size;\n    unsigned int ep_type;\n    unsigned int iface_id;\n    unsigned int qmap_mode;\n    unsigned int qmap_version;\n    unsigned int dl_minimum_padding;\n    char ifname[8][16];\n    unsigned char mux_id[8];\n} RMNET_INFO;\n\ntypedef struct sQmiWwanQmap\n{\n\tstruct usbnet *mpNetDev;\n\tstruct driver_info driver_info;\n\tatomic_t refcount;\n\tstruct net_device *mpQmapNetDev[QUECTEL_WWAN_QMAP];\n\tuint link_state;\n\tuint qmap_mode;\n\tuint qmap_size;\n\tuint qmap_version;\n\n#if defined(QUECTEL_UL_DATA_AGG)\n\tstruct tx_agg_ctx tx_ctx;\n\tstruct tasklet_struct\ttxq;\n\tstruct tasklet_struct usbnet_bh;\n#endif\n\n#ifdef QUECTEL_BRIDGE_MODE\n\tuint bridge_mode;\n\tuint bridge_ipv4;\n\tunsigned char bridge_mac[ETH_ALEN];\n#ifdef CONFIG_BRIDGE_LAN\n    unsigned char bridge_self_mac[ETH_ALEN];\n#endif\n#endif\n\tuint use_rmnet_usb;\n\tRMNET_INFO rmnet_info;\n} sQmiWwanQmap;\n\n#if LINUX_VERSION_CODE > KERNEL_VERSION(3,13,0) //8f84985fec10de64a6b4cdfea45f2b0ab8f07c78\n#define MHI_NETDEV_STATUS64\n#endif\nstruct qmap_priv {\n\tstruct usbnet *dev;\n\tstruct net_device *real_dev;\n\tstruct net_device *self_dev;\n\tu8 offset_id;\n\tu8 mux_id;\n\tu8 qmap_version; // 5~v1, 9~v5\n\tu8 link_state;\n\n#if defined(MHI_NETDEV_STATUS64)\n\tstruct pcpu_sw_netstats __percpu *stats64;\n#endif\n\n\tspinlock_t agg_lock;\n\tstruct sk_buff *agg_skb;\n\tunsigned agg_count;\n\tstruct timespec64 agg_time;\n\tstruct hrtimer agg_hrtimer;\n\tstruct work_struct agg_wq;\n\n#ifdef QUECTEL_BRIDGE_MODE\n\tuint bridge_mode;\n\tuint bridge_ipv4;\n\tunsigned char bridge_mac[ETH_ALEN];\n#ifdef CONFIG_BRIDGE_LAN\n    unsigned char bridge_self_mac[ETH_ALEN];\n#endif\n#endif\n\tuint use_qca_nss;\n};\n\nstruct qmap_hdr {\n    u8 cd_rsvd_pad;\n    u8 mux_id;\n    u16 pkt_len;\n} __packed;\n\nenum rmnet_map_v5_header_type {\n\tRMNET_MAP_HEADER_TYPE_UNKNOWN,\n\tRMNET_MAP_HEADER_TYPE_COALESCING = 0x1,\n\tRMNET_MAP_HEADER_TYPE_CSUM_OFFLOAD = 0x2,\n\tRMNET_MAP_HEADER_TYPE_ENUM_LENGTH\n};\n\n/* Main QMAP header */\nstruct rmnet_map_header {\n#if defined(__LITTLE_ENDIAN_BITFIELD)\n\tu8  pad_len:6;\n\tu8  next_hdr:1;\n\tu8  cd_bit:1;\n#elif defined (__BIG_ENDIAN_BITFIELD)\n\tu8  cd_bit:1;\n\tu8  next_hdr:1;\n\tu8  pad_len:6;\n#else\n#error\t\"Please fix <asm/byteorder.h>\"\n#endif\n\tu8  mux_id;\n\t__be16 pkt_len;\n}  __aligned(1);\n\n/* QMAP v5 headers */\nstruct rmnet_map_v5_csum_header {\n#if defined(__LITTLE_ENDIAN_BITFIELD)\n\tu8  next_hdr:1;\n\tu8  header_type:7;\n\tu8  hw_reserved:7;\n\tu8  csum_valid_required:1;\n#elif defined (__BIG_ENDIAN_BITFIELD)\n\tu8  header_type:7;\n\tu8  next_hdr:1;\n\tu8  csum_valid_required:1;\n\tu8  hw_reserved:7;\n#else\n#error\t\"Please fix <asm/byteorder.h>\"\n#endif\n\t__be16 reserved;\n} __aligned(1);\n\n#ifdef QUECTEL_BRIDGE_MODE\nstatic int is_qmap_netdev(const struct net_device *netdev);\n#endif\n#endif\n\nstatic const struct driver_info rmnet_usb_info;\n\n#ifdef QUECTEL_BRIDGE_MODE\nstatic int bridge_arp_reply(struct net_device *net, struct sk_buff *skb, uint bridge_ipv4) {\n    struct arphdr *parp;\n    u8 *arpptr, *sha;\n    u8  sip[4], tip[4], ipv4[4];\n    struct sk_buff *reply = NULL;\n\n    ipv4[0]  = (bridge_ipv4 >> 24) & 0xFF;\n    ipv4[1]  = (bridge_ipv4 >> 16) & 0xFF;\n    ipv4[2]  = (bridge_ipv4 >> 8) & 0xFF;\n    ipv4[3]  = (bridge_ipv4 >> 0) & 0xFF;\n\n    parp = arp_hdr(skb);\n\n    if (parp->ar_hrd == htons(ARPHRD_ETHER)  && parp->ar_pro == htons(ETH_P_IP)\n        && parp->ar_op == htons(ARPOP_REQUEST) && parp->ar_hln == 6 && parp->ar_pln == 4) {\n        arpptr = (u8 *)parp + sizeof(struct arphdr);\n        sha = arpptr;\n        arpptr += net->addr_len;\t/* sha */\n        memcpy(sip, arpptr, sizeof(sip));\n        arpptr += sizeof(sip);\n        arpptr += net->addr_len;\t/* tha */\n        memcpy(tip, arpptr, sizeof(tip));\n\n        pr_info(\"%s sip = %d.%d.%d.%d, tip=%d.%d.%d.%d, ipv4=%d.%d.%d.%d\\n\", netdev_name(net),\n            sip[0], sip[1], sip[2], sip[3], tip[0], tip[1], tip[2], tip[3], ipv4[0], ipv4[1], ipv4[2], ipv4[3]);\n\t//wwan0 sip = 10.151.137.255, tip=10.151.138.0, ipv4=10.151.137.255\n        if (tip[0] == ipv4[0] && tip[1] == ipv4[1] && (tip[2]&0xFC) == (ipv4[2]&0xFC) && tip[3] != ipv4[3])\n            reply = arp_create(ARPOP_REPLY, ETH_P_ARP, *((__be32 *)sip), net, *((__be32 *)tip), sha, default_modem_addr, sha);\n\n        if (reply) {\n            skb_reset_mac_header(reply);\n            __skb_pull(reply, skb_network_offset(reply));\n            reply->ip_summed = CHECKSUM_UNNECESSARY;\n            reply->pkt_type = PACKET_HOST;\n\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION( 5,18,0 ))\n            netif_rx(reply);\n#else\n            netif_rx_ni(reply);\n#endif\n        }\n        return 1;\n    }\n\n    return 0;\n}\n\nstatic struct sk_buff *bridge_mode_tx_fixup(struct net_device *net, struct sk_buff *skb, uint bridge_ipv4, unsigned char *bridge_mac) {\n\tstruct ethhdr *ehdr;\n\tconst struct iphdr *iph;\n\n\tskb_reset_mac_header(skb);\n\tehdr = eth_hdr(skb);\n\n\tif (ehdr->h_proto == htons(ETH_P_ARP)) {\n\t\tif (bridge_ipv4)\n\t\t\tbridge_arp_reply(net, skb, bridge_ipv4);\n\t\treturn NULL;\n\t}\n\n\tiph = ip_hdr(skb);\n\t//DBG(\"iphdr: \");\n\t//PrintHex((void *)iph, sizeof(struct iphdr));\n\n// 1\t0.000000000\t0.0.0.0\t255.255.255.255\tDHCP\t362\tDHCP Request  - Transaction ID 0xe7643ad7\n\tif (ehdr->h_proto == htons(ETH_P_IP) && iph->protocol == IPPROTO_UDP && iph->saddr == 0x00000000 && iph->daddr == 0xFFFFFFFF) {\n\t\t//if (udp_hdr(skb)->dest == htons(67)) //DHCP Request\n\t\t{\n\t\t\tmemcpy(bridge_mac, ehdr->h_source, ETH_ALEN);\n\t\t\tpr_info(\"%s PC Mac Address: %02x:%02x:%02x:%02x:%02x:%02x\\n\", netdev_name(net),\n\t\t\t\tbridge_mac[0], bridge_mac[1], bridge_mac[2], bridge_mac[3], bridge_mac[4], bridge_mac[5]);\n\t\t}\n\t}\n\n#ifdef CONFIG_BRIDGE_LAN\n\t//bridge Lan IP 192.168.0.0\n\tif (ehdr->h_proto == htons(ETH_P_IP) && (iph->daddr & 0xFFFF) == 0xA8C0)\n\t{\n\t    struct sk_buff *reply = skb_copy(skb, GFP_ATOMIC);\n\t    ehdr = eth_hdr(reply);\n\n\t\tmemcpy(ehdr->h_source, default_modem_addr, ETH_ALEN);\n\t\tif(is_qmap_netdev(net))\n\t    {\n\t\t\tstruct qmap_priv *priv = netdev_priv(net);\n\t        memcpy(ehdr->h_dest, priv->bridge_self_mac, ETH_ALEN);\n\t    }\n\t    else\n\t    {\n\t\t\tstruct usbnet * usbnetdev = netdev_priv(net);\n\t\t\tstruct qmi_wwan_state *info = (void *)&usbnetdev->data;\n\t\t\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\t        memcpy(ehdr->h_dest, pQmapDev->bridge_self_mac, ETH_ALEN);\n\t    }\n\n\t\t//pr_info(\"%s br rx pkt addr: %02x:%02x:%02x:%02x:%02x:%02x -> %02x:%02x:%02x:%02x:%02x:%02x\\n\", netdev_name(net),\n        //    ehdr->h_source[0], ehdr->h_source[1], ehdr->h_source[2], ehdr->h_source[3], ehdr->h_source[4], ehdr->h_source[5],\n        //    ehdr->h_dest[0], ehdr->h_dest[1], ehdr->h_dest[2], ehdr->h_dest[3], ehdr->h_dest[4], ehdr->h_dest[5]);\n\n\t\tskb_reset_mac_header(reply);\n        __skb_pull(reply, skb_network_offset(reply));\n        reply->ip_summed = CHECKSUM_UNNECESSARY;\n        reply->pkt_type = PACKET_HOST;\n        netif_rx_ni(reply);\n\t\treturn NULL;\n\t}\n#endif\n\n\tif (memcmp(ehdr->h_source, bridge_mac, ETH_ALEN)) {\n\t\treturn NULL;\n\t}\n\n\treturn skb;\n}\n\nstatic void bridge_mode_rx_fixup(sQmiWwanQmap *pQmapDev, struct net_device *net, struct sk_buff *skb) {\n\tuint bridge_mode = 0;\n\tunsigned char *bridge_mac;\n\n\tif (pQmapDev->qmap_mode > 1 || ((pQmapDev->use_rmnet_usb == 1) && !one_card_mode)) {\n\t\tstruct qmap_priv *priv = netdev_priv(net);\n\t\tbridge_mode = priv->bridge_mode;\n\t\tbridge_mac = priv->bridge_mac;\n\t}\n\telse {\n\t\tbridge_mode = pQmapDev->bridge_mode;\n\t\tbridge_mac = pQmapDev->bridge_mac;\n\t}\n\n\tif (bridge_mode)\n\t\tmemcpy(eth_hdr(skb)->h_dest, bridge_mac, ETH_ALEN);\n\telse\n\t\tmemcpy(eth_hdr(skb)->h_dest, net->dev_addr, ETH_ALEN);\n}\n#endif\n\n#if defined(QUECTEL_WWAN_QMAP)\nstatic ssize_t qmap_mode_show(struct device *dev, struct device_attribute *attr, char *buf) {\n\tstruct net_device *netdev = to_net_dev(dev);\n\tstruct usbnet * usbnetdev = netdev_priv( netdev );\n\tstruct qmi_wwan_state *info = (void *)&usbnetdev->data;\n\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\n\treturn snprintf(buf, PAGE_SIZE, \"%d\\n\",  pQmapDev->qmap_mode);\n}\n\nstatic DEVICE_ATTR(qmap_mode, S_IRUGO, qmap_mode_show, NULL);\n\nstatic ssize_t qmap_size_show(struct device *dev, struct device_attribute *attr, char *buf) {\n\tstruct net_device *netdev = to_net_dev(dev);\n\tstruct usbnet * usbnetdev = netdev_priv( netdev );\n\tstruct qmi_wwan_state *info = (void *)&usbnetdev->data;\n\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\n\treturn snprintf(buf, PAGE_SIZE, \"%u\\n\",  pQmapDev->qmap_size);\n}\n\nstatic DEVICE_ATTR(qmap_size, S_IRUGO, qmap_size_show, NULL);\n\nstatic ssize_t link_state_show(struct device *dev, struct device_attribute *attr, char *buf) {\n\tstruct net_device *netdev = to_net_dev(dev);\n\tstruct usbnet * usbnetdev = netdev_priv( netdev );\n\tstruct qmi_wwan_state *info = (void *)&usbnetdev->data;\n\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\n\treturn snprintf(buf, PAGE_SIZE, \"0x%x\\n\",  pQmapDev->link_state);\n}\n\nstatic ssize_t link_state_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {\n\tstruct net_device *netdev = to_net_dev(dev);\n\tstruct usbnet * usbnetdev = netdev_priv( netdev );\n\tstruct qmi_wwan_state *info = (void *)&usbnetdev->data;\n\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\tunsigned link_state = 0;\n\tunsigned old_link = pQmapDev->link_state;\n\tuint offset_id = 0;\n\n\tlink_state = simple_strtoul(buf, NULL, 0);\n\n\tif (pQmapDev->qmap_mode == 1) {\n\t\tpQmapDev->link_state = !!link_state;\n\t}\n\telse if (pQmapDev->qmap_mode > 1) {\n\t\toffset_id = ((link_state&0x7F) - 1);\n\n\t\tif (offset_id >= pQmapDev->qmap_mode) {\n\t\t\tdev_info(dev, \"%s offset_id is %d. but qmap_mode is %d\\n\", __func__, offset_id, pQmapDev->qmap_mode);\n\t\t\treturn count;\n\t\t}\n\n\t\tif (link_state&0x80)\n\t\t\tpQmapDev->link_state &= ~(1 << offset_id);\n\t\telse\n\t\t\tpQmapDev->link_state |= (1 << offset_id);\n\t}\n\n\tif (old_link != pQmapDev->link_state) {\n\t\tstruct net_device *qmap_net = pQmapDev->mpQmapNetDev[offset_id];\n\n\t\tif (usbnetdev->net->flags & IFF_UP) {\n\t\t\tif (pQmapDev->link_state) {\n\t\t\t\tnetif_carrier_on(usbnetdev->net);\n\t\t\t}\n\t\t}\n\n\t\tif (qmap_net && qmap_net != netdev) {\n\t\t\tstruct qmap_priv *priv = netdev_priv(qmap_net);\n\n\t\t\tpriv->link_state = !!(pQmapDev->link_state & (1 << offset_id));\n\n\t\t\tif (qmap_net->flags & IFF_UP) {\n\t\t\t\tif (priv->link_state) {\n\t\t\t\t\tnetif_carrier_on(qmap_net);\n\t\t\t\t\tif (netif_queue_stopped(qmap_net) && !netif_queue_stopped(usbnetdev->net))\n\t\t\t\t\t\tnetif_wake_queue(qmap_net);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tnetif_carrier_off(qmap_net);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tif (usbnetdev->net->flags & IFF_UP) {\n\t\t\tif (!pQmapDev->link_state) {\n\t\t\t\tnetif_carrier_off(usbnetdev->net);\n\t\t\t}\n\t\t}\n\n\t\tdev_info(dev, \"link_state 0x%x -> 0x%x\\n\", old_link, pQmapDev->link_state);\n\t}\n\n\treturn count;\n}\n\n#ifdef QUECTEL_BRIDGE_MODE\nstatic ssize_t bridge_mode_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {\n\tstruct net_device *netdev = to_net_dev(dev);\n\tuint old_mode = 0;\n\tuint bridge_mode = simple_strtoul(buf, NULL, 0);\n\n\tif (netdev->type != ARPHRD_ETHER) {\n\t\treturn count;\n\t}\n\n\tif (is_qmap_netdev(netdev)) {\n\t\tstruct qmap_priv *priv = netdev_priv(netdev);\n\t\told_mode = priv->bridge_mode;\n\t\tpriv->bridge_mode = bridge_mode;\n\t}\n\telse {\n\t\tstruct usbnet * usbnetdev = netdev_priv( netdev );\n\t\tstruct qmi_wwan_state *info = (void *)&usbnetdev->data;\n\t\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\t\told_mode = pQmapDev->bridge_mode;\n\t\tpQmapDev->bridge_mode = bridge_mode;\n\t}\n\n\tif (old_mode != bridge_mode) {\n\t\tdev_info(dev, \"bridge_mode change to 0x%x\\n\", bridge_mode);\n\t}\n\n\treturn count;\n}\n\nstatic ssize_t bridge_mode_show(struct device *dev, struct device_attribute *attr, char *buf) {\n\tstruct net_device *netdev = to_net_dev(dev);\n\tuint bridge_mode = 0;\n\n\tif (is_qmap_netdev(netdev)) {\n\t\tstruct qmap_priv *priv = netdev_priv(netdev);\n\t\tbridge_mode = priv->bridge_mode;\n\t}\n\telse {\n\t\tstruct usbnet * usbnetdev = netdev_priv( netdev );\n\t\tstruct qmi_wwan_state *info = (void *)&usbnetdev->data;\n\t\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\t\tbridge_mode = pQmapDev->bridge_mode;\n\t}\n\n\treturn snprintf(buf, PAGE_SIZE, \"%u\\n\", bridge_mode);\n}\n\nstatic ssize_t bridge_ipv4_show(struct device *dev, struct device_attribute *attr, char *buf) {\n\tstruct net_device *netdev = to_net_dev(dev);\n\tunsigned int bridge_ipv4 = 0;\n\tunsigned char ipv4[4];\n\n\tif (is_qmap_netdev(netdev)) {\n\t\tstruct qmap_priv *priv = netdev_priv(netdev);\n\t\tbridge_ipv4 = priv->bridge_ipv4;\n\t}\n\telse {\n\t\tstruct usbnet * usbnetdev = netdev_priv( netdev );\n\t\tstruct qmi_wwan_state *info = (void *)&usbnetdev->data;\n\t\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\t\tbridge_ipv4 = pQmapDev->bridge_ipv4;\n\t}\n\n\tipv4[0]  = (bridge_ipv4 >> 24) & 0xFF;\n\tipv4[1]  = (bridge_ipv4 >> 16) & 0xFF;\n\tipv4[2]  = (bridge_ipv4 >> 8) & 0xFF;\n\tipv4[3]  = (bridge_ipv4 >> 0) & 0xFF;\n\n\treturn snprintf(buf, PAGE_SIZE, \"%d.%d.%d.%d\\n\",  ipv4[0], ipv4[1], ipv4[2], ipv4[3]);\n}\n\nstatic ssize_t bridge_ipv4_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {\n\tstruct net_device *netdev = to_net_dev(dev);\n\n\tif (is_qmap_netdev(netdev)) {\n\t\tstruct qmap_priv *priv = netdev_priv(netdev);\n\t\tpriv->bridge_ipv4 = simple_strtoul(buf, NULL, 16);\n\t}\n\telse {\n\t\tstruct usbnet * usbnetdev = netdev_priv( netdev );\n\t\tstruct qmi_wwan_state *info = (void *)&usbnetdev->data;\n\t\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\t\tpQmapDev->bridge_ipv4 = simple_strtoul(buf, NULL, 16);\n\t}\n\n\treturn count;\n}\n#endif\n\nstatic DEVICE_ATTR(link_state, S_IWUSR | S_IRUGO, link_state_show, link_state_store);\n#ifdef QUECTEL_BRIDGE_MODE\nstatic DEVICE_ATTR(bridge_mode, S_IWUSR | S_IRUGO, bridge_mode_show, bridge_mode_store);\nstatic DEVICE_ATTR(bridge_ipv4, S_IWUSR | S_IRUGO, bridge_ipv4_show, bridge_ipv4_store);\n#endif\n\nstatic struct attribute *qmi_wwan_sysfs_attrs[] = {\n\t&dev_attr_link_state.attr,\n\t&dev_attr_qmap_mode.attr,\n\t&dev_attr_qmap_size.attr,\n#ifdef QUECTEL_BRIDGE_MODE\n\t&dev_attr_bridge_mode.attr,\n\t&dev_attr_bridge_ipv4.attr,\n#endif\n\tNULL,\n};\n\nstatic struct attribute_group qmi_wwan_sysfs_attr_group = {\n\t.attrs = qmi_wwan_sysfs_attrs,\n};\n\n#ifdef QUECTEL_BRIDGE_MODE\nstatic struct attribute *qmi_qmap_sysfs_attrs[] = {\n\t&dev_attr_bridge_mode.attr,\n\t&dev_attr_bridge_ipv4.attr,\n\tNULL,\n};\n\nstatic struct attribute_group qmi_qmap_sysfs_attr_group = {\n\t.attrs = qmi_qmap_sysfs_attrs,\n};\n#endif\n\nstatic int qmap_open(struct net_device *qmap_net)\n{\n\tstruct qmap_priv *priv = netdev_priv(qmap_net);\n\tstruct net_device *real_dev = priv->real_dev;\n\n\t//printk(\"%s %s real_dev %d %d %d %d+++\\n\", __func__, dev->name,\n\t//    netif_carrier_ok(real_dev), netif_queue_stopped(real_dev), netif_carrier_ok(dev), netif_queue_stopped(dev));\n\n\tif (!(priv->real_dev->flags & IFF_UP))\n\t\treturn -ENETDOWN;\n\n\tif (priv->link_state) {\n\t\tnetif_carrier_on(real_dev);\n\t\tnetif_carrier_on(qmap_net);\n\t\tif (netif_queue_stopped(qmap_net) && !netif_queue_stopped(real_dev))\n\t\t\tnetif_wake_queue(qmap_net);\n\t}\n\t//printk(\"%s %s real_dev %d %d %d %d---\\n\", __func__, dev->name,\n\t//    netif_carrier_ok(real_dev), netif_queue_stopped(real_dev), netif_carrier_ok(dev), netif_queue_stopped(dev));\n\n\treturn 0;\n}\n\nstatic int qmap_stop(struct net_device *qmap_net)\n{\n\t//printk(\"%s %s %d %d+++\\n\", __func__, dev->name,\n\t//   netif_carrier_ok(dev), netif_queue_stopped(dev));\n\n\tnetif_carrier_off(qmap_net);\n\treturn 0;\n}\n\nstatic void qmap_wake_queue(sQmiWwanQmap *pQmapDev)\n{\n\tuint i = 0;\n\n\tif (!pQmapDev || !pQmapDev->use_rmnet_usb)\n\t\treturn;\n\n\tfor (i = 0; i < pQmapDev->qmap_mode; i++) {\n\t\tstruct net_device *qmap_net = pQmapDev->mpQmapNetDev[i];\n\n\t\tif (qmap_net && netif_carrier_ok(qmap_net) && netif_queue_stopped(qmap_net)) {\n\t\t\tnetif_wake_queue(qmap_net);\n\t\t}\n\t}\n}\n\nstatic struct sk_buff * add_qhdr(struct sk_buff *skb, u8 mux_id, int *hdr_data, int ip_offset) {\n\tstruct qmap_hdr *qhdr;\n\tint pad = 0;\n\n\tpad = skb->len%4;\n\tif (pad) {\n\t\tpad = 4 - pad;\n\t\tif (skb_tailroom(skb) < pad) {\n\t\t\t//printk(\"skb_tailroom small!\\n\");\n\t\t\tpad = 0;\n\t\t}\n\t\tif (pad)\n\t\t\t__skb_put(skb, pad);\n\t}\n\n\tif (hdr_data) {\n\t\tqhdr = (struct qmap_hdr *)hdr_data;\n\t\tqhdr->pkt_len = cpu_to_be16(skb->len - ip_offset);\n\t}\n\telse {\n\t\tqhdr = (struct qmap_hdr *)skb_push(skb, sizeof(struct qmap_hdr));\n\t\tqhdr->pkt_len = cpu_to_be16(skb->len - sizeof(struct qmap_hdr));\n\t}\n\tqhdr->cd_rsvd_pad = pad;\n\tqhdr->mux_id = mux_id;\n\n\treturn skb;\n}\n\nstatic struct sk_buff * add_qhdr_v5(struct sk_buff *skb, u8 mux_id, int *hdr_data, int ip_offset) {\n\tstruct rmnet_map_header *map_header;\n\tstruct rmnet_map_v5_csum_header *ul_header;\n\tint pad = 0;\n\n\tpad = (skb->len - ip_offset) %4;\n\tif (pad) {\n\t\tpad = 4 - pad;\n\t\tif (skb_tailroom(skb) < pad) {\n\t\t\t//printk(\"skb_tailroom small!\\n\");\n\t\t\tpad = 0;\n\t\t}\n\t\tif (pad)\n\t\t\t__skb_put(skb, pad);\n\t}\n\n\tif (hdr_data) {\n\t\tmap_header = (struct rmnet_map_header *)hdr_data;\n\t\tmap_header->pkt_len = htons(skb->len - ip_offset);\n\t}\n\telse {\n\t\tmap_header = (struct rmnet_map_header *)skb_push(skb, (sizeof(struct rmnet_map_header) + sizeof(struct rmnet_map_v5_csum_header)));\n\t\tmap_header->pkt_len = htons(skb->len - (sizeof(struct rmnet_map_header) + sizeof(struct rmnet_map_v5_csum_header)));\n\t}\n\tmap_header->cd_bit = 0;\n\tmap_header->next_hdr = 1;\n\tmap_header->pad_len = pad;\n\tmap_header->mux_id = mux_id;\n\n\tul_header = (struct rmnet_map_v5_csum_header *)(map_header + 1);\n\tmemset(ul_header, 0, sizeof(*ul_header));\n\tul_header->header_type = RMNET_MAP_HEADER_TYPE_CSUM_OFFLOAD;\n\tif (skb->ip_summed == CHECKSUM_PARTIAL) {\n#if 0 //TODO\n\t\tskb->ip_summed = CHECKSUM_NONE;\n\t\t/* Ask for checksum offloading */\n\t\tul_header->csum_valid_required = 1;\n#endif\n\t}\n\n\treturn skb;\n}\n\nstatic void rmnet_vnd_update_rx_stats(struct net_device *net,\n\t\t\tunsigned rx_packets, unsigned rx_bytes) {\n#if defined(MHI_NETDEV_STATUS64)\n\tstruct qmap_priv *dev = netdev_priv(net);\n\tstruct pcpu_sw_netstats *stats64 = this_cpu_ptr(dev->stats64);\n\n\tu64_stats_update_begin(&stats64->syncp);\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 6,0,0 ))\n\tstats64->rx_packets += rx_packets;\n\tstats64->rx_bytes += rx_bytes;\n#else\n    u64_stats_add(&stats64->rx_packets, rx_packets);\n    u64_stats_add(&stats64->rx_bytes, rx_bytes);\n#endif\n\tu64_stats_update_end(&stats64->syncp);\n#else\n\tnet->stats.rx_packets += rx_packets;\n\tnet->stats.rx_bytes += rx_bytes;\n#endif\n}\n\nstatic void rmnet_vnd_update_tx_stats(struct net_device *net,\n\t\t\tunsigned tx_packets, unsigned tx_bytes) {\n#if defined(MHI_NETDEV_STATUS64)\n\tstruct qmap_priv *dev = netdev_priv(net);\n\tstruct pcpu_sw_netstats *stats64 = this_cpu_ptr(dev->stats64);\n\n\tu64_stats_update_begin(&stats64->syncp);\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 6,0,0 ))\n\tstats64->tx_packets += tx_packets;\n\tstats64->tx_bytes += tx_bytes;\n#else\n    u64_stats_add(&stats64->tx_packets, tx_packets);\n    u64_stats_add(&stats64->tx_bytes, tx_bytes);\n#endif\n\tu64_stats_update_end(&stats64->syncp);\n#else\n\tnet->stats.tx_packets += tx_packets;\n\tnet->stats.tx_bytes += tx_bytes;\n#endif\n}\n\n#if defined(MHI_NETDEV_STATUS64)\nstatic struct rtnl_link_stats64 *_rmnet_vnd_get_stats64(struct net_device *net, struct rtnl_link_stats64 *stats)\n{\n\tstruct qmap_priv *dev = netdev_priv(net);\n\tunsigned int start;\n\tint cpu;\n\n\tnetdev_stats_to_stats64(stats, &net->stats);\n\n\tif (nss_cb && dev->use_qca_nss) { // rmnet_nss.c:rmnet_nss_tx() will update rx stats\n\t\tstats->rx_packets = 0;\n\t\tstats->rx_bytes = 0;\n\t}\n\n\tfor_each_possible_cpu(cpu) {\n\t\tstruct pcpu_sw_netstats *stats64;\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 6,1,0 ))\n\t\tu64 rx_packets, rx_bytes;\n\t\tu64 tx_packets, tx_bytes;\n#else\n\t\tu64_stats_t rx_packets, rx_bytes;\n\t\tu64_stats_t tx_packets, tx_bytes;\n#endif\n\n\t\tstats64 = per_cpu_ptr(dev->stats64, cpu);\n\n\t\tdo {\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION( 6,6,0 ))\n\t\t\tstart = u64_stats_fetch_begin(&stats64->syncp);\n#else\n\t\t\tstart = u64_stats_fetch_begin_irq(&stats64->syncp);\n#endif\n\t\t\trx_packets = stats64->rx_packets;\n\t\t\trx_bytes = stats64->rx_bytes;\n\t\t\ttx_packets = stats64->tx_packets;\n\t\t\ttx_bytes = stats64->tx_bytes;\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION( 6,6,0 ))\n\t\t} while (u64_stats_fetch_retry(&stats64->syncp, start));\n#else\n\t\t} while (u64_stats_fetch_retry_irq(&stats64->syncp, start));\n#endif\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 6,1,0 ))\n\t\tstats->rx_packets += rx_packets;\n\t\tstats->rx_bytes += rx_bytes;\n\t\tstats->tx_packets += tx_packets;\n\t\tstats->tx_bytes += tx_bytes;\n#else\n        stats->rx_packets += u64_stats_read(&rx_packets);\n\t\tstats->rx_bytes += u64_stats_read(&rx_bytes);\n\t\tstats->tx_packets += u64_stats_read(&tx_packets);\n\t\tstats->tx_bytes += u64_stats_read(&tx_bytes);\n#endif\n\t}\n\n\treturn stats;\n}\n\n#if (LINUX_VERSION_CODE > KERNEL_VERSION( 4,10,0 )) //bc1f44709cf27fb2a5766cadafe7e2ad5e9cb221\nstatic void rmnet_vnd_get_stats64(struct net_device *net, struct rtnl_link_stats64 *stats) {\n\t_rmnet_vnd_get_stats64(net, stats);\n}\n#else\nstatic struct rtnl_link_stats64 *rmnet_vnd_get_stats64(struct net_device *net, struct rtnl_link_stats64 *stats) {\n\treturn _rmnet_vnd_get_stats64(net, stats);\n}\n#endif\n#endif\n\n#if defined(QUECTEL_UL_DATA_AGG)\nstatic void usbnet_bh(unsigned long data) {\n\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)data;\n\tstruct tasklet_struct *t = &pQmapDev->usbnet_bh;\n\tbool use_callback = false;\n\n#if (LINUX_VERSION_CODE > KERNEL_VERSION( 5,8,0 )) && (LINUX_VERSION_CODE < KERNEL_VERSION( 6,17,0 ))\n\tuse_callback = t->use_callback;\n\tif (use_callback)\n\t\tt->callback(&pQmapDev->mpNetDev->bh);\n#endif\n\n\tif (!use_callback)\n\t\tt->func(t->data);\n\n\tif (!netif_queue_stopped(pQmapDev->mpNetDev->net)) {\n\t\tqmap_wake_queue((sQmiWwanQmap *)data);\n\t}\n}\n\nstatic void rmnet_usb_tx_wake_queue(unsigned long data) {\n\tqmap_wake_queue((sQmiWwanQmap *)data);\n}\n\n#if 0\nstatic void rmnet_usb_tx_skb_destructor(struct sk_buff *skb) {\n\tstruct net_device\t*net = skb->dev;\n\tstruct usbnet * dev = netdev_priv( net );\n\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\n\tif (pQmapDev && pQmapDev->use_rmnet_usb) {\n\t\tint i;\n\n\t\tfor (i = 0; i < pQmapDev->qmap_mode; i++) {\n\t\t\tstruct net_device *qmap_net = pQmapDev->mpQmapNetDev[i];\n\n\t\t\tif (qmap_net && netif_carrier_ok(qmap_net) && netif_queue_stopped(qmap_net)) {\n\t\t\t\ttasklet_schedule(&pQmapDev->txq);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n}\n#endif\n\nstatic int rmnet_usb_tx_agg_skip(struct sk_buff *skb, int offset)\n{\n\tu8 *packet_start = skb->data + offset;\n\tint ready2send = 0;\n\n\tif (skb->protocol == htons(ETH_P_IP)) {\n\t\tstruct iphdr *ip4h = (struct iphdr *)(packet_start);\n\n\t\tif (ip4h->protocol == IPPROTO_TCP) {\n\t\t\tconst struct tcphdr *th = (const struct tcphdr *)(packet_start + sizeof(struct iphdr));\n\t\t\tif (th->psh) {\n\t\t\t\tready2send = 1;\n\t\t\t}\n\t\t}\n\t\telse if (ip4h->protocol == IPPROTO_ICMP)\n\t\t\tready2send = 1;\n\n\t} else if (skb->protocol == htons(ETH_P_IPV6)) {\n\t\tstruct ipv6hdr *ip6h = (struct ipv6hdr *)(packet_start);\n\n\t\tif (ip6h->nexthdr == NEXTHDR_TCP) {\n\t\t\tconst struct tcphdr *th = (const struct tcphdr *)(packet_start + sizeof(struct ipv6hdr));\n\t\t\tif (th->psh) {\n\t\t\t\tready2send = 1;\n\t\t\t}\n\t\t} else if (ip6h->nexthdr == NEXTHDR_ICMP) {\n\t\t\tready2send = 1;\n\t\t} else if (ip6h->nexthdr == NEXTHDR_FRAGMENT) {\n\t\t\tstruct frag_hdr *frag;\n\n\t\t\tfrag = (struct frag_hdr *)(packet_start\n\t\t\t\t\t\t   + sizeof(struct ipv6hdr));\n\t\t\tif (frag->nexthdr == IPPROTO_ICMPV6)\n\t\t\t\tready2send = 1;\n\t\t}\n\t}\n\n\treturn ready2send;\n}\n\nstatic void rmnet_usb_tx_agg_work(struct work_struct *work)\n{\n\tstruct qmap_priv *priv =\n\t\t\tcontainer_of(work, struct qmap_priv, agg_wq);\n\tstruct sk_buff *skb = NULL;\n\tunsigned long flags;\n\n\tspin_lock_irqsave(&priv->agg_lock, flags);\n\tif (likely(priv->agg_skb)) {\n\t\tskb = priv->agg_skb;\n\t\tpriv->agg_skb = NULL;\n\t\tpriv->agg_count = 0;\n\t\tskb->protocol = htons(ETH_P_MAP);\n\t\tskb->dev = priv->real_dev;\n\t\tktime_get_ts64(&priv->agg_time);\n\t}\n\tspin_unlock_irqrestore(&priv->agg_lock, flags);\n\n\tif (skb) {\n\t\tint err;\n#if 0\n\t\tif (!skb->destructor)\n\t\t\tskb->destructor = rmnet_usb_tx_skb_destructor;\n#endif\n\t\terr = dev_queue_xmit(skb);\n\t\tif (err != NET_XMIT_SUCCESS) {\n\t\t\tpriv->self_dev->stats.tx_errors++;\n\t\t}\n\t}\n}\n\nstatic enum hrtimer_restart  rmnet_usb_tx_agg_timer_cb(struct hrtimer *timer)\n{\n\tstruct qmap_priv *priv =\n\t\t\tcontainer_of(timer, struct qmap_priv, agg_hrtimer);\n\n\tschedule_work(&priv->agg_wq);\n\treturn HRTIMER_NORESTART;\n}\n\nstatic long agg_time_limit __read_mostly = 1000000L; //reduce this time, can get better TPUT performance, but will increase USB interrupts\nmodule_param(agg_time_limit, long, S_IRUGO | S_IWUSR);\nMODULE_PARM_DESC(agg_time_limit, \"Maximum time packets sit in the agg buf\");\n\nstatic long agg_bypass_time __read_mostly = 10000000L;\nmodule_param(agg_bypass_time, long, S_IRUGO | S_IWUSR);\nMODULE_PARM_DESC(agg_bypass_time, \"Skip agg when apart spaced more than this\");\n\nstatic int rmnet_usb_tx_agg(struct sk_buff *skb, struct qmap_priv *priv, int *hdr_data, int hdr_len, int ip_offset) {\n\tstruct qmi_wwan_state *info = (void *)&priv->dev->data;\n\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\tstruct tx_agg_ctx *ctx = &pQmapDev->tx_ctx;\n\tint ready2send = 0;\n\tint xmit_more = 0;\n\tstruct timespec64 diff, now;\n\tstruct sk_buff *agg_skb = NULL;\n\tunsigned long flags;\n\tint err;\n\tstruct net_device *pNet = priv->self_dev;\n\n#if LINUX_VERSION_CODE < KERNEL_VERSION(5,1,0) //6b16f9ee89b8d5709f24bc3ac89ae8b5452c0d7c\n#if LINUX_VERSION_CODE > KERNEL_VERSION(3,16,0)\n\txmit_more = skb->xmit_more;\n#endif\n#else\n\txmit_more = netdev_xmit_more();\n#endif\n\n\trmnet_vnd_update_tx_stats(pNet, 1, skb->len);\n\n\tif (ctx->ul_data_aggregation_max_datagrams == 1) {\n\t\tagg_skb = alloc_skb(skb->len + hdr_len, GFP_ATOMIC);\n\t\tif (agg_skb) {\n\t\t\tmemcpy(skb_put(agg_skb, hdr_len), hdr_data, hdr_len);\n\t\t\tmemcpy(skb_put(agg_skb, skb->len - ip_offset), skb->data + ip_offset, skb->len - ip_offset);\n\t\t\tagg_skb->protocol = htons(ETH_P_MAP);\n\t\t\tagg_skb->dev = priv->real_dev;\n#if 0\n\t\t\tif (!agg_skb->destructor)\n\t\t\t\tagg_skb->destructor = rmnet_usb_tx_skb_destructor;\n#endif\n\t\terr = dev_queue_xmit(agg_skb);\n\t\tif (err != NET_XMIT_SUCCESS)\n\t\t\tpNet->stats.tx_errors++;\n\t\t}\n\t\tdev_kfree_skb_any(skb);\n\t\tskb = NULL;\n\t\treturn NET_XMIT_SUCCESS;\n\t}\n\nnew_packet:\n\tspin_lock_irqsave(&priv->agg_lock, flags);\n\tagg_skb = NULL;\n\tready2send = 0;\n\tktime_get_ts64(&now);\n\tdiff = timespec64_sub(now, priv->agg_time);\n\n\tif (priv->agg_skb) {\n\t\tif ((priv->agg_skb->len + skb->len + hdr_len) < ctx->ul_data_aggregation_max_size) {\n\t\t\tmemcpy(skb_put(priv->agg_skb, hdr_len), hdr_data, hdr_len);\n\t\t\tmemcpy(skb_put(priv->agg_skb, skb->len - ip_offset), skb->data + ip_offset, skb->len - ip_offset);\n\t\t\tpriv->agg_count++;\n\n\t\t\tif (diff.tv_sec > 0 || diff.tv_nsec > agg_time_limit) {\n\t\t\t\tready2send = 1;\n\t\t\t}\n\t\t\telse if (priv->agg_count == ctx->ul_data_aggregation_max_datagrams) {\n\t\t\t\tready2send = 1;\n\t\t\t}\n\t\t\telse if (xmit_more == 0) {\n\t\t\t\tstruct rmnet_map_header *map_header = (struct rmnet_map_header *)hdr_data;\n\t\t\t\tsize_t offset = sizeof(struct rmnet_map_header);\n\t\t\t\tif (map_header->next_hdr)\n\t\t\t\t\toffset += sizeof(struct rmnet_map_v5_csum_header);\n\n\t\t\t\tready2send = rmnet_usb_tx_agg_skip(skb, offset);\n\t\t\t}\n\n\t\t\tdev_kfree_skb_any(skb);\n\t\t\tskb = NULL;\n\t\t}\n\t\telse {\n\t\t\tready2send = 1;\n\t\t}\n\n\t\tif (ready2send) {\n\t\t\tagg_skb = priv->agg_skb;\n\t\t\tpriv->agg_skb = NULL;\n\t\t\tpriv->agg_count = 0;\n\t\t}\n\t}\n\telse if (skb) {\n\t\tif (diff.tv_sec > 0 || diff.tv_nsec > agg_bypass_time) {\n\t\t\tready2send = 1;\n\t\t}\n\t\telse if (xmit_more == 0) {\n\t\t\tstruct rmnet_map_header *map_header = (struct rmnet_map_header *)hdr_data;\n\t\t\tsize_t offset = sizeof(struct rmnet_map_header);\n\t\t\tif (map_header->next_hdr)\n\t\t\t\toffset += sizeof(struct rmnet_map_v5_csum_header);\n\n\t\t\tready2send = rmnet_usb_tx_agg_skip(skb, offset);\n\t\t}\n\n\t\tif (ready2send == 0) {\n\t\t\tpriv->agg_skb = alloc_skb(ctx->ul_data_aggregation_max_size, GFP_ATOMIC);\n\t\t\tif (priv->agg_skb) {\n\t\t\t\tskb_reset_network_header(priv->agg_skb); //protocol da1a is buggy, dev wwan0\n\t\t\t\tmemcpy(skb_put(priv->agg_skb, hdr_len), hdr_data, hdr_len);\n\t\t\t\tmemcpy(skb_put(priv->agg_skb, skb->len - ip_offset), skb->data + ip_offset, skb->len - ip_offset);\n\t\t\t\tpriv->agg_count++;\n\t\t\t\tdev_kfree_skb_any(skb);\n\t\t\t\tskb = NULL;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tready2send = 1;\n\t\t\t}\n\t\t}\n\n\t\tif (ready2send) {\n\t\t\tagg_skb = alloc_skb(skb->len + hdr_len, GFP_ATOMIC);\n\t\t\tif (agg_skb) {\n\t\t\t\tmemcpy(skb_put(agg_skb, hdr_len), hdr_data, hdr_len);\n\t\t\t\tmemcpy(skb_put(agg_skb, skb->len - ip_offset), skb->data + ip_offset, skb->len - ip_offset);\n\t\t\t}\n\t\t\tdev_kfree_skb_any(skb);\n\t\t\tskb = NULL;\n\t\t}\n\t}\n\n\tif (ready2send) {\n\t\tpriv->agg_time = now;\n\t}\n\tspin_unlock_irqrestore(&priv->agg_lock, flags);\n\n\tif (agg_skb) {\n\t\tagg_skb->protocol = htons(ETH_P_MAP);\n\t\tagg_skb->dev = priv->real_dev;\n#if 0\n\t\tif (!agg_skb->destructor)\n\t\t\tagg_skb->destructor = rmnet_usb_tx_skb_destructor;\n#endif\n\t\terr = dev_queue_xmit(agg_skb);\n\t\tif (err != NET_XMIT_SUCCESS) {\n\t\t\tpNet->stats.tx_errors++;\n\t\t}\n\t}\n\n\tif (skb) {\n\t\tgoto new_packet;\n\t}\n\n\tif (priv->agg_skb) {\n\t\tif (!hrtimer_is_queued(&priv->agg_hrtimer))\n\t\t\thrtimer_start(&priv->agg_hrtimer, ns_to_ktime(NSEC_PER_MSEC * 2), HRTIMER_MODE_REL);\n\t}\n\n\treturn NET_XMIT_SUCCESS;\n}\n#endif\n\nstatic netdev_tx_t rmnet_vnd_start_xmit(struct sk_buff *skb,\n\t\t\t\t\tstruct net_device *pNet)\n{\n\tint err;\n\tstruct qmap_priv *priv = netdev_priv(pNet);\n\tint qmap_hdr[2];\n\tint hdr_len = 0;\n\tint ip_offset = 0;\n\n\tif (netif_queue_stopped(priv->real_dev)) {\n\t\tnetif_stop_queue(pNet);\n\t\treturn NETDEV_TX_BUSY;\n\t}\n\n\t//printk(\"%s 1 skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n\tif (pNet->type == ARPHRD_ETHER) {\n\t\tskb_reset_mac_header(skb);\n\n#ifdef QUECTEL_BRIDGE_MODE\n\t\tif (priv->bridge_mode && bridge_mode_tx_fixup(pNet, skb, priv->bridge_ipv4, priv->bridge_mac) == NULL) {\n\t\t\tdev_kfree_skb_any (skb);\n\t\t\treturn NETDEV_TX_OK;\n\t\t}\n#endif\n\n#if 1\n\t\tip_offset = ETH_HLEN;\n#else\n\t\tif (skb_pull(skb, ETH_HLEN) == NULL) {\n\t\t\tdev_kfree_skb_any (skb);\n\t\t\treturn NETDEV_TX_OK;\n\t\t}\n#endif\n\t}\n\t//printk(\"%s 2 skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n\n\tif (priv->qmap_version == 5) {\n\t\tadd_qhdr(skb, priv->mux_id, qmap_hdr, ip_offset);\n\t\thdr_len = 4;\n\t}\n\telse if (priv->qmap_version == 9) {\n\t\tadd_qhdr_v5(skb, priv->mux_id, qmap_hdr, ip_offset);\n\t\thdr_len = 8;\n\t}\n\telse {\n\t\tdev_kfree_skb_any (skb);\n\t\treturn NETDEV_TX_OK;\n\t}\n\t//printk(\"%s skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n\n\terr = rmnet_usb_tx_agg(skb, priv, qmap_hdr, hdr_len, ip_offset);\n\n\treturn err;\n}\n\nstatic int rmnet_vnd_change_mtu(struct net_device *rmnet_dev, int new_mtu)\n{\n\tif (new_mtu < 0)\n\t\treturn -EINVAL;\n\n  if (new_mtu > 1500)\n    printk(\"warning, set mtu greater than 1500, %d\\n\", new_mtu);\n\n\trmnet_dev->mtu = new_mtu;\n\treturn 0;\n}\n\n/* drivers may override default ethtool_ops in their bind() routine */\nstatic const struct ethtool_ops rmnet_vnd_ethtool_ops = {\n\t.get_link\t\t= ethtool_op_get_link,\n};\n\nstatic const struct net_device_ops rmnet_vnd_ops = {\n\t.ndo_open       = qmap_open,\n\t.ndo_stop       = qmap_stop,\n\t.ndo_start_xmit = rmnet_vnd_start_xmit,\n\t.ndo_change_mtu = rmnet_vnd_change_mtu,\n#if defined(MHI_NETDEV_STATUS64)\n\t.ndo_get_stats64\t= rmnet_vnd_get_stats64,\n#endif\n};\n\nstatic void rmnet_usb_ether_setup(struct net_device *rmnet_dev)\n{\n\tether_setup(rmnet_dev);\n\n\trmnet_dev->flags |= IFF_NOARP;\n\trmnet_dev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);\n\n#if LINUX_VERSION_CODE > KERNEL_VERSION(4,10,0)\n  rmnet_dev->max_mtu = 65535;\n#endif\n\n\trmnet_dev->ethtool_ops = &rmnet_vnd_ethtool_ops;\n\trmnet_dev->netdev_ops = &rmnet_vnd_ops;\n}\n\nstatic void rmnet_usb_rawip_setup(struct net_device *rmnet_dev)\n{\n\trmnet_dev->needed_headroom = 16;\n\n\t/* Raw IP mode */\n\trmnet_dev->header_ops = NULL;  /* No header */\n\trmnet_dev->type = ARPHRD_RAWIP;\n\trmnet_dev->hard_header_len = 0;\n\trmnet_dev->flags |= IFF_NOARP;\n\trmnet_dev->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);\n\n\trmnet_dev->ethtool_ops = &rmnet_vnd_ethtool_ops;\n\trmnet_dev->netdev_ops = &rmnet_vnd_ops;\n}\n\nstatic rx_handler_result_t qca_nss_rx_handler(struct sk_buff **pskb)\n{\n\tstruct sk_buff *skb = *pskb;\n\n\tif (!skb)\n\t\treturn RX_HANDLER_CONSUMED;\n\n\t//printk(\"%s skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n\n\tif (skb->pkt_type == PACKET_LOOPBACK)\n\t\treturn RX_HANDLER_PASS;\n\n\t/* Check this so that we dont loop around netif_receive_skb */\n\tif (skb->cb[0] == 1) {\n\t\tskb->cb[0] = 0;\n\n\t\treturn RX_HANDLER_PASS;\n\t}\n\n\tif (nss_cb) {\n\t\tnss_cb->nss_tx(skb);\n\t\treturn RX_HANDLER_CONSUMED;\n\t}\n\n\treturn RX_HANDLER_PASS;\n}\n\nstatic int qmap_register_device(sQmiWwanQmap * pDev, u8 offset_id)\n{\n\tstruct net_device *real_dev = pDev->mpNetDev->net;\n\tstruct net_device *qmap_net;\n\tstruct qmap_priv *priv;\n\tint err;\n\tchar name[IFNAMSIZ];\n\tint use_qca_nss = !!nss_cb;\n\n\tsprintf(name, \"%s_%d\", real_dev->name, offset_id + 1);\n#ifdef NET_NAME_UNKNOWN\n\tqmap_net = alloc_netdev(sizeof(struct qmap_priv), name,\n\t\t\t\tNET_NAME_UNKNOWN, rmnet_usb_ether_setup);\n#else\n\tqmap_net = alloc_netdev(sizeof(struct qmap_priv), name,\n\t\t\t\trmnet_usb_ether_setup);\n#endif\n    if (!qmap_net)\n        return -ENOBUFS;\n\n    SET_NETDEV_DEV(qmap_net, &real_dev->dev);\n    priv = netdev_priv(qmap_net);\n    priv->offset_id = offset_id;\n    priv->real_dev = real_dev;\n    priv->self_dev = qmap_net;\n    priv->dev = pDev->mpNetDev;\n    priv->qmap_version = pDev->qmap_version;\n    priv->mux_id = QUECTEL_QMAP_MUX_ID + offset_id;\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,17,0)\n    __dev_addr_set(qmap_net, real_dev->dev_addr, ETH_ALEN);\n#else\n    memcpy (qmap_net->dev_addr, real_dev->dev_addr, ETH_ALEN);\n#endif\n\n#ifdef QUECTEL_BRIDGE_MODE\n\tpriv->bridge_mode = !!(pDev->bridge_mode & BIT(offset_id));\n\tqmap_net->sysfs_groups[0] = &qmi_qmap_sysfs_attr_group;\n\tif (priv->bridge_mode)\n\t\tuse_qca_nss = 0;\n#ifdef CONFIG_BRIDGE_LAN\n    memcpy(priv->bridge_self_mac, broadcast_mac_addr, ETH_ALEN);\n#endif\n#endif\n\n\tif (nss_cb && use_qca_nss) {\n\t\trmnet_usb_rawip_setup(qmap_net);\n\t}\n#ifdef CONFIG_PINCTRL_IPQ9574\n\trmnet_usb_rawip_setup(qmap_net);\n#endif\n\tpriv->agg_skb = NULL;\n\tpriv->agg_count = 0;\n#if LINUX_VERSION_CODE < KERNEL_VERSION(6,18,0)\n\thrtimer_init(&priv->agg_hrtimer, CLOCK_MONOTONIC, HRTIMER_MODE_REL);\n\tpriv->agg_hrtimer.function = rmnet_usb_tx_agg_timer_cb;\n#else\n\thrtimer_setup(&priv->agg_hrtimer, rmnet_usb_tx_agg_timer_cb, CLOCK_MONOTONIC, HRTIMER_MODE_REL);\n#endif\n\tINIT_WORK(&priv->agg_wq, rmnet_usb_tx_agg_work);\n\tktime_get_ts64(&priv->agg_time);\n\tspin_lock_init(&priv->agg_lock);\n\tpriv->use_qca_nss = 0;\n\n#if defined(MHI_NETDEV_STATUS64)\n\tpriv->stats64 = netdev_alloc_pcpu_stats(struct pcpu_sw_netstats);\n\tif (!priv->stats64) {\n\t\terr = -ENOBUFS;\n\t\tgoto out_free_newdev;\n\t}\n#endif\n\n\terr = register_netdev(qmap_net);\n\tif (err)\n\t\tdev_info(&real_dev->dev, \"%s(%s)=%d\\n\", __func__, qmap_net->name, err);\n\tif (err < 0)\n\t\tgoto out_free_newdev;\n\tnetif_device_attach (qmap_net);\n\tnetif_carrier_off(qmap_net);\n\n\tif (nss_cb && use_qca_nss) {\n\t\tint rc = nss_cb->nss_create(qmap_net);\n\t\tif (rc) {\n\t\t\t/* Log, but don't fail the device creation */\n\t\t\tnetdev_err(qmap_net, \"Device will not use NSS path: %d\\n\", rc);\n\t\t} else {\n\t\t\tpriv->use_qca_nss = 1;\n\t\t\tnetdev_info(qmap_net, \"NSS context created\\n\");\n\t\t\trtnl_lock();\n\t\t\tnetdev_rx_handler_register(qmap_net, qca_nss_rx_handler, NULL);\n\t\t\trtnl_unlock();\n\t\t}\n\t}\n\n\tstrcpy(pDev->rmnet_info.ifname[offset_id], qmap_net->name);\n\tpDev->rmnet_info.mux_id[offset_id] = priv->mux_id;\n\n\tpDev->mpQmapNetDev[offset_id] = qmap_net;\n\n\tdev_info(&real_dev->dev, \"%s %s\\n\", __func__, qmap_net->name);\n\n\treturn 0;\n\nout_free_newdev:\n\tfree_netdev(qmap_net);\n\treturn err;\n}\n\nstatic void qmap_unregister_device(sQmiWwanQmap * pDev, u8 offset_id) {\n\tstruct net_device *qmap_net = pDev->mpQmapNetDev[offset_id];\n\n\tif (qmap_net != NULL && qmap_net != pDev->mpNetDev->net) {\n\t\tstruct qmap_priv *priv = netdev_priv(qmap_net);\n\t\tunsigned long flags;\n\n\t\tpr_info(\"qmap_unregister_device(%s)\\n\", qmap_net->name);\n\t\tpDev->mpQmapNetDev[offset_id] = NULL;\n\t\tnetif_carrier_off( qmap_net );\n\t\tnetif_stop_queue( qmap_net );\n\n\t\thrtimer_cancel(&priv->agg_hrtimer);\n\t\tcancel_work_sync(&priv->agg_wq);\n\t\tspin_lock_irqsave(&priv->agg_lock, flags);\n\t\tif (priv->agg_skb) {\n\t\t\tkfree_skb(priv->agg_skb);\n\t\t}\n\t\tspin_unlock_irqrestore(&priv->agg_lock, flags);\n\n\t\tif (nss_cb && priv->use_qca_nss) {\n\t\t\trtnl_lock();\n\t\t\tnetdev_rx_handler_unregister(qmap_net);\n\t\t\trtnl_unlock();\n\t\t\tnss_cb->nss_free(qmap_net);\n\t\t}\n\n#if defined(MHI_NETDEV_STATUS64)\n\t\tfree_percpu(priv->stats64);\n#endif\n\t\tunregister_netdev (qmap_net);\n\t\tfree_netdev(qmap_net);\n\t}\n}\n\ntypedef struct {\n    unsigned int size;\n    unsigned int rx_urb_size;\n    unsigned int ep_type;\n    unsigned int iface_id;\n    unsigned int MuxId;\n    unsigned int ul_data_aggregation_max_datagrams; //0x17\n    unsigned int ul_data_aggregation_max_size ;//0x18\n    unsigned int dl_minimum_padding; //0x1A\n} QMAP_SETTING;\n\n#ifdef CONFIG_BRIDGE_LAN\ntypedef struct {\n    u8 id;\n    u8 brmac[ETH_ALEN];\n} BRMAC_SETTING;\n#endif\n\nstatic int qma_setting_store(struct device *dev, QMAP_SETTING *qmap_settings, size_t size);\n\nint qma_setting_store(struct device *dev, QMAP_SETTING *qmap_settings, size_t size) {\n\tstruct net_device *netdev = to_net_dev(dev);\n\tstruct usbnet * usbnetdev = netdev_priv( netdev );\n\tstruct qmi_wwan_state *info = (void *)&usbnetdev->data;\n\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\n\tif (qmap_settings->size != size) {\n\t\tdev_err(dev, \"ERROR: qmap_settings.size donot match!\\n\");\n\t\treturn -EOPNOTSUPP;\n\t}\n\n#ifdef QUECTEL_UL_DATA_AGG\n\tnetif_tx_lock_bh(netdev);\n\tif (pQmapDev->tx_ctx.ul_data_aggregation_max_datagrams == 1 && qmap_settings->ul_data_aggregation_max_datagrams > 1) {\n\t\tpQmapDev->tx_ctx.ul_data_aggregation_max_datagrams = qmap_settings->ul_data_aggregation_max_datagrams;\n\t\tpQmapDev->tx_ctx.ul_data_aggregation_max_size = qmap_settings->ul_data_aggregation_max_size;\n\t\tpQmapDev->tx_ctx.dl_minimum_padding = qmap_settings->dl_minimum_padding;\n\t\tdev_info(dev, \"ul_data_aggregation_max_datagrams=%d, ul_data_aggregation_max_size=%d, dl_minimum_padding=%d\\n\",\n\t\t\tpQmapDev->tx_ctx.ul_data_aggregation_max_datagrams,\n\t\t\tpQmapDev->tx_ctx.ul_data_aggregation_max_size,\n\t\t\tpQmapDev->tx_ctx.dl_minimum_padding);\n\t}\n\tnetif_tx_unlock_bh(netdev);\n\treturn 0;\n#endif\n\n\treturn -EOPNOTSUPP;\n}\n\nstatic int qmap_ndo_do_ioctl(struct net_device *dev, struct ifreq *ifr, int cmd) {\n\tstruct usbnet * usbnetdev = netdev_priv( dev );\n\tstruct qmi_wwan_state *info = (void *)&usbnetdev->data;\n\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\tint rc = -EOPNOTSUPP;\n\tuint link_state = 0;\n \tQMAP_SETTING qmap_settings = {0};\n#ifdef CONFIG_BRIDGE_LAN\n \tBRMAC_SETTING brmac_settings = {0};\n#endif\n#ifdef CONFIG_CLEAR_HALT\n  uint clear_halt = 0;\n#endif\n\n\n\tswitch (cmd) {\n\tcase 0x89F1: //SIOCDEVPRIVATE\n\t\trc = copy_from_user(&link_state, ifr->ifr_ifru.ifru_data, sizeof(link_state));\n\t\tif (!rc) {\n\t\t\tchar buf[32];\n\t\t\tsnprintf(buf, sizeof(buf), \"%u\", link_state);\n\t\t\tlink_state_store(&dev->dev, NULL, buf, strlen(buf));\n\t\t}\n\tbreak;\n\n\tcase 0x89F2: //SIOCDEVPRIVATE\n\t\trc = copy_from_user(&qmap_settings, ifr->ifr_ifru.ifru_data, sizeof(qmap_settings));\n\t\tif (!rc) {\n\t\t\trc = qma_setting_store(&dev->dev, &qmap_settings, sizeof(qmap_settings));\n\t\t}\n\tbreak;\n\n\tcase 0x89F3: //SIOCDEVPRIVATE\n\t\tif (pQmapDev->use_rmnet_usb) {\n\t\t\tuint i;\n\n\t\t\tfor (i = 0; i < pQmapDev->qmap_mode; i++) {\n\t\t\t\tstruct net_device *qmap_net = pQmapDev->mpQmapNetDev[i];\n\n\t\t\t\tif (!qmap_net)\n\t\t\t\t\tbreak;\n\n\t\t\t\tstrcpy(pQmapDev->rmnet_info.ifname[i], qmap_net->name);\n\t\t\t}\n\t\t\trc = copy_to_user(ifr->ifr_ifru.ifru_data, &pQmapDev->rmnet_info, sizeof(pQmapDev->rmnet_info));\n\t\t}\n\tbreak;\n\n#ifdef CONFIG_BRIDGE_LAN\n    case 0x89F4: //SIOCDEVPRIVATE\n        rc = copy_from_user(&brmac_settings, ifr->ifr_ifru.ifru_data, sizeof(brmac_settings));\n\t\tif (pQmapDev->use_rmnet_usb && brmac_settings.id < qmap_mode) {\n\t\t    struct net_device *qmap_net = pQmapDev->mpQmapNetDev[brmac_settings.id];\n\t\t    struct qmap_priv *priv = netdev_priv(qmap_net);\n\t\t    memcpy(priv->bridge_self_mac, brmac_settings.brmac, ETH_ALEN);\n\t\t    pr_info(\"ioctl 0x89F4 change qmapnet bridge(%d) lan mac -> %02x:%02x:%02x:%02x:%02x:%02x\\n\", brmac_settings.id, priv->bridge_self_mac[0],\n                priv->bridge_self_mac[1], priv->bridge_self_mac[2], priv->bridge_self_mac[3], priv->bridge_self_mac[4], priv->bridge_self_mac[5]);\n\t\t}\n\t\telse if (!pQmapDev->use_rmnet_usb && brmac_settings.id == 0) {\n\t        memcpy(pQmapDev->bridge_self_mac, brmac_settings.brmac, ETH_ALEN);\n\t        pr_info(\"ioctl 0x89F4 change usbnet bridge(%d) lan mac -> %02x:%02x:%02x:%02x:%02x:%02x\\n\", brmac_settings.id, pQmapDev->bridge_self_mac[0],\n                pQmapDev->bridge_self_mac[1], pQmapDev->bridge_self_mac[2], pQmapDev->bridge_self_mac[3], pQmapDev->bridge_self_mac[4], pQmapDev->bridge_self_mac[5]);\n\t\t}\n\t\telse {\n\t\t    pr_info(\"ioctl 0x89F4 change bridge(%d) lan mac -> error id\\n\", brmac_settings.id);\n\t\t    rc = -1;\n\t\t}\n\tbreak;\n#endif\n#ifdef CONFIG_CLEAR_HALT\n    case 0x89F5: //SIOCDEVPRIVATE\n        rc = copy_from_user(&clear_halt, ifr->ifr_ifru.ifru_data, sizeof(clear_halt));\n        if (rc == 0 && clear_halt == 1) {\n            usb_clear_halt(usbnetdev->udev,usbnetdev->in);\n            usb_clear_halt(usbnetdev->udev,usbnetdev->out);\n            pr_info(\"usb_clear_halt EPIN EPOUT\\n\");\n        }\n    break;\n#endif\n\n\tdefault:\n\tbreak;\n\t}\n\n\treturn rc;\n}\n\n#ifdef QUECTEL_BRIDGE_MODE\nstatic int is_qmap_netdev(const struct net_device *netdev) {\n\treturn netdev->netdev_ops == &rmnet_vnd_ops;\n}\n#endif\n#endif\n\nstatic struct sk_buff *qmi_wwan_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) {\n\t//MDM9x07,MDM9628,MDM9x40,SDX20,SDX24 only work on RAW IP mode\n\tif ((dev->driver_info->flags & FLAG_NOARP) == 0)\n\t\treturn skb;\n\n\t// Skip Ethernet header from message\n\tif (dev->net->hard_header_len == 0)\n\t\treturn skb;\n\telse\n\t\tskb_reset_mac_header(skb);\n\n#ifdef QUECTEL_BRIDGE_MODE\n{\n\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\n\tif (pQmapDev->bridge_mode && bridge_mode_tx_fixup(dev->net, skb, pQmapDev->bridge_ipv4, pQmapDev->bridge_mac) == NULL) {\n\t      dev_kfree_skb_any (skb);\n\t      return NULL;\n\t}\n}\n#endif\n\n\tif (skb_pull(skb, ETH_HLEN)) {\n\t\treturn skb;\n\t} else {\n\t\tdev_err(&dev->intf->dev,  \"Packet Dropped \");\n\t}\n\n\t// Filter the packet out, release it\n\tdev_kfree_skb_any(skb);\n\treturn NULL;\n}\n#endif\n\n/* Make up an ethernet header if the packet doesn't have one.\n *\n * A firmware bug common among several devices cause them to send raw\n * IP packets under some circumstances.  There is no way for the\n * driver/host to know when this will happen.  And even when the bug\n * hits, some packets will still arrive with an intact header.\n *\n * The supported devices are only capably of sending IPv4, IPv6 and\n * ARP packets on a point-to-point link. Any packet with an ethernet\n * header will have either our address or a broadcast/multicast\n * address as destination.  ARP packets will always have a header.\n *\n * This means that this function will reliably add the appropriate\n * header iff necessary, provided our hardware address does not start\n * with 4 or 6.\n *\n * Another common firmware bug results in all packets being addressed\n * to 00:a0:c6:00:00:00 despite the host address being different.\n * This function will also fixup such packets.\n */\nstatic int qmi_wwan_rx_fixup(struct usbnet *dev, struct sk_buff *skb)\n{\n\t__be16 proto;\n\n\t/* This check is no longer done by usbnet */\n\tif (skb->len < dev->net->hard_header_len)\n\t\treturn 0;\n\n\tswitch (skb->data[0] & 0xf0) {\n\tcase 0x40:\n\t\tproto = htons(ETH_P_IP);\n\t\tbreak;\n\tcase 0x60:\n\t\tproto = htons(ETH_P_IPV6);\n\t\tbreak;\n\tcase 0x00:\n\t\tif (is_multicast_ether_addr(skb->data))\n\t\t\treturn 1;\n\t\t/* possibly bogus destination - rewrite just in case */\n\t\tskb_reset_mac_header(skb);\n\t\tgoto fix_dest;\n\tdefault:\n\t\t/* pass along other packets without modifications */\n\t\treturn 1;\n\t}\n\tif (skb_headroom(skb) < ETH_HLEN)\n\t\treturn 0;\n\tskb_push(skb, ETH_HLEN);\n\tskb_reset_mac_header(skb);\n\teth_hdr(skb)->h_proto = proto;\n\tmemset(eth_hdr(skb)->h_source, 0, ETH_ALEN);\n#if 1 //Added by Quectel\n\t//some kernel will drop ethernet packet which's souce mac is all zero\n\tmemcpy(eth_hdr(skb)->h_source, default_modem_addr, ETH_ALEN);\n#endif\n\nfix_dest:\n#ifdef QUECTEL_BRIDGE_MODE\n{\n\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\tbridge_mode_rx_fixup(pQmapDev, dev->net, skb);\n}\n#else\n\tmemcpy(eth_hdr(skb)->h_dest, dev->net->dev_addr, ETH_ALEN);\n#endif\n\n\treturn 1;\n}\n\n#if defined(QUECTEL_WWAN_QMAP)\nstatic struct sk_buff *qmap_qmi_wwan_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags) {\n\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\n\tif (unlikely(pQmapDev == NULL)) {\n\t\tgoto drop_skb;\n\t} else if (unlikely(pQmapDev->qmap_mode && !pQmapDev->link_state)) {\n\t\tdev_dbg(&dev->net->dev, \"link_state 0x%x, drop skb, len = %u\\n\", pQmapDev->link_state, skb->len);\n\t\tgoto drop_skb;\n\t} else if (pQmapDev->qmap_mode == 0) {\n\t\tskb = qmi_wwan_tx_fixup(dev, skb, flags);\n\t}\n\telse if (pQmapDev->qmap_mode > 1) {\n\t\tWARN_ON(1); //never reach here.\n\t}\n\telse {\n\t\tif (likely(skb)) {\n\t\t\tskb = qmi_wwan_tx_fixup(dev, skb, flags);\n\n\t\t\tif (skb) {\n\t\t\t\tif(pQmapDev->qmap_version == 5)\n\t\t\t\t\tadd_qhdr(skb, QUECTEL_QMAP_MUX_ID, NULL, 0);\n\t\t\t\telse\n\t\t\t\t\tadd_qhdr_v5(skb, QUECTEL_QMAP_MUX_ID, NULL, 0);\n\t\t\t}\n\t\t\telse {\n\t\t\t\treturn NULL;\n\t\t\t}\n\t\t}\n\t}\n\n\treturn skb;\ndrop_skb:\n\tdev_kfree_skb_any (skb);\n\treturn NULL;\n}\n\nstatic void qmap_packet_decode(sQmiWwanQmap *pQmapDev,\n\tstruct sk_buff *skb_in, struct sk_buff_head *skb_chain)\n{\n\tstruct device *dev = &pQmapDev->mpNetDev->net->dev;\n\tstruct sk_buff *qmap_skb;\n\tuint dl_minimum_padding = 0;\n\n\tif (pQmapDev->qmap_version == 9)\n\t\tdl_minimum_padding = pQmapDev->tx_ctx.dl_minimum_padding;\n\n\t/* __skb_queue_head_init() do not call spin_lock_init(&list->lock),\n\t    so should not call skb_queue_tail/queue later.  */\n\t__skb_queue_head_init(skb_chain);\n\n\twhile (skb_in->len > sizeof(struct qmap_hdr)) {\n\t\tstruct rmnet_map_header *map_header = (struct rmnet_map_header *)skb_in->data;\n\t\tstruct rmnet_map_v5_csum_header *ul_header = NULL;\n\t\tsize_t hdr_size = sizeof(struct rmnet_map_header);\n\t\tstruct net_device *qmap_net;\n\t\tint pkt_len = ntohs(map_header->pkt_len);\n\t\tint skb_len;\n\t\t__be16 protocol;\n\t\tint mux_id;\n\t\tint skip_nss = 0;\n\n\t\tif (map_header->next_hdr) {\n\t\t\tul_header = (struct rmnet_map_v5_csum_header *)(map_header + 1);\n\t\t\thdr_size += sizeof(struct rmnet_map_v5_csum_header);\n\t\t}\n\n\t\tskb_len = pkt_len - (map_header->pad_len&0x3F);\n\t\tskb_len -= dl_minimum_padding;\n\n\t\tmux_id = map_header->mux_id - QUECTEL_QMAP_MUX_ID;\n\t\tif (mux_id >= pQmapDev->qmap_mode) {\n\t\t\tdev_info(dev, \"drop qmap unknow mux_id %x\\n\", map_header->mux_id);\n\t\t\tgoto error_pkt;\n\t\t}\n\n\t\tqmap_net = pQmapDev->mpQmapNetDev[mux_id];\n\t\tif (qmap_net == NULL) {\n\t\t\tdev_info(dev, \"drop qmap unknow mux_id %x\\n\", map_header->mux_id);\n\t\t\tgoto skip_pkt;\n\t\t}\n\n\t\tif (skb_len > qmap_net->mtu) {\n\t\t\tdev_info(dev, \"drop skb_len=%x larger than mtu=%d\\n\", skb_len, qmap_net->mtu);\n\t\t\tgoto error_pkt;\n\t\t}\n\n\t\tif (skb_in->len < (pkt_len + hdr_size)) {\n\t\t\tdev_info(dev, \"drop qmap unknow pkt, len=%d, pkt_len=%d\\n\", skb_in->len, pkt_len);\n\t\t\tgoto error_pkt;\n\t\t}\n\n\t\tif (map_header->cd_bit) {\n\t\t\tdev_info(dev, \"skip qmap command packet\\n\");\n\t\t\tgoto skip_pkt;\n\t\t}\n\n\t\tswitch (skb_in->data[hdr_size] & 0xf0) {\n\t\t\tcase 0x40:\n#ifdef CONFIG_QCA_NSS_PACKET_FILTER\n\t\t\t\t{\n\t\t\t\t\tstruct iphdr *ip4h = (struct iphdr *)(&skb_in->data[hdr_size]);\n\t\t\t\t\tif (ip4h->protocol == IPPROTO_ICMP) {\n\t\t\t\t\t\tskip_nss = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n#endif\n\t\t\t\tprotocol = htons(ETH_P_IP);\n\t\t\tbreak;\n\t\t\tcase 0x60:\n#ifdef CONFIG_QCA_NSS_PACKET_FILTER\n\t\t\t\t{\n\t\t\t\t\tstruct ipv6hdr *ip6h = (struct ipv6hdr *)(&skb_in->data[hdr_size]);\n\t\t\t\t\tif (ip6h->nexthdr == NEXTHDR_ICMP) {\n\t\t\t\t\t\tskip_nss = 1;\n\t\t\t\t\t}\n\t\t\t\t}\n#endif\n\t\t\tprotocol = htons(ETH_P_IPV6);\n\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\tdev_info(dev, \"unknow skb->protocol %02x\\n\", skb_in->data[hdr_size]);\n\t\t\t\tgoto error_pkt;\n\t\t}\n\n\t\tqmap_skb = netdev_alloc_skb(qmap_net, skb_len);\n\t\tif (qmap_skb) {\n\t\t\tskb_put(qmap_skb, skb_len);\n\t\t\tmemcpy(qmap_skb->data, skb_in->data + hdr_size, skb_len);\n\t\t}\n\n\t\tif (qmap_skb == NULL) {\n\t\t\tdev_info(dev, \"fail to alloc skb, pkt_len = %d\\n\", skb_len);\n\t\t\tgoto error_pkt;\n\t\t}\n\n\t\tskb_reset_transport_header(qmap_skb);\n\t\tskb_reset_network_header(qmap_skb);\n\t\tqmap_skb->pkt_type = PACKET_HOST;\n\t\tskb_set_mac_header(qmap_skb, 0);\n\t\tqmap_skb->protocol = protocol;\n\n\t\tif(skip_nss)\n\t\t\tqmap_skb->cb[0] = 1;\n\n\t\tif (ul_header && ul_header->header_type == RMNET_MAP_HEADER_TYPE_CSUM_OFFLOAD\n\t\t\t&& ul_header->csum_valid_required) {\n#if 0 //TODO\n\t\t\tqmap_skb->ip_summed = CHECKSUM_UNNECESSARY;\n#endif\n\t\t}\n\n\t\tif (qmap_skb->dev->type == ARPHRD_ETHER) {\n\t\t\tskb_push(qmap_skb, ETH_HLEN);\n\t\t\tskb_reset_mac_header(qmap_skb);\n\t\t\tmemcpy(eth_hdr(qmap_skb)->h_source, default_modem_addr, ETH_ALEN);\n\t\t\tmemcpy(eth_hdr(qmap_skb)->h_dest, qmap_net->dev_addr, ETH_ALEN);\n\t\t\teth_hdr(qmap_skb)->h_proto = protocol;\n#ifdef QUECTEL_BRIDGE_MODE\n\t\t\tbridge_mode_rx_fixup(pQmapDev, qmap_net, qmap_skb);\n#endif\n\t\t}\n\n\t\t__skb_queue_tail(skb_chain, qmap_skb);\n\nskip_pkt:\n\t\tskb_pull(skb_in, pkt_len + hdr_size);\n\t}\n\nerror_pkt:\n\treturn;\n}\n\nstatic int qmap_qmi_wwan_rx_fixup(struct usbnet *dev, struct sk_buff *skb_in)\n{\n\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\tstruct sk_buff *qmap_skb;\n\tstruct sk_buff_head skb_chain;\n\n\tif (pQmapDev->qmap_mode == 0)\n\t\treturn qmi_wwan_rx_fixup(dev, skb_in);\n\n\tqmap_packet_decode(pQmapDev, skb_in, &skb_chain);\n\n\twhile ((qmap_skb = __skb_dequeue (&skb_chain))) {\n\t\tif (qmap_skb->dev != dev->net) {\n\t\t\tWARN_ON(1); //never reach here.\n\t\t}\n\t\telse {\n\t\t\tqmap_skb->protocol = 0;\n\t\t\tusbnet_skb_return(dev, qmap_skb);\n\t\t}\n\t}\n\n    return 0;\n}\n#endif\n\n/* very simplistic detection of IPv4 or IPv6 headers */\nstatic bool possibly_iphdr(const char *data)\n{\n\treturn (data[0] & 0xd0) == 0x40;\n}\n\n/* disallow addresses which may be confused with IP headers */\nstatic int qmi_wwan_mac_addr(struct net_device *dev, void *p)\n{\n\tint ret;\n\tstruct sockaddr *addr = p;\n\n\tret = eth_prepare_mac_addr_change(dev, p);\n\tif (ret < 0)\n\t\treturn ret;\n\tif (possibly_iphdr(addr->sa_data))\n\t\treturn -EADDRNOTAVAIL;\n\teth_commit_mac_addr_change(dev, p);\n\treturn 0;\n}\n\n#if (LINUX_VERSION_CODE > KERNEL_VERSION( 4,10,0 )) //bc1f44709cf27fb2a5766cadafe7e2ad5e9cb221\nstatic void (*_usbnet_get_stats64)(struct net_device *net, struct rtnl_link_stats64 *stats);\n\nstatic void qmi_wwan_get_stats64(struct net_device *net, struct rtnl_link_stats64 *stats) {\n\tif (_usbnet_get_stats64) ////c8b5d129ee293bcf972e7279ac996bb8a138505c\n\t\treturn _usbnet_get_stats64(net, stats);\n\n\tnetdev_stats_to_stats64(stats, &net->stats);\n}\n#else\nstatic struct rtnl_link_stats64 * (*_usbnet_get_stats64)(struct net_device *net, struct rtnl_link_stats64 *stats);\n\nstatic struct rtnl_link_stats64 * qmi_wwan_get_stats64(struct net_device *net, struct rtnl_link_stats64 *stats) {\n\tif (_usbnet_get_stats64)\n\t\treturn _usbnet_get_stats64(net, stats);\n\n\tnetdev_stats_to_stats64(stats, &net->stats);\n\treturn stats;\n}\n#endif\n\nstatic int qmi_wwan_open (struct net_device *net) {\n\tstruct usbnet * usbnetdev = netdev_priv( net );\n\tstruct qmi_wwan_state *info = (void *)&usbnetdev->data;\n\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\tint retval;\n\n\tretval = usbnet_open(net);\n\n\tif (!retval) {\n\t\tif (pQmapDev && pQmapDev->qmap_mode == 1) {\n\t\t\tif (pQmapDev->link_state)\n\t\t\t\tnetif_carrier_on(net);\n\t\t}\n\t}\n\n\treturn retval;\n}\n\nstatic netdev_tx_t qmi_wwan_start_xmit (struct sk_buff *skb,\n\t\t\t\t     struct net_device *net)\n{\n\tstruct usbnet * usbnetdev = netdev_priv( net );\n\tstruct qmi_wwan_state *info = (void *)&usbnetdev->data;\n\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\tint retval;\n\n\tretval = usbnet_start_xmit(skb, net);\n\n\tif (netif_queue_stopped(net) && pQmapDev && pQmapDev->use_rmnet_usb) {\n\t\tint i;\n\n\t\tfor (i = 0; i < pQmapDev->qmap_mode; i++) {\n\t\t\tstruct net_device *qmap_net = pQmapDev->mpQmapNetDev[i];\n\t\t\tif (qmap_net) {\n\t\t\t\tnetif_stop_queue(qmap_net);\n\t\t\t}\n\t\t}\n\t}\n\n\treturn retval;\n}\n\n#if (LINUX_VERSION_CODE > KERNEL_VERSION( 5,14,0 )) //b9067f5dc4a07c8e24e01a1b277c6722d91be39e\n#define use_ndo_siocdevprivate\n#endif\n#ifdef use_ndo_siocdevprivate\nstatic int qmap_ndo_siocdevprivate(struct net_device *dev, struct ifreq *ifr, void __user *data, int cmd) {\n\treturn qmap_ndo_do_ioctl(dev, ifr, cmd);\n}\n#endif\n\nstatic const struct net_device_ops qmi_wwan_netdev_ops = {\n\t.ndo_open\t\t= qmi_wwan_open,\n\t.ndo_stop\t\t= usbnet_stop,\n\t.ndo_start_xmit\t\t= qmi_wwan_start_xmit,\n\t.ndo_tx_timeout\t\t= usbnet_tx_timeout,\n\t.ndo_change_mtu\t\t= usbnet_change_mtu,\n\t.ndo_get_stats64\t= qmi_wwan_get_stats64,\n\t.ndo_set_mac_address\t= qmi_wwan_mac_addr,\n\t.ndo_validate_addr\t= eth_validate_addr,\n#if defined(QUECTEL_WWAN_QMAP)// && defined(CONFIG_ANDROID)\n\t.ndo_do_ioctl = qmap_ndo_do_ioctl,\n#ifdef use_ndo_siocdevprivate\n\t.ndo_siocdevprivate = qmap_ndo_siocdevprivate,\n#endif\n#endif\n};\n\nstatic void ql_net_get_drvinfo(struct net_device *net, struct ethtool_drvinfo *info)\n{\n\t/* Inherit standard device info */\n\tusbnet_get_drvinfo(net, info);\n\t/* strlcpy() is deprecated in kernel 6.8.0+, using strscpy instead */\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(6,8,0))\n\tstrlcpy(info->driver, driver_name, sizeof(info->driver));\n\tstrlcpy(info->version, VERSION_NUMBER, sizeof(info->version));\n#else\n\tstrscpy(info->driver, driver_name, sizeof(info->driver));\n\tstrscpy(info->version, VERSION_NUMBER, sizeof(info->version));\n#endif\n}\n\nstatic struct ethtool_ops ql_net_ethtool_ops;\n\n/* using a counter to merge subdriver requests with our own into a\n * combined state\n */\nstatic int qmi_wwan_manage_power(struct usbnet *dev, int on)\n{\n\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\tint rv;\n\n\tdev_dbg(&dev->intf->dev, \"%s() pmcount=%d, on=%d\\n\", __func__,\n\t\tatomic_read(&info->pmcount), on);\n\n\tif ((on && atomic_add_return(1, &info->pmcount) == 1) ||\n\t    (!on && atomic_dec_and_test(&info->pmcount))) {\n\t\t/* need autopm_get/put here to ensure the usbcore sees\n\t\t * the new value\n\t\t */\n\t\trv = usb_autopm_get_interface(dev->intf);\n\t\tdev->intf->needs_remote_wakeup = on;\n\t\tif (!rv)\n\t\t\tusb_autopm_put_interface(dev->intf);\n\t}\n\treturn 0;\n}\n\nstatic int qmi_wwan_cdc_wdm_manage_power(struct usb_interface *intf, int on)\n{\n\tstruct usbnet *dev = usb_get_intfdata(intf);\n\n\t/* can be called while disconnecting */\n\tif (!dev)\n\t\treturn 0;\n\treturn qmi_wwan_manage_power(dev, on);\n}\n\n/* collect all three endpoints and register subdriver */\nstatic int qmi_wwan_register_subdriver(struct usbnet *dev)\n{\n\tint rv;\n\tstruct usb_driver *subdriver = NULL;\n\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\n\t/* collect bulk endpoints */\n\trv = usbnet_get_endpoints(dev, info->data);\n\tif (rv < 0)\n\t\tgoto err;\n\n\t/* update status endpoint if separate control interface */\n\tif (info->control != info->data)\n\t\tdev->status = &info->control->cur_altsetting->endpoint[0];\n\n\t/* require interrupt endpoint for subdriver */\n\tif (!dev->status) {\n\t\trv = -EINVAL;\n\t\tgoto err;\n\t}\n\n\t/* for subdriver power management */\n\tatomic_set(&info->pmcount, 0);\n\n\t/* register subdriver */\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION( 5,14,0 )) //cac6fb015f719104e60b1c68c15ca5b734f57b9c\n\tsubdriver = usb_cdc_wdm_register(info->control, &dev->status->desc,\n\t\t\t\t\t 4096, WWAN_PORT_QMI, &qmi_wwan_cdc_wdm_manage_power);\n#else\n\tsubdriver = usb_cdc_wdm_register(info->control, &dev->status->desc,\n\t\t\t\t\t 4096, &qmi_wwan_cdc_wdm_manage_power);\n\n#endif\n\tif (IS_ERR(subdriver)) {\n\t\tdev_err(&info->control->dev, \"subdriver registration failed\\n\");\n\t\trv = PTR_ERR(subdriver);\n\t\tgoto err;\n\t}\n\n\t/* prevent usbnet from using status endpoint */\n\tdev->status = NULL;\n\n\t/* save subdriver struct for suspend/resume wrappers */\n\tinfo->subdriver = subdriver;\n\nerr:\n\treturn rv;\n}\n\nstatic int qmi_wwan_bind(struct usbnet *dev, struct usb_interface *intf)\n{\n\tint status = -1;\n\tstruct usb_driver *driver = driver_of(intf);\n\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\n\tBUILD_BUG_ON((sizeof(((struct usbnet *)0)->data) <\n\t\t      sizeof(struct qmi_wwan_state)));\n\n\t/* set up initial state */\n\tinfo->control = intf;\n\tinfo->data = intf;\n\n\tstatus = qmi_wwan_register_subdriver(dev);\n\tif (status < 0 && info->control != info->data) {\n\t\tusb_set_intfdata(info->data, NULL);\n\t\tusb_driver_release_interface(driver, info->data);\n\t}\n\n\t/* Never use the same address on both ends of the link, even\n\t * if the buggy firmware told us to.\n\t */\n\tif (ether_addr_equal(dev->net->dev_addr, default_modem_addr))\n\t\teth_hw_addr_random(dev->net);\n\n\t/* make MAC addr easily distinguishable from an IP header */\n\tif (possibly_iphdr(dev->net->dev_addr)) {\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(5,17,0)\n\t\tu8 temp_addr[ETH_ALEN];\n\t\tmemcpy(temp_addr, dev->net->dev_addr, ETH_ALEN);\n\t\ttemp_addr[0] |= 0x02;\t/* set local assignment bit */\n\t\ttemp_addr[0] &= 0xbf;\t/* clear \"IP\" bit */\n\t\t__dev_addr_set(dev->net, temp_addr, ETH_ALEN);\n#else\n\t\tdev->net->dev_addr[0] |= 0x02;\t/* set local assignment bit */\n\t\tdev->net->dev_addr[0] &= 0xbf;\t/* clear \"IP\" bit */\n#endif\n\t\t}\n\tif (!_usbnet_get_stats64)\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 6,10,0 ))\n\t\t_usbnet_get_stats64 = dev->net->netdev_ops->ndo_get_stats64;\n#else\n\t\t/* From kernel 6.10+, usbnet sets pcpu_stat_type = NETDEV_PCPU_STAT_TSTATS (352f5b3282), but removed ndo_get_stats64 (9cb3d523c1) */\n\t\t/* Use dev_get_tstats64 to read per-CPU stats when NETDEV_PCPU_STAT_TSTATS was set */\n\t\tif (dev->net->pcpu_stat_type == NETDEV_PCPU_STAT_TSTATS)\n\t\t\t_usbnet_get_stats64 = dev_get_tstats64;\n#endif\n\tdev->net->netdev_ops = &qmi_wwan_netdev_ops;\n\n\tql_net_ethtool_ops = *dev->net->ethtool_ops;\n\tql_net_ethtool_ops.get_drvinfo = ql_net_get_drvinfo;\n\tdev->net->ethtool_ops = &ql_net_ethtool_ops;\n\n#if 1 //Added by Quectel\n\tif (dev->driver_info->flags & FLAG_NOARP) {\n\t\tint ret;\n\t\tchar buf[32] = \"Module\";\n\n\t\tret = usb_string(dev->udev, dev->udev->descriptor.iProduct, buf, sizeof(buf));\n\t\tif (ret > 0) {\n\t\t\tbuf[ret] = '\\0';\n\t\t}\n\n\t\tdev_info(&intf->dev, \"Quectel %s work on RawIP mode\\n\", buf);\n\t\tdev->net->flags |= IFF_NOARP;\n\t\tdev->net->flags &= ~(IFF_BROADCAST | IFF_MULTICAST);\n\n\t\tusb_control_msg(\n\t\t\tinterface_to_usbdev(intf),\n\t\t\tusb_sndctrlpipe(interface_to_usbdev(intf), 0),\n\t\t\t0x22, //USB_CDC_REQ_SET_CONTROL_LINE_STATE\n\t\t\t0x21, //USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE\n\t\t\t1, //active CDC DTR\n\t\t\tintf->cur_altsetting->desc.bInterfaceNumber,\n\t\t\tNULL, 0, 100);\n\t}\n\n\tusb_clear_halt(dev->udev,dev->in);\n\tusb_clear_halt(dev->udev,dev->out);\n\n\t//to advoid module report mtu 1460, but rx 1500 bytes IP packets, and cause the customer's system crash\n\t//next setting can make usbnet.c:usbnet_change_mtu() do not modify rx_urb_size according to hard mtu\n\tdev->rx_urb_size = ETH_DATA_LEN + ETH_HLEN + 6;\n\n#if defined(QUECTEL_WWAN_QMAP)\n\tif (qmap_mode > QUECTEL_WWAN_QMAP)\n\t\tqmap_mode = QUECTEL_WWAN_QMAP;\n\n\tif (!status)\n\t{\n\t\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)kzalloc(sizeof(sQmiWwanQmap), GFP_KERNEL);\n\n\t\tif (pQmapDev == NULL)\n\t\t\treturn -ENODEV;\n\n#ifdef QUECTEL_BRIDGE_MODE\n\t\tpQmapDev->bridge_mode = bridge_mode;\n#ifdef CONFIG_BRIDGE_LAN\n        memcpy(pQmapDev->bridge_self_mac, broadcast_mac_addr, ETH_ALEN);\n#endif\n#endif\n\t\tpQmapDev->mpNetDev = dev;\n\t\tpQmapDev->link_state = 1;\n\t\t//on OpenWrt, if set rmnet_usb0.1 as WAN, '/sbin/netifd' will auto create VLAN for rmnet_usb0\n\t\tdev->net->features |= (NETIF_F_VLAN_CHALLENGED);\n\n\t\tif (dev->driver_info->flags & FLAG_NOARP)\n\t\t{\n\t\t\tint qmap_version = (dev->driver_info->data>>8)&0xFF;\n\t\t\tint qmap_size = (dev->driver_info->data)&0xFF;\n\t\t\tint idProduct = le16_to_cpu(dev->udev->descriptor.idProduct);\n\t\t\tint lte_a = (idProduct == 0x0306 || idProduct == 0x030B || idProduct == 0x0512 || idProduct == 0x0620 ||\n\t\t\t\t\t\t\tidProduct == 0x0800 || idProduct == 0x0801 || idProduct == 0x0122 || idProduct == 0x0316);\n\n\t\t\tif (qmap_size > 4096 || dev->udev->speed >= USB_SPEED_SUPER) { //if meet this requirements, must be LTE-A or 5G\n\t\t\t\tlte_a = 1;\n\t\t\t}\n\n\t\t\tpQmapDev->qmap_mode = qmap_mode;\n\t\t\tif (lte_a && pQmapDev->qmap_mode == 0) {\n\t\t\t\tpQmapDev->qmap_mode = 1; //force use QMAP\n\t\t\t\tif(qmap_mode == 0)\n\t\t\t\t\tqmap_mode = 1; //old quectel-CM only check sys/module/wwan0/parameters/qmap_mode\n\t\t\t}\n\n\t\t\tif (pQmapDev->qmap_mode) {\n\t\t\t\tpQmapDev->qmap_version = qmap_version;\n\t\t\t\tpQmapDev->qmap_size = qmap_size*1024;\n\t\t\t\tdev->rx_urb_size = pQmapDev->qmap_size;\n\t\t\t\t//for these modules, if send packet before qmi_start_network, or cause host PC crash, or cause modules crash\n   \t\t\t\tpQmapDev->link_state = !lte_a;\n\n\t\t\t\tif (pQmapDev->qmap_mode > 1)\n\t\t\t\t\tpQmapDev->use_rmnet_usb = 1;\n\t\t\t\telse if (idProduct == 0x0800 || idProduct == 0x0801 || idProduct == 0x0122)\n\t\t\t\t\tpQmapDev->use_rmnet_usb = 1; //benefit for ul data agg\n#ifdef QMI_NETDEV_ONE_CARD_MODE\n\t\t\t\tif(pQmapDev->use_rmnet_usb == 1 && pQmapDev->qmap_mode == 1)\n\t\t\t\t\tone_card_mode = 1;\n\t\t\t\tpQmapDev->rmnet_info.mux_id[0] = QUECTEL_QMAP_MUX_ID;\n#endif\n\t\t\t\tpQmapDev->rmnet_info.size = sizeof(RMNET_INFO);\n\t\t\t\tpQmapDev->rmnet_info.rx_urb_size = pQmapDev->qmap_size;\n\t\t\t\tpQmapDev->rmnet_info.ep_type = 2; //DATA_EP_TYPE_HSUSB\n\t\t\t\tpQmapDev->rmnet_info.iface_id = 4;//Interface ID\n\t\t\t\tif(idProduct == 0x0316)\n\t\t\t\t\tpQmapDev->rmnet_info.iface_id = 3;// SDX35 Interface ID\n\t\t\t\tpQmapDev->rmnet_info.qmap_mode = pQmapDev->qmap_mode;\n\t\t\t\tpQmapDev->rmnet_info.qmap_version = pQmapDev->qmap_version;\n\t\t\t\tpQmapDev->rmnet_info.dl_minimum_padding = 0;\n\n#if defined(QUECTEL_UL_DATA_AGG)\n\t\t\t\tpQmapDev->tx_ctx.ul_data_aggregation_max_datagrams = 1;\n\t\t\t\tpQmapDev->tx_ctx.ul_data_aggregation_max_size = 1500;\n#endif\n\n\t\t\t\tif (pQmapDev->use_rmnet_usb && !one_card_mode) {\n\t\t\t\t\tpQmapDev->driver_info = rmnet_usb_info;\n\t\t\t\t\tpQmapDev->driver_info.data = dev->driver_info->data;\n\t\t\t\t\tdev->driver_info = &pQmapDev->driver_info;\n\t\t\t\t}\n\n\t\t\t\tif (pQmapDev->use_rmnet_usb && !one_card_mode) {\n#if (LINUX_VERSION_CODE >= KERNEL_VERSION( 6,17,0 ))\n#else\n\t\t\t\t\tpQmapDev->usbnet_bh = dev->bh;\n\t\t\t\t\ttasklet_init(&dev->bh, usbnet_bh, (unsigned long)pQmapDev);\n#endif\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tinfo->unused = (unsigned long)pQmapDev;\n\t\tdev->net->sysfs_groups[0] = &qmi_wwan_sysfs_attr_group;\n\n\t\tdev_info(&intf->dev, \"rx_urb_size = %zd\\n\", dev->rx_urb_size);\n\t}\n#endif\n#endif\n\n\treturn status;\n}\n\nstatic void qmi_wwan_unbind(struct usbnet *dev, struct usb_interface *intf)\n{\n\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\tstruct usb_driver *driver = driver_of(intf);\n\tstruct usb_interface *other;\n\n\tif (dev->udev && dev->udev->state == USB_STATE_CONFIGURED) {\n\t\tusb_control_msg(\n\t\t\tinterface_to_usbdev(intf),\n\t\t\tusb_sndctrlpipe(interface_to_usbdev(intf), 0),\n\t\t\t0x22, //USB_CDC_REQ_SET_CONTROL_LINE_STATE\n\t\t\t0x21, //USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE\n\t\t\t0, //deactive CDC DTR\n\t\t\tintf->cur_altsetting->desc.bInterfaceNumber,\n\t\t\tNULL, 0, 100);\n\t}\n\n\tif (info->subdriver && info->subdriver->disconnect)\n\t\tinfo->subdriver->disconnect(info->control);\n\n\t/* allow user to unbind using either control or data */\n\tif (intf == info->control)\n\t\tother = info->data;\n\telse\n\t\tother = info->control;\n\n\t/* only if not shared */\n\tif (other && intf != other) {\n\t\tusb_set_intfdata(other, NULL);\n\t\tusb_driver_release_interface(driver, other);\n\t}\n\n\tinfo->subdriver = NULL;\n\tinfo->data = NULL;\n\tinfo->control = NULL;\n}\n\n/* suspend/resume wrappers calling both usbnet and the cdc-wdm\n * subdriver if present.\n *\n * NOTE: cdc-wdm also supports pre/post_reset, but we cannot provide\n * wrappers for those without adding usbnet reset support first.\n */\nstatic int qmi_wwan_suspend(struct usb_interface *intf, pm_message_t message)\n{\n\tstruct usbnet *dev = usb_get_intfdata(intf);\n\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\tint ret;\n\n\t/* Both usbnet_suspend() and subdriver->suspend() MUST return 0\n\t * in system sleep context, otherwise, the resume callback has\n\t * to recover device from previous suspend failure.\n\t */\n\tret = usbnet_suspend(intf, message);\n\tif (ret < 0)\n\t\tgoto err;\n\n\tif (intf == info->control && info->subdriver &&\n\t    info->subdriver->suspend)\n\t\tret = info->subdriver->suspend(intf, message);\n\tif (ret < 0)\n\t\tusbnet_resume(intf);\nerr:\n\treturn ret;\n}\n\nstatic int qmi_wwan_resume(struct usb_interface *intf)\n{\n\tstruct usbnet *dev = usb_get_intfdata(intf);\n\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\tint ret = 0;\n\tbool callsub = (intf == info->control && info->subdriver &&\n\t\t\tinfo->subdriver->resume);\n\n\tif (callsub)\n\t\tret = info->subdriver->resume(intf);\n\tif (ret < 0)\n\t\tgoto err;\n\tret = usbnet_resume(intf);\n\tif (ret < 0 && callsub)\n\t\tinfo->subdriver->suspend(intf, PMSG_SUSPEND);\n\n#if defined(QUECTEL_WWAN_QMAP)\n\tif (!netif_queue_stopped(dev->net)) {\n\t\tqmap_wake_queue((sQmiWwanQmap *)info->unused);\n\t}\n#endif\n\nerr:\n\treturn ret;\n}\n\nstatic int qmi_wwan_reset_resume(struct usb_interface *intf)\n{\n\tdev_info(&intf->dev, \"device do not support reset_resume\\n\");\n\tintf->needs_binding = 1;\n\treturn -EOPNOTSUPP;\n}\n\nstatic struct sk_buff *rmnet_usb_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)\n{\n\t//printk(\"%s skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n\tif (skb->protocol != htons(ETH_P_MAP)) {\n\t\tdev_kfree_skb_any(skb);\n\t\treturn NULL;\n\t}\n\n\treturn skb;\n}\n\nstatic int rmnet_usb_rx_fixup(struct usbnet *dev, struct sk_buff *skb)\n{\n\tstruct net_device\t*net = dev->net;\n\tunsigned headroom = skb_headroom(skb);\n\n#if (LINUX_VERSION_CODE < KERNEL_VERSION( 3,3,1 )) //7bdd402706cf26bfef9050dfee3f229b7f33ee4f\n//some customers port to v3.2\n\tif (net->type == ARPHRD_ETHER && headroom < ETH_HLEN) {\n\t\tunsigned tailroom = skb_tailroom(skb);\n\n\t\tif ((tailroom + headroom) >= ETH_HLEN) {\n\t\t\tunsigned moveroom = ETH_HLEN - headroom;\n\n\t\t\tmemmove(skb->data + moveroom ,skb->data, skb->len);\n\t\t\tskb->data += moveroom;\n\t\t\tskb->tail += moveroom;\n\t\t\t#ifdef WARN_ONCE\n\t\t\tWARN_ONCE(1, \"It is better reserve headroom in usbnet.c:rx_submit()!\\n\");\n\t\t\t#endif\n\t\t}\n\t}\n#endif\n\n\t//printk(\"%s skb=%p, len=%d, protocol=%x, hdr_len=%d\\n\", __func__, skb, skb->len, skb->protocol, skb->hdr_len);\n\tif (net->type == ARPHRD_ETHER && headroom >= ETH_HLEN) {\n\t\t//usbnet.c rx_process() usbnet_skb_return() eth_type_trans()\n\t\tskb_push(skb, ETH_HLEN);\n\t\tskb_reset_mac_header(skb);\n\t\tmemcpy(eth_hdr(skb)->h_source, default_modem_addr, ETH_ALEN);\n\t\tmemcpy(eth_hdr(skb)->h_dest, net->dev_addr, ETH_ALEN);\n\t\teth_hdr(skb)->h_proto = htons(ETH_P_MAP);\n\n\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\nstatic rx_handler_result_t rmnet_usb_rx_handler(struct sk_buff **pskb)\n{\n\tstruct sk_buff *skb = *pskb;\n\tstruct usbnet *dev;\n\tstruct qmi_wwan_state *info;\n\tsQmiWwanQmap *pQmapDev;\n\tstruct sk_buff *qmap_skb;\n\tstruct sk_buff_head skb_chain;\n\n\tif (!skb)\n\t\tgoto done;\n\n\t//printk(\"%s skb=%p, protocol=%x, len=%d\\n\", __func__, skb, skb->protocol, skb->len);\n\n\tif (skb->pkt_type == PACKET_LOOPBACK)\n\t\treturn RX_HANDLER_PASS;\n\n\tif (skb->protocol != htons(ETH_P_MAP)) {\n\t\tWARN_ON(1);\n\t\treturn RX_HANDLER_PASS;\n\t}\n    /* when open hyfi function, run cm will make system crash */\n\t//dev = rcu_dereference(skb->dev->rx_handler_data);\n\tdev = netdev_priv(skb->dev);\n\n\tif (dev == NULL) {\n\t\tWARN_ON(1);\n\t\treturn RX_HANDLER_PASS;\n\t}\n\n\tinfo = (struct qmi_wwan_state *)&dev->data;\n\tpQmapDev = (sQmiWwanQmap *)info->unused;\n\n\tqmap_packet_decode(pQmapDev, skb, &skb_chain);\n\twhile ((qmap_skb = __skb_dequeue (&skb_chain))) {\n\t\tstruct net_device\t*qmap_net = qmap_skb->dev;\n\n\t\trmnet_vnd_update_rx_stats(qmap_net, 1, qmap_skb->len);\n\t\tif (qmap_net->type == ARPHRD_ETHER)\n\t\t\t__skb_pull(qmap_skb, ETH_HLEN);\n\t\tnetif_receive_skb(qmap_skb);\n\t}\n\tconsume_skb(skb);\n\ndone:\n\treturn RX_HANDLER_CONSUMED;\n}\n\nstatic const struct driver_info\tqmi_wwan_info = {\n\t.description\t= \"WWAN/QMI device\",\n\t.flags\t\t= FLAG_WWAN,\n\t.bind\t\t= qmi_wwan_bind,\n\t.unbind\t\t= qmi_wwan_unbind,\n\t.manage_power\t= qmi_wwan_manage_power,\n};\n\n#define qmi_wwan_raw_ip_info \\\n\t.description\t= \"WWAN/QMI Raw IP device\", \\\n\t.flags\t\t= FLAG_WWAN | FLAG_RX_ASSEMBLE | FLAG_NOARP | FLAG_SEND_ZLP, \\\n\t.bind\t\t= qmi_wwan_bind, \\\n\t.unbind\t\t= qmi_wwan_unbind, \\\n\t.manage_power\t= qmi_wwan_manage_power, \\\n\t.tx_fixup       = qmap_qmi_wwan_tx_fixup, \\\n\t.rx_fixup       = qmap_qmi_wwan_rx_fixup, \\\n\nstatic const struct driver_info rmnet_usb_info = {\n\t.description = \"RMNET/USB device\",\n\t.flags\t\t=  FLAG_WWAN | FLAG_NOARP | FLAG_SEND_ZLP,\n\t.bind = qmi_wwan_bind,\n\t.unbind = qmi_wwan_unbind,\n\t.manage_power = qmi_wwan_manage_power,\n\t.tx_fixup = rmnet_usb_tx_fixup,\n\t.rx_fixup = rmnet_usb_rx_fixup,\n};\n\nstatic const struct driver_info qmi_wwan_raw_ip_info_mdm9x07 = {\n\tqmi_wwan_raw_ip_info\n\t.data = (5<<8)|4, //QMAPV1 and 4KB\n};\n\n// mdm9x40/sdx12/sdx20/sdx24 share the same config\nstatic const struct driver_info qmi_wwan_raw_ip_info_mdm9x40 = {\n\tqmi_wwan_raw_ip_info\n\t.data =  (5<<8)|16, //QMAPV1 and 16KB\n};\n\nstatic const struct driver_info qmi_wwan_raw_ip_info_sdx55 = {\n\tqmi_wwan_raw_ip_info\n\t.data = (9<<8)|31, //QMAPV5 and 31KB\n};\n\n/* map QMI/wwan function by a fixed interface number */\n#define QMI_FIXED_INTF(vend, prod, num) \\\n\tUSB_DEVICE_INTERFACE_NUMBER(vend, prod, num), \\\n\t.driver_info = (unsigned long)&qmi_wwan_info\n\n#define QMI_FIXED_RAWIP_INTF(vend, prod, num, chip) \\\n\tUSB_DEVICE_INTERFACE_NUMBER(vend, prod, num), \\\n\t.driver_info = (unsigned long)&qmi_wwan_raw_ip_info_##chip\n\nstatic const struct usb_device_id products[] = {\n\t{ QMI_FIXED_INTF(0x05C6, 0x9003, 4) },  /* Quectel UC20 */\n\t{ QMI_FIXED_INTF(0x05C6, 0x9215, 4) },  /* Quectel EC20 (MDM9215) */\n\t{ QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0125, 4, mdm9x07) },  /* Quectel EC20 (MDM9X07)/EC25/EG25 */\n\t{ QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0121, 4, mdm9x07) },  /* Quectel EC21 */\n\t{ QMI_FIXED_RAWIP_INTF(0x2C7C, 0x030E, 4, mdm9x07) },  /* Quectel EM05G */\n\t{ QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0191, 4, mdm9x07) },  /* Quectel EG91 */\n\t{ QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0195, 4, mdm9x07) },  /* Quectel EG95 */\n\t{ QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0700, 3, mdm9x07) },  /* Quectel BG95 (at+qcfgext=\"usbnet\",\"rmnet\") */\n\t{ QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0306, 4, mdm9x40) },  /* Quectel EG06/EP06/EM06 */\n\t{ QMI_FIXED_RAWIP_INTF(0x2C7C, 0x030B, 4, mdm9x40) },  /* Quectel EG065k/EG060K */\n\t{ QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0512, 4, mdm9x40) },  /* Quectel EG12/EP12/EM12/EG16/EG18 */\n\t{ QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0296, 4, mdm9x07) },  /* Quectel BG96 */\n\t{ QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0435, 4, mdm9x07) },  /* Quectel AG35 */\n\t{ QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0620, 4, mdm9x40) },  /* Quectel EG20 */\n\t{ QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0316, 3, mdm9x40) },  /* Quectel RG255 */\n\t{ QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0800, 4, sdx55) },  /* Quectel RG500 */\n\t{ QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0801, 4, sdx55) },  /* Quectel RG520 */\n\t{ QMI_FIXED_RAWIP_INTF(0x2C7C, 0x0122, 4, sdx55) },  /* Quectel RG650 */\n\t{ QMI_FIXED_RAWIP_INTF(0x05c6, 0x90d5, 3, sdx55) },  /* Foxconn T99W240T00 */\n\t{ QMI_FIXED_RAWIP_INTF(0x05c6, 0x90db, 2, sdx55) },  /* SIM8200 */\n\t{ QMI_FIXED_RAWIP_INTF(0x2dee, 0x4d22, 5, sdx55) }, /* Meige SRM815 */\n\t{ QMI_FIXED_RAWIP_INTF(0x305a, 0x1421, 3, sdx55) },  /* gm800 */\n\t{ QMI_FIXED_RAWIP_INTF(0x305a, 0x1403, 3, sdx55) },  /* gm800 */\n\t{ QMI_FIXED_RAWIP_INTF(0x05C6, 0x9025, 4, sdx55) },\n\t{ QMI_FIXED_RAWIP_INTF(0x05C6, 0x9091, 2, sdx55) },\n\t{ QMI_FIXED_RAWIP_INTF(0x1BC7, 0x1070, 2, sdx55) },  /* Telit FN990A40 */\n\t{ }\t\t\t\t\t/* END */\n};\nMODULE_DEVICE_TABLE(usb, products);\n\nstatic int qmi_wwan_probe(struct usb_interface *intf,\n\t\t\t  const struct usb_device_id *prod)\n{\n\tstruct usb_device_id *id = (struct usb_device_id *)prod;\n\n\t/* Workaround to enable dynamic IDs.  This disables usbnet\n\t * blacklisting functionality.  Which, if required, can be\n\t * reimplemented here by using a magic \"blacklist\" value\n\t * instead of 0 in the static device id table\n\t */\n\tif (!id->driver_info) {\n\t\tdev_dbg(&intf->dev, \"setting defaults for dynamic device id\\n\");\n\t\tid->driver_info = (unsigned long)&qmi_wwan_info;\n\t}\n\n\tif (intf->cur_altsetting->desc.bInterfaceClass != 0xff) {\n\t\tdev_info(&intf->dev,  \"Quectel module not qmi_wwan mode! please check 'at+qcfg=\\\"usbnet\\\"'\\n\");\n\t\treturn -ENODEV;\n\t}\n\n\treturn usbnet_probe(intf, id);\n}\n\n#if defined(QUECTEL_WWAN_QMAP)\nstatic int qmap_qmi_wwan_probe(struct usb_interface *intf,\n\t\t\t  const struct usb_device_id *prod)\n{\n\tint status = qmi_wwan_probe(intf, prod);\n\n\tif (!status) {\n\t\tstruct usbnet *dev = usb_get_intfdata(intf);\n\t\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\t\tsQmiWwanQmap *pQmapDev = (sQmiWwanQmap *)info->unused;\n\t\tunsigned i;\n\n\t\tif (!pQmapDev)\n\t\t\treturn status;\n\n\t\ttasklet_init(&pQmapDev->txq, rmnet_usb_tx_wake_queue, (unsigned long)pQmapDev);\n\n\t\tif (pQmapDev->qmap_mode == 1) {\n\t\t\tpQmapDev->mpQmapNetDev[0] = dev->net;\n\t\t\tif (pQmapDev->use_rmnet_usb && !one_card_mode) {\n\t\t\t\tpQmapDev->mpQmapNetDev[0] = NULL;\n\t\t\t\tqmap_register_device(pQmapDev, 0);\n\t\t\t}\n\t\t}\n\t\telse if (pQmapDev->qmap_mode > 1) {\n\t\t\tfor (i = 0; i < pQmapDev->qmap_mode; i++) {\n\t\t\t\tqmap_register_device(pQmapDev, i);\n\t\t\t}\n\t\t}\n\n\t\tif (pQmapDev->use_rmnet_usb && !one_card_mode) {\n\t\t\trtnl_lock();\n\t\t\t/* when open hyfi function, run cm will make system crash */\n\t\t\t//netdev_rx_handler_register(dev->net, rmnet_usb_rx_handler, dev);\n\t\t\tnetdev_rx_handler_register(dev->net, rmnet_usb_rx_handler, NULL);\n\t\t\trtnl_unlock();\n\t\t}\n\n\t\tif (pQmapDev->link_state == 0) {\n\t\t\tnetif_carrier_off(dev->net);\n\t\t}\n\t}\n\n\treturn status;\n}\n\nstatic void qmap_qmi_wwan_disconnect(struct usb_interface *intf)\n{\n\tstruct usbnet *dev = usb_get_intfdata(intf);\n\tstruct qmi_wwan_state *info;\n\tsQmiWwanQmap *pQmapDev;\n\tuint i;\n\n\tif (!dev)\n\t\treturn;\n\n\tinfo = (void *)&dev->data;\n\tpQmapDev = (sQmiWwanQmap *)info->unused;\n\n\tif (!pQmapDev) {\n\t\treturn usbnet_disconnect(intf);\n\t}\n\n\tpQmapDev->link_state = 0;\n\n\tif (pQmapDev->qmap_mode > 1) {\n\t\tfor (i = 0; i < pQmapDev->qmap_mode; i++) {\n\t\t\tqmap_unregister_device(pQmapDev, i);\n\t\t}\n\t}\n\n\tif (pQmapDev->use_rmnet_usb && !one_card_mode) {\n\t\tqmap_unregister_device(pQmapDev, 0);\n\t\trtnl_lock();\n\t\tnetdev_rx_handler_unregister(dev->net);\n\t\trtnl_unlock();\n\t}\n\n\ttasklet_kill(&pQmapDev->txq);\n\n\tusbnet_disconnect(intf);\n\t/* struct usbnet *dev had free by usbnet_disconnect()->free_netdev().\n\t    so we should access info. */\n\t//info->unused = 0;\n\tkfree(pQmapDev);\n}\n#endif\n\nstatic struct usb_driver qmi_wwan_driver = {\n\t.name\t\t      = \"qmi_wwan_q\",\n\t.id_table\t      = products,\n\t.probe\t\t      = qmi_wwan_probe,\n#if defined(QUECTEL_WWAN_QMAP)\n\t.probe\t\t      = qmap_qmi_wwan_probe,\n\t.disconnect\t      = qmap_qmi_wwan_disconnect,\n#else\n\t.probe\t\t      = qmi_wwan_probe,\n\t.disconnect\t      = usbnet_disconnect,\n#endif\n\t.suspend\t      = qmi_wwan_suspend,\n\t.resume\t\t      =\tqmi_wwan_resume,\n\t.reset_resume         = qmi_wwan_reset_resume,\n\t.supports_autosuspend = 1,\n\t.disable_hub_initiated_lpm = 1,\n};\n\nstatic int __init qmi_wwan_driver_init(void)\n{\n#ifdef CONFIG_QCA_NSS_DRV\n\tnss_cb = rcu_dereference(rmnet_nss_callbacks);\n\tif (!nss_cb) {\n\t\tprintk(KERN_ERR \"qmi_wwan_driver_init: driver load must after '/etc/modules.d/42-rmnet-nss'\\n\");\n\t}\n#endif\n\treturn usb_register(&qmi_wwan_driver);\n}\nmodule_init(qmi_wwan_driver_init);\nstatic void __exit qmi_wwan_driver_exit(void)\n{\n\tusb_deregister(&qmi_wwan_driver);\n}\nmodule_exit(qmi_wwan_driver_exit);\n\nMODULE_AUTHOR(\"Bjørn Mork <bjorn@mork.no>\");\nMODULE_DESCRIPTION(\"Qualcomm MSM Interface (QMI) WWAN driver\");\nMODULE_LICENSE(\"GPL\");\nMODULE_VERSION(QUECTEL_WWAN_VERSION);\n"
  },
  {
    "path": "luci-app-qmodem/driver/quectel_QMI_WWAN/src/rmnet_nss.c",
    "content": "/* Copyright (c) 2019, The Linux Foundation. All rights reserved.\n *\n * This program is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License version 2 and\n * only version 2 as published by the Free Software Foundation.\n *\n * This program is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n * GNU General Public License for more details.\n */\n#include <linux/netdevice.h>\n#include <linux/skbuff.h>\n#include <linux/kernel.h>\n#include <linux/init.h>\n#include <linux/module.h>\n#include <linux/moduleparam.h>\n#include <linux/hashtable.h>\n#include <linux/if_ether.h>\n#include <linux/ip.h>\n#include <qca-nss-drv/nss_api_if.h>\n\n#include <linux/rmnet_nss.h>\n\n#define RMNET_NSS_HASH_BITS 8\n#define hash_add_ptr(table, node, key) \\\n\thlist_add_head(node, &table[hash_ptr(key, HASH_BITS(table))])\n\nstatic DEFINE_HASHTABLE(rmnet_nss_ctx_hashtable, RMNET_NSS_HASH_BITS);\n\nstruct rmnet_nss_ctx {\n\tstruct hlist_node hnode;\n\tstruct net_device *rmnet_dev;\n\tstruct nss_rmnet_rx_handle *nss_ctx;\n};\n\nenum __rmnet_nss_stat {\n\tRMNET_NSS_RX_ETH,\n\tRMNET_NSS_RX_FAIL,\n\tRMNET_NSS_RX_NON_ETH,\n\tRMNET_NSS_RX_BUSY,\n\tRMNET_NSS_TX_NO_CTX,\n\tRMNET_NSS_TX_SUCCESS,\n\tRMNET_NSS_TX_FAIL,\n\tRMNET_NSS_TX_NONLINEAR,\n\tRMNET_NSS_TX_BAD_IP,\n\tRMNET_NSS_EXCEPTIONS,\n\tRMNET_NSS_EX_BAD_HDR,\n\tRMNET_NSS_EX_BAD_IP,\n\tRMNET_NSS_EX_SUCCESS,\n\tRMNET_NSS_TX_BAD_FRAGS,\n\tRMNET_NSS_TX_LINEARIZE_FAILS,\n\tRMNET_NSS_TX_NON_ZERO_HEADLEN_FRAGS,\n\tRMNET_NSS_TX_BUSY_LOOP,\n\tRMNET_NSS_NUM_STATS,\n};\n\nstatic unsigned long rmnet_nss_stats[RMNET_NSS_NUM_STATS];\n\n#define RMNET_NSS_STAT(name, counter, desc) \\\n\tmodule_param_named(name, rmnet_nss_stats[counter], ulong, 0444); \\\n\tMODULE_PARM_DESC(name, desc)\n\nRMNET_NSS_STAT(rmnet_nss_rx_ethernet, RMNET_NSS_RX_ETH,\n\t       \"Number of Ethernet headers successfully removed\");\nRMNET_NSS_STAT(rmnet_nss_rx_fail, RMNET_NSS_RX_FAIL,\n\t       \"Number of Ethernet headers that could not be removed\");\nRMNET_NSS_STAT(rmnet_nss_rx_non_ethernet, RMNET_NSS_RX_NON_ETH,\n\t       \"Number of non-Ethernet packets received\");\nRMNET_NSS_STAT(rmnet_nss_rx_busy, RMNET_NSS_RX_BUSY,\n\t       \"Number of packets dropped decause rmnet_data device was busy\");\nRMNET_NSS_STAT(rmnet_nss_tx_slow, RMNET_NSS_TX_NO_CTX,\n\t       \"Number of packets sent over non-NSS-accelerated rmnet device\");\nRMNET_NSS_STAT(rmnet_nss_tx_fast, RMNET_NSS_TX_SUCCESS,\n\t       \"Number of packets sent over NSS-accelerated rmnet device\");\nRMNET_NSS_STAT(rmnet_nss_tx_fail, RMNET_NSS_TX_FAIL,\n\t       \"Number of packets that NSS could not transmit\");\nRMNET_NSS_STAT(rmnet_nss_tx_nonlinear, RMNET_NSS_TX_NONLINEAR,\n\t       \"Number of non linear sent over NSS-accelerated rmnet device\");\nRMNET_NSS_STAT(rmnet_nss_tx_invalid_ip, RMNET_NSS_TX_BAD_IP,\n\t       \"Number of ingress packets with invalid IP headers\");\nRMNET_NSS_STAT(rmnet_nss_tx_invalid_frags, RMNET_NSS_TX_BAD_FRAGS,\n\t       \"Number of ingress packets with invalid frag format\");\nRMNET_NSS_STAT(rmnet_nss_tx_linearize_fail, RMNET_NSS_TX_LINEARIZE_FAILS,\n\t       \"Number of ingress packets where linearize in tx fails\");\nRMNET_NSS_STAT(rmnet_nss_tx_exceptions, RMNET_NSS_EXCEPTIONS,\n\t       \"Number of times our DL exception handler was invoked\");\nRMNET_NSS_STAT(rmnet_nss_exception_non_ethernet, RMNET_NSS_EX_BAD_HDR,\n\t       \"Number of non-Ethernet exception packets\");\nRMNET_NSS_STAT(rmnet_nss_exception_invalid_ip, RMNET_NSS_EX_BAD_IP,\n\t       \"Number of exception packets with invalid IP headers\");\nRMNET_NSS_STAT(rmnet_nss_exception_success, RMNET_NSS_EX_SUCCESS,\n\t       \"Number of exception packets handled successfully\");\nRMNET_NSS_STAT(rmnet_nss_tx_non_zero_headlen_frags, RMNET_NSS_TX_NON_ZERO_HEADLEN_FRAGS,\n\t       \"Number of packets with non zero headlen\");\nRMNET_NSS_STAT(rmnet_nss_tx_busy_loop, RMNET_NSS_TX_BUSY_LOOP,\n\t       \"Number of times tx packets busy looped\");\n\nstatic void rmnet_nss_inc_stat(enum __rmnet_nss_stat stat)\n{\n\tif (stat >= 0 && stat < RMNET_NSS_NUM_STATS)\n\t\trmnet_nss_stats[stat]++;\n}\n\nstatic struct rmnet_nss_ctx *rmnet_nss_find_ctx(struct net_device *dev)\n{\n\tstruct rmnet_nss_ctx *ctx;\n\tstruct hlist_head *bucket;\n\tu32 hash;\n\n\thash = hash_ptr(dev, HASH_BITS(rmnet_nss_ctx_hashtable));\n\tbucket = &rmnet_nss_ctx_hashtable[hash];\n\thlist_for_each_entry(ctx, bucket, hnode) {\n\t\tif (ctx->rmnet_dev == dev)\n\t\t\treturn ctx;\n\t}\n\n\treturn NULL;\n}\n\nstatic void rmnet_nss_free_ctx(struct rmnet_nss_ctx *ctx)\n{\n\tif (ctx) {\n\t\thash_del(&ctx->hnode);\n\t\tnss_rmnet_rx_xmit_callback_unregister(ctx->nss_ctx);\n\t\tnss_rmnet_rx_destroy_sync(ctx->nss_ctx);\n\t\tkfree(ctx);\n\t}\n}\n\n/* Pull off an ethernet header, if possible */\nstatic int rmnet_nss_ethhdr_pull(struct sk_buff *skb)\n{\n\tif (!skb->protocol || skb->protocol == htons(ETH_P_802_3)) {\n\t\tvoid *ret = skb_pull(skb, sizeof(struct ethhdr));\n\n\t\trmnet_nss_inc_stat((ret) ? RMNET_NSS_RX_ETH :\n\t\t\t\t\t   RMNET_NSS_RX_FAIL);\n\t\treturn !ret;\n\t}\n\n\trmnet_nss_inc_stat(RMNET_NSS_RX_NON_ETH);\n\treturn -1;\n}\n\n/* Copy headers to linear section for non linear packets */\nstatic int rmnet_nss_adjust_header(struct sk_buff *skb)\n{\n\tstruct iphdr *iph;\n\tskb_frag_t *frag;\n\tint bytes = 0;\n\tu8 transport;\n\n\tif (skb_shinfo(skb)->nr_frags != 1) {\n\t\trmnet_nss_inc_stat(RMNET_NSS_TX_BAD_FRAGS);\n\t\treturn -EINVAL;\n\t}\n\n\tif (skb_headlen(skb)) {\n\t\trmnet_nss_inc_stat(RMNET_NSS_TX_NON_ZERO_HEADLEN_FRAGS);\n\t\treturn 0;\n\t}\n\n\tfrag = &skb_shinfo(skb)->frags[0];\n\n\tiph = (struct iphdr *)(skb_frag_address(frag));\n\n\tif (iph->version == 4) {\n\t\tbytes = iph->ihl*4;\n\t\ttransport = iph->protocol;\n\t} else if (iph->version == 6) {\n\t\tstruct ipv6hdr *ip6h = (struct ipv6hdr *)iph;\n\n\t\tbytes = sizeof(struct ipv6hdr);\n\t\t/* Dont have to account for extension headers yet */\n\t\ttransport = ip6h->nexthdr;\n\t} else {\n\t\trmnet_nss_inc_stat(RMNET_NSS_TX_BAD_IP);\n\t\treturn -EINVAL;\n\t}\n\n\tif (transport == IPPROTO_TCP) {\n\t\tstruct tcphdr *th;\n\n\t\tth = (struct tcphdr *)((u8 *)iph + bytes);\n\t\tbytes += th->doff * 4;\n\t} else if (transport == IPPROTO_UDP) {\n\t\tbytes += sizeof(struct udphdr);\n\t} else {\n\t\t/* cant do anything else here unfortunately so linearize */\n\t\tif (skb_linearize(skb)) {\n\t\t\trmnet_nss_inc_stat(RMNET_NSS_TX_LINEARIZE_FAILS);\n\t\t\treturn -EINVAL;\n\t\t} else {\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tif (bytes > skb_frag_size(frag)) {\n\t\trmnet_nss_inc_stat(RMNET_NSS_TX_BAD_FRAGS);\n\t\treturn -EINVAL;\n\t}\n\n\tskb_push(skb, bytes);\n\tmemcpy(skb->data, iph, bytes);\n\n\t/* subtract to account for skb_push */\n\tskb->len -= bytes;\n\n\tfrag->page_offset += bytes;\n\tskb_frag_size_sub(frag, bytes);\n\n\t/* subtract to account for skb_frag_size_sub */\n\tskb->data_len -= bytes;\n\n\treturn 0;\n}\n\n/* Main downlink handler\n * Looks up NSS contex associated with the device. If the context is found,\n * we add a dummy ethernet header with the approriate protocol field set,\n * the pass the packet off to NSS for hardware acceleration.\n */\nint rmnet_nss_tx(struct sk_buff *skb)\n{\n\tstruct ethhdr *eth;\n\tstruct rmnet_nss_ctx *ctx;\n\tstruct net_device *dev = skb->dev;\n\tnss_tx_status_t rc;\n\tunsigned int len;\n\tu8 version;\n\n\tif (skb_is_nonlinear(skb)) {\n\t\tif (rmnet_nss_adjust_header(skb))\n\t\t\tgoto fail;\n\t\telse\n\t\t\trmnet_nss_inc_stat(RMNET_NSS_TX_NONLINEAR);\n\t}\n\n\tversion = ((struct iphdr *)skb->data)->version;\n\n\tctx = rmnet_nss_find_ctx(dev);\n\tif (!ctx) {\n\t\trmnet_nss_inc_stat(RMNET_NSS_TX_NO_CTX);\n\t\treturn -EINVAL;\n\t}\n\n\teth = (struct ethhdr *)skb_push(skb, sizeof(*eth));\n\tmemset(&eth->h_dest, 0, ETH_ALEN * 2);\n\tif (version == 4) {\n\t\teth->h_proto = htons(ETH_P_IP);\n\t} else if (version == 6) {\n\t\teth->h_proto = htons(ETH_P_IPV6);\n\t} else {\n\t\trmnet_nss_inc_stat(RMNET_NSS_TX_BAD_IP);\n\t\tgoto fail;\n\t}\n\n\tskb->protocol = htons(ETH_P_802_3);\n\t/* Get length including ethhdr */\n\tlen = skb->len;\n\ntransmit:\n\trc = nss_rmnet_rx_tx_buf(ctx->nss_ctx, skb);\n\tif (rc == NSS_TX_SUCCESS) {\n\t\t/* Increment rmnet_data device stats.\n\t\t * Don't call rmnet_data_vnd_rx_fixup() to do this, as\n\t\t * there's no guarantee the skb pointer is still valid.\n\t\t */\n\t\tdev->stats.rx_packets++;\n\t\tdev->stats.rx_bytes += len;\n\t\trmnet_nss_inc_stat(RMNET_NSS_TX_SUCCESS);\n\t\treturn 0;\n\t} else if (rc == NSS_TX_FAILURE_QUEUE) {\n\t\trmnet_nss_inc_stat(RMNET_NSS_TX_BUSY_LOOP);\n\t\tgoto transmit;\n\t}\n\nfail:\n\trmnet_nss_inc_stat(RMNET_NSS_TX_FAIL);\n\tkfree_skb(skb);\n\treturn 1;\n}\n\n/* Called by NSS in the DL exception case.\n * Since the packet cannot be sent over the accelerated path, we need to\n * handle it. Remove the ethernet header and pass it onward to the stack\n * if possible.\n */\nvoid rmnet_nss_receive(struct net_device *dev, struct sk_buff *skb,\n\t\t       struct napi_struct *napi)\n{\n\trmnet_nss_inc_stat(RMNET_NSS_EXCEPTIONS);\n\n\tif (!skb)\n\t\treturn;\n\n\tif (rmnet_nss_ethhdr_pull(skb)) {\n\t\trmnet_nss_inc_stat(RMNET_NSS_EX_BAD_HDR);\n\t\tgoto drop;\n\t}\n\n\t/* reset header pointers */\n\tskb_reset_transport_header(skb);\n\tskb_reset_network_header(skb);\n\tskb_reset_mac_header(skb);\n\n\t/* reset packet type */\n\tskb->pkt_type = PACKET_HOST;\n\n\tskb->dev = dev;\n\n\t/* reset protocol type */\n\tswitch (skb->data[0] & 0xF0) {\n\tcase 0x40:\n\t\tskb->protocol = htons(ETH_P_IP);\n\t\tbreak;\n\tcase 0x60:\n\t\tskb->protocol = htons(ETH_P_IPV6);\n\t\tbreak;\n\tdefault:\n\t\trmnet_nss_inc_stat(RMNET_NSS_EX_BAD_IP);\n\t\tgoto drop;\n\t}\n\n\trmnet_nss_inc_stat(RMNET_NSS_EX_SUCCESS);\n\n\t/* Set this so that we dont loop around netif_receive_skb */\n\n\tskb->cb[0] = 1;\n\n\tnetif_receive_skb(skb);\n\treturn;\n\ndrop:\n\tkfree_skb(skb);\n}\n\n/* Called by NSS in the UL acceleration case.\n * We are guaranteed to have an ethernet packet here from the NSS hardware,\n * We need to pull the header off and invoke our ndo_start_xmit function\n * to handle transmitting the packet to the network stack.\n */\nvoid rmnet_nss_xmit(struct net_device *dev, struct sk_buff *skb)\n{\n\tnetdev_tx_t ret;\n\n\tskb_pull(skb, sizeof(struct ethhdr));\n\trmnet_nss_inc_stat(RMNET_NSS_RX_ETH);\n\n\t/* NSS takes care of shaping, so bypassing Qdiscs like this is OK */\n\tret = dev->netdev_ops->ndo_start_xmit(skb, dev);\n\tif (unlikely(ret == NETDEV_TX_BUSY)) {\n\t\tdev_kfree_skb_any(skb);\n\t\trmnet_nss_inc_stat(RMNET_NSS_RX_BUSY);\n\t}\n}\n\n/* Create and register an NSS context for an rmnet_data device */\nint rmnet_nss_create_vnd(struct net_device *dev)\n{\n\tstruct rmnet_nss_ctx *ctx;\n\n\tctx = kzalloc(sizeof(*ctx), GFP_ATOMIC);\n\tif (!ctx)\n\t\treturn -ENOMEM;\n\n\tctx->rmnet_dev = dev;\n\tctx->nss_ctx = nss_rmnet_rx_create_sync_nexthop(dev, NSS_N2H_INTERFACE,\n\t\t\t\t\t\t       NSS_C2C_TX_INTERFACE);\n\tif (!ctx->nss_ctx) {\n\t\tkfree(ctx);\n\t\treturn -1;\n\t}\n\n\tnss_rmnet_rx_register(ctx->nss_ctx, rmnet_nss_receive, dev);\n\tnss_rmnet_rx_xmit_callback_register(ctx->nss_ctx, rmnet_nss_xmit);\n\thash_add_ptr(rmnet_nss_ctx_hashtable, &ctx->hnode, dev);\n\treturn 0;\n}\n\n/* Unregister and destroy the NSS context for an rmnet_data device */\nint rmnet_nss_free_vnd(struct net_device *dev)\n{\n\tstruct rmnet_nss_ctx *ctx;\n\n\tctx = rmnet_nss_find_ctx(dev);\n\trmnet_nss_free_ctx(ctx);\n\n\treturn 0;\n}\n\nstatic const struct rmnet_nss_cb rmnet_nss = {\n\t.nss_create = rmnet_nss_create_vnd,\n\t.nss_free = rmnet_nss_free_vnd,\n\t.nss_tx = rmnet_nss_tx,\n};\n\nint __init rmnet_nss_init(void)\n{\n\tpr_err(\"%s(): initializing rmnet_nss\\n\", __func__);\n\tRCU_INIT_POINTER(rmnet_nss_callbacks, &rmnet_nss);\n\treturn 0;\n}\n\nvoid __exit rmnet_nss_exit(void)\n{\n\tstruct hlist_node *tmp;\n\tstruct rmnet_nss_ctx *ctx;\n\tint bkt;\n\n\tpr_err(\"%s(): exiting rmnet_nss\\n\", __func__);\n\tRCU_INIT_POINTER(rmnet_nss_callbacks, NULL);\n\n\t/* Tear down all NSS contexts */\n\thash_for_each_safe(rmnet_nss_ctx_hashtable, bkt, tmp, ctx, hnode)\n\t\trmnet_nss_free_ctx(ctx);\n}\n\n#if 0\nMODULE_LICENSE(\"GPL v2\");\nmodule_init(rmnet_nss_init);\nmodule_exit(rmnet_nss_exit);\n#endif\n"
  },
  {
    "path": "luci-app-qmodem/driver/simcom_QMI_WWAN/Makefile",
    "content": "#\n# Copyright (C) 2015 OpenWrt.org\n#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=qmi_wwan_s\nPKG_VERSION:=1.0\nPKG_RELEASE:=2\n\ninclude $(INCLUDE_DIR)/kernel.mk\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine KernelPackage/qmi_wwan_s\n  SUBMENU:=WWAN Support\n  TITLE:=Simcom Linux USB QMI WWAN Driver\n  DEPENDS:=+kmod-usb-net +kmod-usb-wdm\n  KCONFIG:= \\\n\tCONFIG_USB_USBNET \\\n\tCONFIG_USB_NET_DRIVERS \\\n\tCONFIG_USB_WDM\n  FILES:=$(PKG_BUILD_DIR)/qmi_wwan_s.ko\n  AUTOLOAD:=$(call AutoLoad,82,qmi_wwan_s)\nendef\n\ndefine KernelPackage/qmi_wwan_s/description\n  Simcom Linux USB QMI WWAN Driver\nendef\n\nEXTRA_CFLAGS+= \\\n\t-Wno-unused-function \\\n\t-Wno-missing-prototypes \\\n\t-Wno-missing-declarations\n\nMAKE_OPTS:= \\\n\tARCH=\"$(LINUX_KARCH)\" \\\n\tCROSS_COMPILE=\"$(TARGET_CROSS)\" \\\n\tCXXFLAGS=\"$(TARGET_CXXFLAGS)\" \\\n\tM=\"$(PKG_BUILD_DIR)\" \\\n\tEXTRA_CFLAGS=\"$(EXTRA_CFLAGS)\" \\\n\t$(EXTRA_KCONFIG)\n\ndefine Build/Prepare\n\tmkdir -p $(PKG_BUILD_DIR)\n\t$(CP) ./src/* $(PKG_BUILD_DIR)/\nendef\n\ndefine Build/Compile\n\t$(MAKE) -C \"$(LINUX_DIR)\" \\\n\t\t$(MAKE_OPTS) \\\n\t\tmodules\nendef\n\n$(eval $(call KernelPackage,qmi_wwan_s))\n"
  },
  {
    "path": "luci-app-qmodem/driver/simcom_QMI_WWAN/src/Makefile",
    "content": "obj-m += qmi_wwan_s.o\n\nPWD := $(shell pwd)\nOUTPUTDIR=/lib/modules/`uname -r`/kernel/drivers/net/usb/\n\nifeq ($(ARCH),)\nARCH := $(shell uname -m)\nendif\nifeq ($(CROSS_COMPILE),)\nCROSS_COMPILE :=\nendif\nifeq ($(KDIR),)\nKDIR := /lib/modules/$(shell uname -r)/build\nifeq ($(ARCH),i686)\nifeq ($(wildcard $KDIR/arch/$ARCH),)\nARCH=i386\nendif\nendif\nendif\n\nifneq ($(findstring &,${PWD}),)\n$(warning \"${PWD}\")\n$(warning \"current directory contain special char '&' !\")\n$(error \"please remove it!\")\nendif\n\ndefault:\n\t$(MAKE) ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} -C $(KDIR) M=$(PWD) modules\n\ninstall: default\n\tcp $(PWD)/qmi_wwan_s.ko /lib/modules/$(shell uname -r)/kernel/drivers/net/usb/\n\tdepmod\n\tmodprobe -r qmi_wwan_s\n\tmodprobe -r qmi_wwan\n\tmodprobe qmi_wwan_s\nclean:\n\trm -rf *~ .tmp_versions modules.order Module.symvers\n\tfind . -type f -name \"*~\" -o -name \"*.o\" -o -name \"*.ko\" -o -name \"*.cmd\" -o -name \"*.mod.c\" |  xargs rm -rf\n"
  },
  {
    "path": "luci-app-qmodem/driver/simcom_QMI_WWAN/src/qmi_wwan_s.c",
    "content": "/*\n * Copyright (c) 2012  Bjørn Mork <bjorn@mork.no>\n *\n * The probing code is heavily inspired by cdc_ether, which is:\n * Copyright (C) 2003-2005 by David Brownell\n * Copyright (C) 2006 by Ole Andre Vadla Ravnas (ActiveSync)\n *\n * This program is free software; you can redistribute it and/or\n * modify it under the terms of the GNU General Public License\n * version 2 as published by the Free Software Foundation.\n */\n\n#include <linux/module.h>\n#include <linux/version.h>\n#include <linux/netdevice.h>\n#include <linux/ethtool.h>\n#include <linux/etherdevice.h>\n#include <linux/mii.h>\n#include <linux/usb.h>\n#include <linux/usb/cdc.h>\n#include <linux/usb/usbnet.h>\n#include <linux/usb/cdc-wdm.h>\n\n/* This driver supports wwan (3G/LTE/?) devices using a vendor\n * specific management protocol called Qualcomm MSM Interface (QMI) -\n * in addition to the more common AT commands over serial interface\n * management\n *\n * QMI is wrapped in CDC, using CDC encapsulated commands on the\n * control (\"master\") interface of a two-interface CDC Union\n * resembling standard CDC ECM.  The devices do not use the control\n * interface for any other CDC messages.  Most likely because the\n * management protocol is used in place of the standard CDC\n * notifications NOTIFY_NETWORK_CONNECTION and NOTIFY_SPEED_CHANGE\n *\n * Alternatively, control and data functions can be combined in a\n * single USB interface.\n *\n * Handling a protocol like QMI is out of the scope for any driver.\n * It is exported as a character device using the cdc-wdm driver as\n * a subdriver, enabling userspace applications (\"modem managers\") to\n * handle it.\n *\n * These devices may alternatively/additionally be configured using AT\n * commands on a serial interface\n */\n\n/* driver specific data */\nstruct qmi_wwan_state {\n\tstruct usb_driver *subdriver;\n\tatomic_t pmcount;\n\tunsigned long unused;\n\tstruct usb_interface *control;\n\tstruct usb_interface *data;\n};\n\n/* default ethernet address used by the modem */\nstatic const u8 default_modem_addr[ETH_ALEN] = {0x02, 0x50, 0xf3};\n\n/* Make up an ethernet header if the packet doesn't have one.\n *\n * A firmware bug common among several devices cause them to send raw\n * IP packets under some circumstances.  There is no way for the\n * driver/host to know when this will happen.  And even when the bug\n * hits, some packets will still arrive with an intact header.\n *\n * The supported devices are only capably of sending IPv4, IPv6 and\n * ARP packets on a point-to-point link. Any packet with an ethernet\n * header will have either our address or a broadcast/multicast\n * address as destination.  ARP packets will always have a header.\n *\n * This means that this function will reliably add the appropriate\n * header iff necessary, provided our hardware address does not start\n * with 4 or 6.\n *\n * Another common firmware bug results in all packets being addressed\n * to 00:a0:c6:00:00:00 despite the host address being different.\n * This function will also fixup such packets.\n */\nstatic int qmi_wwan_rx_fixup(struct usbnet *dev, struct sk_buff *skb)\n{\n\t__be16 proto;\n\n\t/* This check is no longer done by usbnet */\n\tif (skb->len < dev->net->hard_header_len)\n\t\treturn 0;\n\n\tswitch (skb->data[0] & 0xf0) {\n\tcase 0x40:\n\t\tproto = htons(ETH_P_IP);\n\t\tbreak;\n\tcase 0x60:\n\t\tproto = htons(ETH_P_IPV6);\n\t\tbreak;\n\tcase 0x00:\n\t\tif (is_multicast_ether_addr(skb->data))\n\t\t\treturn 1;\n\t\t/* possibly bogus destination - rewrite just in case */\n\t\tskb_reset_mac_header(skb);\n\t\tgoto fix_dest;\n\tdefault:\n\t\t/* pass along other packets without modifications */\n\t\treturn 1;\n\t}\n\tif (skb_headroom(skb) < ETH_HLEN)\n\t\treturn 0;\n\tskb_push(skb, ETH_HLEN);\n\tskb_reset_mac_header(skb);\n\teth_hdr(skb)->h_proto = proto;\n\tmemset(eth_hdr(skb)->h_source, 0, ETH_ALEN);\nfix_dest:\n\tmemcpy(eth_hdr(skb)->h_dest, dev->net->dev_addr, ETH_ALEN);\n\treturn 1;\n}\n\nstruct sk_buff *qmi_wwan_tx_fixup(struct usbnet *dev, struct sk_buff *skb, gfp_t flags)\n{\n\tif (dev->udev->descriptor.idVendor != cpu_to_le16(0x1e0e))\n\t\treturn skb;\n\t//skip ethernet header\n\tif (skb_pull(skb, ETH_HLEN))\n\t{\n\t\treturn skb;\n\t}\n\telse\n\t{\n\t\tdev_err(&dev->intf->dev, \"Packet Dropped\\n\");\n\t}\n\n\tif (skb != NULL)\n\t\tdev_kfree_skb_any(skb);\n\n\treturn NULL;\n}\n\n/* very simplistic detection of IPv4 or IPv6 headers */\nstatic bool possibly_iphdr(const char *data)\n{\n\treturn (data[0] & 0xd0) == 0x40;\n}\n\n/* disallow addresses which may be confused with IP headers */\nstatic int qmi_wwan_mac_addr(struct net_device *dev, void *p)\n{\n\tint ret;\n\tstruct sockaddr *addr = p;\n\n\tret = eth_prepare_mac_addr_change(dev, p);\n\tif (ret < 0)\n\t\treturn ret;\n\tif (possibly_iphdr(addr->sa_data))\n\t\treturn -EADDRNOTAVAIL;\n\teth_commit_mac_addr_change(dev, p);\n\treturn 0;\n}\n\nstatic const struct net_device_ops qmi_wwan_netdev_ops = {\n\t.ndo_open\t\t= usbnet_open,\n\t.ndo_stop\t\t= usbnet_stop,\n\t.ndo_start_xmit\t\t= usbnet_start_xmit,\n\t.ndo_tx_timeout\t\t= usbnet_tx_timeout,\n\t.ndo_change_mtu\t\t= usbnet_change_mtu,\n\t.ndo_set_mac_address\t= qmi_wwan_mac_addr,\n\t.ndo_validate_addr\t= eth_validate_addr,\n};\n\n/* using a counter to merge subdriver requests with our own into a\n * combined state\n */\nstatic int qmi_wwan_manage_power(struct usbnet *dev, int on)\n{\n\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\tint rv;\n\n\tdev_dbg(&dev->intf->dev, \"%s() pmcount=%d, on=%d\\n\", __func__,\n\t\tatomic_read(&info->pmcount), on);\n\n\tif ((on && atomic_add_return(1, &info->pmcount) == 1) ||\n\t    (!on && atomic_dec_and_test(&info->pmcount))) {\n\t\t/* need autopm_get/put here to ensure the usbcore sees\n\t\t * the new value\n\t\t */\n\t\trv = usb_autopm_get_interface(dev->intf);\n\t\tdev->intf->needs_remote_wakeup = on;\n\t\tif (!rv)\n\t\t\tusb_autopm_put_interface(dev->intf);\n\t}\n\treturn 0;\n}\n\nstatic int qmi_wwan_cdc_wdm_manage_power(struct usb_interface *intf, int on)\n{\n\tstruct usbnet *dev = usb_get_intfdata(intf);\n\n\t/* can be called while disconnecting */\n\tif (!dev)\n\t\treturn 0;\n\treturn qmi_wwan_manage_power(dev, on);\n}\n\n/* collect all three endpoints and register subdriver */\nstatic int qmi_wwan_register_subdriver(struct usbnet *dev)\n{\n\tint rv;\n\tstruct usb_driver *subdriver = NULL;\n\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\n\t/* collect bulk endpoints */\n\trv = usbnet_get_endpoints(dev, info->data);\n\tif (rv < 0)\n\t\tgoto err;\n\n\t/* update status endpoint if separate control interface */\n\tif (info->control != info->data)\n\t\tdev->status = &info->control->cur_altsetting->endpoint[0];\n\n\t/* require interrupt endpoint for subdriver */\n\tif (!dev->status) {\n\t\trv = -EINVAL;\n\t\tgoto err;\n\t}\n\n\t/* for subdriver power management */\n\tatomic_set(&info->pmcount, 0);\n\n\t/* register subdriver */\n#if (LINUX_VERSION_CODE > KERNEL_VERSION( 5,12,0 ))\n\tsubdriver = usb_cdc_wdm_register(info->control, &dev->status->desc,\n\t\t\t\t\t 4096, WWAN_PORT_QMI, &qmi_wwan_cdc_wdm_manage_power);\n#else\n\tsubdriver = usb_cdc_wdm_register(info->control, &dev->status->desc,\n\t\t\t\t\t 4096, &qmi_wwan_cdc_wdm_manage_power);\n#endif\n\tif (IS_ERR(subdriver)) {\n\t\tdev_err(&info->control->dev, \"subdriver registration failed\\n\");\n\t\trv = PTR_ERR(subdriver);\n\t\tgoto err;\n\t}\n\n\t/* prevent usbnet from using status endpoint */\n\tdev->status = NULL;\n\n\t/* save subdriver struct for suspend/resume wrappers */\n\tinfo->subdriver = subdriver;\n\nerr:\n\treturn rv;\n}\n\nstatic int qmi_wwan_bind(struct usbnet *dev, struct usb_interface *intf)\n{\n\tint status = -1;\n\tu8 *buf = intf->cur_altsetting->extra;\n\tint len = intf->cur_altsetting->extralen;\n\tstruct usb_interface_descriptor *desc = &intf->cur_altsetting->desc;\n\tstruct usb_cdc_union_desc *cdc_union = NULL;\n\tstruct usb_cdc_ether_desc *cdc_ether = NULL;\n\tu32 found = 0;\n\tstruct usb_driver *driver = driver_of(intf);\n\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\n\tBUILD_BUG_ON((sizeof(((struct usbnet *)0)->data) <\n\t\t      sizeof(struct qmi_wwan_state)));\n\n\t/* set up initial state */\n\tinfo->control = intf;\n\tinfo->data = intf;\n\n\t/* and a number of CDC descriptors */\n\twhile (len > 3) {\n\t\tstruct usb_descriptor_header *h = (void *)buf;\n\n\t\t/* ignore any misplaced descriptors */\n\t\tif (h->bDescriptorType != USB_DT_CS_INTERFACE)\n\t\t\tgoto next_desc;\n\n\t\t/* buf[2] is CDC descriptor subtype */\n\t\tswitch (buf[2]) {\n\t\tcase USB_CDC_HEADER_TYPE:\n\t\t\tif (found & 1 << USB_CDC_HEADER_TYPE) {\n\t\t\t\tdev_dbg(&intf->dev, \"extra CDC header\\n\");\n\t\t\t\tgoto err;\n\t\t\t}\n\t\t\tif (h->bLength != sizeof(struct usb_cdc_header_desc)) {\n\t\t\t\tdev_dbg(&intf->dev, \"CDC header len %u\\n\",\n\t\t\t\t\th->bLength);\n\t\t\t\tgoto err;\n\t\t\t}\n\t\t\tbreak;\n\t\tcase USB_CDC_UNION_TYPE:\n\t\t\tif (found & 1 << USB_CDC_UNION_TYPE) {\n\t\t\t\tdev_dbg(&intf->dev, \"extra CDC union\\n\");\n\t\t\t\tgoto err;\n\t\t\t}\n\t\t\tif (h->bLength != sizeof(struct usb_cdc_union_desc)) {\n\t\t\t\tdev_dbg(&intf->dev, \"CDC union len %u\\n\",\n\t\t\t\t\th->bLength);\n\t\t\t\tgoto err;\n\t\t\t}\n\t\t\tcdc_union = (struct usb_cdc_union_desc *)buf;\n\t\t\tbreak;\n\t\tcase USB_CDC_ETHERNET_TYPE:\n\t\t\tif (found & 1 << USB_CDC_ETHERNET_TYPE) {\n\t\t\t\tdev_dbg(&intf->dev, \"extra CDC ether\\n\");\n\t\t\t\tgoto err;\n\t\t\t}\n\t\t\tif (h->bLength != sizeof(struct usb_cdc_ether_desc)) {\n\t\t\t\tdev_dbg(&intf->dev, \"CDC ether len %u\\n\",\n\t\t\t\t\th->bLength);\n\t\t\t\tgoto err;\n\t\t\t}\n\t\t\tcdc_ether = (struct usb_cdc_ether_desc *)buf;\n\t\t\tbreak;\n\t\t}\n\n\t\t/* Remember which CDC functional descriptors we've seen.  Works\n\t\t * for all types we care about, of which USB_CDC_ETHERNET_TYPE\n\t\t * (0x0f) is the highest numbered\n\t\t */\n\t\tif (buf[2] < 32)\n\t\t\tfound |= 1 << buf[2];\n\nnext_desc:\n\t\tlen -= h->bLength;\n\t\tbuf += h->bLength;\n\t}\n\n\t/* Use separate control and data interfaces if we found a CDC Union */\n\tif (cdc_union) {\n\t\tinfo->data = usb_ifnum_to_if(dev->udev,\n\t\t\t\t\t     cdc_union->bSlaveInterface0);\n\t\tif (desc->bInterfaceNumber != cdc_union->bMasterInterface0 ||\n\t\t    !info->data) {\n\t\t\tdev_err(&intf->dev,\n\t\t\t\t\"bogus CDC Union: master=%u, slave=%u\\n\",\n\t\t\t\tcdc_union->bMasterInterface0,\n\t\t\t\tcdc_union->bSlaveInterface0);\n\t\t\tgoto err;\n\t\t}\n\t}\n\n\t/* errors aren't fatal - we can live with the dynamic address */\n\tif (cdc_ether && cdc_ether->wMaxSegmentSize) {\n\t\tdev->hard_mtu = le16_to_cpu(cdc_ether->wMaxSegmentSize);\n\t\tusbnet_get_ethernet_addr(dev, cdc_ether->iMACAddress);\n\t}\n\n\t/* claim data interface and set it up */\n\tif (info->control != info->data) {\n\t\tstatus = usb_driver_claim_interface(driver, info->data, dev);\n\t\tif (status < 0)\n\t\t\tgoto err;\n\t}\n\n\tstatus = qmi_wwan_register_subdriver(dev);\n\tif (status < 0 && info->control != info->data) {\n\t\tusb_set_intfdata(info->data, NULL);\n\t\tusb_driver_release_interface(driver, info->data);\n\t}\n\n\t/* Never use the same address on both ends of the link, even\n\t * if the buggy firmware told us to.\n\t */\n\tif (ether_addr_equal(dev->net->dev_addr, default_modem_addr))\n\t\teth_hw_addr_random(dev->net);\n\n\t/* make MAC addr easily distinguishable from an IP header */\n\tif (possibly_iphdr(dev->net->dev_addr)) {\n#if LINUX_VERSION_CODE < KERNEL_VERSION(5,18,0)\n\t\tdev->net->dev_addr[0] |= 0x02;\t/* set local assignment bit */\n\t\tdev->net->dev_addr[0] &= 0xbf;\t/* clear \"IP\" bit */\n#else\n\t\tu8 addr = dev->net->dev_addr[0];\n\n\t\taddr |= 0x02;\t/* set local assignment bit */\n\t\taddr &= 0xbf;\t/* clear \"IP\" bit */\n\t\tdev_addr_mod(dev->net, 0, &addr, 1);\n#endif\n\t}\n\tdev->net->netdev_ops = &qmi_wwan_netdev_ops;\n\n#if 1 //Added by Simcom\n\tif (dev->udev->descriptor.idVendor == cpu_to_le16(0x1e0e)) {\t\t\n\t\tdev_info(&intf->dev, \"SIMCom 8200 work on RawIP mode\\n\");\n\t\tdev->net->flags |= IFF_NOARP;\n\t\tusb_control_msg(\n\t\t\tinterface_to_usbdev(intf),\n\t\t\tusb_sndctrlpipe(interface_to_usbdev(intf), 0),\n\t\t\t0x22, //USB_CDC_REQ_SET_CONTROL_LINE_STATE\n\t\t\t0x21, //USB_DIR_OUT | USB_TYPE_CLASS | USB_RECIP_INTERFACE\n\t\t\t1, //active CDC DTR\n\t\t\tintf->cur_altsetting->desc.bInterfaceNumber,\n\t\t\tNULL,\n\t\t\t0,\n\t\t\t100\n\t\t\t);\n\t}\n#endif\n\nerr:\n\treturn status;\n}\n\nstatic void qmi_wwan_unbind(struct usbnet *dev, struct usb_interface *intf)\n{\n\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\tstruct usb_driver *driver = driver_of(intf);\n\tstruct usb_interface *other;\n\n\tif (info->subdriver && info->subdriver->disconnect)\n\t\tinfo->subdriver->disconnect(info->control);\n\n\t/* allow user to unbind using either control or data */\n\tif (intf == info->control)\n\t\tother = info->data;\n\telse\n\t\tother = info->control;\n\n\t/* only if not shared */\n\tif (other && intf != other) {\n\t\tusb_set_intfdata(other, NULL);\n\t\tusb_driver_release_interface(driver, other);\n\t}\n\n\tinfo->subdriver = NULL;\n\tinfo->data = NULL;\n\tinfo->control = NULL;\n}\n\n/* suspend/resume wrappers calling both usbnet and the cdc-wdm\n * subdriver if present.\n *\n * NOTE: cdc-wdm also supports pre/post_reset, but we cannot provide\n * wrappers for those without adding usbnet reset support first.\n */\nstatic int qmi_wwan_suspend(struct usb_interface *intf, pm_message_t message)\n{\n\tstruct usbnet *dev = usb_get_intfdata(intf);\n\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\tint ret;\n\n\t/* Both usbnet_suspend() and subdriver->suspend() MUST return 0\n\t * in system sleep context, otherwise, the resume callback has\n\t * to recover device from previous suspend failure.\n\t */\n\tret = usbnet_suspend(intf, message);\n\tif (ret < 0)\n\t\tgoto err;\n\n\tif (intf == info->control && info->subdriver &&\n\t    info->subdriver->suspend)\n\t\tret = info->subdriver->suspend(intf, message);\n\tif (ret < 0)\n\t\tusbnet_resume(intf);\nerr:\n\treturn ret;\n}\n\nstatic int qmi_wwan_resume(struct usb_interface *intf)\n{\n\tstruct usbnet *dev = usb_get_intfdata(intf);\n\tstruct qmi_wwan_state *info = (void *)&dev->data;\n\tint ret = 0;\n\tbool callsub = (intf == info->control && info->subdriver &&\n\t\t\tinfo->subdriver->resume);\n\n\tif (callsub)\n\t\tret = info->subdriver->resume(intf);\n\tif (ret < 0)\n\t\tgoto err;\n\tret = usbnet_resume(intf);\n\tif (ret < 0 && callsub)\n\t\tinfo->subdriver->suspend(intf, PMSG_SUSPEND);\nerr:\n\treturn ret;\n}\n\nstatic const struct driver_info\tqmi_wwan_info = {\n\t.description\t= \"WWAN/QMI device\",\n\t.flags\t\t= FLAG_WWAN,\n\t.bind\t\t= qmi_wwan_bind,\n\t.unbind\t\t= qmi_wwan_unbind,\n\t.manage_power\t= qmi_wwan_manage_power,\n\t.rx_fixup       = qmi_wwan_rx_fixup,\n};\n\nstatic const struct driver_info qmi_wwan_raw_ip_info = {\n\t.description\t= \"WWAN/QMI device\",\n\t.flags\t\t= FLAG_WWAN,\n\t.bind\t\t= qmi_wwan_bind,\n\t.unbind\t\t= qmi_wwan_unbind,\n\t.manage_power\t= qmi_wwan_manage_power,\n\t.rx_fixup       = qmi_wwan_rx_fixup,\n\t.tx_fixup       = qmi_wwan_tx_fixup,\n};\n\n#define HUAWEI_VENDOR_ID\t0x12D1\n\n/* map QMI/wwan function by a fixed interface number */\n#define QMI_FIXED_INTF(vend, prod, num) \\\n\tUSB_DEVICE_INTERFACE_NUMBER(vend, prod, num), \\\n\t.driver_info = (unsigned long)&qmi_wwan_info\n\n#define QMI_FIXED_RAWIP_INTF(vend, prod, num) \\\n\tUSB_DEVICE_INTERFACE_NUMBER(vend, prod, num), \\\n\t.driver_info = (unsigned long)&qmi_wwan_raw_ip_info\n\n/* Gobi 1000 QMI/wwan interface number is 3 according to qcserial */\n#define QMI_GOBI1K_DEVICE(vend, prod) \\\n\tQMI_FIXED_INTF(vend, prod, 3)\n\n/* Gobi 2000/3000 QMI/wwan interface number is 0 according to qcserial */\n#define QMI_GOBI_DEVICE(vend, prod) \\\n\tQMI_FIXED_INTF(vend, prod, 0)\n\nstatic const struct usb_device_id products[] = {\n\t{QMI_FIXED_RAWIP_INTF(0x1e0e, 0x9001, 5)},  /* SIMCOM 8200 */\n\t{ }\t\t\t\t\t/* END */\n};\nMODULE_DEVICE_TABLE(usb, products);\n\nstatic bool quectel_ec20_detected(struct usb_interface *intf)\n{\n\tstruct usb_device *dev = interface_to_usbdev(intf);\n\n\tif (dev->actconfig &&\n\t    le16_to_cpu(dev->descriptor.idVendor) == 0x05c6 &&\n\t    le16_to_cpu(dev->descriptor.idProduct) == 0x9215 &&\n\t    dev->actconfig->desc.bNumInterfaces == 5)\n\t\treturn true;\n\n\treturn false;\n}\n\nstatic int qmi_wwan_probe(struct usb_interface *intf,\n\t\t\t  const struct usb_device_id *prod)\n{\n\tstruct usb_device_id *id = (struct usb_device_id *)prod;\n\tstruct usb_interface_descriptor *desc = &intf->cur_altsetting->desc;\n\n\t/* Workaround to enable dynamic IDs.  This disables usbnet\n\t * blacklisting functionality.  Which, if required, can be\n\t * reimplemented here by using a magic \"blacklist\" value\n\t * instead of 0 in the static device id table\n\t */\n\tif (!id->driver_info) {\n\t\tdev_dbg(&intf->dev, \"setting defaults for dynamic device id\\n\");\n\t\tid->driver_info = (unsigned long)&qmi_wwan_info;\n\t}\n\n\t/* There are devices where the same interface number can be\n\t * configured as different functions. We should only bind to\n\t * vendor specific functions when matching on interface number\n\t */\n\tif (id->match_flags & USB_DEVICE_ID_MATCH_INT_NUMBER &&\n\t    desc->bInterfaceClass != USB_CLASS_VENDOR_SPEC) {\n\t\tdev_dbg(&intf->dev,\n\t\t\t\"Rejecting interface number match for class %02x\\n\",\n\t\t\tdesc->bInterfaceClass);\n\t\treturn -ENODEV;\n\t}\n\n\t/* Quectel EC20 quirk where we've QMI on interface 4 instead of 0 */\n\tif (quectel_ec20_detected(intf) && desc->bInterfaceNumber == 0) {\n\t\tdev_dbg(&intf->dev, \"Quectel EC20 quirk, skipping interface 0\\n\");\n\t\treturn -ENODEV;\n\t}\n\n\treturn usbnet_probe(intf, id);\n}\n\nstatic struct usb_driver qmi_wwan_driver = {\n\t.name\t\t      = \"qmi_wwan_s\",\n\t.id_table\t      = products,\n\t.probe\t\t      = qmi_wwan_probe,\n\t.disconnect\t      = usbnet_disconnect,\n\t.suspend\t      = qmi_wwan_suspend,\n\t.resume\t\t      =\tqmi_wwan_resume,\n\t.reset_resume         = qmi_wwan_resume,\n\t.supports_autosuspend = 1,\n\t.disable_hub_initiated_lpm = 1,\n};\n\nmodule_usb_driver(qmi_wwan_driver);\n\nMODULE_AUTHOR(\"Bjørn Mork <bjorn@mork.no>\");\nMODULE_DESCRIPTION(\"Qualcomm MSM Interface (QMI) WWAN driver\");\nMODULE_LICENSE(\"GPL\");\nMODULE_VERSION(\"Simcom_Linux_QMI_WWAN_Driver_V1.0\");"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem/Makefile",
    "content": "# Copyright (C) 2024 Tom <fjrcn@outlook.com>\n# This is free software, licensed under the GNU General Public License v3.\n\ninclude $(TOPDIR)/rules.mk\n\n# Include unified version\ninclude ../../version.mk\n\nPKG_NAME:=luci-app-qmodem\nLUCI_TITLE:=LuCI support for QWRT Modem\nLUCI_PKGARCH:=all\nPKG_VERSION:=$(QMODEM_VERSION)\nPKG_RELEASE:=$(QMODEM_RELEASE)\nPKG_LICENSE:=GPLv3\nPKG_LINCESE_FILES:=LICENSE\nPKG_MAINTAINER:=Tom <fjrcn@outlook.com>\nLUCI_DEPENDS:=+luci-compat \\\n\t\t+qmodem \n\n\ndefine Package/luci-app-qmodem/conffiles\n/etc/config/qmodem\nendef\n\ndefine Package/luci-app-qmodem/config\n\nchoice\n  prompt \"IPv6 Neighbor Discovery Selection\"\n  default PACKAGE_luci-app-qmodem_INCLUDE_ndisc6\n\n  config PACKAGE_luci-app-qmodem_INCLUDE_ndisc6\n  bool \"Include ndisc6 for IPv6 Neighbor Discovery\"\n\n  config PACKAGE_luci-app-qmodem_INCLUDE_rdisc6\n  bool \"Include rdisc6 for IPv6 Router Discovery\"\n\n  config PACKAGE_luci-app-qmodem_INCLUDE_no_ndisc_rdisc6\n  bool \"Do not include any IPv6 Neighbor/Router Discovery tool\"\nendchoice\n\nchoice\n  prompt \"Qualcomm QMI WWAN Driver Selection\"\n  default PACKAGE_luci-app-qmodem_INCLUDE_vendor-qmi-wwan\n\n  config PACKAGE_luci-app-qmodem_INCLUDE_vendor-qmi-wwan\n  bool \"Vendor QMI driver\"\n\n  config PACKAGE_luci-app-qmodem_INCLUDE_generic-qmi-wwan\n  bool \"Generic QMI driver\"\nendchoice\n\nchoice \n\tprompt \"MHI PCIe Modem Driver Selection\"\n\tdepends on PACKAGE_luci-app-qmodem_INCLUDE_ADD_PCI_SUPPORT\n\t\n\tconfig PACKAGE_luci-app-qmodem_VENDOR_MHI_PCIe_DRIVER\n\tbool \"Use Vendor MHI PCIe Driver\"\n\n\tconfig  PACKAGE_luci-app-qmodem_GENERIC_MHI_PCIe_DRIVER\n\tbool \"Use Generic MHI PCIe Driver\"\nendchoice\n\nchoice\n  prompt \"Quectel Connect Manager Selection\"\n  default PACKAGE_luci-app-qmodem_USE_TOM_CUSTOMIZED_QUECTEL_CM\n\n\tconfig PACKAGE_luci-app-qmodem_USE_TOM_CUSTOMIZED_QUECTEL_CM\n\tbool \"Tom customized Quectel CM\"\n\n\tconfig PACKAGE_luci-app-qmodem_USING_QWRT_QUECTEL_CM_5G\n\tbool \"QWRT Quectel-CM-5G\"\n\n\tconfig PACKAGE_luci-app-qmodem_USING_NORMAL_QUECTEL_CM\n\tbool \"NORMAL Quectel-CM\"\nendchoice\n\n\tconfig PACKAGE_luci-app-qmodem_INCLUDE_ADD_PCI_SUPPORT\n\t\tbool \"Add PCIe Modem SUPPORT\"\n\t\tdefault n\n\n\tconfig PACKAGE_luci-app-qmodem_INCLUDE_ADD_MTK_T7XX_SUPPORT\n\t\tbool \"Add MTK-T7XX Modem PCI SUPPORT\"\n\t\tdefault n\n\n\tconfig PACKAGE_luci-app-qmodem_INCLUDE_ADD_QFIREHOSE_SUPPORT\n\t\tbool \"Add Qfirehose SUPPORT\"\n\t\tdefault n\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem/htdocs/luci-static/resources/view/status/include/11_modem.js",
    "content": "'use strict';\n'require baseclass';\n'require rpc';\n\nvar callModemInfo = rpc.declare({\n\tobject: 'modem_ctrl',\n\tmethod: 'info'\n});\n\nfunction progressbar(value, max, min, unit) {\n\tvar value = parseInt(value) || 0,\n\t\tmax = parseInt(max) || 100,\n\t\tmin = parseInt(min) || 0,\n\t\tunit = unit || '',\n\t\tpc = Math.floor((100 / (max - min)) * (value - min));\n\n\treturn E('div', {\n\t\t'class': 'cbi-progressbar',\n\t\t'title': '%s / %s%s (%d%%)'.format(value, max, unit,pc)\n\t}, E('div', { 'style': 'width:%.2f%%'.format(pc) }));\n}\n\n\nreturn baseclass.extend({\n\ttitle: _('Modem Info'),\n\n\tload: function() {\n\t\treturn Promise.all([\n\t\t\tL.resolveDefault(callModemInfo(), {}),\n\t\t]);\n\t},\n\n\trender: function(data) {\n\t\t\n\t\tvar table = E('table', { 'class': 'table' });\n\t\ttry {\n\t\t\tvar infos   = data[0].info\n\t\t\tvar fields = [];\n\t\t\tfor (let modem_info of infos) {\n\t\t\t\tvar info = modem_info.modem_info;\n\t\t\t\t\n\t\t\t\tfor (var entry of info) {\n\t\t\t\t\tvar full_name = entry.full_name;\n\t\t\t\t\tvar extra_info = entry.extra_info;\n\t\t\t\t\tif (entry.value == null) {\n\t\t\t\t\t\tcontinue\n\t\t\t\t\t}\n\t\t\t\t\tif ((entry.class == 'Base Information') ||(entry.class == '\"SIM Information\"')  || (entry.class == 'Cell Information' && entry.type == 'progress_bar')) {\n\t\t\t\t\tfields.push(extra_info ? '%s (%s)'.format(_(full_name), extra_info) : _(full_name));\n\t\t\t\t\tfields.push(entry);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (fields.length == 0) {\n\t\t\t\t\ttable.appendChild(E('tr', { 'class': 'tr' }, [\n\t\t\t\t\t\tE('td', { 'class': 'td left', 'width': '100%' }, [ _('No modem information available') ])\n\t\t\t\t\t]));\n\t\t\t\t\treturn table;\n\t\t\t\t}\n\t\t\t}\n\t\n\t\t\t\n\t\n\t\t\tfor (var i = 0; i < fields.length; i += 2) {\n\t\t\t\tlet entry, type, value;\n\t\t\t\tentry = fields[i + 1];\n\t\t\t\ttype = entry.type;\n\t\t\t\tif (type == 'progress_bar') {\n\t\t\t\t\tvalue = E('td', { 'class': 'td left' }, [\n\t\t\t\t\t\t(entry.value != null) ? progressbar(entry.value, entry.max_value, entry.min_value, entry.unit) : '?'\n\t\t\t\t\t])\n\t\t\t\t} else {\n\t\t\t\t\tvalue = E('td', { 'class': 'td left' }, [ (fields[i + 1] != null) ? entry.value : '?' ])\n\t\t\t\t}\n\t\n\t\t\t\ttable.appendChild(E('tr', { 'class': 'tr' }, [\n\t\t\t\t\tE('td', { 'class': 'td left', 'width': '33%' }, [ fields[i] ]),\n\t\t\t\t\tvalue\n\t\t\t\t]));\n\t\t\t}\n\t\n\t\t\treturn table;\n\t\t}\n\t\tcatch (e) {\n\t\t\ttable.appendChild(E('tr', { 'class': 'tr' }, [\n\t\t\t\tE('td', { 'class': 'td left', 'width': '100%' }, [ _('No modem information available') ])\n\t\t\t]));\n\t\t\treturn table;\n\t\t\t}\n\t\t\t\n\t\t\n\t}\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem/luasrc/controller/qmodem.lua",
    "content": "-- Copyright 2024 Siriling <siriling@qq.com>\n-- Copyright 2024 FJR <fjrcn@outlook.com>\nmodule(\"luci.controller.qmodem\", package.seeall)\nlocal http = require \"luci.http\"\nlocal fs = require \"nixio.fs\"\nlocal json = require(\"luci.jsonc\")\nuci = luci.model.uci.cursor()\nlocal script_path=\"/usr/share/qmodem/\"\nlocal run_path=\"/tmp/run/qmodem/\"\nlocal modem_ctrl = \"/usr/share/qmodem/modem_ctrl.sh \"\n\nfunction index()\n    if not nixio.fs.access(\"/etc/config/qmodem\") then\n        return\n    end\n\tentry({\"admin\", \"modem\"}, firstchild(), _(\"Modem\"), 25).dependent=false\n\tentry({\"admin\", \"modem\", \"qmodem\"}, alias(\"admin\", \"modem\", \"qmodem\", \"modem_info\"), luci.i18n.translate(\"QModem\"), 100).dependent = true\n\t--模块信息\n\tentry({\"admin\", \"modem\", \"qmodem\", \"modem_info\"}, template(\"qmodem/modem_info\"), luci.i18n.translate(\"QModem Information\"),2).leaf = true\n\tentry({\"admin\", \"modem\", \"qmodem\", \"get_modem_cfg\"}, call(\"getModemCFG\"), nil).leaf = true\n\tentry({\"admin\", \"modem\", \"qmodem\", \"modem_ctrl\"}, call(\"modemCtrl\")).leaf = true\n\t--拨号配置\n\tentry({\"admin\", \"modem\", \"qmodem\", \"dial_overview\"},cbi(\"qmodem/dial_overview\"),luci.i18n.translate(\"Dial Overview\"),3).leaf = true\n\tentry({\"admin\", \"modem\", \"qmodem\", \"dial_config\"}, cbi(\"qmodem/dial_config\")).leaf = true\n\tentry({\"admin\", \"modem\", \"qmodem\", \"modems_dial_overview\"}, call(\"getOverviews\"), nil).leaf = true\n\t--模块调试\n\tentry({\"admin\", \"modem\", \"qmodem\", \"modem_debug\"},template(\"qmodem/modem_debug\"),luci.i18n.translate(\"Advance Modem Settings\"),4).leaf = true\n\tentry({\"admin\", \"modem\", \"qmodem\", \"send_at_command\"}, call(\"sendATCommand\"), nil).leaf = true\n\n\t--Qmodem设置\n\tentry({\"admin\", \"modem\", \"qmodem\", \"settings\"}, cbi(\"qmodem/settings\"), luci.i18n.translate(\"QModem Settings\"),100).leaf = true\n\tentry({\"admin\", \"modem\", \"qmodem\", \"slot_config\"}, cbi(\"qmodem/slot_config\")).leaf = true\n\tentry({\"admin\", \"modem\", \"qmodem\", \"modem_config\"}, cbi(\"qmodem/modem_config\")).leaf = true\nend\n\n--[[\n@Description 执行Shell脚本\n@Params\n\tcommand sh命令\n]]\nfunction shell(command)\n\tlocal odpall = io.popen(command)\n\tlocal odp = odpall:read(\"*a\")\n\todpall:close()\n\treturn odp\nend\n\nfunction translate_modem_info(result)\n\tmodem_info = result[\"modem_info\"]\n\tresponse = {}\n\tfor k,entry in pairs(modem_info) do\n\t\tif type(entry) == \"table\" then\n\t\t\tkey = entry[\"key\"]\n\t\t\tfull_name = entry[\"full_name\"]\n\t\t\tif full_name then\n\t\t\t\tfull_name = luci.i18n.translate(full_name)\n\t\t\telseif key then\n\t\t\t\tfull_name = luci.i18n.translate(key)\n\t\t\tend\n\t\t\tentry[\"full_name\"] = full_name\n\t\t\tif entry[\"class\"] then\n\t\t\t\tentry[\"class\"] = luci.i18n.translate(entry[\"class\"])\n\t\t\tend\n\t\t\ttable.insert(response, entry)\n\t\tend\n\tend\n\treturn response\nend\n\nfunction modemCtrl()\n\tlocal action = http.formvalue(\"action\")\n\tlocal cfg_id = http.formvalue(\"cfg\")\n\tlocal params = http.formvalue(\"params\")\n\tlocal translate = http.formvalue(\"translate\")\n\tif params then\n\t\tresult = shell(modem_ctrl..action..\" \"..cfg_id..\" \"..\"\\\"\"..params..\"\\\"\")\n\telse \n\t\tresult = shell(modem_ctrl..action..\" \"..cfg_id)\n\tend\n\tif translate == \"1\" then\n\t\tmodem_more_info = json.parse(result)\n\t\tmodem_more_info = translate_modem_info(modem_more_info)\n\t\tresult = json.stringify(modem_more_info)\n\tend\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write(result)\nend\n\n--[[\n@Description 执行AT命令\n@Params\n\tat_port AT串口\n\tat_command AT命令\n]]\nfunction at(at_port,at_command)\n\tlocal command=\"source \"..script_path..\"modem_util.sh && at \"..at_port..\" \"..at_command\n\tlocal result=shell(command)\n\tresult=string.gsub(result, \"\\r\", \"\")\n\treturn result\nend\n\n\n--[[\n@Description 获取模组信息\n]]\nfunction getOverviews()\n\t-- 获取所有模组\n\tlocal modems={}\n\tlocal logs={}\n\tuci:foreach(\"qmodem\", \"modem-device\", function (modem_device)\n\t\tsection_name = modem_device[\".name\"]\n\t\tmodem_name = modem_device[\"name\"] or luci.i18n.translate(\"Unknown\")\n\t\talias = modem_device[\"alias\"]\n\t\tmodem_state = modem_device[\"state\"]\n\t\tif modem_state == \"disabled\" then\n\t\t\treturn\n\t\tend\n--模组信息部分\n\t\tcmd = modem_ctrl..\"base_info \"..section_name\n\t\tresult = shell(cmd)\n\t\tjson_result = json.parse(result) or \"{}\"\n\t\tmodem_info = json_result[\"modem_info\"]\n\t\ttmp_info = {}\n\t\tif alias then\n\t\t\ttitle = alias .. \"(\"..modem_name..\")\"\n\t\telse\n\t\t\ttitle = modem_name\n\t\tend\n\t\tname = {\n\t\t\ttype = \"plain_text\",\n\t\t\tkey = \"name\",\n\t\t\tvalue = title\n\t\t}\n\t\ttable.insert(tmp_info, name)\n\t\tfor k,v in pairs(modem_info) do\n\t\t\tfull_name = v[\"full_name\"]\n\t\t\tif full_name then\n\t\t\t\tv[\"full_name\"] = luci.i18n.translate(full_name)\n\t\t\tend\n\t\t\ttable.insert(tmp_info, v)\n\t\tend\n\t\ttable.insert(modems, tmp_info)\n\t--拨号日志部分\n\tlog_path = run_path..section_name..\"_dir/dial_log\"\n\tif fs.access(log_path) then\n\t\tlog_msg = fs.readfile(log_path)\n\t\tmodem_log = {}\n\t\tmodem_log[\"log_msg\"] = log_msg\n\t\tmodem_log[\"section_name\"] = section_name\n\t\tif alias then\n\t\t\tmodem_log[\"name\"] = alias .. \"(\"..modem_name..\")\"\n\t\telse\n\t\t\tmodem_log[\"name\"] = modem_name\n\t\tend\n\t\ttable.insert(logs, modem_log)\n\tend\n\tend)\n\t\n\t-- 设置值\n\tlocal data={}\n\tdata[\"modems\"]=modems\n\tdata[\"logs\"]=logs\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(data)\nend\n\nfunction getModemCFG()\n\n\tlocal cfgs={}\n\tlocal translation={}\n\n\tuci:foreach(\"qmodem\", \"modem-device\", function (modem_device)\n\t\tmodem_state = modem_device[\"state\"]\n\t\tif modem_state == \"disabled\" then\n\t\t\treturn\n\t\tend\n\t\t--获取模组的备注\n\t\tlocal network=modem_device[\"modem\"]\n\t\tlocal alias=modem_device[\"alias\"]\n\t\tlocal config_name=modem_device[\".name\"]\n\t\t--设置模组AT串口\n\t\tlocal cfg = modem_device[\".name\"]\n\t\tif modem_device[\"at_port\"] ~= nil then\n\t\t\tlocal at_port=modem_device[\"at_port\"]\n\t\t\tlocal name=modem_device[\"name\"]:upper()\n\t\t\tlocal config = {}\n\t\t\tif alias then\n\t\t\t\tconfig[\"name\"] = alias .. \"(\"..name..\")\"\n\t\t\telse\n\t\t\t\tconfig[\"name\"] = name\n\t\t\tend\n\t\t\tconfig[\"at_port\"] = at_port\n\t\t\tconfig[\"cfg\"] = cfg\n\t\t\ttable.insert(cfgs, config)\n\t\tend\n\tend)\n\n\t-- 设置值\n\tlocal data={}\n\tdata[\"cfgs\"]=cfgs\n\tdata[\"translation\"]=translation\n\n\t-- 写入Web界面\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(data)\nend\n\n\n\nfunction sendATCommand()\n    local at_port = http.formvalue(\"port\")\n\tlocal at_command = http.formvalue(\"command\")\n\n\tlocal response={}\n    if at_port and at_command then\n\t\tresponse[\"response\"]=at(at_port,at_command)\n\t\tresponse[\"time\"]=os.date(\"%Y-%m-%d %H:%M:%S\")\n    end\n\n\t-- 写入Web界面\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(response)\nend\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem/luasrc/model/cbi/qmodem/dial_config.lua",
    "content": "local dispatcher = require \"luci.dispatcher\"\nlocal uci = require \"luci.model.uci\".cursor()\nlocal http = require \"luci.http\"\n\nm = Map(\"qmodem\", translate(\"Modem Configuration\"))\nm.redirect = dispatcher.build_url(\"admin\", \"modem\", \"qmodem\",\"dial_overview\")\n\ns = m:section(NamedSection, arg[1], \"modem-device\", \"\")\ns.addremove = false\ns.dynamic = false\ns:tab(\"general\", translate(\"General Settings\"))\ns:tab(\"advanced\", translate(\"Advanced Settings\"))\n\n--------general--------\n\n-- 是否启用\nenable = s:taboption(\"general\", Flag, \"enable_dial\", translate(\"Enable Dial\"))\nenable.default = \"0\"\nenable.rmempty = false\n\n-- 别名\nalias = s:taboption(\"general\", Value, \"alias\", translate(\"Modem Alias\"))\nalias.rmempty = true\n\n-- AT串口\nat_port = s:taboption(\"general\",Value, \"at_port\", translate(\"AT Port\"))\nsms_at_port = s:taboption(\"general\",Value, \"sms_at_port\", translate(\"SMS AT Port\"))\nsms_at_port.rmempty = true\noverride_at_port = s:taboption(\"general\", Value, \"override_at_port\", translate(\"Override AT Port\"))\noverride_at_port.rmempty = true\nvalid_at_ports = uci:get(\"qmodem\",arg[1],\"valid_at_ports\")\navalible_ports = uci:get(\"qmodem\",arg[1],\"ports\")\n\n\n\n\ndns_list = s:taboption(\"general\", DynamicList, \"dns_list\", translate(\"DNS\"))\ndns_list.description = translate(\"If the DNS server is not set, it will use the DNS server leased by the operator.\")\n\nif valid_at_ports == nil then\n    valid_at_ports = {}\nend\nif avalible_ports == nil then\n    avalible_ports = {}\nend\nfor i1,v1 in ipairs(avalible_ports) do\n    valid=false\n    for i2,v2 in ipairs(valid_at_ports) do\n        if v1 == v2 then\n            valid=true\n        end\n    end\n    if not valid then\n        msg = v1 .. translate(\"(Not PASS)\")\n    else\n        msg = v1 .. translate(\"(PASSED)\")\n    end\n\tat_port:value(v1,msg)\n    sms_at_port:value(v1,msg)\n    override_at_port:value(v1,msg)\nend\n\nuse_ubus = s:taboption(\"general\",Flag, \"use_ubus\",translate(\"Use Ubus\"))\nuse_ubus.default = \"0\"\n\nat_port.placeholder = translate(\"Not null\")\nat_port.rmempty = false\n\nforce_set_apn = s:taboption(\"advanced\", Flag, \"force_set_apn\", translate(\"Force Set APN\"))\nforce_set_apn.description = translate(\"If enabled, the APN will be set even if it matches the current configuration.(only works with tom modified version of quectel-cm)\")\nforce_set_apn.default = \"0\"\n\ndonot_nat = s:taboption(\"advanced\", Flag, \"donot_nat\", translate(\"Do Not NAT(Only for Quectel Modem)\"))\ndonot_nat.description = translate(\"If enabled, will turn off NAT function on quectel modem.\")\ndonot_nat.default = \"0\"\n\nbridge_mode = s:taboption(\"advanced\", Flag, \"en_bridge\", translate(\"Bridge Mode\"))\nbridge_mode.description = translate(\"Caution: Only avalible for quectel sdx 5G Modem.\")\nbridge_mode.default = \"0\"\n\nbridge_port = s:taboption(\"advanced\", Value, \"bridge_port\", translate(\"Bridge Port\"))\nbridge_port.description = translate(\"Device-level bridge port for passthrough. If set, it overrides the slot default bridge port.\")\nbridge_port.rmempty = true\nlocal bridge_ports = io.popen(\"ls /sys/class/net/\")\nfor line in bridge_ports:lines() do\n    bridge_port:value(line, line)\nend\nbridge_ports:close()\n\ndo_not_add_dns = s:taboption(\"advanced\", Flag, \"do_not_add_dns\", translate(\"Do Not modify resolv.conf\"))\ndo_not_add_dns.description = translate(\"quectel-CM will append the DNS server to the resolv.conf file by default.if you do not want to modify the resolv.conf file, please check this option.\")\ndo_not_add_dns.default = \"0\"\n\nra_master = s:taboption(\"advanced\", Flag, \"ra_master\", translate(\"RA Master\"))\nra_master.description = translate(\"Caution: Enabling this option will make it the IPV6 RA Master, and only one interface can be configured as such.\")\nra_master.default = \"0\"\n\nextend_prefix = s:taboption(\"advanced\", Flag, \"extend_prefix\", translate(\"Extend Prefix\"))\nextend_prefix.description = translate(\"Once checking, the prefix will be apply to lan zone\")\nextend_prefix.default = \"0\"\n\n-- 软重启\nsoft_reboot = s:taboption(\"advanced\", Flag, \"soft_reboot\", translate(\"Soft Reboot\"))\nsoft_reboot.description = translate(\"enable modem soft reboot\")\nsoft_reboot.default = \"0\"\n\n-- pdp_index\npdp_index = s:taboption(\"advanced\", Value, \"pdp_index\", translate(\"PDP Context Index\"))\n\n-- 网络类型\npdp_type= s:taboption(\"advanced\", ListValue, \"pdp_type\", translate(\"PDP Type\"))\npdp_type.default = \"ipv4v6\"\npdp_type.rmempty = false\npdp_type:value(\"ip\", translate(\"IPv4\"))\npdp_type:value(\"ipv6\", translate(\"IPv6\"))\npdp_type:value(\"ipv4v6\", translate(\"IPv4/IPv6\"))\n\n\n-- 接入点\napn = s:taboption(\"advanced\", Value, \"apn\", translate(\"APN\"))\napn.default = \"\"\napn.rmempty = true\napn:value(\"\", translate(\"Auto Choose\"))\napn:value(\"cmnet\", translate(\"China Mobile (CN)\"))\napn:value(\"3gnet\", translate(\"China Unicom (CN)\"))\napn:value(\"ctnet\", translate(\"China Telecom (CN)\"))\napn:value(\"cbnet\", translate(\"China Broadcast (CN)\"))\napn:value(\"5gscuiot\", translate(\"Skytone (CN)\"))\n\n-- Switzerland (CH)\napn:value(\"gprs.swisscom.ch\", translate(\"Swisscom (CH)\"))\napn:value(\"internet\", \"Salt (CH), Sunrise (CH), O2 (DE), 1&1 (DE)\")\n\n-- Germany (DE)\napn:value(\"web.vodafone.de\", translate(\"Vodafone (DE)\"))\napn:value(\"internet.telekom\", translate(\"Telekom (DE)\"))\napn:value(\"internet.eplus.de\", translate(\"E-Plus (DE)\"))\n\n-- Austria (AT)\napn:value(\"A1.net\", translate(\"A1 (AT)\"))\napn:value(\"drei.at\", translate(\"Drei (AT)\"))\napn:value(\"internet.t-mobile.at\", translate(\"Magenta (AT)\"))\n\n-- Philippines (PH)\napn:value(\"http.globe.com.ph\", translate(\"Globe Prepaid (PH)\"))\napn:value(\"internet.globe.com.ph\", translate(\"Globe Postpaid (PH)\"))\napn:value(\"internet\", translate(\"Smart Communications (PH)\"))\napn:value(\"internet.dito.ph\", translate(\"Dito Telecomunity (PH)\"))\n\n-- Malaysia (MY)\napn:value(\"celcom3g\", translate(\"Celcom (MY)\"))\napn:value(\"diginet\", translate(\"DiGi (MY)\"))\napn:value(\"unet\", translate(\"Maxis | Hotlink (MY)\"))\napn:value(\"hos\", translate(\"Maxis UT (MY)\"))\napn:value(\"yes4g\", translate(\"YES (MY)\"))\napn:value(\"my3g\", translate(\"UMobile (MY)\"))\napn:value(\"unifi\", translate(\"Unifi (MY)\"))\n\n-- Russia (RU)\napn:value(\"internet.beeline.ru\", translate(\"Beeline (RU)\"))\napn:value(\"internet.mts.ru\", translate(\"MTS (RU)\"))\napn:value(\"internet\", translate(\"Megafon (RU)\"))\napn:value(\"internet.tele2.ru\", translate(\"Tele2 (RU)\"))\napn:value(\"internet.yota\", translate(\"Yota (RU)\"))\napn:value(\"m.tinkoff\", translate(\"T-mobile (RU)\"))\napn:value(\"internet.rtk.ru\", translate(\"Rostelecom (RU)\"))\napn:value(\"internet.sberbank-tele.com\", translate(\"Sber Mobile (RU)\"))\n\nauth = s:taboption(\"advanced\", ListValue, \"auth\", translate(\"Authentication Type\"))\nauth.default = \"none\"\nauth.rmempty = false\nauth:value(\"none\", translate(\"NONE\"))\nauth:value(\"MsChapV2\", translate(\"MsChapV2\"))\nauth:value(\"pap\", \"PAP\")\nauth:value(\"chap\", \"CHAP\")\n\nusername = s:taboption(\"advanced\", Value, \"username\", translate(\"PAP/CHAP Username\"))\nusername.rmempty = true\nusername:depends(\"auth\", \"both\")\nusername:depends(\"auth\", \"pap\")\nusername:depends(\"auth\", \"chap\")\n\npassword = s:taboption(\"advanced\", Value, \"password\", translate(\"PAP/CHAP Password\"))\npassword.rmempty = true\npassword.password = true\npassword:depends(\"auth\", \"both\")\npassword:depends(\"auth\", \"pap\")\npassword:depends(\"auth\", \"chap\")\n\npincode = s:taboption(\"advanced\", Value, \"pincode\", translate(\"PIN Code\"))\npincode.description = translate(\"If the PIN code is not set, leave it blank.\")\n\n--卡2\napn = s:taboption(\"advanced\", Value, \"apn2\", translate(\"APN\")..\" 2\")\napn.description = translate(\"If slot 2 config is not set,will use slot 1 config.\")\napn.default = \"\"\napn.rmempty = true\napn:value(\"\", translate(\"Auto Choose\"))\napn:value(\"cmnet\", translate(\"China Mobile (CN)\"))\napn:value(\"3gnet\", translate(\"China Unicom (CN)\"))\napn:value(\"ctnet\", translate(\"China Telecom (CN)\"))\napn:value(\"cbnet\", translate(\"China Broadcast (CN)\"))\napn:value(\"5gscuiot\", translate(\"Skytone (CN)\"))\n\n-- Switzerland (CH)\napn:value(\"gprs.swisscom.ch\", translate(\"Swisscom (CH)\"))\napn:value(\"internet\", \"Salt (CH), Sunrise (CH), O2 (DE), 1&1 (DE)\")\n\n-- Germany (DE)\napn:value(\"web.vodafone.de\", translate(\"Vodafone (DE)\"))\napn:value(\"internet.telekom\", translate(\"Telekom (DE)\"))\napn:value(\"internet.eplus.de\", translate(\"E-Plus (DE)\"))\n\n-- Austria (AT)\napn:value(\"A1.net\", translate(\"A1 (AT)\"))\napn:value(\"drei.at\", translate(\"Drei (AT)\"))\napn:value(\"internet.t-mobile.at\", translate(\"Magenta (AT)\"))\n\n-- Philippines (PH)\napn:value(\"http.globe.com.ph\", translate(\"Globe Prepaid (PH)\"))\napn:value(\"internet.globe.com.ph\", translate(\"Globe Postpaid (PH)\"))\napn:value(\"internet\", translate(\"Smart Communications (PH)\"))\napn:value(\"internet.dito.ph\", translate(\"Dito Telecomunity (PH)\"))\n\n-- Malaysia (MY)\napn:value(\"celcom3g\", translate(\"Celcom (MY)\"))\napn:value(\"diginet\", translate(\"DiGi (MY)\"))\napn:value(\"unet\", translate(\"Maxis | Hotlink (MY)\"))\napn:value(\"hos\", translate(\"Maxis UT (MY)\"))\napn:value(\"yes4g\", translate(\"YES (MY)\"))\napn:value(\"my3g\", translate(\"UMobile (MY)\"))\napn:value(\"unifi\", translate(\"Unifi (MY)\"))\n\n-- Russia (RU)\napn:value(\"internet.beeline.ru\", translate(\"Beeline (RU)\"))\napn:value(\"internet.mts.ru\", translate(\"MTS (RU)\"))\napn:value(\"internet\", translate(\"Megafon (RU)\"))\napn:value(\"internet.tele2.ru\", translate(\"Tele2 (RU)\"))\napn:value(\"internet.yota\", translate(\"Yota (RU)\"))\napn:value(\"m.tinkoff\", translate(\"T-mobile (RU)\"))\napn:value(\"internet.rtk.ru\", translate(\"Rostelecom (RU)\"))\napn:value(\"internet.sberbank-tele.com\", translate(\"Sber Mobile (RU)\"))\n\nmetric = s:taboption(\"advanced\", Value, \"metric\", translate(\"Metric\"))\nmetric.description = translate(\"The metric value is used to determine the priority of the route. The smaller the value, the higher the priority. Cannot duplicate.\")\nmetric.default = \"10\"\n\n\n\nreturn m\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem/luasrc/model/cbi/qmodem/dial_overview.lua",
    "content": "local d = require \"luci.dispatcher\"\nlocal sys  = require \"luci.sys\"\n\nm = Map(\"qmodem\")\nm.title = translate(\"Dial Overview\")\n\n--全局配置\ns = m:section(NamedSection, \"main\", \"main\", translate(\"Global Config\"))\ns.anonymous = true\ns.addremove = false\n\no = s:option(Flag, \"enable_dial\", translate(\"Enable Dial\")..translate(\"(Global)\"))\no.rmempty = false\n\no = s:option(Button, \"reload_dial\", translate(\"Restart Dial Service\"))\no.inputstyle = \"apply\"\no.write = function()\n    sys.call(\"/etc/init.d/qmodem_network restart  > /dev/null 2>&1\")\n    luci.http.redirect(d.build_url(\"admin\", \"modem\", \"qmodem\", \"dial_overview\"))\nend\n\ns = m:section(TypedSection, \"modem-device\", translate(\"Config List\"))\ns.addremove = ture\ns.template = \"cbi/tblsection\"\ns.extedit = d.build_url(\"admin\", \"modem\", \"qmodem\", \"dial_config\", \"%s\")\n\no = s:option(Flag, \"enable_dial\", translate(\"Enable Dial\"))\no.width = \"5%\"\no.rmempty = false\n\nrestart_btn = s:option(Button, \"_redial\", translate(\"ReDial\"))\nrestart_btn.inputstyle = \"remove\"\nfunction restart_btn.write(self, section)\n    sys.call(\"/etc/init.d/qmodem_network redial \"..section..\" > /dev/null 2>&1\")\n    luci.http.redirect(d.build_url(\"admin\", \"modem\", \"qmodem\", \"dial_overview\"))\nend\n\no = s:option(DummyValue, \"name\", translate(\"Modem Model\"))\no.cfgvalue = function(t, n)\n    local name = (Value.cfgvalue(t, n) or \"\")\n    return name:upper()\nend\n\no = s:option(DummyValue, \"alias\", translate(\"Modem Alias\"))\no.cfgvalue = function(t, n)\n    local alias = (Value.cfgvalue(t, n) or \"-\")\n    return alias\n    \nend\n\no = s:option(DummyValue, \"state\", translate(\"Modem Status\"))\no.cfgvalue = function(t, n)\n    if Value.cfgvalue(t,n) == nil then\n        return translate(\"Unknown\")\n    end\n    return translate(Value.cfgvalue(t, n):upper() or \"-\")\nend\n\n\no = s:option(DummyValue, \"pdp_type\", translate(\"PDP Type\"))\no.cfgvalue = function(t, n)\n    local pdp_type = (Value.cfgvalue(t, n) or \"\")\n    if pdp_type == \"ipv4v6\" then\n        pdp_type = translate(\"IPv4/IPv6\")\n    else\n        pdp_type = pdp_type:gsub(\"_\",\"/\"):upper():gsub(\"V\",\"v\")\n    end\n    return pdp_type\nend\n\n\no = s:option(DummyValue, \"apn\", translate(\"APN\"))\no.cfgvalue = function(t, n)\n    local apn = (Value.cfgvalue(t, n) or \"\")\n    if apn == \"\" then\n        apn = translate(\"Auto Choose\")\n    end\n    return apn\nend\n\nremove_btn = s:option(Button, \"_remove\", translate(\"Remove Modem\"))\nremove_btn.inputstyle = \"remove\"\nfunction remove_btn.write(self, section)\n    local shell\n    shell=\"/usr/share/qmodem/modem_scan.sh remove \"..section\n    luci.sys.call(shell)\n    --refresh the page\n    luci.http.redirect(d.build_url(\"admin\", \"modem\", \"qmodem\", \"dial_overview\"))\nend\n-- 添加模块拨号日志\nm:append(Template(\"qmodem/dial_overview\"))\nm.on_after_commit = function(self)\n    sys.call(\"/etc/init.d/qmodem_network reload  > /dev/null 2>&1\")\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem/luasrc/model/cbi/qmodem/modem_cfg.lua",
    "content": "return {\n    manufacturers = {\n        gosuncn = \"GosunCN\",\n        quectel = \"Quectel\",\n        simcom = \"Simcom\",\n        sierra = \"Sierra Wireless\",\n        fibocom = \"Fibocom\",\n        meig = \"Meig\",\n        huawei = \"Huawei\",\n        neoway = \"Neoway\",\n        telit = \"Telit\",\n        nk = \"Tom's Love\",\n    },\n    platforms = {\n        lte = \"LTE\",\n        lte12 = \"LTE12\",\n        qualcomm = \"Qualcomm\",\n        mediatek = \"MediaTek\",\n        unisoc = \"Unisoc\",\n        intel = \"Intel\"\n    },\n    modes = {\n        ecm = \"ECM\",\n        mbim = \"MBIM\",\n        qmi = \"QMI\",\n        ncm = \"NCM\",\n        rndis = \"RNDIS\"\n    },\n    disabled_features = {\n        DialMode = \"Dial Mode\",\n        RatPrefer = \"Rat Prefer\",\n        IMEI = \"Set IMEI\",\n        NeighborCell = \"Neighbor Cell\",\n        LockBand = \"Lock Band\",\n        RebootModem = \"Reboot Modem\",\n        AtDebug = \"AT Debug\"\n    }\n}\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem/luasrc/model/cbi/qmodem/modem_config.lua",
    "content": "local modem_cfg = require \"luci.model.cbi.qmodem.modem_cfg\"\n\n-- Helper function to load slot paths\nlocal function load_slots(path, exclude_pattern)\n    local slots = {}\n    local handle = io.popen(\"ls \" .. path)\n    for line in handle:lines() do\n        if not exclude_pattern or not line:match(exclude_pattern) then\n            table.insert(slots, line)\n        end\n    end\n    handle:close()\n    return slots\nend\n\n-- Helper function to populate options dynamically from a table\nlocal function populate_options(option, values)\n    for key, value in pairs(values) do\n        option:value(key, value)\n    end\nend\n\n-- Map and Section setup\nm = Map(\"qmodem\", translate(\"Modem Configuration\"))\nm.redirect = luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"settings\")\n\ns = m:section(NamedSection, arg[1], \"modem-device\", \"\")\nlocal slot_name = arg[1]\n\n-- Load slot paths\nlocal usb_slot_list = load_slots(\"/sys/bus/usb/devices/\", \"usb%d+\")\nlocal pcie_slot_list = load_slots(\"/sys/bus/pci/devices/\")\n\n-- Fixed Device Flag\nis_fixed_device = s:option(Flag, \"is_fixed_device\", translate(\"Fixed Device\"))\nis_fixed_device.description = translate(\"If the device is fixed, it will not update when the device is connected or disconnected.\")\nis_fixed_device.default = \"0\"\n\n-- Slot Path\npath = s:option(ListValue, \"slot\", translate(\"Slot Path\"))\nfor _, v in ipairs(usb_slot_list) do\n    local uci_name = v:gsub(\"[%.:%-]\", \"_\")\n    if uci_name == slot_name then\n        path:value(\"/sys/bus/usb/devices/\" .. v .. \"/\", v .. \"[usb]\")\n    end\nend\nfor _, v in ipairs(pcie_slot_list) do\n    local uci_name = v:gsub(\"[%.:%-]\", \"_\")\n    if uci_name == slot_name then\n        path:value(\"/sys/bus/pci/devices/\" .. v .. \"/\", v .. \"[pcie]\")\n    end\nend\n\n-- Interface Type\ndata_interface = s:option(ListValue, \"data_interface\", translate(\"Interface Type\"))\ndata_interface:value(\"usb\", translate(\"USB\"))\ndata_interface:value(\"pcie\", translate(\"PCIe\"))\n\n-- Alias\nalias = s:option(Value, \"alias\", translate(\"Alias\"))\nalias.description = translate(\"Alias for the modem, used for identification.\")\nalias.rmempty = true\nalias.default = \"\"\nalias.placeholder = translate(\"Enter alias name\")\n\n-- Modem Model\nname = s:option(Value, \"name\", translate(\"Modem Model\"))\nname.cfgvalue = function(t, n)\n    return Value.cfgvalue(t, n) or \"-\"\nend\n\n-- Soft Reboot\nsoft_reboot = s:option(Flag, \"soft_reboot\", translate(\"Soft Reboot\"))\nsoft_reboot.default = \"0\"\n\n-- PDP Context Index\npdp_index = s:option(Value, \"pdp_index\", translate(\"PDP Context Index\"))\npdp_index.default = \"1\"\n\n-- Manufacturer (Loaded from modem_cfg.lua)\nmanufacturer = s:option(ListValue, \"manufacturer\", translate(\"Manufacturer\"))\npopulate_options(manufacturer, modem_cfg.manufacturers)\n\n-- Platform (Loaded from modem_cfg.lua)\nplatform = s:option(ListValue, \"platform\", translate(\"Platform\"))\npopulate_options(platform, modem_cfg.platforms)\n\n-- AT Port\nat_port = s:option(Value, \"at_port\", translate(\"AT Port\"))\nat_port.description = translate(\"AT command port for modem communication.\")\n\n-- Supported Modes (Loaded from modem_cfg.lua)\nmodes = s:option(DynamicList, \"modes\", translate(\"Supported Modes\"))\npopulate_options(modes, modem_cfg.modes)\n\n-- Enable Flag\nenabled = s:option(Flag, \"enabled\", translate(\"Enable\"))\nenabled.default = \"1\"\n\ndisabled_features = s:option(DynamicList, \"disabled_features\", translate(\"Disabled Features\"))\ndisabled_features.description = translate(\"Select features to disable for this modem.\")\npopulate_options(disabled_features, modem_cfg.disabled_features)\n\n-- Band Configurations\nlocal band_options = {\n    { name = \"wcdma_band\", label = \"WCDMA Band\", placeholder = \"Enter WCDMA band\" },\n    { name = \"lte_band\", label = \"LTE Band\", placeholder = \"Enter LTE band\" },\n    { name = \"nsa_band\", label = \"NSA Band\", placeholder = \"Enter NSA band\" },\n    { name = \"sa_band\", label = \"SA Band\", placeholder = \"Enter SA band\" },\n}\n\nfor _, band in ipairs(band_options) do\n    local option = s:option(Value, band.name, translate(band.label))\n    option.description = translate(band.label .. \" configuration, e.g., 1/2/3\")\n    option.placeholder = translate(band.placeholder)\n    option.cfgvalue = function(t, n)\n        return Value.cfgvalue(t, n) or \"null\"\n    end\nend\n\npre_dial_delay = s:option(Value, \"pre_dial_delay\", translate(\"Pre Dial Delay\")..translate(\" (beta)\"))\npre_dial_delay.description = translate(\"Delay of executing AT command before dialing, in seconds.\"..translate(\"(still in beta))\"))\npre_dial_delay.placeholder = translate(\"Enter delay in seconds\")\npre_dial_delay.default = \"0\"\npre_dial_delay.datatype = \"uinteger\"\npre_dial_delay.rmempty = true\n\npre_add_delay = s:option(Value, \"post_init_delay\", translate(\"Post Init Delay\")..translate(\" (beta)\"))\npre_add_delay.description = translate(\"Delay of executing AT command after modem initialization, in seconds.\"..translate(\"(still in beta))\"))\npre_add_delay.placeholder = translate(\"Enter delay in seconds\")\npre_add_delay.default = \"0\"\npre_add_delay.datatype = \"uinteger\"\npre_add_delay.rmempty = true\n\npre_add_at_cmds = s:option(DynamicList, \"post_init_at_cmds\", translate(\"Post Init AT Commands\")..translate(\" (beta)\"))\npre_add_at_cmds.description = translate(\"AT commands to execute after modem initialization.\"..translate(\"(still in beta))\"))\npre_add_at_cmds.placeholder = translate(\"Enter AT commands\")\npre_add_at_cmds.datatype = \"string\"\npre_add_at_cmds.rmempty = true\n\npre_dial_at_cmds = s:option(DynamicList, \"pre_dial_at_cmds\", translate(\"Pre Dial AT Commands\")..translate(\" (beta)\"))\npre_dial_at_cmds.description = translate(\"AT commands to execute before dialing.\"..translate(\"(still in beta))\"))\npre_dial_at_cmds.placeholder = translate(\"Enter AT commands\")\npre_dial_at_cmds.datatype = \"string\"\npre_dial_at_cmds.rmempty = true\n\nreturn m\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem/luasrc/model/cbi/qmodem/settings.lua",
    "content": "local sys  = require \"luci.sys\"\nlocal d = require \"luci.dispatcher\"\nm = Map(\"qmodem\")\nm.title = translate(\"QModem Setting\")\n\nthis_page = d.build_url(\"admin\", \"modem\", \"qmodem\", \"settings\")\ns = m:section(NamedSection, \"main\", \"main\", translate(\"Modem Probe setting\"))\n\nat_tool = s:option(Flag, \"at_tool\", translate(\"Alternative AT Tools\"))\nat_tool.description = translate(\"If enabled, using alternative AT Tools\")\n\nstart_delay = s:option(Value, \"start_delay\", translate(\"Delay Start\"))\nstart_delay.description = translate(\"Units:seconds\")\nstart_delay.datatype = \"and(uinteger,min(0),max(99))\"\nstart_delay.default = \"0\"\n\nblock_auto_probe = s:option(Flag, \"block_auto_probe\", translate(\"Block Auto Probe/Remove\"))\nblock_auto_probe.description = translate(\"If enabled, the modem auto scan will be blocked.\")\n\nenable_pcie_scan = s:option(Flag, \"enable_pcie_scan\", translate(\"Enable PCIE Scan\"))\nenable_pcie_scan.description = translate(\"Once enabled, the PCIe ports will be scanned on every boot.\")\n\nenable_usb_scan = s:option(Flag, \"enable_usb_scan\",translate(\"Enable USB Scan\"))\nenable_usb_scan.description = translate(\"Once enabled, the USB ports will be scanned on every boot.\")\n\ntry_vendor_preset_usb = s:option(Flag,\"try_preset_usb\",translate(\"Try Preset USB Port\"))\ntry_vendor_preset_usb.description = translate(\"Attempt to use pre-configured USB settings from the cpe vendor.\") \n\ntry_vendor_preset_pcie = s:option(Flag,\"try_preset_pcie\",translate(\"Try Preset PCIE Port\"))\ntry_vendor_preset_pcie.description = translate(\"Attempt to use pre-configured PCIE settings from the cpe vendor.\")\n\no = s:option(Button, \"scan_pcie\", translate(\"Scan PCIE Manually\"))\no.inputstyle = \"apply\"\no.write = function()\n    sys.call(\"/usr/share/qmodem/modem_scan.sh scan 0 pcie  > /dev/null 2>&1\")\n    luci.http.redirect(this_page)\nend\n\no = s:option(Button, \"scan_usb\", translate(\"Scan USB Manually\"))\no.inputstyle = \"apply\"\no.write = function()\n    sys.call(\"/usr/share/qmodem/modem_scan.sh scan 0 usb  > /dev/null 2>&1\")\n    luci.http.redirect(this_page)\nend\n\no = s:option(Button, \"scan_all\", translate(\"Scan ALL Manually\"))\no.inputstyle = \"apply\"\no.write = function()\n    sys.call(\"/usr/share/qmodem/modem_scan.sh scan  > /dev/null 2>&1\")\n    luci.http.redirect(this_page)\nend\n\n\ns = m:section(TypedSection, \"modem-slot\", translate(\"Modem Slot Config List\"))\ns.addremove = true\ns.template = \"cbi/tblsection\"\ns.extedit = d.build_url(\"admin\", \"modem\", \"qmodem\", \"slot_config\", \"%s\")\ns.sectionhead = translate(\"Config Name\")\nslot_type = s:option(DummyValue, \"type\", translate(\"Slot Type\"))\nslot_type.cfgvalue = function(t, n)\n    local name = translate(Value.cfgvalue(t, n) or \"-\")\n    return name:upper()\nend\n\nslot_path = s:option(DummyValue, \"slot\", translate(\"Slot Path\"))\nslot_path.cfgvalue = function(t, n)\n    local path = (Value.cfgvalue(t, n) or \"-\")\n    return path\nend\n\ndefault_alias = s:option(DummyValue, \"alias\", translate(\"Default Alias\"))\ndefault_alias.cfgvalue = function(t, n)\n    local alias = (Value.cfgvalue(t, n) or \"-\")\n    return alias\nend\n\n\ns = m:section(TypedSection, \"modem-device\", translate(\"Modem Config List\"))\ns.addremove = true\ns.template = \"cbi/tblsection\"\ns.template_addremove = \"qmodem/modem_config_add\"\ns.extedit = d.build_url(\"admin\", \"modem\", \"qmodem\", \"modem_config\", \"%s\")\ns.sectionhead = translate(\"Config Name\")\nlocal pcie_slots = io.popen(\"ls /sys/bus/pci/devices/\")\nlocal pcie_slot_list = {}\nfor line in pcie_slots:lines() do\n    table.insert(pcie_slot_list, line)\nend\npcie_slots:close()\nlocal usb_slots = io.popen(\"ls /sys/bus/usb/devices/\")\nlocal usb_slot_list = {}\nfor line in usb_slots:lines() do\n    if not line:match(\"usb%d+\") then\n        table.insert(usb_slot_list, line)\n    end\nend\nusb_slots:close()\nlocal avalibale_name_list = {}\nfor i,v in ipairs(pcie_slot_list) do\n    local uci_name = v:gsub(\"%.\", \"_\"):gsub(\":\", \"_\"):gsub(\"-\", \"_\")\n    avalibale_name_list[uci_name] = v..\"[pcie]\"\nend\nfor i,v in ipairs(usb_slot_list) do\n    local uci_name = v:gsub(\"%.\", \"_\"):gsub(\":\", \"_\"):gsub(\"-\", \"_\")\n    avalibale_name_list[uci_name] = v..\"[usb]\"\nend\ns.avalibale_name = avalibale_name_list\nslot_type = s:option(DummyValue, \"name\", translate(\"Modem Model\"))\nslot_type.cfgvalue = function(t, n)\n    local name = translate(Value.cfgvalue(t, n) or \"-\")\n    return name:upper()\nend\n\npath = s:option(DummyValue, \"path\", translate(\"Slot Path\"))\n\ndefault_alias = s:option(DummyValue, \"alias\", translate(\"Alias\"))\ndefault_alias.cfgvalue = function(t, n)\n    local alias = (Value.cfgvalue(t, n) or \"-\")\n    return alias\nend\nreturn m\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem/luasrc/model/cbi/qmodem/slot_config.lua",
    "content": "m = Map(\"qmodem\", translate(\"Slot Configuration\"))\nm.redirect = luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\",\"settings\")\n\ns = m:section(NamedSection, arg[1], \"modem-slot\", \"\")\n\nslot_type = s:option(ListValue, \"type\", translate(\"Slot Type\"))\nslot_type:value(\"usb\", translate(\"USB\"))\nslot_type:value(\"pcie\", translate(\"PCIE\"))\n\nslot = s:option(Value, \"slot\", translate(\"Slot ID\"))\n\n\nlocal pcie_slots = io.popen(\"ls /sys/bus/pci/devices/\")\nfor line in pcie_slots:lines() do\n    slot:value(line,line..\"[pcie]\")\nend\npcie_slots:close()\n\n\n\nsim_led = s:option(Value, \"sim_led\", translate(\"SIM LED\"))\nsim_led.rmempty = true\n\n\nnet_led = s:option(Value, \"net_led\", translate(\"NET LED\"))\nnet_led.rmempty = true\nlocal leds = io.popen(\"ls /sys/class/leds/\")\nfor line in leds:lines() do\n    net_led:value(line,line)\n    sim_led:value(line,line)\nend\n\nethernet_5g = s:option(Value, \"ethernet_5g\", translate(\"Enable 5G Ethernet\"))\nethernet_5g.rmempty = true\nethernet_5g.description = translate(\"For 5G modules using the Ethernet PHY connection, please specify the network interface name. (e.g., eth0, eth1)\") \nlocal net = io.popen(\"ls /sys/class/net/\")\nfor line in net:lines() do\n    ethernet_5g:value(line,line)\nend\nnet:close()\n\nbridge_port = s:option(Value, \"bridge_port\", translate(\"Bridge Port\"))\nbridge_port.rmempty = true\nbridge_port.description = translate(\"Default bridge port for passthrough. Device-level bridge_port overrides this slot default.\")\nlocal bridge_net = io.popen(\"ls /sys/class/net/\")\nfor line in bridge_net:lines() do\n    bridge_port:value(line, line)\nend\nbridge_net:close()\n\ndefault_alias = s:option(Value, \"alias\", translate(\"Default Alias\"))\ndefault_alias.description = translate(\"After setting this option, the first module loaded into this slot will automatically be assigned this default alias.\")\n\n\n\nassociated_usb = s:option(Value, \"associated_usb\", translate(\"Associated USB\"))\nassociated_usb.rmempty = true\nassociated_usb.description = translate(\"For M.2 slots with both PCIe and USB support, specify the associated USB port (for ttyUSB access)\")\nassociated_usb:depends(\"type\", \"pcie\")\nlocal usb_slots = io.popen(\"ls /sys/bus/usb/devices/\")\nfor line in usb_slots:lines() do\n    if not line:match(\"usb%d+\") then\n        slot:value(line,line..\"[usb]\")\n        associated_usb:value(line,line)\n    end\n    \nend\n\ndefault_metric = s:option(Value, \"default_metric\", translate(\"Default Metric\"))\ndefault_metric.rmempty = true\ndefault_metric.description = translate(\"The first module loaded into this slot will automatically be assigned this default metric.\")\ndefault_metric.datatype = \"range(1, 255)\"\n\npwr_gpio = s:option(Value, \"gpio\", translate(\"Power GPIO\"))\npwr_gpio.rmempty = true\n\ngpio_down = s:option(Value,\"gpio_down\",translate(\"GPIO Down Value\"))\n\n\ngpio_up = s:option(Value,\"gpio_up\",translate(\"GPIO Up Value\"))\nusb_slots:close()\nreturn m\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem/luasrc/view/qmodem/dial_overview.htm",
    "content": "<script type=\"text/javascript\">//<![CDATA[\n\t\n\tclass LuciField {\n\t\tconstructor(classList,title){\n\t\t\tthis.classList=classList;\n\t\t\tthis.newLuciField();\n\t\t\tthis.title=title;\n\t\t}\n\n\t\tnewLuciField(){\n\t\t\tvar field=document.createElement(\"fieldset\");\n\t\t\tfor (var class_name of this.classList)\n\t\t\t{\n\t\t\t\tfield.classList.add(class_name);\n\t\t\t}\n\t\t\tvar h3title = document.createElement(\"h3\")\n\t\t\tfield.appendChild(h3title);\n\t\t\tthis.h3title=h3title;\n\t\t\tthis.field=field;\n\t\t\n\t\t}\n\n\t\tset title(t){\n\t\t\tthis.h3title.innerHTML=t;\n\t\t\tif (t != \"\")\n\t\t\t{\n\t\t\t\tthis.h3title.style.display=\"\";\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tthis.h3title.style.display=\"none\";\n\t\t\t}\n\t\t}\n\t}\n\n\tclass LuciBtn {\n\t\tconstructor(classList,value,callback){\n\t\t\tvar btn=document.createElement(\"input\");\n\t\t\tvar base_classList = [\"cbi-button\",\"btn\"];\n\t\t\tthis.classList=base_classList.concat(classList);\n\t\t\tfor (var class_name of this.classList)\n\t\t\t{\n\t\t\t\tbtn.classList.add(class_name);\n\t\t\t}\n\t\t\tbtn.setAttribute('type','button');\n\t\t\tbtn.setAttribute('value',value);\n\t\t\tbtn.addEventListener('click',callback);\n\t\t\tthis.btn=btn;\n\t\t}\n\t}\n\n\tclass ModemState\n\t{\n\t\tconstructor(){\n\t\t\tthis.modem_state_div = document.createElement('div');\n\t\t\tthis.modem_state_div.classList.add(\"modem_status_box\");\n\t\t\tthis.connect_state = -1;\n\t\t}\n\n\t\tupdate(modem_datas){\n\t\t\tvar entrys = [];\n\t\t\tthis.connect_state = -1;\n\t\t\tfor (var entry of modem_datas)\n\t\t\t{\n\t\t\t\t//handle special entry\n\t\t\t\tif (entry.key==\"connect_status\")\n\t\t\t\t{\n\t\t\t\t\tvar state = '';\n\t\t\t\t\tvar css = '';\n\t\t\t\t\tswitch (entry.value)\n\t\t\t\t\t{\n\t\t\t\t\t\tcase 'Yes':\n\t\t\t\t\t\t\tentry.value = '<%:Connected%>';\n\t\t\t\t\t\t\tthis.connect_state = 1;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tcase 'No':\n\t\t\t\t\t\t\tentry.value = '<%:Disconnected%>';\n\t\t\t\t\t\t\tthis.connect_state = 0;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\tdefault:\n\t\t\t\t\t\t\tentry.value = '<%:Unknown%>';\n\t\t\t\t\t\t\tthis.connect_state = -1;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tentrys.push(entry);\n\t\t\t}\n\t\t\tthis.render(entrys);\n\t\t}\n\n\n\t\trender(entrys){\n\t\t\tthis.modem_state_div.innerHTML = \"\";\n\t\t\tswitch (this.connect_state)\n\t\t\t{\n\t\t\t\tcase 1:\n\t\t\t\t\tthis.modem_state_div.classList.add(\"alert-message\",\"alert-message-imm\",\"success\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase 0:\n\t\t\t\t\tthis.modem_state_div.classList.add(\"alert-message\",\"alert-message-imm\",\"danger\");\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:\n\t\t\t\t\tthis.modem_state_div.classList.add(\"alert-message\",\"alert-message-imm\",\"warning\");\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t\tfor (var entry of entrys)\n\t\t\t{\n\t\t\t\tvar key,value,full_name;\n\t\t\t\tkey=entry.key;\n\t\t\t\tvalue=entry.value;\n\t\t\t\tfull_name=entry.full_name;\n\t\t\t\tif (key == \"connect_status\" || key == \"name\" )\n\t\t\t\t{\n\t\t\t\t\tvar div = document.createElement('div');\n\t\t\t\t\tvar strong = document.createElement('strong');\n\t\t\t\t\tstrong.innerHTML = value.toUpperCase();\n\t\t\t\t\tdiv.appendChild(strong);\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tvar div = document.createElement('div');\n\t\t\t\t\tvar strong = document.createElement('strong');\n\t\t\t\t\tvar span = document.createElement('span');\n\t\t\t\t\tstrong.innerHTML = full_name + \": \";\n\t\t\t\t\tspan.innerHTML = value;\n\t\t\t\t\tdiv.appendChild(strong);\n\t\t\t\t\tdiv.appendChild(span);\n\t\t\t\t}\n\t\t\t\tthis.modem_state_div.appendChild(div);\n\t\t\t}\n\t\t\n\t\t}\n\n\t}\n\n\n\tclass ModemLog {\n\t\tconstructor(section_name){\n\t\t\tthis.modem_log_div = document.createElement('div');\n\t\t\tthis.modem_log_div.style.display = \"none\";\n\t\t\tthis.modem_logmsg_textarea = document.createElement('textarea');\n\t\t\tthis.modem_logmsg_textarea.setAttribute('readonly','readonly');\n\t\t\tthis.modem_logmsg_textarea.setAttribute('rows','20');\n\t\t\tthis.modem_logmsg_textarea.setAttribute('maxlength','160');\n\t\t\tvar download_btn = new LuciBtn([\"cbi-button-link\"],\"<%:Download%>\",() => {\n\t\t\t\tthis.download();\n\t\t\t}).btn;\n\t\t\tvar clear_btn = new LuciBtn([\"cbi-button-reset\"],\"<%:Clear%>\",() => {\n\t\t\t\tthis.clear();\n\t\t\t}).btn;\n\t\t\tvar btns_div = document.createElement('div');\n\t\t\tbtns_div.appendChild(download_btn);\n\t\t\tbtns_div.appendChild(clear_btn);\n\t\t\tthis.btns_div = btns_div;\n\t\t\tthis.modem_log_div.appendChild(this.modem_logmsg_textarea);\n\t\t\tthis.modem_log_div.appendChild(this.btns_div);\n\t\t\tthis.section_name = section_name;\n\t\t\tthis.scroll_top = -1;\n\t\t}\n\n\t\tdownload(){\n\t\t\tvar file_name = this.section_name+\"_dial_log.txt\";\n\t\t\tvar file_content = this.log_msg;\n\t\t\tvar blob = new Blob([file_content], {type: \"text/plain;charset=utf-8\"});\n\t\t\tvar url = URL.createObjectURL(blob);\n\t\t\tvar a = document.createElement('a');\n\t\t\ta.href = url;\n\t\t\ta.download = file_name;\n\t\t\ta.click();\n\t\t}\n\n\t\tclear(){\n\t\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"modem_ctrl\")%>', {\"action\":\"clear_dial_log\",\"cfg\":this.section_name},\n\t\t\tfunction(x, data)\n\t\t\t{\n\t\t\t\tvar state = data.result.state;\n\t\t\t\tif (state == \"1\")\n\t\t\t\t{\n\t\t\t\t\tthis.log_msg = \"\";\n\t\t\t\t\tthis.render();\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\t}\n\n\t\tupdate(log_msg){\n\t\t\tthis.scroll_top = this.modem_logmsg_textarea.scrollTop;\n\t\t\tthis.log_msg = log_msg;\n\t\t\tthis.render();\n\t\t\tthis.modem_logmsg_textarea.scrollTop = this.scroll_top;\n\t\t}\n\n\t\trender(){\n\t\t\tthis.modem_logmsg_textarea.innerHTML=this.log_msg;\n\t\t}\n\t\n\t}\n\n\tclass ModemDialOverview {\n\t\tconstructor(){\n\t\t\tthis.modem_state_field=new LuciField([\"cbi-section\",\"cbi-section-modem-state\"],\"<%:Modem Status%>\").field;\n\t\t\tthis.modem_log_tab_data_field = document.createElement('div');\n\t\t\tthis.modem_log_tab_menu_field = document.createElement('ul');\n\t\t\tthis.modem_log_tab_menu_field.classList.add(\"tabs\")\n\t\t\tthis.modem_log_field=new LuciField([\"cbi-section\",\"cbi-section-modem-log\"],\"<%:Modem Log%>\").field;\n\t\t\tthis.modems_state = [];\n\t\t\tthis.modems_logs = {};\n\t\t\tthis.modems_logs_menu = {};\n\t\t\tthis.activated_section = \"\";\n\t\t\tthis.modem_log_field.appendChild(this.modem_log_tab_menu_field);\n\t\t\tthis.modem_log_field.appendChild(this.modem_log_tab_data_field);\n\n\t\t\tthis.maincontent = document.getElementById(\"maincontent\");\n\t\t\tthis.maincontent.appendChild(this.modem_state_field);\n\t\t\tthis.maincontent.appendChild(this.modem_log_field);\n\t\t\tthis.poll();\n\t\t}\n\n\t\tactivate()\n\t\t{\n\t\t\tfor (var section_name in this.modems_logs)\n\t\t\t{\n\t\t\t\tif (section_name == this.activated_section)\n\t\t\t\t{\n\t\t\t\t\tthis.modems_logs[section_name].modem_log_div.style.display = \"\";\n\t\t\t\t\tthis.modems_logs_menu[section_name].classList.add(\"active\");\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tthis.modems_logs[section_name].modem_log_div.style.display = \"none\";\n\t\t\t\t\tthis.modems_logs_menu[section_name].classList.remove(\"active\");\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tpoll()\n\t\t{\n\t\t\tXHR.poll(5,'<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"modems_dial_overview\")%>',{},\n\t\t(x,data)=>{\n\t\t\tthis.update_modems_state(data.modems);\n\t\t\tthis.update_modems_log(data.logs);\n        \t});\n\t\t}\n\n\t\tupdate_modems_state(modems){\n\t\t\tfor (var i in modems)\n\t\t\t{\n\t\t\t\tvar modem_info = modems[i];\n\t\t\t\tif (this.modems_state[i]==null)\n\t\t\t\t{\n\t\t\t\t\tthis.modems_state[i]=new ModemState();\n\t\t\t\t\tthis.modem_state_field.appendChild(this.modems_state[i].modem_state_div);\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t\tthis.modems_state[i].update(modem_info);\n\t\t\t}\n\t\t\tif (this.modems_state.length> modems.length)\n\t\t\t\t{\n\t\t\t\t\tfor (var i = modems.length; i < this.modems_state.length; i++)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.modem_state_field.removeChild(this.modems_state[i].modem_state_div);\n\t\t\t\t\t\tdelete this.modems_state[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t}\n\n\t\tupdate_modems_log(logs){\n\t\t\tvar menus = [];\n\t\t\tfor (var log of logs)\n\t\t\t{\n\t\t\t\tvar section_name,modem_name,log_msg;\n\t\t\t\tsection_name = log.section_name;\n\t\t\t\tmodem_name = log.name;\n\t\t\t\tlog_msg = log.log_msg;\n\t\t\t\tmenus.push(section_name);\n\t\t\t\tif ( this.modems_logs[section_name]==null )\n\t\t\t\t{\n\t\t\t\t\tthis.modems_logs[section_name]=new ModemLog(section_name);\n\t\t\t\t\tlet a = document.createElement('a');\n\t\t\t\t\tlet li = document.createElement('li');\n\t\t\t\t\tlet s = section_name;\n\t\t\t\t\tli.appendChild(a);\n\t\t\t\t\ta.href = \"#\";\n\t\t\t\t\ta.innerHTML = modem_name.toUpperCase();\n\t\t\t\t\ta.addEventListener('click',() => {\n\t\t\t\t\t\tthis.activate_tab = s;\n\t\t\t\t\t});\n\t\t\t\t\tthis.modems_logs_menu[section_name]=li;\n\t\t\t\t\tthis.modem_log_tab_menu_field.appendChild(li);\n\t\t\t\t\tthis.modem_log_tab_data_field.appendChild(this.modems_logs[section_name].modem_log_div);\n\t\t\t\t}\n\t\t\t\tthis.modems_logs[section_name].update(log_msg);\n\t\t\t}\n\t\t\tthis.update_modems_log_menu();\n\t\t\t//remove the log that not exist\n\t\t\tfor (var section_name in this.modems_logs)\n\t\t\t{\n\t\t\t\tif (menus.indexOf(section_name)==-1)\n\t\t\t\t{\n\t\t\t\t\tthis.modem_log_tab_menu_field.removeChild(this.modems_logs_menu[section_name]);\n\t\t\t\t\tthis.modem_log_tab_data_field.removeChild(this.modems_logs[section_name].modem_log_div);\n\t\t\t\t\tdelete this.modems_logs[section_name];\n\t\t\t\t\tdelete this.modems_logs_menu[section_name];\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tupdate_modems_log_menu(){\n\t\t\tif (this.activated_section == \"\")\n\t\t\t{\n\t\t\t\tthis.activate_tab = Object.keys(this.modems_logs)[0];\n\t\t\t}\n\n\t\t}\n\n\t\tset activate_tab(section_name){\n\t\t\tthis.activated_section = section_name;\n\t\t\tthis.activate();\n\t\t}\n\n\t}\n\n\twindow.onload = function(){\n\t\tvar modem_dial_overview = new ModemDialOverview();\n\t}\n</script>\n<style type=\"text/css\">\n\t/* AT命令响应 */\n\ttextarea {\n\t\tbackground:#373737;\n\t\tborder:none;\n\t\tcolor:#FFF;\n\t\twidth: 100%;\n\t\tborder-top-width: 2px;\n\t\tpadding-top: 12px;\n\t}\n\t\n\t/* 加载中样式 */\n\t#modem_status_view img {\n\t\tvertical-align: middle;\n\t}\n\n\t.modem_status_box {\n\t\tdisplay: inline-block;\n\t\tmargin: 1rem;\n\t\tpadding: 1rem;\n\t\twidth: 16rem;\n\t\tfloat: left;\n\t\tline-height: 125%;\n\t}\n\n\t.alert-message-imm {\n\t\tposition: unset !important;\n\t\ttransform: none !important;\n\t}\n</style>\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem/luasrc/view/qmodem/modem_config_add.htm",
    "content": "<div class=\"cbi-section-create cbi-tblsection-create\">\n        <% if self.invalid_cts then -%>\n            <div class=\"cbi-section-error\"><%:Invalid%></div>\n        <%- end %>\n\n        <div>\n            <select type=\"text\" class=\"cbi-section-create-name\" id=\"cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>\" name=\"cbi.cts.<%=self.config%>.<%=self.sectiontype%>.<%=section%>\" data-type=\"uciname\" data-optional=\"true\" onchange=\"cbi_validate_named_section_add(this)\"/>\n                <option value=\"\"><%:Please Select%></option>\n                <% for uci_name, display_name in pairs(self.avalibale_name) do -%>\n                    <option value=\"<%=uci_name%>\"><%=display_name%></option>\n                <% end -%>\n            </select>\n            \n        </div>\n        <input class=\"btn cbi-button cbi-button-add\" type=\"submit\" onclick=\"this.form.cbi_state='add-section'; return true\" value=\"<%:Add%>\" title=\"<%:Add%>\" disabled=\"\" />\n</div>\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem/luasrc/view/qmodem/modem_debug.htm",
    "content": "<%+header%>\n<script>\n\tclass ModemConfig {\n\t\tconstructor(cfg_id,title){\n\t\t\tthis.cfg_id = cfg_id;\n\t\t\tthis.init_view = false;\n\t\t\tthis.cbi_map = document.querySelector('.cbi-map');\n\t\t\tthis.fieldset = this.create_fieldset(title);\n\t\t\tthis.cbi_map.appendChild(this.fieldset);\n\t\t}\n\n\t\tupdate(){\n\t\t\tconsole.log(\"update\");\n\t\t\tif (this.cb_update) {\n\t\t\t\tthis.cb_update();\n\t\t\t}\n\t\t}\n\n\t\tpause(){\n\t\t\tconsole.log(\"pause\");\n\t\t}\n\n\t\tget_config(){\n\t\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"modem_ctrl\")%>', \n\t\t\t{ \n\t\t\t\t\"cfg\": this.cfg_id,\n\t\t\t\t\"action\": this.get_action\n\t\t\t},\n\t\t\t\t(x, data) => {\n\t\t\t\t\tif (this.config_name){\n\t\t\t\t\t\tthis.config = data[this.config_name];\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.config = data;\n\t\t\t\t\t}\n\t\t\t\t\tif (this.cb_get) {\n\t\t\t\t\t\tthis.cb_get(data);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tset_config(config){\n\t\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"modem_ctrl\")%>', \n\t\t\t{ \n\t\t\t\t\"cfg\": this.cfg_id,\n\t\t\t\t\"action\": this.set_action,\n\t\t\t\t\"params\": JSON.stringify(config)\n\t\t\t},\n\t\t\t\t(x, data) => {\n\t\t\t\t\tif (this.config_name){\n\t\t\t\t\t\tthis.config = data[this.config_name];\n\t\t\t\t\t}\n\t\t\t\t\telse {\n\t\t\t\t\t\tthis.config = data;\n\t\t\t\t\t}\n\t\t\t\t\tif (this.cb_set) {\n\t\t\t\t\t\tthis.cb_set(data);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tcreate_fieldset(title){\n\t\t\tvar fieldset = document.createElement('fieldset');\n\t\t\tfieldset.className = \"cbi-section\";\n\t\t\tvar legend = document.createElement('legend');\n\t\t\tlegend.innerHTML = title;\n\t\t\tfieldset.appendChild(legend);\n\t\t\treturn fieldset;\n\t\t}\n\n\t\tcreateInput(name,value,hint){\n\t\t\tvar input = document.createElement('input');\n\t\t\tinput.type = \"text\";\n\t\t\tinput.name = name;\n\t\t\tinput.value = value;\n\t\t\tinput.placeholder = hint;\n\t\t\treturn input;\n\t\t}\n\n\t\tcreateBTN(name,cb){\n\t\t\tvar btn = document.createElement('input');\n\t\t\tbtn.type = \"button\";\n\t\t\tbtn.classList.add(\"cbi-button\");\n\t\t\tbtn.value = name;\n\t\t\tbtn.addEventListener('click',cb);\n\t\t\treturn btn;\n\t\t}\n\n\t\tcreateRadio(name,value){\n\t\t\tvar radio = document.createElement('input');\n\t\t\tradio.type = \"radio\";\n\t\t\tradio.name = name;\n\t\t\tradio.value = value;\n\t\t\treturn radio;\n\t\t}\n\n\t\tcreateCheckbox(value){\n\t\t\tvar checkbox = document.createElement('input');\n\t\t\tcheckbox.type = \"checkbox\";\n\t\t\tcheckbox.value = value;\n\t\t\treturn checkbox;\n\t\t}\n\n\t\tcreateTable(){\n\t\t\tlet table,tbody;\n\t\t\ttable = document.createElement('table');\n\t\t\ttable.classList.add(\"cbi-section-table\");\n\t\t\ttable.classList.add(\"table\");\n\t\t\ttbody = document.createElement('tbody');\n\t\t\ttable.appendChild(tbody);\n\t\t\treturn table;\n\t\t}\n\n\t\tcreateDroplist(dict){\n\t\t\tvar select = document.createElement('select');\n\t\t\tfor (let key in dict) {\n\t\t\t\tvar option = document.createElement('option');\n\t\t\t\toption.value = key;\n\t\t\t\toption.innerHTML = dict[key];\n\t\t\t\tselect.appendChild(option);\n\t\t\t}\n\t\t\treturn select;\n\t\t}\n\n\t\tcreateInputWithDatalist(name,hint,dict) {\n\t\t\t// 创建输入框\n\t\t\tvar input = document.createElement('input');\n\t\t\tinput.setAttribute('list', name); // 设置 list 属性以关联 datalist\n\t\t\tinput.name = name;\n\t\t\tinput.placeholder = hint;\n\n\t\t\t// 创建 datalist\n\t\t\tvar datalist = document.createElement('datalist');\n\t\t\tdatalist.id = name;\n\n\t\t\t// 添加选项到 datalist\n\t\t\tfor (let key in dict) {\n\t\t\t\tvar option = document.createElement('option');\n\t\t\t\toption.value = key;\n\t\t\t\tdatalist.appendChild(option);\n\t\t\t}\n\n\t\t\treturn { input, datalist }; // 返回包含输入框和 datalist 的对象\n\t\t}\n\n\t\tcreateDroplistWithInput(name, hint, dict) {\n\t\t\tvar input = this.createInput(\"\",\"\",hint);\n\t\t\tvar selector = this.createDroplist(dict);\n\t\t\tvar prevous_selected = \"\";\n\t\t\tvar input_tips = \"<%:Lost focus to save%>\";\n\t\t\tvar selector_tips = \"<%:Double Click or Right Click to Edit%>\";\n\t\t\tvar input_descr = this.createDescription(input_tips);\n\t\t\tvar selector_descr = this.createDescription(selector_tips);\n\t\t\tinput.style.display = \"none\";\n\t\t\tinput_descr.style.display = \"none\";\n\t\t\tselector.style.width = \"100%\";\n\t\t\tselector.style.minWidth = \"auto\";\n\t\t\t// add event to selector\n\t\t\tselector.addEventListener('change', function(event) {\n\t\t\t\tif (event.target.value.length == 0){\n\t\t\t\t\tinput.style.display = \"\";\n\t\t\t\t\tselector.style.display = \"none\";\n\t\t\t\t\tinput_descr.style.display = \"\";\n\t\t\t\t\tselector_descr.style.display = \"none\";\n\t\t\t\t\tinput.value = prevous_selected;\n\t\t\t\t\tinput.focus();\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tinput.style.display = \"none\";\n\t\t\t\t\tselector.style.display = \"\";\n\t\t\t\t\tinput_descr.style.display = \"none\";\n\t\t\t\t\tselector_descr.style.display = \"\";\n\t\t\t\t\tprevous_selected = event.target.value;\n\t\t\t\t}\n\t\t\t});\n\n\t\t\t// add event listener to seletor : right click or long press or double click: show input\n\t\t\tselector.addEventListener('contextmenu', function(event) {\n\t\t\t\tevent.preventDefault();\n\t\t\t\tinput.style.display = \"\";\n\t\t\t\tselector.style.display = \"none\";\n\t\t\t\tinput_descr.style.display = \"\";\n\t\t\t\tselector_descr.style.display = \"none\";\n\t\t\t\tinput.value = prevous_selected;\n\t\t\t\tinput.focus();\n\t\t\t});\n\t\t\t// add event listener to seletor : hover: show tooltip\n\t\t\tselector.addEventListener('mouseover', function(event) {\n\t\t\t\tselector.title = selector_tips;\n\t\t\t});\n\t\t\tselector.addEventListener('dblclick', function(event) {\n\t\t\t\tinput.style.display = \"\";\n\t\t\t\tselector.style.display = \"none\";\n\t\t\t\tinput_descr.style.display = \"\";\n\t\t\t\tselector_descr.style.display = \"none\";\n\t\t\t\tinput.value = prevous_selected;\n\t\t\t\tinput.focus();\n\t\t\t});\n\t\t\t// add event listener to input : hover: show tooltip\n\t\t\tinput.addEventListener('mouseover', function(event) {\n\t\t\t\tinput.title = input_tips;\n\t\t\t});\n\t\t\tinput.addEventListener('blur', function(event) {\n\t\t\t\tif (event.target.value.length > 0) {\n\t\t\t\t\t//clear user input option\n\t\t\t\t\tfor (let option of selector.options) {\n\t\t\t\t\t\tif (option.type == \"userInput\") {\n\t\t\t\t\t\t\tselector.removeChild(option);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tfor (let option of selector.options) {\n\t\t\t\t\t\tif (option.value == event.target.value) {\n\t\t\t\t\t\t\tselector.value = event.target.value;\n\t\t\t\t\t\t\tselector.dispatchEvent(new Event('change'));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tvar option = document.createElement('option');\n\t\t\t\t\toption.value = event.target.value;\n\t\t\t\t\toption.innerHTML = event.target.value;\n\t\t\t\t\toption.type = \"userInput\";\n\t\t\t\t\tselector.appendChild(option);\n\t\t\t\t\tselector.value = event.target.value;\n\t\t\t\t\tselector.dispatchEvent(new Event('change'));\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tif (prevous_selected){\n\t\t\t\t\t\tselector.value = prevous_selected;\n\t\t\t\t\t\tselector.dispatchEvent(new Event('change'));\n\t\t\t\t\t}\n\t\t\t\t\telse{\n\t\t\t\t\t\t//select first not null option\n\t\t\t\t\t\tfor (let option of selector.options) {\n\t\t\t\t\t\t\tif (option.value.length > 0) {\n\t\t\t\t\t\t\t\tselector.value = option.value;\n\t\t\t\t\t\t\t\tselector.dispatchEvent(new Event('change'));\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tselector.dispatchEvent(new Event('change'));\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t}\n\t\t\t})\n\n\t\t\tinput.descr = input_descr;\n\t\t\tselector.descr = selector_descr;\n\n\t\t\treturn { input, selector };\n\n\t\t}\n\n\t\tcreateTD(innerHTML){\n\t\t\tvar td = document.createElement('td');\n\t\t\ttd.classList.add(\"cbi-section-table-cell\");\n\t\t\ttd.classList.add(\"td\");\n\t\t\ttd.classList.add(\"left\");\n\t\t\tif (innerHTML) {\n\t\t\t\ttd.innerHTML = innerHTML;\n\t\t\t}\n\t\t\treturn td;\n\t\t}\n\n\t\tcreateTH(innerHTML){\n\t\t\tvar th = document.createElement('th');\n\t\t\tth.classList.add(\"cbi-section-table-cell\");\n\t\t\tth.classList.add(\"th\");\n\t\t\tif (innerHTML) {\n\t\t\t\tth.innerHTML = innerHTML;\n\t\t\t}\n\t\t\treturn th;\n\t\t}\n\n\t\tcreateTR(){\n\t\t\tvar tr = document.createElement('tr');\n\t\t\ttr.classList.add(\"cbi-section-table-row\");\n\t\t\ttr.classList.add(\"tr\");\n\t\t\treturn tr;\n\t\t}\n\n\t\tcreateDescription(innerHTML){\n\t\t\tvar div = document.createElement('div');\n\t\t\tdiv.classList.add(\"cbi-section-descr\");\n\t\t\tdiv.innerHTML = innerHTML;\n\t\t\treturn div;\n\t\t}\n\n\t\tcreateTRHeader(){\n\t\t\tvar tr = document.createElement('div');\n\t\t\ttr.classList.add(\"tr\");\n\t\t\ttr.classList.add(\"cbi-section-table-titles\");\n\t\t\ttr.classList.add(\"anonymous\");\n\t\t\treturn tr;\n\t\t}\n\n\t\tinit_table(){\n\t\t\tvar table = this.createTable();\n\t\t\tthis.fieldset.appendChild(table);\n\t\t\tthis.tbody = table.querySelector('tbody');\n\t\t}\n\n\t\thide(){\n\t\t\tthis.fieldset.style.display = \"none\";\n\t\t\tthis.pause();\n\t\t}\n\t\t\n\t\tshow(){\n\t\t\tthis.fieldset.style.display = \"block\";\n\t\t\tconsole.log(\"show\");\n\t\t\tthis.update();\n\t\t}\n\t}\n\n\t//锁频功能\n\tclass Lockband extends ModemConfig{\n\t\t\tconstructor(cfg_id){\n\t\t\t\tsuper(cfg_id,\"<%:Lock Band%>\");\n\t\t\t\tthis.config_name = \"lockband\";\n\t\t\t\tthis.get_action = \"get_lockband\";\n\t\t\t\tthis.set_action = \"set_lockband\";\n\t\t\t\tthis.lockband_config = {};\n\t\t\t\tthis.checkboxes = {};\n\t\t\t\tthis.available_bandid = {};\n\t\t\t\tthis.band_class_map = {};\n\t\t\t\tthis.init_table();\n\t\t\t\tthis.cb_get = (data) => {\n\t\t\t\t\tthis.render();\n\t\t\t\t}\n\t\t\t\tthis.cb_set = (data) => {\n\t\t\t\t\tthis.get_config();\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tset lock(config){\n\t\t\t\tvar band_class = config.band_class;\n\t\t\t\tvar band_id = config.band_id;\n\t\t\t\tif (!this.lockband_config[band_class].includes(band_id)){\n\t\t\t\t\tthis.lockband_config[band_class].push(band_id)\n\n\t\t\t\t}\n\t\t\t\tthis.checkboxes[band_class][band_id].checked = true;\n\t\t\t}\n\n\t\t\tset unlock(config){\n\t\t\t\tvar band_class = config.band_class;\n\t\t\t\tvar band_id = config.band_id;\n\t\t\t\tthis.lockband_config[band_class] = this.lockband_config[band_class].filter(x => x != band_id);\n\t\t\t\t//set checkbox\n\t\t\t\tthis.checkboxes[band_class][band_id].checked = false;\n\t\t\t}\n\n\t\t\tcreateCheckbox(band_class,band_name,band_id){\n\t\t\t\tlet checkbox = document.createElement('input');\n\t\t\t\tcheckbox.classList = [\"cbi-input-checkbox\"];\n\t\t\t\tcheckbox.type = \"checkbox\";\n\t\t\t\tcheckbox.value = band_id;\n\t\t\t\tcheckbox.setAttribute(\"display-band\",band_name);\n\t\t\t\tcheckbox.addEventListener(\"change\",() => {\n\t\t\t\t\tif (checkbox.checked){\n\t\t\t\t\t\tthis.lock = { \"band_class\": band_class, \"band_id\": band_id };\n\t\t\t\t\t}\n\t\t\t\t\telse{\n\t\t\t\t\t\tthis.unlock = { \"band_class\": band_class, \"band_id\": band_id };\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tthis.checkboxes[band_class][band_id] = checkbox;\n\t\t\t\tif (this.lockband_config[band_class].includes(band_id)) {\n\t\t\t\t\tthis.lock = { \"band_class\": band_class, \"band_id\": band_id };\n\t\t\t\t}\n\t\t\t}\n\t\t\n\t\t\tcreatecheckboxes(band_class){\n\t\t\t\tvar band = this.config[band_class];\n\t\t\t\tvar available_band = band.available_band;\n\t\t\t\tvar lock_band = band.lock_band;\n\t\t\t\tthis.lockband_config[band_class] = lock_band;\n\t\t\t\tif ( available_band.length == 0) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (this.checkboxes[band_class] == undefined) {\n\t\t\t\t\tthis.checkboxes[band_class] = {};\n\t\t\t\t}\n\t\t\t\tif (this.available_bandid[band_class] == undefined) {\n\t\t\t\t\tthis.available_bandid[band_class] = [];\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tfor (let band_cfg of available_band) {\n\t\t\t\t\tlet band_name = band_cfg.band_name;\n\t\t\t\t\tlet band_id = band_cfg.band_id;\n\t\t\t\t\tif (this.available_bandid[band_class].includes(band_id) == false) {\n\t\t\t\t\t\tthis.available_bandid[band_class].push(band_id);\n\t\t\t\t\t}\n\t\t\t\t\tthis.createCheckbox(band_class,band_name,band_id);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tsubmit(band_class)\n\t\t\t{\n\t\t\t\tvar sorted = this.lockband_config[band_class].sort();\n\t\t\t\tvar config = '';\n\t\t\t\tfor (let band_id of sorted) {\n\t\t\t\t\tconfig += band_id + \",\";\n\t\t\t\t}\n\t\t\t\tvar lockband_cfg = {\n\t\t\t\t\t\"band_class\": band_class,\n\t\t\t\t\t\"lock_band\": config.slice(0,-1)\n\t\t\t\t}\n\t\t\t\tvar cfg_string = JSON.stringify(lockband_cfg);\n\t\t\t\tthis.set_config(cfg_string);\n\t\t\t}\n\n\t\t\tselect_all(band_class){\n\t\t\t\t//if all selected, then unselect all\n\t\t\t\tlet lockall = this.lockband_config[band_class].length != this.available_bandid[band_class].length;\n\t\t\t\tfor (let band_id of this.available_bandid[band_class]) {\n\t\t\t\t\tif (lockall) {\n\t\t\t\t\t\tthis.lock = { \"band_class\": band_class, \"band_id\": band_id };\n\t\t\t\t\t}\n\t\t\t\t\telse{\n\t\t\t\t\t\tthis.unlock = { \"band_class\": band_class, \"band_id\": band_id };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\trender() {\n\t\t\t\tfor (let band_class in this.band_class_map){\n\t\t\t\t\tif (this.config[band_class] == undefined) {\n\t\t\t\t\t\tthis.band_class_map[band_class].header.style.display = \"none\";\n\t\t\t\t\t\tthis.band_class_map[band_class].tr.style.display = \"none\";\n\t\t\t\t\t\tthis.band_class_map[band_class].select_all_btn.style.display = \"none\";\n\t\t\t\t\t\tthis.band_class_map[band_class].submit_btn.style.display = \"none\";\n\t\t\t\t\t}\n\t\t\t\t\telse{\n\t\t\t\t\t\tthis.band_class_map[band_class].header.style.display = \"\";\n\t\t\t\t\t\tthis.band_class_map[band_class].tr.style.display = \"\";\n\t\t\t\t\t\tthis.band_class_map[band_class].select_all_btn.style.display = \"\";\n\t\t\t\t\t\tthis.band_class_map[band_class].submit_btn\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfor (let band_class in this.config) {\n\t\t\t\t\tlet header, tr, td, select_all_btn, submit_btn;\n\t\t\t\t\tthis.createcheckboxes(band_class);\n\t\t\t\t\tif (this.band_class_map[band_class] == undefined)\n\t\t\t\t\t{\n\t\t\t\t\t\tthis.createBandTable(band_class);\n\t\t\t\t\t}\n\t\t\t\t\theader = this.band_class_map[band_class].header;\n\t\t\t\t\ttr = this.band_class_map[band_class].tr;\n\t\t\t\t\tselect_all_btn = this.band_class_map[band_class].select_all_btn;\n\t\t\t\t\tsubmit_btn = this.band_class_map[band_class].submit_btn\n\t\t\t\t\ttd = document.createElement('td');\n\t\t\t\t\ttd.classList.add(\"cbi-section-table-cell\");\n\t\t\t\t\ttd.classList.add(\"td\")\n\t\t\t\t\ttd.style.display = \"flex\";\n\t\t\t\t\ttd.style.flexWrap = \"wrap\";\n\t\t\t\t\t//clear tr\n\t\t\t\t\twhile (tr.firstChild) {\n\t\t\t\t\t\ttr.removeChild(tr.firstChild);\n\t\t\t\t\t}\n\t\t\t\t\ttr.appendChild(td);\n\t\t\t\t\tfor (let checkbox in this.checkboxes[band_class]) {\n\t\t\t\t\t\tlet display_value = this.checkboxes[band_class][checkbox].getAttribute(\"display-band\");\n\t\t\t\t\t\tlet span = document.createElement('span');\n\t\t\t\t\t\tspan.innerHTML = display_value;\n\t\t\t\t\t\tlet band_container=document.createElement('span');\n\t\t\t\t\t\tband_container.classList.add(\"band-container\");\n\t\t\t\t\t\tband_container.appendChild(this.checkboxes[band_class][checkbox]);\n\t\t\t\t\t\tband_container.appendChild(span);\n\t\t\t\t\t\ttd.appendChild(band_container);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t}\n\n\t\t\tcreateBandTable(band_class){\n\t\t\t\tlet tr_header, th, tr, td, select_all_btn, submit_btn;\n\t\t\t\ttr_header = document.createElement('div');\n\t\t\t\ttr_header.className = \"tr cbi-section-table-titles anonymous\";\n\t\t\t\tth = document.createElement('div');\n\t\t\t\tth.className = \"th cbi-section-table-cell\";\n\t\t\t\tth.innerHTML = band_class;\n\t\t\t\ttr_header.appendChild(th);\n\t\t\t\ttr = document.createElement('tr');\n\t\t\t\ttr.className = \"tr cbi-section-table-row\";\n\t\t\t\tselect_all_btn = this.createBTN(\"<%:Select All%>\", () => {\n\t\t\t\t\t\tthis.select_all(band_class);\n\t\t\t\t\t});\n\t\t\t\tsubmit_btn = this.createBTN(\"<%:Submit%>\", () => {\n\t\t\t\t\t\tthis.submit(band_class);\n\t\t\t\t\t});\n\t\t\t\tthis.band_class_map[band_class] = {\n\t\t\t\t\t\t\"header\": tr_header,\n\t\t\t\t\t\t\"tr\": tr,\n\t\t\t\t\t\t\"select_all_btn\": select_all_btn,\n\t\t\t\t\t\t\"submit_btn\": submit_btn\n\t\t\t\t\t}\n\t\t\t\tthis.tbody.appendChild(tr_header);\n\t\t\t\tthis.tbody.appendChild(tr);\n\t\t\t\tthis.tbody.appendChild(select_all_btn);\n\t\t\t\tthis.tbody.appendChild(submit_btn);\n\n\t\t\t}\n\n\t\t\tupdate() {\n\t\t\t\tconsole.log(JSON.stringify(this.lockband_config));\n\t\t\t\tconsole.log(JSON.stringify(this.available_bandid));\n\t\t\t\tconsole.log(JSON.stringify(this.band_class_map));\n\t\t\t\tconsole.log(JSON.stringify(this.config));\n\t\t\t\tthis.get_config();\n\t\t\t}\n\n\t}\n\n\tclass RatPrefer extends ModemConfig {\n\t\tconstructor(cfg_id){\n\t\t\tsuper(cfg_id,\"<%:Rat Prefer%>\");\n\t\t\tthis.config_name = \"network_prefer\";\n\t\t\tthis.get_action = \"get_network_prefer\";\n\t\t\tthis.set_action = \"set_network_prefer\";\n\t\t\tthis.selected_rat = [];\n\t\t\tthis.available_rat = [];\n\t\t\tthis.init_table();\n\t\t\tthis.create_submit_btn();\n\t\t\t}\n\n\t\tcb_get(data){\n\t\t\t\t//clear selected_rat\n\t\t\t\tthis.selected_rat = [];\n\t\t\t\t//clear available_rat\n\t\t\t\tthis.available_rat = [];\n\t\t\t\tfor (let key in this.config){\n\t\t\t\t\t\n\t\t\t\t\tif (this.config[key] == 1) {\n\t\t\t\t\t\tthis.selected_rat.push(key);\n\t\t\t\t\t}\n\t\t\t\t\tthis.available_rat.push(key);\n\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tthis.render_checkbox();\n\t\t\t\tthis.render_current_mode();\n\t\t\t}\n\t\tcb_set(data){\n\t\t\t\tthis.get_config();\n\t\t\t}\n\n\t\trender_current_mode(){\n\t\t\tlet selected_mode = []\n\t\t\tfor (let rat in this.config) {\n\t\t\t\tif (this.config[rat] == 1) {\n\t\t\t\t\tselected_mode.push(rat);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.current_mode = selected_mode.join(',');\n\t\t\tthis.current_mode_td.innerHTML = this.current_mode;\n\t\t}\n\n\t\trender_checkbox(){\n\t\t\tif (this.init_view == false) {\n\t\t\t\tthis.init_ele();\n\t\t\t\tthis.init_view = true;\n\t\t\t}\n\t\t\tthis.createCheckboxes();\n\t\t}\n\n\t\tcreate_submit_btn(){\n\t\t\tvar submit_btn = this.createBTN(\"<%:Submit%>\",() => {\n\t\t\t\tthis.submit();\n\t\t\t});\n\t\t\tthis.fieldset.appendChild(submit_btn);\n\t\t}\n\n\t\tcreateCheckbox(rat){\n\t\t\tvar checkbox = document.createElement('input');\n\t\t\tcheckbox.type = \"checkbox\";\n\t\t\tcheckbox.value = rat;\n\t\t\tcheckbox.addEventListener('change',() => {\n\t\t\t\tif (checkbox.checked) {\n\t\t\t\t\tthis.selected_rat.push(rat);\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tthis.selected_rat = this.selected_rat.filter(x => x != rat);\n\t\t\t\t}\n\t\t\t});\n\t\t\treturn checkbox;\n\t\t}\n\n\t\tcreateCheckboxes(){\n\t\t\t//clear select_td\n\t\t\twhile (this.select_td.firstChild) {\n\t\t\t\tthis.select_td.removeChild(this.select_td.firstChild);\n\t\t\t}\n\t\t\tvar network_prefer = this.config;\n\t\t\tfor (let rat of this.available_rat) {\n\t\t\t\tvar checkbox = this.createCheckbox(rat);\n\t\t\t\tif (this.selected_rat.includes(rat)) {\n\t\t\t\t\tcheckbox.checked = true;\n\t\t\t\t}\n\t\t\t\tvar span = document.createElement('span');\n\t\t\t\tspan.innerHTML = rat;\n\t\t\t\tthis.select_td.appendChild(checkbox);\n\t\t\t\tthis.select_td.appendChild(span);\n\t\t\t}\n\t\t}\n\n\t\tupdate(){\n\t\t\tthis.get_config();\n\t\t}\n\n\t\tsubmit(){\n\t\t\tthis.set_config(JSON.stringify(this.selected_rat));\n\t\t}\n\n\t\tinit_ele(){\n\t\t\tvar header_tr,current_mode_th,select_th,setting_tr,current_mode_td,select_td;\n\t\t\theader_tr = this.createTRHeader();\n\t\t\tcurrent_mode_th = this.createTH(\"<%:Current Mode%>\");\n\t\t\tselect_th = this.createTH(\"<%:Setting%>\");\n\t\t\tsetting_tr = this.createTR();\n\t\t\tcurrent_mode_td = this.createTD();\n\t\t\tselect_td = this.createTD();\n\t\t\theader_tr.appendChild(current_mode_th);\n\t\t\theader_tr.appendChild(select_th);\n\t\t\tsetting_tr.appendChild(current_mode_td);\n\t\t\tsetting_tr.appendChild(select_td);\n\t\t\tthis.tbody.appendChild(header_tr);\n\t\t\tthis.tbody.appendChild(setting_tr);\n\t\t\tthis.current_mode_td = current_mode_td;\n\t\t\tthis.select_td = select_td;\n\n\t\t}\n\t}\n\t\n\tclass DialMode extends ModemConfig {\n\t\tconstructor(cfg_id){\n\t\t\tsuper(cfg_id,\"<%:Dial Mode%>\");\n\t\t\tthis.config_name = \"\";\n\t\t\tthis.get_action = \"get_mode\";\n\t\t\tthis.set_action = \"set_mode\";\n\t\t\tthis.avalibale_mode = [];\n\t\t\tthis.selected_mode = null;\n\t\t\tthis.init_table();\n\t\t\tthis.td_map = {\n\t\t\t\t\"current_mode\": null,\n\t\t\t\t\"radio_div\": null,\n\t\t\t}\n\t\t\tthis.cb_get = (data) => {\n\t\t\t\tthis.render();\n\t\t\t}\n\t\t\tthis.cb_set = (data) => {\n\t\t\t\tthis.get_config();\n\t\t\t}\n\t\t}\n\n\t\trender(){\n\t\t\tif (this.td_map[\"current_mode\"] == null) {\n\t\t\t\tthis.init_ele();\n\t\t\t}\n\n\t\t\tif (this.config.disable_mode_btn == 0 || this.config.disable_mode_btn == undefined) {\n\t\t\t\tthis.mode_btn.disabled = false;\n\t\t\t}\n\t\t\telse{\n\t\t\t\tthis.mode_btn.disabled = true;\n\t\t\t}\n\n\t\t\tfor (let key in this.config.mode){\n\t\t\t\tif (this.avalibale_mode.includes(key) == false)\n\t\t\t\t{\n\t\t\t\t\tthis.avalibale_mode.push(key);\n\t\t\t\t}\n\t\t\t\tif (this.config.mode[key] == 1) {\n\t\t\t\t\tthis.selected_mode = key;\n\t\t\t\t\tthis.td_map.current_mode.innerHTML = key;\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.create_mode_radio();\n\t\t\t\n\t\t}\n\n\t\tinit_ele(){\n\t\t\tvar radio_div_th, current_mode_th, radio_div, current_mode, header_tr, setting_tr;\n\t\t\theader_tr = document.createElement('div');\n\t\t\theader_tr.className = \"tr cbi-section-table-titles anonymous\";\n\t\t\tradio_div_th = document.createElement('div');\n\t\t\tradio_div_th.className = \"th cbi-section-table-cell\";\n\t\t\tradio_div_th.innerHTML = \"<%:Dial Mode%>\";\n\t\t\tcurrent_mode_th = document.createElement('div');\n\t\t\tcurrent_mode_th.className = \"th cbi-section-table-cell\";\n\t\t\tcurrent_mode_th.innerHTML = \"<%:Current Mode%>\";\n\t\t\tsetting_tr = document.createElement('div');\n\t\t\tsetting_tr.className = \"tr cbi-section-table-row\";\n\t\t\tradio_div = document.createElement('div');\n\t\t\tradio_div.className = \"td cbi-section-table-cell left\";\n\t\t\tcurrent_mode = document.createElement('div');\n\t\t\tcurrent_mode.className = \"td cbi-section-table-cell left\";\n\t\t\theader_tr.appendChild(current_mode_th);\n\t\t\theader_tr.appendChild(radio_div_th);\n\t\t\t\n\t\t\tsetting_tr.appendChild(current_mode);\n\t\t\tsetting_tr.appendChild(radio_div);\n\t\t\t\n\t\t\tthis.tbody.appendChild(header_tr);\n\t\t\tthis.tbody.appendChild(setting_tr);\n\t\t\tthis.td_map[\"radio_div\"] = radio_div;\n\t\t\tthis.td_map[\"current_mode\"] = current_mode;\n\t\t\tthis.mode_btn = this.createBTN(\"<%:Submit%>\",() => {\n\t\t\t\tthis.set_config(this.selected_mode);\n\t\t\t});\n\t\t\tthis.tbody.appendChild(this.mode_btn);\n\t\t}\n\n\t\tcreate_mode_radio(){\n\t\t\twhile (this.td_map.radio_div.firstChild) {\n\t\t\t\t\tthis.td_map.radio_div.removeChild(this.td_map.radio_div.firstChild);\n\t\t\t\t}\n\t\t\tfor (let mode of this.avalibale_mode) {\n\t\t\t\tlet radio = this.createRadio(\"mode\",mode);\n\t\t\t\tif (mode == this.selected_mode) {\n\t\t\t\t\tradio.checked = true;\n\t\t\t\t}\n\t\t\t\tradio.addEventListener('change',() => {\n\t\t\t\t\tthis.selected_mode = mode;\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tlet span = document.createElement('span');\n\t\t\t\tspan.innerHTML = mode;\n\t\t\t\t//clear radio_div\n\t\t\t\t\n\t\t\t\tthis.td_map.radio_div.appendChild(radio);\n\t\t\t\tthis.td_map.radio_div.appendChild(span);\n\t\t\t}\n\t\t\t\n\t\t}\n\n\t\tupdate(){\n\t\t\tthis.get_config();\n\t\t}\n\t}\n\n\tclass NeighborCell extends ModemConfig {\n\t\tconstructor(cfg_id){\n\t\t\tsuper(cfg_id,\"<%:Neighbor Cell%>\");\n\t\t\tthis.config_name = \"neighborcell\";\n\t\t\tthis.get_action = \"get_neighborcell\";\n\t\t\tthis.set_action = \"set_neighborcell\";\n\t\t\tthis.task = null;\n\t\t\tthis.init_nc_table();\n\t\t}\n\n\t\tscan_neighborcell(){\n\t\t\tthis.get_config();\n\t\t}\n\n\t\t// pause(){\n\t\t// \tif (this.task != null) {\n\t\t// \t\tclearInterval(this.task);\n\t\t// \t}\n\t\t// }\n\n\t\t// update(){\n\t\t\t\n\t\t// \tthis.task = setInterval(() => {\n\t\t// \t\tthis.get_config();\n\t\t// \t},10000);\n\t\t// }\n\n\t\tnr_options(){\n\t\t\tif (this.rat_input.selectedIndex == 0) {\n\t\t\t\tthis.band_tr.style.display = \"none\";\n\t\t\t\tthis.scs_tr.style.display = \"none\";\n\t\t\t}\n\t\t\telse{\n\t\t\t\tthis.band_tr.style.display = \"\";\n\t\t\t\tthis.scs_tr.style.display = \"\";\n\t\t\t}\n\t\t}\n\n\t\tinit_nc_table(){\n\t\t\tvar neighborcell_table,setting_table,status_table ;\n\t\t\tneighborcell_table = this.createTable();\n\t\t\tstatus_table = this.createTable();\n\t\t\tsetting_table = this.createTable();\n\t\t\t\n\t\t\tthis.fieldset.appendChild(neighborcell_table);\n\t\t\tthis.fieldset.appendChild(status_table);\n\t\t\tthis.fieldset.appendChild(setting_table);\n\n\t\t\tthis.neighborcell_table = neighborcell_table.querySelector('tbody');\n\t\t\tthis.status_table = status_table.querySelector('tbody');\n\t\t\tthis.setting_table = setting_table.querySelector('tbody');\n\n\t\t\tvar pci_tr,arfcn_tr,band_tr,scs_tr,header,td,td1,th,pci_input,arfcn_input,band_input,scs_input,rat_input,rat_tr;\n\t\t\tvar status_th,status_trh;\n\t\t\theader = this.createTRHeader();\n\t\t\tth = this.createTH(\"<%:Lock Cell Setting%>\");\n\t\t\theader.appendChild(th);\n\n\t\t\trat_input = this.createDroplist({0:\"LTE\",1:\"NR\"});\n\t\t\trat_tr = this.createTR();\n\t\t\ttd = this.createTD(\"<%:RAT%>\");\n\t\t\ttd1 = this.createTD();\n\t\t\ttd1.appendChild(rat_input);\n\t\t\trat_tr.appendChild(td);\n\t\t\trat_tr.appendChild(td1);\n\n\n\t\t\tpci_tr = this.createTR();\n\t\t\ttd = this.createTD(\"<%:PCI%>\");\n\t\t\tpci_input = this.createInput(\"pci\",\"\");\n\t\t\ttd1 = this.createTD();\n\t\t\ttd1.appendChild(pci_input);\n\t\t\tpci_tr.appendChild(td);\n\t\t\tpci_tr.appendChild(td1);\n\n\t\t\tarfcn_tr = this.createTR();\n\t\t\ttd = this.createTD(\"<%:ARFCN%>\");\n\t\t\tarfcn_input = this.createInput(\"arfcn\",\"\");\n\t\t\ttd1 = this.createTD();\n\t\t\ttd1.appendChild(arfcn_input);\n\t\t\tarfcn_tr.appendChild(td);\n\t\t\tarfcn_tr.appendChild(td1);\n\t\t\t\n\t\t\tband_tr = this.createTR();\n\t\t\ttd = this.createTD(\"<%:Band%>\");\n\t\t\tband_input = this.createInput(\"band\",\"\");\n\t\t\ttd1 = this.createTD();\n\t\t\ttd1.appendChild(band_input);\n\t\t\tband_tr.appendChild(td);\n\t\t\tband_tr.appendChild(td1);\n\n\t\t\tscs_tr = this.createTR();\n\t\t\ttd = this.createTD(\"<%:SCS%>\");\n\t\t\tscs_input = this.createDroplist({0:\"15KHZ\",1:\"30KHZ\"});\n\t\t\ttd1 = this.createTD();\n\t\t\ttd1.appendChild(scs_input);\n\t\t\tscs_tr.appendChild(td);\n\t\t\tscs_tr.appendChild(td1);\n\n\t\t\tstatus_th = this.createTH(\"<%:Status%>\");\n\t\t\tstatus_trh = this.createTRHeader();\n\t\t\tstatus_trh.appendChild(status_th);\n\t\t\tthis.status_table.appendChild(status_trh);\n\n\t\t\tthis.pci_input = pci_input;\n\t\t\tthis.arfcn_input = arfcn_input;\n\t\t\tthis.band_input = band_input;\n\t\t\tthis.scs_input = scs_input;\n\t\t\tthis.rat_input = rat_input;\n\t\t\tthis.band_tr = band_tr;\n\t\t\tthis.scs_tr = scs_tr;\n\t\t\tthis.band_tr.style.display = \"none\";\n\t\t\tthis.scs_tr.style.display = \"none\";\n\t\t\tthis.rat_input.addEventListener('change',()=>{\n\t\t\t\tthis.nr_options();\n\t\t\t});\n\n\t\t\tvar submit_btn = this.createBTN(\"<%:Submit%>\",() => {\n\t\t\t\tvar config = {\n\t\t\t\t\t\"rat\": this.rat_input.selectedIndex,\n\t\t\t\t\t\"pci\": this.pci_input.value,\n\t\t\t\t\t\"arfcn\": this.arfcn_input.value,\n\t\t\t\t\t\"band\": this.band_input.value,\n\t\t\t\t\t\"scs\": this.scs_input.selectedIndex\n\t\t\t\t}\n\t\t\t\tthis.set_config(JSON.stringify(config));\n\t\t\t});\n\n\t\t\t//add scan button\n\t\t\tvar scan_btn = this.createBTN(\"<%:Scan%>\",() => {\n\t\t\t\tthis.scan_neighborcell();\n\t\t\t});\n\n\t\t\tthis.setting_table.appendChild(header);\n\t\t\tthis.setting_table.appendChild(rat_tr);\n\t\t\tthis.setting_table.appendChild(pci_tr);\n\t\t\tthis.setting_table.appendChild(arfcn_tr);\n\t\t\tthis.setting_table.appendChild(band_tr);\n\t\t\tthis.setting_table.appendChild(scs_tr);\n\t\t\tthis.setting_table.appendChild(scan_btn);\n\t\t\tthis.setting_table.appendChild(submit_btn);\n\t\t}\n\n\t\trender_neighborcell(){\n\t\t\t//clear neighborcell_table\n\t\t\twhile (this.neighborcell_table.querySelector(\"tr\")) {\n\t\t\t\tlet remove = this.neighborcell_table.querySelector(\"tr\")\n\t\t\t\tthis.neighborcell_table.removeChild(remove);\n\t\t\t}\n\t\t\tvar nr,lte,tr_left\n\t\t\tnr = this.config.NR;\n\t\t\tlte = this.config.LTE;\n\t\t\tfor (let cell_info of nr) {\n\t\t\t\tthis.create_nc_tr(1,cell_info);\n\t\t\t\t}\n\t\t\tfor (let cell_info of lte) {\n\t\t\t\tthis.create_nc_tr(0,cell_info);\n\t\t\t}\n\n\t\t}\n\n\t\trender_status(){\n\t\t\t//clear status_table\n\t\t\twhile (this.status_table.querySelector(\"tr\")) {\n\t\t\t\tthis.status_table.removeChild(this.status_table.querySelector(\"tr\"));\n\t\t\t}\n\t\t\tvar status = this.config.lockcell_status;\n\t\t\tfor (let key in status) {\n\t\t\t\tif (status[key] != \"\"){\n\t\t\t\t\tthis.create_status_tr(key + \":\" + status[key].toUpperCase());\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tcreate_status_tr(status){\n\t\t\tvar tr = this.createTR();\n\t\t\tvar td = this.createTD(status);\n\t\t\ttr.appendChild(td);\n\t\t\tthis.status_table.appendChild(tr);\n\t\t}\n\n\t\tcreate_nc_tr(rat,cell_info){\n\t\t\tif (rat == 0) {\n\t\t\t\tvar text = \"LTE:\";\n\t\t\t}\n\t\t\telse{\n\t\t\t\tvar text = \"NR:\";\n\t\t\t}\n\t\t\tfor (let key in cell_info) {\n\t\t\t\tif (cell_info[key] != \"\"){\n\t\t\t\t\ttext += key + \":\" + cell_info[key] + \" \";\n\t\t\t\t}\t\n\t\t\t}\n\t\t\tlet tr_left = this.createTD(text);\n\t\t\tlet tr_right = this.create_copy_btn_td(rat,cell_info);\n\t\t\tlet tr = this.createTR();\n\t\t\ttr.appendChild(tr_left);\n\t\t\ttr.appendChild(tr_right);\n\t\t\tthis.neighborcell_table.appendChild(tr);\n\t\t}\n\n\t\tcreate_copy_btn_td(rat,cell_info){\n\t\t\tvar copy_btn = this.createBTN(\"<%:Copy%>\",() => {\n\t\t\t\tthis.pci_input.value = cell_info.pci;\n \t\t\t\tthis.arfcn_input.value = cell_info.arfcn;\n \t\t\t\tthis.band_input.value = cell_info.band;\n\t\t\t\tthis.rat_input.selectedIndex = rat;\n\t\t\t\tthis.nr_options()\n\t\t\t});\n\t\t\tvar td = document.createElement('td');\n\t\t\ttd.className = \"td cbi-section-table-cell left\";\n\t\t\ttd.setAttribute(\"width\",\"10%\");\n\t\t\ttd.appendChild(copy_btn);\n\t\t\t\n\t\t\treturn td;\n\t\t}\n\n\t\tcb_get(){\n\t\t\tthis.render_neighborcell();\n\t\t\tthis.render_status();\n\t\t}\n\n\t\t\n\t}\n\n\tclass IMEI extends ModemConfig {\n\t\tconstructor(cfg_id){\n\t\t\tsuper(cfg_id,\"<%:Set IMEI%>\");\n\t\t\tthis.config_name = \"imei\";\n\t\t\tthis.get_action = \"get_imei\";\n\t\t\tthis.set_action = \"set_imei\";\n\t\t\tthis.render();\n\t\t}\n\n\t\trender(){\n\t\t\tthis.imei_input = this.createInput(\"imei\",this.config);\n\t\t\tthis.imei_btn = this.createBTN(\"<%:Submit%>\",() => {\n\t\t\t\tthis.set_config(this.imei_input.value);\n\t\t\t});\n\t\t\tthis.fieldset.appendChild(this.imei_input);\n\t\t\tthis.fieldset.appendChild(this.imei_btn);\n\t\t}\n\n\t\tcb_get(){\n\t\t\tthis.imei_input.value = this.config;\n\t\t}\n\n\t\tcb_set(){\n\t\t\tthis.imei_input.value = this.config;\n\t\t}\n\n\t\tupdate(){\n\t\t\tthis.get_config();\n\t\t}\n\t\t\n\t}\n\n\tclass RebootModem extends ModemConfig {\n\t\tconstructor(cfg_id){\n\t\t\tsuper(cfg_id,\"<%:Reboot Modem%>\");\n\t\t\tthis.config_name = \"reboot_caps\";\n\t\t\tthis.get_action = \"get_reboot_caps\";\n\t\t\tthis.set_action = \"do_reboot\";\n\t\t\tthis.render();\n\t\t}\n\n\t\tcb_get(){\n\t\t\tthis.soft_reboot_btn.disabled = !this.config.soft_reboot_caps;\n\t\t\tthis.hard_reboot_btn.disabled = !this.config.hard_reboot_caps;\n\t\t}\n\n\n\t\trender(){\n\t\t\tthis.soft_reboot_btn = this.createBTN(\"<%:Soft Reboot%>\",() => {\n\t\t\t\t\tthis.set_config('{\"method\":\"soft\"}');\n\t\t\t\t});\n\t\t\tthis.hard_reboot_btn = this.createBTN(\"<%:Hard Reboot%>\",() => {\n\t\t\t\tthis.set_config('{\"method\":\"hard\"}');\n\t\t\t});\n\t\t\tthis.fieldset.appendChild(this.soft_reboot_btn);\n\t\t\tthis.fieldset.appendChild(document.createElement(\"br\"));\n\t\t\tthis.fieldset.appendChild(this.hard_reboot_btn);\n\t\t\t}\n\t\tupdate(){\n\t\t\tthis.get_config();\n\t\t}\n\t\t\n\t\t\n\t}\n\t\n\tclass AtDebug extends ModemConfig {\n\t\tconstructor(cfg_id){\n\t\t\tsuper(cfg_id,\"<%:AT Debug%>\");\n\t\t\tthis.config_name = \"at_cfg\";\n\t\t\tthis.get_action = \"get_at_cfg\";\n\t\t\tthis.set_action = \"send_at\";\n\t\t\tthis.at_port=null;\n\t\t\tthis.last_choice_cmd = null;\n\t\t\tthis.render();\n\t\t}\n\n\t\trender(){\n\t\t\tthis.textarea = document.createElement('textarea');\n\t\t\tthis.textarea.style.width = \"100%\";\n\t\t\tthis.textarea.style.height = \"600px\";\n\t\t\tthis.textarea.readOnly = true;\n\t\t\tthis.at_btn = this.createBTN(\"<%:Send%>\",() => {\n\t\t\t\tlet payload = {\n\t\t\t\t\t\"at\": this.at_input,\n\t\t\t\t\t\"port\": this.at_port\n\t\t\t\t}\n\t\t\t\tthis.set_config(JSON.stringify(payload));\n\t\t\t\t//append input to textarea\n\t\t\t\tthis.textarea.value += this.at_input +  \" >> \" + this.at_port + \"\\n\";\n\t\t\t});\n\t\t\tthis.clear_btn = this.createBTN(\"<%:Clear%>\",() => {\n\t\t\t\tthis.textarea.value = \"\";\n\t\t\t});\n\t\t\tthis.clear_port_btn = this.createBTN(\"<%:Clear AT Port%>\",() => {\n\t\t\t\tthis.at_port_selector.value = \"\";\n\t\t\t\tthis.at_port_selector.dispatchEvent(new Event('change'));\n\t\t\t});\n\t\t\tthis.clear_cmd_btn = this.createBTN(\"<%:Clear AT Command%>\",() => {\n\t\t\t\tthis.cmd_prompt_selector.value = \"\";\n\t\t\t\tthis.cmd_prompt_selector.dispatchEvent(new Event('change'));\n\t\t\t});\n\t\t\tvar { input , selector } = this.createDroplistWithInput(\"at_port_selector\",\"<%:Select Port%>\" );\n\t\t\tselector.addEventListener(\"change\",(event) => {\n\t\t\t\tthis.at_port =  event.target.value;\n\t\t\t});\n\t\t\tthis.at_port_selector = selector;\n\t\t\tthis.at_port_input = input;\n\t\t\tvar { input , selector } = this.createDroplistWithInput(\"cmd_prompt\",\"<%:Input AT Command%>\" );\n\t\t\tselector.addEventListener('change',(event) => {\n\t\t\t\tthis.at_input = event.target.value;\n\t\t\t});\n\t\t\tthis.cmd_prompt = input;\n\t\t\tthis.cmd_prompt_selector = selector;\n\t\t\t\n\t\t\tvar table = this.createTable();\n\t\t\tthis.fieldset.appendChild(table);\n\n\t\t\tvar tr,td_l,td_r;\n\t\t\ttr = this.createTR();\n\t\t\ttd_l = this.createTD(\"<%:AT Port%>:\");\n\t\t\ttd_r = this.createTD();\n\t\t\ttd_r.style.width = \"70%\";\n\t\t\ttd_r.appendChild(this.at_port_selector);\n\t\t\ttd_r.appendChild(this.at_port_selector.descr);\n\t\t\ttd_r.appendChild(this.at_port_input);\n\t\t\ttd_r.appendChild(this.at_port_input.descr);\n\t\t\t\n\t\t\ttr.appendChild(td_l);\n\t\t\ttr.appendChild(td_r);\n\t\t\ttable.appendChild(tr);\n\t\t\t\n\t\t\ttr = this.createTR();\n\t\t\ttd_l = this.createTD(\"<%:AT Command%>:\");\n\t\t\ttd_r = this.createTD();\n\t\t\ttd_r.appendChild(this.cmd_prompt_selector);\n\t\t\ttd_r.appendChild(this.cmd_prompt);\n\t\t\ttd_r.appendChild(this.cmd_prompt.descr);\n\t\t\ttd_r.appendChild(this.cmd_prompt_selector.descr);\n\t\t\ttr.appendChild(td_l);\n\t\t\ttr.appendChild(td_r);\n\t\t\ttable.appendChild(tr);\n\t\t\ttr = this.createTR();\n\t\t\ttd_l = this.createTD();\n\t\t\tlet span = document.createElement('span');\n\t\t\tspan.classList.add(\"flex_container\");\n\t\t\ttd_l.setAttribute(\"colspan\",2);\n\t\t\tspan.appendChild(this.at_btn);\n\t\t\tspan.appendChild(this.clear_port_btn);\n\t\t\tspan.appendChild(this.clear_cmd_btn);\n\t\t\ttd_l.appendChild(span);\n\t\t\ttr.appendChild(td_l);\n\t\t\ttable.appendChild(tr);\n\t\t\tthis.fieldset.appendChild(table);\n\t\t\tthis.fieldset.appendChild(this.textarea);\n\t\t\tthis.fieldset.appendChild(this.clear_btn);\n\t\t}\n\n\t\tcb_get(){\n\t\t\t//clear ports\n\t\t\twhile (this.at_port_selector.firstChild) {\n\t\t\t\tthis.at_port_selector.removeChild(this.at_port_selector.firstChild);\n\t\t\t}\n\t\t\t//clear cmds\n\t\t\twhile (this.cmd_prompt_selector.firstChild) {\n\t\t\t\tthis.cmd_prompt_selector.removeChild(this.cmd_prompt_selector.firstChild);\n\t\t\t}\n\n\t\t\t//empty option\n\t\t\tvar empty_option1=document.createElement(\"option\");\n\t\t\tempty_option1.value = \"\";\n\t\t\tempty_option1.innerHTML = \"<%:-- custom ---%>\";\n\t\t\tvar empty_option2=document.createElement(\"option\");\n\t\t\tempty_option2.value = \"\";\n\t\t\tempty_option2.innerHTML = \"<%:-- custom ---%>\";\n\t\t\tthis.cmd_prompt_selector.appendChild(empty_option1);\n\t\t\tthis.at_port_selector.appendChild(empty_option2);\n\t\t\tvar ports=this.config.ports;\n\t\t\tvar other_ttys=this.config.other_ttys;\n\t\t\tvar valid_ports=this.config.valid_ports;\n\t\t\tvar using_port=this.config.using_port;\n\t\t\tvar cmds = this.config.cmds;\n\t\t\t//append empty option to at_port_selector\n\t\t\t\n\t\t\tfor (let port of other_ttys) {\n\t\t\t\tlet select;\n\t\t\t\tlet displayport = port;\n\t\t\t\tif (ports.includes(port) == false) {\n\t\t\t\t\tdisplayport += \"<%:(Not belong to this modem)%>\";\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tif (valid_ports.includes(port) == false) {\n\t\t\t\t\t\tdisplayport += \"<%:(invalid)%>\";\n\t\t\t\t\t}\n\t\t\t\t\telse{\n\t\t\t\t\t\tdisplayport += \"<%:(valid)%>\";\n\t\t\t\t\t}\n\t\t\t\t\tif (port == using_port) {\n\t\t\t\t\t\tdisplayport += \"<%:(using)%>\";\n\t\t\t\t\t\tselect = true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t\n\t\t\t\tvar option = document.createElement('option');\n\t\t\t\toption.value = port;\n\t\t\t\toption.innerHTML = displayport;\n\t\t\t\tif (select) {\n\t\t\t\t\toption.selected = true;\n\t\t\t\t\tthis.at_port = port;\n\t\t\t\t}\n\t\t\t\tthis.at_port_selector.appendChild(option);\n\t\t\t}\n\t\t\t\n\t\t\t\n\t\t\tfor (let cmd of cmds) {\n\t\t\t\tvar option = document.createElement('option');\n\t\t\t\toption.value = cmd.value;\n\t\t\t\toption.innerHTML = cmd.name;\n\t\t\t\tthis.cmd_prompt_selector.appendChild(option);\n\t\t\t}\n\t\t\tthis.cmd_prompt_selector.dispatchEvent(new Event('change'));\n\t\t\tthis.at_port_selector.dispatchEvent(new Event('change'));\n\t\t\t\n\t\t\t\n\t\t}\n\t\t\n\t\tcb_update(){\n\t\t\t//clear 2 input\n\t\t\tthis.at_port_selector.value = \"\";\n\t\t\tthis.cmd_prompt.value = \"\";\n\t\t\tthis.get_config();\n\t\t}\n\n\t\tcb_set(){\n\t\t\t//append response to textarea\n\t\t\tthis.textarea.value += this.config.res + \"<<EOF\\n\";\n\n\t\t}\n\t\t\n\t}\n\t\n\tclass Select_Modem {\n\t\tconstructor(){\n\t\t\tthis.modem_selector = document.getElementById('modem_selector');\n\t\t\tthis.cfg_id = null;\n\t\t\tthis.modem_cfg_list = [];\n\t\t\tthis.create_modem_cfg_selector();\n\t\t\tthis.update_modem_cfg_list();\n\t\t}\n\t\t\n\t\tcreate_modem_cfg_selector() {\n\t\t\tvar selector = document.createElement('select');\n\t\t\tselector.addEventListener('change', (event) => {\n\t\t\t\tthis.cfg_id = event.target.value;\n\t\t\t\tthis.update_cfg_id(this.cfg_id);\n\t\t\t});\n\t\t\tthis.modem_selector.appendChild(selector);\n\t\t\tthis.selector = selector;\n\t\t}\n\n\t\tupdate_modem_cfg_list() {\n\t\t\tXHR.poll(5, '<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"get_modem_cfg\")%>', {}, (x, data) => {\n\t\t\t\tvar new_cfg_list = [];\n\t\t\t\tvar cfgs = data.cfgs;\n\t\t\t\tfor (let i = 0; i < cfgs.length; i++) {\n\t\t\t\t\tvar cfg = cfgs[i];\n\t\t\t\t\tvar name = cfg.name;\n\t\t\t\t\tvar value = cfg.cfg;\n\t\t\t\t\tnew_cfg_list.push({ \"value\": value, \"name\": name });\n\t\t\t\t}\n\t\t\t\tif (JSON.stringify(new_cfg_list) != JSON.stringify(this.modem_cfg_list)) {\n\t\t\t\t\tthis.cfg_options = new_cfg_list;\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\tset cfg_options(value) {\n\t\t\tvar longger = this.modem_cfg_list.length > value.length ? this.modem_cfg_list : value;\n\t\t\tif (longger.length == 0) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tfor (let i = 0; i < longger.length; i++) {\n\t\t\t\tvar option = this.selector.options[i];\n\t\t\t\tif (i < value.length) {\n\t\t\t\t\tif (i >= this.selector.options.length) {\n\t\t\t\t\t\toption = document.createElement('option');\n\t\t\t\t\t\tthis.selector.appendChild(option);\n\t\t\t\t\t}\n\t\t\t\t\toption.value = value[i].value;\n\t\t\t\t\toption.innerHTML = value[i].name;\n\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tthis.selector.removeChild(option);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis.cfg_id = this.selector.value;\n\t\t\tthis.modem_cfg_list = value;\n\t\t\tthis.update_cfg_id(this.cfg_id);\n\t\t}\n\t}\n\n\tclass TabMenu extends Select_Modem {\n\t\tfunctions = {\n\t\t\t\t\"DialMode\": {\"class\": DialMode, \"name\":\"<%:Dial Mode%>\"},\n\t\t\t\t\"RatPrefer\": {\"class\": RatPrefer, \"name\":\"<%:Rat Prefer%>\"},\n\t\t\t\t\"IMEI\": {\"class\": IMEI, \"name\": \"<%:Set IMEI%>\"},\n\t\t\t\t\"NeighborCell\": {\"class\": NeighborCell, \"name\": \"<%:Neighbor Cell%>\"},\n\t\t\t\t\"LockBand\": {\"class\": Lockband, \"name\":\"<%:Lock Band%>\"},\n\t\t\t\t\"RebootModem\": {\"class\": RebootModem, \"name\":\"<%:Reboot Modem%>\"},\n\t\t\t\t\"AtDebug\": {\"class\": AtDebug, \"name\":\"<%:AT Debug%>\"}\n\t\t\t}\n\t\tconstructor(){\n\t\t\tsuper();\n\t\t\tthis.cbi_map = document.querySelector('.cbi-map');\n\t\t\tthis.class_map = {};\n\t\t\tthis.datatabs = [];\n\t\t\tthis.disabled_features = [];\n\t\t\tthis.hotplug_elements = [];\n\t\t\t//this.create_tabmenu();\n\t\t\t\n\t\t}\n\n\t\tupdate_cfg_id(cfg_id){\n\t\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"modem_ctrl\")%>', { \"cfg\": cfg_id , \"action\" : \"get_disabled_features\"}, (x, data) => {\n\t\t\t\t//clear class_map\n\t\t\t\t\n\t\t\t\tthis.disabled_features = data.disabled_features ? data.disabled_features : [];\n\t\t\t\t//delete tabmenu\n\t\t\t\tfor (let element of this.hotplug_elements){\n\t\t\t\t\telement.parentNode.removeChild(element);\n\t\t\t\t}\n\n\t\t\t\tthis.class_map = {};\n\t\t\t\tthis.datatabs = [];\n\t\t\t\tthis.hotplug_elements = [];\n\t\t\t\tthis.create_tabmenu();\n\t\t\t\tfor (let key in this.class_map) {\n\t\t\t\t\tthis.class_map[key].cfg_id = cfg_id;\n\t\t\t\t\tthis.class_map[key].get_config();\n\t\t\t\t}\n\t\t\t\t//check if all datatab not selected\n\t\t\t\tfor (let tab of this.datatabs) {\n\t\t\t\t\tif (tab.className == \"cbi-tab\") {\n\t\t\t\t\t\tthis.switch_tab(tab);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tthis.switch_tab(this.datatabs[0]);\n\t\t\t\t});\n\t\t}\n\n\t\tcreate_tabmenu(){\n\t\t\t//add support function to tabmenu\n\t\t\tvar tabmenu = document.createElement('ul');\n\t\t\tthis.hotplug_elements.push(tabmenu);\n\t\t\ttabmenu.className = \"cbi-tabmenu\";\n\t\t\tfor (let key in this.functions) {\n\t\t\t\tif (this.disabled_features.includes(key)) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tvar li = document.createElement('li');\n\t\t\t\tli.className = \"cbi-tab-disabled\";\n\t\t\t\tli.innerHTML = this.functions[key].name;\n\t\t\t\tli.setAttribute(\"data-tab\", key);\n\t\t\t\tli.addEventListener('click', (event) => {\n\t\t\t\t\tthis.switch_tab(event.target)\n\t\t\t\t});\n\t\t\t\ttabmenu.appendChild(li);\n\t\t\t\tthis.datatabs.push(li);\n\t\t\t}\n\t\t\tthis.cbi_map.appendChild(tabmenu);\n\t\t}\n\n\t\tswitch_tab(target){\n\t\t\ttarget.className = \"cbi-tab\";\n\t\t\ttarget.style.display = \"\";\n\t\t\tvar datatab = target.getAttribute(\"data-tab\");\n\t\t\tfor (let i = 0; i < this.datatabs.length; i++) {\n\t\t\t\tif (this.datatabs[i] != target) {\n\t\t\t\t\tthis.datatabs[i].className = \"cbi-tab-disabled\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (this.class_map[datatab] == undefined) {\n\t\t\t\tthis.class_map[datatab] = new this.functions[datatab].class(this.cfg_id);\n\t\t\t\tthis.hotplug_elements.push(this.class_map[datatab].fieldset);\n\t\t\t}\n\t\t\tfor (let key in this.class_map) {\n\t\t\t\tthis.class_map[key].hide();\n\t\t\t}\n\t\t\tthis.class_map[datatab].show();\n\t\t}\n\n\t\n\t}\n\n\t\n\twindow.onload = function(){\n\t\tvar tabmenu = new TabMenu();\n\t}\n\n</script>\n<style>\n\t.cbi-tabmenu li {\n\t\tpadding: 0.5rem;\n\t}\n\n\t.band-container {\n\t\tdisplay: flex;\n\t\tmargin-top: 1rem;\n\t\talign-items: center;\n\t\tmin-width: 15%;\n\t}\n\n\t.flex_container {\n\t\tdisplay: flex;\n\t\tflex-wrap: wrap;\n\t\tjustify-content: space-around;\n\t}\n</style>\n<div class=\"cbi-map\">\n\t<fieldset class=\"cbi-section\">\n\t\t<table class=\"table\">\n\t\t\t<tbody>\n\t\t\t\t<tr class=\"tr\">\n\t\t\t\t\t<td class=\"td\" width=\"33%\"><%:Modem Name%></td>\n\t\t\t\t\t<td class=\"td\" id=\"modem_selector\">\n\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</tbody>\n\t\t</table>\n\t</fieldset>\n</div>\n<%+footer%>\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem/luasrc/view/qmodem/modem_info.htm",
    "content": "<%+header%>\n<style type=\"text/css\">\n    #warning_message_box  {\n\t\tmargin: 1rem;\n\t\tpadding: 1rem;\n\t\theight: auto;\n\n\t}\n    \n    .table {\n        display: table;\n    }\n    \n    .compat-progressbar {\n\tborder: 1px solid var(--border-color-high,var(--progressbarColor,var(--background-color)));\n\tborder-radius: 3px;\n\tposition: relative;\n\tmin-width: 170px;\n\theight: 8px;\n\tmargin: 1.4em 0 4px 0;\n\tbackground: var(--background-color-medium,var(--progressbarColor));\n    }\n\n    .compat-progressbar > div {\n        background: var(--progressbar, var(--primary, var(--primary-color-medium)));\n        height: 100%;\n        transition: width .25s ease-in;\n        width: 0%;\n        border-radius: 2px;\n    }\n\n    .compat-progressbar::before {\n        position: absolute;\n        top: -1.4em;\n        left: 0;\n        content: attr(title);\n        white-space: pre;\n        overflow: hidden;\n        text-overflow: ellipsis;\n    }\n</style>\n\n<script>\nfunction hasCssClass(className) {\n    // 获取所有样式表\n    const styleSheets = document.styleSheets;\n\n    // 遍历每个样式表\n    for (let i = 0; i < styleSheets.length; i++) {\n        const rules = styleSheets[i].cssRules || styleSheets[i].rules; // 兼容不同浏览器\n\n        // 遍历每个样式规则\n        for (let j = 0; j < rules.length; j++) {\n            if (rules[j].selectorText && rules[j].selectorText.includes(className)) {\n                return true; // 找到定义，返回 true\n            }\n        }\n    }\n\n    return false; // 没有找到定义，返回 false\n}\n\nconst progressbar_className = hasCssClass('.cbi-progressbar') ? 'cbi-progressbar' : 'compat-progressbar';\n\nclass LuciTable{\n        constructor(){\n            this.rows = [];\n            this.tbody;\n            this.fieldset;\n            this.init_table();\n        }\n\n        init_table(){\n            //create a luci fieldset (class cbi-section)\n            var fieldset = document.createElement('fieldset');\n            fieldset.className=\"cbi-section\";\n            //set fieldset Header name\n            var legend = document.createElement('legend');\n            var title_span = document.createElement('h2');\n            title_span.className=\"panel-title\"\n            //init table\n            var table = document.createElement('table');\n            var tbody = document.createElement('tbody');\n            tbody.style.width = \"100%\";\n            table.className=\"table\"\n            //save\n            this.fieldset = fieldset;\n            this.tbody = tbody\n            this.title_span = title_span\n            this.legend = legend\n            \n            fieldset.appendChild(legend);\n            fieldset.appendChild(title_span);\n            table.appendChild(tbody)\n            fieldset.appendChild(table)\n        }\n\n        new_tr(data,index){\n            var type = data.type;\n            switch(type){\n                case \"plain_text\":\n                    var key,value,full_name,extra_info;\n                    key = data.key;\n                    value = data.value;\n                    full_name = data.full_name ? data.full_name : key;\n                    extra_info = data.extra_info;\n                    this.rows[index].left.innerHTML = extra_info ? `${full_name} (${extra_info})` : full_name;\n                    this.rows[index].right.innerHTML = value;\n\n                    if (value == null || value == \"\") {\n                        this.rows[index].row.style.display = \"none\";\n                    }\n                    else{\n                        this.rows[index].row.style.display = \"\";\n                    }\n                    break;\n                case \"progress_bar\":\n                    var key,title,min,max,precentage,full_name,extra_info;\n                    key = data.key;\n                    full_name = data.full_name ? data.full_name : key;\n                    extra_info = data.extra_info;\n                    title = `(${data.value}/${data.max_value}${data.unit})`\n                    min = data.min_value;\n                    max = data.max_value;\n                    precentage = (data.value - min) / (max - min) * 100;\n                    this.rows[index].left.innerHTML = extra_info ? `${full_name} (${extra_info})` : full_name;\n                    var progress_bar = document.createElement('div')\n                    progress_bar.className = progressbar_className;\n                    progress_bar.title = title;\n                    var progress_bar_bar = document.createElement('div')\n                    progress_bar_bar.setAttribute(\"style\",\"width:\"+precentage+\"%\")\n                    progress_bar.appendChild(progress_bar_bar)\n                    this.rows[index].right.innerHTML = \"\"\n                    this.rows[index].right.appendChild(progress_bar)\n                    break;\n                }\n        }\n\n\n        set title(value){\n            this.legend.innerHTML = value;\n            this.title_span.innerHTML = value;\n        }\n\n        set object_data(value){\n            var row_length = this.rows.length;\n            var value_length = Object.keys(value).length;\n            if (row_length < value_length) {\n                for ( let i = row_length; i < value_length; i++) {\n                    let row = document.createElement('tr');\n                    row.className = \"tr\"\n                    let cell_left = document.createElement('td');\n                    cell_left.classList.add(\"td\")\n                    cell_left.classList.add(\"left\")\n                    cell_left.setAttribute(\"width\",\"33%\")\n                    let cell_right = document.createElement('td');\n                    cell_right.classList.add(\"td\")\n                    row.appendChild(cell_left);\n                    row.appendChild(cell_right);\n                    this.tbody.appendChild(row);\n                    var row_dict = {\n                        \"row\":row,\n                        \"left\":cell_left,\n                        \"right\":cell_right,\n                    }\n                    this.rows.push(row_dict);\n                }\n            }\n            else if(row_length > value_length){\n                for (let i = value_length; i < row_length; i++) {\n                    this.tbody.removeChild(this.rows[i].row);\n                }\n                this.rows = this.rows.slice(0,value_length);\n            }\n            var index = 0;\n            for (var key in value) {\n                this.rows[index].left.innerHTML = key;\n                this.rows[index].right.innerHTML = value[key];\n                index++;\n            }\n        }\n        \n        set array_data(value){\n            var row_length = this.rows.length;\n            var value_length = value.length;\n            if (row_length < value_length) {\n                for ( let i = row_length; i < value_length; i++) {\n                    let row = document.createElement('tr');\n                    row.className = \"tr\"\n                    let cell_left = document.createElement('td');\n                    cell_left.classList.add(\"td\")\n                    cell_left.setAttribute(\"width\",\"33%\")\n                    let cell_right = document.createElement('td');\n                    cell_right.classList.add(\"td\")\n                    row.appendChild(cell_left);\n                    row.appendChild(cell_right);\n                    this.tbody.appendChild(row);\n                    var row_dict = {\n                        \"row\":row,\n                        \"left\":cell_left,\n                        \"right\":cell_right,\n                    }\n                    this.rows.push(row_dict);\n                }\n            }\n            else if(row_length > value_length){\n                for (let i = value_length; i < row_length; i++) {\n                    this.tbody.removeChild(this.rows[i].row);\n                }\n                this.rows = this.rows.slice(0,value_length);\n            }\n            for (let i = 0; i < value.length; i++) {\n                this.new_tr(value[i],i);\n            }\n        }\n\n        set data(value){\n            if (value == null) {\n                return;\n            }\n            if (Array.isArray(value)) {\n                this.array_data = value;\n            }\n            else{\n                this.object_data = value;\n            }\n        }\n    }\n\nclass ModemInfo {\n    constructor() {\n        this.data = null;\n        this.cfg_id = null;\n        this.modem_cfg_list = [];\n        this.tables = {};\n        this.cbi_map = document.querySelector('.cbi-map');\n        this.init_warning_message_box();\n        this.modem_selector = document.getElementById('modem_selector');\n        this.create_modem_cfg_selector();\n        this.update_modem_cfg_list();\n    }\n\n    init_warning_message_box()\n    {\n        var warning_message_box,title,message_box;\n        warning_message_box = document.createElement('div');\n        warning_message_box.className = \"alert-message alert-danger\";\n        warning_message_box.id = \"warning_message_box\";\n        title=document.createElement('strong');\n        title.innerHTML = \"<%:Warning!%>\";\n        message_box=document.createElement('div');\n        message_box.id = \"warning_message\";\n        warning_message_box.style.display = \"none\";\n        warning_message_box.appendChild(title);\n        warning_message_box.appendChild(message_box);\n        this.cbi_map.appendChild(warning_message_box);\n        this.message_box = message_box;\n        this.warning_message_box = warning_message_box;\n    }\n\n    warning_message(node_list)\n    {\n        this.warning_message_box.style.display = \"\";\n        this.message_box.innerHTML = \"\"\n        this.message_box.appendChild(node_list);\n    }\n\n    hide_warning_message()\n    {\n        this.warning_message_box.style.display = \"none\";\n    }\n\n    create_modem_cfg_selector(){\n        var selector = document.createElement('select');\n        selector.addEventListener('change', (event) => {\n            this.update();\n            this.cfg_id = event.target.value;\n            console.log(this.cfg_id);\n        });\n        this.modem_selector.appendChild(selector);\n        this.selector = selector;\n        this.poll_info();\n    }\n\n    poll_info(){\n        if (this.cfg_id == null){\n            return;\n        }\n        XHR.poll(10,'<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"modem_ctrl\")%>',{\n            \"cfg\": this.cfg_id,\n            \"action\": \"info\",\n            \"translate\": \"1\"\n        }, (x,data) => {\n            this.view = data;\n        });\n    }\n\n    update(){\n        XHR.get('<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"modem_ctrl\")%>',{\n            \"cfg\": this.cfg_id,\n            \"action\": \"info\",\n            \"translate\": \"1\"\n        }, (x,data) => {\n            this.view = data;\n        });\n    }\n\n    update_modem_cfg_list(){\n        XHR.poll(5,'<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"get_modem_cfg\")%>',{},(x,data)=>{\n            var new_cfg_list = [];\n            var cfgs = data.cfgs;\n            for (let i = 0; i < cfgs.length; i++) {\n                var cfg = cfgs[i];\n                var name = cfg.name;\n                var value = cfg.cfg;\n                new_cfg_list.push({\"value\":value,\"name\":name});\n            }\n            if (new_cfg_list != this.modem_cfg_list) {\n                this.cfg_options = new_cfg_list;\n            }\n        });\n    }\n\n    set cfg_options(value){\n        var longger = this.modem_cfg_list.length > value.length ? this.modem_cfg_list : value;\n        if (longger.length == 0) {\n            return;\n        }\n        for (let i = 0; i < longger.length; i++) {\n            var option = this.selector.options[i];\n            if (i < value.length) {\n                if (i >= this.selector.options.length) {\n                    option = document.createElement('option');\n                    this.selector.appendChild(option);\n                }\n                option.value = value[i].value;\n                option.innerHTML = value[i].name;\n                \n            }\n            else{\n                this.selector.removeChild(option);\n            }\n        }\n        this.cfg_id = this.selector.value;\n        this.modem_cfg_list = value;\n        this.update();\n    }\n\n    set view(data){\n        this.data = data;\n        if (data == null) {\n            return;\n        }\n        var keys = []\n        \n        var tables_map = {}\n\n        var warning_message = [];\n        for (let entry of data){\n            let class_name,full_name,value,type,extra_info;\n            class_name = entry.class;\n            if (entry.type == \"warning_message\") {\n                warning_message.push(entry);\n                continue;\n            }\n            if (tables_map[class_name] == null) {\n                tables_map[class_name] = []\n            }\n            tables_map[class_name].push(entry);\n        }\n        for (let class_name in tables_map) {\n            if (this.tables[class_name] == null) {\n                this.tables[class_name] = new LuciTable();\n                this.cbi_map.appendChild(this.tables[class_name].fieldset);\n            }\n            this.tables[class_name].title = class_name;\n            this.tables[class_name].data = tables_map[class_name];\n        }\n        for (let table in this.tables) {\n            if (tables_map[table] == null) {\n                this.cbi_map.removeChild(this.tables[table].fieldset);\n                delete this.tables[table];\n            }\n        }\n\n        if (warning_message.length > 0) {\n            for (let i = 0; i < warning_message.length; i++) {\n                let entry = warning_message[i];\n                let full_name = entry.full_name ? entry.full_name : entry.key;\n                let extra_info = entry.extra_info;\n\n                let node = document.createElement('p');\n                node.innerHTML = extra_info ? `${full_name} (${extra_info}) ${entry.value}` : full_name + entry.value;\n                this.warning_message(node);\n            }\n        }\n        else{\n            this.hide_warning_message();\n        }\n    }\n}\n\nwindow.onload = function(){\n    const modem_info = new ModemInfo();\n}\n</script>\n<div>\n    <div class=\"cbi-map\">\n        <fieldset class=\"cbi-section\">\n            <table class=\"table\">\n                <tbody>\n                    <tr class=\"tr\">\n                        <td class=\"td\" width=\"33%\"><%:Modem Name%></td>\n                        <td class=\"td\" id=\"modem_selector\">\n\n                        </td>\n                    </tr>\n                </tbody>\n            </table>\n        </fieldset>\n    </div>\n</div>\n<%+footer%>\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem/po/ru/modem.po",
    "content": "#controller/qmodem.lua\nmsgid \"QModem\"\nmsgstr \"QModem\"\n\nmsgid \"QModem Information\"\nmsgstr \"Информация о QModem\"\n\nmsgid \"Dial Overview\"\nmsgstr \"Обзор набора\"\n\nmsgid \"Advance Modem Settings\"\nmsgstr \"Расширенные настройки модема\"\n\nmsgid \"QModem Setting\"\nmsgstr \"Настройки QModem\"\n\n# model/cbi/dial_config.lua\nmsgid \"Modem Configuration\"\nmsgstr \"Конфигурация модема\"\n\nmsgid \"General Settings\"\nmsgstr \"Общие настройки\"\n\nmsgid \"Advanced Settings\"\nmsgstr \"Расширенные настройки\"\n\nmsgid \"Enable Dial\"\nmsgstr \"Включить набор\"\n\nmsgid \"Modem Alias\"\nmsgstr \"Псевдоним модема\"\n\nmsgid \"AT Port\"\nmsgstr \"AT порт\"\n\nmsgid \"SMS AT Port\"\nmsgstr \"SMS AT порт\"\n\nmsgid \"RA Master\"\nmsgstr \"RA мастер\"\n\nmsgid \"Caution: Enabling this option will make it the IPV6 RA Master, and only one interface can be configured as such.\"\nmsgstr \"Внимание: Включение этой опции сделает его IPV6 RA мастером, и только один интерфейс может быть настроен как таковой.\"\n\nmsgid \"Extend Prefix\"\nmsgstr \"Расширить префикс\"\n\nmsgid \"Once checking, the prefix will be apply to lan zone\"\nmsgstr \"После проверки префикс будет применен к зоне lan\"\n\nmsgid \"PDP Type\"\nmsgstr \"Тип PDP\"\n\nmsgid \"Auto Choose\"\nmsgstr \"Авто выбор\"\n\nmsgid \"China Mobile (CN)\"\nmsgstr \"Китайский мобильный (CN)\"\n\nmsgid \"China Unicom (CN)\"\nmsgstr \"Китайский Юником (CN)\"\n\nmsgid \"China Telecom (CN)\"\nmsgstr \"Китайский Телеком (CN)\"\n\nmsgid \"China Broadcast (CN)\"\nmsgstr \"Китайское вещание (CN)\"\n\nmsgid \"Skytone (CN)\"\nmsgstr \"Скайтон (CN)\"\n\nmsgid \"Swisscom (CH)\"\nmsgstr \"Swisscom (CH)\"\n\nmsgid \"Sunrise (CH)\"\nmsgstr \"Sunrise (CH)\"\n\nmsgid \"Salt (CH)\"\nmsgstr \"Salt (CH)\"\n\nmsgid \"Vodafone (DE)\"\nmsgstr \"Vodafone (DE)\"\n\nmsgid \"Telekom (DE)\"\nmsgstr \"Telekom (DE)\"\n\n\nmsgid \"O2 (DE)\"\nmsgstr \"O2 (DE)\"\n\nmsgid \"E-Plus (DE)\"\nmsgstr \"E-Plus (DE)\"\n\nmsgid \"1&1 (DE)\"\nmsgstr \"1&1 (DE)\"\n\nmsgid \"A1 (AT)\"\nmsgstr \"A1 (AT)\"\n\nmsgid \"Drei (AT)\"\nmsgstr \"Drei (AT)\"\n\nmsgid \"Magenta (AT)\"\nmsgstr \"Magenta (AT)\"\n\nmsgid \"Beeline (RU)\"\nmsgstr \"Билайн (RU)\"\n\nmsgid \"MTS (RU)\"\nmsgstr \"МТС (RU)\"\n\nmsgid \"Megafon (RU)\"\nmsgstr \"Мегафон (RU)\"\n\nmsgid \"Tele2 (RU)\"\nmsgstr \"Теле2 (RU)\"\n\nmsgid \"Yota (RU)\"\nmsgstr \"Йота (RU)\"\n\nmsgid \"T-mobile (RU)\"\nmsgstr \"Тинькофф Мобайл (RU)\"\n\nmsgid \"Rostelecom (RU)\"\nmsgstr \"Ростелеком (RU)\"\n\nmsgid \"Sber Mobile (RU)\"\nmsgstr \"СберМобайл (RU)\"\n\nmsgid \"Authentication Type\"\nmsgstr \"Тип аутентификации\"\n\nmsgid \"None\"\nmsgstr \"Нет\"\n\nmsgid \"PAP\"\nmsgstr \"PAP\"\n\nmsgid \"CHAP\"\nmsgstr \"CHAP\"\n\nmsgid \"PAP/CHAP (both)\"\nmsgstr \"PAP/CHAP (оба)\"\n\nmsgid \"PAP/CHAP Username\"\nmsgstr \"Имя пользователя PAP/CHAP\"\n\nmsgid \"PAP/CHAP Password\"\nmsgstr \"Пароль PAP/CHAP\"\n\nmsgid \"PIN Code\"\nmsgstr \"Код PIN\"\n\nmsgid \"If the PIN code is not set, leave it blank.\"\nmsgstr \"Если код PIN не установлен, оставьте его пустым.\"\n\nmsgid \"If solt 2 config is not set,will use slot 1 config.\"\nmsgstr \"Если конфигурация слота 2 не установлена, будет использоваться конфигурация слота 1.\"\n\nmsgid \"The metric value is used to determine the priority of the route. The smaller the value, the higher the priority. Cannot duplicate.\"\nmsgstr \"Значение метрики используется для определения приоритета маршрута. Чем меньше значение, тем выше приоритет. Не может дублироваться.\"\n\n#odel/cbi/dial_overview.lua\nmsgid \"Dial Overview\"\nmsgstr \"Обзор набора\"\n\nmsgid \"Global Config\"\nmsgstr \"Глобальная конфигурация\"\n\nmsgid \"Enable Dial\"\nmsgstr \"Включить набор\"\n\nmsgid \"(Global)\"\nmsgstr \"(Глобально)\"\n\nmsgid \"Restart Dial Service\"\nmsgstr \"Перезапустить службу набора\"\n\nmsgid \"Config List\"\nmsgstr \"Список конфигураций\"\n\nmsgid \"Modem Model\"\nmsgstr \"Модель модема\"\n\nmsgid \"Modem Alias\"\nmsgstr \"Псевдоним модема\"\n\nmsgid \"Modem Status\"\nmsgstr \"Статус модема\"\n\nmsgid \"Remove Modem\"\nmsgstr \"Удалить модем\"\n\n# model/cbi/settings.lua\nmsgid \"QModem Settings\"\nmsgstr \"Настройки QModem\"\n\nmsgid \"Modem Probe setting\"\nmsgstr \"Настройка зонда модема\"\n\nmsgid \"Block Auto Probe/Remove\"\nmsgstr \"Блокировать авто зондирование/удаление\"\n\nmsgid \"If enabled, the modem auto scan will be blocked.\"\nmsgstr \"Если включено, автосканирование модема будет заблокировано.\"\n\nmsgid \"Enable PCIE Scan\"\nmsgstr \"Включить сканирование PCIE\"\n\nmsgid \"Once enabled, the PCIe ports will be scanned on every boot.\"\nmsgstr \"После включения порты PCIe будут сканироваться при каждой загрузке.\"\n\nmsgid \"Enable USB Scan\"\nmsgstr \"Включить сканирование USB\"\n\nmsgid \"Once enabled, the USB ports will be scanned on every boot.\"\nmsgstr \"После включения порты USB будут сканироваться при каждой загрузке.\"\n\nmsgid \"Try Preset USB Port\"\nmsgstr \"Попробовать предустановленный USB порт\"\n\nmsgid \"Attempt to use pre-configured USB settings from the cpe vendor.\"\nmsgstr \"Попытка использовать предварительно настроенные параметры USB от поставщика CPE.\"\n\nmsgid \"Try Preset PCIE Port\"\nmsgstr \"Попробовать предустановленный порт PCIE\"\n\nmsgid \"Attempt to use pre-configured PCIE settings from the cpe vendor.\"\nmsgstr \"Попытка использовать предварительно настроенные параметры PCIE от поставщика CPE.\"\n\nmsgid \"Scan ALL Manually\"\nmsgstr \"Сканировать ВСЕ вручную\"\n\nmsgid \"Scan PCIE Manually\"\nmsgstr \"Сканировать PCIE вручную\"\n\nmsgid \"Scan USB Manually\"\nmsgstr \"Сканировать USB вручную\"\n\nmsgid \"Modem Slot Config List\"\nmsgstr \"Список конфигураций слотов модема\"\n\nmsgid \"Slot Type\"\nmsgstr \"Тип слота\"\n\nmsgid \"Slot Path\"\nmsgstr \"Путь слота\"\n\nmsgid \"Config Name\"\nmsgstr \"Имя конфигурации\"\n\n# model/cbi/slot_config.lua\nmsgid \"Slot Configuration\"\nmsgstr \"Конфигурация слота\"\n\nmsgid \"Slot Type\"\nmsgstr \"Тип слота\"\n\nmsgid \"Slot ID\"\nmsgstr \"ID слота\"\n\nmsgid \"SIM LED\"\nmsgstr \"Светодиод SIM\"\n\nmsgid \"NET LED\"\nmsgstr \"Светодиод NET\"\n\nmsgid \"Enable 5G Ethernet\"\nmsgstr \"Включить 5G Ethernet\"\n\nmsgid \"For 5G modules using the Ethernet PHY connection, please specify the network interface name. (e.g., eth0, eth1)\"\nmsgstr \"Для 5G модулей, использующих соединение Ethernet PHY, укажите имя сетевого интерфейса. (например, eth0, eth1)\"\n\nmsgid \"Associated USB\"\nmsgstr \"Ассоциированный USB\"\n\nmsgid \"For M.2 slots with both PCIe and USB support, specify the associated USB port (for ttyUSB access)\"\nmsgstr \"Для слотов M.2 с поддержкой как PCIe, так и USB укажите ассоциированный USB порт (для доступа к ttyUSB)\"\n\n# view/qmodem/dial_overview.htm\nmsgid \"Connected\"\nmsgstr \"Подключено\"\n\nmsgid \"Disconnected\"\nmsgstr \"Отключено\"\n\nmsgid \"Unknown\"\nmsgstr \"Неизвестно\"\n\nmsgid \"Download\"\nmsgstr \"Скачать\"\n\nmsgid \"Clear\"\nmsgstr \"Очистить\"\n\nmsgid \"Modem Status\"\nmsgstr \"Статус модема\"\n\nmsgid \"Modem Log\"\nmsgstr \"Журнал модема\"\n\n# view/qmodem/modem_debug.htm\nmsgid \"Lock Band\"\nmsgstr \"Заблокировать диапазон\"\n\nmsgid \"Select All\"\nmsgstr \"Выбрать все\"\n\nmsgid \"Submit\"\nmsgstr \"Отправить\"\n\nmsgid \"Rat Prefer\"\nmsgstr \"Предпочтение RAT\"\n\nmsgid \"Current Mode\"\nmsgstr \"Текущий режим\"\n\nmsgid \"Setting\"\nmsgstr \"Настройка\"\n\nmsgid \"Dial Mode\"\nmsgstr \"Режим набора\"\n\nmsgid \"Neighbor Cell\"\nmsgstr \"Соседняя ячейка\"\n\nmsgid \"Lock Cell Setting\"\nmsgstr \"Настройка блокировки ячейки\"\n\nmsgid \"RAT\"\nmsgstr \"RAT\"\n\nmsgid \"PCI\"\nmsgstr \"PCI\"\n\nmsgid \"ARFCN\"\nmsgstr \"ARFCN\"\n\nmsgid \"TAC\"\nmsgstr \"TAC\"\n\nmsgid \"Band\"\nmsgstr \"Диапазон\"\n\nmsgid \"SCS\"\nmsgstr \"SCS\"\n\nmsgid \"Status\"\nmsgstr \"Статус\"\n\nmsgid \"Copy\"\nmsgstr \"Копировать\"\n\nmsgid \"Set IMEI\"\nmsgstr \"Установить IMEI\"\n\nmsgid \"Modem Name\"\nmsgstr \"Имя модема\"\n\nmsgid \"Warning!\"\nmsgstr \"Предупреждение!\"\n\n# root/usr/share/qmodem/fibocom.sh\nmsgid \"Voltage\"\nmsgstr \"Напряжение\"\n\nmsgid \"Temperature\"\nmsgstr \"Температура\"\n\nmsgid \"Manufacturer\"\nmsgstr \"Производитель\"\n\nmsgid \"SIM Status\"\nmsgstr \"Статус SIM\"\n\nmsgid \"Internet Service Provider\"\nmsgstr \"Интернет-провайдер\"\n\nmsgid \"SIM Slot\"\nmsgstr \"Слот SIM\"\n\nmsgid \"SIM Number\"\nmsgstr \"Номер SIM\"\n\nmsgid \"International Mobile Equipment Identity\"\nmsgstr \"Международный идентификатор мобильного оборудования\"\n\nmsgid \"International Mobile Subscriber Identity\"\nmsgstr \"Международный идентификатор мобильного абонента\"\n\nmsgid \"Integrate Circuit Card Identity\"\nmsgstr \"Идентификатор интегральной схемы\"\n\nmsgid \"Network Type\"\nmsgstr \"Тип сети\"\n\nmsgid \"Channel Quality Indicator for Uplink\"\nmsgstr \"Индикатор качества канала для восходящей связи\"\n\nmsgid \"Channel Quality Indicator for Downlink\"\nmsgstr \"Индикатор качества канала для нисходящей связи\"\n\nmsgid \"Access Maximum Bit Rate for Uplink\"\nmsgstr \"Максимальная скорость передачи данных для восходящей связи\"\n\nmsgid \"Access Maximum Bit Rate for Downlink\"\nmsgstr \"Максимальная скорость передачи данных для нисходящей связи\"\n\nmsgid \"Transmit Rate\"\nmsgstr \"Скорость передачи\"\n\nmsgid \"Receive Rate\"\nmsgstr \"Скорость приема\"\n\nmsgid \"Network Mode\"\nmsgstr \"Режим сети\"\n\nmsgid \"Mobile Country Code\"\nmsgstr \"Код мобильной страны\"\n\nmsgid \"Mobile Network Code\"\nmsgstr \"Код мобильной сети\"\n\nmsgid \"Duplex Mode\"\nmsgstr \"Дуплексный режим\"\n\nmsgid \"Physical Cell ID\"\nmsgstr \"Физический ID ячейки\"\n\nmsgid \"Tracking area code of cell served by neighbor Enb\"\nmsgstr \"Код зоны отслеживания ячейки, обслуживаемой соседним Enb\"\n\nmsgid \"Absolute Radio-Frequency Channel Number\"\nmsgstr \"Абсолютный номер радиочастотного канала\"\n\nmsgid \"Band\"\nmsgstr \"Диапазон\"\n\nmsgid \"Reference Signal Received Power\"\nmsgstr \"Мощность принимаемого сигнала\"\n\nmsgid \"Reference Signal Received Quality\"\nmsgstr \"Качество принимаемого сигнала\"\n\nmsgid \"Signal to Interference plus Noise Ratio Bandwidth\"\nmsgstr \"Соотношение сигнала к помехам и шуму по полосе частот\"\n\nmsgid \"Received Signal Level\"\nmsgstr \"Уровень принимаемого сигнала\"\n\nmsgid \"SCS\"\nmsgstr \"SCS\"\n\nmsgid \"Serving Cell Receive Level\"\nmsgstr \"Уровень приема обслуживаемой ячейки\"\n\nmsgid \"E-UTRA Absolute Radio Frequency Channel Number\"\nmsgstr \"Абсолютный номер радиочастотного канала E-UTRA\"\n\nmsgid \"Freq band indicator\"\nmsgstr \"Индикатор частотного диапазона\"\n\nmsgid \"UL Bandwidth\"\nmsgstr \"Ширина полосы UL\"\n\nmsgid \"DL Bandwidth\"\nmsgstr \"Ширина полосы DL\"\n\nmsgid \"Received Signal Strength Indicator\"\nmsgstr \"Индикатор уровня принимаемого сигнала\"\n\nmsgid \"Radio Signal Strength Noise Ratio\"\nmsgstr \"Соотношение шумов радиосигнала\"\n\nmsgid \"Channel Quality Indicator\"\nmsgstr \"Индикатор качества канала\"\n\nmsgid \"TX Power\"\nmsgstr \"Мощность передачи\"\n\nmsgid \"Location Area Code\"\nmsgstr \"Код зоны расположения\"\n\nmsgid \"Speech Code\"\nmsgstr \"Код речи\"\n\nmsgid \"Ec/No\"\nmsgstr \"Ec/No\"\n\nmsgid \"Ec/Io\"\nmsgstr \"Ec/Io\"\n\nmsgid \"Spreading Factor\"\nmsgstr \"Коэффициент расширения\"\n\nmsgid \"Compression Mode\"\nmsgstr \"Режим сжатия\"\n\nmsgid \"RxLev\"\nmsgstr \"RxLev\"\n\n# root/usr/share/qmodem/generic.sh\nmsgid \"SIM Error,Error code:\"\nmsgstr \"Ошибка SIM, код ошибки:\"\n\nmsgid \"warning\"\nmsgstr \"предупреждение\"\n\nmsgid \"Connect Status\"\nmsgstr \"Статус подключения\"\n\nmsgid \"Cell Information\"\nmsgstr \"Информация о ячейке\"\n\nmsgid \"Base Information\"\nmsgstr \"Базовая информация\"\n\nmsgid \"Network Information\"\nmsgstr \"Информация о сети\"\n\nmsgid \"SIM Information\"\nmsgstr \"Информация о SIM\"\n\n# modem_state\nmsgid \"ENABLED\"\nmsgstr \"ВКЛЮЧЕНО\"\n\nmsgid \"DISABLED\"\nmsgstr \"ВЫКЛЮЧЕНО\"\n\nmsgid \"TTL Config\"\nmsgstr \"Конфигурация TTL\"\n\nmsgid \"Default Alias\"\nmsgstr \"Псевдоним по умолчанию\"\n\nmsgid \"After setting this option, the first module loaded into this slot will automatically be assigned this default alias.\"\nmsgstr \"После установки этой опции первый модуль, загруженный в этот слот, будет автоматически назначен этому псевдониму по умолчанию.\"\n\nmsgid \"Modem\"\nmsgstr \"Модем\"\n\nmsgid \"Reboot Modem\"\nmsgstr \"Перезагрузить модем\"\n\nmsgid \"Soft Reboot\"\nmsgstr \"Мягкая перезагрузка\"\n\nmsgid \"Hard Reboot\"\nmsgstr \"Жесткая перезагрузка\"\n\nmsgid \"Power GPIO\"\nmsgstr \"Питание GPIO\"\n\nmsgid \"GPIO Down Value\"\nmsgstr \"Значение GPIO вниз\"\n\nmsgid \"GPIO Up Value\"\nmsgstr \"Значение GPIO вверх\"\n\nmsgid \"Default Metric\"\nmsgstr \"Метрика по умолчанию\"\n\nmsgid \"AT Debug\"\nmsgstr \"Отладка AT\"\n\nmsgid \"(using)\"\nmsgstr \"(используется)\"\n\nmsgid \"(valid)\"\nmsgstr \"(действительно)\"\n\nmsgid \"(invalid)\"\nmsgstr \"(недействительно)\"\n\nmsgid \"(Not belong to this modem)\"\nmsgstr \"(Не принадлежит этому модему)\"\n\nmsgid \"Send\"\nmsgstr \"Отправить\"\n\nmsgid \"Clear\"\nmsgstr \"Очистить\"\n\nmsgid \"Select Port\"\nmsgstr \"Выбрать порт\"\n\nmsgid \"Input AT Command\"\nmsgstr \"Введите команду AT\"\n\nmsgid \"AT Command\"\nmsgstr \"Команда AT\"\n\nmsgid \"Double Click or Right Click to Edit\"\nmsgstr \"Дважды щелкните или щелкните правой кнопкой мыши, чтобы редактировать\"\n\nmsgid \"Lost focus to save\"\nmsgstr \"Потеря фокуса для сохранения\"\n\nmsgid \"Clear AT Port\"\nmsgstr \"Очистить AT порт\"\n\nmsgid \"Clear AT Command\"\nmsgstr \"Очистить команду AT\"\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem/po/template/qmodem.po",
    "content": "#controller/qmodem.lua\nmsgid \"QModem\"\nmsgstr \"\"\n\nmsgid \"QModem Information\"\nmsgstr \"\"\n\nmsgid \"Dial Overview\"\nmsgstr \"\"\n\nmsgid \"Advance Modem Settings\"\nmsgstr \"\"\n\nmsgid \"QModem Setting\"\nmsgstr \"\"\n\n# model/cbi/dial_config.lua\nmsgid \"Modem Configuration\"\nmsgstr \"\"\n\nmsgid \"General Settings\"\nmsgstr \"\"\n\nmsgid \"Advanced Settings\"\nmsgstr \"\"\n\nmsgid \"Enable Dial\"\nmsgstr \"\"\n\nmsgid \"Modem Alias\"\nmsgstr \"\"\n\nmsgid \"AT Port\"\nmsgstr \"\"\n\nmsgid \"SMS AT Port\"\nmsgstr \"\"\n\nmsgid \"RA Master\"\nmsgstr \"\"\n\nmsgid \"Caution: Enabling this option will make it the IPV6 RA Master, and only one interface can be configured as such.\"\nmsgstr \"\"\n\nmsgid \"Extend Prefix\"\nmsgstr \"\"\n\nmsgid \"Once checking, the prefix will be apply to lan zone\"\nmsgstr \"\"\n\nmsgid \"enable modem soft reboot\"\nmsgstr \"\"\n\nmsgid \"PDP Type\"\nmsgstr \"\"\n\nmsgid \"Auto Choose\"\nmsgstr \"\"\n\nmsgid \"China Mobile (CN)\"\nmsgstr \"\"\n\nmsgid \"China Unicom (CN)\"\nmsgstr \"\"\n\nmsgid \"China Telecom (CN)\"\nmsgstr \"\"\n\nmsgid \"China Broadcast (CN)\"\nmsgstr \"\"\n\nmsgid \"Skytone (CN)\"\nmsgstr \"\"\n\nmsgid \"Sunrise (CH)\"\nmsgstr \"\"\n\nmsgid \"Swisscom (CH)\"\nmsgstr \"\"\n\nmsgid \"Salt (CH)\"\nmsgstr \"Salt (CH)\"\n\n\nmsgid \"Vodafone (DE)\"\nmsgstr \"\"\n\nmsgid \"Telekom (DE)\"\nmsgstr \"\"\n\nmsgid \"O2 (DE)\"\nmsgstr \"\"\n\nmsgid \"E-Plus (DE)\"\nmsgstr \"\"\n\nmsgid \"1&1 (DE)\"\nmsgstr \"\"\n\nmsgid \"A1 (AT)\"\nmsgstr \"\"\n\nmsgid \"Drei (AT)\"\nmsgstr \"\"\n\nmsgid \"Magenta (AT)\"\nmsgstr \"\"\n\nmsgid \"T-Mobile (AT)\"\nmsgstr \"\"\n\nmsgid \"Authentication Type\"\nmsgstr \"\"\n\nmsgid \"None\"\nmsgstr \"\"\n\nmsgid \"PAP\"\nmsgstr \"\"\n\nmsgid \"CHAP\"\nmsgstr \"\"\n\nmsgid \"PAP/CHAP (both)\"\nmsgstr \"\"\n\nmsgid \"PAP/CHAP Username\"\nmsgstr \"\"\n\nmsgid \"PAP/CHAP Password\"\nmsgstr \"\"\n\nmsgid \"PIN Code\"\nmsgstr \"\"\n\nmsgid \"If the PIN code is not set, leave it blank.\"\nmsgstr \"\"\n\nmsgid \"If solt 2 config is not set,will use slot 1 config.\"\nmsgstr \"\"\n\nmsgid \"The metric value is used to determine the priority of the route. The smaller the value, the higher the priority. Cannot duplicate.\"\nmsgstr \"\"\n\n#odel/cbi/dial_overview.lua\nmsgid \"Dial Overview\"\nmsgstr \"\"\n\nmsgid \"Global Config\"\nmsgstr \"\"\n\nmsgid \"Enable Dial\"\nmsgstr \"\"\n\nmsgid \"(Global)\"\nmsgstr \"\"\n\nmsgid \"Restart Dial Service\"\nmsgstr \"\"\n\nmsgid \"Config List\"\nmsgstr \"\"\n\nmsgid \"Modem Model\"\nmsgstr \"\"\n\nmsgid \"Modem Alias\"\nmsgstr \"\"\n\nmsgid \"Modem Status\"\nmsgstr \"\"\n\nmsgid \"Remove Modem\"\nmsgstr \"\"\n\n# model/cbi/settings.lua\nmsgid \"QModem Settings\"\nmsgstr \"\"\n\nmsgid \"Modem Probe setting\"\nmsgstr \"\"\n\nmsgid \"Block Auto Probe/Remove\"\nmsgstr \"\"\n\nmsgid \"If enabled, the modem auto scan will be blocked.\"\nmsgstr \"\"\n\nmsgid \"Enable PCIE Scan\"\nmsgstr \"\"\n\nmsgid \"Once enabled, the PCIe ports will be scanned on every boot.\"\nmsgstr \"\"\n\nmsgid \"Enable USB Scan\"\nmsgstr \"\"\n\nmsgid \"Once enabled, the USB ports will be scanned on every boot.\"\nmsgstr \"\"\n\nmsgid \"Try Preset USB Port\"\nmsgstr \"\"\n\nmsgid \"Attempt to use pre-configured USB settings from the cpe vendor.\"\nmsgstr \"\"\n\nmsgid \"Try Preset PCIE Port\"\nmsgstr \"\"\n\nmsgid \"Attempt to use pre-configured PCIE settings from the cpe vendor.\"\nmsgstr \"\"\n\nmsgid \"Scan ALL Manually\"\nmsgstr \"\"\n\nmsgid \"Scan PCIE Manually\"\nmsgstr \"\"\n\nmsgid \"Scan USB Manually\"\nmsgstr \"\"\n\nmsgid \"Modem Slot Config List\"\nmsgstr \"\"\n\nmsgid \"Slot Type\"\nmsgstr \"\"\n\nmsgid \"Slot Path\"\nmsgstr \"\"\n\nmsgid \"Config Name\"\nmsgstr \"\"\n\n# model/cbi/slot_config.lua\nmsgid \"Slot Configuration\"\nmsgstr \"\"\n\nmsgid \"Slot Type\"\nmsgstr \"\"\n\nmsgid \"Slot ID\"\nmsgstr \"\"\n\nmsgid \"SIM LED\"\nmsgstr \"\"\n\nmsgid \"NET LED\"\nmsgstr \"\"\n\nmsgid \"Enable 5G Ethernet\"\nmsgstr \"\"\n\nmsgid \"For 5G modules using the Ethernet PHY connection, please specify the network interface name. (e.g., eth0, eth1)\"\nmsgstr \"\"\n\nmsgid \"Associated USB\"\nmsgstr \"\"\n\nmsgid \"For M.2 slots with both PCIe and USB support, specify the associated USB port (for ttyUSB access)\"\nmsgstr \"\"\n\n# view/qmodem/dial_overview.htm\nmsgid \"Connected\"\nmsgstr \"\"\n\nmsgid \"Disconnected\"\nmsgstr \"\"\n\nmsgid \"Unknown\"\nmsgstr \"\"\n\nmsgid \"Download\"\nmsgstr \"\"\n\nmsgid \"Clear\"\nmsgstr \"\"\n\nmsgid \"Modem Status\"\nmsgstr \"\"\n\nmsgid \"Modem Log\"\nmsgstr \"\"\n\n# view/qmodem/modem_debug.htm\nmsgid \"Lock Band\"\nmsgstr \"\"\n\nmsgid \"Select All\"\nmsgstr \"\"\n\nmsgid \"Submit\"\nmsgstr \"\"\n\nmsgid \"Rat Prefer\"\nmsgstr \"\"\n\nmsgid \"Current Mode\"\nmsgstr \"\"\n\nmsgid \"Setting\"\nmsgstr \"\"\n\nmsgid \"Dial Mode\"\nmsgstr \"\"\n\nmsgid \"Neighbor Cell\"\nmsgstr \"\"\n\nmsgid \"Lock Cell Setting\"\nmsgstr \"\"\n\nmsgid \"RAT\"\nmsgstr \"\"\n\nmsgid \"PCI\"\nmsgstr \"\"\n\nmsgid \"ARFCN\"\nmsgstr \"\"\n\nmsgid \"TAC\"\nmsgstr \"\"\n\nmsgid \"Band\"\nmsgstr \"\"\n\nmsgid \"SCS\"\nmsgstr \"\"\n\nmsgid \"Status\"\nmsgstr \"\"\n\nmsgid \"Copy\"\nmsgstr \"\"\n\nmsgid \"Set IMEI\"\nmsgstr \"\"\n\nmsgid \"Modem Name\"\nmsgstr \"\"\n\nmsgid \"Warning!\"\nmsgstr \"\"\n\n# root/usr/share/qmodem/fibocom.sh\nmsgid \"Voltage\"\nmsgstr \"\"\n\nmsgid \"Temperature\"\nmsgstr \"\"\n\nmsgid \"Manufacturer\"\nmsgstr \"\"\n\nmsgid \"SIM Status\"\nmsgstr \"\"\n\nmsgid \"Internet Service Provider\"\nmsgstr \"\"\n\nmsgid \"SIM Slot\"\nmsgstr \"\"\n\nmsgid \"SIM Number\"\nmsgstr \"\"\n\nmsgid \"International Mobile Equipment Identity\"\nmsgstr \"\"\n\nmsgid \"International Mobile Subscriber Identity\"\nmsgstr \"\"\n\nmsgid \"Integrate Circuit Card Identity\"\nmsgstr \"\"\n\nmsgid \"Network Type\"\nmsgstr \"\"\n\nmsgid \"Channel Quality Indicator for Uplink\"\nmsgstr \"\"\n\nmsgid \"Channel Quality Indicator for Downlink\"\nmsgstr \"\"\n\nmsgid \"Access Maximum Bit Rate for Uplink\"\nmsgstr \"\"\n\nmsgid \"Access Maximum Bit Rate for Downlink\"\nmsgstr \"\"\n\nmsgid \"Transmit Rate\"\nmsgstr \"\"\n\nmsgid \"Receive Rate\"\nmsgstr \"\"\n\n\nmsgid \"Network Mode\"\nmsgstr \"\"\n\nmsgid \"Mobile Country Code\"\nmsgstr \"\"\n\nmsgid \"Mobile Network Code\"\nmsgstr \"\"\n\nmsgid \"Duplex Mode\"\nmsgstr \"\"\n\nmsgid \"Physical Cell ID\"\nmsgstr \"\"\n\nmsgid \"Tracking area code of cell served by neighbor Enb\"\nmsgstr \"\"\n\nmsgid \"Absolute Radio-Frequency Channel Number\"\nmsgstr \"\"\n\nmsgid \"Band\"\nmsgstr \"\"\n\nmsgid \"Reference Signal Received Power\"\nmsgstr \"\"\n\nmsgid \"Reference Signal Received Quality\"\nmsgstr \"\"\n\nmsgid \"Signal to Interference plus Noise Ratio Bandwidth\"\nmsgstr \"\"\n\nmsgid \"Received Signal Level\"\nmsgstr \"\"\n\nmsgid \"SCS\"\nmsgstr \"\"\n\nmsgid \"Serving Cell Receive Level\"\nmsgstr \"\"\n\nmsgid \"E-UTRA Absolute Radio Frequency Channel Number\"\nmsgstr \"\"\n\nmsgid \"Freq band indicator\"\nmsgstr \"\"\n\nmsgid \"UL Bandwidth\"\nmsgstr \"\"\n\nmsgid \"DL Bandwidth\"\nmsgstr \"\"\n\nmsgid \"Received Signal Strength Indicator\"\nmsgstr \"\"\n\nmsgid \"Radio Signal Strength Noise Ratio\"\nmsgstr \"\"\n\nmsgid \"Channel Quality Indicator\"\nmsgstr \"\"\n\nmsgid \"TX Power\"\nmsgstr \"\"\n\nmsgid \"Location Area Code\"\nmsgstr \"\"\n\nmsgid \"Speech Code\"\nmsgstr \"\"\n\nmsgid \"Ec/No\"\nmsgstr \"\"\n\nmsgid \"Ec/Io\"\nmsgstr \"\"\n\nmsgid \"Spreading Factor\"\nmsgstr \"\"\n\nmsgid \"Compression Mode\"\nmsgstr \"\"\n\nmsgid \"RxLev\"\nmsgstr \"\"\n\n# root/usr/share/qmodem/generic.sh\nmsgid \"SIM Error,Error code:\" \nmsgstr \"\"\n\nmsgid \"warning\"\nmsgstr \"\"\n\n\nmsgid \"Connect Status\"\nmsgstr \"\"\n\nmsgid \"Cell Information\"\nmsgstr \"\"\n\nmsgid \"Base Information\"\nmsgstr \"\"\n\nmsgid \"Network Information\"\nmsgstr \"\"\n\nmsgid \"SIM Information\"\nmsgstr \"\"\n\n# modem_state\nmsgid \"ENABLED\"\nmsgstr \"\"\n\nmsgid \"DISABLED\"\nmsgstr \"\"\n\nmsgid \"TTL Config\"\nmsgstr \"\"\n\nmsgid \"Default Alias\"\nmsgstr \"\"\n\nmsgid \"After setting this option, the first module loaded into this slot will automatically be assigned this default alias.\"\nmsgstr \"\"\n\nmsgid \"Modem\"\nmsgstr \"\"\n\nmsgid \"Reboot Modem\"\nmsgstr \"\"\n\nmsgid \"Soft Reboot\"\nmsgstr \"\"\n\nmsgid \"Hard Reboot\"\nmsgstr \"\"\n\nmsgid \"Power GPIO\"\nmsgstr \"\"\n\nmsgid \"GPIO Down Value\"\nmsgstr \"\"\n\nmsgid \"GPIO Up Value\"\nmsgstr \"\"\n\nmsgid \"Default Metric\"\nmsgstr \"\"\n\nmsgid \"AT Debug\"\nmsgstr \"\"\n\nmsgid \"(using)\"\nmsgstr \"\"\n\nmsgid \"(valid)\"\nmsgstr \"\"\n\nmsgid \"(invalid)\"\nmsgstr \"\"\n\nmsgid \"(Not belong to this modem)\"\nmsgstr \"\"\n\nmsgid \"Send\"\nmsgstr \"\"\n\nmsgid \"Clear\"\nmsgstr \"\"\n\nmsgid \"Select Port\"\nmsgstr \"\"\n\nmsgid \"Input AT Command\"\nmsgstr \"\"\n\nmsgid \"AT Command\"\nmsgstr \"\"\n\nmsgid \"Double Click or Right Click to Edit\"\nmsgstr \"\"\n\nmsgid \"Lost focus to save\"\nmsgstr \"\"\n\nmsgid \"Clear AT Port\"\nmsgstr \"\"\n\nmsgid \"Clear AT Command\"\nmsgstr \"\"\n\n# view/qmodem/modem_config.htm\nmsgid \"Fixed Device\"\nmsgstr \"固定设备\"\n\nmsgid \"If the device is fixed, it will not be update when the device is connected or disconnected.\"\nmsgstr \"如果设备是固定的，则在设备连接或断开时不会更新。\"\n\nmsgid \"Slot Path\"\nmsgstr \"插槽路径\"\n\nmsgid \"Interface Type\"\nmsgstr \"接口类型\"\n\nmsgid \"USB\"\nmsgstr \"USB\"\n\nmsgid \"PCIe\"\nmsgstr \"PCIe\"\n\nmsgid \"Alias\"\nmsgstr \"别名\"\n\nmsgid \"Alias for the modem, used for identification.\"\nmsgstr \"调制解调器的别名，用于标识。\"\n\nmsgid \"Enter alias name\"\nmsgstr \"输入别名\"\n\nmsgid \"Modem Model\"\nmsgstr \"调制解调器型号\"\n\nmsgid \"PDP Context Index\"\nmsgstr \"PDP上下文序号\"\n\n\nmsgid \"Manufacturer\"\nmsgstr \"制造商\"\n\nmsgid \"Quectel\"\nmsgstr \"移远\"\n\nmsgid \"Sierra Wireless\"\nmsgstr \"Sierra无线\"\n\nmsgid \"Fibocom\"\nmsgstr \"广和通\"\n\nmsgid \"Meig\"\nmsgstr \"美格\"\n\nmsgid \"Neoway\"\nmsgstr \"有方\"\n\nmsgid \"Telit\"\nmsgstr \"泰利特\"\n\nmsgid \"Platform\"\nmsgstr \"平台\"\n\nmsgid \"lte\"\nmsgstr \"LTE\"\n\nmsgid \"lte12\"\nmsgstr \"LTE12\"\n\nmsgid \"qualcomm\"\nmsgstr \"高通\"\n\nmsgid \"mediatek\"\nmsgstr \"联发科\"\n\nmsgid \"unisoc\"\nmsgstr \"紫光展锐\"\n\nmsgid \"intel\"\nmsgstr \"英特尔\"\n\nmsgid \"AT Port\"\nmsgstr \"AT端口\"\n\nmsgid \"AT command port for modem communication.\"\nmsgstr \"用于调制解调器通信的AT命令端口。\"\n\nmsgid \"Supported Modes\"\nmsgstr \"支持的模式\"\n\nmsgid \"ECM\"\nmsgstr \"ECM\"\n\nmsgid \"MBIM\"\nmsgstr \"MBIM\"\n\nmsgid \"QMI\"\nmsgstr \"QMI\"\n\nmsgid \"NCM\"\nmsgstr \"NCM\"\n\nmsgid \"Enable\"\nmsgstr \"启用\"\n\nmsgid \"WCDMA Band\"\nmsgstr \"WCDMA频段\"\n\nmsgid \"WCDMA band configuration, e.g., 1/2/3\"\nmsgstr \"WCDMA频段配置，例如：1/2/3\"\n\nmsgid \"Enter WCDMA band\"\nmsgstr \"输入WCDMA频段\"\n\nmsgid \"LTE Band\"\nmsgstr \"LTE频段\"\n\nmsgid \"LTE band configuration, e.g., 1/2/3\"\nmsgstr \"LTE频段配置，例如：1/2/3\"\n\nmsgid \"Enter LTE band\"\nmsgstr \"输入LTE频段\"\n\nmsgid \"NSA Band\"\nmsgstr \"NSA频段\"\n\nmsgid \"NSA band configuration, e.g., 1/2/3\"\nmsgstr \"NSA频段配置，例如：1/2/3\"\n\nmsgid \"Enter NSA band\"\nmsgstr \"输入NSA频段\"\n\nmsgid \"SA Band\"\nmsgstr \"SA频段\"\n\nmsgid \"SA band configuration, e.g., 1/2/3\"\nmsgstr \"SA频段配置，例如：1/2/3\"\n\nmsgid \"Enter SA band\"\nmsgstr \"输入SA频段\"\n\nmsgid \"Modem Config List\"\nmsgstr \"模组配置列表\"\n\nmsgid \"Please Select\"\nmsgstr \"请选择\"\n\nmsgid \"Quectel\"\nmsgstr \"移远通信\"\n\nmsgid \"Simcom\"\nmsgstr \"芯讯通\"\n\nmsgid \"Sierra Wireless\"\nmsgstr \"Sierra无线\"\n\nmsgid \"Fibocom\"\nmsgstr \"广和通\"\n\nmsgid \"LTE\"\nmsgstr \"LTE\"\n\nmsgid \"LTE12\"\nmsgstr \"LTE12\"\n\nmsgid \"Qualcomm\"\nmsgstr \"高通\"\n\nmsgid \"MediaTek\"\nmsgstr \"联发科\"\n\nmsgid \"Unisoc\"\nmsgstr \"紫光展锐\"\n\nmsgid \"Intel\"\nmsgstr \"英特尔\"\n\nmsgid \"ECM\"\nmsgstr \"ECM模式\"\n\nmsgid \"MBIM\"\nmsgstr \"MBIM模式\"\n\nmsgid \"QMI\"\nmsgstr \"QMI模式\"\n\nmsgid \"NCM\"\nmsgstr \"NCM模式\"\n\nmsgid \"RNDIS\"\nmsgstr \"RNDIS模式\"\n\nmsgid \"Dial Mode\"\nmsgstr \"拨号模式\"\n\nmsgid \"Rat Prefer\"\nmsgstr \"网络制式优先\"\n\nmsgid \"Set IMEI\"\nmsgstr \"设置IMEI\"\n\nmsgid \"Neighbor Cell\"\nmsgstr \"邻小区信息\"\n\nmsgid \"Lock Band\"\nmsgstr \"锁频段\"\n\nmsgid \"Reboot Modem\"\nmsgstr \"重启调制解调器\"\n\nmsgid \"AT Debug\"\nmsgstr \"AT调试\"\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem/po/zh_Hans/qmodem.po",
    "content": "#controller/qmodem.lua\nmsgid \"Modem Offline\"\nmsgstr \"模组离线\"\n\nmsgid \"QModem\"\nmsgstr \"QWRT模组管理\"\n\nmsgid \"QModem Information\"\nmsgstr \"模组信息\"\n\nmsgid \"Dial Overview\"\nmsgstr \"拨号概览\"\n\nmsgid \"Advance Modem Settings\"\nmsgstr \"高级模组设置\"\n\nmsgid \"QModem Setting\"\nmsgstr \"QModem 设置\"\n\n# model/cbi/dial_config.lua\nmsgid \"Modem Configuration\"\nmsgstr \"模组配置\"\n\nmsgid \"General Settings\"\nmsgstr \"一般设置\"\n\nmsgid \"Advanced Settings\"\nmsgstr \"高级设置\"\n\nmsgid \"Enable Dial\"\nmsgstr \"启用拨号\"\n\nmsgid \"Modem Alias\"\nmsgstr \"模组别名\"\n\nmsgid \"AT Port\"\nmsgstr \"AT端口\"\n\nmsgid \"SMS AT Port\"\nmsgstr \"短信AT端口\"\n\nmsgid \"If the DNS server is not set, it will use the DNS server leased by the operator.\"\nmsgstr \"如果未设置DNS服务器，会使用运营商提供的DNS服务器\"\n\nmsgid \"Bridge Mode\"\nmsgstr \"桥接模式\"\n\nmsgid \"Caution: Only avalible for quectel sdx 5G Modem.\"\nmsgstr \"警告：仅支持移远高通5G模组\"\n\nmsgid \"Do Not modify resolv.conf\"\nmsgstr \"不修改resolv.conf\"\n\nmsgid \"quectel-CM will append the DNS server to the resolv.conf file by default.if you do not want to modify the resolv.conf file, please check this option.\"\nmsgstr \"quectel-CM默认会将DNS服务器追加到resolv.conf文件中，如果不想修改resolv.conf文件，请勾选此选项\"\n\n\nmsgid \"RA Master\"\nmsgstr \"作为RA上游\"\n\nmsgid \"Caution: Enabling this option will make it the IPV6 RA Master, and only one interface can be configured as such.\"\nmsgstr \"警告：启用此选项将使其成为IPV6 RA Master，只能配置一个接口为RA Master\"\n\nmsgid \"Extend Prefix\"\nmsgstr \"扩展前缀\"\n\nmsgid \"Once checking, the prefix will be apply to lan zone\"\nmsgstr \"启用后，该接口的前缀会被通告至Lan区域\"\n\nmsgid \"enable modem soft reboot\"\nmsgstr \"启用模组软重启\"\n\nmsgid \"PDP Type\"\nmsgstr \"PDP类型\"\n\nmsgid \"Auto Choose\"\nmsgstr \"自动选择\"\n\nmsgid \"China Mobile (CN)\"\nmsgstr \"中国移动 (CN)\"\n\nmsgid \"China Unicom (CN)\"\nmsgstr \"中国联通 (CN)\"\n\nmsgid \"China Telecom (CN)\"\nmsgstr \"中国电信 (CN)\"\n\nmsgid \"China Broadcast (CN)\"\nmsgstr \"中国广电 (CN)\"\n\nmsgid \"Skytone (CN)\"\nmsgstr \"天际通 (CN)\"\n\nmsgid \"Sunrise (CH)\"\nmsgstr \"Sunrise (CH)\"\n\nmsgid \"Swisscom(CH)\"\nmsgstr \"Swisscom (CH)\"\n\nmsgid \"Salt (CH)\"\nmsgstr \"Salt (CH)\"\n\nmsgid \"Vodafone (DE)\"\nmsgstr \"Vodafone (DE)\"\n\nmsgid \"Telekom (DE)\"\nmsgstr \"Telekom (DE)\"\n\nmsgid \"O2 (DE)\"\nmsgstr \"O2 (DE)\"\n\nmsgid \"E-Plus (DE)\"\nmsgstr \"E-Plus (DE)\"\n\nmsgid \"1&1 (DE)\"\nmsgstr \"1&1 (DE)\"\n\nmsgid \"A1 (AT)\"\nmsgstr \"A1 (AT)\"\n\nmsgid \"Drei (AT)\"\nmsgstr \"Drei (AT)\"\n\nmsgid \"Magenta (AT)\"\nmsgstr \"Magenta (AT)\"\n\nmsgid \"Authentication Type\"\nmsgstr \"认证类型\"\n\nmsgid \"None\"\nmsgstr \"无\"\n\nmsgid \"PAP\"\nmsgstr \"PAP认证\"\n\nmsgid \"CHAP\"\nmsgstr \"CHAP认证\"\n\nmsgid \"PAP/CHAP (both)\"\nmsgstr \"PAP/CHAP认证\"\n\nmsgid \"PAP/CHAP Username\"\nmsgstr \"PAP/CHAP 用户名\"\n\nmsgid \"PAP/CHAP Password\"\nmsgstr \"PAP/CHAP 密码\"\n\nmsgid \"PIN Code\"\nmsgstr \"Pin码\"\n\nmsgid \"If the PIN code is not set, leave it blank.\"\nmsgstr \"如果未设置PIN码，请留空。\"\n\nmsgid \"If solt 2 config is not set,will use slot 1 config.\"\nmsgstr \"如果卡2的设置为空，会使用卡1的设置\"\n\nmsgid \"The metric value is used to determine the priority of the route. The smaller the value, the higher the priority. Cannot duplicate.\"\nmsgstr \"路由优先级,越小的数字优先级越高。不可以和其他接口重复\"\n\n#odel/cbi/dial_overview.lua\nmsgid \"Dial Overview\"\nmsgstr \"拨号总览\"\n\nmsgid \"Global Config\"\nmsgstr \"全局设置\"\n\nmsgid \"Enable Dial\"\nmsgstr \"启用拨号\"\n\nmsgid \"(Global)\"\nmsgstr \"（全局）\"\n\nmsgid \"Restart Dial Service\"\nmsgstr \"重启拨号服务\"\n\nmsgid \"Config List\"\nmsgstr \"配置列表\"\n\nmsgid \"Modem Model\"\nmsgstr \"模组型号\"\n\nmsgid \"Modem Alias\"\nmsgstr \"模组别名\"\n\nmsgid \"Modem Status\"\nmsgstr \"模组状态\"\n\nmsgid \"ReDial\"\nmsgstr \"重拨\"\n\nmsgid \"Remove Modem\"\nmsgstr \"移除模组\"\n\n# model/cbi/settings.lua\nmsgid \"QModem Settings\"\nmsgstr \"QModem设置\"\n\nmsgid \"Modem Probe setting\"\nmsgstr \"模组加载设置\"\n\nmsgid \"Block Auto Probe/Remove\"\nmsgstr \"禁用自动加载/移除模组\"\n\nmsgid \"If enabled, the modem auto scan will be blocked.\"\nmsgstr \"开启后自动扫描模组服务会关闭\"\n\nmsgid \"Enable PCIE Scan\"\nmsgstr \"启用PCIe模组扫描\"\n\nmsgid \"Once enabled, the PCIe ports will be scanned on every boot.\"\nmsgstr \"如果启用了，每次开机会扫描PCIe接口\"\n\nmsgid \"Enable USB Scan\"\nmsgstr \"启用USB模组扫描\"\n\nmsgid \"Once enabled, the USB ports will be scanned on every boot.\"\nmsgstr \"如果启用了，每次开机会扫描USB接口\"\n\nmsgid \"Try Preset USB Port\"\nmsgstr \"监控预设的USB端口\"\n\nmsgid \"Attempt to use pre-configured USB settings from the cpe vendor.\"\nmsgstr \"尝试使用预设USB端口\"\n\nmsgid \"Try Preset PCIE Port\"\nmsgstr \"监控预设的PCIe端口\"\n\nmsgid \"Attempt to use pre-configured PCIE settings from the cpe vendor.\"\nmsgstr \"尝试使用预设PCIe端口\"\n\nmsgid \"Scan ALL Manually\"\nmsgstr \"手动扫描所有\"\n\nmsgid \"Scan PCIE Manually\"\nmsgstr \"手动扫描PCIe\"\n\nmsgid \"Scan USB Manually\"\nmsgstr \"手动扫描USB\"\n\nmsgid \"Modem Slot Config List\"\nmsgstr \"模组插槽配置列表\"\n\nmsgid \"Slot Type\"\nmsgstr \"插槽类型\"\n\nmsgid \"Slot Path\"\nmsgstr \"插槽路径\"\n\nmsgid \"Config Name\"\nmsgstr \"配置名称\"\n\n# model/cbi/slot_config.lua\nmsgid \"Slot Configuration\"\nmsgstr \"插槽配置\"\n\nmsgid \"Slot Type\"\nmsgstr \"插槽类型\"\n\nmsgid \"Slot ID\"\nmsgstr \"插槽ID\"\n\nmsgid \"SIM LED\"\nmsgstr \"SIM卡指示灯\"\n\nmsgid \"NET LED\"\nmsgstr \"网络指示灯\"\n\nmsgid \"Enable 5G Ethernet\"\nmsgstr \"启用5G转网口\"\n\nmsgid \"For 5G modules using the Ethernet PHY connection, please specify the network interface name. (e.g., eth0, eth1)\"\nmsgstr \"如果模组使用PHY连接，请指定网卡名称（如eth1 eth2)\"\n\nmsgid \"Associated USB\"\nmsgstr \"关联的USB\"\n\nmsgid \"For M.2 slots with both PCIe and USB support, specify the associated USB port (for ttyUSB access)\"\nmsgstr \"如果M.2接口同时提供pcie和usb，请关联usb（用于使用usb tty接口）\"\n\nmsgid \"The first module loaded into this slot will automatically be assigned this default metric.\"\nmsgstr \"该插槽加载的第一个模块将会自动分配该默认的跃点。\"\n\n# view/qmodem/dial_overview.htm\nmsgid \"Connected\"\nmsgstr \"已连接\"\n\nmsgid \"Disconnected\"\nmsgstr \"未连接\"\n\nmsgid \"Unknown\"\nmsgstr \"未知\"\n\nmsgid \"Download\"\nmsgstr \"下载\"\n\nmsgid \"Clear\"\nmsgstr \"清除\"\n\nmsgid \"Modem Status\"\nmsgstr \"模组状态\"\n\nmsgid \"Modem Log\"\nmsgstr \"模组日志\"\n\n# view/qmodem/modem_debug.htm\nmsgid \"Lock Band\"\nmsgstr \"锁频\"\n\nmsgid \"Select All\"\nmsgstr \"全选\"\n\nmsgid \"Submit\"\nmsgstr \"提交\"\n\nmsgid \"Rat Prefer\"\nmsgstr \"制式偏好\"\n\nmsgid \"Current Mode\"\nmsgstr \"当前模式\"\n\nmsgid \"Setting\"\nmsgstr \"设置\"\n\nmsgid \"Dial Mode\"\nmsgstr \"拨号模式\"\n\nmsgid \"Neighbor Cell\"\nmsgstr \"邻区\"\n\nmsgid \"Lock Cell Setting\"\nmsgstr \"锁频设置\"\n\nmsgid \"RAT\"\nmsgstr \"制式\"\n\nmsgid \"PCI\"\nmsgstr \"物理小区ID（PCI)\"\n\nmsgid \"ARFCN\"\nmsgstr \"频点（ARFCN）\"\n\nmsgid \"TAC\"\nmsgstr \"TAC\"\n\nmsgid \"Band\"\nmsgstr \"频段\"\n\nmsgid \"SCS\"\nmsgstr \"子载波间隔（SCS）\"\n\nmsgid \"Status\"\nmsgstr \"状态\"\n\nmsgid \"Copy\"\nmsgstr \"复制\"\n\nmsgid \"Set IMEI\"\nmsgstr \"设置IMEI\"\n\nmsgid \"Modem Name\"\nmsgstr \"模组名称\"\n\nmsgid \"Warning!\"\nmsgstr \"警告!\"\n\n# root/usr/share/qmodem/fibocom.sh\nmsgid \"Voltage\"\nmsgstr \"电压\"\n\nmsgid \"Temperature\"\nmsgstr \"温度\"\n\nmsgid \"Manufacturer\"\nmsgstr \"制造商\"\n\nmsgid \"SIM Status\"\nmsgstr \"SIM 状态\"\n\nmsgid \"Internet Service Provider\"\nmsgstr \"互联网服务提供商\"\n\nmsgid \"SIM Slot\"\nmsgstr \"SIM 插槽\"\n\nmsgid \"SIM Number\"\nmsgstr \"SIM 卡号码\"\n\nmsgid \"International Mobile Equipment Identity\"\nmsgstr \"国际移动设备身份（IMEI）\"\n\nmsgid \"International Mobile Subscriber Identity\"\nmsgstr \"国际移动用户身份（IMSI）\"\n\nmsgid \"Integrate Circuit Card Identity\"\nmsgstr \"集成电路卡身份（ICCID）\"\n\nmsgid \"Network Type\"\nmsgstr \"网络类型\"\n\nmsgid \"Channel Quality Indicator for Uplink\"\nmsgstr \"上行链路信道质量指示器（CQI）\"\n\nmsgid \"Channel Quality Indicator for Downlink\"\nmsgstr \"下行链路信道质量指示器（CQI）\"\n\nmsgid \"Access Maximum Bit Rate for Uplink\"\nmsgstr \"上行链路最大比特率\"\n\nmsgid \"Access Maximum Bit Rate for Downlink\"\nmsgstr \"下行链路最大比特率\"\n\nmsgid \"Transmit Rate\"\nmsgstr \"发送速率\"\n\nmsgid \"Receive Rate\"\nmsgstr \"接收速率\"\n\n\nmsgid \"Network Mode\"\nmsgstr \"网络模式\"\n\nmsgid \"Mobile Country Code\"\nmsgstr \"移动国家代码（MCC）\"\n\nmsgid \"Mobile Network Code\"\nmsgstr \"移动网络代码（MNC）\"\n\nmsgid \"Duplex Mode\"\nmsgstr \"双工模式\"\n\nmsgid \"Physical Cell ID\"\nmsgstr \"物理小区 ID（PCI）\"\n\nmsgid \"Tracking area code of cell served by neighbor Enb\"\nmsgstr \"邻近 eNB 服务的小区跟踪区代码（TAC）\"\n\nmsgid \"Absolute Radio-Frequency Channel Number\"\nmsgstr \"绝对射频信道编号（ARRCN）\"\n\nmsgid \"Band\"\nmsgstr \"频段\"\n\nmsgid \"Reference Signal Received Power\"\nmsgstr \"参考信号接收功率（RSRP）\"\n\nmsgid \"Reference Signal Received Quality\"\nmsgstr \"参考信号接收质量（RSRQ）\"\n\nmsgid \"Signal to Interference plus Noise Ratio Bandwidth\"\nmsgstr \"信号与干扰加噪声比带宽（SINRB）\"\n\nmsgid \"Received Signal Level\"\nmsgstr \"接收信号水平（RSL）\"\n\nmsgid \"SCS\"\nmsgstr \"子载波间隔（SCS）\"\n\nmsgid \"Serving Cell Receive Level\"\nmsgstr \"服务小区接收水平（SCRL）\"\n\nmsgid \"E-UTRA Absolute Radio Frequency Channel Number\"\nmsgstr \"E-UTRA 绝对射频信道编号（ARFCN）\"\n\nmsgid \"Freq band indicator\"\nmsgstr \"频段指示器（FBI）\"\n\nmsgid \"UL Bandwidth\"\nmsgstr \"上行带宽\"\n\nmsgid \"DL Bandwidth\"\nmsgstr \"下行带宽\"\n\nmsgid \"Received Signal Strength Indicator\"\nmsgstr \"接收信号强度指示器(RSSI)\"\n\nmsgid \"Radio Signal Strength Noise Ratio\"\nmsgstr \"无线信号强度噪声比(RSSNR)\"\n\nmsgid \"Channel Quality Indicator\"\nmsgstr \"信道质量指示器(CQI)\"\n\nmsgid \"TX Power\"\nmsgstr \"发射功率\"\n\nmsgid \"Location Area Code\"\nmsgstr \"位置区域代码\"\n\nmsgid \"Speech Code\"\nmsgstr \"语音编码\"\n\nmsgid \"Ec/No\"\nmsgstr \"Ec/No\"\n\nmsgid \"Ec/Io\"\nmsgstr \"Ec/Io\"\n\nmsgid \"Spreading Factor\"\nmsgstr \"扩频因子\"\n\nmsgid \"Compression Mode\"\nmsgstr \"压缩模式\"\n\nmsgid \"RxLev\"\nmsgstr \"接收电平\"\n\n# root/usr/share/qmodem/generic.sh\nmsgid \"SIM Error,Error code:\" \nmsgstr \"SIM 错误，错误代码：\"\n\nmsgid \"warning\"\nmsgstr \"警告\"\n\n\nmsgid \"Connect Status\"\nmsgstr \"连接状态\"\n\nmsgid \"Cell Information\"\nmsgstr \"基站信息\"\n\nmsgid \"Base Information\"\nmsgstr \"基本信息\"\n\nmsgid \"Network Information\"\nmsgstr \"网络信息\"\n\nmsgid \"SIM Information\"\nmsgstr \"SIM卡信息\"\n\n# modem_state\nmsgid \"ENABLED\"\nmsgstr \"已启用\"\n\nmsgid \"DISABLED\"\nmsgstr \"已禁用\"\n\nmsgid \"TTL Config\"\nmsgstr \"TTL配置\"\n\nmsgid \"Default Alias\"\nmsgstr \"默认别名\"\n\nmsgid \"After setting this option, the first module loaded into this slot will automatically be assigned this default alias.\"\nmsgstr \"设置后，首次加载来此该插槽的模组会自动分配该默认别名\"\n\nmsgid \"Modem\"\nmsgstr \"移动网络\"\n\nmsgid \"Reboot Modem\"\nmsgstr \"重启模组\"\n\nmsgid \"Soft Reboot\"\nmsgstr \"软重启\"\n\nmsgid \"Hard Reboot\"\nmsgstr \"硬重启\"\n\nmsgid \"Power GPIO\"\nmsgstr \"电源 GPIO\"\n\nmsgid \"GPIO Down Value\"\nmsgstr \"GPIO 关闭值\"\n\nmsgid \"GPIO Up Value\"\nmsgstr \"GPIO 开启值\"\n\nmsgid \"Default Metric\"\nmsgstr \"默认跃点\"\n\nmsgid \"AT Debug\"\nmsgstr \"AT 调试\"\n\nmsgid \"(using)\"\nmsgstr \"(使用中)\"\n\nmsgid \"(valid)\"\nmsgstr \"(有效)\"\n\nmsgid \"(invalid)\"\nmsgstr \"(无效)\"\n\nmsgid \"(Not belong to this modem)\"\nmsgstr \"(不属于此模组)\"\n\nmsgid \"Send\"\nmsgstr \"发送\"\n\nmsgid \"Clear\"\nmsgstr \"清除\"\n\nmsgid \"Select Port\"\nmsgstr \"选择端口\"\n\nmsgid \"Input AT Command\"\nmsgstr \"输入AT命令\"\n\nmsgid \"AT Command\"\nmsgstr \"AT 命令\"\n\nmsgid \"Double Click or Right Click to Edit\"\nmsgstr \"双击或右键编辑\"\n\nmsgid \"Lost focus to save\"\nmsgstr \"失去焦点保存\"\n\nmsgid \"Clear AT Port\"\nmsgstr \"清空AT端口\"\n\nmsgid \"Clear AT Command\"\nmsgstr \"清空AT命令\"\n\n# view/qmodem/modem_config.htm\nmsgid \"Fixed Device\"\nmsgstr \"固定设备\"\n\nmsgid \"If the device is fixed, it will not be update when the device is connected or disconnected.\"\nmsgstr \"如果设备是固定的，则在设备连接或断开时不会更新。\"\n\nmsgid \"Slot Path\"\nmsgstr \"插槽路径\"\n\nmsgid \"Interface Type\"\nmsgstr \"接口类型\"\n\nmsgid \"USB\"\nmsgstr \"USB\"\n\nmsgid \"PCIe\"\nmsgstr \"PCIe\"\n\nmsgid \"Alias\"\nmsgstr \"别名\"\n\nmsgid \"Alias for the modem, used for identification.\"\nmsgstr \"调制解调器的别名，用于标识。\"\n\nmsgid \"Enter alias name\"\nmsgstr \"输入别名\"\n\nmsgid \"Modem Model\"\nmsgstr \"调制解调器型号\"\n\nmsgid \"PDP Context Index\"\nmsgstr \"PDP上下文序号\"\n\n\nmsgid \"Manufacturer\"\nmsgstr \"制造商\"\n\nmsgid \"Quectel\"\nmsgstr \"移远\"\n\nmsgid \"Sierra Wireless\"\nmsgstr \"Sierra无线\"\n\nmsgid \"Fibocom\"\nmsgstr \"广和通\"\n\nmsgid \"Meig\"\nmsgstr \"美格\"\n\nmsgid \"Neoway\"\nmsgstr \"有方\"\n\nmsgid \"Telit\"\nmsgstr \"泰利特\"\n\nmsgid \"Platform\"\nmsgstr \"平台\"\n\nmsgid \"lte\"\nmsgstr \"LTE\"\n\nmsgid \"lte12\"\nmsgstr \"LTE12\"\n\nmsgid \"qualcomm\"\nmsgstr \"高通\"\n\nmsgid \"mediatek\"\nmsgstr \"联发科\"\n\nmsgid \"unisoc\"\nmsgstr \"紫光展锐\"\n\nmsgid \"intel\"\nmsgstr \"英特尔\"\n\nmsgid \"AT Port\"\nmsgstr \"AT端口\"\n\nmsgid \"AT command port for modem communication.\"\nmsgstr \"用于调制解调器通信的AT命令端口。\"\n\nmsgid \"Supported Modes\"\nmsgstr \"支持的模式\"\n\nmsgid \"ECM\"\nmsgstr \"ECM\"\n\nmsgid \"MBIM\"\nmsgstr \"MBIM\"\n\nmsgid \"QMI\"\nmsgstr \"QMI\"\n\nmsgid \"NCM\"\nmsgstr \"NCM\"\n\nmsgid \"Enable\"\nmsgstr \"启用\"\n\nmsgid \"WCDMA Band\"\nmsgstr \"WCDMA频段\"\n\nmsgid \"WCDMA band configuration, e.g., 1/2/3\"\nmsgstr \"WCDMA频段配置，例如：1/2/3\"\n\nmsgid \"Enter WCDMA band\"\nmsgstr \"输入WCDMA频段\"\n\nmsgid \"LTE Band\"\nmsgstr \"LTE频段\"\n\nmsgid \"LTE band configuration, e.g., 1/2/3\"\nmsgstr \"LTE频段配置，例如：1/2/3\"\n\nmsgid \"Enter LTE band\"\nmsgstr \"输入LTE频段\"\n\nmsgid \"NSA Band\"\nmsgstr \"NSA频段\"\n\nmsgid \"NSA band configuration, e.g., 1/2/3\"\nmsgstr \"NSA频段配置，例如：1/2/3\"\n\nmsgid \"Enter NSA band\"\nmsgstr \"输入NSA频段\"\n\nmsgid \"SA Band\"\nmsgstr \"SA频段\"\n\nmsgid \"SA band configuration, e.g., 1/2/3\"\nmsgstr \"SA频段配置，例如：1/2/3\"\n\nmsgid \"Enter SA band\"\nmsgstr \"输入SA频段\"\n\nmsgid \"Modem Config List\"\nmsgstr \"模组配置列表\"\n\nmsgid \"Please Select\"\nmsgstr \"请选择\"\n\nmsgid \"Quectel\"\nmsgstr \"移远通信\"\n\nmsgid \"Simcom\"\nmsgstr \"芯讯通\"\n\nmsgid \"Sierra Wireless\"\nmsgstr \"Sierra无线\"\n\nmsgid \"Fibocom\"\nmsgstr \"广和通\"\n\nmsgid \"LTE\"\nmsgstr \"LTE\"\n\nmsgid \"LTE12\"\nmsgstr \"LTE12\"\n\nmsgid \"Qualcomm\"\nmsgstr \"高通\"\n\nmsgid \"MediaTek\"\nmsgstr \"联发科\"\n\nmsgid \"Unisoc\"\nmsgstr \"紫光展锐\"\n\nmsgid \"Intel\"\nmsgstr \"英特尔\"\n\nmsgid \"ECM\"\nmsgstr \"ECM模式\"\n\nmsgid \"MBIM\"\nmsgstr \"MBIM模式\"\n\nmsgid \"QMI\"\nmsgstr \"QMI模式\"\n\nmsgid \"NCM\"\nmsgstr \"NCM模式\"\n\nmsgid \"RNDIS\"\nmsgstr \"RNDIS模式\"\n\nmsgid \"Dial Mode\"\nmsgstr \"拨号模式\"\n\nmsgid \"Rat Prefer\"\nmsgstr \"网络制式优先\"\n\nmsgid \"Set IMEI\"\nmsgstr \"设置IMEI\"\n\nmsgid \"Neighbor Cell\"\nmsgstr \"邻小区信息\"\n\nmsgid \"Lock Band\"\nmsgstr \"锁频段\"\n\nmsgid \"Reboot Modem\"\nmsgstr \"重启调制解调器\"\n\nmsgid \"AT Debug\"\nmsgstr \"AT调试\"\n\nmsgid \"Post Init Delay\"\nmsgstr \"初始化延时\"\n\nmsgid \"Delay of executing AT command after modem initialization, in seconds.\"\nmsgstr \"模组初始化后执行AT命令的延迟时间，以秒为单位。\"\n\nmsgid \"Enter delay in seconds\"\nmsgstr \"输入延时（秒）\"\n\nmsgid \"Post Init AT Commands\"\nmsgstr \"初始化后AT命令\"\n\nmsgid \"AT commands to execute after modem initialization.\"\nmsgstr \"模组初始化后执行的AT命令。\"\n\nmsgid \"Enter AT commands\"\nmsgstr \"输入AT命令\"\n\nmsgid \"Pre Dial Delay\"\nmsgstr \"拨号前延时\"\n\nmsgid \"Delay of executing AT command before dialing, in seconds.\"\nmsgstr \"拨号前执行AT命令的延迟时间，以秒为单位。\"\n\n\nmsgid \"Pre Dial AT Commands\"\nmsgstr \"拨号前AT命令\"\n\nmsgid \"AT commands to execute before dialing.\"\nmsgstr \"拨号前执行的AT命令。\"\n\nmsgid \"(still in beta)\"\nmsgstr \"（仍在测试中）\"\n\nmsgid \"（beta）\"\nmsgstr \"(测试)\"\n\nmsgid \"Alternative AT Tools\"\nmsgstr \"使用替代的AT工具\"\n\nmsgid \"If enabled, using alternative AT Tools\"\nmsgstr \"如果启用了，会使用另外替代的AT工具查询模块信息\"\n\nmsgid \"Delay Start\"\nmsgstr \"开机时延时启动(扫描)\"\n\nmsgid \"Units:seconds\"\nmsgstr \"单位：秒\"\n\nmsgid \"Override AT Port\"\nmsgstr \"覆盖AT端口\"\n\n\nmsgid \"If no DNS server is set, the DNS server provided by the operator will be used\"\nmsgstr \"如果未设置DNS服务器，会使用运营商提供的DNS服务器\"\n\nmsgid \"Use Ubus\"\nmsgstr \"使用Ubus\"\n\nmsgid \"Force Set APN\"\nmsgstr \"强制设置APN\"\n\nmsgid \"If enabled, the APN will be set even if it matches the current configuration.(only works with tom modified version of quectel-cm)\"\nmsgstr \"如果启用，即使APN与当前配置匹配也会设置APN。（仅适用于tom修改版的quectel-cm）\"\n\nmsgid \"If slot 2 config is not set,will use slot 1 config.\"\nmsgstr \"如果未设置插槽2配置，将使用插槽1配置。\"\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-hc/Makefile",
    "content": "# Copyright (C) 2024 Tom <fjrcn@outlook.com>\n# This is free software, licensed under the GNU General Public License v3.\n\ninclude $(TOPDIR)/rules.mk\n\n# Include unified version\ninclude ../../version.mk\n\nPKG_NAME:=luci-app-qmodem-hc\nLUCI_TITLE:=Luci qwrt modem sim switch\nLUCI_PKGARCH:=all\nPKG_VERSION:=$(QMODEM_VERSION)\nPKG_LICENSE:=GPLv3\nPKG_LINCESE_FILES:=LICENSE\nPKG_MAINTAINER:=Tom <fjrcn@outlook.com>\nLUCI_DEPENDS:=@TARGET_mediatek_mt7981_DEVICE_hc-g80||TARGET_mediatek_filogic_DEVICE_hc-g80 +luci-app-qmodem\n\t\t\n\ndefine Package/luci-app-qmodem-hc/conffiles\n/etc/config/qmodem_hc_sim\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-hc/luasrc/controller/qmodem_hc.lua",
    "content": "module(\"luci.controller.qmodem_hc\", package.seeall)\nlocal http = require \"luci.http\"\nlocal fs = require \"nixio.fs\"\nlocal json = require(\"luci.jsonc\")\nfunction index()\n    --sim卡配置\n\tentry({\"admin\", \"modem\", \"qmodem\", \"modem_sim\"}, cbi(\"qmodem_hc/modem_sim\"), luci.i18n.translate(\"SIM Config\"), 23).leaf = true\n\tentry({\"admin\", \"modem\", \"qmodem\", \"set_sim\"}, call(\"setSIM\"), nil).leaf = true\n\tentry({\"admin\", \"modem\", \"qmodem\", \"get_sim\"}, call(\"getSIM\"), nil).leaf = true\nend\n\nfunction getSimSlot(sim_path)\n    local sim_slot = fs.readfile(sim_path)\n    local current_slot = string.match(sim_slot, \"%d\")\n    if current_slot == \"0\" then\n        return \"SIM2\"\n    else\n        return \"SIM1\"\n    end\nend\n\nfunction shell(command)\n\tlocal odpall = io.popen(command)\n\tlocal odp = odpall:read(\"*a\")\n\todpall:close()\n\treturn odp\nend\n\n\nfunction getNextBootSlot()\n    local fw_print_cmd = \"fw_printenv -n sim2\"\n    local nextboot_slot = shell(fw_print_cmd)\n    if nextboot_slot == \"\" then\n        return \"SIM1\"\n    else\n        return \"SIM2\"\n    end\nend\n\nfunction writeJsonResponse(current_slot, nextboot_slot)\n    local result_json = {}\n    result_json[\"current_slot\"] = current_slot\n    result_json[\"nextboot_slot\"] = nextboot_slot\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json(result_json)\nend\n\nfunction getSIM()\n    local sim_path = \"/sys/class/gpio/sim/value\"\n    local current_slot = getSimSlot(sim_path)\n    local nextboot_slot = getNextBootSlot()\n    writeJsonResponse(current_slot, nextboot_slot)\nend\n\nfunction setSIM()\n    local sim_gpio = \"/sys/class/gpio/sim/value\"\n    local modem_gpio = \"/sys/class/gpio/4g/value\"\n    local sim_slot = http.formvalue(\"slot\")\n    local pre_detect = getSimSlot(sim_gpio)\n    \n    local reset_module = 1\n    if pre_detect == sim_slot then\n        reset_module = 0\n    end\n    if sim_slot == \"SIM1\" then\n        sysfs_cmd = \"echo 1 >\"..sim_gpio\n        fw_setenv_cmd = \"fw_setenv sim2\"\n    elseif sim_slot == \"SIM2\" then\n        sysfs_cmd = \"echo 0 >\"..sim_gpio\n        fw_setenv_cmd = \"fw_setenv sim2 1\"\n    end\n    shell(sysfs_cmd)\n    shell(fw_setenv_cmd)\n    if reset_module == 1 then\n        shell(\"echo 0 >\"..modem_gpio)\n        os.execute(\"sleep 1\")\n        shell(\"echo 1 >\"..modem_gpio)\n    end\n    local current_slot = getSimSlot(sim_gpio)\n    local nextboot_slot = getNextBootSlot()\n    writeJsonResponse(current_slot, nextboot_slot)\nend\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-hc/luasrc/model/cbi/qmodem_hc/modem_sim.lua",
    "content": "m = Map(\"qmodem_hc_sim\", translate(\"SIM Settings\"))\nuci = require \"luci.model.uci\".cursor()\ns = m:section(NamedSection,\"main\",\"main\", translate(\"SIM Settings\"))\ns.anonymous = true\ns.addremove = false\n\n\n\nsim_auto_switch = s:option(Flag, \"sim_auto_switch\", translate(\"SIM Auto Switch\"))\nsim_auto_switch.default = \"0\"\n\ndetect_interval = s:option(Value, \"detect_interval\", translate(\"Network Detect Interval\"))\ndetect_interval.default = 15\n\njudge_time = s:option(Value, \"judge_time\", translate(\"Network Down Judge Times\"))\njudge_time.default = 5\n\nping_dest = s:option(DynamicList, \"ping_dest\", translate(\"Ping Destination\"))\n\no = s:option(ListValue, \"modem_config\", translate(\"Modem Config\"))\nuci:foreach(\"qmodem\", \"modem-device\",\n    function(s)\n        if s then\n            o:value(s['.name'])\n        end\n    end\n)\n-- o.description = translate(\"Please enter the WWAN interface name\")\n-- o.template = \"cbi/network_netlist\"\n-- o.widget = \"optional\"\n\no.nocreate = true\n\nm:section(SimpleSection).template = \"qmodem_hc/modem_sim\"\n\nreturn m\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-hc/luasrc/view/qmodem_hc/modem_sim.htm",
    "content": "\n<script>\n\tfunction set_sim_view(slot){\n\t\t\tlet sim_current_slot = slot[\"current_slot\"];\n\t\t\tlet sim_nextboot_slot = slot[\"nextboot_slot\"];\n\t\t\tsim_current_view = document.getElementById(\"sim_slot_current\");\n\t\t\tsim_nextboot_view = document.getElementById(\"sim_slot_nextboot\");\n\t\t\tsim_current_view.innerHTML = sim_current_slot;\n\t\t\tsim_nextboot_view.innerHTML = sim_nextboot_slot;\n\t\t}\n\n\tfunction set_sim(){\n\t\tselect = document.getElementById(\"sim_slot_select\");\n\t\tslot = select.value;\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"set_sim\")%>', {\"slot\": slot },\n\t\t\tfunction (x, data) {\n\t\t\t\tset_sim_view(data);\n\t\t\t}\n\t\t);\n\t}\n\n\twindow.onload=function(){\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"get_sim\")%>', null,\n\t\t\t\t\tfunction (x, data) {\n\t\t\t\t\t\tset_sim_view(data);\n\t\t\t\t\t}\n\t\t\t\t);\n\t}\n</script>\n<!-- 设置SIM卡槽 -->\n\t<div class=\"cbi-section\" >\n\t\t<table class=\"table cbi-section-table\">\n\t\t\t<tbody id=\"sim_slot_setting\">\n\t\t\t\t<tr class=\"tr cbi-section-table-titles anonymous\">\n\t\t\t\t\t<th>\n\t\t\t\t\t\t<%:SIM Slot%>|<%:Now%>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th>\n\t\t\t\t\t\t<%:SIM Slot%>|<%:Next Boot%>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th>\n\t\t\t\t\t\t<%:SIM Slot%>|<%:Setting%>\n\t\t\t\t\t</th>\n\t\t\t\t</tr>\n\t\t\t\t<tr class=\"tr\">\n\t\t\t\t\t<td class=\"td\" style=\"width: auto;\">\n\t\t\t\t\t\t<span id=\"sim_slot_current\"></span>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td class=\"td cbi-value-field\">\n\t\t\t\t\t\t<span id=\"sim_slot_nextboot\"></span>\n\t\t\t\t\t</td>\n\t\t\t\t\t<td class=\"td cbi-value-field\">\n\t\t\t\t\t\t<select name=\"sim_slot_select\" id=\"sim_slot_select\" class=\"cbi-input-select\">\n\t\t\t\t\t\t\t<option value=\"SIM1\"><%:SIM1 (Close to power)%></option>\n\t\t\t\t\t\t\t<option value=\"SIM2\"><%:SIM2 (Away from power)%></option>\n\n\t\t\t\t\t\t</select>\n\t\t\t\t\t</td>\n\t\t\t\t</tr>\n\t\t\t</tbody>\n\t\t</table>\n\t\t<input type=\"button\" class=\"cbi-button-apply\" onclick=\"set_sim()\" value=\"<%:Set SIM%>\">\n\n\t</div>\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-hc/po/zh_Hans/modem_hc.po",
    "content": "#view/modem_sim.htm\nmsgid \"SIM Slot\"\nmsgstr \"SIM卡卡槽\"\n\nmsgid \"Now\"\nmsgstr \"当前\"\n\nmsgid \"Next Boot\"\nmsgstr \"下次启动\"\n\nmsgid \"Setting'\nmsgstr \"设置\"\n\nmsgid \"SIM1 (Close to power)\"\nmsgstr \"SIM1 (靠近电源)\"\n\nmsgid \"SIM2 (Away from power)\"\nmsgstr \"SIM2 (远离电源)\"\n\nmsgid \"Set SIM\"\nmsgstr \"设置SIM卡\"\n\nmsgid \"SIM Settings\"\nmsgstr \"SIM卡设置\"\n\nmsgid \"SIM Auto Switch\"\nmsgstr \"SIM卡自动切换\"\n\nmsgid \"Network Detect Interval\"\nmsgstr \"网络检测间隔\"\n\nmsgid \"Network Down Judge Times\"\nmsgstr \"网络下判断次数\"\n\nmsgid \"Ping Destination\"\nmsgstr \"Ping目标\"\n\nmsgid \"modem_config\"\nmsgstr \"模块配置\"\n\nmsgid \"SIM Config\"\nmsgstr \"SIM卡配置\"\n\nmsgid \"Modem Config\"\nmsgstr \"模块配置\"\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-hc/root/etc/config/qmodem_hc_sim",
    "content": "config main main\n        option sim_auto_switch '1'\n        option detect_interval '15'\n        option judge_time '5'\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-hc/root/etc/init.d/qmodem_hc_sim",
    "content": "#!/bin/sh /etc/rc.common\nUSE_PROCD=1\nSTART=99\nSTOP=10\nPROG=\"/usr/share/qmodem/modem_sim.sh\"\nstart_service() {\n    local sim_auto_switch=$(uci -q get qmodem_hc_sim.main.sim_auto_switch)\n    logger -t modem_sim start_service $sim_auto_switch\n    if [ \"$sim_auto_switch\" == 1 ];then\n        start_instace\n    else\n        stop_service\n    fi\n}\n\nstart_instace(){\n    procd_open_instance \"$PROG\"\n    procd_set_param command /usr/share/qmodem/modem_sim.sh\n    procd_close_instance\n    logger -t modem_sim running\n}\n\nreload_service() {\n    stop\n\tstart\n}\n\nstop_service() {\n    logger -t modem_sim stop_service\n    service_stop \"$PROG\"\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger 'qmodem_hc_sim'\n}\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-hc/root/etc/uci-defaults/luci-app-qmodem-hc",
    "content": "#!/bin/sh\n# Copyright (C) 2024 Tom <fjrcn@outlook.com>\n\n/etc/init.d/modeminit enable\n/etc/init.d/modem enable\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@qmodem[-1]\n\tadd ucitrack qmodem\n\tset ucitrack.@qmodem[-1].init=qmodem_hc_sim\n\n\tdelete ucitrack.qmodem_hc_sim\n\tadd ucitrack qmodem_hc_sim\n\tset ucitrack.@qmodem_hc_sim[-1].init=qmodem_hc_sim\n\tcommit ucitrack\nEOF\n\nrm -rf /tmp/luci-*cache\nexit 0\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-hc/root/usr/share/qmodem/modem_sim.sh",
    "content": "#!/bin/sh\n. /lib/functions.sh\n. /usr/share/qmodem/modem_util.sh\nsim_gpio=\"/sys/class/gpio/sim/value\"\nmodem_gpio=\"/sys/class/gpio/4g/value\"\ndebug=0\ndebug_log()\n{\n    [ \"$debug\" -eq 1 ] && echo $1\n}\n# get detect config\nload_detect_config()\n{\n    config_load qmodem_hc_sim\n    config_get ping_dest main ping_dest\n    config_get judge_time main judge_time 5\n    config_get detect_interval main detect_interval 10\n    config_get modem_config main modem_config\n    [ -z \"$modem_config\" ] && get_first_avalible_config\n    debug_log \"ping_dest:$ping_dest\"\n    debug_log \"judge_time:$judge_time\"\n    debug_log \"detect_interval:$detect_interval\"\n    debug_log \"modem_config:$modem_config\"\n}\n\n_enabled_config()\n{\n    cfg=$1\n    local state\n    config_get state $cfg state\n    [ -n \"$state\" ] && [ \"$state\" != \"disabled\" ] && modem_config=$cfg\n}\n\nget_first_avalible_config()\n{\n    config_load qmodem\n    config_foreach _enabled_config modem-device\n}\n\nreboot_modem() {\n    echo 0 > $modem_gpio\n    sleep 1\n    echo 1 > $modem_gpio\n}\n\nswitch_sim() {\n    if [ -f $sim_gpio ]; then\n        sim_status=$(cat $sim_gpio)\n        if [ \"$sim_status\" -eq 0 ]; then\n            echo 1 > $sim_gpio\n        else\n            echo 0 > $sim_gpio\n        fi\n        reboot_modem\n        logger -t modem_sim \"switch sim from $sim_status to $(cat $sim_gpio)\"\n    fi\n}\n\n_get_netdev() {\n    local modemconfig\n    config_load modemconfig $1 modem_config\n    [ \"$modemconfig\" != \"$target_modemconfig\" ] && return 1\n    config_get netdev $1 ifname\n}\n\nget_associa_netdev() {\n    config_load network\n    target_modemconfig=$1\n    config_foreach _get_netdev interface\n    unset target_modemconfig\n}\n\n\nping_monitor() {\n    #ping_dest为空则不进行ping检测 ，如果有多个，用空格隔开\n    has_success=0\n    for dest in $ping_dest; do\n        ping -c 1 -W 1 $dest -I $netdev > /dev/null\n        if [ $? -eq 0 ]; then\n            return 1\n        fi\n    done\n    return 0\n}\n\nat_sim_monitor() {\n    ttydev=$1\n    #检查sim卡状态，有sim卡则返回1\n    expect=\"+CPIN: READY\"\n    result=$(at $ttydev \"AT+CPIN?\" | grep -o \"$expect\")\n    debug_log $result\n    if [ -n \"$result\" ]; then\n        return 1\n    fi\n    return 0\n}\n\nat_dial_monitor() {\n    ttydev=$1\n    pdp_index=$2\n#检查dial状态，有dial则返回1\n    [ -z \"$pdp_index\" ] && pdp_index=1\n    at_cmd=\"AT+CGPADDR=$pdp_index\"\n    expect=\"+CGPADDR:\"\n    result=$(at $ttydev $at_cmd | grep \"$expect\")\n    debug_log $result\n    if [ -n \"$result\" ];then\n            ipv6=$(echo $result | grep -oE \"\\b([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}\\b\")\n            ipv4=$(echo $result | grep -oE \"\\b([0-9]{1,3}\\.){3}[0-9]{1,3}\\b\")\n            disallow_ipv4=\"0.0.0.0\"\n            #remove the disallow ip\n            if [ \"$ipv4\" == \"$disallow_ipv4\" ];then\n                ipv4=\"\"\n            fi\n            if [ -n \"$ipv4\" ] || [ -n \"$ipv6\" ];then\n                return 1\n            fi\n    fi\n    return 0\n}\n\nprecheck()\n{\n    config_load qmodem\n    modem_config=$1\n    config_get state $modem_config state\n    # is empty or is disabled\n    config_get at_port $modem_config at_port\n    config_get enable_dial $modem_config enable_dial 0\n    config_get pdp_index $modem_config pdp_index 1\n    config_get global_en main enable_dial 0\n    debug_log \"state:$state\"\n    debug_log \"at_port:$at_port\"\n    debug_log \"enable_dial:$enable_dial\"\n    debug_log \"pdp_index:$pdp_index\"\n    debug_log \"global_en:$global_en\"\n    [ -z \"$state\" ] || [ \"$state\" == \"disabled\" ] && return 1\n    [ \"$global_en\" == \"0\" ] && return 1\n    [ -z \"$enable_dial\" ] || [ \"$enable_dial\" == \"0\" ] && return 1\n    [ -z \"$at_port\" ] && return 1\n    [ ! -e \"$at_port\" ] && return 1\n    return 0\n}\n\nmain_loop()\n{\n    while true;do\n        precheck $modem_config\n        if [ $? -eq 1 ];then \n            sleep $detect_interval\n            continue\n        fi\n        get_associa_netdev $modem_config\n        \n        if [ -n \"$ping_dest\" ]; then\n             ping_monitor\n             ping_result=$?\n        fi\n        if [ -n \"$at_port\" ] && [ -n \"$pdp_index\" ];then\n             at_dial_monitor $at_port $pdp_index\n             dial_result=$?\n        fi\n        if [ -n \"$at_port\" ]; then\n            at_sim_monitor $at_port\n            sim_result=$?\n        fi\n\n        debug_log \"ping_result:$ping_result dial_result:$dial_result sim_result:$sim_result\"\n\n        if [ -n \"$ping_dest\" ];then\n            #策略：ping成功则重置fail_times，否则fail_times累加\n            [ -z \"$dial_result\" ] && dial_result=1\n            [ -z \"$sim_result\" ] && sim_result=1\n            fail_total=$((3 - $ping_result - $dial_result - $sim_result))\n            if [ $ping_result -eq 1 ]; then\n                fail_times=0\n            else\n                fail_times=$(($fail_times + $fail_total))\n            fi\n            \n            #如果失败次数超过judge_time * 3则切卡 切卡后等待3分钟\n        else\n            #策略 无ping则检测拨号和sim卡状态，拨号成功则重置fail_times，否则fail_times累加\n            [ -z \"$dial_result\" ] && dial_result=1\n            [ -z \"$sim_result\" ] && sim_result=1\n            fail_total=$((2 - $dial_result - $sim_result))\n            if [ $dial_result -eq 1 ]; then\n                fail_times=0\n            else\n                fail_times=$(($fail_times + $fail_total))\n            fi\n        fi\n        logger -t modem_sim \"ping_result:$ping_result dial_result:$dial_result sim_result:$sim_result fail_times:$fail_times fail_total:$fail_total fail_times:$fail_times\"\n        if [ $fail_times -ge $(($judge_time * 2)) ]; then\n            switch_sim\n            fail_times=0\n            sleep 240\n        fi\n        sleep $detect_interval\n    done\n}\nif [ ! \"$debug\" -eq 1 ]; then\n    sleep 180\nfi\nload_detect_config\nmain_loop\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-monitor/Makefile",
    "content": "# Copyright (C) 2024 Tom <fjrcn@outlook.com>\n# This is free software, licensed under the GNU General Public License v3.\n\ninclude $(TOPDIR)/rules.mk\n\n# Include unified version\ninclude ../../version.mk\n\nLUCI_TITLE:=LuCI App for QModem Monitor Configuration(JS Luci Only)\nLUCI_DEPENDS:=+qmodem +qmodem_monitor +luci-base +luci-app-qmodem-next\nLUCI_PKGARCH:=all\nPKG_VERSION:=$(QMODEM_VERSION)\nPKG_RELEASE:=1\nPKG_LICENSE:=GPLv3\nPKG_MAINTAINER:=Tom <fjrcn@outlook.com>\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-monitor/htdocs/luci-static/resources/view/qmodem/monitor.js",
    "content": "'use strict';\n'require view';\n'require form';\n'require uci';\n'require rpc';\n'require ui';\n'require poll';\n'require fs';\n\nvar callInitAction = rpc.declare({\n\tobject: 'luci',\n\tmethod: 'setInitAction',\n\tparams: ['name', 'action'],\n\texpect: { result: false }\n});\n\nvar callRcStatus = rpc.declare({\n\tobject: 'rc',\n\tmethod: 'list',\n\tparams: ['name'],\n\texpect: { }\n});\n\nvar USER_SCRIPTS_PATH = '/usr/share/qmodem/user_scripts';\n\n// Helper function to list scripts\nfunction listUserScripts() {\n\treturn fs.list(USER_SCRIPTS_PATH).then(function(entries) {\n\t\treturn Array.isArray(entries) ? entries.filter(function(e) {\n\t\t\treturn e.type === 'file';\n\t\t}) : [];\n\t}).catch(function() {\n\t\treturn [];\n\t});\n}\n\n// Monitor method definitions with their specific parameters\nvar monitorMethods = {\n\t'ping': {\n\t\tname: 'Ping',\n\t\tdescription: 'Ping target to check connectivity',\n\t\tparams: {\n\t\t\t'monitor_ping_type': {\n\t\t\t\ttitle: 'Ping Type',\n\t\t\t\ttype: 'select',\n\t\t\t\tvalues: {\n\t\t\t\t\t'ip': 'IP Address / Domain',\n\t\t\t\t\t'gateway': 'Gateway',\n\t\t\t\t\t'dns': 'DNS Server'\n\t\t\t\t},\n\t\t\t\tdefault: 'gateway'\n\t\t\t},\n\t\t\t'monitor_ping_dest': {\n\t\t\t\ttitle: 'Target IP / Domain',\n\t\t\t\ttype: 'string',\n\t\t\t\tplaceholder: '8.8.8.8'\n\t\t\t},\n\t\t\t'monitor_ping_ip_version': {\n\t\t\t\ttitle: 'IP Version',\n\t\t\t\ttype: 'select',\n\t\t\t\tvalues: { '4': 'IPv4', '6': 'IPv6' },\n\t\t\t\tdefault: '4'\n\t\t\t}\n\t\t}\n\t},\n\t'curl': {\n\t\tname: 'HTTP Request',\n\t\tdescription: 'HTTP request to check connectivity',\n\t\tparams: {\n\t\t\t'monitor_http_url': {\n\t\t\t\ttitle: 'URL',\n\t\t\t\ttype: 'string',\n\t\t\t\tplaceholder: 'http://www.example.com',\n\t\t\t\tdefault: 'http://www.baidu.com'\n\t\t\t}\n\t\t}\n\t}\n};\n\n// Action definitions with their specific parameters\nvar actionTypes = {\n\t'switch_sim_slot': {\n\t\tname: 'Switch SIM Slot',\n\t\tdescription: 'Switch to another SIM slot',\n\t\tparams: {}\n\t},\n\t'send_at_commands': {\n\t\tname: 'Send AT Commands',\n\t\tdescription: 'Send AT commands to modem',\n\t\tparams: {\n\t\t\t'at_command': {\n\t\t\t\ttitle: 'AT Commands',\n\t\t\t\ttype: 'list',\n\t\t\t\tplaceholder: 'AT+CFUN=1,1'\n\t\t\t}\n\t\t}\n\t},\n\t'run_scripts': {\n\t\tname: 'Run Scripts',\n\t\tdescription: 'Run custom scripts',\n\t\tparams: {\n\t\t\t'script': {\n\t\t\t\ttitle: 'Script Paths',\n\t\t\t\ttype: 'list',\n\t\t\t\tplaceholder: '/usr/bin/my_script.sh'\n\t\t\t}\n\t\t}\n\t}\n};\n\nreturn view.extend({\n\tload: function() {\n\t\tvar self = this;\n\t\treturn Promise.all([\n\t\t\tuci.load('qmodem'),\n\t\t\tcallRcStatus('qmodem_monitor'),\n\t\t\tlistUserScripts()\n\t\t]).then(function(results) {\n\t\t\tself.rcStatusData = results[1];\n\t\t\tself.userScripts = results[2] || [];\n\t\t\treturn results;\n\t\t});\n\t},\n\n\trender: function() {\n\t\tvar m, s, o;\n\t\tvar self = this;\n\n\t\tm = new form.Map('qmodem', _('QModem Monitor Configuration'),\n\t\t\t_('Configure monitoring methods and actions for modem connectivity.'));\n\n\t\t// Global Monitor Configuration\n\t\ts = m.section(form.NamedSection, 'main', 'main', _('Global Monitor Settings'));\n\t\ts.anonymous = true;\n\n\n\t\t// QModem Monitor RC status display\n\t\tvar rcStatus = s.option(form.DummyValue, '_rc_status', _('Monitor Service'));\n\t\trcStatus.rawhtml = true;\n\t\trcStatus.cfgvalue = L.bind(function() {\n\t\t\tvar status = this.rcStatusData && this.rcStatusData.qmodem_monitor ? this.rcStatusData.qmodem_monitor : null;\n\t\t\t\n\t\t\tif (!status) {\n\t\t\t\treturn E('div', { id: 'rc-status-container' }, [\n\t\t\t\t\tE('span', {}, _('Failed to load status'))\n\t\t\t\t]);\n\t\t\t}\n\t\t\t\n\t\t\tvar enabled = status.enabled === true || status.enabled === 'true';\n\t\t\tvar running = status.running === true || status.running === 'true';\n\t\t\t\n\t\t\treturn E('div', { id: 'rc-status-container' }, [\n\t\t\t\tE('span', {}, _('Enabled') + ': ' + (enabled ? _('Yes') : _('No'))),\n\t\t\t\tE('span', { 'style': 'margin-left: 12px;' }, _('Running') + ': ' + (running ? _('Yes') : _('No')))\n\t\t\t]);\n\t\t}, this);\n\n\t\t// Service Control buttons\n\t\tvar rcControl = s.option(form.DummyValue, '_monitor_control', _('Service Control'));\n\t\trcControl.rawhtml = true;\n\t\trcControl.cfgvalue = L.bind(function() {\n\t\t\tvar status = this.rcStatusData && this.rcStatusData.qmodem_monitor ? this.rcStatusData.qmodem_monitor : null;\n\t\t\tvar enabled = status ? (status.enabled === true || status.enabled === 'true') : false;\n\t\t\tvar running = status ? (status.running === true || status.running === 'true') : false;\n\t\t\t\n\t\t\tvar buttons = [];\n\t\t\t\n\t\t\t// Running control: show Start if not running, show Stop and Restart if running\n\t\t\tif (!running) {\n\t\t\t\tbuttons.push(\n\t\t\t\t\tE('button', {\n\t\t\t\t\t\t'class': 'cbi-button cbi-button-action',\n\t\t\t\t\t\t'id': 'rc-start-button',\n\t\t\t\t\t\t'click': ui.createHandlerFn(this, function() {\n\t\t\t\t\t\t\tvar self = this;\n\t\t\t\t\t\t\treturn callInitAction('qmodem_monitor', 'start')\n\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Monitor service started successfully')));\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to start monitor: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t}, _('Start'))\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tbuttons.push(\n\t\t\t\t\tE('button', {\n\t\t\t\t\t\t'class': 'cbi-button cbi-button-reset',\n\t\t\t\t\t\t'id': 'rc-stop-button',\n\t\t\t\t\t\t'click': ui.createHandlerFn(this, function() {\n\t\t\t\t\t\t\tvar self = this;\n\t\t\t\t\t\t\treturn callInitAction('qmodem_monitor', 'stop')\n\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Monitor service stopped successfully')));\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to stop monitor: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t}, _('Stop'))\n\t\t\t\t);\n\t\t\t\tbuttons.push(\n\t\t\t\t\tE('button', {\n\t\t\t\t\t\t'class': 'cbi-button cbi-button-apply',\n\t\t\t\t\t\t'id': 'rc-restart-button',\n\t\t\t\t\t\t'style': 'margin-left: 8px;',\n\t\t\t\t\t\t'click': ui.createHandlerFn(this, function() {\n\t\t\t\t\t\t\tvar self = this;\n\t\t\t\t\t\t\treturn callInitAction('qmodem_monitor', 'restart')\n\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Monitor service restarted successfully')));\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to restart monitor: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t}, _('Restart'))\n\t\t\t\t);\n\t\t\t}\n\t\t\t\n\t\t\tbuttons.push(E('span', { 'style': 'margin: 0 8px;' }, ' | '));\n\n\t\t\t// Enabled control: show Enable if not enabled, show Disable if enabled\n\t\t\tif (!enabled) {\n\t\t\t\tbuttons.push(\n\t\t\t\t\tE('button', {\n\t\t\t\t\t\t'class': 'cbi-button cbi-button-apply',\n\t\t\t\t\t\t'id': 'rc-enable-button',\n\t\t\t\t\t\t'click': ui.createHandlerFn(this, function() {\n\t\t\t\t\t\t\tvar self = this;\n\t\t\t\t\t\t\treturn callInitAction('qmodem_monitor', 'enable')\n\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Monitor service enabled successfully')));\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to enable monitor: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t}, _('Enable'))\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tbuttons.push(\n\t\t\t\t\tE('button', {\n\t\t\t\t\t\t'class': 'cbi-button cbi-button-negative',\n\t\t\t\t\t\t'id': 'rc-disable-button',\n\t\t\t\t\t\t'click': ui.createHandlerFn(this, function() {\n\t\t\t\t\t\t\tvar self = this;\n\t\t\t\t\t\t\treturn callInitAction('qmodem_monitor', 'disable')\n\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Monitor service disabled successfully')));\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to disable monitor: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t}, _('Disable'))\n\t\t\t\t);\n\t\t\t}\n\t\t\t\n\t\t\treturn E('div', { id: 'rc-control-container' }, buttons);\n\t\t}, this);\n\n\t\t// User Scripts Management Section\n\t\ts = m.section(form.NamedSection, 'main', 'main', _('User Scripts Management'));\n\t\ts.anonymous = true;\n\n\t\t// Security Warning\n\t\to = s.option(form.DummyValue, '_security_warning', _('Security Warning'));\n\t\to.rawhtml = true;\n\t\to.cfgvalue = function() {\n\t\t\treturn E('div', { 'class': 'cbi-value-description', 'style': 'color: #c00; padding: 10px; background: #fff3cd; border: 1px solid #ffc107; border-radius: 4px; margin-bottom: 10px;' }, [\n\t\t\t\tE('strong', {}, '⚠️ ' + _('Security Warning') + ': '),\n\t\t\t\tE('span', {}, _('User scripts run with root privileges. Only upload scripts from trusted sources. Malicious scripts can damage your system or compromise security. Review script contents before uploading.'))\n\t\t\t]);\n\t\t};\n\n\t\t// Script Upload\n\t\to = s.option(form.DummyValue, '_script_upload', _('Upload Script'));\n\t\to.rawhtml = true;\n\t\to.cfgvalue = L.bind(function() {\n\t\t\tvar uploadContainer = E('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\tE('input', {\n\t\t\t\t\t'type': 'file',\n\t\t\t\t\t'id': 'script-file-input',\n\t\t\t\t\t'accept': '.sh,.py,.lua',\n\t\t\t\t\t'style': 'margin-right: 10px;'\n\t\t\t\t}),\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'cbi-button cbi-button-action',\n\t\t\t\t\t'id': 'upload-script-btn',\n\t\t\t\t\t'click': ui.createHandlerFn(this, function() {\n\t\t\t\t\t\tvar fileInput = document.getElementById('script-file-input');\n\t\t\t\t\t\tvar file = fileInput.files[0];\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (!file) {\n\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Please select a file to upload')), 'error');\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Validate file extension\n\t\t\t\t\t\tvar fileName = file.name;\n\t\t\t\t\t\tvar validExtensions = ['.sh', '.py', '.lua'];\n\t\t\t\t\t\tvar hasValidExt = validExtensions.some(function(ext) {\n\t\t\t\t\t\t\treturn fileName.toLowerCase().endsWith(ext);\n\t\t\t\t\t\t});\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (!hasValidExt) {\n\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Invalid file type. Only .sh, .py, and .lua files are allowed.')), 'error');\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Sanitize filename - only allow alphanumeric, dash, underscore, dot\n\t\t\t\t\t\tvar sanitizedName = fileName.replace(/[^a-zA-Z0-9._-]/g, '_');\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar reader = new FileReader();\n\t\t\t\t\t\treader.onload = function(e) {\n\t\t\t\t\t\t\tvar content = e.target.result;\n\t\t\t\t\t\t\tvar destPath = USER_SCRIPTS_PATH + '/' + sanitizedName;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// First create directory if not exists using fs.exec\n\t\t\t\t\t\t\tfs.exec('/bin/mkdir', ['-p', USER_SCRIPTS_PATH]).then(function() {\n\t\t\t\t\t\t\t\t// Write file content\n\t\t\t\t\t\t\t\treturn fs.write(destPath, content);\n\t\t\t\t\t\t\t}).then(function() {\n\t\t\t\t\t\t\t\t// Set execute permission\n\t\t\t\t\t\t\t\treturn fs.exec('/bin/chmod', ['+x', destPath]);\n\t\t\t\t\t\t\t}).then(function() {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Script uploaded successfully: ') + sanitizedName));\n\t\t\t\t\t\t\t\t// Refresh the script list\n\t\t\t\t\t\t\t\treturn listUserScripts();\n\t\t\t\t\t\t\t}).then(function(scripts) {\n\t\t\t\t\t\t\t\tself.userScripts = scripts;\n\t\t\t\t\t\t\t\t// Update the script list display\n\t\t\t\t\t\t\t\tself.updateScriptList();\n\t\t\t\t\t\t\t}).catch(function(err) {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to upload script: ') + (err.message || err)), 'error');\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t};\n\t\t\t\t\t\treader.readAsText(file);\n\t\t\t\t\t})\n\t\t\t\t}, _('Upload'))\n\t\t\t]);\n\t\t\t\n\t\t\treturn E('div', {}, [\n\t\t\t\tuploadContainer,\n\t\t\t\tE('div', { 'class': 'cbi-value-description', 'style': 'margin-top: 5px;' }, \n\t\t\t\t\t_('Scripts will be uploaded to ') + USER_SCRIPTS_PATH + _('. Allowed types: .sh, .py, .lua'))\n\t\t\t]);\n\t\t}, this);\n\n\t\t// Current Scripts List\n\t\to = s.option(form.DummyValue, '_script_list', _('Uploaded Scripts'));\n\t\to.rawhtml = true;\n\t\to.cfgvalue = L.bind(function() {\n\t\t\tvar scripts = this.userScripts || [];\n\t\t\t\n\t\t\tif (scripts.length === 0) {\n\t\t\t\treturn E('div', { 'id': 'user-scripts-list' }, [\n\t\t\t\t\tE('em', {}, _('No scripts uploaded yet'))\n\t\t\t\t]);\n\t\t\t}\n\t\t\t\n\t\t\tvar listItems = scripts.map(function(script) {\n\t\t\t\treturn E('div', { 'class': 'script-item', 'style': 'display: flex; align-items: center; padding: 5px 0; border-bottom: 1px solid #eee;' }, [\n\t\t\t\t\tE('span', { 'style': 'flex: 1; font-family: monospace;' }, USER_SCRIPTS_PATH + '/' + script.name),\n\t\t\t\t\tE('button', {\n\t\t\t\t\t\t'class': 'cbi-button cbi-button-negative',\n\t\t\t\t\t\t'style': 'margin-left: 10px;',\n\t\t\t\t\t\t'data-script': script.name,\n\t\t\t\t\t\t'click': ui.createHandlerFn(self, function(ev) {\n\t\t\t\t\t\t\tvar scriptName = ev.target.getAttribute('data-script');\n\t\t\t\t\t\t\tvar scriptPath = USER_SCRIPTS_PATH + '/' + scriptName;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (!confirm(_('Are you sure you want to delete this script?') + '\\n' + scriptPath)) {\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tfs.remove(scriptPath).then(function() {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Script deleted successfully: ') + scriptName));\n\t\t\t\t\t\t\t\treturn listUserScripts();\n\t\t\t\t\t\t\t}).then(function(scripts) {\n\t\t\t\t\t\t\t\tself.userScripts = scripts;\n\t\t\t\t\t\t\t\tself.updateScriptList();\n\t\t\t\t\t\t\t}).catch(function(err) {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to delete script: ') + (err.message || err)), 'error');\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t}, _('Delete'))\n\t\t\t\t]);\n\t\t\t});\n\t\t\t\n\t\t\treturn E('div', { 'id': 'user-scripts-list' }, listItems);\n\t\t}, this);\n\n\t\t// Per-Modem Monitor Configuration\n\t\ts = m.section(form.GridSection, 'modem-device', _('Modem Monitor Configuration'));\n\t\ts.anonymous = false;\n\t\ts.addremove = false;\n\t\ts.modaltitle = function(section_id) {\n\t\t\tvar name = uci.get('qmodem', section_id, 'name');\n\t\t\tvar alias = uci.get('qmodem', section_id, 'alias');\n\t\t\treturn _('Monitor Configuration') + ': ' + (alias || name || section_id);\n\t\t};\n\n\t\t// Grid columns\n\t\to = s.option(form.DummyValue, 'name', _('Modem'));\n\t\to.cfgvalue = function(section_id) {\n\t\t\tvar name = uci.get('qmodem', section_id, 'name') || '';\n\t\t\tvar alias = uci.get('qmodem', section_id, 'alias');\n\t\t\treturn alias ? alias + ' (' + name + ')' : name;\n\t\t};\n\n\t\to = s.option(form.Flag, 'monitor_enabled', _('Enable'));\n\t\to.default = '0';\n\t\to.rmempty = false;\n\t\to.editable = true;\n\n\t\to = s.option(form.DummyValue, '_monitor_method_display', _('Method'));\n\t\to.cfgvalue = function(section_id) {\n\t\t\tvar method = uci.get('qmodem', section_id, 'monitor_method');\n\t\t\tif (method && monitorMethods[method]) {\n\t\t\t\treturn _(monitorMethods[method].name);\n\t\t\t}\n\t\t\treturn '-';\n\t\t};\n\n\t\to = s.option(form.DummyValue, '_monitor_action_display', _('Actions'));\n\t\to.cfgvalue = function(section_id) {\n\t\t\tvar actions = uci.get('qmodem', section_id, 'monitor_action');\n\t\t\tif (!actions) return '-';\n\t\t\tif (!Array.isArray(actions)) actions = [actions];\n\t\t\treturn actions.map(function(a) {\n\t\t\t\treturn actionTypes[a] ? _(actionTypes[a].name) : a;\n\t\t\t}).join(', ');\n\t\t};\n\n\t\t// Modal options\n\t\t// ============= Monitor Method Selection =============\n\t\to = s.option(form.ListValue, 'monitor_method', _('Monitor Method'));\n\t\to.modalonly = true;\n\t\to.default = 'ping';\n\t\tObject.keys(monitorMethods).forEach(function(key) {\n\t\t\to.value(key, _(monitorMethods[key].name));\n\t\t});\n\t\to.description = function(section_id) {\n\t\t\tvar method = this.formvalue(section_id) || uci.get('qmodem', section_id, 'monitor_method');\n\t\t\tif (method && monitorMethods[method]) {\n\t\t\t\treturn _(monitorMethods[method].description);\n\t\t\t}\n\t\t\treturn '';\n\t\t};\n\n\t\t// ============= Ping Method Parameters =============\n\t\t// monitor_ping_type: Ping Type (ip/gateway/dns)\n\t\to = s.option(form.ListValue, 'monitor_ping_type', _('Ping Type'));\n\t\to.modalonly = true;\n\t\to.value('ip', _('IP Address / Domain'));\n\t\to.value('gateway', _('Gateway'));\n\t\to.value('dns', _('DNS Server'));\n\t\to.default = 'gateway';\n\t\to.depends('monitor_method', 'ping');\n\n\t\t// monitor_ping_dest: Target for IP type (IP address or domain name)\n\t\to = s.option(form.Value, 'monitor_ping_dest', _('Target IP / Domain'));\n\t\to.modalonly = true;\n\t\to.placeholder = '8.8.8.8 or www.example.com';\n\t\to.description = _('Enter an IP address or domain name. Note: Using a domain name may cause false disconnection detection if DNS resolution fails.');\n\t\to.depends({ 'monitor_method': 'ping', 'monitor_ping_type': 'ip' });\n\n\t\t// monitor_ping_ip_version: IP version for Gateway/DNS type\n\t\to = s.option(form.ListValue, 'monitor_ping_ip_version', _('IP Version'));\n\t\to.modalonly = true;\n\t\to.value('4', 'IPv4');\n\t\to.value('6', 'IPv6');\n\t\to.default = '4';\n\t\to.depends({ 'monitor_method': 'ping', 'monitor_ping_type': 'gateway' });\n\t\to.depends({ 'monitor_method': 'ping', 'monitor_ping_type': 'dns' });\n\n\t\t// ============= Curl Method Parameters =============\n\t\t// monitor_http_url: URL for curl method\n\t\to = s.option(form.Value, 'monitor_http_url', _('URL'));\n\t\to.modalonly = true;\n\t\to.placeholder = 'http://www.example.com';\n\t\to.default = 'http://www.baidu.com';\n\t\to.depends('monitor_method', 'curl');\n\n\t\t// ============= Common Parameters =============\n\t\to = s.option(form.Value, 'monitor_interval', _('Check Interval (seconds)'));\n\t\to.modalonly = true;\n\t\to.datatype = 'uinteger';\n\t\to.default = '15';\n\t\to.placeholder = '15';\n\n\t\to = s.option(form.Value, 'monitor_threshold', _('Failure Threshold'));\n\t\to.modalonly = true;\n\t\to.datatype = 'uinteger';\n\t\to.default = '3';\n\t\to.placeholder = '3';\n\t\to.description = _('Number of consecutive failures before triggering actions');\n\n\t\t// ============= Action Selection =============\n\t\to = s.option(form.MultiValue, 'monitor_action', _('Actions'));\n\t\to.modalonly = true;\n\t\tObject.keys(actionTypes).forEach(function(key) {\n\t\t\to.value(key, _(actionTypes[key].name));\n\t\t});\n\t\to.description = _('Actions to perform when monitor threshold is reached');\n\n\t\t// ============= Action Parameters =============\n\t\t// AT Commands for send_at_commands action\n\t\to = s.option(form.DynamicList, 'at_command', _('AT Commands'));\n\t\to.modalonly = true;\n\t\to.placeholder = 'AT+CFUN=1,1';\n\t\to.description = _('AT commands to send when action is triggered');\n\t\to.depends({ 'monitor_action': /send_at_commands/ });\n\n\t\t// Scripts for run_scripts action\n\t\to = s.option(form.DynamicList, 'script', _('Script Paths'));\n\t\to.modalonly = true;\n\t\to.placeholder = '/usr/share/qmodem/user_scripts/my_script.sh';\n\t\to.description = _('Scripts to execute when action is triggered. You can upload scripts in the User Scripts Management section above.');\n\t\to.depends({ 'monitor_action': /run_scripts/ });\n\t\t\n\t\t// Add uploaded scripts as datalist suggestions\n\t\tif (self.userScripts && self.userScripts.length > 0) {\n\t\t\tself.userScripts.forEach(function(script) {\n\t\t\t\to.value(USER_SCRIPTS_PATH + '/' + script.name);\n\t\t\t});\n\t\t}\n\n\t\treturn m.render();\n\t},\n\n\tupdateScriptList: function() {\n\t\tvar self = this;\n\t\tvar listContainer = document.getElementById('user-scripts-list');\n\t\tif (!listContainer) return;\n\t\t\n\t\tlistContainer.innerHTML = '';\n\t\tvar scripts = this.userScripts || [];\n\t\t\n\t\tif (scripts.length === 0) {\n\t\t\tlistContainer.appendChild(E('em', {}, _('No scripts uploaded yet')));\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tscripts.forEach(function(script) {\n\t\t\tvar item = E('div', { 'class': 'script-item', 'style': 'display: flex; align-items: center; padding: 5px 0; border-bottom: 1px solid #eee;' }, [\n\t\t\t\tE('span', { 'style': 'flex: 1; font-family: monospace;' }, USER_SCRIPTS_PATH + '/' + script.name),\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'cbi-button cbi-button-negative',\n\t\t\t\t\t'style': 'margin-left: 10px;',\n\t\t\t\t\t'data-script': script.name,\n\t\t\t\t\t'click': ui.createHandlerFn(self, function(ev) {\n\t\t\t\t\t\tvar scriptName = ev.target.getAttribute('data-script');\n\t\t\t\t\t\tvar scriptPath = USER_SCRIPTS_PATH + '/' + scriptName;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (!confirm(_('Are you sure you want to delete this script?') + '\\n' + scriptPath)) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tfs.remove(scriptPath).then(function() {\n\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Script deleted successfully: ') + scriptName));\n\t\t\t\t\t\t\treturn listUserScripts();\n\t\t\t\t\t\t}).then(function(scripts) {\n\t\t\t\t\t\t\tself.userScripts = scripts;\n\t\t\t\t\t\t\tself.updateScriptList();\n\t\t\t\t\t\t}).catch(function(err) {\n\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to delete script: ') + (err.message || err)), 'error');\n\t\t\t\t\t\t});\n\t\t\t\t\t})\n\t\t\t\t}, _('Delete'))\n\t\t\t]);\n\t\t\tlistContainer.appendChild(item);\n\t\t});\n\t},\n\n\tupdateRcStatus: function() {\n\t\tvar self = this;\n\t\treturn callRcStatus('qmodem_monitor').then(function(result) {\n\t\t\tself.rcStatusData = result;\n\t\t\tvar status = result && result.qmodem_monitor ? result.qmodem_monitor : null;\n\t\t\t\n\t\t\t// Update status display\n\t\t\tvar statusContainer = document.getElementById('rc-status-container');\n\t\t\tif (statusContainer && status) {\n\t\t\t\tvar enabled = status.enabled === true || status.enabled === 'true';\n\t\t\t\tvar running = status.running === true || status.running === 'true';\n\t\t\t\t\n\t\t\t\tstatusContainer.innerHTML = '';\n\t\t\t\tstatusContainer.appendChild(E('span', {}, _('Enabled') + ': ' + (enabled ? _('Yes') : _('No'))));\n\t\t\t\tstatusContainer.appendChild(E('span', { 'style': 'margin-left: 12px;' }, _('Running') + ': ' + (running ? _('Yes') : _('No'))));\n\t\t\t}\n\t\t\t\n\t\t\t// Update control buttons\n\t\t\tvar controlContainer = document.getElementById('rc-control-container');\n\t\t\tif (controlContainer && status) {\n\t\t\t\tvar enabled = status.enabled === true || status.enabled === 'true';\n\t\t\t\tvar running = status.running === true || status.running === 'true';\n\t\t\t\t\n\t\t\t\tcontrolContainer.innerHTML = '';\n\t\t\t\tvar buttons = [];\n\t\t\t\t\n\t\t\t\t// Running control\n\t\t\t\tif (!running) {\n\t\t\t\t\tbuttons.push(\n\t\t\t\t\t\tE('button', {\n\t\t\t\t\t\t\t'class': 'cbi-button cbi-button-action',\n\t\t\t\t\t\t\t'id': 'rc-start-button',\n\t\t\t\t\t\t\t'click': ui.createHandlerFn(self, function() {\n\t\t\t\t\t\t\t\treturn callInitAction('qmodem_monitor', 'start')\n\t\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Monitor service started successfully')));\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to start monitor: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}, _('Start'))\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tbuttons.push(\n\t\t\t\t\t\tE('button', {\n\t\t\t\t\t\t\t'class': 'cbi-button cbi-button-reset',\n\t\t\t\t\t\t\t'id': 'rc-stop-button',\n\t\t\t\t\t\t\t'click': ui.createHandlerFn(self, function() {\n\t\t\t\t\t\t\t\treturn callInitAction('qmodem_monitor', 'stop')\n\t\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Monitor service stopped successfully')));\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to stop monitor: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}, _('Stop'))\n\t\t\t\t\t);\n\t\t\t\t\tbuttons.push(\n\t\t\t\t\t\tE('button', {\n\t\t\t\t\t\t\t'class': 'cbi-button cbi-button-apply',\n\t\t\t\t\t\t\t'id': 'rc-restart-button',\n\t\t\t\t\t\t\t'style': 'margin-left: 8px;',\n\t\t\t\t\t\t\t'click': ui.createHandlerFn(self, function() {\n\t\t\t\t\t\t\t\treturn callInitAction('qmodem_monitor', 'restart')\n\t\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Monitor service restarted successfully')));\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to restart monitor: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}, _('Restart'))\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tbuttons.push(E('span', { 'style': 'margin: 0 8px;' }, ' | '));\n\n\t\t\t\t// Enabled control\n\t\t\t\tif (!enabled) {\n\t\t\t\t\tbuttons.push(\n\t\t\t\t\t\tE('button', {\n\t\t\t\t\t\t\t'class': 'cbi-button cbi-button-apply',\n\t\t\t\t\t\t\t'id': 'rc-enable-button',\n\t\t\t\t\t\t\t'click': ui.createHandlerFn(self, function() {\n\t\t\t\t\t\t\t\treturn callInitAction('qmodem_monitor', 'enable')\n\t\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Monitor service enabled successfully')));\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to enable monitor: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}, _('Enable'))\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tbuttons.push(\n\t\t\t\t\t\tE('button', {\n\t\t\t\t\t\t\t'class': 'cbi-button cbi-button-negative',\n\t\t\t\t\t\t\t'id': 'rc-disable-button',\n\t\t\t\t\t\t\t'click': ui.createHandlerFn(self, function() {\n\t\t\t\t\t\t\t\treturn callInitAction('qmodem_monitor', 'disable')\n\t\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Monitor service disabled successfully')));\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to disable monitor: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}, _('Disable'))\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tbuttons.forEach(function(btn) {\n\t\t\t\t\tcontrolContainer.appendChild(btn);\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t}\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-monitor/po/templates/qmodem-monitor.pot",
    "content": "# Translation template for luci-app-qmodem-monitor\n\nmsgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\n#: view/qmodem/monitor.js\nmsgid \"QModem Monitor Configuration\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Configure monitoring methods and actions for modem connectivity.\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Global Monitor Settings\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Enable Monitor (Global)\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Service Control\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Monitor service started\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Monitor service stopped\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Monitor service restarted\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Failed to start monitor: \"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Failed to stop monitor: \"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Failed to restart monitor: \"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Modem Monitor Configuration\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Monitor Configuration\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Modem\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Enable\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Method\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Actions\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Monitor Method\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Ping\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Ping target to check connectivity\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"HTTP Request\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"HTTP request to check connectivity\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Ping Type\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"IP Address / Domain\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Target IP / Domain\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Enter an IP address or domain name. Note: Using a domain name may cause false disconnection detection if DNS resolution fails.\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Gateway\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"DNS Server\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Target IP\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"IP Version\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"URL\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Check Interval (seconds)\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Failure Threshold\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Number of consecutive failures before triggering actions\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Switch SIM Slot\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Switch to another SIM slot\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Send AT Commands\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Send AT commands to modem\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Run Scripts\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Run custom scripts\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"AT Commands\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"AT commands to send when action is triggered\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Script Paths\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Scripts to execute when action is triggered\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Scripts to execute when action is triggered. You can upload scripts in the User Scripts Management section above.\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Actions to perform when monitor threshold is reached\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"User Scripts Management\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Security Warning\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"User scripts run with root privileges. Only upload scripts from trusted sources. Malicious scripts can damage your system or compromise security. Review script contents before uploading.\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Upload Script\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Please select a file to upload\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Invalid file type. Only .sh, .py, and .lua files are allowed.\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Script uploaded successfully: \"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Failed to upload script: \"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Upload\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Scripts will be uploaded to \"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \". Allowed types: .sh, .py, .lua\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Uploaded Scripts\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"No scripts uploaded yet\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Delete\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Are you sure you want to delete this script?\"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Script deleted successfully: \"\nmsgstr \"\"\n\n#: view/qmodem/monitor.js\nmsgid \"Failed to delete script: \"\nmsgstr \"\"\n\n#: menu\nmsgid \"Monitor\"\nmsgstr \"\"\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-monitor/po/zh_Hans/qmodem-monitor.po",
    "content": "# Chinese Simplified translation for luci-app-qmodem-monitor\n\nmsgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\n#: view/qmodem/monitor.js\nmsgid \"QModem Monitor Configuration\"\nmsgstr \"QModem 监控配置\"\n\n#: view/qmodem/monitor.js\nmsgid \"Configure monitoring methods and actions for modem connectivity.\"\nmsgstr \"配置调制解调器连接的监控方式和动作。\"\n\n#: view/qmodem/monitor.js\nmsgid \"Global Monitor Settings\"\nmsgstr \"全局监控设置\"\n\n#: view/qmodem/monitor.js\nmsgid \"Enable Monitor (Global)\"\nmsgstr \"启用监控（全局）\"\n\n#: view/qmodem/monitor.js\nmsgid \"Service Control\"\nmsgstr \"服务控制\"\n\n#: view/qmodem/monitor.js\nmsgid \"Monitor service started\"\nmsgstr \"监控服务已启动\"\n\n#: view/qmodem/monitor.js\nmsgid \"Monitor service started successfully\"\nmsgstr \"监控服务启动成功\"\n\n#: view/qmodem/monitor.js\nmsgid \"Monitor service stopped\"\nmsgstr \"监控服务已停止\"\n\n#: view/qmodem/monitor.js\nmsgid \"Monitor service stopped successfully\"\nmsgstr \"监控服务停止成功\"\n\n#: view/qmodem/monitor.js\nmsgid \"Monitor service restarted\"\nmsgstr \"监控服务已重启\"\n\n#: view/qmodem/monitor.js\nmsgid \"Monitor service restarted successfully\"\nmsgstr \"监控服务重启成功\"\n\n#: view/qmodem/monitor.js\nmsgid \"Monitor service enabled successfully\"\nmsgstr \"监控服务启用成功\"\n\n#: view/qmodem/monitor.js\nmsgid \"Monitor service disabled successfully\"\nmsgstr \"监控服务禁用成功\"\n\n#: view/qmodem/monitor.js\nmsgid \"Failed to enable monitor: \"\nmsgstr \"启用监控失败：\"\n\n#: view/qmodem/monitor.js\nmsgid \"Failed to disable monitor: \"\nmsgstr \"禁用监控失败：\"\n\n#: view/qmodem/monitor.js\nmsgid \"Failed to start monitor: \"\nmsgstr \"启动监控失败：\"\n\n#: view/qmodem/monitor.js\nmsgid \"Failed to stop monitor: \"\nmsgstr \"停止监控失败：\"\n\n#: view/qmodem/monitor.js\nmsgid \"Failed to restart monitor: \"\nmsgstr \"重启监控失败：\"\n\n#: view/qmodem/monitor.js\nmsgid \"Modem Monitor Configuration\"\nmsgstr \"调制解调器监控配置\"\n\n#: view/qmodem/monitor.js\nmsgid \"Monitor Configuration\"\nmsgstr \"监控配置\"\n\n#: view/qmodem/monitor.js\nmsgid \"Modem\"\nmsgstr \"调制解调器\"\n\n#: view/qmodem/monitor.js\nmsgid \"Enable\"\nmsgstr \"启用\"\n\n#: view/qmodem/monitor.js\nmsgid \"Method\"\nmsgstr \"监控方式\"\n\n#: view/qmodem/monitor.js\nmsgid \"Actions\"\nmsgstr \"动作\"\n\n#: view/qmodem/monitor.js\nmsgid \"Monitor Method\"\nmsgstr \"监控方式\"\n\n#: view/qmodem/monitor.js\nmsgid \"Ping\"\nmsgstr \"Ping\"\n\n#: view/qmodem/monitor.js\nmsgid \"Ping target to check connectivity\"\nmsgstr \"Ping目标以检查连接性\"\n\n#: view/qmodem/monitor.js\nmsgid \"HTTP Request\"\nmsgstr \"HTTP请求\"\n\n#: view/qmodem/monitor.js\nmsgid \"HTTP request to check connectivity\"\nmsgstr \"HTTP请求以检查连接性\"\n\n#: view/qmodem/monitor.js\nmsgid \"Ping Type\"\nmsgstr \"Ping类型\"\n\n#: view/qmodem/monitor.js\nmsgid \"IP Address / Domain\"\nmsgstr \"IP地址 / 域名\"\n\n#: view/qmodem/monitor.js\nmsgid \"Target IP / Domain\"\nmsgstr \"目标IP / 域名\"\n\n#: view/qmodem/monitor.js\nmsgid \"Enter an IP address or domain name. Note: Using a domain name may cause false disconnection detection if DNS resolution fails.\"\nmsgstr \"输入IP地址或域名。注意：使用域名时，如果DNS解析失败可能会被误判为断网。\"\n\n#: view/qmodem/monitor.js\nmsgid \"Gateway\"\nmsgstr \"网关\"\n\n#: view/qmodem/monitor.js\nmsgid \"DNS Server\"\nmsgstr \"DNS服务器\"\n\n#: view/qmodem/monitor.js\nmsgid \"Target IP\"\nmsgstr \"目标IP\"\n\n#: view/qmodem/monitor.js\nmsgid \"IP Version\"\nmsgstr \"IP版本\"\n\n#: view/qmodem/monitor.js\nmsgid \"URL\"\nmsgstr \"URL\"\n\n#: view/qmodem/monitor.js\nmsgid \"Check Interval (seconds)\"\nmsgstr \"检查间隔（秒）\"\n\n#: view/qmodem/monitor.js\nmsgid \"Failure Threshold\"\nmsgstr \"失败阈值\"\n\n#: view/qmodem/monitor.js\nmsgid \"Number of consecutive failures before triggering actions\"\nmsgstr \"触发动作前的连续失败次数\"\n\n#: view/qmodem/monitor.js\nmsgid \"Switch SIM Slot\"\nmsgstr \"切换SIM卡槽\"\n\n#: view/qmodem/monitor.js\nmsgid \"Switch to another SIM slot\"\nmsgstr \"切换到另一个SIM卡槽\"\n\n#: view/qmodem/monitor.js\nmsgid \"Send AT Commands\"\nmsgstr \"发送AT命令\"\n\n#: view/qmodem/monitor.js\nmsgid \"Send AT commands to modem\"\nmsgstr \"向调制解调器发送AT命令\"\n\n#: view/qmodem/monitor.js\nmsgid \"Run Scripts\"\nmsgstr \"运行脚本\"\n\n#: view/qmodem/monitor.js\nmsgid \"Run custom scripts\"\nmsgstr \"运行自定义脚本\"\n\n#: view/qmodem/monitor.js\nmsgid \"AT Commands\"\nmsgstr \"AT命令\"\n\n#: view/qmodem/monitor.js\nmsgid \"AT commands to send when action is triggered\"\nmsgstr \"触发动作时发送的AT命令\"\n\n#: view/qmodem/monitor.js\nmsgid \"Script Paths\"\nmsgstr \"脚本路径\"\n\n#: view/qmodem/monitor.js\nmsgid \"Scripts to execute when action is triggered\"\nmsgstr \"触发动作时执行的脚本\"\n\n#: view/qmodem/monitor.js\nmsgid \"Actions to perform when monitor threshold is reached\"\nmsgstr \"达到监控阈值时执行的动作\"\n\n#: menu\nmsgid \"Monitor\"\nmsgstr \"监控\"\n\n#: view/qmodem/monitor.js\nmsgid \"Monitor Service\"\nmsgstr \"监控服务\"\n\n#: view/qmodem/monitor.js\nmsgid \"Failed to load status\"\nmsgstr \"加载状态失败\"\n\n#: view/qmodem/monitor.js\nmsgid \"Enabled\"\nmsgstr \"已启用\"\n\n#: view/qmodem/monitor.js\nmsgid \"Running\"\nmsgstr \"运行中\"\n\n#: view/qmodem/monitor.js\nmsgid \"Yes\"\nmsgstr \"是\"\n\n#: view/qmodem/monitor.js\nmsgid \"No\"\nmsgstr \"否\"\n\n#: view/qmodem/monitor.js\nmsgid \"Start\"\nmsgstr \"启动\"\n\n#: view/qmodem/monitor.js\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n#: view/qmodem/monitor.js\nmsgid \"Restart\"\nmsgstr \"重启\"\n\n#: view/qmodem/monitor.js\nmsgid \"Enable\"\nmsgstr \"启用\"\n\n#: view/qmodem/monitor.js\nmsgid \"Disable\"\nmsgstr \"禁用\"\n\n#: view/qmodem/monitor.js\nmsgid \"User Scripts Management\"\nmsgstr \"用户脚本管理\"\n\n#: view/qmodem/monitor.js\nmsgid \"Security Warning\"\nmsgstr \"安全警告\"\n\n#: view/qmodem/monitor.js\nmsgid \"User scripts run with root privileges. Only upload scripts from trusted sources. Malicious scripts can damage your system or compromise security. Review script contents before uploading.\"\nmsgstr \"用户脚本将以root权限运行。请仅上传来自可信来源的脚本。恶意脚本可能会损坏您的系统或危及安全。上传前请仔细检查脚本内容。\"\n\n#: view/qmodem/monitor.js\nmsgid \"Upload Script\"\nmsgstr \"上传脚本\"\n\n#: view/qmodem/monitor.js\nmsgid \"Please select a file to upload\"\nmsgstr \"请选择要上传的文件\"\n\n#: view/qmodem/monitor.js\nmsgid \"Invalid file type. Only .sh, .py, and .lua files are allowed.\"\nmsgstr \"无效的文件类型。仅允许上传 .sh、.py 和 .lua 文件。\"\n\n#: view/qmodem/monitor.js\nmsgid \"Script uploaded successfully: \"\nmsgstr \"脚本上传成功：\"\n\n#: view/qmodem/monitor.js\nmsgid \"Failed to upload script: \"\nmsgstr \"脚本上传失败：\"\n\n#: view/qmodem/monitor.js\nmsgid \"Upload\"\nmsgstr \"上传\"\n\n#: view/qmodem/monitor.js\nmsgid \"Scripts will be uploaded to \"\nmsgstr \"脚本将上传至 \"\n\n#: view/qmodem/monitor.js\nmsgid \". Allowed types: .sh, .py, .lua\"\nmsgstr \"。允许的类型：.sh、.py、.lua\"\n\n#: view/qmodem/monitor.js\nmsgid \"Uploaded Scripts\"\nmsgstr \"已上传的脚本\"\n\n#: view/qmodem/monitor.js\nmsgid \"No scripts uploaded yet\"\nmsgstr \"暂无已上传的脚本\"\n\n#: view/qmodem/monitor.js\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: view/qmodem/monitor.js\nmsgid \"Are you sure you want to delete this script?\"\nmsgstr \"确定要删除此脚本吗？\"\n\n#: view/qmodem/monitor.js\nmsgid \"Script deleted successfully: \"\nmsgstr \"脚本删除成功：\"\n\n#: view/qmodem/monitor.js\nmsgid \"Failed to delete script: \"\nmsgstr \"脚本删除失败：\"\n\n#: view/qmodem/monitor.js\nmsgid \"Scripts to execute when action is triggered. You can upload scripts in the User Scripts Management section above.\"\nmsgstr \"触发动作时要执行的脚本。您可以在上方的用户脚本管理部分上传脚本。\"\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-monitor/root/usr/share/luci/menu.d/luci-app-qmodem-monitor.json",
    "content": "{\n\t\"admin/modem/qmodem/monitor\": {\n\t\t\"title\": \"Monitor\",\n\t\t\"order\": 7,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"qmodem/monitor\"\n\t\t},\n\t\t\"depends\": {\n\t\t\t\"acl\": [ \"luci-app-qmodem-monitor\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-monitor/root/usr/share/rpcd/acl.d/luci-app-qmodem-monitor.json",
    "content": "{\n\t\"luci-app-qmodem-monitor\": {\n\t\t\"description\": \"Grant access to QModem Monitor application\",\n\t\t\"read\": {\n\t\t\t\"ubus\": {\n\t\t\t\t\"rc\": [ \"list\", \"init\" ],\n\t\t\t\t\"file\": [ \"list\", \"stat\", \"read\" ],\n\t\t\t\t\"luci\": [ \"getFeatures\" ]\n\t\t\t},\n\t\t\t\"uci\": [ \"qmodem\" ],\n\t\t\t\"file\": {\n\t\t\t\t\"/usr/share/qmodem/user_scripts/*\": [ \"read\" ]\n\t\t\t}\n\t\t},\n\t\t\"write\": {\n\t\t\t\"ubus\": {\n\t\t\t\t\"luci\": [ \"setInitAction\" ],\n\t\t\t\t\"file\": [ \"write\", \"remove\" ]\n\t\t\t},\n\t\t\t\"uci\": [ \"qmodem\" ],\n\t\t\t\"file\": {\n\t\t\t\t\"/usr/share/qmodem/user_scripts\": [ \"write\" ],\n\t\t\t\t\"/usr/share/qmodem/user_scripts/*\": [ \"write\", \"remove\" ],\n\t\t\t\t\"/bin/mkdir\": [ \"exec\" ],\n\t\t\t\t\"/bin/chmod\": [ \"exec\" ]\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-mwan/Makefile",
    "content": "# Copyright (C) 2023 Siriling <siriling@qq.com>\n# This is free software, licensed under the GNU General Public License v3.\n\ninclude $(TOPDIR)/rules.mk\n\n# Include unified version\ninclude ../../version.mk\n\nPKG_NAME:=luci-app-qmodem-mwan\nLUCI_TITLE:=Luci qwrt modem mwan support\nLUCI_PKGARCH:=all\nPKG_VERSION:=$(QMODEM_VERSION)\nPKG_LICENSE:=GPLv3\nPKG_LINCESE_FILES:=LICENSE\nPKG_MAINTAINER:=Tom <fjrcn@outlook.com>\nLUCI_DEPENDS:=+luci-app-qmodem +luci-app-mwan3\n\t\t\n\ndefine Package/luci-app-qmodem-mwan/conffiles\n/etc/config/modem_mwan\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-mwan/luasrc/controller/qmodem_mwan.lua",
    "content": "module(\"luci.controller.qmodem_mwan\", package.seeall)\n\nfunction index()\n    if not nixio.fs.access(\"/etc/config/qmodem_mwan\") then\n        return\n    end\n\t--mwan配置\n\tentry({\"admin\", \"modem\", \"qmodem\", \"mwan_config\"}, cbi(\"qmodem/mwan_config\"), luci.i18n.translate(\"Mwan Config\"), 21).leaf = true\nend\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-mwan/luasrc/model/cbi/qmodem/mwan_config.lua",
    "content": "\n\nlocal d = require \"luci.dispatcher\"\nlocal uci = luci.model.uci.cursor()\nlocal sys  = require \"luci.sys\"\nlocal script_path=\"/usr/share/qmodem/\"\n\nm = Map(\"qmodem_mwan\")\nm.title = translate(\"Mwan Config\")\nm.description = translate(\"Check and modify the mwan configuration\")\ns = m:section(NamedSection, \"global\", \"global\")\ns.anonymous = true\ns.addremove = false\nenable_mwan = s:option(Flag, \"enable_mwan\", translate(\"Enable MWAN\"))\nsticky = s:option(Flag,\"sticky_mode\",translate(\"sticky mode\"))\nsticky.default = 0\nsticky.description = translate(\"same source ip address will always use the same wan interface\")\nsticky_timeout = s:option(Value,\"sticky_timeout\",translate(\"sticky timeout\"))\nsticky_timeout.default = 300\nsticky_timeout.datatype = \"uinteger\"\nsticky_timeout:depends(\"sticky_mode\",1)\n\ns = m:section(TypedSection, \"ipv4\", translate(\"IPV4 Config\"))\ns.anonymous = true\ns.addremove = true\ns.template = \"cbi/tblsection\"\nmember_interface = s:option(Value, \"member_interface\", translate(\"Interface\"))\nmember_interface.rmempty = true\nuci:foreach(\"network\", \"interface\", function(s)\n    if s[\".name\"] ~= \"loopback\" and s[\".name\"] ~= \"lan\" then\n        member_interface:value(s[\".name\"])\n    end\nend)\n\n\no = s:option(DynamicList, 'member_track_ip', translate('Track IP'))\no.datatype = 'host'\nmember_priority = s:option(Value, \"member_priority\", translate(\"Priority\"))\nmember_priority.rmempty = true\nmember_priority.datatype = \"range(1, 255)\"\nmember_priority.default = 1\nmember_priority.description = translate(\"Set the priority for the load balancing member. A higher priority value gives precedence to this member when distributing traffic. The range is from 1 to 255. 1 is the highest priority\")\n\n-- member_priority:depends(\"member_interface\", \"\")\n\nmember_weight = s:option(Value, \"member_weight\", translate(\"Weight\"))\nmember_weight.rmempty = true\nmember_weight.datatype = \"range(1, 255)\"\nmember_weight.default = 1\nmember_weight.description = translate(\"Set the weight for the load balancing member. A higher weight means more traffic will be assigned to this member. The default value is 1, with a range from 1 to 255.\")\n-- member_weight:depends(\"member_interface\", \"\")\n\n\nreturn m\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-mwan/po/zh_Hans/modem_mwan.po",
    "content": "#model/modem_mwan.lua\nmsgid \"same source ip address will always use the same wan interface\"\nmsgstr \"相同的源IP地址将在一定时间内始终使用相同的WAN接口\"\n\nmsgid \"Check and modify the mwan configuration\"\nmsgstr \"检查和修改mwan配置\"\n\nmsgid \"sticky mode\"\nmsgstr \"粘性模式\"\n\nmsgid \"sticky timeout\"\nmsgstr \"粘性超时\"\n\nmsgid \"Track IP\"\nmsgstr \"跟踪IP\"\n\nmsgid \"Interface\"\nmsgstr \"成员接口\"\n\nmsgid \"Priority\"\nmsgstr \"成员优先级\"\n\nmsgid \"Weight\"\nmsgstr \"成员权重\"\n\nmsgid \"Mwan Config\"\nmsgstr \"多WAN配置\"\n\nmsgid \"IPV4 Config\"\nmsgstr \"IPV4配置\"\n\nmsgid \"Enable MWAN\"\nmsgstr \"启用MWAN\"\n\nmsgid \"Set the weight for the load balancing member. A higher weight means more traffic will be assigned to this member. The default value is 1, with a range from 1 to 255.\"\nmsgstr \"设置负载均衡成员的权重。权重越高，该成员被分配到的流量越多。默认值为1，范围为1到255。\"\n\nmsgid \"Set the priority for the load balancing member. A higher priority value gives precedence to this member when distributing traffic. The range is from 1 to 255. 1 is the highest priority\"\nmsgstr \"设置负载均衡成员的优先级。当分发流量时，优先级值越高，该成员越优先。范围是1到255。1是最高优先级。\"\n\nmsgid \"Priority determines the order of member selection, while weight determines the traffic distribution ratio among members with the same priority.\"\nmsgstr \"优先级决定成员选择的顺序，而权重决定具有相同优先级的成员之间流量分配比率。\"\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-mwan/root/etc/config/qmodem_mwan",
    "content": "config ipv4\n\tlist member_track_ip 'test.ustc.edu.cn'\n\tlist member_track_ip 'cip.cc'\n\tlist member_track_ip '208.67.222.222'\n\tlist member_track_ip '208.67.220.220'\n\tlist member_interface 'wan'\n\toption member_priority '10'\n\toption member_weight '1'\n\nconfig global 'global'\n        option enable_mwan '1'\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-mwan/root/etc/init.d/qmodem_mwan",
    "content": "#!/bin/sh /etc/rc.common\nUSE_PROCD=1\nSTART=30\n\nstart_mwan3()\n{\n    proto=$1\n    logger -t modem_mwan \"before set $proto start\"\n    /usr/share/qmodem/modem_mwan.sh $proto start\n    logger -t modem_mwan \"set $proto start\"\n\n}\n\nstart_service() {\n    logger -t modem_mwan \"start qmodem_mwan\"\n\tconfig_load qmodem_mwan\n    config_get enable global enable_mwan 0\n    if [ \"$enable\" -eq 0 ]; then\n        stop_service\n        return\n    fi\n    start_mwan3 ipv4\n}\n\nstop_service() {\n    /usr/share/qmodem/modem_mwan.sh ipv4 stop\n    /etc/init.d/mwan3 stop\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger 'qmodem_mwan'\n}\n\nreload_service() {\n    stop\n    start\n}\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-mwan/root/etc/uci-defaults/99-setup-mwan",
    "content": "#!/bin/sh\n\n. /lib/functions.sh\n. /lib/functions/uci-defaults.sh\n. /lib/functions/system.sh\n\nmodem_settings()\n{\n\tlocal board=\"$1\"\n\n\tcase $board in\n\tHC,HC-G80)\n\t\tadd_ipv4_config \"1_1_1\" 2 1\n\t\tadd_ipv4_config \"1_1_4\" 2 1\n\t\tadd_ipv4_config \"2_1\" 1 1\n\t\tuci commit qmodem_mwan\n\t\t;;\n\tailf,gs2410)\n\t\tadd_ipv4_config \"5g0\"  1 1\n\t\tadd_ipv4_config \"5g1\" 1 1\n\t\tadd_ipv4_config \"4g0\" 30 1\n\t\tadd_ipv4_config \"4g1\" 30 1\n\t\tadd_ipv4_config \"4g2\" 30 1\n\t\tadd_ipv4_config \"4g3\" 30 1\n\t\tuci commit qmodem_mwan\n\t\t;;\n\thuasifei,ws3006)\n\t\tadd_ipv4_config \"5g0\"  10 1\n\t\tadd_ipv4_config \"5g1\" 10 1\n\t\tadd_ipv4_config \"4g0\" 10 1\n\t\tadd_ipv4_config \"4g1\" 10 1\n\t\tadd_ipv4_config \"4g2\" 10 1\n\t\tadd_ipv4_config \"4g3\" 10 1\n\t\tuci commit qmodem_mwan\n\t\t;;\n\t\n\tesac\n}\n\n\nadd_ipv4_config(){\n\tlocal interface_name=\"$1\"\n\tcfg=$(uci add qmodem_mwan ipv4)\nuci batch<<-EOF >/dev/null\nset qmodem_mwan.$cfg.member_interface=$interface_name\nset qmodem_mwan.$cfg.member_priority=$2\nset qmodem_mwan.$cfg.member_weight=$3\nadd_list qmodem_mwan.$cfg.member_track_ip='119.29.29.29'\nadd_list qmodem_mwan.$cfg.member_track_ip='taobao.com'\nadd_list qmodem_mwan.$cfg.member_track_ip='baidu.com'\nEOF\n}\n\n\n\n\nboard=$(board_name)\nmodem_settings $board\nexit 0\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-mwan/root/etc/uci-defaults/luci-app-modem-mwan",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@qmodem_mwan[-1]\n\tadd ucitrack qmodem_mwan\n\tset ucitrack.@qmodem_mwan[-1].init=qmodem_mwan\n\tcommit ucitrack\nEOF\n\nrm -rf /tmp/luci-*cache\nexit 0\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-mwan/root/etc/udhcpc.user.d/01-reload-mwan3.dhcpscript",
    "content": "[ \"$1\" == \"bound\" ] || exit 0\niptables -t mangle -S mwan3_hook && exit 0\n[ \"$(uci -q get mwan3.$INTERFACE)\" == \"interface\" ] && mwan3 restart\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-mwan/root/usr/share/qmodem/modem_mwan.sh",
    "content": "#! /bin/sh\n. /lib/functions.sh\n\n\n\n\n\n\nappend_if(){\n    interface=$1\n    track_ip=$2\n    uci batch <<EOF\nset mwan3.$interface=interface\nset mwan3.$interface.enabled=1\nset mwan3.$interface.family=\"$family\"\nset mwan3.$interface.track_method=ping\nset mwan3.$interface.reliability='1'\nset mwan3.$interface.count='1'\nset mwan3.$interface.size='56'\nset mwan3.$interface.max_ttl='60'\nset mwan3.$interface.timeout='4'\nset mwan3.$interface.interval='10'\nset mwan3.$interface.failure_interval='5'\nset mwan3.$interface.recovery_interval='5'\nset mwan3.$interface.down='5'\nset mwan3.$interface.up='5'\nset mwan3.$interface.keep_failure_interval='1'\nset mwan3.$interface.add_by=modem\ndelete mwan3.$interface.track_ip\nEOF\n    if [ -n \"$track_ip\" ]; then\n        for ip in $track_ip; do\n            uci add_list mwan3.$interface.track_ip=$ip\n        done\n    fi\n}\n\n\n\n\nadd_mwan3_member()\n{\n    interface=$1\n    metric=$2\n    weight=$3\n    member_name=$4\n    uci batch <<EOF\nset mwan3.$member_name=member\nset mwan3.$member_name.interface=$interface\nset mwan3.$member_name.metric=$metric\nset mwan3.$member_name.weight=$weight\nset mwan3.$member_name.add_by=modem\nEOF\n\n}\n\nremove_member()\n{\n    config_load mwan3\n    config_foreach remove_member_cb member\n}\n\nremove_member_cb()\n{\n    local add_by\n    config_get add_by $1 add_by\n    if [ \"$add_by\" = \"modem\" ]; then\n        uci delete mwan3.$1\n    fi\n}\n\nappend_mwan3_policy_member()\n{\n    uci add_list mwan3.$1.use_member=$2\n}\n\ninit_mwan3_policy()\n{\n    policy_name=$1\n    uci batch <<EOF\nset mwan3.$policy_name=policy\nset mwan3.$policy_name.last_resort='default'\nset mwan3.$policy_name.add_by=modem\ndelete mwan3.$policy_name.use_member\nEOF\n\n}\n\n\nflush_config(){\n    config_load mwan3\n    config_foreach remove_cb interface\n    config_foreach remove_cb member\n    config_foreach remove_cb policy\n    config_foreach remove_cb rule\n}\n\nremove_cb(){\n    local add_by\n    config_get add_by $1 add_by\n    if [ \"$add_by\" = \"modem\" ]; then\n        uci delete mwan3.$1\n    fi\n}\n\n\n\ngen_rule()\n{   \n    use_policy=$1\n    rule_name=${family}_rule\n    uci batch <<EOF\nset mwan3.$rule_name=rule\nset mwan3.$rule_name.family=\"$family\"\nset mwan3.$rule_name.sticky=$sticky_mode\nset mwan3.$rule_name.proto='all'\nset mwan3.$rule_name.use_policy=$use_policy\nset mwan3.$rule_name.add_by=modem\nEOF\n    if [ -n \"$sticky_timeout\" ]; then\n        uci set mwan3.$rule_name.timeout=$sticky_timeout\n    fi\n}\n\nhandle_config()\n{\n    config_get interface $1 member_interface\n    config_get priority $1 member_priority\n    config_get weight $1 member_weight\n    config_get track_ip $1 member_track_ip\n    echo $1\n    append_if $interface \"$track_ip\"\n    add_mwan3_member $interface $priority $weight m$interface\n    append_mwan3_policy_member $family m$interface\n}\n\n\n\n/etc/init.d/mwan3 stop\nflush_config\nuci commit mwan3\nconfig_load qmodem_mwan\nfamily=$1\ncase $2 in\n    \"start\")\n        config_get sticky_mode global sticky_mode 0\n        config_get sticky_timeout global sticky_timeout\n        echo $sticky_mode $sticky_timeout\n        init_mwan3_policy $family\n        config_foreach handle_config $family\n        gen_rule $family\n        ;;\n    \"stop\")\n        rule_name=${family}_rule\n        uci delete mwan3.$rule_name\n        ;;\nesac\nuci commit mwan3\n/etc/init.d/mwan3 start\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/Makefile",
    "content": "# Copyright (C) 2024 Tom <fjrcn@outlook.com>\n# This is free software, licensed under the GNU General Public License v3.\n\ninclude $(TOPDIR)/rules.mk\n\n# Include unified version\ninclude ../../version.mk\n\nLUCI_TITLE:=LuCI Modern UI for QModem(Not Support Lua Version)\nLUCI_DEPENDS:=+qmodem +luci-base +sms-forwarder-next\nCONFFILES:=luci-app-qmodem\nLUCI_PKGARCH:=all\nPKG_VERSION:=$(QMODEM_VERSION)\nPKG_RELEASE:=1\nPKG_LICENSE:=GPLv3\nPKG_MAINTAINER:=Tom <fjrcn@outlook.com>\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/htdocs/luci-static/resources/qmodem/modem_cfg.js",
    "content": "'use strict';\n'require baseclass';\n\nreturn baseclass.extend({\n\tmanufacturers: {\n\t\tgosuncn: 'GosunCN',\n\t\tquectel: 'Quectel',\n\t\tsimcom: 'Simcom',\n\t\tsierra: 'Sierra Wireless',\n\t\tfibocom: 'Fibocom',\n\t\tmeig: 'Meig',\n\t\thuawei: 'Huawei',\n\t\tneoway: 'Neoway',\n\t\ttelit: 'Telit',\n\t\tnk: \"Tom's Love\"\n\t},\n\tplatforms: {\n\t\tlte: 'LTE',\n\t\tlte12: 'LTE12',\n\t\tqualcomm: 'Qualcomm',\n\t\tmediatek: 'MediaTek',\n\t\tunisoc: 'Unisoc',\n\t\tintel: 'Intel'\n\t},\n\tmodes: {\n\t\tecm: 'ECM',\n\t\tmbim: 'MBIM',\n\t\tqmi: 'QMI',\n\t\tncm: 'NCM',\n\t\trndis: 'RNDIS'\n\t},\n\tdisabled_features: {\n\t\tDialMode: 'Dial Mode',\n\t\tRatPrefer: 'Rat Prefer',\n\t\tIMEI: 'Set IMEI',\n\t\tNeighborCell: 'Neighbor Cell',\n\t\tLockBand: 'Lock Band',\n\t\tRebootModem: 'Reboot Modem',\n\t\tAtDebug: 'AT Debug'\n\t}\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/htdocs/luci-static/resources/qmodem/qmodem-next.css",
    "content": "/* QModem Next - Additional Styles */\n\n.compat-progressbar {\n\tborder: 1px solid var(--border-color-high, var(--progressbarColor, var(--background-color)));\n\tborder-radius: 3px;\n\tposition: relative;\n\tmin-width: 170px;\n\theight: 8px;\n\tmargin: 1.4em 0 4px 0;\n\tbackground: var(--background-color-medium, var(--progressbarColor));\n}\n\n.compat-progressbar > div {\n\tbackground: var(--progressbar, var(--primary, var(--primary-color-medium)));\n\theight: 100%;\n\ttransition: width .25s ease-in;\n\twidth: 0%;\n\tborder-radius: 2px;\n}\n\n.compat-progressbar::before {\n\tposition: absolute;\n\ttop: -1.4em;\n\tleft: 0;\n\tcontent: attr(title);\n\twhite-space: pre;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n}\n\n/* Advanced Config Tab Styles */\n.cbi-tabmenu {\n\tlist-style: none;\n\tpadding: 0;\n\tmargin: 0 0 1em 0;\n\tdisplay: flex;\n\tflex-wrap: wrap;\n\tborder-bottom: 2px solid var(--border-color-medium, #cccccc);\n}\n\n.cbi-tabmenu li {\n\tpadding: 0.5rem 1rem;\n\tmargin: 0 0.25rem -2px 0;\n\tcursor: pointer;\n\tborder: 1px solid transparent;\n\tborder-radius: 4px 4px 0 0;\n\tbackground: var(--background-color-medium, #f5f5f5);\n\ttransition: all 0.2s;\n}\n\n.cbi-tabmenu li.cbi-tab {\n\tbackground: var(--background-color-high, #ffffff);\n\tborder-color: var(--border-color-medium, #cccccc);\n\tborder-bottom-color: var(--background-color-high, #ffffff);\n\tfont-weight: bold;\n\tcolor: var(--primary-color-medium, #0066cc);\n}\n\n.cbi-tabmenu li.cbi-tab-disabled {\n\tcolor: var(--text-color-secondary, #666666);\n}\n\n.cbi-tabmenu li.cbi-tab-disabled:hover {\n\tbackground: var(--background-color-high, #e8e8e8);\n\tborder-color: var(--border-color-low, #dddddd);\n}\n\n/* Dial Mode Radio Buttons and Network Preference Checkboxes */\n.cbi-value-field input[type=\"radio\"],\n.cbi-value-field input[type=\"checkbox\"] {\n\tmargin-right: 8px;\n\tcursor: pointer;\n}\n\n.cbi-value-field label {\n\tcursor: pointer;\n\tuser-select: none;\n}\n\n/* Lock Band Styles */\n.band-container {\n\tdisplay: flex;\n\talign-items: center;\n\tmargin: 5px 15px 5px 0;\n\tmin-width: 100px;\n}\n\n#lockband_content_modem h3 {\n\tcolor: var(--primary-color-medium, #0066cc);\n\tborder-bottom: 1px solid var(--border-color-low, #e0e0e0);\n\tpadding-bottom: 5px;\n}\n\n/* Neighbor Cell Table Styles */\n#neighbor_list_modem h4 {\n\tcolor: var(--primary-color-medium, #0066cc);\n\tmargin: 10px 0 5px 0;\n\tfont-size: 1em;\n\tfont-weight: bold;\n}\n\n.cbi-section-table .label {\n\tdisplay: inline-block;\n\tpadding: 2px 8px;\n\tborder-radius: 3px;\n\tfont-weight: bold;\n\tfont-size: 0.9em;\n}\n\n.cbi-section-table-row:hover {\n\tbackground-color: var(--background-color-medium, #f5f5f5);\n}\n\n/* SMS Interface Styles */\n.sms-conversations {\n\tmargin: 20px 0;\n}\n\n.sms-conversation-header {\n\tdisplay: flex;\n\talign-items: center;\n\tmargin-bottom: 10px;\n}\n\n.sms-messages-area {\n\tmax-height: 500px;\n\toverflow-y: auto;\n\tborder: 1px solid var(--border-color-medium, #cccccc);\n\tborder-radius: 4px;\n\tpadding: 15px;\n\tbackground: var(--background-color-high, #f9f9f9);\n}\n\n.sms-messages-list {\n\tdisplay: flex;\n\tflex-direction: column;\n\tgap: 10px;\n}\n\n.sms-message-wrapper {\n\tdisplay: flex;\n\twidth: 100%;\n}\n\n.sms-message-wrapper-left {\n\tjustify-content: flex-start;\n}\n\n.sms-message-wrapper-right {\n\tjustify-content: flex-end;\n}\n\n.sms-message-bubble {\n\tmax-width: 70%;\n\tpadding: 10px 15px;\n\tborder-radius: 12px;\n\tbox-shadow: 0 1px 2px rgba(0, 0, 0, 0.1);\n\tword-wrap: break-word;\n}\n\n.sms-message-received {\n\tbackground: var(--background-color-high, #ffffff);\n\tborder: 1px solid var(--border-color-low, #e0e0e0);\n\tborder-top-left-radius: 2px;\n}\n\n.sms-message-sent {\n\tbackground: var(--primary-color-medium, #0066cc);\n\tcolor: white;\n\tborder-top-right-radius: 2px;\n}\n\n.sms-message-content {\n\tmargin-bottom: 5px;\n\tline-height: 1.4;\n\twhite-space: pre-wrap;\n}\n\n.sms-message-meta {\n\tfont-size: 11px;\n\tcolor: var(--text-color-secondary, #666666);\n\tdisplay: flex;\n\talign-items: center;\n\tflex-wrap: wrap;\n}\n\n.sms-message-sent .sms-message-meta {\n\tcolor: rgba(255, 255, 255, 0.8);\n}\n\n.sms-message-time {\n\tfont-style: italic;\n}\n\n.sms-message-info {\n\tfont-size: 10px;\n\tpadding: 1px 4px;\n\tbackground: var(--background-color-medium, #f0f0f0);\n\tborder-radius: 3px;\n}\n\n.sms-message-sent .sms-message-info {\n\tbackground: rgba(255, 255, 255, 0.2);\n}\n\n.sms-message-warning {\n\tfont-size: 10px;\n\tfont-weight: bold;\n}\n\n/* Character counter colors */\n#sms-char-counter {\n\tfont-weight: bold;\n}\n\n/* Collapsible Section Styles */\n.cbi-section.collapsible > legend,\n.cbi-section.collapsible > .panel-title {\n\tcursor: pointer;\n\tuser-select: none;\n\tposition: relative;\n\tpadding-right: 30px;\n}\n\n.cbi-section.collapsible > legend::after,\n.cbi-section.collapsible > .panel-title::after {\n\tcontent: '▼';\n\tposition: absolute;\n\tright: 10px;\n\ttop: 50%;\n\ttransform: translateY(-50%);\n\tfont-size: 0.8em;\n\ttransition: transform 0.2s ease;\n}\n\n.cbi-section.collapsible.collapsed > legend::after,\n.cbi-section.collapsible.collapsed > .panel-title::after {\n\ttransform: translateY(-50%) rotate(-90deg);\n}\n\n.cbi-section.collapsible.collapsed > table,\n.cbi-section.collapsible.collapsed > div:not(.panel-title) {\n\tdisplay: none;\n}\n\n/* Draggable Section Styles */\n.cbi-section.draggable {\n\tcursor: move;\n\ttransition: box-shadow 0.2s ease;\n}\n\n.cbi-section.draggable.dragging {\n\topacity: 0.5;\n\tbox-shadow: 0 4px 8px rgba(0, 0, 0, 0.2);\n}\n\n.cbi-section.draggable.drag-over {\n\tborder-top: 3px solid var(--primary-color-medium, #0066cc);\n}\n\n.cbi-section.draggable > legend,\n.cbi-section.draggable > .panel-title {\n\tpadding-left: 30px;\n\tposition: relative;\n}\n\n.cbi-section.draggable > legend::before,\n.cbi-section.draggable > .panel-title::before {\n\tcontent: '≡';\n\tposition: absolute;\n\tleft: 10px;\n\ttop: 50%;\n\ttransform: translateY(-50%);\n\tfont-size: 1.2em;\n\tcolor: var(--text-color-secondary, #888888);\n}\n\n/* Copyright Display Styles */\n.copyright-section {\n\tbackground: var(--background-color-medium, #f9f9f9);\n\tborder: 1px solid var(--border-color-low, #e0e0e0);\n\tborder-radius: 4px;\n\tpadding: 10px 15px;\n\tmargin: 10px 0;\n\tfont-size: 0.9em;\n\tcolor: var(--text-color-secondary, #666666);\n\ttext-align: center;\n}\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/htdocs/luci-static/resources/qmodem/qmodem.js",
    "content": "'use strict';\n'require rpc';\n'require uci';\n\n// Pre-declare all RPC methods\nvar callBaseInfo = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'base_info',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callCellInfo = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'cell_info',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callInfo = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'info',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callNetworkInfo = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'network_info',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callSimInfo = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'sim_info',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callGetAtCfg = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_at_cfg',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callGetImei = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_imei',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callGetMode = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_mode',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callGetLockband = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_lockband',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callGetNeighborcell = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_neighborcell',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callGetNetworkPrefer = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_network_prefer',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callGetDns = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_dns',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callGetSms = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_sms',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callGetDisabledFeatures = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_disabled_features',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callGetRebootCaps = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_reboot_caps',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callGetCopyright = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_copyright',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callSendAt = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'send_at',\n\tparams: ['config_section', 'params'],\n\texpect: { }\n});\n\nvar callSendSms = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'send_sms',\n\tparams: ['config_section', 'params'],\n\texpect: { }\n});\n\nvar callDeleteSms = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'delete_sms',\n\tparams: ['config_section', 'index'],\n\texpect: { }\n});\n\nvar callSetMode = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'set_mode',\n\tparams: ['config_section', 'mode'],\n\texpect: { }\n});\n\nvar callSetImei = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'set_imei',\n\tparams: ['config_section', 'imei'],\n\texpect: { }\n});\n\nvar callSetLockband = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'set_lockband',\n\tparams: ['config_section', 'params'],\n\texpect: { }\n});\n\nvar callSetNeighborcell = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'set_neighborcell',\n\tparams: ['config_section', 'params'],\n\texpect: { }\n});\n\nvar callSetNetworkPrefer = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'set_network_prefer',\n\tparams: ['config_section', 'params'],\n\texpect: { }\n});\n\nvar callDoReboot = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'do_reboot',\n\tparams: ['config_section', 'params'],\n\texpect: { }\n});\n\nvar callClearDialLog = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'clear_dial_log',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callDialStatus = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'dial_status',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callGetConnectStatus = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_connect_status',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callGetDialLog = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_dial_log',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callModemDial = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'modem_dial',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callModemHang = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'modem_hang',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callModemRedial = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'modem_redial',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar getRcStatus = rpc.declare({\n\tobject: 'rc',\n\tmethod: 'list',\n\tparams: ['name'],\n\texpect: { }\n});\n\nvar callGetSimSwitchCapabilities = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_sim_switch_capabilities',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callGetSimSlot = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_sim_slot',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callSetSimSlot = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'set_sim_slot',\n\tparams: ['config_section', 'slot'],\n\texpect: { }\n});\n\nreturn L.Class.extend({\n\t// Get modem base information\n\tgetBaseInfo: function(section) {\n\t\treturn callBaseInfo(section);\n\t},\n\n\t// Get modem cell information\n\tgetCellInfo: function(section) {\n\t\treturn callCellInfo(section);\n\t},\n\n\t// Get modem general information\n\tgetInfo: function(section) {\n\t\treturn callInfo(section);\n\t},\n\n\t// Get network information\n\tgetNetworkInfo: function(section) {\n\t\treturn callNetworkInfo(section);\n\t},\n\n\t// Get SIM information\n\tgetSimInfo: function(section) {\n\t\treturn callSimInfo(section);\n\t},\n\n\t// Get AT configuration\n\tgetAtCfg: function(section) {\n\t\treturn callGetAtCfg(section);\n\t},\n\n\t// Get IMEI\n\tgetImei: function(section) {\n\t\treturn callGetImei(section);\n\t},\n\n\t// Get current mode\n\tgetMode: function(section) {\n\t\treturn callGetMode(section);\n\t},\n\n\t// Get lock band configuration\n\tgetLockBand: function(section) {\n\t\treturn callGetLockband(section);\n\t},\n\n\t// Get neighbor cell info\n\tgetNeighborCell: function(section) {\n\t\treturn callGetNeighborcell(section);\n\t},\n\n\t// Get network preference\n\tgetNetworkPrefer: function(section) {\n\t\treturn callGetNetworkPrefer(section);\n\t},\n\n\t// Get DNS servers\n\tgetDns: function(section) {\n\t\treturn callGetDns(section);\n\t},\n\n\t// Get SMS messages\n\tgetSms: function(section) {\n\t\treturn callGetSms(section);\n\t},\n\n\t// Get disabled features\n\tgetDisabledFeatures: function(section) {\n\t\treturn callGetDisabledFeatures(section);\n\t},\n\n\t// Get reboot capabilities\n\tgetRebootCaps: function(section) {\n\t\treturn callGetRebootCaps(section);\n\t},\n\n\t// Get copyright information\n\tgetCopyright: function(section) {\n\t\treturn callGetCopyright(section);\n\t},\n\n\t// Send AT command\n\tsendAt: function(section, port, command, use_ubus) {\n\t\tvar params = {\n\t\t\tport: port,\n\t\t\tat: command\n\t\t};\n\t\t\n\t\tif (use_ubus !== undefined && use_ubus !== null) {\n\t\t\tparams.use_ubus = use_ubus;\n\t\t}\n\t\t\n\t\treturn callSendAt(section, params);\n\t},\n\n\t// Send SMS\n\tsendSms: function(section, phoneNumber, content) {\n\t\treturn callSendSms(section, {\n\t\t\tphone_number: phoneNumber,\n\t\t\tmessage_content: content\n\t\t});\n\t},\n\n\t// Delete SMS\n\tdeleteSms: function(section, index) {\n\t\treturn callDeleteSms(section, index);\n\t},\n\n\t// Set mode\n\tsetMode: function(section, mode) {\n\t\treturn callSetMode(section, mode);\n\t},\n\n\t// Set IMEI\n\tsetImei: function(section, imei) {\n\t\treturn callSetImei(section, imei);\n\t},\n\n\t// Set lock band\n\tsetLockBand: function(section, params) {\n\t\treturn callSetLockband(section, params);\n\t},\n\n\t// Set neighbor cell\n\tsetNeighborCell: function(section, params) {\n\t\treturn callSetNeighborcell(section, params);\n\t},\n\n\t// Set network preference\n\tsetNetworkPrefer: function(section, params) {\n\t\treturn callSetNetworkPrefer(section, params);\n\t},\n\n\t// Reboot modem\n\tdoReboot: function(section, method) {\n\t\treturn callDoReboot(section, {\n\t\t\tmethod: method || 'soft'\n\t\t});\n\t},\n\n\t// Clear dial log\n\tclearDialLog: function(section) {\n\t\treturn callClearDialLog(section);\n\t},\n\n\t// Get dial status\n\tgetDialStatus: function(section) {\n\t\treturn callDialStatus(section);\n\t},\n\n\t// Get connection status\n\tgetConnectStatus: function(section) {\n\t\treturn callGetConnectStatus(section);\n\t},\n\n\t// Get dial log\n\tgetDialLog: function(section) {\n\t\treturn callGetDialLog(section);\n\t},\n\n\t// Dial modem\n\tmodemDial: function(section) {\n\t\treturn callModemDial(section);\n\t},\n\n\t// Hang modem\n\tmodemHang: function(section) {\n\t\treturn callModemHang(section);\n\t},\n\n\t// Redial modem\n\tmodemRedial: function(section) {\n\t\treturn callModemRedial(section);\n\t},\n\n\t// Get QModem network running status\n\trcStatus: function(name) {\n\t\treturn getRcStatus(name).then(function(data) {\n\t\t\tif (data && data[name]) {\n\t\t\t\treturn data;\n\t\t\t}\n\t\t\treturn false;\n\t\t});\n\t},\n\n\t// Get all modem sections\n\tgetModemSections: function() {\n\t\treturn uci.load('qmodem').then(function() {\n\t\t\tvar sections = [];\n\t\t\tuci.sections('qmodem', 'modem-device', function(s) {\n\t\t\t\tsections.push({\n\t\t\t\t\tid: s['.name'],\n\t\t\t\t\tname: s.name || s['.name'],\n\t\t\t\t\tenabled: s.enabled !== '0'\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn sections;\n\t\t});\n\t},\n\n\t// Format signal strength\n\tformatSignal: function(value, type) {\n\t\tif (!value || value === 'N/A') return 'N/A';\n\t\t\n\t\tvar num = parseInt(value);\n\t\tif (isNaN(num)) return value;\n\n\t\tswitch(type) {\n\t\t\tcase 'rssi':\n\t\t\t\tif (num >= -70) return value + ' dBm (Excellent)';\n\t\t\t\tif (num >= -85) return value + ' dBm (Good)';\n\t\t\t\tif (num >= -100) return value + ' dBm (Fair)';\n\t\t\t\treturn value + ' dBm (Poor)';\n\t\t\tcase 'rsrp':\n\t\t\t\tif (num >= -80) return value + ' dBm (Excellent)';\n\t\t\t\tif (num >= -90) return value + ' dBm (Good)';\n\t\t\t\tif (num >= -100) return value + ' dBm (Fair)';\n\t\t\t\treturn value + ' dBm (Poor)';\n\t\t\tcase 'rsrq':\n\t\t\t\tif (num >= -10) return value + ' dB (Excellent)';\n\t\t\t\tif (num >= -15) return value + ' dB (Good)';\n\t\t\t\tif (num >= -20) return value + ' dB (Fair)';\n\t\t\t\treturn value + ' dB (Poor)';\n\t\t\tcase 'sinr':\n\t\t\t\tif (num >= 20) return value + ' dB (Excellent)';\n\t\t\t\tif (num >= 13) return value + ' dB (Good)';\n\t\t\t\tif (num >= 0) return value + ' dB (Fair)';\n\t\t\t\treturn value + ' dB (Poor)';\n\t\t\tdefault:\n\t\t\t\treturn value;\n\t\t}\n\t},\n\n\t// Get SIM switch support\n\tcallGetSimSwitchCapabilities: function(section) {\n\t\treturn callGetSimSwitchCapabilities(section);\n\t},\n\n\t// Get current SIM slot\n\tgetSimSlot: function(section) {\n\t\treturn callGetSimSlot(section);\n\t},\n\n\t// Set SIM slot\n\tsetSimSlot: function(section, slot) {\n\t\treturn callSetSimSlot(section, slot);\n\t}\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/htdocs/luci-static/resources/qmodem/sms-pdu.js",
    "content": "var pduParser = {};\n\npduParser.parse = function(pdu) {\n    //Cursor points to the last octet we've read.\n    var cursor = 0;\n\n    var buffer = new Buffer(pdu.slice(0,4), 'hex');\n    var smscSize = buffer[0];\n    var smscType = buffer[1].toString(16);\n    cursor = (smscSize*2+2);\n    var smscNum  = pduParser.deSwapNibbles(pdu.slice(4, cursor));\n\n    var buffer = new Buffer(pdu.slice(cursor,cursor+6), 'hex');\n    cursor += 6;\n    var smsDeliver = buffer[0];\n\n    var smsDeliverBits = (\"00000000\"+parseInt(smsDeliver).toString(2)).slice(-8);\n    var udhi = smsDeliverBits.slice(1,2) === \"1\";\n\n    var senderSize = buffer[1];\n    if(senderSize % 2 === 1)\n        senderSize++;\n\n    var senderType = parseInt(buffer[2]).toString(16)\n\n    var encodedSender = pdu.slice(cursor, cursor + senderSize);\n    var senderNum;\n    if (senderType === '91') {\n        senderNum = pduParser.deSwapNibbles(encodedSender);\n    } else if (senderType === 'd0') {\n        senderNum = this.decode7Bit(encodedSender).replace(/\\0/g, '');\n    } else {\n        console.error('unsupported sender type.');\n    }\n\n    cursor += senderSize;\n\n    var protocolIdentifier = pdu.slice(cursor, cursor+2);\n    cursor += 2;\n\n    var dataCodingScheme = pdu.slice(cursor, cursor+2);\n    cursor = cursor+2;\n\n    var encoding = pduParser.detectEncoding(dataCodingScheme);\n\n    var timestamp = pduParser.deSwapNibbles(pdu.slice(cursor, cursor+14));\n\n\n    var time = new Date;\n    time.setUTCFullYear('20'+timestamp.slice(0,2));\n    time.setUTCMonth(timestamp.slice(2,4)-1);\n    time.setUTCDate(timestamp.slice(4,6));\n    time.setUTCHours(timestamp.slice(6,8));\n    time.setUTCMinutes(timestamp.slice(8,10));\n    time.setUTCSeconds(timestamp.slice(10,12));\n\n    var firstTimezoneOctet = parseInt(timestamp.slice(12,13));\n    var binary = (\"0000\"+firstTimezoneOctet.toString(2)).slice(-4);\n    var factor = binary.slice(0,1) === '1' ? 1 : -1;\n    var binary = '0'+binary.slice(1, 4);\n    var firstTimezoneOctet = parseInt(binary, 2).toString(10);\n    var timezoneDiff = parseInt(firstTimezoneOctet + timestamp.slice(13, 14));\n    var time = new Date(time.getTime() + (timezoneDiff * 15 * 1000 * 60 * factor));\n\n    cursor += 14;\n\n    var dataLength = parseInt(pdu.slice(cursor, cursor+2), 16).toString(10);\n    cursor += 2;\n\n    if(udhi) { //User-Data-Header-Indicator: means there's some User-Data-Header.\n        var udhLength = pdu.slice(cursor, cursor+2);\n        var iei = pdu.slice(cursor+2, cursor+4);\n        if(iei == \"00\") { //Concatenated sms.\n            var headerLength = pdu.slice(cursor+4, cursor+6);\n            var referenceNumber = pdu.slice(cursor+6, cursor+8);\n            var parts = pdu.slice(cursor+8, cursor+10);\n            var currentPart = pdu.slice(cursor+10, cursor+12);\n        }\n\n        if(iei == \"08\") { //Concatenaded sms with a two-bytes reference number\n            var headerLength = pdu.slice(cursor+4, cursor+6);\n            var referenceNumber = pdu.slice(cursor+6, cursor+10);\n            var parts = pdu.slice(cursor+10, cursor+12);\n            var currentPart = pdu.slice(cursor+12, cursor+14);\n        }\n\n        if(encoding === '16bit')\n            if(iei == '00')\n                cursor += (udhLength-2)*4;\n            else if(iei == '08')\n                cursor += ((udhLength-2)*4)+2;\n        else\n            cursor += (udhLength-2)*2;\n    }\n\n    if(encoding === '16bit')\n        var text = pduParser.decode16Bit(pdu.slice(cursor), dataLength);\n    else if(encoding === '7bit')\n        var text = pduParser.decode7Bit(pdu.slice(cursor), dataLength);\n    else if(encoding === '8bit')\n        var text = ''; //TODO\n\n    var data = {\n        'smsc' : smscNum,\n        'smsc_type' : smscType,\n        'sender' : senderNum,\n        'sender_type' : senderType,\n        'encoding' : encoding,\n        'time' : time,\n        'text' : text\n    };\n\n    if(udhi) {\n        data['udh'] = {\n            'length' : udhLength,\n            'iei' : iei,\n        };\n\n        if(iei == '00' || iei == '08') {\n            data['udh']['reference_number'] = referenceNumber;\n            data['udh']['parts'] = parseInt(parts);\n            data['udh']['current_part'] = parseInt(currentPart);\n        }\n    }\n\n    return data;\n}\n\npduParser.detectEncoding = function(dataCodingScheme) {\n    var binary = ('00000000'+(parseInt(dataCodingScheme, 16).toString(2))).slice(-8);\n\n    if(binary == '00000000')\n        return '7bit';\n\n    if(binary.slice(0, 2) === '00') {\n        var compressed = binary.slice(2, 1) === '1';\n        var bitsHaveMeaning = binary.slice(3, 1) === '1';\n\n        if(binary.slice(4,6) === '00')\n            return '7bit';\n\n        if(binary.slice(4,6) === '01')\n            return '8bit';\n\n        if(binary.slice(4,6) === '10')\n            return '16bit';\n    }\n}\n\npduParser.decode16Bit = function(data, length) {\n    //We are getting ucs2 characters.\n    var ucs2 = '';\n    for(var i = 0;i<=data.length;i=i+4) {\n        ucs2 += String.fromCharCode(\"0x\"+data[i]+data[i+1]+data[i+2]+data[i+3]);\n    }\n\n    return ucs2;\n}\n\npduParser.deSwapNibbles = function(nibbles) {\n    var out = '';\n    for(var i = 0; i< nibbles.length; i=i+2) {\n        if(nibbles[i] === 'F') //Dont consider trailing F.\n            out += parseInt(nibbles[i+1], 16).toString(10);\n        else\n            out += parseInt(nibbles[i+1], 16).toString(10)+parseInt(nibbles[i], 16).toString(10);\n    }\n    return out;\n}\n\npduParser.decode7Bit = function(code, count) {\n    //We are getting 'septeps'. We should decode them.\n    var binary = '';\n    for(var i = 0; i<code.length;i++)\n        binary += ('0000'+parseInt(code.slice(i,i+1), 16).toString(2)).slice(-4);\n\n    var bin = Array();\n    var cursor = 0;\n    var fromPrevious = '';\n    var i = 0;\n    while(binary[i]) {\n        var remaining = 7 - fromPrevious.length;\n        var toNext = 8 - remaining;\n        bin[i] = binary.slice(cursor+toNext, cursor+toNext+remaining) + fromPrevious;\n        var fromPrevious = binary.slice(cursor, cursor+toNext);\n        if(toNext === 8)\n            fromPrevious = '';\n        else\n            cursor += 8;\n        i++;\n    }\n\n    var ascii = '';\n    for(i in bin)\n        ascii += String.fromCharCode(parseInt(bin[i], 2));\n\n    return ascii;\n}\n\npduParser.encode7Bit = function(ascii) {\n    //We should create septeps now.\n    var octets = new Array();\n    for(var i = 0; i<ascii.length; i++)\n        octets.push(('0000000'+(ascii.charCodeAt(i).toString(2))).slice(-7));\n\n    for(var i in octets) {\n        var i = parseInt(i);\n        var freeSpace = 8 - octets[i].length;\n\n        if(octets[i+1] && freeSpace !== 8) {\n            octets[i] = octets[i+1].slice(7-freeSpace) + octets[i];\n            octets[i+1] = octets[i+1].slice(0, 7-freeSpace);\n        }\n    }\n\n    var hex = '';\n    for(i in octets)\n        if(octets[i].length > 0)\n            hex += ('00'+(parseInt(octets[i], 2).toString(16))).slice(-2);\n    return hex;\n}\n\n//TODO: TP-Validity-Period (Delivery)\npduParser.generate = function(message) {\n    var pdu = '00';\n\n    var parts = 1;\n    if(message.encoding === '16bit' && message.text.length > 70)\n        parts = message.text.length / 66;\n\n    else if(message.encoding === '7bit' && message.text.length > 160)\n        parts = message.text.length / 153;\n\n    parts = Math.ceil(parts);\n\n    var TPMTI  = 1;\n    var TPRD   = 4;\n    var TPVPF  = 8;\n    var TPSRR  = 32;\n    var TPUDHI = 64;\n    var TPRP   = 128;\n\n    var submit = TPMTI;\n\n    if(parts > 1) //UDHI\n        submit = submit | TPUDHI;\n\n    submit = submit | TPSRR;\n\n    pdu += submit.toString(16);\n\n    pdu += '00'; //TODO: Reference Number;\n\n    var receiverSize = ('00'+(parseInt(message.receiver.length, 10).toString(16))).slice(-2);\n    var receiver = pduParser.swapNibbles(message.receiver);\n    var receiverType = 81; //TODO: NOT-Hardcoded PDU generation. Please note that Hamrah1 doesnt work if we set it to 91 (International).\n\n    pdu += receiverSize.toString(16) + receiverType + receiver;\n\n    pdu += '00'; //TODO TP-PID\n\n    if(message.encoding === '16bit')\n        pdu += '08';\n    else if(message.encoding === '7bit')\n        pdu += '00';\n\n    var pdus = new Array();\n\n    var csms = randomHexa(2); // CSMS allows to give a reference to a concatenated message\n\n    for(var i=0; i< parts; i++) {\n        pdus[i] = pdu;\n\n        if(message.encoding === '16bit') {\n            /* If there are more than one messages to be sent, we are going to have to put some UDH. Then, we would have space only\n             * for 66 UCS2 characters instead of 70 */\n            if(parts === 1)\n                var length = 70;\n            else\n                var length = 66;\n\n        } else if(message.encoding === '7bit') {\n            /* If there are more than one messages to be sent, we are going to have to put some UDH. Then, we would have space only\n             * for 153 ASCII characters instead of 160 */\n            if(parts === 1)\n                var length = 160;\n            else\n                var length = 153;\n        }\n        var text = message.text.slice(i*length, (i*length)+length);\n\n        var user_data;\n        var size;\n        if(message.encoding === '16bit') {\n            user_data = pduParser.encode16Bit(text);\n            size = (user_data.length / 2);\n\n            if(parts > 1)\n                size += 6; //6 is the number of data headers we append.\n\n        } else if(message.encoding === '7bit') {\n            user_data = pduParser.encode7Bit(text);\n            size = user_data.length / 2;\n        }\n\n        pdus[i] += ('00'+parseInt(size).toString(16)).slice(-2);\n\n        if(parts > 1) {\n            pdus[i] += '05';\n            pdus[i] += '00';\n            pdus[i] += '03';\n            pdus[i] +=  csms;\n            pdus[i] += ('00'+parts.toString(16)).slice(-2);\n            pdus[i] += ('00'+(i+1).toString(16)).slice(-2);\n        }\n        pdus[i] += user_data;\n    }\n\n    return pdus;\n}\n\n\npduParser.encode16Bit = function(text) {\n    var out = '';\n    for(var i = 0; i<text.length;i++) {\n        out += ('0000'+(parseInt(text.charCodeAt(i), 10).toString(16))).slice(-4);\n    }\n    return out;\n}\n\npduParser.swapNibbles = function(nibbles) {\n    var out = '';\n    for(var i = 0; i< nibbles.length; i=i+2) {\n        if(typeof(nibbles[i+1]) === 'undefined') // Add a trailing F.\n            out += 'F'+parseInt(nibbles[i], 16).toString(10);\n        else\n            out += parseInt(nibbles[i+1], 16).toString(10)+parseInt(nibbles[i], 16).toString(10);\n    }\n    return out;\n}\n\npduParser.parseStatusReport = function(pdu) {\n    //Cursor points to the last octet we've read.\n    var cursor = 0;\n\n    var smscSize = parseInt(pdu.slice(0, 2), 16);\n    cursor += 2;\n\n    var smscType = parseInt(pdu.slice(cursor, cursor+2), 16);\n    cursor += 2;\n\n    var smscNum  = pduParser.deSwapNibbles(pdu.slice(cursor, (smscSize*2)+2));\n    cursor = (smscSize*2+2);\n\n    var header = parseInt(pdu.slice(cursor,cursor+2));\n    cursor += 2;\n\n    var reference = parseInt(pdu.slice(cursor,cursor+2), 16);\n    cursor += 2;\n\n    var senderSize = parseInt(pdu.slice(cursor,cursor+2), 16);\n    if(senderSize % 2 === 1)\n        senderSize++;\n    cursor += 2;\n\n    var senderType = parseInt(pdu.slice(cursor,cursor+2));\n    cursor += 2;\n\n    var sender = pduParser.deSwapNibbles(pdu.slice(cursor, cursor+senderSize));\n\n    var status = pdu.slice(-2);\n\n    return {\n        smsc:smscNum,\n        reference:reference,\n        sender:sender,\n        status:status\n    }\n}\n\nfunction randomHexa(size)\n{\n    var text = \"\";\n    var possible = \"0123456789ABCDEF\";\n    for( var i=0; i < size; i++ )\n        text += possible.charAt(Math.floor(Math.random() * possible.length));\n    return text;\n}\n\n\nclass LuciTable{\n        constructor(){\n            this.rows = [];\n            this.tbody;\n            this.fieldset;\n            this.init_table();\n        }\n\n        init_table(){\n            //create a luci fieldset (class cbi-section)\n            var fieldset = document.createElement('fieldset');\n            fieldset.className=\"cbi-section\";\n            //set fieldset Header name\n            var legend = document.createElement('legend');\n            var title_span = document.createElement('span');\n            title_span.className=\"panel-title\"\n            //init table\n            var table = document.createElement('table');\n            var tbody = document.createElement('tbody');\n            table.className=\"table\"\n            //save\n            this.fieldset = fieldset;\n            this.tbody = tbody\n            this.title_span = title_span\n            this.legend = legend\n            \n            fieldset.appendChild(legend);\n            fieldset.appendChild(title_span);\n            table.appendChild(tbody)\n            fieldset.appendChild(table)\n        }\n\n        new_tr(data,index){\n            var type = data.type;\n            var col = data.col;\n            var left = data.left;\n            var right = data.right;\n            //clear the row\n            this.rows[index].left.innerHTML = \"\";\n            this.rows[index].right.innerHTML = \"\";\n            //set the row\n            this.rows[index].left.appendChild(left);\n            this.rows[index].right.appendChild(right);\n            if (right == null || right == \"\") {\n                this.rows[index].row.style.display = \"none\";\n            }\n            else{\n                this.rows[index].row.style.display = \"\";\n            }\n        }\n\n\n        set title(value){\n            this.legend.innerHTML = value;\n            this.title_span.innerHTML = value;\n        }\n\n        set object_data(value){\n            var row_length = this.rows.length;\n            var value_length = Object.keys(value).length;\n            if (row_length < value_length) {\n                for ( let i = row_length; i < value_length; i++) {\n                    let row = document.createElement('tr');\n                    row.className = \"tr\"\n                    let cell_left = document.createElement('td');\n                    cell_left.classList.add(\"td\")\n                    cell_left.setAttribute(\"width\",\"33%\")\n                    let cell_right = document.createElement('td');\n                    cell_right.classList.add(\"td\");\n                    row.appendChild(cell_left);\n                    row.appendChild(cell_right);\n                    this.tbody.appendChild(row);\n                    var row_dict = {\n                        \"row\":row,\n                        \"left\":cell_left,\n                        \"right\":cell_right,\n                    }\n                    this.rows.push(row_dict);\n                }\n            }\n            else if(row_length > value_length){\n                for (let i = value_length; i < row_length; i++) {\n                    this.tbody.removeChild(this.rows[i].row);\n                }\n                this.rows = this.rows.slice(0,value_length);\n            }\n            var index = 0;\n            for (var key in value) {\n                this.rows[index].left.innerHTML = key;\n                this.rows[index].right.innerHTML = value[key];\n                index++;\n            }\n        }\n        \n        set array_data(value){\n            var row_length = this.rows.length;\n            var value_length = value.length;\n            if (row_length < value_length) {\n                for ( let i = row_length; i < value_length; i++) {\n                    let row = document.createElement('tr');\n                    row.className = \"tr\"\n                    let cell_left = document.createElement('td');\n                    cell_left.classList.add(\"td\")\n                    cell_left.setAttribute(\"width\",\"33%\")\n                    let cell_right = document.createElement('td');\n                    cell_right.classList.add(\"sms_recv_content\")\n                    cell_right.classList.add(\"td\")\n                    row.appendChild(cell_left);\n                    row.appendChild(cell_right);\n                    this.tbody.appendChild(row);\n                    var row_dict = {\n                        \"row\":row,\n                        \"left\":cell_left,\n                        \"right\":cell_right,\n                    }\n                    this.rows.push(row_dict);\n                }\n            }\n            else if(row_length > value_length){\n                for (let i = value_length; i < row_length; i++) {\n                    this.tbody.removeChild(this.rows[i].row);\n                }\n                this.rows = this.rows.slice(0,value_length);\n            }\n            for (let i = 0; i < value.length; i++) {\n                this.new_tr(value[i],i);\n            }\n        }\n\n        set data(value){\n            if (value == null) {\n                return;\n            }\n            if (Array.isArray(value)) {\n                this.array_data = value;\n            }\n            else{\n                this.object_data = value;\n            }\n        }\n    }\n\n// Export pduParser as a proper module\nreturn L.Class.extend({\n    parse: pduParser.parse.bind(pduParser),\n    detectEncoding: pduParser.detectEncoding.bind(pduParser),\n    decode16Bit: pduParser.decode16Bit.bind(pduParser),\n    deSwapNibbles: pduParser.deSwapNibbles.bind(pduParser),\n    decode7Bit: pduParser.decode7Bit.bind(pduParser),\n    encode7Bit: pduParser.encode7Bit.bind(pduParser),\n    generate: pduParser.generate.bind(pduParser),\n    encode16Bit: pduParser.encode16Bit.bind(pduParser),\n    swapNibbles: pduParser.swapNibbles.bind(pduParser),\n    parseStatusReport: pduParser.parseStatusReport.bind(pduParser)\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/htdocs/luci-static/resources/qmodem/sms.js",
    "content": "'use strict';\n'require rpc';\n'require qmodem.sms-pdu as pduParser';\n\nvar callQmodemSms = rpc.declare({\n\tobject: 'qmodem_sms',\n\tmethod: 'list_sms',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callGetConversation = rpc.declare({\n\tobject: 'qmodem_sms',\n\tmethod: 'get_conversation',\n\tparams: ['config_section', 'contact'],\n\texpect: { }\n});\n\nvar callSendSms = rpc.declare({\n\tobject: 'qmodem_sms',\n\tmethod: 'send_sms',\n\tparams: ['config_section', 'recipient', 'pdu', 'content'],\n\texpect: { }\n});\n\nvar callDeleteSms = rpc.declare({\n\tobject: 'qmodem_sms',\n\tmethod: 'delete_sms',\n\tparams: ['config_section', 'type', 'ids'],\n\texpect: { }\n});\n\nvar callMarkRead = rpc.declare({\n\tobject: 'qmodem_sms',\n\tmethod: 'mark_read',\n\tparams: ['config_section', 'ids'],\n\texpect: { }\n});\n\nvar callGetSentHistory = rpc.declare({\n\tobject: 'qmodem_sms',\n\tmethod: 'get_sent_history',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callClearSentHistory = rpc.declare({\n\tobject: 'qmodem_sms',\n\tmethod: 'clear_sent_history',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callGetReceivedHistory = rpc.declare({\n\tobject: 'qmodem_sms',\n\tmethod: 'get_received_history',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callClearReceivedHistory = rpc.declare({\n\tobject: 'qmodem_sms',\n\tmethod: 'clear_received_history',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callGetSmsStorage = rpc.declare({\n\tobject: 'qmodem_sms',\n\tmethod: 'get_sms_storage',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callSetSmsStorage = rpc.declare({\n\tobject: 'qmodem_sms',\n\tmethod: 'set_sms_storage',\n\tparams: ['config_section', 'mem1', 'mem2', 'mem3'],\n\texpect: { }\n});\n\nvar callGetSimSms = rpc.declare({\n\tobject: 'qmodem_sms',\n\tmethod: 'get_sim_sms',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nvar callDeleteSimSms = rpc.declare({\n\tobject: 'qmodem_sms',\n\tmethod: 'delete_sim_sms',\n\tparams: ['config_section', 'index'],\n\texpect: { }\n});\n\nreturn L.Class.extend({\n\t/**\n\t * List all SMS conversations\n\t * @param {string} configSection - The modem configuration section\n\t * @returns {Promise} Promise resolving to conversations list\n\t */\n\tlistSms: function(configSection) {\n\t\treturn callQmodemSms(configSection || 'modem_1');\n\t},\n\n\t/**\n\t * Get conversation details with a specific contact\n\t * @param {string} configSection - The modem configuration section\n\t * @param {string} contact - The contact phone number\n\t * @returns {Promise} Promise resolving to conversation details\n\t */\n\tgetConversation: function(configSection, contact) {\n\t\treturn callGetConversation(configSection || 'modem_1', contact);\n\t},\n\n\t/**\n\t * Send SMS message\n\t * @param {string} configSection - The modem configuration section\n\t * @param {string} recipient - Recipient phone number\n\t * @param {string} message - Message content\n\t * @param {string} encoding - Encoding type ('7bit' or '16bit')\n\t * @returns {Promise} Promise resolving to send result\n\t */\n\tsendSms: function(configSection, recipient, message, encoding) {\n\t\t// Generate PDU using sms-pdu.js\n\t\tencoding = encoding || '16bit';  // Default to 16bit for better compatibility\n\t\t\n\t\t\n\t\ttry {\n\t\t\tvar pdus = pduParser.generate({\n\t\t\t\treceiver: recipient,\n\t\t\t\ttext: message,\n\t\t\t\tencoding: encoding\n\t\t\t});\n\n\n\t\t\tif (!pdus || pdus.length === 0) {\n\t\t\t\tconsole.error('Failed to generate PDU');\n\t\t\t\treturn Promise.reject(new Error('Failed to generate PDU'));\n\t\t\t}\n\n\t\t\t// For multi-part messages, we need to send all parts\n\t\t\t// For now, we'll send the first PDU and handle multi-part in the future\n\t\t\tvar pdu = pdus[0];\n\n\t\t\treturn callSendSms(configSection || 'modem_1', recipient, pdu, message).then(function(result) {\n\t\t\t\treturn result;\n\t\t\t}).catch(function(error) {\n\t\t\t\tconsole.error('SMS send error:', error);\n\t\t\t\tthrow error;\n\t\t\t});\n\t\t} catch (e) {\n\t\t\tconsole.error('Exception in sendSms:', e);\n\t\t\treturn Promise.reject(e);\n\t\t}\n\t},\n\n\t/**\n\t * Delete SMS message(s) by ID\n\t * @param {string} configSection - The modem configuration section\n\t * @param {string} type - Message type ('received' or 'sent')\n\t * @param {string|number|array} ids - Message ID(s) to delete (can be single ID or array)\n\t * @returns {Promise} Promise resolving to delete result\n\t */\n\tdeleteSms: function(configSection, type, ids) {\n\t\treturn callDeleteSms(\n\t\t\tconfigSection || 'modem_1',\n\t\t\ttype,\n\t\t\tids\n\t\t);\n\t},\n\n\t/**\n\t * Mark SMS as read by ID(s)\n\t * @param {string} configSection - The modem configuration section\n\t * @param {string|number|array} ids - Message ID(s) to mark as read (can be single ID or array)\n\t * @returns {Promise} Promise resolving to mark read result\n\t */\n\tmarkRead: function(configSection, ids) {\n\t\treturn callMarkRead(configSection || 'modem_1', ids);\n\t},\n\n\t/**\n\t * Get sent SMS history\n\t * @param {string} configSection - The modem configuration section\n\t * @returns {Promise} Promise resolving to sent SMS history\n\t */\n\tgetSentHistory: function(configSection) {\n\t\treturn callGetSentHistory(configSection || 'modem_1');\n\t},\n\n\t/**\n\t * Clear sent SMS history\n\t * @param {string} configSection - The modem configuration section\n\t * @returns {Promise} Promise resolving to clear result\n\t */\n\tclearSentHistory: function(configSection) {\n\t\treturn callClearSentHistory(configSection || 'modem_1');\n\t},\n\n\t/**\n\t * Get received SMS history\n\t * @param {string} configSection - The modem configuration section\n\t * @returns {Promise} Promise resolving to received SMS history\n\t */\n\tgetReceivedHistory: function(configSection) {\n\t\treturn callGetReceivedHistory(configSection || 'modem_1');\n\t},\n\n\t/**\n\t * Clear received SMS history\n\t * @param {string} configSection - The modem configuration section\n\t * @returns {Promise} Promise resolving to clear result\n\t */\n\tclearReceivedHistory: function(configSection) {\n\t\treturn callClearReceivedHistory(configSection || 'modem_1');\n\t},\n\n\t/**\n\t * Format timestamp to readable string\n\t * @param {number} timestamp - Unix timestamp\n\t * @returns {string} Formatted date string\n\t */\n\tformatTimestamp: function(timestamp) {\n\t\tvar date = new Date(timestamp * 1000);\n\t\tvar now = new Date();\n\t\tvar diff = now - date;\n\t\tvar days = Math.floor(diff / (1000 * 60 * 60 * 24));\n\n\t\tif (days === 0) {\n\t\t\t// Today - show time\n\t\t\treturn String(date.getHours()).padStart(2, '0') + ':' + \n\t\t\t       String(date.getMinutes()).padStart(2, '0');\n\t\t} else if (days === 1) {\n\t\t\t// Yesterday\n\t\t\treturn _('Yesterday');\n\t\t} else if (days < 7) {\n\t\t\t// This week - show day name\n\t\t\tvar dayNames = [_('Sunday'), _('Monday'), _('Tuesday'), _('Wednesday'), \n\t\t\t                _('Thursday'), _('Friday'), _('Saturday')];\n\t\t\treturn dayNames[date.getDay()];\n\t\t} else {\n\t\t\t// Older - show date\n\t\t\treturn String(date.getFullYear()) + '-' + \n\t\t\t       String(date.getMonth() + 1).padStart(2, '0') + '-' + \n\t\t\t       String(date.getDate()).padStart(2, '0');\n\t\t}\n\t},\n\n\t/**\n\t * Format phone number for display\n\t * @param {string} number - Phone number\n\t * @returns {string} Formatted phone number\n\t */\n\tformatPhoneNumber: function(number) {\n\t\tif (!number) return '';\n\t\t\n\t\t// Remove non-digit characters\n\t\tvar digits = number.replace(/\\D/g, '');\n\t\t\n\t\t// Format based on length\n\t\tif (digits.length === 11 && digits.startsWith('1')) {\n\t\t\t// Chinese mobile: 138 1234 5678\n\t\t\treturn digits.substring(0, 3) + ' ' + \n\t\t\t       digits.substring(3, 7) + ' ' + \n\t\t\t       digits.substring(7);\n\t\t} else if (digits.length === 5) {\n\t\t\t// Service numbers: 10086\n\t\t\treturn digits;\n\t\t}\n\t\t\n\t\t// Default: return as-is\n\t\treturn number;\n\t},\n\n\t/**\n\t * Truncate message content for preview\n\t * @param {string} content - Message content\n\t * @param {number} maxLength - Maximum length\n\t * @returns {string} Truncated content\n\t */\n\ttruncateMessage: function(content, maxLength) {\n\t\tif (!content) return '';\n\t\t\n\t\tmaxLength = maxLength || 50;\n\t\t\n\t\tif (content.length <= maxLength) {\n\t\t\treturn content;\n\t\t}\n\t\t\n\t\treturn content.substring(0, maxLength) + '...';\n\t},\n\n\t/**\n\t * Get SMS storage capabilities\n\t * @param {string} configSection - The modem configuration section\n\t * @returns {Promise} Promise resolving to SMS storage info\n\t */\n\tgetSmsStorage: function(configSection) {\n\t\treturn callGetSmsStorage(configSection || 'modem_1');\n\t},\n\n\t/**\n\t * Set SMS storage\n\t * @param {string} configSection - The modem configuration section\n\t * @param {string} mem1 - Reading storage (ME or SM)\n\t * @param {string} mem2 - Writing storage (ME or SM)\n\t * @param {string} mem3 - Other storage (ME or SM, optional)\n\t * @returns {Promise} Promise resolving to set storage result\n\t */\n\tsetSmsStorage: function(configSection, mem1, mem2, mem3) {\n\t\treturn callSetSmsStorage(\n\t\t\tconfigSection || 'modem_1',\n\t\t\tmem1,\n\t\t\tmem2,\n\t\t\tmem3 || ''\n\t\t);\n\t},\n\n\t/**\n\t * Get SMS directly from SIM card\n\t * @param {string} configSection - The modem configuration section\n\t * @returns {Promise} Promise resolving to SIM SMS list\n\t */\n\tgetSimSms: function(configSection) {\n\t\treturn callGetSimSms(configSection || 'modem_1');\n\t},\n\n\t/**\n\t * Delete SMS from SIM card by index\n\t * @param {string} configSection - The modem configuration section\n\t * @param {number} index - SMS index on SIM card\n\t * @returns {Promise} Promise resolving to delete result\n\t */\n\tdeleteSimSms: function(configSection, index) {\n\t\treturn callDeleteSimSms(configSection || 'modem_1', index);\n\t}\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/htdocs/luci-static/resources/view/qmodem/config_advanced.js",
    "content": "'use strict';\n'require view';\n'require ui';\n'require dom';\n'require qmodem.qmodem as qmodem';\n\nreturn view.extend({\n\tload: function() {\n\t\treturn qmodem.getModemSections();\n\t},\n\n\trender: function(modems) {\n\t\tif (!modems || modems.length === 0) {\n\t\t\treturn E('div', { 'class': 'alert-message warning' }, \n\t\t\t\t_('No modem configured.'));\n\t\t}\n\n\t\tvar container = E('div', { 'class': 'cbi-map' });\n\t\tvar title = E('h2', { 'class': 'cbi-map-caption' }, _('Advanced Configuration'));\n\t\tcontainer.appendChild(title);\n\n\t\t// Create modem selector section\n\t\tvar selectorSection = E('fieldset', { 'class': 'cbi-section' });\n\t\tvar selectorTable = E('table', { 'class': 'table' });\n\t\tvar selectorBody = E('tbody', {});\n\t\tvar selectorRow = E('tr', { 'class': 'tr' });\n\t\tvar labelCell = E('td', { 'class': 'td left', 'width': '33%' }, _('Modem Name'));\n\t\tvar selectCell = E('td', { 'class': 'td' });\n\t\t\n\t\t// Create select dropdown\n\t\tvar select = E('select', {\n\t\t\t'class': 'cbi-input-select',\n\t\t\t'id': 'modem_selector'\n\t\t});\n\t\t\n\t\tmodems.forEach(function(modem) {\n\t\t\tif (modem.enabled) {\n\t\t\t\tselect.appendChild(E('option', { 'value': modem.id }, modem.name));\n\t\t\t}\n\t\t});\n\t\t\n\t\tselectCell.appendChild(select);\n\t\tselectorRow.appendChild(labelCell);\n\t\tselectorRow.appendChild(selectCell);\n\t\tselectorBody.appendChild(selectorRow);\n\t\tselectorTable.appendChild(selectorBody);\n\t\tselectorSection.appendChild(selectorTable);\n\t\tcontainer.appendChild(selectorSection);\n\n\t\t// Create tab container\n\t\tvar tabContainer = E('div', { 'id': 'tab_container' });\n\t\tcontainer.appendChild(tabContainer);\n\n\t\tvar self = this;\n\t\t\n\t\t// Update function to show selected modem's tabs\n\t\tvar updateTabs = function() {\n\t\t\tvar selectedId = select.value;\n\t\t\tvar selectedModem = modems.find(function(m) { return m.id === selectedId; });\n\t\t\t\n\t\t\tif (selectedModem) {\n\t\t\t\tdom.content(tabContainer, null);\n\t\t\t\tdom.append(tabContainer, E('div', { 'class': 'spinning' }, _('Loading...')));\n\t\t\t\t\n\t\t\t\t// Get disabled features for the modem\n\t\t\t\tqmodem.getDisabledFeatures(selectedModem.id).then(function(result) {\n\t\t\t\t\tvar disabledFeatures = result.disabled_features || [];\n\t\t\t\t\tdom.content(tabContainer, self.createTabInterface(selectedModem, disabledFeatures));\n\t\t\t\t}).catch(function(e) {\n\t\t\t\t\tdom.content(tabContainer, E('div', { 'class': 'alert-message warning' }, \n\t\t\t\t\t\t_('Error loading features: %s').format(e.message)));\n\t\t\t\t});\n\t\t\t}\n\t\t};\n\n\t\t// Selector change handler\n\t\tselect.addEventListener('change', updateTabs);\n\n\t\t// Initial display\n\t\tupdateTabs();\n\n\t\treturn container;\n\t},\n\n\tcreateTabInterface: function(modem, disabledFeatures) {\n\t\tvar self = this;\n\t\tvar container = E('div', {});\n\t\t\n\t\t// Define all available features\n\t\tvar features = {\n\t\t\t'DialMode': {\n\t\t\t\tname: _('Dial Mode'),\n\t\t\t\thandler: function() { return self.createDialModeTab(modem); }\n\t\t\t},\n\t\t\t'RatPrefer': {\n\t\t\t\tname: _('Network Preference'),\n\t\t\t\thandler: function() { return self.createRatPreferTab(modem); }\n\t\t\t},\n\t\t\t'IMEI': {\n\t\t\t\tname: _('Set IMEI'),\n\t\t\t\thandler: function() { return self.createImeiTab(modem); }\n\t\t\t},\n\t\t\t'NeighborCell': {\n\t\t\t\tname: _('Neighbor Cell'),\n\t\t\t\thandler: function() { return self.createNeighborCellTab(modem); }\n\t\t\t},\n\t\t\t'LockBand': {\n\t\t\t\tname: _('Lock Band'),\n\t\t\t\thandler: function() { return self.createLockBandTab(modem); }\n\t\t\t},\n\t\t\t'RebootModem': {\n\t\t\t\tname: _('Reboot Modem'),\n\t\t\t\thandler: function() { return self.createRebootModemTab(modem); }\n\t\t\t}\n\t\t};\n\n\t\t// Filter out disabled features\n\t\tvar enabledFeatures = {};\n\t\tfor (var key in features) {\n\t\t\tif (!disabledFeatures.includes(key)) {\n\t\t\t\tenabledFeatures[key] = features[key];\n\t\t\t}\n\t\t}\n\n\t\t// If no features enabled, show message\n\t\tif (Object.keys(enabledFeatures).length === 0) {\n\t\t\treturn E('div', { 'class': 'alert-message warning' }, \n\t\t\t\t_('No features available for this modem.'));\n\t\t}\n\n\t\t// Create tab menu\n\t\tvar tabMenu = E('ul', { 'class': 'cbi-tabmenu' });\n\t\tvar tabContentContainer = E('div', { 'id': 'tab_content_container' });\n\n\t\tvar firstTab = null;\n\t\tvar tabContents = {};\n\n\t\tObject.keys(enabledFeatures).forEach(function(key, index) {\n\t\t\tvar feature = enabledFeatures[key];\n\t\t\t\n\t\t\t// Create tab button\n\t\t\tvar tabButton = E('li', {\n\t\t\t\t'class': index === 0 ? 'cbi-tab' : 'cbi-tab-disabled',\n\t\t\t\t'data-tab': key,\n\t\t\t\t'click': function(ev) {\n\t\t\t\t\t// Switch active tab\n\t\t\t\t\ttabMenu.querySelectorAll('li').forEach(function(tab) {\n\t\t\t\t\t\ttab.classList.remove('cbi-tab');\n\t\t\t\t\t\ttab.classList.add('cbi-tab-disabled');\n\t\t\t\t\t});\n\t\t\t\t\tev.target.classList.remove('cbi-tab-disabled');\n\t\t\t\t\tev.target.classList.add('cbi-tab');\n\t\t\t\t\t\n\t\t\t\t\t// Show corresponding content\n\t\t\t\t\tfor (var k in tabContents) {\n\t\t\t\t\t\ttabContents[k].style.display = 'none';\n\t\t\t\t\t}\n\t\t\t\t\ttabContents[key].style.display = '';\n\t\t\t\t}\n\t\t\t}, feature.name);\n\t\t\t\n\t\t\ttabMenu.appendChild(tabButton);\n\t\t\t\n\t\t\t// Create tab content (lazy loaded)\n\t\t\tvar tabContent = E('div', {\n\t\t\t\t'class': 'cbi-section-node',\n\t\t\t\t'data-tab-content': key,\n\t\t\t\t'style': index === 0 ? '' : 'display: none;'\n\t\t\t});\n\t\t\t\n\t\t\t// Lazy load content when first shown\n\t\t\tif (index === 0) {\n\t\t\t\tdom.append(tabContent, feature.handler());\n\t\t\t} else {\n\t\t\t\t// Add lazy loading\n\t\t\t\ttabButton.addEventListener('click', function() {\n\t\t\t\t\tif (!tabContent.dataset.loaded) {\n\t\t\t\t\t\tdom.content(tabContent, feature.handler());\n\t\t\t\t\t\ttabContent.dataset.loaded = 'true';\n\t\t\t\t\t}\n\t\t\t\t}, { once: false });\n\t\t\t}\n\t\t\t\n\t\t\ttabContents[key] = tabContent;\n\t\t});\n\n\t\tcontainer.appendChild(tabMenu);\n\t\t\n\t\t// Append all tab contents\n\t\tfor (var key in tabContents) {\n\t\t\ttabContentContainer.appendChild(tabContents[key]);\n\t\t}\n\t\tcontainer.appendChild(tabContentContainer);\n\n\t\treturn container;\n\t},\n\n\tcreateDialModeTab: function(modem) {\n\t\tvar self = this;\n\t\tvar container = E('fieldset', { 'class': 'cbi-section' });\n\t\tvar legend = E('legend', {}, _('Dial Mode Configuration'));\n\t\tcontainer.appendChild(legend);\n\n\t\tvar description = E('div', { 'class': 'cbi-section-descr' }, \n\t\t\t_('Configure the modem dial mode (QMI/MBIM/ECM/NCM, etc.). Changes require modem reboot to take effect.'));\n\t\tcontainer.appendChild(description);\n\n\t\t// Current mode display\n\t\tvar currentModeSection = E('div', { 'class': 'cbi-value' });\n\t\tcurrentModeSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('Current Mode')));\n\t\tvar currentModeField = E('div', { 'class': 'cbi-value-field' });\n\t\tvar currentModeValue = E('strong', { 'id': 'current_mode_' + modem.id }, _('Loading...'));\n\t\tcurrentModeField.appendChild(currentModeValue);\n\t\tcurrentModeSection.appendChild(currentModeField);\n\t\tcontainer.appendChild(currentModeSection);\n\n\t\t// Mode selection section\n\t\tvar modeSelectionSection = E('div', { 'class': 'cbi-value' });\n\t\tmodeSelectionSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('Select Mode')));\n\t\tvar modeSelectionField = E('div', { \n\t\t\t'class': 'cbi-value-field',\n\t\t\t'id': 'mode_selection_' + modem.id\n\t\t});\n\t\tmodeSelectionField.appendChild(E('div', { 'class': 'spinning' }, _('Loading available modes...')));\n\t\tmodeSelectionSection.appendChild(modeSelectionField);\n\t\tcontainer.appendChild(modeSelectionSection);\n\n\t\t// Submit button section\n\t\tvar buttonSection = E('div', { 'class': 'cbi-value' });\n\t\tbuttonSection.appendChild(E('label', { 'class': 'cbi-value-title' }, ''));\n\t\tvar buttonField = E('div', { 'class': 'cbi-value-field' });\n\t\tvar submitButton = E('button', {\n\t\t\t'class': 'btn cbi-button-action',\n\t\t\t'id': 'submit_mode_' + modem.id,\n\t\t\t'disabled': true,\n\t\t\t'click': function() {\n\t\t\t\tvar selectedMode = null;\n\t\t\t\tvar radios = document.querySelectorAll('input[name=\"mode_' + modem.id + '\"]');\n\t\t\t\tfor (var i = 0; i < radios.length; i++) {\n\t\t\t\t\tif (radios[i].checked) {\n\t\t\t\t\t\tselectedMode = radios[i].value;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!selectedMode) {\n\t\t\t\t\tui.addNotification(null, E('p', _('Please select a mode')), 'error');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsubmitButton.disabled = true;\n\t\t\t\tsubmitButton.textContent = _('Applying...');\n\n\t\t\t\tqmodem.setMode(modem.id, selectedMode).then(function(result) {\n\t\t\t\t\tif (result && result.result) {\n\t\t\t\t\t\tui.addNotification(null, E('p', _('Mode set successfully. Please reboot the modem.')), 'success');\n\t\t\t\t\t\t// Refresh the mode display\n\t\t\t\t\t\tself.loadDialMode(modem, currentModeValue, modeSelectionField, submitButton);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to set mode')), 'error');\n\t\t\t\t\t\tsubmitButton.disabled = false;\n\t\t\t\t\t\tsubmitButton.textContent = _('Apply');\n\t\t\t\t\t}\n\t\t\t\t}).catch(function(e) {\n\t\t\t\t\tui.addNotification(null, E('p', _('Error: %s').format(e.message)), 'error');\n\t\t\t\t\tsubmitButton.disabled = false;\n\t\t\t\t\tsubmitButton.textContent = _('Apply');\n\t\t\t\t});\n\t\t\t}\n\t\t}, _('Apply'));\n\t\tbuttonField.appendChild(submitButton);\n\t\tbuttonSection.appendChild(buttonField);\n\t\tcontainer.appendChild(buttonSection);\n\n\t\t// Load current mode\n\t\tself.loadDialMode(modem, currentModeValue, modeSelectionField, submitButton);\n\n\t\treturn container;\n\t},\n\n\tloadDialMode: function(modem, currentModeValue, modeSelectionField, submitButton) {\n\t\tqmodem.getMode(modem.id).then(function(result) {\n\t\t\tif (!result || !result.mode) {\n\t\t\t\tcurrentModeValue.textContent = _('Error loading mode');\n\t\t\t\tdom.content(modeSelectionField, E('em', {}, _('Failed to load available modes')));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar modes = result.mode;\n\t\t\tvar currentMode = null;\n\t\t\tvar availableModes = [];\n\n\t\t\t// Find current mode and available modes\n\t\t\tfor (var mode in modes) {\n\t\t\t\tavailableModes.push(mode);\n\t\t\t\tif (modes[mode] === '1' || modes[mode] === 1) {\n\t\t\t\t\tcurrentMode = mode;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update current mode display\n\t\t\tcurrentModeValue.textContent = currentMode || _('Unknown');\n\n\t\t\t// Create radio buttons for mode selection\n\t\t\tif (availableModes.length === 0) {\n\t\t\t\tdom.content(modeSelectionField, E('em', {}, _('No modes available')));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar radioContainer = E('div', { 'class': 'cbi-value-field' });\n\t\t\tavailableModes.forEach(function(mode) {\n\t\t\t\tvar radioWrapper = E('div', { 'style': 'margin: 5px 0; display: flex;' });\n\t\t\t\tvar radio = E('input', {\n\t\t\t\t\t'type': 'radio',\n\t\t\t\t\t'name': 'mode_' + modem.id,\n\t\t\t\t\t'value': mode,\n\t\t\t\t\t'id': 'mode_' + modem.id + '_' + mode,\n\t\t\t\t\t'checked': mode === currentMode ? 'checked' : null\n\t\t\t\t});\n\t\t\t\tvar label = E('label', {\n\t\t\t\t\t'for': 'mode_' + modem.id + '_' + mode,\n\t\t\t\t\t'style': 'margin-left: 5px;'\n\t\t\t\t}, mode.toUpperCase());\n\t\t\t\t\n\t\t\t\tradioWrapper.appendChild(radio);\n\t\t\t\tradioWrapper.appendChild(label);\n\t\t\t\tradioContainer.appendChild(radioWrapper);\n\t\t\t});\n\n\t\t\tdom.content(modeSelectionField, radioContainer);\n\t\t\tsubmitButton.disabled = false;\n\n\t\t}).catch(function(e) {\n\t\t\tcurrentModeValue.textContent = _('Error');\n\t\t\tdom.content(modeSelectionField, E('div', { 'class': 'alert-message error' },\n\t\t\t\t_('Error loading mode: %s').format(e.message)));\n\t\t});\n\t},\n\n\tcreateRatPreferTab: function(modem) {\n\t\tvar self = this;\n\t\tvar container = E('fieldset', { 'class': 'cbi-section' });\n\t\tvar legend = E('legend', {}, _('Network Preference Configuration'));\n\t\tcontainer.appendChild(legend);\n\n\t\tvar description = E('div', { 'class': 'cbi-section-descr' }, \n\t\t\t_('Configure network preference (5G/4G/3G priority). Changes may require modem restart.'));\n\t\tcontainer.appendChild(description);\n\n\t\t// Current network preference display\n\t\tvar currentPrefSection = E('div', { 'class': 'cbi-value' });\n\t\tcurrentPrefSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('Current Preference')));\n\t\tvar currentPrefField = E('div', { 'class': 'cbi-value-field' });\n\t\tvar currentPrefValue = E('strong', { 'id': 'current_pref_' + modem.id }, _('Loading...'));\n\t\tcurrentPrefField.appendChild(currentPrefValue);\n\t\tcurrentPrefSection.appendChild(currentPrefField);\n\t\tcontainer.appendChild(currentPrefSection);\n\n\t\t// Network selection section\n\t\tvar prefSelectionSection = E('div', { 'class': 'cbi-value' });\n\t\tprefSelectionSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('Select Networks')));\n\t\tvar prefSelectionField = E('div', { \n\t\t\t'class': 'cbi-value-field',\n\t\t\t'id': 'pref_selection_' + modem.id\n\t\t});\n\t\tprefSelectionField.appendChild(E('div', { 'class': 'spinning' }, _('Loading available networks...')));\n\t\tprefSelectionSection.appendChild(prefSelectionField);\n\t\tcontainer.appendChild(prefSelectionSection);\n\n\t\t// Submit button section\n\t\tvar buttonSection = E('div', { 'class': 'cbi-value' });\n\t\tbuttonSection.appendChild(E('label', { 'class': 'cbi-value-title' }, ''));\n\t\tvar buttonField = E('div', { 'class': 'cbi-value-field' });\n\t\tvar submitButton = E('button', {\n\t\t\t'class': 'btn cbi-button-action',\n\t\t\t'id': 'submit_pref_' + modem.id,\n\t\t\t'disabled': true,\n\t\t\t'click': function() {\n\t\t\t\tvar selectedNetworks = [];\n\t\t\t\tvar checkboxes = document.querySelectorAll('input[name=\"network_' + modem.id + '\"]:checked');\n\t\t\t\tcheckboxes.forEach(function(cb) {\n\t\t\t\t\tselectedNetworks.push(cb.value);\n\t\t\t\t});\n\n\t\t\t\tif (selectedNetworks.length === 0) {\n\t\t\t\t\tui.addNotification(null, E('p', _('Please select at least one network type')), 'error');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsubmitButton.disabled = true;\n\t\t\t\tsubmitButton.textContent = _('Applying...');\n\n\t\t\t\tqmodem.setNetworkPrefer(modem.id, selectedNetworks).then(function(result) {\n\t\t\t\t\tif (result) {\n\t\t\t\t\t\tui.addNotification(null, E('p', _('Network preference set successfully')), 'success');\n\t\t\t\t\t\t// Refresh the preference display\n\t\t\t\t\t\tself.loadNetworkPrefer(modem, currentPrefValue, prefSelectionField, submitButton);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to set network preference')), 'error');\n\t\t\t\t\t\tsubmitButton.disabled = false;\n\t\t\t\t\t\tsubmitButton.textContent = _('Apply');\n\t\t\t\t\t}\n\t\t\t\t}).catch(function(e) {\n\t\t\t\t\tui.addNotification(null, E('p', _('Error: %s').format(e.message)), 'error');\n\t\t\t\t\tsubmitButton.disabled = false;\n\t\t\t\t\tsubmitButton.textContent = _('Apply');\n\t\t\t\t});\n\t\t\t}\n\t\t}, _('Apply'));\n\t\tbuttonField.appendChild(submitButton);\n\t\tbuttonSection.appendChild(buttonField);\n\t\tcontainer.appendChild(buttonSection);\n\n\t\t// Load current network preference\n\t\tself.loadNetworkPrefer(modem, currentPrefValue, prefSelectionField, submitButton);\n\n\t\treturn container;\n\t},\n\n\tloadNetworkPrefer: function(modem, currentPrefValue, prefSelectionField, submitButton) {\n\t\tqmodem.getNetworkPrefer(modem.id).then(function(result) {\n\t\t\tif (!result || !result.network_prefer) {\n\t\t\t\tcurrentPrefValue.textContent = _('Error loading preference');\n\t\t\t\tdom.content(prefSelectionField, E('em', {}, _('Failed to load network preferences')));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar networkPrefer = result.network_prefer;\n\t\t\tvar currentNetworks = [];\n\t\t\tvar availableNetworks = [];\n\n\t\t\t// Find current and available networks\n\t\t\tfor (var network in networkPrefer) {\n\t\t\t\tavailableNetworks.push(network);\n\t\t\t\tif (networkPrefer[network] === '1' || networkPrefer[network] === 1) {\n\t\t\t\t\tcurrentNetworks.push(network);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update current preference display\n\t\t\tcurrentPrefValue.textContent = currentNetworks.length > 0 ? currentNetworks.join(', ') : _('None');\n\n\t\t\t// Create checkboxes for network selection\n\t\t\tif (availableNetworks.length === 0) {\n\t\t\t\tdom.content(prefSelectionField, E('em', {}, _('No network types available')));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar checkboxContainer = E('div', { 'class': 'cbi-value-field' });\n\t\t\tavailableNetworks.forEach(function(network) {\n\t\t\t\tvar checkboxWrapper = E('div', { 'style': 'margin: 5px 0;' });\n\t\t\t\tvar checkbox = E('input', {\n\t\t\t\t\t'type': 'checkbox',\n\t\t\t\t\t'name': 'network_' + modem.id,\n\t\t\t\t\t'value': network,\n\t\t\t\t\t'id': 'network_' + modem.id + '_' + network,\n\t\t\t\t\t'checked': networkPrefer[network] === '1' || networkPrefer[network] === 1 ? 'checked' : null\n\t\t\t\t});\n\t\t\t\tvar label = E('label', {\n\t\t\t\t\t'for': 'network_' + modem.id + '_' + network,\n\t\t\t\t\t'style': 'margin-left: 5px;'\n\t\t\t\t}, network);\n\t\t\t\t\n\t\t\t\tcheckboxWrapper.appendChild(checkbox);\n\t\t\t\tcheckboxWrapper.appendChild(label);\n\t\t\t\tcheckboxContainer.appendChild(checkboxWrapper);\n\t\t\t});\n\n\t\t\tdom.content(prefSelectionField, checkboxContainer);\n\t\t\tsubmitButton.disabled = false;\n\n\t\t}).catch(function(e) {\n\t\t\tcurrentPrefValue.textContent = _('Error');\n\t\t\tdom.content(prefSelectionField, E('div', { 'class': 'alert-message error' },\n\t\t\t\t_('Error loading network preference: %s').format(e.message)));\n\t\t});\n\t},\n\n\tcreateImeiTab: function(modem) {\n\t\tvar self = this;\n\t\tvar container = E('fieldset', { 'class': 'cbi-section' });\n\t\tvar legend = E('legend', {}, _('IMEI Configuration'));\n\t\tcontainer.appendChild(legend);\n\n\t\tvar description = E('div', { 'class': 'cbi-section-descr' }, \n\t\t\t_('View and modify the modem IMEI number. IMEI must be 15 digits. Changes require modem reboot to take effect.'));\n\t\tcontainer.appendChild(description);\n\n\t\t// Current IMEI display\n\t\tvar currentImeiSection = E('div', { 'class': 'cbi-value' });\n\t\tcurrentImeiSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('Current IMEI')));\n\t\tvar currentImeiField = E('div', { 'class': 'cbi-value-field' });\n\t\tvar currentImeiValue = E('strong', { \n\t\t\t'id': 'current_imei_' + modem.id,\n\t\t\t'style': 'font-family: monospace; font-size: 1.1em;'\n\t\t}, _('Loading...'));\n\t\tcurrentImeiField.appendChild(currentImeiValue);\n\t\tcurrentImeiSection.appendChild(currentImeiField);\n\t\tcontainer.appendChild(currentImeiSection);\n\n\t\t// New IMEI input section\n\t\tvar newImeiSection = E('div', { 'class': 'cbi-value' });\n\t\tnewImeiSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('New IMEI')));\n\t\tvar newImeiField = E('div', { 'class': 'cbi-value-field' });\n\t\tvar imeiInput = E('input', {\n\t\t\t'type': 'text',\n\t\t\t'class': 'cbi-input-text',\n\t\t\t'id': 'imei_input_' + modem.id,\n\t\t\t'placeholder': '123456789012345',\n\t\t\t'maxlength': '15',\n\t\t\t'pattern': '[0-9]{15}',\n\t\t\t'style': 'font-family: monospace;'\n\t\t});\n\t\t\n\t\t// Add input validation\n\t\timeiInput.addEventListener('input', function() {\n\t\t\t// Remove non-numeric characters\n\t\t\tthis.value = this.value.replace(/[^0-9]/g, '');\n\t\t\t\n\t\t\t// Update validation state\n\t\t\tvar submitButton = document.getElementById('submit_imei_' + modem.id);\n\t\t\tif (this.value.length === 15) {\n\t\t\t\tthis.style.borderColor = '';\n\t\t\t\tif (submitButton) submitButton.disabled = false;\n\t\t\t} else {\n\t\t\t\tthis.style.borderColor = 'red';\n\t\t\t\tif (submitButton) submitButton.disabled = true;\n\t\t\t}\n\t\t});\n\n\t\tvar hint = E('div', { \n\t\t\t'class': 'cbi-value-description',\n\t\t\t'style': 'margin-top: 5px;'\n\t\t}, _('Enter exactly 15 digits'));\n\t\t\n\t\tnewImeiField.appendChild(imeiInput);\n\t\tnewImeiField.appendChild(hint);\n\t\tnewImeiSection.appendChild(newImeiField);\n\t\tcontainer.appendChild(newImeiSection);\n\n\t\t// Submit button section\n\t\tvar buttonSection = E('div', { 'class': 'cbi-value' });\n\t\tbuttonSection.appendChild(E('label', { 'class': 'cbi-value-title' }, ''));\n\t\tvar buttonField = E('div', { 'class': 'cbi-value-field' });\n\t\t\n\t\tvar submitButton = E('button', {\n\t\t\t'class': 'btn cbi-button-action',\n\t\t\t'id': 'submit_imei_' + modem.id,\n\t\t\t'disabled': true,\n\t\t\t'click': function() {\n\t\t\t\tvar newImei = imeiInput.value.trim();\n\t\t\t\t\n\t\t\t\tif (newImei.length !== 15) {\n\t\t\t\t\tui.addNotification(null, E('p', _('IMEI must be exactly 15 digits')), 'error');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (!/^[0-9]{15}$/.test(newImei)) {\n\t\t\t\t\tui.addNotification(null, E('p', _('IMEI must contain only numbers')), 'error');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Confirm before setting\n\t\t\t\tif (!confirm(_('Are you sure you want to change the IMEI to %s? This requires modem reboot.').format(newImei))) {\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsubmitButton.disabled = true;\n\t\t\t\tsubmitButton.textContent = _('Setting...');\n\n\t\t\t\tqmodem.setImei(modem.id, newImei).then(function(result) {\n\t\t\t\t\tif (result && result.result) {\n\t\t\t\t\t\tui.addNotification(null, E('p', _('IMEI set successfully. Please reboot the modem for changes to take effect.')), 'success');\n\t\t\t\t\t\t// Refresh the IMEI display\n\t\t\t\t\t\tself.loadImei(modem, currentImeiValue, imeiInput, submitButton);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to set IMEI')), 'error');\n\t\t\t\t\t\tsubmitButton.disabled = false;\n\t\t\t\t\t\tsubmitButton.textContent = _('Apply');\n\t\t\t\t\t}\n\t\t\t\t}).catch(function(e) {\n\t\t\t\t\tui.addNotification(null, E('p', _('Error: %s').format(e.message)), 'error');\n\t\t\t\t\tsubmitButton.disabled = false;\n\t\t\t\t\tsubmitButton.textContent = _('Apply');\n\t\t\t\t});\n\t\t\t}\n\t\t}, _('Apply'));\n\t\t\n\t\tbuttonField.appendChild(submitButton);\n\t\t\n\t\t// Add warning message\n\t\tvar warningDiv = E('div', { \n\t\t\t'class': 'alert-message warning',\n\t\t\t'style': 'margin-top: 10px;'\n\t\t}, [\n\t\t\tE('strong', {}, _('Warning: ')),\n\t\t\t_('Changing IMEI may be illegal in some countries. Use at your own risk.')\n\t\t]);\n\t\tbuttonField.appendChild(warningDiv);\n\t\t\n\t\tbuttonSection.appendChild(buttonField);\n\t\tcontainer.appendChild(buttonSection);\n\n\t\t// Load current IMEI\n\t\tself.loadImei(modem, currentImeiValue, imeiInput, submitButton);\n\n\t\treturn container;\n\t},\n\n\tloadImei: function(modem, currentImeiValue, imeiInput, submitButton) {\n\t\tqmodem.getImei(modem.id).then(function(result) {\n\t\t\tif (!result || !result.imei) {\n\t\t\t\tcurrentImeiValue.textContent = _('Error loading IMEI');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar imei = result.imei;\n\t\t\tcurrentImeiValue.textContent = imei || _('Not available');\n\t\t\t\n\t\t\t// Pre-fill input with current IMEI for easy editing\n\t\t\tif (imei && imei.length === 15) {\n\t\t\t\timeiInput.value = imei;\n\t\t\t\timeiInput.dispatchEvent(new Event('input'));\n\t\t\t}\n\n\t\t}).catch(function(e) {\n\t\t\tcurrentImeiValue.textContent = _('Error');\n\t\t\tui.addNotification(null, E('p', _('Error loading IMEI: %s').format(e.message)), 'error');\n\t\t});\n\t},\n\n\tcreateNeighborCellTab: function(modem) {\n\t\tvar self = this;\n\t\tvar container = E('fieldset', { 'class': 'cbi-section' });\n\t\tvar legend = E('legend', {}, _('Neighbor Cell / Lock Cell'));\n\t\tcontainer.appendChild(legend);\n\n\t\tvar description = E('div', { 'class': 'cbi-section-descr' }, \n\t\t\t_('Scan neighboring cell towers and lock modem to specific cell. You can scan for nearby cells and then lock to a specific cell by copying its parameters.'));\n\t\tcontainer.appendChild(description);\n\n\t\t// Create three sections: Neighbor Cell List, Lock Cell Status, Lock Cell Settings\n\t\t\n\t\t// 1. Neighbor Cell List Section\n\t\tvar neighborSection = E('div', { \n\t\t\t'class': 'cbi-section',\n\t\t\t'style': 'margin-bottom: 20px;'\n\t\t});\n\t\tvar neighborHeader = E('h3', { 'style': 'margin: 10px 0;' }, _('Neighbor Cell List'));\n\t\tneighborSection.appendChild(neighborHeader);\n\t\t\n\t\tvar scanButton = E('button', {\n\t\t\t'class': 'btn cbi-button-action',\n\t\t\t'id': 'scan_neighbor_' + modem.id,\n\t\t\t'style': 'margin-bottom: 10px;',\n\t\t\t'click': function() {\n\t\t\t\tscanButton.disabled = true;\n\t\t\t\tscanButton.textContent = _('Scanning...');\n\t\t\t\tdom.content(neighborList, E('div', { 'class': 'spinning' }, _('Scanning neighbor cells...')));\n\t\t\t\t\n\t\t\t\tself.scanNeighborCell(modem, neighborList, scanButton);\n\t\t\t}\n\t\t}, _('Scan Neighbor Cells'));\n\t\tneighborSection.appendChild(scanButton);\n\t\t\n\t\tvar neighborList = E('div', { \n\t\t\t'id': 'neighbor_list_' + modem.id,\n\t\t\t'style': 'margin-top: 10px;'\n\t\t});\n\t\tneighborList.appendChild(E('em', {}, _('Click \"Scan Neighbor Cells\" to search for nearby cell towers')));\n\t\tneighborSection.appendChild(neighborList);\n\t\tcontainer.appendChild(neighborSection);\n\n\t\t// 2. Lock Cell Status Section\n\t\tvar statusSection = E('div', { \n\t\t\t'class': 'cbi-section',\n\t\t\t'style': 'margin-bottom: 20px;'\n\t\t});\n\t\tvar statusHeader = E('h3', { 'style': 'margin: 10px 0;' }, _('Lock Cell Status'));\n\t\tstatusSection.appendChild(statusHeader);\n\t\t\n\t\tvar statusContent = E('div', { \n\t\t\t'id': 'lockcell_status_' + modem.id,\n\t\t\t'class': 'cbi-value-field'\n\t\t});\n\t\tstatusContent.appendChild(E('em', {}, _('No status information available')));\n\t\tstatusSection.appendChild(statusContent);\n\t\tcontainer.appendChild(statusSection);\n\n\t\t// 3. Lock Cell Settings Section\n\t\tvar settingsSection = E('div', { 'class': 'cbi-section' });\n\t\tvar settingsHeader = E('h3', { 'style': 'margin: 10px 0;' }, _('Lock Cell Settings'));\n\t\tsettingsSection.appendChild(settingsHeader);\n\n\t\tvar settingsDesc = E('div', { \n\t\t\t'class': 'cbi-value-description',\n\t\t\t'style': 'margin-bottom: 15px;'\n\t\t}, _('Configure cell lock parameters. You can manually enter values or use the \"Copy\" button from scanned cells.'));\n\t\tsettingsSection.appendChild(settingsDesc);\n\n\t\t// RAT Selection\n\t\tvar ratSection = E('div', { 'class': 'cbi-value' });\n\t\tratSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('RAT')));\n\t\tvar ratField = E('div', { 'class': 'cbi-value-field' });\n\t\tvar ratSelect = E('select', {\n\t\t\t'class': 'cbi-input-select',\n\t\t\t'id': 'rat_select_' + modem.id,\n\t\t\t'change': function() {\n\t\t\t\t// Show/hide NR-specific fields\n\t\t\t\tvar isNR = this.value === '1';\n\t\t\t\tbandRow.style.display = isNR ? '' : 'none';\n\t\t\t\tscsRow.style.display = isNR ? '' : 'none';\n\t\t\t}\n\t\t});\n\t\tratSelect.appendChild(E('option', { 'value': '0' }, 'LTE'));\n\t\tratSelect.appendChild(E('option', { 'value': '1' }, 'NR'));\n\t\tratField.appendChild(ratSelect);\n\t\tratSection.appendChild(ratField);\n\t\tsettingsSection.appendChild(ratSection);\n\n\t\t// PCI Input\n\t\tvar pciSection = E('div', { 'class': 'cbi-value' });\n\t\tpciSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('PCI')));\n\t\tvar pciField = E('div', { 'class': 'cbi-value-field' });\n\t\tvar pciInput = E('input', {\n\t\t\t'type': 'text',\n\t\t\t'class': 'cbi-input-text',\n\t\t\t'id': 'pci_input_' + modem.id,\n\t\t\t'placeholder': _('Physical Cell ID')\n\t\t});\n\t\tpciField.appendChild(pciInput);\n\t\tpciSection.appendChild(pciField);\n\t\tsettingsSection.appendChild(pciSection);\n\n\t\t// ARFCN Input\n\t\tvar arfcnSection = E('div', { 'class': 'cbi-value' });\n\t\tarfcnSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('ARFCN')));\n\t\tvar arfcnField = E('div', { 'class': 'cbi-value-field' });\n\t\tvar arfcnInput = E('input', {\n\t\t\t'type': 'text',\n\t\t\t'class': 'cbi-input-text',\n\t\t\t'id': 'arfcn_input_' + modem.id,\n\t\t\t'placeholder': _('Absolute Radio Frequency Channel Number')\n\t\t});\n\t\tarfcnField.appendChild(arfcnInput);\n\t\tarfcnSection.appendChild(arfcnField);\n\t\tsettingsSection.appendChild(arfcnSection);\n\n\t\t// Band Input (for NR only)\n\t\tvar bandRow = E('div', { \n\t\t\t'class': 'cbi-value',\n\t\t\t'style': 'display: none;'\n\t\t});\n\t\tbandRow.appendChild(E('label', { 'class': 'cbi-value-title' }, _('Band')));\n\t\tvar bandField = E('div', { 'class': 'cbi-value-field' });\n\t\tvar bandInput = E('input', {\n\t\t\t'type': 'text',\n\t\t\t'class': 'cbi-input-text',\n\t\t\t'id': 'band_input_' + modem.id,\n\t\t\t'placeholder': _('NR Band')\n\t\t});\n\t\tbandField.appendChild(bandInput);\n\t\tbandRow.appendChild(bandField);\n\t\tsettingsSection.appendChild(bandRow);\n\n\t\t// SCS Selection (for NR only)\n\t\tvar scsRow = E('div', { \n\t\t\t'class': 'cbi-value',\n\t\t\t'style': 'display: none;'\n\t\t});\n\t\tscsRow.appendChild(E('label', { 'class': 'cbi-value-title' }, _('SCS')));\n\t\tvar scsField = E('div', { 'class': 'cbi-value-field' });\n\t\tvar scsSelect = E('select', {\n\t\t\t'class': 'cbi-input-select',\n\t\t\t'id': 'scs_select_' + modem.id\n\t\t});\n\t\tscsSelect.appendChild(E('option', { 'value': '0' }, '15KHZ'));\n\t\tscsSelect.appendChild(E('option', { 'value': '1' }, '30KHZ'));\n\t\tscsField.appendChild(scsSelect);\n\t\tscsRow.appendChild(scsField);\n\t\tsettingsSection.appendChild(scsRow);\n\n\t\t// Submit Button\n\t\tvar buttonSection = E('div', { 'class': 'cbi-value' });\n\t\tbuttonSection.appendChild(E('label', { 'class': 'cbi-value-title' }, ''));\n\t\tvar buttonField = E('div', { 'class': 'cbi-value-field' });\n\t\tvar unlockButton = E('button', {\n\t\t\t'class': 'btn cbi-button-action',\n\t\t\t'id': 'unlock_button_' + modem.id,\n\t\t\t'style': 'margin-right: 10px;',\n\t\t\t'click': function() {\n\t\t\t\t// Unlock cell\n\t\t\t\tvar btn = this;\n\t\t\t\tbtn.disabled = true;\n\t\t\t\tbtn.textContent = _('Unlocking...');\n\t\t\t\t// rpc call lockcell but arfcn and pci empty\n\t\t\t\tqmodem.setNeighborCell(modem.id, {\n\t\t\t\t\trat: '0',\n\t\t\t\t\tpci: '',\n\t\t\t\t\tarfcn: '',\n\t\t\t\t\tband: '',\n\t\t\t\t\tscs: ''\n\t\t\t\t}).then(function(result) {\n\t\t\t\t\tif (result) {\n\t\t\t\t\t\tui.addNotification(null, E('p', _('Cell unlocked successfully')), 'success');\n\t\t\t\t\t\t//  Refresh status\n\t\t\t\t\t\tself.updateLockCellStatus(modem, statusContent);\n\t\t\t\t\t\t\n\t\t\t\t\t} else {\n\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to unlock cell')), 'error');\n\t\t\t\t\t}\n\t\t\t\t\tbtn.disabled = false;\n\t\t\t\t\tbtn.textContent = _('Unlock Cell');\n\t\t\t\t}).catch(function(e) {\n\t\t\t\t\tui.addNotification(null, E('p', _('Error: %s').format(e.message)), 'error');\n\t\t\t\t\tbtn.disabled = false;\n\t\t\t\t\tbtn.textContent = _('Unlock Cell');\n\t\t\t\t});\n\t\t\t}\n\t\t}, _('Unlock Cell'));\n\t\tbuttonField.appendChild(unlockButton);\n\t\tvar submitButton = E('button', {\n\t\t\t'class': 'btn cbi-button-action',\n\t\t\t'id': 'submit_lockcell_' + modem.id,\n\t\t\t'click': function() {\n\t\t\t\tvar config = {\n\t\t\t\t\trat: ratSelect.value,\n\t\t\t\t\tpci: pciInput.value.trim(),\n\t\t\t\t\tarfcn: arfcnInput.value.trim(),\n\t\t\t\t\tband: bandInput.value.trim(),\n\t\t\t\t\tscs: scsSelect.value\n\t\t\t\t};\n\n\t\t\t\tif (!config.pci || !config.arfcn) {\n\t\t\t\t\tui.addNotification(null, E('p', _('PCI and ARFCN are required')), 'error');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (config.rat === '1' && !config.band) {\n\t\t\t\t\tui.addNotification(null, E('p', _('Band is required for NR')), 'error');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tsubmitButton.disabled = true;\n\t\t\t\tsubmitButton.textContent = _('Applying...');\n\n\t\t\t\tqmodem.setNeighborCell(modem.id, config).then(function(result) {\n\t\t\t\t\tif (result) {\n\t\t\t\t\t\tui.addNotification(null, E('p', _('Lock cell configuration applied successfully')), 'success');\n\t\t\t\t\t\t// Refresh status\n\t\t\t\t\t\tself.updateLockCellStatus(modem, statusContent);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to apply lock cell configuration')), 'error');\n\t\t\t\t\t}\n\t\t\t\t\tsubmitButton.disabled = false;\n\t\t\t\t\tsubmitButton.textContent = _('Apply');\n\t\t\t\t}).catch(function(e) {\n\t\t\t\t\tui.addNotification(null, E('p', _('Error: %s').format(e.message)), 'error');\n\t\t\t\t\tsubmitButton.disabled = false;\n\t\t\t\t\tsubmitButton.textContent = _('Apply');\n\t\t\t\t});\n\t\t\t}\n\t\t}, _('Apply'));\n\t\tbuttonField.appendChild(submitButton);\n\t\tbuttonSection.appendChild(buttonField);\n\t\tsettingsSection.appendChild(buttonSection);\n\n\t\tcontainer.appendChild(settingsSection);\n\n\t\t// Store references for copy functionality\n\t\tthis.neighborCellInputs = this.neighborCellInputs || {};\n\t\tthis.neighborCellInputs[modem.id] = {\n\t\t\trat: ratSelect,\n\t\t\tpci: pciInput,\n\t\t\tarfcn: arfcnInput,\n\t\t\tband: bandInput,\n\t\t\tscs: scsSelect,\n\t\t\tbandRow: bandRow,\n\t\t\tscsRow: scsRow\n\t\t};\n\n\t\treturn container;\n\t},\n\n\tscanNeighborCell: function(modem, neighborList, scanButton) {\n\t\tvar self = this;\n\t\t\n\t\tqmodem.getNeighborCell(modem.id).then(function(result) {\n\t\t\tif (!result) {\n\t\t\t\tdom.content(neighborList, E('div', { 'class': 'alert-message warning' },\n\t\t\t\t\t_('No result returned from neighbor cell scan')));\n\t\t\t\tscanButton.disabled = false;\n\t\t\t\tscanButton.textContent = _('Scan Neighbor Cells');\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = result.neighborcell;\n\t\t\tvar nrCells = result.NR || [];\n\t\t\tvar lteCells = result.LTE || [];\n\t\t\tvar lockcellStatus = result.lockcell_status || {};\n\n\t\t\t// Update status section\n\t\t\tvar statusContent = document.getElementById('lockcell_status_' + modem.id);\n\t\t\tif (statusContent) {\n\t\t\t\tself.updateLockCellStatus(modem, statusContent, lockcellStatus);\n\t\t\t}\n\n\t\t\tif (nrCells.length === 0 && lteCells.length === 0) {\n\t\t\t\tdom.content(neighborList, E('div', { 'class': 'alert-message info' },\n\t\t\t\t\t_('No neighbor cells found. Make sure the modem has network signal.')));\n\t\t\t\tscanButton.disabled = false;\n\t\t\t\tscanButton.textContent = _('Scan Neighbor Cells');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar container = E('div', {});\n\n\t\t\t// Display LTE Cells\n\t\t\tif (lteCells.length > 0) {\n\t\t\t\tvar lteSection = E('div', { 'class': 'cbi-section' });\n\t\t\t\tvar lteHeader = E('h4', { 'style': 'margin: 10px 0 5px 0;' }, _('LTE Cells'));\n\t\t\t\tlteSection.appendChild(lteHeader);\n\t\t\t\t\n\t\t\t\tvar lteTable = E('table', { 'class': 'table cbi-section-table' });\n\t\t\t\tvar lteThead = E('thead', {});\n\t\t\t\tvar lteHeaderRow = E('tr', { 'class': 'tr cbi-section-table-titles' });\n\t\t\t\tlteHeaderRow.appendChild(E('th', { 'class': 'th cbi-section-table-cell' }, _('RAT')));\n\t\t\t\tlteHeaderRow.appendChild(E('th', { 'class': 'th cbi-section-table-cell' }, _('Cell Information')));\n\t\t\t\tlteHeaderRow.appendChild(E('th', { 'class': 'th cbi-section-table-cell', 'style': 'width: 10%;' }, _('Action')));\n\t\t\t\tlteThead.appendChild(lteHeaderRow);\n\t\t\t\tlteTable.appendChild(lteThead);\n\t\t\t\t\n\t\t\t\tvar lteTbody = E('tbody', {});\n\t\t\t\tlteCells.forEach(function(cell) {\n\t\t\t\t\tvar row = self.createNeighborCellRow(modem, 'LTE', cell, 0);\n\t\t\t\t\tlteTbody.appendChild(row);\n\t\t\t\t});\n\t\t\t\tlteTable.appendChild(lteTbody);\n\t\t\t\tlteSection.appendChild(lteTable);\n\t\t\t\tcontainer.appendChild(lteSection);\n\t\t\t}\n\n\t\t\t// Display NR Cells\n\t\t\tif (nrCells.length > 0) {\n\t\t\t\tvar nrSection = E('div', { 'class': 'cbi-section', 'style': 'margin-top: 15px;' });\n\t\t\t\tvar nrHeader = E('h4', { 'style': 'margin: 10px 0 5px 0;' }, _('NR (5G) Cells'));\n\t\t\t\tnrSection.appendChild(nrHeader);\n\t\t\t\t\n\t\t\t\tvar nrTable = E('table', { 'class': 'table cbi-section-table' });\n\t\t\t\tvar nrThead = E('thead', {});\n\t\t\t\tvar nrHeaderRow = E('tr', { 'class': 'tr cbi-section-table-titles' });\n\t\t\t\tnrHeaderRow.appendChild(E('th', { 'class': 'th cbi-section-table-cell' }, _('RAT')));\n\t\t\t\tnrHeaderRow.appendChild(E('th', { 'class': 'th cbi-section-table-cell' }, _('Cell Information')));\n\t\t\t\tnrHeaderRow.appendChild(E('th', { 'class': 'th cbi-section-table-cell', 'style': 'width: 10%;' }, _('Action')));\n\t\t\t\tnrThead.appendChild(nrHeaderRow);\n\t\t\t\tnrTable.appendChild(nrThead);\n\t\t\t\t\n\t\t\t\tvar nrTbody = E('tbody', {});\n\t\t\t\tnrCells.forEach(function(cell) {\n\t\t\t\t\tvar row = self.createNeighborCellRow(modem, 'NR', cell, 1);\n\t\t\t\t\tnrTbody.appendChild(row);\n\t\t\t\t});\n\t\t\t\tnrTable.appendChild(nrTbody);\n\t\t\t\tnrSection.appendChild(nrTable);\n\t\t\t\tcontainer.appendChild(nrSection);\n\t\t\t}\n\n\t\t\tdom.content(neighborList, container);\n\t\t\tscanButton.disabled = false;\n\t\t\tscanButton.textContent = _('Scan Neighbor Cells');\n\n\t\t}).catch(function(e) {\n\t\t\tconsole.error('getNeighborCell error:', e);\n\t\t\tdom.content(neighborList, E('div', { 'class': 'alert-message error' },\n\t\t\t\t_('Error scanning neighbor cells: %s').format(e.message || e.toString())));\n\t\t\tscanButton.disabled = false;\n\t\t\tscanButton.textContent = _('Scan Neighbor Cells');\n\t\t});\n\t},\n\n\tcreateNeighborCellRow: function(modem, ratType, cellInfo, ratValue) {\n\t\tvar self = this;\n\t\t\n\t\tvar row = E('tr', { 'class': 'tr cbi-section-table-row' });\n\n\t\t// RAT column\n\t\tvar ratCell = E('td', { 'class': 'td cbi-section-table-cell' });\n\t\tvar ratBadge = E('span', { \n\t\t\t'class': 'label',\n\t\t\t'style': 'padding: 2px 8px; border-radius: 3px; font-weight: bold; ' + \n\t\t\t\t(ratType === 'NR' ? 'background-color: #4CAF50; color: white;' : 'background-color: #2196F3; color: white;')\n\t\t}, ratType);\n\t\tratCell.appendChild(ratBadge);\n\t\trow.appendChild(ratCell);\n\n\t\t// Cell info column\n\t\tvar infoCell = E('td', { 'class': 'td cbi-section-table-cell' });\n\t\tvar infoParts = [];\n\t\tfor (var key in cellInfo) {\n\t\t\tif (cellInfo[key] !== '' && cellInfo[key] !== null && cellInfo[key] !== undefined) {\n\t\t\t\tinfoParts.push(E('span', { 'style': 'margin-right: 10px;' }, [\n\t\t\t\t\tE('strong', {}, key + ': '),\n\t\t\t\t\tE('span', { 'style': 'font-family: monospace;' }, cellInfo[key].toString())\n\t\t\t\t]));\n\t\t\t}\n\t\t}\n\t\tvar infoWrapper = E('div', { 'style': 'display: flex; flex-wrap: wrap;' });\n\t\tinfoParts.forEach(function(part) {\n\t\t\tinfoWrapper.appendChild(part);\n\t\t});\n\t\tinfoCell.appendChild(infoWrapper);\n\t\trow.appendChild(infoCell);\n\n\t\t// Action column\n\t\tvar actionCell = E('td', { 'class': 'td cbi-section-table-cell' });\n\t\tvar copyButton = E('button', {\n\t\t\t'class': 'btn cbi-button cbi-button-apply',\n\t\t\t'click': function() {\n\t\t\t\tif (!self.neighborCellInputs || !self.neighborCellInputs[modem.id]) {\n\t\t\t\t\tui.addNotification(null, E('p', _('Configuration inputs not found')), 'error');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tvar inputs = self.neighborCellInputs[modem.id];\n\t\t\t\tinputs.rat.value = ratValue.toString();\n\t\t\t\tinputs.pci.value = cellInfo.pci || '';\n\t\t\t\tinputs.arfcn.value = cellInfo.arfcn || '';\n\t\t\t\tinputs.band.value = cellInfo.band || '';\n\t\t\t\t\n\t\t\t\t// Show/hide NR fields based on RAT\n\t\t\t\tif (ratValue === 1) {\n\t\t\t\t\tinputs.bandRow.style.display = '';\n\t\t\t\t\tinputs.scsRow.style.display = '';\n\t\t\t\t} else {\n\t\t\t\t\tinputs.bandRow.style.display = 'none';\n\t\t\t\t\tinputs.scsRow.style.display = 'none';\n\t\t\t\t}\n\n\t\t\t\tui.addNotification(null, E('p', _('Cell parameters copied to settings')), 'info');\n\t\t\t}\n\t\t}, _('Copy'));\n\t\tactionCell.appendChild(copyButton);\n\t\trow.appendChild(actionCell);\n\n\t\treturn row;\n\t},\n\n\tupdateLockCellStatus: function(modem, statusContent, lockcellStatus) {\n\t\tif (!lockcellStatus) {\n\t\t\t// Try to get fresh status\n\t\t\tqmodem.getNeighborCell(modem.id).then(function(result) {\n\t\t\t\tresult = result.neighborcell;\n\t\t\t\tif (result && result.lockcell_status) {\n\t\t\t\t\trenderStatus(result.lockcell_status);\n\t\t\t\t} else {\n\t\t\t\t\tdom.content(statusContent, E('em', {}, _('No status information available')));\n\t\t\t\t}\n\t\t\t}).catch(function(e) {\n\t\t\t\tdom.content(statusContent, E('em', {}, _('Error loading status')));\n\t\t\t});\n\t\t\treturn;\n\t\t}\n\n\t\tfunction renderStatus(status) {\n\t\t\tvar statusItems = [];\n\t\t\tfor (var key in status) {\n\t\t\t\tif (status[key] !== '' && status[key] !== null && status[key] !== undefined) {\n\t\t\t\t\tstatusItems.push(key + ': ' + status[key].toString().toUpperCase());\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tif (statusItems.length === 0) {\n\t\t\t\tdom.content(statusContent, E('em', {}, _('Cell is unlocked (no lock active)')));\n\t\t\t} else {\n\t\t\t\tvar statusDiv = E('div', {});\n\t\t\t\tstatusItems.forEach(function(item) {\n\t\t\t\t\tstatusDiv.appendChild(E('div', { \n\t\t\t\t\t\t'style': 'padding: 3px 0;'\n\t\t\t\t\t}, item));\n\t\t\t\t});\n\t\t\t\tdom.content(statusContent, statusDiv);\n\t\t\t}\n\t\t}\n\n\t\trenderStatus(lockcellStatus);\n\t},\n\n\tcreateLockBandTab: function(modem) {\n\t\tvar self = this;\n\t\tvar container = E('fieldset', { 'class': 'cbi-section' });\n\t\tvar legend = E('legend', {}, _('Lock Band Configuration'));\n\t\tcontainer.appendChild(legend);\n\n\t\tvar description = E('div', { 'class': 'cbi-section-descr' }, \n\t\t\t_('Lock modem to specific frequency bands. Select bands for each network type (UMTS/LTE/NR).'));\n\t\tcontainer.appendChild(description);\n\n\t\t// Lock band content area\n\t\tvar lockbandContent = E('div', { 'id': 'lockband_content_' + modem.id });\n\t\tlockbandContent.appendChild(E('div', { 'class': 'spinning' }, _('Loading band configuration...')));\n\t\tcontainer.appendChild(lockbandContent);\n\n\t\t// Load lockband configuration\n\t\tself.loadLockBand(modem, lockbandContent);\n\n\t\treturn container;\n\t},\n\n\tloadLockBand: function(modem, lockbandContent) {\n\t\tvar self = this;\n\t\t\n\t\tqmodem.getLockBand(modem.id).then(function(result) {\n\t\t\t\n\t\t\tif (!result) {\n\t\t\t\tdom.content(lockbandContent, E('div', { 'class': 'alert-message warning' },\n\t\t\t\t\t_('No result returned from getLockBand')));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Handle different response structures\n\t\t\tvar lockband = result.lockband || result;\n\t\t\t\n\t\t\t// Check if lockband is valid\n\t\t\tif (!lockband || typeof lockband !== 'object') {\n\t\t\t\tdom.content(lockbandContent, E('div', { 'class': 'alert-message warning' },\n\t\t\t\t\t_('Invalid lockband data structure')));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar bandClasses = Object.keys(lockband);\n\n\t\t\t// Filter out non-band-class keys\n\t\t\tbandClasses = bandClasses.filter(function(key) {\n\t\t\t\treturn lockband[key] && typeof lockband[key] === 'object' &&\n\t\t\t\t\t   (lockband[key].available_band || lockband[key].lock_band);\n\t\t\t});\n\n\t\t\tif (bandClasses.length === 0) {\n\t\t\t\tdom.content(lockbandContent, E('div', { 'class': 'alert-message info' },\n\t\t\t\t\t_('No bands available for this modem')));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar container = E('div', {});\n\n\t\t\t// Store lockband state\n\t\t\tvar lockbandState = {};\n\n\t\t\tbandClasses.forEach(function(bandClass) {\n\t\t\t\tvar bandData = lockband[bandClass];\n\t\t\t\t\n\t\t\t\t// Ensure bandData has the expected structure\n\t\t\t\tif (!bandData || typeof bandData !== 'object') {\n\t\t\t\t\tconsole.warn('Invalid bandData for', bandClass, bandData);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Get available_band (might be array or needs conversion)\n\t\t\t\tvar availableBands = bandData.available_band || [];\n\t\t\t\tif (!Array.isArray(availableBands)) {\n\t\t\t\t\tconsole.warn('available_band is not an array for', bandClass);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (availableBands.length === 0) {\n\t\t\t\t\tconsole.info('No available bands for', bandClass);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\t// Get locked bands (might be array or string)\n\t\t\t\tvar lockedBands = bandData.lock_band || [];\n\t\t\t\tif (typeof lockedBands === 'string') {\n\t\t\t\t\tlockedBands = lockedBands.split(',').filter(function(b) { return b.length > 0; });\n\t\t\t\t}\n\t\t\t\tif (!Array.isArray(lockedBands)) {\n\t\t\t\t\tlockedBands = [];\n\t\t\t\t}\n\n\t\t\t\t// Initialize state for this band class\n\t\t\t\tlockbandState[bandClass] = {\n\t\t\t\t\tavailable: availableBands,\n\t\t\t\t\tlocked: lockedBands\n\t\t\t\t};\n\n\t\t\t\t// Create section for this band class\n\t\t\t\tvar bandSection = E('div', { \n\t\t\t\t\t'class': 'cbi-section',\n\t\t\t\t\t'style': 'margin-bottom: 20px;'\n\t\t\t\t});\n\n\t\t\t\tvar bandHeader = E('h3', { \n\t\t\t\t\t'style': 'margin: 10px 0;'\n\t\t\t\t}, bandClass);\n\t\t\t\tbandSection.appendChild(bandHeader);\n\n\t\t\t\t// Current locked bands display\n\t\t\t\tvar currentSection = E('div', { \n\t\t\t\t\t'class': 'cbi-value',\n\t\t\t\t\t'style': 'margin-bottom: 10px;'\n\t\t\t\t});\n\t\t\t\tcurrentSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('Locked Bands')));\n\t\t\t\tvar currentField = E('div', { 'class': 'cbi-value-field' });\n\t\t\t\tvar lockedDisplay = E('strong', { \n\t\t\t\t\t'id': 'locked_' + modem.id + '_' + bandClass \n\t\t\t\t});\n\t\t\t\tself.updateLockedDisplay(lockedDisplay, lockbandState[bandClass].locked, lockbandState[bandClass].available);\n\t\t\t\tcurrentField.appendChild(lockedDisplay);\n\t\t\t\tcurrentSection.appendChild(currentField);\n\t\t\t\tbandSection.appendChild(currentSection);\n\n\t\t\t\t// Band selection area\n\t\t\t\tvar selectionSection = E('div', { 'class': 'cbi-value' });\n\t\t\t\tselectionSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('Select Bands')));\n\t\t\t\tvar selectionField = E('div', { \n\t\t\t\t\t'class': 'cbi-value-field',\n\t\t\t\t\t'style': 'display: flex; flex-wrap: wrap;'\n\t\t\t\t});\n\n\t\t\t\t// Create checkboxes for each available band\n\t\t\t\tbandData.available_band.forEach(function(band) {\n\t\t\t\t\tvar bandWrapper = E('div', { \n\t\t\t\t\t\t'class': 'band-container',\n\t\t\t\t\t\t'style': 'display: flex; align-items: center; margin: 5px 15px 5px 0; min-width: 100px;'\n\t\t\t\t\t});\n\n\t\t\t\t\tvar checkbox = E('input', {\n\t\t\t\t\t\t'type': 'checkbox',\n\t\t\t\t\t\t'name': 'band_' + modem.id + '_' + bandClass,\n\t\t\t\t\t\t'value': band.band_id,\n\t\t\t\t\t\t'id': 'band_' + modem.id + '_' + bandClass + '_' + band.band_id,\n\t\t\t\t\t\t'checked': lockbandState[bandClass].locked.includes(band.band_id.toString()) ? 'checked' : null,\n\t\t\t\t\t\t'change': function() {\n\t\t\t\t\t\t\tif (this.checked) {\n\t\t\t\t\t\t\t\tif (!lockbandState[bandClass].locked.includes(band.band_id.toString())) {\n\t\t\t\t\t\t\t\t\tlockbandState[bandClass].locked.push(band.band_id.toString());\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tlockbandState[bandClass].locked = lockbandState[bandClass].locked.filter(function(b) {\n\t\t\t\t\t\t\t\t\treturn b !== band.band_id.toString();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tself.updateLockedDisplay(lockedDisplay, lockbandState[bandClass].locked, bandData.available_band);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\n\t\t\t\t\tvar label = E('label', {\n\t\t\t\t\t\t'for': 'band_' + modem.id + '_' + bandClass + '_' + band.band_id,\n\t\t\t\t\t\t'style': 'margin-left: 5px; cursor: pointer;'\n\t\t\t\t\t}, band.band_name);\n\n\t\t\t\t\tbandWrapper.appendChild(checkbox);\n\t\t\t\t\tbandWrapper.appendChild(label);\n\t\t\t\t\tselectionField.appendChild(bandWrapper);\n\t\t\t\t});\n\n\t\t\t\tselectionSection.appendChild(selectionField);\n\t\t\t\tbandSection.appendChild(selectionSection);\n\n\t\t\t\t// Action buttons for this band class\n\t\t\t\tvar buttonSection = E('div', { \n\t\t\t\t\t'class': 'cbi-value',\n\t\t\t\t\t'style': 'margin-top: 10px;'\n\t\t\t\t});\n\t\t\t\tbuttonSection.appendChild(E('label', { 'class': 'cbi-value-title' }, ''));\n\t\t\t\tvar buttonField = E('div', { 'class': 'cbi-value-field' });\n\n\t\t\t\t// Select All button\n\t\t\t\tvar selectAllBtn = E('button', {\n\t\t\t\t\t'class': 'btn cbi-button',\n\t\t\t\t\t'style': 'margin-right: 10px;',\n\t\t\t\t\t'click': function() {\n\t\t\t\t\t\tvar allSelected = lockbandState[bandClass].locked.length === bandData.available_band.length;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (allSelected) {\n\t\t\t\t\t\t\t// Unselect all\n\t\t\t\t\t\t\tlockbandState[bandClass].locked = [];\n\t\t\t\t\t\t\tselectionField.querySelectorAll('input[type=\"checkbox\"]').forEach(function(cb) {\n\t\t\t\t\t\t\t\tcb.checked = false;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t// Select all\n\t\t\t\t\t\t\tlockbandState[bandClass].locked = bandData.available_band.map(function(b) {\n\t\t\t\t\t\t\t\treturn b.band_id.toString();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\tselectionField.querySelectorAll('input[type=\"checkbox\"]').forEach(function(cb) {\n\t\t\t\t\t\t\t\tcb.checked = true;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t\tself.updateLockedDisplay(lockedDisplay, lockbandState[bandClass].locked, bandData.available_band);\n\t\t\t\t\t}\n\t\t\t\t}, _('Select All / None'));\n\n\t\t\t\t// Apply button\n\t\t\t\tvar applyBtn = E('button', {\n\t\t\t\t\t'class': 'btn cbi-button-action',\n\t\t\t\t\t'click': function() {\n\t\t\t\t\t\tvar params = {\n\t\t\t\t\t\t\tband_class: bandClass,\n\t\t\t\t\t\t\tlock_band: lockbandState[bandClass].locked.sort(function(a, b) {\n\t\t\t\t\t\t\t\treturn parseInt(a) - parseInt(b);\n\t\t\t\t\t\t\t}).join(',')\n\t\t\t\t\t\t};\n\n\t\t\t\t\t\tapplyBtn.disabled = true;\n\t\t\t\t\t\tapplyBtn.textContent = _('Applying...');\n\n\t\t\t\t\t\tqmodem.setLockBand(modem.id, params).then(function(result) {\n\t\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Lock band configuration applied for %s').format(bandClass)), 'success');\n\t\t\t\t\t\t\t\t// Refresh the display\n\t\t\t\t\t\t\t\tself.loadLockBand(modem, lockbandContent);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to apply lock band configuration')), 'error');\n\t\t\t\t\t\t\t\tapplyBtn.disabled = false;\n\t\t\t\t\t\t\t\tapplyBtn.textContent = _('Apply');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}).catch(function(e) {\n\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Error: %s').format(e.message)), 'error');\n\t\t\t\t\t\t\tapplyBtn.disabled = false;\n\t\t\t\t\t\t\tapplyBtn.textContent = _('Apply');\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, _('Apply'));\n\n\t\t\t\tbuttonField.appendChild(selectAllBtn);\n\t\t\t\tbuttonField.appendChild(applyBtn);\n\t\t\t\tbuttonSection.appendChild(buttonField);\n\t\t\t\tbandSection.appendChild(buttonSection);\n\n\t\t\t\tcontainer.appendChild(bandSection);\n\t\t\t});\n\n\t\t\tdom.content(lockbandContent, container);\n\n\t\t}).catch(function(e) {\n\t\t\tconsole.error('getLockBand error:', e);\n\t\t\tdom.content(lockbandContent, E('div', { 'class': 'alert-message error' }, [\n\t\t\t\tE('p', {}, _('Error loading lock band configuration:')),\n\t\t\t\tE('p', {}, e.message || e.toString()),\n\t\t\t\tE('p', { 'style': 'font-size: 0.9em; margin-top: 10px;' }, \n\t\t\t\t\t_('Please check browser console for more details'))\n\t\t\t]));\n\t\t});\n\t},\n\n\tupdateLockedDisplay: function(displayElement, lockedBands, availableBands) {\n\t\tif (lockedBands.length === 0) {\n\t\t\tdisplayElement.textContent = _('None (All bands unlocked)');\n\t\t\tdisplayElement.style.color = '';\n\t\t\treturn;\n\t\t}\n\n\t\t// Create display with band names\n\t\tvar bandNames = [];\n\t\tlockedBands.forEach(function(bandId) {\n\t\t\tvar band = availableBands.find(function(b) {\n\t\t\t\treturn b.band_id.toString() === bandId.toString();\n\t\t\t});\n\t\t\tif (band) {\n\t\t\t\tbandNames.push(band.band_name);\n\t\t\t} else {\n\t\t\t\tbandNames.push(bandId);\n\t\t\t}\n\t\t});\n\n\t\tdisplayElement.textContent = bandNames.join(', ');\n\t\tdisplayElement.style.color = '#0066cc';\n\t},\n\n\tcreateRebootModemTab: function(modem) {\n\t\tvar self = this;\n\t\tvar container = E('fieldset', { 'class': 'cbi-section' });\n\t\tvar legend = E('legend', {}, _('Reboot Modem'));\n\t\tcontainer.appendChild(legend);\n\n\t\tvar description = E('div', { 'class': 'cbi-section-descr' }, \n\t\t\t_('Reboot the modem device. Soft reboot restarts the modem firmware, hard reboot power cycles the modem.'));\n\t\tcontainer.appendChild(description);\n\n\t\t// Reboot buttons section\n\t\tvar rebootSection = E('div', { 'class': 'cbi-value' });\n\t\trebootSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('Reboot Options')));\n\t\tvar rebootField = E('div', { \n\t\t\t'class': 'cbi-value-field',\n\t\t\t'id': 'reboot_buttons_' + modem.id\n\t\t});\n\t\trebootField.appendChild(E('div', { 'class': 'spinning' }, _('Loading reboot capabilities...')));\n\t\trebootSection.appendChild(rebootField);\n\t\tcontainer.appendChild(rebootSection);\n\n\t\t// Load reboot capabilities and create buttons\n\t\tself.loadRebootCaps(modem, rebootField);\n\n\t\treturn container;\n\t},\n\n\tloadRebootCaps: function(modem, rebootField) {\n\t\tvar self = this;\n\t\t\n\t\tqmodem.getRebootCaps(modem.id).then(function(result) {\n\t\t\tif (!result || !result.reboot_caps) {\n\t\t\t\tdom.content(rebootField, E('em', {}, _('Failed to load reboot capabilities')));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar caps = result.reboot_caps;\n\t\t\tvar hasSoftReboot = caps.soft_reboot_caps === '1' || caps.soft_reboot_caps === 1;\n\t\t\tvar hasHardReboot = caps.hard_reboot_caps === '1' || caps.hard_reboot_caps === 1;\n\n\t\t\tif (!hasSoftReboot && !hasHardReboot) {\n\t\t\t\tdom.content(rebootField, E('em', {}, _('No reboot methods available for this modem')));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar buttonContainer = E('div', {});\n\n\t\t\t// Soft Reboot Button\n\t\t\tif (hasSoftReboot) {\n\t\t\t\tvar softRebootBtn = E('button', {\n\t\t\t\t\t'class': 'btn cbi-button-action',\n\t\t\t\t\t'id': 'soft_reboot_' + modem.id,\n\t\t\t\t\t'style': 'margin-right: 10px; margin-bottom: 10px;',\n\t\t\t\t\t'click': function() {\n\t\t\t\t\t\tif (!confirm(_('Are you sure you want to perform a soft reboot? The modem will restart and may lose connection temporarily.'))) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tsoftRebootBtn.disabled = true;\n\t\t\t\t\t\tsoftRebootBtn.textContent = _('Rebooting...');\n\n\t\t\t\t\t\tqmodem.doReboot(modem.id, 'soft').then(function(result) {\n\t\t\t\t\t\t\tif (result && result.result && result.result.status === '1') {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Soft reboot initiated successfully. The modem is restarting...')), 'success');\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\tsoftRebootBtn.disabled = false;\n\t\t\t\t\t\t\t\t\tsoftRebootBtn.textContent = _('Soft Reboot');\n\t\t\t\t\t\t\t\t}, 10000);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to initiate soft reboot')), 'error');\n\t\t\t\t\t\t\t\tsoftRebootBtn.disabled = false;\n\t\t\t\t\t\t\t\tsoftRebootBtn.textContent = _('Soft Reboot');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}).catch(function(e) {\n\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Error: %s').format(e.message)), 'error');\n\t\t\t\t\t\t\tsoftRebootBtn.disabled = false;\n\t\t\t\t\t\t\tsoftRebootBtn.textContent = _('Soft Reboot');\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, _('Soft Reboot'));\n\t\t\t\t\n\t\t\t\tbuttonContainer.appendChild(softRebootBtn);\n\t\t\t}\n\n\t\t\t// Hard Reboot Button\n\t\t\tif (hasHardReboot) {\n\t\t\t\tvar hardRebootBtn = E('button', {\n\t\t\t\t\t'class': 'btn cbi-button-negative',\n\t\t\t\t\t'id': 'hard_reboot_' + modem.id,\n\t\t\t\t\t'style': 'margin-bottom: 10px;',\n\t\t\t\t\t'click': function() {\n\t\t\t\t\t\tif (!confirm(_('Are you sure you want to perform a hard reboot? This will power cycle the modem and may cause a longer disconnection.'))) {\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\thardRebootBtn.disabled = true;\n\t\t\t\t\t\thardRebootBtn.textContent = _('Rebooting...');\n\n\t\t\t\t\t\tqmodem.doReboot(modem.id, 'hard').then(function(result) {\n\t\t\t\t\t\t\tif (result && result.result && result.result.status === '1') {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Hard reboot initiated successfully. The modem is restarting...')), 'success');\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\thardRebootBtn.disabled = false;\n\t\t\t\t\t\t\t\t\thardRebootBtn.textContent = _('Hard Reboot');\n\t\t\t\t\t\t\t\t}, 15000);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to initiate hard reboot')), 'error');\n\t\t\t\t\t\t\t\thardRebootBtn.disabled = false;\n\t\t\t\t\t\t\t\thardRebootBtn.textContent = _('Hard Reboot');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}).catch(function(e) {\n\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Error: %s').format(e.message)), 'error');\n\t\t\t\t\t\t\thardRebootBtn.disabled = false;\n\t\t\t\t\t\t\thardRebootBtn.textContent = _('Hard Reboot');\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, _('Hard Reboot'));\n\t\t\t\t\n\t\t\t\tbuttonContainer.appendChild(hardRebootBtn);\n\t\t\t}\n\n\t\t\t// Add descriptions\n\t\t\tvar descContainer = E('div', { 'style': 'margin-top: 15px;' });\n\t\t\t\n\t\t\tif (hasSoftReboot) {\n\t\t\t\tdescContainer.appendChild(E('div', { 'style': 'margin-bottom: 5px;' }, [\n\t\t\t\t\tE('strong', {}, _('Soft Reboot') + ': '),\n\t\t\t\t\tE('span', {}, _('Restarts the modem firmware without power cycling. Faster but may not resolve all issues.'))\n\t\t\t\t]));\n\t\t\t}\n\t\t\t\n\t\t\tif (hasHardReboot) {\n\t\t\t\tdescContainer.appendChild(E('div', { 'style': 'margin-bottom: 5px;' }, [\n\t\t\t\t\tE('strong', {}, _('Hard Reboot') + ': '),\n\t\t\t\t\tE('span', {}, _('Power cycles the modem completely. Takes longer but ensures a full restart.'))\n\t\t\t\t]));\n\t\t\t}\n\n\t\t\tbuttonContainer.appendChild(descContainer);\n\t\t\tdom.content(rebootField, buttonContainer);\n\n\t\t}).catch(function(e) {\n\t\t\tdom.content(rebootField, E('div', { 'class': 'alert-message error' },\n\t\t\t\t_('Error loading reboot capabilities: %s').format(e.message)));\n\t\t});\n\t},\n\n\thandleSaveApply: null,\n\thandleSave: null,\n\thandleReset: null\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/htdocs/luci-static/resources/view/qmodem/debug.js",
    "content": "'use strict';\n'require view';\n'require ui';\n'require dom';\n'require qmodem.qmodem as qmodem';\n\nreturn view.extend({\n\tload: function() {\n\t\treturn qmodem.getModemSections();\n\t},\n\n\trender: function(modems) {\n\t\tif (!modems || modems.length === 0) {\n\t\t\treturn E('div', { 'class': 'alert-message warning' }, \n\t\t\t\t_('No modem configured.'));\n\t\t}\n\n\t\tvar container = E('div', { 'class': 'cbi-map' });\n\t\tvar title = E('h2', { 'class': 'cbi-map-caption' }, _('AT Debug'));\n\t\tcontainer.appendChild(title);\n\n\t\t// Create modem selector section (similar to overview)\n\t\tvar selectorSection = E('fieldset', { 'class': 'cbi-section' });\n\t\tvar selectorTable = E('table', { 'class': 'table' });\n\t\tvar selectorBody = E('tbody', {});\n\t\tvar selectorRow = E('tr', { 'class': 'tr' });\n\t\tvar labelCell = E('td', { 'class': 'td left', 'width': '33%' }, _('Modem Name'));\n\t\tvar selectCell = E('td', { 'class': 'td' });\n\t\t\n\t\t// Create select dropdown\n\t\tvar select = E('select', {\n\t\t\t'class': 'cbi-input-select',\n\t\t\t'id': 'modem_selector'\n\t\t});\n\t\t\n\t\tmodems.forEach(function(modem) {\n\t\t\tif (modem.enabled) {\n\t\t\t\tselect.appendChild(E('option', { 'value': modem.id }, modem.name));\n\t\t\t}\n\t\t});\n\t\t\n\t\tselectCell.appendChild(select);\n\t\tselectorRow.appendChild(labelCell);\n\t\tselectorRow.appendChild(selectCell);\n\t\tselectorBody.appendChild(selectorRow);\n\t\tselectorTable.appendChild(selectorBody);\n\t\tselectorSection.appendChild(selectorTable);\n\t\tcontainer.appendChild(selectorSection);\n\n\t\t// Create AT interface container\n\t\tvar interfaceContainer = E('div', { 'id': 'at_interface_container' });\n\t\tcontainer.appendChild(interfaceContainer);\n\n\t\tvar self = this;\n\t\t\n\t\t// Update function to show selected modem's interface\n\t\tvar updateInterface = function() {\n\t\t\tvar selectedId = select.value;\n\t\t\tvar selectedModem = modems.find(function(m) { return m.id === selectedId; });\n\t\t\t\n\t\t\tif (selectedModem) {\n\t\t\t\tdom.content(interfaceContainer, self.createAtInterface(selectedModem));\n\t\t\t}\n\t\t};\n\n\t\t// Selector change handler\n\t\tselect.addEventListener('change', updateInterface);\n\n\t\t// Initial display\n\t\tupdateInterface();\n\n\t\treturn container;\n\t},\n\n\tcreateAtInterface: function(modem) {\n\t\tvar self = this;\n\t\tvar container = E('div', { 'class': 'cbi-section-node' });\n\n\t\t// AT Port Configuration\n\t\tvar portSection = E('div', { 'class': 'cbi-value' });\n\t\tportSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('Available AT Ports')));\n\t\tvar portInfo = E('div', { 'class': 'cbi-value-field' });\n\t\tportInfo.appendChild(E('div', { 'class': 'spinning' }, _('Loading...')));\n\t\tportSection.appendChild(portInfo);\n\t\tcontainer.appendChild(portSection);\n\n\t\t// Load AT configuration\n\t\tqmodem.getAtCfg(modem.id).then(function(cfg) {\n\t\t\tif (!cfg || !cfg.at_cfg) {\n\t\t\t\tdom.content(portInfo, _('Failed to load AT configuration'));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar info = [];\n\t\t\tinfo.push(E('div', {}, [\n\t\t\t\tE('strong', {}, _('Current Port') + ': '),\n\t\t\t\tE('span', {}, cfg.at_cfg.using_port || 'N/A')\n\t\t\t]));\n\n\t\t\tif (cfg.at_cfg.ports && cfg.at_cfg.ports.length > 0) {\n\t\t\t\tinfo.push(E('div', {}, [\n\t\t\t\t\tE('strong', {}, _('Configured Ports') + ': '),\n\t\t\t\t\tE('span', {}, cfg.at_cfg.ports.join(', '))\n\t\t\t\t]));\n\t\t\t}\n\n\t\t\tif (cfg.at_cfg.other_ttys && cfg.at_cfg.other_ttys.length > 0) {\n\t\t\t\tinfo.push(E('div', {}, [\n\t\t\t\t\tE('strong', {}, _('Detected Ports') + ': '),\n\t\t\t\t\tE('span', {}, cfg.at_cfg.other_ttys.join(', '))\n\t\t\t\t]));\n\t\t\t}\n\n\t\t\tdom.content(portInfo, info);\n\n\t\t\t// Port selection dropdown\n\t\t\tvar ports = [];\n\t\t\tif (cfg.at_cfg.ports) ports = ports.concat(cfg.at_cfg.ports);\n\t\t\tif (cfg.at_cfg.other_ttys) ports = ports.concat(cfg.at_cfg.other_ttys);\n\n\t\t\tvar portSelectSection = E('div', { 'class': 'cbi-value' });\n\t\t\tportSelectSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('Select AT Port')));\n\t\t\tvar portSelectField = E('div', { 'class': 'cbi-value-field' });\n\t\t\t\n\t\t\tvar select = new ui.Dropdown(cfg.at_cfg.using_port || (ports.length > 0 ? ports[0] : ''),\n\t\t\t\tports.reduce(function(obj, port) {\n\t\t\t\t\tobj[port] = port;\n\t\t\t\t\treturn obj;\n\t\t\t\t}, {}), {\n\t\t\t\t\tid: 'at_port_' + modem.id,\n\t\t\t\t\tsort: false\n\t\t\t\t});\n\t\t\t\n\t\t\tportSelectField.appendChild(select.render());\n\t\t\tportSelectSection.appendChild(portSelectField);\n\t\t\tcontainer.appendChild(portSelectSection);\n\n\t\t\t// Use Ubus flag option\n\t\t\tvar ubusSection = E('div', { 'class': 'cbi-value' });\n\t\t\tubusSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('Use Ubus AT Daemon')));\n\t\t\tvar ubusField = E('div', { 'class': 'cbi-value-field' });\n\t\t\t\n\t\t\tvar ubusCheckbox = E('input', {\n\t\t\t\t'type': 'checkbox',\n\t\t\t\t'id': 'use_ubus_' + modem.id,\n\t\t\t\t'checked': modem.use_ubus === '1'\n\t\t\t});\n\t\t\t\n\t\t\tubusField.appendChild(ubusCheckbox);\n\t\t\tubusField.appendChild(document.createTextNode(' '));\n\t\t\tubusField.appendChild(E('span', {}, _('Enable to use Ubus AT daemon instead of direct serial port access')));\n\t\t\tubusSection.appendChild(ubusField);\n\t\t\tcontainer.appendChild(ubusSection);\n\n\t\t\t// AT Command input\n\t\t\tvar cmdSection = E('div', { 'class': 'cbi-value' });\n\t\t\tcmdSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('AT Command')));\n\t\t\tvar cmdField = E('div', { 'class': 'cbi-value-field' });\n\t\t\tvar cmdInput = E('input', {\n\t\t\t\t'type': 'text',\n\t\t\t\t'class': 'cbi-input-text',\n\t\t\t\t'id': 'at_command_' + modem.id,\n\t\t\t\t'placeholder': 'AT+CIMI'\n\t\t\t});\n\t\t\tcmdField.appendChild(cmdInput);\n\t\t\tcmdSection.appendChild(cmdField);\n\t\t\tcontainer.appendChild(cmdSection);\n\n\t\t\t// Response area\n\t\t\tvar responseSection = E('div', { 'class': 'cbi-value' });\n\t\t\tresponseSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('Response')));\n\t\t\tvar responseField = E('div', { 'class': 'cbi-value-field' });\n\t\t\t\n\t\t\tvar responseDiv = E('textarea', {\n\t\t\t\t'id': 'at_response_' + modem.id,\n\t\t\t\t'style': 'padding: 10px; overflow-y: auto; font-family: monospace; white-space: pre-wrap; width: 80%;',\n\t\t\t\t'rows': 20,\n\t\t\t\t'readonly': 'readonly',\n\t\t\t}, _('Click \"Send AT Command\" to execute'));\n\n\t\t\tvar sendBtn = E('button', {\n\t\t\t\t'class': 'btn cbi-button-action',\n\t\t\t\t'click': function() {\n\t\t\t\t\tvar port = document.getElementById('at_port_' + modem.id).value;\n\t\t\t\t\tvar cmd = document.getElementById('at_command_' + modem.id).value.trim();\n\t\t\t\t\tvar useUbus = document.getElementById('use_ubus_' + modem.id).checked ? '1' : '0';\n\n\t\t\t\t\tif (!cmd) {\n\t\t\t\t\t\tresponseDiv.textContent = _('Error: Please enter AT command');\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\n\t\t\t\t\tresponseDiv.textContent = _('Sending command...');\n\n\t\t\t\t\t// Use the use_ubus flag when sending AT command\n\t\t\t\t\tqmodem.sendAt(modem.id, port, cmd, useUbus).then(function(result) {\n\t\t\t\t\t\tif (result && result.at_cfg) {\n\t\t\t\t\t\t\tvar text = '';\n\t\t\t\t\t\t\ttext += 'Status: ' + (result.at_cfg.status === '1' ? 'Success' : 'Failed') + '\\n';\n\t\t\t\t\t\t\ttext += 'Command: ' + (result.at_cfg.cmd || '') + '\\n';\n\t\t\t\t\t\t\ttext += 'Response:\\n' + (result.at_cfg.res || 'No response');\n\t\t\t\t\t\t\tresponseDiv.textContent = text;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresponseDiv.textContent = _('No response received');\n\t\t\t\t\t\t}\n\t\t\t\t\t}).catch(function(e) {\n\t\t\t\t\t\tresponseDiv.textContent = _('Error: %s').format(e.message);\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}, _('Send AT Command'));\n\n\t\t\tresponseField.appendChild(sendBtn);\n\t\t\tresponseField.appendChild(E('br'));\n\t\t\tresponseField.appendChild(E('br'));\n\t\t\tresponseField.appendChild(responseDiv);\n\t\t\tresponseSection.appendChild(responseField);\n\t\t\tcontainer.appendChild(responseSection);\n\n\t\t\t// Quick commands\n\t\t\tif (cfg.at_cfg.cmds && cfg.at_cfg.cmds.length > 0) {\n\t\t\t\tvar quickSection = E('div', { 'class': 'cbi-value' });\n\t\t\t\tquickSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('Quick Commands')));\n\t\t\t\tvar quickField = E('div', { 'class': 'cbi-value-field cbi-section-actions' });\n\t\t\t\t\n\t\t\t\tcfg.at_cfg.cmds.forEach(function(cmd) {\n\t\t\t\t\tif (cmd.name && cmd.value) {\n\t\t\t\t\t\tquickField.appendChild(E('button', {\n\t\t\t\t\t\t\t'class': 'btn cbi-button-action',\n\t\t\t\t\t\t\t'click': function() {\n\t\t\t\t\t\t\t\tdocument.getElementById('at_command_' + modem.id).value = cmd.value;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, cmd.name));\n\t\t\t\t\t\tquickField.appendChild(document.createTextNode(' '));\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tquickSection.appendChild(quickField);\n\t\t\t\tcontainer.appendChild(quickSection);\n\t\t\t}\n\t\t}).catch(function(e) {\n\t\t\tdom.content(portInfo, _('Error loading AT configuration: %s').format(e.message));\n\t\t});\n\n\t\treturn container;\n\t},\n\n\thandleSaveApply: null,\n\thandleSave: null,\n\thandleReset: null\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/htdocs/luci-static/resources/view/qmodem/network_config.js",
    "content": "'use strict';\n'require view';\n'require form';\n'require uci';\n'require rpc';\n'require ui';\n'require qmodem.qmodem as qmodem';\n'require dom';\n'require poll';\n\nvar callInitAction = rpc.declare({\n\tobject: 'luci',\n\tmethod: 'setInitAction',\n\tparams: ['name', 'action'],\n\texpect: { result: false }\n});\n\nreturn view.extend({\n\tload: function() {\n\t\treturn Promise.all([\n\t\t\tuci.load('qmodem'),\n\t\t\tqmodem.rcStatus('qmodem_network')\n\t\t]).then(L.bind(function(results) {\n\t\t\tthis.rcStatusData = results[1];\n\t\t\t\n\t\t\t// Load connection status for all modem devices\n\t\t\tvar sections = uci.sections('qmodem', 'modem-device');\n\t\t\tvar statusPromises = sections.map(function(section) {\n\t\t\t\treturn qmodem.getConnectStatus(section['.name'])\n\t\t\t\t\t.then(function(status) {\n\t\t\t\t\t\treturn { section_id: section['.name'], status: status };\n\t\t\t\t\t})\n\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\treturn { section_id: section['.name'], status: null };\n\t\t\t\t\t});\n\t\t\t});\n\t\t\t\n\t\t\treturn Promise.all(statusPromises).then(L.bind(function(statuses) {\n\t\t\t\tthis.connectionStatusData = {};\n\t\t\t\tstatuses.forEach(L.bind(function(item) {\n\t\t\t\t\tthis.connectionStatusData[item.section_id] = item.status;\n\t\t\t\t}, this));\n\t\t\t\treturn results;\n\t\t\t}, this));\n\t\t}, this));\n\t},\n\n\trender: function() {\n\t\tvar m, s, o;\n\n\t\tm = new form.Map('qmodem', _('QModem Configuration'));\n\n\t\t// Global Dial Configuration\n\t\ts = m.section(form.NamedSection, 'main', 'main', _('Global Configuration'));\n\n\t\to = s.option(form.Flag, 'enable_dial', _('Enable Dial (Global)'));\n\t\to.default = '1';\n\t\to.rmempty = false;\n\n\t\t// QModem network RC status and control\n\t\tvar rcStatus = s.option(form.DummyValue, '_rc_status', _('QModem Network'));\n\t\trcStatus.rawhtml = true;\n\t\trcStatus.cfgvalue = L.bind(function() {\n\t\t\tvar status = this.rcStatusData && this.rcStatusData.qmodem_network ? this.rcStatusData.qmodem_network : null;\n\t\t\t\n\t\t\tif (!status) {\n\t\t\t\treturn E('div', { id: 'rc-status-container' }, [\n\t\t\t\t\tE('span', {}, _('Failed to load status'))\n\t\t\t\t]);\n\t\t\t}\n\t\t\t\n\t\t\tvar enabled = status.enabled === true || status.enabled === 'true';\n\t\t\tvar running = status.running === true || status.running === 'true';\n\t\t\t\n\t\t\treturn E('div', { id: 'rc-status-container' }, [\n\t\t\t\tE('span', {}, _('Enabled') + ': ' + (enabled ? _('Yes') : _('No'))),\n\t\t\t\tE('span', { 'style': 'margin-left: 12px;' }, _('Running') + ': ' + (running ? _('Yes') : _('No')))\n\t\t\t]);\n\t\t}, this);\n\n\t\tvar rcControl = s.option(form.DummyValue, '_rc_control', _('Control'));\n\t\trcControl.rawhtml = true;\n\t\trcControl.cfgvalue = L.bind(function() {\n\t\t\tvar status = this.rcStatusData && this.rcStatusData.qmodem_network ? this.rcStatusData.qmodem_network : null;\n\t\t\tvar enabled = status ? (status.enabled === true || status.enabled === 'true') : false;\n\t\t\tvar running = status ? (status.running === true || status.running === 'true') : false;\n\t\t\t\n\t\t\tvar buttons = [];\n\t\t\t\n\t\t\t// Running control: show Start if not running, show Stop and Restart if running\n\t\t\tif (!running) {\n\t\t\t\tbuttons.push(\n\t\t\t\t\tE('button', {\n\t\t\t\t\t\t'class': 'cbi-button cbi-button-action',\n\t\t\t\t\t\t'id': 'rc-start-button',\n\t\t\t\t\t\t'click': ui.createHandlerFn(this, function() {\n\t\t\t\t\t\t\tvar self = this;\n\t\t\t\t\t\t\treturn callInitAction('qmodem_network', 'start')\n\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('QModem Network started successfully')));\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to start QModem Network: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t}, _('Start'))\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tbuttons.push(\n\t\t\t\t\tE('button', {\n\t\t\t\t\t\t'class': 'cbi-button cbi-button-reset',\n\t\t\t\t\t\t'id': 'rc-stop-button',\n\t\t\t\t\t\t'click': ui.createHandlerFn(this, function() {\n\t\t\t\t\t\t\tvar self = this;\n\t\t\t\t\t\t\treturn callInitAction('qmodem_network', 'stop')\n\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('QModem Network stopped successfully')));\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to stop QModem Network: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t}, _('Stop'))\n\t\t\t\t);\n\t\t\t\tbuttons.push(\n\t\t\t\t\tE('button', {\n\t\t\t\t\t\t'class': 'cbi-button cbi-button-apply',\n\t\t\t\t\t\t'id': 'rc-restart-button',\n\t\t\t\t\t\t'click': ui.createHandlerFn(this, function() {\n\t\t\t\t\t\t\tvar self = this;\n\t\t\t\t\t\t\treturn callInitAction('qmodem_network', 'restart')\n\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('QModem Network restarted successfully')));\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to restart QModem Network: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t}, _('Restart'))\n\t\t\t\t);\n\t\t\t}\n\t\t\t\n\t\t\tbuttons.push(E('span', { 'style': 'margin: 0 8px;' }, ' | '));\n\n\t\t\t// Enabled control: show Enable if not enabled, show Disable if enabled\n\t\t\tif (!enabled) {\n\t\t\t\tbuttons.push(\n\t\t\t\t\tE('button', {\n\t\t\t\t\t\t'class': 'cbi-button cbi-button-apply',\n\t\t\t\t\t\t'id': 'rc-enable-button',\n\t\t\t\t\t\t'click': ui.createHandlerFn(this, function() {\n\t\t\t\t\t\t\tvar self = this;\n\t\t\t\t\t\t\treturn callInitAction('qmodem_network', 'enable')\n\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('QModem Network enabled successfully')));\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to enable QModem Network: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t}, _('Enable'))\n\t\t\t\t);\n\t\t\t} else {\n\t\t\t\tbuttons.push(\n\t\t\t\t\tE('button', {\n\t\t\t\t\t\t'class': 'cbi-button cbi-button-negative',\n\t\t\t\t\t\t'id': 'rc-disable-button',\n\t\t\t\t\t\t'click': ui.createHandlerFn(this, function() {\n\t\t\t\t\t\t\tvar self = this;\n\t\t\t\t\t\t\treturn callInitAction('qmodem_network', 'disable')\n\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('QModem Network disabled successfully')));\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to disable QModem Network: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t})\n\t\t\t\t\t}, _('Disable'))\n\t\t\t\t);\n\t\t\t}\n\t\t\t\n\t\t\treturn E('div', { id: 'rc-control-container' }, buttons);\n\t\t}, this);\n\n\t// Dial Configuration Section (Per-Modem)\n\ts = m.section(form.GridSection, 'modem-device', _('Dial Configuration'));\n\ts.anonymous = false;\n\ts.addremove = false;\n\ts.modaltitle = L.bind(function(section_id) {\n\t\tvar name = uci.get('qmodem', section_id, 'name');\n\t\tvar alias = uci.get('qmodem', section_id, 'alias');\n\t\treturn _('Dial Configuration') + ': ' + (alias || name || section_id);\n\t}, this);\n\n\t// Connection Status Indicator\n\to = s.option(form.DummyValue, '_status_indicator', _('Status'));\n\to.rawhtml = true;\n\to.editable = true;\n\to.width = '60px';\n\to.cfgvalue = L.bind(function(section_id) {\n\t\tvar color = '#999'; // Gray (default/loading)\n\t\tvar title = _('Loading...');\n\t\t\n\t\t// Use preloaded data if available\n\t\tif (this.connectionStatusData && this.connectionStatusData[section_id]) {\n\t\t\tvar result = this.connectionStatusData[section_id];\n\t\t\tif (result && result.connection_status !== undefined) {\n\t\t\t\tvar status = result.connection_status.toString().toLowerCase();\n\t\t\t\tif (status === 'yes' || status === 'true' || status === true) {\n\t\t\t\t\tcolor = '#00FF00'; // Green (connected)\n\t\t\t\t\ttitle = _('Connected');\n\t\t\t\t} else if (status === 'no' || status === 'false' || status === false) {\n\t\t\t\t\tcolor = '#FF0000'; // Red (disconnected)\n\t\t\t\t\ttitle = _('Disconnected');\n\t\t\t\t} else {\n\t\t\t\t\tcolor = '#FFA500'; // Yellow (unknown)\n\t\t\t\t\ttitle = _('Unknown');\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t\n\t\treturn E('div', {\n\t\t\t'id': 'status-indicator-' + section_id,\n\t\t\t'style': 'text-align: center;'\n\t\t}, [\n\t\t\tE('span', {\n\t\t\t\t'style': 'display: inline-block; width: 12px; height: 12px; border-radius: 50%; background-color: ' + color + ';',\n\t\t\t\t'title': title\n\t\t\t})\n\t\t]);\n\t}, this);\n\n\to = s.option(form.Flag, 'enable_dial', _('Enable Dial'));\n\t\to.default = '0';\n\t\to.rmempty = false;\n\t\to.editable = true;\n\n\t\to = s.option(form.DummyValue, 'name', _('Modem Model'));\n\t\to.cfgvalue = function(section_id) {\n\t\t\tvar name = uci.get('qmodem', section_id, 'name') || '';\n\t\t\treturn name.toUpperCase();\n\t\t};\n\n\t\to = s.option(form.DummyValue, 'alias', _('Modem Alias'));\n\t\to.cfgvalue = function(section_id) {\n\t\t\treturn uci.get('qmodem', section_id, 'alias') || '-';\n\t\t};\n\n\to = s.option(form.DummyValue, 'state', _('Status'));\n\to.cfgvalue = function(section_id) {\n\t\tvar state = uci.get('qmodem', section_id, 'state');\n\t\treturn state ? _(state.toUpperCase()) : _('Unknown');\n\t};\n\n\t// Dial Log View Button\n\to = s.option(form.DummyValue, '_dial_log', _('Dial Log'));\n\to.rawhtml = true;\n\to.modalonly = false;\n\to.editable = true;\n\to.cfgvalue = L.bind(function(section_id) {\n\t\tvar enable_dial = uci.get('qmodem', section_id, 'enable_dial');\n\t\tif (enable_dial === '0') {\n\t\t\treturn E('span', {}, '-');\n\t\t}\n\t\t\n\t\treturn E('button', {\n\t\t\t'class': 'cbi-button cbi-button-action',\n\t\t\t'click': ui.createHandlerFn(this, function(section_id) {\n\t\t\t\tthis.showDialLogDialog(section_id);\n\t\t\t}, section_id)\n\t\t}, _('View Log'));\n\t}, this);\n\n\t// Dial Control Buttons\n\to = s.option(form.DummyValue, '_dial_controls', _('Dial Control'));\n\t\to.rawhtml = true;\n\t\to.modalonly = false;\n\t\to.editable = true;\n\t\to.cfgvalue = function(section_id) {\n\t\t\tvar enable_dial = uci.get('qmodem', section_id, 'enable_dial');\n\t\t\tif (enable_dial === '0') {\n\t\t\t\treturn E('div', {}, _('Dial disabled for this modem'));\n\t\t\t}\n\t\t\t\n\t\t\treturn E('div', { \n\t\t\t\t'class': 'cbi-value-field', \n\t\t\t\t'id': 'dial-controls-' + section_id,\n\t\t\t\t'data-section': section_id\n\t\t\t}, [\n\t\t\t\tE('span', {}, _('Loading...'))\n\t\t\t]);\n\t\t};\n\n\t// ============ Modal Configuration Options ============\n\t\n\t// General Settings\n\to = s.option(form.Value, 'alias', _('Modem Alias'));\n\to.rmempty = true;\n\to.modalonly = true;\n\n\to = s.option(form.DynamicList, 'dns_list', _('DNS'));\n\to.placeholder = _('If the DNS server is not set, it will use the DNS server leased by the operator.');\n\to.rmempty = true;\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'use_ubus', _('Use Ubus'));\n\to.default = '0';\n\to.rmempty = false;\n\to.modalonly = true;\n\n\t// Advanced Settings\n\to = s.option(form.Flag, 'force_set_apn', _('Force Set APN'));\n\to.description = _('If enabled, the APN will be set even if it matches the current configuration.(only works with tom modified version of quectel-cm)');\n\to.default = '0';\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'en_bridge', _('Bridge Mode'));\n\to.description = _('Caution: Only avalible for quectel sdx 5G Modem.');\n\to.default = '0';\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'bridge_port', _('Bridge Port'));\n\to.description = _('Device-level bridge port for passthrough. If set, it overrides the slot default bridge port.');\n\to.rmempty = true;\n\to.modalonly = true;\n\tif (this.networkInterfaces && this.networkInterfaces.length > 0) {\n\t\tthis.networkInterfaces.forEach(function(iface) {\n\t\t\to.value(iface.id, iface.label);\n\t\t});\n\t}\n\n\to = s.option(form.Flag, 'do_not_add_dns', _('Do Not modify resolv.conf'));\n\to.description = _('quectel-CM will append the DNS server to the resolv.conf file by default.if you do not want to modify the resolv.conf file, please check this option.');\n\to.default = '0';\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'donot_nat', _('Do Not NAT(Only for Quectel Modem)'));\n\to.description = _('If enabled, will turn off NAT function on quectel modem.');\n\to.default = '0';\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'ra_master', _('RA Master'));\n\to.description = _('Caution: Enabling this option will make it the IPV6 RA Master, and only one interface can be configured as such.');\n\to.default = '0';\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.Flag, 'extend_prefix', _('Extend Prefix'));\n\to.description = _('Once checking, the prefix will be apply to lan zone');\n\to.default = '0';\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'pdp_index', _('PDP Context Index'));\n\to.rmempty = true;\n\to.modalonly = true;\n\n\to = s.option(form.ListValue, 'pdp_type', _('PDP Type'));\n\to.value('ip', _('IPv4'));\n\to.value('ipv6', _('IPv6'));\n\to.value('ipv4v6', _('IPv4/IPv6'));\n\to.default = 'ipv4v6';\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'apn', _('APN'));\n\to.placeholder = _('Auto Choose');\n\to.rmempty = true;\n\to.modalonly = true;\n\to.value('', _('Auto Choose'));\n\to.value('cmnet', _('China Mobile (CN)'));\n\to.value('3gnet', _('China Unicom (CN)'));\n\to.value('ctnet', _('China Telecom (CN)'));\n\to.value('cbnet', _('China Broadcast (CN)'));\n\to.value('5gscuiot', _('Skytone (CN)'));\n\t// Switzerland (CH)\n\to.value('gprs.swisscom.ch', _('Swisscom (CH)'));\n\to.value('internet', 'Salt (CH), Sunrise (CH), O2 (DE), 1&1 (DE)');\n\t// Germany (DE)\n\to.value('web.vodafone.de', _('Vodafone (DE)'));\n\to.value('internet.telekom', _('Telekom (DE)'));\n\to.value('internet.eplus.de', _('E-Plus (DE)'));\n\t// Austria (AT)\n\to.value('A1.net', _('A1 (AT)'));\n\to.value('drei.at', _('Drei (AT)'));\n\to.value('internet.t-mobile.at', _('Magenta (AT)'));\n\t// Philippines (PH)\n\to.value('http.globe.com.ph', _('Globe Prepaid (PH)'));\n\to.value('internet.globe.com.ph', _('Globe Postpaid (PH)'));\n\to.value('internet', _('Smart Communications (PH)'));\n\to.value('internet.dito.ph', _('Dito Telecomunity (PH)'));\n\t// Malaysia (MY)\n\to.value('celcom3g', _('Celcom (MY)'));\n\to.value('diginet', _('DiGi (MY)'));\n\to.value('unet', _('Maxis | Hotlink (MY)'));\n\to.value('hos', _('Maxis UT (MY)'));\n\to.value('yes4g', _('YES (MY)'));\n\to.value('my3g', _('UMobile (MY)'));\n\to.value('unifi', _('Unifi (MY)'));\n\t// Russia (RU)\n\to.value('internet.beeline.ru', _('Beeline (RU)'));\n\to.value('internet.mts.ru', _('MTS (RU)'));\n\to.value('internet', _('Megafon (RU)'));\n\to.value('internet.tele2.ru', _('Tele2 (RU)'));\n\to.value('internet.yota', _('Yota (RU)'));\n\to.value('m.tinkoff', _('T-mobile (RU)'));\n\to.value('internet.rtk.ru', _('Rostelecom (RU)'));\n\to.value('internet.sberbank-tele.com', _('Sber Mobile (RU)'));\n\n\to = s.option(form.ListValue, 'auth', _('Authentication Type'));\n\to.value('none', _('NONE'));\n\to.value('MsChapV2', _('MsChapV2'));\n\to.value('pap', 'PAP');\n\to.value('chap', 'CHAP');\n\to.default = 'none';\n\to.rmempty = false;\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'username', _('PAP/CHAP Username'));\n\to.rmempty = true;\n\to.modalonly = true;\n\to.depends('auth', 'both');\n\to.depends('auth', 'pap');\n\to.depends('auth', 'chap');\n\to.depends('auth', 'MsChapV2');\n\n\to = s.option(form.Value, 'password', _('PAP/CHAP Password'));\n\to.password = true;\n\to.rmempty = true;\n\to.modalonly = true;\n\to.depends('auth', 'both');\n\to.depends('auth', 'pap');\n\to.depends('auth', 'chap');\n\to.depends('auth', 'MsChapV2');\n\n\to = s.option(form.Value, 'pincode', _('PIN Code'));\n\to.description = _('If the PIN code is not set, leave it blank.');\n\to.rmempty = true;\n\to.modalonly = true;\n\n\t// Slot 2 Configuration\n\to = s.option(form.Value, 'apn2', _('APN') + ' 2');\n\to.description = _('If slot 2 config is not set,will use slot 1 config.');\n\to.placeholder = _('Auto Choose');\n\to.rmempty = true;\n\to.modalonly = true;\n\to.value('', _('Auto Choose'));\n\to.value('cmnet', _('China Mobile (CN)'));\n\to.value('3gnet', _('China Unicom (CN)'));\n\to.value('ctnet', _('China Telecom (CN)'));\n\to.value('cbnet', _('China Broadcast (CN)'));\n\to.value('5gscuiot', _('Skytone (CN)'));\n\t// Switzerland (CH)\n\to.value('gprs.swisscom.ch', _('Swisscom (CH)'));\n\to.value('internet', 'Salt (CH), Sunrise (CH), O2 (DE), 1&1 (DE)');\n\t// Germany (DE)\n\to.value('web.vodafone.de', _('Vodafone (DE)'));\n\to.value('internet.telekom', _('Telekom (DE)'));\n\to.value('internet.eplus.de', _('E-Plus (DE)'));\n\t// Austria (AT)\n\to.value('A1.net', _('A1 (AT)'));\n\to.value('drei.at', _('Drei (AT)'));\n\to.value('internet.t-mobile.at', _('Magenta (AT)'));\n\t// Philippines (PH)\n\to.value('http.globe.com.ph', _('Globe Prepaid (PH)'));\n\to.value('internet.globe.com.ph', _('Globe Postpaid (PH)'));\n\to.value('internet', _('Smart Communications (PH)'));\n\to.value('internet.dito.ph', _('Dito Telecomunity (PH)'));\n\t// Malaysia (MY)\n\to.value('celcom3g', _('Celcom (MY)'));\n\to.value('diginet', _('DiGi (MY)'));\n\to.value('unet', _('Maxis | Hotlink (MY)'));\n\to.value('hos', _('Maxis UT (MY)'));\n\to.value('yes4g', _('YES (MY)'));\n\to.value('my3g', _('UMobile (MY)'));\n\to.value('unifi', _('Unifi (MY)'));\n\t// Russia (RU)\n\to.value('internet.beeline.ru', _('Beeline (RU)'));\n\to.value('internet.mts.ru', _('MTS (RU)'));\n\to.value('internet', _('Megafon (RU)'));\n\to.value('internet.tele2.ru', _('Tele2 (RU)'));\n\to.value('internet.yota', _('Yota (RU)'));\n\to.value('m.tinkoff', _('T-mobile (RU)'));\n\to.value('internet.rtk.ru', _('Rostelecom (RU)'));\n\to.value('internet.sberbank-tele.com', _('Sber Mobile (RU)'));\n\n\to = s.option(form.Value, 'metric', _('Metric'));\n\to.description = _('The metric value is used to determine the priority of the route. The smaller the value, the higher the priority. Cannot duplicate.');\n\to.default = '10';\n\to.rmempty = true;\n\to.modalonly = true;\n\n\t// Pre Dial Delay\n\to = s.option(form.Value, 'pre_dial_delay', _('Pre Dial Delay') + ' ' + _('(beta)'));\n\to.description = _('Delay of executing AT command before dialing, in seconds.') + _('(still in beta)');\n\to.placeholder = _('Enter delay in seconds');\n\to.default = '0';\n\to.datatype = 'uinteger';\n\to.rmempty = true;\n\to.modalonly = true;\n\n\t// Post Init Delay\n\to = s.option(form.Value, 'post_init_delay', _('Post Init Delay') + ' ' + _('(beta)'));\n\to.description = _('Delay of executing AT command after modem initialization, in seconds.') + _('(still in beta)');\n\to.placeholder = _('Enter delay in seconds');\n\to.default = '0';\n\to.datatype = 'uinteger';\n\to.rmempty = true;\n\to.modalonly = true;\n\n\t// Post Init AT Commands\n\to = s.option(form.DynamicList, 'post_init_at_cmds', _('Post Init AT Commands') + ' ' + _('(beta)'));\n\to.description = _('AT commands to execute after modem initialization.') + _('(still in beta)');\n\to.placeholder = _('Enter AT commands');\n\to.rmempty = true;\n\to.modalonly = true;\n\n\t// Pre Dial AT Commands\n\to = s.option(form.DynamicList, 'pre_dial_at_cmds', _('Pre Dial AT Commands') + ' ' + _('(beta)'));\n\to.description = _('AT commands to execute before dialing.') + _('(still in beta)');\n\to.placeholder = _('Enter AT commands');\n\to.rmempty = true;\n\to.modalonly = true;\n\n\treturn m.render().then(L.bind(function(rendered) {\n\t\t\t// Update dial controls for all modems\n\t\t\tthis.updateAllDialControls();\n\t\t\t// Update connection status indicators\n\t\t\tthis.updateAllStatusIndicators();\n\t\t\t// Start polling for dial status\n\t\t\tthis.startDialStatusPolling();\n\t\t\t// Start polling for connection status\n\t\t\tthis.startStatusIndicatorPolling();\n\t\t\t// Start polling for RC status\n\t\t\tthis.startRcStatusPolling();\n\t\t\treturn rendered;\n\t\t}, this));\n\t},\n\n\tupdateDialControls: function(section_id, isRunning) {\n\t\tvar container = document.getElementById('dial-controls-' + section_id);\n\t\tif (!container) return;\n\n\t\t// Clear existing content\n\t\twhile (container.firstChild) {\n\t\t\tcontainer.removeChild(container.firstChild);\n\t\t}\n\n\t\tvar buttons = [];\n\t\t\n\t\tif (isRunning) {\n\t\t\t// Show Hang and ReDial buttons when service is running\n\t\t\tbuttons.push(\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'cbi-button cbi-button-reset',\n\t\t\t\t\t'click': ui.createHandlerFn(this, function(section_id) {\n\t\t\t\t\t\treturn qmodem.modemHang(section_id).then(L.bind(function(result) {\n\t\t\t\t\t\t\tif (result && result.result && result.result.status === '1') {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Hang command sent successfully')));\n\t\t\t\t\t\t\t\t// Update status after hang\n\t\t\t\t\t\t\t\tsetTimeout(L.bind(function() {\n\t\t\t\t\t\t\t\t\tthis.updateDialControlsForSection(section_id);\n\t\t\t\t\t\t\t\t}, this), 1000);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to send hang command')), 'error');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, this)).catch(function(err) {\n\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Error: ') + err.message), 'error');\n\t\t\t\t\t\t});\n\t\t\t\t\t}, section_id)\n\t\t\t\t}, _('Hang')),\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'cbi-button cbi-button-apply',\n\t\t\t\t\t'click': ui.createHandlerFn(this, function(section_id) {\n\t\t\t\t\t\treturn qmodem.modemRedial(section_id).then(function(result) {\n\t\t\t\t\t\t\tif (result && result.result && result.result.status === '1') {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Redial command sent successfully')));\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to send redial command')), 'error');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}).catch(function(err) {\n\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Error: ') + err.message), 'error');\n\t\t\t\t\t\t});\n\t\t\t\t\t}, section_id)\n\t\t\t\t}, _('ReDial'))\n\t\t\t);\n\t\t} else {\n\t\t\t// Show Dial button when service is not running\n\t\t\tbuttons.push(\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'cbi-button cbi-button-action',\n\t\t\t\t\t'click': ui.createHandlerFn(this, function(section_id) {\n\t\t\t\t\t\treturn qmodem.modemDial(section_id).then(L.bind(function(result) {\n\t\t\t\t\t\t\tif (result && result.result && result.result.status === '1') {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Dial command sent successfully')));\n\t\t\t\t\t\t\t\t// Update status after dial\n\t\t\t\t\t\t\t\tsetTimeout(L.bind(function() {\n\t\t\t\t\t\t\t\t\tthis.updateDialControlsForSection(section_id);\n\t\t\t\t\t\t\t\t}, this), 1000);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to send dial command')), 'error');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, this)).catch(function(err) {\n\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Error: ') + err.message), 'error');\n\t\t\t\t\t\t});\n\t\t\t\t\t}, section_id)\n\t\t\t\t}, _('Dial'))\n\t\t\t);\n\t\t}\n\n\t\tbuttons.forEach(function(btn) {\n\t\t\tcontainer.appendChild(btn);\n\t\t});\n\t},\n\n\tupdateDialControlsForSection: function(section_id) {\n\t\treturn qmodem.getDialStatus(section_id).then(L.bind(function(result) {\n\t\t\tif (result && result.running !== undefined) {\n\t\t\t\tvar isRunning = (result.running === 'true' || result.running === true);\n\t\t\t\tthis.updateDialControls(section_id, isRunning);\n\t\t\t}\n\t\t}, this)).catch(function(err) {\n\t\t\tconsole.error('Failed to get dial status for ' + section_id + ':', err);\n\t\t});\n\t},\n\n\tupdateAllDialControls: function() {\n\t\tvar sections = uci.sections('qmodem', 'modem-device');\n\t\tsections.forEach(L.bind(function(section) {\n\t\t\tvar enable_dial = uci.get('qmodem', section['.name'], 'enable_dial');\n\t\t\tif (enable_dial !== '0') {\n\t\t\t\tthis.updateDialControlsForSection(section['.name']);\n\t\t\t}\n\t\t}, this));\n\t},\n\n\tstartDialStatusPolling: function() {\n\t\tpoll.add(L.bind(function() {\n\t\t\tthis.updateAllDialControls();\n\t\t}, this), 5);\n\t},\n\n\tupdateStatusIndicator: function(section_id) {\n\t\tvar container = document.getElementById('status-indicator-' + section_id);\n\t\tif (!container) return;\n\n\t\treturn qmodem.getConnectStatus(section_id).then(L.bind(function(result) {\n\t\t\t// Update cached data\n\t\t\tif (!this.connectionStatusData) {\n\t\t\t\tthis.connectionStatusData = {};\n\t\t\t}\n\t\t\tthis.connectionStatusData[section_id] = result;\n\t\t\t\n\t\t\tvar color = '#FFA500'; // Yellow (default for error/unknown)\n\t\t\tvar title = _('Unknown');\n\n\t\t\tif (result && result.connection_status !== undefined) {\n\t\t\t\tvar status = result.connection_status;\n\t\t\t\tstatus = status.toString().toLowerCase();\n\t\t\t\tif (status === 'yes' || status === 'true' || status === true) {\n\t\t\t\t\tcolor = '#00FF00'; // Green (connected)\n\t\t\t\t\ttitle = _('Connected');\n\t\t\t\t} else if (status === 'no' || status === 'false' || status === false) {\n\t\t\t\t\tcolor = '#FF0000'; // Red (disconnected)\n\t\t\t\t\ttitle = _('Disconnected');\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Update the dot color\n\t\t\twhile (container.firstChild) {\n\t\t\t\tcontainer.removeChild(container.firstChild);\n\t\t\t}\n\t\t\tcontainer.appendChild(\n\t\t\t\tE('span', {\n\t\t\t\t\t'style': 'display: inline-block; width: 12px; height: 12px; border-radius: 50%; background-color: ' + color + ';',\n\t\t\t\t\t'title': title\n\t\t\t\t})\n\t\t\t);\n\t\t}, this)).catch(function(err) {\n\t\t\t// On error, show yellow dot\n\t\t\twhile (container.firstChild) {\n\t\t\t\tcontainer.removeChild(container.firstChild);\n\t\t\t}\n\t\t\tcontainer.appendChild(\n\t\t\t\tE('span', {\n\t\t\t\t\t'style': 'display: inline-block; width: 12px; height: 12px; border-radius: 50%; background-color: #FFA500;',\n\t\t\t\t\t'title': _('Error: ') + err.message\n\t\t\t\t})\n\t\t\t);\n\t\t});\n\t},\n\n\tupdateAllStatusIndicators: function() {\n\t\tvar sections = uci.sections('qmodem', 'modem-device');\n\t\tsections.forEach(L.bind(function(section) {\n\t\t\tthis.updateStatusIndicator(section['.name']);\n\t\t}, this));\n\t},\n\n\tstartStatusIndicatorPolling: function() {\n\t\tpoll.add(L.bind(function() {\n\t\t\tthis.updateAllStatusIndicators();\n\t\t}, this), 5);\n\t},\n\n\tstartRcStatusPolling: function() {\n\t\tpoll.add(L.bind(function() {\n\t\t\tthis.updateRcStatus();\n\t\t}, this), 10);\n\t},\n\n\tupdateRcStatus: function() {\n\t\tvar statusContainer = document.getElementById('rc-status-container');\n\t\tvar controlContainer = document.getElementById('rc-control-container');\n\n\t\tif (!statusContainer || !controlContainer) {\n\t\t\treturn Promise.resolve();\n\t\t}\n\n\t\treturn qmodem.rcStatus('qmodem_network').then(L.bind(function(result) {\n\t\t\tthis.rcStatusData = result;\n\t\t\tvar status = result && result.qmodem_network ? result.qmodem_network : null;\n\n\t\t\t// Update status display\n\t\t\twhile (statusContainer.firstChild) {\n\t\t\t\tstatusContainer.removeChild(statusContainer.firstChild);\n\t\t\t}\n\n\t\t\tif (status) {\n\t\t\t\tvar enabled = status.enabled === true || status.enabled === 'true';\n\t\t\t\tvar running = status.running === true || status.running === 'true';\n\n\t\t\t\tstatusContainer.appendChild(E('div', {}, [\n\t\t\t\t\tE('span', {}, _('Enabled') + ': ' + (enabled ? _('Yes') : _('No'))),\n\t\t\t\t\tE('span', { 'style': 'margin-left: 12px;' }, _('Running') + ': ' + (running ? _('Yes') : _('No')))\n\t\t\t\t]));\n\n\t\t\t\t// Update control buttons\n\t\t\t\twhile (controlContainer.firstChild) {\n\t\t\t\t\tcontrolContainer.removeChild(controlContainer.firstChild);\n\t\t\t\t}\n\n\t\t\t\tvar buttons = [];\n\n\t\t\t\t// Running control: show Start if not running, show Stop and Restart if running\n\t\t\t\tif (!running) {\n\t\t\t\t\tbuttons.push(\n\t\t\t\t\t\tE('button', {\n\t\t\t\t\t\t\t'class': 'cbi-button cbi-button-action',\n\t\t\t\t\t\t\t'id': 'rc-start-button',\n\t\t\t\t\t\t\t'click': ui.createHandlerFn(this, function() {\n\t\t\t\t\t\t\t\tvar self = this;\n\t\t\t\t\t\t\t\treturn callInitAction('qmodem_network', 'start')\n\t\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('QModem Network started successfully')));\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to start QModem Network: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}, _('Start'))\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tbuttons.push(\n\t\t\t\t\t\tE('button', {\n\t\t\t\t\t\t\t'class': 'cbi-button cbi-button-reset',\n\t\t\t\t\t\t\t'id': 'rc-stop-button',\n\t\t\t\t\t\t\t'click': ui.createHandlerFn(this, function() {\n\t\t\t\t\t\t\t\tvar self = this;\n\t\t\t\t\t\t\t\treturn callInitAction('qmodem_network', 'stop')\n\t\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('QModem Network stopped successfully')));\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to stop QModem Network: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}, _('Stop'))\n\t\t\t\t\t);\n\t\t\t\t\tbuttons.push(\n\t\t\t\t\t\tE('button', {\n\t\t\t\t\t\t\t'class': 'cbi-button cbi-button-apply',\n\t\t\t\t\t\t\t'id': 'rc-restart-button',\n\t\t\t\t\t\t\t'click': ui.createHandlerFn(this, function() {\n\t\t\t\t\t\t\t\tvar self = this;\n\t\t\t\t\t\t\t\treturn callInitAction('qmodem_network', 'restart')\n\t\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('QModem Network restarted successfully')));\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to restart QModem Network: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}, _('Restart'))\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tbuttons.push(E('span', { 'style': 'margin: 0 8px;' }, ' | '));\n\n\t\t\t\t// Enabled control: show Enable if not enabled, show Disable if enabled\n\t\t\t\tif (!enabled) {\n\t\t\t\t\tbuttons.push(\n\t\t\t\t\t\tE('button', {\n\t\t\t\t\t\t\t'class': 'cbi-button cbi-button-apply',\n\t\t\t\t\t\t\t'id': 'rc-enable-button',\n\t\t\t\t\t\t\t'click': ui.createHandlerFn(this, function() {\n\t\t\t\t\t\t\t\tvar self = this;\n\t\t\t\t\t\t\t\treturn callInitAction('qmodem_network', 'enable')\n\t\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('QModem Network enabled successfully')));\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to enable QModem Network: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}, _('Enable'))\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tbuttons.push(\n\t\t\t\t\t\tE('button', {\n\t\t\t\t\t\t\t'class': 'cbi-button cbi-button-negative',\n\t\t\t\t\t\t\t'id': 'rc-disable-button',\n\t\t\t\t\t\t\t'click': ui.createHandlerFn(this, function() {\n\t\t\t\t\t\t\t\tvar self = this;\n\t\t\t\t\t\t\t\treturn callInitAction('qmodem_network', 'disable')\n\t\t\t\t\t\t\t\t\t.then(function() {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('QModem Network disabled successfully')));\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t})\n\t\t\t\t\t\t\t\t\t.catch(function(err) {\n\t\t\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to disable QModem Network: ') + err.message), 'error');\n\t\t\t\t\t\t\t\t\t\treturn self.updateRcStatus();\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t})\n\t\t\t\t\t\t}, _('Disable'))\n\t\t\t\t\t);\n\t\t\t\t}\n\n\t\t\t\tbuttons.forEach(function(btn) {\n\t\t\t\t\tcontrolContainer.appendChild(btn);\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tstatusContainer.appendChild(E('span', {}, _('Failed to load status')));\n\t\t\t}\n\t\t}, this)).catch(L.bind(function(err) {\n\t\t\twhile (statusContainer.firstChild) {\n\t\t\t\tstatusContainer.removeChild(statusContainer.firstChild);\n\t\t\t}\n\t\t\tstatusContainer.appendChild(E('span', {}, _('Error: ') + err.message));\n\t\t}, this));\n\t},\n\n\tshowDialLogDialog: function(section_id) {\n\t\tvar name = uci.get('qmodem', section_id, 'name');\n\t\tvar alias = uci.get('qmodem', section_id, 'alias');\n\t\tvar title = (alias || name || section_id) + ' - ' + _('Dial Log');\n\t\t\n\t\tvar logContent = E('div', { 'style': 'min-height: 300px;' }, [\n\t\t\tE('div', { 'style': 'text-align: center; padding: 20px;' }, [\n\t\t\t\tE('span', { 'class': 'spinning' }, _('Loading...'))\n\t\t\t])\n\t\t]);\n\n\t\tvar dialog = ui.showModal(title, [\n\t\t\tE('style', {}, '\\\n\t\t\t\t.dial-log-content { \\\n\t\t\t\t\tpadding: 10px; \\\n\t\t\t\t\tborder-radius: 3px; \\\n\t\t\t\t\tmax-height: 400px; \\\n\t\t\t\t\twidth: 100%; \\\n\t\t\t\t\toverflow-y: auto; \\\n\t\t\t\t\tfont-family: monospace; \\\n\t\t\t\t\tfont-size: 12px; \\\n\t\t\t\t\twhite-space: pre-wrap; \\\n\t\t\t\t\tword-wrap: break-word; \\\n\t\t\t\t} \\\n\t\t\t\t.dial-log-empty { \\\n\t\t\t\t\ttext-align: center; \\\n\t\t\t\t\tpadding: 40px; \\\n\t\t\t\t}'),\n\t\t\tlogContent,\n\t\t\tE('div', { 'class': 'right' }, [\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'cbi-button cbi-button-action',\n\t\t\t\t\t'click': L.bind(function() {\n\t\t\t\t\t\tthis.downloadDialLog(section_id);\n\t\t\t\t\t}, this)\n\t\t\t\t}, _('Download')),\n\t\t\t\t' ',\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'cbi-button cbi-button-reset',\n\t\t\t\t\t'click': L.bind(function() {\n\t\t\t\t\t\tthis.clearDialLogDialog(section_id, logContent);\n\t\t\t\t\t}, this)\n\t\t\t\t}, _('Clear')),\n\t\t\t\t' ',\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'cbi-button cbi-button-neutral',\n\t\t\t\t\t'click': ui.hideModal\n\t\t\t\t}, _('Close'))\n\t\t\t])\n\t\t], 'cbi-modal');\n\n\t\t// Load log content\n\t\tthis.loadDialLog(section_id, logContent);\n\t},\n\n\tloadDialLog: function(section_id, container) {\n\t\treturn qmodem.getDialLog(section_id).then(function(result) {\n\t\t\twhile (container.firstChild) {\n\t\t\t\tcontainer.removeChild(container.firstChild);\n\t\t\t}\n\n\t\t\tif (result && result.log) {\n\t\t\t\tif (result.log.trim() === '') {\n\t\t\t\t\tcontainer.appendChild(\n\t\t\t\t\t\tE('div', { 'class': 'dial-log-empty' }, _('No log available'))\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tcontainer.appendChild(\n\t\t\t\t\t\t\tE('textarea', { 'class': 'dial-log-content','readonly':'readonly','rows':'20','maxlength':'160' }, result.log)\n\t\t\t\t\t);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tcontainer.appendChild(\n\t\t\t\t\tE('div', { 'class': 'dial-log-empty' }, _('Failed to load log'))\n\t\t\t\t);\n\t\t\t}\n\t\t}).catch(function(err) {\n\t\t\twhile (container.firstChild) {\n\t\t\t\tcontainer.removeChild(container.firstChild);\n\t\t\t}\n\t\t\tcontainer.appendChild(\n\t\t\t\tE('div', { 'class': 'dial-log-empty' }, _('Error: ') + err.message)\n\t\t\t);\n\t\t});\n\t},\n\n\tdownloadDialLog: function(section_id) {\n\t\treturn qmodem.getDialLog(section_id).then(function(result) {\n\t\t\tif (result && result.log) {\n\t\t\t\tvar name = uci.get('qmodem', section_id, 'name') || section_id;\n\t\t\t\tvar alias = uci.get('qmodem', section_id, 'alias') || '';\n\t\t\t\tvar filename = 'dial_log_' + (alias || name) + '_' + \n\t\t\t\t\tnew Date().toISOString().replace(/[:.]/g, '-').slice(0, -5) + '.txt';\n\t\t\t\t\n\t\t\t\tvar blob = new Blob([result.log], { type: 'text/plain' });\n\t\t\t\tvar url = window.URL.createObjectURL(blob);\n\t\t\t\tvar a = document.createElement('a');\n\t\t\t\ta.href = url;\n\t\t\t\ta.download = filename;\n\t\t\t\tdocument.body.appendChild(a);\n\t\t\t\ta.click();\n\t\t\t\twindow.URL.revokeObjectURL(url);\n\t\t\t\tdocument.body.removeChild(a);\n\t\t\t\t\n\t\t\t\tui.addNotification(null, E('p', _('Log downloaded successfully')));\n\t\t\t} else {\n\t\t\t\tui.addNotification(null, E('p', _('No log content to download')), 'warning');\n\t\t\t}\n\t\t}).catch(function(err) {\n\t\t\tui.addNotification(null, E('p', _('Failed to download log: ') + err.message), 'error');\n\t\t});\n\t},\n\n\tclearDialLogDialog: function(section_id, container) {\n\t\tui.showModal(_('Clear Dial Log'), [\n\t\t\tE('p', {}, _('Are you sure you want to clear the dial log?')),\n\t\t\tE('div', { 'class': 'right' }, [\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'cbi-button cbi-button-neutral',\n\t\t\t\t\t'click': ui.hideModal\n\t\t\t\t}, _('Cancel')),\n\t\t\t\t' ',\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'cbi-button cbi-button-negative',\n\t\t\t\t\t'click': L.bind(function() {\n\t\t\t\t\t\tqmodem.clearDialLog(section_id).then(L.bind(function(result) {\n\t\t\t\t\t\t\tif (result && result.result && result.result.status === '1') {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Log cleared successfully')));\n\t\t\t\t\t\t\t\tui.hideModal();\n\t\t\t\t\t\t\t\t// Reload the main dialog\n\t\t\t\t\t\t\t\tsetTimeout(L.bind(function() {\n\t\t\t\t\t\t\t\t\tthis.showDialLogDialog(section_id);\n\t\t\t\t\t\t\t\t}, this), 300);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to clear log')), 'error');\n\t\t\t\t\t\t\t\tui.hideModal();\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}, this)).catch(function(err) {\n\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Error: ') + err.message), 'error');\n\t\t\t\t\t\t\tui.hideModal();\n\t\t\t\t\t\t});\n\t\t\t\t\t}, this)\n\t\t\t\t}, _('Confirm'))\n\t\t\t])\n\t\t]);\n\t},\n\n\thandleSaveApply: function(ev, mode) {\n\t\treturn this.handleSave(ev).then(function() {\n\t\t\treturn callInitAction('qmodem_network', 'reload');\n\t\t});\n\t},\n\n\thandleSave: function(ev) {\n\t\treturn this.super('handleSave', arguments);\n\t}\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/htdocs/luci-static/resources/view/qmodem/overview.js",
    "content": "'use strict';\n'require view';\n'require poll';\n'require ui';\n'require dom';\n'require uci';\n'require qmodem.qmodem as qmodem';\n\n// Load CSS\ndocument.head.appendChild(E('link', {\n\t'rel': 'stylesheet',\n\t'type': 'text/css',\n\t'href': L.resource('qmodem/qmodem-next.css')\n}));\n\n// Check if cbi-progressbar class exists\nfunction hasCssClass(className) {\n\tvar styleSheets = document.styleSheets;\n\tfor (var i = 0; i < styleSheets.length; i++) {\n\t\ttry {\n\t\t\tvar rules = styleSheets[i].cssRules || styleSheets[i].rules;\n\t\t\tif (rules) {\n\t\t\t\tfor (var j = 0; j < rules.length; j++) {\n\t\t\t\t\tif (rules[j].selectorText && rules[j].selectorText.indexOf(className) !== -1) {\n\t\t\t\t\t\treturn true;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t} catch(e) {\n\t\t\t// Cross-origin stylesheet, skip\n\t\t}\n\t}\n\treturn false;\n}\n\nvar progressbar_className = hasCssClass('.cbi-progressbar') ? 'cbi-progressbar' : 'compat-progressbar';\n\n// LuciTable class for rendering modem info tables\nvar LuciTable = function() {\n\tthis.rows = [];\n\tthis.tbody = null;\n\tthis.fieldset = null;\n\tthis.initTable();\n};\n\nLuciTable.prototype = {\n\tinitTable: function() {\n\t\tthis.fieldset = E('fieldset', { 'class': 'cbi-section collapsible draggable', 'draggable': 'true' });\n\t\t//this.legend = E('legend', {});\n\t\tthis.title_span = E('h2', { 'class': 'panel-title' });\n\t\tvar table = E('table', { 'class': 'table' });\n\t\tthis.tbody = E('tbody', { 'style': 'width: 100%' });\n\t\t\n\t\ttable.appendChild(this.tbody);\n\t\t//this.fieldset.appendChild(this.legend);\n\t\tthis.fieldset.appendChild(this.title_span);\n\t\tthis.fieldset.appendChild(table);\n\t},\n\n\tsetTitle: function(value) {\n\t\t// Translate class name\n\t\tvar translatedValue = _(value);\n\t\t//this.legend.textContent = translatedValue;\n\t\tthis.title_span.textContent = translatedValue;\n\t},\n\n\tnewTr: function(data, index) {\n\t\tvar type = data.type;\n\t\tswitch(type) {\n\t\t\tcase 'plain_text':\n\t\t\t\tvar key = data.key;\n\t\t\t\tvar value = data.value;\n\t\t\t\tvar full_name = data.full_name || key;\n\t\t\t\tvar extra_info = data.extra_info;\n\t\t\t\t\n\t\t\t\t// Translate full_name and extra_info\n\t\t\t\tvar translatedName = _(full_name);\n\t\t\t\tvar displayName = extra_info ? translatedName + ' (' + extra_info + ')' : translatedName;\n\t\t\t\t\n\t\t\t\tthis.rows[index].left.textContent = displayName;\n\t\t\t\tthis.rows[index].right.textContent = value;\n\n\t\t\t\tif (value == null || value == '') {\n\t\t\t\t\tthis.rows[index].row.style.display = 'none';\n\t\t\t\t} else {\n\t\t\t\t\tthis.rows[index].row.style.display = '';\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t\t\n\t\t\tcase 'progress_bar':\n\t\t\t\tvar key = data.key;\n\t\t\t\tvar full_name = data.full_name || key;\n\t\t\t\tvar extra_info = data.extra_info;\n\t\t\t\tvar value = parseFloat(data.value);\n\t\t\t\tvar min = parseFloat(data.min_value);\n\t\t\t\tvar max = parseFloat(data.max_value);\n\t\t\t\tvar unit = data.unit || '';\n\t\t\t\tvar title = '(' + data.value + '/' + data.max_value + unit + ')';\n\t\t\t\tvar percentage = ((value - min) / (max - min)) * 100;\n\t\t\t\t\n\t\t\t\t// Clamp percentage between 0 and 100\n\t\t\t\tpercentage = Math.max(0, Math.min(100, percentage));\n\t\t\t\t\n\t\t\t\t// Translate full_name and extra_info\n\t\t\t\tvar translatedName = _(full_name);\n\t\t\t\tvar displayName = extra_info ? translatedName + ' (' + extra_info + ')' : translatedName;\n\t\t\t\t\n\t\t\t\tthis.rows[index].left.textContent = displayName;\n\t\t\t\t\n\t\t\t\tvar progress_bar = E('div', { \n\t\t\t\t\t'class': progressbar_className,\n\t\t\t\t\t'title': title\n\t\t\t\t});\n\t\t\t\tvar progress_bar_bar = E('div', { 'style': 'width:' + percentage + '%' });\n\t\t\t\tprogress_bar.appendChild(progress_bar_bar);\n\t\t\t\t\n\t\t\t\tthis.rows[index].right.innerHTML = '';\n\t\t\t\tthis.rows[index].right.appendChild(progress_bar);\n\t\t\t\t\n\t\t\t\tthis.rows[index].row.style.display = '';\n\t\t\t\tbreak;\n\t\t}\n\t},\n\n\tsetData: function(value) {\n\t\tif (value == null) return;\n\t\t\n\t\tif (Array.isArray(value)) {\n\t\t\tthis.setArrayData(value);\n\t\t} else {\n\t\t\tthis.setObjectData(value);\n\t\t}\n\t},\n\n\tsetArrayData: function(value) {\n\t\tvar row_length = this.rows.length;\n\t\tvar value_length = value.length;\n\t\t\n\t\t// Add missing rows\n\t\tif (row_length < value_length) {\n\t\t\tfor (var i = row_length; i < value_length; i++) {\n\t\t\t\tvar row = E('tr', { 'class': 'tr' });\n\t\t\t\tvar cell_left = E('td', { 'class': 'td left', 'width': '33%' });\n\t\t\t\tvar cell_right = E('td', { 'class': 'td' });\n\t\t\t\trow.appendChild(cell_left);\n\t\t\t\trow.appendChild(cell_right);\n\t\t\t\tthis.tbody.appendChild(row);\n\t\t\t\t\n\t\t\t\tthis.rows.push({\n\t\t\t\t\trow: row,\n\t\t\t\t\tleft: cell_left,\n\t\t\t\t\tright: cell_right\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t// Remove extra rows\n\t\telse if (row_length > value_length) {\n\t\t\tfor (var i = value_length; i < row_length; i++) {\n\t\t\t\tthis.tbody.removeChild(this.rows[i].row);\n\t\t\t}\n\t\t\tthis.rows = this.rows.slice(0, value_length);\n\t\t}\n\t\t\n\t\t// Update row content\n\t\tfor (var i = 0; i < value.length; i++) {\n\t\t\tthis.newTr(value[i], i);\n\t\t}\n\t},\n\n\tsetObjectData: function(value) {\n\t\tvar row_length = this.rows.length;\n\t\tvar value_length = Object.keys(value).length;\n\t\t\n\t\t// Add missing rows\n\t\tif (row_length < value_length) {\n\t\t\tfor (var i = row_length; i < value_length; i++) {\n\t\t\t\tvar row = E('tr', { 'class': 'tr' });\n\t\t\t\tvar cell_left = E('td', { 'class': 'td left', 'width': '33%' });\n\t\t\t\tvar cell_right = E('td', { 'class': 'td' });\n\t\t\t\trow.appendChild(cell_left);\n\t\t\t\trow.appendChild(cell_right);\n\t\t\t\tthis.tbody.appendChild(row);\n\t\t\t\t\n\t\t\t\tthis.rows.push({\n\t\t\t\t\trow: row,\n\t\t\t\t\tleft: cell_left,\n\t\t\t\t\tright: cell_right\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\t\t// Remove extra rows\n\t\telse if (row_length > value_length) {\n\t\t\tfor (var i = value_length; i < row_length; i++) {\n\t\t\t\tthis.tbody.removeChild(this.rows[i].row);\n\t\t\t}\n\t\t\tthis.rows = this.rows.slice(0, value_length);\n\t\t}\n\t\t\n\t\t// Update row content\n\t\tvar index = 0;\n\t\tfor (var key in value) {\n\t\t\tthis.rows[index].left.textContent = key;\n\t\t\tthis.rows[index].right.textContent = value[key];\n\t\t\tindex++;\n\t\t}\n\t}\n};\n\nreturn view.extend({\n\tload: function() {\n\t\treturn Promise.all([\n\t\t\tuci.load('qmodem')\n\t\t]);\n\t},\n\n\tgetModemList: function() {\n\t\tvar modems = [];\n\t\tvar sections = uci.sections('qmodem', 'modem-device');\n\t\t\n\t\tsections.forEach(function(section) {\n\t\t\tif (section.state !== 'disabled' && section.at_port) {\n\t\t\t\tvar name = section.name ? section.name.toUpperCase() : 'Unknown';\n\t\t\t\tvar displayName = section.alias ? section.alias + ' (' + name + ')' : name;\n\t\t\t\t\n\t\t\t\tmodems.push({\n\t\t\t\t\tid: section['.name'],\n\t\t\t\t\tname: displayName,\n\t\t\t\t\tat_port: section.at_port\n\t\t\t\t});\n\t\t\t}\n\t\t});\n\t\t\n\t\treturn modems;\n\t},\n\n\t// Get section order from localStorage\n\tgetSectionOrder: function(modemId) {\n\t\tvar key = 'qmodem_section_order_' + modemId;\n\t\tvar order = localStorage.getItem(key);\n\t\treturn order ? JSON.parse(order) : [];\n\t},\n\n\t// Save section order to localStorage\n\tsaveSectionOrder: function(modemId, order) {\n\t\tvar key = 'qmodem_section_order_' + modemId;\n\t\tlocalStorage.setItem(key, JSON.stringify(order));\n\t},\n\n\t// Get collapsed state from localStorage\n\tgetCollapsedState: function(modemId, className) {\n\t\tvar key = 'qmodem_collapsed_' + modemId + '_' + className;\n\t\treturn localStorage.getItem(key) === 'true';\n\t},\n\n\t// Save collapsed state to localStorage\n\tsaveCollapsedState: function(modemId, className, isCollapsed) {\n\t\tvar key = 'qmodem_collapsed_' + modemId + '_' + className;\n\t\tlocalStorage.setItem(key, isCollapsed ? 'true' : 'false');\n\t},\n\n\t// Attach collapse and drag handlers to a section\n\tattachSectionHandlers: function(fieldset, className, modemId, infoContainer) {\n\t\tvar self = this;\n\t\t\n\t\t// Collapse/expand handler\n\t\tvar legend = fieldset.querySelector('legend');\n\t\tvar title = fieldset.querySelector('.panel-title');\n\t\t\n\t\tvar toggleCollapse = function(e) {\n\t\t\t// Don't toggle if dragging\n\t\t\tif (fieldset.classList.contains('dragging')) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\tfieldset.classList.toggle('collapsed');\n\t\t\tvar isCollapsed = fieldset.classList.contains('collapsed');\n\t\t\tself.saveCollapsedState(modemId, className, isCollapsed);\n\t\t};\n\t\t\n\t\tif (legend) legend.addEventListener('click', toggleCollapse);\n\t\tif (title) title.addEventListener('click', toggleCollapse);\n\t\t\n\t\t// Drag and drop handlers\n\t\tfieldset.addEventListener('dragstart', function(e) {\n\t\t\tfieldset.classList.add('dragging');\n\t\t\te.dataTransfer.effectAllowed = 'move';\n\t\t\te.dataTransfer.setData('text/plain', className);\n\t\t});\n\t\t\n\t\tfieldset.addEventListener('dragend', function(e) {\n\t\t\tfieldset.classList.remove('dragging');\n\t\t\t// Remove all drag-over classes\n\t\t\tvar sections = infoContainer.querySelectorAll('.cbi-section.draggable');\n\t\t\tsections.forEach(function(section) {\n\t\t\t\tsection.classList.remove('drag-over');\n\t\t\t});\n\t\t});\n\t\t\n\t\tfieldset.addEventListener('dragover', function(e) {\n\t\t\te.preventDefault();\n\t\t\te.dataTransfer.dropEffect = 'move';\n\t\t\t\n\t\t\tvar draggingElement = infoContainer.querySelector('.dragging');\n\t\t\tif (draggingElement && draggingElement !== fieldset) {\n\t\t\t\tfieldset.classList.add('drag-over');\n\t\t\t}\n\t\t});\n\t\t\n\t\tfieldset.addEventListener('dragleave', function(e) {\n\t\t\tfieldset.classList.remove('drag-over');\n\t\t});\n\t\t\n\t\tfieldset.addEventListener('drop', function(e) {\n\t\t\te.preventDefault();\n\t\t\tfieldset.classList.remove('drag-over');\n\t\t\t\n\t\t\tvar draggedClassName = e.dataTransfer.getData('text/plain');\n\t\t\tif (draggedClassName === className) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t// Get all sections in current order\n\t\t\tvar sections = Array.from(infoContainer.querySelectorAll('.cbi-section.draggable'));\n\t\t\tvar draggedSection = infoContainer.querySelector('.dragging');\n\t\t\t\n\t\t\t// Reorder in DOM\n\t\t\tif (draggedSection) {\n\t\t\t\tinfoContainer.insertBefore(draggedSection, fieldset);\n\t\t\t}\n\t\t\t\n\t\t\t// Save new order\n\t\t\tvar newOrder = Array.from(infoContainer.querySelectorAll('.cbi-section.draggable')).map(function(section) {\n\t\t\t\t// Extract className from legend or title\n\t\t\t\tvar legend = section.querySelector('legend');\n\t\t\t\tvar title = section.querySelector('.panel-title');\n\t\t\t\treturn (legend && legend.textContent) || (title && title.textContent) || '';\n\t\t\t}).filter(function(name) {\n\t\t\t\treturn name !== '';\n\t\t\t});\n\t\t\t\n\t\t\tself.saveSectionOrder(modemId, newOrder);\n\t\t});\n\t},\n\n\tupdateModemInfo: function(modemId, tables_map, infoContainer, updateTimeElement, copyrightElement) {\n\t\tvar self = this;\n\t\t\n\t\t// Show loading state\n\t\tif (Object.keys(tables_map).length === 0) {\n\t\t\tdom.content(infoContainer, E('div', { 'class': 'spinning' }, _('Loading modem information...')));\n\t\t}\n\t\t\n\t\t// Fetch all modem info\n\t\tPromise.all([\n\t\t\tqmodem.getBaseInfo(modemId),\n\t\t\tqmodem.getSimInfo(modemId),\n\t\t\tqmodem.getNetworkInfo(modemId),\n\t\t\tqmodem.getCellInfo(modemId),\n\t\t\tqmodem.getCopyright(modemId)\n\t\t]).then(function(results) {\n\t\t\t// Merge all modem_info arrays (exclude copyright)\n\t\t\tvar all_info = [];\n\t\t\tfor (var i = 0; i < results.length - 1; i++) {\n\t\t\t\tif (results[i] && results[i].modem_info) {\n\t\t\t\t\tall_info = all_info.concat(results[i].modem_info);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// Handle copyright (last result)\n\t\t\tvar copyrightData = results[results.length - 1];\n\t\t\tif (copyrightElement && copyrightData && copyrightData.copyright) {\n\t\t\t\t// Format copyright object into display string\n\t\t\t\tvar copyrightInfo = copyrightData.copyright;\n\t\t\t\tvar copyrightText = [];\n\t\t\t\tfor (var key in copyrightInfo) {\n\t\t\t\t\tcopyrightText.push(_(key) + ': ' + copyrightInfo[key]);\n\t\t\t\t}\n\t\t\t\tcopyrightElement.textContent = copyrightText.join(' | ');\n\t\t\t\tcopyrightElement.style.display = '';\n\t\t\t} else if (copyrightElement) {\n\t\t\t\tcopyrightElement.style.display = 'none';\n\t\t\t}\n\n\t\t\t// Group by class\n\t\t\tvar grouped = {};\n\t\t\tall_info.forEach(function(entry) {\n\t\t\t\tif (entry.type === 'warning_message') {\n\t\t\t\t\t// Handle warning messages\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar className = entry['class'] || 'General';\n\t\t\t\tif (!grouped[className]) {\n\t\t\t\t\tgrouped[className] = [];\n\t\t\t\t}\n\t\t\t\tgrouped[className].push(entry);\n\t\t\t});\n\n\t\t\t// Clear loading animation if present\n\t\t\tvar loadingDiv = infoContainer.querySelector('.spinning');\n\t\t\tif (loadingDiv) {\n\t\t\t\tinfoContainer.removeChild(loadingDiv);\n\t\t\t}\n\n\t\t\t// Remove obsolete tables from DOM and map\n\t\t\tfor (var existingClass in tables_map) {\n\t\t\t\tif (!grouped[existingClass]) {\n\t\t\t\t\tif (tables_map[existingClass].fieldset.parentNode) {\n\t\t\t\t\t\tinfoContainer.removeChild(tables_map[existingClass].fieldset);\n\t\t\t\t\t}\n\t\t\t\t\tdelete tables_map[existingClass];\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Get section order from localStorage\n\t\t\tvar sectionOrder = self.getSectionOrder(modemId);\n\t\t\tvar orderedClasses = [];\n\t\t\t\n\t\t\t// First add classes in saved order\n\t\t\tsectionOrder.forEach(function(className) {\n\t\t\t\tif (grouped[className]) {\n\t\t\t\t\torderedClasses.push(className);\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\t// Then add any new classes not in saved order\n\t\t\tfor (var className in grouped) {\n\t\t\t\tif (orderedClasses.indexOf(className) === -1) {\n\t\t\t\t\torderedClasses.push(className);\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// Update or create tables in order\n\t\t\torderedClasses.forEach(function(className) {\n\t\t\t\tif (!tables_map[className]) {\n\t\t\t\t\ttables_map[className] = new LuciTable();\n\t\t\t\t\tinfoContainer.appendChild(tables_map[className].fieldset);\n\t\t\t\t\tself.attachSectionHandlers(tables_map[className].fieldset, className, modemId, infoContainer);\n\t\t\t\t}\n\t\t\t\ttables_map[className].setTitle(className);\n\t\t\t\ttables_map[className].setData(grouped[className]);\n\t\t\t\t\n\t\t\t\t// Restore collapsed state\n\t\t\t\tvar collapsedState = self.getCollapsedState(modemId, className);\n\t\t\t\tif (collapsedState) {\n\t\t\t\t\ttables_map[className].fieldset.classList.add('collapsed');\n\t\t\t\t} else {\n\t\t\t\t\ttables_map[className].fieldset.classList.remove('collapsed');\n\t\t\t\t}\n\t\t\t});\n\t\t\t\n\t\t\t// Update refresh time\n\t\t\tif (updateTimeElement) {\n\t\t\t\tvar now = new Date();\n\t\t\t\tvar timeStr = now.getFullYear() + '-' + \n\t\t\t\t\tString(now.getMonth() + 1).padStart(2, '0') + '-' + \n\t\t\t\t\tString(now.getDate()).padStart(2, '0') + ' ' + \n\t\t\t\t\tString(now.getHours()).padStart(2, '0') + ':' + \n\t\t\t\t\tString(now.getMinutes()).padStart(2, '0') + ':' + \n\t\t\t\t\tString(now.getSeconds()).padStart(2, '0');\n\t\t\t\tupdateTimeElement.textContent = _('Last update') + ': ' + timeStr;\n\t\t\t}\n\t\t}).catch(function(e) {\n\t\t\tconsole.error('Error fetching modem info:', e);\n\t\t\tdom.content(infoContainer, E('div', { 'class': 'alert-message warning' },\n\t\t\t\t_('Error loading modem information: %s').format(e.message)));\n\t\t});\n\t},\n\n\trender: function() {\n\t\tvar self = this;\n\t\tvar modems = this.getModemList();\n\t\t\n\t\tif (modems.length === 0) {\n\t\t\treturn E('div', { 'class': 'alert-message warning' }, \n\t\t\t\t_('No modems configured or all modems are disabled.'));\n\t\t}\n\n\t\tvar container = E('div', { 'class': 'cbi-map' });\n\t\t\n\t\t// Create modem selector section\n\t\tvar selectorSection = E('fieldset', { 'class': 'cbi-section' });\n\t\tvar selectorTable = E('table', { 'class': 'table' });\n\t\tvar selectorBody = E('tbody', {});\n\t\tvar selectorRow = E('tr', { 'class': 'tr' });\n\t\tvar labelCell = E('td', { 'class': 'td', 'width': '33%' }, _('Modem Name'));\n\t\tvar selectCell = E('td', { 'class': 'td' });\n\t\t\n\t\t// Create select dropdown\n\t\tvar select = E('select', {\n\t\t\t'class': 'cbi-input-select',\n\t\t\t'id': 'modem_selector'\n\t\t});\n\t\t\n\t\tmodems.forEach(function(modem) {\n\t\t\tselect.appendChild(E('option', { 'value': modem.id }, modem.name));\n\t\t});\n\t\t\n\t\tselectCell.appendChild(select);\n\t\tselectorRow.appendChild(labelCell);\n\t\tselectorRow.appendChild(selectCell);\n\t\tselectorBody.appendChild(selectorRow);\n\t\tselectorTable.appendChild(selectorBody);\n\t\tselectorSection.appendChild(selectorTable);\n\t\tcontainer.appendChild(selectorSection);\n\t\t\n\t\t// Create copyright display\n\t\tvar copyrightDiv = E('div', { \n\t\t\t'class': 'copyright-section',\n\t\t\t'style': 'display: none;'\n\t\t});\n\t\tcontainer.appendChild(copyrightDiv);\n\t\t\n\t\t// Create update time display\n\t\tvar updateTimeSection = E('fieldset', { 'class': 'cbi-section' });\n\t\tvar updateTimeDiv = E('div', { \n\t\t\t'style': 'text-align: right; padding: 5px; color: #888;',\n\t\t\t'id': 'update_time_display'\n\t\t}, _('Last update') + ': -');\n\t\tupdateTimeSection.appendChild(updateTimeDiv);\n\t\tcontainer.appendChild(updateTimeSection);\n\t\t\n\t\t// Create info container\n\t\tvar infoContainer = E('div', { 'id': 'modem_info_container' });\n\t\tcontainer.appendChild(infoContainer);\n\t\t\n\t\t// Tables map to store LuciTable instances\n\t\tvar tables_map = {};\n\t\t\n\t\t// Update function\n\t\tvar updateInfo = function(clearTables) {\n\t\t\tvar selectedModem = select.value;\n\t\t\t\n\t\t\t// Clear tables when switching modem\n\t\t\tif (clearTables) {\n\t\t\t\tfor (var className in tables_map) {\n\t\t\t\t\tif (tables_map[className].fieldset.parentNode) {\n\t\t\t\t\t\tinfoContainer.removeChild(tables_map[className].fieldset);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\ttables_map = {};\n\t\t\t}\n\t\t\t\n\t\t\tself.updateModemInfo(selectedModem, tables_map, infoContainer, updateTimeDiv, copyrightDiv);\n\t\t};\n\t\t\n\t\t// Selector change handler\n\t\tselect.addEventListener('change', function() {\n\t\t\tupdateInfo(true); // Clear tables when switching\n\t\t});\n\t\t\n\t\t// Initial update\n\t\tupdateInfo(false);\n\t\t\n\t\t// Start polling (every 10 seconds)\n\t\tpoll.add(function() {\n\t\t\tvar selectedModem = select.value;\n\t\t\tself.updateModemInfo(selectedModem, tables_map, infoContainer, updateTimeDiv, copyrightDiv);\n\t\t}, 10);\n\t\t\n\t\treturn container;\n\t},\n\n\thandleSaveApply: null,\n\thandleSave: null,\n\thandleReset: null\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/htdocs/luci-static/resources/view/qmodem/settings.js",
    "content": "'use strict';\n'require view';\n'require form';\n'require uci';\n'require rpc';\n'require ui';\n'require poll';\n'require qmodem.modem_cfg as modemCfg';\n\nvar callSystemBoard = rpc.declare({\n\tobject: 'system',\n\tmethod: 'board'\n});\n\nvar callScanPcie = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'scan_pcie'\n});\n\nvar callScanUsb = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'scan_usb'\n});\n\nvar callScanAll = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'scan_all'\n});\n\nvar callGetPcieDevices = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_pcie_devices'\n});\n\nvar callGetUsbDevices = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_usb_devices'\n});\n\nvar callGetLeds = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_leds'\n});\n\nvar callGetNetworkInterfaces = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_network_interfaces'\n});\n\nvar callGetTtyPorts = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_tty_ports'\n});\n\nvar callGetAvailableDevices = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'get_available_devices'\n});\n\nvar callRemoveModem = rpc.declare({\n\tobject: 'qmodem',\n\tmethod: 'remove_modem',\n\tparams: ['config_section'],\n\texpect: { }\n});\n\nreturn view.extend({\n\tload: function() {\n\t\treturn Promise.all([\n\t\t\tuci.load('qmodem'),\n\t\t\tcallSystemBoard(),\n\t\t\tcallGetPcieDevices(),\n\t\t\tcallGetUsbDevices(),\n\t\t\tcallGetLeds(),\n\t\t\tcallGetNetworkInterfaces(),\n\t\t\tcallGetTtyPorts(),\n\t\t\tcallGetAvailableDevices()\n\t\t]).then(L.bind(function(results) {\n\t\t\tthis.pcieDevices = results[2] && results[2].devices ? results[2].devices : [];\n\t\t\tthis.usbDevices = results[3] && results[3].devices ? results[3].devices : [];\n\t\t\tthis.leds = results[4] && results[4].leds ? results[4].leds : [];\n\t\t\tthis.networkInterfaces = results[5] && results[5].interfaces ? results[5].interfaces : [];\n\t\t\tthis.ttyPorts = results[6] && results[6].ports ? results[6].ports : [];\n\t\t\tthis.availableDevices = results[7] && results[7].devices ? results[7].devices : {};\n\t\t\treturn results;\n\t\t}, this));\n\t},\n\n\trender: function(data) {\n\t\tvar m, s, o;\n\n\t\tm = new form.Map('qmodem', _('QModem Settings'));\n\n\t\t// ===========================================\n\t\t// Modem Probe Settings\n\t\t// ===========================================\n\t\ts = m.section(form.NamedSection, 'main', 'main', _('Modem Probe Settings'));\n\n\t\to = s.option(form.Flag, 'at_tool', _('Alternative AT Tools'));\n\t\to.description = _('If enabled, using alternative AT Tools');\n\t\to.default = '0';\n\n\t\to = s.option(form.Value, 'start_delay', _('Delay Start'));\n\t\to.description = _('Units: seconds');\n\t\to.datatype = 'and(uinteger,min(0),max(99))';\n\t\to.default = '0';\n\t\to.placeholder = '0';\n\n\t\to = s.option(form.Flag, 'block_auto_probe', _('Block Auto Probe/Remove'));\n\t\to.description = _('If enabled, the modem auto scan will be blocked.');\n\t\to.default = '0';\n\n\t\to = s.option(form.Flag, 'enable_pcie_scan', _('Enable PCIe Scan'));\n\t\to.description = _('Once enabled, the PCIe ports will be scanned on every boot.');\n\t\to.default = '0';\n\n\t\to = s.option(form.Flag, 'enable_usb_scan', _('Enable USB Scan'));\n\t\to.description = _('Once enabled, the USB ports will be scanned on every boot.');\n\t\to.default = '1';\n\n\t\to = s.option(form.Flag, 'try_preset_usb', _('Try Preset USB Port'));\n\t\to.description = _('Attempt to use pre-configured USB settings from the CPE vendor.');\n\t\to.default = '0';\n\n\t\to = s.option(form.Flag, 'try_preset_pcie', _('Try Preset PCIe Port'));\n\t\to.description = _('Attempt to use pre-configured PCIe settings from the CPE vendor.');\n\t\to.default = '0';\n\n\t\t// Manual Scan Buttons\n\t\to = s.option(form.Button, '_scan_pcie', _('Scan PCIe Manually'));\n\t\to.inputstyle = 'apply';\n\t\to.onclick = L.bind(function() {\n\t\t\tui.showModal(_('Scanning'), [\n\t\t\t\tE('p', { 'class': 'spinning' }, _('Scanning PCIe ports, please wait...'))\n\t\t\t]);\n\t\t\treturn callScanPcie()\n\t\t\t\t.then(function(res) {\n\t\t\t\t\tui.hideModal();\n\t\t\t\t\tif (res.code === 0) {\n\t\t\t\t\t\tui.addNotification(null, E('p', res.message || _('PCIe scan completed successfully')), 'info');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar msg = res.message || _('PCIe scan failed');\n\t\t\t\t\t\tif (res.output) msg += ' - ' + res.output;\n\t\t\t\t\t\tui.addNotification(null, E('p', msg), 'warning');\n\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(function(err) {\n\t\t\t\t\tui.hideModal();\n\t\t\t\t\tui.addNotification(null, E('p', _('PCIe scan error: ') + (err.message || err)), 'error');\n\t\t\t\t});\n\t\t}, this);\n\n\t\to = s.option(form.Button, '_scan_usb', _('Scan USB Manually'));\n\t\to.inputstyle = 'apply';\n\t\to.onclick = L.bind(function() {\n\t\t\tui.showModal(_('Scanning'), [\n\t\t\t\tE('p', { 'class': 'spinning' }, _('Scanning USB ports, please wait...'))\n\t\t\t]);\n\t\t\treturn callScanUsb()\n\t\t\t\t.then(function(res) {\n\t\t\t\t\tui.hideModal();\n\t\t\t\t\tif (res.code === 0) {\n\t\t\t\t\t\tui.addNotification(null, E('p', res.message || _('USB scan completed successfully')), 'info');\n\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar msg = res.message || _('USB scan failed');\n\t\t\t\t\t\tif (res.output) msg += ' - ' + res.output;\n\t\t\t\t\t\tui.addNotification(null, E('p', msg), 'warning');\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(function(err) {\n\t\t\t\t\tui.hideModal();\n\t\t\t\t\tui.addNotification(null, E('p', _('USB scan error: ') + (err.message || err)), 'error');\n\t\t\t\t});\n\t\t}, this);\n\n\t\to = s.option(form.Button, '_scan_all', _('Scan ALL Manually'));\n\t\to.inputstyle = 'apply';\n\t\to.onclick = L.bind(function() {\n\t\t\tui.showModal(_('Scanning'), [\n\t\t\t\tE('p', { 'class': 'spinning' }, _('Scanning all ports, please wait...'))\n\t\t\t]);\n\t\t\treturn callScanAll()\n\t\t\t\t.then(function(res) {\n\t\t\t\t\tui.hideModal();\n\t\t\t\t\tif (res.code === 0) {\n\t\t\t\t\t\tui.addNotification(null, E('p', res.message || _('Full scan completed successfully')), 'info');\n\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar msg = res.message || _('Full scan failed');\n\t\t\t\t\t\tif (res.output) msg += ' - ' + res.output;\n\t\t\t\t\t\tui.addNotification(null, E('p', msg), 'warning');\n\t\t\t\t\t}\n\t\t\t\t})\n\t\t\t\t.catch(function(err) {\n\t\t\t\t\tui.hideModal();\n\t\t\t\t\tui.addNotification(null, E('p', _('Full scan error: ') + (err.message || err)), 'error');\n\t\t\t\t});\n\t\t}, this);\n\n\n\n\t\t// Modem Configuration (Device Settings Only)\n\t\ts = m.section(form.GridSection, 'modem-device', _('Modem Devices'));\n\t\ts.anonymous = true;\n\t\ts.sortable = true;\n\t\ts.modaltitle = L.bind(function(section_id) {\n\t\t\tvar name = uci.get('qmodem', section_id, 'name');\n\t\t\treturn _('Modem Device') + ': ' + (name || section_id);\n\t\t}, this);\n\n\t\t// Use available devices from RPC call\n\t\tvar availableDevices = this.availableDevices || {};\n\n\t\t// Custom add handler\n\t\ts.addremove = true;\n\t\ts.handleAdd = function(ev, section_id) {\n\t\t\tvar deviceKeys = Object.keys(availableDevices);\n\t\t\tif (deviceKeys.length === 0) {\n\t\t\t\tui.addNotification(null, E('p', _('No devices available. Please scan for devices first.')), 'warning');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tvar selectList = deviceKeys.map(function(key) {\n\t\t\t\treturn E('option', { value: key }, availableDevices[key].label);\n\t\t\t});\n\n\t\t\tui.showModal(_('Add Modem Device'), [\n\t\t\t\tE('p', _('Select a device to configure:')),\n\t\t\t\tE('div', { 'class': 'cbi-section' }, [\n\t\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Available Devices')),\n\t\t\t\t\tE('select', { 'id': 'device-select', 'class': 'cbi-input-select' }, selectList)\n\t\t\t\t]),\n\t\t\t\tE('div', { 'class': 'right' }, [\n\t\t\t\t\tE('button', {\n\t\t\t\t\t\t'class': 'btn cbi-button-neutral',\n\t\t\t\t\t\t'click': ui.hideModal\n\t\t\t\t\t}, _('Cancel')),\n\t\t\t\t\tE('button', {\n\t\t\t\t\t\t'class': 'btn cbi-button-positive',\n\t\t\t\t\t\t'click': L.bind(function() {\n\t\t\t\t\t\t\tvar select = document.getElementById('device-select');\n\t\t\t\t\t\t\tvar selectedKey = select.value;\n\t\t\t\t\t\t\tvar deviceInfo = availableDevices[selectedKey];\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// Create new section with selected device name\n\t\t\t\t\t\t\tvar sid = uci.add('qmodem', 'modem-device', selectedKey);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// Set type and path automatically\n\t\t\t\t\t\t\tuci.set('qmodem', sid, 'data_interface', deviceInfo.type);\n\t\t\t\t\t\t\tuci.set('qmodem', sid, 'path', deviceInfo.path);\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tui.hideModal();\n\t\t\t\t\t\t\tm.save().then(function() {\n\t\t\t\t\t\t\t\twindow.location.reload();\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}, this)\n\t\t\t\t\t}, _('Add'))\n\t\t\t\t])\n\t\t\t]);\n\t\t};\n\t\t//call remove_modem rpc method on remove\n\t\ts.handleRemove = function(section_id, isturst) {\n\t\t\t//add a comfirmation dialog\n\t\t\tif (!confirm(_('Are you sure you want to remove this modem device? this cannot be roll back with uci machanism.'))) {\n\t\t\t\treturn;\n\t\t\t}\n\t\t\treturn callRemoveModem(section_id)\n\t\t\t\t.then(function() {\n\t\t\t\t\tui.addNotification(null, E('p', _('Modem device removed successfully')), 'info');\n\t\t\t\t\t//refresh the page\n\t\t\t\t\twindow.location.reload();\n\t\t\t\t})\n\t\t\t\t.catch(function(err) {\n\t\t\t\t\tui.addNotification(null, E('p', _('Modem device removal failed: ') + (err.message || err)), 'error');\n\t\t\t\t});\n\t\t};\n\n\n\t\to = s.option(form.Flag, 'enabled', _('Enabled'));\n\t\to.default = '1';\n\t\to.editable = true;\n\t\to.modalonly = true;\n\n\t\to = s.option(form.DummyValue, 'data_interface', _('Type'));\n\t\to.editable = true;\n\t\to.cfgvalue = function(section_id) {\n\t\t\tvar type = uci.get('qmodem', section_id, 'data_interface') || '-';\n\t\t\treturn type.toUpperCase();\n\t\t};\n\n\t\to = s.option(form.Flag, 'soft_reboot', _('Soft Reboot'));\n\t\to.description = _('enable modem soft reboot');\n\t\to.default = '0';\n\t\to.rmempty = false;\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'name', _('Model Name'));\n\t\to.placeholder = _('e.g.') + ' RG500Q';\n\t\to.rmempty = false;\to = s.option(form.Value, 'alias', _('Alias'));\n\to.placeholder = _('e.g.') + ' Modem1';\n\to.editable = true;\n\n\to = s.option(form.Value, 'path', _('Device Path'));\n\to.placeholder = _('e.g.') + ' /sys/bus/usb/devices/1-1';\n\to.rmempty = false;\n\to.readonly = true;\to = s.option(form.Value, 'at_port', _('AT Port'));\n\to.placeholder = _('e.g.') + ' /dev/ttyUSB2';\n\to.rmempty = false;\n\tif (this.ttyPorts && this.ttyPorts.length > 0) {\n\t\tthis.ttyPorts.forEach(function(port) {\n\t\t\to.value(port.id, port.label);\n\t\t});\n\t}\to = s.option(form.Value, 'sms_at_port', _('SMS AT Port'));\n\to.placeholder = _('e.g.') + ' /dev/ttyUSB2';\n\tif (this.ttyPorts && this.ttyPorts.length > 0) {\n\t\tthis.ttyPorts.forEach(function(port) {\n\t\t\to.value(port.id, port.label);\n\t\t});\n\t} \t\to = s.option(form.Value, 'override_at_port', _('Override AT Port'));\n\to.placeholder = _('e.g.') + ' /dev/ttyUSB3';\n\tif (this.ttyPorts && this.ttyPorts.length > 0) {\n\t\tthis.ttyPorts.forEach(function(port) {\n\t\t\to.value(port.id, port.label);\n\t\t});\n\t}\t\to = s.option(form.Flag, 'use_ubus', _('Use Ubus AT Daemon'));\n\t\to.default = '0';\n\n\n\t\t// Additional modem configuration (modal only)\n\t\t//vendor\n\t\to = s.option(form.ListValue, 'vendor', _('Vendor'));\n\t\to.modalonly = true;\n\t\to.optional = true;\n\t\tfor (var key in modemCfg.manufacturers) {\n\t\t\to.value(key, modemCfg.manufacturers[key]);\n\t\t}\n\n\t\to = s.option(form.ListValue, 'platform', _('Platform'));\n\t\to.modalonly = true;\n\t\to.optional = true;\n\t\tfor (var key in modemCfg.platforms) {\n\t\t\to.value(key, modemCfg.platforms[key]);\n\t\t}\n\n\t\to = s.option(form.DynamicList, 'modes', _('Supported Modes'));\n\t\to.description = _('Supported driver modes (e.g., RNDIS/NCM/QMI/MBIM/ETH/PPP)');\n\t\to.modalonly = true;\n\t\to.optional = true;\n\t\tfor (var key in modemCfg.modes) {\n\t\t\to.value(key, modemCfg.modes[key]);\n\t\t}\n\n\t\to = s.option(form.DynamicList, 'disabled_features', _('Disabled Features'));\n\t\to.description = _('Select features to disable for this modem.');\n\t\to.modalonly = true;\n\t\to.optional = true;\n\t\tfor (var key in modemCfg.disabled_features) {\n\t\t\to.value(key, modemCfg.disabled_features[key]);\n\t\t}\n\n\t\to = s.option(form.Value, 'wcdma_band', _('WCDMA Band'));\n\t\to.placeholder = _('e.g.') + ' 1/2/5/8';\n\t\to.modalonly = true;\n\t\to.optional = true;\n\n\t\to = s.option(form.Value, 'lte_band', _('LTE Band'));\n\t\to.placeholder = _('e.g.') + ' 1/3/5/7/8/20';\n\t\to.modalonly = true;\n\t\to.optional = true;\n\n\t\to = s.option(form.Value, 'nsa_band', _('NSA Band'));\n\t\to.placeholder = _('e.g.') + ' 41/78';\n\t\to.modalonly = true;\n\t\to.optional = true;\n\n\t\to = s.option(form.Value, 'sa_band', _('SA Band'));\n\t\to.placeholder = _('e.g.') + ' 78/79';\n\t\to.modalonly = true;\n\t\to.optional = true;\n\n\t// ===========================================\n\t// Modem Slot Configuration\n\t// ===========================================\n\ts = m.section(form.GridSection, 'modem-slot', _('Modem Slot Configuration'));\n\ts.description = _('Configure physical slots for modem installation');\n\ts.anonymous = false;\n\ts.addremove = true;\n\ts.sortable = true;\n\ts.modaltitle = L.bind(function(section_id) {\n\t\tvar slotId = uci.get('qmodem', section_id, 'slot');\n\t\tvar alias = uci.get('qmodem', section_id, 'alias');\n\t\treturn _('Modem Slot') + ': ' + (alias || slotId || section_id);\n\t}, this);\n\n\to = s.option(form.ListValue, 'type', _('Slot Type'));\n\to.value('usb', _('USB'));\n\to.value('pcie', _('PCIe'));\n\to.default = 'usb';\n\to.editable = true;\n\n\to = s.option(form.Value, 'slot', _('Slot ID'));\n\to.description = _('Physical slot identifier (e.g., 1-1.4 for USB, 0000:01:00.0 for PCIe)');\n\to.rmempty = false;\n\to.editable = true;\n\t// Add PCIe devices\n\tif (this.pcieDevices && this.pcieDevices.length > 0) {\n\t\tthis.pcieDevices.forEach(function(device) {\n\t\t\to.value(device.id, device.label);\n\t\t});\n\t}\n\t// Add USB devices\n\tif (this.usbDevices && this.usbDevices.length > 0) {\n\t\tthis.usbDevices.forEach(function(device) {\n\t\t\to.value(device.id, device.label);\n\t\t});\n\t}\n\n\to = s.option(form.Value, 'alias', _('Default Alias'));\n\to.description = _('After setting this option, the first module loaded into this slot will automatically be assigned this default alias.');\n\to.placeholder = _('e.g.') + ' Modem';\n\to.editable = true;\n\n\to = s.option(form.Value, 'default_metric', _('Default Metric'));\n\to.description = _('The first module loaded into this slot will automatically be assigned this default metric.');\n\to.datatype = 'range(1,255)';\n\to.placeholder = _('e.g.') + ' 10';\n\to.editable = true;\n\n\to = s.option(form.Value, 'sim_led', _('SIM LED'));\n\to.description = _('LED indicator for SIM card status');\n\to.optional = true;\n\to.modalonly = true;\n\tif (this.leds && this.leds.length > 0) {\n\t\tthis.leds.forEach(function(led) {\n\t\t\to.value(led.id, led.label);\n\t\t});\n\t}\n\n\to = s.option(form.Value, 'net_led', _('Network LED'));\n\to.description = _('LED indicator for network connection status');\n\to.optional = true;\n\to.modalonly = true;\n\tif (this.leds && this.leds.length > 0) {\n\t\tthis.leds.forEach(function(led) {\n\t\t\to.value(led.id, led.label);\n\t\t});\n\t}\n\n\to = s.option(form.Value, 'ethernet_5g', _('5G Ethernet Interface'));\n\to.description = _('For 5G modules using the Ethernet PHY connection, please specify the network interface name (e.g., eth0, eth1)');\n\to.optional = true;\n\to.modalonly = true;\n\tif (this.networkInterfaces && this.networkInterfaces.length > 0) {\n\t\tthis.networkInterfaces.forEach(function(iface) {\n\t\t\to.value(iface.id, iface.label);\n\t\t});\n\t}\n\n\to = s.option(form.Value, 'bridge_port', _('Bridge Port'));\n\to.description = _('Default bridge port for passthrough. Device-level bridge_port overrides this slot default.');\n\to.optional = true;\n\to.modalonly = true;\n\tif (this.networkInterfaces && this.networkInterfaces.length > 0) {\n\t\tthis.networkInterfaces.forEach(function(iface) {\n\t\t\to.value(iface.id, iface.label);\n\t\t});\n\t}\n\n\to = s.option(form.Value, 'associated_usb', _('Associated USB'));\n\to.description = _('For M.2 slots with both PCIe and USB support, specify the associated USB port (for ttyUSB access)');\n\to.depends('type', 'pcie');\n\to.optional = true;\n\to.modalonly = true;\n\tif (this.usbDevices && this.usbDevices.length > 0) {\n\t\tthis.usbDevices.forEach(function(device) {\n\t\t\to.value(device.id, device.id);\n\t\t});\n\t}\n\n\to = s.option(form.Value, 'gpio', _('Power GPIO'));\n\to.description = _('GPIO pin for power control');\n\to.optional = true;\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'gpio_down', _('GPIO Value(Modem Power Down)'));\n\to.depends({gpio: /./ } );\n\to.placeholder = _('e.g.') + ' 0';\n\to.modalonly = true;\n\n\to = s.option(form.Value, 'gpio_up', _('GPIO Value(Modem Power Up)'));\n\to.depends({gpio: /./ } );\n\to.placeholder = _('e.g.') + ' 1';\n\to.modalonly = true;\n\n\t\treturn m.render();\n\t}\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/htdocs/luci-static/resources/view/qmodem/sim_switch.js",
    "content": "'use strict';\n'require view';\n'require ui';\n'require dom';\n'require qmodem.qmodem as qmodem';\n\nreturn view.extend({\n\tload: function() {\n\t\treturn qmodem.getModemSections();\n\t},\n\n\trender: function(modems) {\n\t\tif (!modems || modems.length === 0) {\n\t\t\treturn E('div', { 'class': 'alert-message warning' }, \n\t\t\t\t_('No modem configured.'));\n\t\t}\n\n\t\tvar container = E('div', { 'class': 'cbi-map' });\n\t\tvar title = E('h2', { 'class': 'cbi-map-caption' }, _('SIM Switch'));\n\t\tcontainer.appendChild(title);\n\n\t\tvar desc = E('div', { 'class': 'cbi-map-descr' }, \n\t\t\t_('Switch between SIM card slots. Note: Some modems may require a reboot after switching SIM slots.'));\n\t\tcontainer.appendChild(desc);\n\n\t\t// Create modem selector section\n\t\tvar selectorSection = E('fieldset', { 'class': 'cbi-section' });\n\t\tvar selectorTable = E('table', { 'class': 'table' });\n\t\tvar selectorBody = E('tbody', {});\n\t\tvar selectorRow = E('tr', { 'class': 'tr' });\n\t\tvar labelCell = E('td', { 'class': 'td left', 'width': '33%' }, _('Modem Name'));\n\t\tvar selectCell = E('td', { 'class': 'td' });\n\t\t\n\t\t// Create select dropdown\n\t\tvar select = E('select', {\n\t\t\t'class': 'cbi-input-select',\n\t\t\t'id': 'modem_selector'\n\t\t});\n\t\t\n\t\tmodems.forEach(function(modem) {\n\t\t\tif (modem.enabled) {\n\t\t\t\tselect.appendChild(E('option', { 'value': modem.id }, modem.name));\n\t\t\t}\n\t\t});\n\t\t\n\t\tselectCell.appendChild(select);\n\t\tselectorRow.appendChild(labelCell);\n\t\tselectorRow.appendChild(selectCell);\n\t\tselectorBody.appendChild(selectorRow);\n\t\tselectorTable.appendChild(selectorBody);\n\t\tselectorSection.appendChild(selectorTable);\n\t\tcontainer.appendChild(selectorSection);\n\n\t\t// Create SIM switch interface container\n\t\tvar interfaceContainer = E('div', { 'id': 'sim_switch_container' });\n\t\tcontainer.appendChild(interfaceContainer);\n\n\t\tvar self = this;\n\t\t\n\t\t// Update function to show selected modem's interface\n\t\tvar updateInterface = function() {\n\t\t\tvar selectedId = select.value;\n\t\t\tvar selectedModem = modems.find(function(m) { return m.id === selectedId; });\n\t\t\t\n\t\t\tif (selectedModem) {\n\t\t\t\tdom.content(interfaceContainer, self.createSimSwitchInterface(selectedModem));\n\t\t\t}\n\t\t};\n\n\t\t// Selector change handler\n\t\tselect.addEventListener('change', updateInterface);\n\n\t\t// Initial display\n\t\tupdateInterface();\n\n\t\treturn container;\n\t},\n\n\tcreateSimSwitchInterface: function(modem) {\n\t\tvar self = this;\n\t\tvar container = E('div', { 'class': 'cbi-section-node' });\n\n\t\t// Status section - shows support and current slot\n\t\tvar statusSection = E('div', { 'class': 'cbi-value' });\n\t\tstatusSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('SIM Switch Status')));\n\t\tvar statusField = E('div', { 'class': 'cbi-value-field' });\n\t\tstatusField.appendChild(E('div', { 'class': 'spinning' }, _('Loading...')));\n\t\tstatusSection.appendChild(statusField);\n\t\tcontainer.appendChild(statusSection);\n\n\t\t// SIM slot buttons container\n\t\tvar buttonsSection = E('div', { 'class': 'cbi-value' });\n\t\tbuttonsSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('Select SIM Slot')));\n\t\tvar buttonsField = E('div', { 'class': 'cbi-value-field' });\n\t\tbuttonsSection.appendChild(buttonsField);\n\t\tcontainer.appendChild(buttonsSection);\n\n\t\t// Result section\n\t\tvar resultSection = E('div', { 'class': 'cbi-value', 'id': 'sim_result_section_' + modem.id, 'style': 'display: none;' });\n\t\tresultSection.appendChild(E('label', { 'class': 'cbi-value-title' }, _('Result')));\n\t\tvar resultField = E('div', { 'class': 'cbi-value-field', 'id': 'sim_result_' + modem.id });\n\t\tresultSection.appendChild(resultField);\n\t\tcontainer.appendChild(resultSection);\n\n\t\t// Load SIM switch support and current slot\n\t\tPromise.all([\n\t\t\tqmodem.callGetSimSwitchCapabilities(modem.id),\n\t\t\tqmodem.getSimSlot(modem.id)\n\t\t]).then(function(results) {\n\t\t\tvar supportResult = results[0];\n\t\t\tvar slotResult = results[1];\n\t\t\t\n\t\t\tvar supported = supportResult && supportResult.supportSwitch === '1';\n\t\t\tvar currentSlot = slotResult && slotResult.sim_slot ? slotResult.sim_slot : 'N/A';\n\t\t\tvar slots = (supportResult && Array.isArray(supportResult.simSlots)) ? supportResult.simSlots : [];\n\t\t\tvar hideButtons = !supported || currentSlot === 'N/A' || slots.length === 0;\n\t\t\t\n\t\t\t// Update status\n\t\t\tvar statusInfo = [];\n\t\t\tstatusInfo.push(E('div', {}, [\n\t\t\t\tE('strong', {}, _('Support') + ': '),\n\t\t\t\tE('span', { 'class': supported ? 'label-success' : 'label-warning' }, \n\t\t\t\t\tsupported ? _('Supported') : _('Not Supported'))\n\t\t\t]));\n\t\t\tstatusInfo.push(E('div', { 'style': 'margin-top: 5px;' }, [\n\t\t\t\tE('strong', {}, _('Current SIM Slot') + ': '),\n\t\t\t\tE('span', {}, self.formatSlotDisplay(currentSlot))\n\t\t\t]));\n\t\t\t\n\t\t\tdom.content(statusField, statusInfo);\n\t\t\t\n\t\t\t// Create SIM slot buttons dynamically based on capabilities\n\t\t\tvar btns = [];\n\t\t\tif (!hideButtons) {\n\t\t\t\tslots.forEach(function(slotVal, idx) {\n\t\t\t\t\tvar label = _('Slot %s').format(slotVal);\n\t\t\t\t\tvar btn = E('button', {\n\t\t\t\t\t\t'class': 'btn cbi-button' + (currentSlot == slotVal ? ' cbi-button-positive' : ' cbi-button-action'),\n\t\t\t\t\t\t'data-slot': slotVal,\n\t\t\t\t\t\t'click': supported ? function() { self.switchSimSlot(modem.id, slotVal, btns); } : null,\n\t\t\t\t\t\t'style': (!supported ? 'opacity: 0.5; cursor: not-allowed;' : '') + (idx > 0 ? ' margin-left: 10px;' : '')\n\t\t\t\t\t}, label);\n\t\t\t\t\tbtns.push(btn);\n\t\t\t\t});\n\t\t\t}\n\t\t\tdom.content(buttonsField, btns);\n\t\t\t\n\t\t\tif (!supported) {\n\t\t\t\tbuttonsField.appendChild(E('div', { 'style': 'margin-top: 10px; color: #999;' }, \n\t\t\t\t\t_('This modem does not support SIM switching.')));\n\t\t\t}\n\t\t\t\n\t\t\t// Display ExtraInfo if available\n\t\t\tvar extraInfo = supportResult && supportResult.ExtraInfo;\n\t\t\tif (extraInfo) {\n\t\t\t\tstatusInfo.push(E('div', { 'style': 'margin-top: 5px; color: #f0ad4e;' }, [\n\t\t\t\t\tE('strong', {}, _('Note') + ': '),\n\t\t\t\t\tE('span', {}, _(extraInfo))\n\t\t\t\t]));\n\t\t\t\tdom.content(statusField, statusInfo);\n\t\t\t}\n\t\t\t\n\t\t}).catch(function(e) {\n\t\t\tdom.content(statusField, E('span', { 'class': 'error' }, \n\t\t\t\t_('Error loading SIM switch information: %s').format(e.message)));\n\t\t\t\n\t\t\t// No buttons on error; show info only\n\t\t\tdom.content(buttonsField, []);\n\t\t});\n\n\t\treturn container;\n\t},\n\n\tformatSlotDisplay: function(slot) {\n\t\tif (!slot)\n\t\t\treturn 'N/A';\n\t\treturn _('Slot %s').format(slot);\n\t},\n\n\tswitchSimSlot: function(modemId, slot, buttons) {\n\t\tvar self = this;\n\t\tvar resultSection = document.getElementById('sim_result_section_' + modemId);\n\t\tvar resultField = document.getElementById('sim_result_' + modemId);\n\t\t\n\t\t// Show loading state\n\t\tresultSection.style.display = '';\n\t\tdom.content(resultField, E('div', { 'class': 'spinning' }, _('Switching SIM slot...')));\n\t\t\n\t\t// Disable buttons during switch\n\t\t(buttons || []).forEach(function(b){ b.disabled = true; b.style.opacity = '0.5'; });\n\t\t\n\t\tqmodem.setSimSlot(modemId, slot).then(function(result) {\n\t\t\t// Re-enable buttons\n\t\t\t(buttons || []).forEach(function(b){ b.disabled = false; b.style.opacity = ''; });\n\t\t\t\n\t\t\tif (result && result.result) {\n\t\t\t\tdom.content(resultField, E('div', { 'class': 'alert-message success' }, [\n\t\t\t\t\tE('span', {}, _('SIM slot switched to Slot %s successfully.').format(slot)),\n\t\t\t\t\tE('br'),\n\t\t\t\t\tE('span', { 'style': 'font-size: 0.9em;' }, \n\t\t\t\t\t\t_('Note: Some modems may require a reboot for the change to take effect.'))\n\t\t\t\t]));\n\t\t\t\t\n\t\t\t\t// Update button styles to reflect new slot\n\t\t\t\t(buttons || []).forEach(function(b){\n\t\t\t\t\tvar bs = b.getAttribute('data-slot');\n\t\t\t\t\tb.className = 'btn cbi-button' + (bs == slot ? ' cbi-button-positive' : ' cbi-button-action');\n\t\t\t\t});\n\t\t\t} else {\n\t\t\t\tdom.content(resultField, E('div', { 'class': 'alert-message warning' }, \n\t\t\t\t\t_('Failed to switch SIM slot. Please check modem status.')));\n\t\t\t}\n\t\t}).catch(function(e) {\n\t\t\t// Re-enable buttons\n\t\t\t(buttons || []).forEach(function(b){ b.disabled = false; b.style.opacity = ''; });\n\t\t\t\n\t\t\tdom.content(resultField, E('div', { 'class': 'alert-message error' }, \n\t\t\t\t_('Error switching SIM slot: %s').format(e.message)));\n\t\t});\n\t},\n\n\thandleSaveApply: null,\n\thandleSave: null,\n\thandleReset: null\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/htdocs/luci-static/resources/view/qmodem/sms.js",
    "content": "'use strict';\n'require view';\n'require poll';\n'require ui';\n'require dom';\n'require uci';\n'require qmodem.sms as smsService';\n'require qmodem.qmodem as qmodem';\n\n// Load CSS\ndocument.head.appendChild(E('link', {\n\t'rel': 'stylesheet',\n\t'type': 'text/css',\n\t'href': L.resource('qmodem/qmodem-next.css')\n}));\n\nreturn view.extend({\n\t// Timezone offset setting utilities\n\tgetUtcOffsetSetting: function(type) {\n\t\t// type: 'received' or 'sent'\n\t\tvar key = 'qmodem_sms_utc_offset_' + type;\n\t\tvar setting = localStorage.getItem(key);\n\t\treturn setting === 'true';\n\t},\n\n\tsetUtcOffsetSetting: function(type, enabled) {\n\t\t// type: 'received' or 'sent'\n\t\tvar key = 'qmodem_sms_utc_offset_' + type;\n\t\tlocalStorage.setItem(key, enabled ? 'true' : 'false');\n\t},\n\n\tadjustTimestampForUtcOffset: function(timestamp, type) {\n\t\t// If UTC offset is enabled for this message type, adjust the timestamp\n\t\t// PDU time is in local time (UTC+8), but parsed as UTC+0\n\t\t// So we need to subtract 8 hours to get the correct UTC time\n\t\tif (this.getUtcOffsetSetting(type)) {\n\t\t\t// Subtract 8 hours (28800 seconds)\n\t\t\treturn timestamp - 28800;\n\t\t}\n\t\treturn timestamp;\n\t},\n\n\tload: function() {\n\t\treturn qmodem.getModemSections();\n\t},\n\n\trender: function(modems) {\n\t\tvar self = this;\n\t\tvar container = E('div', { 'class': 'cbi-map' });\n\n\t\t// Filter enabled modems\n\t\tmodems = modems.filter(function(m) { return m.enabled; });\n\n\t\tif (modems.length === 0) {\n\t\t\tcontainer.appendChild(E('div', { 'class': 'alert-message warning' }, \n\t\t\t\t_('No modems configured or all modems are disabled.')));\n\t\t\treturn container;\n\t\t}\n\n\t\t// Modem selector\n\t\tvar selectorSection = E('fieldset', { 'class': 'cbi-section' });\n\t\tvar selectorTable = E('table', { 'class': 'table' });\n\t\tvar selectorBody = E('tbody', {});\n\t\tvar selectorRow = E('tr', { 'class': 'tr' });\n\t\tvar labelCell = E('td', { 'class': 'td', 'width': '33%' }, _('Modem Name'));\n\t\tvar selectCell = E('td', { 'class': 'td' });\n\t\t\n\t\tvar select = E('select', {\n\t\t\t'class': 'cbi-input-select',\n\t\t\t'id': 'sms_modem_selector'\n\t\t});\n\t\t\n\t\tmodems.forEach(function(modem) {\n\t\t\tselect.appendChild(E('option', { 'value': modem.id }, modem.name));\n\t\t});\n\t\t\n\t\tselectCell.appendChild(select);\n\t\tselectorRow.appendChild(labelCell);\n\t\tselectorRow.appendChild(selectCell);\n\t\tselectorBody.appendChild(selectorRow);\n\n\t\t// Timezone offset setting for received messages\n\t\tvar timezoneReceivedRow = E('tr', { 'class': 'tr' });\n\t\tvar timezoneReceivedLabel = E('td', { 'class': 'td', 'width': '33%' }, \n\t\t\t_('Parse received SMS time as UTC+0'));\n\t\tvar timezoneReceivedCell = E('td', { 'class': 'td' });\n\t\t\n\t\tvar timezoneReceivedCheckbox = E('input', {\n\t\t\t'type': 'checkbox',\n\t\t\t'id': 'sms_utc_offset_received_checkbox'\n\t\t});\n\t\tif (self.getUtcOffsetSetting('received')) {\n\t\t\ttimezoneReceivedCheckbox.checked = true;\n\t\t}\n\t\t\n\t\ttimezoneReceivedCell.appendChild(timezoneReceivedCheckbox);\n\t\ttimezoneReceivedCell.appendChild(E('span', { 'style': 'margin-left: 5px;' }, \n\t\t\t_('Adjust received messages for local timezone (UTC+8)')));\n\t\ttimezoneReceivedRow.appendChild(timezoneReceivedLabel);\n\t\ttimezoneReceivedRow.appendChild(timezoneReceivedCell);\n\t\tselectorBody.appendChild(timezoneReceivedRow);\n\n\t\t// Timezone offset setting for sent messages\n\t\tvar timezoneSentRow = E('tr', { 'class': 'tr' });\n\t\tvar timezoneSentLabel = E('td', { 'class': 'td', 'width': '33%' }, \n\t\t\t_('Parse sent SMS time as UTC+0'));\n\t\tvar timezoneSentCell = E('td', { 'class': 'td' });\n\t\t\n\t\tvar timezoneSentCheckbox = E('input', {\n\t\t\t'type': 'checkbox',\n\t\t\t'id': 'sms_utc_offset_sent_checkbox'\n\t\t});\n\t\tif (self.getUtcOffsetSetting('sent')) {\n\t\t\ttimezoneSentCheckbox.checked = true;\n\t\t}\n\t\t\n\t\tvar timezoneHelpText = E('div', {\n\t\t\t'style': 'font-size: 12px; color: #666; margin-top: 5px;'\n\t\t}, _('Enable if SMS timestamps appear 8 hours ahead (e.g., UTC+8 local time parsed as UTC+0)'));\n\t\t\n\t\ttimezoneSentCell.appendChild(timezoneSentCheckbox);\n\t\ttimezoneSentCell.appendChild(E('span', { 'style': 'margin-left: 5px;' }, \n\t\t\t_('Adjust sent messages for local timezone (UTC+8)')));\n\ttimezoneSentCell.appendChild(timezoneHelpText);\n\ttimezoneSentRow.appendChild(timezoneSentLabel);\n\ttimezoneSentRow.appendChild(timezoneSentCell);\n\tselectorBody.appendChild(timezoneSentRow);\n\n\t// SMS database path setting\n\tvar smsDbPathRow = E('tr', { 'class': 'tr' });\n\tvar smsDbPathLabel = E('td', { 'class': 'td', 'width': '33%' }, \n\t\t_('SMS Database Path'));\n\tvar smsDbPathCell = E('td', { 'class': 'td' });\n\t\n\tvar smsDbPathInput = E('input', {\n\t\t'type': 'text',\n\t\t'class': 'cbi-input-text',\n\t\t'id': 'sms_db_path_input',\n\t\t'placeholder': '/etc/qmodem'\n\t});\n\t\n\tsmsDbPathCell.appendChild(smsDbPathInput);\n\tsmsDbPathCell.appendChild(E('div', {\n\t\t'style': 'font-size: 12px; color: #666; margin-top: 5px;'\n\t}, _('Path to SMS database file')));\n\tsmsDbPathRow.appendChild(smsDbPathLabel);\n\tsmsDbPathRow.appendChild(smsDbPathCell);\n\tselectorBody.appendChild(smsDbPathRow);\n\n\t// SMS auto delete from SIM setting\n\tvar smsAutoDeleteRow = E('tr', { 'class': 'tr' });\n\tvar smsAutoDeleteLabel = E('td', { 'class': 'td', 'width': '33%' }, \n\t\t_('Auto Delete from SIM'));\n\tvar smsAutoDeleteCell = E('td', { 'class': 'td' });\n\t\n\tvar smsAutoDeleteCheckbox = E('input', {\n\t\t'type': 'checkbox',\n\t\t'id': 'sms_auto_delete_checkbox'\n\t});\n\t\n\tsmsAutoDeleteCell.appendChild(smsAutoDeleteCheckbox);\n\tsmsAutoDeleteCell.appendChild(E('span', { 'style': 'margin-left: 5px;' }, \n\t\t_('Automatically delete SMS from SIM card after reading')));\n\tsmsAutoDeleteRow.appendChild(smsAutoDeleteLabel);\n\tsmsAutoDeleteRow.appendChild(smsAutoDeleteCell);\n\tselectorBody.appendChild(smsAutoDeleteRow);\n\n\tselectorTable.appendChild(selectorBody);\n\tselectorSection.appendChild(selectorTable);\n\tcontainer.appendChild(selectorSection);\n\n\t// SMS Storage Section\n\tvar storageSection = E('fieldset', { 'class': 'cbi-section' });\n\tvar storageLegend = E('legend', {}, _('SMS Storage'));\n\tstorageSection.appendChild(storageLegend);\n\t\n\tvar storageTable = E('table', { 'class': 'table' });\n\tvar storageBody = E('tbody', {});\n\t\n\t// Reading Storage\n\tvar readingRow = E('tr', { 'class': 'tr' });\n\tvar readingLabel = E('td', { 'class': 'td', 'width': '33%' }, _('Reading Storage'));\n\tvar readingCell = E('td', { 'class': 'td' });\n\tvar readingSelect = E('select', {\n\t\t'class': 'cbi-input-select',\n\t\t'id': 'sms_reading_storage'\n\t}, [\n\t\tE('option', { 'value': 'ME' }, _('Mobile Equipment (ME)')),\n\t\tE('option', { 'value': 'SM' }, _('SIM Card (SM)')),\n\t\tE('option', { 'value': 'Loading', 'selected': 'selected' }, _('Loading...'))\n\t]);\n\treadingCell.appendChild(readingSelect);\n\treadingRow.appendChild(readingLabel);\n\treadingRow.appendChild(readingCell);\n\tstorageBody.appendChild(readingRow);\n\t\n\t// Writing Storage\n\tvar writingRow = E('tr', { 'class': 'tr' });\n\tvar writingLabel = E('td', { 'class': 'td', 'width': '33%' }, _('Writing Storage'));\n\tvar writingCell = E('td', { 'class': 'td' });\n\tvar writingSelect = E('select', {\n\t\t'class': 'cbi-input-select',\n\t\t'id': 'sms_writing_storage'\n\t}, [\n\t\tE('option', { 'value': 'ME' }, _('Mobile Equipment (ME)')),\n\t\tE('option', { 'value': 'SM' }, _('SIM Card (SM)')),\n\t\tE('option', { 'value': 'Loading', 'selected': 'selected' }, _('Loading...'))\n\t]);\n\twritingCell.appendChild(writingSelect);\n\twritingRow.appendChild(writingLabel);\n\twritingRow.appendChild(writingCell);\n\tstorageBody.appendChild(writingRow);\n\t\n\t// ETC Storage\n\tvar etcRow = E('tr', { 'class': 'tr' });\n\tvar etcLabel = E('td', { 'class': 'td', 'width': '33%' }, _('Other Storage'));\n\tvar etcCell = E('td', { 'class': 'td' });\n\tvar etcSelect = E('select', {\n\t\t'class': 'cbi-input-select',\n\t\t'id': 'sms_etc_storage'\n\t}, [\n\t\tE('option', { 'value': 'ME' }, _('Mobile Equipment (ME)')),\n\t\tE('option', { 'value': 'SM' }, _('SIM Card (SM)')),\n\t\tE('option', { 'value': 'Loading', 'selected': 'selected' }, _('Loading...'))\n\t]);\n\tetcCell.appendChild(etcSelect);\n\tetcRow.appendChild(etcLabel);\n\tetcRow.appendChild(etcCell);\n\tstorageBody.appendChild(etcRow);\n\t\n\t// Set Storage Button\n\tvar setStorageRow = E('tr', { 'class': 'tr' });\n\tvar setStorageLabel = E('td', { 'class': 'td', 'width': '33%' }, '');\n\tvar setStorageCell = E('td', { 'class': 'td' });\n\tvar setStorageBtn = E('button', {\n\t\t'class': 'cbi-button cbi-button-apply',\n\t\t'id': 'sms_set_storage_btn',\n\t\t'click': function(ev) {\n\t\t\tev.preventDefault();\n\t\t\tself.setSmsStorage(select.value, readingSelect, writingSelect, etcSelect);\n\t\t}\n\t}, _('Apply Storage Settings'));\n\tsetStorageCell.appendChild(setStorageBtn);\n\tsetStorageRow.appendChild(setStorageLabel);\n\tsetStorageRow.appendChild(setStorageCell);\n\tstorageBody.appendChild(setStorageRow);\n\t\n\tstorageTable.appendChild(storageBody);\n\tstorageSection.appendChild(storageTable);\n\tcontainer.appendChild(storageSection);\n\t\n\t\t// Title\n\t\tvar title = E('h2', { 'name': 'content' }, _('SMS Messages'));\n\t\tcontainer.appendChild(title);\n\n\t\t// Description\n\t\tvar desc = E('div', { 'class': 'cbi-map-descr' }, \n\t\t\t_('View and manage SMS messages. Messages are grouped by sender/recipient.'));\n\t\tcontainer.appendChild(desc);\n\n\t\t// Main content area\n\t\tvar contentArea = E('div', { 'id': 'sms-list-content' });\n\t\tcontainer.appendChild(contentArea);\n\n\t\t// Loading indicator\n\t\tvar loadingDiv = E('div', { 'class': 'spinning' }, _('Loading...'));\n\t\tcontentArea.appendChild(loadingDiv);\n\n\t// Load SMS list with selected modem\n\tvar selectedModem = select.value;\n\t\n\t// Load UCI config for selected modem\n\tthis.loadUciConfig(selectedModem, smsDbPathInput, smsAutoDeleteCheckbox);\n\t\t// Load SMS storage info\n\tthis.loadSmsStorage(selectedModem, readingSelect, writingSelect, etcSelect);\n\t\tthis.loadSmsList(contentArea, loadingDiv, selectedModem);\n\n\t// Selector change handler\n\tselect.addEventListener('change', function() {\n\t\t// Load UCI config for selected modem\n\t\tself.loadUciConfig(select.value, smsDbPathInput, smsAutoDeleteCheckbox);\n\t\t\n\t\t// Load SMS storage info\n\t\tself.loadSmsStorage(select.value, readingSelect, writingSelect, etcSelect);\n\t\t\n\t\tvar loading = E('div', { 'class': 'spinning' }, _('Loading...'));\n\t\tdom.content(contentArea, loading);\n\t\tself.loadSmsList(contentArea, loading, select.value);\n\t});\n\n\t\t// Timezone checkbox change handler for received messages\n\t\ttimezoneReceivedCheckbox.addEventListener('change', function() {\n\t\t\tself.setUtcOffsetSetting('received', timezoneReceivedCheckbox.checked);\n\t\t\tvar loading = E('div', { 'class': 'spinning' }, _('Loading...'));\n\t\t\tdom.content(contentArea, loading);\n\t\t\tself.loadSmsList(contentArea, loading, select.value);\n\t\t});\n\n\t// Timezone checkbox change handler for sent messages\n\ttimezoneSentCheckbox.addEventListener('change', function() {\n\t\tself.setUtcOffsetSetting('sent', timezoneSentCheckbox.checked);\n\t\tvar loading = E('div', { 'class': 'spinning' }, _('Loading...'));\n\t\tdom.content(contentArea, loading);\n\t\tself.loadSmsList(contentArea, loading, select.value);\n\t});\n\n\t// SMS database path change handler\n\tsmsDbPathInput.addEventListener('change', function() {\n\t\tself.saveUciOption(select.value, 'sms_db_path', smsDbPathInput.value);\n\t});\n\n\t// SMS auto delete checkbox change handler\n\tsmsAutoDeleteCheckbox.addEventListener('change', function() {\n\t\tself.saveUciOption(select.value, 'sms_auto_delete_from_sim', smsAutoDeleteCheckbox.checked ? '1' : '0');\n\t});\n\n\t// Start polling for new messages\n\tpoll.add(function() {\n\t\tself.pollSmsList(contentArea, select.value);\n\t}, 10);\t\treturn container;\n\t},\n\n\tloadSmsList: function(contentArea, loadingDiv, configSection) {\n\t\tvar self = this;\n\n\t\tsmsService.listSms(configSection).then(function(result) {\n\t\t\t// Adjust timestamps if UTC offset is enabled (based on message type)\n\t\t\tif (result.conversations && result.conversations.length > 0) {\n\t\t\t\tresult.conversations.forEach(function(conv) {\n\t\t\t\t\tif (conv.messages && conv.messages.length > 0) {\n\t\t\t\t\t\tconv.messages.forEach(function(msg) {\n\t\t\t\t\t\t\tif (msg.timestamp && msg.type) {\n\t\t\t\t\t\t\t\tmsg.timestamp = self.adjustTimestampForUtcOffset(msg.timestamp, msg.type);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\t// Re-sort messages by timestamp\n\t\t\t\t\t\tconv.messages.sort(function(a, b) {\n\t\t\t\t\t\t\treturn a.timestamp - b.timestamp;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\n\t\t\t// Remove loading indicator\n\t\t\tif (loadingDiv && loadingDiv.parentNode) {\n\t\t\t\tdom.content(contentArea, null);\n\t\t\t}\n\n\t\t\tif (result.error) {\n\t\t\t\tcontentArea.appendChild(E('div', { 'class': 'alert-message error' }, \n\t\t\t\t\t_('Error loading SMS: ') + result.error));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Render conversations list\n\t\t\tself.renderConversationsList(contentArea, result.conversations || [], configSection);\n\t\t}).catch(function(err) {\n\t\t\tif (loadingDiv && loadingDiv.parentNode) {\n\t\t\t\tdom.content(contentArea, null);\n\t\t\t}\n\t\t\tcontentArea.appendChild(E('div', { 'class': 'alert-message error' }, \n\t\t\t\t_('Failed to load SMS: ') + err.message));\n\t\t});\n\t},\n\n\tpollSmsList: function(contentArea, configSection) {\n\t\tvar self = this;\n\t\t\n\t\tsmsService.listSms(configSection).then(function(result) {\n\t\t\tif (!result.error && result.conversations) {\n\t\t\t\t// Adjust timestamps if UTC offset is enabled (based on message type)\n\t\t\t\tif (result.conversations.length > 0) {\n\t\t\t\t\tresult.conversations.forEach(function(conv) {\n\t\t\t\t\t\tif (conv.messages && conv.messages.length > 0) {\n\t\t\t\t\t\t\tconv.messages.forEach(function(msg) {\n\t\t\t\t\t\t\t\tif (msg.timestamp && msg.type) {\n\t\t\t\t\t\t\t\t\tmsg.timestamp = self.adjustTimestampForUtcOffset(msg.timestamp, msg.type);\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t// Re-sort messages by timestamp\n\t\t\t\t\t\t\tconv.messages.sort(function(a, b) {\n\t\t\t\t\t\t\t\treturn a.timestamp - b.timestamp;\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t\tself.renderConversationsList(contentArea, result.conversations, configSection);\n\t\t\t}\n\t\t}).catch(function(err) {\n\t\t\tconsole.error('Poll error:', err);\n\t\t});\n\t},\n\n\trenderConversationsList: function(contentArea, conversations, configSection) {\n\t\tvar self = this;\n\n\t\t// Clear content\n\t\tdom.content(contentArea, null);\n\n\t\t// Create conversations container\n\t\tvar conversationsDiv = E('div', { 'class': 'sms-conversations' });\n\n\t\tif (!conversations || conversations.length === 0) {\n\t\t\tconversationsDiv.appendChild(E('div', { 'class': 'alert-message info' }, \n\t\t\t\t_('No messages found')));\n\t\t} else {\n\t\t\t// Create conversations list\n\t\t\tvar listDiv = E('div', { 'class': 'cbi-section' });\n\t\t\tvar listFieldset = E('fieldset', { 'class': 'cbi-section' });\n\t\t\tvar listLegend = E('legend', {}, _('Conversations'));\n\t\t\n\t\tlistFieldset.appendChild(listLegend);\n\n\t\t// Create table\n\t\tvar table = E('table', { 'class': 'table cbi-section-table' });\n\t\tvar thead = E('thead', {}, [\n\t\t\tE('tr', { 'class': 'tr cbi-section-table-titles' }, [\n\t\t\t\tE('th', { 'class': 'th', 'style': 'width: 30%' }, _('Contact')),\n\t\t\t\tE('th', { 'class': 'th', 'style': 'width: 50%' }, _('Last Message')),\n\t\t\t\tE('th', { 'class': 'th', 'style': 'width: 15%' }, _('Time')),\n\t\t\t\tE('th', { 'class': 'th', 'style': 'width: 5%' }, _('Count'))\n\t\t\t])\n\t\t]);\n\t\ttable.appendChild(thead);\n\n\t\tvar tbody = E('tbody', {});\n\n\t\t// Add conversation rows\n\t\tfor (var i = 0; i < conversations.length; i++) {\n\t\t\tvar conv = conversations[i];\n\t\t\tvar lastMsg = conv.messages && conv.messages.length > 0 ? \n\t\t\t              conv.messages[conv.messages.length - 1] : null;\n\t\t\t\n\t\t\tvar contact = smsService.formatPhoneNumber(conv.contact);\n\t\t\tvar preview = lastMsg ? smsService.truncateMessage(lastMsg.content, 40) : '';\n\t\t\tvar time = lastMsg ? smsService.formatTimestamp(lastMsg.timestamp) : '';\n\t\t\tvar count = conv.messages ? conv.messages.length : 0;\n\t\t\t\n\t\t\t// Use unread_count from backend\n\t\t\tvar unreadCount = conv.unread_count || 0;\n\n\t\t\tvar row = E('tr', { \n\t\t\t\t'class': 'tr cbi-section-table-row' + (unreadCount > 0 ? ' sms-unread-conversation' : ''),\n\t\t\t\t'style': 'cursor: pointer;' + (unreadCount > 0 ? ' font-weight: bold;' : ''),\n\t\t\t\t'data-contact': conv.contact\n\t\t\t}, [\n\t\t\t\tE('td', { 'class': 'td' }, [\n\t\t\t\t\tcontact,\n\t\t\t\t\tunreadCount > 0 ? E('span', { \n\t\t\t\t\t\t'class': 'sms-unread-badge',\n\t\t\t\t\t\t'style': 'background: #e74c3c; color: white; border-radius: 10px; padding: 2px 6px; margin-left: 8px; font-size: 11px;'\n\t\t\t\t\t}, String(unreadCount)) : ''\n\t\t\t\t]),\n\t\t\t\tE('td', { 'class': 'td' }, preview),\n\t\t\t\tE('td', { 'class': 'td' }, time),\n\t\t\t\tE('td', { 'class': 'td', 'style': 'text-align: center' }, String(count))\n\t\t\t]);\n\n\t\t\t// Add click handler\n\t\t\trow.addEventListener('click', L.bind(function(contact) {\n\t\t\t\tL.ui.showModal(_('Loading...'), E('div', { 'class': 'spinning' }));\n\t\t\t\twindow.location.href = L.url('admin/modem/qmodem/sms/conversation', encodeURIComponent(contact));\n\t\t\t}, this, conv.contact));\n\n\t\t\ttbody.appendChild(row);\n\t\t}\n\n\t\ttable.appendChild(tbody);\n\t\tlistFieldset.appendChild(table);\n\t\tlistDiv.appendChild(listFieldset);\n\t\tconversationsDiv.appendChild(listDiv);\n\t\t}\n\n\t\t// Add action buttons - always show these regardless of whether there are conversations\n\t\tvar buttonDiv = E('div', { 'class': 'cbi-page-actions' });\n\t\t\n\t\tvar newConversationBtn = E('button', {\n\t\t\t'class': 'cbi-button cbi-button-add',\n\t\t\t'click': L.bind(function(ev) {\n\t\t\t\tev.preventDefault();\n\t\t\t\tthis.showNewConversationDialog(configSection);\n\t\t\t}, this)\n\t\t}, _('New Conversation'));\n\t\t\n\t\tvar refreshBtn = E('button', {\n\t\t\t'class': 'cbi-button cbi-button-action',\n\t\t\t'click': L.bind(function(ev) {\n\t\t\t\tev.preventDefault();\n\t\t\t\tvar loading = E('div', { 'class': 'spinning' }, _('Loading...'));\n\t\t\t\tdom.content(contentArea, loading);\n\t\t\t\tthis.loadSmsList(contentArea, loading, configSection);\n\t\t\t}, this)\n\t\t}, _('Refresh'));\n\t\t\n\t\tbuttonDiv.appendChild(newConversationBtn);\n\t\tbuttonDiv.appendChild(refreshBtn);\n\t\tconversationsDiv.appendChild(buttonDiv);\n\n\t\tcontentArea.appendChild(conversationsDiv);\n\t},\n\n\tshowNewConversationDialog: function(configSection) {\n\t\tvar self = this;\n\t\t\n\t\tvar modalContent = E('div', { 'class': 'cbi-section' }, [\n\t\t\tE('div', { 'class': 'cbi-value' }, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Phone Number')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tE('input', {\n\t\t\t\t\t\t'type': 'text',\n\t\t\t\t\t\t'id': 'new-conversation-phone',\n\t\t\t\t\t\t'class': 'cbi-input-text',\n\t\t\t\t\t\t'placeholder': _('Enter phone number')\n\t\t\t\t\t})\n\t\t\t\t])\n\t\t\t]),\n\t\t\tE('div', { 'class': 'cbi-value' }, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Message')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tE('textarea', {\n\t\t\t\t\t\t'id': 'new-conversation-message',\n\t\t\t\t\t\t'class': 'cbi-input-textarea',\n\t\t\t\t\t\t'rows': '4',\n\t\t\t\t\t\t'placeholder': _('Enter your message here...')\n\t\t\t\t\t})\n\t\t\t\t])\n\t\t\t]),\n\t\t\tE('div', { 'class': 'cbi-value' }, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Encoding')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tE('select', {\n\t\t\t\t\t\t'id': 'new-conversation-encoding',\n\t\t\t\t\t\t'class': 'cbi-input-select'\n\t\t\t\t\t}, [\n\t\t\t\t\t\tE('option', { 'value': '7bit' }, _('7-bit (ASCII)')),\n\t\t\t\t\t\tE('option', { 'value': '16bit', 'selected': 'selected' }, _('16-bit (Unicode)'))\n\t\t\t\t\t])\n\t\t\t\t])\n\t\t\t]),\n\t\t\tE('div', { \n\t\t\t\t'class': 'cbi-value',\n\t\t\t\t'style': 'font-size: 12px; color: #666;'\n\t\t\t}, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Length')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tE('span', { 'id': 'new-conversation-counter' }, '0/160')\n\t\t\t\t])\n\t\t\t])\n\t\t]);\n\n\t\t// Show modal first\n\t\tui.showModal(_('New Conversation'), [\n\t\t\tmodalContent,\n\t\t\tE('div', { 'class': 'right' }, [\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'cbi-button cbi-button-neutral',\n\t\t\t\t\t'click': function() {\n\t\t\t\t\t\tui.hideModal();\n\t\t\t\t\t}\n\t\t\t\t}, _('Cancel')),\n\t\t\t\t' ',\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'cbi-button cbi-button-save',\n\t\t\t\t\t'id': 'new-conversation-send-btn',\n\t\t\t\t\t'click': function() {\n\t\t\t\t\t\tvar phoneInput = document.getElementById('new-conversation-phone');\n\t\t\t\t\t\tvar messageInput = document.getElementById('new-conversation-message');\n\t\t\t\t\t\tvar encodingInput = document.getElementById('new-conversation-encoding');\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar phone = phoneInput.value.trim();\n\t\t\t\t\t\tvar message = messageInput.value.trim();\n\t\t\t\t\t\tvar encoding = encodingInput.value;\n\n\t\t\t\t\t\tif (!phone) {\n\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Please enter a phone number')), 'error');\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tif (!message) {\n\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Please enter a message')), 'error');\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t// Close modal and send message\n\t\t\t\t\t\tui.hideModal();\n\t\t\t\t\t\t\n\t\t\t\t\t\tui.showModal(_('Sending...'), E('div', { 'class': 'spinning' }, _('Sending message...')));\n\n\t\t\t\t\t\tsmsService.sendSms(configSection, phone, message, encoding).then(function(result) {\n\t\t\t\t\t\t\tui.hideModal();\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (result.error) {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to send SMS: ') + result.error), 'error');\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\n\t\t\t\t\t\t\tif (result.success) {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Message sent successfully')), 'info');\n\t\t\t\t\t\t\t\t// Navigate to the conversation\n\t\t\t\t\t\t\t\tsetTimeout(function() {\n\t\t\t\t\t\t\t\t\twindow.location.href = L.url('admin/modem/qmodem/sms/conversation', encodeURIComponent(phone));\n\t\t\t\t\t\t\t\t}, 500);\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}).catch(function(err) {\n\t\t\t\t\t\t\tui.hideModal();\n\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to send SMS: ') + err.message), 'error');\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, _('Send'))\n\t\t\t])\n\t\t]);\n\n\t\t// Add character counter\n\t\tvar textarea = document.getElementById('new-conversation-message');\n\t\tvar encodingSelect = document.getElementById('new-conversation-encoding');\n\t\tvar counter = document.getElementById('new-conversation-counter');\n\n\t\tvar updateCounter = function() {\n\t\t\tvar text = textarea.value;\n\t\t\tvar encoding = encodingSelect.value;\n\t\t\tvar maxLength = encoding === '7bit' ? 160 : 70;\n\t\t\tvar parts = Math.ceil(text.length / maxLength);\n\t\t\t\n\t\t\tif (parts > 1) {\n\t\t\t\tmaxLength = encoding === '7bit' ? 153 : 66;\n\t\t\t\tparts = Math.ceil(text.length / maxLength);\n\t\t\t}\n\t\t\t\n\t\t\tcounter.textContent = text.length + ' / ' + maxLength + \n\t\t\t                      (parts > 1 ? ' (' + parts + ' parts)' : '');\n\t\t\t\n\t\t\tif (text.length > maxLength * 5) {\n\t\t\t\tcounter.style.color = 'red';\n\t\t\t} else if (parts > 1) {\n\t\t\t\tcounter.style.color = 'orange';\n\t\t\t} else {\n\t\t\t\tcounter.style.color = '#666';\n\t\t\t}\n\t\t};\n\n\ttextarea.addEventListener('input', updateCounter);\n\tencodingSelect.addEventListener('change', updateCounter);\n},\n\nloadUciConfig: function(configSection, smsDbPathInput, smsAutoDeleteCheckbox) {\n\treturn uci.load('qmodem').then(function() {\n\t\t// Load sms_db_path\n\t\tvar dbPath = uci.get('qmodem', configSection, 'sms_db_path');\n\t\tif (dbPath) {\n\t\t\tsmsDbPathInput.value = dbPath;\n\t\t} else {\n\t\t\tsmsDbPathInput.value = '';\n\t\t}\n\n\t\t// Load sms_auto_delete_from_sim\n\t\tvar autoDelete = uci.get('qmodem', configSection, 'sms_auto_delete_from_sim');\n\t\tsmsAutoDeleteCheckbox.checked = (autoDelete === '1');\n\t});\n},\n\nsaveUciOption: function(configSection, option, value) {\n\treturn uci.load('qmodem').then(function() {\n\t\tuci.set('qmodem', configSection, option, value);\n\t\treturn uci.save();\n\t}).then(function() {\n\t\tui.addNotification(null, E('p', _('Configuration saved')), 'info');\n\t}).catch(function(err) {\n\t\tui.addNotification(null, E('p', _('Failed to save configuration: ') + err.message), 'error');\n\t});\n},\n\nloadSmsStorage: function(configSection, readingSelect, writingSelect, etcSelect) {\n\tvar self = this;\n\t\n\t// Reset to Loading state\n\treadingSelect.value = 'Loading';\n\twritingSelect.value = 'Loading';\n\tetcSelect.value = 'Loading';\n\t\n\treturn smsService.getSmsStorage(configSection).then(function(result) {\n\t\tif (result.error) {\n\t\t\tconsole.error('Failed to get SMS storage:', result.error);\n\t\t\tui.addNotification(null, E('p', _('Failed to get SMS storage: ') + result.error), 'error');\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (!result.storage) {\n\t\t\tconsole.error('No storage info returned');\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tvar storage = result.storage;\n\t\t\n\t\t// Update select values with current storage\n\t\tif (storage.mem1) {\n\t\t\treadingSelect.value = storage.mem1;\n\t\t}\n\t\tif (storage.mem2) {\n\t\t\twritingSelect.value = storage.mem2;\n\t\t}\n\t\tif (storage.mem3) {\n\t\t\tetcSelect.value = storage.mem3;\n\t\t}\n\t\t\n\t\t// Update option labels with usage info\n\t\tvar meText = _('Mobile Equipment (ME)');\n\t\tvar smText = _('SIM Card (SM)');\n\t\t\n\t\tif (storage.ME && storage.ME.total > 0) {\n\t\t\tmeText += ' (' + storage.ME.used + '/' + storage.ME.total + ')';\n\t\t}\n\t\t\n\t\tif (storage.SM && storage.SM.total > 0) {\n\t\t\tsmText += ' (' + storage.SM.used + '/' + storage.SM.total + ')';\n\t\t}\n\t\t\n\t\t// Update all selects\n\t\t[readingSelect, writingSelect, etcSelect].forEach(function(select) {\n\t\t\tvar meOption = select.querySelector('option[value=\"ME\"]');\n\t\t\tvar smOption = select.querySelector('option[value=\"SM\"]');\n\t\t\t\n\t\t\tif (meOption) meOption.textContent = meText;\n\t\t\tif (smOption) smOption.textContent = smText;\n\t\t});\n\t\t\n\t}).catch(function(err) {\n\t\tconsole.error('Error loading SMS storage:', err);\n\t\tui.addNotification(null, E('p', _('Error loading SMS storage: ') + err.message), 'error');\n\t});\n},\n\nsetSmsStorage: function(configSection, readingSelect, writingSelect, etcSelect) {\n\tvar self = this;\n\t\n\tvar mem1 = readingSelect.value;\n\tvar mem2 = writingSelect.value;\n\tvar mem3 = etcSelect.value;\n\t\n\tif (mem1 === 'Loading' || mem2 === 'Loading') {\n\t\tui.addNotification(null, E('p', _('Please wait for storage info to load')), 'warning');\n\t\treturn;\n\t}\n\t\n\tui.showModal(_('Setting SMS Storage'), E('div', { 'class': 'spinning' }, _('Applying settings...')));\n\t\n\treturn smsService.setSmsStorage(configSection, mem1, mem2, mem3).then(function(result) {\n\t\tui.hideModal();\n\t\t\n\t\tif (result.error) {\n\t\t\tui.addNotification(null, E('p', _('Failed to set SMS storage: ') + result.error), 'error');\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tif (result.success) {\n\t\t\tui.addNotification(null, E('p', _('SMS storage settings applied successfully')), 'info');\n\t\t\t// Reload storage info to verify\n\t\t\tself.loadSmsStorage(configSection, readingSelect, writingSelect, etcSelect);\n\t\t} else {\n\t\t\tui.addNotification(null, E('p', _('Failed to set SMS storage')), 'error');\n\t\t}\n\t}).catch(function(err) {\n\t\tui.hideModal();\n\t\tui.addNotification(null, E('p', _('Error setting SMS storage: ') + err.message), 'error');\n\t});\n},\n\nhandleSaveApply: null,\nhandleSave: null,\nhandleReset: null\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/htdocs/luci-static/resources/view/qmodem/sms_conversation.js",
    "content": "'use strict';\n'require view';\n'require poll';\n'require ui';\n'require dom';\n'require uci';\n'require qmodem.sms as smsService';\n'require qmodem.qmodem as qmodem';\n\n// Load CSS\ndocument.head.appendChild(E('link', {\n\t'rel': 'stylesheet',\n\t'type': 'text/css',\n\t'href': L.resource('qmodem/qmodem-next.css')\n}));\n\nreturn view.extend({\n\t// Timezone offset setting utilities\n\tgetUtcOffsetSetting: function(type) {\n\t\t// type: 'received' or 'sent'\n\t\tvar key = 'qmodem_sms_utc_offset_' + type;\n\t\tvar setting = localStorage.getItem(key);\n\t\treturn setting === 'true';\n\t},\n\n\tsetUtcOffsetSetting: function(type, enabled) {\n\t\t// type: 'received' or 'sent'\n\t\tvar key = 'qmodem_sms_utc_offset_' + type;\n\t\tlocalStorage.setItem(key, enabled ? 'true' : 'false');\n\t},\n\n\tadjustTimestampForUtcOffset: function(timestamp, type) {\n\t\t// If UTC offset is enabled for this message type, adjust the timestamp\n\t\t// PDU time is in local time (UTC+8), but parsed as UTC+0\n\t\t// So we need to subtract 8 hours to get the correct UTC time\n\t\tif (this.getUtcOffsetSetting(type)) {\n\t\t\t// Subtract 8 hours (28800 seconds)\n\t\t\treturn timestamp - 28800;\n\t\t}\n\t\treturn timestamp;\n\t},\n\n\tload: function() {\n\t\t// Get contact from URL hash or path\n\t\tvar hash = window.location.hash || window.location.pathname;\n\t\tvar match = hash.match(/\\/conversation\\/([^\\/\\?#]+)/);\n\t\tvar contact = match ? decodeURIComponent(match[1]) : null;\n\n\t\treturn Promise.all([\n\t\t\tqmodem.getModemSections(),\n\t\t\tPromise.resolve(contact)\n\t\t]);\n\t},\n\n\trender: function(loadResult) {\n\t\tvar self = this;\n\t\tvar modems = loadResult[0];\n\t\tvar contact = loadResult[1];\n\n\t\tif (!contact) {\n\t\t\treturn E('div', { 'class': 'cbi-map' }, [\n\t\t\t\tE('h2', {}, _('SMS Conversation')),\n\t\t\t\tE('div', { 'class': 'alert-message error' }, \n\t\t\t\t\t_('Invalid contact'))\n\t\t\t]);\n\t\t}\n\n\t\t// Filter enabled modems\n\t\tmodems = modems.filter(function(m) { return m.enabled; });\n\n\t\tif (modems.length === 0) {\n\t\t\treturn E('div', { 'class': 'alert-message warning' }, \n\t\t\t\t_('No modems configured or all modems are disabled.'));\n\t\t}\n\n\t\tvar container = E('div', { 'class': 'cbi-map' });\n\n\t\t// Modem selector\n\t\tvar selectorSection = E('fieldset', { 'class': 'cbi-section' });\n\t\tvar selectorTable = E('table', { 'class': 'table' });\n\t\tvar selectorBody = E('tbody', {});\n\t\tvar selectorRow = E('tr', { 'class': 'tr' });\n\t\tvar labelCell = E('td', { 'class': 'td', 'width': '33%' }, _('Modem Name'));\n\t\tvar selectCell = E('td', { 'class': 'td' });\n\t\t\n\t\tvar select = E('select', {\n\t\t\t'class': 'cbi-input-select',\n\t\t\t'id': 'sms_modem_selector'\n\t\t});\n\t\t\n\t\tmodems.forEach(function(modem) {\n\t\t\tselect.appendChild(E('option', { 'value': modem.id }, modem.name));\n\t\t});\n\t\t\n\t\tselectCell.appendChild(select);\n\t\tselectorRow.appendChild(labelCell);\n\t\tselectorRow.appendChild(selectCell);\n\t\tselectorBody.appendChild(selectorRow);\n\n\t\t// Timezone offset setting for received messages\n\t\tvar timezoneReceivedRow = E('tr', { 'class': 'tr' });\n\t\tvar timezoneReceivedLabel = E('td', { 'class': 'td', 'width': '33%' }, \n\t\t\t_('Parse received SMS time as UTC+0'));\n\t\tvar timezoneReceivedCell = E('td', { 'class': 'td' });\n\t\t\n\t\tvar timezoneReceivedCheckbox = E('input', {\n\t\t\t'type': 'checkbox',\n\t\t\t'id': 'sms_utc_offset_received_checkbox'\n\t\t});\n\t\tif (self.getUtcOffsetSetting('received')) {\n\t\t\ttimezoneReceivedCheckbox.checked = true;\n\t\t}\n\t\t\n\t\ttimezoneReceivedCell.appendChild(timezoneReceivedCheckbox);\n\t\ttimezoneReceivedCell.appendChild(E('span', { 'style': 'margin-left: 5px;' }, \n\t\t\t_('Adjust received messages for local timezone (UTC+8)')));\n\t\ttimezoneReceivedRow.appendChild(timezoneReceivedLabel);\n\t\ttimezoneReceivedRow.appendChild(timezoneReceivedCell);\n\t\tselectorBody.appendChild(timezoneReceivedRow);\n\n\t\t// Timezone offset setting for sent messages\n\t\tvar timezoneSentRow = E('tr', { 'class': 'tr' });\n\t\tvar timezoneSentLabel = E('td', { 'class': 'td', 'width': '33%' }, \n\t\t\t_('Parse sent SMS time as UTC+0'));\n\t\tvar timezoneSentCell = E('td', { 'class': 'td' });\n\t\t\n\t\tvar timezoneSentCheckbox = E('input', {\n\t\t\t'type': 'checkbox',\n\t\t\t'id': 'sms_utc_offset_sent_checkbox'\n\t\t});\n\t\tif (self.getUtcOffsetSetting('sent')) {\n\t\t\ttimezoneSentCheckbox.checked = true;\n\t\t}\n\t\t\n\t\tvar timezoneHelpText = E('div', {\n\t\t\t'style': 'font-size: 12px; color: #666; margin-top: 5px;'\n\t\t}, _('Enable if SMS timestamps appear 8 hours ahead (e.g., UTC+8 local time parsed as UTC+0)'));\n\t\t\n\t\ttimezoneSentCell.appendChild(timezoneSentCheckbox);\n\t\ttimezoneSentCell.appendChild(E('span', { 'style': 'margin-left: 5px;' }, \n\t\t\t_('Adjust sent messages for local timezone (UTC+8)')));\n\t\ttimezoneSentCell.appendChild(timezoneHelpText);\n\t\ttimezoneSentRow.appendChild(timezoneSentLabel);\n\t\ttimezoneSentRow.appendChild(timezoneSentCell);\n\t\tselectorBody.appendChild(timezoneSentRow);\n\n\t\tselectorTable.appendChild(selectorBody);\n\t\tselectorSection.appendChild(selectorTable);\n\t\tcontainer.appendChild(selectorSection);\n\n\t\t// Header with back button\n\t\tvar headerDiv = E('div', { 'class': 'sms-conversation-header' }, [\n\t\t\tE('button', {\n\t\t\t\t'class': 'cbi-button cbi-button-neutral',\n\t\t\t\t'style': 'margin-right: 10px;',\n\t\t\t\t'click': function(ev) {\n\t\t\t\t\tev.preventDefault();\n\t\t\t\t\twindow.location.href = L.url('admin/modem/qmodem/sms');\n\t\t\t\t}\n\t\t\t}, '← ' + _('Back')),\n\t\t\tE('h2', { 'style': 'display: inline-block; margin: 0;' }, \n\t\t\t\t_('Conversation with ') + smsService.formatPhoneNumber(contact))\n\t\t]);\n\t\tcontainer.appendChild(headerDiv);\n\n\t\t// Messages area\n\t\tvar messagesArea = E('div', { \n\t\t\t'id': 'sms-messages-area',\n\t\t\t'class': 'sms-messages-area',\n\t\t\t'style': 'margin-top: 20px;'\n\t\t});\n\t\tcontainer.appendChild(messagesArea);\n\n\t\t// Loading indicator\n\t\tvar loadingDiv = E('div', { 'class': 'spinning' }, _('Loading messages...'));\n\t\tmessagesArea.appendChild(loadingDiv);\n\n\t\t// Get selected modem\n\t\tvar selectedModem = select.value;\n\n\t\t// Reply form\n\t\tvar replyForm = this.createReplyForm(contact, selectedModem, messagesArea, loadingDiv, select);\n\t\tcontainer.appendChild(replyForm);\n\n\t\t// Load conversation\n\t\tthis.loadConversation(messagesArea, loadingDiv, selectedModem, contact);\n\n\t\t// Selector change handler\n\t\tselect.addEventListener('change', function() {\n\t\t\tvar loading = E('div', { 'class': 'spinning' }, _('Loading...'));\n\t\t\tdom.content(messagesArea, loading);\n\t\t\tself.loadConversation(messagesArea, loading, select.value, contact);\n\t\t});\n\n\t\t// Timezone checkbox change handler for received messages\n\t\ttimezoneReceivedCheckbox.addEventListener('change', function() {\n\t\t\tself.setUtcOffsetSetting('received', timezoneReceivedCheckbox.checked);\n\t\t\tvar loading = E('div', { 'class': 'spinning' }, _('Loading...'));\n\t\t\tdom.content(messagesArea, loading);\n\t\t\tself.loadConversation(messagesArea, loading, select.value, contact);\n\t\t});\n\n\t\t// Timezone checkbox change handler for sent messages\n\t\ttimezoneSentCheckbox.addEventListener('change', function() {\n\t\t\tself.setUtcOffsetSetting('sent', timezoneSentCheckbox.checked);\n\t\t\tvar loading = E('div', { 'class': 'spinning' }, _('Loading...'));\n\t\t\tdom.content(messagesArea, loading);\n\t\t\tself.loadConversation(messagesArea, loading, select.value, contact);\n\t\t});\n\n\t\t// Start polling for new messages\n\t\tpoll.add(function() {\n\t\t\tself.pollConversation(messagesArea, select.value, contact);\n\t\t}, 5);\n\n\t\treturn container;\n\t},\n\n\tcreateReplyForm: function(contact, configSection, messagesArea, loadingDiv, select) {\n\t\tvar self = this;\n\n\t\tvar formDiv = E('div', { \n\t\t\t'class': 'cbi-section',\n\t\t\t'style': 'margin-top: 20px;'\n\t\t});\n\n\t\tvar fieldset = E('fieldset', { 'class': 'cbi-section' });\n\t\tvar legend = E('legend', {}, _('Send Message'));\n\t\tfieldset.appendChild(legend);\n\n\t\t// Message input\n\t\tvar inputDiv = E('div', { 'class': 'cbi-value' });\n\t\tvar inputLabel = E('label', { 'class': 'cbi-value-title' }, _('Message'));\n\t\tvar inputField = E('div', { 'class': 'cbi-value-field' });\n\t\tvar textarea = E('textarea', {\n\t\t\t'id': 'sms-reply-text',\n\t\t\t'class': 'cbi-input-textarea',\n\t\t\t'rows': '3',\n\t\t\t'placeholder': _('Enter your message here...')\n\t\t});\n\t\tinputField.appendChild(textarea);\n\t\tinputDiv.appendChild(inputLabel);\n\t\tinputDiv.appendChild(inputField);\n\t\tfieldset.appendChild(inputDiv);\n\n\t\t// Encoding selection\n\t\tvar encodingDiv = E('div', { 'class': 'cbi-value' });\n\t\tvar encodingLabel = E('label', { 'class': 'cbi-value-title' }, _('Encoding'));\n\t\tvar encodingField = E('div', { 'class': 'cbi-value-field' });\n\t\tvar encodingSelect = E('select', {\n\t\t\t'id': 'sms-encoding',\n\t\t\t'class': 'cbi-input-select'\n\t\t}, [\n\t\t\tE('option', { 'value': '7bit' }, _('7-bit (ASCII)')),\n\t\t\tE('option', { 'value': '16bit', 'selected': 'selected' }, _('16-bit (Unicode)'))\n\t\t]);\n\t\tencodingField.appendChild(encodingSelect);\n\t\tencodingDiv.appendChild(encodingLabel);\n\t\tencodingDiv.appendChild(encodingField);\n\t\tfieldset.appendChild(encodingDiv);\n\n\t\t// Character counter\n\t\tvar counterDiv = E('div', { \n\t\t\t'class': 'cbi-value',\n\t\t\t'style': 'font-size: 12px; color: #666;'\n\t\t});\n\t\tvar counter = E('span', { 'id': 'sms-char-counter' }, '0/160');\n\t\tcounterDiv.appendChild(E('label', { 'class': 'cbi-value-title' }, _('Length')));\n\t\tcounterDiv.appendChild(E('div', { 'class': 'cbi-value-field' }, counter));\n\t\tfieldset.appendChild(counterDiv);\n\n\t\t// Update character counter\n\t\ttextarea.addEventListener('input', function() {\n\t\t\tvar text = textarea.value;\n\t\t\tvar encoding = encodingSelect.value;\n\t\t\tvar maxLength = encoding === '7bit' ? 160 : 70;\n\t\t\tvar parts = Math.ceil(text.length / maxLength);\n\t\t\t\n\t\t\tif (parts > 1) {\n\t\t\t\tmaxLength = encoding === '7bit' ? 153 : 66;\n\t\t\t\tparts = Math.ceil(text.length / maxLength);\n\t\t\t}\n\t\t\t\n\t\t\tcounter.textContent = text.length + ' / ' + maxLength + \n\t\t\t                      (parts > 1 ? ' (' + parts + ' parts)' : '');\n\t\t\t\n\t\t\tif (text.length > maxLength * 5) {\n\t\t\t\tcounter.style.color = 'red';\n\t\t\t} else if (parts > 1) {\n\t\t\t\tcounter.style.color = 'orange';\n\t\t\t} else {\n\t\t\t\tcounter.style.color = '#666';\n\t\t\t}\n\t\t});\n\n\t\t// Buttons\n\t\tvar buttonsDiv = E('div', { 'class': 'cbi-page-actions' });\n\t\tvar sendBtn = E('button', {\n\t\t\t'class': 'cbi-button cbi-button-save',\n\t\t\t'click': function(ev) {\n\t\t\t\tev.preventDefault();\n\t\t\t\tvar currentModem = select ? select.value : configSection;\n\t\t\t\tself.sendMessage(textarea, encodingSelect, contact, currentModem, \n\t\t\t\t                messagesArea, loadingDiv, sendBtn, select);\n\t\t\t}\n\t\t}, _('Send'));\n\t\t\n\t\tvar clearBtn = E('button', {\n\t\t\t'class': 'cbi-button cbi-button-reset',\n\t\t\t'click': function(ev) {\n\t\t\t\tev.preventDefault();\n\t\t\t\ttextarea.value = '';\n\t\t\t\ttextarea.dispatchEvent(new Event('input'));\n\t\t\t}\n\t\t}, _('Clear'));\n\n\t\tbuttonsDiv.appendChild(sendBtn);\n\t\tbuttonsDiv.appendChild(clearBtn);\n\t\tfieldset.appendChild(buttonsDiv);\n\n\t\tformDiv.appendChild(fieldset);\n\t\treturn formDiv;\n\t},\n\n\tsendMessage: function(textarea, encodingSelect, contact, configSection, \n\t                      messagesArea, loadingDiv, sendBtn, select) {\n\t\tvar self = this;\n\t\tvar message = textarea.value.trim();\n\t\tvar encoding = encodingSelect.value;\n\n\t\tif (!message) {\n\t\t\tui.addNotification(null, E('p', _('Please enter a message')), 'error');\n\t\t\treturn;\n\t\t}\n\n\t\t// Disable send button\n\t\tsendBtn.disabled = true;\n\t\tsendBtn.textContent = _('Sending...');\n\n\t\tsmsService.sendSms(configSection, contact, message, encoding).then(function(result) {\n\t\t\tsendBtn.disabled = false;\n\t\t\tsendBtn.textContent = _('Send');\n\n\t\t\tif (result.error) {\n\t\t\t\tui.addNotification(null, E('p', _('Failed to send SMS: ') + result.error), 'error');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tif (result.success) {\n\t\t\t\tui.addNotification(null, E('p', _('Message sent successfully')), 'info');\n\t\t\t\ttextarea.value = '';\n\t\t\t\ttextarea.dispatchEvent(new Event('input'));\n\t\t\t\t\n\t\t\t\t// Reload conversation with current modem\n\t\t\t\tvar currentModem = select ? select.value : configSection;\n\t\t\t\tself.loadConversation(messagesArea, loadingDiv, currentModem, contact);\n\t\t\t}\n\t\t}).catch(function(err) {\n\t\t\tsendBtn.disabled = false;\n\t\t\tsendBtn.textContent = _('Send');\n\t\t\tui.addNotification(null, E('p', _('Failed to send SMS: ') + err.message), 'error');\n\t\t});\n\t},\n\n\tloadConversation: function(messagesArea, loadingDiv, configSection, contact) {\n\t\tvar self = this;\n\n\t\tsmsService.getConversation(configSection, contact).then(function(result) {\n\t\t\t// Auto-mark all received messages as read\n\t\t\tif (result.messages && result.messages.length > 0) {\n\t\t\t\tvar unreadIds = [];\n\t\t\t\tresult.messages.forEach(function(msg) {\n\t\t\t\t\tif (msg.type === 'received' && msg.is_read === false) {\n\t\t\t\t\t\tif (msg.part_ids && msg.part_ids.length > 0) {\n\t\t\t\t\t\t\t// For multipart messages, mark all parts as read\n\t\t\t\t\t\t\tunreadIds = unreadIds.concat(msg.part_ids);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tunreadIds.push(msg.id);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\tif (unreadIds.length > 0) {\n\t\t\t\t\tsmsService.markRead(configSection, unreadIds);\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Adjust timestamps if UTC offset is enabled (based on message type)\n\t\t\tif (result.messages && result.messages.length > 0) {\n\t\t\t\tvar needsReSort = false;\n\t\t\t\tresult.messages.forEach(function(msg) {\n\t\t\t\t\tif (msg.timestamp && msg.type) {\n\t\t\t\t\t\tvar originalTimestamp = msg.timestamp;\n\t\t\t\t\t\tmsg.timestamp = self.adjustTimestampForUtcOffset(msg.timestamp, msg.type);\n\t\t\t\t\t\tif (originalTimestamp !== msg.timestamp) {\n\t\t\t\t\t\t\tneedsReSort = true;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t\t// Re-sort messages by timestamp if any were adjusted\n\t\t\t\tif (needsReSort) {\n\t\t\t\t\tresult.messages.sort(function(a, b) {\n\t\t\t\t\t\treturn a.timestamp - b.timestamp;\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Remove loading indicator\n\t\t\tif (loadingDiv && loadingDiv.parentNode) {\n\t\t\t\tdom.content(messagesArea, null);\n\t\t\t}\n\n\t\t\tif (result.error) {\n\t\t\t\tmessagesArea.appendChild(E('div', { 'class': 'alert-message error' }, \n\t\t\t\t\t_('Error loading messages: ') + result.error));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Render messages\n\t\t\tself.renderMessages(messagesArea, result.messages || [], configSection);\n\t\t}).catch(function(err) {\n\t\t\tif (loadingDiv && loadingDiv.parentNode) {\n\t\t\t\tdom.content(messagesArea, null);\n\t\t\t}\n\t\t\tmessagesArea.appendChild(E('div', { 'class': 'alert-message error' }, \n\t\t\t\t_('Failed to load messages: ') + err.message));\n\t\t});\n\t},\n\n\tpollConversation: function(messagesArea, configSection, contact) {\n\t\tvar self = this;\n\t\t\n\t\tsmsService.getConversation(configSection, contact).then(function(result) {\n\t\t\tif (!result.error && result.messages) {\n\t\t\t\t// Adjust timestamps if UTC offset is enabled (based on message type)\n\t\t\t\tif (result.messages.length > 0) {\n\t\t\t\t\tvar needsReSort = false;\n\t\t\t\t\tresult.messages.forEach(function(msg) {\n\t\t\t\t\t\tif (msg.timestamp && msg.type) {\n\t\t\t\t\t\t\tvar originalTimestamp = msg.timestamp;\n\t\t\t\t\t\t\tmsg.timestamp = self.adjustTimestampForUtcOffset(msg.timestamp, msg.type);\n\t\t\t\t\t\t\tif (originalTimestamp !== msg.timestamp) {\n\t\t\t\t\t\t\t\tneedsReSort = true;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t\t// Re-sort messages by timestamp if any were adjusted\n\t\t\t\t\tif (needsReSort) {\n\t\t\t\t\t\tresult.messages.sort(function(a, b) {\n\t\t\t\t\t\t\treturn a.timestamp - b.timestamp;\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tself.renderMessages(messagesArea, result.messages, configSection);\n\t\t\t}\n\t\t}).catch(function(err) {\n\t\t\tconsole.error('Poll error:', err);\n\t\t});\n\t},\n\n\trenderMessages: function(messagesArea, messages, configSection) {\n\t\tvar self = this;\n\n\t\t// Clear content\n\t\tdom.content(messagesArea, null);\n\n\t\tif (!messages || messages.length === 0) {\n\t\t\tmessagesArea.appendChild(E('div', { 'class': 'alert-message info' }, \n\t\t\t\t_('No messages in this conversation')));\n\t\t\treturn;\n\t\t}\n\n\t\t// Create messages list\n\t\tvar messagesDiv = E('div', { 'class': 'sms-messages-list' });\n\n\t\tfor (var i = 0; i < messages.length; i++) {\n\t\t\tvar msg = messages[i];\n\t\t\tvar isReceived = msg.type === 'received';\n\t\t\tvar isSent = msg.type === 'sent';\n\n\t\t\t// Message bubble\n\t\t\tvar bubbleClass = 'sms-message-bubble ' + \n\t\t\t                  (isReceived ? 'sms-message-received' : 'sms-message-sent');\n\t\t\t\n\t\t\tvar bubble = E('div', { 'class': bubbleClass });\n\n\t\t\t// Message content\n\t\t\tvar contentDiv = E('div', { 'class': 'sms-message-content' }, msg.content);\n\t\t\tbubble.appendChild(contentDiv);\n\n\t\t\t// Message metadata\n\t\t\tvar metaDiv = E('div', { 'class': 'sms-message-meta' });\n\t\t\t\n\t\t\tvar timeStr = this.formatFullTimestamp(msg.timestamp);\n\t\t\tvar timeSpan = E('span', { 'class': 'sms-message-time' }, timeStr);\n\t\t\tmetaDiv.appendChild(timeSpan);\n\n\t\t\t// Show multipart info if applicable\n\t\t\tif (msg.multipart) {\n\t\t\t\tvar multipartSpan = E('span', { \n\t\t\t\t\t'class': 'sms-message-info',\n\t\t\t\t\t'style': 'margin-left: 10px;'\n\t\t\t\t}, _('Multi-part'));\n\t\t\t\tmetaDiv.appendChild(multipartSpan);\n\t\t\t}\n\n\t\t\t// Show incomplete warning\n\t\t\tif (msg.incomplete) {\n\t\t\t\tvar incompleteSpan = E('span', { \n\t\t\t\t\t'class': 'sms-message-warning',\n\t\t\t\t\t'style': 'margin-left: 10px; color: orange;'\n\t\t\t\t}, _('Incomplete (part ') + msg.part + '/' + msg.total + ')');\n\t\t\t\tmetaDiv.appendChild(incompleteSpan);\n\t\t\t}\n\n\t\t\t// Show failed indicator for sent messages\n\t\t\tif (isSent && msg.is_success === false) {\n\t\t\t\tvar failedSpan = E('span', { \n\t\t\t\t\t'class': 'sms-message-failed',\n\t\t\t\t\t'style': 'margin-left: 10px; color: #e74c3c;',\n\t\t\t\t\t'title': _('Failed to send')\n\t\t\t\t}, '✗ ' + _('Failed'));\n\t\t\t\tmetaDiv.appendChild(failedSpan);\n\t\t\t}\n\n\t\t\t// Delete button for all messages\n\t\t\tvar deleteBtn = E('button', {\n\t\t\t\t'class': 'cbi-button cbi-button-remove',\n\t\t\t\t'style': 'margin-left: 10px; font-size: 11px; padding: 2px 6px;',\n\t\t\t\t'click': L.bind(function(message, contact, ev) {\n\t\t\t\t\tev.preventDefault();\n\t\t\t\t\tif (confirm(_('Delete this message?'))) {\n\t\t\t\t\t\tvar msgContact = message.type === 'received' ? message.sender : message.recipient;\n\t\t\t\t\t\tthis.deleteMessage(configSection, message, msgContact, messagesArea);\n\t\t\t\t\t}\n\t\t\t\t}, this, msg, (isReceived ? msg.sender : msg.recipient))\n\t\t\t}, _('Delete'));\n\t\t\tmetaDiv.appendChild(deleteBtn);\n\n\t\t\tbubble.appendChild(metaDiv);\n\n\t\t\t// Wrapper for alignment\n\t\t\tvar wrapperClass = 'sms-message-wrapper ' + \n\t\t\t                   (isReceived ? 'sms-message-wrapper-left' : 'sms-message-wrapper-right');\n\t\t\tvar wrapper = E('div', { 'class': wrapperClass }, bubble);\n\n\t\t\tmessagesDiv.appendChild(wrapper);\n\t\t}\n\n\t\tmessagesArea.appendChild(messagesDiv);\n\n\t\t// Scroll to bottom\n\t\tsetTimeout(function() {\n\t\t\tmessagesArea.scrollTop = messagesArea.scrollHeight;\n\t\t}, 100);\n\t},\n\n\tdeleteMessage: function(configSection, message, contact, messagesArea) {\n\t\tvar self = this;\n\n\t\t// Determine which IDs to delete\n\t\tvar idsToDelete;\n\t\tif (message.part_ids && message.part_ids.length > 0) {\n\t\t\t// For multipart messages, delete all parts\n\t\t\tidsToDelete = message.part_ids;\n\t\t} else {\n\t\t\t// For single messages, delete by ID\n\t\t\tidsToDelete = [message.id];\n\t\t}\n\n\t\tsmsService.deleteSms(\n\t\t\tconfigSection,\n\t\t\tmessage.type,\n\t\t\tidsToDelete\n\t\t).then(function(result) {\n\t\t\tif (result.error) {\n\t\t\t\tui.addNotification(null, E('p', _('Failed to delete SMS: ') + result.error), 'error');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tui.addNotification(null, E('p', _('Message deleted')), 'info');\n\t\t\t\n\t\t\t// Reload conversation\n\t\t\tvar loading = E('div', { 'class': 'spinning' }, _('Loading...'));\n\t\t\tdom.content(messagesArea, loading);\n\t\t\tself.loadConversation(messagesArea, loading, configSection, contact);\n\t\t}).catch(function(err) {\n\t\t\tui.addNotification(null, E('p', _('Failed to delete SMS: ') + err.message), 'error');\n\t\t});\n\t},\n\n\tformatFullTimestamp: function(timestamp) {\n\t\tvar date = new Date(timestamp * 1000);\n\t\t\n\t\treturn String(date.getFullYear()) + '-' + \n\t\t       String(date.getMonth() + 1).padStart(2, '0') + '-' + \n\t\t       String(date.getDate()).padStart(2, '0') + ' ' +\n\t\t       String(date.getHours()).padStart(2, '0') + ':' + \n\t\t       String(date.getMinutes()).padStart(2, '0') + ':' + \n\t\t       String(date.getSeconds()).padStart(2, '0');\n\t},\n\n\thandleSaveApply: null,\n\thandleSave: null,\n\thandleReset: null\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/htdocs/luci-static/resources/view/qmodem/sms_forward.js",
    "content": "'use strict';\n'require view';\n'require form';\n'require uci';\n'require ui';\n'require qmodem.qmodem as qmodem';\n\nreturn view.extend({\n\tload: function() {\n\t\treturn Promise.all([\n\t\t\tuci.load('sms_forwarder'),\n\t\t\tqmodem.getModemSections()\n\t\t]);\n\t},\n\n\trender: function(data) {\n\t\tvar modems = data[1];\n\t\tvar m, s, o;\n\n\t\tm = new form.Map('sms_forwarder', _('SMS Forwarder Configuration'),\n\t\t\t_('Configure SMS forwarding to various notification services'));\n\n\t\t// Global settings\n\t\ts = m.section(form.NamedSection, 'sms_forward', 'sms_forward', _('Global Settings'));\n\n\t\to = s.option(form.Flag, 'enable', _('Enable SMS Forwarder'));\n\t\to.default = '0';\n\t\to.rmempty = false;\n\n\t\to = s.option(form.ListValue, 'log_level', _('Log Level'));\n\t\to.value('error', _('Error'));\n\t\to.value('warn', _('Warning'));\n\t\to.value('info', _('Info'));\n\t\to.value('debug', _('Debug'));\n\t\to.default = 'info';\n\n\t\t// Forward instances\n\t\ts = m.section(form.GridSection, 'sms_forward_instance', _('Forward Instances'),\n\t\t\t_('Configure SMS forwarding instances for different modems and services'));\n\n\t\ts.addremove = true;\n\t\ts.anonymous = true;\n\t\ts.sortable = true;\n\n\t\to = s.option(form.Flag, 'enable', _('Enable'));\n\t\to.default = '0';\n\t\to.editable = true;\n\n\t\to = s.option(form.ListValue, 'modem_cfg', _('Modem Config'));\n\t\to.rmempty = false;\n\t\tmodems.forEach(function(modem) {\n\t\t\tif (modem.enabled) {\n\t\t\t\to.value(modem.id, modem.name);\n\t\t\t}\n\t\t});\n\n\t\to = s.option(form.Value, 'poll_interval', _('Poll Interval (seconds)'));\n\t\to.datatype = 'range(5,600)';\n\t\to.default = '30';\n\t\to.placeholder = '30';\n\n\t\to = s.option(form.ListValue, 'api_type', _('API Type'));\n\t\to.value('tgbot', _('Telegram Bot'));\n\t\to.value('webhook', _('Webhook'));\n\t\to.value('serverchan', _('ServerChan'));\n\t\to.value('pushdeer', _('PushDeer'));\n\t\to.value('feishu', _('Feishu Bot'));\n\t\to.value('custom', _('Custom Script'));\n\t\to.default = 'webhook';\n\n\t\t// Modal button to configure API\n\t\to = s.option(form.Button, '_configure', _('Configure'));\n\t\to.inputtitle = _('Configure API');\n\t\to.inputstyle = 'apply';\n\t\to.onclick = L.bind(function(ev, section_id) {\n\t\t\tthis.showConfigModal(section_id, modems);\n\t\t}, this);\n\n\t\treturn m.render();\n\t},\n\n\tshowConfigModal: function(section_id, modems) {\n\t\tvar self = this;\n\t\tvar api_type = uci.get('sms_forwarder', section_id, 'api_type') || 'webhook';\n\t\tvar api_config_str = uci.get('sms_forwarder', section_id, 'api_config') || '{}';\n\t\tvar api_config = {};\n\t\t\n\t\ttry {\n\t\t\tapi_config = JSON.parse(api_config_str);\n\t\t} catch(e) {\n\t\t\tapi_config = {};\n\t\t}\n\n\t\tvar modalBody = [];\n\t\tvar inputs = {};\n\n\t\tmodalBody.push(E('p', { 'class': 'alert-message info' }, \n\t\t\t_('Configure the API settings for ') + api_type));\n\n\t\t// Telegram Bot configuration\n\t\tif (api_type === 'tgbot') {\n\t\t\tmodalBody.push(E('div', { 'class': 'cbi-value' }, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Bot Token')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tinputs.bot_token = E('input', {\n\t\t\t\t\t\t'type': 'text',\n\t\t\t\t\t\t'class': 'cbi-input-text',\n\t\t\t\t\t\t'value': api_config.bot_token || '',\n\t\t\t\t\t\t'placeholder': '123456:ABC-DEF1234ghIkl'\n\t\t\t\t\t})\n\t\t\t\t])\n\t\t\t]));\n\n\t\t\tmodalBody.push(E('div', { 'class': 'cbi-value' }, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Chat ID')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tinputs.chat_id = E('input', {\n\t\t\t\t\t\t'type': 'text',\n\t\t\t\t\t\t'class': 'cbi-input-text',\n\t\t\t\t\t\t'value': api_config.chat_id || '',\n\t\t\t\t\t\t'placeholder': '123456789'\n\t\t\t\t\t})\n\t\t\t\t])\n\t\t\t]));\n\t\t}\n\t\t// Webhook configuration\n\t\telse if (api_type === 'webhook') {\n\t\t\tmodalBody.push(E('div', { 'class': 'cbi-value' }, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Webhook URL')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tinputs.webhook_url = E('input', {\n\t\t\t\t\t\t'type': 'text',\n\t\t\t\t\t\t'class': 'cbi-input-text',\n\t\t\t\t\t\t'value': api_config.webhook_url || '',\n\t\t\t\t\t\t'placeholder': 'https://example.com/webhook'\n\t\t\t\t\t}),\n\t\t\t\t\tE('div', { 'class': 'cbi-value-description' }, \n\t\t\t\t\t\t_('Supports placeholders: {SENDER}, {CONTENT}, {TIME}'))\n\t\t\t\t])\n\t\t\t]));\n\n\t\t\tmodalBody.push(E('div', { 'class': 'cbi-value' }, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Request Method')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tinputs.request_method = E('select', { 'class': 'cbi-input-select' }, [\n\t\t\t\t\t\tE('option', { 'value': 'GET', 'selected': (api_config.request_method === 'GET' || !api_config.request_method) }, 'GET'),\n\t\t\t\t\t\tE('option', { 'value': 'POST', 'selected': (api_config.request_method === 'POST') }, 'POST')\n\t\t\t\t\t])\n\t\t\t\t])\n\t\t\t]));\n\n\t\t\tmodalBody.push(E('div', { 'class': 'cbi-value' }, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Message Format (optional)')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tinputs.format = E('input', {\n\t\t\t\t\t\t'type': 'text',\n\t\t\t\t\t\t'class': 'cbi-input-text',\n\t\t\t\t\t\t'value': api_config.format || '',\n\t\t\t\t\t\t'placeholder': '{\"sender\":\"{SENDER}\",\"time\":\"{TIME}\",\"content\":\"{CONTENT}\"}'\n\t\t\t\t\t}),\n\t\t\t\t\tE('div', { 'class': 'cbi-value-description' }, \n\t\t\t\t\t\t_('Custom format using placeholders: {SENDER}, {CONTENT}, {TIME}'))\n\t\t\t\t])\n\t\t\t]));\n\n\t\t\tmodalBody.push(E('div', { 'class': 'cbi-value' }, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Headers (optional)')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tinputs.headers = E('input', {\n\t\t\t\t\t\t'type': 'text',\n\t\t\t\t\t\t'class': 'cbi-input-text',\n\t\t\t\t\t\t'value': api_config.headers || '',\n\t\t\t\t\t\t'placeholder': 'Authorization: Bearer token'\n\t\t\t\t\t}),\n\t\t\t\t\tE('div', { 'class': 'cbi-value-description' }, \n\t\t\t\t\t\t_('HTTP headers, one per line'))\n\t\t\t\t])\n\t\t\t]));\n\t\t}\n\t\t// ServerChan configuration\n\t\telse if (api_type === 'serverchan') {\n\t\t\tmodalBody.push(E('div', { 'class': 'cbi-value' }, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Token')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tinputs.token = E('input', {\n\t\t\t\t\t\t'type': 'text',\n\t\t\t\t\t\t'class': 'cbi-input-text',\n\t\t\t\t\t\t'value': api_config.token || '',\n\t\t\t\t\t\t'placeholder': 'SCT123456TCxyz...'\n\t\t\t\t\t}),\n\t\t\t\t\tE('div', { 'class': 'cbi-value-description' }, \n\t\t\t\t\t\t_('ServerChan API token from https://sctapi.ftqq.com'))\n\t\t\t\t])\n\t\t\t]));\n\n\t\t\tmodalBody.push(E('div', { 'class': 'cbi-value' }, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Channel (optional)')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tinputs.channel = E('input', {\n\t\t\t\t\t\t'type': 'text',\n\t\t\t\t\t\t'class': 'cbi-input-text',\n\t\t\t\t\t\t'value': api_config.channel || '',\n\t\t\t\t\t\t'placeholder': '9|66'\n\t\t\t\t\t}),\n\t\t\t\t\tE('div', { 'class': 'cbi-value-description' }, \n\t\t\t\t\t\t_('Message channel, use | to separate multiple channels'))\n\t\t\t\t])\n\t\t\t]));\n\n\t\t\tmodalBody.push(E('div', { 'class': 'cbi-value' }, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Hide IP')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tinputs.noip = E('input', {\n\t\t\t\t\t\t'type': 'checkbox',\n\t\t\t\t\t\t'checked': api_config.noip === '1' || api_config.noip === true\n\t\t\t\t\t})\n\t\t\t\t])\n\t\t\t]));\n\n\t\t\tmodalBody.push(E('div', { 'class': 'cbi-value' }, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('OpenID (optional)')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tinputs.openid = E('input', {\n\t\t\t\t\t\t'type': 'text',\n\t\t\t\t\t\t'class': 'cbi-input-text',\n\t\t\t\t\t\t'value': api_config.openid || '',\n\t\t\t\t\t\t'placeholder': 'openid1,openid2'\n\t\t\t\t\t}),\n\t\t\t\t\tE('div', { 'class': 'cbi-value-description' }, \n\t\t\t\t\t\t_('OpenID for message forwarding, use comma to separate multiple IDs'))\n\t\t\t\t])\n\t\t\t]));\n\t\t}\n\t\t// PushDeer configuration\n\t\telse if (api_type === 'pushdeer') {\n\t\t\tmodalBody.push(E('div', { 'class': 'cbi-value' }, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Push Key')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tinputs.pushkey = E('input', {\n\t\t\t\t\t\t'type': 'text',\n\t\t\t\t\t\t'class': 'cbi-input-text',\n\t\t\t\t\t\t'value': api_config.pushkey || '',\n\t\t\t\t\t\t'placeholder': 'PDU123456T...'\n\t\t\t\t\t}),\n\t\t\t\t\tE('div', { 'class': 'cbi-value-description' }, \n\t\t\t\t\t\t_('PushDeer Push Key from http://pushdeer.com'))\n\t\t\t\t])\n\t\t\t]));\n\n\t\t\tmodalBody.push(E('div', { 'class': 'cbi-value' }, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Server (optional)')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tinputs.server = E('input', {\n\t\t\t\t\t\t'type': 'text',\n\t\t\t\t\t\t'class': 'cbi-input-text',\n\t\t\t\t\t\t'value': api_config.server || '',\n\t\t\t\t\t\t'placeholder': 'https://api2.pushdeer.com'\n\t\t\t\t\t}),\n\t\t\t\t\tE('div', { 'class': 'cbi-value-description' }, \n\t\t\t\t\t\t_('Custom PushDeer API endpoint, leave empty to use default'))\n\t\t\t\t])\n\t\t\t]));\n\t\t}\n\t\t// Feishu configuration\n\t\telse if (api_type === 'feishu') {\n\t\t\tmodalBody.push(E('div', { 'class': 'cbi-value' }, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Webhook URL')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tinputs.webhook_url = E('input', {\n\t\t\t\t\t\t'type': 'text',\n\t\t\t\t\t\t'class': 'cbi-input-text',\n\t\t\t\t\t\t'value': api_config.webhook_url || '',\n\t\t\t\t\t\t'placeholder': 'https://open.feishu.cn/open-apis/bot/v2/hook/xxxxx'\n\t\t\t\t\t}),\n\t\t\t\t\tE('div', { 'class': 'cbi-value-description' }, \n\t\t\t\t\t\t_('Feishu webhook URL from your bot configuration'))\n\t\t\t\t])\n\t\t\t]));\n\t\t}\n\t\t// Custom script configuration\n\t\telse if (api_type === 'custom') {\n\t\t\tmodalBody.push(E('div', { 'class': 'cbi-value' }, [\n\t\t\t\tE('label', { 'class': 'cbi-value-title' }, _('Script Path')),\n\t\t\t\tE('div', { 'class': 'cbi-value-field' }, [\n\t\t\t\t\tinputs.script_path = E('input', {\n\t\t\t\t\t\t'type': 'text',\n\t\t\t\t\t\t'class': 'cbi-input-text',\n\t\t\t\t\t\t'value': api_config.script_path || '',\n\t\t\t\t\t\t'placeholder': '/usr/share/sms_forwarder/sms_forward_custom.sh'\n\t\t\t\t\t}),\n\t\t\t\t\tE('div', { 'class': 'cbi-value-description' }, \n\t\t\t\t\t\t_('Path to custom forwarding script. Script receives SMS_SENDER, SMS_TIME, SMS_CONTENT environment variables'))\n\t\t\t\t])\n\t\t\t]));\n\t\t}\n\n\t\tui.showModal(_('Configure API Settings'), [\n\t\t\tE('div', { 'class': 'cbi-section' }, modalBody),\n\t\t\tE('div', { 'class': 'right' }, [\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'btn cbi-button-neutral',\n\t\t\t\t\t'click': ui.hideModal\n\t\t\t\t}, _('Cancel')),\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'btn cbi-button-positive',\n\t\t\t\t\t'click': function() {\n\t\t\t\t\t\tself.saveApiConfig(section_id, api_type, inputs);\n\t\t\t\t\t}\n\t\t\t\t}, _('Save'))\n\t\t\t])\n\t\t]);\n\t},\n\n\tsaveApiConfig: function(section_id, api_type, inputs) {\n\t\tvar config = {};\n\n\t\tif (api_type === 'tgbot') {\n\t\t\tconfig.bot_token = inputs.bot_token.value.trim();\n\t\t\tconfig.chat_id = inputs.chat_id.value.trim();\n\t\t} else if (api_type === 'webhook') {\n\t\t\tconfig.webhook_url = inputs.webhook_url.value.trim();\n\t\t\tconfig.request_method = inputs.request_method.value;\n\t\t\tif (inputs.format.value.trim()) {\n\t\t\t\tconfig.format = inputs.format.value.trim();\n\t\t\t}\n\t\t\tif (inputs.headers.value.trim()) {\n\t\t\t\tconfig.headers = inputs.headers.value.trim();\n\t\t\t}\n\t\t} else if (api_type === 'serverchan') {\n\t\t\tconfig.token = inputs.token.value.trim();\n\t\t\tif (inputs.channel.value.trim()) {\n\t\t\t\tconfig.channel = inputs.channel.value.trim();\n\t\t\t}\n\t\t\tconfig.noip = inputs.noip.checked ? '1' : '0';\n\t\t\tif (inputs.openid.value.trim()) {\n\t\t\t\tconfig.openid = inputs.openid.value.trim();\n\t\t\t}\n\t\t} else if (api_type === 'pushdeer') {\n\t\t\tconfig.pushkey = inputs.pushkey.value.trim();\n\t\t\tif (inputs.server.value.trim()) {\n\t\t\t\tconfig.server = inputs.server.value.trim();\n\t\t\t}\n\t\t} else if (api_type === 'feishu') {\n\t\t\tconfig.webhook_url = inputs.webhook_url.value.trim();\n\t\t} else if (api_type === 'custom') {\n\t\t\tconfig.script_path = inputs.script_path.value.trim();\n\t\t}\n\n\t\tvar config_str = JSON.stringify(config);\n\t\tuci.set('sms_forwarder', section_id, 'api_config', config_str);\n\n\t\tui.hideModal();\n\t\tui.addNotification(null, E('p', _('API configuration saved. Remember to save & apply changes.')), 'info');\n\t}\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/htdocs/luci-static/resources/view/qmodem/sms_sim.js",
    "content": "'use strict';\n'require view';\n'require poll';\n'require ui';\n'require dom';\n'require qmodem.sms as smsService';\n'require qmodem.qmodem as qmodem';\n\n// Load CSS\ndocument.head.appendChild(E('link', {\n\t'rel': 'stylesheet',\n\t'type': 'text/css',\n\t'href': L.resource('qmodem/qmodem-next.css')\n}));\n\nreturn view.extend({\n\tload: function() {\n\t\treturn qmodem.getModemSections();\n\t},\n\n\trender: function(modems) {\n\t\tvar self = this;\n\t\tvar container = E('div', { 'class': 'cbi-map' });\n\n\t\t// Filter enabled modems\n\t\tmodems = modems.filter(function(m) { return m.enabled; });\n\n\t\tif (modems.length === 0) {\n\t\t\tcontainer.appendChild(E('div', { 'class': 'alert-message warning' }, \n\t\t\t\t_('No modems configured or all modems are disabled.')));\n\t\t\treturn container;\n\t\t}\n\n\t\t// Modem selector\n\t\tvar selectorSection = E('fieldset', { 'class': 'cbi-section' });\n\t\tvar selectorTable = E('table', { 'class': 'table' });\n\t\tvar selectorBody = E('tbody', {});\n\t\tvar selectorRow = E('tr', { 'class': 'tr' });\n\t\tvar labelCell = E('td', { 'class': 'td', 'width': '33%' }, _('Modem Name'));\n\t\tvar selectCell = E('td', { 'class': 'td' });\n\t\t\n\t\tvar select = E('select', {\n\t\t\t'class': 'cbi-input-select',\n\t\t\t'id': 'sms_sim_modem_selector'\n\t\t});\n\t\t\n\t\tmodems.forEach(function(modem) {\n\t\t\tselect.appendChild(E('option', { 'value': modem.id }, modem.name));\n\t\t});\n\t\t\n\t\tselectCell.appendChild(select);\n\t\tselectorRow.appendChild(labelCell);\n\t\tselectorRow.appendChild(selectCell);\n\t\tselectorBody.appendChild(selectorRow);\n\t\tselectorTable.appendChild(selectorBody);\n\t\tselectorSection.appendChild(selectorTable);\n\t\tcontainer.appendChild(selectorSection);\n\n\t\t// Title\n\t\tvar title = E('h2', { 'name': 'content' }, _('SIM Card SMS Management'));\n\t\tcontainer.appendChild(title);\n\n\t\t// Description\n\t\tvar desc = E('div', { 'class': 'cbi-map-descr' }, \n\t\t\t_('View and delete SMS messages stored on SIM card. These are raw messages before being processed into conversations.'));\n\t\tcontainer.appendChild(desc);\n\n\t\t// Main content area\n\t\tvar contentArea = E('div', { 'id': 'sms-sim-content' });\n\t\tcontainer.appendChild(contentArea);\n\n\t\t// Loading indicator\n\t\tvar loadingDiv = E('div', { 'class': 'spinning' }, _('Loading...'));\n\t\tcontentArea.appendChild(loadingDiv);\n\n\t\t// Load SIM SMS list with selected modem\n\t\tvar selectedModem = select.value;\n\t\tthis.loadSimSmsList(contentArea, loadingDiv, selectedModem);\n\n\t\t// Selector change handler\n\t\tselect.addEventListener('change', function() {\n\t\t\tvar loading = E('div', { 'class': 'spinning' }, _('Loading...'));\n\t\t\tdom.content(contentArea, loading);\n\t\t\tself.loadSimSmsList(contentArea, loading, select.value);\n\t\t});\n\n\t\t// Start polling for updates\n\t\tpoll.add(function() {\n\t\t\tself.pollSimSmsList(contentArea, select.value);\n\t\t}, 10);\n\n\t\treturn container;\n\t},\n\n\tloadSimSmsList: function(contentArea, loadingDiv, configSection) {\n\t\tvar self = this;\n\n\t\tsmsService.getSimSms(configSection).then(function(result) {\n\t\t\t// Remove loading indicator\n\t\t\tif (loadingDiv && loadingDiv.parentNode) {\n\t\t\t\tdom.content(contentArea, null);\n\t\t\t}\n\n\t\t\tif (result.error) {\n\t\t\t\tcontentArea.appendChild(E('div', { 'class': 'alert-message error' }, \n\t\t\t\t\t_('Error loading SIM SMS: ') + result.error));\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\t// Render SIM SMS list\n\t\t\tself.renderSimSmsList(contentArea, result.messages || [], configSection);\n\t\t}).catch(function(err) {\n\t\t\tif (loadingDiv && loadingDiv.parentNode) {\n\t\t\t\tdom.content(contentArea, null);\n\t\t\t}\n\t\t\tcontentArea.appendChild(E('div', { 'class': 'alert-message error' }, \n\t\t\t\t_('Failed to load SIM SMS: ') + err.message));\n\t\t});\n\t},\n\n\tpollSimSmsList: function(contentArea, configSection) {\n\t\tvar self = this;\n\t\t\n\t\tsmsService.getSimSms(configSection).then(function(result) {\n\t\t\tif (!result.error && result.messages) {\n\t\t\t\tself.renderSimSmsList(contentArea, result.messages, configSection);\n\t\t\t}\n\t\t}).catch(function(err) {\n\t\t\tconsole.error('Poll error:', err);\n\t\t});\n\t},\n\n\trenderSimSmsList: function(contentArea, messages, configSection) {\n\t\tvar self = this;\n\n\t\t// Clear content\n\t\tdom.content(contentArea, null);\n\n\t\t// Create messages container\n\t\tvar messagesDiv = E('div', { 'class': 'sms-sim-messages' });\n\n\t\tif (!messages || messages.length === 0) {\n\t\t\tmessagesDiv.appendChild(E('div', { 'class': 'alert-message info' }, \n\t\t\t\t_('No messages found on SIM card')));\n\t\t} else {\n\t\t\t// Create messages list\n\t\t\tvar listDiv = E('div', { 'class': 'cbi-section' });\n\t\t\tvar listFieldset = E('fieldset', { 'class': 'cbi-section' });\n\t\t\tvar listLegend = E('legend', {}, _('SMS Messages on SIM Card'));\n\t\t\n\t\t\tlistFieldset.appendChild(listLegend);\n\n\t\t\t// Create table\n\t\t\tvar table = E('table', { 'class': 'table cbi-section-table' });\n\t\t\tvar thead = E('thead', {}, [\n\t\t\t\tE('tr', { 'class': 'tr cbi-section-table-titles' }, [\n\t\t\t\t\tE('th', { 'class': 'th', 'style': 'width: 5%' }, _('Index')),\n\t\t\t\t\tE('th', { 'class': 'th', 'style': 'width: 15%' }, _('Sender')),\n\t\t\t\t\tE('th', { 'class': 'th', 'style': 'width: 15%' }, _('Time')),\n\t\t\t\t\tE('th', { 'class': 'th', 'style': 'width: 50%' }, _('Content')),\n\t\t\t\t\tE('th', { 'class': 'th', 'style': 'width: 10%' }, _('Type')),\n\t\t\t\t\tE('th', { 'class': 'th', 'style': 'width: 5%' }, _('Actions'))\n\t\t\t\t])\n\t\t\t]);\n\t\t\ttable.appendChild(thead);\n\n\t\t\tvar tbody = E('tbody', {});\n\n\t\t\t// Add message rows\n\t\t\tfor (var i = 0; i < messages.length; i++) {\n\t\t\t\tvar msg = messages[i];\n\t\t\t\t\n\t\t\t\tvar index = msg.index != null ? String(msg.index) : '-';\n\t\t\t\tvar sender = smsService.formatPhoneNumber(msg.sender || '-');\n\t\t\t\tvar time = msg.timestamp ? smsService.formatTimestamp(msg.timestamp) : '-';\n\t\t\t\tvar content = smsService.truncateMessage(msg.content || msg.sms_text || '', 80);\n\t\t\t\t\n\t\t\t\t// Determine message type\n\t\t\t\tvar type = '';\n\t\t\t\tif (msg.reference && msg.total > 1) {\n\t\t\t\t\ttype = _('Part') + ' ' + (msg.part || '?') + '/' + (msg.total || '?');\n\t\t\t\t} else {\n\t\t\t\t\ttype = _('Single');\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar deleteBtn = E('button', {\n\t\t\t\t\t'class': 'cbi-button cbi-button-remove',\n\t\t\t\t\t'click': L.bind(function(idx) {\n\t\t\t\t\t\tself.handleDeleteSimSms(configSection, idx, contentArea);\n\t\t\t\t\t}, this, msg.index)\n\t\t\t\t}, _('Delete'));\n\n\t\t\t\tvar row = E('tr', { \n\t\t\t\t\t'class': 'tr cbi-section-table-row'\n\t\t\t\t}, [\n\t\t\t\t\tE('td', { 'class': 'td' }, index),\n\t\t\t\t\tE('td', { 'class': 'td' }, sender),\n\t\t\t\t\tE('td', { 'class': 'td' }, time),\n\t\t\t\t\tE('td', { 'class': 'td', 'style': 'word-break: break-word;' }, content),\n\t\t\t\t\tE('td', { 'class': 'td' }, type),\n\t\t\t\t\tE('td', { 'class': 'td' }, deleteBtn)\n\t\t\t\t]);\n\n\t\t\t\ttbody.appendChild(row);\n\t\t\t}\n\n\t\t\ttable.appendChild(tbody);\n\t\t\tlistFieldset.appendChild(table);\n\t\t\tlistDiv.appendChild(listFieldset);\n\t\t\tmessagesDiv.appendChild(listDiv);\n\t\t}\n\n\t\t// Add summary info\n\t\tvar summaryDiv = E('div', { 'class': 'cbi-section' });\n\t\tvar summaryFieldset = E('fieldset', { 'class': 'cbi-section' });\n\t\tsummaryFieldset.appendChild(E('legend', {}, _('Summary')));\n\t\t\n\t\tvar summaryTable = E('table', { 'class': 'table' });\n\t\tvar summaryBody = E('tbody', {}, [\n\t\t\tE('tr', { 'class': 'tr' }, [\n\t\t\t\tE('td', { 'class': 'td', 'width': '33%' }, _('Total Messages')),\n\t\t\t\tE('td', { 'class': 'td' }, String(messages.length))\n\t\t\t])\n\t\t]);\n\t\t\n\t\tsummaryTable.appendChild(summaryBody);\n\t\tsummaryFieldset.appendChild(summaryTable);\n\t\tsummaryDiv.appendChild(summaryFieldset);\n\t\tmessagesDiv.appendChild(summaryDiv);\n\n\t\t// Add action buttons\n\t\tvar buttonDiv = E('div', { 'class': 'cbi-page-actions' });\n\t\t\n\t\tvar refreshBtn = E('button', {\n\t\t\t'class': 'cbi-button cbi-button-action',\n\t\t\t'click': L.bind(function(ev) {\n\t\t\t\tev.preventDefault();\n\t\t\t\tvar loading = E('div', { 'class': 'spinning' }, _('Loading...'));\n\t\t\t\tdom.content(contentArea, loading);\n\t\t\t\tthis.loadSimSmsList(contentArea, loading, configSection);\n\t\t\t}, this)\n\t\t}, _('Refresh'));\n\t\t\n\t\tvar deleteAllBtn = E('button', {\n\t\t\t'class': 'cbi-button cbi-button-remove',\n\t\t\t'click': L.bind(function(ev) {\n\t\t\t\tev.preventDefault();\n\t\t\t\tthis.handleDeleteAllSimSms(configSection, messages, contentArea);\n\t\t\t}, this)\n\t\t}, _('Delete All'));\n\t\t\n\t\tbuttonDiv.appendChild(refreshBtn);\n\t\tif (messages.length > 0) {\n\t\t\tbuttonDiv.appendChild(deleteAllBtn);\n\t\t}\n\t\tmessagesDiv.appendChild(buttonDiv);\n\n\t\tcontentArea.appendChild(messagesDiv);\n\t},\n\n\thandleDeleteSimSms: function(configSection, index, contentArea) {\n\t\tvar self = this;\n\t\t\n\t\tif (index == null) {\n\t\t\tui.addNotification(null, E('p', _('Invalid message index')), 'error');\n\t\t\treturn;\n\t\t}\n\n\t\tui.showModal(_('Confirm Delete'), [\n\t\t\tE('p', _('Are you sure you want to delete this message from SIM card?')),\n\t\t\tE('div', { 'class': 'right' }, [\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'cbi-button cbi-button-neutral',\n\t\t\t\t\t'click': function() {\n\t\t\t\t\t\tui.hideModal();\n\t\t\t\t\t}\n\t\t\t\t}, _('Cancel')),\n\t\t\t\t' ',\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'cbi-button cbi-button-negative',\n\t\t\t\t\t'click': function() {\n\t\t\t\t\t\tui.hideModal();\n\t\t\t\t\t\tui.showModal(_('Deleting...'), E('div', { 'class': 'spinning' }, _('Deleting message...')));\n\t\t\t\t\t\t\n\t\t\t\t\t\tsmsService.deleteSimSms(configSection, index).then(function(result) {\n\t\t\t\t\t\t\tui.hideModal();\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (result.error) {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to delete SMS: ') + result.error), 'error');\n\t\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (result.success) {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Message deleted successfully')), 'info');\n\t\t\t\t\t\t\t\t// Reload the list\n\t\t\t\t\t\t\t\tvar loading = E('div', { 'class': 'spinning' }, _('Loading...'));\n\t\t\t\t\t\t\t\tdom.content(contentArea, loading);\n\t\t\t\t\t\t\t\tself.loadSimSmsList(contentArea, loading, configSection);\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Failed to delete message')), 'error');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}).catch(function(err) {\n\t\t\t\t\t\t\tui.hideModal();\n\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Error deleting SMS: ') + err.message), 'error');\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, _('Delete'))\n\t\t\t])\n\t\t]);\n\t},\n\n\thandleDeleteAllSimSms: function(configSection, messages, contentArea) {\n\t\tvar self = this;\n\t\t\n\t\tif (!messages || messages.length === 0) {\n\t\t\tui.addNotification(null, E('p', _('No messages to delete')), 'info');\n\t\t\treturn;\n\t\t}\n\n\t\tui.showModal(_('Confirm Delete All'), [\n\t\t\tE('p', _('Are you sure you want to delete ALL %d messages from SIM card? This action cannot be undone.').format(messages.length)),\n\t\t\tE('div', { 'class': 'right' }, [\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'cbi-button cbi-button-neutral',\n\t\t\t\t\t'click': function() {\n\t\t\t\t\t\tui.hideModal();\n\t\t\t\t\t}\n\t\t\t\t}, _('Cancel')),\n\t\t\t\t' ',\n\t\t\t\tE('button', {\n\t\t\t\t\t'class': 'cbi-button cbi-button-negative',\n\t\t\t\t\t'click': function() {\n\t\t\t\t\t\tui.hideModal();\n\t\t\t\t\t\tui.showModal(_('Deleting...'), E('div', { 'class': 'spinning' }, \n\t\t\t\t\t\t\t_('Deleting all messages... This may take a while.')));\n\t\t\t\t\t\t\n\t\t\t\t\t\t// Delete messages one by one\n\t\t\t\t\t\tvar deletePromises = [];\n\t\t\t\t\t\tfor (var i = 0; i < messages.length; i++) {\n\t\t\t\t\t\t\tif (messages[i].index != null) {\n\t\t\t\t\t\t\t\tdeletePromises.push(smsService.deleteSimSms(configSection, messages[i].index));\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\t\n\t\t\t\t\t\tPromise.all(deletePromises).then(function(results) {\n\t\t\t\t\t\t\tui.hideModal();\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tvar successCount = 0;\n\t\t\t\t\t\t\tvar failCount = 0;\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tfor (var i = 0; i < results.length; i++) {\n\t\t\t\t\t\t\t\tif (results[i].success) {\n\t\t\t\t\t\t\t\t\tsuccessCount++;\n\t\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\t\tfailCount++;\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\tif (failCount === 0) {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('All %d messages deleted successfully').format(successCount)), 'info');\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tui.addNotification(null, E('p', _('%d messages deleted, %d failed').format(successCount, failCount)), 'warning');\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t// Reload the list\n\t\t\t\t\t\t\tvar loading = E('div', { 'class': 'spinning' }, _('Loading...'));\n\t\t\t\t\t\t\tdom.content(contentArea, loading);\n\t\t\t\t\t\t\tself.loadSimSmsList(contentArea, loading, configSection);\n\t\t\t\t\t\t}).catch(function(err) {\n\t\t\t\t\t\t\tui.hideModal();\n\t\t\t\t\t\t\tui.addNotification(null, E('p', _('Error deleting messages: ') + err.message), 'error');\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t}, _('Delete All'))\n\t\t\t])\n\t\t]);\n\t},\n\n\thandleSaveApply: null,\n\thandleSave: null,\n\thandleReset: null\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/htdocs/luci-static/resources/view/status/include/11_modem.js",
    "content": "'use strict';\n'require baseclass';\n'require qmodem.qmodem as qmodem';\n\nfunction progressbar(value, max, min, unit) {\n\tvar val = parseInt(value) || 0,\n\t\tmaximum = parseInt(max) || 100,\n\t\tminimum = parseInt(min) || 0,\n\t\tunit = unit || '',\n\t\tpc = Math.floor((100 / (maximum - minimum)) * (val - minimum));\n\n\treturn E('div', {\n\t\t'class': 'cbi-progressbar',\n\t\t'title': '%s / %s%s (%d%%)'.format(val, maximum, unit, pc)\n\t}, E('div', { 'style': 'width:%.2f%%'.format(pc) }));\n}\n\nreturn baseclass.extend({\n\ttitle: _('Modem Info'),\n\n\tload: function() {\n\t\treturn qmodem.getModemSections().then(function(sections) {\n\t\t\tvar promises = sections.map(function(section) {\n\t\t\t\treturn Promise.all([\n\t\t\t\t\tqmodem.getBaseInfo(section.id),\n\t\t\t\t\tqmodem.getCellInfo(section.id)\n\t\t\t\t]).then(function(results) {\n\t\t\t\t\tvar allInfo = [];\n\t\t\t\t\tif (results[0] && results[0].modem_info) {\n\t\t\t\t\t\tallInfo = allInfo.concat(results[0].modem_info);\n\t\t\t\t\t}\n\t\t\t\t\tif (results[1] && results[1].modem_info) {\n\t\t\t\t\t\tallInfo = allInfo.concat(results[1].modem_info);\n\t\t\t\t\t}\n\t\t\t\t\treturn {\n\t\t\t\t\t\tsection: section,\n\t\t\t\t\t\tinfo: allInfo\n\t\t\t\t\t};\n\t\t\t\t});\n\t\t\t});\n\t\t\treturn Promise.all(promises);\n\t\t});\n\t},\n\n\trender: function(data) {\n\t\tvar container = E('div', {});\n\n\t\tif (!data || data.length === 0) {\n\t\t\tvar table = E('table', { 'class': 'table' });\n\t\t\ttable.appendChild(E('tr', { 'class': 'tr' }, [\n\t\t\t\tE('td', { 'class': 'td left', 'width': '100%' }, [ _('No modem information available') ])\n\t\t\t]));\n\t\t\treturn table;\n\t\t}\n\n\t\ttry {\n\t\t\tfor (var m = 0; m < data.length; m++) {\n\t\t\t\tvar modem = data[m];\n\t\t\t\tvar table = E('table', { 'class': 'table' });\n\t\t\t\tvar fields = [];\n\n\t\t\t\t// Add section header\n\t\t\t\tif (modem.section && modem.section.name) {\n\t\t\t\t\ttable.appendChild(E('tr', { 'class': 'tr table-titles' }, [\n\t\t\t\t\t\tE('th', { 'class': 'th', 'colspan': '2' }, [ modem.section.name ])\n\t\t\t\t\t]));\n\t\t\t\t}\n\n\t\t\t\tvar infoArray = modem.info || [];\n\t\t\t\tfor (var i = 0; i < infoArray.length; i++) {\n\t\t\t\t\tvar entry = infoArray[i];\n\t\t\t\t\tvar full_name = entry.full_name;\n\t\t\t\t\tvar extra_info = entry.extra_info;\n\t\t\t\t\t\n\t\t\t\t\tif (entry.value == null) {\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif ((entry.class == 'Base Information') || \n\t\t\t\t\t\t(entry.class == 'Cell Information' && entry.type == 'progress_bar')) {\n\t\t\t\t\t\tfields.push(extra_info ? '%s (%s)'.format(_(full_name), extra_info) : _(full_name));\n\t\t\t\t\t\tfields.push(entry);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (fields.length == 0) {\n\t\t\t\t\ttable.appendChild(E('tr', { 'class': 'tr' }, [\n\t\t\t\t\t\tE('td', { 'class': 'td left', 'width': '100%' }, [ _('No modem information available') ])\n\t\t\t\t\t]));\n\t\t\t\t\tcontainer.appendChild(table);\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\n\t\t\t\tfor (var i = 0; i < fields.length; i += 2) {\n\t\t\t\t\tvar entry = fields[i + 1];\n\t\t\t\t\tvar type = entry.type;\n\t\t\t\t\tvar value;\n\t\t\t\t\tif (type == 'progress_bar') {\n\t\t\t\t\t\tvalue = E('td', { 'class': 'td left' }, [\n\t\t\t\t\t\t\t(entry.value != null) ? progressbar(entry.value, entry.max_value, entry.min_value, entry.unit) : '?'\n\t\t\t\t\t\t]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalue = E('td', { 'class': 'td left' }, [ (entry.value != null) ? entry.value : '?' ]);\n\t\t\t\t\t}\n\n\t\t\t\t\ttable.appendChild(E('tr', { 'class': 'tr' }, [\n\t\t\t\t\t\tE('td', { 'class': 'td left', 'width': '33%' }, [ fields[i] ]),\n\t\t\t\t\t\tvalue\n\t\t\t\t\t]));\n\t\t\t\t}\n\n\t\t\t\tcontainer.appendChild(table);\n\t\t\t}\n\n\t\t\treturn container;\n\t\t}\n\t\tcatch (e) {\n\t\t\tvar table = E('table', { 'class': 'table' });\n\t\t\ttable.appendChild(E('tr', { 'class': 'tr' }, [\n\t\t\t\tE('td', { 'class': 'td left', 'width': '100%' }, [ _('No modem information available') ])\n\t\t\t]));\n\t\t\treturn table;\n\t\t}\n\t}\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/po/template/qmodem-next.po",
    "content": "# Translation template for luci-app-qmodem-next\n# Generated automatically by extract_i18n_strings.py\n\nmsgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\n#: vendor/gosuncn.sh:390\n#: vendor/gosuncn.sh:405\nmsgid \"$1\"\nmsgstr \"\"\n\n#: generic.sh:262\nmsgid \"$arfcn_label\"\nmsgstr \"\"\n\n#: generic.sh:12\n#: generic.sh:39\n#: generic.sh:67\nmsgid \"$class_overwrite\"\nmsgstr \"\"\n\n#: vendor/sierra.sh:437\n#: vendor/sierra.sh:440\n#: vendor/sierra.sh:443\n#: vendor/sierra.sh:446\nmsgid \"$key\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:362\nmsgid \"%d messages deleted, %d failed\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:508\n#: view/qmodem/network_config.js:517\n#: view/qmodem/network_config.js:526\n#: view/qmodem/network_config.js:533\nmsgid \"(beta)\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:509\n#: view/qmodem/network_config.js:518\n#: view/qmodem/network_config.js:527\n#: view/qmodem/network_config.js:534\nmsgid \"(still in beta)\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:536\n#: view/qmodem/sms_conversation.js:255\nmsgid \"16-bit (Unicode)\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:451\nmsgid \"5G Ethernet Interface\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:535\n#: view/qmodem/sms_conversation.js:254\nmsgid \"7-bit (ASCII)\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:398\n#: view/qmodem/network_config.js:475\nmsgid \"A1 (AT)\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:62\nmsgid \"API Type\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:353\nmsgid \"API configuration saved. Remember to save & apply changes.\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:380\n#: view/qmodem/network_config.js:456\nmsgid \"APN\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:737\nmsgid \"ARFCN\"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:157\nmsgid \"AT Command\"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:19\nmsgid \"AT Debug\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:432\n#: vendor/foxconn.sh:307\n#: vendor/gosuncn.sh:485\n#: vendor/huawei.sh:279\n#: vendor/meig.sh:238\n#: vendor/neoway.sh:161\n#: vendor/quectel.sh:363\n#: vendor/sierra.sh:215\n#: vendor/simcom.sh:269\n#: vendor/telit.sh:164\n#: view/qmodem/settings.js:308\nmsgid \"AT Port\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:527\nmsgid \"AT commands to execute after modem initialization.\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:534\nmsgid \"AT commands to execute before dialing.\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:743\nmsgid \"Absolute Radio Frequency Channel Number\"\nmsgstr \"\"\n\n#: generic.sh:221\n#: vendor/huawei.sh:382\n#: vendor/huawei.sh:514\n#: vendor/neoway.sh:719\n#: vendor/neoway.sh:774\n#: vendor/simcom.sh:1179\n#: vendor/simcom.sh:1219\n#: vendor/telit.sh:763\nmsgid \"Absolute Radio-Frequency Channel Number\"\nmsgstr \"\"\n\n#: vendor/meig.sh:383\n#: vendor/neoway.sh:289\n#: vendor/quectel.sh:509\nmsgid \"Access Maximum Bit Rate for Downlink\"\nmsgstr \"\"\n\n#: vendor/meig.sh:382\n#: vendor/neoway.sh:288\n#: vendor/quectel.sh:508\nmsgid \"Access Maximum Bit Rate for Uplink\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:928\n#: view/qmodem/config_advanced.js:953\nmsgid \"Action\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:162\nmsgid \"Actions\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:259\nmsgid \"Add\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:229\nmsgid \"Add Modem Device\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:98\n#: view/qmodem/sms_conversation.js:116\nmsgid \"Adjust received messages for local timezone (UTC+8)\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:123\n#: view/qmodem/sms_conversation.js:141\nmsgid \"Adjust sent messages for local timezone (UTC+8)\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:19\nmsgid \"Advanced Configuration\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:421\nmsgid \"After setting this option, the first module loaded into this slot will automatically be assigned this default alias.\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:301\nmsgid \"Alias\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:360\nmsgid \"All %d messages deleted successfully\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:99\nmsgid \"Alternative AT Tools\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:262\n#: view/qmodem/config_advanced.js:267\n#: view/qmodem/config_advanced.js:270\n#: view/qmodem/config_advanced.js:401\n#: view/qmodem/config_advanced.js:406\n#: view/qmodem/config_advanced.js:409\n#: view/qmodem/config_advanced.js:579\n#: view/qmodem/config_advanced.js:584\n#: view/qmodem/config_advanced.js:587\n#: view/qmodem/config_advanced.js:856\n#: view/qmodem/config_advanced.js:860\n#: view/qmodem/config_advanced.js:863\n#: view/qmodem/config_advanced.js:1314\n#: view/qmodem/config_advanced.js:1319\n#: view/qmodem/config_advanced.js:1322\nmsgid \"Apply\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:242\nmsgid \"Apply Storage Settings\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:744\nmsgid \"Applying settings...\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:252\n#: view/qmodem/config_advanced.js:391\n#: view/qmodem/config_advanced.js:845\n#: view/qmodem/config_advanced.js:1304\nmsgid \"Applying...\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:564\nmsgid \"Are you sure you want to change the IMEI to %s? This requires modem reboot.\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:990\nmsgid \"Are you sure you want to clear the dial log?\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:321\nmsgid \"Are you sure you want to delete ALL %d messages from SIM card? This action cannot be undone.\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:270\nmsgid \"Are you sure you want to delete this message from SIM card?\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1460\nmsgid \"Are you sure you want to perform a hard reboot? This will power cycle the modem and may cause a longer disconnection.\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1423\nmsgid \"Are you sure you want to perform a soft reboot? The modem will restart and may lose connection temporarily.\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:266\nmsgid \"Are you sure you want to remove this modem device? this cannot be roll back with uci machanism.\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:471\nmsgid \"Associated USB\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:126\nmsgid \"Attempt to use pre-configured PCIe settings from the CPE vendor.\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:122\nmsgid \"Attempt to use pre-configured USB settings from the CPE vendor.\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:424\nmsgid \"Authentication Type\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:381\n#: view/qmodem/network_config.js:384\n#: view/qmodem/network_config.js:458\n#: view/qmodem/network_config.js:461\nmsgid \"Auto Choose\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:153\nmsgid \"Auto Delete from SIM\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:163\nmsgid \"Automatically delete SMS from SIM card after reading\"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:81\nmsgid \"Available AT Ports\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:232\nmsgid \"Available Devices\"\nmsgstr \"\"\n\n#: view/qmodem/sms_conversation.js:160\nmsgid \"Back\"\nmsgstr \"\"\n\n#: generic.sh:150\n#: generic.sh:186\n#: generic.sh:222\n#: vendor/foxconn.sh:582\n#: vendor/foxconn.sh:629\n#: vendor/gosuncn.sh:601\n#: vendor/gosuncn.sh:610\n#: vendor/gosuncn.sh:680\n#: vendor/gosuncn.sh:689\n#: vendor/huawei.sh:383\n#: vendor/huawei.sh:515\n#: vendor/huawei.sh:533\n#: vendor/huawei.sh:558\n#: vendor/huawei.sh:580\n#: vendor/meig.sh:569\n#: vendor/meig.sh:584\n#: vendor/meig.sh:596\n#: vendor/meig.sh:611\n#: vendor/meig.sh:625\n#: vendor/neoway.sh:720\n#: vendor/neoway.sh:731\n#: vendor/neoway.sh:756\n#: vendor/neoway.sh:775\n#: vendor/simcom.sh:1180\n#: vendor/simcom.sh:1202\n#: vendor/simcom.sh:1220\n#: vendor/telit.sh:761\n#: view/qmodem/config_advanced.js:754\nmsgid \"Band\"\nmsgstr \"\"\n\n#: generic.sh:263\nmsgid \"Band (CA)\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:840\nmsgid \"Band is required for NR\"\nmsgstr \"\"\n\n#: vendor/telit.sh:762\nmsgid \"Bandwidth\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:428\n#: vendor/foxconn.sh:304\n#: vendor/gosuncn.sh:468\n#: vendor/huawei.sh:275\n#: vendor/meig.sh:234\n#: vendor/neoway.sh:157\n#: vendor/quectel.sh:359\n#: vendor/sierra.sh:211\n#: vendor/simcom.sh:265\n#: vendor/telit.sh:160\nmsgid \"Base Information\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:415\n#: view/qmodem/network_config.js:492\nmsgid \"Beeline (RU)\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:109\nmsgid \"Block Auto Probe/Remove\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:103\nmsgid \"Bot Token\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:328\nmsgid \"Bridge Mode\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:334\n#: view/qmodem/settings.js:461\nmsgid \"Bridge Port\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:995\n#: view/qmodem/settings.js:239\n#: view/qmodem/sms.js:560\n#: view/qmodem/sms_forward.js:303\n#: view/qmodem/sms_sim.js:277\n#: view/qmodem/sms_sim.js:328\nmsgid \"Cancel\"\nmsgstr \"\"\n\n#: vendor/gosuncn.sh:508\nmsgid \"Carrier\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:357\nmsgid \"Caution: Enabling this option will make it the IPV6 RA Master, and only one interface can be configured as such.\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:329\nmsgid \"Caution: Only avalible for quectel sdx 5G Modem.\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:407\n#: view/qmodem/network_config.js:484\nmsgid \"Celcom (MY)\"\nmsgstr \"\"\n\n#: generic.sh:147\n#: generic.sh:183\n#: generic.sh:219\n#: vendor/foxconn.sh:578\n#: vendor/foxconn.sh:634\n#: vendor/gosuncn.sh:599\n#: vendor/gosuncn.sh:608\n#: vendor/gosuncn.sh:678\n#: vendor/gosuncn.sh:687\n#: vendor/huawei.sh:379\n#: vendor/huawei.sh:511\n#: vendor/huawei.sh:529\n#: vendor/huawei.sh:554\n#: vendor/huawei.sh:576\n#: vendor/meig.sh:566\n#: vendor/meig.sh:581\n#: vendor/meig.sh:608\n#: vendor/meig.sh:623\n#: vendor/neoway.sh:717\n#: vendor/neoway.sh:728\n#: vendor/neoway.sh:752\n#: vendor/simcom.sh:1176\n#: vendor/simcom.sh:1198\n#: vendor/simcom.sh:1231\n#: vendor/simcom.sh:1250\nmsgid \"Cell ID\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:1416\n#: vendor/foxconn.sh:551\n#: vendor/gosuncn.sh:587\n#: vendor/gosuncn.sh:666\n#: vendor/huawei.sh:373\n#: vendor/huawei.sh:504\n#: vendor/meig.sh:559\n#: vendor/neoway.sh:710\n#: vendor/quectel.sh:1658\n#: vendor/simcom.sh:1169\n#: vendor/telit.sh:759\n#: view/qmodem/config_advanced.js:927\n#: view/qmodem/config_advanced.js:952\nmsgid \"Cell Information\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1072\nmsgid \"Cell is unlocked (no lock active)\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1038\nmsgid \"Cell parameters copied to settings\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:805\nmsgid \"Cell unlocked successfully\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:597\nmsgid \"Changing IMEI may be illegal in some countries. Use at your own risk.\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:197\nmsgid \"Channel (optional)\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:1441\n#: vendor/fibocom.sh:1458\n#: vendor/foxconn.sh:591\n#: vendor/huawei.sh:536\n#: vendor/huawei.sh:567\n#: vendor/neoway.sh:741\n#: vendor/quectel.sh:1683\n#: vendor/quectel.sh:1701\n#: vendor/simcom.sh:1182\n#: vendor/simcom.sh:1212\n#: vendor/simcom.sh:1242\nmsgid \"Channel Quality Indicator\"\nmsgstr \"\"\n\n#: vendor/quectel.sh:507\n#: vendor/telit.sh:260\nmsgid \"Channel Quality Indicator for Downlink\"\nmsgstr \"\"\n\n#: vendor/quectel.sh:506\nmsgid \"Channel Quality Indicator for Uplink\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:115\nmsgid \"Chat ID\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:388\n#: view/qmodem/network_config.js:465\nmsgid \"China Broadcast (CN)\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:385\n#: view/qmodem/network_config.js:462\nmsgid \"China Mobile (CN)\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:387\n#: view/qmodem/network_config.js:464\nmsgid \"China Telecom (CN)\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:386\n#: view/qmodem/network_config.js:463\nmsgid \"China Unicom (CN)\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:917\n#: view/qmodem/sms_conversation.js:315\nmsgid \"Clear\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:989\nmsgid \"Clear Dial Log\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:670\nmsgid \"Click \\\"Scan Neighbor Cells\\\" to search for nearby cell towers\"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:179\nmsgid \"Click \\\"Send AT Command\\\" to execute\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:922\nmsgid \"Close\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:1472\n#: vendor/huawei.sh:588\n#: vendor/neoway.sh:766\n#: vendor/quectel.sh:1713\nmsgid \"Compression Mode\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1019\nmsgid \"Configuration inputs not found\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:666\nmsgid \"Configuration saved\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:72\nmsgid \"Configure\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:73\nmsgid \"Configure API\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:297\nmsgid \"Configure API Settings\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:39\nmsgid \"Configure SMS forwarding instances for different modems and services\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:21\nmsgid \"Configure SMS forwarding to various notification services\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:698\nmsgid \"Configure cell lock parameters. You can manually enter values or use the \\\"Copy\\\" button from scanned cells.\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:347\nmsgid \"Configure network preference (5G/4G/3G priority). Changes may require modem restart.\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:387\nmsgid \"Configure physical slots for modem installation\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:98\nmsgid \"Configure the API settings for \"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:205\nmsgid \"Configure the modem dial mode (QMI/MBIM/ECM/NCM, etc.). Changes require modem reboot to take effect.\"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:102\nmsgid \"Configured Ports\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:1017\nmsgid \"Confirm\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:269\nmsgid \"Confirm Delete\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:320\nmsgid \"Confirm Delete All\"\nmsgstr \"\"\n\n#: generic.sh:527\nmsgid \"Connect Status\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:221\n#: view/qmodem/network_config.js:676\nmsgid \"Connected\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:418\nmsgid \"Contact\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:160\nmsgid \"Content\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:81\nmsgid \"Control\"\nmsgstr \"\"\n\n#: view/qmodem/sms_conversation.js:162\nmsgid \"Conversation with \"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:410\nmsgid \"Conversations\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1040\nmsgid \"Copy\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:421\nmsgid \"Count\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:491\nmsgid \"Current IMEI\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:210\nmsgid \"Current Mode\"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:96\nmsgid \"Current Port\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:352\nmsgid \"Current Preference\"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:126\nmsgid \"Current SIM Slot\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:260\nmsgid \"Custom PushDeer API endpoint, leave empty to use default\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:68\nmsgid \"Custom Script\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:162\nmsgid \"Custom format using placeholders: {SENDER}, {CONTENT}, {TIME}\"\nmsgstr \"\"\n\n#: vendor/huawei.sh:406\nmsgid \"DL\"\nmsgstr \"\"\n\n#: generic.sh:152\n#: generic.sh:188\n#: generic.sh:224\n#: vendor/foxconn.sh:584\n#: vendor/foxconn.sh:630\n#: vendor/huawei.sh:384\n#: vendor/huawei.sh:516\n#: vendor/huawei.sh:535\n#: vendor/huawei.sh:560\n#: vendor/meig.sh:570\n#: vendor/meig.sh:586\n#: vendor/meig.sh:597\n#: vendor/meig.sh:613\n#: vendor/neoway.sh:742\n#: vendor/simcom.sh:1181\n#: vendor/simcom.sh:1204\n#: vendor/simcom.sh:1221\n#: vendor/simcom.sh:1236\nmsgid \"DL Bandwidth\"\nmsgstr \"\"\n\n#: generic.sh:265\nmsgid \"DL Bandwidth (CA)\"\nmsgstr \"\"\n\n#: vendor/simcom.sh:1184\n#: vendor/telit.sh:766\nmsgid \"DL/UL MOD\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:311\nmsgid \"DNS\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:34\nmsgid \"Debug\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:420\nmsgid \"Default Alias\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:425\nmsgid \"Default Metric\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:462\nmsgid \"Default bridge port for passthrough. Device-level bridge_port overrides this slot default.\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:103\nmsgid \"Delay Start\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:518\nmsgid \"Delay of executing AT command after modem initialization, in seconds.\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:509\nmsgid \"Delay of executing AT command before dialing, in seconds.\"\nmsgstr \"\"\n\n#: view/qmodem/sms_conversation.js:536\n#: view/qmodem/sms_sim.js:191\n#: view/qmodem/sms_sim.js:307\nmsgid \"Delete\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:250\n#: view/qmodem/sms_sim.js:374\nmsgid \"Delete All\"\nmsgstr \"\"\n\n#: view/qmodem/sms_conversation.js:531\nmsgid \"Delete this message?\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:335\nmsgid \"Deleting all messages... This may take a while.\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:283\nmsgid \"Deleting message...\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:283\n#: view/qmodem/sms_sim.js:334\nmsgid \"Deleting...\"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:109\nmsgid \"Detected Ports\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:305\nmsgid \"Device Path\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:335\nmsgid \"Device-level bridge port for passthrough. If set, it overrides the slot default bridge port.\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:408\n#: view/qmodem/network_config.js:485\nmsgid \"DiGi (MY)\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:621\nmsgid \"Dial\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:196\n#: view/qmodem/network_config.js:202\nmsgid \"Dial Configuration\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:285\nmsgid \"Dial Control\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:266\n#: view/qmodem/network_config.js:878\nmsgid \"Dial Log\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:92\nmsgid \"Dial Mode\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:201\nmsgid \"Dial Mode Configuration\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:609\nmsgid \"Dial command sent successfully\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:292\nmsgid \"Dial disabled for this modem\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:188\n#: view/qmodem/network_config.js:857\nmsgid \"Disable\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:355\nmsgid \"Disabled Features\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:224\n#: view/qmodem/network_config.js:679\nmsgid \"Disconnected\"\nmsgstr \"\"\n\n#: vendor/huawei.sh:389\nmsgid \"Discontinuous Reception\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:405\n#: view/qmodem/network_config.js:482\nmsgid \"Dito Telecomunity (PH)\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:350\nmsgid \"Do Not NAT(Only for Quectel Modem)\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:344\nmsgid \"Do Not modify resolv.conf\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:910\nmsgid \"Download\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:399\n#: view/qmodem/network_config.js:476\nmsgid \"Drei (AT)\"\nmsgstr \"\"\n\n#: vendor/foxconn.sh:577\n#: vendor/foxconn.sh:633\n#: vendor/huawei.sh:378\n#: vendor/huawei.sh:510\n#: vendor/huawei.sh:528\n#: vendor/huawei.sh:553\n#: vendor/meig.sh:565\n#: vendor/meig.sh:580\n#: vendor/meig.sh:607\n#: vendor/quectel.sh:1662\n#: vendor/quectel.sh:1676\n#: vendor/quectel.sh:1695\n#: vendor/simcom.sh:1175\n#: vendor/simcom.sh:1197\n#: vendor/simcom.sh:1230\nmsgid \"Duplex Mode\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:396\n#: view/qmodem/network_config.js:473\nmsgid \"E-Plus (DE)\"\nmsgstr \"\"\n\n#: generic.sh:185\n#: vendor/foxconn.sh:580\n#: vendor/foxconn.sh:636\n#: vendor/huawei.sh:531\n#: vendor/huawei.sh:556\n#: vendor/neoway.sh:730\n#: vendor/simcom.sh:1200\n#: vendor/simcom.sh:1233\nmsgid \"E-UTRA Absolute Radio Frequency Channel Number\"\nmsgstr \"\"\n\n#: generic.sh:155\n#: vendor/huawei.sh:582\n#: vendor/meig.sh:627\n#: vendor/neoway.sh:760\n#: vendor/simcom.sh:1254\nmsgid \"Ec/Io\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:1467\n#: vendor/huawei.sh:583\n#: vendor/quectel.sh:1708\nmsgid \"Ec/No\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:169\n#: view/qmodem/network_config.js:838\n#: view/qmodem/sms_forward.js:45\nmsgid \"Enable\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:243\nmsgid \"Enable Dial\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:56\nmsgid \"Enable Dial (Global)\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:113\nmsgid \"Enable PCIe Scan\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:26\nmsgid \"Enable SMS Forwarder\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:117\nmsgid \"Enable USB Scan\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:119\n#: view/qmodem/sms_conversation.js:137\nmsgid \"Enable if SMS timestamps appear 8 hours ahead (e.g., UTC+8 local time parsed as UTC+0)\"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:151\nmsgid \"Enable to use Ubus AT daemon instead of direct serial port access\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:76\n#: view/qmodem/network_config.js:748\n#: view/qmodem/settings.js:281\nmsgid \"Enabled\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:529\n#: view/qmodem/sms_conversation.js:248\nmsgid \"Encoding\"\nmsgstr \"\"\n\n#: vendor/huawei.sh:388\nmsgid \"Energy per Chip over Noise\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:528\n#: view/qmodem/network_config.js:535\nmsgid \"Enter AT commands\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:510\n#: view/qmodem/network_config.js:519\nmsgid \"Enter delay in seconds\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:534\nmsgid \"Enter exactly 15 digits\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:513\nmsgid \"Enter phone number\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:524\n#: view/qmodem/sms_conversation.js:239\nmsgid \"Enter your message here...\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:334\n#: view/qmodem/config_advanced.js:473\n#: view/qmodem/config_advanced.js:627\n#: view/qmodem/sms_forward.js:31\nmsgid \"Error\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:304\nmsgid \"Error deleting SMS: \"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:371\nmsgid \"Error deleting messages: \"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:241\nmsgid \"Error loading AT configuration: %s\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:613\nmsgid \"Error loading IMEI\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:628\nmsgid \"Error loading IMEI: %s\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:106\nmsgid \"Error loading SIM SMS: \"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:165\nmsgid \"Error loading SIM switch information: %s\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:728\nmsgid \"Error loading SMS storage: \"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:351\nmsgid \"Error loading SMS: \"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:71\nmsgid \"Error loading features: %s\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1337\nmsgid \"Error loading lock band configuration:\"\nmsgstr \"\"\n\n#: view/qmodem/sms_conversation.js:414\nmsgid \"Error loading messages: \"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:284\nmsgid \"Error loading mode\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:336\nmsgid \"Error loading mode: %s\"\nmsgstr \"\"\n\n#: view/qmodem/overview.js:466\nmsgid \"Error loading modem information: %s\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:475\nmsgid \"Error loading network preference: %s\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:423\nmsgid \"Error loading preference\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1512\nmsgid \"Error loading reboot capabilities: %s\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1058\nmsgid \"Error loading status\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:974\nmsgid \"Error scanning neighbor cells: %s\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:763\nmsgid \"Error setting SMS storage: \"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:218\nmsgid \"Error switching SIM slot: %s\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:582\n#: view/qmodem/network_config.js:596\n#: view/qmodem/network_config.js:618\n#: view/qmodem/network_config.js:701\n#: view/qmodem/network_config.js:871\n#: view/qmodem/network_config.js:956\n#: view/qmodem/network_config.js:1013\nmsgid \"Error: \"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:265\n#: view/qmodem/config_advanced.js:404\n#: view/qmodem/config_advanced.js:582\n#: view/qmodem/config_advanced.js:815\n#: view/qmodem/config_advanced.js:858\n#: view/qmodem/config_advanced.js:1317\n#: view/qmodem/config_advanced.js:1443\n#: view/qmodem/config_advanced.js:1480\n#: view/qmodem/debug.js:207\nmsgid \"Error: %s\"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:189\nmsgid \"Error: Please enter AT command\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:362\nmsgid \"Extend Prefix\"\nmsgstr \"\"\n\n#: view/qmodem/sms_conversation.js:521\nmsgid \"Failed\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1312\nmsgid \"Failed to apply lock band configuration\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:853\nmsgid \"Failed to apply lock cell configuration\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:1009\nmsgid \"Failed to clear log\"\nmsgstr \"\"\n\n#: view/qmodem/sms_conversation.js:576\n#: view/qmodem/sms_conversation.js:587\n#: view/qmodem/sms_sim.js:289\nmsgid \"Failed to delete SMS: \"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:300\nmsgid \"Failed to delete message\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:184\n#: view/qmodem/network_config.js:853\nmsgid \"Failed to disable QModem Network: \"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:984\nmsgid \"Failed to download log: \"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:165\n#: view/qmodem/network_config.js:834\nmsgid \"Failed to enable QModem Network: \"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:683\nmsgid \"Failed to get SMS storage: \"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1475\nmsgid \"Failed to initiate hard reboot\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1438\nmsgid \"Failed to initiate soft reboot\"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:90\nmsgid \"Failed to load AT configuration\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:117\nmsgid \"Failed to load SIM SMS: \"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:362\nmsgid \"Failed to load SMS: \"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:285\nmsgid \"Failed to load available modes\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:948\nmsgid \"Failed to load log\"\nmsgstr \"\"\n\n#: view/qmodem/sms_conversation.js:425\nmsgid \"Failed to load messages: \"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:424\nmsgid \"Failed to load network preferences\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1401\nmsgid \"Failed to load reboot capabilities\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:68\n#: view/qmodem/network_config.js:865\nmsgid \"Failed to load status\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:141\n#: view/qmodem/network_config.js:810\nmsgid \"Failed to restart QModem Network: \"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:668\nmsgid \"Failed to save configuration: \"\nmsgstr \"\"\n\n#: view/qmodem/sms_conversation.js:520\nmsgid \"Failed to send\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:593\n#: view/qmodem/sms.js:606\n#: view/qmodem/sms_conversation.js:345\n#: view/qmodem/sms_conversation.js:361\nmsgid \"Failed to send SMS: \"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:615\nmsgid \"Failed to send dial command\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:579\nmsgid \"Failed to send hang command\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:593\nmsgid \"Failed to send redial command\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:577\nmsgid \"Failed to set IMEI\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:759\nmsgid \"Failed to set SMS storage\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:750\nmsgid \"Failed to set SMS storage: \"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:260\nmsgid \"Failed to set mode\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:399\nmsgid \"Failed to set network preference\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:104\n#: view/qmodem/network_config.js:773\nmsgid \"Failed to start QModem Network: \"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:123\n#: view/qmodem/network_config.js:792\nmsgid \"Failed to stop QModem Network: \"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:211\nmsgid \"Failed to switch SIM slot. Please check modem status.\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:810\nmsgid \"Failed to unlock cell\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:67\nmsgid \"Feishu Bot\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:276\nmsgid \"Feishu webhook URL from your bot configuration\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:452\nmsgid \"For 5G modules using the Ethernet PHY connection, please specify the network interface name (e.g., eth0, eth1)\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:472\nmsgid \"For M.2 slots with both PCIe and USB support, specify the associated USB port (for ttyUSB access)\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:322\nmsgid \"Force Set APN\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:38\nmsgid \"Forward Instances\"\nmsgstr \"\"\n\n#: vendor/foxconn.sh:581\n#: vendor/foxconn.sh:637\n#: vendor/huawei.sh:532\n#: vendor/huawei.sh:557\n#: vendor/simcom.sh:1201\n#: vendor/simcom.sh:1234\nmsgid \"Freq band indicator\"\nmsgstr \"\"\n\n#: qmodem/sms.js:240\nmsgid \"Friday\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:188\nmsgid \"Full scan completed successfully\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:198\nmsgid \"Full scan error: \"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:191\nmsgid \"Full scan failed\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:487\nmsgid \"GPIO Value(Modem Power Down)\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:492\nmsgid \"GPIO Value(Modem Power Up)\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:483\nmsgid \"GPIO pin for power control\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:54\nmsgid \"Global Configuration\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:24\nmsgid \"Global Settings\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:403\n#: view/qmodem/network_config.js:480\nmsgid \"Globe Postpaid (PH)\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:402\n#: view/qmodem/network_config.js:479\nmsgid \"Globe Prepaid (PH)\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:176\nmsgid \"HTTP headers, one per line\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:585\nmsgid \"Hang\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:573\nmsgid \"Hang command sent successfully\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1472\n#: view/qmodem/config_advanced.js:1477\n#: view/qmodem/config_advanced.js:1482\n#: view/qmodem/config_advanced.js:1485\n#: view/qmodem/config_advanced.js:1502\nmsgid \"Hard Reboot\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1469\nmsgid \"Hard reboot initiated successfully. The modem is restarting...\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:167\nmsgid \"Headers (optional)\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:211\nmsgid \"Hide IP\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:482\nmsgid \"IMEI Configuration\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:554\nmsgid \"IMEI must be exactly 15 digits\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:559\nmsgid \"IMEI must contain only numbers\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:573\nmsgid \"IMEI set successfully. Please reboot the modem for changes to take effect.\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:373\nmsgid \"IPv4\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:375\nmsgid \"IPv4/IPv6\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:374\nmsgid \"IPv6\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:323\nmsgid \"If enabled, the APN will be set even if it matches the current configuration.(only works with tom modified version of quectel-cm)\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:110\nmsgid \"If enabled, the modem auto scan will be blocked.\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:100\nmsgid \"If enabled, using alternative AT Tools\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:351\nmsgid \"If enabled, will turn off NAT function on quectel modem.\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:457\nmsgid \"If slot 2 config is not set,will use slot 1 config.\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:312\nmsgid \"If the DNS server is not set, it will use the DNS server leased by the operator.\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:451\nmsgid \"If the PIN code is not set, leave it blank.\"\nmsgstr \"\"\n\n#: view/qmodem/sms_conversation.js:511\nmsgid \"Incomplete (part \"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:157\nmsgid \"Index\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:33\nmsgid \"Info\"\nmsgstr \"\"\n\n#: vendor/huawei.sh:404\nmsgid \"Information\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:507\n#: vendor/fibocom.sh:521\n#: vendor/foxconn.sh:276\n#: vendor/foxconn.sh:290\n#: vendor/gosuncn.sh:461\n#: vendor/meig.sh:288\n#: vendor/meig.sh:302\n#: vendor/neoway.sh:218\n#: vendor/neoway.sh:232\n#: vendor/quectel.sh:426\n#: vendor/quectel.sh:440\n#: vendor/simcom.sh:331\n#: vendor/simcom.sh:345\n#: vendor/telit.sh:223\n#: vendor/telit.sh:237\nmsgid \"Integrate Circuit Card Identity\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:505\n#: vendor/fibocom.sh:511\n#: vendor/fibocom.sh:519\n#: vendor/foxconn.sh:274\n#: vendor/foxconn.sh:280\n#: vendor/foxconn.sh:288\n#: vendor/gosuncn.sh:434\n#: vendor/gosuncn.sh:459\n#: vendor/huawei.sh:259\n#: vendor/meig.sh:286\n#: vendor/meig.sh:292\n#: vendor/meig.sh:300\n#: vendor/neoway.sh:216\n#: vendor/neoway.sh:222\n#: vendor/neoway.sh:230\n#: vendor/quectel.sh:424\n#: vendor/quectel.sh:430\n#: vendor/quectel.sh:438\n#: vendor/simcom.sh:329\n#: vendor/simcom.sh:335\n#: vendor/simcom.sh:343\n#: vendor/telit.sh:221\n#: vendor/telit.sh:227\n#: vendor/telit.sh:235\nmsgid \"International Mobile Equipment Identity\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:506\n#: vendor/fibocom.sh:520\n#: vendor/foxconn.sh:275\n#: vendor/foxconn.sh:289\n#: vendor/gosuncn.sh:460\n#: vendor/huawei.sh:260\n#: vendor/meig.sh:287\n#: vendor/meig.sh:301\n#: vendor/neoway.sh:217\n#: vendor/neoway.sh:231\n#: vendor/quectel.sh:425\n#: vendor/quectel.sh:439\n#: vendor/simcom.sh:330\n#: vendor/simcom.sh:344\n#: vendor/telit.sh:222\n#: vendor/telit.sh:236\nmsgid \"International Mobile Subscriber Identity\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:502\n#: vendor/foxconn.sh:271\n#: vendor/gosuncn.sh:456\n#: vendor/meig.sh:283\n#: vendor/neoway.sh:213\n#: vendor/quectel.sh:421\n#: vendor/simcom.sh:326\n#: vendor/telit.sh:219\nmsgid \"Internet Service Provider\"\nmsgstr \"\"\n\n#: view/qmodem/sms_conversation.js:64\nmsgid \"Invalid contact\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1125\nmsgid \"Invalid lockband data structure\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:265\nmsgid \"Invalid message index\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:432\nmsgid \"LED indicator for SIM card status\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:442\nmsgid \"LED indicator for network connection status\"\nmsgstr \"\"\n\n#: vendor/huawei.sh:393\n#: view/qmodem/settings.js:368\nmsgid \"LTE Band\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:920\nmsgid \"LTE Cells\"\nmsgstr \"\"\n\n#: vendor/huawei.sh:394\nmsgid \"LTE DL\"\nmsgstr \"\"\n\n#: vendor/huawei.sh:392\nmsgid \"LTE Information\"\nmsgstr \"\"\n\n#: vendor/huawei.sh:395\nmsgid \"LTE UL\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:419\nmsgid \"Last Message\"\nmsgstr \"\"\n\n#: view/qmodem/overview.js:461\n#: view/qmodem/overview.js:519\nmsgid \"Last update\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:544\n#: view/qmodem/sms_conversation.js:268\nmsgid \"Length\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:224\nmsgid \"Loading available modes...\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:366\nmsgid \"Loading available networks...\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1099\nmsgid \"Loading band configuration...\"\nmsgstr \"\"\n\n#: view/qmodem/sms_conversation.js:175\nmsgid \"Loading messages...\"\nmsgstr \"\"\n\n#: view/qmodem/overview.js:350\nmsgid \"Loading modem information...\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1386\nmsgid \"Loading reboot capabilities...\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:63\n#: view/qmodem/config_advanced.js:212\n#: view/qmodem/config_advanced.js:354\n#: view/qmodem/config_advanced.js:496\n#: view/qmodem/debug.js:83\n#: view/qmodem/network_config.js:212\n#: view/qmodem/network_config.js:300\n#: view/qmodem/network_config.js:882\n#: view/qmodem/sim_switch.js:87\n#: view/qmodem/sms.js:190\n#: view/qmodem/sms.js:207\n#: view/qmodem/sms.js:224\n#: view/qmodem/sms.js:266\n#: view/qmodem/sms.js:286\n#: view/qmodem/sms.js:294\n#: view/qmodem/sms.js:302\n#: view/qmodem/sms.js:461\n#: view/qmodem/sms.js:489\n#: view/qmodem/sms_conversation.js:190\n#: view/qmodem/sms_conversation.js:198\n#: view/qmodem/sms_conversation.js:206\n#: view/qmodem/sms_conversation.js:583\n#: view/qmodem/sms_sim.js:73\n#: view/qmodem/sms_sim.js:82\n#: view/qmodem/sms_sim.js:238\n#: view/qmodem/sms_sim.js:296\n#: view/qmodem/sms_sim.js:366\nmsgid \"Loading...\"\nmsgstr \"\"\n\n#: generic.sh:146\n#: vendor/gosuncn.sh:598\n#: vendor/gosuncn.sh:677\n#: vendor/huawei.sh:575\n#: vendor/meig.sh:622\n#: vendor/neoway.sh:751\n#: vendor/simcom.sh:1249\nmsgid \"Location Area Code\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:108\nmsgid \"Lock Band\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1090\nmsgid \"Lock Band Configuration\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:692\nmsgid \"Lock Cell Settings\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:679\nmsgid \"Lock Cell Status\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1308\nmsgid \"Lock band configuration applied for %s\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:849\nmsgid \"Lock cell configuration applied successfully\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1094\nmsgid \"Lock modem to specific frequency bands. Select bands for each network type (UMTS/LTE/NR).\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1200\nmsgid \"Locked Bands\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:30\nmsgid \"Log Level\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:1002\nmsgid \"Log cleared successfully\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:979\nmsgid \"Log downloaded successfully\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:416\n#: view/qmodem/network_config.js:493\nmsgid \"MTS (RU)\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:400\n#: view/qmodem/network_config.js:477\nmsgid \"Magenta (AT)\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:430\n#: vendor/foxconn.sh:305\n#: vendor/gosuncn.sh:483\n#: vendor/huawei.sh:277\n#: vendor/meig.sh:236\n#: vendor/neoway.sh:159\n#: vendor/quectel.sh:361\n#: vendor/sierra.sh:213\n#: vendor/simcom.sh:267\n#: vendor/telit.sh:162\nmsgid \"Manufacturer\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:410\n#: view/qmodem/network_config.js:487\nmsgid \"Maxis UT (MY)\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:409\n#: view/qmodem/network_config.js:486\nmsgid \"Maxis | Hotlink (MY)\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:417\n#: view/qmodem/network_config.js:494\nmsgid \"Megafon (RU)\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:518\n#: view/qmodem/sms_conversation.js:233\nmsgid \"Message\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:153\nmsgid \"Message Format (optional)\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:206\nmsgid \"Message channel, use | to separate multiple channels\"\nmsgstr \"\"\n\n#: view/qmodem/sms_conversation.js:580\nmsgid \"Message deleted\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:294\nmsgid \"Message deleted successfully\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:598\n#: view/qmodem/sms_conversation.js:350\nmsgid \"Message sent successfully\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:501\nmsgid \"Metric\"\nmsgstr \"\"\n\n#: generic.sh:144\n#: generic.sh:180\n#: generic.sh:216\n#: vendor/foxconn.sh:575\n#: vendor/foxconn.sh:631\n#: vendor/huawei.sh:376\n#: vendor/huawei.sh:508\n#: vendor/huawei.sh:526\n#: vendor/huawei.sh:551\n#: vendor/huawei.sh:573\n#: vendor/meig.sh:563\n#: vendor/meig.sh:578\n#: vendor/meig.sh:593\n#: vendor/meig.sh:605\n#: vendor/meig.sh:620\n#: vendor/neoway.sh:715\n#: vendor/neoway.sh:726\n#: vendor/neoway.sh:749\n#: vendor/neoway.sh:772\n#: vendor/simcom.sh:1173\n#: vendor/simcom.sh:1195\n#: vendor/simcom.sh:1216\n#: vendor/simcom.sh:1228\n#: vendor/simcom.sh:1247\nmsgid \"Mobile Country Code\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:188\n#: view/qmodem/sms.js:205\n#: view/qmodem/sms.js:222\n#: view/qmodem/sms.js:706\nmsgid \"Mobile Equipment (ME)\"\nmsgstr \"\"\n\n#: generic.sh:145\n#: generic.sh:181\n#: generic.sh:217\n#: vendor/foxconn.sh:576\n#: vendor/foxconn.sh:632\n#: vendor/huawei.sh:377\n#: vendor/huawei.sh:509\n#: vendor/huawei.sh:527\n#: vendor/huawei.sh:552\n#: vendor/huawei.sh:574\n#: vendor/meig.sh:564\n#: vendor/meig.sh:579\n#: vendor/meig.sh:594\n#: vendor/meig.sh:606\n#: vendor/meig.sh:621\n#: vendor/neoway.sh:716\n#: vendor/neoway.sh:727\n#: vendor/neoway.sh:750\n#: vendor/neoway.sh:773\n#: vendor/simcom.sh:1174\n#: vendor/simcom.sh:1196\n#: vendor/simcom.sh:1217\n#: vendor/simcom.sh:1229\n#: vendor/simcom.sh:1248\nmsgid \"Mobile Network Code\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:256\nmsgid \"Mode set successfully. Please reboot the modem.\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:299\nmsgid \"Model Name\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:254\n#: view/qmodem/network_config.js:307\nmsgid \"Modem Alias\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:49\nmsgid \"Modem Config\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:210\nmsgid \"Modem Device\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:205\nmsgid \"Modem Devices\"\nmsgstr \"\"\n\n#: view/status/include/11_modem.js:19\nmsgid \"Modem Info\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:248\nmsgid \"Modem Model\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:27\n#: view/qmodem/debug.js:27\n#: view/qmodem/overview.js:486\n#: view/qmodem/sim_switch.js:31\n#: view/qmodem/sms.js:65\n#: view/qmodem/sms_conversation.js:83\n#: view/qmodem/sms_sim.js:39\nmsgid \"Modem Name\"\nmsgstr \"\"\n\n#: generic.sh:543\nmsgid \"Modem Offline\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:97\nmsgid \"Modem Probe Settings\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:394\nmsgid \"Modem Slot\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:386\nmsgid \"Modem Slot Configuration\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:276\nmsgid \"Modem device removal failed: \"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:271\nmsgid \"Modem device removed successfully\"\nmsgstr \"\"\n\n#: qmodem/sms.js:239\nmsgid \"Monday\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:426\nmsgid \"MsChapV2\"\nmsgstr \"\"\n\n#: view/qmodem/sms_conversation.js:502\nmsgid \"Multi-part\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:425\nmsgid \"NONE\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:945\nmsgid \"NR (5G) Cells\"\nmsgstr \"\"\n\n#: vendor/huawei.sh:405\n#: view/qmodem/config_advanced.js:760\nmsgid \"NR Band\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:373\nmsgid \"NSA Band\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:429\n#: vendor/gosuncn.sh:482\n#: vendor/huawei.sh:276\n#: vendor/meig.sh:235\n#: vendor/neoway.sh:158\n#: vendor/quectel.sh:360\n#: vendor/sierra.sh:212\n#: vendor/simcom.sh:266\n#: vendor/telit.sh:161\nmsgid \"Name\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:104\nmsgid \"Neighbor Cell\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:635\nmsgid \"Neighbor Cell / Lock Cell\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:649\nmsgid \"Neighbor Cell List\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:566\n#: vendor/foxconn.sh:314\n#: vendor/gosuncn.sh:506\n#: vendor/meig.sh:380\n#: vendor/neoway.sh:287\n#: vendor/quectel.sh:504\n#: vendor/sierra.sh:222\n#: vendor/simcom.sh:364\n#: vendor/telit.sh:258\nmsgid \"Network Information\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:441\nmsgid \"Network LED\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:1417\n#: vendor/foxconn.sh:555\n#: vendor/foxconn.sh:628\n#: vendor/gosuncn.sh:591\n#: vendor/gosuncn.sh:597\n#: vendor/gosuncn.sh:606\n#: vendor/gosuncn.sh:670\n#: vendor/gosuncn.sh:676\n#: vendor/gosuncn.sh:685\n#: vendor/huawei.sh:374\n#: vendor/huawei.sh:505\n#: vendor/meig.sh:560\n#: vendor/neoway.sh:711\n#: vendor/quectel.sh:1659\n#: vendor/simcom.sh:1170\n#: vendor/telit.sh:760\nmsgid \"Network Mode\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:96\nmsgid \"Network Preference\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:343\nmsgid \"Network Preference Configuration\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:576\n#: vendor/foxconn.sh:323\n#: vendor/gosuncn.sh:507\n#: vendor/meig.sh:381\n#: vendor/neoway.sh:771\n#: vendor/quectel.sh:505\n#: vendor/simcom.sh:365\n#: vendor/telit.sh:259\nmsgid \"Network Type\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:395\nmsgid \"Network preference set successfully\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:483\n#: view/qmodem/sms.js:552\nmsgid \"New Conversation\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:503\nmsgid \"New IMEI\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:76\n#: view/qmodem/network_config.js:77\n#: view/qmodem/network_config.js:748\n#: view/qmodem/network_config.js:749\nmsgid \"No\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1139\nmsgid \"No bands available for this modem\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:221\nmsgid \"No devices available. Please scan for devices first.\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:128\nmsgid \"No features available for this modem.\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:939\nmsgid \"No log available\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:981\nmsgid \"No log content to download\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:405\nmsgid \"No messages found\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:144\nmsgid \"No messages found on SIM card\"\nmsgstr \"\"\n\n#: view/qmodem/sms_conversation.js:468\nmsgid \"No messages in this conversation\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:316\nmsgid \"No messages to delete\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:15\n#: view/qmodem/debug.js:15\n#: view/qmodem/sim_switch.js:15\nmsgid \"No modem configured.\"\nmsgstr \"\"\n\n#: view/status/include/11_modem.js:51\n#: view/status/include/11_modem.js:88\n#: view/status/include/11_modem.js:120\nmsgid \"No modem information available\"\nmsgstr \"\"\n\n#: view/qmodem/overview.js:476\n#: view/qmodem/sms.js:56\n#: view/qmodem/sms_conversation.js:73\n#: view/qmodem/sms_sim.js:30\nmsgid \"No modems configured or all modems are disabled.\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:306\nmsgid \"No modes available\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:909\nmsgid \"No neighbor cells found. Make sure the modem has network signal.\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:445\nmsgid \"No network types available\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1410\nmsgid \"No reboot methods available for this modem\"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:204\nmsgid \"No response received\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1115\nmsgid \"No result returned from getLockBand\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:891\nmsgid \"No result returned from neighbor cell scan\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:686\n#: view/qmodem/config_advanced.js:1055\nmsgid \"No status information available\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:441\nmsgid \"None\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1347\nmsgid \"None (All bands unlocked)\"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:123\nmsgid \"Not Supported\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:618\nmsgid \"Not available\"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:157\nmsgid \"Note\"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:201\nmsgid \"Note: Some modems may require a reboot for the change to take effect.\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:363\nmsgid \"Once checking, the prefix will be apply to lan zone\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:114\nmsgid \"Once enabled, the PCIe ports will be scanned on every boot.\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:118\nmsgid \"Once enabled, the USB ports will be scanned on every boot.\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:221\nmsgid \"OpenID (optional)\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:230\nmsgid \"OpenID for message forwarding, use comma to separate multiple IDs\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:216\nmsgid \"Other Storage\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:321\nmsgid \"Override AT Port\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:441\nmsgid \"PAP/CHAP Password\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:433\nmsgid \"PAP/CHAP Username\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:723\nmsgid \"PCI\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:835\nmsgid \"PCI and ARFCN are required\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:399\nmsgid \"PCIe\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:140\nmsgid \"PCIe scan completed successfully\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:150\nmsgid \"PCIe scan error: \"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:142\nmsgid \"PCIe scan failed\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:368\nmsgid \"PDP Context Index\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:372\nmsgid \"PDP Type\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:450\nmsgid \"PIN Code\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:85\n#: view/qmodem/sms_conversation.js:103\nmsgid \"Parse received SMS time as UTC+0\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:106\n#: view/qmodem/sms_conversation.js:124\nmsgid \"Parse sent SMS time as UTC+0\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:181\nmsgid \"Part\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:145\nmsgid \"Path to SMS database file\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:292\nmsgid \"Path to custom forwarding script. Script receives SMS_SENDER, SMS_TIME, SMS_CONTENT environment variables\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:507\nmsgid \"Phone Number\"\nmsgstr \"\"\n\n#: generic.sh:184\n#: generic.sh:220\n#: vendor/foxconn.sh:579\n#: vendor/foxconn.sh:635\n#: vendor/gosuncn.sh:609\n#: vendor/gosuncn.sh:688\n#: vendor/huawei.sh:380\n#: vendor/huawei.sh:512\n#: vendor/huawei.sh:530\n#: vendor/huawei.sh:555\n#: vendor/meig.sh:567\n#: vendor/meig.sh:582\n#: vendor/meig.sh:595\n#: vendor/meig.sh:609\n#: vendor/neoway.sh:718\n#: vendor/neoway.sh:729\n#: vendor/simcom.sh:1177\n#: vendor/simcom.sh:1199\n#: vendor/simcom.sh:1218\n#: vendor/simcom.sh:1232\n#: vendor/telit.sh:764\n#: view/qmodem/config_advanced.js:729\nmsgid \"Physical Cell ID\"\nmsgstr \"\"\n\n#: generic.sh:261\nmsgid \"Physical Cell ID (CA)\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:1468\n#: vendor/huawei.sh:584\n#: vendor/neoway.sh:763\n#: vendor/quectel.sh:1709\nmsgid \"Physical Channel\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:404\nmsgid \"Physical slot identifier (e.g., 1-1.4 for USB, 0000:01:00.0 for PCIe)\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:340\nmsgid \"Platform\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1340\nmsgid \"Please check browser console for more details\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:580\n#: view/qmodem/sms_conversation.js:332\nmsgid \"Please enter a message\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:575\nmsgid \"Please enter a phone number\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:247\nmsgid \"Please select a mode\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:386\nmsgid \"Please select at least one network type\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:740\nmsgid \"Please wait for storage info to load\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:57\nmsgid \"Poll Interval (seconds)\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:526\nmsgid \"Post Init AT Commands\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:517\nmsgid \"Post Init Delay\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:482\nmsgid \"Power GPIO\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1503\nmsgid \"Power cycles the modem completely. Takes longer but ensures a full restart.\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:533\nmsgid \"Pre Dial AT Commands\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:508\nmsgid \"Pre Dial Delay\"\nmsgstr \"\"\n\n#: generic.sh:149\n#: vendor/gosuncn.sh:600\n#: vendor/gosuncn.sh:679\n#: vendor/huawei.sh:578\n#: vendor/meig.sh:624\n#: vendor/neoway.sh:754\n#: vendor/simcom.sh:1252\nmsgid \"Primary Scrambling Code\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:237\nmsgid \"Push Key\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:66\nmsgid \"PushDeer\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:246\nmsgid \"PushDeer Push Key from http://pushdeer.com\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:51\nmsgid \"QModem Configuration\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:61\nmsgid \"QModem Network\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:180\n#: view/qmodem/network_config.js:849\nmsgid \"QModem Network disabled successfully\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:161\n#: view/qmodem/network_config.js:830\nmsgid \"QModem Network enabled successfully\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:137\n#: view/qmodem/network_config.js:806\nmsgid \"QModem Network restarted successfully\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:100\n#: view/qmodem/network_config.js:769\nmsgid \"QModem Network started successfully\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:119\n#: view/qmodem/network_config.js:788\nmsgid \"QModem Network stopped successfully\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:92\nmsgid \"QModem Settings\"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:222\nmsgid \"Quick Commands\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:356\nmsgid \"RA Master\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:703\n#: view/qmodem/config_advanced.js:926\n#: view/qmodem/config_advanced.js:951\nmsgid \"RAT\"\nmsgstr \"\"\n\n#: vendor/neoway.sh:733\n#: vendor/neoway.sh:757\nmsgid \"RX Power (dBm)\"\nmsgstr \"\"\n\n#: generic.sh:192\n#: generic.sh:228\n#: vendor/foxconn.sh:590\n#: vendor/huawei.sh:544\n#: vendor/huawei.sh:566\n#: vendor/simcom.sh:1211\nmsgid \"Radio Signal Strength Noise Ratio\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:599\nmsgid \"ReDial\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:182\nmsgid \"Reading Storage\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:112\n#: view/qmodem/config_advanced.js:1372\nmsgid \"Reboot Modem\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1381\nmsgid \"Reboot Options\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1376\nmsgid \"Reboot the modem device. Soft reboot restarts the modem firmware, hard reboot power cycles the modem.\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1428\n#: view/qmodem/config_advanced.js:1465\nmsgid \"Rebooting...\"\nmsgstr \"\"\n\n#: generic.sh:103\nmsgid \"Receive Rate\"\nmsgstr \"\"\n\n#: generic.sh:153\n#: vendor/huawei.sh:387\n#: vendor/huawei.sh:581\n#: vendor/meig.sh:626\n#: vendor/neoway.sh:759\n#: vendor/simcom.sh:1253\nmsgid \"Received Signal Code Power\"\nmsgstr \"\"\n\n#: generic.sh:156\n#: generic.sh:193\n#: generic.sh:229\n#: vendor/foxconn.sh:589\n#: vendor/huawei.sh:390\n#: vendor/huawei.sh:400\n#: vendor/huawei.sh:520\n#: vendor/huawei.sh:543\n#: vendor/huawei.sh:565\n#: vendor/simcom.sh:1189\n#: vendor/simcom.sh:1210\n#: vendor/simcom.sh:1256\nmsgid \"Received Signal Level\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:1457\n#: vendor/foxconn.sh:587\n#: vendor/gosuncn.sh:593\n#: vendor/gosuncn.sh:602\n#: vendor/gosuncn.sh:611\n#: vendor/gosuncn.sh:672\n#: vendor/gosuncn.sh:681\n#: vendor/gosuncn.sh:690\n#: vendor/huawei.sh:563\n#: vendor/neoway.sh:738\n#: vendor/quectel.sh:1682\n#: vendor/quectel.sh:1700\n#: vendor/simcom.sh:1187\n#: vendor/simcom.sh:1208\n#: vendor/simcom.sh:1240\n#: vendor/telit.sh:770\nmsgid \"Received Signal Strength Indicator\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:591\nmsgid \"Redial command sent successfully\"\nmsgstr \"\"\n\n#: generic.sh:189\n#: generic.sh:225\n#: vendor/foxconn.sh:640\n#: vendor/huawei.sh:397\n#: vendor/huawei.sh:408\n#: vendor/huawei.sh:412\n#: vendor/huawei.sh:517\n#: vendor/huawei.sh:540\n#: vendor/huawei.sh:546\n#: vendor/meig.sh:571\n#: vendor/meig.sh:587\n#: vendor/meig.sh:598\n#: vendor/meig.sh:614\n#: vendor/neoway.sh:721\n#: vendor/neoway.sh:735\n#: vendor/simcom.sh:1185\n#: vendor/simcom.sh:1206\n#: vendor/simcom.sh:1222\n#: vendor/simcom.sh:1238\n#: vendor/telit.sh:768\nmsgid \"Reference Signal Received Power\"\nmsgstr \"\"\n\n#: generic.sh:154\n#: generic.sh:190\n#: generic.sh:226\n#: vendor/foxconn.sh:586\n#: vendor/foxconn.sh:639\n#: vendor/huawei.sh:398\n#: vendor/huawei.sh:409\n#: vendor/huawei.sh:413\n#: vendor/huawei.sh:518\n#: vendor/huawei.sh:541\n#: vendor/huawei.sh:547\n#: vendor/huawei.sh:562\n#: vendor/meig.sh:572\n#: vendor/meig.sh:588\n#: vendor/meig.sh:599\n#: vendor/meig.sh:615\n#: vendor/neoway.sh:722\n#: vendor/neoway.sh:736\n#: vendor/simcom.sh:1186\n#: vendor/simcom.sh:1207\n#: vendor/simcom.sh:1223\n#: vendor/simcom.sh:1239\n#: vendor/telit.sh:769\nmsgid \"Reference Signal Received Quality\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:493\n#: view/qmodem/sms_sim.js:242\nmsgid \"Refresh\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:143\nmsgid \"Request Method\"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:171\nmsgid \"Response\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:145\n#: view/qmodem/network_config.js:814\nmsgid \"Restart\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1496\nmsgid \"Restarts the modem firmware without power cycling. Faster but may not resolve all issues.\"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:100\nmsgid \"Result\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:431\n#: vendor/foxconn.sh:306\n#: vendor/gosuncn.sh:484\n#: vendor/huawei.sh:278\n#: vendor/meig.sh:237\n#: vendor/neoway.sh:160\n#: vendor/quectel.sh:362\n#: vendor/sierra.sh:214\n#: vendor/simcom.sh:268\n#: vendor/telit.sh:163\nmsgid \"Revision\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:421\n#: view/qmodem/network_config.js:498\nmsgid \"Rostelecom (RU)\"\nmsgstr \"\"\n\n#: generic.sh:157\n#: vendor/huawei.sh:579\n#: vendor/neoway.sh:755\nmsgid \"Routing Area Code\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:77\n#: view/qmodem/network_config.js:749\nmsgid \"Running\"\nmsgstr \"\"\n\n#: vendor/huawei.sh:589\nmsgid \"RxLev\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:378\nmsgid \"SA Band\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:1425\n#: vendor/fibocom.sh:1450\n#: vendor/huawei.sh:521\n#: vendor/meig.sh:574\n#: vendor/meig.sh:601\n#: vendor/quectel.sh:1666\n#: vendor/quectel.sh:1692\n#: vendor/simcom.sh:1190\n#: vendor/simcom.sh:1225\n#: view/qmodem/config_advanced.js:771\nmsgid \"SCS\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:189\n#: view/qmodem/sms.js:206\n#: view/qmodem/sms.js:223\n#: view/qmodem/sms.js:707\nmsgid \"SIM Card (SM)\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:60\nmsgid \"SIM Card SMS Management\"\nmsgstr \"\"\n\n#: generic.sh:542\nmsgid \"SIM Error,Error code:\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:498\n#: vendor/foxconn.sh:227\n#: vendor/gosuncn.sh:421\n#: vendor/huawei.sh:226\n#: vendor/meig.sh:279\n#: vendor/neoway.sh:209\n#: vendor/quectel.sh:417\n#: vendor/sierra.sh:183\n#: vendor/simcom.sh:322\n#: vendor/telit.sh:215\nmsgid \"SIM Information\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:431\nmsgid \"SIM LED\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:504\n#: vendor/foxconn.sh:273\n#: vendor/gosuncn.sh:458\n#: vendor/huawei.sh:258\n#: vendor/meig.sh:285\n#: vendor/neoway.sh:215\n#: vendor/quectel.sh:423\n#: vendor/simcom.sh:328\nmsgid \"SIM Number\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:503\n#: vendor/fibocom.sh:518\n#: vendor/foxconn.sh:272\n#: vendor/foxconn.sh:287\n#: vendor/gosuncn.sh:457\n#: vendor/huawei.sh:257\n#: vendor/meig.sh:284\n#: vendor/meig.sh:299\n#: vendor/neoway.sh:214\n#: vendor/neoway.sh:229\n#: vendor/quectel.sh:422\n#: vendor/quectel.sh:437\n#: vendor/sierra.sh:196\n#: vendor/simcom.sh:327\n#: vendor/simcom.sh:342\n#: vendor/telit.sh:220\n#: vendor/telit.sh:234\nmsgid \"SIM Slot\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:501\n#: vendor/fibocom.sh:510\n#: vendor/fibocom.sh:514\n#: vendor/fibocom.sh:517\n#: vendor/foxconn.sh:270\n#: vendor/foxconn.sh:279\n#: vendor/foxconn.sh:283\n#: vendor/foxconn.sh:286\n#: vendor/gosuncn.sh:433\n#: vendor/gosuncn.sh:455\n#: vendor/huawei.sh:256\n#: vendor/meig.sh:282\n#: vendor/meig.sh:291\n#: vendor/meig.sh:295\n#: vendor/meig.sh:298\n#: vendor/neoway.sh:212\n#: vendor/neoway.sh:221\n#: vendor/neoway.sh:225\n#: vendor/neoway.sh:228\n#: vendor/quectel.sh:420\n#: vendor/quectel.sh:429\n#: vendor/quectel.sh:433\n#: vendor/quectel.sh:436\n#: vendor/sierra.sh:195\n#: vendor/simcom.sh:325\n#: vendor/simcom.sh:334\n#: vendor/simcom.sh:338\n#: vendor/simcom.sh:341\n#: vendor/telit.sh:218\n#: vendor/telit.sh:226\n#: vendor/telit.sh:230\n#: vendor/telit.sh:233\nmsgid \"SIM Status\"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:19\nmsgid \"SIM Switch\"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:85\nmsgid \"SIM Switch Status\"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:198\nmsgid \"SIM slot switched to Slot %s successfully.\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:315\nmsgid \"SMS AT Port\"\nmsgstr \"\"\n\n#: view/qmodem/sms_conversation.js:62\nmsgid \"SMS Conversation\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:132\nmsgid \"SMS Database Path\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:20\nmsgid \"SMS Forwarder Configuration\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:253\nmsgid \"SMS Messages\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:149\nmsgid \"SMS Messages on SIM Card\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:174\nmsgid \"SMS Storage\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:755\nmsgid \"SMS storage settings applied successfully\"\nmsgstr \"\"\n\n#: qmodem/sms.js:240\nmsgid \"Saturday\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:309\nmsgid \"Save\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:422\n#: view/qmodem/network_config.js:499\nmsgid \"Sber Mobile (RU)\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:178\nmsgid \"Scan ALL Manually\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:663\n#: view/qmodem/config_advanced.js:893\n#: view/qmodem/config_advanced.js:911\n#: view/qmodem/config_advanced.js:969\n#: view/qmodem/config_advanced.js:976\nmsgid \"Scan Neighbor Cells\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:130\nmsgid \"Scan PCIe Manually\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:154\nmsgid \"Scan USB Manually\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:639\nmsgid \"Scan neighboring cell towers and lock modem to specific cell. You can scan for nearby cells and then lock to a specific cell by copying its parameters.\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:133\n#: view/qmodem/settings.js:157\n#: view/qmodem/settings.js:181\nmsgid \"Scanning\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:134\nmsgid \"Scanning PCIe ports, please wait...\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:158\nmsgid \"Scanning USB ports, please wait...\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:182\nmsgid \"Scanning all ports, please wait...\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:659\nmsgid \"Scanning neighbor cells...\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:658\nmsgid \"Scanning...\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:283\nmsgid \"Script Path\"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:122\nmsgid \"Select AT Port\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1290\nmsgid \"Select All / None\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1212\nmsgid \"Select Bands\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:219\nmsgid \"Select Mode\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:361\nmsgid \"Select Networks\"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:93\nmsgid \"Select SIM Slot\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:230\nmsgid \"Select a device to configure:\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:356\nmsgid \"Select features to disable for this modem.\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:609\n#: view/qmodem/sms_conversation.js:306\n#: view/qmodem/sms_conversation.js:342\n#: view/qmodem/sms_conversation.js:360\nmsgid \"Send\"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:210\nmsgid \"Send AT Command\"\nmsgstr \"\"\n\n#: view/qmodem/sms_conversation.js:228\nmsgid \"Send Message\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:158\nmsgid \"Sender\"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:193\nmsgid \"Sending command...\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:587\nmsgid \"Sending message...\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:587\n#: view/qmodem/sms_conversation.js:338\nmsgid \"Sending...\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:251\nmsgid \"Server (optional)\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:65\nmsgid \"ServerChan\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:192\nmsgid \"ServerChan API token from https://sctapi.ftqq.com\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:1426\n#: vendor/fibocom.sh:1443\n#: vendor/fibocom.sh:1460\n#: vendor/foxconn.sh:593\n#: vendor/huawei.sh:522\n#: vendor/huawei.sh:538\n#: vendor/huawei.sh:569\n#: vendor/neoway.sh:744\n#: vendor/quectel.sh:1667\n#: vendor/quectel.sh:1685\n#: vendor/quectel.sh:1703\n#: vendor/simcom.sh:1191\n#: vendor/simcom.sh:1214\n#: vendor/simcom.sh:1244\nmsgid \"Serving Cell Receive Level\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:100\nmsgid \"Set IMEI\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:744\nmsgid \"Setting SMS Storage\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:569\nmsgid \"Setting...\"\nmsgstr \"\"\n\n#: generic.sh:191\n#: generic.sh:227\n#: vendor/meig.sh:573\n#: vendor/meig.sh:589\n#: vendor/meig.sh:600\n#: vendor/meig.sh:616\n#: vendor/neoway.sh:723\n#: vendor/neoway.sh:737\nmsgid \"Signal to Interference plus Noise Ratio\"\nmsgstr \"\"\n\n#: vendor/foxconn.sh:588\n#: vendor/foxconn.sh:641\n#: vendor/huawei.sh:399\n#: vendor/huawei.sh:410\n#: vendor/huawei.sh:414\n#: vendor/huawei.sh:519\n#: vendor/huawei.sh:542\n#: vendor/huawei.sh:548\n#: vendor/huawei.sh:564\n#: vendor/simcom.sh:1188\n#: vendor/simcom.sh:1209\n#: vendor/simcom.sh:1224\n#: vendor/simcom.sh:1241\n#: vendor/telit.sh:771\nmsgid \"Signal to Interference plus Noise Ratio Bandwidth\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:183\nmsgid \"Single\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:389\n#: view/qmodem/network_config.js:466\nmsgid \"Skytone (CN)\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:1470\n#: vendor/huawei.sh:586\n#: vendor/neoway.sh:765\n#: vendor/quectel.sh:1711\nmsgid \"Slot\"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:136\n#: view/qmodem/sim_switch.js:177\nmsgid \"Slot %s\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:403\nmsgid \"Slot ID\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:397\nmsgid \"Slot Type\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:404\n#: view/qmodem/network_config.js:481\nmsgid \"Smart Communications (PH)\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1435\n#: view/qmodem/config_advanced.js:1440\n#: view/qmodem/config_advanced.js:1445\n#: view/qmodem/config_advanced.js:1448\n#: view/qmodem/config_advanced.js:1495\n#: view/qmodem/settings.js:293\nmsgid \"Soft Reboot\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:1432\nmsgid \"Soft reboot initiated successfully. The modem is restarting...\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:1471\n#: vendor/huawei.sh:587\n#: vendor/quectel.sh:1712\nmsgid \"Speech Code\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:1469\n#: vendor/huawei.sh:585\n#: vendor/neoway.sh:764\n#: vendor/quectel.sh:1710\nmsgid \"Spreading Factor\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:108\n#: view/qmodem/network_config.js:777\nmsgid \"Start\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:206\n#: view/qmodem/network_config.js:259\nmsgid \"Status\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:127\n#: view/qmodem/network_config.js:796\nmsgid \"Stop\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:216\nmsgid \"Summary\"\nmsgstr \"\"\n\n#: qmodem/sms.js:239\nmsgid \"Sunday\"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:121\nmsgid \"Support\"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:123\nmsgid \"Supported\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:347\nmsgid \"Supported Modes\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:348\nmsgid \"Supported driver modes (e.g., RNDIS/NCM/QMI/MBIM/ETH/PPP)\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:138\nmsgid \"Supports placeholders: {SENDER}, {CONTENT}, {TIME}\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:391\n#: view/qmodem/network_config.js:468\nmsgid \"Swisscom (CH)\"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:23\nmsgid \"Switch between SIM card slots. Note: Some modems may require a reboot after switching SIM slots.\"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:187\nmsgid \"Switching SIM slot...\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:420\n#: view/qmodem/network_config.js:497\nmsgid \"T-mobile (RU)\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:1442\n#: vendor/fibocom.sh:1459\n#: vendor/foxconn.sh:592\n#: vendor/foxconn.sh:642\n#: vendor/huawei.sh:537\n#: vendor/huawei.sh:568\n#: vendor/meig.sh:590\n#: vendor/meig.sh:617\n#: vendor/quectel.sh:1684\n#: vendor/quectel.sh:1702\n#: vendor/simcom.sh:1183\n#: vendor/simcom.sh:1213\n#: vendor/simcom.sh:1243\n#: vendor/telit.sh:767\nmsgid \"TX Power\"\nmsgstr \"\"\n\n#: vendor/neoway.sh:734\n#: vendor/neoway.sh:758\nmsgid \"TX Power (dBm)\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:418\n#: view/qmodem/network_config.js:495\nmsgid \"Tele2 (RU)\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:63\nmsgid \"Telegram Bot\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:395\n#: view/qmodem/network_config.js:472\nmsgid \"Telekom (DE)\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:408\n#: vendor/foxconn.sh:470\n#: vendor/gosuncn.sh:273\n#: vendor/meig.sh:220\n#: vendor/quectel.sh:338\n#: vendor/sierra.sh:340\n#: vendor/simcom.sh:244\n#: vendor/telit.sh:144\nmsgid \"Temperature\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:426\nmsgid \"The first module loaded into this slot will automatically be assigned this default metric.\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:502\nmsgid \"The metric value is used to determine the priority of the route. The smaller the value, the higher the priority. Cannot duplicate.\"\nmsgstr \"\"\n\n#: view/qmodem/sim_switch.js:150\nmsgid \"This modem does not support SIM switching.\"\nmsgstr \"\"\n\n#: qmodem/sms.js:240\nmsgid \"Thursday\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:420\n#: view/qmodem/sms_sim.js:159\nmsgid \"Time\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:183\nmsgid \"Token\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:221\nmsgid \"Total Messages\"\nmsgstr \"\"\n\n#: generic.sh:182\n#: generic.sh:218\n#: vendor/gosuncn.sh:607\n#: vendor/gosuncn.sh:686\n#: vendor/neoway.sh:732\n#: vendor/telit.sh:765\nmsgid \"Tracking Area Code\"\nmsgstr \"\"\n\n#: vendor/meig.sh:568\n#: vendor/meig.sh:583\n#: vendor/meig.sh:610\nmsgid \"Tracking area code\"\nmsgstr \"\"\n\n#: vendor/foxconn.sh:585\n#: vendor/foxconn.sh:638\n#: vendor/huawei.sh:381\n#: vendor/huawei.sh:513\n#: vendor/huawei.sh:539\n#: vendor/huawei.sh:561\n#: vendor/simcom.sh:1178\n#: vendor/simcom.sh:1205\n#: vendor/simcom.sh:1237\nmsgid \"Tracking area code of cell served by neighbor Enb\"\nmsgstr \"\"\n\n#: generic.sh:100\nmsgid \"Transmit Rate\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:125\nmsgid \"Try Preset PCIe Port\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:121\nmsgid \"Try Preset USB Port\"\nmsgstr \"\"\n\n#: qmodem/sms.js:239\nmsgid \"Tuesday\"\nmsgstr \"\"\n\n#: vendor/simcom.sh:1255\nmsgid \"Tx Power\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:286\n#: view/qmodem/sms_sim.js:161\nmsgid \"Type\"\nmsgstr \"\"\n\n#: vendor/huawei.sh:407\nmsgid \"UL\"\nmsgstr \"\"\n\n#: generic.sh:151\n#: generic.sh:187\n#: generic.sh:223\n#: vendor/foxconn.sh:583\n#: vendor/huawei.sh:534\n#: vendor/huawei.sh:559\n#: vendor/meig.sh:585\n#: vendor/meig.sh:612\n#: vendor/neoway.sh:743\n#: vendor/simcom.sh:1203\n#: vendor/simcom.sh:1235\nmsgid \"UL Bandwidth\"\nmsgstr \"\"\n\n#: generic.sh:264\nmsgid \"UL Bandwidth (CA)\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:1430\nmsgid \"UL CA\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:412\n#: view/qmodem/network_config.js:489\nmsgid \"UMobile (MY)\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:398\nmsgid \"USB\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:164\nmsgid \"USB scan completed successfully\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:174\nmsgid \"USB scan error: \"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:167\nmsgid \"USB scan failed\"\nmsgstr \"\"\n\n#: generic.sh:148\n#: vendor/huawei.sh:577\n#: vendor/neoway.sh:753\nmsgid \"UTRA Absolute Radio Frequency Channel Number\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:413\n#: view/qmodem/network_config.js:490\nmsgid \"Unifi (MY)\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:104\nmsgid \"Units: seconds\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:302\n#: view/qmodem/network_config.js:227\n#: view/qmodem/network_config.js:262\n#: view/qmodem/network_config.js:669\nmsgid \"Unknown\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:813\n#: view/qmodem/config_advanced.js:817\n#: view/qmodem/config_advanced.js:820\nmsgid \"Unlock Cell\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:795\nmsgid \"Unlocking...\"\nmsgstr \"\"\n\n#: vendor/simcom.sh:1251\nmsgid \"Uplink Absolute Radio Frequency Channel Number\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:316\nmsgid \"Use Ubus\"\nmsgstr \"\"\n\n#: view/qmodem/debug.js:140\n#: view/qmodem/settings.js:327\nmsgid \"Use Ubus AT Daemon\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:333\nmsgid \"Vendor\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:281\nmsgid \"View Log\"\nmsgstr \"\"\n\n#: view/qmodem/sms_sim.js:65\nmsgid \"View and delete SMS messages stored on SIM card. These are raw messages before being processed into conversations.\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:258\nmsgid \"View and manage SMS messages. Messages are grouped by sender/recipient.\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:486\nmsgid \"View and modify the modem IMEI number. IMEI must be 15 digits. Changes require modem reboot to take effect.\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:394\n#: view/qmodem/network_config.js:471\nmsgid \"Vodafone (DE)\"\nmsgstr \"\"\n\n#: vendor/fibocom.sh:372\n#: vendor/foxconn.sh:463\n#: vendor/meig.sh:187\n#: vendor/quectel.sh:313\n#: vendor/sierra.sh:333\n#: vendor/simcom.sh:227\n#: vendor/telit.sh:131\nmsgid \"Voltage\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:363\nmsgid \"WCDMA Band\"\nmsgstr \"\"\n\n#: vendor/huawei.sh:386\nmsgid \"WCDMA Information\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:32\nmsgid \"Warning\"\nmsgstr \"\"\n\n#: view/qmodem/config_advanced.js:596\nmsgid \"Warning: \"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:64\nmsgid \"Webhook\"\nmsgstr \"\"\n\n#: view/qmodem/sms_forward.js:129\n#: view/qmodem/sms_forward.js:267\nmsgid \"Webhook URL\"\nmsgstr \"\"\n\n#: qmodem/sms.js:239\nmsgid \"Wednesday\"\nmsgstr \"\"\n\n#: view/qmodem/sms.js:199\nmsgid \"Writing Storage\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:411\n#: view/qmodem/network_config.js:488\nmsgid \"YES (MY)\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:76\n#: view/qmodem/network_config.js:77\n#: view/qmodem/network_config.js:748\n#: view/qmodem/network_config.js:749\nmsgid \"Yes\"\nmsgstr \"\"\n\n#: qmodem/sms.js:236\nmsgid \"Yesterday\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:419\n#: view/qmodem/network_config.js:496\nmsgid \"Yota (RU)\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:300\n#: view/qmodem/settings.js:302\n#: view/qmodem/settings.js:306\n#: view/qmodem/settings.js:309\n#: view/qmodem/settings.js:316\n#: view/qmodem/settings.js:322\n#: view/qmodem/settings.js:364\n#: view/qmodem/settings.js:369\n#: view/qmodem/settings.js:374\n#: view/qmodem/settings.js:379\n#: view/qmodem/settings.js:422\n#: view/qmodem/settings.js:428\n#: view/qmodem/settings.js:489\n#: view/qmodem/settings.js:494\nmsgid \"e.g.\"\nmsgstr \"\"\n\n#: view/qmodem/settings.js:294\nmsgid \"enable modem soft reboot\"\nmsgstr \"\"\n\n#: view/qmodem/network_config.js:345\nmsgid \"quectel-CM will append the DNS server to the resolv.conf file by default.if you do not want to modify the resolv.conf file, please check this option.\"\nmsgstr \"\"\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/po/zh_Hans/luci-app-qmodem-next.po",
    "content": "# Source: vendor/sierra.sh:437, vendor/sierra.sh:440, vendor/sierra.sh:443, vendor/sierra.sh:446\nmsgid \"$key\"\nmsgstr \"$key\"\n\n# Source: view/qmodem/sms.js:450, view/qmodem/sms_conversation.js:255\nmsgid \"16-bit (Unicode)\"\nmsgstr \"16位（Unicode）\"\n\n# Source: view/qmodem/settings.js:220\nmsgid \"5G Ethernet Interface\"\nmsgstr \"5G以太网接口\"\n\n# Source: view/qmodem/sms.js:449, view/qmodem/sms_conversation.js:254\nmsgid \"7-bit (ASCII)\"\nmsgstr \"7位（ASCII）\"\n\n# Source: view/qmodem/network_config.js:195\n# Source: view/qmodem/network_config.js:346, view/qmodem/network_config.js:422\nmsgid \"APN\"\nmsgstr \"APN\"\n\n# Source: view/qmodem/config_advanced.js:737\nmsgid \"ARFCN\"\nmsgstr \"ARFCN\"\n\n# Source: view/qmodem/debug.js:157\nmsgid \"AT Command\"\nmsgstr \"AT命令\"\n\n# Source: view/qmodem/debug.js:19\n# Source: view/qmodem/debug.js\nmsgid \"AT Debug\"\nmsgstr \"AT 调试\"\n\n# Source: vendor/fibocom.sh:432, vendor/foxconn.sh:307, vendor/huawei.sh:278, vendor/meig.sh:238, vendor/neoway.sh:161, vendor/quectel.sh:363, vendor/sierra.sh:215, vendor/simcom.sh:245, vendor/telit.sh:164, view/qmodem/settings.js:174\nmsgid \"AT Port\"\nmsgstr \"AT端口\"\n\n# Source: view/qmodem/config_advanced.js:743\nmsgid \"Absolute Radio Frequency Channel Number\"\nmsgstr \"绝对射频信道号\"\n\n# Source: vendor/fibocom.sh:1426, vendor/fibocom.sh:1437, vendor/fibocom.sh:1476, vendor/huawei.sh:381, vendor/huawei.sh:513, vendor/neoway.sh:719, vendor/neoway.sh:774, vendor/quectel.sh:1668, vendor/quectel.sh:1706, vendor/simcom.sh:930, vendor/simcom.sh:970, vendor/telit.sh:763\nmsgid \"Absolute Radio-Frequency Channel Number\"\nmsgstr \"绝对射频信道号\"\n\n# Source: vendor/meig.sh:383, vendor/neoway.sh:289, vendor/quectel.sh:509\nmsgid \"Access Maximum Bit Rate for Downlink\"\nmsgstr \"下行接入最大比特率\"\n\n# Source: vendor/meig.sh:382, vendor/neoway.sh:288, vendor/quectel.sh:508\nmsgid \"Access Maximum Bit Rate for Uplink\"\nmsgstr \"上行接入最大比特率\"\n\n# Source: view/qmodem/config_advanced.js:893, view/qmodem/config_advanced.js:918\nmsgid \"Action\"\nmsgstr \"操作\"\n\n# Source: view/qmodem/sms.js:98, view/qmodem/sms_conversation.js:116\nmsgid \"Adjust received messages for local timezone (UTC+8)\"\nmsgstr \"调整接收消息的本地时区（UTC+8）\"\n\n# Source: view/qmodem/sms.js:123, view/qmodem/sms_conversation.js:141\nmsgid \"Adjust sent messages for local timezone (UTC+8)\"\nmsgstr \"调整发送消息的本地时区（UTC+8）\"\n\n# Source: view/qmodem/config_advanced.js:19\nmsgid \"Advanced Configuration\"\nmsgstr \"高级配置\"\n\n# Source: view/qmodem/settings.js:204\nmsgid \"After setting this option, the first module loaded into this slot will automatically be assigned this default alias.\"\nmsgstr \"设置此选项后，首次加载到此插槽的模块将自动分配此默认别名。\"\n\n# Source: view/qmodem/settings.js:167\nmsgid \"Alias\"\nmsgstr \"别名\"\n\n# Source: view/qmodem/settings.js:47\nmsgid \"Alternative AT Tools\"\nmsgstr \"备用AT工具\"\n\n# Source: view/qmodem/config_advanced.js:262, view/qmodem/config_advanced.js:267, view/qmodem/config_advanced.js:270, view/qmodem/config_advanced.js:401, view/qmodem/config_advanced.js:406, view/qmodem/config_advanced.js:409, view/qmodem/config_advanced.js:579, view/qmodem/config_advanced.js:584, view/qmodem/config_advanced.js:587, view/qmodem/config_advanced.js:821, view/qmodem/config_advanced.js:825, view/qmodem/config_advanced.js:828, view/qmodem/config_advanced.js:1278, view/qmodem/config_advanced.js:1283, view/qmodem/config_advanced.js:1286\nmsgid \"Apply\"\nmsgstr \"应用\"\n\n# Source: view/qmodem/config_advanced.js:252, view/qmodem/config_advanced.js:391, view/qmodem/config_advanced.js:810, view/qmodem/config_advanced.js:1268\nmsgid \"Applying...\"\nmsgstr \"应用中...\"\n\n# Source: view/qmodem/config_advanced.js:564\nmsgid \"Are you sure you want to change the IMEI to %s? This requires modem reboot.\"\nmsgstr \"确定要将IMEI更改为%s吗？这需要重启调制解调器。\"\n\n# Source: view/qmodem/network_config.js:553\nmsgid \"Are you sure you want to clear the dial log?\"\nmsgstr \"确定要清除拨号日志吗？\"\n\n# Source: view/qmodem/config_advanced.js:1424\nmsgid \"Are you sure you want to perform a hard reboot? This will power cycle the modem and may cause a longer disconnection.\"\nmsgstr \"确定要执行硬重启吗？这将断电重启调制解调器，可能导致更长的断连时间。\"\n\n# Source: view/qmodem/config_advanced.js:1387\nmsgid \"Are you sure you want to perform a soft reboot? The modem will restart and may lose connection temporarily.\"\nmsgstr \"确定要执行软重启吗？调制解调器将重启，可能暂时断开连接。\"\n\n# Source: view/qmodem/settings.js:224\nmsgid \"Associated USB\"\nmsgstr \"关联的USB\"\n\n# Source: view/qmodem/settings.js:74\nmsgid \"Attempt to use pre-configured PCIe settings from the CPE vendor.\"\nmsgstr \"尝试使用CPE厂商预配置的PCIe设置。\"\n\n# Source: view/qmodem/settings.js:70\nmsgid \"Attempt to use pre-configured USB settings from the CPE vendor.\"\nmsgstr \"尝试使用CPE厂商预配置的USB设置。\"\n\n# Source: view/qmodem/sms.js:153\nmsgid \"Auto Delete from SIM\"\nmsgstr \"自动从SIM卡删除\"\n\n# Source: view/qmodem/sms.js:163\nmsgid \"Automatically delete SMS from SIM card after reading\"\nmsgstr \"读取后自动从SIM卡删除短信\"\n\n# Source: view/qmodem/debug.js:81\nmsgid \"Available AT Ports\"\nmsgstr \"可用AT端口\"\n\n# Source: view/qmodem/sms_conversation.js:160\nmsgid \"Back\"\nmsgstr \"返回\"\n\n# Source: vendor/fibocom.sh:1428, vendor/fibocom.sh:1439, vendor/fibocom.sh:1459, vendor/fibocom.sh:1477, vendor/fibocom.sh:1493, vendor/fibocom.sh:1516, vendor/foxconn.sh:582, vendor/foxconn.sh:629, vendor/huawei.sh:382, vendor/huawei.sh:514, vendor/huawei.sh:532, vendor/huawei.sh:557, vendor/huawei.sh:579, vendor/meig.sh:569, vendor/meig.sh:584, vendor/meig.sh:596, vendor/meig.sh:611, vendor/meig.sh:625, vendor/neoway.sh:720, vendor/neoway.sh:731, vendor/neoway.sh:756, vendor/neoway.sh:775, vendor/quectel.sh:1669, vendor/quectel.sh:1689, vendor/quectel.sh:1707, vendor/quectel.sh:1722, vendor/quectel.sh:1743, vendor/simcom.sh:931, vendor/simcom.sh:953, vendor/simcom.sh:971, vendor/telit.sh:761, view/qmodem/config_advanced.js:754\nmsgid \"Band\"\nmsgstr \"频段\"\n\n# Source: view/qmodem/config_advanced.js:805\nmsgid \"Band is required for NR\"\nmsgstr \"NR需要频段\"\n\n# Source: vendor/telit.sh:762\nmsgid \"Bandwidth\"\nmsgstr \"带宽\"\n\n# Source: view/qmodem/settings.js:57\nmsgid \"Block Auto Probe/Remove\"\nmsgstr \"阻止自动探测/移除\"\n\n# Source: view/qmodem/network_config.js:558, view/qmodem/sms.js:474\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\n# Source: vendor/gosuncn.sh:141\nmsgid \"Carrier\"\nmsgstr \"运营商\"\n\n# Source: vendor/fibocom.sh:1423, vendor/fibocom.sh:1455, vendor/fibocom.sh:1489, vendor/fibocom.sh:1512, vendor/foxconn.sh:578, vendor/foxconn.sh:634, vendor/huawei.sh:378, vendor/huawei.sh:510, vendor/huawei.sh:528, vendor/huawei.sh:553, vendor/huawei.sh:575, vendor/meig.sh:566, vendor/meig.sh:581, vendor/meig.sh:608, vendor/meig.sh:623, vendor/neoway.sh:717, vendor/neoway.sh:728, vendor/neoway.sh:752, vendor/quectel.sh:1665, vendor/quectel.sh:1685, vendor/quectel.sh:1718, vendor/quectel.sh:1739, vendor/simcom.sh:927, vendor/simcom.sh:949, vendor/simcom.sh:982, vendor/simcom.sh:1001\nmsgid \"Cell ID\"\nmsgstr \"小区ID\"\n\n# Source: view/qmodem/config_advanced.js:892, view/qmodem/config_advanced.js:917\nmsgid \"Cell Information\"\nmsgstr \"小区信息\"\n\n# Source: view/qmodem/config_advanced.js:1036\nmsgid \"Cell is unlocked (no lock active)\"\nmsgstr \"小区未锁定（无锁定）\"\n\n# Source: view/qmodem/config_advanced.js:1003\nmsgid \"Cell parameters copied to settings\"\nmsgstr \"小区参数已复制到设置\"\n\n# Source: view/qmodem/config_advanced.js:597\nmsgid \"Changing IMEI may be illegal in some countries. Use at your own risk.\"\nmsgstr \"在某些国家更改IMEI可能违法，请自行承担风险。\"\n\n# Source: vendor/fibocom.sh:1469, vendor/fibocom.sh:1503, vendor/foxconn.sh:591, vendor/huawei.sh:535, vendor/huawei.sh:566, vendor/neoway.sh:741, vendor/quectel.sh:1699, vendor/quectel.sh:1731, vendor/simcom.sh:933, vendor/simcom.sh:963, vendor/simcom.sh:993\nmsgid \"Channel Quality Indicator\"\nmsgstr \"信道质量指示\"\n\n# Source: vendor/quectel.sh:507, vendor/telit.sh:260\nmsgid \"Channel Quality Indicator for Downlink\"\nmsgstr \"下行信道质量指示\"\n\n# Source: vendor/quectel.sh:506\nmsgid \"Channel Quality Indicator for Uplink\"\nmsgstr \"上行信道质量指示\"\n\n# Source: view/qmodem/network_config.js:480, view/qmodem/sms_conversation.js:315\nmsgid \"Clear\"\nmsgstr \"清除\"\n\n# Source: view/qmodem/network_config.js:552\nmsgid \"Clear Dial Log\"\nmsgstr \"清除拨号日志\"\n\n# Source: view/qmodem/config_advanced.js:670\nmsgid \"Click \\\"Scan Neighbor Cells\\\" to search for nearby cell towers\"\nmsgstr \"点击“扫描邻区小区”以搜索附近基站\"\n\n# Source: view/qmodem/debug.js:177\nmsgid \"Click \\\"Send AT Command\\\" to execute\"\nmsgstr \"点击“发送AT命令”以执行\"\n\n# Source: view/qmodem/network_config.js:485\nmsgid \"Close\"\nmsgstr \"关闭\"\n\n# Source: vendor/fibocom.sh:1524, vendor/huawei.sh:587, vendor/neoway.sh:766, vendor/quectel.sh:1751\nmsgid \"Compression Mode\"\nmsgstr \"压缩模式\"\n\n# Source: view/qmodem/config_advanced.js:984\nmsgid \"Configuration inputs not found\"\nmsgstr \"未找到配置输入\"\n\n# Source: view/qmodem/sms.js:580\nmsgid \"Configuration saved\"\nmsgstr \"配置已保存\"\n\n# Source: view/qmodem/config_advanced.js:698\nmsgid \"Configure cell lock parameters. You can manually enter values or use the \\\"Copy\\\" button from scanned cells.\"\nmsgstr \"配置小区锁定参数。可手动输入值，或从扫描的小区使用“复制”按钮。\"\n\n# Source: view/qmodem/config_advanced.js:347\nmsgid \"Configure network preference (5G/4G/3G priority). Changes may require modem restart.\"\nmsgstr \"配置网络优先级（5G/4G/3G）。更改可能需要重启调制解调器。\"\n\n# Source: view/qmodem/settings.js:190\nmsgid \"Configure physical slots for modem installation\"\nmsgstr \"配置调制解调器安装的物理插槽\"\n\n# Source: view/qmodem/config_advanced.js:205\nmsgid \"Configure the modem dial mode (QMI/MBIM/ECM/NCM, etc.). Changes require modem reboot to take effect.\"\nmsgstr \"配置调制解调器拨号模式（QMI/MBIM/ECM/NCM等）。更改需重启调制解调器生效。\"\n\n# Source: view/qmodem/debug.js:102\nmsgid \"Configured Ports\"\nmsgstr \"已配置端口\"\n\n# Source: view/qmodem/network_config.js:580\nmsgid \"Confirm\"\nmsgstr \"确认\"\n\n# Source: generic.sh:369\nmsgid \"Connect Status\"\nmsgstr \"连接状态\"\n\n# Source: view/qmodem/network_config.js:332\nmsgid \"Connected\"\nmsgstr \"已连接\"\n\n# Source: view/qmodem/sms.js:332\nmsgid \"Contact\"\nmsgstr \"联系人\"\n\n# Source: view/qmodem/network_config.js:44\nmsgid \"Control\"\nmsgstr \"控制\"\n\n# Source: view/qmodem/sms_conversation.js:162\nmsgid \"Conversation with \"\nmsgstr \"与 \"\n\n# Source: view/qmodem/sms.js:324\nmsgid \"Conversations\"\nmsgstr \"会话\"\n\n# Source: view/qmodem/config_advanced.js:1005\nmsgid \"Copy\"\nmsgstr \"复制\"\n\n# Source: view/qmodem/sms.js:335\nmsgid \"Count\"\nmsgstr \"数量\"\n\n# Source: view/qmodem/config_advanced.js:491\nmsgid \"Current IMEI\"\nmsgstr \"当前IMEI\"\n\n# Source: view/qmodem/config_advanced.js:210\nmsgid \"Current Mode\"\nmsgstr \"当前模式\"\n\n# Source: view/qmodem/debug.js:96\nmsgid \"Current Port\"\nmsgstr \"当前端口\"\n\n# Source: view/qmodem/config_advanced.js:352\nmsgid \"Current Preference\"\nmsgstr \"当前优先级\"\n\n# Source: vendor/huawei.sh:405\nmsgid \"DL\"\nmsgstr \"下行\"\n\n# Source: vendor/fibocom.sh:1429, vendor/fibocom.sh:1440, vendor/fibocom.sh:1461, vendor/fibocom.sh:1478, vendor/fibocom.sh:1495, vendor/foxconn.sh:584, vendor/foxconn.sh:630, vendor/huawei.sh:383, vendor/huawei.sh:515, vendor/huawei.sh:534, vendor/huawei.sh:559, vendor/meig.sh:570, vendor/meig.sh:586, vendor/meig.sh:597, vendor/meig.sh:613, vendor/neoway.sh:742, vendor/quectel.sh:1670, vendor/quectel.sh:1690, vendor/quectel.sh:1708, vendor/quectel.sh:1723, vendor/simcom.sh:932, vendor/simcom.sh:955, vendor/simcom.sh:972, vendor/simcom.sh:987\nmsgid \"DL Bandwidth\"\nmsgstr \"下行带宽\"\n\n# Source: vendor/simcom.sh:935, vendor/telit.sh:766\nmsgid \"DL/UL MOD\"\nmsgstr \"下行/上行调制\"\n\n# Source: view/qmodem/settings.js:203\nmsgid \"Default Alias\"\nmsgstr \"默认别名\"\n\n# Source: view/qmodem/settings.js:207\nmsgid \"Default Metric\"\nmsgstr \"默认跃点数\"\n\n# Source: view/qmodem/settings.js:51\nmsgid \"Delay Start\"\nmsgstr \"延迟启动\"\n\n# Source: view/qmodem/sms_conversation.js:531\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n# Source: view/qmodem/sms_conversation.js:526\nmsgid \"Delete this message?\"\nmsgstr \"删除此消息？\"\n\n# Source: view/qmodem/debug.js:109\nmsgid \"Detected Ports\"\nmsgstr \"检测到的端口\"\n\n# Source: view/qmodem/settings.js:170\nmsgid \"Device Path\"\nmsgstr \"设备路径\"\n\n# Source: view/qmodem/network_config.js:283\nmsgid \"Dial\"\nmsgstr \"拨号\"\n\n# Source: view/qmodem/network_config.js:93, view/qmodem/network_config.js:99\nmsgid \"Dial Configuration\"\nmsgstr \"拨号配置\"\n\n# Source: view/qmodem/network_config.js:160\nmsgid \"Dial Control\"\nmsgstr \"拨号控制\"\n\n# Source: view/qmodem/network_config.js:141, view/qmodem/network_config.js:439\nmsgid \"Dial Log\"\nmsgstr \"拨号日志\"\n\n# Source: view/qmodem/config_advanced.js:92\nmsgid \"Dial Mode\"\nmsgstr \"拨号模式\"\n\n# Source: view/qmodem/config_advanced.js:201\nmsgid \"Dial Mode Configuration\"\nmsgstr \"拨号模式配置\"\n\n# Source: view/qmodem/network_config.js:271\nmsgid \"Dial command sent successfully\"\nmsgstr \"拨号命令发送成功\"\n\n# Source: view/qmodem/network_config.js:167\nmsgid \"Dial disabled for this modem\"\nmsgstr \"此调制解调器已禁用拨号\"\n\n# Source: view/qmodem/network_config.js:88\nmsgid \"Disable\"\nmsgstr \"禁用\"\n\n# Source: view/qmodem/network_config.js:335\nmsgid \"Disconnected\"\nmsgstr \"已断开\"\n\n# Source: vendor/huawei.sh:388\nmsgid \"Discontinuous Reception\"\nmsgstr \"不连续接收\"\n\n# Source: view/qmodem/network_config.js:473\nmsgid \"Download\"\nmsgstr \"下载\"\n\n# Source: vendor/fibocom.sh:1422, vendor/fibocom.sh:1454, vendor/fibocom.sh:1488, vendor/foxconn.sh:577, vendor/foxconn.sh:633, vendor/huawei.sh:377, vendor/huawei.sh:509, vendor/huawei.sh:527, vendor/huawei.sh:552, vendor/meig.sh:565, vendor/meig.sh:580, vendor/meig.sh:607, vendor/quectel.sh:1664, vendor/quectel.sh:1684, vendor/quectel.sh:1717, vendor/simcom.sh:926, vendor/simcom.sh:948, vendor/simcom.sh:981\nmsgid \"Duplex Mode\"\nmsgstr \"双工模式\"\n\n# Source: vendor/fibocom.sh:1457, vendor/fibocom.sh:1491, vendor/foxconn.sh:580, vendor/foxconn.sh:636, vendor/huawei.sh:530, vendor/huawei.sh:555, vendor/neoway.sh:730, vendor/quectel.sh:1687, vendor/quectel.sh:1720, vendor/simcom.sh:951, vendor/simcom.sh:984\nmsgid \"E-UTRA Absolute Radio Frequency Channel Number\"\nmsgstr \"E-UTRA绝对射频信道号\"\n\n# Source: vendor/fibocom.sh:1518, vendor/huawei.sh:581, vendor/meig.sh:627, vendor/neoway.sh:760, vendor/quectel.sh:1745, vendor/simcom.sh:1005\n# Source: vendor/fibocom.sh:1518, vendor/huawei.sh:582, vendor/meig.sh:627, vendor/neoway.sh:760, vendor/quectel.sh:1745, vendor/simcom.sh:1005\nmsgid \"Ec/Io\"\nmsgstr \"Ec/Io\"\n\n# Source: vendor/fibocom.sh:1519, vendor/huawei.sh:582, vendor/quectel.sh:1746\n# Source: vendor/fibocom.sh:1519, vendor/huawei.sh:583, vendor/quectel.sh:1746\nmsgid \"Ec/No\"\nmsgstr \"Ec/No\"\n\n# Source: view/qmodem/network_config.js:67\nmsgid \"Enable\"\nmsgstr \"启用\"\n\n# Source: view/qmodem/network_config.js:118\nmsgid \"Enable Dial\"\nmsgstr \"启用拨号\"\n\n# Source: view/qmodem/network_config.js:31\nmsgid \"Enable Dial (Global)\"\nmsgstr \"启用拨号（全局）\"\n\n# Source: view/qmodem/settings.js:61\nmsgid \"Enable PCIe Scan\"\nmsgstr \"启用PCIe扫描\"\n\n# Source: view/qmodem/settings.js:65\nmsgid \"Enable USB Scan\"\nmsgstr \"启用USB扫描\"\n\n# Source: view/qmodem/sms.js:119, view/qmodem/sms_conversation.js:137\nmsgid \"Enable if SMS timestamps appear 8 hours ahead (e.g., UTC+8 local time parsed as UTC+0)\"\nmsgstr \"若短信时间戳显示提前8小时（例如UTC+8本地时间被解析为UTC+0），请启用\"\n\n# Source: view/qmodem/debug.js:151\nmsgid \"Enable to use Ubus AT daemon instead of direct serial port access\"\nmsgstr \"启用以使用Ubus AT守护进程而非直接串口访问\"\n\n# Source: view/qmodem/network_config.js:411, view/qmodem/settings.js:159\nmsgid \"Enabled\"\nmsgstr \"已启用\"\n\n# Source: view/qmodem/sms.js:443, view/qmodem/sms_conversation.js:248\nmsgid \"Encoding\"\nmsgstr \"编码\"\n\n# Source: vendor/huawei.sh:387\nmsgid \"Energy per Chip over Noise\"\nmsgstr \"每芯片能量与噪声比\"\n\n# Source: view/qmodem/config_advanced.js:534\nmsgid \"Enter exactly 15 digits\"\nmsgstr \"请输入恰好15位数字\"\n\n# Source: view/qmodem/sms.js:427\nmsgid \"Enter phone number\"\nmsgstr \"请输入电话号码\"\n\n# Source: view/qmodem/sms.js:438, view/qmodem/sms_conversation.js:239\nmsgid \"Enter your message here...\"\nmsgstr \"在此输入您的消息...\"\n\n# Source: view/qmodem/config_advanced.js:334, view/qmodem/config_advanced.js:473, view/qmodem/config_advanced.js:627\nmsgid \"Error\"\nmsgstr \"错误\"\n\n# Source: view/qmodem/debug.js:239\nmsgid \"Error loading AT configuration: %s\"\nmsgstr \"加载AT配置失败：%s\"\n\n# Source: view/qmodem/config_advanced.js:613\nmsgid \"Error loading IMEI\"\nmsgstr \"加载IMEI失败\"\n\n# Source: view/qmodem/config_advanced.js:628\nmsgid \"Error loading IMEI: %s\"\nmsgstr \"加载IMEI失败：%s\"\n\n# Source: view/qmodem/sms.js:265\nmsgid \"Error loading SMS: \"\nmsgstr \"加载短信失败：\"\n\n# Source: view/qmodem/config_advanced.js:71\nmsgid \"Error loading features: %s\"\nmsgstr \"加载功能失败：%s\"\n\n# Source: view/qmodem/config_advanced.js:1301\nmsgid \"Error loading lock band configuration:\"\nmsgstr \"加载锁定频段配置失败：\"\n\n# Source: view/qmodem/sms_conversation.js:409\nmsgid \"Error loading messages: \"\nmsgstr \"加载消息失败：\"\n\n# Source: view/qmodem/config_advanced.js:284\nmsgid \"Error loading mode\"\nmsgstr \"加载模式失败\"\n\n# Source: view/qmodem/config_advanced.js:336\nmsgid \"Error loading mode: %s\"\nmsgstr \"加载模式失败：%s\"\n\n# Source: view/qmodem/overview.js:314\nmsgid \"Error loading modem information: %s\"\nmsgstr \"加载调制解调器信息失败：%s\"\n\n# Source: view/qmodem/config_advanced.js:475\nmsgid \"Error loading network preference: %s\"\nmsgstr \"加载网络优先级失败：%s\"\n\n# Source: view/qmodem/config_advanced.js:423\nmsgid \"Error loading preference\"\nmsgstr \"加载优先级失败\"\n\n# Source: view/qmodem/config_advanced.js:1476\nmsgid \"Error loading reboot capabilities: %s\"\nmsgstr \"加载重启能力失败：%s\"\n\n# Source: view/qmodem/config_advanced.js:1022\nmsgid \"Error loading status\"\nmsgstr \"加载状态失败\"\n\n# Source: view/qmodem/config_advanced.js:939\nmsgid \"Error scanning neighbor cells: %s\"\nmsgstr \"扫描邻区小区失败：%s\"\n\n# Source: view/qmodem/network_config.js:244, view/qmodem/network_config.js:258, view/qmodem/network_config.js:280, view/qmodem/network_config.js:357, view/qmodem/network_config.js:431, view/qmodem/network_config.js:519, view/qmodem/network_config.js:576\nmsgid \"Error: \"\nmsgstr \"错误：\"\n\n# Source: view/qmodem/config_advanced.js:265, view/qmodem/config_advanced.js:404, view/qmodem/config_advanced.js:582, view/qmodem/config_advanced.js:823, view/qmodem/config_advanced.js:1281, view/qmodem/config_advanced.js:1407, view/qmodem/config_advanced.js:1444, view/qmodem/debug.js:205\nmsgid \"Error: %s\"\nmsgstr \"错误：%s\"\n\n# Source: view/qmodem/debug.js:187\nmsgid \"Error: Please enter AT command\"\nmsgstr \"错误：请输入AT命令\"\n\n# Source: view/qmodem/network_config.js:186\nmsgid \"Extend Prefix\"\nmsgstr \"扩展前缀\"\n\n# Source: view/qmodem/sms_conversation.js:516\nmsgid \"Failed\"\nmsgstr \"失败\"\n\n# Source: view/qmodem/config_advanced.js:1276\nmsgid \"Failed to apply lock band configuration\"\nmsgstr \"应用锁定频段配置失败\"\n\n# Source: view/qmodem/config_advanced.js:818\nmsgid \"Failed to apply lock cell configuration\"\nmsgstr \"应用锁定小区配置失败\"\n\n# Source: view/qmodem/network_config.js:572\nmsgid \"Failed to clear log\"\nmsgstr \"清除日志失败\"\n\n# Source: view/qmodem/sms_conversation.js:572, view/qmodem/sms_conversation.js:583\nmsgid \"Failed to delete SMS: \"\nmsgstr \"删除短信失败：\"\n\n# Source: view/qmodem/network_config.js:547\nmsgid \"Failed to download log: \"\nmsgstr \"下载日志失败：\"\n\n# Source: view/qmodem/config_advanced.js:1439\nmsgid \"Failed to initiate hard reboot\"\nmsgstr \"启动硬重启失败\"\n\n# Source: view/qmodem/config_advanced.js:1402\nmsgid \"Failed to initiate soft reboot\"\nmsgstr \"启动软重启失败\"\n\n# Source: view/qmodem/debug.js:90\nmsgid \"Failed to load AT configuration\"\nmsgstr \"加载AT配置失败\"\n\n# Source: view/qmodem/sms.js:276\nmsgid \"Failed to load SMS: \"\nmsgstr \"加载短信失败：\"\n\n# Source: view/qmodem/config_advanced.js:285\nmsgid \"Failed to load available modes\"\nmsgstr \"加载可用模式失败\"\n\n# Source: view/qmodem/network_config.js:511\nmsgid \"Failed to load log\"\nmsgstr \"加载日志失败\"\n\n# Source: view/qmodem/sms_conversation.js:420\nmsgid \"Failed to load messages: \"\nmsgstr \"加载消息失败：\"\n\n# Source: view/qmodem/config_advanced.js:424\nmsgid \"Failed to load network preferences\"\nmsgstr \"加载网络优先级失败\"\n\n# Source: view/qmodem/config_advanced.js:1365\nmsgid \"Failed to load reboot capabilities\"\nmsgstr \"加载重启能力失败\"\n\n# Source: view/qmodem/network_config.js:423\nmsgid \"Failed to load status\"\nmsgstr \"加载状态失败\"\n\n# Source: view/qmodem/sms.js:582\nmsgid \"Failed to save configuration: \"\nmsgstr \"保存配置失败：\"\n\n# Source: view/qmodem/sms_conversation.js:515\nmsgid \"Failed to send\"\nmsgstr \"发送失败\"\n\n# Source: view/qmodem/sms.js:507, view/qmodem/sms.js:520, view/qmodem/sms_conversation.js:345, view/qmodem/sms_conversation.js:361\nmsgid \"Failed to send SMS: \"\nmsgstr \"发送短信失败：\"\n\n# Source: view/qmodem/network_config.js:277\nmsgid \"Failed to send dial command\"\nmsgstr \"发送拨号命令失败\"\n\n# Source: view/qmodem/network_config.js:241\nmsgid \"Failed to send hang command\"\nmsgstr \"发送挂断命令失败\"\n\n# Source: view/qmodem/network_config.js:255\nmsgid \"Failed to send redial command\"\nmsgstr \"发送重拨命令失败\"\n\n# Source: view/qmodem/config_advanced.js:577\nmsgid \"Failed to set IMEI\"\nmsgstr \"设置IMEI失败\"\n\n# Source: view/qmodem/config_advanced.js:260\nmsgid \"Failed to set mode\"\nmsgstr \"设置模式失败\"\n\n# Source: view/qmodem/config_advanced.js:399\nmsgid \"Failed to set network preference\"\nmsgstr \"设置网络优先级失败\"\n\n# Source: view/qmodem/network_config.js:63\nmsgid \"Failed to start QModem Network: \"\nmsgstr \"启动QModem网络失败：\"\n\n# Source: view/qmodem/network_config.js:84\nmsgid \"Failed to stop QModem Network: \"\nmsgstr \"停止QModem网络失败：\"\n\n# Source: view/qmodem/settings.js:221\nmsgid \"For 5G modules using the Ethernet PHY connection, please specify the network interface name (e.g., eth0, eth1)\"\nmsgstr \"对于使用以太网PHY连接的5G模块，请指定网络接口名称（例如eth0、eth1）\"\n\n# Source: view/qmodem/settings.js:225\nmsgid \"For M.2 slots with both PCIe and USB support, specify the associated USB port (for ttyUSB access)\"\nmsgstr \"对于同时支持PCIe和USB的M.2插槽，请指定关联的USB端口（用于ttyUSB访问）\"\n\n# Source: vendor/fibocom.sh:1458, vendor/fibocom.sh:1492, vendor/foxconn.sh:581, vendor/foxconn.sh:637, vendor/huawei.sh:531, vendor/huawei.sh:556, vendor/quectel.sh:1688, vendor/quectel.sh:1721, vendor/simcom.sh:952, vendor/simcom.sh:985\nmsgid \"Freq band indicator\"\nmsgstr \"频段指示器\"\n\n# Source: qmodem/sms.js:222\nmsgid \"Friday\"\nmsgstr \"星期五\"\n\n# Source: view/qmodem/settings.js:134\nmsgid \"Full scan completed successfully\"\nmsgstr \"全扫描完成\"\n\n# Source: view/qmodem/settings.js:143\nmsgid \"Full scan error: \"\nmsgstr \"全扫描错误：\"\n\n# Source: view/qmodem/settings.js:136\nmsgid \"Full scan failed\"\nmsgstr \"全扫描失败\"\n\n# Source: view/qmodem/settings.js:233\nmsgid \"GPIO Down Value\"\nmsgstr \"GPIO低电平值\"\n\n# Source: view/qmodem/settings.js:237\nmsgid \"GPIO Up Value\"\nmsgstr \"GPIO高电平值\"\n\n# Source: view/qmodem/settings.js:230\nmsgid \"GPIO pin for power control\"\nmsgstr \"电源控制GPIO引脚\"\n\n# Source: view/qmodem/network_config.js:29\nmsgid \"Global Configuration\"\nmsgstr \"全局配置\"\n\n# Source: view/qmodem/network_config.js:247\nmsgid \"Hang\"\nmsgstr \"挂断\"\n\n# Source: view/qmodem/network_config.js:235\nmsgid \"Hang command sent successfully\"\nmsgstr \"挂断命令发送成功\"\n\n# Source: view/qmodem/config_advanced.js:1436, view/qmodem/config_advanced.js:1441, view/qmodem/config_advanced.js:1446, view/qmodem/config_advanced.js:1449, view/qmodem/config_advanced.js:1466\nmsgid \"Hard Reboot\"\nmsgstr \"硬重启\"\n\n# Source: view/qmodem/config_advanced.js:1433\nmsgid \"Hard reboot initiated successfully. The modem is restarting...\"\nmsgstr \"硬重启已启动。调制解调器正在重启...\"\n\n# Source: view/qmodem/config_advanced.js:482\nmsgid \"IMEI Configuration\"\nmsgstr \"IMEI配置\"\n\n# Source: view/qmodem/config_advanced.js:554\nmsgid \"IMEI must be exactly 15 digits\"\nmsgstr \"IMEI必须为恰好15位数字\"\n\n# Source: view/qmodem/config_advanced.js:559\nmsgid \"IMEI must contain only numbers\"\nmsgstr \"IMEI只能包含数字\"\n\n# Source: view/qmodem/config_advanced.js:573\nmsgid \"IMEI set successfully. Please reboot the modem for changes to take effect.\"\nmsgstr \"IMEI设置成功。请重启调制解调器使更改生效。\"\n\n# Source: view/qmodem/network_config.js:180\n# Source: view/qmodem/network_config.js:339\nmsgid \"IPv4\"\nmsgstr \"IPv4\"\n\n# Source: view/qmodem/network_config.js:182\n# Source: view/qmodem/network_config.js:341\nmsgid \"IPv4/IPv6\"\nmsgstr \"IPv4/IPv6\"\n\n# Source: view/qmodem/network_config.js:181\n# Source: view/qmodem/network_config.js:340\nmsgid \"IPv6\"\nmsgstr \"IPv6\"\n\n# Source: view/qmodem/settings.js:58\nmsgid \"If enabled, the modem auto scan will be blocked.\"\nmsgstr \"启用后，将阻止调制解调器自动扫描。\"\n\n# Source: view/qmodem/settings.js:48\nmsgid \"If enabled, using alternative AT Tools\"\nmsgstr \"启用后，使用备用AT工具\"\n\n# Source: view/qmodem/sms_conversation.js:506\nmsgid \"Incomplete (part \"\nmsgstr \"不完整（第\"\n\n# Source: vendor/huawei.sh:403\nmsgid \"Information\"\nmsgstr \"信息\"\n\n# Source: vendor/fibocom.sh:507, vendor/fibocom.sh:521, vendor/foxconn.sh:276, vendor/foxconn.sh:290, vendor/meig.sh:288, vendor/meig.sh:302, vendor/neoway.sh:218, vendor/neoway.sh:232, vendor/quectel.sh:426, vendor/quectel.sh:440, vendor/simcom.sh:307, vendor/simcom.sh:321, vendor/telit.sh:223, vendor/telit.sh:237\nmsgid \"Integrate Circuit Card Identity\"\nmsgstr \"集成电路卡标识\"\n\n# Source: vendor/fibocom.sh:505, vendor/fibocom.sh:511, vendor/fibocom.sh:519, vendor/foxconn.sh:274, vendor/foxconn.sh:280, vendor/foxconn.sh:288, vendor/huawei.sh:258, vendor/meig.sh:286, vendor/meig.sh:292, vendor/meig.sh:300, vendor/neoway.sh:216, vendor/neoway.sh:222, vendor/neoway.sh:230, vendor/quectel.sh:424, vendor/quectel.sh:430, vendor/quectel.sh:438, vendor/simcom.sh:305, vendor/simcom.sh:311, vendor/simcom.sh:319, vendor/telit.sh:221, vendor/telit.sh:227, vendor/telit.sh:235\nmsgid \"International Mobile Equipment Identity\"\nmsgstr \"国际移动设备识别码\"\n\n# Source: vendor/fibocom.sh:506, vendor/fibocom.sh:520, vendor/foxconn.sh:275, vendor/foxconn.sh:289, vendor/huawei.sh:259, vendor/meig.sh:287, vendor/meig.sh:301, vendor/neoway.sh:217, vendor/neoway.sh:231, vendor/quectel.sh:425, vendor/quectel.sh:439, vendor/simcom.sh:306, vendor/simcom.sh:320, vendor/telit.sh:222, vendor/telit.sh:236\nmsgid \"International Mobile Subscriber Identity\"\nmsgstr \"国际移动用户识别码\"\n\n# Source: vendor/fibocom.sh:502, vendor/foxconn.sh:271, vendor/meig.sh:283, vendor/neoway.sh:213, vendor/quectel.sh:421, vendor/simcom.sh:302, vendor/telit.sh:219\nmsgid \"Internet Service Provider\"\nmsgstr \"互联网服务提供商\"\n\n# Source: view/qmodem/sms_conversation.js:64\nmsgid \"Invalid contact\"\nmsgstr \"无效联系人\"\n\n# Source: view/qmodem/config_advanced.js:1089\nmsgid \"Invalid lockband data structure\"\nmsgstr \"无效的锁定频段数据结构\"\n\n# Source: view/qmodem/settings.js:213\nmsgid \"LED indicator for SIM card status\"\nmsgstr \"SIM卡状态LED指示灯\"\n\n# Source: view/qmodem/settings.js:217\nmsgid \"LED indicator for network connection status\"\nmsgstr \"网络连接状态LED指示灯\"\n\n# Source: vendor/huawei.sh:392\nmsgid \"LTE Band\"\nmsgstr \"LTE频段\"\n\n# Source: view/qmodem/config_advanced.js:885\nmsgid \"LTE Cells\"\nmsgstr \"LTE小区\"\n\n# Source: vendor/huawei.sh:393\nmsgid \"LTE DL\"\nmsgstr \"LTE下行\"\n\n# Source: vendor/huawei.sh:391\nmsgid \"LTE Information\"\nmsgstr \"LTE信息\"\n\n# Source: vendor/huawei.sh:394\nmsgid \"LTE UL\"\nmsgstr \"LTE上行\"\n\n# Source: view/qmodem/sms.js:333\nmsgid \"Last Message\"\nmsgstr \"最后一条消息\"\n\n# Source: view/qmodem/overview.js:309, view/qmodem/overview.js:360\nmsgid \"Last update\"\nmsgstr \"最后更新\"\n\n# Source: view/qmodem/sms.js:458, view/qmodem/sms_conversation.js:268\nmsgid \"Length\"\nmsgstr \"长度\"\n\n# Source: view/qmodem/config_advanced.js:224\nmsgid \"Loading available modes...\"\nmsgstr \"正在加载可用模式...\"\n\n# Source: view/qmodem/config_advanced.js:366\nmsgid \"Loading available networks...\"\nmsgstr \"正在加载可用网络...\"\n\n# Source: view/qmodem/config_advanced.js:1063\nmsgid \"Loading band configuration...\"\nmsgstr \"正在加载频段配置...\"\n\n# Source: view/qmodem/sms_conversation.js:175\nmsgid \"Loading messages...\"\nmsgstr \"正在加载消息...\"\n\n# Source: view/qmodem/overview.js:241\nmsgid \"Loading modem information...\"\nmsgstr \"正在加载调制解调器信息...\"\n\n# Source: view/qmodem/config_advanced.js:1350\nmsgid \"Loading reboot capabilities...\"\nmsgstr \"正在加载重启能力...\"\n\n# Source: view/qmodem/config_advanced.js:63, view/qmodem/config_advanced.js:212, view/qmodem/config_advanced.js:354, view/qmodem/config_advanced.js:496, view/qmodem/debug.js:83, view/qmodem/network_config.js:40, view/qmodem/network_config.js:175, view/qmodem/network_config.js:443, view/qmodem/sms.js:184, view/qmodem/sms.js:200, view/qmodem/sms.js:208, view/qmodem/sms.js:216, view/qmodem/sms.js:375, view/qmodem/sms.js:403, view/qmodem/sms_conversation.js:190, view/qmodem/sms_conversation.js:198, view/qmodem/sms_conversation.js:206, view/qmodem/sms_conversation.js:579\nmsgid \"Loading...\"\nmsgstr \"加载中...\"\n\n# Source: vendor/fibocom.sh:1511, vendor/huawei.sh:574, vendor/meig.sh:622, vendor/neoway.sh:751, vendor/quectel.sh:1738, vendor/simcom.sh:1000\nmsgid \"Location Area Code\"\nmsgstr \"位置区码\"\n\n# Source: view/qmodem/config_advanced.js:108\nmsgid \"Lock Band\"\nmsgstr \"锁定频段\"\n\n# Source: view/qmodem/config_advanced.js:1054\nmsgid \"Lock Band Configuration\"\nmsgstr \"锁定频段配置\"\n\n# Source: view/qmodem/config_advanced.js:692\nmsgid \"Lock Cell Settings\"\nmsgstr \"锁定小区设置\"\n\n# Source: view/qmodem/config_advanced.js:679\nmsgid \"Lock Cell Status\"\nmsgstr \"锁定小区状态\"\n\n# Source: view/qmodem/config_advanced.js:1272\nmsgid \"Lock band configuration applied for %s\"\nmsgstr \"已为%s应用锁定频段配置\"\n\n# Source: view/qmodem/config_advanced.js:814\nmsgid \"Lock cell configuration applied successfully\"\nmsgstr \"锁定小区配置已成功应用\"\n\n# Source: view/qmodem/config_advanced.js:1058\nmsgid \"Lock modem to specific frequency bands. Select bands for each network type (UMTS/LTE/NR).\"\nmsgstr \"将调制解调器锁定至特定频段。为每种网络类型（UMTS/LTE/NR）选择频段。\"\n\n# Source: view/qmodem/config_advanced.js:1164\nmsgid \"Locked Bands\"\nmsgstr \"锁定频段\"\n\n# Source: view/qmodem/network_config.js:565\nmsgid \"Log cleared successfully\"\nmsgstr \"日志已成功清除\"\n\n# Source: view/qmodem/network_config.js:542\nmsgid \"Log downloaded successfully\"\nmsgstr \"日志已成功下载\"\n\n# Source: vendor/fibocom.sh:430, vendor/foxconn.sh:305, vendor/gosuncn.sh:132, vendor/huawei.sh:276, vendor/meig.sh:236, vendor/neoway.sh:159, vendor/quectel.sh:361, vendor/sierra.sh:213, vendor/simcom.sh:243, vendor/telit.sh:162\nmsgid \"Manufacturer\"\nmsgstr \"制造商\"\n\n# Source: view/qmodem/sms.js:432, view/qmodem/sms_conversation.js:233\nmsgid \"Message\"\nmsgstr \"消息\"\n\n# Source: view/qmodem/sms_conversation.js:576\nmsgid \"Message deleted\"\nmsgstr \"消息已删除\"\n\n# Source: view/qmodem/sms.js:512, view/qmodem/sms_conversation.js:350\nmsgid \"Message sent successfully\"\nmsgstr \"消息发送成功\"\n\n# Source: vendor/fibocom.sh:1420, vendor/fibocom.sh:1452, vendor/fibocom.sh:1473, vendor/fibocom.sh:1486, vendor/fibocom.sh:1509, vendor/foxconn.sh:575, vendor/foxconn.sh:631, vendor/huawei.sh:375, vendor/huawei.sh:507, vendor/huawei.sh:525, vendor/huawei.sh:550, vendor/huawei.sh:572, vendor/meig.sh:563, vendor/meig.sh:578, vendor/meig.sh:593, vendor/meig.sh:605, vendor/meig.sh:620, vendor/neoway.sh:715, vendor/neoway.sh:726, vendor/neoway.sh:749, vendor/neoway.sh:772, vendor/quectel.sh:1662, vendor/quectel.sh:1682, vendor/quectel.sh:1703, vendor/quectel.sh:1715, vendor/quectel.sh:1736, vendor/simcom.sh:924, vendor/simcom.sh:946, vendor/simcom.sh:967, vendor/simcom.sh:979, vendor/simcom.sh:998\nmsgid \"Mobile Country Code\"\nmsgstr \"移动国家码\"\n\n# Source: vendor/fibocom.sh:1421, vendor/fibocom.sh:1453, vendor/fibocom.sh:1474, vendor/fibocom.sh:1487, vendor/fibocom.sh:1510, vendor/foxconn.sh:576, vendor/foxconn.sh:632, vendor/huawei.sh:376, vendor/huawei.sh:508, vendor/huawei.sh:526, vendor/huawei.sh:551, vendor/huawei.sh:573, vendor/meig.sh:564, vendor/meig.sh:579, vendor/meig.sh:594, vendor/meig.sh:606, vendor/meig.sh:621, vendor/neoway.sh:716, vendor/neoway.sh:727, vendor/neoway.sh:750, vendor/neoway.sh:773, vendor/quectel.sh:1663, vendor/quectel.sh:1683, vendor/quectel.sh:1704, vendor/quectel.sh:1716, vendor/quectel.sh:1737, vendor/simcom.sh:925, vendor/simcom.sh:947, vendor/simcom.sh:968, vendor/simcom.sh:980, vendor/simcom.sh:999\nmsgid \"Mobile Network Code\"\nmsgstr \"移动网络码\"\n\n# Source: view/qmodem/config_advanced.js:256\nmsgid \"Mode set successfully. Please reboot the modem.\"\nmsgstr \"模式设置成功。请重启调制解调器。\"\n\n# Source: vendor/gosuncn.sh:133\nmsgid \"Model\"\nmsgstr \"型号\"\n\n# Source: view/qmodem/settings.js:163\nmsgid \"Model Name\"\nmsgstr \"型号名称\"\n\n# Source: view/qmodem/network_config.js:129\nmsgid \"Modem Alias\"\nmsgstr \"调制解调器别名\"\n\n# Source: view/qmodem/settings.js:156\nmsgid \"Modem Device\"\nmsgstr \"调制解调器设备\"\n\n# Source: view/qmodem/settings.js:150\nmsgid \"Modem Devices\"\nmsgstr \"调制解调器设备\"\n\n# Source: view/qmodem/network_config.js:123\nmsgid \"Modem Model\"\nmsgstr \"调制解调器型号\"\n\n# Source: view/qmodem/config_advanced.js:27, view/qmodem/debug.js:27, view/qmodem/overview.js:334, view/qmodem/sms.js:65, view/qmodem/sms_conversation.js:83\nmsgid \"Modem Name\"\nmsgstr \"调制解调器名称\"\n\n# Source: generic.sh:385\nmsgid \"Modem Offline\"\nmsgstr \"调制解调器离线\"\n\n# Source: view/qmodem/settings.js:45\nmsgid \"Modem Probe Settings\"\nmsgstr \"调制解调器探测设置\"\n\n# Source: view/qmodem/settings.js:189\nmsgid \"Modem Slot Configuration\"\nmsgstr \"调制解调器插槽配置\"\n\n# Source: qmodem/sms.js:221\nmsgid \"Monday\"\nmsgstr \"星期一\"\n\n# Source: view/qmodem/sms_conversation.js:497\nmsgid \"Multi-part\"\nmsgstr \"多部分\"\n\n# Source: view/qmodem/config_advanced.js:910\nmsgid \"NR (5G) Cells\"\nmsgstr \"NR（5G）小区\"\n\n# Source: vendor/huawei.sh:404, view/qmodem/config_advanced.js:760\nmsgid \"NR Band\"\nmsgstr \"NR频段\"\n\n# Source: vendor/fibocom.sh:429, vendor/huawei.sh:275, vendor/meig.sh:235, vendor/neoway.sh:158, vendor/quectel.sh:360, vendor/sierra.sh:212, vendor/simcom.sh:242, vendor/telit.sh:161\nmsgid \"Name\"\nmsgstr \"名称\"\n\n# Source: view/qmodem/config_advanced.js:104\nmsgid \"Neighbor Cell\"\nmsgstr \"邻区小区\"\n\n# Source: view/qmodem/config_advanced.js:635\nmsgid \"Neighbor Cell / Lock Cell\"\nmsgstr \"邻区小区 / 锁定小区\"\n\n# Source: view/qmodem/config_advanced.js:649\nmsgid \"Neighbor Cell List\"\nmsgstr \"邻区小区列表\"\n\n# Source: view/qmodem/settings.js:216\nmsgid \"Network LED\"\nmsgstr \"网络LED\"\n\n# Source: vendor/fibocom.sh:1417, vendor/foxconn.sh:555, vendor/foxconn.sh:628, vendor/huawei.sh:373, vendor/huawei.sh:504, vendor/meig.sh:560, vendor/neoway.sh:711, vendor/quectel.sh:1659, vendor/simcom.sh:921, vendor/telit.sh:760\nmsgid \"Network Mode\"\nmsgstr \"网络模式\"\n\n# Source: view/qmodem/config_advanced.js:96\nmsgid \"Network Preference\"\nmsgstr \"网络优先级\"\n\n# Source: view/qmodem/config_advanced.js:343\nmsgid \"Network Preference Configuration\"\nmsgstr \"网络优先级配置\"\n\n# Source: vendor/fibocom.sh:576, vendor/foxconn.sh:323, vendor/meig.sh:381, vendor/neoway.sh:771, vendor/quectel.sh:505, vendor/simcom.sh:341, vendor/telit.sh:259\nmsgid \"Network Type\"\nmsgstr \"网络类型\"\n\n# Source: view/qmodem/config_advanced.js:395\nmsgid \"Network preference set successfully\"\nmsgstr \"网络优先级设置成功\"\n\n# Source: view/qmodem/sms.js:397, view/qmodem/sms.js:466\nmsgid \"New Conversation\"\nmsgstr \"新建会话\"\n\n# Source: view/qmodem/config_advanced.js:503\nmsgid \"New IMEI\"\nmsgstr \"新IMEI\"\n\n# Source: view/qmodem/network_config.js:411, view/qmodem/network_config.js:412\nmsgid \"No\"\nmsgstr \"否\"\n\n# Source: view/qmodem/config_advanced.js:1103\nmsgid \"No bands available for this modem\"\nmsgstr \"此调制解调器无可用频段\"\n\n# Source: view/qmodem/config_advanced.js:128\nmsgid \"No features available for this modem.\"\nmsgstr \"此调制解调器无可用功能。\"\n\n# Source: view/qmodem/network_config.js:502\nmsgid \"No log available\"\nmsgstr \"无日志可用\"\n\n# Source: view/qmodem/network_config.js:544\nmsgid \"No log content to download\"\nmsgstr \"无日志内容可下载\"\n\n# Source: view/qmodem/sms.js:319\nmsgid \"No messages found\"\nmsgstr \"未找到消息\"\n\n# Source: view/qmodem/sms_conversation.js:463\nmsgid \"No messages in this conversation\"\nmsgstr \"此会话中无消息\"\n\n# Source: view/qmodem/config_advanced.js:15, view/qmodem/debug.js:15\nmsgid \"No modem configured.\"\nmsgstr \"未配置调制解调器。\"\n\n# Source: view/qmodem/overview.js:324, view/qmodem/sms.js:56, view/qmodem/sms_conversation.js:73\nmsgid \"No modems configured or all modems are disabled.\"\nmsgstr \"未配置调制解调器或所有调制解调器均已禁用。\"\n\n# Source: view/qmodem/config_advanced.js:306\nmsgid \"No modes available\"\nmsgstr \"无可用模式\"\n\n# Source: view/qmodem/config_advanced.js:874\nmsgid \"No neighbor cells found. Make sure the modem has network signal.\"\nmsgstr \"未找到邻区小区。请确保调制解调器有网络信号。\"\n\n# Source: view/qmodem/config_advanced.js:445\nmsgid \"No network types available\"\nmsgstr \"无可用网络类型\"\n\n# Source: view/qmodem/config_advanced.js:1374\nmsgid \"No reboot methods available for this modem\"\nmsgstr \"此调制解调器无可用重启方法\"\n\n# Source: view/qmodem/debug.js:202\nmsgid \"No response received\"\nmsgstr \"未收到响应\"\n\n# Source: view/qmodem/config_advanced.js:1079\nmsgid \"No result returned from getLockBand\"\nmsgstr \"getLockBand未返回结果\"\n\n# Source: view/qmodem/config_advanced.js:856\nmsgid \"No result returned from neighbor cell scan\"\nmsgstr \"邻区小区扫描未返回结果\"\n\n# Source: view/qmodem/config_advanced.js:686, view/qmodem/config_advanced.js:1019\nmsgid \"No status information available\"\nmsgstr \"无状态信息可用\"\n\n# Source: vendor/nk.sh:10\nmsgid \"No.1\"\nmsgstr \"第1项\"\n\n# Source: vendor/nk.sh:11\nmsgid \"No.2\"\nmsgstr \"第2项\"\n\n# Source: vendor/nk.sh:12\nmsgid \"No.3\"\nmsgstr \"第3项\"\n\n# Source: vendor/nk.sh:13\nmsgid \"No.4\"\nmsgstr \"第4项\"\n\n# Source: vendor/nk.sh:14\nmsgid \"No.5\"\nmsgstr \"第5项\"\n\n# Source: vendor/nk.sh:15\nmsgid \"No.6\"\nmsgstr \"第6项\"\n\n# Source: view/qmodem/config_advanced.js:441\nmsgid \"None\"\nmsgstr \"无\"\n\n# Source: view/qmodem/config_advanced.js:1311\nmsgid \"None (All bands unlocked)\"\nmsgstr \"无（所有频段解锁）\"\n\n# Source: view/qmodem/config_advanced.js:618\nmsgid \"Not available\"\nmsgstr \"不可用\"\n\n# Source: view/qmodem/settings.js:62\nmsgid \"Once enabled, the PCIe ports will be scanned on every boot.\"\nmsgstr \"启用后，每次启动时都将扫描PCIe端口。\"\n\n# Source: view/qmodem/settings.js:66\nmsgid \"Once enabled, the USB ports will be scanned on every boot.\"\nmsgstr \"启用后，每次启动时都将扫描USB端口。\"\n\n# Source: view/qmodem/settings.js:181\nmsgid \"Override AT Port\"\nmsgstr \"覆盖AT端口\"\n\n# Source: view/qmodem/config_advanced.js:723\nmsgid \"PCI\"\nmsgstr \"PCI\"\n\n# Source: view/qmodem/config_advanced.js:800\nmsgid \"PCI and ARFCN are required\"\nmsgstr \"PCI和ARFCN为必填项\"\n\n# Source: view/qmodem/settings.js:196\n# Source: view/qmodem/settings.js:248\nmsgid \"PCIe\"\nmsgstr \"PCIe\"\n\n# Source: view/qmodem/settings.js:88\nmsgid \"PCIe scan completed successfully\"\nmsgstr \"PCIe扫描完成\"\n\n# Source: view/qmodem/settings.js:97\nmsgid \"PCIe scan error: \"\nmsgstr \"PCIe扫描错误：\"\n\n# Source: view/qmodem/settings.js:90\nmsgid \"PCIe scan failed\"\nmsgstr \"PCIe扫描失败\"\n\n# Source: view/qmodem/network_config.js:179\nmsgid \"PDP Type\"\nmsgstr \"PDP类型\"\n\n# Source: view/qmodem/sms.js:85, view/qmodem/sms_conversation.js:103\nmsgid \"Parse received SMS time as UTC+0\"\nmsgstr \"将接收短信时间解析为UTC+0\"\n\n# Source: view/qmodem/sms.js:106, view/qmodem/sms_conversation.js:124\nmsgid \"Parse sent SMS time as UTC+0\"\nmsgstr \"将发送短信时间解析为UTC+0\"\n\n# Source: view/qmodem/sms.js:145\nmsgid \"Path to SMS database file\"\nmsgstr \"短信数据库文件路径\"\n\n# Source: view/qmodem/sms.js:421\nmsgid \"Phone Number\"\nmsgstr \"电话号码\"\n\n# Source: vendor/fibocom.sh:1427, vendor/fibocom.sh:1438, vendor/fibocom.sh:1456, vendor/fibocom.sh:1475, vendor/fibocom.sh:1490, vendor/foxconn.sh:579, vendor/foxconn.sh:635, vendor/huawei.sh:379, vendor/huawei.sh:511, vendor/huawei.sh:529, vendor/huawei.sh:554, vendor/meig.sh:567, vendor/meig.sh:582, vendor/meig.sh:595, vendor/meig.sh:609, vendor/neoway.sh:718, vendor/neoway.sh:729, vendor/quectel.sh:1666, vendor/quectel.sh:1686, vendor/quectel.sh:1705, vendor/quectel.sh:1719, vendor/simcom.sh:928, vendor/simcom.sh:950, vendor/simcom.sh:969, vendor/simcom.sh:983, vendor/telit.sh:764, view/qmodem/config_advanced.js:729\nmsgid \"Physical Cell ID\"\nmsgstr \"物理小区ID\"\n\n# Source: vendor/fibocom.sh:1520, vendor/huawei.sh:583, vendor/neoway.sh:763, vendor/quectel.sh:1747\nmsgid \"Physical Channel\"\nmsgstr \"物理信道\"\n\n# Source: view/qmodem/settings.js:200\nmsgid \"Physical slot identifier (e.g., 1-1.4, 0000:01:00.0)\"\nmsgstr \"物理插槽标识符（例如1-1.4、0000:01:00.0）\"\n\n# Source: view/qmodem/config_advanced.js:1304\nmsgid \"Please check browser console for more details\"\nmsgstr \"请查看浏览器控制台以获取更多详情\"\n\n# Source: view/qmodem/sms.js:494, view/qmodem/sms_conversation.js:332\nmsgid \"Please enter a message\"\nmsgstr \"请输入消息\"\n\n# Source: view/qmodem/sms.js:489\nmsgid \"Please enter a phone number\"\nmsgstr \"请输入电话号码\"\n\n# Source: view/qmodem/config_advanced.js:247\nmsgid \"Please select a mode\"\nmsgstr \"请选择模式\"\n\n# Source: view/qmodem/config_advanced.js:386\nmsgid \"Please select at least one network type\"\nmsgstr \"请选择至少一种网络类型\"\n\n# Source: view/qmodem/settings.js:229\nmsgid \"Power GPIO\"\nmsgstr \"电源GPIO\"\n\n# Source: view/qmodem/config_advanced.js:1467\nmsgid \"Power cycles the modem completely. Takes longer but ensures a full restart.\"\nmsgstr \"完全断电重启调制解调器。耗时较长，但确保完全重启。\"\n\n# Source: vendor/fibocom.sh:1514, vendor/huawei.sh:577, vendor/meig.sh:624, vendor/neoway.sh:754, vendor/quectel.sh:1741, vendor/simcom.sh:1003\nmsgid \"Primary Scrambling Code\"\nmsgstr \"主扰码\"\n\n# Source: view/qmodem/network_config.js:26\nmsgid \"QModem Configuration\"\nmsgstr \"QModem配置\"\n\n# Source: view/qmodem/network_config.js:36\nmsgid \"QModem Network\"\nmsgstr \"QModem网络\"\n\n# Source: view/qmodem/network_config.js:59\nmsgid \"QModem Network started successfully\"\nmsgstr \"QModem网络已成功启动\"\n\n# Source: view/qmodem/network_config.js:80\nmsgid \"QModem Network stopped successfully\"\nmsgstr \"QModem网络已成功停止\"\n\n# Source: view/qmodem/settings.js:40\n# Source: view/qmodem/settings.js\nmsgid \"QModem Settings\"\nmsgstr \"QModem 设置\"\n\n# Source: view/qmodem/debug.js:220\nmsgid \"Quick Commands\"\nmsgstr \"快速命令\"\n\n# Source: view/qmodem/config_advanced.js:703, view/qmodem/config_advanced.js:891, view/qmodem/config_advanced.js:916\nmsgid \"RAT\"\nmsgstr \"无线接入技术\"\n\n# Source: vendor/neoway.sh:733, vendor/neoway.sh:757\nmsgid \"RX Power (dBm)\"\nmsgstr \"接收功率（dBm）\"\n\n# Source: vendor/gosuncn.sh:142\nmsgid \"Radio Access Technology\"\nmsgstr \"无线接入技术\"\n\n# Source: vendor/fibocom.sh:1468, vendor/fibocom.sh:1502, vendor/foxconn.sh:590, vendor/huawei.sh:543, vendor/huawei.sh:565, vendor/quectel.sh:1698, vendor/quectel.sh:1730, vendor/simcom.sh:962\nmsgid \"Radio Signal Strength Noise Ratio\"\nmsgstr \"无线信号强度噪声比\"\n\n# Source: view/qmodem/network_config.js:261\nmsgid \"ReDial\"\nmsgstr \"重拨\"\n\n# Source: view/qmodem/config_advanced.js:112, view/qmodem/config_advanced.js:1336\nmsgid \"Reboot Modem\"\nmsgstr \"重启调制解调器\"\n\n# Source: view/qmodem/config_advanced.js:1345\nmsgid \"Reboot Options\"\nmsgstr \"重启选项\"\n\n# Source: view/qmodem/config_advanced.js:1340\nmsgid \"Reboot the modem device. Soft reboot restarts the modem firmware, hard reboot power cycles the modem.\"\nmsgstr \"重启调制解调器设备。软重启重启固件，硬重启断电重启。\"\n\n# Source: view/qmodem/config_advanced.js:1392, view/qmodem/config_advanced.js:1429\nmsgid \"Rebooting...\"\nmsgstr \"重启中...\"\n\n# Source: generic.sh:103\nmsgid \"Receive Rate\"\nmsgstr \"接收速率\"\n\n# Source: vendor/fibocom.sh:1517, vendor/huawei.sh:386, vendor/huawei.sh:580, vendor/meig.sh:626, vendor/neoway.sh:759, vendor/quectel.sh:1744, vendor/simcom.sh:1004\nmsgid \"Received Signal Code Power\"\nmsgstr \"接收信号码功率\"\n\n# Source: vendor/fibocom.sh:1446, vendor/fibocom.sh:1467, vendor/fibocom.sh:1501, vendor/foxconn.sh:589, vendor/huawei.sh:389, vendor/huawei.sh:399, vendor/huawei.sh:519, vendor/huawei.sh:542, vendor/huawei.sh:564, vendor/quectel.sh:1675, vendor/quectel.sh:1697, vendor/quectel.sh:1729, vendor/simcom.sh:940, vendor/simcom.sh:961, vendor/simcom.sh:1007\nmsgid \"Received Signal Level\"\nmsgstr \"接收信号电平\"\n\n# Source: vendor/fibocom.sh:1465, vendor/fibocom.sh:1499, vendor/foxconn.sh:587, vendor/huawei.sh:562, vendor/neoway.sh:738, vendor/quectel.sh:1695, vendor/quectel.sh:1727, vendor/simcom.sh:938, vendor/simcom.sh:959, vendor/simcom.sh:991, vendor/telit.sh:770\nmsgid \"Received Signal Strength Indicator\"\nmsgstr \"接收信号强度指示\"\n\n# Source: view/qmodem/network_config.js:253\nmsgid \"Redial command sent successfully\"\nmsgstr \"重拨命令发送成功\"\n\n# Source: vendor/fibocom.sh:1443, vendor/fibocom.sh:1463, vendor/fibocom.sh:1479, vendor/fibocom.sh:1497, vendor/foxconn.sh:640, vendor/huawei.sh:396, vendor/huawei.sh:407, vendor/huawei.sh:411, vendor/huawei.sh:516, vendor/huawei.sh:539, vendor/huawei.sh:545, vendor/meig.sh:571, vendor/meig.sh:587, vendor/meig.sh:598, vendor/meig.sh:614, vendor/neoway.sh:721, vendor/neoway.sh:735, vendor/quectel.sh:1672, vendor/quectel.sh:1693, vendor/quectel.sh:1709, vendor/simcom.sh:936, vendor/simcom.sh:957, vendor/simcom.sh:973, vendor/simcom.sh:989, vendor/telit.sh:768\nmsgid \"Reference Signal Received Power\"\nmsgstr \"参考信号接收功率\"\n\n# Source: vendor/fibocom.sh:1444, vendor/fibocom.sh:1464, vendor/fibocom.sh:1480, vendor/fibocom.sh:1498, vendor/foxconn.sh:586, vendor/foxconn.sh:639, vendor/huawei.sh:397, vendor/huawei.sh:408, vendor/huawei.sh:412, vendor/huawei.sh:517, vendor/huawei.sh:540, vendor/huawei.sh:546, vendor/huawei.sh:561, vendor/meig.sh:572, vendor/meig.sh:588, vendor/meig.sh:599, vendor/meig.sh:615, vendor/neoway.sh:722, vendor/neoway.sh:736, vendor/quectel.sh:1673, vendor/quectel.sh:1694, vendor/quectel.sh:1710, vendor/quectel.sh:1726, vendor/simcom.sh:937, vendor/simcom.sh:958, vendor/simcom.sh:974, vendor/simcom.sh:990, vendor/telit.sh:769\nmsgid \"Reference Signal Received Quality\"\nmsgstr \"参考信号接收质量\"\n\n# Source: view/qmodem/sms.js:407\nmsgid \"Refresh\"\nmsgstr \"刷新\"\n\n# Source: view/qmodem/debug.js:171\nmsgid \"Response\"\nmsgstr \"响应\"\n\n# Source: view/qmodem/config_advanced.js:1460\nmsgid \"Restarts the modem firmware without power cycling. Faster but may not resolve all issues.\"\nmsgstr \"重启调制解调器固件而不断电。更快，但可能无法解决所有问题。\"\n\n# Source: vendor/fibocom.sh:431, vendor/foxconn.sh:306, vendor/gosuncn.sh:134, vendor/huawei.sh:277, vendor/meig.sh:237, vendor/neoway.sh:160, vendor/quectel.sh:362, vendor/sierra.sh:214, vendor/simcom.sh:244, vendor/telit.sh:163\nmsgid \"Revision\"\nmsgstr \"版本\"\n\n# Source: vendor/fibocom.sh:1515, vendor/huawei.sh:578, vendor/neoway.sh:755, vendor/quectel.sh:1742\nmsgid \"Routing Area Code\"\nmsgstr \"路由区码\"\n\n# Source: view/qmodem/network_config.js:412\nmsgid \"Running\"\nmsgstr \"运行中\"\n\n# Source: vendor/fibocom.sh:1525, vendor/huawei.sh:588, vendor/quectel.sh:1752\nmsgid \"RxLev\"\nmsgstr \"接收电平\"\n\n# Source: vendor/fibocom.sh:1447, vendor/fibocom.sh:1482, vendor/huawei.sh:520, vendor/meig.sh:574, vendor/meig.sh:601, vendor/quectel.sh:1676, vendor/quectel.sh:1712, vendor/simcom.sh:941, vendor/simcom.sh:976, view/qmodem/config_advanced.js:771\nmsgid \"SCS\"\nmsgstr \"子载波间隔\"\n\n# Source: generic.sh:384\nmsgid \"SIM Error,Error code:\"\nmsgstr \"SIM错误，错误代码：\"\n\n# Source: view/qmodem/settings.js:212\nmsgid \"SIM LED\"\nmsgstr \"SIM卡LED\"\n\n# Source: vendor/fibocom.sh:504, vendor/foxconn.sh:273, vendor/huawei.sh:257, vendor/meig.sh:285, vendor/neoway.sh:215, vendor/quectel.sh:423, vendor/simcom.sh:304\nmsgid \"SIM Number\"\nmsgstr \"SIM卡号\"\n\n# Source: vendor/fibocom.sh:503, vendor/fibocom.sh:518, vendor/foxconn.sh:272, vendor/foxconn.sh:287, vendor/gosuncn.sh:124, vendor/huawei.sh:256, vendor/meig.sh:284, vendor/meig.sh:299, vendor/neoway.sh:214, vendor/neoway.sh:229, vendor/quectel.sh:422, vendor/quectel.sh:437, vendor/sierra.sh:196, vendor/simcom.sh:303, vendor/simcom.sh:318, vendor/telit.sh:220, vendor/telit.sh:234\nmsgid \"SIM Slot\"\nmsgstr \"SIM卡插槽\"\n\n# Source: vendor/fibocom.sh:501, vendor/fibocom.sh:510, vendor/fibocom.sh:514, vendor/fibocom.sh:517, vendor/foxconn.sh:270, vendor/foxconn.sh:279, vendor/foxconn.sh:283, vendor/foxconn.sh:286, vendor/gosuncn.sh:123, vendor/huawei.sh:255, vendor/meig.sh:282, vendor/meig.sh:291, vendor/meig.sh:295, vendor/meig.sh:298, vendor/neoway.sh:212, vendor/neoway.sh:221, vendor/neoway.sh:225, vendor/neoway.sh:228, vendor/quectel.sh:420, vendor/quectel.sh:429, vendor/quectel.sh:433, vendor/quectel.sh:436, vendor/sierra.sh:195, vendor/simcom.sh:301, vendor/simcom.sh:310, vendor/simcom.sh:314, vendor/simcom.sh:317, vendor/telit.sh:218, vendor/telit.sh:226, vendor/telit.sh:230, vendor/telit.sh:233\nmsgid \"SIM Status\"\nmsgstr \"SIM卡状态\"\n\n# Source: view/qmodem/settings.js:178\nmsgid \"SMS AT Port\"\nmsgstr \"短信AT端口\"\n\n# Source: view/qmodem/sms_conversation.js:62\n# Source: view/qmodem/sms_conversation.js\nmsgid \"SMS Conversation\"\nmsgstr \"短信对话\"\n\n# Source: view/qmodem/sms.js:132\nmsgid \"SMS Database Path\"\nmsgstr \"短信数据库路径\"\n\n# Source: view/qmodem/sms.js:171\n# Source: view/qmodem/sms.js\nmsgid \"SMS Messages\"\nmsgstr \"短信消息\"\n\n# Source: qmodem/sms.js:222\nmsgid \"Saturday\"\nmsgstr \"星期六\"\n\n# Source: view/qmodem/settings.js:124\nmsgid \"Scan ALL Manually\"\nmsgstr \"手动全扫描\"\n\n# Source: view/qmodem/config_advanced.js:663, view/qmodem/config_advanced.js:858, view/qmodem/config_advanced.js:876, view/qmodem/config_advanced.js:934, view/qmodem/config_advanced.js:941\nmsgid \"Scan Neighbor Cells\"\nmsgstr \"扫描邻区小区\"\n\n# Source: view/qmodem/settings.js:78\nmsgid \"Scan PCIe Manually\"\nmsgstr \"手动扫描PCIe\"\n\n# Source: view/qmodem/settings.js:101\nmsgid \"Scan USB Manually\"\nmsgstr \"手动扫描USB\"\n\n# Source: view/qmodem/config_advanced.js:639\nmsgid \"Scan neighboring cell towers and lock modem to specific cell. You can scan for nearby cells and then lock to a specific cell by copying its parameters.\"\nmsgstr \"扫描邻区基站并将调制解调器锁定至特定小区。可扫描附近小区，然后通过复制其参数锁定至特定小区。\"\n\n# Source: view/qmodem/settings.js:81, view/qmodem/settings.js:104, view/qmodem/settings.js:127\nmsgid \"Scanning\"\nmsgstr \"扫描中\"\n\n# Source: view/qmodem/settings.js:82\nmsgid \"Scanning PCIe ports, please wait...\"\nmsgstr \"正在扫描PCIe端口，请稍候...\"\n\n# Source: view/qmodem/settings.js:105\nmsgid \"Scanning USB ports, please wait...\"\nmsgstr \"正在扫描USB端口，请稍候...\"\n\n# Source: view/qmodem/settings.js:128\nmsgid \"Scanning all ports, please wait...\"\nmsgstr \"正在扫描所有端口，请稍候...\"\n\n# Source: view/qmodem/config_advanced.js:659\nmsgid \"Scanning neighbor cells...\"\nmsgstr \"正在扫描邻区小区...\"\n\n# Source: view/qmodem/config_advanced.js:658\nmsgid \"Scanning...\"\nmsgstr \"扫描中...\"\n\n# Source: view/qmodem/debug.js:122\nmsgid \"Select AT Port\"\nmsgstr \"选择AT端口\"\n\n# Source: view/qmodem/config_advanced.js:1254\nmsgid \"Select All / None\"\nmsgstr \"全选/全不选\"\n\n# Source: view/qmodem/config_advanced.js:1176\nmsgid \"Select Bands\"\nmsgstr \"选择频段\"\n\n# Source: view/qmodem/config_advanced.js:219\nmsgid \"Select Mode\"\nmsgstr \"选择模式\"\n\n# Source: view/qmodem/config_advanced.js:361\nmsgid \"Select Networks\"\nmsgstr \"选择网络\"\n\n# Source: view/qmodem/sms.js:523, view/qmodem/sms_conversation.js:306, view/qmodem/sms_conversation.js:342, view/qmodem/sms_conversation.js:360\nmsgid \"Send\"\nmsgstr \"发送\"\n\n# Source: view/qmodem/debug.js:208\nmsgid \"Send AT Command\"\nmsgstr \"发送AT命令\"\n\n# Source: view/qmodem/sms_conversation.js:228\nmsgid \"Send Message\"\nmsgstr \"发送消息\"\n\n# Source: view/qmodem/debug.js:191\nmsgid \"Sending command...\"\nmsgstr \"发送命令中...\"\n\n# Source: view/qmodem/sms.js:501\nmsgid \"Sending message...\"\nmsgstr \"发送消息中...\"\n\n# Source: view/qmodem/sms.js:501, view/qmodem/sms_conversation.js:338\nmsgid \"Sending...\"\nmsgstr \"发送中...\"\n\n# Source: vendor/fibocom.sh:1448, vendor/fibocom.sh:1471, vendor/fibocom.sh:1505, vendor/foxconn.sh:593, vendor/huawei.sh:521, vendor/huawei.sh:537, vendor/huawei.sh:568, vendor/neoway.sh:744, vendor/quectel.sh:1677, vendor/quectel.sh:1701, vendor/quectel.sh:1733, vendor/simcom.sh:942, vendor/simcom.sh:965, vendor/simcom.sh:995\nmsgid \"Serving Cell Receive Level\"\nmsgstr \"服务小区接收电平\"\n\n# Source: view/qmodem/config_advanced.js:100\nmsgid \"Set IMEI\"\nmsgstr \"设置IMEI\"\n\n# Source: view/qmodem/config_advanced.js:569\nmsgid \"Setting...\"\nmsgstr \"设置中...\"\n\n# Source: vendor/meig.sh:573, vendor/meig.sh:589, vendor/meig.sh:600, vendor/meig.sh:616, vendor/neoway.sh:723, vendor/neoway.sh:737\nmsgid \"Signal to Interference plus Noise Ratio\"\nmsgstr \"信号与干扰加噪声比\"\n\n# Source: vendor/fibocom.sh:1445, vendor/fibocom.sh:1466, vendor/fibocom.sh:1481, vendor/fibocom.sh:1500, vendor/foxconn.sh:588, vendor/foxconn.sh:641, vendor/huawei.sh:398, vendor/huawei.sh:409, vendor/huawei.sh:413, vendor/huawei.sh:518, vendor/huawei.sh:541, vendor/huawei.sh:547, vendor/huawei.sh:563, vendor/quectel.sh:1674, vendor/quectel.sh:1696, vendor/quectel.sh:1711, vendor/quectel.sh:1728, vendor/simcom.sh:939, vendor/simcom.sh:960, vendor/simcom.sh:975, vendor/simcom.sh:992, vendor/telit.sh:771\nmsgid \"Signal to Interference plus Noise Ratio Bandwidth\"\nmsgstr \"信号与干扰加噪声比带宽\"\n\n# Source: vendor/fibocom.sh:1522, vendor/huawei.sh:585, vendor/neoway.sh:765, vendor/quectel.sh:1749\nmsgid \"Slot\"\nmsgstr \"插槽\"\n\n# Source: view/qmodem/settings.js:199\nmsgid \"Slot ID\"\nmsgstr \"插槽ID\"\n\n# Source: view/qmodem/settings.js:194\nmsgid \"Slot Type\"\nmsgstr \"插槽类型\"\n\n# Source: view/qmodem/config_advanced.js:1399, view/qmodem/config_advanced.js:1404, view/qmodem/config_advanced.js:1409, view/qmodem/config_advanced.js:1412, view/qmodem/config_advanced.js:1459, view/qmodem/network_config.js:190\nmsgid \"Soft Reboot\"\nmsgstr \"软重启\"\n\n# Source: view/qmodem/config_advanced.js:1396\nmsgid \"Soft reboot initiated successfully. The modem is restarting...\"\nmsgstr \"软重启已启动。调制解调器正在重启...\"\n\n# Source: vendor/fibocom.sh:1523, vendor/huawei.sh:586, vendor/quectel.sh:1750\nmsgid \"Speech Code\"\nmsgstr \"语音编码\"\n\n# Source: vendor/fibocom.sh:1521, vendor/huawei.sh:584, vendor/neoway.sh:764, vendor/quectel.sh:1748\nmsgid \"Spreading Factor\"\nmsgstr \"扩频因子\"\n\n# Source: view/qmodem/network_config.js:103, view/qmodem/network_config.js:134\nmsgid \"Status\"\nmsgstr \"状态\"\n\n# Source: qmodem/sms.js:221\nmsgid \"Sunday\"\nmsgstr \"星期日\"\n\n# Source: vendor/fibocom.sh:1470, vendor/fibocom.sh:1504, vendor/foxconn.sh:592, vendor/foxconn.sh:642, vendor/huawei.sh:536, vendor/huawei.sh:567, vendor/meig.sh:590, vendor/meig.sh:617, vendor/quectel.sh:1700, vendor/quectel.sh:1732, vendor/simcom.sh:934, vendor/simcom.sh:964, vendor/simcom.sh:994, vendor/telit.sh:767\nmsgid \"TX Power\"\nmsgstr \"发射功率\"\n\n# Source: vendor/neoway.sh:734, vendor/neoway.sh:758\nmsgid \"TX Power (dBm)\"\nmsgstr \"发射功率（dBm）\"\n\n# Source: vendor/fibocom.sh:408, vendor/foxconn.sh:470, vendor/meig.sh:220, vendor/quectel.sh:338, vendor/sierra.sh:340, vendor/simcom.sh:220, vendor/telit.sh:144\nmsgid \"Temperature\"\nmsgstr \"温度\"\n\n# Source: view/qmodem/settings.js:208\nmsgid \"The first module loaded into this slot will automatically be assigned this default metric.\"\nmsgstr \"首次加载到此插槽的模块将自动分配此默认跃点数。\"\n\n# Source: qmodem/sms.js:222\nmsgid \"Thursday\"\nmsgstr \"星期四\"\n\n# Source: view/qmodem/sms.js:334\nmsgid \"Time\"\nmsgstr \"时间\"\n\n# Source: vendor/neoway.sh:732, vendor/telit.sh:765\nmsgid \"Tracking Area Code\"\nmsgstr \"跟踪区码\"\n\n# Source: vendor/meig.sh:568, vendor/meig.sh:583, vendor/meig.sh:610\nmsgid \"Tracking area code\"\nmsgstr \"跟踪区码\"\n\n# Source: vendor/fibocom.sh:1424, vendor/fibocom.sh:1462, vendor/fibocom.sh:1496, vendor/foxconn.sh:585, vendor/foxconn.sh:638, vendor/huawei.sh:380, vendor/huawei.sh:512, vendor/huawei.sh:538, vendor/huawei.sh:560, vendor/quectel.sh:1667, vendor/quectel.sh:1692, vendor/quectel.sh:1725, vendor/simcom.sh:929, vendor/simcom.sh:956, vendor/simcom.sh:988\nmsgid \"Tracking area code of cell served by neighbor Enb\"\nmsgstr \"邻近eNodeB服务小区的跟踪区码\"\n\n# Source: generic.sh:100\nmsgid \"Transmit Rate\"\nmsgstr \"发送速率\"\n\n# Source: view/qmodem/settings.js:73\nmsgid \"Try Preset PCIe Port\"\nmsgstr \"尝试预设PCIe端口\"\n\n# Source: view/qmodem/settings.js:69\nmsgid \"Try Preset USB Port\"\nmsgstr \"尝试预设USB端口\"\n\n# Source: qmodem/sms.js:221\nmsgid \"Tuesday\"\nmsgstr \"星期二\"\n\n# Source: vendor/simcom.sh:1006\nmsgid \"Tx Power\"\nmsgstr \"发射功率\"\n\n# Source: vendor/huawei.sh:406\nmsgid \"UL\"\nmsgstr \"上行\"\n\n# Source: vendor/fibocom.sh:1431, vendor/fibocom.sh:1434, vendor/fibocom.sh:1441, vendor/fibocom.sh:1460, vendor/fibocom.sh:1494, vendor/foxconn.sh:583, vendor/huawei.sh:533, vendor/huawei.sh:558, vendor/meig.sh:585, vendor/meig.sh:612, vendor/neoway.sh:743, vendor/quectel.sh:1671, vendor/quectel.sh:1691, vendor/quectel.sh:1724, vendor/simcom.sh:954, vendor/simcom.sh:986\nmsgid \"UL Bandwidth\"\nmsgstr \"上行带宽\"\n\n# Source: vendor/fibocom.sh:1432\nmsgid \"UL CA\"\nmsgstr \"上行载波聚合\"\n\n# Source: view/qmodem/settings.js:195\n# Source: view/qmodem/settings.js:247\nmsgid \"USB\"\nmsgstr \"USB\"\n\n# Source: view/qmodem/settings.js:111\nmsgid \"USB scan completed successfully\"\nmsgstr \"USB扫描完成\"\n\n# Source: view/qmodem/settings.js:120\nmsgid \"USB scan error: \"\nmsgstr \"USB扫描错误：\"\n\n# Source: view/qmodem/settings.js:113\nmsgid \"USB scan failed\"\nmsgstr \"USB扫描失败\"\n\n# Source: vendor/fibocom.sh:1513, vendor/huawei.sh:576, vendor/neoway.sh:753, vendor/quectel.sh:1740\nmsgid \"UTRA Absolute Radio Frequency Channel Number\"\nmsgstr \"UTRA绝对射频信道号\"\n\n# Source: view/qmodem/settings.js:52\nmsgid \"Units: seconds\"\nmsgstr \"单位：秒\"\n\n# Source: view/qmodem/config_advanced.js:302, view/qmodem/network_config.js:137, view/qmodem/network_config.js:325\nmsgid \"Unknown\"\nmsgstr \"未知\"\n\n# Source: vendor/simcom.sh:1002\nmsgid \"Uplink Absolute Radio Frequency Channel Number\"\nmsgstr \"上行绝对射频信道号\"\n\n# Source: view/qmodem/network_config.js:196\nmsgid \"Use Slot 1 Config\"\nmsgstr \"使用插槽1配置\"\n\n# Source: view/qmodem/debug.js:140, view/qmodem/settings.js:184\nmsgid \"Use Ubus AT Daemon\"\nmsgstr \"使用Ubus AT守护进程\"\n\n# Source: view/qmodem/network_config.js:156\nmsgid \"View Log\"\nmsgstr \"查看日志\"\n\n# Source: view/qmodem/sms.js:176\nmsgid \"View and manage SMS messages. Messages are grouped by sender/recipient.\"\nmsgstr \"查看和管理短信。消息按发件人/收件人分组。\"\n\n# Source: view/qmodem/config_advanced.js:486\nmsgid \"View and modify the modem IMEI number. IMEI must be 15 digits. Changes require modem reboot to take effect.\"\nmsgstr \"查看和修改调制解调器IMEI。IMEI必须为15位数字。更改需重启调制解调器生效。\"\n\n# Source: vendor/fibocom.sh:372, vendor/foxconn.sh:463, vendor/meig.sh:187, vendor/quectel.sh:313, vendor/sierra.sh:333, vendor/simcom.sh:203, vendor/telit.sh:131\nmsgid \"Voltage\"\nmsgstr \"电压\"\n\n# Source: vendor/huawei.sh:385\nmsgid \"WCDMA Information\"\nmsgstr \"WCDMA信息\"\n\n# Source: view/qmodem/config_advanced.js:596\nmsgid \"Warning: \"\nmsgstr \"警告：\"\n\n# Source: qmodem/sms.js:221\nmsgid \"Wednesday\"\nmsgstr \"星期三\"\n\n# Source: view/qmodem/network_config.js:411, view/qmodem/network_config.js:412\nmsgid \"Yes\"\nmsgstr \"是\"\n\n# Source: qmodem/sms.js:218\nmsgid \"Yesterday\"\nmsgstr \"昨天\"\n\n# Source: view/qmodem\nmsgid \"Modem\"\nmsgstr \"调制解调器\"\n\n# Source: view/qmodem\nmsgid \"QModem\"\nmsgstr \"QModem\"\n\n# Source: view/qmodem/overview.js\nmsgid \"Overview\"\nmsgstr \"概览\"\n\n# Source: view/qmodem/network_config.js\nmsgid \"NetworkConfiguration\"\nmsgstr \"网络配置\"\n\n# Source: view/qmodem/config_advanced.js\nmsgid \"Advanced Modem Config\"\nmsgstr \"高级调制解调器配置\"\n\n# Source: view/qmodem/network_config.js:364, view/qmodem/network_config.js:441\nmsgid \"A1 (AT)\"\nmsgstr \"A1 (AT)\"\n\n# Source: view/qmodem/network_config.js:390\nmsgid \"Authentication Type\"\nmsgstr \"认证类型\"\n\n# Source: view/qmodem/network_config.js:347, view/qmodem/network_config.js:350, view/qmodem/network_config.js:424, view/qmodem/network_config.js:427\nmsgid \"Auto Choose\"\nmsgstr \"自动选择\"\n\n# Source: view/qmodem/network_config.js:381, view/qmodem/network_config.js:458\nmsgid \"Beeline (RU)\"\nmsgstr \"Beeline (RU)\"\n\n# Source: view/qmodem/network_config.js:310\nmsgid \"Bridge Mode\"\nmsgstr \"桥接模式\"\n\n# Source: view/qmodem/network_config.js:323\nmsgid \"Caution: Enabling this option will make it the IPV6 RA Master, and only one interface can be configured as such.\"\nmsgstr \"注意：启用此选项将使其成为IPv6 RA主设备，且仅能配置一个接口为此类型。\"\n\n# Source: view/qmodem/network_config.js:311\nmsgid \"Caution: Only avalible for quectel sdx 5G Modem.\"\nmsgstr \"注意：仅适用于高通SDX 5G调制解调器。\"\n\n# Source: view/qmodem/network_config.js:373, view/qmodem/network_config.js:450\nmsgid \"Celcom (MY)\"\nmsgstr \"Celcom (MY)\"\n\n# Source: view/qmodem/network_config.js:354, view/qmodem/network_config.js:431\nmsgid \"China Broadcast (CN)\"\nmsgstr \"中国广播电视 (CN)\"\n\n# Source: view/qmodem/network_config.js:351, view/qmodem/network_config.js:428\nmsgid \"China Mobile (CN)\"\nmsgstr \"中国移动 (CN)\"\n\n# Source: view/qmodem/network_config.js:353, view/qmodem/network_config.js:430\nmsgid \"China Telecom (CN)\"\nmsgstr \"中国电信 (CN)\"\n\n# Source: view/qmodem/network_config.js:352, view/qmodem/network_config.js:429\nmsgid \"China Unicom (CN)\"\nmsgstr \"中国联通 (CN)\"\n\n# Source: view/qmodem/network_config.js:293\nmsgid \"DNS\"\nmsgstr \"DNS\"\n\n# Source: view/qmodem/network_config.js:374, view/qmodem/network_config.js:451\nmsgid \"DiGi (MY)\"\nmsgstr \"DiGi (MY)\"\n\n# Source: view/qmodem/network_config.js:371, view/qmodem/network_config.js:448\nmsgid \"Dito Telecomunity (PH)\"\nmsgstr \"Dito Telecom (PH)\"\n\n# Source: view/qmodem/network_config.js:316\nmsgid \"Do Not modify resolv.conf\"\nmsgstr \"不修改 resolv.conf\"\n\n# Source: view/qmodem/network_config.js:365, view/qmodem/network_config.js:442\nmsgid \"Drei (AT)\"\nmsgstr \"Drei (AT)\"\n\n# Source: view/qmodem/network_config.js:362, view/qmodem/network_config.js:439\nmsgid \"E-Plus (DE)\"\nmsgstr \"E-Plus (DE)\"\n\n# Source: view/qmodem/network_config.js:166, view/qmodem/network_config.js:769\nmsgid \"Failed to disable QModem Network: \"\nmsgstr \"禁用QModem网络失败：\"\n\n# Source: view/qmodem/network_config.js:147, view/qmodem/network_config.js:750\nmsgid \"Failed to enable QModem Network: \"\nmsgstr \"启用QModem网络失败：\"\n\n# Source: view/qmodem/network_config.js:304\nmsgid \"Force Set APN\"\nmsgstr \"强制设置APN\"\n\n# Source: view/qmodem/network_config.js:369, view/qmodem/network_config.js:446\nmsgid \"Globe Postpaid (PH)\"\nmsgstr \"Globe 后付费 (PH)\"\n\n# Source: view/qmodem/network_config.js:368, view/qmodem/network_config.js:445\nmsgid \"Globe Prepaid (PH)\"\nmsgstr \"Globe 预付费 (PH)\"\n\n# Source: view/qmodem/network_config.js:305\nmsgid \"If enabled, the APN will be set even if it matches the current configuration.(only works with tom modified version of quectel-cm)\"\nmsgstr \"启用后，即使APN与当前配置一致也会被设置。（仅适用于Tom修改版的quectel-cm）\"\n\n# Source: view/qmodem/network_config.js:423\nmsgid \"If slot 2 config is not set,will use slot 1 config.\"\nmsgstr \"若未设置插槽2配置，则使用插槽1配置。\"\n\n# Source: view/qmodem/network_config.js:294\nmsgid \"If the DNS server is not set, it will use the DNS server leased by the operator.\"\nmsgstr \"若未设置DNS服务器，将使用运营商分配的DNS服务器。\"\n\n# Source: view/qmodem/network_config.js:417\nmsgid \"If the PIN code is not set, leave it blank.\"\nmsgstr \"若未设置PIN码，请留空。\"\n\n# Source: view/qmodem/network_config.js:382, view/qmodem/network_config.js:459\nmsgid \"MTS (RU)\"\nmsgstr \"MTS (RU)\"\n\n# Source: view/qmodem/network_config.js:366, view/qmodem/network_config.js:443\nmsgid \"Magenta (AT)\"\nmsgstr \"Magenta (AT)\"\n\n# Source: view/qmodem/network_config.js:376, view/qmodem/network_config.js:453\nmsgid \"Maxis UT (MY)\"\nmsgstr \"Maxis UT (MY)\"\n\n# Source: view/qmodem/network_config.js:375, view/qmodem/network_config.js:452\nmsgid \"Maxis | Hotlink (MY)\"\nmsgstr \"Maxis | Hotlink (MY)\"\n\n# Source: view/qmodem/network_config.js:383, view/qmodem/network_config.js:460\nmsgid \"Megafon (RU)\"\nmsgstr \"Megafon (RU)\"\n\n# Source: view/qmodem/network_config.js:467\nmsgid \"Metric\"\nmsgstr \"跃点数\"\n\n# Source: view/status/include/11_modem.js:19\nmsgid \"Modem Info\"\nmsgstr \"调制解调器信息\"\n\n# Source: view/qmodem/settings.js:243\nmsgid \"Modem Slot\"\nmsgstr \"调制解调器插槽\"\n\n# Source: view/qmodem/network_config.js:392\nmsgid \"MsChapV2\"\nmsgstr \"MS-CHAPv2\"\n\n# Source: view/qmodem/network_config.js:391\nmsgid \"NONE\"\nmsgstr \"无\"\n\n# Source: view/status/include/11_modem.js:51, view/status/include/11_modem.js:88, view/status/include/11_modem.js:120\nmsgid \"No modem information available\"\nmsgstr \"无调制解调器信息\"\n\n# Source: view/qmodem/network_config.js:329\nmsgid \"Once checking, the prefix will be apply to lan zone\"\nmsgstr \"勾选后，前缀将应用于LAN区域\"\n\n# Source: view/qmodem/network_config.js:407\nmsgid \"PAP/CHAP Password\"\nmsgstr \"PAP/CHAP 密码\"\n\n# Source: view/qmodem/network_config.js:399\nmsgid \"PAP/CHAP Username\"\nmsgstr \"PAP/CHAP 用户名\"\n\n# Source: view/qmodem/network_config.js:334\nmsgid \"PDP Context Index\"\nmsgstr \"PDP上下文索引\"\n\n# Source: view/qmodem/network_config.js:416\nmsgid \"PIN Code\"\nmsgstr \"PIN码\"\n\n# Source: view/qmodem/settings.js:253\nmsgid \"Physical slot identifier (e.g., 1-1.4 for USB, 0000:01:00.0 for PCIe)\"\nmsgstr \"物理插槽标识符（例如：USB为1-1.4，PCIe为0000:01:00.0）\"\n\n# Source: view/qmodem/network_config.js:162, view/qmodem/network_config.js:765\nmsgid \"QModem Network disabled successfully\"\nmsgstr \"QModem网络已成功禁用\"\n\n# Source: view/qmodem/network_config.js:143, view/qmodem/network_config.js:746\nmsgid \"QModem Network enabled successfully\"\nmsgstr \"QModem网络已成功启用\"\n\n# Source: view/qmodem/network_config.js:322\nmsgid \"RA Master\"\nmsgstr \"RA主设备\"\n\n# Source: view/qmodem/network_config.js:387, view/qmodem/network_config.js:464\nmsgid \"Rostelecom (RU)\"\nmsgstr \"Rostelecom (RU)\"\n\n# Source: view/qmodem/network_config.js:388, view/qmodem/network_config.js:465\nmsgid \"Sber Mobile (RU)\"\nmsgstr \"Sber Mobile (RU)\"\n\n# Source: view/qmodem/network_config.js:355, view/qmodem/network_config.js:432\nmsgid \"Skytone (CN)\"\nmsgstr \"Skytone (CN)\"\n\n# Source: view/qmodem/network_config.js:370, view/qmodem/network_config.js:447\nmsgid \"Smart Communications (PH)\"\nmsgstr \"Smart Communications (PH)\"\n\n# Source: view/qmodem/network_config.js:108, view/qmodem/network_config.js:711\nmsgid \"Start\"\nmsgstr \"启动\"\n\n# Source: view/qmodem/network_config.js:127, view/qmodem/network_config.js:730\nmsgid \"Stop\"\nmsgstr \"停止\"\n\n# Source: view/qmodem/network_config.js:357, view/qmodem/network_config.js:434\nmsgid \"Swisscom (CH)\"\nmsgstr \"Swisscom (CH)\"\n\n# Source: view/qmodem/network_config.js:386, view/qmodem/network_config.js:463\nmsgid \"T-mobile (RU)\"\nmsgstr \"T-mobile (RU)\"\n\n# Source: view/qmodem/network_config.js:384, view/qmodem/network_config.js:461\nmsgid \"Tele2 (RU)\"\nmsgstr \"Tele2 (RU)\"\n\n# Source: view/qmodem/network_config.js:361, view/qmodem/network_config.js:438\nmsgid \"Telekom (DE)\"\nmsgstr \"Telekom (DE)\"\n\n# Source: view/qmodem/network_config.js:468\nmsgid \"The metric value is used to determine the priority of the route. The smaller the value, the higher the priority. Cannot duplicate.\"\nmsgstr \"跃点数用于确定路由优先级，数值越小优先级越高，不可重复。\"\n\n# Source: view/qmodem/network_config.js:378, view/qmodem/network_config.js:455\nmsgid \"UMobile (MY)\"\nmsgstr \"UMobile (MY)\"\n\n# Source: view/qmodem/network_config.js:379, view/qmodem/network_config.js:456\nmsgid \"Unifi (MY)\"\nmsgstr \"Unifi (MY)\"\n\n# Source: view/qmodem/network_config.js:298\nmsgid \"Use Ubus\"\nmsgstr \"使用Ubus\"\n\n# Source: view/qmodem/network_config.js:360, view/qmodem/network_config.js:437\nmsgid \"Vodafone (DE)\"\nmsgstr \"Vodafone (DE)\"\n\n# Source: view/qmodem/network_config.js:377, view/qmodem/network_config.js:454\nmsgid \"YES (MY)\"\nmsgstr \"YES (MY)\"\n\n# Source: view/qmodem/network_config.js:385, view/qmodem/network_config.js:462\nmsgid \"Yota (RU)\"\nmsgstr \"Yota (RU)\"\n\n# Source: view/qmodem/settings.js:207, view/qmodem/settings.js:209, view/qmodem/settings.js:210, view/qmodem/settings.js:212, view/qmodem/settings.js:219, view/qmodem/settings.js:225, view/qmodem/settings.js:271, view/qmodem/settings.js:277, view/qmodem/settings.js:328, view/qmodem/settings.js:332\nmsgid \"e.g.\"\nmsgstr \"例如\"\n\n# Source: view/qmodem/settings.js:201\nmsgid \"enable modem soft reboot\"\nmsgstr \"启用调制解调器软重启\"\n\n# Source: view/qmodem/network_config.js:317\nmsgid \"quectel-CM will append the DNS server to the resolv.conf file by default.if you do not want to modify the resolv.conf file, please check this option.\"\nmsgstr \"默认情况下，quectel-CM会将DNS服务器追加到resolv.conf文件中。如不希望修改该文件，请勾选此选项。\"\n\n# Source: view/qmodem/sms_forward.js\nmsgid \"SMS Forwarder Configuration\"\nmsgstr \"短信转发配置\"\n\n# Source: view/qmodem/settings.js:326\nmsgid \"GPIO Value(Modem Power Down)\"\nmsgstr \"GPIO值（调制解调器断电）\"\n\n# Source: view/qmodem/settings.js:331\nmsgid \"GPIO Value(Modem Power Up)\"\nmsgstr \"GPIO值（调制解调器通电）\"\n\n# Source: view/qmodem/sms_forward.js:66\nmsgid \"PushDeer\"\nmsgstr \"PushDeer\"\n\n# Source: view/qmodem/sms_forward.js:64\nmsgid \"Webhook\"\nmsgstr \"Webhook\"\n\n# Source: view/qmodem/sms_forward.js:129, view/qmodem/sms_forward.js:267\nmsgid \"Webhook URL\"\nmsgstr \"Webhook URL\"\n\n# Source: view/qmodem/network_config.js:474, view/qmodem/network_config.js:483, view/qmodem/network_config.js:492, view/qmodem/network_config.js:499\nmsgid \"(beta)\"\nmsgstr \"(测试版)\"\n\n# Source: view/qmodem/network_config.js:475, view/qmodem/network_config.js:484, view/qmodem/network_config.js:493, view/qmodem/network_config.js:500\nmsgid \"(still in beta)\"\nmsgstr \"(仍为测试版)\"\n\n# Source: view/qmodem/network_config.js:493\nmsgid \"AT commands to execute after modem initialization.\"\nmsgstr \"模组初始化后执行的AT指令。\"\n\n# Source: view/qmodem/network_config.js:500\nmsgid \"AT commands to execute before dialing.\"\nmsgstr \"拨号前执行的AT指令。\"\n\n# Source: view/qmodem/network_config.js:484\nmsgid \"Delay of executing AT command after modem initialization, in seconds.\"\nmsgstr \"模组初始化后执行AT指令的延迟时间（秒）。\"\n\n# Source: view/qmodem/network_config.js:475\nmsgid \"Delay of executing AT command before dialing, in seconds.\"\nmsgstr \"拨号前执行AT指令的延迟时间（秒）。\"\n\n# Source: view/qmodem/network_config.js:494, view/qmodem/network_config.js:501\nmsgid \"Enter AT commands\"\nmsgstr \"输入AT指令\"\n\n# Source: view/qmodem/network_config.js:476, view/qmodem/network_config.js:485\nmsgid \"Enter delay in seconds\"\nmsgstr \"输入延迟时间（秒）\"\n\n# Source: view/qmodem/network_config.js:492\nmsgid \"Post Init AT Commands\"\nmsgstr \"初始化后AT指令\"\n\n# Source: view/qmodem/network_config.js:483\nmsgid \"Post Init Delay\"\nmsgstr \"初始化后延迟\"\n\n# Source: view/qmodem/network_config.js:499\nmsgid \"Pre Dial AT Commands\"\nmsgstr \"拨号前AT指令\"\n\n# Source: view/qmodem/network_config.js:474\nmsgid \"Pre Dial Delay\"\nmsgstr \"拨号前延迟\"\n\n# Source: view/qmodem/network_config.js:141, view/qmodem/network_config.js:794\nmsgid \"Failed to restart QModem Network: \"\nmsgstr \"重启QModem网络失败：\"\n\n# Source: view/qmodem/network_config.js:137, view/qmodem/network_config.js:790\nmsgid \"QModem Network restarted successfully\"\nmsgstr \"QModem网络已成功重启\"\n\n# Source: view/qmodem/network_config.js:145, view/qmodem/network_config.js:798\nmsgid \"Restart\"\nmsgstr \"重启\"\n\n# Source: generic.sh:12, generic.sh:39, generic.sh:67\nmsgid \"$class_overwrite\"\nmsgstr \"覆盖类\"\n\n# Source: view/qmodem/sms_forward.js:62\nmsgid \"API Type\"\nmsgstr \"API 类型\"\n\n# Source: view/qmodem/sms_forward.js:353\nmsgid \"API configuration saved. Remember to save & apply changes.\"\nmsgstr \"API 配置已保存。请记得保存并应用更改。\"\n\n# Source: vendor/fibocom.sh:428, vendor/foxconn.sh:304, vendor/gosuncn.sh:128, vendor/huawei.sh:275, vendor/meig.sh:234, vendor/neoway.sh:157, vendor/quectel.sh:359, vendor/sierra.sh:211, vendor/simcom.sh:241, vendor/telit.sh:160\nmsgid \"Base Information\"\nmsgstr \"基本信息\"\n\n# Source: view/qmodem/sms_forward.js:103\nmsgid \"Bot Token\"\nmsgstr \"机器人令牌\"\n\n# Source: view/qmodem/sms_forward.js:197\nmsgid \"Channel (optional)\"\nmsgstr \"频道（可选）\"\n\n# Source: view/qmodem/sms_forward.js:115\nmsgid \"Chat ID\"\nmsgstr \"聊天ID\"\n\n# Source: view/qmodem/sms_forward.js:72\nmsgid \"Configure\"\nmsgstr \"配置\"\n\n# Source: view/qmodem/sms_forward.js:73\nmsgid \"Configure API\"\nmsgstr \"配置 API\"\n\n# Source: view/qmodem/sms_forward.js:297\nmsgid \"Configure API Settings\"\nmsgstr \"配置 API 设置\"\n\n# Source: view/qmodem/sms_forward.js:39\nmsgid \"Configure SMS forwarding instances for different modems and services\"\nmsgstr \"为不同调制解调器和服务配置短信转发实例\"\n\n# Source: view/qmodem/sms_forward.js:21\nmsgid \"Configure SMS forwarding to various notification services\"\nmsgstr \"配置短信转发至多种通知服务\"\n\n# Source: view/qmodem/sms_forward.js:98\nmsgid \"Configure the API settings for \"\nmsgstr \"配置以下 API 设置：\"\n\n# Source: view/qmodem/sms_forward.js:260\nmsgid \"Custom PushDeer API endpoint, leave empty to use default\"\nmsgstr \"自定义 PushDeer API 端点，留空使用默认值\"\n\n# Source: view/qmodem/sms_forward.js:68\nmsgid \"Custom Script\"\nmsgstr \"自定义脚本\"\n\n# Source: view/qmodem/sms_forward.js:162\nmsgid \"Custom format using placeholders: {SENDER}, {CONTENT}, {TIME}\"\nmsgstr \"使用占位符的自定义格式：{SENDER}、{CONTENT}、{TIME}\"\n\n# Source: view/qmodem/sms_forward.js:34\nmsgid \"Debug\"\nmsgstr \"调试\"\n\n# Source: view/qmodem/sms_forward.js:26\nmsgid \"Enable SMS Forwarder\"\nmsgstr \"启用短信转发器\"\n\n# Source: view/qmodem/sms_forward.js:67\nmsgid \"Feishu Bot\"\nmsgstr \"飞书机器人\"\n\n# Source: view/qmodem/sms_forward.js:276\nmsgid \"Feishu webhook URL from your bot configuration\"\nmsgstr \"来自飞书机器人配置的 Webhook URL\"\n\n# Source: view/qmodem/sms_forward.js:38\nmsgid \"Forward Instances\"\nmsgstr \"转发实例\"\n\n# Source: view/qmodem/sms_forward.js:24\nmsgid \"Global Settings\"\nmsgstr \"全局设置\"\n\n# Source: view/qmodem/sms_forward.js:176\nmsgid \"HTTP headers, one per line\"\nmsgstr \"HTTP 头，每行一个\"\n\n# Source: view/qmodem/sms_forward.js:167\nmsgid \"Headers (optional)\"\nmsgstr \"头信息（可选）\"\n\n# Source: view/qmodem/sms_forward.js:211\nmsgid \"Hide IP\"\nmsgstr \"隐藏 IP\"\n\n# Source: vendor/nk.sh:9\nmsgid \"I Love U\"\nmsgstr \"我爱你\"\n\n# Source: view/qmodem/sms_forward.js:33\nmsgid \"Info\"\nmsgstr \"信息\"\n\n# Source: view/qmodem/sms_forward.js:30\nmsgid \"Log Level\"\nmsgstr \"日志级别\"\n\n# Source: view/qmodem/sms_forward.js:153\nmsgid \"Message Format (optional)\"\nmsgstr \"消息格式（可选）\"\n\n# Source: view/qmodem/sms_forward.js:206\nmsgid \"Message channel, use | to separate multiple channels\"\nmsgstr \"消息通道，使用 | 分隔多个通道\"\n\n# Source: view/qmodem/sms_forward.js:49\nmsgid \"Modem Config\"\nmsgstr \"调制解调器配置\"\n\n# Source: vendor/fibocom.sh:566, vendor/foxconn.sh:314, vendor/meig.sh:380, vendor/neoway.sh:287, vendor/quectel.sh:504, vendor/sierra.sh:222, vendor/simcom.sh:340, vendor/telit.sh:258\nmsgid \"Network Information\"\nmsgstr \"网络信息\"\n\n# Source: view/qmodem/sms_forward.js:221\nmsgid \"OpenID (optional)\"\nmsgstr \"OpenID（可选）\"\n\n# Source: view/qmodem/sms_forward.js:230\nmsgid \"OpenID for message forwarding, use comma to separate multiple IDs\"\nmsgstr \"用于消息转发的 OpenID，使用逗号分隔多个 ID\"\n\n# Source: view/qmodem/sms_forward.js:292\nmsgid \"Path to custom forwarding script. Script receives SMS_SENDER, SMS_TIME, SMS_CONTENT environment variables\"\nmsgstr \"自定义转发脚本路径。脚本将接收 SMS_SENDER、SMS_TIME、SMS_CONTENT 环境变量\"\n\n# Source: view/qmodem/sms_forward.js:57\nmsgid \"Poll Interval (seconds)\"\nmsgstr \"轮询间隔（秒）\"\n\n# Source: view/qmodem/sms_forward.js:237\nmsgid \"Push Key\"\nmsgstr \"推送密钥\"\n\n# Source: view/qmodem/sms_forward.js:246\nmsgid \"PushDeer Push Key from http://pushdeer.com\"\nmsgstr \"来自 http://pushdeer.com 的 PushDeer 推送密钥\"\n\n# Source: view/qmodem/sms_forward.js:143\nmsgid \"Request Method\"\nmsgstr \"请求方法\"\n\n# Source: vendor/fibocom.sh:498, vendor/foxconn.sh:227, vendor/gosuncn.sh:116, vendor/huawei.sh:226, vendor/meig.sh:279, vendor/neoway.sh:209, vendor/quectel.sh:417, vendor/sierra.sh:183, vendor/simcom.sh:298, vendor/telit.sh:215\nmsgid \"SIM Information\"\nmsgstr \"SIM 信息\"\n\n# Source: view/qmodem/sms_forward.js:309\nmsgid \"Save\"\nmsgstr \"保存\"\n\n# Source: view/qmodem/sms_forward.js:283\nmsgid \"Script Path\"\nmsgstr \"脚本路径\"\n\n# Source: view/qmodem/sms_forward.js:251\nmsgid \"Server (optional)\"\nmsgstr \"服务器（可选）\"\n\n# Source: view/qmodem/sms_forward.js:65\nmsgid \"ServerChan\"\nmsgstr \"ServerChan\"\n\n# Source: view/qmodem/sms_forward.js:192\nmsgid \"ServerChan API token from https://sctapi.ftqq.com\"\nmsgstr \"来自 https://sctapi.ftqq.com 的 ServerChan API 令牌\"\n\n# Source: view/qmodem/sms_forward.js:138\nmsgid \"Supports placeholders: {SENDER}, {CONTENT}, {TIME}\"\nmsgstr \"支持占位符：{SENDER}、{CONTENT}、{TIME}\"\n\n# Source: view/qmodem/sms_forward.js:63\nmsgid \"Telegram Bot\"\nmsgstr \"Telegram 机器人\"\n\n# Source: view/qmodem/sms_forward.js:183\nmsgid \"Token\"\nmsgstr \"令牌\"\n\n# Source: view/qmodem/sms_forward.js:32\nmsgid \"Warning\"\nmsgstr \"警告\"\n\n# Source: view/qmodem/settings.js:249\nmsgid \"Add\"\nmsgstr \"添加\"\n\n# Source: view/qmodem/settings.js:219\nmsgid \"Add Modem Device\"\nmsgstr \"添加模组设备\"\n\n# Source: view/qmodem/settings.js:222\nmsgid \"Available Devices\"\nmsgstr \"可用设备\"\n\n# Source: view/qmodem/settings.js:328\nmsgid \"Disabled Features\"\nmsgstr \"已禁用功能\"\n\n# Source: view/qmodem/settings.js:346\nmsgid \"NSA Band\"\nmsgstr \"NSA频段\"\n\n# Source: view/qmodem/settings.js:211\nmsgid \"No devices available. Please scan for devices first.\"\nmsgstr \"无可用设备，请先扫描设备。\"\n\n# Source: view/qmodem/settings.js:313\nmsgid \"Platform\"\nmsgstr \"平台\"\n\n# Source: view/qmodem/settings.js:351\nmsgid \"SA Band\"\nmsgstr \"SA频段\"\n\n# Source: view/qmodem/settings.js:220\nmsgid \"Select a device to configure:\"\nmsgstr \"请选择要配置的设备：\"\n\n# Source: view/qmodem/settings.js:329\nmsgid \"Select features to disable for this modem.\"\nmsgstr \"请选择要为此模组禁用的功能。\"\n\n# Source: view/qmodem/settings.js:320\nmsgid \"Supported Modes\"\nmsgstr \"支持的模式\"\n\n# Source: view/qmodem/settings.js:321\nmsgid \"Supported driver modes (e.g., RNDIS/NCM/QMI/MBIM/ETH/PPP)\"\nmsgstr \"支持的驱动模式（例如：RNDIS/NCM/QMI/MBIM/ETH/PPP）\"\n\n# Source: view/qmodem/settings.js:259\nmsgid \"Type\"\nmsgstr \"类型\"\n\n# Source: view/qmodem/settings.js:306\nmsgid \"Vendor\"\nmsgstr \"厂商\"\n\n# Source: view/qmodem/settings.js:336\nmsgid \"WCDMA Band\"\nmsgstr \"WCDMA频段\"\n\n# Source: view/qmodem/config_advanced.js:805\nmsgid \"Cell unlocked successfully\"\nmsgstr \"小区解锁成功\"\n\n# Source: view/qmodem/config_advanced.js:810\nmsgid \"Failed to unlock cell\"\nmsgstr \"解锁小区失败\"\n\n# Source: view/qmodem/config_advanced.js:813, view/qmodem/config_advanced.js:817, view/qmodem/config_advanced.js:820\nmsgid \"Unlock Cell\"\nmsgstr \"解锁小区\"\n\n# Source: view/qmodem/config_advanced.js:795\nmsgid \"Unlocking...\"\nmsgstr \"解锁中...\"\n\n# Source: view/qmodem/network_config.js:340\nmsgid \"Do Not NAT(Only for Quectel Modem)\"\nmsgstr \"不启用NAT（仅适用于移远模组）\"\n\n# Source: view/qmodem/network_config.js:341\nmsgid \"If enabled, will turn off NAT function on quectel modem.\"\nmsgstr \"启用后，将关闭移远模组的NAT功能。\"\n\n# Source: generic.sh:262\nmsgid \"$arfcn_label\"\nmsgstr \"$arfcn_label\"\n\n# Source: view/qmodem/settings.js:266\nmsgid \"Are you sure you want to remove this modem device? this cannot be roll back with uci machanism.\"\nmsgstr \"确定要移除此模组设备吗？此操作无法通过UCI机制回滚。\"\n\n# Source: generic.sh:263\nmsgid \"Band (CA)\"\nmsgstr \"频段（载波聚合）\"\n\n# Source: generic.sh:265\nmsgid \"DL Bandwidth (CA)\"\nmsgstr \"下行带宽（载波聚合）\"\n\n# Source: view/qmodem/settings.js:276\nmsgid \"Modem device removal failed: \"\nmsgstr \"模组设备移除失败：\"\n\n# Source: view/qmodem/settings.js:271\nmsgid \"Modem device removed successfully\"\nmsgstr \"模组设备已成功移除\"\n\n# Source: generic.sh:261\nmsgid \"Physical Cell ID (CA)\"\nmsgstr \"物理小区ID（载波聚合）\"\n\n# Source: generic.sh:264\nmsgid \"UL Bandwidth (CA)\"\nmsgstr \"上行带宽（载波聚合）\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"SIM Switch\"\nmsgstr \"SIM卡切换\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"Switch between SIM card slots. Note: Some modems may require a reboot after switching SIM slots.\"\nmsgstr \"在SIM卡槽之间切换。注意：某些调制解调器在切换SIM卡槽后可能需要重启。\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"SIM Switch Status\"\nmsgstr \"SIM卡切换状态\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"Select SIM Slot\"\nmsgstr \"选择SIM卡槽\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"Support\"\nmsgstr \"支持\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"Supported\"\nmsgstr \"支持\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"Not Supported\"\nmsgstr \"不支持\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"Current SIM Slot\"\nmsgstr \"当前SIM卡槽\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"Slot 1\"\nmsgstr \"卡槽1\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"Slot 2\"\nmsgstr \"卡槽2\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"SIM Slot 1\"\nmsgstr \"SIM卡槽1\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"SIM Slot 2\"\nmsgstr \"SIM卡槽2\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"This modem does not support SIM switching.\"\nmsgstr \"此调制解调器不支持SIM卡切换。\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"Note\"\nmsgstr \"注意\"\n\n# Source: vendor/huawei.sh\nmsgid \"Huawei Modem does not support querying SIM slot capabilities via AT commands.Slot display may be incorrect.\"\nmsgstr \"华为调制解调器不支持通过AT命令查询SIM卡槽功能，卡槽显示可能不正确。\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"Switching SIM slot...\"\nmsgstr \"正在切换SIM卡槽...\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"SIM slot switched to Slot %s successfully.\"\nmsgstr \"SIM卡槽已成功切换到卡槽%s。\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"Note: Some modems may require a reboot for the change to take effect.\"\nmsgstr \"注意：某些调制解调器可能需要重启才能使更改生效。\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"Failed to switch SIM slot. Please check modem status.\"\nmsgstr \"切换SIM卡槽失败。请检查调制解调器状态。\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"Error switching SIM slot: %s\"\nmsgstr \"切换SIM卡槽时出错：%s\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"Error loading SIM switch information: %s\"\nmsgstr \"加载SIM卡切换信息时出错：%s\"\n\n# Source: view/qmodem/sim_switch.js\nmsgid \"Result\"\nmsgstr \"结果\"\n# Source: view/qmodem/sms.js\nmsgid \"SMS Storage\"\nmsgstr \"短信存储\"\n\n# Source: view/qmodem/sms.js\nmsgid \"Reading Storage\"\nmsgstr \"读取存储\"\n\n# Source: view/qmodem/sms.js\nmsgid \"Writing Storage\"\nmsgstr \"写入存储\"\n\n# Source: view/qmodem/sms.js\nmsgid \"Other Storage\"\nmsgstr \"其他存储\"\n\n# Source: view/qmodem/sms.js\nmsgid \"Mobile Equipment (ME)\"\nmsgstr \"移动设备(ME)\"\n\n# Source: view/qmodem/sms.js\nmsgid \"SIM Card (SM)\"\nmsgstr \"SIM卡(SM)\"\n\n# Source: view/qmodem/sms.js\nmsgid \"Apply Storage Settings\"\nmsgstr \"应用存储设置\"\n\n# Source: view/qmodem/sms.js\nmsgid \"Failed to get SMS storage: \"\nmsgstr \"获取短信存储失败：\"\n\n# Source: view/qmodem/sms.js\nmsgid \"Failed to set SMS storage: \"\nmsgstr \"设置短信存储失败：\"\n\n# Source: view/qmodem/sms.js\nmsgid \"SMS storage settings applied successfully\"\nmsgstr \"短信存储设置已成功应用\"\n\n# Source: view/qmodem/sms.js\nmsgid \"Please wait for storage info to load\"\nmsgstr \"请等待存储信息加载\"\n\n# Source: view/qmodem/sms.js\nmsgid \"Setting SMS Storage\"\nmsgstr \"设置短信存储\"\n\n# Source: view/qmodem/sms.js\nmsgid \"Applying settings...\"\nmsgstr \"正在应用设置...\"\n\n# Source: view/qmodem/sms.js\nmsgid \"Error loading SMS storage: \"\nmsgstr \"加载短信存储时出错：\"\n\n# Source: view/qmodem/sms.js\nmsgid \"Error setting SMS storage: \"\nmsgstr \"设置短信存储时出错：\"\n\n# Source: view/qmodem/sms.js\nmsgid \"Failed to get SMS storage\"\nmsgstr \"获取短信存储失败\"\n\n# Source: view/qmodem/sms.js\nmsgid \"Failed to set SMS storage\"\nmsgstr \"设置短信存储失败\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"SIM Card SMS Management\"\nmsgstr \"SIM卡短信管理\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"SIM Card SMS\"\nmsgstr \"SIM卡短信\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"View and delete SMS messages stored on SIM card. These are raw messages before being processed into conversations.\"\nmsgstr \"查看和删除存储在SIM卡上的短信。这些是处理成会话之前的原始消息。\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"SMS Messages on SIM Card\"\nmsgstr \"SIM卡上的短信\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Index\"\nmsgstr \"索引\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Type\"\nmsgstr \"类型\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Part\"\nmsgstr \"部分\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Single\"\nmsgstr \"单条\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Summary\"\nmsgstr \"摘要\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Total Messages\"\nmsgstr \"总消息数\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Delete All\"\nmsgstr \"全部删除\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Confirm Delete\"\nmsgstr \"确认删除\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Are you sure you want to delete this message from SIM card?\"\nmsgstr \"确定要从SIM卡删除此消息吗？\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Deleting...\"\nmsgstr \"正在删除...\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Deleting message...\"\nmsgstr \"正在删除消息...\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Message deleted successfully\"\nmsgstr \"消息已成功删除\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Failed to delete message\"\nmsgstr \"删除消息失败\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Confirm Delete All\"\nmsgstr \"确认全部删除\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Are you sure you want to delete ALL %d messages from SIM card? This action cannot be undone.\"\nmsgstr \"确定要从SIM卡删除全部%d条消息吗？此操作无法撤销。\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Deleting all messages... This may take a while.\"\nmsgstr \"正在删除全部消息...这可能需要一段时间。\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"All %d messages deleted successfully\"\nmsgstr \"所有%d条消息已成功删除\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"%d messages deleted, %d failed\"\nmsgstr \"已删除%d条消息，%d条失败\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Error deleting messages: \"\nmsgstr \"删除消息时出错：\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"No messages found on SIM card\"\nmsgstr \"SIM卡上未找到消息\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Invalid message index\"\nmsgstr \"无效的消息索引\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Error loading SIM SMS: \"\nmsgstr \"加载SIM卡短信时出错：\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Failed to load SIM SMS: \"\nmsgstr \"加载SIM卡短信失败：\"\n\n# Source: view/qmodem/sms_sim.js\nmsgid \"Error deleting SMS: \"\nmsgstr \"删除短信时出错：\""
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/root/lib/upgrade/keep.d/qmodme-next",
    "content": "/etc/qmodem\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/root/usr/share/luci/menu.d/luci-app-qmodem-next.json",
    "content": "{\n\t\"admin/modem\": {\n\t\t\"title\": \"Modem\",\n\t\t\"order\": 25,\n\t\t\"action\": {\n\t\t\t\"type\": \"firstchild\"\n\t\t},\n\t\t\"depends\": {\n\t\t\t\"acl\": [ \"luci-app-qmodem-next\" ]\n\t\t}\n\t},\n\t\"admin/modem/qmodem\": {\n\t\t\"title\": \"QModem\",\n\t\t\"order\": 10,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"qmodem/overview\"\n\t\t},\n\t\t\"depends\": {\n\t\t\t\"acl\": [ \"luci-app-qmodem-next\" ]\n\t\t}\n\t},\n\t\"admin/modem/qmodem/overview\": {\n\t\t\"title\": \"Overview\",\n\t\t\"order\": 1,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"qmodem/overview\"\n\t\t}\n\t},\n\t\"admin/modem/qmodem/network_config\": {\n\t\t\"title\": \"NetworkConfiguration\",\n\t\t\"order\": 2,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"qmodem/network_config\"\n\t\t}\n\t},\n\t\"admin/modem/qmodem/debug\": {\n\t\t\"title\": \"AT Debug\",\n\t\t\"order\": 3,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"qmodem/debug\"\n\t\t}\n\t},\n\t\"admin/modem/qmodem/config_advanced\": {\n\t\t\"title\": \"Advanced Modem Config\",\n\t\t\"order\": 4,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"qmodem/config_advanced\"\n\t\t}\n\t},\n\t\"admin/modem/qmodem/sms\": {\n\t\t\"title\": \"SMS Messages\",\n\t\t\"order\": 5,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"qmodem/sms\"\n\t\t},\n\t\t\"depends\": {\n\t\t\t\"acl\": [ \"luci-app-qmodem-next\" ]\n\t\t}\n\t},\n\t\"admin/modem/qmodem/sms/conversation/*\": {\n\t\t\"title\": \"SMS Conversation\",\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"qmodem/sms_conversation\"\n\t\t},\n\t\t\"depends\": {\n\t\t\t\"acl\": [ \"luci-app-qmodem-next\" ]\n\t\t}\n\t},\n\t\"admin/modem/qmodem/sms_sim\": {\n\t\t\"title\": \"SIM Card SMS\",\n\t\t\"order\": 5.3,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"qmodem/sms_sim\"\n\t\t},\n\t\t\"depends\": {\n\t\t\t\"acl\": [ \"luci-app-qmodem-next\" ]\n\t\t}\n\t},\n\t\"admin/modem/qmodem/sms_forward\": {\n\t\t\"title\": \"SMS Forwarder\",\n\t\t\"order\": 5.5,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"qmodem/sms_forward\"\n\t\t},\n\t\t\"depends\": {\n\t\t\t\"acl\": [ \"luci-app-qmodem-next\" ]\n\t\t}\n\t},\n\t\"admin/modem/qmodem/sim_switch\": {\n\t\t\"title\": \"SIM Switch\",\n\t\t\"order\": 5.6,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"qmodem/sim_switch\"\n\t\t},\n\t\t\"depends\": {\n\t\t\t\"acl\": [ \"luci-app-qmodem-next\" ]\n\t\t}\n\t},\n\t\"admin/modem/qmodem/settings\": {\n\t\t\"title\": \"QModem Settings\",\n\t\t\"order\": 6,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"qmodem/settings\"\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/root/usr/share/rpcd/acl.d/luci-app-qmodem-next.json",
    "content": "{\n\t\"luci-app-qmodem-next\": {\n\t\t\"description\": \"Grant access to QModem Next application\",\n\t\t\"read\": {\n\t\t\t\"ubus\": {\n\t\t\t\t\"qmodem\": [\n\t\t\t\t\t\"*\"\n\t\t\t\t],\n\t\t\t\t\"qmodem_sms\": [\n\t\t\t\t\t\"*\"\n\t\t\t\t],\n\t\t\t\t\"rc\" : [ \"list\" ,\"init\"],\n\t\t\t\t\"uci\": [ \"qmodem\", \"sms_forwarder\" ]\n\t\t\t},\n\t\t\t\"uci\": [ \"qmodem\", \"sms_forwarder\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"ubus\": {\n\t\t\t\t\"qmodem\": [\n\t\t\t\t\t\"delete_sms\",\n\t\t\t\t\t\"do_reboot\",\n\t\t\t\t\t\"modem_dial\",\n\t\t\t\t\t\"modem_hang\",\n\t\t\t\t\t\"modem_redial\",\n\t\t\t\t\t\"scan_all\",\n\t\t\t\t\t\"scan_pcie\",\n\t\t\t\t\t\"scan_usb\",\n\t\t\t\t\t\"send_at\",\n\t\t\t\t\t\"send_raw_pdu\",\n\t\t\t\t\t\"send_sms\",\n\t\t\t\t\t\"set_imei\",\n\t\t\t\t\t\"set_lockband\",\n\t\t\t\t\t\"set_mode\",\n\t\t\t\t\t\"set_neighborcell\",\n\t\t\t\t\t\"set_network_prefer\",\n\t\t\t\t\t\"set_sms_storage\"\n\t\t\t\t],\n\t\t\t\t\"qmodem_sms\": [\n\t\t\t\t\t\"send_sms\",\n\t\t\t\t\t\"delete_sms\",\n\t\t\t\t\t\"delete_sim_sms\",\n\t\t\t\t\t\"mark_read\",\n\t\t\t\t\t\"clear_sent_history\",\n\t\t\t\t\t\"set_sms_storage\"\n\t\t\t\t],\n\t\t\t\t\"uci\": [ \"qmodem\", \"sms_forwarder\" ]\n\t\t\t},\n\t\t\t\"uci\": [ \"qmodem\", \"sms_forwarder\" ]\n\t\t}\n\t},\n\t\"luci-mod-status-index\": {\n\t\t\"description\": \"Grant access to main status display\",\n\t\t\"read\": {\n\t\t\t\"ubus\": {\n\t\t\t\t\"qmodem\": [ \"cell_info\",\"base_info\" ]\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-next/root/usr/share/rpcd/ucode/qmodem_sms",
    "content": "#!/usr/bin/ucode\n'use strict';\n\nimport { open, fdopen, popen, stat } from 'fs';\nimport { cursor } from 'uci';\n\nconst TOM_MODEM_PATH = '/usr/bin/tom_modem';\nconst DEFAULT_SMS_DB_DIR = '/etc/qmodem';\n\n// Initialize SMS database\nfunction initSmsDb(db_path, config_section) {\n\tlet db_dir = db_path;\n\tlet db_file = `${db_dir}/${config_section}_sent.json`;\n\t\n\t// Create directory if it doesn't exist\n\ttry {\n\t\tstat(db_dir);\n\t} catch (e) {\n\t\ttry {\n\t\t\tsystem(`mkdir -p ${db_dir}`);\n\t\t} catch (err) {\n\t\t\twarn(`Failed to create directory ${db_dir}: ${err}\\n`);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Check if file exists\n\ttry {\n\t\tlet file = open(db_file, 'r');\n\t\tif (file) {\n\t\t\tfile.close();\n\t\t\treturn true;\n\t\t}\n\t} catch (e) {\n\t\t// File doesn't exist, create it\n\t\ttry {\n\t\t\tlet file = open(db_file, 'w');\n\t\t\tif (file) {\n\t\t\t\tfile.write('{\"sent\": [], \"next_id\": 1}');\n\t\t\t\tfile.close();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} catch (err) {\n\t\t\twarn(`Failed to create sent DB file ${db_file}: ${err}\\n`);\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\treturn true;\n}\n\n// Initialize received SMS database\nfunction initReceivedSmsDb(db_path, config_section) {\n\tlet db_dir = db_path;\n\tlet db_file = `${db_dir}/${config_section}_received.json`;\n\t\n\t// Create directory if it doesn't exist\n\ttry {\n\t\tstat(db_dir);\n\t} catch (e) {\n\t\ttry {\n\t\t\tsystem(`mkdir -p ${db_dir}`);\n\t\t} catch (err) {\n\t\t\twarn(`Failed to create directory ${db_dir}: ${err}\\n`);\n\t\t\treturn false;\n\t\t}\n\t}\n\n\t// Check if file exists\n\ttry {\n\t\tlet file = open(db_file, 'r');\n\t\tif (file) {\n\t\t\tfile.close();\n\t\t\treturn true;\n\t\t}\n\t} catch (e) {\n\t\t// File doesn't exist, create it\n\t\ttry {\n\t\t\tlet file = open(db_file, 'w');\n\t\t\tif (file) {\n\t\t\t\tfile.write('{\"received\": [], \"next_id\": 1}');\n\t\t\t\tfile.close();\n\t\t\t\treturn true;\n\t\t\t}\n\t\t} catch (err) {\n\t\t\twarn(`Failed to create received DB file ${db_file}: ${err}\\n`);\n\t\t\treturn false;\n\t\t}\n\t}\n\t\n\treturn true;\n}\n\n// Read SMS database\nfunction readSmsDb(db_path, config_section) {\n\tinitSmsDb(db_path, config_section);\n\tlet db_file = `${db_path}/${config_section}_sent.json`;\n\t\n\ttry {\n\t\tlet file = open(db_file, 'r');\n\t\tif (!file)\n\t\t\treturn { sent: [], next_id: 1 };\n\t\t\n\t\tlet content = file.read('all');\n\t\tfile.close();\n\t\t\n\t\tif (!content || length(content) == 0)\n\t\t\treturn { sent: [], next_id: 1 };\n\t\t\n\t\tlet data = json(content);\n\t\t// Ensure next_id exists\n\t\tif (!data.next_id)\n\t\t\tdata.next_id = 1;\n\t\treturn data;\n\t} catch (e) {\n\t\twarn(`Failed to read sent DB: ${e}\\n`);\n\t\treturn { sent: [], next_id: 1 };\n\t}\n}\n\n// Write SMS database\nfunction writeSmsDb(db_path, config_section, data) {\n\tinitSmsDb(db_path, config_section);\n\tlet db_file = `${db_path}/${config_section}_sent.json`;\n\t\n\ttry {\n\t\tlet file = open(db_file, 'w');\n\t\tif (!file)\n\t\t\treturn false;\n\t\t\n\t\tfile.write(sprintf('%J', data));\n\t\tfile.close();\n\t\treturn true;\n\t} catch (e) {\n\t\twarn(`Failed to write sent DB: ${e}\\n`);\n\t\treturn false;\n\t}\n}\n\n// Read received SMS database\nfunction readReceivedSmsDb(db_path, config_section) {\n\tinitReceivedSmsDb(db_path, config_section);\n\tlet db_file = `${db_path}/${config_section}_received.json`;\n\t\n\ttry {\n\t\tlet file = open(db_file, 'r');\n\t\tif (!file)\n\t\t\treturn { received: [], next_id: 1 };\n\t\t\n\t\tlet content = file.read('all');\n\t\tfile.close();\n\t\t\n\t\tif (!content || length(content) == 0)\n\t\t\treturn { received: [], next_id: 1 };\n\t\t\n\t\tlet data = json(content);\n\t\t// Ensure next_id exists\n\t\tif (!data.next_id)\n\t\t\tdata.next_id = 1;\n\t\treturn data;\n\t} catch (e) {\n\t\twarn(`Failed to read received DB: ${e}\\n`);\n\t\treturn { received: [], next_id: 1 };\n\t}\n}\n\n// Write received SMS database\nfunction writeReceivedSmsDb(db_path, config_section, data) {\n\tinitReceivedSmsDb(db_path, config_section);\n\tlet db_file = `${db_path}/${config_section}_received.json`;\n\t\n\ttry {\n\t\tlet file = open(db_file, 'w');\n\t\tif (!file)\n\t\t\treturn false;\n\t\t\n\t\tfile.write(sprintf('%J', data));\n\t\tfile.close();\n\t\treturn true;\n\t} catch (e) {\n\t\twarn(`Failed to write received DB: ${e}\\n`);\n\t\treturn false;\n\t}\n}\n\n// Get modem configuration from UCI\nfunction getModemConfig(config_section) {\n\tlet ctx = cursor();\n\tif (!ctx)\n\t\treturn null;\n\t\n\tlet cfg = ctx.get_all('qmodem', config_section);\n\t\n\tif (!cfg)\n\t\treturn null;\n\t\n\tlet at_port = cfg.override_at_port || cfg.sms_at_port || cfg.at_port;\n\tlet use_ubus = cfg.use_ubus == '1';\n\tlet sms_db_path = cfg.sms_db_path || DEFAULT_SMS_DB_DIR;\n\tlet sms_auto_delete_from_sim = cfg.sms_auto_delete_from_sim != '0'; // Default to true\n\t\n\treturn {\n\t\tat_port: at_port,\n\t\tuse_ubus: use_ubus,\n\t\tsms_db_path: sms_db_path,\n\t\tsms_auto_delete_from_sim: sms_auto_delete_from_sim\n\t};\n}\n\n// Execute tom_modem command\nfunction execTomModem(at_port, use_ubus, operation, params) {\n\tlet cmd = TOM_MODEM_PATH;\n\t\n\tif (use_ubus)\n\t\tcmd += ' -u';\n\t\n\tcmd += ` -d \"${at_port}\" -o ${operation}`;\n\t\n\tif (params?.pdu)\n\t\tcmd += ` -p \"${params.pdu}\"`;\n\t\n\tif (params?.index != null)\n\t\tcmd += ` -i ${params.index}`;\n\t\n\ttry {\n\t\tlet proc = popen(cmd, 'r');\n\t\tif (!proc)\n\t\t\treturn null;\n\t\t\n\t\tlet output = proc.read('all');\n\t\tproc.close();\n\t\t\n\t\tif (!output || length(output) == 0)\n\t\t\treturn null;\n\t\t\n\t\t// Try to parse as JSON\n\t\ttry {\n\t\t\treturn json(output);\n\t\t} catch (e) {\n\t\t\t// Return raw output if not JSON\n\t\t\treturn { raw: output };\n\t\t}\n\t} catch (e) {\n\t\twarn(`Failed to execute tom_modem: ${e}\\n`);\n\t\treturn null;\n\t}\n}\n\n// Execute AT command directly via tom_modem\nfunction execAtCommand(at_port, use_ubus, at_cmd) {\n\tlet cmd = TOM_MODEM_PATH;\n\t\n\tif (use_ubus)\n\t\tcmd += ' -u';\n\t\n\t// Use single quotes to wrap AT command to preserve internal double quotes\n\t// Replace any single quotes in the AT command with '\\'' to escape them\n\tlet safe_cmd = '';\n\tfor (let i = 0; i < length(at_cmd); i++) {\n\t\tlet ch = substr(at_cmd, i, 1);\n\t\tif (ch == \"'\")\n\t\t\tsafe_cmd += \"'\\\\''\";\n\t\telse\n\t\t\tsafe_cmd += ch;\n\t}\n\t\n\tcmd += ` -d '${at_port}' -o a -c '${safe_cmd}'`;\n\t\n\ttry {\n\t\tlet proc = popen(cmd, 'r');\n\t\tif (!proc)\n\t\t\treturn null;\n\t\t\n\t\tlet output = proc.read('all');\n\t\tproc.close();\n\t\t\n\t\treturn output || '';\n\t} catch (e) {\n\t\twarn(`Failed to execute AT command: ${e}\\n`);\n\t\treturn null;\n\t}\n}\n\n// Parse AT+CPMS? response\nfunction parseCpmsResponse(response) {\n\tif (!response)\n\t\treturn null;\n\t\n\t// Look for +CPMS: line\n\tlet lines = split(response, '\\n');\n\tlet cpms_line = null;\n\t\n\tfor (let line in lines) {\n\t\tline = trim(line);\n\t\tif (index(line, '+CPMS:') >= 0) {\n\t\t\tcpms_line = line;\n\t\t\tbreak;\n\t\t}\n\t}\n\t\n\tif (!cpms_line)\n\t\treturn null;\n\t\n\t// Extract the part after +CPMS:\n\tlet idx = index(cpms_line, '+CPMS:');\n\tlet data = substr(cpms_line, idx + 6);\n\tdata = trim(data);\n\t\n\t// Remove quotes and parse comma-separated values\n\tdata = replace(data, '\"', '');\n\tlet parts = split(data, ',');\n\t\n\tif (length(parts) < 6)\n\t\treturn null;\n\t\n\tlet mem1 = trim(parts[0]);\n\tlet used1 = int(trim(parts[1]));\n\tlet total1 = int(trim(parts[2]));\n\tlet mem2 = trim(parts[3]);\n\tlet used2 = int(trim(parts[4]));\n\tlet total2 = int(trim(parts[5]));\n\tlet mem3 = length(parts) >= 9 ? trim(parts[6]) : null;\n\tlet used3 = length(parts) >= 9 ? int(trim(parts[7])) : null;\n\tlet total3 = length(parts) >= 9 ? int(trim(parts[8])) : null;\n\t\n\t// Initialize storage info\n\tlet me_info = { used: 0, total: 0 };\n\tlet sm_info = { used: 0, total: 0 };\n\t\n\t// Map storage types to ME or SM\n\tfor (let i = 1; i <= 3; i++) {\n\t\tlet mem = (i == 1) ? mem1 : ((i == 2) ? mem2 : mem3);\n\t\tlet used = (i == 1) ? used1 : ((i == 2) ? used2 : used3);\n\t\tlet total = (i == 1) ? total1 : ((i == 2) ? total2 : total3);\n\t\t\n\t\tif (!mem)\n\t\t\tcontinue;\n\t\t\n\t\tif (mem == 'SM') {\n\t\t\tsm_info.used = used;\n\t\t\tsm_info.total = total;\n\t\t} else if (mem == 'MT' || mem == 'ME') {\n\t\t\tme_info.used = used;\n\t\t\tme_info.total = total;\n\t\t}\n\t}\n\t\n\treturn {\n\t\tmem1: mem1,\n\t\tmem2: mem2,\n\t\tmem3: mem3,\n\t\tME: me_info,\n\t\tSM: sm_info\n\t};\n}\n\n// Check if message already exists in database based on sender, timestamp and content\nfunction messageExists(db_messages, sender, timestamp, content) {\n\tfor (let msg in db_messages) {\n\t\tif (msg.sender == sender && msg.timestamp == timestamp && msg.content == content) {\n\t\t\treturn true;\n\t\t}\n\t}\n\treturn false;\n}\n\n// Get or create a unique reference ID for multipart SMS\n// Uses the original reference and sender to identify the group\n// Returns a global unique reference in format: global_<id>\nfunction getOrCreateGlobalReference(db, original_ref, sender, current_timestamp) {\n\tif (!db.ref_mapping)\n\t\tdb.ref_mapping = {};\n\tif (!db.ref_windows)\n\t\tdb.ref_windows = {};\n\t\n\t// Key to identify this SMS group: original_ref + sender\n\tlet group_key = `${original_ref}_${sender}`;\n\t\n\t// Check if we have an existing mapping within time window\n\tif (db.ref_mapping[group_key]) {\n\t\tlet mapping = db.ref_mapping[group_key];\n\t\tlet last_seen = db.ref_windows[group_key] || 0;\n\t\t\n\t\t// Dynamic time window: 5 minutes from last fragment\n\t\tconst WINDOW_SECONDS = 300;  // 5 minutes\n\t\t\n\t\tif (current_timestamp - last_seen <= WINDOW_SECONDS) {\n\t\t\t// Still within window, update last seen time\n\t\t\tdb.ref_windows[group_key] = current_timestamp;\n\t\t\treturn mapping.global_ref;\n\t\t}\n\t\t\n\t\t// Window expired, this is a new SMS with same ref_id\n\t\t// Remove old mapping to create a new one\n\t\tdelete db.ref_mapping[group_key];\n\t\tdelete db.ref_windows[group_key];\n\t}\n\t\n\t// Create new global reference\n\tif (!db.next_global_ref)\n\t\tdb.next_global_ref = 1;\n\t\n\tlet global_ref = `global_${db.next_global_ref++}`;\n\t\n\t// Store mapping\n\tdb.ref_mapping[group_key] = {\n\t\tglobal_ref: global_ref,\n\t\tcreated_at: current_timestamp,\n\t\toriginal_ref: original_ref\n\t};\n\tdb.ref_windows[group_key] = current_timestamp;\n\t\n\treturn global_ref;\n}\n\n// Clean up expired reference mappings (older than 1 hour)\nfunction cleanupExpiredReferences(db, current_time) {\n\tif (!db.ref_mapping || !db.ref_windows)\n\t\treturn;\n\t\n\tconst CLEANUP_THRESHOLD = 3600;  // 1 hour\n\tlet keys_to_delete = [];\n\t\n\tfor (let key in db.ref_windows) {\n\t\tlet last_seen = db.ref_windows[key];\n\t\tif (current_time - last_seen > CLEANUP_THRESHOLD) {\n\t\t\tpush(keys_to_delete, key);\n\t\t}\n\t}\n\t\n\t// Delete expired mappings\n\tfor (let key in keys_to_delete) {\n\t\tdelete db.ref_mapping[key];\n\t\tdelete db.ref_windows[key];\n\t}\n}\n\n// Save received SMS to database and optionally delete from SIM\nfunction saveReceivedSms(config, config_section, received_from_sim) {\n\t// Read existing received SMS database\n\tlet db = readReceivedSmsDb(config.sms_db_path, config_section);\n\tif (!db.received)\n\t\tdb.received = [];\n\tif (!db.next_id)\n\t\tdb.next_id = 1;\n\t\n\t// If no messages from SIM, just return existing database\n\t// tom_modem returns messages in 'received' field based on your example\n\tlet sim_messages = received_from_sim?.received || received_from_sim?.msg;\n\tif (!sim_messages || type(sim_messages) != 'array')\n\t\treturn db.received;\n\t\n\tlet indices_to_delete = [];\n\tlet current_time = time();\n\t\n\t// Clean up expired reference mappings\n\tcleanupExpiredReferences(db, current_time);\n\t\n\t// Process each SMS from SIM\n\tfor (let sms in sim_messages) {\n\t\t// Check if already in database (by sender, timestamp, content)\n\t\tif (!messageExists(db.received, sms.sender, sms.timestamp, sms.content)) {\n\t\t\t// Get or create global reference for multipart SMS\n\t\t\tlet global_ref = null;\n\t\t\tif (sms.reference && sms.total > 1) {\n\t\t\t\t// Use dynamic window to get/create global reference\n\t\t\t\tglobal_ref = getOrCreateGlobalReference(db, sms.reference, sms.sender, sms.timestamp);\n\t\t\t}\n\t\t\t\n\t\t\t// Add to database with auto-increment ID\n\t\t\tlet msg = {\n\t\t\t\tid: db.next_id++,\n\t\t\t\tsender: sms.sender,\n\t\t\t\ttimestamp: sms.timestamp,\n\t\t\t\tcontent: sms.content,\n\t\t\t\treference: global_ref,  // Use global reference for multipart\n\t\t\t\toriginal_reference: sms.reference,  // Keep original for debugging\n\t\t\t\ttotal: sms.total,\n\t\t\t\tpart: sms.part,\n\t\t\t\tis_read: false,\n\t\t\t\tforwarded: false\n\t\t\t};\n\t\t\tpush(db.received, msg);\n\t\t}\n\t\t\n\t\t// Mark index for deletion if auto-delete is enabled\n\t\tif (config.sms_auto_delete_from_sim && sms.index != null)\n\t\t\tpush(indices_to_delete, sms.index);\n\t}\n\t\n\t// Keep only last 5000 received messages\n\tif (length(db.received) > 5000) {\n\t\tdb.received = slice(db.received, length(db.received) - 5000);\n\t}\n\t\n\t// Write to database\n\twriteReceivedSmsDb(config.sms_db_path, config_section, db);\n\t\n\t// Delete SMS from SIM card if auto-delete is enabled\n\tif (config.sms_auto_delete_from_sim) {\n\t\tfor (let index in indices_to_delete) {\n\t\t\texecTomModem(config.at_port, config.use_ubus, 'd', { index: index });\n\t\t}\n\t}\n\t\n\treturn db.received;\n}\n\n// Merge received SMS with sent SMS\nfunction mergeSmsMessages(received_db, sent_db) {\n\tlet messages = [];\n\t\n\t// Process received messages from database\n\tif (received_db && type(received_db) == 'array') {\n\t\tfor (let sms in received_db) {\n\t\t\tpush(messages, {\n\t\t\t\tid: sms.id,\n\t\t\t\tsender: sms.sender,\n\t\t\t\trecipient: null,\n\t\t\t\ttimestamp: sms.timestamp,\n\t\t\t\tcontent: sms.content,\n\t\t\t\treference: sms.reference,\n\t\t\t\ttotal: sms.total,\n\t\t\t\tpart: sms.part,\n\t\t\t\tis_read: sms.is_read,\n\t\t\t\tforwarded: sms.forwarded,\n\t\t\t\ttype: 'received'\n\t\t\t});\n\t\t}\n\t}\n\t\n\t// Add sent messages\n\tif (sent_db && type(sent_db) == 'array') {\n\t\tfor (let sms in sent_db) {\n\t\t\tpush(messages, {\n\t\t\t\tid: sms.id,\n\t\t\t\tsender: null,\n\t\t\t\trecipient: sms.recipient,\n\t\t\t\ttimestamp: sms.timestamp,\n\t\t\t\tcontent: sms.content,\n\t\t\t\treference: null,\n\t\t\t\ttotal: 1,\n\t\t\t\tpart: 1,\n\t\t\t\tis_success: sms.is_success,\n\t\t\t\ttype: 'sent'\n\t\t\t});\n\t\t}\n\t}\n\t\n\t// Sort by timestamp descending\n\tmessages = sort(messages, (a, b) => b.timestamp - a.timestamp);\n\t\n\treturn messages;\n}\n\n// Group messages by conversation (sender/recipient)\nfunction groupByConversation(messages) {\n\tlet conversations = {};\n\t\n\tfor (let msg in messages) {\n\t\tlet contact = msg.type == 'received' ? msg.sender : msg.recipient;\n\t\t\n\t\tif (!conversations[contact]) {\n\t\t\tconversations[contact] = {\n\t\t\t\tcontact: contact,\n\t\t\t\tmessages: [],\n\t\t\t\tlast_timestamp: msg.timestamp,\n\t\t\t\tunread_count: 0\n\t\t\t};\n\t\t}\n\t\t\n\t\tpush(conversations[contact].messages, msg);\n\t\t\n\t\t// Update last timestamp\n\t\tif (msg.timestamp > conversations[contact].last_timestamp)\n\t\t\tconversations[contact].last_timestamp = msg.timestamp;\n\t\t\n\t\t// Count unread messages\n\t\tif (msg.type == 'received' && msg.is_read === false)\n\t\t\tconversations[contact].unread_count++;\n\t}\n\t\n\t// Convert to array and sort by last message timestamp\n\tlet result = [];\n\tfor (let contact in conversations) {\n\t\tpush(result, conversations[contact]);\n\t}\n\t\n\tresult = sort(result, (a, b) => b.last_timestamp - a.last_timestamp);\n\t\n\treturn result;\n}\n\n// Reconstruct multi-part SMS messages with dynamic time window\nfunction reconstructMultipartSms(messages) {\n\tlet multipart = {};\n\tlet singles = [];\n\t\n\tfor (let msg in messages) {\n\t\tif (msg.total && msg.total > 1 && msg.reference) {\n\t\t\t// Use reference directly since it's already globally unique\n\t\t\tlet key = msg.reference;\n\t\t\t\n\t\t\tif (!multipart[key]) {\n\t\t\t\tmultipart[key] = {\n\t\t\t\t\treference: msg.reference,\n\t\t\t\t\ttotal: msg.total,\n\t\t\t\t\tparts: [],\n\t\t\t\t\tpart_ids: [],\n\t\t\t\t\ttimestamps: [],\n\t\t\t\t\tsender: msg.sender,\n\t\t\t\t\trecipient: msg.recipient,\n\t\t\t\t\ttype: msg.type,\n\t\t\t\t\tis_read: msg.is_read,\n\t\t\t\t\tforwarded: msg.forwarded,\n\t\t\t\t\tis_success: msg.is_success,\n\t\t\t\t\tmin_timestamp: msg.timestamp,\n\t\t\t\t\tmax_timestamp: msg.timestamp\n\t\t\t\t};\n\t\t\t}\n\t\t\t\n\t\t\t// Store part content and metadata\n\t\t\tif (msg.part && msg.part > 0 && msg.part <= msg.total) {\n\t\t\t\tmultipart[key].parts[msg.part - 1] = msg.content;\n\t\t\t\tmultipart[key].part_ids[msg.part - 1] = msg.id;\n\t\t\t\tmultipart[key].timestamps[msg.part - 1] = msg.timestamp;\n\t\t\t\t\n\t\t\t\t// Update timestamp range\n\t\t\t\tif (msg.timestamp < multipart[key].min_timestamp)\n\t\t\t\t\tmultipart[key].min_timestamp = msg.timestamp;\n\t\t\t\tif (msg.timestamp > multipart[key].max_timestamp)\n\t\t\t\t\tmultipart[key].max_timestamp = msg.timestamp;\n\t\t\t}\n\t\t} else {\n\t\t\tpush(singles, msg);\n\t\t}\n\t}\n\t\n\t// Reconstruct multi-part messages\n\tfor (let key in multipart) {\n\t\tlet mp = multipart[key];\n\t\tlet complete = true;\n\t\tlet received_parts = 0;\n\t\t\n\t\t// Check if all parts are present\n\t\tfor (let i = 0; i < mp.total; i++) {\n\t\t\tif (!mp.parts[i]) {\n\t\t\t\tcomplete = false;\n\t\t\t} else {\n\t\t\t\treceived_parts++;\n\t\t\t}\n\t\t}\n\t\t\n\t\tif (complete) {\n\t\t\t// All parts received, combine them\n\t\t\tlet combined_content = join('', mp.parts);\n\t\t\t\n\t\t\t// Use earliest timestamp as the message timestamp\n\t\t\tpush(singles, {\n\t\t\t\tid: mp.part_ids[0],  // Use first part's ID\n\t\t\t\tpart_ids: mp.part_ids,  // Keep track of all part IDs\n\t\t\t\tsender: mp.sender,\n\t\t\t\trecipient: mp.recipient,\n\t\t\t\ttimestamp: mp.min_timestamp,  // Use earliest timestamp\n\t\t\t\tcontent: combined_content,\n\t\t\t\treference: mp.reference,\n\t\t\t\ttotal: mp.total,\n\t\t\t\tpart: null,\n\t\t\t\ttype: mp.type,\n\t\t\t\tis_read: mp.is_read,\n\t\t\t\tforwarded: mp.forwarded,\n\t\t\t\tis_success: mp.is_success,\n\t\t\t\tmultipart: true,\n\t\t\t\ttime_span: mp.max_timestamp - mp.min_timestamp  // Record time span for debugging\n\t\t\t});\n\t\t} else {\n\t\t\t// Add incomplete parts individually with warning\n\t\t\tfor (let i = 0; i < length(mp.parts); i++) {\n\t\t\t\tif (mp.parts[i]) {\n\t\t\t\t\tpush(singles, {\n\t\t\t\t\t\tid: mp.part_ids[i],\n\t\t\t\t\t\tsender: mp.sender,\n\t\t\t\t\t\trecipient: mp.recipient,\n\t\t\t\t\t\ttimestamp: mp.timestamps[i],\n\t\t\t\t\t\tcontent: mp.parts[i],\n\t\t\t\t\t\treference: mp.reference,\n\t\t\t\t\t\ttotal: mp.total,\n\t\t\t\t\t\tpart: i + 1,\n\t\t\t\t\t\ttype: mp.type,\n\t\t\t\t\t\tis_read: mp.is_read,\n\t\t\t\t\t\tforwarded: mp.forwarded,\n\t\t\t\t\t\tis_success: mp.is_success,\n\t\t\t\t\t\tincomplete: true,\n\t\t\t\t\t\treceived_parts: received_parts  // Show how many parts we have\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\t\n\treturn singles;\n}\n\nreturn {\n\tqmodem_sms: {\n\t\t// List all SMS messages grouped by conversation\n\t\tlist_sms: {\n\t\t\targs: {\n\t\t\t\tconfig_section: \"\"\n\t\t\t},\n\t\t\tcall: function(request) {\n\t\t\t\tlet config_section = request.args.config_section;\n\t\t\t\tlet config = getModemConfig(config_section);\n\t\t\t\tif (!config)\n\t\t\t\t\treturn { error: 'Failed to get modem configuration' };\n\t\t\t\t\n\t\t\t\t// Read SMS from SIM card\n\t\t\t\tlet received_from_sim = execTomModem(config.at_port, config.use_ubus, 'r', null);\n\t\t\t\t\n\t\t\t\t// Save to database (and optionally delete from SIM)\n\t\t\t\tlet received = saveReceivedSms(config, config_section, received_from_sim);\n\t\t\t\t\n\t\t\t\t// Read sent SMS from database\n\t\t\t\tlet sent_db = readSmsDb(config.sms_db_path, config_section);\n\t\t\t\tlet sent = sent_db.sent || [];\n\t\t\t\t\n\t\t\t\t// Merge messages\n\t\t\t\tlet all_messages = mergeSmsMessages(received, sent);\n\t\t\t\t\n\t\t\t\t// Reconstruct multi-part messages\n\t\t\t\tall_messages = reconstructMultipartSms(all_messages);\n\t\t\t\t\n\t\t\t\t// Group by conversation\n\t\t\t\tlet conversations = groupByConversation(all_messages);\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\tmodem_config: config,\n\t\t\t\t\treceived_from_sim: received_from_sim,\n\t\t\t\t\tconversations: conversations,\n\t\t\t\t\ttotal: length(all_messages)\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t\n\t\t// Get conversation details with a specific contact\n\t\tget_conversation: {\n\t\t\targs: {\n\t\t\t\tconfig_section: \"\",\n\t\t\t\tcontact: \"\"\n\t\t\t},\n\t\t\tcall: function(request) {\n\t\t\t\tlet config_section = request.args.config_section;\n\t\t\t\tlet config = getModemConfig(config_section);\n\t\t\t\tif (!config)\n\t\t\t\t\treturn { error: 'Failed to get modem configuration' };\n\t\t\t\t\n\t\t\t\tlet contact = request.args.contact;\n\t\t\t\t\n\t\t\t\t// Read SMS from SIM card\n\t\t\t\tlet received_from_sim = execTomModem(config.at_port, config.use_ubus, 'r', null);\n\t\t\t\t\n\t\t\t\t// Save to database (and optionally delete from SIM)\n\t\t\t\tlet received = saveReceivedSms(config, config_section, received_from_sim);\n\t\t\t\t\n\t\t\t\t// Read sent SMS from database\n\t\t\t\tlet sent_db = readSmsDb(config.sms_db_path, config_section);\n\t\t\t\tlet sent = sent_db.sent || [];\n\t\t\t\t\n\t\t\t\t// Merge messages\n\t\t\t\tlet all_messages = mergeSmsMessages(received, sent);\n\t\t\t\t\n\t\t\t\t// Filter by contact\n\t\t\t\tlet conversation = [];\n\t\t\t\tfor (let msg in all_messages) {\n\t\t\t\t\tlet msg_contact = msg.type == 'received' ? msg.sender : msg.recipient;\n\t\t\t\t\tif (msg_contact == contact) {\n\t\t\t\t\t\tpush(conversation, msg);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Reconstruct multi-part messages\n\t\t\t\tconversation = reconstructMultipartSms(conversation);\n\t\t\t\t\n\t\t\t\t// Sort by timestamp ascending for conversation view\n\t\t\t\tconversation = sort(conversation, (a, b) => a.timestamp - b.timestamp);\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\tcontact: contact,\n\t\t\t\t\tmessages: conversation,\n\t\t\t\t\ttotal: length(conversation)\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t\n\t\t// Send SMS (PDU format from frontend)\n\t\tsend_sms: {\n\t\t\targs: {\n\t\t\t\tconfig_section: \"\",\n\t\t\t\trecipient: \"\",\n\t\t\t\tpdu: \"\",\n\t\t\t\tcontent: \"\"\n\t\t\t},\n\t\t\tcall: function(request) {\n\t\t\t\tlet config_section = request.args.config_section;\n\t\t\t\tlet config = getModemConfig(config_section);\n\t\t\t\tif (!config) {\n\t\t\t\t\twarn(\"send_sms: Failed to get modem configuration\\n\");\n\t\t\t\t\treturn { error: 'Failed to get modem configuration' };\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!request.args.pdu) {\n\t\t\t\t\twarn(\"send_sms: Missing PDU parameter\\n\");\n\t\t\t\t\treturn { error: 'Missing PDU parameter' };\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!request.args.recipient) {\n\t\t\t\t\twarn(\"send_sms: Missing recipient parameter\\n\");\n\t\t\t\t\treturn { error: 'Missing recipient parameter' };\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (!request.args.content) {\n\t\t\t\t\twarn(\"send_sms: Missing content parameter\\n\");\n\t\t\t\t\treturn { error: 'Missing content parameter' };\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twarn(`send_sms: Sending to ${request.args.recipient}, PDU length: ${length(request.args.pdu)}\\n`);\n\t\t\t\t\n\t\t\t\t// Send SMS via tom_modem\n\t\t\t\tlet result = execTomModem(config.at_port, config.use_ubus, 's', {\n\t\t\t\t\tpdu: request.args.pdu\n\t\t\t\t});\n\t\t\t\t\n\t\t\twarn(`send_sms: Result: ${sprintf('%J', result)}\\n`);\n\t\t\t\n\t\t\t// Check status field from tom_modem output\n\t\t\t// tom_modem returns {\"status\":\"success\"} on success or {\"status\":\"failed\",\"reason\":\"...\"} on failure\n\t\t\tlet is_success = (result?.status === 'success');\t\t\t\t// Read sent database\n\t\t\t\tlet db = readSmsDb(config.sms_db_path, config_section);\n\t\t\t\tif (!db.sent)\n\t\t\t\t\tdb.sent = [];\n\t\t\t\tif (!db.next_id)\n\t\t\t\t\tdb.next_id = 1;\n\t\t\t\t\n\t\t\t\t// Save to sent database regardless of success/failure\n\t\t\t\tlet msg_timestamp = time();\n\t\t\t\tlet msg_id = db.next_id++;\n\t\t\t\t\n\t\t\t\tpush(db.sent, {\n\t\t\t\t\tid: msg_id,\n\t\t\t\t\trecipient: request.args.recipient,\n\t\t\t\t\tcontent: request.args.content,\n\t\t\t\t\ttimestamp: msg_timestamp,\n\t\t\t\t\tpdu: request.args.pdu,\n\t\t\t\t\tis_success: is_success\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\t// Keep only last 1000 sent messages\n\t\t\t\tif (length(db.sent) > 1000) {\n\t\t\t\t\tdb.sent = slice(db.sent, length(db.sent) - 1000);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twriteSmsDb(config.sms_db_path, config_section, db);\n\t\t\t\t\n\t\t\t\t// Return error if send failed\n\t\t\t\tif (!is_success) {\n\t\t\t\t\tif (result?.error) {\n\t\t\t\t\t\twarn(`send_sms: Modem error: ${result.error}\\n`);\n\t\t\t\t\t\treturn { error: 'Modem error: ' + result.error, id: msg_id };\n\t\t\t\t\t} else {\n\t\t\t\t\t\twarn(`send_sms: tom_modem failed with code: ${ret_code}\\n`);\n\t\t\t\t\t\treturn { error: 'Failed to send SMS - modem returned error code ' + ret_code, id: msg_id };\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tid: msg_id,\n\t\t\t\t\tresult: result\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t\n\t\t// Delete SMS by ID(s)\n\t\tdelete_sms: {\n\t\t\targs: {\n\t\t\t\tconfig_section: \"\",\n\t\t\t\ttype: \"\",\n\t\t\t\tids: []\n\t\t\t},\n\t\t\tcall: function(request) {\n\t\t\t\tlet config_section = request.args.config_section;\n\t\t\t\tlet config = getModemConfig(config_section);\n\t\t\t\tif (!config)\n\t\t\t\t\treturn { error: 'Failed to get modem configuration' };\n\t\t\t\t\n\t\t\t\tif (!request.args.type)\n\t\t\t\t\treturn { error: 'Missing message type' };\n\t\t\t\t\n\t\t\t\tif (!request.args.ids)\n\t\t\t\t\treturn { error: 'Missing message IDs' };\n\t\t\t\t\n\t\t\t\t// Convert ids to array if it's not already\n\t\t\t\tlet ids_to_delete = [];\n\t\t\t\tif (type(request.args.ids) == 'array') {\n\t\t\t\t\tids_to_delete = request.args.ids;\n\t\t\t\t} else {\n\t\t\t\t\tpush(ids_to_delete, request.args.ids);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twarn(`delete_sms: type=${request.args.type}, ids=${sprintf('%J', ids_to_delete)}\\n`);\n\t\t\t\t\n\t\t\t\tlet deleted_count = 0;\n\t\t\t\tlet original_count = 0;\n\t\t\t\t\n\t\t\t\tif (request.args.type == 'received') {\n\t\t\t\t\t// Delete from received database\n\t\t\t\t\tlet db = readReceivedSmsDb(config.sms_db_path, config_section);\n\t\t\t\t\tif (!db.received)\n\t\t\t\t\t\tdb.received = [];\n\t\t\t\t\t\n\t\t\t\t\toriginal_count = length(db.received);\n\t\t\t\t\twarn(`delete_sms: received DB has ${original_count} messages\\n`);\n\t\t\t\t\t\n\t\t\t\t\tlet new_received = [];\n\t\t\t\t\t\n\t\t\t\t\tfor (let sms in db.received) {\n\t\t\t\t\t\tlet should_delete = false;\n\t\t\t\t\t\tfor (let id in ids_to_delete) {\n\t\t\t\t\t\t\tif (sms.id == id) {\n\t\t\t\t\t\t\t\tshould_delete = true;\n\t\t\t\t\t\t\t\tdeleted_count++;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!should_delete) {\n\t\t\t\t\t\t\tpush(new_received, sms);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tdb.received = new_received;\n\t\t\t\t\twriteReceivedSmsDb(config.sms_db_path, config_section, db);\n\t\t\t\t\t\n\t\t\t\t} else if (request.args.type == 'sent') {\n\t\t\t\t\t// Delete from sent database\n\t\t\t\t\tlet db = readSmsDb(config.sms_db_path, config_section);\n\t\t\t\t\tif (!db.sent)\n\t\t\t\t\t\tdb.sent = [];\n\t\t\t\t\t\n\t\t\t\t\toriginal_count = length(db.sent);\n\t\t\t\t\twarn(`delete_sms: sent DB has ${original_count} messages\\n`);\n\t\t\t\t\t\n\t\t\t\t\tlet new_sent = [];\n\t\t\t\t\t\n\t\t\t\t\tfor (let sms in db.sent) {\n\t\t\t\t\t\tlet should_delete = false;\n\t\t\t\t\t\tfor (let id in ids_to_delete) {\n\t\t\t\t\t\t\tif (sms.id == id) {\n\t\t\t\t\t\t\t\tshould_delete = true;\n\t\t\t\t\t\t\t\tdeleted_count++;\n\t\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (!should_delete) {\n\t\t\t\t\t\t\tpush(new_sent, sms);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tdb.sent = new_sent;\n\t\t\t\t\twriteSmsDb(config.sms_db_path, config_section, db);\n\t\t\t\t} else {\n\t\t\t\t\treturn { error: 'Invalid message type' };\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twarn(`delete_sms: Deleted ${deleted_count} messages\\n`);\n\t\t\t\t\n\t\t\t\treturn { \n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tdeleted: deleted_count\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t\n\t\t// Mark SMS as read by ID(s)\n\t\tmark_read: {\n\t\t\targs: {\n\t\t\t\tconfig_section: \"\",\n\t\t\t\tids: []\n\t\t\t},\n\t\t\tcall: function(request) {\n\t\t\t\tlet config_section = request.args.config_section;\n\t\t\t\tlet config = getModemConfig(config_section);\n\t\t\t\tif (!config)\n\t\t\t\t\treturn { error: 'Failed to get modem configuration' };\n\t\t\t\t\n\t\t\t\tif (!request.args.ids)\n\t\t\t\t\treturn { error: 'Missing message IDs' };\n\t\t\t\t\n\t\t\t\t// Convert ids to array if it's not already\n\t\t\t\tlet ids_to_mark = [];\n\t\t\t\tif (type(request.args.ids) == 'array') {\n\t\t\t\t\tids_to_mark = request.args.ids;\n\t\t\t\t} else {\n\t\t\t\t\tpush(ids_to_mark, request.args.ids);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Mark messages as read in database\n\t\t\t\tlet db = readReceivedSmsDb(config.sms_db_path, config_section);\n\t\t\t\tif (!db.received)\n\t\t\t\t\tdb.received = [];\n\t\t\t\t\n\t\t\t\tlet marked_count = 0;\n\t\t\t\tfor (let sms in db.received) {\n\t\t\t\t\tfor (let id in ids_to_mark) {\n\t\t\t\t\t\tif (sms.id == id && !sms.is_read) {\n\t\t\t\t\t\t\tsms.is_read = true;\n\t\t\t\t\t\t\tmarked_count++;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twriteReceivedSmsDb(config.sms_db_path, config_section, db);\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tmarked: marked_count\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t\n\t\t// Mark SMS as forwarded by ID(s)\n\t\tmark_forwarded: {\n\t\t\targs: {\n\t\t\t\tconfig_section: \"\",\n\t\t\t\tids: []\n\t\t\t},\n\t\t\tcall: function(request) {\n\t\t\t\tlet config_section = request.args.config_section;\n\t\t\t\tlet config = getModemConfig(config_section);\n\t\t\t\tif (!config)\n\t\t\t\t\treturn { error: 'Failed to get modem configuration' };\n\t\t\t\t\n\t\t\t\tif (!request.args.ids)\n\t\t\t\t\treturn { error: 'Missing message IDs' };\n\t\t\t\t\n\t\t\t\t// Convert ids to array if it's not already\n\t\t\t\tlet ids_to_mark = [];\n\t\t\t\tif (type(request.args.ids) == 'array') {\n\t\t\t\t\tids_to_mark = request.args.ids;\n\t\t\t\t} else {\n\t\t\t\t\tpush(ids_to_mark, request.args.ids);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\t// Mark messages as forwarded in database\n\t\t\t\tlet db = readReceivedSmsDb(config.sms_db_path, config_section);\n\t\t\t\tif (!db.received)\n\t\t\t\t\tdb.received = [];\n\t\t\t\t\n\t\t\t\tlet marked_count = 0;\n\t\t\t\tfor (let sms in db.received) {\n\t\t\t\t\tfor (let id in ids_to_mark) {\n\t\t\t\t\t\tif (sms.id == id && !sms.forwarded) {\n\t\t\t\t\t\t\tsms.forwarded = true;\n\t\t\t\t\t\t\tmarked_count++;\n\t\t\t\t\t\t\tbreak;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\twriteReceivedSmsDb(config.sms_db_path, config_section, db);\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tmarked: marked_count\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t\n\t\t// Get sent SMS history\n\t\tget_sent_history: {\n\t\t\targs: {\n\t\t\t\tconfig_section: \"\"\n\t\t\t},\n\t\t\tcall: function(request) {\n\t\t\t\tlet config_section = request.args.config_section;\n\t\t\t\tlet config = getModemConfig(config_section);\n\t\t\t\tif (!config)\n\t\t\t\t\treturn { error: 'Failed to get modem configuration' };\n\t\t\t\t\n\t\t\t\tlet db = readSmsDb(config.sms_db_path, config_section);\n\t\t\t\treturn {\n\t\t\t\t\tsent: db.sent || [],\n\t\t\t\t\ttotal: length(db.sent || [])\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t\n\t\t// Clear sent SMS history\n\t\tclear_sent_history: {\n\t\t\targs: {\n\t\t\t\tconfig_section: \"\"\n\t\t\t},\n\t\t\tcall: function(request) {\n\t\t\t\tlet config_section = request.args.config_section;\n\t\t\t\tlet config = getModemConfig(config_section);\n\t\t\t\tif (!config)\n\t\t\t\t\treturn { error: 'Failed to get modem configuration' };\n\t\t\t\t\n\t\t\t\tlet db = { sent: [], next_id: 1 };\n\t\t\t\twriteSmsDb(config.sms_db_path, config_section, db);\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t\n\t\t// Get received SMS history\n\t\tget_received_history: {\n\t\t\targs: {\n\t\t\t\tconfig_section: \"\"\n\t\t\t},\n\t\t\tcall: function(request) {\n\t\t\t\tlet config_section = request.args.config_section;\n\t\t\t\tlet config = getModemConfig(config_section);\n\t\t\t\tif (!config)\n\t\t\t\t\treturn { error: 'Failed to get modem configuration' };\n\t\t\t\t\n\t\t\t\tlet db = readReceivedSmsDb(config.sms_db_path, config_section);\n\t\t\t\treturn {\n\t\t\t\t\treceived: db.received || [],\n\t\t\t\t\ttotal: length(db.received || [])\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t\n\t\t// Clear received SMS history\n\t\tclear_received_history: {\n\t\t\targs: {\n\t\t\t\tconfig_section: \"\"\n\t\t\t},\n\t\t\tcall: function(request) {\n\t\t\t\tlet config_section = request.args.config_section;\n\t\t\t\tlet config = getModemConfig(config_section);\n\t\t\t\tif (!config)\n\t\t\t\t\treturn { error: 'Failed to get modem configuration' };\n\t\t\t\t\n\t\t\t\tlet db = { received: [], next_id: 1 };\n\t\t\t\twriteReceivedSmsDb(config.sms_db_path, config_section, db);\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t\n\t\t// Get SMS storage capabilities\n\t\tget_sms_storage: {\n\t\t\targs: {\n\t\t\t\tconfig_section: \"\"\n\t\t\t},\n\t\t\tcall: function(request) {\n\t\t\t\tlet config_section = request.args.config_section;\n\t\t\t\tlet config = getModemConfig(config_section);\n\t\t\t\tif (!config)\n\t\t\t\t\treturn { error: 'Failed to get modem configuration' };\n\t\t\t\t\n\t\t\t\t// Execute AT+CPMS? to query SMS storage\n\t\t\t\tlet response = execAtCommand(config.at_port, config.use_ubus, 'AT+CPMS?');\n\t\t\t\t\n\t\t\t\tif (!response)\n\t\t\t\t\treturn { error: 'Failed to query SMS storage' };\n\t\t\t\t\n\t\t\t\t// Parse the response\n\t\t\t\tlet storage = parseCpmsResponse(response);\n\t\t\t\t\n\t\t\t\tif (!storage)\n\t\t\t\t\treturn { error: 'Failed to parse SMS storage response' };\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tstorage: storage\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t\n\t\t// Set SMS storage\n\t\tset_sms_storage: {\n\t\t\targs: {\n\t\t\t\tconfig_section: \"\",\n\t\t\t\tmem1: \"\",\n\t\t\t\tmem2: \"\",\n\t\t\t\tmem3: \"\"\n\t\t\t},\n\t\t\tcall: function(request) {\n\t\t\t\tlet config_section = request.args.config_section;\n\t\t\t\tlet config = getModemConfig(config_section);\n\t\t\t\tif (!config)\n\t\t\t\t\treturn { error: 'Failed to get modem configuration' };\n\t\t\t\t\n\t\t\t\tlet mem1 = request.args.mem1;\n\t\t\t\tlet mem2 = request.args.mem2;\n\t\t\t\tlet mem3 = request.args.mem3;\n\t\t\t\t\n\t\t\t\tif (!mem1 || !mem2)\n\t\t\t\t\treturn { error: 'Missing mem1 or mem2 parameter' };\n\t\t\t\t\n\t\t\t\t// Build AT+CPMS command\n\t\t\t\tlet at_cmd = `AT+CPMS=\"${mem1}\",\"${mem2}\"`;\n\t\t\t\tif (mem3 && mem3 != 'Loading')\n\t\t\t\t\tat_cmd += `,\"${mem3}\"`;\n\t\t\t\t\n\t\t\t\t// Execute the command\n\t\t\t\tlet response = execAtCommand(config.at_port, config.use_ubus, at_cmd);\n\t\t\t\t\n\t\t\t\tif (!response)\n\t\t\t\t\treturn { error: 'Failed to set SMS storage' };\n\t\t\t\t\n\t\t\t\t// Check if command was successful (look for OK in response)\n\t\t\t\tlet success = index(response, 'OK') >= 0;\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: success,\n\t\t\t\t\tresponse: response\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t\n\t\t// Get SMS directly from SIM card (without database processing)\n\t\tget_sim_sms: {\n\t\t\targs: {\n\t\t\t\tconfig_section: \"\"\n\t\t\t},\n\t\t\tcall: function(request) {\n\t\t\t\tlet config_section = request.args.config_section;\n\t\t\t\tlet config = getModemConfig(config_section);\n\t\t\t\tif (!config)\n\t\t\t\t\treturn { error: 'Failed to get modem configuration' };\n\t\t\t\t\n\t\t\t\t// Read SMS from SIM card directly\n\t\t\t\tlet result = execTomModem(config.at_port, config.use_ubus, 'r', null);\n\t\t\t\t\n\t\t\t\tif (!result)\n\t\t\t\t\treturn { error: 'Failed to read SMS from SIM card' };\n\t\t\t\t\n\t\t\t\t// Return raw messages from SIM\n\t\t\t\tlet messages = result?.received || result?.msg || [];\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: true,\n\t\t\t\t\tmessages: messages,\n\t\t\t\t\ttotal: length(messages)\n\t\t\t\t};\n\t\t\t}\n\t\t},\n\t\t\n\t\t// Delete SMS from SIM card by index\n\t\tdelete_sim_sms: {\n\t\t\targs: {\n\t\t\t\tconfig_section: \"\",\n\t\t\t\tindex: 0\n\t\t\t},\n\t\t\tcall: function(request) {\n\t\t\t\tlet config_section = request.args.config_section;\n\t\t\t\tlet config = getModemConfig(config_section);\n\t\t\t\tif (!config)\n\t\t\t\t\treturn { error: 'Failed to get modem configuration' };\n\t\t\t\t\n\t\t\t\tlet index = request.args.index;\n\t\t\t\tif (index == null || index < 0)\n\t\t\t\t\treturn { error: 'Invalid SMS index' };\n\t\t\t\t\n\t\t\t\t// Delete SMS from SIM card\n\t\t\t\tlet result = execTomModem(config.at_port, config.use_ubus, 'd', { index: index });\n\t\t\t\t\n\t\t\t\t// Check if deletion was successful\n\t\t\t\t// tom_modem returns {\"status\":\"success\"} on success\n\t\t\t\tlet success = (result?.status === 'success');\n\t\t\t\t\n\t\t\t\treturn {\n\t\t\t\t\tsuccess: success,\n\t\t\t\t\tresult: result\n\t\t\t\t};\n\t\t\t}\n\t\t}\n\t}\n};\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-sms/Makefile",
    "content": "# Copyright (C) 2023 Siriling <siriling@qq.com>\n# This is free software, licensed under the GNU General Public License v3.\n\ninclude $(TOPDIR)/rules.mk\n\n# Include unified version\ninclude ../../version.mk\n\nPKG_NAME:=luci-app-qmodem-sms\nLUCI_TITLE:=Luci qwrt modem sms support\nPKG_VERSION:=$(QMODEM_VERSION)\nLUCI_PKGARCH:=all\nPKG_LICENSE:=GPLv3\nPKG_LINCESE_FILES:=LICENSE\nPKG_MAINTAINER:=Tom <fjrcn@outlook.com>\nLUCI_DEPENDS:=+luci-app-qmodem +sms-forwarder\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-sms/luasrc/controller/qmodem_sms.lua",
    "content": "module(\"luci.controller.qmodem_sms\", package.seeall)\nlocal http = require \"luci.http\"\nlocal fs = require \"nixio.fs\"\nlocal json = require(\"luci.jsonc\")\nlocal modem_ctrl = \"/usr/share/qmodem/modem_ctrl.sh \"\n\nfunction shell(command)\n\tlocal odpall = io.popen(command)\n\tlocal odp = odpall:read(\"*a\")\n\todpall:close()\n\treturn odp\nend\n\nfunction index()\n    --sim卡配置\n\tentry({\"admin\", \"modem\", \"qmodem\", \"modem_sms\"},template(\"modem_sms/modem_sms\"), luci.i18n.translate(\"SMS\"), 11).leaf = true\n\tentry({\"admin\", \"modem\", \"qmodem\", \"send_sms\"}, call(\"sendSMS\"), nil).leaf = true\n\tentry({\"admin\", \"modem\", \"qmodem\", \"get_sms\"}, call(\"getSMS\"), nil).leaf = true\n\tentry({\"admin\", \"modem\", \"qmodem\", \"delete_sms\"}, call(\"delSMS\"), nil).leaf = true\n\tentry({\"admin\", \"modem\", \"qmodem\", \"sms_forward\"}, cbi(\"qmodem_sms/sms_forward\"), luci.i18n.translate(\"SMS Forward\"), 12).leaf = true\n\tentry({\"admin\", \"modem\", \"qmodem\", \"sms_forward_extedit\"}, cbi(\"qmodem_sms/sms_forward_extedit\")).leaf = true\nend\n\nfunction getSMS()\n    local cfg_id = http.formvalue(\"cfg\")\n    response = shell(modem_ctrl .. \"get_sms \" .. cfg_id)\n    http.prepare_content(\"application/json\")\n    http.write(response)\nend\n\nfunction sendSMS()\n\tlocal cfg_id = http.formvalue(\"cfg\")\n\tlocal pdu = http.formvalue(\"pdu\")\n\tif pdu then\n\t\tresponse = shell(modem_ctrl .. \"send_raw_pdu \" .. cfg_id .. \" \\\"\" .. pdu .. \"\\\"\")\n\telse\n\t\tlocal phone_number = http.formvalue(\"phone_number\")\n\t\tlocal message_content = http.formvalue(\"message_content\")\n\t\tjson_cmd = string.format('{\\\\\"phone_number\\\\\":\\\\\"%s\\\\\",\\\\\"message_content\\\\\":\\\\\"%s\\\\\"}', phone_number, message_content)\n\t\tresponse = shell(modem_ctrl .. \"send_sms \" .. cfg_id ..\" \\\"\".. json_cmd .. \"\\\"\")\n\t\t\n\tend\n\thttp.prepare_content(\"application/json\")\n\t\thttp.write(response)\nend\n\nfunction delSMS()\n\tlocal cfg_id = http.formvalue(\"cfg\")\n\tlocal index = http.formvalue(\"index\")\n\tresponse = shell(modem_ctrl .. \"delete_sms \" .. cfg_id .. \" \\\"\" ..index..\"\\\"\")\n\thttp.prepare_content(\"application/json\")\n\thttp.write(response)\nend\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-sms/luasrc/model/cbi/qmodem_sms/sms_forward.lua",
    "content": "local uci = require \"luci.model.uci\".cursor()\nlocal dispatcher = require \"luci.dispatcher\"\nlocal fs = require \"nixio.fs\"\n\nm = Map(\"sms_daemon\", translate(\"SMS Forward Configuration\"))\nm.redirect = dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"sms_forward\")\n\n-- 添加说明信息\nm.description = translate(\"SMS Forward Daemon allows automatic forwarding of SMS messages to various APIs.\")\n\n\n-- 检查sms_forwarder守护进程是否存在\nlocal daemon_exists = fs.access(\"/usr/bin/sms_forwarder\")\nif not daemon_exists then\n    s_warning = m:section(SimpleSection)\n    s_warning.template = \"cbi/nullsection\" \n    local warning_html = \"<div class='alert-message warning'>\" ..\n        \"<strong>\" .. translate(\"Warning\") .. \":</strong> \" ..\n        translate(\"SMS Forwarder binary not found at /usr/bin/sms_forwarder. Please install the sms_forwarder package.\") ..\n        \"</div>\"\n    s_warning.render = function(self, section)\n        return warning_html\n    end\nend\n\n-- SMS转发总开关\ns = m:section(NamedSection, \"sms_forward\", \"sms_forward\", translate(\"SMS Forward Service\"))\ns.addremove = false\n\nenable = s:option(Flag, \"enable\", translate(\"Enable SMS Forward Service\"))\nenable.default = \"0\"\nenable.rmempty = false\nenable.description = translate(\"Enable the SMS forward daemon service. When enabled, the daemon will start automatically.\")\n\n-- 全局配置选项\nlog_level = s:option(ListValue, \"log_level\", translate(\"Log Level\"))\nlog_level:value(\"error\", translate(\"Error\"))\nlog_level:value(\"warning\", translate(\"Warning\"))  \nlog_level:value(\"info\", translate(\"Information\"))\nlog_level:value(\"debug\", translate(\"Debug\"))\nlog_level.default = \"info\"\nlog_level.description = translate(\"Set the logging verbosity level for the SMS daemon.\")\n\n-- SMS转发实例配置\ns2 = m:section(TypedSection, \"sms_forward_instance\", translate(\"SMS Forward Instances\"))\ns2.addremove = true\ns2.anonymous = false\ns2.template = \"cbi/tblsection\"\ns2.extedit = dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"sms_forward_extedit\", \"%s\")\ns2.description = translate(\"Configure multiple SMS forward instances. Each instance can monitor a different modem port and forward to different APIs.\")\n\n-- 实例启用开关\ninstance_enable = s2:option(Flag, \"enable\", translate(\"Enable\"))\ninstance_enable.width = \"8%\"\ninstance_enable.default = \"0\"\n\n-- 监听端口\nlisten_port = s2:option(ListValue, \"listen_port\", translate(\"Modem Port\"))\nlisten_port.width = \"18%\"\nlisten_port.rmempty = false\n\n-- 获取可用的AT端口\nuci:foreach(\"qmodem\", \"modem-device\", function(section)\n    local ports = section.ports or {}\n    local valid_ports = section.valid_at_ports or {}\n    \n    if type(ports) == \"table\" then\n        for _, port in ipairs(ports) do\n            local valid = false\n            if type(valid_ports) == \"table\" then\n                for _, valid_port in ipairs(valid_ports) do\n                    if port == valid_port then\n                        valid = true\n                        break\n                    end\n                end\n            end\n            \n            local display_name = port\n            if valid then\n                display_name = port .. \" (\" .. translate(\"VALID\") .. \")\"\n            else\n                display_name = port .. \" (\" .. translate(\"INVALID\") .. \")\"\n            end\n            listen_port:value(port, display_name)\n        end\n    end\nend)\n\n-- 如果没有找到端口，添加常见的端口选项\nif next(listen_port.keylist) == nil then\n    for i = 0, 7 do\n        listen_port:value(\"/dev/ttyUSB\" .. i, \"/dev/ttyUSB\" .. i)\n    end\n    for i = 0, 3 do\n        listen_port:value(\"/dev/ttyACM\" .. i, \"/dev/ttyACM\" .. i)\n    end\nend\n\n-- 轮询间隔\npoll_interval = s2:option(Value, \"poll_interval\", translate(\"Poll Interval\"))\npoll_interval.width = \"12%\"\npoll_interval.datatype = \"range(15,600)\"\npoll_interval.default = \"30\"\npoll_interval.description = translate(\"Polling interval in seconds (15-600)\")\n\n-- API类型\napi_type = s2:option(ListValue, \"api_type\", translate(\"API Type\"))\napi_type.width = \"15%\"\napi_type:value(\"tgbot\", translate(\"Telegram Bot\"))\napi_type:value(\"webhook\", translate(\"Webhook\"))\napi_type:value(\"serverchan\", translate(\"ServerChan\"))\napi_type:value(\"pushdeer\", translate(\"PushDeer\"))\napi_type:value(\"custom_script\", translate(\"Custom Script\"))\napi_type:value(\"feishu\", translate(\"Feishu Bot\"))\n\n-- 删除已转发短信选项\ndelete_after_forward = s2:option(Flag, \"delete_after_forward\", translate(\"Delete After Forward\"))\ndelete_after_forward.width = \"12%\"\ndelete_after_forward.default = \"0\"\ndelete_after_forward.description = translate(\"Delete SMS messages from modem after successful forwarding\")\n\nif fs.stat(\"/tmp/sms_forwarder_combined.json\") then\n--读取 /tmp/sms_forwarder_combined.json 的内容并展示（只读）\n    c = s:option(TextValue, \"_c\", translate(\"SMS Forwarder Configuration\"))\n    c.readonly = true\n    c.rows = 15\n\n    v = fs.readfile(\"/tmp/sms_forwarder_combined.json\")\n    c.cfgvalue = function()\n        return v\n    end\nend\nreturn m\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-sms/luasrc/model/cbi/qmodem_sms/sms_forward_extedit.lua",
    "content": "local uci = require \"luci.model.uci\".cursor()\nlocal dispatcher = require \"luci.dispatcher\"\nlocal fs = require \"nixio.fs\"\nlocal json = require \"luci.jsonc\"\n\n\n\nm = Map(\"sms_daemon\", translate(\"SMS Forward Advanced Configuration\"))\nm.redirect = dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"sms_forward\")\n\n-- 添加说明信息\nm.description = translate(\"Advanced SMS Forward configuration with type-specific options.\")\n\n-- SMS转发实例配置\ns2 = m:section(NamedSection, arg[1], \"sms_forward_instance\",translate(\"SMS Forward Instances\"))\ns2.addremove = true\ns2.anonymous = false\n\n-- 实例启用开关\ninstance_enable = s2:option(Flag, \"enable\", translate(\"Enable\"))\ninstance_enable.default = \"0\"\n\n-- 监听端口\nlisten_port = s2:option(ListValue, \"listen_port\", translate(\"Modem Port\"))\nlisten_port.rmempty = false\n\n-- 获取可用的AT端口\nuci:foreach(\"qmodem\", \"modem-device\", function(section)\n    local ports = section.ports or {}\n    local valid_ports = section.valid_at_ports or {}\n    \n    if type(ports) == \"table\" then\n        for _, port in ipairs(ports) do\n            local valid = false\n            if type(valid_ports) == \"table\" then\n                for _, valid_port in ipairs(valid_ports) do\n                    if port == valid_port then\n                        valid = true\n                        break\n                    end\n                end\n            end\n            \n            local display_name = port\n            if valid then\n                display_name = port .. \" (\" .. translate(\"VALID\") .. \")\"\n            else\n                display_name = port .. \" (\" .. translate(\"INVALID\") .. \")\"\n            end\n            listen_port:value(port, display_name)\n        end\n    end\nend)\n\n-- 如果没有找到端口，添加常见的端口选项\nif next(listen_port.keylist) == nil then\n    for i = 0, 7 do\n        listen_port:value(\"/dev/ttyUSB\" .. i, \"/dev/ttyUSB\" .. i)\n    end\n    for i = 0, 3 do\n        listen_port:value(\"/dev/ttyACM\" .. i, \"/dev/ttyACM\" .. i)\n    end\nend\n\n-- 轮询间隔\npoll_interval = s2:option(Value, \"poll_interval\", translate(\"Poll Interval\"))\npoll_interval.datatype = \"range(15,600)\"\npoll_interval.default = \"30\"\npoll_interval.description = translate(\"Polling interval in seconds (15-600)\")\n\n-- API类型\napi_type = s2:option(ListValue, \"api_type\", translate(\"API Type\"))\napi_type:value(\"tgbot\", translate(\"Telegram Bot\"))\napi_type:value(\"webhook\", translate(\"Webhook\"))\napi_type:value(\"serverchan\", translate(\"ServerChan\"))\napi_type:value(\"pushdeer\", translate(\"PushDeer\"))\napi_type:value(\"custom_script\", translate(\"Custom Script\"))\napi_type:value(\"feishu\", translate(\"Feishu Bot\"))\n\n-- 删除已转发短信选项\ndelete_after_forward = s2:option(Flag, \"delete_after_forward\", translate(\"Delete After Forward\"))\ndelete_after_forward.default = \"0\"\ndelete_after_forward.description = translate(\"Delete SMS messages from modem after successful forwarding. This helps keep the modem's SMS storage clean but messages will be permanently removed.\")\n\n-- Telegram Bot 配置\ntg_bot_token = s2:option(Value, \"tg_bot_token\", translate(\"Bot Token\"))\ntg_bot_token:depends(\"api_type\", \"tgbot\")\ntg_bot_token.placeholder = \"123456:ABC-DEF1234ghIkl\"\n\ntg_chat_id = s2:option(Value, \"tg_chat_id\", translate(\"Chat ID\"))\ntg_chat_id:depends(\"api_type\", \"tgbot\")\ntg_chat_id.placeholder = \"123456789\"\n\n-- Webhook 配置\nwebhook_url = s2:option(Value, \"webhook_url\", translate(\"Webhook URL\"))\nwebhook_url:depends(\"api_type\", \"webhook\")\nwebhook_url.placeholder = \"https://example.com/webhook\"\nwebhook_url.description = translate(\"URL of the webhook endpoint(Also supports placeholders:\" ) .. \"{SENDER}, {CONTENT}, {TIME})\" .. translate(\" and need to be URL encoded)\")\n\nwebhook_headers = s2:option(Value, \"webhook_headers\", translate(\"Headers (optional)\"))\nwebhook_headers:depends(\"api_type\", \"webhook\")\nwebhook_headers.placeholder = \"Authorization: Bearer token\"\n\nwebhook_format = s2:option(Value, \"webhook_format\", translate(\"Message Format (optional)\"))\nwebhook_format:depends(\"api_type\", \"webhook\")\nwebhook_format.placeholder = \"{SENDER}/{CONTENT}({TIME})\"\nwebhook_format.description = translate(\"Custom message format using placeholders:\") .. \" {SENDER}, {CONTENT}, {TIME}\"\nwebhook_request_method = s2:option(ListValue, \"webhook_request_method\", translate(\"Request Method\"))\nwebhook_request_method:depends(\"api_type\", \"webhook\")\nwebhook_request_method:value(\"GET\", \"GET\")\nwebhook_request_method:value(\"POST\", \"POST\")\n\n-- ServerChan 配置\nserverchan_token = s2:option(Value, \"serverchan_token\", translate(\"Token\"))\nserverchan_token:depends(\"api_type\", \"serverchan\")\nserverchan_token.placeholder = \"SCT123456TCxyz...\"\nserverchan_token.description = translate(\"ServerChan API token from https://sctapi.ftqq.com\")\n\nserverchan_channel = s2:option(Value, \"serverchan_channel\", translate(\"Channel (optional)\"))\nserverchan_channel:depends(\"api_type\", \"serverchan\")\nserverchan_channel.placeholder = \"9|66\"\nserverchan_channel.description = translate(\"Message channel, use | to separate multiple channels\")\n\nserverchan_noip = s2:option(Flag, \"serverchan_noip\", translate(\"Hide IP\"))\nserverchan_noip:depends(\"api_type\", \"serverchan\")\nserverchan_noip.description = translate(\"Hide caller IP address\")\n\nserverchan_openid = s2:option(Value, \"serverchan_openid\", translate(\"OpenID (optional)\"))\nserverchan_openid:depends(\"api_type\", \"serverchan\")\nserverchan_openid.placeholder = \"openid1,openid2\"\nserverchan_openid.description = translate(\"OpenID for message forwarding, use comma to separate multiple IDs\")\n\n-- PushDeer 配置\npushdeer_push_key = s2:option(Value, \"pushdeer_push_key\", translate(\"Push Key\"))\npushdeer_push_key:depends(\"api_type\", \"pushdeer\")\npushdeer_push_key.placeholder = \"PDU123456T...\"\npushdeer_push_key.description = translate(\"PushDeer Push Key from http://pushdeer.com\")\n\npushdeer_endpoint = s2:option(Value, \"pushdeer_endpoint\", translate(\"API Endpoint (optional)\"))\npushdeer_endpoint:depends(\"api_type\", \"pushdeer\")\npushdeer_endpoint.placeholder = \"https://api2.pushdeer.com\"\npushdeer_endpoint.description = translate(\"Custom PushDeer API endpoint, leave empty to use default\")\n\nfeishu_webhook_key = s2:option(Value, \"feishu_webhook_key\", translate(\"Feishu Webhook Key\"))\nfeishu_webhook_key:depends(\"api_type\", \"feishu\")\nfeishu_webhook_key.placeholder = \"xxxxxx\"\nfeishu_webhook_key.description = translate(\"Feishu Webhook Key from your Feishu bot configuration\")\n\n\n-- Custom Script 配置\ncustom_script_path = s2:option(Value, \"custom_script_path\", translate(\"Script Path\"))\ncustom_script_path:depends(\"api_type\", \"custom_script\")\ncustom_script_path.placeholder = \"/usr/bin/my_sms_script.sh\"\n\nreturn m\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-sms/luasrc/view/modem_sms/modem_sms.htm",
    "content": "<%+header%>\n<script>\nvar pduParser = {};\n\npduParser.parse = function(pdu) {\n    //Cursor points to the last octet we've read.\n    var cursor = 0;\n\n    var buffer = new Buffer(pdu.slice(0,4), 'hex');\n    var smscSize = buffer[0];\n    var smscType = buffer[1].toString(16);\n    cursor = (smscSize*2+2);\n    var smscNum  = pduParser.deSwapNibbles(pdu.slice(4, cursor));\n\n    var buffer = new Buffer(pdu.slice(cursor,cursor+6), 'hex');\n    cursor += 6;\n    var smsDeliver = buffer[0];\n\n    var smsDeliverBits = (\"00000000\"+parseInt(smsDeliver).toString(2)).slice(-8);\n    var udhi = smsDeliverBits.slice(1,2) === \"1\";\n\n    var senderSize = buffer[1];\n    if(senderSize % 2 === 1)\n        senderSize++;\n\n    var senderType = parseInt(buffer[2]).toString(16)\n\n    var encodedSender = pdu.slice(cursor, cursor + senderSize);\n    var senderNum;\n    if (senderType === '91') {\n        senderNum = pduParser.deSwapNibbles(encodedSender);\n    } else if (senderType === 'd0') {\n        senderNum = this.decode7Bit(encodedSender).replace(/\\0/g, '');\n    } else {\n        console.error('unsupported sender type.');\n    }\n\n    cursor += senderSize;\n\n    var protocolIdentifier = pdu.slice(cursor, cursor+2);\n    cursor += 2;\n\n    var dataCodingScheme = pdu.slice(cursor, cursor+2);\n    cursor = cursor+2;\n\n    var encoding = pduParser.detectEncoding(dataCodingScheme);\n\n    var timestamp = pduParser.deSwapNibbles(pdu.slice(cursor, cursor+14));\n\n\n    var time = new Date;\n    time.setUTCFullYear('20'+timestamp.slice(0,2));\n    time.setUTCMonth(timestamp.slice(2,4)-1);\n    time.setUTCDate(timestamp.slice(4,6));\n    time.setUTCHours(timestamp.slice(6,8));\n    time.setUTCMinutes(timestamp.slice(8,10));\n    time.setUTCSeconds(timestamp.slice(10,12));\n\n    var firstTimezoneOctet = parseInt(timestamp.slice(12,13));\n    var binary = (\"0000\"+firstTimezoneOctet.toString(2)).slice(-4);\n    var factor = binary.slice(0,1) === '1' ? 1 : -1;\n    var binary = '0'+binary.slice(1, 4);\n    var firstTimezoneOctet = parseInt(binary, 2).toString(10);\n    var timezoneDiff = parseInt(firstTimezoneOctet + timestamp.slice(13, 14));\n    var time = new Date(time.getTime() + (timezoneDiff * 15 * 1000 * 60 * factor));\n\n    cursor += 14;\n\n    var dataLength = parseInt(pdu.slice(cursor, cursor+2), 16).toString(10);\n    cursor += 2;\n\n    if(udhi) { //User-Data-Header-Indicator: means there's some User-Data-Header.\n        var udhLength = pdu.slice(cursor, cursor+2);\n        var iei = pdu.slice(cursor+2, cursor+4);\n        if(iei == \"00\") { //Concatenated sms.\n            var headerLength = pdu.slice(cursor+4, cursor+6);\n            var referenceNumber = pdu.slice(cursor+6, cursor+8);\n            var parts = pdu.slice(cursor+8, cursor+10);\n            var currentPart = pdu.slice(cursor+10, cursor+12);\n        }\n\n        if(iei == \"08\") { //Concatenaded sms with a two-bytes reference number\n            var headerLength = pdu.slice(cursor+4, cursor+6);\n            var referenceNumber = pdu.slice(cursor+6, cursor+10);\n            var parts = pdu.slice(cursor+10, cursor+12);\n            var currentPart = pdu.slice(cursor+12, cursor+14);\n        }\n\n        if(encoding === '16bit')\n            if(iei == '00')\n                cursor += (udhLength-2)*4;\n            else if(iei == '08')\n                cursor += ((udhLength-2)*4)+2;\n        else\n            cursor += (udhLength-2)*2;\n    }\n\n    if(encoding === '16bit')\n        var text = pduParser.decode16Bit(pdu.slice(cursor), dataLength);\n    else if(encoding === '7bit')\n        var text = pduParser.decode7Bit(pdu.slice(cursor), dataLength);\n    else if(encoding === '8bit')\n        var text = ''; //TODO\n\n    var data = {\n        'smsc' : smscNum,\n        'smsc_type' : smscType,\n        'sender' : senderNum,\n        'sender_type' : senderType,\n        'encoding' : encoding,\n        'time' : time,\n        'text' : text\n    };\n\n    if(udhi) {\n        data['udh'] = {\n            'length' : udhLength,\n            'iei' : iei,\n        };\n\n        if(iei == '00' || iei == '08') {\n            data['udh']['reference_number'] = referenceNumber;\n            data['udh']['parts'] = parseInt(parts);\n            data['udh']['current_part'] = parseInt(currentPart);\n        }\n    }\n\n    return data;\n}\n\npduParser.detectEncoding = function(dataCodingScheme) {\n    var binary = ('00000000'+(parseInt(dataCodingScheme, 16).toString(2))).slice(-8);\n\n    if(binary == '00000000')\n        return '7bit';\n\n    if(binary.slice(0, 2) === '00') {\n        var compressed = binary.slice(2, 1) === '1';\n        var bitsHaveMeaning = binary.slice(3, 1) === '1';\n\n        if(binary.slice(4,6) === '00')\n            return '7bit';\n\n        if(binary.slice(4,6) === '01')\n            return '8bit';\n\n        if(binary.slice(4,6) === '10')\n            return '16bit';\n    }\n}\n\npduParser.decode16Bit = function(data, length) {\n    //We are getting ucs2 characters.\n    var ucs2 = '';\n    for(var i = 0;i<=data.length;i=i+4) {\n        ucs2 += String.fromCharCode(\"0x\"+data[i]+data[i+1]+data[i+2]+data[i+3]);\n    }\n\n    return ucs2;\n}\n\npduParser.deSwapNibbles = function(nibbles) {\n    var out = '';\n    for(var i = 0; i< nibbles.length; i=i+2) {\n        if(nibbles[i] === 'F') //Dont consider trailing F.\n            out += parseInt(nibbles[i+1], 16).toString(10);\n        else\n            out += parseInt(nibbles[i+1], 16).toString(10)+parseInt(nibbles[i], 16).toString(10);\n    }\n    return out;\n}\n\npduParser.decode7Bit = function(code, count) {\n    //We are getting 'septeps'. We should decode them.\n    var binary = '';\n    for(var i = 0; i<code.length;i++)\n        binary += ('0000'+parseInt(code.slice(i,i+1), 16).toString(2)).slice(-4);\n\n    var bin = Array();\n    var cursor = 0;\n    var fromPrevious = '';\n    var i = 0;\n    while(binary[i]) {\n        var remaining = 7 - fromPrevious.length;\n        var toNext = 8 - remaining;\n        bin[i] = binary.slice(cursor+toNext, cursor+toNext+remaining) + fromPrevious;\n        var fromPrevious = binary.slice(cursor, cursor+toNext);\n        if(toNext === 8)\n            fromPrevious = '';\n        else\n            cursor += 8;\n        i++;\n    }\n\n    var ascii = '';\n    for(i in bin)\n        ascii += String.fromCharCode(parseInt(bin[i], 2));\n\n    return ascii;\n}\n\npduParser.encode7Bit = function(ascii) {\n    //We should create septeps now.\n    var octets = new Array();\n    for(var i = 0; i<ascii.length; i++)\n        octets.push(('0000000'+(ascii.charCodeAt(i).toString(2))).slice(-7));\n\n    for(var i in octets) {\n        var i = parseInt(i);\n        var freeSpace = 8 - octets[i].length;\n\n        if(octets[i+1] && freeSpace !== 8) {\n            octets[i] = octets[i+1].slice(7-freeSpace) + octets[i];\n            octets[i+1] = octets[i+1].slice(0, 7-freeSpace);\n        }\n    }\n\n    var hex = '';\n    for(i in octets)\n        if(octets[i].length > 0)\n            hex += ('00'+(parseInt(octets[i], 2).toString(16))).slice(-2);\n    return hex;\n}\n\n//TODO: TP-Validity-Period (Delivery)\npduParser.generate = function(message) {\n    var pdu = '00';\n\n    var parts = 1;\n    if(message.encoding === '16bit' && message.text.length > 70)\n        parts = message.text.length / 66;\n\n    else if(message.encoding === '7bit' && message.text.length > 160)\n        parts = message.text.length / 153;\n\n    parts = Math.ceil(parts);\n\n    TPMTI  = 1;\n    TPRD   = 4;\n    TPVPF  = 8;\n    TPSRR  = 32;\n    TPUDHI = 64;\n    TPRP   = 128;\n\n    var submit = TPMTI;\n\n    if(parts > 1) //UDHI\n        submit = submit | TPUDHI;\n\n    submit = submit | TPSRR;\n\n    pdu += submit.toString(16);\n\n    pdu += '00'; //TODO: Reference Number;\n\n    var receiverSize = ('00'+(parseInt(message.receiver.length, 10).toString(16))).slice(-2);\n    var receiver = pduParser.swapNibbles(message.receiver);\n    var receiverType = 81; //TODO: NOT-Hardcoded PDU generation. Please note that Hamrah1 doesnt work if we set it to 91 (International).\n\n    pdu += receiverSize.toString(16) + receiverType + receiver;\n\n    pdu += '00'; //TODO TP-PID\n\n    if(message.encoding === '16bit')\n        pdu += '08';\n    else if(message.encoding === '7bit')\n        pdu += '00';\n\n    var pdus = new Array();\n\n    var csms = randomHexa(2); // CSMS allows to give a reference to a concatenated message\n\n    for(var i=0; i< parts; i++) {\n        pdus[i] = pdu;\n\n        if(message.encoding === '16bit') {\n            /* If there are more than one messages to be sent, we are going to have to put some UDH. Then, we would have space only\n             * for 66 UCS2 characters instead of 70 */\n            if(parts === 1)\n                var length = 70;\n            else\n                var length = 66;\n\n        } else if(message.encoding === '7bit') {\n            /* If there are more than one messages to be sent, we are going to have to put some UDH. Then, we would have space only\n             * for 153 ASCII characters instead of 160 */\n            if(parts === 1)\n                var length = 160;\n            else\n                var length = 153;\n        }\n        var text = message.text.slice(i*length, (i*length)+length);\n\n        if(message.encoding === '16bit') {\n            user_data = pduParser.encode16Bit(text);\n            var size = (user_data.length / 2);\n\n            if(parts > 1)\n                size += 6; //6 is the number of data headers we append.\n\n        } else if(message.encoding === '7bit') {\n            user_data = pduParser.encode7Bit(text);\n            var size = user_data.length / 2;\n        }\n\n        pdus[i] += ('00'+parseInt(size).toString(16)).slice(-2);\n\n        if(parts > 1) {\n            pdus[i] += '05';\n            pdus[i] += '00';\n            pdus[i] += '03';\n            pdus[i] +=  csms;\n            pdus[i] += ('00'+parts.toString(16)).slice(-2);\n            pdus[i] += ('00'+(i+1).toString(16)).slice(-2);\n        }\n        pdus[i] += user_data;\n    }\n\n    return pdus;\n}\n\n\npduParser.encode16Bit = function(text) {\n    var out = '';\n    for(var i = 0; i<text.length;i++) {\n        out += ('0000'+(parseInt(text.charCodeAt(i), 10).toString(16))).slice(-4);\n    }\n    return out;\n}\n\npduParser.swapNibbles = function(nibbles) {\n    var out = '';\n    for(var i = 0; i< nibbles.length; i=i+2) {\n        if(typeof(nibbles[i+1]) === 'undefined') // Add a trailing F.\n            out += 'F'+parseInt(nibbles[i], 16).toString(10);\n        else\n            out += parseInt(nibbles[i+1], 16).toString(10)+parseInt(nibbles[i], 16).toString(10);\n    }\n    return out;\n}\n\npduParser.parseStatusReport = function(pdu) {\n    //Cursor points to the last octet we've read.\n    var cursor = 0;\n\n    var smscSize = parseInt(pdu.slice(0, 2), 16);\n    cursor += 2;\n\n    var smscType = parseInt(pdu.slice(cursor, cursor+2), 16);\n    cursor += 2;\n\n    var smscNum  = pduParser.deSwapNibbles(pdu.slice(cursor, (smscSize*2)+2));\n    cursor = (smscSize*2+2);\n\n    var header = parseInt(pdu.slice(cursor,cursor+2));\n    cursor += 2;\n\n    var reference = parseInt(pdu.slice(cursor,cursor+2), 16);\n    cursor += 2;\n\n    var senderSize = parseInt(pdu.slice(cursor,cursor+2), 16);\n    if(senderSize % 2 === 1)\n        senderSize++;\n    cursor += 2;\n\n    var senderType = parseInt(pdu.slice(cursor,cursor+2));\n    cursor += 2;\n\n    var sender = pduParser.deSwapNibbles(pdu.slice(cursor, cursor+senderSize));\n\n    var status = pdu.slice(-2);\n\n    return {\n        smsc:smscNum,\n        reference:reference,\n        sender:sender,\n        status:status\n    }\n}\n\nfunction randomHexa(size)\n{\n    var text = \"\";\n    var possible = \"0123456789ABCDEF\";\n    for( var i=0; i < size; i++ )\n        text += possible.charAt(Math.floor(Math.random() * possible.length));\n    return text;\n}\n\n\nclass LuciTable{\n        constructor(){\n            this.rows = [];\n            this.tbody;\n            this.fieldset;\n            this.init_table();\n        }\n\n        init_table(){\n            //create a luci fieldset (class cbi-section)\n            var fieldset = document.createElement('fieldset');\n            fieldset.className=\"cbi-section\";\n            //set fieldset Header name\n            var legend = document.createElement('legend');\n            var title_span = document.createElement('span');\n            title_span.className=\"panel-title\"\n            //init table\n            var table = document.createElement('table');\n            var tbody = document.createElement('tbody');\n            table.className=\"table\"\n            //save\n            this.fieldset = fieldset;\n            this.tbody = tbody\n            this.title_span = title_span\n            this.legend = legend\n            \n            fieldset.appendChild(legend);\n            fieldset.appendChild(title_span);\n            table.appendChild(tbody)\n            fieldset.appendChild(table)\n        }\n\n        new_tr(data,index){\n            var type = data.type;\n            var col = data.col;\n            var left = data.left;\n            var right = data.right;\n            //clear the row\n            this.rows[index].left.innerHTML = \"\";\n            this.rows[index].right.innerHTML = \"\";\n            //set the row\n            this.rows[index].left.appendChild(left);\n            this.rows[index].right.appendChild(right);\n            if (right == null || right == \"\") {\n                this.rows[index].row.style.display = \"none\";\n            }\n            else{\n                this.rows[index].row.style.display = \"\";\n            }\n        }\n\n\n        set title(value){\n            this.legend.innerHTML = value;\n            this.title_span.innerHTML = value;\n        }\n\n        set object_data(value){\n            var row_length = this.rows.length;\n            var value_length = Object.keys(value).length;\n            if (row_length < value_length) {\n                for ( let i = row_length; i < value_length; i++) {\n                    let row = document.createElement('tr');\n                    row.className = \"tr\"\n                    let cell_left = document.createElement('td');\n                    cell_left.classList.add(\"td\")\n                    cell_left.setAttribute(\"width\",\"33%\")\n                    let cell_right = document.createElement('td');\n                    cell_right.classList.add(\"td\");\n                    row.appendChild(cell_left);\n                    row.appendChild(cell_right);\n                    this.tbody.appendChild(row);\n                    var row_dict = {\n                        \"row\":row,\n                        \"left\":cell_left,\n                        \"right\":cell_right,\n                    }\n                    this.rows.push(row_dict);\n                }\n            }\n            else if(row_length > value_length){\n                for (let i = value_length; i < row_length; i++) {\n                    this.tbody.removeChild(this.rows[i].row);\n                }\n                this.rows = this.rows.slice(0,value_length);\n            }\n            var index = 0;\n            for (var key in value) {\n                this.rows[index].left.innerHTML = key;\n                this.rows[index].right.innerHTML = value[key];\n                index++;\n            }\n        }\n        \n        set array_data(value){\n            var row_length = this.rows.length;\n            var value_length = value.length;\n            if (row_length < value_length) {\n                for ( let i = row_length; i < value_length; i++) {\n                    let row = document.createElement('tr');\n                    row.className = \"tr\"\n                    let cell_left = document.createElement('td');\n                    cell_left.classList.add(\"td\")\n                    cell_left.setAttribute(\"width\",\"33%\")\n                    let cell_right = document.createElement('td');\n                    cell_right.classList.add(\"sms_recv_content\")\n                    cell_right.classList.add(\"td\")\n                    row.appendChild(cell_left);\n                    row.appendChild(cell_right);\n                    this.tbody.appendChild(row);\n                    var row_dict = {\n                        \"row\":row,\n                        \"left\":cell_left,\n                        \"right\":cell_right,\n                    }\n                    this.rows.push(row_dict);\n                }\n            }\n            else if(row_length > value_length){\n                for (let i = value_length; i < row_length; i++) {\n                    this.tbody.removeChild(this.rows[i].row);\n                }\n                this.rows = this.rows.slice(0,value_length);\n            }\n            for (let i = 0; i < value.length; i++) {\n                this.new_tr(value[i],i);\n            }\n        }\n\n        set data(value){\n            if (value == null) {\n                return;\n            }\n            if (Array.isArray(value)) {\n                this.array_data = value;\n            }\n            else{\n                this.object_data = value;\n            }\n        }\n    }\n\nclass ModemSMS {\n    constructor() {\n        this.data = null;\n        this.cfg_id = null;\n        this.modem_cfg_list = [];\n        this.sms_recvbox_table = new LuciTable();\n        this.sms_send_table = new LuciTable();\n        this.sms_storage_table = new LuciTable();\n        this.sms_send_table.title = \"<%:Send SMS%>\";\n        this.cbi_map = document.querySelector('.cbi-map');\n        this.cbi_map.appendChild(this.sms_storage_table.fieldset);\n        this.cbi_map.appendChild(this.sms_recvbox_table.fieldset);\n        this.cbi_map.appendChild(this.sms_send_table.fieldset);\n        \n        this.modem_selector = document.getElementById('modem_selector');\n        this.create_modem_cfg_selector();\n        this.update_modem_cfg_list();\n        this.init_send_table_view();\n        this.init_msg_box();\n        this.init_sms_storage_table();\n    }\n\n    init_sms_storage_table() {\n    const createOption = (value, text, disabled = false, selected = false) => {\n        const opt = document.createElement('option');\n        opt.value = value;\n        opt.innerHTML = text;\n        opt.disabled = disabled;\n        opt.selected = selected;\n        return opt;\n    };\n\n    const reading_storage = document.createElement('select');\n    const writing_storage = document.createElement('select');\n    const etc_storage = document.createElement('select');\n    const set_storage_btn = document.createElement('input');\n    set_storage_btn.type = \"button\";\n    set_storage_btn.value = \"Set\";\n    set_storage_btn.onclick = () => this.set_sms_storage();\n\n    const opt_mt = createOption(\"ME\", \"<%: Mobile equipment message storage %>\");\n    const opt_sm = createOption(\"SM\", \"<%: (U)SIM message storage %>\");\n    const opt_loading = createOption(\"Loading\", \"<%: Loading... %>\", true, true);\n\n    const storages = [reading_storage, writing_storage, etc_storage];\n    storages.forEach(storage => {\n        storage.appendChild(opt_mt.cloneNode(true));\n        storage.appendChild(opt_sm.cloneNode(true));\n        storage.appendChild(opt_loading.cloneNode(true));\n        storage.options[2].selected = true;\n    });\n\n    const data = [\n        { \"col\": 2, \"left\": document.createTextNode(\"<%: Reading Storage%>\"), \"right\": reading_storage },\n        { \"col\": 2, \"left\": document.createTextNode(\"<%: Writing Storage%>\"), \"right\": writing_storage },\n        { \"col\": 2, \"left\": document.createTextNode(\"<%: ETC Storage%>\"), \"right\": etc_storage },\n        { \"col\": 2, \"left\": document.createTextNode(\"<%: Set Storage%>\"), \"right\": set_storage_btn }\n    ];\n\n    this.sms_storage_table.title = \"<%:SMS Storage%>\";\n    this.sms_storage_table.data = data;\n    this.reading_storage = reading_storage;\n    this.writing_storage = writing_storage;\n    this.etc_storage = etc_storage;\n    this.opt_mt1 = storages[0].querySelector('option[value=\"ME\"]');\n    this.opt_sm1 = storages[0].querySelector('option[value=\"SM\"]');\n    this.opt_mt2 = storages[1].querySelector('option[value=\"ME\"]');\n    this.opt_sm2 = storages[1].querySelector('option[value=\"SM\"]');\n    this.opt_mt3 = storages[2].querySelector('option[value=\"ME\"]');\n    this.opt_sm3 = storages[2].querySelector('option[value=\"SM\"]');\n}\n\n    init_msg_box()\n    {\n        var warn_msg_box = document.createElement('div');\n        warn_msg_box.className = \"cbi-section\";\n        var warn_msg = document.createElement('div');\n        warn_msg.className = \"alert\";\n        warn_msg_box.appendChild(warn_msg);\n        this.cbi_map.appendChild(warn_msg_box);\n        this.warn_msg_box = warn_msg_box;\n        //hide\n        this.warn_msg_box.style.display = \"none\";\n    }\n\n    warn_msg(msg,timeout){\n        this.warn_msg_box.style.display = \"\";\n        this.warn_msg_box.classList.add(\"alert-warning\");\n        this.warn_msg_box.firstChild.innerHTML = msg;\n        setTimeout(()=>{\n            this.warn_msg_box.style.display = \"none\";\n            this.warn_msg_box.classList.remove(\"alert-warning\");\n        },timeout);\n    }\n\n    log_msg(msg,timeout){\n        this.warn_msg_box.style.display = \"\";\n        this.warn_msg_box.classList.add(\"alert-info\");\n        this.warn_msg_box.firstChild.innerHTML = msg;\n        setTimeout(()=>{\n            this.warn_msg_box.style.display = \"none\";\n            this.warn_msg_box.classList.remove(\"alert-info\");\n        },timeout);\n    }\n\n    create_modem_cfg_selector(){\n        var selector = document.createElement('select');\n        selector.addEventListener('change', (event) => {\n            this.update();\n            this.cfg_id = event.target.value;\n            console.log(this.cfg_id);\n        });\n        this.modem_selector.appendChild(selector);\n        this.selector = selector;\n        this.poll_info();\n    }\n\n    send(){\n        //if content contain non-ascii char, use raw pdu\n        var content = this.message_content.value;\n        var is_ascii = /^[\\x00-\\x7F]*$/.test(content);\n        if (is_ascii) {\n            this.send_raw_pdu();\n        }\n        else{\n            this.send_raw_pdu();\n        }\n    }\n\n    send_gsm(){\n        var phone_number = this.phone_number.value;\n        var message_content = this.message_content.value;\n        XHR.get('<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"send_sms\")%>',{\n            \"cfg\": this.cfg_id,\n            \"phone_number\": phone_number,\n            \"message_content\": message_content,\n        },(x,data)=>{\n            this.update();\n            data.result.status == 1 ? this.log_msg(\"<%:Send SMS Success%>\",3000) : this.warn_msg(\"<%:Send SMS Failed%>\",3000);\n        });\n    }\n\n    send_raw_pdu(){\n        var pdu = pduParser.generate(\n            {\n                text: this.message_content.value,\n                encoding: \"16bit\",\n                receiver: this.phone_number.value,\n            }\n        )\n        //if pdu is array,send first pdu\n        if (Array.isArray(pdu)) {\n            pdu = pdu[0];\n        }\n        XHR.get('<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"send_sms\")%>',{\n            \"cfg\": this.cfg_id,\n            \"pdu\": pdu,\n        },(x,data)=>{\n            this.update();\n            data.result.status == 1 ? this.log_msg(\"<%:Send SMS Success%>\",3000) : this.warn_msg(\"<%:Send SMS Failed%>\",3000);\n        });\n    }\n\n    set_sms_storage(){\n        let payload;\n        let mem1,mem2,mem3;\n        mem1 = this.reading_storage.value;\n        mem2 = this.writing_storage.value;\n        mem3 = this.etc_storage.value;\n        payload = {\n            \"mem1\": mem1,\n            \"mem2\": mem2,\n            \"mem3\": mem3,\n        }\n        XHR.get('<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"modem_ctrl\")%>', {\n            \"cfg\": this.cfg_id,\n            \"action\":\"set_sms_storage\",\n            \"params\": JSON.stringify(JSON.stringify(payload))\n        },(x,data)=>{\n            this.update();\n        });\n    }\n\n    lock(){\n        var delete_btns = document.querySelectorAll('input[value=\"<%:Delete%>\"]');\n        for (let btn of delete_btns) {\n            console.log(btn);\n            btn.disabled = true;\n        }\n    }\n\n    release(){\n        var delete_btns = document.querySelectorAll('input[value=\"<%:Delete%>\"]');\n        for (let btn of delete_btns) {\n            btn.disabled = false;\n        }\n    }\n\n\n    init_send_table_view(){\n        let phone_number,message_content,send_button,send_raw_pdu_button;\n        phone_number = document.createElement('input');\n        phone_number.type = \"text\";\n        message_content = document.createElement('textarea');\n        message_content.rows = 5;\n        message_content.cols = 50;\n        send_button = document.createElement('input');\n        send_button.type = \"button\";\n        send_button.value = \"<%:Send%>\";\n\n        send_button.addEventListener('click',()=>{\n            this.send();\n        });\n        this.phone_number = phone_number;\n        this.message_content = message_content;\n        this.sms_send_table.data = [\n            {\n                \"col\": 2,\n                \"left\": document.createTextNode(\"<%:Phone Number%>\"),\n                \"right\": phone_number,\n            },\n            {\n                \"col\": 2,\n                \"left\": document.createTextNode(\"<%:Message Content%>\"),\n                \"right\": message_content,\n            },\n            {\n                \"col\": 2,\n                \"left\": document.createTextNode(\"<%:Send%>\"),\n                \"right\": send_button,\n            }\n        ];\n    }\n\n    poll_info(){\n        if (this.cfg_id == null){\n            return;\n        }\n        XHR.poll(10,'<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"get_sms\")%>',{\n            \"cfg\": this.cfg_id,\n        }, (x,data) => {\n            this.combine_messages(data);\n        });\n    }\n\n    update(){\n        XHR.get('<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"get_sms\")%>',{\n            \"cfg\": this.cfg_id,\n        }, (x,data) => {\n            this.combine_messages(data);\n            this.update_sms_capabilities(data);\n        });\n    }\n\n    update_modem_cfg_list(){\n        XHR.poll(5,'<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"get_modem_cfg\")%>',{},(x,data)=>{\n            var new_cfg_list = [];\n            var cfgs = data.cfgs;\n            for (let i = 0; i < cfgs.length; i++) {\n                var cfg = cfgs[i];\n                var name = cfg.name;\n                var value = cfg.cfg;\n                new_cfg_list.push({\"value\":value,\"name\":name});\n            }\n            if (new_cfg_list != this.modem_cfg_list) {\n                this.cfg_options = new_cfg_list;\n            }\n        });\n    }\n\n\n    combine_messages(data){\n        var messages,reference_table,msgs;\n        messages = []\n        reference_table = {}\n        msgs = data.msg;\n        for ( let msg of msgs){\n            let part,total,index,reference,sender,timestamp,content;\n            if (msg.reference){\n                reference = `${msg.reference}.${msg.sender}`;\n                if (reference in reference_table){\n                    reference_table[reference].push(msg);\n                }\n                else{\n                    reference_table[reference] = [msg];\n                }\n            }\n            else{\n                msg.index = [msg.index]\n                messages.push(msg);\n            }\n\n            \n        }\n        //combile the messages in reference_table\n        for (let key in reference_table){\n                let reference_msgs = reference_table[key];\n                let total = reference_msgs[0].total;\n                let part = [];\n                let content = \"\";\n                let sender = reference_msgs[0].sender;\n                let timestamp = reference_msgs[0].timestamp;\n                let index = [];\n                reference_msgs.sort((a,b)=>{\n                    return a.part - b.part;\n                });\n                for (let reference_msg of reference_msgs){\n                    content += reference_msg.content;\n                    part.push(reference_msg.part);\n                    index.push(reference_msg.index);\n                }\n                messages.push({\n                    \"sender\":sender,\n                    \"timestamp\":timestamp,\n                    \"content\":content,\n                    \"part\":part,\n                    \"total\":total,\n                    \"index\":index,\n                });\n            }\n            messages.sort((a,b)=>{\n                //filter timestamp space and / :\n                let at,bt\n                at = a.timestamp;\n                bt = b.timestamp;\n                if (typeof at == \"string\") {\n                    at = at.replace(/ /g,\"\");\n                    bt = bt.replace(/ /g,\"\");\n                    at = at.replace(/\\//g,\"\");\n                    bt = bt.replace(/\\//g,\"\");\n                    at = at.replace(/:/g,\"\");\n                    bt = bt.replace(/:/g,\"\");\n                }\n\n                return bt - at;\n            });\n            this.view = messages;\n\n    }\n\n    update_sms_capabilities(data) {\n    const sms_capabilities = data.sms_capabilities;\n    const storages = [\n        { mem: sms_capabilities.mem1, storage: this.reading_storage, opts: ['opt_mt1', 'opt_sm1'] },\n        { mem: sms_capabilities.mem2, storage: this.writing_storage, opts: ['opt_mt2', 'opt_sm2'] },\n        { mem: sms_capabilities.mem3, storage: this.etc_storage, opts: ['opt_mt3', 'opt_sm3'] }\n    ];\n\n    const updateStorage = (mem, storage, mtOpt, smOpt) => {\n        let mt = \"\", sm = \"\";\n        if (mem === \"MT\" || mem === \"ME\") {\n            if (storage.value === \"Loading\") storage.value = \"ME\";\n            mt = \"[<%:Using%>]\";\n        } else if (mem === \"SM\") {\n            if (storage.value === \"Loading\") storage.value = \"SM\";\n            sm = \"[<%:Using%>]\";\n        } else {\n            storage.value = \"Loading\";\n        }\n        this[mtOpt].innerHTML = mt + me_message_text;\n        this[smOpt].innerHTML = sm + sm_message_text;\n    };\n\n    const me_message_text = sms_capabilities.ME.used\n        ? `<%: Mobile equipment message storage %> <%: (Used/Total) %>(${sms_capabilities.ME.used}/${sms_capabilities.ME.total})`\n        : \"<%: Mobile equipment message storage %>\";\n\n    const sm_message_text = sms_capabilities.SM.used\n        ? `<%: (U)SIM message storage %> <%: (Used/Total) %>(${sms_capabilities.SM.used}/${sms_capabilities.SM.total})`\n        : \"<%: (U)SIM message storage %>\";\n\n    storages.forEach(({ mem, storage, opts }) => updateStorage(mem, storage, opts[0], opts[1]));\n}\n\n    set cfg_options(value){\n        var longger = this.modem_cfg_list.length > value.length ? this.modem_cfg_list : value;\n        if (longger.length == 0) {\n            return;\n        }\n        for (let i = 0; i < longger.length; i++) {\n            var option = this.selector.options[i];\n            if (i < value.length) {\n                if (i >= this.selector.options.length) {\n                    option = document.createElement('option');\n                    this.selector.appendChild(option);\n                }\n                option.value = value[i].value;\n                option.innerHTML = value[i].name;\n                \n            }\n            else{\n                this.selector.removeChild(option);\n            }\n        }\n        this.cfg_id = this.selector.value;\n        this.modem_cfg_list = value;\n        this.update();\n    }\n\n    set view(data){\n        this.data = data;\n        if (data == null) {\n            return;\n        }\n        var enties = []\n        \n\n        var msgs = data;\n        for (let msg of msgs){\n            let sender,timestamp,content,part,total,index;\n            sender = msg.sender;\n            if (typeof(msg.timestamp) == \"number\") {\n                timestamp = new Date(msg.timestamp*1000).toISOString()\n            }\n            else{\n                timestamp = msg.timestamp;\n            }\n            content = msg.content;\n            part = msg.part;\n            total = msg.total;\n            index = msg.index;\n            let sender_strong,timestamp_strong,content_strong,part_strong,total_strong,delete_btn;\n            let left,right;\n            left = document.createElement('div');\n            right = document.createElement('div');\n            delete_btn = document.createElement('input');\n            delete_btn.type = \"button\";\n            delete_btn.value = \"<%:Delete%>\";\n            delete_btn.addEventListener('click',()=>{\n                this.lock();\n                XHR.get('<%=luci.dispatcher.build_url(\"admin\", \"modem\", \"qmodem\", \"delete_sms\")%>',{\n                    \"cfg\": this.cfg_id,\n                    \"index\": index.sort((a,b)=>{return b-a}).join(\" \"),\n                },(x,data)=>{\n                    this.update();\n                    this.release\n                });\n            });\n            sender_strong = document.createElement('strong');\n            sender_strong.innerHTML = `<%:Sender%>: ${sender}`;\n            timestamp_strong = document.createElement('strong');\n            timestamp_strong.innerHTML = `<%:Timestamp%>: ${timestamp}`;\n            content_strong = document.createElement('strong');\n            content_strong.innerHTML = `<%:Content%>: ${content}`;\n            left.appendChild(sender_strong);\n            left.appendChild(document.createElement('br'));\n            left.appendChild(timestamp_strong);\n            left.appendChild(document.createElement('br'));\n            left.appendChild(delete_btn);\n            right.appendChild(content_strong);\n            if (part != null) {\n                part_strong = document.createElement('strong');\n                part_strong.innerHTML = `(${part}/${total})`;\n                right.appendChild(document.createElement('br'));\n                right.appendChild(part_strong);\n            }\n            enties.push({\n                \"col\" : 2,\n                \"left\" : left,\n                \"right\" : right\n            });\n        }\n\n\n        this.sms_recvbox_table.data = enties;\n        this.sms_recvbox_table.title = \"SMS\";\n    }\n}\n\n\n\nwindow.onload = function(){\n    const getSMS = new ModemSMS();\n}\n</script>\n\n<style>\n    .sms_recv_content {\n        text-align: left;\n        word-wrap: break-word; \n        white-space: normal; \n        overflow-wrap: break-word; \n    }\n</style>\n<div>\n    <div class=\"cbi-map\">\n        <fieldset class=\"cbi-section\">\n            \n            <table class=\"table\">\n                <tbody>\n                    <tr class=\"tr\">\n                        <td class=\"td\" width=\"33%\"><%:Modem Name%></td>\n                        <td class=\"td\" id=\"modem_selector\">\n\n                        </td>\n                    </tr>\n                </tbody>\n            </table>\n        </fieldset>\n    </div>\n</div>\n<%+footer%>\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-sms/po/zh_Hans/modem_sms.po",
    "content": "#modem_sms.htm\nmsgid \"Sender\"\nmsgstr \"发信人\"\n\nmsgid \"Timestamp\"\nmsgstr \"时间戳\"\n\nmsgid \"Content\"\nmsgstr \"内容\"\n\nmsgid \"Send SMS\"\nmsgstr \"发送短信\"\n\nmsgid \"Send\"\nmsgstr \"发送\"\n\nmsgid \"Delete\"\nmsgstr \"删除\"\n\nmsgid \"SMS\"\nmsgstr \"短信\"\n\nmsgid \"Message Content\"\nmsgstr \"短信内容\"\n\nmsgid \"Phone Number\"\nmsgstr \"电话号码\"\n\nmsgid \"Send SMS Failed\"\nmsgstr \"发送短信失败\"\n\nmsgid \"Send SMS Success\"\nmsgstr \"发送短信成功\"\n\nmsgid \"SMS Storage\"\nmsgstr \"短信存储\"\n\nmsgid \"Set Storage\"\nmsgstr \"设置存储\"\n\nmsgid \"ETC Storage\"\nmsgstr \"ETC存储\"\n\nmsgid \"Writing Storage\"\nmsgstr \"写入存储\"\n\nmsgid \"Reading Storage\"\nmsgstr \"读取存储\"\n\nmsgid \"Loading...\"\nmsgstr \"加载中...\"\n\nmsgid \"(U)SIM message storage\"\nmsgstr \"(U)SIM短信存储\"\n\nmsgid \"Mobile equipment message storage\"\nmsgstr \"移动设备短信存储\"\n\nmsgid \"Using\"\nmsgstr \"使用中\"\n\nmsgid \"(Used/Total)\"\nmsgstr \"(已用/总可用)\"\n\nmsgid \"Set\"\nmsgstr \"设置\"\n\nmsgid \"SMS Forward\"\nmsgstr \"短信转发\"\n\nmsgid \"SMS Forward Configuration\"\nmsgstr \"短信转发配置\"\n\nmsgid \"SMS Forward Service\"\nmsgstr \"短信转发服务\"\n\nmsgid \"Enable SMS Forward Service\"\nmsgstr \"启用短信转发服务\"\n\nmsgid \"SMS Forward Instances\"\nmsgstr \"短信转发实例\"\n\nmsgid \"Instance Name\"\nmsgstr \"实例名称\"\n\nmsgid \"Listen Port\"\nmsgstr \"监听端口\"\n\nmsgid \"Poll Interval (seconds)\"\nmsgstr \"轮询间隔（秒）\"\n\nmsgid \"Minimum 15 seconds, maximum 10 minutes\"\nmsgstr \"最少15秒，最多10分钟\"\n\nmsgid \"Forward API Type\"\nmsgstr \"转发API类型\"\n\nmsgid \"API Configuration\"\nmsgstr \"API配置\"\n\nmsgid \"ServerChat\"\nmsgstr \"ServerChat\"\n\nmsgid \"Telegram Bot\"\nmsgstr \"Telegram机器人\"\n\nmsgid \"Generic Webhook\"\nmsgstr \"通用Webhook\"\n\nmsgid \"URL of the webhook endpoint(Also supports placeholders:\"\nmsgstr \"webhook接口地址（也支持占位符：\"\n\nmsgid \" and need to be URL encoded)\"\nmsgstr \"，需要进行URL编码）\"\n\nmsgid \"Message Format (optional)\"\nmsgstr \"消息格式（可选）\"\n\nmsgid \"Custom message format using placeholders:\"\nmsgstr \"使用占位符的自定义消息格式：\"\n\nmsgid \"Request Method\"\nmsgstr \"请求方法\"\n\nmsgid \"Custom Script\"\nmsgstr \"自定义脚本\"\n\nmsgid \"PushDeer\"\nmsgstr \"PushDeer\"\n\nmsgid \"Feishu Bot\"\nmsgstr \"飞书机器人\"\n\nmsgid \"Push Key\"\nmsgstr \"推送密钥\"\n\nmsgid \"Delete After Forward\"\nmsgstr \"转发后删除\"\n\nmsgid \"Delete SMS messages from modem after successful forwarding\"\nmsgstr \"转发成功后从调制解调器中删除短信\"\n\nmsgid \"Delete SMS messages from modem after successful forwarding. This helps keep the modem's SMS storage clean but messages will be permanently removed.\"\nmsgstr \"转发成功后从调制解调器中删除短信。这有助于保持调制解调器的短信存储空间整洁，但短信将被永久删除。\"\n\nmsgid \"PushDeer Push Key from http://pushdeer.com\"\nmsgstr \"从 http://pushdeer.com 获取的推送密钥\"\n\nmsgid \"API Endpoint (optional)\"\nmsgstr \"API接口地址（可选）\"\n\nmsgid \"Custom PushDeer API endpoint, leave empty to use default\"\nmsgstr \"自定义PushDeer API接口地址，留空使用默认地址\"\n\nmsgid \"JSON format configuration. Examples:<br/>\"\nmsgstr \"JSON格式配置。示例：<br/>\"\n\nmsgid \"Recommended to enable for SMS forwarding service and better AT command performance.\"\nmsgstr \"推荐启用以获得更好的短信转发服务和AT命令性能。\"\n\nmsgid \"SMS Forward Service Status\"\nmsgstr \"短信转发服务状态\"\n\nmsgid \"Current Status\"\nmsgstr \"当前状态\"\n\nmsgid \"Running\"\nmsgstr \"运行中\"\n\nmsgid \"Stopped\"\nmsgstr \"已停止\"\n\nmsgid \"Loading...\"\nmsgstr \"加载中...\"\n\nmsgid \"Start Service\"\nmsgstr \"启动服务\"\n\nmsgid \"Stop Service\"\nmsgstr \"停止服务\"\n\nmsgid \"Restart Service\"\nmsgstr \"重启服务\"\n\nmsgid \"Enable the SMS forward daemon service. When enabled, the daemon will start automatically.\"\nmsgstr \"启用短信转发守护进程服务。启用后，守护进程将自动启动。\"\n\nmsgid \"Log Level\"\nmsgstr \"日志级别\"\n\nmsgid \"Set the logging verbosity level for the SMS daemon.\"\nmsgstr \"设置短信守护进程的日志详细级别。\"\n\nmsgid \"Configure multiple SMS forward instances. Each instance can monitor a different modem port and forward to different APIs.\"\nmsgstr \"配置多个短信转发实例。每个实例可以监控不同的调制解调器端口并转发到不同的API。\"\n\nmsgid \"Enable\"\nmsgstr \"启用\"\n\nmsgid \"Modem Port\"\nmsgstr \"调制解调器端口\"\n\nmsgid \"Poll Interval\"\nmsgstr \"轮询间隔\"\n\nmsgid \"API Type\"\nmsgstr \"API类型\"\n\nmsgid \"Polling interval in seconds (15-600)\"\nmsgstr \"轮询间隔（秒）（15-600）\"\n\nmsgid \"SMS Forward Advanced Configuration\"\nmsgstr \"短信转发高级配置\"\n\nmsgid \"Advanced SMS Forward configuration with type-specific options.\"\nmsgstr \"具有特定类型选项的高级短信转发配置。\"\n\nmsgid \"SMS Forwarder Configuration\"\nmsgstr \"短信转发器配置\"\n\nmsgid \"SMS Forward Daemon allows automatic forwarding of SMS messages to various APIs.\"\nmsgstr \"短信转发器允许自动将短信转发到各种API。\"\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-ttl/Makefile",
    "content": "# Copyright (C) 2023 Siriling <siriling@qq.com>\n# This is free software, licensed under the GNU General Public License v3.\n\ninclude $(TOPDIR)/rules.mk\n\n# Include unified version\ninclude ../../version.mk\n\nPKG_NAME:=luci-app-qmodem-ttl\nLUCI_TITLE:=Luci qwrt modem ttl support\nLUCI_PKGARCH:=all\nPKG_VERSION:=$(QMODEM_VERSION)\nPKG_LICENSE:=GPLv3\nPKG_LINCESE_FILES:=LICENSE\nPKG_MAINTAINER:=Tom <fjrcn@outlook.com>\nLUCI_DEPENDS:=+luci-app-qmodem\nPKG_CONFLICTS:=luci-app-qmodem-ttlfw4\n\t\t\n\ndefine Package/luci-app-qmodem-ttl/conffiles\n/etc/config/qmodem_ttl\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-ttl/luasrc/controller/qmodem_ttl.lua",
    "content": "-- Copyright 2024 Siriling <siriling@qq.com>\nmodule(\"luci.controller.qmodem_ttl\", package.seeall)\nfunction index()\n    if not nixio.fs.access(\"/etc/config/qmodem_ttl\") then\n        return\n    end\n\tentry({\"admin\", \"modem\", \"qmodem\", \"modem_ttl\"}, cbi(\"qmodem/modem_ttl\"), luci.i18n.translate(\"TTL Config\"), 22).leaf = true\nend\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-ttl/luasrc/model/cbi/qmodem/modem_ttl.lua",
    "content": "local uci = luci.model.uci.cursor()\nm = Map(\"qmodem_ttl\", translate(\"TTL Config\"))\ns = m:section(NamedSection, \"main\", \"main\", translate(\"Global Config\"))\n\nenable = s:option(Flag, \"enable\", translate(\"Enable\"))\nenable.default = \"0\"\n\nttl = s:option(Value, \"ttl\", translate(\"TTL\"))\nttl.default = 64\nttl.datatype = \"uinteger\"\n\n\nreturn m\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-ttl/po/templates/qmodem-ttl.pot",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\n#: luasrc/controller/qmodem_ttl.lua:6\n#: luasrc/model/cbi/qmodem/modem_ttl.lua:2\nmsgid \"TTL Config\"\nmsgstr \"\"\n\n#: luasrc/model/cbi/qmodem/modem_ttl.lua:3\nmsgid \"Global Config\"\nmsgstr \"\"\n\n#: luasrc/model/cbi/qmodem/modem_ttl.lua:5\nmsgid \"Enable\"\nmsgstr \"\"\n\n#: luasrc/model/cbi/qmodem/modem_ttl.lua:8\nmsgid \"TTL\"\nmsgstr \"\"\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-ttl/po/zh_Hans/qmodem-ttl.po",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\n#: luasrc/controller/qmodem_ttl.lua:6\n#: luasrc/model/cbi/qmodem/modem_ttl.lua:2\nmsgid \"TTL Config\"\nmsgstr \"TTL 配置\"\n\n#: luasrc/model/cbi/qmodem/modem_ttl.lua:3\nmsgid \"Global Config\"\nmsgstr \"全局配置\"\n\n#: luasrc/model/cbi/qmodem/modem_ttl.lua:5\nmsgid \"Enable\"\nmsgstr \"启用\"\n\n#: luasrc/model/cbi/qmodem/modem_ttl.lua:8\nmsgid \"TTL\"\nmsgstr \"TTL 值\"\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-ttl/root/etc/config/qmodem_ttl",
    "content": "config main 'main'\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-ttl/root/etc/init.d/qmodem_ttl",
    "content": "#!/bin/sh /etc/rc.common\nSTART=95\nSTOP=13\nUSE_PROCD=1\n\n. $IPKG_INSTROOT/usr/share/libubox/jshn.sh\n. $IPKG_INSTROOT/lib/functions.sh\nstart_service()\n{\n    config_load 'qmodem_ttl'\n    config_get enable 'main' 'enable' '0'\n    if [ \"$enable\" == 0 ]; then\n        return\n    fi\n    set_if_ttl\n}\n\nset_if_ttl()\n{\n    config_get ttl 'main' 'ttl'\n    IPT=\"iptables\"\n    IPT6=\"ip6tables\"\n    logger -t modem_ttl \"Ovrewirte TTL from br-lan to $ttl\"\n    comment=\"modem_ttl\"\n    touch /etc/firewall.d/qmodem_ttl\n    echo \"$IPT -t mangle -A POSTROUTING -j TTL --ttl-set $ttl -m comment --comment $comment\" >> /etc/firewall.d/qmodem_ttl\n    echo \"$IPT6 -t mangle -A POSTROUTING -j HL --hl-set $ttl -m comment --comment $comment\" >> /etc/firewall.d/qmodem_ttl\n    /etc/firewall.d/qmodem_ttl\n    /etc/init.d/firewall restart\n    [ -d /sys/kernel/debug/ecm/ ] && /etc/init.d/qca-nss-ecm stop\n    [ -d /sys/module/shortcut_fe_cm ] && rmmod shortcut_fe_cm\n    [ -d /sys/module/fast_classifier ] && rmmod fast_classifier\n}\n\nstop_service(){\n    local kernel_version=$(uname -r)\n    rm -f /etc/firewall.d/qmodem_ttl\n    [ -f /etc/init.d/qca-nss-ecm ] && /etc/init.d/qca-nss-ecm start\n    [ -e \"/lib/modules/$kernel_version/shortcut-fe-cm.ko\" ] && modprobe shortcut-fe-cm\n    [ -e \"/lib/modules/$kernel_version/fast-classifier.ko\" ] && modprobe fast-classifier\n    /etc/init.d/firewall restart\n}\n\nservice_triggers()\n{\n\tprocd_add_reload_trigger \"qmodem_ttl\"\n}\n\nreload_service()\n{\n    stop\n    start\n}\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-ttl/root/etc/uci-defaults/add-fw-include",
    "content": "#!/bin/sh\nuci -q batch << EOF\n\tdelete firewall.qmodem_ttl\n\tset firewall.qmodem_ttl=include\n\tset firewall.qmodem_ttl.type=script\n\tset firewall.qmodem_ttl.path=/etc/firewall.d/qmodem_ttl\n\tset firewall.qmodem_ttl.family=any\n\tset firewall.qmodem_ttl.reload=1\n\tcommit firewall\nEOF\nuci -q batch <<-EOF >/dev/null\n    delete ucitrack.@qmodem_ttl[-1]\n\tadd ucitrack qmodem_ttl\n\tset ucitrack.@qmodem_ttl[-1].init=qmodem_ttl\n\tcommit ucitrack\nEOF\n\nexit 0\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-ttlfw4/Makefile",
    "content": "# Copyright (C) 2024 Tom <fjrcn@outlook.com>\n# This is free software, licensed under the GNU General Public License v3.\n\ninclude $(TOPDIR)/rules.mk\n\n# Include unified version\ninclude ../../version.mk\n\nPKG_NAME:=luci-app-qmodem-ttlfw4\nLUCI_TITLE:=LuCI App for QModem TTL Configuration (JS LuCI / fw4 Only)\nLUCI_DEPENDS:=+luci-base\nPKG_CONFLICTS:=luci-app-qmodem-ttl\nLUCI_PKGARCH:=all\nPKG_VERSION:=$(QMODEM_VERSION)\nPKG_RELEASE:=1\nPKG_LICENSE:=GPLv3\nPKG_MAINTAINER:=Tom <fjrcn@outlook.com>\n\ndefine Package/luci-app-qmodem-ttlfw4/conffiles\n/etc/config/qmodem_ttl\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-ttlfw4/htdocs/luci-static/resources/view/qmodem/ttl.js",
    "content": "'use strict';\n'require view';\n'require form';\n'require uci';\n'require rpc';\n'require ui';\n\nvar callInitAction = rpc.declare({\n\tobject: 'luci',\n\tmethod: 'setInitAction',\n\tparams: ['name', 'action'],\n\texpect: { result: false }\n});\n\nvar callRcStatus = rpc.declare({\n\tobject: 'rc',\n\tmethod: 'list',\n\tparams: ['name'],\n\texpect: { }\n});\n\nreturn view.extend({\n\tload: function() {\n\t\tvar self = this;\n\t\treturn Promise.all([\n\t\t\tuci.load('qmodem_ttl'),\n\t\t]).then(function(results) {\n\t\t\treturn results;\n\t\t});\n\t},\n\n\trender: function() {\n\t\tvar m, s, o;\n\t\tvar self = this;\n\n\t\tm = new form.Map('qmodem_ttl', _('TTL Configuration'),\n\t\t\t_('Configure TTL/Hop Limit settings to modify outgoing packet TTL values. This can help bypass carrier restrictions on tethering.'));\n\n\t\t// Global TTL Configuration\n\t\ts = m.section(form.NamedSection, 'main', 'main', _('Global TTL Settings'));\n\t\ts.anonymous = true;\n\n\t\t// Enable TTL modification\n\t\to = s.option(form.Flag, 'enable', _('Enable TTL Modification'));\n\t\to.default = '0';\n\t\to.rmempty = false;\n\t\to.description = _('Enable or disable TTL/Hop Limit modification for outgoing packets.');\n\n\t\t// TTL Value\n\t\to = s.option(form.Value, 'ttl', _('TTL Value'));\n\t\to.datatype = 'range(1,255)';\n\t\to.default = '64';\n\t\to.placeholder = '64';\n\t\to.description = _('Set the TTL (Time To Live) value for IPv4 packets and Hop Limit for IPv6 packets. Common values: 64 (Linux default), 128 (Windows default).');\n\n\t\t// Warning section\n\t\ts = m.section(form.NamedSection, 'main', 'main', _('Important Notes'));\n\t\ts.anonymous = true;\n\n\t\tvar warning = s.option(form.DummyValue, '_warning');\n\t\twarning.rawhtml = true;\n\t\twarning.cfgvalue = function() {\n\t\t\treturn E('div', { 'class': 'cbi-value-description' }, [\n\t\t\t\tE('p', { 'style': 'color: #c00; font-weight: bold;' }, _('Warning:')),\n\t\t\t\tE('ul', {}, [\n\t\t\t\t\tE('li', {}, _('Enabling TTL modification will disable hardware flow offloading for proper packet modification.')),\n\t\t\t\t\tE('li', {}, _('This may affect network performance on some devices.')),\n\t\t\t\t\tE('li', {}, _('NSS ECM, SFE, and other acceleration modules will be disabled when TTL modification is active.')),\n\t\t\t\t\tE('li', {}, _('Settings will take effect after saving and applying changes.'))\n\t\t\t\t])\n\t\t\t]);\n\t\t};\n\n\t\treturn m.render();\n\t},\n});\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-ttlfw4/po/templates/qmodem-ttlfw4.pot",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\nmsgid \"TTL Configuration\"\nmsgstr \"\"\n\nmsgid \"Configure TTL/Hop Limit settings to modify outgoing packet TTL values. This can help bypass carrier restrictions on tethering.\"\nmsgstr \"\"\n\nmsgid \"Global TTL Settings\"\nmsgstr \"\"\n\nmsgid \"Enable TTL Modification\"\nmsgstr \"\"\n\nmsgid \"Enable or disable TTL/Hop Limit modification for outgoing packets.\"\nmsgstr \"\"\n\nmsgid \"TTL Value\"\nmsgstr \"\"\n\nmsgid \"Set the TTL (Time To Live) value for IPv4 packets and Hop Limit for IPv6 packets. Common values: 64 (Linux default), 128 (Windows default).\"\nmsgstr \"\"\n\nmsgid \"Important Notes\"\nmsgstr \"\"\n\nmsgid \"Warning:\"\nmsgstr \"\"\n\nmsgid \"Enabling TTL modification will disable hardware flow offloading for proper packet modification.\"\nmsgstr \"\"\n\nmsgid \"This may affect network performance on some devices.\"\nmsgstr \"\"\n\nmsgid \"NSS ECM, SFE, and other acceleration modules will be disabled when TTL modification is active.\"\nmsgstr \"\"\n\nmsgid \"Settings will take effect after saving and applying changes.\"\nmsgstr \"\"\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-ttlfw4/po/zh_Hans/qmodem-ttlfw4.po",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\nmsgid \"TTL Configuration\"\nmsgstr \"TTL 配置\"\n\nmsgid \"Configure TTL/Hop Limit settings to modify outgoing packet TTL values. This can help bypass carrier restrictions on tethering.\"\nmsgstr \"配置 TTL/跳数限制设置以修改出站数据包的 TTL 值。这可以帮助绕过运营商对网络共享的限制。\"\n\nmsgid \"Global TTL Settings\"\nmsgstr \"全局 TTL 设置\"\n\nmsgid \"Enable TTL Modification\"\nmsgstr \"启用 TTL 修改\"\n\nmsgid \"Enable or disable TTL/Hop Limit modification for outgoing packets.\"\nmsgstr \"启用或禁用出站数据包的 TTL/跳数限制修改。\"\n\nmsgid \"TTL Value\"\nmsgstr \"TTL 值\"\n\nmsgid \"Set the TTL (Time To Live) value for IPv4 packets and Hop Limit for IPv6 packets. Common values: 64 (Linux default), 128 (Windows default).\"\nmsgstr \"设置 IPv4 数据包的 TTL（生存时间）值和 IPv6 数据包的跳数限制。常用值：64（Linux 默认）、128（Windows 默认）。\"\n\nmsgid \"Important Notes\"\nmsgstr \"重要说明\"\n\nmsgid \"Warning:\"\nmsgstr \"警告：\"\n\nmsgid \"Enabling TTL modification will disable hardware flow offloading for proper packet modification.\"\nmsgstr \"启用 TTL 修改将禁用硬件流量卸载以确保正确修改数据包。\"\n\nmsgid \"This may affect network performance on some devices.\"\nmsgstr \"这可能会影响某些设备的网络性能。\"\n\nmsgid \"NSS ECM, SFE, and other acceleration modules will be disabled when TTL modification is active.\"\nmsgstr \"当 TTL 修改激活时，NSS ECM、SFE 和其他加速模块将被禁用。\"\n\nmsgid \"Settings will take effect after saving and applying changes.\"\nmsgstr \"设置将在保存并应用更改后生效。\"\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-ttlfw4/root/etc/config/qmodem_ttl",
    "content": "config main 'main'\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-ttlfw4/root/etc/init.d/qmodem_ttl",
    "content": "#!/bin/sh /etc/rc.common\nSTART=95\nSTOP=13\nUSE_PROCD=1\n\n. $IPKG_INSTROOT/usr/share/libubox/jshn.sh\n. $IPKG_INSTROOT/lib/functions.sh\n\nnftfile=\"/etc/nftables.d/99-reset-ttl-from-br-lan.nft\"\nstart_service()\n{\n    config_load 'qmodem_ttl'\n    config_get enable 'main' 'enable' '0'\n    if [ \"$enable\" == 0 ]; then\n        return\n    fi\n    set_if_ttl\n}\n\nset_if_ttl()\n{\n    config_get ttl 'main' 'ttl'\n    logger -t modem_ttl \"Ovrewirte TTL from br-lan to $ttl\"\n    comment=\"modem_ttl\"\n    #nftables\n    cat << EOF > $nftfile\nchain postrouting {\n    type filter hook postrouting priority mangle; policy accept;\n    iifname \"br-lan\" ip ttl set $ttl comment \"Reset TTL for br-lan IPv4\"\n    iifname \"br-lan\" ip6 hoplimit set $ttl comment \"Reset Hop Limit for br-lan IPv6\"\n}\n\nEOF\n    /etc/firewall.d/qmodem_ttl\n    [ -d /sys/kernel/debug/ecm/ ] && /etc/init.d/qca-nss-ecm stop\n    [ -d /sys/module/shortcut_fe_cm ] && rmmod shortcut_fe_cm\n    [ -d /sys/module/fast_classifier ] && rmmod fast_classifier\n    uci set firewall.@defaults[0].flow_offloading='0'\n    uci set firewall.@defaults[0].flow_offloading_hw='0'\n    uci commit firewall\n    /etc/init.d/firewall restart\n}\n\nstop_service(){\n    local kernel_version=$(uname -r)\n    rm -f $nftfile\n    [ -f /etc/init.d/qca-nss-ecm ] && /etc/init.d/qca-nss-ecm start\n    [ -e \"/lib/modules/$kernel_version/shortcut-fe-cm.ko\" ] && modprobe shortcut-fe-cm\n    [ -e \"/lib/modules/$kernel_version/fast-classifier.ko\" ] && modprobe fast-classifier\n    /etc/init.d/firewall restart\n}\n\nservice_triggers()\n{\n\tprocd_add_reload_trigger \"qmodem_ttl\"\n}\n\nreload_service()\n{\n    stop\n    start\n}\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-ttlfw4/root/usr/share/luci/menu.d/luci-app-qmodem-ttlfw4.json",
    "content": "{\n\t\"admin/modem/qmodem/ttl\": {\n\t\t\"title\": \"TTL\",\n\t\t\"order\": 22,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"qmodem/ttl\"\n\t\t},\n\t\t\"depends\": {\n\t\t\t\"acl\": [ \"luci-app-qmodem-ttlfw4\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-qmodem/luci/luci-app-qmodem-ttlfw4/root/usr/share/rpcd/acl.d/luci-app-qmodem-ttlfw4.json",
    "content": "{\n\t\"luci-app-qmodem-ttlfw4\": {\n\t\t\"description\": \"Grant access to QModem TTL configuration\",\n\t\t\"read\": {\n\t\t\t\"ubus\": {\n\t\t\t\t\"rc\": [ \"list\", \"init\" ]\n\t\t\t},\n\t\t\t\"uci\": [ \"qmodem_ttl\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"ubus\": {\n\t\t\t\t\"luci\": [ \"setInitAction\" ]\n\t\t\t},\n\t\t\t\"uci\": [ \"qmodem_ttl\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-qmodem/scripts/auto_translate_i18n.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"\nAuto-translate i18n strings using LLM API\n\"\"\"\n\nimport os\nimport sys\nimport json\nimport argparse\nimport subprocess\nfrom pathlib import Path\n\ndef read_po_file_as_example(po_file_path: str) -> str:\n    \"\"\"Read PO file and return as example text\"\"\"\n    try:\n        with open(po_file_path, 'r', encoding='utf-8') as f:\n            return f.read()\n    except FileNotFoundError:\n        print(f\"Warning: Example PO file not found: {po_file_path}\")\n        return \"\"\n\ndef parse_po_file_translations(po_file_path: str) -> set:\n    \"\"\"Parse PO file and return a set of keys that have translations\"\"\"\n    translated_keys = set()\n    \n    try:\n        with open(po_file_path, 'r', encoding='utf-8') as f:\n            content = f.read()\n            \n        # Simple PO file parser\n        lines = content.split('\\n')\n        current_msgid = None\n        \n        for line in lines:\n            line = line.strip()\n            \n            if line.startswith('msgid \"'):\n                # Extract msgid\n                msgid_value = line[7:-1]  # Remove 'msgid \"' and closing '\"'\n                current_msgid = unescape_po_string(msgid_value)\n                \n            elif line.startswith('msgstr \"') and current_msgid:\n                # Extract msgstr\n                msgstr_value = line[8:-1]  # Remove 'msgstr \"' and closing '\"'\n                msgstr_unescaped = unescape_po_string(msgstr_value)\n                \n                # Only add to set if msgstr is not empty and not same as msgid\n                if msgstr_unescaped:\n                    translated_keys.add(current_msgid)\n                \n                current_msgid = None\n        \n        return translated_keys\n        \n    except FileNotFoundError:\n        print(f\"Warning: Exclude keys file not found: {po_file_path}\")\n        return set()\n    except Exception as e:\n        print(f\"Warning: Error parsing exclude keys file: {e}\")\n        return set()\n\ndef unescape_po_string(s: str) -> str:\n    \"\"\"Unescape special characters from PO file format\"\"\"\n    s = s.replace('\\\\n', '\\n')\n    s = s.replace('\\\\t', '\\t')\n    s = s.replace('\\\\\"', '\"')\n    s = s.replace('\\\\\\\\', '\\\\')\n    return s\n\ndef extract_strings_as_json(sh_path: str, js_path: str) -> dict:\n    \"\"\"Extract i18n strings using extract_i18n_strings.py\"\"\"\n    cmd = [\n        'python3', \n        'scripts/extract_i18n_strings.py',\n        '--sh-path', sh_path,\n        '--js-path', js_path,\n        '--format', 'json',\n        '--output', 'strings.json'\n    ]\n    \n    try:\n        result = subprocess.run(cmd, capture_output=True, text=True, check=True)\n        \n        with open('strings.json', 'r', encoding='utf-8') as f:\n            return json.load(f)\n    except subprocess.CalledProcessError as e:\n        print(f\"Error extracting strings: {e}\")\n        print(f\"stderr: {e.stderr}\")\n        sys.exit(1)\n    except json.JSONDecodeError as e:\n        print(f\"Error parsing JSON output: {e}\")\n        sys.exit(1)\n\ndef translate_with_llm(strings_data: dict, api_base: str, api_key: str, model: str, target_lang: str = \"zh_Hans\", example_po: str = \"\") -> dict:\n    \"\"\"Translate strings using LLM API\"\"\"\n    import requests\n    \n    # Prepare the strings list for translation\n    # strings_data is a dict where keys are the strings to translate\n    strings_list = list(strings_data.keys())\n    \n    # Define prompts for different target languages\n    prompts = {\n        \"zh_Hans\": \"\"\"这是一个4G/5G CPE 管理插件，请根据需要的语言和语境，按json格式返回翻译内容\n\n目标语言: 简体中文\n\n翻译示例（参考风格和术语）:\n{example}\n\n需要翻译的字符串（JSON格式）:\n{strings}\n\n请返回JSON格式的翻译结果，格式如下：\n{{\n  \"原文1\": \"译文1\",\n  \"原文2\": \"译文2\",\n  ...\n}}\n\n注意事项：\n1. 保持技术术语的准确性（如 Modem, AT Port, PDP, DNS等）\n2. 保持界面文本的简洁性\n3. 使用与示例一致的翻译风格\n4. 保留原文中的HTML标签、格式符号等\n5. 只返回JSON格式的翻译结果，不要添加其他说明\n\"\"\",\n        \"zh_Hant\": \"\"\"這是一個4G/5G CPE 管理插件，請根據需要的語言和語境，按json格式返回翻譯內容\n\n目標語言: 繁體中文\n\n翻譯示例（參考風格和術語）:\n{example}\n\n需要翻譯的字符串（JSON格式）:\n{strings}\n\n請返回JSON格式的翻譯結果，格式如下：\n{{\n  \"原文1\": \"譯文1\",\n  \"原文2\": \"譯文2\",\n  ...\n}}\n\n注意事項：\n1. 保持技術術語的準確性（如 Modem, AT Port, PDP, DNS等）\n2. 保持界面文本的簡潔性\n3. 使用與示例一致的翻譯風格\n4. 保留原文中的HTML標籤、格式符號等\n5. 只返回JSON格式的翻譯結果，不要添加其他說明\n\"\"\",\n        \"en\": \"\"\"This is a 4G/5G CPE management plugin. Please translate the strings to the target language and return the result in JSON format.\n\nTarget language: English\n\nTranslation examples (for reference of style and terminology):\n{example}\n\nStrings to translate (JSON format):\n{strings}\n\nPlease return the translation result in JSON format as follows:\n{{\n  \"source1\": \"translation1\",\n  \"source2\": \"translation2\",\n  ...\n}}\n\nImportant notes:\n1. Keep technical terms accurate (e.g., Modem, AT Port, PDP, DNS, etc.)\n2. Keep UI text concise\n3. Use translation style consistent with the examples\n4. Preserve HTML tags and format symbols from the original text\n5. Return only the JSON translation result without additional explanations\n\"\"\",\n        \"ja\": \"\"\"これは4G/5G CPE管理プラグインです。必要な言語とコンテキストに従って、json形式で翻訳内容を返してください\n\n対象言語: 日本語\n\n翻訳例（スタイルと用語の参考）:\n{example}\n\n翻訳が必要な文字列（JSON形式）:\n{strings}\n\n次の形式でJSON形式の翻訳結果を返してください：\n{{\n  \"原文1\": \"訳文1\",\n  \"原文2\": \"訳文2\",\n  ...\n}}\n\n注意事項：\n1. 技術用語の正確性を保つ（Modem、AT Port、PDP、DNSなど）\n2. インターフェーステキストの簡潔性を保つ\n3. 例と一致した翻訳スタイルを使用する\n4. 原文のHTMLタグ、書式記号などを保持する\n5. JSON形式の翻訳結果のみを返し、他の説明を追加しないでください\n\"\"\",\n        \"ko\": \"\"\"이것은 4G/5G CPE 관리 플러그인입니다. 필요한 언어와 맥락에 따라 json 형식으로 번역 내용을 반환해주세요\n\n대상 언어: 한국어\n\n번역 예시 (스타일 및 용어 참고):\n{example}\n\n번역이 필요한 문자열 (JSON 형식):\n{strings}\n\n다음 형식으로 JSON 형식의 번역 결과를 반환해주세요:\n{{\n  \"원문1\": \"번역1\",\n  \"원문2\": \"번역2\",\n  ...\n}}\n\n주의사항:\n1. 기술 용어의 정확성 유지 (Modem, AT Port, PDP, DNS 등)\n2. 인터페이스 텍스트의 간결성 유지\n3. 예시와 일관된 번역 스타일 사용\n4. 원문의 HTML 태그, 형식 기호 등 보존\n5. JSON 형식의 번역 결과만 반환하고 다른 설명 추가하지 않기\n\"\"\",\n    }\n    \n    # Get prompt template for target language, fallback to English\n    prompt_template = prompts.get(target_lang, prompts[\"en\"])\n    \n    # Build the prompt\n    prompt = prompt_template.format(\n        example=example_po[:3000] if example_po else \"无示例\" if target_lang.startswith(\"zh\") else \"No example\",\n        strings=json.dumps(strings_list, ensure_ascii=False, indent=2)\n    )\n\n    # Call LLM API\n    headers = {\n        \"Content-Type\": \"application/json\",\n        \"Authorization\": f\"Bearer {api_key}\"\n    }\n    \n    payload = {\n        \"model\": model,\n        \"messages\": [\n            {\n                \"role\": \"user\",\n                \"content\": prompt\n            }\n        ],\n        \"temperature\": 0.3,\n    }\n    \n    try:\n        response = requests.post(\n            f\"{api_base}/chat/completions\",\n            headers=headers,\n            json=payload,\n            timeout=120\n        )\n        response.raise_for_status()\n        \n        result = response.json()\n        content = result['choices'][0]['message']['content']\n        \n        # Try to extract JSON from the response\n        # Sometimes LLM wraps JSON in markdown code blocks\n        if \"```json\" in content:\n            content = content.split(\"```json\")[1].split(\"```\")[0].strip()\n        elif \"```\" in content:\n            content = content.split(\"```\")[1].split(\"```\")[0].strip()\n        \n        translations = json.loads(content)\n        return translations\n        \n    except requests.exceptions.RequestException as e:\n        print(f\"Error calling LLM API: {e}\")\n        if hasattr(e, 'response') and e.response is not None:\n            print(f\"Response: {e.response.text}\")\n        sys.exit(1)\n    except (json.JSONDecodeError, KeyError) as e:\n        print(f\"Error parsing LLM response: {e}\")\n        print(f\"Response content: {content if 'content' in locals() else 'N/A'}\")\n        sys.exit(1)\n\ndef generate_po_file(strings_data: dict, translations: dict, output_path: str):\n    \"\"\"Generate PO file with translations\"\"\"\n    \n    po_content = []\n    \n    # strings_data is a dict where keys are the original strings\n    for original, metadata in strings_data.items():\n        translated = translations.get(original, original)\n        \n        # Add location comment from metadata\n        comment = metadata.get('_comment', '')\n        if comment:\n            po_content.append(f\"# {comment}\")\n        \n        # Add msgid and msgstr\n        po_content.append(f'msgid \"{escape_po_string(original)}\"')\n        po_content.append(f'msgstr \"{escape_po_string(translated)}\"')\n        po_content.append(\"\")  # Empty line between entries\n    \n    # Write to file\n    output_file = Path(output_path)\n    output_file.parent.mkdir(parents=True, exist_ok=True)\n    po_content.append(\"\")  # Append newline at end of output file\n    with open(output_file, 'w', encoding='utf-8') as f:\n        f.write('\\n'.join(po_content))\n    \n    print(f\"Translation saved to: {output_path}\")\n\ndef escape_po_string(s: str) -> str:\n    \"\"\"Escape special characters for PO file format\"\"\"\n    s = s.replace('\\\\', '\\\\\\\\')\n    s = s.replace('\"', '\\\\\"')\n    s = s.replace('\\n', '\\\\n')\n    s = s.replace('\\t', '\\\\t')\n    return s\n\ndef main():\n    parser = argparse.ArgumentParser(\n        description='Auto-translate i18n strings using LLM API'\n    )\n    \n    parser.add_argument(\n        '--api-base',\n        required=True,\n        help='LLM API base URL (e.g., https://api.openai.com/v1)'\n    )\n    \n    parser.add_argument(\n        '--api-key',\n        required=True,\n        help='LLM API key'\n    )\n    \n    parser.add_argument(\n        '--model',\n        required=True,\n        help='LLM model name (e.g., gpt-4, claude-3-sonnet)'\n    )\n    \n    parser.add_argument(\n        '--sh-path',\n        default='application/qmodem/files/usr/share/qmodem',\n        help='Path to shell scripts directory'\n    )\n    \n    parser.add_argument(\n        '--js-path',\n        default='luci/luci-app-qmodem-next/htdocs/luci-static/resources',\n        help='Path to JavaScript files directory'\n    )\n    \n    parser.add_argument(\n        '--target-lang',\n        default='zh_Hans',\n        help='Target language code (default: zh_Hans)'\n    )\n    \n    parser.add_argument(\n        '--example-po',\n        default='luci/luci-app-qmodem/po/zh_Hans/qmodem.po',\n        help='Path to example PO file for translation reference'\n    )\n    \n    parser.add_argument(\n        '--output',\n        default='luci/luci-app-qmodem-next/po/zh_Hans/qmodem-next.po',\n        help='Output PO file path'\n    )\n    \n    parser.add_argument(\n        '--exclude-keys',\n        help='Path to PO file containing existing translations to exclude from translation'\n    )\n    \n    args = parser.parse_args()\n    \n    print(\"Step 1: Extracting i18n strings...\")\n    strings_data = extract_strings_as_json(args.sh_path, args.js_path)\n    print(f\"Extracted {len(strings_data)} strings\")\n    \n    # Exclude keys that already have translations\n    if args.exclude_keys:\n        print(f\"\\nStep 2: Excluding existing translations from {args.exclude_keys}...\")\n        excluded_keys = parse_po_file_translations(args.exclude_keys)\n        print(f\"Found {len(excluded_keys)} existing translations to exclude\")\n        \n        # Filter out excluded keys\n        original_count = len(strings_data)\n        strings_data = {k: v for k, v in strings_data.items() if k not in excluded_keys}\n        print(f\"Filtered {original_count - len(strings_data)} strings, {len(strings_data)} remaining for translation\")\n    \n    print(f\"\\nStep {'3' if args.exclude_keys else '2'}: Reading example PO file...\")\n    example_po = read_po_file_as_example(args.example_po)\n    \n    print(f\"\\nStep {'4' if args.exclude_keys else '3'}: Translating with LLM API...\")\n    translations = translate_with_llm(\n        strings_data,\n        args.api_base,\n        args.api_key,\n        args.model,\n        args.target_lang,\n        example_po\n    )\n    print(f\"Received {len(translations)} translations\")\n    \n    print(f\"\\nStep {'5' if args.exclude_keys else '4'}: Generating PO file...\")\n    generate_po_file(strings_data, translations, args.output)\n    \n    print(\"\\n✓ Translation completed successfully!\")\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "luci-app-qmodem/scripts/extract_i18n_strings.py",
    "content": "#!/usr/bin/env python3\n# -*- coding: utf-8 -*-\n\"\"\"\nExtract translatable strings from LuCI JavaScript files and shell scripts for i18n template generation.\nThis script searches for _() function calls in JS files and add_*_entry function calls in shell scripts.\n\"\"\"\n\nimport os\nimport re\nimport json\nimport sys\nfrom pathlib import Path\nfrom typing import Set, Dict, List\n\ndef extract_strings_from_file(file_path: str) -> List[Dict[str, any]]:\n    \"\"\"\n    Extract all strings from _() calls in a JavaScript file with location info.\n    \n    Args:\n        file_path: Path to the JavaScript file\n        \n    Returns:\n        List of dictionaries containing string, line number, and file path\n    \"\"\"\n    strings = []\n    \n    try:\n        with open(file_path, 'r', encoding='utf-8') as f:\n            lines = f.readlines()\n        \n        # Pattern to match _('string') or _(\"string\")\n        # Handle escaped quotes and multiline strings\n        patterns = [\n            # Single quoted strings\n            r\"_\\(\\s*'([^'\\\\]*(?:\\\\.[^'\\\\]*)*)'\\s*\\)\",\n            # Double quoted strings\n            r'_\\(\\s*\"([^\"\\\\]*(?:\\\\.[^\"\\\\]*)*)\"\\s*\\)',\n        ]\n        \n        for line_num, line in enumerate(lines, start=1):\n            for pattern in patterns:\n                matches = re.finditer(pattern, line)\n                for match in matches:\n                    string = match.group(1)\n                    # Unescape common escape sequences\n                    string = string.replace(r\"\\'\", \"'\")\n                    string = string.replace(r'\\\"', '\"')\n                    string = string.replace(r\"\\\\\", \"\\\\\")\n                    string = string.replace(r\"\\n\", \"\\n\")\n                    string = string.replace(r\"\\t\", \"\\t\")\n                    strings.append({\n                        'string': string,\n                        'line': line_num,\n                        'file': file_path\n                    })\n                \n    except Exception as e:\n        print(f\"Error processing {file_path}: {e}\", file=sys.stderr)\n    \n    return strings\n\ndef extract_strings_from_shell_file(file_path: str) -> List[Dict[str, any]]:\n    \"\"\"\n    Extract all strings from add_plain_info_entry, add_warning_message_entry, \n    and add_bar_info_entry calls in a shell script file with location info.\n    \n    Args:\n        file_path: Path to the shell script file\n        \n    Returns:\n        List of dictionaries containing string, line number, and file path\n    \"\"\"\n    strings = []\n    \n    try:\n        with open(file_path, 'r', encoding='utf-8') as f:\n            lines = f.readlines()\n        \n        # Pattern to match the three add_*_entry functions and extract the 3rd parameter\n        # These functions have format: add_*_entry \"param1\" \"param2\" \"param3\" ...\n        # We want to extract param3 (the translatable string)\n        # Pattern to match variables named \"class\" is also included\n        patterns = [\n            # Match add_plain_info_entry with 3rd parameter in double quotes\n            r'add_plain_info_entry\\s+(?:\"[^\"]*\"|\\'[^\\']*\\'|\\$\\w+)\\s+(?:\"[^\"]*\"|\\'[^\\']*\\'|\\$\\w+)\\s+\"([^\"]+)\"',\n            # Match add_plain_info_entry with 3rd parameter in single quotes\n            r\"add_plain_info_entry\\s+(?:\\\"[^\\\"]*\\\"|'[^']*'|\\$\\w+)\\s+(?:\\\"[^\\\"]*\\\"|'[^']*'|\\$\\w+)\\s+'([^']+)'\",\n            # Match add_warning_message_entry with 3rd parameter in double quotes\n            r'add_warning_message_entry\\s+(?:\"[^\"]*\"|\\'[^\\']*\\'|\\$\\w+)\\s+(?:\"[^\"]*\"|\\'[^\\']*\\'|\\$\\w+)\\s+\"([^\"]+)\"',\n            # Match add_warning_message_entry with 3rd parameter in single quotes\n            r\"add_warning_message_entry\\s+(?:\\\"[^\\\"]*\\\"|'[^']*'|\\$\\w+)\\s+(?:\\\"[^\\\"]*\\\"|'[^']*'|\\$\\w+)\\s+'([^']+)'\",\n            # Match add_bar_info_entry with 3rd parameter in double quotes\n            r'add_bar_info_entry\\s+(?:\"[^\"]*\"|\\'[^\\']*\\'|\\$\\w+)\\s+(?:\"[^\"]*\"|\\'[^\\']*\\'|\\$\\w+)\\s+\"([^\"]+)\"',\n            # Match add_bar_info_entry with 3rd parameter in single quotes\n            r\"add_bar_info_entry\\s+(?:\\\"[^\\\"]*\\\"|'[^']*'|\\$\\w+)\\s+(?:\\\"[^\\\"]*\\\"|'[^']*'|\\$\\w+)\\s+'([^']+)'\",\n            # Match with all variable named \"class\" parameters e.g. class=\"Base Info\"\n            r\"class\\s*=\\s*\\\"([^\\\"]+)\\\"\",\n            r\"class\\s*=\\s*'([^']+)'\",\n        ]\n        \n        for line_num, line in enumerate(lines, start=1):\n            for pattern in patterns:\n                matches = re.finditer(pattern, line)\n                for match in matches:\n                    string = match.group(1)\n                    # Unescape common escape sequences\n                    string = string.replace(r\"\\'\", \"'\")\n                    string = string.replace(r'\\\"', '\"')\n                    string = string.replace(r\"\\\\\", \"\\\\\")\n                    string = string.replace(r\"\\n\", \"\\n\")\n                    string = string.replace(r\"\\t\", \"\\t\")\n                    strings.append({\n                        'string': string,\n                        'line': line_num,\n                        'file': file_path\n                    })\n                \n    except Exception as e:\n        print(f\"Error processing {file_path}: {e}\", file=sys.stderr)\n    \n    return strings\n\ndef scan_directory(root_dir: str) -> List[Dict[str, any]]:\n    \"\"\"\n    Recursively scan directory for JavaScript files and extract strings.\n    \n    Args:\n        root_dir: Root directory to scan\n        \n    Returns:\n        List of dictionaries with string, line, and file information\n    \"\"\"\n    results = []\n    root_path = Path(root_dir)\n    \n    if not root_path.exists():\n        print(f\"Error: Directory {root_dir} does not exist\", file=sys.stderr)\n        return results\n    \n    # Find all .js files\n    for js_file in root_path.rglob('*.js'):\n        strings = extract_strings_from_file(str(js_file))\n        if strings:\n            # Store relative path for cleaner output\n            rel_path = js_file.relative_to(root_path)\n            for item in strings:\n                item['file'] = str(rel_path)\n                results.append(item)\n    \n    return results\n\ndef scan_shell_directory(root_dir: str) -> List[Dict[str, any]]:\n    \"\"\"\n    Recursively scan directory for shell script files and extract strings.\n    \n    Args:\n        root_dir: Root directory to scan\n        \n    Returns:\n        List of dictionaries with string, line, and file information\n    \"\"\"\n    results = []\n    root_path = Path(root_dir)\n    \n    if not root_path.exists():\n        print(f\"Error: Directory {root_dir} does not exist\", file=sys.stderr)\n        return results\n    \n    # Find all .sh files\n    for sh_file in root_path.rglob('*.sh'):\n        strings = extract_strings_from_shell_file(str(sh_file))\n        if strings:\n            # Store relative path for cleaner output\n            rel_path = sh_file.relative_to(root_path)\n            for item in strings:\n                item['file'] = str(rel_path)\n                results.append(item)\n    \n    return results\n\ndef generate_po_template(items: List[Dict[str, any]], output_file: str = None):\n    \"\"\"\n    Generate a PO (Portable Object) template file.\n    \n    Args:\n        items: List of dictionaries with string, line, and file information\n        output_file: Output file path (None for stdout)\n    \"\"\"\n    lines = []\n    lines.append('# Translation template for luci-app-qmodem-next')\n    lines.append('# Generated automatically by extract_i18n_strings.py')\n    lines.append('')\n    lines.append('msgid \"\"')\n    lines.append('msgstr \"\"')\n    lines.append('\"Content-Type: text/plain; charset=UTF-8\\\\n\"')\n    lines.append('')\n    \n    # Group by string to show all locations\n    string_locations = {}\n    for item in items:\n        string = item['string']\n        if string not in string_locations:\n            string_locations[string] = []\n        string_locations[string].append((item['file'], item['line']))\n    \n    # Sort by string\n    for string in sorted(string_locations.keys()):\n        # Add source comments\n        for file_path, line_num in sorted(string_locations[string]):\n            lines.append(f'#: {file_path}:{line_num}')\n        lines.append(f'msgid \"{escape_po_string(string)}\"')\n        lines.append('msgstr \"\"')\n        lines.append('')\n    \n    output = '\\n'.join(lines)\n    \n    if output_file:\n        with open(output_file, 'w', encoding='utf-8') as f:\n            f.write(output)\n        print(f\"PO template written to: {output_file}\")\n    else:\n        print(output)\n\ndef escape_po_string(s: str) -> str:\n    \"\"\"Escape special characters for PO file format.\"\"\"\n    s = s.replace('\\\\', '\\\\\\\\')\n    s = s.replace('\"', '\\\\\"')\n    s = s.replace('\\n', '\\\\n')\n    s = s.replace('\\t', '\\\\t')\n    return s\n\ndef generate_json_template(items: List[Dict[str, any]], output_file: str = None):\n    \"\"\"\n    Generate a JSON template file.\n    \n    Args:\n        items: List of dictionaries with string, line, and file information\n        output_file: Output file path (None for stdout)\n    \"\"\"\n    # Group by string to show all locations\n    string_locations = {}\n    for item in items:\n        string = item['string']\n        if string not in string_locations:\n            string_locations[string] = []\n        string_locations[string].append((item['file'], item['line']))\n    \n    # Create template with comments\n    template = {}\n    for string in sorted(string_locations.keys()):\n        # Add location info as comment (will be in _comment field)\n        locations = ', '.join([f'{f}:{l}' for f, l in sorted(string_locations[string])])\n        template[string] = {\n            \"_comment\": f\"Source: {locations}\",\n            \"translation\": \"\"\n        }\n    \n    output = json.dumps(template, ensure_ascii=False, indent=2)\n    \n    if output_file:\n        with open(output_file, 'w', encoding='utf-8') as f:\n            f.write(output)\n        print(f\"JSON template written to: {output_file}\")\n    else:\n        print(output)\n\ndef generate_txt_list(items: List[Dict[str, any]], output_file: str = None):\n    \"\"\"\n    Generate a simple text list of strings with source comments.\n    \n    Args:\n        items: List of dictionaries with string, line, and file information\n        output_file: Output file path (None for stdout)\n    \"\"\"\n    # Group by string to show all locations\n    string_locations = {}\n    for item in items:\n        string = item['string']\n        if string not in string_locations:\n            string_locations[string] = []\n        string_locations[string].append((item['file'], item['line']))\n    \n    lines = []\n    for string in sorted(string_locations.keys()):\n        # Add location comments\n        for file_path, line_num in sorted(string_locations[string]):\n            lines.append(f'# {file_path}:{line_num}')\n        lines.append(string)\n        lines.append('')\n    \n    output = '\\n'.join(lines)\n    \n    if output_file:\n        with open(output_file, 'w', encoding='utf-8') as f:\n            f.write(output)\n        print(f\"String list written to: {output_file}\")\n    else:\n        print(output)\n\ndef print_summary(items: List[Dict[str, any]]):\n    \"\"\"Print a summary of extracted strings.\"\"\"\n    print(\"\\n\" + \"=\"*70)\n    print(\"EXTRACTION SUMMARY\")\n    print(\"=\"*70)\n    \n    # Group by file\n    file_strings = {}\n    all_strings = set()\n    for item in items:\n        file_path = item['file']\n        string = item['string']\n        if file_path not in file_strings:\n            file_strings[file_path] = set()\n        file_strings[file_path].add(string)\n        all_strings.add(string)\n    \n    for file_path in sorted(file_strings.keys()):\n        print(f\"\\n{file_path}: {len(file_strings[file_path])} strings\")\n    \n    print(\"\\n\" + \"-\"*70)\n    print(f\"Total files processed: {len(file_strings)}\")\n    print(f\"Total unique strings: {len(all_strings)}\")\n    print(f\"Total occurrences: {len(items)}\")\n    print(\"=\"*70 + \"\\n\")\n\ndef main():\n    import argparse\n    \n    parser = argparse.ArgumentParser(\n        description='Extract translatable strings from LuCI JavaScript files and shell scripts',\n        formatter_class=argparse.RawDescriptionHelpFormatter,\n        epilog=\"\"\"\nExamples:\n  # Extract from default JS directory and show all strings\n  %(prog)s\n  \n  # Extract and generate PO template\n  %(prog)s --format po --output i18n_template.po\n  \n  # Extract from custom JS directory\n  %(prog)s --js-path /path/to/resources\n  \n  # Extract from both JS and shell script directories\n  %(prog)s --js-path luci/luci-app-qmodem-next/htdocs/luci-static/resources --sh-path application/qmodem/files/usr/share/qmodem\n        \"\"\"\n    )\n    \n    parser.add_argument(\n        '-d', '--directory',\n        help='[Deprecated] Use --js-path instead. Directory to scan for JavaScript files'\n    )\n    \n    parser.add_argument(\n        '--js-path',\n        default='luci/luci-app-qmodem-next/htdocs/luci-static/resources',\n        help='Directory to scan for JavaScript files (default: %(default)s)'\n    )\n    \n    parser.add_argument(\n        '--sh-path',\n        help='Directory to scan for shell script files with add_*_entry calls'\n    )\n    \n    parser.add_argument(\n        '-f', '--format',\n        choices=['txt', 'json', 'po'],\n        default='txt',\n        help='Output format: txt (plain list), json (JSON object), po (gettext template) (default: %(default)s)'\n    )\n    \n    parser.add_argument(\n        '-o', '--output',\n        help='Output file path (default: print to stdout)'\n    )\n    \n    parser.add_argument(\n        '-v', '--verbose',\n        action='store_true',\n        help='Show detailed information about each file'\n    )\n    \n    parser.add_argument(\n        '--no-summary',\n        action='store_true',\n        help='Do not print summary statistics'\n    )\n    \n    args = parser.parse_args()\n    \n    # Get the script directory\n    script_dir = Path(__file__).parent.absolute()\n    project_root = script_dir.parent\n    \n    # Handle deprecated --directory argument\n    js_path = args.js_path\n    if args.directory:\n        print(\"Warning: --directory is deprecated, use --js-path instead\", file=sys.stderr)\n        js_path = args.directory\n    \n    # Resolve JS directory path\n    if Path(js_path).is_absolute():\n        js_scan_dir = js_path\n    else:\n        js_scan_dir = project_root / js_path\n    \n    results = []\n    \n    # Extract strings from JavaScript files\n    print(f\"Scanning JavaScript directory: {js_scan_dir}\", file=sys.stderr)\n    js_results = scan_directory(str(js_scan_dir))\n    results.extend(js_results)\n    print(f\"Found {len(js_results)} strings in JavaScript files\", file=sys.stderr)\n    \n    # Extract strings from shell scripts if path is provided\n    if args.sh_path:\n        # Resolve shell script directory path\n        if Path(args.sh_path).is_absolute():\n            sh_scan_dir = args.sh_path\n        else:\n            sh_scan_dir = project_root / args.sh_path\n        \n        print(f\"Scanning shell script directory: {sh_scan_dir}\", file=sys.stderr)\n        sh_results = scan_shell_directory(str(sh_scan_dir))\n        results.extend(sh_results)\n        print(f\"Found {len(sh_results)} strings in shell scripts\", file=sys.stderr)\n    \n    if not results:\n        print(\"No translatable strings found!\", file=sys.stderr)\n        return 1\n    \n    # Print detailed results if verbose\n    if args.verbose:\n        # Group by file\n        file_items = {}\n        for item in results:\n            file_path = item['file']\n            if file_path not in file_items:\n                file_items[file_path] = []\n            file_items[file_path].append(item)\n        \n        for file_path in sorted(file_items.keys()):\n            print(f\"\\n{file_path}:\", file=sys.stderr)\n            for item in sorted(file_items[file_path], key=lambda x: x['line']):\n                print(f\"  Line {item['line']}: {item['string']}\", file=sys.stderr)\n    \n    # Generate output in requested format\n    print(file=sys.stderr)  # Blank line\n    if args.format == 'po':\n        generate_po_template(results, args.output)\n    elif args.format == 'json':\n        generate_json_template(results, args.output)\n    else:  # txt\n        generate_txt_list(results, args.output)\n    \n    # Print summary\n    if not args.no_summary:\n        print_summary(results)\n    \n    return 0\n\nif __name__ == '__main__':\n    sys.exit(main())\n"
  },
  {
    "path": "luci-app-qmodem/scripts/ubus_benchmark.py",
    "content": "#!/usr/bin/env python3\n\"\"\"\nUBUS 并发压测脚本 —— AT 命令批量发送与响应验证\n=====================================================\n\n主要用途\n--------\n1. 适配新模块：批量发送常用 AT 命令，快速确认模块基本功能正常。\n2. 故障排查：并发压测指定命令，定位模块或 at-daemon 在高负载下的异常响应。\n\n快速配置\n--------\n- IP          : 修改脚本顶部 `IP` 变量，填入 OpenWrt 设备的 IP 地址。\n                示例：IP = \"192.168.8.1\"\n\n- AT_PORT     : 修改 `AT_PORT`，填入模块对应的 AT 串口设备路径。\n                示例：AT_PORT = \"/dev/ttyUSB2\"\n                提示：可在设备上运行 `ls /dev/ttyUSB*` 或查看 qmodem 识别结果确认端口。\n\n- AT_COMMANDS : 修改 `AT_COMMANDS` 列表，填入需要测试的 AT 命令。\n                测试新模块时建议包含高级命令，如锁频查询、邻区搜索、网络状态等\n                例：AT_COMMANDS = [\"ATI\", \"AT+CSQ\", \"AT+CREG?\", \"AT+CGSN\"]\n\n- NUM_CALL : 修改测试次数，默认 100。\n- NUM_THREAD : 修改线程数，默认 10。\n                排查串口锁或队列溢出问题时可适当调大（如 500~1000）。\n\n- LOGIN_USERNAME / LOGIN_PASSWORD : OpenWrt 登录凭据，默认 root / 空密码。\n\n输出说明\n--------\n- 成功率、响应时间分布、按命令分组的统计结果会打印到终端。\n- 详细结果自动保存为 ubus_test_results_<timestamp>.json，便于离线分析。\n\"\"\"\n\nimport json\nimport time\nimport requests\nimport random\nfrom concurrent.futures import ThreadPoolExecutor, as_completed\nfrom threading import Lock\nfrom datetime import datetime\nIP=\"10.117.152.1\"\n# 配置\nOPENWRT_URL = f\"http://{IP}/ubus\"  # 修改为你的 OpenWrt 设备地址\nUBUS_SERVICE = \"at-daemon\"\nUBUS_METHOD = \"sendat\"\nAT_PORT = \"/dev/ttyUSB3\"\n\n# 登录凭据\nLOGIN_USERNAME = \"root\"\nLOGIN_PASSWORD = \"\"\n\n# AT 命令列表\nAT_COMMANDS = [\"ATI\", \"AT+CSQ\", \"AT+CGSN\", \"AT+CGMI\", \"AT+CGMM\"]\nNUM_THREAD = 10\nNUM_CALL = 100\n\n# 用于线程安全的统计\nstats_lock = Lock()\nresults = []\nsuccess_count = 0\nfailure_count = 0\n\n\ndef get_rpc_token(username: str = LOGIN_USERNAME, password: str = LOGIN_PASSWORD) -> str:\n    \"\"\"\n    通过 UBUS RPC 登录获取会话 token。\n\n    Args:\n        username: OpenWrt 用户名，默认从配置读取\n        password: OpenWrt 密码，默认从配置读取\n\n    Returns:\n        str: 成功时返回 ubus_rpc_session token；失败时抛出异常\n    \"\"\"\n    payload = {\n        \"jsonrpc\": \"2.0\",\n        \"id\": 1,\n        \"method\": \"call\",\n        \"params\": [\n            \"00000000000000000000000000000000\",\n            \"session\",\n            \"login\",\n            {\"username\": username, \"password\": password}\n        ]\n    }\n    headers = {\"Content-Type\": \"application/json\"}\n\n    response = requests.post(OPENWRT_URL, json=payload, headers=headers, timeout=10)\n    response.raise_for_status()\n\n    data = response.json()\n    # 正常响应: {\"result\": [0, {\"ubus_rpc_session\": \"<token>\", ...}]}\n    if \"result\" not in data or len(data[\"result\"]) < 2:\n        raise RuntimeError(f\"登录响应格式异常: {data}\")\n\n    code, body = data[\"result\"][0], data[\"result\"][1]\n    if code != 0:\n        raise RuntimeError(f\"登录失败，UBUS 错误码: {code}\")\n\n    token = body.get(\"ubus_rpc_session\")\n    if not token:\n        raise RuntimeError(f\"响应中未找到 ubus_rpc_session: {body}\")\n\n    return token\n\n\ndef make_ubus_call(thread_id, token: str = \"00000000000000000000000000000000\"):\n    \"\"\"\n    执行单次 UBUS 调用\n    \n    Args:\n        thread_id: 线程编号\n        token: UBUS RPC 会话 token\n        \n    Returns:\n        dict: 包含测试结果的字典\n    \"\"\"\n    global success_count, failure_count\n    \n    # 随机选择一个 AT 命令\n    at_cmd = random.choice(AT_COMMANDS)\n    \n    ubus_params = {\n        \"at_port\": AT_PORT,\n        \"at_cmd\": at_cmd\n    }\n    \n    payload = {\n        \"jsonrpc\": \"2.0\",\n        \"id\": thread_id,\n        \"method\": \"call\",\n        \"params\": [token, UBUS_SERVICE, UBUS_METHOD, ubus_params]\n    }\n    \n    headers = {\n        \"Content-Type\": \"application/json\"\n    }\n    \n    result = {\n        \"thread_ids\": thread_id,\n        \"at_cmd\": at_cmd,\n        \"start_time\": None,\n        \"end_time\": None,\n        \"duration_ms\": None,\n        \"status\": \"failure\",\n        \"response\": None,\n        \"response_time_ms\": None,\n        \"error\": None\n    }\n    \n    try:\n        result[\"start_time\"] = time.time()\n        response = requests.post(\n            OPENWRT_URL,\n            json=payload,\n            headers=headers,\n            timeout=30\n        )\n        result[\"end_time\"] = time.time()\n        result[\"duration_ms\"] = (result[\"end_time\"] - result[\"start_time\"]) * 1000\n        \n        if response.status_code == 200:\n            data = response.json()\n\n            # JSON-RPC 层错误（如 -32002 Access denied）\n            if \"error\" in data:\n                rpc_err = data[\"error\"]\n                code = rpc_err.get(\"code\", \"?\")\n                msg = rpc_err.get(\"message\", \"unknown\")\n                result[\"error\"] = f\"RPC error {code}: {msg}\"\n                with stats_lock:\n                    failure_count += 1\n\n            # 检查 UBUS 调用是否成功\n            elif \"result\" in data and len(data[\"result\"]) >= 2:\n                ubus_result = data[\"result\"][1]\n                \n                if ubus_result.get(\"status\") == \"success\":\n                    result[\"status\"] = \"success\"\n                    result[\"response\"] = ubus_result.get(\"response\", \"\")\n                    result[\"response_time_ms\"] = ubus_result.get(\"response_time_ms\", 0)\n                    \n                    with stats_lock:\n                        success_count += 1\n                else:\n                    result[\"error\"] = f\"UBUS call failed: {ubus_result.get('status')}\"\n                    with stats_lock:\n                        failure_count += 1\n            else:\n                result[\"error\"] = f\"Unexpected response format: {data}\"\n                with stats_lock:\n                    failure_count += 1\n        else:\n            result[\"error\"] = f\"HTTP error: {response.status_code}\"\n            with stats_lock:\n                failure_count += 1\n                \n    except requests.exceptions.Timeout:\n        result[\"error\"] = \"Request timeout\"\n        with stats_lock:\n            failure_count += 1\n    except requests.exceptions.RequestException as e:\n        result[\"error\"] = f\"Request exception: {str(e)}\"\n        with stats_lock:\n            failure_count += 1\n    except Exception as e:\n        result[\"error\"] = f\"Unexpected error: {str(e)}\"\n        with stats_lock:\n            failure_count += 1\n    \n    return result\n\n\ndef main():\n    \"\"\"主函数：执行并发测试\"\"\"\n    print(\"=\" * 80)\n    print(\"UBUS 并发测试\")\n    print(\"=\" * 80)\n    print(f\"目标地址: {OPENWRT_URL}\")\n    print(f\"服务: {UBUS_SERVICE}\")\n    print(f\"方法: {UBUS_METHOD}\")\n    print(f\"AT 端口: {AT_PORT}\")\n    print(f\"AT 命令列表: {', '.join(AT_COMMANDS)}\")\n    print(f\"并发线程数: {NUM_CALL}\")\n    print(f\"线程组数: {NUM_CALL // NUM_THREAD + (1 if NUM_CALL % NUM_THREAD else 0)}\")\n    print(\"=\" * 80)\n    print()\n\n    # 登录获取 RPC token\n    print(f\"正在登录 {OPENWRT_URL} (用户: {LOGIN_USERNAME}) ...\")\n    try:\n        rpc_token = get_rpc_token()\n        print(f\"登录成功，token: {rpc_token[:8]}...{rpc_token[-4:]}\\n\")\n    except Exception as e:\n        print(f\"登录失败: {e}\")\n        return\n\n    # 开始测试\n    start_time = time.time()\n    print(f\"开始时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}\")\n    print(f\"启动 {NUM_THREAD} 个并发线程 发起 {NUM_CALL}次请求...\\n\")\n    \n    # 使用线程池执行并发请求\n    with ThreadPoolExecutor(max_workers=NUM_THREAD) as executor:\n        # 提交所有任务\n        futures = {executor.submit(make_ubus_call, i, rpc_token): i for i in range(1, NUM_CALL + 1)}\n        \n        # 等待所有任务完成并收集结果\n        for future in as_completed(futures):\n            result = future.result()\n            results.append(result)\n            \n            # 显示进度\n            completed = len(results)\n            if completed % NUM_THREAD == 0 or completed == NUM_CALL:\n                print(f\"进度: {completed}/{NUM_CALL} 完成\")\n    \n    end_time = time.time()\n    total_duration = end_time - start_time\n    \n    print()\n    print(\"=\" * 80)\n    print(\"测试完成！\")\n    print(\"=\" * 80)\n    print(f\"结束时间: {datetime.now().strftime('%Y-%m-%d %H:%M:%S.%f')[:-3]}\")\n    print(f\"总耗时: {total_duration:.3f} 秒\")\n    print()\n    \n    # 统计结果\n    print(\"=\" * 80)\n    print(\"统计结果\")\n    print(\"=\" * 80)\n    print(f\"请求统计: 成功 {success_count} / 失败 {failure_count} / 总数 {NUM_CALL} (成功率: {(success_count / NUM_CALL * 100):.2f}%)\")\n    print()\n    \n    # 计算成功请求的响应时间统计\n    if success_count > 0:\n        successful_results = [r for r in results if r[\"status\"] == \"success\"]\n        response_times = [r[\"response_time_ms\"] for r in successful_results]\n        request_durations = [r[\"duration_ms\"] for r in successful_results]\n        \n        print(f\"AT 响应时间 (ms): 最小 {min(response_times)} / 最大 {max(response_times)} / 平均 {sum(response_times) / len(response_times):.2f}\")\n        print(f\"HTTP 请求耗时 (ms): 最小 {min(request_durations):.2f} / 最大 {max(request_durations):.2f} / 平均 {sum(request_durations) / len(request_durations):.2f}\")\n        print()\n    \n    # 统计响应内容分组\n    print(\"=\" * 80)\n    print(\"响应内容统计（按内容分组）\")\n    print(\"=\" * 80)\n    \n    # 对成功的响应按 AT 命令和内容分组\n    response_groups = {}\n    for result in results:\n        if result[\"status\"] == \"success\":\n            at_cmd = result.get(\"at_cmd\", \"unknown\")\n            response_content = result[\"response\"]\n            group_key = f\"{at_cmd}||{response_content}\"\n            \n            if group_key not in response_groups:\n                response_groups[group_key] = {\n                    \"at_cmd\": at_cmd,\n                    \"response\": response_content,\n                    \"count\": 0,\n                    \"thread_ids\": [],\n                    \"response_times\": []\n                }\n            response_groups[group_key][\"count\"] += 1\n            response_groups[group_key][\"thread_ids\"].append(result[\"thread_id\"])\n            response_groups[group_key][\"response_times\"].append(result[\"response_time_ms\"])\n    \n    # 打印分组统计\n    group_num = 1\n    for group_key, group_info in sorted(response_groups.items()):\n        print(f\"\\n[组 #{group_num}] AT命令: {group_info['at_cmd']} | 次数: {group_info['count']}\")\n        \n        # 计算该组的响应时间统计\n        times = group_info['response_times']\n        print(f\"  响应时间(ms): 最小 {min(times)} / 最大 {max(times)} / 平均 {sum(times) / len(times):.2f}\")\n        \n        thread_ids_str = ', '.join(map(str, group_info['thread_ids'][:10]))\n        if group_info['count'] > 10:\n            thread_ids_str += f\" ... (共{group_info['count']}个线程)\"\n        print(f\"  线程: {thread_ids_str}\")\n        \n        # 格式化显示响应内容 - 单行显示\n        response_content = group_info['response'].replace('\\r\\n', ' ').replace('\\n', ' ').strip()\n        # 限制长度避免过长\n        if len(response_content) > 150:\n            response_content = response_content[:150] + \"...\"\n        print(f\"  响应: {response_content}\")\n        \n        group_num += 1\n    \n    # 统计失败的情况\n    if failure_count > 0:\n        print(f\"\\n失败情况统计:\")\n        error_groups = {}\n        for result in results:\n            if result[\"status\"] == \"failure\":\n                error_msg = result[\"error\"]\n                if error_msg not in error_groups:\n                    error_groups[error_msg] = {\n                        \"count\": 0,\n                        \"thread_ids\": []\n                    }\n                error_groups[error_msg][\"count\"] += 1\n                error_groups[error_msg][\"thread_ids\"].append(result[\"thread_id\"])\n        \n        for error_msg, error_info in error_groups.items():\n            thread_ids_str = ', '.join(map(str, error_info['thread_ids'][:10]))\n            if error_info['count'] > 10:\n                thread_ids_str += f\" ... (共{error_info['count']}个)\"\n            print(f\"  [{error_msg}] 次数: {error_info['count']} | 线程: {thread_ids_str}\")\n    \n    \n    # 统计每个 AT 命令的使用情况\n    print(\"\\n\" + \"=\" * 80)\n    print(\"AT 命令分布统计\")\n    print(\"=\" * 80)\n    at_cmd_stats = {}\n    for result in results:\n        cmd = result.get(\"at_cmd\", \"unknown\")\n        if cmd not in at_cmd_stats:\n            at_cmd_stats[cmd] = {\n                \"count\": 0,\n                \"success\": 0,\n                \"failure\": 0,\n                \"response_times\": []\n            }\n        at_cmd_stats[cmd][\"count\"] += 1\n        if result[\"status\"] == \"success\":\n            at_cmd_stats[cmd][\"success\"] += 1\n            at_cmd_stats[cmd][\"response_times\"].append(result[\"response_time_ms\"])\n        else:\n            at_cmd_stats[cmd][\"failure\"] += 1\n    \n    for cmd, stats in sorted(at_cmd_stats.items()):\n        success_rate = (stats['success'] / stats['count'] * 100) if stats['count'] > 0 else 0\n        print(f\"{cmd}: 成功 {stats['success']} / 失败 {stats['failure']} / 总数 {stats['count']} (成功率: {success_rate:.2f}%)\", end=\"\")\n        if stats['response_times']:\n            avg_time = sum(stats['response_times']) / len(stats['response_times'])\n            print(f\" | 响应时间(ms): 最小 {min(stats['response_times'])} / 最大 {max(stats['response_times'])} / 平均 {avg_time:.2f}\")\n        else:\n            print()\n    \n    print()\n    print(\"=\" * 80)\n    \n    # 保存结果到 JSON 文件\n    output_file = f\"ubus_test_results_{datetime.now().strftime('%Y%m%d_%H%M%S')}.json\"\n    with open(output_file, 'w', encoding='utf-8') as f:\n        json.dump({\n            \"test_config\": {\n                \"url\": OPENWRT_URL,\n                \"service\": UBUS_SERVICE,\n                \"method\": UBUS_METHOD,\n                \"at_port\": AT_PORT,\n                \"at_commands\": AT_COMMANDS,\n                \"NUM_CALL\": NUM_CALL\n            },\n            \"summary\": {\n                \"total_requests\": NUM_CALL,\n                \"success_count\": success_count,\n                \"failure_count\": failure_count,\n                \"success_rate\": success_count / NUM_CALL * 100,\n                \"total_duration_seconds\": total_duration,\n                \"at_cmd_stats\": at_cmd_stats\n            },\n            \"results\": results\n        }, f, ensure_ascii=False, indent=2)\n    \n    print(f\"详细结果已保存到: {output_file}\")\n    print()\n\n\nif __name__ == \"__main__\":\n    main()\n"
  },
  {
    "path": "luci-app-qmodem/scripts/update_support_list.py",
    "content": "import json\nimport sys\n\n\n\n\ndef generate_markdown(result):\n# 生成 Markdown 格式\n    markdown_output = []\n    for vendor, models in result.items():\n        markdown_output.append(f\"# {vendor}\")\n        markdown_output.append(\"Model | Platform | USB  | PCIe \")\n        markdown_output.append(\"--- | --- | --- | ---\")\n        for model, support in models.items():\n            markdown_output.append(f\"{model} | {support['platform']} |{support['usb']} | {support['pcie']}\")\n        markdown_output.append(\"\")  # 空行分隔\n    return markdown_output\n\ndef generate_github_release_notes(result):\n    # 生成 GitHub 发布说明格式\n    release_notes = []\n    for vendor, models in result.items():\n        release_notes.append(f\"## {vendor}\")\n        for model, support in models.items():\n            release_notes.append(f\"- {model}: USB - {support['usb']}, PCIe - {support['pcie']}\")\n        release_notes.append(\"\")\n    return release_notes\n\n\nif __name__ == \"__main__\":\n    prefix = sys.argv[1] if len(sys.argv) > 1 else 'support_list'\n    file_name = sys.argv[2] if len(sys.argv) > 2 else 'application/qmodem/files/usr/share/qmodem/modem_support.json'\n    # 加载 JSON 数据\n    with open(file_name, 'r') as file:\n        data = json.load(file)\n\n    # 初始化结果字典\n    result = {}\n\n    # 遍历 USB 和 PCIe 数据\n    for interface_type in ['usb', 'pcie']:\n        for model, details in data['modem_support'][interface_type].items():\n            vendor = details.get('manufacturer', 'unknown').lower()\n            platform = details.get('platform', 'unknown').lower()\n            modes = ','.join(details.get('modes', []))\n            support = f\"✔ {interface_type}({modes})\"\n            \n            if vendor not in result:\n                result[vendor] = {}\n            if model not in result[vendor]:\n                result[vendor][model] = {'usb': '✘', 'pcie': '✘'}\n            \n            result[vendor][model][interface_type] = support\n            result[vendor][model]['platform'] = platform\n    markdown_output = generate_markdown(result)\n    release_notes = generate_github_release_notes(result)\n    with open(f\"{prefix}.md\", 'w') as f:\n        f.write(\"\\n\".join(markdown_output))\n    with open(f\"{prefix}_release_notes.md\", 'w') as f:\n        f.write(\"\\n\".join(release_notes))\n"
  },
  {
    "path": "luci-app-qmodem/version.mk",
    "content": "# Unified version management for modem_feeds\n# This file should be included by all Makefiles in the feeds\ndefine qmodem_commitcount\n$(shell \\\n  if git log -1 >/dev/null 2>/dev/null; then \\\n    if [ -n \"$(1)\" ]; then \\\n      last_bump=\"$$(git log --pretty=format:'%h %s' . | \\\n        grep -m 1 -e ': [uU]pdate to ' -e ': [bB]ump to ' | \\\n        cut -f 1 -d ' ')\"; \\\n    fi; \\\n    if [ -n \"$$last_bump\" ]; then \\\n      echo -n $$(($$(git rev-list --count \"$$last_bump..HEAD\" .) + 1)); \\\n    else \\\n      echo -n $$(git rev-list --count HEAD .); \\\n    fi; \\\n  else \\\n    echo -n 0; \\\n  fi)\nendef\n\nQMODEM_COMMITCOUNT = $(if $(DUMP),0,$(call qmodem_commitcount))\nQMODEM_AUTORELEASE = $(if $(DUMP),0,$(call qmodem_commitcount,1))\n\nQMODEM_VERSION:=3.0.2\nQMODEM_RELEASE:=$(QMODEM_AUTORELEASE)\n"
  },
  {
    "path": "luci-app-quickstart/Makefile",
    "content": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for quickstart \nLUCI_DEPENDS:=+quickstart +luci-app-store\nLUCI_PKGARCH:=all\n\nPKG_VERSION:=0.12.7-r1\n# PKG_RELEASE MUST be empty for luci.mk\nPKG_RELEASE:=\n\nLUCI_MINIFY_CSS:=0\nLUCI_MINIFY_JS:=0\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n\n"
  },
  {
    "path": "luci-app-quickstart/htdocs/luci-static/quickstart/i18n/en.json",
    "content": "{\"en\":{\"- -自定义- -\":\"- -Custom- -\",\"（请先获取IPv4上游信息）\":\"(Please obtain IPv4 upstream information first)\",\"（未格式化）\":\"(Not formatted)\",\"（未挂载）\":\"(Not mounted)\",\"（无DNS服务器，请之后自行填写公共DNS服务器，例如 223.5.5.5）\":\"(No DNS server, please fill in the public DNS server later, such as 223.5.5.5)\",\"（系统分区）\":\"(System partition)\",\"（系统盘）\":\"(System disk)\",\"* 表示每天\":\"* Means daily\",\"* 表示每小时\":\"* Means hourly\",\"* 表示每月\":\"* Means monthly\",\"%{ countdown }s后 跳转新地址\":\"%{ countdown }s before redirecting to new address\",\"%{ days }天\":[\"%{ days } d \",\"%{ days } d \"],\"%{ hours }小时\":[\"%{ hours } h\",\"%{ hours } h\"],\"%{ minutes }分\":[\" %{ minutes } min\",\" %{ minutes } min\"],\"%{ seconds }秒\":[\" %{ seconds } sec\",\" %{ seconds } sec\"],\"%{status}下载服务配置向导\":\"%{status} download service configuration wizard\",\"1、点击“提交”可将变更合并到非沙箱环境\":\"1. Click 'Submit' to merge changes into non-sandbox environment\",\"1. 满足上述条件以后，点击“当前 IPv4 上游信息”以刷新当前连接信息，成功以后，“自动填写”按钮将被激活。(失败可再次点击)\":\"1. After the above conditions are met, click 'Current IPv4 Upstream Information' to refresh the current connection information. After success, the 'Auto Fill' button will be activated. (Click again if failed)\",\"2、点击“重置”可将沙箱恢复到初始状态\":\"2. Click 'Reset' to restore the sandbox to its initial state\",\"2. 点击“自动填写”，将切换到参数页并自动填写。此时依然可以自行调整参数。\":\"2. Click 'Auto-fill' to switch to the parameter page and auto-fill. Parameters can still be adjusted manually.\",\"223.5.5.5\":\"223.5.5.5\",\"3、点击“退出”可退出沙箱环境，并放弃沙箱中的数据\":\"3. Click 'Exit' to exit the sandbox environment and abandon the data in the sandbox\",\"阿里云\":\"Aliyun\",\"安装失败\":\"Installation Failed\",\"安装失败，\":\"Installation Failed,\",\"安装失败或超时，请检查软件源或稍候重试\":\"Installation Failed or Timed Out, Please Check Software Source or Retry Later\",\"安装中...\":\"Installing...\",\"半双工\":\"Half Duplex\",\"保持DHCP服务设置\":\"Keep DHCP Service Settings\",\"保存\":\"Save\",\"保存并应用\":\"Save and Apply\",\"保存成功\":\"Saved Successfully\",\"保存配置\":\"Save Configuration\",\"保存中...\":\"Saving...\",\"备份升级\":\"Backup/Flash\",\"备用DNS地址\":\"Backup DNS Address\",\"备用DNS服务器\":\"Backup DNS Server\",\"备用DNS服务器地址\":\"Backup DNS Server Address\",\"本向导支持自动或手动配置：\":\"This wizard supports automatic or manual configuration:\",\"编辑\":\"Edit\",\"编辑LAN\":\"Edit LAN\",\"编辑WAN\":\"Edit WAN\",\"并挂载到\":\"And Mount to\",\"访客\":\"visitor\",\"拨号上网\":\"PPPoE\",\"不格式化,使用原文件系统\":\"Do Not Format, Use Original File System\",\"不支持挂载\":\"Not Supported for Mounting\",\"操作\":\"Operation\",\"测试时磁盘会转动，请选择合适的模式来控制磁盘转动。\":\"Disk will spin during testing, please choose the appropriate mode to control disk spinning.\",\"测速\":\"Speedtest\",\"插件备份\":\"APP Backup\",\"查看磁盘管理信息\":\"Disk Actions\",\"查看存储服务信息\":\"Actions\",\"查看高级配置\":\"Acrions\",\"查看更多详情\":\" to check details\",\"查看教程\":\"View tutorial\",\"查看日志\":\"View log\",\"查看设备信息\":\"Check Clients\",\"查看网络接口信息\":\"NIC Info\",\"查看系统信息\":\"System Utils\",\"查看详情\":\"View details\",\"常规设置\":\"General Settings\",\"成员\":\"Member\",\"初始化成功\":\"Initialized Successfully\",\"初始化中...\":\"Initializing...\",\"处理中...\":\"Processing...\",\"传输时自检\":\"Self-Test During Transfer\",\"窗口 %{ item }\":\"Window %{ item }\",\"创建\":\"Create\",\"创建成功\":\"Created Successfully\",\"创建计划任务\":\"Create Scheduled Task\",\"创建中...\":\"Creating...\",\"创建RAID\":\"Create RAID\",\"磁盘\":\"Disk\",\"磁盘管理\":\"Disk Manager\",\"磁盘信息\":\"Disk Info\",\"磁盘阵列成员：\":\"RAID array members:\",\"此操作会将会删除该分区全部数据\":\"This operation will delete all data on this partition\",\"此操作会将会删除该分区全部数据，并格式化成EXT4，随后自动重启进入沙箱模式，是否继续？\":\"This operation will delete all data on the partition and format it to EXT4, then automatically reboot into sandbox mode. Do you want to continue?\",\"此分区为只读状态，可能无法写入数据\":\"This partition is read-only, data may not be writable\",\"此文件系统不支持Docker等应用数据，建议格式化成EXT4文件系统\":\"This file system does not support Docker and other application data, it is recommended to format as EXT4 file system\",\"存储服务\":\"Share\",\"错误\":\"Error\",\"带宽监控\":\"Bandwidth Monitor\",\"待机\":\"Standby\",\"待机-处于待机和睡眠模式下不检查设备。此模式下磁盘一般不旋转，如果你不想每次检查都转动磁盘，那么这个模式比较适合。\":\"Standby - The device is not checked in standby and sleep mode. In this mode, the disk generally does not rotate. If you do not want to spin the disk every time you check, then this mode is more suitable.\",\"当前 IPv4 上游信息（点此刷新）\":\"Current IPv4 upstream information (click here to refresh)\",\"当前处于沙箱环境：\":\"Currently in sandbox environment:\",\"当前软件源\":\"Current software source\",\"当前状态:\":\"Current status:\",\"当系统根目录空间不足时，可将Docker根目录迁移到外置硬盘，以保证系统的正常运行（目标分区不支持NTFS，FAT等文件系统）\":\"When the system root directory space is insufficient, you can migrate the Docker root directory to an external hard disk to ensure the normal operation of the system (the target partition does not support NTFS, FAT and other file systems)\",\"地址\":\"Address\",\"登录过期，请重新登录\":\"Login expired, please log in again\",\"等待设备重启，重启完成后\":\"Waiting for device to restart, after restart\",\"点此自动配置 AriaNg\":\"Click here to auto-configure AriaNg\",\"点击“自动配置”按钮开始自动配置向导；\":\"Click the 'Auto' button to start the automatic configuration wizard;\",\"电路的运行情况进行监控、记录并与厂商所设定的预设安全值进行比较，若监控情况将要或已超出预设安全值的安全范围，\":\"and compared with the preset safety value set by the manufacturer. If the monitoring situation is about to or has exceeded the safety range of the preset safety value, \",\"电源模式\":\"Power mode\",\"调度\":\"Schedule\",\"调试\":\"Debug\",\"读取结果失败\":\"Failed to read result\",\"读写\":\"Read/write\",\"短暂自检\":\"Short self-test\",\"发送：\":\"Send:\",\"返回\":\"Return\",\"访问地址：\":\"Access address:\",\"非法的用户名\":\"Invalid username\",\"分区 / 挂载点\":\"Partition / Mount Point\",\"分区并格式化\":\"Partition and Format\",\"分区存在异常，点击分区列表查看错误\":\"Partition Abnormal, Click Partition List to View Errors\",\"分区信息\":\"Partition Information\",\"服务-动态DNS\":\"Service - Dynamic DNS\",\"服务地址:\":\"Service address:\",\"服务路径:\":\"Service path:\",\"服务目录路径\":\"Service directory path\",\"服务已启动\":\"Service started\",\"附加的 BT Tracker：\":\"Additional BT Tracker:\",\"覆盖迁移（覆盖目标路径，继续迁移会清空该目标路径下的文件）\":\"Overwrite migration (overwrite target path, continuing migration will clear files under the target path)\",\"该分区尚未挂载，请先去挂载\":\"This partition is not yet mounted, please mount it first\",\"该固件不支持沙箱模式\":\"Current firmware does not support sandbox\",\"该目标路径不为空\":\"The target path is not empty\",\"高级模式\":\"Advanced mode\",\"高级设置\":\"Advanced settings\",\"格式化\":\"Format\",\"格式化并挂载\":\"Format and mount\",\"格式化成功\":\"Format successful\",\"格式化分区\":\"Format partition\",\"格式化为EXT4文件系统\":\"Format as EXT4 file system\",\"格式化选项\":\"Format options\",\"格式化中...\":\"Formatting...\",\"更换目录（不覆盖目标路径，仅将Docker目录修改为目标路径）\":\"Change directory (does not overwrite target path, only changes Docker directory to target path)\",\"更换配置\":\"Change configuration\",\"功能\":\"Function\",\"共享路径不能为空\":\"Share Path Cannot Be Empty\",\"共享名（建议使用英文字母）\":\"Share Name (Recommended to Use English Letters)\",\"共享名称\":\"Share Name\",\"共享名称不能为空\":\"Share Name Cannot Be Empty\",\"固件版本\":\"Firmware Ver.\",\"固件更新\":\"OTA\",\"固件更新选项\":\"OTA Options\",\"挂载成功\":\"Mount successful\",\"挂载点\":\"Mount Points\",\"挂载路径:\":\"Mount path:\",\"挂载信息\":\"Mount information\",\"挂载中...\":\"Mounting...\",\"关闭\":\"Close\",\"花生壳\":\"Oray\",\"欢迎使用 NAS 配置向导\":\"Welcome to the NAS configuration wizard\",\"欢迎使用网络配置向导\":\"Welcome to the network configuration wizard\",\"恢复\":\"Restore\",\"恢复完成\":\"Restore complete\",\"获取不到分区\":\"Cannot get partition\",\"获取不到分区路径\":\"Cannot get partition path\",\"获取不到分区ID\":\"Cannot get partition ID\",\"获取不到设备路径\":\"Cannot get device path\",\"获取不到设备名称\":\"Cannot get device name\",\"级别\":\"Level\",\"即将重启设备\":\"Device Will Restart Soon\",\"计划任务\":\"Scheduled tasks\",\"继续\":\"Continue\",\"继续保存\":\"Continue saving\",\"继续配置\":\" to continue configuration\",\"加载磁盘信息失败\":\"Load disk info failed\",\"加载中...\":\"Loading...\",\"兼容一些电视或者电视盒子\":\"Compatible with Some TVs or TV Boxes\",\"检测不到挂载的磁盘信息，请先插上磁盘，建议使用U盘或者移动硬盘，方便装卸\":\"No mounted disk information detected, please insert a disk, recommended to use a USB drive or external hard drive for easy mounting/unmounting\",\"检测不到可用磁盘阵列成员\":\"No available RAID array members detected\",\"检测到你尚未安装 %{name} 插件,是否安装？\":\"Detected that you have not installed %{name} plugin, install now?\",\"检测到你有未保存的配置，可前往页面右上角点击查看，保存并应用或者恢复配置后继续\":\"It is detected that you have unsaved configuration. You can go to the upper right corner of the page and click View, Save and Apply, or Restore the configuration to continue\",\"检测到您的wan口没有公网IP或者IPv6地址，可以使用DDNSTO配置远程域名访问\":\"Detected that your WAN port has no public IP or IPv6 address, you can use DDNSTO to configure remote domain access\",\"检测到您还没有挂载外置硬盘或分区小于8GB，需要您接上硬盘并格式化或手动挂载硬盘后，再执行Docker迁移向导，将Docker迁移到目标硬盘。\":\"It is detected that you have not mounted the external hard disk or the partition is less than 8GB. You need to connect the hard disk and format it or manually mount the hard disk, and then execute the Docker Migration Wizard to migrate Docker to the target hard disk.\",\"检测中...\":\"Detecting ...\",\"检查插件状态失败\":\"Failed to check plugin status\",\"检查中...\":\"Checking ...\",\"健康\":\"Healthy\",\"将扫描磁盘里 RAID 的磁盘阵列配置并恢复，确定要恢复 RAID 磁盘阵列吗？\":\"Will Scan Disk RAID Array Configuration and Restore, Are You Sure to Restore RAID Array?\",\"接收：\":\"Receive:\",\"仅统计已挂载分区\":\"Only Count Mounted Partitions\",\"进入控制台\":\"Enter console\",\"进行测速\":\" to test speed\",\"禁用\":\"Disable\",\"警告：该操作将初始化 %{model} 硬盘并创建分区，请你谨慎操作\":\"Warning: This operation will initialize %{model} hard drive and create partitions, please proceed with caution\",\"警告：格式化会清空 %{partname} 分区数据，请你谨慎操作\":\"Warning: Formatting will clear all data on %{partname} partition, please proceed with caution\",\"静态地址\":\"Static\",\"静态网络\":\"Static\",\"静态IP地址\":\"Static IP Address\",\"就可以通过主机的监控硬件或软件自动向用户作出警告并进行轻微的自动修复，以提前保障硬盘数据的安全。\":\"the host's monitoring hardware or software can automatically warn the user and perform minor automatic repairs to ensure the safety of the hard disk data in advance.\",\"局域网文件共享（Samba）\":\"Local Network File Sharing (Samba)\",\"局域网文件共享（WebDAV）\":\"Local Network File Sharing (WebDAV)\",\"开启 NAT（可修复某些无线热点不能访问外网问题）\":\"Enable NAT (Can Fix Some Wireless Hotspots Not Accessing the Internet Issue)\",\"开启沙箱\":\"Enable Sandbox\",\"可读写状态：\":\"R/W Status: \",\"可前往\":\"Can Go\",\"控制台\":\"Dashboard\",\"跨设备共享（易有云）\":\"Cross-device sharing (Linkease)\",\"快速配置\":\"Guide\",\"宽带拨号连接\":\"PPPoE\",\"宽带密码\":\"PPPoE Password\",\"宽带账号\":\"PPPoE Account\",\"扩充\":\"Expand\",\"扩展信息\":\"Extended information\",\"类型\":\"Type\",\"离线时自检\":\"Self-test while offline\",\"连接现有路由器\":\"Connect to existing router\",\"链接\":\"Link\",\"流量统计\":\"Traffic\",\"路由器 IP 可能已经修改成功。若刷新页面失败，请重新连接路由器，否则请尝试重新配置。\":\"The router IP may have been modified successfully. If refreshing the page fails, please reconnect to the router, otherwise try to reconfigure it.\",\"没找到想要的配置？请使用%{link}\":\"Couldn't find the desired configuration? Please use %{link}\",\"密码\":\"Password\",\"密码：\":\"Password:\",\"密码不能为空\":\"Password Cannot Be Empty\",\"名称\":\"Name\",\"名称：\":\"Name:\",\"默认\":\"Default\",\"默认密码：\":\"Default password:\",\"默认用户名：\":\"Default username:\",\"目标磁盘（建议选择U盘或者移动硬盘，方便装卸）\":\"Target disk (recommended to use USB drive or external hard drive for easy mounting/unmounting)\",\"目标分区\":\"Target partition\",\"目标分区（分区大小须大于2G，将此分区作为外部 overlay 使用）\":\"Target partition (partition size must be greater than 2G, use this partition as an external overlay)\",\"目录\":\"Directory\",\"内存使用率\":\"Mem. Usage\",\"内核版本\":\"Kernel Ver.\",\"内网测速\":\"LAN Speedtest\",\"内网配置\":\"LAN Settings\",\"您的系统空间已不足，检测到您的Docker根目录位于系统根目录上，可能会影响系统的正常运行，建议使用Docker迁移向导将Docker根目录迁移到外置硬盘上。\":\"Your system space is insufficient. It is detected that your Docker root directory is located on the system root directory, which may affect the normal operation of the system. It is recommended to use the Docker Migration Wizard to migrate the Docker root directory to an external hard disk.\",\"您可以用上一级路由（主路由）拨号，然后用本路由来实现一些高级功能。\":\"You can dial using the upper level router (main router), and then use this router to implement some advanced functions.\",\"旁路由模式，也叫单臂路由模式。\":\"Bypass routing mode, also called single-arm routing mode.\",\"旁路由模式仅支持静态IP地址\":\"Bypass routing mode only supports static IP addresses\",\"旁路由配置前的准备工作\":\"Preparation before bypass routing configuration\",\"旁路由自动配置\":\"Bypass routing auto-configuration\",\"配置超时\":\"Configuration timeout\",\"配置成功\":\"Configuration successful\",\"配置成功！\":\"Configuration successful!\",\"配置互联网\":\"Configure internet\",\"配置宽带账号\":\"Configure PPPoE account\",\"配置目录\":\"Configure directory\",\"配置目录：\":\"Configure directory:\",\"配置旁路由网络\":\"Configure bypass router network\",\"配置沙箱重启中...\":\"Configuring sandbox rebooting...\",\"配置失败\":\"Configuration failed\",\"配置为旁路由\":\"Configure as bypass router\",\"配置中...\":\"Configuring...\",\"配置中....\":\"Configuring....\",\"启动失败\":\"Start failed\",\"启用\":\"Enable\",\"启用LAN口DHCP服务（用于从旁路由模式恢复成默认状态）\":\"Enable LAN Port DHCP Service (Used to Restore from Bypass Routing Mode to Default State)\",\"迁移成功！\":\"Migration successful!\",\"迁移到：\":\"Migrate to: \",\"前往\":\"Go to \",\"切换软件源\":\"Switch Software Source\",\"请尝试重新配置\":\"Please try to reconfigure\",\"请确保您已将本设备 WAN 口连接到上级路由器局域网（ LAN ）接口\":\"Please ensure that the WAN port of this device is connected to the LAN port of the upstream router\",\"请确保您已将路由 WAN 口连接到光猫\":\"Please ensure that the router's WAN port is connected to the optical modem\",\"请稍等1分钟生效后再使用。\":\"Please wait 1 minute for the settings to take effect before using.\",\"请输入%{title}\":\"Please enter %{title}\",\"请输入合法的地址\":\"Please enter a valid address\",\"请输入合法的IP地址\":\"Please enter a valid IP address\",\"请输入密码\":\"Please enter the password\",\"请输入迁移路径\":\"Please enter the migration path\",\"请输入用户名\":\"Please enter the username\",\"请输入BT Tracker服务器地址，多个地址使用换行或者英文逗号分隔\":\"Please enter the BT Tracker server address, use newline or comma to separate multiple addresses\",\"请输入DNS地址\":\"Please enter the DNS address\",\"请输入RPC令牌\":\"Please enter the RPC token\",\"请刷新界面\":\"Please refresh the interface\",\"请选择%{title}\":\"Please choose %{title}\",\"请选择磁盘\":\"Please select the disk\",\"请选择目标磁盘\":\"Please select the target disk\",\"请选择目标分区\":\"Please select the target partition\",\"请选择目标硬盘\":\"Please select the target hard drive\",\"请选择迁移路径\":\"Please select the migration path\",\"请选择软件源\":\"Please select the software source\",\"请选择需要添加的NAS服务\":\"Please select the NAS service to add\",\"请选择选项\":\"Please select an option\",\"请选择要删除的硬盘\":\"Please select the hard drive to delete\",\"请选择要添加的硬盘\":\"Please select the hard drive to add\",\"请选择一个硬盘或分区\":\"Please select a hard drive or partition\",\"请选择硬盘分区\":\"Please select the hard drive partition\",\"请选择至少%{min}块磁盘\":\"Please select at least %{min} disks\",\"请选择raid类型\":\"Please select the RAID type\",\"请在保存以后前往'网络-接口'页面配置接口详细参数\":\"Please go to the 'Network - Interface' page to configure interface details after saving\",\"取消\":\"Cancel\",\"去挂载\":\"Mount\",\"去卸载\":\"Umount\",\"全双工\":\"Full Duplex\",\"确定\":\"Confirm\",\"确定创建 %{name}？该操作不可逆,请谨慎操作\":\"Confirm to create %{name}? This operation is irreversible, please proceed with caution\",\"确定放弃沙箱中的数据？再次进入沙箱需要重新格式化相应磁盘分区\":\"Confirm to abandon data in the sandbox? Re-entering the sandbox requires reformatting the corresponding disk partition\",\"确定要删除 %{name} 该磁盘阵列吗？删除操作可能会导致数据丢失，请谨慎操作。删除成功后，如需另外组RAID，建议稍等几分钟后再试。\":\"Are you sure you want to delete the disk array %{name}? Deletion may result in data loss, so please proceed with caution. If you need to create another RAID after successful deletion, it is recommended that you wait a few minutes and try again.\",\"确定要删除 %{name} 吗?\":\"Are you sure to delete %{name}?\",\"确认\":\"Confirm\",\"认证失败？\":\"Authentication failed?\",\"容量\":\"Capacity\",\"如果您在RAID磁盘阵列中创建了文件系统，先卸载文件系统，后删除文件系统删除操作可能会导致数据丢失，请谨慎操作。\":\"If you have created a file system in the RAID disk array, uninstall the file system first and then delete the file system. Deleting the file system may result in data loss, so proceed with caution.\",\"如果温度大于或等于 N 摄氏度则报告.\":\"Report if Temperature is Greater Than or Equal to N Degrees Celsius.\",\"如果由于系统重置或重启导致的RAID设备丢失可以尝试通过下方'扫描恢复RAID'按钮恢复\":\"If the RAID device is lost due to system reset or restart, you can try to recover it by clicking the 'Scan and Recover RAID' button below.\",\"如需<b>临时</b>退出沙箱环境，请将设备关机后拔出相关磁盘，启动前插入相关磁盘可再次进入沙箱。<br/> 注意临时退出沙箱环境以后升级固件会导致之前的沙箱数据无效\":\"If you need to <b>temporarily</b> exit the sandbox environment, please shut down the device and unplug the relevant disk. Insert the relevant disk before starting to enter the sandbox again. <br/> Note that upgrading the firmware after temporarily exiting the sandbox environment will cause the previous sandbox data to become invalid\",\"如需对 Samba 或 WebDAV 进行更细致的权限控制，请使用“%{unishare}”\":\"For More Detailed Permission Control of Samba or WebDAV, Please Use '%{unishare}'\",\"软件源错误\":\"Feeds Inaccessible\",\"软件源配置\":\"Feeds Mirror\",\"扫描恢复RAID\":\"Scan to restore RAID\",\"扫描中...\":\"Scanning ...\",\"沙箱模式配置向导\":\"Sandbox mode configuration wizard\",\"沙箱已开启\":\"In Sandbox\",\"删除\":\"Delete\",\"删除 RAID 设备之前请先卸载文件系统\":\"Please Uninstall File System Before Deleting RAID Device\",\"删除成功\":\"Deleted Successfully\",\"删除中...\":\"Deleting...\",\"上传\":\"Upload\",\"上传:\":\"Upload:\",\"设备\":\"Device\",\"设备路由\":\"Routes\",\"设备信息\":\"Device Info\",\"设备型号\":\"Model\",\"设备重启中...\":\"Device rebooting...\",\"设备重启中... 若页面长时间未刷新可能需要手动填写地址\":\"Device rebooting... If the page does not refresh for a long time, you may need to manually enter the address\",\"设定哪一个 IP 地址（IPv4 或 IPv6）会被发送给 DDNS 提供商\":\"Specify which IP address (IPv4 or IPv6) will be sent to the DDNS provider\",\"使用全局配置\":\"Use Global Configuration\",\"使用易有云APP，随时随地远程下载\":\"Use Linkease APP for Remote Downloads Anytime, Anywhere\",\"使用DDNSTO\":\"Use DDNSTO\",\"是否立即创建 %{name}？选择的硬盘所有分区将会被清除，此操作可能会导致硬盘数据丢失，请谨慎操作。\":\"Do you want to create %{name} now? All partitions of the selected hard disk will be cleared. This operation may cause hard disk data loss. Please operate with caution.\",\"是否确定初始化?\":\"Are you sure to initialize?\",\"是否确定格式化 %{partname}?\":\"Are you sure to format %{partname}?\",\"是一种自动的硬盘状态检测与预警系统和规范。通过在硬盘硬件内的检测指令对硬盘的硬件如磁头、盘片、马达、\":\"Through the detection instructions in the hard disk hardware, the operation of the hard disk hardware such as the head, disk, motor, and circuit is monitored, recorded,\",\"手动挂载\":\"Manual mount\",\"手动配置\":\"Manual\",\"手动配置...\":\"Manual...\",\"手动配置则需自行获取主路由器的IP地址（例如 192.168.2.1 ）和子网掩码，记录以备后续填写，点击“手动配置”按钮，切换到参数配置页，按实际情况自行填写。\":\"For manual configuration, you need to obtain the IP address of the main router (for example, 192.168.2.1) and subnet mask, record them for later filling, click the 'Manual' button, switch to the parameter configuration page, and fill in the information according to the actual situation.\",\"手动在地址栏输入地址\":\"manually enter address in the address bar\",\"手工配置\":\"Manual configuration\",\"首先确认主路由开启了 DHCP 服务，确认本路由 WAN 口是 DHCP 客户端模式（默认即是，如果不是可使用“连接现有路由器”向导改成 DHCP 客户端），然后将本路由 WAN 口与主路由的 LAN 连接，以自动获取配置。\":\"First, make sure that the DHCP service is turned on on the main router, and confirm that the WAN port of this router is in DHCP client mode (it is by default. If not, you can use the 'Connect to an Existing Router' wizard to change it to DHCP client). Then connect the WAN port of this router to the LAN of the main router to automatically obtain the configuration.\",\"属性\":\"Attributes\",\"刷新页面\":\"Refresh Page\",\"睡眠\":\"Sleep\",\"睡眠-处于睡眠模式下不检查设备。\":\"Sleep - Do not check devices in sleep mode.\",\"提供 DHCPv4 服务\":\"Provide DHCPv4 service\",\"提供 DHCPv4 服务（需要关闭主路由 DHCP 服务）\":\"Provide DHCPv4 service (need to turn off main router DHCP service)\",\"提交\":\"Submit\",\"提交中...\":\"Submitting...\",\"提示\":\"Tip\",\"天\":\"Day\",\"添加成功\":\"Added successfully\",\"添加LAN\":\"Add LAN\",\"添加WAN\":\"Add WAN\",\"跳转教程\":\"Jump to tutorial\",\"统一文件共享\":\"Unified file sharing\",\"退出\":\"Exit\",\"外网测速\":\"Internet Speedtest\",\"完成\":\"Complete\",\"网关地址\":\"Gateway address\",\"网关地址: \":\"Gateway address: \",\"网口配置\":\"NIC Assignment\",\"网络地址:\":\"Network address:\",\"网络接口状态\":\"NIC Status\",\"向导\":\"Network Guide\",\"网络异常：\":\"Network abnormality:\",\"为拥有动态IP的主机配置一个固定的可访问域名\":\"Configure a fixed accessible domain name for hosts with dynamic IPs\",\"未安装\":\"Not Installed\",\"未安装或未配置\":\"Uninitialized\",\"未分区\":\"Unpartitioned\",\"未分区（%{total}）\":\"Unpartitioned (%{total})\",\"未格式化\":\"Not formatted\",\"未挂载磁盘\":\"Not Mounted\",\"未联网\":\"Internet Down\",\"未配置\":\"Not Configured\",\"未启动\":\"Not Started\",\"未启用\":\"Not enabled\",\"未知\":\"Unknown\",\"未知错误\":\"Unknown error\",\"温度\":\"Temp.\",\"温度监测（差异）\":\"Temperature monitoring (difference)\",\"温度监测（最大）\":\"Temperature monitoring (max)\",\"温馨提示\":\"Kind reminder\",\"文件管理\":\"File Manager\",\"文件系统：\":\"File System: \",\"我知道了\":\"Got it\",\"无法识别路径\":\"Unrecognized path\",\"无法识别数据\":\"Unrecognized data\",\"系统根目录\":\"Rootfs\",\"系统监控\":\"System Monitor\",\"系统时间\":\"System Time\",\"系统信息\":\"System Info\",\"下一步\":\"Next\",\"下载\":\"Download\",\"下载:\":\"Download:\",\"下载服务\":\"Download Services\",\"下载服务：\":\"Download Services: \",\"下载服务配置向导\":\"Download Services Guide\",\"下载目录\":\"Download Directory\",\"下载目录:\":\"Download Directory:\",\"下载目录：\":\"Download Directory:\",\"下载易有云客户端，随时随地相册备份、远程访问\":\"Download Linkease client for anytime, anywhere photo backup, remote access\",\"闲置\":\"Idle\",\"闲置-处于待机、睡眠、闲置模式下不检查设备，在闲置状态下，大多数磁盘还在转动，所以这可能不适合你。\":\"Idle - Does not check devices in standby, sleep, or idle modes. Most disks are still spinning in idle mode, so this may not be suitable for you.\",\"现在，将本路由WAN口断开，将其中一个LAN口与主路由连接，并将当前浏览器设备连接到主路由。点击“进入控制台”浏览器将跳转到新的路由IP\":\"Now, disconnect the WAN port of this router, connect one of the LAN ports to the main router, and connect the current browser device to the main router. Click 'Enter Console' and the browser will redirect to the new router IP\",\"现在，请你配置旁路由信息\":\"Now, please configure bypass routing information\",\"详情\":\"Details\",\"想要更精确的配置？请前往\":\"Want more precise configuration? Please go to \",\"小时\":\"Hour\",\"协议（网络获取方式）\":\"Protocol (Network Acquisition Method)\",\"新建\":\"Create new\",\"型号\":\"Model\",\"修改\":\"Modify\",\"修改DHCP服务\":\"Modify DHCP Service\",\"需要安装DDNSTO插件，点击“确定”开始安装\":\"DDNSTO plugin needs to be installed, click 'OK' to start installation\",\"序号\":\"Serial Number\",\"选择磁盘\":\"Choose disk\",\"选择将要用于创建 RAID 的硬盘，通过 USB 接入的设备不会在列表中显示（USB接入不稳定）。\":\"Select the hard disk that will be used to create the RAID. Devices connected via USB will not be displayed in the list (USB connection is unstable).\",\"选择一种连接方式以开始\":\"Choose a connection method to start\",\"选择硬盘（选择被添加到RAID的硬盘）：\":\"Choose a hard drive (select the hard drive to be added to RAID):\",\"选择硬盘（选择空闲的硬盘恢复RAID设备）：\":\"Choose a hard drive (select idle hard drive to restore RAID device):\",\"选择硬盘（选择要从RAID阵列中删除的硬盘）：\":\"Choose a hard drive (select the hard drive to be removed from RAID array):\",\"一个简易沙箱，方便用来实验系统配置和程序，方便开发未完成的软件，但不保护 Docker 和硬盘的数据\":\"A simple sandbox, convenient for experimenting with system configuration and programs, and for developing unfinished software, but does not protect Docker and hard disk data\",\"移除\":\"Remove\",\"已成功将分区 %{dev} 挂载到 <a>%{mount}</a>\":\"Successfully Mounted Partition %{dev} to <a>%{mount}</a>\",\"已断开\":\"Disconnected\",\"已挂载磁盘\":\"Mounted Disks\",\"已挂载为交换区\":\"Mounted as Swap Area\",\"已经成功初始化分区\":\"Partition Initialized Successfully\",\"已经成功格式化磁盘\":\"Disk Formatted Successfully\",\"已连接设备\":\"Connected Devices\",\"已联网\":\"Internet Connected\",\"已配置\":\"Configured\",\"已启动\":\"Started\",\"已启用\":\"Started\",\"以上操作都将重启设备，设备重启完成后会自动刷新页面。如果 IP 变化可能需要\":\"The above operations will restart the device, and the page will automatically refresh after the device restarts. If the IP changes, you may need to \",\"易有云\":\"LinkEase\",\"硬盘配置\":\"Hard disk configuration\",\"用户名\":\"Username\",\"用户名：\":\"Username:\",\"用户名不能为空\":\"Username cannot be empty\",\"用户名不能以_开头\":\"Username cannot start with _\",\"用户名不能以数字开头\":\"Username cannot start with a number\",\"用户名太短\":\"Username is too short\",\"用户名只能为小写\":\"Username must be lowercase\",\"用于放置配置文件的目录。例如：/mnt/sda1/Configs/aria2；请勿使用 /tmp 或 /var ，以免重启以后任务丢失\":\"The directory for storing configuration files. For example: /mnt/sda1/Configs/aria2; do not use /tmp or /var to avoid losing tasks after reboot.\",\"用于放置配置文件的目录。例如：/mnt/sda1/Configs/qb；请勿使用 /tmp 或 /var ，以免重启以后任务丢失\":\"The directory for storing configuration files. For example: /mnt/sda1/Configs/qb; do not use /tmp or /var to avoid losing tasks after reboot.\",\"用于放置配置文件的目录。例如：/mnt/sda1/Configs/tr；请勿使用 /tmp 或 /var ，以免重启以后任务丢失\":\"The directory for storing configuration files. For example: /mnt/sda1/Configs/tr; do not use /tmp or /var to avoid losing tasks after reboot.\",\"用于放置下载文件的目录。例如：/mnt/sda1/download\":\"Directory for placing download files. For example: /mnt/sda1/download\",\"用于远程访问的令牌。\":\"Token for remote access.\",\"由于您的设备<span>没有 WAN 口</span>，无法使用本设置向导，具体请看%{link}\":\"Since your device <span>does not have a WAN port</span>, you cannot use this setup wizard. For details, please see %{link}\",\"预览\":\"Preview\",\"域名：\":\"Domain Name:\",\"域名配置\":\"DDNS\",\"域名配置向导\":\"DDNS Guide\",\"远程域名\":\"DDNS\",\"月\":\"Month\",\"允许旧协议与身份验证(不安全)\":\"Allow Old Protocols and Authentication (Not Secure)\",\"运行\":\"Run\",\"运行调试\":\"Run debugging\",\"长时自检\":\"Long self-test\",\"账号:\":\"Account:\",\"账号不能为空\":\"Account cannot be empty\",\"账号用户名\":\"Account username\",\"正在安装中...\":\"Installing...\",\"正在创建中...\":\"Creating...\",\"正在获取磁盘信息...\":\"Fetching Disk List...\",\"正在加载中...\":\"Loading...\",\"正在检测插件是否已启动...\":\"Checking if plugin has started...\",\"正在检测中...\":\"Detecting ...\",\"正在配置…请稍等\":\"Configuring...please wait\",\"正在迁移中...\":\"Migrating...\",\"正在切换中...\":\"Switching ...\",\"执行中...\":\"Executing...\",\"只读\":\"Read-Only\",\"至少需要2块硬盘，“区块延展”功能是将数据分成多个块，并将数据块分散到组成的多个硬盘上以提高性能的过程。不提供数据冗余。\":\"At least 2 hard disks are required. The 'Block Stretch' function is the process of dividing data into multiple blocks and spreading the data blocks across multiple hard disks to improve performance. No data redundancy is provided.\",\"至少需要2块硬盘，将多个硬盘合并为单个存储空间，其容量等于所有硬盘容量的总和。不提供数据冗余。\":\"At least 2 hard disks are required to combine multiple hard disks into a single storage space with a capacity equal to the sum of all hard disk capacities. No data redundancy is provided.\",\"至少需要2块硬盘，同时向所有硬盘写入相同的数据。提供数据冗余。\":\"At least 2 hard drives are required, write the same data to all drives. Provides data redundancy.\",\"至少需要3块硬盘，执行段落分块延展，并对分布到所有组成硬盘上的数据执行奇偶校验，从而提供比 RAID 1 更有效的数据冗余。\":\"Requires at least 3 hard disks, performs block stretching, and performs parity checking on data distributed across all component hard disks, providing more effective data redundancy than RAID 1.\",\"至少需要4块硬盘，提供 RAID 0 的性能和 RAID 1 的数据保护级别，将硬盘组合进镜像数据的由两个硬盘组成的组。\":\"Requires at least 4 hard drives, provides the performance of RAID 0 and the data protection level of RAID 1, combining the hard drives into groups of two hard drives that mirror data.\",\"至少需要4块硬盘，执行两个层级的数据奇偶校验以存储等于 2 个硬盘容量的冗余数据，提供比 RAID 5 更大程度的数据冗余。\":\"Requires at least 4 hard drives, performs two levels of data parity to store redundant data equal to the capacity of 2 hard drives, and provides a greater degree of data redundancy than RAID 5.\",\"至少需要填写一个DNS\":\"At least one DNS must be filled in\",\"终端\":\"Terminal\",\"重新创建\":\"Recreate\",\"重置\":\"Reset\",\"重置中...\":\"Reseting…\",\"状态\":\"Status\",\"自定义DNS\":\"Custom DNS\",\"自动获取\":\"Auto\",\"自动获取 IPV6（即开启 DHCPv6 客户端）\":\"Automatically obtain IPv6 (i.e. enable DHCPv6 client)\",\"自动获取（DHCP）\":\"DHCP\",\"自动获取DNS\":\"Auto\",\"自动获取IP地址（DHCP）\":\"Automatically obtain IP address (DHCP)\",\"自动检查更新\":\"Auto check update\",\"自动配置...\":\"Auto...\",\"自动填写...\":\"Auto-fill...\",\"自己添加\":\"Custom\",\"自检日志\":\"Self-test log\",\"自上次报告以来温度变化至少 N 度，则需报告.\":\"Report if temperature changes by at least N degrees since the last report.\",\"子网掩码\":\"Subnet Mask\",\"子网掩码: \":\"Subnet Mask: \",\"总是\":\"Always\",\"总是-无论是什么功耗模式下都测试(检查)磁盘，当检查时，这可能会使停转的磁盘开始转动。\":\"Always - Tests (checks) the disk regardless of power mode. When checking, this may spin up a stalled disk.\",\"Aria2高级配置\":\"Aria2 Adv.\",\"CPU使用率\":\"CPU Usage\",\"CPU温度\":\"CPU Temp.\",\"DDNSTO\":\"DDNSTO\",\"DDNSTO 是一个不需要公网IP也可以在外网访问的穿透域名服务，一个浏览器搞定内网穿透，远程访问Openwrt、远程终端、远程桌面...\":\"DDNSTO is a domain name penetration service that can be accessed from the Internet without a public IP. A browser can handle intranet penetration and remote access to Openwrt, remote terminal, remote desktop...\",\"DDNSTO控制台\":\"DDNSTO Console\",\"DHCP的IP池格式错误或超出子网范围\":\"DHCP IP pool format error or out of subnet range\",\"DHCP客户端\":\"DHCP Client\",\"DNS 配置方式\":\"DNS Configuration Method\",\"DNS错误\":\"DNS Error\",\"DNS服务器\":\"DNS Server\",\"DNS服务器: \":\"DNS Server: \",\"DNS服务器地址\":\"DNS Server Address\",\"DNS配置\":\"DNS Settings\",\"DNS配置已保存\":\"DNS Saved\",\"DNS选项\":\"DNS Options\",\"dnspod\":\"dnspod\",\"Dnspod\":\"Dnspod\",\"Docker高级配置\":\"Docker Adv.\",\"Docker根目录：\":\"Docker Root Directory: \",\"Docker管理\":\"Docker Actions\",\"Docker迁移向导\":\"Docker Migration Wizard\",\"IP 地址\":\"IP Address\",\"IP 地址: \":\"IP Address: \",\"IP池结束地址\":\"IP Pool End Address\",\"IP池起始地址\":\"IP Pool Start Address\",\"IP地址\":\"IP Address\",\"IP地址版本：\":\"IP Version: \",\"IPv4地址\":\"IPv4 Address\",\"IPv4地址格式错误\":\"IPv4 Address Format Error\",\"IPv4子网掩码\":\"IPv4 Subnet Mask\",\"IPv4子网掩码格式错误\":\"IPv4 Subnet Mask Format Error\",\"IPv6地址\":\"IPv6 Address\",\"iStoreOS官网\":\"iStoreOS\",\"JBOD (线性)\":\"JBOD (Linear)\",\"LAN 接口配置方式\":\"LAN Interface Configuration Method\",\"LAN口未关联任何物理网口，可能导致路由器失联，是否继续操作？\":\"LAN port not associated with any physical network port, may cause router disconnection, continue?\",\"MAC：\":\"MAC:\",\"qBittorrent高级配置\":\"qBittorrent Adv.\",\"RAID （ Redundant Array of Independent Disks ）即独立磁盘冗余阵列，简称为「磁盘阵列」，就是用多个独立的磁盘组成在一起形成一个大的磁盘系统，从而实现比单块磁盘更好的存储性能和更高的可靠性。\":\"RAID (Redundant Array of Independent Disks) is a redundant array of independent disks, which uses multiple independent disks to form a large disk system, thereby achieving better storage performance and higher reliability than a single disk.\",\"RAID 0 (条带)\":\"RAID 0 (Striping)\",\"RAID 1 (镜像)\":\"RAID 1 (Mirroring)\",\"RAID创建向导\":\"RAID Creation Wizard\",\"RAID磁盘阵列是用多个独立的磁盘组成在一起形成一个大的磁盘系统，从而实现比单块磁盘更好的存储性能和更高的可靠性。\":\"RAID disk array uses multiple independent disks together to form a large disk system, thereby achieving better storage performance and higher reliability than a single disk.\",\"RAID功能正在公测中，使用过程中如造成数据丢失等问题，概不负责，请谨慎使用。\":\"The RAID function is currently in public beta testing. We are not responsible for any data loss or other issues caused during use. Please use it with caution.\",\"RAID管理\":\"RAID Mananger\",\"RAID级别：\":\"RAID Level:\",\"RAID设备\":\"RAID\",\"RPC 令牌：\":\"RPC Token:\",\"S.M.A.R.T.，全称为“Self-Monitoring Analysis and Reporting Technology”，即“自我监测、分析及报告技术”，\":\"S.M.A.R.T., the full name of which is 'Self-Monitoring Analysis and Reporting Technology', is an automatic hard disk status detection and early warning system and specification. \",\"S.M.A.R.T异常\":\"S.M.A.R.T Exception\",\"SAMBA\":\"SAMBA\",\"SAMBA高级配置\":\"SAMBA Adv.\",\"Samba共享配置\":\"Samba Share Configuration\",\"Transmission高级配置\":\"Transmission Adv.\",\"WAN 接口配置方式\":\"WAN Interface Configuration Method\",\"WEBDAV\":\"WEBDAV\",\"WebDAV高级配置\":\"WebDAV Adv.\",\"Webdav共享配置\":\"Webdav Share Configuration\",\"限速配置\":\"Speed limit configuration\",\"静态分配\":\"Static allocation\",\"请输入\": \"Please enter\",\"设备列表\": \"Equipment List\",\"静态分配列表\": \"Statically allocated lists\",\"限速设备列表\": \"List of speed limiting devices\",\"全局设置\": \"Global Settings\",\"对设备开启限速\": \"Enable speed limit for the device\",\"点我跳转全局配置\": \"Click me to jump to global configuration\",\"禁止该设备访问网络\": \"Block this device from accessing the network\",\"下载速度\": \"Download speed\",\"总带宽\": \"Total bandwidth\",\"上传速度\": \"Upload speed\",\"注解\": \"Comment\",\"请选择\": \"Please select\",\"MAC地址与IP绑定\": \"MAC address and IP binding\",\"网关\": \"Gateway\",\"接口\": \"Interface\",\"标签\": \"Label\",\"设备图片\": \"Equipment Pictures\",\"主机名称\": \"Host Name\",\"MAC地址\": \"MAC Address\",\"默认网关\": \"default\",\"上级路由\": \"parent\",\"本设备\": \"myself\",\"旁路由\": \"bypass\",\"浮动网关\": \"floatip\",\"请前往全局配置开启限速\": \"Please go to global configuration to enable speed limit\",\"请输入正确的MAC地址\": \"Please enter a valid MAC address\",\"请输入正确的IP地址\": \"Please enter a valid IP address\",\"请输入正确的下载速度\": \"Please enter the correct download speed\",\"请输入正确的上传速度\": \"Please enter the correct upload speed\",\"请勾选要删除的数据\": \"Please check the data you want to delete\",\"设备管理\":\"Device Management\",\"首页\":\"Front Page\",\"批量删除\":\"Batch Deletion\",\"请输入搜索词\":\"Please enter a search term\",\"请输入名称/IP/MAC…\":\"Please enter name/IP/MAC...\",  \"显示\": \"Show\",\"到\": \"To\",\"条\": \"Strip\",\"共\": \"Total\",\"上一页\": \"Previous page\",\"下一页\": \"Next Page\",\"暂无数据\": \"No Data\",\"IP限速\": \"IP speed limit\",\"正在安装\": \"Installing\",\"结果\": \"Result\",\"安装成功\": \"Installation Successful\",\"添加标签\": \"Add tags\",\"注意：添加ID时，请勿将“odhcpd”或网络接口（例如“lan”,“wan”,“wan6”等）作为ID，此举将产生冲突。建议在ID前面加上前缀“t_”以杜绝此类冲突。\": \"Note: When adding an ID, do not use odhcpd or a network interface (such as lan, wan, wan6, etc.) as the ID, as this will cause a conflict. It is recommended to prefix the ID with 't_' to prevent such conflicts.\",\"标签名称\": \"Tag Name\",\"软件暂未安装\": \"The software is not installed yet\",\"立即安装\": \"Install Now\",\"节点角色\": \"Node Role\",\"浮动网格IP\": \"Floating Grid IP\",\"旁路由IP\": \"Bypass IP\",\"添加\": \"Add to\",\"局域网DHCP\": \"LAN DHCP\",  \"是\": \"Yes\",\"否\": \"No\",\"禁止网络访问\": \"Disable network access\",\"上传限速\": \"Upload speed limit\",\"下载限速\": \"Download speed limit\",\"静态IP绑定\": \"Static IP Binding\",\"请选择节点角色\":\"Please select a node role\",\"请输入正确的浮动网关IP地址\":\"Please enter the correct floating gateway IP address\",\"请输入正确的旁路由IP地址\":\"Please enter the correct bypass router IP address\",\"系统创建\":\"System Creation\",\"删除失败！\":\"Deletion failed!\",\"主路由\":\"Main Router\",\"所有删除操作已完成\":\"All deletions completed\",\"保存失败！\":\"Save failed!\",\"编辑标签\":\"Edit Tags\",\"温馨提示：删除设备的限速配置可能影响此设备的带宽，请谨慎操作！\":\"Warm reminder: Deleting the speed limit configuration of a device may affect the bandwidth of this device, please proceed with caution!\",\"温馨提示：删除设备的静态分配可能影响此设备的联网，请谨慎操作！\":\"Tips: Deleting a device's static allocation may affect the device's networking, so proceed with caution!\",\"温馨提示：删除网关标签可能影响正在使用此标签的设备，请谨慎操作！\":\"Warm reminder: Deleting the gateway tag may affect devices that are using this tag, please proceed with caution!\",\"温馨提示：关闭浮动网关可能影响正在使用浮动网关的设备，请谨慎操作！\":\"Warm reminder: Disabling the floating gateway may affect devices that are using the floating gateway, please operate with caution!\",\"温馨提示：关闭限速会让已配置限速的设备的带宽限制全部失效，请谨慎操作！\":\"Warm reminder: Turning off speed limit will invalidate all bandwidth restrictions of devices that have configured speed limit. Please operate with caution!\",\"温馨提示：关闭DHCP可能影响局域网内设备的IP分配和联网，请谨慎操作！\":\"Tips: Turning off DHCP may affect the IP allocation and networking of devices in the LAN, so please operate with caution!\",\"标题\":\"Title\",\"上传限速（Mbit/s）\":\"Upload speed limit (Mbit/s)\",\"下载限速（Mbit/s）\":\"Download speed limit (Mbit/s)\",\"网络连接正常\":\"The network connection is normal\",\"连接设备数量\":\"Number of connected devices\",\"台设备\":\"Device\",\"已连接\":\"Connected\",\"未连接\":\"Not connected\",\"配置网络接口\":\"NIC Assignment\",\"使用率\":\"Utilization rate\",\"可用\":\"Available\",\"系统更新可用\":\"System update available\",\"检测到新版本\":\"New version detected\",\"包含安全修复和性能改进\":\"Includes security fixes and performance improvements\",\"立即更新\":\"Update Now\",\"稍后提醒\":\"Remind me later\",\"网络配置引导\":\"Network configuration guide\",\"智能配置\":\"Intelligent configuration\",\"局域网设备管理\":\"LAN device management\",\"管理网络中的所有设备\":\"Manage all devices on the network\",\"推荐\":\"Recommend\",\"无线网络\":\"Wireless network\",\"WiFi设置与管理\":\"WiFi settings and management\",\"2.4G/5G双频\":\"2.4G/5G dual-band\",\"家长控制\":\"Parental Controls\",\"儿童上网保护\":\"Child Online Protection\",\"保护\":\"Protect\",\"网络测速\":\"Network speed test\",\"检测网络速度\":\"Detect network speed\",\"点击测试\":\"Click Test\",\"网络流量\":\"Network traffic\",\"今日下载\":\"Download today\",\"今日上传\":\"Uploaded today\",\"峰值下载\":\"Peak downloads\",\"峰值上传\":\"Peak upload\",\"网络连接和IP地址\":\"Network connections and IP addresses\",\"今日数据\":\"Today's data\",\"网络延迟\":\"Network latency\",\"信号强度\":\"Signal strength\",\"日志查看\":\"View log\",\"运行中\":\"Running\",\"Docker容器目录\":\"Docker container directory\",\"容器数量\":\"Number of containers\",\"镜像数量\":\"Number of images\",\"管理容器\":\"Managing Containers\",\"下载管理\":\"Download Management\",\"操作系统\":\"operating system\",\"正常\":\"Normal\",\"离线\":\"Offline\",\"动态域名解析\":\"Dynamic DNS\",\"智能内网穿透服务\":\"Intelligent intranet penetration service\",\"配置存储服务\":\"Configuring storage services\",\"内网访问地址\":\"Intranet access address\",\"检测本地网络环境，获取内网访问地址\":\"Detect the local network environment and obtain the intranet access address\",\"点击按钮获取内网测速地址，通过访问这些地址来测试内网连接速度\":\"Click the button to obtain the intranet speed test address and test the intranet connection speed by accessing these addresses\",\"选择测速节点，进行网络速度和连接质量测试\":\"Select a speed test node to test network speed and connection quality\",\"选择测速节点\":\"Select the speed test node\",\"请选择测速节点\":\"Please select a speed test node\",\"测速日志\":\"Speed ​​test log\",\"实时测速过程记录\":\"Real-time speed measurement process recording\",\"测速节点\":\"Speed ​​test node\",\"测速进度\":\"Speed ​​test progress\",\"至少保留一个网络接口！\":\"Keep at least one network interface!\",\"系统维护\":\"System Maintenance\",\"应用商店\":\"App Store\",\"百款应用，自由选择\":\"Hundreds of apps, free to choose\",\"内核\":\"Kernel Ver.\",\"台设备在线\":\"Devices online\",\"信息概览\":\"Information Overview\",\"模块设置\":\"Module settings\",\"快捷入口\":\"Quick Access\",\"顶部快捷捷径按钮组\":\"Top shortcut button group\",\"实时流量统计图表\":\"Real-time traffic statistics charts\",\"联网时间和设备信息\":\"Network time and device information\",\"网络接口详细信息\":\"Network interface details\",\"配置模块\":\"Configuration module\",\"内网配置、DNS配置等工具\":\"Tools for intranet configuration, DNS configuration, etc.\",\"磁盘使用情况与容量概览\":\"Disk usage and capacity overview\",\"共享与存储服务概览\":\"Overview of Shared and Storage Services\",\"下载任务与服务状态\":\"Download Task and Service Status\",\"远程访问域名管理\":\"Remote access domain management\",\"设备系统信息概览\":\"Equipment System Information Overview\",\"Docker模块\":\"Docker module\",\"容器运行状态与管理\":\"Container runtime status and management\",\"模块显示设置\":\"Module display settings\",\"选择要在首页显示的功能模块，隐藏不常用的模块可以让界面更简洁\":\"Select the functional modules to display on the homepage; hiding less frequently used modules will make the interface cleaner.\",\"已显示模块\":\"Modules already displayed\",\"全部显示\":\"Show all\",\"保存设置\":\"Save settings\",\"个模块\":\"module\",\"已使用\":\"Used\",\"Docker迁移\":\"Docker migration\",\"请至少保留一项！\":\"Please keep at least one item!\"}}"
  },
  {
    "path": "luci-app-quickstart/htdocs/luci-static/quickstart/i18n/zh_Hans.json",
    "content": "{\"zh-cn\":{}}"
  },
  {
    "path": "luci-app-quickstart/htdocs/luci-static/quickstart/index.js",
    "content": "var go=Object.defineProperty,vo=Object.defineProperties;var bo=Object.getOwnPropertyDescriptors;var xa=Object.getOwnPropertySymbols;var ho=Object.prototype.hasOwnProperty,_o=Object.prototype.propertyIsEnumerable;var We=(o,n,a)=>n in o?go(o,n,{enumerable:!0,configurable:!0,writable:!0,value:a}):o[n]=a,st=(o,n)=>{for(var a in n||(n={}))ho.call(n,a)&&We(o,a,n[a]);if(xa)for(var a of xa(n))_o.call(n,a)&&We(o,a,n[a]);return o},vt=(o,n)=>vo(o,bo(n));var xo=(o,n)=>()=>(n||o((n={exports:{}}).exports,n),n.exports);var ve=(o,n,a)=>(We(o,typeof n!=\"symbol\"?n+\"\":n,a),a);var L=(o,n,a)=>new Promise((l,u)=>{var d=g=>{try{k(a.next(g))}catch(p){u(p)}},c=g=>{try{k(a.throw(g))}catch(p){u(p)}},k=g=>g.done?l(g.value):Promise.resolve(g.value).then(d,c);k((a=a.apply(o,n)).next())});import{a as wo,c as ko,d as we,b as I,e as Q,u as e,o as r,f as s,g as t,t as i,n as ht,h as D,i as Y,r as _t,j as lt,k as Yt,w as O,v as Rt,l as Ia,m as Z,p as V,q as E,s as $t,x as Pt,y as pt,F as U,z as tt,A as at,B as jt,C as ut,D as ct,E as ke,G as ee,T as St,H as Nt,I as ft,J as xt,K as dt,L as gt,M as Bt,N as Xe,O as Ma,P as La,Q as Oa,R as ta,S as ea,U as Na,V as aa,W as Pe,X as yo,Y as oa,Z as ye,_ as Fo,$ as Eo,a0 as na,a1 as $o,a2 as Te,a3 as Co,a4 as Ie,a5 as Do,a6 as Bo,a7 as Yo,a8 as Ao,a9 as So,aa as zo,ab as Po,ac as To}from\"./vendor.js?v=4c8355cf\";var sT=xo(ae=>{const Io=function(){const n=document.createElement(\"link\").relList;if(n&&n.supports&&n.supports(\"modulepreload\"))return;for(const u of document.querySelectorAll('link[rel=\"modulepreload\"]'))l(u);new MutationObserver(u=>{for(const d of u)if(d.type===\"childList\")for(const c of d.addedNodes)c.tagName===\"LINK\"&&c.rel===\"modulepreload\"&&l(c)}).observe(document,{childList:!0,subtree:!0});function a(u){const d={};return u.integrity&&(d.integrity=u.integrity),u.referrerpolicy&&(d.referrerPolicy=u.referrerpolicy),u.crossorigin===\"use-credentials\"?d.credentials=\"include\":u.crossorigin===\"anonymous\"?d.credentials=\"omit\":d.credentials=\"same-origin\",d}function l(u){if(u.ep)return;u.ep=!0;const d=a(u);fetch(u.href,d)}};Io();const Gt={language:void 0,numberFormat:new Intl.NumberFormat(\"en\",{notation:\"compact\"})},Mo=o=>L(ae,null,function*(){const n=window.vue_lang;new Date().getTime();let a={};try{const d=yield wo({url:window.vue_lang_data,method:\"GET\"});d.data&&(a=d.data)}catch(d){console.log(d)}const l=ko({defaultLanguage:n,mutedLanguages:[\"zh-cn\"],translations:a,setGlobalProperties:!1,provideDirective:!1,provideComponent:!1});o.use(l),Gt.language=l;const{$gettext:u}=l;window.$i18n=u;try{Gt.numberFormat=new Intl.NumberFormat(n,{notation:\"compact\"})}catch(d){console.error(\"Intl.NumberFormat unsupported lang\",n,d)}}),J=()=>{if(Gt.language)return Gt.language;throw new Error(\"I18N Uninitialized!\")},Me=()=>({$gettext:(o,n,a)=>{if(Gt.language)return Gt.language.$gettext(o,n,a);throw new Error(\"I18N Uninitialized!\")},$ngettext:(o,n,a,l,u)=>{if(Gt.language)return Gt.language.$ngettext(o,n,a,l,u);throw new Error(\"I18N Uninitialized!\")}}),De=o=>typeof o==\"number\"?Gt.numberFormat.format(o):\"?\",{$gettext:Lo,$ngettext:uT}=Me(),Va=(o,n)=>L(ae,null,function*(){return new Promise((a,l)=>L(ae,null,function*(){try{const u=yield fetch(o,n);if(Math.floor(u.status/100)!=2)throw u.status+\" \"+u.statusText;const d=st({},u);d.data=yield u.json(),a(d)}catch(u){const d=u;l(Lo(\"\\u7F51\\u7EDC\\u5F02\\u5E38\\uFF1A\")+((d==null?void 0:d.message)||u))}}))});class ia{constructor(n){ve(this,\"config\",{baseURL:\"\",headers:{}});ve(this,\"useRequest\",n=>n);ve(this,\"useResponse\",n=>n);ve(this,\"useError\",n=>n);n.baseURL&&(this.config.baseURL=n.baseURL),n.headers&&(this.config.headers=n.headers)}static create(n){return new ia(n)}Do(n,a){return L(this,null,function*(){return new Promise((l,u)=>L(this,null,function*(){try{const d=this.useRequest({baseURL:this.config.baseURL,headers:this.config.headers});n=`${d.baseURL||\"\"}${n}`,a.headers==null&&(a.headers={}),d.headers&&(a.headers=st({},d.headers));const k=yield fetch(n,a),g=st({},k);g.data=yield k.json(),l(this.useResponse(g))}catch(d){this.useError(d),u(d)}}))})}TEXT(n,a){return L(this,null,function*(){return new Promise((l,u)=>L(this,null,function*(){try{const d=this.useRequest({baseURL:this.config.baseURL,headers:this.config.headers});n=`${d.baseURL||\"\"}${n}`,a.headers==null&&(a.headers={}),d.headers&&(a.headers=st({},d.headers));const k=yield fetch(n,a),g=st({},k);g.data=yield k.text(),l(g)}catch(d){this.useError(d),u(d)}}))})}interceptors(){const n=this;return{requset:{use(a){n.useRequest=a}},response:{use(a,l){n.useResponse=a,l&&(n.useError=l)}}}}}const Ga=ia.create({});Ga.interceptors().requset.use(o=>o);Ga.interceptors().response.use(o=>(o.data&&o.data.success==null&&o.data.success==0,o));const{$gettext:ja,$ngettext:cT}=Me(),Oo=\"/cgi-bin/luci/istore\",No=\"/cgi-bin/luci/admin\";let Ae=!1;const W=(o,n)=>(o.indexOf(\"//\")==-1&&(o=`${Oo}${o}`),Va(o,n).then(a=>(a!=null&&a.data&&a.data.success==-1001&&a.data.error==\"Forbidden\"&&(Ae||(Ae=!0,alert(ja(\"\\u767B\\u5F55\\u8FC7\\u671F\\uFF0C\\u8BF7\\u91CD\\u65B0\\u767B\\u5F55\")),location.reload())),a))),Vo=(o,n)=>(o.indexOf(\"//\")==-1&&(o=`${No}${o}`),Va(o,n).then(a=>(a!=null&&a.data&&a.data.success==-1001&&a.data.error==\"Forbidden\"&&(Ae||(Ae=!0,alert(ja(\"\\u767B\\u5F55\\u8FC7\\u671F\\uFF0C\\u8BF7\\u91CD\\u65B0\\u767B\\u5F55\")),location.reload())),a))),Go={Statistics:{GET(){return W(\"/u/network/statistics/\",{method:\"GET\"})}},Status:{GET(){return W(\"/u/network/status/\",{method:\"GET\"})}},Device:{List:{GET(){return W(\"/network/device/list/\",{method:\"GET\"})}}},Homebox:{Enable:{POST(){return W(\"/network/homebox/enable/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"}})}}},CheckPublickNet:{POST(o){return W(\"/network/checkPublicNet/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},GetInterfaceConfig:{GET(){return W(\"/network/interface/config/\",{method:\"GET\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"}})}},POSTInterfaceConfig:{POST(o){return W(\"/network/interface/config/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},PortList:{GET(){return W(\"/network/port/list/\",{method:\"GET\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"}})}}},jo={Version:{GET(){return W(\"/u/system/version/\",{method:\"GET\"})}},CheckUpdate:{GET(){return W(\"/system/check-update/\",{method:\"GET\"})}},AutoCheckUpdate:{POST(o){return W(\"/system/auto-check-update/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},Reboot:{POST(){return W(\"/system/reboot/\",{method:\"POST\"})}},Status:{GET(){return W(\"/system/status/\",{method:\"GET\"})}}},Uo={Disk:{Status:{GET(){return W(\"/nas/disk/status/\",{method:\"GET\"})}},Erase:{POST(o){return W(\"/nas/disk/erase\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},Init:{POST:o=>W(\"/nas/disk/init/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})},InitRest:{POST:o=>W(\"/nas/disk/initrest/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})},Partition:{Format:{POST:o=>W(\"/nas/disk/partition/format\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})},Mount:{POST:o=>W(\"/nas/disk/partition/mount\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}}},Service:{Status:{GET(){return W(\"/u/nas/service/status/\",{method:\"GET\"})}}},Samba:{Create:{POST(o){return W(\"/nas/samba/create\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}}},Webdav:{Create:{POST(o){return W(\"/nas/webdav/create\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},Status:{GET(){return W(\"/nas/webdav/status/\",{method:\"GET\"})}}},Linkease:{Enable:{POST(){return W(\"/u/nas/linkease/enable\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"}})}}},Sandbox:{POST(o){return W(\"/nas/sandbox/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},GetSandbox:{GET(){return W(\"/nas/sandbox/\",{method:\"GET\"})}},SandboxDisks:{GET(){return W(\"/nas/sandbox/disks/\",{method:\"GET\"})}},SandboxCommit:{POST(){return W(\"/u/nas/sandbox/commit/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify({})})}},SandboxReset:{POST(){return W(\"/nas/sandbox/reset/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"}})}},SandboxExit:{POST(){return W(\"/nas/sandbox/exit/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"}})}}},qo={Check:{POST(o){return W(\"/app/check/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},Install:{POST(o){return W(\"/app/install/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}}},Ro={Pppoe:{GET(){return W(\"/guide/pppoe/\",{method:\"GET\"})},POST(o){return W(\"/guide/pppoe/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},DnsConfig:{GET(){return W(\"/guide/dns-config/\",{method:\"GET\"})},POST(o){return W(\"/guide/dns-config/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},DhcpClient:{POST(o){return W(\"/guide/dhcp-client/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},ClientModel:{GET(){return W(\"/guide/client-mode/\",{method:\"GET\"})},POST(o){return W(\"/guide/client-mode/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},GatewayRouter:{POST(o){return W(\"/guide/gateway-router/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},DockerStatus:{GET(){return W(\"/guide/docker/status/\",{method:\"GET\"})}},DockerPartitionList:{GET(){return W(\"/guide/docker/partition/list/\",{method:\"GET\"})}},DockerTransfer:{POST(o){return W(\"/guide/docker/transfer/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},DockerSwitch:{POST(o){return W(\"/guide/docker/switch/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},DownloadService:{Status:{GET(){return W(\"/guide/download-service/status/\",{method:\"GET\"})}}},DownloadPartition:{List:{GET(){return W(\"/guide/download/partition/list/\",{method:\"GET\"})}}},Aria2Init:{POST(o){return W(\"/guide/aria2/init/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},qbitorrentInit:{POST(o){return W(\"/guide/qbittorrent/init/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},transmissionInit:{POST(o){return W(\"/guide/transmission/init/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},GetLan:{GET(){return W(\"/guide/lan/\",{method:\"GET\"})}},LanIp:{POST(o){return W(\"/guide/lan/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},SoftSource:{POST(o){return W(\"/guide/soft-source/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},GetSoftSource:{GET(){return W(\"/guide/soft-source/\",{method:\"GET\"})}},SoftSourceList:{GET(){return W(\"/guide/soft-source/list/\",{method:\"GET\"})}},PostDdns:{POST(o){return W(\"/u/guide/ddns/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},GetDdns:{GET(){return W(\"/u/guide/ddns/\",{method:\"GET\"})}},Ddnsto:{POST(o){return W(\"/guide/ddnsto/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},DdntoConfig:{GET(){return W(\"/guide/ddnsto/config/\",{method:\"GET\"})}},DdnstoAddress:{POST(o){return W(\"/guide/ddnsto/address/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}}},Wo={Create:{POST(o){return W(\"/raid/create/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},Delete:{POST(o){return W(\"/raid/delete/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},Add:{POST(o){return W(\"/raid/add/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},Remove:{POST(o){return W(\"/raid/remove/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},Recover:{POST(o){return W(\"/raid/recover/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},Detail:{POST(o){return W(\"/raid/detail/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},List:{GET(){return W(\"/raid/list/\",{method:\"GET\"})}},CreateList:{GET(){return W(\"/raid/create/list/\",{method:\"GET\"})}},Autofix:{POST(){return W(\"/raid/autofix/\",{method:\"POST\"})}}},Ho={Log:{GET(){return W(\"/smart/log/\",{method:\"GET\"})}},List:{GET(){return W(\"/u/smart/list/\",{method:\"GET\"})}},Config:{GET(){return W(\"/smart/config/\",{method:\"GET\"})},POST(o){return W(\"/smart/config/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}},Test:{POST(o){return W(\"/u/smart/test/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})},Result:{POST(o){return W(\"/smart/test/result/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}}},Attribute:{Result:{POST(o){return W(\"/smart/attribute/result/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}}},Extend:{Result:{POST(o){return W(\"/smart/extend/result/\",{method:\"POST\",headers:{\"Content-Type\":\"application/json;charset=utf-8\"},body:JSON.stringify(o)})}}}},Jo={List:{GET(){return W(\"/wireless/list-iface/\",{method:\"GET\"})}},Switch:{POST(o){return W(\"/wireless/enable-iface/\",{body:JSON.stringify(o),method:\"POST\"})}},Power:{POST(o){return W(\"/wireless/set-device-power/\",{body:JSON.stringify(o),method:\"POST\"})}},Edit:{POST(o){return W(\"/wireless/edit-iface/\",{body:JSON.stringify(o),method:\"POST\"})}},Setup:{POST(o){return W(\"/wireless/setup/\",{body:JSON.stringify(o),method:\"POST\"})}}},Zo={getInstalled:{GET(){return Vo(\"/store/installed/\",{method:\"GET\"})}},needSetup:{GET(){return W(\"/guide/need/setup/\",{method:\"GET\"})}},setPassword:{POST(o){return W(\"/system/setPassword/\",{body:JSON.stringify(o),method:\"POST\"})}},completeGuide:{POST(){return W(\"/guide/finish/setup/\",{method:\"POST\"})}}},Ko={listDevices:{GET(){return W(\"/lanctrl/listDevices/\",{method:\"GET\"})}},staticDeviceConfig:{POST(o){return W(\"/lanctrl/staticDeviceConfig/\",{body:JSON.stringify(o),method:\"POST\"})}},globalConfigs:{GET(){return W(\"/lanctrl/globalConfigs/\",{method:\"GET\"})}},speedLimitConfig:{POST(o){return W(\"/lanctrl/speedLimitConfig/\",{body:JSON.stringify(o),method:\"POST\"})}},listStaticDevices:{GET(){return W(\"/lanctrl/listStaticDevices/\",{method:\"GET\"})}},listSpeedLimitedDevices:{GET(){return W(\"/lanctrl/listSpeedLimitedDevices/\",{method:\"GET\"})}},dhcpGatewayConfig:{POST(o){return W(\"/lanctrl/dhcpGatewayConfig/\",{body:JSON.stringify(o),method:\"POST\"})}},dhcpTagsConfig:{POST(o){return W(\"/lanctrl/dhcpTagsConfig/\",{body:JSON.stringify(o),method:\"POST\"})}},enableSpeedLimit:{POST(o){return W(\"/lanctrl/enableSpeedLimit/\",{body:JSON.stringify(o),method:\"POST\"})}},enableFloatGateway:{POST(o){return W(\"/lanctrl/enableFloatGateway/\",{body:JSON.stringify(o),method:\"POST\"})}},speedsForDevices:{GET(){return W(\"/lanctrl/speedsForDevices/\",{method:\"GET\"})}},speedsForOneDevice:{POST(o){return W(\"/lanctrl/speedsForOneDevice/\",{body:JSON.stringify(o),method:\"POST\"})}}},Qo={GET(){return W(\"/system/module-settings/\",{method:\"GET\"})},POST(o){return W(\"/system/module-settings/\",{body:JSON.stringify(o),method:\"POST\"})}};var Xo=Object.freeze(Object.defineProperty({__proto__:null,Network:Go,System:jo,Nas:Uo,App:qo,Guide:Ro,Raid:Wo,Smart:Ho,Quickwifi:Jo,GuidePage:Zo,DeviceMangement:Ko,ModuleSettings:Qo},Symbol.toStringTag,{value:\"Module\"})),G=st({},Xo);const ra=we(\"app\",{state:()=>({portitemStyle:{show:!1,left:0,top:0,portitem:{name:\"\",macAddress:\"\",linkSpeed:\"\",linkState:\"\",rx_packets:\"\",tx_packets:\"\",interfaceNames:[],master:\"\",duplex:\"\"}}})});we(\"guide\",{});const tn=we(\"nas\",{state:()=>({webdav:{}})}),Fe=we(\"network\",{state:()=>({status:{},deviceList:{}}),getters:{},actions:{updateNetworkStatus(o){this.status=o},requestDeviceList(){G.Network.Device.List.GET().then(o=>{if(o!=null&&o.data){const{result:n}=o==null?void 0:o.data;n&&(this.deviceList=n)}})},incrTime(){this.status.uptimeStamp&&this.status.uptimeStamp++}}}),Le=we(\"system\",{state:()=>({version:{},checkUpdate:null,updateChecked:!1,systemStatus:{}}),getters:{},actions:{incrTime(){var o;(o=this.systemStatus)!=null&&o.uptime&&this.systemStatus.uptime++},requestVersion(){G.System.Version.GET().then(o=>{var n;(n=o==null?void 0:o.data)!=null&&n.result&&(this.version=o.data.result)})},requestCheckUpdate(){this.updateChecked||(this.updateChecked=!0,G.System.CheckUpdate.GET().then(o=>{var n;(n=o==null?void 0:o.data)!=null&&n.result&&(this.checkUpdate=o.data.result)}).finally(()=>{this.checkUpdate==null&&(this.checkUpdate={needUpdate:!1,msg:\"skip\"})}))},updateSystemStatus(o){this.systemStatus=o}}});let wa=!1;const en=()=>{if(wa)return;wa=!0;let o=!0,n=!0;const a=Fe(),l=Le(),u=function(){return(!o&&document.hidden?Promise.resolve():G.System.Status.GET().then(c=>{c!=null&&c.data.result&&l.updateSystemStatus(c.data.result)})).finally(()=>{setTimeout(u,5e3),o&&(setInterval(()=>{l.incrTime()},1e3),o=!1)})},d=function(){return(!n&&document.hidden?Promise.resolve():G.Network.Status.GET().then(c=>{if(c!=null&&c.data){const{result:k}=c==null?void 0:c.data;k&&a.updateNetworkStatus(k)}})).finally(()=>{setTimeout(d,5e3),n&&(setInterval(()=>{a.incrTime()},1e3),n=!1)})};d(),a.requestDeviceList(),setTimeout(()=>{l.requestVersion(),u()},1100)};var N=(o,n)=>{const a=o.__vccOpts||o;for(const[l,u]of n)a[l]=u;return a};const an=I({setup(o){const{$gettext:n,$ngettext:a}=J(),l=ra(),u=Q(()=>l.portitemStyle.portitem),d=Q(()=>l.portitemStyle.show),c=Q(()=>({bottom:`calc(100% - ${l.portitemStyle.top}px)`,left:`${l.portitemStyle.left}px`})),k=m=>{switch(m){case\"full\":return n(\"\\u5168\\u53CC\\u5DE5\");case\"half\":return n(\"\\u534A\\u53CC\\u5DE5\")}},g=m=>{l.portitemStyle.show=!0},p=m=>{l.portitemStyle.show=!1};return(m,v)=>e(d)?(r(),s(\"div\",{key:0,class:\"disk-item-tooltip\",style:ht(e(c)),onMouseenter:g,onMouseleave:p},[t(\"div\",null,i(k(e(u).duplex)),1),t(\"div\",null,i(e(n)(\"\\u540D\\u79F0\\uFF1A\"))+i(e(u).name||\"--\"),1),t(\"div\",null,i(e(n)(\"MAC\\uFF1A\"))+i(e(u).macAddress||\"--\"),1),t(\"div\",null,i(e(n)(\"\\u63A5\\u6536\\uFF1A\"))+i(e(u).rx_packets||\"--\"),1),t(\"div\",null,i(e(n)(\"\\u53D1\\u9001\\uFF1A\"))+i(e(u).tx_packets||\"--\"),1)],36)):D(\"\",!0)}});var on=N(an,[[\"__scopeId\",\"data-v-0698ba82\"]]);const nn={id:\"main\"},rn=I({setup(o){return(n,a)=>{const l=_t(\"router-view\");return r(),s(\"div\",nn,[Y(l),Y(on)])}}});var sn=N(rn,[[\"__scopeId\",\"data-v-9bc295c2\"]]);const dn={},ln={t:\"1640593669834\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"54870\",width:\"128\",height:\"128\"},un=t(\"path\",{d:\"M148.7872 57.4464h177.152c64.9216 0 118.0672 53.1456 118.0672 118.0672v295.2192H148.7872C83.8656 470.7328 30.72 417.5872 30.72 352.5632v-177.152C30.72 110.592 83.8656 57.4464 148.7872 57.4464z m0 531.3536h295.2192v295.2192c0 64.9216-53.1456 118.0672-118.0672 118.0672h-177.152C83.8656 1001.984 30.72 948.9408 30.72 883.9168v-177.152C30.72 641.9456 83.8656 588.8 148.7872 588.8z m0 0M768.7168 559.2064L562.0736 346.7264c-23.6544-17.7152-35.4304-53.1456-35.4304-82.6368s11.776-59.0848 35.4304-82.6368L686.08 57.4464C733.2864 10.24 810.0864 10.24 851.3536 57.4464l124.0064 124.0064c23.6544 23.6544 35.4304 53.1456 35.4304 82.6368s-11.776 59.0848-35.4304 82.6368L768.7168 559.2064z m0-478.208c-17.7152 0-29.4912 5.9392-41.3696 17.7152l-123.904 124.0064c-11.776 11.776-17.7152 23.6544-17.7152 41.3696s5.9392 29.4912 17.7152 41.3696l165.2736 165.2736 165.2736-165.2736c11.776-11.776 17.7152-23.6544 17.7152-41.3696s-5.9392-29.4912-17.7152-41.3696L809.984 98.7136c-11.776-11.776-23.552-17.7152-41.2672-17.7152z m0 0\",\"p-id\":\"54871\"},null,-1),cn=t(\"path\",{d:\"M562.0736 588.8h295.2192c64.9216 0 118.0672 53.1456 118.0672 118.0672v177.152c0 64.9216-53.1456 118.0672-118.0672 118.0672h-177.152c-64.9216 0-118.0672-53.1456-118.0672-118.0672V588.8z m0 0\",\"p-id\":\"54872\"},null,-1),pn=[un,cn];function fn(o,n){return r(),s(\"svg\",ln,pn)}var mn=N(dn,[[\"render\",fn]]);const gn={},vn={t:\"1640598743438\",class:\"icon\",viewBox:\"0 0 1036 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"65341\",width:\"128\",height:\"128\"},bn=t(\"path\",{d:\"M984.177778 432.355556l-45.511111 0c-22.755556 0-45.511111-17.066667-51.2-39.822222l-28.444444-68.266667C847.644444 312.888889 853.333333 284.444444 870.4 267.377778l34.133333-34.133333c17.066667-17.066667 17.066667-39.822222 0-56.888889l-56.888889-56.888889c-17.066667-17.066667-39.822222-17.066667-56.888889 0l-34.133333 34.133333C739.555556 170.666667 711.111111 176.355556 694.044444 164.977778L625.777778 136.533333c-22.755556-5.688889-39.822222-28.444444-39.822222-51.2L585.955556 39.822222c0-22.755556-17.066667-39.822222-39.822222-39.822222L472.177778 0C449.422222 0 432.355556 17.066667 432.355556 39.822222l0 45.511111c0 22.755556-17.066667 45.511111-39.822222 51.2L329.955556 164.977778C312.888889 176.355556 284.444444 170.666667 267.377778 153.6L233.244444 119.466667c-17.066667-17.066667-39.822222-17.066667-56.888889 0l-56.888889 56.888889c-17.066667 17.066667-17.066667 39.822222 0 56.888889l34.133333 34.133333C170.666667 284.444444 176.355556 312.888889 164.977778 329.955556L136.533333 398.222222C130.844444 415.288889 108.088889 432.355556 85.333333 432.355556l-45.511111 0C17.066667 432.355556 0 449.422222 0 472.177778l0 79.644444c0 22.755556 17.066667 39.822222 39.822222 39.822222l45.511111 0c22.755556 0 45.511111 17.066667 51.2 39.822222l28.444444 68.266667C176.355556 711.111111 170.666667 739.555556 153.6 756.622222l-34.133333 34.133333c-17.066667 17.066667-17.066667 39.822222 0 56.888889l56.888889 56.888889c17.066667 17.066667 39.822222 17.066667 56.888889 0l34.133333-34.133333C284.444444 853.333333 312.888889 847.644444 329.955556 859.022222L398.222222 887.466667c22.755556 5.688889 39.822222 28.444444 39.822222 51.2l0 45.511111c0 22.755556 17.066667 39.822222 39.822222 39.822222l79.644444 0c22.755556 0 39.822222-17.066667 39.822222-39.822222l0-45.511111c0-22.755556 17.066667-45.511111 39.822222-51.2l68.266667-28.444444c17.066667-11.377778 45.511111-5.688889 62.577778 11.377778l34.133333 34.133333c17.066667 17.066667 39.822222 17.066667 56.888889 0l56.888889-56.888889c17.066667-17.066667 17.066667-39.822222 0-56.888889l-34.133333-34.133333c-17.066667-17.066667-17.066667-45.511111-11.377778-62.577778l28.444444-68.266667c5.688889-22.755556 28.444444-39.822222 51.2-39.822222l45.511111 0c22.755556 0 39.822222-17.066667 39.822222-39.822222L1035.377778 472.177778C1024 449.422222 1006.933333 432.355556 984.177778 432.355556L984.177778 432.355556zM711.111111 512c0 108.088889-91.022222 199.111111-199.111111 199.111111-108.088889 0-199.111111-85.333333-199.111111-199.111111 0-108.088889 85.333333-199.111111 199.111111-199.111111C620.088889 312.888889 711.111111 403.911111 711.111111 512L711.111111 512zM711.111111 512\",\"p-id\":\"65342\"},null,-1),hn=[bn];function _n(o,n){return r(),s(\"svg\",vn,hn)}var xn=N(gn,[[\"render\",_n]]);const wn={},kn={t:\"1640599890701\",class:\"icon\",viewBox:\"0 0 1565 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"76947\",width:\"128\",height:\"128\"},yn=t(\"path\",{d:\"M1206.477959 299.331595c-27.357038 0-53.867311 3.354494-79.465683 9.151581C1078.518669 130.792698 916.428217 0 723.365689 0 492.068443 0 304.575027 187.493416 304.575027 418.790662c0 16.055976 1.074741 31.786273 2.865975 47.386299-9.184149-0.911901-18.400865-1.40042-27.812989-1.40042C125.191018 464.743973 0 589.934991 0 744.371987c0 154.469563 125.191018 279.628013 279.595446 279.628013 59.990077 0 221.233764 0 394.527575 0l0-302.295274L496.986197 721.704726l285.457668-339.031868 285.457668 339.031868-177.136823 0 0 302.295274c139.748871 0 262.204185 0 315.71325 0 197.947713 0 358.40977-168.34349 358.40977-366.291203S1404.425673 299.331595 1206.477959 299.331595z\",\"p-id\":\"76948\"},null,-1),Fn=[yn];function En(o,n){return r(),s(\"svg\",kn,Fn)}var $n=N(wn,[[\"render\",En]]);const Cn={},Dn={t:\"1640599792937\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"68605\",width:\"128\",height:\"128\"},Bn=t(\"path\",{d:\"M512 825.6c-211.2 0-377.6-57.6-377.6-128l0 0L134.4 896l0 0c6.4 70.4 172.8 128 377.6 128 204.8 0 371.2-57.6 377.6-128l0 0 0-204.8 0 0C889.6 768 723.2 825.6 512 825.6L512 825.6z\",\"p-id\":\"68606\"},null,-1),Yn=t(\"path\",{d:\"M512 544c-211.2 0-377.6-57.6-377.6-128l0 0 0 204.8 0 0c6.4 70.4 172.8 128 377.6 128 204.8 0 371.2-57.6 377.6-128l0 0L889.6 416l0 0C889.6 486.4 723.2 544 512 544L512 544z\",\"p-id\":\"68607\"},null,-1),An=t(\"path\",{d:\"M889.6 128 889.6 128c0-70.4-166.4-128-377.6-128C300.8 0 134.4 57.6 134.4 128l0 0 0 0 0 204.8 0 0c6.4 70.4 172.8 128 377.6 128 204.8 0 371.2-57.6 377.6-128l0 0L889.6 128 889.6 128 889.6 128zM512 217.6c-153.6 0-281.6-44.8-281.6-96 0-51.2 128-96 281.6-96 153.6 0 281.6 44.8 281.6 96C793.6 179.2 665.6 217.6 512 217.6L512 217.6z\",\"p-id\":\"68608\"},null,-1),Sn=[Bn,Yn,An];function zn(o,n){return r(),s(\"svg\",Dn,Sn)}var Pn=N(Cn,[[\"render\",zn]]);const Tn={},In={t:\"1640575557247\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"4211\",width:\"128\",height:\"128\"},Mn=t(\"path\",{d:\"M560 800l-10.464-416h-75.072L464 800h96z m-14.144-493.984c9.44-9.312 14.144-20.672 14.144-34.016 0-13.6-4.704-24.992-14.144-34.208A46.784 46.784 0 0 0 512 224c-13.12 0-24.448 4.608-33.856 13.792A45.856 45.856 0 0 0 464 272c0 13.344 4.704 24.704 14.144 34.016 9.408 9.312 20.704 13.984 33.856 13.984 13.12 0 24.448-4.672 33.856-13.984zM512 32C246.912 32 32 246.912 32 512c0 265.088 214.912 480 480 480 265.088 0 480-214.912 480-480 0-265.088-214.912-480-480-480z m0 64c229.76 0 416 186.24 416 416s-186.24 416-416 416S96 741.76 96 512 282.24 96 512 96z\",\"p-id\":\"4212\"},null,-1),Ln=[Mn];function On(o,n){return r(),s(\"svg\",In,Ln)}var Nn=N(Tn,[[\"render\",On]]);const Vn={},Gn={t:\"1640681742480\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"80687\",width:\"128\",height:\"128\"},jn=t(\"path\",{d:\"M899.892468 123.889088c0-44.342099-36.286708-80.620486-80.624646-80.620486H204.728017C160.385918 43.268602 124.107532 79.546988 124.107532 123.889088v802.847056c0 44.342099 36.278386 80.620486 80.620485 80.620486h614.539805c44.337938 0 80.624646-36.278386 80.624646-80.620486V123.889088z\",fill:\"#D0D0DB\",\"p-id\":\"80688\"},null,-1),Un=t(\"path\",{d:\"M169.8768 977.7772V174.930143c0-44.342099 36.278386-80.620486 80.620486-80.620485h614.539804c9.936092 0 19.426974 1.905666 28.239639 5.23434-11.525534-30.507298-40.996782-52.389169-75.398629-52.389169H203.342457c-44.342099 0-80.620486 36.278386-80.620486 80.620486v802.851217c0 34.410168 21.881871 63.873094 52.385008 75.381985A79.730065 79.730065 0 0 1 169.8768 977.7772z\",fill:\"#FFFFFF\",\"p-id\":\"80689\"},null,-1),qn=t(\"path\",{d:\"M820.657543 40.497481H206.117739c-44.342099 0-80.620486 36.278386-80.620486 80.620485v802.847057c0 44.342099 36.278386 80.620486 80.620486 80.620486h614.539804c44.337938 0 80.624646-36.278386 80.624647-80.620486V121.117966c0-44.342099-36.286708-80.620486-80.624647-80.620485z m19.60173 828.785749c0 40.846992-33.43237 74.279362-74.287684 74.279361H199.780776c-40.855313 0-74.279362-33.424048-74.279362-74.279361V129.593603c0-40.855313 33.424048-74.279362 74.279362-74.279362h566.203296c40.842831 0 74.283522 33.424048 74.283522 74.279362l-0.008321 739.689627z\",fill:\"#6E6E96\",\"p-id\":\"80690\"},null,-1),Rn=t(\"path\",{d:\"M815.106979 1024H200.567175C146.933914 1024 103.303319 980.369405 103.303319 926.736144V123.889088C103.303319 70.255827 146.933914 26.625232 200.567175 26.625232h614.539804c53.633261 0 97.268017 43.630595 97.268017 97.263856v802.847056c0 53.633261-43.634756 97.263856-97.268017 97.263856zM200.567175 59.911972C165.287391 59.911972 136.590059 88.609303 136.590059 123.889088v802.847056c0 35.279784 28.697331 63.977115 63.977116 63.977115h614.539804c35.279784 0 63.981276-28.697331 63.981276-63.977115V123.889088c0-35.279784-28.701492-63.977115-63.981276-63.977116H200.567175z\",fill:\"#6E6E96\",\"p-id\":\"80691\"},null,-1),Wn=t(\"path\",{d:\"M301.946104 941.515457h429.985632v65.841173H301.946104z\",fill:\"#8A8AA1\",\"p-id\":\"80692\"},null,-1),Hn=t(\"path\",{d:\"M731.931736 1024H301.946104a16.64337 16.64337 0 0 1-16.64337-16.64337V941.515457a16.64337 16.64337 0 0 1 16.64337-16.64337h429.985632a16.64337 16.64337 0 0 1 16.64337 16.64337v65.841173a16.64337 16.64337 0 0 1-16.64337 16.64337z m-413.342262-33.286741h396.698892v-32.554432H318.589474v32.554432z\",fill:\"#6E6E96\",\"p-id\":\"80693\"},null,-1),Jn=t(\"path\",{d:\"M337.230049 960.318304h20.804213v47.038326h-20.804213zM386.565159 960.318304h20.804213v47.038326h-20.804213zM435.891948 960.318304h20.804213v47.038326h-20.804213zM485.231219 960.318304h20.804213v47.038326h-20.804213zM534.558008 960.318304h20.804213v47.038326h-20.804213zM583.897279 960.318304h20.804213v47.038326h-20.804213zM633.224068 960.318304h20.804213v47.038326h-20.804213zM682.563339 960.318304h20.804213v47.038326h-20.804213z\",fill:\"#FFE599\",\"p-id\":\"80694\"},null,-1),Zn=t(\"path\",{d:\"M219.153659 140.794591m-26.874883 0a26.874882 26.874882 0 1 0 53.749765 0 26.874882 26.874882 0 1 0-53.749765 0Z\",fill:\"#ADADD1\",\"p-id\":\"80695\"},null,-1),Kn=t(\"path\",{d:\"M219.153659 184.312843c-23.995579 0-43.518252-19.522673-43.518253-43.518252s19.522673-43.518252 43.518253-43.518253 43.518252 19.522673 43.518252 43.518253-19.522673 43.518252-43.518252 43.518252z m0-53.749764c-5.642103 0-10.231512 4.589409-10.231512 10.231512s4.589409 10.231512 10.231512 10.231512 10.231512-4.589409 10.231511-10.231512-4.589409-10.231512-10.231511-10.231512z\",fill:\"#6E6E96\",\"p-id\":\"80696\"},null,-1),Qn=t(\"path\",{d:\"M801.28466 140.794591m-26.870721 0a26.870721 26.870721 0 1 0 53.741442 0 26.870721 26.870721 0 1 0-53.741442 0Z\",fill:\"#ADADD1\",\"p-id\":\"80697\"},null,-1),Xn=t(\"path\",{d:\"M801.28466 184.308683c-23.995579 0-43.514092-19.518512-43.514091-43.514092s19.518512-43.514092 43.514091-43.514092 43.514092 19.518512 43.514092 43.514092-19.518512 43.514092-43.514092 43.514092z m0-53.741443c-5.637942 0-10.227351 4.589409-10.227351 10.227351s4.589409 10.227351 10.227351 10.227351 10.227351-4.589409 10.227351-10.227351-4.589409-10.227351-10.227351-10.227351z\",fill:\"#6E6E96\",\"p-id\":\"80698\"},null,-1),ti=t(\"path\",{d:\"M801.280499 905.23291m-26.870721 0a26.870721 26.870721 0 1 0 53.741443 0 26.870721 26.870721 0 1 0-53.741443 0Z\",fill:\"#ADADD1\",\"p-id\":\"80699\"},null,-1),ei=t(\"path\",{d:\"M801.280499 948.747001c-23.995579 0-43.514092-19.518512-43.514091-43.514091s19.518512-43.514092 43.514091-43.514092 43.514092 19.518512 43.514092 43.514092-19.518512 43.514092-43.514092 43.514091z m0-53.741442c-5.637942 0-10.227351 4.589409-10.227351 10.227351s4.589409 10.227351 10.227351 10.227351 10.227351-4.589409 10.227351-10.227351-4.589409-10.227351-10.227351-10.227351z\",fill:\"#6E6E96\",\"p-id\":\"80700\"},null,-1),ai=t(\"path\",{d:\"M219.153659 905.23291m-26.870722 0a26.870721 26.870721 0 1 0 53.741443 0 26.870721 26.870721 0 1 0-53.741443 0Z\",fill:\"#ADADD1\",\"p-id\":\"80701\"},null,-1),oi=t(\"path\",{d:\"M219.153659 948.747001c-23.995579 0-43.514092-19.518512-43.514092-43.514091s19.518512-43.514092 43.514092-43.514092 43.514092 19.518512 43.514091 43.514092-19.522673 43.514092-43.514091 43.514091z m0-53.741442c-5.637942 0-10.227351 4.589409-10.227351 10.227351s4.589409 10.227351 10.227351 10.227351 10.227351-4.589409 10.227351-10.227351-4.589409-10.227351-10.227351-10.227351z\",fill:\"#6E6E96\",\"p-id\":\"80702\"},null,-1),ni=t(\"path\",{d:\"M520.972857 777.43263c-142.542145 0-258.508988-115.971004-258.508988-258.52147a16.64337 16.64337 0 0 1 33.28674 0c0 124.19699 101.033579 225.23473 225.222248 225.23473s225.222248-101.03774 225.222248-225.23473c0-124.188668-101.033579-225.218087-225.222248-225.218087a16.64337 16.64337 0 0 1 0-33.286741c142.542145 0 258.508988 115.966843 258.508988 258.504828 0 142.550466-115.966843 258.521471-258.508988 258.52147z\",fill:\"#6E6E96\",\"p-id\":\"80703\"},null,-1),ii=t(\"path\",{d:\"M520.968696 518.919481m-83.312551 0a83.312551 83.312551 0 1 0 166.625102 0 83.312551 83.312551 0 1 0-166.625102 0Z\",fill:\"#A9A9BA\",\"p-id\":\"80704\"},null,-1),ri=t(\"path\",{d:\"M520.968696 618.875402c-55.114521 0-99.955921-44.83724-99.955921-99.95176 0-55.118682 44.8414-99.955921 99.955921-99.955921s99.95176 44.8414 99.95176 99.955921c0 55.11036-44.83724 99.95176-99.95176 99.95176z m0-166.625101c-36.761044 0-66.669181 29.908136-66.66918 66.66918s29.908136 66.66502 66.66918 66.66502 66.66502-29.908136 66.66502-66.66502c0-36.761044-29.903976-66.669181-66.66502-66.66918z\",fill:\"#6E6E96\",\"p-id\":\"80705\"},null,-1),si=t(\"path\",{d:\"M301.946104 941.515457h429.985632v36.977408H301.946104z\",fill:\"#6E6E96\",\"p-id\":\"80706\"},null,-1),di=[jn,Un,qn,Rn,Wn,Hn,Jn,Zn,Kn,Qn,Xn,ti,ei,ai,oi,ni,ii,ri,si];function li(o,n){return r(),s(\"svg\",Gn,di)}var ui=N(Vn,[[\"render\",li]]);const ci={},pi={t:\"1640775712185\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2996\",width:\"128\",height:\"128\"},fi=t(\"path\",{d:\"M894.185422 128.023792 129.814578 445.743994 445.99982 577.744353 571.860343 893.929596Z\",\"p-id\":\"2997\"},null,-1),mi=[fi];function gi(o,n){return r(),s(\"svg\",pi,mi)}var vi=N(ci,[[\"render\",gi]]);const bi={class:\"progress\"},hi=I({props:{value:{type:Number,required:!0},text:{type:String}},setup(o){const n=o,a=Q(()=>n.value>=80?\"#e45e5e\":n.value>=70?\"#ff9800\":n.value>=60?\"#297ff3\":n.value>0?\"#53c31b\":\"\");return(l,u)=>(r(),s(\"div\",bi,[t(\"div\",{class:lt([\"progress-value\",`${o.value>50}`]),style:ht({width:`${o.value}%`,backgroundColor:e(a)})},[t(\"span\",null,i(o.text),1)],6),Yt(l.$slots,\"default\",{},void 0,!0)]))}});var Ua=N(hi,[[\"__scopeId\",\"data-v-733828e1\"]]);const _i={},xi={height:\"32\",width:\"64\",t:\"1649907260906\",viewBox:\"-8 248 1045 537\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2793\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},wi=t(\"path\",{d:\"M764.904497 251.418146 259.086289 251.418146c-143.076626 0-259.065314 115.989711-259.065314 259.065314 0 143.077649 115.988688 259.063267 259.065314 259.063267l505.818207 0c143.074579 0 259.063267-115.985618 259.063267-259.063267C1023.967764 367.407857 907.980099 251.418146 764.904497 251.418146zM764.904497 747.164974c-130.507356 0-236.682537-106.175181-236.682537-236.682537S634.397141 273.798876 764.904497 273.798876s236.683561 106.176205 236.683561 236.683561S895.411853 747.164974 764.904497 747.164974z\",\"p-id\":\"2794\",fill:\"#52C41A\"},null,-1),ki=[wi];function yi(o,n){return r(),s(\"svg\",xi,ki)}var Fi=N(_i,[[\"render\",yi]]);const Ei={},$i={height:\"32\",width:\"64\",t:\"1649907515643\",viewBox:\"-8 248 1045 537\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2971\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},Ci=t(\"path\",{d:\"M764.867148 249.793136 259.0735 249.793136c-143.070486 0-259.052011 115.984594-259.052011 259.052011 0 143.07151 115.982548 259.050987 259.052011 259.050987l505.793648 0c143.067416 0 259.050987-115.979478 259.050987-259.050987C1023.917112 365.778754 907.933541 249.793136 764.867148 249.793136zM259.0735 745.516428c-130.501216 0-236.671281-106.172111-236.671281-236.671281 0-130.501216 106.170065-236.671281 236.671281-236.671281S495.744781 378.344954 495.744781 508.84617C495.744781 639.34534 389.574716 745.516428 259.0735 745.516428z\",\"p-id\":\"2972\",fill:\"#999\"},null,-1),Di=[Ci];function Bi(o,n){return r(),s(\"svg\",$i,Di)}var Yi=N(Ei,[[\"render\",Bi]]);const Ai={class:\"checkbox_switch\"},Si={class:\"checkbox_switch_on\"},zi={class:\"checkbox_switch_off\"},Pi=I({props:{modelValue:{type:Boolean,required:!0}},emits:[\"update:modelValue\"],setup(o,{emit:n}){const a=o,l=Q({get:()=>a.modelValue.valueOf(),set:u=>n(\"update:modelValue\",u)});return(u,d)=>(r(),s(\"label\",Ai,[O(t(\"input\",{type:\"checkbox\",\"onUpdate:modelValue\":d[0]||(d[0]=c=>Ia(l)?l.value=c:null)},null,512),[[Rt,e(l)]]),t(\"span\",Si,[Y(Fi)]),t(\"span\",zi,[Y(Yi)]),Yt(u.$slots,\"default\",{},void 0,!0)]))}});var qa=N(Pi,[[\"__scopeId\",\"data-v-76324716\"]]);const Ti={},Ii={t:\"1641369474206\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"7685\",width:\"128\",height:\"128\"},Mi=t(\"path\",{d:\"M757.76 637.44l-218.88 245.76c-14.72 16.64-40.32 16.64-54.4 0L265.6 637.44C244.48 613.76 261.12 576 293.12 576l437.76 0C762.24 576 779.52 613.76 757.76 637.44z\",\"p-id\":\"7686\"},null,-1),Li=[Mi];function Oi(o,n){return r(),s(\"svg\",Ii,Li)}var Ni=N(Ti,[[\"render\",Oi]]);const Vi={},Gi={t:\"1641369492518\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"7831\",width:\"128\",height:\"128\"},ji=t(\"path\",{d:\"M758.4 385.92 539.52 140.16c-14.72-16.64-40.32-16.64-54.4 0L266.24 385.92C244.48 409.6 261.76 448 293.12 448l437.76 0C762.88 448 779.52 409.6 758.4 385.92z\",\"p-id\":\"7832\"},null,-1),Ui=[ji];function qi(o,n){return r(),s(\"svg\",Gi,Ui)}var Ri=N(Vi,[[\"render\",qi]]);const Wi={};function Hi(o,n){return r(),s(\"article\",null,[Yt(o.$slots,\"default\",{},void 0,!0)])}var Ji=N(Wi,[[\"render\",Hi],[\"__scopeId\",\"data-v-bd286d4e\"]]);const Zi={class:\"cover\"},Ki={class:\"thumbnail\"},Qi=I({emits:[\"click\"],setup(o,{emit:n}){const a=()=>{n(\"click\")};return(l,u)=>(r(),Z(Ji,null,{default:V(()=>[t(\"a\",{onClick:a},[t(\"div\",Zi,[t(\"div\",Ki,[Yt(l.$slots,\"default\",{},void 0,!0)])])])]),_:3}))}});var Xi=N(Qi,[[\"__scopeId\",\"data-v-123deb20\"]]);const tr={class:\"select-editable\"},er={selected:\"\",value:\"\"},ar=[\"value\"],or={value:\"useInput\"},nr=[\"placeholder\"],ir=I({props:{modelValue:{type:String,required:!0},title:{type:String,default:\"\"},options:{type:Array,default:[]}},emits:[\"update:modelValue\"],setup(o,{emit:n}){const a=o,{$gettext:l,$ngettext:u}=J(),d=E(\"\"),c=E(\"\"),k=Q({get:()=>a.modelValue.valueOf(),set:v=>n(\"update:modelValue\",v)}),g=v=>{v===d.value||d.value===\"useInput\"&&v===c.value||(v===\"\"||a.options.some(b=>b.key===v)?d.value=v:(c.value=v,d.value=\"useInput\"))};$t(()=>a.modelValue,v=>{g(v)}),Pt(()=>{const v=k.value;g(v)});const p=v=>{d.value===\"useInput\"?k.value=c.value:k.value=d.value},m=v=>{k.value=c.value};return(v,b)=>(r(),s(\"label\",null,[t(\"div\",tr,[O(t(\"select\",{\"onUpdate:modelValue\":b[0]||(b[0]=y=>d.value=y),autocomplete:\"off\",onChange:p},[t(\"option\",er,i(e(l)(\"\\u8BF7\\u9009\\u62E9%{title}\",{title:o.title})),1),(r(!0),s(U,null,tt(o.options,(y,f)=>(r(),s(\"option\",{value:y.key,key:f},i(y.value||y.key),9,ar))),128)),t(\"option\",or,i(e(l)(\"- -\\u81EA\\u5B9A\\u4E49- -\")),1)],544),[[pt,d.value,void 0,{trim:!0}]]),d.value==\"useInput\"?O((r(),s(\"input\",{key:0,type:\"text\",\"onUpdate:modelValue\":b[1]||(b[1]=y=>c.value=y),required:\"\",placeholder:e(l)(\"\\u8BF7\\u8F93\\u5165%{title}\",{title:o.title}),onChange:m},null,40,nr)),[[at,c.value,void 0,{trim:!0}]]):D(\"\",!0)])]))}});var Zt=N(ir,[[\"__scopeId\",\"data-v-0b6f3a7d\"]]);const rr={t:\"1631799919469\",class:\"icon\",viewBox:\"0 0 1047 1047\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"3453\",width:\"128\",height:\"128\"},sr=I({props:{size:{type:[Number,String],default:50},color:{type:String,default:\"#fff\"}},setup(o){const n=a=>{if(a==null)return;if(typeof a==\"number\")return a+\"px\";const l=a.toString();return parseInt(l)+\"\"==l?l+\"px\":l};return(a,l)=>(r(),s(\"div\",{class:\"quick-loading\",style:ht({width:n(o.size),height:n(o.size)})},[(r(),s(\"svg\",rr,[t(\"path\",{d:\"M522.695111 1.991111c-26.339556 0.170667-47.416889 21.475556-47.672889 48.753778-0.284444 26.453333-0.056889 52.963556-0.056889 79.445333 0 27.249778-0.369778 54.528 0.113778 81.777778 0.483556 27.050667 22.016 47.132444 49.351111 46.904889a47.786667 47.786667 0 0 0 47.729778-47.445333c0.284444-53.76 0.284444-107.52-0.028444-161.251556-0.170667-27.676444-21.902222-48.355556-49.436445-48.184889m-195.896889 88.092445c-8.334222-14.222222-21.646222-21.276444-38.314666-21.333334-35.128889 0-56.576 36.949333-38.968889 68.152889a11616.995556 11616.995556 0 0 0 78.961777 137.614222 44.942222 44.942222 0 0 0 61.838223 16.896c21.304889-12.202667 29.667556-38.968889 17.379555-60.871111-26.453333-47.104-53.560889-93.866667-80.896-140.458666m-228.693333 234.524444c44.316444 25.799111 88.746667 51.342222 133.176889 76.970667 6.712889 3.896889 13.681778 6.912 21.703111 6.428444 20.138667 0.142222 35.953778-11.946667 41.301333-31.573333 5.006222-18.261333-2.673778-36.721778-20.224-46.990222-44.629333-26.026667-89.372444-51.882667-134.115555-77.710223-22.528-12.999111-47.815111-7.025778-59.818667 13.909334-12.231111 21.248-4.977778 45.624889 17.948444 58.965333m34.161778 235.975111c26.396444 0 52.821333 0.199111 79.217778-0.085333 23.409778-0.256 39.139556-16.412444 38.798222-39.139556-0.341333-21.617778-16.924444-37.347556-39.594666-37.376-51.655111-0.056889-103.310222-0.056889-154.965334 0.028445-24.177778 0.056889-40.704 15.985778-40.561778 38.684444 0.142222 22.186667 16.583111 37.745778 40.192 37.859556 25.656889 0.142222 51.285333 0.028444 76.913778 0m151.722667 100.238222a34.247111 34.247111 0 0 0-46.876445-12.942222 13764.778667 13764.778667 0 0 0-139.008 80.583111c-11.093333 6.485333-16.327111 16.867556-16.497777 25.372444 0.085333 30.549333 27.249778 47.957333 50.403555 35.072 47.160889-26.197333 93.724444-53.475556 140.145778-80.924444 17.180444-10.154667 21.504-30.378667 11.832889-47.160889m91.875555 101.660444c-14.250667-4.067556-27.619556 1.422222-35.84 15.644445a24375.466667 24375.466667 0 0 0-77.312 134.485333c-10.012444 17.550222-5.859556 35.669333 9.784889 45.027556 16.014222 9.557333 34.247111 4.039111 44.714667-13.994667 25.543111-44.088889 50.915556-88.263111 76.373333-132.352 3.299556-5.745778 5.688889-11.690667 5.745778-14.933333 0-17.834667-9.272889-29.866667-23.466667-33.877334m147.456 44.288c-16.384 0.085333-27.306667 11.918222-27.448888 30.151111-0.142222 25.372444-0.028444 50.716444-0.028445 76.060445h-0.085333c0 26.112-0.113778 52.252444 0.056889 78.364444 0.113778 18.261333 11.064889 30.065778 27.448889 30.208 16.952889 0.142222 28.046222-11.832889 28.103111-30.748444 0.113778-51.086222 0.142222-102.172444 0.056889-153.258667 0-18.773333-11.207111-30.862222-28.103112-30.776889m177.208889-26.112c-7.509333-12.8-21.902222-16.014222-33.792-8.874666a23.722667 23.722667 0 0 0-8.533333 32.995555c26.282667 46.279111 52.906667 92.330667 79.644444 138.353778 4.494222 7.765333 11.633778 11.946667 20.906667 11.804444 18.545778-0.142222 30.520889-19.342222 21.219556-35.868444-26.026667-46.392889-52.650667-92.444444-79.473778-138.410667m239.957333-41.187555c-45.283556-26.254222-90.595556-52.48-135.964444-78.648889-4.693333-2.702222-9.728-4.323556-15.36-2.958222-9.102222 2.247111-14.933333 8.049778-16.497778 17.095111-1.877333 10.894222 3.84 18.204444 12.885333 23.438222 29.809778 17.180444 59.562667 34.417778 89.344 51.598222 15.217778 8.789333 30.236444 17.976889 45.738667 26.225778 14.677333 7.793778 31.061333-2.048 31.061333-18.033778-0.056889-8.448-4.096-14.592-11.207111-18.716444m48.867556-234.638222c-24.888889-0.085333-49.749333 0-74.609778 0v-0.085334c-25.258667 0-50.517333-0.056889-75.776 0.028445-13.425778 0.056889-20.963556 6.343111-21.162667 17.294222-0.199111 11.150222 7.082667 17.521778 20.679111 17.550222 50.488889 0.113778 100.977778 0.142222 151.495112 0.085333 13.368889 0 21.191111-6.485333 21.390222-17.152 0.227556-10.808889-8.106667-17.664-22.016-17.720888m-187.960889-127.146667c45.084444-26.026667 90.140444-52.110222 135.168-78.222222 4.864-2.844444 8.248889-6.855111 8.135111-12.942223-0.142222-11.036444-11.207111-17.436444-21.504-11.548444-45.511111 26.055111-90.851556 52.394667-136.135111 78.819556-7.68 4.494222-10.524444 11.52-5.575111 19.569777 4.835556 7.850667 12.088889 8.817778 19.911111 4.323556m-122.311111-115.114667c5.205333-0.256 8.220444-3.413333 10.609778-7.651555 4.920889-8.647111 10.040889-17.208889 14.990222-25.827556 20.48-35.555556 40.931556-71.025778 61.297778-106.609778 5.091556-8.874667 3.015111-16.668444-4.778667-18.517333-7.68-1.848889-10.894222 3.697778-14.051556 9.159111l-68.778666 119.495111c-2.844444 4.977778-6.030222 9.870222-8.305778 15.104-3.128889 7.196444 1.678222 14.648889 9.045333 14.848\",\"p-id\":\"3454\",style:ht({fill:o.color})},null,4)]))],4))}});var dr=N(sr,[[\"__scopeId\",\"data-v-0ec4e762\"]]);const lr={},ur={t:\"1642063181211\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"5062\",width:\"128\",height:\"128\",\"data-v-cda444e0\":\"\"},cr=t(\"path\",{d:\"M512 85.333333c235.648 0 426.666667 191.018667 426.666667 426.666667s-191.018667 426.666667-426.666667 426.666667S85.333333 747.648 85.333333 512 276.352 85.333333 512 85.333333z m-74.965333 550.4L346.453333 545.152a42.666667 42.666667 0 1 0-60.330666 60.330667l120.704 120.704a42.666667 42.666667 0 0 0 60.330666 0l301.653334-301.696a42.666667 42.666667 0 1 0-60.288-60.330667l-271.530667 271.488z\",fill:\"#52C41A\",\"p-id\":\"5063\",\"data-v-cda444e0\":\"\"},null,-1),pr=[cr];function fr(o,n){return r(),s(\"svg\",ur,pr)}var mr=N(lr,[[\"render\",fr]]);const gr={},vr={width:\"128\",height:\"128\",viewBox:\"0 0 50 50\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},br=jt('<g id=\"icon_internet-alert\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"><g id=\"wancheng\"><path d=\"M0,25 C0,33.9316396 4.76497292,42.1848151 12.5,46.6506351 C20.2350269,51.116455 29.7649731,51.116455 37.5,46.6506351 C45.2350271,42.1848151 50,33.9316396 50,25 C50,11.1928812 38.8071187,0 25,0 C11.1928813,0 0,11.1928812 0,25 Z\" id=\"Path\" fill-opacity=\"0.08\" fill=\"#FAAD14\" fill-rule=\"nonzero\"></path><g id=\"Group-2\" transform=\"translate(10.000000, 10.000000)\"><path d=\"M0,15 C0,20.3589838 2.85898375,25.3108891 7.5,27.990381 C12.1410161,30.669873 17.8589839,30.669873 22.5,27.990381 C27.1410162,25.3108891 30,20.3589838 30,15 C30,6.7157287 23.2842712,0 15,0 C6.71572875,0 0,6.7157287 0,15 Z\" id=\"Path\" fill=\"#FAAD14\" fill-rule=\"nonzero\"></path><path d=\"M15,6 C15.8284271,6 16.5,6.67157288 16.5,7.5 L16.5,18.5 C16.5,19.3284271 15.8284271,20 15,20 C14.1715729,20 13.5,19.3284271 13.5,18.5 L13.5,7.5 C13.5,6.67157288 14.1715729,6 15,6 Z\" id=\"\\u8DEF\\u5F84\" fill=\"#FFFFFF\"></path><path d=\"M15,25 C14.171875,25 13.5,24.328125 13.5,23.5 C13.5,22.671875 14.171875,22 15,22 C15.828125,22 16.5,22.671875 16.5,23.5 C16.5,24.328125 15.828125,25 15,25 Z\" id=\"\\u8DEF\\u5F84\" fill=\"#FFFFFF\"></path></g></g></g>',1),hr=[br];function _r(o,n){return r(),s(\"svg\",vr,hr)}var xr=N(gr,[[\"render\",_r]]);const wr=o=>(ut(\"data-v-b934e2ce\"),o=o(),ct(),o),kr=[\"href\",\"title\"],yr=wr(()=>t(\"svg\",{t:\"1684144670421\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"4343\"},[t(\"path\",{d:\"M512 74.666667c241.066667 0 437.333333 196.266667 437.333333 437.333333S753.066667 949.333333 512 949.333333 74.666667 753.066667 74.666667 512 270.933333 74.666667 512 74.666667zM512 704c-23.466667 0-42.666667 19.2-42.666667 42.666667s19.2 42.666667 42.666667 42.666666 42.666667-19.2 42.666667-42.666666-19.2-42.666667-42.666667-42.666667z m0-458.666667c-76.8 0-138.666667 61.866667-138.666667 138.666667 0 17.066667 14.933333 32 32 32s32-14.933333 32-32c0-40.533333 34.133333-74.666667 74.666667-74.666667s74.666667 34.133333 74.666667 74.666667c0 2.133333 0 6.4-2.133334 10.666667-6.4 14.933333-19.2 32-40.533333 51.2-10.666667 10.666667-21.333333 19.2-34.133333 27.733333-2.133333 2.133333-6.4 4.266667-8.533334 6.4l-6.4 4.266667c-8.533333 6.4-14.933333 17.066667-14.933333 27.733333v108.8c2.133333 17.066667 14.933333 29.866667 32 29.866667h2.133333c17.066667-2.133333 29.866667-14.933333 29.866667-32v-89.6l12.8-10.666667c10.666667-8.533333 19.2-17.066667 29.866667-25.6 27.733333-25.6 46.933333-49.066667 57.6-74.666667 4.266667-10.666667 6.4-23.466667 6.4-34.133333 0-76.8-61.866667-138.666667-138.666667-138.666667z\",fill:\"#666666\",\"p-id\":\"4344\"})],-1)),Fr=[yr],Er=I({props:{type:null},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=Q(()=>{switch(n.type){case\"disk\":return\"https://www.linkease.com/rd/8myYAEVA/\";case\"store\":return\"https://www.linkease.com/rd/1F58VUTT/\";case\"docker\":return\"https://www.linkease.com/rd/2Q28MDtf/\";case\"download\":return\"https://www.linkease.com/rd/1tJo1KX-/\";case\"ddns\":return\"https://www.linkease.com/rd/3yFiX5-X/\";case\"network-interface\":return\"https://www.linkease.com/rd/3ca51a3G/\"}});return(d,c)=>(r(),s(\"a\",{href:e(u),target:\"_blank\",title:e(a)(\"\\u8DF3\\u8F6C\\u6559\\u7A0B\")},Fr,8,kr))}});var $r=N(Er,[[\"__scopeId\",\"data-v-b934e2ce\"]]),Ra={install:o=>{o.component(\"icon-loading\",dr),o.component(\"icon-success\",mr),o.component(\"icon-error\",xr),o.component(\"GlHelp\",$r)}};const Cr={class:\"reusable-card\",role:\"group\"},Dr={class:\"card-header\"},Br={class:\"left\"},Yr={class:\"title\"},Ar={class:\"settings-wrapper\"},Sr={key:0,class:\"settings-btn\"},zr={class:\"dropdown-menu\"},Pr={class:\"card-body\"},Tr={props:{title:{type:String,required:!0},showSettings:{type:Boolean,default:!0},isSettingsMenuOpen:{type:Boolean,default:!1}},emits:[\"settings\",\"update:isSettingsMenuOpen\"],setup(o,{emit:n}){const a=o;J(),Pt(()=>document.addEventListener(\"click\",u)),ke(()=>document.removeEventListener(\"click\",u));const l=Q({get:()=>a.isSettingsMenuOpen,set:d=>n(\"update:isSettingsMenuOpen\",d)}),u=d=>{d.target.closest(\".settings-wrapper\")||(l.value=!1)};return(d,c)=>(r(),s(\"div\",Cr,[t(\"div\",Dr,[t(\"div\",Br,[Yt(d.$slots,\"icon\",{},void 0,!0),t(\"div\",Yr,i(o.title),1)]),t(\"div\",Ar,[o.showSettings?(r(),s(\"div\",Sr,[Yt(d.$slots,\"settings\",{},void 0,!0)])):D(\"\",!0),Y(St,{name:\"fade\"},{default:V(()=>[O(t(\"div\",zr,[Yt(d.$slots,\"settings-menu\",{},void 0,!0)],512),[[ee,e(l)]])]),_:3})])]),t(\"div\",Pr,[Yt(d.$slots,\"default\",{},void 0,!0)])]))}};var Wt=N(Tr,[[\"__scopeId\",\"data-v-dbb174c6\"]]);const Ir={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},Mr=[\"fill\"],Lr=[\"fill\"],Or=[\"fill\"],Kt=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",Ir,[t(\"path\",{d:\"M665.6 911.36H358.4c-76.8 0-117.76 0-153.6-20.48-30.72-15.36-56.32-40.96-71.68-71.68-20.48-35.84-20.48-76.8-20.48-153.6v-51.2c0-20.48 15.36-40.96 40.96-40.96s40.96 15.36 40.96 40.96v51.2c0 61.44 0 97.28 10.24 117.76 10.24 15.36 20.48 30.72 40.96 40.96 20.48 10.24 56.32 10.24 117.76 10.24h307.2c61.44 0 97.28 0 117.76-10.24 15.36-10.24 30.72-20.48 40.96-40.96 10.24-20.48 10.24-56.32 10.24-117.76v-51.2c0-20.48 15.36-40.96 40.96-40.96s40.96 15.36 40.96 40.96v51.2c0 76.8 0 117.76-20.48 153.6-15.36 30.72-40.96 56.32-71.68 71.68-35.84 20.48-76.8 20.48-153.6 20.48z\",\"p-id\":\"4906\",fill:o.color},null,8,Mr),t(\"path\",{d:\"M512 645.12c-10.24 0-15.36 0-20.48-10.24l-204.8-204.8c-10.24-10.24-10.24-30.72 0-46.08s30.72-10.24 46.08 0l184.32 184.32 184.32-184.32c10.24-10.24 30.72-10.24 46.08 0 10.24 10.24 10.24 30.72 0 46.08l-204.8 204.8c-5.12 5.12-15.36 10.24-20.48 10.24z\",\"p-id\":\"4907\",fill:o.color},null,8,Lr),t(\"path\",{d:\"M512 645.12c-15.36 0-30.72-15.36-30.72-30.72V153.6c0-15.36 15.36-30.72 30.72-30.72s30.72 15.36 30.72 30.72v460.8c0 15.36-15.36 30.72-30.72 30.72z\",\"p-id\":\"4908\",fill:o.color},null,8,Or)]))}}),Nr={},Vr={t:\"1649668202191\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2338\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\",width:\"28px\",height:\"28px\"},Gr=t(\"path\",{d:\"M288 512m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0Z\",\"p-id\":\"2339\",fill:\"#666\"},null,-1),jr=t(\"path\",{d:\"M512 512m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0Z\",\"p-id\":\"2340\",fill:\"#666\"},null,-1),Ur=t(\"path\",{d:\"M736 512m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0Z\",\"p-id\":\"2341\",fill:\"#666\"},null,-1),qr=[Gr,jr,Ur];function Rr(o,n){return r(),s(\"svg\",Vr,qr)}var Ee=N(Nr,[[\"render\",Rr]]);const Wr={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\",width:\"128\",height:\"128\"},Hr=[\"fill\"],Jr=I({props:{color:{type:String,default:\"#000000\"}},setup(o){return(n,a)=>(r(),s(\"svg\",Wr,[t(\"path\",{d:\"M511.232 438.8352L112.9984 40.6016A51.2 51.2 0 0 0 40.6016 112.9984L438.784 511.232 40.6016 909.4656a51.2 51.2 0 1 0 72.3968 72.448l398.2336-398.2848 398.2336 398.2848a51.2 51.2 0 1 0 72.448-72.448l-398.2848-398.2336 398.2848-398.2336A51.2 51.2 0 0 0 909.4656 40.6016L511.232 438.784z\",\"p-id\":\"1217\",fill:o.color},null,8,Hr)]))}}),Zr=o=>(ut(\"data-v-75eeccd3\"),o=o(),ct(),o),Kr={id:\"actioner\"},Qr={key:0,class:\"action-container\"},Xr={class:\"action-container_header\"},ts=Zr(()=>t(\"div\",null,null,-1)),es={class:\"title\"},as=[\"title\"],os={class:\"action-container_body\"},ns=I({props:{Close:{type:Function},type:{type:Number},title:String},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=E(!1);Pt(()=>{u.value=!0,document.body.setAttribute(\"lock-scroll\",\"true\")}),Nt(()=>{document.body.removeAttribute(\"lock-scroll\")});const d=()=>{n.Close&&(u.value=!1,setTimeout(()=>{n.Close&&n.Close()},300))};return(c,k)=>(r(),s(\"div\",Kr,[t(\"div\",{class:\"bg\",onClick:d}),o.type!=null?Yt(c.$slots,\"default\",{key:0},void 0,!0):(r(),s(U,{key:1},[u.value?(r(),s(\"div\",Qr,[t(\"div\",Xr,[ts,t(\"div\",es,i(o.title),1),t(\"button\",{class:\"close\",title:e(a)(\"\\u5173\\u95ED\"),onClick:d},[Y(Jr)],8,as)]),t(\"div\",os,[Yt(c.$slots,\"default\",{},void 0,!0)])])):D(\"\",!0)],64))]))}});var is=N(ns,[[\"__scopeId\",\"data-v-75eeccd3\"]]);const wt=I({props:{Close:{type:Function},type:{type:Number},title:String},setup(o){return(n,a)=>(r(),Z(is,{Close:o.Close,type:o.type,title:o.title},{default:V(()=>[Yt(n.$slots,\"default\")]),_:3},8,[\"Close\",\"type\",\"title\"]))}}),sa=o=>(ut(\"data-v-7732abe2\"),o=o(),ct(),o),rs={class:\"disk-item\"},ss=sa(()=>t(\"div\",{class:\"disk-item_icon\"},[t(\"svg\",{t:\"1642563338465\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2216\",width:\"128\",height:\"128\"},[t(\"path\",{d:\"M998.4 711.68l-119.467-512c-6.826-42.667-42.666-75.093-87.04-76.8H232.107c-44.374 1.707-80.214 35.84-87.04 78.507L25.6 711.68c-5.12 13.653-6.827 29.013-6.827 42.667 0 76.8 63.147 139.946 141.654 139.946H865.28c78.507 0 141.653-63.146 141.653-139.946 0-13.654-3.413-29.014-8.533-42.667zM394.24 366.933c1.707-51.2 56.32-92.16 124.587-92.16S640 315.733 640 365.227c44.373-1.707 81.92 23.893 83.627 58.026s-34.134 63.147-78.507 64.854h-6.827l-245.76 1.706c-44.373 0-80.213-27.306-80.213-59.733 0-35.84 37.547-63.147 81.92-63.147z m471.04 459.094H160.427c-39.254 0-69.974-30.72-69.974-69.974s32.427-69.973 69.974-69.973H865.28c39.253 0 69.973 30.72 69.973 69.973 1.707 37.547-30.72 69.974-69.973 69.974z m-35.84-92.16c-11.947 0-22.187 8.533-23.893 20.48 0 11.946 8.533 22.186 20.48 23.893h3.413c11.947 0 22.187-10.24 22.187-22.187 0-13.653-8.534-22.186-22.187-22.186z m-46.08 22.186c0-25.6 20.48-46.08 46.08-46.08s46.08 20.48 46.08 46.08-20.48 46.08-46.08 46.08-46.08-20.48-46.08-46.08z\",\"p-id\":\"2217\"})])],-1)),ds={class:\"disk-item_f\"},ls={class:\"disk-item_venderModel\"},us={class:\"disk-item_used\"},cs=sa(()=>t(\"div\",{class:\"auto\"},null,-1)),ps={class:\"disk-item-r\"},fs={class:\"disk-children\"},ms=[\"onClick\"],gs=sa(()=>t(\"div\",{class:\"disk-item_icon\"},[t(\"svg\",{t:\"1642563581459\",class:\"icon\",viewBox:\"0 0 1228 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"7132\",width:\"128\",height:\"128\"},[t(\"path\",{d:\"M525.2096 145.3568c1.9968-45.568-35.6864-99.1232-57.4976-99.1232H57.4976C15.872 79.9232 17.8176 145.408 17.8176 145.408h507.392z\",fill:\"#ECC049\",\"p-id\":\"7133\"}),t(\"path\",{d:\"M21.8112 143.36L19.8144 825.1392c0 75.3152 75.3152 152.576 150.6304 152.576h887.9104c75.264 0 150.6304-75.264 150.6304-152.576V297.984c0-75.264-75.3152-152.576-150.6304-152.576h-434.0224L21.8112 143.36z\",fill:\"#FFD658\",\"p-id\":\"7134\"})])],-1)),vs={key:0},bs={key:1},hs=I({props:{disk:{type:Object,required:!0},currDisk:{type:Object},currMountPoint:{type:Object},onDisk:{type:Function,required:!0}},setup(o){var c,k;const n=o,{$gettext:a,$ngettext:l}=J(),u=E(!1);n.currDisk!=null&&((c=n.currDisk)==null?void 0:c.venderModel)==((k=n.disk)==null?void 0:k.venderModel)&&(u.value=!0);const d=g=>{u.value=!u.value,n.onDisk(g,null)};return(g,p)=>{var m;return r(),s(\"ul\",rs,[t(\"li\",{class:lt([\"disk-info\",{on:o.disk.venderModel==((m=o.currDisk)==null?void 0:m.venderModel),nopoint:o.disk.childrens==null||o.disk.childrens.length==0}]),onClick:p[0]||(p[0]=v=>d(o.disk))},[ss,t(\"div\",ds,[t(\"div\",ls,i(o.disk.venderModel),1),t(\"div\",us,i(o.disk.used)+\"/\"+i(o.disk.size),1)]),cs,t(\"div\",ps,i(o.disk.path),1)],2),O(t(\"div\",fs,[(r(!0),s(U,null,tt(o.disk.childrens,v=>{var b,y;return r(),s(\"li\",{class:lt([\"disk-children_item\",{on:v.uuid==((b=o.currMountPoint)==null?void 0:b.uuid)&&v.path==((y=o.currMountPoint)==null?void 0:y.path)}]),onClick:f=>o.onDisk(o.disk,v)},[gs,v.mountPoint?(r(),s(\"span\",vs,\" \\u3010\"+i(v.filesystem)+\"\\u3011 \"+i(v.mountPoint)+\" \\uFF08\"+i(v.used)+\"/\"+i(v.total)+\"\\uFF09 [\"+i(v.uuid)+\"] \",1)):(r(),s(\"span\",bs,\" \\u3010\"+i(v.filesystem)+\"\\u3011 \"+i(v.mountPoint||v.path||e(a)(\"\\u672A\\u6302\\u8F7D\\u78C1\\u76D8\"))+\" [\"+i(v.uuid)+\"] \",1))],10,ms)}),256))],512),[[ee,u.value]])])}}});var ka=N(hs,[[\"__scopeId\",\"data-v-7732abe2\"]]);let Be=0;const _s={props:{type:String,message:String|Function,Close:Function,countdown:Number},data(){return{show:!1,remain:0}},mounted(){if(window.setTimeout(()=>{this.show=!0},0),this.countdown){this.remain=this.countdown;const o=()=>{this.show&&this.remain>0&&(this.remain=this.remain-1,Be=window.setTimeout(o,1e3))};Be=window.setTimeout(o,1e3)}},computed:{Message(){return this.message+(this.countdown?\" \"+this.remain+\"s\":\"\")}},methods:{Stop(){this.type!=\"loading\"&&(this.show=!1,Be!=0&&clearTimeout(Be),this.Close())}}},Oe=o=>(ut(\"data-v-6935a479\"),o=o(),ct(),o),xs={key:0,class:\"loading icon\"},ws=Oe(()=>t(\"svg\",{t:\"1631799919469\",class:\"icon\",viewBox:\"0 0 1047 1047\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"3453\",width:\"128\",height:\"128\"},[t(\"path\",{d:\"M522.695111 1.991111c-26.339556 0.170667-47.416889 21.475556-47.672889 48.753778-0.284444 26.453333-0.056889 52.963556-0.056889 79.445333 0 27.249778-0.369778 54.528 0.113778 81.777778 0.483556 27.050667 22.016 47.132444 49.351111 46.904889a47.786667 47.786667 0 0 0 47.729778-47.445333c0.284444-53.76 0.284444-107.52-0.028444-161.251556-0.170667-27.676444-21.902222-48.355556-49.436445-48.184889m-195.896889 88.092445c-8.334222-14.222222-21.646222-21.276444-38.314666-21.333334-35.128889 0-56.576 36.949333-38.968889 68.152889a11616.995556 11616.995556 0 0 0 78.961777 137.614222 44.942222 44.942222 0 0 0 61.838223 16.896c21.304889-12.202667 29.667556-38.968889 17.379555-60.871111-26.453333-47.104-53.560889-93.866667-80.896-140.458666m-228.693333 234.524444c44.316444 25.799111 88.746667 51.342222 133.176889 76.970667 6.712889 3.896889 13.681778 6.912 21.703111 6.428444 20.138667 0.142222 35.953778-11.946667 41.301333-31.573333 5.006222-18.261333-2.673778-36.721778-20.224-46.990222-44.629333-26.026667-89.372444-51.882667-134.115555-77.710223-22.528-12.999111-47.815111-7.025778-59.818667 13.909334-12.231111 21.248-4.977778 45.624889 17.948444 58.965333m34.161778 235.975111c26.396444 0 52.821333 0.199111 79.217778-0.085333 23.409778-0.256 39.139556-16.412444 38.798222-39.139556-0.341333-21.617778-16.924444-37.347556-39.594666-37.376-51.655111-0.056889-103.310222-0.056889-154.965334 0.028445-24.177778 0.056889-40.704 15.985778-40.561778 38.684444 0.142222 22.186667 16.583111 37.745778 40.192 37.859556 25.656889 0.142222 51.285333 0.028444 76.913778 0m151.722667 100.238222a34.247111 34.247111 0 0 0-46.876445-12.942222 13764.778667 13764.778667 0 0 0-139.008 80.583111c-11.093333 6.485333-16.327111 16.867556-16.497777 25.372444 0.085333 30.549333 27.249778 47.957333 50.403555 35.072 47.160889-26.197333 93.724444-53.475556 140.145778-80.924444 17.180444-10.154667 21.504-30.378667 11.832889-47.160889m91.875555 101.660444c-14.250667-4.067556-27.619556 1.422222-35.84 15.644445a24375.466667 24375.466667 0 0 0-77.312 134.485333c-10.012444 17.550222-5.859556 35.669333 9.784889 45.027556 16.014222 9.557333 34.247111 4.039111 44.714667-13.994667 25.543111-44.088889 50.915556-88.263111 76.373333-132.352 3.299556-5.745778 5.688889-11.690667 5.745778-14.933333 0-17.834667-9.272889-29.866667-23.466667-33.877334m147.456 44.288c-16.384 0.085333-27.306667 11.918222-27.448888 30.151111-0.142222 25.372444-0.028444 50.716444-0.028445 76.060445h-0.085333c0 26.112-0.113778 52.252444 0.056889 78.364444 0.113778 18.261333 11.064889 30.065778 27.448889 30.208 16.952889 0.142222 28.046222-11.832889 28.103111-30.748444 0.113778-51.086222 0.142222-102.172444 0.056889-153.258667 0-18.773333-11.207111-30.862222-28.103112-30.776889m177.208889-26.112c-7.509333-12.8-21.902222-16.014222-33.792-8.874666a23.722667 23.722667 0 0 0-8.533333 32.995555c26.282667 46.279111 52.906667 92.330667 79.644444 138.353778 4.494222 7.765333 11.633778 11.946667 20.906667 11.804444 18.545778-0.142222 30.520889-19.342222 21.219556-35.868444-26.026667-46.392889-52.650667-92.444444-79.473778-138.410667m239.957333-41.187555c-45.283556-26.254222-90.595556-52.48-135.964444-78.648889-4.693333-2.702222-9.728-4.323556-15.36-2.958222-9.102222 2.247111-14.933333 8.049778-16.497778 17.095111-1.877333 10.894222 3.84 18.204444 12.885333 23.438222 29.809778 17.180444 59.562667 34.417778 89.344 51.598222 15.217778 8.789333 30.236444 17.976889 45.738667 26.225778 14.677333 7.793778 31.061333-2.048 31.061333-18.033778-0.056889-8.448-4.096-14.592-11.207111-18.716444m48.867556-234.638222c-24.888889-0.085333-49.749333 0-74.609778 0v-0.085334c-25.258667 0-50.517333-0.056889-75.776 0.028445-13.425778 0.056889-20.963556 6.343111-21.162667 17.294222-0.199111 11.150222 7.082667 17.521778 20.679111 17.550222 50.488889 0.113778 100.977778 0.142222 151.495112 0.085333 13.368889 0 21.191111-6.485333 21.390222-17.152 0.227556-10.808889-8.106667-17.664-22.016-17.720888m-187.960889-127.146667c45.084444-26.026667 90.140444-52.110222 135.168-78.222222 4.864-2.844444 8.248889-6.855111 8.135111-12.942223-0.142222-11.036444-11.207111-17.436444-21.504-11.548444-45.511111 26.055111-90.851556 52.394667-136.135111 78.819556-7.68 4.494222-10.524444 11.52-5.575111 19.569777 4.835556 7.850667 12.088889 8.817778 19.911111 4.323556m-122.311111-115.114667c5.205333-0.256 8.220444-3.413333 10.609778-7.651555 4.920889-8.647111 10.040889-17.208889 14.990222-25.827556 20.48-35.555556 40.931556-71.025778 61.297778-106.609778 5.091556-8.874667 3.015111-16.668444-4.778667-18.517333-7.68-1.848889-10.894222 3.697778-14.051556 9.159111l-68.778666 119.495111c-2.844444 4.977778-6.030222 9.870222-8.305778 15.104-3.128889 7.196444 1.678222 14.648889 9.045333 14.848\",\"p-id\":\"3454\"})],-1)),ks=[ws],ys={key:1,class:\"success icon\"},Fs=Oe(()=>t(\"svg\",{t:\"1632451272305\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2204\",width:\"128\",height:\"128\"},[t(\"path\",{d:\"M1001.305115 275.874141 431.461709 845.718571c-28.221762 28.221762-73.977875 28.221762-102.20066 0L22.661116 539.116591c-28.222785-28.221762-28.222785-73.979922 0-102.20066 28.221762-28.221762 73.977875-28.221762 102.20066 0l255.500115 255.502162 518.743588-518.743588c28.221762-28.221762 73.977875-28.221762 102.199637 0C1029.5279 201.89422 1029.5279 247.65238 1001.305115 275.874141z\",\"p-id\":\"2205\"})],-1)),Es=[Fs],$s={key:2,class:\"error icon\"},Cs=Oe(()=>t(\"svg\",{t:\"1632451325789\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2204\",width:\"128\",height:\"128\"},[t(\"path\",{d:\"M823.04 840.32 524.16 540.16l296.32-294.4c12.8-12.8 12.8-33.28 0-45.44-12.8-12.8-33.28-12.8-46.08 0L478.08 494.08 184.96 200.32c-12.8-12.8-33.28-12.8-45.44 0s-12.8 33.28 0 45.44l292.48 293.76-302.72 300.8c-12.8 12.8-12.8 33.28 0 45.44 12.8 12.8 33.28 12.8 46.08 0l302.72-300.16 299.52 300.16c12.8 12.8 33.28 12.8 45.44 0C835.2 873.6 835.2 853.12 823.04 840.32z\",\"p-id\":\"2205\"})],-1)),Ds=[Cs],Bs={key:3,class:\"warning icon\"},Ys=Oe(()=>t(\"svg\",{t:\"1632451401172\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"1638\",width:\"128\",height:\"128\"},[t(\"path\",{d:\"M512 1021.45211835a60.32985613 60.32985613 0 1 1 60.32985613-60.32985611 60.32985613 60.32985613 0 0 1-60.32985613 60.32985611z m86.85823451-924.97400238L572.32985613 719.80283775a60.32985613 60.32985613 0 0 1-120.65971226 0l-26.52837838-623.32472178c-0.16758294-2.22885301-0.28489098-4.49122263-0.284891-6.78710881a87.14312551 87.14312551 0 0 1 174.28625102 0c0 2.2958862-0.11730806 4.5582558-0.284891 6.78710881z\",\"p-id\":\"1639\"})],-1)),As=[Ys];function Ss(o,n,a,l,u,d){return r(),Z(St,{name:\"el-fade-in-linear\"},{default:V(()=>[u.show?(r(),s(\"div\",{key:0,class:\"toast\",onClick:n[1]||(n[1]=c=>d.Stop())},[a.type==\"loading\"?(r(),s(\"div\",xs,ks)):a.type==\"success\"?(r(),s(\"div\",ys,Es)):a.type==\"error\"?(r(),s(\"div\",$s,Ds)):a.type==\"warning\"?(r(),s(\"div\",Bs,As)):D(\"\",!0),t(\"div\",{class:\"message\",onClick:n[0]||(n[0]=ft(()=>{},[\"stop\"]))},i(d.Message),1)])):D(\"\",!0)]),_:1})}var zs=N(_s,[[\"render\",Ss],[\"__scopeId\",\"data-v-6935a479\"]]);const _e=new Map,oe=o=>{const n=xt(zs,vt(st({},o),{Close:()=>{l()}})),a=document.createElement(\"div\");document.body.append(a),n.mount(a);const l=()=>{a.remove(),_e.get(n._uid)&&_e.delete(n._uid)};return o.type==\"loading\"&&_e.set(n._uid,{Close:l}),(o==null?void 0:o.duration)==0||((o==null?void 0:o.duration)>0?setTimeout(()=>{l()},o==null?void 0:o.duration):setTimeout(()=>{l()},3e3)),{Close:l}},$=o=>oe(o);$.Loading=(o,n)=>oe({type:\"loading\",message:o||\"\\u52A0\\u8F7D\\u4E2D...\",duration:0,countdown:n||0});$.Success=o=>oe({type:\"success\",message:o});$.Error=o=>oe({type:\"error\",message:o,duration:0});$.Warning=o=>oe({type:\"warning\",message:o});$.Message=o=>oe({message:o});$.Clear=()=>{_e.forEach((o,n)=>{o.Close(),_e.delete(n)})};const da=o=>(ut(\"data-v-d72e7026\"),o=o(),ct(),o),Ps=[\"onSubmit\"],Ts={class:\"action-header\"},Is={class:\"action-header_title\"},Ms={class:\"action-body\"},Ls={class:\"disk-info\"},Os=da(()=>t(\"div\",{class:\"disk-info_icon\"},[t(\"svg\",{t:\"1642589762094\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"11301\",width:\"128\",height:\"128\"},[t(\"path\",{d:\"M899.892468 123.889088c0-44.342099-36.286708-80.620486-80.624646-80.620486H204.728017C160.385918 43.268602 124.107532 79.546988 124.107532 123.889088v802.847056c0 44.342099 36.278386 80.620486 80.620485 80.620486h614.539805c44.337938 0 80.624646-36.278386 80.624646-80.620486V123.889088z\",fill:\"#D0D0DB\",\"p-id\":\"11302\"}),t(\"path\",{d:\"M169.8768 977.7772V174.930143c0-44.342099 36.278386-80.620486 80.620486-80.620485h614.539804c9.936092 0 19.426974 1.905666 28.239639 5.23434-11.525534-30.507298-40.996782-52.389169-75.398629-52.389169H203.342457c-44.342099 0-80.620486 36.278386-80.620486 80.620486v802.851217c0 34.410168 21.881871 63.873094 52.385008 75.381985A79.730065 79.730065 0 0 1 169.8768 977.7772z\",fill:\"#FFFFFF\",\"p-id\":\"11303\"}),t(\"path\",{d:\"M820.657543 40.497481H206.117739c-44.342099 0-80.620486 36.278386-80.620486 80.620485v802.847057c0 44.342099 36.278386 80.620486 80.620486 80.620486h614.539804c44.337938 0 80.624646-36.278386 80.624647-80.620486V121.117966c0-44.342099-36.286708-80.620486-80.624647-80.620485z m19.60173 828.785749c0 40.846992-33.43237 74.279362-74.287684 74.279361H199.780776c-40.855313 0-74.279362-33.424048-74.279362-74.279361V129.593603c0-40.855313 33.424048-74.279362 74.279362-74.279362h566.203296c40.842831 0 74.283522 33.424048 74.283522 74.279362l-0.008321 739.689627z\",fill:\"#6E6E96\",\"p-id\":\"11304\"}),t(\"path\",{d:\"M815.106979 1024H200.567175C146.933914 1024 103.303319 980.369405 103.303319 926.736144V123.889088C103.303319 70.255827 146.933914 26.625232 200.567175 26.625232h614.539804c53.633261 0 97.268017 43.630595 97.268017 97.263856v802.847056c0 53.633261-43.634756 97.263856-97.268017 97.263856zM200.567175 59.911972C165.287391 59.911972 136.590059 88.609303 136.590059 123.889088v802.847056c0 35.279784 28.697331 63.977115 63.977116 63.977115h614.539804c35.279784 0 63.981276-28.697331 63.981276-63.977115V123.889088c0-35.279784-28.701492-63.977115-63.981276-63.977116H200.567175z\",fill:\"#6E6E96\",\"p-id\":\"11305\"}),t(\"path\",{d:\"M301.946104 941.515457h429.985632v65.841173H301.946104z\",fill:\"#8A8AA1\",\"p-id\":\"11306\"}),t(\"path\",{d:\"M731.931736 1024H301.946104a16.64337 16.64337 0 0 1-16.64337-16.64337V941.515457a16.64337 16.64337 0 0 1 16.64337-16.64337h429.985632a16.64337 16.64337 0 0 1 16.64337 16.64337v65.841173a16.64337 16.64337 0 0 1-16.64337 16.64337z m-413.342262-33.286741h396.698892v-32.554432H318.589474v32.554432z\",fill:\"#6E6E96\",\"p-id\":\"11307\"}),t(\"path\",{d:\"M337.230049 960.318304h20.804213v47.038326h-20.804213zM386.565159 960.318304h20.804213v47.038326h-20.804213zM435.891948 960.318304h20.804213v47.038326h-20.804213zM485.231219 960.318304h20.804213v47.038326h-20.804213zM534.558008 960.318304h20.804213v47.038326h-20.804213zM583.897279 960.318304h20.804213v47.038326h-20.804213zM633.224068 960.318304h20.804213v47.038326h-20.804213zM682.563339 960.318304h20.804213v47.038326h-20.804213z\",fill:\"#FFE599\",\"p-id\":\"11308\"}),t(\"path\",{d:\"M219.153659 140.794591m-26.874883 0a26.874882 26.874882 0 1 0 53.749765 0 26.874882 26.874882 0 1 0-53.749765 0Z\",fill:\"#ADADD1\",\"p-id\":\"11309\"}),t(\"path\",{d:\"M219.153659 184.312843c-23.995579 0-43.518252-19.522673-43.518253-43.518252s19.522673-43.518252 43.518253-43.518253 43.518252 19.522673 43.518252 43.518253-19.522673 43.518252-43.518252 43.518252z m0-53.749764c-5.642103 0-10.231512 4.589409-10.231512 10.231512s4.589409 10.231512 10.231512 10.231512 10.231512-4.589409 10.231511-10.231512-4.589409-10.231512-10.231511-10.231512z\",fill:\"#6E6E96\",\"p-id\":\"11310\"}),t(\"path\",{d:\"M801.28466 140.794591m-26.870721 0a26.870721 26.870721 0 1 0 53.741442 0 26.870721 26.870721 0 1 0-53.741442 0Z\",fill:\"#ADADD1\",\"p-id\":\"11311\"}),t(\"path\",{d:\"M801.28466 184.308683c-23.995579 0-43.514092-19.518512-43.514091-43.514092s19.518512-43.514092 43.514091-43.514092 43.514092 19.518512 43.514092 43.514092-19.518512 43.514092-43.514092 43.514092z m0-53.741443c-5.637942 0-10.227351 4.589409-10.227351 10.227351s4.589409 10.227351 10.227351 10.227351 10.227351-4.589409 10.227351-10.227351-4.589409-10.227351-10.227351-10.227351z\",fill:\"#6E6E96\",\"p-id\":\"11312\"}),t(\"path\",{d:\"M801.280499 905.23291m-26.870721 0a26.870721 26.870721 0 1 0 53.741443 0 26.870721 26.870721 0 1 0-53.741443 0Z\",fill:\"#ADADD1\",\"p-id\":\"11313\"}),t(\"path\",{d:\"M801.280499 948.747001c-23.995579 0-43.514092-19.518512-43.514091-43.514091s19.518512-43.514092 43.514091-43.514092 43.514092 19.518512 43.514092 43.514092-19.518512 43.514092-43.514092 43.514091z m0-53.741442c-5.637942 0-10.227351 4.589409-10.227351 10.227351s4.589409 10.227351 10.227351 10.227351 10.227351-4.589409 10.227351-10.227351-4.589409-10.227351-10.227351-10.227351z\",fill:\"#6E6E96\",\"p-id\":\"11314\"}),t(\"path\",{d:\"M219.153659 905.23291m-26.870722 0a26.870721 26.870721 0 1 0 53.741443 0 26.870721 26.870721 0 1 0-53.741443 0Z\",fill:\"#ADADD1\",\"p-id\":\"11315\"}),t(\"path\",{d:\"M219.153659 948.747001c-23.995579 0-43.514092-19.518512-43.514092-43.514091s19.518512-43.514092 43.514092-43.514092 43.514092 19.518512 43.514091 43.514092-19.522673 43.514092-43.514091 43.514091z m0-53.741442c-5.637942 0-10.227351 4.589409-10.227351 10.227351s4.589409 10.227351 10.227351 10.227351 10.227351-4.589409 10.227351-10.227351-4.589409-10.227351-10.227351-10.227351z\",fill:\"#6E6E96\",\"p-id\":\"11316\"}),t(\"path\",{d:\"M520.972857 777.43263c-142.542145 0-258.508988-115.971004-258.508988-258.52147a16.64337 16.64337 0 0 1 33.28674 0c0 124.19699 101.033579 225.23473 225.222248 225.23473s225.222248-101.03774 225.222248-225.23473c0-124.188668-101.033579-225.218087-225.222248-225.218087a16.64337 16.64337 0 0 1 0-33.286741c142.542145 0 258.508988 115.966843 258.508988 258.504828 0 142.550466-115.966843 258.521471-258.508988 258.52147z\",fill:\"#6E6E96\",\"p-id\":\"11317\"}),t(\"path\",{d:\"M520.968696 518.919481m-83.312551 0a83.312551 83.312551 0 1 0 166.625102 0 83.312551 83.312551 0 1 0-166.625102 0Z\",fill:\"#A9A9BA\",\"p-id\":\"11318\"}),t(\"path\",{d:\"M520.968696 618.875402c-55.114521 0-99.955921-44.83724-99.955921-99.95176 0-55.118682 44.8414-99.955921 99.955921-99.955921s99.95176 44.8414 99.95176 99.955921c0 55.11036-44.83724 99.95176-99.95176 99.95176z m0-166.625101c-36.761044 0-66.669181 29.908136-66.66918 66.66918s29.908136 66.66502 66.66918 66.66502 66.66502-29.908136 66.66502-66.66502c0-36.761044-29.903976-66.669181-66.66502-66.66918z\",fill:\"#6E6E96\",\"p-id\":\"11319\"}),t(\"path\",{d:\"M301.946104 941.515457h429.985632v36.977408H301.946104z\",fill:\"#6E6E96\",\"p-id\":\"11320\"})])],-1)),Ns={key:0,class:\"disk-info_mount-name\"},Vs={key:1,class:\"disk-info_mount-name\"},Gs={key:0,class:\"label-item\"},js={class:\"label-item_key\"},Us={class:\"label-item_path\"},qs={class:\"label-item\"},Rs={class:\"label-item_key\"},Ws={class:\"label-item_value\"},Hs=[\"disabled\"],Js={key:0,value:\"\"},Zs={value:\"format\"},Ks={key:1,value:\"default\"},Qs={class:\"label-item_value\"},Xs={key:0,class:\"msg\"},td={key:1,class:\"msg\"},ed={class:\"action-footer\"},ad=da(()=>t(\"div\",{class:\"auto\"},null,-1)),od=[\"disabled\"],nd=[\"disabled\"],id={key:1,class:\"action result\"},rd={class:\"action-body\"},sd=da(()=>t(\"div\",{class:\"action-body_icon\"},[t(\"svg\",{t:\"1642063181211\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"5062\",width:\"128\",height:\"128\",\"data-v-cda444e0\":\"\"},[t(\"path\",{d:\"M512 85.333333c235.648 0 426.666667 191.018667 426.666667 426.666667s-191.018667 426.666667-426.666667 426.666667S85.333333 747.648 85.333333 512 276.352 85.333333 512 85.333333z m-74.965333 550.4L346.453333 545.152a42.666667 42.666667 0 1 0-60.330666 60.330667l120.704 120.704a42.666667 42.666667 0 0 0 60.330666 0l301.653334-301.696a42.666667 42.666667 0 1 0-60.288-60.330667l-271.530667 271.488z\",fill:\"#52C41A\",\"p-id\":\"5063\",\"data-v-cda444e0\":\"\"})])],-1)),dd={class:\"action-body_msg\"},ld={key:0,class:\"action-body_info\"},ud={key:1,class:\"action-body_info\"},cd={class:\"btns\"},pd=I({props:{action:String,disk:{type:Object,required:!0},mount:{type:Object},Close:{type:Function},Cancel:{type:Function},Next:{type:Function}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=()=>{n.Close&&n.Close()},d=x=>{x.preventDefault(),n.Cancel&&n.Cancel(),u()},c=x=>{n.Next&&n.Next(x),u()},k=E(!1),g=E(0),p=x=>{g.value=x},m=E(n.action==\"nas\"?\"\":\"format\"),v=E(),b=E(),y=()=>{switch(m.value){case\"format\":F();return;case\"default\":f();return;default:$.Warning(a(\"\\u8BF7\\u9009\\u62E9\\u9009\\u9879\"));return}},f=()=>{let x=\"\";const C=n.mount;if(C!=null&&C.mountPoint!=null&&(x=C.mountPoint),x!=\"\"){c(x);return}$.Warning(a(\"\\u65E0\\u6CD5\\u8BC6\\u522B\\u8DEF\\u5F84\"))},F=()=>{const x=n.disk,C=n.mount;if(C){const S=C.mountPoint||C.path;if(!confirm(a(\"\\u8B66\\u544A\\uFF1A\\u683C\\u5F0F\\u5316\\u4F1A\\u6E05\\u7A7A %{partname} \\u5206\\u533A\\u6570\\u636E\\uFF0C\\u8BF7\\u4F60\\u8C28\\u614E\\u64CD\\u4F5C\",{partname:S||\"\"}))||!confirm(a(\"\\u662F\\u5426\\u786E\\u5B9A\\u683C\\u5F0F\\u5316 %{partname}?\",{partname:S||\"\"})))return;h(C);return}if(x){if(!confirm(a(\"\\u8B66\\u544A\\uFF1A\\u8BE5\\u64CD\\u4F5C\\u5C06\\u521D\\u59CB\\u5316 %{model} \\u786C\\u76D8\\u5E76\\u521B\\u5EFA\\u5206\\u533A\\uFF0C\\u8BF7\\u4F60\\u8C28\\u614E\\u64CD\\u4F5C\",{model:x.venderModel||\"\"}))||!confirm(a(\"\\u662F\\u5426\\u786E\\u5B9A\\u521D\\u59CB\\u5316?\")))return;w(x);return}$.Warning(a(\"\\u65E0\\u6CD5\\u8BC6\\u522B\\u6570\\u636E\"))},w=x=>L(this,null,function*(){if(x.name==null||x.path==\"\"){$.Warning(a(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u8BBE\\u5907\\u540D\\u79F0\"));return}if(x.path==null||x.path==\"\"){$.Warning(a(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u8BBE\\u5907\\u8DEF\\u5F84\"));return}k.value=!0;const C=$.Loading(a(\"\\u521D\\u59CB\\u5316\\u4E2D...\"));try{const S=yield G.Nas.Disk.Init.POST({name:x.name,path:x.path});if(S!=null&&S.data){const{result:A,error:z}=S==null?void 0:S.data;z&&$.Warning(z),A&&(A.errorInfo?$.Warning(A.errorInfo):($.Success(a(\"\\u521D\\u59CB\\u5316\\u6210\\u529F\")),A.childrens&&A.childrens.length>0&&(b.value=A.childrens[0]),v.value=A,p(1)))}}catch(S){$.Error(S)}C.Close(),k.value=!1}),h=x=>L(this,null,function*(){if(x.path==null||x.path==\"\"){$.Warning(a(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u5206\\u533A\\u8DEF\\u5F84\"));return}k.value=!0;const C=$.Loading(a(\"\\u683C\\u5F0F\\u5316\\u4E2D...\"));try{const S=yield G.Nas.Disk.Partition.Format.POST({path:x.path,uuid:x.uuid,mountPoint:x.mountPoint});if(S!=null&&S.data){const{result:A,error:z}=S==null?void 0:S.data;z&&$.Warning(z),A&&($.Success(a(\"\\u683C\\u5F0F\\u5316\\u6210\\u529F\")),b.value=A,p(1))}}catch(S){$.Error(S)}C.Close(),k.value=!1}),_=()=>{if(b.value&&b.value.mountPoint){c(b.value.mountPoint);return}$.Warning(a(\"\\u8BFB\\u53D6\\u7ED3\\u679C\\u5931\\u8D25\"))};return(x,C)=>(r(),Z(wt,{type:1},{default:V(()=>[Y(St,{name:\"rotate\",mode:\"out-in\"},{default:V(()=>{var S;return[g.value==0?(r(),s(\"form\",{key:0,class:\"action format\",onSubmit:ft(y,[\"prevent\"])},[t(\"div\",Ts,[t(\"div\",Is,i(e(a)(\"\\u786C\\u76D8\\u914D\\u7F6E\")),1)]),t(\"div\",Ms,[t(\"div\",Ls,[Os,o.mount?(r(),s(\"div\",Ns,[t(\"span\",null,\"\\u3010\"+i(o.mount.total)+\"\\u3011\",1),t(\"span\",null,i(o.mount.mountPoint||o.mount.path),1)])):o.disk?(r(),s(\"div\",Vs,[t(\"span\",null,\"\\u3010\"+i(o.disk.size)+\"\\u3011\",1),t(\"span\",null,i(o.disk.venderModel),1)])):D(\"\",!0)]),o.mount?(r(),s(\"div\",Gs,[t(\"div\",js,[t(\"span\",null,i(e(a)(\"\\u76EE\\u6807\\u5206\\u533A\")),1)]),t(\"div\",Us,i(o.mount.mountPoint||o.mount.path)+\"\\uFF08\"+i(o.mount.total)+\"\\uFF09\",1)])):D(\"\",!0),t(\"div\",qs,[t(\"div\",Rs,[t(\"span\",null,i(e(a)(\"\\u683C\\u5F0F\\u5316\\u9009\\u9879\")),1)]),t(\"div\",Ws,[O(t(\"select\",{\"onUpdate:modelValue\":C[0]||(C[0]=A=>m.value=A),required:\"\",disabled:o.action==\"disk\"},[o.mount!=null?(r(),s(\"option\",Js,i(e(a)(\"\\u8BF7\\u9009\\u62E9\\u9009\\u9879\")),1)):D(\"\",!0),t(\"option\",Zs,i(e(a)(\"\\u683C\\u5F0F\\u5316\")),1),o.mount!=null?(r(),s(\"option\",Ks,i(e(a)(\"\\u4E0D\\u683C\\u5F0F\\u5316,\\u4F7F\\u7528\\u539F\\u6587\\u4EF6\\u7CFB\\u7EDF\")),1)):D(\"\",!0)],8,Hs),[[pt,m.value]])]),t(\"div\",Qs,[m.value==\"format\"?(r(),s(\"p\",Xs,i(e(a)(\"\\u683C\\u5F0F\\u5316\\u4E3AEXT4\\u6587\\u4EF6\\u7CFB\\u7EDF\")),1)):m.value==\"default\"?(r(),s(\"p\",td)):D(\"\",!0)])])]),t(\"div\",ed,[ad,t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:d,type:\"button\",disabled:k.value},i(e(a)(\"\\u8FD4\\u56DE\")),9,od),t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",disabled:k.value},i(e(a)(\"\\u4E0B\\u4E00\\u6B65\")),9,nd)])],40,Ps)):g.value==1?(r(),s(\"div\",id,[t(\"div\",rd,[sd,t(\"div\",dd,i(e(a)(\"\\u683C\\u5F0F\\u5316\\u6210\\u529F\")),1),v.value?(r(),s(\"div\",ld,[dt(i(e(a)(\"\\u5DF2\\u7ECF\\u6210\\u529F\\u683C\\u5F0F\\u5316\\u78C1\\u76D8\"))+\" \"+i(v.value.venderModel)+\" \"+i(e(a)(\"\\u5E76\\u6302\\u8F7D\\u5230\"))+\" \",1),t(\"a\",null,i((S=b.value)==null?void 0:S.mountPoint),1)])):D(\"\",!0),b.value?(r(),s(\"div\",ud,[dt(i(e(a)(\"\\u5DF2\\u7ECF\\u6210\\u529F\\u521D\\u59CB\\u5316\\u5206\\u533A\"))+\" \",1),t(\"a\",null,i(b.value.mountPoint),1)])):D(\"\",!0),t(\"div\",cd,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",type:\"button\",onClick:_},i(o.action==\"nas\"?e(a)(\"\\u4E0B\\u4E00\\u6B65\"):e(a)(\"\\u5B8C\\u6210\")),1)])])])):D(\"\",!0)]}),_:1})]),_:1}))}});var fd=N(pd,[[\"__scopeId\",\"data-v-d72e7026\"]]),la=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=xt(fd,vt(st({},o),{Close:()=>{l()}}));a.mount(n);const l=()=>{a.unmount(),n.remove()};return{Close:l}};const md=o=>(ut(\"data-v-0d1b6ac8\"),o=o(),ct(),o),gd={class:\"action list\"},vd={class:\"action-header\"},bd={class:\"action-header_title\"},hd={class:\"action-body\"},_d={class:\"disk-list\"},xd={class:\"action-msg\"},wd={href:\"/cgi-bin/luci/admin/system/diskman\"},kd={class:\"action-footer\"},yd=md(()=>t(\"div\",{class:\"auto\"},null,-1)),Fd=I({props:{Cancel:{type:Function},Next:{type:Function},Close:{type:Function}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=E(!0),d=gt({disks:[],raids:[]});(()=>L(this,null,function*(){const f=yield Promise.all([G.Nas.Disk.Status.GET(),G.Raid.List.GET()]);try{if(f[0]){const F=f[0];F!=null&&F.data.result&&(d.disks=(F==null?void 0:F.data.result.disks)||[])}if(f[1]){const F=f[1];F.data.result&&(d.raids=F.data.result.disks||[])}}catch(F){$.Warning(F)}}))();const k=E(),g=E(),p=(f,F)=>{k.value=f,g.value=F},m=()=>{n.Close&&n.Close()},v=()=>{n.Cancel&&n.Cancel(),m()},b=f=>{n.Next&&n.Next(f),m()},y=()=>{if(k.value==null){$.Warning(a(\"\\u8BF7\\u9009\\u62E9\\u76EE\\u6807\\u786C\\u76D8\"));return}if(k.value.childrens!=null&&k.value.childrens.length>0&&g.value==null){$.Warning(a(\"\\u8BF7\\u9009\\u62E9\\u786C\\u76D8\\u5206\\u533A\"));return}if(g.value!=null&&(g.value.mountPoint==null||g.value.mountPoint==\"\")){$.Warning(a(\"\\u8BE5\\u5206\\u533A\\u5C1A\\u672A\\u6302\\u8F7D\\uFF0C\\u8BF7\\u5148\\u53BB\\u6302\\u8F7D\"));return}u.value=!1,la({action:\"nas\",disk:k.value,mount:g.value,Cancel:()=>{u.value=!0},Next:f=>{b(f)}})};return(f,F)=>u.value?(r(),Z(wt,{key:0,type:1},{default:V(()=>[Y(St,{name:\"rotate\",mode:\"out-in\"},{default:V(()=>[t(\"div\",gd,[t(\"div\",vd,[t(\"div\",bd,i(e(a)(\"\\u8BF7\\u9009\\u62E9\\u4E00\\u4E2A\\u786C\\u76D8\\u6216\\u5206\\u533A\")),1)]),t(\"div\",hd,[t(\"div\",_d,[(r(!0),s(U,null,tt(e(d).disks,w=>(r(),Z(ka,{disk:w,onDisk:p,currDisk:k.value,currMountPoint:g.value},null,8,[\"disk\",\"currDisk\",\"currMountPoint\"]))),256)),(r(!0),s(U,null,tt(e(d).raids,w=>(r(),Z(ka,{disk:w,onDisk:p,currDisk:k.value,currMountPoint:g.value},null,8,[\"disk\",\"currDisk\",\"currMountPoint\"]))),256))])]),t(\"div\",xd,[t(\"span\",null,[dt(i(e(a)(\"\\u60F3\\u8981\\u66F4\\u7CBE\\u786E\\u7684\\u914D\\u7F6E\\uFF1F\\u8BF7\\u524D\\u5F80\"))+\" \",1),t(\"a\",wd,i(e(a)(\"\\u9AD8\\u7EA7\\u8BBE\\u7F6E\")),1)])]),t(\"div\",kd,[yd,t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:v,type:\"button\"},i(e(a)(\"\\u8FD4\\u56DE\")),1),t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",onClick:y,type:\"button\"},i(e(a)(\"\\u4E0B\\u4E00\\u6B65\")),1)])])]),_:1})]),_:1})):D(\"\",!0)}});var Ed=N(Fd,[[\"__scopeId\",\"data-v-0d1b6ac8\"]]),$d=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=xt(Ed,vt(st({},o),{Close:()=>{l()}}));a.mount(n);const l=()=>{a.unmount(),n.remove()};return{Close:l}};const Cd=o=>(ut(\"data-v-5f6e53be\"),o=o(),ct(),o),Dd={class:\"action\"},Bd={class:\"action-body\"},Yd=Cd(()=>t(\"div\",{class:\"icon\"},[t(\"svg\",{t:\"1642063181211\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"5062\",width:\"128\",height:\"128\",\"data-v-cda444e0\":\"\"},[t(\"path\",{d:\"M512 85.333333c235.648 0 426.666667 191.018667 426.666667 426.666667s-191.018667 426.666667-426.666667 426.666667S85.333333 747.648 85.333333 512 276.352 85.333333 512 85.333333z m-74.965333 550.4L346.453333 545.152a42.666667 42.666667 0 1 0-60.330666 60.330667l120.704 120.704a42.666667 42.666667 0 0 0 60.330666 0l301.653334-301.696a42.666667 42.666667 0 1 0-60.288-60.330667l-271.530667 271.488z\",fill:\"#52C41A\",\"p-id\":\"5063\",\"data-v-cda444e0\":\"\"})])],-1)),Ad={class:\"title\"},Sd={class:\"info\"},zd=[\"href\"],Pd={class:\"btns\"},Td=I({props:{Close:Function},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=E(\"\"),d=Q(()=>`http://${location.hostname}:${u.value}`);(()=>{G.Nas.Linkease.Enable.POST().then(g=>{var p,m;(p=g==null?void 0:g.data)!=null&&p.result&&(u.value=((m=g.data.result)==null?void 0:m.port)||\"\")})})();const k=()=>{n.Close&&n.Close(),location.reload()};return(g,p)=>(r(),Z(wt,{type:1},{default:V(()=>[Y(St,{name:\"rotate\",mode:\"out-in\"},{default:V(()=>[t(\"div\",Dd,[t(\"div\",Bd,[Yd,t(\"h2\",Ad,i(e(a)(\"\\u670D\\u52A1\\u5DF2\\u542F\\u52A8\")),1),t(\"div\",Sd,[t(\"span\",null,i(e(a)(\"\\u524D\\u5F80\")),1),t(\"a\",{href:e(d),target:\"_blank\",rel:\"noopener noreferrer\"},i(e(d)),9,zd),t(\"span\",null,i(e(a)(\"\\u7EE7\\u7EED\\u914D\\u7F6E\")),1)]),t(\"div\",Pd,[t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",type:\"button\",onClick:k},i(e(a)(\"\\u5173\\u95ED\")),1)])])])]),_:1})]),_:1}))}});var Id=N(Td,[[\"__scopeId\",\"data-v-5f6e53be\"]]),Md=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=xt(Id,vt(st({},o),{Close:()=>{l()}}));a.mount(n);const l=()=>{a.unmount(),n.remove()};return{Close:l}};const Ld=o=>(ut(\"data-v-2eafa10c\"),o=o(),ct(),o),Od=[\"onSubmit\"],Nd={class:\"action-header\"},Vd={class:\"action-header_title\"},Gd={class:\"action-body\"},jd={class:\"label-item\"},Ud={class:\"label-item_key\"},qd={class:\"label-item_value\"},Rd=[\"value\"],Wd={class:\"label-item\"},Hd={class:\"label-item_key\"},Jd={class:\"label-item_value\"},Zd=[\"placeholder\"],Kd={class:\"label-item\"},Qd={class:\"label-item_key\"},Xd={class:\"label-item_value\"},t0={class:\"action-footer\"},e0=Ld(()=>t(\"div\",{class:\"auto\"},null,-1)),a0=[\"disabled\"],o0=[\"disabled\"],n0=I({props:{rootPath:{type:String,required:!0},Close:Function},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=m=>{m.preventDefault(),n.Close&&n.Close()},d=E(!1),c=E({username:\"root\",password:\"\",rootPath:n.rootPath});(()=>L(this,null,function*(){const m=$.Loading(a(\"\\u52A0\\u8F7D\\u4E2D...\"));d.value=!0;try{const v=yield G.Nas.Webdav.Status.GET();if(v!=null&&v.data){const{result:b,error:y}=v.data;if(y){$.Warning(y);return}b&&(b.username&&(c.value.username=b.username),b.password&&(c.value.password=b.password))}}catch(v){$.Error(v)}d.value=!1,m.Close()}))();const g=()=>{const m=c.value;if(m.rootPath==\"\"){$.Warning(a(\"\\u5171\\u4EAB\\u8DEF\\u5F84\\u4E0D\\u80FD\\u4E3A\\u7A7A\"));return}if(m.username==\"\"){$.Warning(a(\"\\u7528\\u6237\\u540D\\u4E0D\\u80FD\\u4E3A\\u7A7A\"));return}if(m.password==\"\"){$.Warning(a(\"\\u5BC6\\u7801\\u4E0D\\u80FD\\u4E3A\\u7A7A\"));return}p(m)},p=m=>L(this,null,function*(){d.value=!0;const v=$.Loading(a(\"\\u521B\\u5EFA\\u4E2D...\"));try{const b=yield G.Nas.Webdav.Create.POST(m);if(b!=null&&b.data){const{error:y,result:f}=b.data;y&&$.Warning(y),f&&($.Success(a(\"\\u521B\\u5EFA\\u6210\\u529F\")),window.setTimeout(()=>{location.reload()},1e3))}}catch(b){$.Error(b)}v.Close(),d.value=!1});return(m,v)=>(r(),Z(wt,{type:1},{default:V(()=>[Y(St,{name:\"rotate\",mode:\"out-in\"},{default:V(()=>[t(\"form\",{class:\"action\",onSubmit:ft(g,[\"prevent\"])},[t(\"div\",Nd,[t(\"div\",Vd,i(e(a)(\"Webdav\\u5171\\u4EAB\\u914D\\u7F6E\")),1)]),t(\"div\",Gd,[t(\"div\",jd,[t(\"div\",Ud,[t(\"span\",null,i(e(a)(\"\\u670D\\u52A1\\u76EE\\u5F55\\u8DEF\\u5F84\")),1)]),t(\"div\",qd,[t(\"input\",{type:\"text\",value:c.value.rootPath,disabled:\"\",required:\"\",style:{backgroundColor:\"#eee\"}},null,8,Rd)])]),t(\"div\",Wd,[t(\"div\",Hd,[t(\"span\",null,i(e(a)(\"\\u7528\\u6237\\u540D\")),1)]),t(\"div\",Jd,[O(t(\"input\",{type:\"text\",required:\"\",placeholder:e(a)(\"\\u8D26\\u53F7\\u7528\\u6237\\u540D\"),\"onUpdate:modelValue\":v[0]||(v[0]=b=>c.value.username=b)},null,8,Zd),[[at,c.value.username,void 0,{trim:!0}]])])]),t(\"div\",Kd,[t(\"div\",Qd,[t(\"span\",null,i(e(a)(\"\\u5BC6\\u7801\")),1)]),t(\"div\",Xd,[O(t(\"input\",{type:\"password\",\"onUpdate:modelValue\":v[1]||(v[1]=b=>c.value.password=b)},null,512),[[at,c.value.password,void 0,{trim:!0}]])])])]),t(\"div\",t0,[e0,t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",type:\"button\",onClick:u,disabled:d.value},i(e(a)(\"\\u5173\\u95ED\")),9,a0),t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",disabled:d.value},i(e(a)(\"\\u521B\\u5EFA\")),9,o0)])],40,Od)]),_:1})]),_:1}))}});var i0=N(n0,[[\"__scopeId\",\"data-v-2eafa10c\"]]),r0=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=xt(i0,vt(st({},o),{Close:()=>{l()}}));a.mount(n);const l=()=>{a.unmount(),n.remove()};return{Close:l}};const s0={},d0={width:\"14px\",height:\"14px\",viewBox:\"0 0 14 14\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},l0=t(\"g\",{id:\"icon_alert\",stroke:\"none\",\"stroke-width\":\"1\",fill:\"none\",\"fill-rule\":\"evenodd\"},[t(\"g\",{id:\"Icon/Warning\"},[t(\"rect\",{id:\"\\u77E9\\u5F62\",fill:\"#000000\",\"fill-rule\":\"nonzero\",opacity:\"0\",x:\"0\",y:\"0\",width:\"14\",height:\"14\"}),t(\"path\",{d:\"M7,0.875 C3.61757813,0.875 0.875,3.61757813 0.875,7 C0.875,10.3824219 3.61757813,13.125 7,13.125 C10.3824219,13.125 13.125,10.3824219 13.125,7 C13.125,3.61757813 10.3824219,0.875 7,0.875 Z M6.5625,4.046875 C6.5625,3.98671875 6.61171875,3.9375 6.671875,3.9375 L7.328125,3.9375 C7.38828125,3.9375 7.4375,3.98671875 7.4375,4.046875 L7.4375,7.765625 C7.4375,7.82578125 7.38828125,7.875 7.328125,7.875 L6.671875,7.875 C6.61171875,7.875 6.5625,7.82578125 6.5625,7.765625 L6.5625,4.046875 Z M7,10.0625 C6.63769531,10.0625 6.34375,9.76855469 6.34375,9.40625 C6.34375,9.04394531 6.63769531,8.75 7,8.75 C7.36230469,8.75 7.65625,9.04394531 7.65625,9.40625 C7.65625,9.76855469 7.36230469,10.0625 7,10.0625 Z\",id:\"\\u5F62\\u72B6\",fill:\"#FAAD14\"})])],-1),u0=[l0];function c0(o,n){return r(),s(\"svg\",d0,u0)}var It=N(s0,[[\"render\",c0]]);const{$gettext:be,$ngettext:Ye}=Me(),p0=o=>{},f0=()=>new Date().getTime(),m0=o=>{if(o<1e3)return`${o} B`;let a=1e3,l=0;for(let c=o/1e3;c>=1e3;c/=1e3)a*=1e3,l++;let u=[\" KB\",\" MB\",\" GB\",\" TB\",\" PB\",\" EB\"];return(o/100/(a/100)).toFixed(1)+u[l]},g0=o=>{if(o==null)return 0;if(o<1e4)return o;let a=parseInt(`${o/1e4}`),l=o%1e4;return`${a}\\u4E07${l}`},v0=o=>{if(o)try{var n=new Date(o),a=n.getHours(),l=n.getMinutes(),u=n.getSeconds();return a<10&&(a=`0${a}`),l<10&&(l=`0${l}`),u<10&&(u=`0${u}`),`${a}:${l}:${u}`}catch(d){}return\"\"},b0=o=>{if(o){let n=Math.floor(o/86400),a=Math.floor(o/3600)%24,l=Math.floor(o/60)%60,u=o%60;return(n>0?Ye(\"%{ days }\\u5929\",\"%{ days }\\u5929\",n,{days:De(n)}):\"\")+Ye(\"%{ hours }\\u5C0F\\u65F6\",\"%{ hours }\\u5C0F\\u65F6\",a,{hours:De(a)})+Ye(\"%{ minutes }\\u5206\",\"%{ minutes }\\u5206\",l,{minutes:De(l)})+Ye(\"%{ seconds }\\u79D2\",\"%{ seconds }\\u79D2\",u,{seconds:De(u)})}},h0=o=>/^\\d+\\.\\d+\\.\\d+\\.\\d+$/.test(o),_0=o=>o.length<3?be(\"\\u7528\\u6237\\u540D\\u592A\\u77ED\"):o.toLowerCase()!=o?be(\"\\u7528\\u6237\\u540D\\u53EA\\u80FD\\u4E3A\\u5C0F\\u5199\"):new RegExp(\"^\\\\d\").exec(o)?be(\"\\u7528\\u6237\\u540D\\u4E0D\\u80FD\\u4EE5\\u6570\\u5B57\\u5F00\\u5934\"):new RegExp(\"^_\").exec(o)?be(\"\\u7528\\u6237\\u540D\\u4E0D\\u80FD\\u4EE5_\\u5F00\\u5934\"):new RegExp(\"^[a-z0-9_]+$\").exec(o)?!0:be(\"\\u975E\\u6CD5\\u7684\\u7528\\u6237\\u540D\"),x0=(o,n)=>{let a=!0,l=null;const u=()=>{l=null,a&&o().finally(()=>{a&&(l=setTimeout(u,n))})};return l=setTimeout(u,0),()=>{a=!1,l!=null&&clearTimeout(l)}};var w0=Object.freeze(Object.defineProperty({__proto__:null,formatDate:p0,UnixDate:f0,byteToSize:m0,numberToSum:g0,dateForm:v0,stampForm:b0,checkIsIP:h0,checkSmabaUserName:_0,easyInterval:x0},Symbol.toStringTag,{value:\"Module\"})),Mt=st({},w0);const k0=o=>(ut(\"data-v-58844394\"),o=o(),ct(),o),y0=[\"onSubmit\"],F0={class:\"action-header\"},E0={class:\"action-header_title\"},$0={class:\"action-body\"},C0={class:\"label-item\"},D0={class:\"label-item_key\"},B0={class:\"label-item_value\"},Y0=[\"value\"],A0={class:\"label-item\"},S0={class:\"label-item_key\"},z0={class:\"label-item_value\"},P0=[\"placeholder\"],T0={class:\"label-item\"},I0={class:\"label-item_key\"},M0={class:\"label-item_value\"},L0=[\"placeholder\"],O0={class:\"label-item\"},N0={class:\"label-item_key\"},V0={class:\"label-item_value\"},G0={class:\"samba-item\"},j0={class:\"samba-item_allow\"},U0={for:\"allow\",class:\"samba-allow\"},q0={class:\"samba-item_tips\"},R0={class:\"tooltip-trigger\"},W0={class:\"samba_tip\"},H0={class:\"samba_dir_tip\"},J0={class:\"action-footer\"},Z0=k0(()=>t(\"div\",{class:\"auto\"},null,-1)),K0=[\"disabled\"],Q0=[\"disabled\"],X0=I({props:{rootPath:{type:String,required:!0},Close:Function},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=p=>{p.preventDefault(),n.Close&&n.Close()},d=E(!1),c=E({shareName:\"\",username:\"\",password:\"\",rootPath:n.rootPath,allowLegacy:!1}),k=()=>{const p=c.value;if(p.rootPath==\"\"){$.Warning(a(\"\\u5171\\u4EAB\\u8DEF\\u5F84\\u4E0D\\u80FD\\u4E3A\\u7A7A\"));return}if(p.shareName==\"\"){$.Warning(a(\"\\u5171\\u4EAB\\u540D\\u79F0\\u4E0D\\u80FD\\u4E3A\\u7A7A\"));return}if(p.username==\"\"){$.Warning(a(\"\\u7528\\u6237\\u540D\\u4E0D\\u80FD\\u4E3A\\u7A7A\"));return}if(p.password==\"\"){$.Warning(a(\"\\u5BC6\\u7801\\u4E0D\\u80FD\\u4E3A\\u7A7A\"));return}const m=Mt.checkSmabaUserName(p.username);if(m!==!0){$.Warning(`${m}`);return}g(p)},g=p=>L(this,null,function*(){d.value=!0;const m=$.Loading(a(\"\\u521B\\u5EFA\\u4E2D...\"));try{const v=yield G.Nas.Samba.Create.POST(p);if(v!=null&&v.data){const{error:b,result:y}=v.data;b&&$.Warning(b),y&&($.Success(a(\"\\u521B\\u5EFA\\u6210\\u529F\")),window.setTimeout(()=>{location.reload()},1e3))}}catch(v){$.Error(v)}m.Close(),d.value=!1});return(p,m)=>(r(),Z(wt,{type:1},{default:V(()=>[Y(St,{name:\"rotate\",mode:\"out-in\"},{default:V(()=>[t(\"form\",{class:\"action\",onSubmit:ft(k,[\"prevent\"])},[t(\"div\",F0,[t(\"div\",E0,i(e(a)(\"Samba\\u5171\\u4EAB\\u914D\\u7F6E\")),1)]),t(\"div\",$0,[t(\"div\",C0,[t(\"div\",D0,[t(\"span\",null,i(e(a)(\"\\u670D\\u52A1\\u76EE\\u5F55\\u8DEF\\u5F84\")),1)]),t(\"div\",B0,[t(\"input\",{type:\"text\",value:c.value.rootPath,disabled:\"\",required:\"\",style:{backgroundColor:\"#eee\"}},null,8,Y0)])]),t(\"div\",A0,[t(\"div\",S0,[t(\"span\",null,i(e(a)(\"\\u5171\\u4EAB\\u540D\\uFF08\\u5EFA\\u8BAE\\u4F7F\\u7528\\u82F1\\u6587\\u5B57\\u6BCD\\uFF09\")),1)]),t(\"div\",z0,[O(t(\"input\",{type:\"text\",\"onUpdate:modelValue\":m[0]||(m[0]=v=>c.value.shareName=v),required:\"\",placeholder:e(a)(\"\\u5171\\u4EAB\\u540D\\u79F0\")},null,8,P0),[[at,c.value.shareName,void 0,{trim:!0}]])])]),t(\"div\",T0,[t(\"div\",I0,[t(\"span\",null,i(e(a)(\"\\u7528\\u6237\\u540D\")),1)]),t(\"div\",M0,[O(t(\"input\",{type:\"text\",required:\"\",placeholder:e(a)(\"\\u8D26\\u53F7\\u7528\\u6237\\u540D\"),\"onUpdate:modelValue\":m[1]||(m[1]=v=>c.value.username=v)},null,8,L0),[[at,c.value.username,void 0,{trim:!0}]])])]),t(\"div\",O0,[t(\"div\",N0,[t(\"span\",null,i(e(a)(\"\\u5BC6\\u7801\")),1)]),t(\"div\",V0,[O(t(\"input\",{type:\"password\",\"onUpdate:modelValue\":m[2]||(m[2]=v=>c.value.password=v)},null,512),[[at,c.value.password,void 0,{trim:!0}]])])]),t(\"div\",G0,[t(\"div\",j0,[O(t(\"input\",{type:\"checkbox\",id:\"allow\",\"onUpdate:modelValue\":m[3]||(m[3]=v=>c.value.allowLegacy=v)},null,512),[[Rt,c.value.allowLegacy]]),t(\"label\",U0,i(e(a)(\"\\u5141\\u8BB8\\u65E7\\u534F\\u8BAE\\u4E0E\\u8EAB\\u4EFD\\u9A8C\\u8BC1(\\u4E0D\\u5B89\\u5168)\")),1)]),t(\"div\",q0,[t(\"span\",R0,[t(\"span\",W0,[Y(It)]),t(\"span\",H0,i(e(a)(\"\\u517C\\u5BB9\\u4E00\\u4E9B\\u7535\\u89C6\\u6216\\u8005\\u7535\\u89C6\\u76D2\\u5B50\")),1)])])])]),t(\"div\",J0,[Z0,t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",type:\"button\",onClick:u,disabled:d.value},i(e(a)(\"\\u5173\\u95ED\")),9,K0),t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",disabled:d.value},i(e(a)(\"\\u521B\\u5EFA\")),9,Q0)])],40,y0)]),_:1})]),_:1}))}});var tl=N(X0,[[\"__scopeId\",\"data-v-58844394\"]]),el=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=xt(tl,vt(st({},o),{Close:()=>{l()}}));a.mount(n);const l=()=>{a.unmount(),n.remove()};return{Close:l}};const{$gettext:te,$ngettext:pT}=Me(),zt={installApp:(o,n)=>new Promise((a,l)=>{let u=0;G.App.Install.POST({name:o}).then(()=>{const d=setTimeout(()=>{u==0&&(u=1,a(!1))},(n||60)*1e3),c=()=>{u==0&&G.App.Check.POST({name:o}).then(k=>{if(u==0&&k!=null&&k.data){const{result:g}=k.data;if((g==null?void 0:g.status)==\"installed\"){clearTimeout(d),u=1,a(!0);return}}}).catch(k=>{}).finally(()=>{u==0&&setTimeout(c,3e3)})};setTimeout(c,3e3)}).catch(d=>{u==0&&(u=1,l(te(\"\\u5B89\\u88C5\\u5931\\u8D25\\uFF0C\")+d))})}),checkAndInstallApp:(o,n,a)=>L(ae,null,function*(){let l=$.Loading(te(\"\\u68C0\\u67E5\\u4E2D...\"));try{const u=yield G.App.Check.POST({name:o});if(l.Close(),u!=null&&u.data){const{result:d,error:c}=u.data;if(c)$.Warning(c);else if(d){if(d.status==\"installed\")return!0;if(confirm(te(\"\\u68C0\\u6D4B\\u5230\\u4F60\\u5C1A\\u672A\\u5B89\\u88C5 %{name} \\u63D2\\u4EF6,\\u662F\\u5426\\u5B89\\u88C5\\uFF1F\",{name:n}))){l=$.Loading(te(\"\\u6B63\\u5728\\u5B89\\u88C5\\u4E2D...\"));const k=yield zt.installApp(a||o);if(l.Close(),k)return!0;$.Error(te(\"\\u5B89\\u88C5\\u5931\\u8D25\\u6216\\u8D85\\u65F6\\uFF0C\\u8BF7\\u68C0\\u67E5\\u8F6F\\u4EF6\\u6E90\\u6216\\u7A0D\\u5019\\u91CD\\u8BD5\"))}}else $.Warning(te(\"\\u68C0\\u67E5\\u63D2\\u4EF6\\u72B6\\u6001\\u5931\\u8D25\"))}return!1}catch(u){return l.Close(),$.Warning(u),!1}}),installAndGo:(o,n,a,l)=>L(ae,null,function*(){(yield zt.checkAndInstallApp(o,n,l))&&(location.href=a)})},Qt=o=>!Array.isArray(window.quickstart_features)||window.quickstart_features.indexOf(o)!=-1,al={key:0,class:\"action\"},ol={class:\"title\"},nl={class:\"desc\"},il={value:\"linkease\"},rl={value:\"samba\"},sl={value:\"webdav\"},dl=[\"innerHTML\"],ll={class:\"btns\"},ul=[\"disabled\"],cl=I({props:{setup:Number,Close:{type:Function,required:!0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=E(!0),d=E(\"linkease\"),c=E(!1),k=E(n.setup||0),g=()=>{n.Close&&n.Close()},p=()=>L(this,null,function*(){switch(d.value){case\"webdav\":yield m();break;case\"samba\":yield b();break;case\"linkease\":yield v();break}}),m=()=>L(this,null,function*(){c.value=!0,(yield zt.checkAndInstallApp(\"app-meta-gowebdav\",\"GoWebdav\"))&&y(),c.value=!1}),v=()=>L(this,null,function*(){c.value=!0,(yield zt.checkAndInstallApp(\"linkease\",a(\"\\u6613\\u6709\\u4E91\"),\"app-meta-linkease\"))&&f(),c.value=!1}),b=()=>L(this,null,function*(){c.value=!0;const h=$.Loading(a(\"\\u914D\\u7F6E\\u4E2D...\"));y(),h.Close(),c.value=!1}),y=()=>{c.value=!1,u.value=!1,$d({Cancel:()=>{u.value=!0},Next:h=>{switch(d.value){case\"webdav\":F(h);break;case\"samba\":w(h);break}}})},f=()=>{Md({}),g()},F=h=>{r0({rootPath:h}),g()},w=h=>{el({rootPath:h}),g()};return(h,_)=>u.value?(r(),Z(wt,{key:0,Close:o.Close,type:1},{default:V(()=>[Y(St,{name:\"rotate\",mode:\"out-in\"},{default:V(()=>[k.value==0?(r(),s(\"div\",al,[t(\"h2\",ol,i(e(a)(\"\\u6B22\\u8FCE\\u4F7F\\u7528 NAS \\u914D\\u7F6E\\u5411\\u5BFC\")),1),t(\"h3\",nl,i(e(a)(\"\\u8BF7\\u9009\\u62E9\\u9700\\u8981\\u6DFB\\u52A0\\u7684NAS\\u670D\\u52A1\")),1),t(\"form\",null,[t(\"label\",null,[O(t(\"select\",{\"onUpdate:modelValue\":_[0]||(_[0]=x=>d.value=x)},[t(\"option\",il,i(e(a)(\"\\u8DE8\\u8BBE\\u5907\\u5171\\u4EAB\\uFF08\\u6613\\u6709\\u4E91\\uFF09\")),1),t(\"option\",rl,i(e(a)(\"\\u5C40\\u57DF\\u7F51\\u6587\\u4EF6\\u5171\\u4EAB\\uFF08Samba\\uFF09\")),1),t(\"option\",sl,i(e(a)(\"\\u5C40\\u57DF\\u7F51\\u6587\\u4EF6\\u5171\\u4EAB\\uFF08WebDAV\\uFF09\")),1)],512),[[pt,d.value]])])]),e(Qt)(\"unishare\")?(r(),s(\"div\",{key:0,class:\"tips\",innerHTML:e(a)(\"\\u5982\\u9700\\u5BF9 Samba \\u6216 WebDAV \\u8FDB\\u884C\\u66F4\\u7EC6\\u81F4\\u7684\\u6743\\u9650\\u63A7\\u5236\\uFF0C\\u8BF7\\u4F7F\\u7528\\u201C%{unishare}\\u201D\",{unishare:'<a href=\"/cgi-bin/luci/admin/nas/unishare\">'+e(a)(\"\\u7EDF\\u4E00\\u6587\\u4EF6\\u5171\\u4EAB\")+\"</a>\"},!0)},null,8,dl)):D(\"\",!0),t(\"div\",ll,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",onClick:p,type:\"button\",disabled:c.value},i(e(a)(\"\\u4E0B\\u4E00\\u6B65\")),9,ul),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:g,type:\"button\"},i(e(a)(\"\\u53D6\\u6D88\")),1)])])):D(\"\",!0)]),_:1})]),_:1},8,[\"Close\"])):D(\"\",!0)}});var pl=N(cl,[[\"__scopeId\",\"data-v-1d64dea6\"]]),Wa=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=xt(pl,vt(st({},o),{Close:()=>{l()}}));a.mount(n);const l=()=>{a.unmount(),n.remove()};return{Close:l}};const fl={class:\"app-container_aria2\"},ml={class:\"aria2-item\"},gl={class:\"aria2-item_name\"},vl={class:\"aria2-item_value\"},bl={key:0,class:\"configure\"},hl={key:1,class:\"configure enabel\"},_l={class:\"aria2-item\"},xl={class:\"aria2-item_name\"},wl={class:\"aria2-item_value\"},kl=[\"href\"],yl={class:\"aria2-item\"},Fl={class:\"aria2-item_name\"},El={class:\"aria2-item_value\"},$l=[\"href\"],Cl={class:\"aria2-item\"},Dl={class:\"aria2-item_name right\"},Bl={class:\"aria2-item_value\"},Yl=[\"href\"],Al={class:\"use-url_app\"},Sl={href:\"https://doc.linkease.com/zh/guide/linkease_app/tutorial.html#%E8%BF%9C%E7%A8%8B%E4%B8%8B%E8%BD%BD\",target:\"_blank\"},zl=I({props:{aria2:{type:Object}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=Q(()=>{var c;return`${location.origin}${(c=n.aria2)==null?void 0:c.webPath}`}),d=Q(()=>{var g,p,m;let c=(g=n.aria2)==null?void 0:g.rpcToken;c?c=encodeURIComponent(btoa(c)):c=\"\";const k=encodeURIComponent(location.hostname);return`${location.origin}${(p=n.aria2)==null?void 0:p.webPath}/#!/settings/rpc/set/http/${k}/${(m=n.aria2)==null?void 0:m.rpcPort}/jsonrpc/${c}`});return(c,k)=>{var g,p,m,v;return r(),s(\"ul\",fl,[t(\"li\",ml,[t(\"div\",gl,[t(\"span\",null,i(e(a)(\"\\u5F53\\u524D\\u72B6\\u6001:\")),1)]),t(\"div\",vl,[((g=o.aria2)==null?void 0:g.status)==\"running\"?(r(),s(\"span\",bl,i(e(a)(\"\\u5DF2\\u542F\\u52A8\")),1)):(r(),s(\"span\",hl,i(e(a)(\"\\u672A\\u542F\\u52A8\")),1))])]),((p=o.aria2)==null?void 0:p.status)==\"running\"?(r(),s(U,{key:0},[t(\"li\",_l,[t(\"div\",xl,[t(\"span\",null,i(e(a)(\"\\u4E0B\\u8F7D\\u76EE\\u5F55:\")),1)]),t(\"div\",wl,[t(\"a\",{target:\"_blank\",href:\"/cgi-bin/luci/admin/services/linkease/file/?path=/root\"+((m=o.aria2)==null?void 0:m.downloadPath)},i((v=o.aria2)==null?void 0:v.downloadPath),9,kl)])]),t(\"li\",yl,[t(\"div\",Fl,[t(\"span\",null,i(e(a)(\"\\u7F51\\u7EDC\\u5730\\u5740:\")),1)]),t(\"div\",El,[t(\"a\",{href:e(u),target:\"_blank\",rel:\"noopener noreferrer\"},i(e(u)),9,$l)])]),t(\"li\",Cl,[t(\"div\",Dl,[t(\"span\",null,i(e(a)(\"\\u8BA4\\u8BC1\\u5931\\u8D25\\uFF1F\")),1)]),t(\"div\",Bl,[t(\"a\",{href:e(d),target:\"_blank\",rel:\"noopener noreferrer\"},i(e(a)(\"\\u70B9\\u6B64\\u81EA\\u52A8\\u914D\\u7F6E AriaNg\")),9,Yl)])])],64)):D(\"\",!0),t(\"div\",Al,[t(\"a\",Sl,i(e(a)(\"\\u4F7F\\u7528\\u6613\\u6709\\u4E91APP\\uFF0C\\u968F\\u65F6\\u968F\\u5730\\u8FDC\\u7A0B\\u4E0B\\u8F7D\")),1)])])}}});var Pl=N(zl,[[\"__scopeId\",\"data-v-27ba49f9\"]]);const Tl={class:\"app-container_qbittorrent\"},Il={class:\"qbittorrent-item\"},Ml={class:\"qbittorrent-item_name\"},Ll={class:\"qbittorrent-item_value\"},Ol={key:0,class:\"configure\"},Nl={key:1,class:\"configure enabel\"},Vl={class:\"qbittorrent-item\"},Gl={class:\"qbittorrent-item_name\"},jl={class:\"qbittorrent-item_value\"},Ul=[\"href\"],ql={class:\"qbittorrent-item\"},Rl={class:\"qbittorrent-item_name\"},Wl={class:\"qbittorrent-item_value\"},Hl=[\"href\"],Jl={class:\"qbittorrent-item\"},Zl={class:\"qbittorrent-item_name right\"},Kl={class:\"qbittorrent-item_value\"},Ql=I({props:{qbittorrent:{type:Object}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=Q(()=>{var d;return`http://${location.hostname}${(d=n.qbittorrent)==null?void 0:d.webPath}`});return(d,c)=>{var k,g,p,m;return r(),s(\"ul\",Tl,[t(\"li\",Il,[t(\"div\",Ml,[t(\"span\",null,i(e(a)(\"\\u5F53\\u524D\\u72B6\\u6001:\")),1)]),t(\"div\",Ll,[((k=o.qbittorrent)==null?void 0:k.status)==\"running\"?(r(),s(\"span\",Ol,i(e(a)(\"\\u5DF2\\u542F\\u52A8\")),1)):(r(),s(\"span\",Nl,i(e(a)(\"\\u672A\\u542F\\u52A8\")),1))])]),((g=o.qbittorrent)==null?void 0:g.status)==\"running\"?(r(),s(U,{key:0},[t(\"li\",Vl,[t(\"div\",Gl,[t(\"span\",null,i(e(a)(\"\\u4E0B\\u8F7D\\u76EE\\u5F55:\")),1)]),t(\"div\",jl,[t(\"a\",{target:\"_blank\",href:\"/cgi-bin/luci/admin/services/linkease/file/?path=/root\"+((p=o.qbittorrent)==null?void 0:p.downloadPath)},i((m=o.qbittorrent)==null?void 0:m.downloadPath),9,Ul)])]),t(\"li\",ql,[t(\"div\",Rl,[t(\"span\",null,i(e(a)(\"\\u7F51\\u7EDC\\u5730\\u5740:\")),1)]),t(\"div\",Wl,[t(\"a\",{href:e(u),target:\"_blank\",rel:\"noopener noreferrer\"},i(e(u)),9,Hl)])]),t(\"li\",Jl,[t(\"div\",Zl,[t(\"span\",null,i(e(a)(\"\\u9ED8\\u8BA4\\u7528\\u6237\\u540D\\uFF1A\"))+\"admin\",1)]),t(\"div\",Kl,[t(\"span\",null,i(e(a)(\"\\u9ED8\\u8BA4\\u5BC6\\u7801\\uFF1A\"))+\"adminadmin\",1)])])],64)):D(\"\",!0)])}}});var Xl=N(Ql,[[\"__scopeId\",\"data-v-da46870e\"]]);const tu={class:\"app-container_transmission\"},eu={class:\"transmission-item\"},au={class:\"transmission-item_name\"},ou={class:\"transmission-item_value\"},nu={key:0,class:\"configure\"},iu={key:1,class:\"configure enabel\"},ru={class:\"transmission-item\"},su={class:\"transmission-item_name\"},du={class:\"transmission-item_value\"},lu=[\"href\"],uu={class:\"transmission-item\"},cu={class:\"transmission-item_name\"},pu={class:\"transmission-item_value\"},fu=[\"href\"],mu=I({props:{transmission:{type:Object}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=Q(()=>{var d;return`http://${location.hostname}${(d=n.transmission)==null?void 0:d.webPath}`});return(d,c)=>{var k,g,p,m;return r(),s(\"ul\",tu,[t(\"li\",eu,[t(\"div\",au,[t(\"span\",null,i(e(a)(\"\\u5F53\\u524D\\u72B6\\u6001:\")),1)]),t(\"div\",ou,[((k=o.transmission)==null?void 0:k.status)==\"running\"?(r(),s(\"span\",nu,i(e(a)(\"\\u5DF2\\u542F\\u52A8\")),1)):(r(),s(\"span\",iu,i(e(a)(\"\\u672A\\u542F\\u52A8\")),1))])]),((g=o.transmission)==null?void 0:g.status)==\"running\"?(r(),s(U,{key:0},[t(\"li\",ru,[t(\"div\",su,[t(\"span\",null,i(e(a)(\"\\u4E0B\\u8F7D\\u76EE\\u5F55:\")),1)]),t(\"div\",du,[t(\"a\",{target:\"_blank\",href:\"/cgi-bin/luci/admin/services/linkease/file/?path=/root\"+((p=o.transmission)==null?void 0:p.downloadPath)},i((m=o.transmission)==null?void 0:m.downloadPath),9,lu)])]),t(\"li\",uu,[t(\"div\",cu,[t(\"span\",null,i(e(a)(\"\\u7F51\\u7EDC\\u5730\\u5740:\")),1)]),t(\"div\",pu,[t(\"a\",{href:e(u),target:\"_blank\",rel:\"noopener noreferrer\"},i(e(u)),9,fu)])])],64)):D(\"\",!0)])}}});var gu=N(mu,[[\"__scopeId\",\"data-v-562f4f7e\"]]);const vu={},bu={width:\"14px\",height:\"14px\",viewBox:\"0 0 14 14\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},hu=t(\"path\",{d:\"M7,0.875 C3.61757813,0.875 0.875,3.61757813 0.875,7 C0.875,10.3824219 3.61757813,13.125 7,13.125 C10.3824219,13.125 13.125,10.3824219 13.125,7 C13.125,3.61757813 10.3824219,0.875 7,0.875 Z M6.5625,4.046875 C6.5625,3.98671875 6.61171875,3.9375 6.671875,3.9375 L7.328125,3.9375 C7.38828125,3.9375 7.4375,3.98671875 7.4375,4.046875 L7.4375,7.765625 C7.4375,7.82578125 7.38828125,7.875 7.328125,7.875 L6.671875,7.875 C6.61171875,7.875 6.5625,7.82578125 6.5625,7.765625 L6.5625,4.046875 Z M7,10.0625 C6.63769531,10.0625 6.34375,9.76855469 6.34375,9.40625 C6.34375,9.04394531 6.63769531,8.75 7,8.75 C7.36230469,8.75 7.65625,9.04394531 7.65625,9.40625 C7.65625,9.76855469 7.36230469,10.0625 7,10.0625 Z\",id:\"\\u5F62\\u72B6\",\"fill-opacity\":\"0.65\"},null,-1),_u=[hu];function xu(o,n){return r(),s(\"svg\",bu,_u)}var Jt=N(vu,[[\"render\",xu]]);const wu={},ku={width:\"82px\",height:\"82px\",viewBox:\"0 0 82 82\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},yu=jt('<g id=\"icon_finished\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"><g id=\"circle\" transform=\"translate(2.000000, 2.000000)\"><circle id=\"Oval\" stroke=\"#553AFE\" stroke-width=\"4\" cx=\"39\" cy=\"39\" r=\"39\"></circle><circle id=\"Oval\" fill=\"#553AFE\" cx=\"39.028463\" cy=\"39.028463\" r=\"35.028463\"></circle><path d=\"M41.0148619,52.8014169 C39.924327,53.7754409 39.8138203,55.4674462 40.7680384,56.5806164 C41.7222564,57.6937867 43.3798562,57.8065871 44.4703911,56.8325631 L54.9654709,47.4587599 C56.1301083,46.4185505 56.1643255,44.5807064 55.0392485,43.4960788 L31.4253189,20.7311283 C30.3718273,19.7155123 28.7112257,19.7639428 27.7162614,20.8393009 C26.7212971,21.914659 26.7687429,23.6097284 27.8222345,24.6253444 L49.3379698,45.3675358 L41.0148619,52.8014169 Z\" id=\"Shape\" fill=\"#FFFFFF\" fill-rule=\"nonzero\" transform=\"translate(41.430740, 38.747628) rotate(-270.000000) translate(-41.430740, -38.747628) \"></path></g></g>',1),Fu=[yu];function Eu(o,n){return r(),s(\"svg\",ku,Fu)}var ua=N(wu,[[\"render\",Eu]]);const Ne=o=>(ut(\"data-v-7b328460\"),o=o(),ct(),o),$u={key:0,class:\"action\"},Cu={class:\"title\"},Du={class:\"load_service input_row\"},Bu={class:\"left\"},Yu={class:\"radios\"},Au=Ne(()=>t(\"label\",{for:\"Aria2\"},\"Aria2\",-1)),Su={class:\"radios\"},zu=Ne(()=>t(\"label\",{for:\"qB\"},\"qBittorrent\",-1)),Pu={class:\"radios\"},Tu=Ne(()=>t(\"label\",{for:\"Tr\"},\"Transmission\",-1)),Iu=[\"onSubmit\"],Mu={class:\"input_row\"},Lu={class:\"left\"},Ou={class:\"tooltip-trigger\"},Nu={class:\"tooltip-text tooltip-top\"},Vu={class:\"dowload_dir_tip\"},Gu={class:\"myinput_wrap\"},ju={class:\"input_row\"},Uu={class:\"left\"},qu={class:\"tooltip-trigger\"},Ru={class:\"tooltip-text tooltip-top\"},Wu={class:\"dowload_dir_tip\"},Hu={class:\"myinput_wrap\"},Ju={class:\"input_row\"},Zu={class:\"left\"},Ku={class:\"tooltip-trigger\"},Qu={class:\"tooltip-text tooltip-bottom\"},Xu={class:\"dowload_rpc_tip\"},tc=[\"placeholder\"],ec={class:\"input_row\"},ac={class:\"\"},oc={class:\"radios\"},nc={for:\"default\"},ic={class:\"radios\"},rc={for:\"add\"},sc={class:\"input_row\"},dc=Ne(()=>t(\"div\",{class:\"left\"},null,-1)),lc={class:\"myinput_wrap Tracker_input\"},uc=[\"placeholder\"],cc=[\"onSubmit\"],pc={class:\"input_row\"},fc={class:\"left\"},mc={class:\"tooltip-trigger\"},gc={class:\"tooltip-text tooltip-top\"},vc={class:\"dowload_dir_tip\"},bc={class:\"myinput_wrap\"},hc={class:\"input_row\"},_c={class:\"left\"},xc={class:\"tooltip-trigger\"},wc={class:\"tooltip-text tooltip-top\"},kc={class:\"dowload_dir_tip\"},yc={class:\"myinput_wrap\"},Fc=[\"onSubmit\"],Ec={class:\"input_row\"},$c={class:\"left\"},Cc={class:\"tooltip-trigger\"},Dc={class:\"tooltip-text tooltip-top\"},Bc={class:\"dowload_dir_tip\"},Yc={class:\"myinput_wrap\"},Ac={class:\"input_row\"},Sc={class:\"left\"},zc={class:\"tooltip-trigger\"},Pc={class:\"tooltip-text tooltip-top\"},Tc={class:\"dowload_dir_tip\"},Ic={class:\"myinput_wrap\"},Mc={class:\"btns\"},Lc={key:1,class:\"action\"},Oc={class:\"title\"},Nc={class:\"finished\"},Vc={class:\"successed\"},Gc={class:\"btns\"},jc=I({props:{services:{type:Object,required:!0},partitionList:{type:Array,required:!0},defaultTab:{type:String,required:!1},Close:Function},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=E(\"\"),d=E(\"\"),c=E(\"\"),k=E(\"\"),g=E(\"default\"),p=E(\"Aria2\"),m=E(\"\"),v=E(\"\"),b=E(\"\"),y=E(\"\"),f=E([]),F=E([]),w=E(0);Pt(()=>{var M,q,T,j,R,it,ot,bt,Dt,yt;switch(n.defaultTab){case\"aria2\":p.value=\"Aria2\";break;case\"qbittorrent\":p.value=\"qBittorrent\";break;case\"transmission\":p.value=\"Transmission\";break}f.value=n.partitionList.map(Vt=>({key:Vt})),F.value=n.partitionList.filter(Vt=>Vt.startsWith(\"/mnt/\")).map(Vt=>Vt.replace(/(\\/mnt\\/[^/]+).*/,\"$1\")),c.value=((M=n.services.aria2)==null?void 0:M.configPath)||\"\";const A=((q=n.services.aria2)==null?void 0:q.downloadPath)||((T=n.services.qbittorrent)==null?void 0:T.downloadPath)||((j=n.services.transmission)==null?void 0:j.downloadPath);A&&(k.value=A);const z=(R=n.services.aria2)==null?void 0:R.rpcToken;z&&(u.value=z),m.value=((it=n.services.qbittorrent)==null?void 0:it.configPath)||\"\";const B=((ot=n.services.qbittorrent)==null?void 0:ot.downloadPath)||A||((bt=n.services.transmission)==null?void 0:bt.downloadPath);B&&(v.value=B),b.value=((Dt=n.services.transmission)==null?void 0:Dt.configPath)||\"\";const H=((yt=n.services.transmission)==null?void 0:yt.downloadPath)||A||B;H&&(y.value=H)});const h=()=>{let A=c.value,z=k.value;A==null||A==\"\"||z==null||z==\"\"||L(this,null,function*(){if(yield zt.checkAndInstallApp(\"app-meta-aria2\",\"Aria2\")){const H=$.Loading(a(\"\\u914D\\u7F6E\\u4E2D...\"));G.Guide.Aria2Init.POST({configPath:A,downloadPath:z,rpcToken:u.value,btTracker:g.value==\"add\"?d.value:\"\"}).then(M=>{var q;if(M!=null&&M.data){if((M.data.success||0)==0){w.value=1;return}else if((q=M.data)!=null&&q.error)throw M.data.error}throw a(\"\\u672A\\u77E5\\u9519\\u8BEF\")}).catch(M=>$.Error(M)).finally(()=>H.Close())}})},_=()=>{let A=m.value,z=v.value;A==null||A==\"\"||z==null||z==\"\"||L(this,null,function*(){if(yield zt.checkAndInstallApp(\"app-meta-qbittorrent\",\"qBittorrent\")){const H=$.Loading(a(\"\\u914D\\u7F6E\\u4E2D...\"));G.Guide.qbitorrentInit.POST({configPath:A,downloadPath:z}).then(M=>{var q;if(M!=null&&M.data){if((M.data.success||0)==0){w.value=1;return}else if((q=M.data)!=null&&q.error)throw M.data.error}throw a(\"\\u672A\\u77E5\\u9519\\u8BEF\")}).catch(M=>$.Error(M)).finally(()=>H.Close())}})},x=()=>{let A=b.value,z=y.value;A==null||A==\"\"||z==null||z==\"\"||L(this,null,function*(){if(yield zt.checkAndInstallApp(\"app-meta-transmission\",\"Transmission\")){const H=$.Loading(a(\"\\u914D\\u7F6E\\u4E2D...\"));G.Guide.transmissionInit.POST({configPath:A,downloadPath:z}).then(M=>{var q;if(M!=null&&M.data){if((M.data.success||0)==0){w.value=1;return}else if((q=M.data)!=null&&q.error)throw M.data.error}throw a(\"\\u672A\\u77E5\\u9519\\u8BEF\")}).catch(M=>$.Error(M)).finally(()=>H.Close())}})},C=A=>{A.preventDefault(),n.Close&&n.Close()},S=A=>{A.preventDefault(),location.reload()};return(A,z)=>(r(),Z(wt,{Close:o.Close,type:1},{default:V(()=>[w.value==0?(r(),s(\"div\",$u,[t(\"h2\",Cu,i(e(a)(\"\\u4E0B\\u8F7D\\u670D\\u52A1\\u914D\\u7F6E\\u5411\\u5BFC\")),1),t(\"ul\",null,[t(\"li\",null,[t(\"div\",Du,[t(\"div\",Bu,[t(\"span\",null,i(e(a)(\"\\u4E0B\\u8F7D\\u670D\\u52A1\\uFF1A\")),1)]),t(\"div\",Yu,[O(t(\"input\",{type:\"radio\",value:\"Aria2\",\"onUpdate:modelValue\":z[0]||(z[0]=B=>p.value=B),name:\"download\",id:\"Aria2\"},null,512),[[Bt,p.value]]),Au]),t(\"div\",Su,[O(t(\"input\",{type:\"radio\",value:\"qBittorrent\",\"onUpdate:modelValue\":z[1]||(z[1]=B=>p.value=B),name:\"download\",id:\"qB\"},null,512),[[Bt,p.value]]),zu]),t(\"div\",Pu,[O(t(\"input\",{type:\"radio\",value:\"Transmission\",\"onUpdate:modelValue\":z[2]||(z[2]=B=>p.value=B),name:\"download\",id:\"Tr\"},null,512),[[Bt,p.value]]),Tu])])])]),p.value==\"Aria2\"?(r(),s(\"form\",{key:0,onSubmit:ft(h,[\"prevent\"])},[t(\"ul\",null,[t(\"li\",null,[t(\"div\",Mu,[t(\"div\",Lu,[t(\"span\",Ou,[Y(Jt),t(\"div\",null,[t(\"div\",Nu,[t(\"span\",Vu,i(e(a)(\"\\u7528\\u4E8E\\u653E\\u7F6E\\u914D\\u7F6E\\u6587\\u4EF6\\u7684\\u76EE\\u5F55\\u3002\\u4F8B\\u5982\\uFF1A/mnt/sda1/Configs/aria2\\uFF1B\\u8BF7\\u52FF\\u4F7F\\u7528 /tmp \\u6216 /var \\uFF0C\\u4EE5\\u514D\\u91CD\\u542F\\u4EE5\\u540E\\u4EFB\\u52A1\\u4E22\\u5931\")),1)])])]),t(\"span\",null,i(e(a)(\"\\u914D\\u7F6E\\u76EE\\u5F55\\uFF1A\")),1)]),t(\"div\",Gu,[Y(Zt,{modelValue:c.value,\"onUpdate:modelValue\":z[3]||(z[3]=B=>c.value=B),modelModifiers:{trim:!0},title:e(a)(\"\\u914D\\u7F6E\\u76EE\\u5F55\"),options:F.value.concat(\"/root\").map(B=>({key:B+\"/Configs/aria2\"}))},null,8,[\"modelValue\",\"title\",\"options\"])])])]),t(\"li\",null,[t(\"div\",ju,[t(\"div\",Uu,[t(\"span\",qu,[Y(Jt),t(\"div\",null,[t(\"div\",Ru,[t(\"span\",Wu,i(e(a)(\"\\u7528\\u4E8E\\u653E\\u7F6E\\u4E0B\\u8F7D\\u6587\\u4EF6\\u7684\\u76EE\\u5F55\\u3002\\u4F8B\\u5982\\uFF1A/mnt/sda1/download\")),1)])])]),t(\"span\",null,i(e(a)(\"\\u4E0B\\u8F7D\\u76EE\\u5F55\\uFF1A\")),1)]),t(\"div\",Hu,[Y(Zt,{modelValue:k.value,\"onUpdate:modelValue\":z[4]||(z[4]=B=>k.value=B),modelModifiers:{trim:!0},title:e(a)(\"\\u4E0B\\u8F7D\\u76EE\\u5F55\"),options:f.value},null,8,[\"modelValue\",\"title\",\"options\"])])])]),t(\"li\",null,[t(\"div\",Ju,[t(\"div\",Zu,[t(\"span\",Ku,[Y(Jt),t(\"div\",null,[t(\"div\",Qu,[t(\"span\",Xu,i(e(a)(\"\\u7528\\u4E8E\\u8FDC\\u7A0B\\u8BBF\\u95EE\\u7684\\u4EE4\\u724C\\u3002\")),1)])])]),t(\"span\",null,i(e(a)(\"RPC \\u4EE4\\u724C\\uFF1A\")),1)]),O(t(\"input\",{type:\"text\",class:\"RPC_input\",placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165RPC\\u4EE4\\u724C\"),\"onUpdate:modelValue\":z[5]||(z[5]=B=>u.value=B)},null,8,tc),[[at,u.value,void 0,{trim:!0}]])])]),t(\"li\",null,[t(\"div\",ec,[t(\"div\",ac,[t(\"span\",null,i(e(a)(\"\\u9644\\u52A0\\u7684 BT Tracker\\uFF1A\")),1)]),t(\"div\",oc,[O(t(\"input\",{type:\"radio\",value:\"default\",name:\"BT\",id:\"default\",\"onUpdate:modelValue\":z[6]||(z[6]=B=>g.value=B)},null,512),[[Bt,g.value]]),t(\"label\",nc,i(e(a)(\"\\u9ED8\\u8BA4\")),1)]),t(\"div\",ic,[O(t(\"input\",{type:\"radio\",value:\"add\",name:\"BT\",id:\"add\",\"onUpdate:modelValue\":z[7]||(z[7]=B=>g.value=B)},null,512),[[Bt,g.value]]),t(\"label\",rc,i(e(a)(\"\\u81EA\\u5DF1\\u6DFB\\u52A0\")),1)])])]),t(\"li\",null,[t(\"div\",sc,[dc,t(\"div\",lc,[g.value==\"add\"?O((r(),s(\"textarea\",{key:0,\"onUpdate:modelValue\":z[8]||(z[8]=B=>d.value=B),rows:\"4\",placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165BT Tracker\\u670D\\u52A1\\u5668\\u5730\\u5740\\uFF0C\\u591A\\u4E2A\\u5730\\u5740\\u4F7F\\u7528\\u6362\\u884C\\u6216\\u8005\\u82F1\\u6587\\u9017\\u53F7\\u5206\\u9694\")},null,8,uc)),[[at,d.value,void 0,{trim:!0}]]):D(\"\",!0)])])])])],40,Iu)):D(\"\",!0),p.value==\"qBittorrent\"?(r(),s(\"form\",{key:1,onSubmit:ft(_,[\"prevent\"])},[t(\"ul\",null,[t(\"li\",null,[t(\"div\",pc,[t(\"div\",fc,[t(\"span\",mc,[Y(Jt),t(\"div\",null,[t(\"div\",gc,[t(\"span\",vc,i(e(a)(\"\\u7528\\u4E8E\\u653E\\u7F6E\\u914D\\u7F6E\\u6587\\u4EF6\\u7684\\u76EE\\u5F55\\u3002\\u4F8B\\u5982\\uFF1A/mnt/sda1/Configs/qb\\uFF1B\\u8BF7\\u52FF\\u4F7F\\u7528 /tmp \\u6216 /var \\uFF0C\\u4EE5\\u514D\\u91CD\\u542F\\u4EE5\\u540E\\u4EFB\\u52A1\\u4E22\\u5931\")),1)])])]),t(\"span\",null,i(e(a)(\"\\u914D\\u7F6E\\u76EE\\u5F55\\uFF1A\")),1)]),t(\"div\",bc,[Y(Zt,{modelValue:m.value,\"onUpdate:modelValue\":z[9]||(z[9]=B=>m.value=B),modelModifiers:{trim:!0},title:e(a)(\"\\u914D\\u7F6E\\u76EE\\u5F55\"),options:F.value.concat(\"/root\").map(B=>({key:B+\"/Configs/qb\"}))},null,8,[\"modelValue\",\"title\",\"options\"])])])]),t(\"li\",null,[t(\"div\",hc,[t(\"div\",_c,[t(\"span\",xc,[Y(Jt),t(\"div\",null,[t(\"div\",wc,[t(\"span\",kc,i(e(a)(\"\\u7528\\u4E8E\\u653E\\u7F6E\\u4E0B\\u8F7D\\u6587\\u4EF6\\u7684\\u76EE\\u5F55\\u3002\\u4F8B\\u5982\\uFF1A/mnt/sda1/download\")),1)])])]),t(\"span\",null,i(e(a)(\"\\u4E0B\\u8F7D\\u76EE\\u5F55\\uFF1A\")),1)]),t(\"div\",yc,[Y(Zt,{modelValue:v.value,\"onUpdate:modelValue\":z[10]||(z[10]=B=>v.value=B),modelModifiers:{trim:!0},title:e(a)(\"\\u4E0B\\u8F7D\\u76EE\\u5F55\"),options:f.value},null,8,[\"modelValue\",\"title\",\"options\"])])])])])],40,cc)):D(\"\",!0),p.value==\"Transmission\"?(r(),s(\"form\",{key:2,onSubmit:ft(x,[\"prevent\"])},[t(\"ul\",null,[t(\"li\",null,[t(\"div\",Ec,[t(\"div\",$c,[t(\"span\",Cc,[Y(Jt),t(\"div\",null,[t(\"div\",Dc,[t(\"span\",Bc,i(e(a)(\"\\u7528\\u4E8E\\u653E\\u7F6E\\u914D\\u7F6E\\u6587\\u4EF6\\u7684\\u76EE\\u5F55\\u3002\\u4F8B\\u5982\\uFF1A/mnt/sda1/Configs/tr\\uFF1B\\u8BF7\\u52FF\\u4F7F\\u7528 /tmp \\u6216 /var \\uFF0C\\u4EE5\\u514D\\u91CD\\u542F\\u4EE5\\u540E\\u4EFB\\u52A1\\u4E22\\u5931\")),1)])])]),t(\"span\",null,i(e(a)(\"\\u914D\\u7F6E\\u76EE\\u5F55\\uFF1A\")),1)]),t(\"div\",Yc,[Y(Zt,{modelValue:b.value,\"onUpdate:modelValue\":z[11]||(z[11]=B=>b.value=B),modelModifiers:{trim:!0},title:e(a)(\"\\u914D\\u7F6E\\u76EE\\u5F55\"),options:F.value.concat(\"/root\").map(B=>({key:B+\"/Configs/transmission\"}))},null,8,[\"modelValue\",\"title\",\"options\"])])])]),t(\"li\",null,[t(\"div\",Ac,[t(\"div\",Sc,[t(\"span\",zc,[Y(Jt),t(\"div\",null,[t(\"div\",Pc,[t(\"span\",Tc,i(e(a)(\"\\u7528\\u4E8E\\u653E\\u7F6E\\u4E0B\\u8F7D\\u6587\\u4EF6\\u7684\\u76EE\\u5F55\\u3002\\u4F8B\\u5982\\uFF1A/mnt/sda1/download\")),1)])])]),t(\"span\",null,i(e(a)(\"\\u4E0B\\u8F7D\\u76EE\\u5F55\\uFF1A\")),1)]),t(\"div\",Ic,[Y(Zt,{modelValue:y.value,\"onUpdate:modelValue\":z[12]||(z[12]=B=>y.value=B),modelModifiers:{trim:!0},title:e(a)(\"\\u4E0B\\u8F7D\\u76EE\\u5F55\"),options:f.value},null,8,[\"modelValue\",\"title\",\"options\"])])])])])],40,Fc)):D(\"\",!0),t(\"div\",Mc,[p.value==\"Aria2\"?(r(),s(\"button\",{key:0,class:\"cbi-button cbi-button-apply\",onClick:h},i(e(a)(\"\\u542F\\u7528\")),1)):D(\"\",!0),p.value==\"qBittorrent\"?(r(),s(\"button\",{key:1,class:\"cbi-button cbi-button-apply\",onClick:_},i(e(a)(\"\\u542F\\u7528\")),1)):D(\"\",!0),p.value==\"Transmission\"?(r(),s(\"button\",{key:2,class:\"cbi-button cbi-button-apply\",onClick:x},i(e(a)(\"\\u542F\\u7528\")),1)):D(\"\",!0),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:C},i(e(a)(\"\\u53D6\\u6D88\")),1)])])):w.value==1?(r(),s(\"div\",Lc,[t(\"h2\",Oc,i(e(a)(\"%{status}\\u4E0B\\u8F7D\\u670D\\u52A1\\u914D\\u7F6E\\u5411\\u5BFC\",{status:p.value})),1),t(\"div\",Nc,[Y(ua)]),t(\"p\",Vc,i(e(a)(\"\\u914D\\u7F6E\\u6210\\u529F\\uFF01\")),1),t(\"div\",Gc,[t(\"button\",{class:\"cbi-button cbi-button-apply\",onClick:S},i(e(a)(\"\\u786E\\u5B9A\")),1)])])):D(\"\",!0)]),_:1},8,[\"Close\"]))}});var Uc=N(jc,[[\"__scopeId\",\"data-v-7b328460\"]]);const qc=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=xt(Uc,vt(st({},o),{Close:()=>{l()}}));a.mount(n);const l=()=>{a.unmount(),n.remove()};return{Close:l}},ca=o=>(ut(\"data-v-5ebde5ac\"),o=o(),ct(),o),Rc={class:\"content\"},Wc={class:\"tab\"},Hc=ca(()=>t(\"div\",{class:\"title\"},\"Aria2\",-1)),Jc={key:0},Zc={key:1},Kc=ca(()=>t(\"div\",{class:\"title\"},\"qBittorrent\",-1)),Qc={key:0},Xc={key:1},t1=ca(()=>t(\"div\",{class:\"title\"},\"Transmission\",-1)),e1={key:0},a1={key:1},o1=I({setup(o){const{$gettext:n}=J(),a=E(!1),l=E(\"aria2\"),u=E(!1),d=w=>{l.value=w,u.value=!0},c=E(),k=()=>{if(u.value)return;const h=[\"aria2\",\"qbittorrent\",\"transmission\"].find(_=>{var x,C;return((C=(x=c.value)==null?void 0:x[_])==null?void 0:C.status)===\"running\"});l.value=h||\"aria2\"};setTimeout(()=>{G.Guide.DownloadService.Status.GET().then(w=>{var h;if((h=w==null?void 0:w.data)!=null&&h.result){const _=w.data.result;c.value=_,k()}})},800),E(!1);const p=E(!1),m=()=>{p.value=!p.value},v=()=>{G.Guide.DownloadPartition.List.GET().then(w=>{var _,x;let h=[];(x=(_=w==null?void 0:w.data)==null?void 0:_.result)!=null&&x.partitionList&&(h=w.data.result.partitionList),qc({services:c.value,partitionList:h,defaultTab:l.value})})},b=(w,h,_)=>L(this,null,function*(){m(),zt.installAndGo(w,h,_)}),y=()=>{b(\"app-meta-aria2\",\"Aria2\",\"/cgi-bin/luci/admin/services/aria2\")},f=()=>{b(\"app-meta-qbittorrent\",\"qBittorrent\",\"/cgi-bin/luci/admin/nas/qBittorrent\")},F=()=>{b(\"app-meta-transmission\",\"Transmission\",\"/cgi-bin/luci/admin/services/transmission\")};return(w,h)=>(r(),Z(Wt,{title:e(n)(\"\\u4E0B\\u8F7D\\u670D\\u52A1\"),showSettings:!0,onFooterClick:v,style:{width:\"100%\",height:\"100%\",display:\"block\"},\"is-settings-menu-open\":a.value,\"onUpdate:isSettingsMenuOpen\":h[4]||(h[4]=_=>a.value=_)},{icon:V(()=>[Y(Kt,{color:\"#00a63e\",class:\"icon\"})]),settings:V(()=>[t(\"div\",{class:\"btn_settings\",onClick:v},[Y(Kt,{color:\"#0a0a0a\",class:\"icon1 downloadIcon\",style:{\"margin-right\":\"6px\"}}),t(\"span\",null,i(e(n)(\"\\u4E0B\\u8F7D\\u7BA1\\u7406\")),1),Boolean(c.value)?(r(),s(\"div\",{key:0,class:\"rotation\",onClick:h[0]||(h[0]=ft(_=>a.value=!a.value,[\"stop\"]))},[Y(Ee,{class:\"moreIcon\"})])):D(\"\",!0)])]),\"settings-menu\":V(()=>[t(\"div\",null,[t(\"a\",{onClick:y},i(e(n)(\"Aria2\\u9AD8\\u7EA7\\u914D\\u7F6E\")),1)]),t(\"div\",null,[t(\"a\",{onClick:f},i(e(n)(\"qBittorrent\\u9AD8\\u7EA7\\u914D\\u7F6E\")),1)]),t(\"div\",null,[t(\"a\",{onClick:F},i(e(n)(\"Transmission\\u9AD8\\u7EA7\\u914D\\u7F6E\")),1)])]),default:V(()=>{var _,x,C,S,A,z,B,H,M;return[t(\"div\",Rc,[t(\"div\",Wc,[t(\"div\",{class:lt([\"item cloud\",{active:l.value==\"aria2\"}]),onClick:h[1]||(h[1]=q=>d(\"aria2\"))},[Y(Kt,{color:\"#f54900\",class:\"icon2\"}),Hc,((x=(_=c.value)==null?void 0:_.aria2)==null?void 0:x.status)==\"running\"?(r(),s(\"span\",Jc,i(e(n)(\"\\u5DF2\\u542F\\u7528\")),1)):(r(),s(\"span\",Zc,i(e(n)(\"\\u672A\\u542F\\u7528\")),1))],2),t(\"div\",{class:lt([\"item memory\",{active:l.value==\"qbittorrent\"}]),onClick:h[2]||(h[2]=q=>d(\"qbittorrent\"))},[Y(Kt,{color:\"#4a5565\",class:\"icon2\"}),Kc,((S=(C=c.value)==null?void 0:C.qbittorrent)==null?void 0:S.status)==\"running\"?(r(),s(\"span\",Qc,i(e(n)(\"\\u5DF2\\u542F\\u7528\")),1)):(r(),s(\"span\",Xc,i(e(n)(\"\\u672A\\u542F\\u7528\")),1))],2),t(\"div\",{class:lt([\"item network\",{active:l.value==\"transmission\"}]),onClick:h[3]||(h[3]=q=>d(\"transmission\"))},[Y(Kt,{color:\"#009689\",class:\"icon2\"}),t1,((z=(A=c.value)==null?void 0:A.transmission)==null?void 0:z.status)==\"running\"?(r(),s(\"span\",e1,i(e(n)(\"\\u5DF2\\u542F\\u7528\")),1)):(r(),s(\"span\",a1,i(e(n)(\"\\u672A\\u542F\\u7528\")),1))],2)]),l.value==\"aria2\"?(r(),Z(Pl,{key:0,aria2:(B=c.value)==null?void 0:B.aria2},null,8,[\"aria2\"])):l.value==\"qbittorrent\"?(r(),Z(Xl,{key:1,qbittorrent:(H=c.value)==null?void 0:H.qbittorrent},null,8,[\"qbittorrent\"])):l.value==\"transmission\"?(r(),Z(gu,{key:2,transmission:(M=c.value)==null?void 0:M.transmission},null,8,[\"transmission\"])):D(\"\",!0)])]}),_:1},8,[\"title\",\"is-settings-menu-open\"]))}});var n1=N(o1,[[\"__scopeId\",\"data-v-5ebde5ac\"]]);const i1={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},r1=[\"fill\"],He=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",i1,[t(\"path\",{d:\"M584.675 134.868C561.143 130.36 536.847 128 512 128a392 392 0 0 0-3.783 0.018l-24.19 169.685A32 32 0 0 1 466.68 321.8l-99.807 49.992-50.81 127.247a32 32 0 0 1-24.45 19.697l-162.145 27.069c8.105 92.926 49.308 176.368 111.754 238.473L223.089 657.52c-2.323-16.238 8.01-31.603 23.924-35.578l226.491-56.558a32 32 0 0 1 30.368 8.407l96.768 96.662a8 8 0 0 0 8.728 1.726l150.425-62.602 31.42-0.772c17.669-0.434 32.343 13.536 32.777 31.204 0.007 0.262 0.01 0.524 0.01 0.786v95.11c45.314-63.03 72-140.351 72-223.906 0-40.5-6.27-79.535-17.891-116.188l-103.215 27.656a32 32 0 0 1-23.36-2.684l-127.842-68.287a32 32 0 0 1-16.712-24.553l-22.305-193.076z m58.509 16.124l18.31 159.176 109.262 56.623 86.458-23.166c-43.44-88.897-120.207-158.532-214.03-192.633z m-336.132 685.8C366.357 874.295 436.644 896 512 896c94.536 0 181.093-34.162 248-90.814V683.96a8 8 0 0 0-11.074-7.386l-138.21 57.53a32 32 0 0 1-34.913-6.903l-99.24-99.132a8 8 0 0 0-7.592-2.102l-178.437 44.563a8 8 0 0 0-5.981 8.894l22.499 157.37zM128.65 489.473l140.726-23.504 49.219-123.244a32 32 0 0 1 15.386-16.744l96.748-48.46 20.65-144.762C275.347 160.675 139.137 308.212 128.65 489.47zM512 960C264.576 960 64 759.424 64 512S264.576 64 512 64s448 200.576 448 448-200.576 448-448 448z\",fill:o.color,\"p-id\":\"8679\"},null,8,r1)]))}}),s1={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},d1=[\"fill\"],l1=[\"fill\"],u1=[\"fill\"],pa=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",s1,[t(\"path\",{d:\"M298.894222 482.417778c-35.271111 0-65.649778 12.231111-90.624 36.636444-25.031111 24.462222-37.603556 54.158222-37.603555 88.746667v87.153778h60.359111V607.857778c0-18.318222 6.599111-33.848889 19.854222-46.762667a65.991111 65.991111 0 0 1 48.014222-19.456h426.382222c18.887111 0 34.759111 6.428444 48.014223 19.399111 13.312 13.027556 19.854222 28.444444 19.854222 46.819556v87.04h60.359111v-87.04c0-34.702222-12.572444-64.341333-37.546667-88.746667a125.098667 125.098667 0 0 0-90.680889-36.750222H298.894222z\",fill:o.color,\"p-id\":\"8894\"},null,8,d1),t(\"path\",{d:\"M488.049778 334.734222h47.900444V512h-47.900444V334.734222z\",fill:o.color,\"p-id\":\"8895\"},null,8,l1),t(\"path\",{d:\"M597.333333 142.222222v170.666667h-170.666666v-170.666667h170.666666z m-170.666666-56.888889a56.888889 56.888889 0 0 0-56.888889 56.888889v170.666667a56.888889 56.888889 0 0 0 56.888889 56.888889h170.666666a56.888889 56.888889 0 0 0 56.888889-56.888889v-170.666667a56.888889 56.888889 0 0 0-56.888889-56.888889h-170.666666zM284.444444 711.111111H113.777778v170.666667h170.666666v-170.666667z m-170.666666-56.888889h170.666666a56.888889 56.888889 0 0 1 56.888889 56.888889v170.666667a56.888889 56.888889 0 0 1-56.888889 56.888889H113.777778a56.888889 56.888889 0 0 1-56.888889-56.888889v-170.666667a56.888889 56.888889 0 0 1 56.888889-56.888889zM910.222222 711.111111v170.666667h-170.666666v-170.666667h170.666666z m-170.666666-56.888889a56.888889 56.888889 0 0 0-56.888889 56.888889v170.666667a56.888889 56.888889 0 0 0 56.888889 56.888889h170.666666a56.888889 56.888889 0 0 0 56.888889-56.888889v-170.666667a56.888889 56.888889 0 0 0-56.888889-56.888889h-170.666666z\",fill:o.color,\"p-id\":\"8896\"},null,8,u1)]))}}),c1={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},p1=[\"fill\"],f1=[\"fill\"],m1=[\"fill\"],g1=I({props:{color:{type:String,default:\"#4a5565\"}},setup(o){return(n,a)=>(r(),s(\"svg\",c1,[t(\"path\",{d:\"M909.1 499.1h-797c-27.5 0-50 22.5-50 50v351.5c0 27.5 22.5 50 50 50h797c27.5 0 50-22.5 50-50V549.1c0-27.5-22.5-50-50-50z m-14 387.5h-769V563.1h769v323.5z\",fill:o.color,\"p-id\":\"19594\"},null,8,p1),t(\"path\",{d:\"M191.932 734.691a63 63 0 1 0 124.375-20.173 63 63 0 1 0-124.375 20.173zM395.56 774.136a63 63 0 1 0 89.093-89.097 63 63 0 1 0-89.094 89.097zM702.8 296.6c-19.4 0-35.2 8.4-35.2 18.7v198c0 10.3 15.9 18.7 35.2 18.7 19.4 0 35.2-8.4 35.2-18.7v-198c0.1-10.3-15.8-18.7-35.2-18.7z\",fill:o.color,\"p-id\":\"19595\"},null,8,f1),t(\"path\",{d:\"M701.8 218.6c-49.7 0-93.2 31.8-117.7 79.5h41.5c19.3-24.3 46.3-39.5 76.2-39.5 29.9 0 56.9 15.2 76.2 39.5h41.5c-24.4-47.7-68-79.5-117.7-79.5z m5.3-45.5c41.1 0 78.3 15.2 104.8 39.5H869c-33.7-47.7-93.7-79.5-162-79.5s-128.3 31.8-162 79.5h57.1c26.6-24.3 63.8-39.5 105-39.5z\",fill:o.color,\"p-id\":\"19596\"},null,8,m1)]))}}),v1={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},b1=[\"fill\"],ya=I({props:{color:{type:String,default:\"#0a0a0a\"}},setup(o){return(n,a)=>(r(),s(\"svg\",v1,[t(\"path\",{d:\"M526.41 117.029v58.514a7.314 7.314 0 0 1-7.315 7.314H219.429a36.571 36.571 0 0 0-35.987 29.989l-0.585 6.583V804.57a36.571 36.571 0 0 0 29.989 35.987l6.583 0.585H804.57a36.571 36.571 0 0 0 35.987-29.989l0.585-6.583v-317.44a7.314 7.314 0 0 1 7.314-7.314h58.514a7.314 7.314 0 0 1 7.315 7.314v317.44a109.714 109.714 0 0 1-99.182 109.203l-10.533 0.512H219.43a109.714 109.714 0 0 1-109.203-99.182l-0.512-10.533V219.43a109.714 109.714 0 0 1 99.182-109.203l10.533-0.512h299.666a7.314 7.314 0 0 1 7.314 7.315z m307.345 31.817l41.4 41.399a7.314 7.314 0 0 1 0 10.313L419.985 655.726a7.314 7.314 0 0 1-10.313 0l-41.399-41.4a7.314 7.314 0 0 1 0-10.312l455.168-455.168a7.314 7.314 0 0 1 10.313 0z\",\"p-id\":\"4497\",fill:o.color},null,8,b1)]))}}),h1={class:\"actioner-container\"},_1={class:\"actioner-container_header\"},x1={class:\"actioner-container_body\"},w1={class:\"label-item\"},k1={class:\"label_info\"},y1={class:\"label-item\"},F1={class:\"label_info\"},E1={class:\"label-item\"},$1={class:\"label_info\"},C1={class:\"label-item\"},D1={class:\"label_info\"},B1={class:\"actioner-container_footer\"},Y1=I({props:{onSetup:{type:Function,required:!0},active:{type:String,default:\"ddnsto\"}},emits:[\"update:active\"],setup(o,{emit:n}){const a=o,{$gettext:l,$ngettext:u}=J(),d=()=>{a.onSetup()},c=E(a.active),k=()=>{switch(n(\"update:active\",c.value),c.value){case\"ddnsto\":a.onSetup(\"ddnsto\");break;case\"ali\":a.onSetup(\"ddns-ali\");break;case\"dnspod\":a.onSetup(\"ddns-dnspod\");break;case\"oray\":a.onSetup(\"ddns-oray\");break}};return(g,p)=>(r(),s(\"div\",h1,[t(\"div\",_1,[t(\"span\",null,i(e(l)(\"\\u57DF\\u540D\\u914D\\u7F6E\\u5411\\u5BFC\")),1)]),t(\"div\",x1,[t(\"div\",w1,[t(\"label\",null,[O(t(\"input\",{type:\"radio\",\"onUpdate:modelValue\":p[0]||(p[0]=m=>c.value=m),value:\"ddnsto\"},null,512),[[Bt,c.value]]),t(\"span\",null,i(e(l)(\"DDNSTO\")),1)]),t(\"p\",k1,i(e(l)(\"DDNSTO \\u662F\\u4E00\\u4E2A\\u4E0D\\u9700\\u8981\\u516C\\u7F51IP\\u4E5F\\u53EF\\u4EE5\\u5728\\u5916\\u7F51\\u8BBF\\u95EE\\u7684\\u7A7F\\u900F\\u57DF\\u540D\\u670D\\u52A1\\uFF0C\\u4E00\\u4E2A\\u6D4F\\u89C8\\u5668\\u641E\\u5B9A\\u5185\\u7F51\\u7A7F\\u900F\\uFF0C\\u8FDC\\u7A0B\\u8BBF\\u95EEOpenwrt\\u3001\\u8FDC\\u7A0B\\u7EC8\\u7AEF\\u3001\\u8FDC\\u7A0B\\u684C\\u9762...\")),1)]),t(\"div\",y1,[t(\"label\",null,[O(t(\"input\",{type:\"radio\",\"onUpdate:modelValue\":p[1]||(p[1]=m=>c.value=m),value:\"ali\"},null,512),[[Bt,c.value]]),t(\"span\",null,i(e(l)(\"\\u963F\\u91CC\\u4E91\")),1)]),t(\"p\",F1,i(e(l)(\"\\u4E3A\\u62E5\\u6709\\u52A8\\u6001IP\\u7684\\u4E3B\\u673A\\u914D\\u7F6E\\u4E00\\u4E2A\\u56FA\\u5B9A\\u7684\\u53EF\\u8BBF\\u95EE\\u57DF\\u540D\")),1)]),t(\"div\",E1,[t(\"label\",null,[O(t(\"input\",{type:\"radio\",\"onUpdate:modelValue\":p[2]||(p[2]=m=>c.value=m),value:\"dnspod\"},null,512),[[Bt,c.value]]),t(\"span\",null,i(e(l)(\"Dnspod\")),1)]),t(\"p\",$1,i(e(l)(\"\\u4E3A\\u62E5\\u6709\\u52A8\\u6001IP\\u7684\\u4E3B\\u673A\\u914D\\u7F6E\\u4E00\\u4E2A\\u56FA\\u5B9A\\u7684\\u53EF\\u8BBF\\u95EE\\u57DF\\u540D\")),1)]),t(\"div\",C1,[t(\"label\",null,[O(t(\"input\",{type:\"radio\",\"onUpdate:modelValue\":p[3]||(p[3]=m=>c.value=m),value:\"oray\"},null,512),[[Bt,c.value]]),t(\"span\",null,i(e(l)(\"\\u82B1\\u751F\\u58F3\")),1)]),t(\"p\",D1,i(e(l)(\"\\u4E3A\\u62E5\\u6709\\u52A8\\u6001IP\\u7684\\u4E3B\\u673A\\u914D\\u7F6E\\u4E00\\u4E2A\\u56FA\\u5B9A\\u7684\\u53EF\\u8BBF\\u95EE\\u57DF\\u540D\")),1)])]),t(\"div\",B1,[t(\"div\",{class:\"close\",onClick:d},i(e(l)(\"\\u53D6\\u6D88\")),1),t(\"div\",{class:\"next\",onClick:k},i(e(l)(\"\\u4E0B\\u4E00\\u6B65\")),1)])]))}});var A1=N(Y1,[[\"__scopeId\",\"data-v-46dd945e\"]]);const S1=o=>(ut(\"data-v-b760733a\"),o=o(),ct(),o),z1={class:\"actioner-container\"},P1={class:\"actioner-container_body\"},T1=S1(()=>t(\"svg\",{t:\"1642063181211\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"5062\",width:\"128\",height:\"128\",\"data-v-cda444e0\":\"\"},[t(\"path\",{d:\"M512 85.333333c235.648 0 426.666667 191.018667 426.666667 426.666667s-191.018667 426.666667-426.666667 426.666667S85.333333 747.648 85.333333 512 276.352 85.333333 512 85.333333z m-74.965333 550.4L346.453333 545.152a42.666667 42.666667 0 1 0-60.330666 60.330667l120.704 120.704a42.666667 42.666667 0 0 0 60.330666 0l301.653334-301.696a42.666667 42.666667 0 1 0-60.288-60.330667l-271.530667 271.488z\",fill:\"#52C41A\",\"p-id\":\"5063\",\"data-v-cda444e0\":\"\"})],-1)),I1={class:\"body-title\"},M1={class:\"body-tips\"},L1={class:\"body-info\"},O1=[\"href\"],N1={href:\"/cgi-bin/luci/admin/services/ddns\",target:\"_blank\"},V1={class:\"actioner-container_footer\"},G1=I({props:{target:{type:String,required:!0},onSetup:{type:Function,required:!0}},setup(o){const{$gettext:n,$ngettext:a}=J(),l=()=>{localStorage.setItem(\"firstOpen\",JSON.stringify(!0)),location.reload()};return(u,d)=>(r(),s(\"div\",z1,[t(\"div\",P1,[T1,t(\"div\",I1,i(e(n)(\"\\u6DFB\\u52A0\\u6210\\u529F\")),1),t(\"p\",M1,i(e(n)(\"\\u8BF7\\u7A0D\\u7B491\\u5206\\u949F\\u751F\\u6548\\u540E\\u518D\\u4F7F\\u7528\\u3002\")),1),t(\"div\",L1,[t(\"span\",null,i(e(n)(\"\\u8BBF\\u95EE\\u5730\\u5740\\uFF1A\")),1),t(\"a\",{href:o.target,target:\"_blank\",rel:\"noopener noreferrer\"},i(o.target),9,O1)]),t(\"div\",null,[t(\"span\",null,i(e(n)(\"\\u53EF\\u524D\\u5F80\")),1),t(\"a\",N1,i(e(n)(\"\\u670D\\u52A1-\\u52A8\\u6001DNS\")),1),t(\"span\",null,i(e(n)(\"\\u67E5\\u770B\\u66F4\\u591A\\u8BE6\\u60C5\")),1)])]),t(\"div\",V1,[t(\"div\",{class:\"close\",onClick:l},i(e(n)(\"\\u5173\\u95ED\")),1)])]))}});var j1=N(G1,[[\"__scopeId\",\"data-v-b760733a\"]]);const U1=o=>(ut(\"data-v-064efd50\"),o=o(),ct(),o),q1={class:\"actioner-container\"},R1={class:\"actioner-container_header\"},W1=U1(()=>t(\"div\",{class:\"actioner-container_body ddnsto-login\"},[t(\"iframe\",{src:\"https://www.kooldns.cn/bind/#/auth?send=1&source=openwrt&callback=*\"})],-1)),H1={class:\"actioner-container_footer\"},J1=I({props:{onSetup:{type:Function,required:!0},onDdnstoConfig:{type:Function,required:!0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=()=>{n.onSetup()},d=c=>{if(c.data.auth==\"ddnsto\"){const k=c.data.sign,g=c.data.token;k&&g&&(removeEventListener(\"message\",d),n.onDdnstoConfig(k,g),n.onSetup(\"ddnsto-run\"))}};return Pt(()=>{window.addEventListener(\"message\",d)}),Nt(()=>{removeEventListener(\"message\",d)}),(c,k)=>(r(),s(\"div\",q1,[t(\"div\",R1,[t(\"span\",null,i(e(a)(\"\\u57DF\\u540D\\u914D\\u7F6E\\u5411\\u5BFC\")),1)]),W1,t(\"div\",H1,[t(\"div\",{class:\"close\",onClick:u},i(e(a)(\"\\u53D6\\u6D88\")),1)])]))}});var Z1=N(J1,[[\"__scopeId\",\"data-v-064efd50\"]]);const K1={class:\"actioner-container\"},Q1={class:\"actioner-container_header\"},X1={class:\"actioner-container_body ddnsto-bind\"},t2=[\"src\"],e2=I({props:{onSetup:{type:Function,required:!0},config:{type:Object,required:!0},domain:{type:String,required:!0}},emits:[\"update:domain\"],setup(o,{emit:n}){const a=o,{$gettext:l,$ngettext:u}=J(),d=Q(()=>{const{domain:g,token:p,sign:m,routerId:v,netaddr:b}=a.config,y=encodeURIComponent(g),f=encodeURIComponent(b);return`https://www.kooldns.cn/bind/#/domain?domain=${y}&sign=${m}&token=${p}&routerId=${v}&netaddr=${f}`}),c=g=>{if(g.data){const{auth:p,url:m}=g.data;p===\"ddnsto\"&&m&&k(m)}},k=g=>L(this,null,function*(){var p;try{const m=yield G.Guide.DdnstoAddress.POST({address:g});m!=null&&m.data&&(((p=m==null?void 0:m.data)==null?void 0:p.success)||0)==0&&(n(\"update:domain\",g),a.onSetup(\"ddnsto-save\"))}catch(m){}});return Pt(()=>{window.addEventListener(\"message\",c)}),Nt(()=>{removeEventListener(\"message\",c)}),(g,p)=>(r(),s(\"div\",K1,[t(\"div\",Q1,[t(\"span\",null,i(e(l)(\"\\u57DF\\u540D\\u914D\\u7F6E\\u5411\\u5BFC\")),1)]),t(\"div\",X1,[t(\"iframe\",{src:e(d)},null,8,t2)])]))}});var a2=N(e2,[[\"__scopeId\",\"data-v-49c43a08\"]]);const o2=o=>(ut(\"data-v-27f65f12\"),o=o(),ct(),o),n2={class:\"actioner-container\"},i2={class:\"actioner-container_body\"},r2=o2(()=>t(\"svg\",{t:\"1642063181211\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"5062\",width:\"128\",height:\"128\",\"data-v-cda444e0\":\"\"},[t(\"path\",{d:\"M512 85.333333c235.648 0 426.666667 191.018667 426.666667 426.666667s-191.018667 426.666667-426.666667 426.666667S85.333333 747.648 85.333333 512 276.352 85.333333 512 85.333333z m-74.965333 550.4L346.453333 545.152a42.666667 42.666667 0 1 0-60.330666 60.330667l120.704 120.704a42.666667 42.666667 0 0 0 60.330666 0l301.653334-301.696a42.666667 42.666667 0 1 0-60.288-60.330667l-271.530667 271.488z\",fill:\"#52C41A\",\"p-id\":\"5063\",\"data-v-cda444e0\":\"\"})],-1)),s2={class:\"body-title\"},d2={class:\"body-tips\"},l2={class:\"body-info\"},u2=[\"href\"],c2={href:\"https://www.ddnsto.com/app/#/devices\",target:\"_blank\"},p2={class:\"actioner-container_footer\"},f2=I({props:{onSetup:{type:Function,required:!0},target:{type:String,required:!0}},setup(o){const{$gettext:n,$ngettext:a}=J(),l=()=>{localStorage.setItem(\"firstOpen\",JSON.stringify(!0)),location.reload()};return(u,d)=>(r(),s(\"div\",n2,[t(\"div\",i2,[r2,t(\"div\",s2,i(e(n)(\"\\u6DFB\\u52A0\\u6210\\u529F\")),1),t(\"p\",d2,i(e(n)(\"\\u8BF7\\u7A0D\\u7B491\\u5206\\u949F\\u751F\\u6548\\u540E\\u518D\\u4F7F\\u7528\\u3002\")),1),t(\"div\",l2,[t(\"span\",null,i(e(n)(\"\\u8BBF\\u95EE\\u5730\\u5740\\uFF1A\")),1),t(\"a\",{href:o.target,target:\"_blank\",rel:\"noopener noreferrer\"},i(o.target),9,u2)]),t(\"div\",null,[t(\"span\",null,i(e(n)(\"\\u53EF\\u524D\\u5F80\")),1),t(\"a\",c2,i(e(n)(\"DDNSTO\\u63A7\\u5236\\u53F0\")),1),t(\"span\",null,i(e(n)(\"\\u67E5\\u770B\\u66F4\\u591A\\u8BE6\\u60C5\")),1)])]),t(\"div\",p2,[t(\"div\",{class:\"close\",onClick:l},i(e(n)(\"\\u5173\\u95ED\")),1)])]))}});var m2=N(f2,[[\"__scopeId\",\"data-v-27f65f12\"]]);const g2={class:\"actioner-container\"},v2={class:\"actioner-container_header\"},b2={class:\"actioner-container_body\"},h2={class:\"actioner-container_footer\"},_2=I({props:{onSetup:{type:Function,required:!0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=()=>{n.onSetup()},d=()=>L(this,null,function*(){if(g.value)return;g.value=!0;const m=$.Loading(a(\"\\u5B89\\u88C5\\u4E2D...\"));try{if(yield zt.installApp(\"app-meta-ddnsto\",30)){n.onSetup(\"ddnsto-login\");return}else c.value=a(\"\\u5B89\\u88C5\\u5931\\u8D25\")}catch(v){c.value=v}finally{m.Close()}g.value=!1}),c=E(a(\"\\u6B63\\u5728\\u68C0\\u6D4B\\u4E2D...\")),k=E(!1),g=E(!1);return(()=>L(this,null,function*(){try{const m=yield G.App.Check.POST({name:\"ddnsto\"});if(m!=null&&m.data){const{result:v,error:b}=m.data;if(b){c.value=b;return}if(v){if(v.status==\"installed\"){n.onSetup(\"ddnsto-login\");return}v.status==\"uninstalled\"&&(c.value=a(\"\\u9700\\u8981\\u5B89\\u88C5DDNSTO\\u63D2\\u4EF6\\uFF0C\\u70B9\\u51FB\\u201C\\u786E\\u5B9A\\u201D\\u5F00\\u59CB\\u5B89\\u88C5\"))}}}catch(m){c.value=m}k.value=!0}))(),(m,v)=>(r(),s(\"div\",g2,[t(\"div\",v2,[t(\"span\",null,i(e(a)(\"\\u57DF\\u540D\\u914D\\u7F6E\\u5411\\u5BFC\")),1)]),t(\"div\",b2,[t(\"span\",null,i(c.value),1)]),t(\"div\",h2,[k.value?(r(),s(U,{key:0},[t(\"div\",{class:\"close\",onClick:u},i(e(a)(\"\\u53D6\\u6D88\")),1),t(\"div\",{class:\"next\",onClick:d},i(e(a)(\"\\u786E\\u5B9A\")),1)],64)):D(\"\",!0)])]))}});var x2=N(_2,[[\"__scopeId\",\"data-v-210c03e8\"]]);const w2={class:\"actioner-container\"},k2={class:\"actioner-container_header\"},y2={class:\"actioner-container_body\"},F2=I({props:{onSetup:{type:Function,required:!0},token:{type:String,required:!0},onDdnstoLocalConfig:{type:Function,required:!0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=E(a(\"\\u6B63\\u5728\\u68C0\\u6D4B\\u63D2\\u4EF6\\u662F\\u5426\\u5DF2\\u542F\\u52A8...\"));(m=>L(this,null,function*(){var v;try{const b=yield G.Guide.Ddnsto.POST({token:n.token});b!=null&&b.data&&(b.data.error&&(u.value=b.data.error),(((v=b==null?void 0:b.data)==null?void 0:v.success)||0)==0&&k())}catch(b){u.value=b}}))(n.token);const c=E(),k=()=>{const m=()=>L(this,null,function*(){if((yield g())===!0){p();return}c.value=window.setTimeout(m,2e3)});m()},g=()=>L(this,null,function*(){try{const m=yield G.App.Check.POST({name:\"ddnsto\",checkRunning:!0});if(m!=null&&m.data){m.data.error&&(u.value=m.data.error);const v=m.data.result;if((v==null?void 0:v.status)==\"running\")return!0}}catch(m){u.value=m}return!1});Nt(()=>{c.value&&clearInterval(c.value)});const p=()=>L(this,null,function*(){var m;try{const v=yield G.Guide.DdntoConfig.GET();if(v!=null&&v.data&&(v.data.error&&(u.value=v.data.error),(((m=v==null?void 0:v.data)==null?void 0:m.success)||0)==0&&v.data.result)){const b=v.data.result;n.onDdnstoLocalConfig(b.netAddr,b.deviceId),n.onSetup(\"ddnsto-bind\")}}catch(v){u.value=v}});return(m,v)=>(r(),s(\"div\",w2,[t(\"div\",k2,[t(\"span\",null,i(e(a)(\"\\u57DF\\u540D\\u914D\\u7F6E\\u5411\\u5BFC\")),1)]),t(\"div\",y2,i(u.value),1)]))}});var E2=N(F2,[[\"__scopeId\",\"data-v-1b21487b\"]]);const $2={class:\"action-main\"},C2=I({props:{Close:{type:Function,required:!0},url:{type:String,required:!0}},setup(o){const n=o,a=E(\"ddnsto-install\"),l=g=>{g!=null?a.value=g:u()},u=()=>{n.Close&&n.Close()},d=gt({sign:\"\",token:\"\",domain:n.url,netaddr:\"\",routerId:\"\"}),c=(g,p)=>{d.sign=g,d.token=p},k=(g,p)=>{d.netaddr=g,d.routerId=p};return(g,p)=>(r(),Z(wt,{type:1},{default:V(()=>[t(\"div\",$2,[a.value==\"ddnsto-install\"?(r(),Z(x2,{key:0,onSetup:l})):a.value==\"ddnsto-login\"?(r(),Z(Z1,{key:1,onSetup:l,onDdnstoConfig:c})):a.value==\"ddnsto-run\"?(r(),Z(E2,{key:2,onSetup:l,token:e(d).token,onDdnstoLocalConfig:k},null,8,[\"token\"])):a.value==\"ddnsto-bind\"?(r(),Z(a2,{key:3,onSetup:l,config:{token:e(d).token,sign:e(d).sign,domain:e(d).domain,netaddr:e(d).netaddr,routerId:e(d).routerId},domain:e(d).domain,\"onUpdate:domain\":p[0]||(p[0]=m=>e(d).domain=m)},null,8,[\"config\",\"domain\"])):a.value==\"ddnsto-save\"?(r(),Z(m2,{key:4,onSetup:l,target:e(d).domain},null,8,[\"target\"])):D(\"\",!0)])]),_:1}))}});var D2=N(C2,[[\"__scopeId\",\"data-v-7a6bd385\"]]);const B2=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=xt(D2,vt(st({},o),{Close:()=>{l()}}));a.mount(n);const l=()=>{a.unmount(),n.remove()};return{Close:l}},Y2={class:\"action\"},A2={class:\"action-header\"},S2=[\"innerHTML\"],z2={class:\"action-footer\"},P2=I({props:{Close:Function,next:{type:Function},clear:{type:Function},continuer:{type:Function},nextTitle:{type:String},clearTitle:{type:String},continuerTitle:{type:String},title:{type:String},content:{type:String}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=()=>{n.next&&n.next(),n.Close&&n.Close()},d=()=>{n.clear&&n.clear(),n.Close&&n.Close()},c=()=>{n.continuer&&n.continuer(),n.Close&&n.Close()};return(k,g)=>(r(),Z(wt,{Close:o.Close,type:1},{default:V(()=>[t(\"div\",Y2,[t(\"div\",A2,i(o.title||e(a)(\"\\u63D0\\u793A\")),1),t(\"div\",{class:\"action-body\",innerHTML:o.content},null,8,S2),t(\"div\",z2,[o.clear?(r(),s(\"div\",{key:0,class:\"clear\",onClick:d},i(o.clearTitle||e(a)(\"\\u8FD4\\u56DE\")),1)):D(\"\",!0),t(\"div\",{class:\"next\",onClick:u},i(o.nextTitle||e(a)(\"\\u786E\\u5B9A\")),1),o.continuer?(r(),s(\"div\",{key:1,class:\"next\",onClick:c},i(o.continuerTitle||e(a)(\"\\u7EE7\\u7EED\\u4FDD\\u5B58\")),1)):D(\"\",!0)])])]),_:1},8,[\"Close\"]))}});var T2=N(P2,[[\"__scopeId\",\"data-v-05611967\"]]);const Se=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=xt(T2,vt(st({},o),{Close:()=>{l()}}));a.mount(n);const l=()=>{a.unmount(),n.remove()};return{Close:l}},I2=o=>(ut(\"data-v-6e29e960\"),o=o(),ct(),o),M2={class:\"actioner-container\"},L2=[\"onSubmit\"],O2={class:\"actioner-container_header\"},N2={key:0,class:\"title_info\"},V2={href:\"https://doc.linkease.com/zh/guide/istoreos/basic/domain.html#%E9%98%BF%E9%87%8C%E4%BA%91\",target:\"_blank\"},G2={key:1,class:\"title_info\"},j2={href:\"https://doc.linkease.com/zh/guide/istoreos/basic/domain.html#dnspod\",target:\"_blank\"},U2={key:2,class:\"title_info\"},q2={href:\"https://doc.linkease.com/zh/guide/istoreos/basic/domain.html#%E8%8A%B1%E7%94%9F%E5%A3%B3\",target:\"_blank\"},R2={class:\"label-item\"},W2={class:\"label-item_key\"},H2={class:\"label-item_value\"},J2={value:\"ipv4\"},Z2={value:\"ipv6\"},K2={class:\"label_tips\"},Q2=I2(()=>t(\"svg\",{width:\"14px\",height:\"14px\",viewBox:\"0 0 14 14\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},[t(\"g\",{id:\"icon_alert\",stroke:\"none\",\"stroke-width\":\"1\",fill:\"none\",\"fill-rule\":\"evenodd\"},[t(\"g\",{id:\"Icon/Warning\"},[t(\"rect\",{id:\"\\u77E9\\u5F62\",fill:\"#000000\",\"fill-rule\":\"nonzero\",opacity:\"0\",x:\"0\",y:\"0\",width:\"14\",height:\"14\"}),t(\"path\",{d:\"M7,0.875 C3.61757813,0.875 0.875,3.61757813 0.875,7 C0.875,10.3824219 3.61757813,13.125 7,13.125 C10.3824219,13.125 13.125,10.3824219 13.125,7 C13.125,3.61757813 10.3824219,0.875 7,0.875 Z M6.5625,4.046875 C6.5625,3.98671875 6.61171875,3.9375 6.671875,3.9375 L7.328125,3.9375 C7.38828125,3.9375 7.4375,3.98671875 7.4375,4.046875 L7.4375,7.765625 C7.4375,7.82578125 7.38828125,7.875 7.328125,7.875 L6.671875,7.875 C6.61171875,7.875 6.5625,7.82578125 6.5625,7.765625 L6.5625,4.046875 Z M7,10.0625 C6.63769531,10.0625 6.34375,9.76855469 6.34375,9.40625 C6.34375,9.04394531 6.63769531,8.75 7,8.75 C7.36230469,8.75 7.65625,9.04394531 7.65625,9.40625 C7.65625,9.76855469 7.36230469,10.0625 7,10.0625 Z\",id:\"\\u5F62\\u72B6\",fill:\"#FAAD14\"})])])],-1)),X2={class:\"info\"},t6={class:\"label-item\"},e6={class:\"label-item_key\"},a6={class:\"label-item_value\"},o6={class:\"label-item\"},n6={class:\"label-item_key\"},i6={class:\"label-item_value\"},r6=[\"placeholder\"],s6={class:\"label-item\"},d6={class:\"label-item_key\"},l6={class:\"label-item_value\"},u6=[\"placeholder\"],c6={class:\"actioner-container_footer\"},p6=[\"disabled\"],f6=I({props:{name:{type:String,default:\"ali\"},onSetup:{type:Function,required:!0},target:{type:String,required:!0}},emits:[\"update:target\"],setup(o,{emit:n}){const a=o,{$gettext:l,$ngettext:u}=J(),d=E(\"ipv4\"),c=E(a.name),k=E(\"\"),g=E(\"\"),p=E(\"\"),m=E(!1),v=()=>{a.onSetup(\"index\")},b=()=>{m.value=!0;const w=$.Loading(l(\"\\u68C0\\u6D4B\\u4E2D...\"));G.Network.CheckPublickNet.POST({ipVersion:d.value}).then(h=>{var _,x;if(h!=null&&h.data){if((_=h==null?void 0:h.data)!=null&&_.error){$.Warning(h==null?void 0:h.data.error);return}if((((x=h==null?void 0:h.data)==null?void 0:x.success)||0)==0){const C=h.data.result;C&&C.address?F():y();return}}throw l(\"\\u672A\\u77E5\\u9519\\u8BEF\")}).catch(h=>{$.Error(h)}).finally(()=>{w.Close(),m.value=!1})},y=()=>{Se({title:l(\"\\u6E29\\u99A8\\u63D0\\u793A\"),nextTitle:l(\"\\u4F7F\\u7528DDNSTO\"),continuerTitle:l(\"\\u7EE7\\u7EED\\u4FDD\\u5B58\"),content:l(\"\\u68C0\\u6D4B\\u5230\\u60A8\\u7684wan\\u53E3\\u6CA1\\u6709\\u516C\\u7F51IP\\u6216\\u8005IPv6\\u5730\\u5740\\uFF0C\\u53EF\\u4EE5\\u4F7F\\u7528DDNSTO\\u914D\\u7F6E\\u8FDC\\u7A0B\\u57DF\\u540D\\u8BBF\\u95EE\"),next(){f()},continuer(){F()},clear(){}})},f=()=>{a.onSetup(\"ddnsto\")},F=()=>{m.value=!0;const w=$.Loading(l(\"\\u914D\\u7F6E\\u4E2D...\"));G.Guide.PostDdns.POST({ipVersion:d.value,serviceName:c.value,domain:k.value,userName:g.value,password:p.value}).then(h=>{if(h!=null&&h.data){const{error:_,scope:x,success:C}=h.data;if(_==\"-100\"&&x==\"guide.ddns\"){Se({title:l(\"\\u6E29\\u99A8\\u63D0\\u793A\"),content:l(\"\\u68C0\\u6D4B\\u5230\\u4F60\\u6709\\u672A\\u4FDD\\u5B58\\u7684\\u914D\\u7F6E\\uFF0C\\u53EF\\u524D\\u5F80\\u9875\\u9762\\u53F3\\u4E0A\\u89D2\\u70B9\\u51FB\\u67E5\\u770B\\uFF0C\\u4FDD\\u5B58\\u5E76\\u5E94\\u7528\\u6216\\u8005\\u6062\\u590D\\u914D\\u7F6E\\u540E\\u7EE7\\u7EED\"),next(){}});return}if(_){$.Warning(_);return}if((C||0)==0){n(\"update:target\",k.value),a.onSetup(\"ddns-success\");return}}throw l(\"\\u672A\\u77E5\\u9519\\u8BEF\")}).catch(h=>{$.Error(h)}).finally(()=>{w.Close(),m.value=!1})};return(w,h)=>(r(),s(\"div\",M2,[t(\"form\",{class:\"actioner-dns\",onSubmit:ft(b,[\"prevent\"])},[t(\"div\",O2,[t(\"span\",null,i(e(l)(\"\\u57DF\\u540D\\u914D\\u7F6E\\u5411\\u5BFC\")),1)]),t(\"div\",{class:lt([\"actioner-container_body\",o.name])},[o.name==\"ali\"?(r(),s(\"div\",N2,[t(\"p\",null,i(e(l)(\"\\u963F\\u91CC\\u4E91\")),1),t(\"span\",null,i(e(l)(\"\\u4E3A\\u62E5\\u6709\\u52A8\\u6001IP\\u7684\\u4E3B\\u673A\\u914D\\u7F6E\\u4E00\\u4E2A\\u56FA\\u5B9A\\u7684\\u53EF\\u8BBF\\u95EE\\u57DF\\u540D\")),1),t(\"a\",V2,i(e(l)(\"\\u67E5\\u770B\\u6559\\u7A0B\"))+\">>\",1)])):o.name==\"dnspod\"?(r(),s(\"div\",G2,[t(\"p\",null,i(e(l)(\"dnspod\")),1),t(\"span\",null,i(e(l)(\"\\u4E3A\\u62E5\\u6709\\u52A8\\u6001IP\\u7684\\u4E3B\\u673A\\u914D\\u7F6E\\u4E00\\u4E2A\\u56FA\\u5B9A\\u7684\\u53EF\\u8BBF\\u95EE\\u57DF\\u540D\")),1),t(\"a\",j2,i(e(l)(\"\\u67E5\\u770B\\u6559\\u7A0B\"))+\">>\",1)])):o.name==\"oray\"?(r(),s(\"div\",U2,[t(\"p\",null,i(e(l)(\"\\u82B1\\u751F\\u58F3\")),1),t(\"span\",null,i(e(l)(\"\\u4E3A\\u62E5\\u6709\\u52A8\\u6001IP\\u7684\\u4E3B\\u673A\\u914D\\u7F6E\\u4E00\\u4E2A\\u56FA\\u5B9A\\u7684\\u53EF\\u8BBF\\u95EE\\u57DF\\u540D\")),1),t(\"a\",q2,i(e(l)(\"\\u67E5\\u770B\\u6559\\u7A0B\"))+\">>\",1)])):D(\"\",!0),t(\"div\",R2,[t(\"div\",W2,[t(\"span\",null,i(e(l)(\"IP\\u5730\\u5740\\u7248\\u672C\\uFF1A\")),1)]),t(\"div\",H2,[O(t(\"select\",{name:\"\",id:\"\",\"onUpdate:modelValue\":h[0]||(h[0]=_=>d.value=_)},[t(\"option\",J2,i(e(l)(\"IPv4\\u5730\\u5740\")),1),t(\"option\",Z2,i(e(l)(\"IPv6\\u5730\\u5740\")),1)],512),[[pt,d.value]])]),t(\"div\",K2,[Q2,t(\"span\",X2,i(e(l)(\"\\u8BBE\\u5B9A\\u54EA\\u4E00\\u4E2A IP \\u5730\\u5740\\uFF08IPv4 \\u6216 IPv6\\uFF09\\u4F1A\\u88AB\\u53D1\\u9001\\u7ED9 DDNS \\u63D0\\u4F9B\\u5546\")),1)])]),t(\"div\",t6,[t(\"div\",e6,[t(\"span\",null,i(e(l)(\"\\u57DF\\u540D\\uFF1A\")),1)]),t(\"div\",a6,[O(t(\"input\",{type:\"text\",placeholder:\"myhost.example.com\",\"onUpdate:modelValue\":h[1]||(h[1]=_=>k.value=_),required:\"\"},null,512),[[at,k.value,void 0,{trim:!0}]])])]),t(\"div\",o6,[t(\"div\",n6,[t(\"span\",null,i(e(l)(\"\\u7528\\u6237\\u540D\\uFF1A\")),1)]),t(\"div\",i6,[O(t(\"input\",{type:\"text\",\"onUpdate:modelValue\":h[2]||(h[2]=_=>g.value=_),placeholder:e(l)(\"\\u8BF7\\u8F93\\u5165\\u7528\\u6237\\u540D\"),required:\"\"},null,8,r6),[[at,g.value,void 0,{trim:!0}]])])]),t(\"div\",s6,[t(\"div\",d6,[t(\"span\",null,i(e(l)(\"\\u5BC6\\u7801\\uFF1A\")),1)]),t(\"div\",l6,[O(t(\"input\",{type:\"password\",\"onUpdate:modelValue\":h[3]||(h[3]=_=>p.value=_),placeholder:e(l)(\"\\u8BF7\\u8F93\\u5165\\u5BC6\\u7801\"),required:\"\"},null,8,u6),[[at,p.value,void 0,{trim:!0}]])])])],2),t(\"div\",c6,[t(\"div\",{class:\"close\",onClick:v,type:\"button\"},i(e(l)(\"\\u8FD4\\u56DE\")),1),t(\"button\",{class:\"next save\",type:\"submit\",disabled:m.value},i(e(l)(\"\\u4FDD\\u5B58\")),9,p6)])],40,L2)]))}});var Je=N(f6,[[\"__scopeId\",\"data-v-6e29e960\"]]);const m6={class:\"action-main\"},g6=I({props:{Close:{type:Function,required:!0},url:{type:String,required:!0}},setup(o){const n=o,a=E(\"\"),l=E(\"index\"),u=g=>{if(g!=null){if(g==\"ddnsto\"){d();return}l.value=g}else c()},d=()=>{c(),B2({url:n.url})},c=()=>{n.Close&&n.Close()},k=E(\"ddnsto\");return(g,p)=>(r(),Z(wt,{Close:o.Close,type:1},{default:V(()=>[t(\"div\",m6,[l.value==\"index\"?(r(),Z(A1,{key:0,onSetup:u,active:k.value,\"onUpdate:active\":p[0]||(p[0]=m=>k.value=m)},null,8,[\"active\"])):l.value==\"ddns-ali\"?(r(),Z(Je,{key:1,onSetup:u,target:a.value,\"onUpdate:target\":p[1]||(p[1]=m=>a.value=m),name:\"ali\"},null,8,[\"target\"])):l.value==\"ddns-dnspod\"?(r(),Z(Je,{key:2,onSetup:u,target:a.value,\"onUpdate:target\":p[2]||(p[2]=m=>a.value=m),name:\"dnspod\"},null,8,[\"target\"])):l.value==\"ddns-oray\"?(r(),Z(Je,{key:3,onSetup:u,target:a.value,\"onUpdate:target\":p[3]||(p[3]=m=>a.value=m),name:\"oray\"},null,8,[\"target\"])):l.value==\"ddns-success\"?(r(),Z(j1,{key:4,onSetup:u,target:a.value},null,8,[\"target\"])):D(\"\",!0)])]),_:1},8,[\"Close\"]))}});var v6=N(g6,[[\"__scopeId\",\"data-v-6f1d92d9\"]]);const b6=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=xt(v6,vt(st({},o),{Close:()=>{l()}}));a.mount(n);const l=()=>{a.unmount(),n.remove()};return{Close:l}},Ve=o=>(ut(\"data-v-134135a2\"),o=o(),ct(),o),h6={class:\"content\"},_6={class:\"tab\"},x6=Ve(()=>t(\"div\",{class:\"title\"},\"DDNSTO\",-1)),w6={key:0},k6={key:1},y6=Ve(()=>t(\"div\",{class:\"title\"},\"IPv4\",-1)),F6={key:0},E6={key:1},$6=Ve(()=>t(\"div\",{class:\"title\"},\"IPv6\",-1)),C6={key:0},D6={key:1},B6={key:0,class:\"info\"},Y6={class:\"status\"},A6=Ve(()=>t(\"div\",null,\"DDNSTO\",-1)),S6={key:0},z6={key:1,class:\"offline\"},P6={class:\"title_box\"},T6={class:\"title\"},I6={class:\"path\"},M6=[\"href\",\"title\"],L6={key:1},O6={class:\"item_btn\",href:\"https://www.kooldns.cn/app/#/devices\",target:\"_blank\"},N6={key:1,class:\"info\"},V6={class:\"status\"},G6={key:0,class:\"offline\"},j6={key:1},U6={class:\"title_box\"},q6={class:\"title\"},R6={class:\"path\"},W6={key:0},H6=[\"href\"],J6={key:2,href:\"/cgi-bin/luci/admin/services/ddns\"},Z6={key:2,class:\"info\"},K6={class:\"status\"},Q6={key:0,class:\"offline\"},X6={key:1},t5={class:\"title_box\"},e5={class:\"title\"},a5={class:\"path\"},o5={key:0},n5=[\"href\"],i5={key:2,href:\"/cgi-bin/luci/admin/services/ddns\"},r5=I({setup(o){const{$gettext:n}=J(),a=E(0),l=E(!1),u=f=>{a.value=f,l.value=!0},d=f=>Boolean(f&&f!==\"Stopped\"&&f!==\"Disabled\"),c=()=>{if(l.value)return;const F=[{index:0,active:Boolean(p.value.ddnstoDomain)},{index:1,active:d(p.value.ipv4Domain)},{index:2,active:d(p.value.ipv6Domain)}].find(w=>w.active);a.value=F?F.index:0};let k=!1,g;const p=E({}),m=function(){!k||(document.hidden?Promise.resolve():G.Guide.GetDdns.GET().then(f=>{var F;f!=null&&f.data&&(((F=f==null?void 0:f.data)==null?void 0:F.success)||0)==0&&f.data.result&&(p.value=f.data.result,c())})).then(()=>{!k||(g=window.setTimeout(m,3e3))})};Pt(()=>{k=!0,g=window.setTimeout(m,1100)}),Nt(()=>{g!==void 0&&window.clearTimeout(g),k=!1});const v=()=>{b6({url:p.value.ddnstoDomain})},b=Q(()=>{const f=p.value.ipv4Domain;return!f||f==\"Stopped\"||f==\"Disabled\"?f:`http://${f}`}),y=Q(()=>{const f=p.value.ipv6Domain;return!f||f==\"Stopped\"||f==\"Disabled\"?f:`http://${f}`});return(f,F)=>(r(),Z(Wt,{title:e(n)(\"\\u8FDC\\u7A0B\\u57DF\\u540D\"),showSettings:!0,style:{width:\"100%\",height:\"100%\",display:\"block\"}},{icon:V(()=>[Y(He,{color:\"#00a63e\",class:\"icon\"})]),settings:V(()=>[t(\"div\",{class:\"btn_settings\",onClick:v},[Y(He,{color:\"#0a0a0a\",class:\"icon1 earthIcon\",style:{\"margin-right\":\"6px\"}}),dt(\" \"+i(e(n)(\"\\u57DF\\u540D\\u914D\\u7F6E\")),1)])]),default:V(()=>{var w,h,_,x,C,S;return[t(\"div\",h6,[t(\"div\",_6,[t(\"div\",{class:lt([\"item cloud\",{active:a.value==0}]),onClick:F[0]||(F[0]=A=>u(0))},[Y(He,{color:\"#155dfc\",class:\"icon2\"}),x6,(w=p.value)!=null&&w.ddnstoDomain?(r(),s(\"span\",w6,i(e(n)(\"\\u6B63\\u5E38\")),1)):(r(),s(\"span\",k6,i(e(n)(\"\\u672A\\u542F\\u52A8\")),1))],2),e(b)?(r(),s(\"div\",{key:0,class:lt([\"item memory\",{active:a.value==1}]),onClick:F[1]||(F[1]=A=>u(1))},[Y(pa,{color:\"#00a63e\",class:\"icon2\"}),y6,e(b)==\"Stopped\"||e(b)==\"Disabled\"?(r(),s(\"span\",F6,i(e(n)(\"\\u79BB\\u7EBF\")),1)):(r(),s(\"span\",E6,i(e(n)(\"\\u6B63\\u5E38\")),1))],2)):D(\"\",!0),e(y)?(r(),s(\"div\",{key:1,class:lt([\"item network\",{active:a.value==2}]),onClick:F[2]||(F[2]=A=>u(2))},[Y(g1,{class:\"icon2\"}),$6,e(y)==\"Stopped\"||e(y)==\"Disabled\"?(r(),s(\"span\",C6,i(e(n)(\"\\u79BB\\u7EBF\")),1)):(r(),s(\"span\",D6,i(e(n)(\"\\u6B63\\u5E38\")),1))],2)):D(\"\",!0)]),a.value==0?(r(),s(\"div\",B6,[t(\"div\",Y6,[A6,(h=p.value)!=null&&h.ddnstoDomain?(r(),s(\"span\",S6,i(e(n)(\"\\u6B63\\u5E38\")),1)):(r(),s(\"span\",z6,i(e(n)(\"\\u672A\\u542F\\u52A8\")),1))]),t(\"div\",P6,[t(\"div\",T6,i(e(n)(\"\\u667A\\u80FD\\u5185\\u7F51\\u7A7F\\u900F\\u670D\\u52A1\")),1),t(\"div\",I6,[(_=p.value)!=null&&_.ddnstoDomain?(r(),s(\"a\",{key:0,class:\"configure\",href:(x=p.value)==null?void 0:x.ddnstoDomain,target:\"_blank\",rel:\"noopener noreferrer\",title:(C=p.value)==null?void 0:C.ddnstoDomain},i((S=p.value)==null?void 0:S.ddnstoDomain),9,M6)):(r(),s(\"div\",L6,i(e(n)(\"\\u672A\\u5B89\\u88C5\\u6216\\u672A\\u914D\\u7F6E\")),1)),t(\"span\",null,[t(\"a\",O6,i(e(n)(\"\\u63A7\\u5236\\u53F0\")),1)])])])])):D(\"\",!0),a.value==1?(r(),s(\"div\",N6,[t(\"div\",V6,[t(\"div\",null,i(e(n)(\"\\u5F53\\u524D\\u72B6\\u6001:\")),1),e(b)==\"Stopped\"||e(b)==\"Disabled\"?(r(),s(\"span\",G6,i(e(n)(\"\\u79BB\\u7EBF\")),1)):(r(),s(\"span\",j6,i(e(n)(\"\\u6B63\\u5E38\")),1))]),t(\"div\",U6,[t(\"div\",q6,\"IPv4 \"+i(e(n)(\"\\u52A8\\u6001\\u57DF\\u540D\\u89E3\\u6790\")),1),t(\"div\",R6,[e(b)==\"Stopped\"||e(b)==\"Disabled\"?(r(),s(\"div\",W6,i(e(b)),1)):(r(),s(\"a\",{key:1,class:\"configure\",href:e(b),target:\"_blank\",rel:\"noopener noreferrer\"},i(e(b)),9,H6)),e(b)?(r(),s(\"a\",J6,[Y(ya,{class:\"icon3\"})])):D(\"\",!0)])])])):D(\"\",!0),a.value==2?(r(),s(\"div\",Z6,[t(\"div\",K6,[t(\"div\",null,i(e(n)(\"\\u5F53\\u524D\\u72B6\\u6001:\")),1),e(y)==\"Stopped\"||e(y)==\"Disabled\"?(r(),s(\"span\",Q6,i(e(n)(\"\\u79BB\\u7EBF\")),1)):(r(),s(\"span\",X6,i(e(n)(\"\\u6B63\\u5E38\")),1))]),t(\"div\",t5,[t(\"div\",e5,\"IPv6 \"+i(e(n)(\"\\u52A8\\u6001\\u57DF\\u540D\\u89E3\\u6790\")),1),t(\"div\",a5,[e(y)==\"Stopped\"||e(y)==\"Disabled\"?(r(),s(\"div\",o5,i(e(y)),1)):(r(),s(\"a\",{key:1,class:\"configure\",href:e(y),target:\"_blank\",rel:\"noopener noreferrer\"},i(e(y)),9,n5)),e(y)?(r(),s(\"a\",i5,[Y(ya,{class:\"icon3\"})])):D(\"\",!0)])])])):D(\"\",!0)])]}),_:1},8,[\"title\"]))}});var s5=N(r5,[[\"__scopeId\",\"data-v-134135a2\"]]);const d5={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},l5=[\"fill\"],u5=I({props:{color:{type:String,default:\"#2c2c2c\"}},setup(o){return(n,a)=>(r(),s(\"svg\",d5,[t(\"path\",{d:\"M879.674 544.51l-158.254-0.221c-8.534 2.287-17.305-2.776-19.588-11.307l-23.862-75.877-74.742 350.891c0 0-1.523 18.507-11.518 18.507s-26.9 0.281-26.9 0.281c-8.259 2.213-16.748-2.687-18.961-10.949l-92.741-457.648-70.305 330.634c-2.261 8.291-11.94 15.206-20.385 12.986l-24.876 0.339c-8.723 2.293-17.685-2.789-20.023-11.349L270.629 544.51 143.993 544.51c-8.831 0-15.993-7.159-15.993-15.993l0-31.986c0-8.831 7.162-15.993 15.993-15.993l157.429-0.516c9.565-0.304 17.685 0.788 20.023 9.351l24.386 76.092 68.642-358.907c0 0 3.4-10.894 14.397-10.894 10.994 0 34.107-0.448 34.107-0.448 8.262-2.213 16.751 2.687 18.965 10.949l91.912 454.126 67.948-326.182c2.213-8.262 8.707-15.161 16.965-12.948l27.316-0.333c8.531-2.287 17.301 2.776 19.588 11.31l46.665 148.4 127.337 0c8.835 0 15.993 7.162 15.993 15.993l0 31.986C895.667 537.352 888.508 544.51 879.674 544.51z\",\"p-id\":\"5314\",fill:o.color},null,8,l5)]))}}),c5=()=>{var n;const o=document.body.getAttribute(\"theme\");if(o)switch(o){case\"dark\":case\"light\":return o}return(n=window.matchMedia(\"(prefers-color-scheme: dark)\"))!=null&&n.matches?\"dark\":\"light\"},Ha=()=>c5()==\"dark\",Ja=o=>(ut(\"data-v-47c7bd93\"),o=o(),ct(),o),p5={class:\"title_box\"},f5={class:\"display_flex\"},m5={class:\"network_tag\"},g5={class:\"tag_item\"},v5=Ja(()=>t(\"div\",{class:\"tag_dn\"},null,-1)),b5={class:\"tag_item\"},h5=Ja(()=>t(\"div\",{class:\"tag_up\"},null,-1)),_5={class:\"speed\"},x5={class:\"speed_item\"},w5={style:{color:\"#1596fd\"}},k5={class:\"speed_item\"},y5={style:{color:\"#00a63e\"}},F5=I({setup(o){const{$gettext:n}=J();Xe([Ma,La,Oa,ta,ea,Na]);const a=E(),l=_=>{var C;const x=(C=a.value)==null?void 0:C[_];return!x||x.startTime==0?\"\":p(x.startTime*1e3)+\"-\"+p(x.endTime*1e3)},u=Q(()=>{var x;let _=[];return(x=a.value)==null||x.forEach(C=>{_.push({value:C.uploadSpeed})}),_}),d=Q(()=>{var x;let _=[];return(x=a.value)==null||x.forEach(C=>{_.push({value:C.downloadSpeed})}),_}),c=Q(()=>{var x;let _=\"\";if(a.value){let C=((x=a.value)==null?void 0:x.length)||0;if(C>0){let S=a.value[C-1];_=m(S.uploadSpeed)+\"/s\"}}return _}),k=Q(()=>{var x;let _=\"\";if(a.value){let C=((x=a.value)==null?void 0:x.length)||0;if(C>0){let S=a.value[C-1];_=m(S.downloadSpeed)+\"/s\"}}return _});Q(()=>{var x;let _=[];return(x=a.value)==null||x.forEach(C=>{_.push({value:C.downloadSpeed+C.uploadSpeed})}),_});const g=()=>L(this,null,function*(){var _;try{const x=yield G.Network.Statistics.GET();if(x.data&&(_=x.data.result)!=null&&_.items){const C=x.data.result.slots||10;if(x.data.result.items.length<C){let S=x.data.result.items;for(;S.length<C;)S=[{downloadSpeed:0,endTime:0,startTime:0,uploadSpeed:0}].concat(S);a.value=S}else x.data.result.items.length>C?a.value=x.data.result.items.slice(C-x.data.result.items.length):a.value=x.data.result.items}}catch(x){console.log(x)}}),p=Mt.dateForm,m=Mt.byteToSize,v=E(),b=E();let y=null,f=null,F=null;const w=_=>{const x=Ha();return y=aa(_,x?\"dark\":\"light\"),y.setOption({animation:!1,backgroundColor:x?\"#2c2c2c\":\"#fff\",color:[\"transparent\",\"transparent\"],tooltip:{trigger:\"axis\",formatter:C=>{if(Array.isArray(C)){let S=\"\";C.length>0&&(S=l(C[0].axisValue));for(let A=0;A<C.length;A++)S=`${S}<br>${C[A].seriesName}: ${m(C[A].value)}/s`;return S.toString()}else{const S=C;return`${l(S.axisValue)}<br>${S.seriesName}: ${m(S.value)}/s`}}},xAxis:{type:\"category\",boundaryGap:!1,splitLine:{lineStyle:{color:[\"#999\"]},show:!1},name:\"\",show:!1,nameGap:0,nameTextStyle:{height:0,lineHeight:0,padding:0}},title:{text:\"\",textStyle:{fontSize:12,color:x?\"#cccccc\":\"rgba(0, 0, 0, 0.6)\"},top:\"10px\",left:\"10px\"},yAxis:{type:\"value\",name:\"\",minInterval:1e4,interval:1e3,axisLabel:{formatter:function(C,S){return`${m(C)}/s`},color:\"#fff\",show:!1},nameTextStyle:{color:\"#fff\"},splitLine:{lineStyle:{color:[\"#999\"]},show:!1}},series:[{name:n(\"\\u4E0B\\u8F7D\"),data:d.value,type:\"line\",symbol:\"none\",showSymbol:!1,symbolSize:0,smooth:!0,areaStyle:{color:{type:\"linear\",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:\"rgba(32, 199, 247, 1)\"},{offset:1,color:\"rgba(32, 199, 247, 0.1)\"}],global:!1}}},{name:n(\"\\u4E0A\\u4F20\"),data:u.value,type:\"line\",symbol:\"none\",showSymbol:!1,symbolSize:0,smooth:!0,areaStyle:{color:{type:\"linear\",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:\"rgba(85, 58, 254, 1)\"},{offset:1,color:\"rgba(85, 58, 254, 0.1)\"}],global:!1}}}],grid:{left:\"2%\",right:\"2%\",bottom:\"0%\",top:\"10%\",containLabel:!0}}),y},h=()=>{if(!y||!v.value)return;const _=Math.max(v.value.clientWidth,50),x=Math.max(v.value.clientHeight,50);y.resize({width:_,height:x})};return Pt(()=>{setTimeout(()=>L(this,null,function*(){if(v.value){yield g();const _=w(v.value),x=v.value;h(),F=()=>{h()},window.addEventListener(\"resize\",F),\"ResizeObserver\"in window&&(f=new ResizeObserver(()=>{h()}),b.value&&f.observe(b.value),f.observe(x));const C=()=>L(this,null,function*(){if(y!=null){if(!document.hidden){if(yield g(),y==null)return;_.setOption({series:[{name:n(\"\\u4E0B\\u8F7D\"),data:d.value,type:\"line\",areaStyle:{},smooth:!0},{name:n(\"\\u4E0A\\u4F20\"),data:u.value,type:\"line\",areaStyle:{},smooth:!0}]}),h()}setTimeout(C,5e3)}});setTimeout(C,5e3)}}),900)}),Nt(()=>{y!=null&&(y.dispose(),y=null),F&&(window.removeEventListener(\"resize\",F),F=null),f&&(f.disconnect(),f=null)}),(_,x)=>(r(),s(\"div\",{class:\"network_container\",ref_key:\"containerRef\",ref:b},[t(\"div\",p5,[t(\"div\",f5,[Y(u5,{color:\"#20c7f7\",class:\"icon\"}),t(\"span\",null,i(e(n)(\"\\u7F51\\u7EDC\\u6D41\\u91CF\")),1)]),t(\"div\",null,[t(\"div\",m5,[t(\"div\",g5,[v5,t(\"span\",null,i(e(n)(\"\\u4E0B\\u8F7D\")),1)]),t(\"div\",b5,[h5,t(\"span\",null,i(e(n)(\"\\u4E0A\\u4F20\")),1)])])])]),t(\"div\",_5,[t(\"div\",x5,[t(\"span\",null,i(e(n)(\"\\u4E0B\\u8F7D\\u901F\\u5EA6\")),1),t(\"div\",w5,i(e(k)),1)]),t(\"div\",k5,[t(\"span\",null,i(e(n)(\"\\u4E0A\\u4F20\\u901F\\u5EA6\")),1),t(\"div\",y5,i(e(c)),1)])]),t(\"div\",{ref_key:\"el\",ref:v,class:\"echart\"},null,512)],512))}});var Fa=N(F5,[[\"__scopeId\",\"data-v-47c7bd93\"]]);const E5={width:\"32\",height:\"32\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},$5=[\"fill\"],Ea=I({props:{color:{type:String,default:\"#2c2c2c\"}},setup(o){return(n,a)=>(r(),s(\"svg\",E5,[t(\"path\",{d:\"M512 298.666667c-162.133333 0-285.866667 68.266667-375.466667 213.333333 89.6 145.066667 213.333333 213.333333 375.466667 213.333333s285.866667-68.266667 375.466667-213.333333c-89.6-145.066667-213.333333-213.333333-375.466667-213.333333z m0 469.333333c-183.466667 0-328.533333-85.333333-426.666667-256 98.133333-170.666667 243.2-256 426.666667-256s328.533333 85.333333 426.666667 256c-98.133333 170.666667-243.2 256-426.666667 256z m0-170.666667c46.933333 0 85.333333-38.4 85.333333-85.333333s-38.4-85.333333-85.333333-85.333333-85.333333 38.4-85.333333 85.333333 38.4 85.333333 85.333333 85.333333z m0 42.666667c-72.533333 0-128-55.466667-128-128s55.466667-128 128-128 128 55.466667 128 128-55.466667 128-128 128z\",fill:o.color,\"p-id\":\"5225\"},null,8,$5)]))}}),C5={width:\"32\",height:\"32\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},D5=[\"fill\"],$a=I({props:{color:{type:String,default:\"#2c2c2c\"}},setup(o){return(n,a)=>(r(),s(\"svg\",C5,[t(\"path\",{d:\"M332.8 729.6l34.133333-34.133333c42.666667 12.8 93.866667 21.333333 145.066667 21.333333 162.133333 0 285.866667-68.266667 375.466667-213.333333-46.933333-72.533333-102.4-128-166.4-162.133334l29.866666-29.866666c72.533333 42.666667 132.266667 106.666667 183.466667 192-98.133333 170.666667-243.2 256-426.666667 256-59.733333 4.266667-119.466667-8.533333-174.933333-29.866667z m-115.2-64c-51.2-38.4-93.866667-93.866667-132.266667-157.866667 98.133333-170.666667 243.2-256 426.666667-256 38.4 0 76.8 4.266667 110.933333 12.8l-34.133333 34.133334c-25.6-4.266667-46.933333-4.266667-76.8-4.266667-162.133333 0-285.866667 68.266667-375.466667 213.333333 34.133333 51.2 72.533333 93.866667 115.2 128l-34.133333 29.866667z m230.4-46.933333l29.866667-29.866667c8.533333 4.266667 21.333333 4.266667 29.866666 4.266667 46.933333 0 85.333333-38.4 85.333334-85.333334 0-12.8 0-21.333333-4.266667-29.866666l29.866667-29.866667c12.8 17.066667 17.066667 38.4 17.066666 64 0 72.533333-55.466667 128-128 128-17.066667-4.266667-38.4-12.8-59.733333-21.333333zM384 499.2c4.266667-68.266667 55.466667-119.466667 123.733333-123.733333 0 4.266667-123.733333 123.733333-123.733333 123.733333zM733.866667 213.333333l29.866666 29.866667-512 512-34.133333-29.866667L733.866667 213.333333z\",fill:o.color,\"p-id\":\"5534\"},null,8,D5)]))}}),B5={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},Y5=[\"fill\"],xe=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",B5,[t(\"path\",{d:\"M512 96c229.76 0 416 186.24 416 416S741.76 928 512 928 96 741.76 96 512 282.24 96 512 96z m-32 448l-127.317333 0.021333c0.896 20.48 2.624 40.405333 5.12 59.669334l1.984 14.293333 2.474666 15.253333c19.754667 112.896 65.728 197.738667 117.76 222.997334L480 544z m191.317333 0.021333L544 544v312.234667c50.858667-24.725333 95.936-106.368 116.373333-215.509334l1.365334-7.488 2.474666-15.232a701.013333 701.013333 0 0 0 7.104-73.984z m-382.698666 0H161.429333c11.648 129.066667 92.992 238.08 206.101334 289.066667-22.122667-34.282667-40.362667-76.416-53.76-124.032l-3.029334-11.093333-3.52-14.165334-3.242666-14.464a744.490667 744.490667 0 0 1-15.36-125.312z m573.952 0H735.36a752.661333 752.661333 0 0 1-12.672 112.128l-2.688 13.184-3.242667 14.464-3.52 14.186667c-13.653333 52.138667-32.96 98.197333-56.789333 135.104 113.109333-50.986667 194.453333-160 206.08-289.066667zM367.530667 190.890667l-2.858667 1.301333C253.013333 243.733333 172.970667 352 161.429333 480h127.189334c1.536-39.04 5.866667-76.693333 12.672-112.149333l2.688-13.184 3.242666-14.464 3.52-14.186667c13.653333-52.138667 32.96-98.197333 56.789334-135.104zM480 167.765333c-50.709333 24.618667-95.68 105.898667-116.202667 214.592l-1.536 8.405334-2.474666 15.232a701.034667 701.034667 0 0 0-7.104 74.005333H480V167.765333z m176.469333 23.146667l2.56 4.053333c20.906667 33.429333 38.229333 73.984 51.093334 119.552l3.136 11.52 3.52 14.165334 3.242666 14.464c8.362667 39.253333 13.632 81.408 15.36 125.333333h127.189334c-11.626667-129.088-92.970667-238.101333-206.101334-289.066667zM544 167.765333L544 480h127.317333a707.136 707.136 0 0 0-5.333333-61.376l-1.770667-12.629333-2.474666-15.232c-19.754667-112.874667-65.706667-197.717333-117.717334-222.997334z\",\"p-id\":\"4600\",fill:o.color},null,8,Y5)]))}}),A5={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},S5=[\"fill\"],z5=[\"fill\"],P5=I({props:{color:{type:String,default:\"#00a63e\"}},setup(o){return(n,a)=>(r(),s(\"svg\",A5,[t(\"path\",{d:\"M986.112 179.2c-12.288-12.288-31.744-12.288-44.032 0l-472.064 471.04-180.224-180.224c-12.288-12.288-31.744-12.288-44.032 0-12.288 12.288-12.288 31.744 0 44.032l202.752 201.728c6.144 6.144 12.288 9.216 22.528 9.216 9.216 0 15.36-3.072 22.528-9.216l494.592-492.544c10.24-12.288 10.24-31.744-2.048-44.032z\",fill:o.color,\"p-id\":\"11312\"},null,8,S5),t(\"path\",{d:\"M1024 548.864c0-17.408-14.336-31.744-31.744-31.744-17.408 0-31.744 14.336-31.744 31.744C941.056 779.264 747.52 959.488 513.024 959.488 265.216 959.488 64.512 759.808 64.512 512c0-247.808 200.704-447.488 448.512-447.488 69.632 0 135.168 15.36 194.56 44.032h1.024c4.096 1.024 7.168 2.048 11.264 2.048 17.408 0 31.744-14.336 31.744-31.744 0-12.288-7.168-23.552-17.408-28.672C665.6 17.408 590.848 0 513.024 0 229.376 0 0 229.376 0 512s229.376 512 513.024 512c270.336 0 491.52-208.896 510.976-475.136z\",fill:o.color,\"p-id\":\"11313\"},null,8,z5)]))}}),T5={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},I5=[\"fill\"],M5=I({props:{color:{type:String,default:\"#e7000b\"}},setup(o){return(n,a)=>(r(),s(\"svg\",T5,[t(\"path\",{d:\"M511.9744 706.6624a57.2672 57.2672 0 0 1 56.96 57.5488c0 20.5568-10.8544 39.552-28.4672 49.8432a56.4736 56.4736 0 0 1-56.9856 0 57.6512 57.6512 0 0 1-28.4928-49.8432c0-31.7696 25.4976-57.5488 56.9856-57.5488zM190.1824 147.3024l2.4832 2.2272 614.4 614.4a30.72 30.72 0 0 1-40.96 45.696l-2.4832-2.2528-229.4528-229.504a189.6704 189.6704 0 0 0-180.864 83.8912 29.3376 29.3376 0 0 1-40.9344 7.3728 30.976 30.976 0 0 1-8.32-41.6768 248.8576 248.8576 0 0 1 170.624-109.056l-78.7968-78.7968a346.8288 346.8288 0 0 0-156.7744 112.128 29.4144 29.4144 0 0 1-50.944-8.4224 31.0784 31.0784 0 0 1 4.736-30.0544 406.9888 406.9888 0 0 1 156.1088-120.4736l-71.9872-72.0128a504.7808 504.7808 0 0 0-150.6816 120.32 29.2864 29.2864 0 0 1-41.9328 2.7904 31.0016 31.0016 0 0 1-2.9184-42.88 564.608 564.608 0 0 1 150.8608-124.928L149.2224 192.9472a30.72 30.72 0 0 1 40.96-45.6704z m321.792 211.6352a404.992 404.992 0 0 1 319.0528 154.368 30.976 30.976 0 0 1-4.3008 42.8288 29.184 29.184 0 0 1-41.9072-4.4032 345.984 345.984 0 0 0-229.7088-129.2032l-63.1552-63.104c6.656-0.3328 13.312-0.4864 20.0192-0.4864z m0-156.6976c166.1184 0 322.9952 72.448 430.4896 198.8608 10.752 12.672 9.472 31.872-2.8416 42.9312a29.184 29.184 0 0 1-42.0352-2.9184 505.344 505.344 0 0 0-385.6128-177.92 509.184 509.184 0 0 0-105.2672 11.008l-50.2272-50.2784A566.656 566.656 0 0 1 512 202.24z\",\"p-id\":\"5359\",fill:o.color},null,8,I5)]))}}),L5={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},O5=[\"fill\"],N5=[\"fill\"],V5=[\"fill\"],G5=I({props:{color:{type:String,default:\"#f54900\"}},setup(o){return(n,a)=>(r(),s(\"svg\",L5,[t(\"path\",{d:\"M512 179.2l390.4 627.2H128l384-627.2m0-64c-19.2 0-44.8 12.8-51.2 32l-390.4 627.2c-25.6 44.8 6.4 96 51.2 96H896c51.2 0 83.2-57.6 51.2-96l-384-627.2c-6.4-19.2-32-32-51.2-32z\",fill:o.color,\"p-id\":\"4490\"},null,8,O5),t(\"path\",{d:\"M512 640c-19.2 0-32-12.8-32-32v-192c0-19.2 12.8-32 32-32s32 12.8 32 32v192c0 19.2-12.8 32-32 32z\",fill:o.color,\"p-id\":\"4491\"},null,8,N5),t(\"path\",{d:\"M512 723.2m-32 0a32 32 0 1 0 64 0 32 32 0 1 0-64 0Z\",fill:o.color,\"p-id\":\"4492\"},null,8,V5)]))}}),j5={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},U5=[\"fill\"],Za=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",j5,[t(\"path\",{d:\"M511.3 116.7l339.1 193.8v387.6L511.3 891.9 172.2 698.1V310.5l339.1-193.8zM802 345.6L535.5 516.7v305.5L802 670V345.6z m-581.4 0.3V670l266.5 152.3V516.7L220.6 345.9z m434.1-87.3L401.1 405l110.3 71.4 248.9-161.5L658 256.4c-1.1 0.7-2.2 1.5-3.3 2.2z m-143.4-86L262.2 314.9l93.4 60.5c0.5-0.4 1.1-0.7 1.6-1l252.3-145.7-98.2-56.1z m0 0\",fill:o.color,\"p-id\":\"14790\"},null,8,U5)]))}}),q5={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},R5=[\"fill\"],W5=[\"fill\"],H5=[\"fill\"],ze=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",q5,[t(\"path\",{d:\"M723 620.5C666.8 571.6 593.4 542 513 542s-153.8 29.6-210.1 78.6c-3.2 2.8-3.6 7.8-0.8 11.2l36 42.9c2.9 3.4 8 3.8 11.4 0.9C393.1 637.2 450.3 614 513 614s119.9 23.2 163.5 61.5c3.4 2.9 8.5 2.5 11.4-0.9l36-42.9c2.8-3.3 2.4-8.3-0.9-11.2zM840.4 480.4C751.7 406.5 637.6 362 513 362s-238.7 44.5-327.5 118.4c-3.4 2.8-3.8 7.9-1 11.3l36 42.9c2.8 3.4 7.9 3.8 11.2 1C308 472.2 406.1 434 513 434s205 38.2 281.2 101.6c3.4 2.8 8.4 2.4 11.2-1l36-42.9c2.8-3.4 2.4-8.5-1-11.3z\",\"p-id\":\"5126\",fill:o.color},null,8,R5),t(\"path\",{d:\"M957.1 341.4C835.7 241.8 680.3 182 511 182c-168.2 0-322.6 59-443.7 157.4-3.5 2.8-4 7.9-1.1 11.4l36 42.9c2.8 3.3 7.8 3.8 11.1 1.1C222 306.7 360.3 254 511 254c151.8 0 291 53.5 400 142.7 3.4 2.8 8.4 2.3 11.2-1.1l36-42.9c2.9-3.4 2.4-8.5-1.1-11.3z\",\"p-id\":\"5127\",fill:o.color},null,8,W5),t(\"path\",{d:\"M512 778m-64 0a64 64 0 1 0 128 0 64 64 0 1 0-128 0Z\",\"p-id\":\"5128\",fill:o.color},null,8,H5)]))}}),J5=[\"onSubmit\"],Z5={class:\"actioner-dns_header\"},K5={class:\"actioner-dns_body\"},Q5={class:\"label-item\"},X5={class:\"label-item_key\"},t3={class:\"label-item_value\"},e3=[\"disabled\"],a3={value:\"manual\"},o3={class:\"label-item\"},n3={class:\"label-item_key\"},i3={class:\"label-item_value\"},r3=[\"placeholder\",\"onUpdate:modelValue\"],s3={class:\"label-item_key\"},d3={class:\"label-item_value\"},l3=[\"placeholder\",\"onUpdate:modelValue\"],u3={key:1,class:\"label-message\"},c3={class:\"actioner-dns_footer\"},p3=[\"disabled\"],f3={key:1,class:\"actioner-dns\"},m3={class:\"actioner-dns_header\"},g3={class:\"actioner-dns_body\"},v3={class:\"config-message\"},b3={class:\"actioner-dns_footer\"},h3=I({props:{Close:{type:Function,required:!0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=E(0),d=Fe(),c=d.status,k=Q(()=>d.status.proto!=\"static\"),g=()=>{let F=c.dnsList||[];for(F=F.filter(w=>w);F.length<2;)F.push(\"\");return F},p=E({interfaceName:c.defaultInterface||\"\",dnsProto:c.dnsProto||\"manual\",manualDnsIp:g()}),m=E(\"\"),v=E(!1),b=()=>L(this,null,function*(){m.value=\"\";let F={};switch(p.value.dnsProto){case\"auto\":break;case\"manual\":if(F.manualDnsIp=[],!p.value.manualDnsIp[0]){$.Error(a(\"\\u81F3\\u5C11\\u9700\\u8981\\u586B\\u5199\\u4E00\\u4E2ADNS\"));return}F.manualDnsIp=p.value.manualDnsIp.filter(h=>h);break}F.dnsProto=p.value.dnsProto,F.interfaceName=p.value.interfaceName;const w=$.Loading(a(\"\\u914D\\u7F6E\\u4E2D...\"));try{const h=yield G.Guide.DnsConfig.POST(F);if(h!=null&&h.data){const{success:_,error:x}=h==null?void 0:h.data;x&&(m.value=x),(_==null||_==0)&&($.Success(a(\"\\u914D\\u7F6E\\u6210\\u529F\")),u.value=1)}}catch(h){m.value=h}w.Close()}),y=F=>{F.preventDefault(),n.Close&&n.Close()},f=F=>{location.reload()};return(F,w)=>(r(),Z(wt,{Close:o.Close,type:1},{default:V(()=>[u.value==0?(r(),s(\"form\",{key:0,class:\"actioner-dns\",onSubmit:ft(b,[\"prevent\"])},[t(\"div\",Z5,[t(\"span\",null,i(e(a)(\"DNS\\u914D\\u7F6E\")),1)]),t(\"div\",K5,[t(\"div\",Q5,[t(\"div\",X5,[t(\"span\",null,i(e(a)(\"DNS\\u9009\\u9879\")),1)]),t(\"div\",t3,[O(t(\"select\",{\"onUpdate:modelValue\":w[0]||(w[0]=h=>p.value.dnsProto=h)},[t(\"option\",{value:\"auto\",disabled:!e(k)},i(e(a)(\"\\u81EA\\u52A8\\u83B7\\u53D6DNS\")),9,e3),t(\"option\",a3,i(e(a)(\"\\u81EA\\u5B9A\\u4E49DNS\")),1)],512),[[pt,p.value.dnsProto]])])]),p.value.dnsProto==\"manual\"?(r(!0),s(U,{key:0},tt(p.value.manualDnsIp,(h,_)=>(r(),s(\"div\",o3,[_==0?(r(),s(U,{key:0},[t(\"div\",n3,[t(\"span\",null,i(e(a)(\"DNS\\u670D\\u52A1\\u5668\\u5730\\u5740\")),1)]),t(\"div\",i3,[O(t(\"input\",{type:\"text\",placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165DNS\\u5730\\u5740\"),required:\"\",\"onUpdate:modelValue\":x=>p.value.manualDnsIp[_]=x},null,8,r3),[[at,p.value.manualDnsIp[_],void 0,{trim:!0}]])])],64)):(r(),s(U,{key:1},[t(\"div\",s3,i(e(a)(\"\\u5907\\u7528DNS\\u670D\\u52A1\\u5668\\u5730\\u5740\")),1),t(\"div\",d3,[O(t(\"input\",{type:\"text\",placeholder:e(a)(\"\\u5907\\u7528DNS\\u5730\\u5740\"),\"onUpdate:modelValue\":x=>p.value.manualDnsIp[_]=x},null,8,l3),[[at,p.value.manualDnsIp[_],void 0,{trim:!0}]])])],64))]))),256)):D(\"\",!0),m.value?(r(),s(\"div\",u3,i(m.value),1)):D(\"\",!0)]),t(\"div\",c3,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",disabled:v.value},i(e(a)(\"\\u786E\\u8BA4\")),9,p3),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:y},i(e(a)(\"\\u53D6\\u6D88\")),1)])],40,J5)):u.value==1?(r(),s(\"div\",f3,[t(\"div\",m3,[t(\"span\",null,i(e(a)(\"DNS\\u914D\\u7F6E\")),1)]),t(\"div\",g3,[t(\"div\",v3,i(e(a)(\"DNS\\u914D\\u7F6E\\u5DF2\\u4FDD\\u5B58\")),1)]),t(\"div\",b3,[t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:f},i(e(a)(\"\\u5B8C\\u6210\")),1)])])):D(\"\",!0)]),_:1},8,[\"Close\"]))}});var _3=N(h3,[[\"__scopeId\",\"data-v-5cff2770\"]]);const Ka=()=>{const o=document.createElement(\"div\");document.body.appendChild(o);const n=xt(_3,{Close:()=>{a()}});n.mount(o);const a=()=>{n.unmount(),o.remove()};return{Close:a}},x3=[\"onSubmit\"],w3={class:\"actioner-dns_header\"},k3={class:\"actioner-dns_body\"},y3={class:\"label-item\"},F3={class:\"label-item_key\"},E3={class:\"label-item_value\"},$3={class:\"item_info\"},C3={class:\"label-item\"},D3={class:\"label-item_key\"},B3={class:\"label-item_value\"},Y3={selected:\"true\",value:\"\"},A3=[\"value\"],S3={class:\"actioner-dns_footer\"},z3=[\"disabled\"],P3={key:1,class:\"actioner-dns\"},T3={class:\"actioner-dns_header\"},I3={class:\"softsource_tit\"},M3={class:\"actioner-dns_body\"},L3={class:\"finished\"},O3={class:\"successed\"},N3={class:\"btns\"},V3=I({props:{Close:{type:Function,required:!0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=E(0),d=E(\"\"),c=E(),k=E();(()=>{G.Guide.SoftSourceList.GET().then(b=>{var y,f;if((y=b==null?void 0:b.data)!=null&&y.result){const F=(f=b==null?void 0:b.data)==null?void 0:f.result;k.value=F}}).then(()=>G.Guide.GetSoftSource.GET()).then(b=>{var y,f;if((y=b==null?void 0:b.data)!=null&&y.result){const F=b.data.result;c.value=F.softSource,(f=k.value)!=null&&f.softSourceList.find(w=>w.identity==F.softSource.identity)&&(d.value=F.softSource.identity)}})})();const p=b=>{b.preventDefault(),n.Close&&n.Close()},m=b=>{const y=$.Loading(a(\"\\u6B63\\u5728\\u5207\\u6362\\u4E2D...\"));G.Guide.SoftSource.POST({softSourceIdentity:d.value}).then(f=>{if(f!=null&&f.data){if((f.data.success||0)==0){u.value=1;return}else if(f.data.error)throw f.data.error}throw a(\"\\u672A\\u77E5\\u9519\\u8BEF\")}).catch(f=>{$.Error(f)}).finally(()=>y.Close())},v=b=>{b.preventDefault(),location.reload()};return(b,y)=>(r(),Z(wt,{Close:o.Close,type:1},{default:V(()=>{var f,F;return[u.value==0?(r(),s(\"form\",{key:0,class:\"actioner-dns\",onSubmit:ft(m,[\"prevent\"])},[t(\"div\",w3,[t(\"span\",null,i(e(a)(\"\\u8F6F\\u4EF6\\u6E90\\u914D\\u7F6E\")),1)]),t(\"div\",k3,[t(\"div\",y3,[t(\"div\",F3,[t(\"span\",null,i(e(a)(\"\\u5F53\\u524D\\u8F6F\\u4EF6\\u6E90\")),1)]),t(\"div\",E3,[t(\"p\",$3,i((f=c.value)==null?void 0:f.name),1)])]),t(\"div\",C3,[t(\"div\",D3,[t(\"span\",null,i(e(a)(\"\\u5207\\u6362\\u8F6F\\u4EF6\\u6E90\")),1)]),t(\"div\",B3,[O(t(\"select\",{name:\"\",id:\"\",\"onUpdate:modelValue\":y[0]||(y[0]=w=>d.value=w)},[t(\"option\",Y3,i(e(a)(\"\\u8BF7\\u9009\\u62E9\\u8F6F\\u4EF6\\u6E90\")),1),(r(!0),s(U,null,tt((F=k.value)==null?void 0:F.softSourceList,(w,h)=>(r(),s(\"option\",{value:w.identity,key:h},i(w.name),9,A3))),128))],512),[[pt,d.value,void 0,{trim:!0}]])])])]),t(\"div\",S3,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",disabled:d.value==\"\"},i(e(a)(\"\\u786E\\u8BA4\")),9,z3),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:p},i(e(a)(\"\\u53D6\\u6D88\")),1)])],40,x3)):D(\"\",!0),u.value==1?(r(),s(\"form\",P3,[t(\"div\",T3,[t(\"span\",I3,i(e(a)(\"\\u8F6F\\u4EF6\\u6E90\\u914D\\u7F6E\")),1)]),t(\"div\",M3,[t(\"div\",L3,[Y(ua)]),t(\"p\",O3,i(e(a)(\"\\u914D\\u7F6E\\u6210\\u529F\\uFF01\")),1),t(\"div\",N3,[t(\"button\",{class:\"cbi-button cbi-button-apply softsource_successed\",onClick:v},i(e(a)(\"\\u786E\\u5B9A\")),1)])])])):D(\"\",!0)]}),_:1},8,[\"Close\"]))}});var G3=N(V3,[[\"__scopeId\",\"data-v-3f8f9931\"]]);const Qa=()=>{const o=document.createElement(\"div\");document.body.appendChild(o);const n=xt(G3,{Close:()=>{a()}});n.mount(o);const a=()=>{n.unmount(),o.remove()};return{Close:a}},j3=o=>(ut(\"data-v-24e35542\"),o=o(),ct(),o),U3={class:\"info_content\"},q3={key:0,class:\"status_box\"},R3={class:\"status_name\"},W3={class:\"status_time\"},H3={key:1,class:\"status_box\"},J3={class:\"flex\"},Z3={class:\"status_name\"},K3={class:\"dns-btn\"},Q3={class:\"status_time\",style:{background:\"#ffe2e2\",color:\"#c10007\"}},X3={key:2,class:\"status_box\"},t8={class:\"flex\"},e8={class:\"status_name\"},a8={class:\"dns-btn\"},o8={class:\"status_time\",style:{background:\"#ffe2e2\",color:\"#c10007\"}},n8={key:3,class:\"status_box\"},i8={class:\"status_name\"},r8={class:\"status_time\",style:{background:\"#ffe2e2\",color:\"#c10007\"}},s8={key:4,class:\"status_box\"},d8={class:\"status_name\"},l8={class:\"ip_info\"},u8={class:\"ip_item\"},c8={class:\"ip_action\"},p8={class:\"ip_tag\"},f8={key:0,class:\"ip_address\"},m8={key:1,class:\"ip_address\"},g8={class:\"ip_info\"},v8={class:\"ip_item\"},b8=j3(()=>t(\"div\",null,\"IPv6\",-1)),h8={key:0,class:\"ip_action\"},_8={key:1,class:\"ip_tag\"},x8={key:0,class:\"ip_address\"},w8={key:1,class:\"ip_address\"},k8={class:\"ip_info\",style:{\"margin-bottom\":\"0\"}},y8={class:\"ip_item\"},F8={class:\"ip_address\"},E8=I({setup(o){const{$gettext:n}=J(),a=Fe(),l=Pe(),u=\"***************************************\",d=()=>{const x=E(!1),C=E(60);let S=null;const A=()=>{S!==null&&(clearInterval(S),S=null)},z=()=>{C.value>0?C.value--:A()},B=()=>{A(),S=setInterval(z,1e3)};$t(C,M=>{M===0&&(x.value=!1)});const H=()=>{x.value=!x.value,x.value?(C.value=60,B()):(C.value=60,A())};return Nt(A),{isShow:x,toggle:H}},{isShow:c,toggle:k}=d(),{isShow:g,toggle:p}=d(),m=Q(()=>a.status),v=()=>{Ka()},b=()=>{Qa()};Q(()=>a.deviceList);const y=gt({portList:[],load:!1}),f=x=>{switch(x){case\"pppoe\":return n(\"\\u62E8\\u53F7\\u4E0A\\u7F51\");case\"static\":return n(\"\\u9759\\u6001\\u7F51\\u7EDC\");case\"dhcp\":return\"DHCP\"}return x&&x.toUpperCase()},F=x=>{switch(x){case\"manual\":return n(\"\\u624B\\u52A8\\u914D\\u7F6E\");case\"auto\":return n(\"\\u81EA\\u52A8\\u83B7\\u53D6\");default:return\"\"}},w=()=>{(y.load&&document.hidden?Promise.resolve():G.Network.PortList.GET().then(x=>{if(x!=null&&x.data){const{result:C}=x==null?void 0:x.data;C&&(y.portList=C.ports||[])}})).finally(()=>{y.load=!0,setTimeout(w,1e4)})};w();const h=Mt.stampForm,_=()=>{l.push(\"/devicemanagement\")};return(x,C)=>(r(),s(\"div\",null,[Y(Wt,{title:e(n)(\"\\u7F51\\u7EDC\\u8FDE\\u63A5\\u548CIP\\u5730\\u5740\"),showSettings:!0},{settings:V(()=>[t(\"div\",{class:\"device-manage-btn\",onClick:_},[Y(pa,{color:\"#3a3a3a\",class:\"device-manage-icon\"}),dt(\" \"+i(e(n)(\"\\u8BBE\\u5907\\u7BA1\\u7406\")),1)])]),icon:V(()=>[Y(xe,{color:\"#0a0a0a\",class:\"icon networkIcon\"})]),default:V(()=>[t(\"div\",U3,[e(m)!=null?(r(),s(U,{key:0},[e(m).networkInfo==\"netSuccess\"?(r(),s(\"div\",q3,[t(\"div\",R3,[Y(P5,{color:\"#00a63e\",class:\"icon\"}),t(\"span\",null,i(e(n)(\"\\u7F51\\u7EDC\\u8FDE\\u63A5\\u6B63\\u5E38\")),1)]),t(\"div\",W3,i(e(h)(e(m).uptimeStamp)),1)])):e(m).networkInfo==\"dnsFailed\"?(r(),s(\"div\",H3,[t(\"div\",J3,[t(\"div\",Z3,[Y(G5,{style:{width:\"1.2rem\",height:\"1.2rem\",\"margin-right\":\"4px\"}}),t(\"span\",null,i(e(n)(\"DNS\\u9519\\u8BEF\")),1)]),t(\"div\",K3,[t(\"button\",{class:\"btn-primary\",onClick:v},i(e(n)(\"DNS\\u914D\\u7F6E\")),1)])]),t(\"div\",Q3,i(e(h)(e(m).uptimeStamp)),1)])):e(m).networkInfo==\"softSourceFailed\"?(r(),s(\"div\",X3,[t(\"div\",t8,[t(\"div\",e8,[Y(Za,{color:\"#9810fa\",style:{width:\"1.5rem\",height:\"1.5rem\",\"margin-right\":\"4px\"}}),t(\"span\",null,i(e(n)(\"\\u8F6F\\u4EF6\\u6E90\\u9519\\u8BEF\")),1)]),t(\"div\",a8,[t(\"button\",{class:\"btn-pink\",onClick:b},i(e(n)(\"\\u8F6F\\u4EF6\\u6E90\\u914D\\u7F6E\")),1)])]),t(\"div\",o8,i(e(h)(e(m).uptimeStamp)),1)])):e(m).networkInfo==\"netFailed\"?(r(),s(\"div\",n8,[t(\"div\",i8,[Y(M5,{style:{width:\"1.2rem\",height:\"1.2rem\",\"margin-right\":\"4px\"}}),t(\"span\",null,i(e(n)(\"\\u672A\\u8054\\u7F51\")),1)]),t(\"div\",r8,i(e(h)(e(m).uptimeStamp)),1)])):(r(),s(\"div\",s8,[t(\"div\",d8,[Y(ze,{color:\"#d08700\",class:\"icon\"}),t(\"span\",null,i(e(n)(\"\\u68C0\\u6D4B\\u4E2D...\")),1)])]))],64)):D(\"\",!0),t(\"div\",l8,[t(\"div\",u8,[t(\"div\",null,\"IPv4 \\uFF08\"+i(e(m).defaultInterface)+\"\\uFF09\",1),t(\"div\",c8,[t(\"div\",p8,i(f(e(m).proto||\"\")),1),e(m).ipv4addr?(r(),s(\"div\",{key:0,class:\"ip_tag\",style:{cursor:\"pointer\"},onClick:C[0]||(C[0]=(...S)=>e(k)&&e(k)(...S))},[e(c)?(r(),Z($a,{key:0})):(r(),Z(Ea,{key:1})),dt(\" \"+i(e(n)(\"\\u5DF2\\u542F\\u7528\")),1)])):D(\"\",!0)])]),e(m).ipv4addr?(r(),s(\"div\",f8,i(e(c)?e(m).ipv4addr:u),1)):(r(),s(\"div\",m8,\"-\"))]),t(\"div\",g8,[t(\"div\",v8,[b8,e(m).ipv6addr?(r(),s(\"div\",h8,[t(\"div\",{class:\"ip_tag\",style:{cursor:\"pointer\"},onClick:C[1]||(C[1]=(...S)=>e(p)&&e(p)(...S))},[e(g)?(r(),Z($a,{key:0})):(r(),Z(Ea,{key:1})),dt(\" \"+i(e(n)(\"\\u5DF2\\u542F\\u7528\")),1)])])):(r(),s(\"div\",_8,i(e(n)(\"\\u672A\\u542F\\u7528\")),1))]),e(m).ipv6addr?(r(),s(\"div\",x8,i(e(g)?e(m).ipv6addr:u),1)):(r(),s(\"div\",w8,\"-\"))]),t(\"div\",k8,[t(\"div\",y8,[t(\"div\",null,\"DNS\\uFF08\"+i(F(e(m).dnsProto))+\"\\uFF09\",1)]),(r(!0),s(U,null,tt(e(m).dnsList,S=>(r(),s(\"div\",F8,i(S),1))),256))])])]),_:1},8,[\"title\"])]))}});var $8=N(E8,[[\"__scopeId\",\"data-v-24e35542\"]]);const C8={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},D8=[\"fill\"],Ca=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",C8,[t(\"path\",{d:\"M170.666667 647.253333a128.042667 128.042667 0 1 0 85.333333 0V256c0-71.850667 49.109333-128 106.666667-128S469.333333 184.149333 469.333333 256v512c0 116.650667 84.608 213.333333 192 213.333333s192-96.682667 192-213.333333V376.746667a128.042667 128.042667 0 1 0-85.333333 0V768c0 71.850667-49.109333 128-106.666667 128S554.666667 839.850667 554.666667 768V256c0-116.650667-84.608-213.333333-192-213.333333S170.666667 139.349333 170.666667 256v391.253333zM768 256a42.666667 42.666667 0 1 1 85.333333 0 42.666667 42.666667 0 0 1-85.333333 0zM213.333333 810.666667a42.666667 42.666667 0 1 1 0-85.333334 42.666667 42.666667 0 0 1 0 85.333334z\",fill:o.color,\"p-id\":\"39967\"},null,8,D8)]))}}),B8={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},Y8=[\"fill\"],fa=I({props:{color:{type:String,default:\"#0a0a0a\"}},setup(o){return(n,a)=>(r(),s(\"svg\",B8,[t(\"path\",{d:\"M680.64 960a61.184 61.184 0 0 1-44.864-19.072c-14.72-16.192-61.568-58.24-99.84-58.24-38.016 0-85.504 42.24-99.2 57.088a61.184 61.184 0 0 1-67.328 14.08l-1.28-0.448-116.352-65.088-1.152-0.832a55.872 55.872 0 0 1-18.752-67.456c0.064-0.192 10.752-24.768 10.752-47.232a123.52 123.52 0 0 0-123.392-123.328h-4.864c-19.52 0-35.392-17.28-40.448-44.096C73.6 603.2 64 552.384 64 512.384c0-40.064 9.536-90.88 9.92-92.992 5.12-27.136 21.376-44.544 41.152-44.096h4.16A123.52 123.52 0 0 0 242.56 251.904c0-22.4-10.688-46.976-10.816-47.232a55.68 55.68 0 0 1 18.944-67.392l1.216-0.832L374.72 68.992l1.28-0.576a62.336 62.336 0 0 1 67.2 13.888c14.528 15.296 60.48 54.848 97.664 54.848 36.8 0 82.496-38.784 96.96-53.76a62.336 62.336 0 0 1 67.264-13.44l1.28 0.64 118.592 65.92 1.152 0.768a55.808 55.808 0 0 1 18.816 67.456c-0.064 0.192-10.752 24.768-10.752 47.168a123.52 123.52 0 0 0 123.392 123.392h4.096c19.84-0.448 36.096 16.96 41.216 44.096 0.384 2.112 9.92 52.928 9.92 92.992 0 40-9.536 90.88-9.92 92.992-5.12 27.136-21.376 44.48-41.216 44.096h-4.096A123.52 123.52 0 0 0 834.176 772.8c0 22.4 10.688 47.04 10.752 47.232a55.808 55.808 0 0 1-18.816 67.456l-1.216 0.832-120.64 66.624-1.28 0.576a56.32 56.32 0 0 1-22.4 4.48z m-3.648-56.832a7.68 7.68 0 0 0 3.84 0.96l112.704-62.336c-2.688-6.272-15.168-36.992-15.168-68.928a179.456 179.456 0 0 1 169.856-179.008c1.344-7.552 8.768-49.792 8.768-81.472 0-31.68-7.424-73.92-8.768-81.472a179.456 179.456 0 0 1-169.856-179.008c0-32 12.48-62.72 15.168-68.992L682.688 121.28h-0.448c-1.92 0-3.648 0.64-4.288 1.088-1.856 1.92-17.92 18.24-40.96 34.432-34.24 24.064-66.56 36.224-96.064 36.224-29.888 0-62.464-12.416-96.832-36.928a313.792 313.792 0 0 1-41.216-35.072 8.832 8.832 0 0 0-4.736-1.152l-114.816 63.104c2.752 6.4 15.168 36.992 15.168 68.928A179.456 179.456 0 0 1 128.64 430.912c-1.344 7.552-8.768 49.792-8.768 81.472 0 31.68 7.424 73.92 8.768 81.408A179.456 179.456 0 0 1 298.496 772.8c0 32.128-12.544 62.912-15.232 69.12L392 902.72a7.68 7.68 0 0 0 3.84-0.896c2.048-2.24 18.304-19.456 41.6-36.608 34.944-25.536 68.032-38.464 98.56-38.464 30.72 0 64.064 13.184 99.2 39.232 23.488 17.472 39.744 34.944 41.792 37.184zM536.32 676.032a164.48 164.48 0 0 1-164.288-164.288A164.48 164.48 0 0 1 536.32 347.52a164.48 164.48 0 0 1 164.352 164.288A164.48 164.48 0 0 1 536.32 676.096z m0-272.64c-59.776 0-108.352 48.64-108.352 108.352 0 59.776 48.64 108.416 108.352 108.416 59.84 0 108.416-48.64 108.416-108.416 0-59.776-48.64-108.416-108.416-108.416z\",fill:o.color,\"p-id\":\"4508\"},null,8,Y8)]))}}),A8=[\"value\",\"checked\",\"onChange\"],S8={class:\"content\"},z8=[\"onMouseenter\"],P8={class:\"name\"},T8={key:0,class:\"speed\",style:{background:\"#f3f4f6\",color:\"#4a5565\"}},I8={style:{display:\"flex\",\"align-items\":\"center\"}},M8={key:0,class:\"status\"},L8={key:1,class:\"status\"},O8={key:2,class:\"speed\",style:{\"margin-left\":\"6px\"}},N8=I({setup(o){const{$gettext:n}=J(),a=Pe(),l=E(!1),u=ra(),d=gt({portList:[],load:!1}),c=()=>{a.push(\"/interfaceconfig\")},k=(h,_)=>{localStorage.setItem(h,JSON.stringify(_))},g=h=>{const _=localStorage.getItem(h);try{return _?JSON.parse(_):[]}catch(x){return[]}},p=\"checkedPorts\",m=E(g(p)),v=E([]),b=()=>{(d.load&&document.hidden?Promise.resolve():G.Network.PortList.GET().then(h=>{if(h!=null&&h.data){const{result:_}=h==null?void 0:h.data;_&&(d.portList=_.ports||[],v.value=_.ports||[])}})).finally(()=>{d.load=!0,setTimeout(b,1e4)})};b(),$t(m,h=>{v.value=d.portList.filter(_=>h.includes(_.name)),console.log(h,\"newVal\"),k(p,h)});const y=(h,_)=>{_.target.checked?m.value.includes(h)||(m.value=[...m.value,h]):m.value.length>1?m.value=m.value.filter(x=>x!==h):($.Warning(n(\"\\u81F3\\u5C11\\u4FDD\\u7559\\u4E00\\u4E2A\\u7F51\\u7EDC\\u63A5\\u53E3\\uFF01\")),_.target.checked=!0)},f=E(null),F=(h,_)=>{u.portitemStyle.show=!0;const x=_==null?void 0:_.target;if(x){const{left:C,top:S}=x.getBoundingClientRect();u.portitemStyle.left=C,u.portitemStyle.top=S}u.portitemStyle.portitem=h},w=()=>{u.portitemStyle.show=!1};return(h,_)=>(r(),Z(Wt,{title:e(n)(\"\\u7F51\\u7EDC\\u63A5\\u53E3\\u72B6\\u6001\"),showSettings:!0,\"is-settings-menu-open\":l.value,\"onUpdate:isSettingsMenuOpen\":_[0]||(_[0]=x=>l.value=x)},{icon:V(()=>[Y(Ca,{color:\"#0a0a0a\",class:\"icon interfaceIcon\"})]),settings:V(()=>[t(\"div\",{class:\"btn_settings\",onClick:c},[Y(fa,{color:\"#0a0a0a\",class:\"icon1 interfaceIcon\",style:{\"margin-right\":\"6px\"}}),t(\"span\",null,i(e(n)(\"\\u914D\\u7F6E\\u7F51\\u7EDC\\u63A5\\u53E3\")),1)])]),\"settings-menu\":V(()=>[t(\"div\",null,[(r(!0),s(U,null,tt(e(d).portList,x=>(r(),s(\"div\",{key:x.name,class:\"row\"},[t(\"input\",{type:\"checkbox\",value:x.name,checked:m.value.includes(x.name),onChange:C=>y(x.name,C)},null,40,A8),t(\"span\",null,i(x.name),1)]))),128))])]),default:V(()=>[t(\"div\",S8,[e(d).load?(r(!0),s(U,{key:0},tt(e(d).portList,x=>(r(),s(\"div\",{class:\"item\",ref_for:!0,ref_key:\"el\",ref:f,onMouseenter:C=>F(x,C),onMouseleave:w},[t(\"div\",{class:\"icon_box\",style:ht({backgroundColor:x.linkState==\"DOWN\"?\"#f3f4f6\":\"#dbfce7\"})},[Y(Ca,{color:x.linkState==\"DOWN\"?\"#99a1af\":\"#00a63e\",class:\"icon2\"},null,8,[\"color\"])],4),t(\"div\",null,[t(\"div\",P8,[dt(i(x.name)+\" \"+i(x.interfaceNames?`(${x.interfaceNames.join(\",\").toLocaleUpperCase()})`:\"\"),1),x.linkState==\"DOWN\"?(r(),s(\"div\",T8,i(e(n)(\"\\u5DF2\\u65AD\\u5F00\")),1)):D(\"\",!0)]),t(\"div\",I8,[x.linkState==\"DOWN\"?(r(),s(\"div\",M8,i(e(n)(\"\\u672A\\u8FDE\\u63A5\")),1)):(r(),s(\"div\",L8,i(e(n)(\"\\u5DF2\\u8FDE\\u63A5\")),1)),x.linkSpeed?(r(),s(\"div\",O8,i(x.linkSpeed),1)):D(\"\",!0)])])],40,z8))),256)):D(\"\",!0)])]),_:1},8,[\"title\",\"is-settings-menu-open\"]))}});var Da=N(N8,[[\"__scopeId\",\"data-v-3ebe4ebd\"]]);const V8={viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\",width:\"32\",height:\"32\"},G8=[\"fill\"],j8=[\"fill\"],U8=[\"fill\"],q8=[\"fill\"],R8=I({props:{color:{type:String,default:\"#ffffff\"}},setup(o){return(n,a)=>(r(),s(\"svg\",V8,[t(\"path\",{d:\"M384 480 96 480C44.8 480 0 435.2 0 384L0 96C0 44.8 44.8 0 96 0L384 0c51.2 0 96 44.8 96 96L480 384C480 435.2 435.2 480 384 480z\",fill:o.color,\"p-id\":\"6495\"},null,8,G8),t(\"path\",{d:\"M384 1024 96 1024C44.8 1024 0 979.2 0 928L0 640c0-51.2 44.8-96 96-96L384 544c51.2 0 96 44.8 96 96l0 281.6C480 979.2 435.2 1024 384 1024z\",fill:o.color,\"p-id\":\"6496\"},null,8,j8),t(\"path\",{d:\"M787.2 1024 787.2 1024c-134.4 0-243.2-108.8-243.2-236.8l0 0c0-134.4 108.8-236.8 236.8-236.8l0 0c134.4 0 236.8 108.8 236.8 236.8l0 0C1024 915.2 915.2 1024 787.2 1024z\",fill:o.color,\"p-id\":\"6497\"},null,8,U8),t(\"path\",{d:\"M928 480 640 480C588.8 480 544 435.2 544 384L544 96C544 44.8 588.8 0 640 0l281.6 0C979.2 0 1024 44.8 1024 96L1024 384C1024 435.2 979.2 480 928 480z\",fill:o.color,\"p-id\":\"6498\"},null,8,q8)]))}}),W8={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},H8=[\"fill\"],J8=[\"fill\"],Z8=[\"fill\"],K8=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",W8,[t(\"path\",{d:\"M123.92 555.9a32 32 0 0 1-14.82-60.38l719.19-374.9a32 32 0 0 1 29.59 56.76l-719.2 374.89a31.87 31.87 0 0 1-14.76 3.63z\",fill:o.color,\"p-id\":\"5084\"},null,8,H8),t(\"path\",{d:\"M608.6 957.7a32 32 0 0 1-30.6-41.27l234.64-776.34a32 32 0 0 1 61.26 18.52L639.22 935a32 32 0 0 1-30.62 22.7zM505.92 580.44c-0.68 0-1.36 0-2.05-0.07l-381.46-24.12a32 32 0 1 1 4-63.88l381.5 24.13a32 32 0 0 1-2 63.94z\",fill:o.color,\"p-id\":\"5085\"},null,8,J8),t(\"path\",{d:\"M608.14 957.32a32 32 0 0 1-30.87-23.63L475 556.82a32 32 0 1 1 61.77-16.76L639 916.93a32 32 0 0 1-22.51 39.26 31.61 31.61 0 0 1-8.35 1.13z\",fill:o.color,\"p-id\":\"5086\"},null,8,Z8)]))}}),Q8={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},X8=[\"fill\"],t4=[\"fill\"],e4=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",Q8,[t(\"path\",{d:\"M748 469.97l-283.81 248.1c-3.96 1.98-5.94 5.94-9.9 9.9-17.82 29.71-9.9 67.34 19.8 85.16 29.71 15.84 65.35 5.94 83.18-21.79L757.9 477.89c1.98-5.95-3.96-11.88-9.9-7.92z\",\"p-id\":\"9627\",fill:o.color},null,8,X8),t(\"path\",{d:\"M512 181.96c-247.23 0-448.35 201.13-448.35 448.34 0 63.85 13.31 125.74 39.59 183.94 10.72 23.74 38.61 34.37 62.41 23.59 23.74-10.72 34.31-38.67 23.59-62.41C168.5 729.5 158 680.67 158 630.3c0-195.18 158.8-353.99 354-353.99 195.18 0 354 158.8 354 353.99 0 50.37-10.5 99.2-31.24 145.12-10.72 23.74-0.15 51.69 23.59 62.41 6.3 2.86 12.9 4.18 19.38 4.18 17.97 0 35.17-10.32 43.03-27.76 26.26-58.2 39.59-120.09 39.59-183.94 0-247.23-201.14-448.35-448.35-448.35z\",\"p-id\":\"9628\",fill:o.color},null,8,t4)]))}}),a4={width:\"32\",height:\"32\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},o4=[\"fill\"],n4=[\"fill\"],i4=[\"fill\"],r4=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",a4,[t(\"path\",{d:\"M880.213333 395.093333a31.786667 31.786667 0 0 1-26.88-15.573333 385.706667 385.706667 0 0 0-91.52-104.32 32.426667 32.426667 0 0 1-5.12-45.013333 32 32 0 0 1 45.013334-5.12 449.92 449.92 0 0 1 106.666666 121.6A31.786667 31.786667 0 0 1 896 390.4a30.293333 30.293333 0 0 1-15.786667 4.693333zM165.12 395.093333A30.293333 30.293333 0 0 1 149.333333 390.4a31.786667 31.786667 0 0 1-11.093333-43.733333A450.56 450.56 0 0 1 522.666667 128a32 32 0 0 1 0 64A386.56 386.56 0 0 0 192 379.52a31.786667 31.786667 0 0 1-26.88 15.573333z\",\"p-id\":\"17913\",fill:o.color},null,8,o4),t(\"path\",{d:\"M565.333333 341.333333a32 32 0 0 1 0-64A101.76 101.76 0 0 0 661.333333 170.666667a101.76 101.76 0 0 0-96-106.666667 32 32 0 0 1 0-64A165.76 165.76 0 0 1 725.333333 170.666667a165.76 165.76 0 0 1-160 170.666666zM522.666667 1024C362.666667 1024 220.8 936.106667 139.946667 787.84 61.013333 776.746667 0 700.373333 0 608 0 507.946667 71.68 426.666667 160 426.666667a32 32 0 0 1 0 64C106.666667 490.666667 64 543.36 64 608S106.666667 725.333333 160 725.333333a31.786667 31.786667 0 0 1 28.586667 17.706667C256 878.933333 381.653333 960 522.666667 960a384 384 0 0 0 354.56-236.373333 31.146667 31.146667 0 0 1 14.506666-16 106.666667 106.666667 0 0 0 57.6-99.626667c0-64-42.666667-117.333333-96-117.333333a32 32 0 0 1 0-64c88.32 0 160 81.28 160 181.333333a170.666667 170.666667 0 0 1-81.706666 150.613333A448 448 0 0 1 522.666667 1024z\",\"p-id\":\"17914\",fill:o.color},null,8,n4),t(\"path\",{d:\"M394.666667 640a32 32 0 0 1-32-32v-42.666667a32 32 0 0 1 64 0v42.666667a32 32 0 0 1-32 32zM629.333333 640a32 32 0 0 1-32-32v-42.666667a32 32 0 0 1 64 0v42.666667a32 32 0 0 1-32 32zM512 822.186667A131.2 131.2 0 0 1 391.466667 746.666667a32 32 0 1 1 58.24-26.453334 70.186667 70.186667 0 0 0 124.586666 0A32 32 0 1 1 632.533333 746.666667 131.2 131.2 0 0 1 512 822.186667z\",\"p-id\":\"17915\",fill:o.color},null,8,i4)]))}}),s4={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},d4=[\"fill\"],l4=[\"fill\"],u4=I({props:{color:{type:String,default:\"#2c2c2c\"}},setup(o){return(n,a)=>(r(),s(\"svg\",s4,[t(\"path\",{d:\"M771.328 320.896H258.986667a64 64 0 0 0-63.701334 57.856l-41.386666 427.178667a64 64 0 0 0 57.472 69.888l5.12 0.256h590.592a64 64 0 0 0 64-64l-0.170667-4.394667-35.797333-428.117333a64 64 0 0 0-63.786667-58.666667z m-512.341333 42.666667h512.341333a21.333333 21.333333 0 0 1 21.290667 19.584l35.712 427.178666 0.085333 2.688c0 10.88-9.557333 20.437333-21.333333 20.437334H217.557333l-3.072-0.170667a21.162667 21.162667 0 0 1-18.176-23.210667l41.472-427.221333a21.333333 21.333333 0 0 1 21.205334-19.285333z\",fill:o.color,\"p-id\":\"8134\"},null,8,d4),t(\"path\",{d:\"M685.013333 429.312a21.333333 21.333333 0 0 1 21.333334 21.333333 194.346667 194.346667 0 1 1-388.693334 0 21.333333 21.333333 0 1 1 42.666667 0 151.68 151.68 0 0 0 303.36 0 21.333333 21.333333 0 0 1 21.333333-21.333333zM512 147.882667a194.346667 194.346667 0 0 1 194.346667 194.346666 21.333333 21.333333 0 1 1-42.666667 0 151.68 151.68 0 1 0-303.36 0 21.333333 21.333333 0 1 1-42.666667 0A194.346667 194.346667 0 0 1 512 147.882667z\",fill:o.color,\"p-id\":\"8135\"},null,8,l4)]))}}),c4={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},p4=[\"fill\"],f4=I({props:{color:{type:String,default:\"#333333\"}},setup(o){return(n,a)=>(r(),s(\"svg\",c4,[t(\"path\",{d:\"M353.323071 246.407016L620.37222 510.637979l-265.320785 268.146133c-11.776208 11.775184-11.73425201 30.908964 0.091074 42.73429l0.001023 0c11.825326 11.82635 30.958082 11.867282 42.72815-2.930749L680.899758 535.559579c3.817955-4.273327 8.205892-9.321296 8.933463-12.045337 4.470825-11.112082 2.232854-24.76503301-6.710842-35.987632l-286.98213-286.98213c-11.875468-8.847505-31.096229-8.893554-42.922578 2.932796C341.393367 215.303624 341.439416 234.523361 353.323071 246.407016z\",\"p-id\":\"5051\",fill:o.color},null,8,p4)]))}}),m4={class:\"header\"},g4={class:\"icon-wrapper\"},v4={class:\"content\"},b4={class:\"title\"},h4={class:\"subtitle\"},_4={class:\"footer\"},x4={key:1,class:\"extra\"},w4={key:2,class:\"extra badge\"},k4={class:\"extra_num\"},y4={key:3,class:\"badge\"},F4=I({props:{card:{type:Object,required:!0}},setup(o){const{$gettext:n}=J(),a={navigation:{component:K8,props:{color:\"#ffffff\"}},wifi:{component:ze,props:{color:\"#ffffff\"}},topology:{component:pa,props:{color:\"#ffffff\"}},speed:{component:e4,props:{color:\"#ffffff\"}},baby:{component:r4,props:{color:\"#ffffff\"}},appStore:{component:u4,props:{color:\"#ffffff\"}}};return(l,u)=>(r(),s(\"div\",{class:lt([\"feature-card\",o.card.color]),onClick:u[0]||(u[0]=d=>l.$emit(\"click\",o.card))},[t(\"div\",null,[t(\"div\",m4,[t(\"div\",g4,[Yt(l.$slots,\"icon\",{},()=>{var d;return[o.card.icon&&a[o.card.icon]?(r(),Z(oa((d=a[o.card.icon])==null?void 0:d.component),yo({key:0},a[o.card.icon].props,{class:\"icon-svg\"}),null,16)):D(\"\",!0)]},!0)])]),t(\"div\",v4,[t(\"div\",b4,i(o.card.title),1),t(\"div\",h4,i(o.card.subtitle),1)]),t(\"div\",_4,[o.card.status?(r(),s(\"span\",{key:0,class:lt([\"status\",{active:o.card.isActive}])},i(o.card.status),3)):D(\"\",!0),o.card.extra?(r(),s(\"div\",x4,i(o.card.extra),1)):D(\"\",!0),o.card.num?(r(),s(\"div\",w4,[t(\"span\",k4,i(o.card.num),1),dt(\" \"+i(e(n)(\"\\u53F0\\u8BBE\\u5907\\u5728\\u7EBF\")),1)])):D(\"\",!0),o.card.tag?(r(),s(\"span\",y4,i(o.card.tag),1)):D(\"\",!0)])]),Y(f4,{class:\"right-arrow\",color:\"#99a1af\"})],2))}});var E4=N(F4,[[\"__scopeId\",\"data-v-58f520f0\"]]);const $4={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},C4=[\"fill\"],D4=[\"fill\"],B4=[\"fill\"],Y4=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",$4,[t(\"path\",{d:\"M298.894222 482.417778c-35.271111 0-65.649778 12.231111-90.624 36.636444-25.031111 24.462222-37.603556 54.158222-37.603555 88.746667v87.153778h60.359111V607.857778c0-18.318222 6.599111-33.848889 19.854222-46.762667a65.991111 65.991111 0 0 1 48.014222-19.456h426.382222c18.887111 0 34.759111 6.428444 48.014223 19.399111 13.312 13.027556 19.854222 28.444444 19.854222 46.819556v87.04h60.359111v-87.04c0-34.702222-12.572444-64.341333-37.546667-88.746667a125.098667 125.098667 0 0 0-90.680889-36.750222H298.894222z\",fill:o.color,\"p-id\":\"8894\"},null,8,C4),t(\"path\",{d:\"M488.049778 334.734222h47.900444V512h-47.900444V334.734222z\",fill:o.color,\"p-id\":\"8895\"},null,8,D4),t(\"path\",{d:\"M597.333333 142.222222v170.666667h-170.666666v-170.666667h170.666666z m-170.666666-56.888889a56.888889 56.888889 0 0 0-56.888889 56.888889v170.666667a56.888889 56.888889 0 0 0 56.888889 56.888889h170.666666a56.888889 56.888889 0 0 0 56.888889-56.888889v-170.666667a56.888889 56.888889 0 0 0-56.888889-56.888889h-170.666666zM284.444444 711.111111H113.777778v170.666667h170.666666v-170.666667z m-170.666666-56.888889h170.666666a56.888889 56.888889 0 0 1 56.888889 56.888889v170.666667a56.888889 56.888889 0 0 1-56.888889 56.888889H113.777778a56.888889 56.888889 0 0 1-56.888889-56.888889v-170.666667a56.888889 56.888889 0 0 1 56.888889-56.888889zM910.222222 711.111111v170.666667h-170.666666v-170.666667h170.666666z m-170.666666-56.888889a56.888889 56.888889 0 0 0-56.888889 56.888889v170.666667a56.888889 56.888889 0 0 0 56.888889 56.888889h170.666666a56.888889 56.888889 0 0 0 56.888889-56.888889v-170.666667a56.888889 56.888889 0 0 0-56.888889-56.888889h-170.666666z\",fill:o.color,\"p-id\":\"8896\"},null,8,B4)]))}}),A4={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},S4=[\"fill\"],z4=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",A4,[t(\"path\",{d:\"M853.333333 768a42.666667 42.666667 0 0 1 0 85.333333h-341.333333a42.666667 42.666667 0 0 1 0-85.333333h341.333333zM200.832 183.168L426.666667 409.002667l30.165333 30.165333a42.666667 42.666667 0 0 1 0 60.330667l-14.634667 14.634666-241.365333 241.365334a42.666667 42.666667 0 1 1-60.330667-60.330667l225.792-225.877333-225.792-225.792a42.666667 42.666667 0 0 1 60.330667-60.330667z\",fill:o.color,\"p-id\":\"5439\"},null,8,S4)]))}}),P4={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},T4=[\"fill\"],I4=[\"fill\"],Ze=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",P4,[t(\"path\",{d:\"M531.216667 77.336366c0 0-8.147564-10.313903-16.938788-10.709923-8.791224-0.396019-18.070564 9.133008-18.070564 9.133008-96.577592 77.010955-246.112304 97.021707-345.075223 110.281709 0 0-14.838963 2.062985-22.257933 3.094478-11.189853 1.555425-21.184485 3.125177-27.569916 8.241708-6.385431 5.117554-5.999644 18.659989-5.999644 18.659989 0 476.176097 84.005252 627.530246 410.888138 736.639247 0 0 4.438079 1.619894 8.085142 1.373277 3.647063-0.042979 7.195889-1.980097 7.195889-1.980097 324.821947-108.462271 408.826176-259.857353 408.826176-736.033449 0 0-1.264806-13.920034-6.709819-18.659989-5.445012-4.739954-13.812587-6.433526-24.073278-7.864108-8.308223-1.157359-24.923646-3.473101-24.923646-3.473101C775.550465 172.782182 626.055662 152.771429 531.216667 77.336366zM486.388692 884.038318c-260.550131-96.030124-328.494593-228.237191-332.62875-628.806309-0.045025-4.400217 0.357134-6.599302 1.663896-8.667404 1.306762-2.068102 3.713578-2.836605 3.713578-2.836605 91.436502-12.233626 223.901443-29.972639 328.759629-91.828428 8.445346-4.982478 17.749246-11.634991 25.087375-11.634991 7.338129 0 15.890922 6.689353 24.289196 11.686157 103.57496 61.632709 234.845703 79.437214 327.058894 91.777263 0 0 4.41659 0.768503 5.910617 2.836605 1.494027 2.068102 2.324952 4.094248 2.309602 6.16542-2.819209 380.861264-55.186903 527.575744-329.520969 630.016881-9.733689 3.634784-19.105127 8.231475-27.533077 8.231475C507.070734 890.978381 495.039723 887.22694 486.388692 884.038318z\",fill:o.color,\"p-id\":\"5082\"},null,8,T4),t(\"path\",{d:\"M763.882728 456.981942c-32.383548 146.597823-101.757568 233.810117-243.305375 299.834856-14.22191 1.440815-25.321712 13.450337-25.321712 28.051893 0 15.572674 12.624529 28.197202 28.197202 28.197202 4.321422 0 8.41567-0.972141 12.076036-2.709715l0.143263 0.393973c158.820192-71.15048 242.084571-167.561273 280.661168-345.308537 0.969071-2.781346 1.496074-5.7694 1.496074-8.881274 0-14.898315-12.07706-26.975375-26.975375-26.975375-14.898315 0-26.975375 12.07706-26.975375 26.975375C763.878634 456.701556 763.879658 456.841749 763.882728 456.981942z\",fill:o.color,\"p-id\":\"5083\"},null,8,I4)]))}}),M4={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},L4=[\"fill\"],O4=[\"fill\"],Xa=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",M4,[t(\"path\",{d:\"M762 942H262c-71.68 0-130-58.32-130-130V212c0-71.68 58.32-130 130-130h350c16.56 0 30 13.43 30 30v151.56c0 38.59 31.41 70 70 70h150c16.56 0 30 13.43 30 30V812c0 71.68-58.32 130-130 130zM262 142c-38.59 0-70 31.41-70 70v600c0 38.59 31.41 70 70 70h500c38.59 0 70-31.41 70-70V393.57H712c-71.68 0-130-58.32-130-130V142H262z\",\"p-id\":\"13142\",fill:o.color},null,8,L4),t(\"path\",{d:\"M862 393.57H712c-71.68 0-130-58.32-130-130V112c0-12.15 7.32-23.11 18.55-27.73a29.938 29.938 0 0 1 32.71 6.59l250 251.56c8.55 8.59 11.07 21.47 6.43 32.67s-15.58 18.48-27.69 18.48zM642 184.75v78.82c0 38.59 31.41 70 70 70h77.89L642 184.75zM487 379.5H312c-16.57 0-30-13.43-30-30s13.43-30 30-30h175c16.57 0 30 13.43 30 30s-13.43 30-30 30zM712 542H312c-16.57 0-30-13.43-30-30s13.43-30 30-30h400c16.56 0 30 13.43 30 30s-13.44 30-30 30zM712 704.5H312c-16.57 0-30-13.44-30-30s13.43-30 30-30h400c16.56 0 30 13.44 30 30s-13.44 30-30 30z\",\"p-id\":\"13143\",fill:o.color},null,8,O4)]))}}),to=/\\d+\\.\\d+\\.\\d+\\.\\d+/,N4=o=>to.test(o)&&ye.IPv4.isValid(o),qt=o=>{const n=ye.IPv4.parse(o).toByteArray();return n[0]<<24|n[1]<<16|n[2]<<8|n[3]},Ba=o=>ye.fromByteArray([o>>24&255,o>>16&255,o>>8&255,o&255]).toString(),V4=o=>{if(!to.test(o)||!ye.IPv4.isIPv4(o))return!1;let n=0,a=qt(o);for(let l=31;l>=0&&(a&1<<l)!=0;l--)n=n+(1<<l);return(~n&a)==0},G4=(o,n,a,l)=>{let u=qt(o)&qt(n),d=qt(a),c=qt(l),g=~qt(n);return d<c&&d>u+1&&c<u+g},j4=(o,n)=>{let a=qt(n),l=qt(o)&a,u=~a,d;return u>=105?(d=l|u-5,l=l|100):u>=3?(d=l|u-1,l=l|2):(l=l|1,d=l),[Ba(l),Ba(d)]},U4=o=>ye.IPv4.subnetMaskFromPrefixLength(o).toString();var Lt={isValidMask:V4,isValidIPv4:N4,isValidMaskRange:G4,calcMaskRange:j4,prefixToMask:U4};const ma=o=>(ut(\"data-v-22104807\"),o=o(),ct(),o),q4=[\"onSubmit\"],R4={class:\"actioner-dns_header\"},W4={class:\"actioner-dns_body\"},H4={class:\"label-item\"},J4={class:\"label-item_key\"},Z4={class:\"label-item_value\"},K4={class:\"label-item\"},Q4={class:\"label-item_key\"},X4={class:\"label-item_value\"},t7={key:0,class:\"chose_dhcp\"},e7={key:0,class:\"dhcp_info\"},a7={key:1,class:\"dhcp_info\"},o7={class:\"label-item\"},n7={class:\"label-item_key\"},i7={class:\"label-item_value\"},r7={class:\"label-item\"},s7={class:\"label-item_key\"},d7={class:\"label-item_value\"},l7={class:\"actioner-dns_footer\"},u7=[\"disabled\"],c7={key:1,class:\"actioner-dns\"},p7={class:\"actioner-dns_header\"},f7={class:\"actioner-dns_body\"},m7={key:0,class:\"setting_status\"},g7=ma(()=>t(\"div\",{class:\"success_icon\"},[t(\"svg\",{t:\"1642063181211\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"5062\",width:\"128\",height:\"128\"},[t(\"path\",{d:\"M512 85.333333c235.648 0 426.666667 191.018667 426.666667 426.666667s-191.018667 426.666667-426.666667 426.666667S85.333333 747.648 85.333333 512 276.352 85.333333 512 85.333333z m-74.965333 550.4L346.453333 545.152a42.666667 42.666667 0 1 0-60.330666 60.330667l120.704 120.704a42.666667 42.666667 0 0 0 60.330666 0l301.653334-301.696a42.666667 42.666667 0 1 0-60.288-60.330667l-271.530667 271.488z\",fill:\"#52C41A\",\"p-id\":\"5063\"})])],-1)),v7={class:\"config-message\"},b7=[\"href\"],h7={key:1,class:\"setting_status\"},_7=ma(()=>t(\"div\",{class:\"success_icon\"},[t(\"svg\",{t:\"1642063200324\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"5898\",width:\"128\",height:\"128\"},[t(\"path\",{d:\"M549.044706 512l166.189176-166.249412a26.383059 26.383059 0 0 0 0-36.98447 26.383059 26.383059 0 0 0-37.044706 0L512 475.015529l-166.249412-166.249411a26.383059 26.383059 0 0 0-36.98447 0 26.383059 26.383059 0 0 0 0 37.044706L475.015529 512l-166.249411 166.249412a26.383059 26.383059 0 0 0 0 36.98447 26.383059 26.383059 0 0 0 37.044706 0L512 548.984471l166.249412 166.249411a26.383059 26.383059 0 0 0 36.98447 0 26.383059 26.383059 0 0 0 0-37.044706L548.984471 512zM512 1024a512 512 0 1 1 0-1024 512 512 0 0 1 0 1024z\",fill:\"#E84335\",\"p-id\":\"5899\"})])],-1)),x7={class:\"config-message\"},w7={key:2,class:\"setting_status\"},k7=ma(()=>t(\"div\",{class:\"success_icon\"},[t(\"svg\",{width:\"128px\",height:\"128px\",viewBox:\"0 0 128 128\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},[t(\"g\",{id:\"icon_yellow\",stroke:\"none\",\"stroke-width\":\"1\",fill:\"none\",\"fill-rule\":\"evenodd\"},[t(\"g\",{id:\"Icon/Warning\"},[t(\"rect\",{id:\"\\u77E9\\u5F62\",fill:\"#000000\",\"fill-rule\":\"nonzero\",opacity:\"0\",x:\"0\",y:\"0\",width:\"128\",height:\"128\"}),t(\"path\",{d:\"M64,8 C33.075,8 8,33.075 8,64 C8,94.925 33.075,120 64,120 C94.925,120 120,94.925 120,64 C120,33.075 94.925,8 64,8 Z M60,37 C60,36.45 60.45,36 61,36 L67,36 C67.55,36 68,36.45 68,37 L68,71 C68,71.55 67.55,72 67,72 L61,72 C60.45,72 60,71.55 60,71 L60,37 Z M64,92 C60.6875,92 58,89.3125 58,86 C58,82.6875 60.6875,80 64,80 C67.3125,80 70,82.6875 70,86 C70,89.3125 67.3125,92 64,92 Z\",id:\"\\u5F62\\u72B6\",fill:\"#FAAD14\"})])])])],-1)),y7={class:\"config-message\"},F7=I({props:{Close:{type:Function,required:!0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=E(0),d=E({lanIp:\"\",netMask:\"255.255.255.0\",enableDhcp:!1,dhcpStart:\"\",dhcpEnd:\"\"});E(\"\");const c=E(!1);E(!0),E(!1);const k=E(\"\"),g=E(2),p=E(!1),m=E(\"timeout\");let v=!0;(()=>{G.Guide.GetLan.GET().then(h=>{h.data.result&&(p.value=h.data.result.enableDhcp||!1,h.data.result.enableDhcp=!1,d.value=h.data.result,h.data.result.lanIp!==location.hostname&&(v=!1))})})();const y=()=>{const h=d.value;if(!Lt.isValidIPv4(h.lanIp)){$.Warning(a(\"IPv4\\u5730\\u5740\\u683C\\u5F0F\\u9519\\u8BEF\"));return}if(!Lt.isValidMask(h.netMask)){$.Warning(a(\"IPv4\\u5B50\\u7F51\\u63A9\\u7801\\u683C\\u5F0F\\u9519\\u8BEF\"));return}const _=Lt.calcMaskRange(h.lanIp,h.netMask);h.dhcpStart=_[0],h.dhcpEnd=_[1],d.value=h},f=()=>{const h=d.value;if(!Lt.isValidIPv4(h.lanIp)){$.Warning(a(\"IPv4\\u5730\\u5740\\u683C\\u5F0F\\u9519\\u8BEF\"));return}if(!Lt.isValidMask(h.netMask)){$.Warning(a(\"IPv4\\u5B50\\u7F51\\u63A9\\u7801\\u683C\\u5F0F\\u9519\\u8BEF\"));return}if(h.enableDhcp&&!(Lt.isValidIPv4(h.dhcpStart)&&Lt.isValidIPv4(h.dhcpEnd)&&Lt.isValidMaskRange(h.lanIp,h.netMask,h.dhcpStart,h.dhcpEnd))){$.Warning(a(\"DHCP\\u7684IP\\u6C60\\u683C\\u5F0F\\u9519\\u8BEF\\u6216\\u8D85\\u51FA\\u5B50\\u7F51\\u8303\\u56F4\"));return}const _=$.Loading(a(\"\\u6B63\\u5728\\u914D\\u7F6E\\u2026\\u8BF7\\u7A0D\\u7B49\"),30);let x=0;const C=A=>{m.value=A,u.value=1,x=1,_.Close()},S=()=>{const A=new Date().getTime()+3e4,z=v?location.protocol+\"//\"+h.lanIp+(location.port?\":\"+location.port:\"\"):location.origin,B=z+\"/luci-static/resources/icons/loading.gif\",H=()=>{x==0&&(new Date().getTime()>A?C(\"timeout\"):window.setTimeout(q,2e3))},M=()=>{x==0&&(k.value=z+location.pathname,C(\"success\"),window.setTimeout(()=>{g.value=1},1e3),window.setTimeout(()=>{location.href=k.value},2e3))},q=()=>{if(x!=0)return;console.log(\"check online \",B);const T=new Image;T.onload=M,T.onerror=H,T.src=B};window.setTimeout(q,5e3)};G.Guide.LanIp.POST(h).then(A=>{var z;if(A!=null&&A.data){if((A.data.success||0)==0)return;if((z=A.data)!=null&&z.error)throw A.data.error}throw a(\"\\u672A\\u77E5\\u9519\\u8BEF\")}).catch(A=>{x==0&&(C(\"fail\"),$.Error(A))}),S(),window.setTimeout(()=>{x==0&&C(\"timeout\")},3e4)},F=h=>{h.preventDefault(),n.Close&&n.Close()},w=h=>{location.reload()};return(h,_)=>(r(),Z(wt,{Close:o.Close,type:1},{default:V(()=>[u.value==0?(r(),s(\"form\",{key:0,class:\"actioner-dns\",onSubmit:ft(f,[\"prevent\"])},[t(\"div\",R4,[t(\"span\",null,i(e(a)(\"\\u5185\\u7F51\\u914D\\u7F6E\")),1)]),t(\"div\",W4,[t(\"div\",H4,[t(\"div\",J4,[t(\"span\",null,i(e(a)(\"IPv4\\u5730\\u5740\")),1)]),t(\"div\",Z4,[O(t(\"input\",{type:\"text\",placeholder:\"192.168.100.1\",required:\"\",\"onUpdate:modelValue\":_[0]||(_[0]=x=>d.value.lanIp=x),onChange:y},null,544),[[at,d.value.lanIp,void 0,{trim:!0}]])])]),t(\"div\",K4,[t(\"div\",Q4,[t(\"span\",null,i(e(a)(\"IPv4\\u5B50\\u7F51\\u63A9\\u7801\")),1)]),t(\"div\",X4,[O(t(\"input\",{type:\"text\",placeholder:\"255.255.255.0\",required:\"\",\"onUpdate:modelValue\":_[1]||(_[1]=x=>d.value.netMask=x),onChange:y},null,544),[[at,d.value.netMask,void 0,{trim:!0}]])])]),p.value?(r(),s(\"div\",t7,[Y(qa,{modelValue:d.value.enableDhcp,\"onUpdate:modelValue\":_[2]||(_[2]=x=>d.value.enableDhcp=x)},{default:V(()=>[d.value.enableDhcp?(r(),s(\"span\",e7,i(e(a)(\"\\u4FEE\\u6539DHCP\\u670D\\u52A1\")),1)):(r(),s(\"span\",a7,i(e(a)(\"\\u4FDD\\u6301DHCP\\u670D\\u52A1\\u8BBE\\u7F6E\")),1))]),_:1},8,[\"modelValue\"])])):D(\"\",!0),d.value.enableDhcp?(r(),s(U,{key:1},[t(\"div\",o7,[t(\"div\",n7,[t(\"span\",null,i(e(a)(\"IP\\u6C60\\u8D77\\u59CB\\u5730\\u5740\")),1)]),t(\"div\",i7,[O(t(\"input\",{type:\"text\",placeholder:\"192.168.100.100\",required:\"\",\"onUpdate:modelValue\":_[3]||(_[3]=x=>d.value.dhcpStart=x)},null,512),[[at,d.value.dhcpStart,void 0,{trim:!0}]])])]),t(\"div\",r7,[t(\"div\",s7,[t(\"span\",null,i(e(a)(\"IP\\u6C60\\u7ED3\\u675F\\u5730\\u5740\")),1)]),t(\"div\",d7,[O(t(\"input\",{type:\"text\",placeholder:\"192.168.100.100\",required:\"\",\"onUpdate:modelValue\":_[4]||(_[4]=x=>d.value.dhcpEnd=x)},null,512),[[at,d.value.dhcpEnd,void 0,{trim:!0}]])])])],64)):D(\"\",!0)]),t(\"div\",l7,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",disabled:c.value},i(e(a)(\"\\u786E\\u8BA4\")),9,u7),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:F},i(e(a)(\"\\u53D6\\u6D88\")),1)])],40,q4)):u.value==1?(r(),s(\"div\",c7,[t(\"div\",p7,[t(\"span\",null,i(e(a)(\"\\u66F4\\u6362\\u914D\\u7F6E\")),1)]),t(\"div\",f7,[m.value==\"success\"?(r(),s(\"div\",m7,[g7,t(\"div\",v7,i(e(a)(\"\\u914D\\u7F6E\\u6210\\u529F\")),1),t(\"a\",{href:k.value,class:\"NewAdress\"},i(e(a)(\"%{ countdown }s\\u540E \\u8DF3\\u8F6C\\u65B0\\u5730\\u5740\",{countdown:\"\"+g.value})),9,b7)])):m.value==\"fail\"?(r(),s(\"div\",h7,[_7,t(\"div\",x7,i(e(a)(\"\\u914D\\u7F6E\\u5931\\u8D25\")),1),t(\"p\",null,i(e(a)(\"\\u8BF7\\u5C1D\\u8BD5\\u91CD\\u65B0\\u914D\\u7F6E\")),1),t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",onClick:w},i(e(a)(\"\\u6211\\u77E5\\u9053\\u4E86\")),1)])):m.value==\"timeout\"?(r(),s(\"div\",w7,[k7,t(\"div\",y7,i(e(a)(\"\\u914D\\u7F6E\\u8D85\\u65F6\")),1),t(\"p\",null,i(e(a)(\"\\u8DEF\\u7531\\u5668 IP \\u53EF\\u80FD\\u5DF2\\u7ECF\\u4FEE\\u6539\\u6210\\u529F\\u3002\\u82E5\\u5237\\u65B0\\u9875\\u9762\\u5931\\u8D25\\uFF0C\\u8BF7\\u91CD\\u65B0\\u8FDE\\u63A5\\u8DEF\\u7531\\u5668\\uFF0C\\u5426\\u5219\\u8BF7\\u5C1D\\u8BD5\\u91CD\\u65B0\\u914D\\u7F6E\\u3002\")),1),t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",onClick:w},i(e(a)(\"\\u5237\\u65B0\\u9875\\u9762\")),1)])):D(\"\",!0)])])):D(\"\",!0)]),_:1},8,[\"Close\"]))}});var E7=N(F7,[[\"__scopeId\",\"data-v-22104807\"]]);const $7=()=>{const o=document.createElement(\"div\");document.body.appendChild(o);const n=xt(E7,{Close:()=>{a()}});n.mount(o);const a=()=>{n.unmount(),o.remove()};return{Close:a}},C7={key:0,class:\"actioner-dns\"},D7={class:\"actioner-dns_header\"},B7={class:\"actioner-dns_body\"},Y7={class:\"sandbox_info\"},A7={key:0,class:\"disk_loading_icon\"},S7={class:\"disk_loading_info\"},z7={key:1,class:\"disk_tips\"},P7={class:\"label-item\"},T7={class:\"label-item_key\"},I7={class:\"label-item_value\"},M7={value:\"\"},L7=[\"value\"],O7={class:\"label-item\"},N7={class:\"label-item_key\"},V7={class:\"label-item_value\"},G7={selected:\"true\",value:\"\"},j7=[\"value\",\"disabled\"],U7={class:\"sandbox_tips\"},q7={class:\"sandbox_info timeout\"},R7={class:\"sandbox_roboot_tips\"},W7={class:\"sandbox_roboot_refresh\"},H7={key:0,class:\"actioner-dns_footer\"},J7=[\"disabled\"],Z7={key:1,class:\"actioner-tips\"},K7={class:\"actioner-tips_header\"},Q7={class:\"actioner-tips_body\"},X7={class:\"sandbox_info\"},tp={class:\"actioner-tips_footer\"},ep={key:2,class:\"actioner-tips\"},ap={class:\"actioner-tips_header\"},op={class:\"actioner-tips_body\"},np={class:\"sandbox_info\"},ip={class:\"actioner-tips_footer\"},rp=I({props:{Close:{type:Function,required:!0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=E(0);E(\"disk\");const d=E(\"\"),c=E(3),k=E(\"\"),g=E([]),p=E(\"\"),m=E(null);(()=>{G.Nas.SandboxDisks.GET().then(x=>{var C;if(x!=null&&x.data&&(C=x.data)!=null&&C.result){m.value=x.data.result;return}throw a(\"\\u52A0\\u8F7D\\u78C1\\u76D8\\u4FE1\\u606F\\u5931\\u8D25\")}).catch(x=>{d.value=x,u.value=3})})();const b=()=>G.System.Reboot.POST().then(x=>{var C;if(!(x!=null&&x.data&&(((C=x==null?void 0:x.data)==null?void 0:C.success)||0)==0))throw a(\"\\u672A\\u77E5\\u9519\\u8BEF\")}),y=x=>{var C,S;p.value=\"\",g.value=k.value&&((S=(C=m.value)==null?void 0:C.disks.find(A=>A.path==k.value))==null?void 0:S.childrens)||[]},f=()=>{c.value>0&&(c.value-=1,window.setTimeout(f,1e3))},F=x=>{x.preventDefault(),n.Close&&n.Close()},w=()=>{new Promise((x,C)=>{const S=\"/luci-static/resources/icons/loading.gif\",A=()=>{window.setTimeout(z,2e3)},z=()=>{const B=new Image;B.onload=x,B.onerror=A,B.src=S};window.setTimeout(z,1e4)}).then(()=>{window.setTimeout(()=>{location.reload()},2e3)})},h=x=>{const C=$.Loading(a(\"\\u914D\\u7F6E\\u6C99\\u7BB1\\u91CD\\u542F\\u4E2D...\"));G.Nas.Sandbox.POST({path:p.value}).then(S=>{var A;if(S!=null&&S.data){if((S.data.success||0)==0)return u.value=2,window.setTimeout(f,1e3),b();if((A=S.data)!=null&&A.error)throw S.data.error}throw a(\"\\u672A\\u77E5\\u9519\\u8BEF\")}).then(w).catch(S=>$.Warning(S)).finally(()=>C.Close())},_=()=>{u.value=0};return(x,C)=>{const S=_t(\"icon-loading\");return r(),Z(wt,{Close:o.Close,type:1},{default:V(()=>[u.value==0||u.value==2?(r(),s(\"div\",C7,[t(\"div\",D7,[t(\"span\",null,i(e(a)(\"\\u6C99\\u7BB1\\u6A21\\u5F0F\\u914D\\u7F6E\\u5411\\u5BFC\")),1)]),t(\"div\",B7,[t(\"p\",Y7,i(e(a)(\"\\u4E00\\u4E2A\\u7B80\\u6613\\u6C99\\u7BB1\\uFF0C\\u65B9\\u4FBF\\u7528\\u6765\\u5B9E\\u9A8C\\u7CFB\\u7EDF\\u914D\\u7F6E\\u548C\\u7A0B\\u5E8F\\uFF0C\\u65B9\\u4FBF\\u5F00\\u53D1\\u672A\\u5B8C\\u6210\\u7684\\u8F6F\\u4EF6\\uFF0C\\u4F46\\u4E0D\\u4FDD\\u62A4 Docker \\u548C\\u786C\\u76D8\\u7684\\u6570\\u636E\")),1),u.value==0?(r(),s(U,{key:0},[m.value?D(\"\",!0):(r(),s(\"div\",A7,[Y(S,{size:38,color:\"currentColor\"}),t(\"span\",S7,i(e(a)(\"\\u6B63\\u5728\\u52A0\\u8F7D\\u4E2D...\")),1)])),m.value&&m.value.disks.length==0?(r(),s(\"div\",z7,[Y(It),t(\"span\",null,i(e(a)(\"\\u68C0\\u6D4B\\u4E0D\\u5230\\u6302\\u8F7D\\u7684\\u78C1\\u76D8\\u4FE1\\u606F\\uFF0C\\u8BF7\\u5148\\u63D2\\u4E0A\\u78C1\\u76D8\\uFF0C\\u5EFA\\u8BAE\\u4F7F\\u7528U\\u76D8\\u6216\\u8005\\u79FB\\u52A8\\u786C\\u76D8\\uFF0C\\u65B9\\u4FBF\\u88C5\\u5378\")),1)])):D(\"\",!0),m.value&&m.value.disks.length>0?(r(),s(U,{key:2},[t(\"div\",P7,[t(\"div\",T7,[t(\"span\",null,i(e(a)(\"\\u76EE\\u6807\\u78C1\\u76D8\\uFF08\\u5EFA\\u8BAE\\u9009\\u62E9U\\u76D8\\u6216\\u8005\\u79FB\\u52A8\\u786C\\u76D8\\uFF0C\\u65B9\\u4FBF\\u88C5\\u5378\\uFF09\")),1)]),t(\"div\",I7,[O(t(\"select\",{name:\"\",id:\"\",onChange:y,\"onUpdate:modelValue\":C[0]||(C[0]=A=>k.value=A)},[t(\"option\",M7,i(e(a)(\"\\u8BF7\\u9009\\u62E9\\u76EE\\u6807\\u78C1\\u76D8\")),1),(r(!0),s(U,null,tt(m.value.disks,(A,z)=>(r(),s(\"option\",{value:A.path,key:z},i(A.venderModel)+\"\\uFF08\"+i(A.size)+\"\\uFF09 \",9,L7))),128))],544),[[pt,k.value]])])]),t(\"div\",O7,[t(\"div\",N7,[t(\"span\",null,i(e(a)(\"\\u76EE\\u6807\\u5206\\u533A\\uFF08\\u5206\\u533A\\u5927\\u5C0F\\u987B\\u5927\\u4E8E2G\\uFF0C\\u5C06\\u6B64\\u5206\\u533A\\u4F5C\\u4E3A\\u5916\\u90E8 overlay \\u4F7F\\u7528\\uFF09\")),1)]),t(\"div\",V7,[O(t(\"select\",{name:\"\",id:\"\",\"onUpdate:modelValue\":C[1]||(C[1]=A=>p.value=A)},[t(\"option\",G7,i(e(a)(\"\\u8BF7\\u9009\\u62E9\\u76EE\\u6807\\u5206\\u533A\")),1),(r(!0),s(U,null,tt(g.value,(A,z)=>(r(),s(\"option\",{value:A.path,key:z,disabled:A.sizeInt<(1<<30)*1||A.isSystemRoot},i(A.name)+\"\\uFF08\"+i(A.filesystem||e(a)(\"\\u672A\\u683C\\u5F0F\\u5316\"))+\"\\uFF09\"+i(A.total),9,j7))),128))],512),[[pt,p.value]])])]),t(\"div\",U7,[Y(It),t(\"span\",null,i(e(a)(\"\\u6B64\\u64CD\\u4F5C\\u4F1A\\u5C06\\u4F1A\\u5220\\u9664\\u8BE5\\u5206\\u533A\\u5168\\u90E8\\u6570\\u636E\")),1)])],64)):D(\"\",!0)],64)):D(\"\",!0),u.value==2?(r(),s(U,{key:1},[t(\"p\",q7,[dt(i(e(a)(\"\\u5373\\u5C06\\u91CD\\u542F\\u8BBE\\u5907\"))+\" \",1),t(\"span\",null,\"\\uFF08\"+i(c.value)+\"s\\uFF09\",1)]),t(\"p\",R7,[dt(i(e(a)(\"\\u7B49\\u5F85\\u8BBE\\u5907\\u91CD\\u542F\\uFF0C\\u91CD\\u542F\\u5B8C\\u6210\\u540E\")),1),t(\"span\",W7,i(e(a)(\"\\u8BF7\\u5237\\u65B0\\u754C\\u9762\")),1)])],64)):D(\"\",!0)]),u.value==0?(r(),s(\"div\",H7,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",disabled:!p.value,onClick:C[2]||(C[2]=A=>u.value=1)},i(e(a)(\"\\u5F00\\u542F\\u6C99\\u7BB1\")),9,J7),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:F},i(e(a)(\"\\u53D6\\u6D88\")),1)])):D(\"\",!0)])):D(\"\",!0),u.value==1?(r(),s(\"div\",Z7,[t(\"div\",K7,[t(\"span\",null,i(e(a)(\"\\u6E29\\u99A8\\u63D0\\u793A\")),1)]),t(\"div\",Q7,[t(\"p\",X7,i(e(a)(\"\\u6B64\\u64CD\\u4F5C\\u4F1A\\u5C06\\u4F1A\\u5220\\u9664\\u8BE5\\u5206\\u533A\\u5168\\u90E8\\u6570\\u636E\\uFF0C\\u5E76\\u683C\\u5F0F\\u5316\\u6210EXT4\\uFF0C\\u968F\\u540E\\u81EA\\u52A8\\u91CD\\u542F\\u8FDB\\u5165\\u6C99\\u7BB1\\u6A21\\u5F0F\\uFF0C\\u662F\\u5426\\u7EE7\\u7EED\\uFF1F\")),1)]),t(\"div\",tp,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",onClick:h},i(e(a)(\"\\u7EE7\\u7EED\")),1),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:_},i(e(a)(\"\\u53D6\\u6D88\")),1)])])):D(\"\",!0),u.value==3?(r(),s(\"div\",ep,[t(\"div\",ap,[t(\"span\",null,i(e(a)(\"\\u9519\\u8BEF\")),1)]),t(\"div\",op,[t(\"p\",np,i(d.value),1)]),t(\"div\",ip,[t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:_},i(e(a)(\"\\u53D6\\u6D88\")),1)])])):D(\"\",!0)]),_:1},8,[\"Close\"])}}});var sp=N(rp,[[\"__scopeId\",\"data-v-58c55341\"]]);const dp=()=>{const o=document.createElement(\"div\");document.body.appendChild(o);const n=xt(sp,{Close:()=>{a()}});n.mount(o);const a=()=>{n.unmount(),o.remove()};return{Close:a}},lp={key:0,class:\"actioner-dns\"},up={class:\"actioner-dns_header\"},cp={class:\"actioner-dns_body\"},pp={class:\"sandbox_info\"},fp={class:\"sandbox_environment\"},mp={class:\"sandbox_environment_info\"},gp={class:\"sandbox_environment_reboot\"},vp=[\"innerHTML\"],bp={class:\"actioner-dns_footer\"},hp=[\"disabled\"],_p=[\"disabled\"],xp=[\"disabled\"],wp=I({props:{Close:{type:Function,required:!0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=E(0),d=E(!1),c=()=>{new Promise((v,b)=>{const y=\"/luci-static/resources/icons/loading.gif\",f=()=>{window.setTimeout(F,2e3)},F=()=>{const w=new Image;w.onload=v,w.onerror=f,w.src=y};window.setTimeout(F,1e4)}).then(()=>{window.setTimeout(()=>{location.reload()},2e3)})},k=()=>{d.value=!0;const v=$.Loading(a(\"\\u63D0\\u4EA4\\u4E2D...\"));G.Nas.SandboxCommit.POST().then(b=>{var y,f;if(b!=null&&b.data)if((((y=b==null?void 0:b.data)==null?void 0:y.success)||0)==0){$.Loading(a(\"\\u8BBE\\u5907\\u91CD\\u542F\\u4E2D...\"));return}else(f=b==null?void 0:b.data)!=null&&f.error&&alert(b.data.error);throw a(\"\\u672A\\u77E5\\u9519\\u8BEF\")}).then(c).catch(b=>{$.Error(b),d.value=!1}).finally(()=>v.Close())},g=()=>{d.value=!0;const v=$.Loading(a(\"\\u91CD\\u7F6E\\u4E2D...\"));G.Nas.SandboxReset.POST().then(b=>{var y,f;if(b!=null&&b.data)if((((y=b==null?void 0:b.data)==null?void 0:y.success)||0)==0){$.Loading(a(\"\\u8BBE\\u5907\\u91CD\\u542F\\u4E2D... \\u82E5\\u9875\\u9762\\u957F\\u65F6\\u95F4\\u672A\\u5237\\u65B0\\u53EF\\u80FD\\u9700\\u8981\\u624B\\u52A8\\u586B\\u5199\\u5730\\u5740\"));return}else(f=b==null?void 0:b.data)!=null&&f.error&&alert(b.data.error);throw a(\"\\u672A\\u77E5\\u9519\\u8BEF\")}).then(c).catch(b=>{$.Error(b),d.value=!1}).finally(()=>v.Close())},p=()=>{if(!confirm(a(\"\\u786E\\u5B9A\\u653E\\u5F03\\u6C99\\u7BB1\\u4E2D\\u7684\\u6570\\u636E\\uFF1F\\u518D\\u6B21\\u8FDB\\u5165\\u6C99\\u7BB1\\u9700\\u8981\\u91CD\\u65B0\\u683C\\u5F0F\\u5316\\u76F8\\u5E94\\u78C1\\u76D8\\u5206\\u533A\")))return;d.value=!0;const v=$.Loading(a(\"\\u6267\\u884C\\u4E2D...\"));G.Nas.SandboxExit.POST().then(b=>{var y,f;if(b!=null&&b.data)if((((y=b==null?void 0:b.data)==null?void 0:y.success)||0)==0){$.Loading(a(\"\\u8BBE\\u5907\\u91CD\\u542F\\u4E2D... \\u82E5\\u9875\\u9762\\u957F\\u65F6\\u95F4\\u672A\\u5237\\u65B0\\u53EF\\u80FD\\u9700\\u8981\\u624B\\u52A8\\u586B\\u5199\\u5730\\u5740\"));return}else(f=b==null?void 0:b.data)!=null&&f.error&&alert(b.data.error);throw a(\"\\u672A\\u77E5\\u9519\\u8BEF\")}).then(c).catch(b=>{$.Error(b),d.value=!1}).finally(()=>v.Close())},m=v=>{v.preventDefault(),n.Close&&n.Close()};return(v,b)=>(r(),Z(wt,{Close:o.Close,type:1},{default:V(()=>[u.value==0?(r(),s(\"div\",lp,[t(\"div\",up,[t(\"span\",null,i(e(a)(\"\\u6C99\\u7BB1\\u6A21\\u5F0F\\u914D\\u7F6E\\u5411\\u5BFC\")),1)]),t(\"div\",cp,[t(\"p\",pp,i(e(a)(\"\\u4E00\\u4E2A\\u7B80\\u6613\\u6C99\\u7BB1\\uFF0C\\u65B9\\u4FBF\\u7528\\u6765\\u5B9E\\u9A8C\\u7CFB\\u7EDF\\u914D\\u7F6E\\u548C\\u7A0B\\u5E8F\\uFF0C\\u65B9\\u4FBF\\u5F00\\u53D1\\u672A\\u5B8C\\u6210\\u7684\\u8F6F\\u4EF6\\uFF0C\\u4F46\\u4E0D\\u4FDD\\u62A4 Docker \\u548C\\u786C\\u76D8\\u7684\\u6570\\u636E\")),1),t(\"div\",fp,[t(\"p\",null,i(e(a)(\"\\u5F53\\u524D\\u5904\\u4E8E\\u6C99\\u7BB1\\u73AF\\u5883\\uFF1A\")),1),t(\"p\",null,i(e(a)(\"1\\u3001\\u70B9\\u51FB\\u201C\\u63D0\\u4EA4\\u201D\\u53EF\\u5C06\\u53D8\\u66F4\\u5408\\u5E76\\u5230\\u975E\\u6C99\\u7BB1\\u73AF\\u5883\")),1),t(\"p\",null,i(e(a)(\"2\\u3001\\u70B9\\u51FB\\u201C\\u91CD\\u7F6E\\u201D\\u53EF\\u5C06\\u6C99\\u7BB1\\u6062\\u590D\\u5230\\u521D\\u59CB\\u72B6\\u6001\")),1),t(\"p\",null,i(e(a)(\"3\\u3001\\u70B9\\u51FB\\u201C\\u9000\\u51FA\\u201D\\u53EF\\u9000\\u51FA\\u6C99\\u7BB1\\u73AF\\u5883\\uFF0C\\u5E76\\u653E\\u5F03\\u6C99\\u7BB1\\u4E2D\\u7684\\u6570\\u636E\")),1)]),t(\"div\",mp,[dt(i(e(a)(\"\\u4EE5\\u4E0A\\u64CD\\u4F5C\\u90FD\\u5C06\\u91CD\\u542F\\u8BBE\\u5907\\uFF0C\\u8BBE\\u5907\\u91CD\\u542F\\u5B8C\\u6210\\u540E\\u4F1A\\u81EA\\u52A8\\u5237\\u65B0\\u9875\\u9762\\u3002\\u5982\\u679C IP \\u53D8\\u5316\\u53EF\\u80FD\\u9700\\u8981\")),1),t(\"span\",gp,i(e(a)(\"\\u624B\\u52A8\\u5728\\u5730\\u5740\\u680F\\u8F93\\u5165\\u5730\\u5740\")),1),t(\"p\",{class:\"sandbox_environment_tex\",innerHTML:e(a)(\"\\u5982\\u9700<b>\\u4E34\\u65F6</b>\\u9000\\u51FA\\u6C99\\u7BB1\\u73AF\\u5883\\uFF0C\\u8BF7\\u5C06\\u8BBE\\u5907\\u5173\\u673A\\u540E\\u62D4\\u51FA\\u76F8\\u5173\\u78C1\\u76D8\\uFF0C\\u542F\\u52A8\\u524D\\u63D2\\u5165\\u76F8\\u5173\\u78C1\\u76D8\\u53EF\\u518D\\u6B21\\u8FDB\\u5165\\u6C99\\u7BB1\\u3002<br/> \\u6CE8\\u610F\\u4E34\\u65F6\\u9000\\u51FA\\u6C99\\u7BB1\\u73AF\\u5883\\u4EE5\\u540E\\u5347\\u7EA7\\u56FA\\u4EF6\\u4F1A\\u5BFC\\u81F4\\u4E4B\\u524D\\u7684\\u6C99\\u7BB1\\u6570\\u636E\\u65E0\\u6548\",{},!0)},null,8,vp)])]),t(\"div\",bp,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",onClick:k,disabled:d.value},i(e(a)(\"\\u63D0\\u4EA4\")),9,hp),t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",onClick:g,disabled:d.value},i(e(a)(\"\\u91CD\\u7F6E\")),9,_p),t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",onClick:p,disabled:d.value},i(e(a)(\"\\u9000\\u51FA\")),9,xp),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:m},i(e(a)(\"\\u53D6\\u6D88\")),1)])])):D(\"\",!0)]),_:1},8,[\"Close\"]))}});var kp=N(wp,[[\"__scopeId\",\"data-v-9573dc70\"]]);const yp=()=>{const o=document.createElement(\"div\");document.body.appendChild(o);const n=xt(kp,{Close:()=>{a()}});n.mount(o);const a=()=>{n.unmount(),o.remove()};return{Close:a}},Fp={class:\"item_container\"},Ep=[\"onClick\",\"title\"],$p={class:\"renew\"},Cp={key:0},Dp={key:1,style:{display:\"inline-block\",\"margin-left\":\"4px\"}},Bp={class:\"app-update-button-menu\"},Yp=[\"onClick\"],Ap={class:\"app-update-menu-item\"},Sp={key:0,class:\"app-update-menu-item-loading\"},zp={class:\"dns_txt\"},Pp={key:0,style:{display:\"inline-block\",\"margin-left\":\"4px\"}},Tp=I({setup(o){var S,A;const{$gettext:n}=J(),a=E(!0);(A=(S=window.quickstart_configs)==null?void 0:S.update)!=null&&A.disable&&(a.value=!1);const l=E(!1),u=E(a.value),d=E(!1),c=Le(),k=Fe(),g=Q(()=>k.status),p=E(),m=()=>{Ka()};$t(u,z=>{d.value=!0,G.System.AutoCheckUpdate.POST({enable:z}).catch(B=>{$.Warning(B)}).finally(()=>{d.value=!1})});const v=()=>{window.location.href=\"/cgi-bin/luci/admin/system/ota\"},b=()=>{window.location.href=\"/cgi-bin/luci/admin/status/logs\"},y=()=>{window.location.href=\"/cgi-bin/luci/admin/store/pages/maintance\"},f=()=>{dp()},F=()=>{yp()},w=()=>{alert(n(\"\\u8BE5\\u56FA\\u4EF6\\u4E0D\\u652F\\u6301\\u6C99\\u7BB1\\u6A21\\u5F0F\"))},h=()=>{$7()},_=()=>{Qa()},x=()=>{var z,B,H,M;window.open(`${(B=(z=window.quickstart_configs)==null?void 0:z.ttyd)!=null&&B.ssl?\"https\":\"http\"}://${window.location.hostname}:${((M=(H=window.quickstart_configs)==null?void 0:H.ttyd)==null?void 0:M.port)||7681}/`,\"_blank\")},C=()=>{l.value=!l.value};return a.value&&setTimeout(()=>{c.requestCheckUpdate()},1100),Qt(\"sandbox\")&&G.Nas.GetSandbox.GET().then(B=>{var H,M,q;B!=null&&B.data&&((((H=B==null?void 0:B.data)==null?void 0:H.success)||0)==0?(M=B==null?void 0:B.data)!=null&&M.result&&(p.value=B.data.result):(q=B==null?void 0:B.data)!=null&&q.error&&alert(B.data.error))}).catch(B=>$.Warning(B)),(z,B)=>{var q,T,j,R,it,ot;const H=_t(\"icon-loading\"),M=_t(\"switch-box\");return r(),s(\"div\",Fp,[t(\"div\",{class:\"item\",style:{backgroundColor:\"#f3f7fd\"},onClick:h},[Y(Y4,{color:\"#2b7fff\",class:\"icon\"}),t(\"span\",null,i(e(n)(\"\\u5185\\u7F51\\u914D\\u7F6E\")),1)]),e(Qt)(\"ttyd\")?(r(),s(\"div\",{key:0,class:\"item\",style:{backgroundColor:\"#f4fbf7\"},onClick:x},[Y(z4,{color:\"#00c850\",class:\"icon\"}),t(\"span\",null,i(e(n)(\"\\u7EC8\\u7AEF\")),1)])):D(\"\",!0),e(Qt)(\"ota\")?(r(),s(\"div\",{key:1,class:\"item\",style:{backgroundColor:\"#f9f7fd\"},onClick:v},[t(\"span\",{class:\"app-update-button-more\",onClick:ft(C,[\"stop\",\"prevent\"]),title:e(n)(\"\\u56FA\\u4EF6\\u66F4\\u65B0\\u9009\\u9879\")},[Y(Ee)],8,Ep),Y(Kt,{color:\"#ad46ff\",class:\"icon\"}),t(\"span\",$p,[(q=e(c).checkUpdate)!=null&&q.needUpdate?(r(),s(\"i\",Cp)):D(\"\",!0),dt(\" \"+i(e(n)(\"\\u56FA\\u4EF6\\u66F4\\u65B0\"))+\" \",1),a.value&&e(c).checkUpdate==null?(r(),s(\"span\",Dp,[Y(H,{size:\"1em\",color:\"currentColor\"})])):D(\"\",!0)]),O(t(\"div\",Bp,[t(\"div\",{class:\"menu_background\",onClick:ft(C,[\"stop\",\"prevent\"])},null,8,Yp),t(\"ul\",{onClick:B[1]||(B[1]=ft(()=>{},[\"stop\"]))},[t(\"li\",null,[Y(M,{modelValue:u.value,\"onUpdate:modelValue\":B[0]||(B[0]=bt=>u.value=bt)},{default:V(()=>[t(\"span\",Ap,i(e(n)(\"\\u81EA\\u52A8\\u68C0\\u67E5\\u66F4\\u65B0\")),1)]),_:1},8,[\"modelValue\"]),d.value?(r(),s(\"span\",Sp,[Y(H,{size:\"1em\",color:\"currentColor\"})])):D(\"\",!0)])])],512),[[ee,l.value]])])):D(\"\",!0),t(\"div\",{class:lt([\"item\",{\"disabled-style\":!((T=e(g))!=null&&T.proto)}]),style:{backgroundColor:\"#f1fbfd\"},onClick:m},[Y(xe,{color:\"#00b8db\",class:\"icon\"}),t(\"span\",zp,[dt(i(e(n)(\"DNS\\u914D\\u7F6E\"))+\" \",1),(j=e(g))!=null&&j.proto?D(\"\",!0):(r(),s(\"span\",Pp,[Y(H,{size:\"1em\",color:\"currentColor\"})]))])],2),t(\"div\",{class:\"item\",style:{backgroundColor:\"#fbf5fa\"},onClick:_},[Y(Za,{color:\"#f6339a\",class:\"icon\"}),t(\"span\",null,i(e(n)(\"\\u8F6F\\u4EF6\\u6E90\\u914D\\u7F6E\")),1)]),e(Qt)(\"sandbox\")?(r(),s(U,{key:2},[((R=p.value)==null?void 0:R.status)==\"unsupport\"?(r(),s(\"div\",{key:0,class:\"item\",style:{backgroundColor:\"#f9fafb\"},onClick:w},[Y(Ze,{color:\"#cac9cd\",class:\"icon\"}),t(\"span\",null,i(e(n)(\"\\u5F00\\u542F\\u6C99\\u7BB1\")),1)])):((it=p.value)==null?void 0:it.status)==\"stopped\"?(r(),s(\"div\",{key:1,class:\"item\",style:{backgroundColor:\"#fbf4f5\"},onClick:f},[Y(Ze,{color:\"#fb2c36\",class:\"icon\"}),t(\"span\",null,i(e(n)(\"\\u5F00\\u542F\\u6C99\\u7BB1\")),1)])):((ot=p.value)==null?void 0:ot.status)==\"running\"?(r(),s(\"div\",{key:2,class:\"item\",style:{backgroundColor:\"#dae8fd\"},onClick:F},[Y(Ze,{color:\"#2b7fff\",class:\"icon\"}),t(\"span\",null,i(e(n)(\"\\u6C99\\u7BB1\\u5DF2\\u5F00\\u542F\")),1)])):D(\"\",!0)],64)):D(\"\",!0),t(\"div\",{class:\"item\",style:{backgroundColor:\"#fcf7f2\"},onClick:b},[Y(Xa,{color:\"#ff6900\",class:\"icon\"}),t(\"span\",null,i(e(n)(\"\\u65E5\\u5FD7\\u67E5\\u770B\")),1)]),t(\"div\",{class:\"item\",style:{backgroundColor:\"#eff5ff\"},onClick:y},[Y(fa,{color:\"#553afe\",class:\"icon\"}),t(\"span\",null,i(e(n)(\"\\u7CFB\\u7EDF\\u7EF4\\u62A4\")),1)])])}}});var Ip=N(Tp,[[\"__scopeId\",\"data-v-6ac226af\"]]);const Mp={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},Lp=[\"fill\"],Op=[\"fill\"],Np=I({props:{color:{type:String,default:\"#222222\"}},setup(o){return(n,a)=>(r(),s(\"svg\",Mp,[t(\"path\",{d:\"M746 112c82.84 0 150 67.16 150 150S828.84 412 746 412 596 344.84 596 262 663.16 112 746 112z m0 48C689.668 160 644 205.668 644 262S689.668 364 746 364 848 318.332 848 262 802.332 160 746 160zM746 612c82.84 0 150 67.16 150 150S828.84 912 746 912 596 844.84 596 762s67.16-150 150-150z m0 48c-56.332 0-102 45.668-102 102s45.668 102 102 102 102-45.668 102-102-45.668-102-102-102zM262 364c82.84 0 150 67.16 150 150S344.84 664 262 664 112 596.84 112 514 179.16 364 262 364z m0 48C205.668 412 160 457.668 160 514S205.668 616 262 616 364 570.332 364 514 318.332 412 262 412z\",fill:o.color,\"p-id\":\"5059\"},null,8,Lp),t(\"path\",{d:\"M337.7 442.744l293.488-169.62 40.464 70.16-293.484 169.62zM387.708 526.728l277.02 160.12-40.468 70.156-277.02-160.12z\",fill:o.color,\"p-id\":\"5060\"},null,8,Op)]))}}),Vp={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},Gp=[\"fill\"],eo=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",Vp,[t(\"path\",{d:\"M827.84 886.4H187.9184375c-32.2659375 0-53.76-21.51375-53.76-53.784375V714.28625a53.889375 53.889375 0 0 1 53.76-53.784375h639.9215625a53.8940625 53.8940625 0 0 1 53.76 53.784375v118.35375a53.8940625 53.8940625 0 0 1-53.76 53.76z m-5.375625-172.11375H187.9184375v118.35375h634.5309375V714.28625z m-570 32.664375a26.88 26.88 0 1 1-26.88 26.88 26.88 26.88 0 0 1 26.865-26.88z m78.3403125 0a26.88 26.88 0 1 1-26.60625 27.1678125 26.88 26.88 0 0 1 26.5875-27.16875z m78.6 0a26.88 26.88 0 1 1-26.60625 27.1678125 26.88 26.88 0 0 1 26.5875-27.16875zM827.215625 624.9490625H187.2846875c-32.2603125 0-53.76-21.51375-53.76-53.784375V452.8353125a53.8940625 53.8940625 0 0 1 53.76-53.784375H827.196875a53.8940625 53.8940625 0 0 1 53.76 53.784375v118.329375a53.8940625 53.8940625 0 0 1-53.76 53.784375z m-5.38125-172.11375H187.285625v118.329375H821.815625V452.8353125z m-569.994375 31.9921875a26.88 26.88 0 1 1-26.88 26.88 26.88 26.88 0 0 1 26.88-26.88z m77.889375 0a26.88 26.88 0 1 1-26.88 26.88 26.88 26.88 0 0 1 26.8565625-26.88z m76.963125-0.403125a26.88 26.88 0 1 1-26.60625 27.1678125 26.88 26.88 0 0 1 26.5875-27.163125z m419.7890625-120.744375H186.56c-32.2509375 0-53.76-21.5278125-53.76-53.7984375V191.5521875a53.8940625 53.8940625 0 0 1 53.76-53.784375h639.9215625a53.8940625 53.8940625 0 0 1 53.76 53.784375v118.329375a53.8940625 53.8940625 0 0 1-53.76 53.7984375z m-5.3615625-172.1278125H186.56v118.329375h634.56V191.5521875z m-570.0140625 32.2753125a26.88 26.88 0 1 1-26.88 26.88 26.88 26.88 0 0 1 26.88-26.88z m78.6046875 0a26.88 26.88 0 1 1-26.88 26.88 26.88 26.88 0 0 1 26.8753125-26.88z m78.6046875 0a26.88 26.88 0 1 1-26.88 26.88 26.88 26.88 0 0 1 26.8846875-26.88z\",fill:o.color,\"p-id\":\"19012\"},null,8,Gp)]))}}),jp={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},Up=[\"fill\"],qp=I({props:{color:{type:String,default:\"#155dfc\"}},setup(o){return(n,a)=>(r(),s(\"svg\",jp,[t(\"path\",{d:\"M716.8 750.933333c47.786667 0 95.573333-27.306667 119.466667-68.266666 23.893333-40.96 23.893333-95.573333 0-136.533334-23.893333-40.96-68.266667-68.266667-119.466667-68.266666-10.24 0-17.066667-3.413333-23.893333-10.24-6.826667-6.826667-10.24-13.653333-10.24-23.893334 0-95.573333-75.093333-170.666667-170.666667-170.666666s-170.666667 75.093333-170.666667 170.666666v6.826667c81.92 23.893333 136.533333 95.573333 136.533334 180.906667 0 13.653333-6.826667 23.893333-17.066667 30.72-10.24 6.826667-23.893333 6.826667-34.133333 0-10.24-6.826667-17.066667-17.066667-17.066667-30.72 0-64.853333-54.613333-119.466667-119.466667-119.466667S170.666667 566.613333 170.666667 631.466667 225.28 750.933333 290.133333 750.933333H716.8zM296.96 819.2c-102.4 3.413333-187.733333-75.093333-194.56-177.493333-3.413333-102.4 75.093333-191.146667 177.493333-194.56 0-126.293333 95.573333-228.693333 221.866667-238.933334 122.88-6.826667 232.106667 81.92 249.173333 208.213334 105.813333 17.066667 180.906667 112.64 170.666667 218.453333-10.24 102.4-98.986667 184.32-204.8 184.32H296.96z\",fill:o.color,\"p-id\":\"8044\"},null,8,Up)]))}}),Rp={class:\"app-container_samba\"},Wp={key:0,class:\"sambas-item\"},Hp={class:\"sambas-item_name\"},Jp={class:\"sambas-item_value\"},Zp={class:\"sambas-item\"},Kp={class:\"sambas-item_name tit\"},Qp={class:\"sambas-item_value tit\"},Xp={class:\"samba-item\"},tf={class:\"samba-item_name\"},ef=[\"title\"],af=[\"href\"],of=I({props:{sambas:{type:Array}},setup(o){const{$gettext:n,$ngettext:a}=J(),l=window.location.hostname;return(u,d)=>{var c;return r(),s(\"ul\",Rp,[o.sambas?(r(),s(\"li\",Wp,[t(\"div\",Hp,[t(\"span\",null,i(e(n)(\"\\u5F53\\u524D\\u72B6\\u6001:\")),1)]),t(\"div\",Jp,[t(\"span\",null,i((c=o.sambas)!=null&&c.length?e(n)(\"\\u5DF2\\u542F\\u7528\"):e(n)(\"\\u672A\\u542F\\u7528\")),1)])])):D(\"\",!0),t(\"li\",Zp,[t(\"div\",Kp,[t(\"span\",null,i(e(n)(\"\\u5730\\u5740\")),1)]),t(\"div\",Qp,[t(\"span\",null,i(e(n)(\"\\u76EE\\u5F55\")),1)])]),(r(!0),s(U,null,tt(o.sambas,k=>(r(),s(\"li\",Xp,[t(\"div\",tf,[t(\"span\",null,\"smb://\"+i(e(l))+\"/\"+i(k.shareName),1)]),t(\"div\",{class:\"samba-item_value\",title:k.path},[t(\"a\",{target:\"_blank\",href:\"/cgi-bin/luci/admin/services/linkease/file/?path=/root\"+k.path},i(k.path),9,af)],8,ef)]))),256))])}}});var nf=N(of,[[\"__scopeId\",\"data-v-d0b06580\"]]);const rf={class:\"webdav-item\"},sf={class:\"webdav-item_name\"},df={class:\"webdav-item_value\"},lf={key:0,class:\"webdav-item\"},uf={class:\"webdav-item_name\"},cf={class:\"webdav-item_value\"},pf=[\"href\"],ff={key:1,class:\"webdav-item\"},mf={class:\"webdav-item_name\"},gf={class:\"webdav-item_value\"},vf=[\"href\"],bf={key:2,class:\"webdav-item\"},hf={class:\"webdav-item_name\"},_f={class:\"webdav-item_value\"},xf=I({props:{webdav:{type:Object}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=Q(()=>{var d;return`http://${location.hostname}:${(d=n.webdav)==null?void 0:d.port}`});return(d,c)=>{var k,g,p,m,v,b,y;return r(),s(U,null,[t(\"li\",rf,[t(\"div\",sf,[t(\"span\",null,i(e(a)(\"\\u5F53\\u524D\\u72B6\\u6001:\")),1)]),t(\"div\",df,[t(\"span\",null,i((k=o.webdav)!=null&&k.path?e(a)(\"\\u5DF2\\u542F\\u7528\"):e(a)(\"\\u672A\\u542F\\u7528\")),1)])]),(g=o.webdav)!=null&&g.path?(r(),s(\"li\",lf,[t(\"div\",uf,[t(\"span\",null,i(e(a)(\"\\u6302\\u8F7D\\u8DEF\\u5F84:\")),1)]),t(\"div\",cf,[t(\"a\",{target:\"_blank\",href:\"/cgi-bin/luci/admin/services/linkease/file/?path=/root\"+((p=o.webdav)==null?void 0:p.path)},i((m=o.webdav)==null?void 0:m.path),9,pf)])])):D(\"\",!0),(v=o.webdav)!=null&&v.port?(r(),s(\"li\",ff,[t(\"div\",mf,[t(\"span\",null,i(e(a)(\"\\u670D\\u52A1\\u8DEF\\u5F84:\")),1)]),t(\"div\",gf,[t(\"a\",{href:e(u),target:\"_blank\",rel:\"noopener noreferrer\"},i(e(u)),9,vf)])])):D(\"\",!0),(b=o.webdav)!=null&&b.username?(r(),s(\"li\",bf,[t(\"div\",hf,[t(\"span\",null,i(e(a)(\"\\u8D26\\u53F7:\")),1)]),t(\"div\",_f,[t(\"span\",null,i((y=o.webdav)==null?void 0:y.username),1)])])):D(\"\",!0)],64)}}});var wf=N(xf,[[\"__scopeId\",\"data-v-31dcf6eb\"]]);const kf={class:\"app-container_linkease\"},yf={class:\"linkease-item\"},Ff={class:\"linkease-item_name\"},Ef={class:\"linkease-item_value\"},$f={key:0,class:\"configure\"},Cf={key:0,class:\"linkease-item\"},Df={class:\"linkease-item_name\"},Bf={class:\"linkease-item_value\"},Yf=[\"href\"],Af={href:\"https://www.linkease.com\",target:\"_blank\"},Sf=I({props:{linkease:{type:Object}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=Q(()=>{var c;return`http://${location.hostname}:${(c=n.linkease)==null?void 0:c.port}`}),d=()=>{Wa({setup:0})};return(c,k)=>{var g,p,m;return r(),s(\"ul\",kf,[t(\"li\",yf,[t(\"div\",Ff,[t(\"span\",null,i(e(a)(\"\\u5F53\\u524D\\u72B6\\u6001:\")),1)]),t(\"div\",Ef,[(g=o.linkease)!=null&&g.enabel?(r(),s(\"span\",$f,i(e(a)(\"\\u5DF2\\u914D\\u7F6E\")),1)):(r(),s(\"span\",{key:1,class:\"configure enabel\",onClick:k[0]||(k[0]=v=>d())},i(e(a)(\"\\u672A\\u914D\\u7F6E\")),1))])]),(p=o.linkease)!=null&&p.enabel?(r(),s(U,{key:0},[(m=o.linkease)!=null&&m.port?(r(),s(\"li\",Cf,[t(\"div\",Df,[t(\"span\",null,i(e(a)(\"\\u670D\\u52A1\\u5730\\u5740:\")),1)]),t(\"div\",Bf,[t(\"a\",{href:e(u),target:\"_blank\",rel:\"noopener noreferrer\"},i(e(u)),9,Yf)])])):D(\"\",!0)],64)):D(\"\",!0),t(\"div\",null,[t(\"a\",Af,i(e(a)(\"\\u4E0B\\u8F7D\\u6613\\u6709\\u4E91\\u5BA2\\u6237\\u7AEF\\uFF0C\\u968F\\u65F6\\u968F\\u5730\\u76F8\\u518C\\u5907\\u4EFD\\u3001\\u8FDC\\u7A0B\\u8BBF\\u95EE\")),1)])])}}});var zf=N(Sf,[[\"__scopeId\",\"data-v-132ef714\"]]);const ao=o=>(ut(\"data-v-e1182f0e\"),o=o(),ct(),o),Pf={href:\"/cgi-bin/luci/admin/services/samba4\"},Tf={class:\"content\"},If={class:\"tab\"},Mf={class:\"title\"},Lf={key:0},Of={key:1},Nf=ao(()=>t(\"div\",{class:\"title\"},\"SAMBA\",-1)),Vf=ao(()=>t(\"div\",{class:\"title\"},\"WEBDAV\",-1)),Gf=I({setup(o){const{$gettext:n}=J(),a=E(!1);E(\"linkease\");const l=E(),u=tn(),d=E(!1);(()=>{G.Nas.Service.Status.GET().then(f=>{var F;if((F=f==null?void 0:f.data)!=null&&F.result){const w=f.data.result;l.value=w,b(),w.webdav&&(u.webdav=w.webdav)}})})();const k=()=>{Wa({setup:0})},g=()=>{a.value=!a.value},p=()=>{g(),zt.installAndGo(\"app-meta-gowebdav\",\"GoWebDAV\",\"/cgi-bin/luci/admin/nas/gowebdav\")},m=E(0),v=E(!1),b=()=>{var w,h,_,x,C,S;if(v.value)return;const F=[Boolean((h=(w=l.value)==null?void 0:w.linkease)==null?void 0:h.enabel),Boolean((x=(_=l.value)==null?void 0:_.sambas)==null?void 0:x.length),Boolean((S=(C=l.value)==null?void 0:C.webdav)==null?void 0:S.path)].findIndex(Boolean);m.value=F===-1?0:F},y=f=>{m.value=f,v.value=!0};return(f,F)=>(r(),Z(Wt,{title:e(n)(\"\\u5B58\\u50A8\\u670D\\u52A1\"),style:{width:\"100%\",height:\"100%\",display:\"block\"},\"is-settings-menu-open\":d.value,\"onUpdate:isSettingsMenuOpen\":F[4]||(F[4]=w=>d.value=w)},{icon:V(()=>[Y(Np,{color:\"#4f39f6\",class:\"icon\"})]),settings:V(()=>[t(\"div\",{class:\"btn_settings\",onClick:k},[Y(fa,{color:\"#0a0a0a\",class:\"icon1 settings-icon\",style:{\"margin-right\":\"6px\"}}),t(\"span\",null,i(e(n)(\"\\u914D\\u7F6E\\u5B58\\u50A8\\u670D\\u52A1\")),1),t(\"div\",{class:\"rotation\",onClick:F[0]||(F[0]=ft(w=>d.value=!d.value,[\"stop\"]))},[Y(Ee,{class:\"moreIcon\"})])])]),\"settings-menu\":V(()=>[t(\"div\",null,[t(\"a\",Pf,i(e(n)(\"SAMBA\\u9AD8\\u7EA7\\u914D\\u7F6E\")),1)]),t(\"div\",null,[t(\"a\",{onClick:p},i(e(n)(\"WebDAV\\u9AD8\\u7EA7\\u914D\\u7F6E\")),1)])]),default:V(()=>{var w,h,_,x,C,S,A,z,B;return[t(\"div\",Tf,[t(\"div\",If,[t(\"div\",{class:lt([\"item cloud\",{active:m.value==0}]),onClick:F[1]||(F[1]=H=>y(0))},[Y(qp,{color:\"#155dfc\",class:\"icon2\"}),t(\"div\",Mf,i(e(n)(\"\\u6613\\u6709\\u4E91\")),1),(h=(w=l.value)==null?void 0:w.linkease)!=null&&h.enabel?(r(),s(\"span\",Lf,i(e(n)(\"\\u5DF2\\u914D\\u7F6E\")),1)):(r(),s(\"span\",Of,i(e(n)(\"\\u672A\\u914D\\u7F6E\")),1))],2),t(\"div\",{class:lt([\"item memory\",{active:m.value==1}]),onClick:F[2]||(F[2]=H=>y(1))},[Y(eo,{color:\"#0bab47\",class:\"icon2\"}),Nf,t(\"span\",null,i((x=(_=l.value)==null?void 0:_.sambas)!=null&&x.length?e(n)(\"\\u5DF2\\u542F\\u7528\"):e(n)(\"\\u672A\\u542F\\u7528\")),1)],2),t(\"div\",{class:lt([\"item network\",{active:m.value==2}]),onClick:F[3]||(F[3]=H=>y(2))},[Y(xe,{color:\"#9810fa\",class:\"icon2\"}),Vf,t(\"span\",null,i((S=(C=l.value)==null?void 0:C.webdav)!=null&&S.path?e(n)(\"\\u5DF2\\u542F\\u7528\"):e(n)(\"\\u672A\\u542F\\u7528\")),1)],2)]),m.value==0?(r(),Z(zf,{key:0,linkease:(A=l.value)==null?void 0:A.linkease},null,8,[\"linkease\"])):m.value==1?(r(),Z(nf,{key:1,sambas:(z=l.value)==null?void 0:z.sambas},null,8,[\"sambas\"])):m.value==2?(r(),Z(wf,{key:2,webdav:(B=l.value)==null?void 0:B.webdav},null,8,[\"webdav\"])):D(\"\",!0)])]}),_:1},8,[\"title\",\"is-settings-menu-open\"]))}});var jf=N(Gf,[[\"__scopeId\",\"data-v-e1182f0e\"]]);const Uf={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},qf=[\"fill\"],Rf=[\"fill\"],Ya=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",Uf,[t(\"path\",{d:\"M554.688 682.624a42.688 42.688 0 0 0 0 85.376h0.448a42.688 42.688 0 1 0 0-85.376h-0.448zM767.488 682.624a42.688 42.688 0 0 0 0 85.376H768a42.688 42.688 0 1 0 0-85.376h-0.512z\",fill:o.color,\"p-id\":\"5230\"},null,8,qf),t(\"path\",{d:\"M465.28 96h93.44c59.456 0 106.88 0 144.96 4.48 39.36 4.48 72.128 14.08 100.992 35.584 28.8 21.44 47.424 50.112 63.104 86.464 15.232 35.2 28.8 80.64 45.952 137.6l52.48 174.848c1.28 4.48 2.752 9.28 3.584 14.336v0.32l0.192 1.216c0.64 5.12 0.64 10.048 0.64 14.72v3.392c0 72.704 0 130.304-5.632 175.68-5.824 46.592-18.112 84.736-45.952 115.84-4.992 5.568-10.304 10.88-15.936 15.872-31.104 27.84-69.184 40.128-115.84 45.952-45.312 5.696-102.912 5.696-175.616 5.696H412.352c-72.704 0-130.304 0-175.68-5.696-46.592-5.824-84.672-18.112-115.84-45.888a202.944 202.944 0 0 1-15.872-16c-27.84-31.04-40.128-69.12-45.952-115.84-5.696-45.312-5.696-102.912-5.696-175.616v-3.328c0-4.672 0-9.664 0.704-14.784v-0.32l0.192-1.216c0.832-5.056 2.24-9.856 3.584-14.272l52.48-174.912c17.088-56.96 30.72-102.4 45.952-137.6 15.68-36.352 34.304-65.024 63.104-86.4 28.8-21.504 61.632-31.104 100.992-35.712C358.4 96 405.76 96 465.28 96zM327.68 164.032c-33.152 3.84-53.632 11.072-70.144 23.36-16.512 12.288-29.376 29.824-42.56 60.48-13.568 31.424-26.176 73.28-43.968 132.544l-42.688 142.272h767.36l-42.688-142.272c-17.792-59.264-30.4-101.12-43.968-132.48-13.184-30.72-26.048-48.256-42.56-60.544-16.512-12.288-36.992-19.52-70.144-23.36C662.336 160 618.624 160 556.736 160H467.328c-61.952 0-105.6 0-139.648 4.032zM122.496 736.64c5.056 40.128 14.528 63.616 30.144 81.088 3.456 3.84 7.04 7.488 10.88 10.88 17.536 15.68 40.96 25.088 81.152 30.144 40.96 5.12 94.464 5.184 169.92 5.184h194.816c75.456 0 129.024 0 169.92-5.184 40.128-5.056 63.616-14.464 81.152-30.08 3.84-3.456 7.424-7.104 10.88-10.944 15.616-17.536 25.088-40.96 30.08-81.088 4.672-37.248 5.12-84.928 5.248-150.016H117.312c0.064 65.088 0.512 112.768 5.184 150.016z\",fill:o.color,\"p-id\":\"5231\"},null,8,Rf)]))}}),Wf={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},Hf=[\"fill\"],Jf=I({props:{color:{type:String,default:\"#0a0a0a\"}},setup(o){return(n,a)=>(r(),s(\"svg\",Wf,[t(\"path\",{d:\"M912 208H427.872l-50.368-94.176A63.936 63.936 0 0 0 321.056 80H112c-35.296 0-64 28.704-64 64v736c0 35.296 28.704 64 64 64h800c35.296 0 64-28.704 64-64v-608c0-35.296-28.704-64-64-64z m-800-64h209.056l68.448 128H912v97.984c-0.416 0-0.8-0.128-1.216-0.128H113.248c-0.416 0-0.8 0.128-1.248 0.128V144z m0 736v-96l1.248-350.144 798.752 1.216V784h0.064v96H112z\",fill:o.color,\"p-id\":\"5094\"},null,8,Hf)]))}}),Zf={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},Kf=[\"fill\"],Qf=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",Zf,[t(\"path\",{d:\"M136.12 251.958a83.054 83.054 0 0 1-0.12-4.458c0-32.903 19.447-58.344 41.115-75.981 21.984-17.893 51.365-32.231 84.13-43.511C327.163 105.315 415.641 92 511.5 92c95.859 0 184.337 13.315 250.255 36.008 32.765 11.28 62.146 25.618 84.13 43.511 20.221 16.458 38.506 39.713 40.86 69.485l0.255 0.002v532.88c0 32.888-19.031 58.62-40.776 76.719-21.978 18.294-51.385 32.976-84.207 44.53C696.011 918.373 607.438 932 511.5 932c-95.938 0-184.511-13.627-250.517-36.865-32.822-11.554-62.229-26.236-84.207-44.53C155.031 832.506 136 806.774 136 773.886V251.96l0.12-0.002z m79.88-4.459v0.002c0 0.016-0.003 0.151 0.098 0.491 0.112 0.379 0.397 1.16 1.103 2.347 1.479 2.49 4.55 6.323 10.415 11.096 11.97 9.743 31.722 20.293 59.67 29.914C342.796 310.459 422.067 323 511.5 323c89.433 0 168.704-12.541 224.214-31.651 27.948-9.621 47.7-20.171 59.67-29.914 5.865-4.773 8.936-8.606 10.415-11.096 0.706-1.187 0.991-1.968 1.103-2.347 0.088-0.297 0.097-0.437 0.098-0.479v-0.014-0.012c-0.001-0.042-0.01-0.182-0.098-0.479-0.112-0.379-0.397-1.16-1.103-2.347-1.479-2.49-4.55-6.323-10.415-11.096-11.97-9.743-31.722-20.293-59.67-29.914C680.204 184.541 600.933 172 511.5 172c-89.433 0-168.704 12.541-224.214 31.651-27.948 9.621-47.7 20.171-59.67 29.914-5.865 4.773-8.936 8.606-10.415 11.096-0.706 1.187-0.991 1.968-1.103 2.347-0.101 0.34-0.098 0.475-0.098 0.491z m591 100.656c-13.955 7.052-29.194 13.311-45.245 18.837C695.837 389.685 607.359 403 511.5 403c-95.859 0-184.337-13.315-250.255-36.008-16.051-5.526-31.29-11.785-45.245-18.837v85.359c0.001 0.042 0.01 0.182 0.098 0.478 0.112 0.379 0.397 1.16 1.103 2.347 1.479 2.489 4.55 6.323 10.415 11.096 11.97 9.743 31.722 20.293 59.67 29.914C342.796 496.459 422.067 509 511.5 509c89.433 0 168.704-12.541 224.214-31.651 27.948-9.621 47.7-20.171 59.67-29.914 5.865-4.773 8.936-8.607 10.415-11.096 0.706-1.187 0.991-1.968 1.103-2.347 0.088-0.297 0.097-0.437 0.098-0.479v-85.358z m-45.245 204.837C695.837 575.685 607.359 589 511.5 589c-95.859 0-184.337-13.315-250.255-36.008-16.051-5.526-31.29-11.785-45.245-18.837v70.359c0.001 0.041 0.01 0.182 0.098 0.478 0.112 0.379 0.397 1.16 1.103 2.347 1.479 2.489 4.55 6.323 10.415 11.096 11.97 9.743 31.722 20.293 59.67 29.914C342.796 667.459 422.067 680 511.5 680c89.433 0 168.704-12.541 224.214-31.651 27.948-9.621 47.7-20.171 59.67-29.914 5.865-4.773 8.936-8.607 10.415-11.096 0.706-1.187 0.991-1.968 1.103-2.347 0.088-0.297 0.097-0.437 0.098-0.479v-70.358c-13.955 7.052-29.194 13.311-45.245 18.837zM807 705.155c-13.955 7.052-29.194 13.311-45.245 18.837C695.837 746.685 607.359 760 511.5 760c-95.859 0-184.337-13.315-250.255-36.008-16.051-5.526-31.29-11.785-45.245-18.837V773.894c0 0.181-0.003 1.283 1.399 3.695 1.555 2.675 4.69 6.646 10.556 11.529 11.976 9.968 31.701 20.738 59.594 30.557C342.97 839.186 422.146 852 511.5 852c89.354 0 168.53-12.814 223.951-32.325 27.893-9.819 47.618-20.589 59.594-30.557 5.866-4.883 9.001-8.854 10.556-11.529 1.402-2.412 1.399-3.514 1.399-3.695v-68.739z\",fill:o.color,\"p-id\":\"9960\"},null,8,Kf)]))}}),Xf={},t9={width:\"18px\",height:\"18px\",viewBox:\"0 0 18 18\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},e9=jt('<g id=\"icon_info\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"><g id=\"Group\"><circle id=\"Oval\" stroke=\"currentColor\" cx=\"9\" cy=\"9\" r=\"8.5\"></circle><circle id=\"Oval\" fill=\"currentColor\" cx=\"5\" cy=\"9\" r=\"1\"></circle><circle id=\"Oval\" fill=\"currentColor\" cx=\"9\" cy=\"9\" r=\"1\"></circle><circle id=\"Oval\" fill=\"currentColor\" cx=\"13\" cy=\"9\" r=\"1\"></circle></g></g>',1),a9=[e9];function o9(o,n){return r(),s(\"svg\",t9,a9)}var Aa=N(Xf,[[\"render\",o9]]);const n9={},i9={width:\"18px\",height:\"18px\",viewBox:\"0 0 18 18\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},r9=jt('<g id=\"icon_disk-formatting\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"><g id=\"Group-15\" stroke=\"#333333\"><circle id=\"Oval\" cx=\"9\" cy=\"9\" r=\"8.5\"></circle><g id=\"Group-16\" transform=\"translate(4.000000, 4.500000)\" stroke-linejoin=\"round\"><polygon id=\"Rectangle\" points=\"0.911080155 0 9.08891985 0 10 6 -8.8817842e-16 6\"></polygon><rect id=\"Rectangle\" transform=\"translate(5.000000, 7.500000) scale(1, -1) translate(-5.000000, -7.500000) \" x=\"0\" y=\"6\" width=\"10\" height=\"3\"></rect></g></g></g>',1),s9=[r9];function d9(o,n){return r(),s(\"svg\",i9,s9)}var l9=N(n9,[[\"render\",d9]]);const Ge=o=>(ut(\"data-v-b5895698\"),o=o(),ct(),o),u9=[\"onSubmit\"],c9=Ge(()=>t(\"div\",{class:\"action-header\"},[t(\"div\",{class:\"action-header_title\"})],-1)),p9={class:\"action-body\"},f9={class:\"disk-info\"},m9=Ge(()=>t(\"div\",{class:\"disk-info_icon\"},[t(\"svg\",{t:\"1642589762094\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"11301\",width:\"128\",height:\"128\"},[t(\"path\",{d:\"M899.892468 123.889088c0-44.342099-36.286708-80.620486-80.624646-80.620486H204.728017C160.385918 43.268602 124.107532 79.546988 124.107532 123.889088v802.847056c0 44.342099 36.278386 80.620486 80.620485 80.620486h614.539805c44.337938 0 80.624646-36.278386 80.624646-80.620486V123.889088z\",fill:\"#D0D0DB\",\"p-id\":\"11302\"}),t(\"path\",{d:\"M169.8768 977.7772V174.930143c0-44.342099 36.278386-80.620486 80.620486-80.620485h614.539804c9.936092 0 19.426974 1.905666 28.239639 5.23434-11.525534-30.507298-40.996782-52.389169-75.398629-52.389169H203.342457c-44.342099 0-80.620486 36.278386-80.620486 80.620486v802.851217c0 34.410168 21.881871 63.873094 52.385008 75.381985A79.730065 79.730065 0 0 1 169.8768 977.7772z\",fill:\"#FFFFFF\",\"p-id\":\"11303\"}),t(\"path\",{d:\"M820.657543 40.497481H206.117739c-44.342099 0-80.620486 36.278386-80.620486 80.620485v802.847057c0 44.342099 36.278386 80.620486 80.620486 80.620486h614.539804c44.337938 0 80.624646-36.278386 80.624647-80.620486V121.117966c0-44.342099-36.286708-80.620486-80.624647-80.620485z m19.60173 828.785749c0 40.846992-33.43237 74.279362-74.287684 74.279361H199.780776c-40.855313 0-74.279362-33.424048-74.279362-74.279361V129.593603c0-40.855313 33.424048-74.279362 74.279362-74.279362h566.203296c40.842831 0 74.283522 33.424048 74.283522 74.279362l-0.008321 739.689627z\",fill:\"#6E6E96\",\"p-id\":\"11304\"}),t(\"path\",{d:\"M815.106979 1024H200.567175C146.933914 1024 103.303319 980.369405 103.303319 926.736144V123.889088C103.303319 70.255827 146.933914 26.625232 200.567175 26.625232h614.539804c53.633261 0 97.268017 43.630595 97.268017 97.263856v802.847056c0 53.633261-43.634756 97.263856-97.268017 97.263856zM200.567175 59.911972C165.287391 59.911972 136.590059 88.609303 136.590059 123.889088v802.847056c0 35.279784 28.697331 63.977115 63.977116 63.977115h614.539804c35.279784 0 63.981276-28.697331 63.981276-63.977115V123.889088c0-35.279784-28.701492-63.977115-63.981276-63.977116H200.567175z\",fill:\"#6E6E96\",\"p-id\":\"11305\"}),t(\"path\",{d:\"M301.946104 941.515457h429.985632v65.841173H301.946104z\",fill:\"#8A8AA1\",\"p-id\":\"11306\"}),t(\"path\",{d:\"M731.931736 1024H301.946104a16.64337 16.64337 0 0 1-16.64337-16.64337V941.515457a16.64337 16.64337 0 0 1 16.64337-16.64337h429.985632a16.64337 16.64337 0 0 1 16.64337 16.64337v65.841173a16.64337 16.64337 0 0 1-16.64337 16.64337z m-413.342262-33.286741h396.698892v-32.554432H318.589474v32.554432z\",fill:\"#6E6E96\",\"p-id\":\"11307\"}),t(\"path\",{d:\"M337.230049 960.318304h20.804213v47.038326h-20.804213zM386.565159 960.318304h20.804213v47.038326h-20.804213zM435.891948 960.318304h20.804213v47.038326h-20.804213zM485.231219 960.318304h20.804213v47.038326h-20.804213zM534.558008 960.318304h20.804213v47.038326h-20.804213zM583.897279 960.318304h20.804213v47.038326h-20.804213zM633.224068 960.318304h20.804213v47.038326h-20.804213zM682.563339 960.318304h20.804213v47.038326h-20.804213z\",fill:\"#FFE599\",\"p-id\":\"11308\"}),t(\"path\",{d:\"M219.153659 140.794591m-26.874883 0a26.874882 26.874882 0 1 0 53.749765 0 26.874882 26.874882 0 1 0-53.749765 0Z\",fill:\"#ADADD1\",\"p-id\":\"11309\"}),t(\"path\",{d:\"M219.153659 184.312843c-23.995579 0-43.518252-19.522673-43.518253-43.518252s19.522673-43.518252 43.518253-43.518253 43.518252 19.522673 43.518252 43.518253-19.522673 43.518252-43.518252 43.518252z m0-53.749764c-5.642103 0-10.231512 4.589409-10.231512 10.231512s4.589409 10.231512 10.231512 10.231512 10.231512-4.589409 10.231511-10.231512-4.589409-10.231512-10.231511-10.231512z\",fill:\"#6E6E96\",\"p-id\":\"11310\"}),t(\"path\",{d:\"M801.28466 140.794591m-26.870721 0a26.870721 26.870721 0 1 0 53.741442 0 26.870721 26.870721 0 1 0-53.741442 0Z\",fill:\"#ADADD1\",\"p-id\":\"11311\"}),t(\"path\",{d:\"M801.28466 184.308683c-23.995579 0-43.514092-19.518512-43.514091-43.514092s19.518512-43.514092 43.514091-43.514092 43.514092 19.518512 43.514092 43.514092-19.518512 43.514092-43.514092 43.514092z m0-53.741443c-5.637942 0-10.227351 4.589409-10.227351 10.227351s4.589409 10.227351 10.227351 10.227351 10.227351-4.589409 10.227351-10.227351-4.589409-10.227351-10.227351-10.227351z\",fill:\"#6E6E96\",\"p-id\":\"11312\"}),t(\"path\",{d:\"M801.280499 905.23291m-26.870721 0a26.870721 26.870721 0 1 0 53.741443 0 26.870721 26.870721 0 1 0-53.741443 0Z\",fill:\"#ADADD1\",\"p-id\":\"11313\"}),t(\"path\",{d:\"M801.280499 948.747001c-23.995579 0-43.514092-19.518512-43.514091-43.514091s19.518512-43.514092 43.514091-43.514092 43.514092 19.518512 43.514092 43.514092-19.518512 43.514092-43.514092 43.514091z m0-53.741442c-5.637942 0-10.227351 4.589409-10.227351 10.227351s4.589409 10.227351 10.227351 10.227351 10.227351-4.589409 10.227351-10.227351-4.589409-10.227351-10.227351-10.227351z\",fill:\"#6E6E96\",\"p-id\":\"11314\"}),t(\"path\",{d:\"M219.153659 905.23291m-26.870722 0a26.870721 26.870721 0 1 0 53.741443 0 26.870721 26.870721 0 1 0-53.741443 0Z\",fill:\"#ADADD1\",\"p-id\":\"11315\"}),t(\"path\",{d:\"M219.153659 948.747001c-23.995579 0-43.514092-19.518512-43.514092-43.514091s19.518512-43.514092 43.514092-43.514092 43.514092 19.518512 43.514091 43.514092-19.522673 43.514092-43.514091 43.514091z m0-53.741442c-5.637942 0-10.227351 4.589409-10.227351 10.227351s4.589409 10.227351 10.227351 10.227351 10.227351-4.589409 10.227351-10.227351-4.589409-10.227351-10.227351-10.227351z\",fill:\"#6E6E96\",\"p-id\":\"11316\"}),t(\"path\",{d:\"M520.972857 777.43263c-142.542145 0-258.508988-115.971004-258.508988-258.52147a16.64337 16.64337 0 0 1 33.28674 0c0 124.19699 101.033579 225.23473 225.222248 225.23473s225.222248-101.03774 225.222248-225.23473c0-124.188668-101.033579-225.218087-225.222248-225.218087a16.64337 16.64337 0 0 1 0-33.286741c142.542145 0 258.508988 115.966843 258.508988 258.504828 0 142.550466-115.966843 258.521471-258.508988 258.52147z\",fill:\"#6E6E96\",\"p-id\":\"11317\"}),t(\"path\",{d:\"M520.968696 518.919481m-83.312551 0a83.312551 83.312551 0 1 0 166.625102 0 83.312551 83.312551 0 1 0-166.625102 0Z\",fill:\"#A9A9BA\",\"p-id\":\"11318\"}),t(\"path\",{d:\"M520.968696 618.875402c-55.114521 0-99.955921-44.83724-99.955921-99.95176 0-55.118682 44.8414-99.955921 99.955921-99.955921s99.95176 44.8414 99.95176 99.955921c0 55.11036-44.83724 99.95176-99.95176 99.95176z m0-166.625101c-36.761044 0-66.669181 29.908136-66.66918 66.66918s29.908136 66.66502 66.66918 66.66502 66.66502-29.908136 66.66502-66.66502c0-36.761044-29.903976-66.669181-66.66502-66.66918z\",fill:\"#6E6E96\",\"p-id\":\"11319\"}),t(\"path\",{d:\"M301.946104 941.515457h429.985632v36.977408H301.946104z\",fill:\"#6E6E96\",\"p-id\":\"11320\"})])],-1)),g9={key:0,class:\"disk-info_mount-name\"},v9={key:1,class:\"disk-info_mount-name\"},b9={key:0,class:\"label-item\"},h9={class:\"label-item_key\"},_9={class:\"label-item_path\"},x9={class:\"label-item\"},w9={class:\"label-item_key\"},k9={class:\"label-item_value\"},y9={class:\"action-footer\"},F9=Ge(()=>t(\"div\",{class:\"auto\"},null,-1)),E9=[\"disabled\"],$9=[\"disabled\"],C9={key:1,class:\"action result\"},D9={class:\"action-body\"},B9=Ge(()=>t(\"div\",{class:\"action-body_icon\"},[t(\"svg\",{t:\"1642063181211\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"5062\",width:\"128\",height:\"128\",\"data-v-cda444e0\":\"\"},[t(\"path\",{d:\"M512 85.333333c235.648 0 426.666667 191.018667 426.666667 426.666667s-191.018667 426.666667-426.666667 426.666667S85.333333 747.648 85.333333 512 276.352 85.333333 512 85.333333z m-74.965333 550.4L346.453333 545.152a42.666667 42.666667 0 1 0-60.330666 60.330667l120.704 120.704a42.666667 42.666667 0 0 0 60.330666 0l301.653334-301.696a42.666667 42.666667 0 1 0-60.288-60.330667l-271.530667 271.488z\",fill:\"#52C41A\",\"p-id\":\"5063\",\"data-v-cda444e0\":\"\"})])],-1)),Y9={class:\"action-body_msg\"},A9=[\"innerHTML\"],S9={class:\"btns\"},z9=I({props:{action:String,disk:{type:Object,required:!0},mount:{type:Object},Close:{type:Function},Cancel:{type:Function},Next:{type:Function}},setup(o){var F;const n=o,{$gettext:a,$ngettext:l}=J(),u=()=>{n.Close&&n.Close()},d=w=>{w.preventDefault(),n.Cancel&&n.Cancel(),u()},c=w=>{n.Next&&n.Next(w),u()},k=E(!1),g=E(0),p=E(\"/mnt/data_\"+((F=n==null?void 0:n.mount)==null?void 0:F.name)),m=w=>{g.value=w};E(n.mount?\"\":\"format\"),E();const v=E(),b=()=>L(this,null,function*(){const w=n.mount;if(w==null){$.Warning(a(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u5206\\u533A\"));return}if(w.path==null||w.path==\"\"){$.Warning(a(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u5206\\u533A\\u8DEF\\u5F84\"));return}if(w.uuid==null||w.uuid==\"\"){$.Warning(a(\"\\u83B7\\u53D6\\u4E0D\\u5230\\u5206\\u533AID\"));return}k.value=!0;const h=$.Loading(a(\"\\u6302\\u8F7D\\u4E2D...\"));try{const _=yield G.Nas.Disk.Partition.Mount.POST({path:w.path,uuid:w.uuid,mountPoint:p.value});if(_!=null&&_.data){const{result:x,error:C}=_==null?void 0:_.data;C&&$.Warning(C),x&&($.Success(a(\"\\u6302\\u8F7D\\u6210\\u529F\")),v.value=x,m(1))}}catch(_){$.Error(_)}h.Close(),k.value=!1}),y=()=>{if(v.value&&v.value.mountPoint){c(v.value.mountPoint);return}$.Warning(a(\"\\u8BFB\\u53D6\\u7ED3\\u679C\\u5931\\u8D25\"))},f=()=>{};return(w,h)=>(r(),Z(wt,{type:1},{default:V(()=>[Y(St,{name:\"rotate\",mode:\"out-in\"},{default:V(()=>{var _,x;return[g.value==0?(r(),s(\"form\",{key:0,class:\"action format\",onSubmit:ft(f,[\"prevent\"])},[c9,t(\"div\",p9,[t(\"div\",f9,[m9,o.mount?(r(),s(\"div\",g9,[t(\"span\",null,\"\\u3010\"+i(o.mount.total)+\"\\u3011\",1),t(\"span\",null,i(o.mount.mountPoint),1)])):o.disk?(r(),s(\"div\",v9,[t(\"span\",null,\"\\u3010\"+i(o.disk.size)+\"\\u3011\",1),t(\"span\",null,i(o.disk.venderModel),1)])):D(\"\",!0)]),o.mount?(r(),s(\"div\",b9,[t(\"div\",h9,[t(\"span\",null,i(e(a)(\"\\u76EE\\u6807\\u5206\\u533A\")),1)]),t(\"div\",_9,i(o.mount.path)+\"\\uFF08\"+i(o.mount.total)+\"\\uFF0C\"+i((x=(_=o.mount)==null?void 0:_.filesystem)==null?void 0:x.toUpperCase())+\"\\uFF09\",1)])):D(\"\",!0),t(\"div\",x9,[t(\"div\",w9,[t(\"span\",null,i(e(a)(\"\\u6302\\u8F7D\\u70B9\")),1)]),t(\"div\",k9,[O(t(\"input\",{type:\"text\",\"onUpdate:modelValue\":h[0]||(h[0]=C=>p.value=C)},null,512),[[at,p.value,void 0,{trim:!0}]])])])]),t(\"div\",y9,[F9,t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",disabled:k.value,onClick:b},i(e(a)(\"\\u786E\\u5B9A\")),9,E9),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:d,type:\"button\",disabled:k.value},i(e(a)(\"\\u8FD4\\u56DE\")),9,$9)])],40,u9)):g.value==1?(r(),s(\"div\",C9,[t(\"div\",D9,[B9,t(\"div\",Y9,i(e(a)(\"\\u6302\\u8F7D\\u6210\\u529F\")),1),v.value?(r(),s(\"div\",{key:0,class:\"action-body_info\",innerHTML:e(a)(\"\\u5DF2\\u6210\\u529F\\u5C06\\u5206\\u533A %{dev} \\u6302\\u8F7D\\u5230 <a>%{mount}</a>\",{dev:v.value.path||\"\",mount:v.value.mountPoint||\"\"},!0)},null,8,A9)):D(\"\",!0),t(\"div\",S9,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",type:\"button\",onClick:y},i(o.action==\"nas\"?e(a)(\"\\u5B8C\\u6210\"):e(a)(\"\\u4E0B\\u4E00\\u6B65\")),1)])])])):D(\"\",!0)]}),_:1})]),_:1}))}});var P9=N(z9,[[\"__scopeId\",\"data-v-b5895698\"]]),oo=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=xt(P9,vt(st({},o),{Close:()=>{l()}}));a.mount(n);const l=()=>{a.unmount(),n.remove()};return{Close:l}};const T9={class:\"disk-content\"},I9={class:\"disk-item\"},M9={class:\"disk-item_name\"},L9={key:0},O9={key:1},N9={key:2},V9={class:\"disk_value\"},G9={class:\"disk-item_value\"},j9={class:\"value-data\"},U9={key:0,class:\"disk-item\"},q9={class:\"disk-item_name\"},R9={key:0},W9=[\"href\"],H9={key:0},J9={class:\"disk_status\"},Z9={key:0,class:\"disk_status_item\"},K9={key:0,class:\"tooltip-trigger disk_tip\"},Q9={class:\"tooltip-text tooltip-top\"},X9={class:\"disk_dir_tip\"},tm={class:\"disk_status_item\"},em={key:0,class:\"tooltip-trigger disk_tip\"},am={class:\"tooltip-text tooltip-top\"},om={class:\"disk_dir_tip\"},nm=I({props:{part:{type:Object,required:!0},disk:{type:Object,required:!0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=Q(()=>n.part.filesystem==\"No FileSystem\"),d=Q(()=>n.part.filesystem&&[\"ntfs\",\"vfat\",\"exfat\"].indexOf(n.part.filesystem)>=0),c=Q(()=>n.part.mountPoint&&n.part.isReadOnly&&n.part.filesystem!=\"swap\"),k=Q(()=>u.value||!n.part.isSystemRoot&&(c.value||d.value||!n.part.mountPoint&&n.part.filesystem==\"swap\")),g=function(){la({action:\"disk\",disk:n.disk,mount:n.part,Cancel:()=>{},Next:y=>{location.reload()}})},p=()=>{oo({action:\"nas\",disk:n.disk,mount:n.part,Cancel:()=>{},Next:()=>{location.reload()}})},m=()=>L(this,null,function*(){const y=$.Loading(a(\"\\u5904\\u7406\\u4E2D...\"));try{const f=yield G.Nas.Disk.InitRest.POST({name:n.disk.name,path:n.disk.path});if(f!=null&&f.data){const{result:F,error:w}=f==null?void 0:f.data;w&&$.Warning(w),F&&($.Success(a(\"\\u6302\\u8F7D\\u6210\\u529F\")),location.reload())}}catch(f){$.Error(f)}y.Close()}),v=Q(()=>n.part.filesystem==\"Free Space\"),b=Q(()=>{const y=n.part.mountPoint?n.part.mountPoint:\"\";return y.indexOf(\"/mnt/\")==0?\"/cgi-bin/luci/admin/services/linkease/file/?path=/\"+y.substring(5):\"/cgi-bin/luci/admin/services/linkease/file/?path=/root\"+y});return(y,f)=>{var w;const F=_t(\"progress-item\");return r(),s(\"div\",T9,[t(\"li\",I9,[t(\"div\",M9,[e(v)?(r(),s(\"span\",L9,i(e(a)(\"\\u672A\\u5206\\u533A\")),1)):(r(),s(\"span\",O9,i(o.part.name)+i(o.part.mountPoint?\"\":e(u)?e(a)(\"\\uFF08\\u672A\\u683C\\u5F0F\\u5316\\uFF09\"):e(a)(\"\\uFF08\\u672A\\u6302\\u8F7D\\uFF09\")),1)),o.part.isSystemRoot?(r(),s(\"span\",N9,i(e(a)(\"\\uFF08\\u7CFB\\u7EDF\\u5206\\u533A\\uFF09\")),1)):D(\"\",!0)]),t(\"div\",V9,[t(\"div\",G9,[t(\"div\",j9,[Y(F,{value:e(v)||!o.part.usage?0:o.part.usage,text:e(v)?e(a)(\"\\u672A\\u5206\\u533A\\uFF08%{total}\\uFF09\",{total:o.part.total||\"\"}):(o.part.mountPoint&&o.part.filesystem!=\"swap\"?o.part.used:e(a)(\"\\u672A\\u77E5\"))+\"/\"+(o.part.total||\"\"),style:{backgroundColor:\"#767676\"}},null,8,[\"value\",\"text\"])])]),e(v)?(r(),s(\"button\",{key:0,class:\"cbi-button cbi-button-apply\",onClick:m},i(e(a)(\"\\u5206\\u533A\\u5E76\\u683C\\u5F0F\\u5316\")),1)):e(k)?(r(),s(\"button\",{key:1,class:\"cbi-button cbi-button-apply\",onClick:g},i(e(a)(\"\\u683C\\u5F0F\\u5316\\u5206\\u533A\")),1)):D(\"\",!0)])]),!e(v)&&!e(u)?(r(),s(\"li\",U9,[t(\"span\",q9,[o.part.mountPoint?(r(),s(U,{key:0},[o.part.filesystem==\"swap\"?(r(),s(\"span\",R9,i(e(a)(\"\\u5DF2\\u6302\\u8F7D\\u4E3A\\u4EA4\\u6362\\u533A\")),1)):(r(),s(\"a\",{key:1,href:e(b),target:\"_blank\"},i(o.part.mountPoint),9,W9))],64)):(r(),s(U,{key:1},[o.part.filesystem==\"swap\"?(r(),s(\"span\",H9,i(e(a)(\"\\u4E0D\\u652F\\u6301\\u6302\\u8F7D\")),1)):(r(),s(\"span\",{key:1,class:\"value-data buttondiv\",onClick:p},i(e(a)(\"\\u624B\\u52A8\\u6302\\u8F7D\")),1))],64))]),t(\"div\",J9,[o.part.mountPoint&&o.part.filesystem!=\"swap\"?(r(),s(\"div\",Z9,[t(\"div\",null,i(e(a)(\"\\u53EF\\u8BFB\\u5199\\u72B6\\u6001\\uFF1A\"))+i(o.part.isReadOnly?e(a)(\"\\u53EA\\u8BFB\"):e(a)(\"\\u8BFB\\u5199\")),1),e(c)?(r(),s(\"div\",K9,[Y(It),t(\"div\",Q9,[t(\"div\",X9,i(e(a)(\"\\u6B64\\u5206\\u533A\\u4E3A\\u53EA\\u8BFB\\u72B6\\u6001\\uFF0C\\u53EF\\u80FD\\u65E0\\u6CD5\\u5199\\u5165\\u6570\\u636E\")),1)])])):D(\"\",!0)])):D(\"\",!0),t(\"div\",tm,[t(\"div\",null,i(e(a)(\"\\u6587\\u4EF6\\u7CFB\\u7EDF\\uFF1A\"))+i((w=o.part.filesystem)==null?void 0:w.toUpperCase()),1),!o.part.isSystemRoot&&e(d)?(r(),s(\"div\",em,[Y(It),t(\"div\",am,[t(\"span\",om,i(e(a)(\"\\u6B64\\u6587\\u4EF6\\u7CFB\\u7EDF\\u4E0D\\u652F\\u6301Docker\\u7B49\\u5E94\\u7528\\u6570\\u636E\\uFF0C\\u5EFA\\u8BAE\\u683C\\u5F0F\\u5316\\u6210EXT4\\u6587\\u4EF6\\u7CFB\\u7EDF\")),1)])])):D(\"\",!0)])])])):D(\"\",!0)])}}});var im=N(nm,[[\"__scopeId\",\"data-v-10dd00b8\"]]);const rm=o=>(ut(\"data-v-127a3100\"),o=o(),ct(),o),sm={key:0,class:\"action\"},dm={class:\"title\"},lm={class:\"app-container_info\"},um={class:\"app-container_body\"},cm={class:\"action-footer\"},pm=rm(()=>t(\"div\",{class:\"auto\"},null,-1)),fm=I({props:{disk:{type:Object,required:!0},Close:{type:Function},Cancel:{type:Function},Next:{type:Function}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=E(0),d=()=>{n.Close&&n.Close()},c=k=>{k.preventDefault(),n.Cancel&&n.Cancel(),d()};return(k,g)=>(r(),Z(wt,{Close:o.Close,type:1},{default:V(()=>[Y(St,{name:\"rotate\",mode:\"out-in\"},{default:V(()=>[u.value==0?(r(),s(\"div\",sm,[t(\"h2\",dm,i(e(a)(\"\\u5206\\u533A\\u4FE1\\u606F\"))+\" - \"+i((o.disk.name||\"?\")+(o.disk.isSystemRoot?e(a)(\"\\uFF08\\u7CFB\\u7EDF\\u76D8\\uFF09\"):\"\")),1),t(\"ul\",null,[t(\"li\",null,[t(\"div\",lm,[t(\"span\",null,i(e(a)(\"\\u5206\\u533A / \\u6302\\u8F7D\\u70B9\")),1),t(\"span\",null,i(e(a)(\"\\u5BB9\\u91CF\")),1)]),t(\"div\",um,[(r(!0),s(U,null,tt(o.disk.childrens,(p,m)=>(r(),Z(im,{key:m,part:p,disk:o.disk},null,8,[\"part\",\"disk\"]))),128))])])]),t(\"div\",cm,[pm,t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:c,type:\"button\"},i(e(a)(\"\\u8FD4\\u56DE\")),1)])])):D(\"\",!0)]),_:1})]),_:1},8,[\"Close\"]))}});var mm=N(fm,[[\"__scopeId\",\"data-v-127a3100\"]]),gm=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=xt(mm,vt(st({},o),{Close:()=>{l()}}));a.component(\"progress-item\",Ua),a.mount(n);const l=()=>{a.unmount(),n.remove()};return{Close:l}};const vm={class:\"progress-bar-wrapper\"},bm={key:0,class:\"percentage-text\"},hm={props:{percentage:{type:Number,default:0,validator:o=>o>=0&&o<=100},color:{type:String,default:\"#4CAF50\"},backgroundColor:{type:String,default:\"#e0e0e0\"},height:{type:[String,Number],default:\"20px\"},borderRadius:{type:[String,Number],default:\"4px\"},showPercentage:{type:Boolean,default:!0},gradient:{type:Boolean,default:!1},gradientColors:{type:String,default:\"linear-gradient(90deg, #4CAF50, #45a049)\"},duration:{type:Number,default:1e3}},setup(o){const n=o,a=Q(()=>({height:typeof n.height==\"number\"?`${n.height}px`:n.height,borderRadius:typeof n.borderRadius==\"number\"?`${n.borderRadius}px`:n.borderRadius,backgroundColor:n.backgroundColor,overflow:\"hidden\"})),l=Q(()=>{const u={height:\"100%\",width:`${n.percentage}%`,borderRadius:typeof n.borderRadius==\"number\"?`${n.borderRadius}px`:n.borderRadius,transition:`width ${n.duration}ms cubic-bezier(0.4, 0, 0.2, 1)`,position:\"relative\",overflow:\"hidden\"};return n.gradient?vt(st({},u),{background:n.gradientColors}):vt(st({},u),{background:n.color})});return(u,d)=>(r(),s(\"div\",vm,[t(\"div\",{class:\"progress-bar\",style:ht(e(a))},[t(\"div\",{class:\"progress-fill\",style:ht(e(l))},[o.showPercentage?(r(),s(\"span\",bm,i(Math.round(o.percentage))+\"% \",1)):D(\"\",!0)],4)],4)]))}};var no=N(hm,[[\"__scopeId\",\"data-v-2e966a39\"]]);const _m={key:0,class:\"disk-item error\"},xm=[\"title\"],wm={class:\"disk-item_value\"},km={class:\"value-data\"},ym={class:\"error\"},Fm={key:1,class:\"disk-item\"},Em=[\"title\"],$m={key:0,class:\"disk_value\"},Cm={class:\"value-data\"},Dm={href:\"/cgi-bin/luci/admin/nas/smart\"},Bm={class:\"error\"},Ym={key:1,class:\"disk_value\"},Am={class:\"disk-item_value\"},Sm={class:\"value-data\"},zm={class:\"disk-item-tooltip\"},Pm={class:\"disk_icon\"},Tm={key:0,class:\"tooltip-trigger\"},Im={class:\"disk_tip\"},Mm={class:\"tooltip-text tooltip-top\"},Lm={class:\"disk_dir_tip\"},Om={key:1,class:\"tooltip-trigger\"},Nm={class:\"disk_tip\"},Vm={class:\"tooltip-text tooltip-top\"},Gm={class:\"disk_dir_tip\"},jm={key:2,class:\"disk-item load\"},Um=[\"title\"],qm={class:\"disk_value\"},Rm={class:\"disk-item_value\"},Wm={class:\"value-data\"},Hm={key:3,class:\"disk-item load\"},Jm=[\"title\"],Zm={class:\"disk_value\"},Km={key:0,class:\"disk-item_value\"},Qm={class:\"value-data\"},Xm={class:\"disk_icon\"},tg=I({props:{disk:{type:Object,required:!0},smartWarning:{type:Boolean}},setup(o){const n=o,{$gettext:a}=J(),l=Q(()=>n.disk.errorInfo?\"error\":n.disk.isSystemRoot?\"success\":n.disk.childrens==null||n.disk.childrens.length==0||n.disk.childrens.length==1&&n.disk.childrens[0].filesystem==\"No FileSystem\"?\"load\":n.disk.childrens.filter(m=>m.mountPoint).length==0?\"unmounted\":\"success\"),u=Q(()=>{const m=n.disk;let v=m.name;return m.size&&(v+=`\\u3010${m.size}\\u3011`),m.venderModel&&(v+=`(${m.venderModel})`),v}),d=Q(()=>{var v;const m=n.disk;return!m.isSystemRoot&&(((v=m.childrens)==null?void 0:v.filter(b=>b.isReadOnly&&b.filesystem!=\"swap\").length)||0)>0}),c=()=>{la({action:\"disk\",disk:n.disk,Cancel:()=>{},Next:()=>{location.reload()}})},k=()=>{gm({action:\"disk\",disk:n.disk,Cancel:()=>{},Next:()=>{location.reload()}})},g=()=>{const m=n.disk,v=m.childrens||[];oo({action:\"nas\",disk:m,mount:v[0],Cancel:()=>{},Next:()=>{location.reload()}})},p=m=>m<50?\"#2fc867\":m>50&&m<=75?\"#f97316\":\"#dc2626\";return(m,v)=>{var b,y,f,F,w,h;return e(l)==\"error\"?(r(),s(\"li\",_m,[t(\"div\",{class:\"disk-item_name\",title:e(u)},[t(\"span\",null,i(e(u)),1)],8,xm),t(\"div\",wm,[t(\"div\",km,[t(\"span\",ym,i(o.disk.errorInfo),1)])])])):e(l)==\"success\"?(r(),s(\"li\",Fm,[t(\"div\",{class:\"disk-item_name\",title:e(u)},[t(\"span\",null,i(e(u)),1)],8,Em),o.disk.smartWarning&&o.smartWarning?(r(),s(\"div\",$m,[t(\"div\",Cm,[t(\"a\",Dm,[t(\"span\",Bm,i(e(a)(\"S.M.A.R.T\\u5F02\\u5E38\")),1)])])])):(r(),s(\"div\",Ym,[t(\"div\",Am,[t(\"div\",Sm,[Y(no,{percentage:o.disk.usage||0,showPercentage:!1,height:\"10px\",borderRadius:\"10px\",color:p(o.disk.usage||0),backgroundColor:\"#f4f5f7\"},null,8,[\"percentage\",\"color\"]),t(\"div\",null,[t(\"span\",null,i(e(a)(\"\\u4F7F\\u7528\\u7387\"))+\"\\uFF1A\"+i(o.disk.usage||0)+\"%\",1),t(\"span\",null,i(e(a)(\"\\u5DF2\\u4F7F\\u7528\"))+\"\\uFF1A\"+i(o.disk.used),1)])]),t(\"div\",zm,[t(\"span\",null,i(e(a)(\"\\u4EC5\\u7EDF\\u8BA1\\u5DF2\\u6302\\u8F7D\\u5206\\u533A\")),1)])]),t(\"div\",Pm,[o.disk.isDockerRoot&&o.disk.isSystemRoot&&o.disk.usage&&o.disk.usage>=90?(r(),s(\"span\",Tm,[t(\"span\",Im,[Y(It)]),t(\"div\",null,[t(\"div\",Mm,[t(\"span\",Lm,i(e(a)(\"\\u60A8\\u7684\\u7CFB\\u7EDF\\u7A7A\\u95F4\\u5DF2\\u4E0D\\u8DB3\\uFF0C\\u68C0\\u6D4B\\u5230\\u60A8\\u7684Docker\\u6839\\u76EE\\u5F55\\u4F4D\\u4E8E\\u7CFB\\u7EDF\\u6839\\u76EE\\u5F55\\u4E0A\\uFF0C\\u53EF\\u80FD\\u4F1A\\u5F71\\u54CD\\u7CFB\\u7EDF\\u7684\\u6B63\\u5E38\\u8FD0\\u884C\\uFF0C\\u5EFA\\u8BAE\\u4F7F\\u7528Docker\\u8FC1\\u79FB\\u5411\\u5BFC\\u5C06Docker\\u6839\\u76EE\\u5F55\\u8FC1\\u79FB\\u5230\\u5916\\u7F6E\\u786C\\u76D8\\u4E0A\\u3002\")),1)])])])):D(\"\",!0),e(d)?(r(),s(\"span\",Om,[t(\"span\",Nm,[Y(It)]),t(\"div\",null,[t(\"div\",Vm,[t(\"span\",Gm,i(e(a)(\"\\u5206\\u533A\\u5B58\\u5728\\u5F02\\u5E38\\uFF0C\\u70B9\\u51FB\\u5206\\u533A\\u5217\\u8868\\u67E5\\u770B\\u9519\\u8BEF\")),1)])])])):D(\"\",!0),e(d)&&(((b=o.disk.childrens)==null?void 0:b.length)||0)==1?(r(),s(\"span\",{key:2,class:\"disk_infoicon\",onClick:v[0]||(v[0]=_=>c())},[Y(l9)])):D(\"\",!0),(((y=o.disk.childrens)==null?void 0:y.length)||0)>0?(r(),s(\"span\",{key:3,class:\"disk_infoicon\",onClick:v[1]||(v[1]=_=>k())},[Y(Aa,{style:{color:\"var(--app-container_title-color)\"}})])):D(\"\",!0)])]))])):e(l)==\"load\"?(r(),s(\"li\",jm,[t(\"div\",{class:\"disk-item_name\",title:e(u)},[t(\"span\",null,i(e(u)),1)],8,Um),t(\"div\",qm,[t(\"div\",Rm,[t(\"div\",Wm,[t(\"button\",{onClick:v[2]||(v[2]=_=>c())},i(e(a)(\"\\u683C\\u5F0F\\u5316\\u5E76\\u6302\\u8F7D\")),1)])])])])):e(l)==\"unmounted\"?(r(),s(\"li\",Hm,[t(\"div\",{class:\"disk-item_name\",title:e(u)},[t(\"span\",null,i(e(u)),1)],8,Jm),t(\"div\",Zm,[(((f=o.disk.childrens)==null?void 0:f.length)||0)==1?(r(),s(\"div\",Km,[t(\"div\",Qm,[((w=(F=o.disk.childrens)==null?void 0:F[0])==null?void 0:w.filesystem)==\"swap\"?(r(),s(\"button\",{key:0,onClick:v[3]||(v[3]=_=>k())},i(e(a)(\"\\u67E5\\u770B\\u8BE6\\u60C5\")),1)):(r(),s(\"button\",{key:1,onClick:v[4]||(v[4]=_=>g())},i(e(a)(\"\\u624B\\u52A8\\u6302\\u8F7D\")),1))])])):D(\"\",!0),t(\"div\",Xm,[(((h=o.disk.childrens)==null?void 0:h.length)||0)>1?(r(),s(\"span\",{key:0,class:\"disk_infoicon\",onClick:v[5]||(v[5]=_=>k())},[Y(Aa,{style:{color:\"var(--app-container_title-color)\"}})])):D(\"\",!0)])])])):D(\"\",!0)}}});var Ke=N(tg,[[\"__scopeId\",\"data-v-c3855aca\"]]);const eg=o=>(ut(\"data-v-6f7fe2ab\"),o=o(),ct(),o),ag={href:\"/cgi-bin/luci/admin/nas/raid\"},og=eg(()=>t(\"div\",null,[t(\"a\",{href:\"/cgi-bin/luci/admin/nas/smart\"},\"S.M.A.R.T.\")],-1)),ng={href:\"/cgi-bin/luci/admin/system/diskman\"},ig={href:\"/cgi-bin/luci/admin/system/mounts\"},rg={class:\"content\"},sg={key:0,class:\"disk_loading_icon\"},dg={class:\"disk_loading_info\"},lg={class:\"item\",style:{\"margin-top\":\"4px\",\"padding-bottom\":\"0\"}},ug={class:\"icon_box\"},cg={class:\"info\"},pg={class:\"name\"},fg={class:\"schedule\"},mg={key:0,class:\"line\"},gg={key:1,class:\"item\"},vg={class:\"icon_box\",style:{background:\"#f3e8ff\"}},bg={class:\"info\"},hg={class:\"name\"},_g={class:\"schedule\"},xg={key:2,class:\"item\"},wg={class:\"icon_box\",style:{background:\"#dbfce7\"}},kg={class:\"info\"},yg={class:\"name\"},Fg={class:\"schedule\"},Eg=I({setup(o){const{$gettext:n}=J(),a=E(!1),l=gt({disks:null,raidList:null}),u=()=>{G.Nas.Disk.Status.GET().then(k=>{var g;if((g=k==null?void 0:k.data)!=null&&g.result){const p=k.data.result;l.disks=p.disks||[]}})};(()=>L(this,null,function*(){try{const k=yield G.Raid.List.GET();if(k!=null&&k.data){const{success:g,error:p,result:m}=k.data;if(m&&(l.raidList=m.disks||[]),p)throw p}}catch(k){console.log(k)}}))(),u();const c=()=>{zt.installAndGo(\"luci-app-linkease\",n(\"\\u6613\\u6709\\u4E91\"),\"/cgi-bin/luci/admin/services/linkease/file/\",\"app-meta-linkease\")};return(k,g)=>{const p=_t(\"icon-loading\");return r(),Z(Wt,{title:e(n)(\"\\u78C1\\u76D8\\u4FE1\\u606F\"),style:{width:\"100%\",display:\"block\"},\"is-settings-menu-open\":a.value,\"onUpdate:isSettingsMenuOpen\":g[1]||(g[1]=m=>a.value=m)},{icon:V(()=>[Y(Ya,{color:\"#45556c\",class:\"icon\"})]),settings:V(()=>[t(\"div\",{class:\"btn_settings\",onClick:c},[Y(Jf,{color:\"#0a0a0a\",class:\"icon1 interfaceIcon\",style:{\"margin-right\":\"6px\"}}),t(\"span\",null,i(e(n)(\"\\u6587\\u4EF6\\u7BA1\\u7406\")),1),t(\"div\",{class:\"rotation\",onClick:g[0]||(g[0]=ft(m=>a.value=!a.value,[\"stop\"]))},[Y(Ee,{class:\"moreIcon\"})])])]),\"settings-menu\":V(()=>[t(\"div\",null,[t(\"a\",ag,i(e(n)(\"RAID\\u7BA1\\u7406\")),1)]),og,t(\"div\",null,[t(\"a\",ng,i(e(n)(\"\\u78C1\\u76D8\\u7BA1\\u7406\")),1)]),t(\"div\",null,[t(\"a\",ig,i(e(n)(\"\\u6302\\u8F7D\\u70B9\")),1)])]),default:V(()=>{var m,v,b,y;return[t(\"div\",rg,[!e(l).disks&&!e(l).raidList?(r(),s(\"div\",sg,[Y(p,{size:38,color:\"#888888\"}),t(\"span\",dg,i(e(n)(\"\\u6B63\\u5728\\u83B7\\u53D6\\u78C1\\u76D8\\u4FE1\\u606F...\")),1)])):D(\"\",!0),e(l).disks?(r(),s(U,{key:1},[t(\"div\",lg,[t(\"div\",ug,[Y(Ya,{color:\"#2b6cfc\",class:\"icon\"})]),t(\"div\",cg,[t(\"div\",pg,[t(\"div\",null,i(e(n)(\"\\u7CFB\\u7EDF\\u6839\\u76EE\\u5F55\")),1)]),t(\"div\",fg,[(r(!0),s(U,null,tt((m=e(l).disks)==null?void 0:m.filter(f=>f.isSystemRoot),(f,F)=>(r(),Z(Ke,{key:F,disk:f},null,8,[\"disk\"]))),128))])])]),((v=e(l).disks)==null?void 0:v.filter(f=>!f.isSystemRoot).length)>0?(r(),s(\"div\",mg)):D(\"\",!0),((b=e(l).disks)==null?void 0:b.filter(f=>!f.isSystemRoot).length)>0?(r(),s(\"div\",gg,[t(\"div\",vg,[Y(Qf,{class:\"icon\"})]),t(\"div\",bg,[t(\"div\",hg,[t(\"div\",null,i(e(n)(\"\\u5DF2\\u6302\\u8F7D\\u78C1\\u76D8\")),1)]),t(\"div\",_g,[(r(!0),s(U,null,tt((y=e(l).disks)==null?void 0:y.filter(f=>!f.isSystemRoot),(f,F)=>(r(),Z(Ke,{key:F,disk:f,smartWarning:!0},null,8,[\"disk\"]))),128))])])])):D(\"\",!0)],64)):D(\"\",!0),e(l).raidList&&e(l).raidList.length>0?(r(),s(\"div\",xg,[t(\"div\",wg,[Y(eo,{color:\"#0bab47\",class:\"icon\"})]),t(\"div\",kg,[t(\"div\",yg,[t(\"div\",null,i(e(n)(\"RAID\\u8BBE\\u5907\")),1)]),t(\"div\",Fg,[(r(!0),s(U,null,tt(e(l).raidList,(f,F)=>(r(),Z(Ke,{key:F,disk:f},null,8,[\"disk\"]))),128))])])])):D(\"\",!0)])]}),_:1},8,[\"title\",\"is-settings-menu-open\"])}}});var $g=N(Eg,[[\"__scopeId\",\"data-v-6f7fe2ab\"]]);const Cg={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},Dg=[\"fill\"],Sa=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",Cg,[t(\"path\",{d:\"M473.950316 63.164632l488.070737 234.226526v414.234947l-337.92 200.111158-502.837895-295.019789V223.447579l352.687158-160.282947zM200.434526 306.661053V571.284211l383.892211 225.28V510.113684L200.434526 306.661053z m682.253474 82.728421l-219.082105 120.400842v286.396631l219.082105-129.670736V389.335579z m-409.761684-238.753685L258.910316 247.915789l364.759579 193.374316 212.075789-116.520421-362.819368-174.08z\",fill:o.color,\"p-id\":\"6174\"},null,8,Dg)]))}}),Bg=o=>(ut(\"data-v-64cabc6e\"),o=o(),ct(),o),Yg={class:\"app-container_docker\"},Ag={class:\"docker-item\"},Sg={class:\"docker-item_name\"},zg={key:0,class:\"docker-item_value\"},Pg={class:\"configure\"},Tg={key:1,class:\"docker-item_value\"},Ig={class:\"input-switch\"},Mg=[\"value\",\"disabled\"],Lg=Bg(()=>t(\"em\",null,null,-1)),Og=[Lg],Ng={key:0,class:\"status-icon\"},Vg={key:1,class:\"status-icon\",style:{background:\"#e9ebef\",color:\"#4a5565\"}},Gg={key:0,class:\"content\"},jg={class:\"docker-item_name\"},Ug={class:\"docker_box\"},qg={class:\"path\"},Rg={key:0},Wg={class:\"tooltip-trigger\"},Hg={class:\"docker_tip\"},Jg={class:\"tooltip-text tooltip-top\"},Zg={class:\"docker_dir_tip\"},Kg=I({props:{docker:{type:Object}},setup(o){var k;const n=o,{$gettext:a,$ngettext:l}=J(),u=Q(()=>{var g;return((g=n.docker)==null?void 0:g.status)!=\"not installed\"}),d=gt({enable:((k=n.docker)==null?void 0:k.status)==\"running\",disabled:!1}),c=()=>L(this,null,function*(){d.disabled=!0;try{const g=yield G.Guide.DockerSwitch.POST({enable:d.enable});if(g!=null&&g.data){const{success:p,error:m}=g.data;if(m)throw d.enable=!d.enable,m;(p||0)==0}}catch(g){$.Warning(`${g}`)}finally{d.disabled=!1}});return(g,p)=>{var m,v,b,y;return r(),s(\"ul\",Yg,[t(\"li\",Ag,[t(\"div\",Sg,[t(\"span\",null,i(e(a)(\"\\u5F53\\u524D\\u72B6\\u6001:\")),1)]),(m=n.docker)!=null&&m.status?(r(),s(U,{key:0},[e(u)?(r(),s(\"div\",Tg,[t(\"label\",Ig,[O(t(\"input\",{type:\"checkbox\",hidden:\"\",value:!e(d).enable,\"onUpdate:modelValue\":p[0]||(p[0]=f=>e(d).enable=f),disabled:e(d).disabled,onChange:c},null,40,Mg),[[Rt,e(d).enable]]),t(\"span\",{class:lt(e(d).enable?\"enable\":\"close\")},Og,2)]),e(d).enable?(r(),s(\"span\",Ng,i(e(a)(\"\\u8FD0\\u884C\\u4E2D\")),1)):D(\"\",!0),e(d).enable?D(\"\",!0):(r(),s(\"span\",Vg,i(e(a)(\"\\u672A\\u542F\\u7528\")),1))])):(r(),s(\"div\",zg,[t(\"span\",Pg,i(e(a)(\"\\u672A\\u5B89\\u88C5\")),1)]))],64)):D(\"\",!0)]),((v=o.docker)==null?void 0:v.status)==\"running\"?(r(),s(\"li\",Gg,[t(\"div\",jg,[t(\"span\",{style:ht({color:\"var(--app-container_title-color)\"})},i(e(a)(\"Docker\\u6839\\u76EE\\u5F55\\uFF1A\")),5)]),t(\"div\",Ug,[t(\"div\",qg,i((b=o.docker)==null?void 0:b.path),1),(y=o.docker)!=null&&y.errorInfo?(r(),s(\"span\",Rg,[t(\"span\",Wg,[t(\"span\",Hg,[Y(It)]),t(\"div\",null,[t(\"div\",Jg,[t(\"span\",Zg,i(o.docker.errorInfo),1)])])])])):D(\"\",!0)])])):D(\"\",!0)])}}});var Qg=N(Kg,[[\"__scopeId\",\"data-v-64cabc6e\"]]);const Xg={},tv={width:\"128px\",height:\"128px\",viewBox:\"0 0 128 128\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},ev=t(\"g\",{id:\"icon_yellow\",stroke:\"none\",\"stroke-width\":\"1\",fill:\"none\",\"fill-rule\":\"evenodd\"},[t(\"g\",{id:\"Icon/Warning\"},[t(\"rect\",{id:\"\\u77E9\\u5F62\",fill:\"#000000\",\"fill-rule\":\"nonzero\",opacity:\"0\",x:\"0\",y:\"0\",width:\"128\",height:\"128\"}),t(\"path\",{d:\"M64,8 C33.075,8 8,33.075 8,64 C8,94.925 33.075,120 64,120 C94.925,120 120,94.925 120,64 C120,33.075 94.925,8 64,8 Z M60,37 C60,36.45 60.45,36 61,36 L67,36 C67.55,36 68,36.45 68,37 L68,71 C68,71.55 67.55,72 67,72 L61,72 C60.45,72 60,71.55 60,71 L60,37 Z M64,92 C60.6875,92 58,89.3125 58,86 C58,82.6875 60.6875,80 64,80 C67.3125,80 70,82.6875 70,86 C70,89.3125 67.3125,92 64,92 Z\",id:\"\\u5F62\\u72B6\",fill:\"#FAAD14\"})])],-1),av=[ev];function ov(o,n){return r(),s(\"svg\",tv,av)}var nv=N(Xg,[[\"render\",ov]]);const iv={key:0,class:\"action\"},rv={class:\"title\"},sv={class:\"desc\"},dv={class:\"roots\"},lv={class:\"roots_tit\"},uv={class:\"root\"},cv={class:\"move\"},pv={class:\"roots_tit\"},fv={key:0},mv=[\"onSubmit\"],gv={class:\"select-editable\"},vv={selected:\"\",value:null},bv=[\"value\"],hv={value:\"useInput\"},_v=[\"placeholder\"],xv={key:1,class:\"tips\"},wv={class:\"tips_content\"},kv={class:\"tip\"},yv={key:0,class:\"btns\"},Fv={key:1,class:\"btns\"},Ev={key:1,class:\"action docker_success\"},$v={class:\"title\"},Cv={class:\"finished\"},Dv={class:\"successed\"},Bv={class:\"btns\"},Yv={key:2,class:\"action docker_download\"},Av={class:\"title\"},Sv={class:\"finished\"},zv={class:\"successed\"},Pv={class:\"docker_moves\"},Tv={class:\"moves change\"},Iv={for:\"move\"},Mv={class:\"moves\"},Lv={for:\"cover\"},Ov={class:\"btns\"},Nv=I({props:{rootPath:{type:String,required:!0},Close:Function},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=E(),d=E(),c=E(0),k=E(\"null\"),g=E(\"\"),p=E(),m=E(!1),v=E(\"\");(()=>{G.Nas.Disk.Status.GET().then(x=>{x!=null&&x.data.result&&(p.value=x==null?void 0:x.data.result)}),G.Guide.DockerStatus.GET().then(x=>{var C;if((C=x==null?void 0:x.data)!=null&&C.result){const S=x.data.result;u.value=S}}),G.Guide.DockerPartitionList.GET().then(x=>{var C;if((C=x==null?void 0:x.data)!=null&&C.result){const S=x.data.result;d.value=S}})})();const y=x=>{let C=k.value;if(C==\"useInput\"&&(C=g.value),C==null||C==\"null\"||C==\"\")return;const S=$.Loading(a(\"\\u6B63\\u5728\\u8FC1\\u79FB\\u4E2D...\"));G.Guide.DockerTransfer.POST({path:C,force:x,overwriteDir:!!v.value}).then(A=>{var z;if(A!=null&&A.data){if((A.data.success||0)==0){if((z=A.data.result)!=null&&z.emptyPathWarning){m.value=!0,c.value=2;return}c.value=1;return}else if(A.data.error)throw A.data.error}throw a(\"\\u672A\\u77E5\\u9519\\u8BEF\")}).catch(A=>{$.Error(A)}).finally(()=>S.Close())},f=()=>{m.value=!1,y(!1)},F=x=>{x.preventDefault(),n.Close&&n.Close()},w=x=>{x.preventDefault(),location.reload()},h=x=>{x.preventDefault(),c.value=0},_=x=>{x.preventDefault(),y(!0)};return(x,C)=>(r(),Z(wt,{Close:o.Close,type:1},{default:V(()=>{var S,A,z,B,H,M;return[c.value==0?(r(),s(\"div\",iv,[t(\"h2\",rv,i(e(a)(\"Docker\\u8FC1\\u79FB\\u5411\\u5BFC\")),1),t(\"p\",sv,i(e(a)(\"\\u5F53\\u7CFB\\u7EDF\\u6839\\u76EE\\u5F55\\u7A7A\\u95F4\\u4E0D\\u8DB3\\u65F6\\uFF0C\\u53EF\\u5C06Docker\\u6839\\u76EE\\u5F55\\u8FC1\\u79FB\\u5230\\u5916\\u7F6E\\u786C\\u76D8\\uFF0C\\u4EE5\\u4FDD\\u8BC1\\u7CFB\\u7EDF\\u7684\\u6B63\\u5E38\\u8FD0\\u884C\\uFF08\\u76EE\\u6807\\u5206\\u533A\\u4E0D\\u652F\\u6301NTFS\\uFF0CFAT\\u7B49\\u6587\\u4EF6\\u7CFB\\u7EDF\\uFF09\")),1),t(\"div\",dv,[t(\"span\",lv,i(e(a)(\"Docker\\u6839\\u76EE\\u5F55\\uFF1A\")),1),t(\"span\",uv,i((S=u.value)==null?void 0:S.path),1)]),t(\"div\",cv,[t(\"span\",pv,i(e(a)(\"\\u8FC1\\u79FB\\u5230\\uFF1A\")),1),(z=(A=d.value)==null?void 0:A.partitionList)!=null&&z.length?(r(),s(\"div\",fv,[t(\"form\",{onSubmit:ft(f,[\"prevent\"])},[t(\"label\",null,[t(\"div\",gv,[O(t(\"select\",{\"onUpdate:modelValue\":C[0]||(C[0]=q=>k.value=q)},[t(\"option\",vv,i(e(a)(\"\\u8BF7\\u9009\\u62E9\\u8FC1\\u79FB\\u8DEF\\u5F84\")),1),(r(!0),s(U,null,tt((B=d.value)==null?void 0:B.partitionList,(q,T)=>(r(),s(\"option\",{value:q,key:T},i(q),9,bv))),128)),t(\"option\",hv,i(e(a)(\"- -\\u81EA\\u5B9A\\u4E49- -\")),1)],512),[[pt,k.value,void 0,{trim:!0}]]),k.value==\"useInput\"?O((r(),s(\"input\",{key:0,type:\"text\",\"onUpdate:modelValue\":C[1]||(C[1]=q=>g.value=q),required:\"\",placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165\\u8FC1\\u79FB\\u8DEF\\u5F84\")},null,8,_v)),[[at,g.value,void 0,{trim:!0}]]):D(\"\",!0)])])],40,mv)])):d.value?(r(),s(\"div\",xv,[t(\"div\",wv,[Y(It),t(\"span\",kv,i(e(a)(\"\\u68C0\\u6D4B\\u5230\\u60A8\\u8FD8\\u6CA1\\u6709\\u6302\\u8F7D\\u5916\\u7F6E\\u786C\\u76D8\\u6216\\u5206\\u533A\\u5C0F\\u4E8E8GB\\uFF0C\\u9700\\u8981\\u60A8\\u63A5\\u4E0A\\u786C\\u76D8\\u5E76\\u683C\\u5F0F\\u5316\\u6216\\u624B\\u52A8\\u6302\\u8F7D\\u786C\\u76D8\\u540E\\uFF0C\\u518D\\u6267\\u884CDocker\\u8FC1\\u79FB\\u5411\\u5BFC\\uFF0C\\u5C06Docker\\u8FC1\\u79FB\\u5230\\u76EE\\u6807\\u786C\\u76D8\\u3002\")),1)])])):D(\"\",!0)]),(M=(H=d.value)==null?void 0:H.partitionList)!=null&&M.length?(r(),s(\"div\",yv,[t(\"button\",{class:\"cbi-button cbi-button-apply\",onClick:f},i(e(a)(\"\\u786E\\u5B9A\")),1),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",type:\"button\",onClick:F},i(e(a)(\"\\u53D6\\u6D88\")),1)])):(r(),s(\"div\",Fv,[t(\"button\",{class:\"cbi-button cbi-button-apply\",onClick:F},i(e(a)(\"\\u786E\\u5B9A\")),1)]))])):c.value==1?(r(),s(\"div\",Ev,[t(\"h2\",$v,i(e(a)(\"Docker\\u8FC1\\u79FB\\u5411\\u5BFC\")),1),t(\"div\",Cv,[Y(ua)]),t(\"p\",Dv,i(e(a)(\"\\u8FC1\\u79FB\\u6210\\u529F\\uFF01\")),1),t(\"div\",Bv,[t(\"button\",{class:\"cbi-button cbi-button-apply\",onClick:w},i(e(a)(\"\\u786E\\u5B9A\")),1)])])):c.value==2?(r(),s(\"div\",Yv,[t(\"h2\",Av,i(e(a)(\"Docker\\u8FC1\\u79FB\\u5411\\u5BFC\")),1),t(\"div\",Sv,[Y(nv)]),t(\"p\",zv,i(e(a)(\"\\u8BE5\\u76EE\\u6807\\u8DEF\\u5F84\\u4E0D\\u4E3A\\u7A7A\")),1),t(\"div\",Pv,[t(\"div\",Tv,[O(t(\"input\",{type:\"radio\",id:\"move\",name:\"moves\",\"onUpdate:modelValue\":C[2]||(C[2]=q=>v.value=q),value:\"\"},null,512),[[Bt,v.value]]),t(\"label\",Iv,i(e(a)(\"\\u66F4\\u6362\\u76EE\\u5F55\\uFF08\\u4E0D\\u8986\\u76D6\\u76EE\\u6807\\u8DEF\\u5F84\\uFF0C\\u4EC5\\u5C06Docker\\u76EE\\u5F55\\u4FEE\\u6539\\u4E3A\\u76EE\\u6807\\u8DEF\\u5F84\\uFF09\")),1)]),t(\"div\",Mv,[O(t(\"input\",{type:\"radio\",id:\"cover\",name:\"moves\",\"onUpdate:modelValue\":C[3]||(C[3]=q=>v.value=q),value:\"true\"},null,512),[[Bt,v.value]]),t(\"label\",Lv,i(e(a)(\"\\u8986\\u76D6\\u8FC1\\u79FB\\uFF08\\u8986\\u76D6\\u76EE\\u6807\\u8DEF\\u5F84\\uFF0C\\u7EE7\\u7EED\\u8FC1\\u79FB\\u4F1A\\u6E05\\u7A7A\\u8BE5\\u76EE\\u6807\\u8DEF\\u5F84\\u4E0B\\u7684\\u6587\\u4EF6\\uFF09\")),1)])]),t(\"div\",Ov,[m.value?(r(),s(\"button\",{key:0,class:\"cbi-button cbi-button-apply\",onClick:_},i(e(a)(\"\\u786E\\u5B9A\")),1)):D(\"\",!0),t(\"button\",{class:\"cbi-button cbi-button-apply\",onClick:h},i(e(a)(\"\\u8FD4\\u56DE\")),1),m.value?D(\"\",!0):(r(),s(\"button\",{key:1,class:\"cbi-button cbi-button-remove app-btn app-back\",type:\"button\",onClick:w},i(e(a)(\"\\u53D6\\u6D88\")),1))])])):D(\"\",!0)]}),_:1},8,[\"Close\"]))}});var Vv=N(Nv,[[\"__scopeId\",\"data-v-a5cf4814\"]]);const Gv=()=>{const o=document.createElement(\"div\");document.body.appendChild(o);const n=xt(Vv,{Close:()=>{a()}});n.mount(o);const a=()=>{n.unmount(),o.remove()};return{Close:a}},jv={href:\"/cgi-bin/luci/admin/docker/overview\"},Uv={key:0,class:\"content\"},qv={key:1,class:\"content\",style:{display:\"flex\",\"justify-content\":\"center\"}},Rv=I({setup(o){const{$gettext:n}=J(),a=E(!1),l=E(),u=E(!1),d=()=>{Gv()};return setTimeout(()=>{G.Guide.DockerStatus.GET().then(k=>{var g;if((g=k==null?void 0:k.data)!=null&&g.result){const p=k.data.result;l.value=p}}).finally(()=>{a.value=!0})},1100),(k,g)=>{var m;const p=_t(\"icon-loading\");return r(),Z(Wt,{title:\"Docker\",showSettings:!0,onFooterClick:d,style:{width:\"100%\",height:\"100%\",display:\"block\"},\"is-settings-menu-open\":u.value,\"onUpdate:isSettingsMenuOpen\":g[1]||(g[1]=v=>u.value=v)},Fo({icon:V(()=>[Y(Sa,{color:\"#155dfc\",class:\"icon\"})]),settings:V(()=>{var v;return[t(\"div\",{class:\"btn_settings\",onClick:d},[Y(Sa,{color:\"#0a0a0a\",class:\"icon1 dockerIcon\",style:{\"margin-right\":\"6px\"}}),t(\"span\",null,i(e(n)(\"Docker\\u8FC1\\u79FB\")),1),((v=l.value)==null?void 0:v.status)===\"running\"?(r(),s(\"div\",{key:0,class:\"rotation\",onClick:g[0]||(g[0]=ft(b=>u.value=!u.value,[\"stop\"]))},[Y(Ee,{class:\"moreIcon\"})])):D(\"\",!0)])]}),default:V(()=>[a.value?(r(),s(\"div\",Uv,[Y(Qg,{docker:l.value},null,8,[\"docker\"])])):(r(),s(\"div\",qv,[Y(p,{size:40,color:\"currentColor\"})]))]),_:2},[((m=l.value)==null?void 0:m.status)===\"running\"?{name:\"settings-menu\",fn:V(()=>[t(\"div\",null,[t(\"a\",jv,i(e(n)(\"Docker\\u9AD8\\u7EA7\\u914D\\u7F6E\")),1)])])}:void 0]),1032,[\"is-settings-menu-open\"])}}});var Wv=N(Rv,[[\"__scopeId\",\"data-v-78ae3db3\"]]);const Hv={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},Jv=[\"fill\"],Zv=[\"fill\"],io=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",Hv,[t(\"path\",{d:\"M577.78 355.55H449.62c-52.93 0-96 43.07-96 96V579.7c0 52.93 43.07 96 96 96h128.15c52.93 0 96-43.07 96-96V451.55c0.01-52.93-43.06-96-95.99-96z m32 224.15c0 17.64-14.36 32-32 32H449.62c-17.65 0-32-14.36-32-32V451.55c0-17.65 14.35-32 32-32h128.15c17.64 0 32 14.35 32 32V579.7z\",fill:o.color,\"p-id\":\"5378\"},null,8,Jv),t(\"path\",{d:\"M927.33 547.13c17.67 0 32-14.33 32-32s-14.33-32-32-32h-62.44V355.2h62.44c17.67 0 32-14.33 32-32s-14.33-32-32-32h-64.37c-10.34-64.43-61.3-115.45-125.69-125.87v-64.19c0-17.67-14.33-32-32-32s-32 14.33-32 32v62.22H545.34v-62.22c0-17.67-14.33-32-32-32s-32 14.33-32 32v62.22H353.2v-62.22c0-17.67-14.33-32-32-32s-32 14.33-32 32v64.16c-64.46 10.37-115.49 61.42-125.83 125.9H99.14c-17.67 0-32 14.33-32 32s14.33 32 32 32h62.3v127.93h-62.3c-17.67 0-32 14.33-32 32s14.33 32 32 32h62.3v128.14h-62.3c-17.67 0-32 14.33-32 32s14.33 32 32 32h64.28c10.45 64.34 61.42 115.25 125.79 125.61v64.46c0 17.67 14.33 32 32 32s32-14.33 32-32v-62.51h128.14v62.51c0 17.67 14.33 32 32 32s32-14.33 32-32v-62.51h127.93v62.51c0 17.67 14.33 32 32 32s32-14.33 32-32v-64.48c64.3-10.41 115.2-61.29 125.64-125.58h64.42c17.67 0 32-14.33 32-32s-14.33-32-32-32H864.9V547.13h62.43zM800.89 714.82c0 48.52-39.48 88-88 88H313.44c-48.52 0-88-39.48-88-88V315.36c0-48.52 39.48-88 88-88H712.9c48.52 0 88 39.48 88 88v399.46z\",fill:o.color,\"p-id\":\"5379\"},null,8,Zv)]))}}),Kv={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},Qv=[\"fill\"],Xv=I({props:{color:{type:String,default:\"#ef4444\"}},setup(o){return(n,a)=>(r(),s(\"svg\",Kv,[t(\"path\",{d:\"M520 75c72.899 0 132.133 58.543 133.31 131.209l0.018 2.206v399.237C700.759 646.978 729 705.514 729 768.714c0 84.846-50.493 157.892-123.051 190.69C579.509 971.959 549.966 979 518.85 979c-57.133 0-108.962-23.737-146.008-61.784C334.65 879.324 311 826.783 311 768.714c0-63.27 28.313-121.806 75.67-161.065l0.002-399.234C386.672 134.732 446.365 75 520 75z m0 59.807c-40.22 0-72.9 32.3-73.55 72.39l-0.01 1.218v403.457c4.008 12.048-0.02 25.747-10.721 33.573l-0.619 0.441c-40.008 27.753-64.332 73.214-64.332 122.828 0 82.472 66.813 149.33 149.232 149.33s149.232-66.858 149.232-149.33c0-47.591-22.367-91.397-59.645-119.44l-1.134-0.846a29.773 29.773 0 0 1-10.972-15.751 29.763 29.763 0 0 1-3.913-14.111l-0.008-0.706V208.415c0-40.653-32.934-73.608-73.56-73.608z m-2.299 236.926c4.41 0 8.66 0.69 12.647 1.968 16.826 4.965 29.19 20.52 29.19 38.81l0.002 240.184c47.972 17.182 82.294 63.07 82.294 116.982 0 6.94-0.568 13.747-1.662 20.376-6.746 60.536-58.728 108.02-121.321 108.02-47.223 0-88.407-27.027-108.683-66.296-10.557-18.27-16.6-39.479-16.6-62.1 0-54.083 34.542-100.093 82.754-117.145l0.002-239.422c0-22.852 18.525-41.377 41.377-41.377z\",fill:o.color,\"p-id\":\"4599\"},null,8,Qv)]))}}),tb={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},eb=[\"fill\"],ro=I({props:{color:{type:String,default:\"#222222\"}},setup(o){return(n,a)=>(r(),s(\"svg\",tb,[t(\"path\",{d:\"M760.1 64l-150 262.7-41 71.8c-6.1 10.7 1.6 23.9 13.9 23.9h104.7c13.9 0 21.2 16.6 11.8 26.9L410.8 761.9l59.5-178.5 21.1-63.2c3.5-10.4-4.3-21.1-15.2-21.1H277.8c-11.6 0-19.4-12-14.6-22.6l179-393.8c5.2-11.4 16.6-18.8 29.1-18.8h288.8M450.8 0c-25.1 0-47.9 14.7-58.3 37.5L194.7 472.7c-19.3 42.4 11.7 90.5 58.3 90.5h145.5c5.5 0 9.3 5.3 7.6 10.5L256 1024l515.3-558.2c37.8-41 8.8-107.4-47-107.4h-44.8c-6.1 0-10-6.6-6.9-12L870.4 0H450.8z\",\"p-id\":\"4712\",fill:o.color},null,8,eb)]))}}),ab={key:0,class:\"center-content\"},ob=I({props:{value:null,color:null,icon:null,label:null,width:null,height:null},setup(o){const n=o;Xe([Eo,ta,ea]);const a=E(null);let l=null;function u(k,g){return{tooltip:{show:!1},series:[{type:\"pie\",radius:[\"75%\",\"90%\"],avoidLabelOverlap:!1,label:{show:!1},labelLine:{show:!1},z:1,zlevel:0,data:[{value:k,itemStyle:{color:g||\"#409EFF\"}},{value:Math.max(0,100-k),itemStyle:{color:\"#f0f0f0\"}}]}]}}const d=()=>{!a.value||(l=l!=null?l:aa(a.value),l.setOption(u(n.value,n.color)))};Pt(()=>L(this,null,function*(){yield na(),d(),window.addEventListener(\"resize\",c)}));function c(){l==null||l.resize()}return $t(()=>[n.value,n.color],()=>{l?l.setOption({series:[{z:1,zlevel:0,data:[{value:n.value,itemStyle:{color:n.color||\"#409EFF\"}},{value:Math.max(0,100-n.value),itemStyle:{color:\"#f0f0f0\"}}]}]}):d()},{immediate:!0}),ke(()=>{window.removeEventListener(\"resize\",c),l==null||l.dispose(),l=null}),(k,g)=>(r(),s(\"div\",{class:\"pie-chart-wrapper\",style:ht({width:o.width||\"120px\",height:o.height||\"120px\"})},[t(\"div\",{ref_key:\"chartDom\",ref:a,class:\"chart-dom\"},null,512),o.icon||o.label?(r(),s(\"div\",ab,[o.icon===\"chip\"?(r(),Z(io,{key:0,color:o.color,class:\"center-icon\"},null,8,[\"color\"])):o.icon===\"temperature\"?(r(),Z(Xv,{key:1,color:o.color,class:\"center-icon\"},null,8,[\"color\"])):o.icon===\"lightning\"?(r(),Z(ro,{key:2,color:o.color,class:\"center-icon\"},null,8,[\"color\"])):D(\"\",!0),o.label?(r(),s(\"div\",{key:3,class:\"center-label\",style:ht({color:o.color})},i(o.label),5)):D(\"\",!0)])):D(\"\",!0)],4))}});var Qe=N(ob,[[\"__scopeId\",\"data-v-1b4ddc16\"]]);const nb={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},ib=[\"fill\"],za=I({props:{color:{type:String,default:\"#0a0a0a\"}},setup(o){return(n,a)=>(r(),s(\"svg\",nb,[t(\"path\",{d:\"M868.95177918 215.34678468H274.11312994c-10.26749627 0-19.00277466 3.6151618-26.30943653 10.88910739-7.22487113 7.23032433-10.89456058 15.97650768-10.89456059 26.20583515v370.75858453c0 10.24023245 3.66968946 18.95370022 10.89456059 26.22764579 7.30666259 7.22487113 16.04194099 10.86184429 26.30943653 10.86184429h594.83864924c10.28385442 0 19.04094415-3.63697315 26.28217344-10.86184429 7.30120941-7.27394558 10.9218244-15.98741334 10.92182439-26.22764579V252.44172722c0-10.2293275-3.62061501-18.97551083-10.92727686-26.20583516-7.23577681-7.27394558-15.99286582-10.8891081-26.27672097-10.88910738M274.09131931 141.21142578h594.83864924c30.77522572 0 57.07375657 10.86729676 78.86287773 32.59643853 21.78912116 21.74004671 32.66187112 47.91861806 32.66187114 78.62841045v370.76403699c0 30.68798176-10.87274996 56.91562756-32.66187114 78.63386293-21.78912116 21.72914105-48.08765274 32.59643853-78.86287773 32.59643851H608.68737796v74.15716953h111.5465602c10.26204379 0 19.03003849 3.6151618 26.28217344 10.8891081 7.29030445 7.22487113 10.91091874 15.97650768 10.91091872 26.20583518 0 10.24023245-3.62061501 18.98641651-10.91637192 26.20038195-7.25213496 7.28485125-16.01467717 10.90001305-26.27672024 10.90001379H422.80370787c-10.27840195 0-19.0191328-3.6151618-26.30943728-10.90001379-7.25213496-7.21396618-10.89456058-15.96014952-10.89456056-26.20038195 0-10.23477998 3.6478781-18.97551083 10.89456056-26.20583518 7.29030445-7.27394558 16.03103531-10.8891081 26.30943728-10.8891081h111.53565452v-74.15716953H274.09131931c-30.79703633 0-57.09011544-10.86729676-78.86287845-32.59643851C173.43931968 680.11593931 162.54475911 653.88829351 162.54475911 623.20031175V252.44172722C162.54475911 221.72648236 173.43931968 195.54791102 195.22844086 173.80786431 217.00665706 152.07872254 243.29428298 141.21142578 274.09131931 141.21142578\",\"p-id\":\"6454\",fill:o.color},null,8,ib)]))}}),rb={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},sb=[\"fill\"],db=[\"fill\"],lb=I({props:{color:{type:String,default:\"#333333\"}},setup(o){return(n,a)=>(r(),s(\"svg\",rb,[t(\"path\",{d:\"M512 458.67c-8.66 0-15.69 7.02-15.69 15.69v125.49c0 8.66 7.02 15.69 15.69 15.69s15.69-7.02 15.69-15.69v-125.5c0-8.66-7.03-15.68-15.69-15.68z m-31.37-26.98h62.75c8.66 0 15.69-7.02 15.69-15.69 0-8.66-7.02-15.69-15.69-15.69h-15.69V296.78c0-8.66-7.02-15.69-15.69-15.69s-15.69 7.02-15.69 15.69v103.53h-15.69c-8.66 0-15.69 7.02-15.69 15.69 0.01 8.66 7.03 15.69 15.7 15.69z m219.61 53.33c-8.66 0-15.69 7.02-15.69 15.69V601.1c0 8.66 7.02 15.69 15.69 15.69s15.69-7.02 15.69-15.69v-99.76c0.35-8.66-6.39-15.95-15.05-16.3-0.22-0.02-0.43-0.02-0.64-0.02z m-31.38-27.61h62.75c8.66 0 15.69-7.02 15.69-15.69 0-8.66-7.02-15.69-15.69-15.69h-14.43V296.78c0-8.66-7.02-15.69-15.69-15.69s-15.69 7.02-15.69 15.69v125.49h-16.94c-8.66 0-15.69 7.02-15.69 15.69 0 8.66 7.02 15.69 15.69 15.69v3.76z m-376.47 32.63h62.75c8.66 0 15.69-7.02 15.69-15.69s-7.02-15.69-15.69-15.69h-15.69V296.78c0-8.66-7.02-15.69-15.69-15.69-8.66 0-15.69 7.02-15.69 15.69v161.88h-15.69c-8.66 0-15.69 7.02-15.69 15.69s7.04 15.69 15.7 15.69z m31.37 32c-8.66 0-15.69 7.02-15.69 15.69v62.75c0 8.66 7.02 15.69 15.69 15.69 8.66 0 15.69-7.02 15.69-15.69v-62.75c0-8.67-7.02-15.69-15.69-15.69z\",fill:o.color,\"p-id\":\"15217\"},null,8,sb),t(\"path\",{d:\"M870 116.39H154c-49.71 0-90 40.29-90 90v485.1c0 49.71 40.29 90 90 90h716c49.71 0 90-40.29 90-90v-485.1c0-49.7-40.29-90-90-90z m50 565.1c0 33.14-26.86 60-60 60H164c-33.14 0-60-26.86-60-60v-465.1c0-33.14 26.86-60 60-60h696c33.14 0 60 26.86 60 60v465.1zM680.24 907.61H343.76c-11.05 0-20-8.95-20-20s8.95-20 20-20h336.48c11.05 0 20 8.95 20 20 0 11.04-8.96 20-20 20z\",fill:o.color,\"p-id\":\"15218\"},null,8,db)]))}}),ub={href:\"/cgi-bin/luci/admin/system/flash\"},cb={href:\"/cgi-bin/luci/admin/store/pages/maintance\"},pb={class:\"content\"},fb={class:\"chart_box\"},mb={class:\"chart\"},gb={class:\"chart\"},vb={class:\"chart\"},bb={class:\"info\"},hb={class:\"item1 bgcolor1\"},_b={style:{\"font-weight\":\"bold\",\"margin-top\":\"2px\"}},xb={class:\"item1 bgcolor2\"},wb={style:{\"font-weight\":\"bold\",\"margin-top\":\"2px\"}},kb={class:\"item\"},yb={class:\"item\"},Fb=I({setup(o){const{$gettext:n}=J(),a=Le(),l=Q(()=>a.version),u=Q(()=>a.systemStatus),d=E(!1),c=Q(()=>{var w;return((w=u.value)==null?void 0:w.cpuUsage)||0}),k=Q(()=>{var w;return((w=u.value)==null?void 0:w.cpuTemperature)||0}),g=Q(()=>{var h;const w=((h=u.value)==null?void 0:h.memAvailablePercentage)||100;return 100-w}),p=Q(()=>{const w=c.value;return w<76?\"#3b82f6\":w>=76&&w<96?\"#f59e0b\":\"#ef4444\"}),m=Q(()=>k.value<=115?\"#22c55e\":\"#f97316\"),v=Q(()=>{const w=g.value;return w<76?\"#8b5cf6\":w>=76&&w<96?\"#fb923c\":\"#b91c1c\"}),b=()=>{location.href=\"/cgi-bin/luci/admin/status/overview\"},y=Mt.stampForm;Pt(()=>{});const f=()=>{d.value=!d.value},F=()=>{f(),zt.installAndGo(\"app-meta-netdata\",\"NetData\",\"/cgi-bin/luci/admin/status/netdata\")};return(w,h)=>(r(),Z(Wt,{title:e(n)(\"\\u7CFB\\u7EDF\\u4FE1\\u606F\"),showFooter:!1,style:{width:\"100%\",height:\"100%\",display:\"block\"}},{icon:V(()=>[Y(za,{class:\"icon computerIcon\"})]),settings:V(()=>[t(\"div\",{class:\"btn_settings\",onClick:b},[Y(za,{color:\"#0a0a0a\",class:\"icon2 computerIcon\",style:{\"margin-right\":\"6px\"}}),t(\"span\",null,i(e(n)(\"\\u4FE1\\u606F\\u6982\\u89C8\")),1)])]),\"settings-menu\":V(()=>[t(\"div\",null,[t(\"a\",{onClick:F},i(e(n)(\"\\u7CFB\\u7EDF\\u76D1\\u63A7\")),1)]),t(\"div\",null,[t(\"a\",ub,i(e(n)(\"\\u5907\\u4EFD\\u5347\\u7EA7\")),1)]),t(\"div\",null,[t(\"a\",cb,i(e(n)(\"\\u63D2\\u4EF6\\u5907\\u4EFD\")),1)])]),default:V(()=>{var _,x,C,S,A;return[t(\"div\",pb,[t(\"div\",fb,[t(\"div\",mb,[Y(Qe,{value:e(c),color:e(p),icon:\"chip\",label:`${e(c)}%`,width:\"150px\",height:\"150px\"},null,8,[\"value\",\"color\",\"label\"]),t(\"div\",null,i(e(n)(\"CPU\\u4F7F\\u7528\\u7387\")),1)]),t(\"div\",gb,[Y(Qe,{value:e(k)/1.5,color:e(m),icon:\"temperature\",label:`${e(k)}\\u2103`,width:\"150px\",height:\"150px\"},null,8,[\"value\",\"color\",\"label\"]),t(\"div\",null,i(e(n)(\"CPU\\u6E29\\u5EA6\")),1)]),t(\"div\",vb,[Y(Qe,{value:e(g),color:e(v),icon:\"lightning\",label:`${e(g)}%`,width:\"150px\",height:\"150px\"},null,8,[\"value\",\"color\",\"label\"]),t(\"div\",null,i(e(n)(\"\\u5185\\u5B58\\u4F7F\\u7528\\u7387\")),1)])]),t(\"div\",bb,[t(\"div\",hb,[t(\"div\",null,[Y(io,{color:\"#155dfc\",class:\"icon1\",style:{\"margin-bottom\":\"0\"}}),t(\"span\",null,i(e(n)(\"\\u8BBE\\u5907\\u578B\\u53F7\")),1)]),t(\"span\",_b,i((_=e(l))==null?void 0:_.model),1)]),t(\"div\",xb,[t(\"div\",null,[Y(lb,{color:\"#00a63e\",class:\"icon1\",style:{\"margin-bottom\":\"0\"}}),t(\"span\",null,i(e(n)(\"\\u56FA\\u4EF6\\u7248\\u672C\")),1)]),t(\"span\",wb,i((x=e(l))==null?void 0:x.firmwareVersion)+\"\\uFF08\"+i(e(n)(\"\\u5185\\u6838\"))+\"\\uFF1A\"+i((C=e(l))==null?void 0:C.kernelVersion)+\"\\uFF09\",1)]),t(\"div\",kb,[t(\"div\",null,i(e(n)(\"\\u7CFB\\u7EDF\\u65F6\\u95F4\"))+\"\\uFF1A\",1),t(\"span\",null,i((S=e(u))==null?void 0:S.localtime),1)]),t(\"div\",yb,[t(\"div\",null,i(e(n)(\"\\u5DF2\\u542F\\u52A8\"))+\"\\uFF1A\",1),t(\"span\",null,i(e(y)((A=e(u))==null?void 0:A.uptime)),1)])])])]}),_:1},8,[\"title\"]))}});var Eb=N(Fb,[[\"__scopeId\",\"data-v-e005287c\"]]);const $b=[\"onClick\"],Cb={class:\"modal-header\"},Db={class:\"modal-title\"},Bb={class:\"modal-content\"},Yb={key:0,class:\"modal-footer\"},Xt=I({props:{modelValue:{type:Boolean},title:{default:\"\\u63D0\\u793A\"},showClose:{type:Boolean,default:!0},closeOnClickOverlay:{type:Boolean,default:!1},footerShow:{type:Boolean,default:!0},width:{default:\"500px\"}},emits:[\"update:modelValue\",\"confirm\",\"cancel\",\"close\"],setup(o,{expose:n,emit:a}){const l=o;$o(v=>({\"3fcd09c7\":e(d)}));const{$gettext:u}=J(),d=Q(()=>typeof l.width==\"number\"?`${l.width}px`:l.width),c=E(l.modelValue);$t(()=>l.modelValue,v=>{c.value=v}),$t(c,v=>{a(\"update:modelValue\",v),v||a(\"close\")}),Q(()=>typeof l.width==\"number\"?`${l.width}px`:l.width);const k=()=>{c.value=!1},g=()=>{l.closeOnClickOverlay&&m()},p=()=>{a(\"confirm\")},m=()=>{a(\"cancel\"),k()};return n({show:()=>c.value=!0,hide:()=>c.value=!1}),(v,b)=>(r(),Z(St,{name:\"fade\"},{default:V(()=>[c.value?(r(),s(\"div\",{key:0,class:\"modal-overlay\",onClick:ft(g,[\"self\"])},[Y(St,{name:\"slide\"},{default:V(()=>[t(\"div\",{class:\"modal-container\",style:ht({maxWidth:e(d)})},[t(\"div\",Cb,[t(\"h3\",Db,i(e(u)(o.title)),1),o.showClose?(r(),s(\"button\",{key:0,class:\"modal-close\",onClick:m,\"aria-label\":\"Close\"},\" \\xD7 \")):D(\"\",!0)]),t(\"div\",Bb,[Yt(v.$slots,\"default\")]),o.footerShow?(r(),s(\"div\",Yb,[Yt(v.$slots,\"footer\",{},()=>[t(\"button\",{class:\"modal-button cancel\",onClick:m},i(e(u)(\"\\u53D6\\u6D88\")),1),t(\"button\",{class:\"modal-button confirm\",onClick:p},i(e(u)(\"\\u4FDD\\u5B58\")),1)])])):D(\"\",!0)],4)]),_:3})],8,$b)):D(\"\",!0)]),_:3}))}}),Ab=o=>(ut(\"data-v-ca434918\"),o=o(),ct(),o),Sb=Ab(()=>t(\"span\",{class:\"switch__button\"},null,-1)),zb=[Sb],Pb=[\"checked\",\"disabled\"],Tb=I({props:{modelValue:{type:Boolean,default:!1},disabled:{type:Boolean,default:!1},activeColor:{default:\"#409EFF\"},inactiveColor:{default:\"#DCDFE6\"}},emits:[\"update:modelValue\",\"change\",\"beforeChange\"],setup(o,{emit:n}){const a=o,l=()=>{if(n(\"beforeChange\",!a.modelValue),a.disabled)return;const u=!a.modelValue;n(\"update:modelValue\",u),n(\"change\",u)};return Q(()=>a.modelValue),(u,d)=>(r(),s(\"div\",{class:lt([\"switch\",{\"is-checked\":o.modelValue,\"is-disabled\":o.disabled}]),onClick:l},[t(\"span\",{class:\"switch__core\",style:ht({backgroundColor:o.modelValue?o.activeColor:o.inactiveColor,borderColor:o.modelValue?o.activeColor:o.inactiveColor})},zb,4),t(\"input\",{type:\"checkbox\",class:\"switch__input\",checked:o.modelValue,disabled:o.disabled},null,8,Pb)],2))}});var Ot=N(Tb,[[\"__scopeId\",\"data-v-ca434918\"]]);const Ib={class:\"module-settings\"},Mb={class:\"module-settings__header\"},Lb={class:\"module-settings__summary\"},Ob={class:\"module-settings__badge\"},Nb={class:\"module-settings__texts\"},Vb={class:\"module-settings__title\"},Gb={class:\"module-settings__sub\"},jb={class:\"module-settings__list\"},Ub={class:\"module-settings__info\"},qb={class:\"module-settings__name\"},Rb={class:\"module-settings__desc\"},Wb={class:\"module-settings__footer\"},Hb=I({props:{visible:{type:Boolean},modules:null,states:null},emits:[\"update:visible\",\"update:states\",\"cancel\",\"save\"],setup(o,{emit:n}){const a=o,{$gettext:l}=J(),u=Q({get:()=>a.visible,set:b=>n(\"update:visible\",b)}),d=()=>{const b={};return a.modules.forEach(y=>{var f,F;b[y.key]=(F=(f=a.states)==null?void 0:f[y.key])!=null?F:!0}),b},c=gt(d());$t(()=>a.visible,b=>{b&&Object.assign(c,d())}),$t(()=>a.states,()=>{Object.assign(c,d())},{deep:!0}),$t(()=>a.modules,()=>{Object.assign(c,d())},{deep:!0});const k=Q(()=>a.modules.reduce((b,y)=>c[y.key]?b+1:b,0)),g=(b,y)=>{const f=a.modules.find(F=>F.key===b);if(!!f&&!f.disabled){if(y===!1&&a.modules.reduce((w,h)=>c[h.key]?w+1:w,0)<=1)return $.Warning(l(\"\\u8BF7\\u81F3\\u5C11\\u4FDD\\u7559\\u4E00\\u9879\\uFF01\"));c[b]=y}},p=()=>{n(\"cancel\"),u.value=!1},m=()=>{const b=st({},a.states||{});a.modules.forEach(y=>{b[y.key]=!!c[y.key]}),n(\"save\",b)},v=()=>{a.modules.forEach(b=>{b.disabled||(c[b.key]=!0)})};return(b,y)=>(r(),Z(Xt,{modelValue:e(u),\"onUpdate:modelValue\":y[0]||(y[0]=f=>Ia(u)?u.value=f:null),title:e(l)(\"\\u6A21\\u5757\\u663E\\u793A\\u8BBE\\u7F6E\"),width:\"640px\",\"show-close\":!0,onCancel:p,onConfirm:m},{footer:V(()=>[t(\"div\",Wb,[t(\"button\",{class:\"module-settings__btn module-settings__btn--secondary\",type:\"button\",onClick:p},i(e(l)(\"\\u53D6\\u6D88\")),1),t(\"button\",{class:\"module-settings__btn module-settings__btn--primary\",type:\"button\",onClick:m},i(e(l)(\"\\u4FDD\\u5B58\\u8BBE\\u7F6E\")),1)])]),default:V(()=>[t(\"span\",null,i(e(l)(\"\\u9009\\u62E9\\u8981\\u5728\\u9996\\u9875\\u663E\\u793A\\u7684\\u529F\\u80FD\\u6A21\\u5757\\uFF0C\\u9690\\u85CF\\u4E0D\\u5E38\\u7528\\u7684\\u6A21\\u5757\\u53EF\\u4EE5\\u8BA9\\u754C\\u9762\\u66F4\\u7B80\\u6D01\")),1),t(\"div\",Ib,[t(\"div\",Mb,[t(\"div\",Lb,[t(\"div\",Ob,i(e(k)),1),t(\"div\",Nb,[t(\"span\",Vb,i(e(l)(\"\\u5DF2\\u663E\\u793A\\u6A21\\u5757\")),1),t(\"span\",Gb,i(e(l)(\"\\u5171\"))+i(o.modules.length)+i(e(l)(\"\\u4E2A\\u6A21\\u5757\")),1)])]),t(\"button\",{class:\"module-settings__toggle-all\",type:\"button\",onClick:v},i(e(l)(\"\\u5168\\u90E8\\u663E\\u793A\")),1)]),t(\"div\",jb,[(r(!0),s(U,null,tt(o.modules,f=>(r(),s(\"div\",{key:f.key,class:lt([\"module-settings__item\",{\"module-settings__item--disabled\":f.disabled}])},[t(\"div\",Ub,[t(\"div\",qb,[t(\"span\",{class:lt([\"module-settings__dot\",{\"is-active\":e(c)[f.key]}])},null,2),t(\"span\",null,i(f.title),1)]),t(\"p\",Rb,i(f.description),1)]),Y(Ot,{\"model-value\":e(c)[f.key],disabled:f.disabled,\"active-color\":\"#553AFE\",\"inactive-color\":\"#E5E6EB\",onChange:F=>g(f.key,F)},null,8,[\"model-value\",\"disabled\",\"onChange\"])],2))),128))])])]),_:1},8,[\"modelValue\",\"title\"]))}});var Jb=N(Hb,[[\"__scopeId\",\"data-v-79624e8f\"]]);const Zb={class:\"page-container\"},Kb={style:{height:\"48px\",\"text-align\":\"right\",display:\"flex\",\"justify-content\":\"flex-end\",\"align-items\":\"start\"}},Qb={style:{display:\"flex\",\"align-items\":\"center\"}},Xb={onclick:\"void(0)\",href:\"https://www.istoreos.com/\",target:\"_blank\",style:{\"text-decoration\":\"none\",color:\"white\",\"line-height\":\"1.5em\"}},th=[\"title\"],eh={key:0,class:\"card-container\"},ah={key:1,style:{\"margin-top\":\"10px\"}},oh={key:0,class:\"network-stack\"},nh={class:\"stack-item\"},ih={class:\"stack-item\",style:{\"margin-top\":\"10px\"}},rh={key:1,class:\"network-container\"},sh={key:2,class:\"network-container align-c\"},dh={class:\"left-box\"},lh={key:3,class:\"other-container\"},uh={class:\"grid-container\"},ch={key:4,class:\"system\"},ph=I({setup(o){var T,j;const{$gettext:n}=J(),a=Pe();en();const l=Le(),u=E(!0);(j=(T=window.quickstart_configs)==null?void 0:T.update)!=null&&j.disable&&(u.value=!1),u.value&&setTimeout(()=>{l.requestCheckUpdate()},1100);const d=Fe(),c=Q(()=>d.deviceList),k=Q(()=>{var R,it;return[{icon:\"navigation\",title:n(\"\\u7F51\\u7EDC\\u5411\\u5BFC\"),subtitle:n(\"\\u7F51\\u7EDC\\u914D\\u7F6E\\u5F15\\u5BFC\"),tag:n(\"\\u667A\\u80FD\\u914D\\u7F6E\"),status:\"\",extra:\"\",color:\"purple\",link:\"/network\"},{icon:\"topology\",title:n(\"\\u5C40\\u57DF\\u7F51\\u8BBE\\u5907\\u7BA1\\u7406\"),subtitle:n(\"\\u7BA1\\u7406\\u7F51\\u7EDC\\u4E2D\\u7684\\u6240\\u6709\\u8BBE\\u5907\"),badge:n(\"\\u63A8\\u8350\"),status:\"\",num:((it=(R=c.value)==null?void 0:R.devices)==null?void 0:it.length)||0,color:\"blue\",link:\"/devicemanagement\"},{icon:\"speed\",title:n(\"\\u7F51\\u7EDC\\u6D4B\\u901F\"),subtitle:n(\"\\u68C0\\u6D4B\\u7F51\\u7EDC\\u901F\\u5EA6\"),status:\"\",color:\"skyblue\",link:\"/networkSpeedTest\"},{icon:\"baby\",title:n(\"\\u5BB6\\u957F\\u63A7\\u5236\"),subtitle:n(\"\\u513F\\u7AE5\\u4E0A\\u7F51\\u4FDD\\u62A4\"),badge:n(\"\\u4FDD\\u62A4\"),status:\"\",extra:\"\",color:\"pink\",isActive:!0,alink:\"/cgi-bin/luci/admin/services/appfilter\"},{icon:\"appStore\",title:n(\"\\u5E94\\u7528\\u5546\\u5E97\"),subtitle:n(\"\\u767E\\u6B3E\\u5E94\\u7528\\uFF0C\\u81EA\\u7531\\u9009\\u62E9\"),status:\"\",color:\"orange\",alink:\"/cgi-bin/luci/admin/store/pages/store\"}]}),g=R=>{if(!!R.title){if(R.icon==\"speed\")return m();if(R.icon==\"baby\")return p();R.link?a.push(R.link):R.alink&&(window.location.href=R.alink)}},p=()=>L(this,null,function*(){(yield zt.checkAndInstallApp(\"luci-app-oaf\",\"\\u5E94\\u7528\\u8FC7\\u6EE4\"))&&(window.location.href=\"/cgi-bin/luci/admin/services/appfilter\")}),m=()=>L(this,null,function*(){const R=\"app-meta-fastnet\";(yield zt.checkAndInstallApp(R,n(\"FastNet\")))&&(window.location.href=\"/cgi-bin/luci/admin/services/fastnet\")}),v=E(!1);(()=>L(this,null,function*(){try{const R=yield G.App.Check.POST({name:\"luci-app-oaf\"});if(R!=null&&R.data){const{result:it,error:ot}=R.data;ot?v.value=!1:it&&it.status==\"installed\"?v.value=!0:v.value=!1}}catch(R){v.value=!1}}))();const y={quickActions:!0,networkFlow:!0,networkConnection:!0,networkInterface:!0,configModule:!0,diskInfo:!0,storage:!0,docker:!0,downloadService:!0,remoteDomain:!0,systemInfo:!0},f=E({quickActions:!1,networkFlow:!1,networkConnection:!1,networkInterface:!1,configModule:!1,diskInfo:!1,storage:!1,docker:!1,downloadService:!1,remoteDomain:!1,systemInfo:!1}),F=E(!1),w=Q(()=>{const R=[{key:\"quickActions\",title:n(\"\\u5FEB\\u6377\\u5165\\u53E3\"),description:n(\"\\u9876\\u90E8\\u5FEB\\u6377\\u6377\\u5F84\\u6309\\u94AE\\u7EC4\")},{key:\"networkFlow\",title:n(\"\\u7F51\\u7EDC\\u6D41\\u91CF\"),description:n(\"\\u5B9E\\u65F6\\u6D41\\u91CF\\u7EDF\\u8BA1\\u56FE\\u8868\")},{key:\"networkConnection\",title:n(\"\\u7F51\\u7EDC\\u8FDE\\u63A5\\u548CIP\\u5730\\u5740\"),description:n(\"\\u8054\\u7F51\\u65F6\\u95F4\\u548C\\u8BBE\\u5907\\u4FE1\\u606F\")},{key:\"networkInterface\",title:n(\"\\u7F51\\u7EDC\\u63A5\\u53E3\\u72B6\\u6001\"),description:n(\"\\u7F51\\u7EDC\\u63A5\\u53E3\\u8BE6\\u7EC6\\u4FE1\\u606F\")},{key:\"configModule\",title:n(\"\\u914D\\u7F6E\\u6A21\\u5757\"),description:n(\"\\u5185\\u7F51\\u914D\\u7F6E\\u3001DNS\\u914D\\u7F6E\\u7B49\\u5DE5\\u5177\")},{key:\"diskInfo\",title:n(\"\\u78C1\\u76D8\\u4FE1\\u606F\"),description:n(\"\\u78C1\\u76D8\\u4F7F\\u7528\\u60C5\\u51B5\\u4E0E\\u5BB9\\u91CF\\u6982\\u89C8\")},{key:\"storage\",title:n(\"\\u5B58\\u50A8\\u670D\\u52A1\"),description:n(\"\\u5171\\u4EAB\\u4E0E\\u5B58\\u50A8\\u670D\\u52A1\\u6982\\u89C8\")},{key:\"downloadService\",title:n(\"\\u4E0B\\u8F7D\\u670D\\u52A1\"),description:n(\"\\u4E0B\\u8F7D\\u4EFB\\u52A1\\u4E0E\\u670D\\u52A1\\u72B6\\u6001\")},{key:\"remoteDomain\",title:n(\"\\u8FDC\\u7A0B\\u57DF\\u540D\"),description:n(\"\\u8FDC\\u7A0B\\u8BBF\\u95EE\\u57DF\\u540D\\u7BA1\\u7406\")},{key:\"systemInfo\",title:n(\"\\u7CFB\\u7EDF\\u4FE1\\u606F\"),description:n(\"\\u8BBE\\u5907\\u7CFB\\u7EDF\\u4FE1\\u606F\\u6982\\u89C8\")}];return Qt(\"dockerd\")&&R.splice(7,0,{key:\"docker\",title:n(\"Docker\\u6A21\\u5757\"),description:n(\"\\u5BB9\\u5668\\u8FD0\\u884C\\u72B6\\u6001\\u4E0E\\u7BA1\\u7406\")}),R}),h=Q(()=>f.value.networkFlow||f.value.networkConnection||f.value.networkInterface),_=Q(()=>f.value.networkConnection||f.value.networkInterface),x=Q(()=>f.value.networkFlow&&!f.value.networkConnection&&f.value.networkInterface),C=Q(()=>f.value.networkFlow&&!f.value.networkConnection&&!f.value.networkInterface),S=Q(()=>f.value.networkConnection&&!f.value.networkInterface);typeof window!=\"undefined\"&&$t(()=>[f.value.networkConnection,f.value.networkInterface],()=>{requestAnimationFrame(()=>{window.dispatchEvent(new Event(\"resize\"))})});const A=Q(()=>{const R=[];return f.value.diskInfo&&R.push({key:\"diskInfo\",component:$g}),f.value.storage&&R.push({key:\"storage\",component:jf}),Qt(\"dockerd\")&&f.value.docker&&R.push({key:\"docker\",component:Wv}),f.value.downloadService&&R.push({key:\"downloadService\",component:n1}),f.value.remoteDomain&&R.push({key:\"remoteDomain\",component:s5}),R}),z=(R,it)=>{if(it<=0)return\"100%\";if(it<=2)return`calc((100% - ${(it-1)*24}px) / ${it})`;const ot=Math.min(2,it);if(R<ot)return`calc((100% - ${(ot-1)*24}px) / ${ot})`;const bt=it-ot;return bt<=0?\"100%\":`calc((100% - ${(bt-1)*24}px) / ${bt})`},B=E(null),H=R=>L(this,null,function*(){if(!(B.value&&Object.keys(R).some(Dt=>{var yt;return R[Dt]!==((yt=B.value)==null?void 0:yt[Dt])}))){F.value=!1;return}const ot=st(st({},f.value),R);(yield q(ot))&&(f.value=ot,F.value=!1)}),M=()=>L(this,null,function*(){var R,it;try{const ot=yield G.ModuleSettings.GET(),bt=(it=(R=ot==null?void 0:ot.data)==null?void 0:R.result)==null?void 0:it.diableDisplay;if(!bt||bt.length===0||bt.length===1&&bt[0]===\"\"){const Dt=st({},y);f.value=Dt,B.value=st({},Dt)}else{const Dt=st({},y);bt.forEach(yt=>{yt&&yt.trim()&&yt in Dt&&(Dt[yt]=!1)}),f.value=Dt,B.value=st({},Dt)}}catch(ot){console.warn(\"[ModuleSettings] fetch failed\",ot),f.value=st({},y),B.value=st({},y)}}),q=R=>L(this,null,function*(){try{const it=[];return Object.keys(R).forEach(ot=>{R[ot]||it.push(ot)}),yield G.ModuleSettings.POST({diableDisplay:it}),B.value=st({},R),$.Success(n(\"\\u4FDD\\u5B58\\u6210\\u529F\")),!0}catch(it){return console.error(\"[ModuleSettings] save failed\",it),$.Warning(n(\"\\u4FDD\\u5B58\\u5931\\u8D25\\uFF01\")),!1}});return $t(F,R=>{R&&(B.value=st({},f.value))}),M(),(R,it)=>(r(),s(\"div\",Zb,[t(\"div\",Kb,[t(\"div\",Qb,[t(\"a\",Xb,i(e(n)(\"iStoreOS\\u5B98\\u7F51\")),1),t(\"span\",{title:e(n)(\"\\u6A21\\u5757\\u8BBE\\u7F6E\"),class:\"model_btn\",onClick:it[0]||(it[0]=ot=>F.value=!0)},[Y(R8,{style:{width:\"16px\",height:\"16px\"}})],8,th)])]),f.value.quickActions?(r(),s(\"div\",eh,[(r(!0),s(U,null,tt(e(k),(ot,bt)=>(r(),s(U,{key:bt},[ot.icon!==\"baby\"||v.value?(r(),Z(E4,{key:0,card:ot,onClick:g},null,8,[\"card\"])):D(\"\",!0)],64))),128))])):D(\"\",!0),e(h)?(r(),s(\"div\",ah,[e(x)?(r(),s(\"div\",oh,[t(\"div\",nh,[Y(Fa,{style:{\"min-height\":\"600px\"}})]),t(\"div\",ih,[Y(Da)])])):(r(),s(\"div\",rh,[f.value.networkFlow?(r(),s(\"div\",{key:0,class:lt([\"left-box\",{\"full-row\":e(C)}])},[Y(Fa,{style:ht(e(C)?{minHeight:\"600px\"}:void 0)},null,8,[\"style\"])],2)):D(\"\",!0),e(_)?(r(),s(\"div\",{key:1,class:lt([\"right-box\",{\"single-card\":e(S)}]),style:{overflow:\"visible\"}},[f.value.networkConnection?(r(),Z($8,{key:0,class:lt({\"fill-card\":e(S)})},null,8,[\"class\"])):D(\"\",!0),f.value.networkInterface?(r(),Z(Da,{key:1,style:ht({marginTop:f.value.networkConnection?\"10px\":\"0px\"})},null,8,[\"style\"])):D(\"\",!0)],2)):D(\"\",!0)]))])):D(\"\",!0),f.value.configModule?(r(),s(\"div\",sh,[t(\"div\",dh,[Y(Ip)])])):D(\"\",!0),e(A).length?(r(),s(\"div\",lh,[t(\"div\",uh,[(r(!0),s(U,null,tt(e(A),(ot,bt)=>(r(),s(\"div\",{class:\"grid-item\",key:ot.key,style:ht({flexBasis:z(bt,e(A).length)})},[(r(),Z(oa(ot.component)))],4))),128))])])):D(\"\",!0),f.value.systemInfo?(r(),s(\"div\",ch,[Y(Eb)])):D(\"\",!0),Y(Jb,{visible:F.value,\"onUpdate:visible\":it[1]||(it[1]=ot=>F.value=ot),modules:e(w),states:f.value,onSave:H},null,8,[\"visible\",\"modules\",\"states\"])]))}});var fh=N(ph,[[\"__scopeId\",\"data-v-1f2aa331\"]]);const mh={};function gh(o,n){const a=_t(\"router-view\");return r(),Z(a)}var vh=N(mh,[[\"render\",gh]]);const bh={},hh={width:\"136px\",height:\"136px\",viewBox:\"0 0 136 136\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},_h=jt('<defs><rect id=\"path-1\" x=\"0\" y=\"0\" width=\"72\" height=\"72\" rx=\"10\"></rect><filter x=\"-68.1%\" y=\"-65.3%\" width=\"236.1%\" height=\"236.1%\" filterUnits=\"objectBoundingBox\" id=\"filter-2\"><feOffset dx=\"0\" dy=\"2\" in=\"SourceAlpha\" result=\"shadowOffsetOuter1\"></feOffset><feGaussianBlur stdDeviation=\"16\" in=\"shadowOffsetOuter1\" result=\"shadowBlurOuter1\"></feGaussianBlur><feColorMatrix values=\"0 0 0 0 0.00576685472   0 0 0 0 0.712891067   0 0 0 0 0.523400265  0 0 0 1 0\" type=\"matrix\" in=\"shadowBlurOuter1\"></feColorMatrix></filter></defs><g id=\"icon_router\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"><g id=\"Group\" transform=\"translate(32.000000, 30.000000)\"><g id=\"Rectangle\"><use fill=\"black\" fill-opacity=\"1\" filter=\"url(#filter-2)\" xlink:href=\"#path-1\"></use><use fill=\"#FFFFFF\" fill-rule=\"evenodd\" xlink:href=\"#path-1\"></use></g><g id=\"luyouqi\" transform=\"translate(9.000000, 12.000000)\" fill=\"#2FBE96\" fill-rule=\"nonzero\"><path d=\"M5,36.25 L6.24999997,36.25 L6.24999997,37.5 C6.24999997,38.8750001 7.37499997,40 8.74999999,40 L13.75,40 C15.125,40 16.25,38.875 16.25,37.5 L16.25,36.25 L38.75,36.25 L38.75,37.5 C38.75,38.8750001 39.875,40 41.25,40 L46.25,40 C47.625,40 48.75,38.875 48.75,37.5 L48.75,36.25 L50,36.25 C52.75,36.25 55,34 55,31.25 L0,31.25 C0,34 2.25,36.25 5,36.25 Z M50,20 L45,20 L45,1.875 C45,0.874999981 44.1250001,0 43.125,0 C42.125,0 41.25,0.874999981 41.25,1.875 L41.25,20 L13.75,20 L13.75,1.875 C13.75,0.874999981 12.875,0 11.875,0 C10.8749999,0 10,0.874999981 10,1.875 L10,20 L5,20 C2.25,20 0,22.25 0,25 L0,28.75 L55,28.75 L55,25 C55,22.25 52.75,20 50,20 Z M30.625,26.25 C29.625,26.25 28.75,25.375 28.75,24.375 C28.75,23.375 29.625,22.5 30.625,22.5 C31.625,22.5 32.5,23.375 32.5,24.375 C32.5,25.375 31.625,26.25 30.625,26.25 Z M36.875,26.25 C35.875,26.25 35,25.375 35,24.375 C35,23.375 35.875,22.5 36.875,22.5 C37.875,22.5 38.75,23.375 38.75,24.375 C38.75,25.375 37.875,26.25 36.875,26.25 Z M43.125,26.25 C42.125,26.25 41.25,25.375 41.25,24.375 C41.25,23.375 42.125,22.5 43.125,22.5 C44.1250001,22.5 45,23.375 45,24.375 C45,25.375 44.1250001,26.25 43.125,26.25 Z\" id=\"Shape\"></path></g></g></g>',2),xh=[_h];function wh(o,n){return r(),s(\"svg\",hh,xh)}var kh=N(bh,[[\"render\",wh]]);const yh={},Fh={width:\"136px\",height:\"136px\",viewBox:\"0 0 136 136\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},Eh=jt('<defs><rect id=\"path-1\" x=\"0\" y=\"0\" width=\"72\" height=\"72\" rx=\"10\"></rect><filter x=\"-68.1%\" y=\"-65.3%\" width=\"236.1%\" height=\"236.1%\" filterUnits=\"objectBoundingBox\" id=\"filter-2\"><feOffset dx=\"0\" dy=\"2\" in=\"SourceAlpha\" result=\"shadowOffsetOuter1\"></feOffset><feGaussianBlur stdDeviation=\"16\" in=\"shadowOffsetOuter1\" result=\"shadowBlurOuter1\"></feGaussianBlur><feColorMatrix values=\"0 0 0 0 0.788163337   0 0 0 0 0   0 0 0 0 0  0 0 0 0.5 0\" type=\"matrix\" in=\"shadowBlurOuter1\"></feColorMatrix></filter></defs><g id=\"icon_dial\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"><g id=\"Group\" transform=\"translate(32.000000, 30.000000)\"><g id=\"Rectangle\"><use fill=\"black\" fill-opacity=\"1\" filter=\"url(#filter-2)\" xlink:href=\"#path-1\"></use><use fill=\"#FFFFFF\" fill-rule=\"evenodd\" xlink:href=\"#path-1\"></use></g><g id=\"bohao\" transform=\"translate(14.000000, 13.000000)\" fill=\"#FF6C68\" fill-rule=\"nonzero\"><path d=\"M27.2980992,0.874200971 C26.7268663,0.758523804 26.1331134,0.866913453 25.6392917,1.17701641 C25.1554389,1.47930436 24.8141653,1.96483113 24.6930984,2.52315663 C24.5731079,3.07574301 24.6878398,3.65344238 25.0098158,4.11789644 C25.3371296,4.5939296 25.8390162,4.92096156 26.4060118,5.02766508 C31.045922,5.95330175 35.0418401,8.55830791 37.6547588,12.3772204 C40.2676774,16.1961329 41.1782401,20.7555549 40.2228092,25.2210907 C40.1022213,25.7732483 40.2170154,26.350782 40.5395266,26.8145082 C40.9402684,27.3951092 41.5930751,27.7496771 42.2973083,27.7692363 C42.7546094,27.787238 43.2065645,27.6654879 43.5932104,27.420139 C44.0774855,27.1189844 44.4196894,26.6344423 44.542043,26.0766435 C47.0071602,14.5551113 39.2726569,3.24779794 27.2980992,0.874200971 M31.0947493,32.74255 C31.2267149,32.824535 34.1299578,34.6215925 36.3733729,36.8312195 C37.2153133,37.6669372 38.6247059,39.0646486 38.5877555,40.6871575 C38.5560837,41.7952768 37.906813,42.9047185 36.5990341,44.0789548 C36.2743987,44.3844149 33.3645574,46.9999998 28.710131,46.9999998 C27.3912247,46.9937384 26.0799397,46.7991615 24.8158264,46.422138 C23.3601676,45.9861014 21.9649286,45.3685851 20.6628693,44.584088 C15.2153297,41.4871721 11.0188239,37.5109013 7.02422548,31.6621998 C0.162014763,21.6230086 -0.0293353467,13.0238438 0.00233638896,11.4039796 C0.0142132841,3.92483507 6.48844518,0.983955044 7.22613283,0.671883236 C8.2422679,0.218321248 9.12907663,6.56389309e-05 9.94594365,6.56389309e-05 C10.3221663,-0.00210452636 10.6967773,0.0495481459 11.0584136,0.153526698 C11.7736671,0.362456139 12.7647287,0.901970084 13.4337942,2.28910278 C14.3430371,4.17343462 15.2021331,6.8736491 15.7880603,9.69419635 C16.4056593,12.6271423 14.6953853,13.450959 13.0418564,14.2470065 L12.9771933,14.2734533 C12.9771933,14.2734533 10.0515161,15.4476896 9.53685034,15.6513296 C9.03619964,15.8421642 8.77356796,16.3935308 8.94036587,16.9035838 C10.1201383,20.341663 11.9227882,23.9119759 14.1477281,27.2178213 C16.2898673,30.4151399 18.819615,33.3337939 21.6790044,35.9069051 C21.8774142,36.0783671 22.130935,36.1722806 22.3929382,36.1713728 L22.4826748,36.1713728 C22.7712253,36.1486937 23.0383058,36.009873 23.2230017,35.7865724 C23.7910711,35.0765111 24.4084443,34.4075091 25.07052,33.7845524 C26.4350442,32.5349429 27.6702421,31.933279 28.8434163,31.9332791 C29.1639159,31.9320794 29.4829541,31.9766039 29.7909292,32.0655129 C30.2528699,32.2365199 30.6924376,32.4629666 31.1000279,32.7399053 M21.8400024,18.2655921 C21.2727998,18.1576666 20.7707788,17.8303809 20.4424867,17.3545011 C20.1195351,16.8899676 20.0042929,16.3116272 20.1244497,15.758439 C20.3633736,14.7240741 21.3099013,14.0116196 22.3678647,14.0698132 C22.4897786,14.07308 22.61119,14.0867942 22.7307701,14.1108057 C27.8483957,15.1263614 31.1554534,19.9595073 30.1010483,24.8852168 C29.9793303,25.4425668 29.6381304,25.9270351 29.1548551,26.2287124 C28.767264,26.4717676 28.3158939,26.5928996 27.8589529,26.5764873 C27.7379231,26.5712459 27.6174771,26.5566569 27.4986869,26.5328501 C26.9296524,26.4268815 26.4259713,26.0986569 26.098532,25.6204368 C25.77801,25.1583614 25.6633089,24.5836905 25.7818146,24.033631 C26.0564522,22.762289 25.7906175,21.4337675 25.0480859,20.3667874 C24.2959909,19.2710084 23.1434575,18.5161347 21.8400024,18.2655921 M24.130925,11.620843 C22.9432347,11.3828221 22.1738753,10.2628017 22.4153724,9.11633459 C22.5346624,8.55724948 22.875754,8.07082659 23.360246,7.76887199 C23.8543437,7.45823035 24.448547,7.34937141 25.0203731,7.46473423 C29.1614533,8.28722853 32.7258439,10.6145437 35.0589956,14.0235314 C37.3755259,17.3601994 38.204796,21.5111457 37.3485986,25.484236 C37.2282609,26.0425595 36.8861326,26.5276693 36.4010857,26.8277315 C35.9088475,27.1418728 35.3138166,27.2514444 34.7422782,27.1331916 C33.5545879,26.8951707 32.7852285,25.7751504 33.0267255,24.6286832 C33.6442543,21.7595069 33.0443871,18.7622168 31.3705573,16.3534912 C29.6708669,13.8824331 27.0678646,12.1820541 24.1256464,11.620843 L24.130925,11.620843 Z\" id=\"Shape\"></path></g></g></g>',2),$h=[Eh];function Ch(o,n){return r(),s(\"svg\",Fh,$h)}var Dh=N(yh,[[\"render\",Ch]]);const Bh={},Yh={width:\"136px\",height:\"136px\",viewBox:\"0 0 136 136\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\"},Ah=jt('<defs><rect id=\"path-1\" x=\"0\" y=\"0\" width=\"72\" height=\"72\" rx=\"10\"></rect><filter x=\"-68.1%\" y=\"-65.3%\" width=\"236.1%\" height=\"236.1%\" filterUnits=\"objectBoundingBox\" id=\"filter-2\"><feOffset dx=\"0\" dy=\"2\" in=\"SourceAlpha\" result=\"shadowOffsetOuter1\"></feOffset><feGaussianBlur stdDeviation=\"16\" in=\"shadowOffsetOuter1\" result=\"shadowBlurOuter1\"></feGaussianBlur><feColorMatrix values=\"0 0 0 0 0.064613567   0 0 0 0 0.378874402   0 0 0 0 0.840799967  0 0 0 1 0\" type=\"matrix\" in=\"shadowBlurOuter1\"></feColorMatrix></filter></defs><g id=\"icon_side-router\" stroke=\"none\" stroke-width=\"1\" fill=\"none\" fill-rule=\"evenodd\"><g id=\"Group-5\" transform=\"translate(32.000000, 30.000000)\"><g id=\"Rectangle\"><use fill=\"black\" fill-opacity=\"1\" filter=\"url(#filter-2)\" xlink:href=\"#path-1\"></use><use fill=\"#FFFFFF\" fill-rule=\"evenodd\" xlink:href=\"#path-1\"></use></g><g id=\"route\" transform=\"translate(15.000000, 15.000000)\" fill=\"#3B89FE\"><path d=\"M37.25,31 L37.25,18.66 L22.2525,18.66 L22.2525,11 L26,11 L26,1 L16,1 L16,11 L19.75,11 L19.75,18.6625 L4.75,18.6625 L4.75,31 L1,31 L1,41 L11,41 L11,31 L7.25,31 L7.25,21.16 L19.75,21.16 L19.75,31 L16,31 L16,41 L26,41 L26,31 L22.2525,31 L22.2525,21.16 L34.75,21.16 L34.75,31 L31,31 L31,41 L41,41 L41,31 L37.25,31 Z M23.1425,38.1425 L18.8575,38.1425 L18.8575,33.855 L23.1425,33.855 L23.1425,38.1425 Z M8.1425,38.14 L3.8575,38.14 L3.8575,33.855 L8.1425,33.855 L8.1425,38.14 Z M23.1425,8.1425 L18.8575,8.1425 L18.8575,3.8575 L23.1425,3.8575 L23.1425,8.1425 Z M38.285,38.1425 L34,38.1425 L34,33.855 L38.285,33.855 L38.285,38.1425 Z\" id=\"Shape\" fill-rule=\"nonzero\"></path><rect id=\"Rectangle\" x=\"15\" y=\"0\" width=\"12\" height=\"12\" rx=\"2\"></rect><rect id=\"Rectangle\" x=\"0\" y=\"30\" width=\"12\" height=\"12\" rx=\"2\"></rect><rect id=\"Rectangle\" x=\"15\" y=\"30\" width=\"12\" height=\"12\" rx=\"2\"></rect><rect id=\"Rectangle\" x=\"30\" y=\"30\" width=\"12\" height=\"12\" rx=\"2\"></rect></g></g></g>',2),Sh=[Ah];function zh(o,n){return r(),s(\"svg\",Yh,Sh)}var Ph=N(Bh,[[\"render\",zh]]);const Th={id:\"page\"},Ih={class:\"title\"},Mh={class:\"desc\"},Lh={class:\"network-containers\"},Oh={class:\"network-container_item\"},Nh={class:\"cover\"},Vh={class:\"thumbnail\"},Gh={class:\"network-container_item\"},jh={class:\"cover\"},Uh={class:\"thumbnail\"},qh={class:\"network-container_item\"},Rh={class:\"cover\"},Wh={class:\"thumbnail\"},Hh=[\"innerHTML\"],Jh=I({setup(o){const{$gettext:n,$ngettext:a}=J(),l=n(\"\\u6CA1\\u627E\\u5230\\u60F3\\u8981\\u7684\\u914D\\u7F6E\\uFF1F\\u8BF7\\u4F7F\\u7528%{link}\",{link:'<a href=\"/cgi-bin/luci/admin/network/network\">'+n(\"\\u9AD8\\u7EA7\\u6A21\\u5F0F\")+\"</a>\"},!0);return(u,d)=>{const c=_t(\"router-link\");return r(),s(\"div\",Th,[t(\"div\",Ih,i(e(n)(\"\\u6B22\\u8FCE\\u4F7F\\u7528\\u7F51\\u7EDC\\u914D\\u7F6E\\u5411\\u5BFC\")),1),t(\"div\",Mh,i(e(n)(\"\\u9009\\u62E9\\u4E00\\u79CD\\u8FDE\\u63A5\\u65B9\\u5F0F\\u4EE5\\u5F00\\u59CB\")),1),t(\"div\",Lh,[t(\"div\",Oh,[Y(c,{to:\"/network/pppoe\"},{default:V(()=>[t(\"div\",Nh,[t(\"div\",Vh,[Y(Dh),t(\"span\",null,i(e(n)(\"\\u5BBD\\u5E26\\u62E8\\u53F7\\u8FDE\\u63A5\")),1)])])]),_:1})]),t(\"div\",Gh,[Y(c,{to:\"/network/dhcp\"},{default:V(()=>[t(\"div\",jh,[t(\"div\",Uh,[Y(kh),t(\"span\",null,i(e(n)(\"\\u8FDE\\u63A5\\u73B0\\u6709\\u8DEF\\u7531\\u5668\")),1)])])]),_:1})]),t(\"div\",qh,[Y(c,{to:\"/network/gateway\"},{default:V(()=>[t(\"div\",Rh,[t(\"div\",Wh,[Y(Ph),t(\"span\",null,i(e(n)(\"\\u914D\\u7F6E\\u4E3A\\u65C1\\u8DEF\\u7531\")),1)])])]),_:1})])]),t(\"div\",{class:\"info\",innerHTML:e(l)},null,8,Hh)])}}});var Zh=N(Jh,[[\"__scopeId\",\"data-v-52c03678\"]]);const Kh={key:0,id:\"page\"},Qh={class:\"title\"},Xh={class:\"desc\"},t_={class:\"network-message\"},e_=[\"innerHTML\"],a_=[\"onSubmit\"],o_={class:\"label-key\"},n_=[\"placeholder\",\"disabled\"],i_={class:\"label-key\"},r_=[\"placeholder\",\"disabled\"],s_={key:0,class:\"chose_dhcp\"},d_={class:\"dhcp_info\"},l_={key:1,class:\"msg\"},u_={class:\"btns\"},c_=[\"disabled\"],p_=[\"onClick\"],f_={key:1,id:\"page\"},m_={class:\"title\"},g_={class:\"btns\"},v_=[\"onClick\"],b_=[\"onClick\"],h_=I({setup(o){const{$gettext:n,$ngettext:a}=J(),u=Te().query.type,d=n(\"\\u7531\\u4E8E\\u60A8\\u7684\\u8BBE\\u5907<span>\\u6CA1\\u6709 WAN \\u53E3</span>\\uFF0C\\u65E0\\u6CD5\\u4F7F\\u7528\\u672C\\u8BBE\\u7F6E\\u5411\\u5BFC\\uFF0C\\u5177\\u4F53\\u8BF7\\u770B%{link}\",{link:'<a href=\"https://doc.linkease.com/zh/guide/istoreos/question.html#%E7%BD%91%E7%BB%9C\" target=\"_blank\" rel=\"noopener noreferrer\">'+n(\"\\u94FE\\u63A5\")+\"</a>\"},!0),c=E(0),k=E({}),g=E(\"\"),p=E(!1),m=E(0),v=E(!1);(()=>L(this,null,function*(){var f,F;p.value=!0;try{const w=yield Promise.all([G.Guide.Pppoe.GET(),G.Guide.GetLan.GET()]);if(w[0].data){const{success:h,error:_,result:x}=w[0].data;x&&(x.enableLanDhcp=!1,k.value=x),h==-1011&&(p.value=!0,m.value=h)}(f=w[1].data)!=null&&f.result&&(((F=w[1].data)==null?void 0:F.result).enableDhcp||(v.value=!0,k.value.enableLanDhcp=!0))}catch(w){g.value=w}m.value==0&&(p.value=!1)}))();const y=()=>L(this,null,function*(){const f=k.value.account||\"\",F=k.value.password||\"\";if(f==\"\"){g.value=n(\"\\u8D26\\u53F7\\u4E0D\\u80FD\\u4E3A\\u7A7A\");return}if(F==\"\"){g.value=n(\"\\u5BC6\\u7801\\u4E0D\\u80FD\\u4E3A\\u7A7A\");return}p.value=!0;const w=$.Loading(n(\"\\u914D\\u7F6E\\u4E2D...\"));try{const h=yield G.Guide.Pppoe.POST({account:f,password:F});if(h!=null&&h.data){const{error:_,success:x}=h.data;_&&(g.value=_),(x==null||x==0)&&($.Success(n(\"\\u914D\\u7F6E\\u6210\\u529F\")),c.value=1)}}catch(h){g.value=h}p.value=!1,w.Close()});return(f,F)=>{const w=_t(\"switch-box\"),h=_t(\"router-link\");return c.value==0?(r(),s(\"div\",Kh,[t(\"h2\",Qh,i(e(n)(\"\\u914D\\u7F6E\\u5BBD\\u5E26\\u8D26\\u53F7\")),1),t(\"h3\",Xh,i(e(n)(\"\\u8BF7\\u786E\\u4FDD\\u60A8\\u5DF2\\u5C06\\u8DEF\\u7531 WAN \\u53E3\\u8FDE\\u63A5\\u5230\\u5149\\u732B\")),1),t(\"div\",t_,[m.value==-1011?(r(),s(\"li\",{key:0,innerHTML:e(d)},null,8,e_)):D(\"\",!0)]),t(\"form\",{onSubmit:ft(y,[\"prevent\"])},[t(\"label\",null,[t(\"div\",o_,[t(\"span\",null,i(e(n)(\"\\u5BBD\\u5E26\\u8D26\\u53F7\")),1)]),O(t(\"input\",{type:\"text\",\"onUpdate:modelValue\":F[0]||(F[0]=_=>k.value.account=_),placeholder:e(n)(\"\\u5BBD\\u5E26\\u8D26\\u53F7\"),required:\"\",disabled:p.value},null,8,n_),[[at,k.value.account,void 0,{trim:!0}]])]),t(\"label\",null,[t(\"div\",i_,[t(\"span\",null,i(e(n)(\"\\u5BC6\\u7801\")),1)]),O(t(\"input\",{type:\"password\",\"onUpdate:modelValue\":F[1]||(F[1]=_=>k.value.password=_),placeholder:e(n)(\"\\u5BBD\\u5E26\\u5BC6\\u7801\"),required:\"\",disabled:p.value},null,8,r_),[[at,k.value.password,void 0,{trim:!0}]])]),v.value?(r(),s(\"div\",s_,[Y(w,{modelValue:k.value.enableLanDhcp,\"onUpdate:modelValue\":F[2]||(F[2]=_=>k.value.enableLanDhcp=_)},{default:V(()=>[t(\"span\",d_,i(e(n)(\"\\u542F\\u7528LAN\\u53E3DHCP\\u670D\\u52A1\\uFF08\\u7528\\u4E8E\\u4ECE\\u65C1\\u8DEF\\u7531\\u6A21\\u5F0F\\u6062\\u590D\\u6210\\u9ED8\\u8BA4\\u72B6\\u6001\\uFF09\")),1)]),_:1},8,[\"modelValue\"])])):D(\"\",!0),g.value?(r(),s(\"div\",l_,i(g.value),1)):D(\"\",!0),t(\"div\",u_,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",disabled:p.value},i(e(n)(\"\\u4FDD\\u5B58\\u914D\\u7F6E\")),9,c_),Y(h,{to:e(u)==\"index\"?\"/\":\"/network\",custom:\"\"},{default:V(({navigate:_})=>[t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:_},i(e(n)(\"\\u8FD4\\u56DE\")),9,p_)]),_:1},8,[\"to\"])])],40,a_)])):c.value==1?(r(),s(\"div\",f_,[t(\"h2\",m_,i(e(n)(\"\\u914D\\u7F6E\\u6210\\u529F\")),1),t(\"div\",g_,[Y(h,{to:\"/\",custom:\"\"},{default:V(({navigate:_})=>[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",onClick:_},i(e(n)(\"\\u8FDB\\u5165\\u63A7\\u5236\\u53F0\")),9,v_)]),_:1}),Y(h,{to:e(u)==\"index\"?\"/\":\"/network\",custom:\"\"},{default:V(({navigate:_})=>[t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:_},i(e(n)(\"\\u8FD4\\u56DE\")),9,b_)]),_:1},8,[\"to\"])])])):D(\"\",!0)}}});var __=N(h_,[[\"__scopeId\",\"data-v-e187efe4\"]]);const x_={key:0,id:\"page\"},w_={class:\"title\"},k_={class:\"desc\"},y_={class:\"network-message\"},F_=[\"innerHTML\"],E_=[\"onSubmit\"],$_={class:\"label-key\"},C_={value:\"dhcp\"},D_={value:\"static\"},B_={class:\"label-key\"},Y_=[\"placeholder\",\"disabled\"],A_={key:0,class:\"msg\"},S_={class:\"label-key\"},z_=[\"placeholder\",\"disabled\"],P_={key:1,class:\"msg\"},T_={class:\"label-key\"},I_=[\"placeholder\",\"disabled\"],M_={class:\"label-key\"},L_=[\"disabled\"],O_={value:\"manual\"},N_={class:\"label-key\"},V_=[\"onUpdate:modelValue\",\"placeholder\",\"disabled\"],G_={class:\"label-key\"},j_=[\"placeholder\",\"disabled\"],U_={class:\"label-key\"},q_=[\"placeholder\",\"disabled\"],R_={key:2,class:\"chose_dhcp\"},W_={class:\"dhcp_info\"},H_={key:3,class:\"msgs\"},J_={class:\"btns\"},Z_=[\"disabled\"],K_=[\"onClick\"],Q_={key:1,id:\"page\"},X_={class:\"title\"},tx={class:\"btns\"},ex=[\"onClick\"],ax=[\"onClick\"],ox=I({setup(o){const{$gettext:n,$ngettext:a}=J(),l=n(\"\\u7531\\u4E8E\\u60A8\\u7684\\u8BBE\\u5907<span>\\u6CA1\\u6709 WAN \\u53E3</span>\\uFF0C\\u65E0\\u6CD5\\u4F7F\\u7528\\u672C\\u8BBE\\u7F6E\\u5411\\u5BFC\\uFF0C\\u5177\\u4F53\\u8BF7\\u770B%{link}\",{link:'<a href=\"https://doc.linkease.com/zh/guide/istoreos/question.html#%E7%BD%91%E7%BB%9C\" target=\"_blank\" rel=\"noopener noreferrer\">'+n(\"\\u94FE\\u63A5\")+\"</a>\"},!0),u=E(0),d=E({}),c=E(\"\"),k=E(\"\"),g=E(\"\"),p=E(!1),m=E(\"\"),v=E(\"\"),b=E(0),y=Mt.checkIsIP,f=E(!1),w=Te().query.type;(()=>L(this,null,function*(){var A,z;p.value=!0;try{const B=yield Promise.all([G.Guide.ClientModel.GET(),G.Guide.GetLan.GET()]);if(B[0]){const H=B[0];if(H.data){const{success:M,error:q,result:T}=H.data;T&&(T.wanProto!=\"dhcp\"&&T.wanProto!=\"static\"&&(T.wanProto=\"dhcp\",T.dnsProto=\"auto\"),T.enableLanDhcp=!1,d.value=T),M==-1011&&(b.value=M,p.value=!0)}}(A=B[1].data)!=null&&A.result&&(((z=B[1].data)==null?void 0:z.result).enableDhcp||(f.value=!0,d.value.enableLanDhcp=!0))}catch(B){c.value=B}b.value==0&&(p.value=!1)}))();const _=A=>{A.target.value==\"static\"?((d.value.staticIp==null||d.value.staticIp==\"\")&&(d.value.staticIp=\"192.168.1.100\"),(d.value.subnetMask==null||d.value.subnetMask==\"\")&&(d.value.subnetMask=\"255.255.255.0\"),d.value.dnsProto==\"auto\"&&setTimeout(()=>d.value.dnsProto=\"manual\",0)):d.value.dnsProto==\"manual\"&&setTimeout(()=>d.value.dnsProto=\"auto\",0)},x=A=>{const z=A.target;if(z.value==\"\"){m.value=\"\";return}y(z.value)?m.value=\"\":m.value=n(\"\\u8BF7\\u8F93\\u5165\\u5408\\u6CD5\\u7684IP\\u5730\\u5740\")},C=A=>{const z=A.target;if(z.value==\"\"){v.value=\"\";return}y(z.value)?v.value=\"\":v.value=n(\"\\u8BF7\\u8F93\\u5165\\u5408\\u6CD5\\u7684\\u5730\\u5740\")},S=()=>L(this,null,function*(){const A={};switch(d.value.wanProto){case\"dhcp\":break;case\"static\":A.staticIp=d.value.staticIp,A.subnetMask=d.value.subnetMask,A.gateway=d.value.gateway||\"\";break}switch(d.value.dnsProto){case\"auto\":break;case\"manual\":A.manualDnsIp=[],d.value.manualDnsIp!=null&&d.value.manualDnsIp.length>0?A.manualDnsIp=d.value.manualDnsIp:(A.manualDnsIp.push(k.value),g.value&&A.manualDnsIp.push(g.value));break}A.dnsProto=d.value.dnsProto,A.wanProto=d.value.wanProto,A.enableLanDhcp=d.value.enableLanDhcp;const z=$.Loading(n(\"\\u914D\\u7F6E\\u4E2D....\"));p.value=!0;try{const B=yield G.Guide.ClientModel.POST(A);if(B!=null&&B.data){const{success:H,error:M}=B==null?void 0:B.data;M&&(c.value=M),(H==null||H==0)&&($.Success(n(\"\\u914D\\u7F6E\\u6210\\u529F\")),u.value=1)}}catch(B){c.value=B}p.value=!1,z.Close()});return(A,z)=>{const B=_t(\"switch-box\"),H=_t(\"router-link\");return u.value==0?(r(),s(\"div\",x_,[t(\"h2\",w_,i(e(n)(\"\\u914D\\u7F6E\\u4E92\\u8054\\u7F51\")),1),t(\"h3\",k_,i(e(n)(\"\\u8BF7\\u786E\\u4FDD\\u60A8\\u5DF2\\u5C06\\u672C\\u8BBE\\u5907 WAN \\u53E3\\u8FDE\\u63A5\\u5230\\u4E0A\\u7EA7\\u8DEF\\u7531\\u5668\\u5C40\\u57DF\\u7F51\\uFF08 LAN \\uFF09\\u63A5\\u53E3\")),1),t(\"div\",y_,[b.value==-1011?(r(),s(\"li\",{key:0,innerHTML:e(l)},null,8,F_)):D(\"\",!0)]),t(\"form\",{onSubmit:ft(S,[\"prevent\"])},[t(\"label\",null,[t(\"div\",$_,[t(\"span\",null,i(e(n)(\"WAN \\u63A5\\u53E3\\u914D\\u7F6E\\u65B9\\u5F0F\")),1)]),O(t(\"select\",{\"onUpdate:modelValue\":z[0]||(z[0]=M=>d.value.wanProto=M),onInput:_},[t(\"option\",C_,i(e(n)(\"\\u81EA\\u52A8\\u83B7\\u53D6IP\\u5730\\u5740\\uFF08DHCP\\uFF09\")),1),t(\"option\",D_,i(e(n)(\"\\u9759\\u6001IP\\u5730\\u5740\")),1)],544),[[pt,d.value.wanProto]])]),d.value.wanProto==\"static\"?(r(),s(U,{key:0},[t(\"label\",null,[t(\"div\",B_,[t(\"span\",null,i(e(n)(\"IP\\u5730\\u5740\")),1)]),O(t(\"input\",{type:\"text\",\"onUpdate:modelValue\":z[1]||(z[1]=M=>d.value.staticIp=M),placeholder:e(n)(\"\\u9759\\u6001IP\\u5730\\u5740\"),required:\"\",disabled:p.value,onInput:x},null,40,Y_),[[at,d.value.staticIp,void 0,{trim:!0}]])]),m.value?(r(),s(\"p\",A_,i(m.value),1)):D(\"\",!0),t(\"label\",null,[t(\"div\",S_,[t(\"span\",null,i(e(n)(\"\\u5B50\\u7F51\\u63A9\\u7801\")),1)]),O(t(\"input\",{type:\"text\",\"onUpdate:modelValue\":z[2]||(z[2]=M=>d.value.subnetMask=M),placeholder:e(n)(\"\\u5B50\\u7F51\\u63A9\\u7801\"),required:\"\",disabled:p.value,onInput:C},null,40,z_),[[at,d.value.subnetMask,void 0,{trim:!0}]])]),v.value?(r(),s(\"p\",P_,i(v.value),1)):D(\"\",!0),t(\"label\",null,[t(\"div\",T_,[t(\"span\",null,i(e(n)(\"\\u7F51\\u5173\\u5730\\u5740\")),1)]),O(t(\"input\",{type:\"text\",\"onUpdate:modelValue\":z[3]||(z[3]=M=>d.value.gateway=M),placeholder:e(n)(\"\\u7F51\\u5173\\u5730\\u5740\"),required:\"\",disabled:p.value},null,8,I_),[[at,d.value.gateway,void 0,{trim:!0}]])])],64)):D(\"\",!0),t(\"label\",null,[t(\"div\",M_,[t(\"span\",null,i(e(n)(\"DNS \\u914D\\u7F6E\\u65B9\\u5F0F\")),1)]),O(t(\"select\",{\"onUpdate:modelValue\":z[4]||(z[4]=M=>d.value.dnsProto=M)},[t(\"option\",{value:\"auto\",disabled:d.value.wanProto==\"static\"},i(e(n)(\"\\u81EA\\u52A8\\u83B7\\u53D6\\uFF08DHCP\\uFF09\")),9,L_),t(\"option\",O_,i(e(n)(\"\\u624B\\u5DE5\\u914D\\u7F6E\")),1)],512),[[pt,d.value.dnsProto]])]),d.value.dnsProto==\"manual\"?(r(),s(U,{key:1},[d.value.manualDnsIp!=null&&d.value.manualDnsIp.length>0?(r(!0),s(U,{key:0},tt(d.value.manualDnsIp,(M,q)=>(r(),s(\"label\",null,[t(\"div\",N_,[t(\"span\",null,i(e(n)(\"DNS\\u670D\\u52A1\\u5668\")),1)]),O(t(\"input\",{type:\"text\",\"onUpdate:modelValue\":T=>d.value.manualDnsIp[q]=T,placeholder:e(n)(\"DNS\\u670D\\u52A1\\u5668\"),required:\"\",disabled:p.value},null,8,V_),[[at,d.value.manualDnsIp[q],void 0,{trim:!0}]])]))),256)):(r(),s(U,{key:1},[t(\"label\",null,[t(\"div\",G_,[t(\"span\",null,i(e(n)(\"DNS\\u670D\\u52A1\\u5668\")),1)]),O(t(\"input\",{type:\"text\",\"onUpdate:modelValue\":z[5]||(z[5]=M=>k.value=M),placeholder:e(n)(\"DNS\\u670D\\u52A1\\u5668\"),required:\"\",disabled:p.value},null,8,j_),[[at,k.value,void 0,{trim:!0}]])]),t(\"label\",null,[t(\"div\",U_,i(e(n)(\"\\u5907\\u7528DNS\\u670D\\u52A1\\u5668\")),1),O(t(\"input\",{type:\"text\",\"onUpdate:modelValue\":z[6]||(z[6]=M=>g.value=M),placeholder:e(n)(\"\\u5907\\u7528DNS\\u670D\\u52A1\\u5668\"),disabled:p.value},null,8,q_),[[at,g.value,void 0,{trim:!0}]])])],64))],64)):D(\"\",!0),f.value?(r(),s(\"div\",R_,[Y(B,{modelValue:d.value.enableLanDhcp,\"onUpdate:modelValue\":z[7]||(z[7]=M=>d.value.enableLanDhcp=M)},{default:V(()=>[t(\"span\",W_,i(e(n)(\"\\u542F\\u7528LAN\\u53E3DHCP\\u670D\\u52A1\\uFF08\\u7528\\u4E8E\\u4ECE\\u65C1\\u8DEF\\u7531\\u6A21\\u5F0F\\u6062\\u590D\\u6210\\u9ED8\\u8BA4\\u72B6\\u6001\\uFF09\")),1)]),_:1},8,[\"modelValue\"])])):D(\"\",!0),c.value?(r(),s(\"div\",H_,i(c.value),1)):D(\"\",!0),t(\"div\",J_,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",disabled:p.value},i(e(n)(\"\\u4FDD\\u5B58\\u914D\\u7F6E\")),9,Z_),Y(H,{to:e(w)==\"index\"?\"/\":\"/network\",custom:\"\"},{default:V(({navigate:M})=>[t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:M},i(e(n)(\"\\u8FD4\\u56DE\")),9,K_)]),_:1},8,[\"to\"])])],40,E_)])):u.value==1?(r(),s(\"div\",Q_,[t(\"h2\",X_,i(e(n)(\"\\u914D\\u7F6E\\u6210\\u529F\")),1),t(\"div\",tx,[Y(H,{to:\"/\",custom:\"\"},{default:V(({navigate:M})=>[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",onClick:M},i(e(n)(\"\\u8FDB\\u5165\\u63A7\\u5236\\u53F0\")),9,ex)]),_:1}),Y(H,{to:e(w)==\"index\"?\"/\":\"/network\",custom:\"\"},{default:V(({navigate:M})=>[t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:M},i(e(n)(\"\\u8FD4\\u56DE\")),9,ax)]),_:1},8,[\"to\"])])])):D(\"\",!0)}}});var nx=N(ox,[[\"__scopeId\",\"data-v-5eefd6ee\"]]);const ix=o=>(ut(\"data-v-3d6d1dea\"),o=o(),ct(),o),rx={key:0,id:\"page\"},sx={class:\"title\"},dx=ix(()=>t(\"br\",null,null,-1)),lx={class:\"btns\"},ux=[\"onClick\"],cx={key:1,id:\"page\"},px={class:\"title\"},fx={class:\"desc\"},mx=[\"onSubmit\"],gx={class:\"label-key\"},vx={class:\"label-value\"},bx={class:\"label-key\"},hx=[\"placeholder\"],_x={class:\"label-key\"},xx=[\"placeholder\"],wx={class:\"label-key\"},kx=[\"placeholder\"],yx={class:\"label-key\"},Fx=[\"placeholder\"],Ex={key:0,class:\"msgs\"},$x={class:\"switch_inline\"},Cx={key:0,class:\"switch_info\"},Dx={key:1,class:\"switch_info\"},Bx={class:\"switch_inline\"},Yx={class:\"switch_info\"},Ax={class:\"switch_inline\"},Sx={class:\"switch_info\"},zx={class:\"btns\"},Px={class:\"cbi-button cbi-button-apply app-btn app-next\"},Tx=[\"onClick\"],Ix={key:2,id:\"page\"},Mx={class:\"title\"},Lx={class:\"desc\"},Ox={class:\"btns\"},Nx={key:3,id:\"page\"},Vx={class:\"title\"},Gx=[\"disabled\"],jx={style:{\"text-align\":\"left\"}},Ux={class:\"btns\"},qx=[\"disabled\"],Rx=[\"onClick\"],Wx=I({setup(o){const{$gettext:n,$ngettext:a}=J(),u=Te().query.type,d=E(0),c=E(\"\"),k=E(!1),g=Q(()=>{var F,w,h;return!(((F=m.value)==null?void 0:F.ipv4addr)&&((w=m.value)==null?void 0:w.ipv4mask)&&((h=m.value)==null?void 0:h.gateway))}),p=E({subnetMask:\"255.255.255.0\",staticDnsIp:\"223.5.5.5\",staticLanIp:\"\",gateway:\"\",enableDhcp:!0,dhcp6c:!1,enableNat:!1}),m=E(),v=()=>{k.value=!0,G.Network.Status.GET().then(F=>{if(F!=null&&F.data){const{result:w}=F==null?void 0:F.data;w&&(m.value=w)}}).finally(()=>{k.value=!1})},b=F=>{var w,h,_,x,C;F&&(p.value.staticLanIp=((w=m.value)==null?void 0:w.ipv4addr)||\"\",p.value.subnetMask=((h=m.value)==null?void 0:h.ipv4mask)&&Lt.prefixToMask(m.value.ipv4mask)||\"\",p.value.gateway=((_=m.value)==null?void 0:_.gateway)||\"\",p.value.staticDnsIp=((x=m.value)==null?void 0:x.dnsList)&&((C=m.value)==null?void 0:C.dnsList[0])||\"223.5.5.5\"),d.value=1},y=F=>{window.location.href=location.protocol+\"//\"+p.value.staticLanIp+(location.port?\":\"+location.port:\"\")},f=()=>L(this,null,function*(){const F=p.value,w=$.Loading(n(\"\\u914D\\u7F6E\\u4E2D...\"));try{const h=yield G.Guide.GatewayRouter.POST(F);if(h!=null&&h.data){const{success:_,error:x}=h==null?void 0:h.data;if(x&&(c.value=x),_==null||_==0){setTimeout(()=>{d.value=2,w.Close()},5e3);return}}}catch(h){c.value=h}w.Close()});return(F,w)=>{var x,C,S,A;const h=_t(\"router-link\"),_=_t(\"switch-box\");return d.value==0?(r(),s(\"div\",rx,[t(\"h2\",sx,i(e(n)(\"\\u65C1\\u8DEF\\u7531\\u914D\\u7F6E\\u524D\\u7684\\u51C6\\u5907\\u5DE5\\u4F5C\")),1),t(\"code\",null,[dt(i(e(n)(\"\\u65C1\\u8DEF\\u7531\\u6A21\\u5F0F\\uFF0C\\u4E5F\\u53EB\\u5355\\u81C2\\u8DEF\\u7531\\u6A21\\u5F0F\\u3002\"))+\" \",1),t(\"p\",null,i(e(n)(\"\\u60A8\\u53EF\\u4EE5\\u7528\\u4E0A\\u4E00\\u7EA7\\u8DEF\\u7531\\uFF08\\u4E3B\\u8DEF\\u7531\\uFF09\\u62E8\\u53F7\\uFF0C\\u7136\\u540E\\u7528\\u672C\\u8DEF\\u7531\\u6765\\u5B9E\\u73B0\\u4E00\\u4E9B\\u9AD8\\u7EA7\\u529F\\u80FD\\u3002\")),1),dx,t(\"p\",null,i(e(n)(\"\\u672C\\u5411\\u5BFC\\u652F\\u6301\\u81EA\\u52A8\\u6216\\u624B\\u52A8\\u914D\\u7F6E\\uFF1A\")),1),t(\"p\",null,i(e(n)(\"\\u70B9\\u51FB\\u201C\\u81EA\\u52A8\\u914D\\u7F6E\\u201D\\u6309\\u94AE\\u5F00\\u59CB\\u81EA\\u52A8\\u914D\\u7F6E\\u5411\\u5BFC\\uFF1B\")),1),t(\"p\",null,i(e(n)(\"\\u624B\\u52A8\\u914D\\u7F6E\\u5219\\u9700\\u81EA\\u884C\\u83B7\\u53D6\\u4E3B\\u8DEF\\u7531\\u5668\\u7684IP\\u5730\\u5740\\uFF08\\u4F8B\\u5982 192.168.2.1 \\uFF09\\u548C\\u5B50\\u7F51\\u63A9\\u7801\\uFF0C\\u8BB0\\u5F55\\u4EE5\\u5907\\u540E\\u7EED\\u586B\\u5199\\uFF0C\\u70B9\\u51FB\\u201C\\u624B\\u52A8\\u914D\\u7F6E\\u201D\\u6309\\u94AE\\uFF0C\\u5207\\u6362\\u5230\\u53C2\\u6570\\u914D\\u7F6E\\u9875\\uFF0C\\u6309\\u5B9E\\u9645\\u60C5\\u51B5\\u81EA\\u884C\\u586B\\u5199\\u3002\")),1)]),t(\"div\",lx,[t(\"button\",{class:\"cbi-button cbi-button-success app-btn app-next\",onClick:w[0]||(w[0]=z=>d.value=3)},i(e(n)(\"\\u81EA\\u52A8\\u914D\\u7F6E...\")),1),t(\"button\",{class:\"cbi-button cbi-button-neutral app-btn app-next\",onClick:w[1]||(w[1]=z=>b(!1))},i(e(n)(\"\\u624B\\u52A8\\u914D\\u7F6E...\")),1),Y(h,{to:e(u)==\"index\"?\"/\":\"/network\",custom:\"\"},{default:V(({navigate:z})=>[t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:z},i(e(n)(\"\\u8FD4\\u56DE\")),9,ux)]),_:1},8,[\"to\"])])])):d.value==1?(r(),s(\"div\",cx,[t(\"h2\",px,i(e(n)(\"\\u914D\\u7F6E\\u65C1\\u8DEF\\u7531\\u7F51\\u7EDC\")),1),t(\"h3\",fx,i(e(n)(\"\\u73B0\\u5728\\uFF0C\\u8BF7\\u4F60\\u914D\\u7F6E\\u65C1\\u8DEF\\u7531\\u4FE1\\u606F\")),1),t(\"form\",{onSubmit:ft(f,[\"prevent\"])},[t(\"label\",null,[t(\"div\",gx,[t(\"span\",null,i(e(n)(\"LAN \\u63A5\\u53E3\\u914D\\u7F6E\\u65B9\\u5F0F\")),1)]),t(\"div\",vx,[t(\"select\",{disabled:\"\",style:ht({backgroundColor:\"rgba(215, 215, 215, 1)\",color:\"#333\"})},[t(\"option\",null,i(e(n)(\"\\u65C1\\u8DEF\\u7531\\u6A21\\u5F0F\\u4EC5\\u652F\\u6301\\u9759\\u6001IP\\u5730\\u5740\")),1)],4)])]),t(\"label\",null,[t(\"div\",bx,[t(\"span\",null,i(e(n)(\"IP \\u5730\\u5740\")),1)]),O(t(\"input\",{type:\"text\",\"onUpdate:modelValue\":w[2]||(w[2]=z=>p.value.staticLanIp=z),placeholder:e(n)(\"IP\\u5730\\u5740\"),required:\"\"},null,8,hx),[[at,p.value.staticLanIp,void 0,{trim:!0}]])]),t(\"label\",null,[t(\"div\",_x,[t(\"span\",null,i(e(n)(\"\\u5B50\\u7F51\\u63A9\\u7801\")),1)]),O(t(\"input\",{type:\"text\",\"onUpdate:modelValue\":w[3]||(w[3]=z=>p.value.subnetMask=z),placeholder:e(n)(\"\\u5B50\\u7F51\\u63A9\\u7801\"),required:\"\"},null,8,xx),[[at,p.value.subnetMask,void 0,{trim:!0}]])]),t(\"label\",null,[t(\"div\",wx,[t(\"span\",null,i(e(n)(\"\\u7F51\\u5173\\u5730\\u5740\")),1)]),O(t(\"input\",{type:\"text\",\"onUpdate:modelValue\":w[4]||(w[4]=z=>p.value.gateway=z),placeholder:e(n)(\"\\u7F51\\u5173\\u5730\\u5740\"),required:\"\"},null,8,kx),[[at,p.value.gateway,void 0,{trim:!0}]])]),t(\"label\",null,[t(\"div\",yx,[t(\"span\",null,i(e(n)(\"DNS\\u670D\\u52A1\\u5668\")),1)]),O(t(\"input\",{type:\"text\",\"onUpdate:modelValue\":w[5]||(w[5]=z=>p.value.staticDnsIp=z),placeholder:e(n)(\"223.5.5.5\"),required:\"\"},null,8,Fx),[[at,p.value.staticDnsIp,void 0,{trim:!0}]])]),c.value?(r(),s(\"div\",Ex,i(c.value),1)):D(\"\",!0),t(\"div\",$x,[Y(_,{modelValue:p.value.enableDhcp,\"onUpdate:modelValue\":w[6]||(w[6]=z=>p.value.enableDhcp=z)},{default:V(()=>[p.value.enableDhcp?(r(),s(\"span\",Cx,i(e(n)(\"\\u63D0\\u4F9B DHCPv4 \\u670D\\u52A1\\uFF08\\u9700\\u8981\\u5173\\u95ED\\u4E3B\\u8DEF\\u7531 DHCP \\u670D\\u52A1\\uFF09\")),1)):(r(),s(\"span\",Dx,i(e(n)(\"\\u63D0\\u4F9B DHCPv4 \\u670D\\u52A1\")),1))]),_:1},8,[\"modelValue\"])]),t(\"div\",Bx,[Y(_,{modelValue:p.value.dhcp6c,\"onUpdate:modelValue\":w[7]||(w[7]=z=>p.value.dhcp6c=z)},{default:V(()=>[t(\"span\",Yx,i(e(n)(\"\\u81EA\\u52A8\\u83B7\\u53D6 IPV6\\uFF08\\u5373\\u5F00\\u542F DHCPv6 \\u5BA2\\u6237\\u7AEF\\uFF09\")),1)]),_:1},8,[\"modelValue\"])]),t(\"div\",Ax,[Y(_,{modelValue:p.value.enableNat,\"onUpdate:modelValue\":w[8]||(w[8]=z=>p.value.enableNat=z)},{default:V(()=>[t(\"span\",Sx,i(e(n)(\"\\u5F00\\u542F NAT\\uFF08\\u53EF\\u4FEE\\u590D\\u67D0\\u4E9B\\u65E0\\u7EBF\\u70ED\\u70B9\\u4E0D\\u80FD\\u8BBF\\u95EE\\u5916\\u7F51\\u95EE\\u9898\\uFF09\")),1)]),_:1},8,[\"modelValue\"])]),t(\"div\",zx,[t(\"button\",Px,i(e(n)(\"\\u4FDD\\u5B58\\u914D\\u7F6E\")),1),Y(h,{to:e(u)==\"index\"?\"/\":\"/network\",custom:\"\"},{default:V(({navigate:z})=>[t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:z},i(e(n)(\"\\u8FD4\\u56DE\")),9,Tx)]),_:1},8,[\"to\"])])],40,mx)])):d.value==2?(r(),s(\"div\",Ix,[t(\"h2\",Mx,i(e(n)(\"\\u914D\\u7F6E\\u6210\\u529F\")),1),t(\"h3\",Lx,i(e(n)(\"\\u73B0\\u5728\\uFF0C\\u5C06\\u672C\\u8DEF\\u7531WAN\\u53E3\\u65AD\\u5F00\\uFF0C\\u5C06\\u5176\\u4E2D\\u4E00\\u4E2ALAN\\u53E3\\u4E0E\\u4E3B\\u8DEF\\u7531\\u8FDE\\u63A5\\uFF0C\\u5E76\\u5C06\\u5F53\\u524D\\u6D4F\\u89C8\\u5668\\u8BBE\\u5907\\u8FDE\\u63A5\\u5230\\u4E3B\\u8DEF\\u7531\\u3002\\u70B9\\u51FB\\u201C\\u8FDB\\u5165\\u63A7\\u5236\\u53F0\\u201D\\u6D4F\\u89C8\\u5668\\u5C06\\u8DF3\\u8F6C\\u5230\\u65B0\\u7684\\u8DEF\\u7531IP\")),1),t(\"div\",Ox,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",onClick:y},i(e(n)(\"\\u8FDB\\u5165\\u63A7\\u5236\\u53F0\")),1)])])):d.value==3?(r(),s(\"div\",Nx,[t(\"h2\",Vx,i(e(n)(\"\\u65C1\\u8DEF\\u7531\\u81EA\\u52A8\\u914D\\u7F6E\")),1),t(\"code\",null,i(e(n)(\"\\u9996\\u5148\\u786E\\u8BA4\\u4E3B\\u8DEF\\u7531\\u5F00\\u542F\\u4E86 DHCP \\u670D\\u52A1\\uFF0C\\u786E\\u8BA4\\u672C\\u8DEF\\u7531 WAN \\u53E3\\u662F DHCP \\u5BA2\\u6237\\u7AEF\\u6A21\\u5F0F\\uFF08\\u9ED8\\u8BA4\\u5373\\u662F\\uFF0C\\u5982\\u679C\\u4E0D\\u662F\\u53EF\\u4F7F\\u7528\\u201C\\u8FDE\\u63A5\\u73B0\\u6709\\u8DEF\\u7531\\u5668\\u201D\\u5411\\u5BFC\\u6539\\u6210 DHCP \\u5BA2\\u6237\\u7AEF\\uFF09\\uFF0C\\u7136\\u540E\\u5C06\\u672C\\u8DEF\\u7531 WAN \\u53E3\\u4E0E\\u4E3B\\u8DEF\\u7531\\u7684 LAN \\u8FDE\\u63A5\\uFF0C\\u4EE5\\u81EA\\u52A8\\u83B7\\u53D6\\u914D\\u7F6E\\u3002\")),1),dt(\" \"+i(e(n)(\"1. \\u6EE1\\u8DB3\\u4E0A\\u8FF0\\u6761\\u4EF6\\u4EE5\\u540E\\uFF0C\\u70B9\\u51FB\\u201C\\u5F53\\u524D IPv4 \\u4E0A\\u6E38\\u4FE1\\u606F\\u201D\\u4EE5\\u5237\\u65B0\\u5F53\\u524D\\u8FDE\\u63A5\\u4FE1\\u606F\\uFF0C\\u6210\\u529F\\u4EE5\\u540E\\uFF0C\\u201C\\u81EA\\u52A8\\u586B\\u5199\\u201D\\u6309\\u94AE\\u5C06\\u88AB\\u6FC0\\u6D3B\\u3002(\\u5931\\u8D25\\u53EF\\u518D\\u6B21\\u70B9\\u51FB)\"))+\" \",1),t(\"button\",{class:lt([\"cbi-button cbi-button-neutral\",e(g)?\"cbi-button-neutral\":\"cbi-button-success\"]),disabled:k.value,onClick:v},[dt(i(e(n)(\"\\u5F53\\u524D IPv4 \\u4E0A\\u6E38\\u4FE1\\u606F\\uFF08\\u70B9\\u6B64\\u5237\\u65B0\\uFF09\"))+\" \",1),t(\"p\",jx,[t(\"ul\",null,[t(\"li\",null,i(e(n)(\"IP \\u5730\\u5740: \"))+i((x=m.value)==null?void 0:x.ipv4addr),1),t(\"li\",null,i(e(n)(\"\\u5B50\\u7F51\\u63A9\\u7801: \"))+i(((C=m.value)==null?void 0:C.ipv4mask)&&e(Lt).prefixToMask(m.value.ipv4mask)),1),t(\"li\",null,i(e(n)(\"\\u7F51\\u5173\\u5730\\u5740: \"))+i((S=m.value)==null?void 0:S.gateway),1),t(\"li\",null,i(e(n)(\"DNS\\u670D\\u52A1\\u5668: \"))+i(((A=m.value)==null?void 0:A.dnsList)&&m.value.dnsList[0]||(e(g)?\"\":e(n)(\"\\uFF08\\u65E0DNS\\u670D\\u52A1\\u5668\\uFF0C\\u8BF7\\u4E4B\\u540E\\u81EA\\u884C\\u586B\\u5199\\u516C\\u5171DNS\\u670D\\u52A1\\u5668\\uFF0C\\u4F8B\\u5982 223.5.5.5\\uFF09\"))),1)])])],10,Gx),dt(\" \"+i(e(n)(\"2. \\u70B9\\u51FB\\u201C\\u81EA\\u52A8\\u586B\\u5199\\u201D\\uFF0C\\u5C06\\u5207\\u6362\\u5230\\u53C2\\u6570\\u9875\\u5E76\\u81EA\\u52A8\\u586B\\u5199\\u3002\\u6B64\\u65F6\\u4F9D\\u7136\\u53EF\\u4EE5\\u81EA\\u884C\\u8C03\\u6574\\u53C2\\u6570\\u3002\"))+\" \",1),t(\"div\",Ux,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn app-next\",disabled:e(g),onClick:w[9]||(w[9]=z=>b(!0))},i(e(n)(\"\\u81EA\\u52A8\\u586B\\u5199...\"))+i(e(g)?e(n)(\"\\uFF08\\u8BF7\\u5148\\u83B7\\u53D6IPv4\\u4E0A\\u6E38\\u4FE1\\u606F\\uFF09\"):\"\"),9,qx),Y(h,{to:e(u)==\"index\"?\"/\":\"/network\",custom:\"\"},{default:V(({navigate:z})=>[t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:z},i(e(n)(\"\\u8FD4\\u56DE\")),9,Rx)]),_:1},8,[\"to\"])])])):D(\"\",!0)}}});var Hx=N(Wx,[[\"__scopeId\",\"data-v-3d6d1dea\"]]);const Jx={class:\"actioner-container\"},Zx={class:\"actioner-container_header\"},Kx={class:\"actioner-container_body\"},Qx={class:\"label-item\"},Xx={class:\"label-item_key\"},tw={class:\"label-item_value\"},ew=[\"value\"],aw={class:\"label-item_tips\"},ow={class:\"label-item\"},nw={class:\"label-item_key\"},iw={key:0,class:\"label-item_value\"},rw={class:\"msg-warning\"},sw={key:1,class:\"label-item_value\"},dw=[\"value\"],lw={key:1,class:\"msg-warning\"},uw={class:\"label-item_tips\"},cw={class:\"actioner-container_footer\"},pw=[\"disabled\"],fw=[\"disabled\"],mw={key:1,class:\"actioner-container_body setup-loading\"},gw={class:\"actioner-container_body setup-error\"},vw={class:\"actioner-container_footer\"},bw=[\"disabled\"],hw={class:\"actioner-container_body setup-success\"},_w={class:\"body-title\"},xw={class:\"actioner-container_footer\"},ww=I({props:{Close:{type:Function,required:!0},success:{type:Function}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=()=>{n.Close()},d=()=>{n.success&&n.success()},c=E(\"init\"),k=E(\"\"),g=[{name:\"jbod\",title:a(\"JBOD (\\u7EBF\\u6027)\"),info:a(\"\\u81F3\\u5C11\\u9700\\u89812\\u5757\\u786C\\u76D8\\uFF0C\\u5C06\\u591A\\u4E2A\\u786C\\u76D8\\u5408\\u5E76\\u4E3A\\u5355\\u4E2A\\u5B58\\u50A8\\u7A7A\\u95F4\\uFF0C\\u5176\\u5BB9\\u91CF\\u7B49\\u4E8E\\u6240\\u6709\\u786C\\u76D8\\u5BB9\\u91CF\\u7684\\u603B\\u548C\\u3002\\u4E0D\\u63D0\\u4F9B\\u6570\\u636E\\u5197\\u4F59\\u3002\"),select:2},{name:\"raid0\",title:a(\"RAID 0 (\\u6761\\u5E26)\"),info:a(\"\\u81F3\\u5C11\\u9700\\u89812\\u5757\\u786C\\u76D8\\uFF0C\\u201C\\u533A\\u5757\\u5EF6\\u5C55\\u201D\\u529F\\u80FD\\u662F\\u5C06\\u6570\\u636E\\u5206\\u6210\\u591A\\u4E2A\\u5757\\uFF0C\\u5E76\\u5C06\\u6570\\u636E\\u5757\\u5206\\u6563\\u5230\\u7EC4\\u6210\\u7684\\u591A\\u4E2A\\u786C\\u76D8\\u4E0A\\u4EE5\\u63D0\\u9AD8\\u6027\\u80FD\\u7684\\u8FC7\\u7A0B\\u3002\\u4E0D\\u63D0\\u4F9B\\u6570\\u636E\\u5197\\u4F59\\u3002\"),select:2},{name:\"raid1\",title:a(\"RAID 1 (\\u955C\\u50CF)\"),info:a(\"\\u81F3\\u5C11\\u9700\\u89812\\u5757\\u786C\\u76D8\\uFF0C\\u540C\\u65F6\\u5411\\u6240\\u6709\\u786C\\u76D8\\u5199\\u5165\\u76F8\\u540C\\u7684\\u6570\\u636E\\u3002\\u63D0\\u4F9B\\u6570\\u636E\\u5197\\u4F59\\u3002\"),select:2},{name:\"raid5\",title:\"RAID 5 \",info:a(\"\\u81F3\\u5C11\\u9700\\u89813\\u5757\\u786C\\u76D8\\uFF0C\\u6267\\u884C\\u6BB5\\u843D\\u5206\\u5757\\u5EF6\\u5C55\\uFF0C\\u5E76\\u5BF9\\u5206\\u5E03\\u5230\\u6240\\u6709\\u7EC4\\u6210\\u786C\\u76D8\\u4E0A\\u7684\\u6570\\u636E\\u6267\\u884C\\u5947\\u5076\\u6821\\u9A8C\\uFF0C\\u4ECE\\u800C\\u63D0\\u4F9B\\u6BD4 RAID 1 \\u66F4\\u6709\\u6548\\u7684\\u6570\\u636E\\u5197\\u4F59\\u3002\"),select:3},{name:\"raid6\",title:\"RAID 6 \",info:a(\"\\u81F3\\u5C11\\u9700\\u89814\\u5757\\u786C\\u76D8\\uFF0C\\u6267\\u884C\\u4E24\\u4E2A\\u5C42\\u7EA7\\u7684\\u6570\\u636E\\u5947\\u5076\\u6821\\u9A8C\\u4EE5\\u5B58\\u50A8\\u7B49\\u4E8E 2 \\u4E2A\\u786C\\u76D8\\u5BB9\\u91CF\\u7684\\u5197\\u4F59\\u6570\\u636E\\uFF0C\\u63D0\\u4F9B\\u6BD4 RAID 5 \\u66F4\\u5927\\u7A0B\\u5EA6\\u7684\\u6570\\u636E\\u5197\\u4F59\\u3002\"),select:4},{name:\"raid10\",title:\"RAID 10\",info:a(\"\\u81F3\\u5C11\\u9700\\u89814\\u5757\\u786C\\u76D8\\uFF0C\\u63D0\\u4F9B RAID 0 \\u7684\\u6027\\u80FD\\u548C RAID 1 \\u7684\\u6570\\u636E\\u4FDD\\u62A4\\u7EA7\\u522B\\uFF0C\\u5C06\\u786C\\u76D8\\u7EC4\\u5408\\u8FDB\\u955C\\u50CF\\u6570\\u636E\\u7684\\u7531\\u4E24\\u4E2A\\u786C\\u76D8\\u7EC4\\u6210\\u7684\\u7EC4\\u3002\"),select:4}],p=E(\"raid5\"),m=E([]),v=h=>{let _=\"\";return g.forEach(x=>{x.name===h&&(_=x.info)}),_},b=E(!1),y=gt({loading:!1,members:[]}),f=h=>{};(()=>L(this,null,function*(){y.loading=!0;try{const h=yield G.Raid.CreateList.GET();if(h!=null&&h.data){const{success:_,error:x,result:C}=h.data;if(C&&(y.members=C.members||[]),x)throw x}}catch(h){console.log(h)}finally{y.loading=!1}}))();const w=()=>L(this,null,function*(){const h=g.filter(x=>x.name===p.value)[0],_=m.value;if(!h){$.Warning(a(\"\\u8BF7\\u9009\\u62E9raid\\u7C7B\\u578B\"));return}if(_.length==0){$.Warning(a(\"\\u8BF7\\u9009\\u62E9\\u78C1\\u76D8\"));return}if(h.select>_.length){$.Warning(a(\"\\u8BF7\\u9009\\u62E9\\u81F3\\u5C11%{min}\\u5757\\u78C1\\u76D8\",{min:\"\"+h.select}));return}if(!!confirm(a(\"\\u662F\\u5426\\u7ACB\\u5373\\u521B\\u5EFA %{name}\\uFF1F\\u9009\\u62E9\\u7684\\u786C\\u76D8\\u6240\\u6709\\u5206\\u533A\\u5C06\\u4F1A\\u88AB\\u6E05\\u9664\\uFF0C\\u6B64\\u64CD\\u4F5C\\u53EF\\u80FD\\u4F1A\\u5BFC\\u81F4\\u786C\\u76D8\\u6570\\u636E\\u4E22\\u5931\\uFF0C\\u8BF7\\u8C28\\u614E\\u64CD\\u4F5C\\u3002\",{name:h.name}))&&!!confirm(a(\"\\u786E\\u5B9A\\u521B\\u5EFA %{name}\\uFF1F\\u8BE5\\u64CD\\u4F5C\\u4E0D\\u53EF\\u9006,\\u8BF7\\u8C28\\u614E\\u64CD\\u4F5C\",{name:h.name}))){b.value=!0,c.value=\"loading\";try{const x=yield G.Raid.Create.POST({level:h.name,devicePaths:_});if(x.data){const{success:C,error:S,result:A}=x.data;if(S)throw S;(C||0)==0&&(c.value=\"success\",d())}}catch(x){k.value=x,c.value=\"error\"}finally{b.value=!1}}});return(h,_)=>{const x=_t(\"icon-loading\"),C=_t(\"icon-error\"),S=_t(\"icon-success\");return r(),s(\"div\",Jx,[t(\"div\",Zx,[t(\"span\",null,i(e(a)(\"RAID\\u521B\\u5EFA\\u5411\\u5BFC\")),1)]),c.value==\"init\"?(r(),s(U,{key:0},[t(\"div\",Kx,[t(\"p\",null,i(e(a)(\"RAID\\u78C1\\u76D8\\u9635\\u5217\\u662F\\u7528\\u591A\\u4E2A\\u72EC\\u7ACB\\u7684\\u78C1\\u76D8\\u7EC4\\u6210\\u5728\\u4E00\\u8D77\\u5F62\\u6210\\u4E00\\u4E2A\\u5927\\u7684\\u78C1\\u76D8\\u7CFB\\u7EDF\\uFF0C\\u4ECE\\u800C\\u5B9E\\u73B0\\u6BD4\\u5355\\u5757\\u78C1\\u76D8\\u66F4\\u597D\\u7684\\u5B58\\u50A8\\u6027\\u80FD\\u548C\\u66F4\\u9AD8\\u7684\\u53EF\\u9760\\u6027\\u3002\")),1),t(\"div\",Qx,[t(\"div\",Xx,[t(\"span\",null,i(e(a)(\"RAID\\u7EA7\\u522B\\uFF1A\")),1)]),t(\"div\",tw,[O(t(\"select\",{\"onUpdate:modelValue\":_[0]||(_[0]=A=>p.value=A),onChange:f},[(r(),s(U,null,tt(g,A=>t(\"option\",{value:A.name},i(A.title),9,ew)),64))],544),[[pt,p.value]])]),t(\"div\",aw,[Y(It),dt(\" \"+i(v(p.value)),1)])]),t(\"div\",ow,[t(\"div\",nw,[t(\"span\",null,i(e(a)(\"\\u78C1\\u76D8\\u9635\\u5217\\u6210\\u5458\\uFF1A\")),1)]),e(y).loading?(r(),s(\"div\",iw,[t(\"span\",rw,i(e(a)(\"\\u68C0\\u6D4B\\u4E2D...\")),1)])):(r(),s(\"div\",sw,[e(y).members.length>0?(r(!0),s(U,{key:0},tt(e(y).members,A=>(r(),s(\"label\",null,[O(t(\"input\",{type:\"checkbox\",\"onUpdate:modelValue\":_[1]||(_[1]=z=>m.value=z),value:A.path},null,8,dw),[[Rt,m.value]]),dt(\" \\u3010\"+i(A.model)+\"\\u3011\"+i(A.name)+\" \"+i(A.path)+\" [\"+i(A.sizeStr)+\"] \",1)]))),256)):(r(),s(\"span\",lw,i(e(a)(\"\\u68C0\\u6D4B\\u4E0D\\u5230\\u53EF\\u7528\\u78C1\\u76D8\\u9635\\u5217\\u6210\\u5458\")),1))])),t(\"div\",uw,[Y(It),dt(\" \"+i(e(a)(\"\\u9009\\u62E9\\u5C06\\u8981\\u7528\\u4E8E\\u521B\\u5EFA RAID \\u7684\\u786C\\u76D8\\uFF0C\\u901A\\u8FC7 USB \\u63A5\\u5165\\u7684\\u8BBE\\u5907\\u4E0D\\u4F1A\\u5728\\u5217\\u8868\\u4E2D\\u663E\\u793A\\uFF08USB\\u63A5\\u5165\\u4E0D\\u7A33\\u5B9A\\uFF09\\u3002\")),1)])])]),t(\"div\",cw,[t(\"div\",{class:\"close\",onClick:u,disabled:b.value},i(e(a)(\"\\u53D6\\u6D88\")),9,pw),t(\"div\",{class:\"next\",onClick:w,disabled:b.value},i(e(a)(\"\\u521B\\u5EFA\")),9,fw)])],64)):c.value==\"loading\"?(r(),s(\"div\",mw,[Y(x,{size:60,color:\"#666\"}),t(\"span\",null,i(e(a)(\"\\u6B63\\u5728\\u521B\\u5EFA\\u4E2D...\")),1)])):c.value==\"error\"?(r(),s(U,{key:2},[t(\"div\",gw,[Y(C),t(\"span\",null,i(k.value),1)]),t(\"div\",vw,[t(\"div\",{class:\"close\",onClick:u},i(e(a)(\"\\u5173\\u95ED\")),1),t(\"div\",{class:\"next\",onClick:w,disabled:b.value},i(e(a)(\"\\u91CD\\u65B0\\u521B\\u5EFA\")),9,bw)])],64)):c.value==\"success\"?(r(),s(U,{key:3},[t(\"div\",hw,[Y(S),t(\"div\",_w,i(e(a)(\"\\u521B\\u5EFA\\u6210\\u529F\")),1)]),t(\"div\",xw,[t(\"div\",{class:\"close\",onClick:u},i(e(a)(\"\\u5173\\u95ED\")),1)])],64)):D(\"\",!0)])}}});var kw=N(ww,[[\"__scopeId\",\"data-v-7cf2dd18\"]]);const yw={class:\"actioner-container\"},Fw={class:\"actioner-container_body\"},Ew=[\"value\"],$w={class:\"actioner-container_footer\"},Cw=I({props:{Close:{type:Function,required:!0},raid:{type:Object,required:!0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=()=>{n.Close()},d=E(\"\");return(()=>{G.Raid.Detail.POST({path:n.raid.path}).then(k=>{if(k.data){const{result:g,error:p}=k.data;p?d.value=p:d.value=(g==null?void 0:g.detail)||\"\"}}).catch(k=>{d.value=k.message})})(),(k,g)=>(r(),s(\"div\",yw,[t(\"div\",Fw,[t(\"textarea\",{value:d.value},null,8,Ew)]),t(\"div\",$w,[t(\"div\",{class:\"close\",onClick:u},i(e(a)(\"\\u5173\\u95ED\")),1)])]))}});var Dw=N(Cw,[[\"__scopeId\",\"data-v-0ef06e27\"]]);const Bw={class:\"actioner-container\"},Yw={class:\"actioner-container_header\"},Aw={class:\"actioner-container_body\"},Sw={class:\"label-item\"},zw={class:\"label-item_key\"},Pw={class:\"label-item_value\"},Tw={disabled:\"\"},Iw={class:\"label-item\"},Mw={class:\"label-item_key\"},Lw={key:0,class:\"label-item_value\"},Ow={class:\"msg-warning\"},Nw={key:1,class:\"label-item_value\"},Vw=[\"value\"],Gw={key:1,class:\"msg-warning\"},jw={class:\"actioner-container_footer\"},Uw=[\"disabled\"],qw=[\"disabled\"],Rw=I({props:{Close:{type:Function,required:!0},raid:{type:Object,required:!0},success:{type:Function}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=()=>{n.Close()},d=()=>{n.success&&n.success()},c=()=>L(this,null,function*(){const v=p.value;if(v==\"\"){$.Warning(a(\"\\u8BF7\\u9009\\u62E9\\u8981\\u6DFB\\u52A0\\u7684\\u786C\\u76D8\"));return}g.value=!0;const b=$.Loading(a(\"\\u4FDD\\u5B58\\u4E2D...\"));try{const y=yield G.Raid.Add.POST({path:n.raid.path,memberPath:v});if(y.data){const{error:f,success:F}=y.data;if(f)throw f;(F||0)==0&&($.Success(a(\"\\u4FDD\\u5B58\\u6210\\u529F\")),d(),u())}}catch(y){$.Error(`${y}`)}finally{g.value=!1,b.Close()}}),k=gt({loading:!1,members:[]}),g=E(!1),p=E(\"\");return(()=>L(this,null,function*(){k.loading=!0,g.value=!0;try{const v=yield G.Raid.CreateList.GET();if(v!=null&&v.data){const{success:b,error:y,result:f}=v.data;if(f&&(k.members=f.members||[]),y)throw y}}catch(v){console.log(v)}finally{g.value=!1,k.loading=!1}}))(),(v,b)=>(r(),s(\"div\",Bw,[t(\"div\",Yw,[t(\"span\",null,\"RAID - \"+i(o.raid.name)+\" \"+i(e(a)(\"\\u4FEE\\u6539\")),1)]),t(\"div\",Aw,[t(\"div\",Sw,[t(\"div\",zw,i(e(a)(\"\\u8BBE\\u5907\")),1),t(\"div\",Pw,[t(\"select\",Tw,[t(\"option\",null,i(o.raid.name)+\"_\"+i(o.raid.venderModel)+\" (\"+i(o.raid.path)+\"\\uFF0C\"+i(o.raid.level)+\"\\uFF0C\"+i(o.raid.size)+\") \",1)])])]),t(\"div\",Iw,[t(\"div\",Mw,i(e(a)(\"\\u9009\\u62E9\\u786C\\u76D8\\uFF08\\u9009\\u62E9\\u88AB\\u6DFB\\u52A0\\u5230RAID\\u7684\\u786C\\u76D8\\uFF09\\uFF1A\")),1),e(k).loading?(r(),s(\"div\",Lw,[t(\"span\",Ow,i(e(a)(\"\\u68C0\\u6D4B\\u4E2D...\")),1)])):(r(),s(\"div\",Nw,[e(k).members.length>0?(r(!0),s(U,{key:0},tt(e(k).members,y=>(r(),s(\"label\",null,[O(t(\"input\",{type:\"radio\",\"onUpdate:modelValue\":b[0]||(b[0]=f=>p.value=f),value:y.path},null,8,Vw),[[Bt,p.value]]),dt(\" \\u3010\"+i(y.model)+\"\\u3011\"+i(y.name)+\" \"+i(y.path)+\" [\"+i(y.sizeStr)+\"] \",1)]))),256)):(r(),s(\"span\",Gw,i(e(a)(\"\\u68C0\\u6D4B\\u4E0D\\u5230\\u53EF\\u7528\\u78C1\\u76D8\\u9635\\u5217\\u6210\\u5458\")),1))]))])]),t(\"div\",jw,[t(\"div\",{class:\"close\",onClick:u,disabled:g.value},i(e(a)(\"\\u53D6\\u6D88\")),9,Uw),t(\"div\",{class:\"next\",onClick:c,disabled:g.value},i(e(a)(\"\\u4FDD\\u5B58\")),9,qw)])]))}});var Ww=N(Rw,[[\"__scopeId\",\"data-v-593445fb\"]]);const Hw={class:\"actioner-container\"},Jw={class:\"actioner-container_header\"},Zw={class:\"actioner-container_body\"},Kw={class:\"label-item\"},Qw={class:\"label-item_key\"},Xw={class:\"label-item_value\"},tk={disabled:\"\"},ek={class:\"label-item\"},ak={class:\"label-item_key\"},ok={class:\"label-item_value\"},nk=[\"value\"],ik={class:\"actioner-container_footer\"},rk=[\"disabled\"],sk=[\"disabled\"],dk=I({props:{Close:{type:Function,required:!0},raid:{type:Object,required:!0},success:{type:Function}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=()=>{n.Close()},d=()=>{n.success&&n.success()},c=()=>L(this,null,function*(){const p=g.value;if(p==\"\"){$.Warning(a(\"\\u8BF7\\u9009\\u62E9\\u8981\\u5220\\u9664\\u7684\\u786C\\u76D8\"));return}k.value=!0;const m=$.Loading(a(\"\\u4FDD\\u5B58\\u4E2D...\"));try{const v=yield G.Raid.Remove.POST({path:n.raid.path,memberPath:p});if(v.data){const{error:b,success:y}=v.data;if(b)throw b;(y||0)==0&&($.Success(a(\"\\u4FDD\\u5B58\\u6210\\u529F\")),d(),u())}}catch(v){$.Error(`${v}`)}finally{k.value=!1,m.Close()}}),k=E(!1),g=E(\"\");return(p,m)=>(r(),s(\"div\",Hw,[t(\"div\",Jw,[t(\"span\",null,\"RAID - \"+i(o.raid.name)+\" \"+i(e(a)(\"\\u79FB\\u9664\")),1)]),t(\"div\",Zw,[t(\"div\",Kw,[t(\"div\",Qw,i(e(a)(\"\\u8BBE\\u5907\")),1),t(\"div\",Xw,[t(\"select\",tk,[t(\"option\",null,i(o.raid.name)+\"_\"+i(o.raid.venderModel)+\" (\"+i(o.raid.path)+\"\\uFF0C\"+i(o.raid.level)+\"\\uFF0C\"+i(o.raid.size)+\") \",1)])])]),t(\"div\",ek,[t(\"div\",ak,i(e(a)(\"\\u9009\\u62E9\\u786C\\u76D8\\uFF08\\u9009\\u62E9\\u8981\\u4ECERAID\\u9635\\u5217\\u4E2D\\u5220\\u9664\\u7684\\u786C\\u76D8\\uFF09\\uFF1A\")),1),t(\"div\",ok,[(r(!0),s(U,null,tt(o.raid.members,v=>(r(),s(\"label\",null,[O(t(\"input\",{type:\"radio\",\"onUpdate:modelValue\":m[0]||(m[0]=b=>g.value=b),value:v},null,8,nk),[[Bt,g.value]]),dt(\" \"+i(v),1)]))),256))])])]),t(\"div\",ik,[t(\"div\",{class:\"close\",onClick:u,disabled:k.value},i(e(a)(\"\\u53D6\\u6D88\")),9,rk),t(\"div\",{class:\"next\",onClick:c,disabled:k.value},i(e(a)(\"\\u4FDD\\u5B58\")),9,sk)])]))}});var lk=N(dk,[[\"__scopeId\",\"data-v-77aa4121\"]]);const uk={class:\"actioner-container\"},ck={class:\"actioner-container_header\"},pk={class:\"actioner-container_body\"},fk={class:\"label-item\"},mk={class:\"label-item_key\"},gk={class:\"label-item_value\"},vk={disabled:\"\"},bk={class:\"label-item\"},hk={class:\"label-item_key\"},_k={key:0,class:\"label-item_value\"},xk={class:\"msg-warning\"},wk={key:1,class:\"label-item_value\"},kk=[\"value\"],yk={key:1,class:\"msg-warning\"},Fk={class:\"actioner-container_footer\"},Ek=[\"disabled\"],$k=[\"disabled\"],Ck=I({props:{Close:{type:Function,required:!0},raid:{type:Object,required:!0},success:{type:Function}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=()=>{n.Close()},d=()=>{n.success&&n.success()},c=()=>L(this,null,function*(){const v=p.value;if(v==\"\"){$.Warning(a(\"\\u8BF7\\u9009\\u62E9\\u8981\\u6DFB\\u52A0\\u7684\\u786C\\u76D8\"));return}g.value=!0;const b=$.Loading(a(\"\\u4FDD\\u5B58\\u4E2D...\"));try{const y=yield G.Raid.Recover.POST({path:n.raid.path,memberPath:v});if(y.data){const{error:f,success:F}=y.data;if(f)throw f;(F||0)==0&&($.Success(a(\"\\u4FDD\\u5B58\\u6210\\u529F\")),d(),u())}}catch(y){$.Error(`${y}`)}finally{g.value=!1,b.Close()}}),k=gt({loading:!1,members:[]}),g=E(!1),p=E(\"\");return(()=>L(this,null,function*(){k.loading=!0,g.value=!0;try{const v=yield G.Raid.CreateList.GET();if(v!=null&&v.data){const{success:b,error:y,result:f}=v.data;if(f&&(k.members=f.members||[]),y)throw y}}catch(v){console.log(v)}finally{g.value=!1,k.loading=!1}}))(),(v,b)=>(r(),s(\"div\",uk,[t(\"div\",ck,[t(\"span\",null,\"RAID - \"+i(o.raid.name)+\" \"+i(e(a)(\"\\u6062\\u590D\")),1)]),t(\"div\",pk,[t(\"div\",fk,[t(\"div\",mk,i(e(a)(\"\\u8BBE\\u5907\")),1),t(\"div\",gk,[t(\"select\",vk,[t(\"option\",null,i(o.raid.name)+\"_\"+i(o.raid.venderModel)+\" (\"+i(o.raid.path)+\"\\uFF0C\"+i(o.raid.level)+\"\\uFF0C\"+i(o.raid.size)+\") \",1)])])]),t(\"div\",bk,[t(\"div\",hk,i(e(a)(\"\\u9009\\u62E9\\u786C\\u76D8\\uFF08\\u9009\\u62E9\\u7A7A\\u95F2\\u7684\\u786C\\u76D8\\u6062\\u590DRAID\\u8BBE\\u5907\\uFF09\\uFF1A\")),1),e(k).loading?(r(),s(\"div\",_k,[t(\"span\",xk,i(e(a)(\"\\u68C0\\u6D4B\\u4E2D...\")),1)])):(r(),s(\"div\",wk,[e(k).members.length>0?(r(!0),s(U,{key:0},tt(e(k).members,y=>(r(),s(\"label\",null,[O(t(\"input\",{type:\"radio\",\"onUpdate:modelValue\":b[0]||(b[0]=f=>p.value=f),value:y.path},null,8,kk),[[Bt,p.value]]),dt(\" \\u3010\"+i(y.model)+\"\\u3011\"+i(y.name)+\" \"+i(y.path)+\" [\"+i(y.sizeStr)+\"] \",1)]))),256)):(r(),s(\"span\",yk,i(e(a)(\"\\u68C0\\u6D4B\\u4E0D\\u5230\\u53EF\\u7528\\u78C1\\u76D8\\u9635\\u5217\\u6210\\u5458\")),1))]))])]),t(\"div\",Fk,[t(\"div\",{class:\"close\",onClick:u,disabled:g.value},i(e(a)(\"\\u53D6\\u6D88\")),9,Ek),t(\"div\",{class:\"next\",onClick:c,disabled:g.value},i(e(a)(\"\\u4FDD\\u5B58\")),9,$k)])]))}});var Dk=N(Ck,[[\"__scopeId\",\"data-v-a924400c\"]]);const Bk={class:\"action-main\"},Yk=I({props:{Close:{type:Function,required:!0},setup:{type:String,default:\"create\"},raid:{type:Object},success:{type:Function}},setup(o){return(n,a)=>(r(),Z(wt,{type:2},{default:V(()=>[t(\"div\",Bk,[o.setup==\"create\"?(r(),Z(kw,{key:0,Close:o.Close},null,8,[\"Close\"])):o.setup==\"info\"&&o.raid!=null?(r(),Z(Dw,{key:1,Close:o.Close,raid:o.raid,success:o.success},null,8,[\"Close\",\"raid\",\"success\"])):o.setup==\"edit\"&&o.raid!=null?(r(),Z(Ww,{key:2,Close:o.Close,raid:o.raid,success:o.success},null,8,[\"Close\",\"raid\",\"success\"])):o.setup==\"remove\"&&o.raid!=null?(r(),Z(lk,{key:3,Close:o.Close,raid:o.raid,success:o.success},null,8,[\"Close\",\"raid\",\"success\"])):o.setup==\"recover\"&&o.raid!=null?(r(),Z(Dk,{key:4,Close:o.Close,raid:o.raid,success:o.success},null,8,[\"Close\",\"raid\",\"success\"])):D(\"\",!0)])]),_:1}))}});var Ak=N(Yk,[[\"__scopeId\",\"data-v-6ef94d02\"]]);const he=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=xt(Ak,vt(st({},o),{Close:()=>{l()}}));a.use(Ra),a.mount(n);const l=()=>{a.unmount(),n.remove()};return{Close:l}},so=o=>(ut(\"data-v-30707fb2\"),o=o(),ct(),o),Sk={id:\"page\"},zk={name:\"content\"},Pk={class:\"cbi-map-descr\"},Tk={style:{color:\"#f5365b\",\"margin-top\":\"10px\"}},Ik={style:{color:\"#f5365b\",\"margin-top\":\"10px\"}},Mk={class:\"btns\"},Lk=[\"disabled\"],Ok={class:\"cbi-section cbi-tblsection\",id:\"cbi-nfs-mount\"},Nk={class:\"table cbi-section-table\"},Vk={style:{}},Gk={class:\"tr cbi-section-table-titles anonymous\"},jk={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},Uk={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},qk={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},Rk={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},Wk={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},Hk={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},Jk={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},Zk={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},Kk={class:\"tr cbi-section-table-row\"},Qk={class:\"td cbi-value-field\"},Xk={class:\"td cbi-value-field\"},ty=[\"title\"],ey={class:\"item-status\"},ay={key:0,class:\"item-status item-status-detail\"},oy={class:\"td cbi-value-field\"},ny={class:\"td cbi-value-field\"},iy={class:\"td cbi-value-field\"},ry=so(()=>t(\"br\",null,null,-1)),sy={class:\"td cbi-value-field\"},dy=so(()=>t(\"br\",null,null,-1)),ly={key:1,href:\"/cgi-bin/luci/admin/quickstart/\"},uy={class:\"td cbi-section-table-cell nowrap cbi-section-actions\"},cy=[\"title\",\"disabled\",\"onClick\"],py=[\"title\",\"disabled\",\"onClick\"],fy=[\"title\",\"onClick\"],my=[\"title\",\"onClick\"],gy=[\"title\",\"onClick\"],vy=I({setup(o){const{$gettext:n,$ngettext:a}=J(),l=gt({disksList:[]}),u=()=>L(this,null,function*(){try{const w=yield G.Raid.List.GET();if(w!=null&&w.data){const{success:h,error:_,result:x}=w.data;if(x&&(l.disksList=x.disks||[]),_)throw _}}catch(w){console.log(w)}}),d=Mt.easyInterval(u,5e3);ke(()=>{d()});const c=w=>{switch(w.level){case\"raid0\":case\"jbod\":return!0}return w.status.indexOf(\"degraded\")!=-1||w.status.indexOf(\"resyncing(\")!=-1},k=w=>{let h=[];return w.childrens&&w.childrens.forEach(_=>{_.mountPoint&&h.push(`${_.name}(${_.mountPoint})`)}),h},g=()=>L(this,null,function*(){he({setup:\"create\",success:()=>{u()}})}),p=w=>{he({setup:\"info\",raid:w})},m=w=>L(this,null,function*(){if(w.childrens&&w.childrens.length>0&&w.childrens.filter(x=>x.mountPoint).length>0){Se({content:n(\"\\u5220\\u9664 RAID \\u8BBE\\u5907\\u4E4B\\u524D\\u8BF7\\u5148\\u5378\\u8F7D\\u6587\\u4EF6\\u7CFB\\u7EDF\"),nextTitle:n(\"\\u53BB\\u5378\\u8F7D\"),next:()=>{location.href=\"/cgi-bin/luci/admin/system/mounts\"},clearTitle:n(\"\\u53D6\\u6D88\"),clear:()=>{}});return}if(!confirm(n(\"\\u786E\\u5B9A\\u8981\\u5220\\u9664 %{name} \\u8BE5\\u78C1\\u76D8\\u9635\\u5217\\u5417\\uFF1F\\u5220\\u9664\\u64CD\\u4F5C\\u53EF\\u80FD\\u4F1A\\u5BFC\\u81F4\\u6570\\u636E\\u4E22\\u5931\\uFF0C\\u8BF7\\u8C28\\u614E\\u64CD\\u4F5C\\u3002\\u5220\\u9664\\u6210\\u529F\\u540E\\uFF0C\\u5982\\u9700\\u53E6\\u5916\\u7EC4RAID\\uFF0C\\u5EFA\\u8BAE\\u7A0D\\u7B49\\u51E0\\u5206\\u949F\\u540E\\u518D\\u8BD5\\u3002\",{name:w.name}))||!confirm(n(\"\\u786E\\u5B9A\\u8981\\u5220\\u9664 %{name} \\u5417?\",{name:w.name})))return;const h=$.Loading(n(\"\\u5220\\u9664\\u4E2D...\"));try{const _=yield G.Raid.Delete.POST({path:w.path,members:w.members});if(_.data){const{success:x,error:C}=_.data;if(C)throw C;(x||0)==0&&($.Success(n(\"\\u5220\\u9664\\u6210\\u529F\")),u())}}catch(_){$.Error(`${_}`)}finally{h.Close()}}),v=w=>{he({setup:\"edit\",raid:w,success:()=>{u()}})},b=w=>{he({setup:\"remove\",raid:w,success:()=>{u()}})},y=w=>{he({setup:\"recover\",raid:w,success:()=>{u()}})},f=E(!1),F=()=>{Se({content:n(\"\\u5C06\\u626B\\u63CF\\u78C1\\u76D8\\u91CC RAID \\u7684\\u78C1\\u76D8\\u9635\\u5217\\u914D\\u7F6E\\u5E76\\u6062\\u590D\\uFF0C\\u786E\\u5B9A\\u8981\\u6062\\u590D RAID \\u78C1\\u76D8\\u9635\\u5217\\u5417\\uFF1F\"),nextTitle:n(\"\\u786E\\u5B9A\"),next:()=>L(this,null,function*(){f.value=!0;const w=$.Loading(n(\"\\u626B\\u63CF\\u4E2D...\"));try{const h=yield G.Raid.Autofix.POST();if(h.data){const{error:_,success:x}=h.data;if(_)throw _;(x||0)==0&&($.Success(n(\"\\u6062\\u590D\\u5B8C\\u6210\")),u())}}catch(h){$.Error(`${h}`)}finally{w.Close(),f.value=!1}}),clearTitle:n(\"\\u53D6\\u6D88\"),clear:()=>{}})};return(w,h)=>(r(),s(\"div\",Sk,[t(\"h2\",zk,i(e(n)(\"RAID\\u7BA1\\u7406\")),1),t(\"div\",Pk,[t(\"p\",null,i(e(n)(\"RAID \\uFF08 Redundant Array of Independent Disks \\uFF09\\u5373\\u72EC\\u7ACB\\u78C1\\u76D8\\u5197\\u4F59\\u9635\\u5217\\uFF0C\\u7B80\\u79F0\\u4E3A\\u300C\\u78C1\\u76D8\\u9635\\u5217\\u300D\\uFF0C\\u5C31\\u662F\\u7528\\u591A\\u4E2A\\u72EC\\u7ACB\\u7684\\u78C1\\u76D8\\u7EC4\\u6210\\u5728\\u4E00\\u8D77\\u5F62\\u6210\\u4E00\\u4E2A\\u5927\\u7684\\u78C1\\u76D8\\u7CFB\\u7EDF\\uFF0C\\u4ECE\\u800C\\u5B9E\\u73B0\\u6BD4\\u5355\\u5757\\u78C1\\u76D8\\u66F4\\u597D\\u7684\\u5B58\\u50A8\\u6027\\u80FD\\u548C\\u66F4\\u9AD8\\u7684\\u53EF\\u9760\\u6027\\u3002\")),1),t(\"p\",Tk,\" * \"+i(e(n)(\"RAID\\u529F\\u80FD\\u6B63\\u5728\\u516C\\u6D4B\\u4E2D\\uFF0C\\u4F7F\\u7528\\u8FC7\\u7A0B\\u4E2D\\u5982\\u9020\\u6210\\u6570\\u636E\\u4E22\\u5931\\u7B49\\u95EE\\u9898\\uFF0C\\u6982\\u4E0D\\u8D1F\\u8D23\\uFF0C\\u8BF7\\u8C28\\u614E\\u4F7F\\u7528\\u3002\")),1),t(\"p\",Ik,\" * \"+i(e(n)(\"\\u5982\\u679C\\u7531\\u4E8E\\u7CFB\\u7EDF\\u91CD\\u7F6E\\u6216\\u91CD\\u542F\\u5BFC\\u81F4\\u7684RAID\\u8BBE\\u5907\\u4E22\\u5931\\u53EF\\u4EE5\\u5C1D\\u8BD5\\u901A\\u8FC7\\u4E0B\\u65B9'\\u626B\\u63CF\\u6062\\u590DRAID'\\u6309\\u94AE\\u6062\\u590D\")),1)]),t(\"div\",Mk,[t(\"button\",{class:\"btn cbi-button cbi-button-apply\",onClick:h[0]||(h[0]=_=>g())},i(e(n)(\"\\u521B\\u5EFARAID\")),1),t(\"button\",{class:\"btn cbi-button cbi-button-apply\",onClick:h[1]||(h[1]=_=>F()),disabled:f.value},i(e(n)(\"\\u626B\\u63CF\\u6062\\u590DRAID\")),9,Lk)]),t(\"div\",null,[t(\"div\",Ok,[t(\"table\",Nk,[t(\"tbody\",Vk,[t(\"tr\",Gk,[t(\"th\",jk,i(e(n)(\"\\u540D\\u79F0\")),1),t(\"th\",Uk,i(e(n)(\"\\u8BBE\\u5907\")),1),t(\"th\",qk,i(e(n)(\"\\u72B6\\u6001\")),1),t(\"th\",Rk,i(e(n)(\"\\u7EA7\\u522B\")),1),t(\"th\",Wk,i(e(n)(\"\\u5BB9\\u91CF\")),1),t(\"th\",Hk,i(e(n)(\"\\u6210\\u5458\")),1),t(\"th\",Jk,i(e(n)(\"\\u6302\\u8F7D\\u4FE1\\u606F\")),1),t(\"th\",Zk,i(e(n)(\"\\u64CD\\u4F5C\")),1)]),(r(!0),s(U,null,tt(e(l).disksList,_=>(r(),s(\"tr\",Kk,[t(\"td\",Qk,[t(\"b\",null,i(_.name),1)]),t(\"td\",Xk,[t(\"b\",null,i(_.path),1)]),t(\"td\",{class:\"td cbi-value-field\",title:_.status+(_.rebuildStatus||\"\")},[t(\"b\",ey,i(_.status),1),_.rebuildStatus?(r(),s(\"b\",ay,\" \\u2026 \")):D(\"\",!0)],8,ty),t(\"td\",oy,[t(\"b\",null,i(_.level),1)]),t(\"td\",ny,[t(\"b\",null,i(_.size),1)]),t(\"td\",iy,[(r(!0),s(U,null,tt(_.members,x=>(r(),s(\"b\",null,[dt(i(x)+\" \",1),ry]))),256))]),t(\"td\",sy,[k(_).length>0?(r(!0),s(U,{key:0},tt(k(_),x=>(r(),s(\"b\",null,[dt(i(x)+\" \",1),dy]))),256)):(r(),s(\"a\",ly,i(e(n)(\"\\u53BB\\u6302\\u8F7D\")),1))]),t(\"td\",uy,[t(\"button\",{class:\"btn cbi-button cbi-button-apply\",title:e(n)(\"\\u6269\\u5145\"),disabled:c(_),onClick:x=>v(_)},i(e(n)(\"\\u6269\\u5145\")),9,cy),t(\"button\",{class:\"btn cbi-button cbi-button-apply\",title:e(n)(\"\\u79FB\\u9664\"),disabled:c(_),onClick:x=>b(_)},i(e(n)(\"\\u79FB\\u9664\")),9,py),t(\"button\",{class:\"btn cbi-button cbi-button-apply\",title:e(n)(\"\\u6062\\u590D\"),onClick:x=>y(_)},i(e(n)(\"\\u6062\\u590D\")),9,fy),t(\"button\",{class:\"btn cbi-button cbi-button-apply\",title:e(n)(\"\\u8BE6\\u60C5\"),onClick:x=>p(_)},i(e(n)(\"\\u8BE6\\u60C5\")),9,my),t(\"button\",{class:\"cbi-button cbi-button-remove\",title:e(n)(\"\\u5982\\u679C\\u60A8\\u5728RAID\\u78C1\\u76D8\\u9635\\u5217\\u4E2D\\u521B\\u5EFA\\u4E86\\u6587\\u4EF6\\u7CFB\\u7EDF\\uFF0C\\u5148\\u5378\\u8F7D\\u6587\\u4EF6\\u7CFB\\u7EDF\\uFF0C\\u540E\\u5220\\u9664\\u6587\\u4EF6\\u7CFB\\u7EDF\\u5220\\u9664\\u64CD\\u4F5C\\u53EF\\u80FD\\u4F1A\\u5BFC\\u81F4\\u6570\\u636E\\u4E22\\u5931\\uFF0C\\u8BF7\\u8C28\\u614E\\u64CD\\u4F5C\\u3002\"),onClick:x=>m(_)},i(e(n)(\"\\u5220\\u9664\")),9,gy)])]))),256))])])])])]))}});var by=N(vy,[[\"__scopeId\",\"data-v-30707fb2\"]]);const hy=o=>(ut(\"data-v-16dd0913\"),o=o(),ct(),o),_y={id:\"page\"},xy=hy(()=>t(\"h2\",{name:\"content\"},\"S.M.A.R.T.\",-1)),wy={class:\"cbi-map-descr\"},ky={class:\"tabs\"},yy=[\"href\",\"onClick\"],Fy=I({setup(o){const{$gettext:n,$ngettext:a}=J(),l=[{to:\"/smart\",name:n(\"\\u5E38\\u89C4\\u8BBE\\u7F6E\")},{to:\"/smart/task\",name:n(\"\\u8BA1\\u5212\\u4EFB\\u52A1\")},{to:\"/smart/log\",name:n(\"\\u67E5\\u770B\\u65E5\\u5FD7\")}],u=E(!1),d=gt({global:{enable:!1,powermode:\"never\",tmpDiff:0,tmpMax:0},devices:[],tasks:[]}),c=p=>{const{global:m,devices:v,tasks:b}=p;m&&(d.global.enable=m.enable||!1,d.global.powermode=m.powermode||\"never\"),d.devices=v||[],d.tasks=b||[]};(()=>L(this,null,function*(){try{const p=yield G.Smart.Config.GET();if(p.data){const{result:m}=p.data;m&&c(m)}}catch(p){}finally{u.value=!0}}))();const g=p=>L(this,null,function*(){const m=$.Loading(n(\"\\u4FDD\\u5B58\\u4E2D...\"));try{const v=yield G.Smart.Config.POST(p);if(v.data){console.log(v.data);const{success:b,error:y,result:f}=v.data;if(y)throw y;(b||0)==0&&($.Success(n(\"\\u4FDD\\u5B58\\u6210\\u529F\")),f&&c(f))}}catch(v){$.Error(`${v}`)}finally{m.Close()}});return(p,m)=>{const v=_t(\"router-link\"),b=_t(\"router-view\");return r(),s(\"div\",_y,[xy,t(\"div\",wy,[t(\"p\",null,i(e(n)(\"S.M.A.R.T.\\uFF0C\\u5168\\u79F0\\u4E3A\\u201CSelf-Monitoring Analysis and Reporting Technology\\u201D\\uFF0C\\u5373\\u201C\\u81EA\\u6211\\u76D1\\u6D4B\\u3001\\u5206\\u6790\\u53CA\\u62A5\\u544A\\u6280\\u672F\\u201D\\uFF0C\")),1),t(\"p\",null,i(e(n)(\"\\u662F\\u4E00\\u79CD\\u81EA\\u52A8\\u7684\\u786C\\u76D8\\u72B6\\u6001\\u68C0\\u6D4B\\u4E0E\\u9884\\u8B66\\u7CFB\\u7EDF\\u548C\\u89C4\\u8303\\u3002\\u901A\\u8FC7\\u5728\\u786C\\u76D8\\u786C\\u4EF6\\u5185\\u7684\\u68C0\\u6D4B\\u6307\\u4EE4\\u5BF9\\u786C\\u76D8\\u7684\\u786C\\u4EF6\\u5982\\u78C1\\u5934\\u3001\\u76D8\\u7247\\u3001\\u9A6C\\u8FBE\\u3001\")),1),t(\"p\",null,i(e(n)(\"\\u7535\\u8DEF\\u7684\\u8FD0\\u884C\\u60C5\\u51B5\\u8FDB\\u884C\\u76D1\\u63A7\\u3001\\u8BB0\\u5F55\\u5E76\\u4E0E\\u5382\\u5546\\u6240\\u8BBE\\u5B9A\\u7684\\u9884\\u8BBE\\u5B89\\u5168\\u503C\\u8FDB\\u884C\\u6BD4\\u8F83\\uFF0C\\u82E5\\u76D1\\u63A7\\u60C5\\u51B5\\u5C06\\u8981\\u6216\\u5DF2\\u8D85\\u51FA\\u9884\\u8BBE\\u5B89\\u5168\\u503C\\u7684\\u5B89\\u5168\\u8303\\u56F4\\uFF0C\")),1),t(\"p\",null,i(e(n)(\"\\u5C31\\u53EF\\u4EE5\\u901A\\u8FC7\\u4E3B\\u673A\\u7684\\u76D1\\u63A7\\u786C\\u4EF6\\u6216\\u8F6F\\u4EF6\\u81EA\\u52A8\\u5411\\u7528\\u6237\\u4F5C\\u51FA\\u8B66\\u544A\\u5E76\\u8FDB\\u884C\\u8F7B\\u5FAE\\u7684\\u81EA\\u52A8\\u4FEE\\u590D\\uFF0C\\u4EE5\\u63D0\\u524D\\u4FDD\\u969C\\u786C\\u76D8\\u6570\\u636E\\u7684\\u5B89\\u5168\\u3002\")),1)]),t(\"ul\",ky,[(r(),s(U,null,tt(l,y=>Y(v,{to:y.to,custom:\"\",key:y.to},{default:V(({route:f,href:F,navigate:w,isActive:h,isExactActive:_})=>[t(\"li\",{class:lt({\"active cbi-tab\":h&&_})},[t(\"a\",{href:F,onClick:w},i(y.name),9,yy)],2)]),_:2},1032,[\"to\"])),64))]),u.value?(r(),Z(b,{key:0,name:\"default\"},{default:V(({Component:y,route:f})=>[(r(),Z(Co,null,{default:V(()=>[(r(),Z(oa(y),{key:f.path,config:e(d),saveData:g},null,8,[\"config\"]))]),_:2},1024))]),_:1})):D(\"\",!0)])}}});var Ey=N(Fy,[[\"__scopeId\",\"data-v-16dd0913\"]]);const $y={class:\"action-main\"},Cy=I({setup(o){return(n,a)=>(r(),Z(wt,{type:2},{default:V(()=>[t(\"div\",$y,[Yt(n.$slots,\"default\",{},void 0,!0)])]),_:3}))}});var je=N(Cy,[[\"__scopeId\",\"data-v-742230ae\"]]);const Dy={class:\"actioner-container\"},By={class:\"actioner-container_header\"},Yy={class:\"actioner-container_body\"},Ay={class:\"cbi-value\"},Sy={class:\"cbi-value-title\"},zy={class:\"cbi-value-field\"},Py={class:\"cbi-value-description\"},Ty={class:\"cbi-value\"},Iy={class:\"cbi-value-title\"},My={class:\"cbi-value-field\"},Ly={class:\"cbi-checkbox\"},Oy={value:-1},Ny={value:0},Vy=[\"value\"],Gy={class:\"cbi-value-description\"},jy={class:\"cbi-value\"},Uy={class:\"cbi-value-title\"},qy={class:\"cbi-value-field\"},Ry={class:\"cbi-checkbox\"},Wy={value:-1},Hy={value:0},Jy=[\"value\"],Zy={class:\"cbi-value-description\"},Ky={class:\"actioner-container_footer\"},Qy=[\"disabled\"],Xy=[\"disabled\"],tF=I({props:{close:{type:Function,required:!0},disk:{type:Object,required:!0},device:{type:Object},next:{type:Function,required:!0}},setup(o){var g,p,m;const n=o,{$gettext:a,$ngettext:l}=J();console.log(n.device);const u=E(!1),d=gt({tmpDiff:((g=n.device)==null?void 0:g.tmpDiff)||0,tmpMax:((p=n.device)==null?void 0:p.tmpMax)||0,devicePath:((m=n.device)==null?void 0:m.devicePath)||\"\"}),c=()=>{u.value=!0,n.close()},k=()=>L(this,null,function*(){u.value=!0;try{yield n.next({tmpDiff:d.tmpDiff,tmpMax:d.tmpMax,devicePath:d.devicePath}),u.value=!1,c()}catch(v){}});return(v,b)=>(r(),Z(je,null,{default:V(()=>[t(\"div\",Dy,[t(\"div\",By,[t(\"span\",null,\" S.M.A.R.T. \\xBB \"+i(e(a)(\"\\u8BBE\\u5907\"))+\" \\xBB \"+i(o.disk.path),1)]),t(\"div\",Yy,[t(\"div\",Ay,[t(\"label\",Sy,i(e(a)(\"\\u78C1\\u76D8\")),1),t(\"div\",zy,[t(\"div\",Py,i(o.disk.model)+\" [ \"+i(o.disk.path)+\"\\uFF0C\"+i(o.disk.sizeStr)+\" ] \",1)])]),t(\"div\",Ty,[t(\"label\",Iy,i(e(a)(\"\\u6E29\\u5EA6\\u76D1\\u6D4B\\uFF08\\u5DEE\\u5F02\\uFF09\")),1),t(\"div\",My,[t(\"div\",Ly,[O(t(\"select\",{class:\"cbi-input-select\",\"onUpdate:modelValue\":b[0]||(b[0]=y=>e(d).tmpDiff=y)},[t(\"option\",Oy,i(e(a)(\"\\u4F7F\\u7528\\u5168\\u5C40\\u914D\\u7F6E\")),1),t(\"option\",Ny,i(e(a)(\"\\u7981\\u7528\")),1),(r(),s(U,null,tt(20,y=>t(\"option\",{value:y},i(y)+\"\\xB0C\",9,Vy)),64))],512),[[pt,e(d).tmpDiff,void 0,{number:!0}]])]),t(\"div\",Gy,i(e(a)(\"\\u81EA\\u4E0A\\u6B21\\u62A5\\u544A\\u4EE5\\u6765\\u6E29\\u5EA6\\u53D8\\u5316\\u81F3\\u5C11 N \\u5EA6\\uFF0C\\u5219\\u9700\\u62A5\\u544A.\")),1)])]),t(\"div\",jy,[t(\"label\",Uy,i(e(a)(\"\\u6E29\\u5EA6\\u76D1\\u6D4B\\uFF08\\u6700\\u5927\\uFF09\")),1),t(\"div\",qy,[t(\"div\",Ry,[O(t(\"select\",{class:\"cbi-input-select\",\"onUpdate:modelValue\":b[1]||(b[1]=y=>e(d).tmpMax=y)},[t(\"option\",Wy,i(e(a)(\"\\u4F7F\\u7528\\u5168\\u5C40\\u914D\\u7F6E\")),1),t(\"option\",Hy,i(e(a)(\"\\u7981\\u7528\")),1),(r(),s(U,null,tt(20,y=>t(\"option\",{value:y*5},i(y*5)+\"\\xB0C\",9,Jy)),64))],512),[[pt,e(d).tmpMax,void 0,{number:!0}]])]),t(\"div\",Zy,i(e(a)(\"\\u5982\\u679C\\u6E29\\u5EA6\\u5927\\u4E8E\\u6216\\u7B49\\u4E8E N \\u6444\\u6C0F\\u5EA6\\u5219\\u62A5\\u544A.\")),1)])])]),t(\"div\",Ky,[t(\"button\",{class:\"close\",onClick:c,disabled:u.value},i(e(a)(\"\\u53D6\\u6D88\")),9,Qy),t(\"button\",{class:\"next\",onClick:k,disabled:u.value},i(e(a)(\"\\u4FDD\\u5B58\")),9,Xy)])])]),_:1}))}}),eF={class:\"actioner-container\"},aF={class:\"actioner-container_header\"},oF={class:\"actioner-container_body\"},nF={class:\"cbi-value\"},iF={class:\"cbi-value-title\"},rF={class:\"cbi-value-field\"},sF={class:\"cbi-checkbox\"},dF={value:\"\"},lF=[\"value\"],uF={class:\"cbi-value\"},cF={class:\"cbi-value-title\"},pF={class:\"cbi-value-field\"},fF={class:\"cbi-checkbox\"},mF={value:\"short\"},gF={value:\"long\"},vF={value:\"conveyance\"},bF={value:\"offline\"},hF={class:\"cbi-value\"},_F={class:\"cbi-value-title\"},xF={class:\"cbi-value-field\"},wF={class:\"cbi-checkbox\"},kF=t(\"option\",{value:\"*\"},\"*\",-1),yF=[\"value\"],FF={class:\"cbi-value-description\"},EF={class:\"cbi-value\"},$F={class:\"cbi-value-title\"},CF={class:\"cbi-value-field\"},DF={class:\"cbi-checkbox\"},BF=t(\"option\",{value:\"*\"},\"*\",-1),YF=[\"value\"],AF={class:\"cbi-value-description\"},SF={class:\"cbi-value\"},zF={class:\"cbi-value-title\"},PF={class:\"cbi-value-field\"},TF={class:\"cbi-checkbox\"},IF=t(\"option\",{value:\"*\"},\"*\",-1),MF=[\"value\"],LF={class:\"cbi-value-description\"},OF={class:\"actioner-container_footer\"},NF=[\"disabled\"],VF=[\"disabled\"],GF=I({props:{close:{type:Function,required:!0},config:{type:Object,required:!0},next:{type:Function,required:!0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=E(!1),d=gt({type:\"short\",devicePath:\"\",month:\"*\",dayPerMonth:\"*\",hour:\"*\"}),c=E([]);(()=>L(this,null,function*(){try{const m=yield G.Smart.List.GET();if(m.data){const{result:v,error:b}=m.data;v&&v.disks&&(c.value=v.disks)}}catch(m){}}))();const g=()=>{u.value=!0,n.close()},p=()=>L(this,null,function*(){if(d.devicePath==\"\"){$.Warning(a(\"\\u8BF7\\u9009\\u62E9\\u78C1\\u76D8\"));return}u.value=!0;try{yield n.next(d),g()}catch(m){}finally{u.value=!1}});return(m,v)=>(r(),Z(je,null,{default:V(()=>[t(\"div\",eF,[t(\"div\",aF,[t(\"span\",null,i(e(a)(\"\\u521B\\u5EFA\\u8BA1\\u5212\\u4EFB\\u52A1\")),1)]),t(\"div\",oF,[t(\"div\",nF,[t(\"label\",iF,i(e(a)(\"\\u78C1\\u76D8\")),1),t(\"div\",rF,[t(\"div\",sF,[O(t(\"select\",{class:\"cbi-input-select\",\"onUpdate:modelValue\":v[0]||(v[0]=b=>e(d).devicePath=b)},[t(\"option\",dF,i(e(a)(\"\\u9009\\u62E9\\u78C1\\u76D8\")),1),(r(!0),s(U,null,tt(c.value,b=>(r(),s(\"option\",{value:b.path},i(b.model)+\" [ \"+i(b.path)+\"\\uFF0C\"+i(b.sizeStr)+\" ] \",9,lF))),256))],512),[[pt,e(d).devicePath,void 0,{trim:!0}]])])])]),t(\"div\",uF,[t(\"label\",cF,i(e(a)(\"\\u7C7B\\u578B\")),1),t(\"div\",pF,[t(\"div\",fF,[O(t(\"select\",{class:\"cbi-input-select\",\"onUpdate:modelValue\":v[1]||(v[1]=b=>e(d).type=b)},[t(\"option\",mF,i(e(a)(\"\\u77ED\\u6682\\u81EA\\u68C0\")),1),t(\"option\",gF,i(e(a)(\"\\u957F\\u65F6\\u81EA\\u68C0\")),1),t(\"option\",vF,i(e(a)(\"\\u4F20\\u8F93\\u65F6\\u81EA\\u68C0\")),1),t(\"option\",bF,i(e(a)(\"\\u79BB\\u7EBF\\u65F6\\u81EA\\u68C0\")),1)],512),[[pt,e(d).type,void 0,{trim:!0}]])])])]),t(\"div\",hF,[t(\"label\",_F,i(e(a)(\"\\u5C0F\\u65F6\")),1),t(\"div\",xF,[t(\"div\",wF,[O(t(\"select\",{class:\"cbi-input-select\",\"onUpdate:modelValue\":v[2]||(v[2]=b=>e(d).hour=b)},[kF,(r(),s(U,null,tt(24,(b,y)=>t(\"option\",{value:`${y}`},i(y),9,yF)),64))],512),[[pt,e(d).hour,void 0,{trim:!0}]])]),t(\"div\",FF,i(e(a)(\"* \\u8868\\u793A\\u6BCF\\u5C0F\\u65F6\")),1)])]),t(\"div\",EF,[t(\"label\",$F,i(e(a)(\"\\u5929\")),1),t(\"div\",CF,[t(\"div\",DF,[O(t(\"select\",{class:\"cbi-input-select\",\"onUpdate:modelValue\":v[3]||(v[3]=b=>e(d).dayPerMonth=b)},[BF,(r(),s(U,null,tt(31,b=>t(\"option\",{value:`${b}`},i(b),9,YF)),64))],512),[[pt,e(d).dayPerMonth,void 0,{trim:!0}]])]),t(\"div\",AF,i(e(a)(\"* \\u8868\\u793A\\u6BCF\\u5929\")),1)])]),t(\"div\",SF,[t(\"label\",zF,i(e(a)(\"\\u6708\")),1),t(\"div\",PF,[t(\"div\",TF,[O(t(\"select\",{class:\"cbi-input-select\",\"onUpdate:modelValue\":v[4]||(v[4]=b=>e(d).month=b)},[IF,(r(),s(U,null,tt(12,(b,y)=>t(\"option\",{value:`${b}`},i(b),9,MF)),64))],512),[[pt,e(d).month,void 0,{trim:!0}]])]),t(\"div\",LF,i(e(a)(\"* \\u8868\\u793A\\u6BCF\\u6708\")),1)])])]),t(\"div\",OF,[t(\"button\",{class:\"close\",onClick:g,disabled:u.value},i(e(a)(\"\\u53D6\\u6D88\")),9,NF),t(\"button\",{class:\"next\",onClick:p,disabled:u.value},i(e(a)(\"\\u4FDD\\u5B58\")),9,VF)])])]),_:1}))}}),jF={class:\"actioner-container\"},UF={class:\"actioner-container_header\"},qF={class:\"actioner-container_body\"},RF=[\"value\"],WF={class:\"actioner-container_footer\"},HF=[\"disabled\"],JF=[\"disabled\"],ZF=I({props:{close:{type:Function,required:!0},task:{type:Object,required:!0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=E(!1),d=E(\"\"),c=E(\"\"),k=E(\"\"),g=()=>L(this,null,function*(){d.value+=\".\";try{const b=yield G.Smart.Test.Result.POST({type:\"selftest\",devicePath:n.task.devicePath||\"\"});if(b.data){const{result:y,error:f}=b.data;y&&y.result&&(k.value=y.result),f&&(k.value=f)}}catch(b){b&&(k.value=b)}}),p=Mt.easyInterval(g,5e3);ke(()=>{p()});const m=()=>{u.value=!0,p(),n.close()},v=()=>L(this,null,function*(){u.value=!0;try{const b=yield G.Smart.Test.POST({type:n.task.type||\"short\",devicePath:n.task.devicePath||\"\"});if(b.data){const{success:y,error:f,result:F}=b.data;f&&(c.value=f),F&&F.result&&(c.value=F.result)}}catch(b){c.value=b}finally{}});return(b,y)=>(r(),Z(je,null,{default:V(()=>[t(\"div\",jF,[t(\"div\",UF,[t(\"span\",null,i(e(a)(\"\\u8FD0\\u884C\\u8C03\\u8BD5\")),1)]),t(\"div\",qF,[t(\"textarea\",{value:c.value+`\n`+k.value+`\n`+d.value,disabled:\"\"},null,8,RF)]),t(\"div\",WF,[t(\"div\",{class:\"close\",onClick:m,disabled:u.value},i(e(a)(\"\\u5173\\u95ED\")),9,HF),u.value?D(\"\",!0):(r(),s(\"div\",{key:0,class:\"next\",onClick:v,disabled:u.value},i(e(a)(\"\\u8FD0\\u884C\")),9,JF))])])]),_:1}))}});var KF=N(ZF,[[\"__scopeId\",\"data-v-70c3aae0\"]]);const QF={class:\"actioner-container\"},XF={class:\"actioner-container_header\"},tE={class:\"tabs\"},eE={class:\"actioner-container_body\"},aE={key:0,class:\"table\"},oE={class:\"tr\"},nE={class:\"td left\"},iE={class:\"td left\"},rE={class:\"tr\"},sE={class:\"td left\"},dE={class:\"td left\"},lE={class:\"tr\"},uE={class:\"td left\"},cE={class:\"td left\"},pE=[\"value\"],fE=[\"value\"],mE=[\"value\"],gE={class:\"actioner-container_footer\"},vE=[\"disabled\"],bE=I({props:{close:{type:Function,required:!0},disk:{type:Object,required:!0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=E(!1),d=E(\"info\"),c=b=>{switch(d.value=b,b){case\"info\":break;case\"attribute\":m();break;case\"log\":p();break;case\"extend\":v();break}},k=()=>{u.value=!0,n.close()},g=gt({log:\"\",attribute:\"\",extend:\"\"}),p=()=>L(this,null,function*(){try{const b=yield G.Smart.Test.Result.POST({type:\"selftest\",devicePath:n.disk.path||\"\"});if(b.data){const{result:y,error:f}=b.data;y&&y.result&&(g.log=y.result),f&&(g.log=f)}}catch(b){g.log=b}}),m=()=>L(this,null,function*(){try{const b=yield G.Smart.Attribute.Result.POST({devicePath:n.disk.path||\"\"});if(b.data){const{result:y,error:f}=b.data;y&&y.result&&(g.attribute=y.result),f&&(g.attribute=f)}}catch(b){g.attribute=b}}),v=()=>L(this,null,function*(){try{const b=yield G.Smart.Extend.Result.POST({devicePath:n.disk.path||\"\"});if(b.data){const{result:y,error:f}=b.data;y&&y.result&&(g.extend=y.result),f&&(g.extend=f)}}catch(b){g.extend=b}});return(b,y)=>(r(),Z(je,null,{default:V(()=>[t(\"div\",QF,[t(\"div\",XF,[t(\"ul\",tE,[t(\"li\",{class:lt({\"active cbi-tab\":d.value==\"info\"}),onClick:y[0]||(y[0]=f=>c(\"info\"))},[t(\"a\",null,i(e(a)(\"\\u8BBE\\u5907\\u4FE1\\u606F\")),1)],2),t(\"li\",{class:lt({\"active cbi-tab\":d.value==\"attribute\"}),onClick:y[1]||(y[1]=f=>c(\"attribute\"))},[t(\"a\",null,i(e(a)(\"\\u5C5E\\u6027\")),1)],2),t(\"li\",{class:lt({\"active cbi-tab\":d.value==\"log\"}),onClick:y[2]||(y[2]=f=>c(\"log\"))},[t(\"a\",null,i(e(a)(\"\\u81EA\\u68C0\\u65E5\\u5FD7\")),1)],2),t(\"li\",{class:lt({\"active cbi-tab\":d.value==\"extend\"}),onClick:y[3]||(y[3]=f=>c(\"extend\"))},[t(\"a\",null,i(e(a)(\"\\u6269\\u5C55\\u4FE1\\u606F\")),1)],2)])]),t(\"div\",eE,[d.value==\"info\"?(r(),s(\"table\",aE,[t(\"tr\",oE,[t(\"td\",nE,i(e(a)(\"\\u8BBE\\u5907\")),1),t(\"td\",iE,i(o.disk.path),1)]),t(\"tr\",rE,[t(\"td\",sE,i(e(a)(\"\\u578B\\u53F7\")),1),t(\"td\",dE,i(o.disk.model),1)]),t(\"tr\",lE,[t(\"td\",uE,i(e(a)(\"\\u5E8F\\u53F7\")),1),t(\"td\",cE,i(o.disk.serial),1)])])):d.value==\"attribute\"?(r(),s(\"textarea\",{key:1,disabled:\"\",value:e(g).attribute},null,8,pE)):d.value==\"log\"?(r(),s(\"textarea\",{key:2,disabled:\"\",value:e(g).log},null,8,fE)):d.value==\"extend\"?(r(),s(\"textarea\",{key:3,disabled:\"\",value:e(g).extend},null,8,mE)):D(\"\",!0)]),t(\"div\",gE,[t(\"div\",{class:\"close\",onClick:k,disabled:u.value},i(e(a)(\"\\u5173\\u95ED\")),9,vE)])])]),_:1}))}});var hE=N(bE,[[\"__scopeId\",\"data-v-313197ee\"]]);const _E=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=Y(tF,vt(st({},o),{close:()=>{l()}})),l=()=>{n.remove()};Ie(a,n)},xE=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=Y(GF,vt(st({},o),{close:()=>{l()}})),l=()=>{n.remove()};Ie(a,n)},wE=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=Y(KF,vt(st({},o),{close:()=>{l()}})),l=()=>{n.remove()};Ie(a,n)},kE=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=Y(hE,vt(st({},o),{close:()=>{l()}})),l=()=>{n.remove()};Ie(a,n)},yE={class:\"cbi-section\"},FE={class:\"cbi-value\"},EE={class:\"cbi-value-title\"},$E={class:\"cbi-value-field\"},CE={class:\"cbi-checkbox\"},DE=[\"value\"],BE={class:\"cbi-value\"},YE={class:\"cbi-value-title\"},AE={class:\"cbi-value-field\"},SE={class:\"cbi-checkbox\"},zE={value:\"never\"},PE={value:\"sleep\"},TE={value:\"standby\"},IE={value:\"idle\"},ME={class:\"cbi-value-description\"},LE=t(\"br\",null,null,-1),OE=t(\"br\",null,null,-1),NE=t(\"br\",null,null,-1),VE=t(\"br\",null,null,-1),GE={class:\"cbi-value\"},jE={class:\"cbi-value-title\"},UE={class:\"cbi-value-field\"},qE={class:\"cbi-checkbox\"},RE={value:0},WE=[\"value\"],HE={class:\"cbi-value-description\"},JE={class:\"cbi-value\"},ZE={class:\"cbi-value-title\"},KE={class:\"cbi-value-field\"},QE={class:\"cbi-checkbox\"},XE={value:0},t$=[\"value\"],e$={class:\"cbi-value-description\"},a$={class:\"cbi-section cbi-tblsection\",id:\"cbi-nfs-mount\"},o$={class:\"table cbi-section-table\"},n$={class:\"tr cbi-section-table-titles anonymous\"},i$={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},r$={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},s$={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},d$={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},l$={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},u$={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},c$={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},p$={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},f$={class:\"tr cbi-section-table-row\"},m$={class:\"td cbi-value-field\"},g$={class:\"td cbi-value-field\"},v$={class:\"td cbi-value-field\"},b$={class:\"td cbi-value-field\"},h$={class:\"td cbi-value-field\"},_$={class:\"td cbi-value-field\"},x$={class:\"td cbi-value-field\"},w$={class:\"td cbi-value-field\"},k$=[\"title\",\"onClick\"],y$=[\"title\",\"onClick\"],F$={class:\"cbi-page-actions control-group\"},E$=[\"value\"],$$=I({props:{config:{type:Object,required:!0},saveData:{type:Function,required:!0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=gt(n.config),d=()=>{u.global.tmpDiff=n.config.global.tmpDiff||0,u.global.tmpMax=n.config.global.tmpMax||0,u.global.enable=n.config.global.enable||!1,u.global.powermode=n.config.global.powermode||\"never\",u.devices=n.config.devices||[],u.tasks=n.config.tasks||[]},c=E([]),k=()=>L(this,null,function*(){try{const b=yield G.Smart.List.GET();if(b.data){const{result:y,error:f}=b.data;y&&y.disks&&(c.value=y.disks||[])}}catch(b){}}),g=Mt.easyInterval(k,5e3);ke(()=>{g()});const p=()=>L(this,null,function*(){yield n.saveData({global:u.global,devices:n.config.devices,tasks:n.config.tasks}),d()}),m=b=>{kE({disk:b})},v=(b,y)=>L(this,null,function*(){let f=null,F=-1;if(u.devices){for(let w=0;w<u.devices.length;w++)if(u.devices[w].devicePath==b.path){f=u.devices[w],F=w;break}}_E({disk:b,device:f,next:w=>L(this,null,function*(){w.tmpDiff==-1&&(w.tmpDiff=u.global.tmpDiff),w.tmpMax==-1&&(w.tmpMax=u.global.tmpMax),w.devicePath==\"\"&&(w.devicePath=b.path);let h=[...u.devices];F>=0&&(h[F]=w);const _=new Map;h.forEach(x=>{x.devicePath!=null&&_.set(x.devicePath,null)});for(let x=0;x<c.value.length;x++){const C=c.value[x];C.path!=null&&!_.has(C.path)&&h.push({devicePath:C.path,tmpDiff:u.global.tmpDiff,tmpMax:u.global.tmpMax})}yield n.saveData({tasks:n.config.tasks,global:n.config.global,devices:h}),d()})})});return(b,y)=>(r(),s(U,null,[t(\"fieldset\",yE,[t(\"div\",FE,[t(\"label\",EE,i(e(a)(\"\\u542F\\u7528\")),1),t(\"div\",$E,[t(\"div\",CE,[O(t(\"input\",{type:\"checkbox\",\"onUpdate:modelValue\":y[0]||(y[0]=f=>e(u).global.enable=f),value:!e(u).global.enable},null,8,DE),[[Rt,e(u).global.enable]])])])]),t(\"div\",BE,[t(\"label\",YE,i(e(a)(\"\\u7535\\u6E90\\u6A21\\u5F0F\")),1),t(\"div\",AE,[t(\"div\",SE,[O(t(\"select\",{class:\"cbi-input-select\",\"onUpdate:modelValue\":y[1]||(y[1]=f=>e(u).global.powermode=f)},[t(\"option\",zE,i(e(a)(\"\\u603B\\u662F\")),1),t(\"option\",PE,i(e(a)(\"\\u7761\\u7720\")),1),t(\"option\",TE,i(e(a)(\"\\u5F85\\u673A\")),1),t(\"option\",IE,i(e(a)(\"\\u95F2\\u7F6E\")),1)],512),[[pt,e(u).global.powermode,void 0,{trim:!0}]])]),t(\"div\",ME,[t(\"span\",null,i(e(a)(\"\\u6D4B\\u8BD5\\u65F6\\u78C1\\u76D8\\u4F1A\\u8F6C\\u52A8\\uFF0C\\u8BF7\\u9009\\u62E9\\u5408\\u9002\\u7684\\u6A21\\u5F0F\\u6765\\u63A7\\u5236\\u78C1\\u76D8\\u8F6C\\u52A8\\u3002\")),1),LE,t(\"span\",null,\"* \"+i(e(a)(\"\\u603B\\u662F-\\u65E0\\u8BBA\\u662F\\u4EC0\\u4E48\\u529F\\u8017\\u6A21\\u5F0F\\u4E0B\\u90FD\\u6D4B\\u8BD5(\\u68C0\\u67E5)\\u78C1\\u76D8\\uFF0C\\u5F53\\u68C0\\u67E5\\u65F6\\uFF0C\\u8FD9\\u53EF\\u80FD\\u4F1A\\u4F7F\\u505C\\u8F6C\\u7684\\u78C1\\u76D8\\u5F00\\u59CB\\u8F6C\\u52A8\\u3002\")),1),OE,t(\"span\",null,\"* \"+i(e(a)(\"\\u7761\\u7720-\\u5904\\u4E8E\\u7761\\u7720\\u6A21\\u5F0F\\u4E0B\\u4E0D\\u68C0\\u67E5\\u8BBE\\u5907\\u3002\")),1),NE,t(\"span\",null,\"* \"+i(e(a)(\"\\u5F85\\u673A-\\u5904\\u4E8E\\u5F85\\u673A\\u548C\\u7761\\u7720\\u6A21\\u5F0F\\u4E0B\\u4E0D\\u68C0\\u67E5\\u8BBE\\u5907\\u3002\\u6B64\\u6A21\\u5F0F\\u4E0B\\u78C1\\u76D8\\u4E00\\u822C\\u4E0D\\u65CB\\u8F6C\\uFF0C\\u5982\\u679C\\u4F60\\u4E0D\\u60F3\\u6BCF\\u6B21\\u68C0\\u67E5\\u90FD\\u8F6C\\u52A8\\u78C1\\u76D8\\uFF0C\\u90A3\\u4E48\\u8FD9\\u4E2A\\u6A21\\u5F0F\\u6BD4\\u8F83\\u9002\\u5408\\u3002\")),1),VE,t(\"span\",null,\"* \"+i(e(a)(\"\\u95F2\\u7F6E-\\u5904\\u4E8E\\u5F85\\u673A\\u3001\\u7761\\u7720\\u3001\\u95F2\\u7F6E\\u6A21\\u5F0F\\u4E0B\\u4E0D\\u68C0\\u67E5\\u8BBE\\u5907\\uFF0C\\u5728\\u95F2\\u7F6E\\u72B6\\u6001\\u4E0B\\uFF0C\\u5927\\u591A\\u6570\\u78C1\\u76D8\\u8FD8\\u5728\\u8F6C\\u52A8\\uFF0C\\u6240\\u4EE5\\u8FD9\\u53EF\\u80FD\\u4E0D\\u9002\\u5408\\u4F60\\u3002\")),1)])])]),t(\"div\",GE,[t(\"label\",jE,i(e(a)(\"\\u6E29\\u5EA6\\u76D1\\u6D4B\\uFF08\\u5DEE\\u5F02\\uFF09\")),1),t(\"div\",UE,[t(\"div\",qE,[O(t(\"select\",{class:\"cbi-input-select\",\"onUpdate:modelValue\":y[2]||(y[2]=f=>e(u).global.tmpDiff=f)},[t(\"option\",RE,i(e(a)(\"\\u7981\\u7528\")),1),(r(),s(U,null,tt(15,f=>t(\"option\",{value:f},i(f)+\"\\xB0C\",9,WE)),64))],512),[[pt,e(u).global.tmpDiff,void 0,{number:!0}]])]),t(\"div\",HE,i(e(a)(\"\\u81EA\\u4E0A\\u6B21\\u62A5\\u544A\\u4EE5\\u6765\\u6E29\\u5EA6\\u53D8\\u5316\\u81F3\\u5C11 N \\u5EA6\\uFF0C\\u5219\\u9700\\u62A5\\u544A.\")),1)])]),t(\"div\",JE,[t(\"label\",ZE,i(e(a)(\"\\u6E29\\u5EA6\\u76D1\\u6D4B\\uFF08\\u6700\\u5927\\uFF09\")),1),t(\"div\",KE,[t(\"div\",QE,[O(t(\"select\",{class:\"cbi-input-select\",\"onUpdate:modelValue\":y[3]||(y[3]=f=>e(u).global.tmpMax=f)},[t(\"option\",XE,i(e(a)(\"\\u7981\\u7528\")),1),(r(),s(U,null,tt(20,f=>t(\"option\",{value:f*5},i(f*5)+\"\\xB0C\",9,t$)),64))],512),[[pt,e(u).global.tmpMax,void 0,{number:!0}]])]),t(\"div\",e$,i(e(a)(\"\\u5982\\u679C\\u6E29\\u5EA6\\u5927\\u4E8E\\u6216\\u7B49\\u4E8E N \\u6444\\u6C0F\\u5EA6\\u5219\\u62A5\\u544A.\")),1)])])]),t(\"div\",a$,[t(\"table\",o$,[t(\"thead\",null,[t(\"tr\",n$,[t(\"th\",i$,i(e(a)(\"\\u8BBE\\u5907\")),1),t(\"th\",r$,i(e(a)(\"\\u578B\\u53F7\")),1),t(\"th\",s$,i(e(a)(\"\\u5E8F\\u53F7\")),1),t(\"th\",d$,i(e(a)(\"\\u5BB9\\u91CF\")),1),t(\"th\",l$,i(e(a)(\"\\u6E29\\u5EA6\")),1),t(\"th\",u$,i(e(a)(\"\\u72B6\\u6001\")),1),t(\"th\",c$,i(e(a)(\"\\u5065\\u5EB7\")),1),t(\"th\",p$,i(e(a)(\"\\u64CD\\u4F5C\")),1)])]),t(\"tbody\",null,[(r(!0),s(U,null,tt(c.value,(f,F)=>(r(),s(\"tr\",f$,[t(\"td\",m$,[t(\"b\",null,i(f.path),1)]),t(\"td\",g$,[t(\"b\",null,i(f.model),1)]),t(\"td\",v$,[t(\"b\",null,i(f.serial),1)]),t(\"td\",b$,[t(\"b\",null,i(f.sizeStr),1)]),t(\"td\",h$,[t(\"b\",null,i(f.temp),1)]),t(\"td\",_$,[t(\"b\",null,i(f.status),1)]),t(\"td\",x$,[t(\"b\",null,i(f.health),1)]),t(\"td\",w$,[t(\"button\",{class:\"btn cbi-button cbi-button-apply\",title:e(a)(\"\\u7F16\\u8F91\"),onClick:w=>v(f)},i(e(a)(\"\\u7F16\\u8F91\")),9,k$),t(\"button\",{class:\"btn cbi-button cbi-button-apply\",title:e(a)(\"\\u8BE6\\u60C5\"),onClick:w=>m(f)},i(e(a)(\"\\u8BE6\\u60C5\")),9,y$)])]))),256))])])]),t(\"span\",F$,[t(\"input\",{class:\"btn cbi-button cbi-button-apply\",type:\"button\",value:e(a)(\"\\u4FDD\\u5B58\\u5E76\\u5E94\\u7528\"),onClick:p},null,8,E$)])],64))}}),C$={class:\"cbi-section cbi-tblsection\",id:\"cbi-nfs-mount\"},D$={class:\"table cbi-section-table\"},B$={class:\"tr cbi-section-table-titles anonymous\"},Y$={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},A$={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},S$={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},z$={class:\"th cbi-section-table-cell\",\"data-widget\":\"value\"},P$={class:\"tr cbi-section-table-row\"},T$={class:\"td cbi-value-field\"},I$={class:\"td cbi-value-field\"},M$={class:\"td cbi-value-field\"},L$={class:\"td cbi-value-field\"},O$=[\"title\",\"onClick\"],N$=[\"title\",\"onClick\"],V$=I({props:{config:{type:Object,required:!0},saveData:{type:Function,required:!0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=gt(n.config),d=p=>{switch(p){case\"short\":return a(\"\\u77ED\\u6682\\u81EA\\u68C0\");case\"long\":return a(\"\\u957F\\u65F6\\u81EA\\u68C0\");case\"conveyance\":return a(\"\\u4F20\\u8F93\\u65F6\\u81EA\\u68C0\");case\"offline\":return a(\"\\u79BB\\u7EBF\\u65F6\\u81EA\\u68C0\");default:return a(\"\\u672A\\u77E5\")}},c=()=>{xE({config:n.config,disks:[],next:p=>L(this,null,function*(){yield n.saveData({tasks:[...u.tasks,p],global:n.config.global,devices:n.config.devices}),u.tasks=n.config.tasks||[]})})},k=p=>L(this,null,function*(){const m=[...u.tasks];m.splice(p,1),yield n.saveData({tasks:m,global:n.config.global,devices:n.config.devices}),u.tasks=n.config.tasks||[]}),g=p=>{wE({task:p})};return(p,m)=>(r(),s(U,null,[t(\"button\",{class:\"btn cbi-button cbi-button-apply\",onClick:m[0]||(m[0]=v=>c())},i(e(a)(\"\\u65B0\\u5EFA\")),1),t(\"div\",C$,[t(\"table\",D$,[t(\"thead\",null,[t(\"tr\",B$,[t(\"th\",Y$,i(e(a)(\"\\u8BBE\\u5907\")),1),t(\"th\",A$,i(e(a)(\"\\u7C7B\\u578B\")),1),t(\"th\",S$,i(e(a)(\"\\u8C03\\u5EA6\")),1),t(\"th\",z$,i(e(a)(\"\\u529F\\u80FD\")),1)])]),t(\"tbody\",null,[(r(!0),s(U,null,tt(e(u).tasks,(v,b)=>(r(),s(\"tr\",P$,[t(\"td\",T$,[t(\"b\",null,i(v.devicePath),1)]),t(\"td\",I$,[t(\"b\",null,i(d(v.type)),1)]),t(\"td\",M$,[t(\"b\",null,i(v.month)+\"/\"+i(v.dayPerMonth)+\"/\"+i(v.hour),1)]),t(\"td\",L$,[t(\"button\",{class:\"btn cbi-button cbi-button-apply\",title:e(a)(\"\\u8C03\\u8BD5\"),onClick:y=>g(v)},i(e(a)(\"\\u9884\\u89C8\")),9,O$),t(\"button\",{class:\"cbi-button cbi-button-remove\",title:e(a)(\"\\u5220\\u9664\"),onClick:y=>k(b)},i(e(a)(\"\\u5220\\u9664\")),9,N$)])]))),256))])])])],64))}}),G$={class:\"cbi-section\"},j$=[\"value\"],U$=I({setup(o){return L(this,null,function*(){let n,a;const l=E(\"\"),u=()=>L(this,null,function*(){try{const d=yield G.Smart.Log.GET();if(d.data){const{result:c,error:k}=d.data;c&&c.result&&(l.value=c.result),k&&(l.value=k)}}catch(d){l.value=d}});return[n,a]=Do(()=>u()),yield n,a(),(d,c)=>(r(),s(\"fieldset\",G$,[t(\"textarea\",{value:l.value,disabled:\"\"},null,8,j$)]))})}});var q$=N(U$,[[\"__scopeId\",\"data-v-76197cba\"]]);const lo=o=>(ut(\"data-v-02f10ac5\"),o=o(),ct(),o),R$=lo(()=>t(\"div\",{class:\"app-container_status-label_iconer\"},[t(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\",\"xmlns:v\":\"https://vecta.io/nano\",width:\"48\",height:\"38\",viewBox:\"0 0 12.7 10.05\"},[t(\"defs\",null,[t(\"filter\",{id:\"A\",\"color-interpolation-filters\":\"sRGB\"},[t(\"feColorMatrix\",{result:\"A\",values:\"2 -0.5 -0.5 0 0 -0.5 2 -0.5 0 0 -0.5 -0.5 2 0 0 0 0 0 1 0 \"}),t(\"feColorMatrix\",{values:\"0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0\"}),t(\"feColorMatrix\",{in:\"A\",values:\"2 -0.5 -0.5 0 0 -0.5 2 -0.5 0 0 -0.5 -0.5 2 0 0 0 0 0 1 0 \"})]),t(\"path\",{id:\"B\",d:\"M80.56 75.75h3.91v22.79h-3.91z\"})]),t(\"g\",{transform:\"translate(0 -286.95)\"},[t(\"rect\",{x:\".21\",y:\"287.25\",width:\"12.33\",height:\"9.5\",ry:\".57\",fill:\"#e6e6e6\",stroke:\"#e6e6e6\",\"stroke-linejoin\":\"round\",\"stroke-width\":\".37\",\"paint-order\":\"normal\"}),t(\"path\",{transform:\"matrix(.105 0 0 .0989 -6.0834 280.6)\",d:\"M73.96 75.66h89.41c2.31 0 4.17 1.86 4.17 4.17v52.65h-21.74v9.41h-8.69v12.59h-36.87v-12.59h-8.69v-9.41H69.79V79.83c0-2.31 1.86-4.17 4.17-4.17z\",fill:\"#999\",filter:\"url(#A)\",stroke:\"#999\",\"stroke-width\":\"2.5\"}),t(\"g\",{transform:\"matrix(.1048 0 0 .1048 -6.0999 280.7)\",fill:\"#fff\",filter:\"url(#A)\",stroke:\"#fff\"},[t(\"use\",{\"xlink:href\":\"#B\"}),t(\"use\",{\"xlink:href\":\"#B\",x:\"73.04\"}),t(\"use\",{\"xlink:href\":\"#B\",x:\"52.17\"}),t(\"use\",{\"xlink:href\":\"#B\",x:\"41.74\"}),t(\"use\",{\"xlink:href\":\"#B\",x:\"31.3\"}),t(\"use\",{\"xlink:href\":\"#B\",x:\"20.87\"}),t(\"use\",{\"xlink:href\":\"#B\",x:\"10.43\"}),t(\"use\",{\"xlink:href\":\"#B\",x:\"62.61\"})]),t(\"rect\",{x:\"1.24\",y:\"294.55\",width:\"1.6\",height:\"1.38\",ry:\".11\",fill:\"#ccc\",stroke:\"#ccc\",\"stroke-width\":\".22\",\"paint-order\":\"normal\"})])])],-1)),W$={class:\"app-container_status-label_text\"},H$={class:\"text_status\"},J$={class:\"text_info\"},Z$=lo(()=>t(\"div\",{class:\"app-container_status-label_iconer\"},[t(\"svg\",{xmlns:\"http://www.w3.org/2000/svg\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\",width:\"48\",height:\"38\",viewBox:\"0 0 12.7 10.05\",\"xmlns:v\":\"https://vecta.io/nano\"},[t(\"defs\",null,[t(\"filter\",{id:\"A\",\"color-interpolation-filters\":\"sRGB\"},[t(\"feColorMatrix\",{result:\"A\",values:\"2 -0.5 -0.5 0 0 -0.5 2 -0.5 0 0 -0.5 -0.5 2 0 0 0 0 0 1 0 \"}),t(\"feColorMatrix\",{values:\"0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0\"}),t(\"feColorMatrix\",{in:\"A\",values:\"2 -0.5 -0.5 0 0 -0.5 2 -0.5 0 0 -0.5 -0.5 2 0 0 0 0 0 1 0 \"})]),t(\"path\",{id:\"B\",d:\"M80.56 75.75h3.91v22.79h-3.91z\"})]),t(\"g\",{transform:\"translate(-.03 -287.07)\"},[t(\"rect\",{x:\".24\",y:\"287.36\",width:\"12.33\",height:\"9.5\",ry:\".57\",fill:\"#e6e6e6\",stroke:\"#e6e6e6\",\"stroke-linejoin\":\"round\",\"stroke-width\":\".37\",\"paint-order\":\"normal\"}),t(\"path\",{transform:\"matrix(.105 0 0 .0989 -6.0532 280.72)\",d:\"M73.96 75.66h89.41c2.31 0 4.17 1.86 4.17 4.17v52.65h-21.74v9.41h-8.69v12.59h-36.87v-12.59h-8.69v-9.41H69.79V79.83c0-2.31 1.86-4.17 4.17-4.17z\",fill:\"#4d4d4d\",filter:\"url(#A)\",stroke:\"#4d4d4d\",\"stroke-width\":\"2.5\"}),t(\"g\",{transform:\"matrix(.1048 0 0 .1048 -6.0697 280.81)\",fill:\"#fff\",filter:\"url(#A)\",stroke:\"#fff\"},[t(\"use\",{\"xlink:href\":\"#B\"}),t(\"use\",{\"xlink:href\":\"#B\",x:\"73.04\"}),t(\"use\",{\"xlink:href\":\"#B\",x:\"52.17\"}),t(\"use\",{\"xlink:href\":\"#B\",x:\"41.74\"}),t(\"use\",{\"xlink:href\":\"#B\",x:\"31.3\"}),t(\"use\",{\"xlink:href\":\"#B\",x:\"20.87\"}),t(\"use\",{\"xlink:href\":\"#B\",x:\"10.43\"}),t(\"use\",{\"xlink:href\":\"#B\",x:\"62.61\"})]),t(\"rect\",{x:\"1.27\",y:\"294.67\",width:\"1.6\",height:\"1.38\",ry:\".11\",fill:\"#55d400\",stroke:\"#55d400\",\"stroke-width\":\".22\",\"paint-order\":\"normal\"})])])],-1)),K$={class:\"app-container_status-label_text\"},Q$={class:\"text_info\"},X$=I({props:{item:{type:Object,required:!0},transform:{type:Number,default:0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=ra(),d=E(null),c=g=>{const p=g.target,{left:m,top:v}=p.getBoundingClientRect();u.portitemStyle.show=!0,u.portitemStyle.left=m,u.portitemStyle.top=v,u.portitemStyle.portitem=n.item},k=g=>{u.portitemStyle.show=!1};return(g,p)=>(r(),s(\"div\",{class:\"app-container_status-label_bg\",style:ht(`transform: translateX(${o.transform}px);`),ref_key:\"el\",ref:d,onMouseenter:c,onMouseleave:k},[o.item.linkState==\"DOWN\"?(r(),s(U,{key:0},[R$,t(\"div\",W$,[t(\"div\",H$,i(e(a)(\"\\u5DF2\\u65AD\\u5F00\")),1),t(\"div\",J$,i(o.item.name)+\" \"+i(o.item.interfaceNames?`(${o.item.interfaceNames.join(\",\").toLocaleUpperCase()})`:\"\"),1)])],64)):(r(),s(U,{key:1},[Z$,t(\"div\",K$,[t(\"div\",null,i(o.item.linkSpeed),1),t(\"div\",Q$,i(o.item.name)+\" \"+i(o.item.interfaceNames?`(${o.item.interfaceNames.join(\",\").toLocaleUpperCase()})`:\"\"),1)])],64))],36))}});var tC=N(X$,[[\"__scopeId\",\"data-v-02f10ac5\"]]);const eC={},aC={t:\"1659511092204\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"2332\",\"xmlns:xlink\":\"http://www.w3.org/1999/xlink\",width:\"200\",height:\"200\"},oC=t(\"path\",{d:\"M514.048 62.464q93.184 0 175.616 35.328t143.872 96.768 96.768 143.872 35.328 175.616q0 94.208-35.328 176.128t-96.768 143.36-143.872 96.768-175.616 35.328q-94.208 0-176.64-35.328t-143.872-96.768-96.768-143.36-35.328-176.128q0-93.184 35.328-175.616t96.768-143.872 143.872-96.768 176.64-35.328zM772.096 576.512q26.624 0 45.056-18.944t18.432-45.568-18.432-45.056-45.056-18.432l-192.512 0 0-192.512q0-26.624-18.944-45.568t-45.568-18.944-45.056 18.944-18.432 45.568l0 192.512-192.512 0q-26.624 0-45.056 18.432t-18.432 45.056 18.432 45.568 45.056 18.944l192.512 0 0 191.488q0 26.624 18.432 45.568t45.056 18.944 45.568-18.944 18.944-45.568l0-191.488 192.512 0z\",\"p-id\":\"2333\"},null,-1),nC=[oC];function iC(o,n){return r(),s(\"svg\",aC,nC)}var Pa=N(eC,[[\"render\",iC]]);const rC=[\"onSubmit\"],sC={class:\"actioner-dns_header\"},dC={key:0},lC={key:1},uC={class:\"actioner-dns_body\"},cC={class:\"label-item\"},pC={class:\"label-item_key\"},fC={class:\"label-item_value\"},mC={class:\"label-item\"},gC={class:\"label-item_key\"},vC={class:\"label-item_value\"},bC={value:\"dhcp\"},hC={key:0,value:\"pppoe\"},_C={value:\"static\"},xC={class:\"actioner-dns_footer\"},wC=[\"disabled\"],kC=I({props:{Close:{type:Function,required:!0},e:{type:String,required:!0},name:{type:String,required:!0},inface:{type:Object,required:!0},next:{type:Function,required:!0}},setup(o){const n=o,{$gettext:a,$ngettext:l}=J(),u=E(!1),d=E(n.inface),c=()=>L(this,null,function*(){$.Loading(a(\"\\u914D\\u7F6E\\u4E2D...\")).Close(),n.next(d.value),k()}),k=()=>{n.Close&&n.Close()};return(g,p)=>(r(),Z(wt,{Close:o.Close,type:1},{default:V(()=>[t(\"form\",{class:\"actioner-dns\",onSubmit:ft(c,[\"prevent\"])},[t(\"div\",sC,[o.name==\"wan\"?(r(),s(\"span\",dC,i(o.e==\"edit\"?e(a)(\"\\u7F16\\u8F91WAN\"):e(a)(\"\\u6DFB\\u52A0WAN\")),1)):(r(),s(\"span\",lC,i(o.e==\"edit\"?e(a)(\"\\u7F16\\u8F91LAN\"):e(a)(\"\\u6DFB\\u52A0LAN\")),1))]),t(\"div\",uC,[t(\"div\",cC,[t(\"div\",pC,[t(\"span\",null,i(e(a)(\"\\u540D\\u79F0\")),1)]),t(\"div\",fC,[t(\"span\",null,i(d.value.name.toLocaleUpperCase()),1)])]),t(\"div\",mC,[t(\"div\",gC,[t(\"span\",null,i(e(a)(\"\\u534F\\u8BAE\\uFF08\\u7F51\\u7EDC\\u83B7\\u53D6\\u65B9\\u5F0F\\uFF09\")),1)]),t(\"div\",vC,[O(t(\"select\",{\"onUpdate:modelValue\":p[0]||(p[0]=m=>d.value.proto=m)},[t(\"option\",bC,i(e(a)(\"DHCP\\u5BA2\\u6237\\u7AEF\")),1),o.name==\"wan\"?(r(),s(\"option\",hC,\"PPPoE\")):D(\"\",!0),t(\"option\",_C,i(e(a)(\"\\u9759\\u6001\\u5730\\u5740\")),1)],512),[[pt,d.value.proto]])])])]),t(\"div\",xC,[t(\"button\",{class:\"cbi-button cbi-button-apply app-btn\",disabled:u.value},i(e(a)(\"\\u4FDD\\u5B58\")),9,wC),t(\"button\",{class:\"cbi-button cbi-button-remove app-btn app-back\",onClick:k},i(e(a)(\"\\u53D6\\u6D88\")),1)])],40,rC)]),_:1},8,[\"Close\"]))}});var yC=N(kC,[[\"__scopeId\",\"data-v-c88486ac\"]]);const Ta=o=>{const n=document.createElement(\"div\");document.body.appendChild(n);const a=xt(yC,vt(st({},o),{Close:()=>{l()}}));a.mount(n);const l=()=>{a.unmount(),n.remove()}},Ut=o=>(ut(\"data-v-3dabb970\"),o=o(),ct(),o),FC={id:\"page\"},EC={name:\"content\"},$C={class:\"container\"},CC={class:\"table-wrapper\"},DC={class:\"table-header\"},BC={class:\"interface-device-flex\"},YC=Ut(()=>t(\"div\",{class:\"header-cell spacer-col\"},null,-1)),AC=Ut(()=>t(\"div\",{class:\"header-cell\"},null,-1)),SC=Ut(()=>t(\"div\",{class:\"header-cell action-col\"},null,-1)),zC={class:\"table-body\"},PC=[\"name\",\"value\",\"onUpdate:modelValue\",\"onInput\"],TC=Ut(()=>t(\"div\",{class:\"table-cell spacer-col\"},null,-1)),IC={class:\"table-cell name-col\"},MC={class:\"table-cell action-col\"},LC=[\"title\",\"onClick\"],OC=[\"onClick\"],NC=Ut(()=>t(\"div\",{class:\"table-cell spacer-col\"},null,-1)),VC=Ut(()=>t(\"div\",{class:\"table-cell name-col\"},null,-1)),GC={class:\"table-cell action-col\"},jC=[\"name\",\"value\",\"onUpdate:modelValue\",\"onInput\"],UC=Ut(()=>t(\"div\",{class:\"table-cell spacer-col\"},null,-1)),qC={class:\"table-cell name-col\"},RC={class:\"table-cell action-col\"},WC=[\"title\",\"onClick\"],HC=[\"onClick\"],JC=Ut(()=>t(\"div\",{class:\"table-cell spacer-col\"},null,-1)),ZC=Ut(()=>t(\"div\",{class:\"table-cell name-col\"},null,-1)),KC={class:\"table-cell action-col\"},QC={class:\"cbi-page-actions control-group\"},XC=[\"value\",\"disabled\"],tD=I({setup(o){const{$gettext:n,$ngettext:a}=J(),l=gt({devices:[],interfaces:[]}),u=E(!1),d=gt({lan:[],wan:[]});(()=>{G.Network.GetInterfaceConfig.GET().then(y=>{if(y.data){const{result:f}=y.data;if(f){l.devices=f.devices||[],l.interfaces=f.interfaces||[];for(let F=0;F<l.interfaces.length;F++)l.interfaces[F].firewallType==\"wan\"?d.wan.push(l.interfaces[F]):l.interfaces[F].firewallType==\"lan\"&&d.lan.push(l.interfaces[F])}}})})();const k=(y,f)=>{y==\"wan\"?d.wan.splice(f,1):y==\"lan\"&&d.lan.splice(f,1)},g=(y,f)=>{if(f==null){let F=y==\"wan\"?d.wan.length:d.lan.length;F==6&&y==\"wan\"&&F++,Ta({e:\"add\",name:y,inface:{name:y+`${F}`,proto:\"dhcp\",ipv4Addr:\"\",ipv6Addr:\"\",portName:\"\",deviceNames:[],ports:[],firewallType:y},next:w=>{y==\"wan\"?d.wan.push(w):d.lan.push(w),$.Message(n(\"\\u8BF7\\u5728\\u4FDD\\u5B58\\u4EE5\\u540E\\u524D\\u5F80'\\u7F51\\u7EDC-\\u63A5\\u53E3'\\u9875\\u9762\\u914D\\u7F6E\\u63A5\\u53E3\\u8BE6\\u7EC6\\u53C2\\u6570\"))}})}else Ta({e:\"edit\",name:y,inface:y==\"wan\"?d.wan[f]:d.lan[f],next:F=>{y==\"wan\"?d.wan[f]=F:d.lan[f]=F}})},p=(y,f)=>y?y.indexOf(f):-1,m=(y,f)=>{const w=y.target.value;for(let _=0;_<d.wan.length;_++){const x=p(d.wan[_].deviceNames,w);x!=-1&&d.wan[_].deviceNames.splice(x,1)}for(let _=0;_<d.lan.length;_++)if(_!=f){const x=p(d.lan[_].deviceNames,w);x!=-1&&d.lan[_].deviceNames.splice(x,1)}const h=p(d.lan[f].deviceNames,w);h!=-1?d.lan[f].deviceNames.splice(h,1):(d.lan[f].deviceNames===null&&(d.lan[f].deviceNames=[]),d.lan[f].deviceNames.push(w))},v=(y,f)=>{const w=y.target.value;for(let h=0;h<d.wan.length;h++)if(h!=f){const _=p(d.wan[h].deviceNames,w);_!=-1&&d.wan[h].deviceNames.splice(_,1)}for(let h=0;h<d.lan.length;h++){const _=p(d.lan[h].deviceNames,w);_!=-1&&d.lan[h].deviceNames.splice(_,1)}d.wan[f].deviceNames=[w]},b=()=>L(this,null,function*(){u.value=!0;const y=[];for(let F=0;F<d.wan.length;F++){const w=d.wan[F];y.push({name:w.name,proto:w.proto,devices:w.deviceNames||[],firewallType:w.firewallType})}for(let F=0;F<d.lan.length;F++){const w=d.lan[F];if(w.name===\"lan\"&&(!w.deviceNames||w.deviceNames.length==0)&&!confirm(n(\"LAN\\u53E3\\u672A\\u5173\\u8054\\u4EFB\\u4F55\\u7269\\u7406\\u7F51\\u53E3\\uFF0C\\u53EF\\u80FD\\u5BFC\\u81F4\\u8DEF\\u7531\\u5668\\u5931\\u8054\\uFF0C\\u662F\\u5426\\u7EE7\\u7EED\\u64CD\\u4F5C\\uFF1F\"))){u.value=!1;return}y.push({name:w.name,proto:w.proto,devices:w.deviceNames||[],firewallType:w.firewallType})}const f=$.Loading(n(\"\\u4FDD\\u5B58\\u4E2D...\"));try{const F=yield G.Network.POSTInterfaceConfig.POST({configs:y});if(F.data){const{success:w,result:h,error:_}=F.data;if(_)throw _;(w||0)==0&&$.Success(n(\"\\u914D\\u7F6E\\u6210\\u529F\"))}}catch(F){$.Error(`${F}`)}finally{f.Close(),u.value=!1}});return(y,f)=>(r(),s(\"div\",FC,[t(\"h2\",EC,i(e(n)(\"\\u7F51\\u53E3\\u914D\\u7F6E\")),1),t(\"div\",$C,[t(\"div\",CC,[t(\"div\",DC,[(r(!0),s(U,null,tt(e(l).devices,F=>(r(),s(\"div\",{class:\"header-cell device-col\",key:F.name},[t(\"div\",BC,[Y(tC,{item:F},null,8,[\"item\"])])]))),128)),YC,AC,SC]),t(\"div\",zC,[(r(!0),s(U,null,tt(e(d).lan,(F,w)=>(r(),s(\"div\",{key:w,class:\"table-row\"},[(r(!0),s(U,null,tt(e(l).devices,h=>(r(),s(\"div\",{class:\"table-cell device-col\",key:h.name},[O(t(\"input\",{type:\"checkbox\",name:h.name,value:h.name,\"onUpdate:modelValue\":_=>F.deviceNames=_,onInput:_=>m(_,w)},null,40,PC),[[Rt,F.deviceNames]])]))),128)),TC,t(\"div\",IC,[t(\"b\",null,i(F.name),1)]),t(\"div\",MC,[t(\"button\",{class:\"btn cbi-button cbi-button-apply\",title:e(n)(\"\\u7F16\\u8F91\"),onClick:h=>g(\"lan\",w)},i(e(n)(\"\\u7F16\\u8F91\")),9,LC),w!==0?(r(),s(\"button\",{key:0,class:\"cbi-button cbi-button-remove\",onClick:h=>k(\"lan\",w)},i(e(n)(\"\\u5220\\u9664\")),9,OC)):D(\"\",!0)])]))),128)),t(\"div\",{class:\"table-row add-row\",onClick:f[0]||(f[0]=F=>g(\"lan\"))},[(r(!0),s(U,null,tt(e(l).devices,F=>(r(),s(\"div\",{class:\"table-cell device-col\",key:F.name}))),128)),NC,VC,t(\"div\",GC,[Y(Pa,{class:\"icon\"})])]),(r(!0),s(U,null,tt(e(d).wan,(F,w)=>(r(),s(\"div\",{key:w,class:\"table-row\"},[(r(!0),s(U,null,tt(e(l).devices,h=>(r(),s(\"div\",{class:\"table-cell device-col\",key:h.name},[O(t(\"input\",{type:\"checkbox\",name:h.name,value:h.name,\"onUpdate:modelValue\":_=>F.deviceNames=_,onInput:_=>v(_,w)},null,40,jC),[[Rt,F.deviceNames]])]))),128)),UC,t(\"div\",qC,[t(\"b\",null,i(F.name),1)]),t(\"div\",RC,[t(\"button\",{class:\"btn cbi-button cbi-button-apply\",title:e(n)(\"\\u7F16\\u8F91\"),onClick:h=>g(\"wan\",w)},i(e(n)(\"\\u7F16\\u8F91\")),9,WC),w!==0?(r(),s(\"button\",{key:0,class:\"cbi-button cbi-button-remove\",onClick:h=>k(\"wan\",w)},i(e(n)(\"\\u5220\\u9664\")),9,HC)):D(\"\",!0)])]))),128)),t(\"div\",{class:\"table-row add-row\",onClick:f[1]||(f[1]=F=>g(\"wan\"))},[(r(!0),s(U,null,tt(e(l).devices,F=>(r(),s(\"div\",{class:\"table-cell device-col\",key:F.name}))),128)),JC,ZC,t(\"div\",KC,[Y(Pa,{class:\"icon\"})])])])])]),t(\"div\",QC,[t(\"input\",{class:\"btn cbi-button cbi-button-apply\",type:\"button\",value:e(n)(\"\\u4FDD\\u5B58\\u5E76\\u5E94\\u7528\"),onClick:b,disabled:u.value},null,8,XC)])]))}});var eD=N(tD,[[\"__scopeId\",\"data-v-3dabb970\"]]);const aD={name:\"CustomTable\",props:{data:{type:Array,default:()=>[]},columns:{type:Array,required:!0,validator:o=>o.every(n=>n.label&&n.prop)},showSelection:{type:Boolean,default:!1},rowKey:{type:String,default:\"id\"},showPagination:{type:Boolean,default:!0},pageSize:{type:Number,default:10},currentPage:{type:Number,default:1},emptyText:{type:String,default:\"\\u6682\\u65E0\\u6570\\u636E\"},maxPagerCount:{type:Number,default:5},theadBgColor:{type:String,default:\"#F8F8F8\"}},emits:[\"selection-change\",\"update:currentPage\",\"page-change\"],setup(o,{emit:n}){const{$gettext:a}=J(),l=E([]),u=E(!1),d=E(!1);E(null);const c=Q(()=>o.data.length),k=Q(()=>Math.ceil(c.value/o.pageSize)),g=Q(()=>{if(!o.showPagination)return o.data;const C=(o.currentPage-1)*o.pageSize,S=C+o.pageSize;return o.data.slice(C,S)}),p=Q(()=>(o.currentPage-1)*o.pageSize+1),m=Q(()=>{const C=o.currentPage*o.pageSize;return C>c.value?c.value:C}),v=Q(()=>({minWidth:`${o.columns.reduce((S,A)=>S+(parseInt(A.width)||50),o.showSelection?50:0)}px`})),b=Q(()=>{const C=[],S=Math.floor(o.maxPagerCount/2);let A=o.currentPage-S,z=o.currentPage+S;A<1&&(A=1,z=Math.min(o.maxPagerCount,k.value)),z>k.value&&(z=k.value,A=Math.max(1,z-o.maxPagerCount+1));for(let B=A;B<=z;B++)C.push(B);return C}),y=C=>({width:C.width?`${Math.max(50,parseInt(C.width))}px`:\"auto\",minWidth:\"50px\",textAlign:C.align||\"center\"}),f=()=>{u.value?l.value=[...g.value.map(C=>C[o.rowKey])]:l.value=[],h()},F=()=>{u.value=l.value.length===g.value.length&&g.value.length>0,h()},w=(C,S)=>{S?l.value.includes(C)||l.value.push(C):l.value=l.value.filter(A=>A!==C),F()},h=()=>{const C=o.data.filter(S=>l.value.includes(S[o.rowKey]));n(\"selection-change\",C)},_=C=>{C<1||C>k.value||(n(\"update:currentPage\",C),n(\"page-change\",C))},x=()=>{d.value=window.innerWidth<=768};return $t(()=>o.data,()=>{l.value=[],u.value=!1},{deep:!0}),Pt(()=>{x(),window.addEventListener(\"resize\",x)}),Nt(()=>{window.removeEventListener(\"resize\",x)}),{selectedRows:l,allSelected:u,isMobile:d,total:c,totalPages:k,paginatedData:g,startItem:p,endItem:m,visiblePages:b,tableStyle:v,gettext:a,getColumnStyle:y,toggleAllSelection:f,handleSelectionChange:F,changePage:_,updateSelection:w}}},oD={class:\"custom-table-container\"},nD={key:0,class:\"selection-header\"},iD={key:0,class:\"selection-cell\"},rD=[\"checked\",\"onChange\"],sD={key:0,class:\"empty-row\"},dD=[\"colspan\"],lD={key:0,class:\"pagination-wrapper\"},uD={class:\"pagination-info\"},cD={class:\"pagination-controls\"},pD=[\"disabled\"],fD=[\"onClick\"],mD=[\"disabled\"];function gD(o,n,a,l,u,d){return r(),s(\"div\",oD,[t(\"div\",{class:\"custom-table-wrapper\",style:ht({overflowX:l.isMobile?\"auto\":\"hidden\"})},[t(\"table\",{class:lt([\"custom-table\",{\"has-selection\":a.showSelection}]),style:ht(l.tableStyle)},[t(\"thead\",{style:ht({background:a.theadBgColor})},[t(\"tr\",null,[a.showSelection?(r(),s(\"th\",nD,[O(t(\"input\",{type:\"checkbox\",\"onUpdate:modelValue\":n[0]||(n[0]=c=>l.allSelected=c),onChange:n[1]||(n[1]=(...c)=>l.toggleAllSelection&&l.toggleAllSelection(...c))},null,544),[[Rt,l.allSelected]])])):D(\"\",!0),(r(!0),s(U,null,tt(a.columns,(c,k)=>(r(),s(\"th\",{key:k,style:ht(l.getColumnStyle(c))},i(l.gettext(c.label)),5))),128))])],4),t(\"tbody\",null,[(r(!0),s(U,null,tt(l.paginatedData,(c,k)=>(r(),s(\"tr\",{key:k,class:lt({\"last-row\":k===l.paginatedData.length-1})},[a.showSelection?(r(),s(\"td\",iD,[t(\"input\",{type:\"checkbox\",checked:l.selectedRows.includes(c[a.rowKey]),onChange:g=>l.updateSelection(c[a.rowKey],g.target.checked)},null,40,rD)])):D(\"\",!0),(r(!0),s(U,null,tt(a.columns,(g,p)=>(r(),s(\"td\",{key:p,style:ht({textAlign:g.align||\"center\"})},[g.slot?Yt(o.$slots,g.slot,{key:0,row:c,index:k},void 0,!0):(r(),s(U,{key:1},[dt(i(c[g.prop]),1)],64))],4))),128))],2))),128)),l.paginatedData.length===0?(r(),s(\"tr\",sD,[t(\"td\",{colspan:a.showSelection?a.columns.length+1:a.columns.length},i(a.emptyText),9,dD)])):D(\"\",!0)])],6)],4),a.showPagination?(r(),s(\"div\",lD,[t(\"div\",uD,i(l.gettext(\"\\u663E\\u793A\"))+\" \"+i(l.startItem)+\" \"+i(l.gettext(\"\\u5230\"))+\" \"+i(l.endItem)+\" \"+i(l.gettext(\"\\u6761\"))+\"\\uFF0C\"+i(l.gettext(\"\\u5171\"))+\" \"+i(l.total)+\" \"+i(l.gettext(\"\\u6761\")),1),t(\"div\",cD,[t(\"button\",{disabled:a.currentPage===1,onClick:n[2]||(n[2]=c=>l.changePage(a.currentPage-1))},i(l.gettext(\"\\u4E0A\\u4E00\\u9875\")),9,pD),(r(!0),s(U,null,tt(l.visiblePages,c=>(r(),s(\"button\",{key:c,class:lt({active:c===a.currentPage}),onClick:k=>l.changePage(c)},i(c),11,fD))),128)),t(\"button\",{disabled:a.currentPage===l.totalPages,onClick:n[3]||(n[3]=c=>l.changePage(a.currentPage+1))},i(l.gettext(\"\\u4E0B\\u4E00\\u9875\")),9,mD)])])):D(\"\",!0)])}var Ue=N(aD,[[\"render\",gD],[\"__scopeId\",\"data-v-6c49427e\"]]);const uo=o=>(ut(\"data-v-9eb77922\"),o=o(),ct(),o),vD={style:{display:\"flex\",\"align-items\":\"center\"}},bD={class:\"search_box\"},hD={class:\"search_container\"},_D={class:\"search_input_wrapper\"},xD=[\"onKeyup\",\"placeholder\"],wD=uo(()=>t(\"path\",{d:\"M15.5 14h-.79l-.28-.27a6.5 6.5 0 0 0 1.48-5.34c-.47-2.78-2.79-5-5.59-5.34a6.505 6.505 0 0 0-7.27 7.27c.34 2.8 2.56 5.12 5.34 5.59a6.5 6.5 0 0 0 5.34-1.48l.27.28v.79l4.25 4.25c.41.41 1.08.41 1.49 0 .41-.41.41-1.08 0-1.49L15.5 14zm-6 0C7.01 14 5 11.99 5 9.5S7.01 5 9.5 5 14 7.01 14 9.5 11.99 14 9.5 14z\"},null,-1)),kD=[wD],yD=uo(()=>t(\"svg\",{class:\"refresh_icon\",viewBox:\"0 0 24 24\",width:\"26\",height:\"26\"},[t(\"path\",{d:\"M17.65 6.35C16.2 4.9 14.21 4 12 4c-4.42 0-7.99 3.58-7.99 8s3.57 8 7.99 8c3.73 0 6.84-2.55 7.73-6h-2.08c-.82 2.33-3.04 4-5.65 4-3.31 0-6-2.69-6-6s2.69-6 6-6c1.66 0 3.14.69 4.22 1.78L13 11h7V4l-2.35 2.35z\"})],-1)),FD=[yD],ED=I({props:{showBatchDelete:{type:Boolean,default:!0},showAdd:{type:Boolean,default:!0}},emits:[\"refresh\",\"batch-delete\",\"search\",\"handleAdd\"],setup(o,{emit:n}){const a=o,{$gettext:l}=J(),u=E(\"\"),d=E(!1),c=E(a.showBatchDelete),k=E(a.showAdd),g=()=>{n(\"refresh\",{data:\"\\u8FD9\\u662F\\u5B50\\u7EC4\\u4EF6\\u7684\\u6570\\u636E\"})},p=()=>{n(\"search\",String(u.value))},m=()=>{n(\"batch-delete\",{data:\"\\u8FD9\\u662F\\u5B50\\u7EC4\\u4EF6\\u7684\\u6570\\u636E\"})},v=()=>{n(\"handleAdd\")};return(b,y)=>(r(),s(\"div\",vD,[k.value?(r(),s(\"button\",{key:0,class:\"del-button add-button--danger\",style:{},onClick:v},[t(\"span\",null,i(e(l)(\"\\u6DFB\\u52A0\")),1)])):D(\"\",!0),c.value?(r(),s(\"button\",{key:1,class:\"del-button del-button--danger\",onClick:m},[t(\"span\",null,i(e(l)(\"\\u6279\\u91CF\\u5220\\u9664\")),1)])):D(\"\",!0),t(\"div\",bD,[t(\"div\",hD,[t(\"div\",_D,[O(t(\"input\",{type:\"text\",onKeyup:Bo(p,[\"enter\"]),\"onUpdate:modelValue\":y[0]||(y[0]=f=>u.value=f),class:\"search_input\",placeholder:e(l)(\"\\u8BF7\\u8F93\\u5165\\u540D\\u79F0/IP/MAC\\u2026\")},null,40,xD),[[at,u.value,void 0,{trim:!0}]]),t(\"svg\",{class:\"search_icon\",viewBox:\"0 0 24 24\",width:\"24\",height:\"24\",onClick:p},kD)]),t(\"button\",{class:lt([\"refresh_button\",{rotate:d.value}]),onClick:g},FD,2)])])]))}});var ga=N(ED,[[\"__scopeId\",\"data-v-9eb77922\"]]);const $D={class:\"flow\"},CD={class:\"flow-data\"},DD={key:0},BD={key:1},YD=I({props:{ipParam:{type:String}},setup(o){const n=o,{$gettext:a}=J();Xe([Ma,La,Oa,ta,ea,Na]);const l=E(n.ipParam),u=E(),d=w=>{var _;const h=(_=u.value)==null?void 0:_[w];return!h||h.startTime==0?\"\":v(h.startTime*1e3)+\"-\"+v(h.endTime*1e3)},c=Q(()=>{var h;let w=[];return(h=u.value)==null||h.forEach(_=>{w.push({value:_.uploadSpeed})}),w}),k=Q(()=>{var h;let w=[];return(h=u.value)==null||h.forEach(_=>{w.push({value:_.downloadSpeed})}),w}),g=Q(()=>{var h;let w=\"\";if(u.value){let _=((h=u.value)==null?void 0:h.length)||0;if(_>0){let x=u.value[_-1];w=b(x.uploadSpeed)+\"/s\"}}return w}),p=Q(()=>{var h;let w=\"\";if(u.value){let _=((h=u.value)==null?void 0:h.length)||0;if(_>0){let x=u.value[_-1];w=b(x.downloadSpeed)+\"/s\"}}return w}),m=()=>L(this,null,function*(){var w;try{const h=yield G.DeviceMangement.speedsForOneDevice.POST({ip:l.value});if(h.data&&(w=h.data.result)!=null&&w.items){const _=h.data.result.slots||10;if(h.data.result.items.length<_){let x=h.data.result.items;for(;x.length<_;)x=[{downloadSpeed:0,endTime:0,startTime:0,uploadSpeed:0}].concat(x);u.value=x}else h.data.result.items.length>_?u.value=h.data.result.items.slice(_-h.data.result.items.length):u.value=h.data.result.items}}catch(h){console.log(h)}}),v=Mt.dateForm,b=Mt.byteToSize,y=E();let f=null;const F=w=>{const h=Ha();return f=aa(w,h?\"dark\":\"light\"),f.setOption({animation:!1,backgroundColor:h?\"#88888822\":\"#fff\",color:[\"transparent\",\"transparent\"],tooltip:{trigger:\"axis\",formatter:_=>{if(Array.isArray(_)){let x=\"\";_.length>0&&(x=d(_[0].axisValue));for(let C=0;C<_.length;C++)x=`${x}<br>${_[C].seriesName}: ${b(_[C].value)}/s`;return x.toString()}else{const x=_;return`${d(x.axisValue)}<br>${x.seriesName}: ${b(x.value)}/s`}}},xAxis:{type:\"category\",boundaryGap:!1,splitLine:{lineStyle:{color:[\"#999\"]},show:!1},name:\"\",show:!1,nameGap:0,nameTextStyle:{height:0,lineHeight:0,padding:0}},title:{text:a(\"\\u6D41\\u91CF\\u7EDF\\u8BA1\"),textStyle:{fontSize:12,color:h?\"#cccccc\":\"rgba(0, 0, 0, 0.6)\"},top:\"10px\",left:\"10px\"},yAxis:{type:\"value\",name:\"\",minInterval:1e4,interval:1e3,axisLabel:{formatter:function(_,x){return`${b(_)}/s`},color:\"#fff\",show:!1},nameTextStyle:{color:\"#fff\"},splitLine:{lineStyle:{color:[\"#999\"]},show:!1}},series:[{name:a(\"\\u4E0B\\u8F7D\"),data:k.value,type:\"line\",symbol:\"none\",showSymbol:!1,symbolSize:0,smooth:!0,areaStyle:{color:{type:\"linear\",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:\"rgba(32, 199, 247, 1)\"},{offset:1,color:\"rgba(32, 199, 247, 0.1)\"}],global:!1}}},{name:a(\"\\u4E0A\\u4F20\"),data:c.value,type:\"line\",symbol:\"none\",showSymbol:!1,symbolSize:0,smooth:!0,areaStyle:{color:{type:\"linear\",x:0,y:0,x2:0,y2:1,colorStops:[{offset:0,color:\"rgba(85, 58, 254, 1)\"},{offset:1,color:\"rgba(85, 58, 254, 0.1)\"}],global:!1}}}],legend:{padding:0,align:\"right\",top:\"10px\",data:[{name:a(\"\\u4E0A\\u4F20\"),itemStyle:{color:\"rgb(85, 58, 254)\"}},{name:a(\"\\u4E0B\\u8F7D\"),itemStyle:{color:\"rgb(32, 199, 247)\"}}],textStyle:{color:h?\"#cccccc\":\"rgba(0, 0, 0, 0.6)\"},lineStyle:{color:\"#333\"}},grid:{left:\"2%\",right:\"2%\",bottom:\"0%\",top:\"10%\",containLabel:!0}}),f};return Pt(()=>{setTimeout(()=>L(this,null,function*(){if(y.value){yield m();const w=F(y.value),h=y.value;w.resize({width:h.clientWidth,height:h.clientHeight}),window.addEventListener(\"resize\",()=>{w.resize({width:h.clientWidth,height:h.clientHeight})});const _=()=>L(this,null,function*(){if(f!=null){if(!document.hidden){if(yield m(),f==null)return;w.setOption({series:[{name:a(\"\\u4E0B\\u8F7D\"),data:k.value,type:\"line\",areaStyle:{},smooth:!0},{name:a(\"\\u4E0A\\u4F20\"),data:c.value,type:\"line\",areaStyle:{},smooth:!0}]})}setTimeout(_,5e3)}});setTimeout(_,5e3)}}),900)}),Nt(()=>{f!=null&&(f.dispose(),f=null)}),(w,h)=>(r(),s(\"div\",$D,[t(\"div\",{ref_key:\"el\",ref:y,class:\"echart\"},null,512),t(\"div\",CD,[e(g)?(r(),s(\"span\",DD,i(e(a)(\"\\u4E0A\\u4F20:\"))+\" \"+i(e(g)),1)):D(\"\",!0),e(p)?(r(),s(\"span\",BD,i(e(a)(\"\\u4E0B\\u8F7D:\"))+\" \"+i(e(p)),1)):D(\"\",!0)])]))}});var AD=N(YD,[[\"__scopeId\",\"data-v-4a18630f\"]]);const $e=o=>(ut(\"data-v-586a633c\"),o=o(),ct(),o),SD={class:\"container\"},zD={style:{display:\"flex\",\"justify-content\":\"end\"}},PD=[\"onClick\"],TD=[\"onClick\"],ID=[\"onClick\"],MD={class:\"custom-content\"},LD={class:\"IP_address\"},OD={class:\"item_box\"},ND={class:\"item_left\"},VD={key:0,class:\"tip\"},GD=[\"onClick\"],jD={key:1},UD={class:\"item_box\"},qD={class:\"item_left\"},RD={class:\"item_box\"},WD={class:\"item_left\"},HD=[\"placeholder\"],JD={class:\"item_box\"},ZD={class:\"item_left\"},KD=[\"placeholder\"],QD={class:\"item_box\"},XD={class:\"item_left\"},tB=[\"placeholder\"],eB={class:\"custom-content\"},aB=$e(()=>t(\"div\",{class:\"img_box\"},[t(\"img\",{src:\"https://fwindex.koolcenter.com/cover/x86_64/cover.png\",alt:\"\"})],-1)),oB={class:\"item_box\"},nB={class:\"item_left\"},iB=[\"placeholder\"],rB={class:\"item_box\"},sB=$e(()=>t(\"div\",{class:\"item_left\"},\"MAC\\uFF1A\",-1)),dB=[\"placeholder\"],lB={class:\"item_box\"},uB={class:\"item_left\"},cB={key:0,value:null,disabled:\"\"},pB=[\"value\"],fB={class:\"item_box\"},mB={class:\"item_left\"},gB={key:0,class:\"item_box\"},vB=$e(()=>t(\"div\",{class:\"item_left\"},\"IP\\uFF1A\",-1)),bB=[\"placeholder\"],hB={class:\"custom-content\"},_B={class:\"info-content\"},xB=$e(()=>t(\"div\",{class:\"img_box\"},[t(\"img\",{src:\"https://fwindex.koolcenter.com/cover/x86_64/cover.png\",alt:\"\"})],-1)),wB={style:{\"margin-bottom\":\"16px\",flex:\"1\"}},kB={class:\"item_box\"},yB={class:\"item_left\"},FB={class:\"item_box\"},EB={class:\"item_left\"},$B={class:\"item_box\"},CB=$e(()=>t(\"div\",{class:\"item_left\"},\" MAC\\uFF1A\",-1)),DB={class:\"item_box\"},BB={class:\"item_left\"},YB={class:\"item_box\"},AB={class:\"item_left\"},SB={class:\"item_box\"},zB={class:\"item_left\"},PB=I({emits:[\"openGloba\"],setup(o,{emit:n}){const{$gettext:a}=J(),l=P=>{H.hostname=P.target.value.replace(/[\\u4e00-\\u9fa5\\s]/g,\"\")},u=E(null),d=()=>{c(),A(),u.value=setInterval(A,3e3)},c=()=>{u.value&&(clearInterval(u.value),u.value=null)};Pt(()=>L(this,null,function*(){yield C(),p.value.length!==0&&d()})),Nt(()=>{c()});const k=E({});(()=>L(this,null,function*(){try{const{data:P}=yield G.DeviceMangement.globalConfigs.GET();P.result&&(k.value=P.result||{})}catch(P){}}))();const p=E([]),m=E([]),v=E(!1),b=E(!1),y=E(!1),f=Q(()=>!H.dhcpGateway),F=E([{label:\"\\u4E3B\\u673A\\u540D\\u79F0\",prop:\"hostname\"},{label:\"IP\\u5730\\u5740\",prop:\"ip\"},{label:\"MAC\\u5730\\u5740\",prop:\"mac\"},{label:\"\\u4E0A\\u4F20\\u901F\\u5EA6\",prop:\"uploadSpeedStr\"},{label:\"\\u4E0B\\u8F7D\\u901F\\u5EA6\",prop:\"downloadSpeedStr\"},{label:\"\\u6807\\u7B7E\",prop:\"staticAssigned\",slot:\"staticAssigned\"},{label:\"\\u64CD\\u4F5C\",prop:\"action\",slot:\"action\"}]),w=P=>({default:a(\"\\u9ED8\\u8BA4\\u7F51\\u5173\"),parent:a(\"\\u4E0A\\u7EA7\\u8DEF\\u7531\"),myself:a(\"\\u672C\\u8BBE\\u5907\"),bypass:a(\"\\u65C1\\u8DEF\\u7531\"),floatip:a(\"\\u6D6E\\u52A8\\u7F51\\u5173\")})[P]||P,h=()=>{v.value=!1,n(\"openGloba\")},_=P=>{var X,et;if(P==!0&&!((et=(X=k.value)==null?void 0:X.speedLimit)!=null&&et.enabled))return $.Warning(a(\"\\u8BF7\\u524D\\u5F80\\u5168\\u5C40\\u914D\\u7F6E\\u5F00\\u542F\\u9650\\u901F\"))},x=E([]),C=()=>L(this,null,function*(){var X,et,rt;let P=$.Loading(a(\"\\u52A0\\u8F7D\\u4E2D...\"));try{const{data:kt}=yield G.DeviceMangement.listDevices.GET();kt.result&&(p.value=((X=kt.result)==null?void 0:X.devices)||[],m.value=((et=kt.result)==null?void 0:et.devices)||[],x.value=((rt=kt.result)==null?void 0:rt.dhcpTags)||[])}catch(kt){}finally{P.Close()}}),S=(P,X)=>{const et={};return P.forEach(rt=>{rt.ip&&(et[rt.ip]={downloadSpeedStr:rt.downloadSpeedStr||\"0 B\",uploadSpeedStr:rt.uploadSpeedStr||\"0 B\"})}),X.map(rt=>rt.ip&&et[rt.ip]?vt(st({},rt),{downloadSpeedStr:et[rt.ip].downloadSpeedStr,uploadSpeedStr:et[rt.ip].uploadSpeedStr}):vt(st({},rt),{downloadSpeedStr:rt.downloadSpeedStr||\"0 B\",uploadSpeedStr:rt.uploadSpeedStr||\"0 B\"}))},A=()=>L(this,null,function*(){try{const{data:P}=yield G.DeviceMangement.speedsForDevices.GET();P.result&&(m.value=S(P.result,m.value))}catch(P){}}),z=P=>/^[a-zA-Z\\s]+$/.test(P)?P.toUpperCase():P,B=gt({ip:\"\",mac:\"\",uploadSpeed:100,downloadSpeed:1e3,networkAccess:!1,enabled:!1,comment:\"\",action:\"add\"}),H=gt({hostname:\"\",assignedIP:\"\",assignedMac:\"\",bindIP:!1,tagTitle:\"\",tagName:\"\",dhcpGateway:\"\",action:\"add\"}),M=E(\"\"),q=E({}),T=(P,X)=>{var et,rt,kt,Tt,Ft,ne,ie,re,se,de,le,ue,ce,pe,fe,me;q.value=P,X===1?(B.ip=P.ip||\"\",B.mac=P.mac||\"\",B.uploadSpeed=((et=P==null?void 0:P.speedLimit)==null?void 0:et.uploadSpeed)||100,B.downloadSpeed=((rt=P==null?void 0:P.speedLimit)==null?void 0:rt.downloadSpeed)||1e3,B.networkAccess=!((kt=P==null?void 0:P.speedLimit)!=null&&kt.networkAccess)||!1,B.enabled=((Tt=P==null?void 0:P.speedLimit)==null?void 0:Tt.enabled)||!1,B.comment=((Ft=P==null?void 0:P.speedLimit)==null?void 0:Ft.comment)||\"\",B.action=((ne=P==null?void 0:P.speedLimit)==null?void 0:ne.action)||\"add\",v.value=!0):X===2?(H.hostname=((ie=P==null?void 0:P.staticAssigned)==null?void 0:ie.hostname)||\"\",H.assignedIP=((re=P==null?void 0:P.staticAssigned)==null?void 0:re.assignedIP)||\"\",H.assignedMac=((se=P==null?void 0:P.staticAssigned)==null?void 0:se.assignedMac)||\"\",H.bindIP=((de=P==null?void 0:P.staticAssigned)==null?void 0:de.bindIP)||!1,H.tagTitle=((le=P==null?void 0:P.staticAssigned)==null?void 0:le.tagTitle)||\"\",H.tagName=((ue=P==null?void 0:P.staticAssigned)==null?void 0:ue.tagName)||\"\",(ce=P==null?void 0:P.staticAssigned)!=null&&ce.dhcpGateway?(x.value.forEach(ge=>{var Et;ge.gateway===((Et=P==null?void 0:P.staticAssigned)==null?void 0:Et.dhcpGateway)&&(j.value=ge)}),H.dhcpGateway=((fe=P==null?void 0:P.staticAssigned)==null?void 0:fe.dhcpGateway)||x.value[0]||\"\"):(j.value=x.value[0]||null,H.dhcpGateway=((pe=j.value)==null?void 0:pe.gateway)||\"\"),H.action=((me=P==null?void 0:P.staticAssigned)==null?void 0:me.action)||\"add\",b.value=!0):X===3&&(M.value=\"\",M.value=P.ip,y.value=!0)},j=E(x.value[0]||null),R=()=>{var P,X,et;j.value?(H.dhcpGateway=((P=j.value)==null?void 0:P.gateway)||\"\",H.tagName=((X=j.value)==null?void 0:X.tagName)||\"\",H.tagTitle=((et=j.value)==null?void 0:et.tagTitle)||\"\"):(H.dhcpGateway=\"\",H.tagName=\"\",H.tagTitle=\"\")},it=(P,X)=>X?{ip:/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,mac:/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$|^([0-9A-Fa-f]{4}\\.){2}([0-9A-Fa-f]{4})$/}[P].test(X.trim()):!1,ot=P=>/^([1-9]\\d*(\\.\\d+)?|0\\.\\d*[1-9]\\d*)$/.test(P.toString()),bt=()=>L(this,null,function*(){if(!H.hostname)return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\")}${a(\"\\u540D\\u79F0\")}`);if(!H.assignedMac)return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\")}${a(\"MAC\")}`);if(!it(\"mac\",H.assignedMac))return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684MAC\\u5730\\u5740\")}`);if(!H.dhcpGateway)return $.Warning(`${a(\"\\u8BF7\\u9009\\u62E9\")}${a(\"\\u7F51\\u5173\")}`);if(H.bindIP){if(!H.assignedIP)return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\")}${a(\"IP\")}`);if(!it(\"ip\",H.assignedIP))return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684IP\\u5730\\u5740\")}`)}else H.assignedIP=\"\";let P=$.Loading(a(\"\\u4FDD\\u5B58\\u4E2D...\"));try{const{data:X}=yield G.DeviceMangement.staticDeviceConfig.POST(H);JSON.stringify(X)===\"{}\"?(b.value=!1,yt(),nt(),$.Success(\"\\u4FDD\\u5B58\\u6210\\u529F !\")):$.Success((X==null?void 0:X.error)||\"\\u4FDD\\u5B58\\u5931\\u8D25\\uFF01\")}catch(X){$.Warning(`${X==null?void 0:X.error} || ${X==null?void 0:X.message}`)}finally{P.Close()}}),Dt=()=>L(this,null,function*(){var X,et;if(!((et=(X=k.value)==null?void 0:X.speedLimit)!=null&&et.enabled))return $.Warning(a(\"\\u8BF7\\u524D\\u5F80\\u5168\\u5C40\\u914D\\u7F6E\\u5F00\\u542F\\u9650\\u901F\"));if(B.networkAccess)B.downloadSpeed=0,B.uploadSpeed=0;else{if(!B.downloadSpeed)return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\")}${a(\"\\u4E0B\\u8F7D\\u901F\\u5EA6\")}`);if(!ot(B.downloadSpeed))return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684\\u4E0B\\u8F7D\\u901F\\u5EA6\")}`);if(!B.uploadSpeed)return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\")}${a(\"\\u4E0A\\u4F20\\u901F\\u5EA6\")}`);if(!ot(B.uploadSpeed))return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684\\u4E0A\\u4F20\\u901F\\u5EA6\")}`);B.downloadSpeed=Number(B.downloadSpeed),B.uploadSpeed=Number(B.uploadSpeed)}let P=$.Loading(a(\"\\u4FDD\\u5B58\\u4E2D...\"));try{B.networkAccess=!B.networkAccess;const{data:rt}=yield G.DeviceMangement.speedLimitConfig.POST(B);JSON.stringify(rt)===\"{}\"?(v.value=!1,yt(),nt(),$.Success(\"\\u4FDD\\u5B58\\u6210\\u529F !\")):$.Success((rt==null?void 0:rt.error)||\"\\u4FDD\\u5B58\\u5931\\u8D25\\uFF01\")}catch(rt){$.Warning(`${rt==null?void 0:rt.error} || ${rt==null?void 0:rt.message}`)}finally{B.downloadSpeed=1e3,B.uploadSpeed=100,P.Close()}}),yt=()=>{q.value={},j.value=x.value[0]||null,H.hostname=\"\",H.assignedIP=\"\",H.assignedMac=\"\",H.bindIP=!1,H.dhcpGateway=\"\",H.tagName=\"\",H.tagTitle=\"\",H.action=\"add\",B.ip=\"\",B.mac=\"\",B.uploadSpeed=100,B.downloadSpeed=1e3,B.networkAccess=!1,B.comment=\"\",B.action=\"add\"},Vt=E([]),Re=E(null),nt=()=>L(this,null,function*(){p.value=[],yield C()}),K=P=>p.value.filter(X=>{const et=X.ip.includes(P),rt=X.mac.toLowerCase().includes(P.toLowerCase());return et||rt}),At=P=>{P===\"\"&&(m.value=p.value),m.value=K(P)},mt=()=>{if(Vt.value.length===0)return $.Warning(a(\"\\u8BF7\\u52FE\\u9009\\u8981\\u5220\\u9664\\u7684\\u6570\\u636E\")+\" !\")};return(P,X)=>(r(),s(\"div\",SD,[t(\"div\",zD,[Y(ga,{onRefresh:nt,showAdd:!1,showBatchDelete:!1,ref_key:\"searchRef\",ref:Re,onBatchDelete:mt,onSearch:At},null,512)]),t(\"div\",null,[Y(Ue,{data:m.value,columns:F.value,showPagination:!1},{action:V(({row:et})=>[t(\"span\",{style:{color:\"#553AFE\",cursor:\"pointer\"},onClick:rt=>T(et,2)},i(e(a)(\"\\u9759\\u6001\\u5206\\u914D\")),9,PD),t(\"span\",{style:{color:\"#553AFE\",cursor:\"pointer\",margin:\"0 8px\"},onClick:rt=>T(et,1)},i(e(a)(\"\\u9650\\u901F\\u914D\\u7F6E\")),9,TD),t(\"span\",{style:{color:\"#553AFE\",margin:\"0 8px\",cursor:\"pointer\"},onClick:rt=>T(et,3)},i(e(a)(\"\\u8BE6\\u60C5\")),9,ID)]),staticAssigned:V(({row:et})=>{var rt,kt;return[t(\"span\",null,i(w((rt=et==null?void 0:et.staticAssigned)==null?void 0:rt.tagTitle)||w((kt=et==null?void 0:et.staticAssigned)==null?void 0:kt.tagName)||\"-\"),1)]}),_:1},8,[\"data\",\"columns\"])]),Y(Xt,{modelValue:v.value,\"onUpdate:modelValue\":X[6]||(X[6]=et=>v.value=et),title:\"\\u9650\\u901F\\u914D\\u7F6E\",\"show-close\":!0,onConfirm:Dt,onCancel:yt},{default:V(()=>{var et,rt,kt,Tt;return[t(\"div\",MD,[t(\"div\",LD,\"IP: \"+i(q.value.ip),1),t(\"div\",OD,[t(\"div\",ND,i(e(a)(\"\\u5BF9\\u8BBE\\u5907\\u5F00\\u542F\\u9650\\u901F\"))+\"\\uFF1A\",1),Y(Ot,{modelValue:e(B).enabled,\"onUpdate:modelValue\":X[0]||(X[0]=Ft=>e(B).enabled=Ft),disabled:!((rt=(et=k.value)==null?void 0:et.speedLimit)!=null&&rt.enabled),onBeforeChange:_},null,8,[\"modelValue\",\"disabled\"])]),(Tt=(kt=k.value)==null?void 0:kt.speedLimit)!=null&&Tt.enabled?D(\"\",!0):(r(),s(\"div\",VD,[t(\"a\",{href:\"\",onClick:ft(h,[\"prevent\"])},i(e(a)(\"\\u70B9\\u6211\\u8DF3\\u8F6C\\u5168\\u5C40\\u914D\\u7F6E\")),9,GD)])),e(B).enabled?(r(),s(\"div\",jD,[t(\"div\",UD,[t(\"div\",qD,i(e(a)(\"\\u7981\\u6B62\\u8BE5\\u8BBE\\u5907\\u8BBF\\u95EE\\u7F51\\u7EDC\"))+\"\\uFF1A\",1),Y(Ot,{modelValue:e(B).networkAccess,\"onUpdate:modelValue\":X[1]||(X[1]=Ft=>e(B).networkAccess=Ft),onChange:X[2]||(X[2]=()=>{})},null,8,[\"modelValue\"])]),e(B).networkAccess?D(\"\",!0):(r(),s(U,{key:0},[t(\"div\",RD,[t(\"div\",WD,i(e(a)(\"\\u4E0B\\u8F7D\\u901F\\u5EA6\"))+\"\\uFF08Mbit/s\\uFF09\\uFF1A\",1),O(t(\"input\",{id:\"tagName\",type:\"text\",\"onUpdate:modelValue\":X[3]||(X[3]=Ft=>e(B).downloadSpeed=Ft),placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,HD),[[at,e(B).downloadSpeed,void 0,{trim:!0}]]),dt(\" \\xA0 \"+i(e(a)(\"\\u603B\\u5E26\\u5BBD\")),1)]),t(\"div\",JD,[t(\"div\",ZD,i(e(a)(\"\\u4E0A\\u4F20\\u901F\\u5EA6\"))+\"\\uFF08Mbit/s\\uFF09\\uFF1A\",1),O(t(\"input\",{id:\"tagName\",type:\"text\",\"onUpdate:modelValue\":X[4]||(X[4]=Ft=>e(B).uploadSpeed=Ft),placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,KD),[[at,e(B).uploadSpeed,void 0,{trim:!0}]]),dt(\" \\xA0 \"+i(e(a)(\"\\u603B\\u5E26\\u5BBD\")),1)]),t(\"div\",QD,[t(\"div\",XD,i(e(a)(\"\\u6CE8\\u89E3\"))+\"\\uFF1A\",1),O(t(\"input\",{id:\"tagName\",type:\"text\",\"onUpdate:modelValue\":X[5]||(X[5]=Ft=>e(B).comment=Ft),placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,tB),[[at,e(B).comment,void 0,{trim:!0}]])])],64))])):D(\"\",!0)])]}),_:1},8,[\"modelValue\"]),Y(Xt,{modelValue:b.value,\"onUpdate:modelValue\":X[12]||(X[12]=et=>b.value=et),title:\"\\u9759\\u6001\\u5206\\u914D\",width:\"550px\",\"show-close\":!0,onConfirm:bt,onCancel:yt},{default:V(()=>[t(\"div\",eB,[aB,t(\"div\",oB,[t(\"div\",nB,i(e(a)(\"\\u540D\\u79F0\"))+\"\\uFF1A\",1),O(t(\"input\",{id:\"tagName\",type:\"text\",onInput:l,\"onUpdate:modelValue\":X[7]||(X[7]=et=>e(H).hostname=et),placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,40,iB),[[at,e(H).hostname,void 0,{trim:!0}]])]),t(\"div\",rB,[sB,O(t(\"input\",{id:\"tagName\",type:\"text\",\"onUpdate:modelValue\":X[8]||(X[8]=et=>e(H).assignedMac=et),placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,dB),[[at,e(H).assignedMac,void 0,{trim:!0}]])]),t(\"div\",lB,[t(\"div\",uB,i(e(a)(\"\\u7F51\\u5173\"))+\"\\uFF1A\",1),O(t(\"select\",{\"onUpdate:modelValue\":X[9]||(X[9]=et=>j.value=et),onChange:R},[e(f)?(r(),s(\"option\",cB,i(e(a)(\"\\u8BF7\\u9009\\u62E9\")),1)):D(\"\",!0),(r(!0),s(U,null,tt(x.value,et=>(r(),s(\"option\",{value:et},i(et.gateway)+\"(\"+i(et.tagTitle?w(et.tagTitle):et.tagName?et.tagName:\"-\")+\") \",9,pB))),256))],544),[[pt,j.value]])]),t(\"div\",fB,[t(\"div\",mB,i(e(a)(\"MAC\\u5730\\u5740\\u4E0EIP\\u7ED1\\u5B9A\"))+\"\\uFF1A\",1),Y(Ot,{modelValue:e(H).bindIP,\"onUpdate:modelValue\":X[10]||(X[10]=et=>e(H).bindIP=et)},null,8,[\"modelValue\"])]),e(H).bindIP?(r(),s(\"div\",gB,[vB,O(t(\"input\",{id:\"tagName\",type:\"text\",\"onUpdate:modelValue\":X[11]||(X[11]=et=>e(H).assignedIP=et),placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,bB),[[at,e(H).assignedIP,void 0,{trim:!0}]])])):D(\"\",!0)])]),_:1},8,[\"modelValue\"]),Y(Xt,{modelValue:y.value,\"onUpdate:modelValue\":X[13]||(X[13]=et=>y.value=et),title:\"\\u8BE6\\u60C5\",width:\"550px\",footerShow:!1,\"show-close\":!0,onCancel:yt},{default:V(()=>{var et,rt,kt,Tt,Ft;return[t(\"div\",hB,[t(\"div\",_B,[xB,t(\"div\",wB,[t(\"div\",kB,[t(\"div\",yB,i(e(a)(\"\\u540D\\u79F0\"))+\"\\uFF1A\",1),dt(\" \"+i(q.value.hostname||\"-\"),1)]),t(\"div\",FB,[t(\"div\",EB,i(e(a)(\"IP\\u5730\\u5740\"))+\"\\uFF1A\",1),dt(\" \"+i(q.value.ip),1)]),t(\"div\",$B,[CB,dt(\" \"+i(q.value.mac),1)]),t(\"div\",DB,[t(\"div\",BB,i(e(a)(\"\\u7F51\\u5173\"))+\"\\uFF1A\",1),dt(\" \"+i(((et=q.value)==null?void 0:et.staticAssigned.dhcpGateway)||\"-\"),1)]),t(\"div\",YB,[t(\"div\",AB,i(e(a)(\"\\u63A5\\u53E3\"))+\"\\uFF1A\",1),dt(\" \"+i(z(q.value.intr)||\"-\"),1)]),t(\"div\",SB,[t(\"div\",zB,i(e(a)(\"\\u6807\\u7B7E\"))+\"\\uFF1A\",1),dt(\" \"+i(((kt=(rt=q.value)==null?void 0:rt.staticAssigned)==null?void 0:kt.tagTitle)||((Ft=(Tt=q.value)==null?void 0:Tt.staticAssigned)==null?void 0:Ft.tagName)||\"-\"),1)])])]),M.value?(r(),Z(AD,{key:0,ipParam:M.value},null,8,[\"ipParam\"])):D(\"\",!0)])]}),_:1},8,[\"modelValue\"])]))}});var TB=N(PB,[[\"__scopeId\",\"data-v-586a633c\"]]);const va=o=>(ut(\"data-v-b2212e7c\"),o=o(),ct(),o),IB={class:\"container\"},MB={style:{display:\"flex\",\"justify-content\":\"end\"}},LB=[\"onClick\"],OB=[\"onClick\"],NB={class:\"custom-content\"},VB=va(()=>t(\"div\",{class:\"img_box\"},[t(\"img\",{src:\"https://fwindex.koolcenter.com/cover/x86_64/cover.png\",alt:\"\"})],-1)),GB={class:\"item_box\"},jB={class:\"item_left\"},UB=[\"placeholder\"],qB={class:\"item_box\"},RB=va(()=>t(\"div\",{class:\"item_left\"},\"MAC\\uFF1A\",-1)),WB=[\"placeholder\"],HB={class:\"item_box\"},JB={class:\"item_left\"},ZB={key:0,value:null,disabled:\"\"},KB=[\"value\"],QB={class:\"item_box\"},XB={class:\"item_left\"},tY={key:0,class:\"item_box\"},eY=va(()=>t(\"div\",{class:\"item_left\"},\"IP\\uFF1A\",-1)),aY=[\"placeholder\"],oY=I({setup(o){const{$gettext:n}=J(),a=E([]);(()=>L(this,null,function*(){var T;try{const{data:j}=yield G.DeviceMangement.globalConfigs.GET();j.result&&(a.value=((T=j.result)==null?void 0:T.dhcpTags)||[])}catch(j){}}))();const u=E([]),d=E([]),c=E(!1),k=E([{label:\"\\u4E3B\\u673A\\u540D\\u79F0\",prop:\"hostname\"},{label:\"IP\\u5730\\u5740\",prop:\"assignedIP\"},{label:\"MAC\\u5730\\u5740\",prop:\"assignedMac\"},{label:\"\\u9759\\u6001IP\\u7ED1\\u5B9A\",prop:\"bindIP\",slot:\"bindIP\"},{label:\"\\u6807\\u7B7E\",prop:\"tagTitle\",slot:\"tagTitle\"},{label:\"\\u64CD\\u4F5C\",prop:\"action\",slot:\"action\"}]),g=T=>({default:n(\"\\u9ED8\\u8BA4\\u7F51\\u5173\"),parent:n(\"\\u4E0A\\u7EA7\\u8DEF\\u7531\"),myself:n(\"\\u672C\\u8BBE\\u5907\"),bypass:n(\"\\u65C1\\u8DEF\\u7531\"),floatip:n(\"\\u6D6E\\u52A8\\u7F51\\u5173\")})[T]||T,p=T=>{B.hostname=T.target.value.replace(/[\\u4e00-\\u9fa5\\s]/g,\"\")},m=()=>L(this,null,function*(){let T=$.Loading(n(\"\\u52A0\\u8F7D\\u4E2D...\"));try{const{data:j}=yield G.DeviceMangement.listStaticDevices.GET();j.result&&(u.value=j.result||[],d.value=j.result||[])}catch(j){}finally{T.Close()}});m();const v=E(!0),b=E([]),y=T=>{b.value=T},f=()=>L(this,null,function*(){u.value=[];let T=$.Loading(n(\"\\u52A0\\u8F7D\\u4E2D...\"));yield m(),T.Close()}),F=T=>u.value.filter(j=>{const R=j.assignedIP.includes(T),it=j.assignedMac.toLowerCase().includes(T.toLowerCase());return R||it}),w=T=>{T===\"\"&&(d.value=u.value),d.value=F(T)},h=T=>{var j;B.hostname=(T==null?void 0:T.hostname)||\"\",B.assignedIP=(T==null?void 0:T.assignedIP)||\"\",B.assignedMac=(T==null?void 0:T.assignedMac)||\"\",B.bindIP=(T==null?void 0:T.bindIP)||!1,B.tagTitle=(T==null?void 0:T.tagTitle)||\"\",B.tagName=(T==null?void 0:T.tagName)||\"\",T!=null&&T.dhcpGateway?(a.value.forEach(R=>{R.gateway===(T==null?void 0:T.dhcpGateway)&&(A.value=R)}),B.dhcpGateway=(T==null?void 0:T.dhcpGateway)||a.value[0]||\"\"):(A.value=a.value[0]||null,B.dhcpGateway=((j=A.value)==null?void 0:j.gateway)||\"\"),B.action=(T==null?void 0:T.action)||\"add\",c.value=!0},_=T=>L(this,null,function*(){if(confirm(n(\"\\u6E29\\u99A8\\u63D0\\u793A\\uFF1A\\u5220\\u9664\\u8BBE\\u5907\\u7684\\u9759\\u6001\\u5206\\u914D\\u53EF\\u80FD\\u5F71\\u54CD\\u6B64\\u8BBE\\u5907\\u7684\\u8054\\u7F51\\uFF0C\\u8BF7\\u8C28\\u614E\\u64CD\\u4F5C\\uFF01\"))){let j={hostname:T.hostname||\"\",assignedIP:T.assignedIP||\"\",assignedMac:T.assignedMac||\"\",tagTitle:T.tagTitle||\"\",bindIP:T.bindIP||!1,tagName:T.tagName||\"\",dhcpGateway:T.dhcpGateway||\"\",action:\"delete\"};x(j,1)}}),x=(T,j)=>L(this,null,function*(){let R=$.Loading(n(\"\\u5220\\u9664\\u4E2D...\"));try{const{data:it}=yield G.DeviceMangement.staticDeviceConfig.POST(T);return j==1&&(JSON.stringify(it)===\"{}\"?$.Success(\"\\u5220\\u9664\\u6210\\u529F !\"):$.Success((it==null?void 0:it.error)||\"\\u5220\\u9664\\u5931\\u8D25\\uFF01\"),m()),it}catch(it){}finally{R.Close()}}),C=()=>L(this,null,function*(){if(b.value.length===0)return $.Warning(n(\"\\u8BF7\\u52FE\\u9009\\u8981\\u5220\\u9664\\u7684\\u6570\\u636E\")+\" !\");if(confirm(n(\"\\u6E29\\u99A8\\u63D0\\u793A\\uFF1A\\u5220\\u9664\\u8BBE\\u5907\\u7684\\u9759\\u6001\\u5206\\u914D\\u53EF\\u80FD\\u5F71\\u54CD\\u6B64\\u8BBE\\u5907\\u7684\\u8054\\u7F51\\uFF0C\\u8BF7\\u8C28\\u614E\\u64CD\\u4F5C\\uFF01\")))try{const T=b.value.map(j=>{const R={hostname:j.hostname||\"\",assignedIP:j.assignedIP||\"\",assignedMac:j.assignedMac||\"\",tagTitle:j.tagTitle||\"\",bindIP:j.bindIP||!1,tagName:j.tagName||\"\",dhcpGateway:j.dhcpGateway||\"\",action:\"delete\"};return x(R)});yield Promise.all(T),$.Success(n(\"\\u6240\\u6709\\u5220\\u9664\\u64CD\\u4F5C\\u5DF2\\u5B8C\\u6210\")),m()}catch(T){}}),S=Q(()=>!B.dhcpGateway),A=E(null),z=()=>{var T,j,R;A.value?(B.dhcpGateway=((T=A.value)==null?void 0:T.gateway)||\"\",B.tagName=((j=A.value)==null?void 0:j.tagName)||\"\",B.tagTitle=((R=A.value)==null?void 0:R.tagTitle)||\"\"):(B.dhcpGateway=\"\",B.tagName=\"\",B.tagTitle=\"\")},B=gt({hostname:\"\",assignedIP:\"\",assignedMac:\"\",bindIP:!1,tagTitle:\"\",tagName:\"\",dhcpGateway:\"\",action:\"add\"}),H=(T,j)=>j?{ip:/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,mac:/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$|^([0-9A-Fa-f]{4}\\.){2}([0-9A-Fa-f]{4})$/}[T].test(j.trim()):!1,M=()=>L(this,null,function*(){if(!B.assignedMac)return $.Warning(`${n(\"\\u8BF7\\u8F93\\u5165\")}${n(\"MAC\")}`);if(!H(\"mac\",B.assignedMac))return $.Warning(`${n(\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684MAC\\u5730\\u5740\")}`);if(!B.dhcpGateway)return $.Warning(`${n(\"\\u8BF7\\u9009\\u62E9\")}${n(\"\\u7F51\\u5173\")}`);if(B.bindIP){if(!B.assignedIP)return $.Warning(`${n(\"\\u8BF7\\u8F93\\u5165\")}${n(\"IP\")}`);if(!H(\"ip\",B.assignedIP))return $.Warning(`${n(\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684IP\\u5730\\u5740\")}`)}else B.assignedIP=\"\";let T=$.Loading(n(\"\\u4FDD\\u5B58\\u4E2D...\"));try{const{data:j}=yield G.DeviceMangement.staticDeviceConfig.POST(B);JSON.stringify(j)===\"{}\"?(c.value=!1,q(),f(),$.Success(\"\\u4FDD\\u5B58\\u6210\\u529F !\")):$.Success((j==null?void 0:j.error)||\"\\u4FDD\\u5B58\\u5931\\u8D25\\uFF01\")}catch(j){$.Warning(`${j==null?void 0:j.error} || ${j==null?void 0:j.message}`)}finally{T.Close()}}),q=()=>{A.value=null,B.hostname=\"\",B.assignedIP=\"\",B.assignedMac=\"\",B.bindIP=!1,B.dhcpGateway=\"\",B.tagName=\"\",B.tagTitle=\"\",B.action=\"add\"};return(T,j)=>(r(),s(\"div\",IB,[t(\"div\",MB,[Y(ga,{onHandleAdd:j[0]||(j[0]=R=>c.value=!0),onRefresh:f,onBatchDelete:C,onSearch:w})]),t(\"div\",null,[Y(Ue,{data:d.value,columns:k.value,rowKey:\"assignedMac\",showSelection:v.value,showPagination:!1,onSelectionChange:y},{action:V(({row:R})=>[t(\"button\",{class:\"del-button edit-button\",onClick:it=>h(R)},[t(\"span\",null,i(e(n)(\"\\u7F16\\u8F91\")),1)],8,LB),t(\"button\",{class:\"del-button del-button--danger\",onClick:it=>_(R)},[t(\"span\",null,i(e(n)(\"\\u5220\\u9664\")),1)],8,OB)]),tagTitle:V(({row:R})=>[t(\"span\",null,i(g(R==null?void 0:R.tagTitle)||g(R==null?void 0:R.tagName)||\"-\"),1)]),bindIP:V(({row:R})=>[t(\"span\",null,i(R!=null&&R.bindIP?e(n)(\"\\u662F\"):e(n)(\"\\u5426\")),1)]),_:1},8,[\"data\",\"columns\",\"showSelection\"])]),Y(Xt,{modelValue:c.value,\"onUpdate:modelValue\":j[6]||(j[6]=R=>c.value=R),title:\"\\u9759\\u6001\\u5206\\u914D\",width:\"550px\",\"show-close\":!0,onConfirm:M,onCancel:q},{default:V(()=>[t(\"div\",NB,[VB,t(\"div\",GB,[t(\"div\",jB,i(e(n)(\"\\u540D\\u79F0\"))+\"\\uFF1A\",1),O(t(\"input\",{id:\"tagName\",type:\"text\",onInput:p,\"onUpdate:modelValue\":j[1]||(j[1]=R=>e(B).hostname=R),placeholder:e(n)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,40,UB),[[at,e(B).hostname,void 0,{trim:!0}]])]),t(\"div\",qB,[RB,O(t(\"input\",{id:\"tagName\",type:\"text\",\"onUpdate:modelValue\":j[2]||(j[2]=R=>e(B).assignedMac=R),placeholder:e(n)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,WB),[[at,e(B).assignedMac,void 0,{trim:!0}]])]),t(\"div\",HB,[t(\"div\",JB,i(e(n)(\"\\u7F51\\u5173\"))+\"\\uFF1A\",1),O(t(\"select\",{\"onUpdate:modelValue\":j[3]||(j[3]=R=>A.value=R),onChange:z},[e(S)?(r(),s(\"option\",ZB,i(e(n)(\"\\u8BF7\\u9009\\u62E9\")),1)):D(\"\",!0),(r(!0),s(U,null,tt(a.value,R=>(r(),s(\"option\",{value:R},i(R.gateway)+\"(\"+i(R.tagTitle?g(R.tagTitle):R.tagName?R.tagName:\"-\")+\") \",9,KB))),256))],544),[[pt,A.value]])]),t(\"div\",QB,[t(\"div\",XB,i(e(n)(\"MAC\\u5730\\u5740\\u4E0EIP\\u7ED1\\u5B9A\"))+\"\\uFF1A\",1),Y(Ot,{modelValue:e(B).bindIP,\"onUpdate:modelValue\":j[4]||(j[4]=R=>e(B).bindIP=R)},null,8,[\"modelValue\"])]),e(B).bindIP?(r(),s(\"div\",tY,[eY,O(t(\"input\",{id:\"tagName\",type:\"text\",\"onUpdate:modelValue\":j[5]||(j[5]=R=>e(B).assignedIP=R),placeholder:e(n)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,aY),[[at,e(B).assignedIP,void 0,{trim:!0}]])])):D(\"\",!0)])]),_:1},8,[\"modelValue\"])]))}});var nY=N(oY,[[\"__scopeId\",\"data-v-b2212e7c\"]]);const iY={class:\"container\"},rY={style:{display:\"flex\",\"justify-content\":\"end\"}},sY=[\"onClick\"],dY={class:\"custom-content\"},lY={class:\"item_box\"},uY={class:\"item_left\"},cY={class:\"item_box\"},pY={class:\"item_left\"},fY=[\"placeholder\"],mY={class:\"item_box\"},gY={class:\"item_left\"},vY=[\"placeholder\"],bY={key:0,class:\"tip\"},hY=[\"onClick\"],_Y={key:1},xY={class:\"item_box\"},wY={class:\"item_left\"},kY={class:\"item_box\"},yY={class:\"item_left\"},FY=[\"placeholder\"],EY={class:\"item_box\"},$Y={class:\"item_left\"},CY=[\"placeholder\"],DY={class:\"item_box\"},BY={class:\"item_left\"},YY=[\"placeholder\"],AY=I({emits:[\"openGloba\"],setup(o,{emit:n}){const{$gettext:a}=J(),l=E({});(()=>L(this,null,function*(){try{const{data:M}=yield G.DeviceMangement.globalConfigs.GET();M.result&&(l.value=M.result||{})}catch(M){}}))();const d=E([]),c=E([]),k=E(!1),g=E([{label:\"\\u4E3B\\u673A\\u540D\\u79F0\",prop:\"hostname\"},{label:\"IP\\u5730\\u5740\",prop:\"ip\"},{label:\"MAC\\u5730\\u5740\",prop:\"mac\"},{label:\"\\u7981\\u6B62\\u7F51\\u7EDC\\u8BBF\\u95EE\",prop:\"enabled\",slot:\"enabled\"},{label:\"\\u4E0A\\u4F20\\u9650\\u901F\\uFF08Mbit/s\\uFF09\",prop:\"uploadSpeed\",slot:\"uploadSpeed\"},{label:\"\\u4E0B\\u8F7D\\u9650\\u901F\\uFF08Mbit/s\\uFF09\",prop:\"downloadSpeed\",slot:\"downloadSpeed\"},{label:\"\\u6CE8\\u89E3\",prop:\"comment\"},{label:\"\\u64CD\\u4F5C\",prop:\"action\",slot:\"action\"}]),p=()=>L(this,null,function*(){let M=$.Loading(a(\"\\u52A0\\u8F7D\\u4E2D...\"));try{const{data:q}=yield G.DeviceMangement.listSpeedLimitedDevices.GET();q.result&&(d.value=q.result||[],c.value=q.result||[])}catch(q){}finally{M.Close()}});p();const m=E(!0),v=E([]),b=M=>{v.value=M},y=()=>L(this,null,function*(){d.value=[];let M=$.Loading(a(\"\\u52A0\\u8F7D\\u4E2D...\"));yield p(),M.Close()}),f=M=>d.value.filter(q=>{const T=q.ip.includes(M),j=q.mac.toLowerCase().includes(M.toLowerCase());return T||j}),F=M=>{M===\"\"&&(c.value=d.value),c.value=f(M)},w=M=>L(this,null,function*(){if(confirm(a(\"\\u6E29\\u99A8\\u63D0\\u793A\\uFF1A\\u5220\\u9664\\u8BBE\\u5907\\u7684\\u9650\\u901F\\u914D\\u7F6E\\u53EF\\u80FD\\u5F71\\u54CD\\u6B64\\u8BBE\\u5907\\u7684\\u5E26\\u5BBD\\uFF0C\\u8BF7\\u8C28\\u614E\\u64CD\\u4F5C\\uFF01\"))){let q={ip:M.ip||\"\",mac:M.mac||\"\",uploadSpeed:M.uploadSpeed||0,downloadSpeed:M.downloadSpeed||0,networkAccess:M.networkAccess||!1,comment:\"\",action:\"delete\"};h(q,1)}}),h=(M,q)=>L(this,null,function*(){let T=$.Loading(a(\"\\u5220\\u9664\\u4E2D...\"));try{const{data:j}=yield G.DeviceMangement.speedLimitConfig.POST(M);return q==1&&(JSON.stringify(j)===\"{}\"?$.Success(\"\\u5220\\u9664\\u6210\\u529F !\"):$.Success((j==null?void 0:j.error)||\"\\u5220\\u9664\\u5931\\u8D25\\uFF01\"),p()),j}catch(j){}finally{T.Close()}}),_=()=>L(this,null,function*(){if(v.value.length===0)return $.Warning(a(\"\\u8BF7\\u52FE\\u9009\\u8981\\u5220\\u9664\\u7684\\u6570\\u636E\")+\" !\");if(confirm(a(\"\\u6E29\\u99A8\\u63D0\\u793A\\uFF1A\\u5220\\u9664\\u8BBE\\u5907\\u7684\\u9650\\u901F\\u914D\\u7F6E\\u53EF\\u80FD\\u5F71\\u54CD\\u6B64\\u8BBE\\u5907\\u7684\\u5E26\\u5BBD\\uFF0C\\u8BF7\\u8C28\\u614E\\u64CD\\u4F5C\\uFF01\")))try{const M=v.value.map(q=>{const T={ip:q.ip||\"\",mac:q.mac||\"\",uploadSpeed:q.uploadSpeed||0,downloadSpeed:q.downloadSpeed||0,networkAccess:q.networkAccess||!1,comment:\"\",action:\"delete\"};return h(T)});yield Promise.all(M),$.Success(a(\"\\u6240\\u6709\\u5220\\u9664\\u64CD\\u4F5C\\u5DF2\\u5B8C\\u6210\")),p()}catch(M){}}),x=()=>{k.value=!1,n(\"openGloba\")},C=M=>{var q,T;if(M==!0&&!((T=(q=l.value)==null?void 0:q.speedLimit)!=null&&T.enabled))return $.Warning(a(\"\\u8BF7\\u524D\\u5F80\\u5168\\u5C40\\u914D\\u7F6E\\u5F00\\u542F\\u9650\\u901F\"))},S=gt({ip:\"\",mac:\"\",uploadSpeed:100,downloadSpeed:1e3,networkAccess:!1,enabled:!1,comment:\"\",action:\"add\"}),A=M=>/^([1-9]\\d*(\\.\\d+)?|0\\.\\d*[1-9]\\d*)$/.test(M.toString()),z=(M,q)=>q?{ip:/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,mac:/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$|^([0-9A-Fa-f]{4}\\.){2}([0-9A-Fa-f]{4})$/}[M].test(q.trim()):!1,B=()=>L(this,null,function*(){var q,T;if(!((T=(q=l.value)==null?void 0:q.speedLimit)!=null&&T.enabled))return $.Warning(a(\"\\u8BF7\\u524D\\u5F80\\u5168\\u5C40\\u914D\\u7F6E\\u5F00\\u542F\\u9650\\u901F\"));if(!S.ip)return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\")}${a(\"IP\")}`);if(!z(\"ip\",S.ip))return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684IP\\u5730\\u5740\")}`);if(!S.mac)return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\")}${a(\"MAC\")}`);if(!z(\"mac\",S.mac))return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684MAC\\u5730\\u5740\")}`);if(S.networkAccess)S.downloadSpeed=0,S.uploadSpeed=0;else{if(!S.downloadSpeed)return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\")}${a(\"\\u4E0B\\u8F7D\\u901F\\u5EA6\")}`);if(!A(S.downloadSpeed))return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684\\u4E0B\\u8F7D\\u901F\\u5EA6\")}`);if(!S.uploadSpeed)return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\")}${a(\"\\u4E0A\\u4F20\\u901F\\u5EA6\")}`);if(!A(S.uploadSpeed))return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684\\u4E0A\\u4F20\\u901F\\u5EA6\")}`);S.downloadSpeed=Number(S.downloadSpeed),S.uploadSpeed=Number(S.uploadSpeed)}let M=$.Loading(a(\"\\u4FDD\\u5B58\\u4E2D...\"));try{S.networkAccess=!S.networkAccess;const{data:j}=yield G.DeviceMangement.speedLimitConfig.POST(S);JSON.stringify(j)===\"{}\"?(y(),$.Success(\"\\u4FDD\\u5B58\\u6210\\u529F !\")):$.Success((j==null?void 0:j.error)||\"\\u4FDD\\u5B58\\u5931\\u8D25\\uFF01\"),k.value=!1,H()}catch(j){$.Warning(`${j==null?void 0:j.error} || ${j==null?void 0:j.message}`)}finally{S.downloadSpeed=1e3,S.uploadSpeed=100,M.Close()}}),H=()=>{S.ip=\"\",S.mac=\"\",S.uploadSpeed=100,S.downloadSpeed=1e3,S.networkAccess=!1,S.comment=\"\",S.action=\"add\"};return(M,q)=>(r(),s(\"div\",iY,[t(\"div\",rY,[Y(ga,{onHandleAdd:q[0]||(q[0]=T=>k.value=!0),onRefresh:y,onBatchDelete:_,onSearch:F})]),t(\"div\",null,[Y(Ue,{data:c.value,columns:g.value,rowKey:\"mac\",showSelection:m.value,showPagination:!1,onSelectionChange:b},{action:V(({row:T})=>[t(\"button\",{class:\"del-button del-button--danger\",onClick:j=>w(T)},[t(\"span\",null,i(e(a)(\"\\u5220\\u9664\")),1)],8,sY)]),enabled:V(({row:T})=>[t(\"span\",null,i(T!=null&&T.enabled?e(a)(\"\\u662F\"):e(a)(\"\\u5426\")),1)]),uploadSpeed:V(({row:T})=>[t(\"span\",null,i((T==null?void 0:T.uploadSpeed)||\"-\")+\" \"+i(T!=null&&T.uploadSpeed?\"Mbit/s\":\"\"),1)]),downloadSpeed:V(({row:T})=>[t(\"span\",null,i((T==null?void 0:T.downloadSpeed)||\"-\")+\" \"+i(T!=null&&T.downloadSpeed?\"Mbit/s\":\"\"),1)]),_:1},8,[\"data\",\"columns\",\"showSelection\"])]),Y(Xt,{modelValue:k.value,\"onUpdate:modelValue\":q[9]||(q[9]=T=>k.value=T),title:\"\\u9650\\u901F\\u914D\\u7F6E\",\"show-close\":!0,onConfirm:B,onCancel:H},{default:V(()=>{var T,j,R,it;return[t(\"div\",dY,[t(\"div\",lY,[t(\"div\",uY,i(e(a)(\"\\u5BF9\\u8BBE\\u5907\\u5F00\\u542F\\u9650\\u901F\"))+\"\\uFF1A\",1),Y(Ot,{modelValue:e(S).enabled,\"onUpdate:modelValue\":q[1]||(q[1]=ot=>e(S).enabled=ot),disabled:!((j=(T=l.value)==null?void 0:T.speedLimit)!=null&&j.enabled),onBeforeChange:C},null,8,[\"modelValue\",\"disabled\"])]),t(\"div\",cY,[t(\"div\",pY,i(e(a)(\"IP\\u5730\\u5740\"))+\"\\uFF1A\",1),O(t(\"input\",{id:\"tagName\",type:\"text\",\"onUpdate:modelValue\":q[2]||(q[2]=ot=>e(S).ip=ot),placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,fY),[[at,e(S).ip,void 0,{trim:!0}]])]),t(\"div\",mY,[t(\"div\",gY,i(e(a)(\"MAC\\u5730\\u5740\"))+\"\\uFF1A\",1),O(t(\"input\",{id:\"tagName\",type:\"text\",\"onUpdate:modelValue\":q[3]||(q[3]=ot=>e(S).mac=ot),placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,vY),[[at,e(S).mac,void 0,{trim:!0}]])]),(it=(R=l.value)==null?void 0:R.speedLimit)!=null&&it.enabled?D(\"\",!0):(r(),s(\"div\",bY,[t(\"a\",{href:\"\",onClick:ft(x,[\"prevent\"])},i(e(a)(\"\\u70B9\\u6211\\u8DF3\\u8F6C\\u5168\\u5C40\\u914D\\u7F6E\")),9,hY)])),e(S).enabled?(r(),s(\"div\",_Y,[t(\"div\",xY,[t(\"div\",wY,i(e(a)(\"\\u7981\\u6B62\\u8BE5\\u8BBE\\u5907\\u8BBF\\u95EE\\u7F51\\u7EDC\"))+\"\\uFF1A\",1),Y(Ot,{modelValue:e(S).networkAccess,\"onUpdate:modelValue\":q[4]||(q[4]=ot=>e(S).networkAccess=ot),onChange:q[5]||(q[5]=()=>{})},null,8,[\"modelValue\"])]),e(S).networkAccess?D(\"\",!0):(r(),s(U,{key:0},[t(\"div\",kY,[t(\"div\",yY,i(e(a)(\"\\u4E0B\\u8F7D\\u9650\\u901F\\uFF08Mbit/s\\uFF09\"))+\"\\uFF1A\",1),O(t(\"input\",{id:\"tagName\",type:\"text\",\"onUpdate:modelValue\":q[6]||(q[6]=ot=>e(S).downloadSpeed=ot),placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,FY),[[at,e(S).downloadSpeed,void 0,{trim:!0}]]),dt(\" \\xA0 \"+i(e(a)(\"\\u603B\\u5E26\\u5BBD\")),1)]),t(\"div\",EY,[t(\"div\",$Y,i(e(a)(\"\\u4E0A\\u4F20\\u9650\\u901F\\uFF08Mbit/s\\uFF09\"))+\"\\uFF1A\",1),O(t(\"input\",{id:\"tagName\",type:\"text\",\"onUpdate:modelValue\":q[7]||(q[7]=ot=>e(S).uploadSpeed=ot),placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,CY),[[at,e(S).uploadSpeed,void 0,{trim:!0}]]),dt(\" \\xA0 \"+i(e(a)(\"\\u603B\\u5E26\\u5BBD\")),1)]),t(\"div\",DY,[t(\"div\",BY,i(e(a)(\"\\u6CE8\\u89E3\"))+\"\\uFF1A\",1),O(t(\"input\",{id:\"tagName\",type:\"text\",\"onUpdate:modelValue\":q[8]||(q[8]=ot=>e(S).comment=ot),placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,YY),[[at,e(S).comment,void 0,{trim:!0}]])])],64))])):D(\"\",!0)])]}),_:1},8,[\"modelValue\"])]))}});var SY=N(AY,[[\"__scopeId\",\"data-v-23c28a68\"]]);const ba=o=>(ut(\"data-v-ed203952\"),o=o(),ct(),o),zY={key:0,class:\"dialog-overlay\"},PY={class:\"dialog-container\"},TY={class:\"dialog-title\"},IY=ba(()=>t(\"div\",{class:\"loading-animation\"},[t(\"div\",{class:\"spinner\"})],-1)),MY={class:\"dialog-message\"},LY={key:0,class:\"dialog-overlay\"},OY={class:\"dialog-container\"},NY={class:\"dialog-title\"},VY=ba(()=>t(\"div\",{style:{display:\"flex\",\"justify-content\":\"center\"}},[t(\"svg\",{t:\"1752661662572\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"5921\",width:\"50\",height:\"50\"},[t(\"path\",{d:\"M0 512C0 229.234759 229.234759 0 512 0s512 229.234759 512 512-229.234759 512-512 512S0 794.765241 0 512z m419.310345 194.630621a35.310345 35.310345 0 0 0 49.399172 1.271172l335.518897-311.931586a35.310345 35.310345 0 0 0-48.075035-51.729655l-309.124413 289.544827-145.125518-149.645241a35.310345 35.310345 0 1 0-50.688 49.169655l168.112552 173.320828z\",fill:\"#553afe\",\"p-id\":\"5922\"})])],-1)),GY={class:\"dialog-message\"},jY={key:0,class:\"dialog-overlay\"},UY={class:\"dialog-container tag-dialog\"},qY={class:\"dialog-title\"},RY={class:\"warning-message\"},WY=ba(()=>t(\"svg\",{class:\"warning-icon\",viewBox:\"0 0 24 24\"},[t(\"path\",{fill:\"currentColor\",d:\"M12,2L1,21H23M12,6L19.53,19H4.47M11,10V14H13V10M11,16V18H13V16\"})],-1)),HY={class:\"input-group\"},JY={for:\"tagTitle\"},ZY=[\"placeholder\"],KY={class:\"input-group\"},QY={for:\"tagName\"},XY=[\"disabled\",\"placeholder\"],tA={class:\"input-group\"},eA={for:\"gateway\"},aA=[\"placeholder\"],oA={class:\"button-group\"},nA=I({props:{title:{type:String,required:!0}},emits:[\"confirm\",\"update:modelValue\"],setup(o,{expose:n,emit:a}){const{$gettext:l}=J(),u=E(\"install\"),d=E(!1),c=E(!1),k=E(!1),g=E(\"\"),p=E(\"\"),m=E(\"\"),v=()=>{u.value=\"install\",d.value=!0},b=()=>{d.value=!1},y=()=>{d.value=!1,setTimeout(()=>{c.value=!0},300)},f=()=>{c.value=!1},F=E(\"1\"),w=()=>{u.value=\"tag\",F.value=\"1\",p.value=\"\",g.value=\"\",m.value=\"\",k.value=!0},h=()=>{u.value=\"tag\",F.value=\"2\",k.value=!0},_=()=>{k.value=!1},x=A=>{p.value=A.target.value.replace(/[\\u4e00-\\u9fa5]/g,\"\")},C=(A,z)=>z?{ip:/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/,mac:/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$|^([0-9A-Fa-f]{4}\\.){2}([0-9A-Fa-f]{4})$/}[A].test(z.trim()):!1,S=()=>{if(!C(\"ip\",m.value.trim()))return $.Warning(`${l(\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684IP\\u5730\\u5740\")}`);g.value.trim()&&p.value.trim()&&m.value.trim()&&(a(\"confirm\",{tagTitle:g.value.trim(),tagName:p.value.trim(),gateway:m.value.trim(),type:F.value}),_())};return $t(g,A=>{a(\"update:modelValue\",A)}),$t(p,A=>{a(\"update:modelValue\",A)}),$t(m,A=>{a(\"update:modelValue\",A)}),n({tagTitle:g,tagName:p,gateway:m,openInstallDialog:v,showInstallResult:y,openTagDialog:w,closeTagDialog:_,cancelInstall:b,openEditTagDialog:h}),(A,z)=>(r(),s(U,null,[Y(St,{name:\"fade\"},{default:V(()=>[d.value&&u.value===\"install\"?(r(),s(\"div\",zY,[t(\"div\",PY,[t(\"div\",TY,i(o.title),1),IY,t(\"p\",MY,i(e(l)(\"\\u6B63\\u5728\\u5B89\\u88C5\"))+\"...\",1),t(\"button\",{class:\"dialog-button\",onClick:b},i(e(l)(\"\\u5173\\u95ED\")),1)])])):D(\"\",!0)]),_:1}),Y(St,{name:\"fade\"},{default:V(()=>[c.value&&u.value===\"install\"?(r(),s(\"div\",LY,[t(\"div\",OY,[t(\"div\",NY,i(e(l)(\"\\u7ED3\\u679C\")),1),VY,t(\"p\",GY,i(e(l)(\"\\u5B89\\u88C5\\u6210\\u529F\"))+\"\\uFF01\",1),t(\"button\",{class:\"dialog-button\",onClick:f},i(e(l)(\"\\u786E\\u5B9A\")),1)])])):D(\"\",!0)]),_:1}),Y(St,{name:\"fade\"},{default:V(()=>[k.value&&u.value===\"tag\"?(r(),s(\"div\",jY,[t(\"div\",UY,[t(\"div\",qY,i(F.value===\"1\"?e(l)(\"\\u6DFB\\u52A0\\u6807\\u7B7E\"):e(l)(\"\\u7F16\\u8F91\\u6807\\u7B7E\")),1),t(\"div\",RY,[WY,t(\"span\",null,i(e(l)(\"\\u6CE8\\u610F\\uFF1A\\u6DFB\\u52A0ID\\u65F6\\uFF0C\\u8BF7\\u52FF\\u5C06\\u201Codhcpd\\u201D\\u6216\\u7F51\\u7EDC\\u63A5\\u53E3\\uFF08\\u4F8B\\u5982\\u201Clan\\u201D,\\u201Cwan\\u201D,\\u201Cwan6\\u201D\\u7B49\\uFF09\\u4F5C\\u4E3AID\\uFF0C\\u6B64\\u4E3E\\u5C06\\u4EA7\\u751F\\u51B2\\u7A81\\u3002\\u5EFA\\u8BAE\\u5728ID\\u524D\\u9762\\u52A0\\u4E0A\\u524D\\u7F00\\u201Ct_\\u201D\\u4EE5\\u675C\\u7EDD\\u6B64\\u7C7B\\u51B2\\u7A81\\u3002\")),1)]),t(\"div\",HY,[t(\"label\",JY,i(e(l)(\"\\u6807\\u9898\"))+\"\\uFF1A\",1),O(t(\"input\",{id:\"tagTitle\",\"onUpdate:modelValue\":z[0]||(z[0]=B=>g.value=B),type:\"text\",placeholder:e(l)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,ZY),[[at,g.value]])]),t(\"div\",KY,[t(\"label\",QY,i(e(l)(\"ID\"))+\"\\uFF1A\",1),O(t(\"input\",{id:\"tagName\",\"onUpdate:modelValue\":z[1]||(z[1]=B=>p.value=B),onInput:x,disabled:F.value==\"2\",type:\"text\",placeholder:e(l)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,40,XY),[[at,p.value]])]),t(\"div\",tA,[t(\"label\",eA,i(e(l)(\"\\u7F51\\u5173\"))+\"\\uFF1A\",1),O(t(\"input\",{id:\"gateway\",\"onUpdate:modelValue\":z[2]||(z[2]=B=>m.value=B),type:\"text\",placeholder:e(l)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,aA),[[at,m.value]])]),t(\"div\",oA,[t(\"button\",{class:\"cancel-button\",onClick:_},i(e(l)(\"\\u53D6\\u6D88\")),1),t(\"button\",{class:\"confirm-button\",onClick:S},i(e(l)(\"\\u786E\\u5B9A\")),1)])])])):D(\"\",!0)]),_:1})],64))}});var iA=N(nA,[[\"__scopeId\",\"data-v-ed203952\"]]);const co=o=>(ut(\"data-v-102c75ea\"),o=o(),ct(),o),rA={class:\"tab-container\"},sA={class:\"tab-header\"},dA=[\"onClick\"],lA={class:\"tab-content_g\"},uA={key:0,class:\"not_installed\"},cA=co(()=>t(\"svg\",{t:\"1752659436579\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"4943\",width:\"150\",height:\"150\"},[t(\"path\",{d:\"M216.896 97.232l-55.792 106.24 704.784 8.928-24.352-75.888-38.496-39.28z\",fill:\"#FFFFFF\",\"p-id\":\"4944\"}),t(\"path\",{d:\"M192.016 255.968h655.968v592H192.016z\",fill:\"#FFFFFF\",\"p-id\":\"4945\"}),t(\"path\",{d:\"M921.904 187.008l-66.72-80.656a69.744 69.744 0 0 0-55.168-26.32h-576a71.296 71.296 0 0 0-55.664 26.416l-66.256 80.56a93.984 93.984 0 0 0-22.08 61.024v600a96.288 96.288 0 0 0 96 96h672a96.288 96.288 0 0 0 96-96v-600a93.984 93.984 0 0 0-22.112-61.024zM512.016 777.856L246.128 512.032h166.144v-132.976h199.392v132.976h166.128zM179.664 179.664l33.152-66.464h598.128l33.2 66.464z\",fill:\"#909399\",\"p-id\":\"4946\"})],-1)),pA={key:1},fA={class:\"item_box\"},mA={class:\"item_left\"},gA={class:\"item_box\"},vA={class:\"item_left\"},bA=[\"placeholder\"],hA={class:\"item_box\"},_A={class:\"item_left\"},xA=[\"placeholder\"],wA={class:\"item_box\"},kA={class:\"item_left\"},yA={key:0,class:\"not_installed\"},FA=co(()=>t(\"svg\",{t:\"1752659436579\",class:\"icon\",viewBox:\"0 0 1024 1024\",version:\"1.1\",xmlns:\"http://www.w3.org/2000/svg\",\"p-id\":\"4943\",width:\"150\",height:\"150\"},[t(\"path\",{d:\"M216.896 97.232l-55.792 106.24 704.784 8.928-24.352-75.888-38.496-39.28z\",fill:\"#FFFFFF\",\"p-id\":\"4944\"}),t(\"path\",{d:\"M192.016 255.968h655.968v592H192.016z\",fill:\"#FFFFFF\",\"p-id\":\"4945\"}),t(\"path\",{d:\"M921.904 187.008l-66.72-80.656a69.744 69.744 0 0 0-55.168-26.32h-576a71.296 71.296 0 0 0-55.664 26.416l-66.256 80.56a93.984 93.984 0 0 0-22.08 61.024v600a96.288 96.288 0 0 0 96 96h672a96.288 96.288 0 0 0 96-96v-600a93.984 93.984 0 0 0-22.112-61.024zM512.016 777.856L246.128 512.032h166.144v-132.976h199.392v132.976h166.128zM179.664 179.664l33.152-66.464h598.128l33.2 66.464z\",fill:\"#909399\",\"p-id\":\"4946\"})],-1)),EA={key:1},$A={class:\"item_box\"},CA={class:\"item_left\"},DA={class:\"item_box\"},BA={class:\"item_left\"},YA={key:0,value:\"\",disabled:\"\"},AA=[\"value\"],SA={class:\"item_box\"},zA={class:\"item_left\"},PA=[\"placeholder\"],TA={class:\"item_box\"},IA={class:\"item_left\"},MA=[\"placeholder\"],LA={class:\"item_box\"},OA={class:\"item_left\"},NA={style:{\"margin-bottom\":\"16px\"}},VA={class:\"item_box\"},GA={class:\"item_left\"},jA={class:\"item_box\"},UA={class:\"item_left\"},qA=[\"value\"],RA={class:\"item_box\"},WA={class:\"item_left\"},HA={style:{display:\"flex\",\"justify-content\":\"end\",\"margin-bottom\":\"8px\"}},JA=[\"onClick\"],ZA=[\"onClick\"],KA=I({setup(o,{expose:n}){const{$gettext:a}=J(),l=Q(()=>!p.role),u=E([]),d=E([{label:\"\\u6807\\u9898\",prop:\"tagTitle\",slot:\"tagTitle\"},{label:\"ID\",prop:\"tagName\",slot:\"tagName\"},{label:\"\\u7F51\\u5173\",prop:\"gateway\",slot:\"gateway\"},{label:\"\\u64CD\\u4F5C\",prop:\"action\",slot:\"action\"}]),c=E([{name:a(\"\\u4E3B\\u8DEF\\u7531\"),value:\"fallback\"},{name:a(\"\\u65C1\\u8DEF\\u7531\"),value:\"main\"}]),k=gt({dhcpEnabled:!1,dhcpGateway:\"\"}),g=gt({enabled:!1,uploadSpeed:\"\",downloadSpeed:\"\",installed:!0}),p=gt({enabled:!1,role:\"\",setIP:\"\",checkIP:\"\"}),m=E({}),v=()=>L(this,null,function*(){var nt,K,At,mt,P,X,et,rt,kt,Tt,Ft,ne,ie,re,se,de,le,ue,ce,pe,fe,me,ge;try{const{data:Et}=yield G.DeviceMangement.globalConfigs.GET();if(Et.result){if(m.value=Et.result||{},k.dhcpEnabled=((K=(nt=Et.result)==null?void 0:nt.dhcpGlobal)==null?void 0:K.dhcpEnabled)||!1,(mt=(At=Et.result)==null?void 0:At.dhcpGlobal)!=null&&mt.dhcpGateway)k.dhcpGateway=(X=(P=Et.result)==null?void 0:P.dhcpGlobal)==null?void 0:X.dhcpGateway;else{const _a=(rt=(et=Et.result)==null?void 0:et.dhcpGlobal)==null?void 0:rt.gatewaySels.find(mo=>mo.title===\"myself\");_a?k.dhcpGateway=_a.gateway:k.dhcpGateway=\"\"}u.value=((kt=Et.result)==null?void 0:kt.dhcpTags)||[],g.enabled=((Ft=(Tt=Et.result)==null?void 0:Tt.speedLimit)==null?void 0:Ft.enabled)||!1,g.uploadSpeed=((ie=(ne=Et.result)==null?void 0:ne.speedLimit)==null?void 0:ie.uploadSpeed)||\"\",g.downloadSpeed=((se=(re=Et.result)==null?void 0:re.speedLimit)==null?void 0:se.downloadSpeed)||\"\",p.enabled=((le=(de=Et.result)==null?void 0:de.floatGateway)==null?void 0:le.enabled)||!1,p.role=((ce=(ue=Et.result)==null?void 0:ue.floatGateway)==null?void 0:ce.role)||\"\",p.setIP=((fe=(pe=Et.result)==null?void 0:pe.floatGateway)==null?void 0:fe.setIP)||\"\",p.checkIP=((ge=(me=Et.result)==null?void 0:me.floatGateway)==null?void 0:ge.checkIP)||\"\"}}catch(Et){}});v();const b=()=>L(this,null,function*(){let nt=$.Loading(a(\"\\u4FDD\\u5B58\\u4E2D...\"));try{const{data:K}=yield G.DeviceMangement.dhcpGatewayConfig.POST(k);JSON.stringify(K)===\"{}\"?($.Success(a(\"\\u4FDD\\u5B58\\u6210\\u529F\")),v()):$.Success((K==null?void 0:K.error)||\"\\u4FDD\\u5B58\\u5931\\u8D25\\uFF01\")}catch(K){$.Warning(`${K==null?void 0:K.error} || ${K==null?void 0:K.message}`)}finally{nt.Close()}}),y=(nt,K)=>L(this,null,function*(){let At=$.Loading(a(\"\\u68C0\\u67E5\\u4E2D...\"));try{const mt=yield G.App.Check.POST({name:nt});if(At.Close(),mt!=null&&mt.data){const{result:P,error:X}=mt.data;if(X)$.Warning(X);else{if(P)return P.status==\"installed\";$.Warning(a(\"\\u68C0\\u67E5\\u63D2\\u4EF6\\u72B6\\u6001\\u5931\\u8D25\"))}}return!1}catch(mt){return At.Close(),$.Warning(mt),!1}}),f=E(!1),F=E(!1),w=()=>L(this,null,function*(){(yield y(\"app-meta-floatip\"))&&(F.value=!0)}),h=()=>L(this,null,function*(){(yield y(\"app-meta-eqos\"))&&(f.value=!0)});w(),h();const _=[{id:\"tag\",label:a(\"DHCP\")},{id:\"gateway\",label:a(\"\\u6D6E\\u52A8\\u7F51\\u5173\")},{id:\"ip\",label:a(\"IP\\u9650\\u901F\")}],x=E(\"tag\");n({activeTab:x});const C=nt=>{x.value=nt},S=E(),A=nt=>({default:a(\"\\u9ED8\\u8BA4\\u7F51\\u5173\"),parent:a(\"\\u4E0A\\u7EA7\\u8DEF\\u7531\"),myself:a(\"\\u672C\\u8BBE\\u5907\"),bypass:a(\"\\u65C1\\u8DEF\\u7531\"),floatip:a(\"\\u6D6E\\u52A8\\u7F51\\u5173\")})[nt]||nt,z=E(\"app-meta-floatip\"),B=Q(()=>z.value===\"app-meta-floatip\"?a(\"\\u6D6E\\u52A8\\u7F51\\u5173\"):a(\"IP\\u9650\\u901F\")),H=nt=>L(this,null,function*(){if(z.value=nt,S.value.openInstallDialog(),yield zt.installApp(nt))return nt==\"app-meta-floatip\"?w():h(),S.value.showInstallResult(),!0;S.value.cancelInstall(),$.Error(a(\"\\u5B89\\u88C5\\u5931\\u8D25\\u6216\\u8D85\\u65F6\\uFF0C\\u8BF7\\u68C0\\u67E5\\u8F6F\\u4EF6\\u6E90\\u6216\\u7A0D\\u5019\\u91CD\\u8BD5\"))}),M=nt=>/^([1-9]\\d*(\\.\\d+)?|0\\.\\d*[1-9]\\d*)$/.test(nt.toString()),q=()=>L(this,null,function*(){if(g.enabled){if(!g.downloadSpeed)return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\")}${a(\"\\u4E0B\\u8F7D\\u901F\\u5EA6\")}`);if(!M(g.downloadSpeed))return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684\\u4E0B\\u8F7D\\u901F\\u5EA6\")}`);if(!g.uploadSpeed)return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\")}${a(\"\\u4E0A\\u4F20\\u901F\\u5EA6\")}`);if(!M(g.uploadSpeed))return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684\\u4E0A\\u4F20\\u901F\\u5EA6\")}`);g.downloadSpeed=Number(g.downloadSpeed),g.uploadSpeed=Number(g.uploadSpeed)}else g.downloadSpeed=0,g.uploadSpeed=0;let nt=$.Loading(a(\"\\u4FDD\\u5B58\\u4E2D...\"));try{const{data:K}=yield G.DeviceMangement.enableSpeedLimit.POST(g);JSON.stringify(K)===\"{}\"?($.Success(a(\"\\u4FDD\\u5B58\\u6210\\u529F\")),v()):$.Success((K==null?void 0:K.error)||\"\\u4FDD\\u5B58\\u5931\\u8D25\\uFF01\")}catch(K){$.Warning(`${K==null?void 0:K.error} || ${K==null?void 0:K.message}`)}finally{nt.Close()}}),T=(nt,K)=>K?{ip:/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)(?:\\/([0-9]|[1-2][0-9]|3[0-2]))?$/,mac:/^([0-9A-Fa-f]{2}[:-]){5}([0-9A-Fa-f]{2})$|^([0-9A-Fa-f]{4}\\.){2}([0-9A-Fa-f]{4})$/}[nt].test(K.trim()):!1,j=()=>L(this,null,function*(){if(!p.role)return $.Warning(a(\"\\u8BF7\\u9009\\u62E9\\u8282\\u70B9\\u89D2\\u8272\"));if(!p.setIP)return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\")}${a(\"\\u6D6E\\u52A8\\u7F51\\u5173\")}IP`);if(!T(\"ip\",p.setIP))return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684\\u6D6E\\u52A8\\u7F51\\u5173IP\\u5730\\u5740\")}`);if(!p.checkIP)return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\")}${a(\"\\u65C1\\u8DEF\\u7531\")}IP`);if(!T(\"ip\",p.checkIP))return $.Warning(`${a(\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684\\u65C1\\u8DEF\\u7531IP\\u5730\\u5740\")}`);let nt=$.Loading(a(\"\\u4FDD\\u5B58\\u4E2D...\"));try{const{data:K}=yield G.DeviceMangement.enableFloatGateway.POST(p);JSON.stringify(K)===\"{}\"?($.Success(a(\"\\u4FDD\\u5B58\\u6210\\u529F\")),v()):$.Success((K==null?void 0:K.error)||\"\\u4FDD\\u5B58\\u5931\\u8D25\\uFF01\")}catch(K){$.Warning(`${K==null?void 0:K.error} || ${K==null?void 0:K.message}`)}finally{nt.Close()}}),R=nt=>{nt||confirm(a(\"\\u6E29\\u99A8\\u63D0\\u793A\\uFF1A\\u5173\\u95EDDHCP\\u53EF\\u80FD\\u5F71\\u54CD\\u5C40\\u57DF\\u7F51\\u5185\\u8BBE\\u5907\\u7684IP\\u5206\\u914D\\u548C\\u8054\\u7F51\\uFF0C\\u8BF7\\u8C28\\u614E\\u64CD\\u4F5C\\uFF01\"))||(k.dhcpEnabled=!0)},it=nt=>{nt||confirm(a(\"\\u6E29\\u99A8\\u63D0\\u793A\\uFF1A\\u5173\\u95ED\\u6D6E\\u52A8\\u7F51\\u5173\\u53EF\\u80FD\\u5F71\\u54CD\\u6B63\\u5728\\u4F7F\\u7528\\u6D6E\\u52A8\\u7F51\\u5173\\u7684\\u8BBE\\u5907\\uFF0C\\u8BF7\\u8C28\\u614E\\u64CD\\u4F5C\\uFF01\"))||(p.enabled=!0)},ot=nt=>{nt||confirm(a(\"\\u6E29\\u99A8\\u63D0\\u793A\\uFF1A\\u5173\\u95ED\\u9650\\u901F\\u4F1A\\u8BA9\\u5DF2\\u914D\\u7F6E\\u9650\\u901F\\u7684\\u8BBE\\u5907\\u7684\\u5E26\\u5BBD\\u9650\\u5236\\u5168\\u90E8\\u5931\\u6548\\uFF0C\\u8BF7\\u8C28\\u614E\\u64CD\\u4F5C\\uFF01\"))||(g.enabled=!0)},bt=nt=>L(this,null,function*(){if(confirm(a(\"\\u6E29\\u99A8\\u63D0\\u793A\\uFF1A\\u5220\\u9664\\u7F51\\u5173\\u6807\\u7B7E\\u53EF\\u80FD\\u5F71\\u54CD\\u6B63\\u5728\\u4F7F\\u7528\\u6B64\\u6807\\u7B7E\\u7684\\u8BBE\\u5907\\uFF0C\\u8BF7\\u8C28\\u614E\\u64CD\\u4F5C\\uFF01\"))){let K=$.Loading(a(\"\\u5220\\u9664\\u4E2D...\")),At={action:\"delete\",tagTitle:nt.tagTitle||\"\",tagName:nt.tagName||\"\",dhcpOption:(nt==null?void 0:nt.dhcpOption)||[]};try{const{data:mt}=yield G.DeviceMangement.dhcpTagsConfig.POST(At);JSON.stringify(mt)===\"{}\"?($.Success(a(\"\\u5220\\u9664\\u6210\\u529F\")),v()):$.Success((mt==null?void 0:mt.error)||\"\\u5220\\u9664\\u5931\\u8D25\\uFF01\")}catch(mt){$.Warning(`${mt==null?void 0:mt.error} || ${mt==null?void 0:mt.message}`)}finally{K.Close()}}}),Dt=()=>{S.value.openTagDialog()},yt=E([]),Vt=nt=>L(this,null,function*(){yt.value=nt.dhcpOption?nt.dhcpOption:[],S.value.tagTitle=nt.tagTitle||\"\",S.value.tagName=nt.tagName||\"\",S.value.gateway=nt.gateway||\"\",yield na(),S.value.openEditTagDialog()}),Re=nt=>L(this,null,function*(){let K=$.Loading(a(\"\\u4FDD\\u5B58\\u4E2D...\"));const At=[`3,${nt.gateway}`,`6,${nt.gateway}`];let mt={action:nt.type==1?\"add\":\"modify\",tagTitle:nt.tagTitle,tagName:nt.tagName,dhcpOption:At};try{const{data:P}=yield G.DeviceMangement.dhcpTagsConfig.POST(mt);JSON.stringify(P)===\"{}\"?($.Success(a(\"\\u4FDD\\u5B58\\u6210\\u529F\")),v()):$.Success((P==null?void 0:P.error)||\"\\u4FDD\\u5B58\\u5931\\u8D25\\uFF01\")}catch(P){$.Warning(`${P==null?void 0:P.error} || ${P==null?void 0:P.message}`)}finally{K.Close()}});return(nt,K)=>{var At,mt;return r(),s(\"div\",rA,[t(\"div\",sA,[(r(),s(U,null,tt(_,P=>t(\"button\",{key:P.id,class:lt([\"tab-button\",{active:x.value===P.id}]),onClick:X=>C(P.id)},i(P.label),11,dA)),64))]),t(\"div\",lA,[O(t(\"div\",null,[f.value?(r(),s(\"div\",pA,[t(\"div\",fA,[t(\"div\",mA,i(e(a)(\"IP\\u9650\\u901F\"))+\"\\uFF1A\",1),Y(Ot,{modelValue:e(g).enabled,\"onUpdate:modelValue\":K[1]||(K[1]=P=>e(g).enabled=P),onChange:ot},null,8,[\"modelValue\"])]),e(g).enabled?(r(),s(U,{key:0},[t(\"div\",gA,[t(\"div\",vA,i(e(a)(\"\\u4E0B\\u8F7D\\u901F\\u5EA6\"))+\"\\uFF08Mbit/s\\uFF09\\uFF1A\",1),O(t(\"input\",{id:\"tagName\",type:\"text\",\"onUpdate:modelValue\":K[2]||(K[2]=P=>e(g).downloadSpeed=P),placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,bA),[[at,e(g).downloadSpeed,void 0,{trim:!0}]]),dt(\" \\xA0 \"+i(e(a)(\"\\u603B\\u5E26\\u5BBD\")),1)]),t(\"div\",hA,[t(\"div\",_A,i(e(a)(\"\\u4E0A\\u4F20\\u901F\\u5EA6\"))+\"\\uFF08Mbit/s\\uFF09\\uFF1A\",1),O(t(\"input\",{id:\"tagName\",type:\"text\",\"onUpdate:modelValue\":K[3]||(K[3]=P=>e(g).uploadSpeed=P),placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,xA),[[at,e(g).uploadSpeed,void 0,{trim:!0}]]),dt(\" \\xA0 \"+i(e(a)(\"\\u603B\\u5E26\\u5BBD\")),1)])],64)):D(\"\",!0),t(\"div\",wA,[t(\"div\",kA,[t(\"button\",{class:\"add-button add-button--danger\",onClick:q},i(e(a)(\"\\u4FDD\\u5B58\")),1)])])])):(r(),s(\"div\",uA,[cA,t(\"span\",null,i(e(a)(\"\\u8F6F\\u4EF6\\u6682\\u672A\\u5B89\\u88C5\")),1),t(\"div\",{class:\"not_installed_btn\",onClick:K[0]||(K[0]=P=>H(\"app-meta-eqos\"))},i(e(a)(\"\\u7ACB\\u5373\\u5B89\\u88C5\")),1)]))],512),[[ee,x.value===\"ip\"]]),O(t(\"div\",null,[F.value?(r(),s(\"div\",EA,[t(\"div\",$A,[t(\"div\",CA,i(e(a)(\"\\u6D6E\\u52A8\\u7F51\\u5173\"))+\"\\uFF1A\",1),Y(Ot,{modelValue:e(p).enabled,\"onUpdate:modelValue\":K[5]||(K[5]=P=>e(p).enabled=P),onChange:it},null,8,[\"modelValue\"])]),t(\"div\",DA,[t(\"div\",BA,i(e(a)(\"\\u8282\\u70B9\\u89D2\\u8272\"))+\"\\uFF1A\",1),O(t(\"select\",{\"onUpdate:modelValue\":K[6]||(K[6]=P=>e(p).role=P),onChange:K[7]||(K[7]=()=>{})},[e(l)?(r(),s(\"option\",YA,i(e(a)(\"\\u8BF7\\u9009\\u62E9\")),1)):D(\"\",!0),(r(!0),s(U,null,tt(c.value,P=>(r(),s(\"option\",{value:P.value},i(P.name),9,AA))),256))],544),[[pt,e(p).role]])]),t(\"div\",SA,[t(\"div\",zA,i(e(a)(\"\\u6D6E\\u52A8\\u7F51\\u5173\"))+\"IP\\uFF1A\",1),O(t(\"input\",{id:\"tagName\",type:\"text\",\"onUpdate:modelValue\":K[8]||(K[8]=P=>e(p).setIP=P),placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,PA),[[at,e(p).setIP,void 0,{trim:!0}]])]),t(\"div\",TA,[t(\"div\",IA,i(e(a)(\"\\u65C1\\u8DEF\\u7531IP\"))+\"\\uFF1A\",1),O(t(\"input\",{id:\"tagName\",type:\"text\",\"onUpdate:modelValue\":K[9]||(K[9]=P=>e(p).checkIP=P),placeholder:e(a)(\"\\u8BF7\\u8F93\\u5165\")+\"...\",class:\"tag-input\"},null,8,MA),[[at,e(p).checkIP,void 0,{trim:!0}]])]),t(\"div\",LA,[t(\"div\",OA,[t(\"button\",{class:\"add-button add-button--danger\",onClick:j},i(e(a)(\"\\u4FDD\\u5B58\")),1)])])])):(r(),s(\"div\",yA,[FA,t(\"span\",null,i(e(a)(\"\\u8F6F\\u4EF6\\u6682\\u672A\\u5B89\\u88C5\")),1),t(\"div\",{class:\"not_installed_btn\",onClick:K[4]||(K[4]=P=>H(\"app-meta-floatip\"))},i(e(a)(\"\\u7ACB\\u5373\\u5B89\\u88C5\")),1)]))],512),[[ee,x.value===\"gateway\"]]),O(t(\"div\",null,[t(\"div\",NA,[t(\"div\",VA,[t(\"div\",GA,i(e(a)(\"\\u542F\\u7528\"))+\"DHCP\\uFF1A\",1),Y(Ot,{modelValue:e(k).dhcpEnabled,\"onUpdate:modelValue\":K[10]||(K[10]=P=>e(k).dhcpEnabled=P),onChange:R},null,8,[\"modelValue\"])]),t(\"div\",jA,[t(\"div\",UA,\"DHCP\"+i(e(a)(\"\\u7F51\\u5173\"))+\"\\uFF1A\",1),O(t(\"select\",{\"onUpdate:modelValue\":K[11]||(K[11]=P=>e(k).dhcpGateway=P),onChange:K[12]||(K[12]=()=>{})},[(r(!0),s(U,null,tt((mt=(At=m.value)==null?void 0:At.dhcpGlobal)==null?void 0:mt.gatewaySels,P=>(r(),s(\"option\",{value:P.gateway},i(P.gateway)+\" (\"+i(P.title?A(P.title):\"\")+\") \",9,qA))),256))],544),[[pt,e(k).dhcpGateway]])]),t(\"div\",RA,[t(\"div\",WA,[t(\"button\",{class:\"add-button add-button--danger\",onClick:b},i(e(a)(\"\\u4FDD\\u5B58\")),1)])])]),t(\"div\",HA,[t(\"button\",{class:\"add-button add-button--danger\",onClick:Dt},[t(\"span\",null,i(e(a)(\"\\u6DFB\\u52A0\")),1)])]),Y(Ue,{data:u.value,columns:d.value,showSelection:!1,showPagination:!1,theadBgColor:\"#e8e6f9\"},{action:V(({row:P})=>[P.autoCreated?D(\"\",!0):(r(),s(\"span\",{key:0,style:{color:\"#553AFE\",cursor:\"pointer\"},onClick:X=>Vt(P)},i(e(a)(\"\\u7F16\\u8F91\")),9,JA)),P.autoCreated?D(\"\",!0):(r(),s(\"span\",{key:1,style:{color:\"#F04134\",cursor:\"pointer\",\"margin-left\":\"18px\"},onClick:X=>bt(P)},i(e(a)(\"\\u5220\\u9664\")),9,ZA))]),tagTitle:V(({row:P})=>[t(\"span\",null,i(A(P.tagTitle)),1)]),tagName:V(({row:P})=>[t(\"span\",null,i(P.tagName||\"-\"),1)]),gateway:V(({row:P})=>[t(\"span\",null,i(P.gateway||\"-\"),1)]),_:1},8,[\"data\",\"columns\"])],512),[[ee,x.value===\"tag\"]])]),Y(iA,{ref_key:\"tagDialogRef\",ref:S,title:e(B),onConfirm:Re},null,8,[\"title\"])])}}});var QA=N(KA,[[\"__scopeId\",\"data-v-102c75ea\"]]);const po=o=>(ut(\"data-v-39804772\"),o=o(),ct(),o),XA={id:\"page\"},tS={style:{\"text-align\":\"left\",display:\"flex\",\"align-items\":\"center\",\"margin-bottom\":\"20px\",\"padding-top\":\"4px\"}},eS=po(()=>t(\"svg\",{width:\"20\",height:\"20\",viewBox:\"0 0 100 100\",xmlns:\"http://www.w3.org/2000/svg\"},[t(\"path\",{d:\"M20 30 L50 50 L20 70\",stroke:\"#d6dbf8\",\"stroke-width\":\"8\",\"stroke-linecap\":\"round\",fill:\"none\"})],-1)),aS={style:{\"text-decoration\":\"none\",color:\"var(--breadcrumbs-tit-color1)\",\"line-height\":\"1.5em\"}},oS={class:\"device_container\",style:{color:\"black\"}},nS={class:\"tab-container\"},iS={class:\"tabs_box_g\"},rS=[\"onClick\"],sS={class:\"tab-content_g\"},dS={key:0,class:\"content-item\"},lS={key:1,class:\"content-item\"},uS={key:2,class:\"content-item\"},cS={key:3,class:\"content-item\"},pS=po(()=>t(\"div\",{style:{height:\"30px\"}},null,-1)),fS=I({setup(o){const{$gettext:n}=J(),a=E([\"\\u8BBE\\u5907\\u5217\\u8868\",\"\\u9759\\u6001\\u5206\\u914D\\u5217\\u8868\",\"\\u9650\\u901F\\u8BBE\\u5907\\u5217\\u8868\",\"\\u5168\\u5C40\\u8BBE\\u7F6E\"]),l=E(0),u=E(null),d=()=>L(this,null,function*(){l.value=3,yield na(),u.value&&(u.value.activeTab=\"ip\")});return(c,k)=>{const g=_t(\"router-link\");return r(),s(U,null,[t(\"div\",XA,[t(\"div\",tS,[Y(g,{to:\"/\",style:{\"text-decoration\":\"none\",color:\"var(--breadcrumbs-tit-color)\",\"line-height\":\"1.5em\",\"margin-right\":\"4px\"}},{default:V(()=>[dt(i(e(n)(\"\\u9996\\u9875\")),1)]),_:1}),eS,t(\"a\",aS,i(e(n)(\"\\u8BBE\\u5907\\u7BA1\\u7406\")),1)])]),t(\"div\",oS,[t(\"div\",nS,[t(\"div\",iS,[(r(!0),s(U,null,tt(a.value,(p,m)=>(r(),s(\"button\",{key:m,onClick:v=>l.value=m,class:lt({active:l.value===m})},i(e(n)(p)),11,rS))),128))]),t(\"div\",sS,[l.value===0?(r(),s(\"div\",dS,[Y(TB,{onOpenGloba:d})])):D(\"\",!0),l.value===1?(r(),s(\"div\",lS,[Y(nY)])):D(\"\",!0),l.value===2?(r(),s(\"div\",uS,[Y(SY,{onOpenGloba:d})])):D(\"\",!0),l.value===3?(r(),s(\"div\",cS,[Y(QA,{ref_key:\"configureRef\",ref:u},null,512)])):D(\"\",!0)]),pS])])],64)}}});var mS=N(fS,[[\"__scopeId\",\"data-v-39804772\"]]);const gS={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},vS=[\"fill\"],bS=[\"fill\"],hS=I({props:{color:{type:String,default:\"#ffa847\"}},setup(o){return(n,a)=>(r(),s(\"svg\",gS,[t(\"path\",{d:\"M640.825806 900.129032c-18.167742 6.606452-37.987097 9.909677-57.806451 13.212903-26.425806 4.954839-44.593548 29.729032-41.290323 56.154839 4.954839 26.425806 29.729032 44.593548 56.154839 41.290323 24.774194-3.303226 47.896774-9.909677 71.019355-16.516129 26.425806-8.258065 41.290323-36.335484 33.032258-62.761291s-34.683871-39.63871-61.109678-31.380645zM974.451613 576.412903c-26.425806-6.606452-52.851613 9.909677-61.109678 36.335484-4.954839 19.819355-11.56129 37.987097-18.167741 56.154839-9.909677 24.774194 1.651613 54.503226 26.425806 64.412903 24.774194 9.909677 54.503226-1.651613 64.412903-26.425806 9.909677-23.122581 16.516129-46.245161 23.122581-69.367742 6.606452-28.077419-8.258065-54.503226-34.683871-61.109678zM814.245161 791.122581c-13.212903 14.864516-28.077419 28.077419-42.941935 39.638709-21.470968 16.516129-24.774194 47.896774-8.258065 69.367742 16.516129 21.470968 47.896774 24.774194 69.367742 8.258065 19.819355-14.864516 37.987097-31.380645 54.503226-49.548387 18.167742-19.819355 18.167742-51.2-1.651613-69.367742s-51.2-18.167742-71.019355 1.651613zM526.864516 341.883871c-28.077419 0-49.548387 21.470968-49.548387 49.548387v122.219355c0 14.864516 6.606452 28.077419 18.167742 37.987097l117.264516 97.445161c21.470968 18.167742 52.851613 14.864516 69.367742-6.606452s14.864516-52.851613-6.606452-69.367742l-99.096774-82.580645v-99.096774c0-26.425806-21.470968-49.548387-49.548387-49.548387z\",fill:o.color,\"p-id\":\"4722\"},null,8,vS),t(\"path\",{d:\"M910.03871 327.019355c28.077419 1.651613 51.2-18.167742 52.851613-46.245161l9.909677-142.03871c1.651613-28.077419-18.167742-51.2-46.245161-52.851613-28.077419-1.651613-51.2 18.167742-52.851613 46.245161v16.516129c-1.651613-1.651613-3.303226-3.303226-4.954839-3.303226-1.651613-3.303226-4.954839-4.954839-6.606452-8.258064-18.167742-16.516129-36.335484-31.380645-57.806451-46.245161-1.651613-1.651613-4.954839-3.303226-6.606452-3.303226-46.245161-31.380645-99.096774-54.503226-155.251613-69.367742-1.651613 0-3.303226-1.651613-4.954838-1.651613-8.258065-1.651613-14.864516-3.303226-23.122581-4.954839h-1.651613c-6.606452-1.651613-13.212903-3.303226-21.470968-3.303225-4.954839-1.651613-11.56129-1.651613-16.516129-1.651613-3.303226 0-6.606452-1.651613-9.909677-1.651613h-1.651613C307.2-19.819355 69.367742 153.6 18.167742 412.903226c-52.851613 275.819355 125.522581 541.729032 401.341935 594.580645 26.425806 4.954839 52.851613-11.56129 57.806452-39.63871 4.954839-26.425806-11.56129-52.851613-39.63871-57.806451h-1.651613c-19.819355-3.303226-37.987097-9.909677-56.154838-16.516129h-3.303226c-44.593548-16.516129-84.232258-39.63871-118.916129-67.716129l-4.954839-4.954839c-14.864516-13.212903-29.729032-26.425806-41.290322-41.290323-1.651613-1.651613-3.303226-3.303226-6.606452-4.954838-28.077419-33.032258-51.2-71.019355-67.716129-112.309678 0-3.303226-1.651613-6.606452-1.651613-8.258064-6.606452-18.167742-13.212903-37.987097-16.516129-56.154839 0-3.303226-1.651613-6.606452-3.303226-9.909677-8.258065-41.290323-9.909677-82.580645-4.954838-125.522581 1.651613-3.303226 1.651613-6.606452 3.303225-9.909678 3.303226-19.819355 6.606452-37.987097 13.212904-57.806451 1.651613-3.303226 1.651613-6.606452 1.651612-9.909678 13.212903-41.290323 33.032258-80.929032 57.806452-115.612903 3.303226-1.651613 4.954839-4.954839 6.606452-6.606451 11.56129-14.864516 24.774194-29.729032 39.638709-44.593549 1.651613-1.651613 3.303226-4.954839 4.954839-6.606451 33.032258-31.380645 71.019355-56.154839 112.309677-74.322581 1.651613 0 3.303226 0 3.303226-1.651613 18.167742-8.258065 37.987097-14.864516 56.154839-19.819355 1.651613 0 1.651613-1.651613 3.303226-1.651613 47.896774-13.212903 100.748387-16.516129 153.6-9.909677 3.303226 0 6.606452 1.651613 9.909677 1.651613 6.606452 1.651613 11.56129 1.651613 18.167742 3.303226 80.929032 16.516129 153.6 54.503226 209.754839 112.309677l-29.729032-1.651613c-28.077419-1.651613-51.2 18.167742-52.851613 46.245161-1.651613 28.077419 18.167742 51.2 46.245161 52.851613l142.03871 8.258065z\",fill:o.color,\"p-id\":\"4723\"},null,8,bS)]))}}),_S={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},xS=[\"fill\"],wS=I({props:{color:{type:String,default:\"#9810f9\"}},setup(o){return(n,a)=>(r(),s(\"svg\",_S,[t(\"path\",{d:\"M914.285714 548.571429a36.571429 36.571429 0 0 1 36.571429 36.571428v219.428572a146.285714 146.285714 0 0 1-146.285714 146.285714H219.428571a146.285714 146.285714 0 0 1-146.285714-146.285714v-219.428572a36.571429 36.571429 0 1 1 73.142857 0v219.428572a73.142857 73.142857 0 0 0 67.657143 72.96L219.428571 877.714286h585.142858a73.142857 73.142857 0 0 0 72.96-67.657143L877.714286 804.571429v-219.428572a36.571429 36.571429 0 0 1 36.571428-36.571428zM537.307429 83.858286l258.596571 258.596571a36.571429 36.571429 0 1 1-51.712 51.712L548.571429 198.509714 548.571429 634.733714a36.571429 36.571429 0 1 1-73.142858 0V197.485714L278.674286 394.166857a36.571429 36.571429 0 1 1-51.712-51.712l258.596571-258.596571a36.571429 36.571429 0 0 1 51.712 0z\",fill:o.color,\"p-id\":\"9077\"},null,8,xS)]))}}),Ht=o=>(ut(\"data-v-cbc39b94\"),o=o(),ct(),o),kS={class:\"item_container\"},yS={class:\"item\"},FS={class:\"item_title\"},ES={class:\"tip\"},$S={class:\"item\"},CS={class:\"item_title\"},DS={class:\"select_box\"},BS={value:null,disabled:\"\",selected:\"\"},YS=[\"value\"],AS={class:\"start_btn\"},SS={key:0,class:\"progress\"},zS=Ht(()=>t(\"span\",null,\"25%\",-1)),PS={class:\"item\"},TS={class:\"item_title\"},IS={class:\"log_info\"},MS={class:\"item\"},LS={class:\"item_title\"},OS={class:\"result_box\"},NS={class:\"result\"},VS={class:\"result_item\"},GS=Ht(()=>t(\"div\",{class:\"speed_value\"},\"105.5\",-1)),jS=Ht(()=>t(\"span\",{class:\"unit\"},\"Mbps\",-1)),US=Ht(()=>t(\"span\",{class:\"status status_bg1\"},\"\\u4F18\\u79C0\",-1)),qS={class:\"speed_title\"},RS={class:\"result_item\"},WS=Ht(()=>t(\"div\",{class:\"speed_value\"},\"105.5\",-1)),HS=Ht(()=>t(\"span\",{class:\"unit\"},\"Mbps\",-1)),JS=Ht(()=>t(\"span\",{class:\"status status_bg2\"},\"\\u826F\\u597D\",-1)),ZS={class:\"speed_title\"},KS=jt('<div class=\"line\" data-v-cbc39b94></div><div class=\"result\" data-v-cbc39b94><div class=\"result_state\" data-v-cbc39b94><div data-v-cbc39b94>18 ms</div><span class=\"status status_bg2\" data-v-cbc39b94>\\u826F\\u597D</span><span class=\"result_txt\" data-v-cbc39b94>\\u5EF6\\u8FDF</span></div><div class=\"result_state\" data-v-cbc39b94><div data-v-cbc39b94>18 ms</div><span class=\"result_txt\" data-v-cbc39b94>\\u5EF6\\u8FDF</span></div></div>',2),QS=Ht(()=>t(\"div\",{class:\"custom-content\"},[t(\"p\",null,\"\\u4EE5\\u4E0B\\u662F\\u68C0\\u6D4B\\u5230\\u7684\\u5185\\u7F51\\u5730\\u5740\\uFF0C\\u8BF7\\u70B9\\u51FB\\u8BBF\\u95EE\\u8FDB\\u884C\\u6D4B\\u901F\"),t(\"div\",{class:\"address_box\"},[t(\"span\",null,\"http://192.168.1.1\"),t(\"div\",null,\"\\u8BBF\\u95EE\")]),t(\"div\",{class:\"address_box\"},[t(\"span\",null,\"http://192.168.1.1\"),t(\"div\",null,\"\\u8BBF\\u95EE\")]),t(\"div\",{class:\"address_box\"},[t(\"span\",null,\"http://192.168.1.1\"),t(\"div\",null,\"\\u8BBF\\u95EE\")]),t(\"div\",{class:\"address_box\"},[t(\"span\",null,\"http://192.168.1.1\"),t(\"div\",null,\"\\u8BBF\\u95EE\")]),t(\"div\",{class:\"address_box\"},[t(\"span\",null,\"http://192.168.1.1\"),t(\"div\",null,\"\\u8BBF\\u95EE\")])],-1)),XS=I({setup(o){const{$gettext:n}=J(),a=E(!1),l=E([{title:\"SpeedTest.Net\",describe:\"\\u5168\\u7403\\u6807\\u51C6\\u7F51\\u901F\\u6D4B\\u8BD5\\u670D\\u52A1\",value:\"SpeedTest\"},{title:\"CDN\\u8282\\u70B9\\u6D4B\\u8BD5\",describe:\"\\u6D4B\\u8BD5\\u5230\\u4E3B\\u8981CDN\\u8282\\u70B9\\u7684\\u8FDE\\u63A5\\u901F\\u5EA6\",value:\"CDN\"},{title:\"UST\\u9AD8\\u6821\\u8282\\u70B9\",describe:\"\\u4E2D\\u79D1\\u5927\\u6559\\u80B2\\u7F51\\u8282\\u70B9\\u6D4B\\u8BD5\",value:\"UST\"},{title:\"NAT\\u7C7B\\u578B\\u6D4B\\u901F\",describe:\"\\u68C0\\u6D4B\\u7F51\\u7EDCNAT\\u7C7B\\u578B\\u548C\\u8FDE\\u901A\\u6027\",value:\"NAT\"}]),u=E(null),d=E(!1),c=()=>{!u.value||(d.value=!0)};return(k,g)=>(r(),s(U,null,[t(\"div\",kS,[t(\"div\",yS,[t(\"div\",FS,[Y(ze,{color:\"#155dfc\",class:\"icon\"}),t(\"span\",null,i(e(n)(\"\\u5185\\u7F51\\u6D4B\\u901F\")),1)]),t(\"p\",null,i(e(n)(\"\\u68C0\\u6D4B\\u672C\\u5730\\u7F51\\u7EDC\\u73AF\\u5883\\uFF0C\\u83B7\\u53D6\\u5185\\u7F51\\u8BBF\\u95EE\\u5730\\u5740\")),1),t(\"div\",{class:\"wifi_btn\",onClick:g[0]||(g[0]=p=>a.value=!0)},[t(\"div\",null,[Y(ze,{color:\"#ffffff\",class:\"icon1\"}),t(\"span\",null,i(e(n)(\"\\u5F00\\u59CB\\u5185\\u7F51\\u6D4B\\u901F\")),1)])]),t(\"p\",ES,i(e(n)(\"\\u70B9\\u51FB\\u6309\\u94AE\\u83B7\\u53D6\\u5185\\u7F51\\u6D4B\\u901F\\u5730\\u5740\\uFF0C\\u901A\\u8FC7\\u8BBF\\u95EE\\u8FD9\\u4E9B\\u5730\\u5740\\u6765\\u6D4B\\u8BD5\\u5185\\u7F51\\u8FDE\\u63A5\\u901F\\u5EA6\")),1)]),t(\"div\",$S,[t(\"div\",CS,[Y(xe,{color:\"#2bb55e\",class:\"icon\"}),t(\"span\",null,i(e(n)(\"\\u5185\\u7F51\\u6D4B\\u901F\")),1)]),t(\"p\",null,i(e(n)(\"\\u9009\\u62E9\\u6D4B\\u901F\\u8282\\u70B9\\uFF0C\\u8FDB\\u884C\\u7F51\\u7EDC\\u901F\\u5EA6\\u548C\\u8FDE\\u63A5\\u8D28\\u91CF\\u6D4B\\u8BD5\")),1),t(\"div\",DS,[t(\"div\",null,i(e(n)(\"\\u9009\\u62E9\\u6D4B\\u901F\\u8282\\u70B9\")),1),O(t(\"select\",{\"onUpdate:modelValue\":g[1]||(g[1]=p=>u.value=p),id:\"node\",required:\"\",class:lt({\"is-placeholder\":!u.value})},[t(\"option\",BS,i(e(n)(\"\\u8BF7\\u9009\\u62E9\\u6D4B\\u901F\\u8282\\u70B9\")),1),(r(!0),s(U,null,tt(l.value,p=>(r(),s(\"option\",{value:p},i(p.title)+\" - \"+i(p.describe),9,YS))),256))],2),[[pt,u.value]])]),t(\"div\",{class:lt([\"wifi_btn m-20\",{\"is-bg\":!u.value||d.value}]),onClick:c},[t(\"div\",AS,[d.value?(r(),s(\"span\",{key:0,class:lt([\"icon3-wrap\",{\"is-rotating\":d.value}])},[Y(hS,{color:\"#ffffff\",class:\"icon3\"})],2)):(r(),Z(xe,{key:1,color:\"#ffffff\",class:\"icon2\"})),t(\"span\",null,i(e(n)(\"\\u5F00\\u59CB\\u6D4B\\u901F\")),1)])],2),d.value?(r(),s(\"div\",SS,[t(\"p\",null,[dt(i(e(n)(\"\\u6D4B\\u901F\\u8FDB\\u5EA6\"))+\" \",1),zS]),Y(no,{percentage:25,showPercentage:!1,height:\"10px\",borderRadius:\"10px\",color:\"#030213\",backgroundColor:\"#cdccd0\"})])):D(\"\",!0)]),t(\"div\",PS,[t(\"div\",TS,[Y(Xa,{color:\"#ff6900\",class:\"icon2\"}),t(\"span\",null,i(e(n)(\"\\u6D4B\\u901F\\u65E5\\u5FD7\")),1)]),t(\"p\",null,i(e(n)(\"\\u5B9E\\u65F6\\u6D4B\\u901F\\u8FC7\\u7A0B\\u8BB0\\u5F55\")),1),t(\"div\",IS,[(r(),s(U,null,tt(20,p=>t(\"p\",null,\"[17:00:20] \\u6B63\\u5728\\u8FDE\\u63A5\\u5230\\u6D4B\\u8BD5\\u670D\\u52A1\\u5668...\")),64))])]),t(\"div\",MS,[t(\"div\",LS,[Y(ro,{color:\"#9865ff\",class:\"icon2\"}),t(\"span\",null,i(e(n)(\"\\u6D4B\\u901F\\u7ED3\\u679C\")),1)]),t(\"p\",null,i(e(n)(\"\\u6D4B\\u901F\\u8282\\u70B9\"))+\"\\uFF1ACDN\\u8282\\u70B9 (\\u5317\\u4EAC)\",1),t(\"div\",OS,[t(\"div\",NS,[t(\"div\",VS,[Y(Kt,{color:\"#155dfc\",class:\"icon_speed\"}),GS,jS,US,t(\"div\",qS,i(e(n)(\"\\u4E0B\\u8F7D\\u901F\\u5EA6\")),1)]),t(\"div\",RS,[Y(wS,{color:\"#00a63e\",class:\"icon_speed1\"}),WS,HS,JS,t(\"div\",ZS,i(e(n)(\"\\u4E0A\\u4F20\\u901F\\u5EA6\")),1)])]),KS])])]),Y(Xt,{modelValue:a.value,\"onUpdate:modelValue\":g[2]||(g[2]=p=>a.value=p),title:\"\\u5185\\u7F51\\u8BBF\\u95EE\\u5730\\u5740\",width:\"550px\",footerShow:!1,\"show-close\":!0},{default:V(()=>[QS]),_:1},8,[\"modelValue\"])],64))}});var tz=N(XS,[[\"__scopeId\",\"data-v-cbc39b94\"]]);const ez={width:\"200\",height:\"200\",viewBox:\"0 0 1024 1024\",xmlns:\"http://www.w3.org/2000/svg\",fill:\"none\"},az=[\"fill\"],oz=I({props:{color:{type:String,default:\"#155dfc\"}},setup(o){return(n,a)=>(r(),s(\"svg\",ez,[t(\"path\",{d:\"M0 855.04a64.896 64.896 0 0 1 129.792 0v55.637333a64.896 64.896 0 0 1-129.792 0V855.04zM213.248 669.610667a64.896 64.896 0 0 1 129.792 0v241.066666a64.896 64.896 0 0 1-129.792 0v-241.066666zM426.496 484.181333a64.896 64.896 0 0 1 129.792 0v426.496a64.896 64.896 0 1 1-129.792 0v-426.496zM639.701333 298.752a64.896 64.896 0 1 1 129.792 0v611.925333a64.896 64.896 0 0 1-129.792 0V298.752zM852.949333 113.322667a64.896 64.896 0 0 1 129.792 0v797.354666a64.896 64.896 0 0 1-129.792 0V113.322667z\",fill:o.color,\"p-id\":\"11967\"},null,8,az)]))}}),ha=o=>(ut(\"data-v-164df064\"),o=o(),ct(),o),nz={id:\"page\"},iz={style:{\"text-align\":\"left\",display:\"flex\",\"align-items\":\"center\",\"margin-bottom\":\"20px\",\"padding-top\":\"4px\"}},rz=ha(()=>t(\"svg\",{width:\"20\",height:\"20\",viewBox:\"0 0 100 100\",xmlns:\"http://www.w3.org/2000/svg\"},[t(\"path\",{d:\"M20 30 L50 50 L20 70\",stroke:\"#d6dbf8\",\"stroke-width\":\"8\",\"stroke-linecap\":\"round\",fill:\"none\"})],-1)),sz={style:{\"text-decoration\":\"none\",color:\"var(--breadcrumbs-tit-color1)\",\"line-height\":\"1.5em\"}},dz={class:\"container\",style:{color:\"black\"}},lz={class:\"title\"},uz=ha(()=>t(\"span\",null,\"\\u7F51\\u7EDC\\u6D4B\\u901F\\u5DE5\\u5177\",-1)),cz=ha(()=>t(\"p\",null,\"\\u4E13\\u4E1A\\u7684\\u7F51\\u7EDC\\u8FDE\\u63A5\\u901F\\u5EA6\\u68C0\\u6D4B\\u5DE5\\u5177\\uFF0C\\u652F\\u6301\\u5185\\u7F51\\u548C\\u5916\\u7F51\\u6D4B\\u901F\",-1)),pz=I({setup(o){const{$gettext:n}=J();return(a,l)=>{const u=_t(\"router-link\");return r(),s(U,null,[t(\"div\",nz,[t(\"div\",iz,[Y(u,{to:\"/\",style:{\"text-decoration\":\"none\",color:\"var(--breadcrumbs-tit-color)\",\"line-height\":\"1.5em\",\"margin-right\":\"4px\"}},{default:V(()=>[dt(i(e(n)(\"\\u9996\\u9875\")),1)]),_:1}),rz,t(\"a\",sz,i(e(n)(\"\\u7F51\\u7EDC\\u6D4B\\u901F\")),1)])]),t(\"div\",dz,[t(\"div\",lz,[t(\"div\",null,[Y(oz,{class:\"icon\"}),uz]),cz]),Y(tz)])],64)}}});var fz=N(pz,[[\"__scopeId\",\"data-v-164df064\"]]);const Ce=o=>(ut(\"data-v-2b19eb04\"),o=o(),ct(),o),mz=[\"onSubmit\"],gz={class:\"form-item\"},vz={class:\"label-name\"},bz={class:\"label-value switch_label\"},hz={class:\"label-flex pc-radio\"},_z=[\"disabled\"],xz=[\"disabled\"],wz=Ce(()=>t(\"div\",{class:\"switch-button\"},null,-1)),kz=[wz],yz={key:0,class:\"form-item\"},Fz={class:\"label-name\"},Ez={class:\"label-value\"},$z=[\"disabled\"],Cz={value:100},Dz={value:70},Bz={value:50},Yz={value:30},Az={key:0,class:\"select-arrow\"},Sz={class:\"form-item\"},zz={class:\"label-name\"},Pz={class:\"label-value\"},Tz=[\"disabled\",\"placeholder\"],Iz={class:\"form-item\"},Mz={class:\"label-name\"},Lz={class:\"label-value\"},Oz=[\"disabled\"],Nz=[\"value\"],Vz={key:0,class:\"select-arrow\"},Gz={class:\"form-item\"},jz={class:\"label-name\"},Uz={class:\"label-value\"},qz=[\"type\",\"disabled\",\"placeholder\"],Rz={key:0,class:\"seeIcon\",viewBox:\"0 0 22 22\",xmlns:\"http://www.w3.org/2000/svg\"},Wz=Ce(()=>t(\"path\",{d:\"M12 6c3.79 0 7.17 2.13 8.82 5.5-.59 1.22-1.42 2.27-2.41 3.12l1.41 1.41c1.39-1.23 2.49-2.77 3.18-4.53C21.27 7.11 17 4 12 4c-1.27 0-2.49.2-3.64.57l1.65 1.65C10.66 6.09 11.32 6 12 6zm-1.07 1.14L13 9.21c.57.25 1.03.71 1.28 1.28l2.07 2.07c.08-.34.14-.7.14-1.07C16.5 9.01 14.48 7 12 7c-.37 0-.72.05-1.07.14zM2.01 3.87l2.68 2.68C3.06 7.83 1.77 9.53 1 11.5 2.73 15.89 7 19 12 19c1.52 0 2.98-.29 4.32-.82l3.42 3.42 1.41-1.41L3.42 2.45 2.01 3.87zm7.5 7.5l2.61 2.61c-.04.01-.08.02-.12.02-1.38 0-2.5-1.12-2.5-2.5 0-.05.01-.08.01-.13zm-3.4-3.4l1.75 1.75c-.23.55-.36 1.15-.36 1.78 0 2.48 2.02 4.5 4.5 4.5.63 0 1.23-.13 1.77-.36l.98.98c-.88.24-1.8.38-2.75.38-3.79 0-7.17-2.13-8.82-5.5.7-1.43 1.72-2.61 2.93-3.53z\",fill:\"currentColor\"},null,-1)),Hz=[Wz],Jz={key:1,class:\"seeIcon\",viewBox:\"0 0 22 22\",xmlns:\"http://www.w3.org/2000/svg\"},Zz=Ce(()=>t(\"path\",{d:\"M12 4.5C7 4.5 2.73 7.61 1 12c1.73 4.39 6 7.5 11 7.5s9.27-3.11 11-7.5c-1.73-4.39-6-7.5-11-7.5zM12 17c-2.76 0-5-2.24-5-5s2.24-5 5-5 5 2.24 5 5-2.24 5-5 5zm0-8c-1.66 0-3 1.34-3 3s1.34 3 3 3 3-1.34 3-3-1.34-3-3-3z\",fill:\"currentColor\"},null,-1)),Kz=[Zz],Qz={class:\"form-item\"},Xz={class:\"label-name\"},tP={class:\"label-value\"},eP=[\"disabled\"],aP={value:!1},oP={value:!0},nP={key:0,class:\"select-arrow\"},iP={key:1,class:\"form-item\"},rP={class:\"label-name\"},sP={class:\"label-value\"},dP=[\"disabled\"],lP=[\"value\"],uP={key:0,class:\"select-arrow\"},cP={key:2,class:\"form-item\"},pP={class:\"label-name\"},fP={class:\"label-value\"},mP=[\"disabled\"],gP=Ce(()=>t(\"option\",{value:\"20\"},\"20 MHz\",-1)),vP=Ce(()=>t(\"option\",{value:\"40\"},\"40 MHz\",-1)),bP={key:0,value:\"auto\"},hP={key:1,value:\"80\"},_P={key:2,value:\"160\"},xP={key:0,class:\"select-arrow\"},wP={key:3,class:\"form-item\"},kP={class:\"label-name\"},yP={class:\"label-value\"},FP=[\"disabled\"],EP={value:0},$P=[\"value\"],CP=[\"disabled\"],DP={value:0},BP=jt('<option value=\"36\" data-v-2b19eb04>36</option><option value=\"40\" data-v-2b19eb04>40</option><option value=\"44\" data-v-2b19eb04>44</option><option value=\"48\" data-v-2b19eb04>48</option><option value=\"52\" data-v-2b19eb04>52(DFS)</option><option value=\"56\" data-v-2b19eb04>56(DFS)</option><option value=\"60\" data-v-2b19eb04>60(DFS)</option><option value=\"64\" data-v-2b19eb04>64(DFS)</option><option value=\"149\" data-v-2b19eb04>149</option><option value=\"153\" data-v-2b19eb04>153</option><option value=\"157\" data-v-2b19eb04>157</option><option value=\"161\" data-v-2b19eb04>161</option>',12),YP={key:2,class:\"select-arrow\"},AP={key:4,class:\"form-item\"},SP={class:\"label-name\"},zP={class:\"label-value\"},PP=[\"placeholder\",\"disabled\"],TP={class:\"label-btns\"},IP=[\"disabled\"],MP=I({props:{data:null},emits:[\"getData\"],setup(o,{emit:n}){const a=o,{$gettext:l,$ngettext:u}=J(),d=E(Object.assign({},a.data)),c=Yo(\"disabled\"),k=E(!0),g=()=>{c.value||(d.value.disabled=!d.value.disabled)};$t(()=>d.value.disabled,y=>{m()});const p=()=>L(this,null,function*(){if(d.value.txpower===a.data.txpower)return;const y=$.Loading(\"\\u914D\\u7F6E\\u4E2D...\");try{const{data:f}=yield G.Quickwifi.Power.POST({device:d.value.device||\"\",txpower:d.value.txpower||0}),{error:F,success:w}=f;if(F)throw F;(w==null||w==0)&&$.Success(\"\\u914D\\u7F6E\\u5B8C\\u6210\")}catch(f){throw $.Error(\"\\u914D\\u7F6E\\u5931\\u8D25\\uFF0C\\u8BF7\\u91CD\\u8BD5\"),f}finally{y.Close()}}),m=()=>L(this,null,function*(){const y=$.Loading(\"\\u914D\\u7F6E\\u4E2D...\");try{const{data:f}=yield G.Quickwifi.Switch.POST({ifaceName:d.value.ifaceName||\"\",enable:!d.value.disabled}),{error:F,success:w}=f;if(F)throw F;(w==null||w==0)&&$.Success(\"\\u914D\\u7F6E\\u5B8C\\u6210\")}catch(f){throw console.error(\"\\u8BF7\\u6C42\\u51FA\\u9519:\",f),$.Error(\"\\u914D\\u7F6E\\u5931\\u8D25\\uFF0C\\u8BF7\\u91CD\\u8BD5\"),f}finally{y.Close()}}),v=()=>L(this,null,function*(){const y=st({},d.value);delete y.encryptSelects,delete y.hwmodeSelects,delete y.disabled,delete y.txpower;const{data:f}=yield G.Quickwifi.Edit.POST(y),{error:F,success:w}=f;if(F)throw F;(w==null||w==0)&&$.Success(\"\\u914D\\u7F6E\\u5B8C\\u6210\")}),b=()=>L(this,null,function*(){if(c.value)return;c.value=!0;const y=$.Loading(\"\\u914D\\u7F6E\\u4E2D...\");try{yield v(),yield n(\"getData\")}catch(f){const F=$.Error(`${f}`);setTimeout(()=>{F.Close()},2e3)}finally{y.Close(),c.value=!1}});return(y,f)=>(r(),s(\"form\",{class:\"form-container\",onSubmit:ft(b,[\"prevent\"])},[t(\"div\",gz,[t(\"div\",vz,[t(\"span\",null,i(e(l)(\"\\u542F\\u7528Wi-Fi\")),1)]),t(\"div\",bz,[t(\"div\",hz,[t(\"label\",null,[O(t(\"input\",{type:\"radio\",value:!1,\"onUpdate:modelValue\":f[0]||(f[0]=F=>d.value.disabled=F),disabled:e(c)},null,8,_z),[[Bt,d.value.disabled]]),dt(\" \"+i(e(l)(\"\\u5F00\\u542F\")),1)]),t(\"label\",null,[O(t(\"input\",{type:\"radio\",value:!0,\"onUpdate:modelValue\":f[1]||(f[1]=F=>d.value.disabled=F),disabled:e(c)},null,8,xz),[[Bt,d.value.disabled]]),dt(\" \"+i(e(l)(\"\\u5173\\u95ED\")),1)])]),t(\"div\",{class:\"mobile-switch\",onClick:g},[t(\"div\",{class:lt([\"switch-core\",{\"is-checked\":!d.value.disabled,\"is-disabled\":e(c)}])},kz,2)])])]),d.value.isGuest?D(\"\",!0):(r(),s(\"div\",yz,[t(\"div\",Fz,[t(\"span\",null,i(e(l)(\"\\u53D1\\u5C04\\u529F\\u7387\")),1)]),t(\"div\",Ez,[O(t(\"select\",{\"onUpdate:modelValue\":f[2]||(f[2]=F=>d.value.txpower=F),disabled:e(c),onChange:p},[t(\"option\",Cz,i(e(l)(\"\\u6700\\u5927\")),1),t(\"option\",Dz,i(e(l)(\"\\u9AD8\")),1),t(\"option\",Bz,i(e(l)(\"\\u4E2D\")),1),t(\"option\",Yz,i(e(l)(\"\\u4F4E\")),1)],40,$z),[[pt,d.value.txpower]]),e(c)?D(\"\",!0):(r(),s(\"div\",Az))])])),t(\"div\",Sz,[t(\"div\",zz,[t(\"span\",null,i(e(l)(\"Wi-Fi\\u540D\\u79F0\\uFF08SSID\\uFF09\")),1)]),t(\"div\",Pz,[O(t(\"input\",{\"onUpdate:modelValue\":f[3]||(f[3]=F=>d.value.ssid=F),disabled:e(c),placeholder:e(l)(\"\\u8BF7\\u8F93\\u5165WIFI\\u540D\\u79F0\")},null,8,Tz),[[at,d.value.ssid]])])]),t(\"div\",Iz,[t(\"div\",Mz,[t(\"span\",null,i(e(l)(\"Wi-Fi \\u5B89\\u5168\\u6027\")),1)]),t(\"div\",Lz,[O(t(\"select\",{\"onUpdate:modelValue\":f[4]||(f[4]=F=>d.value.encryption=F),disabled:e(c)},[(r(!0),s(U,null,tt(d.value.encryptSelects,F=>(r(),s(\"option\",{value:F},i(F),9,Nz))),256))],8,Oz),[[pt,d.value.encryption]]),e(c)?D(\"\",!0):(r(),s(\"div\",Vz))])]),t(\"div\",Gz,[t(\"div\",jz,[t(\"span\",null,i(e(l)(\"Wi-Fi \\u5BC6\\u7801\")),1)]),t(\"div\",Uz,[O(t(\"input\",{\"onUpdate:modelValue\":f[5]||(f[5]=F=>d.value.key=F),class:\"password_input\",type:k.value?\"password\":\"\",disabled:e(c),placeholder:e(l)(\"\\u8BF7\\u8F93\\u5165WIFI\\u5BC6\\u7801\")},null,8,qz),[[Ao,d.value.key]]),e(c)?D(\"\",!0):(r(),s(\"div\",{key:0,onClick:f[6]||(f[6]=F=>k.value=!k.value)},[k.value?(r(),s(\"svg\",Rz,Hz)):(r(),s(\"svg\",Jz,Kz))]))])]),t(\"div\",Qz,[t(\"div\",Xz,[t(\"span\",null,i(e(l)(\"SSID \\u53EF\\u89C1\\u6027\")),1)]),t(\"div\",tP,[O(t(\"select\",{\"onUpdate:modelValue\":f[7]||(f[7]=F=>d.value.hidden=F),disabled:e(c)},[t(\"option\",aP,i(e(l)(\"\\u663E\\u793A\")),1),t(\"option\",oP,i(e(l)(\"\\u9690\\u85CF\")),1)],8,eP),[[pt,d.value.hidden]]),e(c)?D(\"\",!0):(r(),s(\"div\",nP))])]),d.value.isGuest?D(\"\",!0):(r(),s(\"div\",iP,[t(\"div\",rP,[t(\"span\",null,i(e(l)(\"\\u65E0\\u7EBF\\u6A21\\u5F0F\")),1)]),t(\"div\",sP,[O(t(\"select\",{\"onUpdate:modelValue\":f[8]||(f[8]=F=>d.value.hwmode=F),disabled:e(c)},[(r(!0),s(U,null,tt(d.value.hwmodeSelects,F=>(r(),s(\"option\",{value:F},i(F),9,lP))),256))],8,dP),[[pt,d.value.hwmode]]),e(c)?D(\"\",!0):(r(),s(\"div\",uP))])])),d.value.isGuest?D(\"\",!0):(r(),s(\"div\",cP,[t(\"div\",pP,[t(\"span\",null,i(e(l)(\"\\u9891\\u5BBD\")),1)]),t(\"div\",fP,[O(t(\"select\",{\"onUpdate:modelValue\":f[9]||(f[9]=F=>d.value.htmode=F),disabled:e(c)},[gP,vP,d.value.band===\"2g\"?(r(),s(\"option\",bP,\" 20/40 MHz \")):D(\"\",!0),d.value.band===\"5g\"?(r(),s(\"option\",hP,\" 80 MHz \")):D(\"\",!0),d.value.band===\"5g\"?(r(),s(\"option\",_P,\" 160 MHz \")):D(\"\",!0)],8,mP),[[pt,d.value.htmode]]),e(c)?D(\"\",!0):(r(),s(\"div\",xP))])])),d.value.isGuest?D(\"\",!0):(r(),s(\"div\",wP,[t(\"div\",kP,[t(\"span\",null,i(e(l)(\"\\u4FE1\\u9053\")),1)]),t(\"div\",yP,[d.value.band===\"2g\"?O((r(),s(\"select\",{key:0,\"onUpdate:modelValue\":f[10]||(f[10]=F=>d.value.channel=F),disabled:e(c)},[t(\"option\",EP,i(e(l)(\"\\u81EA\\u52A8\")),1),(r(),s(U,null,tt(13,F=>t(\"option\",{value:F},i(F),9,$P)),64))],8,FP)),[[pt,d.value.channel,void 0,{number:!0}]]):D(\"\",!0),d.value.band===\"5g\"?O((r(),s(\"select\",{key:1,\"onUpdate:modelValue\":f[11]||(f[11]=F=>d.value.channel=F),disabled:e(c)},[t(\"option\",DP,i(e(l)(\"\\u81EA\\u52A8\")),1),BP],8,CP)),[[pt,d.value.channel,void 0,{number:!0}]]):D(\"\",!0),e(c)?D(\"\",!0):(r(),s(\"div\",YP))])])),d.value.isGuest?D(\"\",!0):(r(),s(\"div\",AP,[t(\"div\",SP,[t(\"span\",null,i(e(l)(\"\\u7F51\\u7EDC\")),1)]),t(\"div\",zP,[O(t(\"input\",{type:\"text\",placeholder:e(l)(\"\\u8BF7\\u914D\\u7F6E\\u7F51\\u7EDC\\u540D\\u79F0\"),required:\"\",\"onUpdate:modelValue\":f[12]||(f[12]=F=>d.value.network=F),disabled:e(c)},null,8,PP),[[at,d.value.network]])])])),t(\"div\",TP,[t(\"button\",{class:\"btn primary-btn\",disabled:e(c),onClick:b},i(e(l)(\"\\u4FDD\\u5B58\\u914D\\u7F6E\")),9,IP)])],40,mz))}});var LP=N(MP,[[\"__scopeId\",\"data-v-2b19eb04\"]]);const qe=o=>(ut(\"data-v-42d0731d\"),o=o(),ct(),o),OP={id:\"page\",class:\"page-container\"},NP={class:\"mobile-tags-container\"},VP={class:\"tags-wrapper\"},GP={class:\"tags-scroll\"},jP=[\"onClick\"],UP={class:\"more-btn-wrapper\"},qP=qe(()=>t(\"div\",{class:\"fade-overlay\"},null,-1)),RP=qe(()=>t(\"div\",{class:\"line\"},null,-1)),WP=qe(()=>t(\"div\",{class:\"line\"},null,-1)),HP=qe(()=>t(\"div\",{class:\"line\"},null,-1)),JP=[RP,WP,HP],ZP={class:\"page-flex\"},KP={class:\"page-sidebar\"},QP=[\"onClick\"],XP={class:\"page-main\"},tT={class:\"popup-content\"},eT={class:\"popup-tags\"},aT=[\"onClick\"],oT={class:\"popup-footer\"},nT=I({setup(o){var F;const{$gettext:n}=J(),a=E(!1);So(\"disabled\",a);const l=E([]),u=Te(),d=Pe(),c=E(String((F=u==null?void 0:u.query)==null?void 0:F.tab)),k=E(!1),g=w=>{var h;return(h=w.band)==null?void 0:h.toUpperCase()},p=w=>w.isGuest?w.band+\"_Guest\":w.ssid,m=w=>{a.value||(c.value=p(w),k.value=!1,c.value!==u.query.tab&&d.push({query:{tab:c.value}}))},v=E(),b=w=>{a.value||(v.value=p(w))},y=()=>{k.value=!1,v.value!==u.query.tab&&d.push({query:{tab:v.value}})};$t(()=>k.value,w=>{w?v.value=c.value:c.value=v.value});const f=()=>L(this,null,function*(){try{const{data:w}=yield G.Quickwifi.List.GET(),{error:h,result:_}=w;if(h)throw h;_!=null&&_.ifaces&&(l.value=_.ifaces.map(C=>vt(st({},C),{hidden:C.hidden||!1,disabled:C.disabled||!1,isGuest:C.isGuest||!1,channel:C.channel||0,txpower:C.txpower||0,ifaceIndex:C.ifaceIndex||0})));let x=!1;for(let C=0;C<l.value.length;C++)if(p(l.value[C])===c.value){m(l.value[C]),x=!0;break}!x&&l.value.length>0&&m(l.value[0])}catch(w){console.log(w)}});return f(),(w,h)=>(r(),s(\"div\",OP,[t(\"div\",NP,[t(\"div\",VP,[t(\"div\",GP,[(r(!0),s(U,null,tt(l.value,_=>(r(),s(\"div\",{key:p(_),class:lt(c.value===p(_)?\"tag-item active\":\"tag-item\"),onClick:ft(x=>m(_),[\"stop\"])},i(g(_))+\" \"+i(_.isGuest?` ${e(n)(\"\\u8BBF\\u5BA2\")}`:\"\")+\" Wi-Fi \"+i(_.ifaceIndex?`[${_.ifaceIndex}]`:\"\"),11,jP))),128))]),t(\"div\",UP,[qP,t(\"div\",{class:\"more-btn\",onClick:h[0]||(h[0]=_=>k.value=!0)},JP)])])]),t(\"div\",ZP,[t(\"div\",KP,[(r(!0),s(U,null,tt(l.value,_=>(r(),s(\"div\",{key:p(_),class:lt(c.value===p(_)?\"item activeItem\":\"item\"),onClick:ft(x=>m(_),[\"stop\"])},i(g(_))+\" \"+i(_.isGuest?` ${e(n)(\"\\u8BBF\\u5BA2\")}`:\"\")+\" Wi-Fi \"+i(_.ifaceIndex?`[${_.ifaceIndex}]`:\"\"),11,QP))),128))]),t(\"div\",XP,[(r(!0),s(U,null,tt(l.value,_=>(r(),s(U,{key:p(_)},[c.value===p(_)?(r(),Z(LP,{key:0,data:_,onGetData:f},null,8,[\"data\"])):D(\"\",!0)],64))),128))])]),k.value?(r(),s(\"div\",{key:0,class:\"popup-overlay\",onClick:h[2]||(h[2]=ft(_=>k.value=!1,[\"self\"]))},[t(\"div\",tT,[t(\"div\",eT,[(r(!0),s(U,null,tt(l.value,_=>(r(),s(\"div\",{key:p(_),class:lt(v.value===p(_)?\"popup-tag-item active\":\"popup-tag-item\"),onClick:ft(x=>b(_),[\"stop\"])},i(g(_))+\" \"+i(_.isGuest?` ${e(n)(\"\\u8BBF\\u5BA2\")}`:\"\")+\" Wi-Fi \"+i(_.ifaceIndex?`[${_.ifaceIndex}]`:\"\"),11,aT))),128))]),t(\"div\",oT,[t(\"button\",{class:\"cancel-btn\",onClick:h[1]||(h[1]=_=>k.value=!1)},i(e(n)(\"\\u53D6\\u6D88\")),1),t(\"button\",{class:\"confirm-btn\",onClick:y},i(e(n)(\"\\u786E\\u5B9A\")),1)])])])):D(\"\",!0)]))}});var iT=N(nT,[[\"__scopeId\",\"data-v-42d0731d\"]]);const rT=()=>window.vue_base||\"/cgi-bin/luci/admin/quickstart\",fo=zo({history:Po(rT()),routes:[{name:\"IndexPage\",path:\"/\",meta:{title:\"\\u63A7\\u5236\\u53F0\"},component:fh},{name:\"NetworkPage\",path:\"/network\",meta:{title:\"\\u7F51\\u7EDC\\u8BBE\\u7F6E\\u5411\\u5BFC\"},component:vh,children:[{path:\"\",component:Zh},{path:\"pppoe\",component:__},{path:\"dhcp\",component:nx},{path:\"gateway\",component:Hx}]},{path:\"/quickwifi\",component:iT},{name:\"RaidPage\",path:\"/raid\",meta:{title:\"raid\\u5411\\u5BFC\"},component:by},{name:\"SmartPage\",path:\"/smart\",meta:{title:\"smart\\u68C0\\u6D4B\"},component:Ey,children:[{path:\"\",component:$$},{path:\"task\",component:V$},{path:\"log\",component:q$}]},{path:\"/interfaceconfig\",component:eD},{path:\"/devicemanagement\",component:mS},{path:\"/networkSpeedTest\",component:fz}]});fo.beforeEach((o,n)=>(o.meta.title,!0));const Ct=xt(sn);Ct.component(\"svg-menu\",mn);Ct.component(\"svg-system\",xn);Ct.component(\"svg-download\",$n);Ct.component(\"svg-store\",Pn);Ct.component(\"svg-info\",Nn);Ct.component(\"svg-disk\",ui);Ct.component(\"svg-nav\",vi);Ct.component(\"progress-item\",Ua);Ct.component(\"svg-view-show\",Ni);Ct.component(\"svg-view-hidden\",Ri);Ct.component(\"article-item\",Xi);Ct.component(\"switch-box\",qa);Ct.component(\"editable-select\",Zt);Ct.use(Ra);Ct.use(fo);Ct.use(To());Mo(Ct).finally(()=>Ct.mount(\"#app\"))});export default sT();\n"
  },
  {
    "path": "luci-app-quickstart/htdocs/luci-static/quickstart/style.css",
    "content": "@keyframes bganimation-0698ba82{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-0698ba82{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-0698ba82{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-0698ba82]{animation:rotateEnter-0698ba82 .7s;position:relative}.rotate-leave-active[data-v-0698ba82]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-0698ba82]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.disk-item-tooltip[data-v-0698ba82]{position:fixed;background:rgba(0,0,0,.7);z-index:10111;color:#fff;padding:.5rem 1rem;font-size:1em;min-width:200px;line-height:24px}.disk-item-tooltip[data-v-0698ba82]:after{content:\"\";position:absolute;bottom:-6px;border-color:#4c4c4c rgba(0,0,0,0) rgba(0,0,0,0);left:0;right:0;text-align:center;width:0;margin:0 auto;border-width:6px 8px 0;border-style:solid}#main .app-btn,#actioner .app-btn{min-height:36px}@keyframes bganimation-9bc295c2{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-9bc295c2{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-9bc295c2{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-9bc295c2]{animation:rotateEnter-9bc295c2 .7s;position:relative}.rotate-leave-active[data-v-9bc295c2]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-9bc295c2]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}#main[data-v-9bc295c2]{width:100%}#main[data-v-9bc295c2],#main[data-v-9bc295c2] *{-webkit-box-sizing:border-box;-webkit-tap-highlight-color:transparent;box-sizing:border-box;word-wrap:break-word;outline:none}@keyframes bganimation{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active{animation:rotateEnter .7s;position:relative}.rotate-leave-active{opacity:0;display:none;position:relative;z-index:-999}.app-container{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}:root{--flow-bg-color: #fff;--flow-span-color: rgba(0, 0, 0, .6);--card-bg-color: #fff;--card-box-shadow: 0 0 10px 1px #bfbfbf24;--app-container_title-color: #1e1e1e;--app-container_status-label_block: black;--item-label_key-span-color: #333;--item-label_value-span-color: #333;--app-container_status-label_bg: #f3f3f3;--item_btn-border: 1px solid #553afb;--item_btn-color: #553afb;--tit-color: #1e1e1e;--popup-bg-color: #fff;--tag-bg-color: #f5f5f5;--gradient-bg-color:linear-gradient(90deg, rgba(255,255,255,0) 0%, rgba(255,255,255,.8) 62%, rgba(255,255,255,1) 100%);--breadcrumbs-tit-color:#d6dbf8;--breadcrumbs-tit-color1:#f1f2f9;--border-color: #e5e5e5;--SystemUpdateBanner-bg-color: #eff6ff;--SystemUpdateBanner-border-color: #bedbff;--btn-border-color: #e5e5e5;--card-txt-color: #32325d;--SystemInfo-bg-color:#f9fafd}@media (prefers-color-scheme: light){:root{--flow-bg-color: #fff;--flow-span-color: rgba(0, 0, 0, .6);--card-bg-color: #fff;--card-box-shadow: 0 0 10px 1px #bfbfbf24;--app-container_title-color: #1e1e1e;--app-container_status-label_block: black;--item-label_key-span-color: #333;--item-label_value-span-color: #333;--app-container_status-label_bg: #f3f3f3;--item_btn-border: 1px solid #553afb;--item_btn-color: #553afb;--tit-color: #1e1e1e;--popup-bg-color: #fff;--tag-bg-color: #f5f5f5;--gradient-bg-color:linear-gradient(90deg, rgba(255,255,255,0) 0%, rgba(255,255,255,.8) 62%, rgba(255,255,255,1) 100%);--breadcrumbs-tit-color:#d6dbf8;--breadcrumbs-tit-color1:#f1f2f9;--border-color: #e5e5e5;--SystemUpdateBanner-bg-color: #eff6ff;--SystemUpdateBanner-border-color: #bedbff;--btn-border-color: #e5e5e5;--card-txt-color: #32325d;--SystemInfo-bg-color:#f9fafd}}@media (prefers-color-scheme: dark){:root{--flow-bg-color: transparent;--flow-span-color: #cccccc;--card-bg-color: #88888822;--card-box-shadow: 0 0 .5rem 0 rgba(0, 0, 0, .35);--app-container_title-color: #cccccc;--app-container_status-label_block: #727272;--item-label_key-span-color: #cccccc;--item-label_value-span-color: #cccccc;--app-container_status-label_bg: #0000001a;--item_btn-border: 1px solid #cccccc;--item_btn-color: #cccccc;--tit-color: #cccccc;--popup-bg-color: #000;--tag-bg-color: #1e1e1e;--gradient-bg-color:linear-gradient(90deg, rgba(0,0,0,0) 0%, rgba(0,0,0,.8) 62%, rgba(0,0,0,1) 100%);--breadcrumbs-tit-color:#d6dbf8;--breadcrumbs-tit-color1:#f1f2f9;--border-color: #0000001a;--SystemUpdateBanner-bg-color: #2c2c2c;--SystemUpdateBanner-border-color: #2c2c2c;--btn-border-color: #727272;--card-txt-color: #32325d;--SystemInfo-bg-color:#2c2c2c}#app svg path{color:#666}#app svg circle{stroke:#666}}@media (prefers-color-scheme: no-preference){:root{--flow-bg-color: #fff;--flow-span-color: rgba(0, 0, 0, .6);--card-bg-color: #fff;--card-box-shadow: 0 0 10px 1px #bfbfbf24;--app-container_title-color: #1e1e1e;--app-container_status-label_block: black;--item-label_key-span-color: #333;--item-label_value-span-color: #333;--app-container_status-label_bg: #f3f3f3;--item_btn-border: 1px solid #553afb;--item_btn-color: #553afb;--tit-color: #1e1e1e;--popup-bg-color: #fff;--tag-bg-color: #f5f5f5;--gradient-bg-color:linear-gradient(90deg, rgba(255,255,255,0) 0%, rgba(255,255,255,.8) 62%, rgba(255,255,255,1) 100%);--breadcrumbs-tit-color:#d6dbf8;--breadcrumbs-tit-color1:#f1f2f9;--border-color: #e5e5e5;--SystemUpdateBanner-bg-color: #eff6ff;--SystemUpdateBanner-border-color: #bedbff;--btn-border-color: #e5e5e5;--card-txt-color: #32325d;--SystemInfo-bg-color:#f9fafd}}body[theme=dark]{--flow-bg-color: transparent;--flow-span-color: #cccccc;--card-bg-color: #88888822;--card-box-shadow: 0 0 .5rem 0 rgba(0, 0, 0, .35);--app-container_title-color: #cccccc;--app-container_status-label_block: #727272;--item-label_key-span-color: #cccccc;--item-label_value-span-color: #cccccc;--app-container_status-label_bg: #0000001a;--item_btn-border: 1px solid #cccccc;--item_btn-color: #cccccc;--tit-color: #cccccc;--popup-bg-color: #000;--tag-bg-color: #1e1e1e;--gradient-bg-color:linear-gradient(90deg, rgba(0,0,0,0) 0%, rgba(0,0,0,.8) 62%, rgba(0,0,0,1) 100%);--breadcrumbs-tit-color:#d6dbf8;--breadcrumbs-tit-color1:#f1f2f9;--border-color: #0000001a;--SystemUpdateBanner-bg-color: #2c2c2c;--SystemUpdateBanner-border-color: #2c2c2c;--btn-border-color: #727272;--card-txt-color: #32325d;--SystemInfo-bg-color:#2c2c2c}body[theme=light]{--flow-bg-color: #fff;--flow-span-color: rgba(0, 0, 0, .6);--card-bg-color: #fff;--card-box-shadow: 0 0 10px 1px #bfbfbf24;--app-container_title-color: #1e1e1e;--app-container_status-label_block: black;--item-label_key-span-color: #333;--item-label_value-span-color: #333;--app-container_status-label_bg: #f3f3f3;--item_btn-border: 1px solid #553afb;--item_btn-color: #553afb;--tit-color: #1e1e1e;--popup-bg-color: #fff;--tag-bg-color: #f5f5f5;--gradient-bg-color:linear-gradient(90deg, rgba(255,255,255,0) 0%, rgba(255,255,255,.8) 62%, rgba(255,255,255,1) 100%);--breadcrumbs-tit-color:#d6dbf8;--breadcrumbs-tit-color1:#f1f2f9;--border-color: #e5e5e5;--SystemUpdateBanner-bg-color: #eff6ff;--SystemUpdateBanner-border-color: #bedbff;--btn-border-color: #e5e5e5;--card-txt-color: #32325d;--SystemInfo-bg-color:#f9fafd}@keyframes bganimation-733828e1{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-733828e1{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-733828e1{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-733828e1]{animation:rotateEnter-733828e1 .7s;position:relative}.rotate-leave-active[data-v-733828e1]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-733828e1]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.progress[data-v-733828e1]{width:100%;display:block;position:relative;background-color:#eee;border-radius:4px;height:18px;line-height:18px;overflow:hidden}.progress .progress-value[data-v-733828e1]{transition:.5s;position:absolute;left:0;top:0;bottom:0;height:100%;text-align:center;color:#fff;vertical-align:middle;font-size:12px}@keyframes bganimation-76324716{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-76324716{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-76324716{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-76324716]{animation:rotateEnter-76324716 .7s;position:relative}.rotate-leave-active[data-v-76324716]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-76324716]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}label.checkbox_switch[data-v-76324716]{cursor:pointer;display:flex!important;align-items:center;width:initial!important}label.checkbox_switch input[type=checkbox][data-v-76324716]{height:0!important;width:0!important;opacity:0!important;margin:0!important;padding:0!important;border:none!important}label.checkbox_switch .checkbox_switch_on[data-v-76324716],label.checkbox_switch .checkbox_switch_off[data-v-76324716]{flex:none}label.checkbox_switch .checkbox_switch_on[data-v-76324716]{display:none!important}label.checkbox_switch .checkbox_switch_off[data-v-76324716]{display:inline-flex!important}label.checkbox_switch input[type=checkbox]:checked~.checkbox_switch_on[data-v-76324716]{display:inline-flex!important}label.checkbox_switch input[type=checkbox]:checked~.checkbox_switch_off[data-v-76324716]{display:none!important}label.checkbox_switch svg[data-v-76324716]{height:1em;width:2em}article[data-v-bd286d4e]{flex:0 0 100%;max-width:20%;position:relative;border-radius:4px;padding:10px}@media screen and (max-width: 1080px){article[data-v-bd286d4e]{max-width:33.333%}}@keyframes bganimation-bd286d4e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-bd286d4e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-bd286d4e{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-bd286d4e]{animation:rotateEnter-bd286d4e .7s;position:relative}.rotate-leave-active[data-v-bd286d4e]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-bd286d4e]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 768px){article[data-v-bd286d4e]{max-width:50%}}@keyframes bganimation-123deb20{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-123deb20{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-123deb20{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-123deb20]{animation:rotateEnter-123deb20 .7s;position:relative}.rotate-leave-active[data-v-123deb20]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-123deb20]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}a[data-v-123deb20]{position:relative;display:block;width:100%;transition:.4s;cursor:pointer}a[data-v-123deb20]:hover{transform:scale(1.07);transition:.4s;position:relative}a:hover .cover .thumbnail[data-v-123deb20]{box-shadow:0 6px 40px #1c67f2}a .cover[data-v-123deb20]{position:relative;padding-top:130%;z-index:1}a .cover[data-v-123deb20] .thumbnail{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:contain;border-radius:6px;overflow:hidden;z-index:1;background-color:#2dc8fd;display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center}a .cover[data-v-123deb20] .thumbnail i{display:block;font-size:100px;color:#eee}a .cover[data-v-123deb20] .thumbnail span{display:block;text-align:center;width:100%;color:#eeee;font-size:28px;margin:1rem 0}article:nth-child(9n+1) a .cover .thumbnail[data-v-123deb20]{background-color:#ff9100}article:nth-child(9n+2) a .cover .thumbnail[data-v-123deb20]{background-color:#2dc8fd}article:nth-child(9n+3) a .cover .thumbnail[data-v-123deb20]{background-color:#f66a2c}article:nth-child(9n+4) a .cover .thumbnail[data-v-123deb20]{background-color:#9b58de}article:nth-child(9n+5) a .cover .thumbnail[data-v-123deb20]{background-color:#297ff3}article:nth-child(9n+6) a .cover .thumbnail[data-v-123deb20]{background-color:#27aa8f}article:nth-child(9n+7) a .cover .thumbnail[data-v-123deb20]{background-color:#f15a4a}article:nth-child(9n+8) a .cover .thumbnail[data-v-123deb20]{background-color:#439c07}@keyframes bganimation-0b6f3a7d{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-0b6f3a7d{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-0b6f3a7d{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-0b6f3a7d]{animation:rotateEnter-0b6f3a7d .7s;position:relative}.rotate-leave-active[data-v-0b6f3a7d]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-0b6f3a7d]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.select-editable[data-v-0b6f3a7d]{position:relative;line-height:1.5rem;padding:.5rem .75rem;border:1px solid #dee2e6;border-radius:.25rem;margin:.25rem .1rem}.select-editable select[data-v-0b6f3a7d],.select-editable input[data-v-0b6f3a7d]{height:100%;padding:0;border:none;margin:0}.select-editable select[data-v-0b6f3a7d]{position:relative;width:100%}.select-editable input[data-v-0b6f3a7d]{position:absolute;top:0;left:.75rem;width:88%}.select-editable select[data-v-0b6f3a7d]:focus,.select-editable input[data-v-0b6f3a7d]:focus{outline:none;box-shadow:none}@keyframes bganimation-0ec4e762{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-0ec4e762{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-0ec4e762{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-0ec4e762]{animation:rotateEnter-0ec4e762 .7s;position:relative}.rotate-leave-active[data-v-0ec4e762]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-0ec4e762]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@keyframes turn-0ec4e762{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}.quick-loading[data-v-0ec4e762]{animation:turn-0ec4e762 1s steps(12,end) infinite;margin:0!important;padding:0!important;background:none!important;display:flex!important}.quick-loading svg[data-v-0ec4e762]{width:100%;height:100%}.quick-loading svg path[data-v-0ec4e762]{fill:#fff}@keyframes bganimation-b934e2ce{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-b934e2ce{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-b934e2ce{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-b934e2ce]{animation:rotateEnter-b934e2ce .7s;position:relative}.rotate-leave-active[data-v-b934e2ce]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-b934e2ce]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}a[data-v-b934e2ce]{margin-left:4px;width:20px;vertical-align:middle}a svg[data-v-b934e2ce]{width:22px;height:22px}a:hover svg path[data-v-b934e2ce]{fill:#3688ff}.reusable-card[data-v-dbb174c6]{border:1px solid;border-radius:10px;padding:20px 14px;box-sizing:border-box;background-clip:padding-box;display:flex;flex-direction:column;gap:12px;border:1px solid var(--border-color);background:var(--card-bg-color)}.card-header[data-v-dbb174c6]{display:flex;justify-content:space-between;align-items:center}.card-header .left[data-v-dbb174c6]{display:flex;align-items:center;gap:8px}.card-header[data-v-dbb174c6]>svg{width:20px;height:20px}.title[data-v-dbb174c6]{font-size:16px;font-weight:600;line-height:1;color:var(--app-container_title-color)}.settings-btn[data-v-dbb174c6]{cursor:pointer}.card-body[data-v-dbb174c6]{flex:1 1 auto}.card-footer[data-v-dbb174c6]{display:flex;justify-content:center}.footer-btn[data-v-dbb174c6]{display:inline-flex;align-items:center;gap:8px;padding:6px 8px;border-radius:6px;border:1px solid var(--btn-border-color);justify-content:center;cursor:pointer;width:100%;max-width:600px;margin-top:16px}.footer-icon[data-v-dbb174c6]{display:inline-flex;align-items:center}.footer-text[data-v-dbb174c6]{font-size:14px;font-weight:400;color:var(--app-container_title-color)}.settings-icon[data-v-dbb174c6]{width:20px;height:20px}.settings-icon[data-v-dbb174c6] svg,.settings-icon[data-v-dbb174c6] g,.settings-icon[data-v-dbb174c6] path,.settings-icon[data-v-dbb174c6] circle,.settings-icon[data-v-dbb174c6] rect,.settings-icon[data-v-dbb174c6] line,.settings-icon[data-v-dbb174c6] polyline,.settings-icon[data-v-dbb174c6] polygon{fill:var(--app-container_title-color)!important;stroke:var(--app-container_title-color)!important}.settings-wrapper[data-v-dbb174c6]{position:relative}.dropdown-menu[data-v-dbb174c6]{position:absolute;top:38px;right:0;background:#fff;border-radius:6px;padding:16px 0;min-width:220px;box-shadow:0 4px 12px #0003;z-index:10}.fade-enter-active[data-v-dbb174c6],.fade-leave-active[data-v-dbb174c6]{transition:opacity .2s}.fade-enter-from[data-v-dbb174c6],.fade-leave-to[data-v-dbb174c6]{opacity:0}.dropdown-menu[data-v-dbb174c6] div{display:block;width:100%;text-align:center;padding:8px 0;border:none;background:none;cursor:pointer;font-size:14px;color:#333;transition:background .2s,color .2s}.dropdown-menu[data-v-dbb174c6] div:hover{background-color:#eee}@keyframes bganimation-dbb174c6{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-dbb174c6{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-dbb174c6{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-dbb174c6]{animation:rotateEnter-dbb174c6 .7s;position:relative}.rotate-leave-active[data-v-dbb174c6]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-dbb174c6]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 768px){.reusable-card[data-v-dbb174c6]{padding:10px;border-radius:6px}.title[data-v-dbb174c6]{font-size:14px}.footer-btn[data-v-dbb174c6]{margin-top:6px}.dropdown-menu[data-v-dbb174c6]{padding:8px 0;min-width:150px}}@keyframes bganimation{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active{animation:rotateEnter .7s;position:relative}.rotate-leave-active{opacity:0;display:none;position:relative;z-index:-999}.app-container{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}[lock-scroll=true]{overflow:hidden!important;height:100vh}@keyframes bganimation-75eeccd3{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-75eeccd3{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-75eeccd3{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-75eeccd3]{animation:rotateEnter-75eeccd3 .7s;position:relative}.rotate-leave-active[data-v-75eeccd3]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-75eeccd3]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.bg[data-v-75eeccd3]{position:fixed;inset:0;width:100%;height:100%;background:rgba(0,0,0,.5);z-index:999}#actioner[data-v-75eeccd3]{position:fixed;z-index:1000;width:100%;height:100%;inset:0;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;overflow:auto}#actioner[data-v-75eeccd3],#actioner[data-v-75eeccd3] *{-webkit-box-sizing:border-box;-webkit-tap-highlight-color:transparent;box-sizing:border-box;word-wrap:break-word;outline:none}.action-container[data-v-75eeccd3]{width:100%;height:100%;background-color:#fff;position:fixed;z-index:9999;inset:0;margin:auto;overflow:auto}.action-container .action-container_header[data-v-75eeccd3]{width:100%;height:36px;line-height:36px;display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;padding:0 .625rem;position:absolute;top:0;left:0;right:0;border-bottom:1px solid #1e1e1e;background-color:#252526}.action-container .action-container_header .title[data-v-75eeccd3]{color:#eee;font-size:16px}.action-container .action-container_header button.close[data-v-75eeccd3]{width:36px;height:36px;margin:0;padding:10px;background:none;border:none;cursor:pointer;opacity:1}.action-container .action-container_header button.close[data-v-75eeccd3] svg.icon{width:100%;height:100%}.action-container .action-container_header button.close[data-v-75eeccd3] svg.icon path{fill:#eee}.action-container .action-container_header button.close[data-v-75eeccd3]:hover{opacity:.9}.action-container .action-container_body[data-v-75eeccd3]{width:100%;height:100%;padding-top:36px}@keyframes bganimation{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active{animation:rotateEnter .7s;position:relative}.rotate-leave-active{opacity:0;display:none;position:relative;z-index:-999}.app-container{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@keyframes dialogEnter{0%{transform:scale(0)}to{transform:scale(1)}}@keyframes dialogLeave{0%{transform:scale(1)}to{transform:scale(0)}}.dialog-enter-active{animation:dialogEnter .3s linear forwards}.dialog-leave-active{animation:dialogLeave .3s linear forwards}@keyframes bganimation-7732abe2{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-7732abe2{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-7732abe2{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-7732abe2]{animation:rotateEnter-7732abe2 .7s;position:relative}.rotate-leave-active[data-v-7732abe2]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-7732abe2]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}ul.disk-item[data-v-7732abe2]{width:100%;margin-bottom:10px}ul.disk-item .auto[data-v-7732abe2]{flex:auto}ul.disk-item .disk-item_icon[data-v-7732abe2]{width:24px;height:24px;margin-right:.5rem}ul.disk-item .disk-item_icon svg[data-v-7732abe2]{width:100%;height:100%}ul.disk-item li.disk-info[data-v-7732abe2]{display:flex;flex-wrap:nowrap;align-items:center;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;width:100%;padding:5px 1rem;height:50px;cursor:pointer;color:#666;font-size:12px;border-left:3px solid #89897f}ul.disk-item li.disk-info[data-v-7732abe2]:hover{background-color:#ecf5ff}ul.disk-item li.disk-info .disk-item_icon svg path[data-v-7732abe2]{fill:#09aaff}ul.disk-item li.disk-info .disk-item_f[data-v-7732abe2]{display:flex;flex-wrap:wrap}ul.disk-item li.disk-info .disk-item_f .disk-item_venderModel[data-v-7732abe2],ul.disk-item li.disk-info .disk-item_f .disk-item_used[data-v-7732abe2]{width:100%}ul.disk-item li.disk-info.on[data-v-7732abe2]{border-left:3px solid #ff9c08}ul.disk-item li.disk-info.on.nopoint[data-v-7732abe2]{background-color:#ecf5ff}ul.disk-item .disk-children[data-v-7732abe2]{width:100%;color:#666}ul.disk-item .disk-children li.disk-children_item[data-v-7732abe2]{width:100%;height:40px;line-height:40px;padding-left:2rem;font-size:12px;cursor:pointer;display:flex;flex-wrap:nowrap;align-items:center;border-left:3px solid #89897f;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}ul.disk-item .disk-children li.disk-children_item[data-v-7732abe2]:hover{background-color:#ecf5ff}ul.disk-item .disk-children li.disk-children_item span[data-v-7732abe2]{overflow:hidden;text-overflow:ellipsis;white-space:nowrap;display:inline-block}ul.disk-item .disk-children li.disk-children_item.on.on[data-v-7732abe2]{border-left:3px solid #ff9c08;background-color:#ecf5ff}@keyframes bganimation-6935a479{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-6935a479{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-6935a479{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-6935a479]{animation:rotateEnter-6935a479 .7s;position:relative}.rotate-leave-active[data-v-6935a479]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-6935a479]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@keyframes turn-6935a479{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(360deg)}}.toast[data-v-6935a479]{position:fixed;top:50%;left:50%;display:flex;flex-direction:column;align-items:center;justify-content:space-around;box-sizing:content-box;width:100px;max-width:70%;padding:16px;color:#fff;font-size:14px;text-align:center;background-color:#000000b3;border-radius:8px;transform:translate3d(-50%,-50%,0);z-index:9999;transition:.3s;cursor:pointer}.toast div.icon[data-v-6935a479]{width:50px;height:50px;margin:15px 0;background:none!important}.toast div.icon svg[data-v-6935a479]{width:100%;height:100%}.toast div.icon svg path[data-v-6935a479]{fill:#fff}.toast .loading[data-v-6935a479]{animation:turn-6935a479 1s steps(12,end) infinite}.toast .message[data-v-6935a479]{display:block;width:100%;flex:0 0 100%;word-wrap:break-word}.action .action-footer button[data-v-d72e7026]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}@keyframes bganimation-d72e7026{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-d72e7026{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-d72e7026{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-d72e7026]{animation:rotateEnter-d72e7026 .7s;position:relative}.rotate-leave-active[data-v-d72e7026]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-d72e7026]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action.format[data-v-d72e7026]{width:700px;height:560px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;overflow:auto;padding:0 25px;border:1px solid #dfdfdf;border-radius:4px;background:#fff;box-shadow:0 1px 4px #0000004d}.action.format .action-header[data-v-d72e7026]{width:100%;height:70px;line-height:70px}.action.format .action-header .action-header_title[data-v-d72e7026]{margin:0;color:#333;font:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-moz-user-select:none;-webkit-user-select:none;user-select:none;font-size:20px}.action.format .action-body[data-v-d72e7026]{width:100%;height:calc(100% - 140px);overflow:auto}.action.format .action-footer[data-v-d72e7026]{width:100%;height:70px;line-height:70px;color:#333;display:flex;flex-wrap:wrap;align-items:center}.action.format .action-footer .auto[data-v-d72e7026]{flex:auto}.action.format .disk-list[data-v-d72e7026]{width:100%;height:100%;border:1px solid #dfe1e5;overflow:auto}.action.format .label-item[data-v-d72e7026]{width:100%;margin:1rem 0}.action.format .label-item .label-item_key[data-v-d72e7026]{width:100%;font-size:16px;color:#666}.action.format .label-item .label-item_key span[data-v-d72e7026]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.action.format .label-item .label-item_key span[data-v-d72e7026]:before{content:\"*\";color:#f56c6c;margin-right:4px}.action.format .label-item .label-item_value[data-v-d72e7026]{width:100%;margin-top:5px}.action.format .label-item .label-item_value select[data-v-d72e7026],.action.format .label-item .label-item_value input[data-v-d72e7026]{width:100%;height:36px}.action.format .label-item .label-item_path[data-v-d72e7026]{padding:0 14px;background-color:#e5e5e5;width:100%;height:28px;line-height:28px;margin-top:10px}.action.format .auto[data-v-d72e7026]{flex:auto}.action.format p.msg[data-v-d72e7026]{margin:.5rem 0;color:red}.action.format .disk-info[data-v-d72e7026]{width:100%;text-align:center}.action.format .disk-info .disk-info_icon[data-v-d72e7026]{width:100px;height:100px;margin:0 auto}.action.format .disk-info .disk-info_icon svg[data-v-d72e7026]{width:100%;height:100%}.action.format .disk-info .disk-info_mount-name[data-v-d72e7026]{margin:1rem 0;font-size:1.5em;color:#333}@keyframes bganimation-d72e7026{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-d72e7026{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-d72e7026{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-d72e7026]{animation:rotateEnter-d72e7026 .7s;position:relative}.rotate-leave-active[data-v-d72e7026]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-d72e7026]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action.result[data-v-d72e7026]{width:700px;height:560px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;overflow:auto;padding:0 25px;border:1px solid #dfdfdf;border-radius:4px;background:#fff;box-shadow:0 1px 4px #0000004d}.action.result .action-body[data-v-d72e7026]{width:100%;height:100%;display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center}.action.result .action-body .action-body_icon[data-v-d72e7026]{width:100px;height:100px}.action.result .action-body .action-body_icon svg.icon[data-v-d72e7026]{width:100%;height:100%}.action.result .action-body .action-body_msg[data-v-d72e7026]{font-size:2em;color:#666;text-align:center;width:100%;margin:1rem 0}.action.result .action-body .action-body_info[data-v-d72e7026]{margin:1rem 0;width:100%;text-align:center;color:#666;font-size:1.2em}.action.result .action-body .action-body_info a[data-v-d72e7026]{color:#0000fb}.action.result .btns[data-v-d72e7026]{width:100%;text-align:center;margin:1rem 0}@keyframes bganimation-d72e7026{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-d72e7026{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-d72e7026{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-d72e7026]{animation:rotateEnter-d72e7026 .7s;position:relative}.rotate-leave-active[data-v-d72e7026]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-d72e7026]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 1000px){.action.format[data-v-d72e7026]{width:168%}}@media screen and (max-width: 900px){.action.format[data-v-d72e7026]{width:146%}}@media screen and (max-width: 800px){.action.format[data-v-d72e7026]{width:136%}}@media screen and (max-width: 700px){.action.format[data-v-d72e7026]{width:116%}}@media screen and (max-width: 500px){.action.format[data-v-d72e7026]{width:100%}}.action .action-footer button[data-v-0d1b6ac8]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}@keyframes bganimation-0d1b6ac8{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-0d1b6ac8{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-0d1b6ac8{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-0d1b6ac8]{animation:rotateEnter-0d1b6ac8 .7s;position:relative}.rotate-leave-active[data-v-0d1b6ac8]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-0d1b6ac8]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action.list[data-v-0d1b6ac8]{width:700px;height:560px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;overflow:auto;padding:0 25px;border:1px solid #dfdfdf;border-radius:4px;background:#fff;box-shadow:0 1px 4px #0000004d}.action.list .action-header[data-v-0d1b6ac8]{width:100%;height:70px;line-height:70px}.action.list .action-header .action-header_title[data-v-0d1b6ac8]{margin:0;color:#333;font:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-moz-user-select:none;-webkit-user-select:none;user-select:none;font-size:20px}.action.list .action-body[data-v-0d1b6ac8]{width:100%;height:calc(100% - 176px)}.action.list .action-msg[data-v-0d1b6ac8]{width:100%;height:36px;line-height:36px;text-align:center}.action.list .action-footer[data-v-0d1b6ac8]{width:100%;height:70px;line-height:70px;color:#333;display:flex;flex-wrap:wrap;align-items:center}.action.list .action-footer .auto[data-v-0d1b6ac8]{flex:auto}.action.list .disk-list[data-v-0d1b6ac8]{width:100%;height:100%;border:1px solid #dfe1e5;overflow:auto}@keyframes bganimation-0d1b6ac8{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-0d1b6ac8{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-0d1b6ac8{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-0d1b6ac8]{animation:rotateEnter-0d1b6ac8 .7s;position:relative}.rotate-leave-active[data-v-0d1b6ac8]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-0d1b6ac8]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action.format[data-v-0d1b6ac8]{width:700px;height:560px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;overflow:auto;padding:0 25px;border:1px solid #dfdfdf;border-radius:4px;background:#fff;box-shadow:0 1px 4px #0000004d}.action.format .action-header[data-v-0d1b6ac8]{width:100%;height:70px;line-height:70px}.action.format .action-header .action-header_title[data-v-0d1b6ac8]{margin:0;color:#333;font:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-moz-user-select:none;-webkit-user-select:none;user-select:none;font-size:20px}.action.format .action-body[data-v-0d1b6ac8]{width:100%;height:calc(100% - 140px);overflow:auto}.action.format .action-footer[data-v-0d1b6ac8]{width:100%;height:70px;line-height:70px;color:#333;display:flex;flex-wrap:wrap;align-items:center}.action.format .action-footer .auto[data-v-0d1b6ac8]{flex:auto}.action.format .disk-list[data-v-0d1b6ac8]{width:100%;height:100%;border:1px solid #dfe1e5;overflow:auto}.action.format .label-item[data-v-0d1b6ac8]{width:100%;margin:1rem 0}.action.format .label-item .label-item_key[data-v-0d1b6ac8]{width:100%;font-size:16px;color:#666}.action.format .label-item .label-item_key span[data-v-0d1b6ac8]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.action.format .label-item .label-item_key span[data-v-0d1b6ac8]:before{content:\"*\";color:#f56c6c;margin-right:4px}.action.format .label-item .label-item_value[data-v-0d1b6ac8]{width:100%;margin-top:5px}.action.format .label-item .label-item_value select[data-v-0d1b6ac8],.action.format .label-item .label-item_value input[data-v-0d1b6ac8]{width:100%;height:36px}.action.format .auto[data-v-0d1b6ac8]{flex:auto}.action.format p.msg[data-v-0d1b6ac8]{margin:.5rem 0;color:red}.action.format .disk-info[data-v-0d1b6ac8]{width:100%;text-align:center}.action.format .disk-info .disk-info_icon[data-v-0d1b6ac8]{width:100px;height:100px;margin:0 auto}.action.format .disk-info .disk-info_icon svg[data-v-0d1b6ac8]{width:100%;height:100%}.action.format .disk-info .disk-info_mount-name[data-v-0d1b6ac8]{margin:1rem 0;font-size:1.5em;color:#333}@keyframes bganimation-0d1b6ac8{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-0d1b6ac8{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-0d1b6ac8{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-0d1b6ac8]{animation:rotateEnter-0d1b6ac8 .7s;position:relative}.rotate-leave-active[data-v-0d1b6ac8]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-0d1b6ac8]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action.result[data-v-0d1b6ac8]{width:700px;height:560px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;overflow:auto;padding:0 25px;border:1px solid #dfdfdf;border-radius:4px;background:#fff;box-shadow:0 1px 4px #0000004d}.action.result .action-header[data-v-0d1b6ac8]{width:100%;height:70px;line-height:70px}.action.result .action-header .action-header_title[data-v-0d1b6ac8]{margin:0;color:#333;font:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-moz-user-select:none;-webkit-user-select:none;user-select:none;font-size:20px}.action.result .action-body[data-v-0d1b6ac8]{width:100%;height:calc(100% - 140px);overflow:auto}.action.result .action-body .format-result[data-v-0d1b6ac8]{width:100%;text-align:center;font-size:2em;color:#333;margin:1rem 0}.action.result .action-body .format-info[data-v-0d1b6ac8]{width:100%;text-align:center;font-size:1.3em}.action.result .action-body .format-info a[data-v-0d1b6ac8]{color:#f70324}.action.result .action-footer[data-v-0d1b6ac8]{width:100%;height:70px;line-height:70px;color:#333}.action.result .auto[data-v-0d1b6ac8]{flex:auto}@keyframes bganimation-0d1b6ac8{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-0d1b6ac8{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-0d1b6ac8{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-0d1b6ac8]{animation:rotateEnter-0d1b6ac8 .7s;position:relative}.rotate-leave-active[data-v-0d1b6ac8]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-0d1b6ac8]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 1000px){.action.list[data-v-0d1b6ac8]{width:136%}}@media screen and (max-width: 900px){.action.list[data-v-0d1b6ac8]{width:126%}}@media screen and (max-width: 800px){.action.list[data-v-0d1b6ac8]{width:112%}}@media screen and (max-width: 700px){.action.list[data-v-0d1b6ac8]{width:100%}}@media screen and (max-width: 500px){.action.list[data-v-0d1b6ac8]{width:80%}}@keyframes bganimation-5f6e53be{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-5f6e53be{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-5f6e53be{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-5f6e53be]{animation:rotateEnter-5f6e53be .7s;position:relative}.rotate-leave-active[data-v-5f6e53be]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-5f6e53be]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action[data-v-5f6e53be]{width:700px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;overflow:auto;padding:1rem 87px;border-radius:6px}.action .action-body[data-v-5f6e53be]{width:100%;text-align:center;padding:3rem 0}.action .action-body h2.title[data-v-5f6e53be]{width:100%;display:block;color:#1e1e1e;font-size:3em;padding:0;margin:0;text-align:center}.action .action-body .info[data-v-5f6e53be]{color:#666;font-size:1.3em;margin:1rem 0}.action .action-body .btns[data-v-5f6e53be]{width:100%;margin-top:3rem}.action .action-body .btns button[data-v-5f6e53be]{display:block;width:100%!important;margin:.5rem 0}@keyframes bganimation-5f6e53be{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-5f6e53be{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-5f6e53be{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-5f6e53be]{animation:rotateEnter-5f6e53be .7s;position:relative}.rotate-leave-active[data-v-5f6e53be]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-5f6e53be]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 1000px){.action.format .action-body h2.title[data-v-5f6e53be]{font-size:20px}}@media screen and (max-width: 900px){.action .action-body h2.title[data-v-5f6e53be]{font-size:20px}}@media screen and (max-width: 800px){.action .action-body h2.title[data-v-5f6e53be]{font-size:20px}}@media screen and (max-width: 700px){.action .action-body h2.title[data-v-5f6e53be]{font-size:20px}}@media screen and (max-width: 500px){.action .action-body h2.title[data-v-5f6e53be]{font-size:20px}}@keyframes bganimation-2eafa10c{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-2eafa10c{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-2eafa10c{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-2eafa10c]{animation:rotateEnter-2eafa10c .7s;position:relative}.rotate-leave-active[data-v-2eafa10c]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-2eafa10c]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action[data-v-2eafa10c]{width:700px;height:560px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;overflow:auto;padding:0 25px;border:1px solid #dfdfdf;border-radius:4px;background:#fff;box-shadow:0 1px 4px #0000004d}.action .action-header[data-v-2eafa10c]{width:100%;height:70px;line-height:70px}.action .action-header .action-header_title[data-v-2eafa10c]{margin:0;color:#333;font:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-moz-user-select:none;-webkit-user-select:none;user-select:none;font-size:20px}.action .action-body[data-v-2eafa10c]{width:100%;height:calc(100% - 140px);overflow:auto}.action .action-body .label-item[data-v-2eafa10c]{width:100%;margin:1rem 0}.action .action-body .label-item .label-item_key[data-v-2eafa10c]{width:100%;font-size:12px;color:#666}.action .action-body .label-item .label-item_key span[data-v-2eafa10c]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.action .action-body .label-item .label-item_key span[data-v-2eafa10c]:before{content:\"*\";color:#f56c6c;margin-right:4px}.action .action-body .label-item .label-item_value[data-v-2eafa10c]{width:100%;margin-top:5px}.action .action-body .label-item .label-item_value select[data-v-2eafa10c],.action .action-body .label-item .label-item_value input[data-v-2eafa10c]{width:100%;height:36px}.action .action-footer[data-v-2eafa10c]{width:100%;height:70px;line-height:70px;color:#333;display:flex;flex-wrap:wrap;align-items:center}.action .action-footer .auto[data-v-2eafa10c]{flex:auto}.action .action-footer button[data-v-2eafa10c]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}@keyframes bganimation-58844394{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-58844394{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-58844394{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-58844394]{animation:rotateEnter-58844394 .7s;position:relative}.rotate-leave-active[data-v-58844394]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-58844394]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action[data-v-58844394]{width:700px;height:560px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;padding:0 25px;border:1px solid #dfdfdf;border-radius:4px;background:#fff;box-shadow:0 1px 4px #0000004d}.action .action-header[data-v-58844394]{width:100%;height:70px;line-height:70px}.action .action-header .action-header_title[data-v-58844394]{margin:0;color:#333;font:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-moz-user-select:none;-webkit-user-select:none;user-select:none;font-size:20px}.action .action-body[data-v-58844394]{width:100%;height:calc(100% - 140px)}.action .action-body .label-item[data-v-58844394]{width:100%;margin:1rem 0}.action .action-body .label-item .label-item_key[data-v-58844394]{width:100%;font-size:12px;color:#666}.action .action-body .label-item .label-item_key span[data-v-58844394]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.action .action-body .label-item .label-item_key span[data-v-58844394]:before{content:\"*\";color:#f56c6c;margin-right:4px}.action .action-body .label-item .label-item_value[data-v-58844394]{width:100%;margin-top:5px}.action .action-body .label-item .label-item_value select[data-v-58844394],.action .action-body .label-item .label-item_value input[data-v-58844394]{width:100%;height:36px}.action .action-body .samba-item[data-v-58844394]{margin-top:-18px;font-size:12px}.action .action-body .samba-item .samba-item_allow[data-v-58844394]{display:flex;align-items:flex-end}.action .action-body .samba-item .samba-item_allow .samba-allow[data-v-58844394]{padding-left:10px;cursor:pointer}.action .action-body .samba-item .samba-item_tips[data-v-58844394]{margin-top:10px}.action .action-body .samba-item .samba-item_tips .tooltip-trigger[data-v-58844394]{display:flex}.action .action-body .samba-item .samba-item_tips .samba_dir_tip[data-v-58844394]{margin-left:10px}.action .action-footer[data-v-58844394]{width:100%;height:70px;line-height:70px;color:#333;display:flex;flex-wrap:wrap;align-items:center;padding-bottom:30px}.action .action-footer .auto[data-v-58844394]{flex:auto}.action .action-footer button[data-v-58844394]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}@keyframes bganimation-1d64dea6{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-1d64dea6{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-1d64dea6{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-1d64dea6]{animation:rotateEnter-1d64dea6 .7s;position:relative}.rotate-leave-active[data-v-1d64dea6]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-1d64dea6]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action[data-v-1d64dea6]{width:860px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;overflow:auto;padding:1rem 87px;border-radius:6px}.action h2.title[data-v-1d64dea6]{width:100%;display:block;color:#1e1e1e;font-size:3em;padding:0;margin:0;text-align:center}.action h3.desc[data-v-1d64dea6]{width:100%;display:block;color:#666;font-size:1.2em;padding:0;margin:1rem 0;text-align:center}.action form[data-v-1d64dea6]{width:100%;display:block;padding:2rem 0}.action form label[data-v-1d64dea6]{width:100%;display:block;margin:1rem 0}.action form label input[data-v-1d64dea6],.action form label select[data-v-1d64dea6]{width:100%;display:block;height:42px}.action .btns[data-v-1d64dea6]{width:100%;margin-top:3rem}.action .btns button[data-v-1d64dea6]{display:block;width:100%!important;margin:.5rem 0}.action li.disk-item[data-v-1d64dea6]{display:flex;flex-wrap:wrap;align-items:center;justify-content:space-between;width:100%;padding:5px 1rem;border-bottom:1px solid #eee;cursor:pointer}.action li.disk-item[data-v-1d64dea6]:hover{background-color:#eee}.action li.disk-item .disk-item_f[data-v-1d64dea6]{display:flex;flex-wrap:wrap}.action li.disk-item .disk-item_f .disk-item_venderModel[data-v-1d64dea6],.action li.disk-item .disk-item_f .disk-item_used[data-v-1d64dea6]{width:100%}.action .tips[data-v-1d64dea6]{float:right;font-size:.8em}@keyframes bganimation-1d64dea6{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-1d64dea6{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-1d64dea6{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-1d64dea6]{animation:rotateEnter-1d64dea6 .7s;position:relative}.rotate-leave-active[data-v-1d64dea6]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-1d64dea6]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 500px){.action h2.title[data-v-1d64dea6]{font-size:2em}}@keyframes bganimation-27ba49f9{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-27ba49f9{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-27ba49f9{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-27ba49f9]{animation:rotateEnter-27ba49f9 .7s;position:relative}.rotate-leave-active[data-v-27ba49f9]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-27ba49f9]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}li.aria2-item[data-v-27ba49f9]{width:100%;display:flex;flex-wrap:wrap;margin:1rem 0}li.aria2-item .aria2-item_name[data-v-27ba49f9]{flex:0 0 100%;max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:10px;color:var(--app-container_title-color)}li.aria2-item .aria2-item_value[data-v-27ba49f9]{flex:0 0 100%;max-width:50%;padding-left:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}li.aria2-item .aria2-item_value .configure[data-v-27ba49f9]{color:#297ff3;padding:3px}li.aria2-item .aria2-item_value .configure.enabel[data-v-27ba49f9]{color:#888}.use-url_app[data-v-27ba49f9]{padding-bottom:14px}.use-url_app a[data-v-27ba49f9]{text-decoration:none;color:#297ff3}@keyframes bganimation-da46870e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-da46870e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-da46870e{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-da46870e]{animation:rotateEnter-da46870e .7s;position:relative}.rotate-leave-active[data-v-da46870e]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-da46870e]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}li.qbittorrent-item[data-v-da46870e]{width:100%;display:flex;flex-wrap:wrap;margin:1rem 0}li.qbittorrent-item .qbittorrent-item_name[data-v-da46870e]{flex:0 0 100%;max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:10px;color:var(--app-container_title-color)}li.qbittorrent-item .qbittorrent-item_value[data-v-da46870e]{flex:0 0 100%;max-width:50%;padding-left:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}li.qbittorrent-item .qbittorrent-item_value .configure[data-v-da46870e]{color:#297ff3;padding:3px}li.qbittorrent-item .qbittorrent-item_value .configure.enabel[data-v-da46870e]{color:#888}a[data-v-da46870e]{text-decoration:none;color:#297ff3}@keyframes bganimation-562f4f7e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-562f4f7e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-562f4f7e{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-562f4f7e]{animation:rotateEnter-562f4f7e .7s;position:relative}.rotate-leave-active[data-v-562f4f7e]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-562f4f7e]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}li.transmission-item[data-v-562f4f7e]{width:100%;display:flex;flex-wrap:wrap;margin:1rem 0}li.transmission-item .transmission-item_name[data-v-562f4f7e]{flex:0 0 100%;max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:10px;color:var(--app-container_title-color)}li.transmission-item .transmission-item_value[data-v-562f4f7e]{flex:0 0 100%;max-width:50%;padding-left:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}li.transmission-item .transmission-item_value .configure[data-v-562f4f7e]{color:#297ff3;padding:3px}li.transmission-item .transmission-item_value .configure.enabel[data-v-562f4f7e]{color:#888}a[data-v-562f4f7e]{text-decoration:none;color:#297ff3}@keyframes bganimation-7b328460{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-7b328460{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-7b328460{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-7b328460]{animation:rotateEnter-7b328460 .7s;position:relative}.rotate-leave-active[data-v-7b328460]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-7b328460]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action[data-v-7b328460]{width:860px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;padding:1rem 87px;border-radius:6px}.action p[data-v-7b328460]{color:#999;font-size:14px}.action input[data-v-7b328460]{font-size:14px;font-family:PingFangSC-Regular,PingFang SC}.action h2.title[data-v-7b328460]{width:100%;color:#1e1e1e;font-size:22px;font-family:PingFangSC-Medium,PingFang SC;padding:0;margin:0;text-align:center}.action span[data-v-7b328460]{font-size:14px;font-family:PingFangSC-Medium,PingFang SC;color:#000000d4;font-weight:700}.action form label[data-v-7b328460]{width:100%}.action form label input[data-v-7b328460],.action form label select[data-v-7b328460]{height:100%;font-size:14px}.action .myinput_wrap[data-v-7b328460],.action .RPC_input[data-v-7b328460]{width:85%}.action .myinput_wrap textarea[data-v-7b328460]{width:100%;padding:2px 3px;border:1px solid #dee2e6;border-radius:.25rem}.action .input_row[data-v-7b328460]{margin:16px 0;display:flex;justify-content:left;align-items:center}.action .input_row .radios[data-v-7b328460]{margin-right:10px}.action .input_row .radios input[data-v-7b328460],.action .input_row .radios label[data-v-7b328460]{cursor:pointer}.action .Tracker label[data-v-7b328460]{margin-right:10px;cursor:pointer}.action .Tracker_input[data-v-7b328460]{padding:6px 2px}.action .btns[data-v-7b328460]{width:100%;margin:42px auto 0}.action .btns button[data-v-7b328460]{display:block;width:100%!important;margin:.5rem 0}.action .tooltip-trigger[data-v-7b328460]{position:relative;display:inline-block;cursor:help;margin-right:6px}.action .tooltip-trigger .tooltip-text[data-v-7b328460]{visibility:hidden;position:absolute;padding:.5rem 1rem;background-color:#555;color:#fff;text-align:center;border-radius:6px;z-index:1;opacity:0;transition:opacity .6s}.action .tooltip-trigger .tooltip-text span[data-v-7b328460]{color:#fff}.action .tooltip-trigger .tooltip-text .dowload_dir_tip[data-v-7b328460]{min-width:14rem;display:inline-block}.action .tooltip-trigger:hover .tooltip-text[data-v-7b328460]{visibility:visible;opacity:1}.action .tooltip-top[data-v-7b328460]{bottom:100%;left:50%;margin-bottom:5px;transform:translate(-50%)}.action .tooltip-bottom[data-v-7b328460]{top:100%;left:50%;margin-top:5px;transform:translate(-50%)}.action .tooltip-bottom .dowload_rpc_tip[data-v-7b328460]{min-width:10rem;display:inline-block}.action .tooltip-right[data-v-7b328460]{top:50%;left:100%;margin-left:5px;transform:translateY(-50%)}.action .tooltip-left[data-v-7b328460]{top:50%;right:100%;margin-right:5px;transform:translateY(-50%)}.action .tooltip-top[data-v-7b328460]:after{content:\"\";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:#555 transparent transparent transparent}.action .tooltip-bottom[data-v-7b328460]:after{content:\"\";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:transparent transparent #555 transparent}.action .successed[data-v-7b328460]{text-align:center;font-size:14px}.action .finished[data-v-7b328460]{display:flex;justify-content:center;margin:80px 80px 28px}.left[data-v-7b328460]{display:flex;align-items:center;justify-content:flex-start;width:110px;flex:none}.select-editable[data-v-7b328460]{position:relative;border:1px solid #dee2e6;border-radius:.25rem;margin:.25rem .1rem}.select-editable select[data-v-7b328460]{top:0;left:0;font-size:14px;border:none;width:100%;margin:0}.select-editable input[data-v-7b328460]{position:absolute;top:-4px;left:0;width:95%;padding:1px;font-size:14px;border:none}.select-editable select[data-v-7b328460]:focus,.select-editable input[data-v-7b328460]:focus{outline:none}[data-v-7b328460]::placeholder{color:#999}@keyframes bganimation-7b328460{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-7b328460{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-7b328460{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-7b328460]{animation:rotateEnter-7b328460 .7s;position:relative}.rotate-leave-active[data-v-7b328460]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-7b328460]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 500px){.action[data-v-7b328460]{width:100%}.action .input_row[data-v-7b328460]{display:block}.action .input_row .myinput_wrap[data-v-7b328460],.action .input_row .RPC_input[data-v-7b328460]{width:100%}}@keyframes bganimation-5ebde5ac{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-5ebde5ac{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-5ebde5ac{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-5ebde5ac]{animation:rotateEnter-5ebde5ac .7s;position:relative}.rotate-leave-active[data-v-5ebde5ac]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-5ebde5ac]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.icon[data-v-5ebde5ac]{width:1.3rem;height:1.3rem}.icon1[data-v-5ebde5ac]{width:1rem;height:1rem}.icon2[data-v-5ebde5ac]{width:1.5rem;height:1.5rem;margin-bottom:12px}[data-v-5ebde5ac] .downloadIcon path{fill:var(--app-container_title-color)!important}a[data-v-5ebde5ac]{color:#1e1e1e;text-decoration:none;cursor:pointer;font-size:14px;display:block}.content[data-v-5ebde5ac]{color:#333;margin-top:20px;margin-bottom:20px;font-weight:400}.content .tab[data-v-5ebde5ac]{display:flex;gap:8px}.content .tab .item[data-v-5ebde5ac]{flex:1;padding:16px;display:flex;flex-direction:column;align-items:center;border-radius:10px;cursor:pointer;border:2px solid transparent;box-sizing:border-box}.content .tab .item .title[data-v-5ebde5ac]{margin-bottom:8px}.content .tab .item>span[data-v-5ebde5ac]{font-size:12px}.content .tab .active[data-v-5ebde5ac]{border:2px solid #6d6d6d}.content .tab .cloud[data-v-5ebde5ac]{background-color:#fff7ed;color:#ca3500}.content .tab .memory[data-v-5ebde5ac]{background-color:#f9fafb;color:#364153}.content .tab .network[data-v-5ebde5ac]{background-color:#f0fdfa;color:#277881}.btn_settings[data-v-5ebde5ac]{position:relative;padding:6px 34px 6px 18px;border-radius:4px;border:1px solid var(--btn-border-color);line-height:1;display:flex;align-items:center}.rotation[data-v-5ebde5ac]{position:absolute;right:2px;top:50%;height:100%;transform:translateY(-50%);border-left:1px solid var(--btn-border-color);display:flex;align-items:center}.rotation .moreIcon[data-v-5ebde5ac]{transform:rotate(90deg)}@keyframes bganimation-5ebde5ac{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-5ebde5ac{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-5ebde5ac{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-5ebde5ac]{animation:rotateEnter-5ebde5ac .7s;position:relative}.rotate-leave-active[data-v-5ebde5ac]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-5ebde5ac]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 768px){.content[data-v-5ebde5ac]{margin:10px 0}}@keyframes bganimation-46dd945e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-46dd945e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-46dd945e{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-46dd945e]{animation:rotateEnter-46dd945e .7s;position:relative}.rotate-leave-active[data-v-46dd945e]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-46dd945e]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}h3[data-v-46dd945e]{text-align:center;margin-bottom:20px}.label-item[data-v-46dd945e]{display:flex;align-items:center;flex-wrap:wrap;margin:1rem 0;padding:0 30px}.label-item label[data-v-46dd945e]{display:flex;flex-wrap:wrap;align-items:center;width:100%;height:26px;line-height:26px;cursor:pointer}.label-item label input[type=radio][data-v-46dd945e]{top:0;right:0;vertical-align:middle}.label-item label span[data-v-46dd945e]{font-size:14px;font-family:PingFangSC-Regular,PingFang SC;font-weight:400;color:#000000d4;display:inline-block;margin-left:10px}.label-item p.label_info[data-v-46dd945e]{color:#999;font-size:12px;padding-left:24px;line-height:20px}.label-item .label-item_key[data-v-46dd945e]{display:flex;flex-wrap:wrap;align-items:center}.label-item .label-item_key .ddnsto_serve[data-v-46dd945e]{flex:0 0 100%;display:flex;justify-content:space-between;margin-bottom:14px}.label-item .label-item_key .ddnsto_serve_item[data-v-46dd945e]{flex:0 0 100%;display:flex;justify-content:space-between}@keyframes bganimation-b760733a{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-b760733a{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-b760733a{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-b760733a]{animation:rotateEnter-b760733a .7s;position:relative}.rotate-leave-active[data-v-b760733a]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-b760733a]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.actioner-container_body[data-v-b760733a]{display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center}.actioner-container_body svg.icon[data-v-b760733a]{width:100px;height:100px}.actioner-container_body .body-title[data-v-b760733a]{width:100%;display:block;color:#1e1e1e;font-size:2em;padding:0;margin:1rem 0;text-align:center}.actioner-container_body .body-tips[data-v-b760733a]{text-align:center}.actioner-container_body .body-info[data-v-b760733a]{color:#666;font-size:1.3em;margin:1rem 0;width:100%;text-align:center}.actioner-container_body .body-tips[data-v-b760733a]{margin:1rem 0;display:block;width:100%}.actioner-container_body .body-btns[data-v-b760733a]{width:100%;margin-top:3rem}.actioner-container_body .body-btns button[data-v-b760733a]{display:block;width:100%!important;margin:.5rem 0}@keyframes bganimation-064efd50{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-064efd50{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-064efd50{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-064efd50]{animation:rotateEnter-064efd50 .7s;position:relative}.rotate-leave-active[data-v-064efd50]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-064efd50]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}iframe[data-v-064efd50]{width:100%;height:100%;border:none}@keyframes bganimation-49c43a08{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-49c43a08{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-49c43a08{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-49c43a08]{animation:rotateEnter-49c43a08 .7s;position:relative}.rotate-leave-active[data-v-49c43a08]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-49c43a08]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}iframe[data-v-49c43a08]{width:100%;height:100%;border:none}@keyframes bganimation-27f65f12{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-27f65f12{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-27f65f12{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-27f65f12]{animation:rotateEnter-27f65f12 .7s;position:relative}.rotate-leave-active[data-v-27f65f12]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-27f65f12]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.actioner-container_body[data-v-27f65f12]{display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center}.actioner-container_body svg.icon[data-v-27f65f12]{width:100px;height:100px}.actioner-container_body .body-title[data-v-27f65f12]{width:100%;display:block;color:#1e1e1e;font-size:2em;padding:0;margin:1rem 0;text-align:center}.actioner-container_body .body-info[data-v-27f65f12]{color:#666;font-size:1.3em;margin:1rem 0;width:100%}.actioner-container_body .body-tips[data-v-27f65f12]{margin:1rem 0;display:block;width:100%}.actioner-container_body .body-btns[data-v-27f65f12]{width:100%;margin-top:3rem}.actioner-container_body .body-btns button[data-v-27f65f12]{display:block;width:100%!important;margin:.5rem 0}@keyframes bganimation-210c03e8{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-210c03e8{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-210c03e8{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-210c03e8]{animation:rotateEnter-210c03e8 .7s;position:relative}.rotate-leave-active[data-v-210c03e8]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-210c03e8]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.actioner-container_body[data-v-210c03e8]{display:flex;align-items:center;justify-content:center}@keyframes bganimation-1b21487b{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-1b21487b{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-1b21487b{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-1b21487b]{animation:rotateEnter-1b21487b .7s;position:relative}.rotate-leave-active[data-v-1b21487b]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-1b21487b]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.actioner-container_body[data-v-1b21487b]{display:flex;align-items:center;justify-content:center}@keyframes bganimation-7a6bd385{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-7a6bd385{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-7a6bd385{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-7a6bd385]{animation:rotateEnter-7a6bd385 .7s;position:relative}.rotate-leave-active[data-v-7a6bd385]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-7a6bd385]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action-main[data-v-7a6bd385]{width:680px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.action-main[data-v-7a6bd385] .actioner-container{width:100%}.action-main[data-v-7a6bd385] .actioner-container .actioner-container_header{width:100%;height:50px;line-height:50px;display:flex;flex-wrap:wrap;align-items:center;font-size:20px;border-bottom:1px solid #eee;justify-content:center;padding:0 10px}.action-main[data-v-7a6bd385] .actioner-container .actioner-container_footer{width:100%;height:50px;border-top:1px solid rgba(0,0,0,.06);display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:0 30px}.action-main[data-v-7a6bd385] .actioner-container .actioner-container_footer button{display:inline-block;width:100px!important;margin:0;margin-left:1rem}.action-main[data-v-7a6bd385] .actioner-container .actioner-container_footer .close{min-width:65px;font-weight:400;color:#0060ff;line-height:30px;text-align:center;cursor:pointer;height:32px;border-radius:2px;border:1px solid rgba(0,0,0,.15);font-size:14px;font-family:PingFangSC-Regular,PingFang SC;color:#000000d4;line-height:32px}.action-main[data-v-7a6bd385] .actioner-container .actioner-container_footer .next{min-width:65px;line-height:32px;text-align:center;cursor:pointer;font-size:14px;font-family:PingFangSC-Regular,PingFang SC;font-weight:400;color:#fff;margin-left:20px;width:74px;height:32px;background:#553AFE;border-radius:2px}.action-main[data-v-7a6bd385] .actioner-container .actioner-container_footer .next:hover,.action-main[data-v-7a6bd385] .actioner-container .actioner-container_footer .close:hover{opacity:.9}.action-main[data-v-7a6bd385] .actioner-container .actioner-container_body{padding:1rem;text-align:center;width:100%;height:400px}.action-main[data-v-7a6bd385] .actioner-container .actioner-container_body a{text-decoration:none}.action-main[data-v-7a6bd385] .actioner-container .actioner-container_body.ddnsto-bind{height:280px}@keyframes bganimation-7a6bd385{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-7a6bd385{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-7a6bd385{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-7a6bd385]{animation:rotateEnter-7a6bd385 .7s;position:relative}.rotate-leave-active[data-v-7a6bd385]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-7a6bd385]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 800px){.action-main[data-v-7a6bd385]{width:90%}}@keyframes bganimation-05611967{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-05611967{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-05611967{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-05611967]{animation:rotateEnter-05611967 .7s;position:relative}.rotate-leave-active[data-v-05611967]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-05611967]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action[data-v-05611967]{width:500px;max-height:90%;background-color:#fff;position:relative;z-index:99999;margin:auto;border-radius:4px;padding:10px 0}.action .action-header[data-v-05611967]{width:100%;font-family:PingFangSC-Medium,PingFang SC;font-weight:500;padding-left:1rem;padding-right:1rem;text-align:left;font-size:18px;line-height:1;color:#303133}.action .action-body[data-v-05611967]{display:block;margin:2rem 0;line-height:24px;padding:0 15px;color:#606266;font-size:14px}.action .action-footer[data-v-05611967]{width:100%;height:50px;border-top:1px solid rgba(0,0,0,.06);display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:0 30px}.action .next[data-v-05611967]{min-width:65px;line-height:32px;text-align:center;cursor:pointer;font-size:14px;font-family:PingFangSC-Regular,PingFang SC;font-weight:400;color:#fff;margin-left:20px;width:120px;height:32px;background:#553AFE;border-radius:2px}.action .next[data-v-05611967]:hover{opacity:.8}.action .clear[data-v-05611967]{min-width:65px;font-weight:400;line-height:30px;text-align:center;cursor:pointer;height:32px;border-radius:2px;border:1px solid rgba(0,0,0,.15);font-size:14px;font-family:PingFangSC-Regular,PingFang SC;color:#000000d4;line-height:32px}.action .clear[data-v-05611967]:hover{opacity:.8}@keyframes bganimation-6e29e960{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-6e29e960{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-6e29e960{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-6e29e960]{animation:rotateEnter-6e29e960 .7s;position:relative}.rotate-leave-active[data-v-6e29e960]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-6e29e960]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.title_info[data-v-6e29e960]{display:block;width:100%;text-align:center}.title_info p[data-v-6e29e960]{font-size:20px;margin-bottom:10px}.label-item[data-v-6e29e960]{width:100%;margin:1rem 0}.label-item .label-item_key[data-v-6e29e960]{width:100%;font-size:12px;color:#666}.label-item .label-item_key span[data-v-6e29e960]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.label-item .label-item_key span[data-v-6e29e960]:before{content:\"*\";color:#f56c6c;margin-right:4px}.label-item .label-item_value[data-v-6e29e960]{width:100%;margin-top:5px}.label-item .label-item_value select[data-v-6e29e960],.label-item .label-item_value input[data-v-6e29e960]{width:100%;height:36px;color:#000}.label-item .label-item_value input[data-v-6e29e960]::placeholder{color:#999;font-size:12PX}.label-item .label_tips[data-v-6e29e960]{display:flex;margin-top:6px}.label-item .label_tips .info[data-v-6e29e960]{margin-left:8px}.label-message[data-v-6e29e960]{width:100%;text-align:left;font-size:14px;color:red;text-align:center}@keyframes bganimation-6f1d92d9{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-6f1d92d9{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-6f1d92d9{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-6f1d92d9]{animation:rotateEnter-6f1d92d9 .7s;position:relative}.rotate-leave-active[data-v-6f1d92d9]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-6f1d92d9]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action-main[data-v-6f1d92d9]{width:680px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.action-main[data-v-6f1d92d9] .actioner-container{width:100%}.action-main[data-v-6f1d92d9] .actioner-container .actioner-container_header{width:100%;height:50px;line-height:50px;display:flex;flex-wrap:wrap;align-items:center;font-size:20px;border-bottom:1px solid #eee;justify-content:center;padding:0 10px}.action-main[data-v-6f1d92d9] .actioner-container .actioner-container_footer{width:100%;height:50px;border-top:1px solid rgba(0,0,0,.06);display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:0 30px}.action-main[data-v-6f1d92d9] .actioner-container .actioner-container_footer button{display:inline-block;width:100px!important;margin:0;margin-left:1rem}.action-main[data-v-6f1d92d9] .actioner-container .actioner-container_footer .close{min-width:65px;font-weight:400;line-height:30px;text-align:center;cursor:pointer;height:32px;border-radius:2px;border:1px solid rgba(0,0,0,.15);font-size:14px;font-family:PingFangSC-Regular,PingFang SC;color:#000000d4;line-height:32px}.action-main[data-v-6f1d92d9] .actioner-container .actioner-container_footer .next{min-width:65px;line-height:32px;text-align:center;cursor:pointer;font-size:14px;font-family:PingFangSC-Regular,PingFang SC;font-weight:400;color:#fff;margin-left:20px;width:74px;height:32px;background:#553AFE;border-radius:2px}.action-main[data-v-6f1d92d9] .actioner-container .actioner-container_footer .next.save{height:32px;background:#553AFE;border-radius:2px;line-height:16px}.action-main[data-v-6f1d92d9] .actioner-container .actioner-container_footer .next:hover,.action-main[data-v-6f1d92d9] .actioner-container .actioner-container_footer .close:hover{opacity:.9}.action-main[data-v-6f1d92d9] .actioner-container .actioner-container_body{padding:1rem;width:100%;height:400px}.action-main[data-v-6f1d92d9] .actioner-container .actioner-container_body a{text-decoration:none}.action-main[data-v-6f1d92d9] .actioner-container .actioner-container_body.ali,.action-main[data-v-6f1d92d9] .actioner-container .actioner-container_body.dnspod,.action-main[data-v-6f1d92d9] .actioner-container .actioner-container_body.oray{height:451px}@keyframes bganimation-6f1d92d9{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-6f1d92d9{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-6f1d92d9{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-6f1d92d9]{animation:rotateEnter-6f1d92d9 .7s;position:relative}.rotate-leave-active[data-v-6f1d92d9]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-6f1d92d9]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 800px){.action-main[data-v-6f1d92d9]{width:90%}}@keyframes bganimation-134135a2{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-134135a2{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-134135a2{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-134135a2]{animation:rotateEnter-134135a2 .7s;position:relative}.rotate-leave-active[data-v-134135a2]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-134135a2]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}[data-v-134135a2] .footer-btn{background:var(--card-bg-color);border:1px solid var(--btn-border-color)}[data-v-134135a2] .reusable-card{background:#fff5ee!important;border:1px solid #ffd6a7!important}[data-v-134135a2] .earthIcon path{fill:var(--app-container_title-color)!important}.icon[data-v-134135a2]{width:1.3rem;height:1.3rem}.icon1[data-v-134135a2]{width:1rem;height:1rem}.icon2[data-v-134135a2]{width:1.5rem;height:1.5rem;margin-bottom:8px}.icon3[data-v-134135a2]{width:1.5rem;height:1.5rem;cursor:pointer}a[data-v-134135a2]{text-decoration:none;cursor:pointer;font-size:14px;display:block}.content[data-v-134135a2]{color:#333;margin-top:20px;margin-bottom:20px;font-weight:400;padding:0 12px}.content .tab[data-v-134135a2]{display:flex;gap:8px}.content .tab .item[data-v-134135a2]{flex:1;padding:16px;display:flex;flex-direction:column;align-items:center;border-radius:10px;cursor:pointer;border:2px solid transparent;box-sizing:border-box}.content .tab .item .title[data-v-134135a2]{margin-bottom:8px}.content .tab .item>span[data-v-134135a2]{font-size:12px}.content .tab .active[data-v-134135a2]{border:2px solid #6d6d6d}.content .tab .cloud[data-v-134135a2]{background-color:#eff6ff;color:#1447e6}.content .tab .memory[data-v-134135a2]{background-color:#f0fdf4;color:#008236}.content .tab .network[data-v-134135a2]{background-color:#f9fafb;color:#4a5565}.content .info[data-v-134135a2]{margin-top:20px}.content .info .status[data-v-134135a2]{padding:20px 0 0;margin-top:16px;display:flex;justify-content:space-between;border-top:1px solid var(--btn-border-color)}.content .info .status .offline[data-v-134135a2]{background:#eceef2;color:#030213}.content .info .status>div[data-v-134135a2]{color:var(--app-container_title-color);font-size:16px}.content .info .status>span[data-v-134135a2]{color:#fff;padding:4px 8px;background:#030213;border-radius:6px;font-size:12px}.content .info .title_box[data-v-134135a2]{margin:20px 0}.content .info .title_box .title[data-v-134135a2]{color:var(--item-label_key-span-color);margin-bottom:10px}.content .info .title_box .path[data-v-134135a2]{display:flex;align-items:center;justify-content:space-between;border:1px solid #e0e1e1;background:#f9fafb;border-radius:4px;padding:8px 10px}.content .info .title_box .path>span[data-v-134135a2]{display:inline-block;padding:4px 8px;border:1px solid #553afb;font-size:12px;border-radius:4px;cursor:pointer;flex-shrink:0}.content .info .title_box .path>span>a[data-v-134135a2]{color:#553afb}.btn_settings[data-v-134135a2]{padding:6px 18px;border-radius:4px;border:1px solid var(--btn-border-color);line-height:1;display:flex;align-items:center}@keyframes bganimation-134135a2{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-134135a2{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-134135a2{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-134135a2]{animation:rotateEnter-134135a2 .7s;position:relative}.rotate-leave-active[data-v-134135a2]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-134135a2]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 768px){.content[data-v-134135a2]{margin:10px 0 0;padding:4px}.content .info[data-v-134135a2]{margin-top:10px}.content .info .status[data-v-134135a2]{padding-top:10px}.content .info .title_box[data-v-134135a2]{margin:10px 0}}@keyframes bganimation-47c7bd93{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-47c7bd93{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-47c7bd93{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-47c7bd93]{animation:rotateEnter-47c7bd93 .7s;position:relative}.rotate-leave-active[data-v-47c7bd93]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-47c7bd93]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.icon[data-v-47c7bd93]{width:1.5rem;height:1.5rem;margin-right:6px}.display_flex[data-v-47c7bd93]{display:flex;align-items:center}.network_container[data-v-47c7bd93]{border:1px solid var(--border-color);border-radius:10px;padding:20px 14px;box-sizing:border-box;background-clip:padding-box;background:var(--card-bg-color);height:100%;display:flex;flex-direction:column;min-height:0}.network_container .title_box[data-v-47c7bd93]{display:flex;justify-content:space-between;align-items:center;margin-bottom:26px;flex-shrink:0}.network_container .title_box>span[data-v-47c7bd93]{font-size:16px;font-weight:600}.network_container .title_box .network_tag[data-v-47c7bd93]{display:flex;align-items:center}.network_container .title_box .network_tag .tag_item[data-v-47c7bd93]{display:flex;align-items:center;font-size:12px;margin-left:16px}.network_container .title_box .network_tag .tag_item>span[data-v-47c7bd93]{line-height:1}.network_container .title_box .network_tag .tag_item>div[data-v-47c7bd93]{width:12px;height:12px;border-radius:50%;margin-right:6px}.network_container .title_box .network_tag .tag_item .tag_dn[data-v-47c7bd93]{background:#20c7f7}.network_container .title_box .network_tag .tag_item .tag_up[data-v-47c7bd93]{background:#553afe}.network_container .echart[data-v-47c7bd93]{flex:1;min-height:200px;min-width:0}.network_container .speed[data-v-47c7bd93]{display:flex;flex-shrink:0}.network_container .speed .speed_item[data-v-47c7bd93]{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:center}.network_container .speed .speed_item>span[data-v-47c7bd93]{font-size:12px;color:#999;margin-bottom:10px}.network_container .speed .speed_item>div[data-v-47c7bd93]{font-size:16px;color:#333}.speed_box[data-v-47c7bd93]{display:flex;align-items:center;justify-content:flex-end;margin-top:16px}@keyframes bganimation-47c7bd93{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-47c7bd93{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-47c7bd93{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-47c7bd93]{animation:rotateEnter-47c7bd93 .7s;position:relative}.rotate-leave-active[data-v-47c7bd93]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-47c7bd93]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 768px){.network_container[data-v-47c7bd93]{border-radius:6px;padding:10px}.network_container .title_box[data-v-47c7bd93]{margin-bottom:16px}.network_container .title_box>span[data-v-47c7bd93]{font-size:14px;font-weight:600}}@keyframes bganimation-5cff2770{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-5cff2770{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-5cff2770{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-5cff2770]{animation:rotateEnter-5cff2770 .7s;position:relative}.rotate-leave-active[data-v-5cff2770]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-5cff2770]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.actioner-dns[data-v-5cff2770]{width:860px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.actioner-dns .actioner-dns_header[data-v-5cff2770]{width:100%;display:flex;flex-wrap:wrap;align-items:center;padding:1rem;font-size:2em;border-bottom:1px solid #eee}.actioner-dns .actioner-dns_body[data-v-5cff2770]{padding:1rem;min-height:50vh}.actioner-dns .actioner-dns_body .label-item[data-v-5cff2770]{width:100%;margin:1rem 0}.actioner-dns .actioner-dns_body .label-item .label-item_key[data-v-5cff2770]{width:100%;font-size:12px;color:#666}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-5cff2770]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-5cff2770]:before{content:\"*\";color:#f56c6c;margin-right:4px}.actioner-dns .actioner-dns_body .label-item .label-item_value[data-v-5cff2770]{width:100%;margin-top:5px}.actioner-dns .actioner-dns_body .label-item .label-item_value select[data-v-5cff2770],.actioner-dns .actioner-dns_body .label-item .label-item_value input[data-v-5cff2770]{width:100%;height:36px}.actioner-dns .actioner-dns_body .label-message[data-v-5cff2770]{width:100%;text-align:left;font-size:14px;color:red;text-align:center}.actioner-dns .config-message[data-v-5cff2770]{width:100%;min-height:inherit;height:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;font-size:2em}.actioner-dns .actioner-dns_footer[data-v-5cff2770]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:1rem;font-size:2em;border-top:1px solid #eee}.actioner-dns .actioner-dns_footer button[data-v-5cff2770]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}@keyframes bganimation-5cff2770{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-5cff2770{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-5cff2770{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-5cff2770]{animation:rotateEnter-5cff2770 .7s;position:relative}.rotate-leave-active[data-v-5cff2770]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-5cff2770]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 1400px){.actioner-dns .actioner-dns_body[data-v-5cff2770]{min-height:34vh}}@media screen and (max-width: 800px){.actioner-dns[data-v-5cff2770]{width:100%}}@keyframes bganimation-3f8f9931{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-3f8f9931{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-3f8f9931{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-3f8f9931]{animation:rotateEnter-3f8f9931 .7s;position:relative}.rotate-leave-active[data-v-3f8f9931]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-3f8f9931]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.actioner-dns[data-v-3f8f9931]{width:800px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.actioner-dns .actioner-dns_header[data-v-3f8f9931]{width:100%;display:flex;flex-wrap:wrap;align-items:center;padding:1rem;font-size:2em;border-bottom:1px solid #eee}.actioner-dns .actioner-dns_body[data-v-3f8f9931]{padding:1rem;min-height:50vh}.actioner-dns .actioner-dns_body .label-item[data-v-3f8f9931]{width:100%;margin:1rem 0}.actioner-dns .actioner-dns_body .label-item .label-item_key[data-v-3f8f9931]{width:100%;font-size:12px;color:#666}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-3f8f9931]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-3f8f9931]:before{content:\"*\";color:#f56c6c;margin-right:4px}.actioner-dns .actioner-dns_body .label-item .label-item_value[data-v-3f8f9931]{width:100%;margin-top:5px}.actioner-dns .actioner-dns_body .label-item .label-item_value select[data-v-3f8f9931],.actioner-dns .actioner-dns_body .label-item .label-item_value input[data-v-3f8f9931]{height:36px}.actioner-dns .actioner-dns_body .label-message[data-v-3f8f9931]{width:100%;text-align:left;font-size:14px;color:red;text-align:center}.actioner-dns .config-message[data-v-3f8f9931]{width:100%;min-height:inherit;height:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;font-size:2em}.actioner-dns .actioner-dns_footer[data-v-3f8f9931]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:1rem;font-size:2em;border-top:1px solid #eee}.actioner-dns .actioner-dns_footer button[data-v-3f8f9931]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}.actioner-dns .select-editable[data-v-3f8f9931]{position:relative;border:solid grey 1px;width:100%}.actioner-dns .select-editable select[data-v-3f8f9931]{top:0;left:0;font-size:14px;border:none;width:100%;margin:0}.actioner-dns .select-editable input[data-v-3f8f9931]{position:absolute;top:-4px;left:0;width:95%;padding:1px;font-size:14px;border:none}.actioner-dns .select-editable select[data-v-3f8f9931]:focus,.actioner-dns .select-editable input[data-v-3f8f9931]:focus{outline:none}.actioner-dns[data-v-3f8f9931] ::placeholder{color:#999}.successed[data-v-3f8f9931]{text-align:center;font-size:14px;margin-bottom:104px}.finished[data-v-3f8f9931]{display:flex;justify-content:center;margin:80px 80px 28px}.docker_moves[data-v-3f8f9931]{text-align:center}.docker_moves .moves[data-v-3f8f9931]{margin-top:10px}.docker_moves .moves input[data-v-3f8f9931]{cursor:pointer}.docker_moves .moves label[data-v-3f8f9931]{margin-left:10px;cursor:pointer}.btns[data-v-3f8f9931]{text-align:center}.item_info[data-v-3f8f9931]{margin-left:10px}.softsource_tit[data-v-3f8f9931]{margin:0 auto}.softsource_successed[data-v-3f8f9931]{width:20%!important}@keyframes bganimation-3f8f9931{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-3f8f9931{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-3f8f9931{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-3f8f9931]{animation:rotateEnter-3f8f9931 .7s;position:relative}.rotate-leave-active[data-v-3f8f9931]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-3f8f9931]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 1400px){.actioner-dns .actioner-dns_body[data-v-3f8f9931]{min-height:34vh}}@media screen and (max-width: 860px){.actioner-dns[data-v-3f8f9931]{width:100%}}@keyframes bganimation-24e35542{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-24e35542{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-24e35542{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-24e35542]{animation:rotateEnter-24e35542 .7s;position:relative}.rotate-leave-active[data-v-24e35542]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-24e35542]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.icon[data-v-24e35542]{width:1.5rem;height:1.5rem}[data-v-24e35542] .networkIcon path{fill:var(--app-container_title-color)!important}.flex[data-v-24e35542]{display:flex;align-items:center}.info_content[data-v-24e35542]{margin:12px 0 4px;height:100%;display:flex;flex-direction:column;justify-content:space-between}.info_content .status_box[data-v-24e35542]{display:flex;align-items:center;justify-content:space-between;padding-bottom:12px;border-bottom:1px solid var(--border-color);font-size:14px;line-height:1;margin-bottom:6px}.info_content .status_box .status_name[data-v-24e35542]{display:flex;align-items:center;line-height:1}.info_content .status_box .status_name .icon[data-v-24e35542]{width:1rem;height:1rem;margin-right:6px}.info_content .status_box .status_time[data-v-24e35542]{padding:4px 8px;background:#dbfce7;color:#008236;border-radius:4px}.info_content .ip_item[data-v-24e35542]{display:flex;justify-content:space-between;align-items:center}.info_content .ip_item .ip_action[data-v-24e35542]{display:flex;align-items:center;gap:8px}.info_content .ip_item .ip_tag[data-v-24e35542]{padding:3px 6px;border-radius:6px;border:1px solid #d1d5db;font-size:12px;line-height:1;display:flex;align-items:center}.info_content .ip_item .ip_tag>svg[data-v-24e35542]{width:1.3rem;height:1.3rem;vertical-align:middle;margin-right:4px}.info_content .ip_item .device[data-v-24e35542]{font-size:14px;color:#155dfc}.info_content .ip_item .delay[data-v-24e35542]{font-size:14px;color:#00a663}.info_content .ip_item .download[data-v-24e35542]{font-size:14px;color:var(--item-label_key-span-color)}.info_content .line[data-v-24e35542]{width:100%;height:1px;background:var(--btn-border-color);margin-bottom:20px}.info_content .line1[data-v-24e35542]{width:100%;height:1px;background:var(--btn-border-color);margin:20px 0}.info_content .ip_item[data-v-24e35542]:nth-last-child(1){margin-top:20px}.info_content .ip_info[data-v-24e35542]{min-height:60px;display:flex;flex-direction:column;justify-content:flex-end}.info_content .ip_info .ip_address[data-v-24e35542]{color:var(--item-label_key-span-color);margin-top:10px}.device-manage-btn[data-v-24e35542]{border:1px solid var(--btn-border-color);border-radius:6px;background:var(--card-bg-color);color:var(--app-container_title-color);padding:8px 10px 6px;line-height:1;font-size:12px;cursor:pointer;transition:background .2s,transform .1s;display:inline-flex;align-items:center;gap:6px}.device-manage-btn[data-v-24e35542]:hover{background:var(--btn-border-hover-color)}.device-manage-btn[data-v-24e35542]:active{transform:scale(.97)}.device-manage-icon[data-v-24e35542]{width:14px;height:14px;display:inline-block}.btn-primary[data-v-24e35542]{background-color:#00b8db;color:#fff;border:none;padding:3px 16px;border-radius:8px;font-size:14px;cursor:pointer;transition:background .2s,transform .1s;margin-left:6px}.btn-primary[data-v-24e35542]:hover{background-color:#26a7c7}.btn-primary[data-v-24e35542]:active{transform:scale(.95)}.btn-pink[data-v-24e35542]{background-color:#f751a9;color:#fff;border:none;padding:3px 12px;border-radius:8px;font-size:14px;cursor:pointer;transition:background .2s,transform .1s;margin-left:6px}.btn-pink[data-v-24e35542]:hover{background-color:#e60076}.btn-pink[data-v-24e35542]:active{transform:scale(.95)}@keyframes bganimation-24e35542{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-24e35542{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-24e35542{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-24e35542]{animation:rotateEnter-24e35542 .7s;position:relative}.rotate-leave-active[data-v-24e35542]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-24e35542]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 768px){.flex[data-v-24e35542]{flex-direction:column;align-items:flex-start}}@keyframes bganimation-3ebe4ebd{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-3ebe4ebd{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-3ebe4ebd{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-3ebe4ebd]{animation:rotateEnter-3ebe4ebd .7s;position:relative}.rotate-leave-active[data-v-3ebe4ebd]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-3ebe4ebd]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.icon[data-v-3ebe4ebd]{width:1.3rem;height:1.3rem}.icon1[data-v-3ebe4ebd],.icon2[data-v-3ebe4ebd]{width:1rem;height:1rem}[data-v-3ebe4ebd] .interfaceIcon path{fill:var(--app-container_title-color)!important}[data-v-3ebe4ebd] .footer-btn{margin-top:6px}.content[data-v-3ebe4ebd]{margin-top:6px;padding-bottom:16px;min-height:30px;display:flex;overflow-x:auto;overflow-y:hidden;-webkit-overflow-scrolling:touch;scrollbar-gutter:stable both-edges;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent}.content[data-v-3ebe4ebd]::-webkit-scrollbar{height:6px}.content[data-v-3ebe4ebd]::-webkit-scrollbar-thumb{background:#ccc;border-radius:3px}.content .item[data-v-3ebe4ebd]{position:relative;display:inline-flex;align-items:center;padding-right:20px;margin-right:16px;cursor:pointer}.content .item[data-v-3ebe4ebd]:before{content:\"\";display:inline-block;position:absolute;right:0;top:50%;transform:translateY(-50%);width:1px!important;height:60%;background:#e0e0e0}.content .item[data-v-3ebe4ebd]:last-child:before{content:none}.content .icon_box[data-v-3ebe4ebd]{display:inline-flex;justify-content:center;align-items:center;width:30px;height:30px;border-radius:8px;background:#dbfce7;margin-right:12px}.content .name[data-v-3ebe4ebd]{display:flex;align-items:center;margin-bottom:6px}.content .speed[data-v-3ebe4ebd]{padding:4px 6px;background:#dbfce7;font-size:12px;border-radius:6px;line-height:1;color:#008236;margin-left:8px}.content .status[data-v-3ebe4ebd]{font-size:12px;color:#6a7282}.content>*[data-v-3ebe4ebd]{flex:0 0 auto}[data-v-3ebe4ebd] .content::-webkit-scrollbar{height:8px}[data-v-3ebe4ebd] .content::-webkit-scrollbar-thumb{border-radius:4px;background:rgba(0,0,0,.35)}[data-v-3ebe4ebd] .content::-webkit-scrollbar-track{background:transparent}.btn_settings[data-v-3ebe4ebd]{position:relative;padding:6px 18px;border-radius:4px;border:1px solid var(--btn-border-color);line-height:1;display:flex;align-items:center}.rotation[data-v-3ebe4ebd]{position:absolute;right:2px;top:50%;height:100%;transform:translateY(-50%);border-left:1px solid var(--btn-border-color);display:flex;align-items:center}.rotation .moreIcon[data-v-3ebe4ebd]{transform:rotate(90deg)}.row input[type=checkbox][data-v-3ebe4ebd]{vertical-align:middle;margin:0}.row[data-v-3ebe4ebd]{gap:8px;padding:0;margin:6px 0;display:flex;align-items:center}.row>input[data-v-3ebe4ebd]{margin-right:6px!important;margin-top:0}[data-v-3ebe4ebd] .dropdown-menu div:hover{background:transparent!important}[data-v-3ebe4ebd] .dropdown-menu{padding:8px 0}[data-v-3ebe4ebd] .dropdown-menu>div{padding:0}@keyframes bganimation-3ebe4ebd{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-3ebe4ebd{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-3ebe4ebd{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-3ebe4ebd]{animation:rotateEnter-3ebe4ebd .7s;position:relative}.rotate-leave-active[data-v-3ebe4ebd]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-3ebe4ebd]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@keyframes bganimation-58f520f0{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-58f520f0{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-58f520f0{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-58f520f0]{animation:rotateEnter-58f520f0 .7s;position:relative}.rotate-leave-active[data-v-58f520f0]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-58f520f0]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.feature-card[data-v-58f520f0]{flex:1 1 0;min-width:280px;max-width:350px;padding:14px 14px 20px;border:2px solid var(--border-color);border-radius:10px;cursor:pointer;transition:transform .2s ease,box-shadow .2s ease;background-color:var(--card-bg-color);display:flex;align-items:flex-start;justify-content:space-between}.feature-card[data-v-58f520f0]:hover{transform:translateY(-2px);box-shadow:0 4px 12px #00000014}.feature-card .badge[data-v-58f520f0]{font-size:12px;padding:4px 6px;border-radius:6px;color:#fff;line-height:1}.feature-card .header[data-v-58f520f0]{display:flex;align-items:center;gap:6px;margin-bottom:16px}.feature-card .header .icon-wrapper[data-v-58f520f0]{width:40px;height:40px;border-radius:10px;display:flex;align-items:center;justify-content:center;background-color:#999;color:#fff}.feature-card .header .icon-wrapper .icon-svg[data-v-58f520f0]{width:24px;height:24px}.feature-card .content .title[data-v-58f520f0]{font-weight:700;color:var(--item-label_key-span-color);margin-bottom:8px}.feature-card .content .subtitle[data-v-58f520f0]{font-size:14px;color:#666;margin-top:2px}.feature-card .footer[data-v-58f520f0]{display:flex;align-items:center;margin-top:12px;font-size:12px}.feature-card .footer .status[data-v-58f520f0]{padding:4px 6px;border-radius:6px;background-color:#eee;color:#666;line-height:1;margin-right:6px}.feature-card .footer .status.active[data-v-58f520f0]{background-color:#d3f9d8;color:#38a169}.feature-card .footer .extra[data-v-58f520f0]{color:inherit}.feature-card .footer .extra .extra_num[data-v-58f520f0]{font-size:16px}.feature-card .right-arrow[data-v-58f520f0]{width:18px;height:18px;align-self:center}.feature-card.purple .icon-wrapper[data-v-58f520f0]{background-color:#ad46ff}.feature-card.purple .badge[data-v-58f520f0]{background-color:#f3e8ff;color:#8200db}.feature-card.blue .icon-wrapper[data-v-58f520f0]{background-color:#3b82f6}.feature-card.blue .badge[data-v-58f520f0]{background-color:#e6effe;color:#3b82f6}.feature-card.blue .right-arrow[data-v-58f520f0]{opacity:.8;width:18px;height:18px}.feature-card.green .icon-wrapper[data-v-58f520f0],.feature-card.green .badge[data-v-58f520f0]{background-color:#22c55e}.feature-card.pink .icon-wrapper[data-v-58f520f0]{background-color:#ec4899}.feature-card.pink .badge[data-v-58f520f0]{background-color:#f6339a}.feature-card.pink .right-arrow[data-v-58f520f0]{color:#f6349b;opacity:.7}.feature-card.skyblue .icon-wrapper[data-v-58f520f0]{background-color:#615fff}.feature-card.skyblue .badge[data-v-58f520f0]{background-color:#e0e7ff;color:#432dd7}.feature-card.orange .icon-wrapper[data-v-58f520f0],.feature-card.orange .badge[data-v-58f520f0]{background-color:#f97316}@keyframes bganimation-58f520f0{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-58f520f0{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-58f520f0{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-58f520f0]{animation:rotateEnter-58f520f0 .7s;position:relative}.rotate-leave-active[data-v-58f520f0]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-58f520f0]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 768px){.feature-card[data-v-58f520f0]{min-width:180px;padding:10px;border-radius:6px;border:1px solid #e5e5e5;transition:none}.feature-card[data-v-58f520f0]:hover{transform:none;box-shadow:none}.feature-card .header[data-v-58f520f0]{margin-bottom:8px}.feature-card .content .title[data-v-58f520f0]{font-weight:700;color:#333;margin-bottom:4px}.feature-card .footer[data-v-58f520f0]{margin-top:6px}}@keyframes bganimation-22104807{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-22104807{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-22104807{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-22104807]{animation:rotateEnter-22104807 .7s;position:relative}.rotate-leave-active[data-v-22104807]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-22104807]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.actioner-dns[data-v-22104807]{width:860px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.actioner-dns .actioner-dns_header[data-v-22104807]{width:100%;display:flex;flex-wrap:wrap;align-items:center;padding:1rem;font-size:2em;border-bottom:1px solid #eee}.actioner-dns .actioner-dns_body[data-v-22104807]{padding:1rem;min-height:50vh}.actioner-dns .actioner-dns_body .label-item[data-v-22104807]{width:100%;margin:1rem 0}.actioner-dns .actioner-dns_body .label-item .label-item_key[data-v-22104807]{width:100%;font-size:12px;color:#666}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-22104807]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-22104807]:before{content:\"*\";color:#f56c6c;margin-right:4px}.actioner-dns .actioner-dns_body .label-item .label-item_value[data-v-22104807]{width:100%;margin-top:5px}.actioner-dns .actioner-dns_body .label-item .label-item_value select[data-v-22104807],.actioner-dns .actioner-dns_body .label-item .label-item_value input[data-v-22104807]{width:100%;height:36px}.actioner-dns .actioner-dns_body .chose_dhcp[data-v-22104807]{height:1em;font-size:1.3em}.actioner-dns .actioner-dns_body .chose_dhcp .dhcp_info[data-v-22104807]{margin-left:10px;user-select:none}.actioner-dns .actioner-dns_body .label-message[data-v-22104807]{width:100%;text-align:left;font-size:14px;color:red;text-align:center}.actioner-dns .config-message[data-v-22104807]{width:100%;min-height:inherit;height:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;font-size:2em}.actioner-dns .actioner-dns_footer[data-v-22104807]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:1rem;font-size:2em;border-top:1px solid #eee}.actioner-dns .actioner-dns_footer button[data-v-22104807]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}.setting_status[data-v-22104807]{text-align:center}.setting_status p[data-v-22104807]{margin:10px 0}.setting_status a[data-v-22104807]{text-align:center;display:block;text-decoration:none}.NewAdress[data-v-22104807]{margin-top:10px}@keyframes bganimation-22104807{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-22104807{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-22104807{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-22104807]{animation:rotateEnter-22104807 .7s;position:relative}.rotate-leave-active[data-v-22104807]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-22104807]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 1400px){.actioner-dns .actioner-dns_body[data-v-22104807]{min-height:34vh}}@media screen and (max-width: 800px){.actioner-dns[data-v-22104807]{width:100%}}@keyframes bganimation-58c55341{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-58c55341{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-58c55341{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-58c55341]{animation:rotateEnter-58c55341 .7s;position:relative}.rotate-leave-active[data-v-58c55341]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-58c55341]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.actioner-dns[data-v-58c55341]{width:860px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.actioner-dns .actioner-dns_header[data-v-58c55341]{width:100%;display:flex;flex-wrap:wrap;align-items:center;padding:1rem;font-size:2em;border-bottom:1px solid #eee}.actioner-dns .actioner-dns_header span[data-v-58c55341]{margin:0 auto}.actioner-dns .actioner-dns_body[data-v-58c55341]{padding:1rem;min-height:50vh}.actioner-dns .actioner-dns_body .sandbox_roboot_tips[data-v-58c55341]{margin-top:24px;text-align:center}.actioner-dns .actioner-dns_body .disk_loading_icon[data-v-58c55341]{position:absolute;left:50%;transform:translate(-50%);display:flex;flex-direction:column;align-items:center;padding:10px}.actioner-dns .actioner-dns_body .disk_loading_icon .disk_loading_info[data-v-58c55341]{margin-top:5px}.actioner-dns .actioner-dns_body .disk_tips[data-v-58c55341]{text-align:center;font-size:16px;margin-top:159px;color:#f9ad1e}.actioner-dns .actioner-dns_body .disk_tips svg[data-v-58c55341]{vertical-align:middle}.actioner-dns .actioner-dns_body .disk_tips span[data-v-58c55341]{margin-left:6px}.actioner-dns .actioner-dns_body .sandbox_info[data-v-58c55341]{text-align:center;line-height:22px}.actioner-dns .actioner-dns_body .label-item[data-v-58c55341]{width:100%;margin:1rem 0}.actioner-dns .actioner-dns_body .label-item .label-item_key[data-v-58c55341]{width:100%;font-size:12px;color:#666}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-58c55341]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-58c55341]:before{content:\"*\";color:#f56c6c;margin-right:4px}.actioner-dns .actioner-dns_body .label-item .label-item_value[data-v-58c55341]{width:100%;margin-top:5px}.actioner-dns .actioner-dns_body .label-item .label-item_value select[data-v-58c55341],.actioner-dns .actioner-dns_body .label-item .label-item_value input[data-v-58c55341]{width:100%;height:36px}.actioner-dns .actioner-dns_body .label-message[data-v-58c55341]{width:100%;text-align:left;font-size:14px;color:red;text-align:center}.actioner-dns .actioner-dns_body .sandbox_tips svg[data-v-58c55341]{vertical-align:middle}.actioner-dns .actioner-dns_body .sandbox_tips span[data-v-58c55341]{font-size:12px;margin-left:4px}.actioner-dns .config-message[data-v-58c55341]{width:100%;min-height:inherit;height:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;font-size:2em}.actioner-dns .actioner-dns_footer[data-v-58c55341]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:1rem;font-size:2em;border-top:1px solid #eee}.actioner-dns .actioner-dns_footer button[data-v-58c55341]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}.actioner-tips[data-v-58c55341]{width:400px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.actioner-tips .actioner-tips_header[data-v-58c55341]{width:100%;display:flex;flex-wrap:wrap;align-items:center;padding:1rem;font-size:2em;border-bottom:1px solid #eee}.actioner-tips .sandbox_info[data-v-58c55341]{padding:62px 54px;line-height:20px}.actioner-tips .actioner-tips_footer[data-v-58c55341]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:1rem;font-size:2em;border-top:1px solid #eee}.timeout[data-v-58c55341]{margin-top:114px}.timeout span[data-v-58c55341],.sandbox_roboot_refresh[data-v-58c55341]{color:#5e72e4}option[data-v-58c55341]:disabled{background-color:#e0e0e0}@keyframes bganimation-58c55341{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-58c55341{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-58c55341{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-58c55341]{animation:rotateEnter-58c55341 .7s;position:relative}.rotate-leave-active[data-v-58c55341]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-58c55341]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 1400px){.actioner-tips_footer button[data-v-58c55341]{width:100%!important}}@media screen and (max-width: 900px){.actioner-dns[data-v-58c55341]{width:100%}}@media screen and (max-width: 700px){.actioner-dns .actioner-dns_body[data-v-58c55341]{min-height:42vh}.actioner-tips[data-v-58c55341]{width:80%;line-height:22px}.actioner-tips .sandbox_info[data-v-58c55341]{padding:34px 10px;font-size:10px}.actioner-tips .actioner-tips_header[data-v-58c55341]{font-size:20px}.actioner-tips .actioner-tips_footer button[data-v-58c55341]{width:100%!important}}@media screen and (max-width: 600px){.actioner-dns .actioner-dns_footer button[data-v-58c55341]{width:100%!important;margin-bottom:10px;margin-left:0}}@media screen and (max-width: 500px){.actioner-dns .actioner-dns_body .label-item .label-item_key[data-v-58c55341]{width:228px;overflow:hidden;text-overflow:ellipsis}}@media screen and (max-width: 400px){.actioner-dns .actioner-dns_body .label-item .label-item_key[data-v-58c55341]{width:163px;overflow:hidden;text-overflow:ellipsis}.actioner-dns .actioner-dns_footer button[data-v-58c55341]{width:100%!important;margin-bottom:10px}.actioner-tips .sandbox_info[data-v-58c55341]{padding:3px 10px}}@keyframes bganimation-9573dc70{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-9573dc70{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-9573dc70{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-9573dc70]{animation:rotateEnter-9573dc70 .7s;position:relative}.rotate-leave-active[data-v-9573dc70]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-9573dc70]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.actioner-dns[data-v-9573dc70]{width:860px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.actioner-dns .actioner-dns_header[data-v-9573dc70]{width:100%;display:flex;flex-wrap:wrap;align-items:center;padding:1rem;font-size:2em;border-bottom:1px solid #eee}.actioner-dns .actioner-dns_header span[data-v-9573dc70]{margin:0 auto}.actioner-dns .actioner-dns_body[data-v-9573dc70]{padding:1rem;min-height:50vh}.actioner-dns .actioner-dns_body .sandbox_info[data-v-9573dc70]{text-align:center;line-height:22px}.actioner-dns .actioner-dns_body .sandbox_environment[data-v-9573dc70]{font-size:16px;line-height:28px;margin:20px 0}.actioner-dns .actioner-dns_body .sandbox_environment_info[data-v-9573dc70]{font-size:16px;line-height:28px}.actioner-dns .actioner-dns_body .sandbox_environment_info .sandbox_environment_reboot[data-v-9573dc70]{color:#5e72e4}.actioner-dns .actioner-dns_body .sandbox_environment_info .sandbox_environment_tex[data-v-9573dc70]{color:red;font-size:.9em}.actioner-dns .actioner-dns_footer[data-v-9573dc70]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:1rem;font-size:2em;border-top:1px solid #eee}.actioner-dns .actioner-dns_footer button[data-v-9573dc70]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}.actioner-tips[data-v-9573dc70]{width:400px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.actioner-tips .actioner-tips_header[data-v-9573dc70]{width:100%;display:flex;flex-wrap:wrap;align-items:center;padding:1rem;font-size:2em;border-bottom:1px solid #eee}.actioner-tips .sandbox_info[data-v-9573dc70]{padding:62px 54px;line-height:20px}.actioner-tips .actioner-tips_footer[data-v-9573dc70]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:1rem;font-size:2em;border-top:1px solid #eee}.timeout[data-v-9573dc70]{margin-top:114px}.timeout span[data-v-9573dc70]{color:#5e72e4}@keyframes bganimation-9573dc70{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-9573dc70{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-9573dc70{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-9573dc70]{animation:rotateEnter-9573dc70 .7s;position:relative}.rotate-leave-active[data-v-9573dc70]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-9573dc70]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 1400px){.actioner-tips_footer button[data-v-9573dc70]{width:100%!important}}@media screen and (max-width: 900px){.actioner-dns[data-v-9573dc70]{width:100%}}@media screen and (max-width: 700px){.actioner-dns .actioner-dns_body[data-v-9573dc70]{min-height:42vh}.actioner-dns .actioner-dns_footer button[data-v-9573dc70]{width:100%!important;margin-bottom:10px}.actioner-tips[data-v-9573dc70]{width:80%;line-height:22px}.actioner-tips .sandbox_info[data-v-9573dc70]{padding:34px 10px;font-size:10px}.actioner-tips .actioner-tips_header[data-v-9573dc70]{font-size:20px}.actioner-tips .actioner-tips_footer button[data-v-9573dc70]{width:100%!important}}@media screen and (max-width: 600px){.actioner-dns .actioner-dns_footer button[data-v-9573dc70]{width:100%!important;margin-bottom:10px;margin-left:0}}@media screen and (max-width: 500px){.actioner-dns .actioner-dns_body .label-item .label-item_key[data-v-9573dc70]{width:228px;overflow:hidden;text-overflow:ellipsis}}@media screen and (max-width: 400px){.actioner-dns .actioner-dns_body .label-item .label-item_key[data-v-9573dc70]{width:163px;overflow:hidden;text-overflow:ellipsis}.actioner-dns .actioner-dns_body .sandbox_info[data-v-9573dc70]{font-size:10px}.actioner-dns .actioner-dns_body .sandbox_environment[data-v-9573dc70],.actioner-dns .actioner-dns_body .sandbox_environment_info[data-v-9573dc70]{font-size:12px}.actioner-tips .sandbox_info[data-v-9573dc70]{padding:3px 10px}}@keyframes bganimation-6ac226af{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-6ac226af{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-6ac226af{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-6ac226af]{animation:rotateEnter-6ac226af .7s;position:relative}.rotate-leave-active[data-v-6ac226af]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-6ac226af]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}[data-v-6ac226af] .icon{width:1.5rem;height:1.5rem;margin-bottom:12px;display:inline-block;flex:0 0 auto}button[data-v-6ac226af]{margin:0!important}button.item[data-v-6ac226af]:disabled{opacity:1}button.item:disabled svg[data-v-6ac226af],button.item:disabled .icon[data-v-6ac226af]{opacity:1!important;filter:none!important;color:#00b8db!important;stroke:#00b8db!important;fill:#00b8db!important}.item_container[data-v-6ac226af]{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:16px;width:100%;padding-bottom:4px;box-sizing:border-box}.item_container[data-v-6ac226af]::-webkit-scrollbar{height:6px}.item_container[data-v-6ac226af]::-webkit-scrollbar-thumb{background:#ccc;border-radius:3px}.item_container .item[data-v-6ac226af]{position:relative;padding:16px 12px;min-width:180px;display:flex;flex-direction:column;justify-content:center;align-items:center;font-size:14px;border-radius:8px;box-sizing:border-box;border:1px solid #e5e7eb;cursor:pointer;color:var(--card-txt-color)}.item_container .app-update-button-more[data-v-6ac226af]{position:absolute;top:4px;right:4px}.item_container .menu_background[data-v-6ac226af]{position:fixed;inset:0}.item_container .renew[data-v-6ac226af]{display:flex;align-items:center}.item_container .renew i[data-v-6ac226af]{display:inline-block;padding:3px;background-color:red;border-radius:50%;margin-right:4px}.item_container .dns_txt[data-v-6ac226af]{display:flex;align-items:center;line-height:1;color:#32325d}.item_container .disabled-style[data-v-6ac226af]{opacity:.6;cursor:not-allowed;pointer-events:none;background-color:#e0e0e0}.item_container .app-update-button-menu[data-v-6ac226af]{position:absolute;z-index:999;width:30%;right:0;top:0}.item_container .app-update-button-menu ul[data-v-6ac226af]{background-color:#fff;box-shadow:0 0 10px 1px #373f6924;padding:6px 0;border-radius:6px;top:-45px;right:0;text-align:center;position:absolute;word-break:keep-all}.item_container .app-update-button-menu ul li[data-v-6ac226af]{cursor:pointer;font-size:16px;line-height:1em;color:#1e1e1e;padding:0 5px;position:relative}.item_container .app-update-button-menu ul li .app-update-menu-item[data-v-6ac226af]{padding:5px 2px;white-space:nowrap}.item_container .app-update-button-menu ul li .app-update-menu-item-loading[data-v-6ac226af]{display:flex;justify-content:center;align-items:center;position:absolute;width:100%;height:100%;top:0;left:0;background-color:#fffc}@keyframes bganimation-6ac226af{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-6ac226af{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-6ac226af{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-6ac226af]{animation:rotateEnter-6ac226af .7s;position:relative}.rotate-leave-active[data-v-6ac226af]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-6ac226af]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 768px){.item_container[data-v-6ac226af]{display:flex;flex-wrap:wrap;gap:10px;width:100%;padding:0;box-sizing:border-box;justify-content:space-between}.item_container .item[data-v-6ac226af]{width:48%;min-width:120px;flex-shrink:0}}@keyframes bganimation-d0b06580{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-d0b06580{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-d0b06580{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-d0b06580]{animation:rotateEnter-d0b06580 .7s;position:relative}.rotate-leave-active[data-v-d0b06580]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-d0b06580]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}li.sambas-item[data-v-d0b06580]{width:100%;display:flex;flex-wrap:wrap;margin:1rem 0}li.sambas-item .sambas-item_name[data-v-d0b06580]{flex:0 0 100%;max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:10px;color:var(--app-container_title-color)}li.sambas-item .sambas-item_value[data-v-d0b06580]{flex:0 0 100%;max-width:50%;padding-left:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--app-container_title-color)}.app-container_samba li.samba-item[data-v-d0b06580]{width:100%;display:flex;flex-wrap:wrap;margin:1rem 0}.app-container_samba li.samba-item .samba-item_name[data-v-d0b06580]{flex:0 0 100%;max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:10px;color:var(--app-container_title-color)}.app-container_samba li.samba-item .samba-item_value[data-v-d0b06580]{flex:0 0 100%;max-width:50%;padding-left:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap}.app-container_samba li.samba-item .samba-item_value button[data-v-d0b06580]{background:none;border:none;width:100%;text-align:right;color:#297ff3;cursor:pointer}.app-container_samba li.samba-item .samba-item_value button[data-v-d0b06580]:hover{opacity:.7}.tit[data-v-d0b06580]{color:var(--tit-color);font-weight:700;font-size:16px}@keyframes bganimation-31dcf6eb{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-31dcf6eb{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-31dcf6eb{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-31dcf6eb]{animation:rotateEnter-31dcf6eb .7s;position:relative}.rotate-leave-active[data-v-31dcf6eb]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-31dcf6eb]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}li.webdav-item[data-v-31dcf6eb]{width:100%;display:flex;flex-wrap:wrap;margin:1rem 0}li.webdav-item .webdav-item_name[data-v-31dcf6eb]{flex:0 0 100%;max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:10px;color:var(--app-container_title-color)}li.webdav-item .webdav-item_value[data-v-31dcf6eb]{flex:0 0 100%;max-width:50%;padding-left:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--app-container_title-color)}@keyframes bganimation-132ef714{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-132ef714{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-132ef714{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-132ef714]{animation:rotateEnter-132ef714 .7s;position:relative}.rotate-leave-active[data-v-132ef714]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-132ef714]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}li.linkease-item[data-v-132ef714]{width:100%;display:flex;flex-wrap:wrap;margin:1rem 0}li.linkease-item .linkease-item_name[data-v-132ef714]{flex:0 0 100%;max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:10px;color:var(--app-container_title-color)}li.linkease-item .linkease-item_value[data-v-132ef714]{flex:0 0 100%;max-width:50%;padding-left:10px;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;color:var(--app-container_title-color)}li.linkease-item .linkease-item_value .configure[data-v-132ef714]{color:#297ff3;padding:3px}li.linkease-item .linkease-item_value .configure.enabel[data-v-132ef714]{cursor:pointer}a[data-v-132ef714]{text-decoration:none;color:#297ff3}@keyframes bganimation-e1182f0e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-e1182f0e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-e1182f0e{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-e1182f0e]{animation:rotateEnter-e1182f0e .7s;position:relative}.rotate-leave-active[data-v-e1182f0e]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-e1182f0e]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.icon[data-v-e1182f0e]{width:1.3rem;height:1.3rem}.icon1[data-v-e1182f0e]{width:1rem;height:1rem}.icon2[data-v-e1182f0e]{width:1.5rem;height:1.5rem;margin-bottom:12px}.settings-icon[data-v-e1182f0e] svg,.settings-icon[data-v-e1182f0e] g,.settings-icon[data-v-e1182f0e] path,.settings-icon[data-v-e1182f0e] circle,.settings-icon[data-v-e1182f0e] rect,.settings-icon[data-v-e1182f0e] line,.settings-icon[data-v-e1182f0e] polyline,.settings-icon[data-v-e1182f0e] polygon{fill:var(--app-container_title-color)!important;stroke:var(--app-container_title-color)!important}a[data-v-e1182f0e]{color:#1e1e1e;text-decoration:none;cursor:pointer;font-size:14px;display:block}.content[data-v-e1182f0e]{color:#333;margin-top:10px;margin-bottom:10px;font-weight:400}.content .tab[data-v-e1182f0e]{display:flex;gap:8px}.content .tab .item[data-v-e1182f0e]{flex:1;padding:16px;display:flex;flex-direction:column;align-items:center;border-radius:10px;cursor:pointer;border:2px solid transparent;box-sizing:border-box}.content .tab .item .title[data-v-e1182f0e]{margin-bottom:8px}.content .tab .item>span[data-v-e1182f0e]{font-size:12px}.content .tab .active[data-v-e1182f0e]{border:2px solid #6d6d6d}.content .tab .cloud[data-v-e1182f0e]{background-color:#eff6ff;color:#1447e6}.content .tab .memory[data-v-e1182f0e]{background-color:#dbfce7;color:#008236}.content .tab .network[data-v-e1182f0e]{background-color:#faf5ff;color:#8200db}.btn_settings[data-v-e1182f0e]{position:relative;padding:6px 34px 6px 18px;border-radius:4px;border:1px solid var(--btn-border-color);line-height:1;display:flex;align-items:center}.rotation[data-v-e1182f0e]{position:absolute;right:2px;top:50%;height:100%;transform:translateY(-50%);border-left:1px solid var(--btn-border-color);display:flex;align-items:center}.rotation .moreIcon[data-v-e1182f0e]{transform:rotate(90deg)}@keyframes bganimation-e1182f0e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-e1182f0e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-e1182f0e{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-e1182f0e]{animation:rotateEnter-e1182f0e .7s;position:relative}.rotate-leave-active[data-v-e1182f0e]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-e1182f0e]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 768px){.content[data-v-e1182f0e]{margin:10px 0}}@keyframes bganimation-b5895698{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-b5895698{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-b5895698{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-b5895698]{animation:rotateEnter-b5895698 .7s;position:relative}.rotate-leave-active[data-v-b5895698]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-b5895698]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action .action-footer button[data-v-b5895698]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}@keyframes bganimation-b5895698{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-b5895698{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-b5895698{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-b5895698]{animation:rotateEnter-b5895698 .7s;position:relative}.rotate-leave-active[data-v-b5895698]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-b5895698]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action.format[data-v-b5895698]{width:700px;height:560px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;overflow:auto;padding:0 25px;border:1px solid #dfdfdf;border-radius:4px;background:#fff;box-shadow:0 1px 4px #0000004d}.action.format .action-header[data-v-b5895698]{width:100%;height:70px;line-height:70px}.action.format .action-header .action-header_title[data-v-b5895698]{margin:0;color:#333;font:inherit;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;-moz-user-select:none;-webkit-user-select:none;user-select:none;font-size:20px}.action.format .action-body[data-v-b5895698]{width:100%;height:calc(100% - 140px);overflow:auto}.action.format .action-footer[data-v-b5895698]{width:100%;height:70px;line-height:70px;color:#333;display:flex;flex-wrap:wrap;align-items:center}.action.format .action-footer .auto[data-v-b5895698]{flex:auto}.action.format .disk-list[data-v-b5895698]{width:100%;height:100%;border:1px solid #dfe1e5;overflow:auto}.action.format .label-item[data-v-b5895698]{width:100%;margin:1rem 0}.action.format .label-item .label-item_key[data-v-b5895698]{width:100%;font-size:16px;color:#666}.action.format .label-item .label-item_key span[data-v-b5895698]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.action.format .label-item .label-item_key span[data-v-b5895698]:before{content:\"*\";color:#f56c6c;margin-right:4px}.action.format .label-item .label-item_value[data-v-b5895698]{width:100%;margin-top:5px}.action.format .label-item .label-item_value select[data-v-b5895698],.action.format .label-item .label-item_value input[data-v-b5895698]{width:100%;height:36px}.action.format .label-item .label-item_path[data-v-b5895698]{padding:0 14px;background-color:#e5e5e5;width:100%;height:28px;line-height:28px;margin-top:10px}.action.format .auto[data-v-b5895698]{flex:auto}.action.format p.msg[data-v-b5895698]{margin:.5rem 0;color:red}.action.format .disk-info[data-v-b5895698]{width:100%;text-align:center}.action.format .disk-info .disk-info_icon[data-v-b5895698]{width:100px;height:100px;margin:0 auto}.action.format .disk-info .disk-info_icon svg[data-v-b5895698]{width:100%;height:100%}.action.format .disk-info .disk-info_mount-name[data-v-b5895698]{margin:1rem 0;font-size:1.5em;color:#333}@keyframes bganimation-b5895698{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-b5895698{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-b5895698{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-b5895698]{animation:rotateEnter-b5895698 .7s;position:relative}.rotate-leave-active[data-v-b5895698]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-b5895698]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action.result[data-v-b5895698]{width:700px;height:560px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;overflow:auto;padding:0 25px;border:1px solid #dfdfdf;border-radius:4px;background:#fff;box-shadow:0 1px 4px #0000004d}.action.result .action-body[data-v-b5895698]{width:100%;height:100%;display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center}.action.result .action-body .action-body_icon[data-v-b5895698]{width:100px;height:100px}.action.result .action-body .action-body_icon svg.icon[data-v-b5895698]{width:100%;height:100%}.action.result .action-body .action-body_msg[data-v-b5895698]{font-size:2em;color:#666;text-align:center;width:100%;margin:1rem 0}.action.result .action-body .action-body_info[data-v-b5895698]{margin:1rem 0;width:100%;text-align:center;color:#666;font-size:1.2em}.action.result .action-body .action-body_info a[data-v-b5895698]{color:#0000fb}.action.result .btns[data-v-b5895698]{width:100%;text-align:center;margin:1rem 0}@keyframes bganimation-10dd00b8{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-10dd00b8{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-10dd00b8{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-10dd00b8]{animation:rotateEnter-10dd00b8 .7s;position:relative}.rotate-leave-active[data-v-10dd00b8]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-10dd00b8]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}li.disk-item.error[data-v-10dd00b8]{color:red}.disk-content[data-v-10dd00b8]{padding:1rem;border:1px solid #cfcfcf;margin:16px 0}.disk-content li.disk-item[data-v-10dd00b8]{width:100%;display:flex;align-items:center}.disk-content li.disk-item .disk-item_name[data-v-10dd00b8]{flex:0 0 50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:10px}.disk-content li.disk-item .value-data[data-v-10dd00b8]{width:100%;text-overflow:ellipsis;white-space:nowrap;height:100%;color:#297ff3;cursor:default}.disk-content li.disk-item .value-data button[data-v-10dd00b8]{background:none;border:none;width:100%;text-align:right;color:#297ff3;cursor:pointer}.disk-content li.disk-item .value-data button[data-v-10dd00b8]:hover{opacity:.7}.disk-content li.disk-item .value-data.buttondiv[data-v-10dd00b8]{cursor:pointer}.disk-content li.disk-item .disk_value[data-v-10dd00b8]{flex:0 0 50%;display:flex;justify-content:space-between;align-items:center}.disk-content li.disk-item .disk_value .cbi-button[data-v-10dd00b8]{margin-left:10px}.disk-content li.disk-item .disk_value .disk-item_value[data-v-10dd00b8]{flex:auto;padding-left:10px;position:relative}.disk-content li.disk-item .disk_value .disk-item_value .disk-item-tooltip[data-v-10dd00b8]{position:absolute;background:rgba(0,0,0,.7);z-index:10111;color:#fff;padding:.5rem 1rem;left:10px;right:0;bottom:100%;margin-bottom:6px;text-align:center;font-size:1em;visibility:hidden;opacity:0}.disk-content li.disk-item .disk_value .disk-item_value .disk-item-tooltip[data-v-10dd00b8]:after{content:\"\";position:absolute;bottom:-6px;border-color:#4c4c4c rgba(0,0,0,0) rgba(0,0,0,0);left:0;right:0;text-align:center;width:0;margin:0 auto;border-width:6px 8px 0;border-style:solid}.disk-content li.disk-item .disk_value .disk-item_value:hover .disk-item-tooltip[data-v-10dd00b8]{visibility:visible;transition:.7s;opacity:1}.disk-content .disk_status[data-v-10dd00b8]{display:flex;text-align:left;padding-left:10px;font-size:12px;padding-top:6px}.disk-content .disk_status .disk_status_item[data-v-10dd00b8]{display:flex;margin-right:20px}.disk-content .disk_status .disk_status_item .disk_tip[data-v-10dd00b8]{display:flex;align-items:center}.disk_infoicon[data-v-10dd00b8]{margin-left:10px;cursor:pointer}.tooltip-trigger[data-v-10dd00b8]{flex:none}.tooltip-trigger[data-v-10dd00b8]{position:relative;display:inline-block;cursor:help;margin-right:6px;margin-left:10px}.tooltip-trigger .tooltip-text[data-v-10dd00b8]{visibility:hidden;position:absolute;padding:.5rem 1rem;background-color:#555;color:#fff;text-align:center;border-radius:6px;z-index:1;opacity:0;transition:opacity .6s}.tooltip-trigger .tooltip-text span[data-v-10dd00b8]{color:#fff}.tooltip-trigger .tooltip-text .disk_dir_tip[data-v-10dd00b8]{min-width:15rem;display:inline-block}.tooltip-trigger:hover .tooltip-text[data-v-10dd00b8]{visibility:visible;opacity:1}.tooltip-top[data-v-10dd00b8]{bottom:100%;left:50%;margin-bottom:5px;transform:translate(-50%)}.tooltip-top[data-v-10dd00b8]:after{content:\"\";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:#555 transparent transparent transparent}.tooltip-bottom[data-v-10dd00b8]:after{content:\"\";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:transparent transparent #555 transparent}@keyframes bganimation-10dd00b8{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-10dd00b8{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-10dd00b8{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-10dd00b8]{animation:rotateEnter-10dd00b8 .7s;position:relative}.rotate-leave-active[data-v-10dd00b8]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-10dd00b8]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 1000px){.disk-content li.disk-item .disk_value[data-v-10dd00b8]{display:block}.disk-content .disk_status[data-v-10dd00b8]{flex-wrap:wrap}}@keyframes bganimation-127a3100{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-127a3100{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-127a3100{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-127a3100]{animation:rotateEnter-127a3100 .7s;position:relative}.rotate-leave-active[data-v-127a3100]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-127a3100]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action[data-v-127a3100]{width:860px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;padding:3rem;border-radius:6px;display:flex;flex-direction:column;flex-wrap:nowrap}.action ul[data-v-127a3100]{overflow:auto}.action ul .app-container_info[data-v-127a3100]{display:flex;justify-content:space-between;max-width:56%;margin-top:18px;font-weight:600}.action ul .app-container_body[data-v-127a3100]{width:100%;height:100%}.action .action-footer[data-v-127a3100]{text-align:center;margin-top:46px}.action .action-footer button[data-v-127a3100]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}@keyframes bganimation-127a3100{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-127a3100{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-127a3100{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-127a3100]{animation:rotateEnter-127a3100 .7s;position:relative}.rotate-leave-active[data-v-127a3100]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-127a3100]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 1000px){.action[data-v-127a3100]{width:160%}}@media screen and (max-width: 800px){.action[data-v-127a3100]{width:138%}}@media screen and (max-width: 700px){.action[data-v-127a3100]{width:132%}}@media screen and (max-width: 600px){.action[data-v-127a3100]{width:116%}}@media screen and (max-width: 500px){.action[data-v-127a3100]{width:100%}}@media screen and (max-width: 400px){.action[data-v-127a3100]{width:90%}}@media screen and (max-width: 300px){.action[data-v-127a3100]{width:100%}}.progress-bar-wrapper[data-v-2e966a39]{width:100%;margin-bottom:0}.progress-bar[data-v-2e966a39]{width:100%;position:relative;box-shadow:inset 0 1px 3px #0000001a}.progress-fill[data-v-2e966a39]{display:flex;align-items:center;justify-content:flex-end;padding-right:8px;box-sizing:border-box}.percentage-text[data-v-2e966a39]{color:#fff;font-size:12px;font-weight:700;text-shadow:0 1px 2px rgba(0,0,0,.3);white-space:nowrap;line-height:1}@media (max-width: 768px){.percentage-text[data-v-2e966a39]{font-size:10px;padding-right:4px}}@media (prefers-color-scheme: dark){.progress-bar[data-v-2e966a39]{box-shadow:inset 0 1px 3px #ffffff1a}}@keyframes bganimation-c3855aca{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-c3855aca{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-c3855aca{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-c3855aca]{animation:rotateEnter-c3855aca .7s;position:relative}.rotate-leave-active[data-v-c3855aca]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-c3855aca]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}li.disk-item.error[data-v-c3855aca]{color:red}li.disk-item[data-v-c3855aca]{width:100%;margin:0 0 1rem}li.disk-item .disk-item_name[data-v-c3855aca]{flex:0 0 100%;max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:10px}li.disk-item .disk-item_name>span[data-v-c3855aca]{color:#6a7280}li.disk-item .disk_icon[data-v-c3855aca]{padding-left:1rem;align-self:center;align-items:center;flex:none;display:flex}li.disk-item .disk_value[data-v-c3855aca]{display:flex;justify-content:flex-end}li.disk-item .disk_value .disk-item_value[data-v-c3855aca]{flex:auto;position:relative;cursor:help;display:flex;align-items:center}li.disk-item .disk_value .disk-item_value .value-data[data-v-c3855aca]{width:100%;text-overflow:ellipsis;white-space:nowrap}li.disk-item .disk_value .disk-item_value .value-data>div[data-v-c3855aca]{margin-top:10px;display:flex;justify-content:space-between}li.disk-item .disk_value .disk-item_value .value-data button[data-v-c3855aca]{background:none;border:none;width:100%;text-align:right;color:#297ff3;cursor:pointer;padding:0;margin:0;line-height:normal}li.disk-item .disk_value .disk-item_value .value-data button[data-v-c3855aca]:hover{opacity:.7}li.disk-item .disk_value .disk-item_value .disk-item-tooltip[data-v-c3855aca]{position:absolute;background:rgba(0,0,0,.7);z-index:10111;color:#fff;padding:.5rem 1rem;left:30%;right:30%;bottom:100%;margin-bottom:6px;text-align:center;font-size:1em;visibility:hidden;opacity:0}li.disk-item .disk_value .disk-item_value .disk-item-tooltip[data-v-c3855aca]:after{content:\"\";position:absolute;bottom:-6px;border-color:#4c4c4c rgba(0,0,0,0) rgba(0,0,0,0);left:0;right:0;text-align:center;width:0;margin:0 auto;border-width:6px 8px 0;border-style:solid}li.disk-item .disk_value .disk-item_value:hover .disk-item-tooltip[data-v-c3855aca]{visibility:visible;transition:.7s;opacity:1}.disk_infoicon[data-v-c3855aca]{margin-left:10px;cursor:pointer;margin-bottom:10px}.tooltip-trigger[data-v-c3855aca]{flex:none;cursor:help}.tooltip-trigger[data-v-c3855aca]{position:relative;display:inline-block;cursor:help;margin-right:6px;margin-left:10px}.tooltip-trigger .tooltip-text[data-v-c3855aca]{visibility:hidden;position:absolute;padding:.5rem 1rem;background-color:#555;color:#fff;text-align:center;border-radius:6px;z-index:1;opacity:0;transition:opacity .6s}.tooltip-trigger .tooltip-text span[data-v-c3855aca]{color:#fff}.tooltip-trigger .tooltip-text .disk_dir_tip[data-v-c3855aca]{min-width:15rem;display:inline-block}.tooltip-trigger:hover .tooltip-text[data-v-c3855aca]{visibility:visible;opacity:1}.tooltip-top[data-v-c3855aca]{bottom:100%;left:50%;margin-bottom:5px;transform:translate(-50%)}.tooltip-top[data-v-c3855aca]:after{content:\"\";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:#555 transparent transparent transparent}.tooltip-bottom[data-v-c3855aca]:after{content:\"\";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:transparent transparent #555 transparent}@keyframes bganimation-6f7fe2ab{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-6f7fe2ab{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-6f7fe2ab{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-6f7fe2ab]{animation:rotateEnter-6f7fe2ab .7s;position:relative}.rotate-leave-active[data-v-6f7fe2ab]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-6f7fe2ab]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.icon[data-v-6f7fe2ab]{width:1.3rem;height:1.3rem}.icon1[data-v-6f7fe2ab]{width:1rem;height:1rem}[data-v-6f7fe2ab] .folderIcon path{fill:var(--app-container_title-color)!important}a[data-v-6f7fe2ab]{color:#1e1e1e;text-decoration:none;cursor:pointer;font-size:14px;display:block}.content .disk_loading_icon[data-v-6f7fe2ab]{height:100px;display:flex;flex-direction:column;align-items:center;padding:10px}.content .disk_loading_icon .disk_loading_info[data-v-6f7fe2ab]{font-size:16px;color:#333;margin-top:12px}.content .line[data-v-6f7fe2ab]{height:1px;background:var(--btn-border-color);margin:0}.content .item[data-v-6f7fe2ab]{display:flex;margin-top:8px;padding:10px}.content .item .icon_box[data-v-6f7fe2ab]{width:1.5rem;height:1.5rem;background:#dbeafe;display:flex;align-items:center;justify-content:center;border-radius:4px}.content .item .icon_box .icon[data-v-6f7fe2ab]{width:.8rem;height:.8rem}.content .item .info[data-v-6f7fe2ab]{flex:1}.content .item .info .name[data-v-6f7fe2ab]{display:flex;justify-content:space-between;align-items:center;margin-left:12px;margin-top:6px}.content .item .info .name>div[data-v-6f7fe2ab]{font-size:14px;color:var(--app-container_title-color)}.content .item .info .name>span[data-v-6f7fe2ab]{display:inline-flex;align-items:center;padding:4px 6px;line-height:1;border:1px solid #d8e3db;background:#f0fdf4;border-radius:4px;color:#008236;font-size:12px;font-weight:400}.content .item .info .name>span .icon[data-v-6f7fe2ab]{width:.7rem;height:.7rem;margin-right:4px}.content .item .info .schedule[data-v-6f7fe2ab]{margin-top:12px}.content .item .info .schedule span[data-v-6f7fe2ab]{font-size:12px;color:#6a7280;font-weight:400}.content .item .info .schedule>div[data-v-6f7fe2ab]{display:flex;justify-content:space-between;align-items:center;margin-top:8px}.btn_settings[data-v-6f7fe2ab]{position:relative;padding:6px 34px 6px 18px;border-radius:4px;border:1px solid var(--btn-border-color);line-height:1;display:flex;align-items:center}.rotation[data-v-6f7fe2ab]{position:absolute;right:2px;top:50%;height:100%;transform:translateY(-50%);border-left:1px solid var(--btn-border-color);display:flex;align-items:center}.rotation .moreIcon[data-v-6f7fe2ab]{transform:rotate(90deg)}@keyframes bganimation-6f7fe2ab{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-6f7fe2ab{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-6f7fe2ab{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-6f7fe2ab]{animation:rotateEnter-6f7fe2ab .7s;position:relative}.rotate-leave-active[data-v-6f7fe2ab]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-6f7fe2ab]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 768px){.content .item[data-v-6f7fe2ab]{margin-top:0}.content .line[data-v-6f7fe2ab]{height:1px;background:#e5e7eb;margin:0 0 10px}}@keyframes bganimation-64cabc6e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-64cabc6e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-64cabc6e{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-64cabc6e]{animation:rotateEnter-64cabc6e .7s;position:relative}.rotate-leave-active[data-v-64cabc6e]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-64cabc6e]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}li.docker-item[data-v-64cabc6e]{width:100%;display:flex;flex-wrap:wrap;margin:1.5rem 0}li.docker-item .docker-item_name[data-v-64cabc6e]{flex:0 0 100%;max-width:50%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;padding-right:10px;color:var(--app-container_title-color)}li.docker-item .docker-item_value[data-v-64cabc6e]{flex:0 0 100%;max-width:50%;padding-left:10px;display:flex;justify-content:flex-end;align-items:center}li.docker-item .docker-item_value .configure[data-v-64cabc6e]{color:#297ff3;overflow:hidden;white-space:nowrap;padding:3px;overflow-x:hidden;text-overflow:ellipsis}li.docker-item .docker-item_value .configure.enabel[data-v-64cabc6e]{color:#888;overflow-x:hidden;text-overflow:ellipsis}li.docker-item .docker-item_root[data-v-64cabc6e]{display:flex;justify-content:space-between;flex-wrap:wrap;margin-top:16px;max-width:323px;flex:0 0 100%}.tooltip-trigger[data-v-64cabc6e]{position:relative;display:inline-block;cursor:help}.tooltip-trigger .tooltip-text[data-v-64cabc6e]{visibility:hidden;position:absolute;padding:.5rem 1rem;background-color:#555;color:#fff;text-align:center;border-radius:6px;z-index:1;opacity:0;transition:opacity .6s}.tooltip-trigger .tooltip-text span[data-v-64cabc6e]{color:#fff}.tooltip-trigger .tooltip-text .docker_dir_tip[data-v-64cabc6e]{min-width:15rem;display:inline-block}.tooltip-trigger:hover .tooltip-text[data-v-64cabc6e]{visibility:visible;opacity:1}.tooltip-top[data-v-64cabc6e]{bottom:100%;left:50%;margin-bottom:5px;transform:translate(-50%);margin-left:12px}.tooltip-right[data-v-64cabc6e]{top:50%;left:100%;margin-left:5px;transform:translateY(-50%)}.tooltip-left[data-v-64cabc6e]{top:50%;right:100%;margin-right:5px;transform:translateY(-50%)}.tooltip-top[data-v-64cabc6e]:after{content:\"\";position:absolute;top:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:#555 transparent transparent transparent}.tooltip-bottom[data-v-64cabc6e]:after{content:\"\";position:absolute;bottom:100%;left:50%;margin-left:-5px;border-width:5px;border-style:solid;border-color:transparent transparent #555 transparent}.input-switch[data-v-64cabc6e]{display:inline-block;cursor:pointer;position:relative}.input-switch span[data-v-64cabc6e]{display:block;position:relative;width:50px;height:20px;border-radius:10px;padding:2px}.input-switch span em[data-v-64cabc6e]{display:block;width:16px;height:16px;background-color:#fff;border-radius:10px}.input-switch span.enable[data-v-64cabc6e]{background-color:#52c41a;transition:.3s}.input-switch span.enable em[data-v-64cabc6e]{transform:translate(30px);transition:.3s}.input-switch span.close[data-v-64cabc6e]{background-color:#cecece;transition:.3s}.input-switch span.close em[data-v-64cabc6e]{transform:translate(0);transition:.3s}.content[data-v-64cabc6e]{color:#333;margin-top:20px;margin-bottom:20px;font-weight:400}.content .status[data-v-64cabc6e]{display:flex;justify-content:space-between;padding-bottom:20px;border-bottom:1px solid #e8e8e8;margin:0 6px}.content .docker_box[data-v-64cabc6e]{display:flex;align-items:center;justify-content:space-between;margin:20px 6px}.content .docker_box .title[data-v-64cabc6e]{margin-bottom:20px}.content .docker_box .path[data-v-64cabc6e]{flex:1;border:1px solid #e0e1e1;background:#f9fafb;border-radius:4px;padding:8px 10px}.content .docker_num[data-v-64cabc6e]{display:flex}.content .docker_num .num_item[data-v-64cabc6e]{flex:1;display:flex;justify-content:center;align-items:center;flex-direction:column;color:var(--app-container_title-color)}.content .docker_num .num_item>span[data-v-64cabc6e]{font-size:20px;margin-top:6px}.docker_tip svg[data-v-64cabc6e]{vertical-align:bottom;margin-left:14px;width:1.5em;height:1.5em}.status-icon[data-v-64cabc6e]{display:inline-block;margin-left:10px;font-size:12px;color:#008236;padding:4px 6px;background:#dbfce7;border-radius:6px}@keyframes bganimation-a5cf4814{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-a5cf4814{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-a5cf4814{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-a5cf4814]{animation:rotateEnter-a5cf4814 .7s;position:relative}.rotate-leave-active[data-v-a5cf4814]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-a5cf4814]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action[data-v-a5cf4814]{width:860px;max-height:90%;background-color:#fff;position:relative;z-index:1000;margin:auto;overflow:auto;padding:1rem 87px;border-radius:6px}.action h2.title[data-v-a5cf4814]{width:100%;display:block;color:#1e1e1e;font-size:22px;padding:0;margin:0;text-align:center}.action .roots[data-v-a5cf4814]{display:flex;max-width:342px;align-items:center;margin-top:32px;margin-bottom:16px}.action .roots .root[data-v-a5cf4814]{color:#000000d4;font-size:14px;text-align:center}.action .move[data-v-a5cf4814]{display:flex;justify-content:left;align-items:center}.action .change[data-v-a5cf4814]{width:678px}.action .desc[data-v-a5cf4814]{width:100%;display:block;font-size:1.2em;padding:0;margin:1rem 0;margin-top:32px;font-size:14px;font-family:PingFangSC-Medium,PingFang SC;color:#000000d4}.action form[data-v-a5cf4814]{width:100%;display:block}.action .tips[data-v-a5cf4814]{width:477px}.action .tips .tip[data-v-a5cf4814]{color:#faad14;padding-left:6px}.action .btns[data-v-a5cf4814]{width:100%;margin:104px auto 0}.action .btns button[data-v-a5cf4814]{display:block;width:100%!important;margin-left:0;margin-right:0}.action .roots_tit[data-v-a5cf4814]{color:#000000d4;font-size:14px;font-weight:700;width:118px;text-align:right;flex:none}.action .successed[data-v-a5cf4814]{text-align:center;font-size:14px}.action .finished[data-v-a5cf4814]{display:flex;justify-content:center;margin:80px 80px 28px}.action .docker_moves[data-v-a5cf4814]{text-align:center}.action .docker_moves .moves[data-v-a5cf4814]{margin-top:10px}.action .docker_moves .moves input[data-v-a5cf4814]{cursor:pointer}.action .docker_moves .moves label[data-v-a5cf4814]{margin-left:10px;cursor:pointer}.select-editable[data-v-a5cf4814]{position:relative;border:solid grey 1px;width:438px;height:34px}.select-editable select[data-v-a5cf4814]{position:absolute;top:0;left:0;font-size:14px;border:none;width:100%;height:100%;margin:0}.select-editable input[data-v-a5cf4814]{position:absolute;top:0;left:0;width:95%;padding:1px;font-size:14px;border:none}.select-editable select[data-v-a5cf4814]:focus,.select-editable input[data-v-a5cf4814]:focus{outline:none}[data-v-a5cf4814]::placeholder{color:#999}@keyframes bganimation-a5cf4814{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-a5cf4814{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-a5cf4814{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-a5cf4814]{animation:rotateEnter-a5cf4814 .7s;position:relative}.rotate-leave-active[data-v-a5cf4814]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-a5cf4814]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 800px){.action[data-v-a5cf4814]{width:100%}.docker_download[data-v-a5cf4814]{width:80%}}@keyframes bganimation-78ae3db3{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-78ae3db3{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-78ae3db3{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-78ae3db3]{animation:rotateEnter-78ae3db3 .7s;position:relative}.rotate-leave-active[data-v-78ae3db3]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-78ae3db3]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.icon[data-v-78ae3db3]{width:1.3rem;height:1.3rem}.icon1[data-v-78ae3db3]{width:1rem;height:1rem}[data-v-78ae3db3] .dockerIcon path{fill:var(--app-container_title-color)!important}a[data-v-78ae3db3]{color:#1e1e1e;text-decoration:none;cursor:pointer;font-size:14px;display:block}.content[data-v-78ae3db3]{color:#333;margin-top:10px;margin-bottom:10px;font-weight:400}.btn_settings[data-v-78ae3db3]{position:relative;padding:6px 34px 6px 18px;border-radius:4px;border:1px solid var(--btn-border-color);line-height:1;display:flex;align-items:center}.rotation[data-v-78ae3db3]{position:absolute;right:2px;top:50%;height:100%;transform:translateY(-50%);border-left:1px solid var(--btn-border-color);display:flex;align-items:center}.rotation .moreIcon[data-v-78ae3db3]{transform:rotate(90deg)}@keyframes bganimation-78ae3db3{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-78ae3db3{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-78ae3db3{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-78ae3db3]{animation:rotateEnter-78ae3db3 .7s;position:relative}.rotate-leave-active[data-v-78ae3db3]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-78ae3db3]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 768px){.content[data-v-78ae3db3]{margin:10px 0}}.pie-chart-wrapper[data-v-1b4ddc16]{position:relative;display:flex;align-items:center;justify-content:center}.chart-dom[data-v-1b4ddc16]{width:100%;height:100%}.center-content[data-v-1b4ddc16]{position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);text-align:center;z-index:2;pointer-events:none}.center-icon[data-v-1b4ddc16]{width:20px;height:20px;margin-bottom:4px;display:block;margin-left:auto;margin-right:auto}.center-label[data-v-1b4ddc16]{margin-top:4px;font-size:14px;font-weight:600}@keyframes bganimation-e005287c{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-e005287c{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-e005287c{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-e005287c]{animation:rotateEnter-e005287c .7s;position:relative}.rotate-leave-active[data-v-e005287c]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-e005287c]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.icon[data-v-e005287c]{width:1.3rem;height:1.3rem}.icon1[data-v-e005287c]{width:2rem;height:2rem;margin-bottom:8px}.icon2[data-v-e005287c]{width:1rem;height:1rem}[data-v-e005287c] .computerIcon path{fill:var(--app-container_title-color)!important}a[data-v-e005287c]{color:#1e1e1e;text-decoration:none;cursor:pointer;font-size:14px;display:block}.content[data-v-e005287c]{color:#333;margin-top:20px;margin-bottom:20px;padding:0 10px;font-weight:400}.content .chart_box[data-v-e005287c]{padding-bottom:20px;border-bottom:1px solid var(--btn-border-color);margin-bottom:20px;display:flex}.content .chart_box .chart[data-v-e005287c]{flex:1;display:flex;flex-direction:column;align-items:center;color:var(--app-container_title-color)}.content .chart_box .chart>div[data-v-e005287c]{margin-top:4px}.content .info[data-v-e005287c]{display:grid;grid-template-columns:repeat(2,1fr);gap:16px}.content .info .item[data-v-e005287c]{display:flex;justify-content:center}.content .info .item>div[data-v-e005287c]{color:var(--app-container_title-color)}.content .info .item>span[data-v-e005287c]{color:var(--app-container_status-label_block);font-size:16px;line-height:1}.content .info .item1[data-v-e005287c]{display:flex;flex-direction:column;justify-content:center;align-items:center;margin-top:20px;padding:30px}.content .info .item1>div[data-v-e005287c]{display:flex;align-items:center;margin-bottom:8px}.content .info .item1>div>span[data-v-e005287c]{margin-left:8px}.content .info .bgcolor1[data-v-e005287c]{background:#e9f2ff;border-radius:10px;border:1px solid #bedbff;color:#155dfc}.content .info .bgcolor2[data-v-e005287c]{background:#ebfdf1;border-radius:10px;border:1px solid #b9f8cf;color:#008236}.btn_settings[data-v-e005287c]{position:relative;padding:6px 18px;border-radius:4px;border:1px solid var(--btn-border-color);line-height:1;display:flex;align-items:center}@keyframes bganimation-e005287c{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-e005287c{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-e005287c{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-e005287c]{animation:rotateEnter-e005287c .7s;position:relative}.rotate-leave-active[data-v-e005287c]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-e005287c]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 768px){.content[data-v-e005287c]{margin-top:10px;margin-bottom:10px;padding:0 4px}.content .chart_box[data-v-e005287c]{padding-bottom:10px;margin-bottom:10px;flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;scrollbar-width:none}.content .chart_box[data-v-e005287c]::-webkit-scrollbar{display:none}.content .info[data-v-e005287c]{grid-template-columns:repeat(1,1fr);gap:6px}.content .info .item1[data-v-e005287c]{margin-top:6px;padding:10px}.content .info .bgcolor1[data-v-e005287c]{background:#e9f2ff;border-radius:10px;border:1px solid #bedbff;color:#155dfc}.content .info .bgcolor2[data-v-e005287c]{background:#ebfdf1;border-radius:10px;border:1px solid #b9f8cf;color:#008236}}@keyframes bganimation{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active{animation:rotateEnter .7s;position:relative}.rotate-leave-active{opacity:0;display:none;position:relative;z-index:-999}.app-container{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.modal-overlay{position:fixed;inset:0;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:999;backdrop-filter:blur(2px)}.modal-container{background-color:#fff;border-radius:8px;box-shadow:0 4px 20px #00000026;width:90%;max-width:var(--3fcd09c7);max-height:90vh;display:flex;flex-direction:column;overflow:hidden}.modal-container .modal-header{padding:8px 12px;border-bottom:1px solid #f0f0f0;display:flex;justify-content:space-between;align-items:center}.modal-container .modal-header .modal-title{margin:0;font-size:18px;color:#333;padding:0;text-align:center;background:transparent!important}.modal-container .modal-header .modal-close{background:none;border:none;font-size:24px;cursor:pointer;color:#999;transition:color .2s}.modal-container .modal-header .modal-close:hover{color:#666}.modal-container .modal-content{padding:18px;overflow-y:auto;flex:1}.modal-container .modal-footer{padding:8px 12px;border-top:1px solid #f0f0f0;display:flex;justify-content:flex-end;gap:12px}.modal-container .modal-footer .modal-button{padding:4px 16px;border-radius:4px;font-size:14px;cursor:pointer;transition:all .2s;border:1px solid transparent}.modal-container .modal-footer .modal-button.cancel{background-color:#fff;border-color:#ddd;color:#666}.modal-container .modal-footer .modal-button.cancel:hover{background-color:#f5f5f5}.modal-container .modal-footer .modal-button.confirm{background-color:#553afe;color:#fff}.modal-container .modal-footer .modal-button.confirm:hover{background-color:#3f21fe}@media (max-width: 768px){.modal-container{width:95%;max-width:none;max-height:90vh;margin:0 10px}.modal-container .modal-header{padding:12px 16px}.modal-container .modal-header .modal-title{font-size:16px;background:transparent!important}.modal-container .modal-header .modal-close{font-size:20px}.modal-container .modal-content{padding:16px}.modal-container .modal-footer{padding:12px 16px;flex-direction:column-reverse;gap:8px}.modal-container .modal-footer .modal-button{width:100%;padding:10px;font-size:15px}}.fade-enter-active,.fade-leave-active{transition:opacity .3s ease}.fade-enter-from,.fade-leave-to{opacity:0}.slide-enter-active,.slide-leave-active{transition:transform .3s ease,opacity .3s ease}.slide-enter-from,.slide-leave-to{transform:translateY(-20px);opacity:0}@keyframes bganimation-ca434918{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-ca434918{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-ca434918{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-ca434918]{animation:rotateEnter-ca434918 .7s;position:relative}.rotate-leave-active[data-v-ca434918]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-ca434918]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.switch[data-v-ca434918]{display:inline-flex;align-items:center;position:relative;font-size:14px;height:20px}.switch.is-disabled[data-v-ca434918]{opacity:.6;cursor:not-allowed}.switch.is-disabled .switch__core[data-v-ca434918]{cursor:not-allowed}.switch__input[data-v-ca434918]{position:absolute;width:0;height:0;opacity:0;margin:0;z-index:-1}.switch__core[data-v-ca434918]{margin:0;display:inline-block;position:relative;width:40px;height:20px;border:1px solid;outline:none;border-radius:10px;box-sizing:border-box;cursor:pointer;transition:border-color .3s,background-color .3s}.switch__button[data-v-ca434918]{position:absolute;top:1px;left:1px;border-radius:100%;transition:all .3s;width:16px;height:16px;background-color:#fff;box-shadow:0 1px 2px #0003}.switch.is-checked .switch__button[data-v-ca434918]{transform:translate(20px)}@keyframes bganimation-79624e8f{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-79624e8f{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-79624e8f{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-79624e8f]{animation:rotateEnter-79624e8f .7s;position:relative}.rotate-leave-active[data-v-79624e8f]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-79624e8f]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}[data-v-79624e8f] .modal-header{border-bottom:none;padding-bottom:0}[data-v-79624e8f] .modal-header .modal-title{text-align:left;padding-left:6px}[data-v-79624e8f] .modal-content{padding-top:0}[data-v-79624e8f]:depp(.modal-footer){border-top:none!important}.module-settings[data-v-79624e8f]{margin-top:16px;display:flex;flex-direction:column;gap:16px;color:#1d2129}.module-settings .module-settings__header[data-v-79624e8f]{padding:8px 12px;background:linear-gradient(to right,#eff6ff,#f4f6ff,#f7f5ff,#faf6ff);background:-webkit-linear-gradient(left,#eff6ff,#f4f6ff,#f7f5ff,#faf6ff);border-radius:10px}.module-settings .module-settings__badge[data-v-79624e8f]{width:36px;height:36px;border-radius:50%;background:linear-gradient(135deg,#5677ff 0%,#9c56ff 100%);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:18px}.module-settings .module-settings__toggle-all[data-v-79624e8f]{border-radius:8px}.module-settings__header[data-v-79624e8f]{display:flex;justify-content:space-between;align-items:center;gap:12px}.module-settings__summary[data-v-79624e8f]{display:flex;align-items:center;gap:12px}.module-settings__badge[data-v-79624e8f]{width:36px;height:36px;border-radius:12px;background:linear-gradient(135deg,#5c3efe 0%,#7a62ff 100%);color:#fff;display:flex;align-items:center;justify-content:center;font-weight:600;font-size:18px}.module-settings__texts[data-v-79624e8f]{display:flex;flex-direction:column;gap:4px}.module-settings__title[data-v-79624e8f]{font-size:16px;font-weight:600}.module-settings__sub[data-v-79624e8f]{font-size:13px;color:#86909c}.module-settings__toggle-all[data-v-79624e8f]{min-width:96px;height:34px;padding:0 16px;border-radius:17px;border:1px solid #e5e6eb;background:#fff;color:#1d2129;cursor:pointer;font-size:14px;transition:all .2s;display:inline-block;line-height:34px;box-sizing:border-box;-webkit-appearance:none;appearance:none;vertical-align:middle}.module-settings__toggle-all[data-v-79624e8f]:hover{border-color:#553afe;color:#553afe}.module-settings__list[data-v-79624e8f]{display:flex;flex-direction:column;gap:16px;max-height:420px;overflow-y:auto;padding-right:8px}.module-settings__item[data-v-79624e8f]{display:flex;align-items:center;justify-content:space-between;padding:16px 10px;border-radius:8px;background:transparent;border:1px solid #e5e7eb;gap:24px;transition:background-color .2s ease,border-color .2s ease}.module-settings__item[data-v-79624e8f]:hover{border-color:#8fc6ff;background:#fafcfe}.module-settings__item--disabled[data-v-79624e8f]{opacity:.5;cursor:not-allowed}.module-settings__info[data-v-79624e8f]{display:flex;flex-direction:column;gap:6px}.module-settings__name[data-v-79624e8f]{display:flex;align-items:center;gap:8px;font-weight:600;font-size:15px}.module-settings__dot[data-v-79624e8f]{width:10px;height:10px;border-radius:50%;background-color:#c9ccd3;transition:background-color .2s}.module-settings__dot.is-active[data-v-79624e8f]{background:#553afe}.module-settings__desc[data-v-79624e8f]{font-size:13px;color:#86909c;line-height:1.4;margin:0 0 0 18px}.module-settings__footer[data-v-79624e8f]{width:100%;display:flex;justify-content:flex-end;gap:12px}.module-settings__btn[data-v-79624e8f]{min-width:96px;height:36px;border-radius:8px;border:1px solid transparent;font-size:14px;cursor:pointer;transition:all .3s ease}.module-settings__btn--secondary[data-v-79624e8f]{background:#fff;border-color:#e5e6eb;color:#1d2129}.module-settings__btn--secondary[data-v-79624e8f]:hover{border-color:#553afe;color:#553afe}.module-settings__btn--primary[data-v-79624e8f]{background:linear-gradient(135deg,#5c3efe 0%,#7a62ff 100%);color:#fff;border:none}.module-settings__btn--primary[data-v-79624e8f]:hover{opacity:.8}@media (max-width: 768px){.module-settings__header[data-v-79624e8f]{flex-direction:row;align-items:center}.module-settings__toggle-all[data-v-79624e8f]{width:auto;height:34px;line-height:34px;font-size:14px;padding:0 14px}.module-settings__item[data-v-79624e8f]{flex-direction:row;align-items:center;padding:14px 10px}.module-settings__badge[data-v-79624e8f]{font-size:16px}.module-settings__title[data-v-79624e8f]{font-size:15px}.module-settings__sub[data-v-79624e8f]{font-size:12px}.module-settings__name[data-v-79624e8f]{font-size:14px}.module-settings__desc[data-v-79624e8f]{font-size:12px;margin-left:18px}.module-settings__list[data-v-79624e8f]{max-height:65vh;padding-right:8px}.module-settings__footer[data-v-79624e8f]{flex-direction:column-reverse;align-items:stretch;gap:8px}.module-settings__btn[data-v-79624e8f]{width:100%;height:36px;font-size:14px}}@keyframes bganimation-1f2aa331{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-1f2aa331{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-1f2aa331{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-1f2aa331]{animation:rotateEnter-1f2aa331 .7s;position:relative}.rotate-leave-active[data-v-1f2aa331]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-1f2aa331]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.page-container .model_btn[data-v-1f2aa331]{cursor:pointer;margin-left:16px}.page-container .card-container[data-v-1f2aa331]{display:flex;flex-wrap:nowrap;overflow-x:auto;gap:16px;width:100%;padding-bottom:10px;overflow-y:hidden;-webkit-overflow-scrolling:touch;scrollbar-gutter:stable;scrollbar-width:thin;scrollbar-color:rgba(0,0,0,.35) transparent}.page-container .card-container[data-v-1f2aa331]::-webkit-scrollbar{height:6px}.page-container .card-container[data-v-1f2aa331]::-webkit-scrollbar-thumb{background:#ccc;border-radius:3px}.page-container .card-container>*[data-v-1f2aa331]{flex:0 0 auto}.page-container[data-v-1f2aa331] .card-container::-webkit-scrollbar{height:8px}.page-container[data-v-1f2aa331] .card-container::-webkit-scrollbar-thumb{border-radius:4px;background:rgba(0,0,0,.35)}.page-container[data-v-1f2aa331] .card-container::-webkit-scrollbar-track{background:transparent}.page-container .network-container[data-v-1f2aa331]{display:flex;gap:24px;width:100%;margin-top:20px;align-items:stretch}.page-container .network-container .left-box[data-v-1f2aa331]{flex:2;min-width:0}.page-container .network-container .right-box[data-v-1f2aa331]{flex:1;overflow:hidden;min-width:0;display:flex;flex-direction:column;justify-content:space-between}.page-container .network-stack[data-v-1f2aa331]{display:flex;flex-direction:column;width:100%;align-items:stretch}.page-container .network-stack .stack-item[data-v-1f2aa331]{width:100%}.page-container .full-row[data-v-1f2aa331] .network_container{min-height:600px}.page-container .fill-card[data-v-1f2aa331]{height:100%;display:flex;flex-direction:column}.page-container .fill-card[data-v-1f2aa331] .reusable-card{flex:1 1 auto;display:flex;flex-direction:column}.page-container .fill-card[data-v-1f2aa331] .card-body{flex:1 1 auto}.page-container .align-c[data-v-1f2aa331]{align-items:center}.page-container .other-container[data-v-1f2aa331]{width:100%;margin-top:20px}.page-container .other-container .grid-container[data-v-1f2aa331]{display:flex;flex-wrap:wrap;gap:24px}.page-container .other-container .grid-container .grid-item[data-v-1f2aa331]{display:flex;justify-content:center;border-radius:8px}.page-container .btns[data-v-1f2aa331]{margin-top:20px}.page-container .system[data-v-1f2aa331]{margin-top:24px}@keyframes bganimation-1f2aa331{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-1f2aa331{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-1f2aa331{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-1f2aa331]{animation:rotateEnter-1f2aa331 .7s;position:relative}.rotate-leave-active[data-v-1f2aa331]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-1f2aa331]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 1300px){.page-container .other-container[data-v-1f2aa331]{width:100%;margin-top:16px}.page-container .other-container .grid-container[data-v-1f2aa331]{flex-direction:column;gap:12px}.page-container .other-container .grid-container .grid-item[data-v-1f2aa331]{border-radius:6px}}@keyframes bganimation-1f2aa331{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-1f2aa331{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-1f2aa331{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-1f2aa331]{animation:rotateEnter-1f2aa331 .7s;position:relative}.rotate-leave-active[data-v-1f2aa331]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-1f2aa331]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 768px){.page-container .card-container[data-v-1f2aa331]{flex-wrap:nowrap;overflow-x:auto;-webkit-overflow-scrolling:touch;gap:16px;scrollbar-width:none;-ms-overflow-style:none}.page-container .card-container>*[data-v-1f2aa331]{flex:0 0 auto;min-width:280px}.page-container .card-container[data-v-1f2aa331]::-webkit-scrollbar{display:none}.page-container .network-container[data-v-1f2aa331]{flex-direction:column;margin-top:10px;gap:10px}.page-container .network-container .right-box[data-v-1f2aa331]{flex:none;width:100%}.page-container .other-container[data-v-1f2aa331]{width:100%;margin-top:16px}.page-container .other-container .grid-container[data-v-1f2aa331]{flex-direction:column;gap:12px}.page-container .other-container .grid-container .grid-item[data-v-1f2aa331]{border-radius:6px}}@keyframes bganimation-52c03678{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-52c03678{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-52c03678{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-52c03678]{animation:rotateEnter-52c03678 .7s;position:relative}.rotate-leave-active[data-v-52c03678]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-52c03678]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}#page[data-v-52c03678]{width:100%;padding:1rem;margin:0 auto;display:flex;flex-wrap:wrap;justify-content:flex-start;align-items:center;align-content:center;max-width:800px;height:100vh;overflow:overlay}#page .title[data-v-52c03678]{width:100%;display:block;text-align:center;font-size:32px;font-family:PingFangSC-Semibold,PingFang SC;font-weight:600;color:#000c;line-height:45px}#page .desc[data-v-52c03678]{width:100%;display:block;font-size:24px;font-family:PingFangSC-Semibold,PingFang SC;font-weight:600;color:#0009;line-height:33px;text-align:center;margin-top:10px}#page div.info[data-v-52c03678]{width:100%;display:block;font-size:1.6em;font-size:16px;margin-left:34px}#page .network-containers[data-v-52c03678]{width:100%;display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center;margin:3rem 0 1rem}#page .network-containers .network-container_item[data-v-52c03678]{flex:0 0 100%;position:relative;border-radius:4px;padding:10px;cursor:pointer;max-width:240px;width:240px;height:308px}#page .network-containers .network-container_item a[data-v-52c03678]{position:relative;display:block;width:100%}#page .network-containers .network-container_item a .cover[data-v-52c03678]{position:relative;padding-top:130%;z-index:1}#page .network-containers .network-container_item a .cover .thumbnail[data-v-52c03678]{position:absolute;top:0;left:0;width:100%;height:100%;object-fit:contain;border-radius:8px;overflow:hidden;z-index:1;display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center;background-color:#2dc8fd}#page .network-containers .network-container_item a .cover .thumbnail i[data-v-52c03678]{display:block;font-size:100px;color:#eee}#page .network-containers .network-container_item a .cover .thumbnail span[data-v-52c03678]{display:block;text-align:center;width:100%;color:#eeee;font-size:2em;line-height:1.5;font-size:22px;font-family:PingFangSC-Semibold,PingFang SC;color:#fff;line-height:40px}#page .network-containers .network-container_item:nth-child(9n+1) a .cover .thumbnail[data-v-52c03678]{background:linear-gradient(138deg,#FF6E6B 0%,#FF6966 100%)}#page .network-containers .network-container_item:nth-child(9n+2) a .cover .thumbnail[data-v-52c03678]{background:linear-gradient(145deg,#37D5A9 0%,#42D8B0 100%)}#page .network-containers .network-container_item:nth-child(9n+3) a .cover .thumbnail[data-v-52c03678]{background:linear-gradient(145deg,#549AFF 0%,#2C82FF 100%)}#page .network-containers .network-container_item:nth-child(9n+4) a .cover .thumbnail[data-v-52c03678]{background-color:#9b58de}#page .network-containers .network-container_item:nth-child(9n+5) a .cover .thumbnail[data-v-52c03678]{background-color:#297ff3}#page .network-containers .network-container_item:nth-child(9n+6) a .cover .thumbnail[data-v-52c03678]{background-color:#27aa8f}#page .network-containers .network-container_item:nth-child(9n+7) a .cover .thumbnail[data-v-52c03678]{background-color:#f15a4a}#page .network-containers .network-container_item:nth-child(9n+8) a .cover .thumbnail[data-v-52c03678]{background-color:#439c07}@keyframes bganimation-52c03678{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-52c03678{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-52c03678{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-52c03678]{animation:rotateEnter-52c03678 .7s;position:relative}.rotate-leave-active[data-v-52c03678]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-52c03678]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@keyframes bganimation-e187efe4{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-e187efe4{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-e187efe4{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-e187efe4]{animation:rotateEnter-e187efe4 .7s;position:relative}.rotate-leave-active[data-v-e187efe4]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-e187efe4]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}#page[data-v-e187efe4]{width:100%;padding:1rem;margin:100px auto 0;display:flex;flex-wrap:wrap;justify-content:flex-start;max-width:600px}#page h2.title[data-v-e187efe4]{width:100%;display:block;color:#1e1e1e;font-size:3em;padding:0;margin:0 0 10px;text-align:left;background-color:#f4f5f7;box-shadow:none}#page h3.desc[data-v-e187efe4]{width:100%;display:block;color:#666;font-size:1.2em;padding:0;margin:0;text-align:left;background-color:#f4f5f7;box-shadow:none}#page .network-message[data-v-e187efe4]{margin:.5rem 0}#page .network-message li[data-v-e187efe4]{margin:.5rem 0;font-size:20px;color:#000;font-weight:550}#page .network-message li span[data-v-e187efe4]{color:red}#page .network-message li a[data-v-e187efe4]{color:#00f}#page form[data-v-e187efe4]{display:block;width:100%;margin:3rem 0}#page form label[data-v-e187efe4]{display:block;width:100%;margin:1rem 0}#page form label .label-key[data-v-e187efe4]{display:block;width:100%;font-size:1.3em;margin-bottom:.5rem}#page form label .label-key span[data-v-e187efe4]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#page form label .label-key span[data-v-e187efe4]:before{content:\"*\";color:#f56c6c;margin-right:4px}#page form label input[data-v-e187efe4]{width:100%;display:block;height:42px}#page .chose_dhcp[data-v-e187efe4]{height:1em;font-size:1.3em}#page .chose_dhcp .dhcp_info[data-v-e187efe4]{margin-left:10px;user-select:none}#page .msg[data-v-e187efe4]{width:100%;display:block;height:36px;line-height:36px;color:red;font-size:1.3em}#page .btns[data-v-e187efe4]{width:100%;margin-top:3rem}#page .btns button[data-v-e187efe4]{display:block;width:100%!important;margin:.5rem 0}@keyframes bganimation-5eefd6ee{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-5eefd6ee{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-5eefd6ee{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-5eefd6ee]{animation:rotateEnter-5eefd6ee .7s;position:relative}.rotate-leave-active[data-v-5eefd6ee]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-5eefd6ee]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}#page[data-v-5eefd6ee]{width:100%;padding:1rem;margin:100px auto 0;display:flex;flex-wrap:wrap;justify-content:flex-start;max-width:600px}#page h2.title[data-v-5eefd6ee]{width:100%;display:block;color:#1e1e1e;font-size:3em;padding:0;margin:0 0 10px;text-align:left;background-color:#f4f5f7;box-shadow:none}#page h3.desc[data-v-5eefd6ee]{width:100%;display:block;color:#666;font-size:1.2em;padding:0;margin:0;text-align:left;background-color:#f4f5f7;box-shadow:none}#page .network-message[data-v-5eefd6ee]{margin:.5rem 0}#page .network-message li[data-v-5eefd6ee]{margin:.5rem 0;font-size:20px;color:#000;font-weight:550}#page .network-message li span[data-v-5eefd6ee]{color:red}#page .network-message li a[data-v-5eefd6ee]{color:#00f}#page form[data-v-5eefd6ee]{display:block;width:100%;margin:3rem 0}#page form label[data-v-5eefd6ee]{display:block;width:100%;margin:1rem 0}#page form label .label-key[data-v-5eefd6ee]{display:block;width:100%;font-size:1.3em;margin-bottom:.5rem}#page form label .label-key span[data-v-5eefd6ee]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#page form label .label-key span[data-v-5eefd6ee]:before{content:\"*\";color:#f56c6c;margin-right:4px}#page form label input[data-v-5eefd6ee],#page form label select[data-v-5eefd6ee]{width:100%;display:block;height:42px}#page .chose_dhcp[data-v-5eefd6ee]{height:1em;font-size:1.3em}#page .chose_dhcp .dhcp_info[data-v-5eefd6ee]{margin-left:10px;user-select:none}#page .msgs[data-v-5eefd6ee]{width:100%;display:block;height:36px;line-height:36px;color:red;font-size:1.3em}#page p.msg[data-v-5eefd6ee]{width:100%;display:block;color:red;font-size:1em}#page .btns[data-v-5eefd6ee]{width:100%;margin-top:3rem}#page .btns button[data-v-5eefd6ee]{display:block;width:100%!important;margin:.5rem 0}@keyframes bganimation-3d6d1dea{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-3d6d1dea{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-3d6d1dea{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-3d6d1dea]{animation:rotateEnter-3d6d1dea .7s;position:relative}.rotate-leave-active[data-v-3d6d1dea]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-3d6d1dea]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}#page[data-v-3d6d1dea]{width:100%;padding:1rem;margin:100px auto 0;display:flex;flex-wrap:wrap;justify-content:flex-start;max-width:600px}#page h2.title[data-v-3d6d1dea]{width:100%;display:block;color:#1e1e1e;font-size:3em;padding:0;margin:0 0 10px;text-align:left;background-color:#f4f5f7;box-shadow:none}#page h3.desc[data-v-3d6d1dea]{width:100%;display:block;color:#666;font-size:1.2em;padding:0;text-align:left;background-color:#f4f5f7;box-shadow:none}#page code[data-v-3d6d1dea]{background-color:#eee;display:block;width:100%;font-size:1.3em;padding:1rem;line-height:2;margin:2rem 0}#page div.info[data-v-3d6d1dea]{width:100%;display:block;margin:1rem 0;font-size:1.3em;text-align:left}#page .msgs[data-v-3d6d1dea]{width:100%;display:block;height:36px;line-height:36px;color:red;font-size:1.3em}#page p.msg[data-v-3d6d1dea]{width:100%;display:block;color:red;font-size:1em}#page .btns[data-v-3d6d1dea]{width:100%;display:block;margin-top:3rem}#page .btns button[data-v-3d6d1dea]{display:block;width:100%!important;margin:.5rem 0}#page form[data-v-3d6d1dea]{display:block;width:100%;margin:3rem 0}#page form label[data-v-3d6d1dea]{display:block;width:100%;margin:1rem 0}#page form label .label-key[data-v-3d6d1dea]{display:block;width:100%;font-size:1.3em;margin-bottom:.5rem}#page form label .label-key span[data-v-3d6d1dea]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}#page form label .label-key span[data-v-3d6d1dea]:before{content:\"*\";color:#f56c6c;margin-right:4px}#page form label input[data-v-3d6d1dea],#page form label select[data-v-3d6d1dea]{width:100%;display:block;height:42px}.switch_inline[data-v-3d6d1dea]{height:1em;font-size:1.3em}.switch_inline .switch_info[data-v-3d6d1dea]{margin-left:10px;user-select:none}@keyframes bganimation-7cf2dd18{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-7cf2dd18{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-7cf2dd18{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-7cf2dd18]{animation:rotateEnter-7cf2dd18 .7s;position:relative}.rotate-leave-active[data-v-7cf2dd18]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-7cf2dd18]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}p[data-v-7cf2dd18]{line-height:22px;font-size:14px}.label-item[data-v-7cf2dd18]{width:100%;margin:10px 0}.label-item .label-item_key[data-v-7cf2dd18]{width:100%;font-size:14px;color:#999;margin-bottom:6px}.label-item .label-item_key span[data-v-7cf2dd18]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.label-item .label-item_key span[data-v-7cf2dd18]:before{content:\"*\";color:#f56c6c;margin-right:4px}.label-item .label-item_value[data-v-7cf2dd18]{width:100%;margin:10px 0}.label-item .label-item_value select[data-v-7cf2dd18],.label-item .label-item_value input[data-v-7cf2dd18]{width:100%;height:36px;line-height:36px;color:#000}.label-item .label-item_value input[data-v-7cf2dd18]::placeholder{color:#999;font-size:12PX}.label-item .label-item_value label[data-v-7cf2dd18]{width:100%;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;margin:.5rem;border-bottom:1px solid #eee;padding-bottom:10px;font-size:14px;color:#666}.label-item .label-item_value label input[type=checkbox][data-v-7cf2dd18]{top:0}.label-item .label-item_tips[data-v-7cf2dd18]{margin-top:10px;color:#666;font-size:14px}.label-item .label-item_tips svg[data-v-7cf2dd18]{vertical-align:top}span.msg-warning[data-v-7cf2dd18]{width:100%;text-align:left;font-size:14px;color:red;display:block;margin:10px 0}.label-message[data-v-7cf2dd18]{width:100%;text-align:left;font-size:14px;color:red;text-align:center}.actioner-container_body.setup-loading[data-v-7cf2dd18]{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;align-content:center;text-align:center}.actioner-container_body.setup-loading span[data-v-7cf2dd18]{width:100%;display:block;font-size:1.2em;margin-top:1rem;color:#666}.actioner-container_body.setup-error[data-v-7cf2dd18]{display:flex;flex-wrap:wrap;align-items:center;justify-content:center;align-content:center;text-align:center}.actioner-container_body.setup-error svg.icon[data-v-7cf2dd18]{width:100px;height:100px}.actioner-container_body.setup-error span[data-v-7cf2dd18]{width:100%;display:block;font-size:1.4em;color:#ff6b6b}.actioner-container_body.setup-success[data-v-7cf2dd18]{display:flex;flex-wrap:wrap;align-items:center;align-content:center;justify-content:center}.actioner-container_body.setup-success svg.icon[data-v-7cf2dd18]{width:100px;height:100px}.actioner-container_body.setup-success .body-title[data-v-7cf2dd18]{width:100%;display:block;color:#1e1e1e;font-size:2em;padding:0;margin:1rem 0;text-align:center}.actioner-container_body.setup-success .body-tips[data-v-7cf2dd18]{text-align:center}.actioner-container_body.setup-success .body-info[data-v-7cf2dd18]{color:#666;font-size:1.3em;margin:1rem 0;width:100%;text-align:center}.actioner-container_body.setup-success .body-info span[data-v-7cf2dd18]{display:block}.actioner-container_body.setup-success .body-tips[data-v-7cf2dd18]{margin:1rem 0;display:block;width:100%}.actioner-container_body.setup-success .body-btns[data-v-7cf2dd18]{width:100%;margin-top:3rem}.actioner-container_body.setup-success .body-btns button[data-v-7cf2dd18]{display:block;width:100%!important;margin:.5rem 0}@keyframes bganimation-0ef06e27{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-0ef06e27{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-0ef06e27{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-0ef06e27]{animation:rotateEnter-0ef06e27 .7s;position:relative}.rotate-leave-active[data-v-0ef06e27]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-0ef06e27]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}textarea[data-v-0ef06e27]{display:block;width:100%;height:100%;border:none;resize:none}@keyframes bganimation-593445fb{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-593445fb{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-593445fb{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-593445fb]{animation:rotateEnter-593445fb .7s;position:relative}.rotate-leave-active[data-v-593445fb]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-593445fb]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.label-item[data-v-593445fb]{width:100%;margin:10px 0}.label-item .label-item_key[data-v-593445fb]{width:100%;font-size:14px;color:#999;margin-bottom:6px}.label-item .label-item_key span[data-v-593445fb]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.label-item .label-item_key span[data-v-593445fb]:before{content:\"*\";color:#f56c6c;margin-right:4px}.label-item .label-item_value[data-v-593445fb]{width:100%}.label-item .label-item_value select[data-v-593445fb]{width:100%;height:36px;line-height:36px;color:#000}.label-item .label-item_value label[data-v-593445fb]{width:100%;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;margin:.5rem;border-bottom:1px solid #eee;padding-bottom:10px;font-size:14px;color:#666}.label-item .label-item_value label input[type=radio][data-v-593445fb]{top:0;margin:0}.label-item .label-item_tips[data-v-593445fb]{margin-top:10px;color:#666;font-size:14px}.label-item .label-item_tips svg[data-v-593445fb]{vertical-align:top}span.msg-warning[data-v-593445fb]{width:100%;text-align:left;font-size:14px;color:red;display:block;margin:10px 0}@keyframes bganimation-77aa4121{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-77aa4121{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-77aa4121{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-77aa4121]{animation:rotateEnter-77aa4121 .7s;position:relative}.rotate-leave-active[data-v-77aa4121]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-77aa4121]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.label-item[data-v-77aa4121]{width:100%;margin:10px 0}.label-item .label-item_key[data-v-77aa4121]{width:100%;font-size:14px;color:#999;margin-bottom:6px}.label-item .label-item_key span[data-v-77aa4121]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.label-item .label-item_key span[data-v-77aa4121]:before{content:\"*\";color:#f56c6c;margin-right:4px}.label-item .label-item_value[data-v-77aa4121]{width:100%}.label-item .label-item_value select[data-v-77aa4121]{width:100%;height:36px;line-height:36px;color:#000}.label-item .label-item_value label[data-v-77aa4121]{width:100%;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;margin:.5rem;border-bottom:1px solid #eee;padding-bottom:10px;font-size:14px;color:#666}.label-item .label-item_value label input[type=radio][data-v-77aa4121]{top:0;margin:0}.label-item .label-item_tips[data-v-77aa4121]{margin-top:10px;color:#666;font-size:14px}.label-item .label-item_tips svg[data-v-77aa4121]{vertical-align:top}span.msg-warning[data-v-77aa4121]{width:100%;text-align:left;font-size:14px;color:red;display:block;margin:10px 0}@keyframes bganimation-a924400c{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-a924400c{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-a924400c{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-a924400c]{animation:rotateEnter-a924400c .7s;position:relative}.rotate-leave-active[data-v-a924400c]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-a924400c]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.label-item[data-v-a924400c]{width:100%;margin:10px 0}.label-item .label-item_key[data-v-a924400c]{width:100%;font-size:14px;color:#999;margin-bottom:6px}.label-item .label-item_key span[data-v-a924400c]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.label-item .label-item_key span[data-v-a924400c]:before{content:\"*\";color:#f56c6c;margin-right:4px}.label-item .label-item_value[data-v-a924400c]{width:100%}.label-item .label-item_value select[data-v-a924400c]{width:100%;height:36px;line-height:36px;color:#000}.label-item .label-item_value label[data-v-a924400c]{width:100%;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;margin:.5rem;border-bottom:1px solid #eee;padding-bottom:10px;font-size:14px;color:#666}.label-item .label-item_value label input[type=radio][data-v-a924400c]{top:0;margin:0}.label-item .label-item_tips[data-v-a924400c]{margin-top:10px;color:#666;font-size:14px}.label-item .label-item_tips svg[data-v-a924400c]{vertical-align:top}span.msg-warning[data-v-a924400c]{width:100%;text-align:left;font-size:14px;color:red;display:block;margin:10px 0}@keyframes bganimation-6ef94d02{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-6ef94d02{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-6ef94d02{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-6ef94d02]{animation:rotateEnter-6ef94d02 .7s;position:relative}.rotate-leave-active[data-v-6ef94d02]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-6ef94d02]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action-main[data-v-6ef94d02]{width:680px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.action-main[data-v-6ef94d02] .actioner-container{width:100%}.action-main[data-v-6ef94d02] .actioner-container .actioner-container_header{width:100%;height:50px;line-height:50px;display:flex;flex-wrap:wrap;align-items:center;font-size:20px;border-bottom:1px solid #eee;justify-content:center;padding:0 10px}.action-main[data-v-6ef94d02] .actioner-container .actioner-container_footer{width:100%;height:50px;border-top:1px solid rgba(0,0,0,.06);display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:0 30px}.action-main[data-v-6ef94d02] .actioner-container .actioner-container_footer button{display:inline-block;width:100px!important;margin:0;margin-left:1rem}.action-main[data-v-6ef94d02] .actioner-container .actioner-container_footer .close{min-width:65px;font-weight:400;line-height:30px;text-align:center;cursor:pointer;height:32px;border-radius:2px;border:1px solid rgba(0,0,0,.15);font-size:14px;font-family:PingFangSC-Regular,PingFang SC;color:#000000d4;line-height:32px}.action-main[data-v-6ef94d02] .actioner-container .actioner-container_footer .next{min-width:65px;line-height:32px;text-align:center;cursor:pointer;font-size:14px;font-family:PingFangSC-Regular,PingFang SC;font-weight:400;color:#fff;margin-left:20px;width:74px;height:32px;background:#553AFE;border-radius:2px}.action-main[data-v-6ef94d02] .actioner-container .actioner-container_footer .next.save{height:32px;background:#553AFE;border-radius:2px;line-height:16px}.action-main[data-v-6ef94d02] .actioner-container .actioner-container_footer .next:hover,.action-main[data-v-6ef94d02] .actioner-container .actioner-container_footer .close:hover{opacity:.9}.action-main[data-v-6ef94d02] .actioner-container .actioner-container_body{padding:20px;width:100%;height:400px}@keyframes bganimation-6ef94d02{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-6ef94d02{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-6ef94d02{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-6ef94d02]{animation:rotateEnter-6ef94d02 .7s;position:relative}.rotate-leave-active[data-v-6ef94d02]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-6ef94d02]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 800px){.action-main[data-v-6ef94d02]{width:90%}}@keyframes bganimation-30707fb2{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-30707fb2{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-30707fb2{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-30707fb2]{animation:rotateEnter-30707fb2 .7s;position:relative}.rotate-leave-active[data-v-30707fb2]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-30707fb2]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.cbi-map-descr[data-v-30707fb2]{margin-bottom:32px}.item-status[data-v-30707fb2]{word-break:break-all;text-overflow:ellipsis;display:-webkit-box;-webkit-box-orient:vertical;-webkit-line-clamp:2;overflow:hidden}.item-status-detail[data-v-30707fb2]{text-decoration:underline;cursor:help}@keyframes bganimation-16dd0913{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-16dd0913{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-16dd0913{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-16dd0913]{animation:rotateEnter-16dd0913 .7s;position:relative}.rotate-leave-active[data-v-16dd0913]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-16dd0913]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}#page .cbi-map-descr[data-v-16dd0913]{margin-bottom:1rem}#page[data-v-16dd0913] .cbi-section{padding:1rem}#page[data-v-16dd0913] span.cbi-page-actions.control-group{width:100%;display:block}@keyframes bganimation-742230ae{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-742230ae{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-742230ae{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-742230ae]{animation:rotateEnter-742230ae .7s;position:relative}.rotate-leave-active[data-v-742230ae]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-742230ae]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.action-main[data-v-742230ae]{width:680px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.action-main[data-v-742230ae] .actioner-container{width:100%}.action-main[data-v-742230ae] .actioner-container .actioner-container_header{width:100%;height:50px;line-height:50px;display:flex;flex-wrap:wrap;align-items:center;font-size:16px;border-bottom:1px solid #eee;justify-content:flex-start;padding:0 1rem;color:#525f7f}.action-main[data-v-742230ae] .actioner-container .actioner-container_footer{width:100%;height:50px;border-top:1px solid rgba(0,0,0,.06);display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:0 30px}.action-main[data-v-742230ae] .actioner-container .actioner-container_footer button{display:inline-block;width:100px!important;margin:0;margin-left:1rem;padding:0;border:none}.action-main[data-v-742230ae] .actioner-container .actioner-container_footer .close{min-width:65px;font-weight:400;line-height:30px;text-align:center;cursor:pointer;height:32px;border-radius:2px;border:1px solid rgba(0,0,0,.15);font-size:14px;font-family:PingFangSC-Regular,PingFang SC;color:#000000d4;line-height:32px}.action-main[data-v-742230ae] .actioner-container .actioner-container_footer .next{min-width:65px;line-height:32px;text-align:center;cursor:pointer;font-size:14px;font-family:PingFangSC-Regular,PingFang SC;font-weight:400;color:#fff;margin-left:20px;width:74px;height:32px;background:#553AFE;border-radius:2px}.action-main[data-v-742230ae] .actioner-container .actioner-container_footer .next.save{height:32px;background:#553AFE;border-radius:2px;line-height:16px}.action-main[data-v-742230ae] .actioner-container .actioner-container_footer .next:hover,.action-main[data-v-742230ae] .actioner-container .actioner-container_footer .close:hover{opacity:.9}.action-main[data-v-742230ae] .actioner-container .actioner-container_body{padding:20px;width:100%;min-height:400px}.action-main[data-v-742230ae] .actioner-container .actioner-container_body label.cbi-value-title{width:150px!important}@keyframes bganimation-742230ae{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-742230ae{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-742230ae{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-742230ae]{animation:rotateEnter-742230ae .7s;position:relative}.rotate-leave-active[data-v-742230ae]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-742230ae]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 800px){.action-main[data-v-742230ae]{width:90%}}@keyframes bganimation-70c3aae0{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-70c3aae0{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-70c3aae0{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-70c3aae0]{animation:rotateEnter-70c3aae0 .7s;position:relative}.rotate-leave-active[data-v-70c3aae0]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-70c3aae0]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}textarea[data-v-70c3aae0]{display:block;width:100%;height:400px;padding:1rem;font-size:14px;resize:none;border:none;background-color:#1e1e1e;color:#fff}@keyframes bganimation-313197ee{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-313197ee{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-313197ee{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-313197ee]{animation:rotateEnter-313197ee .7s;position:relative}.rotate-leave-active[data-v-313197ee]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-313197ee]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}textarea[data-v-313197ee]{display:block;width:100%;height:400px;padding:1rem;font-size:14px;resize:none;border:none;background-color:#1e1e1e;color:#fff}@keyframes bganimation-76197cba{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-76197cba{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-76197cba{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-76197cba]{animation:rotateEnter-76197cba .7s;position:relative}.rotate-leave-active[data-v-76197cba]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-76197cba]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}textarea[data-v-76197cba]{display:block;width:100%;height:500px;padding:1rem;font-size:14px;resize:none;border:1px solid #999;border-radius:3px}@keyframes bganimation-02f10ac5{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-02f10ac5{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-02f10ac5{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-02f10ac5]{animation:rotateEnter-02f10ac5 .7s;position:relative}.rotate-leave-active[data-v-02f10ac5]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-02f10ac5]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.app-container_status-label_bg[data-v-02f10ac5]{flex:0 0 230px;width:230px;height:80px;display:flex;background:var(--app-container_status-label_bg);align-items:center;padding:10px;margin-right:10px;transition:.3s}.app-container_status-label_bg .app-container_status-label_text[data-v-02f10ac5]{margin-left:6px;font-size:14px;line-height:22px;text-align:left}.app-container_status-label_bg .app-container_status-label_text .text_status[data-v-02f10ac5]{color:#999}.app-container_status-label_bg .app-container_status-label_text .text_style[data-v-02f10ac5]{margin:6px 0}.app-container_status-label_bg .app-container_status-label_text .text_style.close[data-v-02f10ac5]{color:#999}.app-container_status-label_bg .app-container_status-label_text .text_info[data-v-02f10ac5]{font-weight:700;font-size:14px}@keyframes bganimation-c88486ac{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-c88486ac{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-c88486ac{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-c88486ac]{animation:rotateEnter-c88486ac .7s;position:relative}.rotate-leave-active[data-v-c88486ac]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-c88486ac]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.actioner-dns[data-v-c88486ac]{width:860px;background-color:#fff;position:relative;z-index:99999;margin:auto;overflow:auto}.actioner-dns .actioner-dns_header[data-v-c88486ac]{width:100%;display:flex;flex-wrap:wrap;align-items:center;padding:1rem;font-size:2em;border-bottom:1px solid #eee}.actioner-dns .actioner-dns_body[data-v-c88486ac]{padding:1rem;min-height:50vh}.actioner-dns .actioner-dns_body .label-item[data-v-c88486ac]{width:100%;margin:1rem 0}.actioner-dns .actioner-dns_body .label-item .label-item_key[data-v-c88486ac]{width:100%;font-size:16px;color:#666;margin-bottom:10px}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-c88486ac]{white-space:nowrap;overflow:hidden;text-overflow:ellipsis}.actioner-dns .actioner-dns_body .label-item .label-item_key span[data-v-c88486ac]:before{content:\"*\";color:#f56c6c;margin-right:4px}.actioner-dns .actioner-dns_body .label-item .label-item_value[data-v-c88486ac]{width:100%;margin-top:5px}.actioner-dns .actioner-dns_body .label-item .label-item_value select[data-v-c88486ac],.actioner-dns .actioner-dns_body .label-item .label-item_value input[data-v-c88486ac]{width:100%;min-height:36px}.actioner-dns .actioner-dns_body .label-message[data-v-c88486ac]{width:100%;text-align:left;font-size:14px;color:red;text-align:center}.actioner-dns .config-message[data-v-c88486ac]{width:100%;min-height:inherit;height:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;font-size:2em}.actioner-dns .actioner-dns_footer[data-v-c88486ac]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:flex-end;padding:1rem;font-size:2em;border-top:1px solid #eee}.actioner-dns .actioner-dns_footer button[data-v-c88486ac]{display:inline-block;width:100px!important;margin:0;margin-left:1rem}@keyframes bganimation-c88486ac{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-c88486ac{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-c88486ac{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-c88486ac]{animation:rotateEnter-c88486ac .7s;position:relative}.rotate-leave-active[data-v-c88486ac]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-c88486ac]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media screen and (max-width: 1400px){.actioner-dns .actioner-dns_body[data-v-c88486ac]{min-height:34vh}}@media screen and (max-width: 800px){.actioner-dns[data-v-c88486ac]{width:100%}}@keyframes bganimation-3dabb970{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-3dabb970{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-3dabb970{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-3dabb970]{animation:rotateEnter-3dabb970 .7s;position:relative}.rotate-leave-active[data-v-3dabb970]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-3dabb970]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}[data-v-3dabb970] .app-container_status-label_bg{margin:8px 0;flex:0 0 170px;height:80px;justify-content:start}[data-v-3dabb970] .interface-device-flex{justify-content:start}.container[data-v-3dabb970]{width:100%;overflow-x:auto}.container .table-wrapper[data-v-3dabb970]{min-width:1280px;width:max-content}.container .table-wrapper .table-body[data-v-3dabb970]{display:flex;flex-direction:column;min-width:100%}.container .table-wrapper .table-header[data-v-3dabb970]{display:flex;border-bottom:2px solid #e5e7eb;background-color:#f8fafc;padding-left:10px}.container .table-wrapper .table-row[data-v-3dabb970]{display:flex;min-width:100%;align-items:center;border-bottom:1px solid #e5e7eb;transition:background-color .2s}.container .table-wrapper .table-row[data-v-3dabb970]:hover{background-color:#f3f4f6}.container .table-wrapper .add-row[data-v-3dabb970]{cursor:pointer}.container .table-wrapper .add-row[data-v-3dabb970]:hover{background-color:#f0f9ff}.container .table-wrapper .table-cell[data-v-3dabb970]{padding:12px 16px;box-sizing:border-box;display:flex;justify-content:center}.container .table-wrapper .device-col[data-v-3dabb970]{flex:0 0 200px;min-width:200px}.container .table-wrapper .spacer-col[data-v-3dabb970]:first-of-type{flex:0 0 10px}.container .table-wrapper .spacer-col[data-v-3dabb970]:last-of-type{flex:0 0 32px}.container .table-wrapper .name-col[data-v-3dabb970]{flex:0 0 150px;min-width:150px;text-align:left}.container .table-wrapper .action-col[data-v-3dabb970]{flex:0 0 auto;text-align:right;min-width:160px}.container .table-wrapper .icon[data-v-3dabb970]{width:48px;height:100%;cursor:pointer}.container .table-wrapper .interface-device-flex[data-v-3dabb970]{display:flex;justify-content:center;width:100%}.container .cbi-page-actions[data-v-3dabb970]{margin-top:20px;display:flex;justify-content:flex-end}@media (max-width: 768px){.container[data-v-3dabb970] .app-container_status-label_bg{margin:8px 0;flex:0 0 80px;width:120px;height:80px;justify-content:start}.container .table-wrapper[data-v-3dabb970]{min-width:100%}.container .table-cell[data-v-3dabb970]{padding:8px 12px}.container .device-col[data-v-3dabb970]{flex:0 0 120px!important;min-width:120px!important;margin-right:16px}.container .name-col[data-v-3dabb970]{flex:0 0 80px!important;min-width:80px!important}.container .action-col[data-v-3dabb970]{min-width:120px}.container .interface-device-flex[data-v-3dabb970]{flex-direction:column;gap:4px}}tr>td,tr>th,.tr>.td,.tr>.th,.cbi-section-table-row:before,#cbi-wireless>#wifi_assoclist_table>.tr:nth-child(2){border:none}@keyframes bganimation-6c49427e{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-6c49427e{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-6c49427e{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-6c49427e]{animation:rotateEnter-6c49427e .7s;position:relative}.rotate-leave-active[data-v-6c49427e]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-6c49427e]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.custom-table-container[data-v-6c49427e]{width:100%;font-size:14px;color:var(--flow-span-color)}.custom-table-container input[data-v-6c49427e]{margin:0}.custom-table-container .custom-table-wrapper[data-v-6c49427e]{width:100%;overflow-x:auto;-webkit-overflow-scrolling:touch}.custom-table-container .custom-table[data-v-6c49427e]{width:100%;border-collapse:collapse;table-layout:auto}.custom-table-container .custom-table thead[data-v-6c49427e]{border-radius:8px!important;background:#F8F8F8}.custom-table-container .custom-table thead tr th[data-v-6c49427e]{color:var(--flow-span-color)!important;font-weight:500!important;border:none!important;padding:18px 8px!important;white-space:nowrap}.custom-table-container .custom-table tbody tr[data-v-6c49427e]{background:transparent;border-bottom:1px solid #f8f8f8!important}.custom-table-container .custom-table tbody tr[data-v-6c49427e]:last-child{border-bottom:none!important}.custom-table-container .custom-table tbody tr td[data-v-6c49427e]{padding:24px 8px!important;white-space:nowrap}.custom-table-container .custom-table tbody tr:hover td[data-v-6c49427e]{background-color:#00000005!important}.custom-table-container .custom-table tbody tr.empty-row td[data-v-6c49427e]{text-align:center!important;padding:30px 0!important;color:#c98d8d66!important;border-bottom:none!important}.custom-table-container .custom-table .selection-header[data-v-6c49427e],.custom-table-container .custom-table .selection-cell[data-v-6c49427e]{width:50px!important;min-width:50px!important;text-align:center!important}.custom-table-container .pagination-wrapper[data-v-6c49427e]{display:flex;justify-content:space-between;align-items:center;margin-top:16px;padding:0 8px}.custom-table-container .pagination-wrapper .pagination-info[data-v-6c49427e]{color:#0009;font-size:13px}.custom-table-container .pagination-wrapper .pagination-controls button[data-v-6c49427e]{min-width:32px;height:32px;margin:0 4px;padding:0 8px;background:#fff;color:#000000a6;cursor:pointer;transition:all .3s}.custom-table-container .pagination-wrapper .pagination-controls button[data-v-6c49427e]:hover:not(:disabled){color:#1890ff;border-color:#1890ff}.custom-table-container .pagination-wrapper .pagination-controls button[data-v-6c49427e]:disabled{color:#00000040;background-color:#f5f5f5;border-color:#d9d9d9;cursor:not-allowed}.custom-table-container .pagination-wrapper .pagination-controls button.active[data-v-6c49427e]{color:#fff;background-color:#1890ff;border-color:#1890ff}@media (max-width: 768px){.custom-table-container .custom-table thead tr th[data-v-6c49427e]{padding:8px 4px!important;font-size:13px!important}.custom-table-container .custom-table tbody tr td[data-v-6c49427e]{padding:12px 4px!important;font-size:13px!important}.custom-table-container .pagination-wrapper[data-v-6c49427e]{flex-direction:column;align-items:flex-start;gap:12px}.custom-table-container .pagination-wrapper .pagination-controls[data-v-6c49427e]{display:flex;flex-wrap:wrap;gap:4px}.custom-table-container .pagination-wrapper .pagination-controls button[data-v-6c49427e]{min-width:28px;height:28px;margin:0;padding:0 6px;font-size:13px}}@keyframes bganimation-9eb77922{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-9eb77922{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-9eb77922{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-9eb77922]{animation:rotateEnter-9eb77922 .7s;position:relative}.rotate-leave-active[data-v-9eb77922]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-9eb77922]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.del-button[data-v-9eb77922]{display:inline-flex;justify-content:center;align-items:center;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #dcdfe6;color:#606266;text-align:center;box-sizing:border-box;outline:none;margin:0 8px 0 0;transition:all .1s;font-weight:500;user-select:none;padding:8px 15px;font-size:14px;border-radius:4px}.add-button--danger[data-v-9eb77922]{color:#fff;background-color:#553afe;border-color:#553afe}.add-button--danger[data-v-9eb77922]:hover{background:#5c44f8;border-color:#5c44f8;color:#fff}.add-button--danger[data-v-9eb77922]:active{background:#553AFE;border-color:#553afe;color:#fff}.add-button.is-disabled[data-v-9eb77922]{opacity:.5;cursor:not-allowed}.del-button--danger[data-v-9eb77922]{color:#fff;background-color:#f56c6c;border-color:#f56c6c}.del-button--danger[data-v-9eb77922]:hover{background:#f78989;border-color:#f78989;color:#fff}.del-button--danger[data-v-9eb77922]:active{background:#dd6161;border-color:#dd6161;color:#fff}.del-button.is-disabled[data-v-9eb77922]{opacity:.5;cursor:not-allowed}.search_box[data-v-9eb77922]{width:350px}.search_box .search_container[data-v-9eb77922]{display:flex;align-items:center;gap:8px}.search_box .search_container .search_input_wrapper[data-v-9eb77922]{position:relative;flex-grow:1}.search_box .search_container .search_input_wrapper .search_icon[data-v-9eb77922]{position:absolute;right:10px;top:50%;transform:translateY(-50%);fill:#000c;cursor:pointer}.search_box .search_container .search_input_wrapper .search_input[data-v-9eb77922]{width:100%;padding:4px 35px 4px 12px;border-radius:4px;border:1px solid rgba(0,0,0,.6);font-size:14px;outline:none;transition:border-color .3s;color:#222;background:transparent}.search_box .search_container .search_input_wrapper .search_input[data-v-9eb77922]:focus{border-color:#4a90e2}.search_box .search_container .refresh_button[data-v-9eb77922]{background:none;border:none;cursor:pointer;padding:8px;border-radius:50%;transition:background-color .3s;display:flex;align-items:center;justify-content:center}.search_box .search_container .refresh_button[data-v-9eb77922]:hover{background-color:#f0f0f0}.search_box .search_container .refresh_button .refresh_icon[data-v-9eb77922]{fill:#000c;transition:transform .3s}.search_box .search_container .refresh_button.rotate .refresh_icon[data-v-9eb77922]{animation:spin-9eb77922 1s linear infinite}@keyframes spin-9eb77922{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes bganimation-9eb77922{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-9eb77922{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-9eb77922{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-9eb77922]{animation:rotateEnter-9eb77922 .7s;position:relative}.rotate-leave-active[data-v-9eb77922]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-9eb77922]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media (max-width: 827px){.search_box[data-v-9eb77922]{width:80%}.del-button[data-v-9eb77922]{padding:6px 8px}}@keyframes bganimation-4a18630f{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-4a18630f{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-4a18630f{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-4a18630f]{animation:rotateEnter-4a18630f .7s;position:relative}.rotate-leave-active[data-v-4a18630f]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-4a18630f]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.flow[data-v-4a18630f]{position:relative;height:260px}.flow .echart[data-v-4a18630f]{width:100%;height:100%}.flow .flow-data[data-v-4a18630f]{position:absolute;right:10px;top:10px}.flow .flow-data span[data-v-4a18630f]{display:block;color:var(--flow-span-color);font-size:12px;margin-bottom:5px;font-weight:600;font-family:PingFangSC-Semibold,PingFang SC}@media screen and (max-width: 600px){.flow[data-v-4a18630f]{height:55vw}}@keyframes bganimation-586a633c{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-586a633c{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-586a633c{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-586a633c]{animation:rotateEnter-586a633c .7s;position:relative}.rotate-leave-active[data-v-586a633c]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-586a633c]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}[data-v-586a633c] .tag-input{padding:4px 12px}.custom-content[data-v-586a633c]{position:relative}.custom-content .img_box[data-v-586a633c]{position:absolute;right:0;top:0;width:100px;height:100px}.custom-content .img_box>img[data-v-586a633c]{width:100%;height:100%}.custom-content .IP_address[data-v-586a633c]{text-align:center;padding:14px 16px;background:rgba(85,58,254,.1);border-radius:8px;margin-bottom:16px}.custom-content .tip[data-v-586a633c]{text-align:center;margin-top:16px;font-size:12px}.custom-content .item_box[data-v-586a633c]{margin-top:12px;display:flex;align-items:center}.custom-content .item_box>input[data-v-586a633c]{width:45%;color:var(--card-box-shadow);background:transparent!important}.custom-content .item_box>input[data-v-586a633c]::placeholder{color:#8898aa}.custom-content .item_box>select[data-v-586a633c]{width:45%;background:transparent!important;color:var(--card-box-shadow)}.custom-content .item_box>select>option[data-v-586a633c]{padding:4px 12px!important}.custom-content .item_box .item_left[data-v-586a633c]{width:140px;text-align:right}.info-content[data-v-586a633c]{display:flex}.info-content .img_box[data-v-586a633c]{position:relative}.info-content .item_box .item_left[data-v-586a633c]{width:100px}@keyframes bganimation-586a633c{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-586a633c{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-586a633c{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-586a633c]{animation:rotateEnter-586a633c .7s;position:relative}.rotate-leave-active[data-v-586a633c]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-586a633c]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@keyframes bganimation-b2212e7c{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-b2212e7c{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-b2212e7c{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-b2212e7c]{animation:rotateEnter-b2212e7c .7s;position:relative}.rotate-leave-active[data-v-b2212e7c]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-b2212e7c]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.custom-content[data-v-b2212e7c]{position:relative}.custom-content .img_box[data-v-b2212e7c]{position:absolute;right:0;top:0;width:100px;height:100px}.custom-content .img_box>img[data-v-b2212e7c]{width:100%;height:100%}.custom-content .IP_address[data-v-b2212e7c]{text-align:center;padding:14px 16px;background:rgba(85,58,254,.1);border-radius:8px;margin-bottom:16px}.custom-content .tip[data-v-b2212e7c]{text-align:center;margin-top:16px;font-size:12px}.custom-content .item_box[data-v-b2212e7c]{margin-top:12px;display:flex;align-items:center}.custom-content .item_box>input[data-v-b2212e7c]{width:45%;color:var(--card-box-shadow);background:transparent!important}.custom-content .item_box>input[data-v-b2212e7c]::placeholder{color:#8898aa}.custom-content .item_box>select[data-v-b2212e7c]{width:45%;color:var(--card-box-shadow);background:transparent!important}.custom-content .item_box>select>option[data-v-b2212e7c]{padding:4px 12px!important}.custom-content .item_box .item_left[data-v-b2212e7c]{width:140px;text-align:right}.del-button[data-v-b2212e7c]{display:inline-flex;justify-content:center;align-items:center;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #dcdfe6;color:#606266;text-align:center;box-sizing:border-box;outline:none;margin:0 8px 0 0;transition:all .1s;font-weight:500;user-select:none;padding:6px 10px;font-size:14px;border-radius:4px}.del-button--danger[data-v-b2212e7c]{color:#fff;background-color:#f56c6c;border-color:#f56c6c}.del-button--danger[data-v-b2212e7c]:hover{background:#f78989;border-color:#f78989;color:#fff}.del-button--danger[data-v-b2212e7c]:active{background:#dd6161;border-color:#dd6161;color:#fff}.edit-button[data-v-b2212e7c]{color:#553afe;border-color:#553afe}.edit-button[data-v-b2212e7c]:hover{background:rgba(85,58,254,.1);border-color:#553afe}.edit-button[data-v-b2212e7c]:active{background:rgba(85,58,254,.2);border-color:#553afe}.del-button.is-disabled[data-v-b2212e7c]{opacity:.5;cursor:not-allowed}@keyframes bganimation-b2212e7c{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-b2212e7c{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-b2212e7c{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-b2212e7c]{animation:rotateEnter-b2212e7c .7s;position:relative}.rotate-leave-active[data-v-b2212e7c]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-b2212e7c]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@keyframes bganimation-23c28a68{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-23c28a68{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-23c28a68{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-23c28a68]{animation:rotateEnter-23c28a68 .7s;position:relative}.rotate-leave-active[data-v-23c28a68]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-23c28a68]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.custom-content[data-v-23c28a68]{position:relative}.custom-content .img_box[data-v-23c28a68]{position:absolute;right:0;top:0;width:100px;height:100px}.custom-content .img_box>img[data-v-23c28a68]{width:100%;height:100%}.custom-content .IP_address[data-v-23c28a68]{text-align:center;padding:14px 16px;background:rgba(85,58,254,.1);border-radius:8px;margin-bottom:16px}.custom-content .tip[data-v-23c28a68]{text-align:center;margin-top:16px;font-size:12px}.custom-content .item_box[data-v-23c28a68]{margin-top:12px;display:flex;align-items:center}.custom-content .item_box>input[data-v-23c28a68]{width:45%;color:var(--card-box-shadow);background:transparent!important}.custom-content .item_box>input[data-v-23c28a68]::placeholder{color:#8898aa}.custom-content .item_box>select[data-v-23c28a68]{width:45%;color:var(--card-box-shadow);background:transparent!important}.custom-content .item_box>select>option[data-v-23c28a68]{padding:4px 12px!important}.custom-content .item_box .item_left[data-v-23c28a68]{width:140px;text-align:right}.del-button[data-v-23c28a68]{display:inline-flex;justify-content:center;align-items:center;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #dcdfe6;color:#606266;text-align:center;box-sizing:border-box;outline:none;margin:0 8px 0 0;transition:all .1s;font-weight:500;user-select:none;padding:6px 10px;font-size:14px;border-radius:4px}.del-button--danger[data-v-23c28a68]{color:#fff;background-color:#f56c6c;border-color:#f56c6c}.del-button--danger[data-v-23c28a68]:hover{background:#f78989;border-color:#f78989;color:#fff}.del-button--danger[data-v-23c28a68]:active{background:#dd6161;border-color:#dd6161;color:#fff}.del-button.is-disabled[data-v-23c28a68]{opacity:.5;cursor:not-allowed}@keyframes bganimation-23c28a68{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-23c28a68{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-23c28a68{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-23c28a68]{animation:rotateEnter-23c28a68 .7s;position:relative}.rotate-leave-active[data-v-23c28a68]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-23c28a68]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@keyframes bganimation-ed203952{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-ed203952{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-ed203952{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-ed203952]{animation:rotateEnter-ed203952 .7s;position:relative}.rotate-leave-active[data-v-ed203952]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-ed203952]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.dialog-overlay[data-v-ed203952]{position:fixed;inset:0;background-color:#00000080;display:flex;justify-content:center;align-items:center;z-index:1000;padding:16px}.dialog-container[data-v-ed203952]{background-color:#fff;border-radius:12px;padding:16px;width:100%;max-width:400px;box-shadow:0 4px 12px #00000026}.dialog-container .dialog-title[data-v-ed203952]{margin:0 0 20px;font-size:1.2rem;font-weight:500;color:#333;text-align:left}.dialog-container .dialog-message[data-v-ed203952]{margin:20px 0;font-size:1rem;color:#666;text-align:center}.dialog-container .loading-animation[data-v-ed203952]{margin:20px 0}.dialog-container .loading-animation .spinner[data-v-ed203952]{width:40px;height:40px;margin:0 auto;border:4px solid rgba(110,72,170,.2);border-radius:50%;border-top-color:#8d78fa;animation:spin-ed203952 1s linear infinite}.dialog-container .dialog-button[data-v-ed203952]{background-color:#553afe;color:#fff;border:none;border-radius:6px;padding:4px 20px;font-size:1rem;cursor:pointer;transition:all .2s;margin:0 auto;display:block}.dialog-container .dialog-button[data-v-ed203952]:hover{background-color:#553afe;opacity:.9}.dialog-container .dialog-button[data-v-ed203952]:active{transform:scale(.98)}.dialog-container .warning-message[data-v-ed203952]{display:flex;gap:8px;background-color:#fff8e1;border-left:4px solid #FFC107;padding:12px;margin-bottom:20px;border-radius:4px;font-size:.9rem;color:#333;text-align:left}.dialog-container .warning-message .warning-icon[data-v-ed203952]{flex-shrink:0;width:20px;height:20px;color:#ffa000}.dialog-container .input-group[data-v-ed203952]{margin-bottom:16px;text-align:left}.dialog-container .input-group label[data-v-ed203952]{display:block;margin-bottom:8px;font-size:.95rem;color:#333}.dialog-container .input-group .tag-input[data-v-ed203952]{width:100%;padding:10px 12px;border:1px solid #ddd;border-radius:6px;font-size:1rem;transition:border-color .2s}.dialog-container .input-group .tag-input[data-v-ed203952]:focus{outline:none;border-color:#6e48aa}.dialog-container .button-group[data-v-ed203952]{display:flex;justify-content:flex-end;gap:12px}.dialog-container .button-group .cancel-button[data-v-ed203952]{background-color:#fff;color:#333;border:1px solid #ddd;border-radius:6px;padding:4px 20px;font-size:1rem;cursor:pointer;transition:all .2s}.dialog-container .button-group .cancel-button[data-v-ed203952]:hover{background-color:#e0e0e0}.dialog-container .button-group .cancel-button[data-v-ed203952]:active{transform:scale(.98)}.dialog-container .button-group .confirm-button[data-v-ed203952]{background-color:#553afe;color:#fff;border:none;border-radius:6px;padding:4px 20px;font-size:1rem;cursor:pointer;transition:all .2s}.dialog-container .button-group .confirm-button[data-v-ed203952]:hover{background-color:#553afe;opacity:.9}.dialog-container .button-group .confirm-button[data-v-ed203952]:active{transform:scale(.98)}.tag-dialog[data-v-ed203952]{max-width:500px}.fade-enter-active[data-v-ed203952],.fade-leave-active[data-v-ed203952]{transition:opacity .3s ease}.fade-enter-from[data-v-ed203952],.fade-leave-to[data-v-ed203952]{opacity:0}@keyframes spin-ed203952{0%{transform:rotate(0)}to{transform:rotate(360deg)}}@keyframes rotate-circle-ed203952{0%{transform:rotate(-45deg)}5%{transform:rotate(-45deg)}12%{transform:rotate(-405deg)}to{transform:rotate(-405deg)}}@keyframes icon-line-tip-ed203952{0%{width:0;left:1px;top:15px}54%{width:0;left:1px;top:15px}70%{width:40px;left:-6px;top:30px}84%{width:14px;left:17px;top:38px}to{width:12px;left:8px;top:22px}}@keyframes icon-line-long-ed203952{0%{width:0;right:37px;top:43px}65%{width:0;right:37px;top:43px}84%{width:44px;right:0;top:28px}to{width:20px;right:8px;top:20px}}@media (max-width: 480px){.dialog-container[data-v-ed203952]{padding:16px}.dialog-container .dialog-title[data-v-ed203952]{font-size:1.1rem;margin-bottom:16px}.dialog-container .dialog-message[data-v-ed203952]{font-size:.95rem;margin:16px 0}.dialog-container .warning-message[data-v-ed203952]{font-size:.85rem;padding:10px}.dialog-container .input-group[data-v-ed203952]{margin-bottom:20px}.dialog-container .input-group label[data-v-ed203952]{font-size:.9rem}.dialog-container .input-group .tag-input[data-v-ed203952]{padding:8px 10px;font-size:.95rem}.dialog-container .button-group[data-v-ed203952]{gap:8px}.dialog-container .button-group .cancel-button[data-v-ed203952],.dialog-container .button-group .confirm-button[data-v-ed203952]{padding:4px 16px;font-size:.95rem}.dialog-container .loading-animation .spinner[data-v-ed203952]{width:36px;height:36px}}@keyframes bganimation-102c75ea{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-102c75ea{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-102c75ea{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-102c75ea]{animation:rotateEnter-102c75ea .7s;position:relative}.rotate-leave-active[data-v-102c75ea]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-102c75ea]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.add-button[data-v-102c75ea]{display:inline-flex;justify-content:center;align-items:center;line-height:1;white-space:nowrap;cursor:pointer;background:#fff;border:1px solid #dcdfe6;color:#606266;text-align:center;box-sizing:border-box;outline:none;margin:0 8px 0 0;transition:all .1s;font-weight:500;user-select:none;padding:8px 12px;font-size:14px;border-radius:4px}.add-button--danger[data-v-102c75ea]{color:#fff;background-color:#553afe;border-color:#553afe}.add-button--danger[data-v-102c75ea]:hover{background:#5c44f8;border-color:#5c44f8;color:#fff}.add-button--danger[data-v-102c75ea]:active{background:#553AFE;border-color:#553afe;color:#fff}.add-button.is-disabled[data-v-102c75ea]{opacity:.5;cursor:not-allowed}.tab-container[data-v-102c75ea]{display:flex;flex-direction:row;width:100%;margin:0 auto;border-radius:8px;overflow:hidden}@media (max-width: 768px){.tab-container[data-v-102c75ea]{flex-direction:column}}.tab-header[data-v-102c75ea]{display:flex;flex-direction:column;width:120px}@media (max-width: 768px){.tab-header[data-v-102c75ea]{flex-direction:row;width:100%;overflow-x:auto;white-space:nowrap}}.tab-button[data-v-102c75ea]{padding:12px 16px;text-align:left;border:none;background:transparent!important;cursor:pointer;font-size:14px;color:var(--flow-span-color);transition:all .3s ease;border-radius:8px 0 0 8px}.tab-button[data-v-102c75ea]:hover{background:var(--tag-bg-color)!important}.tab-button.active[data-v-102c75ea]{background:var(--tag-bg-color)!important;font-weight:500;margin:0}@media (max-width: 768px){.tab-button[data-v-102c75ea]{border-radius:8px 8px 0 0;text-align:center;flex:1;min-width:max-content}.tab-button.active[data-v-102c75ea]{border-radius:8px 8px 0 0}}.tab-content_g[data-v-102c75ea]{flex:1;padding:20px;background:var(--tag-bg-color);border-radius:0 8px 8px 0;min-height:60vh}.tab-content_g .not_installed[data-v-102c75ea]{display:flex;flex-direction:column;align-items:center}.tab-content_g .not_installed>span[data-v-102c75ea]{color:var(--tit-color);margin:20px 0}.tab-content_g .not_installed .not_installed_btn[data-v-102c75ea]{padding:6px 16px;background:#553AFE;border-radius:4px;font-size:14px;color:#fff;cursor:pointer}@media (max-width: 768px){.tab-content_g[data-v-102c75ea]{border-radius:0 0 8px 8px}}.item_box[data-v-102c75ea]{margin-top:12px;display:flex;align-items:center;color:var(--tit-color)!important}.item_box>input[data-v-102c75ea]{width:40%;color:var(--card-box-shadow);background:transparent!important;color:var(--tit-color)!important}@media (max-width: 768px){.item_box>input[data-v-102c75ea]{width:70%}}.item_box>input[data-v-102c75ea]::placeholder{color:var(--item-label_key-span-color)}.item_box>select[data-v-102c75ea]{background:transparent!important;width:40%;color:var(--card-box-shadow)}@media (max-width: 768px){.item_box>select[data-v-102c75ea]{width:70%}}.item_box>select>option[data-v-102c75ea]{padding:4px 12px!important}.item_box .item_left[data-v-102c75ea]{width:140px;text-align:right}@media (max-width: 768px){.item_box .item_left[data-v-102c75ea]{width:100px}}@keyframes bganimation-39804772{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-39804772{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-39804772{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-39804772]{animation:rotateEnter-39804772 .7s;position:relative}.rotate-leave-active[data-v-39804772]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-39804772]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.tab-container[data-v-39804772]{margin:0 auto}.tabs_box_g[data-v-39804772]{display:flex}.tabs_box_g button[data-v-39804772]{padding:14px 24px;border:none;background:none;cursor:pointer;font-size:14px;border-radius:8px 8px 0 0;margin:0;transition:all .3s ease}.tabs_box_g button.active[data-v-39804772]{background:var(--card-bg-color);color:#553afe;font-weight:700;position:relative}.tab-content_g[data-v-39804772]{background:var(--card-bg-color);padding:16px;border-radius:0 8px 8px}.content-item[data-v-39804772]{min-height:60vh}@keyframes bganimation-39804772{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-39804772{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-39804772{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-39804772]{animation:rotateEnter-39804772 .7s;position:relative}.rotate-leave-active[data-v-39804772]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-39804772]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media (max-width: 827px){.tabs_box_g button[data-v-39804772]{padding:7px 12px!important}.tab-content_g[data-v-39804772]{border-radius:0 0 8px 8px}}@keyframes bganimation-cbc39b94{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-cbc39b94{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-cbc39b94{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-cbc39b94]{animation:rotateEnter-cbc39b94 .7s;position:relative}.rotate-leave-active[data-v-cbc39b94]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-cbc39b94]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.icon[data-v-cbc39b94]{width:24px;height:24px;margin-right:6px}.icon1[data-v-cbc39b94]{width:16px;height:16px;margin-right:8px}.icon2[data-v-cbc39b94]{width:20px;height:20px;margin-right:8px}.icon3[data-v-cbc39b94]{width:17px;height:17px;margin-right:8px}.m-20[data-v-cbc39b94]{margin:20px 0!important}[data-v-cbc39b94] .modal-container .modal-header{border-bottom:none;padding-bottom:0;padding-left:20px}[data-v-cbc39b94] .modal-container .modal-header .modal-title{text-align:left}[data-v-cbc39b94] .modal-container .modal-content{padding:0 20px 20px}.item_container[data-v-cbc39b94]{max-width:1400px;margin:0 auto;display:grid;grid-template-columns:repeat(2,1fr);grid-gap:24px;font-size:16px}.item_container .item[data-v-cbc39b94]{padding:16px;background:var(--card-bg-color);border-radius:10px}.item_container .item .item_title[data-v-cbc39b94]{display:flex;align-items:center}.item_container .item .item_title>span[data-v-cbc39b94]{color:var(--app-container_title-color);display:inline-block;padding-top:2px}.item_container .item>p[data-v-cbc39b94]{color:#717182;margin-top:10px}.item_container .item .wifi_btn[data-v-cbc39b94]{margin:40px 0;display:flex;justify-content:center}.item_container .item .wifi_btn>div[data-v-cbc39b94]{background:#000;padding:12px 24px;border-radius:6px;display:flex;align-items:center;color:#fff;cursor:pointer;font-size:14px}.item_container .item .wifi_btn>div>span[data-v-cbc39b94]{display:inline-block;padding-top:2px}.item_container .item .wifi_btn .start_btn[data-v-cbc39b94]{padding:10px;width:100%;display:flex;justify-content:center}.item_container .item .progress>p[data-v-cbc39b94]{display:flex;justify-content:space-between;font-size:16px;color:#0a0a0a;margin-bottom:12px}.item_container .item .is-bg[data-v-cbc39b94]{opacity:.6;pointer-events:none;cursor:not-allowed}.item_container .item .select_box[data-v-cbc39b94]{margin-top:30px;color:var(--app-container_title-color)}.item_container .item .select_box>select[data-v-cbc39b94]{width:100%;background:#f3f3f5;border-radius:6px;color:var(--app-container_title-color)}.item_container .item .select_box>select.is-placeholder[data-v-cbc39b94]{color:#9aa0a6}.item_container .item .select_box option[disabled][data-v-cbc39b94]{color:#9aa0a6}.item_container .item .select_box option[hidden][data-v-cbc39b94]{display:none}.item_container .item .tip[data-v-cbc39b94]{text-align:center;font-size:14px}.item_container .item .log_info[data-v-cbc39b94]{padding:24px 16px;margin-top:20px;background:black;border-radius:8px;max-height:300px;overflow-y:auto}.item_container .item .log_info[data-v-cbc39b94]::-webkit-scrollbar{height:6px}.item_container .item .log_info[data-v-cbc39b94]::-webkit-scrollbar-thumb{background:#777780;border-radius:6px}.item_container .item .log_info>p[data-v-cbc39b94]{font-size:14px;color:#05df72;margin-bottom:12px}.item_container .item .log_info>p[data-v-cbc39b94]:last-child{margin-bottom:0}.item_container .item .result_box[data-v-cbc39b94]{margin-top:20px}.item_container .item .result_box .result[data-v-cbc39b94]{display:grid;grid-template-columns:repeat(2,1fr);grid-gap:12px}.item_container .item .result_box .result .result_state[data-v-cbc39b94]{display:flex;flex-direction:column;align-items:center;color:var(--app-container_title-color)}.item_container .item .result_box .result .result_state>div[data-v-cbc39b94]{margin-bottom:6px;font-weight:700;font-size:18px;letter-spacing:.1em}.item_container .item .result_box .result .result_state .result_txt[data-v-cbc39b94]{font-size:12px}.item_container .item .result_box .result .result_item[data-v-cbc39b94]{background:#ececf0;border-radius:6px;padding:20px 16px;display:flex;flex-direction:column;align-items:center;justify-content:center}.item_container .item .result_box .result .result_item .result_title[data-v-cbc39b94]{font-size:16px;color:#0a0a0a;margin-bottom:12px}.item_container .item .result_box .result .result_item .speed_value[data-v-cbc39b94]{font-size:24px;font-weight:700;letter-spacing:.1em}.item_container .item .result_box .result .result_item .speed_title[data-v-cbc39b94]{font-size:12px}.item_container .item .result_box .result .result_item .icon_speed[data-v-cbc39b94]{width:30px;height:30px;margin-bottom:10px}.item_container .item .result_box .result .result_item .icon_speed1[data-v-cbc39b94]{width:26px;height:26px;margin-bottom:10px}.item_container .item .result_box .result .result_item .unit[data-v-cbc39b94]{color:#717182;display:inline-block;margin-bottom:6px}.custom-content p[data-v-cbc39b94]{color:#717182}.custom-content .address_box[data-v-cbc39b94]{background:#ececf0;border-radius:6px;padding:10px 12px;margin-top:16px;display:flex;justify-content:space-between;align-items:center}.custom-content .address_box>span[data-v-cbc39b94]{font-size:16px}.custom-content .address_box>div[data-v-cbc39b94]{background:#fff;padding:6px 12px;border-radius:4px;cursor:pointer}@keyframes spin-cbc39b94{to{transform:rotate(360deg)}}.icon3-wrap[data-v-cbc39b94]{display:inline-flex;width:17px;height:17px;margin-right:8px;align-items:center;justify-content:center}.icon3-wrap .icon3[data-v-cbc39b94]{width:100%;height:100%}.is-rotating[data-v-cbc39b94]{animation:spin-cbc39b94 1s linear infinite;transform-origin:center;transform-box:fill-box;will-change:transform}.line[data-v-cbc39b94]{height:1px;background:#d9d9d9;margin:20px 0}.status[data-v-cbc39b94]{display:inline-block;padding:4px 12px;color:#fff;border-radius:6px;font-size:12px;margin-bottom:10px}.status_bg1[data-v-cbc39b94]{background:#00c950}.status_bg2[data-v-cbc39b94]{background:#2b7fff}.status_bg3[data-v-cbc39b94]{background:#ef4444}.status_bg4[data-v-cbc39b94]{background:#f0b100}@keyframes bganimation-cbc39b94{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-cbc39b94{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-cbc39b94{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-cbc39b94]{animation:rotateEnter-cbc39b94 .7s;position:relative}.rotate-leave-active[data-v-cbc39b94]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-cbc39b94]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@media (max-width: 827px){.item_container[data-v-cbc39b94]{grid-template-columns:repeat(1,1fr);grid-gap:12px;padding-bottom:16px}}@keyframes bganimation-164df064{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-164df064{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-164df064{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-164df064]{animation:rotateEnter-164df064 .7s;position:relative}.rotate-leave-active[data-v-164df064]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-164df064]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.icon[data-v-164df064]{width:30px;height:30px;margin-right:10px;display:block}.icon[data-v-164df064] svg{display:block}.container[data-v-164df064]{min-height:87vh}.container .title[data-v-164df064]{font-size:16px;margin-bottom:20px;display:flex;justify-content:center;flex-direction:column}.container .title>div[data-v-164df064]{display:inline-flex;justify-content:center;align-items:center;line-height:1;margin-bottom:10px}.container .title>div>span[data-v-164df064]{color:var(--app-container_title-color);position:relative;top:1px;font-weight:600}.container .title>p[data-v-164df064]{text-align:center;color:#717182}@keyframes bganimation-164df064{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-164df064{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-164df064{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-164df064]{animation:rotateEnter-164df064 .7s;position:relative}.rotate-leave-active[data-v-164df064]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-164df064]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}@keyframes bganimation-2b19eb04{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-2b19eb04{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-2b19eb04{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-2b19eb04]{animation:rotateEnter-2b19eb04 .7s;position:relative}.rotate-leave-active[data-v-2b19eb04]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-2b19eb04]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}button[data-v-2b19eb04]{outline:none;cursor:pointer;border:none}.pc-radio[data-v-2b19eb04]{display:flex;flex-wrap:wrap;align-items:center}.label-flex.pc-radio label[data-v-2b19eb04]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}.label-flex.pc-radio input[type=radio][data-v-2b19eb04]{margin:0 4px 0 0;top:0}.mobile-switch[data-v-2b19eb04]{display:none;align-items:center}.switch-core[data-v-2b19eb04]{position:relative;width:50px;border:1px solid #dcdfe6;outline:none;border-radius:20px;box-sizing:border-box;background:#dcdfe6;cursor:pointer;transition:border-color .3s,background-color .3s;display:inline-block}.switch-core.is-checked[data-v-2b19eb04]{border-color:#409eff;background-color:#409eff}.switch-core.is-disabled[data-v-2b19eb04]{opacity:.6;cursor:not-allowed}.switch-button[data-v-2b19eb04]{position:absolute;top:1px;left:1px;border-radius:100%;transition:all .3s;width:16px;height:16px;background-color:#fff}.switch-core.is-checked .switch-button[data-v-2b19eb04]{transform:translate(20px)}.switch-label[data-v-2b19eb04]{font-size:14px;color:#999}.switch-label.active[data-v-2b19eb04]{color:#409eff}form.form-container[data-v-2b19eb04]{display:block;width:100%;padding:0 1rem;margin-top:50px}form.form-container .label-name[data-v-2b19eb04]{display:block;width:100%;margin-bottom:.5rem;color:var(--item-label_key-span-color)}form.form-container .label-name span[data-v-2b19eb04]:before{content:\"*\";color:#f56c6c;margin-right:4px;width:10px;display:inline-block;vertical-align:middle}form.form-container .label-value[data-v-2b19eb04]{display:block;width:100%;margin-bottom:1rem}form.form-container .label-value input[data-v-2b19eb04],form.form-container .label-value select[data-v-2b19eb04]{display:block;width:100%;height:42px;background:none;border:1px solid #c2c2c2;color:var(--item-label_key-span-color);font-size:14px}form.form-container .label-value input>option[data-v-2b19eb04],form.form-container .label-value select>option[data-v-2b19eb04]{color:#8898aa}form.form-container .label-value input[data-v-2b19eb04]:focus,form.form-container .label-value select[data-v-2b19eb04]:focus{transition:.2s;border:1px solid #418dfe}form.form-container .label-value select[data-v-2b19eb04]{border-radius:3px;padding:0 10px}form.form-container .label-value input[data-v-2b19eb04]{border-left:none!important;border-right:none!important;border-top:none!important;box-shadow:none!important;padding:0 10px}form.form-container .label-value input[type=checkbox][data-v-2b19eb04],form.form-container .label-value input[type=radio][data-v-2b19eb04]{width:auto}form.form-container .label-value input[type=radio][data-v-2b19eb04]{margin:0 4px 0 0;top:0}form.form-container .label-value input[data-v-2b19eb04]:disabled{background-color:#eee;border:1px solid #c2c2c2;border-radius:3px}form.form-container .label-value input[data-v-2b19eb04]::placeholder{color:var(--item-label_value-span-color);opacity:.54;font-size:14px}form.form-container .label-value input[data-v-2b19eb04]:-ms-input-placeholder{color:var(--item-label_value-span-color);opacity:.54;font-size:14px}form.form-container .label-value input[data-v-2b19eb04]::-ms-input-placeholder{color:var(--item-label_value-span-color);opacity:.54;font-size:14px}form.form-container .label-btns[data-v-2b19eb04]{width:100%;display:flex;flex-wrap:wrap;justify-content:flex-end}form.form-container .label-msg[data-v-2b19eb04]{display:block;width:100%;color:#ff3b3b;font-size:14px}form.form-container .label-msg.warning[data-v-2b19eb04]{color:#f9ad1e}form.form-container .label-flex[data-v-2b19eb04]{width:100%;display:flex;flex-wrap:wrap;align-items:center}form.form-container .label-flex label[data-v-2b19eb04]{width:100px;display:flex;flex-wrap:wrap;align-items:center;cursor:pointer;color:#666}.form-item[data-v-2b19eb04]{display:flex;align-items:center;height:55px}.form-item .label-name[data-v-2b19eb04]{width:200px!important}.form-item .label-value[data-v-2b19eb04]{width:300px!important;padding-top:10px;position:relative;display:flex!important;align-items:center}p[data-v-2b19eb04]{font-size:1em;color:#999;line-height:26px;text-align:left;margin-bottom:1rem}.label-btns[data-v-2b19eb04]{width:500px!important;margin-top:1rem}.label-btns .btn[data-v-2b19eb04]{width:300px!important;text-align:center;border-radius:32px}.label-btns .btn[data-v-2b19eb04]:hover{background:#5279f7;transition:.3}.label-btns .primary-btn[data-v-2b19eb04]{border:none;background:#5279f7;color:#fff;margin-bottom:10px}.label-btns .primary-btn[data-v-2b19eb04]:hover{opacity:.9;transition:.3}select[data-v-2b19eb04]:disabled{background-color:#eee!important;border:1px solid #c2c2c2!important}.seeIcon[data-v-2b19eb04]{width:22px;height:22px;position:absolute;cursor:pointer;z-index:1;right:6px;top:50%;transform:translateY(-50%) scale(1);transition:all .3s ease;transform-origin:center}.seeIcon[data-v-2b19eb04]:hover{transform:translateY(-50%) scale(1.1)}@media only screen and (max-width: 1050px){form.form-container[data-v-2b19eb04]{padding:0;margin-top:-16px}form.form-container .form-item[data-v-2b19eb04]{position:relative;height:auto;margin-bottom:0;height:50px;padding-top:6px;border-bottom:1px solid rgba(0,0,0,.16)!important}form.form-container .form-item .label-name[data-v-2b19eb04]{width:100%!important;margin-bottom:0;font-size:14px}form.form-container .form-item .label-name>span[data-v-2b19eb04]{color:var(--item-label_key-span-color)}form.form-container .form-item .label-value[data-v-2b19eb04]{width:100%!important;margin-bottom:0;padding-top:0}form.form-container .form-item .label-value input[data-v-2b19eb04],form.form-container .form-item .label-value select[data-v-2b19eb04]{height:40px;font-size:14px}form.form-container .form-item .label-value .password_input[data-v-2b19eb04]{padding-right:24px}form.form-container .form-item .label-value input[data-v-2b19eb04]{border:none;text-align:right;padding:0}form.form-container .form-item .label-value select[data-v-2b19eb04]:disabled{border:none!important}form.form-container .form-item .label-value select[data-v-2b19eb04]{padding-right:16px!important;border:none;appearance:none;-webkit-appearance:none;-moz-appearance:none;padding:0;outline:none;background:transparent;text-align:right}form.form-container .form-item .label-value[data-v-2b19eb04] ::selection{background:transparent;color:inherit}form.form-container .form-item .label-value[data-v-2b19eb04] ::-moz-selection{background:transparent;color:inherit}form.form-container .label-flex[data-v-2b19eb04]{display:flex}form.form-container .label-flex label[data-v-2b19eb04]{width:100%;margin-bottom:.5rem}form.form-container .label-btns[data-v-2b19eb04]{width:100%!important;margin-top:1.5rem}form.form-container .label-btns .btn[data-v-2b19eb04]{width:100%!important;height:44px;font-size:16px}.seeIcon[data-v-2b19eb04]{width:20px;height:20px;right:0}.pc-radio[data-v-2b19eb04],.label-flex[data-v-2b19eb04]{display:none!important}.mobile-switch[data-v-2b19eb04]{display:flex;align-items:center;height:50px}.switch_label[data-v-2b19eb04]{display:flex;justify-content:end}.switch-core[data-v-2b19eb04]{width:50px;height:24px}.switch-button[data-v-2b19eb04]{width:20px;height:20px}.switch-core.is-checked .switch-button[data-v-2b19eb04]{transform:translate(26px)}.select-arrow[data-v-2b19eb04]{position:absolute;right:6px;top:50%!important;transform:translateY(-50%)!important;width:10px;height:10px;border-top:2px solid #606165;border-right:2px solid #606165;transform:translateY(-50%) rotate(45deg)!important;pointer-events:none}}@keyframes bganimation-42d0731d{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}@keyframes rotateEnter-42d0731d{0%{transform:rotateY(180deg)}10%{transform:rotateY(198deg)}20%{transform:rotateY(216deg)}30%{transform:rotateY(234deg)}40%{transform:rotateY(252deg)}50%{transform:rotateY(270deg)}60%{transform:rotateY(288deg)}70%{transform:rotateY(306deg)}80%{transform:rotateY(324deg)}90%{transform:rotateY(342deg)}to{transform:rotateY(360deg)}}@keyframes turns-42d0731d{0%{-webkit-transform:rotate(0deg)}25%{-webkit-transform:rotate(90deg)}50%{-webkit-transform:rotate(180deg)}75%{-webkit-transform:rotate(270deg)}to{-webkit-transform:rotate(360deg)}}.rotate-enter-active[data-v-42d0731d]{animation:rotateEnter-42d0731d .7s;position:relative}.rotate-leave-active[data-v-42d0731d]{opacity:0;display:none;position:relative;z-index:-999}.app-container[data-v-42d0731d]{width:100%;background-color:var(--card-bg-color);box-shadow:var(--card-box-shadow);padding:10px 30px;border-radius:6px;position:relative}.page-container[data-v-42d0731d]{width:100%;background-color:var(--card-bg-color);border-radius:6px;padding:3rem;margin-top:50px}.mobile-tags-container[data-v-42d0731d]{display:none}.page-flex[data-v-42d0731d]{display:flex}.page-flex .page-sidebar[data-v-42d0731d]{flex:0 0 200px;border-right:1px solid #eee}.page-flex .page-sidebar .item[data-v-42d0731d]{width:100%;height:42px;line-height:42px;font-size:16px;cursor:pointer;color:var(--item-label_key-span-color);display:block;user-select:none;position:relative;display:flex;flex-wrap:wrap;align-items:center}.page-flex .page-sidebar .item[data-v-42d0731d]:hover,.page-flex .page-sidebar .item.activeItem[data-v-42d0731d]{transition:.3s;color:#418cff}.page-flex .page-sidebar .item.activeItem[data-v-42d0731d]:before{content:\"\";position:absolute;left:-1rem;width:3px;height:20px;background-color:#4388ff}.page-flex .page-main[data-v-42d0731d]{flex:1;padding-left:24px}@media (max-width: 827px){.page-container[data-v-42d0731d]{padding:12px 12px 0 8px;margin-top:0}.page-flex[data-v-42d0731d]{display:block}.page-flex .page-sidebar[data-v-42d0731d]{display:none}.page-flex .page-main[data-v-42d0731d]{padding-left:0;padding-top:16px}.mobile-tags-container[data-v-42d0731d]{display:block;width:100%;margin-bottom:16px;position:relative}.tags-wrapper[data-v-42d0731d]{display:flex;align-items:center;height:40px;position:relative}.tags-scroll[data-v-42d0731d]{flex:1;display:flex;overflow-x:auto;scrollbar-width:none;-ms-overflow-style:none;height:100%;align-items:center;white-space:nowrap;padding-right:40px}.tags-scroll[data-v-42d0731d]::-webkit-scrollbar{display:none}.tag-item[data-v-42d0731d]{flex-shrink:0;padding:7px 12px;margin-right:8px;border-radius:4px;background-color:var(--tag-bg-color);color:var(--item-label_key-span-color);font-size:12px;line-height:18px;cursor:pointer;white-space:nowrap}.tag-item.active[data-v-42d0731d]{background-color:#5279f7;color:#fff}.more-btn-wrapper[data-v-42d0731d]{position:absolute;right:-6px;top:0;height:100%;width:40px;display:flex;align-items:center;justify-content:flex-end;pointer-events:none}.fade-overlay[data-v-42d0731d]{position:absolute;right:0;top:50%;transform:translateY(-50%);width:100px;height:32px;background:var(--gradient-bg-color)}.more-btn[data-v-42d0731d]{width:28px;height:28px;border-radius:4px;display:flex;flex-direction:column;justify-content:center;align-items:center;cursor:pointer;pointer-events:auto;position:relative;z-index:1}.more-btn .line[data-v-42d0731d]{width:14px;height:2px;background-color:#5279f7;margin:2px 0;border-radius:1px}[data-v-42d0731d] .showSide{z-index:1!important}.popup-overlay[data-v-42d0731d]{position:fixed;inset:0;background-color:#00000080;z-index:1000;display:flex;justify-content:center;align-items:flex-start}.popup-content[data-v-42d0731d]{width:100%;max-height:85vh;background-color:var(--popup-bg-color);border-radius:0 0 4px 4px;animation:slideDown-42d0731d .3s ease-out;overflow-y:auto;padding-top:25px}.popup-content .popup-tag-item[data-v-42d0731d],.popup-content .active[data-v-42d0731d]{text-align:center;padding:8px 12px 5px;width:calc((100% - 24px) / 3)}@keyframes slideDown-42d0731d{0%{transform:translateY(-100%)}to{transform:translateY(0)}}.popup-tags[data-v-42d0731d]{padding:12px;display:flex;flex-wrap:wrap;gap:8px;max-height:70vh;overflow-y:auto}.popup-tag-item[data-v-42d0731d]{padding:7px 12px;border-radius:4px;background-color:#f5f5f5;color:#333;font-size:12px;line-height:18px;cursor:pointer;white-space:nowrap}.popup-tag-item.active[data-v-42d0731d]{background-color:#5279f7;color:#fff}.popup-footer[data-v-42d0731d]{display:flex;padding:12px;border-top:1px solid #f0f0f0}.popup-footer button[data-v-42d0731d]{flex:1;height:36px;border-radius:23px;font-size:14px;cursor:pointer}.popup-footer .cancel-btn[data-v-42d0731d]{background-color:#f5f5f5;color:#000;border:none;margin-right:12px}.popup-footer .confirm-btn[data-v-42d0731d]{background-color:#5279f7;color:#fff;border:none}}\n"
  },
  {
    "path": "luci-app-quickstart/htdocs/luci-static/quickstart/vendor.js",
    "content": "function wv(e,t){const r=Object.create(null),n=e.split(\",\");for(let i=0;i<n.length;i++)r[n[i]]=!0;return t?i=>!!r[i.toLowerCase()]:i=>!!r[i]}const zx=\"itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly\",Hx=wv(zx);function Q0(e){return!!e||e===\"\"}function bv(e){if(at(e)){const t={};for(let r=0;r<e.length;r++){const n=e[r],i=Zt(n)?Gx(n):bv(n);if(i)for(const a in i)t[a]=i[a]}return t}else{if(Zt(e))return e;if(Yt(e))return e}}const $x=/;(?![^(]*\\))/g,Vx=/:(.+)/;function Gx(e){const t={};return e.split($x).forEach(r=>{if(r){const n=r.split(Vx);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function Sv(e){let t=\"\";if(Zt(e))t=e;else if(at(e))for(let r=0;r<e.length;r++){const n=Sv(e[r]);n&&(t+=n+\" \")}else if(Yt(e))for(const r in e)e[r]&&(t+=r+\" \");return t.trim()}function Ux(e,t){if(e.length!==t.length)return!1;let r=!0;for(let n=0;r&&n<e.length;n++)r=wi(e[n],t[n]);return r}function wi(e,t){if(e===t)return!0;let r=cp(e),n=cp(t);if(r||n)return r&&n?e.getTime()===t.getTime():!1;if(r=at(e),n=at(t),r||n)return r&&n?Ux(e,t):!1;if(r=Yt(e),n=Yt(t),r||n){if(!r||!n)return!1;const i=Object.keys(e).length,a=Object.keys(t).length;if(i!==a)return!1;for(const o in e){const s=e.hasOwnProperty(o),l=t.hasOwnProperty(o);if(s&&!l||!s&&l||!wi(e[o],t[o]))return!1}}return String(e)===String(t)}function xv(e,t){return e.findIndex(r=>wi(r,t))}const Iz=e=>Zt(e)?e:e==null?\"\":at(e)||Yt(e)&&(e.toString===t_||!gt(e.toString))?JSON.stringify(e,J0,2):String(e),J0=(e,t)=>t&&t.__v_isRef?J0(e,t.value):fa(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((r,[n,i])=>(r[`${n} =>`]=i,r),{})}:Ea(t)?{[`Set(${t.size})`]:[...t.values()]}:Yt(t)&&!at(t)&&!e_(t)?String(t):t,Rt={},ua=[],fr=()=>{},Wx=()=>!1,Yx=/^on[^a-z]/,_u=e=>Yx.test(e),Tv=e=>e.startsWith(\"onUpdate:\"),ie=Object.assign,Cv=(e,t)=>{const r=e.indexOf(t);r>-1&&e.splice(r,1)},qx=Object.prototype.hasOwnProperty,Tt=(e,t)=>qx.call(e,t),at=Array.isArray,fa=e=>wu(e)===\"[object Map]\",Ea=e=>wu(e)===\"[object Set]\",cp=e=>e instanceof Date,gt=e=>typeof e==\"function\",Zt=e=>typeof e==\"string\",Mv=e=>typeof e==\"symbol\",Yt=e=>e!==null&&typeof e==\"object\",Av=e=>Yt(e)&&gt(e.then)&&gt(e.catch),t_=Object.prototype.toString,wu=e=>t_.call(e),Xx=e=>wu(e).slice(8,-1),e_=e=>wu(e)===\"[object Object]\",Dv=e=>Zt(e)&&e!==\"NaN\"&&e[0]!==\"-\"&&\"\"+parseInt(e,10)===e,ml=wv(\",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"),bu=e=>{const t=Object.create(null);return r=>t[r]||(t[r]=e(r))},jx=/-(\\w)/g,Ar=bu(e=>e.replace(jx,(t,r)=>r?r.toUpperCase():\"\")),Kx=/\\B([A-Z])/g,Mi=bu(e=>e.replace(Kx,\"-$1\").toLowerCase()),Su=bu(e=>e.charAt(0).toUpperCase()+e.slice(1)),hf=bu(e=>e?`on${Su(e)}`:\"\"),$o=(e,t)=>!Object.is(e,t),yl=(e,t)=>{for(let r=0;r<e.length;r++)e[r](t)},Bl=(e,t,r)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:r})},ya=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let hp;const Zx=()=>hp||(hp=typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:typeof window!=\"undefined\"?window:typeof global!=\"undefined\"?global:{});let Or;class r_{constructor(t=!1){this.active=!0,this.effects=[],this.cleanups=[],!t&&Or&&(this.parent=Or,this.index=(Or.scopes||(Or.scopes=[])).push(this)-1)}run(t){if(this.active)try{return Or=this,t()}finally{Or=this.parent}}on(){Or=this}off(){Or=this.parent}stop(t){if(this.active){let r,n;for(r=0,n=this.effects.length;r<n;r++)this.effects[r].stop();for(r=0,n=this.cleanups.length;r<n;r++)this.cleanups[r]();if(this.scopes)for(r=0,n=this.scopes.length;r<n;r++)this.scopes[r].stop(!0);if(this.parent&&!t){const i=this.parent.scopes.pop();i&&i!==this&&(this.parent.scopes[this.index]=i,i.index=this.index)}this.active=!1}}}function n_(e){return new r_(e)}function Qx(e,t=Or){t&&t.active&&t.effects.push(e)}const Pv=e=>{const t=new Set(e);return t.w=0,t.n=0,t},i_=e=>(e.w&Pn)>0,a_=e=>(e.n&Pn)>0,Jx=({deps:e})=>{if(e.length)for(let t=0;t<e.length;t++)e[t].w|=Pn},tT=e=>{const{deps:t}=e;if(t.length){let r=0;for(let n=0;n<t.length;n++){const i=t[n];i_(i)&&!a_(i)?i.delete(e):t[r++]=i,i.w&=~Pn,i.n&=~Pn}t.length=r}},$c=new WeakMap;let fo=0,Pn=1;const Vc=30;let xr;const pi=Symbol(\"\"),Gc=Symbol(\"\");class Iv{constructor(t,r=null,n){this.fn=t,this.scheduler=r,this.active=!0,this.deps=[],this.parent=void 0,Qx(this,n)}run(){if(!this.active)return this.fn();let t=xr,r=wn;for(;t;){if(t===this)return;t=t.parent}try{return this.parent=xr,xr=this,wn=!0,Pn=1<<++fo,fo<=Vc?Jx(this):vp(this),this.fn()}finally{fo<=Vc&&tT(this),Pn=1<<--fo,xr=this.parent,wn=r,this.parent=void 0}}stop(){this.active&&(vp(this),this.onStop&&this.onStop(),this.active=!1)}}function vp(e){const{deps:t}=e;if(t.length){for(let r=0;r<t.length;r++)t[r].delete(e);t.length=0}}let wn=!0;const o_=[];function La(){o_.push(wn),wn=!1}function Ra(){const e=o_.pop();wn=e===void 0?!0:e}function ke(e,t,r){if(wn&&xr){let n=$c.get(e);n||$c.set(e,n=new Map);let i=n.get(r);i||n.set(r,i=Pv()),s_(i)}}function s_(e,t){let r=!1;fo<=Vc?a_(e)||(e.n|=Pn,r=!i_(e)):r=!e.has(xr),r&&(e.add(xr),xr.deps.push(e))}function Ur(e,t,r,n,i,a){const o=$c.get(e);if(!o)return;let s=[];if(t===\"clear\")s=[...o.values()];else if(r===\"length\"&&at(e))o.forEach((l,u)=>{(u===\"length\"||u>=n)&&s.push(l)});else switch(r!==void 0&&s.push(o.get(r)),t){case\"add\":at(e)?Dv(r)&&s.push(o.get(\"length\")):(s.push(o.get(pi)),fa(e)&&s.push(o.get(Gc)));break;case\"delete\":at(e)||(s.push(o.get(pi)),fa(e)&&s.push(o.get(Gc)));break;case\"set\":fa(e)&&s.push(o.get(pi));break}if(s.length===1)s[0]&&Uc(s[0]);else{const l=[];for(const u of s)u&&l.push(...u);Uc(Pv(l))}}function Uc(e,t){for(const r of at(e)?e:[...e])(r!==xr||r.allowRecurse)&&(r.scheduler?r.scheduler():r.run())}const eT=wv(\"__proto__,__v_isRef,__isVue\"),l_=new Set(Object.getOwnPropertyNames(Symbol).map(e=>Symbol[e]).filter(Mv)),rT=Ev(),nT=Ev(!1,!0),iT=Ev(!0),dp=aT();function aT(){const e={};return[\"includes\",\"indexOf\",\"lastIndexOf\"].forEach(t=>{e[t]=function(...r){const n=Ct(this);for(let a=0,o=this.length;a<o;a++)ke(n,\"get\",a+\"\");const i=n[t](...r);return i===-1||i===!1?n[t](...r.map(Ct)):i}}),[\"push\",\"pop\",\"shift\",\"unshift\",\"splice\"].forEach(t=>{e[t]=function(...r){La();const n=Ct(this)[t].apply(this,r);return Ra(),n}}),e}function Ev(e=!1,t=!1){return function(n,i,a){if(i===\"__v_isReactive\")return!e;if(i===\"__v_isReadonly\")return e;if(i===\"__v_isShallow\")return t;if(i===\"__v_raw\"&&a===(e?t?bT:v_:t?h_:c_).get(n))return n;const o=at(n);if(!e&&o&&Tt(dp,i))return Reflect.get(dp,i,a);const s=Reflect.get(n,i,a);return(Mv(i)?l_.has(i):eT(i))||(e||ke(n,\"get\",i),t)?s:Wt(s)?!o||!Dv(i)?s.value:s:Yt(s)?e?d_(s):Ai(s):s}}const oT=u_(),sT=u_(!0);function u_(e=!1){return function(r,n,i,a){let o=r[n];if(Vo(o)&&Wt(o)&&!Wt(i))return!1;if(!e&&!Vo(i)&&(p_(i)||(i=Ct(i),o=Ct(o)),!at(r)&&Wt(o)&&!Wt(i)))return o.value=i,!0;const s=at(r)&&Dv(n)?Number(n)<r.length:Tt(r,n),l=Reflect.set(r,n,i,a);return r===Ct(a)&&(s?$o(i,o)&&Ur(r,\"set\",n,i):Ur(r,\"add\",n,i)),l}}function lT(e,t){const r=Tt(e,t);e[t];const n=Reflect.deleteProperty(e,t);return n&&r&&Ur(e,\"delete\",t,void 0),n}function uT(e,t){const r=Reflect.has(e,t);return(!Mv(t)||!l_.has(t))&&ke(e,\"has\",t),r}function fT(e){return ke(e,\"iterate\",at(e)?\"length\":pi),Reflect.ownKeys(e)}const f_={get:rT,set:oT,deleteProperty:lT,has:uT,ownKeys:fT},cT={get:iT,set(e,t){return!0},deleteProperty(e,t){return!0}},hT=ie({},f_,{get:nT,set:sT}),Lv=e=>e,xu=e=>Reflect.getPrototypeOf(e);function xs(e,t,r=!1,n=!1){e=e.__v_raw;const i=Ct(e),a=Ct(t);t!==a&&!r&&ke(i,\"get\",t),!r&&ke(i,\"get\",a);const{has:o}=xu(i),s=n?Lv:r?kv:Go;if(o.call(i,t))return s(e.get(t));if(o.call(i,a))return s(e.get(a));e!==i&&e.get(t)}function Ts(e,t=!1){const r=this.__v_raw,n=Ct(r),i=Ct(e);return e!==i&&!t&&ke(n,\"has\",e),!t&&ke(n,\"has\",i),e===i?r.has(e):r.has(e)||r.has(i)}function Cs(e,t=!1){return e=e.__v_raw,!t&&ke(Ct(e),\"iterate\",pi),Reflect.get(e,\"size\",e)}function pp(e){e=Ct(e);const t=Ct(this);return xu(t).has.call(t,e)||(t.add(e),Ur(t,\"add\",e,e)),this}function gp(e,t){t=Ct(t);const r=Ct(this),{has:n,get:i}=xu(r);let a=n.call(r,e);a||(e=Ct(e),a=n.call(r,e));const o=i.call(r,e);return r.set(e,t),a?$o(t,o)&&Ur(r,\"set\",e,t):Ur(r,\"add\",e,t),this}function mp(e){const t=Ct(this),{has:r,get:n}=xu(t);let i=r.call(t,e);i||(e=Ct(e),i=r.call(t,e)),n&&n.call(t,e);const a=t.delete(e);return i&&Ur(t,\"delete\",e,void 0),a}function yp(){const e=Ct(this),t=e.size!==0,r=e.clear();return t&&Ur(e,\"clear\",void 0,void 0),r}function Ms(e,t){return function(n,i){const a=this,o=a.__v_raw,s=Ct(o),l=t?Lv:e?kv:Go;return!e&&ke(s,\"iterate\",pi),o.forEach((u,f)=>n.call(i,l(u),l(f),a))}}function As(e,t,r){return function(...n){const i=this.__v_raw,a=Ct(i),o=fa(a),s=e===\"entries\"||e===Symbol.iterator&&o,l=e===\"keys\"&&o,u=i[e](...n),f=r?Lv:t?kv:Go;return!t&&ke(a,\"iterate\",l?Gc:pi),{next(){const{value:c,done:v}=u.next();return v?{value:c,done:v}:{value:s?[f(c[0]),f(c[1])]:f(c),done:v}},[Symbol.iterator](){return this}}}}function Zr(e){return function(...t){return e===\"delete\"?!1:this}}function vT(){const e={get(a){return xs(this,a)},get size(){return Cs(this)},has:Ts,add:pp,set:gp,delete:mp,clear:yp,forEach:Ms(!1,!1)},t={get(a){return xs(this,a,!1,!0)},get size(){return Cs(this)},has:Ts,add:pp,set:gp,delete:mp,clear:yp,forEach:Ms(!1,!0)},r={get(a){return xs(this,a,!0)},get size(){return Cs(this,!0)},has(a){return Ts.call(this,a,!0)},add:Zr(\"add\"),set:Zr(\"set\"),delete:Zr(\"delete\"),clear:Zr(\"clear\"),forEach:Ms(!0,!1)},n={get(a){return xs(this,a,!0,!0)},get size(){return Cs(this,!0)},has(a){return Ts.call(this,a,!0)},add:Zr(\"add\"),set:Zr(\"set\"),delete:Zr(\"delete\"),clear:Zr(\"clear\"),forEach:Ms(!0,!0)};return[\"keys\",\"values\",\"entries\",Symbol.iterator].forEach(a=>{e[a]=As(a,!1,!1),r[a]=As(a,!0,!1),t[a]=As(a,!1,!0),n[a]=As(a,!0,!0)}),[e,r,t,n]}const[dT,pT,gT,mT]=vT();function Rv(e,t){const r=t?e?mT:gT:e?pT:dT;return(n,i,a)=>i===\"__v_isReactive\"?!e:i===\"__v_isReadonly\"?e:i===\"__v_raw\"?n:Reflect.get(Tt(r,i)&&i in n?r:n,i,a)}const yT={get:Rv(!1,!1)},_T={get:Rv(!1,!0)},wT={get:Rv(!0,!1)},c_=new WeakMap,h_=new WeakMap,v_=new WeakMap,bT=new WeakMap;function ST(e){switch(e){case\"Object\":case\"Array\":return 1;case\"Map\":case\"Set\":case\"WeakMap\":case\"WeakSet\":return 2;default:return 0}}function xT(e){return e.__v_skip||!Object.isExtensible(e)?0:ST(Xx(e))}function Ai(e){return Vo(e)?e:Ov(e,!1,f_,yT,c_)}function TT(e){return Ov(e,!1,hT,_T,h_)}function d_(e){return Ov(e,!0,cT,wT,v_)}function Ov(e,t,r,n,i){if(!Yt(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const a=i.get(e);if(a)return a;const o=xT(e);if(o===0)return e;const s=new Proxy(e,o===2?n:r);return i.set(e,s),s}function bn(e){return Vo(e)?bn(e.__v_raw):!!(e&&e.__v_isReactive)}function Vo(e){return!!(e&&e.__v_isReadonly)}function p_(e){return!!(e&&e.__v_isShallow)}function g_(e){return bn(e)||Vo(e)}function Ct(e){const t=e&&e.__v_raw;return t?Ct(t):e}function _a(e){return Bl(e,\"__v_skip\",!0),e}const Go=e=>Yt(e)?Ai(e):e,kv=e=>Yt(e)?d_(e):e;function m_(e){wn&&xr&&(e=Ct(e),s_(e.dep||(e.dep=Pv())))}function y_(e,t){e=Ct(e),e.dep&&Uc(e.dep)}function Wt(e){return!!(e&&e.__v_isRef===!0)}function wa(e){return __(e,!1)}function CT(e){return __(e,!0)}function __(e,t){return Wt(e)?e:new MT(e,t)}class MT{constructor(t,r){this.__v_isShallow=r,this.dep=void 0,this.__v_isRef=!0,this._rawValue=r?t:Ct(t),this._value=r?t:Go(t)}get value(){return m_(this),this._value}set value(t){t=this.__v_isShallow?t:Ct(t),$o(t,this._rawValue)&&(this._rawValue=t,this._value=this.__v_isShallow?t:Go(t),y_(this))}}function wo(e){return Wt(e)?e.value:e}const AT={get:(e,t,r)=>wo(Reflect.get(e,t,r)),set:(e,t,r,n)=>{const i=e[t];return Wt(i)&&!Wt(r)?(i.value=r,!0):Reflect.set(e,t,r,n)}};function w_(e){return bn(e)?e:new Proxy(e,AT)}function DT(e){const t=at(e)?new Array(e.length):{};for(const r in e)t[r]=IT(e,r);return t}class PT{constructor(t,r,n){this._object=t,this._key=r,this._defaultValue=n,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}}function IT(e,t,r){const n=e[t];return Wt(n)?n:new PT(e,t,r)}class ET{constructor(t,r,n,i){this._setter=r,this.dep=void 0,this.__v_isRef=!0,this._dirty=!0,this.effect=new Iv(t,()=>{this._dirty||(this._dirty=!0,y_(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!i,this.__v_isReadonly=n}get value(){const t=Ct(this);return m_(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function LT(e,t,r=!1){let n,i;const a=gt(e);return a?(n=e,i=fr):(n=e.get,i=e.set),new ET(n,i,a||!i,r)}Promise.resolve();function Sn(e,t,r,n){let i;try{i=n?e(...n):e()}catch(a){hs(a,t,r)}return i}function Qe(e,t,r,n){if(gt(e)){const a=Sn(e,t,r,n);return a&&Av(a)&&a.catch(o=>{hs(o,t,r)}),a}const i=[];for(let a=0;a<e.length;a++)i.push(Qe(e[a],t,r,n));return i}function hs(e,t,r,n=!0){const i=t?t.vnode:null;if(t){let a=t.parent;const o=t.proxy,s=r;for(;a;){const u=a.ec;if(u){for(let f=0;f<u.length;f++)if(u[f](e,o,s)===!1)return}a=a.parent}const l=t.appContext.config.errorHandler;if(l){Sn(l,null,10,[e,o,s]);return}}RT(e,r,i,n)}function RT(e,t,r,n=!0){console.error(e)}let Fl=!1,Wc=!1;const Ie=[];let Br=0;const bo=[];let co=null,Ji=0;const So=[];let cn=null,ta=0;const b_=Promise.resolve();let Nv=null,Yc=null;function Bv(e){const t=Nv||b_;return e?t.then(this?e.bind(this):e):t}function OT(e){let t=Br+1,r=Ie.length;for(;t<r;){const n=t+r>>>1;Uo(Ie[n])<e?t=n+1:r=n}return t}function S_(e){(!Ie.length||!Ie.includes(e,Fl&&e.allowRecurse?Br+1:Br))&&e!==Yc&&(e.id==null?Ie.push(e):Ie.splice(OT(e.id),0,e),x_())}function x_(){!Fl&&!Wc&&(Wc=!0,Nv=b_.then(A_))}function kT(e){const t=Ie.indexOf(e);t>Br&&Ie.splice(t,1)}function T_(e,t,r,n){at(e)?r.push(...e):(!t||!t.includes(e,e.allowRecurse?n+1:n))&&r.push(e),x_()}function NT(e){T_(e,co,bo,Ji)}function C_(e){T_(e,cn,So,ta)}function Fv(e,t=null){if(bo.length){for(Yc=t,co=[...new Set(bo)],bo.length=0,Ji=0;Ji<co.length;Ji++)co[Ji]();co=null,Ji=0,Yc=null,Fv(e,t)}}function M_(e){if(So.length){const t=[...new Set(So)];if(So.length=0,cn){cn.push(...t);return}for(cn=t,cn.sort((r,n)=>Uo(r)-Uo(n)),ta=0;ta<cn.length;ta++)cn[ta]();cn=null,ta=0}}const Uo=e=>e.id==null?1/0:e.id;function A_(e){Wc=!1,Fl=!0,Fv(e),Ie.sort((r,n)=>Uo(r)-Uo(n));const t=fr;try{for(Br=0;Br<Ie.length;Br++){const r=Ie[Br];r&&r.active!==!1&&Sn(r,null,14)}}finally{Br=0,Ie.length=0,M_(),Fl=!1,Nv=null,(Ie.length||bo.length||So.length)&&A_(e)}}function BT(e,t,...r){const n=e.vnode.props||Rt;let i=r;const a=t.startsWith(\"update:\"),o=a&&t.slice(7);if(o&&o in n){const f=`${o===\"modelValue\"?\"model\":o}Modifiers`,{number:c,trim:v}=n[f]||Rt;v?i=r.map(h=>h.trim()):c&&(i=r.map(ya))}let s,l=n[s=hf(t)]||n[s=hf(Ar(t))];!l&&a&&(l=n[s=hf(Mi(t))]),l&&Qe(l,e,6,i);const u=n[s+\"Once\"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[s])return;e.emitted[s]=!0,Qe(u,e,6,i)}}function D_(e,t,r=!1){const n=t.emitsCache,i=n.get(e);if(i!==void 0)return i;const a=e.emits;let o={},s=!1;if(!gt(e)){const l=u=>{const f=D_(u,t,!0);f&&(s=!0,ie(o,f))};!r&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!a&&!s?(n.set(e,null),null):(at(a)?a.forEach(l=>o[l]=null):ie(o,a),n.set(e,o),o)}function zv(e,t){return!e||!_u(t)?!1:(t=t.slice(2).replace(/Once$/,\"\"),Tt(e,t[0].toLowerCase()+t.slice(1))||Tt(e,Mi(t))||Tt(e,t))}let Re=null,Tu=null;function zl(e){const t=Re;return Re=e,Tu=e&&e.type.__scopeId||null,t}function Ez(e){Tu=e}function Lz(){Tu=null}function FT(e,t=Re,r){if(!t||e._n)return e;const n=(...i)=>{n._d&&Ip(-1);const a=zl(t),o=e(...i);return zl(a),n._d&&Ip(1),o};return n._n=!0,n._c=!0,n._d=!0,n}function vf(e){const{type:t,vnode:r,proxy:n,withProxy:i,props:a,propsOptions:[o],slots:s,attrs:l,emit:u,render:f,renderCache:c,data:v,setupState:h,ctx:d,inheritAttrs:p}=e;let g,m;const y=zl(e);try{if(r.shapeFlag&4){const w=i||n;g=lr(f.call(w,w,c,a,h,v,d)),m=l}else{const w=t;g=lr(w.length>1?w(a,{attrs:l,slots:s,emit:u}):w(a,null)),m=t.props?l:HT(l)}}catch(w){To.length=0,hs(w,e,1),g=fe(Ne)}let _=g;if(m&&p!==!1){const w=Object.keys(m),{shapeFlag:S}=_;w.length&&S&7&&(o&&w.some(Tv)&&(m=$T(m,o)),_=ba(_,m))}return r.dirs&&(_.dirs=_.dirs?_.dirs.concat(r.dirs):r.dirs),r.transition&&(_.transition=r.transition),g=_,zl(y),g}function zT(e){let t;for(let r=0;r<e.length;r++){const n=e[r];if(qo(n)){if(n.type!==Ne||n.children===\"v-if\"){if(t)return;t=n}}else return}return t}const HT=e=>{let t;for(const r in e)(r===\"class\"||r===\"style\"||_u(r))&&((t||(t={}))[r]=e[r]);return t},$T=(e,t)=>{const r={};for(const n in e)(!Tv(n)||!(n.slice(9)in t))&&(r[n]=e[n]);return r};function VT(e,t,r){const{props:n,children:i,component:a}=e,{props:o,children:s,patchFlag:l}=t,u=a.emitsOptions;if(t.dirs||t.transition)return!0;if(r&&l>=0){if(l&1024)return!0;if(l&16)return n?_p(n,o,u):!!o;if(l&8){const f=t.dynamicProps;for(let c=0;c<f.length;c++){const v=f[c];if(o[v]!==n[v]&&!zv(u,v))return!0}}}else return(i||s)&&(!s||!s.$stable)?!0:n===o?!1:n?o?_p(n,o,u):!0:!!o;return!1}function _p(e,t,r){const n=Object.keys(t);if(n.length!==Object.keys(e).length)return!0;for(let i=0;i<n.length;i++){const a=n[i];if(t[a]!==e[a]&&!zv(r,a))return!0}return!1}function Hv({vnode:e,parent:t},r){for(;t&&t.subTree===e;)(e=t.vnode).el=r,t=t.parent}const GT=e=>e.__isSuspense,UT={name:\"Suspense\",__isSuspense:!0,process(e,t,r,n,i,a,o,s,l,u){e==null?WT(t,r,n,i,a,o,s,l,u):YT(e,t,r,n,i,o,s,l,u)},hydrate:qT,create:$v,normalize:XT},Rz=UT;function Wo(e,t){const r=e.props&&e.props[t];gt(r)&&r()}function WT(e,t,r,n,i,a,o,s,l){const{p:u,o:{createElement:f}}=l,c=f(\"div\"),v=e.suspense=$v(e,i,n,t,c,r,a,o,s,l);u(null,v.pendingBranch=e.ssContent,c,null,n,v,a,o),v.deps>0?(Wo(e,\"onPending\"),Wo(e,\"onFallback\"),u(null,e.ssFallback,t,r,n,null,a,o),ca(v,e.ssFallback)):v.resolve()}function YT(e,t,r,n,i,a,o,s,{p:l,um:u,o:{createElement:f}}){const c=t.suspense=e.suspense;c.vnode=t,t.el=e.el;const v=t.ssContent,h=t.ssFallback,{activeBranch:d,pendingBranch:p,isInFallback:g,isHydrating:m}=c;if(p)c.pendingBranch=v,wr(v,p)?(l(p,v,c.hiddenContainer,null,i,c,a,o,s),c.deps<=0?c.resolve():g&&(l(d,h,r,n,i,null,a,o,s),ca(c,h))):(c.pendingId++,m?(c.isHydrating=!1,c.activeBranch=p):u(p,i,c),c.deps=0,c.effects.length=0,c.hiddenContainer=f(\"div\"),g?(l(null,v,c.hiddenContainer,null,i,c,a,o,s),c.deps<=0?c.resolve():(l(d,h,r,n,i,null,a,o,s),ca(c,h))):d&&wr(v,d)?(l(d,v,r,n,i,c,a,o,s),c.resolve(!0)):(l(null,v,c.hiddenContainer,null,i,c,a,o,s),c.deps<=0&&c.resolve()));else if(d&&wr(v,d))l(d,v,r,n,i,c,a,o,s),ca(c,v);else if(Wo(t,\"onPending\"),c.pendingBranch=v,c.pendingId++,l(null,v,c.hiddenContainer,null,i,c,a,o,s),c.deps<=0)c.resolve();else{const{timeout:y,pendingId:_}=c;y>0?setTimeout(()=>{c.pendingId===_&&c.fallback(h)},y):y===0&&c.fallback(h)}}function $v(e,t,r,n,i,a,o,s,l,u,f=!1){const{p:c,m:v,um:h,n:d,o:{parentNode:p,remove:g}}=u,m=ya(e.props&&e.props.timeout),y={vnode:e,parent:t,parentComponent:r,isSVG:o,container:n,hiddenContainer:i,anchor:a,deps:0,pendingId:0,timeout:typeof m==\"number\"?m:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:f,isUnmounted:!1,effects:[],resolve(_=!1){const{vnode:w,activeBranch:S,pendingBranch:b,pendingId:x,effects:T,parentComponent:C,container:D}=y;if(y.isHydrating)y.isHydrating=!1;else if(!_){const L=S&&b.transition&&b.transition.mode===\"out-in\";L&&(S.transition.afterLeave=()=>{x===y.pendingId&&v(b,D,O,0)});let{anchor:O}=y;S&&(O=d(S),h(S,C,y,!0)),L||v(b,D,O,0)}ca(y,b),y.pendingBranch=null,y.isInFallback=!1;let P=y.parent,A=!1;for(;P;){if(P.pendingBranch){P.effects.push(...T),A=!0;break}P=P.parent}A||C_(T),y.effects=[],Wo(w,\"onResolve\")},fallback(_){if(!y.pendingBranch)return;const{vnode:w,activeBranch:S,parentComponent:b,container:x,isSVG:T}=y;Wo(w,\"onFallback\");const C=d(S),D=()=>{!y.isInFallback||(c(null,_,x,C,b,null,T,s,l),ca(y,_))},P=_.transition&&_.transition.mode===\"out-in\";P&&(S.transition.afterLeave=D),y.isInFallback=!0,h(S,b,null,!0),P||D()},move(_,w,S){y.activeBranch&&v(y.activeBranch,_,w,S),y.container=_},next(){return y.activeBranch&&d(y.activeBranch)},registerDep(_,w){const S=!!y.pendingBranch;S&&y.deps++;const b=_.vnode.el;_.asyncDep.catch(x=>{hs(x,_,0)}).then(x=>{if(_.isUnmounted||y.isUnmounted||y.pendingId!==_.suspenseId)return;_.asyncResolved=!0;const{vnode:T}=_;eh(_,x,!1),b&&(T.el=b);const C=!b&&_.subTree.el;w(_,T,p(b||_.subTree.el),b?null:d(_.subTree),y,o,l),C&&g(C),Hv(_,T.el),S&&--y.deps===0&&y.resolve()})},unmount(_,w){y.isUnmounted=!0,y.activeBranch&&h(y.activeBranch,r,_,w),y.pendingBranch&&h(y.pendingBranch,r,_,w)}};return y}function qT(e,t,r,n,i,a,o,s,l){const u=t.suspense=$v(t,n,r,e.parentNode,document.createElement(\"div\"),null,i,a,o,s,!0),f=l(e,u.pendingBranch=t.ssContent,r,u,a,o);return u.deps===0&&u.resolve(),f}function XT(e){const{shapeFlag:t,children:r}=e,n=t&32;e.ssContent=wp(n?r.default:r),e.ssFallback=n?wp(r.fallback):fe(Ne)}function wp(e){let t;if(gt(e)){const r=Yo&&e._c;r&&(e._d=!1,qv()),e=e(),r&&(e._d=!0,t=xn,Y_())}return at(e)&&(e=zT(e)),e=lr(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(r=>r!==e)),e}function jT(e,t){t&&t.pendingBranch?at(e)?t.effects.push(...e):t.effects.push(e):C_(e)}function ca(e,t){e.activeBranch=t;const{vnode:r,parentComponent:n}=e,i=r.el=t.el;n&&n.subTree===r&&(n.vnode.el=i,Hv(n,i))}function _l(e,t){if(Jt){let r=Jt.provides;const n=Jt.parent&&Jt.parent.provides;n===r&&(r=Jt.provides=Object.create(n)),r[e]=t}}function Je(e,t,r=!1){const n=Jt||Re;if(n){const i=n.parent==null?n.vnode.appContext&&n.vnode.appContext.provides:n.parent.provides;if(i&&e in i)return i[e];if(arguments.length>1)return r&&gt(t)?t.call(n.proxy):t}}function KT(e,t){return Vv(e,null,{flush:\"post\"})}const bp={};function ha(e,t,r){return Vv(e,t,r)}function Vv(e,t,{immediate:r,deep:n,flush:i,onTrack:a,onTrigger:o}=Rt){const s=Jt;let l,u=!1,f=!1;if(Wt(e)?(l=()=>e.value,u=p_(e)):bn(e)?(l=()=>e,n=!0):at(e)?(f=!0,u=e.some(bn),l=()=>e.map(m=>{if(Wt(m))return m.value;if(bn(m))return hi(m);if(gt(m))return Sn(m,s,2)})):gt(e)?t?l=()=>Sn(e,s,2):l=()=>{if(!(s&&s.isUnmounted))return c&&c(),Qe(e,s,3,[v])}:l=fr,t&&n){const m=l;l=()=>hi(m())}let c,v=m=>{c=g.onStop=()=>{Sn(m,s,4)}};if(Xo)return v=fr,t?r&&Qe(t,s,3,[l(),f?[]:void 0,v]):l(),fr;let h=f?[]:bp;const d=()=>{if(!!g.active)if(t){const m=g.run();(n||u||(f?m.some((y,_)=>$o(y,h[_])):$o(m,h)))&&(c&&c(),Qe(t,s,3,[m,h===bp?void 0:h,v]),h=m)}else g.run()};d.allowRecurse=!!t;let p;i===\"sync\"?p=d:i===\"post\"?p=()=>be(d,s&&s.suspense):p=()=>{!s||s.isMounted?NT(d):d()};const g=new Iv(l,p);return t?r?d():h=g.run():i===\"post\"?be(g.run.bind(g),s&&s.suspense):g.run(),()=>{g.stop(),s&&s.scope&&Cv(s.scope.effects,g)}}function ZT(e,t,r){const n=this.proxy,i=Zt(e)?e.includes(\".\")?P_(n,e):()=>n[e]:e.bind(n,n);let a;gt(t)?a=t:(a=t.handler,r=t);const o=Jt;In(this);const s=Vv(i,a.bind(n),r);return o?In(o):Tn(),s}function P_(e,t){const r=t.split(\".\");return()=>{let n=e;for(let i=0;i<r.length&&n;i++)n=n[r[i]];return n}}function hi(e,t){if(!Yt(e)||e.__v_skip||(t=t||new Set,t.has(e)))return e;if(t.add(e),Wt(e))hi(e.value,t);else if(at(e))for(let r=0;r<e.length;r++)hi(e[r],t);else if(Ea(e)||fa(e))e.forEach(r=>{hi(r,t)});else if(e_(e))for(const r in e)hi(e[r],t);return e}function QT(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return Au(()=>{e.isMounted=!0}),O_(()=>{e.isUnmounting=!0}),e}const ze=[Function,Array],JT={name:\"BaseTransition\",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:ze,onEnter:ze,onAfterEnter:ze,onEnterCancelled:ze,onBeforeLeave:ze,onLeave:ze,onAfterLeave:ze,onLeaveCancelled:ze,onBeforeAppear:ze,onAppear:ze,onAfterAppear:ze,onAppearCancelled:ze},setup(e,{slots:t}){const r=Oa(),n=QT();let i;return()=>{const a=t.default&&L_(t.default(),!0);if(!a||!a.length)return;const o=Ct(e),{mode:s}=o,l=a[0];if(n.isLeaving)return df(l);const u=Sp(l);if(!u)return df(l);const f=qc(u,o,n,r);Xc(u,f);const c=r.subTree,v=c&&Sp(c);let h=!1;const{getTransitionKey:d}=u.type;if(d){const p=d();i===void 0?i=p:p!==i&&(i=p,h=!0)}if(v&&v.type!==Ne&&(!wr(u,v)||h)){const p=qc(v,o,n,r);if(Xc(v,p),s===\"out-in\")return n.isLeaving=!0,p.afterLeave=()=>{n.isLeaving=!1,r.update()},df(l);s===\"in-out\"&&u.type!==Ne&&(p.delayLeave=(g,m,y)=>{const _=E_(n,v);_[String(v.key)]=v,g._leaveCb=()=>{m(),g._leaveCb=void 0,delete f.delayedLeave},f.delayedLeave=y})}return l}}},I_=JT;function E_(e,t){const{leavingVNodes:r}=e;let n=r.get(t.type);return n||(n=Object.create(null),r.set(t.type,n)),n}function qc(e,t,r,n){const{appear:i,mode:a,persisted:o=!1,onBeforeEnter:s,onEnter:l,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:c,onLeave:v,onAfterLeave:h,onLeaveCancelled:d,onBeforeAppear:p,onAppear:g,onAfterAppear:m,onAppearCancelled:y}=t,_=String(e.key),w=E_(r,e),S=(x,T)=>{x&&Qe(x,n,9,T)},b={mode:a,persisted:o,beforeEnter(x){let T=s;if(!r.isMounted)if(i)T=p||s;else return;x._leaveCb&&x._leaveCb(!0);const C=w[_];C&&wr(e,C)&&C.el._leaveCb&&C.el._leaveCb(),S(T,[x])},enter(x){let T=l,C=u,D=f;if(!r.isMounted)if(i)T=g||l,C=m||u,D=y||f;else return;let P=!1;const A=x._enterCb=L=>{P||(P=!0,L?S(D,[x]):S(C,[x]),b.delayedLeave&&b.delayedLeave(),x._enterCb=void 0)};T?(T(x,A),T.length<=1&&A()):A()},leave(x,T){const C=String(e.key);if(x._enterCb&&x._enterCb(!0),r.isUnmounting)return T();S(c,[x]);let D=!1;const P=x._leaveCb=A=>{D||(D=!0,T(),A?S(d,[x]):S(h,[x]),x._leaveCb=void 0,w[C]===e&&delete w[C])};w[C]=e,v?(v(x,P),v.length<=1&&P()):P()},clone(x){return qc(x,t,r,n)}};return b}function df(e){if(Cu(e))return e=ba(e),e.children=null,e}function Sp(e){return Cu(e)?e.children?e.children[0]:void 0:e}function Xc(e,t){e.shapeFlag&6&&e.component?Xc(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function L_(e,t=!1){let r=[],n=0;for(let i=0;i<e.length;i++){const a=e[i];a.type===Pe?(a.patchFlag&128&&n++,r=r.concat(L_(a.children,t))):(t||a.type!==Ne)&&r.push(a)}if(n>1)for(let i=0;i<r.length;i++)r[i].patchFlag=-2;return r}function Gv(e){return gt(e)?{setup:e,name:e.name}:e}const jc=e=>!!e.type.__asyncLoader,Cu=e=>e.type.__isKeepAlive;function tC(e,t){R_(e,\"a\",t)}function eC(e,t){R_(e,\"da\",t)}function R_(e,t,r=Jt){const n=e.__wdc||(e.__wdc=()=>{let i=r;for(;i;){if(i.isDeactivated)return;i=i.parent}return e()});if(Mu(t,n,r),r){let i=r.parent;for(;i&&i.parent;)Cu(i.parent.vnode)&&rC(n,t,r,i),i=i.parent}}function rC(e,t,r,n){const i=Mu(t,e,n,!0);Du(()=>{Cv(n[t],i)},r)}function Mu(e,t,r=Jt,n=!1){if(r){const i=r[e]||(r[e]=[]),a=t.__weh||(t.__weh=(...o)=>{if(r.isUnmounted)return;La(),In(r);const s=Qe(t,r,e,o);return Tn(),Ra(),s});return n?i.unshift(a):i.push(a),a}}const Xr=e=>(t,r=Jt)=>(!Xo||e===\"sp\")&&Mu(e,t,r),nC=Xr(\"bm\"),Au=Xr(\"m\"),iC=Xr(\"bu\"),aC=Xr(\"u\"),O_=Xr(\"bum\"),Du=Xr(\"um\"),oC=Xr(\"sp\"),sC=Xr(\"rtg\"),lC=Xr(\"rtc\");function uC(e,t=Jt){Mu(\"ec\",e,t)}let Kc=!0;function fC(e){const t=N_(e),r=e.proxy,n=e.ctx;Kc=!1,t.beforeCreate&&xp(t.beforeCreate,e,\"bc\");const{data:i,computed:a,methods:o,watch:s,provide:l,inject:u,created:f,beforeMount:c,mounted:v,beforeUpdate:h,updated:d,activated:p,deactivated:g,beforeDestroy:m,beforeUnmount:y,destroyed:_,unmounted:w,render:S,renderTracked:b,renderTriggered:x,errorCaptured:T,serverPrefetch:C,expose:D,inheritAttrs:P,components:A,directives:L,filters:O}=t;if(u&&cC(u,n,null,e.appContext.config.unwrapInjectedRef),o)for(const tt in o){const V=o[tt];gt(V)&&(n[tt]=V.bind(r))}if(i){const tt=i.call(r,r);Yt(tt)&&(e.data=Ai(tt))}if(Kc=!0,a)for(const tt in a){const V=a[tt],K=gt(V)?V.bind(r,r):gt(V.get)?V.get.bind(r,r):fr,lt=!gt(V)&&gt(V.set)?V.set.bind(r):fr,yt=Ee({get:K,set:lt});Object.defineProperty(n,tt,{enumerable:!0,configurable:!0,get:()=>yt.value,set:ut=>yt.value=ut})}if(s)for(const tt in s)k_(s[tt],n,r,tt);if(l){const tt=gt(l)?l.call(r):l;Reflect.ownKeys(tt).forEach(V=>{_l(V,tt[V])})}f&&xp(f,e,\"c\");function N(tt,V){at(V)?V.forEach(K=>tt(K.bind(r))):V&&tt(V.bind(r))}if(N(nC,c),N(Au,v),N(iC,h),N(aC,d),N(tC,p),N(eC,g),N(uC,T),N(lC,b),N(sC,x),N(O_,y),N(Du,w),N(oC,C),at(D))if(D.length){const tt=e.exposed||(e.exposed={});D.forEach(V=>{Object.defineProperty(tt,V,{get:()=>r[V],set:K=>r[V]=K})})}else e.exposed||(e.exposed={});S&&e.render===fr&&(e.render=S),P!=null&&(e.inheritAttrs=P),A&&(e.components=A),L&&(e.directives=L)}function cC(e,t,r=fr,n=!1){at(e)&&(e=Zc(e));for(const i in e){const a=e[i];let o;Yt(a)?\"default\"in a?o=Je(a.from||i,a.default,!0):o=Je(a.from||i):o=Je(a),Wt(o)&&n?Object.defineProperty(t,i,{enumerable:!0,configurable:!0,get:()=>o.value,set:s=>o.value=s}):t[i]=o}}function xp(e,t,r){Qe(at(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,r)}function k_(e,t,r,n){const i=n.includes(\".\")?P_(r,n):()=>r[n];if(Zt(e)){const a=t[e];gt(a)&&ha(i,a)}else if(gt(e))ha(i,e.bind(r));else if(Yt(e))if(at(e))e.forEach(a=>k_(a,t,r,n));else{const a=gt(e.handler)?e.handler.bind(r):t[e.handler];gt(a)&&ha(i,a,e)}}function N_(e){const t=e.type,{mixins:r,extends:n}=t,{mixins:i,optionsCache:a,config:{optionMergeStrategies:o}}=e.appContext,s=a.get(t);let l;return s?l=s:!i.length&&!r&&!n?l=t:(l={},i.length&&i.forEach(u=>Hl(l,u,o,!0)),Hl(l,t,o)),a.set(t,l),l}function Hl(e,t,r,n=!1){const{mixins:i,extends:a}=t;a&&Hl(e,a,r,!0),i&&i.forEach(o=>Hl(e,o,r,!0));for(const o in t)if(!(n&&o===\"expose\")){const s=hC[o]||r&&r[o];e[o]=s?s(e[o],t[o]):t[o]}return e}const hC={data:Tp,props:li,emits:li,methods:li,computed:li,beforeCreate:ve,created:ve,beforeMount:ve,mounted:ve,beforeUpdate:ve,updated:ve,beforeDestroy:ve,beforeUnmount:ve,destroyed:ve,unmounted:ve,activated:ve,deactivated:ve,errorCaptured:ve,serverPrefetch:ve,components:li,directives:li,watch:dC,provide:Tp,inject:vC};function Tp(e,t){return t?e?function(){return ie(gt(e)?e.call(this,this):e,gt(t)?t.call(this,this):t)}:t:e}function vC(e,t){return li(Zc(e),Zc(t))}function Zc(e){if(at(e)){const t={};for(let r=0;r<e.length;r++)t[e[r]]=e[r];return t}return e}function ve(e,t){return e?[...new Set([].concat(e,t))]:t}function li(e,t){return e?ie(ie(Object.create(null),e),t):t}function dC(e,t){if(!e)return t;if(!t)return e;const r=ie(Object.create(null),e);for(const n in t)r[n]=ve(e[n],t[n]);return r}function pC(e,t,r,n=!1){const i={},a={};Bl(a,Pu,1),e.propsDefaults=Object.create(null),B_(e,t,i,a);for(const o in e.propsOptions[0])o in i||(i[o]=void 0);r?e.props=n?i:TT(i):e.type.props?e.props=i:e.props=a,e.attrs=a}function gC(e,t,r,n){const{props:i,attrs:a,vnode:{patchFlag:o}}=e,s=Ct(i),[l]=e.propsOptions;let u=!1;if((n||o>0)&&!(o&16)){if(o&8){const f=e.vnode.dynamicProps;for(let c=0;c<f.length;c++){let v=f[c];const h=t[v];if(l)if(Tt(a,v))h!==a[v]&&(a[v]=h,u=!0);else{const d=Ar(v);i[d]=Qc(l,s,d,h,e,!1)}else h!==a[v]&&(a[v]=h,u=!0)}}}else{B_(e,t,i,a)&&(u=!0);let f;for(const c in s)(!t||!Tt(t,c)&&((f=Mi(c))===c||!Tt(t,f)))&&(l?r&&(r[c]!==void 0||r[f]!==void 0)&&(i[c]=Qc(l,s,c,void 0,e,!0)):delete i[c]);if(a!==s)for(const c in a)(!t||!Tt(t,c)&&!0)&&(delete a[c],u=!0)}u&&Ur(e,\"set\",\"$attrs\")}function B_(e,t,r,n){const[i,a]=e.propsOptions;let o=!1,s;if(t)for(let l in t){if(ml(l))continue;const u=t[l];let f;i&&Tt(i,f=Ar(l))?!a||!a.includes(f)?r[f]=u:(s||(s={}))[f]=u:zv(e.emitsOptions,l)||(!(l in n)||u!==n[l])&&(n[l]=u,o=!0)}if(a){const l=Ct(r),u=s||Rt;for(let f=0;f<a.length;f++){const c=a[f];r[c]=Qc(i,l,c,u[c],e,!Tt(u,c))}}return o}function Qc(e,t,r,n,i,a){const o=e[r];if(o!=null){const s=Tt(o,\"default\");if(s&&n===void 0){const l=o.default;if(o.type!==Function&&gt(l)){const{propsDefaults:u}=i;r in u?n=u[r]:(In(i),n=u[r]=l.call(null,t),Tn())}else n=l}o[0]&&(a&&!s?n=!1:o[1]&&(n===\"\"||n===Mi(r))&&(n=!0))}return n}function F_(e,t,r=!1){const n=t.propsCache,i=n.get(e);if(i)return i;const a=e.props,o={},s=[];let l=!1;if(!gt(e)){const f=c=>{l=!0;const[v,h]=F_(c,t,!0);ie(o,v),h&&s.push(...h)};!r&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!a&&!l)return n.set(e,ua),ua;if(at(a))for(let f=0;f<a.length;f++){const c=Ar(a[f]);Cp(c)&&(o[c]=Rt)}else if(a)for(const f in a){const c=Ar(f);if(Cp(c)){const v=a[f],h=o[c]=at(v)||gt(v)?{type:v}:v;if(h){const d=Dp(Boolean,h.type),p=Dp(String,h.type);h[0]=d>-1,h[1]=p<0||d<p,(d>-1||Tt(h,\"default\"))&&s.push(c)}}}const u=[o,s];return n.set(e,u),u}function Cp(e){return e[0]!==\"$\"}function Mp(e){const t=e&&e.toString().match(/^\\s*function (\\w+)/);return t?t[1]:e===null?\"null\":\"\"}function Ap(e,t){return Mp(e)===Mp(t)}function Dp(e,t){return at(t)?t.findIndex(r=>Ap(r,e)):gt(t)&&Ap(t,e)?0:-1}const z_=e=>e[0]===\"_\"||e===\"$stable\",Uv=e=>at(e)?e.map(lr):[lr(e)],mC=(e,t,r)=>{const n=FT((...i)=>Uv(t(...i)),r);return n._c=!1,n},H_=(e,t,r)=>{const n=e._ctx;for(const i in e){if(z_(i))continue;const a=e[i];if(gt(a))t[i]=mC(i,a,n);else if(a!=null){const o=Uv(a);t[i]=()=>o}}},$_=(e,t)=>{const r=Uv(t);e.slots.default=()=>r},yC=(e,t)=>{if(e.vnode.shapeFlag&32){const r=t._;r?(e.slots=Ct(t),Bl(t,\"_\",r)):H_(t,e.slots={})}else e.slots={},t&&$_(e,t);Bl(e.slots,Pu,1)},_C=(e,t,r)=>{const{vnode:n,slots:i}=e;let a=!0,o=Rt;if(n.shapeFlag&32){const s=t._;s?r&&s===1?a=!1:(ie(i,t),!r&&s===1&&delete i._):(a=!t.$stable,H_(t,i)),o=t}else t&&($_(e,t),o={default:1});if(a)for(const s in i)!z_(s)&&!(s in o)&&delete i[s]};function Oz(e,t){const r=Re;if(r===null)return e;const n=r.proxy,i=e.dirs||(e.dirs=[]);for(let a=0;a<t.length;a++){let[o,s,l,u=Rt]=t[a];gt(o)&&(o={mounted:o,updated:o}),o.deep&&hi(s),i.push({dir:o,instance:n,value:s,oldValue:void 0,arg:l,modifiers:u})}return e}function Nn(e,t,r,n){const i=e.dirs,a=t&&t.dirs;for(let o=0;o<i.length;o++){const s=i[o];a&&(s.oldValue=a[o].value);let l=s.dir[n];l&&(La(),Qe(l,r,8,[e.el,s,e,t]),Ra())}}function V_(){return{app:null,config:{isNativeTag:Wx,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let wC=0;function bC(e,t){return function(n,i=null){i!=null&&!Yt(i)&&(i=null);const a=V_(),o=new Set;let s=!1;const l=a.app={_uid:wC++,_component:n,_props:i,_container:null,_context:a,_instance:null,version:HC,get config(){return a.config},set config(u){},use(u,...f){return o.has(u)||(u&&gt(u.install)?(o.add(u),u.install(l,...f)):gt(u)&&(o.add(u),u(l,...f))),l},mixin(u){return a.mixins.includes(u)||a.mixins.push(u),l},component(u,f){return f?(a.components[u]=f,l):a.components[u]},directive(u,f){return f?(a.directives[u]=f,l):a.directives[u]},mount(u,f,c){if(!s){const v=fe(n,i);return v.appContext=a,f&&t?t(v,u):e(v,u,c),s=!0,l._container=u,u.__vue_app__=l,jv(v.component)||v.component.proxy}},unmount(){s&&(e(null,l._container),delete l._container.__vue_app__)},provide(u,f){return a.provides[u]=f,l}};return l}}function Jc(e,t,r,n,i=!1){if(at(e)){e.forEach((v,h)=>Jc(v,t&&(at(t)?t[h]:t),r,n,i));return}if(jc(n)&&!i)return;const a=n.shapeFlag&4?jv(n.component)||n.component.proxy:n.el,o=i?null:a,{i:s,r:l}=e,u=t&&t.r,f=s.refs===Rt?s.refs={}:s.refs,c=s.setupState;if(u!=null&&u!==l&&(Zt(u)?(f[u]=null,Tt(c,u)&&(c[u]=null)):Wt(u)&&(u.value=null)),gt(l))Sn(l,s,12,[o,f]);else{const v=Zt(l),h=Wt(l);if(v||h){const d=()=>{if(e.f){const p=v?f[l]:l.value;i?at(p)&&Cv(p,a):at(p)?p.includes(a)||p.push(a):v?f[l]=[a]:(l.value=[a],e.k&&(f[e.k]=l.value))}else v?(f[l]=o,Tt(c,l)&&(c[l]=o)):Wt(l)&&(l.value=o,e.k&&(f[e.k]=o))};o?(d.id=-1,be(d,r)):d()}}}const be=jT;function SC(e){return xC(e)}function xC(e,t){const r=Zx();r.__VUE__=!0;const{insert:n,remove:i,patchProp:a,createElement:o,createText:s,createComment:l,setText:u,setElementText:f,parentNode:c,nextSibling:v,setScopeId:h=fr,cloneNode:d,insertStaticContent:p}=e,g=(M,E,R,B=null,F=null,q=null,Z=!1,U=null,W=!!E.dynamicChildren)=>{if(M===E)return;M&&!wr(M,E)&&(B=Q(M),ht(M,F,q,!0),M=null),E.patchFlag===-2&&(W=!1,E.dynamicChildren=null);const{type:H,ref:nt,shapeFlag:rt}=E;switch(H){case Yv:m(M,E,R,B);break;case Ne:y(M,E,R,B);break;case xo:M==null&&_(E,R,B,Z);break;case Pe:L(M,E,R,B,F,q,Z,U,W);break;default:rt&1?b(M,E,R,B,F,q,Z,U,W):rt&6?O(M,E,R,B,F,q,Z,U,W):(rt&64||rt&128)&&H.process(M,E,R,B,F,q,Z,U,W,ft)}nt!=null&&F&&Jc(nt,M&&M.ref,q,E||M,!E)},m=(M,E,R,B)=>{if(M==null)n(E.el=s(E.children),R,B);else{const F=E.el=M.el;E.children!==M.children&&u(F,E.children)}},y=(M,E,R,B)=>{M==null?n(E.el=l(E.children||\"\"),R,B):E.el=M.el},_=(M,E,R,B)=>{[M.el,M.anchor]=p(M.children,E,R,B,M.el,M.anchor)},w=({el:M,anchor:E},R,B)=>{let F;for(;M&&M!==E;)F=v(M),n(M,R,B),M=F;n(E,R,B)},S=({el:M,anchor:E})=>{let R;for(;M&&M!==E;)R=v(M),i(M),M=R;i(E)},b=(M,E,R,B,F,q,Z,U,W)=>{Z=Z||E.type===\"svg\",M==null?x(E,R,B,F,q,Z,U,W):D(M,E,F,q,Z,U,W)},x=(M,E,R,B,F,q,Z,U)=>{let W,H;const{type:nt,props:rt,shapeFlag:ot,transition:dt,patchFlag:St,dirs:Ht}=M;if(M.el&&d!==void 0&&St===-1)W=M.el=d(M.el);else{if(W=M.el=o(M.type,q,rt&&rt.is,rt),ot&8?f(W,M.children):ot&16&&C(M.children,W,null,B,F,q&&nt!==\"foreignObject\",Z,U),Ht&&Nn(M,null,B,\"created\"),rt){for(const Bt in rt)Bt!==\"value\"&&!ml(Bt)&&a(W,Bt,null,rt[Bt],q,M.children,B,F,$);\"value\"in rt&&a(W,\"value\",null,rt.value),(H=rt.onVnodeBeforeMount)&&pr(H,B,M)}T(W,M,M.scopeId,Z,B)}Ht&&Nn(M,null,B,\"beforeMount\");const Et=(!F||F&&!F.pendingBranch)&&dt&&!dt.persisted;Et&&dt.beforeEnter(W),n(W,E,R),((H=rt&&rt.onVnodeMounted)||Et||Ht)&&be(()=>{H&&pr(H,B,M),Et&&dt.enter(W),Ht&&Nn(M,null,B,\"mounted\")},F)},T=(M,E,R,B,F)=>{if(R&&h(M,R),B)for(let q=0;q<B.length;q++)h(M,B[q]);if(F){let q=F.subTree;if(E===q){const Z=F.vnode;T(M,Z,Z.scopeId,Z.slotScopeIds,F.parent)}}},C=(M,E,R,B,F,q,Z,U,W=0)=>{for(let H=W;H<M.length;H++){const nt=M[H]=U?dn(M[H]):lr(M[H]);g(null,nt,E,R,B,F,q,Z,U)}},D=(M,E,R,B,F,q,Z)=>{const U=E.el=M.el;let{patchFlag:W,dynamicChildren:H,dirs:nt}=E;W|=M.patchFlag&16;const rt=M.props||Rt,ot=E.props||Rt;let dt;R&&Bn(R,!1),(dt=ot.onVnodeBeforeUpdate)&&pr(dt,R,E,M),nt&&Nn(E,M,R,\"beforeUpdate\"),R&&Bn(R,!0);const St=F&&E.type!==\"foreignObject\";if(H?P(M.dynamicChildren,H,U,R,B,St,q):Z||K(M,E,U,null,R,B,St,q,!1),W>0){if(W&16)A(U,E,rt,ot,R,B,F);else if(W&2&&rt.class!==ot.class&&a(U,\"class\",null,ot.class,F),W&4&&a(U,\"style\",rt.style,ot.style,F),W&8){const Ht=E.dynamicProps;for(let Et=0;Et<Ht.length;Et++){const Bt=Ht[Et],nr=rt[Bt],Ri=ot[Bt];(Ri!==nr||Bt===\"value\")&&a(U,Bt,nr,Ri,F,M.children,R,B,$)}}W&1&&M.children!==E.children&&f(U,E.children)}else!Z&&H==null&&A(U,E,rt,ot,R,B,F);((dt=ot.onVnodeUpdated)||nt)&&be(()=>{dt&&pr(dt,R,E,M),nt&&Nn(E,M,R,\"updated\")},B)},P=(M,E,R,B,F,q,Z)=>{for(let U=0;U<E.length;U++){const W=M[U],H=E[U],nt=W.el&&(W.type===Pe||!wr(W,H)||W.shapeFlag&70)?c(W.el):R;g(W,H,nt,null,B,F,q,Z,!0)}},A=(M,E,R,B,F,q,Z)=>{if(R!==B){for(const U in B){if(ml(U))continue;const W=B[U],H=R[U];W!==H&&U!==\"value\"&&a(M,U,H,W,Z,E.children,F,q,$)}if(R!==Rt)for(const U in R)!ml(U)&&!(U in B)&&a(M,U,R[U],null,Z,E.children,F,q,$);\"value\"in B&&a(M,\"value\",R.value,B.value)}},L=(M,E,R,B,F,q,Z,U,W)=>{const H=E.el=M?M.el:s(\"\"),nt=E.anchor=M?M.anchor:s(\"\");let{patchFlag:rt,dynamicChildren:ot,slotScopeIds:dt}=E;dt&&(U=U?U.concat(dt):dt),M==null?(n(H,R,B),n(nt,R,B),C(E.children,R,nt,F,q,Z,U,W)):rt>0&&rt&64&&ot&&M.dynamicChildren?(P(M.dynamicChildren,ot,R,F,q,Z,U),(E.key!=null||F&&E===F.subTree)&&G_(M,E,!0)):K(M,E,R,nt,F,q,Z,U,W)},O=(M,E,R,B,F,q,Z,U,W)=>{E.slotScopeIds=U,M==null?E.shapeFlag&512?F.ctx.activate(E,R,B,Z,W):z(E,R,B,F,q,Z,W):N(M,E,W)},z=(M,E,R,B,F,q,Z)=>{const U=M.component=RC(M,B,F);if(Cu(M)&&(U.ctx.renderer=ft),OC(U),U.asyncDep){if(F&&F.registerDep(U,tt),!M.el){const W=U.subTree=fe(Ne);y(null,W,E,R)}return}tt(U,M,E,R,F,q,Z)},N=(M,E,R)=>{const B=E.component=M.component;if(VT(M,E,R))if(B.asyncDep&&!B.asyncResolved){V(B,E,R);return}else B.next=E,kT(B.update),B.update();else E.component=M.component,E.el=M.el,B.vnode=E},tt=(M,E,R,B,F,q,Z)=>{const U=()=>{if(M.isMounted){let{next:nt,bu:rt,u:ot,parent:dt,vnode:St}=M,Ht=nt,Et;Bn(M,!1),nt?(nt.el=St.el,V(M,nt,Z)):nt=St,rt&&yl(rt),(Et=nt.props&&nt.props.onVnodeBeforeUpdate)&&pr(Et,dt,nt,St),Bn(M,!0);const Bt=vf(M),nr=M.subTree;M.subTree=Bt,g(nr,Bt,c(nr.el),Q(nr),M,F,q),nt.el=Bt.el,Ht===null&&Hv(M,Bt.el),ot&&be(ot,F),(Et=nt.props&&nt.props.onVnodeUpdated)&&be(()=>pr(Et,dt,nt,St),F)}else{let nt;const{el:rt,props:ot}=E,{bm:dt,m:St,parent:Ht}=M,Et=jc(E);if(Bn(M,!1),dt&&yl(dt),!Et&&(nt=ot&&ot.onVnodeBeforeMount)&&pr(nt,Ht,E),Bn(M,!0),rt&&j){const Bt=()=>{M.subTree=vf(M),j(rt,M.subTree,M,F,null)};Et?E.type.__asyncLoader().then(()=>!M.isUnmounted&&Bt()):Bt()}else{const Bt=M.subTree=vf(M);g(null,Bt,R,B,M,F,q),E.el=Bt.el}if(St&&be(St,F),!Et&&(nt=ot&&ot.onVnodeMounted)){const Bt=E;be(()=>pr(nt,Ht,Bt),F)}E.shapeFlag&256&&M.a&&be(M.a,F),M.isMounted=!0,E=R=B=null}},W=M.effect=new Iv(U,()=>S_(M.update),M.scope),H=M.update=W.run.bind(W);H.id=M.uid,Bn(M,!0),H()},V=(M,E,R)=>{E.component=M;const B=M.vnode.props;M.vnode=E,M.next=null,gC(M,E.props,B,R),_C(M,E.children,R),La(),Fv(void 0,M.update),Ra()},K=(M,E,R,B,F,q,Z,U,W=!1)=>{const H=M&&M.children,nt=M?M.shapeFlag:0,rt=E.children,{patchFlag:ot,shapeFlag:dt}=E;if(ot>0){if(ot&128){yt(H,rt,R,B,F,q,Z,U,W);return}else if(ot&256){lt(H,rt,R,B,F,q,Z,U,W);return}}dt&8?(nt&16&&$(H,F,q),rt!==H&&f(R,rt)):nt&16?dt&16?yt(H,rt,R,B,F,q,Z,U,W):$(H,F,q,!0):(nt&8&&f(R,\"\"),dt&16&&C(rt,R,B,F,q,Z,U,W))},lt=(M,E,R,B,F,q,Z,U,W)=>{M=M||ua,E=E||ua;const H=M.length,nt=E.length,rt=Math.min(H,nt);let ot;for(ot=0;ot<rt;ot++){const dt=E[ot]=W?dn(E[ot]):lr(E[ot]);g(M[ot],dt,R,null,F,q,Z,U,W)}H>nt?$(M,F,q,!0,!1,rt):C(E,R,B,F,q,Z,U,W,rt)},yt=(M,E,R,B,F,q,Z,U,W)=>{let H=0;const nt=E.length;let rt=M.length-1,ot=nt-1;for(;H<=rt&&H<=ot;){const dt=M[H],St=E[H]=W?dn(E[H]):lr(E[H]);if(wr(dt,St))g(dt,St,R,null,F,q,Z,U,W);else break;H++}for(;H<=rt&&H<=ot;){const dt=M[rt],St=E[ot]=W?dn(E[ot]):lr(E[ot]);if(wr(dt,St))g(dt,St,R,null,F,q,Z,U,W);else break;rt--,ot--}if(H>rt){if(H<=ot){const dt=ot+1,St=dt<nt?E[dt].el:B;for(;H<=ot;)g(null,E[H]=W?dn(E[H]):lr(E[H]),R,St,F,q,Z,U,W),H++}}else if(H>ot)for(;H<=rt;)ht(M[H],F,q,!0),H++;else{const dt=H,St=H,Ht=new Map;for(H=St;H<=ot;H++){const De=E[H]=W?dn(E[H]):lr(E[H]);De.key!=null&&Ht.set(De.key,H)}let Et,Bt=0;const nr=ot-St+1;let Ri=!1,lp=0;const Ha=new Array(nr);for(H=0;H<nr;H++)Ha[H]=0;for(H=dt;H<=rt;H++){const De=M[H];if(Bt>=nr){ht(De,F,q,!0);continue}let dr;if(De.key!=null)dr=Ht.get(De.key);else for(Et=St;Et<=ot;Et++)if(Ha[Et-St]===0&&wr(De,E[Et])){dr=Et;break}dr===void 0?ht(De,F,q,!0):(Ha[dr-St]=H+1,dr>=lp?lp=dr:Ri=!0,g(De,E[dr],R,null,F,q,Z,U,W),Bt++)}const up=Ri?TC(Ha):ua;for(Et=up.length-1,H=nr-1;H>=0;H--){const De=St+H,dr=E[De],fp=De+1<nt?E[De+1].el:B;Ha[H]===0?g(null,dr,R,fp,F,q,Z,U,W):Ri&&(Et<0||H!==up[Et]?ut(dr,R,fp,2):Et--)}}},ut=(M,E,R,B,F=null)=>{const{el:q,type:Z,transition:U,children:W,shapeFlag:H}=M;if(H&6){ut(M.component.subTree,E,R,B);return}if(H&128){M.suspense.move(E,R,B);return}if(H&64){Z.move(M,E,R,ft);return}if(Z===Pe){n(q,E,R);for(let rt=0;rt<W.length;rt++)ut(W[rt],E,R,B);n(M.anchor,E,R);return}if(Z===xo){w(M,E,R);return}if(B!==2&&H&1&&U)if(B===0)U.beforeEnter(q),n(q,E,R),be(()=>U.enter(q),F);else{const{leave:rt,delayLeave:ot,afterLeave:dt}=U,St=()=>n(q,E,R),Ht=()=>{rt(q,()=>{St(),dt&&dt()})};ot?ot(q,St,Ht):Ht()}else n(q,E,R)},ht=(M,E,R,B=!1,F=!1)=>{const{type:q,props:Z,ref:U,children:W,dynamicChildren:H,shapeFlag:nt,patchFlag:rt,dirs:ot}=M;if(U!=null&&Jc(U,null,R,M,!0),nt&256){E.ctx.deactivate(M);return}const dt=nt&1&&ot,St=!jc(M);let Ht;if(St&&(Ht=Z&&Z.onVnodeBeforeUnmount)&&pr(Ht,E,M),nt&6)G(M.component,R,B);else{if(nt&128){M.suspense.unmount(R,B);return}dt&&Nn(M,null,E,\"beforeUnmount\"),nt&64?M.type.remove(M,E,R,F,ft,B):H&&(q!==Pe||rt>0&&rt&64)?$(H,E,R,!1,!0):(q===Pe&&rt&384||!F&&nt&16)&&$(W,E,R),B&&bt(M)}(St&&(Ht=Z&&Z.onVnodeUnmounted)||dt)&&be(()=>{Ht&&pr(Ht,E,M),dt&&Nn(M,null,E,\"unmounted\")},R)},bt=M=>{const{type:E,el:R,anchor:B,transition:F}=M;if(E===Pe){k(R,B);return}if(E===xo){S(M);return}const q=()=>{i(R),F&&!F.persisted&&F.afterLeave&&F.afterLeave()};if(M.shapeFlag&1&&F&&!F.persisted){const{leave:Z,delayLeave:U}=F,W=()=>Z(R,q);U?U(M.el,q,W):W()}else q()},k=(M,E)=>{let R;for(;M!==E;)R=v(M),i(M),M=R;i(E)},G=(M,E,R)=>{const{bum:B,scope:F,update:q,subTree:Z,um:U}=M;B&&yl(B),F.stop(),q&&(q.active=!1,ht(Z,M,E,R)),U&&be(U,E),be(()=>{M.isUnmounted=!0},E),E&&E.pendingBranch&&!E.isUnmounted&&M.asyncDep&&!M.asyncResolved&&M.suspenseId===E.pendingId&&(E.deps--,E.deps===0&&E.resolve())},$=(M,E,R,B=!1,F=!1,q=0)=>{for(let Z=q;Z<M.length;Z++)ht(M[Z],E,R,B,F)},Q=M=>M.shapeFlag&6?Q(M.component.subTree):M.shapeFlag&128?M.suspense.next():v(M.anchor||M.el),vt=(M,E,R)=>{M==null?E._vnode&&ht(E._vnode,null,null,!0):g(E._vnode||null,M,E,null,null,null,R),M_(),E._vnode=M},ft={p:g,um:ht,m:ut,r:bt,mt:z,mc:C,pc:K,pbc:P,n:Q,o:e};let X,j;return t&&([X,j]=t(ft)),{render:vt,hydrate:X,createApp:bC(vt,X)}}function Bn({effect:e,update:t},r){e.allowRecurse=t.allowRecurse=r}function G_(e,t,r=!1){const n=e.children,i=t.children;if(at(n)&&at(i))for(let a=0;a<n.length;a++){const o=n[a];let s=i[a];s.shapeFlag&1&&!s.dynamicChildren&&((s.patchFlag<=0||s.patchFlag===32)&&(s=i[a]=dn(i[a]),s.el=o.el),r||G_(o,s))}}function TC(e){const t=e.slice(),r=[0];let n,i,a,o,s;const l=e.length;for(n=0;n<l;n++){const u=e[n];if(u!==0){if(i=r[r.length-1],e[i]<u){t[n]=i,r.push(n);continue}for(a=0,o=r.length-1;a<o;)s=a+o>>1,e[r[s]]<u?a=s+1:o=s;u<e[r[a]]&&(a>0&&(t[n]=r[a-1]),r[a]=n)}}for(a=r.length,o=r[a-1];a-- >0;)r[a]=o,o=t[o];return r}const CC=e=>e.__isTeleport,Wv=\"components\";function kz(e,t){return W_(Wv,e,!0,t)||e}const U_=Symbol();function Nz(e){return Zt(e)?W_(Wv,e,!1)||e:e||U_}function W_(e,t,r=!0,n=!1){const i=Re||Jt;if(i){const a=i.type;if(e===Wv){const s=FC(a);if(s&&(s===t||s===Ar(t)||s===Su(Ar(t))))return a}const o=Pp(i[e]||a[e],t)||Pp(i.appContext[e],t);return!o&&n?a:o}}function Pp(e,t){return e&&(e[t]||e[Ar(t)]||e[Su(Ar(t))])}const Pe=Symbol(void 0),Yv=Symbol(void 0),Ne=Symbol(void 0),xo=Symbol(void 0),To=[];let xn=null;function qv(e=!1){To.push(xn=e?null:[])}function Y_(){To.pop(),xn=To[To.length-1]||null}let Yo=1;function Ip(e){Yo+=e}function q_(e){return e.dynamicChildren=Yo>0?xn||ua:null,Y_(),Yo>0&&xn&&xn.push(e),e}function Bz(e,t,r,n,i,a){return q_(K_(e,t,r,n,i,a,!0))}function X_(e,t,r,n,i){return q_(fe(e,t,r,n,i,!0))}function qo(e){return e?e.__v_isVNode===!0:!1}function wr(e,t){return e.type===t.type&&e.key===t.key}const Pu=\"__vInternal\",j_=({key:e})=>e!=null?e:null,wl=({ref:e,ref_key:t,ref_for:r})=>e!=null?Zt(e)||Wt(e)||gt(e)?{i:Re,r:e,k:t,f:!!r}:e:null;function K_(e,t=null,r=null,n=0,i=null,a=e===Pe?0:1,o=!1,s=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&j_(t),ref:t&&wl(t),scopeId:Tu,slotScopeIds:null,children:r,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:a,patchFlag:n,dynamicProps:i,dynamicChildren:null,appContext:null};return s?(Xv(l,r),a&128&&e.normalize(l)):r&&(l.shapeFlag|=Zt(r)?8:16),Yo>0&&!o&&xn&&(l.patchFlag>0||a&6)&&l.patchFlag!==32&&xn.push(l),l}const fe=MC;function MC(e,t=null,r=null,n=0,i=null,a=!1){if((!e||e===U_)&&(e=Ne),qo(e)){const s=ba(e,t,!0);return r&&Xv(s,r),s}if(zC(e)&&(e=e.__vccOpts),t){t=AC(t);let{class:s,style:l}=t;s&&!Zt(s)&&(t.class=Sv(s)),Yt(l)&&(g_(l)&&!at(l)&&(l=ie({},l)),t.style=bv(l))}const o=Zt(e)?1:GT(e)?128:CC(e)?64:Yt(e)?4:gt(e)?2:0;return K_(e,t,r,n,i,o,a,!0)}function AC(e){return e?g_(e)||Pu in e?ie({},e):e:null}function ba(e,t,r=!1){const{props:n,ref:i,patchFlag:a,children:o}=e,s=t?PC(n||{},t):n;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:s,key:s&&j_(s),ref:t&&t.ref?r&&i?at(i)?i.concat(wl(t)):[i,wl(t)]:wl(t):i,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Pe?a===-1?16:a|16:a,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&ba(e.ssContent),ssFallback:e.ssFallback&&ba(e.ssFallback),el:e.el,anchor:e.anchor}}function DC(e=\" \",t=0){return fe(Yv,null,e,t)}function Fz(e,t){const r=fe(xo,null,e);return r.staticCount=t,r}function zz(e=\"\",t=!1){return t?(qv(),X_(Ne,null,e)):fe(Ne,null,e)}function lr(e){return e==null||typeof e==\"boolean\"?fe(Ne):at(e)?fe(Pe,null,e.slice()):typeof e==\"object\"?dn(e):fe(Yv,null,String(e))}function dn(e){return e.el===null||e.memo?e:ba(e)}function Xv(e,t){let r=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(at(t))r=16;else if(typeof t==\"object\")if(n&65){const i=t.default;i&&(i._c&&(i._d=!1),Xv(e,i()),i._c&&(i._d=!0));return}else{r=32;const i=t._;!i&&!(Pu in t)?t._ctx=Re:i===3&&Re&&(Re.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else gt(t)?(t={default:t,_ctx:Re},r=32):(t=String(t),n&64?(r=16,t=[DC(t)]):r=8);e.children=t,e.shapeFlag|=r}function PC(...e){const t={};for(let r=0;r<e.length;r++){const n=e[r];for(const i in n)if(i===\"class\")t.class!==n.class&&(t.class=Sv([t.class,n.class]));else if(i===\"style\")t.style=bv([t.style,n.style]);else if(_u(i)){const a=t[i],o=n[i];o&&a!==o&&!(at(a)&&a.includes(o))&&(t[i]=a?[].concat(a,o):o)}else i!==\"\"&&(t[i]=n[i])}return t}function pr(e,t,r,n=null){Qe(e,t,7,[r,n])}function Hz(e,t,r,n){let i;const a=r&&r[n];if(at(e)||Zt(e)){i=new Array(e.length);for(let o=0,s=e.length;o<s;o++)i[o]=t(e[o],o,void 0,a&&a[o])}else if(typeof e==\"number\"){i=new Array(e);for(let o=0;o<e;o++)i[o]=t(o+1,o,void 0,a&&a[o])}else if(Yt(e))if(e[Symbol.iterator])i=Array.from(e,(o,s)=>t(o,s,void 0,a&&a[s]));else{const o=Object.keys(e);i=new Array(o.length);for(let s=0,l=o.length;s<l;s++){const u=o[s];i[s]=t(e[u],u,s,a&&a[s])}}else i=[];return r&&(r[n]=i),i}function $z(e,t){for(let r=0;r<t.length;r++){const n=t[r];if(at(n))for(let i=0;i<n.length;i++)e[n[i].name]=n[i].fn;else n&&(e[n.name]=n.fn)}return e}function Vz(e,t,r={},n,i){if(Re.isCE)return fe(\"slot\",t===\"default\"?null:{name:t},n&&n());let a=e[t];a&&a._c&&(a._d=!1),qv();const o=a&&Z_(a(r)),s=X_(Pe,{key:r.key||`_${t}`},o||(n?n():[]),o&&e._===1?64:-2);return!i&&s.scopeId&&(s.slotScopeIds=[s.scopeId+\"-s\"]),a&&a._c&&(a._d=!0),s}function Z_(e){return e.some(t=>qo(t)?!(t.type===Ne||t.type===Pe&&!Z_(t.children)):!0)?e:null}const th=e=>e?Q_(e)?jv(e)||e.proxy:th(e.parent):null,$l=ie(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>th(e.parent),$root:e=>th(e.root),$emit:e=>e.emit,$options:e=>N_(e),$forceUpdate:e=>()=>S_(e.update),$nextTick:e=>Bv.bind(e.proxy),$watch:e=>ZT.bind(e)}),IC={get({_:e},t){const{ctx:r,setupState:n,data:i,props:a,accessCache:o,type:s,appContext:l}=e;let u;if(t[0]!==\"$\"){const h=o[t];if(h!==void 0)switch(h){case 1:return n[t];case 2:return i[t];case 4:return r[t];case 3:return a[t]}else{if(n!==Rt&&Tt(n,t))return o[t]=1,n[t];if(i!==Rt&&Tt(i,t))return o[t]=2,i[t];if((u=e.propsOptions[0])&&Tt(u,t))return o[t]=3,a[t];if(r!==Rt&&Tt(r,t))return o[t]=4,r[t];Kc&&(o[t]=0)}}const f=$l[t];let c,v;if(f)return t===\"$attrs\"&&ke(e,\"get\",t),f(e);if((c=s.__cssModules)&&(c=c[t]))return c;if(r!==Rt&&Tt(r,t))return o[t]=4,r[t];if(v=l.config.globalProperties,Tt(v,t))return v[t]},set({_:e},t,r){const{data:n,setupState:i,ctx:a}=e;return i!==Rt&&Tt(i,t)?(i[t]=r,!0):n!==Rt&&Tt(n,t)?(n[t]=r,!0):Tt(e.props,t)||t[0]===\"$\"&&t.slice(1)in e?!1:(a[t]=r,!0)},has({_:{data:e,setupState:t,accessCache:r,ctx:n,appContext:i,propsOptions:a}},o){let s;return!!r[o]||e!==Rt&&Tt(e,o)||t!==Rt&&Tt(t,o)||(s=a[0])&&Tt(s,o)||Tt(n,o)||Tt($l,o)||Tt(i.config.globalProperties,o)},defineProperty(e,t,r){return r.get!=null?this.set(e,t,r.get(),null):r.value!=null&&this.set(e,t,r.value,null),Reflect.defineProperty(e,t,r)}},EC=V_();let LC=0;function RC(e,t,r){const n=e.type,i=(t?t.appContext:e.appContext)||EC,a={uid:LC++,vnode:e,type:n,parent:t,appContext:i,root:null,next:null,subTree:null,effect:null,update:null,scope:new r_(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(i.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:F_(n,i),emitsOptions:D_(n,i),emit:null,emitted:null,propsDefaults:Rt,inheritAttrs:n.inheritAttrs,ctx:Rt,data:Rt,props:Rt,attrs:Rt,slots:Rt,refs:Rt,setupState:Rt,setupContext:null,suspense:r,suspenseId:r?r.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return a.ctx={_:a},a.root=t?t.root:a,a.emit=BT.bind(null,a),e.ce&&e.ce(a),a}let Jt=null;const Oa=()=>Jt||Re,In=e=>{Jt=e,e.scope.on()},Tn=()=>{Jt&&Jt.scope.off(),Jt=null};function Q_(e){return e.vnode.shapeFlag&4}let Xo=!1;function OC(e,t=!1){Xo=t;const{props:r,children:n}=e.vnode,i=Q_(e);pC(e,r,i,t),yC(e,n);const a=i?kC(e,t):void 0;return Xo=!1,a}function kC(e,t){const r=e.type;e.accessCache=Object.create(null),e.proxy=_a(new Proxy(e.ctx,IC));const{setup:n}=r;if(n){const i=e.setupContext=n.length>1?BC(e):null;In(e),La();const a=Sn(n,e,0,[e.props,i]);if(Ra(),Tn(),Av(a)){if(a.then(Tn,Tn),t)return a.then(o=>{eh(e,o,t)}).catch(o=>{hs(o,e,0)});e.asyncDep=a}else eh(e,a,t)}else J_(e,t)}function eh(e,t,r){gt(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Yt(t)&&(e.setupState=w_(t)),J_(e,r)}let Ep;function J_(e,t,r){const n=e.type;if(!e.render){if(!t&&Ep&&!n.render){const i=n.template;if(i){const{isCustomElement:a,compilerOptions:o}=e.appContext.config,{delimiters:s,compilerOptions:l}=n,u=ie(ie({isCustomElement:a,delimiters:s},o),l);n.render=Ep(i,u)}}e.render=n.render||fr}In(e),La(),fC(e),Ra(),Tn()}function NC(e){return new Proxy(e.attrs,{get(t,r){return ke(e,\"get\",\"$attrs\"),t[r]}})}function BC(e){const t=n=>{e.exposed=n||{}};let r;return{get attrs(){return r||(r=NC(e))},slots:e.slots,emit:e.emit,expose:t}}function jv(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(w_(_a(e.exposed)),{get(t,r){if(r in t)return t[r];if(r in $l)return $l[r](e)}}))}function FC(e){return gt(e)&&e.displayName||e.name}function zC(e){return gt(e)&&\"__vccOpts\"in e}const Ee=(e,t)=>LT(e,t,Xo);function Gz(e){const t=Oa();let r=e();return Tn(),Av(r)&&(r=r.catch(n=>{throw In(t),n})),[r,()=>In(t)]}function jo(e,t,r){const n=arguments.length;return n===2?Yt(t)&&!at(t)?qo(t)?fe(e,null,[t]):fe(e,t):fe(e,null,t):(n>3?r=Array.prototype.slice.call(arguments,2):n===3&&qo(r)&&(r=[r]),fe(e,t,r))}const HC=\"3.2.31\",$C=\"http://www.w3.org/2000/svg\",fi=typeof document!=\"undefined\"?document:null,Lp=fi&&fi.createElement(\"template\"),VC={insert:(e,t,r)=>{t.insertBefore(e,r||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,r,n)=>{const i=t?fi.createElementNS($C,e):fi.createElement(e,r?{is:r}:void 0);return e===\"select\"&&n&&n.multiple!=null&&i.setAttribute(\"multiple\",n.multiple),i},createText:e=>fi.createTextNode(e),createComment:e=>fi.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>fi.querySelector(e),setScopeId(e,t){e.setAttribute(t,\"\")},cloneNode(e){const t=e.cloneNode(!0);return\"_value\"in e&&(t._value=e._value),t},insertStaticContent(e,t,r,n,i,a){const o=r?r.previousSibling:t.lastChild;if(i&&(i===a||i.nextSibling))for(;t.insertBefore(i.cloneNode(!0),r),!(i===a||!(i=i.nextSibling)););else{Lp.innerHTML=n?`<svg>${e}</svg>`:e;const s=Lp.content;if(n){const l=s.firstChild;for(;l.firstChild;)s.appendChild(l.firstChild);s.removeChild(l)}t.insertBefore(s,r)}return[o?o.nextSibling:t.firstChild,r?r.previousSibling:t.lastChild]}};function GC(e,t,r){const n=e._vtc;n&&(t=(t?[t,...n]:[...n]).join(\" \")),t==null?e.removeAttribute(\"class\"):r?e.setAttribute(\"class\",t):e.className=t}function UC(e,t,r){const n=e.style,i=Zt(r);if(r&&!i){for(const a in r)rh(n,a,r[a]);if(t&&!Zt(t))for(const a in t)r[a]==null&&rh(n,a,\"\")}else{const a=n.display;i?t!==r&&(n.cssText=r):t&&e.removeAttribute(\"style\"),\"_vod\"in e&&(n.display=a)}}const Rp=/\\s*!important$/;function rh(e,t,r){if(at(r))r.forEach(n=>rh(e,t,n));else if(t.startsWith(\"--\"))e.setProperty(t,r);else{const n=WC(e,t);Rp.test(r)?e.setProperty(Mi(n),r.replace(Rp,\"\"),\"important\"):e[n]=r}}const Op=[\"Webkit\",\"Moz\",\"ms\"],pf={};function WC(e,t){const r=pf[t];if(r)return r;let n=Ar(t);if(n!==\"filter\"&&n in e)return pf[t]=n;n=Su(n);for(let i=0;i<Op.length;i++){const a=Op[i]+n;if(a in e)return pf[t]=a}return t}const kp=\"http://www.w3.org/1999/xlink\";function YC(e,t,r,n,i){if(n&&t.startsWith(\"xlink:\"))r==null?e.removeAttributeNS(kp,t.slice(6,t.length)):e.setAttributeNS(kp,t,r);else{const a=Hx(t);r==null||a&&!Q0(r)?e.removeAttribute(t):e.setAttribute(t,a?\"\":r)}}function qC(e,t,r,n,i,a,o){if(t===\"innerHTML\"||t===\"textContent\"){n&&o(n,i,a),e[t]=r==null?\"\":r;return}if(t===\"value\"&&e.tagName!==\"PROGRESS\"&&!e.tagName.includes(\"-\")){e._value=r;const s=r==null?\"\":r;(e.value!==s||e.tagName===\"OPTION\")&&(e.value=s),r==null&&e.removeAttribute(t);return}if(r===\"\"||r==null){const s=typeof e[t];if(s===\"boolean\"){e[t]=Q0(r);return}else if(r==null&&s===\"string\"){e[t]=\"\",e.removeAttribute(t);return}else if(s===\"number\"){try{e[t]=0}catch(l){}e.removeAttribute(t);return}}try{e[t]=r}catch(s){}}let Vl=Date.now,t1=!1;if(typeof window!=\"undefined\"){Vl()>document.createEvent(\"Event\").timeStamp&&(Vl=()=>performance.now());const e=navigator.userAgent.match(/firefox\\/(\\d+)/i);t1=!!(e&&Number(e[1])<=53)}let nh=0;const XC=Promise.resolve(),jC=()=>{nh=0},KC=()=>nh||(XC.then(jC),nh=Vl());function Fr(e,t,r,n){e.addEventListener(t,r,n)}function ZC(e,t,r,n){e.removeEventListener(t,r,n)}function QC(e,t,r,n,i=null){const a=e._vei||(e._vei={}),o=a[t];if(n&&o)o.value=n;else{const[s,l]=JC(t);if(n){const u=a[t]=tM(n,i);Fr(e,s,u,l)}else o&&(ZC(e,s,o,l),a[t]=void 0)}}const Np=/(?:Once|Passive|Capture)$/;function JC(e){let t;if(Np.test(e)){t={};let r;for(;r=e.match(Np);)e=e.slice(0,e.length-r[0].length),t[r[0].toLowerCase()]=!0}return[Mi(e.slice(2)),t]}function tM(e,t){const r=n=>{const i=n.timeStamp||Vl();(t1||i>=r.attached-1)&&Qe(eM(n,r.value),t,5,[n])};return r.value=e,r.attached=KC(),r}function eM(e,t){if(at(t)){const r=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{r.call(e),e._stopped=!0},t.map(n=>i=>!i._stopped&&n&&n(i))}else return t}const Bp=/^on[a-z]/,rM=(e,t,r,n,i=!1,a,o,s,l)=>{t===\"class\"?GC(e,n,i):t===\"style\"?UC(e,r,n):_u(t)?Tv(t)||QC(e,t,r,n,o):(t[0]===\".\"?(t=t.slice(1),!0):t[0]===\"^\"?(t=t.slice(1),!1):nM(e,t,n,i))?qC(e,t,n,a,o,s,l):(t===\"true-value\"?e._trueValue=n:t===\"false-value\"&&(e._falseValue=n),YC(e,t,n,i))};function nM(e,t,r,n){return n?!!(t===\"innerHTML\"||t===\"textContent\"||t in e&&Bp.test(t)&&gt(r)):t===\"spellcheck\"||t===\"draggable\"||t===\"form\"||t===\"list\"&&e.tagName===\"INPUT\"||t===\"type\"&&e.tagName===\"TEXTAREA\"||Bp.test(t)&&Zt(r)?!1:t in e}function Uz(e){const t=Oa();if(!t)return;const r=()=>ih(t.subTree,e(t.proxy));KT(r),Au(()=>{const n=new MutationObserver(r);n.observe(t.subTree.el.parentNode,{childList:!0}),Du(()=>n.disconnect())})}function ih(e,t){if(e.shapeFlag&128){const r=e.suspense;e=r.activeBranch,r.pendingBranch&&!r.isHydrating&&r.effects.push(()=>{ih(r.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)Fp(e.el,t);else if(e.type===Pe)e.children.forEach(r=>ih(r,t));else if(e.type===xo){let{el:r,anchor:n}=e;for(;r&&(Fp(r,t),r!==n);)r=r.nextSibling}}function Fp(e,t){if(e.nodeType===1){const r=e.style;for(const n in t)r.setProperty(`--${n}`,t[n])}}const Qr=\"transition\",$a=\"animation\",e1=(e,{slots:t})=>jo(I_,iM(e),t);e1.displayName=\"Transition\";const r1={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};e1.props=ie({},I_.props,r1);const Fn=(e,t=[])=>{at(e)?e.forEach(r=>r(...t)):e&&e(...t)},zp=e=>e?at(e)?e.some(t=>t.length>1):e.length>1:!1;function iM(e){const t={};for(const A in e)A in r1||(t[A]=e[A]);if(e.css===!1)return t;const{name:r=\"v\",type:n,duration:i,enterFromClass:a=`${r}-enter-from`,enterActiveClass:o=`${r}-enter-active`,enterToClass:s=`${r}-enter-to`,appearFromClass:l=a,appearActiveClass:u=o,appearToClass:f=s,leaveFromClass:c=`${r}-leave-from`,leaveActiveClass:v=`${r}-leave-active`,leaveToClass:h=`${r}-leave-to`}=e,d=aM(i),p=d&&d[0],g=d&&d[1],{onBeforeEnter:m,onEnter:y,onEnterCancelled:_,onLeave:w,onLeaveCancelled:S,onBeforeAppear:b=m,onAppear:x=y,onAppearCancelled:T=_}=t,C=(A,L,O)=>{Oi(A,L?f:s),Oi(A,L?u:o),O&&O()},D=(A,L)=>{Oi(A,h),Oi(A,v),L&&L()},P=A=>(L,O)=>{const z=A?x:y,N=()=>C(L,A,O);Fn(z,[L,N]),Hp(()=>{Oi(L,A?l:a),Jr(L,A?f:s),zp(z)||$p(L,n,p,N)})};return ie(t,{onBeforeEnter(A){Fn(m,[A]),Jr(A,a),Jr(A,o)},onBeforeAppear(A){Fn(b,[A]),Jr(A,l),Jr(A,u)},onEnter:P(!1),onAppear:P(!0),onLeave(A,L){const O=()=>D(A,L);Jr(A,c),lM(),Jr(A,v),Hp(()=>{Oi(A,c),Jr(A,h),zp(w)||$p(A,n,g,O)}),Fn(w,[A,O])},onEnterCancelled(A){C(A,!1),Fn(_,[A])},onAppearCancelled(A){C(A,!0),Fn(T,[A])},onLeaveCancelled(A){D(A),Fn(S,[A])}})}function aM(e){if(e==null)return null;if(Yt(e))return[gf(e.enter),gf(e.leave)];{const t=gf(e);return[t,t]}}function gf(e){return ya(e)}function Jr(e,t){t.split(/\\s+/).forEach(r=>r&&e.classList.add(r)),(e._vtc||(e._vtc=new Set)).add(t)}function Oi(e,t){t.split(/\\s+/).forEach(n=>n&&e.classList.remove(n));const{_vtc:r}=e;r&&(r.delete(t),r.size||(e._vtc=void 0))}function Hp(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let oM=0;function $p(e,t,r,n){const i=e._endId=++oM,a=()=>{i===e._endId&&n()};if(r)return setTimeout(a,r);const{type:o,timeout:s,propCount:l}=sM(e,t);if(!o)return n();const u=o+\"end\";let f=0;const c=()=>{e.removeEventListener(u,v),a()},v=h=>{h.target===e&&++f>=l&&c()};setTimeout(()=>{f<l&&c()},s+1),e.addEventListener(u,v)}function sM(e,t){const r=window.getComputedStyle(e),n=d=>(r[d]||\"\").split(\", \"),i=n(Qr+\"Delay\"),a=n(Qr+\"Duration\"),o=Vp(i,a),s=n($a+\"Delay\"),l=n($a+\"Duration\"),u=Vp(s,l);let f=null,c=0,v=0;t===Qr?o>0&&(f=Qr,c=o,v=a.length):t===$a?u>0&&(f=$a,c=u,v=l.length):(c=Math.max(o,u),f=c>0?o>u?Qr:$a:null,v=f?f===Qr?a.length:l.length:0);const h=f===Qr&&/\\b(transform|all)(,|$)/.test(r[Qr+\"Property\"]);return{type:f,timeout:c,propCount:v,hasTransform:h}}function Vp(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((r,n)=>Gp(r)+Gp(e[n])))}function Gp(e){return Number(e.slice(0,-1).replace(\",\",\".\"))*1e3}function lM(){return document.body.offsetHeight}const En=e=>{const t=e.props[\"onUpdate:modelValue\"];return at(t)?r=>yl(t,r):t};function uM(e){e.target.composing=!0}function Up(e){const t=e.target;t.composing&&(t.composing=!1,fM(t,\"input\"))}function fM(e,t){const r=document.createEvent(\"HTMLEvents\");r.initEvent(t,!0,!0),e.dispatchEvent(r)}const Wp={created(e,{modifiers:{lazy:t,trim:r,number:n}},i){e._assign=En(i);const a=n||i.props&&i.props.type===\"number\";Fr(e,t?\"change\":\"input\",o=>{if(o.target.composing)return;let s=e.value;r?s=s.trim():a&&(s=ya(s)),e._assign(s)}),r&&Fr(e,\"change\",()=>{e.value=e.value.trim()}),t||(Fr(e,\"compositionstart\",uM),Fr(e,\"compositionend\",Up),Fr(e,\"change\",Up))},mounted(e,{value:t}){e.value=t==null?\"\":t},beforeUpdate(e,{value:t,modifiers:{lazy:r,trim:n,number:i}},a){if(e._assign=En(a),e.composing||document.activeElement===e&&(r||n&&e.value.trim()===t||(i||e.type===\"number\")&&ya(e.value)===t))return;const o=t==null?\"\":t;e.value!==o&&(e.value=o)}},cM={deep:!0,created(e,t,r){e._assign=En(r),Fr(e,\"change\",()=>{const n=e._modelValue,i=Sa(e),a=e.checked,o=e._assign;if(at(n)){const s=xv(n,i),l=s!==-1;if(a&&!l)o(n.concat(i));else if(!a&&l){const u=[...n];u.splice(s,1),o(u)}}else if(Ea(n)){const s=new Set(n);a?s.add(i):s.delete(i),o(s)}else o(n1(e,a))})},mounted:Yp,beforeUpdate(e,t,r){e._assign=En(r),Yp(e,t,r)}};function Yp(e,{value:t,oldValue:r},n){e._modelValue=t,at(t)?e.checked=xv(t,n.props.value)>-1:Ea(t)?e.checked=t.has(n.props.value):t!==r&&(e.checked=wi(t,n1(e,!0)))}const hM={created(e,{value:t},r){e.checked=wi(t,r.props.value),e._assign=En(r),Fr(e,\"change\",()=>{e._assign(Sa(e))})},beforeUpdate(e,{value:t,oldValue:r},n){e._assign=En(n),t!==r&&(e.checked=wi(t,n.props.value))}},vM={deep:!0,created(e,{value:t,modifiers:{number:r}},n){const i=Ea(t);Fr(e,\"change\",()=>{const a=Array.prototype.filter.call(e.options,o=>o.selected).map(o=>r?ya(Sa(o)):Sa(o));e._assign(e.multiple?i?new Set(a):a:a[0])}),e._assign=En(n)},mounted(e,{value:t}){qp(e,t)},beforeUpdate(e,t,r){e._assign=En(r)},updated(e,{value:t}){qp(e,t)}};function qp(e,t){const r=e.multiple;if(!(r&&!at(t)&&!Ea(t))){for(let n=0,i=e.options.length;n<i;n++){const a=e.options[n],o=Sa(a);if(r)at(t)?a.selected=xv(t,o)>-1:a.selected=t.has(o);else if(wi(Sa(a),t)){e.selectedIndex!==n&&(e.selectedIndex=n);return}}!r&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function Sa(e){return\"_value\"in e?e._value:e.value}function n1(e,t){const r=t?\"_trueValue\":\"_falseValue\";return r in e?e[r]:t}const Wz={created(e,t,r){Ds(e,t,r,null,\"created\")},mounted(e,t,r){Ds(e,t,r,null,\"mounted\")},beforeUpdate(e,t,r,n){Ds(e,t,r,n,\"beforeUpdate\")},updated(e,t,r,n){Ds(e,t,r,n,\"updated\")}};function Ds(e,t,r,n,i){let a;switch(e.tagName){case\"SELECT\":a=vM;break;case\"TEXTAREA\":a=Wp;break;default:switch(r.props&&r.props.type){case\"checkbox\":a=cM;break;case\"radio\":a=hM;break;default:a=Wp}}const o=a[i];o&&o(e,t,r,n)}const dM=[\"ctrl\",\"shift\",\"alt\",\"meta\"],pM={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>\"button\"in e&&e.button!==0,middle:e=>\"button\"in e&&e.button!==1,right:e=>\"button\"in e&&e.button!==2,exact:(e,t)=>dM.some(r=>e[`${r}Key`]&&!t.includes(r))},Yz=(e,t)=>(r,...n)=>{for(let i=0;i<t.length;i++){const a=pM[t[i]];if(a&&a(r,t))return}return e(r,...n)},gM={esc:\"escape\",space:\" \",up:\"arrow-up\",left:\"arrow-left\",right:\"arrow-right\",down:\"arrow-down\",delete:\"backspace\"},qz=(e,t)=>r=>{if(!(\"key\"in r))return;const n=Mi(r.key);if(t.some(i=>i===n||gM[i]===n))return e(r)},Xz={beforeMount(e,{value:t},{transition:r}){e._vod=e.style.display===\"none\"?\"\":e.style.display,r&&t?r.beforeEnter(e):Va(e,t)},mounted(e,{value:t},{transition:r}){r&&t&&r.enter(e)},updated(e,{value:t,oldValue:r},{transition:n}){!t!=!r&&(n?t?(n.beforeEnter(e),Va(e,!0),n.enter(e)):n.leave(e,()=>{Va(e,!1)}):Va(e,t))},beforeUnmount(e,{value:t}){Va(e,t)}};function Va(e,t){e.style.display=t?e._vod:\"none\"}const mM=ie({patchProp:rM},VC);let Xp;function i1(){return Xp||(Xp=SC(mM))}const jz=(...e)=>{i1().render(...e)},Kz=(...e)=>{const t=i1().createApp(...e),{mount:r}=t;return t.mount=n=>{const i=yM(n);if(!i)return;const a=t._component;!gt(a)&&!a.render&&!a.template&&(a.template=i.innerHTML),i.innerHTML=\"\";const o=r(i,!1,i instanceof SVGElement);return i instanceof Element&&(i.removeAttribute(\"v-cloak\"),i.setAttribute(\"data-v-app\",\"\")),o},t};function yM(e){return Zt(e)?document.querySelector(e):e}var _M=typeof globalThis!=\"undefined\"?globalThis:typeof window!=\"undefined\"?window:typeof global!=\"undefined\"?global:typeof self!=\"undefined\"?self:{},Kv={exports:{}},a1=function(t,r){return function(){for(var i=new Array(arguments.length),a=0;a<i.length;a++)i[a]=arguments[a];return t.apply(r,i)}},wM=a1,Di=Object.prototype.toString;function Zv(e){return Di.call(e)===\"[object Array]\"}function ah(e){return typeof e==\"undefined\"}function bM(e){return e!==null&&!ah(e)&&e.constructor!==null&&!ah(e.constructor)&&typeof e.constructor.isBuffer==\"function\"&&e.constructor.isBuffer(e)}function SM(e){return Di.call(e)===\"[object ArrayBuffer]\"}function xM(e){return typeof FormData!=\"undefined\"&&e instanceof FormData}function TM(e){var t;return typeof ArrayBuffer!=\"undefined\"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&e.buffer instanceof ArrayBuffer,t}function CM(e){return typeof e==\"string\"}function MM(e){return typeof e==\"number\"}function o1(e){return e!==null&&typeof e==\"object\"}function bl(e){if(Di.call(e)!==\"[object Object]\")return!1;var t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}function AM(e){return Di.call(e)===\"[object Date]\"}function DM(e){return Di.call(e)===\"[object File]\"}function PM(e){return Di.call(e)===\"[object Blob]\"}function s1(e){return Di.call(e)===\"[object Function]\"}function IM(e){return o1(e)&&s1(e.pipe)}function EM(e){return typeof URLSearchParams!=\"undefined\"&&e instanceof URLSearchParams}function LM(e){return e.trim?e.trim():e.replace(/^\\s+|\\s+$/g,\"\")}function RM(){return typeof navigator!=\"undefined\"&&(navigator.product===\"ReactNative\"||navigator.product===\"NativeScript\"||navigator.product===\"NS\")?!1:typeof window!=\"undefined\"&&typeof document!=\"undefined\"}function Qv(e,t){if(!(e===null||typeof e==\"undefined\"))if(typeof e!=\"object\"&&(e=[e]),Zv(e))for(var r=0,n=e.length;r<n;r++)t.call(null,e[r],r,e);else for(var i in e)Object.prototype.hasOwnProperty.call(e,i)&&t.call(null,e[i],i,e)}function oh(){var e={};function t(i,a){bl(e[a])&&bl(i)?e[a]=oh(e[a],i):bl(i)?e[a]=oh({},i):Zv(i)?e[a]=i.slice():e[a]=i}for(var r=0,n=arguments.length;r<n;r++)Qv(arguments[r],t);return e}function OM(e,t,r){return Qv(t,function(i,a){r&&typeof i==\"function\"?e[a]=wM(i,r):e[a]=i}),e}function kM(e){return e.charCodeAt(0)===65279&&(e=e.slice(1)),e}var Fe={isArray:Zv,isArrayBuffer:SM,isBuffer:bM,isFormData:xM,isArrayBufferView:TM,isString:CM,isNumber:MM,isObject:o1,isPlainObject:bl,isUndefined:ah,isDate:AM,isFile:DM,isBlob:PM,isFunction:s1,isStream:IM,isURLSearchParams:EM,isStandardBrowserEnv:RM,forEach:Qv,merge:oh,extend:OM,trim:LM,stripBOM:kM},ki=Fe;function jp(e){return encodeURIComponent(e).replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%20/g,\"+\").replace(/%5B/gi,\"[\").replace(/%5D/gi,\"]\")}var l1=function(t,r,n){if(!r)return t;var i;if(n)i=n(r);else if(ki.isURLSearchParams(r))i=r.toString();else{var a=[];ki.forEach(r,function(l,u){l===null||typeof l==\"undefined\"||(ki.isArray(l)?u=u+\"[]\":l=[l],ki.forEach(l,function(c){ki.isDate(c)?c=c.toISOString():ki.isObject(c)&&(c=JSON.stringify(c)),a.push(jp(u)+\"=\"+jp(c))}))}),i=a.join(\"&\")}if(i){var o=t.indexOf(\"#\");o!==-1&&(t=t.slice(0,o)),t+=(t.indexOf(\"?\")===-1?\"?\":\"&\")+i}return t},NM=Fe;function Iu(){this.handlers=[]}Iu.prototype.use=function(t,r,n){return this.handlers.push({fulfilled:t,rejected:r,synchronous:n?n.synchronous:!1,runWhen:n?n.runWhen:null}),this.handlers.length-1};Iu.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)};Iu.prototype.forEach=function(t){NM.forEach(this.handlers,function(n){n!==null&&t(n)})};var BM=Iu,FM=Fe,zM=function(t,r){FM.forEach(t,function(i,a){a!==r&&a.toUpperCase()===r.toUpperCase()&&(t[r]=i,delete t[a])})},u1=function(t,r,n,i,a){return t.config=r,n&&(t.code=n),t.request=i,t.response=a,t.isAxiosError=!0,t.toJSON=function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code}},t},HM=u1,f1=function(t,r,n,i,a){var o=new Error(t);return HM(o,r,n,i,a)},$M=f1,VM=function(t,r,n){var i=n.config.validateStatus;!n.status||!i||i(n.status)?t(n):r($M(\"Request failed with status code \"+n.status,n.config,null,n.request,n))},Ps=Fe,GM=Ps.isStandardBrowserEnv()?function(){return{write:function(r,n,i,a,o,s){var l=[];l.push(r+\"=\"+encodeURIComponent(n)),Ps.isNumber(i)&&l.push(\"expires=\"+new Date(i).toGMTString()),Ps.isString(a)&&l.push(\"path=\"+a),Ps.isString(o)&&l.push(\"domain=\"+o),s===!0&&l.push(\"secure\"),document.cookie=l.join(\"; \")},read:function(r){var n=document.cookie.match(new RegExp(\"(^|;\\\\s*)(\"+r+\")=([^;]*)\"));return n?decodeURIComponent(n[3]):null},remove:function(r){this.write(r,\"\",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}(),UM=function(t){return/^([a-z][a-z\\d\\+\\-\\.]*:)?\\/\\//i.test(t)},WM=function(t,r){return r?t.replace(/\\/+$/,\"\")+\"/\"+r.replace(/^\\/+/,\"\"):t},YM=UM,qM=WM,XM=function(t,r){return t&&!YM(r)?qM(t,r):r},mf=Fe,jM=[\"age\",\"authorization\",\"content-length\",\"content-type\",\"etag\",\"expires\",\"from\",\"host\",\"if-modified-since\",\"if-unmodified-since\",\"last-modified\",\"location\",\"max-forwards\",\"proxy-authorization\",\"referer\",\"retry-after\",\"user-agent\"],KM=function(t){var r={},n,i,a;return t&&mf.forEach(t.split(`\n`),function(s){if(a=s.indexOf(\":\"),n=mf.trim(s.substr(0,a)).toLowerCase(),i=mf.trim(s.substr(a+1)),n){if(r[n]&&jM.indexOf(n)>=0)return;n===\"set-cookie\"?r[n]=(r[n]?r[n]:[]).concat([i]):r[n]=r[n]?r[n]+\", \"+i:i}}),r},Kp=Fe,ZM=Kp.isStandardBrowserEnv()?function(){var t=/(msie|trident)/i.test(navigator.userAgent),r=document.createElement(\"a\"),n;function i(a){var o=a;return t&&(r.setAttribute(\"href\",o),o=r.href),r.setAttribute(\"href\",o),{href:r.href,protocol:r.protocol?r.protocol.replace(/:$/,\"\"):\"\",host:r.host,search:r.search?r.search.replace(/^\\?/,\"\"):\"\",hash:r.hash?r.hash.replace(/^#/,\"\"):\"\",hostname:r.hostname,port:r.port,pathname:r.pathname.charAt(0)===\"/\"?r.pathname:\"/\"+r.pathname}}return n=i(window.location.href),function(o){var s=Kp.isString(o)?i(o):o;return s.protocol===n.protocol&&s.host===n.host}}():function(){return function(){return!0}}(),Is=Fe,QM=VM,JM=GM,tA=l1,eA=XM,rA=KM,nA=ZM,yf=f1,Zp=function(t){return new Promise(function(n,i){var a=t.data,o=t.headers,s=t.responseType;Is.isFormData(a)&&delete o[\"Content-Type\"];var l=new XMLHttpRequest;if(t.auth){var u=t.auth.username||\"\",f=t.auth.password?unescape(encodeURIComponent(t.auth.password)):\"\";o.Authorization=\"Basic \"+btoa(u+\":\"+f)}var c=eA(t.baseURL,t.url);l.open(t.method.toUpperCase(),tA(c,t.params,t.paramsSerializer),!0),l.timeout=t.timeout;function v(){if(!!l){var d=\"getAllResponseHeaders\"in l?rA(l.getAllResponseHeaders()):null,p=!s||s===\"text\"||s===\"json\"?l.responseText:l.response,g={data:p,status:l.status,statusText:l.statusText,headers:d,config:t,request:l};QM(n,i,g),l=null}}if(\"onloadend\"in l?l.onloadend=v:l.onreadystatechange=function(){!l||l.readyState!==4||l.status===0&&!(l.responseURL&&l.responseURL.indexOf(\"file:\")===0)||setTimeout(v)},l.onabort=function(){!l||(i(yf(\"Request aborted\",t,\"ECONNABORTED\",l)),l=null)},l.onerror=function(){i(yf(\"Network Error\",t,null,l)),l=null},l.ontimeout=function(){var p=\"timeout of \"+t.timeout+\"ms exceeded\";t.timeoutErrorMessage&&(p=t.timeoutErrorMessage),i(yf(p,t,t.transitional&&t.transitional.clarifyTimeoutError?\"ETIMEDOUT\":\"ECONNABORTED\",l)),l=null},Is.isStandardBrowserEnv()){var h=(t.withCredentials||nA(c))&&t.xsrfCookieName?JM.read(t.xsrfCookieName):void 0;h&&(o[t.xsrfHeaderName]=h)}\"setRequestHeader\"in l&&Is.forEach(o,function(p,g){typeof a==\"undefined\"&&g.toLowerCase()===\"content-type\"?delete o[g]:l.setRequestHeader(g,p)}),Is.isUndefined(t.withCredentials)||(l.withCredentials=!!t.withCredentials),s&&s!==\"json\"&&(l.responseType=t.responseType),typeof t.onDownloadProgress==\"function\"&&l.addEventListener(\"progress\",t.onDownloadProgress),typeof t.onUploadProgress==\"function\"&&l.upload&&l.upload.addEventListener(\"progress\",t.onUploadProgress),t.cancelToken&&t.cancelToken.promise.then(function(p){!l||(l.abort(),i(p),l=null)}),a||(a=null),l.send(a)})},ee=Fe,Qp=zM,iA=u1,aA={\"Content-Type\":\"application/x-www-form-urlencoded\"};function Jp(e,t){!ee.isUndefined(e)&&ee.isUndefined(e[\"Content-Type\"])&&(e[\"Content-Type\"]=t)}function oA(){var e;return(typeof XMLHttpRequest!=\"undefined\"||typeof process!=\"undefined\"&&Object.prototype.toString.call(process)===\"[object process]\")&&(e=Zp),e}function sA(e,t,r){if(ee.isString(e))try{return(t||JSON.parse)(e),ee.trim(e)}catch(n){if(n.name!==\"SyntaxError\")throw n}return(r||JSON.stringify)(e)}var Eu={transitional:{silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},adapter:oA(),transformRequest:[function(t,r){return Qp(r,\"Accept\"),Qp(r,\"Content-Type\"),ee.isFormData(t)||ee.isArrayBuffer(t)||ee.isBuffer(t)||ee.isStream(t)||ee.isFile(t)||ee.isBlob(t)?t:ee.isArrayBufferView(t)?t.buffer:ee.isURLSearchParams(t)?(Jp(r,\"application/x-www-form-urlencoded;charset=utf-8\"),t.toString()):ee.isObject(t)||r&&r[\"Content-Type\"]===\"application/json\"?(Jp(r,\"application/json\"),sA(t)):t}],transformResponse:[function(t){var r=this.transitional,n=r&&r.silentJSONParsing,i=r&&r.forcedJSONParsing,a=!n&&this.responseType===\"json\";if(a||i&&ee.isString(t)&&t.length)try{return JSON.parse(t)}catch(o){if(a)throw o.name===\"SyntaxError\"?iA(o,this,\"E_JSON_PARSE\"):o}return t}],timeout:0,xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",maxContentLength:-1,maxBodyLength:-1,validateStatus:function(t){return t>=200&&t<300}};Eu.headers={common:{Accept:\"application/json, text/plain, */*\"}};ee.forEach([\"delete\",\"get\",\"head\"],function(t){Eu.headers[t]={}});ee.forEach([\"post\",\"put\",\"patch\"],function(t){Eu.headers[t]=ee.merge(aA)});var Jv=Eu,lA=Fe,uA=Jv,fA=function(t,r,n){var i=this||uA;return lA.forEach(n,function(o){t=o.call(i,t,r)}),t},c1=function(t){return!!(t&&t.__CANCEL__)},tg=Fe,_f=fA,cA=c1,hA=Jv;function wf(e){e.cancelToken&&e.cancelToken.throwIfRequested()}var vA=function(t){wf(t),t.headers=t.headers||{},t.data=_f.call(t,t.data,t.headers,t.transformRequest),t.headers=tg.merge(t.headers.common||{},t.headers[t.method]||{},t.headers),tg.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\",\"common\"],function(i){delete t.headers[i]});var r=t.adapter||hA.adapter;return r(t).then(function(i){return wf(t),i.data=_f.call(t,i.data,i.headers,t.transformResponse),i},function(i){return cA(i)||(wf(t),i&&i.response&&(i.response.data=_f.call(t,i.response.data,i.response.headers,t.transformResponse))),Promise.reject(i)})},ae=Fe,h1=function(t,r){r=r||{};var n={},i=[\"url\",\"method\",\"data\"],a=[\"headers\",\"auth\",\"proxy\",\"params\"],o=[\"baseURL\",\"transformRequest\",\"transformResponse\",\"paramsSerializer\",\"timeout\",\"timeoutMessage\",\"withCredentials\",\"adapter\",\"responseType\",\"xsrfCookieName\",\"xsrfHeaderName\",\"onUploadProgress\",\"onDownloadProgress\",\"decompress\",\"maxContentLength\",\"maxBodyLength\",\"maxRedirects\",\"transport\",\"httpAgent\",\"httpsAgent\",\"cancelToken\",\"socketPath\",\"responseEncoding\"],s=[\"validateStatus\"];function l(v,h){return ae.isPlainObject(v)&&ae.isPlainObject(h)?ae.merge(v,h):ae.isPlainObject(h)?ae.merge({},h):ae.isArray(h)?h.slice():h}function u(v){ae.isUndefined(r[v])?ae.isUndefined(t[v])||(n[v]=l(void 0,t[v])):n[v]=l(t[v],r[v])}ae.forEach(i,function(h){ae.isUndefined(r[h])||(n[h]=l(void 0,r[h]))}),ae.forEach(a,u),ae.forEach(o,function(h){ae.isUndefined(r[h])?ae.isUndefined(t[h])||(n[h]=l(void 0,t[h])):n[h]=l(void 0,r[h])}),ae.forEach(s,function(h){h in r?n[h]=l(t[h],r[h]):h in t&&(n[h]=l(void 0,t[h]))});var f=i.concat(a).concat(o).concat(s),c=Object.keys(t).concat(Object.keys(r)).filter(function(h){return f.indexOf(h)===-1});return ae.forEach(c,u),n};const dA=\"axios\",pA=\"0.21.4\",gA=\"Promise based HTTP client for the browser and node.js\",mA=\"index.js\",yA={test:\"grunt test\",start:\"node ./sandbox/server.js\",build:\"NODE_ENV=production grunt build\",preversion:\"npm test\",version:\"npm run build && grunt version && git add -A dist && git add CHANGELOG.md bower.json package.json\",postversion:\"git push && git push --tags\",examples:\"node ./examples/server.js\",coveralls:\"cat coverage/lcov.info | ./node_modules/coveralls/bin/coveralls.js\",fix:\"eslint --fix lib/**/*.js\"},_A={type:\"git\",url:\"https://github.com/axios/axios.git\"},wA=[\"xhr\",\"http\",\"ajax\",\"promise\",\"node\"],bA=\"Matt Zabriskie\",SA=\"MIT\",xA={url:\"https://github.com/axios/axios/issues\"},TA=\"https://axios-http.com\",CA={coveralls:\"^3.0.0\",\"es6-promise\":\"^4.2.4\",grunt:\"^1.3.0\",\"grunt-banner\":\"^0.6.0\",\"grunt-cli\":\"^1.2.0\",\"grunt-contrib-clean\":\"^1.1.0\",\"grunt-contrib-watch\":\"^1.0.0\",\"grunt-eslint\":\"^23.0.0\",\"grunt-karma\":\"^4.0.0\",\"grunt-mocha-test\":\"^0.13.3\",\"grunt-ts\":\"^6.0.0-beta.19\",\"grunt-webpack\":\"^4.0.2\",\"istanbul-instrumenter-loader\":\"^1.0.0\",\"jasmine-core\":\"^2.4.1\",karma:\"^6.3.2\",\"karma-chrome-launcher\":\"^3.1.0\",\"karma-firefox-launcher\":\"^2.1.0\",\"karma-jasmine\":\"^1.1.1\",\"karma-jasmine-ajax\":\"^0.1.13\",\"karma-safari-launcher\":\"^1.0.0\",\"karma-sauce-launcher\":\"^4.3.6\",\"karma-sinon\":\"^1.0.5\",\"karma-sourcemap-loader\":\"^0.3.8\",\"karma-webpack\":\"^4.0.2\",\"load-grunt-tasks\":\"^3.5.2\",minimist:\"^1.2.0\",mocha:\"^8.2.1\",sinon:\"^4.5.0\",\"terser-webpack-plugin\":\"^4.2.3\",typescript:\"^4.0.5\",\"url-search-params\":\"^0.10.0\",webpack:\"^4.44.2\",\"webpack-dev-server\":\"^3.11.0\"},MA={\"./lib/adapters/http.js\":\"./lib/adapters/xhr.js\"},AA=\"dist/axios.min.js\",DA=\"dist/axios.min.js\",PA=\"./index.d.ts\",IA={\"follow-redirects\":\"^1.14.0\"},EA=[{path:\"./dist/axios.min.js\",threshold:\"5kB\"}];var LA={name:dA,version:pA,description:gA,main:mA,scripts:yA,repository:_A,keywords:wA,author:bA,license:SA,bugs:xA,homepage:TA,devDependencies:CA,browser:MA,jsdelivr:AA,unpkg:DA,typings:PA,dependencies:IA,bundlesize:EA},v1=LA,td={};[\"object\",\"boolean\",\"number\",\"function\",\"string\",\"symbol\"].forEach(function(e,t){td[e]=function(n){return typeof n===e||\"a\"+(t<1?\"n \":\" \")+e}});var eg={},RA=v1.version.split(\".\");function d1(e,t){for(var r=t?t.split(\".\"):RA,n=e.split(\".\"),i=0;i<3;i++){if(r[i]>n[i])return!0;if(r[i]<n[i])return!1}return!1}td.transitional=function(t,r,n){var i=r&&d1(r);function a(o,s){return\"[Axios v\"+v1.version+\"] Transitional option '\"+o+\"'\"+s+(n?\". \"+n:\"\")}return function(o,s,l){if(t===!1)throw new Error(a(s,\" has been removed in \"+r));return i&&!eg[s]&&(eg[s]=!0,console.warn(a(s,\" has been deprecated since v\"+r+\" and will be removed in the near future\"))),t?t(o,s,l):!0}};function OA(e,t,r){if(typeof e!=\"object\")throw new TypeError(\"options must be an object\");for(var n=Object.keys(e),i=n.length;i-- >0;){var a=n[i],o=t[a];if(o){var s=e[a],l=s===void 0||o(s,a,e);if(l!==!0)throw new TypeError(\"option \"+a+\" must be \"+l);continue}if(r!==!0)throw Error(\"Unknown option \"+a)}}var kA={isOlderVersion:d1,assertOptions:OA,validators:td},p1=Fe,NA=l1,rg=BM,ng=vA,Lu=h1,g1=kA,Ni=g1.validators;function vs(e){this.defaults=e,this.interceptors={request:new rg,response:new rg}}vs.prototype.request=function(t){typeof t==\"string\"?(t=arguments[1]||{},t.url=arguments[0]):t=t||{},t=Lu(this.defaults,t),t.method?t.method=t.method.toLowerCase():this.defaults.method?t.method=this.defaults.method.toLowerCase():t.method=\"get\";var r=t.transitional;r!==void 0&&g1.assertOptions(r,{silentJSONParsing:Ni.transitional(Ni.boolean,\"1.0.0\"),forcedJSONParsing:Ni.transitional(Ni.boolean,\"1.0.0\"),clarifyTimeoutError:Ni.transitional(Ni.boolean,\"1.0.0\")},!1);var n=[],i=!0;this.interceptors.request.forEach(function(v){typeof v.runWhen==\"function\"&&v.runWhen(t)===!1||(i=i&&v.synchronous,n.unshift(v.fulfilled,v.rejected))});var a=[];this.interceptors.response.forEach(function(v){a.push(v.fulfilled,v.rejected)});var o;if(!i){var s=[ng,void 0];for(Array.prototype.unshift.apply(s,n),s=s.concat(a),o=Promise.resolve(t);s.length;)o=o.then(s.shift(),s.shift());return o}for(var l=t;n.length;){var u=n.shift(),f=n.shift();try{l=u(l)}catch(c){f(c);break}}try{o=ng(l)}catch(c){return Promise.reject(c)}for(;a.length;)o=o.then(a.shift(),a.shift());return o};vs.prototype.getUri=function(t){return t=Lu(this.defaults,t),NA(t.url,t.params,t.paramsSerializer).replace(/^\\?/,\"\")};p1.forEach([\"delete\",\"get\",\"head\",\"options\"],function(t){vs.prototype[t]=function(r,n){return this.request(Lu(n||{},{method:t,url:r,data:(n||{}).data}))}});p1.forEach([\"post\",\"put\",\"patch\"],function(t){vs.prototype[t]=function(r,n,i){return this.request(Lu(i||{},{method:t,url:r,data:n}))}});var BA=vs;function ed(e){this.message=e}ed.prototype.toString=function(){return\"Cancel\"+(this.message?\": \"+this.message:\"\")};ed.prototype.__CANCEL__=!0;var m1=ed,FA=m1;function Gl(e){if(typeof e!=\"function\")throw new TypeError(\"executor must be a function.\");var t;this.promise=new Promise(function(i){t=i});var r=this;e(function(i){r.reason||(r.reason=new FA(i),t(r.reason))})}Gl.prototype.throwIfRequested=function(){if(this.reason)throw this.reason};Gl.source=function(){var t,r=new Gl(function(i){t=i});return{token:r,cancel:t}};var zA=Gl,HA=function(t){return function(n){return t.apply(null,n)}},$A=function(t){return typeof t==\"object\"&&t.isAxiosError===!0},ig=Fe,VA=a1,Sl=BA,GA=h1,UA=Jv;function y1(e){var t=new Sl(e),r=VA(Sl.prototype.request,t);return ig.extend(r,Sl.prototype,t),ig.extend(r,t),r}var cr=y1(UA);cr.Axios=Sl;cr.create=function(t){return y1(GA(cr.defaults,t))};cr.Cancel=m1;cr.CancelToken=zA;cr.isCancel=c1;cr.all=function(t){return Promise.all(t)};cr.spread=HA;cr.isAxiosError=$A;Kv.exports=cr;Kv.exports.default=cr;var Zz=Kv.exports,Ul=function(){return Ul=Object.assign||function(t){for(var r,n=1,i=arguments.length;n<i;n++){r=arguments[n];for(var a in r)Object.prototype.hasOwnProperty.call(r,a)&&(t[a]=r[a])}return t},Ul.apply(this,arguments)},WA=/[[\\].]{1,2}/g,_1=/%\\{((?:.|\\n)+?)\\}/g,YA=/\\{\\{((?:.|\\n)+?)\\}\\}/g,ds=function(e){return function(t,r,n,i){r===void 0&&(r={}),n===void 0&&(n=!1);var a=e.silent;!a&&YA.test(t)&&console.warn('Mustache syntax cannot be used with vue-gettext. Please use \"%{}\" instead of \"{{}}\" in: '.concat(t));var o=t.replace(_1,function(s,l){var u=l.trim(),f,c={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#039;\"};function v(d,p){for(var g=p.split(WA).filter(function(m){return m});g.length;)d=d[g.shift()];return d}function h(d,p,g){try{f=v(d,p)}catch(y){}if(f==null){if(g)return h(g.ctx,p,g.parent);console.warn(\"Cannot evaluate expression: \".concat(p)),f=p}var m=f.toString();return n?m:m.replace(/[&<>\"']/g,function(y){return c[y]})}return h(r,u,i)});return o}};ds.INTERPOLATION_RE=_1;ds.INTERPOLATION_PREFIX=\"%{\";var ag={getTranslationIndex:function(e,t){switch(t=Number(t),t=typeof t==\"number\"&&isNaN(t)?1:t,e.length>2&&e!==\"pt_BR\"&&(e=e.split(\"_\")[0]),e){case\"ay\":case\"bo\":case\"cgg\":case\"dz\":case\"fa\":case\"id\":case\"ja\":case\"jbo\":case\"ka\":case\"kk\":case\"km\":case\"ko\":case\"ky\":case\"lo\":case\"ms\":case\"my\":case\"sah\":case\"su\":case\"th\":case\"tt\":case\"ug\":case\"vi\":case\"wo\":case\"zh\":return 0;case\"is\":return t%10!==1||t%100===11?1:0;case\"jv\":return t!==0?1:0;case\"mk\":return t===1||t%10===1?0:1;case\"ach\":case\"ak\":case\"am\":case\"arn\":case\"br\":case\"fil\":case\"fr\":case\"gun\":case\"ln\":case\"mfe\":case\"mg\":case\"mi\":case\"oc\":case\"pt_BR\":case\"tg\":case\"ti\":case\"tr\":case\"uz\":case\"wa\":return t>1?1:0;case\"lv\":return t%10===1&&t%100!==11?0:t!==0?1:2;case\"lt\":return t%10===1&&t%100!==11?0:t%10>=2&&(t%100<10||t%100>=20)?1:2;case\"be\":case\"bs\":case\"hr\":case\"ru\":case\"sr\":case\"uk\":return t%10===1&&t%100!==11?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2;case\"mnk\":return t===0?0:t===1?1:2;case\"ro\":return t===1?0:t===0||t%100>0&&t%100<20?1:2;case\"pl\":return t===1?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2;case\"cs\":case\"sk\":return t===1?0:t>=2&&t<=4?1:2;case\"csb\":return t===1?0:t%10>=2&&t%10<=4&&(t%100<10||t%100>=20)?1:2;case\"sl\":return t%100===1?0:t%100===2?1:t%100===3||t%100===4?2:3;case\"mt\":return t===1?0:t===0||t%100>1&&t%100<11?1:t%100>10&&t%100<20?2:3;case\"gd\":return t===1||t===11?0:t===2||t===12?1:t>2&&t<20?2:3;case\"cy\":return t===1?0:t===2?1:t!==8&&t!==11?2:3;case\"kw\":return t===1?0:t===2?1:t===3?2:3;case\"ga\":return t===1?0:t===2?1:t>2&&t<7?2:t>6&&t<11?3:4;case\"ar\":return t===0?0:t===1?1:t===2?2:t%100>=3&&t%100<=10?3:t%100>=11?4:5;default:return t!==1?1:0}}},rd=function(e){return{getTranslation:function(t,r,n,i,a,o,s){r===void 0&&(r=1),n===void 0&&(n=null),i===void 0&&(i=null),s===void 0&&(s=!1),a===void 0&&(a=e.current);var l=function(m,y){return y?e.interpolate(m,y,s):m};if(t=t.trim(),!t)return\"\";var u=a?e.silent||e.muted.indexOf(a)!==-1:!1,f=i&&ag.getTranslationIndex(a,r)>0?i:t,c=e.translations,v=c[a]||c[a.split(\"_\")[0]];if(!v)return u||console.warn(\"No translations found for \".concat(a)),l(f,o);var h=function(m){var y=ag.getTranslationIndex(a,r);if(m.length===1&&r===1&&(y=0),!m[y])throw new Error(t+\" \"+y+\" \"+e.current+\" \"+r);return l(m[y],o)},d=function(){if(!u){var m=\"Untranslated \".concat(a,\" key found: \").concat(t);n&&(m+=\" (with context: \".concat(n,\")\")),console.warn(m)}return l(f,o)},p=function(m,y){if(y===void 0&&(y=null),m instanceof Object){if(Array.isArray(m))return h(m);var _=y!=null?y:\"\",w=m[_];return p(w)}return y||!m?d():l(m,o)},g=v[t];return p(g,n)},gettext:function(t,r,n){return n===void 0&&(n=!1),this.getTranslation(t,void 0,void 0,void 0,void 0,r,n)},pgettext:function(t,r,n,i){return i===void 0&&(i=!1),this.getTranslation(r,1,t,void 0,void 0,n,i)},ngettext:function(t,r,n,i,a){return a===void 0&&(a=!1),this.getTranslation(t,n,null,r,void 0,i,a)},npgettext:function(t,r,n,i,a,o){return o===void 0&&(o=!1),this.getTranslation(r,i,t,n,void 0,a,o)}}},sh=Symbol(\"GETTEXT\");function qA(e){return e.replace(/\\r?\\n|\\r/,\"\").replace(/\\s\\s+/g,\" \").trim()}function og(e){var t={};return Object.keys(e).forEach(function(r){var n=e[r],i={};Object.keys(n).forEach(function(a){i[qA(a)]=n[a]}),t[r]=i}),t}var XA=function(){var e=Je(sh,null);if(!e)throw new Error(\"Failed to inject gettext. Make sure vue3-gettext is set up properly.\");return e},sg=Gv({name:\"translate\",props:{tag:{type:String,default:\"span\"},translateN:{type:Number,default:null},translatePlural:{type:String,default:null},translateContext:{type:String,default:null},translateParams:{type:Object,default:null},translateComment:{type:String,default:null}},setup:function(e,t){var r,n,i,a=e.translateN!==void 0&&e.translatePlural!==void 0;if(!a&&(e.translateN||e.translatePlural))throw new Error(\"`translate-n` and `translate-plural` attributes must be used together: \".concat((i=(n=(r=t.slots).default)===null||n===void 0?void 0:n.call(r)[0])===null||i===void 0?void 0:i.children,\".\"));var o=wa(),s=XA(),l=wa(null);Au(function(){!l.value&&o.value&&(l.value=o.value.innerHTML.trim())});var u=Ee(function(){var f,c=rd(s).getTranslation(l.value,e.translateN,e.translateContext,a?e.translatePlural:null,s.current);return ds(s)(c,e.translateParams,void 0,(f=Oa())===null||f===void 0?void 0:f.parent)});return function(){return l.value?jo(e.tag,{ref:o,innerHTML:u.value}):jo(e.tag,{ref:o},t.slots.default?t.slots.default():\"\")}}}),jA=function(e,t,r,n){var i,a=n.props||{},o=t.dataset.msgid,s=a[\"translate-context\"],l=a[\"translate-n\"],u=a[\"translate-plural\"],f=l!==void 0&&u!==void 0,c=a[\"render-html\"]===\"true\";if(!f&&(l||u))throw new Error(\"`translate-n` and `translate-plural` attributes must be used together:\"+o+\".\");!e.silent&&a[\"translate-params\"]&&console.warn(\"`translate-params` is required as an expression for v-translate directive. Please change to `v-translate='params'`: \".concat(o));var v=rd(e).getTranslation(o,l,s,f?u:null,e.current),h=Object.assign((i=r.instance)!==null&&i!==void 0?i:{},r.value),d=ds(e)(v,h,c,null);t.innerHTML=d};function lg(e){var t=function(r,n,i){r.dataset.currentLanguage=e.current,jA(e,r,n,i)};return{beforeMount:function(r,n,i){r.dataset.msgid||(r.dataset.msgid=r.innerHTML),ha(e,function(){t(r,n,i)}),t(r,n,i)},updated:function(r,n,i){t(r,n,i)}}}var ug={availableLanguages:{en:\"English\"},defaultLanguage:\"en\",mutedLanguages:[],silent:!1,translations:{},setGlobalProperties:!0,provideDirective:!0,provideComponent:!0};function Qz(e){e===void 0&&(e={}),Object.keys(e).forEach(function(o){if(Object.keys(ug).indexOf(o)===-1)throw new Error(\"\".concat(o,\" is an invalid option for the translate plugin.\"))});var t=Ul(Ul({},ug),e),r=wa(og(t.translations)),n=Ai({available:t.availableLanguages,muted:t.mutedLanguages,silent:t.silent,translations:Ee({get:function(){return r.value},set:function(o){r.value=og(o)}}),current:t.defaultLanguage,install:function(o){if(o[sh]=n,o.provide(sh,n),t.setGlobalProperties){var s=o.config.globalProperties;s.$gettext=n.$gettext,s.$pgettext=n.$pgettext,s.$ngettext=n.$ngettext,s.$npgettext=n.$npgettext,s.$gettextInterpolate=n.interpolate,s.$language=n}t.provideDirective&&o.directive(\"translate\",lg(n)),t.provideComponent&&o.component(\"translate\",sg)}}),i=rd(n),a=ds(n);return n.$gettext=i.gettext.bind(i),n.$pgettext=i.pgettext.bind(i),n.$ngettext=i.ngettext.bind(i),n.$npgettext=i.npgettext.bind(i),n.interpolate=a.bind(a),n.directive=lg(n),n.component=sg,n}var KA=!1;/*!\n  * pinia v2.0.12\n  * (c) 2022 Eduardo San Martin Morote\n  * @license MIT\n  */let w1;const Ru=e=>w1=e,b1=Symbol();function lh(e){return e&&typeof e==\"object\"&&Object.prototype.toString.call(e)===\"[object Object]\"&&typeof e.toJSON!=\"function\"}var Co;(function(e){e.direct=\"direct\",e.patchObject=\"patch object\",e.patchFunction=\"patch function\"})(Co||(Co={}));function Jz(){const e=n_(!0),t=e.run(()=>wa({}));let r=[],n=[];const i=_a({install(a){Ru(i),i._a=a,a.provide(b1,i),a.config.globalProperties.$pinia=i,n.forEach(o=>r.push(o)),n=[]},use(a){return!this._a&&!KA?n.push(a):r.push(a),this},_p:r,_a:null,_e:e,_s:new Map,state:t});return i}const S1=()=>{};function fg(e,t,r,n=S1){e.push(t);const i=()=>{const a=e.indexOf(t);a>-1&&(e.splice(a,1),n())};return!r&&Oa()&&Du(i),i}function Bi(e,...t){e.slice().forEach(r=>{r(...t)})}function uh(e,t){for(const r in t){const n=t[r],i=e[r];lh(i)&&lh(n)&&!Wt(n)&&!bn(n)?e[r]=uh(i,n):e[r]=n}return e}const ZA=Symbol();function QA(e){return!lh(e)||!e.hasOwnProperty(ZA)}const{assign:kr}=Object;function JA(e){return!!(Wt(e)&&e.effect)}function tD(e,t,r,n){const{state:i,actions:a,getters:o}=t,s=r.state.value[e];let l;function u(){s||(r.state.value[e]=i?i():{});const f=DT(r.state.value[e]);return kr(f,a,Object.keys(o||{}).reduce((c,v)=>(c[v]=_a(Ee(()=>{Ru(r);const h=r._s.get(e);return o[v].call(h,h)})),c),{}))}return l=x1(e,u,t,r),l.$reset=function(){const c=i?i():{};this.$patch(v=>{kr(v,c)})},l}function x1(e,t,r={},n,i){let a;const o=r.state,s=kr({actions:{}},r),l={deep:!0};let u,f,c=_a([]),v=_a([]),h;const d=n.state.value[e];!o&&!d&&(n.state.value[e]={}),wa({});function p(b){let x;u=f=!1,typeof b==\"function\"?(b(n.state.value[e]),x={type:Co.patchFunction,storeId:e,events:h}):(uh(n.state.value[e],b),x={type:Co.patchObject,payload:b,storeId:e,events:h}),Bv().then(()=>{u=!0}),f=!0,Bi(c,x,n.state.value[e])}const g=S1;function m(){a.stop(),c=[],v=[],n._s.delete(e)}function y(b,x){return function(){Ru(n);const T=Array.from(arguments),C=[],D=[];function P(O){C.push(O)}function A(O){D.push(O)}Bi(v,{args:T,name:b,store:w,after:P,onError:A});let L;try{L=x.apply(this&&this.$id===e?this:w,T)}catch(O){throw Bi(D,O),O}return L instanceof Promise?L.then(O=>(Bi(C,O),O)).catch(O=>(Bi(D,O),Promise.reject(O))):(Bi(C,L),L)}}const _={_p:n,$id:e,$onAction:fg.bind(null,v),$patch:p,$reset:g,$subscribe(b,x={}){const T=fg(c,b,x.detached,()=>C()),C=a.run(()=>ha(()=>n.state.value[e],D=>{(x.flush===\"sync\"?f:u)&&b({storeId:e,type:Co.direct,events:h},D)},kr({},l,x)));return T},$dispose:m},w=Ai(kr({},_));n._s.set(e,w);const S=n._e.run(()=>(a=n_(),a.run(()=>t())));for(const b in S){const x=S[b];if(Wt(x)&&!JA(x)||bn(x))o||(d&&QA(x)&&(Wt(x)?x.value=d[b]:uh(x,d[b])),n.state.value[e][b]=x);else if(typeof x==\"function\"){const T=y(b,x);S[b]=T,s.actions[b]=x}}return kr(w,S),kr(Ct(w),S),Object.defineProperty(w,\"$state\",{get:()=>n.state.value[e],set:b=>{p(x=>{kr(x,b)})}}),n._p.forEach(b=>{kr(w,a.run(()=>b({store:w,app:n._a,pinia:n,options:s})))}),d&&o&&r.hydrate&&r.hydrate(w.$state,d),u=!0,f=!0,w}function tH(e,t,r){let n,i;const a=typeof t==\"function\";typeof e==\"string\"?(n=e,i=a?r:t):(i=e,n=e.id);function o(s,l){const u=Oa();return s=s||u&&Je(b1),s&&Ru(s),s=w1,s._s.has(n)||(a?x1(n,t,i,s):tD(n,i,s)),s._s.get(n)}return o.$id=n,o}/*!\n  * vue-router v4.0.14\n  * (c) 2022 Eduardo San Martin Morote\n  * @license MIT\n  */const T1=typeof Symbol==\"function\"&&typeof Symbol.toStringTag==\"symbol\",ka=e=>T1?Symbol(e):\"_vr_\"+e,eD=ka(\"rvlm\"),cg=ka(\"rvd\"),Ou=ka(\"r\"),nd=ka(\"rl\"),fh=ka(\"rvl\"),ea=typeof window!=\"undefined\";function rD(e){return e.__esModule||T1&&e[Symbol.toStringTag]===\"Module\"}const Lt=Object.assign;function bf(e,t){const r={};for(const n in t){const i=t[n];r[n]=Array.isArray(i)?i.map(e):e(i)}return r}const Mo=()=>{},nD=/\\/$/,iD=e=>e.replace(nD,\"\");function Sf(e,t,r=\"/\"){let n,i={},a=\"\",o=\"\";const s=t.indexOf(\"?\"),l=t.indexOf(\"#\",s>-1?s:0);return s>-1&&(n=t.slice(0,s),a=t.slice(s+1,l>-1?l:t.length),i=e(a)),l>-1&&(n=n||t.slice(0,l),o=t.slice(l,t.length)),n=lD(n!=null?n:t,r),{fullPath:n+(a&&\"?\")+a+o,path:n,query:i,hash:o}}function aD(e,t){const r=t.query?e(t.query):\"\";return t.path+(r&&\"?\")+r+(t.hash||\"\")}function hg(e,t){return!t||!e.toLowerCase().startsWith(t.toLowerCase())?e:e.slice(t.length)||\"/\"}function oD(e,t,r){const n=t.matched.length-1,i=r.matched.length-1;return n>-1&&n===i&&xa(t.matched[n],r.matched[i])&&C1(t.params,r.params)&&e(t.query)===e(r.query)&&t.hash===r.hash}function xa(e,t){return(e.aliasOf||e)===(t.aliasOf||t)}function C1(e,t){if(Object.keys(e).length!==Object.keys(t).length)return!1;for(const r in e)if(!sD(e[r],t[r]))return!1;return!0}function sD(e,t){return Array.isArray(e)?vg(e,t):Array.isArray(t)?vg(t,e):e===t}function vg(e,t){return Array.isArray(t)?e.length===t.length&&e.every((r,n)=>r===t[n]):e.length===1&&e[0]===t}function lD(e,t){if(e.startsWith(\"/\"))return e;if(!e)return t;const r=t.split(\"/\"),n=e.split(\"/\");let i=r.length-1,a,o;for(a=0;a<n.length;a++)if(o=n[a],!(i===1||o===\".\"))if(o===\"..\")i--;else break;return r.slice(0,i).join(\"/\")+\"/\"+n.slice(a-(a===n.length?1:0)).join(\"/\")}var Ko;(function(e){e.pop=\"pop\",e.push=\"push\"})(Ko||(Ko={}));var Ao;(function(e){e.back=\"back\",e.forward=\"forward\",e.unknown=\"\"})(Ao||(Ao={}));function uD(e){if(!e)if(ea){const t=document.querySelector(\"base\");e=t&&t.getAttribute(\"href\")||\"/\",e=e.replace(/^\\w+:\\/\\/[^\\/]+/,\"\")}else e=\"/\";return e[0]!==\"/\"&&e[0]!==\"#\"&&(e=\"/\"+e),iD(e)}const fD=/^[^#]+#/;function cD(e,t){return e.replace(fD,\"#\")+t}function hD(e,t){const r=document.documentElement.getBoundingClientRect(),n=e.getBoundingClientRect();return{behavior:t.behavior,left:n.left-r.left-(t.left||0),top:n.top-r.top-(t.top||0)}}const ku=()=>({left:window.pageXOffset,top:window.pageYOffset});function vD(e){let t;if(\"el\"in e){const r=e.el,n=typeof r==\"string\"&&r.startsWith(\"#\"),i=typeof r==\"string\"?n?document.getElementById(r.slice(1)):document.querySelector(r):r;if(!i)return;t=hD(i,e)}else t=e;\"scrollBehavior\"in document.documentElement.style?window.scrollTo(t):window.scrollTo(t.left!=null?t.left:window.pageXOffset,t.top!=null?t.top:window.pageYOffset)}function dg(e,t){return(history.state?history.state.position-t:-1)+e}const ch=new Map;function dD(e,t){ch.set(e,t)}function pD(e){const t=ch.get(e);return ch.delete(e),t}let gD=()=>location.protocol+\"//\"+location.host;function M1(e,t){const{pathname:r,search:n,hash:i}=t,a=e.indexOf(\"#\");if(a>-1){let s=i.includes(e.slice(a))?e.slice(a).length:1,l=i.slice(s);return l[0]!==\"/\"&&(l=\"/\"+l),hg(l,\"\")}return hg(r,e)+n+i}function mD(e,t,r,n){let i=[],a=[],o=null;const s=({state:v})=>{const h=M1(e,location),d=r.value,p=t.value;let g=0;if(v){if(r.value=h,t.value=v,o&&o===d){o=null;return}g=p?v.position-p.position:0}else n(h);i.forEach(m=>{m(r.value,d,{delta:g,type:Ko.pop,direction:g?g>0?Ao.forward:Ao.back:Ao.unknown})})};function l(){o=r.value}function u(v){i.push(v);const h=()=>{const d=i.indexOf(v);d>-1&&i.splice(d,1)};return a.push(h),h}function f(){const{history:v}=window;!v.state||v.replaceState(Lt({},v.state,{scroll:ku()}),\"\")}function c(){for(const v of a)v();a=[],window.removeEventListener(\"popstate\",s),window.removeEventListener(\"beforeunload\",f)}return window.addEventListener(\"popstate\",s),window.addEventListener(\"beforeunload\",f),{pauseListeners:l,listen:u,destroy:c}}function pg(e,t,r,n=!1,i=!1){return{back:e,current:t,forward:r,replaced:n,position:window.history.length,scroll:i?ku():null}}function yD(e){const{history:t,location:r}=window,n={value:M1(e,r)},i={value:t.state};i.value||a(n.value,{back:null,current:n.value,forward:null,position:t.length-1,replaced:!0,scroll:null},!0);function a(l,u,f){const c=e.indexOf(\"#\"),v=c>-1?(r.host&&document.querySelector(\"base\")?e:e.slice(c))+l:gD()+e+l;try{t[f?\"replaceState\":\"pushState\"](u,\"\",v),i.value=u}catch(h){console.error(h),r[f?\"replace\":\"assign\"](v)}}function o(l,u){const f=Lt({},t.state,pg(i.value.back,l,i.value.forward,!0),u,{position:i.value.position});a(l,f,!0),n.value=l}function s(l,u){const f=Lt({},i.value,t.state,{forward:l,scroll:ku()});a(f.current,f,!0);const c=Lt({},pg(n.value,l,null),{position:f.position+1},u);a(l,c,!1),n.value=l}return{location:n,state:i,push:s,replace:o}}function eH(e){e=uD(e);const t=yD(e),r=mD(e,t.state,t.location,t.replace);function n(a,o=!0){o||r.pauseListeners(),history.go(a)}const i=Lt({location:\"\",base:e,go:n,createHref:cD.bind(null,e)},t,r);return Object.defineProperty(i,\"location\",{enumerable:!0,get:()=>t.location.value}),Object.defineProperty(i,\"state\",{enumerable:!0,get:()=>t.state.value}),i}function _D(e){return typeof e==\"string\"||e&&typeof e==\"object\"}function A1(e){return typeof e==\"string\"||typeof e==\"symbol\"}const tn={path:\"/\",name:void 0,params:{},query:{},hash:\"\",fullPath:\"/\",matched:[],meta:{},redirectedFrom:void 0},D1=ka(\"nf\");var gg;(function(e){e[e.aborted=4]=\"aborted\",e[e.cancelled=8]=\"cancelled\",e[e.duplicated=16]=\"duplicated\"})(gg||(gg={}));function Ta(e,t){return Lt(new Error,{type:e,[D1]:!0},t)}function en(e,t){return e instanceof Error&&D1 in e&&(t==null||!!(e.type&t))}const mg=\"[^/]+?\",wD={sensitive:!1,strict:!1,start:!0,end:!0},bD=/[.+*?^${}()[\\]/\\\\]/g;function SD(e,t){const r=Lt({},wD,t),n=[];let i=r.start?\"^\":\"\";const a=[];for(const u of e){const f=u.length?[]:[90];r.strict&&!u.length&&(i+=\"/\");for(let c=0;c<u.length;c++){const v=u[c];let h=40+(r.sensitive?.25:0);if(v.type===0)c||(i+=\"/\"),i+=v.value.replace(bD,\"\\\\$&\"),h+=40;else if(v.type===1){const{value:d,repeatable:p,optional:g,regexp:m}=v;a.push({name:d,repeatable:p,optional:g});const y=m||mg;if(y!==mg){h+=10;try{new RegExp(`(${y})`)}catch(w){throw new Error(`Invalid custom RegExp for param \"${d}\" (${y}): `+w.message)}}let _=p?`((?:${y})(?:/(?:${y}))*)`:`(${y})`;c||(_=g&&u.length<2?`(?:/${_})`:\"/\"+_),g&&(_+=\"?\"),i+=_,h+=20,g&&(h+=-8),p&&(h+=-20),y===\".*\"&&(h+=-50)}f.push(h)}n.push(f)}if(r.strict&&r.end){const u=n.length-1;n[u][n[u].length-1]+=.7000000000000001}r.strict||(i+=\"/?\"),r.end?i+=\"$\":r.strict&&(i+=\"(?:/|$)\");const o=new RegExp(i,r.sensitive?\"\":\"i\");function s(u){const f=u.match(o),c={};if(!f)return null;for(let v=1;v<f.length;v++){const h=f[v]||\"\",d=a[v-1];c[d.name]=h&&d.repeatable?h.split(\"/\"):h}return c}function l(u){let f=\"\",c=!1;for(const v of e){(!c||!f.endsWith(\"/\"))&&(f+=\"/\"),c=!1;for(const h of v)if(h.type===0)f+=h.value;else if(h.type===1){const{value:d,repeatable:p,optional:g}=h,m=d in u?u[d]:\"\";if(Array.isArray(m)&&!p)throw new Error(`Provided param \"${d}\" is an array but it is not repeatable (* or + modifiers)`);const y=Array.isArray(m)?m.join(\"/\"):m;if(!y)if(g)v.length<2&&(f.endsWith(\"/\")?f=f.slice(0,-1):c=!0);else throw new Error(`Missing required param \"${d}\"`);f+=y}}return f}return{re:o,score:n,keys:a,parse:s,stringify:l}}function xD(e,t){let r=0;for(;r<e.length&&r<t.length;){const n=t[r]-e[r];if(n)return n;r++}return e.length<t.length?e.length===1&&e[0]===40+40?-1:1:e.length>t.length?t.length===1&&t[0]===40+40?1:-1:0}function TD(e,t){let r=0;const n=e.score,i=t.score;for(;r<n.length&&r<i.length;){const a=xD(n[r],i[r]);if(a)return a;r++}return i.length-n.length}const CD={type:0,value:\"\"},MD=/[a-zA-Z0-9_]/;function AD(e){if(!e)return[[]];if(e===\"/\")return[[CD]];if(!e.startsWith(\"/\"))throw new Error(`Invalid path \"${e}\"`);function t(h){throw new Error(`ERR (${r})/\"${u}\": ${h}`)}let r=0,n=r;const i=[];let a;function o(){a&&i.push(a),a=[]}let s=0,l,u=\"\",f=\"\";function c(){!u||(r===0?a.push({type:0,value:u}):r===1||r===2||r===3?(a.length>1&&(l===\"*\"||l===\"+\")&&t(`A repeatable param (${u}) must be alone in its segment. eg: '/:ids+.`),a.push({type:1,value:u,regexp:f,repeatable:l===\"*\"||l===\"+\",optional:l===\"*\"||l===\"?\"})):t(\"Invalid state to consume buffer\"),u=\"\")}function v(){u+=l}for(;s<e.length;){if(l=e[s++],l===\"\\\\\"&&r!==2){n=r,r=4;continue}switch(r){case 0:l===\"/\"?(u&&c(),o()):l===\":\"?(c(),r=1):v();break;case 4:v(),r=n;break;case 1:l===\"(\"?r=2:MD.test(l)?v():(c(),r=0,l!==\"*\"&&l!==\"?\"&&l!==\"+\"&&s--);break;case 2:l===\")\"?f[f.length-1]==\"\\\\\"?f=f.slice(0,-1)+l:r=3:f+=l;break;case 3:c(),r=0,l!==\"*\"&&l!==\"?\"&&l!==\"+\"&&s--,f=\"\";break;default:t(\"Unknown state\");break}}return r===2&&t(`Unfinished custom RegExp for param \"${u}\"`),c(),o(),i}function DD(e,t,r){const n=SD(AD(e.path),r),i=Lt(n,{record:e,parent:t,children:[],alias:[]});return t&&!i.record.aliasOf==!t.record.aliasOf&&t.children.push(i),i}function PD(e,t){const r=[],n=new Map;t=_g({strict:!1,end:!0,sensitive:!1},t);function i(f){return n.get(f)}function a(f,c,v){const h=!v,d=ED(f);d.aliasOf=v&&v.record;const p=_g(t,f),g=[d];if(\"alias\"in f){const _=typeof f.alias==\"string\"?[f.alias]:f.alias;for(const w of _)g.push(Lt({},d,{components:v?v.record.components:d.components,path:w,aliasOf:v?v.record:d}))}let m,y;for(const _ of g){const{path:w}=_;if(c&&w[0]!==\"/\"){const S=c.record.path,b=S[S.length-1]===\"/\"?\"\":\"/\";_.path=c.record.path+(w&&b+w)}if(m=DD(_,c,p),v?v.alias.push(m):(y=y||m,y!==m&&y.alias.push(m),h&&f.name&&!yg(m)&&o(f.name)),\"children\"in d){const S=d.children;for(let b=0;b<S.length;b++)a(S[b],m,v&&v.children[b])}v=v||m,l(m)}return y?()=>{o(y)}:Mo}function o(f){if(A1(f)){const c=n.get(f);c&&(n.delete(f),r.splice(r.indexOf(c),1),c.children.forEach(o),c.alias.forEach(o))}else{const c=r.indexOf(f);c>-1&&(r.splice(c,1),f.record.name&&n.delete(f.record.name),f.children.forEach(o),f.alias.forEach(o))}}function s(){return r}function l(f){let c=0;for(;c<r.length&&TD(f,r[c])>=0&&(f.record.path!==r[c].record.path||!P1(f,r[c]));)c++;r.splice(c,0,f),f.record.name&&!yg(f)&&n.set(f.record.name,f)}function u(f,c){let v,h={},d,p;if(\"name\"in f&&f.name){if(v=n.get(f.name),!v)throw Ta(1,{location:f});p=v.record.name,h=Lt(ID(c.params,v.keys.filter(y=>!y.optional).map(y=>y.name)),f.params),d=v.stringify(h)}else if(\"path\"in f)d=f.path,v=r.find(y=>y.re.test(d)),v&&(h=v.parse(d),p=v.record.name);else{if(v=c.name?n.get(c.name):r.find(y=>y.re.test(c.path)),!v)throw Ta(1,{location:f,currentLocation:c});p=v.record.name,h=Lt({},c.params,f.params),d=v.stringify(h)}const g=[];let m=v;for(;m;)g.unshift(m.record),m=m.parent;return{name:p,path:d,params:h,matched:g,meta:RD(g)}}return e.forEach(f=>a(f)),{addRoute:a,resolve:u,removeRoute:o,getRoutes:s,getRecordMatcher:i}}function ID(e,t){const r={};for(const n of t)n in e&&(r[n]=e[n]);return r}function ED(e){return{path:e.path,redirect:e.redirect,name:e.name,meta:e.meta||{},aliasOf:void 0,beforeEnter:e.beforeEnter,props:LD(e),children:e.children||[],instances:{},leaveGuards:new Set,updateGuards:new Set,enterCallbacks:{},components:\"components\"in e?e.components||{}:{default:e.component}}}function LD(e){const t={},r=e.props||!1;if(\"component\"in e)t.default=r;else for(const n in e.components)t[n]=typeof r==\"boolean\"?r:r[n];return t}function yg(e){for(;e;){if(e.record.aliasOf)return!0;e=e.parent}return!1}function RD(e){return e.reduce((t,r)=>Lt(t,r.meta),{})}function _g(e,t){const r={};for(const n in e)r[n]=n in t?t[n]:e[n];return r}function P1(e,t){return t.children.some(r=>r===e||P1(e,r))}const I1=/#/g,OD=/&/g,kD=/\\//g,ND=/=/g,BD=/\\?/g,E1=/\\+/g,FD=/%5B/g,zD=/%5D/g,L1=/%5E/g,HD=/%60/g,R1=/%7B/g,$D=/%7C/g,O1=/%7D/g,VD=/%20/g;function id(e){return encodeURI(\"\"+e).replace($D,\"|\").replace(FD,\"[\").replace(zD,\"]\")}function GD(e){return id(e).replace(R1,\"{\").replace(O1,\"}\").replace(L1,\"^\")}function hh(e){return id(e).replace(E1,\"%2B\").replace(VD,\"+\").replace(I1,\"%23\").replace(OD,\"%26\").replace(HD,\"`\").replace(R1,\"{\").replace(O1,\"}\").replace(L1,\"^\")}function UD(e){return hh(e).replace(ND,\"%3D\")}function WD(e){return id(e).replace(I1,\"%23\").replace(BD,\"%3F\")}function YD(e){return e==null?\"\":WD(e).replace(kD,\"%2F\")}function Wl(e){try{return decodeURIComponent(\"\"+e)}catch(t){}return\"\"+e}function qD(e){const t={};if(e===\"\"||e===\"?\")return t;const n=(e[0]===\"?\"?e.slice(1):e).split(\"&\");for(let i=0;i<n.length;++i){const a=n[i].replace(E1,\" \"),o=a.indexOf(\"=\"),s=Wl(o<0?a:a.slice(0,o)),l=o<0?null:Wl(a.slice(o+1));if(s in t){let u=t[s];Array.isArray(u)||(u=t[s]=[u]),u.push(l)}else t[s]=l}return t}function wg(e){let t=\"\";for(let r in e){const n=e[r];if(r=UD(r),n==null){n!==void 0&&(t+=(t.length?\"&\":\"\")+r);continue}(Array.isArray(n)?n.map(a=>a&&hh(a)):[n&&hh(n)]).forEach(a=>{a!==void 0&&(t+=(t.length?\"&\":\"\")+r,a!=null&&(t+=\"=\"+a))})}return t}function XD(e){const t={};for(const r in e){const n=e[r];n!==void 0&&(t[r]=Array.isArray(n)?n.map(i=>i==null?null:\"\"+i):n==null?n:\"\"+n)}return t}function Ga(){let e=[];function t(n){return e.push(n),()=>{const i=e.indexOf(n);i>-1&&e.splice(i,1)}}function r(){e=[]}return{add:t,list:()=>e,reset:r}}function pn(e,t,r,n,i){const a=n&&(n.enterCallbacks[i]=n.enterCallbacks[i]||[]);return()=>new Promise((o,s)=>{const l=c=>{c===!1?s(Ta(4,{from:r,to:t})):c instanceof Error?s(c):_D(c)?s(Ta(2,{from:t,to:c})):(a&&n.enterCallbacks[i]===a&&typeof c==\"function\"&&a.push(c),o())},u=e.call(n&&n.instances[i],t,r,l);let f=Promise.resolve(u);e.length<3&&(f=f.then(l)),f.catch(c=>s(c))})}function xf(e,t,r,n){const i=[];for(const a of e)for(const o in a.components){let s=a.components[o];if(!(t!==\"beforeRouteEnter\"&&!a.instances[o]))if(jD(s)){const u=(s.__vccOpts||s)[t];u&&i.push(pn(u,r,n,a,o))}else{let l=s();i.push(()=>l.then(u=>{if(!u)return Promise.reject(new Error(`Couldn't resolve component \"${o}\" at \"${a.path}\"`));const f=rD(u)?u.default:u;a.components[o]=f;const v=(f.__vccOpts||f)[t];return v&&pn(v,r,n,a,o)()}))}}return i}function jD(e){return typeof e==\"object\"||\"displayName\"in e||\"props\"in e||\"__vccOpts\"in e}function bg(e){const t=Je(Ou),r=Je(nd),n=Ee(()=>t.resolve(wo(e.to))),i=Ee(()=>{const{matched:l}=n.value,{length:u}=l,f=l[u-1],c=r.matched;if(!f||!c.length)return-1;const v=c.findIndex(xa.bind(null,f));if(v>-1)return v;const h=Sg(l[u-2]);return u>1&&Sg(f)===h&&c[c.length-1].path!==h?c.findIndex(xa.bind(null,l[u-2])):v}),a=Ee(()=>i.value>-1&&JD(r.params,n.value.params)),o=Ee(()=>i.value>-1&&i.value===r.matched.length-1&&C1(r.params,n.value.params));function s(l={}){return QD(l)?t[wo(e.replace)?\"replace\":\"push\"](wo(e.to)).catch(Mo):Promise.resolve()}return{route:n,href:Ee(()=>n.value.href),isActive:a,isExactActive:o,navigate:s}}const KD=Gv({name:\"RouterLink\",props:{to:{type:[String,Object],required:!0},replace:Boolean,activeClass:String,exactActiveClass:String,custom:Boolean,ariaCurrentValue:{type:String,default:\"page\"}},useLink:bg,setup(e,{slots:t}){const r=Ai(bg(e)),{options:n}=Je(Ou),i=Ee(()=>({[xg(e.activeClass,n.linkActiveClass,\"router-link-active\")]:r.isActive,[xg(e.exactActiveClass,n.linkExactActiveClass,\"router-link-exact-active\")]:r.isExactActive}));return()=>{const a=t.default&&t.default(r);return e.custom?a:jo(\"a\",{\"aria-current\":r.isExactActive?e.ariaCurrentValue:null,href:r.href,onClick:r.navigate,class:i.value},a)}}}),ZD=KD;function QD(e){if(!(e.metaKey||e.altKey||e.ctrlKey||e.shiftKey)&&!e.defaultPrevented&&!(e.button!==void 0&&e.button!==0)){if(e.currentTarget&&e.currentTarget.getAttribute){const t=e.currentTarget.getAttribute(\"target\");if(/\\b_blank\\b/i.test(t))return}return e.preventDefault&&e.preventDefault(),!0}}function JD(e,t){for(const r in t){const n=t[r],i=e[r];if(typeof n==\"string\"){if(n!==i)return!1}else if(!Array.isArray(i)||i.length!==n.length||n.some((a,o)=>a!==i[o]))return!1}return!0}function Sg(e){return e?e.aliasOf?e.aliasOf.path:e.path:\"\"}const xg=(e,t,r)=>e!=null?e:t!=null?t:r,tP=Gv({name:\"RouterView\",inheritAttrs:!1,props:{name:{type:String,default:\"default\"},route:Object},setup(e,{attrs:t,slots:r}){const n=Je(fh),i=Ee(()=>e.route||n.value),a=Je(cg,0),o=Ee(()=>i.value.matched[a]);_l(cg,a+1),_l(eD,o),_l(fh,i);const s=wa();return ha(()=>[s.value,o.value,e.name],([l,u,f],[c,v,h])=>{u&&(u.instances[f]=l,v&&v!==u&&l&&l===c&&(u.leaveGuards.size||(u.leaveGuards=v.leaveGuards),u.updateGuards.size||(u.updateGuards=v.updateGuards))),l&&u&&(!v||!xa(u,v)||!c)&&(u.enterCallbacks[f]||[]).forEach(d=>d(l))},{flush:\"post\"}),()=>{const l=i.value,u=o.value,f=u&&u.components[e.name],c=e.name;if(!f)return Tg(r.default,{Component:f,route:l});const v=u.props[e.name],h=v?v===!0?l.params:typeof v==\"function\"?v(l):v:null,p=jo(f,Lt({},h,t,{onVnodeUnmounted:g=>{g.component.isUnmounted&&(u.instances[c]=null)},ref:s}));return Tg(r.default,{Component:p,route:l})||p}}});function Tg(e,t){if(!e)return null;const r=e(t);return r.length===1?r[0]:r}const eP=tP;function rH(e){const t=PD(e.routes,e),r=e.parseQuery||qD,n=e.stringifyQuery||wg,i=e.history,a=Ga(),o=Ga(),s=Ga(),l=CT(tn);let u=tn;ea&&e.scrollBehavior&&\"scrollRestoration\"in history&&(history.scrollRestoration=\"manual\");const f=bf.bind(null,k=>\"\"+k),c=bf.bind(null,YD),v=bf.bind(null,Wl);function h(k,G){let $,Q;return A1(k)?($=t.getRecordMatcher(k),Q=G):Q=k,t.addRoute(Q,$)}function d(k){const G=t.getRecordMatcher(k);G&&t.removeRoute(G)}function p(){return t.getRoutes().map(k=>k.record)}function g(k){return!!t.getRecordMatcher(k)}function m(k,G){if(G=Lt({},G||l.value),typeof k==\"string\"){const j=Sf(r,k,G.path),M=t.resolve({path:j.path},G),E=i.createHref(j.fullPath);return Lt(j,M,{params:v(M.params),hash:Wl(j.hash),redirectedFrom:void 0,href:E})}let $;if(\"path\"in k)$=Lt({},k,{path:Sf(r,k.path,G.path).path});else{const j=Lt({},k.params);for(const M in j)j[M]==null&&delete j[M];$=Lt({},k,{params:c(k.params)}),G.params=c(G.params)}const Q=t.resolve($,G),vt=k.hash||\"\";Q.params=f(v(Q.params));const ft=aD(n,Lt({},k,{hash:GD(vt),path:Q.path})),X=i.createHref(ft);return Lt({fullPath:ft,hash:vt,query:n===wg?XD(k.query):k.query||{}},Q,{redirectedFrom:void 0,href:X})}function y(k){return typeof k==\"string\"?Sf(r,k,l.value.path):Lt({},k)}function _(k,G){if(u!==k)return Ta(8,{from:G,to:k})}function w(k){return x(k)}function S(k){return w(Lt(y(k),{replace:!0}))}function b(k){const G=k.matched[k.matched.length-1];if(G&&G.redirect){const{redirect:$}=G;let Q=typeof $==\"function\"?$(k):$;return typeof Q==\"string\"&&(Q=Q.includes(\"?\")||Q.includes(\"#\")?Q=y(Q):{path:Q},Q.params={}),Lt({query:k.query,hash:k.hash,params:k.params},Q)}}function x(k,G){const $=u=m(k),Q=l.value,vt=k.state,ft=k.force,X=k.replace===!0,j=b($);if(j)return x(Lt(y(j),{state:vt,force:ft,replace:X}),G||$);const M=$;M.redirectedFrom=G;let E;return!ft&&oD(n,Q,$)&&(E=Ta(16,{to:M,from:Q}),lt(Q,Q,!0,!1)),(E?Promise.resolve(E):C(M,Q)).catch(R=>en(R)?en(R,2)?R:K(R):tt(R,M,Q)).then(R=>{if(R){if(en(R,2))return x(Lt(y(R.to),{state:vt,force:ft,replace:X}),G||M)}else R=P(M,Q,!0,X,vt);return D(M,Q,R),R})}function T(k,G){const $=_(k,G);return $?Promise.reject($):Promise.resolve()}function C(k,G){let $;const[Q,vt,ft]=rP(k,G);$=xf(Q.reverse(),\"beforeRouteLeave\",k,G);for(const j of Q)j.leaveGuards.forEach(M=>{$.push(pn(M,k,G))});const X=T.bind(null,k,G);return $.push(X),Fi($).then(()=>{$=[];for(const j of a.list())$.push(pn(j,k,G));return $.push(X),Fi($)}).then(()=>{$=xf(vt,\"beforeRouteUpdate\",k,G);for(const j of vt)j.updateGuards.forEach(M=>{$.push(pn(M,k,G))});return $.push(X),Fi($)}).then(()=>{$=[];for(const j of k.matched)if(j.beforeEnter&&!G.matched.includes(j))if(Array.isArray(j.beforeEnter))for(const M of j.beforeEnter)$.push(pn(M,k,G));else $.push(pn(j.beforeEnter,k,G));return $.push(X),Fi($)}).then(()=>(k.matched.forEach(j=>j.enterCallbacks={}),$=xf(ft,\"beforeRouteEnter\",k,G),$.push(X),Fi($))).then(()=>{$=[];for(const j of o.list())$.push(pn(j,k,G));return $.push(X),Fi($)}).catch(j=>en(j,8)?j:Promise.reject(j))}function D(k,G,$){for(const Q of s.list())Q(k,G,$)}function P(k,G,$,Q,vt){const ft=_(k,G);if(ft)return ft;const X=G===tn,j=ea?history.state:{};$&&(Q||X?i.replace(k.fullPath,Lt({scroll:X&&j&&j.scroll},vt)):i.push(k.fullPath,vt)),l.value=k,lt(k,G,$,X),K()}let A;function L(){A=i.listen((k,G,$)=>{const Q=m(k),vt=b(Q);if(vt){x(Lt(vt,{replace:!0}),Q).catch(Mo);return}u=Q;const ft=l.value;ea&&dD(dg(ft.fullPath,$.delta),ku()),C(Q,ft).catch(X=>en(X,12)?X:en(X,2)?(x(X.to,Q).then(j=>{en(j,20)&&!$.delta&&$.type===Ko.pop&&i.go(-1,!1)}).catch(Mo),Promise.reject()):($.delta&&i.go(-$.delta,!1),tt(X,Q,ft))).then(X=>{X=X||P(Q,ft,!1),X&&($.delta?i.go(-$.delta,!1):$.type===Ko.pop&&en(X,20)&&i.go(-1,!1)),D(Q,ft,X)}).catch(Mo)})}let O=Ga(),z=Ga(),N;function tt(k,G,$){K(k);const Q=z.list();return Q.length?Q.forEach(vt=>vt(k,G,$)):console.error(k),Promise.reject(k)}function V(){return N&&l.value!==tn?Promise.resolve():new Promise((k,G)=>{O.add([k,G])})}function K(k){return N||(N=!k,L(),O.list().forEach(([G,$])=>k?$(k):G()),O.reset()),k}function lt(k,G,$,Q){const{scrollBehavior:vt}=e;if(!ea||!vt)return Promise.resolve();const ft=!$&&pD(dg(k.fullPath,0))||(Q||!$)&&history.state&&history.state.scroll||null;return Bv().then(()=>vt(k,G,ft)).then(X=>X&&vD(X)).catch(X=>tt(X,k,G))}const yt=k=>i.go(k);let ut;const ht=new Set;return{currentRoute:l,addRoute:h,removeRoute:d,hasRoute:g,getRoutes:p,resolve:m,options:e,push:w,replace:S,go:yt,back:()=>yt(-1),forward:()=>yt(1),beforeEach:a.add,beforeResolve:o.add,afterEach:s.add,onError:z.add,isReady:V,install(k){const G=this;k.component(\"RouterLink\",ZD),k.component(\"RouterView\",eP),k.config.globalProperties.$router=G,Object.defineProperty(k.config.globalProperties,\"$route\",{enumerable:!0,get:()=>wo(l)}),ea&&!ut&&l.value===tn&&(ut=!0,w(i.location).catch(vt=>{}));const $={};for(const vt in tn)$[vt]=Ee(()=>l.value[vt]);k.provide(Ou,G),k.provide(nd,Ai($)),k.provide(fh,l);const Q=k.unmount;ht.add(k),k.unmount=function(){ht.delete(k),ht.size<1&&(u=tn,A&&A(),l.value=tn,ut=!1,N=!1),Q()}}}}function Fi(e){return e.reduce((t,r)=>t.then(()=>r()),Promise.resolve())}function rP(e,t){const r=[],n=[],i=[],a=Math.max(t.matched.length,e.matched.length);for(let o=0;o<a;o++){const s=t.matched[o];s&&(e.matched.find(u=>xa(u,s))?n.push(s):r.push(s));const l=e.matched[o];l&&(t.matched.find(u=>xa(u,l))||i.push(l))}return[r,n,i]}function nH(){return Je(Ou)}function iH(){return Je(nd)}/*! *****************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */var vh=function(e,t){return vh=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(r,n){r.__proto__=n}||function(r,n){for(var i in n)Object.prototype.hasOwnProperty.call(n,i)&&(r[i]=n[i])},vh(e,t)};function J(e,t){if(typeof t!=\"function\"&&t!==null)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");vh(e,t);function r(){this.constructor=e}e.prototype=t===null?Object.create(t):(r.prototype=t.prototype,new r)}var nP=function(){function e(){this.firefox=!1,this.ie=!1,this.edge=!1,this.newEdge=!1,this.weChat=!1}return e}(),iP=function(){function e(){this.browser=new nP,this.node=!1,this.wxa=!1,this.worker=!1,this.svgSupported=!1,this.touchEventsSupported=!1,this.pointerEventsSupported=!1,this.domSupported=!1,this.transformSupported=!1,this.transform3dSupported=!1,this.hasGlobalWindow=typeof window!=\"undefined\"}return e}(),ui=new iP;typeof wx==\"object\"&&typeof wx.getSystemInfoSync==\"function\"?(ui.wxa=!0,ui.touchEventsSupported=!0):typeof document==\"undefined\"&&typeof self!=\"undefined\"?ui.worker=!0:typeof navigator==\"undefined\"?(ui.node=!0,ui.svgSupported=!0):aP(navigator.userAgent,ui);function aP(e,t){var r=t.browser,n=e.match(/Firefox\\/([\\d.]+)/),i=e.match(/MSIE\\s([\\d.]+)/)||e.match(/Trident\\/.+?rv:(([\\d.]+))/),a=e.match(/Edge?\\/([\\d.]+)/),o=/micromessenger/i.test(e);n&&(r.firefox=!0,r.version=n[1]),i&&(r.ie=!0,r.version=i[1]),a&&(r.edge=!0,r.version=a[1],r.newEdge=+a[1].split(\".\")[0]>18),o&&(r.weChat=!0),t.svgSupported=typeof SVGRect!=\"undefined\",t.touchEventsSupported=\"ontouchstart\"in window&&!r.ie&&!r.edge,t.pointerEventsSupported=\"onpointerdown\"in window&&(r.edge||r.ie&&+r.version>=11),t.domSupported=typeof document!=\"undefined\";var s=document.documentElement.style;t.transform3dSupported=(r.ie&&\"transition\"in s||r.edge||\"WebKitCSSMatrix\"in window&&\"m11\"in new WebKitCSSMatrix||\"MozPerspective\"in s)&&!(\"OTransition\"in s),t.transformSupported=t.transform3dSupported||r.ie&&+r.version>=9}var wt=ui,ad=12,oP=\"sans-serif\",bi=ad+\"px \"+oP,sP=20,lP=100,uP=\"007LLmW'55;N0500LLLLLLLLLL00NNNLzWW\\\\\\\\WQb\\\\0FWLg\\\\bWb\\\\WQ\\\\WrWWQ000CL5LLFLL0LL**F*gLLLL5F0LF\\\\FFF5.5N\";function fP(e){var t={};if(typeof JSON==\"undefined\")return t;for(var r=0;r<e.length;r++){var n=String.fromCharCode(r+32),i=(e.charCodeAt(r)-sP)/lP;t[n]=i}return t}var cP=fP(uP),Pi={createCanvas:function(){return typeof document!=\"undefined\"&&document.createElement(\"canvas\")},measureText:function(){var e,t;return function(r,n){if(!e){var i=Pi.createCanvas();e=i&&i.getContext(\"2d\")}if(e)return t!==n&&(t=e.font=n||bi),e.measureText(r);r=r||\"\",n=n||bi;var a=/^([0-9]*?)px$/.exec(n),o=+(a&&a[1])||ad,s=0;if(n.indexOf(\"mono\")>=0)s=o*r.length;else for(var l=0;l<r.length;l++){var u=cP[r[l]];s+=u==null?o:u*o}return{width:s}}}(),loadImage:function(e,t,r){var n=new Image;return n.onload=t,n.onerror=r,n.src=e,n}},k1=Ln([\"Function\",\"RegExp\",\"Date\",\"Error\",\"CanvasGradient\",\"CanvasPattern\",\"Image\",\"Canvas\"],function(e,t){return e[\"[object \"+t+\"]\"]=!0,e},{}),N1=Ln([\"Int8\",\"Uint8\",\"Uint8Clamped\",\"Int16\",\"Uint16\",\"Int32\",\"Uint32\",\"Float32\",\"Float64\"],function(e,t){return e[\"[object \"+t+\"Array]\"]=!0,e},{}),ps=Object.prototype.toString,Nu=Array.prototype,hP=Nu.forEach,vP=Nu.filter,od=Nu.slice,dP=Nu.map,Cg=function(){}.constructor,Es=Cg?Cg.prototype:null,sd=\"__proto__\",pP=2311;function B1(){return pP++}function ld(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];typeof console!=\"undefined\"&&console.error.apply(console,e)}function xt(e){if(e==null||typeof e!=\"object\")return e;var t=e,r=ps.call(e);if(r===\"[object Array]\"){if(!Po(e)){t=[];for(var n=0,i=e.length;n<i;n++)t[n]=xt(e[n])}}else if(N1[r]){if(!Po(e)){var a=e.constructor;if(a.from)t=a.from(e);else{t=new a(e.length);for(var n=0,i=e.length;n<i;n++)t[n]=e[n]}}}else if(!k1[r]&&!Po(e)&&!Yl(e)){t={};for(var o in e)e.hasOwnProperty(o)&&o!==sd&&(t[o]=xt(e[o]))}return t}function Dt(e,t,r){if(!st(t)||!st(e))return r?xt(t):e;for(var n in t)if(t.hasOwnProperty(n)&&n!==sd){var i=e[n],a=t[n];st(a)&&st(i)&&!et(a)&&!et(i)&&!Yl(a)&&!Yl(i)&&!Mg(a)&&!Mg(i)&&!Po(a)&&!Po(i)?Dt(i,a,r):(r||!(n in e))&&(e[n]=xt(t[n]))}return e}function Y(e,t){if(Object.assign)Object.assign(e,t);else for(var r in t)t.hasOwnProperty(r)&&r!==sd&&(e[r]=t[r]);return e}function Pt(e,t,r){for(var n=Gt(t),i=0;i<n.length;i++){var a=n[i];(r?t[a]!=null:e[a]==null)&&(e[a]=t[a])}return e}Pi.createCanvas;function It(e,t){if(e){if(e.indexOf)return e.indexOf(t);for(var r=0,n=e.length;r<n;r++)if(e[r]===t)return r}return-1}function gP(e,t){var r=e.prototype;function n(){}n.prototype=t.prototype,e.prototype=new n;for(var i in r)r.hasOwnProperty(i)&&(e.prototype[i]=r[i]);e.prototype.constructor=e,e.superClass=t}function Pr(e,t,r){if(e=\"prototype\"in e?e.prototype:e,t=\"prototype\"in t?t.prototype:t,Object.getOwnPropertyNames)for(var n=Object.getOwnPropertyNames(t),i=0;i<n.length;i++){var a=n[i];a!==\"constructor\"&&(r?t[a]!=null:e[a]==null)&&(e[a]=t[a])}else Pt(e,t,r)}function Me(e){return!e||typeof e==\"string\"?!1:typeof e.length==\"number\"}function I(e,t,r){if(!!(e&&t))if(e.forEach&&e.forEach===hP)e.forEach(t,r);else if(e.length===+e.length)for(var n=0,i=e.length;n<i;n++)t.call(r,e[n],n,e);else for(var a in e)e.hasOwnProperty(a)&&t.call(r,e[a],a,e)}function ct(e,t,r){if(!e)return[];if(!t)return ud(e);if(e.map&&e.map===dP)return e.map(t,r);for(var n=[],i=0,a=e.length;i<a;i++)n.push(t.call(r,e[i],i,e));return n}function Ln(e,t,r,n){if(!!(e&&t)){for(var i=0,a=e.length;i<a;i++)r=t.call(n,r,e[i],i,e);return r}}function Se(e,t,r){if(!e)return[];if(!t)return ud(e);if(e.filter&&e.filter===vP)return e.filter(t,r);for(var n=[],i=0,a=e.length;i<a;i++)t.call(r,e[i],i,e)&&n.push(e[i]);return n}function Gt(e){if(!e)return[];if(Object.keys)return Object.keys(e);var t=[];for(var r in e)e.hasOwnProperty(r)&&t.push(r);return t}function mP(e,t){for(var r=[],n=2;n<arguments.length;n++)r[n-2]=arguments[n];return function(){return e.apply(t,r.concat(od.call(arguments)))}}var Ft=Es&&mt(Es.bind)?Es.call.bind(Es.bind):mP;function Xt(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];return function(){return e.apply(this,t.concat(od.call(arguments)))}}function et(e){return Array.isArray?Array.isArray(e):ps.call(e)===\"[object Array]\"}function mt(e){return typeof e==\"function\"}function it(e){return typeof e==\"string\"}function dh(e){return ps.call(e)===\"[object String]\"}function zt(e){return typeof e==\"number\"}function st(e){var t=typeof e;return t===\"function\"||!!e&&t===\"object\"}function Mg(e){return!!k1[ps.call(e)]}function Be(e){return!!N1[ps.call(e)]}function Yl(e){return typeof e==\"object\"&&typeof e.nodeType==\"number\"&&typeof e.ownerDocument==\"object\"}function Bu(e){return e.colorStops!=null}function yP(e){return e.image!=null}function ql(e){return e!==e}function Zo(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var r=0,n=e.length;r<n;r++)if(e[r]!=null)return e[r]}function Mt(e,t){return e!=null?e:t}function Do(e,t,r){return e!=null?e:t!=null?t:r}function ud(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];return od.apply(e,t)}function F1(e){if(typeof e==\"number\")return[e,e,e,e];var t=e.length;return t===2?[e[0],e[1],e[0],e[1]]:t===3?[e[0],e[1],e[2],e[1]]:e}function Wr(e,t){if(!e)throw new Error(t)}function Tr(e){return e==null?null:typeof e.trim==\"function\"?e.trim():e.replace(/^[\\s\\uFEFF\\xA0]+|[\\s\\uFEFF\\xA0]+$/g,\"\")}var z1=\"__ec_primitive__\";function ph(e){e[z1]=!0}function Po(e){return e[z1]}var _P=function(){function e(t){this.data={};var r=et(t);this.data={};var n=this;t instanceof e?t.each(i):t&&I(t,i);function i(a,o){r?n.set(a,o):n.set(o,a)}}return e.prototype.get=function(t){return this.data.hasOwnProperty(t)?this.data[t]:null},e.prototype.set=function(t,r){return this.data[t]=r},e.prototype.each=function(t,r){for(var n in this.data)this.data.hasOwnProperty(n)&&t.call(r,this.data[n],n)},e.prototype.keys=function(){return Gt(this.data)},e.prototype.removeKey=function(t){delete this.data[t]},e}();function _t(e){return new _P(e)}function wP(e,t){for(var r=new e.constructor(e.length+t.length),n=0;n<e.length;n++)r[n]=e[n];for(var i=e.length,n=0;n<t.length;n++)r[n+i]=t[n];return r}function Fu(e,t){var r;if(Object.create)r=Object.create(e);else{var n=function(){};n.prototype=e,r=new n}return t&&Y(r,t),r}function H1(e){var t=e.style;t.webkitUserSelect=\"none\",t.userSelect=\"none\",t.webkitTapHighlightColor=\"rgba(0,0,0,0)\",t[\"-webkit-touch-callout\"]=\"none\"}function Ca(e,t){return e.hasOwnProperty(t)}function Ce(){}var bP=180/Math.PI;function Na(e,t){return e==null&&(e=0),t==null&&(t=0),[e,t]}function SP(e){return[e[0],e[1]]}function Ag(e,t,r){return e[0]=t[0]+r[0],e[1]=t[1]+r[1],e}function xP(e,t,r){return e[0]=t[0]-r[0],e[1]=t[1]-r[1],e}function TP(e){return Math.sqrt(CP(e))}function CP(e){return e[0]*e[0]+e[1]*e[1]}function Tf(e,t,r){return e[0]=t[0]*r,e[1]=t[1]*r,e}function MP(e,t){var r=TP(t);return r===0?(e[0]=0,e[1]=0):(e[0]=t[0]/r,e[1]=t[1]/r),e}function gh(e,t){return Math.sqrt((e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1]))}var mh=gh;function AP(e,t){return(e[0]-t[0])*(e[0]-t[0])+(e[1]-t[1])*(e[1]-t[1])}var va=AP;function Cf(e,t,r,n){return e[0]=t[0]+n*(r[0]-t[0]),e[1]=t[1]+n*(r[1]-t[1]),e}function tr(e,t,r){var n=t[0],i=t[1];return e[0]=r[0]*n+r[2]*i+r[4],e[1]=r[1]*n+r[3]*i+r[5],e}function ia(e,t,r){return e[0]=Math.min(t[0],r[0]),e[1]=Math.min(t[1],r[1]),e}function aa(e,t,r){return e[0]=Math.max(t[0],r[0]),e[1]=Math.max(t[1],r[1]),e}var zi=function(){function e(t,r){this.target=t,this.topTarget=r&&r.topTarget}return e}(),DP=function(){function e(t){this.handler=t,t.on(\"mousedown\",this._dragStart,this),t.on(\"mousemove\",this._drag,this),t.on(\"mouseup\",this._dragEnd,this)}return e.prototype._dragStart=function(t){for(var r=t.target;r&&!r.draggable;)r=r.parent||r.__hostTarget;r&&(this._draggingTarget=r,r.dragging=!0,this._x=t.offsetX,this._y=t.offsetY,this.handler.dispatchToElement(new zi(r,t),\"dragstart\",t.event))},e.prototype._drag=function(t){var r=this._draggingTarget;if(r){var n=t.offsetX,i=t.offsetY,a=n-this._x,o=i-this._y;this._x=n,this._y=i,r.drift(a,o,t),this.handler.dispatchToElement(new zi(r,t),\"drag\",t.event);var s=this.handler.findHover(n,i,r).target,l=this._dropTarget;this._dropTarget=s,r!==s&&(l&&s!==l&&this.handler.dispatchToElement(new zi(l,t),\"dragleave\",t.event),s&&s!==l&&this.handler.dispatchToElement(new zi(s,t),\"dragenter\",t.event))}},e.prototype._dragEnd=function(t){var r=this._draggingTarget;r&&(r.dragging=!1),this.handler.dispatchToElement(new zi(r,t),\"dragend\",t.event),this._dropTarget&&this.handler.dispatchToElement(new zi(this._dropTarget,t),\"drop\",t.event),this._draggingTarget=null,this._dropTarget=null},e}(),PP=DP,IP=function(){function e(t){t&&(this._$eventProcessor=t)}return e.prototype.on=function(t,r,n,i){this._$handlers||(this._$handlers={});var a=this._$handlers;if(typeof r==\"function\"&&(i=n,n=r,r=null),!n||!t)return this;var o=this._$eventProcessor;r!=null&&o&&o.normalizeQuery&&(r=o.normalizeQuery(r)),a[t]||(a[t]=[]);for(var s=0;s<a[t].length;s++)if(a[t][s].h===n)return this;var l={h:n,query:r,ctx:i||this,callAtLast:n.zrEventfulCallAtLast},u=a[t].length-1,f=a[t][u];return f&&f.callAtLast?a[t].splice(u,0,l):a[t].push(l),this},e.prototype.isSilent=function(t){var r=this._$handlers;return!r||!r[t]||!r[t].length},e.prototype.off=function(t,r){var n=this._$handlers;if(!n)return this;if(!t)return this._$handlers={},this;if(r){if(n[t]){for(var i=[],a=0,o=n[t].length;a<o;a++)n[t][a].h!==r&&i.push(n[t][a]);n[t]=i}n[t]&&n[t].length===0&&delete n[t]}else delete n[t];return this},e.prototype.trigger=function(t){for(var r=[],n=1;n<arguments.length;n++)r[n-1]=arguments[n];if(!this._$handlers)return this;var i=this._$handlers[t],a=this._$eventProcessor;if(i)for(var o=r.length,s=i.length,l=0;l<s;l++){var u=i[l];if(!(a&&a.filter&&u.query!=null&&!a.filter(t,u.query)))switch(o){case 0:u.h.call(u.ctx);break;case 1:u.h.call(u.ctx,r[0]);break;case 2:u.h.call(u.ctx,r[0],r[1]);break;default:u.h.apply(u.ctx,r);break}}return a&&a.afterTrigger&&a.afterTrigger(t),this},e.prototype.triggerWithContext=function(t){for(var r=[],n=1;n<arguments.length;n++)r[n-1]=arguments[n];if(!this._$handlers)return this;var i=this._$handlers[t],a=this._$eventProcessor;if(i)for(var o=r.length,s=r[o-1],l=i.length,u=0;u<l;u++){var f=i[u];if(!(a&&a.filter&&f.query!=null&&!a.filter(t,f.query)))switch(o){case 0:f.h.call(s);break;case 1:f.h.call(s,r[0]);break;case 2:f.h.call(s,r[0],r[1]);break;default:f.h.apply(s,r.slice(1,o-1));break}}return a&&a.afterTrigger&&a.afterTrigger(t),this},e}(),Ir=IP,EP=Math.log(2);function yh(e,t,r,n,i,a){var o=n+\"-\"+i,s=e.length;if(a.hasOwnProperty(o))return a[o];if(t===1){var l=Math.round(Math.log((1<<s)-1&~i)/EP);return e[r][l]}for(var u=n|1<<r,f=r+1;n&1<<f;)f++;for(var c=0,v=0,h=0;v<s;v++){var d=1<<v;d&i||(c+=(h%2?-1:1)*e[r][v]*yh(e,t-1,f,u,i|d,a),h++)}return a[o]=c,c}function Dg(e,t){var r=[[e[0],e[1],1,0,0,0,-t[0]*e[0],-t[0]*e[1]],[0,0,0,e[0],e[1],1,-t[1]*e[0],-t[1]*e[1]],[e[2],e[3],1,0,0,0,-t[2]*e[2],-t[2]*e[3]],[0,0,0,e[2],e[3],1,-t[3]*e[2],-t[3]*e[3]],[e[4],e[5],1,0,0,0,-t[4]*e[4],-t[4]*e[5]],[0,0,0,e[4],e[5],1,-t[5]*e[4],-t[5]*e[5]],[e[6],e[7],1,0,0,0,-t[6]*e[6],-t[6]*e[7]],[0,0,0,e[6],e[7],1,-t[7]*e[6],-t[7]*e[7]]],n={},i=yh(r,8,0,0,0,n);if(i!==0){for(var a=[],o=0;o<8;o++)for(var s=0;s<8;s++)a[s]==null&&(a[s]=0),a[s]+=((o+s)%2?-1:1)*yh(r,7,o===0?1:0,1<<o,1<<s,n)/i*t[o];return function(l,u,f){var c=u*a[6]+f*a[7]+1;l[0]=(u*a[0]+f*a[1]+a[2])/c,l[1]=(u*a[3]+f*a[4]+a[5])/c}}}var Pg=\"___zrEVENTSAVED\",Mf=[];function LP(e,t,r,n,i){return _h(Mf,t,n,i,!0)&&_h(e,r,Mf[0],Mf[1])}function _h(e,t,r,n,i){if(t.getBoundingClientRect&&wt.domSupported&&!$1(t)){var a=t[Pg]||(t[Pg]={}),o=RP(t,a),s=OP(o,a,i);if(s)return s(e,r,n),!0}return!1}function RP(e,t){var r=t.markers;if(r)return r;r=t.markers=[];for(var n=[\"left\",\"right\"],i=[\"top\",\"bottom\"],a=0;a<4;a++){var o=document.createElement(\"div\"),s=o.style,l=a%2,u=(a>>1)%2;s.cssText=[\"position: absolute\",\"visibility: hidden\",\"padding: 0\",\"margin: 0\",\"border-width: 0\",\"user-select: none\",\"width:0\",\"height:0\",n[l]+\":0\",i[u]+\":0\",n[1-l]+\":auto\",i[1-u]+\":auto\",\"\"].join(\"!important;\"),e.appendChild(o),r.push(o)}return r}function OP(e,t,r){for(var n=r?\"invTrans\":\"trans\",i=t[n],a=t.srcCoords,o=[],s=[],l=!0,u=0;u<4;u++){var f=e[u].getBoundingClientRect(),c=2*u,v=f.left,h=f.top;o.push(v,h),l=l&&a&&v===a[c]&&h===a[c+1],s.push(e[u].offsetLeft,e[u].offsetTop)}return l&&i?i:(t.srcCoords=o,t[n]=r?Dg(s,o):Dg(o,s))}function $1(e){return e.nodeName.toUpperCase()===\"CANVAS\"}var kP=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Af=[],NP=wt.browser.firefox&&+wt.browser.version.split(\".\")[0]<39;function wh(e,t,r,n){return r=r||{},n?Ig(e,t,r):NP&&t.layerX!=null&&t.layerX!==t.offsetX?(r.zrX=t.layerX,r.zrY=t.layerY):t.offsetX!=null?(r.zrX=t.offsetX,r.zrY=t.offsetY):Ig(e,t,r),r}function Ig(e,t,r){if(wt.domSupported&&e.getBoundingClientRect){var n=t.clientX,i=t.clientY;if($1(e)){var a=e.getBoundingClientRect();r.zrX=n-a.left,r.zrY=i-a.top;return}else if(_h(Af,e,n,i)){r.zrX=Af[0],r.zrY=Af[1];return}}r.zrX=r.zrY=0}function fd(e){return e||window.event}function Ue(e,t,r){if(t=fd(t),t.zrX!=null)return t;var n=t.type,i=n&&n.indexOf(\"touch\")>=0;if(i){var o=n!==\"touchend\"?t.targetTouches[0]:t.changedTouches[0];o&&wh(e,o,t,r)}else{wh(e,t,t,r);var a=BP(t);t.zrDelta=a?a/120:-(t.detail||0)/3}var s=t.button;return t.which==null&&s!==void 0&&kP.test(t.type)&&(t.which=s&1?1:s&2?3:s&4?2:0),t}function BP(e){var t=e.wheelDelta;if(t)return t;var r=e.deltaX,n=e.deltaY;if(r==null||n==null)return t;var i=Math.abs(n!==0?n:r),a=n>0?-1:n<0?1:r>0?-1:1;return 3*i*a}function FP(e,t,r,n){e.addEventListener(t,r,n)}function zP(e,t,r,n){e.removeEventListener(t,r,n)}var V1=function(e){e.preventDefault(),e.stopPropagation(),e.cancelBubble=!0},HP=function(){function e(){this._track=[]}return e.prototype.recognize=function(t,r,n){return this._doTrack(t,r,n),this._recognize(t)},e.prototype.clear=function(){return this._track.length=0,this},e.prototype._doTrack=function(t,r,n){var i=t.touches;if(!!i){for(var a={points:[],touches:[],target:r,event:t},o=0,s=i.length;o<s;o++){var l=i[o],u=wh(n,l,{});a.points.push([u.zrX,u.zrY]),a.touches.push(l)}this._track.push(a)}},e.prototype._recognize=function(t){for(var r in Df)if(Df.hasOwnProperty(r)){var n=Df[r](this._track,t);if(n)return n}},e}();function Eg(e){var t=e[1][0]-e[0][0],r=e[1][1]-e[0][1];return Math.sqrt(t*t+r*r)}function $P(e){return[(e[0][0]+e[1][0])/2,(e[0][1]+e[1][1])/2]}var Df={pinch:function(e,t){var r=e.length;if(!!r){var n=(e[r-1]||{}).points,i=(e[r-2]||{}).points||n;if(i&&i.length>1&&n&&n.length>1){var a=Eg(n)/Eg(i);!isFinite(a)&&(a=1),t.pinchScale=a;var o=$P(n);return t.pinchX=o[0],t.pinchY=o[1],{type:\"pinch\",target:e[0].target,event:t}}}}},G1=\"silent\";function VP(e,t,r){return{type:e,event:r,target:t.target,topTarget:t.topTarget,cancelBubble:!1,offsetX:r.zrX,offsetY:r.zrY,gestureEvent:r.gestureEvent,pinchX:r.pinchX,pinchY:r.pinchY,pinchScale:r.pinchScale,wheelDelta:r.zrDelta,zrByTouch:r.zrByTouch,which:r.which,stop:GP}}function GP(){V1(this.event)}var UP=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.handler=null,r}return t.prototype.dispose=function(){},t.prototype.setCursor=function(){},t}(Ir),Ua=function(){function e(t,r){this.x=t,this.y=r}return e}(),WP=[\"click\",\"dblclick\",\"mousewheel\",\"mouseout\",\"mouseup\",\"mousedown\",\"mousemove\",\"contextmenu\"],U1=function(e){J(t,e);function t(r,n,i,a){var o=e.call(this)||this;return o._hovered=new Ua(0,0),o.storage=r,o.painter=n,o.painterRoot=a,i=i||new UP,o.proxy=null,o.setHandlerProxy(i),o._draggingMgr=new PP(o),o}return t.prototype.setHandlerProxy=function(r){this.proxy&&this.proxy.dispose(),r&&(I(WP,function(n){r.on&&r.on(n,this[n],this)},this),r.handler=this),this.proxy=r},t.prototype.mousemove=function(r){var n=r.zrX,i=r.zrY,a=W1(this,n,i),o=this._hovered,s=o.target;s&&!s.__zr&&(o=this.findHover(o.x,o.y),s=o.target);var l=this._hovered=a?new Ua(n,i):this.findHover(n,i),u=l.target,f=this.proxy;f.setCursor&&f.setCursor(u?u.cursor:\"default\"),s&&u!==s&&this.dispatchToElement(o,\"mouseout\",r),this.dispatchToElement(l,\"mousemove\",r),u&&u!==s&&this.dispatchToElement(l,\"mouseover\",r)},t.prototype.mouseout=function(r){var n=r.zrEventControl;n!==\"only_globalout\"&&this.dispatchToElement(this._hovered,\"mouseout\",r),n!==\"no_globalout\"&&this.trigger(\"globalout\",{type:\"globalout\",event:r})},t.prototype.resize=function(){this._hovered=new Ua(0,0)},t.prototype.dispatch=function(r,n){var i=this[r];i&&i.call(this,n)},t.prototype.dispose=function(){this.proxy.dispose(),this.storage=null,this.proxy=null,this.painter=null},t.prototype.setCursorStyle=function(r){var n=this.proxy;n.setCursor&&n.setCursor(r)},t.prototype.dispatchToElement=function(r,n,i){r=r||{};var a=r.target;if(!(a&&a.silent)){for(var o=\"on\"+n,s=VP(n,r,i);a&&(a[o]&&(s.cancelBubble=!!a[o].call(a,s)),a.trigger(n,s),a=a.__hostTarget?a.__hostTarget:a.parent,!s.cancelBubble););s.cancelBubble||(this.trigger(n,s),this.painter&&this.painter.eachOtherLayer&&this.painter.eachOtherLayer(function(l){typeof l[o]==\"function\"&&l[o].call(l,s),l.trigger&&l.trigger(n,s)}))}},t.prototype.findHover=function(r,n,i){for(var a=this.storage.getDisplayList(),o=new Ua(r,n),s=a.length-1;s>=0;s--){var l=void 0;if(a[s]!==i&&!a[s].ignore&&(l=YP(a[s],r,n))&&(!o.topTarget&&(o.topTarget=a[s]),l!==G1)){o.target=a[s];break}}return o},t.prototype.processGesture=function(r,n){this._gestureMgr||(this._gestureMgr=new HP);var i=this._gestureMgr;n===\"start\"&&i.clear();var a=i.recognize(r,this.findHover(r.zrX,r.zrY,null).target,this.proxy.dom);if(n===\"end\"&&i.clear(),a){var o=a.type;r.gestureEvent=o;var s=new Ua;s.target=a.target,this.dispatchToElement(s,o,a.event)}},t}(Ir);I([\"click\",\"mousedown\",\"mouseup\",\"mousewheel\",\"dblclick\",\"contextmenu\"],function(e){U1.prototype[e]=function(t){var r=t.zrX,n=t.zrY,i=W1(this,r,n),a,o;if((e!==\"mouseup\"||!i)&&(a=this.findHover(r,n),o=a.target),e===\"mousedown\")this._downEl=o,this._downPoint=[t.zrX,t.zrY],this._upEl=o;else if(e===\"mouseup\")this._upEl=o;else if(e===\"click\"){if(this._downEl!==this._upEl||!this._downPoint||mh(this._downPoint,[t.zrX,t.zrY])>4)return;this._downPoint=null}this.dispatchToElement(a,e,t)}});function YP(e,t,r){if(e[e.rectHover?\"rectContain\":\"contain\"](t,r)){for(var n=e,i=void 0,a=!1;n;){if(n.ignoreClip&&(a=!0),!a){var o=n.getClipPath();if(o&&!o.contain(t,r))return!1;n.silent&&(i=!0)}var s=n.__hostTarget;n=s||n.parent}return i?G1:!0}return!1}function W1(e,t,r){var n=e.painter;return t<0||t>n.getWidth()||r<0||r>n.getHeight()}var qP=U1,Y1=32,Wa=7;function XP(e){for(var t=0;e>=Y1;)t|=e&1,e>>=1;return e+t}function Lg(e,t,r,n){var i=t+1;if(i===r)return 1;if(n(e[i++],e[t])<0){for(;i<r&&n(e[i],e[i-1])<0;)i++;jP(e,t,i)}else for(;i<r&&n(e[i],e[i-1])>=0;)i++;return i-t}function jP(e,t,r){for(r--;t<r;){var n=e[t];e[t++]=e[r],e[r--]=n}}function Rg(e,t,r,n,i){for(n===t&&n++;n<r;n++){for(var a=e[n],o=t,s=n,l;o<s;)l=o+s>>>1,i(a,e[l])<0?s=l:o=l+1;var u=n-o;switch(u){case 3:e[o+3]=e[o+2];case 2:e[o+2]=e[o+1];case 1:e[o+1]=e[o];break;default:for(;u>0;)e[o+u]=e[o+u-1],u--}e[o]=a}}function Pf(e,t,r,n,i,a){var o=0,s=0,l=1;if(a(e,t[r+i])>0){for(s=n-i;l<s&&a(e,t[r+i+l])>0;)o=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),o+=i,l+=i}else{for(s=i+1;l<s&&a(e,t[r+i-l])<=0;)o=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var u=o;o=i-l,l=i-u}for(o++;o<l;){var f=o+(l-o>>>1);a(e,t[r+f])>0?o=f+1:l=f}return l}function If(e,t,r,n,i,a){var o=0,s=0,l=1;if(a(e,t[r+i])<0){for(s=i+1;l<s&&a(e,t[r+i-l])<0;)o=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s);var u=o;o=i-l,l=i-u}else{for(s=n-i;l<s&&a(e,t[r+i+l])>=0;)o=l,l=(l<<1)+1,l<=0&&(l=s);l>s&&(l=s),o+=i,l+=i}for(o++;o<l;){var f=o+(l-o>>>1);a(e,t[r+f])<0?l=f:o=f+1}return l}function KP(e,t){var r=Wa,n,i,a=0,o=[];n=[],i=[];function s(h,d){n[a]=h,i[a]=d,a+=1}function l(){for(;a>1;){var h=a-2;if(h>=1&&i[h-1]<=i[h]+i[h+1]||h>=2&&i[h-2]<=i[h]+i[h-1])i[h-1]<i[h+1]&&h--;else if(i[h]>i[h+1])break;f(h)}}function u(){for(;a>1;){var h=a-2;h>0&&i[h-1]<i[h+1]&&h--,f(h)}}function f(h){var d=n[h],p=i[h],g=n[h+1],m=i[h+1];i[h]=p+m,h===a-3&&(n[h+1]=n[h+2],i[h+1]=i[h+2]),a--;var y=If(e[g],e,d,p,0,t);d+=y,p-=y,p!==0&&(m=Pf(e[d+p-1],e,g,m,m-1,t),m!==0&&(p<=m?c(d,p,g,m):v(d,p,g,m)))}function c(h,d,p,g){var m=0;for(m=0;m<d;m++)o[m]=e[h+m];var y=0,_=p,w=h;if(e[w++]=e[_++],--g===0){for(m=0;m<d;m++)e[w+m]=o[y+m];return}if(d===1){for(m=0;m<g;m++)e[w+m]=e[_+m];e[w+g]=o[y];return}for(var S=r,b,x,T;;){b=0,x=0,T=!1;do if(t(e[_],o[y])<0){if(e[w++]=e[_++],x++,b=0,--g===0){T=!0;break}}else if(e[w++]=o[y++],b++,x=0,--d===1){T=!0;break}while((b|x)<S);if(T)break;do{if(b=If(e[_],o,y,d,0,t),b!==0){for(m=0;m<b;m++)e[w+m]=o[y+m];if(w+=b,y+=b,d-=b,d<=1){T=!0;break}}if(e[w++]=e[_++],--g===0){T=!0;break}if(x=Pf(o[y],e,_,g,0,t),x!==0){for(m=0;m<x;m++)e[w+m]=e[_+m];if(w+=x,_+=x,g-=x,g===0){T=!0;break}}if(e[w++]=o[y++],--d===1){T=!0;break}S--}while(b>=Wa||x>=Wa);if(T)break;S<0&&(S=0),S+=2}if(r=S,r<1&&(r=1),d===1){for(m=0;m<g;m++)e[w+m]=e[_+m];e[w+g]=o[y]}else{if(d===0)throw new Error;for(m=0;m<d;m++)e[w+m]=o[y+m]}}function v(h,d,p,g){var m=0;for(m=0;m<g;m++)o[m]=e[p+m];var y=h+d-1,_=g-1,w=p+g-1,S=0,b=0;if(e[w--]=e[y--],--d===0){for(S=w-(g-1),m=0;m<g;m++)e[S+m]=o[m];return}if(g===1){for(w-=d,y-=d,b=w+1,S=y+1,m=d-1;m>=0;m--)e[b+m]=e[S+m];e[w]=o[_];return}for(var x=r;;){var T=0,C=0,D=!1;do if(t(o[_],e[y])<0){if(e[w--]=e[y--],T++,C=0,--d===0){D=!0;break}}else if(e[w--]=o[_--],C++,T=0,--g===1){D=!0;break}while((T|C)<x);if(D)break;do{if(T=d-If(o[_],e,h,d,d-1,t),T!==0){for(w-=T,y-=T,d-=T,b=w+1,S=y+1,m=T-1;m>=0;m--)e[b+m]=e[S+m];if(d===0){D=!0;break}}if(e[w--]=o[_--],--g===1){D=!0;break}if(C=g-Pf(e[y],o,0,g,g-1,t),C!==0){for(w-=C,_-=C,g-=C,b=w+1,S=_+1,m=0;m<C;m++)e[b+m]=o[S+m];if(g<=1){D=!0;break}}if(e[w--]=e[y--],--d===0){D=!0;break}x--}while(T>=Wa||C>=Wa);if(D)break;x<0&&(x=0),x+=2}if(r=x,r<1&&(r=1),g===1){for(w-=d,y-=d,b=w+1,S=y+1,m=d-1;m>=0;m--)e[b+m]=e[S+m];e[w]=o[_]}else{if(g===0)throw new Error;for(S=w-(g-1),m=0;m<g;m++)e[S+m]=o[m]}}return{mergeRuns:l,forceMergeRuns:u,pushRun:s}}function xl(e,t,r,n){r||(r=0),n||(n=e.length);var i=n-r;if(!(i<2)){var a=0;if(i<Y1){a=Lg(e,r,n,t),Rg(e,r,n,r+a,t);return}var o=KP(e,t),s=XP(i);do{if(a=Lg(e,r,n,t),a<s){var l=i;l>s&&(l=s),Rg(e,r,r+l,r+a,t),a=l}o.pushRun(r,a),o.mergeRuns(),i-=a,r+=a}while(i!==0);o.forceMergeRuns()}}var Le=1,ho=2,ra=4,Og=!1;function Ef(){Og||(Og=!0,console.warn(\"z / z2 / zlevel of displayable is invalid, which may cause unexpected errors\"))}function kg(e,t){return e.zlevel===t.zlevel?e.z===t.z?e.z2-t.z2:e.z-t.z:e.zlevel-t.zlevel}var ZP=function(){function e(){this._roots=[],this._displayList=[],this._displayListLen=0,this.displayableSortFunc=kg}return e.prototype.traverse=function(t,r){for(var n=0;n<this._roots.length;n++)this._roots[n].traverse(t,r)},e.prototype.getDisplayList=function(t,r){r=r||!1;var n=this._displayList;return(t||!n.length)&&this.updateDisplayList(r),n},e.prototype.updateDisplayList=function(t){this._displayListLen=0;for(var r=this._roots,n=this._displayList,i=0,a=r.length;i<a;i++)this._updateAndAddDisplayable(r[i],null,t);n.length=this._displayListLen,xl(n,kg)},e.prototype._updateAndAddDisplayable=function(t,r,n){if(!(t.ignore&&!n)){t.beforeUpdate(),t.update(),t.afterUpdate();var i=t.getClipPath();if(t.ignoreClip)r=null;else if(i){r?r=r.slice():r=[];for(var a=i,o=t;a;)a.parent=o,a.updateTransform(),r.push(a),o=a,a=a.getClipPath()}if(t.childrenRef){for(var s=t.childrenRef(),l=0;l<s.length;l++){var u=s[l];t.__dirty&&(u.__dirty|=Le),this._updateAndAddDisplayable(u,r,n)}t.__dirty=0}else{var f=t;r&&r.length?f.__clipPaths=r:f.__clipPaths&&f.__clipPaths.length>0&&(f.__clipPaths=[]),isNaN(f.z)&&(Ef(),f.z=0),isNaN(f.z2)&&(Ef(),f.z2=0),isNaN(f.zlevel)&&(Ef(),f.zlevel=0),this._displayList[this._displayListLen++]=f}var c=t.getDecalElement&&t.getDecalElement();c&&this._updateAndAddDisplayable(c,r,n);var v=t.getTextGuideLine();v&&this._updateAndAddDisplayable(v,r,n);var h=t.getTextContent();h&&this._updateAndAddDisplayable(h,r,n)}},e.prototype.addRoot=function(t){t.__zr&&t.__zr.storage===this||this._roots.push(t)},e.prototype.delRoot=function(t){if(t instanceof Array){for(var r=0,n=t.length;r<n;r++)this.delRoot(t[r]);return}var i=It(this._roots,t);i>=0&&this._roots.splice(i,1)},e.prototype.delAllRoots=function(){this._roots=[],this._displayList=[],this._displayListLen=0},e.prototype.getRoots=function(){return this._roots},e.prototype.dispose=function(){this._displayList=null,this._roots=null},e}(),QP=ZP,q1;q1=wt.hasGlobalWindow&&(window.requestAnimationFrame&&window.requestAnimationFrame.bind(window)||window.msRequestAnimationFrame&&window.msRequestAnimationFrame.bind(window)||window.mozRequestAnimationFrame||window.webkitRequestAnimationFrame)||function(e){return setTimeout(e,16)};var bh=q1,Tl={linear:function(e){return e},quadraticIn:function(e){return e*e},quadraticOut:function(e){return e*(2-e)},quadraticInOut:function(e){return(e*=2)<1?.5*e*e:-.5*(--e*(e-2)-1)},cubicIn:function(e){return e*e*e},cubicOut:function(e){return--e*e*e+1},cubicInOut:function(e){return(e*=2)<1?.5*e*e*e:.5*((e-=2)*e*e+2)},quarticIn:function(e){return e*e*e*e},quarticOut:function(e){return 1- --e*e*e*e},quarticInOut:function(e){return(e*=2)<1?.5*e*e*e*e:-.5*((e-=2)*e*e*e-2)},quinticIn:function(e){return e*e*e*e*e},quinticOut:function(e){return--e*e*e*e*e+1},quinticInOut:function(e){return(e*=2)<1?.5*e*e*e*e*e:.5*((e-=2)*e*e*e*e+2)},sinusoidalIn:function(e){return 1-Math.cos(e*Math.PI/2)},sinusoidalOut:function(e){return Math.sin(e*Math.PI/2)},sinusoidalInOut:function(e){return .5*(1-Math.cos(Math.PI*e))},exponentialIn:function(e){return e===0?0:Math.pow(1024,e-1)},exponentialOut:function(e){return e===1?1:1-Math.pow(2,-10*e)},exponentialInOut:function(e){return e===0?0:e===1?1:(e*=2)<1?.5*Math.pow(1024,e-1):.5*(-Math.pow(2,-10*(e-1))+2)},circularIn:function(e){return 1-Math.sqrt(1-e*e)},circularOut:function(e){return Math.sqrt(1- --e*e)},circularInOut:function(e){return(e*=2)<1?-.5*(Math.sqrt(1-e*e)-1):.5*(Math.sqrt(1-(e-=2)*e)+1)},elasticIn:function(e){var t,r=.1,n=.4;return e===0?0:e===1?1:(!r||r<1?(r=1,t=n/4):t=n*Math.asin(1/r)/(2*Math.PI),-(r*Math.pow(2,10*(e-=1))*Math.sin((e-t)*(2*Math.PI)/n)))},elasticOut:function(e){var t,r=.1,n=.4;return e===0?0:e===1?1:(!r||r<1?(r=1,t=n/4):t=n*Math.asin(1/r)/(2*Math.PI),r*Math.pow(2,-10*e)*Math.sin((e-t)*(2*Math.PI)/n)+1)},elasticInOut:function(e){var t,r=.1,n=.4;return e===0?0:e===1?1:(!r||r<1?(r=1,t=n/4):t=n*Math.asin(1/r)/(2*Math.PI),(e*=2)<1?-.5*(r*Math.pow(2,10*(e-=1))*Math.sin((e-t)*(2*Math.PI)/n)):r*Math.pow(2,-10*(e-=1))*Math.sin((e-t)*(2*Math.PI)/n)*.5+1)},backIn:function(e){var t=1.70158;return e*e*((t+1)*e-t)},backOut:function(e){var t=1.70158;return--e*e*((t+1)*e+t)+1},backInOut:function(e){var t=2.5949095;return(e*=2)<1?.5*(e*e*((t+1)*e-t)):.5*((e-=2)*e*((t+1)*e+t)+2)},bounceIn:function(e){return 1-Tl.bounceOut(1-e)},bounceOut:function(e){return e<1/2.75?7.5625*e*e:e<2/2.75?7.5625*(e-=1.5/2.75)*e+.75:e<2.5/2.75?7.5625*(e-=2.25/2.75)*e+.9375:7.5625*(e-=2.625/2.75)*e+.984375},bounceInOut:function(e){return e<.5?Tl.bounceIn(e*2)*.5:Tl.bounceOut(e*2-1)*.5+.5}},X1=Tl,Ls=Math.pow,Cn=Math.sqrt,Xl=1e-8,j1=1e-4,Ng=Cn(3),Rs=1/3,br=Na(),qe=Na(),da=Na();function gn(e){return e>-Xl&&e<Xl}function K1(e){return e>Xl||e<-Xl}function Kt(e,t,r,n,i){var a=1-i;return a*a*(a*e+3*i*t)+i*i*(i*n+3*a*r)}function Bg(e,t,r,n,i){var a=1-i;return 3*(((t-e)*a+2*(r-t)*i)*a+(n-r)*i*i)}function jl(e,t,r,n,i,a){var o=n+3*(t-r)-e,s=3*(r-t*2+e),l=3*(t-e),u=e-i,f=s*s-3*o*l,c=s*l-9*o*u,v=l*l-3*s*u,h=0;if(gn(f)&&gn(c))if(gn(s))a[0]=0;else{var d=-l/s;d>=0&&d<=1&&(a[h++]=d)}else{var p=c*c-4*f*v;if(gn(p)){var g=c/f,d=-s/o+g,m=-g/2;d>=0&&d<=1&&(a[h++]=d),m>=0&&m<=1&&(a[h++]=m)}else if(p>0){var y=Cn(p),_=f*s+1.5*o*(-c+y),w=f*s+1.5*o*(-c-y);_<0?_=-Ls(-_,Rs):_=Ls(_,Rs),w<0?w=-Ls(-w,Rs):w=Ls(w,Rs);var d=(-s-(_+w))/(3*o);d>=0&&d<=1&&(a[h++]=d)}else{var S=(2*f*s-3*o*c)/(2*Cn(f*f*f)),b=Math.acos(S)/3,x=Cn(f),T=Math.cos(b),d=(-s-2*x*T)/(3*o),m=(-s+x*(T+Ng*Math.sin(b)))/(3*o),C=(-s+x*(T-Ng*Math.sin(b)))/(3*o);d>=0&&d<=1&&(a[h++]=d),m>=0&&m<=1&&(a[h++]=m),C>=0&&C<=1&&(a[h++]=C)}}return h}function Z1(e,t,r,n,i){var a=6*r-12*t+6*e,o=9*t+3*n-3*e-9*r,s=3*t-3*e,l=0;if(gn(o)){if(K1(a)){var u=-s/a;u>=0&&u<=1&&(i[l++]=u)}}else{var f=a*a-4*o*s;if(gn(f))i[0]=-a/(2*o);else if(f>0){var c=Cn(f),u=(-a+c)/(2*o),v=(-a-c)/(2*o);u>=0&&u<=1&&(i[l++]=u),v>=0&&v<=1&&(i[l++]=v)}}return l}function Kl(e,t,r,n,i,a){var o=(t-e)*i+e,s=(r-t)*i+t,l=(n-r)*i+r,u=(s-o)*i+o,f=(l-s)*i+s,c=(f-u)*i+u;a[0]=e,a[1]=o,a[2]=u,a[3]=c,a[4]=c,a[5]=f,a[6]=l,a[7]=n}function JP(e,t,r,n,i,a,o,s,l,u,f){var c,v=.005,h=1/0,d,p,g,m;br[0]=l,br[1]=u;for(var y=0;y<1;y+=.05)qe[0]=Kt(e,r,i,o,y),qe[1]=Kt(t,n,a,s,y),g=va(br,qe),g<h&&(c=y,h=g);h=1/0;for(var _=0;_<32&&!(v<j1);_++)d=c-v,p=c+v,qe[0]=Kt(e,r,i,o,d),qe[1]=Kt(t,n,a,s,d),g=va(qe,br),d>=0&&g<h?(c=d,h=g):(da[0]=Kt(e,r,i,o,p),da[1]=Kt(t,n,a,s,p),m=va(da,br),p<=1&&m<h?(c=p,h=m):v*=.5);return f&&(f[0]=Kt(e,r,i,o,c),f[1]=Kt(t,n,a,s,c)),Cn(h)}function tI(e,t,r,n,i,a,o,s,l){for(var u=e,f=t,c=0,v=1/l,h=1;h<=l;h++){var d=h*v,p=Kt(e,r,i,o,d),g=Kt(t,n,a,s,d),m=p-u,y=g-f;c+=Math.sqrt(m*m+y*y),u=p,f=g}return c}function le(e,t,r,n){var i=1-n;return i*(i*e+2*n*t)+n*n*r}function Fg(e,t,r,n){return 2*((1-n)*(t-e)+n*(r-t))}function eI(e,t,r,n,i){var a=e-2*t+r,o=2*(t-e),s=e-n,l=0;if(gn(a)){if(K1(o)){var u=-s/o;u>=0&&u<=1&&(i[l++]=u)}}else{var f=o*o-4*a*s;if(gn(f)){var u=-o/(2*a);u>=0&&u<=1&&(i[l++]=u)}else if(f>0){var c=Cn(f),u=(-o+c)/(2*a),v=(-o-c)/(2*a);u>=0&&u<=1&&(i[l++]=u),v>=0&&v<=1&&(i[l++]=v)}}return l}function Q1(e,t,r){var n=e+r-2*t;return n===0?.5:(e-t)/n}function Zl(e,t,r,n,i){var a=(t-e)*n+e,o=(r-t)*n+t,s=(o-a)*n+a;i[0]=e,i[1]=a,i[2]=s,i[3]=s,i[4]=o,i[5]=r}function rI(e,t,r,n,i,a,o,s,l){var u,f=.005,c=1/0;br[0]=o,br[1]=s;for(var v=0;v<1;v+=.05){qe[0]=le(e,r,i,v),qe[1]=le(t,n,a,v);var h=va(br,qe);h<c&&(u=v,c=h)}c=1/0;for(var d=0;d<32&&!(f<j1);d++){var p=u-f,g=u+f;qe[0]=le(e,r,i,p),qe[1]=le(t,n,a,p);var h=va(qe,br);if(p>=0&&h<c)u=p,c=h;else{da[0]=le(e,r,i,g),da[1]=le(t,n,a,g);var m=va(da,br);g<=1&&m<c?(u=g,c=m):f*=.5}}return l&&(l[0]=le(e,r,i,u),l[1]=le(t,n,a,u)),Cn(c)}function nI(e,t,r,n,i,a,o){for(var s=e,l=t,u=0,f=1/o,c=1;c<=o;c++){var v=c*f,h=le(e,r,i,v),d=le(t,n,a,v),p=h-s,g=d-l;u+=Math.sqrt(p*p+g*g),s=h,l=d}return u}var iI=/cubic-bezier\\(([0-9,\\.e ]+)\\)/;function J1(e){var t=e&&iI.exec(e);if(t){var r=t[1].split(\",\"),n=+Tr(r[0]),i=+Tr(r[1]),a=+Tr(r[2]),o=+Tr(r[3]);if(isNaN(n+i+a+o))return;var s=[];return function(l){return l<=0?0:l>=1?1:jl(0,n,a,1,l,s)&&Kt(0,i,o,1,s[0])}}}var aI=function(){function e(t){this._inited=!1,this._startTime=0,this._pausedTime=0,this._paused=!1,this._life=t.life||1e3,this._delay=t.delay||0,this.loop=t.loop||!1,this.onframe=t.onframe||Ce,this.ondestroy=t.ondestroy||Ce,this.onrestart=t.onrestart||Ce,t.easing&&this.setEasing(t.easing)}return e.prototype.step=function(t,r){if(this._inited||(this._startTime=t+this._delay,this._inited=!0),this._paused){this._pausedTime+=r;return}var n=this._life,i=t-this._startTime-this._pausedTime,a=i/n;a<0&&(a=0),a=Math.min(a,1);var o=this.easingFunc,s=o?o(a):a;if(this.onframe(s),a===1)if(this.loop){var l=i%n;this._startTime=t-l,this._pausedTime=0,this.onrestart()}else return!0;return!1},e.prototype.pause=function(){this._paused=!0},e.prototype.resume=function(){this._paused=!1},e.prototype.setEasing=function(t){this.easing=t,this.easingFunc=mt(t)?t:X1[t]||J1(t)},e}(),oI=aI,tw=function(){function e(t){this.value=t}return e}(),sI=function(){function e(){this._len=0}return e.prototype.insert=function(t){var r=new tw(t);return this.insertEntry(r),r},e.prototype.insertEntry=function(t){this.head?(this.tail.next=t,t.prev=this.tail,t.next=null,this.tail=t):this.head=this.tail=t,this._len++},e.prototype.remove=function(t){var r=t.prev,n=t.next;r?r.next=n:this.head=n,n?n.prev=r:this.tail=r,t.next=t.prev=null,this._len--},e.prototype.len=function(){return this._len},e.prototype.clear=function(){this.head=this.tail=null,this._len=0},e}(),lI=function(){function e(t){this._list=new sI,this._maxSize=10,this._map={},this._maxSize=t}return e.prototype.put=function(t,r){var n=this._list,i=this._map,a=null;if(i[t]==null){var o=n.len(),s=this._lastRemovedEntry;if(o>=this._maxSize&&o>0){var l=n.head;n.remove(l),delete i[l.key],a=l.value,this._lastRemovedEntry=l}s?s.value=r:s=new tw(r),s.key=t,n.insertEntry(s),i[t]=s}return a},e.prototype.get=function(t){var r=this._map[t],n=this._list;if(r!=null)return r!==n.tail&&(n.remove(r),n.insertEntry(r)),r.value},e.prototype.clear=function(){this._list.clear(),this._map={}},e.prototype.len=function(){return this._list.len()},e}(),gs=lI,zg={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};function Mn(e){return e=Math.round(e),e<0?0:e>255?255:e}function Sh(e){return e<0?0:e>1?1:e}function Lf(e){var t=e;return t.length&&t.charAt(t.length-1)===\"%\"?Mn(parseFloat(t)/100*255):Mn(parseInt(t,10))}function Ql(e){var t=e;return t.length&&t.charAt(t.length-1)===\"%\"?Sh(parseFloat(t)/100):Sh(parseFloat(t))}function Rf(e,t,r){return r<0?r+=1:r>1&&(r-=1),r*6<1?e+(t-e)*r*6:r*2<1?t:r*3<2?e+(t-e)*(2/3-r)*6:e}function Os(e,t,r){return e+(t-e)*r}function Ge(e,t,r,n,i){return e[0]=t,e[1]=r,e[2]=n,e[3]=i,e}function xh(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e}var ew=new gs(20),ks=null;function Hi(e,t){ks&&xh(ks,t),ks=ew.put(e,ks||t.slice())}function $r(e,t){if(!!e){t=t||[];var r=ew.get(e);if(r)return xh(t,r);e=e+\"\";var n=e.replace(/ /g,\"\").toLowerCase();if(n in zg)return xh(t,zg[n]),Hi(e,t),t;var i=n.length;if(n.charAt(0)===\"#\"){if(i===4||i===5){var a=parseInt(n.slice(1,4),16);if(!(a>=0&&a<=4095)){Ge(t,0,0,0,1);return}return Ge(t,(a&3840)>>4|(a&3840)>>8,a&240|(a&240)>>4,a&15|(a&15)<<4,i===5?parseInt(n.slice(4),16)/15:1),Hi(e,t),t}else if(i===7||i===9){var a=parseInt(n.slice(1,7),16);if(!(a>=0&&a<=16777215)){Ge(t,0,0,0,1);return}return Ge(t,(a&16711680)>>16,(a&65280)>>8,a&255,i===9?parseInt(n.slice(7),16)/255:1),Hi(e,t),t}return}var o=n.indexOf(\"(\"),s=n.indexOf(\")\");if(o!==-1&&s+1===i){var l=n.substr(0,o),u=n.substr(o+1,s-(o+1)).split(\",\"),f=1;switch(l){case\"rgba\":if(u.length!==4)return u.length===3?Ge(t,+u[0],+u[1],+u[2],1):Ge(t,0,0,0,1);f=Ql(u.pop());case\"rgb\":if(u.length!==3){Ge(t,0,0,0,1);return}return Ge(t,Lf(u[0]),Lf(u[1]),Lf(u[2]),f),Hi(e,t),t;case\"hsla\":if(u.length!==4){Ge(t,0,0,0,1);return}return u[3]=Ql(u[3]),Hg(u,t),Hi(e,t),t;case\"hsl\":if(u.length!==3){Ge(t,0,0,0,1);return}return Hg(u,t),Hi(e,t),t;default:return}}Ge(t,0,0,0,1)}}function Hg(e,t){var r=(parseFloat(e[0])%360+360)%360/360,n=Ql(e[1]),i=Ql(e[2]),a=i<=.5?i*(n+1):i+n-i*n,o=i*2-a;return t=t||[],Ge(t,Mn(Rf(o,a,r+1/3)*255),Mn(Rf(o,a,r)*255),Mn(Rf(o,a,r-1/3)*255),1),e.length===4&&(t[3]=e[3]),t}function $g(e,t){var r=$r(e);if(r){for(var n=0;n<3;n++)t<0?r[n]=r[n]*(1-t)|0:r[n]=(255-r[n])*t+r[n]|0,r[n]>255?r[n]=255:r[n]<0&&(r[n]=0);return zu(r,r.length===4?\"rgba\":\"rgb\")}}function uI(e,t,r){if(!(!(t&&t.length)||!(e>=0&&e<=1))){var n=e*(t.length-1),i=Math.floor(n),a=Math.ceil(n),o=$r(t[i]),s=$r(t[a]),l=n-i,u=zu([Mn(Os(o[0],s[0],l)),Mn(Os(o[1],s[1],l)),Mn(Os(o[2],s[2],l)),Sh(Os(o[3],s[3],l))],\"rgba\");return r?{color:u,leftIndex:i,rightIndex:a,value:n}:u}}function zu(e,t){if(!(!e||!e.length)){var r=e[0]+\",\"+e[1]+\",\"+e[2];return(t===\"rgba\"||t===\"hsva\"||t===\"hsla\")&&(r+=\",\"+e[3]),t+\"(\"+r+\")\"}}function Jl(e,t){var r=$r(e);return r?(.299*r[0]+.587*r[1]+.114*r[2])*r[3]/255+(1-r[3])*t:0}function fI(e){return e.type===\"linear\"}function cI(e){return e.type===\"radial\"}(function(){return wt.hasGlobalWindow&&mt(window.btoa)?function(e){return window.btoa(unescape(e))}:typeof Buffer!=\"undefined\"?function(e){return Buffer.from(e).toString(\"base64\")}:function(e){return null}})();var Th=Array.prototype.slice;function Nr(e,t,r){return(t-e)*r+e}function Of(e,t,r,n){for(var i=t.length,a=0;a<i;a++)e[a]=Nr(t[a],r[a],n);return e}function hI(e,t,r,n){for(var i=t.length,a=i&&t[0].length,o=0;o<i;o++){e[o]||(e[o]=[]);for(var s=0;s<a;s++)e[o][s]=Nr(t[o][s],r[o][s],n)}return e}function Ns(e,t,r,n){for(var i=t.length,a=0;a<i;a++)e[a]=t[a]+r[a]*n;return e}function Vg(e,t,r,n){for(var i=t.length,a=i&&t[0].length,o=0;o<i;o++){e[o]||(e[o]=[]);for(var s=0;s<a;s++)e[o][s]=t[o][s]+r[o][s]*n}return e}function vI(e,t){for(var r=e.length,n=t.length,i=r>n?t:e,a=Math.min(r,n),o=i[a-1]||{color:[0,0,0,0],offset:0},s=a;s<Math.max(r,n);s++)i.push({offset:o.offset,color:o.color.slice()})}function dI(e,t,r){var n=e,i=t;if(!(!n.push||!i.push)){var a=n.length,o=i.length;if(a!==o){var s=a>o;if(s)n.length=o;else for(var l=a;l<o;l++)n.push(r===1?i[l]:Th.call(i[l]))}for(var u=n[0]&&n[0].length,l=0;l<n.length;l++)if(r===1)isNaN(n[l])&&(n[l]=i[l]);else for(var f=0;f<u;f++)isNaN(n[l][f])&&(n[l][f]=i[l][f])}}function Cl(e){if(Me(e)){var t=e.length;if(Me(e[0])){for(var r=[],n=0;n<t;n++)r.push(Th.call(e[n]));return r}return Th.call(e)}return e}function Ml(e){return e[0]=Math.floor(e[0])||0,e[1]=Math.floor(e[1])||0,e[2]=Math.floor(e[2])||0,e[3]=e[3]==null?1:e[3],\"rgba(\"+e.join(\",\")+\")\"}function pI(e){return Me(e&&e[0])?2:1}var Bs=0,Al=1,rw=2,vo=3,Ch=4,Mh=5,Gg=6;function Ug(e){return e===Ch||e===Mh}function Fs(e){return e===Al||e===rw}var Ya=[0,0,0,0],gI=function(){function e(t){this.keyframes=[],this.discrete=!1,this._invalid=!1,this._needsSort=!1,this._lastFr=0,this._lastFrP=0,this.propName=t}return e.prototype.isFinished=function(){return this._finished},e.prototype.setFinished=function(){this._finished=!0,this._additiveTrack&&this._additiveTrack.setFinished()},e.prototype.needsAnimate=function(){return this.keyframes.length>=1},e.prototype.getAdditiveTrack=function(){return this._additiveTrack},e.prototype.addKeyframe=function(t,r,n){this._needsSort=!0;var i=this.keyframes,a=i.length,o=!1,s=Gg,l=r;if(Me(r)){var u=pI(r);s=u,(u===1&&!zt(r[0])||u===2&&!zt(r[0][0]))&&(o=!0)}else if(zt(r)&&!ql(r))s=Bs;else if(it(r))if(!isNaN(+r))s=Bs;else{var f=$r(r);f&&(l=f,s=vo)}else if(Bu(r)){var c=Y({},l);c.colorStops=ct(r.colorStops,function(h){return{offset:h.offset,color:$r(h.color)}}),fI(r)?s=Ch:cI(r)&&(s=Mh),l=c}a===0?this.valType=s:(s!==this.valType||s===Gg)&&(o=!0),this.discrete=this.discrete||o;var v={time:t,value:l,rawValue:r,percent:0};return n&&(v.easing=n,v.easingFunc=mt(n)?n:X1[n]||J1(n)),i.push(v),v},e.prototype.prepare=function(t,r){var n=this.keyframes;this._needsSort&&n.sort(function(p,g){return p.time-g.time});for(var i=this.valType,a=n.length,o=n[a-1],s=this.discrete,l=Fs(i),u=Ug(i),f=0;f<a;f++){var c=n[f],v=c.value,h=o.value;c.percent=c.time/t,s||(l&&f!==a-1?dI(v,h,i):u&&vI(v.colorStops,h.colorStops))}if(!s&&i!==Mh&&r&&this.needsAnimate()&&r.needsAnimate()&&i===r.valType&&!r._finished){this._additiveTrack=r;for(var d=n[0].value,f=0;f<a;f++)i===Bs?n[f].additiveValue=n[f].value-d:i===vo?n[f].additiveValue=Ns([],n[f].value,d,-1):Fs(i)&&(n[f].additiveValue=i===Al?Ns([],n[f].value,d,-1):Vg([],n[f].value,d,-1))}},e.prototype.step=function(t,r){if(!this._finished){this._additiveTrack&&this._additiveTrack._finished&&(this._additiveTrack=null);var n=this._additiveTrack!=null,i=n?\"additiveValue\":\"value\",a=this.valType,o=this.keyframes,s=o.length,l=this.propName,u=a===vo,f,c=this._lastFr,v=Math.min,h,d;if(s===1)h=d=o[0];else{if(r<0)f=0;else if(r<this._lastFrP){var p=v(c+1,s-1);for(f=p;f>=0&&!(o[f].percent<=r);f--);f=v(f,s-2)}else{for(f=c;f<s&&!(o[f].percent>r);f++);f=v(f-1,s-2)}d=o[f+1],h=o[f]}if(!!(h&&d)){this._lastFr=f,this._lastFrP=r;var g=d.percent-h.percent,m=g===0?1:v((r-h.percent)/g,1);d.easingFunc&&(m=d.easingFunc(m));var y=n?this._additiveValue:u?Ya:t[l];if((Fs(a)||u)&&!y&&(y=this._additiveValue=[]),this.discrete)t[l]=m<1?h.rawValue:d.rawValue;else if(Fs(a))a===Al?Of(y,h[i],d[i],m):hI(y,h[i],d[i],m);else if(Ug(a)){var _=h[i],w=d[i],S=a===Ch;t[l]={type:S?\"linear\":\"radial\",x:Nr(_.x,w.x,m),y:Nr(_.y,w.y,m),colorStops:ct(_.colorStops,function(x,T){var C=w.colorStops[T];return{offset:Nr(x.offset,C.offset,m),color:Ml(Of([],x.color,C.color,m))}}),global:w.global},S?(t[l].x2=Nr(_.x2,w.x2,m),t[l].y2=Nr(_.y2,w.y2,m)):t[l].r=Nr(_.r,w.r,m)}else if(u)Of(y,h[i],d[i],m),n||(t[l]=Ml(y));else{var b=Nr(h[i],d[i],m);n?this._additiveValue=b:t[l]=b}n&&this._addToTarget(t)}}},e.prototype._addToTarget=function(t){var r=this.valType,n=this.propName,i=this._additiveValue;r===Bs?t[n]=t[n]+i:r===vo?($r(t[n],Ya),Ns(Ya,Ya,i,1),t[n]=Ml(Ya)):r===Al?Ns(t[n],t[n],i,1):r===rw&&Vg(t[n],t[n],i,1)},e}(),mI=function(){function e(t,r,n,i){if(this._tracks={},this._trackKeys=[],this._maxTime=0,this._started=0,this._clip=null,this._target=t,this._loop=r,r&&i){ld(\"Can' use additive animation on looped animation.\");return}this._additiveAnimators=i,this._allowDiscrete=n}return e.prototype.getMaxTime=function(){return this._maxTime},e.prototype.getDelay=function(){return this._delay},e.prototype.getLoop=function(){return this._loop},e.prototype.getTarget=function(){return this._target},e.prototype.changeTarget=function(t){this._target=t},e.prototype.when=function(t,r,n){return this.whenWithKeys(t,r,Gt(r),n)},e.prototype.whenWithKeys=function(t,r,n,i){for(var a=this._tracks,o=0;o<n.length;o++){var s=n[o],l=a[s];if(!l){l=a[s]=new gI(s);var u=void 0,f=this._getAdditiveTrack(s);if(f){var c=f.keyframes,v=c[c.length-1];u=v&&v.value,f.valType===vo&&u&&(u=Ml(u))}else u=this._target[s];if(u==null)continue;t>0&&l.addKeyframe(0,Cl(u),i),this._trackKeys.push(s)}l.addKeyframe(t,Cl(r[s]),i)}return this._maxTime=Math.max(this._maxTime,t),this},e.prototype.pause=function(){this._clip.pause(),this._paused=!0},e.prototype.resume=function(){this._clip.resume(),this._paused=!1},e.prototype.isPaused=function(){return!!this._paused},e.prototype.duration=function(t){return this._maxTime=t,this._force=!0,this},e.prototype._doneCallback=function(){this._setTracksFinished(),this._clip=null;var t=this._doneCbs;if(t)for(var r=t.length,n=0;n<r;n++)t[n].call(this)},e.prototype._abortedCallback=function(){this._setTracksFinished();var t=this.animation,r=this._abortedCbs;if(t&&t.removeClip(this._clip),this._clip=null,r)for(var n=0;n<r.length;n++)r[n].call(this)},e.prototype._setTracksFinished=function(){for(var t=this._tracks,r=this._trackKeys,n=0;n<r.length;n++)t[r[n]].setFinished()},e.prototype._getAdditiveTrack=function(t){var r,n=this._additiveAnimators;if(n)for(var i=0;i<n.length;i++){var a=n[i].getTrack(t);a&&(r=a)}return r},e.prototype.start=function(t){if(!(this._started>0)){this._started=1;for(var r=this,n=[],i=this._maxTime||0,a=0;a<this._trackKeys.length;a++){var o=this._trackKeys[a],s=this._tracks[o],l=this._getAdditiveTrack(o),u=s.keyframes,f=u.length;if(s.prepare(i,l),s.needsAnimate())if(!this._allowDiscrete&&s.discrete){var c=u[f-1];c&&(r._target[s.propName]=c.rawValue),s.setFinished()}else n.push(s)}if(n.length||this._force){var v=new oI({life:i,loop:this._loop,delay:this._delay||0,onframe:function(h){r._started=2;var d=r._additiveAnimators;if(d){for(var p=!1,g=0;g<d.length;g++)if(d[g]._clip){p=!0;break}p||(r._additiveAnimators=null)}for(var g=0;g<n.length;g++)n[g].step(r._target,h);var m=r._onframeCbs;if(m)for(var g=0;g<m.length;g++)m[g](r._target,h)},ondestroy:function(){r._doneCallback()}});this._clip=v,this.animation&&this.animation.addClip(v),t&&v.setEasing(t)}else this._doneCallback();return this}},e.prototype.stop=function(t){if(!!this._clip){var r=this._clip;t&&r.onframe(1),this._abortedCallback()}},e.prototype.delay=function(t){return this._delay=t,this},e.prototype.during=function(t){return t&&(this._onframeCbs||(this._onframeCbs=[]),this._onframeCbs.push(t)),this},e.prototype.done=function(t){return t&&(this._doneCbs||(this._doneCbs=[]),this._doneCbs.push(t)),this},e.prototype.aborted=function(t){return t&&(this._abortedCbs||(this._abortedCbs=[]),this._abortedCbs.push(t)),this},e.prototype.getClip=function(){return this._clip},e.prototype.getTrack=function(t){return this._tracks[t]},e.prototype.getTracks=function(){var t=this;return ct(this._trackKeys,function(r){return t._tracks[r]})},e.prototype.stopTracks=function(t,r){if(!t.length||!this._clip)return!0;for(var n=this._tracks,i=this._trackKeys,a=0;a<t.length;a++){var o=n[t[a]];o&&!o.isFinished()&&(r?o.step(this._target,1):this._started===1&&o.step(this._target,0),o.setFinished())}for(var s=!0,a=0;a<i.length;a++)if(!n[i[a]].isFinished()){s=!1;break}return s&&this._abortedCallback(),s},e.prototype.saveTo=function(t,r,n){if(!!t){r=r||this._trackKeys;for(var i=0;i<r.length;i++){var a=r[i],o=this._tracks[a];if(!(!o||o.isFinished())){var s=o.keyframes,l=s[n?0:s.length-1];l&&(t[a]=Cl(l.rawValue))}}}},e.prototype.__changeFinalValue=function(t,r){r=r||Gt(t);for(var n=0;n<r.length;n++){var i=r[n],a=this._tracks[i];if(!!a){var o=a.keyframes;if(o.length>1){var s=o.pop();a.addKeyframe(s.time,t[i]),a.prepare(this._maxTime,a.getAdditiveTrack())}}}},e}(),cd=mI;function oa(){return new Date().getTime()}var yI=function(e){J(t,e);function t(r){var n=e.call(this)||this;return n._running=!1,n._time=0,n._pausedTime=0,n._pauseStart=0,n._paused=!1,r=r||{},n.stage=r.stage||{},n}return t.prototype.addClip=function(r){r.animation&&this.removeClip(r),this._head?(this._tail.next=r,r.prev=this._tail,r.next=null,this._tail=r):this._head=this._tail=r,r.animation=this},t.prototype.addAnimator=function(r){r.animation=this;var n=r.getClip();n&&this.addClip(n)},t.prototype.removeClip=function(r){if(!!r.animation){var n=r.prev,i=r.next;n?n.next=i:this._head=i,i?i.prev=n:this._tail=n,r.next=r.prev=r.animation=null}},t.prototype.removeAnimator=function(r){var n=r.getClip();n&&this.removeClip(n),r.animation=null},t.prototype.update=function(r){for(var n=oa()-this._pausedTime,i=n-this._time,a=this._head;a;){var o=a.next,s=a.step(n,i);s&&(a.ondestroy(),this.removeClip(a)),a=o}this._time=n,r||(this.trigger(\"frame\",i),this.stage.update&&this.stage.update())},t.prototype._startLoop=function(){var r=this;this._running=!0;function n(){r._running&&(bh(n),!r._paused&&r.update())}bh(n)},t.prototype.start=function(){this._running||(this._time=oa(),this._pausedTime=0,this._startLoop())},t.prototype.stop=function(){this._running=!1},t.prototype.pause=function(){this._paused||(this._pauseStart=oa(),this._paused=!0)},t.prototype.resume=function(){this._paused&&(this._pausedTime+=oa()-this._pauseStart,this._paused=!1)},t.prototype.clear=function(){for(var r=this._head;r;){var n=r.next;r.prev=r.next=r.animation=null,r=n}this._head=this._tail=null},t.prototype.isFinished=function(){return this._head==null},t.prototype.animate=function(r,n){n=n||{},this.start();var i=new cd(r,n.loop);return this.addAnimator(i),i},t}(Ir),_I=yI,wI=300,kf=wt.domSupported,Nf=function(){var e=[\"click\",\"dblclick\",\"mousewheel\",\"wheel\",\"mouseout\",\"mouseup\",\"mousedown\",\"mousemove\",\"contextmenu\"],t=[\"touchstart\",\"touchend\",\"touchmove\"],r={pointerdown:1,pointerup:1,pointermove:1,pointerout:1},n=ct(e,function(i){var a=i.replace(\"mouse\",\"pointer\");return r.hasOwnProperty(a)?a:i});return{mouse:e,touch:t,pointer:n}}(),Wg={mouse:[\"mousemove\",\"mouseup\"],pointer:[\"pointermove\",\"pointerup\"]},Yg=!1;function Ah(e){var t=e.pointerType;return t===\"pen\"||t===\"touch\"}function bI(e){e.touching=!0,e.touchTimer!=null&&(clearTimeout(e.touchTimer),e.touchTimer=null),e.touchTimer=setTimeout(function(){e.touching=!1,e.touchTimer=null},700)}function Bf(e){e&&(e.zrByTouch=!0)}function SI(e,t){return Ue(e.dom,new xI(e,t),!0)}function nw(e,t){for(var r=t,n=!1;r&&r.nodeType!==9&&!(n=r.domBelongToZr||r!==t&&r===e.painterRoot);)r=r.parentNode;return n}var xI=function(){function e(t,r){this.stopPropagation=Ce,this.stopImmediatePropagation=Ce,this.preventDefault=Ce,this.type=r.type,this.target=this.currentTarget=t.dom,this.pointerType=r.pointerType,this.clientX=r.clientX,this.clientY=r.clientY}return e}(),or={mousedown:function(e){e=Ue(this.dom,e),this.__mayPointerCapture=[e.zrX,e.zrY],this.trigger(\"mousedown\",e)},mousemove:function(e){e=Ue(this.dom,e);var t=this.__mayPointerCapture;t&&(e.zrX!==t[0]||e.zrY!==t[1])&&this.__togglePointerCapture(!0),this.trigger(\"mousemove\",e)},mouseup:function(e){e=Ue(this.dom,e),this.__togglePointerCapture(!1),this.trigger(\"mouseup\",e)},mouseout:function(e){e=Ue(this.dom,e);var t=e.toElement||e.relatedTarget;nw(this,t)||(this.__pointerCapturing&&(e.zrEventControl=\"no_globalout\"),this.trigger(\"mouseout\",e))},wheel:function(e){Yg=!0,e=Ue(this.dom,e),this.trigger(\"mousewheel\",e)},mousewheel:function(e){Yg||(e=Ue(this.dom,e),this.trigger(\"mousewheel\",e))},touchstart:function(e){e=Ue(this.dom,e),Bf(e),this.__lastTouchMoment=new Date,this.handler.processGesture(e,\"start\"),or.mousemove.call(this,e),or.mousedown.call(this,e)},touchmove:function(e){e=Ue(this.dom,e),Bf(e),this.handler.processGesture(e,\"change\"),or.mousemove.call(this,e)},touchend:function(e){e=Ue(this.dom,e),Bf(e),this.handler.processGesture(e,\"end\"),or.mouseup.call(this,e),+new Date-+this.__lastTouchMoment<wI&&or.click.call(this,e)},pointerdown:function(e){or.mousedown.call(this,e)},pointermove:function(e){Ah(e)||or.mousemove.call(this,e)},pointerup:function(e){or.mouseup.call(this,e)},pointerout:function(e){Ah(e)||or.mouseout.call(this,e)}};I([\"click\",\"dblclick\",\"contextmenu\"],function(e){or[e]=function(t){t=Ue(this.dom,t),this.trigger(e,t)}});var Dh={pointermove:function(e){Ah(e)||Dh.mousemove.call(this,e)},pointerup:function(e){Dh.mouseup.call(this,e)},mousemove:function(e){this.trigger(\"mousemove\",e)},mouseup:function(e){var t=this.__pointerCapturing;this.__togglePointerCapture(!1),this.trigger(\"mouseup\",e),t&&(e.zrEventControl=\"only_globalout\",this.trigger(\"mouseout\",e))}};function TI(e,t){var r=t.domHandlers;wt.pointerEventsSupported?I(Nf.pointer,function(n){Dl(t,n,function(i){r[n].call(e,i)})}):(wt.touchEventsSupported&&I(Nf.touch,function(n){Dl(t,n,function(i){r[n].call(e,i),bI(t)})}),I(Nf.mouse,function(n){Dl(t,n,function(i){i=fd(i),t.touching||r[n].call(e,i)})}))}function CI(e,t){wt.pointerEventsSupported?I(Wg.pointer,r):wt.touchEventsSupported||I(Wg.mouse,r);function r(n){function i(a){a=fd(a),nw(e,a.target)||(a=SI(e,a),t.domHandlers[n].call(e,a))}Dl(t,n,i,{capture:!0})}}function Dl(e,t,r,n){e.mounted[t]=r,e.listenerOpts[t]=n,FP(e.domTarget,t,r,n)}function Ff(e){var t=e.mounted;for(var r in t)t.hasOwnProperty(r)&&zP(e.domTarget,r,t[r],e.listenerOpts[r]);e.mounted={}}var qg=function(){function e(t,r){this.mounted={},this.listenerOpts={},this.touching=!1,this.domTarget=t,this.domHandlers=r}return e}(),MI=function(e){J(t,e);function t(r,n){var i=e.call(this)||this;return i.__pointerCapturing=!1,i.dom=r,i.painterRoot=n,i._localHandlerScope=new qg(r,or),kf&&(i._globalHandlerScope=new qg(document,Dh)),TI(i,i._localHandlerScope),i}return t.prototype.dispose=function(){Ff(this._localHandlerScope),kf&&Ff(this._globalHandlerScope)},t.prototype.setCursor=function(r){this.dom.style&&(this.dom.style.cursor=r||\"default\")},t.prototype.__togglePointerCapture=function(r){if(this.__mayPointerCapture=null,kf&&+this.__pointerCapturing^+r){this.__pointerCapturing=r;var n=this._globalHandlerScope;r?CI(this,n):Ff(n)}},t}(Ir),AI=MI,iw=1;wt.hasGlobalWindow&&(iw=Math.max(window.devicePixelRatio||window.screen&&window.screen.deviceXDPI/window.screen.logicalXDPI||1,1));var tu=iw,Ph=.4,Ih=\"#333\",Eh=\"#ccc\",DI=\"#eee\";function Qo(){return[1,0,0,1,0,0]}function hd(e){return e[0]=1,e[1]=0,e[2]=0,e[3]=1,e[4]=0,e[5]=0,e}function PI(e,t){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4],e[5]=t[5],e}function pa(e,t,r){var n=t[0]*r[0]+t[2]*r[1],i=t[1]*r[0]+t[3]*r[1],a=t[0]*r[2]+t[2]*r[3],o=t[1]*r[2]+t[3]*r[3],s=t[0]*r[4]+t[2]*r[5]+t[4],l=t[1]*r[4]+t[3]*r[5]+t[5];return e[0]=n,e[1]=i,e[2]=a,e[3]=o,e[4]=s,e[5]=l,e}function Lh(e,t,r){return e[0]=t[0],e[1]=t[1],e[2]=t[2],e[3]=t[3],e[4]=t[4]+r[0],e[5]=t[5]+r[1],e}function vd(e,t,r){var n=t[0],i=t[2],a=t[4],o=t[1],s=t[3],l=t[5],u=Math.sin(r),f=Math.cos(r);return e[0]=n*f+o*u,e[1]=-n*u+o*f,e[2]=i*f+s*u,e[3]=-i*u+f*s,e[4]=f*a+u*l,e[5]=f*l-u*a,e}function II(e,t,r){var n=r[0],i=r[1];return e[0]=t[0]*n,e[1]=t[1]*i,e[2]=t[2]*n,e[3]=t[3]*i,e[4]=t[4]*n,e[5]=t[5]*i,e}function dd(e,t){var r=t[0],n=t[2],i=t[4],a=t[1],o=t[3],s=t[5],l=r*o-a*n;return l?(l=1/l,e[0]=o*l,e[1]=-a*l,e[2]=-n*l,e[3]=r*l,e[4]=(n*s-o*i)*l,e[5]=(a*i-r*s)*l,e):null}var Xg=hd,jg=5e-5;function zn(e){return e>jg||e<-jg}var Hn=[],$i=[],zf=Qo(),Hf=Math.abs,pd=function(){function e(){}return e.prototype.getLocalTransform=function(t){return e.getLocalTransform(this,t)},e.prototype.setPosition=function(t){this.x=t[0],this.y=t[1]},e.prototype.setScale=function(t){this.scaleX=t[0],this.scaleY=t[1]},e.prototype.setSkew=function(t){this.skewX=t[0],this.skewY=t[1]},e.prototype.setOrigin=function(t){this.originX=t[0],this.originY=t[1]},e.prototype.needLocalTransform=function(){return zn(this.rotation)||zn(this.x)||zn(this.y)||zn(this.scaleX-1)||zn(this.scaleY-1)||zn(this.skewX)||zn(this.skewY)},e.prototype.updateTransform=function(){var t=this.parent&&this.parent.transform,r=this.needLocalTransform(),n=this.transform;if(!(r||t)){n&&Xg(n);return}n=n||Qo(),r?this.getLocalTransform(n):Xg(n),t&&(r?pa(n,t,n):PI(n,t)),this.transform=n,this._resolveGlobalScaleRatio(n)},e.prototype._resolveGlobalScaleRatio=function(t){var r=this.globalScaleRatio;if(r!=null&&r!==1){this.getGlobalScale(Hn);var n=Hn[0]<0?-1:1,i=Hn[1]<0?-1:1,a=((Hn[0]-n)*r+n)/Hn[0]||0,o=((Hn[1]-i)*r+i)/Hn[1]||0;t[0]*=a,t[1]*=a,t[2]*=o,t[3]*=o}this.invTransform=this.invTransform||Qo(),dd(this.invTransform,t)},e.prototype.getComputedTransform=function(){for(var t=this,r=[];t;)r.push(t),t=t.parent;for(;t=r.pop();)t.updateTransform();return this.transform},e.prototype.setLocalTransform=function(t){if(!!t){var r=t[0]*t[0]+t[1]*t[1],n=t[2]*t[2]+t[3]*t[3],i=Math.atan2(t[1],t[0]),a=Math.PI/2+i-Math.atan2(t[3],t[2]);n=Math.sqrt(n)*Math.cos(a),r=Math.sqrt(r),this.skewX=a,this.skewY=0,this.rotation=-i,this.x=+t[4],this.y=+t[5],this.scaleX=r,this.scaleY=n,this.originX=0,this.originY=0}},e.prototype.decomposeTransform=function(){if(!!this.transform){var t=this.parent,r=this.transform;t&&t.transform&&(pa($i,t.invTransform,r),r=$i);var n=this.originX,i=this.originY;(n||i)&&(zf[4]=n,zf[5]=i,pa($i,r,zf),$i[4]-=n,$i[5]-=i,r=$i),this.setLocalTransform(r)}},e.prototype.getGlobalScale=function(t){var r=this.transform;return t=t||[],r?(t[0]=Math.sqrt(r[0]*r[0]+r[1]*r[1]),t[1]=Math.sqrt(r[2]*r[2]+r[3]*r[3]),r[0]<0&&(t[0]=-t[0]),r[3]<0&&(t[1]=-t[1]),t):(t[0]=1,t[1]=1,t)},e.prototype.transformCoordToLocal=function(t,r){var n=[t,r],i=this.invTransform;return i&&tr(n,n,i),n},e.prototype.transformCoordToGlobal=function(t,r){var n=[t,r],i=this.transform;return i&&tr(n,n,i),n},e.prototype.getLineScale=function(){var t=this.transform;return t&&Hf(t[0]-1)>1e-10&&Hf(t[3]-1)>1e-10?Math.sqrt(Hf(t[0]*t[3]-t[2]*t[1])):1},e.prototype.copyTransform=function(t){EI(this,t)},e.getLocalTransform=function(t,r){r=r||[];var n=t.originX||0,i=t.originY||0,a=t.scaleX,o=t.scaleY,s=t.anchorX,l=t.anchorY,u=t.rotation||0,f=t.x,c=t.y,v=t.skewX?Math.tan(t.skewX):0,h=t.skewY?Math.tan(-t.skewY):0;if(n||i||s||l){var d=n+s,p=i+l;r[4]=-d*a-v*p*o,r[5]=-p*o-h*d*a}else r[4]=r[5]=0;return r[0]=a,r[3]=o,r[1]=h*a,r[2]=v*o,u&&vd(r,r,u),r[4]+=n+f,r[5]+=i+c,r},e.initDefaultProps=function(){var t=e.prototype;t.scaleX=t.scaleY=t.globalScaleRatio=1,t.x=t.y=t.originX=t.originY=t.skewX=t.skewY=t.rotation=t.anchorX=t.anchorY=0}(),e}(),Jo=[\"x\",\"y\",\"originX\",\"originY\",\"anchorX\",\"anchorY\",\"rotation\",\"scaleX\",\"scaleY\",\"skewX\",\"skewY\"];function EI(e,t){for(var r=0;r<Jo.length;r++){var n=Jo[r];e[n]=t[n]}}var LI=function(){function e(t,r){this.x=t||0,this.y=r||0}return e.prototype.copy=function(t){return this.x=t.x,this.y=t.y,this},e.prototype.clone=function(){return new e(this.x,this.y)},e.prototype.set=function(t,r){return this.x=t,this.y=r,this},e.prototype.equal=function(t){return t.x===this.x&&t.y===this.y},e.prototype.add=function(t){return this.x+=t.x,this.y+=t.y,this},e.prototype.scale=function(t){this.x*=t,this.y*=t},e.prototype.scaleAndAdd=function(t,r){this.x+=t.x*r,this.y+=t.y*r},e.prototype.sub=function(t){return this.x-=t.x,this.y-=t.y,this},e.prototype.dot=function(t){return this.x*t.x+this.y*t.y},e.prototype.len=function(){return Math.sqrt(this.x*this.x+this.y*this.y)},e.prototype.lenSquare=function(){return this.x*this.x+this.y*this.y},e.prototype.normalize=function(){var t=this.len();return this.x/=t,this.y/=t,this},e.prototype.distance=function(t){var r=this.x-t.x,n=this.y-t.y;return Math.sqrt(r*r+n*n)},e.prototype.distanceSquare=function(t){var r=this.x-t.x,n=this.y-t.y;return r*r+n*n},e.prototype.negate=function(){return this.x=-this.x,this.y=-this.y,this},e.prototype.transform=function(t){if(!!t){var r=this.x,n=this.y;return this.x=t[0]*r+t[2]*n+t[4],this.y=t[1]*r+t[3]*n+t[5],this}},e.prototype.toArray=function(t){return t[0]=this.x,t[1]=this.y,t},e.prototype.fromArray=function(t){this.x=t[0],this.y=t[1]},e.set=function(t,r,n){t.x=r,t.y=n},e.copy=function(t,r){t.x=r.x,t.y=r.y},e.len=function(t){return Math.sqrt(t.x*t.x+t.y*t.y)},e.lenSquare=function(t){return t.x*t.x+t.y*t.y},e.dot=function(t,r){return t.x*r.x+t.y*r.y},e.add=function(t,r,n){t.x=r.x+n.x,t.y=r.y+n.y},e.sub=function(t,r,n){t.x=r.x-n.x,t.y=r.y-n.y},e.scale=function(t,r,n){t.x=r.x*n,t.y=r.y*n},e.scaleAndAdd=function(t,r,n,i){t.x=r.x+n.x*i,t.y=r.y+n.y*i},e.lerp=function(t,r,n,i){var a=1-i;t.x=a*r.x+i*n.x,t.y=a*r.y+i*n.y},e}(),pt=LI,zs=Math.min,Hs=Math.max,$n=new pt,Vn=new pt,Gn=new pt,Un=new pt,qa=new pt,Xa=new pt,RI=function(){function e(t,r,n,i){n<0&&(t=t+n,n=-n),i<0&&(r=r+i,i=-i),this.x=t,this.y=r,this.width=n,this.height=i}return e.prototype.union=function(t){var r=zs(t.x,this.x),n=zs(t.y,this.y);isFinite(this.x)&&isFinite(this.width)?this.width=Hs(t.x+t.width,this.x+this.width)-r:this.width=t.width,isFinite(this.y)&&isFinite(this.height)?this.height=Hs(t.y+t.height,this.y+this.height)-n:this.height=t.height,this.x=r,this.y=n},e.prototype.applyTransform=function(t){e.applyTransform(this,this,t)},e.prototype.calculateTransform=function(t){var r=this,n=t.width/r.width,i=t.height/r.height,a=Qo();return Lh(a,a,[-r.x,-r.y]),II(a,a,[n,i]),Lh(a,a,[t.x,t.y]),a},e.prototype.intersect=function(t,r){if(!t)return!1;t instanceof e||(t=e.create(t));var n=this,i=n.x,a=n.x+n.width,o=n.y,s=n.y+n.height,l=t.x,u=t.x+t.width,f=t.y,c=t.y+t.height,v=!(a<l||u<i||s<f||c<o);if(r){var h=1/0,d=0,p=Math.abs(a-l),g=Math.abs(u-i),m=Math.abs(s-f),y=Math.abs(c-o),_=Math.min(p,g),w=Math.min(m,y);a<l||u<i?_>d&&(d=_,p<g?pt.set(Xa,-p,0):pt.set(Xa,g,0)):_<h&&(h=_,p<g?pt.set(qa,p,0):pt.set(qa,-g,0)),s<f||c<o?w>d&&(d=w,m<y?pt.set(Xa,0,-m):pt.set(Xa,0,y)):_<h&&(h=_,m<y?pt.set(qa,0,m):pt.set(qa,0,-y))}return r&&pt.copy(r,v?qa:Xa),v},e.prototype.contain=function(t,r){var n=this;return t>=n.x&&t<=n.x+n.width&&r>=n.y&&r<=n.y+n.height},e.prototype.clone=function(){return new e(this.x,this.y,this.width,this.height)},e.prototype.copy=function(t){e.copy(this,t)},e.prototype.plain=function(){return{x:this.x,y:this.y,width:this.width,height:this.height}},e.prototype.isFinite=function(){return isFinite(this.x)&&isFinite(this.y)&&isFinite(this.width)&&isFinite(this.height)},e.prototype.isZero=function(){return this.width===0||this.height===0},e.create=function(t){return new e(t.x,t.y,t.width,t.height)},e.copy=function(t,r){t.x=r.x,t.y=r.y,t.width=r.width,t.height=r.height},e.applyTransform=function(t,r,n){if(!n){t!==r&&e.copy(t,r);return}if(n[1]<1e-5&&n[1]>-1e-5&&n[2]<1e-5&&n[2]>-1e-5){var i=n[0],a=n[3],o=n[4],s=n[5];t.x=r.x*i+o,t.y=r.y*a+s,t.width=r.width*i,t.height=r.height*a,t.width<0&&(t.x+=t.width,t.width=-t.width),t.height<0&&(t.y+=t.height,t.height=-t.height);return}$n.x=Gn.x=r.x,$n.y=Un.y=r.y,Vn.x=Un.x=r.x+r.width,Vn.y=Gn.y=r.y+r.height,$n.transform(n),Un.transform(n),Vn.transform(n),Gn.transform(n),t.x=zs($n.x,Vn.x,Gn.x,Un.x),t.y=zs($n.y,Vn.y,Gn.y,Un.y);var l=Hs($n.x,Vn.x,Gn.x,Un.x),u=Hs($n.y,Vn.y,Gn.y,Un.y);t.width=l-t.x,t.height=u-t.y},e}(),Ot=RI,Kg={};function Oe(e,t){t=t||bi;var r=Kg[t];r||(r=Kg[t]=new gs(500));var n=r.get(e);return n==null&&(n=Pi.measureText(e,t).width,r.put(e,n)),n}function Zg(e,t,r,n){var i=Oe(e,t),a=md(t),o=po(0,i,r),s=na(0,a,n),l=new Ot(o,s,i,a);return l}function gd(e,t,r,n){var i=((e||\"\")+\"\").split(`\n`),a=i.length;if(a===1)return Zg(i[0],t,r,n);for(var o=new Ot(0,0,0,0),s=0;s<i.length;s++){var l=Zg(i[s],t,r,n);s===0?o.copy(l):o.union(l)}return o}function po(e,t,r){return r===\"right\"?e-=t:r===\"center\"&&(e-=t/2),e}function na(e,t,r){return r===\"middle\"?e-=t/2:r===\"bottom\"&&(e-=t),e}function md(e){return Oe(\"\\u56FD\",e)}function Rn(e,t){return typeof e==\"string\"?e.lastIndexOf(\"%\")>=0?parseFloat(e)/100*t:parseFloat(e):e}function aw(e,t,r){var n=t.position||\"inside\",i=t.distance!=null?t.distance:5,a=r.height,o=r.width,s=a/2,l=r.x,u=r.y,f=\"left\",c=\"top\";if(n instanceof Array)l+=Rn(n[0],r.width),u+=Rn(n[1],r.height),f=null,c=null;else switch(n){case\"left\":l-=i,u+=s,f=\"right\",c=\"middle\";break;case\"right\":l+=i+o,u+=s,c=\"middle\";break;case\"top\":l+=o/2,u-=i,f=\"center\",c=\"bottom\";break;case\"bottom\":l+=o/2,u+=a+i,f=\"center\";break;case\"inside\":l+=o/2,u+=s,f=\"center\",c=\"middle\";break;case\"insideLeft\":l+=i,u+=s,c=\"middle\";break;case\"insideRight\":l+=o-i,u+=s,f=\"right\",c=\"middle\";break;case\"insideTop\":l+=o/2,u+=i,f=\"center\";break;case\"insideBottom\":l+=o/2,u+=a-i,f=\"center\",c=\"bottom\";break;case\"insideTopLeft\":l+=i,u+=i;break;case\"insideTopRight\":l+=o-i,u+=i,f=\"right\";break;case\"insideBottomLeft\":l+=i,u+=a-i,c=\"bottom\";break;case\"insideBottomRight\":l+=o-i,u+=a-i,f=\"right\",c=\"bottom\";break}return e=e||{},e.x=l,e.y=u,e.align=f,e.verticalAlign=c,e}var $f=\"__zr_normal__\",Vf=Jo.concat([\"ignore\"]),OI=Ln(Jo,function(e,t){return e[t]=!0,e},{ignore:!1}),Vi={},kI=new Ot(0,0,0,0),yd=function(){function e(t){this.id=B1(),this.animators=[],this.currentStates=[],this.states={},this._init(t)}return e.prototype._init=function(t){this.attr(t)},e.prototype.drift=function(t,r,n){switch(this.draggable){case\"horizontal\":r=0;break;case\"vertical\":t=0;break}var i=this.transform;i||(i=this.transform=[1,0,0,1,0,0]),i[4]+=t,i[5]+=r,this.decomposeTransform(),this.markRedraw()},e.prototype.beforeUpdate=function(){},e.prototype.afterUpdate=function(){},e.prototype.update=function(){this.updateTransform(),this.__dirty&&this.updateInnerText()},e.prototype.updateInnerText=function(t){var r=this._textContent;if(r&&(!r.ignore||t)){this.textConfig||(this.textConfig={});var n=this.textConfig,i=n.local,a=r.innerTransformable,o=void 0,s=void 0,l=!1;a.parent=i?this:null;var u=!1;if(a.copyTransform(r),n.position!=null){var f=kI;n.layoutRect?f.copy(n.layoutRect):f.copy(this.getBoundingRect()),i||f.applyTransform(this.transform),this.calculateTextPosition?this.calculateTextPosition(Vi,n,f):aw(Vi,n,f),a.x=Vi.x,a.y=Vi.y,o=Vi.align,s=Vi.verticalAlign;var c=n.origin;if(c&&n.rotation!=null){var v=void 0,h=void 0;c===\"center\"?(v=f.width*.5,h=f.height*.5):(v=Rn(c[0],f.width),h=Rn(c[1],f.height)),u=!0,a.originX=-a.x+v+(i?0:f.x),a.originY=-a.y+h+(i?0:f.y)}}n.rotation!=null&&(a.rotation=n.rotation);var d=n.offset;d&&(a.x+=d[0],a.y+=d[1],u||(a.originX=-d[0],a.originY=-d[1]));var p=n.inside==null?typeof n.position==\"string\"&&n.position.indexOf(\"inside\")>=0:n.inside,g=this._innerTextDefaultStyle||(this._innerTextDefaultStyle={}),m=void 0,y=void 0,_=void 0;p&&this.canBeInsideText()?(m=n.insideFill,y=n.insideStroke,(m==null||m===\"auto\")&&(m=this.getInsideTextFill()),(y==null||y===\"auto\")&&(y=this.getInsideTextStroke(m),_=!0)):(m=n.outsideFill,y=n.outsideStroke,(m==null||m===\"auto\")&&(m=this.getOutsideFill()),(y==null||y===\"auto\")&&(y=this.getOutsideStroke(m),_=!0)),m=m||\"#000\",(m!==g.fill||y!==g.stroke||_!==g.autoStroke||o!==g.align||s!==g.verticalAlign)&&(l=!0,g.fill=m,g.stroke=y,g.autoStroke=_,g.align=o,g.verticalAlign=s,r.setDefaultTextStyle(g)),r.__dirty|=Le,l&&r.dirtyStyle(!0)}},e.prototype.canBeInsideText=function(){return!0},e.prototype.getInsideTextFill=function(){return\"#fff\"},e.prototype.getInsideTextStroke=function(t){return\"#000\"},e.prototype.getOutsideFill=function(){return this.__zr&&this.__zr.isDarkMode()?Eh:Ih},e.prototype.getOutsideStroke=function(t){var r=this.__zr&&this.__zr.getBackgroundColor(),n=typeof r==\"string\"&&$r(r);n||(n=[255,255,255,1]);for(var i=n[3],a=this.__zr.isDarkMode(),o=0;o<3;o++)n[o]=n[o]*i+(a?0:255)*(1-i);return n[3]=1,zu(n,\"rgba\")},e.prototype.traverse=function(t,r){},e.prototype.attrKV=function(t,r){t===\"textConfig\"?this.setTextConfig(r):t===\"textContent\"?this.setTextContent(r):t===\"clipPath\"?this.setClipPath(r):t===\"extra\"?(this.extra=this.extra||{},Y(this.extra,r)):this[t]=r},e.prototype.hide=function(){this.ignore=!0,this.markRedraw()},e.prototype.show=function(){this.ignore=!1,this.markRedraw()},e.prototype.attr=function(t,r){if(typeof t==\"string\")this.attrKV(t,r);else if(st(t))for(var n=t,i=Gt(n),a=0;a<i.length;a++){var o=i[a];this.attrKV(o,t[o])}return this.markRedraw(),this},e.prototype.saveCurrentToNormalState=function(t){this._innerSaveToNormal(t);for(var r=this._normalState,n=0;n<this.animators.length;n++){var i=this.animators[n],a=i.__fromStateTransition;if(!(i.getLoop()||a&&a!==$f)){var o=i.targetName,s=o?r[o]:r;i.saveTo(s)}}},e.prototype._innerSaveToNormal=function(t){var r=this._normalState;r||(r=this._normalState={}),t.textConfig&&!r.textConfig&&(r.textConfig=this.textConfig),this._savePrimaryToNormal(t,r,Vf)},e.prototype._savePrimaryToNormal=function(t,r,n){for(var i=0;i<n.length;i++){var a=n[i];t[a]!=null&&!(a in r)&&(r[a]=this[a])}},e.prototype.hasState=function(){return this.currentStates.length>0},e.prototype.getState=function(t){return this.states[t]},e.prototype.ensureState=function(t){var r=this.states;return r[t]||(r[t]={}),r[t]},e.prototype.clearStates=function(t){this.useState($f,!1,t)},e.prototype.useState=function(t,r,n,i){var a=t===$f,o=this.hasState();if(!(!o&&a)){var s=this.currentStates,l=this.stateTransition;if(!(It(s,t)>=0&&(r||s.length===1))){var u;if(this.stateProxy&&!a&&(u=this.stateProxy(t)),u||(u=this.states&&this.states[t]),!u&&!a){ld(\"State \"+t+\" not exists.\");return}a||this.saveCurrentToNormalState(u);var f=!!(u&&u.hoverLayer||i);f&&this._toggleHoverLayerFlag(!0),this._applyStateObj(t,u,this._normalState,r,!n&&!this.__inHover&&l&&l.duration>0,l);var c=this._textContent,v=this._textGuide;return c&&c.useState(t,r,n,f),v&&v.useState(t,r,n,f),a?(this.currentStates=[],this._normalState={}):r?this.currentStates.push(t):this.currentStates=[t],this._updateAnimationTargets(),this.markRedraw(),!f&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=~Le),u}}},e.prototype.useStates=function(t,r,n){if(!t.length)this.clearStates();else{var i=[],a=this.currentStates,o=t.length,s=o===a.length;if(s){for(var l=0;l<o;l++)if(t[l]!==a[l]){s=!1;break}}if(s)return;for(var l=0;l<o;l++){var u=t[l],f=void 0;this.stateProxy&&(f=this.stateProxy(u,t)),f||(f=this.states[u]),f&&i.push(f)}var c=i[o-1],v=!!(c&&c.hoverLayer||n);v&&this._toggleHoverLayerFlag(!0);var h=this._mergeStates(i),d=this.stateTransition;this.saveCurrentToNormalState(h),this._applyStateObj(t.join(\",\"),h,this._normalState,!1,!r&&!this.__inHover&&d&&d.duration>0,d);var p=this._textContent,g=this._textGuide;p&&p.useStates(t,r,v),g&&g.useStates(t,r,v),this._updateAnimationTargets(),this.currentStates=t.slice(),this.markRedraw(),!v&&this.__inHover&&(this._toggleHoverLayerFlag(!1),this.__dirty&=~Le)}},e.prototype._updateAnimationTargets=function(){for(var t=0;t<this.animators.length;t++){var r=this.animators[t];r.targetName&&r.changeTarget(this[r.targetName])}},e.prototype.removeState=function(t){var r=It(this.currentStates,t);if(r>=0){var n=this.currentStates.slice();n.splice(r,1),this.useStates(n)}},e.prototype.replaceState=function(t,r,n){var i=this.currentStates.slice(),a=It(i,t),o=It(i,r)>=0;a>=0?o?i.splice(a,1):i[a]=r:n&&!o&&i.push(r),this.useStates(i)},e.prototype.toggleState=function(t,r){r?this.useState(t,!0):this.removeState(t)},e.prototype._mergeStates=function(t){for(var r={},n,i=0;i<t.length;i++){var a=t[i];Y(r,a),a.textConfig&&(n=n||{},Y(n,a.textConfig))}return n&&(r.textConfig=n),r},e.prototype._applyStateObj=function(t,r,n,i,a,o){var s=!(r&&i);r&&r.textConfig?(this.textConfig=Y({},i?this.textConfig:n.textConfig),Y(this.textConfig,r.textConfig)):s&&n.textConfig&&(this.textConfig=n.textConfig);for(var l={},u=!1,f=0;f<Vf.length;f++){var c=Vf[f],v=a&&OI[c];r&&r[c]!=null?v?(u=!0,l[c]=r[c]):this[c]=r[c]:s&&n[c]!=null&&(v?(u=!0,l[c]=n[c]):this[c]=n[c])}if(!a)for(var f=0;f<this.animators.length;f++){var h=this.animators[f],d=h.targetName;h.getLoop()||h.__changeFinalValue(d?(r||n)[d]:r||n)}u&&this._transitionState(t,l,o)},e.prototype._attachComponent=function(t){if(!(t.__zr&&!t.__hostTarget)&&t!==this){var r=this.__zr;r&&t.addSelfToZr(r),t.__zr=r,t.__hostTarget=this}},e.prototype._detachComponent=function(t){t.__zr&&t.removeSelfFromZr(t.__zr),t.__zr=null,t.__hostTarget=null},e.prototype.getClipPath=function(){return this._clipPath},e.prototype.setClipPath=function(t){this._clipPath&&this._clipPath!==t&&this.removeClipPath(),this._attachComponent(t),this._clipPath=t,this.markRedraw()},e.prototype.removeClipPath=function(){var t=this._clipPath;t&&(this._detachComponent(t),this._clipPath=null,this.markRedraw())},e.prototype.getTextContent=function(){return this._textContent},e.prototype.setTextContent=function(t){var r=this._textContent;r!==t&&(r&&r!==t&&this.removeTextContent(),t.innerTransformable=new pd,this._attachComponent(t),this._textContent=t,this.markRedraw())},e.prototype.setTextConfig=function(t){this.textConfig||(this.textConfig={}),Y(this.textConfig,t),this.markRedraw()},e.prototype.removeTextConfig=function(){this.textConfig=null,this.markRedraw()},e.prototype.removeTextContent=function(){var t=this._textContent;t&&(t.innerTransformable=null,this._detachComponent(t),this._textContent=null,this._innerTextDefaultStyle=null,this.markRedraw())},e.prototype.getTextGuideLine=function(){return this._textGuide},e.prototype.setTextGuideLine=function(t){this._textGuide&&this._textGuide!==t&&this.removeTextGuideLine(),this._attachComponent(t),this._textGuide=t,this.markRedraw()},e.prototype.removeTextGuideLine=function(){var t=this._textGuide;t&&(this._detachComponent(t),this._textGuide=null,this.markRedraw())},e.prototype.markRedraw=function(){this.__dirty|=Le;var t=this.__zr;t&&(this.__inHover?t.refreshHover():t.refresh()),this.__hostTarget&&this.__hostTarget.markRedraw()},e.prototype.dirty=function(){this.markRedraw()},e.prototype._toggleHoverLayerFlag=function(t){this.__inHover=t;var r=this._textContent,n=this._textGuide;r&&(r.__inHover=t),n&&(n.__inHover=t)},e.prototype.addSelfToZr=function(t){if(this.__zr!==t){this.__zr=t;var r=this.animators;if(r)for(var n=0;n<r.length;n++)t.animation.addAnimator(r[n]);this._clipPath&&this._clipPath.addSelfToZr(t),this._textContent&&this._textContent.addSelfToZr(t),this._textGuide&&this._textGuide.addSelfToZr(t)}},e.prototype.removeSelfFromZr=function(t){if(!!this.__zr){this.__zr=null;var r=this.animators;if(r)for(var n=0;n<r.length;n++)t.animation.removeAnimator(r[n]);this._clipPath&&this._clipPath.removeSelfFromZr(t),this._textContent&&this._textContent.removeSelfFromZr(t),this._textGuide&&this._textGuide.removeSelfFromZr(t)}},e.prototype.animate=function(t,r,n){var i=t?this[t]:this,a=new cd(i,r,n);return t&&(a.targetName=t),this.addAnimator(a,t),a},e.prototype.addAnimator=function(t,r){var n=this.__zr,i=this;t.during(function(){i.updateDuringAnimation(r)}).done(function(){var a=i.animators,o=It(a,t);o>=0&&a.splice(o,1)}),this.animators.push(t),n&&n.animation.addAnimator(t),n&&n.wakeUp()},e.prototype.updateDuringAnimation=function(t){this.markRedraw()},e.prototype.stopAnimation=function(t,r){for(var n=this.animators,i=n.length,a=[],o=0;o<i;o++){var s=n[o];!t||t===s.scope?s.stop(r):a.push(s)}return this.animators=a,this},e.prototype.animateTo=function(t,r,n){Gf(this,t,r,n)},e.prototype.animateFrom=function(t,r,n){Gf(this,t,r,n,!0)},e.prototype._transitionState=function(t,r,n,i){for(var a=Gf(this,r,n,i),o=0;o<a.length;o++)a[o].__fromStateTransition=t},e.prototype.getBoundingRect=function(){return null},e.prototype.getPaintRect=function(){return null},e.initDefaultProps=function(){var t=e.prototype;t.type=\"element\",t.name=\"\",t.ignore=t.silent=t.isGroup=t.draggable=t.dragging=t.ignoreClip=t.__inHover=!1,t.__dirty=Le;function r(n,i,a,o){Object.defineProperty(t,n,{get:function(){if(!this[i]){var l=this[i]=[];s(this,l)}return this[i]},set:function(l){this[a]=l[0],this[o]=l[1],this[i]=l,s(this,l)}});function s(l,u){Object.defineProperty(u,0,{get:function(){return l[a]},set:function(f){l[a]=f}}),Object.defineProperty(u,1,{get:function(){return l[o]},set:function(f){l[o]=f}})}}Object.defineProperty&&(r(\"position\",\"_legacyPos\",\"x\",\"y\"),r(\"scale\",\"_legacyScale\",\"scaleX\",\"scaleY\"),r(\"origin\",\"_legacyOrigin\",\"originX\",\"originY\"))}(),e}();Pr(yd,Ir);Pr(yd,pd);function Gf(e,t,r,n,i){r=r||{};var a=[];ow(e,\"\",e,t,r,n,a,i);var o=a.length,s=!1,l=r.done,u=r.aborted,f=function(){s=!0,o--,o<=0&&(s?l&&l():u&&u())},c=function(){o--,o<=0&&(s?l&&l():u&&u())};o||l&&l(),a.length>0&&r.during&&a[0].during(function(d,p){r.during(p)});for(var v=0;v<a.length;v++){var h=a[v];f&&h.done(f),c&&h.aborted(c),r.force&&h.duration(r.duration),h.start(r.easing)}return a}function Uf(e,t,r){for(var n=0;n<r;n++)e[n]=t[n]}function NI(e){return Me(e[0])}function BI(e,t,r){if(Me(t[r]))if(Me(e[r])||(e[r]=[]),Be(t[r])){var n=t[r].length;e[r].length!==n&&(e[r]=new t[r].constructor(n),Uf(e[r],t[r],n))}else{var i=t[r],a=e[r],o=i.length;if(NI(i))for(var s=i[0].length,l=0;l<o;l++)a[l]?Uf(a[l],i[l],s):a[l]=Array.prototype.slice.call(i[l]);else Uf(a,i,o);a.length=i.length}else e[r]=t[r]}function FI(e,t){return e===t||Me(e)&&Me(t)&&zI(e,t)}function zI(e,t){var r=e.length;if(r!==t.length)return!1;for(var n=0;n<r;n++)if(e[n]!==t[n])return!1;return!0}function ow(e,t,r,n,i,a,o,s){for(var l=Gt(n),u=i.duration,f=i.delay,c=i.additive,v=i.setToFinal,h=!st(a),d=e.animators,p=[],g=0;g<l.length;g++){var m=l[g],y=n[m];if(y!=null&&r[m]!=null&&(h||a[m]))if(st(y)&&!Me(y)&&!Bu(y)){if(t){s||(r[m]=y,e.updateDuringAnimation(t));continue}ow(e,m,r[m],y,i,a&&a[m],o,s)}else p.push(m);else s||(r[m]=y,e.updateDuringAnimation(t),p.push(m))}var _=p.length;if(!c&&_)for(var w=0;w<d.length;w++){var S=d[w];if(S.targetName===t){var b=S.stopTracks(p);if(b){var x=It(d,S);d.splice(x,1)}}}if(i.force||(p=Se(p,function(P){return!FI(n[P],r[P])}),_=p.length),_>0||i.force&&!o.length){var T=void 0,C=void 0,D=void 0;if(s){C={},v&&(T={});for(var w=0;w<_;w++){var m=p[w];C[m]=r[m],v?T[m]=n[m]:r[m]=n[m]}}else if(v){D={};for(var w=0;w<_;w++){var m=p[w];D[m]=Cl(r[m]),BI(r,n,m)}}var S=new cd(r,!1,!1,c?Se(d,function(A){return A.targetName===t}):null);S.targetName=t,i.scope&&(S.scope=i.scope),v&&T&&S.whenWithKeys(0,T,p),D&&S.whenWithKeys(0,D,p),S.whenWithKeys(u==null?500:u,s?C:n,p).delay(f||0),e.addAnimator(S,t),o.push(S)}}var sw=yd,lw=function(e){J(t,e);function t(r){var n=e.call(this)||this;return n.isGroup=!0,n._children=[],n.attr(r),n}return t.prototype.childrenRef=function(){return this._children},t.prototype.children=function(){return this._children.slice()},t.prototype.childAt=function(r){return this._children[r]},t.prototype.childOfName=function(r){for(var n=this._children,i=0;i<n.length;i++)if(n[i].name===r)return n[i]},t.prototype.childCount=function(){return this._children.length},t.prototype.add=function(r){return r&&r!==this&&r.parent!==this&&(this._children.push(r),this._doAdd(r)),this},t.prototype.addBefore=function(r,n){if(r&&r!==this&&r.parent!==this&&n&&n.parent===this){var i=this._children,a=i.indexOf(n);a>=0&&(i.splice(a,0,r),this._doAdd(r))}return this},t.prototype.replace=function(r,n){var i=It(this._children,r);return i>=0&&this.replaceAt(n,i),this},t.prototype.replaceAt=function(r,n){var i=this._children,a=i[n];if(r&&r!==this&&r.parent!==this&&r!==a){i[n]=r,a.parent=null;var o=this.__zr;o&&a.removeSelfFromZr(o),this._doAdd(r)}return this},t.prototype._doAdd=function(r){r.parent&&r.parent.remove(r),r.parent=this;var n=this.__zr;n&&n!==r.__zr&&r.addSelfToZr(n),n&&n.refresh()},t.prototype.remove=function(r){var n=this.__zr,i=this._children,a=It(i,r);return a<0?this:(i.splice(a,1),r.parent=null,n&&r.removeSelfFromZr(n),n&&n.refresh(),this)},t.prototype.removeAll=function(){for(var r=this._children,n=this.__zr,i=0;i<r.length;i++){var a=r[i];n&&a.removeSelfFromZr(n),a.parent=null}return r.length=0,this},t.prototype.eachChild=function(r,n){for(var i=this._children,a=0;a<i.length;a++){var o=i[a];r.call(n,o,a)}return this},t.prototype.traverse=function(r,n){for(var i=0;i<this._children.length;i++){var a=this._children[i],o=r.call(n,a);a.isGroup&&!o&&a.traverse(r,n)}return this},t.prototype.addSelfToZr=function(r){e.prototype.addSelfToZr.call(this,r);for(var n=0;n<this._children.length;n++){var i=this._children[n];i.addSelfToZr(r)}},t.prototype.removeSelfFromZr=function(r){e.prototype.removeSelfFromZr.call(this,r);for(var n=0;n<this._children.length;n++){var i=this._children[n];i.removeSelfFromZr(r)}},t.prototype.getBoundingRect=function(r){for(var n=new Ot(0,0,0,0),i=r||this._children,a=[],o=null,s=0;s<i.length;s++){var l=i[s];if(!(l.ignore||l.invisible)){var u=l.getBoundingRect(),f=l.getLocalTransform(a);f?(Ot.applyTransform(n,u,f),o=o||n.clone(),o.union(n)):(o=o||u.clone(),o.union(u))}}return o||n},t}(sw);lw.prototype.type=\"group\";var ye=lw;/*!\n* ZRender, a high performance 2d drawing library.\n*\n* Copyright (c) 2013, Baidu Inc.\n* All rights reserved.\n*\n* LICENSE\n* https://github.com/ecomfe/zrender/blob/master/LICENSE.txt\n*/var Pl={},uw={};function HI(e){delete uw[e]}function $I(e){if(!e)return!1;if(typeof e==\"string\")return Jl(e,1)<Ph;if(e.colorStops){for(var t=e.colorStops,r=0,n=t.length,i=0;i<n;i++)r+=Jl(t[i].color,1);return r/=n,r<Ph}return!1}var VI=function(){function e(t,r,n){var i=this;this._sleepAfterStill=10,this._stillFrameAccum=0,this._needsRefresh=!0,this._needsRefreshHover=!0,this._darkMode=!1,n=n||{},this.dom=r,this.id=t;var a=new QP,o=n.renderer||\"canvas\";Pl[o]||(o=Gt(Pl)[0]),n.useDirtyRect=n.useDirtyRect==null?!1:n.useDirtyRect;var s=new Pl[o](r,a,n,t),l=n.ssr||s.ssrOnly;this.storage=a,this.painter=s;var u=!wt.node&&!wt.worker&&!l?new AI(s.getViewportRoot(),s.root):null;this.handler=new qP(a,s,u,s.root),this.animation=new _I({stage:{update:l?null:function(){return i._flush(!0)}}}),l||this.animation.start()}return e.prototype.add=function(t){!t||(this.storage.addRoot(t),t.addSelfToZr(this),this.refresh())},e.prototype.remove=function(t){!t||(this.storage.delRoot(t),t.removeSelfFromZr(this),this.refresh())},e.prototype.configLayer=function(t,r){this.painter.configLayer&&this.painter.configLayer(t,r),this.refresh()},e.prototype.setBackgroundColor=function(t){this.painter.setBackgroundColor&&this.painter.setBackgroundColor(t),this.refresh(),this._backgroundColor=t,this._darkMode=$I(t)},e.prototype.getBackgroundColor=function(){return this._backgroundColor},e.prototype.setDarkMode=function(t){this._darkMode=t},e.prototype.isDarkMode=function(){return this._darkMode},e.prototype.refreshImmediately=function(t){t||this.animation.update(!0),this._needsRefresh=!1,this.painter.refresh(),this._needsRefresh=!1},e.prototype.refresh=function(){this._needsRefresh=!0,this.animation.start()},e.prototype.flush=function(){this._flush(!1)},e.prototype._flush=function(t){var r,n=oa();this._needsRefresh&&(r=!0,this.refreshImmediately(t)),this._needsRefreshHover&&(r=!0,this.refreshHoverImmediately());var i=oa();r?(this._stillFrameAccum=0,this.trigger(\"rendered\",{elapsedTime:i-n})):this._sleepAfterStill>0&&(this._stillFrameAccum++,this._stillFrameAccum>this._sleepAfterStill&&this.animation.stop())},e.prototype.setSleepAfterStill=function(t){this._sleepAfterStill=t},e.prototype.wakeUp=function(){this.animation.start(),this._stillFrameAccum=0},e.prototype.refreshHover=function(){this._needsRefreshHover=!0},e.prototype.refreshHoverImmediately=function(){this._needsRefreshHover=!1,this.painter.refreshHover&&this.painter.getType()===\"canvas\"&&this.painter.refreshHover()},e.prototype.resize=function(t){t=t||{},this.painter.resize(t.width,t.height),this.handler.resize()},e.prototype.clearAnimation=function(){this.animation.clear()},e.prototype.getWidth=function(){return this.painter.getWidth()},e.prototype.getHeight=function(){return this.painter.getHeight()},e.prototype.setCursorStyle=function(t){this.handler.setCursorStyle(t)},e.prototype.findHover=function(t,r){return this.handler.findHover(t,r)},e.prototype.on=function(t,r,n){return this.handler.on(t,r,n),this},e.prototype.off=function(t,r){this.handler.off(t,r)},e.prototype.trigger=function(t,r){this.handler.trigger(t,r)},e.prototype.clear=function(){for(var t=this.storage.getRoots(),r=0;r<t.length;r++)t[r]instanceof ye&&t[r].removeSelfFromZr(this);this.storage.delAllRoots(),this.painter.clear()},e.prototype.dispose=function(){this.animation.stop(),this.clear(),this.storage.dispose(),this.painter.dispose(),this.handler.dispose(),this.animation=this.storage=this.painter=this.handler=null,HI(this.id)},e}();function Qg(e,t){var r=new VI(B1(),e,t);return uw[r.id]=r,r}function GI(e,t){Pl[e]=t}var Jg=1e-4,fw=20;function UI(e){return e.replace(/^\\s+|\\s+$/g,\"\")}function Rh(e,t,r,n){var i=t[0],a=t[1],o=r[0],s=r[1],l=a-i,u=s-o;if(l===0)return u===0?o:(o+s)/2;if(n)if(l>0){if(e<=i)return o;if(e>=a)return s}else{if(e>=i)return o;if(e<=a)return s}else{if(e===i)return o;if(e===a)return s}return(e-i)/l*u+o}function Vt(e,t){switch(e){case\"center\":case\"middle\":e=\"50%\";break;case\"left\":case\"top\":e=\"0%\";break;case\"right\":case\"bottom\":e=\"100%\";break}return it(e)?UI(e).match(/%$/)?parseFloat(e)/100*t:parseFloat(e):e==null?NaN:+e}function jt(e,t,r){return t==null&&(t=10),t=Math.min(Math.max(0,t),fw),e=(+e).toFixed(t),r?e:+e}function zr(e){if(e=+e,isNaN(e))return 0;if(e>1e-14){for(var t=1,r=0;r<15;r++,t*=10)if(Math.round(e*t)/t===e)return r}return WI(e)}function WI(e){var t=e.toString().toLowerCase(),r=t.indexOf(\"e\"),n=r>0?+t.slice(r+1):0,i=r>0?r:t.length,a=t.indexOf(\".\"),o=a<0?0:i-1-a;return Math.max(0,o-n)}function YI(e,t){var r=Math.log,n=Math.LN10,i=Math.floor(r(e[1]-e[0])/n),a=Math.round(r(Math.abs(t[1]-t[0]))/n),o=Math.min(Math.max(-i+a,0),20);return isFinite(o)?o:20}function qI(e,t,r){if(!e[t])return 0;var n=Ln(e,function(d,p){return d+(isNaN(p)?0:p)},0);if(n===0)return 0;for(var i=Math.pow(10,r),a=ct(e,function(d){return(isNaN(d)?0:d)/n*i*100}),o=i*100,s=ct(a,function(d){return Math.floor(d)}),l=Ln(s,function(d,p){return d+p},0),u=ct(a,function(d,p){return d-s[p]});l<o;){for(var f=Number.NEGATIVE_INFINITY,c=null,v=0,h=u.length;v<h;++v)u[v]>f&&(f=u[v],c=v);++s[c],u[c]=0,++l}return s[t]/i}function XI(e,t){var r=Math.max(zr(e),zr(t)),n=e+t;return r>fw?n:jt(n,r)}function cw(e){var t=Math.PI*2;return(e%t+t)%t}function eu(e){return e>-Jg&&e<Jg}var jI=/^(?:(\\d{4})(?:[-\\/](\\d{1,2})(?:[-\\/](\\d{1,2})(?:[T ](\\d{1,2})(?::(\\d{1,2})(?::(\\d{1,2})(?:[.,](\\d+))?)?)?(Z|[\\+\\-]\\d\\d:?\\d\\d)?)?)?)?)?$/;function Yr(e){if(e instanceof Date)return e;if(it(e)){var t=jI.exec(e);if(!t)return new Date(NaN);if(t[8]){var r=+t[4]||0;return t[8].toUpperCase()!==\"Z\"&&(r-=+t[8].slice(0,3)),new Date(Date.UTC(+t[1],+(t[2]||1)-1,+t[3]||1,r,+(t[5]||0),+t[6]||0,t[7]?+t[7].substring(0,3):0))}else return new Date(+t[1],+(t[2]||1)-1,+t[3]||1,+t[4]||0,+(t[5]||0),+t[6]||0,t[7]?+t[7].substring(0,3):0)}else if(e==null)return new Date(NaN);return new Date(Math.round(e))}function KI(e){return Math.pow(10,_d(e))}function _d(e){if(e===0)return 0;var t=Math.floor(Math.log(e)/Math.LN10);return e/Math.pow(10,t)>=10&&t++,t}function hw(e,t){var r=_d(e),n=Math.pow(10,r),i=e/n,a;return t?i<1.5?a=1:i<2.5?a=2:i<4?a=3:i<7?a=5:a=10:i<1?a=1:i<2?a=2:i<3?a=3:i<5?a=5:a=10,e=a*n,r>=-20?+e.toFixed(r<0?-r:0):e}function ru(e){var t=parseFloat(e);return t==e&&(t!==0||!it(e)||e.indexOf(\"x\")<=0)?t:NaN}function ZI(e){return!isNaN(ru(e))}function vw(){return Math.round(Math.random()*9)}function dw(e,t){return t===0?e:dw(t,e%t)}function tm(e,t){return e==null?t:t==null?e:e*t/dw(e,t)}function xe(e){throw new Error(e)}function em(e,t,r){return(t-e)*r+e}var pw=\"series\\0\",QI=\"\\0_ec_\\0\";function me(e){return e instanceof Array?e:e==null?[]:[e]}function Oh(e,t,r){if(e){e[t]=e[t]||{},e.emphasis=e.emphasis||{},e.emphasis[t]=e.emphasis[t]||{};for(var n=0,i=r.length;n<i;n++){var a=r[n];!e.emphasis[t].hasOwnProperty(a)&&e[t].hasOwnProperty(a)&&(e.emphasis[t][a]=e[t][a])}}}var rm=[\"fontStyle\",\"fontWeight\",\"fontSize\",\"fontFamily\",\"rich\",\"tag\",\"color\",\"textBorderColor\",\"textBorderWidth\",\"width\",\"height\",\"lineHeight\",\"align\",\"verticalAlign\",\"baseline\",\"shadowColor\",\"shadowBlur\",\"shadowOffsetX\",\"shadowOffsetY\",\"textShadowColor\",\"textShadowBlur\",\"textShadowOffsetX\",\"textShadowOffsetY\",\"backgroundColor\",\"borderColor\",\"borderWidth\",\"borderRadius\",\"padding\"];function ms(e){return st(e)&&!et(e)&&!(e instanceof Date)?e.value:e}function JI(e){return st(e)&&!(e instanceof Array)}function tE(e,t,r){var n=r===\"normalMerge\",i=r===\"replaceMerge\",a=r===\"replaceAll\";e=e||[],t=(t||[]).slice();var o=_t();I(t,function(l,u){if(!st(l)){t[u]=null;return}});var s=eE(e,o,r);return(n||i)&&rE(s,e,o,t),n&&nE(s,t),n||i?iE(s,t,i):a&&aE(s,t),oE(s),s}function eE(e,t,r){var n=[];if(r===\"replaceAll\")return n;for(var i=0;i<e.length;i++){var a=e[i];a&&a.id!=null&&t.set(a.id,i),n.push({existing:r===\"replaceMerge\"||ts(a)?null:a,newOption:null,keyInfo:null,brandNew:null})}return n}function rE(e,t,r,n){I(n,function(i,a){if(!(!i||i.id==null)){var o=Io(i.id),s=r.get(o);if(s!=null){var l=e[s];Wr(!l.newOption,'Duplicated option on id \"'+o+'\".'),l.newOption=i,l.existing=t[s],n[a]=null}}})}function nE(e,t){I(t,function(r,n){if(!(!r||r.name==null))for(var i=0;i<e.length;i++){var a=e[i].existing;if(!e[i].newOption&&a&&(a.id==null||r.id==null)&&!ts(r)&&!ts(a)&&gw(\"name\",a,r)){e[i].newOption=r,t[n]=null;return}}})}function iE(e,t,r){I(t,function(n){if(!!n){for(var i,a=0;(i=e[a])&&(i.newOption||ts(i.existing)||i.existing&&n.id!=null&&!gw(\"id\",n,i.existing));)a++;i?(i.newOption=n,i.brandNew=r):e.push({newOption:n,brandNew:r,existing:null,keyInfo:null}),a++}})}function aE(e,t){I(t,function(r){e.push({newOption:r,brandNew:!0,existing:null,keyInfo:null})})}function oE(e){var t=_t();I(e,function(r){var n=r.existing;n&&t.set(n.id,r)}),I(e,function(r){var n=r.newOption;Wr(!n||n.id==null||!t.get(n.id)||t.get(n.id)===r,\"id duplicates: \"+(n&&n.id)),n&&n.id!=null&&t.set(n.id,r),!r.keyInfo&&(r.keyInfo={})}),I(e,function(r,n){var i=r.existing,a=r.newOption,o=r.keyInfo;if(!!st(a)){if(o.name=a.name!=null?Io(a.name):i?i.name:pw+n,i)o.id=Io(i.id);else if(a.id!=null)o.id=Io(a.id);else{var s=0;do o.id=\"\\0\"+o.name+\"\\0\"+s++;while(t.get(o.id))}t.set(o.id,r)}})}function gw(e,t,r){var n=Mr(t[e],null),i=Mr(r[e],null);return n!=null&&i!=null&&n===i}function Io(e){return Mr(e,\"\")}function Mr(e,t){return e==null?t:it(e)?e:zt(e)||dh(e)?e+\"\":t}function wd(e){var t=e.name;return!!(t&&t.indexOf(pw))}function ts(e){return e&&e.id!=null&&Io(e.id).indexOf(QI)===0}function sE(e,t,r){I(e,function(n){var i=n.newOption;st(i)&&(n.keyInfo.mainType=t,n.keyInfo.subType=lE(t,i,n.existing,r))})}function lE(e,t,r,n){var i=t.type?t.type:r?r.subType:n.determineSubType(e,t);return i}function Si(e,t){if(t.dataIndexInside!=null)return t.dataIndexInside;if(t.dataIndex!=null)return et(t.dataIndex)?ct(t.dataIndex,function(r){return e.indexOfRawIndex(r)}):e.indexOfRawIndex(t.dataIndex);if(t.name!=null)return et(t.name)?ct(t.name,function(r){return e.indexOfName(r)}):e.indexOfName(t.name)}function Qt(){var e=\"__ec_inner_\"+uE++;return function(t){return t[e]||(t[e]={})}}var uE=vw();function Wf(e,t,r){var n=bd(t,r),i=n.mainTypeSpecified,a=n.queryOptionMap,o=n.others,s=o,l=r?r.defaultMainType:null;return!i&&l&&a.set(l,{}),a.each(function(u,f){var c=ys(e,f,u,{useDefault:l===f,enableAll:r&&r.enableAll!=null?r.enableAll:!0,enableNone:r&&r.enableNone!=null?r.enableNone:!0});s[f+\"Models\"]=c.models,s[f+\"Model\"]=c.models[0]}),s}function bd(e,t){var r;if(it(e)){var n={};n[e+\"Index\"]=0,r=n}else r=e;var i=_t(),a={},o=!1;return I(r,function(s,l){if(l===\"dataIndex\"||l===\"dataIndexInside\"){a[l]=s;return}var u=l.match(/^(\\w+)(Index|Id|Name)$/)||[],f=u[1],c=(u[2]||\"\").toLowerCase();if(!(!f||!c||t&&t.includeMainTypes&&It(t.includeMainTypes,f)<0)){o=o||!!f;var v=i.get(f)||i.set(f,{});v[c]=s}}),{mainTypeSpecified:o,queryOptionMap:i,others:a}}var ur={useDefault:!0,enableAll:!1,enableNone:!1};function ys(e,t,r,n){n=n||ur;var i=r.index,a=r.id,o=r.name,s={models:null,specified:i!=null||a!=null||o!=null};if(!s.specified){var l=void 0;return s.models=n.useDefault&&(l=e.getComponent(t))?[l]:[],s}return i===\"none\"||i===!1?(Wr(n.enableNone,'`\"none\"` or `false` is not a valid value on index option.'),s.models=[],s):(i===\"all\"&&(Wr(n.enableAll,'`\"all\"` is not a valid value on index option.'),i=a=o=null),s.models=e.queryComponents({mainType:t,index:i,id:a,name:o}),s)}function mw(e,t,r){e.setAttribute?e.setAttribute(t,r):e[t]=r}function fE(e,t){return e.getAttribute?e.getAttribute(t):e[t]}function cE(e){return e===\"auto\"?wt.domSupported?\"html\":\"richText\":e||\"html\"}function hE(e,t,r,n,i){var a=t==null||t===\"auto\";if(n==null)return n;if(zt(n)){var o=em(r||0,n,i);return jt(o,a?Math.max(zr(r||0),zr(n)):t)}else{if(it(n))return i<1?r:n;for(var s=[],l=r,u=n,f=Math.max(l?l.length:0,u.length),c=0;c<f;++c){var v=e.getDimensionInfo(c);if(v&&v.type===\"ordinal\")s[c]=(i<1&&l?l:u)[c];else{var h=l&&l[c]?l[c]:0,d=u[c],o=em(h,d,i);s[c]=jt(o,a?Math.max(zr(h),zr(d)):t)}}return s}}var vE=\".\",Wn=\"___EC__COMPONENT__CONTAINER___\",yw=\"___EC__EXTENDED_CLASS___\";function Cr(e){var t={main:\"\",sub:\"\"};if(e){var r=e.split(vE);t.main=r[0]||\"\",t.sub=r[1]||\"\"}return t}function dE(e){Wr(/^[a-zA-Z0-9_]+([.][a-zA-Z0-9_]+)?$/.test(e),'componentType \"'+e+'\" illegal')}function pE(e){return!!(e&&e[yw])}function Sd(e,t){e.$constructor=e,e.extend=function(r){var n=this,i;return gE(n)?i=function(a){J(o,a);function o(){return a.apply(this,arguments)||this}return o}(n):(i=function(){(r.$constructor||n).apply(this,arguments)},gP(i,this)),Y(i.prototype,r),i[yw]=!0,i.extend=this.extend,i.superCall=_E,i.superApply=wE,i.superClass=n,i}}function gE(e){return mt(e)&&/^class\\s/.test(Function.prototype.toString.call(e))}function _w(e,t){e.extend=t.extend}var mE=Math.round(Math.random()*10);function yE(e){var t=[\"__\\0is_clz\",mE++].join(\"_\");e.prototype[t]=!0,e.isInstance=function(r){return!!(r&&r[t])}}function _E(e,t){for(var r=[],n=2;n<arguments.length;n++)r[n-2]=arguments[n];return this.superClass.prototype[t].apply(e,r)}function wE(e,t,r){return this.superClass.prototype[t].apply(e,r)}function Hu(e){var t={};e.registerClass=function(n){var i=n.type||n.prototype.type;if(i){dE(i),n.prototype.type=i;var a=Cr(i);if(!a.sub)t[a.main]=n;else if(a.sub!==Wn){var o=r(a);o[a.sub]=n}}return n},e.getClass=function(n,i,a){var o=t[n];if(o&&o[Wn]&&(o=i?o[i]:null),a&&!o)throw new Error(i?\"Component \"+n+\".\"+(i||\"\")+\" is used but not imported.\":n+\".type should be specified.\");return o},e.getClassesByMainType=function(n){var i=Cr(n),a=[],o=t[i.main];return o&&o[Wn]?I(o,function(s,l){l!==Wn&&a.push(s)}):a.push(o),a},e.hasClass=function(n){var i=Cr(n);return!!t[i.main]},e.getAllClassMainTypes=function(){var n=[];return I(t,function(i,a){n.push(a)}),n},e.hasSubTypes=function(n){var i=Cr(n),a=t[i.main];return a&&a[Wn]};function r(n){var i=t[n.main];return(!i||!i[Wn])&&(i=t[n.main]={},i[Wn]=!0),i}}function es(e,t){for(var r=0;r<e.length;r++)e[r][1]||(e[r][1]=e[r][0]);return t=t||!1,function(n,i,a){for(var o={},s=0;s<e.length;s++){var l=e[s][1];if(!(i&&It(i,l)>=0||a&&It(a,l)<0)){var u=n.getShallow(l,t);u!=null&&(o[e[s][0]]=u)}}return o}}var bE=[[\"fill\",\"color\"],[\"shadowBlur\"],[\"shadowOffsetX\"],[\"shadowOffsetY\"],[\"opacity\"],[\"shadowColor\"]],SE=es(bE),xE=function(){function e(){}return e.prototype.getAreaStyle=function(t,r){return SE(this,t,r)},e}(),kh=new gs(50);function TE(e){if(typeof e==\"string\"){var t=kh.get(e);return t&&t.image}else return e}function ww(e,t,r,n,i){if(e)if(typeof e==\"string\"){if(t&&t.__zrImageSrc===e||!r)return t;var a=kh.get(e),o={hostEl:r,cb:n,cbPayload:i};if(a)t=a.image,!$u(t)&&a.pending.push(o);else{var s=Pi.loadImage(e,nm,nm);s.__zrImageSrc=e,kh.put(e,s.__cachedImgObj={image:s,pending:[o]})}return t}else return e;else return t}function nm(){var e=this.__cachedImgObj;this.onload=this.onerror=this.__cachedImgObj=null;for(var t=0;t<e.pending.length;t++){var r=e.pending[t],n=r.cb;n&&n(this,r.cbPayload),r.hostEl.dirty()}e.pending.length=0}function $u(e){return e&&e.width&&e.height}var Yf=/\\{([a-zA-Z0-9_]+)\\|([^}]*)\\}/g;function CE(e,t,r,n,i){if(!t)return\"\";var a=(e+\"\").split(`\n`);i=bw(t,r,n,i);for(var o=0,s=a.length;o<s;o++)a[o]=Sw(a[o],i);return a.join(`\n`)}function bw(e,t,r,n){n=n||{};var i=Y({},n);i.font=t,r=Mt(r,\"...\"),i.maxIterations=Mt(n.maxIterations,2);var a=i.minChar=Mt(n.minChar,0);i.cnCharWidth=Oe(\"\\u56FD\",t);var o=i.ascCharWidth=Oe(\"a\",t);i.placeholder=Mt(n.placeholder,\"\");for(var s=e=Math.max(0,e-1),l=0;l<a&&s>=o;l++)s-=o;var u=Oe(r,t);return u>s&&(r=\"\",u=0),s=e-u,i.ellipsis=r,i.ellipsisWidth=u,i.contentWidth=s,i.containerWidth=e,i}function Sw(e,t){var r=t.containerWidth,n=t.font,i=t.contentWidth;if(!r)return\"\";var a=Oe(e,n);if(a<=r)return e;for(var o=0;;o++){if(a<=i||o>=t.maxIterations){e+=t.ellipsis;break}var s=o===0?ME(e,i,t.ascCharWidth,t.cnCharWidth):a>0?Math.floor(e.length*i/a):0;e=e.substr(0,s),a=Oe(e,n)}return e===\"\"&&(e=t.placeholder),e}function ME(e,t,r,n){for(var i=0,a=0,o=e.length;a<o&&i<t;a++){var s=e.charCodeAt(a);i+=0<=s&&s<=127?r:n}return a}function AE(e,t){e!=null&&(e+=\"\");var r=t.overflow,n=t.padding,i=t.font,a=r===\"truncate\",o=md(i),s=Mt(t.lineHeight,o),l=!!t.backgroundColor,u=t.lineOverflow===\"truncate\",f=t.width,c;f!=null&&(r===\"break\"||r===\"breakAll\")?c=e?xw(e,t.font,f,r===\"breakAll\",0).lines:[]:c=e?e.split(`\n`):[];var v=c.length*s,h=Mt(t.height,v);if(v>h&&u){var d=Math.floor(h/s);c=c.slice(0,d)}if(e&&a&&f!=null)for(var p=bw(f,i,t.ellipsis,{minChar:t.truncateMinChar,placeholder:t.placeholder}),g=0;g<c.length;g++)c[g]=Sw(c[g],p);for(var m=h,y=0,g=0;g<c.length;g++)y=Math.max(Oe(c[g],i),y);f==null&&(f=y);var _=y;return n&&(m+=n[0]+n[2],_+=n[1]+n[3],f+=n[1]+n[3]),l&&(_=f),{lines:c,height:h,outerWidth:_,outerHeight:m,lineHeight:s,calculatedLineHeight:o,contentWidth:y,contentHeight:v,width:f}}var DE=function(){function e(){}return e}(),im=function(){function e(t){this.tokens=[],t&&(this.tokens=t)}return e}(),PE=function(){function e(){this.width=0,this.height=0,this.contentWidth=0,this.contentHeight=0,this.outerWidth=0,this.outerHeight=0,this.lines=[]}return e}();function IE(e,t){var r=new PE;if(e!=null&&(e+=\"\"),!e)return r;for(var n=t.width,i=t.height,a=t.overflow,o=(a===\"break\"||a===\"breakAll\")&&n!=null?{width:n,accumWidth:0,breakAll:a===\"breakAll\"}:null,s=Yf.lastIndex=0,l;(l=Yf.exec(e))!=null;){var u=l.index;u>s&&qf(r,e.substring(s,u),t,o),qf(r,l[2],t,o,l[1]),s=Yf.lastIndex}s<e.length&&qf(r,e.substring(s,e.length),t,o);var f=[],c=0,v=0,h=t.padding,d=a===\"truncate\",p=t.lineOverflow===\"truncate\";function g(V,K,lt){V.width=K,V.lineHeight=lt,c+=lt,v=Math.max(v,K)}t:for(var m=0;m<r.lines.length;m++){for(var y=r.lines[m],_=0,w=0,S=0;S<y.tokens.length;S++){var b=y.tokens[S],x=b.styleName&&t.rich[b.styleName]||{},T=b.textPadding=x.padding,C=T?T[1]+T[3]:0,D=b.font=x.font||t.font;b.contentHeight=md(D);var P=Mt(x.height,b.contentHeight);if(b.innerHeight=P,T&&(P+=T[0]+T[2]),b.height=P,b.lineHeight=Do(x.lineHeight,t.lineHeight,P),b.align=x&&x.align||t.align,b.verticalAlign=x&&x.verticalAlign||\"middle\",p&&i!=null&&c+b.lineHeight>i){S>0?(y.tokens=y.tokens.slice(0,S),g(y,w,_),r.lines=r.lines.slice(0,m+1)):r.lines=r.lines.slice(0,m);break t}var A=x.width,L=A==null||A===\"auto\";if(typeof A==\"string\"&&A.charAt(A.length-1)===\"%\")b.percentWidth=A,f.push(b),b.contentWidth=Oe(b.text,D);else{if(L){var O=x.backgroundColor,z=O&&O.image;z&&(z=TE(z),$u(z)&&(b.width=Math.max(b.width,z.width*P/z.height)))}var N=d&&n!=null?n-w:null;N!=null&&N<b.width?!L||N<C?(b.text=\"\",b.width=b.contentWidth=0):(b.text=CE(b.text,N-C,D,t.ellipsis,{minChar:t.truncateMinChar}),b.width=b.contentWidth=Oe(b.text,D)):b.contentWidth=Oe(b.text,D)}b.width+=C,w+=b.width,x&&(_=Math.max(_,b.lineHeight))}g(y,w,_)}r.outerWidth=r.width=Mt(n,v),r.outerHeight=r.height=Mt(i,c),r.contentHeight=c,r.contentWidth=v,h&&(r.outerWidth+=h[1]+h[3],r.outerHeight+=h[0]+h[2]);for(var m=0;m<f.length;m++){var b=f[m],tt=b.percentWidth;b.width=parseInt(tt,10)/100*r.width}return r}function qf(e,t,r,n,i){var a=t===\"\",o=i&&r.rich[i]||{},s=e.lines,l=o.font||r.font,u=!1,f,c;if(n){var v=o.padding,h=v?v[1]+v[3]:0;if(o.width!=null&&o.width!==\"auto\"){var d=Rn(o.width,n.width)+h;s.length>0&&d+n.accumWidth>n.width&&(f=t.split(`\n`),u=!0),n.accumWidth=d}else{var p=xw(t,l,n.width,n.breakAll,n.accumWidth);n.accumWidth=p.accumWidth+h,c=p.linesWidths,f=p.lines}}else f=t.split(`\n`);for(var g=0;g<f.length;g++){var m=f[g],y=new DE;if(y.styleName=i,y.text=m,y.isLineHolder=!m&&!a,typeof o.width==\"number\"?y.width=o.width:y.width=c?c[g]:Oe(m,l),!g&&!u){var _=(s[s.length-1]||(s[0]=new im)).tokens,w=_.length;w===1&&_[0].isLineHolder?_[0]=y:(m||!w||a)&&_.push(y)}else s.push(new im([y]))}}function EE(e){var t=e.charCodeAt(0);return t>=33&&t<=383}var LE=Ln(\",&?/;] \".split(\"\"),function(e,t){return e[t]=!0,e},{});function RE(e){return EE(e)?!!LE[e]:!0}function xw(e,t,r,n,i){for(var a=[],o=[],s=\"\",l=\"\",u=0,f=0,c=0;c<e.length;c++){var v=e.charAt(c);if(v===`\n`){l&&(s+=l,f+=u),a.push(s),o.push(f),s=\"\",l=\"\",u=0,f=0;continue}var h=Oe(v,t),d=n?!1:!RE(v);if(a.length?f+h>r:i+f+h>r){f?(s||l)&&(d?(s||(s=l,l=\"\",u=0,f=u),a.push(s),o.push(f-u),l+=v,u+=h,s=\"\",f=u):(l&&(s+=l,l=\"\",u=0),a.push(s),o.push(f),s=v,f=h)):d?(a.push(l),o.push(u),l=v,u=h):(a.push(v),o.push(h));continue}f+=h,d?(l+=v,u+=h):(l&&(s+=l,l=\"\",u=0),s+=v)}return!a.length&&!s&&(s=e,l=\"\",u=0),l&&(s+=l),s&&(a.push(s),o.push(f)),a.length===1&&(f+=i),{accumWidth:f,lines:a,linesWidths:o}}var Nh=\"__zr_style_\"+Math.round(Math.random()*10),gi={shadowBlur:0,shadowOffsetX:0,shadowOffsetY:0,shadowColor:\"#000\",opacity:1,blend:\"source-over\"},Vu={style:{shadowBlur:!0,shadowOffsetX:!0,shadowOffsetY:!0,shadowColor:!0,opacity:!0}};gi[Nh]=!0;var am=[\"z\",\"z2\",\"invisible\"],OE=[\"invisible\"],kE=function(e){J(t,e);function t(r){return e.call(this,r)||this}return t.prototype._init=function(r){for(var n=Gt(r),i=0;i<n.length;i++){var a=n[i];a===\"style\"?this.useStyle(r[a]):e.prototype.attrKV.call(this,a,r[a])}this.style||this.useStyle({})},t.prototype.beforeBrush=function(){},t.prototype.afterBrush=function(){},t.prototype.innerBeforeBrush=function(){},t.prototype.innerAfterBrush=function(){},t.prototype.shouldBePainted=function(r,n,i,a){var o=this.transform;if(this.ignore||this.invisible||this.style.opacity===0||this.culling&&NE(this,r,n)||o&&!o[0]&&!o[3])return!1;if(i&&this.__clipPaths){for(var s=0;s<this.__clipPaths.length;++s)if(this.__clipPaths[s].isZeroArea())return!1}if(a&&this.parent)for(var l=this.parent;l;){if(l.ignore)return!1;l=l.parent}return!0},t.prototype.contain=function(r,n){return this.rectContain(r,n)},t.prototype.traverse=function(r,n){r.call(n,this)},t.prototype.rectContain=function(r,n){var i=this.transformCoordToLocal(r,n),a=this.getBoundingRect();return a.contain(i[0],i[1])},t.prototype.getPaintRect=function(){var r=this._paintRect;if(!this._paintRect||this.__dirty){var n=this.transform,i=this.getBoundingRect(),a=this.style,o=a.shadowBlur||0,s=a.shadowOffsetX||0,l=a.shadowOffsetY||0;r=this._paintRect||(this._paintRect=new Ot(0,0,0,0)),n?Ot.applyTransform(r,i,n):r.copy(i),(o||s||l)&&(r.width+=o*2+Math.abs(s),r.height+=o*2+Math.abs(l),r.x=Math.min(r.x,r.x+s-o),r.y=Math.min(r.y,r.y+l-o));var u=this.dirtyRectTolerance;r.isZero()||(r.x=Math.floor(r.x-u),r.y=Math.floor(r.y-u),r.width=Math.ceil(r.width+1+u*2),r.height=Math.ceil(r.height+1+u*2))}return r},t.prototype.setPrevPaintRect=function(r){r?(this._prevPaintRect=this._prevPaintRect||new Ot(0,0,0,0),this._prevPaintRect.copy(r)):this._prevPaintRect=null},t.prototype.getPrevPaintRect=function(){return this._prevPaintRect},t.prototype.animateStyle=function(r){return this.animate(\"style\",r)},t.prototype.updateDuringAnimation=function(r){r===\"style\"?this.dirtyStyle():this.markRedraw()},t.prototype.attrKV=function(r,n){r!==\"style\"?e.prototype.attrKV.call(this,r,n):this.style?this.setStyle(n):this.useStyle(n)},t.prototype.setStyle=function(r,n){return typeof r==\"string\"?this.style[r]=n:Y(this.style,r),this.dirtyStyle(),this},t.prototype.dirtyStyle=function(r){r||this.markRedraw(),this.__dirty|=ho,this._rect&&(this._rect=null)},t.prototype.dirty=function(){this.dirtyStyle()},t.prototype.styleChanged=function(){return!!(this.__dirty&ho)},t.prototype.styleUpdated=function(){this.__dirty&=~ho},t.prototype.createStyle=function(r){return Fu(gi,r)},t.prototype.useStyle=function(r){r[Nh]||(r=this.createStyle(r)),this.__inHover?this.__hoverStyle=r:this.style=r,this.dirtyStyle()},t.prototype.isStyleObject=function(r){return r[Nh]},t.prototype._innerSaveToNormal=function(r){e.prototype._innerSaveToNormal.call(this,r);var n=this._normalState;r.style&&!n.style&&(n.style=this._mergeStyle(this.createStyle(),this.style)),this._savePrimaryToNormal(r,n,am)},t.prototype._applyStateObj=function(r,n,i,a,o,s){e.prototype._applyStateObj.call(this,r,n,i,a,o,s);var l=!(n&&a),u;if(n&&n.style?o?a?u=n.style:(u=this._mergeStyle(this.createStyle(),i.style),this._mergeStyle(u,n.style)):(u=this._mergeStyle(this.createStyle(),a?this.style:i.style),this._mergeStyle(u,n.style)):l&&(u=i.style),u)if(o){var f=this.style;if(this.style=this.createStyle(l?{}:f),l)for(var c=Gt(f),v=0;v<c.length;v++){var h=c[v];h in u&&(u[h]=u[h],this.style[h]=f[h])}for(var d=Gt(u),v=0;v<d.length;v++){var h=d[v];this.style[h]=this.style[h]}this._transitionState(r,{style:u},s,this.getAnimationStyleProps())}else this.useStyle(u);for(var p=this.__inHover?OE:am,v=0;v<p.length;v++){var h=p[v];n&&n[h]!=null?this[h]=n[h]:l&&i[h]!=null&&(this[h]=i[h])}},t.prototype._mergeStates=function(r){for(var n=e.prototype._mergeStates.call(this,r),i,a=0;a<r.length;a++){var o=r[a];o.style&&(i=i||{},this._mergeStyle(i,o.style))}return i&&(n.style=i),n},t.prototype._mergeStyle=function(r,n){return Y(r,n),r},t.prototype.getAnimationStyleProps=function(){return Vu},t.initDefaultProps=function(){var r=t.prototype;r.type=\"displayable\",r.invisible=!1,r.z=0,r.z2=0,r.zlevel=0,r.culling=!1,r.cursor=\"pointer\",r.rectHover=!1,r.incremental=!1,r._rect=null,r.dirtyRectTolerance=0,r.__dirty=Le|ho}(),t}(sw),Xf=new Ot(0,0,0,0),jf=new Ot(0,0,0,0);function NE(e,t,r){return Xf.copy(e.getBoundingRect()),e.transform&&Xf.applyTransform(e.transform),jf.width=t,jf.height=r,!Xf.intersect(jf)}var _s=kE,Xe=Math.min,je=Math.max,Kf=Math.sin,Zf=Math.cos,Yn=Math.PI*2,$s=Na(),Vs=Na(),Gs=Na();function om(e,t,r,n,i,a){i[0]=Xe(e,r),i[1]=Xe(t,n),a[0]=je(e,r),a[1]=je(t,n)}var sm=[],lm=[];function BE(e,t,r,n,i,a,o,s,l,u){var f=Z1,c=Kt,v=f(e,r,i,o,sm);l[0]=1/0,l[1]=1/0,u[0]=-1/0,u[1]=-1/0;for(var h=0;h<v;h++){var d=c(e,r,i,o,sm[h]);l[0]=Xe(d,l[0]),u[0]=je(d,u[0])}v=f(t,n,a,s,lm);for(var h=0;h<v;h++){var p=c(t,n,a,s,lm[h]);l[1]=Xe(p,l[1]),u[1]=je(p,u[1])}l[0]=Xe(e,l[0]),u[0]=je(e,u[0]),l[0]=Xe(o,l[0]),u[0]=je(o,u[0]),l[1]=Xe(t,l[1]),u[1]=je(t,u[1]),l[1]=Xe(s,l[1]),u[1]=je(s,u[1])}function FE(e,t,r,n,i,a,o,s){var l=Q1,u=le,f=je(Xe(l(e,r,i),1),0),c=je(Xe(l(t,n,a),1),0),v=u(e,r,i,f),h=u(t,n,a,c);o[0]=Xe(e,i,v),o[1]=Xe(t,a,h),s[0]=je(e,i,v),s[1]=je(t,a,h)}function zE(e,t,r,n,i,a,o,s,l){var u=ia,f=aa,c=Math.abs(i-a);if(c%Yn<1e-4&&c>1e-4){s[0]=e-r,s[1]=t-n,l[0]=e+r,l[1]=t+n;return}if($s[0]=Zf(i)*r+e,$s[1]=Kf(i)*n+t,Vs[0]=Zf(a)*r+e,Vs[1]=Kf(a)*n+t,u(s,$s,Vs),f(l,$s,Vs),i=i%Yn,i<0&&(i=i+Yn),a=a%Yn,a<0&&(a=a+Yn),i>a&&!o?a+=Yn:i<a&&o&&(i+=Yn),o){var v=a;a=i,i=v}for(var h=0;h<a;h+=Math.PI/2)h>i&&(Gs[0]=Zf(h)*r+e,Gs[1]=Kf(h)*n+t,u(s,Gs,s),f(l,Gs,l))}var At={M:1,L:2,C:3,Q:4,A:5,Z:6,R:7},qn=[],Xn=[],gr=[],rn=[],mr=[],yr=[],Qf=Math.min,Jf=Math.max,jn=Math.cos,Kn=Math.sin,Lr=Math.abs,Bh=Math.PI,hn=Bh*2,tc=typeof Float32Array!=\"undefined\",ja=[];function ec(e){var t=Math.round(e/Bh*1e8)/1e8;return t%2*Bh}function HE(e,t){var r=ec(e[0]);r<0&&(r+=hn);var n=r-e[0],i=e[1];i+=n,!t&&i-r>=hn?i=r+hn:t&&r-i>=hn?i=r-hn:!t&&r>i?i=r+(hn-ec(r-i)):t&&r<i&&(i=r-(hn-ec(i-r))),e[0]=r,e[1]=i}var $E=function(){function e(t){this.dpr=1,this._xi=0,this._yi=0,this._x0=0,this._y0=0,this._len=0,t&&(this._saveData=!1),this._saveData&&(this.data=[])}return e.prototype.increaseVersion=function(){this._version++},e.prototype.getVersion=function(){return this._version},e.prototype.setScale=function(t,r,n){n=n||0,n>0&&(this._ux=Lr(n/tu/t)||0,this._uy=Lr(n/tu/r)||0)},e.prototype.setDPR=function(t){this.dpr=t},e.prototype.setContext=function(t){this._ctx=t},e.prototype.getContext=function(){return this._ctx},e.prototype.beginPath=function(){return this._ctx&&this._ctx.beginPath(),this.reset(),this},e.prototype.reset=function(){this._saveData&&(this._len=0),this._pathSegLen&&(this._pathSegLen=null,this._pathLen=0),this._version++},e.prototype.moveTo=function(t,r){return this._drawPendingPt(),this.addData(At.M,t,r),this._ctx&&this._ctx.moveTo(t,r),this._x0=t,this._y0=r,this._xi=t,this._yi=r,this},e.prototype.lineTo=function(t,r){var n=Lr(t-this._xi),i=Lr(r-this._yi),a=n>this._ux||i>this._uy;if(this.addData(At.L,t,r),this._ctx&&a&&this._ctx.lineTo(t,r),a)this._xi=t,this._yi=r,this._pendingPtDist=0;else{var o=n*n+i*i;o>this._pendingPtDist&&(this._pendingPtX=t,this._pendingPtY=r,this._pendingPtDist=o)}return this},e.prototype.bezierCurveTo=function(t,r,n,i,a,o){return this._drawPendingPt(),this.addData(At.C,t,r,n,i,a,o),this._ctx&&this._ctx.bezierCurveTo(t,r,n,i,a,o),this._xi=a,this._yi=o,this},e.prototype.quadraticCurveTo=function(t,r,n,i){return this._drawPendingPt(),this.addData(At.Q,t,r,n,i),this._ctx&&this._ctx.quadraticCurveTo(t,r,n,i),this._xi=n,this._yi=i,this},e.prototype.arc=function(t,r,n,i,a,o){this._drawPendingPt(),ja[0]=i,ja[1]=a,HE(ja,o),i=ja[0],a=ja[1];var s=a-i;return this.addData(At.A,t,r,n,n,i,s,0,o?0:1),this._ctx&&this._ctx.arc(t,r,n,i,a,o),this._xi=jn(a)*n+t,this._yi=Kn(a)*n+r,this},e.prototype.arcTo=function(t,r,n,i,a){return this._drawPendingPt(),this._ctx&&this._ctx.arcTo(t,r,n,i,a),this},e.prototype.rect=function(t,r,n,i){return this._drawPendingPt(),this._ctx&&this._ctx.rect(t,r,n,i),this.addData(At.R,t,r,n,i),this},e.prototype.closePath=function(){this._drawPendingPt(),this.addData(At.Z);var t=this._ctx,r=this._x0,n=this._y0;return t&&t.closePath(),this._xi=r,this._yi=n,this},e.prototype.fill=function(t){t&&t.fill(),this.toStatic()},e.prototype.stroke=function(t){t&&t.stroke(),this.toStatic()},e.prototype.len=function(){return this._len},e.prototype.setData=function(t){var r=t.length;!(this.data&&this.data.length===r)&&tc&&(this.data=new Float32Array(r));for(var n=0;n<r;n++)this.data[n]=t[n];this._len=r},e.prototype.appendPath=function(t){t instanceof Array||(t=[t]);for(var r=t.length,n=0,i=this._len,a=0;a<r;a++)n+=t[a].len();tc&&this.data instanceof Float32Array&&(this.data=new Float32Array(i+n));for(var a=0;a<r;a++)for(var o=t[a].data,s=0;s<o.length;s++)this.data[i++]=o[s];this._len=i},e.prototype.addData=function(t,r,n,i,a,o,s,l,u){if(!!this._saveData){var f=this.data;this._len+arguments.length>f.length&&(this._expandData(),f=this.data);for(var c=0;c<arguments.length;c++)f[this._len++]=arguments[c]}},e.prototype._drawPendingPt=function(){this._pendingPtDist>0&&(this._ctx&&this._ctx.lineTo(this._pendingPtX,this._pendingPtY),this._pendingPtDist=0)},e.prototype._expandData=function(){if(!(this.data instanceof Array)){for(var t=[],r=0;r<this._len;r++)t[r]=this.data[r];this.data=t}},e.prototype.toStatic=function(){if(!!this._saveData){this._drawPendingPt();var t=this.data;t instanceof Array&&(t.length=this._len,tc&&this._len>11&&(this.data=new Float32Array(t)))}},e.prototype.getBoundingRect=function(){gr[0]=gr[1]=mr[0]=mr[1]=Number.MAX_VALUE,rn[0]=rn[1]=yr[0]=yr[1]=-Number.MAX_VALUE;var t=this.data,r=0,n=0,i=0,a=0,o;for(o=0;o<this._len;){var s=t[o++],l=o===1;switch(l&&(r=t[o],n=t[o+1],i=r,a=n),s){case At.M:r=i=t[o++],n=a=t[o++],mr[0]=i,mr[1]=a,yr[0]=i,yr[1]=a;break;case At.L:om(r,n,t[o],t[o+1],mr,yr),r=t[o++],n=t[o++];break;case At.C:BE(r,n,t[o++],t[o++],t[o++],t[o++],t[o],t[o+1],mr,yr),r=t[o++],n=t[o++];break;case At.Q:FE(r,n,t[o++],t[o++],t[o],t[o+1],mr,yr),r=t[o++],n=t[o++];break;case At.A:var u=t[o++],f=t[o++],c=t[o++],v=t[o++],h=t[o++],d=t[o++]+h;o+=1;var p=!t[o++];l&&(i=jn(h)*c+u,a=Kn(h)*v+f),zE(u,f,c,v,h,d,p,mr,yr),r=jn(d)*c+u,n=Kn(d)*v+f;break;case At.R:i=r=t[o++],a=n=t[o++];var g=t[o++],m=t[o++];om(i,a,i+g,a+m,mr,yr);break;case At.Z:r=i,n=a;break}ia(gr,gr,mr),aa(rn,rn,yr)}return o===0&&(gr[0]=gr[1]=rn[0]=rn[1]=0),new Ot(gr[0],gr[1],rn[0]-gr[0],rn[1]-gr[1])},e.prototype._calculateLength=function(){var t=this.data,r=this._len,n=this._ux,i=this._uy,a=0,o=0,s=0,l=0;this._pathSegLen||(this._pathSegLen=[]);for(var u=this._pathSegLen,f=0,c=0,v=0;v<r;){var h=t[v++],d=v===1;d&&(a=t[v],o=t[v+1],s=a,l=o);var p=-1;switch(h){case At.M:a=s=t[v++],o=l=t[v++];break;case At.L:{var g=t[v++],m=t[v++],y=g-a,_=m-o;(Lr(y)>n||Lr(_)>i||v===r-1)&&(p=Math.sqrt(y*y+_*_),a=g,o=m);break}case At.C:{var w=t[v++],S=t[v++],g=t[v++],m=t[v++],b=t[v++],x=t[v++];p=tI(a,o,w,S,g,m,b,x,10),a=b,o=x;break}case At.Q:{var w=t[v++],S=t[v++],g=t[v++],m=t[v++];p=nI(a,o,w,S,g,m,10),a=g,o=m;break}case At.A:var T=t[v++],C=t[v++],D=t[v++],P=t[v++],A=t[v++],L=t[v++],O=L+A;v+=1,t[v++],d&&(s=jn(A)*D+T,l=Kn(A)*P+C),p=Jf(D,P)*Qf(hn,Math.abs(L)),a=jn(O)*D+T,o=Kn(O)*P+C;break;case At.R:{s=a=t[v++],l=o=t[v++];var z=t[v++],N=t[v++];p=z*2+N*2;break}case At.Z:{var y=s-a,_=l-o;p=Math.sqrt(y*y+_*_),a=s,o=l;break}}p>=0&&(u[c++]=p,f+=p)}return this._pathLen=f,f},e.prototype.rebuildPath=function(t,r){var n=this.data,i=this._ux,a=this._uy,o=this._len,s,l,u,f,c,v,h=r<1,d,p,g=0,m=0,y,_=0,w,S;if(h&&(this._pathSegLen||this._calculateLength(),d=this._pathSegLen,p=this._pathLen,y=r*p,!y))return;t:for(var b=0;b<o;){var x=n[b++],T=b===1;switch(T&&(u=n[b],f=n[b+1],s=u,l=f),x!==At.L&&_>0&&(t.lineTo(w,S),_=0),x){case At.M:s=u=n[b++],l=f=n[b++],t.moveTo(u,f);break;case At.L:{c=n[b++],v=n[b++];var C=Lr(c-u),D=Lr(v-f);if(C>i||D>a){if(h){var P=d[m++];if(g+P>y){var A=(y-g)/P;t.lineTo(u*(1-A)+c*A,f*(1-A)+v*A);break t}g+=P}t.lineTo(c,v),u=c,f=v,_=0}else{var L=C*C+D*D;L>_&&(w=c,S=v,_=L)}break}case At.C:{var O=n[b++],z=n[b++],N=n[b++],tt=n[b++],V=n[b++],K=n[b++];if(h){var P=d[m++];if(g+P>y){var A=(y-g)/P;Kl(u,O,N,V,A,qn),Kl(f,z,tt,K,A,Xn),t.bezierCurveTo(qn[1],Xn[1],qn[2],Xn[2],qn[3],Xn[3]);break t}g+=P}t.bezierCurveTo(O,z,N,tt,V,K),u=V,f=K;break}case At.Q:{var O=n[b++],z=n[b++],N=n[b++],tt=n[b++];if(h){var P=d[m++];if(g+P>y){var A=(y-g)/P;Zl(u,O,N,A,qn),Zl(f,z,tt,A,Xn),t.quadraticCurveTo(qn[1],Xn[1],qn[2],Xn[2]);break t}g+=P}t.quadraticCurveTo(O,z,N,tt),u=N,f=tt;break}case At.A:var lt=n[b++],yt=n[b++],ut=n[b++],ht=n[b++],bt=n[b++],k=n[b++],G=n[b++],$=!n[b++],Q=ut>ht?ut:ht,vt=Lr(ut-ht)>.001,ft=bt+k,X=!1;if(h){var P=d[m++];g+P>y&&(ft=bt+k*(y-g)/P,X=!0),g+=P}if(vt&&t.ellipse?t.ellipse(lt,yt,ut,ht,G,bt,ft,$):t.arc(lt,yt,Q,bt,ft,$),X)break t;T&&(s=jn(bt)*ut+lt,l=Kn(bt)*ht+yt),u=jn(ft)*ut+lt,f=Kn(ft)*ht+yt;break;case At.R:s=u=n[b],l=f=n[b+1],c=n[b++],v=n[b++];var j=n[b++],M=n[b++];if(h){var P=d[m++];if(g+P>y){var E=y-g;t.moveTo(c,v),t.lineTo(c+Qf(E,j),v),E-=j,E>0&&t.lineTo(c+j,v+Qf(E,M)),E-=M,E>0&&t.lineTo(c+Jf(j-E,0),v+M),E-=j,E>0&&t.lineTo(c,v+Jf(M-E,0));break t}g+=P}t.rect(c,v,j,M);break;case At.Z:if(h){var P=d[m++];if(g+P>y){var A=(y-g)/P;t.lineTo(u*(1-A)+s*A,f*(1-A)+l*A);break t}g+=P}t.closePath(),u=s,f=l}}},e.prototype.clone=function(){var t=new e,r=this.data;return t.data=r.slice?r.slice():Array.prototype.slice.call(r),t._len=this._len,t},e.CMD=At,e.initDefaultProps=function(){var t=e.prototype;t._saveData=!0,t._ux=0,t._uy=0,t._pendingPtDist=0,t._version=0}(),e}(),On=$E;function Gi(e,t,r,n,i,a,o){if(i===0)return!1;var s=i,l=0,u=e;if(o>t+s&&o>n+s||o<t-s&&o<n-s||a>e+s&&a>r+s||a<e-s&&a<r-s)return!1;if(e!==r)l=(t-n)/(e-r),u=(e*n-r*t)/(e-r);else return Math.abs(a-e)<=s/2;var f=l*a-o+u,c=f*f/(l*l+1);return c<=s/2*s/2}function VE(e,t,r,n,i,a,o,s,l,u,f){if(l===0)return!1;var c=l;if(f>t+c&&f>n+c&&f>a+c&&f>s+c||f<t-c&&f<n-c&&f<a-c&&f<s-c||u>e+c&&u>r+c&&u>i+c&&u>o+c||u<e-c&&u<r-c&&u<i-c&&u<o-c)return!1;var v=JP(e,t,r,n,i,a,o,s,u,f,null);return v<=c/2}function GE(e,t,r,n,i,a,o,s,l){if(o===0)return!1;var u=o;if(l>t+u&&l>n+u&&l>a+u||l<t-u&&l<n-u&&l<a-u||s>e+u&&s>r+u&&s>i+u||s<e-u&&s<r-u&&s<i-u)return!1;var f=rI(e,t,r,n,i,a,s,l,null);return f<=u/2}var um=Math.PI*2;function Us(e){return e%=um,e<0&&(e+=um),e}var Ka=Math.PI*2;function UE(e,t,r,n,i,a,o,s,l){if(o===0)return!1;var u=o;s-=e,l-=t;var f=Math.sqrt(s*s+l*l);if(f-u>r||f+u<r)return!1;if(Math.abs(n-i)%Ka<1e-4)return!0;if(a){var c=n;n=Us(i),i=Us(c)}else n=Us(n),i=Us(i);n>i&&(i+=Ka);var v=Math.atan2(l,s);return v<0&&(v+=Ka),v>=n&&v<=i||v+Ka>=n&&v+Ka<=i}function Zn(e,t,r,n,i,a){if(a>t&&a>n||a<t&&a<n||n===t)return 0;var o=(a-t)/(n-t),s=n<t?1:-1;(o===1||o===0)&&(s=n<t?.5:-.5);var l=o*(r-e)+e;return l===i?1/0:l>i?s:0}var nn=On.CMD,Qn=Math.PI*2,WE=1e-4;function YE(e,t){return Math.abs(e-t)<WE}var pe=[-1,-1,-1],Ye=[-1,-1];function qE(){var e=Ye[0];Ye[0]=Ye[1],Ye[1]=e}function XE(e,t,r,n,i,a,o,s,l,u){if(u>t&&u>n&&u>a&&u>s||u<t&&u<n&&u<a&&u<s)return 0;var f=jl(t,n,a,s,u,pe);if(f===0)return 0;for(var c=0,v=-1,h=void 0,d=void 0,p=0;p<f;p++){var g=pe[p],m=g===0||g===1?.5:1,y=Kt(e,r,i,o,g);y<l||(v<0&&(v=Z1(t,n,a,s,Ye),Ye[1]<Ye[0]&&v>1&&qE(),h=Kt(t,n,a,s,Ye[0]),v>1&&(d=Kt(t,n,a,s,Ye[1]))),v===2?g<Ye[0]?c+=h<t?m:-m:g<Ye[1]?c+=d<h?m:-m:c+=s<d?m:-m:g<Ye[0]?c+=h<t?m:-m:c+=s<h?m:-m)}return c}function jE(e,t,r,n,i,a,o,s){if(s>t&&s>n&&s>a||s<t&&s<n&&s<a)return 0;var l=eI(t,n,a,s,pe);if(l===0)return 0;var u=Q1(t,n,a);if(u>=0&&u<=1){for(var f=0,c=le(t,n,a,u),v=0;v<l;v++){var h=pe[v]===0||pe[v]===1?.5:1,d=le(e,r,i,pe[v]);d<o||(pe[v]<u?f+=c<t?h:-h:f+=a<c?h:-h)}return f}else{var h=pe[0]===0||pe[0]===1?.5:1,d=le(e,r,i,pe[0]);return d<o?0:a<t?h:-h}}function KE(e,t,r,n,i,a,o,s){if(s-=t,s>r||s<-r)return 0;var l=Math.sqrt(r*r-s*s);pe[0]=-l,pe[1]=l;var u=Math.abs(n-i);if(u<1e-4)return 0;if(u>=Qn-1e-4){n=0,i=Qn;var f=a?1:-1;return o>=pe[0]+e&&o<=pe[1]+e?f:0}if(n>i){var c=n;n=i,i=c}n<0&&(n+=Qn,i+=Qn);for(var v=0,h=0;h<2;h++){var d=pe[h];if(d+e>o){var p=Math.atan2(s,d),f=a?1:-1;p<0&&(p=Qn+p),(p>=n&&p<=i||p+Qn>=n&&p+Qn<=i)&&(p>Math.PI/2&&p<Math.PI*1.5&&(f=-f),v+=f)}}return v}function Tw(e,t,r,n,i){for(var a=e.data,o=e.len(),s=0,l=0,u=0,f=0,c=0,v,h,d=0;d<o;){var p=a[d++],g=d===1;switch(p===nn.M&&d>1&&(r||(s+=Zn(l,u,f,c,n,i))),g&&(l=a[d],u=a[d+1],f=l,c=u),p){case nn.M:f=a[d++],c=a[d++],l=f,u=c;break;case nn.L:if(r){if(Gi(l,u,a[d],a[d+1],t,n,i))return!0}else s+=Zn(l,u,a[d],a[d+1],n,i)||0;l=a[d++],u=a[d++];break;case nn.C:if(r){if(VE(l,u,a[d++],a[d++],a[d++],a[d++],a[d],a[d+1],t,n,i))return!0}else s+=XE(l,u,a[d++],a[d++],a[d++],a[d++],a[d],a[d+1],n,i)||0;l=a[d++],u=a[d++];break;case nn.Q:if(r){if(GE(l,u,a[d++],a[d++],a[d],a[d+1],t,n,i))return!0}else s+=jE(l,u,a[d++],a[d++],a[d],a[d+1],n,i)||0;l=a[d++],u=a[d++];break;case nn.A:var m=a[d++],y=a[d++],_=a[d++],w=a[d++],S=a[d++],b=a[d++];d+=1;var x=!!(1-a[d++]);v=Math.cos(S)*_+m,h=Math.sin(S)*w+y,g?(f=v,c=h):s+=Zn(l,u,v,h,n,i);var T=(n-m)*w/_+m;if(r){if(UE(m,y,w,S,S+b,x,t,T,i))return!0}else s+=KE(m,y,w,S,S+b,x,T,i);l=Math.cos(S+b)*_+m,u=Math.sin(S+b)*w+y;break;case nn.R:f=l=a[d++],c=u=a[d++];var C=a[d++],D=a[d++];if(v=f+C,h=c+D,r){if(Gi(f,c,v,c,t,n,i)||Gi(v,c,v,h,t,n,i)||Gi(v,h,f,h,t,n,i)||Gi(f,h,f,c,t,n,i))return!0}else s+=Zn(v,c,v,h,n,i),s+=Zn(f,h,f,c,n,i);break;case nn.Z:if(r){if(Gi(l,u,f,c,t,n,i))return!0}else s+=Zn(l,u,f,c,n,i);l=f,u=c;break}}return!r&&!YE(u,c)&&(s+=Zn(l,u,f,c,n,i)||0),s!==0}function ZE(e,t,r){return Tw(e,0,!1,t,r)}function QE(e,t,r,n){return Tw(e,t,!0,r,n)}var Cw=Pt({fill:\"#000\",stroke:null,strokePercent:1,fillOpacity:1,strokeOpacity:1,lineDashOffset:0,lineWidth:1,lineCap:\"butt\",miterLimit:10,strokeNoScale:!1,strokeFirst:!1},gi),JE={style:Pt({fill:!0,stroke:!0,strokePercent:!0,fillOpacity:!0,strokeOpacity:!0,lineDashOffset:!0,lineWidth:!0,miterLimit:!0},Vu.style)},rc=Jo.concat([\"invisible\",\"culling\",\"z\",\"z2\",\"zlevel\",\"parent\"]),tL=function(e){J(t,e);function t(r){return e.call(this,r)||this}return t.prototype.update=function(){var r=this;e.prototype.update.call(this);var n=this.style;if(n.decal){var i=this._decalEl=this._decalEl||new t;i.buildPath===t.prototype.buildPath&&(i.buildPath=function(l){r.buildPath(l,r.shape)}),i.silent=!0;var a=i.style;for(var o in n)a[o]!==n[o]&&(a[o]=n[o]);a.fill=n.fill?n.decal:null,a.decal=null,a.shadowColor=null,n.strokeFirst&&(a.stroke=null);for(var s=0;s<rc.length;++s)i[rc[s]]=this[rc[s]];i.__dirty|=Le}else this._decalEl&&(this._decalEl=null)},t.prototype.getDecalElement=function(){return this._decalEl},t.prototype._init=function(r){var n=Gt(r);this.shape=this.getDefaultShape();var i=this.getDefaultStyle();i&&this.useStyle(i);for(var a=0;a<n.length;a++){var o=n[a],s=r[o];o===\"style\"?this.style?Y(this.style,s):this.useStyle(s):o===\"shape\"?Y(this.shape,s):e.prototype.attrKV.call(this,o,s)}this.style||this.useStyle({})},t.prototype.getDefaultStyle=function(){return null},t.prototype.getDefaultShape=function(){return{}},t.prototype.canBeInsideText=function(){return this.hasFill()},t.prototype.getInsideTextFill=function(){var r=this.style.fill;if(r!==\"none\"){if(it(r)){var n=Jl(r,0);return n>.5?Ih:n>.2?DI:Eh}else if(r)return Eh}return Ih},t.prototype.getInsideTextStroke=function(r){var n=this.style.fill;if(it(n)){var i=this.__zr,a=!!(i&&i.isDarkMode()),o=Jl(r,0)<Ph;if(a===o)return n}},t.prototype.buildPath=function(r,n,i){},t.prototype.pathUpdated=function(){this.__dirty&=~ra},t.prototype.getUpdatedPathProxy=function(r){return!this.path&&this.createPathProxy(),this.path.beginPath(),this.buildPath(this.path,this.shape,r),this.path},t.prototype.createPathProxy=function(){this.path=new On(!1)},t.prototype.hasStroke=function(){var r=this.style,n=r.stroke;return!(n==null||n===\"none\"||!(r.lineWidth>0))},t.prototype.hasFill=function(){var r=this.style,n=r.fill;return n!=null&&n!==\"none\"},t.prototype.getBoundingRect=function(){var r=this._rect,n=this.style,i=!r;if(i){var a=!1;this.path||(a=!0,this.createPathProxy());var o=this.path;(a||this.__dirty&ra)&&(o.beginPath(),this.buildPath(o,this.shape,!1),this.pathUpdated()),r=o.getBoundingRect()}if(this._rect=r,this.hasStroke()&&this.path&&this.path.len()>0){var s=this._rectStroke||(this._rectStroke=r.clone());if(this.__dirty||i){s.copy(r);var l=n.strokeNoScale?this.getLineScale():1,u=n.lineWidth;if(!this.hasFill()){var f=this.strokeContainThreshold;u=Math.max(u,f==null?4:f)}l>1e-10&&(s.width+=u/l,s.height+=u/l,s.x-=u/l/2,s.y-=u/l/2)}return s}return r},t.prototype.contain=function(r,n){var i=this.transformCoordToLocal(r,n),a=this.getBoundingRect(),o=this.style;if(r=i[0],n=i[1],a.contain(r,n)){var s=this.path;if(this.hasStroke()){var l=o.lineWidth,u=o.strokeNoScale?this.getLineScale():1;if(u>1e-10&&(this.hasFill()||(l=Math.max(l,this.strokeContainThreshold)),QE(s,l/u,r,n)))return!0}if(this.hasFill())return ZE(s,r,n)}return!1},t.prototype.dirtyShape=function(){this.__dirty|=ra,this._rect&&(this._rect=null),this._decalEl&&this._decalEl.dirtyShape(),this.markRedraw()},t.prototype.dirty=function(){this.dirtyStyle(),this.dirtyShape()},t.prototype.animateShape=function(r){return this.animate(\"shape\",r)},t.prototype.updateDuringAnimation=function(r){r===\"style\"?this.dirtyStyle():r===\"shape\"?this.dirtyShape():this.markRedraw()},t.prototype.attrKV=function(r,n){r===\"shape\"?this.setShape(n):e.prototype.attrKV.call(this,r,n)},t.prototype.setShape=function(r,n){var i=this.shape;return i||(i=this.shape={}),typeof r==\"string\"?i[r]=n:Y(i,r),this.dirtyShape(),this},t.prototype.shapeChanged=function(){return!!(this.__dirty&ra)},t.prototype.createStyle=function(r){return Fu(Cw,r)},t.prototype._innerSaveToNormal=function(r){e.prototype._innerSaveToNormal.call(this,r);var n=this._normalState;r.shape&&!n.shape&&(n.shape=Y({},this.shape))},t.prototype._applyStateObj=function(r,n,i,a,o,s){e.prototype._applyStateObj.call(this,r,n,i,a,o,s);var l=!(n&&a),u;if(n&&n.shape?o?a?u=n.shape:(u=Y({},i.shape),Y(u,n.shape)):(u=Y({},a?this.shape:i.shape),Y(u,n.shape)):l&&(u=i.shape),u)if(o){this.shape=Y({},this.shape);for(var f={},c=Gt(u),v=0;v<c.length;v++){var h=c[v];typeof u[h]==\"object\"?this.shape[h]=u[h]:f[h]=u[h]}this._transitionState(r,{shape:f},s)}else this.shape=u,this.dirtyShape()},t.prototype._mergeStates=function(r){for(var n=e.prototype._mergeStates.call(this,r),i,a=0;a<r.length;a++){var o=r[a];o.shape&&(i=i||{},this._mergeStyle(i,o.shape))}return i&&(n.shape=i),n},t.prototype.getAnimationStyleProps=function(){return JE},t.prototype.isZeroArea=function(){return!1},t.extend=function(r){var n=function(a){J(o,a);function o(s){var l=a.call(this,s)||this;return r.init&&r.init.call(l,s),l}return o.prototype.getDefaultStyle=function(){return xt(r.style)},o.prototype.getDefaultShape=function(){return xt(r.shape)},o}(t);for(var i in r)typeof r[i]==\"function\"&&(n.prototype[i]=r[i]);return n},t.initDefaultProps=function(){var r=t.prototype;r.type=\"path\",r.strokeContainThreshold=5,r.segmentIgnoreThreshold=0,r.subPixelOptimize=!1,r.autoBatch=!1,r.__dirty=Le|ho|ra}(),t}(_s),kt=tL,eL=Pt({strokeFirst:!0,font:bi,x:0,y:0,textAlign:\"left\",textBaseline:\"top\",miterLimit:2},Cw),Mw=function(e){J(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.hasStroke=function(){var r=this.style,n=r.stroke;return n!=null&&n!==\"none\"&&r.lineWidth>0},t.prototype.hasFill=function(){var r=this.style,n=r.fill;return n!=null&&n!==\"none\"},t.prototype.createStyle=function(r){return Fu(eL,r)},t.prototype.setBoundingRect=function(r){this._rect=r},t.prototype.getBoundingRect=function(){var r=this.style;if(!this._rect){var n=r.text;n!=null?n+=\"\":n=\"\";var i=gd(n,r.font,r.textAlign,r.textBaseline);if(i.x+=r.x||0,i.y+=r.y||0,this.hasStroke()){var a=r.lineWidth;i.x-=a/2,i.y-=a/2,i.width+=a,i.height+=a}this._rect=i}return this._rect},t.initDefaultProps=function(){var r=t.prototype;r.dirtyRectTolerance=10}(),t}(_s);Mw.prototype.type=\"tspan\";var Fh=Mw,rL=Pt({x:0,y:0},gi),nL={style:Pt({x:!0,y:!0,width:!0,height:!0,sx:!0,sy:!0,sWidth:!0,sHeight:!0},Vu.style)};function iL(e){return!!(e&&typeof e!=\"string\"&&e.width&&e.height)}var Aw=function(e){J(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.createStyle=function(r){return Fu(rL,r)},t.prototype._getSize=function(r){var n=this.style,i=n[r];if(i!=null)return i;var a=iL(n.image)?n.image:this.__image;if(!a)return 0;var o=r===\"width\"?\"height\":\"width\",s=n[o];return s==null?a[r]:a[r]/a[o]*s},t.prototype.getWidth=function(){return this._getSize(\"width\")},t.prototype.getHeight=function(){return this._getSize(\"height\")},t.prototype.getAnimationStyleProps=function(){return nL},t.prototype.getBoundingRect=function(){var r=this.style;return this._rect||(this._rect=new Ot(r.x||0,r.y||0,this.getWidth(),this.getHeight())),this._rect},t}(_s);Aw.prototype.type=\"image\";var Ii=Aw;function aL(e,t){var r=t.x,n=t.y,i=t.width,a=t.height,o=t.r,s,l,u,f;i<0&&(r=r+i,i=-i),a<0&&(n=n+a,a=-a),typeof o==\"number\"?s=l=u=f=o:o instanceof Array?o.length===1?s=l=u=f=o[0]:o.length===2?(s=u=o[0],l=f=o[1]):o.length===3?(s=o[0],l=f=o[1],u=o[2]):(s=o[0],l=o[1],u=o[2],f=o[3]):s=l=u=f=0;var c;s+l>i&&(c=s+l,s*=i/c,l*=i/c),u+f>i&&(c=u+f,u*=i/c,f*=i/c),l+u>a&&(c=l+u,l*=a/c,u*=a/c),s+f>a&&(c=s+f,s*=a/c,f*=a/c),e.moveTo(r+s,n),e.lineTo(r+i-l,n),l!==0&&e.arc(r+i-l,n+l,l,-Math.PI/2,0),e.lineTo(r+i,n+a-u),u!==0&&e.arc(r+i-u,n+a-u,u,0,Math.PI/2),e.lineTo(r+f,n+a),f!==0&&e.arc(r+f,n+a-f,f,Math.PI/2,Math.PI),e.lineTo(r,n+s),s!==0&&e.arc(r+s,n+s,s,Math.PI,Math.PI*1.5)}var sa=Math.round;function Dw(e,t,r){if(!!t){var n=t.x1,i=t.x2,a=t.y1,o=t.y2;e.x1=n,e.x2=i,e.y1=a,e.y2=o;var s=r&&r.lineWidth;return s&&(sa(n*2)===sa(i*2)&&(e.x1=e.x2=vi(n,s,!0)),sa(a*2)===sa(o*2)&&(e.y1=e.y2=vi(a,s,!0))),e}}function Pw(e,t,r){if(!!t){var n=t.x,i=t.y,a=t.width,o=t.height;e.x=n,e.y=i,e.width=a,e.height=o;var s=r&&r.lineWidth;return s&&(e.x=vi(n,s,!0),e.y=vi(i,s,!0),e.width=Math.max(vi(n+a,s,!1)-e.x,a===0?0:1),e.height=Math.max(vi(i+o,s,!1)-e.y,o===0?0:1)),e}}function vi(e,t,r){if(!t)return e;var n=sa(e*2);return(n+sa(t))%2===0?n/2:(n+(r?1:-1))/2}var oL=function(){function e(){this.x=0,this.y=0,this.width=0,this.height=0}return e}(),sL={},Iw=function(e){J(t,e);function t(r){return e.call(this,r)||this}return t.prototype.getDefaultShape=function(){return new oL},t.prototype.buildPath=function(r,n){var i,a,o,s;if(this.subPixelOptimize){var l=Pw(sL,n,this.style);i=l.x,a=l.y,o=l.width,s=l.height,l.r=n.r,n=l}else i=n.x,a=n.y,o=n.width,s=n.height;n.r?aL(r,n):r.rect(i,a,o,s)},t.prototype.isZeroArea=function(){return!this.shape.width||!this.shape.height},t}(kt);Iw.prototype.type=\"rect\";var ne=Iw,fm={fill:\"#000\"},cm=2,lL={style:Pt({fill:!0,stroke:!0,fillOpacity:!0,strokeOpacity:!0,lineWidth:!0,fontSize:!0,lineHeight:!0,width:!0,height:!0,textShadowColor:!0,textShadowBlur:!0,textShadowOffsetX:!0,textShadowOffsetY:!0,backgroundColor:!0,padding:!0,borderColor:!0,borderWidth:!0,borderRadius:!0},Vu.style)},Ew=function(e){J(t,e);function t(r){var n=e.call(this)||this;return n.type=\"text\",n._children=[],n._defaultStyle=fm,n.attr(r),n}return t.prototype.childrenRef=function(){return this._children},t.prototype.update=function(){e.prototype.update.call(this),this.styleChanged()&&this._updateSubTexts();for(var r=0;r<this._children.length;r++){var n=this._children[r];n.zlevel=this.zlevel,n.z=this.z,n.z2=this.z2,n.culling=this.culling,n.cursor=this.cursor,n.invisible=this.invisible}},t.prototype.updateTransform=function(){var r=this.innerTransformable;r?(r.updateTransform(),r.transform&&(this.transform=r.transform)):e.prototype.updateTransform.call(this)},t.prototype.getLocalTransform=function(r){var n=this.innerTransformable;return n?n.getLocalTransform(r):e.prototype.getLocalTransform.call(this,r)},t.prototype.getComputedTransform=function(){return this.__hostTarget&&(this.__hostTarget.getComputedTransform(),this.__hostTarget.updateInnerText(!0)),e.prototype.getComputedTransform.call(this)},t.prototype._updateSubTexts=function(){this._childCursor=0,vL(this.style),this.style.rich?this._updateRichTexts():this._updatePlainTexts(),this._children.length=this._childCursor,this.styleUpdated()},t.prototype.addSelfToZr=function(r){e.prototype.addSelfToZr.call(this,r);for(var n=0;n<this._children.length;n++)this._children[n].__zr=r},t.prototype.removeSelfFromZr=function(r){e.prototype.removeSelfFromZr.call(this,r);for(var n=0;n<this._children.length;n++)this._children[n].__zr=null},t.prototype.getBoundingRect=function(){if(this.styleChanged()&&this._updateSubTexts(),!this._rect){for(var r=new Ot(0,0,0,0),n=this._children,i=[],a=null,o=0;o<n.length;o++){var s=n[o],l=s.getBoundingRect(),u=s.getLocalTransform(i);u?(r.copy(l),r.applyTransform(u),a=a||r.clone(),a.union(r)):(a=a||l.clone(),a.union(l))}this._rect=a||r}return this._rect},t.prototype.setDefaultTextStyle=function(r){this._defaultStyle=r||fm},t.prototype.setTextContent=function(r){},t.prototype._mergeStyle=function(r,n){if(!n)return r;var i=n.rich,a=r.rich||i&&{};return Y(r,n),i&&a?(this._mergeRich(a,i),r.rich=a):a&&(r.rich=a),r},t.prototype._mergeRich=function(r,n){for(var i=Gt(n),a=0;a<i.length;a++){var o=i[a];r[o]=r[o]||{},Y(r[o],n[o])}},t.prototype.getAnimationStyleProps=function(){return lL},t.prototype._getOrCreateChild=function(r){var n=this._children[this._childCursor];return(!n||!(n instanceof r))&&(n=new r),this._children[this._childCursor++]=n,n.__zr=this.__zr,n.parent=this,n},t.prototype._updatePlainTexts=function(){var r=this.style,n=r.font||bi,i=r.padding,a=ym(r),o=AE(a,r),s=nc(r),l=!!r.backgroundColor,u=o.outerHeight,f=o.outerWidth,c=o.contentWidth,v=o.lines,h=o.lineHeight,d=this._defaultStyle,p=r.x||0,g=r.y||0,m=r.align||d.align||\"left\",y=r.verticalAlign||d.verticalAlign||\"top\",_=p,w=na(g,o.contentHeight,y);if(s||i){var S=po(p,f,m),b=na(g,u,y);s&&this._renderBackground(r,r,S,b,f,u)}w+=h/2,i&&(_=mm(p,m,i),y===\"top\"?w+=i[0]:y===\"bottom\"&&(w-=i[2]));for(var x=0,T=!1,C=gm(\"fill\"in r?r.fill:(T=!0,d.fill)),D=pm(\"stroke\"in r?r.stroke:!l&&(!d.autoStroke||T)?(x=cm,d.stroke):null),P=r.textShadowBlur>0,A=r.width!=null&&(r.overflow===\"truncate\"||r.overflow===\"break\"||r.overflow===\"breakAll\"),L=o.calculatedLineHeight,O=0;O<v.length;O++){var z=this._getOrCreateChild(Fh),N=z.createStyle();z.useStyle(N),N.text=v[O],N.x=_,N.y=w,m&&(N.textAlign=m),N.textBaseline=\"middle\",N.opacity=r.opacity,N.strokeFirst=!0,P&&(N.shadowBlur=r.textShadowBlur||0,N.shadowColor=r.textShadowColor||\"transparent\",N.shadowOffsetX=r.textShadowOffsetX||0,N.shadowOffsetY=r.textShadowOffsetY||0),N.stroke=D,N.fill=C,D&&(N.lineWidth=r.lineWidth||x,N.lineDash=r.lineDash,N.lineDashOffset=r.lineDashOffset||0),N.font=n,vm(N,r),w+=h,A&&z.setBoundingRect(new Ot(po(N.x,r.width,N.textAlign),na(N.y,L,N.textBaseline),c,L))}},t.prototype._updateRichTexts=function(){var r=this.style,n=ym(r),i=IE(n,r),a=i.width,o=i.outerWidth,s=i.outerHeight,l=r.padding,u=r.x||0,f=r.y||0,c=this._defaultStyle,v=r.align||c.align,h=r.verticalAlign||c.verticalAlign,d=po(u,o,v),p=na(f,s,h),g=d,m=p;l&&(g+=l[3],m+=l[0]);var y=g+a;nc(r)&&this._renderBackground(r,r,d,p,o,s);for(var _=!!r.backgroundColor,w=0;w<i.lines.length;w++){for(var S=i.lines[w],b=S.tokens,x=b.length,T=S.lineHeight,C=S.width,D=0,P=g,A=y,L=x-1,O=void 0;D<x&&(O=b[D],!O.align||O.align===\"left\");)this._placeToken(O,r,T,m,P,\"left\",_),C-=O.width,P+=O.width,D++;for(;L>=0&&(O=b[L],O.align===\"right\");)this._placeToken(O,r,T,m,A,\"right\",_),C-=O.width,A-=O.width,L--;for(P+=(a-(P-g)-(y-A)-C)/2;D<=L;)O=b[D],this._placeToken(O,r,T,m,P+O.width/2,\"center\",_),P+=O.width,D++;m+=T}},t.prototype._placeToken=function(r,n,i,a,o,s,l){var u=n.rich[r.styleName]||{};u.text=r.text;var f=r.verticalAlign,c=a+i/2;f===\"top\"?c=a+r.height/2:f===\"bottom\"&&(c=a+i-r.height/2);var v=!r.isLineHolder&&nc(u);v&&this._renderBackground(u,n,s===\"right\"?o-r.width:s===\"center\"?o-r.width/2:o,c-r.height/2,r.width,r.height);var h=!!u.backgroundColor,d=r.textPadding;d&&(o=mm(o,s,d),c-=r.height/2-d[0]-r.innerHeight/2);var p=this._getOrCreateChild(Fh),g=p.createStyle();p.useStyle(g);var m=this._defaultStyle,y=!1,_=0,w=gm(\"fill\"in u?u.fill:\"fill\"in n?n.fill:(y=!0,m.fill)),S=pm(\"stroke\"in u?u.stroke:\"stroke\"in n?n.stroke:!h&&!l&&(!m.autoStroke||y)?(_=cm,m.stroke):null),b=u.textShadowBlur>0||n.textShadowBlur>0;g.text=r.text,g.x=o,g.y=c,b&&(g.shadowBlur=u.textShadowBlur||n.textShadowBlur||0,g.shadowColor=u.textShadowColor||n.textShadowColor||\"transparent\",g.shadowOffsetX=u.textShadowOffsetX||n.textShadowOffsetX||0,g.shadowOffsetY=u.textShadowOffsetY||n.textShadowOffsetY||0),g.textAlign=s,g.textBaseline=\"middle\",g.font=r.font||bi,g.opacity=Do(u.opacity,n.opacity,1),vm(g,u),S&&(g.lineWidth=Do(u.lineWidth,n.lineWidth,_),g.lineDash=Mt(u.lineDash,n.lineDash),g.lineDashOffset=n.lineDashOffset||0,g.stroke=S),w&&(g.fill=w);var x=r.contentWidth,T=r.contentHeight;p.setBoundingRect(new Ot(po(g.x,x,g.textAlign),na(g.y,T,g.textBaseline),x,T))},t.prototype._renderBackground=function(r,n,i,a,o,s){var l=r.backgroundColor,u=r.borderWidth,f=r.borderColor,c=l&&l.image,v=l&&!c,h=r.borderRadius,d=this,p,g;if(v||r.lineHeight||u&&f){p=this._getOrCreateChild(ne),p.useStyle(p.createStyle()),p.style.fill=null;var m=p.shape;m.x=i,m.y=a,m.width=o,m.height=s,m.r=h,p.dirtyShape()}if(v){var y=p.style;y.fill=l||null,y.fillOpacity=Mt(r.fillOpacity,1)}else if(c){g=this._getOrCreateChild(Ii),g.onload=function(){d.dirtyStyle()};var _=g.style;_.image=l.image,_.x=i,_.y=a,_.width=o,_.height=s}if(u&&f){var y=p.style;y.lineWidth=u,y.stroke=f,y.strokeOpacity=Mt(r.strokeOpacity,1),y.lineDash=r.borderDash,y.lineDashOffset=r.borderDashOffset||0,p.strokeContainThreshold=0,p.hasFill()&&p.hasStroke()&&(y.strokeFirst=!0,y.lineWidth*=2)}var w=(p||g).style;w.shadowBlur=r.shadowBlur||0,w.shadowColor=r.shadowColor||\"transparent\",w.shadowOffsetX=r.shadowOffsetX||0,w.shadowOffsetY=r.shadowOffsetY||0,w.opacity=Do(r.opacity,n.opacity,1)},t.makeFont=function(r){var n=\"\";return hL(r)&&(n=[r.fontStyle,r.fontWeight,cL(r.fontSize),r.fontFamily||\"sans-serif\"].join(\" \")),n&&Tr(n)||r.textFont||r.font},t}(_s),uL={left:!0,right:1,center:1},fL={top:1,bottom:1,middle:1},hm=[\"fontStyle\",\"fontWeight\",\"fontSize\",\"fontFamily\"];function cL(e){return typeof e==\"string\"&&(e.indexOf(\"px\")!==-1||e.indexOf(\"rem\")!==-1||e.indexOf(\"em\")!==-1)?e:isNaN(+e)?ad+\"px\":e+\"px\"}function vm(e,t){for(var r=0;r<hm.length;r++){var n=hm[r],i=t[n];i!=null&&(e[n]=i)}}function hL(e){return e.fontSize!=null||e.fontFamily||e.fontWeight}function vL(e){return dm(e),I(e.rich,dm),e}function dm(e){if(e){e.font=Ew.makeFont(e);var t=e.align;t===\"middle\"&&(t=\"center\"),e.align=t==null||uL[t]?t:\"left\";var r=e.verticalAlign;r===\"center\"&&(r=\"middle\"),e.verticalAlign=r==null||fL[r]?r:\"top\";var n=e.padding;n&&(e.padding=F1(e.padding))}}function pm(e,t){return e==null||t<=0||e===\"transparent\"||e===\"none\"?null:e.image||e.colorStops?\"#000\":e}function gm(e){return e==null||e===\"none\"?null:e.image||e.colorStops?\"#000\":e}function mm(e,t,r){return t===\"right\"?e-r[1]:t===\"center\"?e+r[3]/2-r[1]/2:e+r[3]}function ym(e){var t=e.text;return t!=null&&(t+=\"\"),t}function nc(e){return!!(e.backgroundColor||e.lineHeight||e.borderWidth&&e.borderColor)}var he=Ew,Nt=Qt(),dL=function(e,t,r,n){if(n){var i=Nt(n);i.dataIndex=r,i.dataType=t,i.seriesIndex=e,n.type===\"group\"&&n.traverse(function(a){var o=Nt(a);o.seriesIndex=e,o.dataIndex=r,o.dataType=t})}},_m=1,wm={},Lw=Qt(),xd=Qt(),Td=0,Gu=1,Uu=2,er=[\"emphasis\",\"blur\",\"select\"],nu=[\"normal\",\"emphasis\",\"blur\",\"select\"],pL=10,gL=9,mi=\"highlight\",Il=\"downplay\",Eo=\"select\",El=\"unselect\",Lo=\"toggleSelect\";function Ui(e){return e!=null&&e!==\"none\"}var bm=new gs(100);function Sm(e){if(it(e)){var t=bm.get(e);return t||(t=$g(e,-.1),bm.put(e,t)),t}else if(Bu(e)){var r=Y({},e);return r.colorStops=ct(e.colorStops,function(n){return{offset:n.offset,color:$g(n.color,-.1)}}),r}return e}function Wu(e,t,r){e.onHoverStateChange&&(e.hoverState||0)!==r&&e.onHoverStateChange(t),e.hoverState=r}function Rw(e){Wu(e,\"emphasis\",Uu)}function Ow(e){e.hoverState===Uu&&Wu(e,\"normal\",Td)}function Cd(e){Wu(e,\"blur\",Gu)}function kw(e){e.hoverState===Gu&&Wu(e,\"normal\",Td)}function mL(e){e.selected=!0}function yL(e){e.selected=!1}function xm(e,t,r){t(e,r)}function jr(e,t,r){xm(e,t,r),e.isGroup&&e.traverse(function(n){xm(n,t,r)})}function Tm(e,t){switch(t){case\"emphasis\":e.hoverState=Uu;break;case\"normal\":e.hoverState=Td;break;case\"blur\":e.hoverState=Gu;break;case\"select\":e.selected=!0}}function _L(e,t,r,n){for(var i=e.style,a={},o=0;o<t.length;o++){var s=t[o],l=i[s];a[s]=l==null?n&&n[s]:l}for(var o=0;o<e.animators.length;o++){var u=e.animators[o];u.__fromStateTransition&&u.__fromStateTransition.indexOf(r)<0&&u.targetName===\"style\"&&u.saveTo(a,t)}return a}function wL(e,t,r,n){var i=r&&It(r,\"select\")>=0,a=!1;if(e instanceof kt){var o=Lw(e),s=i&&o.selectFill||o.normalFill,l=i&&o.selectStroke||o.normalStroke;if(Ui(s)||Ui(l)){n=n||{};var u=n.style||{};u.fill===\"inherit\"?(a=!0,n=Y({},n),u=Y({},u),u.fill=s):!Ui(u.fill)&&Ui(s)?(a=!0,n=Y({},n),u=Y({},u),u.fill=Sm(s)):!Ui(u.stroke)&&Ui(l)&&(a||(n=Y({},n),u=Y({},u)),u.stroke=Sm(l)),n.style=u}}if(n&&n.z2==null){a||(n=Y({},n));var f=e.z2EmphasisLift;n.z2=e.z2+(f!=null?f:pL)}return n}function bL(e,t,r){if(r&&r.z2==null){r=Y({},r);var n=e.z2SelectLift;r.z2=e.z2+(n!=null?n:gL)}return r}function SL(e,t,r){var n=It(e.currentStates,t)>=0,i=e.style.opacity,a=n?null:_L(e,[\"opacity\"],t,{opacity:1});r=r||{};var o=r.style||{};return o.opacity==null&&(r=Y({},r),o=Y({opacity:n?i:a.opacity*.1},o),r.style=o),r}function ic(e,t){var r=this.states[e];if(this.style){if(e===\"emphasis\")return wL(this,e,t,r);if(e===\"blur\")return SL(this,e,r);if(e===\"select\")return bL(this,e,r)}return r}function xL(e){e.stateProxy=ic;var t=e.getTextContent(),r=e.getTextGuideLine();t&&(t.stateProxy=ic),r&&(r.stateProxy=ic)}function Cm(e,t){!zw(e,t)&&!e.__highByOuter&&jr(e,Rw)}function Mm(e,t){!zw(e,t)&&!e.__highByOuter&&jr(e,Ow)}function iu(e,t){e.__highByOuter|=1<<(t||0),jr(e,Rw)}function au(e,t){!(e.__highByOuter&=~(1<<(t||0)))&&jr(e,Ow)}function TL(e){jr(e,Cd)}function Nw(e){jr(e,kw)}function Bw(e){jr(e,mL)}function Fw(e){jr(e,yL)}function zw(e,t){return e.__highDownSilentOnTouch&&t.zrByTouch}function Hw(e){var t=e.getModel();t.eachComponent(function(r,n){var i=xd(n);if(i.isBlured){var a=r===\"series\"?e.getViewOfSeriesModel(n):e.getViewOfComponentModel(n);a.group.traverse(function(o){kw(o)})}i.isBlured=!1})}function zh(e,t,r,n){var i=n.getModel();r=r||\"coordinateSystem\";function a(u,f){for(var c=0;c<f.length;c++){var v=u.getItemGraphicEl(f[c]);v&&Nw(v)}}if(e!=null&&!(!t||t===\"none\")){var o=i.getSeriesByIndex(e),s=o.coordinateSystem;s&&s.master&&(s=s.master);var l=[];i.eachSeries(function(u){var f=o===u,c=u.coordinateSystem;c&&c.master&&(c=c.master);var v=c&&s?c===s:f;if(!(r===\"series\"&&!f||r===\"coordinateSystem\"&&!v||t===\"series\"&&f)){var h=n.getViewOfSeriesModel(u);if(h.group.traverse(function(g){Cd(g)}),Me(t))a(u.getData(),t);else if(st(t))for(var d=Gt(t),p=0;p<d.length;p++)a(u.getData(d[p]),t[d[p]]);l.push(u),xd(u).isBlured=!0}}),i.eachComponent(function(u,f){if(u!==\"series\"){var c=n.getViewOfComponentModel(f);c&&c.blurSeries&&c.blurSeries(l,i)}})}}function Hh(e,t,r){if(!(e==null||t==null)){var n=r.getModel().getComponent(e,t);if(!!n){xd(n).isBlured=!0;var i=r.getViewOfComponentModel(n);!i||!i.focusBlurEnabled||i.group.traverse(function(a){Cd(a)})}}}function CL(e,t,r){var n=e.seriesIndex,i=e.getData(t.dataType);if(!!i){var a=Si(i,t);a=(et(a)?a[0]:a)||0;var o=i.getItemGraphicEl(a);if(!o)for(var s=i.count(),l=0;!o&&l<s;)o=i.getItemGraphicEl(l++);if(o){var u=Nt(o);zh(n,u.focus,u.blurScope,r)}else{var f=e.get([\"emphasis\",\"focus\"]),c=e.get([\"emphasis\",\"blurScope\"]);f!=null&&zh(n,f,c,r)}}}function Md(e,t,r,n){var i={focusSelf:!1,dispatchers:null};if(e==null||e===\"series\"||t==null||r==null)return i;var a=n.getModel().getComponent(e,t);if(!a)return i;var o=n.getViewOfComponentModel(a);if(!o||!o.findHighDownDispatchers)return i;for(var s=o.findHighDownDispatchers(r),l,u=0;u<s.length;u++)if(Nt(s[u]).focus===\"self\"){l=!0;break}return{focusSelf:l,dispatchers:s}}function ML(e,t,r){var n=Nt(e),i=Md(n.componentMainType,n.componentIndex,n.componentHighDownName,r),a=i.dispatchers,o=i.focusSelf;a?(o&&Hh(n.componentMainType,n.componentIndex,r),I(a,function(s){return Cm(s,t)})):(zh(n.seriesIndex,n.focus,n.blurScope,r),n.focus===\"self\"&&Hh(n.componentMainType,n.componentIndex,r),Cm(e,t))}function AL(e,t,r){Hw(r);var n=Nt(e),i=Md(n.componentMainType,n.componentIndex,n.componentHighDownName,r).dispatchers;i?I(i,function(a){return Mm(a,t)}):Mm(e,t)}function DL(e,t,r){if(!!Uh(t)){var n=t.dataType,i=e.getData(n),a=Si(i,t);et(a)||(a=[a]),e[t.type===Lo?\"toggleSelect\":t.type===Eo?\"select\":\"unselect\"](a,n)}}function Am(e){var t=e.getAllData();I(t,function(r){var n=r.data,i=r.type;n.eachItemGraphicEl(function(a,o){e.isSelected(o,i)?Bw(a):Fw(a)})})}function PL(e){var t=[];return e.eachSeries(function(r){var n=r.getAllData();I(n,function(i){i.data;var a=i.type,o=r.getSelectedDataIndices();if(o.length>0){var s={dataIndex:o,seriesIndex:r.seriesIndex};a!=null&&(s.dataType=a),t.push(s)}})}),t}function $h(e,t,r){$w(e,!0),jr(e,xL),EL(e,t,r)}function IL(e){$w(e,!1)}function ou(e,t,r,n){n?IL(e):$h(e,t,r)}function EL(e,t,r){var n=Nt(e);t!=null?(n.focus=t,n.blurScope=r):n.focus&&(n.focus=null)}var Dm=[\"emphasis\",\"blur\",\"select\"],LL={itemStyle:\"getItemStyle\",lineStyle:\"getLineStyle\",areaStyle:\"getAreaStyle\"};function Vh(e,t,r,n){r=r||\"itemStyle\";for(var i=0;i<Dm.length;i++){var a=Dm[i],o=t.getModel([a,r]),s=e.ensureState(a);s.style=n?n(o):o[LL[r]]()}}function $w(e,t){var r=t===!1,n=e;e.highDownSilentOnTouch&&(n.__highDownSilentOnTouch=e.highDownSilentOnTouch),(!r||n.__highDownDispatcher)&&(n.__highByOuter=n.__highByOuter||0,n.__highDownDispatcher=!r)}function Gh(e){return!!(e&&e.__highDownDispatcher)}function RL(e){var t=wm[e];return t==null&&_m<=32&&(t=wm[e]=_m++),t}function Uh(e){var t=e.type;return t===Eo||t===El||t===Lo}function Pm(e){var t=e.type;return t===mi||t===Il}function OL(e){var t=Lw(e);t.normalFill=e.style.fill,t.normalStroke=e.style.stroke;var r=e.states.select||{};t.selectFill=r.style&&r.style.fill||null,t.selectStroke=r.style&&r.style.stroke||null}var Wi=On.CMD,kL=[[],[],[]],Im=Math.sqrt,NL=Math.atan2;function BL(e,t){if(!!t){var r=e.data,n=e.len(),i,a,o,s,l,u,f=Wi.M,c=Wi.C,v=Wi.L,h=Wi.R,d=Wi.A,p=Wi.Q;for(o=0,s=0;o<n;){switch(i=r[o++],s=o,a=0,i){case f:a=1;break;case v:a=1;break;case c:a=3;break;case p:a=2;break;case d:var g=t[4],m=t[5],y=Im(t[0]*t[0]+t[1]*t[1]),_=Im(t[2]*t[2]+t[3]*t[3]),w=NL(-t[1]/_,t[0]/y);r[o]*=y,r[o++]+=g,r[o]*=_,r[o++]+=m,r[o++]*=y,r[o++]*=_,r[o++]+=w,r[o++]+=w,o+=2,s=o;break;case h:u[0]=r[o++],u[1]=r[o++],tr(u,u,t),r[s++]=u[0],r[s++]=u[1],u[0]+=r[o++],u[1]+=r[o++],tr(u,u,t),r[s++]=u[0],r[s++]=u[1]}for(l=0;l<a;l++){var S=kL[l];S[0]=r[o++],S[1]=r[o++],tr(S,S,t),r[s++]=S[0],r[s++]=S[1]}}e.increaseVersion()}}var ac=Math.sqrt,Ws=Math.sin,Ys=Math.cos,Za=Math.PI;function Em(e){return Math.sqrt(e[0]*e[0]+e[1]*e[1])}function Wh(e,t){return(e[0]*t[0]+e[1]*t[1])/(Em(e)*Em(t))}function Lm(e,t){return(e[0]*t[1]<e[1]*t[0]?-1:1)*Math.acos(Wh(e,t))}function Rm(e,t,r,n,i,a,o,s,l,u,f){var c=l*(Za/180),v=Ys(c)*(e-r)/2+Ws(c)*(t-n)/2,h=-1*Ws(c)*(e-r)/2+Ys(c)*(t-n)/2,d=v*v/(o*o)+h*h/(s*s);d>1&&(o*=ac(d),s*=ac(d));var p=(i===a?-1:1)*ac((o*o*(s*s)-o*o*(h*h)-s*s*(v*v))/(o*o*(h*h)+s*s*(v*v)))||0,g=p*o*h/s,m=p*-s*v/o,y=(e+r)/2+Ys(c)*g-Ws(c)*m,_=(t+n)/2+Ws(c)*g+Ys(c)*m,w=Lm([1,0],[(v-g)/o,(h-m)/s]),S=[(v-g)/o,(h-m)/s],b=[(-1*v-g)/o,(-1*h-m)/s],x=Lm(S,b);if(Wh(S,b)<=-1&&(x=Za),Wh(S,b)>=1&&(x=0),x<0){var T=Math.round(x/Za*1e6)/1e6;x=Za*2+T%2*Za}f.addData(u,y,_,o,s,w,x,c,a)}var FL=/([mlvhzcqtsa])([^mlvhzcqtsa]*)/ig,zL=/-?([0-9]*\\.)?[0-9]+([eE]-?[0-9]+)?/g;function HL(e){var t=new On;if(!e)return t;var r=0,n=0,i=r,a=n,o,s=On.CMD,l=e.match(FL);if(!l)return t;for(var u=0;u<l.length;u++){for(var f=l[u],c=f.charAt(0),v=void 0,h=f.match(zL)||[],d=h.length,p=0;p<d;p++)h[p]=parseFloat(h[p]);for(var g=0;g<d;){var m=void 0,y=void 0,_=void 0,w=void 0,S=void 0,b=void 0,x=void 0,T=r,C=n,D=void 0,P=void 0;switch(c){case\"l\":r+=h[g++],n+=h[g++],v=s.L,t.addData(v,r,n);break;case\"L\":r=h[g++],n=h[g++],v=s.L,t.addData(v,r,n);break;case\"m\":r+=h[g++],n+=h[g++],v=s.M,t.addData(v,r,n),i=r,a=n,c=\"l\";break;case\"M\":r=h[g++],n=h[g++],v=s.M,t.addData(v,r,n),i=r,a=n,c=\"L\";break;case\"h\":r+=h[g++],v=s.L,t.addData(v,r,n);break;case\"H\":r=h[g++],v=s.L,t.addData(v,r,n);break;case\"v\":n+=h[g++],v=s.L,t.addData(v,r,n);break;case\"V\":n=h[g++],v=s.L,t.addData(v,r,n);break;case\"C\":v=s.C,t.addData(v,h[g++],h[g++],h[g++],h[g++],h[g++],h[g++]),r=h[g-2],n=h[g-1];break;case\"c\":v=s.C,t.addData(v,h[g++]+r,h[g++]+n,h[g++]+r,h[g++]+n,h[g++]+r,h[g++]+n),r+=h[g-2],n+=h[g-1];break;case\"S\":m=r,y=n,D=t.len(),P=t.data,o===s.C&&(m+=r-P[D-4],y+=n-P[D-3]),v=s.C,T=h[g++],C=h[g++],r=h[g++],n=h[g++],t.addData(v,m,y,T,C,r,n);break;case\"s\":m=r,y=n,D=t.len(),P=t.data,o===s.C&&(m+=r-P[D-4],y+=n-P[D-3]),v=s.C,T=r+h[g++],C=n+h[g++],r+=h[g++],n+=h[g++],t.addData(v,m,y,T,C,r,n);break;case\"Q\":T=h[g++],C=h[g++],r=h[g++],n=h[g++],v=s.Q,t.addData(v,T,C,r,n);break;case\"q\":T=h[g++]+r,C=h[g++]+n,r+=h[g++],n+=h[g++],v=s.Q,t.addData(v,T,C,r,n);break;case\"T\":m=r,y=n,D=t.len(),P=t.data,o===s.Q&&(m+=r-P[D-4],y+=n-P[D-3]),r=h[g++],n=h[g++],v=s.Q,t.addData(v,m,y,r,n);break;case\"t\":m=r,y=n,D=t.len(),P=t.data,o===s.Q&&(m+=r-P[D-4],y+=n-P[D-3]),r+=h[g++],n+=h[g++],v=s.Q,t.addData(v,m,y,r,n);break;case\"A\":_=h[g++],w=h[g++],S=h[g++],b=h[g++],x=h[g++],T=r,C=n,r=h[g++],n=h[g++],v=s.A,Rm(T,C,r,n,b,x,_,w,S,v,t);break;case\"a\":_=h[g++],w=h[g++],S=h[g++],b=h[g++],x=h[g++],T=r,C=n,r+=h[g++],n+=h[g++],v=s.A,Rm(T,C,r,n,b,x,_,w,S,v,t);break}}(c===\"z\"||c===\"Z\")&&(v=s.Z,t.addData(v),r=i,n=a),o=v}return t.toStatic(),t}var Vw=function(e){J(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.applyTransform=function(r){},t}(kt);function Gw(e){return e.setData!=null}function Uw(e,t){var r=HL(e),n=Y({},t);return n.buildPath=function(i){if(Gw(i)){i.setData(r.data);var a=i.getContext();a&&i.rebuildPath(a,1)}else{var a=i;r.rebuildPath(a,1)}},n.applyTransform=function(i){BL(r,i),this.dirtyShape()},n}function $L(e,t){return new Vw(Uw(e,t))}function VL(e,t){var r=Uw(e,t),n=function(i){J(a,i);function a(o){var s=i.call(this,o)||this;return s.applyTransform=r.applyTransform,s.buildPath=r.buildPath,s}return a}(Vw);return n}function GL(e,t){for(var r=[],n=e.length,i=0;i<n;i++){var a=e[i];r.push(a.getUpdatedPathProxy(!0))}var o=new kt(t);return o.createPathProxy(),o.buildPath=function(s){if(Gw(s)){s.appendPath(r);var l=s.getContext();l&&s.rebuildPath(l,1)}},o}var UL=function(){function e(){this.cx=0,this.cy=0,this.r=0}return e}(),Ww=function(e){J(t,e);function t(r){return e.call(this,r)||this}return t.prototype.getDefaultShape=function(){return new UL},t.prototype.buildPath=function(r,n){r.moveTo(n.cx+n.r,n.cy),r.arc(n.cx,n.cy,n.r,0,Math.PI*2)},t}(kt);Ww.prototype.type=\"circle\";var Ad=Ww,WL=function(){function e(){this.cx=0,this.cy=0,this.rx=0,this.ry=0}return e}(),Yw=function(e){J(t,e);function t(r){return e.call(this,r)||this}return t.prototype.getDefaultShape=function(){return new WL},t.prototype.buildPath=function(r,n){var i=.5522848,a=n.cx,o=n.cy,s=n.rx,l=n.ry,u=s*i,f=l*i;r.moveTo(a-s,o),r.bezierCurveTo(a-s,o-f,a-u,o-l,a,o-l),r.bezierCurveTo(a+u,o-l,a+s,o-f,a+s,o),r.bezierCurveTo(a+s,o+f,a+u,o+l,a,o+l),r.bezierCurveTo(a-u,o+l,a-s,o+f,a-s,o),r.closePath()},t}(kt);Yw.prototype.type=\"ellipse\";var qw=Yw,Xw=Math.PI,oc=Xw*2,Jn=Math.sin,Yi=Math.cos,YL=Math.acos,oe=Math.atan2,Om=Math.abs,Ro=Math.sqrt,go=Math.max,_r=Math.min,ar=1e-4;function qL(e,t,r,n,i,a,o,s){var l=r-e,u=n-t,f=o-i,c=s-a,v=c*l-f*u;if(!(v*v<ar))return v=(f*(t-a)-c*(e-i))/v,[e+v*l,t+v*u]}function qs(e,t,r,n,i,a,o){var s=e-r,l=t-n,u=(o?a:-a)/Ro(s*s+l*l),f=u*l,c=-u*s,v=e+f,h=t+c,d=r+f,p=n+c,g=(v+d)/2,m=(h+p)/2,y=d-v,_=p-h,w=y*y+_*_,S=i-a,b=v*p-d*h,x=(_<0?-1:1)*Ro(go(0,S*S*w-b*b)),T=(b*_-y*x)/w,C=(-b*y-_*x)/w,D=(b*_+y*x)/w,P=(-b*y+_*x)/w,A=T-g,L=C-m,O=D-g,z=P-m;return A*A+L*L>O*O+z*z&&(T=D,C=P),{cx:T,cy:C,x0:-f,y0:-c,x1:T*(i/S-1),y1:C*(i/S-1)}}function XL(e){var t;if(et(e)){var r=e.length;if(!r)return e;r===1?t=[e[0],e[0],0,0]:r===2?t=[e[0],e[0],e[1],e[1]]:r===3?t=e.concat(e[2]):t=e}else t=[e,e,e,e];return t}function jL(e,t){var r,n=go(t.r,0),i=go(t.r0||0,0),a=n>0,o=i>0;if(!(!a&&!o)){if(a||(n=i,i=0),i>n){var s=n;n=i,i=s}var l=t.startAngle,u=t.endAngle;if(!(isNaN(l)||isNaN(u))){var f=t.cx,c=t.cy,v=!!t.clockwise,h=Om(u-l),d=h>oc&&h%oc;if(d>ar&&(h=d),!(n>ar))e.moveTo(f,c);else if(h>oc-ar)e.moveTo(f+n*Yi(l),c+n*Jn(l)),e.arc(f,c,n,l,u,!v),i>ar&&(e.moveTo(f+i*Yi(u),c+i*Jn(u)),e.arc(f,c,i,u,l,v));else{var p=void 0,g=void 0,m=void 0,y=void 0,_=void 0,w=void 0,S=void 0,b=void 0,x=void 0,T=void 0,C=void 0,D=void 0,P=void 0,A=void 0,L=void 0,O=void 0,z=n*Yi(l),N=n*Jn(l),tt=i*Yi(u),V=i*Jn(u),K=h>ar;if(K){var lt=t.cornerRadius;lt&&(r=XL(lt),p=r[0],g=r[1],m=r[2],y=r[3]);var yt=Om(n-i)/2;if(_=_r(yt,m),w=_r(yt,y),S=_r(yt,p),b=_r(yt,g),C=x=go(_,w),D=T=go(S,b),(x>ar||T>ar)&&(P=n*Yi(u),A=n*Jn(u),L=i*Yi(l),O=i*Jn(l),h<Xw)){var ut=qL(z,N,L,O,P,A,tt,V);if(ut){var ht=z-ut[0],bt=N-ut[1],k=P-ut[0],G=A-ut[1],$=1/Jn(YL((ht*k+bt*G)/(Ro(ht*ht+bt*bt)*Ro(k*k+G*G)))/2),Q=Ro(ut[0]*ut[0]+ut[1]*ut[1]);C=_r(x,(n-Q)/($+1)),D=_r(T,(i-Q)/($-1))}}}if(!K)e.moveTo(f+z,c+N);else if(C>ar){var vt=_r(m,C),ft=_r(y,C),X=qs(L,O,z,N,n,vt,v),j=qs(P,A,tt,V,n,ft,v);e.moveTo(f+X.cx+X.x0,c+X.cy+X.y0),C<x&&vt===ft?e.arc(f+X.cx,c+X.cy,C,oe(X.y0,X.x0),oe(j.y0,j.x0),!v):(vt>0&&e.arc(f+X.cx,c+X.cy,vt,oe(X.y0,X.x0),oe(X.y1,X.x1),!v),e.arc(f,c,n,oe(X.cy+X.y1,X.cx+X.x1),oe(j.cy+j.y1,j.cx+j.x1),!v),ft>0&&e.arc(f+j.cx,c+j.cy,ft,oe(j.y1,j.x1),oe(j.y0,j.x0),!v))}else e.moveTo(f+z,c+N),e.arc(f,c,n,l,u,!v);if(!(i>ar)||!K)e.lineTo(f+tt,c+V);else if(D>ar){var vt=_r(p,D),ft=_r(g,D),X=qs(tt,V,P,A,i,-ft,v),j=qs(z,N,L,O,i,-vt,v);e.lineTo(f+X.cx+X.x0,c+X.cy+X.y0),D<T&&vt===ft?e.arc(f+X.cx,c+X.cy,D,oe(X.y0,X.x0),oe(j.y0,j.x0),!v):(ft>0&&e.arc(f+X.cx,c+X.cy,ft,oe(X.y0,X.x0),oe(X.y1,X.x1),!v),e.arc(f,c,i,oe(X.cy+X.y1,X.cx+X.x1),oe(j.cy+j.y1,j.cx+j.x1),v),vt>0&&e.arc(f+j.cx,c+j.cy,vt,oe(j.y1,j.x1),oe(j.y0,j.x0),!v))}else e.lineTo(f+tt,c+V),e.arc(f,c,i,u,l,v)}e.closePath()}}}var KL=function(){function e(){this.cx=0,this.cy=0,this.r0=0,this.r=0,this.startAngle=0,this.endAngle=Math.PI*2,this.clockwise=!0,this.cornerRadius=0}return e}(),jw=function(e){J(t,e);function t(r){return e.call(this,r)||this}return t.prototype.getDefaultShape=function(){return new KL},t.prototype.buildPath=function(r,n){jL(r,n)},t.prototype.isZeroArea=function(){return this.shape.startAngle===this.shape.endAngle||this.shape.r===this.shape.r0},t}(kt);jw.prototype.type=\"sector\";var ws=jw,ZL=function(){function e(){this.cx=0,this.cy=0,this.r=0,this.r0=0}return e}(),Kw=function(e){J(t,e);function t(r){return e.call(this,r)||this}return t.prototype.getDefaultShape=function(){return new ZL},t.prototype.buildPath=function(r,n){var i=n.cx,a=n.cy,o=Math.PI*2;r.moveTo(i+n.r,a),r.arc(i,a,n.r,0,o,!1),r.moveTo(i+n.r0,a),r.arc(i,a,n.r0,0,o,!0)},t}(kt);Kw.prototype.type=\"ring\";var Zw=Kw;function QL(e,t,r,n){var i=[],a=[],o=[],s=[],l,u,f,c;if(n){f=[1/0,1/0],c=[-1/0,-1/0];for(var v=0,h=e.length;v<h;v++)ia(f,f,e[v]),aa(c,c,e[v]);ia(f,f,n[0]),aa(c,c,n[1])}for(var v=0,h=e.length;v<h;v++){var d=e[v];if(r)l=e[v?v-1:h-1],u=e[(v+1)%h];else if(v===0||v===h-1){i.push(SP(e[v]));continue}else l=e[v-1],u=e[v+1];xP(a,u,l),Tf(a,a,t);var p=gh(d,l),g=gh(d,u),m=p+g;m!==0&&(p/=m,g/=m),Tf(o,a,-p),Tf(s,a,g);var y=Ag([],d,o),_=Ag([],d,s);n&&(aa(y,y,f),ia(y,y,c),aa(_,_,f),ia(_,_,c)),i.push(y),i.push(_)}return r&&i.push(i.shift()),i}function Qw(e,t,r){var n=t.smooth,i=t.points;if(i&&i.length>=2){if(n){var a=QL(i,n,r,t.smoothConstraint);e.moveTo(i[0][0],i[0][1]);for(var o=i.length,s=0;s<(r?o:o-1);s++){var l=a[s*2],u=a[s*2+1],f=i[(s+1)%o];e.bezierCurveTo(l[0],l[1],u[0],u[1],f[0],f[1])}}else{e.moveTo(i[0][0],i[0][1]);for(var s=1,c=i.length;s<c;s++)e.lineTo(i[s][0],i[s][1])}r&&e.closePath()}}var JL=function(){function e(){this.points=null,this.smooth=0,this.smoothConstraint=null}return e}(),Jw=function(e){J(t,e);function t(r){return e.call(this,r)||this}return t.prototype.getDefaultShape=function(){return new JL},t.prototype.buildPath=function(r,n){Qw(r,n,!0)},t}(kt);Jw.prototype.type=\"polygon\";var tb=Jw,t2=function(){function e(){this.points=null,this.percent=1,this.smooth=0,this.smoothConstraint=null}return e}(),eb=function(e){J(t,e);function t(r){return e.call(this,r)||this}return t.prototype.getDefaultStyle=function(){return{stroke:\"#000\",fill:null}},t.prototype.getDefaultShape=function(){return new t2},t.prototype.buildPath=function(r,n){Qw(r,n,!1)},t}(kt);eb.prototype.type=\"polyline\";var Yu=eb,e2={},r2=function(){function e(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.percent=1}return e}(),rb=function(e){J(t,e);function t(r){return e.call(this,r)||this}return t.prototype.getDefaultStyle=function(){return{stroke:\"#000\",fill:null}},t.prototype.getDefaultShape=function(){return new r2},t.prototype.buildPath=function(r,n){var i,a,o,s;if(this.subPixelOptimize){var l=Dw(e2,n,this.style);i=l.x1,a=l.y1,o=l.x2,s=l.y2}else i=n.x1,a=n.y1,o=n.x2,s=n.y2;var u=n.percent;u!==0&&(r.moveTo(i,a),u<1&&(o=i*(1-u)+o*u,s=a*(1-u)+s*u),r.lineTo(o,s))},t.prototype.pointAt=function(r){var n=this.shape;return[n.x1*(1-r)+n.x2*r,n.y1*(1-r)+n.y2*r]},t}(kt);rb.prototype.type=\"line\";var xi=rb,_e=[],n2=function(){function e(){this.x1=0,this.y1=0,this.x2=0,this.y2=0,this.cpx1=0,this.cpy1=0,this.percent=1}return e}();function km(e,t,r){var n=e.cpx2,i=e.cpy2;return n!=null||i!=null?[(r?Bg:Kt)(e.x1,e.cpx1,e.cpx2,e.x2,t),(r?Bg:Kt)(e.y1,e.cpy1,e.cpy2,e.y2,t)]:[(r?Fg:le)(e.x1,e.cpx1,e.x2,t),(r?Fg:le)(e.y1,e.cpy1,e.y2,t)]}var nb=function(e){J(t,e);function t(r){return e.call(this,r)||this}return t.prototype.getDefaultStyle=function(){return{stroke:\"#000\",fill:null}},t.prototype.getDefaultShape=function(){return new n2},t.prototype.buildPath=function(r,n){var i=n.x1,a=n.y1,o=n.x2,s=n.y2,l=n.cpx1,u=n.cpy1,f=n.cpx2,c=n.cpy2,v=n.percent;v!==0&&(r.moveTo(i,a),f==null||c==null?(v<1&&(Zl(i,l,o,v,_e),l=_e[1],o=_e[2],Zl(a,u,s,v,_e),u=_e[1],s=_e[2]),r.quadraticCurveTo(l,u,o,s)):(v<1&&(Kl(i,l,f,o,v,_e),l=_e[1],f=_e[2],o=_e[3],Kl(a,u,c,s,v,_e),u=_e[1],c=_e[2],s=_e[3]),r.bezierCurveTo(l,u,f,c,o,s)))},t.prototype.pointAt=function(r){return km(this.shape,r,!1)},t.prototype.tangentAt=function(r){var n=km(this.shape,r,!0);return MP(n,n)},t}(kt);nb.prototype.type=\"bezier-curve\";var ib=nb,i2=function(){function e(){this.cx=0,this.cy=0,this.r=0,this.startAngle=0,this.endAngle=Math.PI*2,this.clockwise=!0}return e}(),ab=function(e){J(t,e);function t(r){return e.call(this,r)||this}return t.prototype.getDefaultStyle=function(){return{stroke:\"#000\",fill:null}},t.prototype.getDefaultShape=function(){return new i2},t.prototype.buildPath=function(r,n){var i=n.cx,a=n.cy,o=Math.max(n.r,0),s=n.startAngle,l=n.endAngle,u=n.clockwise,f=Math.cos(s),c=Math.sin(s);r.moveTo(f*o+i,c*o+a),r.arc(i,a,o,s,l,!u)},t}(kt);ab.prototype.type=\"arc\";var Dd=ab,a2=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=\"compound\",r}return t.prototype._updatePathDirty=function(){for(var r=this.shape.paths,n=this.shapeChanged(),i=0;i<r.length;i++)n=n||r[i].shapeChanged();n&&this.dirtyShape()},t.prototype.beforeBrush=function(){this._updatePathDirty();for(var r=this.shape.paths||[],n=this.getGlobalScale(),i=0;i<r.length;i++)r[i].path||r[i].createPathProxy(),r[i].path.setScale(n[0],n[1],r[i].segmentIgnoreThreshold)},t.prototype.buildPath=function(r,n){for(var i=n.paths||[],a=0;a<i.length;a++)i[a].buildPath(r,i[a].shape,!0)},t.prototype.afterBrush=function(){for(var r=this.shape.paths||[],n=0;n<r.length;n++)r[n].pathUpdated()},t.prototype.getBoundingRect=function(){return this._updatePathDirty.call(this),kt.prototype.getBoundingRect.call(this)},t}(kt),o2=a2,s2=function(){function e(t){this.colorStops=t||[]}return e.prototype.addColorStop=function(t,r){this.colorStops.push({offset:t,color:r})},e}(),ob=s2,l2=function(e){J(t,e);function t(r,n,i,a,o,s){var l=e.call(this,o)||this;return l.x=r==null?0:r,l.y=n==null?0:n,l.x2=i==null?1:i,l.y2=a==null?0:a,l.type=\"linear\",l.global=s||!1,l}return t}(ob),sb=l2,u2=function(e){J(t,e);function t(r,n,i,a,o){var s=e.call(this,a)||this;return s.x=r==null?.5:r,s.y=n==null?.5:n,s.r=i==null?.5:i,s.type=\"radial\",s.global=o||!1,s}return t}(ob),f2=u2,ti=[0,0],ei=[0,0],Xs=new pt,js=new pt,c2=function(){function e(t,r){this._corners=[],this._axes=[],this._origin=[0,0];for(var n=0;n<4;n++)this._corners[n]=new pt;for(var n=0;n<2;n++)this._axes[n]=new pt;t&&this.fromBoundingRect(t,r)}return e.prototype.fromBoundingRect=function(t,r){var n=this._corners,i=this._axes,a=t.x,o=t.y,s=a+t.width,l=o+t.height;if(n[0].set(a,o),n[1].set(s,o),n[2].set(s,l),n[3].set(a,l),r)for(var u=0;u<4;u++)n[u].transform(r);pt.sub(i[0],n[1],n[0]),pt.sub(i[1],n[3],n[0]),i[0].normalize(),i[1].normalize();for(var u=0;u<2;u++)this._origin[u]=i[u].dot(n[0])},e.prototype.intersect=function(t,r){var n=!0,i=!r;return Xs.set(1/0,1/0),js.set(0,0),!this._intersectCheckOneSide(this,t,Xs,js,i,1)&&(n=!1,i)||!this._intersectCheckOneSide(t,this,Xs,js,i,-1)&&(n=!1,i)||i||pt.copy(r,n?Xs:js),n},e.prototype._intersectCheckOneSide=function(t,r,n,i,a,o){for(var s=!0,l=0;l<2;l++){var u=this._axes[l];if(this._getProjMinMaxOnAxis(l,t._corners,ti),this._getProjMinMaxOnAxis(l,r._corners,ei),ti[1]<ei[0]||ti[0]>ei[1]){if(s=!1,a)return s;var f=Math.abs(ei[0]-ti[1]),c=Math.abs(ti[0]-ei[1]);Math.min(f,c)>i.len()&&(f<c?pt.scale(i,u,-f*o):pt.scale(i,u,c*o))}else if(n){var f=Math.abs(ei[0]-ti[1]),c=Math.abs(ti[0]-ei[1]);Math.min(f,c)<n.len()&&(f<c?pt.scale(n,u,f*o):pt.scale(n,u,-c*o))}}return s},e.prototype._getProjMinMaxOnAxis=function(t,r,n){for(var i=this._axes[t],a=this._origin,o=r[0].dot(i)+a[t],s=o,l=o,u=1;u<r.length;u++){var f=r[u].dot(i)+a[t];s=Math.min(f,s),l=Math.max(f,l)}n[0]=s,n[1]=l},e}(),su=c2,h2=[],v2=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.notClear=!0,r.incremental=!0,r._displayables=[],r._temporaryDisplayables=[],r._cursor=0,r}return t.prototype.traverse=function(r,n){r.call(n,this)},t.prototype.useStyle=function(){this.style={}},t.prototype.getCursor=function(){return this._cursor},t.prototype.innerAfterBrush=function(){this._cursor=this._displayables.length},t.prototype.clearDisplaybles=function(){this._displayables=[],this._temporaryDisplayables=[],this._cursor=0,this.markRedraw(),this.notClear=!1},t.prototype.clearTemporalDisplayables=function(){this._temporaryDisplayables=[]},t.prototype.addDisplayable=function(r,n){n?this._temporaryDisplayables.push(r):this._displayables.push(r),this.markRedraw()},t.prototype.addDisplayables=function(r,n){n=n||!1;for(var i=0;i<r.length;i++)this.addDisplayable(r[i],n)},t.prototype.getDisplayables=function(){return this._displayables},t.prototype.getTemporalDisplayables=function(){return this._temporaryDisplayables},t.prototype.eachPendingDisplayable=function(r){for(var n=this._cursor;n<this._displayables.length;n++)r&&r(this._displayables[n]);for(var n=0;n<this._temporaryDisplayables.length;n++)r&&r(this._temporaryDisplayables[n])},t.prototype.update=function(){this.updateTransform();for(var r=this._cursor;r<this._displayables.length;r++){var n=this._displayables[r];n.parent=this,n.update(),n.parent=null}for(var r=0;r<this._temporaryDisplayables.length;r++){var n=this._temporaryDisplayables[r];n.parent=this,n.update(),n.parent=null}},t.prototype.getBoundingRect=function(){if(!this._rect){for(var r=new Ot(1/0,1/0,-1/0,-1/0),n=0;n<this._displayables.length;n++){var i=this._displayables[n],a=i.getBoundingRect().clone();i.needLocalTransform()&&a.applyTransform(i.getLocalTransform(h2)),r.union(a)}this._rect=r}return this._rect},t.prototype.contain=function(r,n){var i=this.transformCoordToLocal(r,n),a=this.getBoundingRect();if(a.contain(i[0],i[1]))for(var o=0;o<this._displayables.length;o++){var s=this._displayables[o];if(s.contain(r,n))return!0}return!1},t}(_s),d2=v2,p2=Qt();function g2(e,t,r,n,i){var a;if(t&&t.ecModel){var o=t.ecModel.getUpdatePayload();a=o&&o.animation}var s=t&&t.isAnimationEnabled(),l=e===\"update\";if(s){var u=void 0,f=void 0,c=void 0;n?(u=Mt(n.duration,200),f=Mt(n.easing,\"cubicOut\"),c=0):(u=t.getShallow(l?\"animationDurationUpdate\":\"animationDuration\"),f=t.getShallow(l?\"animationEasingUpdate\":\"animationEasing\"),c=t.getShallow(l?\"animationDelayUpdate\":\"animationDelay\")),a&&(a.duration!=null&&(u=a.duration),a.easing!=null&&(f=a.easing),a.delay!=null&&(c=a.delay)),mt(c)&&(c=c(r,i)),mt(u)&&(u=u(r));var v={duration:u||0,delay:c,easing:f};return v}else return null}function Pd(e,t,r,n,i,a,o){var s=!1,l;mt(i)?(o=a,a=i,i=null):st(i)&&(a=i.cb,o=i.during,s=i.isFrom,l=i.removeOpt,i=i.dataIndex);var u=e===\"leave\";u||t.stopAnimation(\"leave\");var f=g2(e,n,i,u?l||{}:null,n&&n.getAnimationDelayParams?n.getAnimationDelayParams(t,i):null);if(f&&f.duration>0){var c=f.duration,v=f.delay,h=f.easing,d={duration:c,delay:v||0,easing:h,done:a,force:!!a||!!o,setToFinal:!u,scope:e,during:o};s?t.animateFrom(r,d):t.animateTo(r,d)}else t.stopAnimation(),!s&&t.attr(r),o&&o(1),a&&a()}function Dr(e,t,r,n,i,a){Pd(\"update\",e,t,r,n,i,a)}function An(e,t,r,n,i,a){Pd(\"enter\",e,t,r,n,i,a)}function Oo(e){if(!e.__zr)return!0;for(var t=0;t<e.animators.length;t++){var r=e.animators[t];if(r.scope===\"leave\")return!0}return!1}function lu(e,t,r,n,i,a){Oo(e)||Pd(\"leave\",e,t,r,n,i,a)}function Nm(e,t,r,n){e.removeTextContent(),e.removeTextGuideLine(),lu(e,{style:{opacity:0}},t,r,n)}function lb(e,t,r){function n(){e.parent&&e.parent.remove(e)}e.isGroup?e.traverse(function(i){i.isGroup||Nm(i,t,r,n)}):Nm(e,t,r,n)}function ub(e){p2(e).oldStyle=e.style}var uu=Math.max,fu=Math.min,Yh={};function m2(e){return kt.extend(e)}var y2=VL;function _2(e,t){return y2(e,t)}function hr(e,t){Yh[e]=t}function w2(e){if(Yh.hasOwnProperty(e))return Yh[e]}function Id(e,t,r,n){var i=$L(e,t);return r&&(n===\"center\"&&(r=cb(r,i.getBoundingRect())),hb(i,r)),i}function fb(e,t,r){var n=new Ii({style:{image:e,x:t.x,y:t.y,width:t.width,height:t.height},onload:function(i){if(r===\"center\"){var a={width:i.width,height:i.height};n.setStyle(cb(t,a))}}});return n}function cb(e,t){var r=t.width/t.height,n=e.height*r,i;n<=e.width?i=e.height:(n=e.width,i=n/r);var a=e.x+e.width/2,o=e.y+e.height/2;return{x:a-n/2,y:o-i/2,width:n,height:i}}var b2=GL;function hb(e,t){if(!!e.applyTransform){var r=e.getBoundingRect(),n=r.calculateTransform(t);e.applyTransform(n)}}function S2(e){return Dw(e.shape,e.shape,e.style),e}function x2(e){return Pw(e.shape,e.shape,e.style),e}var T2=vi;function C2(e,t){for(var r=hd([]);e&&e!==t;)pa(r,e.getLocalTransform(),r),e=e.parent;return r}function Ed(e,t,r){return t&&!Me(t)&&(t=pd.getLocalTransform(t)),r&&(t=dd([],t)),tr([],e,t)}function M2(e,t,r){var n=t[4]===0||t[5]===0||t[0]===0?1:Math.abs(2*t[4]/t[0]),i=t[4]===0||t[5]===0||t[2]===0?1:Math.abs(2*t[4]/t[2]),a=[e===\"left\"?-n:e===\"right\"?n:0,e===\"top\"?-i:e===\"bottom\"?i:0];return a=Ed(a,t,r),Math.abs(a[0])>Math.abs(a[1])?a[0]>0?\"right\":\"left\":a[1]>0?\"bottom\":\"top\"}function Bm(e){return!e.isGroup}function A2(e){return e.shape!=null}function vb(e,t,r){if(!e||!t)return;function n(o){var s={};return o.traverse(function(l){Bm(l)&&l.anid&&(s[l.anid]=l)}),s}function i(o){var s={x:o.x,y:o.y,rotation:o.rotation};return A2(o)&&(s.shape=Y({},o.shape)),s}var a=n(e);t.traverse(function(o){if(Bm(o)&&o.anid){var s=a[o.anid];if(s){var l=i(o);o.attr(i(s)),Dr(o,l,r,Nt(o).dataIndex)}}})}function D2(e,t){return ct(e,function(r){var n=r[0];n=uu(n,t.x),n=fu(n,t.x+t.width);var i=r[1];return i=uu(i,t.y),i=fu(i,t.y+t.height),[n,i]})}function P2(e,t){var r=uu(e.x,t.x),n=fu(e.x+e.width,t.x+t.width),i=uu(e.y,t.y),a=fu(e.y+e.height,t.y+t.height);if(n>=r&&a>=i)return{x:r,y:i,width:n-r,height:a-i}}function Ld(e,t,r){var n=Y({rectHover:!0},t),i=n.style={strokeNoScale:!0};if(r=r||{x:-1,y:-1,width:2,height:2},e)return e.indexOf(\"image://\")===0?(i.image=e.slice(8),Pt(i,r),new Ii(n)):Id(e.replace(\"path://\",\"\"),n,r,\"center\")}function I2(e,t,r,n,i){for(var a=0,o=i[i.length-1];a<i.length;a++){var s=i[a];if(db(e,t,r,n,s[0],s[1],o[0],o[1]))return!0;o=s}}function db(e,t,r,n,i,a,o,s){var l=r-e,u=n-t,f=o-i,c=s-a,v=sc(f,c,l,u);if(E2(v))return!1;var h=e-i,d=t-a,p=sc(h,d,l,u)/v;if(p<0||p>1)return!1;var g=sc(h,d,f,c)/v;return!(g<0||g>1)}function sc(e,t,r,n){return e*n-r*t}function E2(e){return e<=1e-6&&e>=-1e-6}function Rd(e){var t=e.itemTooltipOption,r=e.componentModel,n=e.itemName,i=it(t)?{formatter:t}:t,a=r.mainType,o=r.componentIndex,s={componentType:a,name:n,$vars:[\"name\"]};s[a+\"Index\"]=o;var l=e.formatterParamsExtra;l&&I(Gt(l),function(f){Ca(s,f)||(s[f]=l[f],s.$vars.push(f))});var u=Nt(e.el);u.componentMainType=a,u.componentIndex=o,u.tooltipConfig={name:n,option:Pt({content:n,formatterParams:s},i)}}function Fm(e,t){var r;e.isGroup&&(r=t(e)),r||e.traverse(t)}function Od(e,t){if(e)if(et(e))for(var r=0;r<e.length;r++)Fm(e[r],t);else Fm(e,t)}hr(\"circle\",Ad);hr(\"ellipse\",qw);hr(\"sector\",ws);hr(\"ring\",Zw);hr(\"polygon\",tb);hr(\"polyline\",Yu);hr(\"rect\",ne);hr(\"line\",xi);hr(\"bezierCurve\",ib);hr(\"arc\",Dd);var L2=Object.freeze(Object.defineProperty({__proto__:null,updateProps:Dr,initProps:An,removeElement:lu,removeElementWithFadeOut:lb,isElementRemoved:Oo,extendShape:m2,extendPath:_2,registerShape:hr,getShapeClass:w2,makePath:Id,makeImage:fb,mergePath:b2,resizePath:hb,subPixelOptimizeLine:S2,subPixelOptimizeRect:x2,subPixelOptimize:T2,getTransform:C2,applyTransform:Ed,transformDirection:M2,groupTransition:vb,clipPointsByRect:D2,clipRectByRect:P2,createIcon:Ld,linePolygonIntersect:I2,lineLineIntersect:db,setTooltipConfig:Rd,traverseElements:Od,Group:ye,Image:Ii,Text:he,Circle:Ad,Ellipse:qw,Sector:ws,Ring:Zw,Polygon:tb,Polyline:Yu,Rect:ne,Line:xi,BezierCurve:ib,Arc:Dd,IncrementalDisplayable:d2,CompoundPath:o2,LinearGradient:sb,RadialGradient:f2,BoundingRect:Ot,OrientedBoundingRect:su,Point:pt,Path:kt},Symbol.toStringTag,{value:\"Module\"})),qu={};function R2(e,t){for(var r=0;r<er.length;r++){var n=er[r],i=t[n],a=e.ensureState(n);a.style=a.style||{},a.style.text=i}var o=e.currentStates.slice();e.clearStates(!0),e.setStyle({text:t.normal}),e.useStates(o,!0)}function zm(e,t,r){var n=e.labelFetcher,i=e.labelDataIndex,a=e.labelDimIndex,o=t.normal,s;n&&(s=n.getFormattedLabel(i,\"normal\",null,a,o&&o.get(\"formatter\"),r!=null?{interpolatedValue:r}:null)),s==null&&(s=mt(e.defaultText)?e.defaultText(i,e,r):e.defaultText);for(var l={normal:s},u=0;u<er.length;u++){var f=er[u],c=t[f];l[f]=Mt(n?n.getFormattedLabel(i,f,null,a,c&&c.get(\"formatter\")):null,s)}return l}function Xu(e,t,r,n){r=r||qu;for(var i=e instanceof he,a=!1,o=0;o<nu.length;o++){var s=t[nu[o]];if(s&&s.getShallow(\"show\")){a=!0;break}}var l=i?e:e.getTextContent();if(a){i||(l||(l=new he,e.setTextContent(l)),e.stateProxy&&(l.stateProxy=e.stateProxy));var u=zm(r,t),f=t.normal,c=!!f.getShallow(\"show\"),v=kn(f,n&&n.normal,r,!1,!i);v.text=u.normal,i||e.setTextConfig(Hm(f,r,!1));for(var o=0;o<er.length;o++){var h=er[o],s=t[h];if(s){var d=l.ensureState(h),p=!!Mt(s.getShallow(\"show\"),c);if(p!==c&&(d.ignore=!p),d.style=kn(s,n&&n[h],r,!0,!i),d.style.text=u[h],!i){var g=e.ensureState(h);g.textConfig=Hm(s,r,!0)}}}l.silent=!!f.getShallow(\"silent\"),l.style.x!=null&&(v.x=l.style.x),l.style.y!=null&&(v.y=l.style.y),l.ignore=!c,l.useStyle(v),l.dirty(),r.enableTextSetter&&(pb(l).setLabelText=function(m){var y=zm(r,t,m);R2(l,y)})}else l&&(l.ignore=!0);e.dirty()}function ju(e,t){t=t||\"label\";for(var r={normal:e.getModel(t)},n=0;n<er.length;n++){var i=er[n];r[i]=e.getModel([i,t])}return r}function kn(e,t,r,n,i){var a={};return O2(a,e,r,n,i),t&&Y(a,t),a}function Hm(e,t,r){t=t||{};var n={},i,a=e.getShallow(\"rotate\"),o=Mt(e.getShallow(\"distance\"),r?null:5),s=e.getShallow(\"offset\");return i=e.getShallow(\"position\")||(r?null:\"inside\"),i===\"outside\"&&(i=t.defaultOutsidePosition||\"top\"),i!=null&&(n.position=i),s!=null&&(n.offset=s),a!=null&&(a*=Math.PI/180,n.rotation=a),o!=null&&(n.distance=o),n.outsideFill=e.get(\"color\")===\"inherit\"?t.inheritColor||null:\"auto\",n}function O2(e,t,r,n,i){r=r||qu;var a=t.ecModel,o=a&&a.option.textStyle,s=k2(t),l;if(s){l={};for(var u in s)if(s.hasOwnProperty(u)){var f=t.getModel([\"rich\",u]);Um(l[u]={},f,o,r,n,i,!1,!0)}}l&&(e.rich=l);var c=t.get(\"overflow\");c&&(e.overflow=c);var v=t.get(\"minMargin\");v!=null&&(e.margin=v),Um(e,t,o,r,n,i,!0,!1)}function k2(e){for(var t;e&&e!==e.ecModel;){var r=(e.option||qu).rich;if(r){t=t||{};for(var n=Gt(r),i=0;i<n.length;i++){var a=n[i];t[a]=1}}e=e.parentModel}return t}var $m=[\"fontStyle\",\"fontWeight\",\"fontSize\",\"fontFamily\",\"textShadowColor\",\"textShadowBlur\",\"textShadowOffsetX\",\"textShadowOffsetY\"],Vm=[\"align\",\"lineHeight\",\"width\",\"height\",\"tag\",\"verticalAlign\"],Gm=[\"padding\",\"borderWidth\",\"borderRadius\",\"borderDashOffset\",\"backgroundColor\",\"borderColor\",\"shadowColor\",\"shadowBlur\",\"shadowOffsetX\",\"shadowOffsetY\"];function Um(e,t,r,n,i,a,o,s){r=!i&&r||qu;var l=n&&n.inheritColor,u=t.getShallow(\"color\"),f=t.getShallow(\"textBorderColor\"),c=Mt(t.getShallow(\"opacity\"),r.opacity);(u===\"inherit\"||u===\"auto\")&&(l?u=l:u=null),(f===\"inherit\"||f===\"auto\")&&(l?f=l:f=null),a||(u=u||r.color,f=f||r.textBorderColor),u!=null&&(e.fill=u),f!=null&&(e.stroke=f);var v=Mt(t.getShallow(\"textBorderWidth\"),r.textBorderWidth);v!=null&&(e.lineWidth=v);var h=Mt(t.getShallow(\"textBorderType\"),r.textBorderType);h!=null&&(e.lineDash=h);var d=Mt(t.getShallow(\"textBorderDashOffset\"),r.textBorderDashOffset);d!=null&&(e.lineDashOffset=d),!i&&c==null&&!s&&(c=n&&n.defaultOpacity),c!=null&&(e.opacity=c),!i&&!a&&e.fill==null&&n.inheritColor&&(e.fill=n.inheritColor);for(var p=0;p<$m.length;p++){var g=$m[p],m=Mt(t.getShallow(g),r[g]);m!=null&&(e[g]=m)}for(var p=0;p<Vm.length;p++){var g=Vm[p],m=t.getShallow(g);m!=null&&(e[g]=m)}if(e.verticalAlign==null){var y=t.getShallow(\"baseline\");y!=null&&(e.verticalAlign=y)}if(!o||!n.disableBox){for(var p=0;p<Gm.length;p++){var g=Gm[p],m=t.getShallow(g);m!=null&&(e[g]=m)}var _=t.getShallow(\"borderType\");_!=null&&(e.borderDash=_),(e.backgroundColor===\"auto\"||e.backgroundColor===\"inherit\")&&l&&(e.backgroundColor=l),(e.borderColor===\"auto\"||e.borderColor===\"inherit\")&&l&&(e.borderColor=l)}}function N2(e,t){var r=t&&t.getModel(\"textStyle\");return Tr([e.fontStyle||r&&r.getShallow(\"fontStyle\")||\"\",e.fontWeight||r&&r.getShallow(\"fontWeight\")||\"\",(e.fontSize||r&&r.getShallow(\"fontSize\")||12)+\"px\",e.fontFamily||r&&r.getShallow(\"fontFamily\")||\"sans-serif\"].join(\" \"))}var pb=Qt(),B2=[\"textStyle\",\"color\"],lc=[\"fontStyle\",\"fontWeight\",\"fontSize\",\"fontFamily\",\"padding\",\"lineHeight\",\"rich\",\"width\",\"height\",\"overflow\"],uc=new he,F2=function(){function e(){}return e.prototype.getTextColor=function(t){var r=this.ecModel;return this.getShallow(\"color\")||(!t&&r?r.get(B2):null)},e.prototype.getFont=function(){return N2({fontStyle:this.getShallow(\"fontStyle\"),fontWeight:this.getShallow(\"fontWeight\"),fontSize:this.getShallow(\"fontSize\"),fontFamily:this.getShallow(\"fontFamily\")},this.ecModel)},e.prototype.getTextRect=function(t){for(var r={text:t,verticalAlign:this.getShallow(\"verticalAlign\")||this.getShallow(\"baseline\")},n=0;n<lc.length;n++)r[lc[n]]=this.getShallow(lc[n]);return uc.useStyle(r),uc.update(),uc.getBoundingRect()},e}(),z2=F2,gb=[[\"lineWidth\",\"width\"],[\"stroke\",\"color\"],[\"opacity\"],[\"shadowBlur\"],[\"shadowOffsetX\"],[\"shadowOffsetY\"],[\"shadowColor\"],[\"lineDash\",\"type\"],[\"lineDashOffset\",\"dashOffset\"],[\"lineCap\",\"cap\"],[\"lineJoin\",\"join\"],[\"miterLimit\"]],H2=es(gb),$2=function(){function e(){}return e.prototype.getLineStyle=function(t){return H2(this,t)},e}(),mb=[[\"fill\",\"color\"],[\"stroke\",\"borderColor\"],[\"lineWidth\",\"borderWidth\"],[\"opacity\"],[\"shadowBlur\"],[\"shadowOffsetX\"],[\"shadowOffsetY\"],[\"shadowColor\"],[\"lineDash\",\"borderType\"],[\"lineDashOffset\",\"borderDashOffset\"],[\"lineCap\",\"borderCap\"],[\"lineJoin\",\"borderJoin\"],[\"miterLimit\",\"borderMiterLimit\"]],V2=es(mb),G2=function(){function e(){}return e.prototype.getItemStyle=function(t,r){return V2(this,t,r)},e}(),Ei=function(){function e(t,r,n){this.parentModel=r,this.ecModel=n,this.option=t}return e.prototype.init=function(t,r,n){for(var i=[],a=3;a<arguments.length;a++)i[a-3]=arguments[a]},e.prototype.mergeOption=function(t,r){Dt(this.option,t,!0)},e.prototype.get=function(t,r){return t==null?this.option:this._doGet(this.parsePath(t),!r&&this.parentModel)},e.prototype.getShallow=function(t,r){var n=this.option,i=n==null?n:n[t];if(i==null&&!r){var a=this.parentModel;a&&(i=a.getShallow(t))}return i},e.prototype.getModel=function(t,r){var n=t!=null,i=n?this.parsePath(t):null,a=n?this._doGet(i):this.option;return r=r||this.parentModel&&this.parentModel.getModel(this.resolveParentPath(i)),new e(a,r,this.ecModel)},e.prototype.isEmpty=function(){return this.option==null},e.prototype.restoreData=function(){},e.prototype.clone=function(){var t=this.constructor;return new t(xt(this.option))},e.prototype.parsePath=function(t){return typeof t==\"string\"?t.split(\".\"):t},e.prototype.resolveParentPath=function(t){return t},e.prototype.isAnimationEnabled=function(){if(!wt.node&&this.option){if(this.option.animation!=null)return!!this.option.animation;if(this.parentModel)return this.parentModel.isAnimationEnabled()}},e.prototype._doGet=function(t,r){var n=this.option;if(!t)return n;for(var i=0;i<t.length&&!(!!t[i]&&(n=n&&typeof n==\"object\"?n[t[i]]:null,n==null));i++);return n==null&&r&&(n=r._doGet(this.resolveParentPath(t),r.parentModel)),n},e}();Sd(Ei);yE(Ei);Pr(Ei,$2);Pr(Ei,G2);Pr(Ei,xE);Pr(Ei,z2);var ce=Ei,U2=Math.round(Math.random()*10);function Ku(e){return[e||\"\",U2++].join(\"_\")}function W2(e){var t={};e.registerSubTypeDefaulter=function(r,n){var i=Cr(r);t[i.main]=n},e.determineSubType=function(r,n){var i=n.type;if(!i){var a=Cr(r).main;e.hasSubTypes(r)&&t[a]&&(i=t[a](n))}return i}}function Y2(e,t){e.topologicalTravel=function(a,o,s,l){if(!a.length)return;var u=r(o),f=u.graph,c=u.noEntryList,v={};for(I(a,function(y){v[y]=!0});c.length;){var h=c.pop(),d=f[h],p=!!v[h];p&&(s.call(l,h,d.originalDeps.slice()),delete v[h]),I(d.successor,p?m:g)}I(v,function(){var y=\"\";throw new Error(y)});function g(y){f[y].entryCount--,f[y].entryCount===0&&c.push(y)}function m(y){v[y]=!0,g(y)}};function r(a){var o={},s=[];return I(a,function(l){var u=n(o,l),f=u.originalDeps=t(l),c=i(f,a);u.entryCount=c.length,u.entryCount===0&&s.push(l),I(c,function(v){It(u.predecessor,v)<0&&u.predecessor.push(v);var h=n(o,v);It(h.successor,v)<0&&h.successor.push(l)})}),{graph:o,noEntryList:s}}function n(a,o){return a[o]||(a[o]={predecessor:[],successor:[]}),a[o]}function i(a,o){var s=[];return I(a,function(l){It(o,l)>=0&&s.push(l)}),s}}function q2(e,t){return Dt(Dt({},e,!0),t,!0)}var X2={time:{month:[\"January\",\"February\",\"March\",\"April\",\"May\",\"June\",\"July\",\"August\",\"September\",\"October\",\"November\",\"December\"],monthAbbr:[\"Jan\",\"Feb\",\"Mar\",\"Apr\",\"May\",\"Jun\",\"Jul\",\"Aug\",\"Sep\",\"Oct\",\"Nov\",\"Dec\"],dayOfWeek:[\"Sunday\",\"Monday\",\"Tuesday\",\"Wednesday\",\"Thursday\",\"Friday\",\"Saturday\"],dayOfWeekAbbr:[\"Sun\",\"Mon\",\"Tue\",\"Wed\",\"Thu\",\"Fri\",\"Sat\"]},legend:{selector:{all:\"All\",inverse:\"Inv\"}},toolbox:{brush:{title:{rect:\"Box Select\",polygon:\"Lasso Select\",lineX:\"Horizontally Select\",lineY:\"Vertically Select\",keep:\"Keep Selections\",clear:\"Clear Selections\"}},dataView:{title:\"Data View\",lang:[\"Data View\",\"Close\",\"Refresh\"]},dataZoom:{title:{zoom:\"Zoom\",back:\"Zoom Reset\"}},magicType:{title:{line:\"Switch to Line Chart\",bar:\"Switch to Bar Chart\",stack:\"Stack\",tiled:\"Tile\"}},restore:{title:\"Restore\"},saveAsImage:{title:\"Save as Image\",lang:[\"Right Click to Save Image\"]}},series:{typeNames:{pie:\"Pie chart\",bar:\"Bar chart\",line:\"Line chart\",scatter:\"Scatter plot\",effectScatter:\"Ripple scatter plot\",radar:\"Radar chart\",tree:\"Tree\",treemap:\"Treemap\",boxplot:\"Boxplot\",candlestick:\"Candlestick\",k:\"K line chart\",heatmap:\"Heat map\",map:\"Map\",parallel:\"Parallel coordinate map\",lines:\"Line graph\",graph:\"Relationship graph\",sankey:\"Sankey diagram\",funnel:\"Funnel chart\",gauge:\"Gauge\",pictorialBar:\"Pictorial bar\",themeRiver:\"Theme River Map\",sunburst:\"Sunburst\"}},aria:{general:{withTitle:'This is a chart about \"{title}\"',withoutTitle:\"This is a chart\"},series:{single:{prefix:\"\",withName:\" with type {seriesType} named {seriesName}.\",withoutName:\" with type {seriesType}.\"},multiple:{prefix:\". It consists of {seriesCount} series count.\",withName:\" The {seriesId} series is a {seriesType} representing {seriesName}.\",withoutName:\" The {seriesId} series is a {seriesType}.\",separator:{middle:\"\",end:\"\"}}},data:{allData:\"The data is as follows: \",partialData:\"The first {displayCnt} items are: \",withName:\"the data for {name} is {value}\",withoutName:\"{value}\",separator:{middle:\", \",end:\". \"}}}},j2={time:{month:[\"\\u4E00\\u6708\",\"\\u4E8C\\u6708\",\"\\u4E09\\u6708\",\"\\u56DB\\u6708\",\"\\u4E94\\u6708\",\"\\u516D\\u6708\",\"\\u4E03\\u6708\",\"\\u516B\\u6708\",\"\\u4E5D\\u6708\",\"\\u5341\\u6708\",\"\\u5341\\u4E00\\u6708\",\"\\u5341\\u4E8C\\u6708\"],monthAbbr:[\"1\\u6708\",\"2\\u6708\",\"3\\u6708\",\"4\\u6708\",\"5\\u6708\",\"6\\u6708\",\"7\\u6708\",\"8\\u6708\",\"9\\u6708\",\"10\\u6708\",\"11\\u6708\",\"12\\u6708\"],dayOfWeek:[\"\\u661F\\u671F\\u65E5\",\"\\u661F\\u671F\\u4E00\",\"\\u661F\\u671F\\u4E8C\",\"\\u661F\\u671F\\u4E09\",\"\\u661F\\u671F\\u56DB\",\"\\u661F\\u671F\\u4E94\",\"\\u661F\\u671F\\u516D\"],dayOfWeekAbbr:[\"\\u65E5\",\"\\u4E00\",\"\\u4E8C\",\"\\u4E09\",\"\\u56DB\",\"\\u4E94\",\"\\u516D\"]},legend:{selector:{all:\"\\u5168\\u9009\",inverse:\"\\u53CD\\u9009\"}},toolbox:{brush:{title:{rect:\"\\u77E9\\u5F62\\u9009\\u62E9\",polygon:\"\\u5708\\u9009\",lineX:\"\\u6A2A\\u5411\\u9009\\u62E9\",lineY:\"\\u7EB5\\u5411\\u9009\\u62E9\",keep:\"\\u4FDD\\u6301\\u9009\\u62E9\",clear:\"\\u6E05\\u9664\\u9009\\u62E9\"}},dataView:{title:\"\\u6570\\u636E\\u89C6\\u56FE\",lang:[\"\\u6570\\u636E\\u89C6\\u56FE\",\"\\u5173\\u95ED\",\"\\u5237\\u65B0\"]},dataZoom:{title:{zoom:\"\\u533A\\u57DF\\u7F29\\u653E\",back:\"\\u533A\\u57DF\\u7F29\\u653E\\u8FD8\\u539F\"}},magicType:{title:{line:\"\\u5207\\u6362\\u4E3A\\u6298\\u7EBF\\u56FE\",bar:\"\\u5207\\u6362\\u4E3A\\u67F1\\u72B6\\u56FE\",stack:\"\\u5207\\u6362\\u4E3A\\u5806\\u53E0\",tiled:\"\\u5207\\u6362\\u4E3A\\u5E73\\u94FA\"}},restore:{title:\"\\u8FD8\\u539F\"},saveAsImage:{title:\"\\u4FDD\\u5B58\\u4E3A\\u56FE\\u7247\",lang:[\"\\u53F3\\u952E\\u53E6\\u5B58\\u4E3A\\u56FE\\u7247\"]}},series:{typeNames:{pie:\"\\u997C\\u56FE\",bar:\"\\u67F1\\u72B6\\u56FE\",line:\"\\u6298\\u7EBF\\u56FE\",scatter:\"\\u6563\\u70B9\\u56FE\",effectScatter:\"\\u6D9F\\u6F2A\\u6563\\u70B9\\u56FE\",radar:\"\\u96F7\\u8FBE\\u56FE\",tree:\"\\u6811\\u56FE\",treemap:\"\\u77E9\\u5F62\\u6811\\u56FE\",boxplot:\"\\u7BB1\\u578B\\u56FE\",candlestick:\"K\\u7EBF\\u56FE\",k:\"K\\u7EBF\\u56FE\",heatmap:\"\\u70ED\\u529B\\u56FE\",map:\"\\u5730\\u56FE\",parallel:\"\\u5E73\\u884C\\u5750\\u6807\\u56FE\",lines:\"\\u7EBF\\u56FE\",graph:\"\\u5173\\u7CFB\\u56FE\",sankey:\"\\u6851\\u57FA\\u56FE\",funnel:\"\\u6F0F\\u6597\\u56FE\",gauge:\"\\u4EEA\\u8868\\u76D8\\u56FE\",pictorialBar:\"\\u8C61\\u5F62\\u67F1\\u56FE\",themeRiver:\"\\u4E3B\\u9898\\u6CB3\\u6D41\\u56FE\",sunburst:\"\\u65ED\\u65E5\\u56FE\"}},aria:{general:{withTitle:\"\\u8FD9\\u662F\\u4E00\\u4E2A\\u5173\\u4E8E\\u201C{title}\\u201D\\u7684\\u56FE\\u8868\\u3002\",withoutTitle:\"\\u8FD9\\u662F\\u4E00\\u4E2A\\u56FE\\u8868\\uFF0C\"},series:{single:{prefix:\"\",withName:\"\\u56FE\\u8868\\u7C7B\\u578B\\u662F{seriesType}\\uFF0C\\u8868\\u793A{seriesName}\\u3002\",withoutName:\"\\u56FE\\u8868\\u7C7B\\u578B\\u662F{seriesType}\\u3002\"},multiple:{prefix:\"\\u5B83\\u7531{seriesCount}\\u4E2A\\u56FE\\u8868\\u7CFB\\u5217\\u7EC4\\u6210\\u3002\",withName:\"\\u7B2C{seriesId}\\u4E2A\\u7CFB\\u5217\\u662F\\u4E00\\u4E2A\\u8868\\u793A{seriesName}\\u7684{seriesType}\\uFF0C\",withoutName:\"\\u7B2C{seriesId}\\u4E2A\\u7CFB\\u5217\\u662F\\u4E00\\u4E2A{seriesType}\\uFF0C\",separator:{middle:\"\\uFF1B\",end:\"\\u3002\"}}},data:{allData:\"\\u5176\\u6570\\u636E\\u662F\\u2014\\u2014\",partialData:\"\\u5176\\u4E2D\\uFF0C\\u524D{displayCnt}\\u9879\\u662F\\u2014\\u2014\",withName:\"{name}\\u7684\\u6570\\u636E\\u662F{value}\",withoutName:\"{value}\",separator:{middle:\"\\uFF0C\",end:\"\"}}}},cu=\"ZH\",kd=\"EN\",rs=kd,Ll={},Nd={},yb=wt.domSupported?function(){var e=(document.documentElement.lang||navigator.language||navigator.browserLanguage).toUpperCase();return e.indexOf(cu)>-1?cu:rs}():rs;function _b(e,t){e=e.toUpperCase(),Nd[e]=new ce(t),Ll[e]=t}function K2(e){if(it(e)){var t=Ll[e.toUpperCase()]||{};return e===cu||e===kd?xt(t):Dt(xt(t),xt(Ll[rs]),!1)}else return Dt(xt(e),xt(Ll[rs]),!1)}function Z2(e){return Nd[e]}function Q2(){return Nd[rs]}_b(kd,X2);_b(cu,j2);var Bd=1e3,Fd=Bd*60,ko=Fd*60,Ze=ko*24,Wm=Ze*365,mo={year:\"{yyyy}\",month:\"{MMM}\",day:\"{d}\",hour:\"{HH}:{mm}\",minute:\"{HH}:{mm}\",second:\"{HH}:{mm}:{ss}\",millisecond:\"{HH}:{mm}:{ss} {SSS}\",none:\"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss} {SSS}\"},Ks=\"{yyyy}-{MM}-{dd}\",Ym={year:\"{yyyy}\",month:\"{yyyy}-{MM}\",day:Ks,hour:Ks+\" \"+mo.hour,minute:Ks+\" \"+mo.minute,second:Ks+\" \"+mo.second,millisecond:mo.none},fc=[\"year\",\"month\",\"day\",\"hour\",\"minute\",\"second\",\"millisecond\"],wb=[\"year\",\"half-year\",\"quarter\",\"month\",\"week\",\"half-week\",\"day\",\"half-day\",\"quarter-day\",\"hour\",\"minute\",\"second\",\"millisecond\"];function ri(e,t){return e+=\"\",\"0000\".substr(0,t-e.length)+e}function ga(e){switch(e){case\"half-year\":case\"quarter\":return\"month\";case\"week\":case\"half-week\":return\"day\";case\"half-day\":case\"quarter-day\":return\"hour\";default:return e}}function J2(e){return e===ga(e)}function tR(e){switch(e){case\"year\":case\"month\":return\"day\";case\"millisecond\":return\"millisecond\";default:return\"second\"}}function Zu(e,t,r,n){var i=Yr(e),a=i[zd(r)](),o=i[ma(r)]()+1,s=Math.floor((o-1)/4)+1,l=i[Qu(r)](),u=i[\"get\"+(r?\"UTC\":\"\")+\"Day\"](),f=i[ns(r)](),c=(f-1)%12+1,v=i[Ju(r)](),h=i[tf(r)](),d=i[ef(r)](),p=n instanceof ce?n:Z2(n||yb)||Q2(),g=p.getModel(\"time\"),m=g.get(\"month\"),y=g.get(\"monthAbbr\"),_=g.get(\"dayOfWeek\"),w=g.get(\"dayOfWeekAbbr\");return(t||\"\").replace(/{yyyy}/g,a+\"\").replace(/{yy}/g,a%100+\"\").replace(/{Q}/g,s+\"\").replace(/{MMMM}/g,m[o-1]).replace(/{MMM}/g,y[o-1]).replace(/{MM}/g,ri(o,2)).replace(/{M}/g,o+\"\").replace(/{dd}/g,ri(l,2)).replace(/{d}/g,l+\"\").replace(/{eeee}/g,_[u]).replace(/{ee}/g,w[u]).replace(/{e}/g,u+\"\").replace(/{HH}/g,ri(f,2)).replace(/{H}/g,f+\"\").replace(/{hh}/g,ri(c+\"\",2)).replace(/{h}/g,c+\"\").replace(/{mm}/g,ri(v,2)).replace(/{m}/g,v+\"\").replace(/{ss}/g,ri(h,2)).replace(/{s}/g,h+\"\").replace(/{SSS}/g,ri(d,3)).replace(/{S}/g,d+\"\")}function eR(e,t,r,n,i){var a=null;if(it(r))a=r;else if(mt(r))a=r(e.value,t,{level:e.level});else{var o=Y({},mo);if(e.level>0)for(var s=0;s<fc.length;++s)o[fc[s]]=\"{primary|\"+o[fc[s]]+\"}\";var l=r?r.inherit===!1?r:Pt(r,o):o,u=bb(e.value,i);if(l[u])a=l[u];else if(l.inherit){for(var f=wb.indexOf(u),s=f-1;s>=0;--s)if(l[u]){a=l[u];break}a=a||o.none}if(et(a)){var c=e.level==null?0:e.level>=0?e.level:a.length+e.level;c=Math.min(c,a.length-1),a=a[c]}}return Zu(new Date(e.value),a,i,n)}function bb(e,t){var r=Yr(e),n=r[ma(t)]()+1,i=r[Qu(t)](),a=r[ns(t)](),o=r[Ju(t)](),s=r[tf(t)](),l=r[ef(t)](),u=l===0,f=u&&s===0,c=f&&o===0,v=c&&a===0,h=v&&i===1,d=h&&n===1;return d?\"year\":h?\"month\":v?\"day\":c?\"hour\":f?\"minute\":u?\"second\":\"millisecond\"}function qm(e,t,r){var n=zt(e)?Yr(e):e;switch(t=t||bb(e,r),t){case\"year\":return n[zd(r)]();case\"half-year\":return n[ma(r)]()>=6?1:0;case\"quarter\":return Math.floor((n[ma(r)]()+1)/4);case\"month\":return n[ma(r)]();case\"day\":return n[Qu(r)]();case\"half-day\":return n[ns(r)]()/24;case\"hour\":return n[ns(r)]();case\"minute\":return n[Ju(r)]();case\"second\":return n[tf(r)]();case\"millisecond\":return n[ef(r)]()}}function zd(e){return e?\"getUTCFullYear\":\"getFullYear\"}function ma(e){return e?\"getUTCMonth\":\"getMonth\"}function Qu(e){return e?\"getUTCDate\":\"getDate\"}function ns(e){return e?\"getUTCHours\":\"getHours\"}function Ju(e){return e?\"getUTCMinutes\":\"getMinutes\"}function tf(e){return e?\"getUTCSeconds\":\"getSeconds\"}function ef(e){return e?\"getUTCMilliseconds\":\"getMilliseconds\"}function rR(e){return e?\"setUTCFullYear\":\"setFullYear\"}function Sb(e){return e?\"setUTCMonth\":\"setMonth\"}function xb(e){return e?\"setUTCDate\":\"setDate\"}function Tb(e){return e?\"setUTCHours\":\"setHours\"}function Cb(e){return e?\"setUTCMinutes\":\"setMinutes\"}function Mb(e){return e?\"setUTCSeconds\":\"setSeconds\"}function Ab(e){return e?\"setUTCMilliseconds\":\"setMilliseconds\"}function Db(e){if(!ZI(e))return it(e)?e:\"-\";var t=(e+\"\").split(\".\");return t[0].replace(/(\\d{1,3})(?=(?:\\d{3})+(?!\\d))/g,\"$1,\")+(t.length>1?\".\"+t[1]:\"\")}function Pb(e,t){return e=(e||\"\").toLowerCase().replace(/-(.)/g,function(r,n){return n.toUpperCase()}),t&&e&&(e=e.charAt(0).toUpperCase()+e.slice(1)),e}var rf=F1,nR=/([&<>\"'])/g,iR={\"&\":\"&amp;\",\"<\":\"&lt;\",\">\":\"&gt;\",'\"':\"&quot;\",\"'\":\"&#39;\"};function Ke(e){return e==null?\"\":(e+\"\").replace(nR,function(t,r){return iR[r]})}function qh(e,t,r){var n=\"{yyyy}-{MM}-{dd} {HH}:{mm}:{ss}\";function i(f){return f&&Tr(f)?f:\"-\"}function a(f){return!!(f!=null&&!isNaN(f)&&isFinite(f))}var o=t===\"time\",s=e instanceof Date;if(o||s){var l=o?Yr(e):e;if(isNaN(+l)){if(s)return\"-\"}else return Zu(l,n,r)}if(t===\"ordinal\")return dh(e)?i(e):zt(e)&&a(e)?e+\"\":\"-\";var u=ru(e);return a(u)?Db(u):dh(e)?i(e):typeof e==\"boolean\"?e+\"\":\"-\"}var Xm=[\"a\",\"b\",\"c\",\"d\",\"e\",\"f\",\"g\"],cc=function(e,t){return\"{\"+e+(t==null?\"\":t)+\"}\"};function Ib(e,t,r){et(t)||(t=[t]);var n=t.length;if(!n)return\"\";for(var i=t[0].$vars||[],a=0;a<i.length;a++){var o=Xm[a];e=e.replace(cc(o),cc(o,0))}for(var s=0;s<n;s++)for(var l=0;l<i.length;l++){var u=t[s][i[l]];e=e.replace(cc(Xm[l],s),r?Ke(u):u)}return e}function aR(e,t){var r=it(e)?{color:e,extraCssText:t}:e||{},n=r.color,i=r.type;t=r.extraCssText;var a=r.renderMode||\"html\";if(!n)return\"\";if(a===\"html\")return i===\"subItem\"?'<span style=\"display:inline-block;vertical-align:middle;margin-right:8px;margin-left:3px;border-radius:4px;width:4px;height:4px;background-color:'+Ke(n)+\";\"+(t||\"\")+'\"></span>':'<span style=\"display:inline-block;margin-right:4px;border-radius:10px;width:10px;height:10px;background-color:'+Ke(n)+\";\"+(t||\"\")+'\"></span>';var o=r.markerId||\"markerX\";return{renderMode:a,content:\"{\"+o+\"|}  \",style:i===\"subItem\"?{width:4,height:4,borderRadius:2,backgroundColor:n}:{width:10,height:10,borderRadius:5,backgroundColor:n}}}function Ti(e,t){return t=t||\"transparent\",it(e)?e:st(e)&&e.colorStops&&(e.colorStops[0]||{}).color||t}function jm(e,t){if(t===\"_blank\"||t===\"blank\"){var r=window.open();r.opener=null,r.location.href=e}else window.open(e,t)}var Rl=I,oR=[\"left\",\"right\",\"top\",\"bottom\",\"width\",\"height\"],Zs=[[\"width\",\"left\",\"right\"],[\"height\",\"top\",\"bottom\"]];function Hd(e,t,r,n,i){var a=0,o=0;n==null&&(n=1/0),i==null&&(i=1/0);var s=0;t.eachChild(function(l,u){var f=l.getBoundingRect(),c=t.childAt(u+1),v=c&&c.getBoundingRect(),h,d;if(e===\"horizontal\"){var p=f.width+(v?-v.x+f.x:0);h=a+p,h>n||l.newline?(a=0,h=p,o+=s+r,s=f.height):s=Math.max(s,f.height)}else{var g=f.height+(v?-v.y+f.y:0);d=o+g,d>i||l.newline?(a+=s+r,o=0,d=g,s=f.width):s=Math.max(s,f.width)}l.newline||(l.x=a,l.y=o,l.markRedraw(),e===\"horizontal\"?a=h+r:o=d+r)})}var No=Hd;Xt(Hd,\"vertical\");Xt(Hd,\"horizontal\");function Ma(e,t,r){r=rf(r||0);var n=t.width,i=t.height,a=Vt(e.left,n),o=Vt(e.top,i),s=Vt(e.right,n),l=Vt(e.bottom,i),u=Vt(e.width,n),f=Vt(e.height,i),c=r[2]+r[0],v=r[1]+r[3],h=e.aspect;switch(isNaN(u)&&(u=n-s-v-a),isNaN(f)&&(f=i-l-c-o),h!=null&&(isNaN(u)&&isNaN(f)&&(h>n/i?u=n*.8:f=i*.8),isNaN(u)&&(u=h*f),isNaN(f)&&(f=u/h)),isNaN(a)&&(a=n-s-u-v),isNaN(o)&&(o=i-l-f-c),e.left||e.right){case\"center\":a=n/2-u/2-r[3];break;case\"right\":a=n-u-v;break}switch(e.top||e.bottom){case\"middle\":case\"center\":o=i/2-f/2-r[0];break;case\"bottom\":o=i-f-c;break}a=a||0,o=o||0,isNaN(u)&&(u=n-v-a-(s||0)),isNaN(f)&&(f=i-c-o-(l||0));var d=new Ot(a+r[3],o+r[0],u,f);return d.margin=r,d}function is(e){var t=e.layoutMode||e.constructor.layoutMode;return st(t)?t:t?{type:t}:null}function Aa(e,t,r){var n=r&&r.ignoreSize;!et(n)&&(n=[n,n]);var i=o(Zs[0],0),a=o(Zs[1],1);u(Zs[0],e,i),u(Zs[1],e,a);function o(f,c){var v={},h=0,d={},p=0,g=2;if(Rl(f,function(_){d[_]=e[_]}),Rl(f,function(_){s(t,_)&&(v[_]=d[_]=t[_]),l(v,_)&&h++,l(d,_)&&p++}),n[c])return l(t,f[1])?d[f[2]]=null:l(t,f[2])&&(d[f[1]]=null),d;if(p===g||!h)return d;if(h>=g)return v;for(var m=0;m<f.length;m++){var y=f[m];if(!s(v,y)&&s(e,y)){v[y]=e[y];break}}return v}function s(f,c){return f.hasOwnProperty(c)}function l(f,c){return f[c]!=null&&f[c]!==\"auto\"}function u(f,c,v){Rl(f,function(h){c[h]=v[h]})}}function nf(e){return sR({},e)}function sR(e,t){return t&&e&&Rl(oR,function(r){t.hasOwnProperty(r)&&(e[r]=t[r])}),e}var lR=Qt(),Ba=function(e){J(t,e);function t(r,n,i){var a=e.call(this,r,n,i)||this;return a.uid=Ku(\"ec_cpt_model\"),a}return t.prototype.init=function(r,n,i){this.mergeDefaultAndTheme(r,i)},t.prototype.mergeDefaultAndTheme=function(r,n){var i=is(this),a=i?nf(r):{},o=n.getTheme();Dt(r,o.get(this.mainType)),Dt(r,this.getDefaultOption()),i&&Aa(r,a,i)},t.prototype.mergeOption=function(r,n){Dt(this.option,r,!0);var i=is(this);i&&Aa(this.option,r,i)},t.prototype.optionUpdated=function(r,n){},t.prototype.getDefaultOption=function(){var r=this.constructor;if(!pE(r))return r.defaultOption;var n=lR(this);if(!n.defaultOption){for(var i=[],a=r;a;){var o=a.prototype.defaultOption;o&&i.push(o),a=a.superClass}for(var s={},l=i.length-1;l>=0;l--)s=Dt(s,i[l],!0);n.defaultOption=s}return n.defaultOption},t.prototype.getReferringComponents=function(r,n){var i=r+\"Index\",a=r+\"Id\";return ys(this.ecModel,r,{index:this.get(i,!0),id:this.get(a,!0)},n)},t.prototype.getBoxLayoutParams=function(){var r=this;return{left:r.get(\"left\"),top:r.get(\"top\"),right:r.get(\"right\"),bottom:r.get(\"bottom\"),width:r.get(\"width\"),height:r.get(\"height\")}},t.prototype.getZLevelKey=function(){return\"\"},t.prototype.setZLevel=function(r){this.option.zlevel=r},t.protoInitialize=function(){var r=t.prototype;r.type=\"component\",r.id=\"\",r.name=\"\",r.mainType=\"\",r.subType=\"\",r.componentIndex=0}(),t}(ce);_w(Ba,ce);Hu(Ba);W2(Ba);Y2(Ba,uR);function uR(e){var t=[];return I(Ba.getClassesByMainType(e),function(r){t=t.concat(r.dependencies||r.prototype.dependencies||[])}),t=ct(t,function(r){return Cr(r).main}),e!==\"dataset\"&&It(t,\"dataset\")<=0&&t.unshift(\"dataset\"),t}var $t=Ba,Eb=\"\";typeof navigator!=\"undefined\"&&(Eb=navigator.platform||\"\");var qi=\"rgba(0, 0, 0, 0.2)\",fR={darkMode:\"auto\",colorBy:\"series\",color:[\"#5470c6\",\"#91cc75\",\"#fac858\",\"#ee6666\",\"#73c0de\",\"#3ba272\",\"#fc8452\",\"#9a60b4\",\"#ea7ccc\"],gradientColor:[\"#f6efa6\",\"#d88273\",\"#bf444c\"],aria:{decal:{decals:[{color:qi,dashArrayX:[1,0],dashArrayY:[2,5],symbolSize:1,rotation:Math.PI/6},{color:qi,symbol:\"circle\",dashArrayX:[[8,8],[0,8,8,0]],dashArrayY:[6,0],symbolSize:.8},{color:qi,dashArrayX:[1,0],dashArrayY:[4,3],rotation:-Math.PI/4},{color:qi,dashArrayX:[[6,6],[0,6,6,0]],dashArrayY:[6,0]},{color:qi,dashArrayX:[[1,0],[1,6]],dashArrayY:[1,0,6,0],rotation:Math.PI/4},{color:qi,symbol:\"triangle\",dashArrayX:[[9,9],[0,9,9,0]],dashArrayY:[7,2],symbolSize:.75}]}},textStyle:{fontFamily:Eb.match(/^Win/)?\"Microsoft YaHei\":\"sans-serif\",fontSize:12,fontStyle:\"normal\",fontWeight:\"normal\"},blendMode:null,stateAnimation:{duration:300,easing:\"cubicOut\"},animation:\"auto\",animationDuration:1e3,animationDurationUpdate:500,animationEasing:\"cubicInOut\",animationEasingUpdate:\"cubicInOut\",animationThreshold:2e3,progressiveThreshold:3e3,progressive:400,hoverLayerThreshold:3e3,useUTC:!1},Lb=_t([\"tooltip\",\"label\",\"itemName\",\"itemId\",\"itemGroupId\",\"seriesName\"]),rr=\"original\",Ae=\"arrayRows\",vr=\"objectRows\",Er=\"keyedColumns\",Dn=\"typedArray\",Rb=\"unknown\",Vr=\"column\",Fa=\"row\",te={Must:1,Might:2,Not:3},Ob=Qt();function cR(e){Ob(e).datasetMap=_t()}function hR(e,t,r){var n={},i=$d(t);if(!i||!e)return n;var a=[],o=[],s=t.ecModel,l=Ob(s).datasetMap,u=i.uid+\"_\"+r.seriesLayoutBy,f,c;e=e.slice(),I(e,function(p,g){var m=st(p)?p:e[g]={name:p};m.type===\"ordinal\"&&f==null&&(f=g,c=d(m)),n[m.name]=[]});var v=l.get(u)||l.set(u,{categoryWayDim:c,valueWayDim:0});I(e,function(p,g){var m=p.name,y=d(p);if(f==null){var _=v.valueWayDim;h(n[m],_,y),h(o,_,y),v.valueWayDim+=y}else if(f===g)h(n[m],0,y),h(a,0,y);else{var _=v.categoryWayDim;h(n[m],_,y),h(o,_,y),v.categoryWayDim+=y}});function h(p,g,m){for(var y=0;y<m;y++)p.push(g+y)}function d(p){var g=p.dimsDef;return g?g.length:1}return a.length&&(n.itemName=a),o.length&&(n.seriesName=o),n}function vR(e,t,r){var n={},i=$d(e);if(!i)return n;var a=t.sourceFormat,o=t.dimensionsDefine,s;(a===vr||a===Er)&&I(o,function(f,c){(st(f)?f.name:f)===\"name\"&&(s=c)});var l=function(){for(var f={},c={},v=[],h=0,d=Math.min(5,r);h<d;h++){var p=Nb(t.data,a,t.seriesLayoutBy,o,t.startIndex,h);v.push(p);var g=p===te.Not;if(g&&f.v==null&&h!==s&&(f.v=h),(f.n==null||f.n===f.v||!g&&v[f.n]===te.Not)&&(f.n=h),m(f)&&v[f.n]!==te.Not)return f;g||(p===te.Might&&c.v==null&&h!==s&&(c.v=h),(c.n==null||c.n===c.v)&&(c.n=h))}function m(y){return y.v!=null&&y.n!=null}return m(f)?f:m(c)?c:null}();if(l){n.value=[l.v];var u=s!=null?s:l.n;n.itemName=[u],n.seriesName=[u]}return n}function $d(e){var t=e.get(\"data\",!0);if(!t)return ys(e.ecModel,\"dataset\",{index:e.get(\"datasetIndex\",!0),id:e.get(\"datasetId\",!0)},ur).models[0]}function dR(e){return!e.get(\"transform\",!0)&&!e.get(\"fromTransformResult\",!0)?[]:ys(e.ecModel,\"dataset\",{index:e.get(\"fromDatasetIndex\",!0),id:e.get(\"fromDatasetId\",!0)},ur).models}function kb(e,t){return Nb(e.data,e.sourceFormat,e.seriesLayoutBy,e.dimensionsDefine,e.startIndex,t)}function Nb(e,t,r,n,i,a){var o,s=5;if(Be(e))return te.Not;var l,u;if(n){var f=n[a];st(f)?(l=f.name,u=f.type):it(f)&&(l=f)}if(u!=null)return u===\"ordinal\"?te.Must:te.Not;if(t===Ae){var c=e;if(r===Fa){for(var v=c[a],h=0;h<(v||[]).length&&h<s;h++)if((o=w(v[i+h]))!=null)return o}else for(var h=0;h<c.length&&h<s;h++){var d=c[i+h];if(d&&(o=w(d[a]))!=null)return o}}else if(t===vr){var p=e;if(!l)return te.Not;for(var h=0;h<p.length&&h<s;h++){var g=p[h];if(g&&(o=w(g[l]))!=null)return o}}else if(t===Er){var m=e;if(!l)return te.Not;var v=m[l];if(!v||Be(v))return te.Not;for(var h=0;h<v.length&&h<s;h++)if((o=w(v[h]))!=null)return o}else if(t===rr)for(var y=e,h=0;h<y.length&&h<s;h++){var g=y[h],_=ms(g);if(!et(_))return te.Not;if((o=w(_[a]))!=null)return o}function w(S){var b=it(S);if(S!=null&&isFinite(S)&&S!==\"\")return b?te.Might:te.Not;if(b&&S!==\"-\")return te.Must}return te.Not}var pR=_t();function gR(e,t,r){var n=pR.get(t);if(!n)return r;var i=n(e);return i?r.concat(i):r}var Km=Qt();Qt();var Vd=function(){function e(){}return e.prototype.getColorFromPalette=function(t,r,n){var i=me(this.get(\"color\",!0)),a=this.get(\"colorLayer\",!0);return yR(this,Km,i,a,t,r,n)},e.prototype.clearColorPalette=function(){_R(this,Km)},e}();function mR(e,t){for(var r=e.length,n=0;n<r;n++)if(e[n].length>t)return e[n];return e[r-1]}function yR(e,t,r,n,i,a,o){a=a||e;var s=t(a),l=s.paletteIdx||0,u=s.paletteNameMap=s.paletteNameMap||{};if(u.hasOwnProperty(i))return u[i];var f=o==null||!n?r:mR(n,o);if(f=f||r,!(!f||!f.length)){var c=f[l];return i&&(u[i]=c),s.paletteIdx=(l+1)%f.length,c}}function _R(e,t){t(e).paletteIdx=0,t(e).paletteNameMap={}}var Qs,Qa,Zm,Qm=\"\\0_ec_inner\",wR=1,Bb=function(e){J(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.init=function(r,n,i,a,o,s){a=a||{},this.option=null,this._theme=new ce(a),this._locale=new ce(o),this._optionManager=s},t.prototype.setOption=function(r,n,i){var a=ey(n);this._optionManager.setOption(r,i,a),this._resetOption(null,a)},t.prototype.resetOption=function(r,n){return this._resetOption(r,ey(n))},t.prototype._resetOption=function(r,n){var i=!1,a=this._optionManager;if(!r||r===\"recreate\"){var o=a.mountOption(r===\"recreate\");!this.option||r===\"recreate\"?Zm(this,o):(this.restoreData(),this._mergeOption(o,n)),i=!0}if((r===\"timeline\"||r===\"media\")&&this.restoreData(),!r||r===\"recreate\"||r===\"timeline\"){var s=a.getTimelineOption(this);s&&(i=!0,this._mergeOption(s,n))}if(!r||r===\"recreate\"||r===\"media\"){var l=a.getMediaOption(this);l.length&&I(l,function(u){i=!0,this._mergeOption(u,n)},this)}return i},t.prototype.mergeOption=function(r){this._mergeOption(r,null)},t.prototype._mergeOption=function(r,n){var i=this.option,a=this._componentsMap,o=this._componentsCount,s=[],l=_t(),u=n&&n.replaceMergeMainTypeMap;cR(this),I(r,function(c,v){c!=null&&($t.hasClass(v)?v&&(s.push(v),l.set(v,!0)):i[v]=i[v]==null?xt(c):Dt(i[v],c,!0))}),u&&u.each(function(c,v){$t.hasClass(v)&&!l.get(v)&&(s.push(v),l.set(v,!0))}),$t.topologicalTravel(s,$t.getAllClassMainTypes(),f,this);function f(c){var v=gR(this,c,me(r[c])),h=a.get(c),d=h?u&&u.get(c)?\"replaceMerge\":\"normalMerge\":\"replaceAll\",p=tE(h,v,d);sE(p,c,$t),i[c]=null,a.set(c,null),o.set(c,0);var g=[],m=[],y=0,_;I(p,function(w,S){var b=w.existing,x=w.newOption;if(!x)b&&(b.mergeOption({},this),b.optionUpdated({},!1));else{var T=c===\"series\",C=$t.getClass(c,w.keyInfo.subType,!T);if(!C)return;if(c===\"tooltip\"){if(_)return;_=!0}if(b&&b.constructor===C)b.name=w.keyInfo.name,b.mergeOption(x,this),b.optionUpdated(x,!1);else{var D=Y({componentIndex:S},w.keyInfo);b=new C(x,this,this,D),Y(b,D),w.brandNew&&(b.__requireNewView=!0),b.init(x,this,this),b.optionUpdated(null,!0)}}b?(g.push(b.option),m.push(b),y++):(g.push(void 0),m.push(void 0))},this),i[c]=g,a.set(c,m),o.set(c,y),c===\"series\"&&Qs(this)}this._seriesIndices||Qs(this)},t.prototype.getOption=function(){var r=xt(this.option);return I(r,function(n,i){if($t.hasClass(i)){for(var a=me(n),o=a.length,s=!1,l=o-1;l>=0;l--)a[l]&&!ts(a[l])?s=!0:(a[l]=null,!s&&o--);a.length=o,r[i]=a}}),delete r[Qm],r},t.prototype.getTheme=function(){return this._theme},t.prototype.getLocaleModel=function(){return this._locale},t.prototype.setUpdatePayload=function(r){this._payload=r},t.prototype.getUpdatePayload=function(){return this._payload},t.prototype.getComponent=function(r,n){var i=this._componentsMap.get(r);if(i){var a=i[n||0];if(a)return a;if(n==null){for(var o=0;o<i.length;o++)if(i[o])return i[o]}}},t.prototype.queryComponents=function(r){var n=r.mainType;if(!n)return[];var i=r.index,a=r.id,o=r.name,s=this._componentsMap.get(n);if(!s||!s.length)return[];var l;return i!=null?(l=[],I(me(i),function(u){s[u]&&l.push(s[u])})):a!=null?l=Jm(\"id\",a,s):o!=null?l=Jm(\"name\",o,s):l=Se(s,function(u){return!!u}),ty(l,r)},t.prototype.findComponents=function(r){var n=r.query,i=r.mainType,a=s(n),o=a?this.queryComponents(a):Se(this._componentsMap.get(i),function(u){return!!u});return l(ty(o,r));function s(u){var f=i+\"Index\",c=i+\"Id\",v=i+\"Name\";return u&&(u[f]!=null||u[c]!=null||u[v]!=null)?{mainType:i,index:u[f],id:u[c],name:u[v]}:null}function l(u){return r.filter?Se(u,r.filter):u}},t.prototype.eachComponent=function(r,n,i){var a=this._componentsMap;if(mt(r)){var o=n,s=r;a.each(function(c,v){for(var h=0;c&&h<c.length;h++){var d=c[h];d&&s.call(o,v,d,d.componentIndex)}})}else for(var l=it(r)?a.get(r):st(r)?this.findComponents(r):null,u=0;l&&u<l.length;u++){var f=l[u];f&&n.call(i,f,f.componentIndex)}},t.prototype.getSeriesByName=function(r){var n=Mr(r,null);return Se(this._componentsMap.get(\"series\"),function(i){return!!i&&n!=null&&i.name===n})},t.prototype.getSeriesByIndex=function(r){return this._componentsMap.get(\"series\")[r]},t.prototype.getSeriesByType=function(r){return Se(this._componentsMap.get(\"series\"),function(n){return!!n&&n.subType===r})},t.prototype.getSeries=function(){return Se(this._componentsMap.get(\"series\"),function(r){return!!r})},t.prototype.getSeriesCount=function(){return this._componentsCount.get(\"series\")},t.prototype.eachSeries=function(r,n){Qa(this),I(this._seriesIndices,function(i){var a=this._componentsMap.get(\"series\")[i];r.call(n,a,i)},this)},t.prototype.eachRawSeries=function(r,n){I(this._componentsMap.get(\"series\"),function(i){i&&r.call(n,i,i.componentIndex)})},t.prototype.eachSeriesByType=function(r,n,i){Qa(this),I(this._seriesIndices,function(a){var o=this._componentsMap.get(\"series\")[a];o.subType===r&&n.call(i,o,a)},this)},t.prototype.eachRawSeriesByType=function(r,n,i){return I(this.getSeriesByType(r),n,i)},t.prototype.isSeriesFiltered=function(r){return Qa(this),this._seriesIndicesMap.get(r.componentIndex)==null},t.prototype.getCurrentSeriesIndices=function(){return(this._seriesIndices||[]).slice()},t.prototype.filterSeries=function(r,n){Qa(this);var i=[];I(this._seriesIndices,function(a){var o=this._componentsMap.get(\"series\")[a];r.call(n,o,a)&&i.push(a)},this),this._seriesIndices=i,this._seriesIndicesMap=_t(i)},t.prototype.restoreData=function(r){Qs(this);var n=this._componentsMap,i=[];n.each(function(a,o){$t.hasClass(o)&&i.push(o)}),$t.topologicalTravel(i,$t.getAllClassMainTypes(),function(a){I(n.get(a),function(o){o&&(a!==\"series\"||!bR(o,r))&&o.restoreData()})})},t.internalField=function(){Qs=function(r){var n=r._seriesIndices=[];I(r._componentsMap.get(\"series\"),function(i){i&&n.push(i.componentIndex)}),r._seriesIndicesMap=_t(n)},Qa=function(r){},Zm=function(r,n){r.option={},r.option[Qm]=wR,r._componentsMap=_t({series:[]}),r._componentsCount=_t();var i=n.aria;st(i)&&i.enabled==null&&(i.enabled=!0),SR(n,r._theme.option),Dt(n,fR,!1),r._mergeOption(n,null)}}(),t}(ce);function bR(e,t){if(t){var r=t.seriesIndex,n=t.seriesId,i=t.seriesName;return r!=null&&e.componentIndex!==r||n!=null&&e.id!==n||i!=null&&e.name!==i}}function SR(e,t){var r=e.color&&!e.colorLayer;I(t,function(n,i){i===\"colorLayer\"&&r||$t.hasClass(i)||(typeof n==\"object\"?e[i]=e[i]?Dt(e[i],n,!1):xt(n):e[i]==null&&(e[i]=n))})}function Jm(e,t,r){if(et(t)){var n=_t();return I(t,function(a){if(a!=null){var o=Mr(a,null);o!=null&&n.set(a,!0)}}),Se(r,function(a){return a&&n.get(a[e])})}else{var i=Mr(t,null);return Se(r,function(a){return a&&i!=null&&a[e]===i})}}function ty(e,t){return t.hasOwnProperty(\"subType\")?Se(e,function(r){return r&&r.subType===t.subType}):e}function ey(e){var t=_t();return e&&I(me(e.replaceMerge),function(r){t.set(r,!0)}),{replaceMergeMainTypeMap:t}}Pr(Bb,Vd);var Fb=Bb,xR=[\"getDom\",\"getZr\",\"getWidth\",\"getHeight\",\"getDevicePixelRatio\",\"dispatchAction\",\"isSSR\",\"isDisposed\",\"on\",\"off\",\"getDataURL\",\"getConnectedDataURL\",\"getOption\",\"getId\",\"updateLabelLayout\"],TR=function(){function e(t){I(xR,function(r){this[r]=Ft(t[r],t)},this)}return e}(),zb=TR,hc={},CR=function(){function e(){this._coordinateSystems=[]}return e.prototype.create=function(t,r){var n=[];I(hc,function(i,a){var o=i.create(t,r);n=n.concat(o||[])}),this._coordinateSystems=n},e.prototype.update=function(t,r){I(this._coordinateSystems,function(n){n.update&&n.update(t,r)})},e.prototype.getCoordinateSystems=function(){return this._coordinateSystems.slice()},e.register=function(t,r){hc[t]=r},e.get=function(t){return hc[t]},e}(),Gd=CR,MR=/^(min|max)?(.+)$/,AR=function(){function e(t){this._timelineOptions=[],this._mediaList=[],this._currentMediaIndices=[],this._api=t}return e.prototype.setOption=function(t,r,n){t&&(I(me(t.series),function(o){o&&o.data&&Be(o.data)&&ph(o.data)}),I(me(t.dataset),function(o){o&&o.source&&Be(o.source)&&ph(o.source)})),t=xt(t);var i=this._optionBackup,a=DR(t,r,!i);this._newBaseOption=a.baseOption,i?(a.timelineOptions.length&&(i.timelineOptions=a.timelineOptions),a.mediaList.length&&(i.mediaList=a.mediaList),a.mediaDefault&&(i.mediaDefault=a.mediaDefault)):this._optionBackup=a},e.prototype.mountOption=function(t){var r=this._optionBackup;return this._timelineOptions=r.timelineOptions,this._mediaList=r.mediaList,this._mediaDefault=r.mediaDefault,this._currentMediaIndices=[],xt(t?r.baseOption:this._newBaseOption)},e.prototype.getTimelineOption=function(t){var r,n=this._timelineOptions;if(n.length){var i=t.getComponent(\"timeline\");i&&(r=xt(n[i.getCurrentIndex()]))}return r},e.prototype.getMediaOption=function(t){var r=this._api.getWidth(),n=this._api.getHeight(),i=this._mediaList,a=this._mediaDefault,o=[],s=[];if(!i.length&&!a)return s;for(var l=0,u=i.length;l<u;l++)PR(i[l].query,r,n)&&o.push(l);return!o.length&&a&&(o=[-1]),o.length&&!ER(o,this._currentMediaIndices)&&(s=ct(o,function(f){return xt(f===-1?a.option:i[f].option)})),this._currentMediaIndices=o,s},e}();function DR(e,t,r){var n=[],i,a,o=e.baseOption,s=e.timeline,l=e.options,u=e.media,f=!!e.media,c=!!(l||s||o&&o.timeline);o?(a=o,a.timeline||(a.timeline=s)):((c||f)&&(e.options=e.media=null),a=e),f&&et(u)&&I(u,function(h){h&&h.option&&(h.query?n.push(h):i||(i=h))}),v(a),I(l,function(h){return v(h)}),I(n,function(h){return v(h.option)});function v(h){I(t,function(d){d(h,r)})}return{baseOption:a,timelineOptions:l||[],mediaDefault:i,mediaList:n}}function PR(e,t,r){var n={width:t,height:r,aspectratio:t/r},i=!0;return I(e,function(a,o){var s=o.match(MR);if(!(!s||!s[1]||!s[2])){var l=s[1],u=s[2].toLowerCase();IR(n[u],a,l)||(i=!1)}}),i}function IR(e,t,r){return r===\"min\"?e>=t:r===\"max\"?e<=t:e===t}function ER(e,t){return e.join(\",\")===t.join(\",\")}var LR=AR,ir=I,as=st,ry=[\"areaStyle\",\"lineStyle\",\"nodeStyle\",\"linkStyle\",\"chordStyle\",\"label\",\"labelLine\"];function vc(e){var t=e&&e.itemStyle;if(!!t)for(var r=0,n=ry.length;r<n;r++){var i=ry[r],a=t.normal,o=t.emphasis;a&&a[i]&&(e[i]=e[i]||{},e[i].normal?Dt(e[i].normal,a[i]):e[i].normal=a[i],a[i]=null),o&&o[i]&&(e[i]=e[i]||{},e[i].emphasis?Dt(e[i].emphasis,o[i]):e[i].emphasis=o[i],o[i]=null)}}function ue(e,t,r){if(e&&e[t]&&(e[t].normal||e[t].emphasis)){var n=e[t].normal,i=e[t].emphasis;n&&(r?(e[t].normal=e[t].emphasis=null,Pt(e[t],n)):e[t]=n),i&&(e.emphasis=e.emphasis||{},e.emphasis[t]=i,i.focus&&(e.emphasis.focus=i.focus),i.blurScope&&(e.emphasis.blurScope=i.blurScope))}}function yo(e){ue(e,\"itemStyle\"),ue(e,\"lineStyle\"),ue(e,\"areaStyle\"),ue(e,\"label\"),ue(e,\"labelLine\"),ue(e,\"upperLabel\"),ue(e,\"edgeLabel\")}function qt(e,t){var r=as(e)&&e[t],n=as(r)&&r.textStyle;if(n)for(var i=0,a=rm.length;i<a;i++){var o=rm[i];n.hasOwnProperty(o)&&(r[o]=n[o])}}function We(e){e&&(yo(e),qt(e,\"label\"),e.emphasis&&qt(e.emphasis,\"label\"))}function RR(e){if(!!as(e)){vc(e),yo(e),qt(e,\"label\"),qt(e,\"upperLabel\"),qt(e,\"edgeLabel\"),e.emphasis&&(qt(e.emphasis,\"label\"),qt(e.emphasis,\"upperLabel\"),qt(e.emphasis,\"edgeLabel\"));var t=e.markPoint;t&&(vc(t),We(t));var r=e.markLine;r&&(vc(r),We(r));var n=e.markArea;n&&We(n);var i=e.data;if(e.type===\"graph\"){i=i||e.nodes;var a=e.links||e.edges;if(a&&!Be(a))for(var o=0;o<a.length;o++)We(a[o]);I(e.categories,function(u){yo(u)})}if(i&&!Be(i))for(var o=0;o<i.length;o++)We(i[o]);if(t=e.markPoint,t&&t.data)for(var s=t.data,o=0;o<s.length;o++)We(s[o]);if(r=e.markLine,r&&r.data)for(var l=r.data,o=0;o<l.length;o++)et(l[o])?(We(l[o][0]),We(l[o][1])):We(l[o]);e.type===\"gauge\"?(qt(e,\"axisLabel\"),qt(e,\"title\"),qt(e,\"detail\")):e.type===\"treemap\"?(ue(e.breadcrumb,\"itemStyle\"),I(e.levels,function(u){yo(u)})):e.type===\"tree\"&&yo(e.leaves)}}function Rr(e){return et(e)?e:e?[e]:[]}function ny(e){return(et(e)?e[0]:e)||{}}function OR(e,t){ir(Rr(e.series),function(n){as(n)&&RR(n)});var r=[\"xAxis\",\"yAxis\",\"radiusAxis\",\"angleAxis\",\"singleAxis\",\"parallelAxis\",\"radar\"];t&&r.push(\"valueAxis\",\"categoryAxis\",\"logAxis\",\"timeAxis\"),ir(r,function(n){ir(Rr(e[n]),function(i){i&&(qt(i,\"axisLabel\"),qt(i.axisPointer,\"label\"))})}),ir(Rr(e.parallel),function(n){var i=n&&n.parallelAxisDefault;qt(i,\"axisLabel\"),qt(i&&i.axisPointer,\"label\")}),ir(Rr(e.calendar),function(n){ue(n,\"itemStyle\"),qt(n,\"dayLabel\"),qt(n,\"monthLabel\"),qt(n,\"yearLabel\")}),ir(Rr(e.radar),function(n){qt(n,\"name\"),n.name&&n.axisName==null&&(n.axisName=n.name,delete n.name),n.nameGap!=null&&n.axisNameGap==null&&(n.axisNameGap=n.nameGap,delete n.nameGap)}),ir(Rr(e.geo),function(n){as(n)&&(We(n),ir(Rr(n.regions),function(i){We(i)}))}),ir(Rr(e.timeline),function(n){We(n),ue(n,\"label\"),ue(n,\"itemStyle\"),ue(n,\"controlStyle\",!0);var i=n.data;et(i)&&I(i,function(a){st(a)&&(ue(a,\"label\"),ue(a,\"itemStyle\"))})}),ir(Rr(e.toolbox),function(n){ue(n,\"iconStyle\"),ir(n.feature,function(i){ue(i,\"iconStyle\")})}),qt(ny(e.axisPointer),\"label\"),qt(ny(e.tooltip).axisPointer,\"label\")}function kR(e,t){for(var r=t.split(\",\"),n=e,i=0;i<r.length&&(n=n&&n[r[i]],n!=null);i++);return n}function NR(e,t,r,n){for(var i=t.split(\",\"),a=e,o,s=0;s<i.length-1;s++)o=i[s],a[o]==null&&(a[o]={}),a=a[o];(n||a[i[s]]==null)&&(a[i[s]]=r)}function iy(e){e&&I(BR,function(t){t[0]in e&&!(t[1]in e)&&(e[t[1]]=e[t[0]])})}var BR=[[\"x\",\"left\"],[\"y\",\"top\"],[\"x2\",\"right\"],[\"y2\",\"bottom\"]],FR=[\"grid\",\"geo\",\"parallel\",\"legend\",\"toolbox\",\"title\",\"visualMap\",\"dataZoom\",\"timeline\"],dc=[[\"borderRadius\",\"barBorderRadius\"],[\"borderColor\",\"barBorderColor\"],[\"borderWidth\",\"barBorderWidth\"]];function Ja(e){var t=e&&e.itemStyle;if(t)for(var r=0;r<dc.length;r++){var n=dc[r][1],i=dc[r][0];t[n]!=null&&(t[i]=t[n])}}function ay(e){!e||e.alignTo===\"edge\"&&e.margin!=null&&e.edgeDistance==null&&(e.edgeDistance=e.margin)}function oy(e){!e||e.downplay&&!e.blur&&(e.blur=e.downplay)}function zR(e){!e||e.focusNodeAdjacency!=null&&(e.emphasis=e.emphasis||{},e.emphasis.focus==null&&(e.emphasis.focus=\"adjacency\"))}function Hb(e,t){if(e)for(var r=0;r<e.length;r++)t(e[r]),e[r]&&Hb(e[r].children,t)}function $b(e,t){OR(e,t),e.series=me(e.series),I(e.series,function(r){if(!!st(r)){var n=r.type;if(n===\"line\")r.clipOverflow!=null&&(r.clip=r.clipOverflow);else if(n===\"pie\"||n===\"gauge\"){r.clockWise!=null&&(r.clockwise=r.clockWise),ay(r.label);var i=r.data;if(i&&!Be(i))for(var a=0;a<i.length;a++)ay(i[a]);r.hoverOffset!=null&&(r.emphasis=r.emphasis||{},(r.emphasis.scaleSize=null)&&(r.emphasis.scaleSize=r.hoverOffset))}else if(n===\"gauge\"){var o=kR(r,\"pointer.color\");o!=null&&NR(r,\"itemStyle.color\",o)}else if(n===\"bar\"){Ja(r),Ja(r.backgroundStyle),Ja(r.emphasis);var i=r.data;if(i&&!Be(i))for(var a=0;a<i.length;a++)typeof i[a]==\"object\"&&(Ja(i[a]),Ja(i[a]&&i[a].emphasis))}else if(n===\"sunburst\"){var s=r.highlightPolicy;s&&(r.emphasis=r.emphasis||{},r.emphasis.focus||(r.emphasis.focus=s)),oy(r),Hb(r.data,oy)}else n===\"graph\"||n===\"sankey\"?zR(r):n===\"map\"&&(r.mapType&&!r.map&&(r.map=r.mapType),r.mapLocation&&Pt(r,r.mapLocation));r.hoverAnimation!=null&&(r.emphasis=r.emphasis||{},r.emphasis&&r.emphasis.scale==null&&(r.emphasis.scale=r.hoverAnimation)),iy(r)}}),e.dataRange&&(e.visualMap=e.dataRange),I(FR,function(r){var n=e[r];n&&(et(n)||(n=[n]),I(n,function(i){iy(i)}))})}function HR(e){var t=_t();e.eachSeries(function(r){var n=r.get(\"stack\");if(n){var i=t.get(n)||t.set(n,[]),a=r.getData(),o={stackResultDimension:a.getCalculationInfo(\"stackResultDimension\"),stackedOverDimension:a.getCalculationInfo(\"stackedOverDimension\"),stackedDimension:a.getCalculationInfo(\"stackedDimension\"),stackedByDimension:a.getCalculationInfo(\"stackedByDimension\"),isStackedByIndex:a.getCalculationInfo(\"isStackedByIndex\"),data:a,seriesModel:r};if(!o.stackedDimension||!(o.isStackedByIndex||o.stackedByDimension))return;i.length&&a.setCalculationInfo(\"stackedOnSeries\",i[i.length-1].seriesModel),i.push(o)}}),t.each($R)}function $R(e){I(e,function(t,r){var n=[],i=[NaN,NaN],a=[t.stackResultDimension,t.stackedOverDimension],o=t.data,s=t.isStackedByIndex;o.modify(a,function(l,u,f){var c=o.get(t.stackedDimension,f);if(isNaN(c))return i;var v,h;s?h=o.getRawIndex(f):v=o.get(t.stackedByDimension,f);for(var d=NaN,p=r-1;p>=0;p--){var g=e[p];if(s||(h=g.data.rawIndexOf(g.stackedByDimension,v)),h>=0){var m=g.data.getByRawIndex(g.stackResultDimension,h);if(c>=0&&m>0||c<=0&&m<0){c=XI(c,m),d=m;break}}}return n[0]=c,n[1]=d,n})})}var af=function(){function e(t){this.data=t.data||(t.sourceFormat===Er?{}:[]),this.sourceFormat=t.sourceFormat||Rb,this.seriesLayoutBy=t.seriesLayoutBy||Vr,this.startIndex=t.startIndex||0,this.dimensionsDetectedCount=t.dimensionsDetectedCount,this.metaRawOption=t.metaRawOption;var r=this.dimensionsDefine=t.dimensionsDefine;if(r)for(var n=0;n<r.length;n++){var i=r[n];i.type==null&&kb(this,n)===te.Must&&(i.type=\"ordinal\")}}return e}();function Ud(e){return e instanceof af}function Xh(e,t,r){r=r||Vb(e);var n=t.seriesLayoutBy,i=GR(e,r,n,t.sourceHeader,t.dimensions),a=new af({data:e,sourceFormat:r,seriesLayoutBy:n,dimensionsDefine:i.dimensionsDefine,startIndex:i.startIndex,dimensionsDetectedCount:i.dimensionsDetectedCount,metaRawOption:xt(t)});return a}function Wd(e){return new af({data:e,sourceFormat:Be(e)?Dn:rr})}function VR(e){return new af({data:e.data,sourceFormat:e.sourceFormat,seriesLayoutBy:e.seriesLayoutBy,dimensionsDefine:xt(e.dimensionsDefine),startIndex:e.startIndex,dimensionsDetectedCount:e.dimensionsDetectedCount})}function Vb(e){var t=Rb;if(Be(e))t=Dn;else if(et(e)){e.length===0&&(t=Ae);for(var r=0,n=e.length;r<n;r++){var i=e[r];if(i!=null){if(et(i)){t=Ae;break}else if(st(i)){t=vr;break}}}}else if(st(e)){for(var a in e)if(Ca(e,a)&&Me(e[a])){t=Er;break}}return t}function GR(e,t,r,n,i){var a,o;if(!e)return{dimensionsDefine:sy(i),startIndex:o,dimensionsDetectedCount:a};if(t===Ae){var s=e;n===\"auto\"||n==null?ly(function(u){u!=null&&u!==\"-\"&&(it(u)?o==null&&(o=1):o=0)},r,s,10):o=zt(n)?n:n?1:0,!i&&o===1&&(i=[],ly(function(u,f){i[f]=u!=null?u+\"\":\"\"},r,s,1/0)),a=i?i.length:r===Fa?s.length:s[0]?s[0].length:null}else if(t===vr)i||(i=UR(e));else if(t===Er)i||(i=[],I(e,function(u,f){i.push(f)}));else if(t===rr){var l=ms(e[0]);a=et(l)&&l.length||1}return{startIndex:o,dimensionsDefine:sy(i),dimensionsDetectedCount:a}}function UR(e){for(var t=0,r;t<e.length&&!(r=e[t++]););if(r){var n=[];return I(r,function(i,a){n.push(a)}),n}}function sy(e){if(!!e){var t=_t();return ct(e,function(r,n){r=st(r)?r:{name:r};var i={name:r.name,displayName:r.displayName,type:r.type};if(i.name==null)return i;i.name+=\"\",i.displayName==null&&(i.displayName=i.name);var a=t.get(i.name);return a?i.name+=\"-\"+a.count++:t.set(i.name,{count:1}),i})}}function ly(e,t,r,n){if(t===Fa)for(var i=0;i<r.length&&i<n;i++)e(r[i]?r[i][0]:null,i);else for(var a=r[0]||[],i=0;i<a.length&&i<n;i++)e(a[i],i)}function Gb(e){var t=e.sourceFormat;return t===vr||t===Er}var ni,ii,ai,uy,fy,Ub=function(){function e(t,r){var n=Ud(t)?t:Wd(t);this._source=n;var i=this._data=n.data;n.sourceFormat===Dn&&(this._offset=0,this._dimSize=r,this._data=i),fy(this,i,n)}return e.prototype.getSource=function(){return this._source},e.prototype.count=function(){return 0},e.prototype.getItem=function(t,r){},e.prototype.appendData=function(t){},e.prototype.clean=function(){},e.protoInitialize=function(){var t=e.prototype;t.pure=!1,t.persistent=!0}(),e.internalField=function(){var t;fy=function(o,s,l){var u=l.sourceFormat,f=l.seriesLayoutBy,c=l.startIndex,v=l.dimensionsDefine,h=uy[Yd(u,f)];if(Y(o,h),u===Dn)o.getItem=r,o.count=i,o.fillStorage=n;else{var d=Wb(u,f);o.getItem=Ft(d,null,s,c,v);var p=Yb(u,f);o.count=Ft(p,null,s,c,v)}};var r=function(o,s){o=o-this._offset,s=s||[];for(var l=this._data,u=this._dimSize,f=u*o,c=0;c<u;c++)s[c]=l[f+c];return s},n=function(o,s,l,u){for(var f=this._data,c=this._dimSize,v=0;v<c;v++){for(var h=u[v],d=h[0]==null?1/0:h[0],p=h[1]==null?-1/0:h[1],g=s-o,m=l[v],y=0;y<g;y++){var _=f[y*c+v];m[o+y]=_,_<d&&(d=_),_>p&&(p=_)}h[0]=d,h[1]=p}},i=function(){return this._data?this._data.length/this._dimSize:0};uy=(t={},t[Ae+\"_\"+Vr]={pure:!0,appendData:a},t[Ae+\"_\"+Fa]={pure:!0,appendData:function(){throw new Error('Do not support appendData when set seriesLayoutBy: \"row\".')}},t[vr]={pure:!0,appendData:a},t[Er]={pure:!0,appendData:function(o){var s=this._data;I(o,function(l,u){for(var f=s[u]||(s[u]=[]),c=0;c<(l||[]).length;c++)f.push(l[c])})}},t[rr]={appendData:a},t[Dn]={persistent:!1,pure:!0,appendData:function(o){this._data=o},clean:function(){this._offset+=this.count(),this._data=null}},t);function a(o){for(var s=0;s<o.length;s++)this._data.push(o[s])}}(),e}(),cy=function(e,t,r,n){return e[n]},WR=(ni={},ni[Ae+\"_\"+Vr]=function(e,t,r,n){return e[n+t]},ni[Ae+\"_\"+Fa]=function(e,t,r,n,i){n+=t;for(var a=i||[],o=e,s=0;s<o.length;s++){var l=o[s];a[s]=l?l[n]:null}return a},ni[vr]=cy,ni[Er]=function(e,t,r,n,i){for(var a=i||[],o=0;o<r.length;o++){var s=r[o].name,l=e[s];a[o]=l?l[n]:null}return a},ni[rr]=cy,ni);function Wb(e,t){var r=WR[Yd(e,t)];return r}var hy=function(e,t,r){return e.length},YR=(ii={},ii[Ae+\"_\"+Vr]=function(e,t,r){return Math.max(0,e.length-t)},ii[Ae+\"_\"+Fa]=function(e,t,r){var n=e[0];return n?Math.max(0,n.length-t):0},ii[vr]=hy,ii[Er]=function(e,t,r){var n=r[0].name,i=e[n];return i?i.length:0},ii[rr]=hy,ii);function Yb(e,t){var r=YR[Yd(e,t)];return r}var pc=function(e,t,r){return e[t]},qR=(ai={},ai[Ae]=pc,ai[vr]=function(e,t,r){return e[r]},ai[Er]=pc,ai[rr]=function(e,t,r){var n=ms(e);return n instanceof Array?n[t]:n},ai[Dn]=pc,ai);function qb(e){var t=qR[e];return t}function Yd(e,t){return e===Ae?e+\"_\"+t:e}function Da(e,t,r){if(!!e){var n=e.getRawDataItem(t);if(n!=null){var i=e.getStore(),a=i.getSource().sourceFormat;if(r!=null){var o=e.getDimensionIndex(r),s=i.getDimensionProperty(o);return qb(a)(n,o,s)}else{var l=n;return a===rr&&(l=ms(n)),l}}}}var XR=/\\{@(.+?)\\}/g,jR=function(){function e(){}return e.prototype.getDataParams=function(t,r){var n=this.getData(r),i=this.getRawValue(t,r),a=n.getRawIndex(t),o=n.getName(t),s=n.getRawDataItem(t),l=n.getItemVisual(t,\"style\"),u=l&&l[n.getItemVisual(t,\"drawType\")||\"fill\"],f=l&&l.stroke,c=this.mainType,v=c===\"series\",h=n.userOutput&&n.userOutput.get();return{componentType:c,componentSubType:this.subType,componentIndex:this.componentIndex,seriesType:v?this.subType:null,seriesIndex:this.seriesIndex,seriesId:v?this.id:null,seriesName:v?this.name:null,name:o,dataIndex:a,data:s,dataType:r,value:i,color:u,borderColor:f,dimensionNames:h?h.fullDimensions:null,encode:h?h.encode:null,$vars:[\"seriesName\",\"name\",\"value\"]}},e.prototype.getFormattedLabel=function(t,r,n,i,a,o){r=r||\"normal\";var s=this.getData(n),l=this.getDataParams(t,n);if(o&&(l.value=o.interpolatedValue),i!=null&&et(l.value)&&(l.value=l.value[i]),!a){var u=s.getItemModel(t);a=u.get(r===\"normal\"?[\"label\",\"formatter\"]:[r,\"label\",\"formatter\"])}if(mt(a))return l.status=r,l.dimensionIndex=i,a(l);if(it(a)){var f=Ib(a,l);return f.replace(XR,function(c,v){var h=v.length,d=v;d.charAt(0)===\"[\"&&d.charAt(h-1)===\"]\"&&(d=+d.slice(1,h-1));var p=Da(s,t,d);if(o&&et(o.interpolatedValue)){var g=s.getDimensionIndex(d);g>=0&&(p=o.interpolatedValue[g])}return p!=null?p+\"\":\"\"})}},e.prototype.getRawValue=function(t,r){return Da(this.getData(r),t)},e.prototype.formatTooltip=function(t,r,n){},e}();function vy(e){var t,r;return st(e)?e.type&&(r=e):t=e,{text:t,frag:r}}function Bo(e){return new KR(e)}var KR=function(){function e(t){t=t||{},this._reset=t.reset,this._plan=t.plan,this._count=t.count,this._onDirty=t.onDirty,this._dirty=!0}return e.prototype.perform=function(t){var r=this._upstream,n=t&&t.skip;if(this._dirty&&r){var i=this.context;i.data=i.outputData=r.context.outputData}this.__pipeline&&(this.__pipeline.currentTask=this);var a;this._plan&&!n&&(a=this._plan(this.context));var o=f(this._modBy),s=this._modDataCount||0,l=f(t&&t.modBy),u=t&&t.modDataCount||0;(o!==l||s!==u)&&(a=\"reset\");function f(y){return!(y>=1)&&(y=1),y}var c;(this._dirty||a===\"reset\")&&(this._dirty=!1,c=this._doReset(n)),this._modBy=l,this._modDataCount=u;var v=t&&t.step;if(r?this._dueEnd=r._outputDueEnd:this._dueEnd=this._count?this._count(this.context):1/0,this._progress){var h=this._dueIndex,d=Math.min(v!=null?this._dueIndex+v:1/0,this._dueEnd);if(!n&&(c||h<d)){var p=this._progress;if(et(p))for(var g=0;g<p.length;g++)this._doProgress(p[g],h,d,l,u);else this._doProgress(p,h,d,l,u)}this._dueIndex=d;var m=this._settedOutputEnd!=null?this._settedOutputEnd:d;this._outputDueEnd=m}else this._dueIndex=this._outputDueEnd=this._settedOutputEnd!=null?this._settedOutputEnd:this._dueEnd;return this.unfinished()},e.prototype.dirty=function(){this._dirty=!0,this._onDirty&&this._onDirty(this.context)},e.prototype._doProgress=function(t,r,n,i,a){dy.reset(r,n,i,a),this._callingProgress=t,this._callingProgress({start:r,end:n,count:n-r,next:dy.next},this.context)},e.prototype._doReset=function(t){this._dueIndex=this._outputDueEnd=this._dueEnd=0,this._settedOutputEnd=null;var r,n;!t&&this._reset&&(r=this._reset(this.context),r&&r.progress&&(n=r.forceFirstProgress,r=r.progress),et(r)&&!r.length&&(r=null)),this._progress=r,this._modBy=this._modDataCount=null;var i=this._downstream;return i&&i.dirty(),n},e.prototype.unfinished=function(){return this._progress&&this._dueIndex<this._dueEnd},e.prototype.pipe=function(t){(this._downstream!==t||this._dirty)&&(this._downstream=t,t._upstream=this,t.dirty())},e.prototype.dispose=function(){this._disposed||(this._upstream&&(this._upstream._downstream=null),this._downstream&&(this._downstream._upstream=null),this._dirty=!1,this._disposed=!0)},e.prototype.getUpstream=function(){return this._upstream},e.prototype.getDownstream=function(){return this._downstream},e.prototype.setOutputEnd=function(t){this._outputDueEnd=this._settedOutputEnd=t},e}(),dy=function(){var e,t,r,n,i,a={reset:function(l,u,f,c){t=l,e=u,r=f,n=c,i=Math.ceil(n/r),a.next=r>1&&n>0?s:o}};return a;function o(){return t<e?t++:null}function s(){var l=t%i*r+Math.ceil(t/i),u=t>=e?null:l<n?l:t;return t++,u}}();function Ol(e,t){var r=t&&t.type;return r===\"ordinal\"?e:(r===\"time\"&&!zt(e)&&e!=null&&e!==\"-\"&&(e=+Yr(e)),e==null||e===\"\"?NaN:+e)}_t({number:function(e){return parseFloat(e)},time:function(e){return+Yr(e)},trim:function(e){return it(e)?Tr(e):e}});var ZR=function(){function e(t,r){var n=t===\"desc\";this._resultLT=n?1:-1,r==null&&(r=n?\"min\":\"max\"),this._incomparable=r===\"min\"?-1/0:1/0}return e.prototype.evaluate=function(t,r){var n=zt(t)?t:ru(t),i=zt(r)?r:ru(r),a=isNaN(n),o=isNaN(i);if(a&&(n=this._incomparable),o&&(i=this._incomparable),a&&o){var s=it(t),l=it(r);s&&(n=l?t:0),l&&(i=s?r:0)}return n<i?this._resultLT:n>i?-this._resultLT:0},e}(),QR=function(){function e(){}return e.prototype.getRawData=function(){throw new Error(\"not supported\")},e.prototype.getRawDataItem=function(t){throw new Error(\"not supported\")},e.prototype.cloneRawData=function(){},e.prototype.getDimensionInfo=function(t){},e.prototype.cloneAllDimensionInfo=function(){},e.prototype.count=function(){},e.prototype.retrieveValue=function(t,r){},e.prototype.retrieveValueFromItem=function(t,r){},e.prototype.convertValue=function(t,r){return Ol(t,r)},e}();function JR(e,t){var r=new QR,n=e.data,i=r.sourceFormat=e.sourceFormat,a=e.startIndex,o=\"\";e.seriesLayoutBy!==Vr&&xe(o);var s=[],l={},u=e.dimensionsDefine;if(u)I(u,function(p,g){var m=p.name,y={index:g,name:m,displayName:p.displayName};if(s.push(y),m!=null){var _=\"\";Ca(l,m)&&xe(_),l[m]=y}});else for(var f=0;f<e.dimensionsDetectedCount;f++)s.push({index:f});var c=Wb(i,Vr);t.__isBuiltIn&&(r.getRawDataItem=function(p){return c(n,a,s,p)},r.getRawData=Ft(tO,null,e)),r.cloneRawData=Ft(eO,null,e);var v=Yb(i,Vr);r.count=Ft(v,null,n,a,s);var h=qb(i);r.retrieveValue=function(p,g){var m=c(n,a,s,p);return d(m,g)};var d=r.retrieveValueFromItem=function(p,g){if(p!=null){var m=s[g];if(m)return h(p,g,m.name)}};return r.getDimensionInfo=Ft(rO,null,s,l),r.cloneAllDimensionInfo=Ft(nO,null,s),r}function tO(e){var t=e.sourceFormat;if(!qd(t)){var r=\"\";xe(r)}return e.data}function eO(e){var t=e.sourceFormat,r=e.data;if(!qd(t)){var n=\"\";xe(n)}if(t===Ae){for(var i=[],a=0,o=r.length;a<o;a++)i.push(r[a].slice());return i}else if(t===vr){for(var i=[],a=0,o=r.length;a<o;a++)i.push(Y({},r[a]));return i}}function rO(e,t,r){if(r!=null){if(zt(r)||!isNaN(r)&&!Ca(t,r))return e[r];if(Ca(t,r))return t[r]}}function nO(e){return xt(e)}var Xb=_t();function iO(e){e=xt(e);var t=e.type,r=\"\";t||xe(r);var n=t.split(\":\");n.length!==2&&xe(r);var i=!1;n[0]===\"echarts\"&&(t=n[1],i=!0),e.__isBuiltIn=i,Xb.set(t,e)}function aO(e,t,r){var n=me(e),i=n.length,a=\"\";i||xe(a);for(var o=0,s=i;o<s;o++){var l=n[o];t=oO(l,t),o!==s-1&&(t.length=Math.max(t.length,1))}return t}function oO(e,t,r,n){var i=\"\";t.length||xe(i),st(e)||xe(i);var a=e.type,o=Xb.get(a);o||xe(i);var s=ct(t,function(u){return JR(u,o)}),l=me(o.transform({upstream:s[0],upstreamList:s,config:xt(e.config)}));return ct(l,function(u,f){var c=\"\";st(u)||xe(c),u.data||xe(c);var v=Vb(u.data);qd(v)||xe(c);var h,d=t[0];if(d&&f===0&&!u.dimensions){var p=d.startIndex;p&&(u.data=d.data.slice(0,p).concat(u.data)),h={seriesLayoutBy:Vr,sourceHeader:p,dimensions:d.metaRawOption.dimensions}}else h={seriesLayoutBy:Vr,sourceHeader:0,dimensions:u.dimensions};return Xh(u.data,h,null)})}function qd(e){return e===Ae||e===vr}var of=\"undefined\",sO=typeof Uint32Array===of?Array:Uint32Array,lO=typeof Uint16Array===of?Array:Uint16Array,jb=typeof Int32Array===of?Array:Int32Array,py=typeof Float64Array===of?Array:Float64Array,Kb={float:py,int:jb,ordinal:Array,number:Array,time:py},gc;function to(e){return e>65535?sO:lO}function Xi(){return[1/0,-1/0]}function uO(e){var t=e.constructor;return t===Array?e.slice():new t(e)}function gy(e,t,r,n,i){var a=Kb[r||\"float\"];if(i){var o=e[t],s=o&&o.length;if(s!==n){for(var l=new a(n),u=0;u<s;u++)l[u]=o[u];e[t]=l}}else e[t]=new a(n)}var jh=function(){function e(){this._chunks=[],this._rawExtent=[],this._extent=[],this._count=0,this._rawCount=0,this._calcDimNameToIdx=_t()}return e.prototype.initData=function(t,r,n){this._provider=t,this._chunks=[],this._indices=null,this.getRawIndex=this._getRawIdxIdentity;var i=t.getSource(),a=this.defaultDimValueGetter=gc[i.sourceFormat];this._dimValueGetter=n||a,this._rawExtent=[],Gb(i),this._dimensions=ct(r,function(o){return{type:o.type,property:o.property}}),this._initDataFromProvider(0,t.count())},e.prototype.getProvider=function(){return this._provider},e.prototype.getSource=function(){return this._provider.getSource()},e.prototype.ensureCalculationDimension=function(t,r){var n=this._calcDimNameToIdx,i=this._dimensions,a=n.get(t);if(a!=null){if(i[a].type===r)return a}else a=i.length;return i[a]={type:r},n.set(t,a),this._chunks[a]=new Kb[r||\"float\"](this._rawCount),this._rawExtent[a]=Xi(),a},e.prototype.collectOrdinalMeta=function(t,r){var n=this._chunks[t],i=this._dimensions[t],a=this._rawExtent,o=i.ordinalOffset||0,s=n.length;o===0&&(a[t]=Xi());for(var l=a[t],u=o;u<s;u++){var f=n[u]=r.parseAndCollect(n[u]);l[0]=Math.min(f,l[0]),l[1]=Math.max(f,l[1])}i.ordinalMeta=r,i.ordinalOffset=s,i.type=\"ordinal\"},e.prototype.getOrdinalMeta=function(t){var r=this._dimensions[t],n=r.ordinalMeta;return n},e.prototype.getDimensionProperty=function(t){var r=this._dimensions[t];return r&&r.property},e.prototype.appendData=function(t){var r=this._provider,n=this.count();r.appendData(t);var i=r.count();return r.persistent||(i+=n),n<i&&this._initDataFromProvider(n,i,!0),[n,i]},e.prototype.appendValues=function(t,r){for(var n=this._chunks,i=this._dimensions,a=i.length,o=this._rawExtent,s=this.count(),l=s+Math.max(t.length,r||0),u=0;u<a;u++){var f=i[u];gy(n,u,f.type,l,!0)}for(var c=[],v=s;v<l;v++)for(var h=v-s,d=0;d<a;d++){var f=i[d],p=gc.arrayRows.call(this,t[h]||c,f.property,h,d);n[d][v]=p;var g=o[d];p<g[0]&&(g[0]=p),p>g[1]&&(g[1]=p)}return this._rawCount=this._count=l,{start:s,end:l}},e.prototype._initDataFromProvider=function(t,r,n){for(var i=this._provider,a=this._chunks,o=this._dimensions,s=o.length,l=this._rawExtent,u=ct(o,function(y){return y.property}),f=0;f<s;f++){var c=o[f];l[f]||(l[f]=Xi()),gy(a,f,c.type,r,n)}if(i.fillStorage)i.fillStorage(t,r,a,l);else for(var v=[],h=t;h<r;h++){v=i.getItem(h,v);for(var d=0;d<s;d++){var p=a[d],g=this._dimValueGetter(v,u[d],h,d);p[h]=g;var m=l[d];g<m[0]&&(m[0]=g),g>m[1]&&(m[1]=g)}}!i.persistent&&i.clean&&i.clean(),this._rawCount=this._count=r,this._extent=[]},e.prototype.count=function(){return this._count},e.prototype.get=function(t,r){if(!(r>=0&&r<this._count))return NaN;var n=this._chunks[t];return n?n[this.getRawIndex(r)]:NaN},e.prototype.getValues=function(t,r){var n=[],i=[];if(r==null){r=t,t=[];for(var a=0;a<this._dimensions.length;a++)i.push(a)}else i=t;for(var a=0,o=i.length;a<o;a++)n.push(this.get(i[a],r));return n},e.prototype.getByRawIndex=function(t,r){if(!(r>=0&&r<this._rawCount))return NaN;var n=this._chunks[t];return n?n[r]:NaN},e.prototype.getSum=function(t){var r=this._chunks[t],n=0;if(r)for(var i=0,a=this.count();i<a;i++){var o=this.get(t,i);isNaN(o)||(n+=o)}return n},e.prototype.getMedian=function(t){var r=[];this.each([t],function(a){isNaN(a)||r.push(a)});var n=r.sort(function(a,o){return a-o}),i=this.count();return i===0?0:i%2===1?n[(i-1)/2]:(n[i/2]+n[i/2-1])/2},e.prototype.indexOfRawIndex=function(t){if(t>=this._rawCount||t<0)return-1;if(!this._indices)return t;var r=this._indices,n=r[t];if(n!=null&&n<this._count&&n===t)return t;for(var i=0,a=this._count-1;i<=a;){var o=(i+a)/2|0;if(r[o]<t)i=o+1;else if(r[o]>t)a=o-1;else return o}return-1},e.prototype.indicesOfNearest=function(t,r,n){var i=this._chunks,a=i[t],o=[];if(!a)return o;n==null&&(n=1/0);for(var s=1/0,l=-1,u=0,f=0,c=this.count();f<c;f++){var v=this.getRawIndex(f),h=r-a[v],d=Math.abs(h);d<=n&&((d<s||d===s&&h>=0&&l<0)&&(s=d,l=h,u=0),h===l&&(o[u++]=f))}return o.length=u,o},e.prototype.getIndices=function(){var t,r=this._indices;if(r){var n=r.constructor,i=this._count;if(n===Array){t=new n(i);for(var a=0;a<i;a++)t[a]=r[a]}else t=new n(r.buffer,0,i)}else{var n=to(this._rawCount);t=new n(this.count());for(var a=0;a<t.length;a++)t[a]=a}return t},e.prototype.filter=function(t,r){if(!this._count)return this;for(var n=this.clone(),i=n.count(),a=to(n._rawCount),o=new a(i),s=[],l=t.length,u=0,f=t[0],c=n._chunks,v=0;v<i;v++){var h=void 0,d=n.getRawIndex(v);if(l===0)h=r(v);else if(l===1){var p=c[f][d];h=r(p,v)}else{for(var g=0;g<l;g++)s[g]=c[t[g]][d];s[g]=v,h=r.apply(null,s)}h&&(o[u++]=d)}return u<i&&(n._indices=o),n._count=u,n._extent=[],n._updateGetRawIdx(),n},e.prototype.selectRange=function(t){var r=this.clone(),n=r._count;if(!n)return this;var i=Gt(t),a=i.length;if(!a)return this;var o=r.count(),s=to(r._rawCount),l=new s(o),u=0,f=i[0],c=t[f][0],v=t[f][1],h=r._chunks,d=!1;if(!r._indices){var p=0;if(a===1){for(var g=h[i[0]],m=0;m<n;m++){var y=g[m];(y>=c&&y<=v||isNaN(y))&&(l[u++]=p),p++}d=!0}else if(a===2){for(var g=h[i[0]],_=h[i[1]],w=t[i[1]][0],S=t[i[1]][1],m=0;m<n;m++){var y=g[m],b=_[m];(y>=c&&y<=v||isNaN(y))&&(b>=w&&b<=S||isNaN(b))&&(l[u++]=p),p++}d=!0}}if(!d)if(a===1)for(var m=0;m<o;m++){var x=r.getRawIndex(m),y=h[i[0]][x];(y>=c&&y<=v||isNaN(y))&&(l[u++]=x)}else for(var m=0;m<o;m++){for(var T=!0,x=r.getRawIndex(m),C=0;C<a;C++){var D=i[C],y=h[D][x];(y<t[D][0]||y>t[D][1])&&(T=!1)}T&&(l[u++]=r.getRawIndex(m))}return u<o&&(r._indices=l),r._count=u,r._extent=[],r._updateGetRawIdx(),r},e.prototype.map=function(t,r){var n=this.clone(t);return this._updateDims(n,t,r),n},e.prototype.modify=function(t,r){this._updateDims(this,t,r)},e.prototype._updateDims=function(t,r,n){for(var i=t._chunks,a=[],o=r.length,s=t.count(),l=[],u=t._rawExtent,f=0;f<r.length;f++)u[r[f]]=Xi();for(var c=0;c<s;c++){for(var v=t.getRawIndex(c),h=0;h<o;h++)l[h]=i[r[h]][v];l[o]=c;var d=n&&n.apply(null,l);if(d!=null){typeof d!=\"object\"&&(a[0]=d,d=a);for(var f=0;f<d.length;f++){var p=r[f],g=d[f],m=u[p],y=i[p];y&&(y[v]=g),g<m[0]&&(m[0]=g),g>m[1]&&(m[1]=g)}}}},e.prototype.lttbDownSample=function(t,r){var n=this.clone([t],!0),i=n._chunks,a=i[t],o=this.count(),s=0,l=Math.floor(1/r),u=this.getRawIndex(0),f,c,v,h=new(to(this._rawCount))(Math.min((Math.ceil(o/l)+2)*2,o));h[s++]=u;for(var d=1;d<o-1;d+=l){for(var p=Math.min(d+l,o-1),g=Math.min(d+l*2,o),m=(g+p)/2,y=0,_=p;_<g;_++){var w=this.getRawIndex(_),S=a[w];isNaN(S)||(y+=S)}y/=g-p;var b=d,x=Math.min(d+l,o),T=d-1,C=a[u];f=-1,v=b;for(var D=-1,P=0,_=b;_<x;_++){var w=this.getRawIndex(_),S=a[w];if(isNaN(S)){P++,D<0&&(D=w);continue}c=Math.abs((T-m)*(S-C)-(T-_)*(y-C)),c>f&&(f=c,v=w)}P>0&&P<x-b&&(h[s++]=Math.min(D,v),v=Math.max(D,v)),h[s++]=v,u=v}return h[s++]=this.getRawIndex(o-1),n._count=s,n._indices=h,n.getRawIndex=this._getRawIdx,n},e.prototype.downSample=function(t,r,n,i){for(var a=this.clone([t],!0),o=a._chunks,s=[],l=Math.floor(1/r),u=o[t],f=this.count(),c=a._rawExtent[t]=Xi(),v=new(to(this._rawCount))(Math.ceil(f/l)),h=0,d=0;d<f;d+=l){l>f-d&&(l=f-d,s.length=l);for(var p=0;p<l;p++){var g=this.getRawIndex(d+p);s[p]=u[g]}var m=n(s),y=this.getRawIndex(Math.min(d+i(s,m)||0,f-1));u[y]=m,m<c[0]&&(c[0]=m),m>c[1]&&(c[1]=m),v[h++]=y}return a._count=h,a._indices=v,a._updateGetRawIdx(),a},e.prototype.each=function(t,r){if(!!this._count)for(var n=t.length,i=this._chunks,a=0,o=this.count();a<o;a++){var s=this.getRawIndex(a);switch(n){case 0:r(a);break;case 1:r(i[t[0]][s],a);break;case 2:r(i[t[0]][s],i[t[1]][s],a);break;default:for(var l=0,u=[];l<n;l++)u[l]=i[t[l]][s];u[l]=a,r.apply(null,u)}}},e.prototype.getDataExtent=function(t){var r=this._chunks[t],n=Xi();if(!r)return n;var i=this.count(),a=!this._indices,o;if(a)return this._rawExtent[t].slice();if(o=this._extent[t],o)return o.slice();o=n;for(var s=o[0],l=o[1],u=0;u<i;u++){var f=this.getRawIndex(u),c=r[f];c<s&&(s=c),c>l&&(l=c)}return o=[s,l],this._extent[t]=o,o},e.prototype.getRawDataItem=function(t){var r=this.getRawIndex(t);if(this._provider.persistent)return this._provider.getItem(r);for(var n=[],i=this._chunks,a=0;a<i.length;a++)n.push(i[a][r]);return n},e.prototype.clone=function(t,r){var n=new e,i=this._chunks,a=t&&Ln(t,function(s,l){return s[l]=!0,s},{});if(a)for(var o=0;o<i.length;o++)n._chunks[o]=a[o]?uO(i[o]):i[o];else n._chunks=i;return this._copyCommonProps(n),r||(n._indices=this._cloneIndices()),n._updateGetRawIdx(),n},e.prototype._copyCommonProps=function(t){t._count=this._count,t._rawCount=this._rawCount,t._provider=this._provider,t._dimensions=this._dimensions,t._extent=xt(this._extent),t._rawExtent=xt(this._rawExtent)},e.prototype._cloneIndices=function(){if(this._indices){var t=this._indices.constructor,r=void 0;if(t===Array){var n=this._indices.length;r=new t(n);for(var i=0;i<n;i++)r[i]=this._indices[i]}else r=new t(this._indices);return r}return null},e.prototype._getRawIdxIdentity=function(t){return t},e.prototype._getRawIdx=function(t){return t<this._count&&t>=0?this._indices[t]:-1},e.prototype._updateGetRawIdx=function(){this.getRawIndex=this._indices?this._getRawIdx:this._getRawIdxIdentity},e.internalField=function(){function t(r,n,i,a){return Ol(r[a],this._dimensions[a])}gc={arrayRows:t,objectRows:function(r,n,i,a){return Ol(r[n],this._dimensions[a])},keyedColumns:t,original:function(r,n,i,a){var o=r&&(r.value==null?r:r.value);return Ol(o instanceof Array?o[a]:o,this._dimensions[a])},typedArray:function(r,n,i,a){return r[a]}}}(),e}(),fO=function(){function e(t){this._sourceList=[],this._storeList=[],this._upstreamSignList=[],this._versionSignBase=0,this._dirty=!0,this._sourceHost=t}return e.prototype.dirty=function(){this._setLocalSource([],[]),this._storeList=[],this._dirty=!0},e.prototype._setLocalSource=function(t,r){this._sourceList=t,this._upstreamSignList=r,this._versionSignBase++,this._versionSignBase>9e10&&(this._versionSignBase=0)},e.prototype._getVersionSign=function(){return this._sourceHost.uid+\"_\"+this._versionSignBase},e.prototype.prepareSource=function(){this._isDirty()&&(this._createSource(),this._dirty=!1)},e.prototype._createSource=function(){this._setLocalSource([],[]);var t=this._sourceHost,r=this._getUpstreamSourceManagers(),n=!!r.length,i,a;if(Js(t)){var o=t,s=void 0,l=void 0,u=void 0;if(n){var f=r[0];f.prepareSource(),u=f.getSource(),s=u.data,l=u.sourceFormat,a=[f._getVersionSign()]}else s=o.get(\"data\",!0),l=Be(s)?Dn:rr,a=[];var c=this._getSourceMetaRawOption()||{},v=u&&u.metaRawOption||{},h=Mt(c.seriesLayoutBy,v.seriesLayoutBy)||null,d=Mt(c.sourceHeader,v.sourceHeader),p=Mt(c.dimensions,v.dimensions),g=h!==v.seriesLayoutBy||!!d!=!!v.sourceHeader||p;i=g?[Xh(s,{seriesLayoutBy:h,sourceHeader:d,dimensions:p},l)]:[]}else{var m=t;if(n){var y=this._applyTransform(r);i=y.sourceList,a=y.upstreamSignList}else{var _=m.get(\"source\",!0);i=[Xh(_,this._getSourceMetaRawOption(),null)],a=[]}}this._setLocalSource(i,a)},e.prototype._applyTransform=function(t){var r=this._sourceHost,n=r.get(\"transform\",!0),i=r.get(\"fromTransformResult\",!0);if(i!=null){var a=\"\";t.length!==1&&my(a)}var o,s=[],l=[];return I(t,function(u){u.prepareSource();var f=u.getSource(i||0),c=\"\";i!=null&&!f&&my(c),s.push(f),l.push(u._getVersionSign())}),n?o=aO(n,s,{datasetIndex:r.componentIndex}):i!=null&&(o=[VR(s[0])]),{sourceList:o,upstreamSignList:l}},e.prototype._isDirty=function(){if(this._dirty)return!0;for(var t=this._getUpstreamSourceManagers(),r=0;r<t.length;r++){var n=t[r];if(n._isDirty()||this._upstreamSignList[r]!==n._getVersionSign())return!0}},e.prototype.getSource=function(t){t=t||0;var r=this._sourceList[t];if(!r){var n=this._getUpstreamSourceManagers();return n[0]&&n[0].getSource(t)}return r},e.prototype.getSharedDataStore=function(t){var r=t.makeStoreSchema();return this._innerGetDataStore(r.dimensions,t.source,r.hash)},e.prototype._innerGetDataStore=function(t,r,n){var i=0,a=this._storeList,o=a[i];o||(o=a[i]={});var s=o[n];if(!s){var l=this._getUpstreamSourceManagers()[0];Js(this._sourceHost)&&l?s=l._innerGetDataStore(t,r,n):(s=new jh,s.initData(new Ub(r,t.length),t)),o[n]=s}return s},e.prototype._getUpstreamSourceManagers=function(){var t=this._sourceHost;if(Js(t)){var r=$d(t);return r?[r.getSourceManager()]:[]}else return ct(dR(t),function(n){return n.getSourceManager()})},e.prototype._getSourceMetaRawOption=function(){var t=this._sourceHost,r,n,i;if(Js(t))r=t.get(\"seriesLayoutBy\",!0),n=t.get(\"sourceHeader\",!0),i=t.get(\"dimensions\",!0);else if(!this._getUpstreamSourceManagers().length){var a=t;r=a.get(\"seriesLayoutBy\",!0),n=a.get(\"sourceHeader\",!0),i=a.get(\"dimensions\",!0)}return{seriesLayoutBy:r,sourceHeader:n,dimensions:i}},e}();function Js(e){return e.mainType===\"series\"}function my(e){throw new Error(e)}var Zb=\"line-height:1\";function Qb(e,t){var r=e.color||\"#6e7079\",n=e.fontSize||12,i=e.fontWeight||\"400\",a=e.color||\"#464646\",o=e.fontSize||14,s=e.fontWeight||\"900\";return t===\"html\"?{nameStyle:\"font-size:\"+Ke(n+\"\")+\"px;color:\"+Ke(r)+\";font-weight:\"+Ke(i+\"\"),valueStyle:\"font-size:\"+Ke(o+\"\")+\"px;color:\"+Ke(a)+\";font-weight:\"+Ke(s+\"\")}:{nameStyle:{fontSize:n,fill:r,fontWeight:i},valueStyle:{fontSize:o,fill:a,fontWeight:s}}}var cO=[0,10,20,30],hO=[\"\",`\n`,`\n\n`,`\n\n\n`];function os(e,t){return t.type=e,t}function Kh(e){return e.type===\"section\"}function Jb(e){return Kh(e)?vO:dO}function tS(e){if(Kh(e)){var t=0,r=e.blocks.length,n=r>1||r>0&&!e.noHeader;return I(e.blocks,function(i){var a=tS(i);a>=t&&(t=a+ +(n&&(!a||Kh(i)&&!i.noHeader)))}),t}return 0}function vO(e,t,r,n){var i=t.noHeader,a=pO(tS(t)),o=[],s=t.blocks||[];Wr(!s||et(s)),s=s||[];var l=e.orderMode;if(t.sortBlocks&&l){s=s.slice();var u={valueAsc:\"asc\",valueDesc:\"desc\"};if(Ca(u,l)){var f=new ZR(u[l],null);s.sort(function(d,p){return f.evaluate(d.sortParam,p.sortParam)})}else l===\"seriesDesc\"&&s.reverse()}I(s,function(d,p){var g=t.valueFormatter,m=Jb(d)(g?Y(Y({},e),{valueFormatter:g}):e,d,p>0?a.html:0,n);m!=null&&o.push(m)});var c=e.renderMode===\"richText\"?o.join(a.richText):Zh(o.join(\"\"),i?r:a.html);if(i)return c;var v=qh(t.header,\"ordinal\",e.useUTC),h=Qb(n,e.renderMode).nameStyle;return e.renderMode===\"richText\"?eS(e,v,h)+a.richText+c:Zh('<div style=\"'+h+\";\"+Zb+';\">'+Ke(v)+\"</div>\"+c,r)}function dO(e,t,r,n){var i=e.renderMode,a=t.noName,o=t.noValue,s=!t.markerType,l=t.name,u=e.useUTC,f=t.valueFormatter||e.valueFormatter||function(w){return w=et(w)?w:[w],ct(w,function(S,b){return qh(S,et(h)?h[b]:h,u)})};if(!(a&&o)){var c=s?\"\":e.markupStyleCreator.makeTooltipMarker(t.markerType,t.markerColor||\"#333\",i),v=a?\"\":qh(l,\"ordinal\",u),h=t.valueType,d=o?[]:f(t.value),p=!s||!a,g=!s&&a,m=Qb(n,i),y=m.nameStyle,_=m.valueStyle;return i===\"richText\"?(s?\"\":c)+(a?\"\":eS(e,v,y))+(o?\"\":yO(e,d,p,g,_)):Zh((s?\"\":c)+(a?\"\":gO(v,!s,y))+(o?\"\":mO(d,p,g,_)),r)}}function yy(e,t,r,n,i,a){if(!!e){var o=Jb(e),s={useUTC:i,renderMode:r,orderMode:n,markupStyleCreator:t,valueFormatter:e.valueFormatter};return o(s,e,0,a)}}function pO(e){return{html:cO[e],richText:hO[e]}}function Zh(e,t){var r='<div style=\"clear:both\"></div>',n=\"margin: \"+t+\"px 0 0\";return'<div style=\"'+n+\";\"+Zb+';\">'+e+r+\"</div>\"}function gO(e,t,r){var n=t?\"margin-left:2px\":\"\";return'<span style=\"'+r+\";\"+n+'\">'+Ke(e)+\"</span>\"}function mO(e,t,r,n){var i=r?\"10px\":\"20px\",a=t?\"float:right;margin-left:\"+i:\"\";return e=et(e)?e:[e],'<span style=\"'+a+\";\"+n+'\">'+ct(e,function(o){return Ke(o)}).join(\"&nbsp;&nbsp;\")+\"</span>\"}function eS(e,t,r){return e.markupStyleCreator.wrapRichTextStyle(t,r)}function yO(e,t,r,n,i){var a=[i],o=n?10:20;return r&&a.push({padding:[0,0,0,o],align:\"right\"}),e.markupStyleCreator.wrapRichTextStyle(et(t)?t.join(\"  \"):t,a)}function _O(e,t){var r=e.getData().getItemVisual(t,\"style\"),n=r[e.visualDrawType];return Ti(n)}function rS(e,t){var r=e.get(\"padding\");return r!=null?r:t===\"richText\"?[8,10]:10}var mc=function(){function e(){this.richTextStyles={},this._nextStyleNameId=vw()}return e.prototype._generateStyleName=function(){return\"__EC_aUTo_\"+this._nextStyleNameId++},e.prototype.makeTooltipMarker=function(t,r,n){var i=n===\"richText\"?this._generateStyleName():null,a=aR({color:r,type:t,renderMode:n,markerId:i});return it(a)?a:(this.richTextStyles[i]=a.style,a.content)},e.prototype.wrapRichTextStyle=function(t,r){var n={};et(r)?I(r,function(a){return Y(n,a)}):Y(n,r);var i=this._generateStyleName();return this.richTextStyles[i]=n,\"{\"+i+\"|\"+t+\"}\"},e}();function wO(e){var t=e.series,r=e.dataIndex,n=e.multipleSeries,i=t.getData(),a=i.mapDimensionsAll(\"defaultedTooltip\"),o=a.length,s=t.getRawValue(r),l=et(s),u=_O(t,r),f,c,v,h;if(o>1||l&&!o){var d=bO(s,t,r,a,u);f=d.inlineValues,c=d.inlineValueTypes,v=d.blocks,h=d.inlineValues[0]}else if(o){var p=i.getDimensionInfo(a[0]);h=f=Da(i,r,a[0]),c=p.type}else h=f=l?s[0]:s;var g=wd(t),m=g&&t.name||\"\",y=i.getName(r),_=n?m:y;return os(\"section\",{header:m,noHeader:n||!g,sortParam:h,blocks:[os(\"nameValue\",{markerType:\"item\",markerColor:u,name:_,noName:!Tr(_),value:f,valueType:c})].concat(v||[])})}function bO(e,t,r,n,i){var a=t.getData(),o=Ln(e,function(c,v,h){var d=a.getDimensionInfo(h);return c=c||d&&d.tooltip!==!1&&d.displayName!=null},!1),s=[],l=[],u=[];n.length?I(n,function(c){f(Da(a,r,c),c)}):I(e,f);function f(c,v){var h=a.getDimensionInfo(v);!h||h.otherDims.tooltip===!1||(o?u.push(os(\"nameValue\",{markerType:\"subItem\",markerColor:i,name:h.displayName,value:c,valueType:h.type})):(s.push(c),l.push(h.type)))}return{inlineValues:s,inlineValueTypes:l,blocks:u}}var an=Qt();function tl(e,t){return e.getName(t)||e.getId(t)}var SO=\"__universalTransitionEnabled\",sf=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r._selectedDataIndicesMap={},r}return t.prototype.init=function(r,n,i){this.seriesIndex=this.componentIndex,this.dataTask=Bo({count:TO,reset:CO}),this.dataTask.context={model:this},this.mergeDefaultAndTheme(r,i);var a=an(this).sourceManager=new fO(this);a.prepareSource();var o=this.getInitialData(r,i);wy(o,this),this.dataTask.context.data=o,an(this).dataBeforeProcessed=o,_y(this),this._initSelectedMapFromData(o)},t.prototype.mergeDefaultAndTheme=function(r,n){var i=is(this),a=i?nf(r):{},o=this.subType;$t.hasClass(o)&&(o+=\"Series\"),Dt(r,n.getTheme().get(this.subType)),Dt(r,this.getDefaultOption()),Oh(r,\"label\",[\"show\"]),this.fillDataTextStyle(r.data),i&&Aa(r,a,i)},t.prototype.mergeOption=function(r,n){r=Dt(this.option,r,!0),this.fillDataTextStyle(r.data);var i=is(this);i&&Aa(this.option,r,i);var a=an(this).sourceManager;a.dirty(),a.prepareSource();var o=this.getInitialData(r,n);wy(o,this),this.dataTask.dirty(),this.dataTask.context.data=o,an(this).dataBeforeProcessed=o,_y(this),this._initSelectedMapFromData(o)},t.prototype.fillDataTextStyle=function(r){if(r&&!Be(r))for(var n=[\"show\"],i=0;i<r.length;i++)r[i]&&r[i].label&&Oh(r[i],\"label\",n)},t.prototype.getInitialData=function(r,n){},t.prototype.appendData=function(r){var n=this.getRawData();n.appendData(r.data)},t.prototype.getData=function(r){var n=Qh(this);if(n){var i=n.context.data;return r==null?i:i.getLinkedData(r)}else return an(this).data},t.prototype.getAllData=function(){var r=this.getData();return r&&r.getLinkedDataAll?r.getLinkedDataAll():[{data:r}]},t.prototype.setData=function(r){var n=Qh(this);if(n){var i=n.context;i.outputData=r,n!==this.dataTask&&(i.data=r)}an(this).data=r},t.prototype.getEncode=function(){var r=this.get(\"encode\",!0);if(r)return _t(r)},t.prototype.getSourceManager=function(){return an(this).sourceManager},t.prototype.getSource=function(){return this.getSourceManager().getSource()},t.prototype.getRawData=function(){return an(this).dataBeforeProcessed},t.prototype.getColorBy=function(){var r=this.get(\"colorBy\");return r||\"series\"},t.prototype.isColorBySeries=function(){return this.getColorBy()===\"series\"},t.prototype.getBaseAxis=function(){var r=this.coordinateSystem;return r&&r.getBaseAxis&&r.getBaseAxis()},t.prototype.formatTooltip=function(r,n,i){return wO({series:this,dataIndex:r,multipleSeries:n})},t.prototype.isAnimationEnabled=function(){var r=this.ecModel;if(wt.node&&!(r&&r.ssr))return!1;var n=this.getShallow(\"animation\");return n&&this.getData().count()>this.getShallow(\"animationThreshold\")&&(n=!1),!!n},t.prototype.restoreData=function(){this.dataTask.dirty()},t.prototype.getColorFromPalette=function(r,n,i){var a=this.ecModel,o=Vd.prototype.getColorFromPalette.call(this,r,n,i);return o||(o=a.getColorFromPalette(r,n,i)),o},t.prototype.coordDimToDataDim=function(r){return this.getRawData().mapDimensionsAll(r)},t.prototype.getProgressive=function(){return this.get(\"progressive\")},t.prototype.getProgressiveThreshold=function(){return this.get(\"progressiveThreshold\")},t.prototype.select=function(r,n){this._innerSelect(this.getData(n),r)},t.prototype.unselect=function(r,n){var i=this.option.selectedMap;if(!!i){var a=this.option.selectedMode,o=this.getData(n);if(a===\"series\"||i===\"all\"){this.option.selectedMap={},this._selectedDataIndicesMap={};return}for(var s=0;s<r.length;s++){var l=r[s],u=tl(o,l);i[u]=!1,this._selectedDataIndicesMap[u]=-1}}},t.prototype.toggleSelect=function(r,n){for(var i=[],a=0;a<r.length;a++)i[0]=r[a],this.isSelected(r[a],n)?this.unselect(i,n):this.select(i,n)},t.prototype.getSelectedDataIndices=function(){if(this.option.selectedMap===\"all\")return[].slice.call(this.getData().getIndices());for(var r=this._selectedDataIndicesMap,n=Gt(r),i=[],a=0;a<n.length;a++){var o=r[n[a]];o>=0&&i.push(o)}return i},t.prototype.isSelected=function(r,n){var i=this.option.selectedMap;if(!i)return!1;var a=this.getData(n);return(i===\"all\"||i[tl(a,r)])&&!a.getItemModel(r).get([\"select\",\"disabled\"])},t.prototype.isUniversalTransitionEnabled=function(){if(this[SO])return!0;var r=this.option.universalTransition;return r?r===!0?!0:r&&r.enabled:!1},t.prototype._innerSelect=function(r,n){var i,a,o=this.option,s=o.selectedMode,l=n.length;if(!(!s||!l)){if(s===\"series\")o.selectedMap=\"all\";else if(s===\"multiple\"){st(o.selectedMap)||(o.selectedMap={});for(var u=o.selectedMap,f=0;f<l;f++){var c=n[f],v=tl(r,c);u[v]=!0,this._selectedDataIndicesMap[v]=r.getRawIndex(c)}}else if(s===\"single\"||s===!0){var h=n[l-1],v=tl(r,h);o.selectedMap=(i={},i[v]=!0,i),this._selectedDataIndicesMap=(a={},a[v]=r.getRawIndex(h),a)}}},t.prototype._initSelectedMapFromData=function(r){if(!this.option.selectedMap){var n=[];r.hasItemOption&&r.each(function(i){var a=r.getRawDataItem(i);a&&a.selected&&n.push(i)}),n.length>0&&this._innerSelect(r,n)}},t.registerClass=function(r){return $t.registerClass(r)},t.protoInitialize=function(){var r=t.prototype;r.type=\"series.__base__\",r.seriesIndex=0,r.ignoreStyleOnData=!1,r.hasSymbolVisual=!1,r.defaultSymbol=\"circle\",r.visualStyleAccessPath=\"itemStyle\",r.visualDrawType=\"fill\"}(),t}($t);Pr(sf,jR);Pr(sf,Vd);_w(sf,$t);function _y(e){var t=e.name;wd(e)||(e.name=xO(e)||t)}function xO(e){var t=e.getRawData(),r=t.mapDimensionsAll(\"seriesName\"),n=[];return I(r,function(i){var a=t.getDimensionInfo(i);a.displayName&&n.push(a.displayName)}),n.join(\" \")}function TO(e){return e.model.getRawData().count()}function CO(e){var t=e.model;return t.setData(t.getRawData().cloneShallow()),MO}function MO(e,t){t.outputData&&e.end>t.outputData.count()&&t.model.getRawData().cloneShallow(t.outputData)}function wy(e,t){I(wP(e.CHANGABLE_METHODS,e.DOWNSAMPLE_METHODS),function(r){e.wrapMethod(r,Xt(AO,t))})}function AO(e,t){var r=Qh(e);return r&&r.setOutputEnd((t||this).count()),t}function Qh(e){var t=(e.ecModel||{}).scheduler,r=t&&t.getPipeline(e.uid);if(r){var n=r.currentTask;if(n){var i=n.agentStubMap;i&&(n=i.get(e.uid))}return n}}var Pa=sf,Xd=function(){function e(){this.group=new ye,this.uid=Ku(\"viewComponent\")}return e.prototype.init=function(t,r){},e.prototype.render=function(t,r,n,i){},e.prototype.dispose=function(t,r){},e.prototype.updateView=function(t,r,n,i){},e.prototype.updateLayout=function(t,r,n,i){},e.prototype.updateVisual=function(t,r,n,i){},e.prototype.blurSeries=function(t,r){},e.prototype.eachRendered=function(t){var r=this.group;r&&r.traverse(t)},e}();Sd(Xd);Hu(Xd);var qr=Xd;function nS(){var e=Qt();return function(t){var r=e(t),n=t.pipelineContext,i=!!r.large,a=!!r.progressiveRender,o=r.large=!!(n&&n.large),s=r.progressiveRender=!!(n&&n.progressiveRender);return(i!==o||a!==s)&&\"reset\"}}var iS=Qt(),DO=nS(),jd=function(){function e(){this.group=new ye,this.uid=Ku(\"viewChart\"),this.renderTask=Bo({plan:PO,reset:IO}),this.renderTask.context={view:this}}return e.prototype.init=function(t,r){},e.prototype.render=function(t,r,n,i){},e.prototype.highlight=function(t,r,n,i){var a=t.getData(i&&i.dataType);!a||Sy(a,i,\"emphasis\")},e.prototype.downplay=function(t,r,n,i){var a=t.getData(i&&i.dataType);!a||Sy(a,i,\"normal\")},e.prototype.remove=function(t,r){this.group.removeAll()},e.prototype.dispose=function(t,r){},e.prototype.updateView=function(t,r,n,i){this.render(t,r,n,i)},e.prototype.updateLayout=function(t,r,n,i){this.render(t,r,n,i)},e.prototype.updateVisual=function(t,r,n,i){this.render(t,r,n,i)},e.prototype.eachRendered=function(t){Od(this.group,t)},e.markUpdateMethod=function(t,r){iS(t).updateMethod=r},e.protoInitialize=function(){var t=e.prototype;t.type=\"chart\"}(),e}();function by(e,t,r){e&&Gh(e)&&(t===\"emphasis\"?iu:au)(e,r)}function Sy(e,t,r){var n=Si(e,t),i=t&&t.highlightKey!=null?RL(t.highlightKey):null;n!=null?I(me(n),function(a){by(e.getItemGraphicEl(a),r,i)}):e.eachItemGraphicEl(function(a){by(a,r,i)})}Sd(jd);Hu(jd);function PO(e){return DO(e.model)}function IO(e){var t=e.model,r=e.ecModel,n=e.api,i=e.payload,a=t.pipelineContext.progressiveRender,o=e.view,s=i&&iS(i).updateMethod,l=a?\"incrementalPrepareRender\":s&&o[s]?s:\"render\";return l!==\"render\"&&o[l](t,r,n,i),EO[l]}var EO={incrementalPrepareRender:{progress:function(e,t){t.view.incrementalRender(e,t.model,t.ecModel,t.api,t.payload)}},render:{forceFirstProgress:!0,progress:function(e,t){t.view.render(t.model,t.ecModel,t.api,t.payload)}}},Gr=jd,hu=\"\\0__throttleOriginMethod\",xy=\"\\0__throttleRate\",Ty=\"\\0__throttleType\";function aS(e,t,r){var n,i=0,a=0,o=null,s,l,u,f;t=t||0;function c(){a=new Date().getTime(),o=null,e.apply(l,u||[])}var v=function(){for(var h=[],d=0;d<arguments.length;d++)h[d]=arguments[d];n=new Date().getTime(),l=this,u=h;var p=f||t,g=f||r;f=null,s=n-(g?i:a)-p,clearTimeout(o),g?o=setTimeout(c,p):s>=0?c():o=setTimeout(c,-s),i=n};return v.clear=function(){o&&(clearTimeout(o),o=null)},v.debounceNextCall=function(h){f=h},v}function oS(e,t,r,n){var i=e[t];if(!!i){var a=i[hu]||i,o=i[Ty],s=i[xy];if(s!==r||o!==n){if(r==null||!n)return e[t]=a;i=e[t]=aS(a,r,n===\"debounce\"),i[hu]=a,i[Ty]=n,i[xy]=r}return i}}function Jh(e,t){var r=e[t];r&&r[hu]&&(r.clear&&r.clear(),e[t]=r[hu])}var Cy=Qt(),My={itemStyle:es(mb,!0),lineStyle:es(gb,!0)},LO={lineStyle:\"stroke\",itemStyle:\"fill\"};function sS(e,t){var r=e.visualStyleMapper||My[t];return r||(console.warn(\"Unkown style type '\"+t+\"'.\"),My.itemStyle)}function lS(e,t){var r=e.visualDrawType||LO[t];return r||(console.warn(\"Unkown style type '\"+t+\"'.\"),\"fill\")}var RO={createOnAllSeries:!0,performRawSeries:!0,reset:function(e,t){var r=e.getData(),n=e.visualStyleAccessPath||\"itemStyle\",i=e.getModel(n),a=sS(e,n),o=a(i),s=i.getShallow(\"decal\");s&&(r.setVisual(\"decal\",s),s.dirty=!0);var l=lS(e,n),u=o[l],f=mt(u)?u:null,c=o.fill===\"auto\"||o.stroke===\"auto\";if(!o[l]||f||c){var v=e.getColorFromPalette(e.name,null,t.getSeriesCount());o[l]||(o[l]=v,r.setVisual(\"colorFromPalette\",!0)),o.fill=o.fill===\"auto\"||mt(o.fill)?v:o.fill,o.stroke=o.stroke===\"auto\"||mt(o.stroke)?v:o.stroke}if(r.setVisual(\"style\",o),r.setVisual(\"drawType\",l),!t.isSeriesFiltered(e)&&f)return r.setVisual(\"colorFromPalette\",!1),{dataEach:function(h,d){var p=e.getDataParams(d),g=Y({},o);g[l]=f(p),h.setItemVisual(d,\"style\",g)}}}},eo=new ce,OO={createOnAllSeries:!0,performRawSeries:!0,reset:function(e,t){if(!(e.ignoreStyleOnData||t.isSeriesFiltered(e))){var r=e.getData(),n=e.visualStyleAccessPath||\"itemStyle\",i=sS(e,n),a=r.getVisual(\"drawType\");return{dataEach:r.hasItemOption?function(o,s){var l=o.getRawDataItem(s);if(l&&l[n]){eo.option=l[n];var u=i(eo),f=o.ensureUniqueItemVisual(s,\"style\");Y(f,u),eo.option.decal&&(o.setItemVisual(s,\"decal\",eo.option.decal),eo.option.decal.dirty=!0),a in u&&o.setItemVisual(s,\"colorFromPalette\",!1)}}:null}}}},kO={performRawSeries:!0,overallReset:function(e){var t=_t();e.eachSeries(function(r){var n=r.getColorBy();if(!r.isColorBySeries()){var i=r.type+\"-\"+n,a=t.get(i);a||(a={},t.set(i,a)),Cy(r).scope=a}}),e.eachSeries(function(r){if(!(r.isColorBySeries()||e.isSeriesFiltered(r))){var n=r.getRawData(),i={},a=r.getData(),o=Cy(r).scope,s=r.visualStyleAccessPath||\"itemStyle\",l=lS(r,s);a.each(function(u){var f=a.getRawIndex(u);i[f]=u}),n.each(function(u){var f=i[u],c=a.getItemVisual(f,\"colorFromPalette\");if(c){var v=a.ensureUniqueItemVisual(f,\"style\"),h=n.getName(u)||u+\"\",d=n.count();v[l]=r.getColorFromPalette(h,o,d)}})}})}},el=Math.PI;function NO(e,t){t=t||{},Pt(t,{text:\"loading\",textColor:\"#000\",fontSize:12,fontWeight:\"normal\",fontStyle:\"normal\",fontFamily:\"sans-serif\",maskColor:\"rgba(255, 255, 255, 0.8)\",showSpinner:!0,color:\"#5470c6\",spinnerRadius:10,lineWidth:5,zlevel:0});var r=new ye,n=new ne({style:{fill:t.maskColor},zlevel:t.zlevel,z:1e4});r.add(n);var i=new he({style:{text:t.text,fill:t.textColor,fontSize:t.fontSize,fontWeight:t.fontWeight,fontStyle:t.fontStyle,fontFamily:t.fontFamily},zlevel:t.zlevel,z:10001}),a=new ne({style:{fill:\"none\"},textContent:i,textConfig:{position:\"right\",distance:10},zlevel:t.zlevel,z:10001});r.add(a);var o;return t.showSpinner&&(o=new Dd({shape:{startAngle:-el/2,endAngle:-el/2+.1,r:t.spinnerRadius},style:{stroke:t.color,lineCap:\"round\",lineWidth:t.lineWidth},zlevel:t.zlevel,z:10001}),o.animateShape(!0).when(1e3,{endAngle:el*3/2}).start(\"circularInOut\"),o.animateShape(!0).when(1e3,{startAngle:el*3/2}).delay(300).start(\"circularInOut\"),r.add(o)),r.resize=function(){var s=i.getBoundingRect().width,l=t.showSpinner?t.spinnerRadius:0,u=(e.getWidth()-l*2-(t.showSpinner&&s?10:0)-s)/2-(t.showSpinner&&s?0:5+s/2)+(t.showSpinner?0:s/2)+(s?0:l),f=e.getHeight()/2;t.showSpinner&&o.setShape({cx:u,cy:f}),a.setShape({x:u-l,y:f-l,width:l*2,height:l*2}),n.setShape({x:0,y:0,width:e.getWidth(),height:e.getHeight()})},r.resize(),r}var BO=function(){function e(t,r,n,i){this._stageTaskMap=_t(),this.ecInstance=t,this.api=r,n=this._dataProcessorHandlers=n.slice(),i=this._visualHandlers=i.slice(),this._allHandlers=n.concat(i)}return e.prototype.restoreData=function(t,r){t.restoreData(r),this._stageTaskMap.each(function(n){var i=n.overallTask;i&&i.dirty()})},e.prototype.getPerformArgs=function(t,r){if(!!t.__pipeline){var n=this._pipelineMap.get(t.__pipeline.id),i=n.context,a=!r&&n.progressiveEnabled&&(!i||i.progressiveRender)&&t.__idxInPipeline>n.blockIndex,o=a?n.step:null,s=i&&i.modDataCount,l=s!=null?Math.ceil(s/o):null;return{step:o,modBy:l,modDataCount:s}}},e.prototype.getPipeline=function(t){return this._pipelineMap.get(t)},e.prototype.updateStreamModes=function(t,r){var n=this._pipelineMap.get(t.uid),i=t.getData(),a=i.count(),o=n.progressiveEnabled&&r.incrementalPrepareRender&&a>=n.threshold,s=t.get(\"large\")&&a>=t.get(\"largeThreshold\"),l=t.get(\"progressiveChunkMode\")===\"mod\"?a:null;t.pipelineContext=n.context={progressiveRender:o,modDataCount:l,large:s}},e.prototype.restorePipelines=function(t){var r=this,n=r._pipelineMap=_t();t.eachSeries(function(i){var a=i.getProgressive(),o=i.uid;n.set(o,{id:o,head:null,tail:null,threshold:i.getProgressiveThreshold(),progressiveEnabled:a&&!(i.preventIncremental&&i.preventIncremental()),blockIndex:-1,step:Math.round(a||700),count:0}),r._pipe(i,i.dataTask)})},e.prototype.prepareStageTasks=function(){var t=this._stageTaskMap,r=this.api.getModel(),n=this.api;I(this._allHandlers,function(i){var a=t.get(i.uid)||t.set(i.uid,{}),o=\"\";Wr(!(i.reset&&i.overallReset),o),i.reset&&this._createSeriesStageTask(i,a,r,n),i.overallReset&&this._createOverallStageTask(i,a,r,n)},this)},e.prototype.prepareView=function(t,r,n,i){var a=t.renderTask,o=a.context;o.model=r,o.ecModel=n,o.api=i,a.__block=!t.incrementalPrepareRender,this._pipe(r,a)},e.prototype.performDataProcessorTasks=function(t,r){this._performStageTasks(this._dataProcessorHandlers,t,r,{block:!0})},e.prototype.performVisualTasks=function(t,r,n){this._performStageTasks(this._visualHandlers,t,r,n)},e.prototype._performStageTasks=function(t,r,n,i){i=i||{};var a=!1,o=this;I(t,function(l,u){if(!(i.visualType&&i.visualType!==l.visualType)){var f=o._stageTaskMap.get(l.uid),c=f.seriesTaskMap,v=f.overallTask;if(v){var h,d=v.agentStubMap;d.each(function(g){s(i,g)&&(g.dirty(),h=!0)}),h&&v.dirty(),o.updatePayload(v,n);var p=o.getPerformArgs(v,i.block);d.each(function(g){g.perform(p)}),v.perform(p)&&(a=!0)}else c&&c.each(function(g,m){s(i,g)&&g.dirty();var y=o.getPerformArgs(g,i.block);y.skip=!l.performRawSeries&&r.isSeriesFiltered(g.context.model),o.updatePayload(g,n),g.perform(y)&&(a=!0)})}});function s(l,u){return l.setDirty&&(!l.dirtyMap||l.dirtyMap.get(u.__pipeline.id))}this.unfinished=a||this.unfinished},e.prototype.performSeriesTasks=function(t){var r;t.eachSeries(function(n){r=n.dataTask.perform()||r}),this.unfinished=r||this.unfinished},e.prototype.plan=function(){this._pipelineMap.each(function(t){var r=t.tail;do{if(r.__block){t.blockIndex=r.__idxInPipeline;break}r=r.getUpstream()}while(r)})},e.prototype.updatePayload=function(t,r){r!==\"remain\"&&(t.context.payload=r)},e.prototype._createSeriesStageTask=function(t,r,n,i){var a=this,o=r.seriesTaskMap,s=r.seriesTaskMap=_t(),l=t.seriesType,u=t.getTargetSeries;t.createOnAllSeries?n.eachRawSeries(f):l?n.eachRawSeriesByType(l,f):u&&u(n,i).each(f);function f(c){var v=c.uid,h=s.set(v,o&&o.get(v)||Bo({plan:VO,reset:GO,count:WO}));h.context={model:c,ecModel:n,api:i,useClearVisual:t.isVisual&&!t.isLayout,plan:t.plan,reset:t.reset,scheduler:a},a._pipe(c,h)}},e.prototype._createOverallStageTask=function(t,r,n,i){var a=this,o=r.overallTask=r.overallTask||Bo({reset:FO});o.context={ecModel:n,api:i,overallReset:t.overallReset,scheduler:a};var s=o.agentStubMap,l=o.agentStubMap=_t(),u=t.seriesType,f=t.getTargetSeries,c=!0,v=!1,h=\"\";Wr(!t.createOnAllSeries,h),u?n.eachRawSeriesByType(u,d):f?f(n,i).each(d):(c=!1,I(n.getSeries(),d));function d(p){var g=p.uid,m=l.set(g,s&&s.get(g)||(v=!0,Bo({reset:zO,onDirty:$O})));m.context={model:p,overallProgress:c},m.agent=o,m.__block=c,a._pipe(p,m)}v&&o.dirty()},e.prototype._pipe=function(t,r){var n=t.uid,i=this._pipelineMap.get(n);!i.head&&(i.head=r),i.tail&&i.tail.pipe(r),i.tail=r,r.__idxInPipeline=i.count++,r.__pipeline=i},e.wrapStageHandler=function(t,r){return mt(t)&&(t={overallReset:t,seriesType:YO(t)}),t.uid=Ku(\"stageHandler\"),r&&(t.visualType=r),t},e}();function FO(e){e.overallReset(e.ecModel,e.api,e.payload)}function zO(e){return e.overallProgress&&HO}function HO(){this.agent.dirty(),this.getDownstream().dirty()}function $O(){this.agent&&this.agent.dirty()}function VO(e){return e.plan?e.plan(e.model,e.ecModel,e.api,e.payload):null}function GO(e){e.useClearVisual&&e.data.clearAllVisual();var t=e.resetDefines=me(e.reset(e.model,e.ecModel,e.api,e.payload));return t.length>1?ct(t,function(r,n){return uS(n)}):UO}var UO=uS(0);function uS(e){return function(t,r){var n=r.data,i=r.resetDefines[e];if(i&&i.dataEach)for(var a=t.start;a<t.end;a++)i.dataEach(n,a);else i&&i.progress&&i.progress(t,n)}}function WO(e){return e.data.count()}function YO(e){vu=null;try{e(ss,fS)}catch(t){}return vu}var ss={},fS={},vu;cS(ss,Fb);cS(fS,zb);ss.eachSeriesByType=ss.eachRawSeriesByType=function(e){vu=e};ss.eachComponent=function(e){e.mainType===\"series\"&&e.subType&&(vu=e.subType)};function cS(e,t){for(var r in t.prototype)e[r]=Ce}var hS=BO,Ay=[\"#37A2DA\",\"#32C5E9\",\"#67E0E3\",\"#9FE6B8\",\"#FFDB5C\",\"#ff9f7f\",\"#fb7293\",\"#E062AE\",\"#E690D1\",\"#e7bcf3\",\"#9d96f5\",\"#8378EA\",\"#96BFFF\"],qO={color:Ay,colorLayer:[[\"#37A2DA\",\"#ffd85c\",\"#fd7b5f\"],[\"#37A2DA\",\"#67E0E3\",\"#FFDB5C\",\"#ff9f7f\",\"#E062AE\",\"#9d96f5\"],[\"#37A2DA\",\"#32C5E9\",\"#9FE6B8\",\"#FFDB5C\",\"#ff9f7f\",\"#fb7293\",\"#e7bcf3\",\"#8378EA\",\"#96BFFF\"],Ay]},de=\"#B9B8CE\",Dy=\"#100C2A\",rl=function(){return{axisLine:{lineStyle:{color:de}},splitLine:{lineStyle:{color:\"#484753\"}},splitArea:{areaStyle:{color:[\"rgba(255,255,255,0.02)\",\"rgba(255,255,255,0.05)\"]}},minorSplitLine:{lineStyle:{color:\"#20203B\"}}}},Py=[\"#4992ff\",\"#7cffb2\",\"#fddd60\",\"#ff6e76\",\"#58d9f9\",\"#05c091\",\"#ff8a45\",\"#8d48e3\",\"#dd79ff\"],vS={darkMode:!0,color:Py,backgroundColor:Dy,axisPointer:{lineStyle:{color:\"#817f91\"},crossStyle:{color:\"#817f91\"},label:{color:\"#fff\"}},legend:{textStyle:{color:de}},textStyle:{color:de},title:{textStyle:{color:\"#EEF1FA\"},subtextStyle:{color:\"#B9B8CE\"}},toolbox:{iconStyle:{borderColor:de}},dataZoom:{borderColor:\"#71708A\",textStyle:{color:de},brushStyle:{color:\"rgba(135,163,206,0.3)\"},handleStyle:{color:\"#353450\",borderColor:\"#C5CBE3\"},moveHandleStyle:{color:\"#B0B6C3\",opacity:.3},fillerColor:\"rgba(135,163,206,0.2)\",emphasis:{handleStyle:{borderColor:\"#91B7F2\",color:\"#4D587D\"},moveHandleStyle:{color:\"#636D9A\",opacity:.7}},dataBackground:{lineStyle:{color:\"#71708A\",width:1},areaStyle:{color:\"#71708A\"}},selectedDataBackground:{lineStyle:{color:\"#87A3CE\"},areaStyle:{color:\"#87A3CE\"}}},visualMap:{textStyle:{color:de}},timeline:{lineStyle:{color:de},label:{color:de},controlStyle:{color:de,borderColor:de}},calendar:{itemStyle:{color:Dy},dayLabel:{color:de},monthLabel:{color:de},yearLabel:{color:de}},timeAxis:rl(),logAxis:rl(),valueAxis:rl(),categoryAxis:rl(),line:{symbol:\"circle\"},graph:{color:Py},gauge:{title:{color:de},axisLine:{lineStyle:{color:[[1,\"rgba(207,212,219,0.2)\"]]}},axisLabel:{color:de},detail:{color:\"#EEF1FA\"}},candlestick:{itemStyle:{color:\"#f64e56\",color0:\"#54ea92\",borderColor:\"#f64e56\",borderColor0:\"#54ea92\"}}};vS.categoryAxis.splitLine.show=!1;var XO=vS,jO=function(){function e(){}return e.prototype.normalizeQuery=function(t){var r={},n={},i={};if(it(t)){var a=Cr(t);r.mainType=a.main||null,r.subType=a.sub||null}else{var o=[\"Index\",\"Name\",\"Id\"],s={name:1,dataIndex:1,dataType:1};I(t,function(l,u){for(var f=!1,c=0;c<o.length;c++){var v=o[c],h=u.lastIndexOf(v);if(h>0&&h===u.length-v.length){var d=u.slice(0,h);d!==\"data\"&&(r.mainType=d,r[v.toLowerCase()]=l,f=!0)}}s.hasOwnProperty(u)&&(n[u]=l,f=!0),f||(i[u]=l)})}return{cptQuery:r,dataQuery:n,otherQuery:i}},e.prototype.filter=function(t,r){var n=this.eventInfo;if(!n)return!0;var i=n.targetEl,a=n.packedEvent,o=n.model,s=n.view;if(!o||!s)return!0;var l=r.cptQuery,u=r.dataQuery;return f(l,o,\"mainType\")&&f(l,o,\"subType\")&&f(l,o,\"index\",\"componentIndex\")&&f(l,o,\"name\")&&f(l,o,\"id\")&&f(u,a,\"name\")&&f(u,a,\"dataIndex\")&&f(u,a,\"dataType\")&&(!s.filterForExposedEvent||s.filterForExposedEvent(t,r.otherQuery,i,a));function f(c,v,h,d){return c[h]==null||v[d||h]===c[h]}},e.prototype.afterTrigger=function(){this.eventInfo=null},e}(),tv=[\"symbol\",\"symbolSize\",\"symbolRotate\",\"symbolOffset\"],Iy=tv.concat([\"symbolKeepAspect\"]),KO={createOnAllSeries:!0,performRawSeries:!0,reset:function(e,t){var r=e.getData();if(e.legendIcon&&r.setVisual(\"legendIcon\",e.legendIcon),!e.hasSymbolVisual)return;for(var n={},i={},a=!1,o=0;o<tv.length;o++){var s=tv[o],l=e.get(s);mt(l)?(a=!0,i[s]=l):n[s]=l}if(n.symbol=n.symbol||e.defaultSymbol,r.setVisual(Y({legendIcon:e.legendIcon||n.symbol,symbolKeepAspect:e.get(\"symbolKeepAspect\")},n)),t.isSeriesFiltered(e))return;var u=Gt(i);function f(c,v){for(var h=e.getRawValue(v),d=e.getDataParams(v),p=0;p<u.length;p++){var g=u[p];c.setItemVisual(v,g,i[g](h,d))}}return{dataEach:a?f:null}}},ZO={createOnAllSeries:!0,performRawSeries:!0,reset:function(e,t){if(!e.hasSymbolVisual||t.isSeriesFiltered(e))return;var r=e.getData();function n(i,a){for(var o=i.getItemModel(a),s=0;s<Iy.length;s++){var l=Iy[s],u=o.getShallow(l,!0);u!=null&&i.setItemVisual(a,l,u)}}return{dataEach:r.hasItemOption?n:null}}};function QO(e,t,r){switch(r){case\"color\":var n=e.getItemVisual(t,\"style\");return n[e.getVisual(\"drawType\")];case\"opacity\":return e.getItemVisual(t,\"style\").opacity;case\"symbol\":case\"symbolSize\":case\"liftZ\":return e.getItemVisual(t,r)}}function JO(e,t){switch(t){case\"color\":var r=e.getVisual(\"style\");return r[e.getVisual(\"drawType\")];case\"opacity\":return e.getVisual(\"style\").opacity;case\"symbol\":case\"symbolSize\":case\"liftZ\":return e.getVisual(t)}}function tk(e,t){function r(n,i){var a=[];return n.eachComponent({mainType:\"series\",subType:e,query:i},function(o){a.push(o.seriesIndex)}),a}I([[e+\"ToggleSelect\",\"toggleSelect\"],[e+\"Select\",\"select\"],[e+\"UnSelect\",\"unselect\"]],function(n){t(n[0],function(i,a,o){i=Y({},i),o.dispatchAction(Y(i,{type:n[1],seriesIndex:r(a,i)}))})})}function ji(e,t,r,n,i){var a=e+t;r.isSilent(a)||n.eachComponent({mainType:\"series\",subType:\"pie\"},function(o){for(var s=o.seriesIndex,l=o.option.selectedMap,u=i.selected,f=0;f<u.length;f++)if(u[f].seriesIndex===s){var c=o.getData(),v=Si(c,i.fromActionPayload);r.trigger(a,{type:a,seriesId:o.id,name:et(v)?c.getName(v[0]):c.getName(v),selected:it(l)?l:Y({},l)})}})}function ek(e,t,r){e.on(\"selectchanged\",function(n){var i=r.getModel();n.isFromClick?(ji(\"map\",\"selectchanged\",t,i,n),ji(\"pie\",\"selectchanged\",t,i,n)):n.fromAction===\"select\"?(ji(\"map\",\"selected\",t,i,n),ji(\"pie\",\"selected\",t,i,n)):n.fromAction===\"unselect\"&&(ji(\"map\",\"unselected\",t,i,n),ji(\"pie\",\"unselected\",t,i,n))})}function _o(e,t,r){for(var n;e&&!(t(e)&&(n=e,r));)e=e.__hostTarget||e.parent;return n}var rk=Math.round(Math.random()*9),nk=typeof Object.defineProperty==\"function\",ik=function(){function e(){this._id=\"__ec_inner_\"+rk++}return e.prototype.get=function(t){return this._guard(t)[this._id]},e.prototype.set=function(t,r){var n=this._guard(t);return nk?Object.defineProperty(n,this._id,{value:r,enumerable:!1,configurable:!0}):n[this._id]=r,this},e.prototype.delete=function(t){return this.has(t)?(delete this._guard(t)[this._id],!0):!1},e.prototype.has=function(t){return!!this._guard(t)[this._id]},e.prototype._guard=function(t){if(t!==Object(t))throw TypeError(\"Value of WeakMap is not a non-null object.\");return t},e}(),ak=ik,ok=kt.extend({type:\"triangle\",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(e,t){var r=t.cx,n=t.cy,i=t.width/2,a=t.height/2;e.moveTo(r,n-a),e.lineTo(r+i,n+a),e.lineTo(r-i,n+a),e.closePath()}}),sk=kt.extend({type:\"diamond\",shape:{cx:0,cy:0,width:0,height:0},buildPath:function(e,t){var r=t.cx,n=t.cy,i=t.width/2,a=t.height/2;e.moveTo(r,n-a),e.lineTo(r+i,n),e.lineTo(r,n+a),e.lineTo(r-i,n),e.closePath()}}),lk=kt.extend({type:\"pin\",shape:{x:0,y:0,width:0,height:0},buildPath:function(e,t){var r=t.x,n=t.y,i=t.width/5*3,a=Math.max(i,t.height),o=i/2,s=o*o/(a-o),l=n-a+o+s,u=Math.asin(s/o),f=Math.cos(u)*o,c=Math.sin(u),v=Math.cos(u),h=o*.6,d=o*.7;e.moveTo(r-f,l+s),e.arc(r,l,o,Math.PI-u,Math.PI*2+u),e.bezierCurveTo(r+f-c*h,l+s+v*h,r,n-d,r,n),e.bezierCurveTo(r,n-d,r-f+c*h,l+s+v*h,r-f,l+s),e.closePath()}}),uk=kt.extend({type:\"arrow\",shape:{x:0,y:0,width:0,height:0},buildPath:function(e,t){var r=t.height,n=t.width,i=t.x,a=t.y,o=n/3*2;e.moveTo(i,a),e.lineTo(i+o,a+r),e.lineTo(i,a+r/4*3),e.lineTo(i-o,a+r),e.lineTo(i,a),e.closePath()}}),fk={line:xi,rect:ne,roundRect:ne,square:ne,circle:Ad,diamond:sk,pin:lk,arrow:uk,triangle:ok},ck={line:function(e,t,r,n,i){i.x1=e,i.y1=t+n/2,i.x2=e+r,i.y2=t+n/2},rect:function(e,t,r,n,i){i.x=e,i.y=t,i.width=r,i.height=n},roundRect:function(e,t,r,n,i){i.x=e,i.y=t,i.width=r,i.height=n,i.r=Math.min(r,n)/4},square:function(e,t,r,n,i){var a=Math.min(r,n);i.x=e,i.y=t,i.width=a,i.height=a},circle:function(e,t,r,n,i){i.cx=e+r/2,i.cy=t+n/2,i.r=Math.min(r,n)/2},diamond:function(e,t,r,n,i){i.cx=e+r/2,i.cy=t+n/2,i.width=r,i.height=n},pin:function(e,t,r,n,i){i.x=e+r/2,i.y=t+n/2,i.width=r,i.height=n},arrow:function(e,t,r,n,i){i.x=e+r/2,i.y=t+n/2,i.width=r,i.height=n},triangle:function(e,t,r,n,i){i.cx=e+r/2,i.cy=t+n/2,i.width=r,i.height=n}},ev={};I(fk,function(e,t){ev[t]=new e});var hk=kt.extend({type:\"symbol\",shape:{symbolType:\"\",x:0,y:0,width:0,height:0},calculateTextPosition:function(e,t,r){var n=aw(e,t,r),i=this.shape;return i&&i.symbolType===\"pin\"&&t.position===\"inside\"&&(n.y=r.y+r.height*.4),n},buildPath:function(e,t,r){var n=t.symbolType;if(n!==\"none\"){var i=ev[n];i||(n=\"rect\",i=ev[n]),ck[n](t.x,t.y,t.width,t.height,i.shape),i.buildPath(e,i.shape,r)}}});function vk(e,t){if(this.type!==\"image\"){var r=this.style;this.__isEmptyBrush?(r.stroke=e,r.fill=t||\"#fff\",r.lineWidth=2):this.shape.symbolType===\"line\"?r.stroke=e:r.fill=e,this.markRedraw()}}function Ia(e,t,r,n,i,a,o){var s=e.indexOf(\"empty\")===0;s&&(e=e.substr(5,1).toLowerCase()+e.substr(6));var l;return e.indexOf(\"image://\")===0?l=fb(e.slice(8),new Ot(t,r,n,i),o?\"center\":\"cover\"):e.indexOf(\"path://\")===0?l=Id(e.slice(7),{},new Ot(t,r,n,i),o?\"center\":\"cover\"):l=new hk({shape:{symbolType:e,x:t,y:r,width:n,height:i}}),l.__isEmptyBrush=s,l.setColor=vk,a&&l.setColor(a),l}function dk(e){return et(e)||(e=[+e,+e]),[e[0]||0,e[1]||0]}function dS(e,t){if(e!=null)return et(e)||(e=[e,e]),[Vt(e[0],t[0])||0,Vt(Mt(e[1],e[0]),t[1])||0]}function pk(e,t,r){var n=t.x==null?0:t.x,i=t.x2==null?1:t.x2,a=t.y==null?0:t.y,o=t.y2==null?0:t.y2;t.global||(n=n*r.width+r.x,i=i*r.width+r.x,a=a*r.height+r.y,o=o*r.height+r.y),n=isNaN(n)?0:n,i=isNaN(i)?1:i,a=isNaN(a)?0:a,o=isNaN(o)?0:o;var s=e.createLinearGradient(n,a,i,o);return s}function gk(e,t,r){var n=r.width,i=r.height,a=Math.min(n,i),o=t.x==null?.5:t.x,s=t.y==null?.5:t.y,l=t.r==null?.5:t.r;t.global||(o=o*n+r.x,s=s*i+r.y,l=l*a);var u=e.createRadialGradient(o,s,0,o,s,l);return u}function rv(e,t,r){for(var n=t.type===\"radial\"?gk(e,t,r):pk(e,t,r),i=t.colorStops,a=0;a<i.length;a++)n.addColorStop(i[a].offset,i[a].color);return n}function mk(e,t){if(e===t||!e&&!t)return!1;if(!e||!t||e.length!==t.length)return!0;for(var r=0;r<e.length;r++)if(e[r]!==t[r])return!0;return!1}function nl(e){return parseInt(e,10)}function il(e,t,r){var n=[\"width\",\"height\"][t],i=[\"clientWidth\",\"clientHeight\"][t],a=[\"paddingLeft\",\"paddingTop\"][t],o=[\"paddingRight\",\"paddingBottom\"][t];if(r[n]!=null&&r[n]!==\"auto\")return parseFloat(r[n]);var s=document.defaultView.getComputedStyle(e);return(e[i]||nl(s[n])||nl(e.style[n]))-(nl(s[a])||0)-(nl(s[o])||0)|0}function yk(e,t){return!e||e===\"solid\"||!(t>0)?null:e===\"dashed\"?[4*t,2*t]:e===\"dotted\"?[t]:zt(e)?[e]:et(e)?e:null}function pS(e){var t=e.style,r=t.lineDash&&t.lineWidth>0&&yk(t.lineDash,t.lineWidth),n=t.lineDashOffset;if(r){var i=t.strokeNoScale&&e.getLineScale?e.getLineScale():1;i&&i!==1&&(r=ct(r,function(a){return a/i}),n/=i)}return[r,n]}var _k=new On(!0);function du(e){var t=e.stroke;return!(t==null||t===\"none\"||!(e.lineWidth>0))}function Ey(e){return typeof e==\"string\"&&e!==\"none\"}function pu(e){var t=e.fill;return t!=null&&t!==\"none\"}function Ly(e,t){if(t.fillOpacity!=null&&t.fillOpacity!==1){var r=e.globalAlpha;e.globalAlpha=t.fillOpacity*t.opacity,e.fill(),e.globalAlpha=r}else e.fill()}function Ry(e,t){if(t.strokeOpacity!=null&&t.strokeOpacity!==1){var r=e.globalAlpha;e.globalAlpha=t.strokeOpacity*t.opacity,e.stroke(),e.globalAlpha=r}else e.stroke()}function nv(e,t,r){var n=ww(t.image,t.__image,r);if($u(n)){var i=e.createPattern(n,t.repeat||\"repeat\");if(typeof DOMMatrix==\"function\"&&i&&i.setTransform){var a=new DOMMatrix;a.translateSelf(t.x||0,t.y||0),a.rotateSelf(0,0,(t.rotation||0)*bP),a.scaleSelf(t.scaleX||1,t.scaleY||1),i.setTransform(a)}return i}}function wk(e,t,r,n){var i,a=du(r),o=pu(r),s=r.strokePercent,l=s<1,u=!t.path;(!t.silent||l)&&u&&t.createPathProxy();var f=t.path||_k,c=t.__dirty;if(!n){var v=r.fill,h=r.stroke,d=o&&!!v.colorStops,p=a&&!!h.colorStops,g=o&&!!v.image,m=a&&!!h.image,y=void 0,_=void 0,w=void 0,S=void 0,b=void 0;(d||p)&&(b=t.getBoundingRect()),d&&(y=c?rv(e,v,b):t.__canvasFillGradient,t.__canvasFillGradient=y),p&&(_=c?rv(e,h,b):t.__canvasStrokeGradient,t.__canvasStrokeGradient=_),g&&(w=c||!t.__canvasFillPattern?nv(e,v,t):t.__canvasFillPattern,t.__canvasFillPattern=w),m&&(S=c||!t.__canvasStrokePattern?nv(e,h,t):t.__canvasStrokePattern,t.__canvasStrokePattern=w),d?e.fillStyle=y:g&&(w?e.fillStyle=w:o=!1),p?e.strokeStyle=_:m&&(S?e.strokeStyle=S:a=!1)}var x=t.getGlobalScale();f.setScale(x[0],x[1],t.segmentIgnoreThreshold);var T,C;e.setLineDash&&r.lineDash&&(i=pS(t),T=i[0],C=i[1]);var D=!0;(u||c&ra)&&(f.setDPR(e.dpr),l?f.setContext(null):(f.setContext(e),D=!1),f.reset(),t.buildPath(f,t.shape,n),f.toStatic(),t.pathUpdated()),D&&f.rebuildPath(e,l?s:1),T&&(e.setLineDash(T),e.lineDashOffset=C),n||(r.strokeFirst?(a&&Ry(e,r),o&&Ly(e,r)):(o&&Ly(e,r),a&&Ry(e,r))),T&&e.setLineDash([])}function bk(e,t,r){var n=t.__image=ww(r.image,t.__image,t,t.onload);if(!(!n||!$u(n))){var i=r.x||0,a=r.y||0,o=t.getWidth(),s=t.getHeight(),l=n.width/n.height;if(o==null&&s!=null?o=s*l:s==null&&o!=null?s=o/l:o==null&&s==null&&(o=n.width,s=n.height),r.sWidth&&r.sHeight){var u=r.sx||0,f=r.sy||0;e.drawImage(n,u,f,r.sWidth,r.sHeight,i,a,o,s)}else if(r.sx&&r.sy){var u=r.sx,f=r.sy,c=o-u,v=s-f;e.drawImage(n,u,f,c,v,i,a,o,s)}else e.drawImage(n,i,a,o,s)}}function Sk(e,t,r){var n,i=r.text;if(i!=null&&(i+=\"\"),i){e.font=r.font||bi,e.textAlign=r.textAlign,e.textBaseline=r.textBaseline;var a=void 0,o=void 0;e.setLineDash&&r.lineDash&&(n=pS(t),a=n[0],o=n[1]),a&&(e.setLineDash(a),e.lineDashOffset=o),r.strokeFirst?(du(r)&&e.strokeText(i,r.x,r.y),pu(r)&&e.fillText(i,r.x,r.y)):(pu(r)&&e.fillText(i,r.x,r.y),du(r)&&e.strokeText(i,r.x,r.y)),a&&e.setLineDash([])}}var Oy=[\"shadowBlur\",\"shadowOffsetX\",\"shadowOffsetY\"],ky=[[\"lineCap\",\"butt\"],[\"lineJoin\",\"miter\"],[\"miterLimit\",10]];function gS(e,t,r,n,i){var a=!1;if(!n&&(r=r||{},t===r))return!1;if(n||t.opacity!==r.opacity){Te(e,i),a=!0;var o=Math.max(Math.min(t.opacity,1),0);e.globalAlpha=isNaN(o)?gi.opacity:o}(n||t.blend!==r.blend)&&(a||(Te(e,i),a=!0),e.globalCompositeOperation=t.blend||gi.blend);for(var s=0;s<Oy.length;s++){var l=Oy[s];(n||t[l]!==r[l])&&(a||(Te(e,i),a=!0),e[l]=e.dpr*(t[l]||0))}return(n||t.shadowColor!==r.shadowColor)&&(a||(Te(e,i),a=!0),e.shadowColor=t.shadowColor||gi.shadowColor),a}function Ny(e,t,r,n,i){var a=ls(t,i.inHover),o=n?null:r&&ls(r,i.inHover)||{};if(a===o)return!1;var s=gS(e,a,o,n,i);if((n||a.fill!==o.fill)&&(s||(Te(e,i),s=!0),Ey(a.fill)&&(e.fillStyle=a.fill)),(n||a.stroke!==o.stroke)&&(s||(Te(e,i),s=!0),Ey(a.stroke)&&(e.strokeStyle=a.stroke)),(n||a.opacity!==o.opacity)&&(s||(Te(e,i),s=!0),e.globalAlpha=a.opacity==null?1:a.opacity),t.hasStroke()){var l=a.lineWidth,u=l/(a.strokeNoScale&&t.getLineScale?t.getLineScale():1);e.lineWidth!==u&&(s||(Te(e,i),s=!0),e.lineWidth=u)}for(var f=0;f<ky.length;f++){var c=ky[f],v=c[0];(n||a[v]!==o[v])&&(s||(Te(e,i),s=!0),e[v]=a[v]||c[1])}return s}function xk(e,t,r,n,i){return gS(e,ls(t,i.inHover),r&&ls(r,i.inHover),n,i)}function mS(e,t){var r=t.transform,n=e.dpr||1;r?e.setTransform(n*r[0],n*r[1],n*r[2],n*r[3],n*r[4],n*r[5]):e.setTransform(n,0,0,n,0,0)}function Tk(e,t,r){for(var n=!1,i=0;i<e.length;i++){var a=e[i];n=n||a.isZeroArea(),mS(t,a),t.beginPath(),a.buildPath(t,a.shape),t.clip()}r.allClipped=n}function Ck(e,t){return e&&t?e[0]!==t[0]||e[1]!==t[1]||e[2]!==t[2]||e[3]!==t[3]||e[4]!==t[4]||e[5]!==t[5]:!(!e&&!t)}var By=1,Fy=2,zy=3,Hy=4;function Mk(e){var t=pu(e),r=du(e);return!(e.lineDash||!(+t^+r)||t&&typeof e.fill!=\"string\"||r&&typeof e.stroke!=\"string\"||e.strokePercent<1||e.strokeOpacity<1||e.fillOpacity<1)}function Te(e,t){t.batchFill&&e.fill(),t.batchStroke&&e.stroke(),t.batchFill=\"\",t.batchStroke=\"\"}function ls(e,t){return t&&e.__hoverStyle||e.style}function yS(e,t){di(e,t,{inHover:!1,viewWidth:0,viewHeight:0},!0)}function di(e,t,r,n){var i=t.transform;if(!t.shouldBePainted(r.viewWidth,r.viewHeight,!1,!1)){t.__dirty&=~Le,t.__isRendered=!1;return}var a=t.__clipPaths,o=r.prevElClipPaths,s=!1,l=!1;if((!o||mk(a,o))&&(o&&o.length&&(Te(e,r),e.restore(),l=s=!0,r.prevElClipPaths=null,r.allClipped=!1,r.prevEl=null),a&&a.length&&(Te(e,r),e.save(),Tk(a,e,r),s=!0),r.prevElClipPaths=a),r.allClipped){t.__isRendered=!1;return}t.beforeBrush&&t.beforeBrush(),t.innerBeforeBrush();var u=r.prevEl;u||(l=s=!0);var f=t instanceof kt&&t.autoBatch&&Mk(t.style);s||Ck(i,u.transform)?(Te(e,r),mS(e,t)):f||Te(e,r);var c=ls(t,r.inHover);t instanceof kt?(r.lastDrawType!==By&&(l=!0,r.lastDrawType=By),Ny(e,t,u,l,r),(!f||!r.batchFill&&!r.batchStroke)&&e.beginPath(),wk(e,t,c,f),f&&(r.batchFill=c.fill||\"\",r.batchStroke=c.stroke||\"\")):t instanceof Fh?(r.lastDrawType!==zy&&(l=!0,r.lastDrawType=zy),Ny(e,t,u,l,r),Sk(e,t,c)):t instanceof Ii?(r.lastDrawType!==Fy&&(l=!0,r.lastDrawType=Fy),xk(e,t,u,l,r),bk(e,t,c)):t.getTemporalDisplayables&&(r.lastDrawType!==Hy&&(l=!0,r.lastDrawType=Hy),Ak(e,t,r)),f&&n&&Te(e,r),t.innerAfterBrush(),t.afterBrush&&t.afterBrush(),r.prevEl=t,t.__dirty=0,t.__isRendered=!0}function Ak(e,t,r){var n=t.getDisplayables(),i=t.getTemporalDisplayables();e.save();var a={prevElClipPaths:null,prevEl:null,allClipped:!1,viewWidth:r.viewWidth,viewHeight:r.viewHeight,inHover:r.inHover},o,s;for(o=t.getCursor(),s=n.length;o<s;o++){var l=n[o];l.beforeBrush&&l.beforeBrush(),l.innerBeforeBrush(),di(e,l,a,o===s-1),l.innerAfterBrush(),l.afterBrush&&l.afterBrush(),a.prevEl=l}for(var u=0,f=i.length;u<f;u++){var l=i[u];l.beforeBrush&&l.beforeBrush(),l.innerBeforeBrush(),di(e,l,a,u===f-1),l.innerAfterBrush(),l.afterBrush&&l.afterBrush(),a.prevEl=l}t.clearTemporalDisplayables(),t.notClear=!0,e.restore()}var yc=new ak,$y=new gs(100),Vy=[\"symbol\",\"symbolSize\",\"symbolKeepAspect\",\"color\",\"backgroundColor\",\"dashArrayX\",\"dashArrayY\",\"maxTileWidth\",\"maxTileHeight\"];function Gy(e,t){if(e===\"none\")return null;var r=t.getDevicePixelRatio(),n=t.getZr(),i=n.painter.type===\"svg\";e.dirty&&yc.delete(e);var a=yc.get(e);if(a)return a;var o=Pt(e,{symbol:\"rect\",symbolSize:1,symbolKeepAspect:!0,color:\"rgba(0, 0, 0, 0.2)\",backgroundColor:null,dashArrayX:5,dashArrayY:5,rotation:0,maxTileWidth:512,maxTileHeight:512});o.backgroundColor===\"none\"&&(o.backgroundColor=null);var s={repeat:\"repeat\"};return l(s),s.rotation=o.rotation,s.scaleX=s.scaleY=i?1:1/r,yc.set(e,s),e.dirty=!1,s;function l(u){for(var f=[r],c=!0,v=0;v<Vy.length;++v){var h=o[Vy[v]];if(h!=null&&!et(h)&&!it(h)&&!zt(h)&&typeof h!=\"boolean\"){c=!1;break}f.push(h)}var d;if(c){d=f.join(\",\")+(i?\"-svg\":\"\");var p=$y.get(d);p&&(i?u.svgElement=p:u.image=p)}var g=wS(o.dashArrayX),m=Dk(o.dashArrayY),y=_S(o.symbol),_=Pk(g),w=bS(m),S=!i&&Pi.createCanvas(),b=i&&{tag:\"g\",attrs:{},key:\"dcl\",children:[]},x=C(),T;S&&(S.width=x.width*r,S.height=x.height*r,T=S.getContext(\"2d\")),D(),c&&$y.put(d,S||b),u.image=S,u.svgElement=b,u.svgWidth=x.width,u.svgHeight=x.height;function C(){for(var P=1,A=0,L=_.length;A<L;++A)P=tm(P,_[A]);for(var O=1,A=0,L=y.length;A<L;++A)O=tm(O,y[A].length);P*=O;var z=w*_.length*y.length;return{width:Math.max(1,Math.min(P,o.maxTileWidth)),height:Math.max(1,Math.min(z,o.maxTileHeight))}}function D(){T&&(T.clearRect(0,0,S.width,S.height),o.backgroundColor&&(T.fillStyle=o.backgroundColor,T.fillRect(0,0,S.width,S.height)));for(var P=0,A=0;A<m.length;++A)P+=m[A];if(P<=0)return;for(var L=-w,O=0,z=0,N=0;L<x.height;){if(O%2===0){for(var tt=z/2%y.length,V=0,K=0,lt=0;V<x.width*2;){for(var yt=0,A=0;A<g[N].length;++A)yt+=g[N][A];if(yt<=0)break;if(K%2===0){var ut=(1-o.symbolSize)*.5,ht=V+g[N][K]*ut,bt=L+m[O]*ut,k=g[N][K]*o.symbolSize,G=m[O]*o.symbolSize,$=lt/2%y[tt].length;Q(ht,bt,k,G,y[tt][$])}V+=g[N][K],++lt,++K,K===g[N].length&&(K=0)}++N,N===g.length&&(N=0)}L+=m[O],++z,++O,O===m.length&&(O=0)}function Q(vt,ft,X,j,M){var E=i?1:r,R=Ia(M,vt*E,ft*E,X*E,j*E,o.color,o.symbolKeepAspect);if(i){var B=n.painter.renderOneToVNode(R);B&&b.children.push(B)}else yS(T,R)}}}}function _S(e){if(!e||e.length===0)return[[\"rect\"]];if(it(e))return[[e]];for(var t=!0,r=0;r<e.length;++r)if(!it(e[r])){t=!1;break}if(t)return _S([e]);for(var n=[],r=0;r<e.length;++r)it(e[r])?n.push([e[r]]):n.push(e[r]);return n}function wS(e){if(!e||e.length===0)return[[0,0]];if(zt(e)){var t=Math.ceil(e);return[[t,t]]}for(var r=!0,n=0;n<e.length;++n)if(!zt(e[n])){r=!1;break}if(r)return wS([e]);for(var i=[],n=0;n<e.length;++n)if(zt(e[n])){var t=Math.ceil(e[n]);i.push([t,t])}else{var t=ct(e[n],function(s){return Math.ceil(s)});t.length%2===1?i.push(t.concat(t)):i.push(t)}return i}function Dk(e){if(!e||typeof e==\"object\"&&e.length===0)return[0,0];if(zt(e)){var t=Math.ceil(e);return[t,t]}var r=ct(e,function(n){return Math.ceil(n)});return e.length%2?r.concat(r):r}function Pk(e){return ct(e,function(t){return bS(t)})}function bS(e){for(var t=0,r=0;r<e.length;++r)t+=e[r];return e.length%2===1?t*2:t}function Ik(e,t){e.eachRawSeries(function(r){if(!e.isSeriesFiltered(r)){var n=r.getData();n.hasItemVisual()&&n.each(function(o){var s=n.getItemVisual(o,\"decal\");if(s){var l=n.ensureUniqueItemVisual(o,\"style\");l.decal=Gy(s,t)}});var i=n.getVisual(\"decal\");if(i){var a=n.getVisual(\"style\");a.decal=Gy(i,t)}}})}var Ek=new Ir,sr=Ek,SS={};function Lk(e,t){SS[e]=t}function Rk(e){return SS[e]}var Ok=typeof window!=\"undefined\",kk=1,Nk=800,Bk=900,Fk=1e3,zk=2e3,Hk=5e3,xS=1e3,$k=1100,Kd=2e3,TS=3e3,Vk=4e3,lf=4500,Gk=4600,Uk=5e3,Wk=6e3,CS=7e3,Yk={PROCESSOR:{FILTER:Fk,SERIES_FILTER:Nk,STATISTIC:Hk},VISUAL:{LAYOUT:xS,PROGRESSIVE_LAYOUT:$k,GLOBAL:Kd,CHART:TS,POST_CHART_LAYOUT:Gk,COMPONENT:Vk,BRUSH:Uk,CHART_ITEM:lf,ARIA:Wk,DECAL:CS}},se=\"__flagInMainProcess\",we=\"__pendingUpdate\",_c=\"__needsUpdateStatus\",Uy=/^[a-zA-Z0-9_]+$/,wc=\"__connectUpdateStatus\",Wy=0,qk=1,Xk=2;function MS(e){return function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];if(this.isDisposed()){this.id;return}return DS(this,e,t)}}function AS(e){return function(){for(var t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];return DS(this,e,t)}}function DS(e,t,r){return r[0]=r[0]&&r[0].toLowerCase(),Ir.prototype[t].apply(e,r)}var PS=function(e){J(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(Ir),IS=PS.prototype;IS.on=AS(\"on\");IS.off=AS(\"off\");var Ki,bc,al,on,Sc,xc,Tc,ro,no,Yy,qy,Cc,Xy,ol,jy,ES,He,Ky,LS=function(e){J(t,e);function t(r,n,i){var a=e.call(this,new jO)||this;a._chartsViews=[],a._chartsMap={},a._componentsViews=[],a._componentsMap={},a._pendingActions=[],i=i||{},it(n)&&(n=RS[n]),a._dom=r;var o=\"canvas\",s=!1,l=a._zr=Qg(r,{renderer:i.renderer||o,devicePixelRatio:i.devicePixelRatio,width:i.width,height:i.height,ssr:i.ssr,useDirtyRect:i.useDirtyRect==null?s:i.useDirtyRect});a._ssr=i.ssr,a._throttledZrFlush=aS(Ft(l.flush,l),17),n=xt(n),n&&$b(n,!0),a._theme=n,a._locale=K2(i.locale||yb),a._coordSysMgr=new Gd;var u=a._api=jy(a);function f(c,v){return c.__prio-v.__prio}return xl(mu,f),xl(iv,f),a._scheduler=new hS(a,u,iv,mu),a._messageCenter=new PS,a._initEvents(),a.resize=Ft(a.resize,a),l.animation.on(\"frame\",a._onframe,a),Yy(l,a),qy(l,a),ph(a),a}return t.prototype._onframe=function(){if(!this._disposed){Ky(this);var r=this._scheduler;if(this[we]){var n=this[we].silent;this[se]=!0;try{Ki(this),on.update.call(this,null,this[we].updateParams)}catch(l){throw this[se]=!1,this[we]=null,l}this._zr.flush(),this[se]=!1,this[we]=null,ro.call(this,n),no.call(this,n)}else if(r.unfinished){var i=kk,a=this._model,o=this._api;r.unfinished=!1;do{var s=+new Date;r.performSeriesTasks(a),r.performDataProcessorTasks(a),xc(this,a),r.performVisualTasks(a),ol(this,this._model,o,\"remain\",{}),i-=+new Date-s}while(i>0&&r.unfinished);r.unfinished||this._zr.flush()}}},t.prototype.getDom=function(){return this._dom},t.prototype.getId=function(){return this.id},t.prototype.getZr=function(){return this._zr},t.prototype.isSSR=function(){return this._ssr},t.prototype.setOption=function(r,n,i){if(!this[se]){if(this._disposed){this.id;return}var a,o,s;if(st(n)&&(i=n.lazyUpdate,a=n.silent,o=n.replaceMerge,s=n.transition,n=n.notMerge),this[se]=!0,!this._model||n){var l=new LR(this._api),u=this._theme,f=this._model=new Fb;f.scheduler=this._scheduler,f.ssr=this._ssr,f.init(null,null,null,u,this._locale,l)}this._model.setOption(r,{replaceMerge:o},av);var c={seriesTransition:s,optionChanged:!0};if(i)this[we]={silent:a,updateParams:c},this[se]=!1,this.getZr().wakeUp();else{try{Ki(this),on.update.call(this,null,c)}catch(v){throw this[we]=null,this[se]=!1,v}this._ssr||this._zr.flush(),this[we]=null,this[se]=!1,ro.call(this,a),no.call(this,a)}}},t.prototype.setTheme=function(){},t.prototype.getModel=function(){return this._model},t.prototype.getOption=function(){return this._model&&this._model.getOption()},t.prototype.getWidth=function(){return this._zr.getWidth()},t.prototype.getHeight=function(){return this._zr.getHeight()},t.prototype.getDevicePixelRatio=function(){return this._zr.painter.dpr||Ok&&window.devicePixelRatio||1},t.prototype.getRenderedCanvas=function(r){return this.renderToCanvas(r)},t.prototype.renderToCanvas=function(r){r=r||{};var n=this._zr.painter;return n.getRenderedCanvas({backgroundColor:r.backgroundColor||this._model.get(\"backgroundColor\"),pixelRatio:r.pixelRatio||this.getDevicePixelRatio()})},t.prototype.renderToSVGString=function(r){r=r||{};var n=this._zr.painter;return n.renderToString({useViewBox:r.useViewBox})},t.prototype.getSvgDataURL=function(){if(!!wt.svgSupported){var r=this._zr,n=r.storage.getDisplayList();return I(n,function(i){i.stopAnimation(null,!0)}),r.painter.toDataURL()}},t.prototype.getDataURL=function(r){if(this._disposed){this.id;return}r=r||{};var n=r.excludeComponents,i=this._model,a=[],o=this;I(n,function(l){i.eachComponent({mainType:l},function(u){var f=o._componentsMap[u.__viewId];f.group.ignore||(a.push(f),f.group.ignore=!0)})});var s=this._zr.painter.getType()===\"svg\"?this.getSvgDataURL():this.renderToCanvas(r).toDataURL(\"image/\"+(r&&r.type||\"png\"));return I(a,function(l){l.group.ignore=!1}),s},t.prototype.getConnectedDataURL=function(r){if(this._disposed){this.id;return}var n=r.type===\"svg\",i=this.group,a=Math.min,o=Math.max,s=1/0;if(Zy[i]){var l=s,u=s,f=-s,c=-s,v=[],h=r&&r.pixelRatio||this.getDevicePixelRatio();I(zo,function(_,w){if(_.group===i){var S=n?_.getZr().painter.getSvgDom().innerHTML:_.renderToCanvas(xt(r)),b=_.getDom().getBoundingClientRect();l=a(b.left,l),u=a(b.top,u),f=o(b.right,f),c=o(b.bottom,c),v.push({dom:S,left:b.left,top:b.top})}}),l*=h,u*=h,f*=h,c*=h;var d=f-l,p=c-u,g=Pi.createCanvas(),m=Qg(g,{renderer:n?\"svg\":\"canvas\"});if(m.resize({width:d,height:p}),n){var y=\"\";return I(v,function(_){var w=_.left-l,S=_.top-u;y+='<g transform=\"translate('+w+\",\"+S+')\">'+_.dom+\"</g>\"}),m.painter.getSvgRoot().innerHTML=y,r.connectedBackgroundColor&&m.painter.setBackgroundColor(r.connectedBackgroundColor),m.refreshImmediately(),m.painter.toDataURL()}else return r.connectedBackgroundColor&&m.add(new ne({shape:{x:0,y:0,width:d,height:p},style:{fill:r.connectedBackgroundColor}})),I(v,function(_){var w=new Ii({style:{x:_.left*h-l,y:_.top*h-u,image:_.dom}});m.add(w)}),m.refreshImmediately(),g.toDataURL(\"image/\"+(r&&r.type||\"png\"))}else return this.getDataURL(r)},t.prototype.convertToPixel=function(r,n){return Sc(this,\"convertToPixel\",r,n)},t.prototype.convertFromPixel=function(r,n){return Sc(this,\"convertFromPixel\",r,n)},t.prototype.containPixel=function(r,n){if(this._disposed){this.id;return}var i=this._model,a,o=Wf(i,r);return I(o,function(s,l){l.indexOf(\"Models\")>=0&&I(s,function(u){var f=u.coordinateSystem;if(f&&f.containPoint)a=a||!!f.containPoint(n);else if(l===\"seriesModels\"){var c=this._chartsMap[u.__viewId];c&&c.containPoint&&(a=a||c.containPoint(n,u))}},this)},this),!!a},t.prototype.getVisual=function(r,n){var i=this._model,a=Wf(i,r,{defaultMainType:\"series\"}),o=a.seriesModel,s=o.getData(),l=a.hasOwnProperty(\"dataIndexInside\")?a.dataIndexInside:a.hasOwnProperty(\"dataIndex\")?s.indexOfRawIndex(a.dataIndex):null;return l!=null?QO(s,l,n):JO(s,n)},t.prototype.getViewOfComponentModel=function(r){return this._componentsMap[r.__viewId]},t.prototype.getViewOfSeriesModel=function(r){return this._chartsMap[r.__viewId]},t.prototype._initEvents=function(){var r=this;I(jk,function(n){var i=function(a){var o=r.getModel(),s=a.target,l,u=n===\"globalout\";if(u?l={}:s&&_o(s,function(d){var p=Nt(d);if(p&&p.dataIndex!=null){var g=p.dataModel||o.getSeriesByIndex(p.seriesIndex);return l=g&&g.getDataParams(p.dataIndex,p.dataType)||{},!0}else if(p.eventData)return l=Y({},p.eventData),!0},!0),l){var f=l.componentType,c=l.componentIndex;(f===\"markLine\"||f===\"markPoint\"||f===\"markArea\")&&(f=\"series\",c=l.seriesIndex);var v=f&&c!=null&&o.getComponent(f,c),h=v&&r[v.mainType===\"series\"?\"_chartsMap\":\"_componentsMap\"][v.__viewId];l.event=a,l.type=n,r._$eventProcessor.eventInfo={targetEl:s,packedEvent:l,model:v,view:h},r.trigger(n,l)}};i.zrEventfulCallAtLast=!0,r._zr.on(n,i,r)}),I(Fo,function(n,i){r._messageCenter.on(i,function(a){this.trigger(i,a)},r)}),I([\"selectchanged\"],function(n){r._messageCenter.on(n,function(i){this.trigger(n,i)},r)}),ek(this._messageCenter,this,this._api)},t.prototype.isDisposed=function(){return this._disposed},t.prototype.clear=function(){if(this._disposed){this.id;return}this.setOption({series:[]},!0)},t.prototype.dispose=function(){if(this._disposed){this.id;return}this._disposed=!0;var r=this.getDom();r&&mw(this.getDom(),Qd,\"\");var n=this,i=n._api,a=n._model;I(n._componentsViews,function(o){o.dispose(a,i)}),I(n._chartsViews,function(o){o.dispose(a,i)}),n._zr.dispose(),n._dom=n._model=n._chartsMap=n._componentsMap=n._chartsViews=n._componentsViews=n._scheduler=n._api=n._zr=n._throttledZrFlush=n._theme=n._coordSysMgr=n._messageCenter=null,delete zo[n.id]},t.prototype.resize=function(r){if(!this[se]){if(this._disposed){this.id;return}this._zr.resize(r);var n=this._model;if(this._loadingFX&&this._loadingFX.resize(),!!n){var i=n.resetOption(\"media\"),a=r&&r.silent;this[we]&&(a==null&&(a=this[we].silent),i=!0,this[we]=null),this[se]=!0;try{i&&Ki(this),on.update.call(this,{type:\"resize\",animation:Y({duration:0},r&&r.animation)})}catch(o){throw this[se]=!1,o}this[se]=!1,ro.call(this,a),no.call(this,a)}}},t.prototype.showLoading=function(r,n){if(this._disposed){this.id;return}if(st(r)&&(n=r,r=\"\"),r=r||\"default\",this.hideLoading(),!!ov[r]){var i=ov[r](this._api,n),a=this._zr;this._loadingFX=i,a.add(i)}},t.prototype.hideLoading=function(){if(this._disposed){this.id;return}this._loadingFX&&this._zr.remove(this._loadingFX),this._loadingFX=null},t.prototype.makeActionFromEvent=function(r){var n=Y({},r);return n.type=Fo[r.type],n},t.prototype.dispatchAction=function(r,n){if(this._disposed){this.id;return}if(st(n)||(n={silent:!!n}),!!gu[r.type]&&!!this._model){if(this[se]){this._pendingActions.push(r);return}var i=n.silent;Tc.call(this,r,i);var a=n.flush;a?this._zr.flush():a!==!1&&wt.browser.weChat&&this._throttledZrFlush(),ro.call(this,i),no.call(this,i)}},t.prototype.updateLabelLayout=function(){sr.trigger(\"series:layoutlabels\",this._model,this._api,{updatedSeries:[]})},t.prototype.appendData=function(r){if(this._disposed){this.id;return}var n=r.seriesIndex,i=this.getModel(),a=i.getSeriesByIndex(n);a.appendData(r),this._scheduler.unfinished=!0,this.getZr().wakeUp()},t.internalField=function(){Ki=function(c){var v=c._scheduler;v.restorePipelines(c._model),v.prepareStageTasks(),bc(c,!0),bc(c,!1),v.plan()},bc=function(c,v){for(var h=c._model,d=c._scheduler,p=v?c._componentsViews:c._chartsViews,g=v?c._componentsMap:c._chartsMap,m=c._zr,y=c._api,_=0;_<p.length;_++)p[_].__alive=!1;v?h.eachComponent(function(b,x){b!==\"series\"&&w(x)}):h.eachSeries(w);function w(b){var x=b.__requireNewView;b.__requireNewView=!1;var T=\"_ec_\"+b.id+\"_\"+b.type,C=!x&&g[T];if(!C){var D=Cr(b.type),P=v?qr.getClass(D.main,D.sub):Gr.getClass(D.sub);C=new P,C.init(h,y),g[T]=C,p.push(C),m.add(C.group)}b.__viewId=C.__id=T,C.__alive=!0,C.__model=b,C.group.__ecComponentInfo={mainType:b.mainType,index:b.componentIndex},!v&&d.prepareView(C,b,h,y)}for(var _=0;_<p.length;){var S=p[_];S.__alive?_++:(!v&&S.renderTask.dispose(),m.remove(S.group),S.dispose(h,y),p.splice(_,1),g[S.__id]===S&&delete g[S.__id],S.__id=S.group.__ecComponentInfo=null)}},al=function(c,v,h,d,p){var g=c._model;if(g.setUpdatePayload(h),!d){I([].concat(c._componentsViews).concat(c._chartsViews),S);return}var m={};m[d+\"Id\"]=h[d+\"Id\"],m[d+\"Index\"]=h[d+\"Index\"],m[d+\"Name\"]=h[d+\"Name\"];var y={mainType:d,query:m};p&&(y.subType=p);var _=h.excludeSeriesId,w;_!=null&&(w=_t(),I(me(_),function(b){var x=Mr(b,null);x!=null&&w.set(x,!0)})),g&&g.eachComponent(y,function(b){var x=w&&w.get(b.id)!==null;if(!x)if(Pm(h))if(b instanceof Pa)h.type===mi&&!h.notBlur&&!b.get([\"emphasis\",\"disabled\"])&&CL(b,h,c._api);else{var T=Md(b.mainType,b.componentIndex,h.name,c._api),C=T.focusSelf,D=T.dispatchers;h.type===mi&&C&&!h.notBlur&&Hh(b.mainType,b.componentIndex,c._api),D&&I(D,function(P){h.type===mi?iu(P):au(P)})}else Uh(h)&&b instanceof Pa&&(DL(b,h,c._api),Am(b),He(c))},c),g&&g.eachComponent(y,function(b){var x=w&&w.get(b.id)!==null;x||S(c[d===\"series\"?\"_chartsMap\":\"_componentsMap\"][b.__viewId])},c);function S(b){b&&b.__alive&&b[v]&&b[v](b.__model,g,c._api,h)}},on={prepareAndUpdate:function(c){Ki(this),on.update.call(this,c,{optionChanged:c.newOption!=null})},update:function(c,v){var h=this._model,d=this._api,p=this._zr,g=this._coordSysMgr,m=this._scheduler;if(!!h){h.setUpdatePayload(c),m.restoreData(h,c),m.performSeriesTasks(h),g.create(h,d),m.performDataProcessorTasks(h,c),xc(this,h),g.update(h,d),r(h),m.performVisualTasks(h,c),Cc(this,h,d,c,v);var y=h.get(\"backgroundColor\")||\"transparent\",_=h.get(\"darkMode\");p.setBackgroundColor(y),_!=null&&_!==\"auto\"&&p.setDarkMode(_),sr.trigger(\"afterupdate\",h,d)}},updateTransform:function(c){var v=this,h=this._model,d=this._api;if(!!h){h.setUpdatePayload(c);var p=[];h.eachComponent(function(m,y){if(m!==\"series\"){var _=v.getViewOfComponentModel(y);if(_&&_.__alive)if(_.updateTransform){var w=_.updateTransform(y,h,d,c);w&&w.update&&p.push(_)}else p.push(_)}});var g=_t();h.eachSeries(function(m){var y=v._chartsMap[m.__viewId];if(y.updateTransform){var _=y.updateTransform(m,h,d,c);_&&_.update&&g.set(m.uid,1)}else g.set(m.uid,1)}),r(h),this._scheduler.performVisualTasks(h,c,{setDirty:!0,dirtyMap:g}),ol(this,h,d,c,{},g),sr.trigger(\"afterupdate\",h,d)}},updateView:function(c){var v=this._model;!v||(v.setUpdatePayload(c),Gr.markUpdateMethod(c,\"updateView\"),r(v),this._scheduler.performVisualTasks(v,c,{setDirty:!0}),Cc(this,v,this._api,c,{}),sr.trigger(\"afterupdate\",v,this._api))},updateVisual:function(c){var v=this,h=this._model;!h||(h.setUpdatePayload(c),h.eachSeries(function(d){d.getData().clearAllVisual()}),Gr.markUpdateMethod(c,\"updateVisual\"),r(h),this._scheduler.performVisualTasks(h,c,{visualType:\"visual\",setDirty:!0}),h.eachComponent(function(d,p){if(d!==\"series\"){var g=v.getViewOfComponentModel(p);g&&g.__alive&&g.updateVisual(p,h,v._api,c)}}),h.eachSeries(function(d){var p=v._chartsMap[d.__viewId];p.updateVisual(d,h,v._api,c)}),sr.trigger(\"afterupdate\",h,this._api))},updateLayout:function(c){on.update.call(this,c)}},Sc=function(c,v,h,d){if(c._disposed){c.id;return}for(var p=c._model,g=c._coordSysMgr.getCoordinateSystems(),m,y=Wf(p,h),_=0;_<g.length;_++){var w=g[_];if(w[v]&&(m=w[v](p,y,d))!=null)return m}},xc=function(c,v){var h=c._chartsMap,d=c._scheduler;v.eachSeries(function(p){d.updateStreamModes(p,h[p.__viewId])})},Tc=function(c,v){var h=this,d=this.getModel(),p=c.type,g=c.escapeConnect,m=gu[p],y=m.actionInfo,_=(y.update||\"update\").split(\":\"),w=_.pop(),S=_[0]!=null&&Cr(_[0]);this[se]=!0;var b=[c],x=!1;c.batch&&(x=!0,b=ct(c.batch,function(O){return O=Pt(Y({},O),c),O.batch=null,O}));var T=[],C,D=Uh(c),P=Pm(c);if(P&&Hw(this._api),I(b,function(O){if(C=m.action(O,h._model,h._api),C=C||Y({},O),C.type=y.event||C.type,T.push(C),P){var z=bd(c),N=z.queryOptionMap,tt=z.mainTypeSpecified,V=tt?N.keys()[0]:\"series\";al(h,w,O,V),He(h)}else D?(al(h,w,O,\"series\"),He(h)):S&&al(h,w,O,S.main,S.sub)}),w!==\"none\"&&!P&&!D&&!S)try{this[we]?(Ki(this),on.update.call(this,c),this[we]=null):on[w].call(this,c)}catch(O){throw this[se]=!1,O}if(x?C={type:y.event||p,escapeConnect:g,batch:T}:C=T[0],this[se]=!1,!v){var A=this._messageCenter;if(A.trigger(C.type,C),D){var L={type:\"selectchanged\",escapeConnect:g,selected:PL(d),isFromClick:c.isFromClick||!1,fromAction:c.type,fromActionPayload:c};A.trigger(L.type,L)}}},ro=function(c){for(var v=this._pendingActions;v.length;){var h=v.shift();Tc.call(this,h,c)}},no=function(c){!c&&this.trigger(\"updated\")},Yy=function(c,v){c.on(\"rendered\",function(h){v.trigger(\"rendered\",h),c.animation.isFinished()&&!v[we]&&!v._scheduler.unfinished&&!v._pendingActions.length&&v.trigger(\"finished\")})},qy=function(c,v){c.on(\"mouseover\",function(h){var d=h.target,p=_o(d,Gh);p&&(ML(p,h,v._api),He(v))}).on(\"mouseout\",function(h){var d=h.target,p=_o(d,Gh);p&&(AL(p,h,v._api),He(v))}).on(\"click\",function(h){var d=h.target,p=_o(d,function(y){return Nt(y).dataIndex!=null},!0);if(p){var g=p.selected?\"unselect\":\"select\",m=Nt(p);v._api.dispatchAction({type:g,dataType:m.dataType,dataIndexInside:m.dataIndex,seriesIndex:m.seriesIndex,isFromClick:!0})}})};function r(c){c.clearColorPalette(),c.eachSeries(function(v){v.clearColorPalette()})}function n(c){var v=[],h=[],d=!1;if(c.eachComponent(function(y,_){var w=_.get(\"zlevel\")||0,S=_.get(\"z\")||0,b=_.getZLevelKey();d=d||!!b,(y===\"series\"?h:v).push({zlevel:w,z:S,idx:_.componentIndex,type:y,key:b})}),d){var p=v.concat(h),g,m;xl(p,function(y,_){return y.zlevel===_.zlevel?y.z-_.z:y.zlevel-_.zlevel}),I(p,function(y){var _=c.getComponent(y.type,y.idx),w=y.zlevel,S=y.key;g!=null&&(w=Math.max(g,w)),S?(w===g&&S!==m&&w++,m=S):m&&(w===g&&w++,m=\"\"),g=w,_.setZLevel(w)})}}Cc=function(c,v,h,d,p){n(v),Xy(c,v,h,d,p),I(c._chartsViews,function(g){g.__alive=!1}),ol(c,v,h,d,p),I(c._chartsViews,function(g){g.__alive||g.remove(v,h)})},Xy=function(c,v,h,d,p,g){I(g||c._componentsViews,function(m){var y=m.__model;u(y,m),m.render(y,v,h,d),s(y,m),f(y,m)})},ol=function(c,v,h,d,p,g){var m=c._scheduler;p=Y(p||{},{updatedSeries:v.getSeries()}),sr.trigger(\"series:beforeupdate\",v,h,p);var y=!1;v.eachSeries(function(_){var w=c._chartsMap[_.__viewId];w.__alive=!0;var S=w.renderTask;m.updatePayload(S,d),u(_,w),g&&g.get(_.uid)&&S.dirty(),S.perform(m.getPerformArgs(S))&&(y=!0),w.group.silent=!!_.get(\"silent\"),o(_,w),Am(_)}),m.unfinished=y||m.unfinished,sr.trigger(\"series:layoutlabels\",v,h,p),sr.trigger(\"series:transition\",v,h,p),v.eachSeries(function(_){var w=c._chartsMap[_.__viewId];s(_,w),f(_,w)}),a(c,v),sr.trigger(\"series:afterupdate\",v,h,p)},He=function(c){c[_c]=!0,c.getZr().wakeUp()},Ky=function(c){!c[_c]||(c.getZr().storage.traverse(function(v){Oo(v)||i(v)}),c[_c]=!1)};function i(c){for(var v=[],h=c.currentStates,d=0;d<h.length;d++){var p=h[d];p===\"emphasis\"||p===\"blur\"||p===\"select\"||v.push(p)}c.selected&&c.states.select&&v.push(\"select\"),c.hoverState===Uu&&c.states.emphasis?v.push(\"emphasis\"):c.hoverState===Gu&&c.states.blur&&v.push(\"blur\"),c.useStates(v)}function a(c,v){var h=c._zr,d=h.storage,p=0;d.traverse(function(g){g.isGroup||p++}),p>v.get(\"hoverLayerThreshold\")&&!wt.node&&!wt.worker&&v.eachSeries(function(g){if(!g.preventUsingHoverLayer){var m=c._chartsMap[g.__viewId];m.__alive&&m.eachRendered(function(y){y.states.emphasis&&(y.states.emphasis.hoverLayer=!0)})}})}function o(c,v){var h=c.get(\"blendMode\")||null;v.eachRendered(function(d){d.isGroup||(d.style.blend=h)})}function s(c,v){if(!c.preventAutoZ){var h=c.get(\"z\")||0,d=c.get(\"zlevel\")||0;v.eachRendered(function(p){return l(p,h,d,-1/0),!0})}}function l(c,v,h,d){var p=c.getTextContent(),g=c.getTextGuideLine(),m=c.isGroup;if(m)for(var y=c.childrenRef(),_=0;_<y.length;_++)d=Math.max(l(y[_],v,h,d),d);else c.z=v,c.zlevel=h,d=Math.max(c.z2,d);if(p&&(p.z=v,p.zlevel=h,isFinite(d)&&(p.z2=d+2)),g){var w=c.textGuideLineConfig;g.z=v,g.zlevel=h,isFinite(d)&&(g.z2=d+(w&&w.showAbove?1:-1))}return d}function u(c,v){v.eachRendered(function(h){if(!Oo(h)){var d=h.getTextContent(),p=h.getTextGuideLine();h.stateTransition&&(h.stateTransition=null),d&&d.stateTransition&&(d.stateTransition=null),p&&p.stateTransition&&(p.stateTransition=null),h.hasState()?(h.prevStates=h.currentStates,h.clearStates()):h.prevStates&&(h.prevStates=null)}})}function f(c,v){var h=c.getModel(\"stateAnimation\"),d=c.isAnimationEnabled(),p=h.get(\"duration\"),g=p>0?{duration:p,delay:h.get(\"delay\"),easing:h.get(\"easing\")}:null;v.eachRendered(function(m){if(m.states&&m.states.emphasis){if(Oo(m))return;if(m instanceof kt&&OL(m),m.__dirty){var y=m.prevStates;y&&m.useStates(y)}if(d){m.stateTransition=g;var _=m.getTextContent(),w=m.getTextGuideLine();_&&(_.stateTransition=g),w&&(w.stateTransition=g)}m.__dirty&&i(m)}})}jy=function(c){return new(function(v){J(h,v);function h(){return v!==null&&v.apply(this,arguments)||this}return h.prototype.getCoordinateSystems=function(){return c._coordSysMgr.getCoordinateSystems()},h.prototype.getComponentByElement=function(d){for(;d;){var p=d.__ecComponentInfo;if(p!=null)return c._model.getComponent(p.mainType,p.index);d=d.parent}},h.prototype.enterEmphasis=function(d,p){iu(d,p),He(c)},h.prototype.leaveEmphasis=function(d,p){au(d,p),He(c)},h.prototype.enterBlur=function(d){TL(d),He(c)},h.prototype.leaveBlur=function(d){Nw(d),He(c)},h.prototype.enterSelect=function(d){Bw(d),He(c)},h.prototype.leaveSelect=function(d){Fw(d),He(c)},h.prototype.getModel=function(){return c.getModel()},h.prototype.getViewOfComponentModel=function(d){return c.getViewOfComponentModel(d)},h.prototype.getViewOfSeriesModel=function(d){return c.getViewOfSeriesModel(d)},h}(zb))(c)},ES=function(c){function v(h,d){for(var p=0;p<h.length;p++){var g=h[p];g[wc]=d}}I(Fo,function(h,d){c._messageCenter.on(d,function(p){if(Zy[c.group]&&c[wc]!==Wy){if(p&&p.escapeConnect)return;var g=c.makeActionFromEvent(p),m=[];I(zo,function(y){y!==c&&y.group===c.group&&m.push(y)}),v(m,Wy),I(m,function(y){y[wc]!==qk&&y.dispatchAction(g)}),v(m,Xk)}})})}}(),t}(Ir),Zd=LS.prototype;Zd.on=MS(\"on\");Zd.off=MS(\"off\");Zd.one=function(e,t,r){var n=this;function i(){for(var a=[],o=0;o<arguments.length;o++)a[o]=arguments[o];t&&t.apply&&t.apply(this,a),n.off(e,i)}this.on.call(this,e,i,r)};var jk=[\"click\",\"dblclick\",\"mouseover\",\"mouseout\",\"mousemove\",\"mousedown\",\"mouseup\",\"globalout\",\"contextmenu\"];var gu={},Fo={},iv=[],av=[],mu=[],RS={},ov={},zo={},Zy={},Kk=+new Date-0,Qd=\"_echarts_instance_\";function aH(e,t,r){var n=!(r&&r.ssr);if(n){var i=Zk(e);if(i)return i}var a=new LS(e,t,r);return a.id=\"ec_\"+Kk++,zo[a.id]=a,n&&mw(e,Qd,a.id),ES(a),sr.trigger(\"afterinit\",a),a}function Zk(e){return zo[fE(e,Qd)]}function OS(e,t){RS[e]=t}function kS(e){It(av,e)<0&&av.push(e)}function NS(e,t){tp(iv,e,t,zk)}function Qk(e){Jd(\"afterinit\",e)}function Jk(e){Jd(\"afterupdate\",e)}function Jd(e,t){sr.on(e,t)}function za(e,t,r){mt(t)&&(r=t,t=\"\");var n=st(e)?e.type:[e,e={event:t}][0];e.event=(e.event||n).toLowerCase(),t=e.event,!Fo[t]&&(Wr(Uy.test(n)&&Uy.test(t)),gu[n]||(gu[n]={action:r,actionInfo:e}),Fo[t]=n)}function tN(e,t){Gd.register(e,t)}function eN(e,t){tp(mu,e,t,xS,\"layout\")}function Li(e,t){tp(mu,e,t,TS,\"visual\")}var Qy=[];function tp(e,t,r,n,i){if((mt(t)||st(t))&&(r=t,t=n),!(It(Qy,r)>=0)){Qy.push(r);var a=hS.wrapStageHandler(r,i);a.__prio=t,a.__raw=r,e.push(a)}}function BS(e,t){ov[e]=t}function rN(e,t,r){var n=Rk(\"registerMap\");n&&n(e,t,r)}var nN=iO;Li(Kd,RO);Li(lf,OO);Li(lf,kO);Li(Kd,KO);Li(lf,ZO);Li(CS,Ik);kS($b);NS(Bk,HR);BS(\"default\",NO);za({type:mi,event:mi,update:mi},Ce);za({type:Il,event:Il,update:Il},Ce);za({type:Eo,event:Eo,update:Eo},Ce);za({type:El,event:El,update:El},Ce);za({type:Lo,event:Lo,update:Lo},Ce);OS(\"light\",qO);OS(\"dark\",XO);function io(e){return e==null?0:e.length||1}function Jy(e){return e}var iN=function(){function e(t,r,n,i,a,o){this._old=t,this._new=r,this._oldKeyGetter=n||Jy,this._newKeyGetter=i||Jy,this.context=a,this._diffModeMultiple=o===\"multiple\"}return e.prototype.add=function(t){return this._add=t,this},e.prototype.update=function(t){return this._update=t,this},e.prototype.updateManyToOne=function(t){return this._updateManyToOne=t,this},e.prototype.updateOneToMany=function(t){return this._updateOneToMany=t,this},e.prototype.updateManyToMany=function(t){return this._updateManyToMany=t,this},e.prototype.remove=function(t){return this._remove=t,this},e.prototype.execute=function(){this[this._diffModeMultiple?\"_executeMultiple\":\"_executeOneToOne\"]()},e.prototype._executeOneToOne=function(){var t=this._old,r=this._new,n={},i=new Array(t.length),a=new Array(r.length);this._initIndexMap(t,null,i,\"_oldKeyGetter\"),this._initIndexMap(r,n,a,\"_newKeyGetter\");for(var o=0;o<t.length;o++){var s=i[o],l=n[s],u=io(l);if(u>1){var f=l.shift();l.length===1&&(n[s]=l[0]),this._update&&this._update(f,o)}else u===1?(n[s]=null,this._update&&this._update(l,o)):this._remove&&this._remove(o)}this._performRestAdd(a,n)},e.prototype._executeMultiple=function(){var t=this._old,r=this._new,n={},i={},a=[],o=[];this._initIndexMap(t,n,a,\"_oldKeyGetter\"),this._initIndexMap(r,i,o,\"_newKeyGetter\");for(var s=0;s<a.length;s++){var l=a[s],u=n[l],f=i[l],c=io(u),v=io(f);if(c>1&&v===1)this._updateManyToOne&&this._updateManyToOne(f,u),i[l]=null;else if(c===1&&v>1)this._updateOneToMany&&this._updateOneToMany(f,u),i[l]=null;else if(c===1&&v===1)this._update&&this._update(f,u),i[l]=null;else if(c>1&&v>1)this._updateManyToMany&&this._updateManyToMany(f,u),i[l]=null;else if(c>1)for(var h=0;h<c;h++)this._remove&&this._remove(u[h]);else this._remove&&this._remove(u)}this._performRestAdd(o,i)},e.prototype._performRestAdd=function(t,r){for(var n=0;n<t.length;n++){var i=t[n],a=r[i],o=io(a);if(o>1)for(var s=0;s<o;s++)this._add&&this._add(a[s]);else o===1&&this._add&&this._add(a);r[i]=null}},e.prototype._initIndexMap=function(t,r,n,i){for(var a=this._diffModeMultiple,o=0;o<t.length;o++){var s=\"_ec_\"+this[i](t[o],o);if(a||(n[o]=s),!!r){var l=r[s],u=io(l);u===0?(r[s]=o,a&&n.push(s)):u===1?r[s]=[l,o]:l.push(o)}}},e}(),aN=iN,oN=function(){function e(t,r){this._encode=t,this._schema=r}return e.prototype.get=function(){return{fullDimensions:this._getFullDimensionNames(),encode:this._encode}},e.prototype._getFullDimensionNames=function(){return this._cachedDimNames||(this._cachedDimNames=this._schema?this._schema.makeOutputDimensionNames():[]),this._cachedDimNames},e}();function sN(e,t){var r={},n=r.encode={},i=_t(),a=[],o=[],s={};I(e.dimensions,function(v){var h=e.getDimensionInfo(v),d=h.coordDim;if(d){var p=h.coordDimIndex;Mc(n,d)[p]=v,h.isExtraCoord||(i.set(d,1),uN(h.type)&&(a[0]=v),Mc(s,d)[p]=e.getDimensionIndex(h.name)),h.defaultTooltip&&o.push(v)}Lb.each(function(g,m){var y=Mc(n,m),_=h.otherDims[m];_!=null&&_!==!1&&(y[_]=h.name)})});var l=[],u={};i.each(function(v,h){var d=n[h];u[h]=d[0],l=l.concat(d)}),r.dataDimsOnCoord=l,r.dataDimIndicesOnCoord=ct(l,function(v){return e.getDimensionInfo(v).storeDimIndex}),r.encodeFirstDimNotExtra=u;var f=n.label;f&&f.length&&(a=f.slice());var c=n.tooltip;return c&&c.length?o=c.slice():o.length||(o=a.slice()),n.defaultedLabel=a,n.defaultedTooltip=o,r.userOutput=new oN(s,t),r}function Mc(e,t){return e.hasOwnProperty(t)||(e[t]=[]),e[t]}function lN(e){return e===\"category\"?\"ordinal\":e===\"time\"?\"time\":\"float\"}function uN(e){return!(e===\"ordinal\"||e===\"time\")}var fN=function(){function e(t){this.otherDims={},t!=null&&Y(this,t)}return e}(),kl=fN,cN=Qt(),hN={float:\"f\",int:\"i\",ordinal:\"o\",number:\"n\",time:\"t\"},FS=function(){function e(t){this.dimensions=t.dimensions,this._dimOmitted=t.dimensionOmitted,this.source=t.source,this._fullDimCount=t.fullDimensionCount,this._updateDimOmitted(t.dimensionOmitted)}return e.prototype.isDimensionOmitted=function(){return this._dimOmitted},e.prototype._updateDimOmitted=function(t){this._dimOmitted=t,t&&(this._dimNameMap||(this._dimNameMap=$S(this.source)))},e.prototype.getSourceDimensionIndex=function(t){return Mt(this._dimNameMap.get(t),-1)},e.prototype.getSourceDimension=function(t){var r=this.source.dimensionsDefine;if(r)return r[t]},e.prototype.makeStoreSchema=function(){for(var t=this._fullDimCount,r=Gb(this.source),n=!VS(t),i=\"\",a=[],o=0,s=0;o<t;o++){var l=void 0,u=void 0,f=void 0,c=this.dimensions[s];if(c&&c.storeDimIndex===o)l=r?c.name:null,u=c.type,f=c.ordinalMeta,s++;else{var v=this.getSourceDimension(o);v&&(l=r?v.name:null,u=v.type)}a.push({property:l,type:u,ordinalMeta:f}),r&&l!=null&&(!c||!c.isCalculationCoord)&&(i+=n?l.replace(/\\`/g,\"`1\").replace(/\\$/g,\"`2\"):l),i+=\"$\",i+=hN[u]||\"f\",f&&(i+=f.uid),i+=\"$\"}var h=this.source,d=[h.seriesLayoutBy,h.startIndex,i].join(\"$$\");return{dimensions:a,hash:d}},e.prototype.makeOutputDimensionNames=function(){for(var t=[],r=0,n=0;r<this._fullDimCount;r++){var i=void 0,a=this.dimensions[n];if(a&&a.storeDimIndex===r)a.isCalculationCoord||(i=a.name),n++;else{var o=this.getSourceDimension(r);o&&(i=o.name)}t.push(i)}return t},e.prototype.appendCalculationDimension=function(t){this.dimensions.push(t),t.isCalculationCoord=!0,this._fullDimCount++,this._updateDimOmitted(!0)},e}();function zS(e){return e instanceof FS}function HS(e){for(var t=_t(),r=0;r<(e||[]).length;r++){var n=e[r],i=st(n)?n.name:n;i!=null&&t.get(i)==null&&t.set(i,r)}return t}function $S(e){var t=cN(e);return t.dimNameMap||(t.dimNameMap=HS(e.dimensionsDefine))}function VS(e){return e>30}var ao=st,sn=ct,vN=typeof Int32Array==\"undefined\"?Array:Int32Array,dN=\"e\\0\\0\",t0=-1,pN=[\"hasItemOption\",\"_nameList\",\"_idList\",\"_invertedIndicesMap\",\"_dimSummary\",\"userOutput\",\"_rawData\",\"_dimValueGetter\",\"_nameDimIdx\",\"_idDimIdx\",\"_nameRepeatCount\"],gN=[\"_approximateExtent\"],e0,sl,oo,so,Ac,ll,Dc,mN=function(){function e(t,r){this.type=\"list\",this._dimOmitted=!1,this._nameList=[],this._idList=[],this._visual={},this._layout={},this._itemVisuals=[],this._itemLayouts=[],this._graphicEls=[],this._approximateExtent={},this._calculationInfo={},this.hasItemOption=!1,this.TRANSFERABLE_METHODS=[\"cloneShallow\",\"downSample\",\"lttbDownSample\",\"map\"],this.CHANGABLE_METHODS=[\"filterSelf\",\"selectRange\"],this.DOWNSAMPLE_METHODS=[\"downSample\",\"lttbDownSample\"];var n,i=!1;zS(t)?(n=t.dimensions,this._dimOmitted=t.isDimensionOmitted(),this._schema=t):(i=!0,n=t),n=n||[\"x\",\"y\"];for(var a={},o=[],s={},l=!1,u={},f=0;f<n.length;f++){var c=n[f],v=it(c)?new kl({name:c}):c instanceof kl?c:new kl(c),h=v.name;v.type=v.type||\"float\",v.coordDim||(v.coordDim=h,v.coordDimIndex=0);var d=v.otherDims=v.otherDims||{};o.push(h),a[h]=v,u[h]!=null&&(l=!0),v.createInvertedIndices&&(s[h]=[]),d.itemName===0&&(this._nameDimIdx=f),d.itemId===0&&(this._idDimIdx=f),i&&(v.storeDimIndex=f)}if(this.dimensions=o,this._dimInfos=a,this._initGetDimensionInfo(l),this.hostModel=r,this._invertedIndicesMap=s,this._dimOmitted){var p=this._dimIdxToName=_t();I(o,function(g){p.set(a[g].storeDimIndex,g)})}}return e.prototype.getDimension=function(t){var r=this._recognizeDimIndex(t);if(r==null)return t;if(r=t,!this._dimOmitted)return this.dimensions[r];var n=this._dimIdxToName.get(r);if(n!=null)return n;var i=this._schema.getSourceDimension(r);if(i)return i.name},e.prototype.getDimensionIndex=function(t){var r=this._recognizeDimIndex(t);if(r!=null)return r;if(t==null)return-1;var n=this._getDimInfo(t);return n?n.storeDimIndex:this._dimOmitted?this._schema.getSourceDimensionIndex(t):-1},e.prototype._recognizeDimIndex=function(t){if(zt(t)||t!=null&&!isNaN(t)&&!this._getDimInfo(t)&&(!this._dimOmitted||this._schema.getSourceDimensionIndex(t)<0))return+t},e.prototype._getStoreDimIndex=function(t){var r=this.getDimensionIndex(t);return r},e.prototype.getDimensionInfo=function(t){return this._getDimInfo(this.getDimension(t))},e.prototype._initGetDimensionInfo=function(t){var r=this._dimInfos;this._getDimInfo=t?function(n){return r.hasOwnProperty(n)?r[n]:void 0}:function(n){return r[n]}},e.prototype.getDimensionsOnCoord=function(){return this._dimSummary.dataDimsOnCoord.slice()},e.prototype.mapDimension=function(t,r){var n=this._dimSummary;if(r==null)return n.encodeFirstDimNotExtra[t];var i=n.encode[t];return i?i[r]:null},e.prototype.mapDimensionsAll=function(t){var r=this._dimSummary,n=r.encode[t];return(n||[]).slice()},e.prototype.getStore=function(){return this._store},e.prototype.initData=function(t,r,n){var i=this,a;if(t instanceof jh&&(a=t),!a){var o=this.dimensions,s=Ud(t)||Me(t)?new Ub(t,o.length):t;a=new jh;var l=sn(o,function(u){return{type:i._dimInfos[u].type,property:u}});a.initData(s,l,n)}this._store=a,this._nameList=(r||[]).slice(),this._idList=[],this._nameRepeatCount={},this._doInit(0,a.count()),this._dimSummary=sN(this,this._schema),this.userOutput=this._dimSummary.userOutput},e.prototype.appendData=function(t){var r=this._store.appendData(t);this._doInit(r[0],r[1])},e.prototype.appendValues=function(t,r){var n=this._store.appendValues(t,r.length),i=n.start,a=n.end,o=this._shouldMakeIdFromName();if(this._updateOrdinalMeta(),r)for(var s=i;s<a;s++){var l=s-i;this._nameList[s]=r[l],o&&Dc(this,s)}},e.prototype._updateOrdinalMeta=function(){for(var t=this._store,r=this.dimensions,n=0;n<r.length;n++){var i=this._dimInfos[r[n]];i.ordinalMeta&&t.collectOrdinalMeta(i.storeDimIndex,i.ordinalMeta)}},e.prototype._shouldMakeIdFromName=function(){var t=this._store.getProvider();return this._idDimIdx==null&&t.getSource().sourceFormat!==Dn&&!t.fillStorage},e.prototype._doInit=function(t,r){if(!(t>=r)){var n=this._store,i=n.getProvider();this._updateOrdinalMeta();var a=this._nameList,o=this._idList,s=i.getSource().sourceFormat,l=s===rr;if(l&&!i.pure)for(var u=[],f=t;f<r;f++){var c=i.getItem(f,u);if(!this.hasItemOption&&JI(c)&&(this.hasItemOption=!0),c){var v=c.name;a[f]==null&&v!=null&&(a[f]=Mr(v,null));var h=c.id;o[f]==null&&h!=null&&(o[f]=Mr(h,null))}}if(this._shouldMakeIdFromName())for(var f=t;f<r;f++)Dc(this,f);e0(this)}},e.prototype.getApproximateExtent=function(t){return this._approximateExtent[t]||this._store.getDataExtent(this._getStoreDimIndex(t))},e.prototype.setApproximateExtent=function(t,r){r=this.getDimension(r),this._approximateExtent[r]=t.slice()},e.prototype.getCalculationInfo=function(t){return this._calculationInfo[t]},e.prototype.setCalculationInfo=function(t,r){ao(t)?Y(this._calculationInfo,t):this._calculationInfo[t]=r},e.prototype.getName=function(t){var r=this.getRawIndex(t),n=this._nameList[r];return n==null&&this._nameDimIdx!=null&&(n=oo(this,this._nameDimIdx,r)),n==null&&(n=\"\"),n},e.prototype._getCategory=function(t,r){var n=this._store.get(t,r),i=this._store.getOrdinalMeta(t);return i?i.categories[n]:n},e.prototype.getId=function(t){return sl(this,this.getRawIndex(t))},e.prototype.count=function(){return this._store.count()},e.prototype.get=function(t,r){var n=this._store,i=this._dimInfos[t];if(i)return n.get(i.storeDimIndex,r)},e.prototype.getByRawIndex=function(t,r){var n=this._store,i=this._dimInfos[t];if(i)return n.getByRawIndex(i.storeDimIndex,r)},e.prototype.getIndices=function(){return this._store.getIndices()},e.prototype.getDataExtent=function(t){return this._store.getDataExtent(this._getStoreDimIndex(t))},e.prototype.getSum=function(t){return this._store.getSum(this._getStoreDimIndex(t))},e.prototype.getMedian=function(t){return this._store.getMedian(this._getStoreDimIndex(t))},e.prototype.getValues=function(t,r){var n=this,i=this._store;return et(t)?i.getValues(sn(t,function(a){return n._getStoreDimIndex(a)}),r):i.getValues(t)},e.prototype.hasValue=function(t){for(var r=this._dimSummary.dataDimIndicesOnCoord,n=0,i=r.length;n<i;n++)if(isNaN(this._store.get(r[n],t)))return!1;return!0},e.prototype.indexOfName=function(t){for(var r=0,n=this._store.count();r<n;r++)if(this.getName(r)===t)return r;return-1},e.prototype.getRawIndex=function(t){return this._store.getRawIndex(t)},e.prototype.indexOfRawIndex=function(t){return this._store.indexOfRawIndex(t)},e.prototype.rawIndexOf=function(t,r){var n=t&&this._invertedIndicesMap[t],i=n[r];return i==null||isNaN(i)?t0:i},e.prototype.indicesOfNearest=function(t,r,n){return this._store.indicesOfNearest(this._getStoreDimIndex(t),r,n)},e.prototype.each=function(t,r,n){mt(t)&&(n=r,r=t,t=[]);var i=n||this,a=sn(so(t),this._getStoreDimIndex,this);this._store.each(a,i?Ft(r,i):r)},e.prototype.filterSelf=function(t,r,n){mt(t)&&(n=r,r=t,t=[]);var i=n||this,a=sn(so(t),this._getStoreDimIndex,this);return this._store=this._store.filter(a,i?Ft(r,i):r),this},e.prototype.selectRange=function(t){var r=this,n={},i=Gt(t);return I(i,function(a){var o=r._getStoreDimIndex(a);n[o]=t[a]}),this._store=this._store.selectRange(n),this},e.prototype.mapArray=function(t,r,n){mt(t)&&(n=r,r=t,t=[]),n=n||this;var i=[];return this.each(t,function(){i.push(r&&r.apply(this,arguments))},n),i},e.prototype.map=function(t,r,n,i){var a=n||i||this,o=sn(so(t),this._getStoreDimIndex,this),s=ll(this);return s._store=this._store.map(o,a?Ft(r,a):r),s},e.prototype.modify=function(t,r,n,i){var a=n||i||this,o=sn(so(t),this._getStoreDimIndex,this);this._store.modify(o,a?Ft(r,a):r)},e.prototype.downSample=function(t,r,n,i){var a=ll(this);return a._store=this._store.downSample(this._getStoreDimIndex(t),r,n,i),a},e.prototype.lttbDownSample=function(t,r){var n=ll(this);return n._store=this._store.lttbDownSample(this._getStoreDimIndex(t),r),n},e.prototype.getRawDataItem=function(t){return this._store.getRawDataItem(t)},e.prototype.getItemModel=function(t){var r=this.hostModel,n=this.getRawDataItem(t);return new ce(n,r,r&&r.ecModel)},e.prototype.diff=function(t){var r=this;return new aN(t?t.getStore().getIndices():[],this.getStore().getIndices(),function(n){return sl(t,n)},function(n){return sl(r,n)})},e.prototype.getVisual=function(t){var r=this._visual;return r&&r[t]},e.prototype.setVisual=function(t,r){this._visual=this._visual||{},ao(t)?Y(this._visual,t):this._visual[t]=r},e.prototype.getItemVisual=function(t,r){var n=this._itemVisuals[t],i=n&&n[r];return i==null?this.getVisual(r):i},e.prototype.hasItemVisual=function(){return this._itemVisuals.length>0},e.prototype.ensureUniqueItemVisual=function(t,r){var n=this._itemVisuals,i=n[t];i||(i=n[t]={});var a=i[r];return a==null&&(a=this.getVisual(r),et(a)?a=a.slice():ao(a)&&(a=Y({},a)),i[r]=a),a},e.prototype.setItemVisual=function(t,r,n){var i=this._itemVisuals[t]||{};this._itemVisuals[t]=i,ao(r)?Y(i,r):i[r]=n},e.prototype.clearAllVisual=function(){this._visual={},this._itemVisuals=[]},e.prototype.setLayout=function(t,r){ao(t)?Y(this._layout,t):this._layout[t]=r},e.prototype.getLayout=function(t){return this._layout[t]},e.prototype.getItemLayout=function(t){return this._itemLayouts[t]},e.prototype.setItemLayout=function(t,r,n){this._itemLayouts[t]=n?Y(this._itemLayouts[t]||{},r):r},e.prototype.clearItemLayouts=function(){this._itemLayouts.length=0},e.prototype.setItemGraphicEl=function(t,r){var n=this.hostModel&&this.hostModel.seriesIndex;dL(n,this.dataType,t,r),this._graphicEls[t]=r},e.prototype.getItemGraphicEl=function(t){return this._graphicEls[t]},e.prototype.eachItemGraphicEl=function(t,r){I(this._graphicEls,function(n,i){n&&t&&t.call(r,n,i)})},e.prototype.cloneShallow=function(t){return t||(t=new e(this._schema?this._schema:sn(this.dimensions,this._getDimInfo,this),this.hostModel)),Ac(t,this),t._store=this._store,t},e.prototype.wrapMethod=function(t,r){var n=this[t];!mt(n)||(this.__wrappedMethods=this.__wrappedMethods||[],this.__wrappedMethods.push(t),this[t]=function(){var i=n.apply(this,arguments);return r.apply(this,[i].concat(ud(arguments)))})},e.internalField=function(){e0=function(t){var r=t._invertedIndicesMap;I(r,function(n,i){var a=t._dimInfos[i],o=a.ordinalMeta,s=t._store;if(o){n=r[i]=new vN(o.categories.length);for(var l=0;l<n.length;l++)n[l]=t0;for(var l=0;l<s.count();l++)n[s.get(a.storeDimIndex,l)]=l}})},oo=function(t,r,n){return Mr(t._getCategory(r,n),null)},sl=function(t,r){var n=t._idList[r];return n==null&&t._idDimIdx!=null&&(n=oo(t,t._idDimIdx,r)),n==null&&(n=dN+r),n},so=function(t){return et(t)||(t=t!=null?[t]:[]),t},ll=function(t){var r=new e(t._schema?t._schema:sn(t.dimensions,t._getDimInfo,t),t.hostModel);return Ac(r,t),r},Ac=function(t,r){I(pN.concat(r.__wrappedMethods||[]),function(n){r.hasOwnProperty(n)&&(t[n]=r[n])}),t.__wrappedMethods=r.__wrappedMethods,I(gN,function(n){t[n]=xt(r[n])}),t._calculationInfo=Y({},r._calculationInfo)},Dc=function(t,r){var n=t._nameList,i=t._idList,a=t._nameDimIdx,o=t._idDimIdx,s=n[r],l=i[r];if(s==null&&a!=null&&(n[r]=s=oo(t,a,r)),l==null&&o!=null&&(i[r]=l=oo(t,o,r)),l==null&&s!=null){var u=t._nameRepeatCount,f=u[s]=(u[s]||0)+1;l=s,f>1&&(l+=\"__ec__\"+f),i[r]=l}}}(),e}(),GS=mN;function US(e,t){Ud(e)||(e=Wd(e)),t=t||{};var r=t.coordDimensions||[],n=t.dimensionsDefine||e.dimensionsDefine||[],i=_t(),a=[],o=_N(e,r,n,t.dimensionsCount),s=t.canOmitUnusedDimensions&&VS(o),l=n===e.dimensionsDefine,u=l?$S(e):HS(n),f=t.encodeDefine;!f&&t.encodeDefaulter&&(f=t.encodeDefaulter(e,o));for(var c=_t(f),v=new jb(o),h=0;h<v.length;h++)v[h]=-1;function d(C){var D=v[C];if(D<0){var P=n[C],A=st(P)?P:{name:P},L=new kl,O=A.name;O!=null&&u.get(O)!=null&&(L.name=L.displayName=O),A.type!=null&&(L.type=A.type),A.displayName!=null&&(L.displayName=A.displayName);var z=a.length;return v[C]=z,L.storeDimIndex=C,a.push(L),L}return a[D]}if(!s)for(var h=0;h<o;h++)d(h);c.each(function(C,D){var P=me(C).slice();if(P.length===1&&!it(P[0])&&P[0]<0){c.set(D,!1);return}var A=c.set(D,[]);I(P,function(L,O){var z=it(L)?u.get(L):L;z!=null&&z<o&&(A[O]=z,g(d(z),D,O))})});var p=0;I(r,function(C){var D,P,A,L;if(it(C))D=C,L={};else{L=C,D=L.name;var O=L.ordinalMeta;L.ordinalMeta=null,L=Y({},L),L.ordinalMeta=O,P=L.dimsDef,A=L.otherDims,L.name=L.coordDim=L.coordDimIndex=L.dimsDef=L.otherDims=null}var z=c.get(D);if(z!==!1){if(z=me(z),!z.length)for(var N=0;N<(P&&P.length||1);N++){for(;p<o&&d(p).coordDim!=null;)p++;p<o&&z.push(p++)}I(z,function(tt,V){var K=d(tt);if(l&&L.type!=null&&(K.type=L.type),g(Pt(K,L),D,V),K.name==null&&P){var lt=P[V];!st(lt)&&(lt={name:lt}),K.name=K.displayName=lt.name,K.defaultTooltip=lt.defaultTooltip}A&&Pt(K.otherDims,A)})}});function g(C,D,P){Lb.get(D)!=null?C.otherDims[D]=P:(C.coordDim=D,C.coordDimIndex=P,i.set(D,!0))}var m=t.generateCoord,y=t.generateCoordCount,_=y!=null;y=m?y||1:0;var w=m||\"value\";function S(C){C.name==null&&(C.name=C.coordDim)}if(s)I(a,function(C){S(C)}),a.sort(function(C,D){return C.storeDimIndex-D.storeDimIndex});else for(var b=0;b<o;b++){var x=d(b),T=x.coordDim;T==null&&(x.coordDim=wN(w,i,_),x.coordDimIndex=0,(!m||y<=0)&&(x.isExtraCoord=!0),y--),S(x),x.type==null&&(kb(e,b)===te.Must||x.isExtraCoord&&(x.otherDims.itemName!=null||x.otherDims.seriesName!=null))&&(x.type=\"ordinal\")}return yN(a),new FS({source:e,dimensions:a,fullDimensionCount:o,dimensionOmitted:s})}function yN(e){for(var t=_t(),r=0;r<e.length;r++){var n=e[r],i=n.name,a=t.get(i)||0;a>0&&(n.name=i+(a-1)),a++,t.set(i,a)}}function _N(e,t,r,n){var i=Math.max(e.dimensionsDetectedCount||1,t.length,r.length,n||0);return I(t,function(a){var o;st(a)&&(o=a.dimsDef)&&(i=Math.max(i,o.length))}),i}function wN(e,t,r){var n=t.data;if(r||n.hasOwnProperty(e)){for(var i=0;n.hasOwnProperty(e+i);)i++;e+=i}return t.set(e,!0),e}var bN=function(){function e(t){this.coordSysDims=[],this.axisMap=_t(),this.categoryAxisMap=_t(),this.coordSysName=t}return e}();function SN(e){var t=e.get(\"coordinateSystem\"),r=new bN(t),n=xN[t];if(n)return n(e,r,r.axisMap,r.categoryAxisMap),r}var xN={cartesian2d:function(e,t,r,n){var i=e.getReferringComponents(\"xAxis\",ur).models[0],a=e.getReferringComponents(\"yAxis\",ur).models[0];t.coordSysDims=[\"x\",\"y\"],r.set(\"x\",i),r.set(\"y\",a),Zi(i)&&(n.set(\"x\",i),t.firstCategoryDimIndex=0),Zi(a)&&(n.set(\"y\",a),t.firstCategoryDimIndex==null&&(t.firstCategoryDimIndex=1))},singleAxis:function(e,t,r,n){var i=e.getReferringComponents(\"singleAxis\",ur).models[0];t.coordSysDims=[\"single\"],r.set(\"single\",i),Zi(i)&&(n.set(\"single\",i),t.firstCategoryDimIndex=0)},polar:function(e,t,r,n){var i=e.getReferringComponents(\"polar\",ur).models[0],a=i.findAxisModel(\"radiusAxis\"),o=i.findAxisModel(\"angleAxis\");t.coordSysDims=[\"radius\",\"angle\"],r.set(\"radius\",a),r.set(\"angle\",o),Zi(a)&&(n.set(\"radius\",a),t.firstCategoryDimIndex=0),Zi(o)&&(n.set(\"angle\",o),t.firstCategoryDimIndex==null&&(t.firstCategoryDimIndex=1))},geo:function(e,t,r,n){t.coordSysDims=[\"lng\",\"lat\"]},parallel:function(e,t,r,n){var i=e.ecModel,a=i.getComponent(\"parallel\",e.get(\"parallelIndex\")),o=t.coordSysDims=a.dimensions.slice();I(a.parallelAxisIndex,function(s,l){var u=i.getComponent(\"parallelAxis\",s),f=o[l];r.set(f,u),Zi(u)&&(n.set(f,u),t.firstCategoryDimIndex==null&&(t.firstCategoryDimIndex=l))})}};function Zi(e){return e.get(\"type\")===\"category\"}function TN(e,t,r){r=r||{};var n=r.byIndex,i=r.stackedCoordDimension,a,o,s;CN(t)?a=t:(o=t.schema,a=o.dimensions,s=t.store);var l=!!(e&&e.get(\"stack\")),u,f,c,v;if(I(a,function(y,_){it(y)&&(a[_]=y={name:y}),l&&!y.isExtraCoord&&(!n&&!u&&y.ordinalMeta&&(u=y),!f&&y.type!==\"ordinal\"&&y.type!==\"time\"&&(!i||i===y.coordDim)&&(f=y))}),f&&!n&&!u&&(n=!0),f){c=\"__\\0ecstackresult_\"+e.id,v=\"__\\0ecstackedover_\"+e.id,u&&(u.createInvertedIndices=!0);var h=f.coordDim,d=f.type,p=0;I(a,function(y){y.coordDim===h&&p++});var g={name:c,coordDim:h,coordDimIndex:p,type:d,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:a.length},m={name:v,coordDim:v,coordDimIndex:p+1,type:d,isExtraCoord:!0,isCalculationCoord:!0,storeDimIndex:a.length+1};o?(s&&(g.storeDimIndex=s.ensureCalculationDimension(v,d),m.storeDimIndex=s.ensureCalculationDimension(c,d)),o.appendCalculationDimension(g),o.appendCalculationDimension(m)):(a.push(g),a.push(m))}return{stackedDimension:f&&f.name,stackedByDimension:u&&u.name,isStackedByIndex:n,stackedOverDimension:v,stackResultDimension:c}}function CN(e){return!zS(e.schema)}function us(e,t){return!!t&&t===e.getCalculationInfo(\"stackedDimension\")}function MN(e,t){return us(e,t)?e.getCalculationInfo(\"stackResultDimension\"):t}function AN(e,t){var r=e.get(\"coordinateSystem\"),n=Gd.get(r),i;return t&&t.coordSysDims&&(i=ct(t.coordSysDims,function(a){var o={name:a},s=t.axisMap.get(a);if(s){var l=s.get(\"type\");o.type=lN(l)}return o})),i||(i=n&&(n.getDimensionsInfo?n.getDimensionsInfo():n.dimensions.slice())||[\"x\",\"y\"]),i}function DN(e,t,r){var n,i;return r&&I(e,function(a,o){var s=a.coordDim,l=r.categoryAxisMap.get(s);l&&(n==null&&(n=o),a.ordinalMeta=l.getOrdinalMeta(),t&&(a.createInvertedIndices=!0)),a.otherDims.itemName!=null&&(i=!0)}),!i&&n!=null&&(e[n].otherDims.itemName=0),n}function PN(e,t,r){r=r||{};var n=t.getSourceManager(),i,a=!1;e?(a=!0,i=Wd(e)):(i=n.getSource(),a=i.sourceFormat===rr);var o=SN(t),s=AN(t,o),l=r.useEncodeDefaulter,u=mt(l)?l:l?Xt(hR,s,t):null,f={coordDimensions:s,generateCoord:r.generateCoord,encodeDefine:t.getEncode(),encodeDefaulter:u,canOmitUnusedDimensions:!a},c=US(i,f),v=DN(c.dimensions,r.createInvertedIndices,o),h=a?null:n.getSharedDataStore(c),d=TN(t,{schema:c,store:h}),p=new GS(c,t);p.setCalculationInfo(d);var g=v!=null&&IN(i)?function(m,y,_,w){return w===v?_:this.defaultDimValueGetter(m,y,_,w)}:null;return p.hasItemOption=!1,p.initData(a?i:h,null,g),p}function IN(e){if(e.sourceFormat===rr){var t=EN(e.data||[]);return!et(ms(t))}}function EN(e){for(var t=0;t<e.length&&e[t]==null;)t++;return e[t]}var WS=function(){function e(t){this._setting=t||{},this._extent=[1/0,-1/0]}return e.prototype.getSetting=function(t){return this._setting[t]},e.prototype.unionExtent=function(t){var r=this._extent;t[0]<r[0]&&(r[0]=t[0]),t[1]>r[1]&&(r[1]=t[1])},e.prototype.unionExtentFromData=function(t,r){this.unionExtent(t.getApproximateExtent(r))},e.prototype.getExtent=function(){return this._extent.slice()},e.prototype.setExtent=function(t,r){var n=this._extent;isNaN(t)||(n[0]=t),isNaN(r)||(n[1]=r)},e.prototype.isInExtentRange=function(t){return this._extent[0]<=t&&this._extent[1]>=t},e.prototype.isBlank=function(){return this._isBlank},e.prototype.setBlank=function(t){this._isBlank=t},e}();Hu(WS);var Kr=WS,LN=0,RN=function(){function e(t){this.categories=t.categories||[],this._needCollect=t.needCollect,this._deduplication=t.deduplication,this.uid=++LN}return e.createByAxisModel=function(t){var r=t.option,n=r.data,i=n&&ct(n,ON);return new e({categories:i,needCollect:!i,deduplication:r.dedplication!==!1})},e.prototype.getOrdinal=function(t){return this._getOrCreateMap().get(t)},e.prototype.parseAndCollect=function(t){var r,n=this._needCollect;if(!it(t)&&!n)return t;if(n&&!this._deduplication)return r=this.categories.length,this.categories[r]=t,r;var i=this._getOrCreateMap();return r=i.get(t),r==null&&(n?(r=this.categories.length,this.categories[r]=t,i.set(t,r)):r=NaN),r},e.prototype._getOrCreateMap=function(){return this._map||(this._map=_t(this.categories))},e}();function ON(e){return st(e)&&e.value!=null?e.value:e+\"\"}var sv=RN;function lv(e){return e.type===\"interval\"||e.type===\"log\"}function kN(e,t,r,n){var i={},a=e[1]-e[0],o=i.interval=hw(a/t,!0);r!=null&&o<r&&(o=i.interval=r),n!=null&&o>n&&(o=i.interval=n);var s=i.intervalPrecision=YS(o),l=i.niceTickExtent=[jt(Math.ceil(e[0]/o)*o,s),jt(Math.floor(e[1]/o)*o,s)];return NN(l,e),i}function Pc(e){var t=Math.pow(10,_d(e)),r=e/t;return r?r===2?r=3:r===3?r=5:r*=2:r=1,jt(r*t)}function YS(e){return zr(e)+2}function r0(e,t,r){e[t]=Math.max(Math.min(e[t],r[1]),r[0])}function NN(e,t){!isFinite(e[0])&&(e[0]=t[0]),!isFinite(e[1])&&(e[1]=t[1]),r0(e,0,t),r0(e,1,t),e[0]>e[1]&&(e[0]=e[1])}function uf(e,t){return e>=t[0]&&e<=t[1]}function ff(e,t){return t[1]===t[0]?.5:(e-t[0])/(t[1]-t[0])}function cf(e,t){return e*(t[1]-t[0])+t[0]}var qS=function(e){J(t,e);function t(r){var n=e.call(this,r)||this;n.type=\"ordinal\";var i=n.getSetting(\"ordinalMeta\");return i||(i=new sv({})),et(i)&&(i=new sv({categories:ct(i,function(a){return st(a)?a.value:a})})),n._ordinalMeta=i,n._extent=n.getSetting(\"extent\")||[0,i.categories.length-1],n}return t.prototype.parse=function(r){return it(r)?this._ordinalMeta.getOrdinal(r):Math.round(r)},t.prototype.contain=function(r){return r=this.parse(r),uf(r,this._extent)&&this._ordinalMeta.categories[r]!=null},t.prototype.normalize=function(r){return r=this._getTickNumber(this.parse(r)),ff(r,this._extent)},t.prototype.scale=function(r){return r=Math.round(cf(r,this._extent)),this.getRawOrdinalNumber(r)},t.prototype.getTicks=function(){for(var r=[],n=this._extent,i=n[0];i<=n[1];)r.push({value:i}),i++;return r},t.prototype.getMinorTicks=function(r){},t.prototype.setSortInfo=function(r){if(r==null){this._ordinalNumbersByTick=this._ticksByOrdinalNumber=null;return}for(var n=r.ordinalNumbers,i=this._ordinalNumbersByTick=[],a=this._ticksByOrdinalNumber=[],o=0,s=this._ordinalMeta.categories.length,l=Math.min(s,n.length);o<l;++o){var u=n[o];i[o]=u,a[u]=o}for(var f=0;o<s;++o){for(;a[f]!=null;)f++;i.push(f),a[f]=o}},t.prototype._getTickNumber=function(r){var n=this._ticksByOrdinalNumber;return n&&r>=0&&r<n.length?n[r]:r},t.prototype.getRawOrdinalNumber=function(r){var n=this._ordinalNumbersByTick;return n&&r>=0&&r<n.length?n[r]:r},t.prototype.getLabel=function(r){if(!this.isBlank()){var n=this.getRawOrdinalNumber(r.value),i=this._ordinalMeta.categories[n];return i==null?\"\":i+\"\"}},t.prototype.count=function(){return this._extent[1]-this._extent[0]+1},t.prototype.unionExtentFromData=function(r,n){this.unionExtent(r.getApproximateExtent(n))},t.prototype.isInExtentRange=function(r){return r=this._getTickNumber(r),this._extent[0]<=r&&this._extent[1]>=r},t.prototype.getOrdinalMeta=function(){return this._ordinalMeta},t.prototype.calcNiceTicks=function(){},t.prototype.calcNiceExtent=function(){},t.type=\"ordinal\",t}(Kr);Kr.registerClass(qS);var XS=qS,oi=jt,jS=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=\"interval\",r._interval=0,r._intervalPrecision=2,r}return t.prototype.parse=function(r){return r},t.prototype.contain=function(r){return uf(r,this._extent)},t.prototype.normalize=function(r){return ff(r,this._extent)},t.prototype.scale=function(r){return cf(r,this._extent)},t.prototype.setExtent=function(r,n){var i=this._extent;isNaN(r)||(i[0]=parseFloat(r)),isNaN(n)||(i[1]=parseFloat(n))},t.prototype.unionExtent=function(r){var n=this._extent;r[0]<n[0]&&(n[0]=r[0]),r[1]>n[1]&&(n[1]=r[1]),this.setExtent(n[0],n[1])},t.prototype.getInterval=function(){return this._interval},t.prototype.setInterval=function(r){this._interval=r,this._niceExtent=this._extent.slice(),this._intervalPrecision=YS(r)},t.prototype.getTicks=function(r){var n=this._interval,i=this._extent,a=this._niceExtent,o=this._intervalPrecision,s=[];if(!n)return s;var l=1e4;i[0]<a[0]&&(r?s.push({value:oi(a[0]-n,o)}):s.push({value:i[0]}));for(var u=a[0];u<=a[1]&&(s.push({value:u}),u=oi(u+n,o),u!==s[s.length-1].value);)if(s.length>l)return[];var f=s.length?s[s.length-1].value:a[1];return i[1]>f&&(r?s.push({value:oi(f+n,o)}):s.push({value:i[1]})),s},t.prototype.getMinorTicks=function(r){for(var n=this.getTicks(!0),i=[],a=this.getExtent(),o=1;o<n.length;o++){for(var s=n[o],l=n[o-1],u=0,f=[],c=s.value-l.value,v=c/r;u<r-1;){var h=oi(l.value+(u+1)*v);h>a[0]&&h<a[1]&&f.push(h),u++}i.push(f)}return i},t.prototype.getLabel=function(r,n){if(r==null)return\"\";var i=n&&n.precision;i==null?i=zr(r.value)||0:i===\"auto\"&&(i=this._intervalPrecision);var a=oi(r.value,i,!0);return Db(a)},t.prototype.calcNiceTicks=function(r,n,i){r=r||5;var a=this._extent,o=a[1]-a[0];if(!!isFinite(o)){o<0&&(o=-o,a.reverse());var s=kN(a,r,n,i);this._intervalPrecision=s.intervalPrecision,this._interval=s.interval,this._niceExtent=s.niceTickExtent}},t.prototype.calcNiceExtent=function(r){var n=this._extent;if(n[0]===n[1])if(n[0]!==0){var i=n[0];r.fixMax||(n[1]+=i/2),n[0]-=i/2}else n[1]=1;var a=n[1]-n[0];isFinite(a)||(n[0]=0,n[1]=1),this.calcNiceTicks(r.splitNumber,r.minInterval,r.maxInterval);var o=this._interval;r.fixMin||(n[0]=oi(Math.floor(n[0]/o)*o)),r.fixMax||(n[1]=oi(Math.ceil(n[1]/o)*o))},t.prototype.setNiceExtent=function(r,n){this._niceExtent=[r,n]},t.type=\"interval\",t}(Kr);Kr.registerClass(jS);var bs=jS,KS=typeof Float32Array!=\"undefined\",BN=KS?Float32Array:Array;function la(e){return et(e)?KS?new Float32Array(e):e:new BN(e)}var FN=\"__ec_stack_\";function ZS(e){return e.get(\"stack\")||FN+e.seriesIndex}function QS(e){return e.dim+e.index}function zN(e,t){var r=[];return t.eachSeriesByType(e,function(n){UN(n)&&r.push(n)}),r}function HN(e){var t={};I(e,function(l){var u=l.coordinateSystem,f=u.getBaseAxis();if(!(f.type!==\"time\"&&f.type!==\"value\"))for(var c=l.getData(),v=f.dim+\"_\"+f.index,h=c.getDimensionIndex(c.mapDimension(f.dim)),d=c.getStore(),p=0,g=d.count();p<g;++p){var m=d.get(h,p);t[v]?t[v].push(m):t[v]=[m]}});var r={};for(var n in t)if(t.hasOwnProperty(n)){var i=t[n];if(i){i.sort(function(l,u){return l-u});for(var a=null,o=1;o<i.length;++o){var s=i[o]-i[o-1];s>0&&(a=a===null?s:Math.min(a,s))}r[n]=a}}return r}function $N(e){var t=HN(e),r=[];return I(e,function(n){var i=n.coordinateSystem,a=i.getBaseAxis(),o=a.getExtent(),s;if(a.type===\"category\")s=a.getBandWidth();else if(a.type===\"value\"||a.type===\"time\"){var l=a.dim+\"_\"+a.index,u=t[l],f=Math.abs(o[1]-o[0]),c=a.scale.getExtent(),v=Math.abs(c[1]-c[0]);s=u?f/v*u:f}else{var h=n.getData();s=Math.abs(o[1]-o[0])/h.count()}var d=Vt(n.get(\"barWidth\"),s),p=Vt(n.get(\"barMaxWidth\"),s),g=Vt(n.get(\"barMinWidth\")||(WN(n)?.5:1),s),m=n.get(\"barGap\"),y=n.get(\"barCategoryGap\");r.push({bandWidth:s,barWidth:d,barMaxWidth:p,barMinWidth:g,barGap:m,barCategoryGap:y,axisKey:QS(a),stackId:ZS(n)})}),VN(r)}function VN(e){var t={};I(e,function(n,i){var a=n.axisKey,o=n.bandWidth,s=t[a]||{bandWidth:o,remainedWidth:o,autoWidthCount:0,categoryGap:null,gap:\"20%\",stacks:{}},l=s.stacks;t[a]=s;var u=n.stackId;l[u]||s.autoWidthCount++,l[u]=l[u]||{width:0,maxWidth:0};var f=n.barWidth;f&&!l[u].width&&(l[u].width=f,f=Math.min(s.remainedWidth,f),s.remainedWidth-=f);var c=n.barMaxWidth;c&&(l[u].maxWidth=c);var v=n.barMinWidth;v&&(l[u].minWidth=v);var h=n.barGap;h!=null&&(s.gap=h);var d=n.barCategoryGap;d!=null&&(s.categoryGap=d)});var r={};return I(t,function(n,i){r[i]={};var a=n.stacks,o=n.bandWidth,s=n.categoryGap;if(s==null){var l=Gt(a).length;s=Math.max(35-l*4,15)+\"%\"}var u=Vt(s,o),f=Vt(n.gap,1),c=n.remainedWidth,v=n.autoWidthCount,h=(c-u)/(v+(v-1)*f);h=Math.max(h,0),I(a,function(m){var y=m.maxWidth,_=m.minWidth;if(m.width){var w=m.width;y&&(w=Math.min(w,y)),_&&(w=Math.max(w,_)),m.width=w,c-=w+f*w,v--}else{var w=h;y&&y<w&&(w=Math.min(y,c)),_&&_>w&&(w=_),w!==h&&(m.width=w,c-=w+f*w,v--)}}),h=(c-u)/(v+(v-1)*f),h=Math.max(h,0);var d=0,p;I(a,function(m,y){m.width||(m.width=h),p=m,d+=m.width*(1+f)}),p&&(d-=p.width*f);var g=-d/2;I(a,function(m,y){r[i][y]=r[i][y]||{bandWidth:o,offset:g,width:m.width},g+=m.width*(1+f)})}),r}function GN(e,t,r){if(e&&t){var n=e[QS(t)];return n!=null&&r!=null?n[ZS(r)]:n}}function UN(e){return e.coordinateSystem&&e.coordinateSystem.type===\"cartesian2d\"}function WN(e){return e.pipelineContext&&e.pipelineContext.large}var YN=function(e,t,r,n){for(;r<n;){var i=r+n>>>1;e[i][1]<t?r=i+1:n=i}return r},JS=function(e){J(t,e);function t(r){var n=e.call(this,r)||this;return n.type=\"time\",n}return t.prototype.getLabel=function(r){var n=this.getSetting(\"useUTC\");return Zu(r.value,Ym[tR(ga(this._minLevelUnit))]||Ym.second,n,this.getSetting(\"locale\"))},t.prototype.getFormattedLabel=function(r,n,i){var a=this.getSetting(\"useUTC\"),o=this.getSetting(\"locale\");return eR(r,n,i,o,a)},t.prototype.getTicks=function(){var r=this._interval,n=this._extent,i=[];if(!r)return i;i.push({value:n[0],level:0});var a=this.getSetting(\"useUTC\"),o=JN(this._minLevelUnit,this._approxInterval,a,n);return i=i.concat(o),i.push({value:n[1],level:0}),i},t.prototype.calcNiceExtent=function(r){var n=this._extent;if(n[0]===n[1]&&(n[0]-=Ze,n[1]+=Ze),n[1]===-1/0&&n[0]===1/0){var i=new Date;n[1]=+new Date(i.getFullYear(),i.getMonth(),i.getDate()),n[0]=n[1]-Ze}this.calcNiceTicks(r.splitNumber,r.minInterval,r.maxInterval)},t.prototype.calcNiceTicks=function(r,n,i){r=r||10;var a=this._extent,o=a[1]-a[0];this._approxInterval=o/r,n!=null&&this._approxInterval<n&&(this._approxInterval=n),i!=null&&this._approxInterval>i&&(this._approxInterval=i);var s=ul.length,l=Math.min(YN(ul,this._approxInterval,0,s),s-1);this._interval=ul[l][1],this._minLevelUnit=ul[Math.max(l-1,0)][0]},t.prototype.parse=function(r){return zt(r)?r:+Yr(r)},t.prototype.contain=function(r){return uf(this.parse(r),this._extent)},t.prototype.normalize=function(r){return ff(this.parse(r),this._extent)},t.prototype.scale=function(r){return cf(r,this._extent)},t.type=\"time\",t}(bs),ul=[[\"second\",Bd],[\"minute\",Fd],[\"hour\",ko],[\"quarter-day\",ko*6],[\"half-day\",ko*12],[\"day\",Ze*1.2],[\"half-week\",Ze*3.5],[\"week\",Ze*7],[\"month\",Ze*31],[\"quarter\",Ze*95],[\"half-year\",Wm/2],[\"year\",Wm]];function qN(e,t,r,n){var i=Yr(t),a=Yr(r),o=function(d){return qm(i,d,n)===qm(a,d,n)},s=function(){return o(\"year\")},l=function(){return s()&&o(\"month\")},u=function(){return l()&&o(\"day\")},f=function(){return u()&&o(\"hour\")},c=function(){return f()&&o(\"minute\")},v=function(){return c()&&o(\"second\")},h=function(){return v()&&o(\"millisecond\")};switch(e){case\"year\":return s();case\"month\":return l();case\"day\":return u();case\"hour\":return f();case\"minute\":return c();case\"second\":return v();case\"millisecond\":return h()}}function XN(e,t){return e/=Ze,e>16?16:e>7.5?7:e>3.5?4:e>1.5?2:1}function jN(e){var t=30*Ze;return e/=t,e>6?6:e>3?3:e>2?2:1}function KN(e){return e/=ko,e>12?12:e>6?6:e>3.5?4:e>2?2:1}function n0(e,t){return e/=t?Fd:Bd,e>30?30:e>20?20:e>15?15:e>10?10:e>5?5:e>2?2:1}function ZN(e){return hw(e,!0)}function QN(e,t,r){var n=new Date(e);switch(ga(t)){case\"year\":case\"month\":n[Sb(r)](0);case\"day\":n[xb(r)](1);case\"hour\":n[Tb(r)](0);case\"minute\":n[Cb(r)](0);case\"second\":n[Mb(r)](0),n[Ab(r)](0)}return n.getTime()}function JN(e,t,r,n){var i=1e4,a=wb,o=0;function s(D,P,A,L,O,z,N){for(var tt=new Date(P),V=P,K=tt[L]();V<A&&V<=n[1];)N.push({value:V}),K+=D,tt[O](K),V=tt.getTime();N.push({value:V,notAdd:!0})}function l(D,P,A){var L=[],O=!P.length;if(!qN(ga(D),n[0],n[1],r)){O&&(P=[{value:QN(new Date(n[0]),D,r)},{value:n[1]}]);for(var z=0;z<P.length-1;z++){var N=P[z].value,tt=P[z+1].value;if(N!==tt){var V=void 0,K=void 0,lt=void 0,yt=!1;switch(D){case\"year\":V=Math.max(1,Math.round(t/Ze/365)),K=zd(r),lt=rR(r);break;case\"half-year\":case\"quarter\":case\"month\":V=jN(t),K=ma(r),lt=Sb(r);break;case\"week\":case\"half-week\":case\"day\":V=XN(t),K=Qu(r),lt=xb(r),yt=!0;break;case\"half-day\":case\"quarter-day\":case\"hour\":V=KN(t),K=ns(r),lt=Tb(r);break;case\"minute\":V=n0(t,!0),K=Ju(r),lt=Cb(r);break;case\"second\":V=n0(t,!1),K=tf(r),lt=Mb(r);break;case\"millisecond\":V=ZN(t),K=ef(r),lt=Ab(r);break}s(V,N,tt,K,lt,yt,L),D===\"year\"&&A.length>1&&z===0&&A.unshift({value:A[0].value-V})}}for(var z=0;z<L.length;z++)A.push(L[z]);return L}}for(var u=[],f=[],c=0,v=0,h=0;h<a.length&&o++<i;++h){var d=ga(a[h]);if(!!J2(a[h])){l(a[h],u[u.length-1]||[],f);var p=a[h+1]?ga(a[h+1]):null;if(d!==p){if(f.length){v=c,f.sort(function(D,P){return D.value-P.value});for(var g=[],m=0;m<f.length;++m){var y=f[m].value;(m===0||f[m-1].value!==y)&&(g.push(f[m]),y>=n[0]&&y<=n[1]&&c++)}var _=(n[1]-n[0])/t;if(c>_*1.5&&v>_/1.5||(u.push(g),c>_||e===a[h]))break}f=[]}}}for(var w=Se(ct(u,function(D){return Se(D,function(P){return P.value>=n[0]&&P.value<=n[1]&&!P.notAdd})}),function(D){return D.length>0}),S=[],b=w.length-1,h=0;h<w.length;++h)for(var x=w[h],T=0;T<x.length;++T)S.push({value:x[T].value,level:b-h});S.sort(function(D,P){return D.value-P.value});for(var C=[],h=0;h<S.length;++h)(h===0||S[h].value!==S[h-1].value)&&C.push(S[h]);return C}Kr.registerClass(JS);var tB=JS,i0=Kr.prototype,Ho=bs.prototype,eB=jt,rB=Math.floor,nB=Math.ceil,fl=Math.pow,$e=Math.log,ep=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=\"log\",r.base=10,r._originalScale=new bs,r._interval=0,r}return t.prototype.getTicks=function(r){var n=this._originalScale,i=this._extent,a=n.getExtent(),o=Ho.getTicks.call(this,r);return ct(o,function(s){var l=s.value,u=jt(fl(this.base,l));return u=l===i[0]&&this._fixMin?cl(u,a[0]):u,u=l===i[1]&&this._fixMax?cl(u,a[1]):u,{value:u}},this)},t.prototype.setExtent=function(r,n){var i=this.base;r=$e(r)/$e(i),n=$e(n)/$e(i),Ho.setExtent.call(this,r,n)},t.prototype.getExtent=function(){var r=this.base,n=i0.getExtent.call(this);n[0]=fl(r,n[0]),n[1]=fl(r,n[1]);var i=this._originalScale,a=i.getExtent();return this._fixMin&&(n[0]=cl(n[0],a[0])),this._fixMax&&(n[1]=cl(n[1],a[1])),n},t.prototype.unionExtent=function(r){this._originalScale.unionExtent(r);var n=this.base;r[0]=$e(r[0])/$e(n),r[1]=$e(r[1])/$e(n),i0.unionExtent.call(this,r)},t.prototype.unionExtentFromData=function(r,n){this.unionExtent(r.getApproximateExtent(n))},t.prototype.calcNiceTicks=function(r){r=r||10;var n=this._extent,i=n[1]-n[0];if(!(i===1/0||i<=0)){var a=KI(i),o=r/i*a;for(o<=.5&&(a*=10);!isNaN(a)&&Math.abs(a)<1&&Math.abs(a)>0;)a*=10;var s=[jt(nB(n[0]/a)*a),jt(rB(n[1]/a)*a)];this._interval=a,this._niceExtent=s}},t.prototype.calcNiceExtent=function(r){Ho.calcNiceExtent.call(this,r),this._fixMin=r.fixMin,this._fixMax=r.fixMax},t.prototype.parse=function(r){return r},t.prototype.contain=function(r){return r=$e(r)/$e(this.base),uf(r,this._extent)},t.prototype.normalize=function(r){return r=$e(r)/$e(this.base),ff(r,this._extent)},t.prototype.scale=function(r){return r=cf(r,this._extent),fl(this.base,r)},t.type=\"log\",t}(Kr),tx=ep.prototype;tx.getMinorTicks=Ho.getMinorTicks;tx.getLabel=Ho.getLabel;function cl(e,t){return eB(e,zr(t))}Kr.registerClass(ep);var iB=ep,aB=function(){function e(t,r,n){this._prepareParams(t,r,n)}return e.prototype._prepareParams=function(t,r,n){n[1]<n[0]&&(n=[NaN,NaN]),this._dataMin=n[0],this._dataMax=n[1];var i=this._isOrdinal=t.type===\"ordinal\";this._needCrossZero=t.type===\"interval\"&&r.getNeedCrossZero&&r.getNeedCrossZero();var a=this._modelMinRaw=r.get(\"min\",!0);mt(a)?this._modelMinNum=hl(t,a({min:n[0],max:n[1]})):a!==\"dataMin\"&&(this._modelMinNum=hl(t,a));var o=this._modelMaxRaw=r.get(\"max\",!0);if(mt(o)?this._modelMaxNum=hl(t,o({min:n[0],max:n[1]})):o!==\"dataMax\"&&(this._modelMaxNum=hl(t,o)),i)this._axisDataLen=r.getCategories().length;else{var s=r.get(\"boundaryGap\"),l=et(s)?s:[s||0,s||0];typeof l[0]==\"boolean\"||typeof l[1]==\"boolean\"?this._boundaryGapInner=[0,0]:this._boundaryGapInner=[Rn(l[0],1),Rn(l[1],1)]}},e.prototype.calculate=function(){var t=this._isOrdinal,r=this._dataMin,n=this._dataMax,i=this._axisDataLen,a=this._boundaryGapInner,o=t?null:n-r||Math.abs(r),s=this._modelMinRaw===\"dataMin\"?r:this._modelMinNum,l=this._modelMaxRaw===\"dataMax\"?n:this._modelMaxNum,u=s!=null,f=l!=null;s==null&&(s=t?i?0:NaN:r-a[0]*o),l==null&&(l=t?i?i-1:NaN:n+a[1]*o),(s==null||!isFinite(s))&&(s=NaN),(l==null||!isFinite(l))&&(l=NaN);var c=ql(s)||ql(l)||t&&!i;this._needCrossZero&&(s>0&&l>0&&!u&&(s=0),s<0&&l<0&&!f&&(l=0));var v=this._determinedMin,h=this._determinedMax;return v!=null&&(s=v,u=!0),h!=null&&(l=h,f=!0),{min:s,max:l,minFixed:u,maxFixed:f,isBlank:c}},e.prototype.modifyDataMinMax=function(t,r){this[sB[t]]=r},e.prototype.setDeterminedMinMax=function(t,r){var n=oB[t];this[n]=r},e.prototype.freeze=function(){this.frozen=!0},e}(),oB={min:\"_determinedMin\",max:\"_determinedMax\"},sB={min:\"_dataMin\",max:\"_dataMax\"};function lB(e,t,r){var n=e.rawExtentInfo;return n||(n=new aB(e,t,r),e.rawExtentInfo=n,n)}function hl(e,t){return t==null?null:ql(t)?NaN:e.parse(t)}function ex(e,t){var r=e.type,n=lB(e,t,e.getExtent()).calculate();e.setBlank(n.isBlank);var i=n.min,a=n.max,o=t.ecModel;if(o&&r===\"time\"){var s=zN(\"bar\",o),l=!1;if(I(s,function(c){l=l||c.getBaseAxis()===t.axis}),l){var u=$N(s),f=uB(i,a,t,u);i=f.min,a=f.max}}return{extent:[i,a],fixMin:n.minFixed,fixMax:n.maxFixed}}function uB(e,t,r,n){var i=r.axis.getExtent(),a=i[1]-i[0],o=GN(n,r.axis);if(o===void 0)return{min:e,max:t};var s=1/0;I(o,function(h){s=Math.min(h.offset,s)});var l=-1/0;I(o,function(h){l=Math.max(h.offset+h.width,l)}),s=Math.abs(s),l=Math.abs(l);var u=s+l,f=t-e,c=1-(s+l)/a,v=f/c-f;return t+=v*(l/u),e-=v*(s/u),{min:e,max:t}}function a0(e,t){var r=t,n=ex(e,r),i=n.extent,a=r.get(\"splitNumber\");e instanceof iB&&(e.base=r.get(\"logBase\"));var o=e.type,s=r.get(\"interval\"),l=o===\"interval\"||o===\"time\";e.setExtent(i[0],i[1]),e.calcNiceExtent({splitNumber:a,fixMin:n.fixMin,fixMax:n.fixMax,minInterval:l?r.get(\"minInterval\"):null,maxInterval:l?r.get(\"maxInterval\"):null}),s!=null&&e.setInterval&&e.setInterval(s)}function fB(e,t){if(t=t||e.get(\"type\"),t)switch(t){case\"category\":return new XS({ordinalMeta:e.getOrdinalMeta?e.getOrdinalMeta():e.getCategories(),extent:[1/0,-1/0]});case\"time\":return new tB({locale:e.ecModel.getLocaleModel(),useUTC:e.ecModel.get(\"useUTC\")});default:return new(Kr.getClass(t)||bs)}}function cB(e){var t=e.scale.getExtent(),r=t[0],n=t[1];return!(r>0&&n>0||r<0&&n<0)}function Ss(e){var t=e.getLabelModel().get(\"formatter\"),r=e.type===\"category\"?e.scale.getExtent()[0]:null;return e.scale.type===\"time\"?function(n){return function(i,a){return e.scale.getFormattedLabel(i,a,n)}}(t):it(t)?function(n){return function(i){var a=e.scale.getLabel(i),o=n.replace(\"{value}\",a!=null?a:\"\");return o}}(t):mt(t)?function(n){return function(i,a){return r!=null&&(a=i.value-r),n(rp(e,i),a,i.level!=null?{level:i.level}:null)}}(t):function(n){return e.scale.getLabel(n)}}function rp(e,t){return e.type===\"category\"?e.scale.getLabel(t):t.value}function hB(e){var t=e.model,r=e.scale;if(!(!t.get([\"axisLabel\",\"show\"])||r.isBlank())){var n,i,a=r.getExtent();r instanceof XS?i=r.count():(n=r.getTicks(),i=n.length);var o=e.getLabelModel(),s=Ss(e),l,u=1;i>40&&(u=Math.ceil(i/40));for(var f=0;f<i;f+=u){var c=n?n[f]:{value:a[0]+f},v=s(c,f),h=o.getTextRect(v),d=vB(h,o.get(\"rotate\")||0);l?l.union(d):l=d}return l}}function vB(e,t){var r=t*Math.PI/180,n=e.width,i=e.height,a=n*Math.abs(Math.cos(r))+Math.abs(i*Math.sin(r)),o=n*Math.abs(Math.sin(r))+Math.abs(i*Math.cos(r)),s=new Ot(e.x,e.y,a,o);return s}function np(e){var t=e.get(\"interval\");return t==null?\"auto\":t}function rx(e){return e.type===\"category\"&&np(e.getLabelModel())===0}function dB(e,t){var r={};return I(e.mapDimensionsAll(t),function(n){r[MN(e,n)]=!0}),Gt(r)}var pB=function(){function e(){}return e.prototype.getNeedCrossZero=function(){var t=this.option;return!t.scale},e.prototype.getCoordSysModel=function(){},e}(),o0=[],gB={registerPreprocessor:kS,registerProcessor:NS,registerPostInit:Qk,registerPostUpdate:Jk,registerUpdateLifecycle:Jd,registerAction:za,registerCoordinateSystem:tN,registerLayout:eN,registerVisual:Li,registerTransform:nN,registerLoading:BS,registerMap:rN,registerImpl:Lk,PRIORITY:Yk,ComponentModel:$t,ComponentView:qr,SeriesModel:Pa,ChartView:Gr,registerComponentModel:function(e){$t.registerClass(e)},registerComponentView:function(e){qr.registerClass(e)},registerSeriesModel:function(e){Pa.registerClass(e)},registerChartView:function(e){Gr.registerClass(e)},registerSubTypeDefaulter:function(e,t){$t.registerSubTypeDefaulter(e,t)},registerPainter:function(e,t){GI(e,t)}};function Ci(e){if(et(e)){I(e,function(t){Ci(t)});return}It(o0,e)>=0||(o0.push(e),mt(e)&&(e={install:e}),e.install(gB))}var fs=Qt();function mB(e){return e.type===\"category\"?_B(e):bB(e)}function yB(e,t){return e.type===\"category\"?wB(e,t):{ticks:ct(e.scale.getTicks(),function(r){return r.value})}}function _B(e){var t=e.getLabelModel(),r=nx(e,t);return!t.get(\"show\")||e.scale.isBlank()?{labels:[],labelCategoryInterval:r.labelCategoryInterval}:r}function nx(e,t){var r=ix(e,\"labels\"),n=np(t),i=ax(r,n);if(i)return i;var a,o;return mt(n)?a=lx(e,n):(o=n===\"auto\"?SB(e):n,a=sx(e,o)),ox(r,n,{labels:a,labelCategoryInterval:o})}function wB(e,t){var r=ix(e,\"ticks\"),n=np(t),i=ax(r,n);if(i)return i;var a,o;if((!t.get(\"show\")||e.scale.isBlank())&&(a=[]),mt(n))a=lx(e,n,!0);else if(n===\"auto\"){var s=nx(e,e.getLabelModel());o=s.labelCategoryInterval,a=ct(s.labels,function(l){return l.tickValue})}else o=n,a=sx(e,o,!0);return ox(r,n,{ticks:a,tickCategoryInterval:o})}function bB(e){var t=e.scale.getTicks(),r=Ss(e);return{labels:ct(t,function(n,i){return{level:n.level,formattedLabel:r(n,i),rawLabel:e.scale.getLabel(n),tickValue:n.value}})}}function ix(e,t){return fs(e)[t]||(fs(e)[t]=[])}function ax(e,t){for(var r=0;r<e.length;r++)if(e[r].key===t)return e[r].value}function ox(e,t,r){return e.push({key:t,value:r}),r}function SB(e){var t=fs(e).autoInterval;return t!=null?t:fs(e).autoInterval=e.calculateCategoryInterval()}function xB(e){var t=TB(e),r=Ss(e),n=(t.axisRotate-t.labelRotate)/180*Math.PI,i=e.scale,a=i.getExtent(),o=i.count();if(a[1]-a[0]<1)return 0;var s=1;o>40&&(s=Math.max(1,Math.floor(o/40)));for(var l=a[0],u=e.dataToCoord(l+1)-e.dataToCoord(l),f=Math.abs(u*Math.cos(n)),c=Math.abs(u*Math.sin(n)),v=0,h=0;l<=a[1];l+=s){var d=0,p=0,g=gd(r({value:l}),t.font,\"center\",\"top\");d=g.width*1.3,p=g.height*1.3,v=Math.max(v,d,7),h=Math.max(h,p,7)}var m=v/f,y=h/c;isNaN(m)&&(m=1/0),isNaN(y)&&(y=1/0);var _=Math.max(0,Math.floor(Math.min(m,y))),w=fs(e.model),S=e.getExtent(),b=w.lastAutoInterval,x=w.lastTickCount;return b!=null&&x!=null&&Math.abs(b-_)<=1&&Math.abs(x-o)<=1&&b>_&&w.axisExtent0===S[0]&&w.axisExtent1===S[1]?_=b:(w.lastTickCount=o,w.lastAutoInterval=_,w.axisExtent0=S[0],w.axisExtent1=S[1]),_}function TB(e){var t=e.getLabelModel();return{axisRotate:e.getRotate?e.getRotate():e.isHorizontal&&!e.isHorizontal()?90:0,labelRotate:t.get(\"rotate\")||0,font:t.getFont()}}function sx(e,t,r){var n=Ss(e),i=e.scale,a=i.getExtent(),o=e.getLabelModel(),s=[],l=Math.max((t||0)+1,1),u=a[0],f=i.count();u!==0&&l>1&&f/l>2&&(u=Math.round(Math.ceil(u/l)*l));var c=rx(e),v=o.get(\"showMinLabel\")||c,h=o.get(\"showMaxLabel\")||c;v&&u!==a[0]&&p(a[0]);for(var d=u;d<=a[1];d+=l)p(d);h&&d-l!==a[1]&&p(a[1]);function p(g){var m={value:g};s.push(r?g:{formattedLabel:n(m),rawLabel:i.getLabel(m),tickValue:g})}return s}function lx(e,t,r){var n=e.scale,i=Ss(e),a=[];return I(n.getTicks(),function(o){var s=n.getLabel(o),l=o.value;t(o.value,s)&&a.push(r?l:{formattedLabel:i(o),rawLabel:s,tickValue:l})}),a}var s0=[0,1],CB=function(){function e(t,r,n){this.onBand=!1,this.inverse=!1,this.dim=t,this.scale=r,this._extent=n||[0,0]}return e.prototype.contain=function(t){var r=this._extent,n=Math.min(r[0],r[1]),i=Math.max(r[0],r[1]);return t>=n&&t<=i},e.prototype.containData=function(t){return this.scale.contain(t)},e.prototype.getExtent=function(){return this._extent.slice()},e.prototype.getPixelPrecision=function(t){return YI(t||this.scale.getExtent(),this._extent)},e.prototype.setExtent=function(t,r){var n=this._extent;n[0]=t,n[1]=r},e.prototype.dataToCoord=function(t,r){var n=this._extent,i=this.scale;return t=i.normalize(t),this.onBand&&i.type===\"ordinal\"&&(n=n.slice(),l0(n,i.count())),Rh(t,s0,n,r)},e.prototype.coordToData=function(t,r){var n=this._extent,i=this.scale;this.onBand&&i.type===\"ordinal\"&&(n=n.slice(),l0(n,i.count()));var a=Rh(t,n,s0,r);return this.scale.scale(a)},e.prototype.pointToData=function(t,r){},e.prototype.getTicksCoords=function(t){t=t||{};var r=t.tickModel||this.getTickModel(),n=yB(this,r),i=n.ticks,a=ct(i,function(s){return{coord:this.dataToCoord(this.scale.type===\"ordinal\"?this.scale.getRawOrdinalNumber(s):s),tickValue:s}},this),o=r.get(\"alignWithLabel\");return MB(this,a,o,t.clamp),a},e.prototype.getMinorTicksCoords=function(){if(this.scale.type===\"ordinal\")return[];var t=this.model.getModel(\"minorTick\"),r=t.get(\"splitNumber\");r>0&&r<100||(r=5);var n=this.scale.getMinorTicks(r),i=ct(n,function(a){return ct(a,function(o){return{coord:this.dataToCoord(o),tickValue:o}},this)},this);return i},e.prototype.getViewLabels=function(){return mB(this).labels},e.prototype.getLabelModel=function(){return this.model.getModel(\"axisLabel\")},e.prototype.getTickModel=function(){return this.model.getModel(\"axisTick\")},e.prototype.getBandWidth=function(){var t=this._extent,r=this.scale.getExtent(),n=r[1]-r[0]+(this.onBand?1:0);n===0&&(n=1);var i=Math.abs(t[1]-t[0]);return Math.abs(i)/n},e.prototype.calculateCategoryInterval=function(){return xB(this)},e}();function l0(e,t){var r=e[1]-e[0],n=t,i=r/n/2;e[0]+=i,e[1]-=i}function MB(e,t,r,n){var i=t.length;if(!e.onBand||r||!i)return;var a=e.getExtent(),o,s;if(i===1)t[0].coord=a[0],o=t[1]={coord:a[0]};else{var l=t[i-1].tickValue-t[0].tickValue,u=(t[i-1].coord-t[0].coord)/l;I(t,function(h){h.coord-=u/2});var f=e.scale.getExtent();s=1+f[1]-t[i-1].tickValue,o={coord:t[i-1].coord+u*s},t.push(o)}var c=a[0]>a[1];v(t[0].coord,a[0])&&(n?t[0].coord=a[0]:t.shift()),n&&v(a[0],t[0].coord)&&t.unshift({coord:a[0]}),v(a[1],o.coord)&&(n?o.coord=a[1]:t.pop()),n&&v(o.coord,a[1])&&t.push({coord:a[1]});function v(h,d){return h=jt(h),d=jt(d),c?h>d:h<d}}var AB=CB;On.CMD;function ux(e,t,r,n,i,a,o,s){var l=i-e,u=a-t,f=r-e,c=n-t,v=Math.sqrt(f*f+c*c);f/=v,c/=v;var h=l*f+u*c,d=h/v;s&&(d=Math.min(Math.max(d,0),1)),d*=v;var p=o[0]=e+d*f,g=o[1]=t+d*c;return Math.sqrt((p-i)*(p-i)+(g-a)*(g-a))}var mn=new pt,Ut=new pt,re=new pt,yn=new pt,Sr=new pt,yu=[],ge=new pt;function DB(e,t){if(t<=180&&t>0){t=t/180*Math.PI,mn.fromArray(e[0]),Ut.fromArray(e[1]),re.fromArray(e[2]),pt.sub(yn,mn,Ut),pt.sub(Sr,re,Ut);var r=yn.len(),n=Sr.len();if(!(r<.001||n<.001)){yn.scale(1/r),Sr.scale(1/n);var i=yn.dot(Sr),a=Math.cos(t);if(a<i){var o=ux(Ut.x,Ut.y,re.x,re.y,mn.x,mn.y,yu,!1);ge.fromArray(yu),ge.scaleAndAdd(Sr,o/Math.tan(Math.PI-t));var s=re.x!==Ut.x?(ge.x-Ut.x)/(re.x-Ut.x):(ge.y-Ut.y)/(re.y-Ut.y);if(isNaN(s))return;s<0?pt.copy(ge,Ut):s>1&&pt.copy(ge,re),ge.toArray(e[1])}}}}function PB(e,t,r){if(r<=180&&r>0){r=r/180*Math.PI,mn.fromArray(e[0]),Ut.fromArray(e[1]),re.fromArray(e[2]),pt.sub(yn,Ut,mn),pt.sub(Sr,re,Ut);var n=yn.len(),i=Sr.len();if(!(n<.001||i<.001)){yn.scale(1/n),Sr.scale(1/i);var a=yn.dot(t),o=Math.cos(r);if(a<o){var s=ux(Ut.x,Ut.y,re.x,re.y,mn.x,mn.y,yu,!1);ge.fromArray(yu);var l=Math.PI/2,u=Math.acos(Sr.dot(t)),f=l+u-r;if(f>=l)pt.copy(ge,re);else{ge.scaleAndAdd(Sr,s/Math.tan(Math.PI/2-f));var c=re.x!==Ut.x?(ge.x-Ut.x)/(re.x-Ut.x):(ge.y-Ut.y)/(re.y-Ut.y);if(isNaN(c))return;c<0?pt.copy(ge,Ut):c>1&&pt.copy(ge,re)}ge.toArray(e[1])}}}}function u0(e,t,r,n){var i=r===\"normal\",a=i?e:e.ensureState(r);a.ignore=t;var o=n.get(\"smooth\");o&&o===!0&&(o=.3),a.shape=a.shape||{},o>0&&(a.shape.smooth=o);var s=n.getModel(\"lineStyle\").getLineStyle();i?e.useStyle(s):a.style=s}function IB(e,t){var r=t.smooth,n=t.points;if(!!n)if(e.moveTo(n[0][0],n[0][1]),r>0&&n.length>=3){var i=mh(n[0],n[1]),a=mh(n[1],n[2]);if(!i||!a){e.lineTo(n[1][0],n[1][1]),e.lineTo(n[2][0],n[2][1]);return}var o=Math.min(i,a)*r,s=Cf([],n[1],n[0],o/i),l=Cf([],n[1],n[2],o/a),u=Cf([],s,l,.5);e.bezierCurveTo(s[0],s[1],s[0],s[1],u[0],u[1]),e.bezierCurveTo(l[0],l[1],l[0],l[1],n[2][0],n[2][1])}else for(var f=1;f<n.length;f++)e.lineTo(n[f][0],n[f][1])}function EB(e,t,r){var n=e.getTextGuideLine(),i=e.getTextContent();if(!i){n&&e.removeTextGuideLine();return}for(var a=t.normal,o=a.get(\"show\"),s=i.ignore,l=0;l<nu.length;l++){var u=nu[l],f=t[u],c=u===\"normal\";if(f){var v=f.get(\"show\"),h=c?s:Mt(i.states[u]&&i.states[u].ignore,s);if(h||!Mt(v,o)){var d=c?n:n&&n.states.normal;d&&(d.ignore=!0);continue}n||(n=new Yu,e.setTextGuideLine(n),!c&&(s||!o)&&u0(n,!0,\"normal\",t.normal),e.stateProxy&&(n.stateProxy=e.stateProxy)),u0(n,!1,u,f)}}if(n){Pt(n.style,r),n.style.fill=null;var p=a.get(\"showAbove\"),g=e.textGuideLineConfig=e.textGuideLineConfig||{};g.showAbove=p||!1,n.buildPath=IB}}function LB(e,t){t=t||\"labelLine\";for(var r={normal:e.getModel(t)},n=0;n<er.length;n++){var i=er[n];r[i]=e.getModel([i,t])}return r}function RB(e){for(var t=[],r=0;r<e.length;r++){var n=e[r];if(!n.defaultAttr.ignore){var i=n.label,a=i.getComputedTransform(),o=i.getBoundingRect(),s=!a||a[1]<1e-5&&a[2]<1e-5,l=i.style.margin||0,u=o.clone();u.applyTransform(a),u.x-=l/2,u.y-=l/2,u.width+=l,u.height+=l;var f=s?new su(o,a):null;t.push({label:i,labelLine:n.labelLine,rect:u,localRect:o,obb:f,priority:n.priority,defaultAttr:n.defaultAttr,layoutOption:n.computedLayoutOption,axisAligned:s,transform:a})}}return t}function OB(e,t,r,n,i,a){var o=e.length;if(o<2)return;e.sort(function(T,C){return T.rect[t]-C.rect[t]});for(var s=0,l,u=!1,f=0,c=0;c<o;c++){var v=e[c],h=v.rect;l=h[t]-s,l<0&&(h[t]-=l,v.label[t]-=l,u=!0);var d=Math.max(-l,0);f+=d,s=h[t]+h[r]}f>0&&a&&S(-f/o,0,o);var p=e[0],g=e[o-1],m,y;_(),m<0&&b(-m,.8),y<0&&b(y,.8),_(),w(m,y,1),w(y,m,-1),_(),m<0&&x(-m),y<0&&x(y);function _(){m=p.rect[t]-n,y=i-g.rect[t]-g.rect[r]}function w(T,C,D){if(T<0){var P=Math.min(C,-T);if(P>0){S(P*D,0,o);var A=P+T;A<0&&b(-A*D,1)}else b(-T*D,1)}}function S(T,C,D){T!==0&&(u=!0);for(var P=C;P<D;P++){var A=e[P],L=A.rect;L[t]+=T,A.label[t]+=T}}function b(T,C){for(var D=[],P=0,A=1;A<o;A++){var L=e[A-1].rect,O=Math.max(e[A].rect[t]-L[t]-L[r],0);D.push(O),P+=O}if(!!P){var z=Math.min(Math.abs(T)/P,C);if(T>0)for(var A=0;A<o-1;A++){var N=D[A]*z;S(N,0,A+1)}else for(var A=o-1;A>0;A--){var N=D[A-1]*z;S(-N,A,o)}}}function x(T){var C=T<0?-1:1;T=Math.abs(T);for(var D=Math.ceil(T/(o-1)),P=0;P<o-1;P++)if(C>0?S(D,0,P+1):S(-D,o-P-1,o),T-=D,T<=0)return}return u}function kB(e,t,r,n){return OB(e,\"y\",\"height\",t,r,n)}function NB(e){var t=[];e.sort(function(p,g){return g.priority-p.priority});var r=new Ot(0,0,0,0);function n(p){if(!p.ignore){var g=p.ensureState(\"emphasis\");g.ignore==null&&(g.ignore=!1)}p.ignore=!0}for(var i=0;i<e.length;i++){var a=e[i],o=a.axisAligned,s=a.localRect,l=a.transform,u=a.label,f=a.labelLine;r.copy(a.rect),r.width-=.1,r.height-=.1,r.x+=.05,r.y+=.05;for(var c=a.obb,v=!1,h=0;h<t.length;h++){var d=t[h];if(!!r.intersect(d.rect)){if(o&&d.axisAligned){v=!0;break}if(d.obb||(d.obb=new su(d.localRect,d.transform)),c||(c=new su(s,l)),c.intersect(d.obb)){v=!0;break}}}v?(n(u),f&&n(f)):(u.attr(\"ignore\",a.defaultAttr.ignore),f&&f.attr(\"ignore\",a.defaultAttr.labelGuideIgnore),t.push(a))}}var BB=function(e){J(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.type=\"grid\",t.dependencies=[\"xAxis\",\"yAxis\"],t.layoutMode=\"box\",t.defaultOption={show:!1,z:0,left:\"10%\",top:60,right:\"10%\",bottom:70,containLabel:!1,backgroundColor:\"rgba(0,0,0,0)\",borderWidth:1,borderColor:\"#ccc\"},t}($t),FB=BB,uv=function(e){J(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.getCoordSysModel=function(){return this.getReferringComponents(\"grid\",ur).models[0]},t.type=\"cartesian2dAxis\",t}($t);Pr(uv,pB);var fx={show:!0,z:0,inverse:!1,name:\"\",nameLocation:\"end\",nameRotate:null,nameTruncate:{maxWidth:null,ellipsis:\"...\",placeholder:\".\"},nameTextStyle:{},nameGap:15,silent:!1,triggerEvent:!1,tooltip:{show:!1},axisPointer:{},axisLine:{show:!0,onZero:!0,onZeroAxisIndex:null,lineStyle:{color:\"#6E7079\",width:1,type:\"solid\"},symbol:[\"none\",\"none\"],symbolSize:[10,15]},axisTick:{show:!0,inside:!1,length:5,lineStyle:{width:1}},axisLabel:{show:!0,inside:!1,rotate:0,showMinLabel:null,showMaxLabel:null,margin:8,fontSize:12},splitLine:{show:!0,lineStyle:{color:[\"#E0E6F1\"],width:1,type:\"solid\"}},splitArea:{show:!1,areaStyle:{color:[\"rgba(250,250,250,0.2)\",\"rgba(210,219,238,0.2)\"]}}},zB=Dt({boundaryGap:!0,deduplication:null,splitLine:{show:!1},axisTick:{alignWithLabel:!1,interval:\"auto\"},axisLabel:{interval:\"auto\"}},fx),ip=Dt({boundaryGap:[0,0],axisLine:{show:\"auto\"},axisTick:{show:\"auto\"},splitNumber:5,minorTick:{show:!1,splitNumber:5,length:3,lineStyle:{}},minorSplitLine:{show:!1,lineStyle:{color:\"#F4F7FD\",width:1}}},fx),HB=Dt({splitNumber:6,axisLabel:{showMinLabel:!1,showMaxLabel:!1,rich:{primary:{fontWeight:\"bold\"}}},splitLine:{show:!1}},ip),$B=Pt({logBase:10},ip),VB={category:zB,value:ip,time:HB,log:$B},GB={value:1,category:1,time:1,log:1};function f0(e,t,r,n){I(GB,function(i,a){var o=Dt(Dt({},VB[a],!0),n,!0),s=function(l){J(u,l);function u(){var f=l!==null&&l.apply(this,arguments)||this;return f.type=t+\"Axis.\"+a,f}return u.prototype.mergeDefaultAndTheme=function(f,c){var v=is(this),h=v?nf(f):{},d=c.getTheme();Dt(f,d.get(a+\"Axis\")),Dt(f,this.getDefaultOption()),f.type=c0(f),v&&Aa(f,h,v)},u.prototype.optionUpdated=function(){var f=this.option;f.type===\"category\"&&(this.__ordinalMeta=sv.createByAxisModel(this))},u.prototype.getCategories=function(f){var c=this.option;if(c.type===\"category\")return f?c.data:this.__ordinalMeta.categories},u.prototype.getOrdinalMeta=function(){return this.__ordinalMeta},u.type=t+\"Axis.\"+a,u.defaultOption=o,u}(r);e.registerComponentModel(s)}),e.registerSubTypeDefaulter(t+\"Axis\",c0)}function c0(e){return e.type||(e.data?\"category\":\"value\")}var UB=function(){function e(t){this.type=\"cartesian\",this._dimList=[],this._axes={},this.name=t||\"\"}return e.prototype.getAxis=function(t){return this._axes[t]},e.prototype.getAxes=function(){return ct(this._dimList,function(t){return this._axes[t]},this)},e.prototype.getAxesByScale=function(t){return t=t.toLowerCase(),Se(this.getAxes(),function(r){return r.scale.type===t})},e.prototype.addAxis=function(t){var r=t.dim;this._axes[r]=t,this._dimList.push(r)},e}(),WB=UB,fv=[\"x\",\"y\"];function h0(e){return e.type===\"interval\"||e.type===\"time\"}var YB=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=\"cartesian2d\",r.dimensions=fv,r}return t.prototype.calcAffineTransform=function(){this._transform=this._invTransform=null;var r=this.getAxis(\"x\").scale,n=this.getAxis(\"y\").scale;if(!(!h0(r)||!h0(n))){var i=r.getExtent(),a=n.getExtent(),o=this.dataToPoint([i[0],a[0]]),s=this.dataToPoint([i[1],a[1]]),l=i[1]-i[0],u=a[1]-a[0];if(!(!l||!u)){var f=(s[0]-o[0])/l,c=(s[1]-o[1])/u,v=o[0]-i[0]*f,h=o[1]-a[0]*c,d=this._transform=[f,0,0,c,v,h];this._invTransform=dd([],d)}}},t.prototype.getBaseAxis=function(){return this.getAxesByScale(\"ordinal\")[0]||this.getAxesByScale(\"time\")[0]||this.getAxis(\"x\")},t.prototype.containPoint=function(r){var n=this.getAxis(\"x\"),i=this.getAxis(\"y\");return n.contain(n.toLocalCoord(r[0]))&&i.contain(i.toLocalCoord(r[1]))},t.prototype.containData=function(r){return this.getAxis(\"x\").containData(r[0])&&this.getAxis(\"y\").containData(r[1])},t.prototype.dataToPoint=function(r,n,i){i=i||[];var a=r[0],o=r[1];if(this._transform&&a!=null&&isFinite(a)&&o!=null&&isFinite(o))return tr(i,r,this._transform);var s=this.getAxis(\"x\"),l=this.getAxis(\"y\");return i[0]=s.toGlobalCoord(s.dataToCoord(a,n)),i[1]=l.toGlobalCoord(l.dataToCoord(o,n)),i},t.prototype.clampData=function(r,n){var i=this.getAxis(\"x\").scale,a=this.getAxis(\"y\").scale,o=i.getExtent(),s=a.getExtent(),l=i.parse(r[0]),u=a.parse(r[1]);return n=n||[],n[0]=Math.min(Math.max(Math.min(o[0],o[1]),l),Math.max(o[0],o[1])),n[1]=Math.min(Math.max(Math.min(s[0],s[1]),u),Math.max(s[0],s[1])),n},t.prototype.pointToData=function(r,n){var i=[];if(this._invTransform)return tr(i,r,this._invTransform);var a=this.getAxis(\"x\"),o=this.getAxis(\"y\");return i[0]=a.coordToData(a.toLocalCoord(r[0]),n),i[1]=o.coordToData(o.toLocalCoord(r[1]),n),i},t.prototype.getOtherAxis=function(r){return this.getAxis(r.dim===\"x\"?\"y\":\"x\")},t.prototype.getArea=function(){var r=this.getAxis(\"x\").getGlobalExtent(),n=this.getAxis(\"y\").getGlobalExtent(),i=Math.min(r[0],r[1]),a=Math.min(n[0],n[1]),o=Math.max(r[0],r[1])-i,s=Math.max(n[0],n[1])-a;return new Ot(i,a,o,s)},t}(WB),qB=YB,XB=function(e){J(t,e);function t(r,n,i,a,o){var s=e.call(this,r,n,i)||this;return s.index=0,s.type=a||\"value\",s.position=o||\"bottom\",s}return t.prototype.isHorizontal=function(){var r=this.position;return r===\"top\"||r===\"bottom\"},t.prototype.getGlobalExtent=function(r){var n=this.getExtent();return n[0]=this.toGlobalCoord(n[0]),n[1]=this.toGlobalCoord(n[1]),r&&n[0]>n[1]&&n.reverse(),n},t.prototype.pointToData=function(r,n){return this.coordToData(this.toLocalCoord(r[this.dim===\"x\"?0:1]),n)},t.prototype.setCategorySortInfo=function(r){if(this.type!==\"category\")return!1;this.model.option.categorySortInfo=r,this.scale.setSortInfo(r)},t}(AB),jB=XB;function cv(e,t,r){r=r||{};var n=e.coordinateSystem,i=t.axis,a={},o=i.getAxesOnZeroOf()[0],s=i.position,l=o?\"onZero\":s,u=i.dim,f=n.getRect(),c=[f.x,f.x+f.width,f.y,f.y+f.height],v={left:0,right:1,top:0,bottom:1,onZero:2},h=t.get(\"offset\")||0,d=u===\"x\"?[c[2]-h,c[3]+h]:[c[0]-h,c[1]+h];if(o){var p=o.toGlobalCoord(o.dataToCoord(0));d[v.onZero]=Math.max(Math.min(p,d[1]),d[0])}a.position=[u===\"y\"?d[v[l]]:c[0],u===\"x\"?d[v[l]]:c[3]],a.rotation=Math.PI/2*(u===\"x\"?0:1);var g={top:-1,bottom:1,left:-1,right:1};a.labelDirection=a.tickDirection=a.nameDirection=g[s],a.labelOffset=o?d[v[s]]-d[v.onZero]:0,t.get([\"axisTick\",\"inside\"])&&(a.tickDirection=-a.tickDirection),Zo(r.labelInside,t.get([\"axisLabel\",\"inside\"]))&&(a.labelDirection=-a.labelDirection);var m=t.get([\"axisLabel\",\"rotate\"]);return a.labelRotate=l===\"top\"?-m:m,a.z2=1,a}function v0(e){return e.get(\"coordinateSystem\")===\"cartesian2d\"}function d0(e){var t={xAxisModel:null,yAxisModel:null};return I(t,function(r,n){var i=n.replace(/Model$/,\"\"),a=e.getReferringComponents(i,ur).models[0];t[n]=a}),t}var Ic=Math.log;function KB(e,t,r){var n=bs.prototype,i=n.getTicks.call(r),a=n.getTicks.call(r,!0),o=i.length-1,s=n.getInterval.call(r),l=ex(e,t),u=l.extent,f=l.fixMin,c=l.fixMax;if(e.type===\"log\"){var v=Ic(e.base);u=[Ic(u[0])/v,Ic(u[1])/v]}e.setExtent(u[0],u[1]),e.calcNiceExtent({splitNumber:o,fixMin:f,fixMax:c});var h=n.getExtent.call(e);f&&(u[0]=h[0]),c&&(u[1]=h[1]);var d=n.getInterval.call(e),p=u[0],g=u[1];if(f&&c)d=(g-p)/o;else if(f)for(g=u[0]+d*o;g<u[1]&&isFinite(g)&&isFinite(u[1]);)d=Pc(d),g=u[0]+d*o;else if(c)for(p=u[1]-d*o;p>u[0]&&isFinite(p)&&isFinite(u[0]);)d=Pc(d),p=u[1]-d*o;else{var m=e.getTicks().length-1;m>o&&(d=Pc(d));var y=d*o;g=Math.ceil(u[1]/d)*d,p=jt(g-y),p<0&&u[0]>=0?(p=0,g=jt(y)):g>0&&u[1]<=0&&(g=0,p=-jt(y))}var _=(i[0].value-a[0].value)/s,w=(i[o].value-a[o].value)/s;n.setExtent.call(e,p+d*_,g+d*w),n.setInterval.call(e,d),(_||w)&&n.setNiceExtent.call(e,p+d,g-d)}var ZB=function(){function e(t,r,n){this.type=\"grid\",this._coordsMap={},this._coordsList=[],this._axesMap={},this._axesList=[],this.axisPointerEnabled=!0,this.dimensions=fv,this._initCartesian(t,r,n),this.model=t}return e.prototype.getRect=function(){return this._rect},e.prototype.update=function(t,r){var n=this._axesMap;this._updateScale(t,this.model);function i(o){var s,l=Gt(o),u=l.length;if(!!u){for(var f=[],c=u-1;c>=0;c--){var v=+l[c],h=o[v],d=h.model,p=h.scale;lv(p)&&d.get(\"alignTicks\")&&d.get(\"interval\")==null?f.push(h):(a0(p,d),lv(p)&&(s=h))}f.length&&(s||(s=f.pop(),a0(s.scale,s.model)),I(f,function(g){KB(g.scale,g.model,s.scale)}))}}i(n.x),i(n.y);var a={};I(n.x,function(o){p0(n,\"y\",o,a)}),I(n.y,function(o){p0(n,\"x\",o,a)}),this.resize(this.model,r)},e.prototype.resize=function(t,r,n){var i=t.getBoxLayoutParams(),a=!n&&t.get(\"containLabel\"),o=Ma(i,{width:r.getWidth(),height:r.getHeight()});this._rect=o;var s=this._axesList;l(),a&&(I(s,function(u){if(!u.model.get([\"axisLabel\",\"inside\"])){var f=hB(u);if(f){var c=u.isHorizontal()?\"height\":\"width\",v=u.model.get([\"axisLabel\",\"margin\"]);o[c]-=f[c]+v,u.position===\"top\"?o.y+=f.height+v:u.position===\"left\"&&(o.x+=f.width+v)}}}),l()),I(this._coordsList,function(u){u.calcAffineTransform()});function l(){I(s,function(u){var f=u.isHorizontal(),c=f?[0,o.width]:[0,o.height],v=u.inverse?1:0;u.setExtent(c[v],c[1-v]),QB(u,f?o.x:o.y)})}},e.prototype.getAxis=function(t,r){var n=this._axesMap[t];if(n!=null)return n[r||0]},e.prototype.getAxes=function(){return this._axesList.slice()},e.prototype.getCartesian=function(t,r){if(t!=null&&r!=null){var n=\"x\"+t+\"y\"+r;return this._coordsMap[n]}st(t)&&(r=t.yAxisIndex,t=t.xAxisIndex);for(var i=0,a=this._coordsList;i<a.length;i++)if(a[i].getAxis(\"x\").index===t||a[i].getAxis(\"y\").index===r)return a[i]},e.prototype.getCartesians=function(){return this._coordsList.slice()},e.prototype.convertToPixel=function(t,r,n){var i=this._findConvertTarget(r);return i.cartesian?i.cartesian.dataToPoint(n):i.axis?i.axis.toGlobalCoord(i.axis.dataToCoord(n)):null},e.prototype.convertFromPixel=function(t,r,n){var i=this._findConvertTarget(r);return i.cartesian?i.cartesian.pointToData(n):i.axis?i.axis.coordToData(i.axis.toLocalCoord(n)):null},e.prototype._findConvertTarget=function(t){var r=t.seriesModel,n=t.xAxisModel||r&&r.getReferringComponents(\"xAxis\",ur).models[0],i=t.yAxisModel||r&&r.getReferringComponents(\"yAxis\",ur).models[0],a=t.gridModel,o=this._coordsList,s,l;if(r)s=r.coordinateSystem,It(o,s)<0&&(s=null);else if(n&&i)s=this.getCartesian(n.componentIndex,i.componentIndex);else if(n)l=this.getAxis(\"x\",n.componentIndex);else if(i)l=this.getAxis(\"y\",i.componentIndex);else if(a){var u=a.coordinateSystem;u===this&&(s=this._coordsList[0])}return{cartesian:s,axis:l}},e.prototype.containPoint=function(t){var r=this._coordsList[0];if(r)return r.containPoint(t)},e.prototype._initCartesian=function(t,r,n){var i=this,a=this,o={left:!1,right:!1,top:!1,bottom:!1},s={x:{},y:{}},l={x:0,y:0};if(r.eachComponent(\"xAxis\",u(\"x\"),this),r.eachComponent(\"yAxis\",u(\"y\"),this),!l.x||!l.y){this._axesMap={},this._axesList=[];return}this._axesMap=s,I(s.x,function(f,c){I(s.y,function(v,h){var d=\"x\"+c+\"y\"+h,p=new qB(d);p.master=i,p.model=t,i._coordsMap[d]=p,i._coordsList.push(p),p.addAxis(f),p.addAxis(v)})});function u(f){return function(c,v){if(!!Ec(c,t)){var h=c.get(\"position\");f===\"x\"?h!==\"top\"&&h!==\"bottom\"&&(h=o.bottom?\"top\":\"bottom\"):h!==\"left\"&&h!==\"right\"&&(h=o.left?\"right\":\"left\"),o[h]=!0;var d=new jB(f,fB(c),[0,0],c.get(\"type\"),h),p=d.type===\"category\";d.onBand=p&&c.get(\"boundaryGap\"),d.inverse=c.get(\"inverse\"),c.axis=d,d.model=c,d.grid=a,d.index=v,a._axesList.push(d),s[f][v]=d,l[f]++}}}},e.prototype._updateScale=function(t,r){I(this._axesList,function(i){if(i.scale.setExtent(1/0,-1/0),i.type===\"category\"){var a=i.model.get(\"categorySortInfo\");i.scale.setSortInfo(a)}}),t.eachSeries(function(i){if(v0(i)){var a=d0(i),o=a.xAxisModel,s=a.yAxisModel;if(!Ec(o,r)||!Ec(s,r))return;var l=this.getCartesian(o.componentIndex,s.componentIndex),u=i.getData(),f=l.getAxis(\"x\"),c=l.getAxis(\"y\");n(u,f),n(u,c)}},this);function n(i,a){I(dB(i,a.dim),function(o){a.scale.unionExtentFromData(i,o)})}},e.prototype.getTooltipAxes=function(t){var r=[],n=[];return I(this.getCartesians(),function(i){var a=t!=null&&t!==\"auto\"?i.getAxis(t):i.getBaseAxis(),o=i.getOtherAxis(a);It(r,a)<0&&r.push(a),It(n,o)<0&&n.push(o)}),{baseAxes:r,otherAxes:n}},e.create=function(t,r){var n=[];return t.eachComponent(\"grid\",function(i,a){var o=new e(i,t,r);o.name=\"grid_\"+a,o.resize(i,r,!0),i.coordinateSystem=o,n.push(o)}),t.eachSeries(function(i){if(!!v0(i)){var a=d0(i),o=a.xAxisModel,s=a.yAxisModel,l=o.getCoordSysModel(),u=l.coordinateSystem;i.coordinateSystem=u.getCartesian(o.componentIndex,s.componentIndex)}}),n},e.dimensions=fv,e}();function Ec(e,t){return e.getCoordSysModel()===t}function p0(e,t,r,n){r.getAxesOnZeroOf=function(){return a?[a]:[]};var i=e[t],a,o=r.model,s=o.get([\"axisLine\",\"onZero\"]),l=o.get([\"axisLine\",\"onZeroAxisIndex\"]);if(!s)return;if(l!=null)g0(i[l])&&(a=i[l]);else for(var u in i)if(i.hasOwnProperty(u)&&g0(i[u])&&!n[f(i[u])]){a=i[u];break}a&&(n[f(a)]=!0);function f(c){return c.dim+\"_\"+c.index}}function g0(e){return e&&e.type!==\"category\"&&e.type!==\"time\"&&cB(e)}function QB(e,t){var r=e.getExtent(),n=r[0]+r[1];e.toGlobalCoord=e.dim===\"x\"?function(i){return i+t}:function(i){return n-i+t},e.toLocalCoord=e.dim===\"x\"?function(i){return i-t}:function(i){return n-i+t}}var JB=ZB,_n=Math.PI,yi=function(){function e(t,r){this.group=new ye,this.opt=r,this.axisModel=t,Pt(r,{labelOffset:0,nameDirection:1,tickDirection:1,labelDirection:1,silent:!0,handleAutoShown:function(){return!0}});var n=new ye({x:r.position[0],y:r.position[1],rotation:r.rotation});n.updateTransform(),this._transformGroup=n}return e.prototype.hasBuilder=function(t){return!!m0[t]},e.prototype.add=function(t){m0[t](this.opt,this.axisModel,this.group,this._transformGroup)},e.prototype.getGroup=function(){return this.group},e.innerTextLayout=function(t,r,n){var i=cw(r-t),a,o;return eu(i)?(o=n>0?\"top\":\"bottom\",a=\"center\"):eu(i-_n)?(o=n>0?\"bottom\":\"top\",a=\"center\"):(o=\"middle\",i>0&&i<_n?a=n>0?\"right\":\"left\":a=n>0?\"left\":\"right\"),{rotation:i,textAlign:a,textVerticalAlign:o}},e.makeAxisEventDataBase=function(t){var r={componentType:t.mainType,componentIndex:t.componentIndex};return r[t.mainType+\"Index\"]=t.componentIndex,r},e.isLabelSilent=function(t){var r=t.get(\"tooltip\");return t.get(\"silent\")||!(t.get(\"triggerEvent\")||r&&r.show)},e}(),m0={axisLine:function(e,t,r,n){var i=t.get([\"axisLine\",\"show\"]);if(i===\"auto\"&&e.handleAutoShown&&(i=e.handleAutoShown(\"axisLine\")),!!i){var a=t.axis.getExtent(),o=n.transform,s=[a[0],0],l=[a[1],0];o&&(tr(s,s,o),tr(l,l,o));var u=Y({lineCap:\"round\"},t.getModel([\"axisLine\",\"lineStyle\"]).getLineStyle()),f=new xi({subPixelOptimize:!0,shape:{x1:s[0],y1:s[1],x2:l[0],y2:l[1]},style:u,strokeContainThreshold:e.strokeContainThreshold||5,silent:!0,z2:1});f.anid=\"line\",r.add(f);var c=t.get([\"axisLine\",\"symbol\"]);if(c!=null){var v=t.get([\"axisLine\",\"symbolSize\"]);it(c)&&(c=[c,c]),(it(v)||zt(v))&&(v=[v,v]);var h=dS(t.get([\"axisLine\",\"symbolOffset\"])||0,v),d=v[0],p=v[1];I([{rotate:e.rotation+Math.PI/2,offset:h[0],r:0},{rotate:e.rotation-Math.PI/2,offset:h[1],r:Math.sqrt((s[0]-l[0])*(s[0]-l[0])+(s[1]-l[1])*(s[1]-l[1]))}],function(g,m){if(c[m]!==\"none\"&&c[m]!=null){var y=Ia(c[m],-d/2,-p/2,d,p,u.stroke,!0),_=g.r+g.offset;y.attr({rotation:g.rotate,x:s[0]+_*Math.cos(e.rotation),y:s[1]-_*Math.sin(e.rotation),silent:!0,z2:11}),r.add(y)}})}}},axisTickLabel:function(e,t,r,n){var i=rF(r,n,t,e),a=iF(r,n,t,e);if(eF(t,a,i),nF(r,n,t,e.tickDirection),t.get([\"axisLabel\",\"hideOverlap\"])){var o=RB(ct(a,function(s){return{label:s,priority:s.z2,defaultAttr:{ignore:s.ignore}}}));NB(o)}},axisName:function(e,t,r,n){var i=Zo(e.axisName,t.get(\"name\"));if(!!i){var a=t.get(\"nameLocation\"),o=e.nameDirection,s=t.getModel(\"nameTextStyle\"),l=t.get(\"nameGap\")||0,u=t.axis.getExtent(),f=u[0]>u[1]?-1:1,c=[a===\"start\"?u[0]-f*l:a===\"end\"?u[1]+f*l:(u[0]+u[1])/2,_0(a)?e.labelOffset+o*l:0],v,h=t.get(\"nameRotate\");h!=null&&(h=h*_n/180);var d;_0(a)?v=yi.innerTextLayout(e.rotation,h!=null?h:e.rotation,o):(v=tF(e.rotation,a,h||0,u),d=e.axisNameAvailableWidth,d!=null&&(d=Math.abs(d/Math.sin(v.rotation)),!isFinite(d)&&(d=null)));var p=s.getFont(),g=t.get(\"nameTruncate\",!0)||{},m=g.ellipsis,y=Zo(e.nameTruncateMaxWidth,g.maxWidth,d),_=new he({x:c[0],y:c[1],rotation:v.rotation,silent:yi.isLabelSilent(t),style:kn(s,{text:i,font:p,overflow:\"truncate\",width:y,ellipsis:m,fill:s.getTextColor()||t.get([\"axisLine\",\"lineStyle\",\"color\"]),align:s.get(\"align\")||v.textAlign,verticalAlign:s.get(\"verticalAlign\")||v.textVerticalAlign}),z2:1});if(Rd({el:_,componentModel:t,itemName:i}),_.__fullText=i,_.anid=\"name\",t.get(\"triggerEvent\")){var w=yi.makeAxisEventDataBase(t);w.targetType=\"axisName\",w.name=i,Nt(_).eventData=w}n.add(_),_.updateTransform(),r.add(_),_.decomposeTransform()}}};function tF(e,t,r,n){var i=cw(r-e),a,o,s=n[0]>n[1],l=t===\"start\"&&!s||t!==\"start\"&&s;return eu(i-_n/2)?(o=l?\"bottom\":\"top\",a=\"center\"):eu(i-_n*1.5)?(o=l?\"top\":\"bottom\",a=\"center\"):(o=\"middle\",i<_n*1.5&&i>_n/2?a=l?\"left\":\"right\":a=l?\"right\":\"left\"),{rotation:i,textAlign:a,textVerticalAlign:o}}function eF(e,t,r){if(!rx(e.axis)){var n=e.get([\"axisLabel\",\"showMinLabel\"]),i=e.get([\"axisLabel\",\"showMaxLabel\"]);t=t||[],r=r||[];var a=t[0],o=t[1],s=t[t.length-1],l=t[t.length-2],u=r[0],f=r[1],c=r[r.length-1],v=r[r.length-2];n===!1?(Ve(a),Ve(u)):y0(a,o)&&(n?(Ve(o),Ve(f)):(Ve(a),Ve(u))),i===!1?(Ve(s),Ve(c)):y0(l,s)&&(i?(Ve(l),Ve(v)):(Ve(s),Ve(c)))}}function Ve(e){e&&(e.ignore=!0)}function y0(e,t){var r=e&&e.getBoundingRect().clone(),n=t&&t.getBoundingRect().clone();if(!(!r||!n)){var i=hd([]);return vd(i,i,-e.rotation),r.applyTransform(pa([],i,e.getLocalTransform())),n.applyTransform(pa([],i,t.getLocalTransform())),r.intersect(n)}}function _0(e){return e===\"middle\"||e===\"center\"}function cx(e,t,r,n,i){for(var a=[],o=[],s=[],l=0;l<e.length;l++){var u=e[l].coord;o[0]=u,o[1]=0,s[0]=u,s[1]=r,t&&(tr(o,o,t),tr(s,s,t));var f=new xi({subPixelOptimize:!0,shape:{x1:o[0],y1:o[1],x2:s[0],y2:s[1]},style:n,z2:2,autoBatch:!0,silent:!0});f.anid=i+\"_\"+e[l].tickValue,a.push(f)}return a}function rF(e,t,r,n){var i=r.axis,a=r.getModel(\"axisTick\"),o=a.get(\"show\");if(o===\"auto\"&&n.handleAutoShown&&(o=n.handleAutoShown(\"axisTick\")),!(!o||i.scale.isBlank())){for(var s=a.getModel(\"lineStyle\"),l=n.tickDirection*a.get(\"length\"),u=i.getTicksCoords(),f=cx(u,t.transform,l,Pt(s.getLineStyle(),{stroke:r.get([\"axisLine\",\"lineStyle\",\"color\"])}),\"ticks\"),c=0;c<f.length;c++)e.add(f[c]);return f}}function nF(e,t,r,n){var i=r.axis,a=r.getModel(\"minorTick\");if(!(!a.get(\"show\")||i.scale.isBlank())){var o=i.getMinorTicksCoords();if(!!o.length)for(var s=a.getModel(\"lineStyle\"),l=n*a.get(\"length\"),u=Pt(s.getLineStyle(),Pt(r.getModel(\"axisTick\").getLineStyle(),{stroke:r.get([\"axisLine\",\"lineStyle\",\"color\"])})),f=0;f<o.length;f++)for(var c=cx(o[f],t.transform,l,u,\"minorticks_\"+f),v=0;v<c.length;v++)e.add(c[v])}}function iF(e,t,r,n){var i=r.axis,a=Zo(n.axisLabelShow,r.get([\"axisLabel\",\"show\"]));if(!(!a||i.scale.isBlank())){var o=r.getModel(\"axisLabel\"),s=o.get(\"margin\"),l=i.getViewLabels(),u=(Zo(n.labelRotate,o.get(\"rotate\"))||0)*_n/180,f=yi.innerTextLayout(n.rotation,u,n.labelDirection),c=r.getCategories&&r.getCategories(!0),v=[],h=yi.isLabelSilent(r),d=r.get(\"triggerEvent\");return I(l,function(p,g){var m=i.scale.type===\"ordinal\"?i.scale.getRawOrdinalNumber(p.tickValue):p.tickValue,y=p.formattedLabel,_=p.rawLabel,w=o;if(c&&c[m]){var S=c[m];st(S)&&S.textStyle&&(w=new ce(S.textStyle,o,r.ecModel))}var b=w.getTextColor()||r.get([\"axisLine\",\"lineStyle\",\"color\"]),x=i.dataToCoord(m),T=new he({x,y:n.labelOffset+n.labelDirection*s,rotation:f.rotation,silent:h,z2:10+(p.level||0),style:kn(w,{text:y,align:w.getShallow(\"align\",!0)||f.textAlign,verticalAlign:w.getShallow(\"verticalAlign\",!0)||w.getShallow(\"baseline\",!0)||f.textVerticalAlign,fill:mt(b)?b(i.type===\"category\"?_:i.type===\"value\"?m+\"\":m,g):b})});if(T.anid=\"label_\"+m,d){var C=yi.makeAxisEventDataBase(r);C.targetType=\"axisLabel\",C.value=_,C.tickIndex=g,i.type===\"category\"&&(C.dataIndex=m),Nt(T).eventData=C}t.add(T),T.updateTransform(),v.push(T),e.add(T),T.decomposeTransform()}),v}}var hx=yi;function aF(e,t){var r={axesInfo:{},seriesInvolved:!1,coordSysAxesInfo:{},coordSysMap:{}};return oF(r,e,t),r.seriesInvolved&&lF(r,e),r}function oF(e,t,r){var n=t.getComponent(\"tooltip\"),i=t.getComponent(\"axisPointer\"),a=i.get(\"link\",!0)||[],o=[];I(r.getCoordinateSystems(),function(s){if(!s.axisPointerEnabled)return;var l=cs(s.model),u=e.coordSysAxesInfo[l]={};e.coordSysMap[l]=s;var f=s.model,c=f.getModel(\"tooltip\",n);if(I(s.getAxes(),Xt(p,!1,null)),s.getTooltipAxes&&n&&c.get(\"show\")){var v=c.get(\"trigger\")===\"axis\",h=c.get([\"axisPointer\",\"type\"])===\"cross\",d=s.getTooltipAxes(c.get([\"axisPointer\",\"axis\"]));(v||h)&&I(d.baseAxes,Xt(p,h?\"cross\":!0,v)),h&&I(d.otherAxes,Xt(p,\"cross\",!1))}function p(g,m,y){var _=y.model.getModel(\"axisPointer\",i),w=_.get(\"show\");if(!(!w||w===\"auto\"&&!g&&!hv(_))){m==null&&(m=_.get(\"triggerTooltip\")),_=g?sF(y,c,i,t,g,m):_;var S=_.get(\"snap\"),b=cs(y.model),x=m||S||y.type===\"category\",T=e.axesInfo[b]={key:b,axis:y,coordSys:s,axisPointerModel:_,triggerTooltip:m,involveSeries:x,snap:S,useHandle:hv(_),seriesModels:[],linkGroup:null};u[b]=T,e.seriesInvolved=e.seriesInvolved||x;var C=uF(a,y);if(C!=null){var D=o[C]||(o[C]={axesInfo:{}});D.axesInfo[b]=T,D.mapper=a[C].mapper,T.linkGroup=D}}}})}function sF(e,t,r,n,i,a){var o=t.getModel(\"axisPointer\"),s=[\"type\",\"snap\",\"lineStyle\",\"shadowStyle\",\"label\",\"animation\",\"animationDurationUpdate\",\"animationEasingUpdate\",\"z\"],l={};I(s,function(v){l[v]=xt(o.get(v))}),l.snap=e.type!==\"category\"&&!!a,o.get(\"type\")===\"cross\"&&(l.type=\"line\");var u=l.label||(l.label={});if(u.show==null&&(u.show=!1),i===\"cross\"){var f=o.get([\"label\",\"show\"]);if(u.show=f!=null?f:!0,!a){var c=l.lineStyle=o.get(\"crossStyle\");c&&Pt(u,c.textStyle)}}return e.model.getModel(\"axisPointer\",new ce(l,r,n))}function lF(e,t){t.eachSeries(function(r){var n=r.coordinateSystem,i=r.get([\"tooltip\",\"trigger\"],!0),a=r.get([\"tooltip\",\"show\"],!0);!n||i===\"none\"||i===!1||i===\"item\"||a===!1||r.get([\"axisPointer\",\"show\"],!0)===!1||I(e.coordSysAxesInfo[cs(n.model)],function(o){var s=o.axis;n.getAxis(s.dim)===s&&(o.seriesModels.push(r),o.seriesDataCount==null&&(o.seriesDataCount=0),o.seriesDataCount+=r.getData().count())})})}function uF(e,t){for(var r=t.model,n=t.dim,i=0;i<e.length;i++){var a=e[i]||{};if(Lc(a[n+\"AxisId\"],r.id)||Lc(a[n+\"AxisIndex\"],r.componentIndex)||Lc(a[n+\"AxisName\"],r.name))return i}}function Lc(e,t){return e===\"all\"||et(e)&&It(e,t)>=0||e===t}function fF(e){var t=ap(e);if(!!t){var r=t.axisPointerModel,n=t.axis.scale,i=r.option,a=r.get(\"status\"),o=r.get(\"value\");o!=null&&(o=n.parse(o));var s=hv(r);a==null&&(i.status=s?\"show\":\"hide\");var l=n.getExtent().slice();l[0]>l[1]&&l.reverse(),(o==null||o>l[1])&&(o=l[1]),o<l[0]&&(o=l[0]),i.value=o,s&&(i.status=t.axis.scale.isBlank()?\"hide\":\"show\")}}function ap(e){var t=(e.ecModel.getComponent(\"axisPointer\")||{}).coordSysAxesInfo;return t&&t.axesInfo[cs(e)]}function cF(e){var t=ap(e);return t&&t.axisPointerModel}function hv(e){return!!e.get([\"handle\",\"show\"])}function cs(e){return e.type+\"||\"+e.id}var w0={},hF=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=t.type,r}return t.prototype.render=function(r,n,i,a){this.axisPointerClass&&fF(r),e.prototype.render.apply(this,arguments),this._doUpdateAxisPointerClass(r,i,!0)},t.prototype.updateAxisPointer=function(r,n,i,a){this._doUpdateAxisPointerClass(r,i,!1)},t.prototype.remove=function(r,n){var i=this._axisPointer;i&&i.remove(n)},t.prototype.dispose=function(r,n){this._disposeAxisPointer(n),e.prototype.dispose.apply(this,arguments)},t.prototype._doUpdateAxisPointerClass=function(r,n,i){var a=t.getAxisPointerClass(this.axisPointerClass);if(!!a){var o=cF(r);o?(this._axisPointer||(this._axisPointer=new a)).render(r,o,n,i):this._disposeAxisPointer(n)}},t.prototype._disposeAxisPointer=function(r){this._axisPointer&&this._axisPointer.dispose(r),this._axisPointer=null},t.registerAxisPointerClass=function(r,n){w0[r]=n},t.getAxisPointerClass=function(r){return r&&w0[r]},t.type=\"axis\",t}(qr),vx=hF,vv=Qt();function vF(e,t,r,n){var i=r.axis;if(!i.scale.isBlank()){var a=r.getModel(\"splitArea\"),o=a.getModel(\"areaStyle\"),s=o.get(\"color\"),l=n.coordinateSystem.getRect(),u=i.getTicksCoords({tickModel:a,clamp:!0});if(!!u.length){var f=s.length,c=vv(e).splitAreaColors,v=_t(),h=0;if(c)for(var d=0;d<u.length;d++){var p=c.get(u[d].tickValue);if(p!=null){h=(p+(f-1)*d)%f;break}}var g=i.toGlobalCoord(u[0].coord),m=o.getAreaStyle();s=et(s)?s:[s];for(var d=1;d<u.length;d++){var y=i.toGlobalCoord(u[d].coord),_=void 0,w=void 0,S=void 0,b=void 0;i.isHorizontal()?(_=g,w=l.y,S=y-_,b=l.height,g=_+S):(_=l.x,w=g,S=l.width,b=y-w,g=w+b);var x=u[d-1].tickValue;x!=null&&v.set(x,h),t.add(new ne({anid:x!=null?\"area_\"+x:null,shape:{x:_,y:w,width:S,height:b},style:Pt({fill:s[h]},m),autoBatch:!0,silent:!0})),h=(h+1)%f}vv(e).splitAreaColors=v}}}function dF(e){vv(e).splitAreaColors=null}var pF=[\"axisLine\",\"axisTickLabel\",\"axisName\"],gF=[\"splitArea\",\"splitLine\",\"minorSplitLine\"],dx=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=t.type,r.axisPointerClass=\"CartesianAxisPointer\",r}return t.prototype.render=function(r,n,i,a){this.group.removeAll();var o=this._axisGroup;if(this._axisGroup=new ye,this.group.add(this._axisGroup),!!r.get(\"show\")){var s=r.getCoordSysModel(),l=cv(s,r),u=new hx(r,Y({handleAutoShown:function(c){for(var v=s.coordinateSystem.getCartesians(),h=0;h<v.length;h++)if(lv(v[h].getOtherAxis(r.axis).scale))return!0;return!1}},l));I(pF,u.add,u),this._axisGroup.add(u.getGroup()),I(gF,function(c){r.get([c,\"show\"])&&mF[c](this,this._axisGroup,r,s)},this);var f=a&&a.type===\"changeAxisOrder\"&&a.isInitSort;f||vb(o,this._axisGroup,r),e.prototype.render.call(this,r,n,i,a)}},t.prototype.remove=function(){dF(this)},t.type=\"cartesianAxis\",t}(vx),mF={splitLine:function(e,t,r,n){var i=r.axis;if(!i.scale.isBlank()){var a=r.getModel(\"splitLine\"),o=a.getModel(\"lineStyle\"),s=o.get(\"color\");s=et(s)?s:[s];for(var l=n.coordinateSystem.getRect(),u=i.isHorizontal(),f=0,c=i.getTicksCoords({tickModel:a}),v=[],h=[],d=o.getLineStyle(),p=0;p<c.length;p++){var g=i.toGlobalCoord(c[p].coord);u?(v[0]=g,v[1]=l.y,h[0]=g,h[1]=l.y+l.height):(v[0]=l.x,v[1]=g,h[0]=l.x+l.width,h[1]=g);var m=f++%s.length,y=c[p].tickValue;t.add(new xi({anid:y!=null?\"line_\"+c[p].tickValue:null,subPixelOptimize:!0,autoBatch:!0,shape:{x1:v[0],y1:v[1],x2:h[0],y2:h[1]},style:Pt({stroke:s[m]},d),silent:!0}))}}},minorSplitLine:function(e,t,r,n){var i=r.axis,a=r.getModel(\"minorSplitLine\"),o=a.getModel(\"lineStyle\"),s=n.coordinateSystem.getRect(),l=i.isHorizontal(),u=i.getMinorTicksCoords();if(!!u.length)for(var f=[],c=[],v=o.getLineStyle(),h=0;h<u.length;h++)for(var d=0;d<u[h].length;d++){var p=i.toGlobalCoord(u[h][d].coord);l?(f[0]=p,f[1]=s.y,c[0]=p,c[1]=s.y+s.height):(f[0]=s.x,f[1]=p,c[0]=s.x+s.width,c[1]=p),t.add(new xi({anid:\"minor_line_\"+u[h][d].tickValue,subPixelOptimize:!0,autoBatch:!0,shape:{x1:f[0],y1:f[1],x2:c[0],y2:c[1]},style:v,silent:!0}))}},splitArea:function(e,t,r,n){vF(e,t,r,n)}},px=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=t.type,r}return t.type=\"xAxis\",t}(dx),yF=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=px.type,r}return t.type=\"yAxis\",t}(dx),_F=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=\"grid\",r}return t.prototype.render=function(r,n){this.group.removeAll(),r.get(\"show\")&&this.group.add(new ne({shape:r.coordinateSystem.getRect(),style:Pt({fill:r.get(\"backgroundColor\")},r.getItemStyle()),silent:!0,z2:-1}))},t.type=\"grid\",t}(qr),b0={offset:0};function wF(e){e.registerComponentView(_F),e.registerComponentModel(FB),e.registerCoordinateSystem(\"cartesian2d\",JB),f0(e,\"x\",uv,b0),f0(e,\"y\",uv,b0),e.registerComponentView(px),e.registerComponentView(yF),e.registerPreprocessor(function(t){t.xAxis&&t.yAxis&&!t.grid&&(t.grid={})})}var ci=Qt(),S0=xt,Rc=Ft,bF=function(){function e(){this._dragging=!1,this.animationThreshold=15}return e.prototype.render=function(t,r,n,i){var a=r.get(\"value\"),o=r.get(\"status\");if(this._axisModel=t,this._axisPointerModel=r,this._api=n,!(!i&&this._lastValue===a&&this._lastStatus===o)){this._lastValue=a,this._lastStatus=o;var s=this._group,l=this._handle;if(!o||o===\"hide\"){s&&s.hide(),l&&l.hide();return}s&&s.show(),l&&l.show();var u={};this.makeElOption(u,a,t,r,n);var f=u.graphicKey;f!==this._lastGraphicKey&&this.clear(n),this._lastGraphicKey=f;var c=this._moveAnimation=this.determineAnimation(t,r);if(!s)s=this._group=new ye,this.createPointerEl(s,u,t,r),this.createLabelEl(s,u,t,r),n.getZr().add(s);else{var v=Xt(x0,r,c);this.updatePointerEl(s,u,v),this.updateLabelEl(s,u,v,r)}C0(s,r,!0),this._renderHandle(a)}},e.prototype.remove=function(t){this.clear(t)},e.prototype.dispose=function(t){this.clear(t)},e.prototype.determineAnimation=function(t,r){var n=r.get(\"animation\"),i=t.axis,a=i.type===\"category\",o=r.get(\"snap\");if(!o&&!a)return!1;if(n===\"auto\"||n==null){var s=this.animationThreshold;if(a&&i.getBandWidth()>s)return!0;if(o){var l=ap(t).seriesDataCount,u=i.getExtent();return Math.abs(u[0]-u[1])/l>s}return!1}return n===!0},e.prototype.makeElOption=function(t,r,n,i,a){},e.prototype.createPointerEl=function(t,r,n,i){var a=r.pointer;if(a){var o=ci(t).pointerEl=new L2[a.type](S0(r.pointer));t.add(o)}},e.prototype.createLabelEl=function(t,r,n,i){if(r.label){var a=ci(t).labelEl=new he(S0(r.label));t.add(a),T0(a,i)}},e.prototype.updatePointerEl=function(t,r,n){var i=ci(t).pointerEl;i&&r.pointer&&(i.setStyle(r.pointer.style),n(i,{shape:r.pointer.shape}))},e.prototype.updateLabelEl=function(t,r,n,i){var a=ci(t).labelEl;a&&(a.setStyle(r.label.style),n(a,{x:r.label.x,y:r.label.y}),T0(a,i))},e.prototype._renderHandle=function(t){if(!(this._dragging||!this.updateHandleTransform)){var r=this._axisPointerModel,n=this._api.getZr(),i=this._handle,a=r.getModel(\"handle\"),o=r.get(\"status\");if(!a.get(\"show\")||!o||o===\"hide\"){i&&n.remove(i),this._handle=null;return}var s;this._handle||(s=!0,i=this._handle=Ld(a.get(\"icon\"),{cursor:\"move\",draggable:!0,onmousemove:function(u){V1(u.event)},onmousedown:Rc(this._onHandleDragMove,this,0,0),drift:Rc(this._onHandleDragMove,this),ondragend:Rc(this._onHandleDragEnd,this)}),n.add(i)),C0(i,r,!1),i.setStyle(a.getItemStyle(null,[\"color\",\"borderColor\",\"borderWidth\",\"opacity\",\"shadowColor\",\"shadowBlur\",\"shadowOffsetX\",\"shadowOffsetY\"]));var l=a.get(\"size\");et(l)||(l=[l,l]),i.scaleX=l[0]/2,i.scaleY=l[1]/2,oS(this,\"_doDispatchAxisPointer\",a.get(\"throttle\")||0,\"fixRate\"),this._moveHandleToValue(t,s)}},e.prototype._moveHandleToValue=function(t,r){x0(this._axisPointerModel,!r&&this._moveAnimation,this._handle,Oc(this.getHandleTransform(t,this._axisModel,this._axisPointerModel)))},e.prototype._onHandleDragMove=function(t,r){var n=this._handle;if(!!n){this._dragging=!0;var i=this.updateHandleTransform(Oc(n),[t,r],this._axisModel,this._axisPointerModel);this._payloadInfo=i,n.stopAnimation(),n.attr(Oc(i)),ci(n).lastProp=null,this._doDispatchAxisPointer()}},e.prototype._doDispatchAxisPointer=function(){var t=this._handle;if(!!t){var r=this._payloadInfo,n=this._axisModel;this._api.dispatchAction({type:\"updateAxisPointer\",x:r.cursorPoint[0],y:r.cursorPoint[1],tooltipOption:r.tooltipOption,axesInfo:[{axisDim:n.axis.dim,axisIndex:n.componentIndex}]})}},e.prototype._onHandleDragEnd=function(){this._dragging=!1;var t=this._handle;if(!!t){var r=this._axisPointerModel.get(\"value\");this._moveHandleToValue(r),this._api.dispatchAction({type:\"hideTip\"})}},e.prototype.clear=function(t){this._lastValue=null,this._lastStatus=null;var r=t.getZr(),n=this._group,i=this._handle;r&&n&&(this._lastGraphicKey=null,n&&r.remove(n),i&&r.remove(i),this._group=null,this._handle=null,this._payloadInfo=null),Jh(this,\"_doDispatchAxisPointer\")},e.prototype.doClear=function(){},e.prototype.buildLabel=function(t,r,n){return n=n||0,{x:t[n],y:t[1-n],width:r[n],height:r[1-n]}},e}();function x0(e,t,r,n){gx(ci(r).lastProp,n)||(ci(r).lastProp=n,t?Dr(r,n,e):(r.stopAnimation(),r.attr(n)))}function gx(e,t){if(st(e)&&st(t)){var r=!0;return I(t,function(n,i){r=r&&gx(e[i],n)}),!!r}else return e===t}function T0(e,t){e[t.get([\"label\",\"show\"])?\"show\":\"hide\"]()}function Oc(e){return{x:e.x||0,y:e.y||0,rotation:e.rotation||0}}function C0(e,t,r){var n=t.get(\"z\"),i=t.get(\"zlevel\");e&&e.traverse(function(a){a.type!==\"group\"&&(n!=null&&(a.z=n),i!=null&&(a.zlevel=i),a.silent=r)})}var SF=bF;function xF(e){var t=e.get(\"type\"),r=e.getModel(t+\"Style\"),n;return t===\"line\"?(n=r.getLineStyle(),n.fill=null):t===\"shadow\"&&(n=r.getAreaStyle(),n.stroke=null),n}function TF(e,t,r,n,i){var a=r.get(\"value\"),o=mx(a,t.axis,t.ecModel,r.get(\"seriesDataIndices\"),{precision:r.get([\"label\",\"precision\"]),formatter:r.get([\"label\",\"formatter\"])}),s=r.getModel(\"label\"),l=rf(s.get(\"padding\")||0),u=s.getFont(),f=gd(o,u),c=i.position,v=f.width+l[1]+l[3],h=f.height+l[0]+l[2],d=i.align;d===\"right\"&&(c[0]-=v),d===\"center\"&&(c[0]-=v/2);var p=i.verticalAlign;p===\"bottom\"&&(c[1]-=h),p===\"middle\"&&(c[1]-=h/2),CF(c,v,h,n);var g=s.get(\"backgroundColor\");(!g||g===\"auto\")&&(g=t.get([\"axisLine\",\"lineStyle\",\"color\"])),e.label={x:c[0],y:c[1],style:kn(s,{text:o,font:u,fill:s.getTextColor(),padding:l,backgroundColor:g}),z2:10}}function CF(e,t,r,n){var i=n.getWidth(),a=n.getHeight();e[0]=Math.min(e[0]+t,i)-t,e[1]=Math.min(e[1]+r,a)-r,e[0]=Math.max(e[0],0),e[1]=Math.max(e[1],0)}function mx(e,t,r,n,i){e=t.scale.parse(e);var a=t.scale.getLabel({value:e},{precision:i.precision}),o=i.formatter;if(o){var s={value:rp(t,{value:e}),axisDimension:t.dim,axisIndex:t.index,seriesData:[]};I(n,function(l){var u=r.getSeriesByIndex(l.seriesIndex),f=l.dataIndexInside,c=u&&u.getDataParams(f);c&&s.seriesData.push(c)}),it(o)?a=o.replace(\"{value}\",a):mt(o)&&(a=o(s))}return a}function yx(e,t,r){var n=Qo();return vd(n,n,r.rotation),Lh(n,n,r.position),Ed([e.dataToCoord(t),(r.labelOffset||0)+(r.labelDirection||1)*(r.labelMargin||0)],n)}function MF(e,t,r,n,i,a){var o=hx.innerTextLayout(r.rotation,0,r.labelDirection);r.labelMargin=i.get([\"label\",\"margin\"]),TF(t,n,i,a,{position:yx(n.axis,e,r),align:o.textAlign,verticalAlign:o.textVerticalAlign})}function AF(e,t,r){return r=r||0,{x1:e[r],y1:e[1-r],x2:t[r],y2:t[1-r]}}function DF(e,t,r){return r=r||0,{x:e[r],y:e[1-r],width:t[r],height:t[1-r]}}var PF=function(e){J(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.makeElOption=function(r,n,i,a,o){var s=i.axis,l=s.grid,u=a.get(\"type\"),f=M0(l,s).getOtherAxis(s).getGlobalExtent(),c=s.toGlobalCoord(s.dataToCoord(n,!0));if(u&&u!==\"none\"){var v=xF(a),h=IF[u](s,c,f);h.style=v,r.graphicKey=h.type,r.pointer=h}var d=cv(l.model,i);MF(n,r,d,i,a,o)},t.prototype.getHandleTransform=function(r,n,i){var a=cv(n.axis.grid.model,n,{labelInside:!1});a.labelMargin=i.get([\"handle\",\"margin\"]);var o=yx(n.axis,r,a);return{x:o[0],y:o[1],rotation:a.rotation+(a.labelDirection<0?Math.PI:0)}},t.prototype.updateHandleTransform=function(r,n,i,a){var o=i.axis,s=o.grid,l=o.getGlobalExtent(!0),u=M0(s,o).getOtherAxis(o).getGlobalExtent(),f=o.dim===\"x\"?0:1,c=[r.x,r.y];c[f]+=n[f],c[f]=Math.min(l[1],c[f]),c[f]=Math.max(l[0],c[f]);var v=(u[1]+u[0])/2,h=[v,v];h[f]=c[f];var d=[{verticalAlign:\"middle\"},{align:\"center\"}];return{x:c[0],y:c[1],rotation:r.rotation,cursorPoint:h,tooltipOption:d[f]}},t}(SF);function M0(e,t){var r={};return r[t.dim+\"AxisIndex\"]=t.index,e.getCartesian(r)}var IF={line:function(e,t,r){var n=AF([t,r[0]],[t,r[1]],A0(e));return{type:\"Line\",subPixelOptimize:!0,shape:n}},shadow:function(e,t,r){var n=Math.max(1,e.getBandWidth()),i=r[1]-r[0];return{type:\"Rect\",shape:DF([t-n/2,r[0]],[n,i],A0(e))}}};function A0(e){return e.dim===\"x\"?0:1}var EF=PF,LF=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=t.type,r}return t.type=\"axisPointer\",t.defaultOption={show:\"auto\",z:50,type:\"line\",snap:!1,triggerTooltip:!0,value:null,status:null,link:[],animation:null,animationDurationUpdate:200,lineStyle:{color:\"#B9BEC9\",width:1,type:\"dashed\"},shadowStyle:{color:\"rgba(210,219,238,0.2)\"},label:{show:!0,formatter:null,precision:\"auto\",margin:3,color:\"#fff\",padding:[5,7,5,7],backgroundColor:\"auto\",borderColor:null,borderWidth:0,borderRadius:3},handle:{show:!1,icon:\"M10.7,11.9v-1.3H9.3v1.3c-4.9,0.3-8.8,4.4-8.8,9.4c0,5,3.9,9.1,8.8,9.4h1.3c4.9-0.3,8.8-4.4,8.8-9.4C19.5,16.3,15.6,12.2,10.7,11.9z M13.3,24.4H6.7v-1.2h6.6z M13.3,22H6.7v-1.2h6.6z M13.3,19.6H6.7v-1.2h6.6z\",size:45,margin:50,color:\"#333\",shadowBlur:3,shadowColor:\"#aaa\",shadowOffsetX:0,shadowOffsetY:2,throttle:40}},t}($t),RF=LF,Hr=Qt(),OF=I;function _x(e,t,r){if(!wt.node){var n=t.getZr();Hr(n).records||(Hr(n).records={}),kF(n,t);var i=Hr(n).records[e]||(Hr(n).records[e]={});i.handler=r}}function kF(e,t){if(Hr(e).initialized)return;Hr(e).initialized=!0,r(\"click\",Xt(D0,\"click\")),r(\"mousemove\",Xt(D0,\"mousemove\")),r(\"globalout\",BF);function r(n,i){e.on(n,function(a){var o=FF(t);OF(Hr(e).records,function(s){s&&i(s,a,o.dispatchAction)}),NF(o.pendings,t)})}}function NF(e,t){var r=e.showTip.length,n=e.hideTip.length,i;r?i=e.showTip[r-1]:n&&(i=e.hideTip[n-1]),i&&(i.dispatchAction=null,t.dispatchAction(i))}function BF(e,t,r){e.handler(\"leave\",null,r)}function D0(e,t,r,n){t.handler(e,r,n)}function FF(e){var t={showTip:[],hideTip:[]},r=function(n){var i=t[n.type];i?i.push(n):(n.dispatchAction=r,e.dispatchAction(n))};return{dispatchAction:r,pendings:t}}function dv(e,t){if(!wt.node){var r=t.getZr(),n=(Hr(r).records||{})[e];n&&(Hr(r).records[e]=null)}}var zF=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=t.type,r}return t.prototype.render=function(r,n,i){var a=n.getComponent(\"tooltip\"),o=r.get(\"triggerOn\")||a&&a.get(\"triggerOn\")||\"mousemove|click\";_x(\"axisPointer\",i,function(s,l,u){o!==\"none\"&&(s===\"leave\"||o.indexOf(s)>=0)&&u({type:\"updateAxisPointer\",currTrigger:s,x:l&&l.offsetX,y:l&&l.offsetY})})},t.prototype.remove=function(r,n){dv(\"axisPointer\",n)},t.prototype.dispose=function(r,n){dv(\"axisPointer\",n)},t.type=\"axisPointer\",t}(qr),HF=zF;function bx(e,t){var r=[],n=e.seriesIndex,i;if(n==null||!(i=t.getSeriesByIndex(n)))return{point:[]};var a=i.getData(),o=Si(a,e);if(o==null||o<0||et(o))return{point:[]};var s=a.getItemGraphicEl(o),l=i.coordinateSystem;if(i.getTooltipPosition)r=i.getTooltipPosition(o)||[];else if(l&&l.dataToPoint)if(e.isStacked){var u=l.getBaseAxis(),f=l.getOtherAxis(u),c=f.dim,v=u.dim,h=c===\"x\"||c===\"radius\"?1:0,d=a.mapDimension(v),p=[];p[h]=a.get(d,o),p[1-h]=a.get(a.getCalculationInfo(\"stackResultDimension\"),o),r=l.dataToPoint(p)||[]}else r=l.dataToPoint(a.getValues(ct(l.dimensions,function(m){return a.mapDimension(m)}),o))||[];else if(s){var g=s.getBoundingRect().clone();g.applyTransform(s.transform),r=[g.x+g.width/2,g.y+g.height/2]}return{point:r,el:s}}var P0=Qt();function $F(e,t,r){var n=e.currTrigger,i=[e.x,e.y],a=e,o=e.dispatchAction||Ft(r.dispatchAction,r),s=t.getComponent(\"axisPointer\").coordSysAxesInfo;if(!!s){Nl(i)&&(i=bx({seriesIndex:a.seriesIndex,dataIndex:a.dataIndex},t).point);var l=Nl(i),u=a.axesInfo,f=s.axesInfo,c=n===\"leave\"||Nl(i),v={},h={},d={list:[],map:{}},p={showPointer:Xt(GF,h),showTooltip:Xt(UF,d)};I(s.coordSysMap,function(m,y){var _=l||m.containPoint(i);I(s.coordSysAxesInfo[y],function(w,S){var b=w.axis,x=XF(u,w);if(!c&&_&&(!u||x)){var T=x&&x.value;T==null&&!l&&(T=b.pointToData(i)),T!=null&&I0(w,T,p,!1,v)}})});var g={};return I(f,function(m,y){var _=m.linkGroup;_&&!h[y]&&I(_.axesInfo,function(w,S){var b=h[S];if(w!==m&&b){var x=b.value;_.mapper&&(x=m.axis.scale.parse(_.mapper(x,E0(w),E0(m)))),g[m.key]=x}})}),I(g,function(m,y){I0(f[y],m,p,!0,v)}),WF(h,f,v),YF(d,i,e,o),qF(f,o,r),v}}function I0(e,t,r,n,i){var a=e.axis;if(!(a.scale.isBlank()||!a.containData(t))){if(!e.involveSeries){r.showPointer(e,t);return}var o=VF(t,e),s=o.payloadBatch,l=o.snapToValue;s[0]&&i.seriesIndex==null&&Y(i,s[0]),!n&&e.snap&&a.containData(l)&&l!=null&&(t=l),r.showPointer(e,t,s),r.showTooltip(e,o,l)}}function VF(e,t){var r=t.axis,n=r.dim,i=e,a=[],o=Number.MAX_VALUE,s=-1;return I(t.seriesModels,function(l,u){var f=l.getData().mapDimensionsAll(n),c,v;if(l.getAxisTooltipData){var h=l.getAxisTooltipData(f,e,r);v=h.dataIndices,c=h.nestestValue}else{if(v=l.getData().indicesOfNearest(f[0],e,r.type===\"category\"?.5:null),!v.length)return;c=l.getData().get(f[0],v[0])}if(!(c==null||!isFinite(c))){var d=e-c,p=Math.abs(d);p<=o&&((p<o||d>=0&&s<0)&&(o=p,s=d,i=c,a.length=0),I(v,function(g){a.push({seriesIndex:l.seriesIndex,dataIndexInside:g,dataIndex:l.getData().getRawIndex(g)})}))}}),{payloadBatch:a,snapToValue:i}}function GF(e,t,r,n){e[t.key]={value:r,payloadBatch:n}}function UF(e,t,r,n){var i=r.payloadBatch,a=t.axis,o=a.model,s=t.axisPointerModel;if(!(!t.triggerTooltip||!i.length)){var l=t.coordSys.model,u=cs(l),f=e.map[u];f||(f=e.map[u]={coordSysId:l.id,coordSysIndex:l.componentIndex,coordSysType:l.type,coordSysMainType:l.mainType,dataByAxis:[]},e.list.push(f)),f.dataByAxis.push({axisDim:a.dim,axisIndex:o.componentIndex,axisType:o.type,axisId:o.id,value:n,valueLabelOpt:{precision:s.get([\"label\",\"precision\"]),formatter:s.get([\"label\",\"formatter\"])},seriesDataIndices:i.slice()})}}function WF(e,t,r){var n=r.axesInfo=[];I(t,function(i,a){var o=i.axisPointerModel.option,s=e[a];s?(!i.useHandle&&(o.status=\"show\"),o.value=s.value,o.seriesDataIndices=(s.payloadBatch||[]).slice()):!i.useHandle&&(o.status=\"hide\"),o.status===\"show\"&&n.push({axisDim:i.axis.dim,axisIndex:i.axis.model.componentIndex,value:o.value})})}function YF(e,t,r,n){if(Nl(t)||!e.list.length){n({type:\"hideTip\"});return}var i=((e.list[0].dataByAxis[0]||{}).seriesDataIndices||[])[0]||{};n({type:\"showTip\",escapeConnect:!0,x:t[0],y:t[1],tooltipOption:r.tooltipOption,position:r.position,dataIndexInside:i.dataIndexInside,dataIndex:i.dataIndex,seriesIndex:i.seriesIndex,dataByCoordSys:e.list})}function qF(e,t,r){var n=r.getZr(),i=\"axisPointerLastHighlights\",a=P0(n)[i]||{},o=P0(n)[i]={};I(e,function(u,f){var c=u.axisPointerModel.option;c.status===\"show\"&&I(c.seriesDataIndices,function(v){var h=v.seriesIndex+\" | \"+v.dataIndex;o[h]=v})});var s=[],l=[];I(a,function(u,f){!o[f]&&l.push(u)}),I(o,function(u,f){!a[f]&&s.push(u)}),l.length&&r.dispatchAction({type:\"downplay\",escapeConnect:!0,notBlur:!0,batch:l}),s.length&&r.dispatchAction({type:\"highlight\",escapeConnect:!0,notBlur:!0,batch:s})}function XF(e,t){for(var r=0;r<(e||[]).length;r++){var n=e[r];if(t.axis.dim===n.axisDim&&t.axis.model.componentIndex===n.axisIndex)return n}}function E0(e){var t=e.axis.model,r={},n=r.axisDim=e.axis.dim;return r.axisIndex=r[n+\"AxisIndex\"]=t.componentIndex,r.axisName=r[n+\"AxisName\"]=t.name,r.axisId=r[n+\"AxisId\"]=t.id,r}function Nl(e){return!e||e[0]==null||isNaN(e[0])||e[1]==null||isNaN(e[1])}function Sx(e){vx.registerAxisPointerClass(\"CartesianAxisPointer\",EF),e.registerComponentModel(RF),e.registerComponentView(HF),e.registerPreprocessor(function(t){if(t){(!t.axisPointer||t.axisPointer.length===0)&&(t.axisPointer={});var r=t.axisPointer.link;r&&!et(r)&&(t.axisPointer.link=[r])}}),e.registerProcessor(e.PRIORITY.PROCESSOR.STATISTIC,function(t,r){t.getComponent(\"axisPointer\").coordSysAxesInfo=aF(t,r)}),e.registerAction({type:\"updateAxisPointer\",event:\"updateAxisPointer\",update:\":updateAxisPointer\"},$F)}function oH(e){Ci(wF),Ci(Sx)}function jF(e,t){var r=rf(t.get(\"padding\")),n=t.getItemStyle([\"color\",\"opacity\"]);return n.fill=t.get(\"backgroundColor\"),e=new ne({shape:{x:e.x-r[3],y:e.y-r[0],width:e.width+r[1]+r[3],height:e.height+r[0]+r[2],r:t.get(\"borderRadius\")},style:n,silent:!0,z2:-1}),e}var KF=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=t.type,r}return t.type=\"tooltip\",t.dependencies=[\"axisPointer\"],t.defaultOption={z:60,show:!0,showContent:!0,trigger:\"item\",triggerOn:\"mousemove|click\",alwaysShowContent:!1,displayMode:\"single\",renderMode:\"auto\",confine:null,showDelay:0,hideDelay:100,transitionDuration:.4,enterable:!1,backgroundColor:\"#fff\",shadowBlur:10,shadowColor:\"rgba(0, 0, 0, .2)\",shadowOffsetX:1,shadowOffsetY:2,borderRadius:4,borderWidth:1,padding:null,extraCssText:\"\",axisPointer:{type:\"line\",axis:\"auto\",animation:\"auto\",animationDurationUpdate:200,animationEasingUpdate:\"exponentialOut\",crossStyle:{color:\"#999\",width:1,type:\"dashed\",textStyle:{}}},textStyle:{color:\"#666\",fontSize:14}},t}($t),ZF=KF;function xx(e){var t=e.get(\"confine\");return t!=null?!!t:e.get(\"renderMode\")===\"richText\"}function Tx(e){if(!!wt.domSupported){for(var t=document.documentElement.style,r=0,n=e.length;r<n;r++)if(e[r]in t)return e[r]}}var Cx=Tx([\"transform\",\"webkitTransform\",\"OTransform\",\"MozTransform\",\"msTransform\"]),QF=Tx([\"webkitTransition\",\"transition\",\"OTransition\",\"MozTransition\",\"msTransition\"]);function Mx(e,t){if(!e)return t;t=Pb(t,!0);var r=e.indexOf(t);return e=r===-1?t:\"-\"+e.slice(0,r)+\"-\"+t,e.toLowerCase()}function JF(e,t){var r=e.currentStyle||document.defaultView&&document.defaultView.getComputedStyle(e);return r?t?r[t]:r:null}var t5=Mx(QF,\"transition\"),op=Mx(Cx,\"transform\"),e5=\"position:absolute;display:block;border-style:solid;white-space:nowrap;z-index:9999999;\"+(wt.transform3dSupported?\"will-change:transform;\":\"\");function r5(e){return e=e===\"left\"?\"right\":e===\"right\"?\"left\":e===\"top\"?\"bottom\":\"top\",e}function n5(e,t,r){if(!it(r)||r===\"inside\")return\"\";var n=e.get(\"backgroundColor\"),i=e.get(\"borderWidth\");t=Ti(t);var a=r5(r),o=Math.max(Math.round(i)*1.5,6),s=\"\",l=op+\":\",u;It([\"left\",\"right\"],a)>-1?(s+=\"top:50%\",l+=\"translateY(-50%) rotate(\"+(u=a===\"left\"?-225:-45)+\"deg)\"):(s+=\"left:50%\",l+=\"translateX(-50%) rotate(\"+(u=a===\"top\"?225:45)+\"deg)\");var f=u*Math.PI/180,c=o+i,v=c*Math.abs(Math.cos(f))+c*Math.abs(Math.sin(f)),h=Math.round(((v-Math.SQRT2*i)/2+Math.SQRT2*i-(v-c)/2)*100)/100;s+=\";\"+a+\":-\"+h+\"px\";var d=t+\" solid \"+i+\"px;\",p=[\"position:absolute;width:\"+o+\"px;height:\"+o+\"px;\",s+\";\"+l+\";\",\"border-bottom:\"+d,\"border-right:\"+d,\"background-color:\"+n+\";\"];return'<div style=\"'+p.join(\"\")+'\"></div>'}function i5(e,t){var r=\"cubic-bezier(0.23,1,0.32,1)\",n=\" \"+e/2+\"s \"+r,i=\"opacity\"+n+\",visibility\"+n;return t||(n=\" \"+e+\"s \"+r,i+=wt.transformSupported?\",\"+op+n:\",left\"+n+\",top\"+n),t5+\":\"+i}function L0(e,t,r){var n=e.toFixed(0)+\"px\",i=t.toFixed(0)+\"px\";if(!wt.transformSupported)return r?\"top:\"+i+\";left:\"+n+\";\":[[\"top\",i],[\"left\",n]];var a=wt.transform3dSupported,o=\"translate\"+(a?\"3d\":\"\")+\"(\"+n+\",\"+i+(a?\",0\":\"\")+\")\";return r?\"top:0;left:0;\"+op+\":\"+o+\";\":[[\"top\",0],[\"left\",0],[Cx,o]]}function a5(e){var t=[],r=e.get(\"fontSize\"),n=e.getTextColor();n&&t.push(\"color:\"+n),t.push(\"font:\"+e.getFont()),r&&t.push(\"line-height:\"+Math.round(r*3/2)+\"px\");var i=e.get(\"textShadowColor\"),a=e.get(\"textShadowBlur\")||0,o=e.get(\"textShadowOffsetX\")||0,s=e.get(\"textShadowOffsetY\")||0;return i&&a&&t.push(\"text-shadow:\"+o+\"px \"+s+\"px \"+a+\"px \"+i),I([\"decoration\",\"align\"],function(l){var u=e.get(l);u&&t.push(\"text-\"+l+\":\"+u)}),t.join(\";\")}function o5(e,t,r){var n=[],i=e.get(\"transitionDuration\"),a=e.get(\"backgroundColor\"),o=e.get(\"shadowBlur\"),s=e.get(\"shadowColor\"),l=e.get(\"shadowOffsetX\"),u=e.get(\"shadowOffsetY\"),f=e.getModel(\"textStyle\"),c=rS(e,\"html\"),v=l+\"px \"+u+\"px \"+o+\"px \"+s;return n.push(\"box-shadow:\"+v),t&&i&&n.push(i5(i,r)),a&&n.push(\"background-color:\"+a),I([\"width\",\"color\",\"radius\"],function(h){var d=\"border-\"+h,p=Pb(d),g=e.get(p);g!=null&&n.push(d+\":\"+g+(h===\"color\"?\"\":\"px\"))}),n.push(a5(f)),c!=null&&n.push(\"padding:\"+rf(c).join(\"px \")+\"px\"),n.join(\";\")+\";\"}function R0(e,t,r,n,i){var a=t&&t.painter;if(r){var o=a&&a.getViewportRoot();o&&LP(e,o,document.body,n,i)}else{e[0]=n,e[1]=i;var s=a&&a.getViewportRootOffset();s&&(e[0]+=s.offsetLeft,e[1]+=s.offsetTop)}e[2]=e[0]/t.getWidth(),e[3]=e[1]/t.getHeight()}var s5=function(){function e(t,r,n){if(this._show=!1,this._styleCoord=[0,0,0,0],this._enterable=!0,this._firstShow=!0,this._longHide=!0,wt.wxa)return null;var i=document.createElement(\"div\");i.domBelongToZr=!0,this.el=i;var a=this._zr=r.getZr(),o=this._appendToBody=n&&n.appendToBody;R0(this._styleCoord,a,o,r.getWidth()/2,r.getHeight()/2),o?document.body.appendChild(i):t.appendChild(i),this._container=t;var s=this;i.onmouseenter=function(){s._enterable&&(clearTimeout(s._hideTimeout),s._show=!0),s._inContent=!0},i.onmousemove=function(l){if(l=l||window.event,!s._enterable){var u=a.handler,f=a.painter.getViewportRoot();Ue(f,l,!0),u.dispatch(\"mousemove\",l)}},i.onmouseleave=function(){s._inContent=!1,s._enterable&&s._show&&s.hideLater(s._hideDelay)}}return e.prototype.update=function(t){var r=this._container,n=JF(r,\"position\"),i=r.style;i.position!==\"absolute\"&&n!==\"absolute\"&&(i.position=\"relative\");var a=t.get(\"alwaysShowContent\");a&&this._moveIfResized(),this.el.className=t.get(\"className\")||\"\"},e.prototype.show=function(t,r){clearTimeout(this._hideTimeout),clearTimeout(this._longHideTimeout);var n=this.el,i=n.style,a=this._styleCoord;n.innerHTML?i.cssText=e5+o5(t,!this._firstShow,this._longHide)+L0(a[0],a[1],!0)+(\"border-color:\"+Ti(r)+\";\")+(t.get(\"extraCssText\")||\"\")+(\";pointer-events:\"+(this._enterable?\"auto\":\"none\")):i.display=\"none\",this._show=!0,this._firstShow=!1,this._longHide=!1},e.prototype.setContent=function(t,r,n,i,a){var o=this.el;if(t==null){o.innerHTML=\"\";return}var s=\"\";if(it(a)&&n.get(\"trigger\")===\"item\"&&!xx(n)&&(s=n5(n,i,a)),it(t))o.innerHTML=t+s;else if(t){o.innerHTML=\"\",et(t)||(t=[t]);for(var l=0;l<t.length;l++)Yl(t[l])&&t[l].parentNode!==o&&o.appendChild(t[l]);if(s&&o.childNodes.length){var u=document.createElement(\"div\");u.innerHTML=s,o.appendChild(u)}}},e.prototype.setEnterable=function(t){this._enterable=t},e.prototype.getSize=function(){var t=this.el;return[t.offsetWidth,t.offsetHeight]},e.prototype.moveTo=function(t,r){var n=this._styleCoord;if(R0(n,this._zr,this._appendToBody,t,r),n[0]!=null&&n[1]!=null){var i=this.el.style,a=L0(n[0],n[1]);I(a,function(o){i[o[0]]=o[1]})}},e.prototype._moveIfResized=function(){var t=this._styleCoord[2],r=this._styleCoord[3];this.moveTo(t*this._zr.getWidth(),r*this._zr.getHeight())},e.prototype.hide=function(){var t=this,r=this.el.style;r.visibility=\"hidden\",r.opacity=\"0\",wt.transform3dSupported&&(r.willChange=\"\"),this._show=!1,this._longHideTimeout=setTimeout(function(){return t._longHide=!0},500)},e.prototype.hideLater=function(t){this._show&&!(this._inContent&&this._enterable)&&(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(Ft(this.hide,this),t)):this.hide())},e.prototype.isShow=function(){return this._show},e.prototype.dispose=function(){this.el.parentNode.removeChild(this.el)},e}(),l5=s5,u5=function(){function e(t){this._show=!1,this._styleCoord=[0,0,0,0],this._enterable=!0,this._zr=t.getZr(),k0(this._styleCoord,this._zr,t.getWidth()/2,t.getHeight()/2)}return e.prototype.update=function(t){var r=t.get(\"alwaysShowContent\");r&&this._moveIfResized()},e.prototype.show=function(){this._hideTimeout&&clearTimeout(this._hideTimeout),this.el.show(),this._show=!0},e.prototype.setContent=function(t,r,n,i,a){var o=this;st(t)&&xe(\"\"),this.el&&this._zr.remove(this.el);var s=n.getModel(\"textStyle\");this.el=new he({style:{rich:r.richTextStyles,text:t,lineHeight:22,borderWidth:1,borderColor:i,textShadowColor:s.get(\"textShadowColor\"),fill:n.get([\"textStyle\",\"color\"]),padding:rS(n,\"richText\"),verticalAlign:\"top\",align:\"left\"},z:n.get(\"z\")}),I([\"backgroundColor\",\"borderRadius\",\"shadowColor\",\"shadowBlur\",\"shadowOffsetX\",\"shadowOffsetY\"],function(u){o.el.style[u]=n.get(u)}),I([\"textShadowBlur\",\"textShadowOffsetX\",\"textShadowOffsetY\"],function(u){o.el.style[u]=s.get(u)||0}),this._zr.add(this.el);var l=this;this.el.on(\"mouseover\",function(){l._enterable&&(clearTimeout(l._hideTimeout),l._show=!0),l._inContent=!0}),this.el.on(\"mouseout\",function(){l._enterable&&l._show&&l.hideLater(l._hideDelay),l._inContent=!1})},e.prototype.setEnterable=function(t){this._enterable=t},e.prototype.getSize=function(){var t=this.el,r=this.el.getBoundingRect(),n=O0(t.style);return[r.width+n.left+n.right,r.height+n.top+n.bottom]},e.prototype.moveTo=function(t,r){var n=this.el;if(n){var i=this._styleCoord;k0(i,this._zr,t,r),t=i[0],r=i[1];var a=n.style,o=vn(a.borderWidth||0),s=O0(a);n.x=t+o+s.left,n.y=r+o+s.top,n.markRedraw()}},e.prototype._moveIfResized=function(){var t=this._styleCoord[2],r=this._styleCoord[3];this.moveTo(t*this._zr.getWidth(),r*this._zr.getHeight())},e.prototype.hide=function(){this.el&&this.el.hide(),this._show=!1},e.prototype.hideLater=function(t){this._show&&!(this._inContent&&this._enterable)&&(t?(this._hideDelay=t,this._show=!1,this._hideTimeout=setTimeout(Ft(this.hide,this),t)):this.hide())},e.prototype.isShow=function(){return this._show},e.prototype.dispose=function(){this._zr.remove(this.el)},e}();function vn(e){return Math.max(0,e)}function O0(e){var t=vn(e.shadowBlur||0),r=vn(e.shadowOffsetX||0),n=vn(e.shadowOffsetY||0);return{left:vn(t-r),right:vn(t+r),top:vn(t-n),bottom:vn(t+n)}}function k0(e,t,r,n){e[0]=r,e[1]=n,e[2]=e[0]/t.getWidth(),e[3]=e[1]/t.getHeight()}var f5=u5,c5=new ne({shape:{x:-1,y:-1,width:2,height:2}}),h5=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=t.type,r}return t.prototype.init=function(r,n){if(!(wt.node||!n.getDom())){var i=r.getComponent(\"tooltip\"),a=this._renderMode=cE(i.get(\"renderMode\"));this._tooltipContent=a===\"richText\"?new f5(n):new l5(n.getDom(),n,{appendToBody:i.get(\"appendToBody\",!0)})}},t.prototype.render=function(r,n,i){if(!(wt.node||!i.getDom())){this.group.removeAll(),this._tooltipModel=r,this._ecModel=n,this._api=i,this._alwaysShowContent=r.get(\"alwaysShowContent\");var a=this._tooltipContent;a.update(r),a.setEnterable(r.get(\"enterable\")),this._initGlobalListener(),this._keepShow(),this._renderMode!==\"richText\"&&r.get(\"transitionDuration\")?oS(this,\"_updatePosition\",50,\"fixRate\"):Jh(this,\"_updatePosition\")}},t.prototype._initGlobalListener=function(){var r=this._tooltipModel,n=r.get(\"triggerOn\");_x(\"itemTooltip\",this._api,Ft(function(i,a,o){n!==\"none\"&&(n.indexOf(i)>=0?this._tryShow(a,o):i===\"leave\"&&this._hide(o))},this))},t.prototype._keepShow=function(){var r=this._tooltipModel,n=this._ecModel,i=this._api;if(this._lastX!=null&&this._lastY!=null&&r.get(\"triggerOn\")!==\"none\"){var a=this;clearTimeout(this._refreshUpdateTimeout),this._refreshUpdateTimeout=setTimeout(function(){!i.isDisposed()&&a.manuallyShowTip(r,n,i,{x:a._lastX,y:a._lastY,dataByCoordSys:a._lastDataByCoordSys})})}},t.prototype.manuallyShowTip=function(r,n,i,a){if(!(a.from===this.uid||wt.node||!i.getDom())){var o=N0(a,i);this._ticket=\"\";var s=a.dataByCoordSys,l=g5(a,n,i);if(l){var u=l.el.getBoundingRect().clone();u.applyTransform(l.el.transform),this._tryShow({offsetX:u.x+u.width/2,offsetY:u.y+u.height/2,target:l.el,position:a.position,positionDefault:\"bottom\"},o)}else if(a.tooltip&&a.x!=null&&a.y!=null){var f=c5;f.x=a.x,f.y=a.y,f.update(),Nt(f).tooltipConfig={name:null,option:a.tooltip},this._tryShow({offsetX:a.x,offsetY:a.y,target:f},o)}else if(s)this._tryShow({offsetX:a.x,offsetY:a.y,position:a.position,dataByCoordSys:s,tooltipOption:a.tooltipOption},o);else if(a.seriesIndex!=null){if(this._manuallyAxisShowTip(r,n,i,a))return;var c=bx(a,n),v=c.point[0],h=c.point[1];v!=null&&h!=null&&this._tryShow({offsetX:v,offsetY:h,target:c.el,position:a.position,positionDefault:\"bottom\"},o)}else a.x!=null&&a.y!=null&&(i.dispatchAction({type:\"updateAxisPointer\",x:a.x,y:a.y}),this._tryShow({offsetX:a.x,offsetY:a.y,position:a.position,target:i.getZr().findHover(a.x,a.y).target},o))}},t.prototype.manuallyHideTip=function(r,n,i,a){var o=this._tooltipContent;!this._alwaysShowContent&&this._tooltipModel&&o.hideLater(this._tooltipModel.get(\"hideDelay\")),this._lastX=this._lastY=this._lastDataByCoordSys=null,a.from!==this.uid&&this._hide(N0(a,i))},t.prototype._manuallyAxisShowTip=function(r,n,i,a){var o=a.seriesIndex,s=a.dataIndex,l=n.getComponent(\"axisPointer\").coordSysAxesInfo;if(!(o==null||s==null||l==null)){var u=n.getSeriesByIndex(o);if(!!u){var f=u.getData(),c=lo([f.getItemModel(s),u,(u.coordinateSystem||{}).model],this._tooltipModel);if(c.get(\"trigger\")===\"axis\")return i.dispatchAction({type:\"updateAxisPointer\",seriesIndex:o,dataIndex:s,position:a.position}),!0}}},t.prototype._tryShow=function(r,n){var i=r.target,a=this._tooltipModel;if(!!a){this._lastX=r.offsetX,this._lastY=r.offsetY;var o=r.dataByCoordSys;if(o&&o.length)this._showAxisTooltip(o,r);else if(i){this._lastDataByCoordSys=null;var s,l;_o(i,function(u){if(Nt(u).dataIndex!=null)return s=u,!0;if(Nt(u).tooltipConfig!=null)return l=u,!0},!0),s?this._showSeriesItemTooltip(r,s,n):l?this._showComponentItemTooltip(r,l,n):this._hide(n)}else this._lastDataByCoordSys=null,this._hide(n)}},t.prototype._showOrMove=function(r,n){var i=r.get(\"showDelay\");n=Ft(n,this),clearTimeout(this._showTimout),i>0?this._showTimout=setTimeout(n,i):n()},t.prototype._showAxisTooltip=function(r,n){var i=this._ecModel,a=this._tooltipModel,o=[n.offsetX,n.offsetY],s=lo([n.tooltipOption],a),l=this._renderMode,u=[],f=os(\"section\",{blocks:[],noHeader:!0}),c=[],v=new mc;I(r,function(y){I(y.dataByAxis,function(_){var w=i.getComponent(_.axisDim+\"Axis\",_.axisIndex),S=_.value;if(!(!w||S==null)){var b=mx(S,w.axis,i,_.seriesDataIndices,_.valueLabelOpt),x=os(\"section\",{header:b,noHeader:!Tr(b),sortBlocks:!0,blocks:[]});f.blocks.push(x),I(_.seriesDataIndices,function(T){var C=i.getSeriesByIndex(T.seriesIndex),D=T.dataIndexInside,P=C.getDataParams(D);if(!(P.dataIndex<0)){P.axisDim=_.axisDim,P.axisIndex=_.axisIndex,P.axisType=_.axisType,P.axisId=_.axisId,P.axisValue=rp(w.axis,{value:S}),P.axisValueLabel=b,P.marker=v.makeTooltipMarker(\"item\",Ti(P.color),l);var A=vy(C.formatTooltip(D,!0,null)),L=A.frag;if(L){var O=lo([C],a).get(\"valueFormatter\");x.blocks.push(O?Y({valueFormatter:O},L):L)}A.text&&c.push(A.text),u.push(P)}})}})}),f.blocks.reverse(),c.reverse();var h=n.position,d=s.get(\"order\"),p=yy(f,v,l,d,i.get(\"useUTC\"),s.get(\"textStyle\"));p&&c.unshift(p);var g=l===\"richText\"?`\n\n`:\"<br/>\",m=c.join(g);this._showOrMove(s,function(){this._updateContentNotChangedOnAxis(r,u)?this._updatePosition(s,h,o[0],o[1],this._tooltipContent,u):this._showTooltipContent(s,m,u,Math.random()+\"\",o[0],o[1],h,null,v)})},t.prototype._showSeriesItemTooltip=function(r,n,i){var a=this._ecModel,o=Nt(n),s=o.seriesIndex,l=a.getSeriesByIndex(s),u=o.dataModel||l,f=o.dataIndex,c=o.dataType,v=u.getData(c),h=this._renderMode,d=r.positionDefault,p=lo([v.getItemModel(f),u,l&&(l.coordinateSystem||{}).model],this._tooltipModel,d?{position:d}:null),g=p.get(\"trigger\");if(!(g!=null&&g!==\"item\")){var m=u.getDataParams(f,c),y=new mc;m.marker=y.makeTooltipMarker(\"item\",Ti(m.color),h);var _=vy(u.formatTooltip(f,!1,c)),w=p.get(\"order\"),S=p.get(\"valueFormatter\"),b=_.frag,x=b?yy(S?Y({valueFormatter:S},b):b,y,h,w,a.get(\"useUTC\"),p.get(\"textStyle\")):_.text,T=\"item_\"+u.name+\"_\"+f;this._showOrMove(p,function(){this._showTooltipContent(p,x,m,T,r.offsetX,r.offsetY,r.position,r.target,y)}),i({type:\"showTip\",dataIndexInside:f,dataIndex:v.getRawIndex(f),seriesIndex:s,from:this.uid})}},t.prototype._showComponentItemTooltip=function(r,n,i){var a=Nt(n),o=a.tooltipConfig,s=o.option||{};if(it(s)){var l=s;s={content:l,formatter:l}}var u=[s],f=this._ecModel.getComponent(a.componentMainType,a.componentIndex);f&&u.push(f),u.push({formatter:s.content});var c=r.positionDefault,v=lo(u,this._tooltipModel,c?{position:c}:null),h=v.get(\"content\"),d=Math.random()+\"\",p=new mc;this._showOrMove(v,function(){var g=xt(v.get(\"formatterParams\")||{});this._showTooltipContent(v,h,g,d,r.offsetX,r.offsetY,r.position,n,p)}),i({type:\"showTip\",from:this.uid})},t.prototype._showTooltipContent=function(r,n,i,a,o,s,l,u,f){if(this._ticket=\"\",!(!r.get(\"showContent\")||!r.get(\"show\"))){var c=this._tooltipContent;c.setEnterable(r.get(\"enterable\"));var v=r.get(\"formatter\");l=l||r.get(\"position\");var h=n,d=this._getNearestPoint([o,s],i,r.get(\"trigger\"),r.get(\"borderColor\")),p=d.color;if(v)if(it(v)){var g=r.ecModel.get(\"useUTC\"),m=et(i)?i[0]:i,y=m&&m.axisType&&m.axisType.indexOf(\"time\")>=0;h=v,y&&(h=Zu(m.axisValue,h,g)),h=Ib(h,i,!0)}else if(mt(v)){var _=Ft(function(w,S){w===this._ticket&&(c.setContent(S,f,r,p,l),this._updatePosition(r,l,o,s,c,i,u))},this);this._ticket=a,h=v(i,a,_)}else h=v;c.setContent(h,f,r,p,l),c.show(r,p),this._updatePosition(r,l,o,s,c,i,u)}},t.prototype._getNearestPoint=function(r,n,i,a){if(i===\"axis\"||et(n))return{color:a||(this._renderMode===\"html\"?\"#fff\":\"none\")};if(!et(n))return{color:a||n.color||n.borderColor}},t.prototype._updatePosition=function(r,n,i,a,o,s,l){var u=this._api.getWidth(),f=this._api.getHeight();n=n||r.get(\"position\");var c=o.getSize(),v=r.get(\"align\"),h=r.get(\"verticalAlign\"),d=l&&l.getBoundingRect().clone();if(l&&d.applyTransform(l.transform),mt(n)&&(n=n([i,a],s,o.el,d,{viewSize:[u,f],contentSize:c.slice()})),et(n))i=Vt(n[0],u),a=Vt(n[1],f);else if(st(n)){var p=n;p.width=c[0],p.height=c[1];var g=Ma(p,{width:u,height:f});i=g.x,a=g.y,v=null,h=null}else if(it(n)&&l){var m=p5(n,d,c,r.get(\"borderWidth\"));i=m[0],a=m[1]}else{var m=v5(i,a,o,u,f,v?null:20,h?null:20);i=m[0],a=m[1]}if(v&&(i-=B0(v)?c[0]/2:v===\"right\"?c[0]:0),h&&(a-=B0(h)?c[1]/2:h===\"bottom\"?c[1]:0),xx(r)){var m=d5(i,a,o,u,f);i=m[0],a=m[1]}o.moveTo(i,a)},t.prototype._updateContentNotChangedOnAxis=function(r,n){var i=this._lastDataByCoordSys,a=this._cbParamsList,o=!!i&&i.length===r.length;return o&&I(i,function(s,l){var u=s.dataByAxis||[],f=r[l]||{},c=f.dataByAxis||[];o=o&&u.length===c.length,o&&I(u,function(v,h){var d=c[h]||{},p=v.seriesDataIndices||[],g=d.seriesDataIndices||[];o=o&&v.value===d.value&&v.axisType===d.axisType&&v.axisId===d.axisId&&p.length===g.length,o&&I(p,function(m,y){var _=g[y];o=o&&m.seriesIndex===_.seriesIndex&&m.dataIndex===_.dataIndex}),a&&I(v.seriesDataIndices,function(m){var y=m.seriesIndex,_=n[y],w=a[y];_&&w&&w.data!==_.data&&(o=!1)})})}),this._lastDataByCoordSys=r,this._cbParamsList=n,!!o},t.prototype._hide=function(r){this._lastDataByCoordSys=null,r({type:\"hideTip\",from:this.uid})},t.prototype.dispose=function(r,n){wt.node||!n.getDom()||(Jh(this,\"_updatePosition\"),this._tooltipContent.dispose(),dv(\"itemTooltip\",n))},t.type=\"tooltip\",t}(qr);function lo(e,t,r){var n=t.ecModel,i;r?(i=new ce(r,n,n),i=new ce(t.option,i,n)):i=t;for(var a=e.length-1;a>=0;a--){var o=e[a];o&&(o instanceof ce&&(o=o.get(\"tooltip\",!0)),it(o)&&(o={formatter:o}),o&&(i=new ce(o,i,n)))}return i}function N0(e,t){return e.dispatchAction||Ft(t.dispatchAction,t)}function v5(e,t,r,n,i,a,o){var s=r.getSize(),l=s[0],u=s[1];return a!=null&&(e+l+a+2>n?e-=l+a:e+=a),o!=null&&(t+u+o>i?t-=u+o:t+=o),[e,t]}function d5(e,t,r,n,i){var a=r.getSize(),o=a[0],s=a[1];return e=Math.min(e+o,n)-o,t=Math.min(t+s,i)-s,e=Math.max(e,0),t=Math.max(t,0),[e,t]}function p5(e,t,r,n){var i=r[0],a=r[1],o=Math.ceil(Math.SQRT2*n)+8,s=0,l=0,u=t.width,f=t.height;switch(e){case\"inside\":s=t.x+u/2-i/2,l=t.y+f/2-a/2;break;case\"top\":s=t.x+u/2-i/2,l=t.y-a-o;break;case\"bottom\":s=t.x+u/2-i/2,l=t.y+f+o;break;case\"left\":s=t.x-i-o,l=t.y+f/2-a/2;break;case\"right\":s=t.x+u+o,l=t.y+f/2-a/2}return[s,l]}function B0(e){return e===\"center\"||e===\"middle\"}function g5(e,t,r){var n=bd(e).queryOptionMap,i=n.keys()[0];if(!(!i||i===\"series\")){var a=ys(t,i,n.get(i),{useDefault:!1,enableAll:!1,enableNone:!1}),o=a.models[0];if(!!o){var s=r.getViewOfComponentModel(o),l;if(s.group.traverse(function(u){var f=Nt(u).tooltipConfig;if(f&&f.name===e.name)return l=u,!0}),l)return{componentMainType:i,componentIndex:o.componentIndex,el:l}}}}var m5=h5;function sH(e){Ci(Sx),e.registerComponentModel(ZF),e.registerComponentView(m5),e.registerAction({type:\"showTip\",event:\"showTip\",update:\"tooltip:manuallyShowTip\"},Ce),e.registerAction({type:\"hideTip\",event:\"hideTip\",update:\"tooltip:manuallyHideTip\"},Ce)}var y5=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=t.type,r.layoutMode={type:\"box\",ignoreSize:!0},r}return t.type=\"title\",t.defaultOption={z:6,show:!0,text:\"\",target:\"blank\",subtext:\"\",subtarget:\"blank\",left:0,top:0,backgroundColor:\"rgba(0,0,0,0)\",borderColor:\"#ccc\",borderWidth:0,padding:5,itemGap:10,textStyle:{fontSize:18,fontWeight:\"bold\",color:\"#464646\"},subtextStyle:{fontSize:12,color:\"#6E7079\"}},t}($t),_5=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=t.type,r}return t.prototype.render=function(r,n,i){if(this.group.removeAll(),!!r.get(\"show\")){var a=this.group,o=r.getModel(\"textStyle\"),s=r.getModel(\"subtextStyle\"),l=r.get(\"textAlign\"),u=Mt(r.get(\"textBaseline\"),r.get(\"textVerticalAlign\")),f=new he({style:kn(o,{text:r.get(\"text\"),fill:o.getTextColor()},{disableBox:!0}),z2:10}),c=f.getBoundingRect(),v=r.get(\"subtext\"),h=new he({style:kn(s,{text:v,fill:s.getTextColor(),y:c.height+r.get(\"itemGap\"),verticalAlign:\"top\"},{disableBox:!0}),z2:10}),d=r.get(\"link\"),p=r.get(\"sublink\"),g=r.get(\"triggerEvent\",!0);f.silent=!d&&!g,h.silent=!p&&!g,d&&f.on(\"click\",function(){jm(d,\"_\"+r.get(\"target\"))}),p&&h.on(\"click\",function(){jm(p,\"_\"+r.get(\"subtarget\"))}),Nt(f).eventData=Nt(h).eventData=g?{componentType:\"title\",componentIndex:r.componentIndex}:null,a.add(f),v&&a.add(h);var m=a.getBoundingRect(),y=r.getBoxLayoutParams();y.width=m.width,y.height=m.height;var _=Ma(y,{width:i.getWidth(),height:i.getHeight()},r.get(\"padding\"));l||(l=r.get(\"left\")||r.get(\"right\"),l===\"middle\"&&(l=\"center\"),l===\"right\"?_.x+=_.width:l===\"center\"&&(_.x+=_.width/2)),u||(u=r.get(\"top\")||r.get(\"bottom\"),u===\"center\"&&(u=\"middle\"),u===\"bottom\"?_.y+=_.height:u===\"middle\"&&(_.y+=_.height/2),u=u||\"top\"),a.x=_.x,a.y=_.y,a.markRedraw();var w={align:l,verticalAlign:u};f.setStyle(w),h.setStyle(w),m=a.getBoundingRect();var S=_.margin,b=r.getItemStyle([\"color\",\"opacity\"]);b.fill=r.get(\"backgroundColor\");var x=new ne({shape:{x:m.x-S[3],y:m.y-S[0],width:m.width+S[1]+S[3],height:m.height+S[0]+S[2],r:r.get(\"borderRadius\")},style:b,subPixelOptimize:!0,silent:!0});a.add(x)}},t.type=\"title\",t}(qr);function lH(e){e.registerComponentModel(y5),e.registerComponentView(_5)}function Ax(e,t){var r=e.mapDimensionsAll(\"defaultedLabel\"),n=r.length;if(n===1){var i=Da(e,t,r[0]);return i!=null?i+\"\":null}else if(n){for(var a=[],o=0;o<r.length;o++)a.push(Da(e,t,r[o]));return a.join(\" \")}}function w5(e,t){var r=e.mapDimensionsAll(\"defaultedLabel\");if(!et(t))return t+\"\";for(var n=[],i=0;i<r.length;i++){var a=e.getDimensionIndex(r[i]);a>=0&&n.push(t[a])}return n.join(\" \")}var b5=function(e){J(t,e);function t(r,n,i,a){var o=e.call(this)||this;return o.updateData(r,n,i,a),o}return t.prototype._createSymbol=function(r,n,i,a,o){this.removeAll();var s=Ia(r,-1,-1,2,2,null,o);s.attr({z2:100,culling:!0,scaleX:a[0]/2,scaleY:a[1]/2}),s.drift=S5,this._symbolType=r,this.add(s)},t.prototype.stopSymbolAnimation=function(r){this.childAt(0).stopAnimation(null,r)},t.prototype.getSymbolType=function(){return this._symbolType},t.prototype.getSymbolPath=function(){return this.childAt(0)},t.prototype.highlight=function(){iu(this.childAt(0))},t.prototype.downplay=function(){au(this.childAt(0))},t.prototype.setZ=function(r,n){var i=this.childAt(0);i.zlevel=r,i.z=n},t.prototype.setDraggable=function(r){var n=this.childAt(0);n.draggable=r,n.cursor=r?\"move\":n.cursor},t.prototype.updateData=function(r,n,i,a){this.silent=!1;var o=r.getItemVisual(n,\"symbol\")||\"circle\",s=r.hostModel,l=t.getSymbolSize(r,n),u=o!==this._symbolType,f=a&&a.disableAnimation;if(u){var c=r.getItemVisual(n,\"symbolKeepAspect\");this._createSymbol(o,r,n,l,c)}else{var v=this.childAt(0);v.silent=!1;var h={scaleX:l[0]/2,scaleY:l[1]/2};f?v.attr(h):Dr(v,h,s,n),ub(v)}if(this._updateCommon(r,n,l,i,a),u){var v=this.childAt(0);if(!f){var h={scaleX:this._sizeX,scaleY:this._sizeY,style:{opacity:v.style.opacity}};v.scaleX=v.scaleY=0,v.style.opacity=0,An(v,h,s,n)}}f&&this.childAt(0).stopAnimation(\"leave\")},t.prototype._updateCommon=function(r,n,i,a,o){var s=this.childAt(0),l=r.hostModel,u,f,c,v,h,d,p,g,m;if(a&&(u=a.emphasisItemStyle,f=a.blurItemStyle,c=a.selectItemStyle,v=a.focus,h=a.blurScope,p=a.labelStatesModels,g=a.hoverScale,m=a.cursorStyle,d=a.emphasisDisabled),!a||r.hasItemOption){var y=a&&a.itemModel?a.itemModel:r.getItemModel(n),_=y.getModel(\"emphasis\");u=_.getModel(\"itemStyle\").getItemStyle(),c=y.getModel([\"select\",\"itemStyle\"]).getItemStyle(),f=y.getModel([\"blur\",\"itemStyle\"]).getItemStyle(),v=_.get(\"focus\"),h=_.get(\"blurScope\"),d=_.get(\"disabled\"),p=ju(y),g=_.getShallow(\"scale\"),m=y.getShallow(\"cursor\")}var w=r.getItemVisual(n,\"symbolRotate\");s.attr(\"rotation\",(w||0)*Math.PI/180||0);var S=dS(r.getItemVisual(n,\"symbolOffset\"),i);S&&(s.x=S[0],s.y=S[1]),m&&s.attr(\"cursor\",m);var b=r.getItemVisual(n,\"style\"),x=b.fill;if(s instanceof Ii){var T=s.style;s.useStyle(Y({image:T.image,x:T.x,y:T.y,width:T.width,height:T.height},b))}else s.__isEmptyBrush?s.useStyle(Y({},b)):s.useStyle(b),s.style.decal=null,s.setColor(x,o&&o.symbolInnerColor),s.style.strokeNoScale=!0;var C=r.getItemVisual(n,\"liftZ\"),D=this._z2;C!=null?D==null&&(this._z2=s.z2,s.z2+=C):D!=null&&(s.z2=D,this._z2=null);var P=o&&o.useNameLabel;Xu(s,p,{labelFetcher:l,labelDataIndex:n,defaultText:A,inheritColor:x,defaultOpacity:b.opacity});function A(z){return P?r.getName(z):Ax(r,z)}this._sizeX=i[0]/2,this._sizeY=i[1]/2;var L=s.ensureState(\"emphasis\");if(L.style=u,s.ensureState(\"select\").style=c,s.ensureState(\"blur\").style=f,g){var O=Math.max(1.1,3/this._sizeY);L.scaleX=this._sizeX*O,L.scaleY=this._sizeY*O}this.setSymbolScale(1),ou(this,v,h,d)},t.prototype.setSymbolScale=function(r){this.scaleX=this.scaleY=r},t.prototype.fadeOut=function(r,n,i){var a=this.childAt(0),o=Nt(this).dataIndex,s=i&&i.animation;if(this.silent=a.silent=!0,i&&i.fadeLabel){var l=a.getTextContent();l&&lu(l,{style:{opacity:0}},n,{dataIndex:o,removeOpt:s,cb:function(){a.removeTextContent()}})}else a.removeTextContent();lu(a,{style:{opacity:0},scaleX:0,scaleY:0},n,{dataIndex:o,cb:r,removeOpt:s})},t.getSymbolSize=function(r,n){return dk(r.getItemVisual(n,\"symbolSize\"))},t}(ye);function S5(e,t){this.parent.drift(e,t)}var sp=b5;function kc(e,t,r,n){return t&&!isNaN(t[0])&&!isNaN(t[1])&&!(n.isIgnore&&n.isIgnore(r))&&!(n.clipShape&&!n.clipShape.contain(t[0],t[1]))&&e.getItemVisual(r,\"symbol\")!==\"none\"}function F0(e){return e!=null&&!st(e)&&(e={isIgnore:e}),e||{}}function z0(e){var t=e.hostModel,r=t.getModel(\"emphasis\");return{emphasisItemStyle:r.getModel(\"itemStyle\").getItemStyle(),blurItemStyle:t.getModel([\"blur\",\"itemStyle\"]).getItemStyle(),selectItemStyle:t.getModel([\"select\",\"itemStyle\"]).getItemStyle(),focus:r.get(\"focus\"),blurScope:r.get(\"blurScope\"),emphasisDisabled:r.get(\"disabled\"),hoverScale:r.get(\"scale\"),labelStatesModels:ju(t),cursorStyle:t.get(\"cursor\")}}var x5=function(){function e(t){this.group=new ye,this._SymbolCtor=t||sp}return e.prototype.updateData=function(t,r){this._progressiveEls=null,r=F0(r);var n=this.group,i=t.hostModel,a=this._data,o=this._SymbolCtor,s=r.disableAnimation,l=z0(t),u={disableAnimation:s},f=r.getSymbolPoint||function(c){return t.getItemLayout(c)};a||n.removeAll(),t.diff(a).add(function(c){var v=f(c);if(kc(t,v,c,r)){var h=new o(t,c,l,u);h.setPosition(v),t.setItemGraphicEl(c,h),n.add(h)}}).update(function(c,v){var h=a.getItemGraphicEl(v),d=f(c);if(!kc(t,d,c,r)){n.remove(h);return}var p=t.getItemVisual(c,\"symbol\")||\"circle\",g=h&&h.getSymbolType&&h.getSymbolType();if(!h||g&&g!==p)n.remove(h),h=new o(t,c,l,u),h.setPosition(d);else{h.updateData(t,c,l,u);var m={x:d[0],y:d[1]};s?h.attr(m):Dr(h,m,i)}n.add(h),t.setItemGraphicEl(c,h)}).remove(function(c){var v=a.getItemGraphicEl(c);v&&v.fadeOut(function(){n.remove(v)},i)}).execute(),this._getSymbolPoint=f,this._data=t},e.prototype.updateLayout=function(){var t=this,r=this._data;r&&r.eachItemGraphicEl(function(n,i){var a=t._getSymbolPoint(i);n.setPosition(a),n.markRedraw()})},e.prototype.incrementalPrepareUpdate=function(t){this._seriesScope=z0(t),this._data=null,this.group.removeAll()},e.prototype.incrementalUpdate=function(t,r,n){this._progressiveEls=[],n=F0(n);function i(l){l.isGroup||(l.incremental=!0,l.ensureState(\"emphasis\").hoverLayer=!0)}for(var a=t.start;a<t.end;a++){var o=r.getItemLayout(a);if(kc(r,o,a,n)){var s=new this._SymbolCtor(r,a,this._seriesScope);s.traverse(i),s.setPosition(o),this.group.add(s),r.setItemGraphicEl(a,s),this._progressiveEls.push(s)}}},e.prototype.eachRendered=function(t){Od(this._progressiveEls||this.group,t)},e.prototype.remove=function(t){var r=this.group,n=this._data;n&&t?n.eachItemGraphicEl(function(i){i.fadeOut(function(){r.remove(i)},n.hostModel)}):r.removeAll()},e}(),T5=x5;function C5(e,t){return e.type===t}var M5=function(e,t){if(t===\"all\")return{type:\"all\",title:e.getLocaleModel().get([\"legend\",\"selector\",\"all\"])};if(t===\"inverse\")return{type:\"inverse\",title:e.getLocaleModel().get([\"legend\",\"selector\",\"inverse\"])}},A5=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=t.type,r.layoutMode={type:\"box\",ignoreSize:!0},r}return t.prototype.init=function(r,n,i){this.mergeDefaultAndTheme(r,i),r.selected=r.selected||{},this._updateSelector(r)},t.prototype.mergeOption=function(r,n){e.prototype.mergeOption.call(this,r,n),this._updateSelector(r)},t.prototype._updateSelector=function(r){var n=r.selector,i=this.ecModel;n===!0&&(n=r.selector=[\"all\",\"inverse\"]),et(n)&&I(n,function(a,o){it(a)&&(a={type:a}),n[o]=Dt(a,M5(i,a.type))})},t.prototype.optionUpdated=function(){this._updateData(this.ecModel);var r=this._data;if(r[0]&&this.get(\"selectedMode\")===\"single\"){for(var n=!1,i=0;i<r.length;i++){var a=r[i].get(\"name\");if(this.isSelected(a)){this.select(a),n=!0;break}}!n&&this.select(r[0].get(\"name\"))}},t.prototype._updateData=function(r){var n=[],i=[];r.eachRawSeries(function(s){var l=s.name;i.push(l);var u;if(s.legendVisualProvider){var f=s.legendVisualProvider,c=f.getAllNames();r.isSeriesFiltered(s)||(i=i.concat(c)),c.length?n=n.concat(c):u=!0}else u=!0;u&&wd(s)&&n.push(s.name)}),this._availableNames=i;var a=this.get(\"data\")||n,o=ct(a,function(s){return(it(s)||zt(s))&&(s={name:s}),new ce(s,this,this.ecModel)},this);this._data=o},t.prototype.getData=function(){return this._data},t.prototype.select=function(r){var n=this.option.selected,i=this.get(\"selectedMode\");if(i===\"single\"){var a=this._data;I(a,function(o){n[o.get(\"name\")]=!1})}n[r]=!0},t.prototype.unSelect=function(r){this.get(\"selectedMode\")!==\"single\"&&(this.option.selected[r]=!1)},t.prototype.toggleSelected=function(r){var n=this.option.selected;n.hasOwnProperty(r)||(n[r]=!0),this[n[r]?\"unSelect\":\"select\"](r)},t.prototype.allSelect=function(){var r=this._data,n=this.option.selected;I(r,function(i){n[i.get(\"name\",!0)]=!0})},t.prototype.inverseSelect=function(){var r=this._data,n=this.option.selected;I(r,function(i){var a=i.get(\"name\",!0);n.hasOwnProperty(a)||(n[a]=!0),n[a]=!n[a]})},t.prototype.isSelected=function(r){var n=this.option.selected;return!(n.hasOwnProperty(r)&&!n[r])&&It(this._availableNames,r)>=0},t.prototype.getOrient=function(){return this.get(\"orient\")===\"vertical\"?{index:1,name:\"vertical\"}:{index:0,name:\"horizontal\"}},t.type=\"legend.plain\",t.dependencies=[\"series\"],t.defaultOption={z:4,show:!0,orient:\"horizontal\",left:\"center\",top:0,align:\"auto\",backgroundColor:\"rgba(0,0,0,0)\",borderColor:\"#ccc\",borderRadius:0,borderWidth:0,padding:5,itemGap:10,itemWidth:25,itemHeight:14,symbolRotate:\"inherit\",symbolKeepAspect:!0,inactiveColor:\"#ccc\",inactiveBorderColor:\"#ccc\",inactiveBorderWidth:\"auto\",itemStyle:{color:\"inherit\",opacity:\"inherit\",borderColor:\"inherit\",borderWidth:\"auto\",borderCap:\"inherit\",borderJoin:\"inherit\",borderDashOffset:\"inherit\",borderMiterLimit:\"inherit\"},lineStyle:{width:\"auto\",color:\"inherit\",inactiveColor:\"#ccc\",inactiveWidth:2,opacity:\"inherit\",type:\"inherit\",cap:\"inherit\",join:\"inherit\",dashOffset:\"inherit\",miterLimit:\"inherit\"},textStyle:{color:\"#333\"},selectedMode:!0,selector:!1,selectorLabel:{show:!0,borderRadius:10,padding:[3,5,3,5],fontSize:12,fontFamily:\"sans-serif\",color:\"#666\",borderWidth:1,borderColor:\"#666\"},emphasis:{selectorLabel:{show:!0,color:\"#eee\",backgroundColor:\"#666\"}},selectorPosition:\"auto\",selectorItemGap:7,selectorButtonGap:10,tooltip:{show:!1}},t}($t),pv=A5,Qi=Xt,gv=I,vl=ye,D5=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=t.type,r.newlineDisabled=!1,r}return t.prototype.init=function(){this.group.add(this._contentGroup=new vl),this.group.add(this._selectorGroup=new vl),this._isFirstRender=!0},t.prototype.getContentGroup=function(){return this._contentGroup},t.prototype.getSelectorGroup=function(){return this._selectorGroup},t.prototype.render=function(r,n,i){var a=this._isFirstRender;if(this._isFirstRender=!1,this.resetInner(),!!r.get(\"show\",!0)){var o=r.get(\"align\"),s=r.get(\"orient\");(!o||o===\"auto\")&&(o=r.get(\"left\")===\"right\"&&s===\"vertical\"?\"right\":\"left\");var l=r.get(\"selector\",!0),u=r.get(\"selectorPosition\",!0);l&&(!u||u===\"auto\")&&(u=s===\"horizontal\"?\"end\":\"start\"),this.renderInner(o,r,n,i,l,s,u);var f=r.getBoxLayoutParams(),c={width:i.getWidth(),height:i.getHeight()},v=r.get(\"padding\"),h=Ma(f,c,v),d=this.layoutInner(r,o,h,a,l,u),p=Ma(Pt({width:d.width,height:d.height},f),c,v);this.group.x=p.x-d.x,this.group.y=p.y-d.y,this.group.markRedraw(),this.group.add(this._backgroundEl=jF(d,r))}},t.prototype.resetInner=function(){this.getContentGroup().removeAll(),this._backgroundEl&&this.group.remove(this._backgroundEl),this.getSelectorGroup().removeAll()},t.prototype.renderInner=function(r,n,i,a,o,s,l){var u=this.getContentGroup(),f=_t(),c=n.get(\"selectedMode\"),v=[];i.eachRawSeries(function(h){!h.get(\"legendHoverLink\")&&v.push(h.id)}),gv(n.getData(),function(h,d){var p=h.get(\"name\");if(!this.newlineDisabled&&(p===\"\"||p===`\n`)){var g=new vl;g.newline=!0,u.add(g);return}var m=i.getSeriesByName(p)[0];if(!f.get(p))if(m){var y=m.getData(),_=y.getVisual(\"legendLineStyle\")||{},w=y.getVisual(\"legendIcon\"),S=y.getVisual(\"style\"),b=this._createItem(m,p,d,h,n,r,_,S,w,c);b.on(\"click\",Qi(H0,p,null,a,v)).on(\"mouseover\",Qi(mv,m.name,null,a,v)).on(\"mouseout\",Qi(yv,m.name,null,a,v)),f.set(p,!0)}else i.eachRawSeries(function(x){if(!f.get(p)&&x.legendVisualProvider){var T=x.legendVisualProvider;if(!T.containName(p))return;var C=T.indexOfName(p),D=T.getItemVisual(C,\"style\"),P=T.getItemVisual(C,\"legendIcon\"),A=$r(D.fill);A&&A[3]===0&&(A[3]=.2,D=Y(Y({},D),{fill:zu(A,\"rgba\")}));var L=this._createItem(x,p,d,h,n,r,{},D,P,c);L.on(\"click\",Qi(H0,null,p,a,v)).on(\"mouseover\",Qi(mv,null,p,a,v)).on(\"mouseout\",Qi(yv,null,p,a,v)),f.set(p,!0)}},this)},this),o&&this._createSelector(o,n,a,s,l)},t.prototype._createSelector=function(r,n,i,a,o){var s=this.getSelectorGroup();gv(r,function(u){var f=u.type,c=new he({style:{x:0,y:0,align:\"center\",verticalAlign:\"middle\"},onclick:function(){i.dispatchAction({type:f===\"all\"?\"legendAllSelect\":\"legendInverseSelect\"})}});s.add(c);var v=n.getModel(\"selectorLabel\"),h=n.getModel([\"emphasis\",\"selectorLabel\"]);Xu(c,{normal:v,emphasis:h},{defaultText:u.title}),$h(c)})},t.prototype._createItem=function(r,n,i,a,o,s,l,u,f,c){var v=r.visualDrawType,h=o.get(\"itemWidth\"),d=o.get(\"itemHeight\"),p=o.isSelected(n),g=a.get(\"symbolRotate\"),m=a.get(\"symbolKeepAspect\"),y=a.get(\"icon\");f=y||f||\"roundRect\";var _=P5(f,a,l,u,v,p),w=new vl,S=a.getModel(\"textStyle\");if(mt(r.getLegendIcon)&&(!y||y===\"inherit\"))w.add(r.getLegendIcon({itemWidth:h,itemHeight:d,icon:f,iconRotate:g,itemStyle:_.itemStyle,lineStyle:_.lineStyle,symbolKeepAspect:m}));else{var b=y===\"inherit\"&&r.getData().getVisual(\"symbol\")?g===\"inherit\"?r.getData().getVisual(\"symbolRotate\"):g:0;w.add(I5({itemWidth:h,itemHeight:d,icon:f,iconRotate:b,itemStyle:_.itemStyle,lineStyle:_.lineStyle,symbolKeepAspect:m}))}var x=s===\"left\"?h+5:-5,T=s,C=o.get(\"formatter\"),D=n;it(C)&&C?D=C.replace(\"{name}\",n!=null?n:\"\"):mt(C)&&(D=C(n));var P=a.get(\"inactiveColor\");w.add(new he({style:kn(S,{text:D,x,y:d/2,fill:p?S.getTextColor():P,align:T,verticalAlign:\"middle\"})}));var A=new ne({shape:w.getBoundingRect(),invisible:!0}),L=a.getModel(\"tooltip\");return L.get(\"show\")&&Rd({el:A,componentModel:o,itemName:n,itemTooltipOption:L.option}),w.add(A),w.eachChild(function(O){O.silent=!0}),A.silent=!c,this.getContentGroup().add(w),$h(w),w.__legendDataIndex=i,w},t.prototype.layoutInner=function(r,n,i,a,o,s){var l=this.getContentGroup(),u=this.getSelectorGroup();No(r.get(\"orient\"),l,r.get(\"itemGap\"),i.width,i.height);var f=l.getBoundingRect(),c=[-f.x,-f.y];if(u.markRedraw(),l.markRedraw(),o){No(\"horizontal\",u,r.get(\"selectorItemGap\",!0));var v=u.getBoundingRect(),h=[-v.x,-v.y],d=r.get(\"selectorButtonGap\",!0),p=r.getOrient().index,g=p===0?\"width\":\"height\",m=p===0?\"height\":\"width\",y=p===0?\"y\":\"x\";s===\"end\"?h[p]+=f[g]+d:c[p]+=v[g]+d,h[1-p]+=f[m]/2-v[m]/2,u.x=h[0],u.y=h[1],l.x=c[0],l.y=c[1];var _={x:0,y:0};return _[g]=f[g]+d+v[g],_[m]=Math.max(f[m],v[m]),_[y]=Math.min(0,v[y]+h[1-p]),_}else return l.x=c[0],l.y=c[1],this.group.getBoundingRect()},t.prototype.remove=function(){this.getContentGroup().removeAll(),this._isFirstRender=!0},t.type=\"legend.plain\",t}(qr);function P5(e,t,r,n,i,a){function o(d,p){d.lineWidth===\"auto\"&&(d.lineWidth=p.lineWidth>0?2:0),gv(d,function(g,m){d[m]===\"inherit\"&&(d[m]=p[m])})}var s=t.getModel(\"itemStyle\"),l=s.getItemStyle(),u=e.lastIndexOf(\"empty\",0)===0?\"fill\":\"stroke\";l.decal=n.decal,l.fill===\"inherit\"&&(l.fill=n[i]),l.stroke===\"inherit\"&&(l.stroke=n[u]),l.opacity===\"inherit\"&&(l.opacity=(i===\"fill\"?n:r).opacity),o(l,n);var f=t.getModel(\"lineStyle\"),c=f.getLineStyle();if(o(c,r),l.fill===\"auto\"&&(l.fill=n.fill),l.stroke===\"auto\"&&(l.stroke=n.fill),c.stroke===\"auto\"&&(c.stroke=n.fill),!a){var v=t.get(\"inactiveBorderWidth\"),h=l[u];l.lineWidth=v===\"auto\"?n.lineWidth>0&&h?2:0:l.lineWidth,l.fill=t.get(\"inactiveColor\"),l.stroke=t.get(\"inactiveBorderColor\"),c.stroke=f.get(\"inactiveColor\"),c.lineWidth=f.get(\"inactiveWidth\")}return{itemStyle:l,lineStyle:c}}function I5(e){var t=e.icon||\"roundRect\",r=Ia(t,0,0,e.itemWidth,e.itemHeight,e.itemStyle.fill,e.symbolKeepAspect);return r.setStyle(e.itemStyle),r.rotation=(e.iconRotate||0)*Math.PI/180,r.setOrigin([e.itemWidth/2,e.itemHeight/2]),t.indexOf(\"empty\")>-1&&(r.style.stroke=r.style.fill,r.style.fill=\"#fff\",r.style.lineWidth=2),r}function H0(e,t,r,n){yv(e,t,r,n),r.dispatchAction({type:\"legendToggleSelect\",name:e!=null?e:t}),mv(e,t,r,n)}function Dx(e){for(var t=e.getZr().storage.getDisplayList(),r,n=0,i=t.length;n<i&&!(r=t[n].states.emphasis);)n++;return r&&r.hoverLayer}function mv(e,t,r,n){Dx(r)||r.dispatchAction({type:\"highlight\",seriesName:e,name:t,excludeSeriesId:n})}function yv(e,t,r,n){Dx(r)||r.dispatchAction({type:\"downplay\",seriesName:e,name:t,excludeSeriesId:n})}var Px=D5;function E5(e){var t=e.findComponents({mainType:\"legend\"});t&&t.length&&e.filterSeries(function(r){for(var n=0;n<t.length;n++)if(!t[n].isSelected(r.name))return!1;return!0})}function uo(e,t,r){var n={},i=e===\"toggleSelected\",a;return r.eachComponent(\"legend\",function(o){i&&a!=null?o[a?\"select\":\"unSelect\"](t.name):e===\"allSelect\"||e===\"inverseSelect\"?o[e]():(o[e](t.name),a=o.isSelected(t.name));var s=o.getData();I(s,function(l){var u=l.get(\"name\");if(!(u===`\n`||u===\"\")){var f=o.isSelected(u);n.hasOwnProperty(u)?n[u]=n[u]&&f:n[u]=f}})}),e===\"allSelect\"||e===\"inverseSelect\"?{selected:n}:{name:t.name,selected:n}}function L5(e){e.registerAction(\"legendToggleSelect\",\"legendselectchanged\",Xt(uo,\"toggleSelected\")),e.registerAction(\"legendAllSelect\",\"legendselectall\",Xt(uo,\"allSelect\")),e.registerAction(\"legendInverseSelect\",\"legendinverseselect\",Xt(uo,\"inverseSelect\")),e.registerAction(\"legendSelect\",\"legendselected\",Xt(uo,\"select\")),e.registerAction(\"legendUnSelect\",\"legendunselected\",Xt(uo,\"unSelect\"))}function Ix(e){e.registerComponentModel(pv),e.registerComponentView(Px),e.registerProcessor(e.PRIORITY.PROCESSOR.SERIES_FILTER,E5),e.registerSubTypeDefaulter(\"legend\",function(){return\"plain\"}),L5(e)}var R5=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=t.type,r}return t.prototype.setScrollDataIndex=function(r){this.option.scrollDataIndex=r},t.prototype.init=function(r,n,i){var a=nf(r);e.prototype.init.call(this,r,n,i),$0(this,r,a)},t.prototype.mergeOption=function(r,n){e.prototype.mergeOption.call(this,r,n),$0(this,this.option,r)},t.type=\"legend.scroll\",t.defaultOption=q2(pv.defaultOption,{scrollDataIndex:0,pageButtonItemGap:5,pageButtonGap:null,pageButtonPosition:\"end\",pageFormatter:\"{current}/{total}\",pageIcons:{horizontal:[\"M0,0L12,-10L12,10z\",\"M0,0L-12,-10L-12,10z\"],vertical:[\"M0,0L20,0L10,-20z\",\"M0,0L20,0L10,20z\"]},pageIconColor:\"#2f4554\",pageIconInactiveColor:\"#aaa\",pageIconSize:15,pageTextStyle:{color:\"#333\"},animationDurationUpdate:800}),t}(pv);function $0(e,t,r){var n=e.getOrient(),i=[1,1];i[n.index]=0,Aa(t,r,{type:\"box\",ignoreSize:!!i})}var O5=R5,V0=ye,Nc=[\"width\",\"height\"],Bc=[\"x\",\"y\"],k5=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=t.type,r.newlineDisabled=!0,r._currentIndex=0,r}return t.prototype.init=function(){e.prototype.init.call(this),this.group.add(this._containerGroup=new V0),this._containerGroup.add(this.getContentGroup()),this.group.add(this._controllerGroup=new V0)},t.prototype.resetInner=function(){e.prototype.resetInner.call(this),this._controllerGroup.removeAll(),this._containerGroup.removeClipPath(),this._containerGroup.__rectSize=null},t.prototype.renderInner=function(r,n,i,a,o,s,l){var u=this;e.prototype.renderInner.call(this,r,n,i,a,o,s,l);var f=this._controllerGroup,c=n.get(\"pageIconSize\",!0),v=et(c)?c:[c,c];d(\"pagePrev\",0);var h=n.getModel(\"pageTextStyle\");f.add(new he({name:\"pageText\",style:{text:\"xx/xx\",fill:h.getTextColor(),font:h.getFont(),verticalAlign:\"middle\",align:\"center\"},silent:!0})),d(\"pageNext\",1);function d(p,g){var m=p+\"DataIndex\",y=Ld(n.get(\"pageIcons\",!0)[n.getOrient().name][g],{onclick:Ft(u._pageGo,u,m,n,a)},{x:-v[0]/2,y:-v[1]/2,width:v[0],height:v[1]});y.name=p,f.add(y)}},t.prototype.layoutInner=function(r,n,i,a,o,s){var l=this.getSelectorGroup(),u=r.getOrient().index,f=Nc[u],c=Bc[u],v=Nc[1-u],h=Bc[1-u];o&&No(\"horizontal\",l,r.get(\"selectorItemGap\",!0));var d=r.get(\"selectorButtonGap\",!0),p=l.getBoundingRect(),g=[-p.x,-p.y],m=xt(i);o&&(m[f]=i[f]-p[f]-d);var y=this._layoutContentAndController(r,a,m,u,f,v,h,c);if(o){if(s===\"end\")g[u]+=y[f]+d;else{var _=p[f]+d;g[u]-=_,y[c]-=_}y[f]+=p[f]+d,g[1-u]+=y[h]+y[v]/2-p[v]/2,y[v]=Math.max(y[v],p[v]),y[h]=Math.min(y[h],p[h]+g[1-u]),l.x=g[0],l.y=g[1],l.markRedraw()}return y},t.prototype._layoutContentAndController=function(r,n,i,a,o,s,l,u){var f=this.getContentGroup(),c=this._containerGroup,v=this._controllerGroup;No(r.get(\"orient\"),f,r.get(\"itemGap\"),a?i.width:null,a?null:i.height),No(\"horizontal\",v,r.get(\"pageButtonItemGap\",!0));var h=f.getBoundingRect(),d=v.getBoundingRect(),p=this._showController=h[o]>i[o],g=[-h.x,-h.y];n||(g[a]=f[u]);var m=[0,0],y=[-d.x,-d.y],_=Mt(r.get(\"pageButtonGap\",!0),r.get(\"itemGap\",!0));if(p){var w=r.get(\"pageButtonPosition\",!0);w===\"end\"?y[a]+=i[o]-d[o]:m[a]+=d[o]+_}y[1-a]+=h[s]/2-d[s]/2,f.setPosition(g),c.setPosition(m),v.setPosition(y);var S={x:0,y:0};if(S[o]=p?i[o]:h[o],S[s]=Math.max(h[s],d[s]),S[l]=Math.min(0,d[l]+y[1-a]),c.__rectSize=i[o],p){var b={x:0,y:0};b[o]=Math.max(i[o]-d[o]-_,0),b[s]=S[s],c.setClipPath(new ne({shape:b})),c.__rectSize=b[o]}else v.eachChild(function(T){T.attr({invisible:!0,silent:!0})});var x=this._getPageInfo(r);return x.pageIndex!=null&&Dr(f,{x:x.contentPosition[0],y:x.contentPosition[1]},p?r:null),this._updatePageInfoView(r,x),S},t.prototype._pageGo=function(r,n,i){var a=this._getPageInfo(n)[r];a!=null&&i.dispatchAction({type:\"legendScroll\",scrollDataIndex:a,legendId:n.id})},t.prototype._updatePageInfoView=function(r,n){var i=this._controllerGroup;I([\"pagePrev\",\"pageNext\"],function(f){var c=f+\"DataIndex\",v=n[c]!=null,h=i.childOfName(f);h&&(h.setStyle(\"fill\",v?r.get(\"pageIconColor\",!0):r.get(\"pageIconInactiveColor\",!0)),h.cursor=v?\"pointer\":\"default\")});var a=i.childOfName(\"pageText\"),o=r.get(\"pageFormatter\"),s=n.pageIndex,l=s!=null?s+1:0,u=n.pageCount;a&&o&&a.setStyle(\"text\",it(o)?o.replace(\"{current}\",l==null?\"\":l+\"\").replace(\"{total}\",u==null?\"\":u+\"\"):o({current:l,total:u}))},t.prototype._getPageInfo=function(r){var n=r.get(\"scrollDataIndex\",!0),i=this.getContentGroup(),a=this._containerGroup.__rectSize,o=r.getOrient().index,s=Nc[o],l=Bc[o],u=this._findTargetItemIndex(n),f=i.children(),c=f[u],v=f.length,h=v?1:0,d={contentPosition:[i.x,i.y],pageCount:h,pageIndex:h-1,pagePrevDataIndex:null,pageNextDataIndex:null};if(!c)return d;var p=w(c);d.contentPosition[o]=-p.s;for(var g=u+1,m=p,y=p,_=null;g<=v;++g)_=w(f[g]),(!_&&y.e>m.s+a||_&&!S(_,m.s))&&(y.i>m.i?m=y:m=_,m&&(d.pageNextDataIndex==null&&(d.pageNextDataIndex=m.i),++d.pageCount)),y=_;for(var g=u-1,m=p,y=p,_=null;g>=-1;--g)_=w(f[g]),(!_||!S(y,_.s))&&m.i<y.i&&(y=m,d.pagePrevDataIndex==null&&(d.pagePrevDataIndex=m.i),++d.pageCount,++d.pageIndex),m=_;return d;function w(b){if(b){var x=b.getBoundingRect(),T=x[l]+b[l];return{s:T,e:T+x[s],i:b.__legendDataIndex}}}function S(b,x){return b.e>=x&&b.s<=x+a}},t.prototype._findTargetItemIndex=function(r){if(!this._showController)return 0;var n,i=this.getContentGroup(),a;return i.eachChild(function(o,s){var l=o.__legendDataIndex;a==null&&l!=null&&(a=s),l===r&&(n=s)}),n!=null?n:a},t.type=\"legend.scroll\",t}(Px),N5=k5;function B5(e){e.registerAction(\"legendScroll\",\"legendscroll\",function(t,r){var n=t.scrollDataIndex;n!=null&&r.eachComponent({mainType:\"legend\",subType:\"scroll\",query:t},function(i){i.setScrollDataIndex(n)})})}function F5(e){Ci(Ix),e.registerComponentModel(O5),e.registerComponentView(N5),B5(e)}function uH(e){Ci(Ix),Ci(F5)}var z5=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.type=t.type,r.hasSymbolVisual=!0,r}return t.prototype.getInitialData=function(r){return PN(null,this,{useEncodeDefaulter:!0})},t.prototype.getLegendIcon=function(r){var n=new ye,i=Ia(\"line\",0,r.itemHeight/2,r.itemWidth,0,r.lineStyle.stroke,!1);n.add(i),i.setStyle(r.lineStyle);var a=this.getData().getVisual(\"symbol\"),o=this.getData().getVisual(\"symbolRotate\"),s=a===\"none\"?\"circle\":a,l=r.itemHeight*.8,u=Ia(s,(r.itemWidth-l)/2,(r.itemHeight-l)/2,l,l,r.itemStyle.fill);n.add(u),u.setStyle(r.itemStyle);var f=r.iconRotate===\"inherit\"?o:r.iconRotate||0;return u.rotation=f*Math.PI/180,u.setOrigin([r.itemWidth/2,r.itemHeight/2]),s.indexOf(\"empty\")>-1&&(u.style.stroke=u.style.fill,u.style.fill=\"#fff\",u.style.lineWidth=2),n},t.type=\"series.line\",t.dependencies=[\"grid\",\"polar\"],t.defaultOption={z:3,coordinateSystem:\"cartesian2d\",legendHoverLink:!0,clip:!0,label:{position:\"top\"},endLabel:{show:!1,valueAnimation:!0,distance:8},lineStyle:{width:2,type:\"solid\"},emphasis:{scale:!0},step:!1,smooth:!1,smoothMonotone:null,symbol:\"emptyCircle\",symbolSize:4,symbolRotate:null,showSymbol:!0,showAllSymbol:\"auto\",connectNulls:!1,sampling:\"none\",animationEasing:\"linear\",progressive:0,hoverLayerThreshold:1/0,universalTransition:{divideShape:\"clone\"},triggerLineEvent:!1},t}(Pa),H5=z5;function Ex(e,t,r){var n=e.getBaseAxis(),i=e.getOtherAxis(n),a=$5(i,r),o=n.dim,s=i.dim,l=t.mapDimension(s),u=t.mapDimension(o),f=s===\"x\"||s===\"radius\"?1:0,c=ct(e.dimensions,function(d){return t.mapDimension(d)}),v=!1,h=t.getCalculationInfo(\"stackResultDimension\");return us(t,c[0])&&(v=!0,c[0]=h),us(t,c[1])&&(v=!0,c[1]=h),{dataDimsForPoint:c,valueStart:a,valueAxisDim:s,baseAxisDim:o,stacked:!!v,valueDim:l,baseDim:u,baseDataOffset:f,stackedOverDimension:t.getCalculationInfo(\"stackedOverDimension\")}}function $5(e,t){var r=0,n=e.scale.getExtent();return t===\"start\"?r=n[0]:t===\"end\"?r=n[1]:n[0]>0?r=n[0]:n[1]<0&&(r=n[1]),r}function Lx(e,t,r,n){var i=NaN;e.stacked&&(i=r.get(r.getCalculationInfo(\"stackedOverDimension\"),n)),isNaN(i)&&(i=e.valueStart);var a=e.baseDataOffset,o=[];return o[a]=r.get(e.baseDim,n),o[1-a]=i,t.dataToPoint(o)}function V5(e,t){var r=[];return t.diff(e).add(function(n){r.push({cmd:\"+\",idx:n})}).update(function(n,i){r.push({cmd:\"=\",idx:i,idx1:n})}).remove(function(n){r.push({cmd:\"-\",idx:n})}).execute(),r}function G5(e,t,r,n,i,a,o,s){for(var l=V5(e,t),u=[],f=[],c=[],v=[],h=[],d=[],p=[],g=Ex(i,t,o),m=e.getLayout(\"points\")||[],y=t.getLayout(\"points\")||[],_=0;_<l.length;_++){var w=l[_],S=!0,b=void 0,x=void 0;switch(w.cmd){case\"=\":b=w.idx*2,x=w.idx1*2;var T=m[b],C=m[b+1],D=y[x],P=y[x+1];(isNaN(T)||isNaN(C))&&(T=D,C=P),u.push(T,C),f.push(D,P),c.push(r[b],r[b+1]),v.push(n[x],n[x+1]),p.push(t.getRawIndex(w.idx1));break;case\"+\":var A=w.idx,L=g.dataDimsForPoint,O=i.dataToPoint([t.get(L[0],A),t.get(L[1],A)]);x=A*2,u.push(O[0],O[1]),f.push(y[x],y[x+1]);var z=Lx(g,i,t,A);c.push(z[0],z[1]),v.push(n[x],n[x+1]),p.push(t.getRawIndex(A));break;case\"-\":S=!1}S&&(h.push(w),d.push(d.length))}d.sort(function(k,G){return p[k]-p[G]});for(var N=u.length,tt=la(N),V=la(N),K=la(N),lt=la(N),yt=[],_=0;_<d.length;_++){var ut=d[_],ht=_*2,bt=ut*2;tt[ht]=u[bt],tt[ht+1]=u[bt+1],V[ht]=f[bt],V[ht+1]=f[bt+1],K[ht]=c[bt],K[ht+1]=c[bt+1],lt[ht]=v[bt],lt[ht+1]=v[bt+1],yt[_]=h[ut]}return{current:tt,next:V,stackedOnCurrent:K,stackedOnNext:lt,status:yt}}var ln=Math.min,un=Math.max;function _i(e,t){return isNaN(e)||isNaN(t)}function _v(e,t,r,n,i,a,o,s,l){for(var u,f,c,v,h,d,p=r,g=0;g<n;g++){var m=t[p*2],y=t[p*2+1];if(p>=i||p<0)break;if(_i(m,y)){if(l){p+=a;continue}break}if(p===r)e[a>0?\"moveTo\":\"lineTo\"](m,y),c=m,v=y;else{var _=m-u,w=y-f;if(_*_+w*w<.5){p+=a;continue}if(o>0){for(var S=p+a,b=t[S*2],x=t[S*2+1];b===m&&x===y&&g<n;)g++,S+=a,p+=a,b=t[S*2],x=t[S*2+1],m=t[p*2],y=t[p*2+1],_=m-u,w=y-f;var T=g+1;if(l)for(;_i(b,x)&&T<n;)T++,S+=a,b=t[S*2],x=t[S*2+1];var C=.5,D=0,P=0,A=void 0,L=void 0;if(T>=n||_i(b,x))h=m,d=y;else{D=b-u,P=x-f;var O=m-u,z=b-m,N=y-f,tt=x-y,V=void 0,K=void 0;if(s===\"x\"){V=Math.abs(O),K=Math.abs(z);var lt=D>0?1:-1;h=m-lt*V*o,d=y,A=m+lt*K*o,L=y}else if(s===\"y\"){V=Math.abs(N),K=Math.abs(tt);var yt=P>0?1:-1;h=m,d=y-yt*V*o,A=m,L=y+yt*K*o}else V=Math.sqrt(O*O+N*N),K=Math.sqrt(z*z+tt*tt),C=K/(K+V),h=m-D*o*(1-C),d=y-P*o*(1-C),A=m+D*o*C,L=y+P*o*C,A=ln(A,un(b,m)),L=ln(L,un(x,y)),A=un(A,ln(b,m)),L=un(L,ln(x,y)),D=A-m,P=L-y,h=m-D*V/K,d=y-P*V/K,h=ln(h,un(u,m)),d=ln(d,un(f,y)),h=un(h,ln(u,m)),d=un(d,ln(f,y)),D=m-h,P=y-d,A=m+D*K/V,L=y+P*K/V}e.bezierCurveTo(c,v,h,d,m,y),c=A,v=L}else e.lineTo(m,y)}u=m,f=y,p+=a}return g}var Rx=function(){function e(){this.smooth=0,this.smoothConstraint=!0}return e}(),U5=function(e){J(t,e);function t(r){var n=e.call(this,r)||this;return n.type=\"ec-polyline\",n}return t.prototype.getDefaultStyle=function(){return{stroke:\"#000\",fill:null}},t.prototype.getDefaultShape=function(){return new Rx},t.prototype.buildPath=function(r,n){var i=n.points,a=0,o=i.length/2;if(n.connectNulls){for(;o>0&&_i(i[o*2-2],i[o*2-1]);o--);for(;a<o&&_i(i[a*2],i[a*2+1]);a++);}for(;a<o;)a+=_v(r,i,a,o,o,1,n.smooth,n.smoothMonotone,n.connectNulls)+1},t.prototype.getPointOn=function(r,n){this.path||(this.createPathProxy(),this.buildPath(this.path,this.shape));for(var i=this.path,a=i.data,o=On.CMD,s,l,u=n===\"x\",f=[],c=0;c<a.length;){var v=a[c++],h=void 0,d=void 0,p=void 0,g=void 0,m=void 0,y=void 0,_=void 0;switch(v){case o.M:s=a[c++],l=a[c++];break;case o.L:if(h=a[c++],d=a[c++],_=u?(r-s)/(h-s):(r-l)/(d-l),_<=1&&_>=0){var w=u?(d-l)*_+l:(h-s)*_+s;return u?[r,w]:[w,r]}s=h,l=d;break;case o.C:h=a[c++],d=a[c++],p=a[c++],g=a[c++],m=a[c++],y=a[c++];var S=u?jl(s,h,p,m,r,f):jl(l,d,g,y,r,f);if(S>0)for(var b=0;b<S;b++){var x=f[b];if(x<=1&&x>=0){var w=u?Kt(l,d,g,y,x):Kt(s,h,p,m,x);return u?[r,w]:[w,r]}}s=m,l=y;break}}},t}(kt),W5=function(e){J(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(Rx),Y5=function(e){J(t,e);function t(r){var n=e.call(this,r)||this;return n.type=\"ec-polygon\",n}return t.prototype.getDefaultShape=function(){return new W5},t.prototype.buildPath=function(r,n){var i=n.points,a=n.stackedOnPoints,o=0,s=i.length/2,l=n.smoothMonotone;if(n.connectNulls){for(;s>0&&_i(i[s*2-2],i[s*2-1]);s--);for(;o<s&&_i(i[o*2],i[o*2+1]);o++);}for(;o<s;){var u=_v(r,i,o,s,s,1,n.smooth,l,n.connectNulls);_v(r,a,o+u-1,u,s,-1,n.stackedOnSmooth,l,n.connectNulls),o+=u+1,r.closePath()}},t}(kt);function q5(e,t,r,n,i){var a=e.getArea(),o=a.x,s=a.y,l=a.width,u=a.height,f=r.get([\"lineStyle\",\"width\"])||2;o-=f/2,s-=f/2,l+=f,u+=f,o=Math.floor(o),l=Math.round(l);var c=new ne({shape:{x:o,y:s,width:l,height:u}});if(t){var v=e.getBaseAxis(),h=v.isHorizontal(),d=v.inverse;h?(d&&(c.shape.x+=l),c.shape.width=0):(d||(c.shape.y+=u),c.shape.height=0);var p=mt(i)?function(g){i(g,c)}:null;An(c,{shape:{width:l,height:u,x:o,y:s}},r,null,n,p)}return c}function X5(e,t,r){var n=e.getArea(),i=jt(n.r0,1),a=jt(n.r,1),o=new ws({shape:{cx:jt(e.cx,1),cy:jt(e.cy,1),r0:i,r:a,startAngle:n.startAngle,endAngle:n.endAngle,clockwise:n.clockwise}});if(t){var s=e.getBaseAxis().dim===\"angle\";s?o.shape.endAngle=n.startAngle:o.shape.r=i,An(o,{shape:{endAngle:n.endAngle,r:a}},r)}return o}function G0(e,t){if(e.length===t.length){for(var r=0;r<e.length;r++)if(e[r]!==t[r])return;return!0}}function U0(e){for(var t=1/0,r=1/0,n=-1/0,i=-1/0,a=0;a<e.length;){var o=e[a++],s=e[a++];isNaN(o)||(t=Math.min(o,t),n=Math.max(o,n)),isNaN(s)||(r=Math.min(s,r),i=Math.max(s,i))}return[[t,r],[n,i]]}function W0(e,t){var r=U0(e),n=r[0],i=r[1],a=U0(t),o=a[0],s=a[1];return Math.max(Math.abs(n[0]-o[0]),Math.abs(n[1]-o[1]),Math.abs(i[0]-s[0]),Math.abs(i[1]-s[1]))}function Y0(e){return zt(e)?e:e?.5:0}function j5(e,t,r){if(!r.valueDim)return[];for(var n=t.count(),i=la(n*2),a=0;a<n;a++){var o=Lx(r,e,t,a);i[a*2]=o[0],i[a*2+1]=o[1]}return i}function fn(e,t,r,n){var i=t.getBaseAxis(),a=i.dim===\"x\"||i.dim===\"radius\"?0:1,o=[],s=0,l=[],u=[],f=[],c=[];if(n){for(s=0;s<e.length;s+=2)!isNaN(e[s])&&!isNaN(e[s+1])&&c.push(e[s],e[s+1]);e=c}for(s=0;s<e.length-2;s+=2)switch(f[0]=e[s+2],f[1]=e[s+3],u[0]=e[s],u[1]=e[s+1],o.push(u[0],u[1]),r){case\"end\":l[a]=f[a],l[1-a]=u[1-a],o.push(l[0],l[1]);break;case\"middle\":var v=(u[a]+f[a])/2,h=[];l[a]=h[a]=v,l[1-a]=u[1-a],h[1-a]=f[1-a],o.push(l[0],l[1]),o.push(h[0],h[1]);break;default:l[a]=u[a],l[1-a]=f[1-a],o.push(l[0],l[1])}return o.push(e[s++],e[s++]),o}function K5(e,t){var r=[],n=e.length,i,a;function o(f,c,v){var h=f.coord,d=(v-h)/(c.coord-h),p=uI(d,[f.color,c.color]);return{coord:v,color:p}}for(var s=0;s<n;s++){var l=e[s],u=l.coord;if(u<0)i=l;else if(u>t){a?r.push(o(a,l,t)):i&&r.push(o(i,l,0),o(i,l,t));break}else i&&(r.push(o(i,l,0)),i=null),r.push(l),a=l}return r}function Z5(e,t,r){var n=e.getVisual(\"visualMeta\");if(!(!n||!n.length||!e.count())&&t.type===\"cartesian2d\"){for(var i,a,o=n.length-1;o>=0;o--){var s=e.getDimensionInfo(n[o].dimension);if(i=s&&s.coordDim,i===\"x\"||i===\"y\"){a=n[o];break}}if(!!a){var l=t.getAxis(i),u=ct(a.stops,function(_){return{coord:l.toGlobalCoord(l.dataToCoord(_.value)),color:_.color}}),f=u.length,c=a.outerColors.slice();f&&u[0].coord>u[f-1].coord&&(u.reverse(),c.reverse());var v=K5(u,i===\"x\"?r.getWidth():r.getHeight()),h=v.length;if(!h&&f)return u[0].coord<0?c[1]?c[1]:u[f-1].color:c[0]?c[0]:u[0].color;var d=10,p=v[0].coord-d,g=v[h-1].coord+d,m=g-p;if(m<.001)return\"transparent\";I(v,function(_){_.offset=(_.coord-p)/m}),v.push({offset:h?v[h-1].offset:.5,color:c[1]||\"transparent\"}),v.unshift({offset:h?v[0].offset:.5,color:c[0]||\"transparent\"});var y=new sb(0,0,0,0,v,!0);return y[i]=p,y[i+\"2\"]=g,y}}}function Q5(e,t,r){var n=e.get(\"showAllSymbol\"),i=n===\"auto\";if(!(n&&!i)){var a=r.getAxesByScale(\"ordinal\")[0];if(!!a&&!(i&&J5(a,t))){var o=t.mapDimension(a.dim),s={};return I(a.getViewLabels(),function(l){var u=a.scale.getRawOrdinalNumber(l.tickValue);s[u]=1}),function(l){return!s.hasOwnProperty(t.get(o,l))}}}}function J5(e,t){var r=e.getExtent(),n=Math.abs(r[1]-r[0])/e.scale.count();isNaN(n)&&(n=0);for(var i=t.count(),a=Math.max(1,Math.round(i/5)),o=0;o<i;o+=a)if(sp.getSymbolSize(t,o)[e.isHorizontal()?1:0]*1.5>n)return!1;return!0}function tz(e,t){return isNaN(e)||isNaN(t)}function ez(e){for(var t=e.length/2;t>0&&tz(e[t*2-2],e[t*2-1]);t--);return t-1}function q0(e,t){return[e[t*2],e[t*2+1]]}function rz(e,t,r){for(var n=e.length/2,i=r===\"x\"?0:1,a,o,s=0,l=-1,u=0;u<n;u++)if(o=e[u*2+i],!(isNaN(o)||isNaN(e[u*2+1-i]))){if(u===0){a=o;continue}if(a<=t&&o>=t||a>=t&&o<=t){l=u;break}s=u,a=o}return{range:[s,l],t:(t-a)/(o-a)}}function Ox(e){if(e.get([\"endLabel\",\"show\"]))return!0;for(var t=0;t<er.length;t++)if(e.get([er[t],\"endLabel\",\"show\"]))return!0;return!1}function Fc(e,t,r,n){if(C5(t,\"cartesian2d\")){var i=n.getModel(\"endLabel\"),a=i.get(\"valueAnimation\"),o=n.getData(),s={lastFrameIndex:0},l=Ox(n)?function(h,d){e._endLabelOnDuring(h,d,o,s,a,i,t)}:null,u=t.getBaseAxis().isHorizontal(),f=q5(t,r,n,function(){var h=e._endLabel;h&&r&&s.originalX!=null&&h.attr({x:s.originalX,y:s.originalY})},l);if(!n.get(\"clip\",!0)){var c=f.shape,v=Math.max(c.width,c.height);u?(c.y-=v,c.height+=v*2):(c.x-=v,c.width+=v*2)}return l&&l(1,f),f}else return X5(t,r,n)}function nz(e,t){var r=t.getBaseAxis(),n=r.isHorizontal(),i=r.inverse,a=n?i?\"right\":\"left\":\"center\",o=n?\"middle\":i?\"top\":\"bottom\";return{normal:{align:e.get(\"align\")||a,verticalAlign:e.get(\"verticalAlign\")||o}}}var iz=function(e){J(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.init=function(){var r=new ye,n=new T5;this.group.add(n.group),this._symbolDraw=n,this._lineGroup=r},t.prototype.render=function(r,n,i){var a=this,o=r.coordinateSystem,s=this.group,l=r.getData(),u=r.getModel(\"lineStyle\"),f=r.getModel(\"areaStyle\"),c=l.getLayout(\"points\")||[],v=o.type===\"polar\",h=this._coordSys,d=this._symbolDraw,p=this._polyline,g=this._polygon,m=this._lineGroup,y=r.get(\"animation\"),_=!f.isEmpty(),w=f.get(\"origin\"),S=Ex(o,l,w),b=_&&j5(o,l,S),x=r.get(\"showSymbol\"),T=r.get(\"connectNulls\"),C=x&&!v&&Q5(r,l,o),D=this._data;D&&D.eachItemGraphicEl(function(G,$){G.__temp&&(s.remove(G),D.setItemGraphicEl($,null))}),x||d.remove(),s.add(m);var P=v?!1:r.get(\"step\"),A;o&&o.getArea&&r.get(\"clip\",!0)&&(A=o.getArea(),A.width!=null?(A.x-=.1,A.y-=.1,A.width+=.2,A.height+=.2):A.r0&&(A.r0-=.5,A.r+=.5)),this._clipShapeForSymbol=A;var L=Z5(l,o,i)||l.getVisual(\"style\")[l.getVisual(\"drawType\")];if(!(p&&h.type===o.type&&P===this._step))x&&d.updateData(l,{isIgnore:C,clipShape:A,disableAnimation:!0,getSymbolPoint:function(G){return[c[G*2],c[G*2+1]]}}),y&&this._initSymbolLabelAnimation(l,o,A),P&&(c=fn(c,o,P,T),b&&(b=fn(b,o,P,T))),p=this._newPolyline(c),_&&(g=this._newPolygon(c,b)),v||this._initOrUpdateEndLabel(r,o,Ti(L)),m.setClipPath(Fc(this,o,!0,r));else{_&&!g?g=this._newPolygon(c,b):g&&!_&&(m.remove(g),g=this._polygon=null),v||this._initOrUpdateEndLabel(r,o,Ti(L));var O=m.getClipPath();if(O){var z=Fc(this,o,!1,r);An(O,{shape:z.shape},r)}else m.setClipPath(Fc(this,o,!0,r));x&&d.updateData(l,{isIgnore:C,clipShape:A,disableAnimation:!0,getSymbolPoint:function(G){return[c[G*2],c[G*2+1]]}}),(!G0(this._stackedOnPoints,b)||!G0(this._points,c))&&(y?this._doUpdateAnimation(l,b,o,i,P,w,T):(P&&(c=fn(c,o,P,T),b&&(b=fn(b,o,P,T))),p.setShape({points:c}),g&&g.setShape({points:c,stackedOnPoints:b})))}var N=r.getModel(\"emphasis\"),tt=N.get(\"focus\"),V=N.get(\"blurScope\"),K=N.get(\"disabled\");if(p.useStyle(Pt(u.getLineStyle(),{fill:\"none\",stroke:L,lineJoin:\"bevel\"})),Vh(p,r,\"lineStyle\"),p.style.lineWidth>0&&r.get([\"emphasis\",\"lineStyle\",\"width\"])===\"bolder\"){var lt=p.getState(\"emphasis\").style;lt.lineWidth=+p.style.lineWidth+1}Nt(p).seriesIndex=r.seriesIndex,ou(p,tt,V,K);var yt=Y0(r.get(\"smooth\")),ut=r.get(\"smoothMonotone\");if(p.setShape({smooth:yt,smoothMonotone:ut,connectNulls:T}),g){var ht=l.getCalculationInfo(\"stackedOnSeries\"),bt=0;g.useStyle(Pt(f.getAreaStyle(),{fill:L,opacity:.7,lineJoin:\"bevel\",decal:l.getVisual(\"style\").decal})),ht&&(bt=Y0(ht.get(\"smooth\"))),g.setShape({smooth:yt,stackedOnSmooth:bt,smoothMonotone:ut,connectNulls:T}),Vh(g,r,\"areaStyle\"),Nt(g).seriesIndex=r.seriesIndex,ou(g,tt,V,K)}var k=function(G){a._changePolyState(G)};l.eachItemGraphicEl(function(G){G&&(G.onHoverStateChange=k)}),this._polyline.onHoverStateChange=k,this._data=l,this._coordSys=o,this._stackedOnPoints=b,this._points=c,this._step=P,this._valueOrigin=w,r.get(\"triggerLineEvent\")&&(this.packEventData(r,p),g&&this.packEventData(r,g))},t.prototype.packEventData=function(r,n){Nt(n).eventData={componentType:\"series\",componentSubType:\"line\",componentIndex:r.componentIndex,seriesIndex:r.seriesIndex,seriesName:r.name,seriesType:\"line\"}},t.prototype.highlight=function(r,n,i,a){var o=r.getData(),s=Si(o,a);if(this._changePolyState(\"emphasis\"),!(s instanceof Array)&&s!=null&&s>=0){var l=o.getLayout(\"points\"),u=o.getItemGraphicEl(s);if(!u){var f=l[s*2],c=l[s*2+1];if(isNaN(f)||isNaN(c)||this._clipShapeForSymbol&&!this._clipShapeForSymbol.contain(f,c))return;var v=r.get(\"zlevel\"),h=r.get(\"z\");u=new sp(o,s),u.x=f,u.y=c,u.setZ(v,h);var d=u.getSymbolPath().getTextContent();d&&(d.zlevel=v,d.z=h,d.z2=this._polyline.z2+1),u.__temp=!0,o.setItemGraphicEl(s,u),u.stopSymbolAnimation(!0),this.group.add(u)}u.highlight()}else Gr.prototype.highlight.call(this,r,n,i,a)},t.prototype.downplay=function(r,n,i,a){var o=r.getData(),s=Si(o,a);if(this._changePolyState(\"normal\"),s!=null&&s>=0){var l=o.getItemGraphicEl(s);l&&(l.__temp?(o.setItemGraphicEl(s,null),this.group.remove(l)):l.downplay())}else Gr.prototype.downplay.call(this,r,n,i,a)},t.prototype._changePolyState=function(r){var n=this._polygon;Tm(this._polyline,r),n&&Tm(n,r)},t.prototype._newPolyline=function(r){var n=this._polyline;return n&&this._lineGroup.remove(n),n=new U5({shape:{points:r},segmentIgnoreThreshold:2,z2:10}),this._lineGroup.add(n),this._polyline=n,n},t.prototype._newPolygon=function(r,n){var i=this._polygon;return i&&this._lineGroup.remove(i),i=new Y5({shape:{points:r,stackedOnPoints:n},segmentIgnoreThreshold:2}),this._lineGroup.add(i),this._polygon=i,i},t.prototype._initSymbolLabelAnimation=function(r,n,i){var a,o,s=n.getBaseAxis(),l=s.inverse;n.type===\"cartesian2d\"?(a=s.isHorizontal(),o=!1):n.type===\"polar\"&&(a=s.dim===\"angle\",o=!0);var u=r.hostModel,f=u.get(\"animationDuration\");mt(f)&&(f=f(null));var c=u.get(\"animationDelay\")||0,v=mt(c)?c(null):c;r.eachItemGraphicEl(function(h,d){var p=h;if(p){var g=[h.x,h.y],m=void 0,y=void 0,_=void 0;if(i)if(o){var w=i,S=n.pointToCoord(g);a?(m=w.startAngle,y=w.endAngle,_=-S[1]/180*Math.PI):(m=w.r0,y=w.r,_=S[0])}else{var b=i;a?(m=b.x,y=b.x+b.width,_=h.x):(m=b.y+b.height,y=b.y,_=h.y)}var x=y===m?0:(_-m)/(y-m);l&&(x=1-x);var T=mt(c)?c(d):f*x+v,C=p.getSymbolPath(),D=C.getTextContent();p.attr({scaleX:0,scaleY:0}),p.animateTo({scaleX:1,scaleY:1},{duration:200,setToFinal:!0,delay:T}),D&&D.animateFrom({style:{opacity:0}},{duration:300,delay:T}),C.disableLabelAnimation=!0}})},t.prototype._initOrUpdateEndLabel=function(r,n,i){var a=r.getModel(\"endLabel\");if(Ox(r)){var o=r.getData(),s=this._polyline,l=o.getLayout(\"points\");if(!l){s.removeTextContent(),this._endLabel=null;return}var u=this._endLabel;u||(u=this._endLabel=new he({z2:200}),u.ignoreClip=!0,s.setTextContent(this._endLabel),s.disableLabelAnimation=!0);var f=ez(l);f>=0&&(Xu(s,ju(r,\"endLabel\"),{inheritColor:i,labelFetcher:r,labelDataIndex:f,defaultText:function(c,v,h){return h!=null?w5(o,h):Ax(o,c)},enableTextSetter:!0},nz(a,n)),s.textConfig.position=null)}else this._endLabel&&(this._polyline.removeTextContent(),this._endLabel=null)},t.prototype._endLabelOnDuring=function(r,n,i,a,o,s,l){var u=this._endLabel,f=this._polyline;if(u){r<1&&a.originalX==null&&(a.originalX=u.x,a.originalY=u.y);var c=i.getLayout(\"points\"),v=i.hostModel,h=v.get(\"connectNulls\"),d=s.get(\"precision\"),p=s.get(\"distance\")||0,g=l.getBaseAxis(),m=g.isHorizontal(),y=g.inverse,_=n.shape,w=y?m?_.x:_.y+_.height:m?_.x+_.width:_.y,S=(m?p:0)*(y?-1:1),b=(m?0:-p)*(y?-1:1),x=m?\"x\":\"y\",T=rz(c,w,x),C=T.range,D=C[1]-C[0],P=void 0;if(D>=1){if(D>1&&!h){var A=q0(c,C[0]);u.attr({x:A[0]+S,y:A[1]+b}),o&&(P=v.getRawValue(C[0]))}else{var A=f.getPointOn(w,x);A&&u.attr({x:A[0]+S,y:A[1]+b});var L=v.getRawValue(C[0]),O=v.getRawValue(C[1]);o&&(P=hE(i,d,L,O,T.t))}a.lastFrameIndex=C[0]}else{var z=r===1||a.lastFrameIndex>0?C[0]:0,A=q0(c,z);o&&(P=v.getRawValue(z)),u.attr({x:A[0]+S,y:A[1]+b})}o&&pb(u).setLabelText(P)}},t.prototype._doUpdateAnimation=function(r,n,i,a,o,s,l){var u=this._polyline,f=this._polygon,c=r.hostModel,v=G5(this._data,r,this._stackedOnPoints,n,this._coordSys,i,this._valueOrigin),h=v.current,d=v.stackedOnCurrent,p=v.next,g=v.stackedOnNext;if(o&&(h=fn(v.current,i,o,l),d=fn(v.stackedOnCurrent,i,o,l),p=fn(v.next,i,o,l),g=fn(v.stackedOnNext,i,o,l)),W0(h,p)>3e3||f&&W0(d,g)>3e3){u.stopAnimation(),u.setShape({points:p}),f&&(f.stopAnimation(),f.setShape({points:p,stackedOnPoints:g}));return}u.shape.__points=v.current,u.shape.points=h;var m={shape:{points:p}};v.current!==h&&(m.shape.__points=v.next),u.stopAnimation(),Dr(u,m,c),f&&(f.setShape({points:h,stackedOnPoints:d}),f.stopAnimation(),Dr(f,{shape:{stackedOnPoints:g}},c),u.shape.points!==f.shape.points&&(f.shape.points=u.shape.points));for(var y=[],_=v.status,w=0;w<_.length;w++){var S=_[w].cmd;if(S===\"=\"){var b=r.getItemGraphicEl(_[w].idx1);b&&y.push({el:b,ptIdx:w})}}u.animators&&u.animators.length&&u.animators[0].during(function(){f&&f.dirtyShape();for(var x=u.shape.__points,T=0;T<y.length;T++){var C=y[T].el,D=y[T].ptIdx*2;C.x=x[D],C.y=x[D+1],C.markRedraw()}})},t.prototype.remove=function(r){var n=this.group,i=this._data;this._lineGroup.removeAll(),this._symbolDraw.remove(!0),i&&i.eachItemGraphicEl(function(a,o){a.__temp&&(n.remove(a),i.setItemGraphicEl(o,null))}),this._polyline=this._polygon=this._coordSys=this._points=this._stackedOnPoints=this._endLabel=this._data=null},t.type=\"line\",t}(Gr),az=iz;function oz(e,t){return{seriesType:e,plan:nS(),reset:function(r){var n=r.getData(),i=r.coordinateSystem,a=r.pipelineContext,o=t||a.large;if(!!i){var s=ct(i.dimensions,function(h){return n.mapDimension(h)}).slice(0,2),l=s.length,u=n.getCalculationInfo(\"stackResultDimension\");us(n,s[0])&&(s[0]=u),us(n,s[1])&&(s[1]=u);var f=n.getStore(),c=n.getDimensionIndex(s[0]),v=n.getDimensionIndex(s[1]);return l&&{progress:function(h,d){for(var p=h.end-h.start,g=o&&la(p*l),m=[],y=[],_=h.start,w=0;_<h.end;_++){var S=void 0;if(l===1){var b=f.get(c,_);S=i.dataToPoint(b,null,y)}else m[0]=f.get(c,_),m[1]=f.get(v,_),S=i.dataToPoint(m,null,y);o?(g[w++]=S[0],g[w++]=S[1]):d.setItemLayout(_,S.slice())}o&&d.setLayout(\"points\",g)}}}}}}var sz={average:function(e){for(var t=0,r=0,n=0;n<e.length;n++)isNaN(e[n])||(t+=e[n],r++);return r===0?NaN:t/r},sum:function(e){for(var t=0,r=0;r<e.length;r++)t+=e[r]||0;return t},max:function(e){for(var t=-1/0,r=0;r<e.length;r++)e[r]>t&&(t=e[r]);return isFinite(t)?t:NaN},min:function(e){for(var t=1/0,r=0;r<e.length;r++)e[r]<t&&(t=e[r]);return isFinite(t)?t:NaN},nearest:function(e){return e[0]}},lz=function(e){return Math.round(e.length/2)};function uz(e){return{seriesType:e,reset:function(t,r,n){var i=t.getData(),a=t.get(\"sampling\"),o=t.coordinateSystem,s=i.count();if(s>10&&o.type===\"cartesian2d\"&&a){var l=o.getBaseAxis(),u=o.getOtherAxis(l),f=l.getExtent(),c=n.getDevicePixelRatio(),v=Math.abs(f[1]-f[0])*(c||1),h=Math.round(s/v);if(isFinite(h)&&h>1){a===\"lttb\"&&t.setData(i.lttbDownSample(i.mapDimension(u.dim),1/h));var d=void 0;it(a)?d=sz[a]:mt(a)&&(d=a),d&&t.setData(i.downSample(i.mapDimension(u.dim),1/h,d,lz))}}}}}function fH(e){e.registerChartView(az),e.registerSeriesModel(H5),e.registerLayout(oz(\"line\",!0)),e.registerVisual({seriesType:\"line\",reset:function(t){var r=t.getData(),n=t.getModel(\"lineStyle\").getLineStyle();n&&!n.stroke&&(n.stroke=r.getVisual(\"style\").fill),r.setVisual(\"legendLineStyle\",n)}}),e.registerProcessor(e.PRIORITY.PROCESSOR.STATISTIC,uz(\"line\"))}var dl=Math.PI*2,X0=Math.PI/180;function kx(e,t){return Ma(e.getBoxLayoutParams(),{width:t.getWidth(),height:t.getHeight()})}function Nx(e,t){var r=kx(e,t),n=e.get(\"center\"),i=e.get(\"radius\");et(i)||(i=[0,i]),et(n)||(n=[n,n]);var a=Vt(r.width,t.getWidth()),o=Vt(r.height,t.getHeight()),s=Math.min(a,o),l=Vt(n[0],a)+r.x,u=Vt(n[1],o)+r.y,f=Vt(i[0],s/2),c=Vt(i[1],s/2);return{cx:l,cy:u,r0:f,r:c}}function fz(e,t,r){t.eachSeriesByType(e,function(n){var i=n.getData(),a=i.mapDimension(\"value\"),o=kx(n,r),s=Nx(n,r),l=s.cx,u=s.cy,f=s.r,c=s.r0,v=-n.get(\"startAngle\")*X0,h=n.get(\"minAngle\")*X0,d=0;i.each(a,function(D){!isNaN(D)&&d++});var p=i.getSum(a),g=Math.PI/(p||d)*2,m=n.get(\"clockwise\"),y=n.get(\"roseType\"),_=n.get(\"stillShowZeroSum\"),w=i.getDataExtent(a);w[0]=0;var S=dl,b=0,x=v,T=m?1:-1;if(i.setLayout({viewRect:o,r:f}),i.each(a,function(D,P){var A;if(isNaN(D)){i.setItemLayout(P,{angle:NaN,startAngle:NaN,endAngle:NaN,clockwise:m,cx:l,cy:u,r0:c,r:y?NaN:f});return}y!==\"area\"?A=p===0&&_?g:D*g:A=dl/d,A<h?(A=h,S-=h):b+=D;var L=x+T*A;i.setItemLayout(P,{angle:A,startAngle:x,endAngle:L,clockwise:m,cx:l,cy:u,r0:c,r:y?Rh(D,w,[c,f]):f}),x=L}),S<dl&&d)if(S<=.001){var C=dl/d;i.each(a,function(D,P){if(!isNaN(D)){var A=i.getItemLayout(P);A.angle=C,A.startAngle=v+T*P*C,A.endAngle=v+T*(P+1)*C}})}else g=S/b,x=v,i.each(a,function(D,P){if(!isNaN(D)){var A=i.getItemLayout(P),L=A.angle===h?h:D*g;A.startAngle=x,A.endAngle=x+T*L,x+=T*L}})})}function cz(e){return{seriesType:e,reset:function(t,r){var n=r.findComponents({mainType:\"legend\"});if(!(!n||!n.length)){var i=t.getData();i.filterSelf(function(a){for(var o=i.getName(a),s=0;s<n.length;s++)if(!n[s].isSelected(o))return!1;return!0})}}}}var hz=Math.PI/180;function j0(e,t,r,n,i,a,o,s,l,u){if(e.length<2)return;function f(p){for(var g=p.rB,m=g*g,y=0;y<p.list.length;y++){var _=p.list[y],w=Math.abs(_.label.y-r),S=n+_.len,b=S*S,x=Math.sqrt((1-Math.abs(w*w/m))*b),T=t+(x+_.len2)*i,C=T-_.label.x,D=_.targetTextWidth-C*i;Bx(_,D,!0),_.label.x=T}}function c(p){for(var g={list:[],maxY:0},m={list:[],maxY:0},y=0;y<p.length;y++)if(p[y].labelAlignTo===\"none\"){var _=p[y],w=_.label.y>r?m:g,S=Math.abs(_.label.y-r);if(S>=w.maxY){var b=_.label.x-t-_.len2*i,x=n+_.len,T=Math.abs(b)<x?Math.sqrt(S*S/(1-b*b/x/x)):x;w.rB=T,w.maxY=S}w.list.push(_)}f(g),f(m)}for(var v=e.length,h=0;h<v;h++)if(e[h].position===\"outer\"&&e[h].labelAlignTo===\"labelLine\"){var d=e[h].label.x-u;e[h].linePoints[1][0]+=d,e[h].label.x=u}kB(e,l,l+o)&&c(e)}function vz(e,t,r,n,i,a,o,s){for(var l=[],u=[],f=Number.MAX_VALUE,c=-Number.MAX_VALUE,v=0;v<e.length;v++){var h=e[v].label;zc(e[v])||(h.x<t?(f=Math.min(f,h.x),l.push(e[v])):(c=Math.max(c,h.x),u.push(e[v])))}for(var v=0;v<e.length;v++){var d=e[v];if(!zc(d)&&d.linePoints){if(d.labelStyleWidth!=null)continue;var h=d.label,p=d.linePoints,g=void 0;d.labelAlignTo===\"edge\"?h.x<t?g=p[2][0]-d.labelDistance-o-d.edgeDistance:g=o+i-d.edgeDistance-p[2][0]-d.labelDistance:d.labelAlignTo===\"labelLine\"?h.x<t?g=f-o-d.bleedMargin:g=o+i-c-d.bleedMargin:h.x<t?g=h.x-o-d.bleedMargin:g=o+i-h.x-d.bleedMargin,d.targetTextWidth=g,Bx(d,g)}}j0(u,t,r,n,1,i,a,o,s,c),j0(l,t,r,n,-1,i,a,o,s,f);for(var v=0;v<e.length;v++){var d=e[v];if(!zc(d)&&d.linePoints){var h=d.label,p=d.linePoints,m=d.labelAlignTo===\"edge\",y=h.style.padding,_=y?y[1]+y[3]:0,w=h.style.backgroundColor?0:_,S=d.rect.width+w,b=p[1][0]-p[2][0];m?h.x<t?p[2][0]=o+d.edgeDistance+S+d.labelDistance:p[2][0]=o+i-d.edgeDistance-S-d.labelDistance:(h.x<t?p[2][0]=h.x+d.labelDistance:p[2][0]=h.x-d.labelDistance,p[1][0]=p[2][0]+b),p[1][1]=p[2][1]=h.y}}}function Bx(e,t,r){if(r===void 0&&(r=!1),e.labelStyleWidth==null){var n=e.label,i=n.style,a=e.rect,o=i.backgroundColor,s=i.padding,l=s?s[1]+s[3]:0,u=i.overflow,f=a.width+(o?0:l);if(t<f||r){var c=a.height;if(u&&u.match(\"break\")){n.setStyle(\"backgroundColor\",null),n.setStyle(\"width\",t-l);var v=n.getBoundingRect();n.setStyle(\"width\",Math.ceil(v.width)),n.setStyle(\"backgroundColor\",o)}else{var h=t-l,d=t<f?h:r?h>e.unconstrainedWidth?null:h:null;n.setStyle(\"width\",d)}var p=n.getBoundingRect();a.width=p.width;var g=(n.style.margin||0)+2.1;a.height=p.height+g,a.y-=(a.height-c)/2}}}function zc(e){return e.position===\"center\"}function dz(e){var t=e.getData(),r=[],n,i,a=!1,o=(e.get(\"minShowLabelAngle\")||0)*hz,s=t.getLayout(\"viewRect\"),l=t.getLayout(\"r\"),u=s.width,f=s.x,c=s.y,v=s.height;function h(b){b.ignore=!0}function d(b){if(!b.ignore)return!0;for(var x in b.states)if(b.states[x].ignore===!1)return!0;return!1}t.each(function(b){var x=t.getItemGraphicEl(b),T=x.shape,C=x.getTextContent(),D=x.getTextGuideLine(),P=t.getItemModel(b),A=P.getModel(\"label\"),L=A.get(\"position\")||P.get([\"emphasis\",\"label\",\"position\"]),O=A.get(\"distanceToLabelLine\"),z=A.get(\"alignTo\"),N=Vt(A.get(\"edgeDistance\"),u),tt=A.get(\"bleedMargin\"),V=P.getModel(\"labelLine\"),K=V.get(\"length\");K=Vt(K,u);var lt=V.get(\"length2\");if(lt=Vt(lt,u),Math.abs(T.endAngle-T.startAngle)<o){I(C.states,h),C.ignore=!0;return}if(!!d(C)){var yt=(T.startAngle+T.endAngle)/2,ut=Math.cos(yt),ht=Math.sin(yt),bt,k,G,$;n=T.cx,i=T.cy;var Q=L===\"inside\"||L===\"inner\";if(L===\"center\")bt=T.cx,k=T.cy,$=\"center\";else{var vt=(Q?(T.r+T.r0)/2*ut:T.r*ut)+n,ft=(Q?(T.r+T.r0)/2*ht:T.r*ht)+i;if(bt=vt+ut*3,k=ft+ht*3,!Q){var X=vt+ut*(K+l-T.r),j=ft+ht*(K+l-T.r),M=X+(ut<0?-1:1)*lt,E=j;z===\"edge\"?bt=ut<0?f+N:f+u-N:bt=M+(ut<0?-O:O),k=E,G=[[vt,ft],[X,j],[M,E]]}$=Q?\"center\":z===\"edge\"?ut>0?\"right\":\"left\":ut>0?\"left\":\"right\"}var R=Math.PI,B=0,F=A.get(\"rotate\");if(zt(F))B=F*(R/180);else if(L===\"center\")B=0;else if(F===\"radial\"||F===!0){var q=ut<0?-yt+R:-yt;B=q}else if(F===\"tangential\"&&L!==\"outside\"&&L!==\"outer\"){var Z=Math.atan2(ut,ht);Z<0&&(Z=R*2+Z);var U=ht>0;U&&(Z=R+Z),B=Z-R}if(a=!!B,C.x=bt,C.y=k,C.rotation=B,C.setStyle({verticalAlign:\"middle\"}),Q){C.setStyle({align:$});var nt=C.states.select;nt&&(nt.x+=C.x,nt.y+=C.y)}else{var W=C.getBoundingRect().clone();W.applyTransform(C.getComputedTransform());var H=(C.style.margin||0)+2.1;W.y-=H/2,W.height+=H,r.push({label:C,labelLine:D,position:L,len:K,len2:lt,minTurnAngle:V.get(\"minTurnAngle\"),maxSurfaceAngle:V.get(\"maxSurfaceAngle\"),surfaceNormal:new pt(ut,ht),linePoints:G,textAlign:$,labelDistance:O,labelAlignTo:z,edgeDistance:N,bleedMargin:tt,rect:W,unconstrainedWidth:W.width,labelStyleWidth:C.style.width})}x.setTextConfig({inside:Q})}}),!a&&e.get(\"avoidLabelOverlap\")&&vz(r,n,i,l,u,v,f,c);for(var p=0;p<r.length;p++){var g=r[p],m=g.label,y=g.labelLine,_=isNaN(m.x)||isNaN(m.y);if(m){m.setStyle({align:g.textAlign}),_&&(I(m.states,h),m.ignore=!0);var w=m.states.select;w&&(w.x+=m.x,w.y+=m.y)}if(y){var S=g.linePoints;_||!S?(I(y.states,h),y.ignore=!0):(DB(S,g.minTurnAngle),PB(S,g.surfaceNormal,g.maxSurfaceAngle),y.setShape({points:S}),m.__hostTarget.textGuideLineConfig={anchor:new pt(S[0][0],S[0][1])})}}}function pl(e,t,r){var n=e.get(\"borderRadius\");if(n==null)return r?{cornerRadius:0}:null;et(n)||(n=[n,n,n,n]);var i=Math.abs(t.r||0-t.r0||0);return{cornerRadius:ct(n,function(a){return Rn(a,i)})}}var pz=function(e){J(t,e);function t(r,n,i){var a=e.call(this)||this;a.z2=2;var o=new he;return a.setTextContent(o),a.updateData(r,n,i,!0),a}return t.prototype.updateData=function(r,n,i,a){var o=this,s=r.hostModel,l=r.getItemModel(n),u=l.getModel(\"emphasis\"),f=r.getItemLayout(n),c=Y(pl(l.getModel(\"itemStyle\"),f,!0),f);if(isNaN(c.startAngle)){o.setShape(c);return}if(a){o.setShape(c);var v=s.getShallow(\"animationType\");s.ecModel.ssr?(An(o,{scaleX:0,scaleY:0},s,{dataIndex:n,isFrom:!0}),o.originX=c.cx,o.originY=c.cy):v===\"scale\"?(o.shape.r=f.r0,An(o,{shape:{r:f.r}},s,n)):i!=null?(o.setShape({startAngle:i,endAngle:i}),An(o,{shape:{startAngle:f.startAngle,endAngle:f.endAngle}},s,n)):(o.shape.endAngle=f.startAngle,Dr(o,{shape:{endAngle:f.endAngle}},s,n))}else ub(o),Dr(o,{shape:c},s,n);o.useStyle(r.getItemVisual(n,\"style\")),Vh(o,l);var h=(f.startAngle+f.endAngle)/2,d=s.get(\"selectedOffset\"),p=Math.cos(h)*d,g=Math.sin(h)*d,m=l.getShallow(\"cursor\");m&&o.attr(\"cursor\",m),this._updateLabel(s,r,n),o.ensureState(\"emphasis\").shape=Y({r:f.r+(u.get(\"scale\")&&u.get(\"scaleSize\")||0)},pl(u.getModel(\"itemStyle\"),f)),Y(o.ensureState(\"select\"),{x:p,y:g,shape:pl(l.getModel([\"select\",\"itemStyle\"]),f)}),Y(o.ensureState(\"blur\"),{shape:pl(l.getModel([\"blur\",\"itemStyle\"]),f)});var y=o.getTextGuideLine(),_=o.getTextContent();y&&Y(y.ensureState(\"select\"),{x:p,y:g}),Y(_.ensureState(\"select\"),{x:p,y:g}),ou(this,u.get(\"focus\"),u.get(\"blurScope\"),u.get(\"disabled\"))},t.prototype._updateLabel=function(r,n,i){var a=this,o=n.getItemModel(i),s=o.getModel(\"labelLine\"),l=n.getItemVisual(i,\"style\"),u=l&&l.fill,f=l&&l.opacity;Xu(a,ju(o),{labelFetcher:n.hostModel,labelDataIndex:i,inheritColor:u,defaultOpacity:f,defaultText:r.getFormattedLabel(i,\"normal\")||n.getName(i)});var c=a.getTextContent();a.setTextConfig({position:null,rotation:null}),c.attr({z2:10});var v=r.get([\"label\",\"position\"]);if(v!==\"outside\"&&v!==\"outer\")a.removeTextGuideLine();else{var h=this.getTextGuideLine();h||(h=new Yu,this.setTextGuideLine(h)),EB(this,LB(o),{stroke:u,opacity:Do(s.get([\"lineStyle\",\"opacity\"]),f,1)})}},t}(ws),gz=function(e){J(t,e);function t(){var r=e!==null&&e.apply(this,arguments)||this;return r.ignoreLabelLineUpdate=!0,r}return t.prototype.render=function(r,n,i,a){var o=r.getData(),s=this._data,l=this.group,u;if(!s&&o.count()>0){for(var f=o.getItemLayout(0),c=1;isNaN(f&&f.startAngle)&&c<o.count();++c)f=o.getItemLayout(c);f&&(u=f.startAngle)}if(this._emptyCircleSector&&l.remove(this._emptyCircleSector),o.count()===0&&r.get(\"showEmptyCircle\")){var v=new ws({shape:Nx(r,i)});v.useStyle(r.getModel(\"emptyCircleStyle\").getItemStyle()),this._emptyCircleSector=v,l.add(v)}o.diff(s).add(function(h){var d=new pz(o,h,u);o.setItemGraphicEl(h,d),l.add(d)}).update(function(h,d){var p=s.getItemGraphicEl(d);p.updateData(o,h,u),p.off(\"click\"),l.add(p),o.setItemGraphicEl(h,p)}).remove(function(h){var d=s.getItemGraphicEl(h);lb(d,r,h)}).execute(),dz(r),r.get(\"animationTypeUpdate\")!==\"expansion\"&&(this._data=o)},t.prototype.dispose=function(){},t.prototype.containPoint=function(r,n){var i=n.getData(),a=i.getItemLayout(0);if(a){var o=r[0]-a.cx,s=r[1]-a.cy,l=Math.sqrt(o*o+s*s);return l<=a.r&&l>=a.r0}},t.type=\"pie\",t}(Gr),mz=gz;function yz(e,t,r){t=et(t)&&{coordDimensions:t}||Y({encodeDefine:e.getEncode()},t);var n=e.getSource(),i=US(n,t).dimensions,a=new GS(i,e);return a.initData(n,r),a}var _z=function(){function e(t,r){this._getDataWithEncodedVisual=t,this._getRawData=r}return e.prototype.getAllNames=function(){var t=this._getRawData();return t.mapArray(t.getName)},e.prototype.containName=function(t){var r=this._getRawData();return r.indexOfName(t)>=0},e.prototype.indexOfName=function(t){var r=this._getDataWithEncodedVisual();return r.indexOfName(t)},e.prototype.getItemVisual=function(t,r){var n=this._getDataWithEncodedVisual();return n.getItemVisual(t,r)},e}(),wz=_z,bz=function(e){J(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.init=function(r){e.prototype.init.apply(this,arguments),this.legendVisualProvider=new wz(Ft(this.getData,this),Ft(this.getRawData,this)),this._defaultLabelLine(r)},t.prototype.mergeOption=function(){e.prototype.mergeOption.apply(this,arguments)},t.prototype.getInitialData=function(){return yz(this,{coordDimensions:[\"value\"],encodeDefaulter:Xt(vR,this)})},t.prototype.getDataParams=function(r){var n=this.getData(),i=e.prototype.getDataParams.call(this,r),a=[];return n.each(n.mapDimension(\"value\"),function(o){a.push(o)}),i.percent=qI(a,r,n.hostModel.get(\"percentPrecision\")),i.$vars.push(\"percent\"),i},t.prototype._defaultLabelLine=function(r){Oh(r,\"labelLine\",[\"show\"]);var n=r.labelLine,i=r.emphasis.labelLine;n.show=n.show&&r.label.show,i.show=i.show&&r.emphasis.label.show},t.type=\"series.pie\",t.defaultOption={z:2,legendHoverLink:!0,colorBy:\"data\",center:[\"50%\",\"50%\"],radius:[0,\"75%\"],clockwise:!0,startAngle:90,minAngle:0,minShowLabelAngle:0,selectedOffset:10,percentPrecision:2,stillShowZeroSum:!0,left:0,top:0,right:0,bottom:0,width:null,height:null,label:{rotate:0,show:!0,overflow:\"truncate\",position:\"outer\",alignTo:\"none\",edgeDistance:\"25%\",bleedMargin:10,distanceToLabelLine:5},labelLine:{show:!0,length:15,length2:15,smooth:!1,minTurnAngle:90,maxSurfaceAngle:90,lineStyle:{width:1,type:\"solid\"}},itemStyle:{borderWidth:1,borderJoin:\"round\"},showEmptyCircle:!0,emptyCircleStyle:{color:\"lightgray\",opacity:1},labelLayout:{hideOverlap:!0},emphasis:{scale:!0,scaleSize:5},avoidLabelOverlap:!0,animationType:\"expansion\",animationDuration:1e3,animationTypeUpdate:\"transition\",animationEasingUpdate:\"cubicInOut\",animationDurationUpdate:500,animationEasing:\"cubicInOut\"},t}(Pa),Sz=bz;function xz(e){return{seriesType:e,reset:function(t,r){var n=t.getData();n.filterSelf(function(i){var a=n.mapDimension(\"value\"),o=n.get(a,i);return!(zt(o)&&!isNaN(o)&&o<0)})}}}function cH(e){e.registerChartView(mz),e.registerSeriesModel(Sz),tk(\"pie\",e.registerAction),e.registerLayout(Xt(fz,\"pie\")),e.registerProcessor(cz(\"pie\")),e.registerProcessor(xz(\"pie\"))}function K0(e,t,r){var n=Pi.createCanvas(),i=t.getWidth(),a=t.getHeight(),o=n.style;return o&&(o.position=\"absolute\",o.left=\"0\",o.top=\"0\",o.width=i+\"px\",o.height=a+\"px\",n.setAttribute(\"data-zr-dom-id\",e)),n.width=i*r,n.height=a*r,n}var Tz=function(e){J(t,e);function t(r,n,i){var a=e.call(this)||this;a.motionBlur=!1,a.lastFrameAlpha=.7,a.dpr=1,a.virtual=!1,a.config={},a.incremental=!1,a.zlevel=0,a.maxRepaintRectCount=5,a.__dirty=!0,a.__firstTimePaint=!0,a.__used=!1,a.__drawIndex=0,a.__startIndex=0,a.__endIndex=0,a.__prevStartIndex=null,a.__prevEndIndex=null;var o;i=i||tu,typeof r==\"string\"?o=K0(r,n,i):st(r)&&(o=r,r=o.id),a.id=r,a.dom=o;var s=o.style;return s&&(H1(o),o.onselectstart=function(){return!1},s.padding=\"0\",s.margin=\"0\",s.borderWidth=\"0\"),a.painter=n,a.dpr=i,a}return t.prototype.getElementCount=function(){return this.__endIndex-this.__startIndex},t.prototype.afterBrush=function(){this.__prevStartIndex=this.__startIndex,this.__prevEndIndex=this.__endIndex},t.prototype.initContext=function(){this.ctx=this.dom.getContext(\"2d\"),this.ctx.dpr=this.dpr},t.prototype.setUnpainted=function(){this.__firstTimePaint=!0},t.prototype.createBackBuffer=function(){var r=this.dpr;this.domBack=K0(\"back-\"+this.id,this.painter,r),this.ctxBack=this.domBack.getContext(\"2d\"),r!==1&&this.ctxBack.scale(r,r)},t.prototype.createRepaintRects=function(r,n,i,a){if(this.__firstTimePaint)return this.__firstTimePaint=!1,null;var o=[],s=this.maxRepaintRectCount,l=!1,u=new Ot(0,0,0,0);function f(y){if(!(!y.isFinite()||y.isZero()))if(o.length===0){var _=new Ot(0,0,0,0);_.copy(y),o.push(_)}else{for(var w=!1,S=1/0,b=0,x=0;x<o.length;++x){var T=o[x];if(T.intersect(y)){var C=new Ot(0,0,0,0);C.copy(T),C.union(y),o[x]=C,w=!0;break}else if(l){u.copy(y),u.union(T);var D=y.width*y.height,P=T.width*T.height,A=u.width*u.height,L=A-D-P;L<S&&(S=L,b=x)}}if(l&&(o[b].union(y),w=!0),!w){var _=new Ot(0,0,0,0);_.copy(y),o.push(_)}l||(l=o.length>=s)}}for(var c=this.__startIndex;c<this.__endIndex;++c){var v=r[c];if(v){var h=v.shouldBePainted(i,a,!0,!0),d=v.__isRendered&&(v.__dirty&Le||!h)?v.getPrevPaintRect():null;d&&f(d);var p=h&&(v.__dirty&Le||!v.__isRendered)?v.getPaintRect():null;p&&f(p)}}for(var c=this.__prevStartIndex;c<this.__prevEndIndex;++c){var v=n[c],h=v.shouldBePainted(i,a,!0,!0);if(v&&(!h||!v.__zr)&&v.__isRendered){var d=v.getPrevPaintRect();d&&f(d)}}var g;do{g=!1;for(var c=0;c<o.length;){if(o[c].isZero()){o.splice(c,1);continue}for(var m=c+1;m<o.length;)o[c].intersect(o[m])?(g=!0,o[c].union(o[m]),o.splice(m,1)):m++;c++}}while(g);return this._paintRects=o,o},t.prototype.debugGetPaintRects=function(){return(this._paintRects||[]).slice()},t.prototype.resize=function(r,n){var i=this.dpr,a=this.dom,o=a.style,s=this.domBack;o&&(o.width=r+\"px\",o.height=n+\"px\"),a.width=r*i,a.height=n*i,s&&(s.width=r*i,s.height=n*i,i!==1&&this.ctxBack.scale(i,i))},t.prototype.clear=function(r,n,i){var a=this.dom,o=this.ctx,s=a.width,l=a.height;n=n||this.clearColor;var u=this.motionBlur&&!r,f=this.lastFrameAlpha,c=this.dpr,v=this;u&&(this.domBack||this.createBackBuffer(),this.ctxBack.globalCompositeOperation=\"copy\",this.ctxBack.drawImage(a,0,0,s/c,l/c));var h=this.domBack;function d(p,g,m,y){if(o.clearRect(p,g,m,y),n&&n!==\"transparent\"){var _=void 0;Bu(n)?(_=n.__canvasGradient||rv(o,n,{x:0,y:0,width:m,height:y}),n.__canvasGradient=_):yP(n)&&(_=nv(o,n,{dirty:function(){v.setUnpainted(),v.__painter.refresh()}})),o.save(),o.fillStyle=_||n,o.fillRect(p,g,m,y),o.restore()}u&&(o.save(),o.globalAlpha=f,o.drawImage(h,p,g,m,y),o.restore())}!i||u?d(0,0,s,l):i.length&&I(i,function(p){d(p.x*c,p.y*c,p.width*c,p.height*c)})},t}(Ir),Hc=Tz,Z0=1e5,si=314159,gl=.01,Cz=.001;function Mz(e){return e?e.__builtin__?!0:!(typeof e.resize!=\"function\"||typeof e.refresh!=\"function\"):!1}function Az(e,t){var r=document.createElement(\"div\");return r.style.cssText=[\"position:relative\",\"width:\"+e+\"px\",\"height:\"+t+\"px\",\"padding:0\",\"margin:0\",\"border-width:0\"].join(\";\")+\";\",r}var Dz=function(){function e(t,r,n,i){this.type=\"canvas\",this._zlevelList=[],this._prevDisplayList=[],this._layers={},this._layerConfig={},this._needsManuallyCompositing=!1,this.type=\"canvas\";var a=!t.nodeName||t.nodeName.toUpperCase()===\"CANVAS\";this._opts=n=Y({},n||{}),this.dpr=n.devicePixelRatio||tu,this._singleCanvas=a,this.root=t;var o=t.style;o&&(H1(t),t.innerHTML=\"\"),this.storage=r;var s=this._zlevelList;this._prevDisplayList=[];var l=this._layers;if(a){var f=t,c=f.width,v=f.height;n.width!=null&&(c=n.width),n.height!=null&&(v=n.height),this.dpr=n.devicePixelRatio||1,f.width=c*this.dpr,f.height=v*this.dpr,this._width=c,this._height=v;var h=new Hc(f,this,this.dpr);h.__builtin__=!0,h.initContext(),l[si]=h,h.zlevel=si,s.push(si),this._domRoot=t}else{this._width=il(t,0,n),this._height=il(t,1,n);var u=this._domRoot=Az(this._width,this._height);t.appendChild(u)}}return e.prototype.getType=function(){return\"canvas\"},e.prototype.isSingleCanvas=function(){return this._singleCanvas},e.prototype.getViewportRoot=function(){return this._domRoot},e.prototype.getViewportRootOffset=function(){var t=this.getViewportRoot();if(t)return{offsetLeft:t.offsetLeft||0,offsetTop:t.offsetTop||0}},e.prototype.refresh=function(t){var r=this.storage.getDisplayList(!0),n=this._prevDisplayList,i=this._zlevelList;this._redrawId=Math.random(),this._paintList(r,n,t,this._redrawId);for(var a=0;a<i.length;a++){var o=i[a],s=this._layers[o];if(!s.__builtin__&&s.refresh){var l=a===0?this._backgroundColor:null;s.refresh(l)}}return this._opts.useDirtyRect&&(this._prevDisplayList=r.slice()),this},e.prototype.refreshHover=function(){this._paintHoverList(this.storage.getDisplayList(!1))},e.prototype._paintHoverList=function(t){var r=t.length,n=this._hoverlayer;if(n&&n.clear(),!!r){for(var i={inHover:!0,viewWidth:this._width,viewHeight:this._height},a,o=0;o<r;o++){var s=t[o];s.__inHover&&(n||(n=this._hoverlayer=this.getLayer(Z0)),a||(a=n.ctx,a.save()),di(a,s,i,o===r-1))}a&&a.restore()}},e.prototype.getHoverLayer=function(){return this.getLayer(Z0)},e.prototype.paintOne=function(t,r){yS(t,r)},e.prototype._paintList=function(t,r,n,i){if(this._redrawId===i){n=n||!1,this._updateLayerStatus(t);var a=this._doPaintList(t,r,n),o=a.finished,s=a.needsRefreshHover;if(this._needsManuallyCompositing&&this._compositeManually(),s&&this._paintHoverList(t),o)this.eachLayer(function(u){u.afterBrush&&u.afterBrush()});else{var l=this;bh(function(){l._paintList(t,r,n,i)})}}},e.prototype._compositeManually=function(){var t=this.getLayer(si).ctx,r=this._domRoot.width,n=this._domRoot.height;t.clearRect(0,0,r,n),this.eachBuiltinLayer(function(i){i.virtual&&t.drawImage(i.dom,0,0,r,n)})},e.prototype._doPaintList=function(t,r,n){for(var i=this,a=[],o=this._opts.useDirtyRect,s=0;s<this._zlevelList.length;s++){var l=this._zlevelList[s],u=this._layers[l];u.__builtin__&&u!==this._hoverlayer&&(u.__dirty||n)&&a.push(u)}for(var f=!0,c=!1,v=function(p){var g=a[p],m=g.ctx,y=o&&g.createRepaintRects(t,r,h._width,h._height),_=n?g.__startIndex:g.__drawIndex,w=!n&&g.incremental&&Date.now,S=w&&Date.now(),b=g.zlevel===h._zlevelList[0]?h._backgroundColor:null;if(g.__startIndex===g.__endIndex)g.clear(!1,b,y);else if(_===g.__startIndex){var x=t[_];(!x.incremental||!x.notClear||n)&&g.clear(!1,b,y)}_===-1&&(console.error(\"For some unknown reason. drawIndex is -1\"),_=g.__startIndex);var T,C=function(L){var O={inHover:!1,allClipped:!1,prevEl:null,viewWidth:i._width,viewHeight:i._height};for(T=_;T<g.__endIndex;T++){var z=t[T];if(z.__inHover&&(c=!0),i._doPaintEl(z,g,o,L,O,T===g.__endIndex-1),w){var N=Date.now()-S;if(N>15)break}}O.prevElClipPaths&&m.restore()};if(y)if(y.length===0)T=g.__endIndex;else for(var D=h.dpr,P=0;P<y.length;++P){var A=y[P];m.save(),m.beginPath(),m.rect(A.x*D,A.y*D,A.width*D,A.height*D),m.clip(),C(A),m.restore()}else m.save(),C(),m.restore();g.__drawIndex=T,g.__drawIndex<g.__endIndex&&(f=!1)},h=this,d=0;d<a.length;d++)v(d);return wt.wxa&&I(this._layers,function(p){p&&p.ctx&&p.ctx.draw&&p.ctx.draw()}),{finished:f,needsRefreshHover:c}},e.prototype._doPaintEl=function(t,r,n,i,a,o){var s=r.ctx;if(n){var l=t.getPaintRect();(!i||l&&l.intersect(i))&&(di(s,t,a,o),t.setPrevPaintRect(l))}else di(s,t,a,o)},e.prototype.getLayer=function(t,r){this._singleCanvas&&!this._needsManuallyCompositing&&(t=si);var n=this._layers[t];return n||(n=new Hc(\"zr_\"+t,this,this.dpr),n.zlevel=t,n.__builtin__=!0,this._layerConfig[t]?Dt(n,this._layerConfig[t],!0):this._layerConfig[t-gl]&&Dt(n,this._layerConfig[t-gl],!0),r&&(n.virtual=r),this.insertLayer(t,n),n.initContext()),n},e.prototype.insertLayer=function(t,r){var n=this._layers,i=this._zlevelList,a=i.length,o=this._domRoot,s=null,l=-1;if(!n[t]&&!!Mz(r)){if(a>0&&t>i[0]){for(l=0;l<a-1&&!(i[l]<t&&i[l+1]>t);l++);s=n[i[l]]}if(i.splice(l+1,0,t),n[t]=r,!r.virtual)if(s){var u=s.dom;u.nextSibling?o.insertBefore(r.dom,u.nextSibling):o.appendChild(r.dom)}else o.firstChild?o.insertBefore(r.dom,o.firstChild):o.appendChild(r.dom);r.__painter=this}},e.prototype.eachLayer=function(t,r){for(var n=this._zlevelList,i=0;i<n.length;i++){var a=n[i];t.call(r,this._layers[a],a)}},e.prototype.eachBuiltinLayer=function(t,r){for(var n=this._zlevelList,i=0;i<n.length;i++){var a=n[i],o=this._layers[a];o.__builtin__&&t.call(r,o,a)}},e.prototype.eachOtherLayer=function(t,r){for(var n=this._zlevelList,i=0;i<n.length;i++){var a=n[i],o=this._layers[a];o.__builtin__||t.call(r,o,a)}},e.prototype.getLayers=function(){return this._layers},e.prototype._updateLayerStatus=function(t){this.eachBuiltinLayer(function(c,v){c.__dirty=c.__used=!1});function r(c){a&&(a.__endIndex!==c&&(a.__dirty=!0),a.__endIndex=c)}if(this._singleCanvas)for(var n=1;n<t.length;n++){var i=t[n];if(i.zlevel!==t[n-1].zlevel||i.incremental){this._needsManuallyCompositing=!0;break}}var a=null,o=0,s,l;for(l=0;l<t.length;l++){var i=t[l],u=i.zlevel,f=void 0;s!==u&&(s=u,o=0),i.incremental?(f=this.getLayer(u+Cz,this._needsManuallyCompositing),f.incremental=!0,o=1):f=this.getLayer(u+(o>0?gl:0),this._needsManuallyCompositing),f.__builtin__||ld(\"ZLevel \"+u+\" has been used by unkown layer \"+f.id),f!==a&&(f.__used=!0,f.__startIndex!==l&&(f.__dirty=!0),f.__startIndex=l,f.incremental?f.__drawIndex=-1:f.__drawIndex=l,r(l),a=f),i.__dirty&Le&&!i.__inHover&&(f.__dirty=!0,f.incremental&&f.__drawIndex<0&&(f.__drawIndex=l))}r(l),this.eachBuiltinLayer(function(c,v){!c.__used&&c.getElementCount()>0&&(c.__dirty=!0,c.__startIndex=c.__endIndex=c.__drawIndex=0),c.__dirty&&c.__drawIndex<0&&(c.__drawIndex=c.__startIndex)})},e.prototype.clear=function(){return this.eachBuiltinLayer(this._clearLayer),this},e.prototype._clearLayer=function(t){t.clear()},e.prototype.setBackgroundColor=function(t){this._backgroundColor=t,I(this._layers,function(r){r.setUnpainted()})},e.prototype.configLayer=function(t,r){if(r){var n=this._layerConfig;n[t]?Dt(n[t],r,!0):n[t]=r;for(var i=0;i<this._zlevelList.length;i++){var a=this._zlevelList[i];if(a===t||a===t+gl){var o=this._layers[a];Dt(o,n[t],!0)}}}},e.prototype.delLayer=function(t){var r=this._layers,n=this._zlevelList,i=r[t];!i||(i.dom.parentNode.removeChild(i.dom),delete r[t],n.splice(It(n,t),1))},e.prototype.resize=function(t,r){if(this._domRoot.style){var n=this._domRoot;n.style.display=\"none\";var i=this._opts,a=this.root;if(t!=null&&(i.width=t),r!=null&&(i.height=r),t=il(a,0,i),r=il(a,1,i),n.style.display=\"\",this._width!==t||r!==this._height){n.style.width=t+\"px\",n.style.height=r+\"px\";for(var o in this._layers)this._layers.hasOwnProperty(o)&&this._layers[o].resize(t,r);this.refresh(!0)}this._width=t,this._height=r}else{if(t==null||r==null)return;this._width=t,this._height=r,this.getLayer(si).resize(t,r)}return this},e.prototype.clearLayer=function(t){var r=this._layers[t];r&&r.clear()},e.prototype.dispose=function(){this.root.innerHTML=\"\",this.root=this.storage=this._domRoot=this._layers=null},e.prototype.getRenderedCanvas=function(t){if(t=t||{},this._singleCanvas&&!this._compositeManually)return this._layers[si].dom;var r=new Hc(\"image\",this,t.pixelRatio||this.dpr);r.initContext(),r.clear(!1,t.backgroundColor||this._backgroundColor);var n=r.ctx;if(t.pixelRatio<=this.dpr){this.refresh();var i=r.dom.width,a=r.dom.height;this.eachLayer(function(c){c.__builtin__?n.drawImage(c.dom,0,0,i,a):c.renderToCanvas&&(n.save(),c.renderToCanvas(n),n.restore())})}else for(var o={inHover:!1,viewWidth:this._width,viewHeight:this._height},s=this.storage.getDisplayList(!0),l=0,u=s.length;l<u;l++){var f=s[l];di(n,f,o,l===u-1)}return r.dom},e.prototype.getWidth=function(){return this._width},e.prototype.getHeight=function(){return this._height},e}(),Pz=Dz;function hH(e){e.registerPainter(\"canvas\",Pz)}var Fx={exports:{}};(function(e){(function(t){const r=\"(0?\\\\d+|0x[a-f0-9]+)\",n={fourOctet:new RegExp(`^${r}\\\\.${r}\\\\.${r}\\\\.${r}$`,\"i\"),threeOctet:new RegExp(`^${r}\\\\.${r}\\\\.${r}$`,\"i\"),twoOctet:new RegExp(`^${r}\\\\.${r}$`,\"i\"),longValue:new RegExp(`^${r}$`,\"i\")},i=new RegExp(\"^0[0-7]+$\",\"i\"),a=new RegExp(\"^0x[a-f0-9]+$\",\"i\"),o=\"%[0-9a-z]{1,}\",s=\"(?:[0-9a-f]+::?)+\",l={zoneIndex:new RegExp(o,\"i\"),native:new RegExp(`^(::)?(${s})?([0-9a-f]+)?(::)?(${o})?$`,\"i\"),deprecatedTransitional:new RegExp(`^(?:::)(${r}\\\\.${r}\\\\.${r}\\\\.${r}(${o})?)$`,\"i\"),transitional:new RegExp(`^((?:${s})|(?:::)(?:${s})?)${r}\\\\.${r}\\\\.${r}\\\\.${r}(${o})?$`,\"i\")};function u(d,p){if(d.indexOf(\"::\")!==d.lastIndexOf(\"::\"))return null;let g=0,m=-1,y=(d.match(l.zoneIndex)||[])[0],_,w;for(y&&(y=y.substring(1),d=d.replace(/%.+$/,\"\"));(m=d.indexOf(\":\",m+1))>=0;)g++;if(d.substr(0,2)===\"::\"&&g--,d.substr(-2,2)===\"::\"&&g--,g>p)return null;for(w=p-g,_=\":\";w--;)_+=\"0:\";return d=d.replace(\"::\",_),d[0]===\":\"&&(d=d.slice(1)),d[d.length-1]===\":\"&&(d=d.slice(0,-1)),p=function(){const S=d.split(\":\"),b=[];for(let x=0;x<S.length;x++)b.push(parseInt(S[x],16));return b}(),{parts:p,zoneId:y}}function f(d,p,g,m){if(d.length!==p.length)throw new Error(\"ipaddr: cannot match CIDR for objects with different lengths\");let y=0,_;for(;m>0;){if(_=g-m,_<0&&(_=0),d[y]>>_!==p[y]>>_)return!1;m-=g,y+=1}return!0}function c(d){if(a.test(d))return parseInt(d,16);if(d[0]===\"0\"&&!isNaN(parseInt(d[1],10))){if(i.test(d))return parseInt(d,8);throw new Error(`ipaddr: cannot parse ${d} as octal`)}return parseInt(d,10)}function v(d,p){for(;d.length<p;)d=`0${d}`;return d}const h={};h.IPv4=function(){function d(p){if(p.length!==4)throw new Error(\"ipaddr: ipv4 octet count should be 4\");let g,m;for(g=0;g<p.length;g++)if(m=p[g],!(0<=m&&m<=255))throw new Error(\"ipaddr: ipv4 octet should fit in 8 bits\");this.octets=p}return d.prototype.SpecialRanges={unspecified:[[new d([0,0,0,0]),8]],broadcast:[[new d([255,255,255,255]),32]],multicast:[[new d([224,0,0,0]),4]],linkLocal:[[new d([169,254,0,0]),16]],loopback:[[new d([127,0,0,0]),8]],carrierGradeNat:[[new d([100,64,0,0]),10]],private:[[new d([10,0,0,0]),8],[new d([172,16,0,0]),12],[new d([192,168,0,0]),16]],reserved:[[new d([192,0,0,0]),24],[new d([192,0,2,0]),24],[new d([192,88,99,0]),24],[new d([198,51,100,0]),24],[new d([203,0,113,0]),24],[new d([240,0,0,0]),4]]},d.prototype.kind=function(){return\"ipv4\"},d.prototype.match=function(p,g){let m;if(g===void 0&&(m=p,p=m[0],g=m[1]),p.kind()!==\"ipv4\")throw new Error(\"ipaddr: cannot match ipv4 address with non-ipv4 one\");return f(this.octets,p.octets,8,g)},d.prototype.prefixLengthFromSubnetMask=function(){let p=0,g=!1;const m={0:8,128:7,192:6,224:5,240:4,248:3,252:2,254:1,255:0};let y,_,w;for(y=3;y>=0;y-=1)if(_=this.octets[y],_ in m){if(w=m[_],g&&w!==0)return null;w!==8&&(g=!0),p+=w}else return null;return 32-p},d.prototype.range=function(){return h.subnetMatch(this,this.SpecialRanges)},d.prototype.toByteArray=function(){return this.octets.slice(0)},d.prototype.toIPv4MappedAddress=function(){return h.IPv6.parse(`::ffff:${this.toString()}`)},d.prototype.toNormalizedString=function(){return this.toString()},d.prototype.toString=function(){return this.octets.join(\".\")},d}(),h.IPv4.broadcastAddressFromCIDR=function(d){try{const p=this.parseCIDR(d),g=p[0].toByteArray(),m=this.subnetMaskFromPrefixLength(p[1]).toByteArray(),y=[];let _=0;for(;_<4;)y.push(parseInt(g[_],10)|parseInt(m[_],10)^255),_++;return new this(y)}catch(p){throw new Error(\"ipaddr: the address does not have IPv4 CIDR format\")}},h.IPv4.isIPv4=function(d){return this.parser(d)!==null},h.IPv4.isValid=function(d){try{return new this(this.parser(d)),!0}catch(p){return!1}},h.IPv4.isValidFourPartDecimal=function(d){return!!(h.IPv4.isValid(d)&&d.match(/^(0|[1-9]\\d*)(\\.(0|[1-9]\\d*)){3}$/))},h.IPv4.networkAddressFromCIDR=function(d){let p,g,m,y,_;try{for(p=this.parseCIDR(d),m=p[0].toByteArray(),_=this.subnetMaskFromPrefixLength(p[1]).toByteArray(),y=[],g=0;g<4;)y.push(parseInt(m[g],10)&parseInt(_[g],10)),g++;return new this(y)}catch(w){throw new Error(\"ipaddr: the address does not have IPv4 CIDR format\")}},h.IPv4.parse=function(d){const p=this.parser(d);if(p===null)throw new Error(\"ipaddr: string is not formatted like an IPv4 Address\");return new this(p)},h.IPv4.parseCIDR=function(d){let p;if(p=d.match(/^(.+)\\/(\\d+)$/)){const g=parseInt(p[2]);if(g>=0&&g<=32){const m=[this.parse(p[1]),g];return Object.defineProperty(m,\"toString\",{value:function(){return this.join(\"/\")}}),m}}throw new Error(\"ipaddr: string is not formatted like an IPv4 CIDR range\")},h.IPv4.parser=function(d){let p,g,m;if(p=d.match(n.fourOctet))return function(){const y=p.slice(1,6),_=[];for(let w=0;w<y.length;w++)g=y[w],_.push(c(g));return _}();if(p=d.match(n.longValue)){if(m=c(p[1]),m>4294967295||m<0)throw new Error(\"ipaddr: address outside defined range\");return function(){const y=[];let _;for(_=0;_<=24;_+=8)y.push(m>>_&255);return y}().reverse()}else return(p=d.match(n.twoOctet))?function(){const y=p.slice(1,4),_=[];if(m=c(y[1]),m>16777215||m<0)throw new Error(\"ipaddr: address outside defined range\");return _.push(c(y[0])),_.push(m>>16&255),_.push(m>>8&255),_.push(m&255),_}():(p=d.match(n.threeOctet))?function(){const y=p.slice(1,5),_=[];if(m=c(y[2]),m>65535||m<0)throw new Error(\"ipaddr: address outside defined range\");return _.push(c(y[0])),_.push(c(y[1])),_.push(m>>8&255),_.push(m&255),_}():null},h.IPv4.subnetMaskFromPrefixLength=function(d){if(d=parseInt(d),d<0||d>32)throw new Error(\"ipaddr: invalid IPv4 prefix length\");const p=[0,0,0,0];let g=0;const m=Math.floor(d/8);for(;g<m;)p[g]=255,g++;return m<4&&(p[m]=Math.pow(2,d%8)-1<<8-d%8),new this(p)},h.IPv6=function(){function d(p,g){let m,y;if(p.length===16)for(this.parts=[],m=0;m<=14;m+=2)this.parts.push(p[m]<<8|p[m+1]);else if(p.length===8)this.parts=p;else throw new Error(\"ipaddr: ipv6 part count should be 8 or 16\");for(m=0;m<this.parts.length;m++)if(y=this.parts[m],!(0<=y&&y<=65535))throw new Error(\"ipaddr: ipv6 part should fit in 16 bits\");g&&(this.zoneId=g)}return d.prototype.SpecialRanges={unspecified:[new d([0,0,0,0,0,0,0,0]),128],linkLocal:[new d([65152,0,0,0,0,0,0,0]),10],multicast:[new d([65280,0,0,0,0,0,0,0]),8],loopback:[new d([0,0,0,0,0,0,0,1]),128],uniqueLocal:[new d([64512,0,0,0,0,0,0,0]),7],ipv4Mapped:[new d([0,0,0,0,0,65535,0,0]),96],rfc6145:[new d([0,0,0,0,65535,0,0,0]),96],rfc6052:[new d([100,65435,0,0,0,0,0,0]),96],\"6to4\":[new d([8194,0,0,0,0,0,0,0]),16],teredo:[new d([8193,0,0,0,0,0,0,0]),32],reserved:[[new d([8193,3512,0,0,0,0,0,0]),32]]},d.prototype.isIPv4MappedAddress=function(){return this.range()===\"ipv4Mapped\"},d.prototype.kind=function(){return\"ipv6\"},d.prototype.match=function(p,g){let m;if(g===void 0&&(m=p,p=m[0],g=m[1]),p.kind()!==\"ipv6\")throw new Error(\"ipaddr: cannot match ipv6 address with non-ipv6 one\");return f(this.parts,p.parts,16,g)},d.prototype.prefixLengthFromSubnetMask=function(){let p=0,g=!1;const m={0:16,32768:15,49152:14,57344:13,61440:12,63488:11,64512:10,65024:9,65280:8,65408:7,65472:6,65504:5,65520:4,65528:3,65532:2,65534:1,65535:0};let y,_;for(let w=7;w>=0;w-=1)if(y=this.parts[w],y in m){if(_=m[y],g&&_!==0)return null;_!==16&&(g=!0),p+=_}else return null;return 128-p},d.prototype.range=function(){return h.subnetMatch(this,this.SpecialRanges)},d.prototype.toByteArray=function(){let p;const g=[],m=this.parts;for(let y=0;y<m.length;y++)p=m[y],g.push(p>>8),g.push(p&255);return g},d.prototype.toFixedLengthString=function(){const p=function(){const m=[];for(let y=0;y<this.parts.length;y++)m.push(v(this.parts[y].toString(16),4));return m}.call(this).join(\":\");let g=\"\";return this.zoneId&&(g=`%${this.zoneId}`),p+g},d.prototype.toIPv4Address=function(){if(!this.isIPv4MappedAddress())throw new Error(\"ipaddr: trying to convert a generic ipv6 address to ipv4\");const p=this.parts.slice(-2),g=p[0],m=p[1];return new h.IPv4([g>>8,g&255,m>>8,m&255])},d.prototype.toNormalizedString=function(){const p=function(){const m=[];for(let y=0;y<this.parts.length;y++)m.push(this.parts[y].toString(16));return m}.call(this).join(\":\");let g=\"\";return this.zoneId&&(g=`%${this.zoneId}`),p+g},d.prototype.toRFC5952String=function(){const p=/((^|:)(0(:|$)){2,})/g,g=this.toNormalizedString();let m=0,y=-1,_;for(;_=p.exec(g);)_[0].length>y&&(m=_.index,y=_[0].length);return y<0?g:`${g.substring(0,m)}::${g.substring(m+y)}`},d.prototype.toString=function(){return this.toNormalizedString().replace(/((^|:)(0(:|$))+)/,\"::\")},d}(),h.IPv6.broadcastAddressFromCIDR=function(d){try{const p=this.parseCIDR(d),g=p[0].toByteArray(),m=this.subnetMaskFromPrefixLength(p[1]).toByteArray(),y=[];let _=0;for(;_<16;)y.push(parseInt(g[_],10)|parseInt(m[_],10)^255),_++;return new this(y)}catch(p){throw new Error(`ipaddr: the address does not have IPv6 CIDR format (${p})`)}},h.IPv6.isIPv6=function(d){return this.parser(d)!==null},h.IPv6.isValid=function(d){if(typeof d==\"string\"&&d.indexOf(\":\")===-1)return!1;try{const p=this.parser(d);return new this(p.parts,p.zoneId),!0}catch(p){return!1}},h.IPv6.networkAddressFromCIDR=function(d){let p,g,m,y,_;try{for(p=this.parseCIDR(d),m=p[0].toByteArray(),_=this.subnetMaskFromPrefixLength(p[1]).toByteArray(),y=[],g=0;g<16;)y.push(parseInt(m[g],10)&parseInt(_[g],10)),g++;return new this(y)}catch(w){throw new Error(`ipaddr: the address does not have IPv6 CIDR format (${w})`)}},h.IPv6.parse=function(d){const p=this.parser(d);if(p.parts===null)throw new Error(\"ipaddr: string is not formatted like an IPv6 Address\");return new this(p.parts,p.zoneId)},h.IPv6.parseCIDR=function(d){let p,g,m;if((g=d.match(/^(.+)\\/(\\d+)$/))&&(p=parseInt(g[2]),p>=0&&p<=128))return m=[this.parse(g[1]),p],Object.defineProperty(m,\"toString\",{value:function(){return this.join(\"/\")}}),m;throw new Error(\"ipaddr: string is not formatted like an IPv6 CIDR range\")},h.IPv6.parser=function(d){let p,g,m,y,_,w;if(m=d.match(l.deprecatedTransitional))return this.parser(`::ffff:${m[1]}`);if(l.native.test(d))return u(d,8);if((m=d.match(l.transitional))&&(w=m[6]||\"\",p=u(m[1].slice(0,-1)+w,6),p.parts)){for(_=[parseInt(m[2]),parseInt(m[3]),parseInt(m[4]),parseInt(m[5])],g=0;g<_.length;g++)if(y=_[g],!(0<=y&&y<=255))return null;return p.parts.push(_[0]<<8|_[1]),p.parts.push(_[2]<<8|_[3]),{parts:p.parts,zoneId:p.zoneId}}return null},h.IPv6.subnetMaskFromPrefixLength=function(d){if(d=parseInt(d),d<0||d>128)throw new Error(\"ipaddr: invalid IPv6 prefix length\");const p=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0];let g=0;const m=Math.floor(d/8);for(;g<m;)p[g]=255,g++;return m<16&&(p[m]=Math.pow(2,d%8)-1<<8-d%8),new this(p)},h.fromByteArray=function(d){const p=d.length;if(p===4)return new h.IPv4(d);if(p===16)return new h.IPv6(d);throw new Error(\"ipaddr: the binary input is neither an IPv6 nor IPv4 address\")},h.isValid=function(d){return h.IPv6.isValid(d)||h.IPv4.isValid(d)},h.parse=function(d){if(h.IPv6.isValid(d))return h.IPv6.parse(d);if(h.IPv4.isValid(d))return h.IPv4.parse(d);throw new Error(\"ipaddr: the address has neither IPv6 nor IPv4 format\")},h.parseCIDR=function(d){try{return h.IPv6.parseCIDR(d)}catch(p){try{return h.IPv4.parseCIDR(d)}catch(g){throw new Error(\"ipaddr: the address has neither IPv6 nor IPv4 CIDR format\")}}},h.process=function(d){const p=this.parse(d);return p.kind()===\"ipv6\"&&p.isIPv4MappedAddress()?p.toIPv4Address():p},h.subnetMatch=function(d,p,g){let m,y,_,w;g==null&&(g=\"unicast\");for(y in p)if(Object.prototype.hasOwnProperty.call(p,y)){for(_=p[y],_[0]&&!(_[0]instanceof Array)&&(_=[_]),m=0;m<_.length;m++)if(w=_[m],d.kind()===w[0].kind()&&d.match.apply(d,w))return y}return g},e.exports?e.exports=h:t.ipaddr=h})(_M)})(Fx);var vH=Fx.exports;export{cH as $,Wp as A,Fz as B,Ez as C,Lz as D,O_ as E,Pe as F,Xz as G,Du as H,Yz as I,Kz as J,DC as K,Ai as L,hM as M,Ci as N,lH as O,oH as P,fH as Q,hH as R,sH as S,e1 as T,uH as U,aH as V,nH as W,PC as X,Nz as Y,vH as Z,$z as _,Zz as a,Bv as a0,Uz as a1,iH as a2,Rz as a3,jz as a4,Gz as a5,qz as a6,Je as a7,Wz as a8,_l as a9,rH as aa,eH as ab,Jz as ac,Gv as b,Qz as c,tH as d,Ee as e,Bz as f,K_ as g,zz as h,fe as i,Sv as j,Vz as k,Wt as l,X_ as m,bv as n,qv as o,FT as p,wa as q,kz as r,ha as s,Iz as t,wo as u,cM as v,Oz as w,Au as x,vM as y,Hz as z};\n"
  },
  {
    "path": "luci-app-quickstart/luasrc/controller/istore_backend.lua",
    "content": "-- Copyright 2022 xiaobao <xiaobao@linkease.com>\n-- Licensed to the public under the MIT License\n\nlocal http = require \"luci.http\"\nlocal nixio = require \"nixio\"\nlocal ltn12 = require \"luci.ltn12\"\nlocal table = require \"table\"\nlocal util = require \"luci.util\"\n\nmodule(\"luci.controller.istore_backend\", package.seeall)\n\nlocal BLOCKSIZE = 2048\nlocal ISTOREOS_PORT = 3038\n\nfunction index()\n    entry({\"istore\"}, call(\"istore_backend\")).leaf=true\nend\n\nlocal function sink_socket(sock, io_err) \n  if sock then \n    return function(chunk, err) \n      if not chunk then \n        return 1 \n      else \n        return sock:send(chunk)\n      end \n    end \n  else \n    return ltn12.sink.error(io_err or \"unable to send socket\") \n  end\nend\n\nlocal function session_retrieve(sid, allowed_users)\n  local sdat = util.ubus(\"session\", \"get\", { ubus_rpc_session = sid })\n  if type(sdat) == \"table\" and\n      type(sdat.values) == \"table\" and\n      type(sdat.values.token) == \"string\" and\n      (not allowed_users or\n      util.contains(allowed_users, sdat.values.username))\n  then\n      return sid, sdat.values\n  end\n  return nil, nil\nend\n\nlocal function get_session()\n  local sid\n  local key\n  local sdat\n  for _, key in ipairs({\"sysauth_https\", \"sysauth_http\", \"sysauth\"}) do\n    sid = http.getcookie(key)\n    if sid then\n      sid, sdat = session_retrieve(sid, nil)\n      if sid and sdat then\n        return sid, sdat\n      end\n    end\n  end\n  return nil, nil\nend\n\nlocal function chunksource(sock, buffer)\n\tbuffer = buffer or \"\"\n\treturn function()\n\t\tlocal output\n\t\tlocal _, endp, count = buffer:find(\"^([0-9a-fA-F]+);?.-\\r\\n\")\n\t\twhile not count and #buffer <= 1024 do\n\t\t\tlocal newblock, code = sock:recv(1024 - #buffer)\n\t\t\tif not newblock then\n\t\t\t\treturn nil, code\n\t\t\tend\n\t\t\tbuffer = buffer .. newblock  \n\t\t\t_, endp, count = buffer:find(\"^([0-9a-fA-F]+);?.-\\r\\n\")\n\t\tend\n\t\tcount = tonumber(count, 16)\n\t\tif not count then\n\t\t\treturn nil, -1, \"invalid encoding\"\n\t\telseif count == 0 then\n\t\t\treturn nil\n\t\telseif count + 2 <= #buffer - endp then\n\t\t\toutput = buffer:sub(endp+1, endp+count)\n\t\t\tbuffer = buffer:sub(endp+count+3)\n\t\t\treturn output\n\t\telse\n\t\t\toutput = buffer:sub(endp+1, endp+count)\n\t\t\tbuffer = \"\"\n\t\t\tif count - #output > 0 then\n\t\t\t\tlocal remain, code = sock:recvall(count-#output)\n\t\t\t\tif not remain then\n\t\t\t\t\treturn nil, code\n\t\t\t\tend\n\t\t\t\toutput = output .. remain\n\t\t\t\tcount, code = sock:recvall(2)\n\t\t\telse\n\t\t\t\tcount, code = sock:recvall(count+2-#buffer+endp)\n\t\t\tend\n\t\t\tif not count then\n\t\t\t\treturn nil, code\n\t\t\tend\n\t\t\treturn output\n\t\tend\n\tend\nend\n\nfunction istore_backend() \n  local sock = nixio.connect(\"127.0.0.1\", ISTOREOS_PORT) \n  if not sock then\n    http.status(500, \"connect failed\")\n    return\n  end\n  local input = {}\n  input[#input+1] = http.getenv(\"REQUEST_METHOD\") .. \" \" .. http.getenv(\"REQUEST_URI\") .. \" HTTP/1.1\"\n  local req = http.context.request\n  local start = \"HTTP_\"\n  local start_len = string.len(start)\n  local ctype = http.getenv(\"CONTENT_TYPE\")\n  if ctype then \n    input[#input+1] = \"Content-Type: \" .. ctype \n  end\n  for k, v in pairs(req.message.env) do\n    if string.sub(k, 1, start_len) == start and not string.find(k, \"FORWARDED\") then \n      input[#input+1] = string.sub(k, start_len+1, string.len(k)) .. \": \" .. v\n    end\n  end\n  local sid, sdat = get_session()\n  if sdat ~= nil then\n    input[#input+1] = \"X-Forwarded-Sid: \" .. sid\n    input[#input+1] = \"X-Forwarded-Token: \" .. sdat.token\n  end\n  -- input[#input+1] = \"X-Forwarded-For: \" .. http.getenv(\"REMOTE_HOST\") ..\":\".. http.getenv(\"REMOTE_PORT\")\n  local num = tonumber(http.getenv(\"CONTENT_LENGTH\")) or 0\n  input[#input+1] = \"Content-Length: \" .. tostring(num)\n  input[#input+1] = \"\\r\\n\"\n  local source = ltn12.source.cat(ltn12.source.string(table.concat(input, \"\\r\\n\")), http.source())\n  local ret = ltn12.pump.all(source, sink_socket(sock, \"write sock error\")) \n  if ret ~= 1 then\n    sock:close()\n    http.status(500, \"proxy error\")\n    return\n  end\n\n  local linesrc = sock:linesource()\n  local line, code, error = linesrc()\n  if not line then\n    sock:close()\n    http.status(500, \"response parse failed\")\n    return\n  end\n\n  local protocol, status, msg = line:match(\"^([%w./]+) ([0-9]+) (.*)\")\n  if not protocol then\n    sock:close()\n    http.status(500, \"response protocol error\")\n    return\n  end\n  num = tonumber(status) or 0\n  http.status(num, msg)\n\n  local chunked = 0\n  line = linesrc()\n  while line and line ~= \"\" do\n    local key, val = line:match(\"^([%w-]+)%s?:%s?(.*)\")\n    if key and key ~= \"Status\" then\n      if key == \"Transfer-Encoding\" and val == \"chunked\" then\n        chunked = 1\n      end\n      if key ~= \"Connection\" and key ~= \"Transfer-Encoding\" and key ~= \"Content-Length\" then \n        http.header(key, val)\n      end\n    end\n    line = linesrc()\n  end\n  if not line then\n    sock:close()\n    http.status(500, \"parse header failed\")\n    return\n  end\n\n  local body_buffer = linesrc(true)\n  if chunked == 1 then\n    ltn12.pump.all(chunksource(sock, body_buffer), http.write)\n  else\n    local body_source = ltn12.source.cat(ltn12.source.string(body_buffer), sock:blocksource())\n    ltn12.pump.all(body_source, http.write)\n  end\n\n  sock:close()\nend\n\n"
  },
  {
    "path": "luci-app-quickstart/luasrc/controller/quickstart.lua",
    "content": "local http = require \"luci.http\"\n\nmodule(\"luci.controller.quickstart\", package.seeall)\n\nfunction index()\n    if luci.sys.call(\"pgrep quickstart >/dev/null\") == 0 then\n        local uci = require \"luci.model.uci\".cursor()\n        entry({\"admin\", \"quickstart\"}, template(\"quickstart/home\"), _(\"QuickStart\"), 1).leaf = true\n        entry({\"admin\", \"network_guide\"}, call(\"networkguide_index\"), _(\"NetworkGuide\"), 2)\n        entry({\"admin\", \"network_guide\", \"pages\"}, call(\"quickstart_index\", {index={\"admin\", \"network_guide\", \"pages\"}})).leaf = true\n        if uci:get(\"quickstart\", \"main\", \"wifi_menu\") == \"1\" then\n            entry({\"admin\", \"quickwifi\"}, call(\"quickwifi_index\"), _(\"Wireless\"), 3)\n            entry({\"admin\", \"quickwifi\", \"pages\"}, call(\"quickstart_index\", {index={\"admin\", \"quickwifi\", \"pages\"}})).leaf = true\n        end\n        if nixio.fs.access(\"/usr/lib/lua/luci/view/quickstart/main_dev.htm\") then\n            entry({\"admin\", \"quickstart_dev\"}, call(\"quickstart_dev\", {index={\"admin\", \"quickstart_dev\"}})).leaf = true\n        end\n        entry({\"admin\", \"nas\", \"raid\"}, call(\"quickstart_index\", {index={\"admin\", \"nas\"}}), _(\"RAID\"), 10).leaf = true\n        entry({\"admin\", \"nas\", \"smart\"}, call(\"quickstart_index\", {index={\"admin\", \"nas\"}}), _(\"S.M.A.R.T.\"), 11).leaf = true\n        entry({\"admin\", \"network\", \"interfaceconfig\"}, call(\"quickstart_index\", {index={\"admin\", \"network\"}}), _(\"NetworkPort\"), 11).leaf = true\n\n        entry({\"admin\", \"nas\", \"quickstart\"}).dependent = false\n        entry({\"admin\", \"nas\", \"quickstart\", \"auto_setup\"}, post(\"auto_setup\"))\n        entry({\"admin\", \"nas\", \"quickstart\", \"setup_result\"}, call(\"setup_result\"))\n    else\n        entry({\"admin\", \"quickstart\"}, call(\"redirect_fallback\")).leaf = true\n    end\nend\n\nfunction networkguide_index()\n    luci.http.redirect(luci.dispatcher.build_url(\"admin\", \"network_guide\", \"pages\", \"network\"))\nend\n\nfunction quickwifi_index()\n    luci.http.redirect(luci.dispatcher.build_url(\"admin\", \"quickwifi\", \"pages\", \"quickwifi\"))\nend\n\nfunction redirect_fallback()\n    luci.http.redirect(luci.dispatcher.build_url(\"admin\", \"status\"))\nend\n\nlocal function vue_lang()\n    local i18n = require(\"luci.i18n\")\n    local lang = i18n.translate(\"quickstart_vue_lang\")\n    if lang == \"quickstart_vue_lang\" or lang == \"\" then\n        lang = \"en\"\n    end\n    return lang\nend\n\nfunction quickstart_index(param)\n    luci.template.render(\"quickstart/main\", {prefix=luci.dispatcher.build_url(unpack(param.index)),lang=vue_lang()})\nend\n\nfunction quickstart_dev(param)\n    luci.template.render(\"quickstart/main_dev\", {prefix=luci.dispatcher.build_url(unpack(param.index)),lang=vue_lang()})\nend\n\nfunction auto_setup()\n    local os   = require \"os\"\n    local fs   = require \"nixio.fs\"\n    local rshift  = nixio.bit.rshift\n\n    -- json style\n    -- local jsonc = require \"luci.jsonc\"\n    -- local json_parse = jsonc.parse\n    -- local req = json_parse(luci.http.content())\n    -- local pkgs = \"\"\n    -- for k, v in pairs(req.packages) do\n    --     pkgs = pkgs .. \" \" .. luci.util.shellquote(v)\n    -- end\n    \n    -- form style\n    local packages = luci.http.formvalue(\"packages\")\n    local pkgs = \"\"\n    if type(packages) == \"table\" then\n        if #packages > 0 then\n            for k, v in pairs(packages) do\n                pkgs = pkgs .. \" \" .. luci.util.shellquote(v)\n            end\n        end\n    else\n        if packages ~= nil and packages ~= \"\" then\n            pkgs = luci.util.shellquote(packages)\n        end\n    end\n\n\n    local ret\n    if pkgs == \"\" then\n        ret = {\n            success = 1,\n            scope = \"params\",\n            error = \"Parameter 'packages' undefined!\",\n        }\n    else\n        local cmd = \"/usr/libexec/quickstart/auto_setup.sh \" .. pkgs\n        cmd = \"/etc/init.d/tasks task_add auto_setup \" .. luci.util.shellquote(cmd)\n        local r = os.execute(cmd .. \" >/var/log/auto_setup.stdout 2>/var/log/auto_setup.stderr\")\n        local e = fs.readfile(\"/var/log/auto_setup.stderr\")\n        local o = fs.readfile(\"/var/log/auto_setup.stdout\")\n\n        fs.unlink(\"/var/log/auto_setup.stderr\")\n        fs.unlink(\"/var/log/auto_setup.stdout\")\n        e = e or \"\"\n        if r == 256 and e == \"\" then\n            e = \"os.execute exit code 1\"\n        end\n        r = rshift(r,8)\n        ret = {\n            success = r,\n            scope = \"taskd\",\n            error = e,\n            detail = o,\n        }\n    end\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json(ret)\nend\n\nfunction setup_result()\n    local fs   = require \"nixio.fs\"\n    local taskd = require \"luci.model.tasks\"\n    local packages = nil\n    local success = nil\n    local failed = nil\n    local status = taskd.status(\"auto_setup\")\n    local ret = {\n    }\n    if status.running or status.exit_code ~= 404 then\n        local item\n        local po = fs.readfile(\"/var/log/auto_setup.input\") or \"\"\n        for item in po:gmatch(\"[^\\n]+\") do\n            if packages then\n                packages[#packages+1] = item\n            else\n                packages = {item}\n            end\n        end\n        local so = fs.readfile(\"/var/log/auto_setup.success\") or \"\"\n        for item in so:gmatch(\"[^\\n]+\") do\n            if success then\n                success[#success+1] = item\n            else\n                success = {item}\n            end\n        end\n        local fo = fs.readfile(\"/var/log/auto_setup.failed\") or \"\"\n        for item in fo:gmatch(\"[^\\n]+\") do\n            if failed then\n                failed[#failed+1] = item\n            else\n                failed = {item}\n            end\n        end\n        ret.success = 0\n        ret.result = {\n            ongoing = status.running,\n            packages = packages,\n            success = success,\n            failed = failed,\n        }\n    else\n        ret.success = 404\n        ret.scope = \"taskd\"\n        ret.error = \"task not found\"\n    end\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json(ret)\nend\n"
  },
  {
    "path": "luci-app-quickstart/luasrc/view/quickstart/home.htm",
    "content": "<%\nlocal function vue_lang()\n    local i18n = require(\"luci.i18n\")\n    local lang = i18n.translate(\"quickstart_vue_lang\")\n    if lang == \"quickstart_vue_lang\" or lang == \"\" then\n        lang = \"en\"\n    end\n    return lang\nend\n-%>\n<% luci.template.render(\"quickstart/main\", {prefix=luci.dispatcher.build_url(\"admin\", \"quickstart\"),lang=vue_lang()}) %>\n"
  },
  {
    "path": "luci-app-quickstart/luasrc/view/quickstart/main.htm",
    "content": "<%+header%>\n<%\n  local jsonc = require \"luci.jsonc\"\n  local uci = require \"luci.model.uci\".cursor()\n  local features = { \"_lua_force_array_\" }\n  local configs = {}\n  if luci.sys.call(\"which ota >/dev/null 2>&1 && ota >/dev/null 2>&1\") == 0 then\n      features[#features+1] = \"ota\"\n  end\n  if luci.sys.call(\"[ -d /ext_overlay ] >/dev/null 2>&1\") == 0 then\n      features[#features+1] = \"sandbox\"\n  end\n  if luci.sys.call(\"[ -e /etc/init.d/dockerd ] >/dev/null 2>&1\") == 0 then\n      features[#features+1] = \"dockerd\"\n  end\n  if luci.sys.call(\"[ -e /etc/init.d/unishare ] >/dev/null 2>&1\") == 0 then\n      features[#features+1] = \"unishare\"\n  end\n  if luci.sys.call(\"/etc/init.d/ttyd running >/dev/null 2>&1\") == 0 then\n      features[#features+1] = \"ttyd\"\n      local port = uci:get_first(\"ttyd\", \"ttyd\", \"port\") or \"7681\"\n      local ssl  = uci:get_first(\"ttyd\", \"ttyd\", \"ssl\") or \"0\"\n      configs[\"ttyd\"] = {\n        port = tonumber(port),\n        ssl = ssl == \"1\"\n      }\n  end\n  if uci:get(\"quickstart\", \"main\", \"disable_update_check\") == \"1\" then\n      configs[\"update\"] = {\n        disable = true\n      }\n  end\n-%>\n<script>\n    (function(){\n      window.token = \"<%=token%>\";\n      var vue_prefix=\"<%=prefix%>\";\n      window.vue_base = vue_prefix + '/';\n      window.vue_lang_data = '/luci-static/quickstart/i18n/<%=lang%>.json<%# ?v=PKG_VERSION %>';\n      window.vue_lang = '<%=lang%>';\n      window.quickstart_features = <%=jsonc.stringify(features)%>;\n      window.quickstart_configs = <%=jsonc.stringify(configs)%>;\n      if (location.pathname != vue_prefix && !location.pathname.startsWith(window.vue_base)) {\n        if (window.history && window.history.replaceState) {\n          window.history.replaceState({}, null, vue_prefix);\n        } else {\n          location.href = vue_prefix;\n        }\n      }\n    })();\n</script>\n<div id=\"app\">\n</div>\n<script type=\"module\" crossorigin src=\"/luci-static/quickstart/index.js<%# ?v=PKG_VERSION %>\"></script>\n<link rel=\"stylesheet\" href=\"/luci-static/quickstart/style.css<%# ?v=PKG_VERSION %>\">\n<%+footer%>\n"
  },
  {
    "path": "luci-app-quickstart/po/zh_Hans/quickstart.po",
    "content": "msgid \"NetworkGuide\"\nmsgstr \"向导\"\n\nmsgid \"QuickStart\"\nmsgstr \"首页\"\n\nmsgid \"RAID\"\nmsgstr \"磁盘阵列\"\n\nmsgid \"NetworkPort\"\nmsgstr \"网口配置\"\n\nmsgid \"quickstart_vue_lang\"\nmsgstr \"zh-cn\"\n"
  },
  {
    "path": "luci-app-quickstart/root/etc/uci-defaults/50_luci-quickstart",
    "content": "#!/bin/sh\n\nrm -f /tmp/luci-indexcache /tmp/luci-indexcache.*\nexit 0\n"
  },
  {
    "path": "luci-app-quickstart/root/usr/libexec/quickstart/auto_setup.sh",
    "content": "#!/bin/sh\n\n> /var/log/auto_setup.success\n> /var/log/auto_setup.failed\n> /var/log/auto_setup.input\n\nsave_input() {\n    local pkg\n    for pkg in $@; do\n        echo \"$pkg\" >> /var/log/auto_setup.input\n    done\n}\nsave_input \"$@\"\n\n. /lib/functions.sh\n\nload_quickstart_cfg() {\n    config_load quickstart || return $?\n\n    local main_dir conf_dir pub_dir dl_dir tmp_dir\n    config_get main_dir \"main\" main_dir\n    [ -z \"$main_dir\" ] && { echo \"Home dir not configured!\" >&2 ; return 1 ; }\n    config_get conf_dir \"main\" conf_dir \"$main_dir/Configs\"\n    config_get pub_dir \"main\" pub_dir \"$main_dir/Public\"\n    config_get tmp_dir \"main\" tmp_dir \"$main_dir/Caches\"\n    config_get dl_dir \"main\" dl_dir \"$pub_dir/Downloads\"\n\n    export ISTORE_CONF_DIR=\"$conf_dir\"\n    export ISTORE_DL_DIR=\"$dl_dir\"\n    export ISTORE_CACHE_DIR=\"$tmp_dir\"\n    export ISTORE_PUBLIC_DIR=\"$pub_dir\"\n\n    mkdir -p \"$ISTORE_CONF_DIR\" \"$ISTORE_DL_DIR\" \"$ISTORE_CACHE_DIR\" \"$ISTORE_PUBLIC_DIR\"\n    chmod 777 \"$ISTORE_DL_DIR\"\n}\n\nauto_setup_app() {\n    local pkg=$1\n    is-opkg install \"app-meta-$pkg\" || return 1\n    sh -c \". '/usr/libexec/istorea/$pkg.sh'\"\n}\n\nauto_setup_apps() {\n    local pkg\n    for pkg in $@; do\n        echo \"Setting up $pkg...\"\n        if auto_setup_app $pkg; then\n            echo \"Set up $pkg success\"\n            echo \"$pkg\" >> /var/log/auto_setup.success\n        else\n            echo \"Set up $pkg failed\"\n            echo \"$pkg\" >> /var/log/auto_setup.failed\n        fi\n    done\n}\n\nload_quickstart_cfg || exit $?\n\nauto_setup_apps \"$@\"\n\n[ ! -s /var/log/auto_setup.failed ]\n"
  },
  {
    "path": "luci-app-quickstart/root/usr/share/luci/menu.d/luci-app-quickstart.json",
    "content": "{\n\t\"admin/quickstart/*\": {\n\t\t\"title\": \"QuickStart\",\n\t\t\"order\": 1,\n\t\t\"action\": {\n\t\t\t\"type\": \"template\",\n\t\t\t\"path\": \"quickstart/home\"\n\t\t}\n\t}\n}"
  },
  {
    "path": "luci-app-shutdown/Makefile",
    "content": "# Copyright (C) 2020-2026 Hyy2001X <https://github.com/Hyy2001X>\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-shutdown\nPKG_VERSION:=2.0\nPKG_RELEASE:=1\n\nPKG_LICENSE:=GPL-3.0-or-later\n\nLUCI_TITLE:=LuCI Support for shutdown/reboot\nLUCI_DEPENDS:=+luci-base\nLUCI_PKGARCH:=all\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-shutdown/luasrc/controller/shutdown.lua",
    "content": "module(\"luci.controller.shutdown\", package.seeall)\n\nlocal http  = require \"luci.http\"\nlocal sys   = require \"luci.sys\"\nlocal jsonc = require \"luci.jsonc\"\nlocal fs    = require \"nixio.fs\"\n\nlocal function json_ok(tbl)\n\thttp.prepare_content(\"application/json\")\n\thttp.write_json(tbl or { ok = true })\nend\n\nlocal function json_err(msg, code)\n\thttp.status(code or 500, \"Error\")\n\thttp.prepare_content(\"application/json\")\n\thttp.write_json({ ok = false, error = msg or \"unknown error\" })\nend\n\nlocal function poweroff_supported()\n\t-- OpenWrt 常见：/sbin/poweroff（procd）\n\tif fs.access(\"/sbin/poweroff\") then\n\t\treturn true, \"found /sbin/poweroff\"\n\tend\n\n\t-- BusyBox applet 兜底（有些系统没有独立 /sbin/poweroff）\n\tlocal ret = sys.call(\"/bin/busybox poweroff -h >/dev/null 2>&1\")\n\tif ret == 0 then\n\t\treturn true, \"busybox poweroff applet\"\n\tend\n\n\treturn false, \"poweroff command not found\"\nend\n\nlocal function get_board()\n\tlocal out = sys.exec(\"ubus call system board 2>/dev/null\")\n\tlocal obj = (out and #out > 0) and jsonc.parse(out) or nil\n\treturn obj or {}\nend\n\nfunction index()\n\tlocal page = entry({\"admin\", \"system\", \"shutdown\"}, cbi(\"shutdown\"), _(\"Shutdown / Reboot\"), 90)\n\tpage.dependent = true\n\tpage.acl_depends = { \"luci-app-shutdown\" }\n\n\t-- JSON endpoints\n\tentry({\"admin\", \"system\", \"shutdown\", \"status\"}, call(\"action_status\")).leaf = true\n\tentry({\"admin\", \"system\", \"shutdown\", \"reboot\"}, post(\"action_reboot\")).leaf = true\n\tentry({\"admin\", \"system\", \"shutdown\", \"poweroff\"}, post(\"action_poweroff\")).leaf = true\nend\n\nfunction action_status()\n\tlocal supported, reason = poweroff_supported()\n\tlocal board = get_board()\n\n\tjson_ok({\n\t\tok = true,\n\t\tpoweroff_supported = supported,\n\t\tpoweroff_reason = reason,\n\t\tboard = {\n\t\t\tmodel = board.model,\n\t\t\tsystem = board.system,\n\t\t\trelease = board.release,\n\t\t\tkernel = board.kernel,\n\t\t\thostname = board.hostname\n\t\t}\n\t})\nend\n\nfunction action_reboot()\n\t-- 后台执行，先返回 JSON\n\tsys.call(\"(sleep 1; sync; reboot) >/dev/null 2>&1 &\")\n\tjson_ok({ ok = true })\nend\n\nfunction action_poweroff()\n\tlocal supported, reason = poweroff_supported()\n\tif not supported then\n\t\treturn json_err(\"Poweroff not supported: \" .. (reason or \"\"), 400)\n\tend\n\n\tsys.call(\"(sleep 1; sync; poweroff) >/dev/null 2>&1 &\")\n\tjson_ok({ ok = true })\nend\n"
  },
  {
    "path": "luci-app-shutdown/luasrc/model/cbi/shutdown.lua",
    "content": "m = Map(\"system\", translate(\"Shutdown / Reboot\"),\n\ttranslate(\"Use the buttons below to reboot or shut down the device.\"))\n\ns = m:section(SimpleSection)\ns.template = \"shutdown/actions\"\n\nreturn m\n"
  },
  {
    "path": "luci-app-shutdown/luasrc/view/shutdown/actions.htm",
    "content": "<div class=\"cbi-section\">\n  <div class=\"cbi-section-node\">\n\n    <div id=\"shutdown_info\" class=\"alert-message\" style=\"display:none;\"></div>\n\n    <div class=\"cbi-value\">\n      <label class=\"cbi-value-title\"><%:Device%></label>\n      <div class=\"cbi-value-field\">\n        <strong id=\"dev_model\">-</strong><br />\n        <small id=\"dev_release\">-</small>\n      </div>\n    </div>\n\n    <div class=\"cbi-value\">\n      <label class=\"cbi-value-title\"><%:Actions%></label>\n      <div class=\"cbi-value-field\">\n        <button id=\"btn_reboot\" class=\"cbi-button cbi-button-apply\"><%:Reboot%></button>\n        <button id=\"btn_poweroff\" class=\"cbi-button cbi-button-reset\"><%:Shutdown%></button>\n        <span id=\"poweroff_hint\" style=\"margin-left:8px;\"></span>\n      </div>\n    </div>\n\n  </div>\n</div>\n\n<script type=\"text/javascript\">\n(function() {\n  var statusUrl   = '<%=luci.dispatcher.build_url(\"admin\",\"system\",\"shutdown\",\"status\")%>';\n  var rebootUrl   = '<%=luci.dispatcher.build_url(\"admin\",\"system\",\"shutdown\",\"reboot\")%>';\n  var poweroffUrl = '<%=luci.dispatcher.build_url(\"admin\",\"system\",\"shutdown\",\"poweroff\")%>';\n\n  var infoBox = document.getElementById('shutdown_info');\n  var btnReboot = document.getElementById('btn_reboot');\n  var btnPoweroff = document.getElementById('btn_poweroff');\n  var hint = document.getElementById('poweroff_hint');\n\n  function showInfo(msg, isErr) {\n    infoBox.style.display = '';\n    infoBox.className = isErr ? 'alert-message error' : 'alert-message success';\n    infoBox.textContent = msg;\n  }\n\n  function setPoweroffAvailable(ok) {\n    if (ok) {\n      btnPoweroff.disabled = false;\n      hint.textContent = '';\n    } else {\n      btnPoweroff.disabled = true;\n      hint.textContent = '(<%:Poweroff is not supported on this device.%>)';\n    }\n  }\n\n  function xhrGet(url, cb) {\n    fetch(url, { method: 'GET', credentials: 'same-origin' })\n      .then(r => r.json()).then(cb)\n      .catch(() => cb(null));\n  }\n\n  function xhrPost(url, cb) {\n    fetch(url, { method: 'POST', credentials: 'same-origin' })\n      .then(r => r.json()).then(cb)\n      .catch(() => cb(null));\n  }\n\n  function loadStatus() {\n    xhrGet(statusUrl, function(data) {\n      if (!data || !data.ok) {\n        showInfo('<%:Failed to load status.%>', true);\n        setPoweroffAvailable(false, 'status unavailable');\n        return;\n      }\n\n      var board = data.board || {};\n      document.getElementById('dev_model').textContent =\n        board.model || board.system || '-';\n\n      var rel = board.release || {};\n      var relTxt = [];\n      if (rel.distribution) relTxt.push(rel.distribution);\n      if (rel.version) relTxt.push(rel.version);\n      if (rel.revision) relTxt.push(rel.revision);\n      document.getElementById('dev_release').textContent = relTxt.join(' ') || '-';\n\n      setPoweroffAvailable(!!data.poweroff_supported);\n    });\n  }\n\n  btnReboot.addEventListener('click', function() {\n    if (!confirm('<%:Are you sure you want to reboot the system?%>'))\n      return;\n\n\tbtnReboot.disabled = true;\n\n\txhrPost(rebootUrl, function() {\n\t\t/* no ui feedback, system will reboot */\n\t});\n  });\n\n  btnPoweroff.addEventListener('click', function() {\n    if (btnPoweroff.disabled)\n      return;\n\n    if (!confirm('<%:Are you sure you want to shut down the system?%>'))\n      return;\n\n\tbtnPoweroff.disabled = true;\n\n\txhrPost(poweroffUrl, function() {\n\t  /* no ui feedback, system will power off */\n\t});\n  });\n\n  loadStatus();\n})();\n</script>\n"
  },
  {
    "path": "luci-app-shutdown/po/zh_Hans/shutdown.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Language: zh_Hans\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\nmsgid \"Shutdown / Reboot\"\nmsgstr \"关机 / 重启\"\n\nmsgid \"Use the buttons below to reboot or shut down the device.\"\nmsgstr \"使用下方按钮执行重启或关机。\"\n\nmsgid \"Device\"\nmsgstr \"设备\"\n\nmsgid \"Actions\"\nmsgstr \"操作\"\n\nmsgid \"Reboot\"\nmsgstr \"重启\"\n\nmsgid \"Shutdown\"\nmsgstr \"关机\"\n\nmsgid \"Not supported\"\nmsgstr \"不支持\"\n\nmsgid \"Failed to load status.\"\nmsgstr \"加载状态失败。\"\n\nmsgid \"Are you sure you want to reboot the system?\"\nmsgstr \"确认要重启系统吗？\"\n\nmsgid \"Are you sure you want to shut down the system?\"\nmsgstr \"确认要关闭系统吗？\"\n"
  },
  {
    "path": "luci-app-shutdown/root/usr/share/rpcd/acl.d/luci-app-shutdown.json",
    "content": "{\n  \"luci-app-shutdown\": {\n    \"description\": \"Grant access to LuCI shutdown/reboot app\",\n    \"read\": {\n      \"luci\": [ \"shutdown\" ],\n      \"uci\":  [ \"system\" ]\n    },\n    \"write\": {\n      \"luci\": [ \"shutdown\" ]\n    }\n  }\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/Makefile",
    "content": "# Copyright (C) 2018-2020 Lienol <lawlienol@gmail.com>\n#\n# This is free software, licensed under the GNU General Public License v3.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for SSR Mudb Server\nLUCI_DEPENDS:=+libsodium +luci-lib-jsonc +python3\nLUCI_PKGARCH:=all\nPKG_VERSION:=20211211\nPKG_RELEASE:=2\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/luasrc/controller/ssr_mudb_server.lua",
    "content": "-- Copyright 2018-2020 Lienol <lawlienol@gmail.com>\nmodule(\"luci.controller.ssr_mudb_server\", package.seeall)\nlocal http = require \"luci.http\"\nlocal jsonc = require \"luci.jsonc\"\n\nfunction index()\n    if not nixio.fs.access(\"/etc/config/ssr_mudb_server\") then return end\n    entry({\"admin\", \"vpn\"}, firstchild(), \"VPN\", 45).dependent = false\n    if nixio.fs.access(\"/usr/share/ssr_mudb_server\") then\n        entry({\"admin\", \"vpn\", \"ssr_mudb_server\"}, cbi(\"ssr_mudb_server/index\"), _(\"SSR MuDB Server\"), 2).dependent = true\n    end\n\n    entry({\"admin\", \"vpn\", \"ssr_mudb_server\", \"user\"}, template(\"ssr_mudb_server/user\")).leaf = true\n    entry({\"admin\", \"vpn\", \"ssr_mudb_server\", \"config\"}, cbi(\"ssr_mudb_server/config\")).leaf = true\n    entry({\"admin\", \"vpn\", \"ssr_mudb_server\", \"status\"}, call(\"status\")).leaf = true\n    entry({\"admin\", \"vpn\", \"ssr_mudb_server\", \"user_save\"}, call(\"user_save\")).leaf = true\n    entry({\"admin\", \"vpn\", \"ssr_mudb_server\", \"user_list\"}, call(\"user_list\")).leaf = true\n    entry({\"admin\", \"vpn\", \"ssr_mudb_server\", \"user_get\"}, call(\"user_get\")).leaf = true\n    entry({\"admin\", \"vpn\", \"ssr_mudb_server\", \"get_link\"}, call(\"get_link\")).leaf = true\n    entry({\"admin\", \"vpn\", \"ssr_mudb_server\", \"clear_traffic\"}, call(\"clear_traffic\")).leaf = true\n    entry({\"admin\", \"vpn\", \"ssr_mudb_server\", \"clear_traffic_all_users\"}, call(\"clear_traffic_all_users\")).leaf = true\n    entry({\"admin\", \"vpn\", \"ssr_mudb_server\", \"remove_user\"}, call(\"remove_user\")).leaf = true\n    entry({\"admin\", \"vpn\", \"ssr_mudb_server\", \"get_log\"}, call(\"get_log\")).leaf = true\n    entry({\"admin\", \"vpn\", \"ssr_mudb_server\", \"clear_log\"}, call(\"clear_log\")).leaf =  true\nend\n\nlocal function http_write_json(content)\n    http.prepare_content(\"application/json\")\n    http.write_json(content or {code = 1})\nend\n\nlocal function get_config_path()\n    return luci.sys.exec(\"echo -n $(cat /usr/share/ssr_mudb_server/userapiconfig.py | grep 'MUDB_FILE' | cut -d \\\"'\\\" -f 2)\")\nend\n\nlocal function get_config_json()\n    return luci.sys.exec(\"cat \" .. get_config_path()) or \"[]\"\nend\n\nfunction status()\n    local e = {}\n    e.status = luci.sys.call(\"busybox ps -w | grep -v grep | grep '/usr/share/ssr_mudb_server/server.py' >/dev/null\") == 0\n    http_write_json(e)\nend\n\nfunction get_link()\n    local e = {}\n    local link = luci.sys.exec(\"cd /usr/share/ssr_mudb_server && python3 mujson_mgr.py -l -p \" .. luci.http.formvalue(\"port\") .. \" | sed -n '$p'\"):gsub(\"^%s*(.-)%s*$\", \"%1\")\n    if link ~= \"\" then e.link = link end\n    http_write_json(e)\nend\n\nfunction clear_traffic()\n    local e = {}\n    e.status = luci.sys.call(\"cd /usr/share/ssr_mudb_server && python3 mujson_mgr.py -c -p '\" .. luci.http.formvalue(\"port\") .. \"' >/dev/null\") == 0\n    http_write_json(e)\nend\n\nfunction clear_traffic_all_users()\n    local e = {}\n    e.status = luci.sys.call(\"/usr/share/ssr_mudb_server/clear_traffic_all_users.sh >/dev/null\") == 0\n    http_write_json(e)\nend\n\nfunction user_list()\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write(get_config_json())\nend\n\nfunction user_save()\n    local result = {code = 0}\n    local action = luci.http.formvalue(\"action\")\n    local json_str = luci.http.formvalue(\"json\")\n    if action and action == \"add\" or action == \"edit\" then\n        local user = jsonc.parse(json_str)\n        if user then\n            local json = jsonc.parse(get_config_json())\n            if json then\n                local port = user.port\n                local is_exist_port = 0\n                for index = 1, table.maxn(json) do\n                    if json[index].port == tonumber(port) then\n                        is_exist_port = 1\n                        if user.old_port and user.old_port == tonumber(port) then\n                            is_exist_port = 0\n                        end\n                        break\n                    end\n                end\n                if is_exist_port == 0 then\n                    if action == \"add\" then\n                        local new_user = {\n                            enable = tonumber(user.enable) or 0,\n                            user = user.user or user.port,\n                            port = tonumber(user.port),\n                            passwd = user.passwd,\n                            method = user.method,\n                            protocol = user.protocol,\n                            obfs = user.obfs,\n                            protocol_param = user.protocol_param or \"2\",\n                            speed_limit_per_con = tonumber(user.speed_limit_per_con) or 0,\n                            speed_limit_per_user = tonumber(user.speed_limit_per_user) or 0,\n                            forbidden_port = user.forbidden_port or \"\",\n                            transfer_enable = tonumber(user.transfer_enable) or 1073741824,\n                            d = 0,\n                            u = 0\n                        }\n                        table.insert(json, new_user)\n                    elseif action == \"edit\" then\n                        for index = 1, table.maxn(json) do\n                            if json[index].port == tonumber(user.old_port) then\n                                json[index].enable = tonumber(user.enable) or 0\n                                json[index].user = user.user\n                                json[index].port = tonumber(user.port)\n                                json[index].passwd = user.passwd\n                                json[index].method = user.method\n                                json[index].protocol = user.protocol\n                                json[index].obfs = user.obfs\n                                json[index].protocol_param = user.protocol_param\n                                json[index].speed_limit_per_con = tonumber(user.speed_limit_per_con)\n                                json[index].speed_limit_per_user = tonumber(user.speed_limit_per_user)\n                                json[index].forbidden_port = user.forbidden_port\n                                json[index].transfer_enable = tonumber(user.transfer_enable)\n                                break\n                            end\n                        end\n                    end\n                    local f, err = io.open(get_config_path(), \"w\")\n                    if f and err == nil then\n                        f:write(jsonc.stringify(json, 1))\n                        f:close()\n                        luci.sys.call(\"/etc/init.d/ssr_mudb_server restart\")\n                        result = {code = 1}\n                    end\n                else\n                    result.msg = \"端口已存在！\"\n                end\n            end\n        end\n    end\n    http_write_json(result)\nend\n\nfunction user_get()\n    local result = {}\n    local port = luci.http.formvalue(\"port\")\n    local str = get_config_json()\n    local json = jsonc.parse(str)\n    if port and str and json then\n        for index = 1, table.maxn(json) do\n            local o = json[index]\n            if o.port == tonumber(port) then\n                result = o\n                break\n            end\n        end\n    end\n    http_write_json(result)\nend\n\nfunction remove_user()\n    local port = luci.http.formvalue(\"port\")\n    local str = get_config_json()\n    local json = jsonc.parse(str)\n    if port and str and json then\n        for index = 1, table.maxn(json) do\n            local o = json[index]\n            if o.port == tonumber(port) then\n                json[index] = nil\n                break\n            end\n        end\n        local f, err = io.open(get_config_path(), \"w\")\n\t\tif f and err == nil then\n\t\t\tf:write(jsonc.stringify(json, 1))\n\t\t\tf:close()\n\t\tend\n        luci.http.status = 200\n    else\n        luci.http.status = 500\n    end\nend\n\nfunction get_log()\n    luci.http.write(luci.sys.exec(\"[ -f '/var/log/ssr_mudb_server.log' ] && cat /var/log/ssr_mudb_server.log\"))\nend\n\nfunction clear_log()\n    luci.sys.call(\"echo '' > /var/log/ssr_mudb_server.log\")\nend\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/luasrc/model/cbi/ssr_mudb_server/index.lua",
    "content": "local appname = \"ssr_mudb_server\"\nlocal jsonc = require \"luci.jsonc\"\n\na = Map(appname, translate(\"ShadowsocksR MuDB Server\"))\n\nt = a:section(TypedSection, \"global\", translate(\"Global Settings\"))\nt.anonymous = true\nt.addremove = false\n\nt:append(Template(appname .. \"/status\"))\n\ne = t:option(Flag, \"enable\", translate(\"Enable\"))\ne.rmempty = false\n\ne = t:option(Flag, \"auto_clear_transfer\", translate(\"Enable Auto Clear Traffic\"))\ne.default = 0\ne.rmempty = false\n\ne = t:option(Value, \"auto_clear_transfer_time\", translate(\"Clear Traffic Time Interval\"), translate(\"*,*,*,*,* is Min Hour Day Mon Week\"))\ne.default = \"0,2,1,*,*\"\ne:depends(\"auto_clear_transfer\", 1)\n\na:append(Template(appname .. \"/users\"))\n\nlocal apply = luci.http.formvalue(\"cbi.apply\")\nif apply then\n    for key, val in pairs(luci.http.formvalue()) do\n        if key:find(\"ssr_mudb_server_\") == 1 then\n            local port = key:gsub(\"ssr_mudb_server_\",\"\"):gsub(\".enable\",\"\")\n            local config_path = luci.sys.exec(\"echo -n $(cat /usr/share/ssr_mudb_server/userapiconfig.py | grep 'MUDB_FILE' | cut -d \\\"'\\\" -f 2)\")\n            local str = luci.sys.exec(\"cat \" .. config_path) or \"[]\"\n            local json = jsonc.parse(str)\n            if port and str and json then\n                for index = 1, table.maxn(json) do\n                    local o = json[index]\n                    if o.port == tonumber(port) then\n                        json[index].enable = tonumber(val)\n                        break\n                    end\n                end\n                local f, err = io.open(config_path, \"w\")\n                if f and err == nil then\n                    f:write(jsonc.stringify(json, 1))\n                    f:close()\n                end\n            end\n        end\n    end\nend\n\nreturn a\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/luasrc/view/ssr_mudb_server/status.htm",
    "content": "<div class=\"cbi-value\">\n\t<label class=\"cbi-value-title\"><%:Status%></label>\n\t<div class=\"cbi-value-field\" id=\"run_status\" style=\"font-weight: bold;\"><%:Collecting data...%></div>\n</div>\n\n<script type=\"text/javascript\">\n//<![CDATA[\n\tvar run_status = document.getElementById('run_status');\n\tvar style = run_status.getAttribute(\"style\");\n\tXHR.poll(2, '<%=luci.dispatcher.build_url(\"admin\", \"vpn\", \"ssr_mudb_server\", \"status\")%>', null,\n\t\tfunction(x, result) {\n\t\t\trun_status.setAttribute(\"style\", result.status ? style + \"color: green;\" : style + \"color: red;\");\n\t\t\trun_status.innerHTML = result.status ? '<%=translate(\"RUNNING\")%>' : '<%=translate(\"NOT RUNNING\")%>';\n\t\t}\n\t)\n//]]>\n</script>\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/luasrc/view/ssr_mudb_server/user.htm",
    "content": "<%+header%>\n<%\n-- Copyright (C) 2018-2020 Lienol <lawlienol@gmail.com>\n%>\n<script src=\"<%=resource%>/vue.min.js\"></script>\n<form>\n\t<div class=\"cbi-map\" id=\"ssr_mudb_server_user_div\">\n\t\t<h2 name=\"content\">ShadowsocksR MuDB {{title}}</h2>\n\t\t<fieldset class=\"cbi-section\">\n\t\t\t<div class=\"cbi-section-node\">\n\t\t\t\n\t\t\t\t<div class=\"cbi-value\" data-index=\"1\" data-depends=\"[]\">\n\t\t\t\t\t<label class=\"cbi-value-title\">启用</label>\n\t\t\t\t\t<div class=\"cbi-value-field\">\n\t\t\t\t\t\t<input type=\"hidden\" id=\"enable\" name=\"enable\" v-model=\"user.enable\">\n\t\t\t\t\t\t<input type=\"checkbox\" :value=\"user.enable\" @click=\"check_enable($event)\"\n\t\t\t\t\t\t\t:checked=\"user.enable == 1\">\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"cbi-value\" data-index=\"2\" data-depends=\"[]\">\n\t\t\t\t\t<label class=\"cbi-value-title\">备注</label>\n\t\t\t\t\t<div class=\"cbi-value-field\">\n\t\t\t\t\t\t<input name=\"user\" type=\"text\" class=\"cbi-input-text\" v-model=\"user.user\">\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"cbi-value\" data-index=\"3\" data-depends=\"[]\">\n\t\t\t\t\t<label class=\"cbi-value-title\">端口</label>\n\t\t\t\t\t<div class=\"cbi-value-field\">\n\t\t\t\t\t\t<input name=\"port\" type=\"text\" class=\"cbi-input-text\" v-model=\"user.port\"\n\t\t\t\t\t\t\tonkeyup=\"this.value=this.value.replace(/[^0-9-]+/,'');\">\n\t\t\t\t\t\t<input name=\"old_port\" type=\"hidden\" :value=\"user.old_port\">\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"cbi-value\" data-index=\"4\" data-depends=\"[]\">\n\t\t\t\t\t<label class=\"cbi-value-title\">密码</label>\n\t\t\t\t\t<div class=\"cbi-value-field\">\n\t\t\t\t\t\t<input name=\"passwd\" type=\"text\" class=\"cbi-input-text\" v-model=\"user.passwd\"\n\t\t\t\t\t\t\tonkeyup=\"value=value.replace(/[\\u4e00-\\u9fa5]/ig,'')\">\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"cbi-value\" data-index=\"5\" data-depends=\"[]\">\n\t\t\t\t\t<label class=\"cbi-value-title\">加密</label>\n\t\t\t\t\t<div class=\"cbi-value-field\">\n\t\t\t\t\t\t<select class=\"cbi-input-select\" name=\"method\" size=\"1\" v-model=\"user.method\">\n\t\t\t\t\t\t\t<option v-model=\"method\" v-for=\"method in method_list\">{{method}}</option>\n\t\t\t\t\t\t</select>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"cbi-value\" data-index=\"6\" data-depends=\"[]\">\n\t\t\t\t\t<label class=\"cbi-value-title\">协议</label>\n\t\t\t\t\t<div class=\"cbi-value-field\">\n\t\t\t\t\t\t<select class=\"cbi-input-select\" name=\"protocol\" size=\"1\" v-model=\"user.protocol\">\n\t\t\t\t\t\t\t<option v-model=\"protocol\" v-for=\"protocol in protocol_list\">{{protocol}}</option>\n\t\t\t\t\t\t</select>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"cbi-value\" data-index=\"7\" data-depends=\"[]\">\n\t\t\t\t\t<label class=\"cbi-value-title\">混淆</label>\n\t\t\t\t\t<div class=\"cbi-value-field\">\n\t\t\t\t\t\t<select class=\"cbi-input-select\" name=\"obfs\" size=\"1\" v-model=\"user.obfs\">\n\t\t\t\t\t\t\t<option v-model=\"obfs\" v-for=\"obfs in obfs_list\">{{obfs}}</option>\n\t\t\t\t\t\t</select>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"cbi-value\" data-index=\"8\" data-depends=\"[]\">\n\t\t\t\t\t<label class=\"cbi-value-title\">设备数限制</label>\n\t\t\t\t\t<div class=\"cbi-value-field\">\n\t\t\t\t\t\t<input name=\"device_limit\" type=\"text\" class=\"cbi-input-text\" v-model=\"user.protocol_param\"\n\t\t\t\t\t\t\tonkeyup=\"this.value=this.value.replace(/[^0-9-]+/,'');\">\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<div class=\"cbi-value-description\">\n\t\t\t\t\t\t\t同一时间能链接的客户端数量(多端口模式，每个端口都是独立计算)，建议最少 2个。\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"cbi-value\" data-index=\"9\" data-depends=\"[]\">\n\t\t\t\t\t<label class=\"cbi-value-title\">单线程限速</label>\n\t\t\t\t\t<div class=\"cbi-value-field\">\n\t\t\t\t\t\t<input name=\"speed_limit_per_con\" type=\"text\" class=\"cbi-input-text\"\n\t\t\t\t\t\t\tv-model=\"user.speed_limit_per_con\" onkeyup=\"this.value=this.value.replace(/[^0-9-]+/,'');\">\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<div class=\"cbi-value-description\">\n\t\t\t\t\t\t\t单线程的限速上限，多线程即无效。0代表不限速。(单位：KB/S)\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"cbi-value\" data-index=\"10\" data-depends=\"[]\">\n\t\t\t\t\t<label class=\"cbi-value-title\">总限速</label>\n\t\t\t\t\t<div class=\"cbi-value-field\">\n\t\t\t\t\t\t<input name=\"speed_limit_per_user\" type=\"text\" class=\"cbi-input-text\"\n\t\t\t\t\t\t\tv-model=\"user.speed_limit_per_user\" onkeyup=\"this.value=this.value.replace(/[^0-9-]+/,'');\">\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<div class=\"cbi-value-description\">\n\t\t\t\t\t\t\t总速度限速上限，单个端口整体限速。0代表不限速。(单位：KB/S)\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"cbi-value\" data-index=\"11\" data-depends=\"[]\">\n\t\t\t\t\t<label class=\"cbi-value-title\">禁止的端口</label>\n\t\t\t\t\t<div class=\"cbi-value-field\">\n\t\t\t\t\t\t<input name=\"forbidden_port\" type=\"text\" class=\"cbi-input-text\" v-model=\"user.forbidden_port\">\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<div class=\"cbi-value-description\">\n\t\t\t\t\t\t\t例如不允许访问 25端口，用户就无法通过SSR代理访问邮件端口25了，如果禁止了 80,443 那么用户将无法正常访问 http/https 网站。<br>封禁单个端口格式:\n\t\t\t\t\t\t\t25<br>封禁多个端口格式: 23,465<br>封禁端口段格式: 233-266<br>封禁多种格式端口: 25,465,233-666\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\n\t\t\t\t<div class=\"cbi-value cbi-value-last\" data-index=\"12\" data-depends=\"[]\">\n\t\t\t\t\t<label class=\"cbi-value-title\">可用总流量</label>\n\t\t\t\t\t<div class=\"cbi-value-field\">\n\t\t\t\t\t\t<input name=\"transfer_enable\" type=\"text\" class=\"cbi-input-text\" v-model=\"user.transfer_enable\"\n\t\t\t\t\t\t\tonkeyup=\"this.value=this.value.replace(/[^0-9-]+/,'');\">\n\t\t\t\t\t\t<br>\n\t\t\t\t\t\t<div class=\"cbi-value-description\">\n\t\t\t\t\t\t\t可使用的总流量上限(单位: GB, 1-838868)，0代表无限\n\t\t\t\t\t\t</div>\n\t\t\t\t\t</div>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<br>\n\t\t</fieldset>\n\t\t<br>\n\t\t<div class=\"cbi-page-actions\">\n\t\t\t<input class=\"cbi-button cbi-button-apply\" type=\"button\" value=\"保存并修改\" @click=\"save()\">\n\t\t\t<input class=\"cbi-button cbi-button-reset\" type=\"button\" value=\"返回\" @click=\"goback()\">\n\t\t</div>\n\t</div>\n</form>\n\n<script>\n\tvar api_url = '<%=luci.dispatcher.build_url(\"admin\", \"vpn\", \"ssr_mudb_server\")%>'\n\tvar vue = new Vue({\n\t\tel: '#ssr_mudb_server_user_div',\n\t\tdata: {\n\t\t\ttitle: '用户配置',\n\t\t\tuser: {\n\t\t\t\tenable: 1,\n\t\t\t\tforbidden_port: \"\",\n\t\t\t\tmethod: \"none\",\n\t\t\t\tprotocol: \"auth_chain_a\",\n\t\t\t\tobfs: \"tls1.2_ticket_auth\",\n\t\t\t\tprotocol_param: \"2\",\n\t\t\t\tspeed_limit_per_con: 0,\n\t\t\t\tspeed_limit_per_user: 0,\n\t\t\t\ttransfer_enable: 0,\n\t\t\t\tuser: \"起个名字吧\"\n\n\t\t\t},\n\t\t\tmethod_list: [\n\t\t\t\t\"none\",\n\t\t\t\t\"table\",\n\t\t\t\t\"rc4\",\n\t\t\t\t\"rc4-md5\",\n\t\t\t\t\"aes-128-cfb\",\n\t\t\t\t\"aes-192-cfb\",\n\t\t\t\t\"aes-256-cfb\",\n\t\t\t\t\"aes-128-ctr\",\n\t\t\t\t\"aes-192-ctr\",\n\t\t\t\t\"aes-256-ctr\",\n\t\t\t\t\"bf-cfb\",\n\t\t\t\t\"cast5-cfb\",\n\t\t\t\t\"des-cfb\",\n\t\t\t\t\"rc2-cfb\",\n\t\t\t\t\"salsa20\",\n\t\t\t\t\"chacha20\",\n\t\t\t\t\"chacha20-ietf\"\n\t\t\t],\n\t\t\tprotocol_list: [\n\t\t\t\t\"origin\",\n\t\t\t\t\"verify_simple\",\n\t\t\t\t\"verify_deflate\",\n\t\t\t\t\"verify_sha1\",\n\t\t\t\t\"auth_simple\",\n\t\t\t\t\"auth_sha1\",\n\t\t\t\t\"auth_sha1_v2\",\n\t\t\t\t\"auth_sha1_v4\",\n\t\t\t\t\"auth_aes128_md5\",\n\t\t\t\t\"auth_aes128_sha1\",\n\t\t\t\t\"auth_chain_a\",\n\t\t\t\t\"auth_chain_b\",\n\t\t\t\t\"auth_chain_c\",\n\t\t\t\t\"auth_chain_d\"\n\t\t\t],\n\t\t\tobfs_list: [\n\t\t\t\t\"plain\",\n\t\t\t\t\"http_simple\",\n\t\t\t\t\"http_post\",\n\t\t\t\t\"random_head\",\n\t\t\t\t\"tls_simple\",\n\t\t\t\t\"tls1.0_session_auth\",\n\t\t\t\t\"tls1.2_ticket_auth\"\n\t\t\t]\n\t\t},\n\t\tmethods: {\n\t\t\tcheck_enable: function (e) {\n\t\t\t\tif (e.currentTarget.checked == true) {\n\t\t\t\t\tthis.user.enable = 1;\n\t\t\t\t} else {\n\t\t\t\t\tthis.user.enable = 0;\n\t\t\t\t}\n\t\t\t},\n\t\t\tsave: function () {\n\t\t\t\tvar new_user = JSON.parse(JSON.stringify(this.user));\n\t\t\t\tif (new_user.port == null || isNaN(parseInt(new_user.port)) || parseInt(new_user.port) <= 0 || parseInt(new_user.port) >= 65536) {\n\t\t\t\t\talert('端口必须是1-65535范围，且不能冲突！');\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tnew_user.transfer_enable = new_user.transfer_enable == 0 ? 838868 : new_user.transfer_enable;\n\t\t\t\tnew_user.transfer_enable = (new_user.transfer_enable * 1024 * 1024 * 1024);\n\t\t\t\tXHR.get(api_url + \"/user_save\", { json: JSON.stringify(new_user), action: this.user.old_port ? \"edit\" : \"add\" },\n\t\t\t\t\tfunction (x, result) {\n\t\t\t\t\t\tif (x.status == 200) {\n\t\t\t\t\t\t\tif (result.code && result.code == 1) {\n\t\t\t\t\t\t\t\twindow.location.href = api_url;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tif (result.msg)\n\t\t\t\t\t\t\t\t\talert(result.msg);\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\talert(\"未知错误\");\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t},\n\t\t\tgoback: function () {\n\t\t\t\twindow.location.href = api_url;\n\t\t\t}\n\t\t}\n\t})\n\n\tvar pathname = location.pathname;\n\tvar port = pathname.substring(pathname.lastIndexOf('/') + 1);\n\tif (port && !isNaN(parseInt(port)) && parseInt(port) > 0 && parseInt(port) < 65536) {\n\t\tXHR.get(api_url + \"/user_get\", { port: port },\n\t\t\tfunction (x, result) {\n\t\t\t\tif (x.status == 200) {\n\t\t\t\t\tresult.transfer_enable = (result.transfer_enable / 1024 / 1024 / 1024);\n\t\t\t\t\tresult.old_port = result.port;\n\t\t\t\t\tvue.user = result;\n\t\t\t\t}\n\t\t\t}\n\t\t)\n\t}\n</script>\n<%+footer%>"
  },
  {
    "path": "luci-app-ssr-mudb-server/luasrc/view/ssr_mudb_server/users.htm",
    "content": "<%\n-- Copyright (C) 2018-2020 Lienol <lawlienol@gmail.com>\n%>\n<script src=\"<%=resource%>/vue.min.js\"></script>\n<fieldset class=\"cbi-section cbi-tblsection\" id=\"users_table\">\n\t<h3>{{title}}</h3>\n\t<div class=\"cbi-section-descr\"></div>\n\t<table class=\"table cbi-section-table\" style=\"\">\n\t\t<tr class=\"tr cbi-section-table-titles anonymous\">\n\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:5%\">启用</th>\n\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:10%\">备注</th>\n\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:10%\">端口</th>\n\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:10%\">禁止端口</th>\n\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:10%\">设备数限制</th>\n\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:10%\">单线程限速</th>\n\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:10%\">总限速</th>\n\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:10%\">已用流量</th>\n\t\t\t<th class=\"th cbi-section-table-cell\" style=\"width:10%\">可用流量</th>\n\t\t\t<!-- <th class=\"th cbi-section-table-cell\" style=\"width:10%\">SSR链接</th> -->\n\t\t\t<th class=\"th cbi-section-table-cell cbi-section-actions\"></th>\n\t\t</tr>\n\t\t<template v-for=\"user in users\">\n\t\t\t<tr class=\"tr cbi-section-table-row cbi-rowstyle-1\">\n\t\t\t\t<td class=\"td cbi-value-field\" data-name=\"enable\" data-title=\"启用\">\n\t\t\t\t\t<input type=\"hidden\" :id=\"'ssr_mudb_server_' + user.port + '.enable'\" :name=\"'ssr_mudb_server_' + user.port + '.enable'\" :value=\"user.enable\">\n\t\t\t\t\t<input type=\"checkbox\" :value=\"user.enable\" @click=\"check_enable(user, $event)\" :checked=\"user.enable == 1\">\n\t\t\t\t</td>\n\n\t\t\t\t<td class=\"td cbi-value-field\" data-name=\"remarks\" data-title=\"备注\">{{user.user}}</td>\n\t\t\t\t<td class=\"td cbi-value-field\" data-name=\"port\" data-title=\"端口\">{{user.port}}</td>\n\t\t\t\t<td class=\"td cbi-value-field\" data-name=\"forbidden_port\" data-title=\"禁止端口\">{{user.forbidden_port == '' ? '无' : user.forbidden_port}}</td>\n\t\t\t\t<td class=\"td cbi-value-field\" data-name=\"device_limit\" data-title=\"设备数限制\">{{user.protocol_param}}</td>\n\t\t\t\t<td class=\"td cbi-value-field\" data-name=\"speed_limit_per_con\" data-title=\"单线程限速\">{{user.speed_limit_per_con == '0' ? '无' : user.speed_limit_per_con + ' Kb/s'}}</td>\n\t\t\t\t<td class=\"td cbi-value-field\" data-name=\"speed_limit_per_user\" data-title=\"总限速\">{{user.speed_limit_per_user == '0' ? '无' : user.speed_limit_per_user + ' Kb/s'}}</td>\n\t\t\t\t<td class=\"td cbi-value-field\" data-name=\"used_total_traffic\" data-title=\"已用流量\">{{byte_format(user.u + user.d)}}</td>\n\t\t\t\t<td class=\"td cbi-value-field\" data-name=\"transfer_enable\" data-title=\"可用流量\">{{byte_format(user.transfer_enable)}}</td>\n\t\t\t\t<!-- <td class=\"td cbi-value-field\" data-name=\"ssr_link\" data-title=\"SSR链接\"><a href=\"#\" @click=\"get_link(user)\">获取</a></td> -->\n\n\t\t\t\t<td class=\"td cbi-section-table-cell nowrap cbi-section-actions\">\n\t\t\t\t\t<div>\n\t\t\t\t\t\t<input class=\"cbi-button cbi-button-remove\" type=\"button\" @click=\"clear_transfer(user)\" value=\"清空流量\">\n\t\t\t\t\t\t<input class=\"cbi-button cbi-button-edit\" type=\"button\" value=\"编辑\" :onclick=\"'location.href=\\'/cgi-bin/luci/admin/vpn/ssr_mudb_server/user/' + user.port + '\\''\">\n\t\t\t\t\t\t<input class=\"cbi-button cbi-button-remove\" type=\"button\" @click=\"remove(user)\" value=\"删除\">\n\t\t\t\t\t</div>\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t</template>\n\t</table>\n\t<div class=\"cbi-section-create cbi-tblsection-create\">\n\t\t<input class=\"cbi-button cbi-button-add\" type=\"button\" value=\"添加\" :onclick=\"'location.href=\\'/cgi-bin/luci/admin/vpn/ssr_mudb_server/user\\''\">\n\t</div>\n\t<fieldset class=\"cbi-section\" id=\"_log_fieldset\">\n\t\t<legend>日志</legend>\n\t\t<input class=\"cbi-button cbi-input-remove\" type=\"button\" @click=\"clear_log()\" value=\"清空日志\">\n\t\t<textarea id=\"log_textarea\" class=\"cbi-input-textarea\" style=\"width: 100%;margin-top: 10px;\" rows=\"20\" wrap=\"off\" readonly=\"readonly\"></textarea>\n\t</fieldset>\n</fieldset>\n\n<script>\n\tvar api_url = '<%=luci.dispatcher.build_url(\"admin\", \"vpn\", \"ssr_mudb_server\")%>'\n\tvar vue = new Vue({\n\t\tel: '#users_table',\n\t\tdata: {\n\t\t\ttitle: '用户管理',\n\t\t\tusers: []\n\t\t},\n\t\tmethods: {\n\t\t\tclear_log: function() {\n\t\t\t\tXHR.get(api_url + \"/clear_log\", null,\n\t\t\t\t\tfunction (x, result) {\n\t\t\t\t\t\tif (x.status == 200) {\n\t\t\t\t\t\t\tvar log_textarea = document.getElementById('log_textarea');\n\t\t\t\t\t\t\tlog_textarea.innerHTML = \"\";\n\t\t\t\t\t\t\tlog_textarea.scrollTop = log_textarea.scrollHeight;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t},\n\t\t\tcheck_enable: function(user, e) {\n\t\t\t\tif (e.currentTarget.checked == true) {\n\t\t\t\t\tdocument.getElementById(\"ssr_mudb_server_\" + user.port + \".enable\").value = \"1\";\n\t\t\t\t} else {\n\t\t\t\t\tdocument.getElementById(\"ssr_mudb_server_\" + user.port + \".enable\").value = \"0\";\n\t\t\t\t}\n\t\t\t},\n\t\t\tget_link: function(user) {\n\t\t\t\tXHR.get(api_url + \"/get_link\", { port : user.port },\n\t\t\t\t\tfunction(x, result) {\n\t\t\t\t\t\tif(x && x.status == 200)\n\t\t\t\t\t\t\talert(result.link);\n\t\t\t\t\t}\n\t\t\t\t)\n\t\t\t},\n\t\t\tclear_transfer: function(user) {\n\t\t\t\tif (confirm('确认清空“' + user.user + '”的使用流量吗？') == true) {\n\t\t\t\t\tXHR.get(api_url + \"/clear_traffic\", { port: user.port },\n\t\t\t\t\t\tfunction(x, result) {\n\t\t\t\t\t\t\tif(x && x.status == 200)\n\t\t\t\t\t\t\t\twindow.location.replace(window.location.href);\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t},\n\t\t\tremove: function(user) {\n\t\t\t\tif (confirm('确认删除“' + user.user + '”吗？') == true) {\n\t\t\t\t\tXHR.get(api_url + \"/remove_user\", { port: user.port },\n\t\t\t\t\t\tfunction(x, result) {\n\t\t\t\t\t\t\tif(x && x.status == 200)\n\t\t\t\t\t\t\t\twindow.location.replace(window.location.href);\n\t\t\t\t\t\t}\n\t\t\t\t\t)\n\t\t\t\t}\n\t\t\t},\n\t\t\tbyte_format: function(byte) {\n\t\t\t\tvar suff = [ \"B\", \"KB\", \"MB\", \"GB\", \"TB\" ];\n\t\t\t\tfor (var i = 0; i < suff.length; i++) {\n\t\t\t\t\tif (byte > 1024 && i < suff.length) {\n\t\t\t\t\t\tbyte = (byte / 1024).toFixed(2);\n\t\t\t\t\t} else {\n\t\t\t\t\t\treturn byte + \" \" + suff[i];\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t})\n\n\tXHR.get(api_url + \"/user_list\", null,\n\t\tfunction (x, result) {\n\t\t\tif (x.status == 200) {\n\t\t\t\tvue.users = result;\n\t\t\t}\n\t\t}\n\t)\n\t\n\tXHR.poll(2, api_url + \"/get_log\", null,\n\t\tfunction (x, result) {\n\t\t\tif (x.status == 200) {\n\t\t\t\tvar log_textarea = document.getElementById('log_textarea');\n\t\t\t\tlog_textarea.innerHTML = x.responseText;\n\t\t\t\tlog_textarea.scrollTop = log_textarea.scrollHeight;\n\t\t\t}\n\t\t}\n\t)\n</script>"
  },
  {
    "path": "luci-app-ssr-mudb-server/po/zh_Hans/ssr_mudb_server.po",
    "content": "msgid \"ShadowsocksR MuDB Server\"\nmsgstr \"ShadowsocksR MuDB 服务器\"\n\nmsgid \"SSR MuDB Server\"\nmsgstr \"SSR MuDB 服务器\"\n\nmsgid \"Global Settings\"\nmsgstr \"全局设置\"\n\nmsgid \"Server Config\"\nmsgstr \"服务器配置\"\n\nmsgid \"Users Manager\"\nmsgstr \"用户管理\"\n\nmsgid \"Remarks\"\nmsgstr \"备注\"\n\nmsgid \"Port\"\nmsgstr \"端口\"\n\nmsgid \"Password\"\nmsgstr \"密码\"\n\nmsgid \"Encrypt Method\"\nmsgstr \"加密\"\n\nmsgid \"Protocol\"\nmsgstr \"协议\"\n\nmsgid \"Protocol Param\"\nmsgstr \"协议参数\"\n\nmsgid \"Obfs\"\nmsgstr \"混淆\"\n\nmsgid \"Obfs Param\"\nmsgstr \"混淆参数\"\n\nmsgid \"Connection Timeout\"\nmsgstr \"连接超时时间\"\n\nmsgid \"redirect\"\nmsgstr \"重定向\"\n\nmsgid \"Fast Open\"\nmsgstr \"快速打开\"\n\nmsgid \"UDP Forward\"\nmsgstr \"UDP转发\"\n\nmsgid \"Null\"\nmsgstr \"无\"\n\nmsgid \"No Speed Limit\"\nmsgstr \"不限速\"\n\nmsgid \"Forbidden Port\"\nmsgstr \"禁止的端口\"\n\nmsgid \"Device Limit\"\nmsgstr \"设备数限制\"\n\nmsgid \"Speed Limit Per Con\"\nmsgstr \"单线程限速\"\n\nmsgid \"Speed Limit Per User\"\nmsgstr \"总限速\"\n\nmsgid \"Available Total Flow\"\nmsgstr \"可用总流量\"\n\nmsgid \"Infinite\"\nmsgstr \"无限\"\n\nmsgid \"Used Upload Traffic\"\nmsgstr \"已用上传流量\"\n\nmsgid \"Used Download Traffic\"\nmsgstr \"已用下载流量\"\n\nmsgid \"Used Total Traffic\"\nmsgstr \"已用总流量\"\n\nmsgid \"SSR Link\"\nmsgstr \"SSR链接\"\n\nmsgid \"GET\"\nmsgstr \"获取\"\n\nmsgid \"Clear Traffic\"\nmsgstr \"清空流量\"\n\nmsgid \"Clear All Users Traffic\"\nmsgstr \"清空所有用户流量\"\n\nmsgid \"Enable Auto Clear Traffic\"\nmsgstr \"启用自动清空流量\"\n\nmsgid \"Clear Traffic Time Interval\"\nmsgstr \"流量清空时间间隔\"\n\nmsgid \"*,*,*,*,* is Min Hour Day Mon Week\"\nmsgstr \"*,*,*,*,* 分别对应 分钟 小时 日份 月份 星期<br>0,2,1,*,* 代表 每月1日2点0分<br>0,2,15,*,* 代表 每月15日2点0分<br>0,2,*/7,*,* 代表 每7天2点0分<br>0,2,*,*,0 代表 每个星期日(7)<br>0,2,*,*,3 代表 每个星期三(3)\"\n\nmsgid \"Number of clients that can be linked at the same time (multi-port mode, each port is calculated independently), a minimum of 2 is recommended.\"\nmsgstr \"同一时间能链接的客户端数量(多端口模式，每个端口都是独立计算)，建议最少 2个。\"\n\nmsgid \"Single thread speed limit upper limit, multithreading is invalid. Zero means no speed limit. (unit: KB/S)\"\nmsgstr \"单线程的限速上限，多线程即无效。0代表不限速。(单位：KB/S)\"\n\nmsgid \"Total speed limit upper limit, single port overall speed limit. Zero means no speed limit. (unit: KB/S)\"\nmsgstr \"总速度限速上限，单个端口整体限速。0代表不限速。(单位：KB/S)\"\n\nmsgid \"For example, if port 25 is not allowed, the user will not be able to access the mail port 25 through the SSR agent. If 80,443 is disabled, the user will not be able to access the HTTP/HTTPS website normally. <br>blocked single port format: 25<br>blocked multiple port format: 23,465<br>blocked port format: 233-266<br>blocked multiple port format: 25,465,233-666\"\nmsgstr \"例如不允许访问 25端口，用户就无法通过SSR代理访问邮件端口25了，如果禁止了 80,443 那么用户将无法正常访问 http/https 网站。<br>封禁单个端口格式: 25<br>封禁多个端口格式: 23,465<br>封禁端口段格式: 233-266<br>封禁多种格式端口: 25,465,233-666\"\n\nmsgid \"Maximum amount of total traffic available (GB, 1-838868), Zero means infinite.\"\nmsgstr \"可使用的总流量上限(单位: GB, 1-838868)，0代表无限\"\n\nmsgid \"Alter ID\"\nmsgstr \"额外ID(AlterID)\"\n\nmsgid \"User Level\"\nmsgstr \"用户等级(Level)\"\n\nmsgid \"Transport\"\nmsgstr \"传输方式\"\n\nmsgid \"Camouflage Type\"\nmsgstr \"伪装类型\"\n\nmsgid \"Enabled\"\nmsgstr \"启用\"\n\nmsgid \"Status\"\nmsgstr \"状态\"\n\nmsgid \"Current Condition\"\nmsgstr \"当前状态\"\n\nmsgid \"please Install the python3\"\nmsgstr \"请安装python3环境\"\n\nmsgid \"NOT INSTALLED\"\nmsgstr \"未安装\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\nmsgid \"RUNNING\"\nmsgstr \"运行中\""
  },
  {
    "path": "luci-app-ssr-mudb-server/root/etc/config/ssr_mudb_server",
    "content": "\nconfig global\n\toption auto_clear_transfer '0'\n\toption enable '0'\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/etc/config/ssr_mudb_server.json",
    "content": "[\n   {\n     \"u\": 0,\n     \"method\": \"none\",\n     \"user\": \"test\",\n     \"enable\": 1,\n     \"forbidden_port\": \"\",\n     \"transfer_enable\": 900727656415232,\n     \"passwd\": \"123456\",\n     \"speed_limit_per_user\": 0,\n     \"port\": 50005,\n     \"d\": 0,\n     \"protocol\": \"auth_chain_a\",\n     \"obfs\": \"tls1.2_ticket_auth\",\n     \"protocol_param\": \"10\",\n     \"speed_limit_per_con\": 0\n   }\n ]"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/etc/init.d/ssr_mudb_server",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2018-2020 Lienol <lawlienol@gmail.com>\n\nSTART=99\n\nCONFIG=ssr_mudb_server\nssr_path=/usr/share/$CONFIG\n\nconfig_t_get() {\n\tlocal index=0\n\t[ -n \"$4\" ] && index=$4\n\tlocal ret=$(uci -q get $CONFIG.@$1[$index].$2 2>/dev/null)\n\techo ${ret:=$3}\n}\n\nadd_rule() {\n\tiptables -N SSR_MUDB-SERVER\n\tiptables -I INPUT -j SSR_MUDB-SERVER\n\tlua $ssr_path/firewall.lua\n}\n\ndel_rule() {\n\tcount=$(iptables -n -L INPUT 2>/dev/null | grep -c \"SSR_MUDB-SERVER\")\n\tif [ -n \"$count\" ]; then\n\t\tuntil [ \"$count\" = 0 ]\n\t\tdo\n\t\t\trules=$(iptables -n -L INPUT --line-num 2>/dev/null | grep \"SSR_MUDB-SERVER\" | awk '{print $1}')\n\t\t\tfor rule in $rules\n\t\t\tdo\n\t\t\t\tiptables -D INPUT $rule 2>/dev/null\n\t\t\t\tbreak\n\t\t\tdone\n\t\t\tcount=$(expr $count - 1)\n\t\tdone\n\tfi\n\tiptables -F SSR_MUDB-SERVER 2>/dev/null && iptables -X SSR_MUDB-SERVER 2>/dev/null\n}\n\ngen_include() {\n\techo '#!/bin/sh' > /var/etc/$CONFIG.include\n\textract_rules() {\n\t\techo \"*$1\"\n\t\tiptables-save -t $1 | grep \"SSR_MUDB-SERVER\" | \\\n\t\tsed -e \"s/^-A \\(INPUT\\)/-I \\1 1/\"\n\t\techo 'COMMIT'\n\t}\n\tcat <<-EOF >> /var/etc/$CONFIG.include\n\t\tiptables-save -c | grep -v \"SSR_MUDB-SERVER\" | iptables-restore -c\n\t\tiptables-restore -n <<-EOT\n\t\t$(extract_rules filter)\n\t\tEOT\n\tEOF\n\treturn 0\n}\n\nset_ssr_python_crontab() {\n\tif [ \"$1\" -eq 1 ];then\n\t\tauto_clear_transfer=$(config_t_get global auto_clear_transfer 0)\n\t\tif [ \"$auto_clear_transfer\" = \"0\" ];then\n\t\t\tsed -i '/clear_traffic_all_users.sh/d' /etc/crontabs/root >/dev/null 2>&1 &\n\t\telse\n\t\t\tauto_clear_transfer_time=$(config_t_get global auto_clear_transfer_time)\n\t\t\t[ -n \"$auto_clear_transfer_time\" ] && auto_clear_transfer_time=$(echo $auto_clear_transfer_time | tr ',' ' ')\n\t\t\techo \"$auto_clear_transfer_time $ssr_path/clear_traffic_all_users.sh >/dev/null 2>&1\" >> /etc/crontabs/root\n\t\tfi\n\telse\n\t\tsed -i '/clear_traffic_all_users.sh/d' /etc/crontabs/root >/dev/null 2>&1 &\n\tfi\n\t/etc/init.d/cron restart\n}\n\nstart_ssr_python_server() {\n\t/usr/bin/python3 $ssr_path/server.py >> /var/log/$CONFIG.log 2>&1 &\n\tset_ssr_python_crontab 1\n\tadd_rule\n\tgen_include\n}\n\nstop_ssr_python_server() {\n\tbusybox ps -w | grep \"$ssr_path/server.py\" | grep -v \"grep\" | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1 &\n\tset_ssr_python_crontab 0\n\tdel_rule\n\trm -rf /var/log/$CONFIG.log /var/etc/$CONFIG.include\n}\n\nstart() {\n\tenable=$(config_t_get global enable 0)\n\tif [ \"$enable\" -eq 1 ];then\n\t\tusers_config=$(cat $ssr_path/userapiconfig.py | grep \"MUDB_FILE\" | cut -d \"'\" -f 2)\n\t\t[ -n \"$users_config\" ] && cp -rf $users_config $ssr_path/mudb_backup.json\n\t\tstart_ssr_python_server\n\telse\n\t\tstop_ssr_python_server\n\tfi\n}\n\nstop() {\n\tstop_ssr_python_server\n}\n\nrestart() {\n\tstop\n\tstart\n}"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/etc/uci-defaults/luci-app-ssr-mudb-server",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete firewall.ssr_mudb_server\n\tset firewall.ssr_mudb_server=include\n\tset firewall.ssr_mudb_server.type=script\n\tset firewall.ssr_mudb_server.path=/var/etc/ssr_mudb_server.include\n\tset firewall.ssr_mudb_server.reload=1\nEOF\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@ssr_mudb_server[-1]\n\tadd ucitrack ssr_mudb_server\n\tset ucitrack.@ssr_mudb_server[-1].init=ssr_mudb_server\n\tcommit ucitrack\nEOF\n\nchmod a+x /usr/share/ssr_mudb_server/* >/dev/null 2>&1\ncp -rf /usr/bin/python3 /usr/bin/python\nrm -rf /tmp/luci-*cache\nexit 0\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/rpcd/acl.d/luci-app-ssr-mudb-server.json",
    "content": "{\n\t\"luci-app-ssr-mudb-server\": {\n\t\t\"description\": \"Grant UCI access for luci-app-ssr-mudb-server\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"ssr_mudb_server\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"ssr_mudb_server\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/.travis.yml",
    "content": "language: python\npython:\n  - 2.6\n  - 2.7\n  - 3.3\n  - 3.4\ncache:\n  directories:\n    - dante-1.4.0\nbefore_install:\n  - sudo apt-get update -qq\n  - sudo apt-get install -qq build-essential dnsutils iproute nginx bc\n  - sudo dd if=/dev/urandom of=/usr/share/nginx/www/file bs=1M count=10\n  - sudo sh -c \"echo '127.0.0.1    localhost' > /etc/hosts\"\n  - sudo service nginx restart\n  - pip install pep8 pyflakes nose coverage PySocks cymysql\n  - sudo tests/socksify/install.sh\n  - sudo tests/libsodium/install.sh\n  - sudo tests/setup_tc.sh\nscript:\n  - tests/jenkins.sh\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/CHANGES",
    "content": "3.4.0 2017-07-27\n- add auth_chain_b\n- add initmudbjson.sh\n- allow set speed limit in runtime\n- fix bugs & mem leak\n\n3.3.3 2017-06-03\n- add DNS cache\n- add tls1.2_ticket_fastauth\n- fix bugs\n\n3.3.2 2017-05-20\n- revert http reply\n- refine tls1.2_ticket_auth error detector\n\n3.3.1 2017-05-18\n- fix stop script\n- Async DNS query under UDP\n- fix old version of OpenSSL\n- http reply\n\n3.3.0 2017-05-11\n- connect_log include local addr & port\n- fix auth_chain_a UDP bug\n- add \"additional_ports_only\"\n- add interface legendsockssr\n- run with newest python version\n- parse comment in hosts\n- update mujson_mgr\n- add cymysql setup script\n- new speed tester\n- fix leaks\n- bugs fixed\n\n3.2.0 2017-04-27\n- add auth_chain_a\n- remove auth_aes128, auth_sha1, auth_sha1_v2, verify_simple, auth_simple, verify_sha1\n\n3.1.2 2017-04-07\n- display UID\n- auto adjust TCP MSS\n\n3.1.1 2017-03-25\n- add \"New session ticket\"\n- ignore bind 10.0.0.0/8 and 192.168.0.0/16 by default\n- improve rand size under auth_aes128_*\n- fix bugs\n\n3.1.0 2017-03-16\n- add \"glzjinmod\" interface\n- rate limit\n- add additional_ports in config\n\n3.0.4 2017-01-08\n- multi-user in single port\n\n3.0.1 2017-01-03\n- remove auth_aes128_*_compatible\n\n3.0.0 2016-12-23\n- http_simple fix bugs\n- tls1.2_ticket_auth fix bug & defaule time diff set to 86400s\n\n2.9.7 2016-11-22\n- manage client with LRUCache\n- catch bind error\n- fix import error of resource on windows\n- print RLIMIT_NOFILE\n- always close cymysql objects\n- add init script\n\n2.9.6 2016-10-17\n- tls1.2_ticket_auth random packet size\n\n2.9.5.1 2016-10-16\n- UDP bind address\n\n2.9.5 2016-10-13\n- add auth_aes128_md5 and auth_aes128_sha1\n\n2.9.4 2016-10-11\n- sync client version\n\n2.6.13 2015-11-02\n- add protocol setting\n\n2.6.12 2015-10-27\n- IPv6 first\n- Fix mem leaks\n- auth_simple plugin\n- remove FORCE_NEW_PROTOCOL\n- optimize code\n\n2.6.11 2015-10-20\n- Obfs plugin\n- Obfs parameters\n- UDP over TCP\n- TCP over UDP (experimental)\n- Fix socket leaks\n- Catch abnormal UDP package\n\n2.6.10 2015-06-08\n- Optimize LRU cache\n- Refine logging\n\n2.6.9 2015-05-19\n- Fix a stability issue on Windows\n\n2.6.8 2015-02-10\n- Support multiple server ip on client side\n- Support --version\n- Minor fixes\n\n2.6.7 2015-02-02\n- Support --user\n- Support CIDR format in --forbidden-ip\n- Minor fixes\n\n2.6.6 2015-01-23\n- Fix a crash in forbidden list\n\n2.6.5 2015-01-18\n- Try both 32 bit and 64 bit dll on Windows\n\n2.6.4 2015-01-14\n- Also search lib* when searching libraries\n\n2.6.3 2015-01-12\n- Support --forbidden-ip to ban some IP, i.e. localhost\n- Search OpenSSL and libsodium harder\n- Now works on OpenWRT\n\n2.6.2 2015-01-03\n- Log client IP\n\n2.6.1 2014-12-26\n- Fix a problem with TCP Fast Open on local side\n- Fix sometimes daemon_start returns wrong exit status\n\n2.6 2014-12-21\n- Add daemon support\n\n2.5 2014-12-11\n- Add salsa20 and chacha20\n\n2.4.3 2014-11-10\n- Fix an issue on Python 3\n- Fix an issue with IPv6\n\n2.4.2 2014-11-06\n- Fix command line arguments on Python 3\n- Support table on Python 3\n- Fix TCP Fast Open on Python 3\n\n2.4.1 2014-11-01\n- Fix setup.py for non-utf8 locales on Python 3\n\n2.4 2014-11-01\n- Python 3 support\n- Performance improvement\n- Fix LRU cache behavior\n\n2.3.2 2014-10-11\n- Fix OpenSSL on Windows\n\n2.3.1 2014-10-09\n- Does not require M2Crypto any more\n\n2.3 2014-09-23\n- Support CFB1, CFB8 and CTR mode of AES\n- Do not require password config when using port_password\n- Use SIGTERM instead of SIGQUIT on Windows\n\n2.2.2 2014-09-14\n- Fix when multiple DNS set, IPv6 only sites are broken\n\n2.2.1 2014-09-10\n- Support graceful shutdown\n- Fix some bugs\n\n2.2.0 2014-09-09\n- Add RC4-MD5 encryption\n\n2.1.0 2014-08-10\n- Use only IPv4 DNS server\n- Does not ship config.json\n- Better error message\n\n2.0.12 2014-07-26\n- Support -q quiet mode\n- Exit 0 when showing help with -h\n\n2.0.11 2014-07-12\n- Prefers IP addresses over hostnames, more friendly with socksify and openvpn\n\n2.0.10 2014-07-11\n- Fix UDP on local\n\n2.0.9 2014-07-06\n- Fix EWOULDBLOCK on Windows\n- Fix Unicode config problem on some platforms\n\n2.0.8 2014-06-23\n- Use multiple DNS to query hostnames\n\n2.0.7 2014-06-21\n- Fix fastopen on local\n- Fallback when fastopen is not available\n- Add verbose logging mode -vv\n- Verify if hostname is valid\n\n2.0.6 2014-06-19\n- Fix CPU 100% on POLL_HUP\n- More friendly logging\n\n2.0.5 2014-06-18\n- Support a simple config format for multiple ports\n\n2.0.4 2014-06-12\n- Fix worker master\n\n2.0.3 2014-06-11\n- Fix table encryption with UDP\n\n2.0.2 2014-06-11\n- Add asynchronous DNS in TCP relay\n\n2.0.1 2014-06-05\n- Better logging\n- Maybe fix bad file descriptor\n\n2.0 2014-06-05\n- Use a new event model\n- Remove gevent\n- Refuse to use default password\n- Fix a problem when using multiple passwords with table encryption\n\n1.4.5 2014-05-24\n- Add timeout in TCP server\n- Close sockets in master process\n\n1.4.4 2014-05-17\n- Support multiple workers\n\n1.4.3 2014-05-13\n- Fix Windows\n\n1.4.2 2014-05-10\n- Add salsa20-ctr cipher\n\n1.4.1 2014-05-03\n- Fix error log\n- Fix EINPROGESS with some version of gevent\n\n1.4.0 2014-05-02\n- Adds UDP relay\n- TCP fast open support on Linux 3.7+\n\n1.3.7 2014-04-10\n- Fix a typo in help\n\n1.3.6 2014-04-10\n- Fix a typo in help\n\n1.3.5 2014-04-07\n- Add help\n- Change default local binding address into 127.0.0.1\n\n1.3.4 2014-02-17\n- Fix a bug when no config file exists\n- Client now support multiple server ports and multiple server/port pairs\n- Better error message with bad config.json format and wrong password\n\n1.3.3 2013-07-09\n- Fix default key length of rc2\n\n1.3.2 2013-07-04\n- Server will listen at server IP specified in config\n- Check config file and show some warning messages\n\n1.3.1 2013-06-29\n- Fix -c arg\n\n1.3.0 2013-06-22\n- Move to pypi\n\n1.2.3 2013-06-14\n- add bind address\n\n1.2.2 2013-05-31\n- local can listen at ::0 with -6 arg; bump 1.2.2\n\n1.2.1 2013-05-23\n- Fix an OpenSSL crash\n\n1.2 2013-05-22\n- Use random iv, we finally have strong encryption\n\n1.1.1 2013-05-21\n- Add encryption, AES, blowfish, etc.\n\n1.1 2013-05-16\n- Support IPv6 addresses (type 4)\n- Drop Python 2.5 support\n\n1.0 2013-04-03\n- Fix -6 IPv6\n\n0.9.4 2013-03-04\n- Support Python 2.5\n\n0.9.3 2013-01-14\n- Fix conn termination null data\n\n0.9.2 2013-01-05\n- Change default timeout\n\n0.9.1 2013-01-05\n- Add Travis-CI test\n\n0.9 2012-12-30\n- Replace send with sendall, fix FreeBSD\n\n0.6 2012-12-06\n- Support args\n\n0.5 2012-11-08\n- Fix encryption with negative md5sum\n\n0.4 2012-11-02\n- Move config into a JSON file\n- Auto-detect config path\n\n0.3 2012-06-06\n- Move socks5 negotiation to local\n\n0.2 2012-05-11\n- Add -6 arg for IPv6\n- Fix socket.error\n\n0.1 2012-04-20\n- Initial version\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/Dockerfile",
    "content": "FROM alpine:3.6\n\nENV SERVER_ADDR     0.0.0.0\nENV SERVER_PORT     51348\nENV PASSWORD        psw\nENV METHOD          aes-128-ctr\nENV PROTOCOL        auth_aes128_md5\nENV PROTOCOLPARAM   32\nENV OBFS            tls1.2_ticket_auth_compatible\nENV TIMEOUT         300\nENV DNS_ADDR        8.8.8.8\nENV DNS_ADDR_2      8.8.4.4\n\nARG BRANCH=manyuser\nARG WORK=~\n\n\nRUN apk --no-cache add python \\\n    libsodium \\\n    wget\n\n\nRUN mkdir -p $WORK && \\\n    wget -qO- --no-check-certificate https://github.com/shadowsocksr/shadowsocksr/archive/$BRANCH.tar.gz | tar -xzf - -C $WORK\n\n\nWORKDIR $WORK/shadowsocksr-$BRANCH/shadowsocks\n\n\nEXPOSE $SERVER_PORT\nCMD python server.py -p $SERVER_PORT -k $PASSWORD -m $METHOD -O $PROTOCOL -o $OBFS -G $PROTOCOLPARAM\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/MANIFEST.in",
    "content": "recursive-include shadowsocks *.py\ninclude README.rst\ninclude LICENSE\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/apiconfig.py",
    "content": "﻿# Config\nAPI_INTERFACE = 'sspanelv2' #mudbjson, sspanelv2, sspanelv3, sspanelv3ssr, glzjinmod, legendsockssr, muapiv2(not support)\nUPDATE_TIME = 60\nSERVER_PUB_ADDR = '127.0.0.1' # mujson_mgr need this to generate ssr link\n\n#mudb\nMUDB_FILE = '/etc/config/ssr_mudb_server.json'\n\n# Mysql\nMYSQL_CONFIG = 'usermysql.json'\n\n# API\nMUAPI_CONFIG = 'usermuapi.json'\n\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/asyncmgr.py",
    "content": "﻿#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n# Copyright (c) 2014 clowwindy\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nimport time\nimport os\nimport socket\nimport struct\nimport re\nimport logging\nfrom shadowsocks import common\nfrom shadowsocks import lru_cache\nfrom shadowsocks import eventloop\nimport server_pool\nimport Config\n\nclass ServerMgr(object):\n\n    def __init__(self):\n        self._loop = None\n        self._request_id = 1\n        self._hosts = {}\n        self._hostname_status = {}\n        self._hostname_to_cb = {}\n        self._cb_to_hostname = {}\n        self._last_time = time.time()\n        self._sock = None\n        self._servers = None\n\n    def add_to_loop(self, loop):\n        if self._loop:\n            raise Exception('already add to loop')\n        self._loop = loop\n        # TODO when dns server is IPv6\n        self._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM,\n                                   socket.SOL_UDP)\n        self._sock.bind((Config.MANAGE_BIND_IP, Config.MANAGE_PORT))\n        self._sock.setblocking(False)\n        loop.add(self._sock, eventloop.POLL_IN, self)\n\n    def _handle_data(self, sock):\n        data, addr = sock.recvfrom(128)\n        #manage pwd:port:passwd:action\n        args = data.split(':')\n        if len(args) < 4:\n            return\n        if args[0] == Config.MANAGE_PASS:\n            if args[3] == '0':\n                server_pool.ServerPool.get_instance().cb_del_server(args[1])\n            elif args[3] == '1':\n                server_pool.ServerPool.get_instance().new_server(args[1], args[2])\n\n    def handle_event(self, sock, fd, event):\n        if sock != self._sock:\n            return\n        if event & eventloop.POLL_ERR:\n            logging.error('mgr socket err')\n            self._loop.remove(self._sock)\n            self._sock.close()\n            # TODO when dns server is IPv6\n            self._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM,\n                                       socket.SOL_UDP)\n            self._sock.setblocking(False)\n            self._loop.add(self._sock, eventloop.POLL_IN, self)\n        else:\n            self._handle_data(sock)\n\n    def close(self):\n        if self._sock:\n            if self._loop:\n                self._loop.remove(self._sock)\n            self._sock.close()\n            self._sock = None\n\n\ndef test():\n    pass\n\nif __name__ == '__main__':\n    test()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/clear_traffic_all_users.sh",
    "content": "#!/bin/sh\n\ncd /usr/share/ssr_mudb_server\nuser_total=$(python3 mujson_mgr.py -l | wc -l)\n[ $user_total -eq 0 ] && echo -e \"没有发现用户，请检查 !\" && exit 1\nfor i in $(seq 1 $user_total)\ndo\n\tport=$(python3 mujson_mgr.py -l | sed -n ${i}p | awk '{print $4}')\n\tmatch_clear=$(python3 mujson_mgr.py -c -p \"${port}\")\ndone\nexit\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/config.json",
    "content": "{\n    \"server\": \"0.0.0.0\",\n    \"server_ipv6\": \"::\",\n    \"server_port\": 8388,\n    \"local_address\": \"127.0.0.1\",\n    \"local_port\": 1080,\n\n    \"password\": \"m\",\n    \"method\": \"aes-128-ctr\",\n    \"protocol\": \"auth_aes128_md5\",\n    \"protocol_param\": \"\",\n    \"obfs\": \"tls1.2_ticket_auth_compatible\",\n    \"obfs_param\": \"\",\n    \"speed_limit_per_con\": 0,\n    \"speed_limit_per_user\": 0,\n\n    \"additional_ports\" : {}, // only works under multi-user mode\n    \"additional_ports_only\" : false, // only works under multi-user mode\n    \"timeout\": 120,\n    \"udp_timeout\": 60,\n    \"dns_ipv6\": false,\n    \"connect_verbose_info\": 0,\n    \"redirect\": \"\",\n    \"fast_open\": false\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/configloader.py",
    "content": "﻿#!/usr/bin/python\n# -*- coding: UTF-8 -*-\nimport importloader\n\ng_config = None\n\ndef load_config():\n\tglobal g_config\n\tg_config = importloader.loads(['userapiconfig', 'apiconfig'])\n\ndef get_config():\n\treturn g_config\n\nload_config()\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/db_transfer.py",
    "content": "﻿#!/usr/bin/python\n# -*- coding: UTF-8 -*-\n\nimport logging\nimport time\nimport sys\nfrom server_pool import ServerPool\nimport traceback\nfrom shadowsocks import common, shell, lru_cache, obfs\nfrom configloader import load_config, get_config\nimport importloader\n\nswitchrule = None\ndb_instance = None\n\nclass TransferBase(object):\n\tdef __init__(self):\n\t\timport threading\n\t\tself.event = threading.Event()\n\t\tself.key_list = ['port', 'u', 'd', 'transfer_enable', 'passwd', 'enable']\n\t\tself.last_get_transfer = {} #上一次的实际流量\n\t\tself.last_update_transfer = {} #上一次更新到的流量（小于等于实际流量）\n\t\tself.force_update_transfer = set() #强制推入数据库的ID\n\t\tself.port_uid_table = {} #端口到uid的映射（仅v3以上有用）\n\t\tself.onlineuser_cache = lru_cache.LRUCache(timeout=60*30) #用户在线状态记录\n\t\tself.pull_ok = False #记录是否已经拉出过数据\n\t\tself.mu_ports = {}\n\n\tdef load_cfg(self):\n\t\tpass\n\n\tdef push_db_all_user(self):\n\t\tif self.pull_ok is False:\n\t\t\treturn\n\t\t#更新用户流量到数据库\n\t\tlast_transfer = self.last_update_transfer\n\t\tcurr_transfer = ServerPool.get_instance().get_servers_transfer()\n\t\t#上次和本次的增量\n\t\tdt_transfer = {}\n\t\tfor id in self.force_update_transfer: #此表中的用户统计上次未计入的流量\n\t\t\tif id in self.last_get_transfer and id in last_transfer:\n\t\t\t\tdt_transfer[id] = [self.last_get_transfer[id][0] - last_transfer[id][0], self.last_get_transfer[id][1] - last_transfer[id][1]]\n\n\t\tfor id in curr_transfer.keys():\n\t\t\tif id in self.force_update_transfer or id in self.mu_ports:\n\t\t\t\tcontinue\n\t\t\t#算出与上次记录的流量差值，保存于dt_transfer表\n\t\t\tif id in last_transfer:\n\t\t\t\tif curr_transfer[id][0] + curr_transfer[id][1] - last_transfer[id][0] - last_transfer[id][1] <= 0:\n\t\t\t\t\tcontinue\n\t\t\t\tdt_transfer[id] = [curr_transfer[id][0] - last_transfer[id][0],\n\t\t\t\t\t\t\t\tcurr_transfer[id][1] - last_transfer[id][1]]\n\t\t\telse:\n\t\t\t\tif curr_transfer[id][0] + curr_transfer[id][1] <= 0:\n\t\t\t\t\tcontinue\n\t\t\t\tdt_transfer[id] = [curr_transfer[id][0], curr_transfer[id][1]]\n\n\t\t\t#有流量的，先记录在线状态\n\t\t\tif id in self.last_get_transfer:\n\t\t\t\tif curr_transfer[id][0] + curr_transfer[id][1] > self.last_get_transfer[id][0] + self.last_get_transfer[id][1]:\n\t\t\t\t\tself.onlineuser_cache[id] = curr_transfer[id][0] + curr_transfer[id][1]\n\t\t\telse:\n\t\t\t\tself.onlineuser_cache[id] = curr_transfer[id][0] + curr_transfer[id][1]\n\n\t\tself.onlineuser_cache.sweep()\n\n\t\tupdate_transfer = self.update_all_user(dt_transfer) #返回有更新的表\n\t\tfor id in update_transfer.keys(): #其增量加在此表\n\t\t\tif id not in self.force_update_transfer: #但排除在force_update_transfer内的\n\t\t\t\tlast = self.last_update_transfer.get(id, [0,0])\n\t\t\t\tself.last_update_transfer[id] = [last[0] + update_transfer[id][0], last[1] + update_transfer[id][1]]\n\t\tself.last_get_transfer = curr_transfer\n\t\tfor id in self.force_update_transfer:\n\t\t\tif id in self.last_update_transfer:\n\t\t\t\tdel self.last_update_transfer[id]\n\t\t\tif id in self.last_get_transfer:\n\t\t\t\tdel self.last_get_transfer[id]\n\t\tself.force_update_transfer = set()\n\n\tdef del_server_out_of_bound_safe(self, last_rows, rows):\n\t\t#停止超流量的服务\n\t\t#启动没超流量的服务\n\t\ttry:\n\t\t\tswitchrule = importloader.load('switchrule')\n\t\texcept Exception as e:\n\t\t\tlogging.error('load switchrule.py fail')\n\t\tcur_servers = {}\n\t\tnew_servers = {}\n\t\tallow_users = {}\n\t\tmu_servers  = {}\n\t\tconfig = shell.get_config(False)\n\t\tfor row in rows:\n\t\t\ttry:\n\t\t\t\tallow = switchrule.isTurnOn(row) and row['enable'] == 1 and row['u'] + row['d'] < row['transfer_enable']\n\t\t\texcept Exception as e:\n\t\t\t\tallow = False\n\n\t\t\tport = row['port']\n\t\t\tpasswd = common.to_bytes(row['passwd'])\n\t\t\tif hasattr(passwd, 'encode'):\n\t\t\t\tpasswd = passwd.encode('utf-8')\n\t\t\tcfg = {'password': passwd}\n\t\t\tif 'id' in row:\n\t\t\t\tself.port_uid_table[row['port']] = row['id']\n\n\t\t\tread_config_keys = ['method', 'obfs', 'obfs_param', 'protocol', 'protocol_param', 'forbidden_ip', 'forbidden_port', 'speed_limit_per_con', 'speed_limit_per_user']\n\t\t\tfor name in read_config_keys:\n\t\t\t\tif name in row and row[name]:\n\t\t\t\t\tcfg[name] = row[name]\n\n\t\t\tmerge_config_keys = ['password'] + read_config_keys\n\t\t\tfor name in cfg.keys():\n\t\t\t\tif hasattr(cfg[name], 'encode'):\n\t\t\t\t\ttry:\n\t\t\t\t\t\tcfg[name] = cfg[name].encode('utf-8')\n\t\t\t\t\texcept Exception as e:\n\t\t\t\t\t\tlogging.warning('encode cfg key \"%s\" fail, val \"%s\"' % (name, cfg[name]))\n\n\t\t\tif port not in cur_servers:\n\t\t\t\tcur_servers[port] = passwd\n\t\t\telse:\n\t\t\t\tlogging.error('more than one user use the same port [%s]' % (port,))\n\t\t\t\tcontinue\n\n\t\t\tif 'protocol' in cfg and 'protocol_param' in cfg and common.to_str(cfg['protocol']) in obfs.mu_protocol():\n\t\t\t\tif '#' in common.to_str(cfg['protocol_param']):\n\t\t\t\t\tmu_servers[port] = passwd\n\t\t\t\t\tallow = True\n\n\t\t\tif allow:\n\t\t\t\tif port not in mu_servers:\n\t\t\t\t\tallow_users[port] = cfg\n\n\t\t\t\tcfgchange = False\n\t\t\t\tif port in ServerPool.get_instance().tcp_servers_pool:\n\t\t\t\t\trelay = ServerPool.get_instance().tcp_servers_pool[port]\n\t\t\t\t\tfor name in merge_config_keys:\n\t\t\t\t\t\tif name in cfg and not self.cmp(cfg[name], relay._config[name]):\n\t\t\t\t\t\t\tcfgchange = True\n\t\t\t\t\t\t\tbreak\n\t\t\t\tif not cfgchange and port in ServerPool.get_instance().tcp_ipv6_servers_pool:\n\t\t\t\t\trelay = ServerPool.get_instance().tcp_ipv6_servers_pool[port]\n\t\t\t\t\tfor name in merge_config_keys:\n\t\t\t\t\t\tif (name in cfg) and ((name not in relay._config) or not self.cmp(cfg[name], relay._config[name])):\n\t\t\t\t\t\t\tcfgchange = True\n\t\t\t\t\t\t\tbreak\n\n\t\t\tif port in mu_servers:\n\t\t\t\tif ServerPool.get_instance().server_is_run(port) > 0:\n\t\t\t\t\tif cfgchange:\n\t\t\t\t\t\tlogging.info('db stop server at port [%s] reason: config changed: %s' % (port, cfg))\n\t\t\t\t\t\tServerPool.get_instance().cb_del_server(port)\n\t\t\t\t\t\tself.force_update_transfer.add(port)\n\t\t\t\t\t\tnew_servers[port] = (passwd, cfg)\n\t\t\t\telse:\n\t\t\t\t\tself.new_server(port, passwd, cfg)\n\t\t\telse:\n\t\t\t\tif ServerPool.get_instance().server_is_run(port) > 0:\n\t\t\t\t\tif config['additional_ports_only'] or not allow:\n\t\t\t\t\t\tlogging.info('db stop server at port [%s]' % (port,))\n\t\t\t\t\t\tServerPool.get_instance().cb_del_server(port)\n\t\t\t\t\t\tself.force_update_transfer.add(port)\n\t\t\t\t\telse:\n\t\t\t\t\t\tif cfgchange:\n\t\t\t\t\t\t\tlogging.info('db stop server at port [%s] reason: config changed: %s' % (port, cfg))\n\t\t\t\t\t\t\tServerPool.get_instance().cb_del_server(port)\n\t\t\t\t\t\t\tself.force_update_transfer.add(port)\n\t\t\t\t\t\t\tnew_servers[port] = (passwd, cfg)\n\n\t\t\t\telif not config['additional_ports_only'] and allow and port > 0 and port < 65536 and ServerPool.get_instance().server_run_status(port) is False:\n\t\t\t\t\tself.new_server(port, passwd, cfg)\n\n\t\tfor row in last_rows:\n\t\t\tif row['port'] in cur_servers:\n\t\t\t\tpass\n\t\t\telse:\n\t\t\t\tlogging.info('db stop server at port [%s] reason: port not exist' % (row['port']))\n\t\t\t\tServerPool.get_instance().cb_del_server(row['port'])\n\t\t\t\tself.clear_cache(row['port'])\n\t\t\t\tif row['port'] in self.port_uid_table:\n\t\t\t\t\tdel self.port_uid_table[row['port']]\n\n\t\tif len(new_servers) > 0:\n\t\t\tfrom shadowsocks import eventloop\n\t\t\tself.event.wait(eventloop.TIMEOUT_PRECISION + eventloop.TIMEOUT_PRECISION / 2)\n\t\t\tfor port in new_servers.keys():\n\t\t\t\tpasswd, cfg = new_servers[port]\n\t\t\t\tself.new_server(port, passwd, cfg)\n\n\t\tlogging.debug('db allow users %s \\nmu_servers %s' % (allow_users, mu_servers))\n\t\tfor port in mu_servers:\n\t\t\tServerPool.get_instance().update_mu_users(port, allow_users)\n\n\t\tself.mu_ports = mu_servers\n\n\tdef clear_cache(self, port):\n\t\tif port in self.force_update_transfer: del self.force_update_transfer[port]\n\t\tif port in self.last_get_transfer: del self.last_get_transfer[port]\n\t\tif port in self.last_update_transfer: del self.last_update_transfer[port]\n\n\tdef new_server(self, port, passwd, cfg):\n\t\tprotocol = cfg.get('protocol', ServerPool.get_instance().config.get('protocol', 'origin'))\n\t\tmethod = cfg.get('method', ServerPool.get_instance().config.get('method', 'None'))\n\t\tobfs = cfg.get('obfs', ServerPool.get_instance().config.get('obfs', 'plain'))\n\t\tlogging.info('db start server at port [%s] pass [%s] protocol [%s] method [%s] obfs [%s]' % (port, passwd, protocol, method, obfs))\n\t\tServerPool.get_instance().new_server(port, cfg)\n\n\tdef cmp(self, val1, val2):\n\t\tif type(val1) is bytes:\n\t\t\tval1 = common.to_str(val1)\n\t\tif type(val2) is bytes:\n\t\t\tval2 = common.to_str(val2)\n\t\treturn val1 == val2\n\n\t@staticmethod\n\tdef del_servers():\n\t\tfor port in [v for v in ServerPool.get_instance().tcp_servers_pool.keys()]:\n\t\t\tif ServerPool.get_instance().server_is_run(port) > 0:\n\t\t\t\tServerPool.get_instance().cb_del_server(port)\n\t\tfor port in [v for v in ServerPool.get_instance().tcp_ipv6_servers_pool.keys()]:\n\t\t\tif ServerPool.get_instance().server_is_run(port) > 0:\n\t\t\t\tServerPool.get_instance().cb_del_server(port)\n\n\t@staticmethod\n\tdef thread_db(obj):\n\t\timport socket\n\t\timport time\n\t\tglobal db_instance\n\t\ttimeout = 60\n\t\tsocket.setdefaulttimeout(timeout)\n\t\tlast_rows = []\n\t\tdb_instance = obj()\n\t\tServerPool.get_instance()\n\t\tshell.log_shadowsocks_version()\n\n\t\ttry:\n\t\t\timport resource\n\t\t\tlogging.info('current process RLIMIT_NOFILE resource: soft %d hard %d'  % resource.getrlimit(resource.RLIMIT_NOFILE))\n\t\texcept:\n\t\t\tpass\n\n\t\ttry:\n\t\t\twhile True:\n\t\t\t\tload_config()\n\t\t\t\tdb_instance.load_cfg()\n\t\t\t\ttry:\n\t\t\t\t\tdb_instance.push_db_all_user()\n\t\t\t\t\trows = db_instance.pull_db_all_user()\n\t\t\t\t\tif rows:\n\t\t\t\t\t\tdb_instance.pull_ok = True\n\t\t\t\t\t\tconfig = shell.get_config(False)\n\t\t\t\t\t\tfor port in config['additional_ports']:\n\t\t\t\t\t\t\tval = config['additional_ports'][port]\n\t\t\t\t\t\t\tval['port'] = int(port)\n\t\t\t\t\t\t\tval['enable'] = 1\n\t\t\t\t\t\t\tval['transfer_enable'] = 1024 ** 7\n\t\t\t\t\t\t\tval['u'] = 0\n\t\t\t\t\t\t\tval['d'] = 0\n\t\t\t\t\t\t\tif \"password\" in val:\n\t\t\t\t\t\t\t\tval[\"passwd\"] = val[\"password\"]\n\t\t\t\t\t\t\trows.append(val)\n\t\t\t\t\tdb_instance.del_server_out_of_bound_safe(last_rows, rows)\n\t\t\t\t\tlast_rows = rows\n\t\t\t\texcept Exception as e:\n\t\t\t\t\ttrace = traceback.format_exc()\n\t\t\t\t\tlogging.error(trace)\n\t\t\t\t\t#logging.warn('db thread except:%s' % e)\n\t\t\t\tif db_instance.event.wait(get_config().UPDATE_TIME) or not ServerPool.get_instance().thread.is_alive():\n\t\t\t\t\tbreak\n\t\texcept KeyboardInterrupt as e:\n\t\t\tpass\n\t\tdb_instance.del_servers()\n\t\tServerPool.get_instance().stop()\n\t\tdb_instance = None\n\n\t@staticmethod\n\tdef thread_db_stop():\n\t\tglobal db_instance\n\t\tdb_instance.event.set()\n\nclass DbTransfer(TransferBase):\n\tdef __init__(self):\n\t\tsuper(DbTransfer, self).__init__()\n\t\tself.user_pass = {} #记录更新此用户流量时被跳过多少次\n\t\tself.cfg = {\n\t\t\t\"host\": \"127.0.0.1\",\n\t\t\t\"port\": 3306,\n\t\t\t\"user\": \"ss\",\n\t\t\t\"password\": \"pass\",\n\t\t\t\"db\": \"shadowsocks\",\n\t\t\t\"node_id\": 0,\n\t\t\t\"transfer_mul\": 1.0,\n\t\t\t\"ssl_enable\": 0,\n\t\t\t\"ssl_ca\": \"\",\n\t\t\t\"ssl_cert\": \"\",\n\t\t\t\"ssl_key\": \"\"}\n\t\tself.load_cfg()\n\n\tdef load_cfg(self):\n\t\timport json\n\t\tconfig_path = get_config().MYSQL_CONFIG\n\t\tcfg = None\n\t\twith open(config_path, 'rb+') as f:\n\t\t\tcfg = json.loads(f.read().decode('utf8'))\n\n\t\tif cfg:\n\t\t\tself.cfg.update(cfg)\n\n\tdef update_all_user(self, dt_transfer):\n\t\timport cymysql\n\t\tupdate_transfer = {}\n\t\t\n\t\tquery_head = 'UPDATE user'\n\t\tquery_sub_when = ''\n\t\tquery_sub_when2 = ''\n\t\tquery_sub_in = None\n\t\tlast_time = time.time()\n\n\t\tfor id in dt_transfer.keys():\n\t\t\ttransfer = dt_transfer[id]\n\t\t\t#小于最低更新流量的先不更新\n\t\t\tupdate_trs = 1024 * (2048 - self.user_pass.get(id, 0) * 64)\n\t\t\tif transfer[0] + transfer[1] < update_trs and id not in self.force_update_transfer:\n\t\t\t\tself.user_pass[id] = self.user_pass.get(id, 0) + 1\n\t\t\t\tcontinue\n\t\t\tif id in self.user_pass:\n\t\t\t\tdel self.user_pass[id]\n\n\t\t\tquery_sub_when += ' WHEN %s THEN u+%s' % (id, int(transfer[0] * self.cfg[\"transfer_mul\"]))\n\t\t\tquery_sub_when2 += ' WHEN %s THEN d+%s' % (id, int(transfer[1] * self.cfg[\"transfer_mul\"]))\n\t\t\tupdate_transfer[id] = transfer\n\n\t\t\tif query_sub_in is not None:\n\t\t\t\tquery_sub_in += ',%s' % id\n\t\t\telse:\n\t\t\t\tquery_sub_in = '%s' % id\n\n\t\tif query_sub_when == '':\n\t\t\treturn update_transfer\n\t\tquery_sql = query_head + ' SET u = CASE port' + query_sub_when + \\\n\t\t\t\t\t' END, d = CASE port' + query_sub_when2 + \\\n\t\t\t\t\t' END, t = ' + str(int(last_time)) + \\\n\t\t\t\t\t' WHERE port IN (%s)' % query_sub_in\n\t\tif self.cfg[\"ssl_enable\"] == 1:\n\t\t\tconn = cymysql.connect(host=self.cfg[\"host\"], port=self.cfg[\"port\"],\n\t\t\t\t\tuser=self.cfg[\"user\"], passwd=self.cfg[\"password\"],\n\t\t\t\t\tdb=self.cfg[\"db\"], charset='utf8',\n\t\t\t\t\tssl={'ca':self.cfg[\"ssl_ca\"],'cert':self.cfg[\"ssl_cert\"],'key':self.cfg[\"ssl_key\"]})\n\t\telse:\n\t\t\tconn = cymysql.connect(host=self.cfg[\"host\"], port=self.cfg[\"port\"],\n\t\t\t\t\tuser=self.cfg[\"user\"], passwd=self.cfg[\"password\"],\n\t\t\t\t\tdb=self.cfg[\"db\"], charset='utf8')\n\n\t\ttry:\n\t\t\tcur = conn.cursor()\n\t\t\ttry:\n\t\t\t\tcur.execute(query_sql)\n\t\t\texcept Exception as e:\n\t\t\t\tlogging.error(e)\n\t\t\t\tupdate_transfer = {}\n\n\t\t\tcur.close()\n\t\t\tconn.commit()\n\t\texcept Exception as e:\n\t\t\tlogging.error(e)\n\t\t\tupdate_transfer = {}\n\t\tfinally:\n\t\t\tconn.close()\n\n\t\treturn update_transfer\n\n\tdef pull_db_all_user(self):\n\t\timport cymysql\n\t\t#数据库所有用户信息\n\t\tif self.cfg[\"ssl_enable\"] == 1:\n\t\t\tconn = cymysql.connect(host=self.cfg[\"host\"], port=self.cfg[\"port\"],\n\t\t\t\t\tuser=self.cfg[\"user\"], passwd=self.cfg[\"password\"],\n\t\t\t\t\tdb=self.cfg[\"db\"], charset='utf8',\n\t\t\t\t\tssl={'ca':self.cfg[\"ssl_ca\"],'cert':self.cfg[\"ssl_cert\"],'key':self.cfg[\"ssl_key\"]})\n\t\telse:\n\t\t\tconn = cymysql.connect(host=self.cfg[\"host\"], port=self.cfg[\"port\"],\n\t\t\t\t\tuser=self.cfg[\"user\"], passwd=self.cfg[\"password\"],\n\t\t\t\t\tdb=self.cfg[\"db\"], charset='utf8')\n\n\t\ttry:\n\t\t\trows = self.pull_db_users(conn)\n\t\tfinally:\n\t\t\tconn.close()\n\n\t\tif not rows:\n\t\t\tlogging.warn('no user in db')\n\t\treturn rows\n\n\tdef pull_db_users(self, conn):\n\t\ttry:\n\t\t\tswitchrule = importloader.load('switchrule')\n\t\t\tkeys = switchrule.getKeys(self.key_list)\n\t\texcept Exception as e:\n\t\t\tkeys = self.key_list\n\n\t\tcur = conn.cursor()\n\t\tcur.execute(\"SELECT \" + ','.join(keys) + \" FROM user\")\n\t\trows = []\n\t\tfor r in cur.fetchall():\n\t\t\td = {}\n\t\t\tfor column in range(len(keys)):\n\t\t\t\td[keys[column]] = r[column]\n\t\t\trows.append(d)\n\t\tcur.close()\n\t\treturn rows\n\nclass Dbv3Transfer(DbTransfer):\n\tdef __init__(self):\n\t\tsuper(Dbv3Transfer, self).__init__()\n\t\tself.update_node_state = True if get_config().API_INTERFACE != 'legendsockssr' else False\n\t\tif self.update_node_state:\n\t\t\tself.key_list += ['id']\n\t\tself.key_list += ['method']\n\t\tif self.update_node_state:\n\t\t\tself.ss_node_info_name = 'ss_node_info_log'\n\t\t\tif get_config().API_INTERFACE == 'sspanelv3ssr':\n\t\t\t\tself.key_list += ['obfs', 'protocol']\n\t\t\tif get_config().API_INTERFACE == 'glzjinmod':\n\t\t\t\tself.key_list += ['obfs', 'protocol']\n\t\t\t\tself.ss_node_info_name = 'ss_node_info'\n\t\telse:\n\t\t\tself.key_list += ['obfs', 'protocol']\n\t\tself.start_time = time.time()\n\n\tdef update_all_user(self, dt_transfer):\n\t\timport cymysql\n\t\tupdate_transfer = {}\n\n\t\tquery_head = 'UPDATE user'\n\t\tquery_sub_when = ''\n\t\tquery_sub_when2 = ''\n\t\tquery_sub_in = None\n\t\tlast_time = time.time()\n\n\t\talive_user_count = len(self.onlineuser_cache)\n\t\tbandwidth_thistime = 0\n\n\t\tif self.cfg[\"ssl_enable\"] == 1:\n\t\t\tconn = cymysql.connect(host=self.cfg[\"host\"], port=self.cfg[\"port\"],\n\t\t\t\t\tuser=self.cfg[\"user\"], passwd=self.cfg[\"password\"],\n\t\t\t\t\tdb=self.cfg[\"db\"], charset='utf8',\n\t\t\t\t\tssl={'ca':self.cfg[\"ssl_ca\"],'cert':self.cfg[\"ssl_cert\"],'key':self.cfg[\"ssl_key\"]})\n\t\telse:\n\t\t\tconn = cymysql.connect(host=self.cfg[\"host\"], port=self.cfg[\"port\"],\n\t\t\t\t\tuser=self.cfg[\"user\"], passwd=self.cfg[\"password\"],\n\t\t\t\t\tdb=self.cfg[\"db\"], charset='utf8')\n\t\tconn.autocommit(True)\n\n\t\tfor id in dt_transfer.keys():\n\t\t\ttransfer = dt_transfer[id]\n\t\t\tbandwidth_thistime = bandwidth_thistime + transfer[0] + transfer[1]\n\n\t\t\tupdate_trs = 1024 * (2048 - self.user_pass.get(id, 0) * 64)\n\t\t\tif transfer[0] + transfer[1] < update_trs:\n\t\t\t\tself.user_pass[id] = self.user_pass.get(id, 0) + 1\n\t\t\t\tcontinue\n\t\t\tif id in self.user_pass:\n\t\t\t\tdel self.user_pass[id]\n\n\t\t\tquery_sub_when += ' WHEN %s THEN u+%s' % (id, int(transfer[0] * self.cfg[\"transfer_mul\"]))\n\t\t\tquery_sub_when2 += ' WHEN %s THEN d+%s' % (id, int(transfer[1] * self.cfg[\"transfer_mul\"]))\n\t\t\tupdate_transfer[id] = transfer\n\n\t\t\tif self.update_node_state:\n\t\t\t\tcur = conn.cursor()\n\t\t\t\ttry:\n\t\t\t\t\tif id in self.port_uid_table:\n\t\t\t\t\t\tcur.execute(\"INSERT INTO `user_traffic_log` (`id`, `user_id`, `u`, `d`, `node_id`, `rate`, `traffic`, `log_time`) VALUES (NULL, '\" + \\\n\t\t\t\t\t\t\tstr(self.port_uid_table[id]) + \"', '\" + str(transfer[0]) + \"', '\" + str(transfer[1]) + \"', '\" + \\\n\t\t\t\t\t\t\tstr(self.cfg[\"node_id\"]) + \"', '\" + str(self.cfg[\"transfer_mul\"]) + \"', '\" + \\\n\t\t\t\t\t\t\tself.traffic_format((transfer[0] + transfer[1]) * self.cfg[\"transfer_mul\"]) + \"', unix_timestamp()); \")\n\t\t\t\texcept:\n\t\t\t\t\tlogging.warn('no `user_traffic_log` in db')\n\t\t\t\tcur.close()\n\n\t\t\tif query_sub_in is not None:\n\t\t\t\tquery_sub_in += ',%s' % id\n\t\t\telse:\n\t\t\t\tquery_sub_in = '%s' % id\n\n\t\tif query_sub_when != '':\n\t\t\tquery_sql = query_head + ' SET u = CASE port' + query_sub_when + \\\n\t\t\t\t\t\t' END, d = CASE port' + query_sub_when2 + \\\n\t\t\t\t\t\t' END, t = ' + str(int(last_time)) + \\\n\t\t\t\t\t\t' WHERE port IN (%s)' % query_sub_in\n\t\t\tcur = conn.cursor()\n\t\t\ttry:\n\t\t\t\tcur.execute(query_sql)\n\t\t\texcept Exception as e:\n\t\t\t\tlogging.error(e)\n\t\t\tcur.close()\n\n\t\tif self.update_node_state:\n\t\t\ttry:\n\t\t\t\tcur = conn.cursor()\n\t\t\t\ttry:\n\t\t\t\t\tcur.execute(\"INSERT INTO `ss_node_online_log` (`id`, `node_id`, `online_user`, `log_time`) VALUES (NULL, '\" + \\\n\t\t\t\t\t\tstr(self.cfg[\"node_id\"]) + \"', '\" + str(alive_user_count) + \"', unix_timestamp()); \")\n\t\t\t\texcept Exception as e:\n\t\t\t\t\tlogging.error(e)\n\t\t\t\tcur.close()\n\n\t\t\t\tcur = conn.cursor()\n\t\t\t\ttry:\n\t\t\t\t\tcur.execute(\"INSERT INTO `\" + self.ss_node_info_name + \"` (`id`, `node_id`, `uptime`, `load`, `log_time`) VALUES (NULL, '\" + \\\n\t\t\t\t\t\tstr(self.cfg[\"node_id\"]) + \"', '\" + str(self.uptime()) + \"', '\" + \\\n\t\t\t\t\t\tstr(self.load()) + \"', unix_timestamp()); \")\n\t\t\t\texcept Exception as e:\n\t\t\t\t\tlogging.error(e)\n\t\t\t\tcur.close()\n\t\t\texcept:\n\t\t\t\tlogging.warn('no `ss_node_online_log` or `\" + self.ss_node_info_name + \"` in db')\n\n\t\tconn.close()\n\t\treturn update_transfer\n\n\tdef pull_db_users(self, conn):\n\t\ttry:\n\t\t\tswitchrule = importloader.load('switchrule')\n\t\t\tkeys = switchrule.getKeys(self.key_list)\n\t\texcept Exception as e:\n\t\t\tkeys = self.key_list\n\n\t\tcur = conn.cursor()\n\n\t\tif self.update_node_state:\n\t\t\tnode_info_keys = ['traffic_rate']\n\t\t\ttry:\n\t\t\t\tcur.execute(\"SELECT \" + ','.join(node_info_keys) +\" FROM ss_node where `id`='\" + str(self.cfg[\"node_id\"]) + \"'\")\n\t\t\t\tnodeinfo = cur.fetchone()\n\t\t\texcept Exception as e:\n\t\t\t\tlogging.error(e)\n\t\t\t\tnodeinfo = None\n\n\t\t\tif nodeinfo == None:\n\t\t\t\trows = []\n\t\t\t\tcur.close()\n\t\t\t\tconn.commit()\n\t\t\t\tlogging.warn('None result when select node info from ss_node in db, maybe you set the incorrect node id')\n\t\t\t\treturn rows\n\t\t\tcur.close()\n\n\t\t\tnode_info_dict = {}\n\t\t\tfor column in range(len(nodeinfo)):\n\t\t\t\tnode_info_dict[node_info_keys[column]] = nodeinfo[column]\n\t\t\tself.cfg['transfer_mul'] = float(node_info_dict['traffic_rate'])\n\n\t\tcur = conn.cursor()\n\t\ttry:\n\t\t\trows = []\n\t\t\tcur.execute(\"SELECT \" + ','.join(keys) + \" FROM user\")\n\t\t\tfor r in cur.fetchall():\n\t\t\t\td = {}\n\t\t\t\tfor column in range(len(keys)):\n\t\t\t\t\td[keys[column]] = r[column]\n\t\t\t\trows.append(d)\n\t\texcept Exception as e:\n\t\t\tlogging.error(e)\n\t\tcur.close()\n\t\treturn rows\n\n\tdef load(self):\n\t\timport os\n\t\treturn os.popen(\"cat /proc/loadavg | awk '{ print $1\\\" \\\"$2\\\" \\\"$3 }'\").readlines()[0]\n\n\tdef uptime(self):\n\t\treturn time.time() - self.start_time\n\n\tdef traffic_format(self, traffic):\n\t\tif traffic < 1024 * 8:\n\t\t\treturn str(int(traffic)) + \"B\";\n\n\t\tif traffic < 1024 * 1024 * 2:\n\t\t\treturn str(round((traffic / 1024.0), 2)) + \"KB\";\n\n\t\treturn str(round((traffic / 1048576.0), 2)) + \"MB\";\n\nclass MuJsonTransfer(TransferBase):\n\tdef __init__(self):\n\t\tsuper(MuJsonTransfer, self).__init__()\n\n\tdef update_all_user(self, dt_transfer):\n\t\timport json\n\t\trows = None\n\n\t\tconfig_path = get_config().MUDB_FILE\n\t\twith open(config_path, 'rb+') as f:\n\t\t\trows = json.loads(f.read().decode('utf8'))\n\t\t\tfor row in rows:\n\t\t\t\tif \"port\" in row:\n\t\t\t\t\tport = row[\"port\"]\n\t\t\t\t\tif port in dt_transfer:\n\t\t\t\t\t\trow[\"u\"] += dt_transfer[port][0]\n\t\t\t\t\t\trow[\"d\"] += dt_transfer[port][1]\n\n\t\tif rows:\n\t\t\toutput = json.dumps(rows, sort_keys=True, indent=4, separators=(',', ': '))\n\t\t\twith open(config_path, 'r+') as f:\n\t\t\t\tf.write(output)\n\t\t\t\tf.truncate()\n\n\t\treturn dt_transfer\n\n\tdef pull_db_all_user(self):\n\t\timport json\n\t\trows = None\n\n\t\tconfig_path = get_config().MUDB_FILE\n\t\twith open(config_path, 'rb+') as f:\n\t\t\trows = json.loads(f.read().decode('utf8'))\n\t\t\tfor row in rows:\n\t\t\t\ttry:\n\t\t\t\t\tif 'forbidden_ip' in row:\n\t\t\t\t\t\trow['forbidden_ip'] = common.IPNetwork(row['forbidden_ip'])\n\t\t\t\texcept Exception as e:\n\t\t\t\t\tlogging.error(e)\n\t\t\t\ttry:\n\t\t\t\t\tif 'forbidden_port' in row:\n\t\t\t\t\t\trow['forbidden_port'] = common.PortRange(row['forbidden_port'])\n\t\t\t\texcept Exception as e:\n\t\t\t\t\tlogging.error(e)\n\n\t\tif not rows:\n\t\t\tlogging.warn('no user in json file')\n\t\treturn rows\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/firewall.lua",
    "content": "#!/usr/bin/lua\n\nrequire 'luci.sys'\nlocal jsonc = require \"luci.jsonc\"\n\nlocal function get_config_path()\n    return luci.sys.exec(\"echo -n $(cat /usr/share/ssr_mudb_server/userapiconfig.py | grep 'MUDB_FILE' | cut -d \\\"'\\\" -f 2)\")\nend\n\nlocal function get_config_json()\n    return luci.sys.exec(\"cat \" .. get_config_path()) or \"[]\"\nend\n\nlocal json = jsonc.parse(get_config_json())\nif json then\n\tfor index = 1, table.maxn(json) do\n\t\tlocal o = json[index]\n\t\tif o.enable == 1 then\n\t\t\tluci.sys.call(string.format(\"iptables -A SSR_MUDB-SERVER -p tcp --dport %s -m comment --comment %s -j ACCEPT\", o.port, o.user))\n\t\t\tluci.sys.call(string.format(\"iptables -A SSR_MUDB-SERVER -p udp --dport %s -m comment --comment %s -j ACCEPT\", o.port, o.user))\n\t\tend\n\tend\nend"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/importloader.py",
    "content": "﻿#!/usr/bin/python\n# -*- coding: UTF-8 -*-\n\ndef load(name):\n\ttry:\n\t\tobj = __import__(name)\n\t\treload(obj)\n\t\treturn obj\n\texcept:\n\t\tpass\n\n\ttry:\n\t\timport importlib\n\t\tobj = importlib.__import__(name)\n\t\timportlib.reload(obj)\n\t\treturn obj\n\texcept:\n\t\tpass\n\ndef loads(namelist):\n\tfor name in namelist:\n\t\tobj = load(name)\n\t\tif obj is not None:\n\t\t\treturn obj\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/initcfg.bat",
    "content": "@echo off\nIf Not Exist \"userapiconfig.py\" Copy \"apiconfig.py\" \"userapiconfig.py\"\nIf Not Exist \"user-config.json\" Copy \"config.json\" \"user-config.json\"\nIf Not Exist \"usermysql.json\" Copy \"mysql.json\" \"usermysql.json\"\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/initcfg.sh",
    "content": "#!/bin/bash\n\nchmod +x *.sh\nchmod +x shadowsocks/*.sh\ncp -n apiconfig.py userapiconfig.py\ncp -n config.json user-config.json\ncp -n mysql.json usermysql.json\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/initmudbjson.sh",
    "content": "#!/bin/bash\n\nbash initcfg.sh\nsed -i \"s/API_INTERFACE = .\\+\\?\\#/API_INTERFACE = \\'mudbjson\\' \\#/g\" userapiconfig.py\nip_addr=`ifconfig -a|grep inet|grep -v inet6|grep -v \"127.0.0.\"|grep -v -e \"192\\.168\\..[0-9]\\+\\.[0-9]\\+\"|grep -v -e \"10\\.[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+\"|awk '{print $2}'|tr -d \"addr:\"`\nip_count=`echo $ip_addr|grep -e \"^[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+$\" -c`\n\nif [[ $ip_count == 1 ]]; then\n\tip_addr=`ip a|grep inet|grep -v inet6|grep -v \"127.0.0.\"|grep -v -e \"192\\.168\\..[0-9]\\+\\.[0-9]\\+\"|grep -v -e \"10\\.[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+\"|awk '{print $2}'`\n\tip_addr=${ip_addr%/*}\n\tip_count=`echo $ip_addr|grep -e \"^[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+\\.[0-9]\\+$\" -c`\nfi\nif [[ $ip_count == 1 ]]; then\n\techo \"server IP is \"${ip_addr}\n\tsed -i \"s/SERVER_PUB_ADDR = .\\+/SERVER_PUB_ADDR = \\'\"${ip_addr}\"\\'/g\" userapiconfig.py\n\tuser_count=`python mujson_mgr.py -l|grep -c -e \"[0-9]\"`\n\tif [[ $user_count == 0 ]]; then\n\t\tport=`python -c 'import random;print(random.randint(10000, 65536))'`\n\t\tpython mujson_mgr.py -a -p ${port}\n\tfi\nelse\n\techo \"unable to detect server IP\"\nfi\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/logrun.sh",
    "content": "#!/bin/bash\ncd `dirname $0`\n#python_ver=$(ls /usr/bin|grep -e \"^python[23]\\.[1-9]\\+$\"|tail -1)\neval $(ps -ef | grep \"[0-9] python server\\\\.py m\" | awk '{print \"kill \"$2}')\nulimit -n 512000\nnohup python server.py m >> ssserver.log 2>&1 &\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/mudb.json",
    "content": "[]"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/mujson_mgr.py",
    "content": "#!/usr/bin/python\n# -*- coding: UTF-8 -*-\n\nimport traceback\nfrom shadowsocks import shell, common\nfrom configloader import load_config, get_config\nimport random\nimport getopt\nimport sys\nimport json\nimport base64\n\n\nclass MuJsonLoader(object):\n\tdef __init__(self):\n\t\tself.json = None\n\n\tdef load(self, path):\n\t\tl = \"[]\"\n\t\ttry:\n\t\t\twith open(path, 'rb+') as f:\n\t\t\t\tl = f.read().decode('utf8')\n\t\texcept:\n\t\t\tpass\n\t\tself.json = json.loads(l)\n\n\tdef save(self, path):\n\t\tif self.json is not None:\n\t\t\toutput = json.dumps(self.json, sort_keys=True, indent=4, separators=(',', ': '))\n\t\t\twith open(path, 'a'):\n\t\t\t\tpass\n\t\t\twith open(path, 'rb+') as f:\n\t\t\t\tf.write(output.encode('utf8'))\n\t\t\t\tf.truncate()\n\n\nclass MuMgr(object):\n\tdef __init__(self):\n\t\tself.config_path = get_config().MUDB_FILE\n\t\ttry:\n\t\t\tself.server_addr = get_config().SERVER_PUB_ADDR\n\t\texcept:\n\t\t\tself.server_addr = '127.0.0.1'\n\t\tself.data = MuJsonLoader()\n\n\t\tif self.server_addr == '127.0.0.1':\n\t\t\tself.server_addr = self.getipaddr()\n\n\tdef getipaddr(self, ifname='eth0'):\n\t\timport socket\n\t\timport struct\n\t\tret = '127.0.0.1'\n\t\ttry:\n\t\t\tret = socket.gethostbyname(socket.getfqdn(socket.gethostname()))\n\t\texcept:\n\t\t\tpass\n\t\tif ret == '127.0.0.1':\n\t\t\ttry:\n\t\t\t\timport fcntl\n\t\t\t\ts = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\n\t\t\t\tret = socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s', ifname[:15]))[20:24])\n\t\t\texcept:\n\t\t\t\tpass\n\t\treturn ret\n\n\tdef ssrlink(self, user, encode, muid):\n\t\tprotocol = user.get('protocol', '')\n\t\tobfs = user.get('obfs', '')\n\t\tprotocol = protocol.replace(\"_compatible\", \"\")\n\t\tobfs = obfs.replace(\"_compatible\", \"\")\n\t\tprotocol_param = ''\n\t\tif muid is not None:\n\t\t\tprotocol_param_ = user.get('protocol_param', '')\n\t\t\tparam = protocol_param_.split('#')\n\t\t\tif len(param) == 2:\n\t\t\t\tfor row in self.data.json:\n\t\t\t\t\tif int(row['port']) == muid:\n\t\t\t\t\t\tparam = str(muid) + ':' + row['passwd']\n\t\t\t\t\t\tprotocol_param = '/?protoparam=' + common.to_str(base64.urlsafe_b64encode(common.to_bytes(param))).replace(\"=\", \"\")\n\t\t\t\t\t\tbreak\n\t\tlink = (\"%s:%s:%s:%s:%s:%s\" % (self.server_addr, user['port'], protocol, user['method'], obfs, common.to_str(base64.urlsafe_b64encode(common.to_bytes(user['passwd']))).replace(\"=\", \"\"))) + protocol_param\n\t\treturn \"ssr://\" + (encode and common.to_str(base64.urlsafe_b64encode(common.to_bytes(link))).replace(\"=\", \"\") or link)\n\n\tdef userinfo(self, user, muid = None):\n\t\tret = \"\"\n\t\tkey_list = ['user', 'port', 'method', 'passwd', 'protocol', 'protocol_param', 'obfs', 'obfs_param', 'transfer_enable', 'u', 'd']\n\t\tfor key in sorted(user):\n\t\t\tif key not in key_list:\n\t\t\t\tkey_list.append(key)\n\t\tfor key in key_list:\n\t\t\tif key in ['enable'] or key not in user:\n\t\t\t\tcontinue\n\t\t\tret += '\\n'\n\t\t\tif (muid is not None) and (key in ['protocol_param']):\n\t\t\t\tfor row in self.data.json:\n\t\t\t\t\tif int(row['port']) == muid:\n\t\t\t\t\t\tret += \"    %s : %s\" % (key, str(muid) + ':' + row['passwd'])\n\t\t\t\t\t\tbreak\n\t\t\telif key in ['transfer_enable', 'u', 'd']:\n\t\t\t\tif muid is not None:\n\t\t\t\t\tfor row in self.data.json:\n\t\t\t\t\t\tif int(row['port']) == muid:\n\t\t\t\t\t\t\tval = row[key]\n\t\t\t\t\t\t\tbreak\n\t\t\t\telse:\n\t\t\t\t\tval = user[key]\n\t\t\t\tif val / 1024 < 4:\n\t\t\t\t\tret += \"    %s : %s\" % (key, val)\n\t\t\t\telif val / 1024 ** 2 < 4:\n\t\t\t\t\tval /= float(1024)\n\t\t\t\t\tret += \"    %s : %s  K Bytes\" % (key, val)\n\t\t\t\telif val / 1024 ** 3 < 4:\n\t\t\t\t\tval /= float(1024 ** 2)\n\t\t\t\t\tret += \"    %s : %s  M Bytes\" % (key, val)\n\t\t\t\telse:\n\t\t\t\t\tval /= float(1024 ** 3)\n\t\t\t\t\tret += \"    %s : %s  G Bytes\" % (key, val)\n\t\t\telse:\n\t\t\t\tret += \"    %s : %s\" % (key, user[key])\n\t\tret += \"\\n    \" + self.ssrlink(user, False, muid)\n\t\tret += \"\\n    \" + self.ssrlink(user, True, muid)\n\t\treturn ret\n\n\tdef rand_pass(self):\n\t\treturn ''.join([random.choice('''ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789~-_=+(){}[]^&%$@''') for i in range(8)])\n\n\tdef add(self, user):\n\t\tup = {'enable': 1, 'u': 0, 'd': 0, 'method': \"aes-128-ctr\",\n\t\t'protocol': \"auth_aes128_md5\",\n\t\t'obfs': \"tls1.2_ticket_auth_compatible\",\n\t\t'transfer_enable': 9007199254740992}\n\t\tup['passwd'] = self.rand_pass()\n\t\tup.update(user)\n\n\t\tself.data.load(self.config_path)\n\t\tfor row in self.data.json:\n\t\t\tmatch = False\n\t\t\tif 'user' in user and row['user'] == user['user']:\n\t\t\t\tmatch = True\n\t\t\tif 'port' in user and row['port'] == user['port']:\n\t\t\t\tmatch = True\n\t\t\tif match:\n\t\t\t\tprint(\"user [%s] port [%s] already exist\" % (row['user'], row['port']))\n\t\t\t\treturn\n\t\tself.data.json.append(up)\n\t\tprint(\"### add user info %s\" % self.userinfo(up))\n\t\tself.data.save(self.config_path)\n\n\tdef edit(self, user):\n\t\tself.data.load(self.config_path)\n\t\tfor row in self.data.json:\n\t\t\tmatch = True\n\t\t\tif 'user' in user and row['user'] != user['user']:\n\t\t\t\tmatch = False\n\t\t\tif 'port' in user and row['port'] != user['port']:\n\t\t\t\tmatch = False\n\t\t\tif match:\n\t\t\t\tprint(\"edit user [%s]\" % (row['user'],))\n\t\t\t\trow.update(user)\n\t\t\t\tprint(\"### new user info %s\" % self.userinfo(row))\n\t\t\t\tbreak\n\t\tself.data.save(self.config_path)\n\n\tdef delete(self, user):\n\t\tself.data.load(self.config_path)\n\t\tindex = 0\n\t\tfor row in self.data.json:\n\t\t\tmatch = True\n\t\t\tif 'user' in user and row['user'] != user['user']:\n\t\t\t\tmatch = False\n\t\t\tif 'port' in user and row['port'] != user['port']:\n\t\t\t\tmatch = False\n\t\t\tif match:\n\t\t\t\tprint(\"delete user [%s]\" % row['user'])\n\t\t\t\tdel self.data.json[index]\n\t\t\t\tbreak\n\t\t\tindex += 1\n\t\tself.data.save(self.config_path)\n\n\tdef clear_ud(self, user):\n\t\tup = {'u': 0, 'd': 0}\n\t\tself.data.load(self.config_path)\n\t\tfor row in self.data.json:\n\t\t\tmatch = True\n\t\t\tif 'user' in user and row['user'] != user['user']:\n\t\t\t\tmatch = False\n\t\t\tif 'port' in user and row['port'] != user['port']:\n\t\t\t\tmatch = False\n\t\t\tif match:\n\t\t\t\trow.update(up)\n\t\t\t\tprint(\"clear user [%s]\" % row['user'])\n\t\tself.data.save(self.config_path)\n\n\tdef list_user(self, user):\n\t\tself.data.load(self.config_path)\n\t\tif not user:\n\t\t\tfor row in self.data.json:\n\t\t\t\tprint(\"user [%s] port %s\" % (row['user'], row['port']))\n\t\t\treturn\n\t\tfor row in self.data.json:\n\t\t\tmatch = True\n\t\t\tif 'user' in user and row['user'] != user['user']:\n\t\t\t\tmatch = False\n\t\t\tif 'port' in user and row['port'] != user['port']:\n\t\t\t\tmatch = False\n\t\t\tif match:\n\t\t\t\tmuid = None\n\t\t\t\tif 'muid' in user:\n\t\t\t\t\tmuid = user['muid']\n\t\t\t\tprint(\"### user [%s] info %s\" % (row['user'], self.userinfo(row, muid)))\n\n\ndef print_server_help():\n\tprint('''usage: python mujson_manage.py -a|-d|-e|-c|-l [OPTION]...\n\nActions:\n  -a                   add/edit a user\n  -d                   delete a user\n  -e                   edit a user\n  -c                   set u&d to zero\n  -l                   display a user infomation or all users infomation\n\nOptions:\n  -u USER              the user name\n  -p PORT              server port (only this option must be set if add a user)\n  -k PASSWORD          password\n  -m METHOD            encryption method, default: aes-128-ctr\n  -O PROTOCOL          protocol plugin, default: auth_aes128_md5\n  -o OBFS              obfs plugin, default: tls1.2_ticket_auth_compatible\n  -G PROTOCOL_PARAM    protocol plugin param\n  -g OBFS_PARAM        obfs plugin param\n  -t TRANSFER          max transfer for G bytes, default: 8388608 (8 PB or 8192 TB)\n  -f FORBID            set forbidden ports. Example (ban 1~79 and 81~100): -f \"1-79,81-100\"\n  -i MUID              set sub id to display (only work with -l)\n  -s SPEED             set speed_limit_per_con\n  -S SPEED             set speed_limit_per_user\n\nGeneral options:\n  -h, --help           show this help message and exit\n''')\n\n\ndef main():\n\tshortopts = 'adeclu:i:p:k:O:o:G:g:m:t:f:hs:S:'\n\tlongopts = ['help']\n\taction = None\n\tuser = {}\n\tfast_set_obfs = {'0': 'plain',\n\t\t\t'+1': 'http_simple_compatible',\n\t\t\t'1': 'http_simple',\n\t\t\t'+2': 'tls1.2_ticket_auth_compatible',\n\t\t\t'2': 'tls1.2_ticket_auth'}\n\tfast_set_protocol = {'0': 'origin',\n\t\t\t's4': 'auth_sha1_v4',\n\t\t\t'+s4': 'auth_sha1_v4_compatible',\n\t\t\t'am': 'auth_aes128_md5',\n\t\t\t'as': 'auth_aes128_sha1',\n\t\t\t'ca': 'auth_chain_a',\n\t\t\t}\n\tfast_set_method = {'0': 'none',\n\t\t\t'a1c': 'aes-128-cfb',\n\t\t\t'a2c': 'aes-192-cfb',\n\t\t\t'a3c': 'aes-256-cfb',\n\t\t\t'r': 'rc4-md5',\n\t\t\t'r6': 'rc4-md5-6',\n\t\t\t'c': 'chacha20',\n\t\t\t'ci': 'chacha20-ietf',\n\t\t\t's': 'salsa20',\n\t\t\t'a1': 'aes-128-ctr',\n\t\t\t'a2': 'aes-192-ctr',\n\t\t\t'a3': 'aes-256-ctr'}\n\ttry:\n\t\toptlist, args = getopt.getopt(sys.argv[1:], shortopts, longopts)\n\t\tfor key, value in optlist:\n\t\t\tif key == '-a':\n\t\t\t\taction = 1\n\t\t\telif key == '-d':\n\t\t\t\taction = 2\n\t\t\telif key == '-e':\n\t\t\t\taction = 3\n\t\t\telif key == '-l':\n\t\t\t\taction = 4\n\t\t\telif key == '-c':\n\t\t\t\taction = 0\n\t\t\telif key == '-u':\n\t\t\t\tuser['user'] = value\n\t\t\telif key == '-i':\n\t\t\t\tuser['muid'] = int(value)\n\t\t\telif key == '-p':\n\t\t\t\tuser['port'] = int(value)\n\t\t\telif key == '-k':\n\t\t\t\tuser['passwd'] = value\n\t\t\telif key == '-o':\n\t\t\t\tif value in fast_set_obfs:\n\t\t\t\t\tuser['obfs'] = fast_set_obfs[value]\n\t\t\t\telse:\n\t\t\t\t\tuser['obfs'] = value\n\t\t\telif key == '-O':\n\t\t\t\tif value in fast_set_protocol:\n\t\t\t\t\tuser['protocol'] = fast_set_protocol[value]\n\t\t\t\telse:\n\t\t\t\t\tuser['protocol'] = value\n\t\t\telif key == '-g':\n\t\t\t\tuser['obfs_param'] = value\n\t\t\telif key == '-G':\n\t\t\t\tuser['protocol_param'] = value\n\t\t\telif key == '-s':\n\t\t\t\tuser['speed_limit_per_con'] = int(value)\n\t\t\telif key == '-S':\n\t\t\t\tuser['speed_limit_per_user'] = int(value)\n\t\t\telif key == '-m':\n\t\t\t\tif value in fast_set_method:\n\t\t\t\t\tuser['method'] = fast_set_method[value]\n\t\t\t\telse:\n\t\t\t\t\tuser['method'] = value\n\t\t\telif key == '-f':\n\t\t\t\tuser['forbidden_port'] = value\n\t\t\telif key == '-t':\n\t\t\t\tval = float(value)\n\t\t\t\ttry:\n\t\t\t\t\tval = int(value)\n\t\t\t\texcept:\n\t\t\t\t\tpass\n\t\t\t\tuser['transfer_enable'] = int(val * 1024) * (1024 ** 2)\n\t\t\telif key in ('-h', '--help'):\n\t\t\t\tprint_server_help()\n\t\t\t\tsys.exit(0)\n\texcept getopt.GetoptError as e:\n\t\tprint(e)\n\t\tsys.exit(2)\n\n\tmanage = MuMgr()\n\tif action == 0:\n\t\tmanage.clear_ud(user)\n\telif action == 1:\n\t\tif 'user' not in user and 'port' in user:\n\t\t\tuser['user'] = str(user['port'])\n\t\tif 'user' in user and 'port' in user:\n\t\t\tmanage.add(user)\n\t\telse:\n\t\t\tprint(\"You have to set the port with -p\")\n\telif action == 2:\n\t\tif 'user' in user or 'port' in user:\n\t\t\tmanage.delete(user)\n\t\telse:\n\t\t\tprint(\"You have to set the user name or port with -u/-p\")\n\telif action == 3:\n\t\tif 'user' in user or 'port' in user:\n\t\t\tmanage.edit(user)\n\t\telse:\n\t\t\tprint(\"You have to set the user name or port with -u/-p\")\n\telif action == 4:\n\t\tmanage.list_user(user)\n\telif action is None:\n\t\tprint_server_help()\n\nif __name__ == '__main__':\n\tmain()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/mysql.json",
    "content": "{\n    \"host\": \"127.0.0.1\",\n    \"port\": 3306,\n    \"user\": \"ss\",\n    \"password\": \"pass\",\n    \"db\": \"sspanel\",\n    \"node_id\": 0,\n    \"transfer_mul\": 1.0,\n    \"ssl_enable\": 0,\n    \"ssl_ca\": \"\",\n    \"ssl_cert\": \"\",\n    \"ssl_key\": \"\"\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/run.sh",
    "content": "#!/bin/bash\ncd `dirname $0`\n#python_ver=$(ls /usr/bin|grep -e \"^python[23]\\.[1-9]\\+$\"|tail -1)\neval $(ps -ef | grep \"[0-9] python server\\\\.py m\" | awk '{print \"kill \"$2}')\nulimit -n 512000\nnohup python server.py m>> /dev/null 2>&1 &\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/server.py",
    "content": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n#\n# Copyright 2015 breakwall\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nimport time\nimport sys\nimport threading\nimport os\n\nif __name__ == '__main__':\n\timport inspect\n\tos.chdir(os.path.dirname(os.path.realpath(inspect.getfile(inspect.currentframe()))))\n\nimport server_pool\nimport db_transfer\nfrom shadowsocks import shell\nfrom configloader import load_config, get_config\n\nclass MainThread(threading.Thread):\n\tdef __init__(self, obj):\n\t\tsuper(MainThread, self).__init__()\n\t\tself.daemon = True\n\t\tself.obj = obj\n\n\tdef run(self):\n\t\tself.obj.thread_db(self.obj)\n\n\tdef stop(self):\n\t\tself.obj.thread_db_stop()\n\ndef main():\n\tshell.check_python()\n\tif False:\n\t\tdb_transfer.DbTransfer.thread_db()\n\telse:\n\t\tif get_config().API_INTERFACE == 'mudbjson':\n\t\t\tthread = MainThread(db_transfer.MuJsonTransfer)\n\t\telif get_config().API_INTERFACE == 'sspanelv2':\n\t\t\tthread = MainThread(db_transfer.DbTransfer)\n\t\telse:\n\t\t\tthread = MainThread(db_transfer.Dbv3Transfer)\n\t\tthread.start()\n\t\ttry:\n\t\t\twhile thread.is_alive():\n\t\t\t\tthread.join(10.0)\n\t\texcept (KeyboardInterrupt, IOError, OSError) as e:\n\t\t\timport traceback\n\t\t\ttraceback.print_exc()\n\t\t\tthread.stop()\n\nif __name__ == '__main__':\n\tmain()\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/server_pool.py",
    "content": "﻿#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n\n# Copyright (c) 2014 clowwindy\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nimport os\nimport logging\nimport struct\nimport time\nfrom shadowsocks import shell, eventloop, tcprelay, udprelay, asyncdns, common\nimport threading\nimport sys\nimport traceback\nfrom socket import *\nfrom configloader import load_config, get_config\n\nclass MainThread(threading.Thread):\n\tdef __init__(self, params):\n\t\tsuper(MainThread, self).__init__()\n\t\tself.params = params\n\n\tdef run(self):\n\t\tServerPool._loop(*self.params)\n\nclass ServerPool(object):\n\n\tinstance = None\n\n\tdef __init__(self):\n\t\tshell.check_python()\n\t\tself.config = shell.get_config(False)\n\t\tself.dns_resolver = asyncdns.DNSResolver()\n\t\tif not self.config.get('dns_ipv6', False):\n\t\t\tasyncdns.IPV6_CONNECTION_SUPPORT = False\n\n\t\tself.mgr = None #asyncmgr.ServerMgr()\n\n\t\tself.tcp_servers_pool = {}\n\t\tself.tcp_ipv6_servers_pool = {}\n\t\tself.udp_servers_pool = {}\n\t\tself.udp_ipv6_servers_pool = {}\n\t\tself.stat_counter = {}\n\n\t\tself.loop = eventloop.EventLoop()\n\t\tself.thread = MainThread( (self.loop, self.dns_resolver, self.mgr) )\n\t\tself.thread.start()\n\n\t@staticmethod\n\tdef get_instance():\n\t\tif ServerPool.instance is None:\n\t\t\tServerPool.instance = ServerPool()\n\t\treturn ServerPool.instance\n\n\tdef stop(self):\n\t\tself.loop.stop()\n\n\t@staticmethod\n\tdef _loop(loop, dns_resolver, mgr):\n\t\ttry:\n\t\t\tif mgr is not None:\n\t\t\t\tmgr.add_to_loop(loop)\n\t\t\tdns_resolver.add_to_loop(loop)\n\t\t\tloop.run()\n\t\texcept (KeyboardInterrupt, IOError, OSError) as e:\n\t\t\tlogging.error(e)\n\t\t\ttraceback.print_exc()\n\t\t\tos.exit(0)\n\t\texcept Exception as e:\n\t\t\tlogging.error(e)\n\t\t\ttraceback.print_exc()\n\n\tdef server_is_run(self, port):\n\t\tport = int(port)\n\t\tret = 0\n\t\tif port in self.tcp_servers_pool:\n\t\t\tret = 1\n\t\tif port in self.tcp_ipv6_servers_pool:\n\t\t\tret |= 2\n\t\treturn ret\n\n\tdef server_run_status(self, port):\n\t\tif 'server' in self.config:\n\t\t\tif port not in self.tcp_servers_pool:\n\t\t\t\treturn False\n\t\tif 'server_ipv6' in self.config:\n\t\t\tif port not in self.tcp_ipv6_servers_pool:\n\t\t\t\treturn False\n\t\treturn True\n\n\tdef new_server(self, port, user_config):\n\t\tret = True\n\t\tport = int(port)\n\t\tipv6_ok = False\n\n\t\tif 'server_ipv6' in self.config:\n\t\t\tif port in self.tcp_ipv6_servers_pool:\n\t\t\t\tlogging.info(\"server already at %s:%d\" % (self.config['server_ipv6'], port))\n\t\t\t\treturn 'this port server is already running'\n\t\t\telse:\n\t\t\t\ta_config = self.config.copy()\n\t\t\t\ta_config.update(user_config)\n\t\t\t\tif len(a_config['server_ipv6']) > 2 and a_config['server_ipv6'][0] == \"[\" and a_config['server_ipv6'][-1] == \"]\":\n\t\t\t\t\ta_config['server_ipv6'] = a_config['server_ipv6'][1:-1]\n\t\t\t\ta_config['server'] = a_config['server_ipv6']\n\t\t\t\ta_config['server_port'] = port\n\t\t\t\ta_config['max_connect'] = 128\n\t\t\t\ta_config['method'] = common.to_str(a_config['method'])\n\t\t\t\ttry:\n\t\t\t\t\tlogging.info(\"starting server at [%s]:%d\" % (common.to_str(a_config['server']), port))\n\n\t\t\t\t\ttcp_server = tcprelay.TCPRelay(a_config, self.dns_resolver, False, stat_counter=self.stat_counter)\n\t\t\t\t\ttcp_server.add_to_loop(self.loop)\n\t\t\t\t\tself.tcp_ipv6_servers_pool.update({port: tcp_server})\n\n\t\t\t\t\tudp_server = udprelay.UDPRelay(a_config, self.dns_resolver, False, stat_counter=self.stat_counter)\n\t\t\t\t\tudp_server.add_to_loop(self.loop)\n\t\t\t\t\tself.udp_ipv6_servers_pool.update({port: udp_server})\n\n\t\t\t\t\tif common.to_str(a_config['server_ipv6']) == \"::\":\n\t\t\t\t\t\tipv6_ok = True\n\t\t\t\texcept Exception as e:\n\t\t\t\t\tlogging.warn(\"IPV6 %s \" % (e,))\n\n\t\tif 'server' in self.config:\n\t\t\tif port in self.tcp_servers_pool:\n\t\t\t\tlogging.info(\"server already at %s:%d\" % (common.to_str(self.config['server']), port))\n\t\t\t\treturn 'this port server is already running'\n\t\t\telse:\n\t\t\t\ta_config = self.config.copy()\n\t\t\t\ta_config.update(user_config)\n\t\t\t\ta_config['server_port'] = port\n\t\t\t\ta_config['max_connect'] = 128\n\t\t\t\ta_config['method'] = common.to_str(a_config['method'])\n\t\t\t\ttry:\n\t\t\t\t\tlogging.info(\"starting server at %s:%d\" % (common.to_str(a_config['server']), port))\n\n\t\t\t\t\ttcp_server = tcprelay.TCPRelay(a_config, self.dns_resolver, False)\n\t\t\t\t\ttcp_server.add_to_loop(self.loop)\n\t\t\t\t\tself.tcp_servers_pool.update({port: tcp_server})\n\n\t\t\t\t\tudp_server = udprelay.UDPRelay(a_config, self.dns_resolver, False)\n\t\t\t\t\tudp_server.add_to_loop(self.loop)\n\t\t\t\t\tself.udp_servers_pool.update({port: udp_server})\n\n\t\t\t\texcept Exception as e:\n\t\t\t\t\tif not ipv6_ok:\n\t\t\t\t\t\tlogging.warn(\"IPV4 %s \" % (e,))\n\n\t\treturn True\n\n\tdef del_server(self, port):\n\t\tport = int(port)\n\t\tlogging.info(\"del server at %d\" % port)\n\t\ttry:\n\t\t\tudpsock = socket(AF_INET, SOCK_DGRAM)\n\t\t\tudpsock.sendto('%s:%s:0:0' % (get_config().MANAGE_PASS, port), (get_config().MANAGE_BIND_IP, get_config().MANAGE_PORT))\n\t\t\tudpsock.close()\n\t\texcept Exception as e:\n\t\t\tlogging.warn(e)\n\t\treturn True\n\n\tdef cb_del_server(self, port):\n\t\tport = int(port)\n\n\t\tif port not in self.tcp_servers_pool:\n\t\t\tlogging.info(\"stopped server at %s:%d already stop\" % (self.config['server'], port))\n\t\telse:\n\t\t\tlogging.info(\"stopped server at %s:%d\" % (self.config['server'], port))\n\t\t\ttry:\n\t\t\t\tself.tcp_servers_pool[port].close(True)\n\t\t\t\tdel self.tcp_servers_pool[port]\n\t\t\texcept Exception as e:\n\t\t\t\tlogging.warn(e)\n\t\t\ttry:\n\t\t\t\tself.udp_servers_pool[port].close(True)\n\t\t\t\tdel self.udp_servers_pool[port]\n\t\t\texcept Exception as e:\n\t\t\t\tlogging.warn(e)\n\n\t\tif 'server_ipv6' in self.config:\n\t\t\tif port not in self.tcp_ipv6_servers_pool:\n\t\t\t\tlogging.info(\"stopped server at [%s]:%d already stop\" % (self.config['server_ipv6'], port))\n\t\t\telse:\n\t\t\t\tlogging.info(\"stopped server at [%s]:%d\" % (self.config['server_ipv6'], port))\n\t\t\t\ttry:\n\t\t\t\t\tself.tcp_ipv6_servers_pool[port].close(True)\n\t\t\t\t\tdel self.tcp_ipv6_servers_pool[port]\n\t\t\t\texcept Exception as e:\n\t\t\t\t\tlogging.warn(e)\n\t\t\t\ttry:\n\t\t\t\t\tself.udp_ipv6_servers_pool[port].close(True)\n\t\t\t\t\tdel self.udp_ipv6_servers_pool[port]\n\t\t\t\texcept Exception as e:\n\t\t\t\t\tlogging.warn(e)\n\n\t\treturn True\n\n\tdef update_mu_users(self, port, users):\n\t\tport = int(port)\n\t\tif port in self.tcp_servers_pool:\n\t\t\ttry:\n\t\t\t\tself.tcp_servers_pool[port].update_users(users)\n\t\t\texcept Exception as e:\n\t\t\t\tlogging.warn(e)\n\t\t\ttry:\n\t\t\t\tself.udp_servers_pool[port].update_users(users)\n\t\t\texcept Exception as e:\n\t\t\t\tlogging.warn(e)\n\t\tif port in self.tcp_ipv6_servers_pool:\n\t\t\ttry:\n\t\t\t\tself.tcp_ipv6_servers_pool[port].update_users(users)\n\t\t\texcept Exception as e:\n\t\t\t\tlogging.warn(e)\n\t\t\ttry:\n\t\t\t\tself.udp_ipv6_servers_pool[port].update_users(users)\n\t\t\texcept Exception as e:\n\t\t\t\tlogging.warn(e)\n\n\tdef get_server_transfer(self, port):\n\t\tport = int(port)\n\t\tuid = struct.pack('<I', port)\n\t\tret = [0, 0]\n\t\tif port in self.tcp_servers_pool:\n\t\t\tret[0], ret[1] = self.tcp_servers_pool[port].get_ud()\n\t\tif port in self.udp_servers_pool:\n\t\t\tu, d = self.udp_servers_pool[port].get_ud()\n\t\t\tret[0] += u\n\t\t\tret[1] += d\n\t\tif port in self.tcp_ipv6_servers_pool:\n\t\t\tu, d = self.tcp_ipv6_servers_pool[port].get_ud()\n\t\t\tret[0] += u\n\t\t\tret[1] += d\n\t\tif port in self.udp_ipv6_servers_pool:\n\t\t\tu, d = self.udp_ipv6_servers_pool[port].get_ud()\n\t\t\tret[0] += u\n\t\t\tret[1] += d\n\t\treturn ret\n\n\tdef get_server_mu_transfer(self, server):\n\t\treturn server.get_users_ud()\n\n\tdef update_mu_transfer(self, user_dict, u, d):\n\t\tfor uid in u:\n\t\t\tport = struct.unpack('<I', uid)[0]\n\t\t\tif port not in user_dict:\n\t\t\t\tuser_dict[port] = [0, 0]\n\t\t\tuser_dict[port][0] += u[uid]\n\t\tfor uid in d:\n\t\t\tport = struct.unpack('<I', uid)[0]\n\t\t\tif port not in user_dict:\n\t\t\t\tuser_dict[port] = [0, 0]\n\t\t\tuser_dict[port][1] += d[uid]\n\n\tdef get_servers_transfer(self):\n\t\tservers = self.tcp_servers_pool.copy()\n\t\tservers.update(self.tcp_ipv6_servers_pool)\n\t\tservers.update(self.udp_servers_pool)\n\t\tservers.update(self.udp_ipv6_servers_pool)\n\t\tret = {}\n\t\tfor port in servers.keys():\n\t\t\tret[port] = self.get_server_transfer(port)\n\t\tfor port in self.tcp_servers_pool:\n\t\t\tu, d = self.get_server_mu_transfer(self.tcp_servers_pool[port])\n\t\t\tself.update_mu_transfer(ret, u, d)\n\t\tfor port in self.tcp_ipv6_servers_pool:\n\t\t\tu, d = self.get_server_mu_transfer(self.tcp_ipv6_servers_pool[port])\n\t\t\tself.update_mu_transfer(ret, u, d)\n\t\tfor port in self.udp_servers_pool:\n\t\t\tu, d = self.get_server_mu_transfer(self.udp_servers_pool[port])\n\t\t\tself.update_mu_transfer(ret, u, d)\n\t\tfor port in self.udp_ipv6_servers_pool:\n\t\t\tu, d = self.get_server_mu_transfer(self.udp_ipv6_servers_pool[port])\n\t\t\tself.update_mu_transfer(ret, u, d)\n\t\treturn ret\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/setup.py",
    "content": "import codecs\nfrom setuptools import setup\n\n\nwith codecs.open('README.rst', encoding='utf-8') as f:\n    long_description = f.read()\n\nsetup(\n    name=\"shadowsocks\",\n    version=\"2.6.12\",\n    license='http://www.apache.org/licenses/LICENSE-2.0',\n    description=\"A fast tunnel proxy that help you get through firewalls\",\n    author='clowwindy',\n    author_email='clowwindy42@gmail.com',\n    url='https://github.com/shadowsocks/shadowsocks',\n    packages=['shadowsocks', 'shadowsocks.crypto', 'shadowsocks.obfsplugin'],\n    package_data={\n        'shadowsocks': ['README.rst', 'LICENSE']\n    },\n    install_requires=[],\n    entry_points=\"\"\"\n    [console_scripts]\n    sslocal = shadowsocks.local:main\n    ssserver = shadowsocks.server:main\n    \"\"\",\n    classifiers=[\n        'License :: OSI Approved :: Apache Software License',\n        'Programming Language :: Python :: 2',\n        'Programming Language :: Python :: 2.6',\n        'Programming Language :: Python :: 2.7',\n        'Programming Language :: Python :: 3',\n        'Programming Language :: Python :: 3.3',\n        'Programming Language :: Python :: 3.4',\n        'Programming Language :: Python :: Implementation :: CPython',\n        'Programming Language :: Python :: Implementation :: PyPy',\n        'Topic :: Internet :: Proxy Servers',\n    ],\n    long_description=long_description,\n)\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/setup_cymysql.sh",
    "content": "#!/bin/bash\nrm -rf CyMySQL\nrm -rf cymysql\ngit clone https://github.com/nakagami/CyMySQL.git\nmv CyMySQL/cymysql ./\nrm -rf CyMySQL\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/__init__.py",
    "content": "#!/usr/bin/python\n#\n# Copyright 2012-2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/asyncdns.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n#\n# Copyright 2014-2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport os\nimport socket\nimport struct\nimport re\nimport logging\n\nif __name__ == '__main__':\n    import sys\n    import inspect\n    file_path = os.path.dirname(os.path.realpath(inspect.getfile(inspect.currentframe())))\n    sys.path.insert(0, os.path.join(file_path, '../'))\n\nfrom shadowsocks import common, lru_cache, eventloop, shell\n\n\nCACHE_SWEEP_INTERVAL = 30\n\nVALID_HOSTNAME = re.compile(br\"(?!-)[A-Z\\d_-]{1,63}(?<!-)$\", re.IGNORECASE)\n\ncommon.patch_socket()\n\n# rfc1035\n# format\n# +---------------------+\n# |        Header       |\n# +---------------------+\n# |       Question      | the question for the name server\n# +---------------------+\n# |        Answer       | RRs answering the question\n# +---------------------+\n# |      Authority      | RRs pointing toward an authority\n# +---------------------+\n# |      Additional     | RRs holding additional information\n# +---------------------+\n#\n# header\n#                                 1  1  1  1  1  1\n#   0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5\n# +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+\n# |                      ID                       |\n# +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+\n# |QR|   Opcode  |AA|TC|RD|RA|   Z    |   RCODE   |\n# +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+\n# |                    QDCOUNT                    |\n# +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+\n# |                    ANCOUNT                    |\n# +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+\n# |                    NSCOUNT                    |\n# +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+\n# |                    ARCOUNT                    |\n# +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+\n\nQTYPE_ANY = 255\nQTYPE_A = 1\nQTYPE_AAAA = 28\nQTYPE_CNAME = 5\nQTYPE_NS = 2\nQCLASS_IN = 1\n\ndef detect_ipv6_supprot():\n    if 'has_ipv6' in dir(socket):\n        try:\n            s = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM)\n            s.connect(('::1', 0))\n            print('IPv6 support')\n            return True\n        except:\n            pass\n    print('IPv6 not support')\n    return False\n\nIPV6_CONNECTION_SUPPORT = detect_ipv6_supprot()\n\ndef build_address(address):\n    address = address.strip(b'.')\n    labels = address.split(b'.')\n    results = []\n    for label in labels:\n        l = len(label)\n        if l > 63:\n            return None\n        results.append(common.chr(l))\n        results.append(label)\n    results.append(b'\\0')\n    return b''.join(results)\n\n\ndef build_request(address, qtype):\n    request_id = os.urandom(2)\n    header = struct.pack('!BBHHHH', 1, 0, 1, 0, 0, 0)\n    addr = build_address(address)\n    qtype_qclass = struct.pack('!HH', qtype, QCLASS_IN)\n    return request_id + header + addr + qtype_qclass\n\n\ndef parse_ip(addrtype, data, length, offset):\n    if addrtype == QTYPE_A:\n        return socket.inet_ntop(socket.AF_INET, data[offset:offset + length])\n    elif addrtype == QTYPE_AAAA:\n        return socket.inet_ntop(socket.AF_INET6, data[offset:offset + length])\n    elif addrtype in [QTYPE_CNAME, QTYPE_NS]:\n        return parse_name(data, offset)[1]\n    else:\n        return data[offset:offset + length]\n\n\ndef parse_name(data, offset):\n    p = offset\n    labels = []\n    l = common.ord(data[p])\n    while l > 0:\n        if (l & (128 + 64)) == (128 + 64):\n            # pointer\n            pointer = struct.unpack('!H', data[p:p + 2])[0]\n            pointer &= 0x3FFF\n            r = parse_name(data, pointer)\n            labels.append(r[1])\n            p += 2\n            # pointer is the end\n            return p - offset, b'.'.join(labels)\n        else:\n            labels.append(data[p + 1:p + 1 + l])\n            p += 1 + l\n        l = common.ord(data[p])\n    return p - offset + 1, b'.'.join(labels)\n\n\n# rfc1035\n# record\n#                                    1  1  1  1  1  1\n#      0  1  2  3  4  5  6  7  8  9  0  1  2  3  4  5\n#    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+\n#    |                                               |\n#    /                                               /\n#    /                      NAME                     /\n#    |                                               |\n#    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+\n#    |                      TYPE                     |\n#    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+\n#    |                     CLASS                     |\n#    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+\n#    |                      TTL                      |\n#    |                                               |\n#    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+\n#    |                   RDLENGTH                    |\n#    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--|\n#    /                     RDATA                     /\n#    /                                               /\n#    +--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+\ndef parse_record(data, offset, question=False):\n    nlen, name = parse_name(data, offset)\n    if not question:\n        record_type, record_class, record_ttl, record_rdlength = struct.unpack(\n            '!HHiH', data[offset + nlen:offset + nlen + 10]\n        )\n        ip = parse_ip(record_type, data, record_rdlength, offset + nlen + 10)\n        return nlen + 10 + record_rdlength, \\\n            (name, ip, record_type, record_class, record_ttl)\n    else:\n        record_type, record_class = struct.unpack(\n            '!HH', data[offset + nlen:offset + nlen + 4]\n        )\n        return nlen + 4, (name, None, record_type, record_class, None, None)\n\n\ndef parse_header(data):\n    if len(data) >= 12:\n        header = struct.unpack('!HBBHHHH', data[:12])\n        res_id = header[0]\n        res_qr = header[1] & 128\n        res_tc = header[1] & 2\n        res_ra = header[2] & 128\n        res_rcode = header[2] & 15\n        # assert res_tc == 0\n        # assert res_rcode in [0, 3]\n        res_qdcount = header[3]\n        res_ancount = header[4]\n        res_nscount = header[5]\n        res_arcount = header[6]\n        return (res_id, res_qr, res_tc, res_ra, res_rcode, res_qdcount,\n                res_ancount, res_nscount, res_arcount)\n    return None\n\n\ndef parse_response(data):\n    try:\n        if len(data) >= 12:\n            header = parse_header(data)\n            if not header:\n                return None\n            res_id, res_qr, res_tc, res_ra, res_rcode, res_qdcount, \\\n                res_ancount, res_nscount, res_arcount = header\n\n            qds = []\n            ans = []\n            offset = 12\n            for i in range(0, res_qdcount):\n                l, r = parse_record(data, offset, True)\n                offset += l\n                if r:\n                    qds.append(r)\n            for i in range(0, res_ancount):\n                l, r = parse_record(data, offset)\n                offset += l\n                if r:\n                    ans.append(r)\n            for i in range(0, res_nscount):\n                l, r = parse_record(data, offset)\n                offset += l\n            for i in range(0, res_arcount):\n                l, r = parse_record(data, offset)\n                offset += l\n            response = DNSResponse()\n            if qds:\n                response.hostname = qds[0][0]\n            for an in qds:\n                response.questions.append((an[1], an[2], an[3]))\n            for an in ans:\n                response.answers.append((an[1], an[2], an[3]))\n            return response\n    except Exception as e:\n        shell.print_exception(e)\n        return None\n\n\ndef is_valid_hostname(hostname):\n    if len(hostname) > 255:\n        return False\n    if hostname[-1] == b'.':\n        hostname = hostname[:-1]\n    return all(VALID_HOSTNAME.match(x) for x in hostname.split(b'.'))\n\n\nclass DNSResponse(object):\n    def __init__(self):\n        self.hostname = None\n        self.questions = []  # each: (addr, type, class)\n        self.answers = []  # each: (addr, type, class)\n\n    def __str__(self):\n        return '%s: %s' % (self.hostname, str(self.answers))\n\n\nSTATUS_IPV4 = 0\nSTATUS_IPV6 = 1\n\n\nclass DNSResolver(object):\n\n    def __init__(self):\n        self._loop = None\n        self._hosts = {}\n        self._hostname_status = {}\n        self._hostname_to_cb = {}\n        self._cb_to_hostname = {}\n        self._cache = lru_cache.LRUCache(timeout=300)\n        self._sock = None\n        self._servers = None\n        self._parse_resolv()\n        self._parse_hosts()\n        # TODO monitor hosts change and reload hosts\n        # TODO parse /etc/gai.conf and follow its rules\n\n    def _parse_resolv(self):\n        self._servers = []\n        try:\n            with open('dns.conf', 'rb') as f:\n                content = f.readlines()\n                for line in content:\n                    line = line.strip()\n                    if line:\n                        parts = line.split(b' ', 1)\n                        if len(parts) >= 2:\n                            server = parts[0]\n                            port = int(parts[1])\n                        else:\n                            server = parts[0]\n                            port = 53\n                        if common.is_ip(server) == socket.AF_INET:\n                            if type(server) != str:\n                                server = server.decode('utf8')\n                            self._servers.append((server, port))\n        except IOError:\n            pass\n        if not self._servers:\n            try:\n                with open('/etc/resolv.conf', 'rb') as f:\n                    content = f.readlines()\n                    for line in content:\n                        line = line.strip()\n                        if line:\n                            if line.startswith(b'nameserver'):\n                                parts = line.split()\n                                if len(parts) >= 2:\n                                    server = parts[1]\n                                    if common.is_ip(server) == socket.AF_INET:\n                                        if type(server) != str:\n                                            server = server.decode('utf8')\n                                        self._servers.append((server, 53))\n            except IOError:\n                pass\n        if not self._servers:\n            self._servers = [('8.8.4.4', 53), ('8.8.8.8', 53)]\n        logging.info('dns server: %s' % (self._servers,))\n\n    def _parse_hosts(self):\n        etc_path = '/etc/hosts'\n        if 'WINDIR' in os.environ:\n            etc_path = os.environ['WINDIR'] + '/system32/drivers/etc/hosts'\n        try:\n            with open(etc_path, 'rb') as f:\n                for line in f.readlines():\n                    line = line.strip()\n                    if b\"#\" in line:\n                        line = line[:line.find(b'#')]\n                    parts = line.split()\n                    if len(parts) >= 2:\n                        ip = parts[0]\n                        if common.is_ip(ip):\n                            for i in range(1, len(parts)):\n                                hostname = parts[i]\n                                if hostname:\n                                    self._hosts[hostname] = ip\n        except IOError:\n            self._hosts['localhost'] = '127.0.0.1'\n\n    def add_to_loop(self, loop):\n        if self._loop:\n            raise Exception('already add to loop')\n        self._loop = loop\n        # TODO when dns server is IPv6\n        self._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM,\n                                   socket.SOL_UDP)\n        self._sock.setblocking(False)\n        loop.add(self._sock, eventloop.POLL_IN, self)\n        loop.add_periodic(self.handle_periodic)\n\n    def _call_callback(self, hostname, ip, error=None):\n        callbacks = self._hostname_to_cb.get(hostname, [])\n        for callback in callbacks:\n            if callback in self._cb_to_hostname:\n                del self._cb_to_hostname[callback]\n            if ip or error:\n                callback((hostname, ip), error)\n            else:\n                callback((hostname, None),\n                         Exception('unable to parse hostname %s' % hostname))\n        if hostname in self._hostname_to_cb:\n            del self._hostname_to_cb[hostname]\n        if hostname in self._hostname_status:\n            del self._hostname_status[hostname]\n\n    def _handle_data(self, data):\n        response = parse_response(data)\n        if response and response.hostname:\n            hostname = response.hostname\n            ip = None\n            for answer in response.answers:\n                if answer[1] in (QTYPE_A, QTYPE_AAAA) and \\\n                        answer[2] == QCLASS_IN:\n                    ip = answer[0]\n                    break\n            if IPV6_CONNECTION_SUPPORT:\n                if not ip and self._hostname_status.get(hostname, STATUS_IPV4) \\\n                        == STATUS_IPV6:\n                    self._hostname_status[hostname] = STATUS_IPV4\n                    self._send_req(hostname, QTYPE_A)\n                else:\n                    if ip:\n                        self._cache[hostname] = ip\n                        self._call_callback(hostname, ip)\n                    elif self._hostname_status.get(hostname, None) == STATUS_IPV4:\n                        for question in response.questions:\n                            if question[1] == QTYPE_A:\n                                self._call_callback(hostname, None)\n                                break\n            else:\n                if not ip and self._hostname_status.get(hostname, STATUS_IPV6) \\\n                        == STATUS_IPV4:\n                    self._hostname_status[hostname] = STATUS_IPV6\n                    self._send_req(hostname, QTYPE_AAAA)\n                else:\n                    if ip:\n                        self._cache[hostname] = ip\n                        self._call_callback(hostname, ip)\n                    elif self._hostname_status.get(hostname, None) == STATUS_IPV6:\n                        for question in response.questions:\n                            if question[1] == QTYPE_AAAA:\n                                self._call_callback(hostname, None)\n                                break\n\n    def handle_event(self, sock, fd, event):\n        if sock != self._sock:\n            return\n        if event & eventloop.POLL_ERR:\n            logging.error('dns socket err')\n            self._loop.remove(self._sock)\n            self._sock.close()\n            # TODO when dns server is IPv6\n            self._sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM,\n                                       socket.SOL_UDP)\n            self._sock.setblocking(False)\n            self._loop.add(self._sock, eventloop.POLL_IN, self)\n        else:\n            data, addr = sock.recvfrom(1024)\n            if addr not in self._servers:\n                logging.warn('received a packet other than our dns')\n                return\n            self._handle_data(data)\n\n    def handle_periodic(self):\n        self._cache.sweep()\n\n    def remove_callback(self, callback):\n        hostname = self._cb_to_hostname.get(callback)\n        if hostname:\n            del self._cb_to_hostname[callback]\n            arr = self._hostname_to_cb.get(hostname, None)\n            if arr:\n                arr.remove(callback)\n                if not arr:\n                    del self._hostname_to_cb[hostname]\n                    if hostname in self._hostname_status:\n                        del self._hostname_status[hostname]\n\n    def _send_req(self, hostname, qtype):\n        req = build_request(hostname, qtype)\n        for server in self._servers:\n            logging.debug('resolving %s with type %d using server %s',\n                          hostname, qtype, server)\n            self._sock.sendto(req, server)\n\n    def resolve(self, hostname, callback):\n        if type(hostname) != bytes:\n            hostname = hostname.encode('utf8')\n        if not hostname:\n            callback(None, Exception('empty hostname'))\n        elif common.is_ip(hostname):\n            callback((hostname, hostname), None)\n        elif hostname in self._hosts:\n            logging.debug('hit hosts: %s', hostname)\n            ip = self._hosts[hostname]\n            callback((hostname, ip), None)\n        elif hostname in self._cache:\n            logging.debug('hit cache: %s', hostname)\n            ip = self._cache[hostname]\n            callback((hostname, ip), None)\n        else:\n            if not is_valid_hostname(hostname):\n                callback(None, Exception('invalid hostname: %s' % hostname))\n                return\n            if False:\n                addrs = socket.getaddrinfo(hostname, 0, 0,\n                                       socket.SOCK_DGRAM, socket.SOL_UDP)\n                if addrs:\n                    af, socktype, proto, canonname, sa = addrs[0]\n                    logging.debug('DNS resolve %s %s' % (hostname, sa[0]) )\n                    self._cache[hostname] = sa[0]\n                    callback((hostname, sa[0]), None)\n                    return\n            arr = self._hostname_to_cb.get(hostname, None)\n            if not arr:\n                if IPV6_CONNECTION_SUPPORT:\n                    self._hostname_status[hostname] = STATUS_IPV6\n                    self._send_req(hostname, QTYPE_AAAA)\n                else:\n                    self._hostname_status[hostname] = STATUS_IPV4\n                    self._send_req(hostname, QTYPE_A)\n                self._hostname_to_cb[hostname] = [callback]\n                self._cb_to_hostname[callback] = hostname\n            else:\n                arr.append(callback)\n                # TODO send again only if waited too long\n                if IPV6_CONNECTION_SUPPORT:\n                    self._send_req(hostname, QTYPE_AAAA)\n                else:\n                    self._send_req(hostname, QTYPE_A)\n\n    def close(self):\n        if self._sock:\n            if self._loop:\n                self._loop.remove_periodic(self.handle_periodic)\n                self._loop.remove(self._sock)\n            self._sock.close()\n            self._sock = None\n\n\ndef test():\n    dns_resolver = DNSResolver()\n    loop = eventloop.EventLoop()\n    dns_resolver.add_to_loop(loop)\n\n    global counter\n    counter = 0\n\n    def make_callback():\n        global counter\n\n        def callback(result, error):\n            global counter\n            # TODO: what can we assert?\n            print(result, error)\n            counter += 1\n            if counter == 9:\n                dns_resolver.close()\n                loop.stop()\n        a_callback = callback\n        return a_callback\n\n    assert(make_callback() != make_callback())\n\n    dns_resolver.resolve(b'google.com', make_callback())\n    dns_resolver.resolve('google.com', make_callback())\n    dns_resolver.resolve('example.com', make_callback())\n    dns_resolver.resolve('ipv6.google.com', make_callback())\n    dns_resolver.resolve('www.facebook.com', make_callback())\n    dns_resolver.resolve('ns2.google.com', make_callback())\n    dns_resolver.resolve('invalid.@!#$%^&$@.hostname', make_callback())\n    dns_resolver.resolve('toooooooooooooooooooooooooooooooooooooooooooooooooo'\n                         'ooooooooooooooooooooooooooooooooooooooooooooooooooo'\n                         'long.hostname', make_callback())\n    dns_resolver.resolve('toooooooooooooooooooooooooooooooooooooooooooooooooo'\n                         'ooooooooooooooooooooooooooooooooooooooooooooooooooo'\n                         'ooooooooooooooooooooooooooooooooooooooooooooooooooo'\n                         'ooooooooooooooooooooooooooooooooooooooooooooooooooo'\n                         'ooooooooooooooooooooooooooooooooooooooooooooooooooo'\n                         'ooooooooooooooooooooooooooooooooooooooooooooooooooo'\n                         'long.hostname', make_callback())\n\n    loop.run()\n\n\nif __name__ == '__main__':\n    test()\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/common.py",
    "content": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n#\n# Copyright 2013-2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport socket\nimport struct\nimport logging\nimport binascii\nimport re\n\nfrom shadowsocks import lru_cache\n\ndef compat_ord(s):\n    if type(s) == int:\n        return s\n    return _ord(s)\n\n\ndef compat_chr(d):\n    if bytes == str:\n        return _chr(d)\n    return bytes([d])\n\n\n_ord = ord\n_chr = chr\nord = compat_ord\nchr = compat_chr\n\nconnect_log = logging.debug\n\ndef to_bytes(s):\n    if bytes != str:\n        if type(s) == str:\n            return s.encode('utf-8')\n    return s\n\n\ndef to_str(s):\n    if bytes != str:\n        if type(s) == bytes:\n            return s.decode('utf-8')\n    return s\n\ndef int32(x):\n    if x > 0xFFFFFFFF or x < 0:\n        x &= 0xFFFFFFFF\n    if x > 0x7FFFFFFF:\n        x = int(0x100000000 - x)\n        if x < 0x80000000:\n            return -x\n        else:\n            return -2147483648\n    return x\n\ndef inet_ntop(family, ipstr):\n    if family == socket.AF_INET:\n        return to_bytes(socket.inet_ntoa(ipstr))\n    elif family == socket.AF_INET6:\n        import re\n        v6addr = ':'.join(('%02X%02X' % (ord(i), ord(j))).lstrip('0')\n                          for i, j in zip(ipstr[::2], ipstr[1::2]))\n        v6addr = re.sub('::+', '::', v6addr, count=1)\n        return to_bytes(v6addr)\n\n\ndef inet_pton(family, addr):\n    addr = to_str(addr)\n    if family == socket.AF_INET:\n        return socket.inet_aton(addr)\n    elif family == socket.AF_INET6:\n        if '.' in addr:  # a v4 addr\n            v4addr = addr[addr.rindex(':') + 1:]\n            v4addr = socket.inet_aton(v4addr)\n            v4addr = ['%02X' % ord(x) for x in v4addr]\n            v4addr.insert(2, ':')\n            newaddr = addr[:addr.rindex(':') + 1] + ''.join(v4addr)\n            return inet_pton(family, newaddr)\n        dbyts = [0] * 8  # 8 groups\n        grps = addr.split(':')\n        for i, v in enumerate(grps):\n            if v:\n                dbyts[i] = int(v, 16)\n            else:\n                for j, w in enumerate(grps[::-1]):\n                    if w:\n                        dbyts[7 - j] = int(w, 16)\n                    else:\n                        break\n                break\n        return b''.join((chr(i // 256) + chr(i % 256)) for i in dbyts)\n    else:\n        raise RuntimeError(\"What family?\")\n\n\ndef is_ip(address):\n    for family in (socket.AF_INET, socket.AF_INET6):\n        try:\n            if type(address) != str:\n                address = address.decode('utf8')\n            inet_pton(family, address)\n            return family\n        except (TypeError, ValueError, OSError, IOError):\n            pass\n    return False\n\n\ndef match_regex(regex, text):\n    regex = re.compile(regex)\n    for item in regex.findall(text):\n        return True\n    return False\n\n\ndef patch_socket():\n    if not hasattr(socket, 'inet_pton'):\n        socket.inet_pton = inet_pton\n\n    if not hasattr(socket, 'inet_ntop'):\n        socket.inet_ntop = inet_ntop\n\n\npatch_socket()\n\n\nADDRTYPE_IPV4 = 1\nADDRTYPE_IPV6 = 4\nADDRTYPE_HOST = 3\n\n\ndef pack_addr(address):\n    address_str = to_str(address)\n    for family in (socket.AF_INET, socket.AF_INET6):\n        try:\n            r = socket.inet_pton(family, address_str)\n            if family == socket.AF_INET6:\n                return b'\\x04' + r\n            else:\n                return b'\\x01' + r\n        except (TypeError, ValueError, OSError, IOError):\n            pass\n    if len(address) > 255:\n        address = address[:255]  # TODO\n    return b'\\x03' + chr(len(address)) + address\n\ndef pre_parse_header(data):\n    if not data:\n        return None\n    datatype = ord(data[0])\n    if datatype == 0x80:\n        if len(data) <= 2:\n            return None\n        rand_data_size = ord(data[1])\n        if rand_data_size + 2 >= len(data):\n            logging.warn('header too short, maybe wrong password or '\n                         'encryption method')\n            return None\n        data = data[rand_data_size + 2:]\n    elif datatype == 0x81:\n        data = data[1:]\n    elif datatype == 0x82:\n        if len(data) <= 3:\n            return None\n        rand_data_size = struct.unpack('>H', data[1:3])[0]\n        if rand_data_size + 3 >= len(data):\n            logging.warn('header too short, maybe wrong password or '\n                         'encryption method')\n            return None\n        data = data[rand_data_size + 3:]\n    elif datatype == 0x88 or (~datatype & 0xff) == 0x88:\n        if len(data) <= 7 + 7:\n            return None\n        data_size = struct.unpack('>H', data[1:3])[0]\n        ogn_data = data\n        data = data[:data_size]\n        crc = binascii.crc32(data) & 0xffffffff\n        if crc != 0xffffffff:\n            logging.warn('uncorrect CRC32, maybe wrong password or '\n                         'encryption method')\n            return None\n        start_pos = 3 + ord(data[3])\n        data = data[start_pos:-4]\n        if data_size < len(ogn_data):\n            data += ogn_data[data_size:]\n    return data\n\ndef parse_header(data):\n    addrtype = ord(data[0])\n    dest_addr = None\n    dest_port = None\n    header_length = 0\n    connecttype = (addrtype & 0x8) and 1 or 0\n    addrtype &= ~0x8\n    if addrtype == ADDRTYPE_IPV4:\n        if len(data) >= 7:\n            dest_addr = socket.inet_ntoa(data[1:5])\n            dest_port = struct.unpack('>H', data[5:7])[0]\n            header_length = 7\n        else:\n            logging.warn('header is too short')\n    elif addrtype == ADDRTYPE_HOST:\n        if len(data) > 2:\n            addrlen = ord(data[1])\n            if len(data) >= 4 + addrlen:\n                dest_addr = data[2:2 + addrlen]\n                dest_port = struct.unpack('>H', data[2 + addrlen:4 +\n                                                     addrlen])[0]\n                header_length = 4 + addrlen\n            else:\n                logging.warn('header is too short')\n        else:\n            logging.warn('header is too short')\n    elif addrtype == ADDRTYPE_IPV6:\n        if len(data) >= 19:\n            dest_addr = socket.inet_ntop(socket.AF_INET6, data[1:17])\n            dest_port = struct.unpack('>H', data[17:19])[0]\n            header_length = 19\n        else:\n            logging.warn('header is too short')\n    else:\n        logging.warn('unsupported addrtype %d, maybe wrong password or '\n                     'encryption method' % addrtype)\n    if dest_addr is None:\n        return None\n    return connecttype, addrtype, to_bytes(dest_addr), dest_port, header_length\n\n\nclass IPNetwork(object):\n    ADDRLENGTH = {socket.AF_INET: 32, socket.AF_INET6: 128, False: 0}\n\n    def __init__(self, addrs):\n        self.addrs_str = addrs\n        self._network_list_v4 = []\n        self._network_list_v6 = []\n        if type(addrs) == str:\n            addrs = addrs.split(',')\n        list(map(self.add_network, addrs))\n\n    def add_network(self, addr):\n        if addr is \"\":\n            return\n        block = addr.split('/')\n        addr_family = is_ip(block[0])\n        addr_len = IPNetwork.ADDRLENGTH[addr_family]\n        if addr_family is socket.AF_INET:\n            ip, = struct.unpack(\"!I\", socket.inet_aton(block[0]))\n        elif addr_family is socket.AF_INET6:\n            hi, lo = struct.unpack(\"!QQ\", inet_pton(addr_family, block[0]))\n            ip = (hi << 64) | lo\n        else:\n            raise Exception(\"Not a valid CIDR notation: %s\" % addr)\n        if len(block) is 1:\n            prefix_size = 0\n            while (ip & 1) == 0 and ip is not 0:\n                ip >>= 1\n                prefix_size += 1\n            logging.warn(\"You did't specify CIDR routing prefix size for %s, \"\n                         \"implicit treated as %s/%d\" % (addr, addr, addr_len))\n        elif block[1].isdigit() and int(block[1]) <= addr_len:\n            prefix_size = addr_len - int(block[1])\n            ip >>= prefix_size\n        else:\n            raise Exception(\"Not a valid CIDR notation: %s\" % addr)\n        if addr_family is socket.AF_INET:\n            self._network_list_v4.append((ip, prefix_size))\n        else:\n            self._network_list_v6.append((ip, prefix_size))\n\n    def __contains__(self, addr):\n        addr_family = is_ip(addr)\n        if addr_family is socket.AF_INET:\n            ip, = struct.unpack(\"!I\", socket.inet_aton(addr))\n            return any(map(lambda n_ps: n_ps[0] == ip >> n_ps[1],\n                           self._network_list_v4))\n        elif addr_family is socket.AF_INET6:\n            hi, lo = struct.unpack(\"!QQ\", inet_pton(addr_family, addr))\n            ip = (hi << 64) | lo\n            return any(map(lambda n_ps: n_ps[0] == ip >> n_ps[1],\n                           self._network_list_v6))\n        else:\n            return False\n\n    def __cmp__(self, other):\n        return cmp(self.addrs_str, other.addrs_str)\n\n    def __eq__(self, other):\n        return self.addrs_str == other.addrs_str\n\n    def __ne__(self, other):\n        return self.addrs_str != other.addrs_str\n\nclass PortRange(object):\n    def __init__(self, range_str):\n        self.range_str = to_str(range_str)\n        self.range = set()\n        range_str = to_str(range_str).split(',')\n        for item in range_str:\n            try:\n                int_range = item.split('-')\n                if len(int_range) == 1:\n                    if item:\n                        self.range.add(int(item))\n                elif len(int_range) == 2:\n                    int_range[0] = int(int_range[0])\n                    int_range[1] = int(int_range[1])\n                    if int_range[0] < 0:\n                        int_range[0] = 0\n                    if int_range[1] > 65535:\n                        int_range[1] = 65535\n                    i = int_range[0]\n                    while i <= int_range[1]:\n                        self.range.add(i)\n                        i += 1\n            except Exception as e:\n                logging.error(e)\n\n    def __contains__(self, val):\n        return val in self.range\n\n    def __cmp__(self, other):\n        return cmp(self.range_str, other.range_str)\n\n    def __eq__(self, other):\n        return self.range_str == other.range_str\n\n    def __ne__(self, other):\n        return self.range_str != other.range_str\n\nclass UDPAsyncDNSHandler(object):\n    dns_cache = lru_cache.LRUCache(timeout=1800)\n    def __init__(self, params):\n        self.params = params\n        self.remote_addr = None\n        self.call_back = None\n\n    def resolve(self, dns_resolver, remote_addr, call_back):\n        if remote_addr in UDPAsyncDNSHandler.dns_cache:\n            if call_back:\n                call_back(\"\", remote_addr, UDPAsyncDNSHandler.dns_cache[remote_addr], self.params)\n        else:\n            self.call_back = call_back\n            self.remote_addr = remote_addr\n            dns_resolver.resolve(remote_addr[0], self._handle_dns_resolved)\n            UDPAsyncDNSHandler.dns_cache.sweep()\n\n    def _handle_dns_resolved(self, result, error):\n        if error:\n            logging.error(\"%s when resolve DNS\" % (error,)) #drop\n            return self.call_back(error, self.remote_addr, None, self.params)\n        if result:\n            ip = result[1]\n            if ip:\n                return self.call_back(\"\", self.remote_addr, ip, self.params)\n        logging.warning(\"can't resolve %s\" % (self.remote_addr,))\n        return self.call_back(\"fail to resolve\", self.remote_addr, None, self.params)\n\ndef test_inet_conv():\n    ipv4 = b'8.8.4.4'\n    b = inet_pton(socket.AF_INET, ipv4)\n    assert inet_ntop(socket.AF_INET, b) == ipv4\n    ipv6 = b'2404:6800:4005:805::1011'\n    b = inet_pton(socket.AF_INET6, ipv6)\n    assert inet_ntop(socket.AF_INET6, b) == ipv6\n\n\ndef test_parse_header():\n    assert parse_header(b'\\x03\\x0ewww.google.com\\x00\\x50') == \\\n        (0, b'www.google.com', 80, 18)\n    assert parse_header(b'\\x01\\x08\\x08\\x08\\x08\\x00\\x35') == \\\n        (0, b'8.8.8.8', 53, 7)\n    assert parse_header((b'\\x04$\\x04h\\x00@\\x05\\x08\\x05\\x00\\x00\\x00\\x00\\x00'\n                         b'\\x00\\x10\\x11\\x00\\x50')) == \\\n        (0, b'2404:6800:4005:805::1011', 80, 19)\n\n\ndef test_pack_header():\n    assert pack_addr(b'8.8.8.8') == b'\\x01\\x08\\x08\\x08\\x08'\n    assert pack_addr(b'2404:6800:4005:805::1011') == \\\n        b'\\x04$\\x04h\\x00@\\x05\\x08\\x05\\x00\\x00\\x00\\x00\\x00\\x00\\x10\\x11'\n    assert pack_addr(b'www.google.com') == b'\\x03\\x0ewww.google.com'\n\n\ndef test_ip_network():\n    ip_network = IPNetwork('127.0.0.0/24,::ff:1/112,::1,192.168.1.1,192.0.2.0')\n    assert '127.0.0.1' in ip_network\n    assert '127.0.1.1' not in ip_network\n    assert ':ff:ffff' in ip_network\n    assert '::ffff:1' not in ip_network\n    assert '::1' in ip_network\n    assert '::2' not in ip_network\n    assert '192.168.1.1' in ip_network\n    assert '192.168.1.2' not in ip_network\n    assert '192.0.2.1' in ip_network\n    assert '192.0.3.1' in ip_network  # 192.0.2.0 is treated as 192.0.2.0/23\n    assert 'www.google.com' not in ip_network\n\n\nif __name__ == '__main__':\n    test_inet_conv()\n    test_parse_header()\n    test_pack_header()\n    test_ip_network()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/crypto/__init__.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/crypto/ctypes_libsodium.py",
    "content": "#!/usr/bin/env python\n\n# Copyright (c) 2014 clowwindy\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport logging\nfrom ctypes import CDLL, c_char_p, c_int, c_ulonglong, byref, \\\n    create_string_buffer, c_void_p\n\n__all__ = ['ciphers']\n\nlibsodium = None\nloaded = False\n\nbuf_size = 2048\n\n# for salsa20 and chacha20\nBLOCK_SIZE = 64\n\n\ndef load_libsodium():\n    global loaded, libsodium, buf\n\n    from ctypes.util import find_library\n    for p in ('sodium',):\n        libsodium_path = find_library(p)\n        if libsodium_path:\n            break\n    else:\n        raise Exception('libsodium not found')\n    logging.info('loading libsodium from %s', libsodium_path)\n    libsodium = CDLL(libsodium_path)\n    libsodium.sodium_init.restype = c_int\n    libsodium.crypto_stream_salsa20_xor_ic.restype = c_int\n    libsodium.crypto_stream_salsa20_xor_ic.argtypes = (c_void_p, c_char_p,\n                                                       c_ulonglong,\n                                                       c_char_p, c_ulonglong,\n                                                       c_char_p)\n    libsodium.crypto_stream_chacha20_xor_ic.restype = c_int\n    libsodium.crypto_stream_chacha20_xor_ic.argtypes = (c_void_p, c_char_p,\n                                                        c_ulonglong,\n                                                        c_char_p, c_ulonglong,\n                                                        c_char_p)\n\n    libsodium.sodium_init()\n\n    buf = create_string_buffer(buf_size)\n    loaded = True\n\n\nclass Salsa20Crypto(object):\n    def __init__(self, cipher_name, key, iv, op):\n        if not loaded:\n            load_libsodium()\n        self.key = key\n        self.iv = iv\n        self.key_ptr = c_char_p(key)\n        self.iv_ptr = c_char_p(iv)\n        if cipher_name == b'salsa20':\n            self.cipher = libsodium.crypto_stream_salsa20_xor_ic\n        elif cipher_name == b'chacha20':\n            self.cipher = libsodium.crypto_stream_chacha20_xor_ic\n        else:\n            raise Exception('Unknown cipher')\n        # byte counter, not block counter\n        self.counter = 0\n\n    def update(self, data):\n        global buf_size, buf\n        l = len(data)\n\n        # we can only prepend some padding to make the encryption align to\n        # blocks\n        padding = self.counter % BLOCK_SIZE\n        if buf_size < padding + l:\n            buf_size = (padding + l) * 2\n            buf = create_string_buffer(buf_size)\n\n        if padding:\n            data = (b'\\0' * padding) + data\n        self.cipher(byref(buf), c_char_p(data), padding + l,\n                    self.iv_ptr, int(self.counter / BLOCK_SIZE), self.key_ptr)\n        self.counter += l\n        # buf is copied to a str object when we access buf.raw\n        # strip off the padding\n        return buf.raw[padding:padding + l]\n\n\nciphers = {\n    b'salsa20': (32, 8, Salsa20Crypto),\n    b'chacha20': (32, 8, Salsa20Crypto),\n}\n\n\ndef test_salsa20():\n    from shadowsocks.crypto import util\n\n    cipher = Salsa20Crypto(b'salsa20', b'k' * 32, b'i' * 16, 1)\n    decipher = Salsa20Crypto(b'salsa20', b'k' * 32, b'i' * 16, 0)\n\n    util.run_cipher(cipher, decipher)\n\n\ndef test_chacha20():\n    from shadowsocks.crypto import util\n\n    cipher = Salsa20Crypto(b'chacha20', b'k' * 32, b'i' * 16, 1)\n    decipher = Salsa20Crypto(b'chacha20', b'k' * 32, b'i' * 16, 0)\n\n    util.run_cipher(cipher, decipher)\n\n\nif __name__ == '__main__':\n    test_chacha20()\n    test_salsa20()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/crypto/ctypes_openssl.py",
    "content": "#!/usr/bin/env python\n\n# Copyright (c) 2014 clowwindy\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport logging\nfrom ctypes import CDLL, c_char_p, c_int, c_long, byref,\\\n    create_string_buffer, c_void_p\n\n__all__ = ['ciphers']\n\nlibcrypto = None\nloaded = False\n\nbuf_size = 2048\n\n\ndef load_openssl():\n    global loaded, libcrypto, buf\n\n    from ctypes.util import find_library\n    for p in ('crypto', 'eay32', 'libeay32'):\n        libcrypto_path = find_library(p)\n        if libcrypto_path:\n            break\n    else:\n        raise Exception('libcrypto(OpenSSL) not found')\n    logging.info('loading libcrypto from %s', libcrypto_path)\n    libcrypto = CDLL(libcrypto_path)\n    libcrypto.EVP_get_cipherbyname.restype = c_void_p\n    libcrypto.EVP_CIPHER_CTX_new.restype = c_void_p\n\n    libcrypto.EVP_CipherInit_ex.argtypes = (c_void_p, c_void_p, c_char_p,\n                                            c_char_p, c_char_p, c_int)\n\n    libcrypto.EVP_CipherUpdate.argtypes = (c_void_p, c_void_p, c_void_p,\n                                           c_char_p, c_int)\n\n    libcrypto.EVP_CIPHER_CTX_cleanup.argtypes = (c_void_p,)\n    libcrypto.EVP_CIPHER_CTX_free.argtypes = (c_void_p,)\n    if hasattr(libcrypto, 'OpenSSL_add_all_ciphers'):\n        libcrypto.OpenSSL_add_all_ciphers()\n\n    buf = create_string_buffer(buf_size)\n    loaded = True\n\n\ndef load_cipher(cipher_name):\n    func_name = b'EVP_' + cipher_name.replace(b'-', b'_')\n    if bytes != str:\n        func_name = str(func_name, 'utf-8')\n    cipher = getattr(libcrypto, func_name, None)\n    if cipher:\n        cipher.restype = c_void_p\n        return cipher()\n    return None\n\n\nclass CtypesCrypto(object):\n    def __init__(self, cipher_name, key, iv, op):\n        if not loaded:\n            load_openssl()\n        self._ctx = None\n        cipher = libcrypto.EVP_get_cipherbyname(cipher_name)\n        if not cipher:\n            cipher = load_cipher(cipher_name)\n        if not cipher:\n            raise Exception('cipher %s not found in libcrypto' % cipher_name)\n        key_ptr = c_char_p(key)\n        iv_ptr = c_char_p(iv)\n        self._ctx = libcrypto.EVP_CIPHER_CTX_new()\n        if not self._ctx:\n            raise Exception('can not create cipher context')\n        r = libcrypto.EVP_CipherInit_ex(self._ctx, cipher, None,\n                                        key_ptr, iv_ptr, c_int(op))\n        if not r:\n            self.clean()\n            raise Exception('can not initialize cipher context')\n\n    def update(self, data):\n        global buf_size, buf\n        cipher_out_len = c_long(0)\n        l = len(data)\n        if buf_size < l:\n            buf_size = l * 2\n            buf = create_string_buffer(buf_size)\n        libcrypto.EVP_CipherUpdate(self._ctx, byref(buf),\n                                   byref(cipher_out_len), c_char_p(data), l)\n        # buf is copied to a str object when we access buf.raw\n        return buf.raw[:cipher_out_len.value]\n\n    def __del__(self):\n        self.clean()\n\n    def clean(self):\n        if self._ctx:\n            libcrypto.EVP_CIPHER_CTX_cleanup(self._ctx)\n            libcrypto.EVP_CIPHER_CTX_free(self._ctx)\n\n\nciphers = {\n    b'aes-128-cfb': (16, 16, CtypesCrypto),\n    b'aes-192-cfb': (24, 16, CtypesCrypto),\n    b'aes-256-cfb': (32, 16, CtypesCrypto),\n    b'aes-128-ofb': (16, 16, CtypesCrypto),\n    b'aes-192-ofb': (24, 16, CtypesCrypto),\n    b'aes-256-ofb': (32, 16, CtypesCrypto),\n    b'aes-128-ctr': (16, 16, CtypesCrypto),\n    b'aes-192-ctr': (24, 16, CtypesCrypto),\n    b'aes-256-ctr': (32, 16, CtypesCrypto),\n    b'aes-128-cfb8': (16, 16, CtypesCrypto),\n    b'aes-192-cfb8': (24, 16, CtypesCrypto),\n    b'aes-256-cfb8': (32, 16, CtypesCrypto),\n    b'aes-128-cfb1': (16, 16, CtypesCrypto),\n    b'aes-192-cfb1': (24, 16, CtypesCrypto),\n    b'aes-256-cfb1': (32, 16, CtypesCrypto),\n    b'bf-cfb': (16, 8, CtypesCrypto),\n    b'camellia-128-cfb': (16, 16, CtypesCrypto),\n    b'camellia-192-cfb': (24, 16, CtypesCrypto),\n    b'camellia-256-cfb': (32, 16, CtypesCrypto),\n    b'cast5-cfb': (16, 8, CtypesCrypto),\n    b'des-cfb': (8, 8, CtypesCrypto),\n    b'idea-cfb': (16, 8, CtypesCrypto),\n    b'rc2-cfb': (16, 8, CtypesCrypto),\n    b'rc4': (16, 0, CtypesCrypto),\n    b'seed-cfb': (16, 16, CtypesCrypto),\n}\n\n\ndef run_method(method):\n    from shadowsocks.crypto import util\n\n    cipher = CtypesCrypto(method, b'k' * 32, b'i' * 16, 1)\n    decipher = CtypesCrypto(method, b'k' * 32, b'i' * 16, 0)\n\n    util.run_cipher(cipher, decipher)\n\n\ndef test_aes_128_cfb():\n    run_method(b'aes-128-cfb')\n\n\ndef test_aes_256_cfb():\n    run_method(b'aes-256-cfb')\n\n\ndef test_aes_128_cfb8():\n    run_method(b'aes-128-cfb8')\n\n\ndef test_aes_256_ofb():\n    run_method(b'aes-256-ofb')\n\n\ndef test_aes_256_ctr():\n    run_method(b'aes-256-ctr')\n\n\ndef test_bf_cfb():\n    run_method(b'bf-cfb')\n\n\ndef test_rc4():\n    run_method(b'rc4')\n\n\nif __name__ == '__main__':\n    test_aes_128_cfb()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/crypto/openssl.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nfrom ctypes import c_char_p, c_int, c_long, byref,\\\n    create_string_buffer, c_void_p\n\nfrom shadowsocks import common\nfrom shadowsocks.crypto import util\n\n__all__ = ['ciphers']\n\nlibcrypto = None\nloaded = False\n\nbuf_size = 2048\n\n\ndef load_openssl():\n    global loaded, libcrypto, buf\n\n    libcrypto = util.find_library(('crypto', 'eay32'),\n                                  'EVP_get_cipherbyname',\n                                  'libcrypto')\n    if libcrypto is None:\n        raise Exception('libcrypto(OpenSSL) not found')\n\n    libcrypto.EVP_get_cipherbyname.restype = c_void_p\n    libcrypto.EVP_CIPHER_CTX_new.restype = c_void_p\n\n    libcrypto.EVP_CipherInit_ex.argtypes = (c_void_p, c_void_p, c_char_p,\n                                            c_char_p, c_char_p, c_int)\n\n    libcrypto.EVP_CipherUpdate.argtypes = (c_void_p, c_void_p, c_void_p,\n                                           c_char_p, c_int)\n\n    if hasattr(libcrypto, \"EVP_CIPHER_CTX_cleanup\"):\n        libcrypto.EVP_CIPHER_CTX_cleanup.argtypes = (c_void_p,)\n    else:\n        libcrypto.EVP_CIPHER_CTX_reset.argtypes = (c_void_p,)\n    libcrypto.EVP_CIPHER_CTX_free.argtypes = (c_void_p,)\n\n    libcrypto.RAND_bytes.restype = c_int\n    libcrypto.RAND_bytes.argtypes = (c_void_p, c_int)\n\n    if hasattr(libcrypto, 'OpenSSL_add_all_ciphers'):\n        libcrypto.OpenSSL_add_all_ciphers()\n\n    buf = create_string_buffer(buf_size)\n    loaded = True\n\n\ndef load_cipher(cipher_name):\n    func_name = 'EVP_' + cipher_name.replace('-', '_')\n    cipher = getattr(libcrypto, func_name, None)\n    if cipher:\n        cipher.restype = c_void_p\n        return cipher()\n    return None\n\ndef rand_bytes(length):\n    if not loaded:\n        load_openssl()\n    buf = create_string_buffer(length)\n    r = libcrypto.RAND_bytes(buf, length)\n    if r <= 0:\n        raise Exception('RAND_bytes return error')\n    return buf.raw\n\nclass OpenSSLCrypto(object):\n    def __init__(self, cipher_name, key, iv, op):\n        self._ctx = None\n        if not loaded:\n            load_openssl()\n        cipher = libcrypto.EVP_get_cipherbyname(common.to_bytes(cipher_name))\n        if not cipher:\n            cipher = load_cipher(cipher_name)\n        if not cipher:\n            raise Exception('cipher %s not found in libcrypto' % cipher_name)\n        key_ptr = c_char_p(key)\n        iv_ptr = c_char_p(iv)\n        self._ctx = libcrypto.EVP_CIPHER_CTX_new()\n        if not self._ctx:\n            raise Exception('can not create cipher context')\n        r = libcrypto.EVP_CipherInit_ex(self._ctx, cipher, None,\n                                        key_ptr, iv_ptr, c_int(op))\n        if not r:\n            self.clean()\n            raise Exception('can not initialize cipher context')\n\n    def update(self, data):\n        global buf_size, buf\n        cipher_out_len = c_long(0)\n        l = len(data)\n        if buf_size < l:\n            buf_size = l * 2\n            buf = create_string_buffer(buf_size)\n        libcrypto.EVP_CipherUpdate(self._ctx, byref(buf),\n                                   byref(cipher_out_len), c_char_p(data), l)\n        # buf is copied to a str object when we access buf.raw\n        return buf.raw[:cipher_out_len.value]\n\n    def __del__(self):\n        self.clean()\n\n    def clean(self):\n        if self._ctx:\n            if hasattr(libcrypto, \"EVP_CIPHER_CTX_cleanup\"):\n                libcrypto.EVP_CIPHER_CTX_cleanup(self._ctx)\n            else:\n                libcrypto.EVP_CIPHER_CTX_reset(self._ctx)\n            libcrypto.EVP_CIPHER_CTX_free(self._ctx)\n\n\nciphers = {\n    'aes-128-cbc': (16, 16, OpenSSLCrypto),\n    'aes-192-cbc': (24, 16, OpenSSLCrypto),\n    'aes-256-cbc': (32, 16, OpenSSLCrypto),\n    'aes-128-cfb': (16, 16, OpenSSLCrypto),\n    'aes-192-cfb': (24, 16, OpenSSLCrypto),\n    'aes-256-cfb': (32, 16, OpenSSLCrypto),\n    'aes-128-ofb': (16, 16, OpenSSLCrypto),\n    'aes-192-ofb': (24, 16, OpenSSLCrypto),\n    'aes-256-ofb': (32, 16, OpenSSLCrypto),\n    'aes-128-ctr': (16, 16, OpenSSLCrypto),\n    'aes-192-ctr': (24, 16, OpenSSLCrypto),\n    'aes-256-ctr': (32, 16, OpenSSLCrypto),\n    'aes-128-cfb8': (16, 16, OpenSSLCrypto),\n    'aes-192-cfb8': (24, 16, OpenSSLCrypto),\n    'aes-256-cfb8': (32, 16, OpenSSLCrypto),\n    'aes-128-cfb1': (16, 16, OpenSSLCrypto),\n    'aes-192-cfb1': (24, 16, OpenSSLCrypto),\n    'aes-256-cfb1': (32, 16, OpenSSLCrypto),\n    'bf-cfb': (16, 8, OpenSSLCrypto),\n    'camellia-128-cfb': (16, 16, OpenSSLCrypto),\n    'camellia-192-cfb': (24, 16, OpenSSLCrypto),\n    'camellia-256-cfb': (32, 16, OpenSSLCrypto),\n    'cast5-cfb': (16, 8, OpenSSLCrypto),\n    'des-cfb': (8, 8, OpenSSLCrypto),\n    'idea-cfb': (16, 8, OpenSSLCrypto),\n    'rc2-cfb': (16, 8, OpenSSLCrypto),\n    'rc4': (16, 0, OpenSSLCrypto),\n    'seed-cfb': (16, 16, OpenSSLCrypto),\n}\n\n\ndef run_method(method):\n\n    cipher = OpenSSLCrypto(method, b'k' * 32, b'i' * 16, 1)\n    decipher = OpenSSLCrypto(method, b'k' * 32, b'i' * 16, 0)\n\n    util.run_cipher(cipher, decipher)\n\n\ndef test_aes_128_cfb():\n    run_method('aes-128-cfb')\n\n\ndef test_aes_256_cfb():\n    run_method('aes-256-cfb')\n\n\ndef test_aes_128_cfb8():\n    run_method('aes-128-cfb8')\n\n\ndef test_aes_256_ofb():\n    run_method('aes-256-ofb')\n\n\ndef test_aes_256_ctr():\n    run_method('aes-256-ctr')\n\n\ndef test_bf_cfb():\n    run_method('bf-cfb')\n\n\ndef test_rc4():\n    run_method('rc4')\n\n\nif __name__ == '__main__':\n    test_aes_128_cfb()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/crypto/rc4_md5.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport hashlib\n\nfrom shadowsocks.crypto import openssl\n\n__all__ = ['ciphers']\n\n\ndef create_cipher(alg, key, iv, op, key_as_bytes=0, d=None, salt=None,\n                  i=1, padding=1):\n    md5 = hashlib.md5()\n    md5.update(key)\n    md5.update(iv)\n    rc4_key = md5.digest()\n    return openssl.OpenSSLCrypto(b'rc4', rc4_key, b'', op)\n\n\nciphers = {\n    'rc4-md5': (16, 16, create_cipher),\n    'rc4-md5-6': (16, 6, create_cipher),\n}\n\n\ndef test():\n    from shadowsocks.crypto import util\n\n    cipher = create_cipher('rc4-md5', b'k' * 32, b'i' * 16, 1)\n    decipher = create_cipher('rc4-md5', b'k' * 32, b'i' * 16, 0)\n\n    util.run_cipher(cipher, decipher)\n\n\nif __name__ == '__main__':\n    test()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/crypto/sodium.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nfrom ctypes import c_char_p, c_int, c_ulong, c_ulonglong, byref, \\\n    create_string_buffer, c_void_p\n\nfrom shadowsocks.crypto import util\n\n__all__ = ['ciphers']\n\nlibsodium = None\nloaded = False\n\nbuf_size = 2048\n\n# for salsa20 and chacha20 and chacha20-ietf\nBLOCK_SIZE = 64\n\n\ndef load_libsodium():\n    global loaded, libsodium, buf\n\n    libsodium = util.find_library('sodium', 'crypto_stream_salsa20_xor_ic',\n                                  'libsodium')\n    if libsodium is None:\n        raise Exception('libsodium not found')\n\n    libsodium.crypto_stream_salsa20_xor_ic.restype = c_int\n    libsodium.crypto_stream_salsa20_xor_ic.argtypes = (c_void_p, c_char_p,\n                                                       c_ulonglong,\n                                                       c_char_p, c_ulonglong,\n                                                       c_char_p)\n    libsodium.crypto_stream_chacha20_xor_ic.restype = c_int\n    libsodium.crypto_stream_chacha20_xor_ic.argtypes = (c_void_p, c_char_p,\n                                                        c_ulonglong,\n                                                        c_char_p, c_ulonglong,\n                                                        c_char_p)\n\n    try:\n        libsodium.crypto_stream_chacha20_ietf_xor_ic.restype = c_int\n        libsodium.crypto_stream_chacha20_ietf_xor_ic.argtypes = (c_void_p, c_char_p,\n                                                        c_ulonglong,\n                                                        c_char_p, c_ulong,\n                                                        c_char_p)\n    except:\n        pass\n\n    buf = create_string_buffer(buf_size)\n    loaded = True\n\n\nclass SodiumCrypto(object):\n    def __init__(self, cipher_name, key, iv, op):\n        if not loaded:\n            load_libsodium()\n        self.key = key\n        self.iv = iv\n        self.key_ptr = c_char_p(key)\n        self.iv_ptr = c_char_p(iv)\n        if cipher_name == 'salsa20':\n            self.cipher = libsodium.crypto_stream_salsa20_xor_ic\n        elif cipher_name == 'chacha20':\n            self.cipher = libsodium.crypto_stream_chacha20_xor_ic\n        elif cipher_name == 'chacha20-ietf':\n            self.cipher = libsodium.crypto_stream_chacha20_ietf_xor_ic\n        else:\n            raise Exception('Unknown cipher')\n        # byte counter, not block counter\n        self.counter = 0\n\n    def update(self, data):\n        global buf_size, buf\n        l = len(data)\n\n        # we can only prepend some padding to make the encryption align to\n        # blocks\n        padding = self.counter % BLOCK_SIZE\n        if buf_size < padding + l:\n            buf_size = (padding + l) * 2\n            buf = create_string_buffer(buf_size)\n\n        if padding:\n            data = (b'\\0' * padding) + data\n        self.cipher(byref(buf), c_char_p(data), padding + l,\n                    self.iv_ptr, int(self.counter / BLOCK_SIZE), self.key_ptr)\n        self.counter += l\n        # buf is copied to a str object when we access buf.raw\n        # strip off the padding\n        return buf.raw[padding:padding + l]\n\n\nciphers = {\n    'salsa20': (32, 8, SodiumCrypto),\n    'chacha20': (32, 8, SodiumCrypto),\n    'chacha20-ietf': (32, 12, SodiumCrypto),\n}\n\n\ndef test_salsa20():\n    cipher = SodiumCrypto('salsa20', b'k' * 32, b'i' * 16, 1)\n    decipher = SodiumCrypto('salsa20', b'k' * 32, b'i' * 16, 0)\n\n    util.run_cipher(cipher, decipher)\n\n\ndef test_chacha20():\n\n    cipher = SodiumCrypto('chacha20', b'k' * 32, b'i' * 16, 1)\n    decipher = SodiumCrypto('chacha20', b'k' * 32, b'i' * 16, 0)\n\n    util.run_cipher(cipher, decipher)\n\n\ndef test_chacha20_ietf():\n\n    cipher = SodiumCrypto('chacha20-ietf', b'k' * 32, b'i' * 16, 1)\n    decipher = SodiumCrypto('chacha20-ietf', b'k' * 32, b'i' * 16, 0)\n\n    util.run_cipher(cipher, decipher)\n\nif __name__ == '__main__':\n    test_chacha20_ietf()\n    test_chacha20()\n    test_salsa20()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/crypto/table.py",
    "content": "# !/usr/bin/env python\n#\n# Copyright 2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport string\nimport struct\nimport hashlib\n\n\n__all__ = ['ciphers']\n\ncached_tables = {}\n\nif hasattr(string, 'maketrans'):\n    maketrans = string.maketrans\n    translate = string.translate\nelse:\n    maketrans = bytes.maketrans\n    translate = bytes.translate\n\n\ndef get_table(key):\n    m = hashlib.md5()\n    m.update(key)\n    s = m.digest()\n    a, b = struct.unpack('<QQ', s)\n    table = maketrans(b'', b'')\n    table = [table[i: i + 1] for i in range(len(table))]\n    for i in range(1, 1024):\n        table.sort(key=lambda x: int(a % (ord(x) + i)))\n    return table\n\n\ndef init_table(key):\n    if key not in cached_tables:\n        encrypt_table = b''.join(get_table(key))\n        decrypt_table = maketrans(encrypt_table, maketrans(b'', b''))\n        cached_tables[key] = [encrypt_table, decrypt_table]\n    return cached_tables[key]\n\n\nclass TableCipher(object):\n    def __init__(self, cipher_name, key, iv, op):\n        self._encrypt_table, self._decrypt_table = init_table(key)\n        self._op = op\n\n    def update(self, data):\n        if self._op:\n            return translate(data, self._encrypt_table)\n        else:\n            return translate(data, self._decrypt_table)\n\nclass NoneCipher(object):\n    def __init__(self, cipher_name, key, iv, op):\n        pass\n\n    def update(self, data):\n        return data\n\nciphers = {\n    'none': (16, 0, NoneCipher),\n    'table': (16, 0, TableCipher)\n}\n\n\ndef test_table_result():\n    from shadowsocks.common import ord\n    target1 = [\n        [60, 53, 84, 138, 217, 94, 88, 23, 39, 242, 219, 35, 12, 157, 165, 181,\n         255, 143, 83, 247, 162, 16, 31, 209, 190, 171, 115, 65, 38, 41, 21,\n         245, 236, 46, 121, 62, 166, 233, 44, 154, 153, 145, 230, 49, 128, 216,\n         173, 29, 241, 119, 64, 229, 194, 103, 131, 110, 26, 197, 218, 59, 204,\n         56, 27, 34, 141, 221, 149, 239, 192, 195, 24, 155, 170, 183, 11, 254,\n         213, 37, 137, 226, 75, 203, 55, 19, 72, 248, 22, 129, 33, 175, 178,\n         10, 198, 71, 77, 36, 113, 167, 48, 2, 117, 140, 142, 66, 199, 232,\n         243, 32, 123, 54, 51, 82, 57, 177, 87, 251, 150, 196, 133, 5, 253,\n         130, 8, 184, 14, 152, 231, 3, 186, 159, 76, 89, 228, 205, 156, 96,\n         163, 146, 18, 91, 132, 85, 80, 109, 172, 176, 105, 13, 50, 235, 127,\n         0, 189, 95, 98, 136, 250, 200, 108, 179, 211, 214, 106, 168, 78, 79,\n         74, 210, 30, 73, 201, 151, 208, 114, 101, 174, 92, 52, 120, 240, 15,\n         169, 220, 182, 81, 224, 43, 185, 40, 99, 180, 17, 212, 158, 42, 90, 9,\n         191, 45, 6, 25, 4, 222, 67, 126, 1, 116, 124, 206, 69, 61, 7, 68, 97,\n         202, 63, 244, 20, 28, 58, 93, 134, 104, 144, 227, 147, 102, 118, 135,\n         148, 47, 238, 86, 112, 122, 70, 107, 215, 100, 139, 223, 225, 164,\n         237, 111, 125, 207, 160, 187, 246, 234, 161, 188, 193, 249, 252],\n        [151, 205, 99, 127, 201, 119, 199, 211, 122, 196, 91, 74, 12, 147, 124,\n         180, 21, 191, 138, 83, 217, 30, 86, 7, 70, 200, 56, 62, 218, 47, 168,\n         22, 107, 88, 63, 11, 95, 77, 28, 8, 188, 29, 194, 186, 38, 198, 33,\n         230, 98, 43, 148, 110, 177, 1, 109, 82, 61, 112, 219, 59, 0, 210, 35,\n         215, 50, 27, 103, 203, 212, 209, 235, 93, 84, 169, 166, 80, 130, 94,\n         164, 165, 142, 184, 111, 18, 2, 141, 232, 114, 6, 131, 195, 139, 176,\n         220, 5, 153, 135, 213, 154, 189, 238, 174, 226, 53, 222, 146, 162,\n         236, 158, 143, 55, 244, 233, 96, 173, 26, 206, 100, 227, 49, 178, 34,\n         234, 108, 207, 245, 204, 150, 44, 87, 121, 54, 140, 118, 221, 228,\n         155, 78, 3, 239, 101, 64, 102, 17, 223, 41, 137, 225, 229, 66, 116,\n         171, 125, 40, 39, 71, 134, 13, 193, 129, 247, 251, 20, 136, 242, 14,\n         36, 97, 163, 181, 72, 25, 144, 46, 175, 89, 145, 113, 90, 159, 190,\n         15, 183, 73, 123, 187, 128, 248, 252, 152, 24, 197, 68, 253, 52, 69,\n         117, 57, 92, 104, 157, 170, 214, 81, 60, 133, 208, 246, 172, 23, 167,\n         160, 192, 76, 161, 237, 45, 4, 58, 10, 182, 65, 202, 240, 185, 241,\n         79, 224, 132, 51, 42, 126, 105, 37, 250, 149, 32, 243, 231, 67, 179,\n         48, 9, 106, 216, 31, 249, 19, 85, 254, 156, 115, 255, 120, 75, 16]]\n\n    target2 = [\n        [124, 30, 170, 247, 27, 127, 224, 59, 13, 22, 196, 76, 72, 154, 32,\n         209, 4, 2, 131, 62, 101, 51, 230, 9, 166, 11, 99, 80, 208, 112, 36,\n         248, 81, 102, 130, 88, 218, 38, 168, 15, 241, 228, 167, 117, 158, 41,\n         10, 180, 194, 50, 204, 243, 246, 251, 29, 198, 219, 210, 195, 21, 54,\n         91, 203, 221, 70, 57, 183, 17, 147, 49, 133, 65, 77, 55, 202, 122,\n         162, 169, 188, 200, 190, 125, 63, 244, 96, 31, 107, 106, 74, 143, 116,\n         148, 78, 46, 1, 137, 150, 110, 181, 56, 95, 139, 58, 3, 231, 66, 165,\n         142, 242, 43, 192, 157, 89, 175, 109, 220, 128, 0, 178, 42, 255, 20,\n         214, 185, 83, 160, 253, 7, 23, 92, 111, 153, 26, 226, 33, 176, 144,\n         18, 216, 212, 28, 151, 71, 206, 222, 182, 8, 174, 205, 201, 152, 240,\n         155, 108, 223, 104, 239, 98, 164, 211, 184, 34, 193, 14, 114, 187, 40,\n         254, 12, 67, 93, 217, 6, 94, 16, 19, 82, 86, 245, 24, 197, 134, 132,\n         138, 229, 121, 5, 235, 238, 85, 47, 103, 113, 179, 69, 250, 45, 135,\n         156, 25, 61, 75, 44, 146, 189, 84, 207, 172, 119, 53, 123, 186, 120,\n         171, 68, 227, 145, 136, 100, 90, 48, 79, 159, 149, 39, 213, 236, 126,\n         52, 60, 225, 199, 105, 73, 233, 252, 118, 215, 35, 115, 64, 37, 97,\n         129, 161, 177, 87, 237, 141, 173, 191, 163, 140, 234, 232, 249],\n        [117, 94, 17, 103, 16, 186, 172, 127, 146, 23, 46, 25, 168, 8, 163, 39,\n         174, 67, 137, 175, 121, 59, 9, 128, 179, 199, 132, 4, 140, 54, 1, 85,\n         14, 134, 161, 238, 30, 241, 37, 224, 166, 45, 119, 109, 202, 196, 93,\n         190, 220, 69, 49, 21, 228, 209, 60, 73, 99, 65, 102, 7, 229, 200, 19,\n         82, 240, 71, 105, 169, 214, 194, 64, 142, 12, 233, 88, 201, 11, 72,\n         92, 221, 27, 32, 176, 124, 205, 189, 177, 246, 35, 112, 219, 61, 129,\n         170, 173, 100, 84, 242, 157, 26, 218, 20, 33, 191, 155, 232, 87, 86,\n         153, 114, 97, 130, 29, 192, 164, 239, 90, 43, 236, 208, 212, 185, 75,\n         210, 0, 81, 227, 5, 116, 243, 34, 18, 182, 70, 181, 197, 217, 95, 183,\n         101, 252, 248, 107, 89, 136, 216, 203, 68, 91, 223, 96, 141, 150, 131,\n         13, 152, 198, 111, 44, 222, 125, 244, 76, 251, 158, 106, 24, 42, 38,\n         77, 2, 213, 207, 249, 147, 113, 135, 245, 118, 193, 47, 98, 145, 66,\n         160, 123, 211, 165, 78, 204, 80, 250, 110, 162, 48, 58, 10, 180, 55,\n         231, 79, 149, 74, 62, 50, 148, 143, 206, 28, 15, 57, 159, 139, 225,\n         122, 237, 138, 171, 36, 56, 115, 63, 144, 154, 6, 230, 133, 215, 41,\n         184, 22, 104, 254, 234, 253, 187, 226, 247, 188, 156, 151, 40, 108,\n         51, 83, 178, 52, 3, 31, 255, 195, 53, 235, 126, 167, 120]]\n\n    encrypt_table = b''.join(get_table(b'foobar!'))\n    decrypt_table = maketrans(encrypt_table, maketrans(b'', b''))\n\n    for i in range(0, 256):\n        assert (target1[0][i] == ord(encrypt_table[i]))\n        assert (target1[1][i] == ord(decrypt_table[i]))\n\n    encrypt_table = b''.join(get_table(b'barfoo!'))\n    decrypt_table = maketrans(encrypt_table, maketrans(b'', b''))\n\n    for i in range(0, 256):\n        assert (target2[0][i] == ord(encrypt_table[i]))\n        assert (target2[1][i] == ord(decrypt_table[i]))\n\n\ndef test_encryption():\n    from shadowsocks.crypto import util\n\n    cipher = TableCipher('table', b'test', b'', 1)\n    decipher = TableCipher('table', b'test', b'', 0)\n\n    util.run_cipher(cipher, decipher)\n\n\nif __name__ == '__main__':\n    test_table_result()\n    test_encryption()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/crypto/util.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport os\nimport logging\n\n\ndef find_library_nt(name):\n    # modified from ctypes.util\n    # ctypes.util.find_library just returns first result he found\n    # but we want to try them all\n    # because on Windows, users may have both 32bit and 64bit version installed\n    results = []\n    for directory in os.environ['PATH'].split(os.pathsep):\n        fname = os.path.join(directory, name)\n        if os.path.isfile(fname):\n            results.append(fname)\n        if fname.lower().endswith(\".dll\"):\n            continue\n        fname = fname + \".dll\"\n        if os.path.isfile(fname):\n            results.append(fname)\n    return results\n\n\ndef find_library(possible_lib_names, search_symbol, library_name):\n    import ctypes.util\n    from ctypes import CDLL\n\n    paths = []\n\n    if type(possible_lib_names) not in (list, tuple):\n        possible_lib_names = [possible_lib_names]\n\n    lib_names = []\n    for lib_name in possible_lib_names:\n        lib_names.append(lib_name)\n        lib_names.append('lib' + lib_name)\n\n    for name in lib_names:\n        if os.name == \"nt\":\n            paths.extend(find_library_nt(name))\n        else:\n            path = ctypes.util.find_library(name)\n            if path:\n                paths.append(path)\n\n    if not paths:\n        # We may get here when find_library fails because, for example,\n        # the user does not have sufficient privileges to access those\n        # tools underlying find_library on linux.\n        import glob\n\n        for name in lib_names:\n            patterns = [\n                '/usr/local/lib*/lib%s.*' % name,\n                '/usr/lib*/lib%s.*' % name,\n                'lib%s.*' % name,\n                '%s.dll' % name]\n\n            for pat in patterns:\n                files = glob.glob(pat)\n                if files:\n                    paths.extend(files)\n    for path in paths:\n        try:\n            lib = CDLL(path)\n            if hasattr(lib, search_symbol):\n                logging.info('loading %s from %s', library_name, path)\n                return lib\n            else:\n                logging.warn('can\\'t find symbol %s in %s', search_symbol,\n                             path)\n        except Exception:\n            if path == paths[-1]:\n                raise\n    return None\n\n\ndef run_cipher(cipher, decipher):\n    from os import urandom\n    import random\n    import time\n\n    BLOCK_SIZE = 16384\n    rounds = 1 * 1024\n    plain = urandom(BLOCK_SIZE * rounds)\n\n    results = []\n    pos = 0\n    print('test start')\n    start = time.time()\n    while pos < len(plain):\n        l = random.randint(100, 32768)\n        c = cipher.update(plain[pos:pos + l])\n        results.append(c)\n        pos += l\n    pos = 0\n    c = b''.join(results)\n    results = []\n    while pos < len(plain):\n        l = random.randint(100, 32768)\n        results.append(decipher.update(c[pos:pos + l]))\n        pos += l\n    end = time.time()\n    print('speed: %d bytes/s' % (BLOCK_SIZE * rounds / (end - start)))\n    assert b''.join(results) == plain\n\n\ndef test_find_library():\n    assert find_library('c', 'strcpy', 'libc') is not None\n    assert find_library(['c'], 'strcpy', 'libc') is not None\n    assert find_library(('c',), 'strcpy', 'libc') is not None\n    assert find_library(('crypto', 'eay32'), 'EVP_CipherUpdate',\n                        'libcrypto') is not None\n    assert find_library('notexist', 'strcpy', 'libnotexist') is None\n    assert find_library('c', 'symbol_not_exist', 'c') is None\n    assert find_library(('notexist', 'c', 'crypto', 'eay32'),\n                        'EVP_CipherUpdate', 'libc') is not None\n\n\nif __name__ == '__main__':\n    test_find_library()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/daemon.py",
    "content": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n#\n# Copyright 2014-2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport os\nimport sys\nimport logging\nimport signal\nimport time\nfrom shadowsocks import common, shell\n\n# this module is ported from ShadowVPN daemon.c\n\n\ndef daemon_exec(config):\n    if 'daemon' in config:\n        if os.name != 'posix':\n            raise Exception('daemon mode is only supported on Unix')\n        command = config['daemon']\n        if not command:\n            command = 'start'\n        pid_file = config['pid-file']\n        log_file = config['log-file']\n        if command == 'start':\n            daemon_start(pid_file, log_file)\n        elif command == 'stop':\n            daemon_stop(pid_file)\n            # always exit after daemon_stop\n            sys.exit(0)\n        elif command == 'restart':\n            daemon_stop(pid_file)\n            daemon_start(pid_file, log_file)\n        else:\n            raise Exception('unsupported daemon command %s' % command)\n\n\ndef write_pid_file(pid_file, pid):\n    import fcntl\n    import stat\n\n    try:\n        fd = os.open(pid_file, os.O_RDWR | os.O_CREAT,\n                     stat.S_IRUSR | stat.S_IWUSR)\n    except OSError as e:\n        shell.print_exception(e)\n        return -1\n    flags = fcntl.fcntl(fd, fcntl.F_GETFD)\n    assert flags != -1\n    flags |= fcntl.FD_CLOEXEC\n    r = fcntl.fcntl(fd, fcntl.F_SETFD, flags)\n    assert r != -1\n    # There is no platform independent way to implement fcntl(fd, F_SETLK, &fl)\n    # via fcntl.fcntl. So use lockf instead\n    try:\n        fcntl.lockf(fd, fcntl.LOCK_EX | fcntl.LOCK_NB, 0, 0, os.SEEK_SET)\n    except IOError:\n        r = os.read(fd, 32)\n        if r:\n            logging.error('already started at pid %s' % common.to_str(r))\n        else:\n            logging.error('already started')\n        os.close(fd)\n        return -1\n    os.ftruncate(fd, 0)\n    os.write(fd, common.to_bytes(str(pid)))\n    return 0\n\n\ndef freopen(f, mode, stream):\n    oldf = open(f, mode)\n    oldfd = oldf.fileno()\n    newfd = stream.fileno()\n    os.close(newfd)\n    os.dup2(oldfd, newfd)\n\n\ndef daemon_start(pid_file, log_file):\n\n    def handle_exit(signum, _):\n        if signum == signal.SIGTERM:\n            sys.exit(0)\n        sys.exit(1)\n\n    signal.signal(signal.SIGINT, handle_exit)\n    signal.signal(signal.SIGTERM, handle_exit)\n\n    # fork only once because we are sure parent will exit\n    pid = os.fork()\n    assert pid != -1\n\n    if pid > 0:\n        # parent waits for its child\n        time.sleep(5)\n        sys.exit(0)\n\n    # child signals its parent to exit\n    ppid = os.getppid()\n    pid = os.getpid()\n    if write_pid_file(pid_file, pid) != 0:\n        os.kill(ppid, signal.SIGINT)\n        sys.exit(1)\n\n    os.setsid()\n    signal.signal(signal.SIG_IGN, signal.SIGHUP)\n\n    print('started')\n    os.kill(ppid, signal.SIGTERM)\n\n    sys.stdin.close()\n    try:\n        freopen(log_file, 'a', sys.stdout)\n        freopen(log_file, 'a', sys.stderr)\n    except IOError as e:\n        shell.print_exception(e)\n        sys.exit(1)\n\n\ndef daemon_stop(pid_file):\n    import errno\n    try:\n        with open(pid_file) as f:\n            buf = f.read()\n            pid = common.to_str(buf)\n            if not buf:\n                logging.error('not running')\n    except IOError as e:\n        shell.print_exception(e)\n        if e.errno == errno.ENOENT:\n            # always exit 0 if we are sure daemon is not running\n            logging.error('not running')\n            return\n        sys.exit(1)\n    pid = int(pid)\n    if pid > 0:\n        try:\n            os.kill(pid, signal.SIGTERM)\n        except OSError as e:\n            if e.errno == errno.ESRCH:\n                logging.error('not running')\n                # always exit 0 if we are sure daemon is not running\n                return\n            shell.print_exception(e)\n            sys.exit(1)\n    else:\n        logging.error('pid is not positive: %d', pid)\n\n    # sleep for maximum 10s\n    for i in range(0, 200):\n        try:\n            # query for the pid\n            os.kill(pid, 0)\n        except OSError as e:\n            if e.errno == errno.ESRCH:\n                break\n        time.sleep(0.05)\n    else:\n        logging.error('timed out when stopping pid %d', pid)\n        sys.exit(1)\n    print('stopped')\n    os.unlink(pid_file)\n\n\ndef set_user(username):\n    if username is None:\n        return\n\n    import pwd\n    import grp\n\n    try:\n        pwrec = pwd.getpwnam(username)\n    except KeyError:\n        logging.error('user not found: %s' % username)\n        raise\n    user = pwrec[0]\n    uid = pwrec[2]\n    gid = pwrec[3]\n\n    cur_uid = os.getuid()\n    if uid == cur_uid:\n        return\n    if cur_uid != 0:\n        logging.error('can not set user as nonroot user')\n        # will raise later\n\n    # inspired by supervisor\n    if hasattr(os, 'setgroups'):\n        groups = [grprec[2] for grprec in grp.getgrall() if user in grprec[3]]\n        groups.insert(0, gid)\n        os.setgroups(groups)\n    os.setgid(gid)\n    os.setuid(uid)\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/encrypt.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2012-2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport os\nimport sys\nimport hashlib\nimport logging\n\nfrom shadowsocks import common\nfrom shadowsocks.crypto import rc4_md5, openssl, sodium, table\n\n\nmethod_supported = {}\nmethod_supported.update(rc4_md5.ciphers)\nmethod_supported.update(openssl.ciphers)\nmethod_supported.update(sodium.ciphers)\nmethod_supported.update(table.ciphers)\n\n\ndef random_string(length):\n    try:\n        return os.urandom(length)\n    except NotImplementedError as e:\n        return openssl.rand_bytes(length)\n\ncached_keys = {}\n\n\ndef try_cipher(key, method=None):\n    Encryptor(key, method)\n\n\ndef EVP_BytesToKey(password, key_len, iv_len):\n    # equivalent to OpenSSL's EVP_BytesToKey() with count 1\n    # so that we make the same key and iv as nodejs version\n    if hasattr(password, 'encode'):\n        password = password.encode('utf-8')\n    cached_key = '%s-%d-%d' % (password, key_len, iv_len)\n    r = cached_keys.get(cached_key, None)\n    if r:\n        return r\n    m = []\n    i = 0\n    while len(b''.join(m)) < (key_len + iv_len):\n        md5 = hashlib.md5()\n        data = password\n        if i > 0:\n            data = m[i - 1] + password\n        md5.update(data)\n        m.append(md5.digest())\n        i += 1\n    ms = b''.join(m)\n    key = ms[:key_len]\n    iv = ms[key_len:key_len + iv_len]\n    cached_keys[cached_key] = (key, iv)\n    return key, iv\n\n\nclass Encryptor(object):\n    def __init__(self, key, method, iv = None):\n        self.key = key\n        self.method = method\n        self.iv = None\n        self.iv_sent = False\n        self.cipher_iv = b''\n        self.iv_buf = b''\n        self.cipher_key = b''\n        self.decipher = None\n        method = method.lower()\n        self._method_info = self.get_method_info(method)\n        if self._method_info:\n            if iv is None or len(iv) != self._method_info[1]:\n                self.cipher = self.get_cipher(key, method, 1,\n                                          random_string(self._method_info[1]))\n            else:\n                self.cipher = self.get_cipher(key, method, 1, iv)\n        else:\n            logging.error('method %s not supported' % method)\n            sys.exit(1)\n\n    def get_method_info(self, method):\n        method = method.lower()\n        m = method_supported.get(method)\n        return m\n\n    def iv_len(self):\n        return len(self.cipher_iv)\n\n    def get_cipher(self, password, method, op, iv):\n        password = common.to_bytes(password)\n        m = self._method_info\n        if m[0] > 0:\n            key, iv_ = EVP_BytesToKey(password, m[0], m[1])\n        else:\n            # key_length == 0 indicates we should use the key directly\n            key, iv = password, b''\n\n        iv = iv[:m[1]]\n        if op == 1:\n            # this iv is for cipher not decipher\n            self.cipher_iv = iv[:m[1]]\n        self.cipher_key = key\n        return m[2](method, key, iv, op)\n\n    def encrypt(self, buf):\n        if len(buf) == 0:\n            return buf\n        if self.iv_sent:\n            return self.cipher.update(buf)\n        else:\n            self.iv_sent = True\n            return self.cipher_iv + self.cipher.update(buf)\n\n    def decrypt(self, buf):\n        if len(buf) == 0:\n            return buf\n        if self.decipher is not None: #optimize\n            return self.decipher.update(buf)\n\n        decipher_iv_len = self._method_info[1]\n        if len(self.iv_buf) <= decipher_iv_len:\n            self.iv_buf += buf\n        if len(self.iv_buf) > decipher_iv_len:\n            decipher_iv = self.iv_buf[:decipher_iv_len]\n            self.decipher = self.get_cipher(self.key, self.method, 0,\n                                            iv=decipher_iv)\n            buf = self.iv_buf[decipher_iv_len:]\n            del self.iv_buf\n            return self.decipher.update(buf)\n        else:\n            return b''\n\ndef encrypt_all(password, method, op, data):\n    result = []\n    method = method.lower()\n    (key_len, iv_len, m) = method_supported[method]\n    if key_len > 0:\n        key, _ = EVP_BytesToKey(password, key_len, iv_len)\n    else:\n        key = password\n    if op:\n        iv = random_string(iv_len)\n        result.append(iv)\n    else:\n        iv = data[:iv_len]\n        data = data[iv_len:]\n    cipher = m(method, key, iv, op)\n    result.append(cipher.update(data))\n    return b''.join(result)\n\ndef encrypt_key(password, method):\n    method = method.lower()\n    (key_len, iv_len, m) = method_supported[method]\n    if key_len > 0:\n        key, _ = EVP_BytesToKey(password, key_len, iv_len)\n    else:\n        key = password\n    return key\n\ndef encrypt_iv_len(method):\n    method = method.lower()\n    (key_len, iv_len, m) = method_supported[method]\n    return iv_len\n\ndef encrypt_new_iv(method):\n    method = method.lower()\n    (key_len, iv_len, m) = method_supported[method]\n    return random_string(iv_len)\n\ndef encrypt_all_iv(key, method, op, data, ref_iv):\n    result = []\n    method = method.lower()\n    (key_len, iv_len, m) = method_supported[method]\n    if op:\n        iv = ref_iv[0]\n        result.append(iv)\n    else:\n        iv = data[:iv_len]\n        data = data[iv_len:]\n        ref_iv[0] = iv\n    cipher = m(method, key, iv, op)\n    result.append(cipher.update(data))\n    return b''.join(result)\n\n\nCIPHERS_TO_TEST = [\n    'aes-128-cfb',\n    'aes-256-cfb',\n    'rc4-md5',\n    'salsa20',\n    'chacha20',\n    'table',\n]\n\n\ndef test_encryptor():\n    from os import urandom\n    plain = urandom(10240)\n    for method in CIPHERS_TO_TEST:\n        logging.warn(method)\n        encryptor = Encryptor(b'key', method)\n        decryptor = Encryptor(b'key', method)\n        cipher = encryptor.encrypt(plain)\n        plain2 = decryptor.decrypt(cipher)\n        assert plain == plain2\n\n\ndef test_encrypt_all():\n    from os import urandom\n    plain = urandom(10240)\n    for method in CIPHERS_TO_TEST:\n        logging.warn(method)\n        cipher = encrypt_all(b'key', method, 1, plain)\n        plain2 = encrypt_all(b'key', method, 0, cipher)\n        assert plain == plain2\n\n\nif __name__ == '__main__':\n    test_encrypt_all()\n    test_encryptor()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/eventloop.py",
    "content": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n#\n# Copyright 2013-2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\n# from ssloop\n# https://github.com/clowwindy/ssloop\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport os\nimport time\nimport socket\nimport select\nimport errno\nimport logging\nfrom collections import defaultdict\n\nfrom shadowsocks import shell\n\n\n__all__ = ['EventLoop', 'POLL_NULL', 'POLL_IN', 'POLL_OUT', 'POLL_ERR',\n           'POLL_HUP', 'POLL_NVAL', 'EVENT_NAMES']\n\nPOLL_NULL = 0x00\nPOLL_IN = 0x01\nPOLL_OUT = 0x04\nPOLL_ERR = 0x08\nPOLL_HUP = 0x10\nPOLL_NVAL = 0x20\n\n\nEVENT_NAMES = {\n    POLL_NULL: 'POLL_NULL',\n    POLL_IN: 'POLL_IN',\n    POLL_OUT: 'POLL_OUT',\n    POLL_ERR: 'POLL_ERR',\n    POLL_HUP: 'POLL_HUP',\n    POLL_NVAL: 'POLL_NVAL',\n}\n\n# we check timeouts every TIMEOUT_PRECISION seconds\nTIMEOUT_PRECISION = 2\n\n\nclass KqueueLoop(object):\n\n    MAX_EVENTS = 1024\n\n    def __init__(self):\n        self._kqueue = select.kqueue()\n        self._fds = {}\n\n    def _control(self, fd, mode, flags):\n        events = []\n        if mode & POLL_IN:\n            events.append(select.kevent(fd, select.KQ_FILTER_READ, flags))\n        if mode & POLL_OUT:\n            events.append(select.kevent(fd, select.KQ_FILTER_WRITE, flags))\n        for e in events:\n            self._kqueue.control([e], 0)\n\n    def poll(self, timeout):\n        if timeout < 0:\n            timeout = None  # kqueue behaviour\n        events = self._kqueue.control(None, KqueueLoop.MAX_EVENTS, timeout)\n        results = defaultdict(lambda: POLL_NULL)\n        for e in events:\n            fd = e.ident\n            if e.filter == select.KQ_FILTER_READ:\n                results[fd] |= POLL_IN\n            elif e.filter == select.KQ_FILTER_WRITE:\n                results[fd] |= POLL_OUT\n        return results.items()\n\n    def register(self, fd, mode):\n        self._fds[fd] = mode\n        self._control(fd, mode, select.KQ_EV_ADD)\n\n    def unregister(self, fd):\n        self._control(fd, self._fds[fd], select.KQ_EV_DELETE)\n        del self._fds[fd]\n\n    def modify(self, fd, mode):\n        self.unregister(fd)\n        self.register(fd, mode)\n\n    def close(self):\n        self._kqueue.close()\n\n\nclass SelectLoop(object):\n\n    def __init__(self):\n        self._r_list = set()\n        self._w_list = set()\n        self._x_list = set()\n\n    def poll(self, timeout):\n        r, w, x = select.select(self._r_list, self._w_list, self._x_list,\n                                timeout)\n        results = defaultdict(lambda: POLL_NULL)\n        for p in [(r, POLL_IN), (w, POLL_OUT), (x, POLL_ERR)]:\n            for fd in p[0]:\n                results[fd] |= p[1]\n        return results.items()\n\n    def register(self, fd, mode):\n        if mode & POLL_IN:\n            self._r_list.add(fd)\n        if mode & POLL_OUT:\n            self._w_list.add(fd)\n        if mode & POLL_ERR:\n            self._x_list.add(fd)\n\n    def unregister(self, fd):\n        if fd in self._r_list:\n            self._r_list.remove(fd)\n        if fd in self._w_list:\n            self._w_list.remove(fd)\n        if fd in self._x_list:\n            self._x_list.remove(fd)\n\n    def modify(self, fd, mode):\n        self.unregister(fd)\n        self.register(fd, mode)\n\n    def close(self):\n        pass\n\n\nclass EventLoop(object):\n    def __init__(self):\n        if hasattr(select, 'epoll'):\n            self._impl = select.epoll()\n            model = 'epoll'\n        elif hasattr(select, 'kqueue'):\n            self._impl = KqueueLoop()\n            model = 'kqueue'\n        elif hasattr(select, 'select'):\n            self._impl = SelectLoop()\n            model = 'select'\n        else:\n            raise Exception('can not find any available functions in select '\n                            'package')\n        self._fdmap = {}  # (f, handler)\n        self._last_time = time.time()\n        self._periodic_callbacks = []\n        self._stopping = False\n        logging.debug('using event model: %s', model)\n\n    def poll(self, timeout=None):\n        events = self._impl.poll(timeout)\n        return [(self._fdmap[fd][0], fd, event) for fd, event in events]\n\n    def add(self, f, mode, handler):\n        fd = f.fileno()\n        self._fdmap[fd] = (f, handler)\n        self._impl.register(fd, mode)\n\n    def remove(self, f):\n        fd = f.fileno()\n        del self._fdmap[fd]\n        self._impl.unregister(fd)\n\n    def removefd(self, fd):\n        del self._fdmap[fd]\n        self._impl.unregister(fd)\n\n    def add_periodic(self, callback):\n        self._periodic_callbacks.append(callback)\n\n    def remove_periodic(self, callback):\n        self._periodic_callbacks.remove(callback)\n\n    def modify(self, f, mode):\n        fd = f.fileno()\n        self._impl.modify(fd, mode)\n\n    def stop(self):\n        self._stopping = True\n\n    def run(self):\n        events = []\n        while not self._stopping:\n            asap = False\n            try:\n                events = self.poll(TIMEOUT_PRECISION)\n            except (OSError, IOError) as e:\n                if errno_from_exception(e) in (errno.EPIPE, errno.EINTR):\n                    # EPIPE: Happens when the client closes the connection\n                    # EINTR: Happens when received a signal\n                    # handles them as soon as possible\n                    asap = True\n                    logging.debug('poll:%s', e)\n                else:\n                    logging.error('poll:%s', e)\n                    import traceback\n                    traceback.print_exc()\n                    continue\n\n            handle = False\n            for sock, fd, event in events:\n                handler = self._fdmap.get(fd, None)\n                if handler is not None:\n                    handler = handler[1]\n                    try:\n                        handle = handler.handle_event(sock, fd, event) or handle\n                    except (OSError, IOError) as e:\n                        shell.print_exception(e)\n            now = time.time()\n            if asap or now - self._last_time >= TIMEOUT_PRECISION:\n                for callback in self._periodic_callbacks:\n                    callback()\n                self._last_time = now\n            if events and not handle:\n                time.sleep(0.001)\n\n    def __del__(self):\n        self._impl.close()\n\n\n# from tornado\ndef errno_from_exception(e):\n    \"\"\"Provides the errno from an Exception object.\n\n    There are cases that the errno attribute was not set so we pull\n    the errno out of the args but if someone instatiates an Exception\n    without any args you will get a tuple error. So this function\n    abstracts all that behavior to give you a safe way to get the\n    errno.\n    \"\"\"\n\n    if hasattr(e, 'errno'):\n        return e.errno\n    elif e.args:\n        return e.args[0]\n    else:\n        return None\n\n\n# from tornado\ndef get_sock_error(sock):\n    error_number = sock.getsockopt(socket.SOL_SOCKET, socket.SO_ERROR)\n    return socket.error(error_number, os.strerror(error_number))\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/local.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n#\n# Copyright 2012-2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport sys\nimport os\nimport logging\nimport signal\n\nif __name__ == '__main__':\n    import inspect\n    file_path = os.path.dirname(os.path.realpath(inspect.getfile(inspect.currentframe())))\n    sys.path.insert(0, os.path.join(file_path, '../'))\n\nfrom shadowsocks import shell, daemon, eventloop, tcprelay, udprelay, asyncdns\n\n\ndef main():\n    shell.check_python()\n\n    # fix py2exe\n    if hasattr(sys, \"frozen\") and sys.frozen in \\\n            (\"windows_exe\", \"console_exe\"):\n        p = os.path.dirname(os.path.abspath(sys.executable))\n        os.chdir(p)\n\n    config = shell.get_config(True)\n\n    if not config.get('dns_ipv6', False):\n        asyncdns.IPV6_CONNECTION_SUPPORT = False\n\n    daemon.daemon_exec(config)\n    logging.info(\"local start with protocol[%s] password [%s] method [%s] obfs [%s] obfs_param [%s]\" %\n            (config['protocol'], config['password'], config['method'], config['obfs'], config['obfs_param']))\n\n    try:\n        logging.info(\"starting local at %s:%d\" %\n                     (config['local_address'], config['local_port']))\n\n        dns_resolver = asyncdns.DNSResolver()\n        tcp_server = tcprelay.TCPRelay(config, dns_resolver, True)\n        udp_server = udprelay.UDPRelay(config, dns_resolver, True)\n        loop = eventloop.EventLoop()\n        dns_resolver.add_to_loop(loop)\n        tcp_server.add_to_loop(loop)\n        udp_server.add_to_loop(loop)\n\n        def handler(signum, _):\n            logging.warn('received SIGQUIT, doing graceful shutting down..')\n            tcp_server.close(next_tick=True)\n            udp_server.close(next_tick=True)\n        signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM), handler)\n\n        def int_handler(signum, _):\n            sys.exit(1)\n        signal.signal(signal.SIGINT, int_handler)\n\n        daemon.set_user(config.get('user', None))\n        loop.run()\n    except Exception as e:\n        shell.print_exception(e)\n        sys.exit(1)\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/logrun.sh",
    "content": "#!/bin/bash\ncd `dirname $0`\neval $(ps -ef | grep \"[0-9] python server\\\\.py a\" | awk '{print \"kill \"$2}')\nulimit -n 512000\nnohup python server.py a >> ssserver.log 2>&1 &\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/lru_cache.py",
    "content": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n#\n# Copyright 2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport collections\nimport logging\nimport time\n\nif __name__ == '__main__':\n    import os, sys, inspect\n    file_path = os.path.dirname(os.path.realpath(inspect.getfile(inspect.currentframe())))\n    sys.path.insert(0, os.path.join(file_path, '../'))\n\ntry:\n    from collections import OrderedDict\nexcept:\n    from shadowsocks.ordereddict import OrderedDict\n\n# this LRUCache is optimized for concurrency, not QPS\n# n: concurrency, keys stored in the cache\n# m: visits not timed out, proportional to QPS * timeout\n# get & set is O(1), not O(n). thus we can support very large n\n# sweep is O((n - m)) or O(1024) at most,\n# no metter how large the cache or timeout value is\n\nSWEEP_MAX_ITEMS = 1024\n\nclass LRUCache(collections.abc.MutableMapping):\n    \"\"\"This class is not thread safe\"\"\"\n\n    def __init__(self, timeout=60, close_callback=None, *args, **kwargs):\n        self.timeout = timeout\n        self.close_callback = close_callback\n        self._store = {}\n        self._keys_to_last_time = OrderedDict()\n        self.update(dict(*args, **kwargs))  # use the free update to set keys\n\n    def __getitem__(self, key):\n        # O(1)\n        t = time.time()\n        last_t = self._keys_to_last_time[key]\n        del self._keys_to_last_time[key]\n        self._keys_to_last_time[key] = t\n        return self._store[key]\n\n    def __setitem__(self, key, value):\n        # O(1)\n        t = time.time()\n        if key in self._keys_to_last_time:\n            del self._keys_to_last_time[key]\n        self._keys_to_last_time[key] = t\n        self._store[key] = value\n\n    def __delitem__(self, key):\n        # O(1)\n        last_t = self._keys_to_last_time[key]\n        del self._store[key]\n        del self._keys_to_last_time[key]\n\n    def __contains__(self, key):\n        return key in self._store\n\n    def __iter__(self):\n        return iter(self._store)\n\n    def __len__(self):\n        return len(self._store)\n\n    def first(self):\n        if len(self._keys_to_last_time) > 0:\n            for key in self._keys_to_last_time:\n                return key\n\n    def sweep(self, sweep_item_cnt = SWEEP_MAX_ITEMS):\n        # O(n - m)\n        now = time.time()\n        c = 0\n        while c < sweep_item_cnt:\n            if len(self._keys_to_last_time) == 0:\n                break\n            for key in self._keys_to_last_time:\n                break\n            last_t = self._keys_to_last_time[key]\n            if now - last_t <= self.timeout:\n                break\n            value = self._store[key]\n            del self._store[key]\n            del self._keys_to_last_time[key]\n            if self.close_callback is not None:\n                self.close_callback(value)\n            c += 1\n        if c:\n            logging.debug('%d keys swept' % c)\n        return c < SWEEP_MAX_ITEMS\n\n    def clear(self, keep):\n        now = time.time()\n        c = 0\n        while len(self._keys_to_last_time) > keep:\n            if len(self._keys_to_last_time) == 0:\n                break\n            for key in self._keys_to_last_time:\n                break\n            last_t = self._keys_to_last_time[key]\n            value = self._store[key]\n            if self.close_callback is not None:\n                self.close_callback(value)\n            del self._store[key]\n            del self._keys_to_last_time[key]\n            c += 1\n        if c:\n            logging.debug('%d keys swept' % c)\n        return c < SWEEP_MAX_ITEMS\n\ndef test():\n    c = LRUCache(timeout=0.3)\n\n    c['a'] = 1\n    assert c['a'] == 1\n    c['a'] = 1\n\n    time.sleep(0.5)\n    c.sweep()\n    assert 'a' not in c\n\n    c['a'] = 2\n    c['b'] = 3\n    time.sleep(0.2)\n    c.sweep()\n    assert c['a'] == 2\n    assert c['b'] == 3\n\n    time.sleep(0.2)\n    c.sweep()\n    c['b']\n    time.sleep(0.2)\n    c.sweep()\n    assert 'a' not in c\n    assert c['b'] == 3\n\n    time.sleep(0.5)\n    c.sweep()\n    assert 'a' not in c\n    assert 'b' not in c\n\n    global close_cb_called\n    close_cb_called = False\n\n    def close_cb(t):\n        global close_cb_called\n        assert not close_cb_called\n        close_cb_called = True\n\n    c = LRUCache(timeout=0.1, close_callback=close_cb)\n    c['s'] = 1\n    c['s']\n    time.sleep(0.1)\n    c['s']\n    time.sleep(0.3)\n    c.sweep()\n\nif __name__ == '__main__':\n    test()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/manager.py",
    "content": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n#\n# Copyright 2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport errno\nimport traceback\nimport socket\nimport logging\nimport json\nimport collections\n\nfrom shadowsocks import common, eventloop, tcprelay, udprelay, asyncdns, shell\n\n\nBUF_SIZE = 1506\nSTAT_SEND_LIMIT = 50\n\n\nclass Manager(object):\n\n    def __init__(self, config):\n        self._config = config\n        self._relays = {}  # (tcprelay, udprelay)\n        self._loop = eventloop.EventLoop()\n        self._dns_resolver = asyncdns.DNSResolver()\n        self._dns_resolver.add_to_loop(self._loop)\n\n        self._statistics = collections.defaultdict(int)\n        self._control_client_addr = None\n        try:\n            manager_address = common.to_str(config['manager_address'])\n            if ':' in manager_address:\n                addr = manager_address.rsplit(':', 1)\n                addr = addr[0], int(addr[1])\n                addrs = socket.getaddrinfo(addr[0], addr[1])\n                if addrs:\n                    family = addrs[0][0]\n                else:\n                    logging.error('invalid address: %s', manager_address)\n                    exit(1)\n            else:\n                addr = manager_address\n                family = socket.AF_UNIX\n            self._control_socket = socket.socket(family,\n                                                 socket.SOCK_DGRAM)\n            self._control_socket.bind(addr)\n            self._control_socket.setblocking(False)\n        except (OSError, IOError) as e:\n            logging.error(e)\n            logging.error('can not bind to manager address')\n            exit(1)\n        self._loop.add(self._control_socket,\n                       eventloop.POLL_IN, self)\n        self._loop.add_periodic(self.handle_periodic)\n\n        port_password = config['port_password']\n        del config['port_password']\n        for port, password in port_password.items():\n            a_config = config.copy()\n            a_config['server_port'] = int(port)\n            a_config['password'] = password\n            self.add_port(a_config)\n\n    def add_port(self, config):\n        port = int(config['server_port'])\n        servers = self._relays.get(port, None)\n        if servers:\n            logging.error(\"server already exists at %s:%d\" % (config['server'],\n                                                              port))\n            return\n        logging.info(\"adding server at %s:%d\" % (config['server'], port))\n        t = tcprelay.TCPRelay(config, self._dns_resolver, False,\n                              stat_callback=self.stat_callback)\n        u = udprelay.UDPRelay(config, self._dns_resolver, False,\n                              stat_callback=self.stat_callback)\n        t.add_to_loop(self._loop)\n        u.add_to_loop(self._loop)\n        self._relays[port] = (t, u)\n\n    def remove_port(self, config):\n        port = int(config['server_port'])\n        servers = self._relays.get(port, None)\n        if servers:\n            logging.info(\"removing server at %s:%d\" % (config['server'], port))\n            t, u = servers\n            t.close(next_tick=False)\n            u.close(next_tick=False)\n            del self._relays[port]\n        else:\n            logging.error(\"server not exist at %s:%d\" % (config['server'],\n                                                         port))\n\n    def handle_event(self, sock, fd, event):\n        if sock == self._control_socket and event == eventloop.POLL_IN:\n            data, self._control_client_addr = sock.recvfrom(BUF_SIZE)\n            parsed = self._parse_command(data)\n            if parsed:\n                command, config = parsed\n                a_config = self._config.copy()\n                if config:\n                    # let the command override the configuration file\n                    a_config.update(config)\n                if 'server_port' not in a_config:\n                    logging.error('can not find server_port in config')\n                else:\n                    if command == 'add':\n                        self.add_port(a_config)\n                        self._send_control_data(b'ok')\n                    elif command == 'remove':\n                        self.remove_port(a_config)\n                        self._send_control_data(b'ok')\n                    elif command == 'ping':\n                        self._send_control_data(b'pong')\n                    else:\n                        logging.error('unknown command %s', command)\n\n    def _parse_command(self, data):\n        # commands:\n        # add: {\"server_port\": 8000, \"password\": \"foobar\"}\n        # remove: {\"server_port\": 8000\"}\n        data = common.to_str(data)\n        parts = data.split(':', 1)\n        if len(parts) < 2:\n            return data, None\n        command, config_json = parts\n        try:\n            config = shell.parse_json_in_str(config_json)\n            return command, config\n        except Exception as e:\n            logging.error(e)\n            return None\n\n    def stat_callback(self, port, data_len):\n        self._statistics[port] += data_len\n\n    def handle_periodic(self):\n        r = {}\n        i = 0\n\n        def send_data(data_dict):\n            if data_dict:\n                # use compact JSON format (without space)\n                data = common.to_bytes(json.dumps(data_dict,\n                                                  separators=(',', ':')))\n                self._send_control_data(b'stat: ' + data)\n\n        for k, v in self._statistics.items():\n            r[k] = v\n            i += 1\n            # split the data into segments that fit in UDP packets\n            if i >= STAT_SEND_LIMIT:\n                send_data(r)\n                r.clear()\n                i = 0\n        if len(r) > 0 :\n            send_data(r)\n        self._statistics.clear()\n\n    def _send_control_data(self, data):\n        if self._control_client_addr:\n            try:\n                self._control_socket.sendto(data, self._control_client_addr)\n            except (socket.error, OSError, IOError) as e:\n                error_no = eventloop.errno_from_exception(e)\n                if error_no in (errno.EAGAIN, errno.EINPROGRESS,\n                                errno.EWOULDBLOCK):\n                    return\n                else:\n                    shell.print_exception(e)\n                    if self._config['verbose']:\n                        traceback.print_exc()\n\n    def run(self):\n        self._loop.run()\n\n\ndef run(config):\n    Manager(config).run()\n\n\ndef test():\n    import time\n    import threading\n    import struct\n    from shadowsocks import encrypt\n\n    logging.basicConfig(level=5,\n                        format='%(asctime)s %(levelname)-8s %(message)s',\n                        datefmt='%Y-%m-%d %H:%M:%S')\n    enc = []\n    eventloop.TIMEOUT_PRECISION = 1\n\n    def run_server():\n        config = shell.get_config(True)\n        config = config.copy()\n        a_config = {\n            'server': '127.0.0.1',\n            'local_port': 1081,\n            'port_password': {\n                '8381': 'foobar1',\n                '8382': 'foobar2'\n            },\n            'method': 'aes-256-cfb',\n            'manager_address': '127.0.0.1:6001',\n            'timeout': 60,\n            'fast_open': False,\n            'verbose': 2\n        }\n        config.update(a_config)\n        manager = Manager(config)\n        enc.append(manager)\n        manager.run()\n\n    t = threading.Thread(target=run_server)\n    t.start()\n    time.sleep(1)\n    manager = enc[0]\n    cli = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)\n    cli.connect(('127.0.0.1', 6001))\n\n    # test add and remove\n    time.sleep(1)\n    cli.send(b'add: {\"server_port\":7001, \"password\":\"asdfadsfasdf\"}')\n    time.sleep(1)\n    assert 7001 in manager._relays\n    data, addr = cli.recvfrom(1506)\n    assert b'ok' in data\n\n    cli.send(b'remove: {\"server_port\":8381}')\n    time.sleep(1)\n    assert 8381 not in manager._relays\n    data, addr = cli.recvfrom(1506)\n    assert b'ok' in data\n    logging.info('add and remove test passed')\n\n    # test statistics for TCP\n    header = common.pack_addr(b'google.com') + struct.pack('>H', 80)\n    data = encrypt.encrypt_all(b'asdfadsfasdf', 'aes-256-cfb', 1,\n                               header + b'GET /\\r\\n\\r\\n')\n    tcp_cli = socket.socket()\n    tcp_cli.connect(('127.0.0.1', 7001))\n    tcp_cli.send(data)\n    tcp_cli.recv(4096)\n    tcp_cli.close()\n\n    data, addr = cli.recvfrom(1506)\n    data = common.to_str(data)\n    assert data.startswith('stat: ')\n    data = data.split('stat:')[1]\n    stats = shell.parse_json_in_str(data)\n    assert '7001' in stats\n    logging.info('TCP statistics test passed')\n\n    # test statistics for UDP\n    header = common.pack_addr(b'127.0.0.1') + struct.pack('>H', 80)\n    data = encrypt.encrypt_all(b'foobar2', 'aes-256-cfb', 1,\n                               header + b'test')\n    udp_cli = socket.socket(type=socket.SOCK_DGRAM)\n    udp_cli.sendto(data, ('127.0.0.1', 8382))\n    tcp_cli.close()\n\n    data, addr = cli.recvfrom(1506)\n    data = common.to_str(data)\n    assert data.startswith('stat: ')\n    data = data.split('stat:')[1]\n    stats = json.loads(data)\n    assert '8382' in stats\n    logging.info('UDP statistics test passed')\n\n    manager._loop.stop()\n    t.join()\n\n\nif __name__ == '__main__':\n    test()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/obfs.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2015-2015 breakwa11\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport os\nimport sys\nimport hashlib\nimport logging\n\nfrom shadowsocks import common\nfrom shadowsocks.obfsplugin import plain, http_simple, obfs_tls, verify, auth, auth_chain\n\n\nmethod_supported = {}\nmethod_supported.update(plain.obfs_map)\nmethod_supported.update(http_simple.obfs_map)\nmethod_supported.update(obfs_tls.obfs_map)\nmethod_supported.update(verify.obfs_map)\nmethod_supported.update(auth.obfs_map)\nmethod_supported.update(auth_chain.obfs_map)\n\ndef mu_protocol():\n    return [\"auth_aes128_md5\", \"auth_aes128_sha1\", \"auth_chain_a\"]\n\nclass server_info(object):\n    def __init__(self, data):\n        self.data = data\n\nclass obfs(object):\n    def __init__(self, method):\n        method = common.to_str(method)\n        self.method = method\n        self._method_info = self.get_method_info(method)\n        if self._method_info:\n            self.obfs = self.get_obfs(method)\n        else:\n            raise Exception('obfs plugin [%s] not supported' % method)\n\n    def init_data(self):\n        return self.obfs.init_data()\n\n    def set_server_info(self, server_info):\n        return self.obfs.set_server_info(server_info)\n\n    def get_server_info(self):\n        return self.obfs.get_server_info()\n\n    def get_method_info(self, method):\n        method = method.lower()\n        m = method_supported.get(method)\n        return m\n\n    def get_obfs(self, method):\n        m = self._method_info\n        return m[0](method)\n\n    def get_overhead(self, direction):\n        return self.obfs.get_overhead(direction)\n\n    def client_pre_encrypt(self, buf):\n        return self.obfs.client_pre_encrypt(buf)\n\n    def client_encode(self, buf):\n        return self.obfs.client_encode(buf)\n\n    def client_decode(self, buf):\n        return self.obfs.client_decode(buf)\n\n    def client_post_decrypt(self, buf):\n        return self.obfs.client_post_decrypt(buf)\n\n    def server_pre_encrypt(self, buf):\n        return self.obfs.server_pre_encrypt(buf)\n\n    def server_encode(self, buf):\n        return self.obfs.server_encode(buf)\n\n    def server_decode(self, buf):\n        return self.obfs.server_decode(buf)\n\n    def server_post_decrypt(self, buf):\n        return self.obfs.server_post_decrypt(buf)\n\n    def client_udp_pre_encrypt(self, buf):\n        return self.obfs.client_udp_pre_encrypt(buf)\n\n    def client_udp_post_decrypt(self, buf):\n        return self.obfs.client_udp_post_decrypt(buf)\n\n    def server_udp_pre_encrypt(self, buf, uid):\n        return self.obfs.server_udp_pre_encrypt(buf, uid)\n\n    def server_udp_post_decrypt(self, buf):\n        return self.obfs.server_udp_post_decrypt(buf)\n\n    def dispose(self):\n        self.obfs.dispose()\n        del self.obfs\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/obfsplugin/__init__.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/obfsplugin/auth.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2015-2015 breakwa11\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport os\nimport sys\nimport hashlib\nimport logging\nimport binascii\nimport base64\nimport time\nimport datetime\nimport random\nimport math\nimport struct\nimport zlib\nimport hmac\nimport hashlib\n\nimport shadowsocks\nfrom shadowsocks import common, lru_cache, encrypt\nfrom shadowsocks.obfsplugin import plain\nfrom shadowsocks.common import to_bytes, to_str, ord, chr\n\ndef create_auth_sha1_v4(method):\n    return auth_sha1_v4(method)\n\ndef create_auth_aes128_md5(method):\n    return auth_aes128_sha1(method, hashlib.md5)\n\ndef create_auth_aes128_sha1(method):\n    return auth_aes128_sha1(method, hashlib.sha1)\n\nobfs_map = {\n        'auth_sha1_v4': (create_auth_sha1_v4,),\n        'auth_sha1_v4_compatible': (create_auth_sha1_v4,),\n        'auth_aes128_md5': (create_auth_aes128_md5,),\n        'auth_aes128_sha1': (create_auth_aes128_sha1,),\n}\n\ndef match_begin(str1, str2):\n    if len(str1) >= len(str2):\n        if str1[:len(str2)] == str2:\n            return True\n    return False\n\nclass auth_base(plain.plain):\n    def __init__(self, method):\n        super(auth_base, self).__init__(method)\n        self.method = method\n        self.no_compatible_method = ''\n        self.overhead = 7\n\n    def init_data(self):\n        return ''\n\n    def get_overhead(self, direction): # direction: true for c->s false for s->c\n        return self.overhead\n\n    def set_server_info(self, server_info):\n        self.server_info = server_info\n\n    def client_encode(self, buf):\n        return buf\n\n    def client_decode(self, buf):\n        return (buf, False)\n\n    def server_encode(self, buf):\n        return buf\n\n    def server_decode(self, buf):\n        return (buf, True, False)\n\n    def not_match_return(self, buf):\n        self.raw_trans = True\n        self.overhead = 0\n        if self.method == self.no_compatible_method:\n            return (b'E'*2048, False)\n        return (buf, False)\n\nclass client_queue(object):\n    def __init__(self, begin_id):\n        self.front = begin_id - 64\n        self.back = begin_id + 1\n        self.alloc = {}\n        self.enable = True\n        self.last_update = time.time()\n\n    def update(self):\n        self.last_update = time.time()\n\n    def is_active(self):\n        return time.time() - self.last_update < 60 * 3\n\n    def re_enable(self, connection_id):\n        self.enable = True\n        self.front = connection_id - 64\n        self.back = connection_id + 1\n        self.alloc = {}\n\n    def insert(self, connection_id):\n        if not self.enable:\n            logging.warn('obfs auth: not enable')\n            return False\n        if not self.is_active():\n            self.re_enable(connection_id)\n        self.update()\n        if connection_id < self.front:\n            logging.warn('obfs auth: deprecated id, someone replay attack')\n            return False\n        if connection_id > self.front + 0x4000:\n            logging.warn('obfs auth: wrong id')\n            return False\n        if connection_id in self.alloc:\n            logging.warn('obfs auth: duplicate id, someone replay attack')\n            return False\n        if self.back <= connection_id:\n            self.back = connection_id + 1\n        self.alloc[connection_id] = 1\n        while (self.front in self.alloc) or self.front + 0x1000 < self.back:\n            if self.front in self.alloc:\n                del self.alloc[self.front]\n            self.front += 1\n        return True\n\nclass obfs_auth_v2_data(object):\n    def __init__(self):\n        self.client_id = lru_cache.LRUCache()\n        self.local_client_id = b''\n        self.connection_id = 0\n        self.set_max_client(64) # max active client count\n\n    def update(self, client_id, connection_id):\n        if client_id in self.client_id:\n            self.client_id[client_id].update()\n\n    def set_max_client(self, max_client):\n        self.max_client = max_client\n        self.max_buffer = max(self.max_client * 2, 1024)\n\n    def insert(self, client_id, connection_id):\n        if self.client_id.get(client_id, None) is None or not self.client_id[client_id].enable:\n            if self.client_id.first() is None or len(self.client_id) < self.max_client:\n                if client_id not in self.client_id:\n                    #TODO: check\n                    self.client_id[client_id] = client_queue(connection_id)\n                else:\n                    self.client_id[client_id].re_enable(connection_id)\n                return self.client_id[client_id].insert(connection_id)\n\n            if not self.client_id[self.client_id.first()].is_active():\n                del self.client_id[self.client_id.first()]\n                if client_id not in self.client_id:\n                    #TODO: check\n                    self.client_id[client_id] = client_queue(connection_id)\n                else:\n                    self.client_id[client_id].re_enable(connection_id)\n                return self.client_id[client_id].insert(connection_id)\n\n            logging.warn('auth_sha1_v2: no inactive client')\n            return False\n        else:\n            return self.client_id[client_id].insert(connection_id)\n\nclass auth_sha1_v4(auth_base):\n    def __init__(self, method):\n        super(auth_sha1_v4, self).__init__(method)\n        self.recv_buf = b''\n        self.unit_len = 8100\n        self.decrypt_packet_num = 0\n        self.raw_trans = False\n        self.has_sent_header = False\n        self.has_recv_header = False\n        self.client_id = 0\n        self.connection_id = 0\n        self.max_time_dif = 60 * 60 * 24 # time dif (second) setting\n        self.salt = b\"auth_sha1_v4\"\n        self.no_compatible_method = 'auth_sha1_v4'\n\n    def init_data(self):\n        return obfs_auth_v2_data()\n\n    def set_server_info(self, server_info):\n        self.server_info = server_info\n        try:\n            max_client = int(server_info.protocol_param)\n        except:\n            max_client = 64\n        self.server_info.data.set_max_client(max_client)\n\n    def rnd_data(self, buf_size):\n        if buf_size > 1200:\n            return b'\\x01'\n\n        if buf_size > 400:\n            rnd_data = os.urandom(common.ord(os.urandom(1)[0]) % 256)\n        else:\n            rnd_data = os.urandom(struct.unpack('>H', os.urandom(2))[0] % 512)\n\n        if len(rnd_data) < 128:\n            return common.chr(len(rnd_data) + 1) + rnd_data\n        else:\n            return common.chr(255) + struct.pack('>H', len(rnd_data) + 3) + rnd_data\n\n    def pack_data(self, buf):\n        data = self.rnd_data(len(buf)) + buf\n        data_len = len(data) + 8\n        crc = binascii.crc32(struct.pack('>H', data_len)) & 0xFFFF\n        data = struct.pack('<H', crc) + data\n        data = struct.pack('>H', data_len) + data\n        adler32 = zlib.adler32(data) & 0xFFFFFFFF\n        data += struct.pack('<I', adler32)\n        return data\n\n    def pack_auth_data(self, buf):\n        if len(buf) == 0:\n            return b''\n        data = self.rnd_data(len(buf)) + buf\n        data_len = len(data) + 16\n        crc = binascii.crc32(struct.pack('>H', data_len) + self.salt + self.server_info.key) & 0xFFFFFFFF\n        data = struct.pack('<I', crc) + data\n        data = struct.pack('>H', data_len) + data\n        data += hmac.new(self.server_info.iv + self.server_info.key, data, hashlib.sha1).digest()[:10]\n        return data\n\n    def auth_data(self):\n        utc_time = int(time.time()) & 0xFFFFFFFF\n        if self.server_info.data.connection_id > 0xFF000000:\n            self.server_info.data.local_client_id = b''\n        if not self.server_info.data.local_client_id:\n            self.server_info.data.local_client_id = os.urandom(4)\n            logging.debug(\"local_client_id %s\" % (binascii.hexlify(self.server_info.data.local_client_id),))\n            self.server_info.data.connection_id = struct.unpack('<I', os.urandom(4))[0] & 0xFFFFFF\n        self.server_info.data.connection_id += 1\n        return b''.join([struct.pack('<I', utc_time),\n                self.server_info.data.local_client_id,\n                struct.pack('<I', self.server_info.data.connection_id)])\n\n    def client_pre_encrypt(self, buf):\n        ret = b''\n        if not self.has_sent_header:\n            head_size = self.get_head_size(buf, 30)\n            datalen = min(len(buf), random.randint(0, 31) + head_size)\n            ret += self.pack_auth_data(self.auth_data() + buf[:datalen])\n            buf = buf[datalen:]\n            self.has_sent_header = True\n        while len(buf) > self.unit_len:\n            ret += self.pack_data(buf[:self.unit_len])\n            buf = buf[self.unit_len:]\n        ret += self.pack_data(buf)\n        return ret\n\n    def client_post_decrypt(self, buf):\n        if self.raw_trans:\n            return buf\n        self.recv_buf += buf\n        out_buf = b''\n        while len(self.recv_buf) > 4:\n            crc = struct.pack('<H', binascii.crc32(self.recv_buf[:2]) & 0xFFFF)\n            if crc != self.recv_buf[2:4]:\n                raise Exception('client_post_decrypt data uncorrect crc')\n            length = struct.unpack('>H', self.recv_buf[:2])[0]\n            if length >= 8192 or length < 7:\n                self.raw_trans = True\n                self.recv_buf = b''\n                raise Exception('client_post_decrypt data error')\n            if length > len(self.recv_buf):\n                break\n\n            if struct.pack('<I', zlib.adler32(self.recv_buf[:length - 4]) & 0xFFFFFFFF) != self.recv_buf[length - 4:length]:\n                self.raw_trans = True\n                self.recv_buf = b''\n                raise Exception('client_post_decrypt data uncorrect checksum')\n\n            pos = common.ord(self.recv_buf[4])\n            if pos < 255:\n                pos += 4\n            else:\n                pos = struct.unpack('>H', self.recv_buf[5:7])[0] + 4\n            out_buf += self.recv_buf[pos:length - 4]\n            self.recv_buf = self.recv_buf[length:]\n\n        if out_buf:\n            self.decrypt_packet_num += 1\n        return out_buf\n\n    def server_pre_encrypt(self, buf):\n        if self.raw_trans:\n            return buf\n        ret = b''\n        while len(buf) > self.unit_len:\n            ret += self.pack_data(buf[:self.unit_len])\n            buf = buf[self.unit_len:]\n        ret += self.pack_data(buf)\n        return ret\n\n    def server_post_decrypt(self, buf):\n        if self.raw_trans:\n            return (buf, False)\n        self.recv_buf += buf\n        out_buf = b''\n        sendback = False\n\n        if not self.has_recv_header:\n            if len(self.recv_buf) <= 6:\n                return (b'', False)\n            crc = struct.pack('<I', binascii.crc32(self.recv_buf[:2] + self.salt + self.server_info.key) & 0xFFFFFFFF)\n            if crc != self.recv_buf[2:6]:\n                return self.not_match_return(self.recv_buf)\n            length = struct.unpack('>H', self.recv_buf[:2])[0]\n            if length > len(self.recv_buf):\n                return (b'', False)\n            sha1data = hmac.new(self.server_info.recv_iv + self.server_info.key, self.recv_buf[:length - 10], hashlib.sha1).digest()[:10]\n            if sha1data != self.recv_buf[length - 10:length]:\n                logging.error('auth_sha1_v4 data uncorrect auth HMAC-SHA1')\n                return self.not_match_return(self.recv_buf)\n            pos = common.ord(self.recv_buf[6])\n            if pos < 255:\n                pos += 6\n            else:\n                pos = struct.unpack('>H', self.recv_buf[7:9])[0] + 6\n            out_buf = self.recv_buf[pos:length - 10]\n            if len(out_buf) < 12:\n                logging.info('auth_sha1_v4: too short, data %s' % (binascii.hexlify(self.recv_buf),))\n                return self.not_match_return(self.recv_buf)\n            utc_time = struct.unpack('<I', out_buf[:4])[0]\n            client_id = struct.unpack('<I', out_buf[4:8])[0]\n            connection_id = struct.unpack('<I', out_buf[8:12])[0]\n            time_dif = common.int32(utc_time - (int(time.time()) & 0xffffffff))\n            if time_dif < -self.max_time_dif or time_dif > self.max_time_dif:\n                logging.info('auth_sha1_v4: wrong timestamp, time_dif %d, data %s' % (time_dif, binascii.hexlify(out_buf),))\n                return self.not_match_return(self.recv_buf)\n            elif self.server_info.data.insert(client_id, connection_id):\n                self.has_recv_header = True\n                out_buf = out_buf[12:]\n                self.client_id = client_id\n                self.connection_id = connection_id\n            else:\n                logging.info('auth_sha1_v4: auth fail, data %s' % (binascii.hexlify(out_buf),))\n                return self.not_match_return(self.recv_buf)\n            self.recv_buf = self.recv_buf[length:]\n            self.has_recv_header = True\n            sendback = True\n\n        while len(self.recv_buf) > 4:\n            crc = struct.pack('<H', binascii.crc32(self.recv_buf[:2]) & 0xFFFF)\n            if crc != self.recv_buf[2:4]:\n                self.raw_trans = True\n                logging.info('auth_sha1_v4: wrong crc')\n                if self.decrypt_packet_num == 0:\n                    logging.info('auth_sha1_v4: wrong crc')\n                    return (b'E'*2048, False)\n                else:\n                    raise Exception('server_post_decrype data error')\n            length = struct.unpack('>H', self.recv_buf[:2])[0]\n            if length >= 8192 or length < 7:\n                self.raw_trans = True\n                self.recv_buf = b''\n                if self.decrypt_packet_num == 0:\n                    logging.info('auth_sha1_v4: over size')\n                    return (b'E'*2048, False)\n                else:\n                    raise Exception('server_post_decrype data error')\n            if length > len(self.recv_buf):\n                break\n\n            if struct.pack('<I', zlib.adler32(self.recv_buf[:length - 4]) & 0xFFFFFFFF) != self.recv_buf[length - 4:length]:\n                logging.info('auth_sha1_v4: checksum error, data %s' % (binascii.hexlify(self.recv_buf[:length]),))\n                self.raw_trans = True\n                self.recv_buf = b''\n                if self.decrypt_packet_num == 0:\n                    return (b'E'*2048, False)\n                else:\n                    raise Exception('server_post_decrype data uncorrect checksum')\n\n            pos = common.ord(self.recv_buf[4])\n            if pos < 255:\n                pos += 4\n            else:\n                pos = struct.unpack('>H', self.recv_buf[5:7])[0] + 4\n            out_buf += self.recv_buf[pos:length - 4]\n            self.recv_buf = self.recv_buf[length:]\n            if pos == length - 4:\n                sendback = True\n\n        if out_buf:\n            self.server_info.data.update(self.client_id, self.connection_id)\n            self.decrypt_packet_num += 1\n        return (out_buf, sendback)\n\nclass obfs_auth_mu_data(object):\n    def __init__(self):\n        self.user_id = {}\n        self.local_client_id = b''\n        self.connection_id = 0\n        self.set_max_client(64) # max active client count\n\n    def update(self, user_id, client_id, connection_id):\n        if user_id not in self.user_id:\n            self.user_id[user_id] = lru_cache.LRUCache()\n        local_client_id = self.user_id[user_id]\n\n        if client_id in local_client_id:\n            local_client_id[client_id].update()\n\n    def set_max_client(self, max_client):\n        self.max_client = max_client\n        self.max_buffer = max(self.max_client * 2, 1024)\n\n    def insert(self, user_id, client_id, connection_id):\n        if user_id not in self.user_id:\n            self.user_id[user_id] = lru_cache.LRUCache()\n        local_client_id = self.user_id[user_id]\n\n        if local_client_id.get(client_id, None) is None or not local_client_id[client_id].enable:\n            if local_client_id.first() is None or len(local_client_id) < self.max_client:\n                if client_id not in local_client_id:\n                    #TODO: check\n                    local_client_id[client_id] = client_queue(connection_id)\n                else:\n                    local_client_id[client_id].re_enable(connection_id)\n                return local_client_id[client_id].insert(connection_id)\n\n            if not local_client_id[local_client_id.first()].is_active():\n                del local_client_id[local_client_id.first()]\n                if client_id not in local_client_id:\n                    #TODO: check\n                    local_client_id[client_id] = client_queue(connection_id)\n                else:\n                    local_client_id[client_id].re_enable(connection_id)\n                return local_client_id[client_id].insert(connection_id)\n\n            logging.warn('auth_aes128: no inactive client')\n            return False\n        else:\n            return local_client_id[client_id].insert(connection_id)\n\nclass auth_aes128_sha1(auth_base):\n    def __init__(self, method, hashfunc):\n        super(auth_aes128_sha1, self).__init__(method)\n        self.hashfunc = hashfunc\n        self.recv_buf = b''\n        self.unit_len = 8100\n        self.raw_trans = False\n        self.has_sent_header = False\n        self.has_recv_header = False\n        self.client_id = 0\n        self.connection_id = 0\n        self.max_time_dif = 60 * 60 * 24 # time dif (second) setting\n        self.salt = hashfunc == hashlib.md5 and b\"auth_aes128_md5\" or b\"auth_aes128_sha1\"\n        self.no_compatible_method = hashfunc == hashlib.md5 and \"auth_aes128_md5\" or 'auth_aes128_sha1'\n        self.extra_wait_size = struct.unpack('>H', os.urandom(2))[0] % 1024\n        self.pack_id = 1\n        self.recv_id = 1\n        self.user_id = None\n        self.user_key = None\n        self.last_rnd_len = 0\n        self.overhead = 9\n\n    def init_data(self):\n        return obfs_auth_mu_data()\n\n    def get_overhead(self, direction): # direction: true for c->s false for s->c\n        return self.overhead\n\n    def set_server_info(self, server_info):\n        self.server_info = server_info\n        try:\n            max_client = int(server_info.protocol_param.split('#')[0])\n        except:\n            max_client = 64\n        self.server_info.data.set_max_client(max_client)\n\n    def trapezoid_random_float(self, d):\n        if d == 0:\n            return random.random()\n        s = random.random()\n        a = 1 - d\n        return (math.sqrt(a * a + 4 * d * s) - a) / (2 * d)\n\n    def trapezoid_random_int(self, max_val, d):\n        v = self.trapezoid_random_float(d)\n        return int(v * max_val)\n\n    def rnd_data_len(self, buf_size, full_buf_size):\n        if full_buf_size >= self.server_info.buffer_size:\n            return 0\n        tcp_mss = self.server_info.tcp_mss\n        rev_len = tcp_mss - buf_size - 9\n        if rev_len == 0:\n            return 0\n        if rev_len < 0:\n            if rev_len > -tcp_mss:\n                return self.trapezoid_random_int(rev_len + tcp_mss, -0.3)\n            return common.ord(os.urandom(1)[0]) % 32\n        if buf_size > 900:\n            return struct.unpack('>H', os.urandom(2))[0] % rev_len\n        return self.trapezoid_random_int(rev_len, -0.3)\n\n    def rnd_data(self, buf_size, full_buf_size):\n        data_len = self.rnd_data_len(buf_size, full_buf_size)\n\n        if data_len < 128:\n            return common.chr(data_len + 1) + os.urandom(data_len)\n\n        return common.chr(255) + struct.pack('<H', data_len + 1) + os.urandom(data_len - 2)\n\n    def pack_data(self, buf, full_buf_size):\n        data = self.rnd_data(len(buf), full_buf_size) + buf\n        data_len = len(data) + 8\n        mac_key = self.user_key + struct.pack('<I', self.pack_id)\n        mac = hmac.new(mac_key, struct.pack('<H', data_len), self.hashfunc).digest()[:2]\n        data = struct.pack('<H', data_len) + mac + data\n        data += hmac.new(mac_key, data, self.hashfunc).digest()[:4]\n        self.pack_id = (self.pack_id + 1) & 0xFFFFFFFF\n        return data\n\n    def pack_auth_data(self, auth_data, buf):\n        if len(buf) == 0:\n            return b''\n        if len(buf) > 400:\n            rnd_len = struct.unpack('<H', os.urandom(2))[0] % 512\n        else:\n            rnd_len = struct.unpack('<H', os.urandom(2))[0] % 1024\n        data = auth_data\n        data_len = 7 + 4 + 16 + 4 + len(buf) + rnd_len + 4\n        data = data + struct.pack('<H', data_len) + struct.pack('<H', rnd_len)\n        mac_key = self.server_info.iv + self.server_info.key\n        uid = os.urandom(4)\n        if b':' in to_bytes(self.server_info.protocol_param):\n            try:\n                items = to_bytes(self.server_info.protocol_param).split(b':')\n                self.user_key = self.hashfunc(items[1]).digest()\n                uid = struct.pack('<I', int(items[0]))\n            except:\n                pass\n        if self.user_key is None:\n            self.user_key = self.server_info.key\n        encryptor = encrypt.Encryptor(to_bytes(base64.b64encode(self.user_key)) + self.salt, 'aes-128-cbc', b'\\x00' * 16)\n        data = uid + encryptor.encrypt(data)[16:]\n        data += hmac.new(mac_key, data, self.hashfunc).digest()[:4]\n        check_head = os.urandom(1)\n        check_head += hmac.new(mac_key, check_head, self.hashfunc).digest()[:6]\n        data = check_head + data + os.urandom(rnd_len) + buf\n        data += hmac.new(self.user_key, data, self.hashfunc).digest()[:4]\n        return data\n\n    def auth_data(self):\n        utc_time = int(time.time()) & 0xFFFFFFFF\n        if self.server_info.data.connection_id > 0xFF000000:\n            self.server_info.data.local_client_id = b''\n        if not self.server_info.data.local_client_id:\n            self.server_info.data.local_client_id = os.urandom(4)\n            logging.debug(\"local_client_id %s\" % (binascii.hexlify(self.server_info.data.local_client_id),))\n            self.server_info.data.connection_id = struct.unpack('<I', os.urandom(4))[0] & 0xFFFFFF\n        self.server_info.data.connection_id += 1\n        return b''.join([struct.pack('<I', utc_time),\n                self.server_info.data.local_client_id,\n                struct.pack('<I', self.server_info.data.connection_id)])\n\n    def client_pre_encrypt(self, buf):\n        ret = b''\n        ogn_data_len = len(buf)\n        if not self.has_sent_header:\n            head_size = self.get_head_size(buf, 30)\n            datalen = min(len(buf), random.randint(0, 31) + head_size)\n            ret += self.pack_auth_data(self.auth_data(), buf[:datalen])\n            buf = buf[datalen:]\n            self.has_sent_header = True\n        while len(buf) > self.unit_len:\n            ret += self.pack_data(buf[:self.unit_len], ogn_data_len)\n            buf = buf[self.unit_len:]\n        ret += self.pack_data(buf, ogn_data_len)\n        self.last_rnd_len = ogn_data_len\n        return ret\n\n    def client_post_decrypt(self, buf):\n        if self.raw_trans:\n            return buf\n        self.recv_buf += buf\n        out_buf = b''\n        while len(self.recv_buf) > 4:\n            mac_key = self.user_key + struct.pack('<I', self.recv_id)\n            mac = hmac.new(mac_key, self.recv_buf[:2], self.hashfunc).digest()[:2]\n            if mac != self.recv_buf[2:4]:\n                raise Exception('client_post_decrypt data uncorrect mac')\n            length = struct.unpack('<H', self.recv_buf[:2])[0]\n            if length >= 8192 or length < 7:\n                self.raw_trans = True\n                self.recv_buf = b''\n                raise Exception('client_post_decrypt data error')\n            if length > len(self.recv_buf):\n                break\n\n            if hmac.new(mac_key, self.recv_buf[:length - 4], self.hashfunc).digest()[:4] != self.recv_buf[length - 4:length]:\n                self.raw_trans = True\n                self.recv_buf = b''\n                raise Exception('client_post_decrypt data uncorrect checksum')\n\n            self.recv_id = (self.recv_id + 1) & 0xFFFFFFFF\n            pos = common.ord(self.recv_buf[4])\n            if pos < 255:\n                pos += 4\n            else:\n                pos = struct.unpack('<H', self.recv_buf[5:7])[0] + 4\n            out_buf += self.recv_buf[pos:length - 4]\n            self.recv_buf = self.recv_buf[length:]\n\n        return out_buf\n\n    def server_pre_encrypt(self, buf):\n        if self.raw_trans:\n            return buf\n        ret = b''\n        ogn_data_len = len(buf)\n        while len(buf) > self.unit_len:\n            ret += self.pack_data(buf[:self.unit_len], ogn_data_len)\n            buf = buf[self.unit_len:]\n        ret += self.pack_data(buf, ogn_data_len)\n        self.last_rnd_len = ogn_data_len\n        return ret\n\n    def server_post_decrypt(self, buf):\n        if self.raw_trans:\n            return (buf, False)\n        self.recv_buf += buf\n        out_buf = b''\n        sendback = False\n\n        if not self.has_recv_header:\n            if len(self.recv_buf) >= 7 or len(self.recv_buf) in [2, 3]:\n                recv_len = min(len(self.recv_buf), 7)\n                mac_key = self.server_info.recv_iv + self.server_info.key\n                sha1data = hmac.new(mac_key, self.recv_buf[:1], self.hashfunc).digest()[:recv_len - 1]\n                if sha1data != self.recv_buf[1:recv_len]:\n                    return self.not_match_return(self.recv_buf)\n\n            if len(self.recv_buf) < 31:\n                return (b'', False)\n            sha1data = hmac.new(mac_key, self.recv_buf[7:27], self.hashfunc).digest()[:4]\n            if sha1data != self.recv_buf[27:31]:\n                logging.error('%s data uncorrect auth HMAC-SHA1 from %s:%d, data %s' % (self.no_compatible_method, self.server_info.client, self.server_info.client_port, binascii.hexlify(self.recv_buf)))\n                if len(self.recv_buf) < 31 + self.extra_wait_size:\n                    return (b'', False)\n                return self.not_match_return(self.recv_buf)\n\n            uid = self.recv_buf[7:11]\n            if uid in self.server_info.users:\n                self.user_id = uid\n                self.user_key = self.hashfunc(self.server_info.users[uid]).digest()\n                self.server_info.update_user_func(uid)\n            else:\n                if not self.server_info.users:\n                    self.user_key = self.server_info.key\n                else:\n                    self.user_key = self.server_info.recv_iv\n            encryptor = encrypt.Encryptor(to_bytes(base64.b64encode(self.user_key)) + self.salt, 'aes-128-cbc')\n            head = encryptor.decrypt(b'\\x00' * 16 + self.recv_buf[11:27] + b'\\x00') # need an extra byte or recv empty\n            length = struct.unpack('<H', head[12:14])[0]\n            if len(self.recv_buf) < length:\n                return (b'', False)\n\n            utc_time = struct.unpack('<I', head[:4])[0]\n            client_id = struct.unpack('<I', head[4:8])[0]\n            connection_id = struct.unpack('<I', head[8:12])[0]\n            rnd_len = struct.unpack('<H', head[14:16])[0]\n            if hmac.new(self.user_key, self.recv_buf[:length - 4], self.hashfunc).digest()[:4] != self.recv_buf[length - 4:length]:\n                logging.info('%s: checksum error, data %s' % (self.no_compatible_method, binascii.hexlify(self.recv_buf[:length])))\n                return self.not_match_return(self.recv_buf)\n            time_dif = common.int32(utc_time - (int(time.time()) & 0xffffffff))\n            if time_dif < -self.max_time_dif or time_dif > self.max_time_dif:\n                logging.info('%s: wrong timestamp, time_dif %d, data %s' % (self.no_compatible_method, time_dif, binascii.hexlify(head)))\n                return self.not_match_return(self.recv_buf)\n            elif self.server_info.data.insert(self.user_id, client_id, connection_id):\n                self.has_recv_header = True\n                out_buf = self.recv_buf[31 + rnd_len:length - 4]\n                self.client_id = client_id\n                self.connection_id = connection_id\n            else:\n                logging.info('%s: auth fail, data %s' % (self.no_compatible_method, binascii.hexlify(out_buf)))\n                return self.not_match_return(self.recv_buf)\n            self.recv_buf = self.recv_buf[length:]\n            self.has_recv_header = True\n            sendback = True\n\n        while len(self.recv_buf) > 4:\n            mac_key = self.user_key + struct.pack('<I', self.recv_id)\n            mac = hmac.new(mac_key, self.recv_buf[:2], self.hashfunc).digest()[:2]\n            if mac != self.recv_buf[2:4]:\n                self.raw_trans = True\n                logging.info(self.no_compatible_method + ': wrong crc')\n                if self.recv_id == 0:\n                    logging.info(self.no_compatible_method + ': wrong crc')\n                    return (b'E'*2048, False)\n                else:\n                    raise Exception('server_post_decrype data error')\n            length = struct.unpack('<H', self.recv_buf[:2])[0]\n            if length >= 8192 or length < 7:\n                self.raw_trans = True\n                self.recv_buf = b''\n                if self.recv_id == 0:\n                    logging.info(self.no_compatible_method + ': over size')\n                    return (b'E'*2048, False)\n                else:\n                    raise Exception('server_post_decrype data error')\n            if length > len(self.recv_buf):\n                break\n\n            if hmac.new(mac_key, self.recv_buf[:length - 4], self.hashfunc).digest()[:4] != self.recv_buf[length - 4:length]:\n                logging.info('%s: checksum error, data %s' % (self.no_compatible_method, binascii.hexlify(self.recv_buf[:length])))\n                self.raw_trans = True\n                self.recv_buf = b''\n                if self.recv_id == 0:\n                    return (b'E'*2048, False)\n                else:\n                    raise Exception('server_post_decrype data uncorrect checksum')\n\n            self.recv_id = (self.recv_id + 1) & 0xFFFFFFFF\n            pos = common.ord(self.recv_buf[4])\n            if pos < 255:\n                pos += 4\n            else:\n                pos = struct.unpack('<H', self.recv_buf[5:7])[0] + 4\n            out_buf += self.recv_buf[pos:length - 4]\n            self.recv_buf = self.recv_buf[length:]\n            if pos == length - 4:\n                sendback = True\n\n        if out_buf:\n            self.server_info.data.update(self.user_id, self.client_id, self.connection_id)\n        return (out_buf, sendback)\n\n    def client_udp_pre_encrypt(self, buf):\n        if self.user_key is None:\n            if b':' in to_bytes(self.server_info.protocol_param):\n                try:\n                    items = to_bytes(self.server_info.protocol_param).split(':')\n                    self.user_key = self.hashfunc(items[1]).digest()\n                    self.user_id = struct.pack('<I', int(items[0]))\n                except:\n                    pass\n            if self.user_key is None:\n                self.user_id = os.urandom(4)\n                self.user_key = self.server_info.key\n        buf += self.user_id\n        return buf + hmac.new(self.user_key, buf, self.hashfunc).digest()[:4]\n\n    def client_udp_post_decrypt(self, buf):\n        user_key = self.server_info.key\n        if hmac.new(user_key, buf[:-4], self.hashfunc).digest()[:4] != buf[-4:]:\n            return b''\n        return buf[:-4]\n\n    def server_udp_pre_encrypt(self, buf, uid):\n        user_key = self.server_info.key\n        return buf + hmac.new(user_key, buf, self.hashfunc).digest()[:4]\n\n    def server_udp_post_decrypt(self, buf):\n        uid = buf[-8:-4]\n        if uid in self.server_info.users:\n            user_key = self.hashfunc(self.server_info.users[uid]).digest()\n        else:\n            uid = None\n            if not self.server_info.users:\n                user_key = self.server_info.key\n            else:\n                user_key = self.server_info.recv_iv\n        if hmac.new(user_key, buf[:-4], self.hashfunc).digest()[:4] != buf[-4:]:\n            return (b'', None)\n        return (buf[:-8], uid)\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/obfsplugin/auth_chain.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2015-2015 breakwa11\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport os\nimport sys\nimport hashlib\nimport logging\nimport binascii\nimport base64\nimport time\nimport datetime\nimport random\nimport math\nimport struct\nimport zlib\nimport hmac\nimport hashlib\nimport bisect\n\nimport shadowsocks\nfrom shadowsocks import common, lru_cache, encrypt\nfrom shadowsocks.obfsplugin import plain\nfrom shadowsocks.common import to_bytes, to_str, ord, chr\n\ndef create_auth_chain_a(method):\n    return auth_chain_a(method)\n\ndef create_auth_chain_b(method):\n    return auth_chain_b(method)\n\nobfs_map = {\n        'auth_chain_a': (create_auth_chain_a,),\n        'auth_chain_b': (create_auth_chain_b,),\n}\n\nclass xorshift128plus(object):\n    max_int = (1 << 64) - 1\n    mov_mask = (1 << (64 - 23)) - 1\n\n    def __init__(self):\n        self.v0 = 0\n        self.v1 = 0\n\n    def next(self):\n        x = self.v0\n        y = self.v1\n        self.v0 = y\n        x ^= ((x & xorshift128plus.mov_mask) << 23)\n        x ^= (y ^ (x >> 17) ^ (y >> 26)) & xorshift128plus.max_int\n        self.v1 = x\n        return (x + y) & xorshift128plus.max_int\n\n    def init_from_bin(self, bin):\n        bin += b'\\0' * 16\n        self.v0 = struct.unpack('<Q', bin[:8])[0]\n        self.v1 = struct.unpack('<Q', bin[8:16])[0]\n\n    def init_from_bin_len(self, bin, length):\n        bin += b'\\0' * 16\n        bin = struct.pack('<H', length) + bin[2:]\n        self.v0 = struct.unpack('<Q', bin[:8])[0]\n        self.v1 = struct.unpack('<Q', bin[8:16])[0]\n\n        for i in range(4):\n            self.next()\n\ndef match_begin(str1, str2):\n    if len(str1) >= len(str2):\n        if str1[:len(str2)] == str2:\n            return True\n    return False\n\nclass auth_base(plain.plain):\n    def __init__(self, method):\n        super(auth_base, self).__init__(method)\n        self.method = method\n        self.no_compatible_method = ''\n        self.overhead = 4\n\n    def init_data(self):\n        return ''\n\n    def get_overhead(self, direction): # direction: true for c->s false for s->c\n        return self.overhead\n\n    def set_server_info(self, server_info):\n        self.server_info = server_info\n\n    def client_encode(self, buf):\n        return buf\n\n    def client_decode(self, buf):\n        return (buf, False)\n\n    def server_encode(self, buf):\n        return buf\n\n    def server_decode(self, buf):\n        return (buf, True, False)\n\n    def not_match_return(self, buf):\n        self.raw_trans = True\n        self.overhead = 0\n        if self.method == self.no_compatible_method:\n            return (b'E'*2048, False)\n        return (buf, False)\n\nclass client_queue(object):\n    def __init__(self, begin_id):\n        self.front = begin_id - 64\n        self.back = begin_id + 1\n        self.alloc = {}\n        self.enable = True\n        self.last_update = time.time()\n        self.ref = 0\n\n    def update(self):\n        self.last_update = time.time()\n\n    def addref(self):\n        self.ref += 1\n\n    def delref(self):\n        if self.ref > 0:\n            self.ref -= 1\n\n    def is_active(self):\n        return (self.ref > 0) and (time.time() - self.last_update < 60 * 10)\n\n    def re_enable(self, connection_id):\n        self.enable = True\n        self.front = connection_id - 64\n        self.back = connection_id + 1\n        self.alloc = {}\n\n    def insert(self, connection_id):\n        if not self.enable:\n            logging.warn('obfs auth: not enable')\n            return False\n        if not self.is_active():\n            self.re_enable(connection_id)\n        self.update()\n        if connection_id < self.front:\n            logging.warn('obfs auth: deprecated id, someone replay attack')\n            return False\n        if connection_id > self.front + 0x4000:\n            logging.warn('obfs auth: wrong id')\n            return False\n        if connection_id in self.alloc:\n            logging.warn('obfs auth: duplicate id, someone replay attack')\n            return False\n        if self.back <= connection_id:\n            self.back = connection_id + 1\n        self.alloc[connection_id] = 1\n        while (self.front in self.alloc) or self.front + 0x1000 < self.back:\n            if self.front in self.alloc:\n                del self.alloc[self.front]\n            self.front += 1\n        self.addref()\n        return True\n\nclass obfs_auth_chain_data(object):\n    def __init__(self, name):\n        self.name = name\n        self.user_id = {}\n        self.local_client_id = b''\n        self.connection_id = 0\n        self.set_max_client(64) # max active client count\n\n    def update(self, user_id, client_id, connection_id):\n        if user_id not in self.user_id:\n            self.user_id[user_id] = lru_cache.LRUCache()\n        local_client_id = self.user_id[user_id]\n\n        if client_id in local_client_id:\n            local_client_id[client_id].update()\n\n    def set_max_client(self, max_client):\n        self.max_client = max_client\n        self.max_buffer = max(self.max_client * 2, 1024)\n\n    def insert(self, user_id, client_id, connection_id):\n        if user_id not in self.user_id:\n            self.user_id[user_id] = lru_cache.LRUCache()\n        local_client_id = self.user_id[user_id]\n\n        if local_client_id.get(client_id, None) is None or not local_client_id[client_id].enable:\n            if local_client_id.first() is None or len(local_client_id) < self.max_client:\n                if client_id not in local_client_id:\n                    #TODO: check\n                    local_client_id[client_id] = client_queue(connection_id)\n                else:\n                    local_client_id[client_id].re_enable(connection_id)\n                return local_client_id[client_id].insert(connection_id)\n\n            if not local_client_id[local_client_id.first()].is_active():\n                del local_client_id[local_client_id.first()]\n                if client_id not in local_client_id:\n                    #TODO: check\n                    local_client_id[client_id] = client_queue(connection_id)\n                else:\n                    local_client_id[client_id].re_enable(connection_id)\n                return local_client_id[client_id].insert(connection_id)\n\n            logging.warn(self.name + ': no inactive client')\n            return False\n        else:\n            return local_client_id[client_id].insert(connection_id)\n\n    def remove(self, user_id, client_id):\n        if user_id in self.user_id:\n            local_client_id = self.user_id[user_id]\n            if client_id in local_client_id:\n                local_client_id[client_id].delref()\n\nclass auth_chain_a(auth_base):\n    def __init__(self, method):\n        super(auth_chain_a, self).__init__(method)\n        self.hashfunc = hashlib.md5\n        self.recv_buf = b''\n        self.unit_len = 2800\n        self.raw_trans = False\n        self.has_sent_header = False\n        self.has_recv_header = False\n        self.client_id = 0\n        self.connection_id = 0\n        self.max_time_dif = 60 * 60 * 24 # time dif (second) setting\n        self.salt = b\"auth_chain_a\"\n        self.no_compatible_method = 'auth_chain_a'\n        self.pack_id = 1\n        self.recv_id = 1\n        self.user_id = None\n        self.user_id_num = 0\n        self.user_key = None\n        self.overhead = 4\n        self.client_over_head = 4\n        self.last_client_hash = b''\n        self.last_server_hash = b''\n        self.random_client = xorshift128plus()\n        self.random_server = xorshift128plus()\n        self.encryptor = None\n\n    def init_data(self):\n        return obfs_auth_chain_data(self.method)\n\n    def get_overhead(self, direction): # direction: true for c->s false for s->c\n        return self.overhead\n\n    def set_server_info(self, server_info):\n        self.server_info = server_info\n        try:\n            max_client = int(server_info.protocol_param.split('#')[0])\n        except:\n            max_client = 64\n        self.server_info.data.set_max_client(max_client)\n\n    def trapezoid_random_float(self, d):\n        if d == 0:\n            return random.random()\n        s = random.random()\n        a = 1 - d\n        return (math.sqrt(a * a + 4 * d * s) - a) / (2 * d)\n\n    def trapezoid_random_int(self, max_val, d):\n        v = self.trapezoid_random_float(d)\n        return int(v * max_val)\n\n    def rnd_data_len(self, buf_size, last_hash, random):\n        if buf_size > 1440:\n            return 0\n        random.init_from_bin_len(last_hash, buf_size)\n        if buf_size > 1300:\n            return random.next() % 31\n        if buf_size > 900:\n            return random.next() % 127\n        if buf_size > 400:\n            return random.next() % 521\n        return random.next() % 1021\n\n    def udp_rnd_data_len(self, last_hash, random):\n        random.init_from_bin(last_hash)\n        return random.next() % 127\n\n    def rnd_start_pos(self, rand_len, random):\n        if rand_len > 0:\n            return random.next() % 8589934609 % rand_len\n        return 0\n\n    def rnd_data(self, buf_size, buf, last_hash, random):\n        rand_len = self.rnd_data_len(buf_size, last_hash, random)\n\n        rnd_data_buf = os.urandom(rand_len)\n\n        if buf_size == 0:\n            return rnd_data_buf\n        else:\n            if rand_len > 0:\n                start_pos = self.rnd_start_pos(rand_len, random)\n                return rnd_data_buf[:start_pos] + buf + rnd_data_buf[start_pos:]\n            else:\n                return buf\n\n    def pack_client_data(self, buf):\n        buf = self.encryptor.encrypt(buf)\n        data = self.rnd_data(len(buf), buf, self.last_client_hash, self.random_client)\n        data_len = len(data) + 8\n        mac_key = self.user_key + struct.pack('<I', self.pack_id)\n        length = len(buf) ^ struct.unpack('<H', self.last_client_hash[14:])[0]\n        data = struct.pack('<H', length) + data\n        self.last_client_hash = hmac.new(mac_key, data, self.hashfunc).digest()\n        data += self.last_client_hash[:2]\n        self.pack_id = (self.pack_id + 1) & 0xFFFFFFFF\n        return data\n\n    def pack_server_data(self, buf):\n        buf = self.encryptor.encrypt(buf)\n        data = self.rnd_data(len(buf), buf, self.last_server_hash, self.random_server)\n        data_len = len(data) + 8\n        mac_key = self.user_key + struct.pack('<I', self.pack_id)\n        length = len(buf) ^ struct.unpack('<H', self.last_server_hash[14:])[0]\n        data = struct.pack('<H', length) + data\n        self.last_server_hash = hmac.new(mac_key, data, self.hashfunc).digest()\n        data += self.last_server_hash[:2]\n        self.pack_id = (self.pack_id + 1) & 0xFFFFFFFF\n        return data\n\n    def pack_auth_data(self, auth_data, buf):\n        data = auth_data\n        data_len = 12 + 4 + 16 + 4\n        data = data + (struct.pack('<H', self.server_info.overhead) + struct.pack('<H', 0))\n        mac_key = self.server_info.iv + self.server_info.key\n\n        check_head = os.urandom(4)\n        self.last_client_hash = hmac.new(mac_key, check_head, self.hashfunc).digest()\n        check_head += self.last_client_hash[:8]\n\n        if b':' in to_bytes(self.server_info.protocol_param):\n            try:\n                items = to_bytes(self.server_info.protocol_param).split(b':')\n                self.user_key = items[1]\n                uid = struct.pack('<I', int(items[0]))\n            except:\n                uid = os.urandom(4)\n        else:\n            uid = os.urandom(4)\n        if self.user_key is None:\n            self.user_key = self.server_info.key\n\n        encryptor = encrypt.Encryptor(to_bytes(base64.b64encode(self.user_key)) + self.salt, 'aes-128-cbc', b'\\x00' * 16)\n\n        uid = struct.unpack('<I', uid)[0] ^ struct.unpack('<I', self.last_client_hash[8:12])[0]\n        uid = struct.pack('<I', uid)\n        data = uid + encryptor.encrypt(data)[16:]\n        self.last_server_hash = hmac.new(self.user_key, data, self.hashfunc).digest()\n        data = check_head + data + self.last_server_hash[:4]\n        self.encryptor = encrypt.Encryptor(to_bytes(base64.b64encode(self.user_key)) + to_bytes(base64.b64encode(self.last_client_hash)), 'rc4')\n        return data + self.pack_client_data(buf)\n\n    def auth_data(self):\n        utc_time = int(time.time()) & 0xFFFFFFFF\n        if self.server_info.data.connection_id > 0xFF000000:\n            self.server_info.data.local_client_id = b''\n        if not self.server_info.data.local_client_id:\n            self.server_info.data.local_client_id = os.urandom(4)\n            logging.debug(\"local_client_id %s\" % (binascii.hexlify(self.server_info.data.local_client_id),))\n            self.server_info.data.connection_id = struct.unpack('<I', os.urandom(4))[0] & 0xFFFFFF\n        self.server_info.data.connection_id += 1\n        return b''.join([struct.pack('<I', utc_time),\n                self.server_info.data.local_client_id,\n                struct.pack('<I', self.server_info.data.connection_id)])\n\n    def client_pre_encrypt(self, buf):\n        ret = b''\n        ogn_data_len = len(buf)\n        if not self.has_sent_header:\n            head_size = self.get_head_size(buf, 30)\n            datalen = min(len(buf), random.randint(0, 31) + head_size)\n            ret += self.pack_auth_data(self.auth_data(), buf[:datalen])\n            buf = buf[datalen:]\n            self.has_sent_header = True\n        while len(buf) > self.unit_len:\n            ret += self.pack_client_data(buf[:self.unit_len])\n            buf = buf[self.unit_len:]\n        ret += self.pack_client_data(buf)\n        return ret\n\n    def client_post_decrypt(self, buf):\n        if self.raw_trans:\n            return buf\n        self.recv_buf += buf\n        out_buf = b''\n        while len(self.recv_buf) > 4:\n            mac_key = self.user_key + struct.pack('<I', self.recv_id)\n            data_len = struct.unpack('<H', self.recv_buf[:2])[0] ^ struct.unpack('<H', self.last_server_hash[14:16])[0]\n            rand_len = self.rnd_data_len(data_len, self.last_server_hash, self.random_server)\n            length = data_len + rand_len\n            if length >= 4096:\n                self.raw_trans = True\n                self.recv_buf = b''\n                raise Exception('client_post_decrypt data error')\n\n            if length + 4 > len(self.recv_buf):\n                break\n\n            server_hash = hmac.new(mac_key, self.recv_buf[:length + 2], self.hashfunc).digest()\n            if server_hash[:2] != self.recv_buf[length + 2 : length + 4]:\n                logging.info('%s: checksum error, data %s' % (self.no_compatible_method, binascii.hexlify(self.recv_buf[:length])))\n                self.raw_trans = True\n                self.recv_buf = b''\n                raise Exception('client_post_decrypt data uncorrect checksum')\n\n            pos = 2\n            if data_len > 0 and rand_len > 0:\n                pos = 2 + self.rnd_start_pos(rand_len, self.random_server)\n            out_buf += self.encryptor.decrypt(self.recv_buf[pos : data_len + pos])\n            self.last_server_hash = server_hash\n            if self.recv_id == 1:\n                self.server_info.tcp_mss = struct.unpack('<H', out_buf[:2])[0]\n                out_buf = out_buf[2:]\n            self.recv_id = (self.recv_id + 1) & 0xFFFFFFFF\n            self.recv_buf = self.recv_buf[length + 4:]\n\n        return out_buf\n\n    def server_pre_encrypt(self, buf):\n        if self.raw_trans:\n            return buf\n        ret = b''\n        if self.pack_id == 1:\n            tcp_mss = self.server_info.tcp_mss if self.server_info.tcp_mss < 1500 else 1500\n            self.server_info.tcp_mss = tcp_mss\n            buf = struct.pack('<H', tcp_mss) + buf\n            self.unit_len = tcp_mss - self.client_over_head\n        while len(buf) > self.unit_len:\n            ret += self.pack_server_data(buf[:self.unit_len])\n            buf = buf[self.unit_len:]\n        ret += self.pack_server_data(buf)\n        return ret\n\n    def server_post_decrypt(self, buf):\n        if self.raw_trans:\n            return (buf, False)\n        self.recv_buf += buf\n        out_buf = b''\n        sendback = False\n\n        if not self.has_recv_header:\n            if len(self.recv_buf) >= 12 or len(self.recv_buf) in [7, 8]:\n                recv_len = min(len(self.recv_buf), 12)\n                mac_key = self.server_info.recv_iv + self.server_info.key\n                md5data = hmac.new(mac_key, self.recv_buf[:4], self.hashfunc).digest()\n                if md5data[:recv_len - 4] != self.recv_buf[4:recv_len]:\n                    return self.not_match_return(self.recv_buf)\n\n            if len(self.recv_buf) < 12 + 24:\n                return (b'', False)\n\n            self.last_client_hash = md5data\n            uid = struct.unpack('<I', self.recv_buf[12:16])[0] ^ struct.unpack('<I', md5data[8:12])[0]\n            self.user_id_num = uid\n            uid = struct.pack('<I', uid)\n            if uid in self.server_info.users:\n                self.user_id = uid\n                self.user_key = self.server_info.users[uid]\n                self.server_info.update_user_func(uid)\n            else:\n                self.user_id_num = 0\n                if not self.server_info.users:\n                    self.user_key = self.server_info.key\n                else:\n                    self.user_key = self.server_info.recv_iv\n\n            md5data = hmac.new(self.user_key, self.recv_buf[12 : 12 + 20], self.hashfunc).digest()\n            if md5data[:4] != self.recv_buf[32:36]:\n                logging.error('%s data uncorrect auth HMAC-MD5 from %s:%d, data %s' % (self.no_compatible_method, self.server_info.client, self.server_info.client_port, binascii.hexlify(self.recv_buf)))\n                if len(self.recv_buf) < 36:\n                    return (b'', False)\n                return self.not_match_return(self.recv_buf)\n\n            self.last_server_hash = md5data\n            encryptor = encrypt.Encryptor(to_bytes(base64.b64encode(self.user_key)) + self.salt, 'aes-128-cbc')\n            head = encryptor.decrypt(b'\\x00' * 16 + self.recv_buf[16:32] + b'\\x00') # need an extra byte or recv empty\n            self.client_over_head = struct.unpack('<H', head[12:14])[0]\n\n            utc_time = struct.unpack('<I', head[:4])[0]\n            client_id = struct.unpack('<I', head[4:8])[0]\n            connection_id = struct.unpack('<I', head[8:12])[0]\n            time_dif = common.int32(utc_time - (int(time.time()) & 0xffffffff))\n            if time_dif < -self.max_time_dif or time_dif > self.max_time_dif:\n                logging.info('%s: wrong timestamp, time_dif %d, data %s' % (self.no_compatible_method, time_dif, binascii.hexlify(head)))\n                return self.not_match_return(self.recv_buf)\n            elif self.server_info.data.insert(self.user_id, client_id, connection_id):\n                self.has_recv_header = True\n                self.client_id = client_id\n                self.connection_id = connection_id\n            else:\n                logging.info('%s: auth fail, data %s' % (self.no_compatible_method, binascii.hexlify(out_buf)))\n                return self.not_match_return(self.recv_buf)\n\n            self.encryptor = encrypt.Encryptor(to_bytes(base64.b64encode(self.user_key)) + to_bytes(base64.b64encode(self.last_client_hash)), 'rc4')\n            self.recv_buf = self.recv_buf[36:]\n            self.has_recv_header = True\n            sendback = True\n\n        while len(self.recv_buf) > 4:\n            mac_key = self.user_key + struct.pack('<I', self.recv_id)\n            data_len = struct.unpack('<H', self.recv_buf[:2])[0] ^ struct.unpack('<H', self.last_client_hash[14:16])[0]\n            rand_len = self.rnd_data_len(data_len, self.last_client_hash, self.random_client)\n            length = data_len + rand_len\n            if length >= 4096:\n                self.raw_trans = True\n                self.recv_buf = b''\n                if self.recv_id == 0:\n                    logging.info(self.no_compatible_method + ': over size')\n                    return (b'E'*2048, False)\n                else:\n                    raise Exception('server_post_decrype data error')\n\n            if length + 4 > len(self.recv_buf):\n                break\n\n            client_hash = hmac.new(mac_key, self.recv_buf[:length + 2], self.hashfunc).digest()\n            if client_hash[:2] != self.recv_buf[length + 2 : length + 4]:\n                logging.info('%s: checksum error, data %s' % (self.no_compatible_method, binascii.hexlify(self.recv_buf[:length])))\n                self.raw_trans = True\n                self.recv_buf = b''\n                if self.recv_id == 0:\n                    return (b'E'*2048, False)\n                else:\n                    raise Exception('server_post_decrype data uncorrect checksum')\n\n            self.recv_id = (self.recv_id + 1) & 0xFFFFFFFF\n            pos = 2\n            if data_len > 0 and rand_len > 0:\n                pos = 2 + self.rnd_start_pos(rand_len, self.random_client)\n            out_buf += self.encryptor.decrypt(self.recv_buf[pos : data_len + pos])\n            self.last_client_hash = client_hash\n            self.recv_buf = self.recv_buf[length + 4:]\n            if data_len == 0:\n                sendback = True\n\n        if out_buf:\n            self.server_info.data.update(self.user_id, self.client_id, self.connection_id)\n        return (out_buf, sendback)\n\n    def client_udp_pre_encrypt(self, buf):\n        if self.user_key is None:\n            if b':' in to_bytes(self.server_info.protocol_param):\n                try:\n                    items = to_bytes(self.server_info.protocol_param).split(':')\n                    self.user_key = self.hashfunc(items[1]).digest()\n                    self.user_id = struct.pack('<I', int(items[0]))\n                except:\n                    pass\n            if self.user_key is None:\n                self.user_id = os.urandom(4)\n                self.user_key = self.server_info.key\n        authdata = os.urandom(3)\n        mac_key = self.server_info.key\n        md5data = hmac.new(mac_key, authdata, self.hashfunc).digest()\n        uid = struct.unpack('<I', self.user_id)[0] ^ struct.unpack('<I', md5data[:4])[0]\n        uid = struct.pack('<I', uid)\n        rand_len = self.udp_rnd_data_len(md5data, self.random_client)\n        encryptor = encrypt.Encryptor(to_bytes(base64.b64encode(self.user_key)) + to_bytes(base64.b64encode(md5data)), 'rc4')\n        out_buf = encryptor.encrypt(buf)\n        buf = out_buf + os.urandom(rand_len) + authdata + uid\n        return buf + hmac.new(self.user_key, buf, self.hashfunc).digest()[:1]\n\n    def client_udp_post_decrypt(self, buf):\n        if len(buf) <= 8:\n            return (b'', None)\n        if hmac.new(self.user_key, buf[:-1], self.hashfunc).digest()[:1] != buf[-1:]:\n            return (b'', None)\n        mac_key = self.server_info.key\n        md5data = hmac.new(mac_key, buf[-8:-1], self.hashfunc).digest()\n        rand_len = self.udp_rnd_data_len(md5data, self.random_server)\n        encryptor = encrypt.Encryptor(to_bytes(base64.b64encode(self.user_key)) + to_bytes(base64.b64encode(md5data)), 'rc4')\n        return encryptor.decrypt(buf[:-8 - rand_len])\n\n    def server_udp_pre_encrypt(self, buf, uid):\n        if uid in self.server_info.users:\n            user_key = self.server_info.users[uid]\n        else:\n            uid = None\n            if not self.server_info.users:\n                user_key = self.server_info.key\n            else:\n                user_key = self.server_info.recv_iv\n        authdata = os.urandom(7)\n        mac_key = self.server_info.key\n        md5data = hmac.new(mac_key, authdata, self.hashfunc).digest()\n        rand_len = self.udp_rnd_data_len(md5data, self.random_server)\n        encryptor = encrypt.Encryptor(to_bytes(base64.b64encode(user_key)) + to_bytes(base64.b64encode(md5data)), 'rc4')\n        out_buf = encryptor.encrypt(buf)\n        buf = out_buf + os.urandom(rand_len) + authdata\n        return buf + hmac.new(user_key, buf, self.hashfunc).digest()[:1]\n\n    def server_udp_post_decrypt(self, buf):\n        mac_key = self.server_info.key\n        md5data = hmac.new(mac_key, buf[-8:-5], self.hashfunc).digest()\n        uid = struct.unpack('<I', buf[-5:-1])[0] ^ struct.unpack('<I', md5data[:4])[0]\n        uid = struct.pack('<I', uid)\n        if uid in self.server_info.users:\n            user_key = self.server_info.users[uid]\n        else:\n            uid = None\n            if not self.server_info.users:\n                user_key = self.server_info.key\n            else:\n                user_key = self.server_info.recv_iv\n        if hmac.new(user_key, buf[:-1], self.hashfunc).digest()[:1] != buf[-1:]:\n            return (b'', None)\n        rand_len = self.udp_rnd_data_len(md5data, self.random_client)\n        encryptor = encrypt.Encryptor(to_bytes(base64.b64encode(user_key)) + to_bytes(base64.b64encode(md5data)), 'rc4')\n        out_buf = encryptor.decrypt(buf[:-8 - rand_len])\n        return (out_buf, uid)\n\n    def dispose(self):\n        self.server_info.data.remove(self.user_id, self.client_id)\n\nclass auth_chain_b(auth_chain_a):\n    def __init__(self, method):\n        super(auth_chain_b, self).__init__(method)\n        self.salt = b\"auth_chain_b\"\n        self.no_compatible_method = 'auth_chain_b'\n        self.data_size_list = []\n        self.data_size_list2 = []\n\n    def init_data_size(self, key):\n        if self.data_size_list:\n            self.data_size_list = []\n            self.data_size_list2 = []\n        random = xorshift128plus()\n        random.init_from_bin(key)\n        list_len = random.next() % 8 + 4\n        for i in range(0, list_len):\n            self.data_size_list.append((int)(random.next() % 2340 % 2040 % 1440))\n        self.data_size_list.sort()\n        list_len = random.next() % 16 + 8\n        for i in range(0, list_len):\n            self.data_size_list2.append((int)(random.next() % 2340 % 2040 % 1440))\n        self.data_size_list2.sort()\n\n    def set_server_info(self, server_info):\n        self.server_info = server_info\n        try:\n            max_client = int(server_info.protocol_param.split('#')[0])\n        except:\n            max_client = 64\n        self.server_info.data.set_max_client(max_client)\n        self.init_data_size(self.server_info.key)\n\n    def rnd_data_len(self, buf_size, last_hash, random):\n        if buf_size >= 1440:\n            return 0\n        random.init_from_bin_len(last_hash, buf_size)\n        pos = bisect.bisect_left(self.data_size_list, buf_size + self.server_info.overhead)\n        final_pos = pos + random.next() % (len(self.data_size_list))\n        if final_pos < len(self.data_size_list):\n            return self.data_size_list[final_pos] - buf_size - self.server_info.overhead\n\n        pos = bisect.bisect_left(self.data_size_list2, buf_size + self.server_info.overhead)\n        final_pos = pos + random.next() % (len(self.data_size_list2))\n        if final_pos < len(self.data_size_list2):\n            return self.data_size_list2[final_pos] - buf_size - self.server_info.overhead\n        if final_pos < pos + len(self.data_size_list2) - 1:\n            return 0\n\n        if buf_size > 1300:\n            return random.next() % 31\n        if buf_size > 900:\n            return random.next() % 127\n        if buf_size > 400:\n            return random.next() % 521\n        return random.next() % 1021\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/obfsplugin/http_simple.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2015-2015 breakwa11\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport os\nimport sys\nimport hashlib\nimport logging\nimport binascii\nimport struct\nimport base64\nimport datetime\nimport random\n\nfrom shadowsocks import common\nfrom shadowsocks.obfsplugin import plain\nfrom shadowsocks.common import to_bytes, to_str, ord, chr\n\ndef create_http_simple_obfs(method):\n    return http_simple(method)\n\ndef create_http_post_obfs(method):\n    return http_post(method)\n\ndef create_random_head_obfs(method):\n    return random_head(method)\n\nobfs_map = {\n        'http_simple': (create_http_simple_obfs,),\n        'http_simple_compatible': (create_http_simple_obfs,),\n        'http_post': (create_http_post_obfs,),\n        'http_post_compatible': (create_http_post_obfs,),\n        'random_head': (create_random_head_obfs,),\n        'random_head_compatible': (create_random_head_obfs,),\n}\n\ndef match_begin(str1, str2):\n    if len(str1) >= len(str2):\n        if str1[:len(str2)] == str2:\n            return True\n    return False\n\nclass http_simple(plain.plain):\n    def __init__(self, method):\n        self.method = method\n        self.has_sent_header = False\n        self.has_recv_header = False\n        self.host = None\n        self.port = 0\n        self.recv_buffer = b''\n        self.user_agent = [b\"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0\",\n            b\"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:40.0) Gecko/20100101 Firefox/44.0\",\n            b\"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36\",\n            b\"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/27.0.1453.93 Chrome/27.0.1453.93 Safari/537.36\",\n            b\"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0\",\n            b\"Mozilla/5.0 (compatible; WOW64; MSIE 10.0; Windows NT 6.2)\",\n            b\"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\",\n            b\"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C)\",\n            b\"Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko\",\n            b\"Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/BuildID) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36\",\n            b\"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3\",\n            b\"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3\"]\n\n    def encode_head(self, buf):\n        hexstr = binascii.hexlify(buf)\n        chs = []\n        for i in range(0, len(hexstr), 2):\n            chs.append(b\"%\" + hexstr[i:i+2])\n        return b''.join(chs)\n\n    def client_encode(self, buf):\n        if self.has_sent_header:\n            return buf\n        head_size = len(self.server_info.iv) + self.server_info.head_len\n        if len(buf) - head_size > 64:\n            headlen = head_size + random.randint(0, 64)\n        else:\n            headlen = len(buf)\n        headdata = buf[:headlen]\n        buf = buf[headlen:]\n        port = b''\n        if self.server_info.port != 80:\n            port = b':' + to_bytes(str(self.server_info.port))\n        body = None\n        hosts = (self.server_info.obfs_param or self.server_info.host)\n        pos = hosts.find(\"#\")\n        if pos >= 0:\n            body = hosts[pos + 1:].replace(\"\\n\", \"\\r\\n\")\n            body = body.replace(\"\\\\n\", \"\\r\\n\")\n            hosts = hosts[:pos]\n        hosts = hosts.split(',')\n        host = random.choice(hosts)\n        http_head = b\"GET /\" + self.encode_head(headdata) + b\" HTTP/1.1\\r\\n\"\n        http_head += b\"Host: \" + to_bytes(host) + port + b\"\\r\\n\"\n        if body:\n            http_head += body + \"\\r\\n\\r\\n\"\n        else:\n            http_head += b\"User-Agent: \" + random.choice(self.user_agent) + b\"\\r\\n\"\n            http_head += b\"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\\r\\nAccept-Language: en-US,en;q=0.8\\r\\nAccept-Encoding: gzip, deflate\\r\\nDNT: 1\\r\\nConnection: keep-alive\\r\\n\\r\\n\"\n        self.has_sent_header = True\n        return http_head + buf\n\n    def client_decode(self, buf):\n        if self.has_recv_header:\n            return (buf, False)\n        pos = buf.find(b'\\r\\n\\r\\n')\n        if pos >= 0:\n            self.has_recv_header = True\n            return (buf[pos + 4:], False)\n        else:\n            return (b'', False)\n\n    def server_encode(self, buf):\n        if self.has_sent_header:\n            return buf\n\n        header = b'HTTP/1.1 200 OK\\r\\nConnection: keep-alive\\r\\nContent-Encoding: gzip\\r\\nContent-Type: text/html\\r\\nDate: '\n        header += to_bytes(datetime.datetime.now().strftime('%a, %d %b %Y %H:%M:%S GMT'))\n        header += b'\\r\\nServer: nginx\\r\\nVary: Accept-Encoding\\r\\n\\r\\n'\n        self.has_sent_header = True\n        return header + buf\n\n    def get_data_from_http_header(self, buf):\n        ret_buf = b''\n        lines = buf.split(b'\\r\\n')\n        if lines and len(lines) > 1:\n            hex_items = lines[0].split(b'%')\n            if hex_items and len(hex_items) > 1:\n                for index in range(1, len(hex_items)):\n                    if len(hex_items[index]) < 2:\n                        ret_buf += binascii.unhexlify('0' + hex_items[index])\n                        break\n                    elif len(hex_items[index]) > 2:\n                        ret_buf += binascii.unhexlify(hex_items[index][:2])\n                        break\n                    else:\n                        ret_buf += binascii.unhexlify(hex_items[index])\n                return ret_buf\n        return b''\n\n    def get_host_from_http_header(self, buf):\n        ret_buf = b''\n        lines = buf.split(b'\\r\\n')\n        if lines and len(lines) > 1:\n            for line in lines:\n                if match_begin(line, b\"Host: \"):\n                    return common.to_str(line[6:])\n\n    def not_match_return(self, buf):\n        self.has_sent_header = True\n        self.has_recv_header = True\n        if self.method == 'http_simple':\n            return (b'E'*2048, False, False)\n        return (buf, True, False)\n\n    def error_return(self, buf):\n        self.has_sent_header = True\n        self.has_recv_header = True\n        return (b'E'*2048, False, False)\n\n    def server_decode(self, buf):\n        if self.has_recv_header:\n            return (buf, True, False)\n\n        self.recv_buffer += buf\n        buf = self.recv_buffer\n        if len(buf) > 10:\n            if match_begin(buf, b'GET ') or match_begin(buf, b'POST '):\n                if len(buf) > 65536:\n                    self.recv_buffer = None\n                    logging.warn('http_simple: over size')\n                    return self.not_match_return(buf)\n            else: #not http header, run on original protocol\n                self.recv_buffer = None\n                logging.debug('http_simple: not match begin')\n                return self.not_match_return(buf)\n        else:\n            return (b'', True, False)\n\n        if b'\\r\\n\\r\\n' in buf:\n            datas = buf.split(b'\\r\\n\\r\\n', 1)\n            ret_buf = self.get_data_from_http_header(buf)\n            host = self.get_host_from_http_header(buf)\n            if host and self.server_info.obfs_param:\n                pos = host.find(\":\")\n                if pos >= 0:\n                    host = host[:pos]\n                hosts = self.server_info.obfs_param.split(',')\n                if host not in hosts:\n                    return self.not_match_return(buf)\n            if len(ret_buf) < 4:\n                return self.error_return(buf)\n            if len(datas) > 1:\n                ret_buf += datas[1]\n            if len(ret_buf) >= 13:\n                self.has_recv_header = True\n                return (ret_buf, True, False)\n            return self.not_match_return(buf)\n        else:\n            return (b'', True, False)\n\nclass http_post(http_simple):\n    def __init__(self, method):\n        super(http_post, self).__init__(method)\n\n    def boundary(self):\n        return to_bytes(''.join([random.choice(\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\") for i in range(32)]))\n\n    def client_encode(self, buf):\n        if self.has_sent_header:\n            return buf\n        head_size = len(self.server_info.iv) + self.server_info.head_len\n        if len(buf) - head_size > 64:\n            headlen = head_size + random.randint(0, 64)\n        else:\n            headlen = len(buf)\n        headdata = buf[:headlen]\n        buf = buf[headlen:]\n        port = b''\n        if self.server_info.port != 80:\n            port = b':' + to_bytes(str(self.server_info.port))\n        body = None\n        hosts = (self.server_info.obfs_param or self.server_info.host)\n        pos = hosts.find(\"#\")\n        if pos >= 0:\n            body = hosts[pos + 1:].replace(\"\\\\n\", \"\\r\\n\")\n            hosts = hosts[:pos]\n        hosts = hosts.split(',')\n        host = random.choice(hosts)\n        http_head = b\"POST /\" + self.encode_head(headdata) + b\" HTTP/1.1\\r\\n\"\n        http_head += b\"Host: \" + to_bytes(host) + port + b\"\\r\\n\"\n        if body:\n            http_head += body + \"\\r\\n\\r\\n\"\n        else:\n            http_head += b\"User-Agent: \" + random.choice(self.user_agent) + b\"\\r\\n\"\n            http_head += b\"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\\r\\nAccept-Language: en-US,en;q=0.8\\r\\nAccept-Encoding: gzip, deflate\\r\\n\"\n            http_head += b\"Content-Type: multipart/form-data; boundary=\" + self.boundary() + b\"\\r\\nDNT: 1\\r\\n\"\n            http_head += b\"Connection: keep-alive\\r\\n\\r\\n\"\n        self.has_sent_header = True\n        return http_head + buf\n\n    def not_match_return(self, buf):\n        self.has_sent_header = True\n        self.has_recv_header = True\n        if self.method == 'http_post':\n            return (b'E'*2048, False, False)\n        return (buf, True, False)\n\nclass random_head(plain.plain):\n    def __init__(self, method):\n        self.method = method\n        self.has_sent_header = False\n        self.has_recv_header = False\n        self.raw_trans_sent = False\n        self.raw_trans_recv = False\n        self.send_buffer = b''\n\n    def client_encode(self, buf):\n        if self.raw_trans_sent:\n            return buf\n        self.send_buffer += buf\n        if not self.has_sent_header:\n            self.has_sent_header = True\n            data = os.urandom(common.ord(os.urandom(1)[0]) % 96 + 4)\n            crc = (0xffffffff - binascii.crc32(data)) & 0xffffffff\n            return data + struct.pack('<I', crc)\n        if self.raw_trans_recv:\n            ret = self.send_buffer\n            self.send_buffer = b''\n            self.raw_trans_sent = True\n            return ret\n        return b''\n\n    def client_decode(self, buf):\n        if self.raw_trans_recv:\n            return (buf, False)\n        self.raw_trans_recv = True\n        return (b'', True)\n\n    def server_encode(self, buf):\n        if self.has_sent_header:\n            return buf\n        self.has_sent_header = True\n        return os.urandom(common.ord(os.urandom(1)[0]) % 96 + 4)\n\n    def server_decode(self, buf):\n        if self.has_recv_header:\n            return (buf, True, False)\n\n        self.has_recv_header = True\n        crc = binascii.crc32(buf) & 0xffffffff\n        if crc != 0xffffffff:\n            self.has_sent_header = True\n            if self.method == 'random_head':\n                return (b'E'*2048, False, False)\n            return (buf, True, False)\n        # (buffer_to_recv, is_need_decrypt, is_need_to_encode_and_send_back)\n        return (b'', False, True)\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/obfsplugin/obfs_tls.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2015-2015 breakwa11\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport os\nimport sys\nimport hashlib\nimport logging\nimport binascii\nimport struct\nimport base64\nimport time\nimport random\nimport hmac\nimport hashlib\nimport string\n\nfrom shadowsocks import common\nfrom shadowsocks.obfsplugin import plain\nfrom shadowsocks.common import to_bytes, to_str, ord\nfrom shadowsocks import lru_cache\n\ndef create_tls_ticket_auth_obfs(method):\n    return tls_ticket_auth(method)\n\nobfs_map = {\n        'tls1.2_ticket_auth': (create_tls_ticket_auth_obfs,),\n        'tls1.2_ticket_auth_compatible': (create_tls_ticket_auth_obfs,),\n        'tls1.2_ticket_fastauth': (create_tls_ticket_auth_obfs,),\n        'tls1.2_ticket_fastauth_compatible': (create_tls_ticket_auth_obfs,),\n}\n\ndef match_begin(str1, str2):\n    if len(str1) >= len(str2):\n        if str1[:len(str2)] == str2:\n            return True\n    return False\n\nclass obfs_auth_data(object):\n    def __init__(self):\n        self.client_data = lru_cache.LRUCache(60 * 5)\n        self.client_id = os.urandom(32)\n        self.startup_time = int(time.time() - 60 * 30) & 0xFFFFFFFF\n        self.ticket_buf = {}\n\nclass tls_ticket_auth(plain.plain):\n    def __init__(self, method):\n        self.method = method\n        self.handshake_status = 0\n        self.send_buffer = b''\n        self.recv_buffer = b''\n        self.client_id = b''\n        self.max_time_dif = 60 * 60 * 24 # time dif (second) setting\n        self.tls_version = b'\\x03\\x03'\n        self.overhead = 5\n\n    def init_data(self):\n        return obfs_auth_data()\n\n    def get_overhead(self, direction): # direction: true for c->s false for s->c\n        return self.overhead\n\n    def sni(self, url):\n        url = common.to_bytes(url)\n        data = b\"\\x00\" + struct.pack('>H', len(url)) + url\n        data = b\"\\x00\\x00\" + struct.pack('>H', len(data) + 2) + struct.pack('>H', len(data)) + data\n        return data\n\n    def pack_auth_data(self, client_id):\n        utc_time = int(time.time()) & 0xFFFFFFFF\n        data = struct.pack('>I', utc_time) + os.urandom(18)\n        data += hmac.new(self.server_info.key + client_id, data, hashlib.sha1).digest()[:10]\n        return data\n\n    def client_encode(self, buf):\n        if self.handshake_status == -1:\n            return buf\n        if self.handshake_status == 8:\n            ret = b''\n            while len(buf) > 2048:\n                size = min(struct.unpack('>H', os.urandom(2))[0] % 4096 + 100, len(buf))\n                ret += b\"\\x17\" + self.tls_version + struct.pack('>H', size) + buf[:size]\n                buf = buf[size:]\n            if len(buf) > 0:\n                ret += b\"\\x17\" + self.tls_version + struct.pack('>H', len(buf)) + buf\n            return ret\n        if len(buf) > 0:\n            self.send_buffer += b\"\\x17\" + self.tls_version + struct.pack('>H', len(buf)) + buf\n        if self.handshake_status == 0:\n            self.handshake_status = 1\n            data = self.tls_version + self.pack_auth_data(self.server_info.data.client_id) + b\"\\x20\" + self.server_info.data.client_id + binascii.unhexlify(b\"001cc02bc02fcca9cca8cc14cc13c00ac014c009c013009c0035002f000a\" + b\"0100\")\n            ext = binascii.unhexlify(b\"ff01000100\")\n            host = self.server_info.obfs_param or self.server_info.host\n            if host and host[-1] in string.digits:\n                host = ''\n            hosts = host.split(',')\n            host = random.choice(hosts)\n            ext += self.sni(host)\n            ext += b\"\\x00\\x17\\x00\\x00\"\n            if host not in self.server_info.data.ticket_buf:\n                self.server_info.data.ticket_buf[host] = os.urandom((struct.unpack('>H', os.urandom(2))[0] % 17 + 8) * 16)\n            ext += b\"\\x00\\x23\" + struct.pack('>H', len(self.server_info.data.ticket_buf[host])) + self.server_info.data.ticket_buf[host]\n            ext += binascii.unhexlify(b\"000d001600140601060305010503040104030301030302010203\")\n            ext += binascii.unhexlify(b\"000500050100000000\")\n            ext += binascii.unhexlify(b\"00120000\")\n            ext += binascii.unhexlify(b\"75500000\")\n            ext += binascii.unhexlify(b\"000b00020100\")\n            ext += binascii.unhexlify(b\"000a0006000400170018\")\n            data += struct.pack('>H', len(ext)) + ext\n            data = b\"\\x01\\x00\" + struct.pack('>H', len(data)) + data\n            data = b\"\\x16\\x03\\x01\" + struct.pack('>H', len(data)) + data\n            return data\n        elif self.handshake_status == 1 and len(buf) == 0:\n            data = b\"\\x14\" + self.tls_version + b\"\\x00\\x01\\x01\" #ChangeCipherSpec\n            data += b\"\\x16\" + self.tls_version + b\"\\x00\\x20\" + os.urandom(22) #Finished\n            data += hmac.new(self.server_info.key + self.server_info.data.client_id, data, hashlib.sha1).digest()[:10]\n            ret = data + self.send_buffer\n            self.send_buffer = b''\n            self.handshake_status = 8\n            return ret\n        return b''\n\n    def client_decode(self, buf):\n        if self.handshake_status == -1:\n            return (buf, False)\n\n        if self.handshake_status == 8:\n            ret = b''\n            self.recv_buffer += buf\n            while len(self.recv_buffer) > 5:\n                if ord(self.recv_buffer[0]) != 0x17:\n                    logging.info(\"data = %s\" % (binascii.hexlify(self.recv_buffer)))\n                    raise Exception('server_decode appdata error')\n                size = struct.unpack('>H', self.recv_buffer[3:5])[0]\n                if len(self.recv_buffer) < size + 5:\n                    break\n                buf = self.recv_buffer[5:size+5]\n                ret += buf\n                self.recv_buffer = self.recv_buffer[size+5:]\n            return (ret, False)\n\n        if len(buf) < 11 + 32 + 1 + 32:\n            raise Exception('client_decode data error')\n        verify = buf[11:33]\n        if hmac.new(self.server_info.key + self.server_info.data.client_id, verify, hashlib.sha1).digest()[:10] != buf[33:43]:\n            raise Exception('client_decode data error')\n        if hmac.new(self.server_info.key + self.server_info.data.client_id, buf[:-10], hashlib.sha1).digest()[:10] != buf[-10:]:\n            raise Exception('client_decode data error')\n        return (b'', True)\n\n    def server_encode(self, buf):\n        if self.handshake_status == -1:\n            return buf\n        if (self.handshake_status & 8) == 8:\n            ret = b''\n            while len(buf) > 2048:\n                size = min(struct.unpack('>H', os.urandom(2))[0] % 4096 + 100, len(buf))\n                ret += b\"\\x17\" + self.tls_version + struct.pack('>H', size) + buf[:size]\n                buf = buf[size:]\n            if len(buf) > 0:\n                ret += b\"\\x17\" + self.tls_version + struct.pack('>H', len(buf)) + buf\n            return ret\n        self.handshake_status |= 8\n        data = self.tls_version + self.pack_auth_data(self.client_id) + b\"\\x20\" + self.client_id + binascii.unhexlify(b\"c02f000005ff01000100\")\n        data = b\"\\x02\\x00\" + struct.pack('>H', len(data)) + data #server hello\n        data = b\"\\x16\" + self.tls_version + struct.pack('>H', len(data)) + data\n        if random.randint(0, 8) < 1:\n            ticket = os.urandom((struct.unpack('>H', os.urandom(2))[0] % 164) * 2 + 64)\n            ticket = struct.pack('>H', len(ticket) + 4) + b\"\\x04\\x00\" + struct.pack('>H', len(ticket)) + ticket\n            data += b\"\\x16\" + self.tls_version + ticket #New session ticket\n        data += b\"\\x14\" + self.tls_version + b\"\\x00\\x01\\x01\" #ChangeCipherSpec\n        finish_len = random.choice([32, 40])\n        data += b\"\\x16\" + self.tls_version + struct.pack('>H', finish_len) + os.urandom(finish_len - 10) #Finished\n        data += hmac.new(self.server_info.key + self.client_id, data, hashlib.sha1).digest()[:10]\n        if buf:\n            data += self.server_encode(buf)\n        return data\n\n    def decode_error_return(self, buf):\n        self.handshake_status = -1\n        if self.overhead > 0:\n            self.server_info.overhead -= self.overhead\n        self.overhead = 0\n        if self.method in ['tls1.2_ticket_auth', 'tls1.2_ticket_fastauth']:\n            return (b'E'*2048, False, False)\n        return (buf, True, False)\n\n    def server_decode(self, buf):\n        if self.handshake_status == -1:\n            return (buf, True, False)\n\n        if (self.handshake_status & 4) == 4:\n            ret = b''\n            self.recv_buffer += buf\n            while len(self.recv_buffer) > 5:\n                if ord(self.recv_buffer[0]) != 0x17 or ord(self.recv_buffer[1]) != 0x3 or ord(self.recv_buffer[2]) != 0x3:\n                    logging.info(\"data = %s\" % (binascii.hexlify(self.recv_buffer)))\n                    raise Exception('server_decode appdata error')\n                size = struct.unpack('>H', self.recv_buffer[3:5])[0]\n                if len(self.recv_buffer) < size + 5:\n                    break\n                ret += self.recv_buffer[5:size+5]\n                self.recv_buffer = self.recv_buffer[size+5:]\n            return (ret, True, False)\n\n        if (self.handshake_status & 1) == 1:\n            self.recv_buffer += buf\n            buf = self.recv_buffer\n            verify = buf\n            if len(buf) < 11:\n                raise Exception('server_decode data error')\n            if not match_begin(buf, b\"\\x14\" + self.tls_version + b\"\\x00\\x01\\x01\"): #ChangeCipherSpec\n                raise Exception('server_decode data error')\n            buf = buf[6:]\n            if not match_begin(buf, b\"\\x16\" + self.tls_version + b\"\\x00\"): #Finished\n                raise Exception('server_decode data error')\n            verify_len = struct.unpack('>H', buf[3:5])[0] + 1 # 11 - 10\n            if len(verify) < verify_len + 10:\n                return (b'', False, False)\n            if hmac.new(self.server_info.key + self.client_id, verify[:verify_len], hashlib.sha1).digest()[:10] != verify[verify_len:verify_len+10]:\n                raise Exception('server_decode data error')\n            self.recv_buffer = verify[verify_len + 10:]\n            status = self.handshake_status\n            self.handshake_status |= 4\n            ret = self.server_decode(b'')\n            return ret;\n\n        #raise Exception(\"handshake data = %s\" % (binascii.hexlify(buf)))\n        self.recv_buffer += buf\n        buf = self.recv_buffer\n        ogn_buf = buf\n        if len(buf) < 3:\n            return (b'', False, False)\n        if not match_begin(buf, b'\\x16\\x03\\x01'):\n            return self.decode_error_return(ogn_buf)\n        buf = buf[3:]\n        header_len = struct.unpack('>H', buf[:2])[0]\n        if header_len > len(buf) - 2:\n            return (b'', False, False)\n\n        self.recv_buffer = self.recv_buffer[header_len + 5:]\n        self.handshake_status = 1\n        buf = buf[2:header_len + 2]\n        if not match_begin(buf, b'\\x01\\x00'): #client hello\n            logging.info(\"tls_auth not client hello message\")\n            return self.decode_error_return(ogn_buf)\n        buf = buf[2:]\n        if struct.unpack('>H', buf[:2])[0] != len(buf) - 2:\n            logging.info(\"tls_auth wrong message size\")\n            return self.decode_error_return(ogn_buf)\n        buf = buf[2:]\n        if not match_begin(buf, self.tls_version):\n            logging.info(\"tls_auth wrong tls version\")\n            return self.decode_error_return(ogn_buf)\n        buf = buf[2:]\n        verifyid = buf[:32]\n        buf = buf[32:]\n        sessionid_len = ord(buf[0])\n        if sessionid_len < 32:\n            logging.info(\"tls_auth wrong sessionid_len\")\n            return self.decode_error_return(ogn_buf)\n        sessionid = buf[1:sessionid_len + 1]\n        buf = buf[sessionid_len+1:]\n        self.client_id = sessionid\n        sha1 = hmac.new(self.server_info.key + sessionid, verifyid[:22], hashlib.sha1).digest()[:10]\n        utc_time = struct.unpack('>I', verifyid[:4])[0]\n        time_dif = common.int32((int(time.time()) & 0xffffffff) - utc_time)\n        if self.server_info.obfs_param:\n            try:\n                self.max_time_dif = int(self.server_info.obfs_param)\n            except:\n                pass\n        if self.max_time_dif > 0 and (time_dif < -self.max_time_dif or time_dif > self.max_time_dif \\\n                or common.int32(utc_time - self.server_info.data.startup_time) < -self.max_time_dif / 2):\n            logging.info(\"tls_auth wrong time\")\n            return self.decode_error_return(ogn_buf)\n        if sha1 != verifyid[22:]:\n            logging.info(\"tls_auth wrong sha1\")\n            return self.decode_error_return(ogn_buf)\n        if self.server_info.data.client_data.get(verifyid[:22]):\n            logging.info(\"replay attack detect, id = %s\" % (binascii.hexlify(verifyid)))\n            return self.decode_error_return(ogn_buf)\n        self.server_info.data.client_data.sweep()\n        self.server_info.data.client_data[verifyid[:22]] = sessionid\n        if len(self.recv_buffer) >= 11:\n            ret = self.server_decode(b'')\n            return (ret[0], True, True)\n        # (buffer_to_recv, is_need_decrypt, is_need_to_encode_and_send_back)\n        return (b'', False, True)\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/obfsplugin/plain.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2015-2015 breakwa11\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport os\nimport sys\nimport hashlib\nimport logging\n\nfrom shadowsocks.common import ord\n\ndef create_obfs(method):\n    return plain(method)\n\nobfs_map = {\n        'plain': (create_obfs,),\n        'origin': (create_obfs,),\n}\n\nclass plain(object):\n    def __init__(self, method):\n        self.method = method\n        self.server_info = None\n\n    def init_data(self):\n        return b''\n\n    def get_overhead(self, direction): # direction: true for c->s false for s->c\n        return 0\n\n    def get_server_info(self):\n        return self.server_info\n\n    def set_server_info(self, server_info):\n        self.server_info = server_info\n\n    def client_pre_encrypt(self, buf):\n        return buf\n\n    def client_encode(self, buf):\n        return buf\n\n    def client_decode(self, buf):\n        # (buffer_to_recv, is_need_to_encode_and_send_back)\n        return (buf, False)\n\n    def client_post_decrypt(self, buf):\n        return buf\n\n    def server_pre_encrypt(self, buf):\n        return buf\n\n    def server_encode(self, buf):\n        return buf\n\n    def server_decode(self, buf):\n        # (buffer_to_recv, is_need_decrypt, is_need_to_encode_and_send_back)\n        return (buf, True, False)\n\n    def server_post_decrypt(self, buf):\n        return (buf, False)\n\n    def client_udp_pre_encrypt(self, buf):\n        return buf\n\n    def client_udp_post_decrypt(self, buf):\n        return buf\n\n    def server_udp_pre_encrypt(self, buf, uid):\n        return buf\n\n    def server_udp_post_decrypt(self, buf):\n        return (buf, None)\n\n    def dispose(self):\n        pass\n\n    def get_head_size(self, buf, def_value):\n        if len(buf) < 2:\n            return def_value\n        head_type = ord(buf[0]) & 0x7\n        if head_type == 1:\n            return 7\n        if head_type == 4:\n            return 19\n        if head_type == 3:\n            return 4 + ord(buf[1])\n        return def_value\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/obfsplugin/verify.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2015-2015 breakwa11\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport os\nimport sys\nimport hashlib\nimport logging\nimport binascii\nimport base64\nimport time\nimport datetime\nimport random\nimport struct\nimport zlib\nimport hmac\nimport hashlib\n\nimport shadowsocks\nfrom shadowsocks import common\nfrom shadowsocks.obfsplugin import plain\nfrom shadowsocks.common import to_bytes, to_str, ord, chr\n\ndef create_verify_deflate(method):\n    return verify_deflate(method)\n\nobfs_map = {\n        'verify_deflate': (create_verify_deflate,),\n}\n\ndef match_begin(str1, str2):\n    if len(str1) >= len(str2):\n        if str1[:len(str2)] == str2:\n            return True\n    return False\n\nclass obfs_verify_data(object):\n    def __init__(self):\n        pass\n\nclass verify_base(plain.plain):\n    def __init__(self, method):\n        super(verify_base, self).__init__(method)\n        self.method = method\n\n    def init_data(self):\n        return obfs_verify_data()\n\n    def set_server_info(self, server_info):\n        self.server_info = server_info\n\n    def client_encode(self, buf):\n        return buf\n\n    def client_decode(self, buf):\n        return (buf, False)\n\n    def server_encode(self, buf):\n        return buf\n\n    def server_decode(self, buf):\n        return (buf, True, False)\n\nclass verify_deflate(verify_base):\n    def __init__(self, method):\n        super(verify_deflate, self).__init__(method)\n        self.recv_buf = b''\n        self.unit_len = 32700\n        self.decrypt_packet_num = 0\n        self.raw_trans = False\n\n    def pack_data(self, buf):\n        if len(buf) == 0:\n            return b''\n        data = zlib.compress(buf)\n        data = struct.pack('>H', len(data)) + data[2:]\n        return data\n\n    def client_pre_encrypt(self, buf):\n        ret = b''\n        while len(buf) > self.unit_len:\n            ret += self.pack_data(buf[:self.unit_len])\n            buf = buf[self.unit_len:]\n        ret += self.pack_data(buf)\n        return ret\n\n    def client_post_decrypt(self, buf):\n        if self.raw_trans:\n            return buf\n        self.recv_buf += buf\n        out_buf = b''\n        while len(self.recv_buf) > 2:\n            length = struct.unpack('>H', self.recv_buf[:2])[0]\n            if length >= 32768 or length < 6:\n                self.raw_trans = True\n                self.recv_buf = b''\n                raise Exception('client_post_decrypt data error')\n            if length > len(self.recv_buf):\n                break\n\n            out_buf += zlib.decompress(b'x\\x9c' + self.recv_buf[2:length])\n            self.recv_buf = self.recv_buf[length:]\n\n        if out_buf:\n            self.decrypt_packet_num += 1\n        return out_buf\n\n    def server_pre_encrypt(self, buf):\n        ret = b''\n        while len(buf) > self.unit_len:\n            ret += self.pack_data(buf[:self.unit_len])\n            buf = buf[self.unit_len:]\n        ret += self.pack_data(buf)\n        return ret\n\n    def server_post_decrypt(self, buf):\n        if self.raw_trans:\n            return (buf, False)\n        self.recv_buf += buf\n        out_buf = b''\n        while len(self.recv_buf) > 2:\n            length = struct.unpack('>H', self.recv_buf[:2])[0]\n            if length >= 32768 or length < 6:\n                self.raw_trans = True\n                self.recv_buf = b''\n                if self.decrypt_packet_num == 0:\n                    return (b'E'*2048, False)\n                else:\n                    raise Exception('server_post_decrype data error')\n            if length > len(self.recv_buf):\n                break\n\n            out_buf += zlib.decompress(b'\\x78\\x9c' + self.recv_buf[2:length])\n            self.recv_buf = self.recv_buf[length:]\n\n        if out_buf:\n            self.decrypt_packet_num += 1\n        return (out_buf, False)\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/ordereddict.py",
    "content": "import collections\n\n################################################################################\n### OrderedDict\n################################################################################\n\nclass OrderedDict(dict):\n    'Dictionary that remembers insertion order'\n    # An inherited dict maps keys to values.\n    # The inherited dict provides __getitem__, __len__, __contains__, and get.\n    # The remaining methods are order-aware.\n    # Big-O running times for all methods are the same as regular dictionaries.\n\n    # The internal self.__map dict maps keys to links in a doubly linked list.\n    # The circular doubly linked list starts and ends with a sentinel element.\n    # The sentinel element never gets deleted (this simplifies the algorithm).\n    # Each link is stored as a list of length three:  [PREV, NEXT, KEY].\n\n    def __init__(*args, **kwds):\n        '''Initialize an ordered dictionary.  The signature is the same as\n        regular dictionaries, but keyword arguments are not recommended because\n        their insertion order is arbitrary.\n\n        '''\n        if not args:\n            raise TypeError(\"descriptor '__init__' of 'OrderedDict' object \"\n                            \"needs an argument\")\n        self = args[0]\n        args = args[1:]\n        if len(args) > 1:\n            raise TypeError('expected at most 1 arguments, got %d' % len(args))\n        try:\n            self.__root\n        except AttributeError:\n            self.__root = root = []                     # sentinel node\n            root[:] = [root, root, None]\n            self.__map = {}\n        self.__update(*args, **kwds)\n\n    def __setitem__(self, key, value, dict_setitem=dict.__setitem__):\n        'od.__setitem__(i, y) <==> od[i]=y'\n        # Setting a new item creates a new link at the end of the linked list,\n        # and the inherited dictionary is updated with the new key/value pair.\n        if key not in self:\n            root = self.__root\n            last = root[0]\n            last[1] = root[0] = self.__map[key] = [last, root, key]\n        return dict_setitem(self, key, value)\n\n    def __delitem__(self, key, dict_delitem=dict.__delitem__):\n        'od.__delitem__(y) <==> del od[y]'\n        # Deleting an existing item uses self.__map to find the link which gets\n        # removed by updating the links in the predecessor and successor nodes.\n        dict_delitem(self, key)\n        link_prev, link_next, _ = self.__map.pop(key)\n        link_prev[1] = link_next                        # update link_prev[NEXT]\n        link_next[0] = link_prev                        # update link_next[PREV]\n\n    def __iter__(self):\n        'od.__iter__() <==> iter(od)'\n        # Traverse the linked list in order.\n        root = self.__root\n        curr = root[1]                                  # start at the first node\n        while curr is not root:\n            yield curr[2]                               # yield the curr[KEY]\n            curr = curr[1]                              # move to next node\n\n    def __reversed__(self):\n        'od.__reversed__() <==> reversed(od)'\n        # Traverse the linked list in reverse order.\n        root = self.__root\n        curr = root[0]                                  # start at the last node\n        while curr is not root:\n            yield curr[2]                               # yield the curr[KEY]\n            curr = curr[0]                              # move to previous node\n\n    def clear(self):\n        'od.clear() -> None.  Remove all items from od.'\n        root = self.__root\n        root[:] = [root, root, None]\n        self.__map.clear()\n        dict.clear(self)\n\n    # -- the following methods do not depend on the internal structure --\n\n    def keys(self):\n        'od.keys() -> list of keys in od'\n        return list(self)\n\n    def values(self):\n        'od.values() -> list of values in od'\n        return [self[key] for key in self]\n\n    def items(self):\n        'od.items() -> list of (key, value) pairs in od'\n        return [(key, self[key]) for key in self]\n\n    def iterkeys(self):\n        'od.iterkeys() -> an iterator over the keys in od'\n        return iter(self)\n\n    def itervalues(self):\n        'od.itervalues -> an iterator over the values in od'\n        for k in self:\n            yield self[k]\n\n    def iteritems(self):\n        'od.iteritems -> an iterator over the (key, value) pairs in od'\n        for k in self:\n            yield (k, self[k])\n\n    update = collections.abc.MutableMapping.update\n\n    __update = update # let subclasses override update without breaking __init__\n\n    __marker = object()\n\n    def pop(self, key, default=__marker):\n        '''od.pop(k[,d]) -> v, remove specified key and return the corresponding\n        value.  If key is not found, d is returned if given, otherwise KeyError\n        is raised.\n\n        '''\n        if key in self:\n            result = self[key]\n            del self[key]\n            return result\n        if default is self.__marker:\n            raise KeyError(key)\n        return default\n\n    def setdefault(self, key, default=None):\n        'od.setdefault(k[,d]) -> od.get(k,d), also set od[k]=d if k not in od'\n        if key in self:\n            return self[key]\n        self[key] = default\n        return default\n\n    def popitem(self, last=True):\n        '''od.popitem() -> (k, v), return and remove a (key, value) pair.\n        Pairs are returned in LIFO order if last is true or FIFO order if false.\n\n        '''\n        if not self:\n            raise KeyError('dictionary is empty')\n        key = next(reversed(self) if last else iter(self))\n        value = self.pop(key)\n        return key, value\n\n    def __repr__(self, _repr_running={}):\n        'od.__repr__() <==> repr(od)'\n        call_key = id(self), _get_ident()\n        if call_key in _repr_running:\n            return '...'\n        _repr_running[call_key] = 1\n        try:\n            if not self:\n                return '%s()' % (self.__class__.__name__,)\n            return '%s(%r)' % (self.__class__.__name__, self.items())\n        finally:\n            del _repr_running[call_key]\n\n    def __reduce__(self):\n        'Return state information for pickling'\n        items = [[k, self[k]] for k in self]\n        inst_dict = vars(self).copy()\n        for k in vars(OrderedDict()):\n            inst_dict.pop(k, None)\n        if inst_dict:\n            return (self.__class__, (items,), inst_dict)\n        return self.__class__, (items,)\n\n    def copy(self):\n        'od.copy() -> a shallow copy of od'\n        return self.__class__(self)\n\n    @classmethod\n    def fromkeys(cls, iterable, value=None):\n        '''OD.fromkeys(S[, v]) -> New ordered dictionary with keys from S.\n        If not specified, the value defaults to None.\n\n        '''\n        self = cls()\n        for key in iterable:\n            self[key] = value\n        return self\n\n    def __eq__(self, other):\n        '''od.__eq__(y) <==> od==y.  Comparison to another OD is order-sensitive\n        while comparison to a regular mapping is order-insensitive.\n\n        '''\n        if isinstance(other, OrderedDict):\n            return dict.__eq__(self, other) and all(_imap(_eq, self, other))\n        return dict.__eq__(self, other)\n\n    def __ne__(self, other):\n        'od.__ne__(y) <==> od!=y'\n        return not self == other\n\n    # -- the following methods support python 3.x style dictionary views --\n\n    def viewkeys(self):\n        \"od.viewkeys() -> a set-like object providing a view on od's keys\"\n        return KeysView(self)\n\n    def viewvalues(self):\n        \"od.viewvalues() -> an object providing a view on od's values\"\n        return ValuesView(self)\n\n    def viewitems(self):\n        \"od.viewitems() -> a set-like object providing a view on od's items\"\n        return ItemsView(self)\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/run.sh",
    "content": "#!/bin/bash\ncd `dirname $0`\neval $(ps -ef | grep \"[0-9] python server\\\\.py a\" | awk '{print \"kill \"$2}')\nulimit -n 512000\nnohup python server.py a >> /dev/null 2>&1 &\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/server.py",
    "content": "#!/usr/bin/env python\n# -*- coding: utf-8 -*-\n#\n# Copyright 2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport sys\nimport os\nimport logging\nimport signal\n\nif __name__ == '__main__':\n    import inspect\n    file_path = os.path.dirname(os.path.realpath(inspect.getfile(inspect.currentframe())))\n    sys.path.insert(0, os.path.join(file_path, '../'))\n\nfrom shadowsocks import shell, daemon, eventloop, tcprelay, udprelay, \\\n    asyncdns, manager, common\n\n\ndef main():\n    shell.check_python()\n\n    config = shell.get_config(False)\n\n    shell.log_shadowsocks_version()\n\n    daemon.daemon_exec(config)\n\n    try:\n        import resource\n        logging.info('current process RLIMIT_NOFILE resource: soft %d hard %d'  % resource.getrlimit(resource.RLIMIT_NOFILE))\n    except ImportError:\n        pass\n\n    if config['port_password']:\n        pass\n    else:\n        config['port_password'] = {}\n        server_port = config['server_port']\n        if type(server_port) == list:\n            for a_server_port in server_port:\n                config['port_password'][a_server_port] = config['password']\n        else:\n            config['port_password'][str(server_port)] = config['password']\n\n    if not config.get('dns_ipv6', False):\n        asyncdns.IPV6_CONNECTION_SUPPORT = False\n\n    if config.get('manager_address', 0):\n        logging.info('entering manager mode')\n        manager.run(config)\n        return\n\n    tcp_servers = []\n    udp_servers = []\n    dns_resolver = asyncdns.DNSResolver()\n    if int(config['workers']) > 1:\n        stat_counter_dict = None\n    else:\n        stat_counter_dict = {}\n    port_password = config['port_password']\n    config_password = config.get('password', 'm')\n    del config['port_password']\n    for port, password_obfs in port_password.items():\n        method = config[\"method\"]\n        protocol = config.get(\"protocol\", 'origin')\n        protocol_param = config.get(\"protocol_param\", '')\n        obfs = config.get(\"obfs\", 'plain')\n        obfs_param = config.get(\"obfs_param\", '')\n        bind = config.get(\"out_bind\", '')\n        bindv6 = config.get(\"out_bindv6\", '')\n        if type(password_obfs) == list:\n            password = password_obfs[0]\n            obfs = common.to_str(password_obfs[1])\n            if len(password_obfs) > 2:\n                protocol = common.to_str(password_obfs[2])\n        elif type(password_obfs) == dict:\n            password = password_obfs.get('password', config_password)\n            method = common.to_str(password_obfs.get('method', method))\n            protocol = common.to_str(password_obfs.get('protocol', protocol))\n            protocol_param = common.to_str(password_obfs.get('protocol_param', protocol_param))\n            obfs = common.to_str(password_obfs.get('obfs', obfs))\n            obfs_param = common.to_str(password_obfs.get('obfs_param', obfs_param))\n            bind = password_obfs.get('out_bind', bind)\n            bindv6 = password_obfs.get('out_bindv6', bindv6)\n        else:\n            password = password_obfs\n        a_config = config.copy()\n        ipv6_ok = False\n        logging.info(\"server start with protocol[%s] password [%s] method [%s] obfs [%s] obfs_param [%s]\" %\n                (protocol, password, method, obfs, obfs_param))\n        if 'server_ipv6' in a_config:\n            try:\n                if len(a_config['server_ipv6']) > 2 and a_config['server_ipv6'][0] == \"[\" and a_config['server_ipv6'][-1] == \"]\":\n                    a_config['server_ipv6'] = a_config['server_ipv6'][1:-1]\n                a_config['server_port'] = int(port)\n                a_config['password'] = password\n                a_config['method'] = method\n                a_config['protocol'] = protocol\n                a_config['protocol_param'] = protocol_param\n                a_config['obfs'] = obfs\n                a_config['obfs_param'] = obfs_param\n                a_config['out_bind'] = bind\n                a_config['out_bindv6'] = bindv6\n                a_config['server'] = a_config['server_ipv6']\n                logging.info(\"starting server at [%s]:%d\" %\n                             (a_config['server'], int(port)))\n                tcp_servers.append(tcprelay.TCPRelay(a_config, dns_resolver, False, stat_counter=stat_counter_dict))\n                udp_servers.append(udprelay.UDPRelay(a_config, dns_resolver, False, stat_counter=stat_counter_dict))\n                if a_config['server_ipv6'] == b\"::\":\n                    ipv6_ok = True\n            except Exception as e:\n                shell.print_exception(e)\n\n        try:\n            a_config = config.copy()\n            a_config['server_port'] = int(port)\n            a_config['password'] = password\n            a_config['method'] = method\n            a_config['protocol'] = protocol\n            a_config['protocol_param'] = protocol_param\n            a_config['obfs'] = obfs\n            a_config['obfs_param'] = obfs_param\n            a_config['out_bind'] = bind\n            a_config['out_bindv6'] = bindv6\n            logging.info(\"starting server at %s:%d\" %\n                         (a_config['server'], int(port)))\n            tcp_servers.append(tcprelay.TCPRelay(a_config, dns_resolver, False, stat_counter=stat_counter_dict))\n            udp_servers.append(udprelay.UDPRelay(a_config, dns_resolver, False, stat_counter=stat_counter_dict))\n        except Exception as e:\n            if not ipv6_ok:\n                shell.print_exception(e)\n\n    def run_server():\n        def child_handler(signum, _):\n            logging.warn('received SIGQUIT, doing graceful shutting down..')\n            list(map(lambda s: s.close(next_tick=True),\n                     tcp_servers + udp_servers))\n        signal.signal(getattr(signal, 'SIGQUIT', signal.SIGTERM),\n                      child_handler)\n\n        def int_handler(signum, _):\n            sys.exit(1)\n        signal.signal(signal.SIGINT, int_handler)\n\n        try:\n            loop = eventloop.EventLoop()\n            dns_resolver.add_to_loop(loop)\n            list(map(lambda s: s.add_to_loop(loop), tcp_servers + udp_servers))\n\n            daemon.set_user(config.get('user', None))\n            loop.run()\n        except Exception as e:\n            shell.print_exception(e)\n            sys.exit(1)\n\n    if int(config['workers']) > 1:\n        if os.name == 'posix':\n            children = []\n            is_child = False\n            for i in range(0, int(config['workers'])):\n                r = os.fork()\n                if r == 0:\n                    logging.info('worker started')\n                    is_child = True\n                    run_server()\n                    break\n                else:\n                    children.append(r)\n            if not is_child:\n                def handler(signum, _):\n                    for pid in children:\n                        try:\n                            os.kill(pid, signum)\n                            os.waitpid(pid, 0)\n                        except OSError:  # child may already exited\n                            pass\n                    sys.exit()\n                signal.signal(signal.SIGTERM, handler)\n                signal.signal(signal.SIGQUIT, handler)\n                signal.signal(signal.SIGINT, handler)\n\n                # master\n                for a_tcp_server in tcp_servers:\n                    a_tcp_server.close()\n                for a_udp_server in udp_servers:\n                    a_udp_server.close()\n                dns_resolver.close()\n\n                for child in children:\n                    os.waitpid(child, 0)\n        else:\n            logging.warn('worker is only available on Unix/Linux')\n            run_server()\n    else:\n        run_server()\n\n\nif __name__ == '__main__':\n    main()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/shell.py",
    "content": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n#\n# Copyright 2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport os\nimport json\nimport sys\nimport getopt\nimport logging\nfrom shadowsocks.common import to_bytes, to_str, IPNetwork, PortRange\nfrom shadowsocks import encrypt\n\n\nVERBOSE_LEVEL = 5\n\nverbose = 0\n\n\ndef check_python():\n    info = sys.version_info\n    if info[0] == 2 and not info[1] >= 6:\n        print('Python 2.6+ required')\n        sys.exit(1)\n    elif info[0] == 3 and not info[1] >= 3:\n        print('Python 3.3+ required')\n        sys.exit(1)\n    elif info[0] not in [2, 3]:\n        print('Python version not supported')\n        sys.exit(1)\n\n\ndef print_exception(e):\n    global verbose\n    logging.error(e)\n    if verbose > 0:\n        import traceback\n        traceback.print_exc()\n\ndef __version():\n    version_str = ''\n    try:\n        import pkg_resources\n        version_str = pkg_resources.get_distribution('shadowsocks').version\n    except Exception:\n        try:\n            from shadowsocks import version\n            version_str = version.version()\n        except Exception:\n            pass\n    return version_str\n\ndef print_shadowsocks():\n    print('ShadowsocksR %s' % __version())\n\ndef log_shadowsocks_version():\n    logging.info('ShadowsocksR %s' % __version())\n\n\ndef find_config():\n    user_config_path = 'user-config.json'\n    config_path = 'config.json'\n\n    def sub_find(file_name):\n        if os.path.exists(file_name):\n            return file_name\n        file_name = os.path.join(os.path.abspath('..'), file_name)\n        return file_name if os.path.exists(file_name) else None\n\n    return sub_find(user_config_path) or sub_find(config_path)\n\ndef check_config(config, is_local):\n    if config.get('daemon', None) == 'stop':\n        # no need to specify configuration for daemon stop\n        return\n\n    if is_local and not config.get('password', None):\n        logging.error('password not specified')\n        print_help(is_local)\n        sys.exit(2)\n\n    if not is_local and not config.get('password', None) \\\n            and not config.get('port_password', None):\n        logging.error('password or port_password not specified')\n        print_help(is_local)\n        sys.exit(2)\n\n    if 'local_port' in config:\n        config['local_port'] = int(config['local_port'])\n\n    if 'server_port' in config and type(config['server_port']) != list:\n        config['server_port'] = int(config['server_port'])\n\n    if config.get('local_address', '') in [b'0.0.0.0']:\n        logging.warning('warning: local set to listen on 0.0.0.0, it\\'s not safe')\n    if config.get('server', '') in ['127.0.0.1', 'localhost']:\n        logging.warning('warning: server set to listen on %s:%s, are you sure?' %\n                     (to_str(config['server']), config['server_port']))\n    if config.get('timeout', 300) < 100:\n        logging.warning('warning: your timeout %d seems too short' %\n                     int(config.get('timeout')))\n    if config.get('timeout', 300) > 600:\n        logging.warning('warning: your timeout %d seems too long' %\n                     int(config.get('timeout')))\n    if config.get('password') in [b'mypassword']:\n        logging.error('DON\\'T USE DEFAULT PASSWORD! Please change it in your '\n                      'config.json!')\n        sys.exit(1)\n    if config.get('user', None) is not None:\n        if os.name != 'posix':\n            logging.error('user can be used only on Unix')\n            sys.exit(1)\n\n    encrypt.try_cipher(config['password'], config['method'])\n\n\ndef get_config(is_local):\n    global verbose\n    config = {}\n    config_path = None\n    logging.basicConfig(level=logging.INFO,\n                        format='%(levelname)-s: %(message)s')\n    if is_local:\n        shortopts = 'hd:s:b:p:k:l:m:O:o:G:g:c:t:vq'\n        longopts = ['help', 'fast-open', 'pid-file=', 'log-file=', 'user=',\n                    'version']\n    else:\n        shortopts = 'hd:s:p:k:m:O:o:G:g:c:t:vq'\n        longopts = ['help', 'fast-open', 'pid-file=', 'log-file=', 'workers=',\n                    'forbidden-ip=', 'user=', 'manager-address=', 'version']\n    try:\n        optlist, args = getopt.getopt(sys.argv[1:], shortopts, longopts)\n        for key, value in optlist:\n            if key == '-c':\n                config_path = value\n            elif key in ('-h', '--help'):\n                print_help(is_local)\n                sys.exit(0)\n            elif key == '--version':\n                print_shadowsocks()\n                sys.exit(0)\n            else:\n                continue\n\n        if config_path is None:\n            config_path = find_config()\n\n\n        if config_path:\n            logging.debug('loading config from %s' % config_path)\n            with open(config_path, 'rb') as f:\n                try:\n                    config = parse_json_in_str(remove_comment(f.read().decode('utf8')))\n                except ValueError as e:\n                    logging.error('found an error in config.json: %s', str(e))\n                    sys.exit(1)\n\n\n        v_count = 0\n        for key, value in optlist:\n            if key == '-p':\n                config['server_port'] = int(value)\n            elif key == '-k':\n                config['password'] = to_bytes(value)\n            elif key == '-l':\n                config['local_port'] = int(value)\n            elif key == '-s':\n                config['server'] = to_str(value)\n            elif key == '-m':\n                config['method'] = to_str(value)\n            elif key == '-O':\n                config['protocol'] = to_str(value)\n            elif key == '-o':\n                config['obfs'] = to_str(value)\n            elif key == '-G':\n                config['protocol_param'] = to_str(value)\n            elif key == '-g':\n                config['obfs_param'] = to_str(value)\n            elif key == '-b':\n                config['local_address'] = to_str(value)\n            elif key == '-v':\n                v_count += 1\n                # '-vv' turns on more verbose mode\n                config['verbose'] = v_count\n            elif key == '-t':\n                config['timeout'] = int(value)\n            elif key == '--fast-open':\n                config['fast_open'] = True\n            elif key == '--workers':\n                config['workers'] = int(value)\n            elif key == '--manager-address':\n                config['manager_address'] = value\n            elif key == '--user':\n                config['user'] = to_str(value)\n            elif key == '--forbidden-ip':\n                config['forbidden_ip'] = to_str(value)\n\n            elif key == '-d':\n                config['daemon'] = to_str(value)\n            elif key == '--pid-file':\n                config['pid-file'] = to_str(value)\n            elif key == '--log-file':\n                config['log-file'] = to_str(value)\n            elif key == '-q':\n                v_count -= 1\n                config['verbose'] = v_count\n            else:\n                continue\n    except getopt.GetoptError as e:\n        print(e, file=sys.stderr)\n        print_help(is_local)\n        sys.exit(2)\n\n    if not config:\n        logging.error('config not specified')\n        print_help(is_local)\n        sys.exit(2)\n\n    config['password'] = to_bytes(config.get('password', b''))\n    config['method'] = to_str(config.get('method', 'aes-256-cfb'))\n    config['protocol'] = to_str(config.get('protocol', 'origin'))\n    config['protocol_param'] = to_str(config.get('protocol_param', ''))\n    config['obfs'] = to_str(config.get('obfs', 'plain'))\n    config['obfs_param'] = to_str(config.get('obfs_param', ''))\n    config['port_password'] = config.get('port_password', None)\n    config['additional_ports'] = config.get('additional_ports', {})\n    config['additional_ports_only'] = config.get('additional_ports_only', False)\n    config['timeout'] = int(config.get('timeout', 300))\n    config['udp_timeout'] = int(config.get('udp_timeout', 120))\n    config['udp_cache'] = int(config.get('udp_cache', 64))\n    config['fast_open'] = config.get('fast_open', False)\n    config['workers'] = config.get('workers', 1)\n    config['pid-file'] = config.get('pid-file', '/var/run/shadowsocksr.pid')\n    config['log-file'] = config.get('log-file', '/var/log/shadowsocksr.log')\n    config['verbose'] = config.get('verbose', False)\n    config['connect_verbose_info'] = config.get('connect_verbose_info', 0)\n    config['local_address'] = to_str(config.get('local_address', '127.0.0.1'))\n    config['local_port'] = config.get('local_port', 1080)\n    if is_local:\n        if config.get('server', None) is None:\n            logging.error('server addr not specified')\n            print_local_help()\n            sys.exit(2)\n        else:\n            config['server'] = to_str(config['server'])\n    else:\n        config['server'] = to_str(config.get('server', '0.0.0.0'))\n        try:\n            config['forbidden_ip'] = \\\n                IPNetwork(config.get('forbidden_ip', '127.0.0.0/8,::1/128'))\n        except Exception as e:\n            logging.error(e)\n            sys.exit(2)\n        try:\n            config['forbidden_port'] = PortRange(config.get('forbidden_port', ''))\n        except Exception as e:\n            logging.error(e)\n            sys.exit(2)\n        try:\n            config['ignore_bind'] = \\\n                IPNetwork(config.get('ignore_bind', '127.0.0.0/8,::1/128,10.0.0.0/8,192.168.0.0/16'))\n        except Exception as e:\n            logging.error(e)\n            sys.exit(2)\n    config['server_port'] = config.get('server_port', 8388)\n\n    logging.getLogger('').handlers = []\n    logging.addLevelName(VERBOSE_LEVEL, 'VERBOSE')\n    if config['verbose'] >= 2:\n        level = VERBOSE_LEVEL\n    elif config['verbose'] == 1:\n        level = logging.DEBUG\n    elif config['verbose'] == -1:\n        level = logging.WARN\n    elif config['verbose'] <= -2:\n        level = logging.ERROR\n    else:\n        level = logging.INFO\n    verbose = config['verbose']\n    logging.basicConfig(level=level,\n                        format='%(asctime)s %(levelname)-8s %(filename)s:%(lineno)s %(message)s',\n                        datefmt='%Y-%m-%d %H:%M:%S')\n\n    check_config(config, is_local)\n\n    return config\n\n\ndef print_help(is_local):\n    if is_local:\n        print_local_help()\n    else:\n        print_server_help()\n\n\ndef print_local_help():\n    print('''usage: sslocal [OPTION]...\nA fast tunnel proxy that helps you bypass firewalls.\n\nYou can supply configurations via either config file or command line arguments.\n\nProxy options:\n  -c CONFIG              path to config file\n  -s SERVER_ADDR         server address\n  -p SERVER_PORT         server port, default: 8388\n  -b LOCAL_ADDR          local binding address, default: 127.0.0.1\n  -l LOCAL_PORT          local port, default: 1080\n  -k PASSWORD            password\n  -m METHOD              encryption method, default: aes-256-cfb\n  -o OBFS                obfsplugin, default: http_simple\n  -t TIMEOUT             timeout in seconds, default: 300\n  --fast-open            use TCP_FASTOPEN, requires Linux 3.7+\n\nGeneral options:\n  -h, --help             show this help message and exit\n  -d start/stop/restart  daemon mode\n  --pid-file PID_FILE    pid file for daemon mode\n  --log-file LOG_FILE    log file for daemon mode\n  --user USER            username to run as\n  -v, -vv                verbose mode\n  -q, -qq                quiet mode, only show warnings/errors\n  --version              show version information\n\nOnline help: <https://github.com/shadowsocks/shadowsocks>\n''')\n\n\ndef print_server_help():\n    print('''usage: ssserver [OPTION]...\nA fast tunnel proxy that helps you bypass firewalls.\n\nYou can supply configurations via either config file or command line arguments.\n\nProxy options:\n  -c CONFIG              path to config file\n  -s SERVER_ADDR         server address, default: 0.0.0.0\n  -p SERVER_PORT         server port, default: 8388\n  -k PASSWORD            password\n  -m METHOD              encryption method, default: aes-256-cfb\n  -o OBFS                obfsplugin, default: http_simple\n  -t TIMEOUT             timeout in seconds, default: 300\n  --fast-open            use TCP_FASTOPEN, requires Linux 3.7+\n  --workers WORKERS      number of workers, available on Unix/Linux\n  --forbidden-ip IPLIST  comma seperated IP list forbidden to connect\n  --manager-address ADDR optional server manager UDP address, see wiki\n\nGeneral options:\n  -h, --help             show this help message and exit\n  -d start/stop/restart  daemon mode\n  --pid-file PID_FILE    pid file for daemon mode\n  --log-file LOG_FILE    log file for daemon mode\n  --user USER            username to run as\n  -v, -vv                verbose mode\n  -q, -qq                quiet mode, only show warnings/errors\n  --version              show version information\n\nOnline help: <https://github.com/shadowsocks/shadowsocks>\n''')\n\n\ndef _decode_list(data):\n    rv = []\n    for item in data:\n        if hasattr(item, 'encode'):\n            item = item.encode('utf-8')\n        elif isinstance(item, list):\n            item = _decode_list(item)\n        elif isinstance(item, dict):\n            item = _decode_dict(item)\n        rv.append(item)\n    return rv\n\n\ndef _decode_dict(data):\n    rv = {}\n    for key, value in data.items():\n        if hasattr(value, 'encode'):\n            value = value.encode('utf-8')\n        elif isinstance(value, list):\n            value = _decode_list(value)\n        elif isinstance(value, dict):\n            value = _decode_dict(value)\n        rv[key] = value\n    return rv\n\nclass JSFormat:\n    def __init__(self):\n        self.state = 0\n\n    def push(self, ch):\n        ch = ord(ch)\n        if self.state == 0:\n            if ch == ord('\"'):\n                self.state = 1\n                return to_str(chr(ch))\n            elif ch == ord('/'):\n                self.state = 3\n            else:\n                return to_str(chr(ch))\n        elif self.state == 1:\n            if ch == ord('\"'):\n                self.state = 0\n                return to_str(chr(ch))\n            elif ch == ord('\\\\'):\n                self.state = 2\n            return to_str(chr(ch))\n        elif self.state == 2:\n            self.state = 1\n            if ch == ord('\"'):\n                return to_str(chr(ch))\n            return \"\\\\\" + to_str(chr(ch))\n        elif self.state == 3:\n            if ch == ord('/'):\n                self.state = 4\n            else:\n                return \"/\" + to_str(chr(ch))\n        elif self.state == 4:\n            if ch == ord('\\n'):\n                self.state = 0\n                return \"\\n\"\n        return \"\"\n\ndef remove_comment(json):\n    fmt = JSFormat()\n    return \"\".join([fmt.push(c) for c in json])\n\n\ndef parse_json_in_str(data):\n    # parse json and convert everything from unicode to str\n    return json.loads(data, object_hook=_decode_dict)\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/stop.sh",
    "content": "#!/bin/bash\n\n#python_ver=$(ls /usr/bin|grep -e \"^python[23]\\.[1-9]\\+$\"|tail -1)\neval $(ps -ef | grep \"[0-9] python server\\\\.py a\" | awk '{print \"kill \"$2}')\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/tail.sh",
    "content": "#!/bin/bash\n\ntail -f ssserver.log\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/tcprelay.py",
    "content": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n#\n# Copyright 2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport time\nimport socket\nimport errno\nimport struct\nimport logging\nimport binascii\nimport traceback\nimport random\nimport platform\nimport threading\n\nfrom shadowsocks import encrypt, obfs, eventloop, shell, common, lru_cache, version\nfrom shadowsocks.common import pre_parse_header, parse_header\n\n# we clear at most TIMEOUTS_CLEAN_SIZE timeouts each time\nTIMEOUTS_CLEAN_SIZE = 512\n\nMSG_FASTOPEN = 0x20000000\n\n# SOCKS command definition\nCMD_CONNECT = 1\nCMD_BIND = 2\nCMD_UDP_ASSOCIATE = 3\n\n# for each opening port, we have a TCP Relay\n\n# for each connection, we have a TCP Relay Handler to handle the connection\n\n# for each handler, we have 2 sockets:\n#    local:   connected to the client\n#    remote:  connected to remote server\n\n# for each handler, it could be at one of several stages:\n\n# as sslocal:\n# stage 0 SOCKS hello received from local, send hello to local\n# stage 1 addr received from local, query DNS for remote\n# stage 2 UDP assoc\n# stage 3 DNS resolved, connect to remote\n# stage 4 still connecting, more data from local received\n# stage 5 remote connected, piping local and remote\n\n# as ssserver:\n# stage 0 just jump to stage 1\n# stage 1 addr received from local, query DNS for remote\n# stage 3 DNS resolved, connect to remote\n# stage 4 still connecting, more data from local received\n# stage 5 remote connected, piping local and remote\n\nSTAGE_INIT = 0\nSTAGE_ADDR = 1\nSTAGE_UDP_ASSOC = 2\nSTAGE_DNS = 3\nSTAGE_CONNECTING = 4\nSTAGE_STREAM = 5\nSTAGE_DESTROYED = -1\n\n# for each handler, we have 2 stream directions:\n#    upstream:    from client to server direction\n#                 read local and write to remote\n#    downstream:  from server to client direction\n#                 read remote and write to local\n\nSTREAM_UP = 0\nSTREAM_DOWN = 1\n\n# for each stream, it's waiting for reading, or writing, or both\nWAIT_STATUS_INIT = 0\nWAIT_STATUS_READING = 1\nWAIT_STATUS_WRITING = 2\nWAIT_STATUS_READWRITING = WAIT_STATUS_READING | WAIT_STATUS_WRITING\n\nNETWORK_MTU = 1500\nTCP_MSS = NETWORK_MTU - 40\nBUF_SIZE = 32 * 1024\nUDP_MAX_BUF_SIZE = 65536\n\nclass SpeedTester(object):\n    def __init__(self, max_speed = 0):\n        self.max_speed = max_speed * 1024\n        self.last_time = time.time()\n        self.sum_len = 0\n\n    def update_limit(self, max_speed):\n        self.max_speed = max_speed * 1024\n\n    def add(self, data_len):\n        if self.max_speed > 0:\n            cut_t = time.time()\n            self.sum_len -= (cut_t - self.last_time) * self.max_speed\n            if self.sum_len < 0:\n                self.sum_len = 0\n            self.last_time = cut_t\n            self.sum_len += data_len\n\n    def isExceed(self):\n        if self.max_speed > 0:\n            cut_t = time.time()\n            self.sum_len -= (cut_t - self.last_time) * self.max_speed\n            if self.sum_len < 0:\n                self.sum_len = 0\n            self.last_time = cut_t\n            return self.sum_len >= self.max_speed\n        return False\n\nclass TCPRelayHandler(object):\n    def __init__(self, server, fd_to_handlers, loop, local_sock, config,\n                 dns_resolver, is_local):\n        self._server = server\n        self._fd_to_handlers = fd_to_handlers\n        self._loop = loop\n        self._local_sock = local_sock\n        self._remote_sock = None\n        self._remote_sock_v6 = None\n        self._local_sock_fd = None\n        self._remote_sock_fd = None\n        self._remotev6_sock_fd = None\n        self._remote_udp = False\n        self._config = config\n        self._dns_resolver = dns_resolver\n        self._add_ref = 0\n        if not self._create_encryptor(config):\n            return\n\n        self._client_address = local_sock.getpeername()[:2]\n        self._accept_address = local_sock.getsockname()[:2]\n        self._user = None\n        self._user_id = server._listen_port\n        self._update_tcp_mss(local_sock)\n\n        # TCP Relay works as either sslocal or ssserver\n        # if is_local, this is sslocal\n        self._is_local = is_local\n        self._encrypt_correct = True\n        self._obfs = obfs.obfs(config['obfs'])\n        self._protocol = obfs.obfs(config['protocol'])\n        self._overhead = self._obfs.get_overhead(self._is_local) + self._protocol.get_overhead(self._is_local)\n        self._recv_buffer_size = BUF_SIZE - self._overhead\n\n        server_info = obfs.server_info(server.obfs_data)\n        server_info.host = config['server']\n        server_info.port = server._listen_port\n        #server_info.users = server.server_users\n        #server_info.update_user_func = self._update_user\n        server_info.client = self._client_address[0]\n        server_info.client_port = self._client_address[1]\n        server_info.protocol_param = ''\n        server_info.obfs_param = config['obfs_param']\n        server_info.iv = self._encryptor.cipher_iv\n        server_info.recv_iv = b''\n        server_info.key_str = common.to_bytes(config['password'])\n        server_info.key = self._encryptor.cipher_key\n        server_info.head_len = 30\n        server_info.tcp_mss = self._tcp_mss\n        server_info.buffer_size = self._recv_buffer_size\n        server_info.overhead = self._overhead\n        self._obfs.set_server_info(server_info)\n\n        server_info = obfs.server_info(server.protocol_data)\n        server_info.host = config['server']\n        server_info.port = server._listen_port\n        server_info.users = server.server_users\n        server_info.update_user_func = self._update_user\n        server_info.client = self._client_address[0]\n        server_info.client_port = self._client_address[1]\n        server_info.protocol_param = config['protocol_param']\n        server_info.obfs_param = ''\n        server_info.iv = self._encryptor.cipher_iv\n        server_info.recv_iv = b''\n        server_info.key_str = common.to_bytes(config['password'])\n        server_info.key = self._encryptor.cipher_key\n        server_info.head_len = 30\n        server_info.tcp_mss = self._tcp_mss\n        server_info.buffer_size = self._recv_buffer_size\n        server_info.overhead = self._overhead\n        self._protocol.set_server_info(server_info)\n\n        self._redir_list = config.get('redirect', [\"*#0.0.0.0:0\"])\n        self._is_redirect = False\n        self._bind = config.get('out_bind', '')\n        self._bindv6 = config.get('out_bindv6', '')\n        self._ignore_bind_list = config.get('ignore_bind', [])\n\n        self._fastopen_connected = False\n        self._data_to_write_to_local = []\n        self._data_to_write_to_remote = []\n        self._udp_data_send_buffer = b''\n        self._upstream_status = WAIT_STATUS_READING\n        self._downstream_status = WAIT_STATUS_INIT\n        self._remote_address = None\n\n        self._forbidden_iplist = config.get('forbidden_ip', None)\n        self._forbidden_portset = config.get('forbidden_port', None)\n        if is_local:\n            self._chosen_server = self._get_a_server()\n\n        self.last_activity = 0\n        self._update_activity()\n        self._server.add_connection(1)\n        self._server.stat_add(self._client_address[0], 1)\n        self._add_ref = 1\n        self.speed_tester_u = SpeedTester(config.get(\"speed_limit_per_con\", 0))\n        self.speed_tester_d = SpeedTester(config.get(\"speed_limit_per_con\", 0))\n        self._recv_u_max_size = BUF_SIZE\n        self._recv_d_max_size = BUF_SIZE\n        self._recv_pack_id = 0\n        self._udp_send_pack_id = 0\n        self._udpv6_send_pack_id = 0\n\n        local_sock.setblocking(False)\n        local_sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)\n        self._local_sock_fd = local_sock.fileno()\n        fd_to_handlers[self._local_sock_fd] = self\n        loop.add(local_sock, eventloop.POLL_IN | eventloop.POLL_ERR, self._server)\n        self._stage = STAGE_INIT\n\n    def __hash__(self):\n        # default __hash__ is id / 16\n        # we want to eliminate collisions\n        return id(self)\n\n    @property\n    def remote_address(self):\n        return self._remote_address\n\n    def _get_a_server(self):\n        server = self._config['server']\n        server_port = self._config['server_port']\n        if type(server_port) == list:\n            server_port = random.choice(server_port)\n        if type(server) == list:\n            server = random.choice(server)\n        logging.debug('chosen server: %s:%d', server, server_port)\n        return server, server_port\n\n    def _update_tcp_mss(self, local_sock):\n        self._tcp_mss = TCP_MSS\n        try:\n            tcp_mss = local_sock.getsockopt(socket.SOL_TCP, socket.TCP_MAXSEG)\n            if tcp_mss > 500 and tcp_mss <= 1500:\n                self._tcp_mss = tcp_mss\n            logging.debug(\"TCP MSS = %d\" % (self._tcp_mss,))\n        except:\n            pass\n\n    def _create_encryptor(self, config):\n        try:\n            self._encryptor = encrypt.Encryptor(config['password'],\n                                                config['method'])\n            return True\n        except Exception:\n            self._stage = STAGE_DESTROYED\n            logging.error('create encryptor fail at port %d', self._server._listen_port)\n\n    def _update_user(self, user):\n        self._user = user\n        self._user_id = struct.unpack('<I', user)[0]\n        if self._user in self._server.server_users_cfg:\n            cfg = self._server.server_users_cfg[self._user]\n            speed = cfg.get('speed_limit_per_con', 0)\n            self.speed_tester_u.update_limit(speed)\n            self.speed_tester_d.update_limit(speed)\n\n    def _update_activity(self, data_len=0):\n        # tell the TCP Relay we have activities recently\n        # else it will think we are inactive and timed out\n        self._server.update_activity(self, data_len)\n\n    def _update_stream(self, stream, status):\n        # update a stream to a new waiting status\n\n        # check if status is changed\n        # only update if dirty\n        dirty = False\n        if stream == STREAM_DOWN:\n            if self._downstream_status != status:\n                self._downstream_status = status\n                dirty = True\n        elif stream == STREAM_UP:\n            if self._upstream_status != status:\n                self._upstream_status = status\n                dirty = True\n        if dirty:\n            if self._local_sock:\n                event = eventloop.POLL_ERR\n                if self._downstream_status & WAIT_STATUS_WRITING:\n                    event |= eventloop.POLL_OUT\n                if self._upstream_status & WAIT_STATUS_READING:\n                    event |= eventloop.POLL_IN\n                self._loop.modify(self._local_sock, event)\n            if self._remote_sock:\n                event = eventloop.POLL_ERR\n                if self._downstream_status & WAIT_STATUS_READING:\n                    event |= eventloop.POLL_IN\n                if self._upstream_status & WAIT_STATUS_WRITING:\n                    event |= eventloop.POLL_OUT\n                self._loop.modify(self._remote_sock, event)\n                if self._remote_sock_v6:\n                    self._loop.modify(self._remote_sock_v6, event)\n\n    def _write_to_sock(self, data, sock):\n        # write data to sock\n        # if only some of the data are written, put remaining in the buffer\n        # and update the stream to wait for writing\n        if not sock:\n            return False\n        uncomplete = False\n        if self._remote_udp and sock == self._remote_sock:\n            try:\n                self._udp_data_send_buffer += data\n                #logging.info('UDP over TCP sendto %d %s' % (len(data), binascii.hexlify(data)))\n                while len(self._udp_data_send_buffer) > 6:\n                    length = struct.unpack('>H', self._udp_data_send_buffer[:2])[0]\n\n                    if length > len(self._udp_data_send_buffer):\n                        break\n\n                    data = self._udp_data_send_buffer[:length]\n                    self._udp_data_send_buffer = self._udp_data_send_buffer[length:]\n\n                    frag = common.ord(data[2])\n                    if frag != 0:\n                        logging.warn('drop a message since frag is %d' % (frag,))\n                        continue\n                    else:\n                        data = data[3:]\n                    header_result = parse_header(data)\n                    if header_result is None:\n                        continue\n                    connecttype, addrtype, dest_addr, dest_port, header_length = header_result\n                    if (addrtype & 7) == 3:\n                        af = common.is_ip(dest_addr)\n                        if af == False:\n                            handler = common.UDPAsyncDNSHandler(data[header_length:])\n                            handler.resolve(self._dns_resolver, (dest_addr, dest_port), self._handle_server_dns_resolved)\n                        else:\n                            return self._handle_server_dns_resolved(\"\", (dest_addr, dest_port), dest_addr, data[header_length:])\n                    else:\n                        return self._handle_server_dns_resolved(\"\", (dest_addr, dest_port), dest_addr, data[header_length:])\n\n            except Exception as e:\n                #trace = traceback.format_exc()\n                #logging.error(trace)\n                error_no = eventloop.errno_from_exception(e)\n                if error_no in (errno.EAGAIN, errno.EINPROGRESS,\n                                errno.EWOULDBLOCK):\n                    uncomplete = True\n                else:\n                    shell.print_exception(e)\n                    logging.error(\"exception from %s:%d\" % (self._client_address[0], self._client_address[1]))\n                    self.destroy()\n                    return False\n            return True\n        else:\n            try:\n                if self._encrypt_correct:\n                    if sock == self._remote_sock:\n                        self._server.add_transfer_u(self._user, len(data))\n                self._update_activity(len(data))\n                if data:\n                    l = len(data)\n                    s = sock.send(data)\n                    if s < l:\n                        data = data[s:]\n                        uncomplete = True\n                else:\n                    return\n            except (OSError, IOError) as e:\n                error_no = eventloop.errno_from_exception(e)\n                if error_no in (errno.EAGAIN, errno.EINPROGRESS,\n                                errno.EWOULDBLOCK):\n                    uncomplete = True\n                else:\n                    #traceback.print_exc()\n                    shell.print_exception(e)\n                    logging.error(\"exception from %s:%d\" % (self._client_address[0], self._client_address[1]))\n                    self.destroy()\n                    return False\n            except Exception as e:\n                shell.print_exception(e)\n                logging.error(\"exception from %s:%d\" % (self._client_address[0], self._client_address[1]))\n                self.destroy()\n                return False\n        if uncomplete:\n            if sock == self._local_sock:\n                self._data_to_write_to_local.append(data)\n                self._update_stream(STREAM_DOWN, WAIT_STATUS_WRITING)\n            elif sock == self._remote_sock:\n                self._data_to_write_to_remote.append(data)\n                self._update_stream(STREAM_UP, WAIT_STATUS_WRITING)\n            else:\n                logging.error('write_all_to_sock:unknown socket from %s:%d' % (self._client_address[0], self._client_address[1]))\n        else:\n            if sock == self._local_sock:\n                self._update_stream(STREAM_DOWN, WAIT_STATUS_READING)\n            elif sock == self._remote_sock:\n                self._update_stream(STREAM_UP, WAIT_STATUS_READING)\n            else:\n                logging.error('write_all_to_sock:unknown socket from %s:%d' % (self._client_address[0], self._client_address[1]))\n        return True\n\n    def _handle_server_dns_resolved(self, error, remote_addr, server_addr, data):\n        if error:\n            return\n        try:\n            addrs = socket.getaddrinfo(server_addr, remote_addr[1], 0, socket.SOCK_DGRAM, socket.SOL_UDP)\n            if not addrs: # drop\n                return\n            af, socktype, proto, canonname, sa = addrs[0]\n            if af == socket.AF_INET6:\n                self._remote_sock_v6.sendto(data, (server_addr, remote_addr[1]))\n                if self._udpv6_send_pack_id == 0:\n                    addr, port = self._remote_sock_v6.getsockname()[:2]\n                    common.connect_log('UDPv6 sendto %s(%s):%d from %s:%d by user %d' %\n                        (common.to_str(remote_addr[0]), common.to_str(server_addr), remote_addr[1], addr, port, self._user_id))\n                self._udpv6_send_pack_id += 1\n            else:\n                self._remote_sock.sendto(data, (server_addr, remote_addr[1]))\n                if self._udp_send_pack_id == 0:\n                    addr, port = self._remote_sock.getsockname()[:2]\n                    common.connect_log('UDP sendto %s(%s):%d from %s:%d by user %d' %\n                        (common.to_str(remote_addr[0]), common.to_str(server_addr), remote_addr[1], addr, port, self._user_id))\n                self._udp_send_pack_id += 1\n            return True\n        except Exception as e:\n            shell.print_exception(e)\n            logging.error(\"exception from %s:%d\" % (self._client_address[0], self._client_address[1]))\n\n    def _get_redirect_host(self, client_address, ogn_data):\n        host_list = self._redir_list or [\"*#0.0.0.0:0\"]\n\n        if type(host_list) != list:\n            host_list = [host_list]\n\n        items_sum = common.to_str(host_list[0]).rsplit('#', 1)\n        if len(items_sum) < 2:\n            hash_code = binascii.crc32(ogn_data)\n            addrs = socket.getaddrinfo(client_address[0], client_address[1], 0, socket.SOCK_STREAM, socket.SOL_TCP)\n            af, socktype, proto, canonname, sa = addrs[0]\n            address_bytes = common.inet_pton(af, sa[0])\n            if af == socket.AF_INET6:\n                addr = struct.unpack('>Q', address_bytes[8:])[0]\n            elif af == socket.AF_INET:\n                addr = struct.unpack('>I', address_bytes)[0]\n            else:\n                addr = 0\n\n            host_port = []\n            match_port = False\n            for host in host_list:\n                items = common.to_str(host).rsplit(':', 1)\n                if len(items) > 1:\n                    try:\n                        port = int(items[1])\n                        if port == self._server._listen_port:\n                            match_port = True\n                        host_port.append((items[0], port))\n                    except:\n                        pass\n                else:\n                    host_port.append((host, 80))\n\n            if match_port:\n                last_host_port = host_port\n                host_port = []\n                for host in last_host_port:\n                    if host[1] == self._server._listen_port:\n                        host_port.append(host)\n\n            return host_port[((hash_code & 0xffffffff) + addr) % len(host_port)]\n\n        else:\n            host_port = []\n            for host in host_list:\n                items_sum = common.to_str(host).rsplit('#', 1)\n                items_match = common.to_str(items_sum[0]).rsplit(':', 1)\n                items = common.to_str(items_sum[1]).rsplit(':', 1)\n                if len(items_match) > 1:\n                    if items_match[1] != \"*\":\n                        try:\n                            if self._server._listen_port != int(items_match[1]) and int(items_match[1]) != 0:\n                                continue\n                        except:\n                            pass\n\n                if items_match[0] != \"*\" and common.match_regex(\n                        items_match[0], ogn_data) == False:\n                    continue\n                if len(items) > 1:\n                    try:\n                        port = int(items[1])\n                        return (items[0], port)\n                    except:\n                        pass\n                else:\n                    return (items[0], 80)\n\n            return (\"0.0.0.0\", 0)\n\n    def _handel_protocol_error(self, client_address, ogn_data):\n        logging.warn(\"Protocol ERROR, TCP ogn data %s from %s:%d via port %d by UID %d\" % (binascii.hexlify(ogn_data), client_address[0], client_address[1], self._server._listen_port, self._user_id))\n        self._encrypt_correct = False\n        #create redirect or disconnect by hash code\n        host, port = self._get_redirect_host(client_address, ogn_data)\n        if port == 0:\n            raise Exception('can not parse header')\n        data = b\"\\x03\" + common.to_bytes(common.chr(len(host))) + common.to_bytes(host) + struct.pack('>H', port)\n        self._is_redirect = True\n        logging.warn(\"TCP data redir %s:%d %s\" % (host, port, binascii.hexlify(data)))\n        return data + ogn_data\n\n    def _handle_stage_connecting(self, data):\n        if self._is_local:\n            if self._encryptor is not None:\n                data = self._protocol.client_pre_encrypt(data)\n                data = self._encryptor.encrypt(data)\n                data = self._obfs.client_encode(data)\n        if data:\n            self._data_to_write_to_remote.append(data)\n        if self._is_local and not self._fastopen_connected and \\\n                self._config['fast_open']:\n            # for sslocal and fastopen, we basically wait for data and use\n            # sendto to connect\n            try:\n                # only connect once\n                self._fastopen_connected = True\n                remote_sock = \\\n                    self._create_remote_socket(self._chosen_server[0],\n                                               self._chosen_server[1])\n                self._loop.add(remote_sock, eventloop.POLL_ERR, self._server)\n                data = b''.join(self._data_to_write_to_remote)\n                l = len(data)\n                s = remote_sock.sendto(data, MSG_FASTOPEN, self._chosen_server)\n                if s < l:\n                    data = data[s:]\n                    self._data_to_write_to_remote = [data]\n                else:\n                    self._data_to_write_to_remote = []\n                self._update_stream(STREAM_UP, WAIT_STATUS_READWRITING)\n            except (OSError, IOError) as e:\n                if eventloop.errno_from_exception(e) == errno.EINPROGRESS:\n                    # in this case data is not sent at all\n                    self._update_stream(STREAM_UP, WAIT_STATUS_READWRITING)\n                elif eventloop.errno_from_exception(e) == errno.ENOTCONN:\n                    logging.error('fast open not supported on this OS')\n                    self._config['fast_open'] = False\n                    self.destroy()\n                else:\n                    shell.print_exception(e)\n                    if self._config['verbose']:\n                        traceback.print_exc()\n                    logging.error(\"exception from %s:%d\" % (self._client_address[0], self._client_address[1]))\n                    self.destroy()\n\n    def _get_head_size(self, buf, def_value):\n        if len(buf) < 2:\n            return def_value\n        head_type = common.ord(buf[0]) & 0xF\n        if head_type == 1:\n            return 7\n        if head_type == 4:\n            return 19\n        if head_type == 3:\n            return 4 + common.ord(buf[1])\n        return def_value\n\n    def _handle_stage_addr(self, ogn_data, data):\n        try:\n            if self._is_local:\n                cmd = common.ord(data[1])\n                if cmd == CMD_UDP_ASSOCIATE:\n                    logging.debug('UDP associate')\n                    if self._local_sock.family == socket.AF_INET6:\n                        header = b'\\x05\\x00\\x00\\x04'\n                    else:\n                        header = b'\\x05\\x00\\x00\\x01'\n                    addr, port = self._local_sock.getsockname()[:2]\n                    addr_to_send = socket.inet_pton(self._local_sock.family,\n                                                    addr)\n                    port_to_send = struct.pack('>H', port)\n                    self._write_to_sock(header + addr_to_send + port_to_send,\n                                        self._local_sock)\n                    self._stage = STAGE_UDP_ASSOC\n                    # just wait for the client to disconnect\n                    return\n                elif cmd == CMD_CONNECT:\n                    # just trim VER CMD RSV\n                    data = data[3:]\n                else:\n                    logging.error('invalid command %d', cmd)\n                    self.destroy()\n                    return\n\n            before_parse_data = data\n            if self._is_local:\n                header_result = parse_header(data)\n            else:\n                data = pre_parse_header(data)\n                if data is None:\n                    data = self._handel_protocol_error(self._client_address, ogn_data)\n                header_result = parse_header(data)\n                if header_result is not None:\n                    try:\n                        common.to_str(header_result[2])\n                    except Exception as e:\n                        header_result = None\n                if header_result is None:\n                    data = self._handel_protocol_error(self._client_address, ogn_data)\n                    header_result = parse_header(data)\n                self._overhead = self._obfs.get_overhead(self._is_local) + self._protocol.get_overhead(self._is_local)\n                self._recv_buffer_size = BUF_SIZE - self._overhead\n                server_info = self._obfs.get_server_info()\n                server_info.buffer_size = self._recv_buffer_size\n                server_info = self._protocol.get_server_info()\n                server_info.buffer_size = self._recv_buffer_size\n            connecttype, addrtype, remote_addr, remote_port, header_length = header_result\n            if connecttype != 0:\n                pass\n                #common.connect_log('UDP over TCP by user %d' %\n                #        (self._user_id, ))\n            else:\n                common.connect_log('TCP request %s:%d by user %d' %\n                        (common.to_str(remote_addr), remote_port, self._user_id))\n            self._remote_address = (common.to_str(remote_addr), remote_port)\n            self._remote_udp = (connecttype != 0)\n            # pause reading\n            self._update_stream(STREAM_UP, WAIT_STATUS_WRITING)\n            self._stage = STAGE_DNS\n            if self._is_local:\n                # forward address to remote\n                self._write_to_sock((b'\\x05\\x00\\x00\\x01'\n                                     b'\\x00\\x00\\x00\\x00\\x10\\x10'),\n                                    self._local_sock)\n                head_len = self._get_head_size(data, 30)\n                self._obfs.obfs.server_info.head_len = head_len\n                self._protocol.obfs.server_info.head_len = head_len\n                if self._encryptor is not None:\n                    data = self._protocol.client_pre_encrypt(data)\n                    data_to_send = self._encryptor.encrypt(data)\n                    data_to_send = self._obfs.client_encode(data_to_send)\n                if data_to_send:\n                    self._data_to_write_to_remote.append(data_to_send)\n                # notice here may go into _handle_dns_resolved directly\n                self._dns_resolver.resolve(self._chosen_server[0],\n                                           self._handle_dns_resolved)\n            else:\n                if len(data) > header_length:\n                    self._data_to_write_to_remote.append(data[header_length:])\n                # notice here may go into _handle_dns_resolved directly\n                self._dns_resolver.resolve(remote_addr,\n                                           self._handle_dns_resolved)\n        except Exception as e:\n            self._log_error(e)\n            if self._config['verbose']:\n                traceback.print_exc()\n            self.destroy()\n\n    def _socket_bind_addr(self, sock, af):\n        bind_addr = ''\n        if self._bind and af == socket.AF_INET:\n            bind_addr = self._bind\n        elif self._bindv6 and af == socket.AF_INET6:\n            bind_addr = self._bindv6\n        else:\n            bind_addr = self._accept_address[0]\n\n        bind_addr = bind_addr.replace(\"::ffff:\", \"\")\n        if bind_addr in self._ignore_bind_list:\n            bind_addr = None\n        if bind_addr:\n            local_addrs = socket.getaddrinfo(bind_addr, 0, 0, socket.SOCK_STREAM, socket.SOL_TCP)\n            if local_addrs[0][0] == af:\n                logging.debug(\"bind %s\" % (bind_addr,))\n                try:\n                    sock.bind((bind_addr, 0))\n                except Exception as e:\n                    logging.warn(\"bind %s fail\" % (bind_addr,))\n\n    def _create_remote_socket(self, ip, port):\n        if self._remote_udp:\n            addrs_v6 = socket.getaddrinfo(\"::\", 0, 0, socket.SOCK_DGRAM, socket.SOL_UDP)\n            addrs = socket.getaddrinfo(\"0.0.0.0\", 0, 0, socket.SOCK_DGRAM, socket.SOL_UDP)\n        else:\n            addrs = socket.getaddrinfo(ip, port, 0, socket.SOCK_STREAM, socket.SOL_TCP)\n        if len(addrs) == 0:\n            raise Exception(\"getaddrinfo failed for %s:%d\" % (ip, port))\n        af, socktype, proto, canonname, sa = addrs[0]\n        if not self._remote_udp and not self._is_redirect:\n            if self._forbidden_iplist:\n                if common.to_str(sa[0]) in self._forbidden_iplist:\n                    if self._remote_address:\n                        raise Exception('IP %s is in forbidden list, when connect to %s:%d via port %d by UID %d' %\n                            (common.to_str(sa[0]), self._remote_address[0], self._remote_address[1], self._server._listen_port, self._user_id))\n                    raise Exception('IP %s is in forbidden list, reject' %\n                                    common.to_str(sa[0]))\n            if self._forbidden_portset:\n                if sa[1] in self._forbidden_portset:\n                    if self._remote_address:\n                        raise Exception('Port %d is in forbidden list, when connect to %s:%d via port %d by UID %d' %\n                            (sa[1], self._remote_address[0], self._remote_address[1], self._server._listen_port, self._user_id))\n                    raise Exception('Port %d is in forbidden list, reject' % sa[1])\n        remote_sock = socket.socket(af, socktype, proto)\n        self._remote_sock = remote_sock\n        self._remote_sock_fd = remote_sock.fileno()\n        self._fd_to_handlers[self._remote_sock_fd] = self\n\n        if self._remote_udp:\n            af, socktype, proto, canonname, sa = addrs_v6[0]\n            remote_sock_v6 = socket.socket(af, socktype, proto)\n            self._remote_sock_v6 = remote_sock_v6\n            self._remotev6_sock_fd = remote_sock_v6.fileno()\n            self._fd_to_handlers[self._remotev6_sock_fd] = self\n\n        remote_sock.setblocking(False)\n        if self._remote_udp:\n            remote_sock_v6.setblocking(False)\n\n            if not self._is_local:\n                self._socket_bind_addr(remote_sock, af)\n                self._socket_bind_addr(remote_sock_v6, af)\n        else:\n            remote_sock.setsockopt(socket.SOL_TCP, socket.TCP_NODELAY, 1)\n            if not self._is_local:\n                self._socket_bind_addr(remote_sock, af)\n        return remote_sock\n\n    def _handle_dns_resolved(self, result, error):\n        if error:\n            self._log_error(error)\n            self.destroy()\n            return\n        if result:\n            ip = result[1]\n            if ip:\n                try:\n                    self._stage = STAGE_CONNECTING\n                    remote_addr = ip\n                    if self._is_local:\n                        remote_port = self._chosen_server[1]\n                    else:\n                        remote_port = self._remote_address[1]\n\n                    if self._is_local and self._config['fast_open']:\n                        # for fastopen:\n                        # wait for more data to arrive and send them in one SYN\n                        self._stage = STAGE_CONNECTING\n                        # we don't have to wait for remote since it's not\n                        # created\n                        self._update_stream(STREAM_UP, WAIT_STATUS_READING)\n                        # TODO when there is already data in this packet\n                    else:\n                        # else do connect\n                        remote_sock = self._create_remote_socket(remote_addr,\n                                                                 remote_port)\n                        if self._remote_udp:\n                            self._loop.add(remote_sock,\n                                           eventloop.POLL_IN,\n                                           self._server)\n                            if self._remote_sock_v6:\n                                self._loop.add(self._remote_sock_v6,\n                                        eventloop.POLL_IN,\n                                        self._server)\n                        else:\n                            try:\n                                remote_sock.connect((remote_addr, remote_port))\n                            except (OSError, IOError) as e:\n                                if eventloop.errno_from_exception(e) in (errno.EINPROGRESS,\n                                        errno.EWOULDBLOCK):\n                                    pass # always goto here\n                                else:\n                                    raise e\n                            addr, port = self._remote_sock.getsockname()[:2]\n                            common.connect_log('TCP connecting %s(%s):%d from %s:%d by user %d' %\n                                (common.to_str(self._remote_address[0]), common.to_str(remote_addr), remote_port, addr, port, self._user_id))\n\n                            self._loop.add(remote_sock,\n                                       eventloop.POLL_ERR | eventloop.POLL_OUT,\n                                       self._server)\n                        self._stage = STAGE_CONNECTING\n                        self._update_stream(STREAM_UP, WAIT_STATUS_READWRITING)\n                        self._update_stream(STREAM_DOWN, WAIT_STATUS_READING)\n                        if self._remote_udp:\n                            while self._data_to_write_to_remote:\n                                data = self._data_to_write_to_remote[0]\n                                del self._data_to_write_to_remote[0]\n                                self._write_to_sock(data, self._remote_sock)\n                    return\n                except Exception as e:\n                    shell.print_exception(e)\n                    if self._config['verbose']:\n                        traceback.print_exc()\n                    logging.error(\"exception from %s:%d\" % (self._client_address[0], self._client_address[1]))\n        self.destroy()\n\n    def _get_read_size(self, sock, recv_buffer_size, up):\n        if self._overhead == 0:\n            return recv_buffer_size\n        buffer_size = len(sock.recv(recv_buffer_size, socket.MSG_PEEK))\n        frame_size = self._tcp_mss - self._overhead\n        if up:\n            buffer_size = min(buffer_size, self._recv_u_max_size)\n            self._recv_u_max_size = min(self._recv_u_max_size + frame_size, BUF_SIZE)\n        else:\n            buffer_size = min(buffer_size, self._recv_d_max_size)\n            self._recv_d_max_size = min(self._recv_d_max_size + frame_size, BUF_SIZE)\n        if buffer_size == recv_buffer_size:\n            return buffer_size\n        if buffer_size > frame_size:\n            buffer_size = int(buffer_size / frame_size) * frame_size\n        return buffer_size\n\n    def _on_local_read(self):\n        # handle all local read events and dispatch them to methods for\n        # each stage\n        if not self._local_sock:\n            return\n        is_local = self._is_local\n        if is_local:\n            recv_buffer_size = self._get_read_size(self._local_sock, self._recv_buffer_size, True)\n        else:\n            recv_buffer_size = BUF_SIZE\n        data = None\n        try:\n            data = self._local_sock.recv(recv_buffer_size)\n        except (OSError, IOError) as e:\n            if eventloop.errno_from_exception(e) in \\\n                    (errno.ETIMEDOUT, errno.EAGAIN, errno.EWOULDBLOCK):\n                return\n        if not data:\n            self.destroy()\n            return\n\n        self.speed_tester_u.add(len(data))\n        self._server.speed_tester_u(self._user_id).add(len(data))\n        ogn_data = data\n        if not is_local:\n            if self._encryptor is not None:\n                if self._encrypt_correct:\n                    try:\n                        obfs_decode = self._obfs.server_decode(data)\n                        if self._stage == STAGE_INIT:\n                            self._overhead = self._obfs.get_overhead(self._is_local) + self._protocol.get_overhead(self._is_local)\n                            server_info = self._protocol.get_server_info()\n                            server_info.overhead = self._overhead\n                    except Exception as e:\n                        shell.print_exception(e)\n                        logging.error(\"exception from %s:%d\" % (self._client_address[0], self._client_address[1]))\n                        self.destroy()\n                        return\n                    if obfs_decode[2]:\n                        data = self._obfs.server_encode(b'')\n                        try:\n                            self._write_to_sock(data, self._local_sock)\n                        except Exception as e:\n                            shell.print_exception(e)\n                            if self._config['verbose']:\n                                traceback.print_exc()\n                            logging.error(\"exception from %s:%d\" % (self._client_address[0], self._client_address[1]))\n                            self.destroy()\n                            return\n                    if obfs_decode[1]:\n                        if not self._protocol.obfs.server_info.recv_iv:\n                            iv_len = len(self._protocol.obfs.server_info.iv)\n                            self._protocol.obfs.server_info.recv_iv = obfs_decode[0][:iv_len]\n                        data = self._encryptor.decrypt(obfs_decode[0])\n                    else:\n                        data = obfs_decode[0]\n                    try:\n                        data, sendback = self._protocol.server_post_decrypt(data)\n                        if sendback:\n                            backdata = self._protocol.server_pre_encrypt(b'')\n                            backdata = self._encryptor.encrypt(backdata)\n                            backdata = self._obfs.server_encode(backdata)\n                            try:\n                                self._write_to_sock(backdata, self._local_sock)\n                            except Exception as e:\n                                shell.print_exception(e)\n                                if self._config['verbose']:\n                                    traceback.print_exc()\n                                logging.error(\"exception from %s:%d\" % (self._client_address[0], self._client_address[1]))\n                                self.destroy()\n                                return\n                    except Exception as e:\n                        shell.print_exception(e)\n                        logging.error(\"exception from %s:%d\" % (self._client_address[0], self._client_address[1]))\n                        self.destroy()\n                        return\n            else:\n                return\n            if not data:\n                return\n        if self._stage == STAGE_STREAM:\n            if self._is_local:\n                if self._encryptor is not None:\n                    data = self._protocol.client_pre_encrypt(data)\n                    data = self._encryptor.encrypt(data)\n                    data = self._obfs.client_encode(data)\n            self._write_to_sock(data, self._remote_sock)\n        elif is_local and self._stage == STAGE_INIT:\n            # TODO check auth method\n            self._write_to_sock(b'\\x05\\00', self._local_sock)\n            self._stage = STAGE_ADDR\n        elif self._stage == STAGE_CONNECTING:\n            self._handle_stage_connecting(data)\n        elif (is_local and self._stage == STAGE_ADDR) or \\\n                (not is_local and self._stage == STAGE_INIT):\n            self._handle_stage_addr(ogn_data, data)\n\n    def _on_remote_read(self, is_remote_sock):\n        # handle all remote read events\n        data = None\n        try:\n            if self._remote_udp:\n                if is_remote_sock:\n                    data, addr = self._remote_sock.recvfrom(UDP_MAX_BUF_SIZE)\n                else:\n                    data, addr = self._remote_sock_v6.recvfrom(UDP_MAX_BUF_SIZE)\n                port = struct.pack('>H', addr[1])\n                try:\n                    ip = socket.inet_aton(addr[0])\n                    data = b'\\x00\\x01' + ip + port + data\n                except Exception as e:\n                    ip = socket.inet_pton(socket.AF_INET6, addr[0])\n                    data = b'\\x00\\x04' + ip + port + data\n                size = len(data) + 2\n                data = struct.pack('>H', size) + data\n                #logging.info('UDP over TCP recvfrom %s:%d %d bytes to %s:%d' % (addr[0], addr[1], len(data), self._client_address[0], self._client_address[1]))\n            else:\n                if self._is_local:\n                    recv_buffer_size = BUF_SIZE\n                else:\n                    recv_buffer_size = self._get_read_size(self._remote_sock, self._recv_buffer_size, False)\n                data = self._remote_sock.recv(recv_buffer_size)\n                self._recv_pack_id += 1\n        except (OSError, IOError) as e:\n            if eventloop.errno_from_exception(e) in \\\n                    (errno.ETIMEDOUT, errno.EAGAIN, errno.EWOULDBLOCK, 10035): #errno.WSAEWOULDBLOCK\n                return\n        if not data:\n            self.destroy()\n            return\n\n        self.speed_tester_d.add(len(data))\n        self._server.speed_tester_d(self._user_id).add(len(data))\n        if self._encryptor is not None:\n            if self._is_local:\n                try:\n                    obfs_decode = self._obfs.client_decode(data)\n                except Exception as e:\n                    shell.print_exception(e)\n                    logging.error(\"exception from %s:%d\" % (self._client_address[0], self._client_address[1]))\n                    self.destroy()\n                    return\n                if obfs_decode[1]:\n                    send_back = self._obfs.client_encode(b'')\n                    self._write_to_sock(send_back, self._remote_sock)\n                if not self._protocol.obfs.server_info.recv_iv:\n                    iv_len = len(self._protocol.obfs.server_info.iv)\n                    self._protocol.obfs.server_info.recv_iv = obfs_decode[0][:iv_len]\n                data = self._encryptor.decrypt(obfs_decode[0])\n                try:\n                    data = self._protocol.client_post_decrypt(data)\n                    if self._recv_pack_id == 1:\n                        self._tcp_mss = self._protocol.get_server_info().tcp_mss\n                except Exception as e:\n                    shell.print_exception(e)\n                    logging.error(\"exception from %s:%d\" % (self._client_address[0], self._client_address[1]))\n                    self.destroy()\n                    return\n            else:\n                if self._encrypt_correct:\n                    data = self._protocol.server_pre_encrypt(data)\n                    data = self._encryptor.encrypt(data)\n                    data = self._obfs.server_encode(data)\n                    self._server.add_transfer_d(self._user, len(data))\n                self._update_activity(len(data))\n        else:\n            return\n        try:\n            self._write_to_sock(data, self._local_sock)\n        except Exception as e:\n            shell.print_exception(e)\n            if self._config['verbose']:\n                traceback.print_exc()\n            logging.error(\"exception from %s:%d\" % (self._client_address[0], self._client_address[1]))\n            self.destroy()\n\n    def _on_local_write(self):\n        # handle local writable event\n        if self._data_to_write_to_local:\n            data = b''.join(self._data_to_write_to_local)\n            self._data_to_write_to_local = []\n            self._write_to_sock(data, self._local_sock)\n        else:\n            self._update_stream(STREAM_DOWN, WAIT_STATUS_READING)\n\n    def _on_remote_write(self):\n        # handle remote writable event\n        self._stage = STAGE_STREAM\n        if self._data_to_write_to_remote:\n            data = b''.join(self._data_to_write_to_remote)\n            self._data_to_write_to_remote = []\n            self._write_to_sock(data, self._remote_sock)\n        else:\n            self._update_stream(STREAM_UP, WAIT_STATUS_READING)\n\n    def _on_local_error(self):\n        if self._local_sock:\n            err = eventloop.get_sock_error(self._local_sock)\n            if err.errno not in [errno.ECONNRESET, errno.EPIPE]:\n                logging.error(err)\n                logging.error(\"local error, exception from %s:%d\" % (self._client_address[0], self._client_address[1]))\n        self.destroy()\n\n    def _on_remote_error(self):\n        if self._remote_sock:\n            err = eventloop.get_sock_error(self._remote_sock)\n            if err.errno not in [errno.ECONNRESET]:\n                logging.error(err)\n                if self._remote_address:\n                    logging.error(\"remote error, when connect to %s:%d\" % (self._remote_address[0], self._remote_address[1]))\n                else:\n                    logging.error(\"remote error, exception from %s:%d\" % (self._client_address[0], self._client_address[1]))\n        self.destroy()\n\n    def handle_event(self, sock, fd, event):\n        # handle all events in this handler and dispatch them to methods\n        handle = False\n        if self._stage == STAGE_DESTROYED:\n            logging.debug('ignore handle_event: destroyed')\n            return True\n        if self._user is not None and self._user not in self._server.server_users:\n            self.destroy()\n            return True\n        if fd == self._remote_sock_fd or fd == self._remotev6_sock_fd:\n            if event & eventloop.POLL_ERR:\n                handle = True\n                self._on_remote_error()\n            elif event & (eventloop.POLL_IN | eventloop.POLL_HUP):\n                if not self.speed_tester_d.isExceed() and not self._server.speed_tester_d(self._user_id).isExceed():\n                    handle = True\n                    self._on_remote_read(sock == self._remote_sock)\n                else:\n                    self._recv_d_max_size = self._tcp_mss - self._overhead\n            elif event & eventloop.POLL_OUT:\n                handle = True\n                self._on_remote_write()\n        elif fd == self._local_sock_fd:\n            if event & eventloop.POLL_ERR:\n                handle = True\n                self._on_local_error()\n            elif event & (eventloop.POLL_IN | eventloop.POLL_HUP):\n                if not self.speed_tester_u.isExceed() and not self._server.speed_tester_u(self._user_id).isExceed():\n                    handle = True\n                    self._on_local_read()\n                else:\n                    self._recv_u_max_size = self._tcp_mss - self._overhead\n            elif event & eventloop.POLL_OUT:\n                handle = True\n                self._on_local_write()\n        else:\n            logging.warn('unknown socket from %s:%d' % (self._client_address[0], self._client_address[1]))\n            try:\n                self._loop.removefd(fd)\n            except Exception as e:\n                shell.print_exception(e)\n            try:\n                del self._fd_to_handlers[fd]\n            except Exception as e:\n                shell.print_exception(e)\n            sock.close()\n\n        return handle\n\n    def _log_error(self, e):\n        logging.error('%s when handling connection from %s:%d' %\n                      (e, self._client_address[0], self._client_address[1]))\n\n    def stage(self):\n        return self._stage\n\n    def destroy(self):\n        # destroy the handler and release any resources\n        # promises:\n        # 1. destroy won't make another destroy() call inside\n        # 2. destroy releases resources so it prevents future call to destroy\n        # 3. destroy won't raise any exceptions\n        # if any of the promises are broken, it indicates a bug has been\n        # introduced! mostly likely memory leaks, etc\n        if self._stage == STAGE_DESTROYED:\n            # this couldn't happen\n            logging.debug('already destroyed')\n            return\n        self._stage = STAGE_DESTROYED\n        if self._remote_address:\n            logging.debug('destroy: %s:%d' %\n                          self._remote_address)\n        else:\n            logging.debug('destroy')\n        if self._remote_sock:\n            logging.debug('destroying remote')\n            try:\n                self._loop.removefd(self._remote_sock_fd)\n            except Exception as e:\n                shell.print_exception(e)\n            try:\n                if self._remote_sock_fd is not None:\n                    del self._fd_to_handlers[self._remote_sock_fd]\n            except Exception as e:\n                shell.print_exception(e)\n            self._remote_sock.close()\n            self._remote_sock = None\n        if self._remote_sock_v6:\n            logging.debug('destroying remote_v6')\n            try:\n                self._loop.removefd(self._remotev6_sock_fd)\n            except Exception as e:\n                shell.print_exception(e)\n            try:\n                if self._remotev6_sock_fd is not None:\n                    del self._fd_to_handlers[self._remotev6_sock_fd]\n            except Exception as e:\n                shell.print_exception(e)\n            self._remote_sock_v6.close()\n            self._remote_sock_v6 = None\n        if self._local_sock:\n            logging.debug('destroying local')\n            try:\n                self._loop.removefd(self._local_sock_fd)\n            except Exception as e:\n                shell.print_exception(e)\n            try:\n                if self._local_sock_fd is not None:\n                    del self._fd_to_handlers[self._local_sock_fd]\n            except Exception as e:\n                shell.print_exception(e)\n            self._local_sock.close()\n            self._local_sock = None\n        if self._obfs:\n            self._obfs.dispose()\n            self._obfs = None\n        if self._protocol:\n            self._protocol.dispose()\n            self._protocol = None\n        self._encryptor = None\n        self._dns_resolver.remove_callback(self._handle_dns_resolved)\n        self._server.remove_handler(self)\n        if self._add_ref > 0:\n            self._server.add_connection(-1)\n            self._server.stat_add(self._client_address[0], -1)\n\nclass TCPRelay(object):\n    def __init__(self, config, dns_resolver, is_local, stat_callback=None, stat_counter=None):\n        self._config = config\n        self._is_local = is_local\n        self._dns_resolver = dns_resolver\n        self._closed = False\n        self._eventloop = None\n        self._fd_to_handlers = {}\n        self.server_transfer_ul = 0\n        self.server_transfer_dl = 0\n        self.server_users = {}\n        self.server_users_cfg = {}\n        self.server_user_transfer_ul = {}\n        self.server_user_transfer_dl = {}\n        self.mu = False\n        self._speed_tester_u = {}\n        self._speed_tester_d = {}\n        self.server_connections = 0\n        self.protocol_data = obfs.obfs(config['protocol']).init_data()\n        self.obfs_data = obfs.obfs(config['obfs']).init_data()\n\n        if config.get('connect_verbose_info', 0) > 0:\n            common.connect_log = logging.info\n\n        self._timeout = config['timeout']\n        self._timeout_cache = lru_cache.LRUCache(timeout=self._timeout,\n                                         close_callback=self._close_tcp_client)\n\n        if is_local:\n            listen_addr = config['local_address']\n            listen_port = config['local_port']\n        else:\n            listen_addr = config['server']\n            listen_port = config['server_port']\n        self._listen_port = listen_port\n\n        if common.to_str(config['protocol']) in obfs.mu_protocol():\n            self._update_users(None, None)\n\n        addrs = socket.getaddrinfo(listen_addr, listen_port, 0,\n                                   socket.SOCK_STREAM, socket.SOL_TCP)\n        if len(addrs) == 0:\n            raise Exception(\"can't get addrinfo for %s:%d\" %\n                            (listen_addr, listen_port))\n        af, socktype, proto, canonname, sa = addrs[0]\n        server_socket = socket.socket(af, socktype, proto)\n        server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)\n        server_socket.bind(sa)\n        server_socket.setblocking(False)\n        if config['fast_open']:\n            try:\n                server_socket.setsockopt(socket.SOL_TCP, 23, 5)\n            except socket.error:\n                logging.error('warning: fast open is not available')\n                self._config['fast_open'] = False\n        server_socket.listen(config.get('max_connect', 1024))\n        self._server_socket = server_socket\n        self._server_socket_fd = server_socket.fileno()\n        self._stat_counter = stat_counter\n        self._stat_callback = stat_callback\n\n    def add_to_loop(self, loop):\n        if self._eventloop:\n            raise Exception('already add to loop')\n        if self._closed:\n            raise Exception('already closed')\n        self._eventloop = loop\n        self._eventloop.add(self._server_socket,\n                            eventloop.POLL_IN | eventloop.POLL_ERR, self)\n        self._eventloop.add_periodic(self.handle_periodic)\n\n    def remove_handler(self, client):\n        if hash(client) in self._timeout_cache:\n            del self._timeout_cache[hash(client)]\n\n    def add_connection(self, val):\n        self.server_connections += val\n        logging.debug('server port %5d connections = %d' % (self._listen_port, self.server_connections,))\n\n    def get_ud(self):\n        return (self.server_transfer_ul, self.server_transfer_dl)\n\n    def get_users_ud(self):\n        return (self.server_user_transfer_ul.copy(), self.server_user_transfer_dl.copy())\n\n    def _update_users(self, protocol_param, acl):\n        if protocol_param is None:\n            protocol_param = self._config['protocol_param']\n        param = common.to_bytes(protocol_param).split(b'#')\n        if len(param) == 2:\n            self.mu = True\n            user_list = param[1].split(b',')\n            if user_list:\n                for user in user_list:\n                    items = user.split(b':')\n                    if len(items) == 2:\n                        user_int_id = int(items[0])\n                        uid = struct.pack('<I', user_int_id)\n                        if acl is not None and user_int_id not in acl:\n                            self.del_user(uid)\n                        else:\n                            passwd = items[1]\n                            self.add_user(uid, {'password':passwd})\n\n    def _update_user(self, id, passwd):\n        uid = struct.pack('<I', id)\n        self.add_user(uid, passwd)\n\n    def update_users(self, users):\n        for uid in list(self.server_users.keys()):\n            id = struct.unpack('<I', uid)[0]\n            if id not in users:\n                self.del_user(uid)\n        for id in users:\n            uid = struct.pack('<I', id)\n            self.add_user(uid, users[id])\n\n    def add_user(self, uid, cfg): # user: binstr[4], passwd: str\n        passwd = cfg['password']\n        self.server_users[uid] = common.to_bytes(passwd)\n        self.server_users_cfg[uid] = cfg\n        speed = cfg.get(\"speed_limit_per_user\", 0)\n        if uid in self._speed_tester_u:\n            self._speed_tester_u[uid].update_limit(speed)\n        else:\n            self._speed_tester_u[uid] = SpeedTester(speed)\n        if uid in self._speed_tester_d:\n            self._speed_tester_d[uid].update_limit(speed)\n        else:\n            self._speed_tester_d[uid] = SpeedTester(speed)\n\n    def del_user(self, uid):\n        if uid in self.server_users:\n            del self.server_users[uid]\n        if uid in self.server_users_cfg:\n            del self.server_users_cfg[uid]\n\n    def add_transfer_u(self, user, transfer):\n        if user is None:\n            self.server_transfer_ul += transfer\n        else:\n            if user not in self.server_user_transfer_ul:\n                self.server_user_transfer_ul[user] = 0\n            self.server_user_transfer_ul[user] += transfer + self.server_transfer_ul\n            self.server_transfer_ul = 0\n\n    def add_transfer_d(self, user, transfer):\n        if user is None:\n            self.server_transfer_dl += transfer\n        else:\n            if user not in self.server_user_transfer_dl:\n                self.server_user_transfer_dl[user] = 0\n            self.server_user_transfer_dl[user] += transfer + self.server_transfer_dl\n            self.server_transfer_dl = 0\n\n    def speed_tester_u(self, uid):\n        if uid not in self._speed_tester_u:\n            if self.mu: #TODO\n                self._speed_tester_u[uid] = SpeedTester(self._config.get(\"speed_limit_per_user\", 0))\n            else:\n                self._speed_tester_u[uid] = SpeedTester(self._config.get(\"speed_limit_per_user\", 0))\n        return self._speed_tester_u[uid]\n\n    def speed_tester_d(self, uid):\n        if uid not in self._speed_tester_d:\n            if self.mu: #TODO\n                self._speed_tester_d[uid] = SpeedTester(self._config.get(\"speed_limit_per_user\", 0))\n            else:\n                self._speed_tester_d[uid] = SpeedTester(self._config.get(\"speed_limit_per_user\", 0))\n        return self._speed_tester_d[uid]\n\n    def update_limit(self, uid, max_speed):\n        if uid in self._speed_tester_u:\n            self._speed_tester_u[uid].update_limit(max_speed)\n        if uid in self._speed_tester_d:\n            self._speed_tester_d[uid].update_limit(max_speed)\n\n    def update_stat(self, port, stat_dict, val):\n        newval = stat_dict.get(0, 0) + val\n        stat_dict[0] = newval\n        logging.debug('port %d connections %d' % (port, newval))\n        connections_step = 25\n        if newval >= stat_dict.get(-1, 0) + connections_step:\n            logging.info('port %d connections up to %d' % (port, newval))\n            stat_dict[-1] = stat_dict.get(-1, 0) + connections_step\n        elif newval <= stat_dict.get(-1, 0) - connections_step:\n            logging.info('port %d connections down to %d' % (port, newval))\n            stat_dict[-1] = stat_dict.get(-1, 0) - connections_step\n\n    def stat_add(self, local_addr, val):\n        if self._stat_counter is not None:\n            if self._listen_port not in self._stat_counter:\n                self._stat_counter[self._listen_port] = {}\n            newval = self._stat_counter[self._listen_port].get(local_addr, 0) + val\n            logging.debug('port %d addr %s connections %d' % (self._listen_port, local_addr, newval))\n            self._stat_counter[self._listen_port][local_addr] = newval\n            self.update_stat(self._listen_port, self._stat_counter[self._listen_port], val)\n            if newval <= 0:\n                if local_addr in self._stat_counter[self._listen_port]:\n                    del self._stat_counter[self._listen_port][local_addr]\n\n            newval = self._stat_counter.get(0, 0) + val\n            self._stat_counter[0] = newval\n            logging.debug('Total connections %d' % newval)\n\n            connections_step = 50\n            if newval >= self._stat_counter.get(-1, 0) + connections_step:\n                logging.info('Total connections up to %d' % newval)\n                self._stat_counter[-1] = self._stat_counter.get(-1, 0) + connections_step\n            elif newval <= self._stat_counter.get(-1, 0) - connections_step:\n                logging.info('Total connections down to %d' % newval)\n                self._stat_counter[-1] = self._stat_counter.get(-1, 0) - connections_step\n\n    def update_activity(self, client, data_len):\n        if data_len and self._stat_callback:\n            self._stat_callback(self._listen_port, data_len)\n\n        self._timeout_cache[hash(client)] = client\n\n    def _sweep_timeout(self):\n        self._timeout_cache.sweep()\n\n    def _close_tcp_client(self, client):\n        if client.remote_address:\n            logging.debug('timed out: %s:%d' %\n                         client.remote_address)\n        else:\n            logging.debug('timed out')\n        client.destroy()\n\n    def handle_event(self, sock, fd, event):\n        # handle events and dispatch to handlers\n        handle = False\n        if sock:\n            logging.log(shell.VERBOSE_LEVEL, 'fd %d %s', fd,\n                        eventloop.EVENT_NAMES.get(event, event))\n        if sock == self._server_socket:\n            if event & eventloop.POLL_ERR:\n                # TODO\n                raise Exception('server_socket error')\n            handler = None\n            handle = True\n            try:\n                logging.debug('accept')\n                conn = self._server_socket.accept()\n                handler = TCPRelayHandler(self, self._fd_to_handlers,\n                                self._eventloop, conn[0], self._config,\n                                self._dns_resolver, self._is_local)\n                if handler.stage() == STAGE_DESTROYED:\n                    conn[0].close()\n            except (OSError, IOError) as e:\n                error_no = eventloop.errno_from_exception(e)\n                if error_no in (errno.EAGAIN, errno.EINPROGRESS,\n                                errno.EWOULDBLOCK):\n                    return\n                else:\n                    shell.print_exception(e)\n                    if self._config['verbose']:\n                        traceback.print_exc()\n                    if handler:\n                        handler.destroy()\n        else:\n            if sock:\n                handler = self._fd_to_handlers.get(fd, None)\n                if handler:\n                    handle = handler.handle_event(sock, fd, event)\n                else:\n                    logging.warn('unknown fd')\n                    handle = True\n                    try:\n                        self._eventloop.removefd(fd)\n                    except Exception as e:\n                        shell.print_exception(e)\n                    sock.close()\n            else:\n                logging.warn('poll removed fd')\n                handle = True\n                if fd in self._fd_to_handlers:\n                    try:\n                        del self._fd_to_handlers[fd]\n                    except Exception as e:\n                        shell.print_exception(e)\n        return handle\n\n    def handle_periodic(self):\n        if self._closed:\n            if self._server_socket:\n                self._eventloop.removefd(self._server_socket_fd)\n                self._server_socket.close()\n                self._server_socket = None\n                logging.info('closed TCP port %d', self._listen_port)\n            for handler in list(self._fd_to_handlers.values()):\n                handler.destroy()\n        self._sweep_timeout()\n\n    def close(self, next_tick=False):\n        logging.debug('TCP close')\n        self._closed = True\n        if not next_tick:\n            if self._eventloop:\n                self._eventloop.remove_periodic(self.handle_periodic)\n                self._eventloop.removefd(self._server_socket_fd)\n            self._server_socket.close()\n            for handler in list(self._fd_to_handlers.values()):\n                handler.destroy()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/udprelay.py",
    "content": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n#\n# Copyright 2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\n# SOCKS5 UDP Request\n# +----+------+------+----------+----------+----------+\n# |RSV | FRAG | ATYP | DST.ADDR | DST.PORT |   DATA   |\n# +----+------+------+----------+----------+----------+\n# | 2  |  1   |  1   | Variable |    2     | Variable |\n# +----+------+------+----------+----------+----------+\n\n# SOCKS5 UDP Response\n# +----+------+------+----------+----------+----------+\n# |RSV | FRAG | ATYP | DST.ADDR | DST.PORT |   DATA   |\n# +----+------+------+----------+----------+----------+\n# | 2  |  1   |  1   | Variable |    2     | Variable |\n# +----+------+------+----------+----------+----------+\n\n# shadowsocks UDP Request (before encrypted)\n# +------+----------+----------+----------+\n# | ATYP | DST.ADDR | DST.PORT |   DATA   |\n# +------+----------+----------+----------+\n# |  1   | Variable |    2     | Variable |\n# +------+----------+----------+----------+\n\n# shadowsocks UDP Response (before encrypted)\n# +------+----------+----------+----------+\n# | ATYP | DST.ADDR | DST.PORT |   DATA   |\n# +------+----------+----------+----------+\n# |  1   | Variable |    2     | Variable |\n# +------+----------+----------+----------+\n\n# shadowsocks UDP Request and Response (after encrypted)\n# +-------+--------------+\n# |   IV  |    PAYLOAD   |\n# +-------+--------------+\n# | Fixed |   Variable   |\n# +-------+--------------+\n\n# HOW TO NAME THINGS\n# ------------------\n# `dest`    means destination server, which is from DST fields in the SOCKS5\n#           request\n# `local`   means local server of shadowsocks\n# `remote`  means remote server of shadowsocks\n# `client`  means UDP clients that connects to other servers\n# `server`  means the UDP server that handles user requests\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport time\nimport socket\nimport logging\nimport struct\nimport errno\nimport random\nimport binascii\nimport traceback\nimport threading\n\nfrom shadowsocks import encrypt, obfs, eventloop, lru_cache, common, shell\nfrom shadowsocks.common import pre_parse_header, parse_header, pack_addr\n\n# for each handler, we have 2 stream directions:\n#    upstream:    from client to server direction\n#                 read local and write to remote\n#    downstream:  from server to client direction\n#                 read remote and write to local\n\nSTREAM_UP = 0\nSTREAM_DOWN = 1\n\n# for each stream, it's waiting for reading, or writing, or both\nWAIT_STATUS_INIT = 0\nWAIT_STATUS_READING = 1\nWAIT_STATUS_WRITING = 2\nWAIT_STATUS_READWRITING = WAIT_STATUS_READING | WAIT_STATUS_WRITING\n\nBUF_SIZE = 65536\nDOUBLE_SEND_BEG_IDS = 16\nPOST_MTU_MIN = 500\nPOST_MTU_MAX = 1400\nSENDING_WINDOW_SIZE = 8192\n\nSTAGE_INIT = 0\nSTAGE_RSP_ID = 1\nSTAGE_DNS = 2\nSTAGE_CONNECTING = 3\nSTAGE_STREAM = 4\nSTAGE_DESTROYED = -1\n\nCMD_CONNECT = 0\nCMD_RSP_CONNECT = 1\nCMD_CONNECT_REMOTE = 2\nCMD_RSP_CONNECT_REMOTE = 3\nCMD_POST = 4\nCMD_SYN_STATUS = 5\nCMD_POST_64 = 6\nCMD_SYN_STATUS_64 = 7\nCMD_DISCONNECT = 8\n\nCMD_VER_STR = b\"\\x08\"\n\nRSP_STATE_EMPTY = b\"\"\nRSP_STATE_REJECT = b\"\\x00\"\nRSP_STATE_CONNECTED = b\"\\x01\"\nRSP_STATE_CONNECTEDREMOTE = b\"\\x02\"\nRSP_STATE_ERROR = b\"\\x03\"\nRSP_STATE_DISCONNECT = b\"\\x04\"\nRSP_STATE_REDIRECT = b\"\\x05\"\n\ndef client_key(source_addr, server_af):\n    # notice this is server af, not dest af\n    return '%s:%s:%d' % (source_addr[0], source_addr[1], server_af)\n\nclass UDPRelay(object):\n    def __init__(self, config, dns_resolver, is_local, stat_callback=None, stat_counter=None):\n        self._config = config\n        if config.get('connect_verbose_info', 0) > 0:\n            common.connect_log = logging.info\n        if is_local:\n            self._listen_addr = config['local_address']\n            self._listen_port = config['local_port']\n            self._remote_addr = config['server']\n            self._remote_port = config['server_port']\n        else:\n            self._listen_addr = config['server']\n            self._listen_port = config['server_port']\n            self._remote_addr = None\n            self._remote_port = None\n        self._dns_resolver = dns_resolver\n        self._password = common.to_bytes(config['password'])\n        self._method = config['method']\n        self._timeout = config['timeout']\n        self._is_local = is_local\n        self._udp_cache_size = config['udp_cache']\n        self._cache = lru_cache.LRUCache(timeout=config['udp_timeout'],\n                                         close_callback=self._close_client_pair)\n        self._cache_dns_client = lru_cache.LRUCache(timeout=10,\n                                         close_callback=self._close_client_pair)\n        self._client_fd_to_server_addr = {}\n        #self._dns_cache = lru_cache.LRUCache(timeout=1800)\n        self._eventloop = None\n        self._closed = False\n        self.server_transfer_ul = 0\n        self.server_transfer_dl = 0\n        self.server_users = {}\n        self.server_user_transfer_ul = {}\n        self.server_user_transfer_dl = {}\n\n        if common.to_bytes(config['protocol']) in obfs.mu_protocol():\n            self._update_users(None, None)\n\n        self.protocol_data = obfs.obfs(config['protocol']).init_data()\n        self._protocol = obfs.obfs(config['protocol'])\n        server_info = obfs.server_info(self.protocol_data)\n        server_info.host = self._listen_addr\n        server_info.port = self._listen_port\n        server_info.users = self.server_users\n        server_info.protocol_param = config['protocol_param']\n        server_info.obfs_param = ''\n        server_info.iv = b''\n        server_info.recv_iv = b''\n        server_info.key_str = common.to_bytes(config['password'])\n        server_info.key = encrypt.encrypt_key(self._password, self._method)\n        server_info.head_len = 30\n        server_info.tcp_mss = 1452\n        server_info.buffer_size = BUF_SIZE\n        server_info.overhead = 0\n        self._protocol.set_server_info(server_info)\n\n        self._sockets = set()\n        self._fd_to_handlers = {}\n        self._reqid_to_hd = {}\n        self._data_to_write_to_server_socket = []\n\n        self._timeout_cache = lru_cache.LRUCache(timeout=self._timeout,\n                                         close_callback=self._close_tcp_client)\n\n        self._bind = config.get('out_bind', '')\n        self._bindv6 = config.get('out_bindv6', '')\n        self._ignore_bind_list = config.get('ignore_bind', [])\n\n        if 'forbidden_ip' in config:\n            self._forbidden_iplist = config['forbidden_ip']\n        else:\n            self._forbidden_iplist = None\n        if 'forbidden_port' in config:\n            self._forbidden_portset = config['forbidden_port']\n        else:\n            self._forbidden_portset = None\n\n        addrs = socket.getaddrinfo(self._listen_addr, self._listen_port, 0,\n                                   socket.SOCK_DGRAM, socket.SOL_UDP)\n        if len(addrs) == 0:\n            raise Exception(\"can't get addrinfo for %s:%d\" %\n                            (self._listen_addr, self._listen_port))\n        af, socktype, proto, canonname, sa = addrs[0]\n        server_socket = socket.socket(af, socktype, proto)\n        server_socket.bind((self._listen_addr, self._listen_port))\n        server_socket.setblocking(False)\n        self._server_socket = server_socket\n        self._stat_callback = stat_callback\n\n    def _get_a_server(self):\n        server = self._config['server']\n        server_port = self._config['server_port']\n        if type(server_port) == list:\n            server_port = random.choice(server_port)\n        if type(server) == list:\n            server = random.choice(server)\n        logging.debug('chosen server: %s:%d', server, server_port)\n        return server, server_port\n\n    def get_ud(self):\n        return (self.server_transfer_ul, self.server_transfer_dl)\n\n    def get_users_ud(self):\n        ret = (self.server_user_transfer_ul.copy(), self.server_user_transfer_dl.copy())\n        return ret\n\n    def _update_users(self, protocol_param, acl):\n        if protocol_param is None:\n            protocol_param = self._config['protocol_param']\n        param = common.to_bytes(protocol_param).split(b'#')\n        if len(param) == 2:\n            user_list = param[1].split(b',')\n            if user_list:\n                for user in user_list:\n                    items = user.split(b':')\n                    if len(items) == 2:\n                        user_int_id = int(items[0])\n                        uid = struct.pack('<I', user_int_id)\n                        if acl is not None and user_int_id not in acl:\n                            self.del_user(uid)\n                        else:\n                            passwd = items[1]\n                            self.add_user(uid, {'password':passwd})\n\n    def _update_user(self, id, passwd):\n        uid = struct.pack('<I', id)\n        self.add_user(uid, passwd)\n\n    def update_users(self, users):\n        for uid in list(self.server_users.keys()):\n            id = struct.unpack('<I', uid)[0]\n            if id not in users:\n                self.del_user(uid)\n        for id in users:\n            uid = struct.pack('<I', id)\n            self.add_user(uid, users[id])\n\n    def add_user(self, uid, cfg): # user: binstr[4], passwd: str\n        passwd = cfg['password']\n        self.server_users[uid] = common.to_bytes(passwd)\n\n    def del_user(self, uid):\n        if uid in self.server_users:\n            del self.server_users[uid]\n\n    def add_transfer_u(self, user, transfer):\n        if user is None:\n            self.server_transfer_ul += transfer\n        else:\n            if user not in self.server_user_transfer_ul:\n                self.server_user_transfer_ul[user] = 0\n            self.server_user_transfer_ul[user] += transfer + self.server_transfer_ul\n            self.server_transfer_ul = 0\n\n    def add_transfer_d(self, user, transfer):\n        if user is None:\n            self.server_transfer_dl += transfer\n        else:\n            if user not in self.server_user_transfer_dl:\n                self.server_user_transfer_dl[user] = 0\n            self.server_user_transfer_dl[user] += transfer + self.server_transfer_dl\n            self.server_transfer_dl = 0\n\n    def _close_client_pair(self, client_pair):\n        client, uid = client_pair\n        self._close_client(client)\n\n    def _close_client(self, client):\n        if hasattr(client, 'close'):\n            if not self._is_local:\n                if client.fileno() in self._client_fd_to_server_addr:\n                    logging.debug('close_client: %s' %\n                                 (self._client_fd_to_server_addr[client.fileno()],))\n                else:\n                    client.info('close_client')\n            self._sockets.remove(client.fileno())\n            self._eventloop.remove(client)\n            del self._client_fd_to_server_addr[client.fileno()]\n            client.close()\n        else:\n            # just an address\n            client.info('close_client pass %s' % client)\n            pass\n\n    def _handel_protocol_error(self, client_address, ogn_data):\n        #raise Exception('can not parse header')\n        logging.warn(\"Protocol ERROR, UDP ogn data %s from %s:%d\" % (binascii.hexlify(ogn_data), client_address[0], client_address[1]))\n\n    def _socket_bind_addr(self, sock, af):\n        bind_addr = ''\n        if self._bind and af == socket.AF_INET:\n            bind_addr = self._bind\n        elif self._bindv6 and af == socket.AF_INET6:\n            bind_addr = self._bindv6\n\n        bind_addr = bind_addr.replace(\"::ffff:\", \"\")\n        if bind_addr in self._ignore_bind_list:\n            bind_addr = None\n        if bind_addr:\n            local_addrs = socket.getaddrinfo(bind_addr, 0, 0, socket.SOCK_DGRAM, socket.SOL_UDP)\n            if local_addrs[0][0] == af:\n                logging.debug(\"bind %s\" % (bind_addr,))\n                try:\n                    sock.bind((bind_addr, 0))\n                except Exception as e:\n                    logging.warn(\"bind %s fail\" % (bind_addr,))\n\n    def _handle_server(self):\n        server = self._server_socket\n        data, r_addr = server.recvfrom(BUF_SIZE)\n        ogn_data = data\n        if not data:\n            logging.debug('UDP handle_server: data is empty')\n        if self._stat_callback:\n            self._stat_callback(self._listen_port, len(data))\n        uid = None\n        if self._is_local:\n            frag = common.ord(data[2])\n            if frag != 0:\n                logging.warn('drop a message since frag is not 0')\n                return\n            else:\n                data = data[3:]\n        else:\n            ref_iv = [0]\n            data = encrypt.encrypt_all_iv(self._protocol.obfs.server_info.key, self._method, 0, data, ref_iv)\n            # decrypt data\n            if not data:\n                logging.debug('UDP handle_server: data is empty after decrypt')\n                return\n            self._protocol.obfs.server_info.recv_iv = ref_iv[0]\n            data, uid = self._protocol.server_udp_post_decrypt(data)\n\n        #logging.info(\"UDP data %s\" % (binascii.hexlify(data),))\n        if not self._is_local:\n            data = pre_parse_header(data)\n            if data is None:\n                return\n\n        try:\n            header_result = parse_header(data)\n        except:\n            self._handel_protocol_error(r_addr, ogn_data)\n            return\n\n        if header_result is None:\n            self._handel_protocol_error(r_addr, ogn_data)\n            return\n        connecttype, addrtype, dest_addr, dest_port, header_length = header_result\n\n        if self._is_local:\n            addrtype = 3\n            server_addr, server_port = self._get_a_server()\n        else:\n            server_addr, server_port = dest_addr, dest_port\n\n        if (addrtype & 7) == 3:\n            af = common.is_ip(server_addr)\n            if af == False:\n                handler = common.UDPAsyncDNSHandler((data, r_addr, uid, header_length))\n                handler.resolve(self._dns_resolver, (server_addr, server_port), self._handle_server_dns_resolved)\n            else:\n                self._handle_server_dns_resolved(\"\", (server_addr, server_port), server_addr, (data, r_addr, uid, header_length))\n        else:\n            self._handle_server_dns_resolved(\"\", (server_addr, server_port), server_addr, (data, r_addr, uid, header_length))\n\n    def _handle_server_dns_resolved(self, error, remote_addr, server_addr, params):\n        if error:\n            return\n        data, r_addr, uid, header_length = params\n        user_id = self._listen_port\n        try:\n            server_port = remote_addr[1]\n            addrs = socket.getaddrinfo(server_addr, server_port, 0,\n                                        socket.SOCK_DGRAM, socket.SOL_UDP)\n            if not addrs: # drop\n                return\n            af, socktype, proto, canonname, sa = addrs[0]\n            server_addr = sa[0]\n            key = client_key(r_addr, af)\n            client_pair = self._cache.get(key, None)\n            if client_pair is None:\n                client_pair = self._cache_dns_client.get(key, None)\n            if client_pair is None:\n                if self._forbidden_iplist:\n                    if common.to_str(sa[0]) in self._forbidden_iplist:\n                        logging.debug('IP %s is in forbidden list, drop' % common.to_str(sa[0]))\n                        # drop\n                        return\n                if self._forbidden_portset:\n                    if sa[1] in self._forbidden_portset:\n                        logging.debug('Port %d is in forbidden list, reject' % sa[1])\n                        # drop\n                        return\n                client = socket.socket(af, socktype, proto)\n                client_uid = uid\n                client.setblocking(False)\n                self._socket_bind_addr(client, af)\n                is_dns = False\n                if len(data) > header_length + 13 and data[header_length + 4 : header_length + 12] == b\"\\x00\\x01\\x00\\x00\\x00\\x00\\x00\\x00\":\n                    is_dns = True\n                else:\n                    pass\n                if sa[1] == 53 and is_dns: #DNS\n                    logging.debug(\"DNS query %s from %s:%d\" % (common.to_str(sa[0]), r_addr[0], r_addr[1]))\n                    self._cache_dns_client[key] = (client, uid)\n                else:\n                    self._cache[key] = (client, uid)\n                self._client_fd_to_server_addr[client.fileno()] = (r_addr, af)\n\n                self._sockets.add(client.fileno())\n                self._eventloop.add(client, eventloop.POLL_IN, self)\n\n                logging.debug('UDP port %5d sockets %d' % (self._listen_port, len(self._sockets)))\n\n                if uid is not None:\n                    user_id = struct.unpack('<I', client_uid)[0]\n            else:\n                client, client_uid = client_pair\n            self._cache.clear(self._udp_cache_size)\n            self._cache_dns_client.clear(16)\n\n            if self._is_local:\n                ref_iv = [encrypt.encrypt_new_iv(self._method)]\n                self._protocol.obfs.server_info.iv = ref_iv[0]\n                data = self._protocol.client_udp_pre_encrypt(data)\n                #logging.debug(\"%s\" % (binascii.hexlify(data),))\n                data = encrypt.encrypt_all_iv(self._protocol.obfs.server_info.key, self._method, 1, data, ref_iv)\n                if not data:\n                    return\n            else:\n                data = data[header_length:]\n            if not data:\n                return\n        except Exception as e:\n            shell.print_exception(e)\n            logging.error(\"exception from user %d\" % (user_id,))\n\n        try:\n            client.sendto(data, (server_addr, server_port))\n            self.add_transfer_u(client_uid, len(data))\n            if client_pair is None: # new request\n                addr, port = client.getsockname()[:2]\n                common.connect_log('UDP data to %s(%s):%d from %s:%d by user %d' %\n                        (common.to_str(remote_addr[0]), common.to_str(server_addr), server_port, addr, port, user_id))\n        except IOError as e:\n            err = eventloop.errno_from_exception(e)\n            logging.warning('IOError sendto %s:%d by user %d' % (server_addr, server_port, user_id))\n            if err in (errno.EINPROGRESS, errno.EAGAIN):\n                pass\n            else:\n                shell.print_exception(e)\n\n    def _handle_client(self, sock):\n        data, r_addr = sock.recvfrom(BUF_SIZE)\n        if not data:\n            logging.debug('UDP handle_client: data is empty')\n            return\n        if self._stat_callback:\n            self._stat_callback(self._listen_port, len(data))\n\n        client_addr = self._client_fd_to_server_addr.get(sock.fileno())\n        client_uid = None\n        if client_addr:\n            key = client_key(client_addr[0], client_addr[1])\n            client_pair = self._cache.get(key, None)\n            client_dns_pair = self._cache_dns_client.get(key, None)\n            if client_pair:\n                client, client_uid = client_pair\n            elif client_dns_pair:\n                client, client_uid = client_dns_pair\n\n        if not self._is_local:\n            addrlen = len(r_addr[0])\n            if addrlen > 255:\n                # drop\n                return\n            data = pack_addr(r_addr[0]) + struct.pack('>H', r_addr[1]) + data\n            ref_iv = [encrypt.encrypt_new_iv(self._method)]\n            self._protocol.obfs.server_info.iv = ref_iv[0]\n            data = self._protocol.server_udp_pre_encrypt(data, client_uid)\n            response = encrypt.encrypt_all_iv(self._protocol.obfs.server_info.key, self._method, 1,\n                                           data, ref_iv)\n            if not response:\n                return\n        else:\n            ref_iv = [0]\n            data = encrypt.encrypt_all_iv(self._protocol.obfs.server_info.key, self._method, 0,\n                                       data, ref_iv)\n            if not data:\n                return\n            self._protocol.obfs.server_info.recv_iv = ref_iv[0]\n            data = self._protocol.client_udp_post_decrypt(data)\n            header_result = parse_header(data)\n            if header_result is None:\n                return\n            #connecttype, dest_addr, dest_port, header_length = header_result\n            #logging.debug('UDP handle_client %s:%d to %s:%d' % (common.to_str(r_addr[0]), r_addr[1], dest_addr, dest_port))\n\n            response = b'\\x00\\x00\\x00' + data\n\n        if client_addr:\n            if client_uid:\n                self.add_transfer_d(client_uid, len(response))\n            else:\n                self.server_transfer_dl += len(response)\n            self.write_to_server_socket(response, client_addr[0])\n            if client_dns_pair:\n                logging.debug(\"remove dns client %s:%d\" % (client_addr[0][0], client_addr[0][1]))\n                del self._cache_dns_client[key]\n                self._close_client(client_dns_pair[0])\n        else:\n            # this packet is from somewhere else we know\n            # simply drop that packet\n            pass\n\n    def write_to_server_socket(self, data, addr):\n        uncomplete = False\n        retry = 0\n        try:\n            self._server_socket.sendto(data, addr)\n            data = None\n            while self._data_to_write_to_server_socket:\n                data_buf = self._data_to_write_to_server_socket[0]\n                retry = data_buf[1] + 1\n                del self._data_to_write_to_server_socket[0]\n                data, addr = data_buf[0]\n                self._server_socket.sendto(data, addr)\n        except (OSError, IOError) as e:\n            error_no = eventloop.errno_from_exception(e)\n            uncomplete = True\n            if error_no in (errno.EWOULDBLOCK,):\n                pass\n            else:\n                shell.print_exception(e)\n                return False\n        #if uncomplete and data is not None and retry < 3:\n        #    self._data_to_write_to_server_socket.append([(data, addr), retry])\n        #'''\n\n    def add_to_loop(self, loop):\n        if self._eventloop:\n            raise Exception('already add to loop')\n        if self._closed:\n            raise Exception('already closed')\n        self._eventloop = loop\n\n        server_socket = self._server_socket\n        self._eventloop.add(server_socket,\n                            eventloop.POLL_IN | eventloop.POLL_ERR, self)\n        loop.add_periodic(self.handle_periodic)\n\n    def remove_handler(self, client):\n        if hash(client) in self._timeout_cache:\n            del self._timeout_cache[hash(client)]\n\n    def update_activity(self, client):\n        self._timeout_cache[hash(client)] = client\n\n    def _sweep_timeout(self):\n        self._timeout_cache.sweep()\n\n    def _close_tcp_client(self, client):\n        if client.remote_address:\n            logging.debug('timed out: %s:%d' %\n                         client.remote_address)\n        else:\n            logging.debug('timed out')\n        client.destroy()\n        client.destroy_local()\n\n    def handle_event(self, sock, fd, event):\n        if sock == self._server_socket:\n            if event & eventloop.POLL_ERR:\n                logging.error('UDP server_socket err')\n            try:\n                self._handle_server()\n            except Exception as e:\n                shell.print_exception(e)\n                if self._config['verbose']:\n                    traceback.print_exc()\n        elif sock and (fd in self._sockets):\n            if event & eventloop.POLL_ERR:\n                logging.error('UDP client_socket err')\n            try:\n                self._handle_client(sock)\n            except Exception as e:\n                shell.print_exception(e)\n                if self._config['verbose']:\n                    traceback.print_exc()\n        else:\n            if sock:\n                handler = self._fd_to_handlers.get(fd, None)\n                if handler:\n                    handler.handle_event(sock, event)\n            else:\n                logging.warn('poll removed fd')\n\n    def handle_periodic(self):\n        if self._closed:\n            self._cache.clear(0)\n            self._cache_dns_client.clear(0)\n            if self._eventloop:\n                self._eventloop.remove_periodic(self.handle_periodic)\n                self._eventloop.remove(self._server_socket)\n            if self._server_socket:\n                self._server_socket.close()\n                self._server_socket = None\n                logging.info('closed UDP port %d', self._listen_port)\n        else:\n            before_sweep_size = len(self._sockets)\n            self._cache.sweep()\n            self._cache_dns_client.sweep()\n            if before_sweep_size != len(self._sockets):\n                logging.debug('UDP port %5d sockets %d' % (self._listen_port, len(self._sockets)))\n            self._sweep_timeout()\n\n    def close(self, next_tick=False):\n        logging.debug('UDP close')\n        self._closed = True\n        if not next_tick:\n            if self._eventloop:\n                self._eventloop.remove_periodic(self.handle_periodic)\n                self._eventloop.remove(self._server_socket)\n            self._server_socket.close()\n            self._cache.clear(0)\n            self._cache_dns_client.clear(0)\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/user.py",
    "content": "#coding:utf-8\n\nimport base64\nimport re\n\nclass miss:\n    def ssr4(self,ssrurl):\n        missing_padding = 4 - len(ssrurl) % 4\n        if missing_padding:\n            ssrurl += b'='* missing_padding\n            return ssrurl\n\ndef checkip(ip):\n    p = re.compile('^((25[0-5]|2[0-4]\\d|[01]?\\d\\d?)\\.){3}(25[0-5]|2[0-4]\\d|[01]?\\d\\d?)$')\n    if p.match(ip):\n        return False\n    else:\n        print \"输入错误请重新输入\"\n        return True\n\ndef checkport(port):\n    try:\n        if int(port)<0 or int(port)>65535:\n            print \"输入错误请重新输入\"\n            return True\n        return False\n    except:\n        print \"输入错误请重新输入\"\n        return True\n\nprint '''\n请输入SSR地址码\n（就是ssr://XX,复制粘贴不嫌长您了就手打）\n手动配置服务器信息请输入1'''\n\nerror = True\nwhile error:\n    ssrhead = raw_input()\n    if ssrhead == \"1\":\n        break\n    try:\n        ssrhead = re.split('[:/]',ssrhead)\n        ssrurl = miss()\n        ssrurl = ssrurl.ssr4(ssrhead[3])\t\t\n        ssrurl = base64.urlsafe_b64decode(ssrurl)\n        ssrurl = re.split('[:/?&]',ssrurl)\n        serverip = ssrurl[0]\n        serverport = ssrurl[1]\n        password = ssrurl[5]\n        password = miss()\n        password = password.ssr4(ssrurl[5])\n        password = base64.urlsafe_b64decode(password)\n        method = ssrurl[3]\n        protocol = ssrurl[2]\n        obfs = ssrurl[4]\n        error = False\n    except:\n        print \"导入失败，请输入正确的SSR地址或输入1手动配置\"\n        error = True\n\nif ssrhead == \"1\":\n    error = True\n    while error:\n        serverip = raw_input(\"请输入服务器IP地址:\\n\")\n        error = checkip(serverip)\n    error = True\n    while error:\n        serverport = raw_input(\"请输入服务器端口:\\n\")\n        error = checkport(serverport)\n    error = True\n    while error:\n        print \"请输入本机代理地址，默认127.0.0.1，使用默认请回车\"\n        localaddress = raw_input()\n        if localaddress == \"\":\n            localaddress = \"127.0.0.1\"\n        error = checkip(localaddress)\n    error = True\n    while error:\n        print \"请输入本机代理端口，默认1080，使用默认请回车\"\n        localport = raw_input()\n        if localport == \"\":\n            localport = \"1080\"\n        error = checkport(localport)\n    password = raw_input(\"请输入密码:\\n\")\n\n    print '''\n0=\"NONE不加密\"\n1=\"table\"\n2=\"rc4\"\n3=\"rc4-md5\"\n4=\"rc4-md5-6\"\n5=\"aes-128-cfb\"\n6=\"aes-192-cfb\"\n7=\"aes-256-cfb\"\n8=\"aes-128-ctr\"\n9=\"aes-192-ctr\"\n10=\"aes-256-ctr\"\n11=\"bf-cfb\"\n12=\"camellia-128-cfb\"\n13=\"camellia-192-cfb\"\n14=\"camellia-256-cfb\"\n15=\"cast5-cfb\"\n16=\"des-cfb\"\n17=\"idea-cfb\"\n18=\"rc2-cfb\"\n19=\"seed-cfb\"\n20=\"salsa20\"\n21=\"chacha20\"\n22=\"chacha20-ietf\"\n\n请输入对应的加密方式数字'''\n    method = [\"\",\"table\",\"rc4\",\"rc4-md5\",\"rc4-md5-6\",\"aes-128-cfb\"\\\n,\"aes-192-cfb\",\"aes-256-cfb\",\"aes-128-ctr\",\"aes-192-ctr\",\"aes-256-ctr\"\\\n,\"bf-cfb\",\"camellia-128-cfb\",\"camellia-192-cfb\",\"camellia-256-cfb\"\\\n,\"cast5-cfb\",\"des-cfb\",\"idea-cfb\",\"rc2-cfb\",\"seed-cfb\",\"salsa20\"\\\n,\"chacha20\",\"chacha20-ietf\"]\n    error = True\n    while error:\n        try:\n            num = input()\n            if num < 0:\n                num = \"错误\"\n            method = method[num]\n            error = False\n        except:\n            print \"输入错误，请输入正确的数字\"\n            error = True\n\n    print '''\n1=\"origin\"\n2=\"verify_simple\"\n3=\"verify_sha1\"\n4=\"auth_sha1\"\n5=\"auth_sha1_v2\"\n6=\"auth_sha1_v4\"\n7=\"auth_aes128_sha1\"\n8=\"auth_aes128_md5\"\n9=\"auth_chain_a\"\n10=\"auth_chain_b\"\n11=\"auth_chain_c\"\n12=\"auth_chain_d\"\n    \n请输入对应的协议插件数字'''\n    protocol = [\"origin\",\"verify_simple\",\"verify_sha1\",\"auth_sha1\",\"auth_sha1_v2\",\"auth_sha1_v4\"\\\n,\"auth_aes128_sha1\",\"auth_aes128_md5\",\"auth_chain_a\",\"auth_chain_b\",\"auth_chain_c\",\"auth_chain_d\"]\n    error = True\n    while error:\n        try:\n            num = input()\n            if num < 1:\n                num = \"错误\"\n            protocol = protocol[num-1]\n            error = False\n        except:\n            print \"请输入正确的数字\"\n            error = True\n\n    protocolparam = raw_input(\"请输入协议参数，不使用参数请回车:\\n\")\n\n    print '''\n1=\"plain\"\n2=\"http_simple\"\n3=\"http_post\"\n4=\"tls_simple\"\n5=\"tls1.2_ticket_auth\"\n6=\"tls1.2_ticket_fastauth\"\n    \n请输入对应的混淆参数的数字'''\n    obfs = [\"plain\",\"http_simple\",\"http_post\",\"tls_simple\"\\\n,\"tls1.2_ticket_auth\",\"tls1.2_ticket_fastauth\"]\n    error = True\n    while error:\n        try:\n            num = input()\n            if num < 1:\n                num = \"错误\"\n            obfs = obfs[num-1]\n            error = False\n        except:\n            print \"请输入正确的数字\"\n            error = True\n\n    print '''\n请输入混淆参数\n示例:baidu.com (不需要加http)\n不使用参数请回车'''\n    obfsparam = raw_input()\n\nelse:\n    error = True\n    while error:\n        print \"请输入本机代理地址，默认127.0.0.1，使用默认请回车\"\n        localaddress = raw_input()\n        if localaddress == \"\":\n            localaddress = \"127.0.0.1\"\n        error = checkip(localaddress)\n    error = True\n    while error:\n        print \"请输入本机代理端口，默认1080，使用默认请回车\"\n        localport = raw_input()\n        if localport == \"\":\n            localport = \"1080\"\n        error = checkport(localport)\n    protocolparam = raw_input(\"请输入协议参数，不使用参数请回车:\\n\")\n    print '''\n请输入混淆参数\n示例:baidu.com (不需要加http)\n不使用参数请回车'''\n    obfsparam = raw_input()\n\nuser='''{\n    \"server\": \"%s\",\n    \"server_ipv6\": \"::\",\n    \"server_port\": %s,\n    \"local_address\": \"%s\",\n    \"local_port\": %s,\n\n    \"password\": \"%s\",\n    \"method\": \"%s\",\n    \"protocol\": \"%s\",\n    \"protocol_param\": \"%s\",\n    \"obfs\": \"%s\",\n    \"obfs_param\": \"%s\",\n    \"speed_limit_per_con\": 0,\n    \"speed_limit_per_user\": 0,\n\n    \"additional_ports\" : {},\n    \"timeout\": 120,\n    \"udp_timeout\": 60,\n    \"dns_ipv6\": false,\n    \"connect_verbose_info\": 0,\n    \"redirect\": \"\",\n    \"fast_open\": false\n}\n'''%(serverip,serverport,localaddress,localport,\\\npassword,method,protocol,protocolparam,obfs,obfsparam)\nwith open('user-config.json','w') as f:\n\tf.write(user.encode(\"utf-8\"))\nprint user+\"\\n\"+\"请检查输入是否有误，若需要修改请重新执行程序。\\\n\\n启动ssr请在终端切换至shadowsocksr/shadowsocks目录执行python local.py -d start\"\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/shadowsocks/version.py",
    "content": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n#\n# Copyright 2017 breakwa11\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\ndef version():\n    return '3.4.0 2017-07-27'\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/stop.sh",
    "content": "#!/bin/bash\n\n# python_ver=$(ls /usr/bin|grep -e \"^python[23]\\.[1-9]\\+$\"|tail -1)\neval $(ps -ef | grep \"[0-9] python server\\\\.py m\" | awk '{print \"kill \"$2}')\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/switchrule.py",
    "content": "def getKeys(key_list):\n\treturn key_list\n\t#return key_list + ['plan'] # append the column name 'plan'\n\ndef isTurnOn(row):\n\treturn True\n\t#return row['plan'] == 'B' # then judge here\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tail.sh",
    "content": "#!/bin/bash\ncd `dirname $0`\ntail -f ssserver.log\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/aes-cfb1.json",
    "content": "{\n    \"server\":\"127.0.0.1\",\n    \"server_port\":8388,\n    \"local_port\":1081,\n    \"password\":\"aes_password\",\n    \"timeout\":60,\n    \"method\":\"aes-256-cfb1\",\n    \"local_address\":\"127.0.0.1\",\n    \"fast_open\":false\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/aes-cfb8.json",
    "content": "{\n    \"server\":\"127.0.0.1\",\n    \"server_port\":8388,\n    \"local_port\":1081,\n    \"password\":\"aes_password\",\n    \"timeout\":60,\n    \"method\":\"aes-256-cfb8\",\n    \"local_address\":\"127.0.0.1\",\n    \"fast_open\":false\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/aes-ctr.json",
    "content": "{\n    \"server\":\"127.0.0.1\",\n    \"server_port\":8388,\n    \"local_port\":1081,\n    \"password\":\"aes_password\",\n    \"timeout\":60,\n    \"method\":\"aes-256-ctr\",\n    \"local_address\":\"127.0.0.1\",\n    \"fast_open\":false\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/aes.json",
    "content": "{\n    \"server\":\"127.0.0.1\",\n    \"server_port\":8388,\n    \"local_port\":1081,\n    \"password\":\"aes_password\",\n    \"timeout\":60,\n    \"method\":\"aes-256-cfb\",\n    \"local_address\":\"127.0.0.1\",\n    \"fast_open\":false\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/assert.sh",
    "content": "#!/bin/bash\n# assert.sh 1.0 - bash unit testing framework\n# Copyright (C) 2009, 2010, 2011, 2012 Robert Lehmann\n#\n# http://github.com/lehmannro/assert.sh\n#\n# This program is free software: you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as published\n# by the Free Software Foundation, either version 3 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU Lesser General Public License for more details.\n#\n# You should have received a copy of the GNU Lesser General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\nexport DISCOVERONLY=${DISCOVERONLY:-}\nexport DEBUG=${DEBUG:-}\nexport STOP=${STOP:-}\nexport INVARIANT=${INVARIANT:-}\nexport CONTINUE=${CONTINUE:-}\n\nargs=\"$(getopt -n \"$0\" -l \\\n    verbose,help,stop,discover,invariant,continue vhxdic $*)\" \\\n|| exit -1\nfor arg in $args; do\n    case \"$arg\" in\n        -h)\n            echo \"$0 [-vxidc]\" \\\n                \"[--verbose] [--stop] [--invariant] [--discover] [--continue]\"\n            echo \"`sed 's/./ /g' <<< \"$0\"` [-h] [--help]\"\n            exit 0;;\n        --help)\n            cat <<EOF\nUsage: $0 [options]\nLanguage-agnostic unit tests for subprocesses.\n\nOptions:\n  -v, --verbose    generate output for every individual test case\n  -x, --stop       stop running tests after the first failure\n  -i, --invariant  do not measure timings to remain invariant between runs\n  -d, --discover   collect test suites only, do not run any tests\n  -c, --continue   do not modify exit code to test suite status\n  -h               show brief usage information and exit\n  --help           show this help message and exit\nEOF\n            exit 0;;\n        -v|--verbose)\n            DEBUG=1;;\n        -x|--stop)\n            STOP=1;;\n        -i|--invariant)\n            INVARIANT=1;;\n        -d|--discover)\n            DISCOVERONLY=1;;\n        -c|--continue)\n            CONTINUE=1;;\n    esac\ndone\n\nprintf -v _indent \"\\n\\t\" # local format helper\n\n_assert_reset() {\n    tests_ran=0\n    tests_failed=0\n    tests_errors=()\n    tests_starttime=\"$(date +%s.%N)\" # seconds_since_epoch.nanoseconds\n}\n\nassert_end() {\n    # assert_end [suite ..]\n    tests_endtime=\"$(date +%s.%N)\"\n    tests=\"$tests_ran ${*:+$* }tests\"\n    [[ -n \"$DISCOVERONLY\" ]] && echo \"collected $tests.\" && _assert_reset && return\n    [[ -n \"$DEBUG\" ]] && echo\n    [[ -z \"$INVARIANT\" ]] && report_time=\" in $(bc \\\n        <<< \"${tests_endtime%.N} - ${tests_starttime%.N}\" \\\n        | sed -e 's/\\.\\([0-9]\\{0,3\\}\\)[0-9]*/.\\1/' -e 's/^\\./0./')s\" \\\n        || report_time=\n\n    if [[ \"$tests_failed\" -eq 0 ]]; then\n        echo \"all $tests passed$report_time.\"\n    else\n        for error in \"${tests_errors[@]}\"; do echo \"$error\"; done\n        echo \"$tests_failed of $tests failed$report_time.\"\n    fi\n    tests_failed_previous=$tests_failed\n    [[ $tests_failed -gt 0 ]] && tests_suite_status=1\n    _assert_reset\n    return $tests_failed_previous\n}\n\nassert() {\n    # assert <command> <expected stdout> [stdin]\n    (( tests_ran++ )) || :\n    [[ -n \"$DISCOVERONLY\" ]] && return || true\n    # printf required for formatting\n    printf -v expected \"x${2:-}\" # x required to overwrite older results\n    result=\"$(eval 2>/dev/null $1 <<< ${3:-})\" || true\n    # Note: $expected is already decorated\n    if [[ \"x$result\" == \"$expected\" ]]; then\n        [[ -n \"$DEBUG\" ]] && echo -n . || true\n        return\n    fi\n    result=\"$(sed -e :a -e '$!N;s/\\n/\\\\n/;ta' <<< \"$result\")\"\n    [[ -z \"$result\" ]] && result=\"nothing\" || result=\"\\\"$result\\\"\"\n    [[ -z \"$2\" ]] && expected=\"nothing\" || expected=\"\\\"$2\\\"\"\n    _assert_fail \"expected $expected${_indent}got $result\" \"$1\" \"$3\"\n}\n\nassert_raises() {\n    # assert_raises <command> <expected code> [stdin]\n    (( tests_ran++ )) || :\n    [[ -n \"$DISCOVERONLY\" ]] && return || true\n    status=0\n    (eval $1 <<< ${3:-}) > /dev/null 2>&1 || status=$?\n    expected=${2:-0}\n    if [[ \"$status\" -eq \"$expected\" ]]; then\n        [[ -n \"$DEBUG\" ]] && echo -n . || true\n        return\n    fi\n    _assert_fail \"program terminated with code $status instead of $expected\" \"$1\" \"$3\"\n}\n\n_assert_fail() {\n    # _assert_fail <failure> <command> <stdin>\n    [[ -n \"$DEBUG\" ]] && echo -n X\n    report=\"test #$tests_ran \\\"$2${3:+ <<< $3}\\\" failed:${_indent}$1\"\n    if [[ -n \"$STOP\" ]]; then\n        [[ -n \"$DEBUG\" ]] && echo\n        echo \"$report\"\n        exit 1\n    fi\n    tests_errors[$tests_failed]=\"$report\"\n    (( tests_failed++ )) || :\n}\n\n_assert_reset\n: ${tests_suite_status:=0}  # remember if any of the tests failed so far\n_assert_cleanup() {\n    local status=$?\n    # modify exit code if it's not already non-zero\n    [[ $status -eq 0 && -z $CONTINUE ]] && exit $tests_suite_status\n}\ntrap _assert_cleanup EXIT\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/chacha20.json",
    "content": "{\n    \"server\":\"127.0.0.1\",\n    \"server_port\":8388,\n    \"local_port\":1081,\n    \"password\":\"salsa20_password\",\n    \"timeout\":60,\n    \"method\":\"chacha20\",\n    \"local_address\":\"127.0.0.1\",\n    \"fast_open\":false\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/client-multi-server-ip.json",
    "content": "{\n    \"server\":[\"127.0.0.1\", \"127.0.0.1\"],\n    \"server_port\":8388,\n    \"local_port\":1081,\n    \"password\":\"aes_password\",\n    \"timeout\":60,\n    \"method\":\"aes-256-cfb\",\n    \"local_address\":\"127.0.0.1\",\n    \"fast_open\":false\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/coverage_server.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nif __name__ == '__main__':\n    import tornado.ioloop\n    import tornado.web\n    import urllib\n\n    class MainHandler(tornado.web.RequestHandler):\n        def get(self, project):\n            try:\n                with open('/tmp/%s-coverage' % project, 'rb') as f:\n                    coverage = f.read().strip()\n                    n = int(coverage.strip('%'))\n                    if n >= 80:\n                        color = 'brightgreen'\n                    else:\n                        color = 'yellow'\n                    self.redirect(('https://img.shields.io/badge/'\n                                   'coverage-%s-%s.svg'\n                                   '?style=flat') %\n                                  (urllib.quote(coverage), color))\n            except IOError:\n                raise tornado.web.HTTPError(404)\n\n    application = tornado.web.Application([\n        (r\"/([a-zA-Z0-9\\-_]+)\", MainHandler),\n    ])\n\n    if __name__ == \"__main__\":\n        application.listen(8888, address='127.0.0.1')\n        tornado.ioloop.IOLoop.instance().start()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/fastopen.json",
    "content": "{\n    \"server\":\"127.0.0.1\",\n    \"server_port\":8388,\n    \"local_port\":1081,\n    \"password\":\"fastopen_password\",\n    \"timeout\":60,\n    \"method\":\"aes-256-cfb\",\n    \"local_address\":\"127.0.0.1\",\n    \"fast_open\":true\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/ipv6-client-side.json",
    "content": "{\n    \"server\":\"::1\",\n    \"server_port\":8388,\n    \"local_port\":1081,\n    \"password\":\"aes_password\",\n    \"timeout\":60,\n    \"method\":\"aes-256-cfb\",\n    \"local_address\":\"127.0.0.1\",\n    \"fast_open\":false\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/ipv6.json",
    "content": "{\n    \"server\":\"::\",\n    \"server_port\":8388,\n    \"local_port\":1081,\n    \"password\":\"aes_password\",\n    \"timeout\":60,\n    \"method\":\"aes-256-cfb\",\n    \"local_address\":\"127.0.0.1\",\n    \"fast_open\":false\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/jenkins.sh",
    "content": "#!/bin/bash\n\nresult=0\n\nfunction run_test {\n    printf '\\e[0;36m'\n    echo \"running test: $command $@\"\n    printf '\\e[0m'\n\n    $command \"$@\"\n    status=$?\n    if [ $status -ne 0 ]; then\n        printf '\\e[0;31m'\n        echo \"test failed: $command $@\"\n        printf '\\e[0m'\n        echo\n        result=1\n    else\n        printf '\\e[0;32m'\n        echo OK\n        printf '\\e[0m'\n        echo\n    fi\n    return 0\n}\n\npython --version\ncoverage erase\nmkdir tmp\nrun_test pep8 --ignore=E402 .\nrun_test pyflakes .\nrun_test coverage run tests/nose_plugin.py -v\nrun_test python setup.py sdist\nrun_test tests/test_daemon.sh\nrun_test python tests/test.py --with-coverage -c tests/aes.json\nrun_test python tests/test.py --with-coverage -c tests/aes-ctr.json\nrun_test python tests/test.py --with-coverage -c tests/aes-cfb1.json\nrun_test python tests/test.py --with-coverage -c tests/aes-cfb8.json\nrun_test python tests/test.py --with-coverage -c tests/rc4-md5.json\nrun_test python tests/test.py --with-coverage -c tests/salsa20.json\nrun_test python tests/test.py --with-coverage -c tests/chacha20.json\nrun_test python tests/test.py --with-coverage -c tests/table.json\nrun_test python tests/test.py --with-coverage -c tests/server-multi-ports.json\nrun_test python tests/test.py --with-coverage -s tests/aes.json -c tests/client-multi-server-ip.json\nrun_test python tests/test.py --with-coverage -s tests/server-multi-passwd.json -c tests/server-multi-passwd-client-side.json\nrun_test python tests/test.py --with-coverage -c tests/workers.json\nrun_test python tests/test.py --with-coverage -s tests/ipv6.json -c tests/ipv6-client-side.json\nrun_test python tests/test.py --with-coverage -b \"-m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -q\" -a \"-m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -l 1081 -vv\"\nrun_test python tests/test.py --with-coverage -b \"-m aes-256-cfb -k testrc4 -s 127.0.0.1 -p 8388 --workers 1\" -a \"-m aes-256-cfb -k testrc4 -s 127.0.0.1 -p 8388 -l 1081 -t 30 -qq -b 127.0.0.1\"\nrun_test python tests/test.py --with-coverage --should-fail --url=\"http://127.0.0.1/\" -b \"-m aes-256-cfb -k testrc4 -s 127.0.0.1 -p 8388 --forbidden-ip=127.0.0.1,::1,8.8.8.8\" -a \"-m aes-256-cfb -k testrc4 -s 127.0.0.1 -p 8388 -l 1081 -t 30 -b 127.0.0.1\"\n\n# test if DNS works\nrun_test python tests/test.py --with-coverage -c tests/aes.json --url=\"https://clients1.google.com/generate_204\"\n\n# test localhost is in the forbidden list by default\nrun_test python tests/test.py --with-coverage --should-fail --tcp-only --url=\"http://127.0.0.1/\" -b \"-m aes-256-cfb -k testrc4 -s 127.0.0.1 -p 8388\" -a \"-m aes-256-cfb -k testrc4 -s 127.0.0.1 -p 8388 -l 1081 -t 30 -b 127.0.0.1\"\n\n# test localhost is available when forbidden list is empty\nrun_test python tests/test.py --with-coverage --tcp-only --url=\"http://127.0.0.1/\" -b \"-m aes-256-cfb -k testrc4 -s 127.0.0.1 -p 8388 --forbidden-ip=\" -a \"-m aes-256-cfb -k testrc4 -s 127.0.0.1 -p 8388 -l 1081 -t 30 -b 127.0.0.1\"\n\nif [ -f /proc/sys/net/ipv4/tcp_fastopen ] ; then\n    if [ 3 -eq `cat /proc/sys/net/ipv4/tcp_fastopen` ] ; then\n        # we have to run it twice:\n        # the first time there's no syn cookie\n        # the second time there is syn cookie\n        run_test python tests/test.py --with-coverage -c tests/fastopen.json\n        run_test python tests/test.py --with-coverage -c tests/fastopen.json\n    fi\nfi\n\nrun_test tests/test_large_file.sh\nrun_test tests/test_udp_src.sh\nrun_test tests/test_command.sh\n\ncoverage combine && coverage report --include=shadowsocks/*\nrm -rf htmlcov\nrm -rf tmp\ncoverage html --include=shadowsocks/*\n\ncoverage report --include=shadowsocks/* | tail -n1 | rev | cut -d' ' -f 1 | rev > /tmp/shadowsocks-coverage\n\nexit $result\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/libsodium/install.sh",
    "content": "#!/bin/bash\n\nif [ ! -d libsodium-1.0.1 ]; then\n    wget https://github.com/jedisct1/libsodium/releases/download/1.0.1/libsodium-1.0.1.tar.gz || exit 1\n    tar xf libsodium-1.0.1.tar.gz || exit 1\nfi\npushd libsodium-1.0.1\n./configure && make -j2 && make install || exit 1\nsudo ldconfig\npopd\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/nose_plugin.py",
    "content": "#!/usr/bin/env python\n#\n# Copyright 2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nimport nose\nfrom nose.plugins.base import Plugin\n\n\nclass ExtensionPlugin(Plugin):\n\n    name = \"ExtensionPlugin\"\n\n    def options(self, parser, env):\n        Plugin.options(self, parser, env)\n\n    def configure(self, options, config):\n        Plugin.configure(self, options, config)\n        self.enabled = True\n\n    def wantFile(self, file):\n        return file.endswith('.py')\n\n    def wantDirectory(self, directory):\n        return True\n\n    def wantModule(self, file):\n        return True\n\n\nif __name__ == '__main__':\n    nose.main(addplugins=[ExtensionPlugin()])\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/rc4-md5.json",
    "content": "{\n    \"server\":\"127.0.0.1\",\n    \"server_port\":8388,\n    \"local_port\":1081,\n    \"password\":\"aes_password\",\n    \"timeout\":60,\n    \"method\":\"rc4-md5\",\n    \"local_address\":\"127.0.0.1\",\n    \"fast_open\":false\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/salsa20-ctr.json",
    "content": "{\n    \"server\":\"127.0.0.1\",\n    \"server_port\":8388,\n    \"local_port\":1081,\n    \"password\":\"salsa20_password\",\n    \"timeout\":60,\n    \"method\":\"salsa20-ctr\",\n    \"local_address\":\"127.0.0.1\",\n    \"fast_open\":false\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/salsa20.json",
    "content": "{\n    \"server\":\"127.0.0.1\",\n    \"server_port\":8388,\n    \"local_port\":1081,\n    \"password\":\"salsa20_password\",\n    \"timeout\":60,\n    \"method\":\"salsa20\",\n    \"local_address\":\"127.0.0.1\",\n    \"fast_open\":false\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/server-multi-passwd-client-side.json",
    "content": "{\n    \"server\": \"127.0.0.1\",\n    \"server_port\": \"8385\",\n    \"local_port\": 1081,\n    \"password\": \"foobar5\",\n    \"timeout\": 60,\n    \"method\": \"aes-256-cfb\"\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/server-multi-passwd-table.json",
    "content": "{\n    \"server\": \"127.0.0.1\",\n    \"server_port\": 8384,\n    \"local_port\": 1081,\n    \"password\": \"foobar4\",\n    \"port_password\": {\n        \"8381\": \"foobar1\",\n        \"8382\": \"foobar2\",\n        \"8383\": \"foobar3\",\n        \"8384\": \"foobar4\",\n        \"8385\": \"foobar5\",\n        \"8386\": \"foobar6\",\n        \"8387\": \"foobar7\",\n        \"8388\": \"foobar8\",\n        \"8389\": \"foobar9\"\n    },\n    \"timeout\": 60,\n    \"method\": \"table\"\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/server-multi-passwd.json",
    "content": "{\n    \"server\": \"127.0.0.1\",\n    \"local_port\": 1081,\n    \"port_password\": {\n        \"8381\": \"foobar1\",\n        \"8382\": \"foobar2\",\n        \"8383\": \"foobar3\",\n        \"8384\": \"foobar4\",\n        \"8385\": \"foobar5\",\n        \"8386\": \"foobar6\",\n        \"8387\": \"foobar7\",\n        \"8388\": \"foobar8\",\n        \"8389\": \"foobar9\"\n    },\n    \"timeout\": 60,\n    \"method\": \"aes-256-cfb\"\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/server-multi-ports.json",
    "content": "{\n    \"server\": \"127.0.0.1\",\n    \"server_port\": [8384, 8345, 8346, 8347],\n    \"local_port\": 1081,\n    \"password\": \"foobar4\",\n    \"timeout\": 60,\n    \"method\": \"aes-256-cfb\"\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/setup_tc.sh",
    "content": "#!/bin/bash\n\nDEV=lo\nPORT=8388\nDELAY=100ms\n\ntype tc 2> /dev/null && (\n    tc qdisc add dev $DEV root handle 1: htb\n    tc class add dev $DEV parent 1: classid 1:1 htb rate 2mbps\n    tc class add dev $DEV parent 1:1 classid 1:6 htb rate 2mbps ceil 1mbps prio 0\n    tc filter add dev $DEV parent 1:0 prio 0 protocol ip handle 6 fw flowid 1:6\n\n    tc filter add dev $DEV parent 1:0 protocol ip u32 match ip dport $PORT 0xffff flowid 1:6\n    tc filter add dev $DEV parent 1:0 protocol ip u32 match ip sport $PORT 0xffff flowid 1:6\n\n    tc qdisc show dev lo\n)\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/socksify/install.sh",
    "content": "#!/bin/bash\n\nif [ ! -d dante-1.4.0 ]; then\n    wget http://www.inet.no/dante/files/dante-1.4.0.tar.gz || exit 1\n    tar xf dante-1.4.0.tar.gz || exit 1\nfi\npushd dante-1.4.0\n./configure && make -j4 && make install || exit 1\npopd\ncp tests/socksify/socks.conf /etc/ || exit 1\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/socksify/socks.conf",
    "content": "route {\n        from: 0.0.0.0/0 to: 0.0.0.0/0 via: 127.0.0.1 port = 1081\n        proxyprotocol: socks_v5\n        method: none\n}"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/table.json",
    "content": "{\n    \"server\":\"127.0.0.1\",\n    \"server_port\":8388,\n    \"local_port\":1081,\n    \"password\":\"table_password\",\n    \"timeout\":60,\n    \"method\":\"table\",\n    \"local_address\":\"127.0.0.1\",\n    \"fast_open\":false\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/test.py",
    "content": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n#\n# Copyright 2015 clowwindy\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\"); you may\n# not use this file except in compliance with the License. You may obtain\n# a copy of the License at\n#\n#     http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS, WITHOUT\n# WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the\n# License for the specific language governing permissions and limitations\n# under the License.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport sys\nimport os\nimport signal\nimport select\nimport time\nimport argparse\nfrom subprocess import Popen, PIPE\n\npython = ['python']\n\ndefault_url = 'http://localhost/'\n\nparser = argparse.ArgumentParser(description='test Shadowsocks')\nparser.add_argument('-c', '--client-conf', type=str, default=None)\nparser.add_argument('-s', '--server-conf', type=str, default=None)\nparser.add_argument('-a', '--client-args', type=str, default=None)\nparser.add_argument('-b', '--server-args', type=str, default=None)\nparser.add_argument('--with-coverage', action='store_true', default=None)\nparser.add_argument('--should-fail', action='store_true', default=None)\nparser.add_argument('--tcp-only', action='store_true', default=None)\nparser.add_argument('--url', type=str, default=default_url)\nparser.add_argument('--dns', type=str, default='8.8.8.8')\n\nconfig = parser.parse_args()\n\nif config.with_coverage:\n    python = ['coverage', 'run', '-p']\n\nclient_args = python + ['shadowsocks/local.py', '-v']\nserver_args = python + ['shadowsocks/server.py', '-v']\n\nif config.client_conf:\n    client_args.extend(['-c', config.client_conf])\n    if config.server_conf:\n        server_args.extend(['-c', config.server_conf])\n    else:\n        server_args.extend(['-c', config.client_conf])\nif config.client_args:\n    client_args.extend(config.client_args.split())\n    if config.server_args:\n        server_args.extend(config.server_args.split())\n    else:\n        server_args.extend(config.client_args.split())\nif config.url == default_url:\n    server_args.extend(['--forbidden-ip', ''])\n\np1 = Popen(server_args, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)\np2 = Popen(client_args, stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)\np3 = None\np4 = None\np3_fin = False\np4_fin = False\n\n# 1 shadowsocks started\n# 2 curl started\n# 3 curl finished\n# 4 dig started\n# 5 dig finished\nstage = 1\n\ntry:\n    local_ready = False\n    server_ready = False\n    fdset = [p1.stdout, p2.stdout, p1.stderr, p2.stderr]\n    while True:\n        r, w, e = select.select(fdset, [], fdset)\n        if e:\n            break\n\n        for fd in r:\n            line = fd.readline()\n            if not line:\n                if stage == 2 and fd == p3.stdout:\n                    stage = 3\n                if stage == 4 and fd == p4.stdout:\n                    stage = 5\n            if bytes != str:\n                line = str(line, 'utf8')\n            sys.stderr.write(line)\n            if line.find('starting local') >= 0:\n                local_ready = True\n            if line.find('starting server') >= 0:\n                server_ready = True\n\n        if stage == 1:\n            time.sleep(2)\n\n            p3 = Popen(['curl', config.url, '-v', '-L',\n                        '--socks5-hostname', '127.0.0.1:1081',\n                        '-m', '15', '--connect-timeout', '10'],\n                       stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)\n            if p3 is not None:\n                fdset.append(p3.stdout)\n                fdset.append(p3.stderr)\n                stage = 2\n            else:\n                sys.exit(1)\n\n        if stage == 3 and p3 is not None:\n            fdset.remove(p3.stdout)\n            fdset.remove(p3.stderr)\n            r = p3.wait()\n            if config.should_fail:\n                if r == 0:\n                    sys.exit(1)\n            else:\n                if r != 0:\n                    sys.exit(1)\n            if config.tcp_only:\n                break\n            p4 = Popen(['socksify', 'dig', '@%s' % config.dns,\n                        'www.google.com'],\n                       stdin=PIPE, stdout=PIPE, stderr=PIPE, close_fds=True)\n            if p4 is not None:\n                fdset.append(p4.stdout)\n                fdset.append(p4.stderr)\n                stage = 4\n            else:\n                sys.exit(1)\n\n        if stage == 5:\n            r = p4.wait()\n            if config.should_fail:\n                if r == 0:\n                    sys.exit(1)\n                print('test passed (expecting failure)')\n            else:\n                if r != 0:\n                    sys.exit(1)\n                print('test passed')\n            break\nfinally:\n    for p in [p1, p2]:\n        try:\n            os.kill(p.pid, signal.SIGINT)\n            os.waitpid(p.pid, 0)\n        except OSError:\n            pass\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/test_command.sh",
    "content": "#!/bin/bash\n\n. tests/assert.sh\n\nPYTHON=\"coverage run -p\"\nLOCAL=\"$PYTHON shadowsocks/local.py\"\nSERVER=\"$PYTHON shadowsocks/server.py\"\n\nassert \"$LOCAL --version 2>&1 | grep Shadowsocks | awk -F\\\" \\\" '{print \\$1}'\" \"Shadowsocks\"\nassert \"$SERVER --version 2>&1 | grep Shadowsocks | awk -F\\\" \\\" '{print \\$1}'\" \"Shadowsocks\"\n\n\nassert \"$LOCAL 2>&1 -m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -d start | grep WARNING |  awk -F\\\"WARNING\\\" '{print \\$2}'\" \"  warning: server set to listen on 127.0.0.1:8388, are you sure?\"\n$LOCAL 2>/dev/null 1>/dev/null -m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -d stop\n\nassert \"$LOCAL 2>&1 -m rc4-md5 -k testrc4 -s 0.0.0.0 -p 8388 -t10 -d start | grep WARNING |  awk -F\\\"WARNING\\\" '{print \\$2}'\" \"  warning: your timeout 10 seems too short\"\n$LOCAL 2>/dev/null 1>/dev/null -m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -d stop\n\nassert \"$LOCAL 2>&1 -m rc4-md5 -k testrc4 -s 0.0.0.0 -p 8388 -t1000 -d start | grep WARNING |  awk -F\\\"WARNING\\\" '{print \\$2}'\" \"  warning: your timeout 1000 seems too long\"\n$LOCAL 2>/dev/null 1>/dev/null -m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -d stop\n\nassert \"$LOCAL 2>&1 -m rc4 -k testrc4 -s 0.0.0.0 -p 8388 -d start | grep WARNING |  awk -F\\\"WARNING\\\" '{print \\$2}'\" \"  warning: RC4 is not safe; please use a safer cipher, like AES-256-CFB\"\n$LOCAL 2>/dev/null 1>/dev/null -m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -d stop\n\nassert \"$LOCAL 2>&1 -m rc4-md5 -k mypassword -s 0.0.0.0 -p 8388 -d start | grep ERROR |  awk -F\\\"ERROR\\\" '{print \\$2}'\" \"    DON'T USE DEFAULT PASSWORD! Please change it in your config.json!\"\n$LOCAL 2>/dev/null 1>/dev/null -m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -d stop\n\n\nassert \"$SERVER 2>&1 --forbidden-ip 127.0.0.1/4a -m rc4-md5 -k 12345 -p 8388 -s 0.0.0.0 -d start | grep ERROR |  awk -F\\\"ERROR\\\" '{print \\$2}'\" \": Not a valid CIDR notation: 127.0.0.1/4a\"\n$LOCAL 2>/dev/null 1>/dev/null -m rc4-md5 -k testrc4 -s 127.0.0.1 -p 8388 -d stop\n\nassert_end command\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/test_daemon.sh",
    "content": "#!/bin/bash\n\nfunction run_test {\n    expected=$1\n    shift\n    echo \"running test: $command $@\"\n    $command $@\n    status=$?\n    if [ $status -ne $expected ]; then\n        echo \"exit $status != $expected\"\n        exit 1\n    fi\n    echo \"exit status $status == $expected\"\n    echo OK\n    return\n}\n\nfor module in local server\ndo\n\ncommand=\"coverage run -p shadowsocks/$module.py\"\n\nmkdir -p tmp\n\nrun_test 0 -c tests/aes.json -d stop --pid-file tmp/shadowsocks.pid --log-file tmp/shadowsocks.log\n\nrun_test 0 -c tests/aes.json -d start --pid-file tmp/shadowsocks.pid --log-file tmp/shadowsocks.log\nrun_test 0 -c tests/aes.json -d stop --pid-file tmp/shadowsocks.pid --log-file tmp/shadowsocks.log\n\nrun_test 0 -c tests/aes.json -d start --pid-file tmp/shadowsocks.pid --log-file tmp/shadowsocks.log\nrun_test 1 -c tests/aes.json -d start --pid-file tmp/shadowsocks.pid --log-file tmp/shadowsocks.log\nrun_test 0 -c tests/aes.json -d stop --pid-file tmp/shadowsocks.pid --log-file tmp/shadowsocks.log\n\nrun_test 0 -c tests/aes.json -d start --pid-file tmp/shadowsocks.pid --log-file tmp/shadowsocks.log\nrun_test 0 -c tests/aes.json -d restart --pid-file tmp/shadowsocks.pid --log-file tmp/shadowsocks.log\nrun_test 0 -c tests/aes.json -d stop --pid-file tmp/shadowsocks.pid --log-file tmp/shadowsocks.log\n\nrun_test 0 -c tests/aes.json -d restart --pid-file tmp/shadowsocks.pid --log-file tmp/shadowsocks.log\nrun_test 0 -c tests/aes.json -d stop --pid-file tmp/shadowsocks.pid --log-file tmp/shadowsocks.log\n\nrun_test 1 -c tests/aes.json -d start --pid-file tmp/not_exist/shadowsocks.pid --log-file tmp/shadowsocks.log\n\ndone\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/test_large_file.sh",
    "content": "#!/bin/bash\n\nPYTHON=\"coverage run -p\"\nURL=http://127.0.0.1/file\n\nmkdir -p tmp\n\n$PYTHON shadowsocks/local.py -c tests/aes.json &\nLOCAL=$!\n\n$PYTHON shadowsocks/server.py -c tests/aes.json --forbidden-ip \"\" &\nSERVER=$!\n\nsleep 3\n\ntime curl -o tmp/expected $URL\ntime curl -o tmp/result --socks5-hostname 127.0.0.1:1081 $URL\n\nkill -s SIGINT $LOCAL\nkill -s SIGINT $SERVER\n\nsleep 2\n\ndiff tmp/expected tmp/result || exit 1\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/test_udp_src.py",
    "content": "#!/usr/bin/python\n\nimport socket\nimport socks\n\n\nSERVER_IP = '127.0.0.1'\nSERVER_PORT = 1081\n\n\nif __name__ == '__main__':\n    # Test 1: same source port IPv4\n    sock_out = socks.socksocket(socket.AF_INET, socket.SOCK_DGRAM,\n                                socket.SOL_UDP)\n    sock_out.set_proxy(socks.SOCKS5, SERVER_IP, SERVER_PORT)\n    sock_out.bind(('127.0.0.1', 9000))\n\n    sock_in1 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM,\n                             socket.SOL_UDP)\n    sock_in2 = socket.socket(socket.AF_INET, socket.SOCK_DGRAM,\n                             socket.SOL_UDP)\n\n    sock_in1.bind(('127.0.0.1', 9001))\n    sock_in2.bind(('127.0.0.1', 9002))\n\n    sock_out.sendto(b'data', ('127.0.0.1', 9001))\n    result1 = sock_in1.recvfrom(8)\n\n    sock_out.sendto(b'data', ('127.0.0.1', 9002))\n    result2 = sock_in2.recvfrom(8)\n\n    sock_out.close()\n    sock_in1.close()\n    sock_in2.close()\n\n    # make sure they're from the same source port\n    assert result1 == result2\n\n    # Test 2: same source port IPv6\n    # try again from the same port but IPv6\n    sock_out = socks.socksocket(socket.AF_INET, socket.SOCK_DGRAM,\n                                socket.SOL_UDP)\n    sock_out.set_proxy(socks.SOCKS5, SERVER_IP, SERVER_PORT)\n    sock_out.bind(('127.0.0.1', 9000))\n\n    sock_in1 = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM,\n                             socket.SOL_UDP)\n    sock_in2 = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM,\n                             socket.SOL_UDP)\n\n    sock_in1.bind(('::1', 9001))\n    sock_in2.bind(('::1', 9002))\n\n    sock_out.sendto(b'data', ('::1', 9001))\n    result1 = sock_in1.recvfrom(8)\n\n    sock_out.sendto(b'data', ('::1', 9002))\n    result2 = sock_in2.recvfrom(8)\n\n    sock_out.close()\n    sock_in1.close()\n    sock_in2.close()\n\n    # make sure they're from the same source port\n    assert result1 == result2\n\n    # Test 3: different source ports IPv6\n    sock_out = socks.socksocket(socket.AF_INET, socket.SOCK_DGRAM,\n                                socket.SOL_UDP)\n    sock_out.set_proxy(socks.SOCKS5, SERVER_IP, SERVER_PORT)\n    sock_out.bind(('127.0.0.1', 9003))\n\n    sock_in1 = socket.socket(socket.AF_INET6, socket.SOCK_DGRAM,\n                             socket.SOL_UDP)\n    sock_in1.bind(('::1', 9001))\n    sock_out.sendto(b'data', ('::1', 9001))\n    result3 = sock_in1.recvfrom(8)\n\n    # make sure they're from different source ports\n    assert result1 != result3\n\n    sock_out.close()\n    sock_in1.close()\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/test_udp_src.sh",
    "content": "#!/bin/bash\n\nPYTHON=\"coverage run -p\"\n\nmkdir -p tmp\n\n$PYTHON shadowsocks/local.py -c tests/aes.json -v &\nLOCAL=$!\n\n$PYTHON shadowsocks/server.py -c tests/aes.json --forbidden-ip \"\" -v &\nSERVER=$!\n\nsleep 3\n\npython tests/test_udp_src.py\nr=$?\n\nkill -s SIGINT $LOCAL\nkill -s SIGINT $SERVER\n\nsleep 2\n\nexit $r\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/tests/workers.json",
    "content": "{\n    \"server\":\"127.0.0.1\",\n    \"server_port\":8388,\n    \"local_port\":1081,\n    \"password\":\"workers_password\",\n    \"timeout\":60,\n    \"method\":\"aes-256-cfb\",\n    \"local_address\":\"127.0.0.1\",\n    \"workers\": 4\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/user-config.json",
    "content": "{\n    \"server\": \"0.0.0.0\",\n    \"server_ipv6\": \"::\",\n    \"server_port\": 8388,\n    \"local_address\": \"127.0.0.1\",\n    \"local_port\": 1080,\n\n    \"password\": \"m\",\n    \"method\": \"aes-128-ctr\",\n    \"protocol\": \"auth_aes128_md5\",\n    \"protocol_param\": \"\",\n    \"obfs\": \"tls1.2_ticket_auth_compatible\",\n    \"obfs_param\": \"\",\n    \"speed_limit_per_con\": 0,\n    \"speed_limit_per_user\": 0,\n\n    \"additional_ports\" : {},\n    \"additional_ports_only\" : false,\n    \"timeout\": 120,\n    \"udp_timeout\": 60,\n    \"dns_ipv6\": false,\n    \"connect_verbose_info\": 0,\n    \"redirect\": \"\",\n    \"fast_open\": false\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/userapiconfig.py",
    "content": "﻿# Config\nAPI_INTERFACE = 'mudbjson' #mudbjson, sspanelv2, sspanelv3, sspanelv3ssr, glzjinmod, legendsockssr, muapiv2(not support)\nUPDATE_TIME = 60\nSERVER_PUB_ADDR = '0.0.0.0' # mujson_mgr need this to generate ssr link\n\n#mudb\nMUDB_FILE = '/etc/config/ssr_mudb_server.json'\n\n# Mysql\nMYSQL_CONFIG = 'usermysql.json'\n\n# API\nMUAPI_CONFIG = 'usermuapi.json'\n\n\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/usermysql.json",
    "content": "{\n    \"host\": \"127.0.0.1\",\n    \"port\": 3306,\n    \"user\": \"ss\",\n    \"password\": \"pass\",\n    \"db\": \"sspanel\",\n    \"node_id\": 0,\n    \"transfer_mul\": 1.0,\n    \"ssl_enable\": 0,\n    \"ssl_ca\": \"\",\n    \"ssl_cert\": \"\",\n    \"ssl_key\": \"\"\n}\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/utils/autoban.py",
    "content": "#!/usr/bin/python\n# -*- coding: utf-8 -*-\n\n# Copyright (c) 2015 clowwindy\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to deal\n# in the Software without restriction, including without limitation the rights\n# to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n# copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n# AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n# LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n# OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n# SOFTWARE.\n\nfrom __future__ import absolute_import, division, print_function, \\\n    with_statement\n\nimport os\nimport sys\nimport argparse\n\nif __name__ == '__main__':\n    parser = argparse.ArgumentParser(description='See README')\n    parser.add_argument('-c', '--count', default=3, type=int,\n                        help='with how many failure times it should be '\n                             'considered as an attack')\n    config = parser.parse_args()\n    ips = {}\n    banned = set()\n    for line in sys.stdin:\n        if 'can not parse header when' in line:\n            ip = line.split()[-1].split(':')[0]\n            if ip not in ips:\n                ips[ip] = 1\n                print(ip)\n                sys.stdout.flush()\n            else:\n                ips[ip] += 1\n            if ip not in banned and ips[ip] >= config.count:\n                banned.add(ip)\n                cmd = 'iptables -A INPUT -s %s -j DROP' % ip\n                print(cmd, file=sys.stderr)\n                sys.stderr.flush()\n                os.system(cmd)\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ssr_mudb_server/utils/fail2ban/shadowsocks.conf",
    "content": "[Definition]\n\n_daemon = shadowsocks\n\nfailregex = ^\\s+ERROR\\s+can not parse header when handling connection from <HOST>:\\d+$\n"
  },
  {
    "path": "luci-app-ssr-mudb-server/root/usr/share/ucitrack/luci-app-ssr-mudb-server.json",
    "content": "{\n\t\"config\": \"ssr_mudb_server\",\n\t\"init\": \"ssr_mudb_server\"\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/chinadns-ng/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2023 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=chinadns-ng\nPKG_VERSION:=2025.08.09\nPKG_RELEASE:=1\n\nifeq ($(ARCH),aarch64)\n  ifneq (,$(filter $(BOARD),rockchip qualcommax))\n    PKG_ARCH:=$(PKG_NAME)+wolfssl@aarch64-linux-musl@generic+v8a@fast+lto\n    PKG_HASH:=3fe0217615dd7060b7287d2b6b31d2a0b364137398bfb335a03bead322eac716\n  else\n    PKG_ARCH:=$(PKG_NAME)+wolfssl_noasm@aarch64-linux-musl@generic+v8a@fast+lto\n    PKG_HASH:=42ddd494200ec6d88b35902927688d316bc23e06e6c08d9e01eb2412196ab845\n  endif\nelse ifeq ($(ARCH),arm)\n  # Referred to golang/golang-values.mk\n  ARM_CPU_FEATURES:=$(word 2,$(subst +,$(space),$(call qstrip,$(CONFIG_CPU_TYPE))))\n  ifeq ($(ARM_CPU_FEATURES),)\n    PKG_ARCH:=$(PKG_NAME)+wolfssl@arm-linux-musleabi@generic+v5t+soft_float@fast+lto\n    PKG_HASH:=46ce65b0e2342d4f8dac63f281a38a239d8de29d6c75f863c797b164ab8e72cc\n  else ifneq ($(filter $(ARM_CPU_FEATURES),vfp vfpv2),)\n    PKG_ARCH:=$(PKG_NAME)+wolfssl@arm-linux-musleabi@generic+v6+soft_float@fast+lto\n    PKG_HASH:=0a401d1dc11129481b2baf86f847d55d66bd7e725cba4bf57875fdad27ef0052\n  else\n    PKG_ARCH:=$(PKG_NAME)+wolfssl@arm-linux-musleabihf@generic+v7a@fast+lto\n    PKG_HASH:=dfa1f6ba80fb0925613822f4c4e00df8da68e7b8b772048d26a0d1a9d07d346b\n  endif\nelse ifeq ($(ARCH),mips)\n  PKG_ARCH:=$(PKG_NAME)+wolfssl@mips-linux-musl@mips32+soft_float@fast+lto\n  PKG_HASH:=b610821a8f61b0ed3c8c7e82e10d401348a9de17f900988589024a37c4099c8e\nelse ifeq ($(ARCH),mipsel)\n  ifeq ($(CONFIG_HAS_FPU),)\n    PKG_ARCH:=$(PKG_NAME)+wolfssl@mipsel-linux-musl@mips32+soft_float@fast+lto\n    PKG_HASH:=760544a88724e3b1b9eac79c9400231e81aa8786f8f00a979229e175811ffe6d\n  else\n    PKG_ARCH:=$(PKG_NAME)+wolfssl@mipsel-linux-musl@mips32@fast+lto\n    PKG_HASH:=ec547c31a884e0967437ceb90a5c270864efe81b0e40939e0ec2810c7bfd6653\n  endif\nelse ifeq ($(ARCH),mips64)\n  PKG_ARCH:=$(PKG_NAME)+wolfssl@mips64-linux-musl@mips64+soft_float@fast+lto\n  PKG_HASH:=2d0fce18a7ef1d74fdc12738767e66998a52c2b30d8790da760933853fe8726e\nelse ifeq ($(ARCH),mips64el)\n  PKG_ARCH:=$(PKG_NAME)+wolfssl@mips64el-linux-musl@mips64+soft_float@fast+lto\n  PKG_HASH:=a301d8d200d06582c60bbe0e487a28f5b41e6f0997a548cf882a7b078dab089c\nelse ifeq ($(ARCH),i386)\n  ifneq ($(CONFIG_TARGET_x86_geode)$(CONFIG_TARGET_x86_legacy),)\n    PKG_ARCH:=$(PKG_NAME)+wolfssl@i386-linux-musl@i686@fast+lto\n    PKG_HASH:=85e057dd0a0e8913b30471737436ab8b71834c494ed9f9e53544261b1ffdc8d6\n  else\n    PKG_ARCH:=$(PKG_NAME)+wolfssl@i386-linux-musl@pentium4@fast+lto\n    PKG_HASH:=2d0f1a05c82f2e21e71a6618c7f1d2e7f46aa6a21535d774d517e87ec00c989b\n  endif\nelse ifeq ($(ARCH),x86_64)\n  PKG_ARCH:=$(PKG_NAME)+wolfssl@x86_64-linux-musl@x86_64@fast+lto\n  PKG_HASH:=842ea4e9816efd91d39bc76ead5c4a42e79011757e37c521b4270b675cfcb30c\nelse ifeq ($(ARCH),riscv64)\n  PKG_ARCH:=chinadns-ng+wolfssl@riscv64-linux-musl@baseline_rv64@fast+lto\n  PKG_HASH:=7056f47f4d6b20109e007792694dc83e5eac44c9265d7be20f6dc10375b35a9b\nelse\n  PKG_ARCH:=dummy\n  PKG_HASH:=dummy\nendif\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(ARCH_PACKAGES)\nPKG_SOURCE_URL:=https://github.com/zfl9/chinadns-ng/releases/download/$(PKG_VERSION)/$(PKG_ARCH)?\nUNPACK_CMD=$(CP) $(DL_DIR)/$(PKG_SOURCE) $(PKG_BUILD_DIR)/$(PKG_NAME)\n\nPKG_LICENSE:=AGPL-3.0-only\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/chinadns-ng\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=IP Addresses and Names\n  TITLE:=ChinaDNS next generation, refactoring with epoll and ipset.\n  URL:=https://github.com/zfl9/chinadns-ng\n  DEPENDS:=@(aarch64||arm||i386||mips||mipsel||mips64||mips64el||riscv64||x86_64)\nendef\n\ndefine Package/chinadns-ng/description\nChinaDNS Next Generation, refactoring with epoll and ipset.\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/chinadns-ng/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/chinadns-ng $(1)/usr/bin\nendef\n\n$(eval $(call BuildPackage,chinadns-ng))\n"
  },
  {
    "path": "luci-app-ssr-plus/dns2socks/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=dns2socks\nPKG_VERSION:=2.1\nPKG_RELEASE:=2\n\nPKG_SOURCE:=SourceCode.zip\nPKG_SOURCE_URL:=@SF/dns2socks\nPKG_SOURCE_DATE:=2020-02-18\nPKG_HASH:=406b5003523577d39da66767adfe54f7af9b701374363729386f32f6a3a995f4\n\nPKG_MAINTAINER:=ghostmaker\nPKG_LICENSE:=BSD-3-Clause\nPKG_LICENSE_FILE:=LICENSE\n\ninclude $(INCLUDE_DIR)/package.mk\n\nUNZIP_CMD:=unzip -q -d $(PKG_BUILD_DIR) $(DL_DIR)/$(PKG_SOURCE)\n\ndefine Package/dns2socks\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=IP Addresses and Names\n  TITLE:=DNS to SOCKS or HTTP proxy\n  URL:=http://dns2socks.sourceforge.net/\n  DEPENDS:=+libpthread\nendef\n\ndefine Package/dns2socks/description\n  This is a command line utility to resolve DNS requests via\n  a SOCKS tunnel like Tor or a HTTP proxy.\nendef\n\ndefine Build/Compile\n\t$(TARGET_CC) \\\n\t$(TARGET_CFLAGS) \\\n\t$(TARGET_CPPFLAGS) \\\n\t$(FPIC) \\\n\t-o $(PKG_BUILD_DIR)/DNS2SOCKS/dns2socks \\\n\t$(PKG_BUILD_DIR)/DNS2SOCKS/DNS2SOCKS.c \\\n\t$(TARGET_LDFLAGS) -pthread\nendef\n\ndefine Package/dns2socks/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/DNS2SOCKS/dns2socks $(1)/usr/bin/dns2socks\nendef\n\n$(eval $(call BuildPackage,dns2socks))\n"
  },
  {
    "path": "luci-app-ssr-plus/dns2socks-rust/Makefile",
    "content": "# SPDX-License-Identifier: GPL-2.0-only\n#\n# Copyright (C) 2017-2024 Zxlhhyccc <zxlhhyccc@gmail.com>\n# Copyright (C) 2021-2024 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=dns2socks-rust\nPKG_VERSION:=0.2.3\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/tun2proxy/dns2socks/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=4bb4a238aace1ad2b2e8b8f7414a5d28838e380299da57379bae6254f642be42\nPKG_BUILD_DIR:=$(BUILD_DIR)/dns2socks-$(PKG_VERSION)\n\nPKG_MAINTAINER:=Zxlhhyccc <zxlhhyccc@gmail.com>\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILES:=LICENSE\n\nPKG_BUILD_PARALLEL:=1\n\nPKG_BUILD_DEPENDS:=rust/host\nPKG_BUILD_PARALLEL:=1\n\n#RUST_PKG:=dns2socks\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/rust/rust-package.mk\n\ndefine Package/dns2socks-rust\n    SECTION:=net\n    CATEGORY:=Network\n    SUBMENU:=IP Addresses and Names\n    TITLE:=DNS forwards to SOCKS5 server\n    URL:=https://github.com/tun2proxy/dns2socks.git\n    DEPENDS:=$$(RUST_ARCH_DEPENDS)\nendef\n\ndefine Package/dns2socks-rust/description\n  This is a DNS server that forwards DNS requests to a SOCKS5 server.\nendef\n\ndefine Build/Compile\n\t$(call Build/Compile/Cargo,,--all-features)\nendef\n\ndefine Package/dns2socks-rust/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/target/$(RUSTC_TARGET_ARCH)/release/dns2socks $(1)/usr/bin/dns2socks-rust\nendef\n\n$(eval $(call BuildPackage,dns2socks-rust))\n"
  },
  {
    "path": "luci-app-ssr-plus/dns2tcp/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2022 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=dns2tcp\nPKG_VERSION:=1.1.2\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/zfl9/dns2tcp/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=5e8c6302a1d32c16ae7d4b8e39cd9aad1f2d7e68fe18813e76cb1e48ec5940d2\n\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\nPKG_LICENSE:=AGPL-3.0-only\nPKG_LICENSE_FILES:=LICENSE\n\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\nPKG_BUILD_FLAGS:=no-mips16 gc-sections lto\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/dns2tcp\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=IP Addresses and Names\n  TITLE:=utility to convert dns query from udp to tcp\n  URL:=https://github.com/zfl9/dns2tcp\nendef\n\nTARGET_CFLAGS+= $(FPIC)\nMAKE_FLAGS+= \\\n\tCFLAGS=\"-std=c99 $(TARGET_CFLAGS)\" \\\n\tEVCFLAGS=\"$(TARGET_CFLAGS)\"\n\ndefine Package/dns2tcp/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/dns2tcp $(1)/usr/bin/\nendef\n\n$(eval $(call BuildPackage,dns2tcp))\n"
  },
  {
    "path": "luci-app-ssr-plus/dnsproxy/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=dnsproxy\nPKG_VERSION:=0.78.2\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/AdguardTeam/dnsproxy/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=dabb78173f518da7c2a5394cf52e3f6cdd09d9cb48f3dafa59f5b5788459bf75\n\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\nPKG_LICENSE:=Apache-2.0\nPKG_LICENSE_FILES:=LICENSE\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/AdguardTeam/dnsproxy\nGO_PKG_LDFLAGS_X:=$(GO_PKG)/internal/version.version=v$(PKG_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/dnsproxy\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=IP Addresses and Names\n  TITLE:=Simple DNS proxy with DoH, DoT, DoQ and DNSCrypt support\n  URL:=https://github.com/AdguardTeam/dnsproxy\n  DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle\n  USERID:=dnsproxy=411:dnsproxy=411\nendef\n\ndefine Package/dnsproxy/description\n  A simple DNS proxy server that supports all existing DNS protocols including\n  DNS-over-TLS, DNS-over-HTTPS, DNSCrypt, and DNS-over-QUIC.Moreover, it can\n  work as a DNS-over-HTTPS, DNS-over-TLS or DNS-over-QUIC server.\nendef\n\ndefine Package/dnsproxy/install\n\t$(call GoPackage/Package/Install/Bin,$(1))\nendef\n\n$(eval $(call GoBinPackage,dnsproxy))\n$(eval $(call BuildPackage,dnsproxy))\n"
  },
  {
    "path": "luci-app-ssr-plus/gn/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2022 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=gn\nPKG_RELEASE:=1\n\nPKG_SOURCE_PROTO:=git\nPKG_SOURCE_URL:=https://gn.googlesource.com/gn.git\nPKG_SOURCE_DATE:=2026-03-31\nPKG_SOURCE_VERSION:=6e8dcdebbadf4f8aa75e6a4b6e0bdf89dce1513a\nPKG_MIRROR_HASH:=746e218a5674d4a4b61ebcf393ce5d4e7dc0068d02084fe5a809c870859fdedb\n\nPKG_LICENSE:=BSD 3-Clause\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\n\nPKG_HOST_ONLY:=1\nHOST_BUILD_PARALLEL:=1\n\ninclude $(INCLUDE_DIR)/host-build.mk\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/gn\n  SECTION:=devel\n  CATEGORY:=Development\n  TITLE:=A meta-build system that generates build files for Ninja\n  URL:=https://gn.googlesource.com/gn/\n  BUILDONLY:=1\nendef\n\ndefine Package/gn/description\n  GN can generate Ninja build files for C, C++, Rust, Objective C,\n  and Swift source on most popular platforms.\nendef\n\ndefine Host/Configure\n\t$(PYTHON) $(HOST_BUILD_DIR)/build/gen.py \\\n\t\t--no-last-commit-position \\\n\t\t--allow-warnings\nendef\n\ndefine Host/Compile\n\t+$(NINJA) -C $(HOST_BUILD_DIR)/out\nendef\n\ndefine Host/Install\n\t$(INSTALL_DIR) $(STAGING_DIR_HOSTPKG)/bin/\n\t$(INSTALL_BIN) $(HOST_BUILD_DIR)/out/gn $(STAGING_DIR_HOSTPKG)/bin/\nendef\n\ndefine Host/Clean\n\t$(RM) $(STAGING_DIR_HOSTPKG)/bin/gn\nendef\n\n$(eval $(call HostBuild))\n$(eval $(call BuildPackage,gn))\n"
  },
  {
    "path": "luci-app-ssr-plus/gn/src/out/last_commit_position.h",
    "content": "// Generated by build/gen.py.\n\n#ifndef OUT_LAST_COMMIT_POSITION_H_\n#define OUT_LAST_COMMIT_POSITION_H_\n\n#define LAST_COMMIT_POSITION_NUM 2355\n#define LAST_COMMIT_POSITION \"2355 (6e8dcdebbadf)\"\n\n#endif  // OUT_LAST_COMMIT_POSITION_H_\n"
  },
  {
    "path": "luci-app-ssr-plus/hysteria/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=hysteria\nPKG_VERSION:=2.8.2\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/apernet/hysteria/tar.gz/app/v$(PKG_VERSION)?\nPKG_HASH:=1704f3dad12ee3f9fc7aeee9ba788fcc1662125c1d05ffd0f1a85ee3dd99bd08\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-app-v$(PKG_VERSION)\n\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILE:=LICENSE\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/apernet/hysteria\nGO_PKG_BUILD_PKG:=$(GO_PKG)/app/v2\nGO_PKG_LDFLAGS_X = \\\n\t$(GO_PKG)/app/v2/cmd.appVersion=v$(PKG_VERSION) \\\n\t$(GO_PKG)/app/v2/cmd.appType=release \\\n\t$(GO_PKG)/app/v2/cmd.appPlatform=$(GO_OS) \\\n\t$(GO_PKG)/app/v2/cmd.appArch=$(GO_ARCH)\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/hysteria\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=A feature-packed network utility optimized for networks of poor quality\n  URL:=https://github.com/apernet/hysteria\n  DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle\nendef\n\ndefine Package/hysteria/description\n  Hysteria is a feature-packed network utility optimized for networks\n  of poor quality (e.g. satellite connections, congested public Wi-Fi,\n  connecting from China to servers abroad) powered by a custom version\n  of QUIC protocol.\nendef\n\ndefine Package/hysteria/install\n\t$(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR))\n\n\t$(INSTALL_DIR) $(1)/usr/bin/\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/app $(1)/usr/bin/hysteria\nendef\n\n$(eval $(call GoBinPackage,hysteria))\n$(eval $(call BuildPackage,hysteria))\n"
  },
  {
    "path": "luci-app-ssr-plus/ipt2socks/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=ipt2socks\nPKG_VERSION:=1.1.4\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/zfl9/ipt2socks/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=68dc76e63951d655c2fd9b420e175b5a75a50014d6db6e729398b41f2c988356\n\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\nPKG_BUILD_FLAGS:=no-mips16\n\nPKG_LICENSE:=AGPL-3.0\nPKG_LICENSE_FILE:=LICENSE\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/ipt2socks\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=Convert iptables to socks5\n  URL:=https://github.com/zfl9/ipt2socks\n  DEPENDS:=+libpthread\nendef\n\ndefine Package/ipt2socks/description\n  Utility for converting iptables (redirect/tproxy) to socks5.\nendef\n\nTARGET_CFLAGS+= $(FPIC) -flto\nMAKE_FLAGS+= \\\n\tCFLAGS=\"-std=c99 -pthread $(TARGET_CFLAGS)\" \\\n\tEVCFLAGS=\"$(TARGET_CFLAGS)\"\n\ndefine Package/ipt2socks/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/ipt2socks $(1)/usr/bin\nendef\n\n$(eval $(call BuildPackage,ipt2socks))\n"
  },
  {
    "path": "luci-app-ssr-plus/lua-neturl/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2022-2023 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=neturl\nPKG_REAL_VERSION:=1.2-1\nPKG_VERSION:=$(subst -,.,$(PKG_REAL_VERSION))\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_REAL_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/golgote/neturl/tar.gz/v$(PKG_REAL_VERSION)?\nPKG_HASH:=fc4ea1b114125ae821bef385936cd12429485204576e77b6283692bd0cc9b1ab\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_REAL_VERSION)\n\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\nPKG_LICENSE:=MIT\nPKG_LICNESE_FILES:=LICENSE.txt\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/lua-neturl\n  SUBMENU:=Lua\n  SECTION:=lang\n  CATEGORY:=Languages\n  TITLE:=URL and Query string parser, builder, normalizer for Lua\n  URL:=https://github.com/golgote/neturl\n  DEPENDS:=+lua\n  PKGARCH:=all\nendef\n\ndefine Package/lua-neturl/description\n  This small Lua library provides a few functions to parse URL with\n  querystring and build new URL easily.\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/lua-neturl/install\n\t$(INSTALL_DIR) $(1)/usr/lib/lua\n\t$(CP) $(PKG_BUILD_DIR)/lib/net/url.lua $(1)/usr/lib/lua/\nendef\n\n$(eval $(call BuildPackage,lua-neturl))\n"
  },
  {
    "path": "luci-app-ssr-plus/lua-neturl/patches/010-userinfo-regex.patch",
    "content": "--- a/lib/net/url.lua\n+++ b/lib/net/url.lua\n@@ -340,7 +340,7 @@ function M:setAuthority(authority)\n \t\t\t\tself.password = v\n \t\t\t\treturn ''\n \t\tend)\n-\t\tif string.find(userinfo, \"^[%w%+%.]+$\") then\n+\t\tif string.find(userinfo, \"^[%p%w%+%.]+$\") then\n \t\t\tself.user = userinfo\n \t\telse\n \t\t\t-- incorrect userinfo\n@@ -369,7 +369,7 @@ function M.parse(url)\n \t\tcomp.fragment = v\n \t\treturn ''\n \tend)\n-\turl =url:gsub('^([%w][%w%+%-%.]*)%:', function(v)\n+\turl =url:gsub('^([%w][%w%+%-%_%.]*)%:', function(v)\n \t\tcomp.scheme = v:lower()\n \t\treturn ''\n \tend)\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=luci-app-ssr-plus\nLUCI_PKGARCH:=all\nPKG_NAME:=luci-app-ssr-plus\nPKG_VERSION:=190\nPKG_RELEASE:=3\n\nPKG_CONFIG_DEPENDS:= \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_Nftables_Transparent_Proxy \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_NONE_V2RAY \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_V2ray \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Xray \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_DNS2SOCKS \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_DNS2SOCKS_RUST \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_DNS2TCP \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_DNSPROXY \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_MosDNS \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Tuic_Client \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadow_TLS \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_IPT2Socks \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Redsocks2 \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_NONE_Client \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Client \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_NONE_Server \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Server \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Simple_Obfs \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_V2ray_Plugin \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Server \\\n\tCONFIG_PACKAGE_$(PKG_NAME)_INCLUDE_Trojan\n\nLUCI_TITLE:=SS/SSR/V2Ray/Trojan/NaiveProxy/Tuic/ShadowTLS/Hysteria/Socks5/Tun LuCI interface\nLUCI_PKGARCH:=all\nLUCI_DEPENDS:= \\\n\t+coreutils +coreutils-base64 +dns2tcp +dnsmasq-full \\\n\t+jq +ip-full +lua +lua-neturl +libuci-lua +microsocks \\\n\t+tcping +resolveip +shadowsocksr-libev-ssr-check +curl +nping \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_V2ray:curl \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_V2ray:v2ray-core \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_Xray:curl \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_Xray:xray-core \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG:chinadns-ng \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_DNS2SOCKS:dns2socks \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_DNS2SOCKS_RUST:dns2socks-rust \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_DNSPROXY:dnsproxy \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_MosDNS:mosdns \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria:hysteria \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_Tuic_Client:tuic-client \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_Shadow_TLS:shadow-tls \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_IPT2Socks:ipt2socks \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun:kcptun-client \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy:naiveproxy \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_Redsocks2:redsocks2 \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Client:shadowsocks-libev-ss-local \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Client:shadowsocks-libev-ss-redir \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Server:shadowsocks-libev-ss-server \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client:shadowsocks-rust-sslocal \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server:shadowsocks-rust-ssserver \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Simple_Obfs:simple-obfs-client \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_V2ray_Plugin:v2ray-plugin \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client:shadowsocksr-libev-ssr-local \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client:shadowsocksr-libev-ssr-redir \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Server:shadowsocksr-libev-ssr-server \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_Trojan:trojan\n\n\ndefine Package/$(PKG_NAME)/config\nselect PACKAGE_luci-lua-runtime if PACKAGE_$(PKG_NAME)\n\nchoice\n\tprompt \"Transparent Proxy Backend\"\n\tdefault PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy if ! PACKAGE_firewall4\n\tdefault PACKAGE_$(PKG_NAME)_Nftables_Transparent_Proxy if PACKAGE_firewall4\n\nconfig PACKAGE_$(PKG_NAME)_Iptables_Transparent_Proxy\n\tbool \"Iptables Transparent Proxy\"\n\tselect PACKAGE_dnsmasq_full_ipset\n\tselect PACKAGE_ipset\n\tselect PACKAGE_iptables\n\tselect PACKAGE_iptables-zz-legacy\n\tselect PACKAGE_iptables-mod-conntrack-extra\n\tselect PACKAGE_iptables-mod-iprange\n\tselect PACKAGE_iptables-mod-socket\n\tselect PACKAGE_iptables-mod-tproxy\n\tselect PACKAGE_kmod-ipt-nat\n\nconfig PACKAGE_$(PKG_NAME)_Nftables_Transparent_Proxy\n\tbool \"Nftables Transparent Proxy\"\n\tselect PACKAGE_dnsmasq_full_nftset\n\tselect PACKAGE_nftables\n\tselect PACKAGE_kmod-nft-socket\n\tselect PACKAGE_kmod-nft-tproxy\n\tselect PACKAGE_kmod-nft-nat\nendchoice\n\nchoice\n\tprompt \"Shadowsocks Client Selection\"\n\tdefault PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client if aarch64 || x86_64\n\tdefault PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Client\n\n\tconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_NONE_Client\n\tbool \"None\"\n\n\tconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Client\n\tbool \"Shadowsocks-libev\"\n\n\tconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client\n\tbool \"Shadowsocks-rust\"\n\tdepends on aarch64||arm||i386||mips||mipsel||x86_64\n\tdepends on !(TARGET_x86_geode||TARGET_x86_legacy)\nendchoice\n\nchoice\n\tprompt \"Shadowsocks Server Selection\"\n\tdefault PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server if aarch64\n\tdefault PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Server if i386||x86_64||arm\n\tdefault PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_NONE_Server\n\n\tconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_NONE_Server\n\tbool \"None\"\n\n\tconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Libev_Server\n\tbool \"Shadowsocks-libev\"\n\n\tconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Server\n\tbool \"Shadowsocks-rust\"\n\tdepends on aarch64||arm||i386||mips||mipsel||x86_64\n\tdepends on !(TARGET_x86_geode||TARGET_x86_legacy)\nendchoice\n\nchoice\n\tprompt \"V2ray-core Selection\"\n\tdefault PACKAGE_$(PKG_NAME)_INCLUDE_Xray if aarch64||arm||i386||x86_64\n\tdefault PACKAGE_$(PKG_NAME)_INCLUDE_NONE_V2RAY\n\n\tconfig PACKAGE_$(PKG_NAME)_INCLUDE_NONE_V2RAY\n\tbool \"None\"\n\n\tconfig PACKAGE_$(PKG_NAME)_INCLUDE_V2ray\n\tbool \"V2ray-core\"\n\n\tconfig PACKAGE_$(PKG_NAME)_INCLUDE_Xray\n\tbool \"Xray-core\"\nendchoice\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG\n\tbool \"Include ChinaDNS-NG\"\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_DNS2SOCKS\n\tbool \"Include DNS2socks\"\n\tdefault y\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_DNS2SOCKS_RUST\n\tbool \"Include DNS2socks-Rust\"\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_DNSPROXY\n\tbool \"Include DNSproxy\"\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_MosDNS\n\tbool \"Include MosDNS\"\n\tdefault y if aarch64||arm||i386||x86_64\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Hysteria\n\tbool \"Include Hysteria\"\n\tselect PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Tuic_Client\n\tbool \"Include Tuic-Client\"\n\tselect PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG\n\tselect PACKAGE_$(PKG_NAME)_INCLUDE_IPT2Socks\n\tdepends on aarch64||arm||i386||x86_64\n\tdepends on !(TARGET_x86_geode||TARGET_x86_legacy)\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadow_TLS\n\tbool \"Include Shadow-TLS\"\n\tselect PACKAGE_$(PKG_NAME)_INCLUDE_ChinaDNS_NG\n\tselect PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Rust_Client\n\tdepends on aarch64||arm||x86_64\n\tdepends on !(TARGET_x86_geode||TARGET_x86_legacy)\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_IPT2Socks\n\tbool \"Include IPT2Socks\"\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Kcptun\n\tbool \"Include Kcptun\"\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_NaiveProxy\n\tbool \"Include NaiveProxy\"\n\tdepends on !(arc||armeb||mips||mips64||powerpc||TARGET_gemini)\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Redsocks2\n\tbool \"Include Redsocks2\"\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_Simple_Obfs\n\tbool \"Include Shadowsocks Simple Obfs Plugin\"\n\tdefault y\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Shadowsocks_V2ray_Plugin\n\tbool \"Include Shadowsocks V2ray Plugin\"\n\tdefault n\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Client\n\tbool \"Include ShadowsocksR Libev Client\"\n\tdefault y\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_ShadowsocksR_Libev_Server\n\tbool \"Include ShadowsocksR Libev Server\"\n\tdefault y if i386||x86_64||arm\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_Trojan\n\tbool \"Include Trojan\"\n\tselect PACKAGE_$(PKG_NAME)_INCLUDE_IPT2Socks\n\tdefault n\n\nendef\n\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/shadowsocksr\n/etc/ssrplus/\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua",
    "content": "-- Copyright (C) 2017 yushi studio <ywb94@qq.com>\n-- Licensed to the public under the GNU General Public License v3.\nmodule(\"luci.controller.shadowsocksr\", package.seeall)\nrequire \"nixio\"\nrequire \"nixio.fs\"\nlocal uci = require(\"luci.model.uci\").cursor()\n\nlocal function sh_uci_commit(config)\n\tluci.sys.call(string.format(\"uci -q commit %s\", config))\nend\n\nlocal function is_old_uci()\n\treturn luci.sys.call(\"grep -E 'require[ \\t]*\\\"uci\\\"' /usr/lib/lua/luci/model/uci.lua >/dev/null 2>&1\") == 0\nend\n\nlocal function uci_save(cursor, config, commit, apply)\n\tif is_old_uci() then\n\t\tcursor:save(config)\n\t\tif commit then\n\t\t\tcursor:commit(config)\n\t\t\tif apply then\n\t\t\t\tluci.sys.call(\"/etc/init.d/\" .. config .. \" reload > /dev/null 2>&1 &\")\n\t\t\tend\n\t\tend\n\telse\n\t\tcommit = true\n\t\tif commit then\n\t\t\tif apply then\n\t\t\t\tcursor:commit(config)\n\t\t\telse\n\t\t\t\tsh_uci_commit(config)\n\t\t\tend\n\t\tend\n\tend\nend\n\nlocal function url(...)\n\tlocal url = string.format(\"admin/services/%s\", \"shadowsocksr\")\n\tlocal args = { ... }\n\tfor i, v in ipairs(args) do\n\t\tif v and v ~= \"\" then\n\t\t\turl = url .. \"/\" .. v\n\t\tend\n\tend\n\treturn require \"luci.dispatcher\".build_url(url)\nend\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/shadowsocksr\") then\n\t\tcall(\"act_reset\")\n\tend\n\tlocal page\n\tpage = entry({\"admin\", \"services\", \"shadowsocksr\"}, alias(\"admin\", \"services\", \"shadowsocksr\", \"client\"), _(\"ShadowSocksR Plus+\"), 10)\n\tpage.dependent = true\n\tpage.acl_depends = { \"luci-app-ssr-plus\" }\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"client\"}, cbi(\"shadowsocksr/client\"), _(\"SSR Client\"), 10).leaf = true\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"servers\"}, arcombine(cbi(\"shadowsocksr/servers\", {autoapply = true}), cbi(\"shadowsocksr/client-config\")), _(\"Servers Nodes\"), 20).leaf = true\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"control\"}, cbi(\"shadowsocksr/control\"), _(\"Access Control\"), 30).leaf = true\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"advanced\"}, cbi(\"shadowsocksr/advanced\"), _(\"Advanced Settings\"), 50).leaf = true\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"server\"}, arcombine(cbi(\"shadowsocksr/server\"), cbi(\"shadowsocksr/server-config\")), _(\"SSR Server\"), 60).leaf = true\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"status\"}, form(\"shadowsocksr/status\"), _(\"Status\"), 70).leaf = true\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"check\"}, call(\"check_status\"))\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"refresh\"}, call(\"refresh_data\"))\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"subscribe\"}, call(\"subscribe\"))\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"checkport\"}, call(\"check_port\"))\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"log\"}, form(\"shadowsocksr/log\"), _(\"Log\"), 80).leaf = true\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"get_log\"}, call(\"get_log\")).leaf = true\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"clear_log\"}, call(\"clear_log\")).leaf = true\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"run\"}, call(\"act_status\"))\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"ping\"}, call(\"act_ping\"))\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"reset\"}, call(\"act_reset\"))\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"restart\"}, call(\"act_restart\"))\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"delete\"}, call(\"act_delete\"))\n\t--[[ API ]]\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"add_node\"}, call(\"act_add_node\")).leaf = true\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"remove_node\"}, call(\"act_remove\"))\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"save_node_order\"}, call(\"act_save_order\")).leaf = true\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"get_now_use_node\"}, call(\"act_get_now_use_node\")).leaf = true\n\t--[[Backup]]\n\tentry({\"admin\", \"services\", \"shadowsocksr\", \"backup\"}, call(\"create_backup\")).leaf = true\nend\n\nfunction subscribe()\n\tluci.sys.call(\"/usr/bin/lua /usr/share/shadowsocksr/subscribe.lua >>/var/log/ssrplus.log\")\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({ret = 1})\nend\n\nfunction act_status()\n\tlocal e = {}\n\te.running = luci.sys.call(\"busybox ps -w | grep ssr-retcp | grep -v grep >/dev/null\") == 0\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n\nfunction act_ping()\n\tlocal e = {}\n\tlocal domain = luci.http.formvalue(\"domain\")\n\tlocal port = tonumber(luci.http.formvalue(\"port\") or 0)\n\tlocal transport = (luci.http.formvalue(\"transport\") or \"\"):lower()\n\tlocal wsPath = luci.http.formvalue(\"wsPath\") or \"\"\n\tlocal tls = luci.http.formvalue(\"tls\")\n\tlocal host = luci.http.formvalue(\"host\")\n\tlocal type = (luci.http.formvalue(\"type\") or \"\"):lower()\n\tlocal proto = (luci.http.formvalue(\"proto\") or \"\"):lower()\n\te.index = luci.http.formvalue(\"index\")\n\n\tlocal is_ip = domain and domain:match(\"^%d+%.%d+%.%d+%.%d+$\")\n\n\t-- 临时放行防火墙逻辑\n\tlocal use_nft = luci.sys.call(\"command -v nft >/dev/null\") == 0\n\tlocal iret = false\n\tif domain then\n\t\tif use_nft then\n\t\t\tiret = luci.sys.call(\"nft add element inet ss_spec ss_spec_wan_ac { \" .. domain .. \" } 2>/dev/null\") == 0\n\t\telse\n\t\t\tiret = luci.sys.call(\"ipset add ss_spec_wan_ac \" .. domain .. \" 2>/dev/null\") == 0\n\t\tend\n\tend\n\t-- Hysteria2 节点检测\n\tif proto:find(\"hysteria2\") or type:find(\"hysteria2\") then\n\t\tlocal node_id = e.index    \n\t\t-- 调用Shell测试脚本\n\t\tlocal cmd = string.format(\n\t\t\t\"/usr/share/shadowsocksr/hy2_test.sh url_test_hy2 %s\",\n\t\t\tnode_id\n\t\t)\n\t\tlocal res = luci.sys.exec(cmd) or \"\"    \n\t\t-- 解析结果\n\t\tlocal http_code, time_pre = string.match(res, \"(%d+):([%d%.]+)\")    \n\t\tif http_code == \"200\" or http_code == \"204\" then\n\t\t\te.socket = true\n\t\t\te.ping = math.floor(tonumber(time_pre or 0) * 1000)\n\t\telse\n\t\t\te.socket = false\n\t\t\te.ping = 0\n\t\tend\n\telseif transport == \"ws\" then\n\t\t-- WebSocket 探测\n\t\tlocal result = \"\"\n\t\tlocal success = false\n\t\t-- WebSocket 探测 (适用于域名，或带 SNI 的 IP)\n\t\tif not is_ip or (host and host ~= \"\") then\n\t\t\tlocal resolve_arg = \"\"\n\t\t\tlocal final_domain = domain\n\t\t\tif is_ip and host and host ~= \"\" then\n\t\t\t\t-- IP 模式下使用 --resolve 强制指定 SNI，解决 TLS 握手失败\n\t\t\t\tresolve_arg = string.format(\"--resolve '%s:%d:%s' \", host, port, domain)\n\t\t\t\tfinal_domain = host\n\t\t\tend\n\t\t\tlocal prefix = (tls == '1') and \"https://\" or \"http://\"\n\t\t\tlocal address = prefix .. final_domain .. ':' .. port .. wsPath\n\t\t\tlocal cmd = string.format(\n\t\t\t\t\"curl --http1.1 -m 2 -ksN -o /dev/null %s\" ..\n\t\t\t\t\"-w 'time_connect=%%{time_connect}\\\\nhttp_code=%%{http_code}' \" ..\n\t\t\t\t\"-H 'Connection: Upgrade' -H 'Upgrade: websocket' \" ..\n\t\t\t\t\"-H 'Sec-WebSocket-Key: SGVsbG8sIHdvcmxkIQ==' \" ..\n\t\t\t\t\"-H 'Sec-WebSocket-Version: 13' '%s'\",\n\t\t\t\tresolve_arg, address\n\t\t\t)\n\t\t\tresult = luci.sys.exec(cmd) or \"\"\n\t\t\tsuccess = (string.match(result, \"http_code=(%d+)\") == \"101\")\n\t\tend\n\t\t-- 如果深度探测失败，或是不支持深测的纯 IP\n\t\tif not success then\n\t\t\tlocal socket = nixio.socket(\"inet\", \"stream\")\n\t\t\tif socket then\n\t\t\t\tsocket:setopt(\"socket\", \"rcvtimeo\", 3)\n\t\t\t\tsocket:setopt(\"socket\", \"sndtimeo\", 3)\n\t\t\t\tsuccess = socket:connect(domain, port)\n\t\t\t\tsocket:close()\n\t\t\tend\n\t\t\t--luci.sys.exec(string.format(\"echo 'Node %s (ws) failed deep test, using TCP fallback' >> /tmp/ping.log\", domain))\n\t\tend\n\t\te.socket = success\n\t\t-- 解析延迟 (优先用 curl 数据，失败则回退到 tcping)\n\t\tlocal ping_time = tonumber(string.match(result, \"time_connect=(%d+.%d%d%d)\"))\n\t\tif ping_time and ping_time > 0 then\n\t\t\te.ping = math.floor(ping_time * 1000)\n\t\telse\n\t\t\tlocal tcping_cmd = string.format(\"tcping -q -c 1 -t 1 -p %d %s 2>/dev/null | grep -o 'time=[0-9]*' | cut -d= -f2\", port, domain)\n\t\t\te.ping = tonumber(luci.sys.exec(tcping_cmd)) or 0\n\t\tend\n\telse\n\t\t-- 3. 非 WebSocket 节点的探测逻辑 (TCP / ICMP / UDP)\n\t\tlocal socket = nixio.socket(\"inet\", \"stream\")\n\t\tif socket then\n\t\t\tsocket:setopt(\"socket\", \"rcvtimeo\", 3)\n\t\t\tsocket:setopt(\"socket\", \"sndtimeo\", 3)\n\t\t\te.socket = socket:connect(domain, port)\n\t\t\tsocket:close()\n\t\tend\n\n\t\t-- 延迟：tcping -> ping -> nping(udp)\n\t\tlocal tcping_cmd = string.format(\"tcping -q -c 1 -t 1 -p %d %s 2>/dev/null | grep -o 'time=[0-9]*' | cut -d= -f2\", port, domain)\n\t\te.ping = tonumber(luci.sys.exec(tcping_cmd))\n\t\tif not e.ping then\n\t\t\tlocal icmp_cmd = string.format(\"ping -c 1 -W 1 %s 2>/dev/null | grep -o 'time=[0-9.]*' | cut -d= -f2\", domain)\n\t\t\te.ping = tonumber(luci.sys.exec(icmp_cmd))\n\t\tend\n\n\t\tif not e.ping then\n\t\t\tlocal udp_cmd = string.format(\"nping --udp -c 1 -p %d %s 2>/dev/null | grep -o 'Avg rtt: [0-9.]*ms' | awk '{print $3}' | sed 's/ms//' | head -1\", port, domain)\n\t\t\tlocal udp_res = luci.sys.exec(udp_cmd)\n\t\t\tif udp_res and udp_res ~= \"\" then\n\t\t\t\tlocal ping_num = tonumber(udp_res)\n\t\t\t\tif ping_num then e.ping = math.floor(ping_num) end\n\t\t\tend\n\t\tend\n\tend\n\n\t-- 4. 清理防火墙规则\n\tif iret then\n\t\tif use_nft then\n\t\t\tluci.sys.call(\"nft delete element inet ss_spec ss_spec_wan_ac { \" .. domain .. \" } 2>/dev/null\")\n\t\telse\n\t\t\tluci.sys.call(\"ipset del ss_spec_wan_ac \" .. domain .. \" 2>/dev/null\")\n\t\tend\n\tend\n\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n\nfunction check_status()\n\tlocal e = {}\n\te.ret = luci.sys.call(\"/usr/bin/ssr-check www.\" .. luci.http.formvalue(\"set\") .. \".com 80 3 1\")\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n\nfunction refresh_data()\n\tlocal set = luci.http.formvalue(\"set\")\n\tlocal retstring = loadstring(\"return \" .. luci.sys.exec(\"/usr/bin/lua /usr/share/shadowsocksr/update.lua \" .. set))()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(retstring)\nend\n\nfunction check_port()\n\tlocal retstring = \"<br /><br />\"\n\tlocal s\n\tlocal server_name = \"\"\n\tlocal uci = require \"luci.model.uci\".cursor()\n\tlocal use_nft = luci.sys.call(\"command -v nft >/dev/null\") == 0\n\n\tuci:foreach(\"shadowsocksr\", \"servers\", function(s)\n\t\tif s.alias then\n\t\t\tserver_name = s.alias\n\t\telseif s.server and s.server_port then\n\t\t\tserver_name = s.server .. \":\" .. s.server_port\n\t\tend\n\n\t\t-- 临时加入 set\n\t\tlocal iret = false\n\t\tif use_nft then\n\t\t\tiret = luci.sys.call(\"nft add element inet ss_spec ss_spec_wan_ac { \" .. s.server .. \" } 2>/dev/null\") == 0\n\t\telse\n\t\t\tiret = luci.sys.call(\"ipset add ss_spec_wan_ac \" .. s.server .. \" 2>/dev/null\") == 0\n\t\tend\n\n\t\t-- TCP 测试\n\t\tlocal socket = nixio.socket(\"inet\", \"stream\")\n\t\tsocket:setopt(\"socket\", \"rcvtimeo\", 3)\n\t\tsocket:setopt(\"socket\", \"sndtimeo\", 3)\n\t\tlocal ret = socket:connect(s.server, s.server_port)\n\t\tsocket:close()\n\n\t\tif ret then\n\t\t\tretstring = retstring .. string.format(\"<font><b style='color:green'>[%s] OK.</b></font><br />\", server_name)\n\t\telse\n\t\t\tretstring = retstring .. string.format(\"<font><b style='color:red'>[%s] Error.</b></font><br />\", server_name)\n\t\tend\n\n\t\t-- 删除临时 set\n\t\tif iret then\n\t\t\tif use_nft then\n\t\t\t\tluci.sys.call(\"nft delete element inet ss_spec ss_spec_wan_ac { \" .. s.server .. \" } 2>/dev/null\")\n\t\t\telse\n\t\t\t\tluci.sys.call(\"ipset del ss_spec_wan_ac \" .. s.server)\n\t\t\tend\n\t\tend\n\tend)\n\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({ret = retstring})\nend\n\nfunction act_reset()\n\tluci.sys.call(\"/etc/init.d/shadowsocksr reset >/dev/null 2>&1\")\n\tluci.http.redirect(luci.dispatcher.build_url(\"admin\", \"services\", \"shadowsocksr\"))\nend\n\nfunction act_restart()\n\tluci.http.redirect(luci.dispatcher.build_url(\"admin\", \"services\", \"shadowsocksr\"))\nend\n\nfunction act_delete()\n\tuci:delete_all(\"shadowsocksr\", \"servers\", function(s)\n\t\tif s.hashkey or s.isSubscribe then\n\t\t\treturn true\n\t\telse\n\t\t\treturn false\n\t\tend\n\tend)\n\tuci:commit(\"shadowsocksr\")\n\tfor file in nixio.fs.glob(\"/tmp/sub_md5_*\") do\n\t\tnixio.fs.remove(file)\n\tend\n\tluci.sys.call(\"/etc/init.d/shadowsocksr restart >/dev/null 2>&1 &\")\n\tluci.http.redirect(luci.dispatcher.build_url(\"admin\", \"services\", \"shadowsocksr\", \"servers\"))\nend\n\nfunction act_add_node()\n\tlocal redirect = luci.http.formvalue(\"redirect\")\n\tlocal used_sid = {}\n\tlocal next_sid = 1\n\n\tuci:foreach(\"shadowsocksr\", \"servers\", function(s)\n\t\tlocal num = s[\".name\"]:match(\"^cfg(%x%x)\")\n\t\tif num then\n\t\t\tlocal n = tonumber(num, 16)\n\t\t\tused_sid[n] = true\n\t\tend\n\tend)\n\n\tlocal function get_next_sid()\n\t\twhile used_sid[next_sid] do\n\t\t\tnext_sid = next_sid + 1\n\t\tend\n\t\tused_sid[next_sid] = true\n\t\treturn next_sid\n\tend\n\n\tlocal sid = uci:section(\"shadowsocksr\", \"servers\", nil)\n\tlocal suffix = sid:sub(-4)\n\tuci:delete(\"shadowsocksr\", sid)\n\n\tlocal id = get_next_sid()\n\tlocal cfgid = string.format(\"cfg%02x%s\", id, suffix)\n\tuci:section(\"shadowsocksr\", \"servers\", cfgid)\n\tuci_save(uci, \"shadowsocksr\")\n\n\tif redirect == \"1\" then\n\t\tluci.http.redirect(url(\"servers\", cfgid))\n\telse\n\t\tluci.http.write_json({ result = cfgid })\n\tend\nend\n\nfunction act_remove()\n\tlocal id = luci.http.formvalue(\"id\")\n\tif id then\n\t\tuci:delete(\"shadowsocksr\", id)\n\t\tuci:commit(\"shadowsocksr\")\n\tend\n\tluci.http.redirect(luci.dispatcher.build_url(\"admin\", \"services\", \"shadowsocksr\", \"servers\"))\nend\n\nfunction act_save_order()\n\tlocal ids = luci.http.formvalue(\"ids\") or \"\"\n\tlocal new_order = {}\n\tfor id in ids:gmatch(\"([^,]+)\") do\n\t\tnew_order[#new_order + 1] = id\n\tend\n\n\tfor idx, name in ipairs(new_order) do\n\t\tluci.sys.call(string.format(\"uci -q reorder %s.%s=%d\", \"shadowsocksr\", name, idx - 1))\n\tend\n\n\tsh_uci_commit(\"shadowsocksr\")\n\tluci.http.write_json({ status = \"ok\" })\nend\n\nfunction act_get_now_use_node()\n\tlocal result = {}\n\tlocal tcp_node = uci:get_first(\"shadowsocksr\", \"global\", \"global_server\")\n\tif tcp_node then\n\t\tresult[\"TCP\"] = tcp_node\n\tend\n\tlocal udp_node = uci:get_first(\"shadowsocksr\", \"global\", \"udp_relay_server\")\n\tif udp_node then\n\t\tresult[\"UDP\"] = udp_node\n\tend\n\tlocal netflix_node = uci:get_first(\"shadowsocksr\", \"global\", \"netflix_server\")\n\tif netflix_node then\n\t\tresult[\"netflix\"] = netflix_node\n\tend\n\tlocal socks5_node = uci:get_first(\"shadowsocksr\", \"socks5_proxy\", \"server\")\n\tif socks5_node then\n\t\tresult[\"socks5\"] = socks5_node\n\tend\n\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(result)\nend\n\nfunction get_log()\n\tluci.http.write(luci.sys.exec(\"[ -f '/var/log/ssrplus.log' ] && cat /var/log/ssrplus.log\"))\nend\n\t\nfunction clear_log()\n\tluci.sys.call(\"echo '' > /var/log/ssrplus.log\")\nend\n\nfunction create_backup()\n\tlocal backup_files = {\n\t\t\"/etc/config/shadowsocksr\",\n\t\t\"/etc/ssrplus/*\"\n\t}\n\tlocal date = os.date(\"%Y-%m-%d-%H-%M-%S\")\n\tlocal tar_file = \"/tmp/shadowsocksr-\" .. date .. \"-backup.tar.gz\"\n\tnixio.fs.remove(tar_file)\n\tlocal cmd = \"tar -czf \" .. tar_file .. \" \" .. table.concat(backup_files, \" \")\n\tluci.sys.call(cmd)\n\tluci.http.header(\"Content-Disposition\", \"attachment; filename=shadowsocksr-\" .. date .. \"-backup.tar.gz\")\n\tluci.http.header(\"X-Backup-Filename\", \"shadowsocksr-\" .. date .. \"-backup.tar.gz\")\n\tluci.http.prepare_content(\"application/octet-stream\")\n\tluci.http.write(nixio.fs.readfile(tar_file))\n\tnixio.fs.remove(tar_file)\nend\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua",
    "content": "local m, s, o\nlocal cbi = require \"luci.cbi\"\nlocal uci = require \"luci.model.uci\".cursor()\n\n-- 获取 LAN IP 地址\nfunction lanip()\n\tlocal lan_ip\n\n\t-- 尝试从 UCI 直接读取\n\tlan_ip = luci.sys.exec(\"uci -q get network.lan.ipaddr 2>/dev/null | awk -F'/' '{print $1}' | tr -d '\\\\n'\")\n\n\t-- 尝试从 LAN 接口信息中读取（优先 ifname，再 fallback 到 device）\n\tif not lan_ip or lan_ip == \"\" then\n\t\tlan_ip = luci.sys.exec([[\nip -4 addr show $(uci -q -p /tmp/state get network.lan.ifname || uci -q -p /tmp/state get network.lan.device) 2>/dev/null \\\n  | grep -w 'inet' | awk '{print $2}' | cut -d'/' -f1 | grep -v '^127\\.' | head -n1 | tr -d '\\n']])\n\tend\n\n\t-- 取任意一个 global IPv4 地址\n\tif not lan_ip or lan_ip == \"\" then\n\t\tlan_ip = luci.sys.exec([[\nip -4 addr show scope global 2>/dev/null \\\n  | grep -w 'inet' | awk '{print $2}' | cut -d'/' -f1 | grep -v '^127\\.' | head -n1 | tr -d '\\n']])\n\tend\n\n\treturn lan_ip\nend\n\nlocal lan_ip = lanip()\nlocal server_table = {}\nlocal type_table = {}\nlocal function is_finded(e)\n\treturn luci.sys.exec(string.format('type -t -p \"%s\" 2>/dev/null', e)) ~= \"\"\nend\n\nuci:foreach(\"shadowsocksr\", \"servers\", function(s)\n\tif s.alias then\n\t\tserver_table[s[\".name\"]] = \"[%s]:%s\" % {string.upper(s.v2ray_protocol or s.type), s.alias}\n\telseif s.server and s.server_port then\n\t\tserver_table[s[\".name\"]] = \"[%s]:%s:%s\" % {string.upper(s.v2ray_protocol or s.type), s.server, s.server_port}\n\tend\n\tif s.type then\n\t\ttype_table[s[\".name\"]] = s.type\n\tend\nend)\n\nlocal key_table = {}\nfor key, _ in pairs(server_table) do\n\ttable.insert(key_table, key)\nend\n\ntable.sort(key_table)\n\nm = Map(\"shadowsocksr\")\n-- [[ global ]]--\ns = m:section(TypedSection, \"global\", translate(\"Server failsafe auto swith and custom update settings\"))\ns.anonymous = true\n\n-- o = s:option(Flag, \"monitor_enable\", translate(\"Enable Process Deamon\"))\n-- o.rmempty = false\n-- o.default = \"1\"\n\no = s:option(Flag, \"enable_switch\", translate(\"Enable Auto Switch\"))\no.rmempty = false\no.default = \"1\"\n\no = s:option(Value, \"switch_time\", translate(\"Switch check cycly(second)\"))\no.datatype = \"uinteger\"\no:depends(\"enable_switch\", \"1\")\no.default = 667\n\no = s:option(Value, \"switch_timeout\", translate(\"Check timout(second)\"))\no.datatype = \"uinteger\"\no:depends(\"enable_switch\", \"1\")\no.default = 5\n\no = s:option(Value, \"switch_try_count\", translate(\"Check Try Count\"))\no.datatype = \"uinteger\"\no:depends(\"enable_switch\", \"1\")\no.default = 3\n\no = s:option(Value, \"gfwlist_url\", translate(\"gfwlist Update url\"))\no:value(\"https://fastly.jsdelivr.net/gh/YW5vbnltb3Vz/domain-list-community@release/gfwlist.txt\", translate(\"v2fly/domain-list-community\"))\no:value(\"https://fastly.jsdelivr.net/gh/Loyalsoldier/v2ray-rules-dat@release/gfw.txt\", translate(\"Loyalsoldier/v2ray-rules-dat\"))\no:value(\"https://fastly.jsdelivr.net/gh/Loukky/gfwlist-by-loukky/gfwlist.txt\", translate(\"Loukky/gfwlist-by-loukky\"))\no:value(\"https://fastly.jsdelivr.net/gh/gfwlist/gfwlist/gfwlist.txt\", translate(\"gfwlist/gfwlist\"))\no.default = \"https://fastly.jsdelivr.net/gh/YW5vbnltb3Vz/domain-list-community@release/gfwlist.txt\"\n\no = s:option(Value, \"chnroute_url\", translate(\"Chnroute Update url\"))\no:value(\"https://ispip.clang.cn/all_cn.txt\", translate(\"Clang.CN\"))\no:value(\"https://ispip.clang.cn/all_cn_cidr.txt\", translate(\"Clang.CN.CIDR\"))\no:value(\"https://fastly.jsdelivr.net/gh/gaoyifan/china-operator-ip@ip-lists/china.txt\", translate(\"china-operator-ip\"))\no.default = \"https://ispip.clang.cn/all_cn.txt\"\n\no = s:option(Flag, \"netflix_enable\", translate(\"Enable Netflix Mode\"))\no.description = translate(\"When disabled shunt mode, will same time stopped shunt service.\")\no.rmempty = false\n\no = s:option(Value, \"nfip_url\", translate(\"nfip_url\"))\no:value(\"https://fastly.jsdelivr.net/gh/QiuSimons/Netflix_IP/NF_only.txt\", translate(\"Netflix IP Only\"))\no:value(\"https://fastly.jsdelivr.net/gh/QiuSimons/Netflix_IP/getflix.txt\", translate(\"Netflix and AWS\"))\no.default = \"https://fastly.jsdelivr.net/gh/QiuSimons/Netflix_IP/NF_only.txt\"\no.description = translate(\"Customize Netflix IP Url\")\no:depends(\"netflix_enable\", \"1\")\n\no = s:option(ListValue, \"shunt_dns_mode\", translate(\"DNS Query Mode For Shunt Mode\"))\nif is_finded(\"dns2socks\") then\n\to:value(\"1\", translate(\"Use DNS2SOCKS query and cache\"))\nend\nif is_finded(\"dns2socks-rust\") then\n\to:value(\"2\", translate(\"Use DNS2SOCKS-RUST query and cache\"))\nend\nif is_finded(\"mosdns\") then\n\to:value(\"3\", translate(\"Use MosDNS query\"))\nend\nif is_finded(\"dnsproxy\") then\n\to:value(\"4\", translate(\"Use DNSPROXY query and cache\"))\nend\nif is_finded(\"chinadns-ng\") then\n\to:value(\"5\", translate(\"Use ChinaDNS-NG query and cache\"))\nend\no:depends(\"netflix_enable\", \"1\")\no.default = 1\n\no = s:option(Value, \"shunt_dnsserver\", translate(\"Anti-pollution DNS Server For Shunt Mode\"))\no:value(\"8.8.4.4:53\", translate(\"Google Public DNS (8.8.4.4)\"))\no:value(\"8.8.8.8:53\", translate(\"Google Public DNS (8.8.8.8)\"))\no:value(\"208.67.222.222:53\", translate(\"OpenDNS (208.67.222.222)\"))\no:value(\"208.67.220.220:53\", translate(\"OpenDNS (208.67.220.220)\"))\no:value(\"209.244.0.3:53\", translate(\"Level 3 Public DNS (209.244.0.3)\"))\no:value(\"209.244.0.4:53\", translate(\"Level 3 Public DNS (209.244.0.4)\"))\no:value(\"4.2.2.1:53\", translate(\"Level 3 Public DNS (4.2.2.1)\"))\no:value(\"4.2.2.2:53\", translate(\"Level 3 Public DNS (4.2.2.2)\"))\no:value(\"4.2.2.3:53\", translate(\"Level 3 Public DNS (4.2.2.3)\"))\no:value(\"4.2.2.4:53\", translate(\"Level 3 Public DNS (4.2.2.4)\"))\no:value(\"1.1.1.1:53\", translate(\"Cloudflare DNS (1.1.1.1)\"))\no:depends(\"shunt_dns_mode\", \"1\")\no:depends(\"shunt_dns_mode\", \"2\")\no.description = translate(\"Custom DNS Server format as IP:PORT (default: 8.8.4.4:53)\")\no.datatype = \"ip4addrport\"\n\no = s:option(Value, \"shunt_mosdns_dnsserver\", translate(\"Anti-pollution DNS Server\"))\no:value(\"tcp://8.8.4.4:53,tcp://8.8.8.8:53\", translate(\"Google Public DNS\"))\no:value(\"tcp://208.67.222.222:53,tcp://208.67.220.220:53\", translate(\"OpenDNS\"))\no:value(\"tcp://209.244.0.3:53,tcp://209.244.0.4:53\", translate(\"Level 3 Public DNS-1 (209.244.0.3-4)\"))\no:value(\"tcp://4.2.2.1:53,tcp://4.2.2.2:53\", translate(\"Level 3 Public DNS-2 (4.2.2.1-2)\"))\no:value(\"tcp://4.2.2.3:53,tcp://4.2.2.4:53\", translate(\"Level 3 Public DNS-3 (4.2.2.3-4)\"))\no:value(\"tcp://1.1.1.1:53,tcp://1.0.0.1:53\", translate(\"Cloudflare DNS\"))\no:depends(\"shunt_dns_mode\", \"3\")\no.description = translate(\"Custom DNS Server format as tcp://IP:PORT or tls://DOMAIN:PORT (tcp://8.8.8.8 or tls://dns.google:853)\")\n\no = s:option(Flag, \"shunt_mosdns_ipv6\", translate(\"Disable IPv6 In MosDNS Query Mode (Shunt Mode)\"))\no:depends(\"shunt_dns_mode\", \"3\")\no.rmempty = false\no.default = \"0\"\n\nif is_finded(\"dnsproxy\") then\n\to = s:option(ListValue, \"shunt_parse_method\", translate(\"Select DNS parse Mode\"))\n\to.description = translate(\n    \t\"<ul>\" ..\n    \t\"<li>\" .. translate(\"When use DNS list file, please ensure list file exists and is formatted correctly.\") .. \"</li>\" ..\n    \t\"<li>\" .. translate(\"Tips: Dnsproxy DNS Parse List Path:\") ..\n    \t\" <a href='http://\" .. lan_ip .. \"/cgi-bin/luci/admin/services/shadowsocksr/control' target='_blank'>\" ..\n    \ttranslate(\"Click here to view or manage the DNS list file\") .. \"</a>\" .. \"</li>\" ..\n    \t\"</ul>\"\n\t)\n\to:value(\"single_dns\", translate(\"Set Single DNS\"))\n\to:value(\"parse_file\", translate(\"Use DNS List File\"))\n\to:depends(\"shunt_dns_mode\", \"4\")\n\to.rmempty = true\n\to.default = \"single_dns\"\n\n\to = s:option(Value, \"dnsproxy_shunt_forward\", translate(\"Anti-pollution DNS Server\"))\n\to:value(\"sdns://AgUAAAAAAAAABzguOC40LjQgsKKKE4EwvtIbNjGjagI2607EdKSVHowYZtyvD9iPrkkHOC44LjQuNAovZG5zLXF1ZXJ5\", translate(\"Google DNSCrypt SDNS\"))\n\to:value(\"sdns://AgcAAAAAAAAAACC2vD25TAYM7EnyCH8Xw1-0g5OccnTsGH9vQUUH0njRtAxkbnMudHduaWMudHcKL2Rucy1xdWVyeQ\", translate(\"TWNIC-101 DNSCrypt SDNS\"))\n\to:value(\"sdns://AgcAAAAAAAAADzE4NS4yMjIuMjIyLjIyMiAOp5Svj-oV-Fz-65-8H2VKHLKJ0egmfEgrdPeAQlUFFA8xODUuMjIyLjIyMi4yMjIKL2Rucy1xdWVyeQ\", translate(\"dns.sb DNSCrypt SDNS\"))\n\to:value(\"sdns://AgMAAAAAAAAADTE0OS4xMTIuMTEyLjkgsBkgdEu7dsmrBT4B4Ht-BQ5HPSD3n3vqQ1-v5DydJC8SZG5zOS5xdWFkOS5uZXQ6NDQzCi9kbnMtcXVlcnk\", translate(\"Quad9 DNSCrypt SDNS\"))\n\to:value(\"sdns://AQMAAAAAAAAAETk0LjE0MC4xNC4xNDo1NDQzINErR_JS3PLCu_iZEIbq95zkSV2LFsigxDIuUso_OQhzIjIuZG5zY3J5cHQuZGVmYXVsdC5uczEuYWRndWFyZC5jb20\", translate(\"AdGuard DNSCrypt SDNS\"))\n\to:value(\"sdns://AgcAAAAAAAAABzEuMC4wLjGgENk8mGSlIfMGXMOlIlCcKvq7AVgcrZxtjon911-ep0cg63Ul-I8NlFj4GplQGb_TTLiczclX57DvMV8Q-JdjgRgSZG5zLmNsb3VkZmxhcmUuY29tCi9kbnMtcXVlcnk\", translate(\"Cloudflare DNSCrypt SDNS\"))\n\to:value(\"sdns://AgcAAAAAAAAADjEwNC4xNi4yNDkuMjQ5ABJjbG91ZGZsYXJlLWRucy5jb20KL2Rucy1xdWVyeQ\", translate(\"cloudflare-dns.com DNSCrypt SDNS\"))\n\to:depends(\"shunt_parse_method\", \"single_dns\")\n\to.description = translate(\"Custom DNS Server (support: IP:Port or tls://IP:Port or https://IP/dns-query and other format).\")\n\n\to = s:option(ListValue, \"shunt_upstreams_logic_mode\", translate(\"Defines the upstreams logic mode\"))\n\to.description = translate(\n    \t\"<ul>\" ..\n    \t\"<li>\" .. translate(\"Defines the upstreams logic mode, possible values: load_balance, parallel, fastest_addr (default: load_balance).\") .. \"</li>\" .. \"<li>\" .. translate(\"When two or more DNS servers are deployed, enable this function.\") .. \"</li>\" ..\n    \t\"</ul>\"\n\t)\n\to:value(\"load_balance\", translate(\"load_balance\"))\n\to:value(\"parallel\", translate(\"parallel\"))\n\to:value(\"fastest_addr\", translate(\"fastest_addr\"))\n\to:depends(\"shunt_parse_method\", \"parse_file\")\n\to.rmempty = true\n\to.default = \"load_balance\"\n\n\to = s:option(Flag, \"shunt_dnsproxy_ipv6\", translate(\"Disable IPv6 query mode\"))\n\to.description = translate(\"When disabled, all AAAA requests are not resolved.\")\n\to:depends(\"shunt_parse_method\", \"single_dns\")\n\to:depends(\"shunt_parse_method\", \"parse_file\")\n\to.rmempty = false\n\to.default = \"1\"\nend\n\nif is_finded(\"chinadns-ng\") then\n\to = s:option(Value, \"chinadns_ng_shunt_dnsserver\", translate(\"Anti-pollution DNS Server For Shunt Mode\"))\n\to:value(\"8.8.4.4:53\", translate(\"Google Public DNS (8.8.4.4)\"))\n\to:value(\"8.8.8.8:53\", translate(\"Google Public DNS (8.8.8.8)\"))\n\to:value(\"208.67.222.222:53\", translate(\"OpenDNS (208.67.222.222)\"))\n\to:value(\"208.67.220.220:53\", translate(\"OpenDNS (208.67.220.220)\"))\n\to:value(\"209.244.0.3:53\", translate(\"Level 3 Public DNS (209.244.0.3)\"))\n\to:value(\"209.244.0.4:53\", translate(\"Level 3 Public DNS (209.244.0.4)\"))\n\to:value(\"4.2.2.1:53\", translate(\"Level 3 Public DNS (4.2.2.1)\"))\n\to:value(\"4.2.2.2:53\", translate(\"Level 3 Public DNS (4.2.2.2)\"))\n\to:value(\"4.2.2.3:53\", translate(\"Level 3 Public DNS (4.2.2.3)\"))\n\to:value(\"4.2.2.4:53\", translate(\"Level 3 Public DNS (4.2.2.4)\"))\n\to:value(\"1.1.1.1:53\", translate(\"Cloudflare DNS (1.1.1.1)\"))\n\to:depends(\"shunt_dns_mode\", \"5\")\n\to.description = translate(\n    \t\"<ul>\" ..\n    \t\"<li>\" .. translate(\"Custom DNS Server format as IP:PORT (default: 8.8.4.4:53)\") .. \"</li>\" .. \n    \t\"<li>\" .. translate(\"Muitiple DNS server can saperate with ','\") .. \"</li>\" ..\n    \t\"</ul>\"\n\t)\n\n\to = s:option(ListValue, \"chinadns_ng_shunt_proto\", translate(\"ChinaDNS-NG shunt query protocol\"))\n\to:value(\"none\", translate(\"UDP/TCP upstream\"))\n\to:value(\"tcp\", translate(\"TCP upstream\"))\n\to:value(\"udp\", translate(\"UDP upstream\"))\n\to:value(\"tls\", translate(\"DoT upstream (Need use wolfssl version)\"))\n\to:depends(\"shunt_dns_mode\", \"5\")\nend\n\no = s:option(Flag, \"apple_optimization\", translate(\"Apple domains optimization\"), translate(\"For Apple domains equipped with Chinese mainland CDN, always responsive to Chinese CDN IP addresses\"))\no.rmempty = false\no.default = \"1\"\n\no = s:option(Value, \"apple_url\", translate(\"Apple Domains Update url\"))\no:value(\"https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/apple.china.conf\", translate(\"felixonmars/dnsmasq-china-list\"))\no.default = \"https://fastly.jsdelivr.net/gh/felixonmars/dnsmasq-china-list/apple.china.conf\"\no:depends(\"apple_optimization\", \"1\")\n\no = s:option(Value, \"apple_dns\", translate(\"Apple Domains DNS\"), translate(\"If empty, Not change Apple domains parsing DNS (Default is empty)\"))\no.rmempty = true\no.default = \"\"\no.datatype = \"ip4addr\"\no:depends(\"apple_optimization\", \"1\")\n\no = s:option(Flag, \"adblock\", translate(\"Enable adblock\"))\no.rmempty = false\n\no = s:option(Value, \"adblock_url\", translate(\"adblock_url\"))\no:value(\"https://raw.githubusercontent.com/neodevpro/neodevhost/master/dnsmasq.conf\", translate(\"NEO DEV HOST\"))\no:value(\"https://anti-ad.net/anti-ad-for-dnsmasq.conf\", translate(\"anti-AD\"))\no.default = \"https://raw.githubusercontent.com/neodevpro/neodevhost/master/dnsmasq.conf\"\no:depends(\"adblock\", \"1\")\no.description = translate(\"Support AdGuardHome and DNSMASQ format list\")\n\no = s:option(Button, \"Reset\", translate(\"Reset to defaults\"))\no.inputstyle = \"reload\"\no.write = function()\n\tluci.sys.call(\"/etc/init.d/shadowsocksr reset\")\n\tluci.http.redirect(luci.dispatcher.build_url(\"admin\", \"services\", \"shadowsocksr\", \"servers\"))\nend\n\n-- [[ SOCKS5 Proxy ]]--\ns = m:section(TypedSection, \"socks5_proxy\", translate(\"Global SOCKS5 Proxy Server\"))\ns.anonymous = true\n\n-- Enable/Disable Option\no = s:option(Flag, \"enabled\", translate(\"Enable\"))\no.default = 0\no.rmempty = false\n\n-- Server Selection\no = s:option(ListValue, \"server\", translate(\"Server\"))\no:value(\"same\", translate(\"Same as Global Server\"))\nfor _, key in pairs(key_table) do\n\to:value(key, server_table[key])\nend\no.default = \"same\"\no.rmempty = false\n\n-- Dynamic value handling based on enabled/disabled state\no.cfgvalue = function(self, section)\n\tlocal enabled = m:get(section, \"enabled\")\n\tif enabled == \"0\" then\n\t\treturn m:get(section, \"old_server\")\n\tend\n\treturn Value.cfgvalue(self, section)-- Default to `same` when enabled\nend\n\no.write = function(self, section, value)\n\tlocal enabled = m:get(section, \"enabled\")\n\tif enabled == \"0\" then\n\t\tlocal old_server = Value.cfgvalue(self, section)\n\t\tif old_server ~= \"nil\" then\n\t\t\tm:set(section, \"old_server\", old_server)\n\t\tend\n\t\tm:set(section, \"server\", \"nil\")\n\telse\n\t\tm:del(section, \"old_server\")\n\t\t-- Write the value normally when enabled\n\t\tValue.write(self, section, value)\n\tend\nend\n\n-- Socks Auth\nif is_finded(\"xray\") then\no = s:option(ListValue, \"socks5_auth\", translate(\"Socks5 Auth Mode\"), translate(\"Socks protocol auth methods, default:noauth.\"))\no.default = \"noauth\"\no:value(\"noauth\", \"NOAUTH\")\no:value(\"password\", \"PASSWORD\")\no.rmempty = true\nfor key, server_type in pairs(type_table) do\n\tif server_type == \"v2ray\" then\n\t\t-- 如果服务器类型是 v2ray，则设置依赖项显示\n\t\to:depends(\"server\", key)\n\tend\nend\no:depends({server = \"same\", disable = true})\n\n-- Socks User\no = s:option(Value, \"socks5_user\", translate(\"Socks5 User\"), translate(\"Only when Socks5 Auth Mode is password valid, Mandatory.\"))\no.rmempty = true\no:depends(\"socks5_auth\", \"password\")\n\n-- Socks Password\no = s:option(Value, \"socks5_pass\", translate(\"Socks5 Password\"), translate(\"Only when Socks5 Auth Mode is password valid, Not mandatory.\"))\no.password = true\no.rmempty = true\no:depends(\"socks5_auth\", \"password\")\n\n-- Socks Mixed\no = s:option(Flag, \"socks5_mixed\", translate(\"Enabled Mixed\"), translate(\"Mixed as an alias of socks, default:Enabled.\"))\no.default = \"1\"\no.rmempty = false\nfor key, server_type in pairs(type_table) do\n\tif server_type == \"v2ray\" then\n\t\t-- 如果服务器类型是 v2ray，则设置依赖项显示\n\t\to:depends(\"server\", key)\n\tend\nend\no:depends({server = \"same\", disable = true})\nend\n\n-- Local Port\no = s:option(Value, \"local_port\", translate(\"Local Port\"))\no.datatype = \"port\"\no.default = 1080\no.rmempty = false\n\n-- [[ fragmen Settings ]]--\nif is_finded(\"xray\") then\n\ts = m:section(TypedSection, \"global_xray_fragment\", translate(\"Xray Fragment Settings\"))\n\ts.anonymous = true\n\n\to = s:option(Flag, \"fragment\", translate(\"Fragment\"), translate(\"TCP fragments, which can deceive the censorship system in some cases, such as bypassing SNI blacklists.\"))\n\to.default = 0\n\n\to = s:option(ListValue, \"fragment_packets\", translate(\"Fragment Packets\"), translate(\"\\\"1-3\\\" is for segmentation at TCP layer, applying to the beginning 1 to 3 data writes by the client. \\\"tlshello\\\" is for TLS client hello packet fragmentation.\"))\n\to.default = \"tlshello\"\n\to:value(\"tlshello\", \"tlshello\")\n\to:value(\"1-1\", \"1-1\")\n\to:value(\"1-2\", \"1-2\")\n\to:value(\"1-3\", \"1-3\")\n\to:value(\"1-5\", \"1-5\")\n\to:depends(\"fragment\", true)\n\n\to = s:option(Value, \"fragment_length\", translate(\"Fragment Length\"), translate(\"Fragmented packet length (byte)\"))\n\to.datatype = \"or(uinteger,portrange)\"\n\to.default = \"100-200\"\n\to:depends(\"fragment\", true)\n\n\to = s:option(Value, \"fragment_delay\", translate(\"Fragment Delay\"), translate(\"Fragmentation interval (ms)\"))\n\to.datatype = \"or(uinteger,portrange)\"\n\to.default = \"10-20\"\n\to:depends(\"fragment\", true)\n\n\to = s:option(Value, \"fragment_maxSplit\", translate(\"Max Split\"), translate(\"Limit the maximum number of splits.\"))\n\to.datatype = \"or(uinteger,portrange)\"\n\to.default = \"100-200\"\n\to:depends(\"fragment\", true)\n\n\to = s:option(Flag, \"noise\", translate(\"Noise\"), translate(\"UDP noise, Under some circumstances it can bypass some UDP based protocol restrictions.\"))\n\to.default = 0\n\n\ts = m:section(TypedSection, \"xray_noise_packets\", translate(\"Xray Noise Packets\"))\n\ts.description = translate(\n\t\t\"<font style='color:red'>\" .. translate(\"To send noise packets, select \\\"Noise\\\" in Xray Settings.\") .. \"</font>\" ..\n\t\t\"<br/><font><b>\" .. translate(\"Packet or Rand length as a string, e.g., 10-20.\") .. \"</b></font>\" ..\n\t\t\"<br/><font><b>\" .. translate(\"For specific usage, see:\") .. \"</b></font>\" ..\n\t\t\"<a href='https://xtls.github.io/config/outbounds/freedom.html' target='_blank'>\" ..\n\t\t\"<font style='color:green'><b>\" .. translate(\"Click to the page\") .. \"</b></font></a>\")\n\ts.template = \"cbi/tblsection\"\n\ts.sortable = true\n\ts.anonymous = true\n\ts.addremove = true\n\n\ts.remove = function(self, section)\n\t\tfor k, v in pairs(self.children) do\n\t\t\tv.rmempty = true\n\t\t\tv.validate = nil\n\t\tend\n\t\tTypedSection.remove(self, section)\n\tend\n\n\to = s:option(Flag, \"enabled\", translate(\"Enable\"))\n\to.default = 1\n\to.rmempty = false\n\n\to = s:option(ListValue, \"type\", translate(\"Type\"))\n\to.default = \"base64\"\n\to:value(\"rand\", \"rand\")\n\to:value(\"str\", \"str\")\n\to:value(\"hex\", \"hex\")\n\to:value(\"base64\", \"base64\")\n\n\to = s:option(Value, \"domainStrategy\", translate(\"Domain Strategy\"))\n\to.default = \"AsIs\"\n\to:value(\"AsIs\", \"AsIs\")\n\to:value(\"UseIP\", \"UseIP\")\n\to:value(\"UseIPv4\", \"UseIPv4\")\n\to:value(\"ForceIP\", \"ForceIP\")\n\to:value(\"ForceIPv4\", \"ForceIPv4\")\n\to.rmempty = false\n\n\to = s:option(Value, \"packet\", translate(\"Packet | Rand Length\"))\n\to.datatype = \"minlength(1)\"\n\to.rmempty = false\n\n\to = s:option(Value, \"delay\", translate(\"Delay (ms)\"))\n\to.datatype = \"or(uinteger,portrange)\"\n\to.rmempty = false\n\t\n\ts:append(cbi.Template(\"shadowsocksr/optimize_cbi_ui\"))\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua",
    "content": "-- Copyright (C) 2017 yushi studio <ywb94@qq.com> github.com/ywb94\n-- Licensed to the public under the GNU General Public License v3.\n\nrequire \"nixio.fs\"\nrequire \"luci.sys\"\nrequire \"luci.http\"\nrequire \"luci.jsonc\"\nlocal nixio = require \"nixio\"\nrequire \"luci.model.uci\"\nlocal uci = require \"luci.model.uci\".cursor()\n\nlocal m, s, o\n\nlocal sid = arg[1]\nlocal uuid = luci.sys.exec(\"cat /proc/sys/kernel/random/uuid\")\nlocal b64decode = nixio.bin.b64decode\nlocal b64encode = nixio.bin.b64encode\nlocal xray_version = nil\nlocal xray_version_val = 0\n\n-- 确保正确判断程序是否存在\nlocal function is_finded(e)\n\treturn luci.sys.exec(string.format('type -t -p \"%s\" 2>/dev/null', e)) ~= \"\"\nend\n\nlocal function is_installed(e)\n\treturn luci.model.ipkg.installed(e)\nend\n\nlocal function is_js_luci()\n\treturn luci.sys.call('[ -f \"/www/luci-static/resources/uci.js\" ]') == 0\nend\n\n-- trim\nlocal function trim(text)\n\tif not text or text == \"\" then\n\t\treturn \"\"\n\tend\n\treturn (text:gsub(\"^%s*(.-)%s*$\", \"%1\"))\nend\n\n-- base64 解码\nlocal function base64Decode(text)\n\tlocal raw = text\n\tif not text or text == \"\" then\n\t\treturn ''\n\tend\n\ttext = text:gsub(\"%z\", \"\")\n\ttext = text:gsub(\"%c\", \"\")\n\ttext = text:gsub(\"%s\", \"\")\n\ttext = text:gsub(\"_\", \"/\")\n\ttext = text:gsub(\"-\", \"+\")\n\ttext = text:gsub(\"=\", \"\")\n\tlocal mod4 = #text % 4\n\ttext = text .. string.sub('====', mod4 + 1)\n\tlocal result = b64decode(text)\n\tif result then\n\t\treturn result:gsub(\"%z\", \"\")\n\telse\n\t\treturn raw\n\tend\nend\n\n-- base64 编码\nlocal function base64Encode(text)\n\tif not text or text == \"\" then\n\t\treturn ''\n\tend\n\tlocal result = b64encode(text)\n\tif result then\n\t\tresult = result:gsub(\"%z\", \"\")\n\t\treturn result\n\telse\n\t\treturn text\n\tend\nend\n\n-- 获取 Xray 版本号\nif is_finded(\"xray\") then\n\tlocal version = luci.sys.exec(\"xray version 2>&1\")\n\tif version and version ~= \"\" then\n\t\txray_version = version:match(\"Xray%s+([%d%.]+)\")\n\t\t-- xray_version = version:match(\"([0-9]+%.[0-9]+%.[0-9]+)\")\n\tend\nend\n\n-- 将 Xray 版本号转换为数字\nif xray_version and xray_version ~= \"\" then\n\tlocal major, minor, patch =\n\t\txray_version:match(\"(%d+)%.?(%d*)%.?(%d*)\")\n\n\tmajor = tonumber(major) or 0\n\tminor = tonumber(minor) or 0\n\tpatch = tonumber(patch) or 0\n\n\txray_version_val = major * 10000 + minor * 100 + patch\nend\n\nlocal function url(...)\n\tlocal url = string.format(\"admin/services/%s\", \"shadowsocksr\")\n\tlocal args = { ... }\n\tfor i, v in ipairs(args) do\n\t\tif v and v ~= \"\" then\n\t\t\turl = url .. \"/\" .. v\n\t\tend\n\tend\n\treturn require \"luci.dispatcher\".build_url(url)\nend\n\n-- 默认的保存并应用行为\nlocal function apply_redirect(m)\n\tlocal tmp_uci_file = \"/etc/config/\" .. \"shadowsocksr\" .. \"_redirect\"\n\tif m.redirect and m.redirect ~= \"\" then\n\t\tif nixio.fs.access(tmp_uci_file) then\n\t\t\tlocal redirect\n\t\t\tfor line in io.lines(tmp_uci_file) do\n\t\t\t\tredirect = line:match(\"option%s+url%s+['\\\"]([^'\\\"]+)['\\\"]\")\n\t\t\t\tif redirect and redirect ~= \"\" then break end\n\t\t\tend\n\t\t\tif redirect and redirect ~= \"\" then\n\t\t\t\tluci.sys.call(\"/bin/rm -f \" .. tmp_uci_file)\n\t\t\t\tluci.http.redirect(redirect)\n\t\t\tend\n\t\telse\n\t\t\tnixio.fs.writefile(tmp_uci_file, \"config redirect\\n\")\n\t\tend\n\t\tm.on_after_save = function(self)\n\t\t\tlocal redirect = self.redirect\n\t\t\tif redirect and redirect ~= \"\" then\n\t\t\t\tm.uci:set(\"shadowsocksr\" .. \"_redirect\", \"@redirect[0]\", \"url\", redirect)\n\t\t\tend\n\t\tend\n\telse\n\t\tluci.sys.call(\"/bin/rm -f \" .. tmp_uci_file)\n\tend\nend\n\nlocal function set_apply_on_parse(map)\n\tif not map then return end\n\tif is_js_luci() then\n\t\tapply_redirect(map)\n\t\tlocal old = map.on_after_save\n\t\tmap.on_after_save = function(self)\n\t\t\tif old then old(self) end\n\t\t\tmap:set(\"@global[0]\", \"timestamp\", os.time())\n\t\tend\n\tend\nend\n\nlocal has_ss_rust = is_finded(\"sslocal\") or is_finded(\"ssserver\")\nlocal has_ss_libev = is_finded(\"ss-redir\") or is_finded(\"ss-local\")\nlocal has_trojan = is_finded(\"trojan\")\nlocal has_xray = is_finded(\"xray\")\nlocal has_hysteria2 = is_finded(\"hysteria\")\n\nlocal server_table = {}\nlocal encrypt_methods = {\n\t-- ssr\n\t\"none\",\n\t\"table\",\n\t\"rc4\",\n\t\"rc4-md5-6\",\n\t\"rc4-md5\",\n\t\"aes-128-cfb\",\n\t\"aes-192-cfb\",\n\t\"aes-256-cfb\",\n\t\"aes-128-ctr\",\n\t\"aes-192-ctr\",\n\t\"aes-256-ctr\",\n\t\"bf-cfb\",\n\t\"camellia-128-cfb\",\n\t\"camellia-192-cfb\",\n\t\"camellia-256-cfb\",\n\t\"cast5-cfb\",\n\t\"des-cfb\",\n\t\"idea-cfb\",\n\t\"rc2-cfb\",\n\t\"seed-cfb\",\n\t\"salsa20\",\n\t\"chacha20\",\n\t\"chacha20-ietf\"\n}\n\nlocal encrypt_methods_ss = {\n\t-- plain\n\t\"none\",\n\t\"plain\",\n\t-- aead\n\t\"aes-128-gcm\",\n\t\"aes-192-gcm\",\n\t\"aes-256-gcm\",\n\t\"chacha20-ietf-poly1305\",\n\t\"xchacha20-ietf-poly1305\",\n\t-- aead 2022\n\t\"2022-blake3-aes-128-gcm\",\n\t\"2022-blake3-aes-256-gcm\",\n\t\"2022-blake3-chacha20-poly1305\"\n\t--[[ stream\n\t\"none\",\n\t\"plain\",\n\t\"table\",\n\t\"rc4\",\n\t\"rc4-md5\",\n\t\"aes-128-cfb\",\n\t\"aes-192-cfb\",\n\t\"aes-256-cfb\",\n\t\"aes-128-ctr\",\n\t\"aes-192-ctr\",\n\t\"aes-256-ctr\",\n\t\"bf-cfb\",\n\t\"camellia-128-cfb\",\n\t\"camellia-192-cfb\",\n\t\"camellia-256-cfb\",\n\t\"salsa20\",\n\t\"chacha20\",\n\t\"chacha20-ietf\" ]]--\n}\n\nlocal protocol = {\n\t-- ssr\n\t\"origin\",\n\t\"verify_deflate\",\n\t\"auth_sha1_v4\",\n\t\"auth_aes128_sha1\",\n\t\"auth_aes128_md5\",\n\t\"auth_chain_a\",\n\t\"auth_chain_b\",\n\t\"auth_chain_c\",\n\t\"auth_chain_d\",\n\t\"auth_chain_e\",\n\t\"auth_chain_f\"\n}\n\nlocal obfs = {\n\t-- ssr\n\t\"plain\",\n\t\"http_simple\",\n\t\"http_post\",\n\t\"random_head\",\n\t\"tls1.2_ticket_auth\"\n}\n\nlocal securitys = {\n\t-- vmess\n\t\"auto\",\n\t\"none\",\n\t\"zero\",\n\t\"aes-128-gcm\",\n\t\"chacha20-poly1305\"\n}\n\nlocal tls_flows = {\n\t-- tls\n\t\"xtls-rprx-vision\",\n\t\"xtls-rprx-vision-udp443\",\n\t\"none\"\n}\n\nm = Map(\"shadowsocksr\", translate(\"Edit ShadowSocksR Server\"))\nm.redirect = url(\"servers\")\nif not sid or m.uci:get(\"shadowsocksr\", sid) ~= \"servers\" then\n\tluci.http.redirect(m.redirect)\n\treturn\nend\n-- 保存&应用成功后跳转到节点列表\nset_apply_on_parse(m)\n\n-- [[ Servers Setting ]]--\ns = m:section(NamedSection, sid, \"servers\")\ns.anonymous = true\ns.addremove = false\n\no = s:option(DummyValue, \"ssr_url\", \"SS/SSR/V2RAY/TROJAN/TUIC/HYSTERIA2 URL\")\no.rawhtml = true\no.template = \"shadowsocksr/ssrurl\"\no.value = sid\n\n-- 新增一个选择框，用于选择 Xray 或 Hysteria2 核心\no = s:option(ListValue, \"_xray_hy2_type\", string.format(\"<b><span style='color:red;'>%s</span></b>\", translatef(\"%s Node Use Type\", \"Hysteria2\")))\no.description = translate(\"The configured type also applies to the core specified when manually importing nodes.\")\n-- 注意：Auto 选项使用特殊字符串 \"__auto__\" 而不是空字符串\no:value(\"__auto__\", translate(\"Auto\"))\nif has_hysteria2 then\n    o:value(\"hysteria2\", translate(\"Hysteria2\"))\nend\nif has_xray then\n    o:value(\"v2ray\", translate(\"Xray (Hysteria2)\"))\nend\n-- 读取全局 xray_hy2_type\no.cfgvalue = function(self, section)\n    local val = uci:get(\"shadowsocksr\", \"@server_subscribe[0]\", \"xray_hy2_type\")\n    if val == nil or val == \"\" then\n\t\treturn \"__auto__\"   -- 对应 Auto 选项\n    end\n    return val\nend\no.rmempty = true\n-- 保存时更新全局配置\no.write = function(self, section, value)\n    if value == \"__auto__\" then\n\t\t-- 删除全局配置\n\t\tuci:delete(\"shadowsocksr\", \"@server_subscribe[0]\", \"xray_hy2_type\")\n    else\n\t\t-- 设置具体值\n\t\tuci:set(\"shadowsocksr\", \"@server_subscribe[0]\", \"xray_hy2_type\", value)\n    end\nend\n\n-- 新增一个选择框，用于选择 Xray 或 Trojan 核心\no = s:option(ListValue, \"_xray_tj_type\", string.format(\"<b><span style='color:red;'>%s</span></b>\", translatef(\"%s Node Use Type\", \"Trojan\")))\no.description = translate(\"The configured type also applies to the core specified when manually importing nodes.\")\n-- 注意：Auto 选项使用特殊字符串 \"__auto__\" 而不是空字符串\no:value(\"__auto__\", translate(\"Auto\"))\nif has_hysteria2 then\n    o:value(\"trojan\", translate(\"Trojan\"))\nend\nif has_xray then\n    o:value(\"v2ray\", translate(\"Xray (Trojan)\"))\nend\n-- 读取全局 xray_tj_type\no.cfgvalue = function(self, section)\n    local val = uci:get(\"shadowsocksr\", \"@server_subscribe[0]\", \"xray_tj_type\")\n    if val == nil or val == \"\" then\n\t\treturn \"__auto__\"   -- 对应 Auto 选项\n    end\n    return val\nend\no.rmempty = true\n-- 保存时更新全局配置\no.write = function(self, section, value)\n    if value == \"__auto__\" then\n\t\t-- 删除全局配置\n\t\tuci:delete(\"shadowsocksr\", \"@server_subscribe[0]\", \"xray_tj_type\")\n    else\n\t\t-- 设置具体值\n\t\tuci:set(\"shadowsocksr\", \"@server_subscribe[0]\", \"xray_tj_type\", value)\n    end\nend\n\no = s:option(ListValue, \"type\", translate(\"Server Node Type\"))\nif is_finded(\"xray\") or is_finded(\"v2ray\") then\n\to:value(\"v2ray\", translate(\"V2Ray/XRay\"))\nend\nif is_finded(\"ssr-redir\") then\n\to:value(\"ssr\", translate(\"ShadowsocksR\"))\nend\nif has_ss_rust or has_ss_libev then\n    o:value(\"ss\", translate(\"ShadowSocks\"))\nend\nif is_finded(\"trojan\") then\n\to:value(\"trojan\", translate(\"Trojan\"))\nend\nif is_finded(\"naive\") then\n\to:value(\"naiveproxy\", translate(\"NaiveProxy\"))\nend\nif is_finded(\"hysteria\") then\n\to:value(\"hysteria2\", translate(\"Hysteria2\"))\nend\nif is_finded(\"tuic-client\") then\n\to:value(\"tuic\", translate(\"TUIC\"))\nend\nif is_finded(\"shadow-tls\") and is_finded(\"sslocal\") then\n\to:value(\"shadowtls\", translate(\"Shadow-TLS\"))\nend\nif is_finded(\"ipt2socks\") then\n\to:value(\"socks5\", translate(\"Socks5\"))\nend\nif is_finded(\"redsocks2\") then\n\to:value(\"tun\", translate(\"Network Tunnel\"))\nend\nlocal old_cfgvalue = o.cfgvalue\no.cfgvalue = function(self, section)\n    local val = self.map.uci:get(\"shadowsocksr\", section, \"type\")\n    if val == \"ss-rust\" or val == \"ss-libev\" then\n\t\treturn \"ss\"\n    end\n    if old_cfgvalue then\n\t\treturn old_cfgvalue(self, section)\n    end\n    return val\nend\n-- 重写 write，当用户选择 \"ss\" 时不写入（由 _ss_core 负责写入具体核心）\nlocal old_write = o.write\no.write = function(self, section, value)\n    if value == \"ss\" then\n\t\treturn  -- 不做任何写入，等待 _ss_core 写入\n    end\n    if old_write then\n\t\told_write(self, section, value)\n    else\n\t\tself.map.uci:set(\"shadowsocksr\", section, \"type\", value)\n    end\nend\n\no.description = translate(\"Using incorrect encryption mothod may causes service fail to start\")\n\no = s:option(Value, \"alias\", translate(\"Alias(optional)\"))\n\no = s:option(ListValue, \"iface\", translate(\"Network interface to use\"))\nfor _, e in ipairs(luci.sys.net.devices()) do\n\tif e ~= \"lo\" then\n\t\to:value(e)\n\tend\nend\no:depends(\"type\", \"tun\")\no.description = translate(\"Redirect traffic to this network interface\")\n\n-- 新增一个选择框，用于选择 Shadowsocks 具体版本（仅当节点类型为 ss 或其具体子类型时显示）\no = s:option(ListValue, \"_ss_core\", string.format(\"<b><span style='color:red;'>%s</span></b>\", translatef(\"%s Node Use Version\", \"ShadowSocks\")))\no.description = translate(\"Selection ShadowSocks Node Use Version.\")\nif has_ss_rust then\n    o:value(\"ss-rust\", translate(\"ShadowSocks-rust Version\"))\nend\nif has_ss_libev then\n    o:value(\"ss-libev\", translate(\"ShadowSocks-libev Version\"))\nend\no.cfgvalue = function(self, section)\n    -- 读取当前节点的 type 值，如果已经是具体核心则显示对应的选项\n    local node_type = self.map.uci:get(\"shadowsocksr\", section, \"type\")\n    if node_type == \"ss-rust\" or node_type == \"ss-libev\" then\n\t\treturn node_type\n    end\n    -- 如果全局 ss_type 有值且为具体核心则返回该值\n    local ss_type = self.map.uci:get(\"shadowsocksr\", \"@server_subscribe[0]\", \"ss_type\")\n    if ss_type == \"ss-rust\" or ss_type == \"ss-libev\" then\n\t\treturn ss_type\n    end\n    -- 如果节点 type 是旧的 \"ss\"，则返回空，手动选择\n    return nil\nend\n-- 显示条件：当节点类型为 \"ss\" 或其具体核心时显示\no:depends(\"type\", \"ss\")\no.rmempty = true\n-- 保存时，将选择的值直接写入当前节点的 type 字段\no.write = function(self, section, value)\n    if value and value ~= \"\" then\n\t\tself.map.uci:set(\"shadowsocksr\", section, \"type\", value)\n    end\nend\n\no = s:option(ListValue, \"v2ray_protocol\", translate(\"V2Ray/XRay protocol\"))\no:value(\"vless\", translate(\"VLESS\"))\no:value(\"vmess\", translate(\"VMess\"))\no:value(\"trojan\", translate(\"Trojan\"))\no:value(\"shadowsocks\", translate(\"ShadowSocks\"))\nif is_finded(\"xray\") then\n\to:value(\"wireguard\", translate(\"WireGuard\"))\nend\nif is_finded(\"xray\") then\n\to:value(\"hysteria2\", translate(\"Hysteria2\"))\nend\no:value(\"socks\", translate(\"Socks\"))\no:value(\"http\", translate(\"HTTP\"))\no:depends(\"type\", \"v2ray\")\n\no = s:option(Value, \"server\", translate(\"Server Address\"))\no.datatype = \"host\"\no.rmempty = false\no:depends(\"type\", \"ssr\")\no:depends(\"type\", \"ss\")\no:depends(\"type\", \"v2ray\")\no:depends(\"type\", \"trojan\")\no:depends(\"type\", \"naiveproxy\")\no:depends(\"type\", \"hysteria2\")\no:depends(\"type\", \"tuic\")\no:depends(\"type\", \"shadowtls\")\no:depends(\"type\", \"socks5\")\n\no = s:option(Value, \"server_port\", translate(\"Server Port\"))\no.datatype = \"port\"\no.rmempty = true\no:depends(\"type\", \"ssr\")\no:depends(\"type\", \"ss\")\no:depends(\"type\", \"v2ray\")\no:depends(\"type\", \"trojan\")\no:depends(\"type\", \"naiveproxy\")\no:depends(\"type\", \"hysteria2\")\no:depends(\"type\", \"tuic\")\no:depends(\"type\", \"shadowtls\")\no:depends(\"type\", \"socks5\")\n\no = s:option(Flag, \"auth_enable\", translate(\"Enable Authentication\"))\no.rmempty = false\no.default = \"0\"\no:depends(\"type\", \"socks5\")\no:depends({type = \"v2ray\", v2ray_protocol = \"http\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"socks\"})\n\no = s:option(Value, \"username\", translate(\"Username\"))\no.rmempty = true\no:depends(\"type\", \"naiveproxy\")\no:depends({type = \"socks5\", auth_enable = true})\no:depends({type = \"v2ray\", v2ray_protocol = \"http\", auth_enable = true})\no:depends({type = \"v2ray\", v2ray_protocol = \"socks\", auth_enable = true})\n\no = s:option(Value, \"password\", translate(\"Password\"))\no.password = true\no.rmempty = true\no:depends(\"type\", \"ssr\")\no:depends(\"type\", \"ss\")\no:depends(\"type\", \"trojan\")\no:depends(\"type\", \"naiveproxy\")\no:depends(\"type\", \"shadowtls\")\no:depends({type = \"socks5\", auth_enable = true})\no:depends({type = \"v2ray\", v2ray_protocol = \"http\", auth_enable = true})\no:depends({type = \"v2ray\", v2ray_protocol = \"socks\", socks_ver = \"5\", auth_enable = true})\no:depends({type = \"v2ray\", v2ray_protocol = \"shadowsocks\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"trojan\"})\n\no = s:option(ListValue, \"encrypt_method\", translate(\"Encrypt Method\"))\nfor _, v in ipairs(encrypt_methods) do\n\to:value(v)\nend\no.rmempty = true\no:depends(\"type\", \"ssr\")\n\no = s:option(ListValue, \"encrypt_method_ss\", translate(\"Encrypt Method\"))\nfor _, v in ipairs(encrypt_methods_ss) do\n\tif v == \"none\" then\n\t   o.default = \"none\"\n\t   o:value(\"none\", translate(\"none\"))\n\telse\n\t    o:value(v, translate(v))\n\tend\nend\no.rmempty = true\no:depends(\"type\", \"ss\")\no:depends({type = \"v2ray\", v2ray_protocol = \"shadowsocks\"})\n\no = s:option(Flag, \"uot\", translate(\"UDP over TCP\"))\no.description = translate(\"Enable the SUoT protocol, requires server support.\")\no.rmempty = true\no:depends({type = \"v2ray\", v2ray_protocol = \"shadowsocks\"})\no.default = \"0\"\n\no = s:option(Flag, \"ivCheck\", translate(\"Bloom Filter\"))\no.rmempty = true\no:depends({type = \"v2ray\", v2ray_protocol = \"shadowsocks\"})\no.default = \"1\"\n\n-- [[ Enable Shadowsocks Plugin ]]--\no = s:option(Flag, \"enable_plugin\", translate(\"Enable Plugin\"))\no.rmempty = true\no:depends(\"type\", \"ss\")\no.default = \"0\"\n\n-- Shadowsocks Plugin\no = s:option(ListValue, \"plugin\", translate(\"Obfs\"))\no:value(\"none\", translate(\"None\"))\nif is_finded(\"obfs-local\") then\n\to:value(\"obfs-local\", translate(\"obfs-local\"))\nend\nif is_finded(\"v2ray-plugin\") then\n\to:value(\"v2ray-plugin\", translate(\"v2ray-plugin\"))\nend\nif is_finded(\"xray-plugin\") then\n\to:value(\"xray-plugin\", translate(\"xray-plugin\"))\nend\nif is_finded(\"shadow-tls\") then\n\to:value(\"shadow-tls\", translate(\"shadow-tls\"))\nend\no:value(\"custom\", translate(\"Custom\"))\no.rmempty = true\no:depends({enable_plugin = true})\n\no = s:option(Value, \"custom_plugin\", translate(\"Custom Plugin Path\"))\no.placeholder = \"/path/to/custom-plugin\"\no:depends({plugin = \"custom\"})\n\no = s:option(Value, \"plugin_opts\", translate(\"Plugin Opts\"))\no.rmempty = true\no:depends({enable_plugin = true})\n\no = s:option(ListValue, \"protocol\", translate(\"Protocol\"))\nfor _, v in ipairs(protocol) do\n\to:value(v)\nend\no.rmempty = true\no:depends(\"type\", \"ssr\")\n\no = s:option(Value, \"protocol_param\", translate(\"Protocol param (optional)\"))\no:depends(\"type\", \"ssr\")\n\no = s:option(ListValue, \"obfs\", translate(\"Obfs\"))\nfor _, v in ipairs(obfs) do\n\to:value(v)\nend\no.rmempty = true\no:depends(\"type\", \"ssr\")\n\no = s:option(Value, \"obfs_param\", translate(\"Obfs param (optional)\"))\no:depends(\"type\", \"ssr\")\n\n\n-- [[ Hysteria2 ]]--\no = s:option(Value, \"hy2_auth\", translate(\"Users Authentication\"))\no:depends(\"type\", \"hysteria2\")\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\"})\no.password = true\no.rmempty = false\n\no = s:option(Flag, \"flag_port_hopping\", translate(\"Enable Port Hopping\"))\no:depends(\"type\", \"hysteria2\")\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\"})\no.rmempty = true\no.default = \"0\"\n\no = s:option(Value, \"port_range\", translate(\"Port hopping range\"))\no.description = translate(\"Format as 10000:20000 or 10000-20000 Multiple groups are separated by commas (,).\")\no:depends({type = \"hysteria2\", flag_port_hopping = true})\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\", flag_port_hopping = true})\no.datatype = \"or(uinteger,portrange)\"\no.rmempty = true\n\no = s:option(Flag, \"flag_transport\", translate(\"Enable Transport Protocol Settings\"))\no:depends(\"type\", \"hysteria2\")\no.rmempty = true\no.default = \"0\"\n\no = s:option(ListValue, \"transport_protocol\", translate(\"Transport Protocol\"))\no:depends({type = \"hysteria2\", flag_transport = true})\no:value(\"udp\", translate(\"UDP\"))\no.default = \"udp\"\no.rmempty = true\n\no = s:option(Value, \"hopinterval\", translate(\"Port Hopping Interval(Unit:Second)\"))\no.description = translate(\"Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5.\")\no:depends({type = \"hysteria2\", flag_transport = true, flag_port_hopping = true})\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\", flag_port_hopping = true})\no.datatype = \"or(uinteger,portrange)\"\no.rmempty = true\no.default = \"30\"\n\no = s:option(Flag, \"flag_obfs\", translate(\"Enable Obfuscation\"))\no:depends(\"type\", \"hysteria2\")\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\"})\no.rmempty = true\no.default = \"0\"\n\no = s:option(Flag, \"lazy_mode\", translate(\"Enable Lazy Mode\"))\no:depends(\"type\", \"hysteria2\")\no.rmempty = true\no.default = \"0\"\n\no = s:option(Value, \"obfs_type\", translate(\"Obfuscation Type\"))\no:depends({type = \"hysteria2\", flag_obfs = true})\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\", flag_obfs = true})\no.rmempty = true\no.placeholder = \"salamander\"\n\no = s:option(Value, \"salamander\", translate(\"Obfuscation Password\"))\no:depends({type = \"hysteria2\", flag_obfs = true})\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\", flag_obfs = true})\no.password = true\no.rmempty = true\no.placeholder = \"cry_me_a_r1ver\"\n\no = s:option(Flag, \"flag_quicparam\", translate(\"Hysterir QUIC parameters\"))\no:depends(\"type\", \"hysteria2\")\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\"})\no.rmempty = true\no.default = \"0\"\n\no = s:option(Flag, \"disablepathmtudiscovery\", translate(\"Disable QUIC path MTU discovery\"))\no:depends({type = \"hysteria2\",flag_quicparam = true})\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\", flag_quicparam = true})\no.rmempty = true\no.default = false\n\n--[[Hysteria2 QUIC parameters setting]]\no = s:option(Value, \"initstreamreceivewindow\", translate(\"QUIC initStreamReceiveWindow\"))\no:depends({type = \"hysteria2\", flag_quicparam = true})\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\", flag_quicparam = true})\no.datatype = \"uinteger\"\no.rmempty = true\no.default = \"8388608\"\n\no = s:option(Value, \"maxstreamreceivewindow\", translate(\"QUIC maxStreamReceiveWindow\"))\no:depends({type = \"hysteria2\", flag_quicparam = true})\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\", flag_quicparam = true})\no.datatype = \"uinteger\"\no.rmempty = true\no.default = \"8388608\"\n\no = s:option(Value, \"initconnreceivewindow\", translate(\"QUIC initConnReceiveWindow\"))\no:depends({type = \"hysteria2\", flag_quicparam = true})\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\", flag_quicparam = true})\no.datatype = \"uinteger\"\no.rmempty = true\no.default = \"20971520\"\n\no = s:option(Value, \"maxconnreceivewindow\", translate(\"QUIC maxConnReceiveWindow\"))\no:depends({type = \"hysteria2\", flag_quicparam = true})\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\", flag_quicparam = true})\no.datatype = \"uinteger\"\no.rmempty = true\no.default = \"20971520\"\n\no = s:option(Value, \"maxidletimeout\", translate(\"QUIC maxIdleTimeout(Unit:second)\"))\no:depends({type = \"hysteria2\", flag_quicparam = true})\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\", flag_quicparam = true})\no.rmempty = true\no.datatype = \"uinteger\"\no.default = \"30\"\n\no = s:option(Value, \"keepaliveperiod\", translate(\"The keep-alive period.(Unit:second)\"))\no.description = translate(\"Default value 0 indicatesno heartbeat.\")\no:depends({type = \"hysteria2\", flag_quicparam = true})\no:depends({type = \"v2ray\", v2ray_protocol = \"wireguard\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\", flag_quicparam = true})\no.rmempty = true\no.datatype = \"uinteger\"\no.default = \"10\"\n\n\n--[[ Shadow-TLS Options ]]\no = s:option(ListValue, \"shadowtls_protocol\", translate(\"shadowTLS protocol Version\"))\no:depends(\"type\", \"shadowtls\")\no:value(\"v3\", translate(\"Enable V3 protocol.\"))\no:value(\"v2\", translate(\"Enable V2 protocol.\"))\no.default = \"v3\"\no.rmempty = true\n\no = s:option(Flag, \"strict\", translate(\"TLS 1.3 Strict mode\"))\no:depends(\"type\", \"shadowtls\")\no.default = \"1\"\no.rmempty = false\n\no = s:option(Flag, \"fastopen\", translate(\"TCP Fast Open\"), translate(\"Enabling TCP Fast Open Requires Server Support.\"))\no:depends(\"type\", \"shadowtls\")\no.default = \"0\"\no.rmempty = false\n\no = s:option(Flag, \"disable_nodelay\", translate(\"Disable TCP No_delay\"))\no:depends(\"type\", \"shadowtls\")\no.default = \"0\"\no.rmempty = true\n\no = s:option(Value, \"shadowtls_sni\", translate(\"shadow-TLS SNI\"))\no:depends(\"type\", \"shadowtls\")\no.datatype = \"host\"\no.rmempty = true\no.default = \"\"\n\n--[[ add a ListValue for Choose chain type,sslocal or vmess ]]\no = s:option(ListValue, \"chain_type\", translate(\"Shadow-TLS ChainPoxy type\"))\no:depends(\"type\", \"shadowtls\")\nif is_finded(\"sslocal\") then\n\to:value(\"sslocal\", translate(\"ShadowSocks-rust Version\"))\nend\nif is_finded(\"xray\") or is_finded(\"v2ray\") then\n\to:value(\"vmess\", translate(\"Vmess Protocol\"))\nend\no.default = \"sslocal\"\no.rmempty = false\n\no = s:option(Value, \"sslocal_password\",translate(\"Shadowsocks password\"))\no:depends({type = \"shadowtls\", chain_type = \"sslocal\"})\no.rmempty = true\n\no = s:option(ListValue, \"sslocal_method\", translate(\"Encrypt Method\"))\no:depends({type = \"shadowtls\", chain_type = \"sslocal\"})\nfor _, v in ipairs(encrypt_methods_ss) do\n\to:value(v)\nend\n\no = s:option(Value, \"vmess_uuid\", translate(\"Vmess UUID\"))\no:depends({type = \"shadowtls\", chain_type = \"vmess\"})\no.rmempty = false\no.default = uuid\n\no = s:option(ListValue, \"vmess_method\", translate(\"Encrypt Method\"))\no:depends({type = \"shadowtls\", chain_type = \"vmess\"})\nfor _, v in ipairs(securitys) do\n\to:value(v, v:lower())\nend\no.rmempty = true\no.default=\"auto\"\n\n-- [[ TUIC ]]\n-- TuicNameId\no = s:option(Value, \"tuic_uuid\", translate(\"TUIC User UUID\"))\no.password = true\no.rmempty = true\no.default = uuid\no:depends(\"type\", \"tuic\")\n\n--Tuic IP\no = s:option(Value, \"tuic_ip\", translate(\"TUIC Server IP Address\"))\no.rmempty = true\no.datatype = \"ip4addr\"\no.default = \"\"\no:depends(\"type\", \"tuic\")\n\n-- Tuic Password\no = s:option(Value, \"tuic_passwd\", translate(\"TUIC User Password\"))\no.password = true\no.rmempty = true\no.default = \"\"\no:depends(\"type\", \"tuic\")\n\no = s:option(ListValue, \"udp_relay_mode\", translate(\"UDP relay mode\"))\no:depends(\"type\", \"tuic\")\no:value(\"native\", translate(\"native UDP characteristics\"))\no:value(\"quic\", translate(\"lossless UDP relay using QUIC streams\"))\no.default = \"native\"\no.rmempty = true\n\no = s:option(ListValue, \"congestion_control\", translate(\"Congestion control algorithm\"))\no:depends(\"type\", \"tuic\")\no:value(\"bbr\", translate(\"BBR\"))\no:value(\"cubic\", translate(\"CUBIC\"))\no:value(\"new_reno\", translate(\"New Reno\"))\no.default = \"cubic\"\no.rmempty = true\n\no = s:option(Value, \"heartbeat\", translate(\"Heartbeat interval(second)\"))\no:depends(\"type\", \"tuic\")\no.datatype = \"uinteger\"\no.default = \"3\"\no.rmempty = true\n\no = s:option(Value, \"timeout\", translate(\"Timeout for establishing a connection to server(second)\"))\no:depends(\"type\", \"tuic\")\no.datatype = \"uinteger\"\no.default = \"8\"\no.rmempty = true\n\no = s:option(Value, \"gc_interval\", translate(\"Garbage collection interval(second)\"))\no:depends(\"type\", \"tuic\")\no.datatype = \"uinteger\"\no.default = \"3\"\no.rmempty = true\n\no = s:option(Value, \"gc_lifetime\", translate(\"Garbage collection lifetime(second)\"))\no:depends(\"type\", \"tuic\")\no.datatype = \"uinteger\"\no.default = \"15\"\no.rmempty = true\n\no = s:option(Value, \"send_window\", translate(\"TUIC send window\"))\no:depends(\"type\", \"tuic\")\no.datatype = \"uinteger\"\no.default = 20971520\no.rmempty = true\n\no = s:option(Value, \"receive_window\", translate(\"TUIC receive window\"))\no:depends(\"type\", \"tuic\")\no.datatype = \"uinteger\"\no.default = 10485760\no.rmempty = true\n\no = s:option(Flag, \"disable_sni\", translate(\"Disable SNI\"))\no:depends(\"type\", \"tuic\")\no.default = \"0\"\no.rmempty = true\n\no = s:option(Flag, \"zero_rtt_handshake\", translate(\"Enable 0-RTT QUIC handshake\"))\no:depends(\"type\", \"tuic\")\no.default = \"0\"\no.rmempty = true\n\n-- Tuic settings for the local inbound socks5 server\no = s:option(Flag, \"tuic_dual_stack\", translate(\"Dual-stack Listening Socket\"))\no.description = translate(\"If this option is not set, the socket behavior is platform dependent.\")\no:depends(\"type\", \"tuic\")\no.default = \"0\"\no.rmempty = true\n\no = s:option(Value, \"tuic_max_package_size\", translate(\"Maximum packet size the socks5 server can receive from external\"))\no:depends(\"type\", \"tuic\")\no.datatype = \"uinteger\"\no.default = 1500\no.rmempty = true\n\n-- AlterId\no = s:option(Value, \"alter_id\", translate(\"AlterId\"))\no.datatype = \"port\"\no.default = 0\no.rmempty = true\no:depends({type = \"v2ray\", v2ray_protocol = \"vmess\"})\n\n-- VmessId\no = s:option(Value, \"vmess_id\", translate(\"Vmess/VLESS ID (UUID)\"))\no.password = true\no.rmempty = true\no.default = uuid\no:depends({type = \"v2ray\", v2ray_protocol = \"vmess\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"vless\"})\n\n-- VLESS Encryption\no = s:option(Value, \"vless_encryption\", translate(\"VLESS Encryption\"))\no.rmempty = true\no.default = \"none\"\no.placeholder = \"none\"\no:depends({type = \"v2ray\", v2ray_protocol = \"vless\"})\no.validate = function(self, value)\n\tvalue = value and value:match(\"^%s*(.-)%s*$\") or value\n\treturn value ~= \"\" and value or \"none\"\nend\n\n-- 加密方式\no = s:option(ListValue, \"security\", translate(\"Encrypt Method\"))\nfor _, v in ipairs(securitys) do\n\to:value(v, v:upper())\nend\no.rmempty = true\no:depends({type = \"v2ray\", v2ray_protocol = \"vmess\"})\n\n-- SOCKS Version\no = s:option(ListValue, \"socks_ver\", translate(\"Socks Version\"))\no:value(\"4\", \"Socks4\")\no:value(\"4a\", \"Socks4A\")\no:value(\"5\", \"Socks5\")\no.rmempty = true\no.default = \"5\"\no:depends({type = \"v2ray\", v2ray_protocol = \"socks\"})\n\n-- 传输协议\no = s:option(ListValue, \"transport\", translate(\"Transport\"))\no:value(\"raw\", \"RAW (TCP)\")\no:value(\"kcp\", \"mKCP\")\no:value(\"ws\", \"WebSocket\")\no:value(\"httpupgrade\", \"HTTPUpgrade\")\no:value(\"xhttp\", \"XHTTP (SplitHTTP)\")\no:value(\"h2\", \"HTTP/2\")\no:value(\"quic\", \"QUIC\")\no:value(\"grpc\", \"gRPC\")\no.rmempty = true\no:depends({type = \"v2ray\", v2ray_protocol = \"vless\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"vmess\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"trojan\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"shadowsocks\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"socks\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"http\"})\n\n-- [[ RAW部分 ]]--\n-- TCP伪装\no = s:option(ListValue, \"tcp_guise\", translate(\"Camouflage Type\"))\no:depends(\"transport\", \"raw\")\no:value(\"none\", translate(\"None\"))\no:value(\"http\", translate(\"HTTP\"))\no.rmempty = true\n\n-- HTTP域名\no = s:option(Value, \"http_host\", translate(\"HTTP Host\"))\no:depends(\"tcp_guise\", \"http\")\no.rmempty = true\n\n-- HTTP路径\no = s:option(Value, \"http_path\", translate(\"HTTP Path\"))\no:depends(\"tcp_guise\", \"http\")\no.rmempty = true\n\n-- [[ WS部分 ]]--\n-- WS域名\no = s:option(Value, \"ws_host\", translate(\"WebSocket Host\"))\no:depends({transport = \"ws\", tls = false})\no.datatype = \"hostname\"\no.rmempty = true\n\n-- WS路径\no = s:option(Value, \"ws_path\", translate(\"WebSocket Path\"))\no:depends(\"transport\", \"ws\")\no.rmempty = true\n\n-- WS间隔\no = s:option(Value, \"ws_heartbeatPeriod\", translate(\"HeartbeatPeriod(second)\"))\no.datatype = \"integer\"\no:depends(\"transport\", \"ws\")\n\nif is_finded(\"v2ray\") then\n\t-- WS前置数据\n\to = s:option(Value, \"ws_ed\", translate(\"Max Early Data\"))\n\to:depends(\"ws_ed_enable\", true)\n\to.datatype = \"uinteger\"\n\to:value(\"2048\")\n\to.rmempty = true\n\n\t-- WS前置数据标头\n\to = s:option(Value, \"ws_ed_header\", translate(\"Early Data Header Name\"))\n\to:depends(\"ws_ed_enable\", true)\n\to:value(\"Sec-WebSocket-Protocol\")\n\to.rmempty = true\nend\n\n-- [[ httpupgrade部分 ]]--\n\n-- httpupgrade域名\no = s:option(Value, \"httpupgrade_host\", translate(\"Httpupgrade Host\"))\no:depends({transport = \"httpupgrade\", tls = false})\no.rmempty = true\n\n-- httpupgrade路径\no = s:option(Value, \"httpupgrade_path\", translate(\"Httpupgrade Path\"))\no:depends(\"transport\", \"httpupgrade\")\no.rmempty = true\n\n-- [[ XHTTP部分 ]]--\n\n-- XHTTP 模式\no = s:option(ListValue, \"xhttp_mode\", translate(\"XHTTP Mode\"))\no:depends(\"transport\", \"xhttp\")\no.default = \"auto\"\no:value(\"auto\")\no:value(\"packet-up\")\no:value(\"stream-up\")\no:value(\"stream-one\")\n\n-- XHTTP 主机\no = s:option(Value, \"xhttp_host\", translate(\"XHTTP Host\"))\no.datatype = \"hostname\"\no:depends(\"transport\", \"xhttp\")\no.rmempty = true\n\n-- XHTTP 路径\no = s:option(Value, \"xhttp_path\", translate(\"XHTTP Path\"))\no.placeholder = \"/\"\no:depends(\"transport\", \"xhttp\")\no.rmempty = true\n\n-- XHTTP 附加项\no = s:option(Flag, \"enable_xhttp_extra\", translate(\"XHTTP Extra\"))\no.description = translate(\"Enable this option to configure XHTTP Extra (JSON format).\")\no.rmempty = true\no.default = \"0\"\no:depends(\"transport\", \"xhttp\")\n\no = s:option(TextValue, \"xhttp_extra\", \" \")\no.description = translate(\n\t\t\"<font><b>\" .. translate(\"Configure XHTTP Extra Settings (JSON format), see:\") .. \"</b></font>\" ..\n\t\t\" <a href='https://xtls.github.io/config/transports/splithttp.html#extra' target='_blank'>\" ..\n\t\t\"<font style='color:green'><b>\" .. translate(\"Click to the page\") .. \"</b></font></a>\")\no:depends(\"enable_xhttp_extra\", true)\n--o.rmempty = true\no.rows = 10\no.wrap = \"off\"\no.cfgvalue = function(self, section, value)\n\tlocal raw = m:get(section, \"xhttp_extra\")\n\tif raw then\n\t\treturn base64Decode(raw)\n\tend\nend\no.write = function(self, section, value)\n\tm:set(section, \"xhttp_extra\", base64Encode(value) or \"\")\n\tlocal success, data = pcall(luci.jsonc.parse, value)\n\tif success and data then\n\t\tlocal address = (data.extra and data.extra.downloadSettings and data.extra.downloadSettings.address)\n\t\t\t\t\tor (data.downloadSettings and data.downloadSettings.address)\n\t\tif address and address ~= \"\" then\n\t\t\taddress = address:gsub(\"^%[\", \"\"):gsub(\"%]$\", \"\")\n\t\t\tm:set(section, \"download_address\", address)\n\t\telse\n\t\t\tm:del(section, \"download_address\")\n\t\tend\n\telse\n        m:del(section, \"download_address\")\n\tend\nend\no.validate = function(self, value)\n\tvalue = trim(value):gsub(\"\\r\\n\", \"\\n\"):gsub(\"^[ \\t]*\\n\", \"\"):gsub(\"\\n[ \\t]*$\", \"\"):gsub(\"\\n[ \\t]*\\n\", \"\\n\")\n\tlocal ok, data = pcall(luci.jsonc.parse, value)\n\tif ok and data then\n\t\treturn value\n\telse\n\t\treturn nil, \"XHTTP Extra \" .. translate(\"Must be JSON text!\")\n\tend\nend\no.remove = function(self, section, value)\n\tm:del(section, \"xhttp_extra\")\n\tm:del(section, \"download_address\")\nend\n\n-- [[ H2部分 ]]--\n\n-- H2域名\no = s:option(Value, \"h2_host\", translate(\"HTTP/2 Host\"))\no:depends(\"transport\", \"h2\")\no.rmempty = true\n\n-- H2路径\no = s:option(Value, \"h2_path\", translate(\"HTTP/2 Path\"))\no:depends(\"transport\", \"h2\")\no.rmempty = true\n\n-- gRPC\no = s:option(Value, \"serviceName\", translate(\"gRPC Service Name\"))\no:depends(\"transport\", \"grpc\")\no.rmempty = true\n\nif is_finded(\"xray\") then\n\t-- gPRC模式\n\to = s:option(ListValue, \"grpc_mode\", translate(\"gRPC Mode\"))\n\to:depends(\"transport\", \"grpc\")\n\to:value(\"gun\", translate(\"Gun\"))\n\to:value(\"multi\", translate(\"Multi\"))\n\to.rmempty = true\nend\n\nif is_finded(\"xray\") then\n\t-- gRPC初始窗口\n\to = s:option(Value, \"initial_windows_size\", translate(\"Initial Windows Size\"))\n\to.datatype = \"uinteger\"\n\to:depends(\"transport\", \"grpc\")\n\to.default = 0\n\to.rmempty = true\n\n\t-- H2/gRPC健康检查\n\to = s:option(Flag, \"health_check\", translate(\"H2/gRPC Health Check\"))\n\to:depends(\"transport\", \"h2\")\n\to:depends(\"transport\", \"grpc\")\n\to.rmempty = true\n\n\to = s:option(Value, \"read_idle_timeout\", translate(\"H2 Read Idle Timeout\"))\n\to.datatype = \"uinteger\"\n\to:depends({health_check = true, transport = \"h2\"})\n\to.default = 60\n\to.rmempty = true\n\n\to = s:option(Value, \"idle_timeout\", translate(\"gRPC Idle Timeout\"))\n\to.datatype = \"uinteger\"\n\to:depends({health_check = true, transport = \"grpc\"})\n\to.default = 60\n\to.rmempty = true\n\n\to = s:option(Value, \"health_check_timeout\", translate(\"Health Check Timeout\"))\n\to.datatype = \"uinteger\"\n\to:depends(\"health_check\", 1)\n\to.default = 20\n\to.rmempty = true\n\n\to = s:option(Flag, \"permit_without_stream\", translate(\"Permit Without Stream\"))\n\to:depends({health_check = true, transport = \"grpc\"})\n\to.rmempty = true\nend\n\n-- [[ QUIC部分 ]]--\no = s:option(ListValue, \"quic_security\", translate(\"QUIC Security\"))\no:depends(\"transport\", \"quic\")\no:value(\"none\", translate(\"None\"))\no:value(\"aes-128-gcm\", translate(\"aes-128-gcm\"))\no:value(\"chacha20-poly1305\", translate(\"chacha20-poly1305\"))\no.rmempty = true\n\no = s:option(Value, \"quic_key\", translate(\"QUIC Key\"))\no:depends(\"transport\", \"quic\")\no.rmempty = true\n\no = s:option(ListValue, \"quic_guise\", translate(\"Header\"))\no:depends(\"transport\", \"quic\")\no.rmempty = true\no:value(\"none\", translate(\"None\"))\no:value(\"srtp\", translate(\"VideoCall (SRTP)\"))\no:value(\"utp\", translate(\"BitTorrent (uTP)\"))\no:value(\"wechat-video\", translate(\"WechatVideo\"))\no:value(\"dtls\", translate(\"DTLS 1.2\"))\no:value(\"wireguard\", translate(\"WireGuard\"))\n\n-- [[ mKCP部分 ]]--\no = s:option(ListValue, \"kcp_guise\", translate(\"Camouflage Type\"))\no:depends(\"transport\", \"kcp\")\no:value(\"none\", translate(\"None\"))\no:value(\"srtp\", translate(\"VideoCall (SRTP)\"))\no:value(\"utp\", translate(\"BitTorrent (uTP)\"))\no:value(\"wechat-video\", translate(\"WechatVideo\"))\no:value(\"dtls\", translate(\"DTLS 1.2\"))\no:value(\"wireguard\", translate(\"WireGuard\"))\no:value(\"dns\", translate(\"DNS\"))\no.rmempty = true\n\no = s:option(Value, \"kcp_domain\", translate(\"Camouflage Domain\"))\no.description = translate(\"Use it together with the DNS disguised type. You can fill in any domain.\")\no:depends(\"kcp_guise\", \"dns\")\n\no = s:option(Value, \"mtu\", translate(\"MTU\"))\no.datatype = \"uinteger\"\no:depends(\"transport\", \"kcp\")\no:depends({type = \"v2ray\", v2ray_protocol = \"wireguard\"})\no.default = 1350\no.rmempty = true\n\no = s:option(Value, \"uplink_capacity\", translate(\"Uplink Capacity(Default:Mbps)\"))\no.datatype = \"uinteger\"\no:depends(\"type\", \"hysteria2\")\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\"})\no.placeholder = 5\no.rmempty = true\n\no = s:option(Value, \"downlink_capacity\", translate(\"Downlink Capacity(Default:Mbps)\"))\no.datatype = \"uinteger\"\no:depends(\"type\", \"hysteria2\")\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\"})\no.placeholder = 20\no.rmempty = true\n\no = s:option(Value, \"seed\", translate(\"Obfuscate password (optional)\"))\no:depends(\"transport\", \"kcp\")\no.rmempty = true\n\n-- [[ WireGuard 部分 ]]--\no = s:option(Flag, \"kernelmode\", translate(\"Enabled Kernel virtual NIC TUN(optional)\"))\no.description = translate(\n\t\t\"<ul>\" ..\n\t\t\"<li>\" .. translate(\"Linux kernel TUN virtual NIC requires system support and root privileges.\") .. \"</li>\" ..\n\t\t\"<li>\" .. translate(\"When enabled, it occupies IPv6 routing table 1023.\") .. \"</li>\" ..\n\t\t\"</ul>\"\n)\no:depends({type = \"v2ray\", v2ray_protocol = \"wireguard\"})\no.default = \"0\"\no.rmempty = true\n\no = s:option(DynamicList, \"local_addresses\", translate(\"Local addresses\"))\no.datatype = \"cidr\"\no:depends({type = \"v2ray\", v2ray_protocol = \"wireguard\"})\no.rmempty = true\n\no = s:option(DynamicList, \"reserved\", translate(\"Reserved bytes(optional)\"))\no.description = translate(\"Decimal numbers separated by \\\",\\\" or Base64-encoded strings.\")\no:depends({type = \"v2ray\", v2ray_protocol = \"wireguard\"})\no.rmempty = true\n\no = s:option(Value, \"private_key\", translate(\"Private key\"))\no:depends({type = \"v2ray\", v2ray_protocol = \"wireguard\"})\no.password = true\no.rmempty = true\n\no = s:option(Value, \"peer_pubkey\", translate(\"Peer public key\"))\no:depends({type = \"v2ray\", v2ray_protocol = \"wireguard\"})\no.rmempty = true\n\no = s:option(Value, \"preshared_key\", translate(\"Pre-shared key\"))\no:depends({type = \"v2ray\", v2ray_protocol = \"wireguard\"})\no.password = true\no.rmempty = true\n\no = s:option(DynamicList, \"allowedips\", translate(\"allowedIPs(optional)\"))\no.description = translate(\"Wireguard allows only traffic from specific source IP.\")\no.datatype = \"cidr\"\no:depends({type = \"v2ray\", v2ray_protocol = \"wireguard\"})\no.default = \"0.0.0.0/0\"\no.rmempty = true\n\n-- [[ User-Agent部分 ]]--\no = s:option(Value, \"user_agent\", translate(\"User-Agent\"))\no.default = \"\"\no:value(\"\", translate(\"Default\"))\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36\", translate(\"chrome\"))\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:90.0) Gecko/20100101 Firefox/90.0\", translate(\"firefox\"))\no:value(\"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.1.1 Safari/605.1.15\", translate(\"safari\"))\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36 Edg/91.0.864.70\", translate(\"edge\"))\no:value(\"Go-http-client/1.1\", translate(\"golang\"))\no:value(\"curl/7.68.0\", translate(\"curl\"))\no:depends(\"tcp_guise\", \"http\")\no:depends(\"transport\", \"ws\")\no:depends(\"transport\", \"httpupgrade\")\no:depends(\"transport\", \"xhttp\")\no:depends(\"transport\", \"grpc\")\n\n--[[ FinalMask部分 ]]--\no = s:option(Flag, \"enable_finalmask\", translate(\"FinalMask\"))\no.rmempty = true\no.default = \"0\"\no:depends({type = \"v2ray\", v2ray_protocol = \"vless\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"vmess\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"trojan\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"shadowsocks\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"wireguard\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\"})\n\no = s:option(TextValue, \"finalmask\", \" \")\no.description = translate(\"An FinalMaskObject in JSON format, used for sharing.\") .. \"<br>\" ..\n\t\ttranslate(\"Custom finalmask overrides mkcp, hysteria2, fragment, noise, and related settings.\")\no:depends(\"enable_finalmask\", true)\no.rows = 10\no.wrap = \"off\"\no.custom_cfgvalue = function(self, section, value)\n\tlocal raw = m:get(section, \"finalmask\")\n\tif raw then\n\t\treturn base64Decode(raw)\n\tend\nend\no.custom_write = function(self, section, value)\n\tm:set(section, \"finalmask\", base64Encode(value) or \"\")\nend\no.validate = function(self, value)\n\tvalue = trim(value):gsub(\"\\r\\n\", \"\\n\"):gsub(\"^[ \\t]*\\n\", \"\"):gsub(\"\\n[ \\t]*$\", \"\"):gsub(\"\\n[ \\t]*\\n\", \"\\n\")\n\tif luci.jsonc.parse(value) then\n\t\treturn value\n\telse\n\t\treturn nil, \"FinalMask \" .. translate(\"Must be JSON text!\")\n\tend\nend\n\n-- [[ TLS ]]--\no = s:option(Flag, \"tls\", translate(\"TLS\"))\no.rmempty = true\no.default = \"0\"\no:depends({type = \"v2ray\", v2ray_protocol = \"vless\", reality = false})\no:depends({type = \"v2ray\", v2ray_protocol = \"vmess\", reality = false})\no:depends({type = \"v2ray\", v2ray_protocol = \"trojan\", reality = false})\no:depends({type = \"v2ray\", v2ray_protocol = \"shadowsocks\", reality = false})\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\", reality = false})\no:depends({type = \"v2ray\", v2ray_protocol = \"socks\", socks_ver = \"5\", reality = false})\no:depends({type = \"v2ray\", v2ray_protocol = \"http\", reality = false})\no:depends(\"type\", \"trojan\")\no:depends(\"type\", \"hysteria2\")\n\n-- [[ TLS部分 ]] --\no = s:option(Flag, \"tls_sessionTicket\", translate(\"Session Ticket\"))\no:depends({type = \"trojan\", tls = true})\no.default = \"0\"\n\nif is_finded(\"xray\") then\n\t-- [[ REALITY ]]\n\to = s:option(Flag, \"reality\", translate(\"REALITY\"))\n\to.rmempty = true\n\to.default = \"0\"\n\to:depends({type = \"v2ray\", v2ray_protocol = \"vless\", tls = false})\n\n\to = s:option(Value, \"reality_publickey\", translate(\"Public key\"))\n\to.rmempty = true\n\to:depends({type = \"v2ray\", v2ray_protocol = \"vless\", reality = true})\n\n\to = s:option(Value, \"reality_shortid\", translate(\"Short ID\"))\n\to.rmempty = true\n\to:depends({type = \"v2ray\", v2ray_protocol = \"vless\", reality = true})\n\n\to = s:option(Value, \"reality_spiderx\", translate(\"spiderX\"))\n\to.rmempty = true\n\to:depends({type = \"v2ray\", v2ray_protocol = \"vless\", reality = true})\n\n\t-- [[ XTLS ]]--\n\to = s:option(ListValue, \"tls_flow\", translate(\"Flow\"))\n\tfor _, v in ipairs(tls_flows) do\n\t\tif v == \"none\" then\n\t\t   o.default = \"none\"\n\t\t   o:value(\"none\", translate(\"none\"))\n\t\telse\n\t\t    o:value(v, translate(v))\n\t\tend\n\tend\n\to.rmempty = true\n\to:depends({type = \"v2ray\", v2ray_protocol = \"vless\"})\n\n\t-- [[ uTLS ]]--\n\to = s:option(ListValue, \"fingerprint\", translate(\"Finger Print\"))\n\to.default = \"\"\n\to:value(\"chrome\", translate(\"chrome\"))\n\to:value(\"firefox\", translate(\"firefox\"))\n\to:value(\"safari\", translate(\"safari\"))\n\to:value(\"ios\", translate(\"ios\"))\n\to:value(\"android\", translate(\"android\"))\n\to:value(\"edge\", translate(\"edge\"))\n\to:value(\"360\", translate(\"360\"))\n\to:value(\"qq\", translate(\"qq\"))\n\to:value(\"random\", translate(\"random\"))\n\to:value(\"randomized\", translate(\"randomized\"))\n\to:value(\"\", translate(\"disable\"))\n\to:depends({type = \"v2ray\", tls = true})\n\to:depends({type = \"v2ray\", reality = true})\n\n\to = s:option(Flag, \"enable_ech\", translate(\"Enable ECH(optional)\"))\n\to.rmempty = true\n\to.default = \"0\"\n\to:depends({type = \"v2ray\", tls = true})\n\n\to = s:option(TextValue, \"ech_config\", translate(\"ECH Config\"))\n\to.description = translate(\n    \t\"<font><b>\" .. translate(\"If it is not empty, it indicates that the Client has enabled Encrypted Client, see:\") .. \"</b></font>\" ..\n    \t\" <a href='https://xtls.github.io/config/transport.html#tlsobject' target='_blank'>\" ..\n    \t\"<font style='color:green'><b>\" .. translate(\"Click to the page\") .. \"</b></font></a>\")\n\to:depends(\"enable_ech\", true)\n\to.default = \"\"\n\to.rows = 5\n\to.wrap = \"soft\"\n\to.validate = function(self, value)\n    \t-- 清理空行和多余换行\n    \treturn (value:gsub(\"[\\r\\n]\", \"\")):gsub(\"^%s*(.-)%s*$\", \"%1\")\n\tend\n\n\to = s:option(ListValue, \"ech_ForceQuery\", translate(\"ECH Query Policy\"))\n\to.description = translate(\"Controls the policy used when performing DNS queries for ECH configuration.\")\n\to.default = \"full\"\n\to:value(\"none\")\n\to:value(\"half\")\n\to:value(\"full\")\n\to:depends(\"enable_ech\", true)\n\n\to = s:option(Flag, \"enable_mldsa65verify\", translate(\"Enable ML-DSA-65(optional)\"))\n\to.rmempty = true\n\to.default = \"0\"\n\to:depends({type = \"v2ray\", reality = true})\n\n\to = s:option(TextValue, \"reality_mldsa65verify\", translate(\"ML-DSA-65 Public key\"))\n\to.description = translate(\n    \t\"<font><b>\" .. translate(\"The client has not configured mldsa65Verify, but it will not perform the \\\"additional verification\\\" step and can still connect normally, see:\") .. \"</b></font>\" ..\n    \t\" <a href='https://github.com/XTLS/Xray-core/pull/4915' target='_blank'>\" ..\n    \t\"<font style='color:green'><b>\" .. translate(\"Click to the page\") .. \"</b></font></a>\")\n\to:depends(\"enable_mldsa65verify\", true)\n\to.default = \"\"\n\to.rows = 5\n\to.wrap = \"soft\"\n\to.validate = function(self, value)\n    \t-- 清理空行和多余换行\n    \treturn (value:gsub(\"[\\r\\n]\", \"\")):gsub(\"^%s*(.-)%s*$\", \"%1\")\n\tend\nend\n\no = s:option(Value, \"tls_host\", translate(\"TLS Host\"))\no.datatype = \"hostname\"\no:depends(\"tls\", true)\no:depends(\"xtls\", true)\no:depends(\"reality\", true)\no.rmempty = true\n\n-- TLS ALPN\no = s:option(ListValue, \"tls_alpn\", translate(\"TLS ALPN\"))\no.default = \"\"\no:value(\"\", translate(\"Default\"))\no:value(\"h3\")\no:value(\"h2\")\no:value(\"h3,h2\")\no:value(\"http/1.1\")\no:value(\"h2,http/1.1\")\no:value(\"h3,h2,http/1.1\")\no:depends(\"tls\", true)\n\n-- TUIC ALPN\no = s:option(ListValue, \"tuic_alpn\", translate(\"TUIC ALPN\"))\no.default = \"\"\no:value(\"\", translate(\"Default\"))\no:value(\"h3\")\no:value(\"h2\")\no:value(\"h3,h2\")\no:value(\"http/1.1\")\no:value(\"h2,http/1.1\")\no:value(\"h3,h2,http/1.1\")\no:value(\"spdy/3.1\")\no:value(\"h3,spdy/3.1\")\no:depends(\"type\", \"tuic\")\n\n-- IP STACK PREFERENCE\no = s:option(ListValue, \"ipstack_prefer\", translate(\"IP Stack Preference\"))\no.default = \"\"\no:value(\"\", translate(\"Default\"))\no:value(\"v4first\")\no:value(\"v6first\")\no:depends(\"tuic_dual_stack\", true)\n\n-- [[ allowInsecure ]]--\no = s:option(Flag, \"insecure\", translate(\"allowInsecure\"))\no.rmempty = false\no:depends(\"type\", \"hysteria2\")\no:depends(\"type\", \"trojan\")\no:depends(\"type\", \"tuic\")\no.description = translate(\"If true, allowss insecure connection at TLS client, e.g., TLS server uses unverifiable certificates.\")\n-- Xray 支持时间判断\n-- if os.time() < os.time({year=2026,month=6,day=1}) then\nif os.date(\"%Y.%m.%d\") < \"2026.06.01\" then\n\t-- Xray 支持到 26.06.01\n\to:depends(\"tls\", true)\n\to:depends({ type = \"v2ray\", v2ray_protocol = \"vless\", reality = true })\nend\n\nif xray_version_val >= 260131 then\n\t-- Xray 版本大于等于 26.1.31\n\t-- [[ Xray TLS pinSHA256 ]] --\n\to = s:option(Value, \"tls_CertSha\", translate(\"TLS Chain Fingerprint (SHA256)\"), translate(\"Once set, connects only when the server’s chain fingerprint matches.\"))\n\to.rmempty = true\n\to:depends({type = \"v2ray\", tls = true})\n\n\t-- [[ Xray TLS verify leaf certificate name ]] --\n\to = s:option(Value, \"tls_CertByName\", translate(\"TLS Certificate Name (CertName)\"), translate(\"TLS is used to verify the leaf certificate name.\"))\n\to.rmempty = true\n\to:depends({type = \"v2ray\", tls = true})\nend\n\n-- [[ Hysteria2 TLS pinSHA256 ]] --\no = s:option(Value, \"pinsha256\", translate(\"Certificate fingerprint\"))\no:depends(\"type\", \"hysteria2\")\no.rmempty = true\n\n-- [[ Mux.Cool ]] --\no = s:option(Flag, \"mux\", translate(\"Mux\"), translate(\"Enable Mux.Cool\"))\no.rmempty = false\no.default = false\no:depends({type = \"v2ray\", v2ray_protocol = \"vless\", transport = \"raw\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"vless\", transport = \"ws\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"vless\", transport = \"kcp\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"vless\", transport = \"httpupgrade\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"vless\", transport = \"h2\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"vless\", transport = \"quic\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"vless\", transport = \"grpc\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"vmess\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"trojan\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"shadowsocks\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"socks\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"http\"})\n\n-- [[ TCP 最大并发连接数 ]]--\no = s:option(Value, \"concurrency\", translate(\"concurrency\"))\no.description = translate(\n\t\t\"<ul>\"\n\t\t.. \"<li>\" .. translate(\"Default: disable. When entering a negative number, such as -1, The Mux module will not be used to carry TCP traffic.\") .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"Min value is 1, Max value is 128. When omitted or set to 0, it equals 8.\") .. \"</li>\"\n\t\t.. \"</ul>\")\no.rmempty = true\no.default = \"-1\"\no:value(\"-1\", translate(\"disable\"))\no:value(\"8\", translate(\"8\"))\no:depends(\"mux\", true)\n\n-- [[ UDP 最大并发连接数 ]]--\no = s:option(Value, \"xudpConcurrency\", translate(\"xudpConcurrency\"))\no.description = translate(\n\t\t\"<ul>\"\n\t\t.. \"<li>\" .. translate(\"Default:16. When entering a negative number, such as -1, The Mux module will not be used to carry UDP traffic, Use original UDP transmission method of proxy protocol.\") .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"Min value is 1, Max value is 1024. When omitted or set to 0, Will same path as TCP traffic.\") .. \"</li>\"\n\t\t.. \"</ul>\")\no.rmempty = true\no.default = \"16\"\no:value(\"-1\", translate(\"disable\"))\no:value(\"16\", translate(\"16\"))\no:depends(\"mux\", true)\n\n-- [[ 对被代理的 UDP/443 流量处理方式 ]]--\no = s:option(ListValue, \"xudpProxyUDP443\", translate(\"xudpProxyUDP443\"))\no.description = translate(\n\t\t\"<ul>\"\n\t\t.. \"<li>\" .. translate(\"Default reject rejects traffic.\") .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"allow: Allows use Mux connection.\") .. \"</li>\"\n\t\t.. \"<li>\" .. translate(\"skip: Not use Mux module to carry UDP 443 traffic, Use original UDP transmission method of proxy protocol.\") .. \"</li>\"\n\t\t.. \"</ul>\")\no.rmempty = true\no.default = \"reject\"\no:value(\"reject\", translate(\"reject\"))\no:value(\"allow\", translate(\"allow\"))\no:value(\"skip\", translate(\"skip\"))\no:depends(\"mux\", true)\n\n-- [[ XHTTP TCP Fast Open ]]--\n--o = s:option(Flag, \"tcpfastopen\", translate(\"TCP Fast Open\"), translate(\"Enabling TCP Fast Open Requires Server Support.\"))\n--o.rmempty = true\n--o.default = \"0\"\n--o:depends({type = \"v2ray\", v2ray_protocol = \"vless\", transport = \"xhttp\"})\n\n-- [[ MPTCP ]]--\no = s:option(Flag, \"mptcp\", translate(\"MPTCP\"), translate(\"Enable Multipath TCP, need to be enabled in both server and client configuration.\"))\no.rmempty = true\no.default = \"0\"\no:depends({type = \"v2ray\", v2ray_protocol = \"vless\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"vmess\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"trojan\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"shadowsocks\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"socks\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"http\"})\n\n-- [[ TESTPRE ]]--\no = s:option(Value, \"preconns\", translate(\"Pre-connections\"), translate(\"Number of early established connections to reduce latency.\"))\no.datatype = \"uinteger\"\no.placeholder = 0\no:depends({type = \"v2ray\", v2ray_protocol = \"vless\"})\n\n-- [[ custom_tcpcongestion 连接服务器节点的 TCP 拥塞控制算法 ]]--\no = s:option(ListValue, \"custom_tcpcongestion\", translate(\"custom_tcpcongestion\"))\no.rmempty = true\no.default = \"\"\no:value(\"\", translate(\"comment_tcpcongestion_disable\"))\no:value(\"bbr\", translate(\"BBR\"))\no:value(\"brutal\", translate(\"BRUTAL\"))\no:value(\"cubic\", translate(\"CUBIC\"))\no:value(\"reno\", translate(\"Reno\"))\no:depends({type = \"v2ray\", v2ray_protocol = \"vless\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"vmess\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"trojan\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"shadowsocks\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"socks\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"http\"})\n\n-- [[ HYSTERIA2_tcpcongestion 连接服务器节点的 TCP 拥塞控制算法 ]]--\no = s:option(ListValue, \"hy2_tcpcongestion\", translate(\"custom_tcpcongestion\"))\no.rmempty = true\no.default = \"\"\no:value(\"\", translate(\"comment_tcpcongestion_disable\"))\no:value(\"bbr\", translate(\"BBR\"))\no:value(\"brutal\", translate(\"BRUTAL\"))\no:value(\"force-brutal\", translate(\"FORCE BRUTAL\"))\no:value(\"reno\", translate(\"Reno\"))\no:value(\"cubic\", translate(\"CUBIC\"))\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\"})\n\n-- [[ Cert ]]--\no = s:option(Flag, \"certificate\", translate(\"Self-signed Certificate\"))\no.rmempty = true\no.default = \"0\"\no:depends(\"type\", \"tuic\")\no:depends({type = \"hysteria2\", insecure = false})\no:depends({type = \"trojan\", tls = true, insecure = false})\no:depends({type = \"v2ray\", v2ray_protocol = \"vmess\", tls = true, insecure = false})\no:depends({type = \"v2ray\", v2ray_protocol = \"vless\", tls = true, insecure = false})\no.description = translate(\"If you have a self-signed certificate,please check the box\")\n\no = s:option(DummyValue, \"upload\", translate(\"Upload\"))\no.template = \"shadowsocksr/certupload\"\no:depends(\"certificate\", 1)\n\ncert_dir = \"/etc/ssl/private/\"\nlocal path\n\nluci.http.setfilehandler(function(meta, chunk, eof)\n\tif not fd then\n\t\tif (not meta) or (not meta.name) or (not meta.file) then\n\t\t\treturn\n\t\tend\n\t\tfd = nixio.open(cert_dir .. meta.file, \"w\")\n\t\tif not fd then\n\t\t\tpath = translate(\"Create upload file error.\")\n\t\t\treturn\n\t\tend\n\tend\n\tif chunk and fd then\n\t\tfd:write(chunk)\n\tend\n\tif eof and fd then\n\t\tfd:close()\n\t\tfd = nil\n\t\tpath = '/etc/ssl/private/' .. meta.file .. ''\n\tend\nend)\nif luci.http.formvalue(\"upload\") then\n\tlocal f = luci.http.formvalue(\"ulfile\")\n\tif #f <= 0 then\n\t\tpath = translate(\"No specify upload file.\")\n\tend\nend\n\no = s:option(Value, \"certpath\", translate(\"Current Certificate Path\"))\no:depends(\"certificate\", 1)\no:value(\"/etc/ssl/private/ca.crt\")\no.description = translate(\"Please confirm the current certificate path\")\no.default = \"/etc/ssl/private/ca.crt\"\n\no = s:option(Flag, \"fast_open\", translate(\"TCP Fast Open\"), translate(\"Enabling TCP Fast Open Requires Server Support.\"))\no.rmempty = true\no.default = \"0\"\no:depends(\"type\", \"ssr\")\no:depends(\"type\", \"ss\")\no:depends(\"type\", \"trojan\")\no:depends(\"type\", \"hysteria2\")\no:depends({type = \"v2ray\", v2ray_protocol = \"vless\", transport = \"xhttp\"})\no:depends({type = \"v2ray\", v2ray_protocol = \"hysteria2\"})\n\no = s:option(ListValue, \"domain_resolver\", translate(\"Domain DNS Resolve\"))\no.description = translate(\n\t\"<ul>\" ..\n\t\"<li>\" .. translate(\"If the node address is a domain name, this DNS will be used for resolution.\") .. \"</li>\" .. \n\t\"<li>\" .. string.format('<font style=\\'color:red;\\'>%s</font>', translate(\"Note: For node-specific DNS only. Keep Auto to avoid extra overhead.\")) .. \"</li>\" ..\n\t\"</ul>\"\n)\no:value(\"\", translate(\"Auto\"))\no:value(\"tcp\", translate(\"TCP\"))\no:value(\"udp\", translate(\"UDP\"))\no:value(\"https\", translate(\"DoH\"))\no:depends(\"type\", \"v2ray\")\n\no = s:option(Value, \"domain_resolver_dns\", translate(\"DNS\"))\no.datatype = \"or(ipaddr,ipaddrport)\"\no:value(\"114.114.114.114\")\no:value(\"223.5.5.5:53\")\no.default = \"114.114.114.114\"\no:depends(\"domain_resolver\", \"tcp\")\no:depends(\"domain_resolver\", \"udp\") \n\no = s:option(Value, \"domain_resolver_dns_https\", translate(\"DNS\"))\no:value(\"https://120.53.53.53/dns-query\", translate(\"DNSPod\"))\no:value(\"https://223.5.5.5/dns-query\", translate(\"AliDNS\"))\no.default = \"https://120.53.53.53/dns-query\"\no:depends(\"domain_resolver\", \"https\")\n\no = s:option(ListValue, \"domain_strategy\", translate(\"Domain Strategy\"))\no.description = translate(\n\t\"<ul>\" ..\n\t\"<li>\" .. translate(\"If is domain name, The requested domain name will be resolved to IP before connect.\") .. \"</li>\" .. \n\t\"<li>\" .. string.format('<font style=\\'color:red;\\'>%s</font>', translate(\"Note: For node-specific DNS only. Keep Auto to avoid extra overhead.\")) .. \"</li>\" ..\n\t\"</ul>\"\n)\no.default = \"\"\no:value(\"\", translate(\"Auto\"))\no:value(\"UseIPv4v6\", translate(\"Prefer IPv4\"))\no:value(\"UseIPv6v4\", translate(\"Prefer IPv6\"))\no:value(\"UseIPv4\", translate(\"IPv4 Only\"))\no:value(\"UseIPv6\", translate(\"IPv6 Only\"))\no:depends(\"type\", \"v2ray\")\n\nlocal v2ray_protocols = s.fields[\"v2ray_protocol\"]\nif #v2ray_protocols > 0 then\n\tfor i, v in ipairs(v2ray_protocols) do\n\t\tif not v:find(\"^_\") then\n\t\t\ts.fields[\"server\"]:depends({ [\"v2ray_protocol\"] = v })\n\t\t\ts.fields[\"server_port\"]:depends({ [\"v2ray_protocol\"] = v })\n\t\t\ts.fields[\"domain_resolver\"]:depends({ [\"v2ray_protocol\"] = v })\n\t\t\ts.fields[\"domain_strategy\"]:depends({ [\"v2ray_protocol\"] = v })\n\n\t\t\tif v ~= \"hysteria2\" then\n\t\t\t\ts.fields[\"fast_open\"]:depends({ [\"v2ray_protocol\"] = v })\n\t\t\t\ts.fields[\"mptcp\"]:depends({ [\"v2ray_protocol\"] = v })\n\t\t\tend\n\t\tend\n\tend\nend\n\no = s:option(Flag, \"switch_enable\", translate(\"Enable Auto Switch\"))\no.rmempty = false\no.default = \"1\"\n\no = s:option(Value, \"local_port\", translate(\"Local Port\"))\no.datatype = \"port\"\no.default = 1234\no.rmempty = false\n\nif is_finded(\"kcptun-client\") then\n\to = s:option(Flag, \"kcp_enable\", translate(\"KcpTun Enable\"))\n\to.rmempty = true\n\to.default = \"0\"\n\to:depends(\"type\", \"ssr\")\n\to:depends(\"type\", \"ss\")\n\n\to = s:option(Value, \"kcp_port\", translate(\"KcpTun Port\"))\n\to.datatype = \"portrange\"\n\to.default = 4000\n\to:depends(\"type\", \"ssr\")\n\to:depends(\"type\", \"ss\")\n\n\to = s:option(Value, \"kcp_password\", translate(\"KcpTun Password\"))\n\to.password = true\n\to:depends(\"type\", \"ssr\")\n\to:depends(\"type\", \"ss\")\n\n\to = s:option(Value, \"kcp_param\", translate(\"KcpTun Param\"))\n\to.default = \"--nocomp\"\n\to:depends(\"type\", \"ssr\")\n\to:depends(\"type\", \"ss\")\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua",
    "content": "-- Copyright (C) 2017 yushi studio <ywb94@qq.com> github.com/ywb94\n-- Copyright (C) 2018 lean <coolsnowwolf@gmail.com> github.com/coolsnowwolf\n-- Licensed to the public under the GNU General Public License v3.\n\nlocal m, s, sec, o\nlocal uci = require \"luci.model.uci\".cursor()\n\n-- 获取 LAN IP 地址\nfunction lanip()\n\tlocal lan_ip\n\n\t-- 尝试从 UCI 直接读取\n\tlan_ip = luci.sys.exec(\"uci -q get network.lan.ipaddr 2>/dev/null | awk -F'/' '{print $1}' | tr -d '\\\\n'\")\n\n\t-- 尝试从 LAN 接口信息中读取（优先 ifname，再 fallback 到 device）\n\tif not lan_ip or lan_ip == \"\" then\n\t\tlan_ip = luci.sys.exec([[\nip -4 addr show $(uci -q -p /tmp/state get network.lan.ifname || uci -q -p /tmp/state get network.lan.device) 2>/dev/null \\\n  | grep -w 'inet' | awk '{print $2}' | cut -d'/' -f1 | grep -v '^127\\.' | head -n1 | tr -d '\\n']])\n\tend\n\n\t-- 取任意一个 global IPv4 地址\n\tif not lan_ip or lan_ip == \"\" then\n\t\tlan_ip = luci.sys.exec([[\nip -4 addr show scope global 2>/dev/null \\\n  | grep -w 'inet' | awk '{print $2}' | cut -d'/' -f1 | grep -v '^127\\.' | head -n1 | tr -d '\\n']])\n\tend\n\n\treturn lan_ip\nend\n\nlocal lan_ip = lanip()\nlocal validation = require \"luci.cbi.datatypes\"\nlocal function is_finded(e)\n\treturn luci.sys.exec(string.format('type -t -p \"%s\" 2>/dev/null', e)) ~= \"\"\nend\n\nm = Map(\"shadowsocksr\", translate(\"ShadowSocksR Plus+ Settings\"), translate(\"<h3>Support SS/SSR/V2RAY/XRAY/TROJAN/TUIC/HYSTERIA2/NAIVEPROXY/SOCKS5/TUN etc.</h3>\"))\nm:section(SimpleSection).template = \"shadowsocksr/status\"\n\nlocal server_table = {}\nuci:foreach(\"shadowsocksr\", \"servers\", function(s)\n\tif s.alias then\n\t\tserver_table[s[\".name\"]] = \"[%s]:%s\" % {string.upper(s.v2ray_protocol or s.type), s.alias}\n\telseif s.server and s.server_port then\n\t\tserver_table[s[\".name\"]] = \"[%s]:%s:%s\" % {string.upper(s.v2ray_protocol or s.type), s.server, s.server_port}\n\tend\nend)\n\nlocal key_table = {}\nfor key, _ in pairs(server_table) do\n\ttable.insert(key_table, key)\nend\n\ntable.sort(key_table)\n\n-- [[ Global Setting ]]--\ns = m:section(TypedSection, \"global\")\ns.anonymous = true\n\no = s:option(ListValue, \"global_server\", translate(\"Main Server\"))\no:value(\"nil\", translate(\"Disable\"))\nfor _, key in pairs(key_table) do\n\to:value(key, server_table[key])\nend\no.default = \"nil\"\no.rmempty = false\n\no = s:option(ListValue, \"udp_relay_server\", translate(\"Game Mode UDP Server\"))\no:value(\"\", translate(\"Disable\"))\no:value(\"same\", translate(\"Same as Global Server\"))\nfor _, key in pairs(key_table) do\n\to:value(key, server_table[key])\nend\n\nif uci:get_first(\"shadowsocksr\", 'global', 'netflix_enable', '0') == '1' then\n\to = s:option(ListValue, \"netflix_server\", translate(\"Netflix Node\"))\n\to:value(\"nil\", translate(\"Disable\"))\n\to:value(\"same\", translate(\"Same as Global Server\"))\n\tfor _, key in pairs(key_table) do\n\t\to:value(key, server_table[key])\n\tend\n\to.default = \"nil\"\n\to.rmempty = false\n\n\to = s:option(Flag, \"netflix_proxy\", translate(\"External Proxy Mode\"))\n\to.rmempty = false\n\to.description = translate(\"Forward Netflix Proxy through Main Proxy\")\n\to.default = \"0\"\nend\n\n-- [[ Use nftables/iptables ]]--\no = s:option(ListValue, \"prefer_nft\", translate(\"Prefer firewall tools\"))\no.default = \"1\"\no:value(\"0\", \"Iptables\")\no:value(\"1\", \"Nftables\")\n\no = s:option(ListValue, \"threads\", translate(\"Multi Threads Option\"))\no:value(\"0\", translate(\"Auto Threads\"))\no:value(\"1\", translate(\"1 Thread\"))\no:value(\"2\", translate(\"2 Threads\"))\no:value(\"4\", translate(\"4 Threads\"))\no:value(\"8\", translate(\"8 Threads\"))\no:value(\"16\", translate(\"16 Threads\"))\no:value(\"32\", translate(\"32 Threads\"))\no:value(\"64\", translate(\"64 Threads\"))\no:value(\"128\", translate(\"128 Threads\"))\no.default = \"0\"\no.rmempty = false\n\no = s:option(ListValue, \"run_mode\", translate(\"Running Mode\"))\no:value(\"gfw\", translate(\"GFW List Mode\"))\no:value(\"router\", translate(\"IP Route Mode\"))\no:value(\"all\", translate(\"Global Mode\"))\no:value(\"oversea\", translate(\"Oversea Mode\"))\no.default = gfw\n\no = s:option(ListValue, \"dports\", translate(\"Proxy Ports\"))\no:value(\"1\", translate(\"All Ports\"))\no:value(\"2\", translate(\"Only Common Ports\"))\no:value(\"3\", translate(\"Custom Ports\"))\ncp = s:option(Value, \"custom_ports\", translate(\"Enter Custom Ports\"))\ncp:depends(\"dports\", \"3\")  -- 仅当用户选择“Custom Ports”时显示\ncp.placeholder = \"e.g., 80,443,8080\"\no.default = 1\n\no = s:option(ListValue, \"pdnsd_enable\", translate(\"Resolve Dns Mode\"))\nif is_finded(\"dns2tcp\") then\n\to:value(\"1\", translate(\"Use DNS2TCP query\"))\nend\nif is_finded(\"dns2socks\") then\n\to:value(\"2\", translate(\"Use DNS2SOCKS query and cache\"))\nend\nif is_finded(\"dns2socks-rust\") then\n\to:value(\"3\", translate(\"Use DNS2SOCKS-RUST query and cache\"))\nend\nif is_finded(\"mosdns\") then\n\to:value(\"4\", translate(\"Use MOSDNS query (Not Support Oversea Mode)\"))\nend\nif is_finded(\"dnsproxy\") then\n\to:value(\"5\", translate(\"Use DNSPROXY query and cache\"))\nend\nif is_finded(\"chinadns-ng\") then\n\to:value(\"6\", translate(\"Use ChinaDNS-NG query and cache\"))\nend\no:value(\"0\", translate(\"Use Local DNS Service listen port 5335\"))\no.default = 1\n\no = s:option(Value, \"tunnel_forward\", translate(\"Anti-pollution DNS Server\"))\no:value(\"8.8.4.4:53\", translate(\"Google Public DNS (8.8.4.4)\"))\no:value(\"8.8.8.8:53\", translate(\"Google Public DNS (8.8.8.8)\"))\no:value(\"208.67.222.222:53\", translate(\"OpenDNS (208.67.222.222)\"))\no:value(\"208.67.220.220:53\", translate(\"OpenDNS (208.67.220.220)\"))\no:value(\"209.244.0.3:53\", translate(\"Level 3 Public DNS (209.244.0.3)\"))\no:value(\"209.244.0.4:53\", translate(\"Level 3 Public DNS (209.244.0.4)\"))\no:value(\"4.2.2.1:53\", translate(\"Level 3 Public DNS (4.2.2.1)\"))\no:value(\"4.2.2.2:53\", translate(\"Level 3 Public DNS (4.2.2.2)\"))\no:value(\"4.2.2.3:53\", translate(\"Level 3 Public DNS (4.2.2.3)\"))\no:value(\"4.2.2.4:53\", translate(\"Level 3 Public DNS (4.2.2.4)\"))\no:value(\"1.1.1.1:53\", translate(\"Cloudflare DNS (1.1.1.1)\"))\no:value(\"114.114.114.114:53\", translate(\"Oversea Mode DNS-1 (114.114.114.114)\"))\no:value(\"114.114.115.115:53\", translate(\"Oversea Mode DNS-2 (114.114.115.115)\"))\no:depends(\"pdnsd_enable\", \"1\")\no:depends(\"pdnsd_enable\", \"2\")\no:depends(\"pdnsd_enable\", \"3\")\no.description = translate(\"Custom DNS Server format as IP:PORT (default: 8.8.4.4:53)\")\no.datatype = \"ip4addrport\"\no.default = \"8.8.4.4:53\"\n\no = s:option(Value, \"tunnel_forward_mosdns\", translate(\"Anti-pollution DNS Server\"))\no:value(\"tcp://8.8.4.4:53,tcp://8.8.8.8:53\", translate(\"Google Public DNS\"))\no:value(\"tcp://208.67.222.222:53,tcp://208.67.220.220:53\", translate(\"OpenDNS\"))\no:value(\"tcp://209.244.0.3:53,tcp://209.244.0.4:53\", translate(\"Level 3 Public DNS-1 (209.244.0.3-4)\"))\no:value(\"tcp://4.2.2.1:53,tcp://4.2.2.2:53\", translate(\"Level 3 Public DNS-2 (4.2.2.1-2)\"))\no:value(\"tcp://4.2.2.3:53,tcp://4.2.2.4:53\", translate(\"Level 3 Public DNS-3 (4.2.2.3-4)\"))\no:value(\"tcp://1.1.1.1:53,tcp://1.0.0.1:53\", translate(\"Cloudflare DNS\"))\no:depends(\"pdnsd_enable\", \"4\")\no.description = translate(\"Custom DNS Server format as tcp://IP:PORT or tls://DOMAIN:PORT (tcp://8.8.8.8 or tls://dns.google:853)\")\n\no = s:option(Flag, \"mosdns_ipv6\", translate(\"Disable IPv6 in MOSDNS query mode\"))\no:depends(\"pdnsd_enable\", \"4\")\no.rmempty = false\no.default = \"1\"\n\nif is_finded(\"dnsproxy\") then\n\to = s:option(ListValue, \"parse_method\", translate(\"Select DNS parse Mode\"))\n\to.description = translate(\n    \t\"<ul>\" ..\n    \t\"<li>\" .. translate(\"When use DNS list file, please ensure list file exists and is formatted correctly.\") .. \"</li>\" ..\n    \t\"<li>\" .. translate(\"Tips: Dnsproxy DNS Parse List Path:\") ..\n    \t\" <a href='http://\" .. lan_ip .. \"/cgi-bin/luci/admin/services/shadowsocksr/control' target='_blank'>\" ..\n    \ttranslate(\"Click here to view or manage the DNS list file\") .. \"</a>\" .. \"</li>\" ..\n    \t\"</ul>\"\n\t)\n\to:value(\"single_dns\", translate(\"Set Single DNS\"))\n\to:value(\"parse_file\", translate(\"Use DNS List File\"))\n\to:depends(\"pdnsd_enable\", \"5\")\n\to.rmempty = true\n\to.default = \"single_dns\"\n\n\to = s:option(Value, \"dnsproxy_tunnel_forward\", translate(\"Anti-pollution DNS Server\"))\n\to:value(\"sdns://AgUAAAAAAAAABzguOC40LjQgsKKKE4EwvtIbNjGjagI2607EdKSVHowYZtyvD9iPrkkHOC44LjQuNAovZG5zLXF1ZXJ5\", translate(\"Google DNSCrypt SDNS\"))\n\to:value(\"sdns://AgcAAAAAAAAAACC2vD25TAYM7EnyCH8Xw1-0g5OccnTsGH9vQUUH0njRtAxkbnMudHduaWMudHcKL2Rucy1xdWVyeQ\", translate(\"TWNIC-101 DNSCrypt SDNS\"))\n\to:value(\"sdns://AgcAAAAAAAAADzE4NS4yMjIuMjIyLjIyMiAOp5Svj-oV-Fz-65-8H2VKHLKJ0egmfEgrdPeAQlUFFA8xODUuMjIyLjIyMi4yMjIKL2Rucy1xdWVyeQ\", translate(\"dns.sb DNSCrypt SDNS\"))\n\to:value(\"sdns://AgMAAAAAAAAADTE0OS4xMTIuMTEyLjkgsBkgdEu7dsmrBT4B4Ht-BQ5HPSD3n3vqQ1-v5DydJC8SZG5zOS5xdWFkOS5uZXQ6NDQzCi9kbnMtcXVlcnk\", translate(\"Quad9 DNSCrypt SDNS\"))\n\to:value(\"sdns://AQMAAAAAAAAAETk0LjE0MC4xNC4xNDo1NDQzINErR_JS3PLCu_iZEIbq95zkSV2LFsigxDIuUso_OQhzIjIuZG5zY3J5cHQuZGVmYXVsdC5uczEuYWRndWFyZC5jb20\", translate(\"AdGuard DNSCrypt SDNS\"))\n\to:value(\"sdns://AgcAAAAAAAAABzEuMC4wLjGgENk8mGSlIfMGXMOlIlCcKvq7AVgcrZxtjon911-ep0cg63Ul-I8NlFj4GplQGb_TTLiczclX57DvMV8Q-JdjgRgSZG5zLmNsb3VkZmxhcmUuY29tCi9kbnMtcXVlcnk\", translate(\"Cloudflare DNSCrypt SDNS\"))\n\to:value(\"sdns://AgcAAAAAAAAADjEwNC4xNi4yNDkuMjQ5ABJjbG91ZGZsYXJlLWRucy5jb20KL2Rucy1xdWVyeQ\", translate(\"cloudflare-dns.com DNSCrypt SDNS\"))\n\to:depends(\"parse_method\", \"single_dns\")\n\to.description = translate(\"Custom DNS Server (support: IP:Port or tls://IP:Port or https://IP/dns-query and other format).\")\n\n\to = s:option(ListValue, \"upstreams_logic_mode\", translate(\"Defines the upstreams logic mode\"))\n\to.description = translate(\n    \t\"<ul>\" ..\n    \t\"<li>\" .. translate(\"Defines the upstreams logic mode, possible values: load_balance, parallel, fastest_addr (default: load_balance).\") .. \"</li>\" ..\n    \t\"<li>\" .. translate(\"When two or more DNS servers are deployed, enable this function.\") .. \"</li>\" ..\n    \t\"</ul>\"\n\t)\n\to:value(\"load_balance\", translate(\"load_balance\"))\n\to:value(\"parallel\", translate(\"parallel\"))\n\to:value(\"fastest_addr\", translate(\"fastest_addr\"))\n\to:depends(\"parse_method\", \"parse_file\")\n\to.rmempty = true\n\to.default = \"load_balance\"\n\n\to = s:option(Flag, \"dnsproxy_ipv6\", translate(\"Disable IPv6 query mode\"))\n\to.description = translate(\"When disabled, all AAAA requests are not resolved.\")\n\to:depends(\"parse_method\", \"single_dns\")\n\to:depends(\"parse_method\", \"parse_file\")\n\to.rmempty = false\n\to.default = \"1\"\nend\n\nif is_finded(\"chinadns-ng\") then\n\to = s:option(Value, \"chinadns_ng_tunnel_forward\", translate(\"Anti-pollution DNS Server\"))\n\to:value(\"8.8.4.4:53\", translate(\"Google Public DNS (8.8.4.4)\"))\n\to:value(\"8.8.8.8:53\", translate(\"Google Public DNS (8.8.8.8)\"))\n\to:value(\"208.67.222.222:53\", translate(\"OpenDNS (208.67.222.222)\"))\n\to:value(\"208.67.220.220:53\", translate(\"OpenDNS (208.67.220.220)\"))\n\to:value(\"209.244.0.3:53\", translate(\"Level 3 Public DNS (209.244.0.3)\"))\n\to:value(\"209.244.0.4:53\", translate(\"Level 3 Public DNS (209.244.0.4)\"))\n\to:value(\"4.2.2.1:53\", translate(\"Level 3 Public DNS (4.2.2.1)\"))\n\to:value(\"4.2.2.2:53\", translate(\"Level 3 Public DNS (4.2.2.2)\"))\n\to:value(\"4.2.2.3:53\", translate(\"Level 3 Public DNS (4.2.2.3)\"))\n\to:value(\"4.2.2.4:53\", translate(\"Level 3 Public DNS (4.2.2.4)\"))\n\to:value(\"1.1.1.1:53\", translate(\"Cloudflare DNS (1.1.1.1)\"))\n\to:depends(\"pdnsd_enable\", \"6\")\n\to.description = translate(\n    \t\"<ul>\" ..\n    \t\"<li>\" .. translate(\"Custom DNS Server format as IP:PORT (default: 8.8.4.4:53)\") .. \"</li>\" .. \n    \t\"<li>\" .. translate(\"Muitiple DNS server can saperate with ','\") .. \"</li>\" ..\n    \t\"</ul>\"\n\t)\n\n\to = s:option(ListValue, \"chinadns_ng_proto\", translate(\"ChinaDNS-NG query protocol\"))\n\to:value(\"none\", translate(\"UDP/TCP upstream\"))\n\to:value(\"tcp\", translate(\"TCP upstream\"))\n\to:value(\"udp\", translate(\"UDP upstream\"))\n\to:value(\"tls\", translate(\"DoT upstream (Need use wolfssl version)\"))\n\to:depends(\"pdnsd_enable\", \"6\")\n\n\to = s:option(Value, \"chinadns_forward\", translate(\"Domestic DNS Server\"))\n\to:value(\"\", translate(\"Disable ChinaDNS-NG\"))\n\to:value(\"wan\", translate(\"Use DNS from WAN\"))\n\to:value(\"wan_114\", translate(\"Use DNS from WAN and 114DNS\"))\n\to:value(\"114.114.114.114:53\", translate(\"Nanjing Xinfeng 114DNS (114.114.114.114)\"))\n\to:value(\"119.29.29.29:53\", translate(\"DNSPod Public DNS (119.29.29.29)\"))\n\to:value(\"223.5.5.5:53\", translate(\"AliYun Public DNS (223.5.5.5)\"))\n\to:value(\"180.76.76.76:53\", translate(\"Baidu Public DNS (180.76.76.76)\"))\n\to:value(\"101.226.4.6:53\", translate(\"360 Security DNS (China Telecom) (101.226.4.6)\"))\n\to:value(\"123.125.81.6:53\", translate(\"360 Security DNS (China Unicom) (123.125.81.6)\"))\n\to:value(\"1.2.4.8:53\", translate(\"CNNIC SDNS (1.2.4.8)\"))\n\to:depends({pdnsd_enable = \"1\", run_mode = \"router\"})\n\to:depends({pdnsd_enable = \"2\", run_mode = \"router\"})\n\to:depends({pdnsd_enable = \"3\", run_mode = \"router\"})\n\to:depends({pdnsd_enable = \"5\", run_mode = \"router\"})\n\to:depends({pdnsd_enable = \"6\", run_mode = \"router\"})\n\to.description = translate(\"Custom DNS Server format as IP:PORT (default: disabled)\")\n\to.validate = function(self, value, section)\n\t\tif (section and value) then\n\t\t\tif value == \"wan\" or value == \"wan_114\" then\n\t\t\t\treturn value\n\t\t\tend\n\n\t\t\tif validation.ip4addrport(value) then\n\t\t\t\treturn value\n\t\t\tend\n\n\t\t\treturn nil, translate(\"Expecting: %s\"):format(translate(\"valid address:port\"))\n\t\tend\n\n\t\treturn value\n\tend\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua",
    "content": "require \"luci.ip\"\nrequire \"nixio.fs\"\nrequire \"luci.sys\"\nlocal m, s, o\n\nlocal function is_finded(e)\n\treturn luci.sys.exec(string.format('type -t -p \"%s\" 2>/dev/null', e)) ~= \"\"\nend\n\nm = Map(\"shadowsocksr\")\n\ns = m:section(TypedSection, \"access_control\")\ns.anonymous = true\n\n-- Interface control\ns:tab(\"Interface\", translate(\"Interface control\"))\no = s:taboption(\"Interface\", DynamicList, \"Interface\", translate(\"Interface\"))\no.template = \"cbi/network_netlist\"\no.widget = \"checkbox\"\no.nocreate = true\no.unspecified = true\no.description = translate(\"Listen only on the given interface or, if unspecified, on all\")\n\n-- Part of WAN\ns:tab(\"wan_ac\", translate(\"WAN IP AC\"))\n\no = s:taboption(\"wan_ac\", DynamicList, \"wan_bp_ips\", translate(\"WAN White List IP\"))\no.datatype = \"ip4addr\"\n\no = s:taboption(\"wan_ac\", DynamicList, \"wan_fw_ips\", translate(\"WAN Force Proxy IP\"))\no.datatype = \"ip4addr\"\n\n-- Part of LAN\ns:tab(\"lan_ac\", translate(\"LAN IP AC\"))\n\no = s:taboption(\"lan_ac\", ListValue, \"lan_ac_mode\", translate(\"LAN Access Control\"))\no:value(\"0\", translate(\"Disable\"))\no:value(\"w\", translate(\"Allow listed only\"))\no:value(\"b\", translate(\"Allow all except listed\"))\no.rmempty = false\n\no = s:taboption(\"lan_ac\", DynamicList, \"lan_ac_ips\", translate(\"LAN Host List\"))\no.datatype = \"ipaddr\"\nluci.ip.neighbors({family = 4}, function(entry)\n\tif entry.reachable then\n\t\to:value(entry.dest:string())\n\tend\nend)\no:depends(\"lan_ac_mode\", \"w\")\no:depends(\"lan_ac_mode\", \"b\")\n\no = s:taboption(\"lan_ac\", DynamicList, \"lan_bp_ips\", translate(\"LAN Bypassed Host List\"))\no.datatype = \"ipaddr\"\nluci.ip.neighbors({family = 4}, function(entry)\n\tif entry.reachable then\n\t\to:value(entry.dest:string())\n\tend\nend)\n\no = s:taboption(\"lan_ac\", DynamicList, \"lan_fp_ips\", translate(\"LAN Force Proxy Host List\"))\no.datatype = \"ipaddr\"\nluci.ip.neighbors({family = 4}, function(entry)\n\tif entry.reachable then\n\t\to:value(entry.dest:string())\n\tend\nend)\n\no = s:taboption(\"lan_ac\", DynamicList, \"lan_gm_ips\", translate(\"Game Mode Host List\"))\no.datatype = \"ipaddr\"\nluci.ip.neighbors({family = 4}, function(entry)\n\tif entry.reachable then\n\t\to:value(entry.dest:string())\n\tend\nend)\n\n-- Part of Self\n-- s:tab(\"self_ac\", translate(\"Router Self AC\"))\n-- o = s:taboption(\"self_ac\",ListValue, \"router_proxy\", translate(\"Router Self Proxy\"))\n-- o:value(\"1\", translatef(\"Normal Proxy\"))\n-- o:value(\"0\", translatef(\"Bypassed Proxy\"))\n-- o:value(\"2\", translatef(\"Forwarded Proxy\"))\n-- o.rmempty = false\n\ns:tab(\"esc\", translate(\"Bypass Domain List\"))\nlocal escconf = \"/etc/ssrplus/white.list\"\no = s:taboption(\"esc\", TextValue, \"escconf\")\no.rows = 13\no.wrap = \"off\"\no.rmempty = true\no.cfgvalue = function(self, section)\n\treturn nixio.fs.readfile(escconf) or \"\"\nend\no.write = function(self, section, value)\n\tnixio.fs.writefile(escconf, value:gsub(\"\\r\\n\", \"\\n\"))\nend\no.remove = function(self, section, value)\n\tnixio.fs.writefile(escconf, \"\")\nend\n\ns:tab(\"block\", translate(\"Black Domain List\"))\nlocal blockconf = \"/etc/ssrplus/black.list\"\no = s:taboption(\"block\", TextValue, \"blockconf\")\no.rows = 13\no.wrap = \"off\"\no.rmempty = true\no.cfgvalue = function(self, section)\n\treturn nixio.fs.readfile(blockconf) or \" \"\nend\no.write = function(self, section, value)\n\tnixio.fs.writefile(blockconf, value:gsub(\"\\r\\n\", \"\\n\"))\nend\no.remove = function(self, section, value)\n\tnixio.fs.writefile(blockconf, \"\")\nend\n\ns:tab(\"denydomain\", translate(\"Deny Domain List\"))\nlocal denydomainconf = \"/etc/ssrplus/deny.list\"\no = s:taboption(\"denydomain\", TextValue, \"denydomainconf\")\no.rows = 13\no.wrap = \"off\"\no.rmempty = true\no.cfgvalue = function(self, section)\n\treturn nixio.fs.readfile(denydomainconf) or \" \"\nend\no.write = function(self, section, value)\n\tnixio.fs.writefile(denydomainconf, value:gsub(\"\\r\\n\", \"\\n\"))\nend\no.remove = function(self, section, value)\n\tnixio.fs.writefile(denydomainconf, \"\")\nend\n\ns:tab(\"netflix\", translate(\"Netflix Domain List\"))\nlocal netflixconf = \"/etc/ssrplus/netflix.list\"\no = s:taboption(\"netflix\", TextValue, \"netflixconf\")\no.rows = 13\no.wrap = \"off\"\no.rmempty = true\no.cfgvalue = function(self, section)\n\treturn nixio.fs.readfile(netflixconf) or \" \"\nend\no.write = function(self, section, value)\n\tnixio.fs.writefile(netflixconf, value:gsub(\"\\r\\n\", \"\\n\"))\nend\no.remove = function(self, section, value)\n\tnixio.fs.writefile(netflixconf, \"\")\nend\n\nif is_finded(\"dnsproxy\") then\n\ts:tab(\"dnsproxy\", translate(\"Dnsproxy Parse List\"))\n\tlocal dnsproxyconf = \"/etc/ssrplus/dnsproxy_dns.list\"\n\to = s:taboption(\"dnsproxy\", TextValue, \"dnsproxyconf\", \"\", \"<font style=color:red>\" .. translate(\"Specifically for edit dnsproxy DNS parse files.\") .. \"</font>\")\n\to.rows = 13\n\to.wrap = \"off\"\n\to.rmempty = true\n\to.cfgvalue = function(self, section)\n\t\treturn nixio.fs.readfile(dnsproxyconf) or \" \"\n\tend\n\to.write = function(self, section, value)\n\t\tnixio.fs.writefile(dnsproxyconf, value:gsub(\"\\r\\n\", \"\\n\"))\n\tend\n\to.remove = function(self, section, value)\n\t\tnixio.fs.writefile(dnsproxyconf, \"\")\n\tend\nend\n\nif luci.sys.call('[ -f \"/www/luci-static/resources/uci.js\" ]') == 0 then\n\tm.apply_on_parse = true\n\tfunction m.on_apply(self)\n\t\tluci.sys.call(\"/etc/init.d/shadowsocksr reload > /dev/null 2>&1 &\")\n\tend\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/log.lua",
    "content": "require \"luci.util\"\nrequire \"nixio.fs\"\nrequire \"luci.sys\"\nrequire \"luci.http\"\n\nf = SimpleForm(\"logview\")\nf.reset = false\nf.submit = false\nf:append(Template(\"shadowsocksr/log\"))\n\n-- 自定义 log 函数\nfunction log(...)\n    local result = os.date(\"%Y-%m-%d %H:%M:%S: \") .. table.concat({...}, \" \")\n    local f, err = io.open(\"/var/log/ssrplus.log\", \"a\")\n    if f and err == nil then\n        f:write(result .. \"\\n\")\n        f:close()\n    end\nend\n\n-- 创建备份与恢复表单\nfb = SimpleForm('backup-restore')\nfb.reset = false\nfb.submit = false\ns = fb:section(SimpleSection, translate(\"Backup and Restore\"), translate(\"Backup or Restore Client and Server Configurations.\") ..\n                            \"<br><font style='color:red'><b>\" ..\n                            translate(\"Note: Restoring configurations across different versions may cause compatibility issues.\") ..\n                            \"</b></font>\")\ns.anonymous = true\ns:append(Template(\"shadowsocksr/backup_restore\"))\n\n-- 定义备份目标文件和目录\nlocal backup_targets = {\n    files = {\n        \"/etc/config/shadowsocksr\"\n    },\n    dirs = {\n        \"/etc/ssrplus\"\n    }\n}\n\nlocal file_path = '/tmp/shadowsocksr_upload.tar.gz'\nlocal temp_dir = '/tmp/shadowsocksr_bak'\nlocal fd\n\n-- 处理文件上传\nluci.http.setfilehandler(function(meta, chunk, eof)\n    if not fd and meta and meta.name == \"ulfile\" and chunk then\n        -- 初始化上传处理\n        luci.sys.call(\"rm -rf \" .. temp_dir)\n        nixio.fs.remove(file_path)\n        fd = nixio.open(file_path, \"w\")\n        luci.sys.call(\"echo '' > /var/log/ssrplus.log\")\n    end\n\n    if fd and chunk then\n        fd:write(chunk)\n    end\n\n    if eof and fd then\n        fd:close()\n        fd = nil\n        if nixio.fs.access(file_path) then\n            log(\" * shadowsocksr 配置文件上传成功…\")  -- 使用自定义的 log 函数\n            luci.sys.call(\"mkdir -p \" .. temp_dir)\n\n            if luci.sys.call(\"tar -xzf \" .. file_path .. \" -C \" .. temp_dir) == 0 then\n                -- 处理文件还原\n                for _, target in ipairs(backup_targets.files) do\n                    local temp_file = temp_dir .. target\n                    if nixio.fs.access(temp_file) then\n                        luci.sys.call(string.format(\"cp -f '%s' '%s'\", temp_file, target))\n                        log(\" * 文件 \" .. target .. \" 还原成功…\")  -- 使用自定义的 log 函数\n                    end\n                end\n\n                -- 处理目录还原\n                for _, target in ipairs(backup_targets.dirs) do\n                    local temp_dir_path = temp_dir .. target\n                    if nixio.fs.access(temp_dir_path) then\n                        luci.sys.call(string.format(\"cp -rf '%s'/* '%s/'\", temp_dir_path, target))\n                        log(\" * 目录 \" .. target .. \" 还原成功…\")  -- 使用自定义的 log 函数\n                    end\n                end\n\n                log(\" * shadowsocksr 配置还原成功…\")  -- 使用自定义的 log 函数\n                log(\" * 重启 shadowsocksr 服务中…\\n\")  -- 使用自定义的 log 函数\n                luci.sys.call('/etc/init.d/shadowsocksr restart > /dev/null 2>&1 &')\n            else\n                log(\" * shadowsocksr 配置文件解压失败，请重试！\")  -- 使用自定义的 log 函数\n            end\n        else\n            log(\" * shadowsocksr 配置文件上传失败，请重试！\")  -- 使用自定义的 log 函数\n        end\n\n        -- 清理临时文件\n        luci.sys.call(\"rm -rf \" .. temp_dir)\n        nixio.fs.remove(file_path)\n    end\nend)\n\nreturn f, fb\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua",
    "content": "-- Copyright (C) 2017 yushi studio <ywb94@qq.com>\n-- Licensed to the public under the GNU General Public License v3.\nrequire \"luci.http\"\nrequire \"luci.dispatcher\"\nrequire \"nixio.fs\"\n\nlocal m, s, o\nlocal sid = arg[1]\n\nlocal encrypt_methods = {\n\t\"rc4-md5\",\n\t\"rc4-md5-6\",\n\t\"rc4\",\n\t\"table\",\n\t\"aes-128-cfb\",\n\t\"aes-192-cfb\",\n\t\"aes-256-cfb\",\n\t\"aes-128-ctr\",\n\t\"aes-192-ctr\",\n\t\"aes-256-ctr\",\n\t\"bf-cfb\",\n\t\"camellia-128-cfb\",\n\t\"camellia-192-cfb\",\n\t\"camellia-256-cfb\",\n\t\"cast5-cfb\",\n\t\"des-cfb\",\n\t\"idea-cfb\",\n\t\"rc2-cfb\",\n\t\"seed-cfb\",\n\t\"salsa20\",\n\t\"chacha20\",\n\t\"chacha20-ietf\"\n}\n\nlocal encrypt_methods_ss = {\n\t-- aead\n\t\"aes-128-gcm\",\n\t\"aes-192-gcm\",\n\t\"aes-256-gcm\",\n\t\"chacha20-ietf-poly1305\",\n\t\"xchacha20-ietf-poly1305\",\n\t-- aead 2022\n\t\"2022-blake3-aes-128-gcm\",\n\t\"2022-blake3-aes-256-gcm\",\n\t\"2022-blake3-chacha20-poly1305\"\n\t--[[ stream\n\t\"table\",\n\t\"rc4\",\n\t\"rc4-md5\",\n\t\"aes-128-cfb\",\n\t\"aes-192-cfb\",\n\t\"aes-256-cfb\",\n\t\"aes-128-ctr\",\n\t\"aes-192-ctr\",\n\t\"aes-256-ctr\",\n\t\"bf-cfb\",\n\t\"camellia-128-cfb\",\n\t\"camellia-192-cfb\",\n\t\"camellia-256-cfb\",\n\t\"salsa20\",\n\t\"chacha20\",\n\t\"chacha20-ietf\" ]]\n}\n\nlocal protocol = {\"origin\"}\n\nobfs = {\"plain\", \"http_simple\", \"http_post\"}\n\nm = Map(\"shadowsocksr\", translate(\"Edit ShadowSocksR Server\"))\n\nm.redirect = luci.dispatcher.build_url(\"admin/services/shadowsocksr/server\")\nif m.uci:get(\"shadowsocksr\", sid) ~= \"server_config\" then\n\tluci.http.redirect(m.redirect)\n\treturn\nend\n\n-- [[ Server Setting ]]--\ns = m:section(NamedSection, sid, \"server_config\")\ns.anonymous = true\ns.addremove = false\n\no = s:option(Flag, \"enable\", translate(\"Enable\"))\no.default = 1\no.rmempty = false\n\no = s:option(ListValue, \"type\", translate(\"Server Type\"))\no:value(\"socks5\", translate(\"Socks5\"))\nif nixio.fs.access(\"/usr/bin/ssserver\") or nixio.fs.access(\"/usr/bin/ss-server\") then\n\to:value(\"ss\", translate(\"ShadowSocks\"))\nend\nif nixio.fs.access(\"/usr/bin/ssr-server\") then\n\to:value(\"ssr\", translate(\"ShadowsocksR\"))\nend\no.default = \"socks5\"\n\no = s:option(Value, \"server_port\", translate(\"Server Port\"))\no.datatype = \"port\"\nmath.randomseed(tostring(os.time()):reverse():sub(1, 7))\no.default = math.random(10240, 20480)\no.rmempty = false\no.description = translate(\"warning! Please do not reuse the port!\")\n\no = s:option(Value, \"timeout\", translate(\"Connection Timeout\"))\no.datatype = \"uinteger\"\no.default = 60\no.rmempty = false\no:depends(\"type\", \"ss\")\no:depends(\"type\", \"ssr\")\n\no = s:option(Value, \"username\", translate(\"Username\"))\no.rmempty = false\no:depends(\"type\", \"socks5\")\n\no = s:option(Value, \"password\", translate(\"Password\"))\no.password = true\no.rmempty = false\n\no = s:option(ListValue, \"encrypt_method\", translate(\"Encrypt Method\"))\nfor _, v in ipairs(encrypt_methods) do\n\to:value(v)\nend\no.rmempty = false\no:depends(\"type\", \"ssr\")\n\no = s:option(ListValue, \"encrypt_method_ss\", translate(\"Encrypt Method\"))\nfor _, v in ipairs(encrypt_methods_ss) do\n\to:value(v)\nend\no.rmempty = false\no:depends(\"type\", \"ss\")\n\no = s:option(ListValue, \"protocol\", translate(\"Protocol\"))\nfor _, v in ipairs(protocol) do\n\to:value(v)\nend\no.rmempty = false\no:depends(\"type\", \"ssr\")\n\no = s:option(ListValue, \"obfs\", translate(\"Obfs\"))\nfor _, v in ipairs(obfs) do\n\to:value(v)\nend\no.rmempty = false\no:depends(\"type\", \"ssr\")\n\no = s:option(Value, \"obfs_param\", translate(\"Obfs param (optional)\"))\no:depends(\"type\", \"ssr\")\n\no = s:option(Flag, \"fast_open\", translate(\"TCP Fast Open\"))\no.rmempty = false\no:depends(\"type\", \"ss\")\no:depends(\"type\", \"ssr\")\n\nreturn m\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua",
    "content": "-- Copyright (C) 2017 yushi studio <ywb94@qq.com>\n-- Licensed to the public under the GNU General Public License v3.\nrequire \"luci.http\"\nrequire \"luci.dispatcher\"\nlocal m, sec, o\nlocal encrypt_methods = {\n\t\"table\",\n\t\"rc4\",\n\t\"rc4-md5\",\n\t\"rc4-md5-6\",\n\t\"aes-128-cfb\",\n\t\"aes-192-cfb\",\n\t\"aes-256-cfb\",\n\t\"aes-128-ctr\",\n\t\"aes-192-ctr\",\n\t\"aes-256-ctr\",\n\t\"bf-cfb\",\n\t\"camellia-128-cfb\",\n\t\"camellia-192-cfb\",\n\t\"camellia-256-cfb\",\n\t\"cast5-cfb\",\n\t\"des-cfb\",\n\t\"idea-cfb\",\n\t\"rc2-cfb\",\n\t\"seed-cfb\",\n\t\"salsa20\",\n\t\"chacha20\",\n\t\"chacha20-ietf\"\n}\n\nlocal encrypt_methods_ss = {\n\t-- aead\n\t\"aes-128-gcm\",\n\t\"aes-192-gcm\",\n\t\"aes-256-gcm\",\n\t\"chacha20-ietf-poly1305\",\n\t\"xchacha20-ietf-poly1305\",\n\t-- aead 2022\n\t\"2022-blake3-aes-128-gcm\",\n\t\"2022-blake3-aes-256-gcm\",\n\t\"2022-blake3-chacha20-poly1305\"\n\t--[[ stream\n\t\"table\",\n\t\"rc4\",\n\t\"rc4-md5\",\n\t\"aes-128-cfb\",\n\t\"aes-192-cfb\",\n\t\"aes-256-cfb\",\n\t\"aes-128-ctr\",\n\t\"aes-192-ctr\",\n\t\"aes-256-ctr\",\n\t\"bf-cfb\",\n\t\"camellia-128-cfb\",\n\t\"camellia-192-cfb\",\n\t\"camellia-256-cfb\",\n\t\"salsa20\",\n\t\"chacha20\",\n\t\"chacha20-ietf\" ]]\n}\n\nlocal protocol = {\n\t\"origin\",\n\t\"verify_deflate\",\n\t\"auth_sha1_v4\",\n\t\"auth_aes128_sha1\",\n\t\"auth_aes128_md5\",\n\t\"auth_chain_a\"\n}\n\nobfs = {\n\t\"plain\",\n\t\"http_simple\",\n\t\"http_post\",\n\t\"random_head\",\n\t\"tls1.2_ticket_auth\",\n\t\"tls1.2_ticket_fastauth\"\n}\n\nm = Map(\"shadowsocksr\")\n-- [[ Global Setting ]]--\nsec = m:section(TypedSection, \"server_global\", translate(\"Global Setting\"))\nsec.anonymous = true\n\no = sec:option(Flag, \"enable_server\", translate(\"Enable Server\"))\no.rmempty = false\n\n-- [[ Server Setting ]]--\nsec = m:section(TypedSection, \"server_config\", translate(\"Server Setting\"))\nsec.anonymous = true\nsec.addremove = true\nsec.template = \"cbi/tblsection\"\nsec.extedit = luci.dispatcher.build_url(\"admin/services/shadowsocksr/server/%s\")\nfunction sec.create(...)\n\tlocal sid = TypedSection.create(...)\n\tif sid then\n\t\tluci.http.redirect(sec.extedit % sid)\n\t\treturn\n\tend\nend\n\no = sec:option(Flag, \"enable\", translate(\"Enable\"))\nfunction o.cfgvalue(...)\n\treturn Value.cfgvalue(...) or translate(\"0\")\nend\no.rmempty = false\n\no = sec:option(DummyValue, \"type\", translate(\"Server Type\"))\nfunction o.cfgvalue(...)\n\treturn Value.cfgvalue(...) or \"ss\"\nend\n\no = sec:option(DummyValue, \"server_port\", translate(\"Server Port\"))\nfunction o.cfgvalue(...)\n\treturn Value.cfgvalue(...) or \"-\"\nend\n\no = sec:option(DummyValue, \"username\", translate(\"Username\"))\nfunction o.cfgvalue(...)\n\treturn Value.cfgvalue(...) or \"-\"\nend\n\no = sec:option(DummyValue, \"encrypt_method\", translate(\"Encrypt Method\"))\nfunction o.cfgvalue(self, section)\n\tlocal method = self.map:get(section, \"encrypt_method\") or self.map:get(section, \"encrypt_method_ss\")\n\treturn method and method:upper() or \"-\"\nend\n\no = sec:option(DummyValue, \"protocol\", translate(\"Protocol\"))\nfunction o.cfgvalue(...)\n\treturn Value.cfgvalue(...) or \"-\"\nend\n\no = sec:option(DummyValue, \"obfs\", translate(\"Obfs\"))\nfunction o.cfgvalue(...)\n\treturn Value.cfgvalue(...) or \"-\"\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua",
    "content": "-- Licensed to the public under the GNU General Public License v3.\nrequire \"luci.http\"\nrequire \"luci.sys\"\nrequire \"nixio.fs\"\nrequire \"luci.dispatcher\"\nrequire \"luci.model.uci\"\nlocal cbi = require \"luci.cbi\"\nlocal uci = require \"luci.model.uci\".cursor()\n\nlocal m, s, o, node\nlocal server_count = 0\n\n-- 确保正确判断程序是否存在\nlocal function is_finded(e)\n\treturn luci.sys.exec(string.format('type -t -p \"%s\" 2>/dev/null', e)) ~= \"\"\nend\n\nlocal function is_js_luci()\n\treturn luci.sys.call('[ -f \"/www/luci-static/resources/uci.js\" ]') == 0\nend\n\nlocal function url(...)\n\tlocal url = string.format(\"admin/services/%s\", \"shadowsocksr\")\n\tlocal args = { ... }\n\tfor i, v in ipairs(args) do\n\t\tif v and v ~= \"\" then\n\t\t\turl = url .. \"/\" .. v\n\t\tend\n\tend\n\treturn require \"luci.dispatcher\".build_url(url)\nend\n\n-- 默认的保存并应用行为\nlocal function apply_redirect(m)\n\tlocal tmp_uci_file = \"/etc/config/\" .. \"shadowsocksr\" .. \"_redirect\"\n\tif m.redirect and m.redirect ~= \"\" then\n\t\tif nixio.fs.access(tmp_uci_file) then\n\t\t\tlocal redirect\n\t\t\tfor line in io.lines(tmp_uci_file) do\n\t\t\t\tredirect = line:match(\"option%s+url%s+['\\\"]([^'\\\"]+)['\\\"]\")\n\t\t\t\tif redirect and redirect ~= \"\" then break end\n\t\t\tend\n\t\t\tif redirect and redirect ~= \"\" then\n\t\t\t\tluci.sys.call(\"/bin/rm -f \" .. tmp_uci_file)\n\t\t\t\tluci.http.redirect(redirect)\n\t\t\tend\n\t\telse\n\t\t\tnixio.fs.writefile(tmp_uci_file, \"config redirect\\n\")\n\t\tend\n\t\tm.on_after_save = function(self)\n\t\t\tlocal redirect = self.redirect\n\t\t\tif redirect and redirect ~= \"\" then\n\t\t\t\tm.uci:set(\"shadowsocksr\" .. \"_redirect\", \"@redirect[0]\", \"url\", redirect)\n\t\t\tend\n\t\tend\n\telse\n\t\tluci.sys.call(\"/bin/rm -f \" .. tmp_uci_file)\n\tend\nend\n\nlocal function set_apply_on_parse(map)\n\tif not map then return end\n\tif is_js_luci() then\n\t\tapply_redirect(map)\n\t\tlocal old = map.on_after_save\n\t\tmap.on_after_save = function(self)\n\t\t\tif old then old(self) end\n\t\t\tmap:set(\"@global[0]\", \"timestamp\", os.time())\n\t\tend\n\tend\nend\n\nlocal has_ss_rust = is_finded(\"sslocal\") or is_finded(\"ssserver\")\nlocal has_ss_libev = is_finded(\"ss-redir\") or is_finded(\"ss-local\")\nlocal has_trojan = is_finded(\"trojan\")\nlocal has_xray = is_finded(\"xray\")\nlocal has_hysteria2 = is_finded(\"hysteria\")\n\nlocal ss_type_list = {}\nlocal tj_type_list = {}\nlocal hy2_type_list = {}\n\nif has_hysteria2 then\n\ttable.insert(hy2_type_list, { id = \"hysteria2\", name = translate(\"Hysteria2\") })\nend\nif has_xray then\n\ttable.insert(hy2_type_list, { id = \"v2ray\", name = translate(\"Xray (Hysteria2)\") })\nend\n\nif has_trojan then\n\ttable.insert(tj_type_list, { id = \"trojan\", name = translate(\"Trojan\") })\nend\nif has_xray then\n\ttable.insert(tj_type_list, { id = \"v2ray\", name = translate(\"Xray (Trojan)\") })\nend\n\nif has_ss_rust then\n\ttable.insert(ss_type_list, { id = \"ss-rust\", name = translate(\"ShadowSocks-rust Version\") })\nend\nif has_ss_libev then\n\ttable.insert(ss_type_list, { id = \"ss-libev\", name = translate(\"ShadowSocks-libev Version\") })\nend\nif has_xray then\n\ttable.insert(ss_type_list, { id = \"v2ray\", name = translate(\"Xray (ShadowSocks)\") })\nend\n\nuci:foreach(\"shadowsocksr\", \"servers\", function(s)\n\tserver_count = server_count + 1\nend)\n\nm = Map(\"shadowsocksr\", translate(\"Servers subscription and manage\"))\n\n-- Server Subscribe\ns = m:section(TypedSection, \"server_subscribe\")\ns.anonymous = true\n\no = s:option(Flag, \"auto_update\", translate(\"Auto Update\"))\no.rmempty = false\no.description = translate(\"Auto Update Server subscription, GFW list and CHN route\")\n\no = s:option(ListValue, \"auto_update_week_time\", translate(\"Update cycle (Day/Week)\"))\no:value('*', translate(\"Every Day\"))\no:value(\"1\", translate(\"Every Monday\"))\no:value(\"2\", translate(\"Every Tuesday\"))\no:value(\"3\", translate(\"Every Wednesday\"))\no:value(\"4\", translate(\"Every Thursday\"))\no:value(\"5\", translate(\"Every Friday\"))\no:value(\"6\", translate(\"Every Saturday\"))\no:value(\"0\", translate(\"Every Sunday\"))\no.default = \"*\"\no.rmempty = true\no:depends(\"auto_update\", \"1\")\n\no = s:option(ListValue, \"auto_update_day_time\", translate(\"Regular update (Hour)\"))\nfor t = 0, 23 do\n\to:value(t, t .. \":00\")\nend\no.default = 2\no.rmempty = true\no:depends(\"auto_update\", \"1\")\n\no = s:option(ListValue, \"auto_update_min_time\", translate(\"Regular update (Min)\"))\nfor i = 0, 59 do\n\to:value(i, i .. \":00\")\nend\no.default = 30\no.rmempty = true\no:depends(\"auto_update\", \"1\")\n\n-- 确保 hy2_type_list 不为空\nif #hy2_type_list > 0 then\n\tlocal sid = uci:get_first(\"shadowsocksr\", \"server_subscribe\")\n\tif not sid then\n\t\tuci:foreach(\"shadowsocksr\", \"server_subscribe\", function(section)\n\t\t\tsid = section[\".name\"]\n\t\t\treturn false\n\t\tend)\n\tend\n\tif sid then\n\t\tlocal old_val = uci:get(\"shadowsocksr\", sid, \"xray_hy2_type\")\n\t\tif old_val and old_val ~= \"\" then\n\t\t\tif (old_val == \"hysteria2\" and not has_hysteria2) or\n\t\t\t   (old_val == \"v2ray\" and not has_xray) then\n\t\t\t\t-- 核心不可用，设置为空（删除配置）\n\t\t\t\tuci:set(\"shadowsocksr\", sid, \"xray_hy2_type\", \"\")\n\t\t\t\tuci:commit(\"shadowsocksr\")\n\t\t\tend\n\t\tend\n\tend\n\to = s:option(ListValue, \"xray_hy2_type\", string.format(\"<b><span style='color:red;'>%s</span></b>\", translatef(\"%s Node Use Type\", \"Hysteria2\")))\n\to.description = translate(\"The configured type also applies to the core specified when manually importing nodes.\")\n\to:value(\"\", translate(\"Auto\"))\n\tfor _, v in ipairs(hy2_type_list) do\n\t\to:value(v.id, v.name) -- 存储 \"Xray\" / \"Hysteria2\"，但 UI 显示完整名称\n\tend\nend\n\n-- 确保 tj_type_list 不为空\nif #tj_type_list > 0 then\n\tlocal sid = uci:get_first(\"shadowsocksr\", \"server_subscribe\")\n\tif not sid then\n\t\tuci:foreach(\"shadowsocksr\", \"server_subscribe\", function(section)\n\t\t\tsid = section[\".name\"]\n\t\t\treturn false\n\t\tend)\n\tend\n\tif sid then\n\t\tlocal old_val = uci:get(\"shadowsocksr\", sid, \"xray_tj_type\")\n\t\tif old_val and old_val ~= \"\" then\n\t\t\tif (old_val == \"trojan\" and not has_trojan) or\n\t\t\t   (old_val == \"v2ray\" and not has_xray) then\n\t\t\t\t-- 核心不可用，设置为空（删除配置）\n\t\t\t\tuci:set(\"shadowsocksr\", sid, \"xray_tj_type\", \"\")\n\t\t\t\tuci:commit(\"shadowsocksr\")\n\t\t\tend\n\t\tend\n\tend\n\to = s:option(ListValue, \"xray_tj_type\", string.format(\"<b><span style='color:red;'>%s</span></b>\", translatef(\"%s Node Use Type\", \"Trojan\")))\n\to.description = translate(\"The configured type also applies to the core specified when manually importing nodes.\")\n\to:value(\"\", translate(\"Auto\"))\n\tfor _, v in ipairs(tj_type_list) do\n\t\to:value(v.id, v.name) -- 存储 \"Xray\" / \"Trojan\"，但 UI 显示完整名称\n\tend\nend\n\n-- 确保 ss_type_list 不为空\nif #ss_type_list > 0 then\n\tlocal sid = uci:get_first(\"shadowsocksr\", \"server_subscribe\")\n\tif not sid then\n\t\tuci:foreach(\"shadowsocksr\", \"server_subscribe\", function(section)\n\t\t\tsid = section[\".name\"]\n\t\t\treturn false\n\t\tend)\n\tend\n\tif sid then\n\t\tlocal old_val = uci:get(\"shadowsocksr\", sid, \"ss_type\")\n\t\tif old_val and old_val ~= \"\" then\n\t\t\tif (old_val == \"ss-rust\" and not has_ss_rust) or\n\t\t\t   (old_val == \"ss-libev\" and not has_ss_libev) or\n\t\t\t   (old_val == \"v2ray\" and not has_xray) then\n\t\t\t\t-- 核心不可用，设置为空（删除配置）\n\t\t\t\tuci:set(\"shadowsocksr\", sid, \"ss_type\", \"\")\n\t\t\t\tuci:commit(\"shadowsocksr\")\n\t\t\tend\n\t\tend\n\tend\n\to = s:option(ListValue, \"ss_type\", string.format(\"<b><span style='color:red;'>%s</span></b>\", translatef(\"%s Node Use Version\", \"ShadowSocks\")))\n\to.description = translate(\"Selection ShadowSocks Node Use Version.\")\n\to:value(\"\", translate(\"Auto\"))\n\tfor _, v in ipairs(ss_type_list) do\n\t\to:value(v.id, v.name) -- 存储 \"ss-libev\" / \"ss-rust\"，但 UI 显示完整名称\n\tend\nend\n\no = s:option(DynamicList, \"subscribe_url\", translate(\"Subscribe URL\"))\no.rmempty = true\n\no = s:option(ListValue, \"domain_resolver\", translate(\"Domain DNS Resolve\"))\no.description = translate(\n\t\"<ul>\" ..\n\t\"<li>\" .. translate(\"If the node address is a domain name, this DNS will be used for resolution.\") .. \"</li>\" .. \n\t\"<li>\" .. string.format('<font style=\\'color:red;\\'>%s</font>', translate(\"Supports only Xray node types.\")) .. \"</li>\" ..\n\t\"<li>\" .. string.format('<font style=\\'color:red;\\'>%s</font>', translate(\"Note: For node-specific DNS only. Keep Auto to avoid extra overhead.\")) .. \"</li>\" ..\n\t\"</ul>\"\n)\no:value(\"\", translate(\"Auto\"))\no:value(\"tcp\", translate(\"TCP\"))\no:value(\"udp\", translate(\"UDP\"))\no:value(\"https\", translate(\"DoH\"))\n\no = s:option(Value, \"domain_resolver_dns\", translate(\"DNS\"))\no.datatype = \"or(ipaddr,ipaddrport)\"\no:value(\"114.114.114.114\")\no:value(\"223.5.5.5:53\")\no.default = \"114.114.114.114\"\no:depends(\"domain_resolver\", \"tcp\")\no:depends(\"domain_resolver\", \"udp\") \n\no = s:option(Value, \"domain_resolver_dns_https\", translate(\"DNS\"))\no:value(\"https://120.53.53.53/dns-query\", \"DNSPod\")\no:value(\"https://223.5.5.5/dns-query\", \"AliDNS\")\no.default = o.keylist[1]\no:depends(\"domain_resolver\", \"https\")\n\no = s:option(ListValue, \"domain_strategy\", translate(\"Domain Strategy\"))\no.description = translate(\n\t\"<ul>\" ..\n\t\"<li>\" .. translate(\"If is domain name, The requested domain name will be resolved to IP before connect.\") .. \"</li>\" .. \n\t\"<li>\" .. string.format('<font style=\\'color:red;\\'>%s</font>', translate(\"Supports only Xray node types.\")) .. \"</li>\" ..\n\t\"<li>\" .. string.format('<font style=\\'color:red;\\'>%s</font>', translate(\"Note: For node-specific DNS only. Keep Auto to avoid extra overhead.\")) .. \"</li>\" ..\n\t\"</ul>\"\n)\no.default = \"\"\no:value(\"\", translate(\"Auto\"))\no:value(\"UseIPv4v6\", translate(\"Prefer IPv4\"))\no:value(\"UseIPv6v4\", translate(\"Prefer IPv6\"))\no:value(\"UseIPv4\", translate(\"IPv4 Only\"))\no:value(\"UseIPv6\", translate(\"IPv6 Only\"))\n\no = s:option(Value, \"filter_words\", translate(\"Subscribe Filter Words\"))\no.rmempty = true\no.description = translate(\"Filter Words splited by /\")\n\no = s:option(Value, \"save_words\", translate(\"Subscribe Save Words\"))\no.rmempty = true\no.description = translate(\"Save Words splited by /\")\n\no = s:option(Button, \"update_Sub\", translate(\"Update Subscribe List\"))\no.inputstyle = \"reload\"\no.description = translate(\"Update subscribe url list first\")\no.write = function()\n\tuci:commit(\"shadowsocksr\")\n\tluci.sys.exec(\"rm -rf /tmp/sub_md5_*\")\n\tluci.http.redirect(luci.dispatcher.build_url(\"admin\", \"services\", \"shadowsocksr\", \"servers\"))\nend\n\no = s:option(Flag, \"allow_insecure\", translate(\"Allow subscribe Insecure nodes By default\"))\no.rmempty = false\no.description = translate(\"Subscribe nodes allows insecure connection as TLS client (insecure)\")\no.default = \"0\"\n\no = s:option(Flag, \"switch\", translate(\"Subscribe Default Auto-Switch\"))\no.rmempty = false\no.description = translate(\"Subscribe new add server default Auto-Switch on\")\no.default = \"1\"\n\no = s:option(Flag, \"proxy\", translate(\"Through proxy update\"))\no.rmempty = false\no.description = translate(\"Through proxy update list, Not Recommended \")\n\no = s:option(Button, \"subscribe\", translate(\"Update All Subscribe Servers\"))\no.rawhtml = true\no.template = \"shadowsocksr/subscribe\"\n\no = s:option(Button, \"delete\", translate(\"Delete All Subscribe Servers\"))\no.inputstyle = \"reset\"\no.description = string.format(translate(\"Server Count\") .. \": %d\", server_count)\no.write = function()\n\tluci.http.redirect(url(\"delete\"))\nend\n\no = s:option(Value, \"url_test_url\", translate(\"URL Test Address\"))\no:value(\"https://cp.cloudflare.com/\", \"Cloudflare\")\no:value(\"https://www.gstatic.com/generate_204\", \"Gstatic\")\no:value(\"https://www.google.com/generate_204\", \"Google\")\no:value(\"https://www.youtube.com/generate_204\", \"YouTube\")\no:value(\"https://connect.rom.miui.com/generate_204\", \"MIUI (CN)\")\no:value(\"https://connectivitycheck.platform.hicloud.com/generate_204\", \"HiCloud (CN)\")\no.default = o.keylist[3]\n\n\no = s:option(Value, \"user_agent\", translate(\"User-Agent\"))\no.default = \"v2rayN/9.99\"\no:value(\"curl\", \"Curl\")\no:value(\"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0\", \"Edge for Linux\")\no:value(\"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/122.0.0.0 Safari/537.36 Edg/122.0.0.0\", \"Edge for Windows\")\no:value(\"v2rayN/9.99\", \"v2rayN\")\n\n-- [[ Servers Manage ]]--\ns = m:section(TypedSection, \"servers\")\ns.anonymous = true\ns.addremove = true\ns.template = \"cbi/tblsection\"\nset_apply_on_parse(m)\ns.sortable = true\n--[[\ns.extedit = url(\"servers\", \"%s\")\nfunction s.create(self, ...)\n    local sid = TypedSection.create(self, ...)\n    if sid then\n        local newsid = \"cfg\" .. sid:sub(-6)\n\t\t-- 删除匿名\n\t\tself.map.uci:delete(self.config, sid)\n        -- 重命名 section\n        self.map.uci:section(self.config, self.sectiontype, newsid)\n        luci.http.redirect(self.extedit % newsid)\n        return\n    end\nend\n]]--\n\no = s:option(DummyValue, \"type\", translate(\"Type\"))\nfunction o.cfgvalue(self, section)\n\treturn m:get(section, \"v2ray_protocol\") or Value.cfgvalue(self, section) or translate(\"None\")\nend\n\no = s:option(DummyValue, \"alias\", translate(\"Alias\"))\nfunction o.cfgvalue(...)\n\treturn Value.cfgvalue(...) or translate(\"None\")\nend\n\no = s:option(DummyValue, \"server_port\", translate(\"Server Port\"))\nfunction o.cfgvalue(...)\n\treturn Value.cfgvalue(...) or \"N/A\"\nend\n\no = s:option(DummyValue, \"server_port\", translate(\"Socket Connected\"))\no.template = \"shadowsocksr/socket\"\no.width = \"10%\"\no.render = function(self, section, scope)\n\tlocal cfg = s:cfgvalue(section) or {}\n\tself.transport = cfg.transport\n\tself.type = cfg.type\n\tself.v2ray_protocol = cfg.v2ray_protocol\n\tif self.transport == 'ws' then\n\t\tself.ws_path = cfg.ws_path\n\t\tself.tls = cfg.tls\n\t\tself.tls_host = cfg.tls_host\n\tend\n\tDummyValue.render(self, section, scope)\nend\n\no = s:option(DummyValue, \"server\", translate(\"Ping Latency\"))\no.template = \"shadowsocksr/ping\"\no.width = \"10%\"\n\nlocal global_server = uci:get_first('shadowsocksr', 'global', 'global_server') \n\nnode = s:option(Button, \"apply_node\", translate(\"Apply\"))\nnode.inputstyle = \"apply\"\nnode.render = function(self, section, scope)\n\tif section == global_server then\n\t\tself.title = translate(\"Reapply\")\n\telse\n\t\tself.title = translate(\"Apply\")\n\tend\n\tButton.render(self, section, scope)\nend\nnode.write = function(self, section)\n\tuci:set(\"shadowsocksr\", '@global[0]', 'global_server', section)\n\tuci:save(\"shadowsocksr\")\n\tuci:commit(\"shadowsocksr\")\n\tluci.sys.call(\"/etc/init.d/shadowsocksr restart >/dev/null 2>&1 &\")\n\tluci.http.redirect(url(\"restart\"))\nend\n\no = s:option(Flag, \"switch_enable\", translate(\"Auto Switch\"))\no.rmempty = false\nfunction o.cfgvalue(...)\n\treturn Value.cfgvalue(...) or 1\nend\n\nm:append(cbi.Template(\"shadowsocksr/server_list\"))\n\nreturn m\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua",
    "content": "-- Copyright (C) 2017 yushi studio <ywb94@qq.com>\n-- Licensed to the public under the GNU General Public License v3.\nrequire \"nixio.fs\"\nrequire \"luci.sys\"\nrequire \"luci.model.uci\"\nlocal m, s, o\nlocal redir_run = 0\nlocal reudp_run = 0\nlocal sock5_run = 0\nlocal server_run = 0\nlocal kcptun_run = 0\nlocal tunnel_run = 0\nlocal gfw_count = 0\nlocal ad_count = 0\nlocal ip_count = 0\nlocal nfip_count = 0\nlocal Process_list = luci.sys.exec(\"busybox ps -w\")\nlocal uci = require \"luci.model.uci\".cursor()\n-- html constants\nfont_blue = [[<b style=color:green>]]\nstyle_blue = [[<b style=color:red>]]\nfont_off = [[</b>]]\nbold_on = [[<strong>]]\nbold_off = [[</strong>]]\nlocal kcptun_version = translate(\"Unknown\")\nlocal kcp_file = \"/usr/bin/kcptun-client\"\nif not nixio.fs.access(kcp_file) then\n\tkcptun_version = translate(\"Not exist\")\nelse\n\tif not nixio.fs.access(kcp_file, \"rwx\", \"rx\", \"rx\") then\n\t\tnixio.fs.chmod(kcp_file, 755)\n\tend\n\tkcptun_version = \"<b>\" ..luci.sys.exec(kcp_file .. \" -v | awk '{printf $3}'\") .. \"</b>\"\n\tif not kcptun_version or kcptun_version == \"\" then\n\t\tkcptun_version = translate(\"Unknown\")\n\tend\nend\n\nif nixio.fs.access(\"/etc/ssrplus/gfw_list.conf\") then\n\tgfw_count = tonumber(luci.sys.exec(\"cat /etc/ssrplus/gfw_list.conf | wc -l\")) / 2\nend\n\nif nixio.fs.access(\"/etc/ssrplus/ad.conf\") then\n\tad_count = tonumber(luci.sys.exec(\"cat /etc/ssrplus/ad.conf | wc -l\"))\nend\n\nif nixio.fs.access(\"/etc/ssrplus/china_ssr.txt\") then\n\tip_count = tonumber(luci.sys.exec(\"cat /etc/ssrplus/china_ssr.txt | wc -l\"))\nend\n\nif nixio.fs.access(\"/etc/ssrplus/applechina.conf\") then\n\tapple_count = tonumber(luci.sys.exec(\"cat /etc/ssrplus/applechina.conf | wc -l\"))\nend\n\nif nixio.fs.access(\"/etc/ssrplus/netflixip.list\") then\n\tnfip_count = tonumber(luci.sys.exec(\"cat /etc/ssrplus/netflixip.list | wc -l\"))\nend\n\nif Process_list:find(\"udp.only.ssr.reudp\") then\n\treudp_run = 1\nend\n\n--[[\nif Process_list:find(\"tcp.udp.dual.ssr.retcp\") then\n\tredir_run = 1\nend\n]]--\n\nif Process_list:find(\"tcp.only.ssr.retcp\") then\n\tredir_run = 1\nend\n\nif Process_list:find(\"tcp.udp.ssr.local\") then\n\tsock5_run = 1\nend\n\nif Process_list:find(\"tcp.udp.ssr.retcp\") then\n\tredir_run = 1\n\treudp_run = 1\nend\n\n--[[\nif Process_list:find(\"nft.ssr.retcp\") then\n\tredir_run = 1\nend\n]]--\n\nif Process_list:find(\"local.ssr.retcp\") then\n\tredir_run = 1\n\tsock5_run = 1\nend\n\n--[[\nif Process_list:find(\"local.nft.ssr.retcp\") then\n\tredir_run = 1\n\tsock5_run = 1\nend\n]]--\n\nif Process_list:find(\"local.udp.ssr.retcp\") then\n\treudp_run = 1\n\tredir_run = 1\n\tsock5_run = 1\nend\n\nif Process_list:find(\"kcptun.client\") then\n\tkcptun_run = 1\nend\n\nif Process_list:find(\"ssr.server\") then\n\tserver_run = 1\nend\n\nif  Process_list:find(\"ssrplus/bin/dns2tcp\") or\n    Process_list:find(\"ssrplus/bin/mosdns\") or\n    Process_list:find(\"dnsproxy.*127.0.0.1.*5335\") or\n    Process_list:find(\"chinadns.*127.0.0.1.*5335\") or\n    (Process_list:find(\"ssrplus.dns\") and Process_list:find(\"dns2socks.*127.0.0.1.*127.0.0.1.5335\")) then\n\tpdnsd_run = 1\nend\n\nm = SimpleForm(\"Version\")\nm.reset = false\nm.submit = false\n\ns = m:field(DummyValue, \"redir_run\", translate(\"Global Client\"))\ns.rawhtml = true\nif redir_run == 1 then\n\ts.value = font_blue .. bold_on .. translate(\"Running\") .. bold_off .. font_off\nelse\n\ts.value = style_blue .. bold_on .. translate(\"Not Running\") .. bold_off .. font_off\nend\n\ns = m:field(DummyValue, \"reudp_run\", translate(\"Game Mode UDP Relay\"))\ns.rawhtml = true\nif reudp_run == 1 then\n\ts.value = font_blue .. bold_on .. translate(\"Running\") .. bold_off .. font_off\nelse\n\ts.value = style_blue .. bold_on .. translate(\"Not Running\") .. bold_off .. font_off\nend\n\nif uci:get_first(\"shadowsocksr\", 'global', 'pdnsd_enable', '0') ~= '0' then\n\ts = m:field(DummyValue, \"pdnsd_run\", translate(\"DNS Anti-pollution\"))\n\ts.rawhtml = true\n\tif pdnsd_run == 1 then\n\t\ts.value = font_blue .. bold_on .. translate(\"Running\") .. bold_off .. font_off\n\telse\n\t\ts.value = style_blue .. bold_on .. translate(\"Not Running\") .. bold_off .. font_off\n\tend\nend\n\ns = m:field(DummyValue, \"sock5_run\", translate(\"Global SOCKS5 Proxy Server\"))\ns.rawhtml = true\nif sock5_run == 1 then\n\ts.value = font_blue .. bold_on .. translate(\"Running\") .. bold_off .. font_off\nelse\n\ts.value = style_blue .. bold_on .. translate(\"Not Running\") .. bold_off .. font_off\nend\n\ns = m:field(DummyValue, \"server_run\", translate(\"Local Servers\"))\ns.rawhtml = true\nif server_run == 1 then\n\ts.value = font_blue .. bold_on .. translate(\"Running\") .. bold_off .. font_off\nelse\n\ts.value = style_blue .. bold_on .. translate(\"Not Running\") .. bold_off .. font_off\nend\n\nif nixio.fs.access(\"/usr/bin/kcptun-client\") then\n\ts = m:field(DummyValue, \"kcp_version\", translate(\"KcpTun Version\"))\n\ts.rawhtml = true\n\ts.value = kcptun_version\n\ts = m:field(DummyValue, \"kcptun_run\", translate(\"KcpTun\"))\n\ts.rawhtml = true\n\tif kcptun_run == 1 then\n\t\ts.value = font_blue .. bold_on .. translate(\"Running\") .. bold_off .. font_off\n\telse\n\t\ts.value = style_blue .. bold_on .. translate(\"Not Running\") .. bold_off .. font_off\n\tend\nend\n\ns = m:field(Button, \"Restart\", translate(\"Restart ShadowSocksR Plus+\"))\ns.inputtitle = translate(\"Restart Service\")\ns.inputstyle = \"reload\"\ns.write = function()\n\tluci.sys.call(\"/etc/init.d/shadowsocksr restart >/dev/null 2>&1 &\")\n\tluci.http.redirect(luci.dispatcher.build_url(\"admin\", \"services\", \"shadowsocksr\", \"client\"))\nend\n\ns = m:field(DummyValue, \"google\", translate(\"Google Connectivity\"))\ns.value = translate(\"No Check\")\ns.template = \"shadowsocksr/check\"\n\ns = m:field(DummyValue, \"baidu\", translate(\"Baidu Connectivity\"))\ns.value = translate(\"No Check\")\ns.template = \"shadowsocksr/check\"\n\ns = m:field(DummyValue, \"gfw_data\", translate(\"GFW List Data\"))\ns.rawhtml = true\ns.template = \"shadowsocksr/refresh\"\ns.value = gfw_count .. \" \" .. translate(\"Records\")\n\ns = m:field(DummyValue, \"ip_data\", translate(\"China IP Data\"))\ns.rawhtml = true\ns.template = \"shadowsocksr/refresh\"\ns.value = ip_count .. \" \" .. translate(\"Records\")\n\nif uci:get_first(\"shadowsocksr\", 'global', 'apple_optimization', '0') ~= '0' then\n\ts = m:field(DummyValue, \"apple_data\", translate(\"Apple Domains Data\"))\n\ts.rawhtml = true\n\ts.template = \"shadowsocksr/refresh\"\n\ts.value = apple_count .. \" \" .. translate(\"Records\")\nend\n\nif uci:get_first(\"shadowsocksr\", 'global', 'netflix_enable', '0') ~= '0' then\n\ts = m:field(DummyValue, \"nfip_data\", translate(\"Netflix IP Data\"))\n\ts.rawhtml = true\n\ts.template = \"shadowsocksr/refresh\"\n\ts.value = nfip_count .. \" \" .. translate(\"Records\")\nend\n\nif uci:get_first(\"shadowsocksr\", 'global', 'adblock', '0') == '1' then\n\ts = m:field(DummyValue, \"ad_data\", translate(\"Advertising Data\"))\n\ts.rawhtml = true\n\ts.template = \"shadowsocksr/refresh\"\n\ts.value = ad_count .. \" \" .. translate(\"Records\")\nend\n\ns = m:field(DummyValue, \"check_port\", translate(\"Check Server Port\"))\ns.template = \"shadowsocksr/checkport\"\ns.value = translate(\"No Check\")\n\nreturn m\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm",
    "content": "<div class=\"cbi-value\" id=\"_backup_div\">\n    <label class=\"cbi-value-title\"><%:Create Backup File%></label>\n    <div class=\"cbi-value-field\">\n        <input class=\"btn cbi-button cbi-button-save\" type=\"button\" onclick=\"dl_backup()\" value=\"<%:DL Backup%>\" />\n    </div>\n</div>\n\n<div class=\"cbi-value\" id=\"_upload_div\">\n\t<label class=\"cbi-value-title\"><%:Restore Backup File%></label>\n\t<div class=\"cbi-value-field\">\n\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"button\" id=\"upload-btn\" value=\"<%:RST Backup%>\" />\n\t</div>\n</div>\n\n<div class=\"cbi-value\" id=\"_reset_div\">\n    <label class=\"cbi-value-title\"><%:Restore to default configuration%></label>\n    <div class=\"cbi-value-field\">\n        <input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"do_reset()\" value=\"<%:Do Reset%>\" />\n    </div>\n</div>\n\n<div id=\"upload-modal\" class=\"up-modal\" style=\"display:none;\">\n\t<div class=\"up-modal-content\">\n\t\t<h3><%:Restore Backup File%></h3>\n\t\t<div class=\"cbi-value\" id=\"_upload_div\">\n\t\t\t<div class=\"up-cbi-value-field\">\n\t\t\t\t<input class=\"cbi-input-file\" type=\"file\" id=\"ulfile\" name=\"ulfile\" accept=\".tar.gz\" required />\n\t\t\t\t<br />\n\t\t\t\t<div class=\"up-button-container\">\n\t\t\t\t\t<input class=\"btn cbi-button cbi-button-apply\" type=\"submit\" value=\"<%:UL Restore%>\" />\n\t\t\t\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" id=\"upload-close\" value=\"<%:CLOSE WIN%>\" />\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t</div>\n\t</div>\n</div>\n\n<style>\n.up-modal {\n\tposition: fixed;\n\tleft: 50%;\n\ttop: 50%;\n\ttransform: translate(-50%, -50%);\n\tbackground: white;\n\tpadding: 20px;\n\tborder: 2px solid #ccc;\n\tbox-shadow: 0 0 10px rgba(0,0,0,0.5);\n\tz-index: 1000;\n}\n\n.up-modal-content {\n\twidth: 100%;\n\tmax-width: 400px;\n\ttext-align: center;\n\tdisplay: flex;\n\tflex-direction: column;\n\tjustify-content: center;\n\talign-items: center;\n}\n\n.up-button-container {\n\tdisplay: flex;\n\tjustify-content: space-between;\n\twidth: 100%;\n\tmax-width: 250px;\n}\n\n.up-cbi-value-field {\n\tdisplay: flex;\n\tflex-direction: column;\n\talign-items: center;\n\twidth: 100%;\n}\n</style>\n\n<script>\n    // JavaScript 版本的 url 函数\n    function url(...args) {\n        let url = \"/cgi-bin/luci/admin/services/shadowsocksr\";\n        for (let i = 0; i < args.length; i++) {\n            if (args[i] !== \"\") {\n                url += \"/\" + args[i];\n            }\n        }\n        return url;\n    }\n\n    // 上传按钮点击事件\n    document.getElementById(\"upload-btn\").addEventListener(\"click\", function() {\n        document.getElementById(\"upload-modal\").style.display = \"block\";\n    });\n\n    // 关闭上传模态框\n    document.getElementById(\"upload-close\").addEventListener(\"click\", function() {\n        document.getElementById(\"upload-modal\").style.display = \"none\";\n    });\n\n    // 备份下载函数\n    function dl_backup(btn) {\n        fetch(url(\"backup\"), {  // 使用 JavaScript 版本的 url 函数\n            method: 'POST',\n            credentials: 'same-origin'\n        })\n        .then(response => {\n            if (!response.ok) {\n                throw new Error(\"备份失败！\");\n            }\n            const filename = response.headers.get(\"X-Backup-Filename\");\n            if (!filename) {\n                return;\n            }\n            return response.blob().then(blob => ({ blob, filename }));\n        })\n        .then(result => {\n            if (!result) return;\n            const { blob, filename } = result;\n            const url = window.URL.createObjectURL(blob);\n            const a = document.createElement(\"a\");\n            a.href = url;\n            a.download = filename;\n            document.body.appendChild(a);\n            a.click();\n            a.remove();\n            window.URL.revokeObjectURL(url);\n        })\n        .catch(error => alert(error.message));\n    }\n\n    // 恢复出厂设置\n    function do_reset(btn) {\n        if (confirm(\"<%: Do you want to restore the client to default settings?%>\")) {\n            setTimeout(function () {\n                if (confirm(\"<%: Are you sure you want to restore the client to default settings?%>\")) {\n                    // 清理日志\n                    var xhr1 = new XMLHttpRequest();\n                    xhr1.open(\"GET\", url(\"clear_log\"), true);  // 使用 JavaScript 版本的 url 函数\n                    xhr1.send();\n                    // 恢复出厂\n                    var xhr2 = new XMLHttpRequest();\n                    xhr2.open(\"GET\", url(\"reset\"), true);  // 使用 JavaScript 版本的 url 函数\n                    xhr2.send();\n                    // 处理响应\n                    xhr2.onload = function() {\n                        if (xhr2.status === 200) {\n                            window.location.href = url(\"reset\");\n                        }\n                    };\n                }\n            }, 1000);\n        }\n    }\n</script>\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/view/shadowsocksr/certupload.htm",
    "content": "<%+cbi/valueheader%>\n\t<input class=\"cbi-input-file\" style=\"width: 400px\" type=\"file\" id=\"ulfile\" name=\"ulfile\" />\n\t<input type=\"submit\" class=\"cbi-button cbi-input-apply\" name=\"upload\" value=\"<%:Upload%>\" />\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm",
    "content": "<%+cbi/valueheader%>\n<script type=\"text/javascript\">//<![CDATA[\n\tfunction check_connect(btn,urlname)\n\t{\n\t\tbtn.disabled = true;\n\t\tbtn.value    = '<%:Check...%>';\n\t\tmurl=urlname;\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"services\", \"shadowsocksr\",\"check\")%>',\n\t\t\t{ set:murl },\n\t\t\tfunction(x,rv)\n\t\t\t{\n\t\t\tvar s = document.getElementById(urlname+'-status');\n\t\t\tif (s)\n\t\t\t{\n\t\t\t\tif (rv.ret==\"0\")\n\t\t\t\ts.innerHTML =\"<font style=\\'color:green\\'>\"+\"<%:Connect OK%>\"+\"</font>\";\n\t\t\t\telse\n\t\t\t\ts.innerHTML =\"<font style=\\'color:red\\'>\"+\"<%:Connect Error%>\"+\"</font>\";\n\t\t\t}\n\t\t\t\tbtn.disabled = false;\n\t\t\t\tbtn.value    = '<%:Check Connect%>';\n\t\t\t}\n\t\t);\n\t\treturn false;\n\t}\n//]]></script>\n<input type=\"button\" class=\"btn cbi-button cbi-button-apply\" value=\"<%:Check Connect%>\" onclick=\"return check_connect(this,'<%=self.option%>')\" />\n<span id=\"<%=self.option%>-status\"><em><%=self.value%></em></span>\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/view/shadowsocksr/checkport.htm",
    "content": "<%+cbi/valueheader%>\n<script type=\"text/javascript\">//<![CDATA[\n\tfunction check_port(btn)\n\t{\n\t\tbtn.disabled = true;\n\t\tbtn.value    = '<%:Check...%>';\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"services\", \"shadowsocksr\",\"checkport\")%>',\n\t\t\tnull,\n\t\t\tfunction(x,rv)\n\t\t\t{\n\t\t\tvar s = document.getElementById('<%=self.option%>-status');\n\t\t\tif (s)\n\t\t\t{\n\t\t\t\ts.innerHTML =rv.ret;\n\t\t\t}\n\t\t\t\tbtn.disabled = false;\n\t\t\t\tbtn.value    = '<%:Check Server%>';\n\t\t\t}\n\t\t);\n\t\treturn false;\n\t}\n//]]></script>\n<input type=\"button\" class=\"btn cbi-button cbi-button-apply\" value=\"<%:Check Server%>\" onclick=\"return check_port(this)\" />\n<span id=\"<%=self.option%>-status\"><em><%=self.value%></em></span>\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/view/shadowsocksr/log.htm",
    "content": "<%\nlocal dsp = require \"luci.dispatcher\"\n-%>\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tfunction clearlog(btn) {\n\t\tXHR.get('<%=dsp.build_url(\"admin/services/shadowsocksr/clear_log\")%>', null,\n\t\t\tfunction(x, data) {\n\t\t\t\tif (x && x.status == 200) {\n\t\t\t\t\tvar log_textarea = document.getElementById('log_textarea');\n\t\t\t\t\tlog_textarea.innerHTML = \"\";\n\t\t\t\t\tlog_textarea.scrollTop = log_textarea.scrollHeight;\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t}\n\n\tXHR.poll(5, '<%=dsp.build_url(\"admin/services/shadowsocksr/get_log\")%>', null,\n\t\tfunction(x, data) {\n\t\t\tif (x && x.status == 200) {\n\t\t\t\tvar log_textarea = document.getElementById('log_textarea');\n\t\t\t\t// 将日志分行处理，移除最后一行空行但保留中间空行\n\t\t\t\tvar logs = x.responseText.split(\"\\n\");\n\t\t\t\tif (logs[logs.length - 1].trim() === \"\") {\n\t\t\t\t\tlogs.pop(); // 删除最后的空行\n\t\t\t\t}\n\t\t\t\tlogs = logs.reverse().join(\"\\n\"); // 倒序排列\n\t\t\t\tlog_textarea.innerHTML = logs;\n\t\t\t}\n\t\t}\n\t);\n\t//]]>\n</script>\n<fieldset class=\"cbi-section\" id=\"_log_fieldset\">\n\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" onclick=\"clearlog()\" value=\"<%:Clear logs%>\" />\n\t<textarea id=\"log_textarea\" class=\"cbi-input-textarea\" style=\"width: 100%;margin-top: 10px;\" data-update=\"change\" rows=\"20\" wrap=\"off\" readonly=\"readonly\"></textarea>\n</fieldset>\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/view/shadowsocksr/optimize_cbi_ui.htm",
    "content": "<script type=\"text/javascript\">\n\tdocument.addEventListener(\"DOMContentLoaded\", function () {\n\t\tsetTimeout(updateElements, 200);\n\t\tfunction updateElements() {\n\t\t\t//修正上移、下移按钮名称\n\t\t\tdocument.querySelectorAll(\"input.btn.cbi-button.cbi-button-up\").forEach(function(btn) {\n\t\t\t\tbtn.value = \"<%:Move up%>\";\n\t\t\t});\n\t\t\tdocument.querySelectorAll(\"input.btn.cbi-button.cbi-button-down\").forEach(function(btn) {\n\t\t\t\tbtn.value = \"<%:Move down%>\";\n\t\t\t});\n\t\t\t//删除控件和说明之间的多余换行\n\t\t\tdocument.querySelectorAll(\"div.cbi-value-description\").forEach(function(descDiv) {\n\t\t\t\tvar prev = descDiv.previousSibling;\n\t\t\t\twhile (prev && prev.nodeType === Node.TEXT_NODE && prev.textContent.trim() === \"\") {\n\t\t\t\t\tprev = prev.previousSibling;\n\t\t\t\t}\n\t\t\t\tif (prev && prev.nodeType === Node.ELEMENT_NODE && prev.tagName === \"BR\") {\n\t\t\t\t\tprev.remove();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\t});\n</script>\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/view/shadowsocksr/ping.htm",
    "content": "<%+cbi/valueheader%>\n<span class=\"pingtime\" hint=\"<%=self:cfgvalue(section)%>\">-- ms</span>\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm",
    "content": "<%+cbi/valueheader%>\n<script type=\"text/javascript\">//<![CDATA[\n\tfunction refresh_data(btn,dataname)\n\t{\n\t\tbtn.disabled = true;\n\t\tbtn.value = '<%:Refresh...%> ';\n\t\tmurl=dataname;\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"services\", \"shadowsocksr\",\"refresh\")%>',\n\t\t\t{ set:murl },\n\t\t\tfunction(x,rv)\n\t\t\t{\n\t\t\tvar s = document.getElementById(dataname+'-status');\n\t\t\tif (s)\n\t\t\t{\n\t\t\t\tswitch (rv.ret)\n\t\t\t\t{\n\t\t\t\t\tcase 0:\n\t\t\t\t\t\ts.innerHTML =\"<font style=\\'color:green\\'>\"+\"<%:Refresh OK!%> \"+\"<%:Total Records:%>\"+rv.retcount+\"</font>\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tcase 1:\n\t\t\t\t\t\ts.innerHTML =\"<font style=\\'color:green\\'>\"+\"<%:No new data!%> \"+\"</font>\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t\tdefault:\n\t\t\t\t\t\ts.innerHTML =\"<font style=\\'color:red\\'>\"+\"<%:Refresh Error!%> \"+\"</font>\";\n\t\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t\t\tbtn.disabled = false;\n\t\t\t\tbtn.value    = '<%:Refresh Data %>';\n\t\t\t}\n\t\t);\n\t\treturn false;\n\t}\n//]]></script>\n<input type=\"button\" class=\"btn cbi-button cbi-button-reload\" value=\"<%:Refresh Data%> \" onclick=\"return refresh_data(this,'<%=self.option%>')\" />\n<span id=\"<%=self.option%>-status\"><em><%=self.value%></em></span>\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm",
    "content": "<%+cbi/valueheader%>\n<script type=\"text/javascript\">//<![CDATA[\n\tfunction reset(btn,dataname) {\n\t\tvar s = document.getElementById(dataname + '-status');\n\t\tvar reset = prompt('<%:Really reset all changes?%><%:Please fill in reset%>',\"\")\n\t\tif (reset == null || reset == \"\") {\n\t\t\treturn false;\n\t\t}\n\t\tif (reset != \"reset\") {\n\t\t\ts.innerHTML = \"<font style=\\'color:red\\'><%:The content entered is incorrect!%></font>\";\n\t\t\treturn false;\n\t\t}\n\t\tbtn.disabled = true;\n\t\tbtn.value    = '<%:Perform reset%>';\n\t\tmurl=dataname;\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"services\", \"shadowsocksr\",\"reset\")%>', { set:murl }, function(x,rv) {\n\t\t\tbtn.value    = '<%:Reset complete%>';\n\t\t\ts.innerHTML = \"<font style=\\'color:green\\'><%:Reset complete%></font>\";\n\t\t});\n\t\treturn false;\n\t}\n//]]></script>\n<input type=\"button\" class=\"btn cbi-button cbi-button-reset\" value=\"<%:Perform reset%> \" onclick=\"return reset(this,'<%=self.option%>')\" />\n<span id=\"<%=self.option%>-status\"></span>\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm",
    "content": "<%#\n Copyright 2018-2019 Lienol <lawlienol@gmail.com>\n Licensed to the public under the Apache License 2.0.\n-%>\n<%\nrequire \"luci.sys\"\nfunction is_js_luci()\n\treturn luci.sys.call('[ -f \"/www/luci-static/resources/uci.js\" ]') == 0\nend\n-%>\n\n<script src=\"<%=resource%>/view/shadowsocksr/Sortable.min.js\"></script>\n\n<style>\ntable th, .table .th {\n\ttext-align: center;\n\tbackground-color: #eeeeee !important;\n\tcolor: #333333 !important;\n\t/*line-height: 3 !important;*/\n\tpadding: 8px 4px !important;\n\tborder: 1px solid #ddd !important;\n\toverflow: hidden;\n\ttext-overflow: ellipsis;\n\twhite-space: nowrap;\n\tvertical-align: middle !important;\n}\n\n/*.cbi-section-table th:last-child {\n\tdisplay: none;\n}*/\n\ntable td, .table .td {\n\ttext-align: center;\n\tvertical-align: middle !important;\n\tposition: relative;\n\tborder: 1px solid #ddd !important;\n}\n\n.cbi-section-table td:nth-child(2),\n.cbi-section-table th:nth-child(2) {\n\twidth: 180px;\n\tmax-width: 180px;\n\tcursor: help;\n}\n\n.cbi-section-table td:nth-child(2) div {\n    overflow: hidden;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n}\n\n.node-wrapper {\n\tdisplay: flex !important;\n\tflex-direction: row !important;\n\tflex-wrap: nowrap !important;\n\talign-items: center !important;\n\tjustify-content: center;\n\tgap: 2px;\n\twidth: 100% !important;\n\tbox-sizing: border-box;\n}\n\n.node-wrapper .cbi-button,\n.node-wrapper input[type=\"button\"],\n.node-wrapper input[type=\"submit\"] {\n\tmargin: 0 !important;\n\tpadding: 0 4px !important;\n\theight: 32px !important;\n\tdisplay: inline-flex !important;\n\talign-items: center !important;\n\tjustify-content: center !important;\n\tline-height: 1 !important;\n\tfont-size: 17px !important;\n\tcursor: pointer;\n\tborder-radius: 4px;\n\twhite-space: nowrap !important;\n\tborder: 1px solid #ccc !important;\n\tflex: 1 1 auto;\n\tmin-width: 0;\n}\n\n.node-wrapper .drag-handle {\n\tflex: 0 0 32px !important; \n\theight: 32px !important;\n\tcursor: grab !important;\n\tdisplay: inline-flex !important;\n\talign-items: center !important;\n\tjustify-content: center !important;\n\tuser-select: none;\n\torder: 100;\n\tbackground: #eee;\n\tborder-radius: 4px;\n\tborder: 1px solid #ccc;\n\tbox-sizing: border-box;\n}\n\n.node-wrapper .drag-handle:active {\n\tcursor: grabbing !important;\n\tbackground: #ddd;\n}\n\n.node-wrapper .drag-handle svg {\n\twidth: 16px;\n\theight: 16px;\n\tfill: #777;\n\ttransition: fill 0.2s;\n}\n\n.node-wrapper .drag-handle:hover svg {\n\tfill: #333;\n}\n\n/* 测试按钮样式 */\n/*.socket-connected {\n\tdisplay: flex;\n\tflex-direction: column;  /* 垂直排列 */\n\talign-items: center;      /* 水平居中 */\n\tgap: 4px;                 /* 按钮与文本间距 */\n}*/\n\n.socket-connected {\n\tflex: 0 0 40px;\n\twhite-space: nowrap;\n\tmin-width: 0;\n}\n\n@media screen and (max-width: 1152px) {\n\ttd[data-title]::after {\n\t\tcontent: none !important;\n\t\tdisplay: none !important;\n\t\tbackground: none !important;\n\t}\n}\n\n@media screen and (max-width: 600px) {\n    .cbi-section-table thead {\n        display: none;\n    }\n\n    .cbi-section-table tbody tr {\n        display: block;\n        margin-bottom: 12px;\n        border: 1px solid #ddd;\n        border-radius: 8px;\n        padding: 8px;\n        background: #fff;\n        box-shadow: 0 2px 4px rgba(0,0,0,0.1);\n    }\n\n    .cbi-section-table tbody tr td {\n        display: inline-block;\n        width: auto !important;\n        border: none !important;\n        padding: 4px 6px !important;\n        font-size: 14px;\n        vertical-align: middle;\n        white-space: nowrap;\n    }\n\n    .cbi-section-table td[data-title]::before {\n        content: attr(data-title) \": \";\n        font-weight: bold;\n        margin-right: 4px;\n        color: #555;\n    }\n\n    /* 手机端完整显示节点名称 */\n    .cbi-section-table td:nth-child(2) div {\n        overflow: visible;\n        white-space: normal;\n        text-overflow: clip;\n        word-break: break-word;\n    }\n\n    .cbi-section-table td.cbi-section-actions {\n        display: block !important;\n        width: 100% !important;\n        margin-top: 8px;\n        border-top: 1px solid #eee !important;\n        padding-top: 8px !important;\n        text-align: left;\n    }\n\n    .node-wrapper {\n        flex-wrap: wrap;\n        justify-content: flex-start;\n        gap: 6px;\n    }\n\n    .node-wrapper .cbi-button {\n        flex: 0 1 auto;\n        min-width: 60px;\n        font-size: 14px;\n        padding: 4px 8px;\n    }\n\n    /* 拖拽手柄在小屏上可隐藏（节省空间） */\n    /*.node-wrapper .drag-handle {\n        display: none !important;\n    }*/\n}\n\n.dragging-row {\n\tbackground-color: rgba(131, 191, 255, 0.4) !important;\n\tbox-shadow: 0 2px 10px rgba(0,0,0,0.1);\n}\n\n#save_order_tip {\n\tdisplay: none;\n\tposition: fixed;\n\ttop: 30%;\n\tleft: 50%;\n\ttransform: translate(-50%, -50%);\n\tbackground: #fff;\n\tpadding: 15px 30px;\n\tborder-radius: 4px;\n\tz-index: 9999;\n\tbox-shadow: 0 2px 10px rgba(0,0,0,0.2);\n\tborder: 1px solid #ccc;\n}\n\n._now_use_bg {\n\tbackground: #5e72e445 !important;\n}\n\n@media (prefers-color-scheme: dark) {\n\t._now_use_bg {\n        background: #4a90e2 !important;\n\t}\n\t.node-wrapper .drag-handle {\n        background: #333;\n        border-color: #555;\n\t}\n\t.node-wrapper .drag-handle svg {\n        fill: #aaa;\n\t}\n}\n\n/* 隐藏 CBI 自带的添加按钮 */\n.cbi-section-actions .cbi-button-add,\n.cbi-section-create .cbi-button-add {\n    display: none !important;\n}\n\n/* 自定义添加按钮样式（与原按钮一致） */\n.cbi-section-create .cbi-button-add-custom {\n    display: inline-block;\n    margin-right: 8px;\n</style>\n\n<% if is_js_luci() then -%>\n<script type=\"text/javascript\">\n\tvar cbi_t = [];\n\tfunction cbi_t_add(section, tab) {\n\t\tvar t = document.getElementById('tab.' + section + '.' + tab);\n\t\tvar c = document.getElementById('container.' + section + '.' + tab);\n\t\tif (t && c) {\n\t\t\tcbi_t[section] = (cbi_t[section] || []);\n\t\t\tcbi_t[section][tab] = { tab: t, container: c, cid: c.id };\n\t\t}\n\t}\n\tfunction cbi_t_switch(section, tab) {\n\t\tif (cbi_t[section] && cbi_t[section][tab]) {\n\t\t\tif (typeof dechecked_all_node === \"function\") {\n\t\t\t\tdechecked_all_node();\n\t\t\t}\n\t\t\tvar o = cbi_t[section][tab];\n\t\t\tvar h = document.getElementById('tab.' + section);\n\t\t\tfor (var tid in cbi_t[section]) {\n\t\t\t\tvar o2 = cbi_t[section][tid];\n\t\t\t\tif (o.tab.id != o2.tab.id) {\n\t\t\t\t\to2.tab.className = o2.tab.className.replace(/cbi-tab/g, \"cbi-tab-disabled\");\n\t\t\t\t\to2.container.style.display = 'none';\n\t\t\t\t} else {\n\t\t\t\t\tif (h) h.value = tab;\n\t\t\t\t\to2.tab.className = o2.tab.className.replace(/cbi-tab-disabled/g, \"cbi-tab\");\n\t\t\t\t\to2.container.style.display = 'block';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\treturn false;\n\t}\n</script>\n<%- else %>\n<script type=\"text/javascript\">\n\t(function(){\n\t\tif (typeof(cbi_t_switch)===\"function\") {\n\t\t\tvar old_switch=cbi_t_switch;\n\t\t\tcbi_t_switch=function(section,tab){\n\t\t\t\tif (typeof dechecked_all_node === \"function\") {\n\t\t\t\t\tdechecked_all_node();\n\t\t\t\t}\n\t\t\t\treturn old_switch(section,tab);\n\t\t\t}\n\t\t}\n\t})();\n</script>\n<%- end %>\n\n<script type=\"text/javascript\">\n\t//<![CDATA[\n\tvar ajaxList = [];\n\t// 存储原始节点顺序\n\tvar originNodeOrder = [];\n\n\tfunction ajaxAbortAll() {\n\t\tif (!window.ajaxList) return;\n\t\twindow.ajaxList.forEach(function(xhr) {\n\t\t\ttry { xhr.abort(); } catch(e) {}\n\t\t});\n\t\twindow.ajaxList = [];\n\t}\n\t\n\t// 获取当前节点顺序\n\tfunction get_node_order() {\n\t\tvar ids = [];\n\t\tvar rows = document.querySelectorAll(\"#cbi-shadowsocksr-servers table tbody tr[id^='cbi-shadowsocksr-']\");\n\t\trows.forEach(function(row) {\n\t\t\tvar sectionName = row.id.replace(\"cbi-shadowsocksr-\", \"\");\n\t\t\tif (sectionName) ids.push(sectionName);\n\t\t});\n\t\treturn ids;\n\t}\n\n\t// 检查顺序是否变化\n\tfunction check_order_change() {\n\t\tvar new_order = get_node_order();\n\t\tvar btn = document.getElementById(\"save_order_btn\");\n\t\tif (btn) {\n\t\t\tvar is_same = (originNodeOrder.length === new_order.length &&\n\t\t\t\t\t\toriginNodeOrder.every((v, i) => v === new_order[i]));\n\t\t\tbtn.style.display = is_same ? \"none\" : \"inline-block\";\n\t\t}\n\t}\n\n\t// 移动函数：向上\n\tfunction moveUp(btn) {\n\t\tvar row = btn.closest(\"tr\");\n\t\tvar prev = row.previousElementSibling;\n\t\tif (prev && prev.matches(\"tr[id]\")) {\n\t\t\trow.parentNode.insertBefore(row, prev);\n\t\t\tcheck_order_change();\n\t\t}\n\t}\n\n\t// 移动函数：向下\n\tfunction moveDown(btn) {\n\t\tvar row = btn.closest(\"tr\");\n\t\tvar next = row.nextElementSibling;\n\t\tif (next && next.matches(\"tr[id]\")) {\n\t\t\trow.parentNode.insertBefore(row, next.nextSibling);\n\t\t\tcheck_order_change();\n\t\t}\n\t}\n\n\t// 移动函数：置顶\n\tfunction moveTop(btn) {\n\t\tvar row = btn.closest(\"tr\");\n\t\tvar first = row.parentNode.querySelector(\"tr[id]\");\n\t\tif (first && first !== row) {\n\t\t\trow.parentNode.insertBefore(row, first);\n\t\t\tcheck_order_change();\n\t\t}\n\t}\n\n\t// 移动函数：置底\n\tfunction moveBottom(btn) {\n\t\tvar row = btn.closest(\"tr\");\n\t\tvar last = row.parentNode.querySelector(\"tr[id]:last-child\");\n\t\tif (last && last !== row) {\n\t\t\trow.parentNode.insertBefore(row, last.nextSibling);\n\t\t\tcheck_order_change();\n\t\t}\n\t}\n\n\t// 添加节点\n\tfunction to_add_node(protocol) {\n\t\tajaxAbortAll();\n\t\twindow.location.href = '<%=luci.dispatcher.build_url(\"admin/services/shadowsocksr/add_node\")%>?redirect=1';\n\t}\n\n\t// 编辑节点\n\tfunction to_edit_node(node_id) {\n\t\tajaxAbortAll();\n\t\twindow.location.href = '<%=luci.dispatcher.build_url(\"admin/services/shadowsocksr/servers\")%>/' + node_id;\n\t}\n\n\t// 删除节点\n\tfunction del_node(node_id) {\n\t\tajaxAbortAll();\n\t\tif (confirm('<%:Are you sure to delete this node?%>')) {\n\t\t\twindow.location.href = '<%=luci.dispatcher.build_url(\"admin/services/shadowsocksr/remove_node\")%>?id=' + encodeURIComponent(node_id);\n\t\t}\n\t}\n\n\t// 获取当前使用的节点（后端API）\n\tfunction get_now_use_node() {\n\t\tvar xhr = new XMLHttpRequest();\n\t\tajaxList.push(xhr);\n\t\txhr.open(\"GET\", '<%=luci.dispatcher.build_url(\"admin/services/shadowsocksr/get_now_use_node\")%>', true);\n\t\txhr.timeout = 3000;\n\t\txhr.onreadystatechange = function() {\n\t\t\tif (xhr.readyState == 4) {\n\t\t\t\tvar index = ajaxList.indexOf(xhr);\n\t\t\t\tif (index !== -1) ajaxList.splice(index, 1);\n\t\t\t\tif (xhr.status == 200) {\n\t\t\t\t\ttry {\n\t\t\t\t\t\tvar result = JSON.parse(xhr.responseText);\n\t\t\t\t\t\tif (result) {\n\t\t\t\t\t\t\tapply_node_highlight(result);\n\t\t\t\t\t\t}\n\t\t\t\t\t} catch(e) {}\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\txhr.ontimeout = function() {\n\t\t\t// 超时也需移除\n\t\t\tvar index = ajaxList.indexOf(xhr);\n\t\t\tif (index !== -1) ajaxList.splice(index, 1);\n\t\t};\n\t\txhr.send();\n\t}\n\t\n\t// 应用节点高亮\n\tfunction apply_node_highlight(result) {\n\t\tif (!result) return;\n\t    \n\t\t// 1. 清除旧痕迹\n\t\tvar allRows = document.querySelectorAll('tr[id^=\"cbi-shadowsocksr-\"]');\n\t\tallRows.forEach(function(row) {\n\t\t\trow.classList.remove('_now_use_bg');\n\t\t\trow.style.removeProperty('background-color');\n\t        \n\t\t\tvar td = row.querySelector(\"td:first-child\");\n\t\t\tif (td) {\n\t\t\t\ttd.style.removeProperty('color');\n\t\t\t\ttd.style.removeProperty('font-weight');\n\t\t\t}\n\t\t});\n\n\t\t// 2. 精准点亮\n\t\tvar types = [\"TCP\", \"UDP\", \"netflix\", \"socks5\"];\n\t\ttypes.forEach(function(type) {\n\t\t\tvar node_id = result[type]; \n\t\t\tif (node_id) {\n\t\t\t\tvar target = document.getElementById(\"cbi-shadowsocksr-\" + node_id);\n\t\t\t\tif (target) {\n\t\t\t\t\ttarget.classList.add('_now_use_bg');\n\t\t\t\t\ttarget.style.setProperty('background-color', '#5e72e430', 'important');\n\t                \n\t\t\t\t\tvar td = target.querySelector(\"td:first-child\");\n\t\t\t\t\tif (td) {\n\t\t\t\t\t\ttd.style.setProperty('color', 'red', 'important');\n\t\t\t\t\t\ttd.style.setProperty('font-weight', 'bold', 'important');\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t});\n\t}\n\n\t// 保存节点顺序\n\tfunction save_node_order() {\n\t\tvar ids = get_node_order();\n\t\tvar btn = document.getElementById(\"save_order_btn\");\n\t\tif(btn) btn.disabled = true;\n\t\tdocument.getElementById(\"save_order_tip\").style.display = \"block\";\n\t\t\n\t\tvar xhr = new XMLHttpRequest();\n\t\tajaxList.push(xhr);\n\t\txhr.open(\"POST\", '<%=luci.dispatcher.build_url(\"admin/services/shadowsocksr/save_node_order\")%>', true);\n\t\txhr.setRequestHeader(\"Content-Type\", \"application/x-www-form-urlencoded\");\n\t\txhr.onreadystatechange = function() {\n\t\t\tif (xhr.readyState == 4) {\n\t\t\t\tvar index = ajaxList.indexOf(xhr);\n\t\t\t\tif (index !== -1) ajaxList.splice(index, 1);\n\t\t\t\tdocument.getElementById(\"save_order_tip\").style.display = \"none\";\n\t\t\t\tif(btn) btn.disabled = false;\n\t\t\t\tif (xhr.status == 200) {\n\t\t\t\t\toriginNodeOrder = get_node_order();\n\t\t\t\t\tif(btn) btn.style.display = \"none\";\n\t\t\t\t\tget_now_use_node();\n\t\t\t\t\talert(\"<%:Saved current page order successfully.%>\");\n\t\t\t\t} else {\n\t\t\t\t\talert(\"<%:Save failed!%>\");\n\t\t\t\t}\n\t\t\t}\n\t\t};\n\t\txhr.send(\"ids=\" + encodeURIComponent(ids.join(\",\")));\n\t}\n\n\t// 初始化拖拽排序\n\tfunction initSortable() {\n\t\tvar tableBody = document.querySelector(\"#cbi-shadowsocksr-servers table tbody\");\n\t\tif (!tableBody) return;\n\n\t\t// 保存原始顺序\n\t\toriginNodeOrder = get_node_order();\n\n\t\t// 获取按钮模板\n\t\tvar templateHtml = document.getElementById('node-actions-template').innerHTML;\n\n\t\tvar rows = tableBody.querySelectorAll(\"tr[id]\");\n\t\trows.forEach(function(row) {\n\t\t\tvar actionsCell = row.querySelector(\".cbi-section-actions\");\n\t\t\tif (!actionsCell || actionsCell.querySelector(\".node-wrapper\")) return;\n\n\t\t\t// 从行 ID 提取节点 ID\n\t\t\tvar node_id = row.id.replace(\"cbi-shadowsocksr-\", \"\");\n\n\t\t\t// 替换模板中的占位符 {{id}}\n\t\t\tvar wrapperHtml = templateHtml.replace(/{{id}}/g, node_id);\n\n\t\t\t// 清空原内容并插入新按钮组\n\t\t\tactionsCell.innerHTML = wrapperHtml;\n\t\t});\n\n\t\ttableBody.querySelectorAll(\"tr[id]\").forEach(function(row) {\n\t\t\tvar node_id = row.id.replace(\"cbi-shadowsocksr-\", \"\");\n\t\t\t\n\t\t\t// 初始化 Hysteria2 节点操作列按钮\n\t\t\tvar actionsCell = row.querySelector(\".cbi-section-actions\");\n\t\t\tif (actionsCell && !actionsCell.querySelector(\".node-wrapper\")) {\n\t\t\t\tactionsCell.innerHTML = templateHtml.replace(/{{id}}/g, node_id);\n\t\t\t}\n\n\t\t\t// 对 Hysteria2 节点在“连接测试”列插入 Test 按钮\n\t\t\tvar typeEl = row.querySelector('.hy2type');\n\t\t\tvar protoEl = row.querySelector('.hy2proto');\n\t\t\tvar isHy2 = (typeEl && typeEl.getAttribute(\"hint\") === \"hysteria2\") || \n\t\t\t\t\t\t(protoEl && protoEl.getAttribute(\"hint\") === \"hysteria2\");\n\n\t\t\tif (isHy2) {\n\t\t\t\tvar socketCell = row.querySelector('.socket-connected');\n\t\t\t\t// 检查是否已经添加过，避免重复添加\n\t\t\t\tif (socketCell && !row.querySelector('.socket-manual')) {\n\t\t\t\t\t// 将 <%=section%> 替换为 JS 变量 node_id\n\t\t\t\t\tvar testHtml = '<span class=\"socket-manual\" data-section=\"' + node_id + '\">' +\n\t\t\t\t\t\t'    <input class=\"btn cbi-button cbi-button-apply manual-test-btn\" type=\"button\" ' +\n\t\t\t\t\t\t'           value=\"<%:Test%>\" title=\"<%:TLS handshake test, latency for reference only%>\" ' +\n\t\t\t\t\t\t'           onclick=\"manualTest(this, \\'' + node_id + '\\')\">' +\n\t\t\t\t\t\t'</span>'; \n\n\t\t\t\t\t// 插入到连接测试列\n\t\t\t\t\t// socketCell.insertAdjacentHTML('afterbegin', testHtml);\n\t\t\t\t\t// 替换 wait\n\t\t\t\t\tsocketCell.innerHTML = testHtml; \n\t\t\t\t}\n\t\t\t}\n\t\t});\n\n\t\t// 初始化 Sortable 拖拽\n\t\tif (typeof Sortable !== 'undefined') {\n\t\t\tSortable.create(tableBody, { \n\t\t\t\thandle: \".drag-handle\", \n\t\t\t\tdraggable: \"tr[id]\", \n\t\t\t\tanimation: 150,\n\t\t\t\tghostClass: \"dragging-row\",\n\t\t\t\tonEnd: function(evt) { \n\t\t\t\t\tcheck_order_change();\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\t// 获取当前使用的节点高亮\n\t\tget_now_use_node();\n\t}\n\n\t// 获取 ping 对应的颜色\n\tfunction getPingColor(ping) {\n\t\tif (!ping || ping <= 0) return \"#ff0000\";\n\t\tif (ping < 100) return \"#249400\";\n\t\tif (ping < 200) return \"#ff7700\";\n\t\tif (ping < 300) return \"#ff3300\";\n\t\treturn \"#ff0000\";\n\t}\n\n\tfunction manualTest(btn, section) {\n\t\t// console.log('manualTest called with section:', section);\n\t\t// 禁用按钮\n\t\tbtn.disabled = true;\n\t\tbtn.value = '<%:Testing...%>';\n\n\t\tvar row = btn.closest('tr');\n\t\tif (!row) return;\n\n\t\tvar domain = row.querySelector('.pingtime');\n\t\tvar port = row.querySelector('.socket-connected');\n\t\tvar type = row.querySelector('.hy2type');\n\t\tvar proto = row.querySelector('.hy2proto');\n\n\t\tvar params = {\n\t\t\tindex: section,\n\t\t\tdomain: domain ? domain.getAttribute('hint') : '',\n\t\t\tport: port ? port.getAttribute('hint') : '',\n\t\t\ttype: (type ? type.getAttribute(\"hint\") : \"\") || (proto ? proto.getAttribute(\"hint\") : \"\")\n\t\t};\n\n\t\t// 调试：在浏览器 F12 控制台查看发送的数据\n\t\t// console.log(\"正在测试节点\", section, params);\n\n\t\tvar xhr = XHR.get('<%=luci.dispatcher.build_url(\"admin/services/shadowsocksr/ping\")%>', params,\n\t\t\tfunction(x, result) {\n\t\t\t\t// btn.disabled = false;\n\t\t\t\t// btn.value = '<%:Test%>';\n\t\t\t\tvar idx = ajaxList.indexOf(x);\n\t\t\t\tif (idx !== -1) ajaxList.splice(idx, 1);\n\t\t\t\tif (x && x.status === 200 && result) {\n\t\t\t\t\tif (port) {\n\t\t\t\t\t\tport.style.display = 'inline';\n\t\t\t\t\t\tif (result.socket) {\n\t\t\t\t\t\t\tport.innerHTML = '<font style=\"color:#249400\">ok</font>';\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tport.innerHTML = '<font style=\"color:#ff0000\">fail</font>';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// 更新延迟\n\t\t\t\t\tif (domain && result.ping) {\n\t\t\t\t\t\tvar ping = parseInt(result.ping);\n\t\t\t\t\t\tvar col = getPingColor(ping);\n\t\t\t\t\t\tdomain.innerHTML =\n\t\t\t\t\t\t\t'<font style=\"color:' + col + '\">' + (ping > 0 ? ping : \"--\") + ' ms</font>';\n\t\t\t\t\t}\n\t\t\t\t\t// 隐藏按钮\n\t\t\t\t\tbtn.style.display = 'none';\n\t\t\t\t} else {\n\t\t\t\t\t// 请求失败允许重试\n\t\t\t\t\tbtn.disabled = false;\n\t\t\t\t\tbtn.value = '<%:Test%>';\n\t\t\t\t\tif (port) {\n\t\t\t\t\t\tport.style.display = 'inline';\n\t\t\t\t\t\tport.innerHTML = '<font style=\"color:#ff0000\">fail</font>';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t);\n\t\tif (xhr) ajaxList.push(xhr);\n\t}\n\n\t// 页面加载完成初始化\n\twindow.addEventListener(\"load\", function () {\n\t\t// 批量 Ping 初始化\n\t\tconst doms = document.getElementsByClassName(\"pingtime\");\n\t\tconst ports = document.getElementsByClassName(\"socket-connected\");\n\n\t\tfunction xhr(index) {\n\t\t\treturn new Promise(resolve => {\n\t\t\t\t// 跳过 hysteria2 节点的自动测试\n\t\t\t\tconst type = document.getElementsByClassName(\"hy2type\")[index];\n\t\t\t\tconst proto = document.getElementsByClassName(\"hy2proto\")[index];\n\t\t\t\tif (type && type.getAttribute(\"hint\") === \"hysteria2\" || proto && proto.getAttribute(\"hint\") === \"hysteria2\") {\n\t\t\t\t\tresolve();\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tconst dom = doms[index]; \n\t\t\t\tif (!dom) return resolve();\n\t\t\t\tconst port = ports[index];\n        \n\t\t\t\t// 获取各项属性，增加空值保护\n\t\t\t\tconst transport = document.getElementsByClassName(\"transport\")[index];\n\t\t\t\tconst wsPath = document.getElementsByClassName(\"wsPath\")[index];\n\t\t\t\tconst tls = document.getElementsByClassName(\"tls\")[index];\n\t\t\t\tconst host = document.getElementsByClassName(\"tlshost\")[index];\n\n\t\t\t\tconst params = {\n\t\t\t\t\tindex: index, \n\t\t\t\t\tdomain: dom.getAttribute(\"hint\"), \n\t\t\t\t\tport: port ? port.getAttribute(\"hint\") : \"\",\n\t\t\t\t\ttransport: transport ? transport.getAttribute(\"hint\") : \"\",\n\t\t\t\t\twsPath: wsPath ? wsPath.getAttribute(\"hint\") : \"\", \n\t\t\t\t\ttls: tls ? tls.getAttribute(\"hint\") : \"\",\n\t\t\t\t\thost: host ? host.getAttribute(\"hint\") : \"\",\n\t\t\t\t};\n\n\t\t\t\t// 调试：在浏览器 F12 控制台查看发送的数据\n\t\t\t\t// console.log(\"正在测试节点 \" + index, params);\n\n\t\t\t\tport.innerHTML = '<font style=\\\"color:#0072c3\\\"><%:connect%></font>';\n\t\t\t\tvar xhr = XHR.get('<%=luci.dispatcher.build_url(\"admin/services/shadowsocksr/ping\")%>', params, \n\t\t\t\tfunction (x, result) {\n\t\t\t\t\tvar idx = ajaxList.indexOf(x);\n\t\t\t\t\tif (idx !== -1) ajaxList.splice(idx, 1);\n\t\t\t\t\tif (x && x.status === 200 && result) {\n\t\t\t\t\t\tlet ping = result.ping ? parseInt(result.ping) : 0;\n\t\t\t\t\t\tlet col = getPingColor(ping);\n\t\t\t\t\t\tif (dom) {\n\t\t\t\t\t\t\tdom.innerHTML = '<font style=\"color:' + col + '\">' + (ping > 0 ? ping : \"--\") + ' ms</font>';\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (port) {\n\t\t\t\t\t\t\tport.innerHTML = result.socket ? \n\t\t\t\t\t\t\t\t\t'<font style=\"color:#249400\">ok</font>' : \n\t\t\t\t\t\t\t\t\t'<font style=\"color:#ff0000\">fail</font>';\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tresolve();\n\t\t\t\t});\n\t\t\t\tif (xhr) ajaxList.push(xhr);\n\t\t\t});\n\t\t}\n\t\t\n\t\t// 顺序执行 Ping 测试\n\t\tlet task = -1;\n\t\tfunction worker() { \n\t\t\ttask++; \n\t\t\tif (doms[task]) xhr(task).then(worker); \n\t\t}\n\t\tfor (let i = 0; i < 20; i++) worker();\n\n\t\t// 初始化排序功能\n\t\tinitSortable();\n\n\t\t// 为节点名称列添加 title 属性\n\t\tdocument.querySelectorAll(\"#cbi-shadowsocksr-servers table tbody tr\").forEach(function(row) {\n\t\t\tvar nameCell = row.querySelector(\"td:nth-child(2)\");\n\t\t\tif (nameCell) {\n\t\t\t\tvar fullName = nameCell.innerText.trim();\n\t\t\t\tif (fullName) nameCell.setAttribute(\"title\", fullName);\n\t\t\t}\n\t\t});\n\n\t\t// 绑定保存按钮点击事件\n\t\tvar saveBtn = document.getElementById(\"save_order_btn\");\n\t\tif (saveBtn) {\n\t\t\tsaveBtn.onclick = save_node_order;\n\t\t}\n\t});\n\t//]]>\n</script>\n\n<!-- 按钮模板：包含置顶、上移、下移、置底、编辑、删除、拖拽手柄 -->\n<script type=\"text/template\" id=\"node-actions-template\">\n\t<div class=\"node-wrapper\">\n\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" value=\"<%:To Top%>\" onclick=\"moveTop(this)\" title=\"<%:To Top%>\"/>\n\t\t<input class=\"btn cbi-button cbi-button-up\" type=\"button\" value=\"<%:Move up%>\" onclick=\"moveUp(this)\" title=\"<%:Move up%>\"/>\n\t\t<input class=\"btn cbi-button cbi-button-down\" type=\"button\" value=\"<%:Move down%>\" onclick=\"moveDown(this)\" title=\"<%:Move down%>\"/>\n\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" value=\"<%:To Bottom%>\" onclick=\"moveBottom(this)\" title=\"<%:To Bottom%>\"/>\n\t\t<input class=\"btn cbi-button cbi-button-edit\" type=\"button\" value=\"<%:Edit%>\" onclick=\"to_edit_node('{{id}}')\"/>\n\t\t<input class=\"btn cbi-button cbi-button-remove\" type=\"button\" value=\"<%:Delete%>\" onclick=\"del_node('{{id}}')\"/>\n\t\t<span class=\"drag-handle\" title=\"<%:Drag to reorder%>\">\n\t\t\t<svg viewBox=\"0 0 320 512\" xmlns=\"http://www.w3.org/2000/svg\">\n\t\t\t\t<path d=\"M96 112c0-26.5-21.5-48-48-48S0 85.5 0 112s21.5 48 48 48s48-21.5 48-48zm0 144c0-26.5-21.5-48-48-48S0 229.5 0 256s21.5 48 48 48s48-21.5 48-48zm0 144c0-26.5-21.5-48-48-48S0 373.5 0 400s21.5 48 48 48s48-21.5 48-48zM320 112c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 144c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48zm0 144c0-26.5-21.5-48-48-48s-48 21.5-48 48s21.5 48 48 48s48-21.5 48-48z\"/>\n\t\t\t</svg>\n\t\t</span>\n\t</div>\n</script>\n\n<div id=\"save_order_tip\"><%:Saving the new order...%></div>\n<div class=\"cbi-section-create\" style=\"margin-top: 10px; display: flex; justify-content: space-between; align-items: center;\">\n\t<input class=\"btn cbi-button cbi-button-add-custom\" type=\"button\" value=\"<%:Add%>\" onclick=\"to_add_node()\">\n\t<input class=\"btn cbi-button cbi-button-apply cbi-button-positive\" style=\"display:none\" type=\"button\" id=\"save_order_btn\" value=\"<%:Save Order%>\">\n</div>\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/view/shadowsocksr/socket.htm",
    "content": "<%+cbi/valueheader%>\n<span class=\"socket-connected\" hint=\"<%=self:cfgvalue(section)%>\">wait</span>\n<span class=\"transport\" hint=\"<%=self.transport%>\"></span>\n<span class=\"wsPath\" hint=\"<%=self.ws_path%>\"></span>\n<span class=\"tls\" hint=\"<%=self.tls%>\"></span>\n<span class=\"tlshost\" hint=\"<%=self.tls_host%>\"></span>\n<span class=\"hy2type\" hint=\"<%=self.type%>\"></span>\n<span class=\"hy2proto\" hint=\"<%=self.v2ray_protocol%>\"></span>\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm",
    "content": "<%+cbi/valueheader%>\n<%\nlocal map = self.map\nlocal ss_type = map:get(\"@server_subscribe[0]\", \"ss_type\")\nlocal xray_hy2_type = map:get(\"@server_subscribe[0]\", \"xray_hy2_type\")\nlocal xray_tj_type = map:get(\"@server_subscribe[0]\", \"xray_tj_type\")\n\nlocal has_ss_rust = luci.sys.exec('type -t -p sslocal 2>/dev/null || type -t -p ssserver 2>/dev/null') ~= \"\"\nlocal has_ss_libev = luci.sys.exec('type -t -p ss-redir 2>/dev/null || type -t -p ss-local 2>/dev/null') ~= \"\"\nlocal has_hysteria = luci.sys.exec('type -t -p hysteria 2>/dev/null') ~= \"\"\nlocal has_trojan = luci.sys.exec('type -t -p trojan 2>/dev/null') ~= \"\"\nlocal has_xray = luci.sys.exec('type -t -p xray 2>/dev/null') ~= \"\"\n-%>\n<script type=\"text/javascript\">\n//<![CDATA[\nlet ss_type = \"<%=ss_type%>\"\nlet xray_hy2_type = \"<%=xray_hy2_type%>\"\nlet xray_tj_type = \"<%=xray_tj_type%>\"\nlet has_ss_rust = \"<%=has_ss_rust%>\"\nlet has_ss_libev = \"<%=has_ss_libev%>\"\nlet has_hysteria = \"<%=has_hysteria%>\"\nlet has_trojan = \"<%=has_trojan%>\"\nlet has_xray = \"<%=has_xray%>\"\n\nfunction padright(str, cnt, pad) {\n\treturn str + Array(cnt + 1).join(pad);\n}\n\nfunction b64EncodeUnicode(str) {\n\treturn btoa(encodeURIComponent(str).replace(/%([0-9A-F]{2})/g, function (match, p1) {\n\t\treturn String.fromCharCode('0x' + p1);\n\t}));\n}\n\nfunction b64encutf8safe(str) {\n\treturn b64EncodeUnicode(str).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, '');\n}\n\nfunction b64DecodeUnicode(str) {\n\treturn decodeURIComponent(Array.prototype.map.call(atob(str), function (c) {\n\t\treturn '%' + ('00' + c.charCodeAt(0).toString(16)).slice(-2);\n\t}).join(''));\n}\n\nfunction b64decutf8safe(str) {\n\tvar l;\n\tstr = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\tl = str.length;\n\tl = (4 - l % 4) % 4;\n\tif (l) str = padright(str, l, \"=\");\n\treturn b64DecodeUnicode(str);\n}\n\nfunction b64encsafe(str) {\n\treturn btoa(str).replace(/\\+/g, \"-\").replace(/\\//g, \"_\").replace(/=+$/g, '')\n}\n\nfunction b64decsafe(str) {\n\tvar l;\n\tstr = str.replace(/-/g, \"+\").replace(/_/g, \"/\");\n\tl = str.length;\n\tl = (4 - l % 4) % 4;\n\tif (l) str = padright(str, l, \"=\");\n\treturn atob(str);\n}\n\nfunction dictvalue(d, key) {\n\tvar v = d[key];\n\tif (typeof (v) == 'undefined' || v == '') return '';\n\treturn b64decsafe(v);\n}\n\nfunction export_ssr_url(btn, urlname, sid) {\n\tvar s = document.getElementById(urlname + '-status');\n\tif (!s) return false;\n\tvar v_server = document.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0];\n\tvar v_port = document.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0];\n\tvar v_protocol = document.getElementsByName('cbid.shadowsocksr.' + sid + '.protocol')[0];\n\tvar v_method = document.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method')[0];\n\tvar v_obfs = document.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs')[0];\n\tvar v_password = document.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0];\n\tvar v_obfs_param = document.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs_param')[0];\n\tvar v_protocol_param = document.getElementsByName('cbid.shadowsocksr.' + sid + '.protocol_param')[0];\n\tvar v_alias = document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0];\n\tvar ssr_str = v_server.value + \":\" + v_port.value + \":\" + v_protocol.value + \":\" + v_method.value + \":\" + v_obfs.value + \":\" + b64encsafe(v_password.value) + \"/?obfsparam=\" + b64encsafe(v_obfs_param.value) + \"&protoparam=\" + b64encsafe(v_protocol_param.value) + \"&remarks=\" + b64encutf8safe(v_alias.value);\n\tvar textarea = document.createElement(\"textarea\");\n\ttextarea.textContent = \"ssr://\" + b64encsafe(ssr_str);\n\ttextarea.style.position = \"fixed\";\n\tdocument.body.appendChild(textarea);\n\ttextarea.select();\n\ttry {\n\t\tdocument.execCommand(\"copy\"); // Security exception may be thrown by some browsers.\n\t\ts.innerHTML = \"<font style=\\'color:green\\'><%:Copy SSR to clipboard successfully.%></font>\";\n\t} catch (ex) {\n\t\ts.innerHTML = \"<font style=\\'color:red\\'><%:Unable to copy SSR to clipboard.%></font>\";\n\t} finally {\n\t\tdocument.body.removeChild(textarea);\n\t}\n\treturn false;\n}\n\nfunction import_ssr_url(btn, urlname, sid) {\n\t\tvar s = document.getElementById(urlname + '-status');\n\t\tif (!s) return false;\n\t\tvar ssrurl = prompt(\"<%:Paste sharing link here%>\", \"\");\n\t\tif (ssrurl == null || ssrurl == \"\") {\n\t\t\ts.innerHTML = \"<font style=\\'color:red\\'><%:User cancelled.%></font>\";\n\t\t\treturn false;\n\t\t}\n\t\ts.innerHTML = \"\";\n\t\t//var ssu = ssrurl.match(/ssr:\\/\\/([A-Za-z0-9_-]+)/i);\n\t\tssrurl = ssrurl.replace(/&([a-zA-Z]+);/g, '&').replace(/\\s*#\\s*/, '#').trim();  //一些奇葩的链接用\"&amp;\"当做\"&\"，\"#\"前后带空格\n\t\tvar ssu = ssrurl.split('://');\n\t\t//console.log(ssu.length);\n\t\tvar event = document.createEvent(\"HTMLEvents\");\n\t\tevent.initEvent(\"change\", true, true);\n\t\tswitch (ssu[0]) {\n\t\tcase \"hysteria2\":\n\t\tcase \"hy2\":\n\t\t\ttry {\n\t\t\t\tvar url = new URL(\"http://\" + ssu[1]);\n\t\t\t\tvar params = url.searchParams;\n\t\t\t} catch(e) {\n\t\t\t\talert(e);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// 普通 Hysteria2 导入函数\n\t\t\tfunction importAsNormalHy2() {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = (ssu[0] === \"hy2\") ? \"hysteria2\" : ssu[0];\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);\n\t\t\t\tif (params.get(\"protocol\") && params.get(\"protocol\").trim() !== \"\") {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_transport')[0].checked = true; // 设置 flag_transport 为 true\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_transport')[0].dispatchEvent(event); // 触发事件\n\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.transport_protocol')[0].value = params.get(\"protocol\") || \"udp\";\n\t\t\t\t}\n\t\t\t\tif (params.get(\"lazy\") === \"1\") { \n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.lazy_mode')[0].checked = true;\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.lazy_mode')[0].dispatchEvent(event);\n\t\t\t\t}\n\t\t\t\tif (params.get(\"sni\") || params.get(\"alpn\")) {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true; // 设置 tls 为 true\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event); // 触发事件\n\t\t\t\t\tif (params.get(\"sni\")) {\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = params.get(\"sni\") || \"\";\n\t\t\t\t\t}\n\t\t\t\t\tif (params.get(\"alpn\") && params.get(\"alpn\").trim() !== \"\") {\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_alpn')[0].value = params.get(\"alpn\") || \"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (params.get(\"pinSHA256\") && params.get(\"pinSHA256\").trim() !== \"\") {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.pinsha256')[0].value = params.get(\"pinSHA256\") || \"\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// Xray Hysteria2 导入函数\n\t\t\tfunction importAsXrayHy2() {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = \"v2ray\"\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].value = (ssu[0] === \"hy2\") ? \"hysteria2\" : ssu[0];\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].dispatchEvent(event);\n\t\t\t\tif (params.get(\"security\") === \"tls\" || params.get(\"sni\") || params.get(\"alpn\") || (params.get(\"pcs\") || params.get(\"vcn\"))) {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true; // 设置 tls 为 true\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event); // 触发事件\n\t\t\t\t\tif (params.get(\"sni\")) {\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = params.get(\"sni\") || \"\";\n\t\t\t\t\t}\n\t\t\t\t\tif (params.get(\"alpn\") && params.get(\"alpn\").trim() !== \"\") {\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_alpn')[0].value = params.get(\"alpn\") || \"\";\n\t\t\t\t\t}\n\t\t\t\t\tif (params.get(\"pcs\") && params.get(\"pcs\").trim() !== \"\") {\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_CertSha')[0].value = params.get(\"pcs\") || \"\";\n\t\t\t\t\t}\n\t\t\t\t\tif (params.get(\"vcn\") && params.get(\"vcn\").trim() !== \"\") {\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_CertByName')[0].value = params.get(\"vcn\") || \"\";\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (params.get(\"fm\") && params.get(\"fm\").trim() !== \"\") {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_finalmask')[0].checked = true; // 设置 enable_finalmask 为 true\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_finalmask')[0].dispatchEvent(event); // 触发事件\n\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.finalmask')[0].value = params.get(\"fm\") || \"\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t// 主逻辑：智能核心选择（支持回退）\n\t\t\tfunction hasCore(core) {\n\t\t\t\tif (core === \"hysteria\") return has_hysteria === \"true\";\n\t\t\t\tif (core === \"xray\") return has_xray === \"true\";\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tlet finalMode = null; // true=Xray, false=普通, null=无核心\n\t\t\tif (xray_hy2_type === \"v2ray\") {\n\t\t\t\tif (hasCore(\"xray\")) finalMode = true;\n\t\t\t\telse if (hasCore(\"hysteria\")) finalMode = false;\n\t\t\t\telse finalMode = null;\n\t\t\t} else if (xray_hy2_type === \"hysteria2\") {\n\t\t\t\tif (hasCore(\"hysteria\")) finalMode = false;\n\t\t\t\telse if (hasCore(\"xray\")) finalMode = true;\n\t\t\t\telse finalMode = null;\n\t\t\t} else {\n\t\t\t\t// auto 或空：Hysteria2 无 type 参数，优先普通 Hysteria2\n\t\t\t\tif (hasCore(\"hysteria\")) finalMode = false;\n\t\t\t\telse if (hasCore(\"xray\")) finalMode = true;\n\t\t\t\telse finalMode = null;\n\t\t\t}\n\t\t\tif (finalMode === null) {\n\t\t\t\ts.innerHTML = \"<font style=\\'color:red\\'><%:No available core (Hysteria2 or Xray) to import this node.%></font>\";\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (finalMode === true) importAsXrayHy2();\n\t\t\telse importAsNormalHy2();\n\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = url.hash ? decodeURIComponent(url.hash.slice(1)) : \"\";\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = url.hostname;\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = url.port || \"443\";\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.hy2_auth')[0].value = decodeURIComponent(url.username);\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.hy2_auth')[0].dispatchEvent(event);\n\n\t\t\tif (params.get(\"mport\")) {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_port_hopping')[0].checked = true; // 设置 flag_port_hopping 为 true\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_port_hopping')[0].dispatchEvent(event); // 触发事件\n\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.port_range')[0].value = params.get(\"mport\") || \"\";\n\t\t\t}\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.uplink_capacity')[0].value =\n\t\t\t\t(params.get(\"upmbps\") && params.get(\"upmbps\").match(/\\d+/)) ? params.get(\"upmbps\").match(/\\d+/)[0] : \"\";\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.downlink_capacity')[0].value =\n\t\t\t\t(params.get(\"downmbps\") && params.get(\"downmbps\").match(/\\d+/)) ? params.get(\"downmbps\").match(/\\d+/)[0] : \"\";\n\t\t\tif (params.get(\"obfs\") && params.get(\"obfs\") !== \"none\") {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_obfs')[0].checked = true; // 设置 flag_obfs 为 true\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.flag_obfs')[0].dispatchEvent(event); // 触发事件\n\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs_type')[0].value = params.get(\"obfs\");\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.salamander')[0].value = params.get(\"obfs-password\") || params.get(\"obfs_password\");\n\t\t\t}\n\t\t\tvar allowInsecureValue = params.get(\"allowInsecure\") || params.get(\"insecure\");\n\t\t\tif (allowInsecureValue === \"1\" || allowInsecureValue === \"true\") {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked = true; // 设置 insecure 为 true\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].dispatchEvent(event); // 触发事件\n\t\t\t}\n\n\t\t\tif (params.get(\"tfo\") === \"1\") {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.fast_open')[0].checked = true; // 设置 fast_open 为 true\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.fast_open')[0].dispatchEvent(event); // 触发事件\n\t\t\t}\n\n\t\t\ts.innerHTML = \"<font style=\\'color:green\\'><%:Import configuration information successfully.%></font>\";\n\t\t\treturn false;\n\t\tcase \"ss\":\n\t\t\tvar url0 = (ssu[1] || \"\");\n\t\t\tvar param = \"\";\n\n\t\t\t// 先分离 #（alias）\n\t\t\tvar hashIndex = url0.indexOf(\"#\");\n\t\t\tif (hashIndex >= 0) {\n\t\t\t\tparam = url0.substring(hashIndex + 1);\n\t\t\t\turl0 = url0.substring(0, hashIndex);\n\t\t\t}\n\n\t\t\t// 再分离 ? 或 /?（参数）\n\t\t\tvar queryIndex = (url0 = url0.replace('/?', '?')).indexOf(\"?\");\n\t\t\tvar query = \"\";\n\t\t\tif (queryIndex >= 0) {\n\t\t\t\tquery = url0.substring(queryIndex + 1);\n\t\t\t\turl0 = url0.substring(0, queryIndex);\n\t\t\t}\n\n\t\t\tvar params = Object.fromEntries(new URLSearchParams(query));\n\n\t\t\tfunction importAsNormalSS() {\n\t\t\t\t// 普通 SS 导入逻辑\n\t\t\t\t// 判断是否 SIP002 格式（即含 @）\n\t\t\t\tif (url0.indexOf(\"@\") !== -1) {\n\t\t\t\t\t// === SIP002 格式 ===\n\t\t\t\t\tvar sipIndex = url0.indexOf(\"@\");\n\t\t\t\t\t// 先 URL 解码 base64 再解码\n\t\t\t\t\tvar userInfoB64 = decodeURIComponent(url0.substring(0, sipIndex));\n\t\t\t\t\t// console.log(\"userInfoB64:\", userInfoB64);\n\t\t\t\t\tvar userInfo = b64decsafe(userInfoB64);\n\t\t\t\t\tif (userInfo && userInfo.indexOf(\":\") !== -1) {\n\t\t\t\t\t\tvar userInfo = userInfo;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvar userInfo = userInfoB64;\n\t\t\t\t\t}\n\t\t\t\t\t// 如果没有冒号，且不是 base64 格式，我们可以尝试补齐它\n\t\t\t\t\tif (userInfo.indexOf(\":\") === -1) {\n\t\t\t\t\t\tuserInfo = \"none:\" + userInfo;\n\t\t\t\t\t}\n\t\t\t\t\t// console.log(\"userInfo after decode:\", userInfo);\n\t\t\t\t\tvar userInfoSplitIndex = userInfo.indexOf(\":\");\n\t\t\t\t\tif(userInfoSplitIndex < 0) {\n\t\t\t\t\t\t// 格式错误\n\t\t\t\t\t\ts.innerHTML = \"<font style='color:red'><%:Userinfo format error.%></font>\";\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t\tvar method = userInfo.substring(0, userInfoSplitIndex);\n\t\t\t\t\t// console.log(\"method:\", method);\n\t\t\t\t\tvar password = userInfo.substring(userInfoSplitIndex + 1);\n\t\t\t\t\t// console.log(\"password:\", password);\n\t\t\t\t\tvar serverPart = url0.substring(sipIndex + 1);\n\t\t\t\t\tvar serverInfo = serverPart.split(\":\");\n\n\t\t\t\t\tvar server = serverInfo[0];\n\t\t\t\t\tvar port = serverInfo[1];\n\n\t\t\t\t\tvar plugin = \"\", pluginOpts = \"\";\n\t\t\t\t\tif (params.plugin) {\n\t\t\t\t\t\tvar pluginParams = decodeURIComponent(params.plugin).split(\";\");\n\t\t\t\t\t\tplugin = pluginParams.shift();\n\t\t\t\t\t\tpluginOpts = pluginParams.join(\";\");\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\t// === Base64 SS2022 / 普通格式 的整体编码格式 ===\n\t\t\t\t\t// 先 URL 解码整个字符串\n\t\t\t\t\tvar decodedUrl0 = decodeURIComponent(url0);\n\t\t\t\t\tvar sstr = b64decsafe(decodedUrl0);\n\t\t\t\t\tif (!sstr) {\n\t\t\t\t\t\ts.innerHTML = \"<font style='color:red'><%:Base64 sstr failed.%></font>\";\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\t// 支持 SS2022 / 普通格式\n\t\t\t\t\tvar regex2022 = /^([^:]+):([^:]+):([^@]+)@([^:]+):(\\d+)$/;\n\t\t\t\t\tvar regexNormal = /^([^:]+):([^@]+)@([^:]+):(\\d+)$/;\n\n\t\t\t\t\tvar m2022 = sstr.match(regex2022);\n\t\t\t\t\tvar mNormal = sstr.match(regexNormal);\n\n\t\t\t\t\tif (m2022) {\n\t\t\t\t\t\tvar method = m2022[1];\n\t\t\t\t\t\tvar password = m2022[2] + \":\" + m2022[3];\n\t\t\t\t\t\tvar server = m2022[4];\n\t\t\t\t\t\tvar port = m2022[5];\n\t\t\t\t\t} else if (mNormal) {\n\t\t\t\t\t\tvar method = mNormal[1];\n\t\t\t\t\t\tvar password = mNormal[2];\n\t\t\t\t\t\tvar server = mNormal[3];\n\t\t\t\t\t\tvar port = mNormal[4];\n\t\t\t\t\t} else {\n\t\t\t\t\t\ts.innerHTML = \"<font style='color:red'><%:SS URL base64 sstr format not recognized.%></font>\";\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\n\t\t\t\t\tvar plugin = \"\", pluginOpts = \"\";\n\t\t\t\t\tif (params[\"shadow-tls\"]) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\tvar decoded_tls = JSON.parse(atob(decodeURIComponent(params[\"shadow-tls\"])));\n\t\t\t\t\t\t\tplugin = \"shadow-tls\";\n\t\t\t\t\t\t\tvar versionFlag = \"\";\n\t\t\t\t\t\t\tif (decoded_tls.version && !isNaN(decoded_tls.version)) {\n                \t\t\t\tversionFlag = \"v\" + decoded_tls.version + \"=1;\";\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\tpluginOpts = versionFlag + \"host=\" + (decoded_tls.host || \"\") + \";passwd=\" + (decoded_tls.password || \"\");\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\tconsole.log(\"shadow-tls decode failed:\", e);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t// 判断密码是否经过url编码\n\t\t\t\tconst isURLEncodedPassword = function(pwd) {\n\t\t\t\t\tif (!/%[0-9A-Fa-f]{2}/.test(pwd)) return false;\n\t\t\t\t\ttry {\n\t\t\t\t\t\tconst decoded = decodeURIComponent(pwd.replace(/\\+/g, \"%20\"));\n\t\t\t\t\t\tconst reencoded = encodeURIComponent(decoded);\n\t\t\t\t\t\treturn reencoded === pwd;\n\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\treturn false;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (isURLEncodedPassword(password)) {\n\t\t\t\t\tpassword = decodeURIComponent(password); // 解码URL编码\n\t\t\t\t} else {\n\t\t\t\t\tpassword = password; // 保持原始值\n\t\t\t\t}\n\n\t\t\t\t// === 填充配置项 ===\n\t\t\t\t//var has_ss_type = (ss_type === \"ss-rust\") ? \"ss-rust\" : \"ss-libev\";\n\t\t\t\t// 设置 _ss_core 的值\n\t\t\t\tvar ssCore = (ss_type === \"ss-rust\" || ss_type === \"ss-libev\") \n\t\t\t\t\t\t\t ? ss_type \n\t\t\t\t\t\t\t : (has_ss_rust ? \"ss-rust\" : (has_ss_libev ? \"ss-libev\" : \"ss-libev\"));\n\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = ssu[0];\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);\n\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '._ss_core')[0].value = ssCore;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '._ss_core')[0].dispatchEvent(event);\n\n\t\t\t\t//document.getElementsByName('cbid.shadowsocksr.' + sid + '.has_ss_type')[0].value = has_ss_type;\n\t\t\t\t//document.getElementsByName('cbid.shadowsocksr.' + sid + '.has_ss_type')[0].dispatchEvent(event);\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = server;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = port;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = password || \"\";\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method_ss')[0].value = method;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method_ss')[0].dispatchEvent(event);\n\n\t\t\t\tif (plugin && plugin !== \"none\") {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_plugin')[0].checked = true; // 设置 enable_plugin 为 true\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_plugin')[0].dispatchEvent(event); // 触发事件\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.plugin')[0].value = plugin;\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.plugin')[0].dispatchEvent(event);\n\t\t\t\t\tif (plugin !== undefined) {\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.plugin_opts')[0].value = pluginOpts || \"\";\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_plugin')[0].checked = false;\n\t\t\t\t}\n\n\t\t\t\t//if (params.udp === \"1\") {\n\t\t\t\t//\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.uot')[0].checked = true; // 设置 uot 为 true\n\t\t\t\t//\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.uot')[0].dispatchEvent(event); // 触发事件\n\t\t\t\t//}\n\n\t\t\t\tif (params.tfo === \"1\") {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.fast_open')[0].checked = true; // 设置 fast_open 为 true\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.fast_open')[0].dispatchEvent(event); // 触发事件\n\t\t\t\t}\n\n\t\t\t\tif (param != undefined) {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = decodeURIComponent(param);\n\t\t\t\t}\n\t\t\t\ts.innerHTML = \"<font style=\\'color:green\\'><%:Import configuration information successfully.%></font>\";\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\tfunction importAsXraySS() {\t\t\t\n\t\t\t\ttry {\n\t\t\t\t\t// Xray SS 导入逻辑\n\t\t\t\t\t// 拆分 @，判断是否是 base64 userinfo 的格式\n\t\t\t\t\tvar parts = url0.split(\"@\");\n\t\t\t\t\tif (parts.length > 1) {\n\t\t\t\t\t\t// @ 前是 base64(method:password)，后面是 server:port?params\n\t\t\t\t\t\tvar userinfo = b64decsafe(parts[0]);\n\t\t\t\t\t\tvar sepIndex = userinfo.indexOf(\":\");\n\t\t\t\t\t\tif (sepIndex > -1) {\n\t\t\t\t\t\t\tmethod = userinfo.slice(0, sepIndex);\n\t\t\t\t\t\t\tpassword = userinfo.slice(sepIndex + 1);  //一些链接用明文uuid做密码\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\t// 已编码的别名\n\t\t\t\t\t// var url = new URL(\"http://\" + url0 + (param ? \"#\" + encodeURIComponent(param) : \"\"));\n\t\t\t\t\t// 未编码的别名\n\t\t\t\t\t// var url = new URL(\"http://\" + url0 + (param ? \"#\" + param : \"\"));\n\t\t\t\t\t// 兼容已编码和未编码的别名\n\t\t\t\t\tvar remarks = param ? decodeURIComponent(param) : \"\";\n\t\t\t\t\tvar encodedremarks = encodeURIComponent(remarks);\n\t\t\t\t\tvar url = new URL(\"http://\" + url0 + (encodedremarks ? \"#\" + encodedremarks : \"\"));\n\n\t\t\t\t} catch(e) {\n\t\t\t\t\talert(e);\n\t\t\t\t\treturn false;\n\t\t\t\t}\n\t\t\t\t// Check if the elements exist before trying to modify them\n\t\t\t\tfunction setElementValue(name, value) {\n\t\t\t\t\tconst element = document.getElementsByName(name)[0];\n\t\t\t\t\tif (element) {\n\t\t\t\t\t\tif (typeof value === 'boolean') {\n\t\t\t\t\t\t\telement.checked = value;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\telement.value = value;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tfunction dispatchEventIfExists(name, event) {\n\t\t\t\t\tconst element = document.getElementsByName(name)[0];\n\t\t\t\t\tif (element) {\n\t\t\t\t\t\telement.dispatchEvent(event);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.alias', url.hash ? decodeURIComponent(url.hash.slice(1)) : \"\");\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.type', \"v2ray\");\n\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.type', event);\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.v2ray_protocol', \"shadowsocks\");\n\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.v2ray_protocol', event);\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.server', url.hostname);\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.server_port', url.port || \"80\");\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.password', password || url.username);\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.transport', \n\t\t\t\t\tparams.type === \"http\" ? \"h2\" : \n\t\t\t\t\t([\"xhttp\", \"splithttp\"].includes(params.type) ? \"xhttp\" :\n\t\t\t\t\t([\"tcp\", \"raw\"].includes(params.type) ? \"raw\" : \n\t\t\t\t\t(params.type || \"raw\")))\n\t\t\t\t);\n\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.transport', event);\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.encrypt_method_ss', method || params.encryption || \"none\");\n\t\t\t\tif (params.udp === \"1\") {\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.uot', true); // 设置 uot 为 true\n\t\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.uot', event); // 触发事件\n\t\t\t\t}\n\t\t\t\tif (params.fm && params.fm.trim() !== \"\") {\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.enable_finalmask', true); // 设置 enable_finalmask 为 true\n\t\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_finalmask', event); // 触发事件\n\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.finalmask', params.fm || \"\");\n\t\t\t\t}\n\t\t\t\tif (params.tfo === \"1\") {\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.fast_open', true); // 设置 fast_open 为 true\n\t\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.fast_open', event); // 触发事件\n\t\t\t\t}\n\t\t\t\tif ([ \"tls\", \"xtls\", \"reality\" ].includes(params.security)) {\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.' + params.security, true);\n\t\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.' + params.security, event);\n\n\t\t\t\t\tif (params.security === \"tls\") {\n\t\t\t\t\t\tif (params.ech && params.ech.trim() !== \"\") {\n\t\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.enable_ech', true); // 设置 enable_ech 为 true\n\t\t\t\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_ech', event); // 触发事件\n\t\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.ech_config', params.ech || \"\");\n\t\t\t\t\t\t}\n\t\t\t\t\t\tvar allowInsecureValue = params.allowInsecure || params.insecure;\n\t\t\t\t\t\tif (allowInsecureValue === \"1\" || allowInsecureValue === \"true\") {\n\t\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.insecure', true); // 设置 insecure 为 true\n\t\t\t\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.insecure', event); // 触发事件\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (params.pcs && params.pcs.trim() !== \"\") {\n\t\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.tls_CertSha', params.pcs);\n\t\t\t\t\t\t}\n\t\t\t\t\t\tif (params.vcn && params.vcn.trim() !== \"\") {\n\t\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.tls_CertByName', params.vcn);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tif (params.security === \"reality\") {\n\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.reality_publickey', params.pbk ? decodeURIComponent(params.pbk) : \"\");\n\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.reality_shortid', params.sid || \"\");\n\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.reality_spiderx', params.spx ? decodeURIComponent(params.spx) : \"\");\n\t\t\t\t\t\tif (params.pqv && params.pqv.trim() !== \"\") {\n\t\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.enable_mldsa65verify', true); // 设置 enable_mldsa65verify 为 true\n\t\t\t\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_mldsa65verify', event); // 触发事件\n\t\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.reality_mldsa65verify', params.pqv || \"\");\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.tls_flow', params.flow || \"none\");\n\t\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.tls_flow', event);\n\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.tls_alpn', params.alpn || \"\");\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.fingerprint', params.fp || \"\");\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.tls_host', params.sni || \"\");\n\t\t\t\t}\n\t\t\t\tswitch (params.type) {\n\t\t\t\tcase \"ws\":\n\t\t\t\t\tif (params.security !== \"tls\") {\n\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.ws_host', params.host ? decodeURIComponent(params.host) : \"\");\n\t\t\t\t\t}\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.ws_path', params.path ? decodeURIComponent(params.path) : \"/\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"httpupgrade\":\n\t\t\t\t\tif (params.security !== \"tls\") {\n\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.httpupgrade_host', params.host ? decodeURIComponent(params.host) : \"\");\n\t\t\t\t\t}\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.httpupgrade_path', params.path ? decodeURIComponent(params.path) : \"/\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"xhttp\":\n\t\t\t\tcase \"splithttp\":\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.xhttp_mode', params.mode || \"auto\");\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.xhttp_host', params.host ? decodeURIComponent(params.host) : \"\");\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.xhttp_path', params.path ? decodeURIComponent(params.path) : \"/\");\n\t\t\t\t\tif (params.extra && params.extra.trim() !== \"\") {\n\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra', true); // 设置 enable_xhttp_extra 为 true\n\t\t\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra', event); // 触发事件\n\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.xhttp_extra', params.extra || \"\");\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"kcp\":\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.kcp_guise', params.headerType || \"none\");\n\t\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.kcp_guise', event); \n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.kcp_domain', params.host || \"\");\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.seed', params.seed || \"\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"http\":\n\t\t\t\t/* this is non-standard, bullshit */\n\t\t\t\tcase \"h2\":\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.h2_host', params.host ? decodeURIComponent(params.host) : \"\");\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.h2_path', params.path ? decodeURIComponent(params.path) : \"\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"quic\":\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.quic_guise', params.headerType || \"none\");\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.quic_security', params.quicSecurity || \"none\");\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.quic_key', params.key || \"\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"grpc\":\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.serviceName', params.serviceName || \"\");\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.grpc_mode', params.mode || \"gun\");\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"tcp\":\n\t\t\t\tcase \"raw\":\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.tcp_guise', params.headerType || \"none\");\n\t\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.tcp_guise', event);\n\t\t\t\t\tif (params.headerType === \"http\") {\n\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.http_host', params.host ? decodeURIComponent(params.host) : \"\");\n\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.http_path', params.path ? decodeURIComponent(params.path) : \"\");\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\ts.innerHTML = \"<font style=\\'color:green\\'><%:Import configuration information successfully.%></font>\";\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// 主逻辑：智能核心选择（支持回退）\n\t\t\tfunction hasSSCore() { return has_ss_rust === \"true\" || has_ss_libev === \"true\"; }\n\t\t\tfunction hasXrayCore() { return has_xray === \"true\"; }\n\t\t\tlet finalSSType = null; // true=Xray, false=普通SS, null=无核心\n\t\t\tif (ss_type === \"v2ray\") {\n\t\t\t\tif (hasXrayCore()) finalSSType = true;\n\t\t\t\telse if (hasSSCore()) finalSSType = false;\n\t\t\t\telse finalSSType = null;\n\t\t\t} else if (ss_type === \"ss-rust\" || ss_type === \"ss-libev\") {\n\t\t\t\tlet userSSCore = (ss_type === \"ss-rust\" && has_ss_rust === \"true\") || (ss_type === \"ss-libev\" && has_ss_libev === \"true\");\n\t\t\t\tif (userSSCore) finalSSType = false;\n\t\t\t\telse {\n\t\t\t\t\tlet otherSSCore = (ss_type === \"ss-rust\" && has_ss_libev === \"true\") || (ss_type === \"ss-libev\" && has_ss_rust === \"true\");\n\t\t\t\t\tif (otherSSCore) finalSSType = false;\n\t\t\t\t\telse if (hasXrayCore()) finalSSType = true;\n\t\t\t\t\telse finalSSType = null;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// auto 或空：根据 type 参数决定\n\t\t\t\tlet hasType = params.type && params.type !== \"\";\n\t\t\t\tif (hasType) {\n\t\t\t\t\tif (hasXrayCore()) finalSSType = true;\n\t\t\t\t\telse if (hasSSCore()) finalSSType = false;\n\t\t\t\t\telse finalSSType = null;\n\t\t\t\t} else {\n\t\t\t\t\tif (hasSSCore()) finalSSType = false;\n\t\t\t\t\telse if (hasXrayCore()) finalSSType = true;\n\t\t\t\t\telse finalSSType = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (finalSSType === null) {\n\t\t\t\ts.innerHTML = \"<font style=\\'color:red\\'><%:No available core (Shadowsocks or Xray) to import this node.%></font>\";\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (finalSSType === true) importAsXraySS();\n\t\t\telse importAsNormalSS();\n\t\t\treturn false;\n\t\tcase \"ssr\":\n\t\t\tvar sstr = b64decsafe((ssu[1] || \"\").replace(/#.*/, \"\").trim());\n\t\t\tvar ploc = sstr.indexOf(\"/?\");\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = ssu[0];\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);\n\t\t\tvar url0, param = \"\";\n\t\t\tif (ploc > 0) {\n\t\t\t\turl0 = sstr.substr(0, ploc);\n\t\t\t\tparam = sstr.substr(ploc + 2);\n\t\t\t}\n\t\t\tvar ssm = url0.match(/^(.+):([^:]+):([^:]*):([^:]+):([^:]*):([^:]+)/);\n\t\t\tif (!ssm || ssm.length < 7) return false;\n\t\t\tvar pdict = {};\n\t\t\tif (param.length > 2) {\n\t\t\t\tvar a = param.split('&');\n\t\t\t\tfor (var i = 0; i < a.length; i++) {\n\t\t\t\t\tvar b = a[i].split('=');\n\t\t\t\t\tpdict[decodeURIComponent(b[0])] = decodeURIComponent(b[1] || '');\n\t\t\t\t}\n\t\t\t}\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = ssm[1];\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = ssm[2];\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.protocol')[0].value = ssm[3];\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.encrypt_method')[0].value = ssm[4];\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs')[0].value = ssm[5];\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = b64decsafe(ssm[6]);\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.obfs_param')[0].value = dictvalue(pdict, 'obfsparam');\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.protocol_param')[0].value = dictvalue(pdict, 'protoparam');\n\t\t\tif (pdict.tfo === \"1\") {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.fast_open')[0].checked = true; // 设置 fast_open 为 true\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.fast_open')[0].dispatchEvent(event); // 触发事件\n\t\t\t}\n\t\t\tvar rem = pdict['remarks'];\n\t\t\tif (typeof (rem) != 'undefined' && rem != '' && rem.length > 0) document.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = b64decutf8safe(rem);\n\t\t\ts.innerHTML = \"<font style=\\'color:green\\'><%:Import configuration information successfully.%></font>\";\n\t\t\treturn false;\n\t\tcase \"trojan\":\n\t\t\ttry {\n\t\t\t\tvar url = new URL(\"http://\" + ssu[1]);\n\t\t\t\tvar params = url.searchParams;\n\t\t\t} catch(e) {\n\t\t\t\talert(e);\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\t// 普通 Trojan 导入逻辑\n\t\t\tfunction importAsNormalTrojan() {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = url.hash ? decodeURIComponent(url.hash.slice(1)) : \"\";\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = \"trojan\";\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = url.hostname;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = url.port || \"80\";\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = decodeURIComponent(url.username);\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event);\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = params.get(\"peer\") || params.get(\"sni\");\n\n\t\t\t\tvar allowInsecureValue = params.get(\"allowInsecure\") || params.get(\"allowinsecure\") || params.get(\"insecure\");\n\t\t\t\tif (allowInsecureValue === \"1\" || allowInsecureValue === \"true\") {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked = true; // 设置 insecure 为 true\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].dispatchEvent(event); // 触发事件\n\t\t\t\t}\n\n\t\t\t\tif (params.get(\"tfo\") === \"1\") {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.fast_open')[0].checked = true; // 设置 fast_open 为 true\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.fast_open')[0].dispatchEvent(event); // 触发事件\n\t\t\t\t}\n\n\t\t\t\ts.innerHTML = \"<font style=\\'color:green\\'><%:Import configuration information successfully.%></font>\";\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// Xray Trojan 导入逻辑\n\t\t\tfunction importAsXrayTrojan() {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = url.hash ? decodeURIComponent(url.hash.slice(1)) : \"\";\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = \"v2ray\";\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].value = \"trojan\";\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].dispatchEvent(event);\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = url.hostname;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = url.port || \"80\";\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.password')[0].value = decodeURIComponent(url.username);\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event);\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = params.get(\"sni\");\n\n\t\t\t\tif (params.get(\"ech\") && params.get(\"ech\").trim() !== \"\") {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_ech')[0].checked = true; // 设置 enable_ech 为 true\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_ech')[0].dispatchEvent(event); // 触发事件\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.ech_config')[0].value = params.get(\"ech\") || \"\";\n\t\t\t\t}\n\t\t\t\tif (params.get(\"fm\") && params.get(\"fm\").trim() !== \"\") {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_finalmask')[0].checked = true; // 设置 enable_finalmask 为 true\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_finalmask')[0].dispatchEvent(event); // 触发事件\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.finalmask')[0].value = params.get(\"fm\") || \"\";\n\t\t\t\t}\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].value = \n\t\t\t\t\tparams.get(\"type\") == \"http\" ? \"h2\" : \n\t\t\t\t\t([\"xhttp\", \"splithttp\"].includes(params.get(\"type\")) ? \"xhttp\" : \n\t\t\t\t\t([\"tcp\", \"raw\"].includes(params.get(\"type\")) ? \"raw\" : \n\t\t\t\t\t(params.get(\"type\") || \"raw\")));\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].dispatchEvent(event);\n\t\t\t\tif (params.get(\"security\") === \"tls\") {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_alpn')[0].value = params.get(\"alpn\") || \"\";\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.fingerprint')[0].value = params.get(\"fp\") || \"\";\n\n\t\t\t\t\tvar allowInsecureValue = params.get(\"allowInsecure\") || params.get(\"insecure\");\n\t\t\t\t\tif (allowInsecureValue === \"1\" || allowInsecureValue === \"true\") {\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked = true; // 设置 insecure 为 true\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].dispatchEvent(event); // 触发事件\n\t\t\t\t\t}\n\n\t\t\t\t\tif (params.get(\"pcs\") && params.get(\"pcs\").trim() !== \"\") {\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_CertSha')[0].value = params.get(\"pcs\");\n\t\t\t\t\t}\n\t\t\t\t\tif (params.get(\"vcn\") && params.get(\"vcn\").trim() !== \"\") {\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_CertByName')[0].value = params.get(\"vcn\");\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tswitch (params.get(\"type\")) {\n\t\t\t\tcase \"ws\":\n\t\t\t\t\tif (params.get(\"security\") !== \"tls\") {\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.ws_host')[0].value = params.get(\"host\") ? decodeURIComponent(params.get(\"host\")) : \"\";\n\t\t\t\t\t}\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.ws_path')[0].value = params.get(\"path\") ? decodeURIComponent(params.get(\"path\")) : \"/\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"httpupgrade\":\n\t\t\t\t\tif (params.get(\"security\") !== \"tls\") {\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_host')[0].value = params.get(\"host\") ? decodeURIComponent(params.get(\"host\")) : \"\";\n\t\t\t\t\t}\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_path')[0].value = params.get(\"path\") ? decodeURIComponent(params.get(\"path\")) : \"/\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"xhttp\":\n\t\t\t\tcase \"splithttp\":\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_mode')[0].value = params.get(\"mode\") || \"auto\";\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_host')[0].value = params.get(\"host\") ? decodeURIComponent(params.get(\"host\")) : \"\";\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_path')[0].value = params.get(\"path\") ? decodeURIComponent(params.get(\"path\")) : \"/\";\n\t\t\t\t\tif (params.get(\"extra\") && params.get(\"extra\").trim() !== \"\") {\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].checked = true; // 设置 enable_xhttp_extra 为 true\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].dispatchEvent(event); // 触发事件\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_extra')[0].value = params.get(\"extra\") || \"\";\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"kcp\":\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.kcp_guise')[0].value = params.get(\"headerType\") || \"none\";\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.kcp_guise')[0].dispatchEvent(event); // 触发事件\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.kcp_domain')[0].value = params.get(\"host\") || \"\";\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.seed')[0].value = params.get(\"seed\") || \"\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"http\":\n\t\t\t\t/* this is non-standard, bullshit */\n\t\t\t\tcase \"h2\":\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_host')[0].value = params.get(\"host\") ? decodeURIComponent(params.get(\"host\")) : \"\";\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_path')[0].value = params.get(\"path\") ? decodeURIComponent(params.get(\"path\")) : \"\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"quic\":\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_guise')[0].value = params.get(\"headerType\") || \"none\";\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_security')[0].value = params.get(\"quicSecurity\") || \"none\";\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_key')[0].value = params.get(\"key\") || \"\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"grpc\":\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.serviceName')[0].value = params.get(\"serviceName\") || \"\";\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.grpc_mode')[0].value = params.get(\"mode\") || \"gun\";\n\t\t\t\t\tbreak;\n\t\t\t\tcase \"raw\":\n\t\t\t\tcase \"tcp\":\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].value = params.get(\"headerType\") || \"none\";\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].dispatchEvent(event);\n\t\t\t\t\tif (params.get(\"headerType\") === \"http\") {\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.http_host')[0].value = params.get(\"host\") ? decodeURIComponent(params.get(\"host\")) : \"\";\n\t\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.http_path')[0].value = params.get(\"path\") ? decodeURIComponent(params.get(\"path\")) : \"\";\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\n\t\t\t\ts.innerHTML = \"<font style=\\'color:green\\'><%:Import configuration information successfully.%></font>\";\n\t\t\t\treturn true;\n\t\t\t}\n\n\t\t\t// 主逻辑：智能核心选择（支持回退）\n\t\t\tfunction hasTrojanCore() { return has_trojan === \"true\"; }\n\t\t\tfunction hasXrayCore() { return has_xray === \"true\"; }\n\t\t\tlet finalTrojanMode = null;\n\t\t\tif (xray_tj_type === \"v2ray\") {\n\t\t\t\tif (hasXrayCore()) finalTrojanMode = true;\n\t\t\t\telse if (hasTrojanCore()) finalTrojanMode = false;\n\t\t\t\telse finalTrojanMode = null;\n\t\t\t} else if (xray_tj_type === \"trojan\") {\n\t\t\t\tif (hasTrojanCore()) finalTrojanMode = false;\n\t\t\t\telse if (hasXrayCore()) finalTrojanMode = true;\n\t\t\t\telse finalTrojanMode = null;\n\t\t\t} else {\n\t\t\t\tlet hasType = params.get(\"type\") && params.get(\"type\") !== \"\";\n\t\t\t\tif (hasType) {\n\t\t\t\t\tif (hasXrayCore()) finalTrojanMode = true;\n\t\t\t\t\telse if (hasTrojanCore()) finalTrojanMode = false;\n\t\t\t\t\telse finalTrojanMode = null;\n\t\t\t\t} else {\n\t\t\t\t\tif (hasTrojanCore()) finalTrojanMode = false;\n\t\t\t\t\telse if (hasXrayCore()) finalTrojanMode = true;\n\t\t\t\t\telse finalTrojanMode = null;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (finalTrojanMode === null) {\n\t\t\t\ts.innerHTML = \"<font style=\\'color:red\\'><%:No available core (Trojan or Xray) to import this node.%></font>\";\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\tif (finalTrojanMode === true) importAsXrayTrojan();\n\t\t\telse importAsNormalTrojan();\n\t\t\treturn false;\n\t\tcase \"vmess\":\n\t\t\tvar sstr = b64DecodeUnicode((ssu[1] || \"\").replace(/#.*/, \"\").trim());\n\t\t\tvar ploc = sstr.indexOf(\"/?\");\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = \"v2ray\";\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].value = \"vmess\";\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.v2ray_protocol')[0].dispatchEvent(event);\n\t\t\tvar url0, param = \"\";\n\t\t\tif (ploc > 0) {\n\t\t\t\turl0 = sstr.substr(0, ploc);\n\t\t\t\tparam = sstr.substr(ploc + 2);\n\t\t\t}\n\t\t\tvar ssm = JSON.parse(sstr);\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = ssm.ps;\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = ssm.add;\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = ssm.port;\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.alter_id')[0].value = ssm.aid || \"0\";\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.vmess_id')[0].value = ssm.id;\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].value = \n\t\t\t\t([\"xhttp\", \"splithttp\"].includes(ssm.net) ? \"xhttp\" : \n\t\t\t\t([\"tcp\", \"raw\"].includes(ssm.net) ? \"raw\" : \n\t\t\t\t(ssm.net || \"raw\")));\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.transport')[0].dispatchEvent(event);\n\t\t\tif (ssm.net === \"raw\" || ssm.net === \"tcp\") {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].value = ssm.type;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tcp_guise')[0].dispatchEvent(event);\n\t\t\t\tif (ssm.type === \"http\") {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.http_host')[0].value = ssm.host;\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.http_path')[0].value = ssm.path;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ssm.net == \"ws\") {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.ws_host')[0].value = ssm.host;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.ws_path')[0].value = ssm.path;\n\t\t\t}\n\t\t\tif (ssm.net == \"httpupgrade\") {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_host')[0].value = ssm.host;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.httpupgrade_path')[0].value = ssm.path;\n\t\t\t}\n\t\t\tif (ssm.net == \"xhttp\" || ssm.net == \"splithttp\") {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_mode')[0].value = ssm.mode || \"auto\";\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_host')[0].value = ssm.host;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_path')[0].value = ssm.path;\n\t\t\t\tif (ssm.extra !== \"\" && ssm.extra !== undefined) {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].checked = true; // 设置 enable_xhttp_extra 为 true\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra')[0].dispatchEvent(event); // 触发事件\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.xhttp_extra')[0].value = ssm.extra;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ssm.net == \"h2\") {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_host')[0].value = ssm.host;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.h2_path')[0].value = ssm.path;\n\t\t\t}\n\t\t\tif (ssm.net == \"quic\") {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_security')[0].value = ssm.securty;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.quic_key')[0].value = ssm.key;\n\t\t\t}\n\t\t\tif (ssm.net == \"kcp\") {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.kcp_guise')[0].value = ssm.type;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.kcp_guise')[0].dispatchEvent(event);\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.kcp_domain')[0].value = ssm.host || \"\";\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.seed')[0].value = ssm.path || \"\";\n\t\t\t}\n\t\t\tif (ssm.fm !== \"\" && ssm.fm !== undefined) {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_finalmask')[0].checked = true; // 设置 enable_finalmask 为 true\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_finalmask')[0].dispatchEvent(event); // 触发事件\n\t\t\t\tvar fmElem = document.getElementsByName('cbid.shadowsocksr.' + sid + '.finalmask')[0];\n\t\t\t\tif (fmElem) {\n\t\t\t\t\tfmElem.value = decodeURI(ssm.fm);\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ssm.tls == \"tls\" || ssm.tls == \"1\") {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].checked = true;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls')[0].dispatchEvent(event);\n\t\t\t\tif (ssm.fp !== \"\" && ssm.fp !== undefined) {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.fingerprint')[0].value = ssm.fp;\n\t\t\t\t}\n\t\t\t\tif (ssm.alpn !== \"\" && ssm.alpn !== undefined) {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_alpn')[0].value = ssm.alpn;\n\t\t\t\t}\n\t\t\t\tif (ssm.host !== \"\" && ssm.host !== undefined) {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_host')[0].value = ssm.sni || ssm.host;\n\t\t\t\t}\n\t\t\t\tif (ssm.ech !== \"\" && ssm.ech !== undefined) {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_ech')[0].checked = true; // 设置 enable_ech 为 true\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.enable_ech')[0].dispatchEvent(event); // 触发事件\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.ech_config')[0].value = ssm.ech;\n\t\t\t\t}\n\t\t\t\tif (ssm.pcs && ssm.pcs.trim() !== \"\") {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_CertSha')[0].value = ssm.pcs;\n\t\t\t\t}\n\t\t\t\tif (ssm.vcn && ssm.vcn.trim() !== \"\") {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tls_CertByName')[0].value = ssm.vcn;\n\t\t\t\t}\n\t\t\t\tvar allowInsecureValue = ssm.allowInsecure || ssm.allowlnsecure || ssm.insecure || ssm['skip-cert-verify'];\n\t\t\t\tif (allowInsecureValue === \"1\" || allowInsecureValue === \"true\") {\t\t\t\t\t\t\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked = true; // 设置 insecure 为 true\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].dispatchEvent(event); // 触发事件\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (ssm.mux !== undefined) {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.mux')[0].checked = true;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.mux')[0].dispatchEvent(event);\n\t\t\t}\n\t\t\ts.innerHTML = \"<font style=\\'color:green\\'><%:Import configuration information successfully.%></font>\";\n\t\t\treturn false;\n\t\tcase \"vless\":\n\t\t\ttry {\n\t\t\t\tvar url = new URL(\"http://\" + ssu[1]);\n\t\t\t\tvar params = url.searchParams;\n\t\t\t} catch(e) {\n\t\t\t\talert(e);\n\t\t\t\treturn false;\n\t\t\t}\n\t\t\t// Check if the elements exist before trying to modify them\n\t\t\tfunction setElementValue(name, value) {\n\t\t\t\tconst element = document.getElementsByName(name)[0];\n\t\t\t\tif (element) {\n\t\t\t\t\tif (element.type === \"checkbox\" || element.type === \"radio\") {\n\t\t\t\t\t\telement.checked = value === true;\n\t\t\t\t\t} else {\n\t\t\t\t\t\telement.value = value;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tfunction dispatchEventIfExists(name, event) {\n\t\t\t\tconst element = document.getElementsByName(name)[0];\n\t\t\t\tif (element) {\n\t\t\t\t\telement.dispatchEvent(event);\n\t\t\t\t}\n\t\t\t}\n\t\t\tvar server = url.hostname;\n\t\t\t/* 如果带 []，再去掉 [] */\n\t\t\tif (server[0] === \"[\" && server[server.length - 1] === \"]\") {\n\t\t\t\tserver = server.slice(1, -1);\n\t\t\t}\n\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.alias', url.hash ? decodeURIComponent(url.hash.slice(1)) : \"\");\n\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.type', \"v2ray\");\n\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.type', event);\n\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.v2ray_protocol', \"vless\");\n\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.v2ray_protocol', event);\n\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.server', server);\n\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.server_port', url.port || \"80\");\n\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.vmess_id', url.username);\n\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.transport', \n\t\t\t\tparams.get(\"type\") === \"http\" ? \"h2\" : \n\t\t\t\t([\"xhttp\", \"splithttp\"].includes(params.get(\"type\")) ? \"xhttp\" :\n\t\t\t\t([\"tcp\", \"raw\"].includes(params.get(\"type\")) ? \"raw\" : \n\t\t\t\t(params.get(\"type\") || \"raw\")))\n\t\t\t);\n\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.transport', event);\n\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.vless_encryption', params.get(\"encryption\") || \"none\");\n\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.tls_flow', params.get(\"flow\") || \"none\");\n\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.tls_flow', event);\n\t\t\tif (params.get(\"fm\") && params.get(\"fm\").trim() !== \"\") {\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.enable_finalmask', true); // 设置 enable_finalmask 为 true\n\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_finalmask', event); // 触发事件\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.finalmask', params.get(\"fm\") || \"\");\n\t\t\t}\n\t\t\tif ([ \"tls\", \"xtls\", \"reality\" ].includes(params.get(\"security\"))) {\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.' + params.get(\"security\"), true);\n\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.' + params.get(\"security\"), event);\n\n\t\t\t\tvar allowInsecureValue = params.get(\"allowInsecure\") || params.get(\"insecure\");\n\t\t\t\tif (allowInsecureValue === \"1\" || allowInsecureValue === \"true\") {\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.insecure', true); // 设置 insecure 为 true\n\t\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.insecure', event); // 触发事件\n\t\t\t\t}\n\n\t\t\t\tif (params.get(\"security\") === \"tls\") {\n\t\t\t\t\tif (params.get(\"ech\") && params.get(\"ech\").trim() !== \"\") {\n\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.enable_ech', true); // 设置 enable_ech 为 true\n\t\t\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_ech', event); // 触发事件\n\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.ech_config', params.get(\"ech\") || \"\");\n\t\t\t\t\t}\n\t\t\t\t\tif (params.get(\"pcs\") && params.get(\"pcs\").trim() !== \"\") {\n\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.tls_CertSha', params.get(\"pcs\"));\n\t\t\t\t\t}\n\t\t\t\t\tif (params.get(\"vcn\") && params.get(\"vcn\").trim() !== \"\") {\n\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.tls_CertByName', params.get(\"vcn\"));\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (params.get(\"security\") === \"reality\") {\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.reality_publickey', params.get(\"pbk\") ? decodeURIComponent(params.get(\"pbk\")) : \"\");\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.reality_shortid', params.get(\"sid\") || \"\");\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.reality_spiderx', params.get(\"spx\") ? decodeURIComponent(params.get(\"spx\")) : \"\");\n\t\t\t\t\tif (params.get(\"pqv\") && params.get(\"pqv\").trim() !== \"\") {\n\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.enable_mldsa65verify', true); // 设置 enable_mldsa65verify 为 true\n\t\t\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_mldsa65verify', event); // 触发事件\n\t\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.reality_mldsa65verify', params.get(\"pqv\") || \"\");\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.tls_alpn', params.get(\"alpn\") || \"\");\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.fingerprint', params.get(\"fp\") || \"\");\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.tls_host', params.get(\"sni\") || \"\");\n\t\t\t}\n\t\t\tswitch (params.get(\"type\")) {\n\t\t\tcase \"ws\":\n\t\t\t\tif (params.get(\"security\") !== \"tls\") {\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.ws_host', params.get(\"host\") ? decodeURIComponent(params.get(\"host\")) : \"\");\n\t\t\t\t}\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.ws_path', params.get(\"path\") ? decodeURIComponent(params.get(\"path\")) : \"/\");\n\t\t\t\tbreak;\n\t\t\tcase \"httpupgrade\":\n\t\t\t\tif (params.get(\"security\") !== \"tls\") {\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.httpupgrade_host', params.get(\"host\") ? decodeURIComponent(params.get(\"host\")) : \"\");\n\t\t\t\t}\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.httpupgrade_path', params.get(\"path\") ? decodeURIComponent(params.get(\"path\")) : \"/\");\n\t\t\t\tbreak;\n\t\t\tcase \"xhttp\":\n\t\t\tcase \"splithttp\":\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.xhttp_mode', params.get(\"mode\") || \"auto\");\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.xhttp_host', params.get(\"host\") ? decodeURIComponent(params.get(\"host\")) : \"\");\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.xhttp_path', params.get(\"path\") ? decodeURIComponent(params.get(\"path\")) : \"/\");\n\t\t\t\tif (params.get(\"extra\") && params.get(\"extra\").trim() !== \"\") {\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra', true); // 设置 enable_xhttp_extra 为 true\n\t\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.enable_xhttp_extra', event); // 触发事件\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.xhttp_extra', params.get(\"extra\") || \"\");\n\t\t\t\t}\n\t\t\t\tif (params.get(\"tfo\") === \"1\") {\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.fast_open', true); // 设置 fast_open 为 true\n\t\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.fast_open', event); // 触发事件\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase \"kcp\":\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.kcp_guise', params.get(\"headerType\") || \"none\");\n\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.kcp_guise', event); \n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.kcp_domain', params.get(\"host\") || \"\");\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.seed', params.get(\"seed\") || \"\");\n\t\t\t\tbreak;\n\t\t\tcase \"http\":\n\t\t\t/* this is non-standard, bullshit */\n\t\t\tcase \"h2\":\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.h2_host', params.get(\"host\") ? decodeURIComponent(params.get(\"host\")) : \"\");\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.h2_path', params.get(\"path\") ? decodeURIComponent(params.get(\"path\")) : \"\");\n\t\t\t\tbreak;\n\t\t\tcase \"quic\":\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.quic_guise', params.get(\"headerType\") || \"none\");\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.quic_security', params.get(\"quicSecurity\") || \"none\");\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.quic_key', params.get(\"key\") || \"\");\n\t\t\t\tbreak;\n\t\t\tcase \"grpc\":\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.serviceName', params.get(\"serviceName\") || \"\");\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.grpc_mode', params.get(\"mode\") || \"gun\");\n\t\t\t\tbreak;\n\t\t\tcase \"tcp\":\n\t\t\tcase \"raw\":\n\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.tcp_guise', params.get(\"headerType\") || \"none\");\n\t\t\t\tdispatchEventIfExists('cbid.shadowsocksr.' + sid + '.tcp_guise', event);\n\t\t\t\tif (params.get(\"headerType\") === \"http\") {\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.http_host', params.get(\"host\") ? decodeURIComponent(params.get(\"host\")) : \"\");\n\t\t\t\t\tsetElementValue('cbid.shadowsocksr.' + sid + '.http_path', params.get(\"path\") ? decodeURIComponent(params.get(\"path\")) : \"\");\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\ts.innerHTML = \"<font style=\\'color:green\\'><%:Import configuration information successfully.%></font>\";\n\t\t\treturn false;\n\t\tcase \"tuic\":\n\t\t\tvar url0 = (ssu[1] || \"\");\n\t\t\tvar param = \"\";\n\n\t\t\t// 先分离 #（alias）\n\t\t\tvar hashIndex = url0.indexOf(\"#\");\n\t\t\tif (hashIndex >= 0) {\n\t\t\t\tparam = url0.substring(hashIndex + 1);\n\t\t\t\turl0 = url0.substring(0, hashIndex);\n\t\t\t}\n\n\t\t\t// 再分离 ? 或 /?（参数）\n\t\t\tvar queryIndex = (url0 = url0.replace('/?', '?')).indexOf(\"?\");\n\t\t\tvar query = \"\";\n\t\t\tif (queryIndex >= 0) {\n\t\t\t\tquery = url0.substring(queryIndex + 1);\n\t\t\t\turl0 = url0.substring(0, queryIndex);\n\t\t\t}\n\n\t\t\tvar params = Object.fromEntries(new URLSearchParams(query));\n\n\t\t\tvar sipIndex = url0.indexOf(\"@\");\n\t\t\tvar userInfo = decodeURIComponent(url0.substring(0, sipIndex));      //  -- 如有Url编码进行解码，格式：uuid:password\n\t\t\tvar hostPart = url0.substring(sipIndex + 1);     // 格式：hostname:port\n\t\t\tvar userInfoSplitIndex = userInfo.indexOf(\":\");\n\t\t\tif(userInfoSplitIndex < 0) {\n\t\t\t\t// 格式错误\n\t\t\t\ts.innerHTML = \"<font style='color:red'><%:Userinfo format error.%></font>\";\n\t\t\t\tbreak;\n\t\t\t}\n\n\t\t\tvar method = userInfo.substring(0, userInfoSplitIndex);\n\t\t\tvar password = userInfo.substring(userInfoSplitIndex + 1);\n\n\t\t\tvar url = new URL(\"http://\" + hostPart); // 用 URL 提取 host 与 port\n\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].value = ssu[0];\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.type')[0].dispatchEvent(event);\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.server')[0].value = url.hostname;\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.server_port')[0].value = url.port;\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tuic_uuid')[0].value = method;\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tuic_ip')[0].value = params.ip || \"\";\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tuic_passwd')[0].value = password;\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.udp_relay_mode')[0].value = params.udp_relay_mode || \"native\";\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.congestion_control')[0].value = params.congestion_control || \"cubic\";\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tuic_alpn')[0].value = params.alpn || \"\";\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.heartbeat')[0].value = params.heartbeat || \"3\";\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.timeout')[0].value = params.timeout || \"8\";\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.gc_interval')[0].value = params.gc_interval || \"3\";\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.gc_lifetime')[0].value = params.gc_lifetime || \"15\";\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.send_window')[0].value = params.send_window || \"20971520\";\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.receive_window')[0].value = params.receive_window || \"10485760\";\n\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tuic_max_package_size')[0].value = params.max_packet_size || \"1500\";\n\t\t\tif (params[\"disable_sni\"] === \"1\" || params[\"disable_sni\"] === \"true\") { \n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.disable_sni')[0].checked = true;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.disable_sni')[0].dispatchEvent(event);\n\t\t\t}\n\t\t\tif (params[\"zero_rtt_handshake\"] === \"1\" || params[\"zero_rtt_handshake\"] === \"true\") { \n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.zero_rtt_handshake')[0].checked = true;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.zero_rtt_handshake')[0].dispatchEvent(event);\n\t\t\t}\n\t\t\tif (params[\"dual_stack\"] === \"1\" || params[\"dual_stack\"] === \"true\") { \n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tuic_dual_stack')[0].checked = true;\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.tuic_dual_stack')[0].dispatchEvent(event);\n\t\t\t\tif (params.ipstack_prefer && params.ipstack_prefer.trim() !== \"\") {\n\t\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.ipstack_prefer')[0].value = params.ipstack_prefer || \"\";\n\t\t\t\t}\n\t\t\t}\n\n\t\t\tvar allowInsecureValue = params.allowInsecure || params.allowlnsecure || params.insecure;\n\t\t\tif (allowInsecureValue === \"1\" || allowInsecureValue === \"true\") {\t\t\t\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].checked = true; // 设置 insecure 为 true\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.insecure')[0].dispatchEvent(event); // 触发事件\n\t\t\t}\n\n\t\t\tif (param != undefined) {\n\t\t\t\tdocument.getElementsByName('cbid.shadowsocksr.' + sid + '.alias')[0].value = decodeURIComponent(param);\n\t\t\t}\n\t\t\ts.innerHTML = \"<font style=\\'color:green\\'><%:Import configuration information successfully.%></font>\";\n\t\t\treturn false;\n\t\tdefault:\n\t\t\ts.innerHTML = \"<font style=\\'color:red\\'><%:Invalid format.%></font>\";\n\t\t\treturn false;\n\t\t}\n\t}\n\t//]]>\n</script>\n<input type=\"button\" class=\"btn cbi-button cbi-button-apply\" value=\"<%:Import%>\" onclick=\"return import_ssr_url(this, '<%=self.option%>', '<%=self.value%>')\" />\n<span id=\"<%=self.option%>-status\"></span>\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm",
    "content": "<script type=\"text/javascript\">//<![CDATA[\nXHR.poll(3, '<%=url([[admin]], [[services]], [[shadowsocksr]], [[run]])%>', null,\n\tfunction(x, data) {\n\t\tvar tb = document.getElementById('shadowsocksr_status');\n\t\tif (data && tb) {\n\t\t\tif (data.running) {\n\t\t\t\tvar links = '<em><b style=color:green>ShadowsocksR Plus+ <%:RUNNING%></b></em>';\n\t\t\t\ttb.innerHTML = links;\n\t\t\t} else {\n\t\t\t\ttb.innerHTML = '<em><b style=color:red>ShadowsocksR Plus+ <%:NOT RUNNING%></b></em>';\n\t\t\t}\n\t\t}\n\t}\n);\n//]]>\n</script>\n<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>\n<fieldset class=\"cbi-section\">\n\t<p id=\"shadowsocksr_status\">\n\t\t<em><%:Collecting data...%></em>\n\t</p>\n</fieldset>\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm",
    "content": "<%+cbi/valueheader%>\n<script type=\"text/javascript\">//<![CDATA[\n\tfunction subscribe(btn,dataname) {\n\t\tbtn.disabled = true;\n\t\tbtn.value    = '<%:Refresh...%> ';\n\t\tmurl=dataname;\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"services\", \"shadowsocksr\",\"subscribe\")%>', { set:murl }, function(x,rv) {\n\t\t\t// 先简单刷新，后期如果重构会考虑下如何组织lua shell JavaScript之间的代码逻辑和各自的调用逻辑\n\t\t\twindow.location.reload()\n\t\t\t// btn.disabled = false;\n\t\t\t// btn.value    = '<%:Refresh Data %>';\n\t\t});\n\t\treturn false;\n\t}\n//]]></script>\n<input type=\"button\" class=\"btn cbi-button cbi-button-apply\" value=\"<%:Update All Subscribe Servers%> \" onclick=\"return subscribe(this,'<%=self.option%>')\" />\n<!-- <span id=\"<%=self.option%>-status\"><em><%=self.value%></em></span> -->\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/po/templates/ssr-plus.pot",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:361\nmsgid \"\"\n\"\\\"1-3\\\" is for segmentation at TCP layer, applying to the beginning 1 to 3 \"\n\"data writes by the client. \\\"tlshello\\\" is for TLS client hello packet \"\n\"fragmentation.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:279\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:310\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:170\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:198\nmsgid \"%s Node Use Type\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:409\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:227\nmsgid \"%s Node Use Version\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:103\nmsgid \"0\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:100\nmsgid \"1 Thread\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:107\nmsgid \"128 Threads\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1523\nmsgid \"16\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:104\nmsgid \"16 Threads\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:101\nmsgid \"2 Threads\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:105\nmsgid \"32 Threads\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1354\nmsgid \"360\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:270\nmsgid \"360 Security DNS (China Telecom) (101.226.4.6)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:271\nmsgid \"360 Security DNS (China Unicom) (123.125.81.6)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:102\nmsgid \"4 Threads\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:106\nmsgid \"64 Threads\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1510\nmsgid \"8\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:103\nmsgid \"8 Threads\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:390\nmsgid \"<font style='color:red'>\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1031\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1369\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1396\nmsgid \"<font><b>\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:38\nmsgid \"\"\n\"<h3>Support SS/SSR/V2RAY/XRAY/TROJAN/TUIC/HYSTERIA2/NAIVEPROXY/SOCKS5/TUN \"\n\"etc.</h3>\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:160\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:186\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:220\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1203\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1503\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1516\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1529\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1655\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1682\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:188\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:214\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:249\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:240\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:267\nmsgid \"<ul><li>\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:58\nmsgid \"Access Control\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:178\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:206\nmsgid \"AdGuard DNSCrypt SDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:749\nmsgid \"Add\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:59\nmsgid \"Advanced Settings\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:222\nmsgid \"Advertising Data\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1676\nmsgid \"AliDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:268\nmsgid \"AliYun Public DNS (223.5.5.5)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:367\nmsgid \"Alias\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:397\nmsgid \"Alias(optional)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:119\nmsgid \"All Ports\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:39\nmsgid \"Allow all except listed\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:38\nmsgid \"Allow listed only\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:297\nmsgid \"Allow subscribe Insecure nodes By default\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:877\nmsgid \"AlterId\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1271\nmsgid \"An FinalMaskObject in JSON format, used for sharing.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:142\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:173\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:149\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:170\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:201\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:235\nmsgid \"Anti-pollution DNS Server\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:125\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:206\nmsgid \"Anti-pollution DNS Server For Shunt Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:243\nmsgid \"Apple Domains DNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:208\nmsgid \"Apple Domains Data\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:238\nmsgid \"Apple Domains Update url\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:234\nmsgid \"Apple domains optimization\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:399\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:405\nmsgid \"Apply\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:391\nmsgid \"Are you sure to delete this node?\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:133\nmsgid \"Are you sure you want to restore the client to default settings?\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:282\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:313\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1660\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1688\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:172\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:200\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:229\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:246\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:274\nmsgid \"Auto\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:417\nmsgid \"Auto Switch\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:99\nmsgid \"Auto Threads\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:117\nmsgid \"Auto Update\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:119\nmsgid \"Auto Update Server subscription, GFW list and CHN route\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:811\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1569\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1585\nmsgid \"BBR\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1570\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1586\nmsgid \"BRUTAL\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/log.lua:25\nmsgid \"Backup and Restore\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/log.lua:25\nmsgid \"Backup or Restore Client and Server Configurations.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:193\nmsgid \"Baidu Connectivity\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:269\nmsgid \"Baidu Public DNS (180.76.76.76)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:320\nmsgid \"Base64 sstr failed.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1154\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1164\nmsgid \"BitTorrent (uTP)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:100\nmsgid \"Black Domain List\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:536\nmsgid \"Bloom Filter\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:84\nmsgid \"Bypass Domain List\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:31\nmsgid \"CLOSE WIN\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:272\nmsgid \"CNNIC SDNS (1.2.4.8)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:812\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1571\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1589\nmsgid \"CUBIC\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1171\nmsgid \"Camouflage Domain\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:939\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1160\nmsgid \"Camouflage Type\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1479\nmsgid \"Certificate fingerprint\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm:21\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm:27\nmsgid \"Check Connect\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/checkport.htm:17\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/checkport.htm:23\nmsgid \"Check Server\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:228\nmsgid \"Check Server Port\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:77\nmsgid \"Check Try Count\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:72\nmsgid \"Check timout(second)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm:6\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/checkport.htm:6\nmsgid \"Check...\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:202\nmsgid \"China IP Data\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:255\nmsgid \"ChinaDNS-NG query protocol\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:226\nmsgid \"ChinaDNS-NG shunt query protocol\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:89\nmsgid \"Chnroute Update url\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:90\nmsgid \"Clang.CN\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:91\nmsgid \"Clang.CN.CIDR\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/log.htm:35\nmsgid \"Clear logs\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:164\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:192\nmsgid \"Click here to view or manage the DNS list file\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:394\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1033\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1371\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1398\nmsgid \"Click to the page\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:148\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:176\nmsgid \"Cloudflare DNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:136\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:217\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:160\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:246\nmsgid \"Cloudflare DNS (1.1.1.1)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:179\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:207\nmsgid \"Cloudflare DNSCrypt SDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm:20\nmsgid \"Collecting data...\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1031\nmsgid \"Configure XHTTP Extra Settings (JSON format), see:\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:809\nmsgid \"Congestion control algorithm\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm:18\nmsgid \"Connect Error\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm:16\nmsgid \"Connect OK\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:103\nmsgid \"Connection Timeout\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1382\nmsgid \"\"\n\"Controls the policy used when performing DNS queries for ECH configuration.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:93\nmsgid \"Copy SSR to clipboard successfully.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:2\nmsgid \"Create Backup File\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1617\nmsgid \"Create upload file error.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1637\nmsgid \"Current Certificate Path\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:562\nmsgid \"Custom\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:182\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:210\nmsgid \"\"\n\"Custom DNS Server (support: IP:Port or tls://IP:Port or https://IP/dns-query \"\n\"and other format).\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:139\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:221\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:166\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:250\nmsgid \"Custom DNS Server format as IP:PORT (default: 8.8.4.4:53)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:278\nmsgid \"Custom DNS Server format as IP:PORT (default: disabled)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:150\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:178\nmsgid \"\"\n\"Custom DNS Server format as tcp://IP:PORT or tls://DOMAIN:PORT \"\n\"(tcp://8.8.8.8 or tls://dns.google:853)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:566\nmsgid \"Custom Plugin Path\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:121\nmsgid \"Custom Ports\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1272\nmsgid \"\"\n\"Custom finalmask overrides mkcp, hysteria2, fragment, noise, and related \"\n\"settings.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:103\nmsgid \"Customize Netflix IP Url\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:4\nmsgid \"DL Backup\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1168\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1666\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1674\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:251\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:259\nmsgid \"DNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:143\nmsgid \"DNS Anti-pollution\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:106\nmsgid \"DNS Query Mode For Shunt Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1675\nmsgid \"DNSPod\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:267\nmsgid \"DNSPod Public DNS (119.29.29.29)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1156\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1166\nmsgid \"DTLS 1.2\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1218\nmsgid \"Decimal numbers separated by \\\",\\\" or Base64-encoded strings.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1246\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1419\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1431\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1445\nmsgid \"Default\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1530\nmsgid \"Default reject rejects traffic.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:707\nmsgid \"Default value 0 indicatesno heartbeat.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1504\nmsgid \"\"\n\"Default: disable. When entering a negative number, such as -1, The Mux \"\n\"module will not be used to carry TCP traffic.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1517\nmsgid \"\"\n\"Default:16. When entering a negative number, such as -1, The Mux module will \"\n\"not be used to carry UDP traffic, Use original UDP transmission method of \"\n\"proxy protocol.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:184\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:212\nmsgid \"Defines the upstreams logic mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:187\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:215\nmsgid \"\"\n\"Defines the upstreams logic mode, possible values: load_balance, parallel, \"\n\"fastest_addr (default: load_balance).\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:432\nmsgid \"Delay (ms)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:738\nmsgid \"Delete\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:315\nmsgid \"Delete All Subscribe Servers\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:116\nmsgid \"Deny Domain List\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:62\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:70\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:78\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:37\nmsgid \"Disable\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:263\nmsgid \"Disable ChinaDNS-NG\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:152\nmsgid \"Disable IPv6 In MosDNS Query Mode (Shunt Mode)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:180\nmsgid \"Disable IPv6 in MOSDNS query mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:197\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:226\nmsgid \"Disable IPv6 query mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:664\nmsgid \"Disable QUIC path MTU discovery\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:853\nmsgid \"Disable SNI\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:734\nmsgid \"Disable TCP No_delay\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:149\nmsgid \"Dnsproxy Parse List\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:18\nmsgid \"Do Reset\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:131\nmsgid \"Do you want to restore the client to default settings?\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1663\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:249\nmsgid \"DoH\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:230\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:259\nmsgid \"DoT upstream (Need use wolfssl version)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1653\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:238\nmsgid \"Domain DNS Resolve\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:419\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1680\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:265\nmsgid \"Domain Strategy\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:262\nmsgid \"Domestic DNS Server\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1189\nmsgid \"Downlink Capacity(Default:Mbps)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:739\nmsgid \"Drag to reorder\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:864\nmsgid \"Dual-stack Listening Socket\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1367\nmsgid \"ECH Config\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1381\nmsgid \"ECH Query Policy\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:981\nmsgid \"Early Data Header Name\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:737\nmsgid \"Edit\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:259\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:69\nmsgid \"Edit ShadowSocksR Server\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:271\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:408\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:82\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:101\nmsgid \"Enable\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:858\nmsgid \"Enable 0-RTT QUIC handshake\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:482\nmsgid \"Enable Authentication\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:63\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1712\nmsgid \"Enable Auto Switch\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1362\nmsgid \"Enable ECH(optional)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:640\nmsgid \"Enable Lazy Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1389\nmsgid \"Enable ML-DSA-65(optional)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1548\nmsgid \"\"\n\"Enable Multipath TCP, need to be enabled in both server and client \"\n\"configuration.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1484\nmsgid \"Enable Mux.Cool\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:95\nmsgid \"Enable Netflix Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:634\nmsgid \"Enable Obfuscation\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:542\nmsgid \"Enable Plugin\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:602\nmsgid \"Enable Port Hopping\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:84\nmsgid \"Enable Server\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:615\nmsgid \"Enable Transport Protocol Settings\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:720\nmsgid \"Enable V2 protocol.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:719\nmsgid \"Enable V3 protocol.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:249\nmsgid \"Enable adblock\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:531\nmsgid \"Enable the SUoT protocol, requires server support.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1024\nmsgid \"Enable this option to configure XHTTP Extra (JSON format).\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1201\nmsgid \"Enabled Kernel virtual NIC TUN(optional)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:335\nmsgid \"Enabled Mixed\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:729\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1643\nmsgid \"Enabling TCP Fast Open Requires Server Support.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:510\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:517\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:761\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:772\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:903\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:118\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:125\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:122\nmsgid \"Encrypt Method\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:122\nmsgid \"Enter Custom Ports\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:122\nmsgid \"Every Day\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:127\nmsgid \"Every Friday\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:123\nmsgid \"Every Monday\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:128\nmsgid \"Every Saturday\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:129\nmsgid \"Every Sunday\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:126\nmsgid \"Every Thursday\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:124\nmsgid \"Every Tuesday\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:125\nmsgid \"Every Wednesday\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:289\nmsgid \"Expecting: %s\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:86\nmsgid \"External Proxy Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1587\nmsgid \"FORCE BRUTAL\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:282\nmsgid \"Filter Words splited by /\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1260\nmsgid \"FinalMask\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1346\nmsgid \"Finger Print\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1333\nmsgid \"Flow\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:234\nmsgid \"\"\n\"For Apple domains equipped with Chinese mainland CDN, always responsive to \"\n\"Chinese CDN IP addresses\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:392\nmsgid \"For specific usage, see:\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:609\nmsgid \"\"\n\"Format as 10000:20000 or 10000-20000 Multiple groups are separated by commas \"\n\"(,).\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:88\nmsgid \"Forward Netflix Proxy through Main Proxy\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:358\nmsgid \"Fragment\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:375\nmsgid \"Fragment Delay\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:370\nmsgid \"Fragment Length\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:361\nmsgid \"Fragment Packets\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:375\nmsgid \"Fragmentation interval (ms)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:370\nmsgid \"Fragmented packet length (byte)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:197\nmsgid \"GFW List Data\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:112\nmsgid \"GFW List Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:68\nmsgid \"Game Mode Host List\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:134\nmsgid \"Game Mode UDP Relay\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:69\nmsgid \"Game Mode UDP Server\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:829\nmsgid \"Garbage collection interval(second)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:835\nmsgid \"Garbage collection lifetime(second)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:126\nmsgid \"Global Client\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:114\nmsgid \"Global Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:267\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:152\nmsgid \"Global SOCKS5 Proxy Server\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:81\nmsgid \"Global Setting\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:189\nmsgid \"Google Connectivity\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:174\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:202\nmsgid \"Google DNSCrypt SDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:143\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:171\nmsgid \"Google Public DNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:126\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:207\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:150\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:236\nmsgid \"Google Public DNS (8.8.4.4)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:127\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:208\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:151\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:237\nmsgid \"Google Public DNS (8.8.8.8)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/root/usr/share/rpcd/acl.d/luci-app-ssr-plus.json:3\nmsgid \"Grant UCI access for luci-app-ssr-plus\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1095\nmsgid \"Gun\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1114\nmsgid \"H2 Read Idle Timeout\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1109\nmsgid \"H2/gRPC Health Check\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:453\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:942\nmsgid \"HTTP\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:946\nmsgid \"HTTP Host\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:951\nmsgid \"HTTP Path\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1077\nmsgid \"HTTP/2 Host\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1082\nmsgid \"HTTP/2 Path\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1149\nmsgid \"Header\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1126\nmsgid \"Health Check Timeout\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:817\nmsgid \"Heartbeat interval(second)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:968\nmsgid \"HeartbeatPeriod(second)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:990\nmsgid \"Httpupgrade Host\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:995\nmsgid \"Httpupgrade Path\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:284\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:357\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:450\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:84\nmsgid \"Hysteria2\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:658\nmsgid \"Hysterir QUIC parameters\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:113\nmsgid \"IP Route Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1443\nmsgid \"IP Stack Preference\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1691\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:277\nmsgid \"IPv4 Only\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1692\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:278\nmsgid \"IPv6 Only\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:243\nmsgid \"If empty, Not change Apple domains parsing DNS (Default is empty)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1683\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:268\nmsgid \"\"\n\"If is domain name, The requested domain name will be resolved to IP before \"\n\"connect.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1369\nmsgid \"\"\n\"If it is not empty, it indicates that the Client has enabled Encrypted \"\n\"Client, see:\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1656\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:241\nmsgid \"\"\n\"If the node address is a domain name, this DNS will be used for resolution.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:865\nmsgid \"If this option is not set, the socket behavior is platform dependent.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1456\nmsgid \"\"\n\"If true, allowss insecure connection at TLS client, e.g., TLS server uses \"\n\"unverifiable certificates.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1601\nmsgid \"If you have a self-signed certificate,please check the box\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:1193\nmsgid \"Import\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:249\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:425\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:597\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:672\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:706\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:813\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:952\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:1104\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:1184\nmsgid \"Import configuration information successfully.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1102\nmsgid \"Initial Windows Size\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:17\nmsgid \"Interface\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:16\nmsgid \"Interface control\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:1187\nmsgid \"Invalid format.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:172\nmsgid \"KcpTun\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1722\nmsgid \"KcpTun Enable\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1739\nmsgid \"KcpTun Param\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1734\nmsgid \"KcpTun Password\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1728\nmsgid \"KcpTun Port\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:169\nmsgid \"KcpTun Version\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:36\nmsgid \"LAN Access Control\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:52\nmsgid \"LAN Bypassed Host List\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:60\nmsgid \"LAN Force Proxy Host List\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:42\nmsgid \"LAN Host List\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:34\nmsgid \"LAN IP AC\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:130\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:211\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:154\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:240\nmsgid \"Level 3 Public DNS (209.244.0.3)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:131\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:212\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:155\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:241\nmsgid \"Level 3 Public DNS (209.244.0.4)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:132\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:213\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:156\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:242\nmsgid \"Level 3 Public DNS (4.2.2.1)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:133\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:214\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:157\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:243\nmsgid \"Level 3 Public DNS (4.2.2.2)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:134\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:215\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:158\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:244\nmsgid \"Level 3 Public DNS (4.2.2.3)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:135\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:216\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:159\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:245\nmsgid \"Level 3 Public DNS (4.2.2.4)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:145\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:173\nmsgid \"Level 3 Public DNS-1 (209.244.0.3-4)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:146\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:174\nmsgid \"Level 3 Public DNS-2 (4.2.2.1-2)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:147\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:175\nmsgid \"Level 3 Public DNS-3 (4.2.2.3-4)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:380\nmsgid \"Limit the maximum number of splits.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1204\nmsgid \"\"\n\"Linux kernel TUN virtual NIC requires system support and root privileges.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:22\nmsgid \"Listen only on the given interface or, if unspecified, on all\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:348\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1716\nmsgid \"Local Port\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:160\nmsgid \"Local Servers\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1212\nmsgid \"Local addresses\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:66\nmsgid \"Log\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:85\nmsgid \"Loukky/gfwlist-by-loukky\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:84\nmsgid \"Loyalsoldier/v2ray-rules-dat\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1394\nmsgid \"ML-DSA-65 Public key\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1548\nmsgid \"MPTCP\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1175\nmsgid \"MTU\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:61\nmsgid \"Main Server\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:974\nmsgid \"Max Early Data\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:380\nmsgid \"Max Split\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:870\nmsgid \"Maximum packet size the socks5 server can receive from external\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1518\nmsgid \"\"\n\"Min value is 1, Max value is 1024. When omitted or set to 0, Will same path \"\n\"as TCP traffic.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1505\nmsgid \"\"\n\"Min value is 1, Max value is 128. When omitted or set to 0, it equals 8.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:335\nmsgid \"Mixed as an alias of socks, default:Enabled.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/optimize_cbi_ui.htm:10\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:735\nmsgid \"Move down\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/optimize_cbi_ui.htm:7\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:734\nmsgid \"Move up\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:222\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:251\nmsgid \"Muitiple DNS server can saperate with ','\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1096\nmsgid \"Multi\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:98\nmsgid \"Multi Threads Option\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1066\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1290\nmsgid \"Must be JSON text!\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1484\nmsgid \"Mux\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:253\nmsgid \"NEO DEV HOST\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm:10\nmsgid \"NOT RUNNING\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:354\nmsgid \"NaiveProxy\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:266\nmsgid \"Nanjing Xinfeng 114DNS (114.114.114.114)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:132\nmsgid \"Netflix Domain List\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:215\nmsgid \"Netflix IP Data\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:100\nmsgid \"Netflix IP Only\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:77\nmsgid \"Netflix Node\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:101\nmsgid \"Netflix and AWS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:369\nmsgid \"Network Tunnel\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:399\nmsgid \"Network interface to use\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:813\nmsgid \"New Reno\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:190\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:194\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:230\nmsgid \"No Check\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:209\nmsgid \"No available core (Hysteria2 or Xray) to import this node.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:632\nmsgid \"No available core (Shadowsocks or Xray) to import this node.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:842\nmsgid \"No available core (Trojan or Xray) to import this node.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm:21\nmsgid \"No new data!\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1633\nmsgid \"No specify upload file.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:385\nmsgid \"Noise\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:549\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:941\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1140\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1152\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1162\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:364\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:369\nmsgid \"None\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:131\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:139\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:148\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:157\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:165\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:177\nmsgid \"Not Running\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:28\nmsgid \"Not exist\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1657\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1684\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:243\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:270\nmsgid \"Note: For node-specific DNS only. Keep Auto to avoid extra overhead.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/log.lua:27\nmsgid \"\"\n\"Note: Restoring configurations across different versions may cause \"\n\"compatibility issues.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1559\nmsgid \"Number of early established connections to reduce latency.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:548\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:584\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:139\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:133\nmsgid \"Obfs\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:591\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:146\nmsgid \"Obfs param (optional)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1196\nmsgid \"Obfuscate password (optional)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:651\nmsgid \"Obfuscation Password\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:645\nmsgid \"Obfuscation Type\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1468\nmsgid \"Once set, connects only when the server’s chain fingerprint matches.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:120\nmsgid \"Only Common Ports\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:324\nmsgid \"Only when Socks5 Auth Mode is password valid, Mandatory.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:329\nmsgid \"Only when Socks5 Auth Mode is password valid, Not mandatory.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:144\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:172\nmsgid \"OpenDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:129\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:210\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:153\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:239\nmsgid \"OpenDNS (208.67.220.220)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:209\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:152\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:238\nmsgid \"OpenDNS (208.67.222.222)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:115\nmsgid \"Oversea Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:161\nmsgid \"Oversea Mode DNS-1 (114.114.114.114)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:162\nmsgid \"Oversea Mode DNS-2 (114.114.115.115)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:391\nmsgid \"Packet or Rand length as a string, e.g., 10-20.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:428\nmsgid \"Packet | Rand Length\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:496\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:114\nmsgid \"Password\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:105\nmsgid \"Paste sharing link here\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1227\nmsgid \"Peer public key\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm:14\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm:23\nmsgid \"Perform reset\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1132\nmsgid \"Permit Without Stream\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:393\nmsgid \"Ping Latency\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1640\nmsgid \"Please confirm the current certificate path\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm:5\nmsgid \"Please fill in reset\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:570\nmsgid \"Plugin Opts\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:626\nmsgid \"Port Hopping Interval(Unit:Second)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:608\nmsgid \"Port hopping range\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1559\nmsgid \"Pre-connections\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1231\nmsgid \"Pre-shared key\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1689\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:275\nmsgid \"Prefer IPv4\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1690\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:276\nmsgid \"Prefer IPv6\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:93\nmsgid \"Prefer firewall tools\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1222\nmsgid \"Private key\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:574\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:132\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:128\nmsgid \"Protocol\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:581\nmsgid \"Protocol param (optional)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:118\nmsgid \"Proxy Ports\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1320\nmsgid \"Public key\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1145\nmsgid \"QUIC Key\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1138\nmsgid \"QUIC Security\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:685\nmsgid \"QUIC initConnReceiveWindow\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:671\nmsgid \"QUIC initStreamReceiveWindow\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:692\nmsgid \"QUIC maxConnReceiveWindow\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:699\nmsgid \"QUIC maxIdleTimeout(Unit:second)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:678\nmsgid \"QUIC maxStreamReceiveWindow\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:177\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:205\nmsgid \"Quad9 DNSCrypt SDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1315\nmsgid \"REALITY\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:11\nmsgid \"RST Backup\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm:7\nmsgid \"RUNNING\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm:5\nmsgid \"Really reset all changes?\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:403\nmsgid \"Reapply\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:200\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:205\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:211\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:218\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:225\nmsgid \"Records\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:406\nmsgid \"Redirect traffic to this network interface\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm:29\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm:35\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm:11\nmsgid \"Refresh Data\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm:24\nmsgid \"Refresh Error!\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm:18\nmsgid \"Refresh OK!\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm:6\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm:5\nmsgid \"Refresh...\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:134\nmsgid \"Regular update (Hour)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:142\nmsgid \"Regular update (Min)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1572\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1588\nmsgid \"Reno\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1217\nmsgid \"Reserved bytes(optional)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm:17\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm:18\nmsgid \"Reset complete\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:259\nmsgid \"Reset to defaults\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:127\nmsgid \"Resolve Dns Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:182\nmsgid \"Restart Service\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:181\nmsgid \"Restart ShadowSocksR Plus+\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:9\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:24\nmsgid \"Restore Backup File\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:16\nmsgid \"Restore to default configuration\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:129\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:137\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:146\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:155\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:163\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:175\nmsgid \"Running\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:111\nmsgid \"Running Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:342\nmsgid \"SS URL base64 sstr format not recognized.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:56\nmsgid \"SSR Client\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:60\nmsgid \"SSR Server\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:277\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:71\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:79\nmsgid \"Same as Global Server\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:750\nmsgid \"Save Order\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:286\nmsgid \"Save Words splited by /\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:484\nmsgid \"Save failed!\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:482\nmsgid \"Saved current page order successfully.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:747\nmsgid \"Saving the new order...\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:158\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:186\nmsgid \"Select DNS parse Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:410\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:228\nmsgid \"Selection ShadowSocks Node Use Version.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1593\nmsgid \"Self-signed Certificate\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:276\nmsgid \"Server\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:456\nmsgid \"Server Address\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:317\nmsgid \"Server Count\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:340\nmsgid \"Server Node Type\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:469\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:96\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:112\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:372\nmsgid \"Server Port\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:88\nmsgid \"Server Setting\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:86\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:107\nmsgid \"Server Type\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:56\nmsgid \"Server failsafe auto swith and custom update settings\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:57\nmsgid \"Servers Nodes\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:111\nmsgid \"Servers subscription and manage\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1309\nmsgid \"Session Ticket\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:167\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:195\nmsgid \"Set Single DNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:363\nmsgid \"Shadow-TLS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:746\nmsgid \"Shadow-TLS ChainPoxy type\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:348\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:445\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:89\nmsgid \"ShadowSocks\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:415\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:101\nmsgid \"ShadowSocks-libev Version\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:412\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:749\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:98\nmsgid \"ShadowSocks-rust Version\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:53\nmsgid \"ShadowSocksR Plus+\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:38\nmsgid \"ShadowSocksR Plus+ Settings\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:757\nmsgid \"Shadowsocks password\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:345\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:92\nmsgid \"ShadowsocksR\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1324\nmsgid \"Short ID\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:377\nmsgid \"Socket Connected\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:452\nmsgid \"Socks\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:911\nmsgid \"Socks Version\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:310\nmsgid \"Socks protocol auth methods, default:noauth.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:366\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:87\nmsgid \"Socks5\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:310\nmsgid \"Socks5 Auth Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:329\nmsgid \"Socks5 Password\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:324\nmsgid \"Socks5 User\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:151\nmsgid \"Specifically for edit dnsproxy DNS parse files.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:61\nmsgid \"Status\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:302\nmsgid \"Subscribe Default Auto-Switch\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:280\nmsgid \"Subscribe Filter Words\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:284\nmsgid \"Subscribe Save Words\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:235\nmsgid \"Subscribe URL\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:304\nmsgid \"Subscribe new add server default Auto-Switch on\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:299\nmsgid \"Subscribe nodes allows insecure connection as TLS client (insecure)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:257\nmsgid \"Support AdGuardHome and DNSMASQ format list\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:627\nmsgid \"Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:242\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:269\nmsgid \"Supports only Xray node types.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:67\nmsgid \"Switch check cycly(second)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1661\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:247\nmsgid \"TCP\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:729\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1643\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:149\nmsgid \"TCP Fast Open\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:358\nmsgid \"\"\n\"TCP fragments, which can deceive the censorship system in some cases, such \"\n\"as bypassing SNI blacklists.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:257\nmsgid \"TCP upstream\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1295\nmsgid \"TLS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:724\nmsgid \"TLS 1.3 Strict mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1417\nmsgid \"TLS ALPN\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1473\nmsgid \"TLS Certificate Name (CertName)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1468\nmsgid \"TLS Chain Fingerprint (SHA256)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1409\nmsgid \"TLS Host\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:539\nmsgid \"TLS handshake test, latency for reference only\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1473\nmsgid \"TLS is used to verify the leaf certificate name.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:360\nmsgid \"TUIC\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1429\nmsgid \"TUIC ALPN\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:789\nmsgid \"TUIC Server IP Address\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:796\nmsgid \"TUIC User Password\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:782\nmsgid \"TUIC User UUID\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:847\nmsgid \"TUIC receive window\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:841\nmsgid \"TUIC send window\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:175\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:203\nmsgid \"TWNIC-101 DNSCrypt SDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:539\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:604\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:628\nmsgid \"Test\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:581\nmsgid \"Testing...\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1396\nmsgid \"\"\n\"The client has not configured mldsa65Verify, but it will not perform the \"\n\"\\\"additional verification\\\" step and can still connect normally, see:\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:280\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:311\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:171\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:199\nmsgid \"\"\n\"The configured type also applies to the core specified when manually \"\n\"importing nodes.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm:10\nmsgid \"The content entered is incorrect!\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:706\nmsgid \"The keep-alive period.(Unit:second)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:307\nmsgid \"Through proxy update\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:309\nmsgid \"Through proxy update list, Not Recommended\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:823\nmsgid \"Timeout for establishing a connection to server(second)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:162\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:190\nmsgid \"Tips: Dnsproxy DNS Parse List Path:\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:736\nmsgid \"To Bottom\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:733\nmsgid \"To Top\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:390\nmsgid \"To send noise packets, select \\\"Noise\\\" in Xray Settings.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm:18\nmsgid \"Total Records:\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:920\nmsgid \"Transport\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:620\nmsgid \"Transport Protocol\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:315\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:351\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:444\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:91\nmsgid \"Trojan\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:412\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:362\nmsgid \"Type\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:622\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1662\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:248\nmsgid \"UDP\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:385\nmsgid \"\"\n\"UDP noise, Under some circumstances it can bypass some UDP based protocol \"\n\"restrictions.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:530\nmsgid \"UDP over TCP\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:802\nmsgid \"UDP relay mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:229\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:258\nmsgid \"UDP upstream\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:227\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:256\nmsgid \"UDP/TCP upstream\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:30\nmsgid \"UL Restore\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:322\nmsgid \"URL Test Address\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:95\nmsgid \"Unable to copy SSR to clipboard.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:25\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:35\nmsgid \"Unknown\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:311\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm:16\nmsgid \"Update All Subscribe Servers\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:288\nmsgid \"Update Subscribe List\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:121\nmsgid \"Update cycle (Day/Week)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:290\nmsgid \"Update subscribe url list first\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1182\nmsgid \"Uplink Capacity(Default:Mbps)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1603\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/certupload.htm:3\nmsgid \"Upload\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:120\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:144\nmsgid \"Use ChinaDNS-NG query and cache\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:168\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:196\nmsgid \"Use DNS List File\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:264\nmsgid \"Use DNS from WAN\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:265\nmsgid \"Use DNS from WAN and 114DNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:108\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:132\nmsgid \"Use DNS2SOCKS query and cache\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:111\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:135\nmsgid \"Use DNS2SOCKS-RUST query and cache\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:129\nmsgid \"Use DNS2TCP query\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:117\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:141\nmsgid \"Use DNSPROXY query and cache\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:146\nmsgid \"Use Local DNS Service listen port 5335\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:138\nmsgid \"Use MOSDNS query (Not Support Oversea Mode)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:114\nmsgid \"Use MosDNS query\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1172\nmsgid \"\"\n\"Use it together with the DNS disguised type. You can fill in any domain.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:107\nmsgid \"User cancelled.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1244\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:332\nmsgid \"User-Agent\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:295\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:1133\nmsgid \"Userinfo format error.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:489\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:110\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:117\nmsgid \"Username\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:596\nmsgid \"Users Authentication\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:395\nmsgid \"Using incorrect encryption mothod may causes service fail to start\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:342\nmsgid \"V2Ray/XRay\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:441\nmsgid \"V2Ray/XRay protocol\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:442\nmsgid \"VLESS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:892\nmsgid \"VLESS Encryption\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:443\nmsgid \"VMess\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1153\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1163\nmsgid \"VideoCall (SRTP)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:752\nmsgid \"Vmess Protocol\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:767\nmsgid \"Vmess UUID\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:884\nmsgid \"Vmess/VLESS ID (UUID)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:30\nmsgid \"WAN Force Proxy IP\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:25\nmsgid \"WAN IP AC\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:27\nmsgid \"WAN White List IP\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:957\nmsgid \"WebSocket Host\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:963\nmsgid \"WebSocket Path\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1155\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1165\nmsgid \"WechatVideo\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:96\nmsgid \"When disabled shunt mode, will same time stopped shunt service.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:198\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:227\nmsgid \"When disabled, all AAAA requests are not resolved.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1205\nmsgid \"When enabled, it occupies IPv6 routing table 1023.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:187\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:216\nmsgid \"When two or more DNS servers are deployed, enable this function.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:161\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:189\nmsgid \"\"\n\"When use DNS list file, please ensure list file exists and is formatted \"\n\"correctly.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:447\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1157\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1167\nmsgid \"WireGuard\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1237\nmsgid \"Wireguard allows only traffic from specific source IP.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1023\nmsgid \"XHTTP Extra\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1011\nmsgid \"XHTTP Host\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1002\nmsgid \"XHTTP Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1017\nmsgid \"XHTTP Path\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:287\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:87\nmsgid \"Xray (Hysteria2)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:104\nmsgid \"Xray (ShadowSocks)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:318\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:94\nmsgid \"Xray (Trojan)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:355\nmsgid \"Xray Fragment Settings\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:388\nmsgid \"Xray Noise Packets\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:252\nmsgid \"adblock_url\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1141\nmsgid \"aes-128-gcm\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1537\nmsgid \"allow\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1531\nmsgid \"allow: Allows use Mux connection.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1451\nmsgid \"allowInsecure\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1236\nmsgid \"allowedIPs(optional)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1352\nmsgid \"android\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:254\nmsgid \"anti-AD\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1142\nmsgid \"chacha20-poly1305\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:92\nmsgid \"china-operator-ip\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1247\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1348\nmsgid \"chrome\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:180\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:208\nmsgid \"cloudflare-dns.com DNSCrypt SDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1568\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1584\nmsgid \"comment_tcpcongestion_disable\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1501\nmsgid \"concurrency\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:678\nmsgid \"connect\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1252\nmsgid \"curl\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1565\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1581\nmsgid \"custom_tcpcongestion\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1358\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1509\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1522\nmsgid \"disable\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:176\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:204\nmsgid \"dns.sb DNSCrypt SDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1250\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1353\nmsgid \"edge\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:192\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:221\nmsgid \"fastest_addr\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:239\nmsgid \"felixonmars/dnsmasq-china-list\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1248\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1349\nmsgid \"firefox\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1120\nmsgid \"gRPC Idle Timeout\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1093\nmsgid \"gRPC Mode\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1087\nmsgid \"gRPC Service Name\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:82\nmsgid \"gfwlist Update url\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:86\nmsgid \"gfwlist/gfwlist\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1251\nmsgid \"golang\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1351\nmsgid \"ios\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:190\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:219\nmsgid \"load_balance\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:805\nmsgid \"lossless UDP relay using QUIC streams\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:804\nmsgid \"native UDP characteristics\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:99\nmsgid \"nfip_url\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:521\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1337\nmsgid \"none\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:551\nmsgid \"obfs-local\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:191\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:220\nmsgid \"parallel\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1355\nmsgid \"qq\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1356\nmsgid \"random\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1357\nmsgid \"randomized\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1536\nmsgid \"reject\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1249\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1350\nmsgid \"safari\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:739\nmsgid \"shadow-TLS SNI\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:560\nmsgid \"shadow-tls\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:717\nmsgid \"shadowTLS protocol Version\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1538\nmsgid \"skip\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1532\nmsgid \"\"\n\"skip: Not use Mux module to carry UDP 443 traffic, Use original UDP \"\n\"transmission method of proxy protocol.\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1328\nmsgid \"spiderX\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:83\nmsgid \"v2fly/domain-list-community\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:554\nmsgid \"v2ray-plugin\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:289\nmsgid \"valid address:port\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:101\nmsgid \"warning! Please do not reuse the port!\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:557\nmsgid \"xray-plugin\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1514\nmsgid \"xudpConcurrency\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1527\nmsgid \"xudpProxyUDP443\"\nmsgstr \"\"\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/po/zh_Hans/ssr-plus.po",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\\n\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:361\nmsgid \"\"\n\"\\\"1-3\\\" is for segmentation at TCP layer, applying to the beginning 1 to 3 \"\n\"data writes by the client. \\\"tlshello\\\" is for TLS client hello packet \"\n\"fragmentation.\"\nmsgstr \"\"\n\"\\\"1-3\\\" 是 TCP 的流切片，应用于客户端第 1 至第 3 次写数据。\\\"tlshello\\\" 是 \"\n\"TLS 握手包切片。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:279\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:310\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:170\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:198\nmsgid \"%s Node Use Type\"\nmsgstr \"%s 节点使用类型\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:409\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:227\nmsgid \"%s Node Use Version\"\nmsgstr \"%s 节点使用版本\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:103\nmsgid \"0\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:100\nmsgid \"1 Thread\"\nmsgstr \"单线程\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:107\nmsgid \"128 Threads\"\nmsgstr \"128 线程\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1523\nmsgid \"16\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:104\nmsgid \"16 Threads\"\nmsgstr \"16 线程\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:101\nmsgid \"2 Threads\"\nmsgstr \"2 线程\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:105\nmsgid \"32 Threads\"\nmsgstr \"32 线程\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1354\nmsgid \"360\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:270\nmsgid \"360 Security DNS (China Telecom) (101.226.4.6)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:271\nmsgid \"360 Security DNS (China Unicom) (123.125.81.6)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:102\nmsgid \"4 Threads\"\nmsgstr \"4 线程\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:106\nmsgid \"64 Threads\"\nmsgstr \"64 线程\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1510\nmsgid \"8\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:103\nmsgid \"8 Threads\"\nmsgstr \"8 线程\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:390\nmsgid \"<font style='color:red'>\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1031\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1369\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1396\nmsgid \"<font><b>\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:38\nmsgid \"\"\n\"<h3>Support SS/SSR/V2RAY/XRAY/TROJAN/TUIC/HYSTERIA2/NAIVEPROXY/SOCKS5/TUN \"\n\"etc.</h3>\"\nmsgstr \"\"\n\"<h3>支持 SS/SSR/V2RAY/XRAY/TROJAN/TUIC/HYSTERIA2/NAIVEPROXY/SOCKS5/TUN 等协\"\n\"议。</h3>\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:160\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:186\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:220\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1203\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1503\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1516\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1529\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1655\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1682\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:188\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:214\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:249\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:240\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:267\nmsgid \"<ul><li>\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:58\nmsgid \"Access Control\"\nmsgstr \"访问控制\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:178\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:206\nmsgid \"AdGuard DNSCrypt SDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:749\nmsgid \"Add\"\nmsgstr \"添加\"\n\n#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:59\nmsgid \"Advanced Settings\"\nmsgstr \"高级设置\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:222\nmsgid \"Advertising Data\"\nmsgstr \"【广告屏蔽】数据库\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1676\nmsgid \"AliDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:268\nmsgid \"AliYun Public DNS (223.5.5.5)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:367\nmsgid \"Alias\"\nmsgstr \"别名\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:397\nmsgid \"Alias(optional)\"\nmsgstr \"别名（可选）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:119\nmsgid \"All Ports\"\nmsgstr \"所有端口（默认）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:39\nmsgid \"Allow all except listed\"\nmsgstr \"除列表外主机皆允许\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:38\nmsgid \"Allow listed only\"\nmsgstr \"仅允许列表内主机\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:297\nmsgid \"Allow subscribe Insecure nodes By default\"\nmsgstr \"订阅节点允许不验证 TLS 证书\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:877\nmsgid \"AlterId\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1271\nmsgid \"An FinalMaskObject in JSON format, used for sharing.\"\nmsgstr \"JSON 格式的 FinalMaskObject，用来实现分享。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:142\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:173\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:149\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:170\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:201\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:235\nmsgid \"Anti-pollution DNS Server\"\nmsgstr \"访问国外域名 DNS 服务器\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:125\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:206\nmsgid \"Anti-pollution DNS Server For Shunt Mode\"\nmsgstr \"分流模式下的访问国外域名 DNS 服务器\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:243\nmsgid \"Apple Domains DNS\"\nmsgstr \"Apple 域名 DNS\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:208\nmsgid \"Apple Domains Data\"\nmsgstr \"【Apple 域名】数据库\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:238\nmsgid \"Apple Domains Update url\"\nmsgstr \"Apple 域名更新 URL\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:234\nmsgid \"Apple domains optimization\"\nmsgstr \"Apple 域名解析优化\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:399\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:405\nmsgid \"Apply\"\nmsgstr \"应用\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:391\nmsgid \"Are you sure to delete this node?\"\nmsgstr \"是否真的要删除该节点？\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:133\nmsgid \"Are you sure you want to restore the client to default settings?\"\nmsgstr \"是否真的要恢复客户端默认配置？\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:282\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:313\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1660\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1688\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:172\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:200\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:229\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:246\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:274\nmsgid \"Auto\"\nmsgstr \"自动\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:417\nmsgid \"Auto Switch\"\nmsgstr \"自动切换\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:99\nmsgid \"Auto Threads\"\nmsgstr \"自动（CPU 线程数）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:117\nmsgid \"Auto Update\"\nmsgstr \"自动更新\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:119\nmsgid \"Auto Update Server subscription, GFW list and CHN route\"\nmsgstr \"自动更新服务器订阅、GFW 列表和中国大陆 IP 段\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:811\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1569\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1585\nmsgid \"BBR\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1570\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1586\nmsgid \"BRUTAL\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/log.lua:25\nmsgid \"Backup and Restore\"\nmsgstr \"备份还原\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/log.lua:25\nmsgid \"Backup or Restore Client and Server Configurations.\"\nmsgstr \"备份或还原客户端及服务端配置。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:193\nmsgid \"Baidu Connectivity\"\nmsgstr \"【百度】连通性检查\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:269\nmsgid \"Baidu Public DNS (180.76.76.76)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:320\nmsgid \"Base64 sstr failed.\"\nmsgstr \"Base64 解码失败。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1154\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1164\nmsgid \"BitTorrent (uTP)\"\nmsgstr \"BT 下载（uTP）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:100\nmsgid \"Black Domain List\"\nmsgstr \"强制走代理的域名\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:536\nmsgid \"Bloom Filter\"\nmsgstr \"布隆过滤器\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:84\nmsgid \"Bypass Domain List\"\nmsgstr \"不走代理的域名\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:31\nmsgid \"CLOSE WIN\"\nmsgstr \"关闭窗口\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:272\nmsgid \"CNNIC SDNS (1.2.4.8)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:812\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1571\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1589\nmsgid \"CUBIC\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1171\nmsgid \"Camouflage Domain\"\nmsgstr \"伪装域名\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:939\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1160\nmsgid \"Camouflage Type\"\nmsgstr \"伪装类型\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1479\nmsgid \"Certificate fingerprint\"\nmsgstr \"证书指纹\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm:21\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm:27\nmsgid \"Check Connect\"\nmsgstr \"检查连通性\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/checkport.htm:17\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/checkport.htm:23\nmsgid \"Check Server\"\nmsgstr \"检查服务器\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:228\nmsgid \"Check Server Port\"\nmsgstr \"【服务器端口】检查\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:77\nmsgid \"Check Try Count\"\nmsgstr \"切换检查重试次数\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:72\nmsgid \"Check timout(second)\"\nmsgstr \"切换检查超时时间（秒）\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm:6\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/checkport.htm:6\nmsgid \"Check...\"\nmsgstr \"正在检查...\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:202\nmsgid \"China IP Data\"\nmsgstr \"【中国大陆 IP 段】数据库\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:255\nmsgid \"ChinaDNS-NG query protocol\"\nmsgstr \"ChinaDNS-NG 查询协议\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:226\nmsgid \"ChinaDNS-NG shunt query protocol\"\nmsgstr \"ChinaDNS-NG 分流查询协议\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:89\nmsgid \"Chnroute Update url\"\nmsgstr \"中国大陆 IP 段更新 URL\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:90\nmsgid \"Clang.CN\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:91\nmsgid \"Clang.CN.CIDR\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/log.htm:35\nmsgid \"Clear logs\"\nmsgstr \"清空日志\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:164\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:192\nmsgid \"Click here to view or manage the DNS list file\"\nmsgstr \"点击此处查看或管理 DNS 列表文件\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:394\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1033\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1371\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1398\nmsgid \"Click to the page\"\nmsgstr \"点击前往\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:148\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:176\nmsgid \"Cloudflare DNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:136\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:217\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:160\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:246\nmsgid \"Cloudflare DNS (1.1.1.1)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:179\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:207\nmsgid \"Cloudflare DNSCrypt SDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm:20\nmsgid \"Collecting data...\"\nmsgstr \"正在收集数据中...\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1031\nmsgid \"Configure XHTTP Extra Settings (JSON format), see:\"\nmsgstr \"配置 XHTTP 额外设置（JSON 格式），具体请参见：\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:809\nmsgid \"Congestion control algorithm\"\nmsgstr \"拥塞控制算法\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm:18\nmsgid \"Connect Error\"\nmsgstr \"连接错误\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/check.htm:16\nmsgid \"Connect OK\"\nmsgstr \"连接正常\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:103\nmsgid \"Connection Timeout\"\nmsgstr \"连接超时\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1382\nmsgid \"\"\n\"Controls the policy used when performing DNS queries for ECH configuration.\"\nmsgstr \"控制使用 DNS 查询 ECH 配置时的策略。\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:93\nmsgid \"Copy SSR to clipboard successfully.\"\nmsgstr \"成功复制 SSR 网址到剪贴板。\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:2\nmsgid \"Create Backup File\"\nmsgstr \"创建备份文件\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1617\nmsgid \"Create upload file error.\"\nmsgstr \"创建上传文件错误。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1637\nmsgid \"Current Certificate Path\"\nmsgstr \"当前证书路径\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:562\nmsgid \"Custom\"\nmsgstr \"自定义\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:182\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:210\nmsgid \"\"\n\"Custom DNS Server (support: IP:Port or tls://IP:Port or https://IP/dns-query \"\n\"and other format).\"\nmsgstr \"\"\n\"自定义 DNS 服务器（支持格式：IP:端口、tls://IP:端口、https://IP/dns-query 及\"\n\"其他格式）。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:139\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:221\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:166\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:250\nmsgid \"Custom DNS Server format as IP:PORT (default: 8.8.4.4:53)\"\nmsgstr \"格式为 IP:Port（默认：8.8.4.4:53）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:278\nmsgid \"Custom DNS Server format as IP:PORT (default: disabled)\"\nmsgstr \"格式为 IP:PORT（默认：禁用）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:150\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:178\nmsgid \"\"\n\"Custom DNS Server format as tcp://IP:PORT or tls://DOMAIN:PORT \"\n\"(tcp://8.8.8.8 or tls://dns.google:853)\"\nmsgstr \"\"\n\"格式为tcp://IP:Port或tls://域名:Port (tcp://8.8.8.8或tls://dns.google:853)\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:566\nmsgid \"Custom Plugin Path\"\nmsgstr \"自定义插件路径\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:121\nmsgid \"Custom Ports\"\nmsgstr \"自定义端口\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1272\nmsgid \"\"\n\"Custom finalmask overrides mkcp, hysteria2, fragment, noise, and related \"\n\"settings.\"\nmsgstr \"自定义 finalmask 将覆盖 mkcp、hysteria2、fragment、noise 等相关配置。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:103\nmsgid \"Customize Netflix IP Url\"\nmsgstr \"\"\n\"自定义 Netflix IP 段更新 URL（默认项目地址：https://github.com/QiuSimons/\"\n\"Netflix_IP）\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:4\nmsgid \"DL Backup\"\nmsgstr \"下载备份\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1168\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1666\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1674\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:251\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:259\nmsgid \"DNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:143\nmsgid \"DNS Anti-pollution\"\nmsgstr \"DNS 防污染服务\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:106\nmsgid \"DNS Query Mode For Shunt Mode\"\nmsgstr \"分流模式下的 DNS 查询模式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1675\nmsgid \"DNSPod\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:267\nmsgid \"DNSPod Public DNS (119.29.29.29)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1156\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1166\nmsgid \"DTLS 1.2\"\nmsgstr \"DTLS 1.2 数据包\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1218\nmsgid \"Decimal numbers separated by \\\",\\\" or Base64-encoded strings.\"\nmsgstr \"用“,”隔开的十进制数字或 Base64 编码字符串。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1246\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1419\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1431\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1445\nmsgid \"Default\"\nmsgstr \"默认\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1530\nmsgid \"Default reject rejects traffic.\"\nmsgstr \"默认 reject 拒绝流量。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:707\nmsgid \"Default value 0 indicatesno heartbeat.\"\nmsgstr \"默认为 0 表示无心跳。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1504\nmsgid \"\"\n\"Default: disable. When entering a negative number, such as -1, The Mux \"\n\"module will not be used to carry TCP traffic.\"\nmsgstr \"默认：禁用。填负数时，如 -1，不使用 Mux 模块承载 TCP 流量。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1517\nmsgid \"\"\n\"Default:16. When entering a negative number, such as -1, The Mux module will \"\n\"not be used to carry UDP traffic, Use original UDP transmission method of \"\n\"proxy protocol.\"\nmsgstr \"\"\n\"默认值：16。填负数时，如 -1，不使用 Mux 模块承载 UDP 流量。将使用代理协议原本\"\n\"的 UDP 传输方式。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:184\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:212\nmsgid \"Defines the upstreams logic mode\"\nmsgstr \"定义上游逻辑模式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:187\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:215\nmsgid \"\"\n\"Defines the upstreams logic mode, possible values: load_balance, parallel, \"\n\"fastest_addr (default: load_balance).\"\nmsgstr \"\"\n\"定义上游逻辑模式，可选择值：负载均衡、并行查询、最快响应（默认值：负载均\"\n\"衡）。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:432\nmsgid \"Delay (ms)\"\nmsgstr \"延迟（ms）\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:738\nmsgid \"Delete\"\nmsgstr \"删除\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:315\nmsgid \"Delete All Subscribe Servers\"\nmsgstr \"删除所有订阅服务器节点\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:116\nmsgid \"Deny Domain List\"\nmsgstr \"禁止连接的域名\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:62\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:70\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:78\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:37\nmsgid \"Disable\"\nmsgstr \"停用\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:263\nmsgid \"Disable ChinaDNS-NG\"\nmsgstr \"直通模式（禁用 ChinaDNS-NG）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:152\nmsgid \"Disable IPv6 In MosDNS Query Mode (Shunt Mode)\"\nmsgstr \"禁止 MosDNS 返回 IPv6 记录 (分流模式)\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:180\nmsgid \"Disable IPv6 in MOSDNS query mode\"\nmsgstr \"禁止 MOSDNS 返回 IPv6 记录\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:197\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:226\nmsgid \"Disable IPv6 query mode\"\nmsgstr \"禁止返回 IPv6 记录\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:664\nmsgid \"Disable QUIC path MTU discovery\"\nmsgstr \"禁用 QUIC 启用 MTU 探测\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:853\nmsgid \"Disable SNI\"\nmsgstr \"关闭 SNI 服务器名称指示\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:734\nmsgid \"Disable TCP No_delay\"\nmsgstr \"禁用 TCP 无延迟\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:149\nmsgid \"Dnsproxy Parse List\"\nmsgstr \"DNSPROXY 解析列表\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:18\nmsgid \"Do Reset\"\nmsgstr \"执行重置\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:131\nmsgid \"Do you want to restore the client to default settings?\"\nmsgstr \"是否要恢复客户端默认配置？\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1663\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:249\nmsgid \"DoH\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:230\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:259\nmsgid \"DoT upstream (Need use wolfssl version)\"\nmsgstr \"DoT 上游（需使用 wolfssl 版本）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1653\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:238\nmsgid \"Domain DNS Resolve\"\nmsgstr \"域名 DNS 解析\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:419\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1680\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:265\nmsgid \"Domain Strategy\"\nmsgstr \"域名解析策略\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:262\nmsgid \"Domestic DNS Server\"\nmsgstr \"国内 DNS 服务器\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1189\nmsgid \"Downlink Capacity(Default:Mbps)\"\nmsgstr \"下行链路容量（默认：Mbps）\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:739\nmsgid \"Drag to reorder\"\nmsgstr \"拖动以重排\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:864\nmsgid \"Dual-stack Listening Socket\"\nmsgstr \"双栈 Socket 监听\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1367\nmsgid \"ECH Config\"\nmsgstr \"ECH 配置\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1381\nmsgid \"ECH Query Policy\"\nmsgstr \"ECH 查询策略\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:981\nmsgid \"Early Data Header Name\"\nmsgstr \"前置数据标头\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:737\nmsgid \"Edit\"\nmsgstr \"编辑\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:259\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:69\nmsgid \"Edit ShadowSocksR Server\"\nmsgstr \"编辑服务器配置\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:271\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:408\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:82\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:101\nmsgid \"Enable\"\nmsgstr \"启用\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:858\nmsgid \"Enable 0-RTT QUIC handshake\"\nmsgstr \"客户端启用 0-RTT QUIC 连接握手\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:482\nmsgid \"Enable Authentication\"\nmsgstr \"启用用户名/密码认证\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:63\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1712\nmsgid \"Enable Auto Switch\"\nmsgstr \"启用自动切换\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1362\nmsgid \"Enable ECH(optional)\"\nmsgstr \"启用 ECH (可选)\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:640\nmsgid \"Enable Lazy Mode\"\nmsgstr \"启用懒狗模式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1389\nmsgid \"Enable ML-DSA-65(optional)\"\nmsgstr \"启用 ML-DSA-65 (可选)\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1548\nmsgid \"\"\n\"Enable Multipath TCP, need to be enabled in both server and client \"\n\"configuration.\"\nmsgstr \"启用 Multipath TCP，需在服务端和客户端配置中同时启用。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1484\nmsgid \"Enable Mux.Cool\"\nmsgstr \"启用 Mux.Cool\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:95\nmsgid \"Enable Netflix Mode\"\nmsgstr \"启用 Netflix 分流模式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:634\nmsgid \"Enable Obfuscation\"\nmsgstr \"启用混淆功能\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:542\nmsgid \"Enable Plugin\"\nmsgstr \"启用插件\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:602\nmsgid \"Enable Port Hopping\"\nmsgstr \"启用端口跳跃\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:84\nmsgid \"Enable Server\"\nmsgstr \"启动服务端\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:615\nmsgid \"Enable Transport Protocol Settings\"\nmsgstr \"启用传输协议设置\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:720\nmsgid \"Enable V2 protocol.\"\nmsgstr \"开启 V2 协议。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:719\nmsgid \"Enable V3 protocol.\"\nmsgstr \"开启 V3 协议。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:249\nmsgid \"Enable adblock\"\nmsgstr \"启用广告屏蔽\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:531\nmsgid \"Enable the SUoT protocol, requires server support.\"\nmsgstr \"启用 SUoT 协议，需要服务端支持。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1024\nmsgid \"Enable this option to configure XHTTP Extra (JSON format).\"\nmsgstr \"启用此选项配置 XHTTP 附加项（JSON 格式）。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1201\nmsgid \"Enabled Kernel virtual NIC TUN(optional)\"\nmsgstr \"启用内核的虚拟网卡 TUN（可选）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:335\nmsgid \"Enabled Mixed\"\nmsgstr \"启用 Mixed\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:729\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1643\nmsgid \"Enabling TCP Fast Open Requires Server Support.\"\nmsgstr \"启用 TCP 快速打开需要服务端支持。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:510\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:517\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:761\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:772\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:903\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:118\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:125\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:122\nmsgid \"Encrypt Method\"\nmsgstr \"加密方式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:122\nmsgid \"Enter Custom Ports\"\nmsgstr \"输入自定义端口\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:122\nmsgid \"Every Day\"\nmsgstr \"每天\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:127\nmsgid \"Every Friday\"\nmsgstr \"每周五\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:123\nmsgid \"Every Monday\"\nmsgstr \"每周一\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:128\nmsgid \"Every Saturday\"\nmsgstr \"每周六\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:129\nmsgid \"Every Sunday\"\nmsgstr \"每周日\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:126\nmsgid \"Every Thursday\"\nmsgstr \"每周四\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:124\nmsgid \"Every Tuesday\"\nmsgstr \"每周二\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:125\nmsgid \"Every Wednesday\"\nmsgstr \"每周三\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:289\nmsgid \"Expecting: %s\"\nmsgstr \"应为：%s\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:86\nmsgid \"External Proxy Mode\"\nmsgstr \"分流服务器（前置）代理\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1587\nmsgid \"FORCE BRUTAL\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:282\nmsgid \"Filter Words splited by /\"\nmsgstr \"命中关键字的节点将被丢弃。多个关键字用 / 分隔\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1260\nmsgid \"FinalMask\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1346\nmsgid \"Finger Print\"\nmsgstr \"指纹伪造\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1333\nmsgid \"Flow\"\nmsgstr \"流控（Flow）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:234\nmsgid \"\"\n\"For Apple domains equipped with Chinese mainland CDN, always responsive to \"\n\"Chinese CDN IP addresses\"\nmsgstr \"配备中国大陆 CDN 的 Apple 域名，始终应答中国大陆 CDN 地址\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:392\nmsgid \"For specific usage, see:\"\nmsgstr \"具体使用方法，具体请参见：\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:609\nmsgid \"\"\n\"Format as 10000:20000 or 10000-20000 Multiple groups are separated by commas \"\n\"(,).\"\nmsgstr \"格式为：10000:20000 或 10000-20000 多组时用逗号（,）隔开。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:88\nmsgid \"Forward Netflix Proxy through Main Proxy\"\nmsgstr \"分流服务器流量通过主服务节点中转代理转发\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:358\nmsgid \"Fragment\"\nmsgstr \"分片\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:375\nmsgid \"Fragment Delay\"\nmsgstr \"分片延迟\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:370\nmsgid \"Fragment Length\"\nmsgstr \"分片包长\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:361\nmsgid \"Fragment Packets\"\nmsgstr \"分片方式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:375\nmsgid \"Fragmentation interval (ms)\"\nmsgstr \"分片间隔（ms）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:370\nmsgid \"Fragmented packet length (byte)\"\nmsgstr \"分片包长 (byte)\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:197\nmsgid \"GFW List Data\"\nmsgstr \"【GFW 列表】数据库\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:112\nmsgid \"GFW List Mode\"\nmsgstr \"GFW 列表模式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:68\nmsgid \"Game Mode Host List\"\nmsgstr \"增强游戏模式客户端 LAN IP\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:134\nmsgid \"Game Mode UDP Relay\"\nmsgstr \"游戏模式 UDP 中继\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:69\nmsgid \"Game Mode UDP Server\"\nmsgstr \"游戏模式 UDP 中继服务器\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:829\nmsgid \"Garbage collection interval(second)\"\nmsgstr \"UDP 数据包片残片清理间隔（单位：秒）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:835\nmsgid \"Garbage collection lifetime(second)\"\nmsgstr \"UDP 数据包残片在服务器的保留时间（单位：秒）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:126\nmsgid \"Global Client\"\nmsgstr \"TCP 透明代理\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:114\nmsgid \"Global Mode\"\nmsgstr \"全局模式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:267\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:152\nmsgid \"Global SOCKS5 Proxy Server\"\nmsgstr \"SOCKS5 代理服务端（全局）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:81\nmsgid \"Global Setting\"\nmsgstr \"全局设置\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:189\nmsgid \"Google Connectivity\"\nmsgstr \"【谷歌】连通性检查\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:174\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:202\nmsgid \"Google DNSCrypt SDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:143\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:171\nmsgid \"Google Public DNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:126\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:207\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:150\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:236\nmsgid \"Google Public DNS (8.8.4.4)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:127\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:208\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:151\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:237\nmsgid \"Google Public DNS (8.8.8.8)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/root/usr/share/rpcd/acl.d/luci-app-ssr-plus.json:3\nmsgid \"Grant UCI access for luci-app-ssr-plus\"\nmsgstr \"授予访问 luci-app-ssr-plus 配置的权限\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1095\nmsgid \"Gun\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1114\nmsgid \"H2 Read Idle Timeout\"\nmsgstr \"H2 读取空闲超时\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1109\nmsgid \"H2/gRPC Health Check\"\nmsgstr \"H2/gRPC 健康检查\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:453\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:942\nmsgid \"HTTP\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:946\nmsgid \"HTTP Host\"\nmsgstr \"HTTP 主机名\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:951\nmsgid \"HTTP Path\"\nmsgstr \"HTTP 路径\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1077\nmsgid \"HTTP/2 Host\"\nmsgstr \"HTTP/2 主机名\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1082\nmsgid \"HTTP/2 Path\"\nmsgstr \"HTTP/2 路径\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1149\nmsgid \"Header\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1126\nmsgid \"Health Check Timeout\"\nmsgstr \"健康检查超时\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:817\nmsgid \"Heartbeat interval(second)\"\nmsgstr \"保活心跳包发送间隔（单位：秒）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:968\nmsgid \"HeartbeatPeriod(second)\"\nmsgstr \"心跳周期（单位：秒）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:990\nmsgid \"Httpupgrade Host\"\nmsgstr \"HTTPUpgrade 主机名\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:995\nmsgid \"Httpupgrade Path\"\nmsgstr \"HTTPUpgrade 路径\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:284\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:357\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:450\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:84\nmsgid \"Hysteria2\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:658\nmsgid \"Hysterir QUIC parameters\"\nmsgstr \"QUIC 参数\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:113\nmsgid \"IP Route Mode\"\nmsgstr \"绕过中国大陆 IP 模式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1443\nmsgid \"IP Stack Preference\"\nmsgstr \"IP 栈优先级\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1691\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:277\nmsgid \"IPv4 Only\"\nmsgstr \"仅 IPv4\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1692\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:278\nmsgid \"IPv6 Only\"\nmsgstr \"仅 IPv6\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:243\nmsgid \"If empty, Not change Apple domains parsing DNS (Default is empty)\"\nmsgstr \"如果为空，则不更改 Apple 域名解析 DNS（默认为空）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1683\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:268\nmsgid \"\"\n\"If is domain name, The requested domain name will be resolved to IP before \"\n\"connect.\"\nmsgstr \"如果是域名，域名将在请求发出之前解析为 IP。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1369\nmsgid \"\"\n\"If it is not empty, it indicates that the Client has enabled Encrypted \"\n\"Client, see:\"\nmsgstr \"如果不为空，表示客户端已启用加密客户端，具体请参见：\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1656\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:241\nmsgid \"\"\n\"If the node address is a domain name, this DNS will be used for resolution.\"\nmsgstr \"如果节点地址是域名，则将使用此 DNS 进行解析。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:865\nmsgid \"If this option is not set, the socket behavior is platform dependent.\"\nmsgstr \"如果未设置此选项，则 Socket 行为依赖于平台。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1456\nmsgid \"\"\n\"If true, allowss insecure connection at TLS client, e.g., TLS server uses \"\n\"unverifiable certificates.\"\nmsgstr \"\"\n\"是否允许不安全连接。当选择时，将不会检查远端主机所提供的 TLS 证书的有效性。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1601\nmsgid \"If you have a self-signed certificate,please check the box\"\nmsgstr \"如果你使用自签证书，请选择\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:1193\nmsgid \"Import\"\nmsgstr \"导入配置信息\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:249\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:425\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:597\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:672\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:706\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:813\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:952\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:1104\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:1184\nmsgid \"Import configuration information successfully.\"\nmsgstr \"导入配置信息成功。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1102\nmsgid \"Initial Windows Size\"\nmsgstr \"初始窗口大小\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:17\nmsgid \"Interface\"\nmsgstr \"接口\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:16\nmsgid \"Interface control\"\nmsgstr \"接口控制\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:1187\nmsgid \"Invalid format.\"\nmsgstr \"无效的格式。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:172\nmsgid \"KcpTun\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1722\nmsgid \"KcpTun Enable\"\nmsgstr \"KcpTun 启用\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1739\nmsgid \"KcpTun Param\"\nmsgstr \"KcpTun 参数\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1734\nmsgid \"KcpTun Password\"\nmsgstr \"KcpTun 密码\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1728\nmsgid \"KcpTun Port\"\nmsgstr \"KcpTun 端口\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:169\nmsgid \"KcpTun Version\"\nmsgstr \"KcpTun 版本号\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:36\nmsgid \"LAN Access Control\"\nmsgstr \"内网客户端分流代理控制\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:52\nmsgid \"LAN Bypassed Host List\"\nmsgstr \"不走代理的局域网 LAN IP\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:60\nmsgid \"LAN Force Proxy Host List\"\nmsgstr \"全局代理的 LAN IP\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:42\nmsgid \"LAN Host List\"\nmsgstr \"内网主机列表\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:34\nmsgid \"LAN IP AC\"\nmsgstr \"LAN IP 访问控制\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:130\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:211\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:154\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:240\nmsgid \"Level 3 Public DNS (209.244.0.3)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:131\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:212\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:155\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:241\nmsgid \"Level 3 Public DNS (209.244.0.4)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:132\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:213\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:156\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:242\nmsgid \"Level 3 Public DNS (4.2.2.1)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:133\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:214\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:157\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:243\nmsgid \"Level 3 Public DNS (4.2.2.2)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:134\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:215\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:158\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:244\nmsgid \"Level 3 Public DNS (4.2.2.3)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:135\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:216\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:159\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:245\nmsgid \"Level 3 Public DNS (4.2.2.4)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:145\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:173\nmsgid \"Level 3 Public DNS-1 (209.244.0.3-4)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:146\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:174\nmsgid \"Level 3 Public DNS-2 (4.2.2.1-2)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:147\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:175\nmsgid \"Level 3 Public DNS-3 (4.2.2.3-4)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:380\nmsgid \"Limit the maximum number of splits.\"\nmsgstr \"限制分片的最大数量。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1204\nmsgid \"\"\n\"Linux kernel TUN virtual NIC requires system support and root privileges.\"\nmsgstr \"Linux 内核 TUN 虚拟网卡需要系统支持和 root 权限。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:22\nmsgid \"Listen only on the given interface or, if unspecified, on all\"\nmsgstr \"仅监听指定的接口，未指定则监听全部。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:348\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1716\nmsgid \"Local Port\"\nmsgstr \"本地端口\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:160\nmsgid \"Local Servers\"\nmsgstr \"本机服务端\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1212\nmsgid \"Local addresses\"\nmsgstr \"本地地址\"\n\n#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:66\nmsgid \"Log\"\nmsgstr \"日志\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:85\nmsgid \"Loukky/gfwlist-by-loukky\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:84\nmsgid \"Loyalsoldier/v2ray-rules-dat\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1394\nmsgid \"ML-DSA-65 Public key\"\nmsgstr \"ML-DSA-65 公钥\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1548\nmsgid \"MPTCP\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1175\nmsgid \"MTU\"\nmsgstr \"最大传输单元\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:61\nmsgid \"Main Server\"\nmsgstr \"主服务器\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:974\nmsgid \"Max Early Data\"\nmsgstr \"最大前置数据\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:380\nmsgid \"Max Split\"\nmsgstr \"最大分片数\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:870\nmsgid \"Maximum packet size the socks5 server can receive from external\"\nmsgstr \"socks5 服务器可以从外部接收的最大数据包大小（单位：字节）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1518\nmsgid \"\"\n\"Min value is 1, Max value is 1024. When omitted or set to 0, Will same path \"\n\"as TCP traffic.\"\nmsgstr \"\"\n\"最小值 1，最大值 1024。 省略或者填 0 时，将与 TCP 流量走同一条路，也就是传统\"\n\"的行为。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1505\nmsgid \"\"\n\"Min value is 1, Max value is 128. When omitted or set to 0, it equals 8.\"\nmsgstr \"最小值 1，最大值 128。省略或者填 0 时都等于 8。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:335\nmsgid \"Mixed as an alias of socks, default:Enabled.\"\nmsgstr \"Mixed 作为 SOCKS 的别名，默认：启用。\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/optimize_cbi_ui.htm:10\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:735\nmsgid \"Move down\"\nmsgstr \"下移\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/optimize_cbi_ui.htm:7\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:734\nmsgid \"Move up\"\nmsgstr \"上移\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:222\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:251\nmsgid \"Muitiple DNS server can saperate with ','\"\nmsgstr \"多个上游 DNS 服务器请用 ',' 分隔（注意用英文逗号)\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1096\nmsgid \"Multi\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:98\nmsgid \"Multi Threads Option\"\nmsgstr \"多线程并发转发\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1066\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1290\nmsgid \"Must be JSON text!\"\nmsgstr \"必须是 JSON 文本内容！\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1484\nmsgid \"Mux\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:253\nmsgid \"NEO DEV HOST\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm:10\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:354\nmsgid \"NaiveProxy\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:266\nmsgid \"Nanjing Xinfeng 114DNS (114.114.114.114)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:132\nmsgid \"Netflix Domain List\"\nmsgstr \"Netflix 分流域名列表\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:215\nmsgid \"Netflix IP Data\"\nmsgstr \"【Netflix IP 段】数据库\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:100\nmsgid \"Netflix IP Only\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:77\nmsgid \"Netflix Node\"\nmsgstr \"Netflix 分流服务器\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:101\nmsgid \"Netflix and AWS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:369\nmsgid \"Network Tunnel\"\nmsgstr \"网络隧道\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:399\nmsgid \"Network interface to use\"\nmsgstr \"使用的网络接口\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:813\nmsgid \"New Reno\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:190\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:194\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:230\nmsgid \"No Check\"\nmsgstr \"未检查\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:209\nmsgid \"No available core (Hysteria2 or Xray) to import this node.\"\nmsgstr \"没有可用的核心（Hysteria2 或 Xray）可以导入此节点。\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:632\nmsgid \"No available core (Shadowsocks or Xray) to import this node.\"\nmsgstr \"没有可用的核心（Shadowsocks 或 Xray）可以导入此节点。\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:842\nmsgid \"No available core (Trojan or Xray) to import this node.\"\nmsgstr \"没有可用的核心（Trojan 或 Xray）可以导入此节点。\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm:21\nmsgid \"No new data!\"\nmsgstr \"你已经是最新数据，无需更新！\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1633\nmsgid \"No specify upload file.\"\nmsgstr \"没有上传证书。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:385\nmsgid \"Noise\"\nmsgstr \"噪声\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:549\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:941\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1140\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1152\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1162\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:364\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:369\nmsgid \"None\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:131\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:139\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:148\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:157\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:165\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:177\nmsgid \"Not Running\"\nmsgstr \"未运行\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:28\nmsgid \"Not exist\"\nmsgstr \"未安装可执行文件\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1657\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1684\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:243\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:270\nmsgid \"Note: For node-specific DNS only. Keep Auto to avoid extra overhead.\"\nmsgstr \"注意：仅用于节点专用 DNS，通常请保持自动，以免增加开销。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/log.lua:27\nmsgid \"\"\n\"Note: Restoring configurations across different versions may cause \"\n\"compatibility issues.\"\nmsgstr \"注意：不同版本间的配置恢复可能会导致兼容性问题。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1559\nmsgid \"Number of early established connections to reduce latency.\"\nmsgstr \"预连接的数量，用于降低延迟。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:548\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:584\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:139\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:133\nmsgid \"Obfs\"\nmsgstr \"混淆插件\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:591\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:146\nmsgid \"Obfs param (optional)\"\nmsgstr \"混淆参数（可选）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1196\nmsgid \"Obfuscate password (optional)\"\nmsgstr \"混淆密码（可选）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:651\nmsgid \"Obfuscation Password\"\nmsgstr \"混淆密码\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:645\nmsgid \"Obfuscation Type\"\nmsgstr \"混淆类型\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1468\nmsgid \"Once set, connects only when the server’s chain fingerprint matches.\"\nmsgstr \"设置后，仅在服务器证书链指纹匹配时连接。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:120\nmsgid \"Only Common Ports\"\nmsgstr \"仅常用端口（不走 P2P 流量到代理）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:324\nmsgid \"Only when Socks5 Auth Mode is password valid, Mandatory.\"\nmsgstr \"仅当 Socks5 认证方式为 Password 时有效，必填。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:329\nmsgid \"Only when Socks5 Auth Mode is password valid, Not mandatory.\"\nmsgstr \"仅当 Socks5 认证方式为 Password 时有效，非必填。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:144\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:172\nmsgid \"OpenDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:129\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:210\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:153\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:239\nmsgid \"OpenDNS (208.67.220.220)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:128\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:209\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:152\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:238\nmsgid \"OpenDNS (208.67.222.222)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:115\nmsgid \"Oversea Mode\"\nmsgstr \"海外用户回国模式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:161\nmsgid \"Oversea Mode DNS-1 (114.114.114.114)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:162\nmsgid \"Oversea Mode DNS-2 (114.114.115.115)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:391\nmsgid \"Packet or Rand length as a string, e.g., 10-20.\"\nmsgstr \"数据包或 Rand 长度以字符串形式输入，例如：10-20。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:428\nmsgid \"Packet | Rand Length\"\nmsgstr \"数据包 | Rand 长度\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:496\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:114\nmsgid \"Password\"\nmsgstr \"密码\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:105\nmsgid \"Paste sharing link here\"\nmsgstr \"在此处粘贴分享链接\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1227\nmsgid \"Peer public key\"\nmsgstr \"节点公钥\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm:14\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm:23\nmsgid \"Perform reset\"\nmsgstr \"执行重置\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1132\nmsgid \"Permit Without Stream\"\nmsgstr \"允许无数据流\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:393\nmsgid \"Ping Latency\"\nmsgstr \"Ping 延迟\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1640\nmsgid \"Please confirm the current certificate path\"\nmsgstr \"请选择确认所传证书，证书不正确将无法运行\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm:5\nmsgid \"Please fill in reset\"\nmsgstr \"请填写 reset\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:570\nmsgid \"Plugin Opts\"\nmsgstr \"插件参数\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:626\nmsgid \"Port Hopping Interval(Unit:Second)\"\nmsgstr \"端口跳跃间隔（单位：秒）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:608\nmsgid \"Port hopping range\"\nmsgstr \"端口跳跃范围\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1559\nmsgid \"Pre-connections\"\nmsgstr \"预连接\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1231\nmsgid \"Pre-shared key\"\nmsgstr \"预共享密钥\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1689\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:275\nmsgid \"Prefer IPv4\"\nmsgstr \"IPv4 优先\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1690\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:276\nmsgid \"Prefer IPv6\"\nmsgstr \"IPv6 优先\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:93\nmsgid \"Prefer firewall tools\"\nmsgstr \"首选防火墙工具\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1222\nmsgid \"Private key\"\nmsgstr \"私钥\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:574\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:132\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:128\nmsgid \"Protocol\"\nmsgstr \"传输协议\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:581\nmsgid \"Protocol param (optional)\"\nmsgstr \"传输协议参数（可选）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:118\nmsgid \"Proxy Ports\"\nmsgstr \"需要代理的端口\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1320\nmsgid \"Public key\"\nmsgstr \"公钥\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1145\nmsgid \"QUIC Key\"\nmsgstr \"QUIC 密钥\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1138\nmsgid \"QUIC Security\"\nmsgstr \"QUIC 加密方式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:685\nmsgid \"QUIC initConnReceiveWindow\"\nmsgstr \"QUIC 初始的连接接收窗口大小\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:671\nmsgid \"QUIC initStreamReceiveWindow\"\nmsgstr \"QUIC 初始流接收窗口大小。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:692\nmsgid \"QUIC maxConnReceiveWindow\"\nmsgstr \"QUIC 最大的连接接收窗口大小\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:699\nmsgid \"QUIC maxIdleTimeout(Unit:second)\"\nmsgstr \"QUIC 最长空闲超时时间（单位：秒）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:678\nmsgid \"QUIC maxStreamReceiveWindow\"\nmsgstr \"QUIC 最大的流接收窗口大小\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:177\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:205\nmsgid \"Quad9 DNSCrypt SDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1315\nmsgid \"REALITY\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:11\nmsgid \"RST Backup\"\nmsgstr \"恢复备份\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/status.htm:7\nmsgid \"RUNNING\"\nmsgstr \"运行中\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm:5\nmsgid \"Really reset all changes?\"\nmsgstr \"真的重置所有更改吗？\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:403\nmsgid \"Reapply\"\nmsgstr \"重新应用\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:200\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:205\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:211\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:218\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:225\nmsgid \"Records\"\nmsgstr \"条记录\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:406\nmsgid \"Redirect traffic to this network interface\"\nmsgstr \"分流到这个网络接口\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm:29\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm:35\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm:11\nmsgid \"Refresh Data\"\nmsgstr \"更新数据库\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm:24\nmsgid \"Refresh Error!\"\nmsgstr \"更新失败！\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm:18\nmsgid \"Refresh OK!\"\nmsgstr \"更新成功！\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm:6\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm:5\nmsgid \"Refresh...\"\nmsgstr \"正在更新，请稍候...\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:134\nmsgid \"Regular update (Hour)\"\nmsgstr \"定时更新（小时）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:142\nmsgid \"Regular update (Min)\"\nmsgstr \"定时更新（分钟）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1572\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1588\nmsgid \"Reno\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1217\nmsgid \"Reserved bytes(optional)\"\nmsgstr \"保留字节（可选）\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm:17\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm:18\nmsgid \"Reset complete\"\nmsgstr \"重置完成\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:259\nmsgid \"Reset to defaults\"\nmsgstr \"恢复出厂设置\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:127\nmsgid \"Resolve Dns Mode\"\nmsgstr \"DNS 解析方式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:182\nmsgid \"Restart Service\"\nmsgstr \"重启服务\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:181\nmsgid \"Restart ShadowSocksR Plus+\"\nmsgstr \"重启 ShadowSocksR Plus+\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:9\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:24\nmsgid \"Restore Backup File\"\nmsgstr \"恢复备份文件\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:16\nmsgid \"Restore to default configuration\"\nmsgstr \"恢复默认配置\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:129\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:137\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:146\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:155\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:163\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:175\nmsgid \"Running\"\nmsgstr \"运行中\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:111\nmsgid \"Running Mode\"\nmsgstr \"运行模式\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:342\nmsgid \"SS URL base64 sstr format not recognized.\"\nmsgstr \"无法识别 SS URL 的 Base64 格式。\"\n\n#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:56\nmsgid \"SSR Client\"\nmsgstr \"客户端\"\n\n#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:60\nmsgid \"SSR Server\"\nmsgstr \"服务端\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:277\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:71\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:79\nmsgid \"Same as Global Server\"\nmsgstr \"与全局服务器相同\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:750\nmsgid \"Save Order\"\nmsgstr \"保存当前顺序\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:286\nmsgid \"Save Words splited by /\"\nmsgstr \"\"\n\"命中关键字的节点将被保留。多个关键字用 / 分隔。此项为空则不启用保留匹配\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:484\nmsgid \"Save failed!\"\nmsgstr \"保存失败！\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:482\nmsgid \"Saved current page order successfully.\"\nmsgstr \"保存当前页面顺序成功。\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:747\nmsgid \"Saving the new order...\"\nmsgstr \"正在保存新的顺序…\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:158\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:186\nmsgid \"Select DNS parse Mode\"\nmsgstr \"选择 DNS 解析方式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:410\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:228\nmsgid \"Selection ShadowSocks Node Use Version.\"\nmsgstr \"选择 ShadowSocks 节点使用版本。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1593\nmsgid \"Self-signed Certificate\"\nmsgstr \"自签证书\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:276\nmsgid \"Server\"\nmsgstr \"服务器\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:456\nmsgid \"Server Address\"\nmsgstr \"服务器地址\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:317\nmsgid \"Server Count\"\nmsgstr \"服务器节点数量\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:340\nmsgid \"Server Node Type\"\nmsgstr \"服务器节点类型\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:469\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:96\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:112\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:372\nmsgid \"Server Port\"\nmsgstr \"端口\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:88\nmsgid \"Server Setting\"\nmsgstr \"服务端配置\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:86\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:107\nmsgid \"Server Type\"\nmsgstr \"服务端类型\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:56\nmsgid \"Server failsafe auto swith and custom update settings\"\nmsgstr \"服务器节点故障自动切换/广告屏蔽/中国大陆 IP 段数据库更新设置\"\n\n#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:57\nmsgid \"Servers Nodes\"\nmsgstr \"服务器节点\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:111\nmsgid \"Servers subscription and manage\"\nmsgstr \"服务器节点订阅与管理\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1309\nmsgid \"Session Ticket\"\nmsgstr \"会话凭据\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:167\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:195\nmsgid \"Set Single DNS\"\nmsgstr \"设置单个 DNS\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:363\nmsgid \"Shadow-TLS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:746\nmsgid \"Shadow-TLS ChainPoxy type\"\nmsgstr \"代理链类型\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:348\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:445\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:89\nmsgid \"ShadowSocks\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:415\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:101\nmsgid \"ShadowSocks-libev Version\"\nmsgstr \"ShadowSocks-libev 版本\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:412\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:749\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:98\nmsgid \"ShadowSocks-rust Version\"\nmsgstr \"ShadowSocks-rust 版本\"\n\n#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:53\nmsgid \"ShadowSocksR Plus+\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:38\nmsgid \"ShadowSocksR Plus+ Settings\"\nmsgstr \"ShadowSocksR Plus+ 设置\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:757\nmsgid \"Shadowsocks password\"\nmsgstr \"shadowsocks密码\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:345\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:92\nmsgid \"ShadowsocksR\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1324\nmsgid \"Short ID\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:377\nmsgid \"Socket Connected\"\nmsgstr \"连接测试\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:452\nmsgid \"Socks\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:911\nmsgid \"Socks Version\"\nmsgstr \"Socks 版本\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:310\nmsgid \"Socks protocol auth methods, default:noauth.\"\nmsgstr \"Socks 协议的认证方式，默认值：noauth。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:366\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:87\nmsgid \"Socks5\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:310\nmsgid \"Socks5 Auth Mode\"\nmsgstr \"Socks5 认证方式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:329\nmsgid \"Socks5 Password\"\nmsgstr \"Socks5 密码\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:324\nmsgid \"Socks5 User\"\nmsgstr \"Socks5 用户名\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:151\nmsgid \"Specifically for edit dnsproxy DNS parse files.\"\nmsgstr \"专门用于编辑 DNSPROXY 的 DNS 解析文件。\"\n\n#: applications/luci-app-ssr-plus/luasrc/controller/shadowsocksr.lua:61\nmsgid \"Status\"\nmsgstr \"状态\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:302\nmsgid \"Subscribe Default Auto-Switch\"\nmsgstr \"订阅新节点自动切换设置\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:280\nmsgid \"Subscribe Filter Words\"\nmsgstr \"订阅节点关键字过滤\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:284\nmsgid \"Subscribe Save Words\"\nmsgstr \"订阅节点关键字保留检查\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:235\nmsgid \"Subscribe URL\"\nmsgstr \"SS/SSR/V2/TROJAN/HY2/TUIC 订阅 URL\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:304\nmsgid \"Subscribe new add server default Auto-Switch on\"\nmsgstr \"订阅加入的新节点默认开启自动切换\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:299\nmsgid \"Subscribe nodes allows insecure connection as TLS client (insecure)\"\nmsgstr \"订阅节点强制开启 不验证TLS客户端证书 (insecure)\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:257\nmsgid \"Support AdGuardHome and DNSMASQ format list\"\nmsgstr \"同时支持 AdGuard Home 和 DNSMASQ 格式的过滤列表\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:627\nmsgid \"Supports a fixed value or a random range (e.g., 30, 5-30), minimum 5.\"\nmsgstr \"支持固定值或随机范围（如 30 或 5-30），最小 5 秒。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:242\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:269\nmsgid \"Supports only Xray node types.\"\nmsgstr \"仅支持 Xray 类型节点。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:67\nmsgid \"Switch check cycly(second)\"\nmsgstr \"自动切换检查周期（秒）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1661\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:247\nmsgid \"TCP\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:729\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1643\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:149\nmsgid \"TCP Fast Open\"\nmsgstr \"TCP 快速打开\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:358\nmsgid \"\"\n\"TCP fragments, which can deceive the censorship system in some cases, such \"\n\"as bypassing SNI blacklists.\"\nmsgstr \"TCP 分片，在某些情况下可以欺骗审查系统，比如绕过 SNI 黑名单。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:228\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:257\nmsgid \"TCP upstream\"\nmsgstr \"TCP 上游\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1295\nmsgid \"TLS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:724\nmsgid \"TLS 1.3 Strict mode\"\nmsgstr \"TLS 1.3 限定模式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1417\nmsgid \"TLS ALPN\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1473\nmsgid \"TLS Certificate Name (CertName)\"\nmsgstr \"TLS 证书名称（CertName）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1468\nmsgid \"TLS Chain Fingerprint (SHA256)\"\nmsgstr \"TLS 证书链指纹（SHA256）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1409\nmsgid \"TLS Host\"\nmsgstr \"TLS 主机名\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:539\nmsgid \"TLS handshake test, latency for reference only\"\nmsgstr \"TLS握手测试，延时仅供参考\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1473\nmsgid \"TLS is used to verify the leaf certificate name.\"\nmsgstr \"TLS 用于验证 leaf 证书的 name。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:360\nmsgid \"TUIC\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1429\nmsgid \"TUIC ALPN\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:789\nmsgid \"TUIC Server IP Address\"\nmsgstr \"TUIC 服务器 IP 地址\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:796\nmsgid \"TUIC User Password\"\nmsgstr \"TUIC 用户密钥\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:782\nmsgid \"TUIC User UUID\"\nmsgstr \"TUIC 用户 uuid\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:847\nmsgid \"TUIC receive window\"\nmsgstr \"接收窗口（无需确认即可接收的最大字节数：默认8Mb）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:841\nmsgid \"TUIC send window\"\nmsgstr \"发送窗口（无需确认即可发送的最大字节数：默认8Mb*2）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:175\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:203\nmsgid \"TWNIC-101 DNSCrypt SDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:539\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:604\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:628\nmsgid \"Test\"\nmsgstr \"测试\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:581\nmsgid \"Testing...\"\nmsgstr \"检测中…\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1396\nmsgid \"\"\n\"The client has not configured mldsa65Verify, but it will not perform the \"\n\"\\\"additional verification\\\" step and can still connect normally, see:\"\nmsgstr \"\"\n\"客户端若未配置 mldsa65Verify，但它不会执行 \\\"附加验证\\\" 步骤，仍可以正常连\"\n\"接，具体请参见：\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:280\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:311\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:171\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:199\nmsgid \"\"\n\"The configured type also applies to the core specified when manually \"\n\"importing nodes.\"\nmsgstr \"配置的类型同样适用于手动导入节点时所指定的核心程序。\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/reset.htm:10\nmsgid \"The content entered is incorrect!\"\nmsgstr \"输入的内容不正确！\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:706\nmsgid \"The keep-alive period.(Unit:second)\"\nmsgstr \"心跳包发送间隔（单位：秒）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:307\nmsgid \"Through proxy update\"\nmsgstr \"通过代理更新\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:309\nmsgid \"Through proxy update list, Not Recommended\"\nmsgstr \"通过路由器自身代理更新订阅\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:823\nmsgid \"Timeout for establishing a connection to server(second)\"\nmsgstr \"连接超时时间（单位：秒）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:162\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:190\nmsgid \"Tips: Dnsproxy DNS Parse List Path:\"\nmsgstr \"提示：Dnsproxy 的 DNS 解析列表路径：\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:736\nmsgid \"To Bottom\"\nmsgstr \"置底\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:733\nmsgid \"To Top\"\nmsgstr \"置顶\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:390\nmsgid \"To send noise packets, select \\\"Noise\\\" in Xray Settings.\"\nmsgstr \"在 Xray 设置中勾选 “噪声” 以发送噪声包。\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/refresh.htm:18\nmsgid \"Total Records:\"\nmsgstr \"新的总记录数：\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:920\nmsgid \"Transport\"\nmsgstr \"传输协议\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:620\nmsgid \"Transport Protocol\"\nmsgstr \"传输协议\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:315\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:351\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:444\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:91\nmsgid \"Trojan\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:412\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:362\nmsgid \"Type\"\nmsgstr \"类型\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:622\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1662\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:248\nmsgid \"UDP\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:385\nmsgid \"\"\n\"UDP noise, Under some circumstances it can bypass some UDP based protocol \"\n\"restrictions.\"\nmsgstr \"UDP 噪声，在某些情况下可以绕过一些针对 UDP 协议的限制。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:530\nmsgid \"UDP over TCP\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:802\nmsgid \"UDP relay mode\"\nmsgstr \"UDP 中继模式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:229\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:258\nmsgid \"UDP upstream\"\nmsgstr \"UDP 上游\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:227\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:256\nmsgid \"UDP/TCP upstream\"\nmsgstr \"UDP/TCP 上游\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/backup_restore.htm:30\nmsgid \"UL Restore\"\nmsgstr \"上传恢复\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:322\nmsgid \"URL Test Address\"\nmsgstr \"URL 测试地址\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:95\nmsgid \"Unable to copy SSR to clipboard.\"\nmsgstr \"无法复制 SSR 网址到剪贴板。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:25\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/status.lua:35\nmsgid \"Unknown\"\nmsgstr \"未知\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:311\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/subscribe.htm:16\nmsgid \"Update All Subscribe Servers\"\nmsgstr \"更新所有订阅服务器节点\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:288\nmsgid \"Update Subscribe List\"\nmsgstr \"更新订阅 URL 列表\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:121\nmsgid \"Update cycle (Day/Week)\"\nmsgstr \"更新周期（天/周）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:290\nmsgid \"Update subscribe url list first\"\nmsgstr \"修改订阅 URL 和节点关键字后，请先点击更新\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1182\nmsgid \"Uplink Capacity(Default:Mbps)\"\nmsgstr \"上行链路容量（默认：Mbps）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1603\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/certupload.htm:3\nmsgid \"Upload\"\nmsgstr \"上传\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:120\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:144\nmsgid \"Use ChinaDNS-NG query and cache\"\nmsgstr \"使用 ChinaDNS-NG 查询并缓存\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:168\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:196\nmsgid \"Use DNS List File\"\nmsgstr \"使用 DNS 列表文件\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:264\nmsgid \"Use DNS from WAN\"\nmsgstr \"使用 WAN 下发的 DNS\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:265\nmsgid \"Use DNS from WAN and 114DNS\"\nmsgstr \"使用 WAN 下发的 DNS 和 114DNS\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:108\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:132\nmsgid \"Use DNS2SOCKS query and cache\"\nmsgstr \"使用 DNS2SOCKS 查询并缓存\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:111\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:135\nmsgid \"Use DNS2SOCKS-RUST query and cache\"\nmsgstr \"使用 DNS2SOCKS-RUST 查询并缓存\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:129\nmsgid \"Use DNS2TCP query\"\nmsgstr \"使用 DNS2TCP 查询\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:117\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:141\nmsgid \"Use DNSPROXY query and cache\"\nmsgstr \"使用 DNSPROXY 查询并缓存\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:146\nmsgid \"Use Local DNS Service listen port 5335\"\nmsgstr \"使用本机端口为 5335 的 DNS 服务\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:138\nmsgid \"Use MOSDNS query (Not Support Oversea Mode)\"\nmsgstr \"使用 MOSDNS 查询 (不支持海外用户回国模式)\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:114\nmsgid \"Use MosDNS query\"\nmsgstr \"使用 MosDNS 查询\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1172\nmsgid \"\"\n\"Use it together with the DNS disguised type. You can fill in any domain.\"\nmsgstr \"配合伪装类型 DNS 使用，可随便填一个域名。\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:107\nmsgid \"User cancelled.\"\nmsgstr \"用户已取消。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1244\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:332\nmsgid \"User-Agent\"\nmsgstr \"用户代理(User-Agent)\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:295\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/ssrurl.htm:1133\nmsgid \"Userinfo format error.\"\nmsgstr \"用户信息格式错误。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:489\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:110\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server.lua:117\nmsgid \"Username\"\nmsgstr \"用户名\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:596\nmsgid \"Users Authentication\"\nmsgstr \"用户验证\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:395\nmsgid \"Using incorrect encryption mothod may causes service fail to start\"\nmsgstr \"输入不正确的参数组合可能会导致服务无法启动\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:342\nmsgid \"V2Ray/XRay\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:441\nmsgid \"V2Ray/XRay protocol\"\nmsgstr \"V2Ray/XRay 协议\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:442\nmsgid \"VLESS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:892\nmsgid \"VLESS Encryption\"\nmsgstr \"VLESS 加密\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:443\nmsgid \"VMess\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1153\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1163\nmsgid \"VideoCall (SRTP)\"\nmsgstr \"视频通话（SRTP）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:752\nmsgid \"Vmess Protocol\"\nmsgstr \"VMESS 协议\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:767\nmsgid \"Vmess UUID\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:884\nmsgid \"Vmess/VLESS ID (UUID)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:30\nmsgid \"WAN Force Proxy IP\"\nmsgstr \"强制走代理的 WAN IP\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:25\nmsgid \"WAN IP AC\"\nmsgstr \"WAN IP 访问控制\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/control.lua:27\nmsgid \"WAN White List IP\"\nmsgstr \"不走代理的 WAN IP\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:957\nmsgid \"WebSocket Host\"\nmsgstr \"WebSocket 主机名\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:963\nmsgid \"WebSocket Path\"\nmsgstr \"WebSocket 路径\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1155\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1165\nmsgid \"WechatVideo\"\nmsgstr \"微信视频通话\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:96\nmsgid \"When disabled shunt mode, will same time stopped shunt service.\"\nmsgstr \"当停用分流模式时，将同时停止分流服务。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:198\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:227\nmsgid \"When disabled, all AAAA requests are not resolved.\"\nmsgstr \"当禁用时，不解析所有 AAAA 请求。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1205\nmsgid \"When enabled, it occupies IPv6 routing table 1023.\"\nmsgstr \"启用后，将占用 IPv6 路由表 1023。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:187\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:216\nmsgid \"When two or more DNS servers are deployed, enable this function.\"\nmsgstr \"当部署两台或两台以上 DNS 服务器时，需要启用该功能。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:161\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:189\nmsgid \"\"\n\"When use DNS list file, please ensure list file exists and is formatted \"\n\"correctly.\"\nmsgstr \"当使用 DNS 列表文件时，请确保列表文件存在并且格式正确。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:447\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1157\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1167\nmsgid \"WireGuard\"\nmsgstr \"WireGuard 数据包\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1237\nmsgid \"Wireguard allows only traffic from specific source IP.\"\nmsgstr \"Wireguard 仅允许特定源 IP 的流量。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1023\nmsgid \"XHTTP Extra\"\nmsgstr \"XHTTP 附加项\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1011\nmsgid \"XHTTP Host\"\nmsgstr \"XHTTP 主机名\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1002\nmsgid \"XHTTP Mode\"\nmsgstr \"XHTTP 模式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1017\nmsgid \"XHTTP Path\"\nmsgstr \"XHTTP 路径\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:287\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:87\nmsgid \"Xray (Hysteria2)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:104\nmsgid \"Xray (ShadowSocks)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:318\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/servers.lua:94\nmsgid \"Xray (Trojan)\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:355\nmsgid \"Xray Fragment Settings\"\nmsgstr \"Xray 分片设置\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:388\nmsgid \"Xray Noise Packets\"\nmsgstr \"Xray 噪声数据包\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:252\nmsgid \"adblock_url\"\nmsgstr \"广告屏蔽更新 URL\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1141\nmsgid \"aes-128-gcm\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1537\nmsgid \"allow\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1531\nmsgid \"allow: Allows use Mux connection.\"\nmsgstr \"allow：允许走 Mux 连接。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1451\nmsgid \"allowInsecure\"\nmsgstr \"允许不安全连接\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1236\nmsgid \"allowedIPs(optional)\"\nmsgstr \"allowedIPs（可选）\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1352\nmsgid \"android\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:254\nmsgid \"anti-AD\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1142\nmsgid \"chacha20-poly1305\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:92\nmsgid \"china-operator-ip\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1247\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1348\nmsgid \"chrome\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:180\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:208\nmsgid \"cloudflare-dns.com DNSCrypt SDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1568\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1584\nmsgid \"comment_tcpcongestion_disable\"\nmsgstr \"系统默认值\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1501\nmsgid \"concurrency\"\nmsgstr \"TCP 最大并发连接数\"\n\n#: applications/luci-app-ssr-plus/luasrc/view/shadowsocksr/server_list.htm:678\nmsgid \"connect\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1252\nmsgid \"curl\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1565\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1581\nmsgid \"custom_tcpcongestion\"\nmsgstr \"连接服务器节点的 TCP 拥塞控制算法\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1358\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1509\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1522\nmsgid \"disable\"\nmsgstr \"禁用\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:176\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:204\nmsgid \"dns.sb DNSCrypt SDNS\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1250\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1353\nmsgid \"edge\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:192\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:221\nmsgid \"fastest_addr\"\nmsgstr \"最快响应\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:239\nmsgid \"felixonmars/dnsmasq-china-list\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1248\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1349\nmsgid \"firefox\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1120\nmsgid \"gRPC Idle Timeout\"\nmsgstr \"gPRC 空闲超时\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1093\nmsgid \"gRPC Mode\"\nmsgstr \"gRPC 模式\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1087\nmsgid \"gRPC Service Name\"\nmsgstr \"gRPC 服务名称\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:82\nmsgid \"gfwlist Update url\"\nmsgstr \"GFW 列表更新 URL\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:86\nmsgid \"gfwlist/gfwlist\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1251\nmsgid \"golang\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1351\nmsgid \"ios\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:190\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:219\nmsgid \"load_balance\"\nmsgstr \"负载均衡\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:805\nmsgid \"lossless UDP relay using QUIC streams\"\nmsgstr \"使用 QUIC 流的无损 UDP 中继\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:804\nmsgid \"native UDP characteristics\"\nmsgstr \"原生 UDP 特性\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:99\nmsgid \"nfip_url\"\nmsgstr \"Netflix IP 段更新 URL\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:521\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1337\nmsgid \"none\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:551\nmsgid \"obfs-local\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:191\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:220\nmsgid \"parallel\"\nmsgstr \"并行查询\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1355\nmsgid \"qq\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1356\nmsgid \"random\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1357\nmsgid \"randomized\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1536\nmsgid \"reject\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1249\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1350\nmsgid \"safari\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:739\nmsgid \"shadow-TLS SNI\"\nmsgstr \"服务器名称指示\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:560\nmsgid \"shadow-tls\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:717\nmsgid \"shadowTLS protocol Version\"\nmsgstr \"ShadowTLS 协议版本\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1538\nmsgid \"skip\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1532\nmsgid \"\"\n\"skip: Not use Mux module to carry UDP 443 traffic, Use original UDP \"\n\"transmission method of proxy protocol.\"\nmsgstr \"\"\n\"skip：不使用 Mux 模块承载 UDP 443 流量，将使用代理协议原本的 UDP 传输方式。\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1328\nmsgid \"spiderX\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/advanced.lua:83\nmsgid \"v2fly/domain-list-community\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:554\nmsgid \"v2ray-plugin\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client.lua:289\nmsgid \"valid address:port\"\nmsgstr \"有效的地址:端口\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/server-config.lua:101\nmsgid \"warning! Please do not reuse the port!\"\nmsgstr \"警告！请不要重复使用端口！\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:557\nmsgid \"xray-plugin\"\nmsgstr \"\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1514\nmsgid \"xudpConcurrency\"\nmsgstr \"UDP 最大并发连接数\"\n\n#: applications/luci-app-ssr-plus/luasrc/model/cbi/shadowsocksr/client-config.lua:1527\nmsgid \"xudpProxyUDP443\"\nmsgstr \"对被代理的 UDP/443 流量处理方式\"\n\n#~ msgid \"Congestion\"\n#~ msgstr \"拥塞控制\"\n\n#~ msgid \"Read Buffer Size\"\n#~ msgstr \"读取缓冲区大小\"\n\n#~ msgid \"TTI\"\n#~ msgstr \"传输时间间隔\"\n\n#~ msgid \"Write Buffer Size\"\n#~ msgstr \"写入缓冲区大小\"\n\n#~ msgid \"IP Type\"\n#~ msgstr \"IP 类型\"\n\n#~ msgid \"Invalid JSON format\"\n#~ msgstr \"无效的 JSON 格式\"\n\n#~ msgid \"\"\n#~ \"Virtual NIC TUN of Linux kernel can be used only when system supports and \"\n#~ \"have root permission. If used, IPv6 routing table 1023 is occupied.\"\n#~ msgstr \"\"\n#~ \"需要系统支持且有 root 权限才能使用 Linux 内核的虚拟网卡 TUN，使用后会占用 \"\n#~ \"IPv6 的 1023 号路由表。\"\n\n#~ msgid \"Wireguard reserved bytes.\"\n#~ msgstr \"Wireguard 保留字节。\"\n\n#~ msgid \"Applying configuration changes… %ds\"\n#~ msgstr \"正在等待配置被应用… %ds\"\n\n#~ msgid \"ShadowSocks Node Use Version\"\n#~ msgstr \"ShadowSocks 节点使用版本\"\n\n#~ msgid \"Splithttp Host\"\n#~ msgstr \"SplitHTTP 主机名\"\n\n#~ msgid \"Splithttp Path\"\n#~ msgstr \"SplitHTTP 路径\"\n\n#~ msgid \"Custom DNS Server for mosdns\"\n#~ msgstr \"MosDNS 自定义 DNS 服务器\"\n\n#~ msgid \"ShadowSocksR Client\"\n#~ msgstr \"ShadowSocksR 客户端\"\n\n#~ msgid \"ShadowSocksR is running\"\n#~ msgstr \"ShadowSocksR 客户端运行中\"\n\n#~ msgid \"ShadowSocksR is not running\"\n#~ msgstr \"ShadowSocksR 客户端未运行\"\n\n#~ msgid \"Global Server\"\n#~ msgstr \"全局服务器\"\n\n#~ msgid \"ShadowSocksR SOCK5 Proxy is running\"\n#~ msgstr \"ShadowSocksR SOCK5 代理运行中\"\n\n#~ msgid \"UDP Relay Server\"\n#~ msgstr \"UDP 中继服务器\"\n\n#~ msgid \"Servers Setting\"\n#~ msgstr \"服务器配置\"\n\n#~ msgid \"Onetime Authentication\"\n#~ msgstr \"一次验证\"\n\n#~ msgid \"Authentication type\"\n#~ msgstr \"验证类型\"\n\n#~ msgid \"\"\n#~ \"NOTE: If the server uses the userpass authentication, the format must be \"\n#~ \"username:password.\"\n#~ msgstr \"注意： 如果服务器使用 userpass 验证，格式必须是 username:password。\"\n\n#~ msgid \"QUIC connection receive window\"\n#~ msgstr \"QUIC 连接接收窗口\"\n\n#~ msgid \"QUIC stream receive window\"\n#~ msgstr \"QUIC 流接收窗口\"\n\n#~ msgid \"Lazy Start\"\n#~ msgstr \"延迟启动\"\n\n#~ msgid \"Enable Tunnel(DNS)\"\n#~ msgstr \"启用隧道（DNS）转发\"\n\n#~ msgid \"Tunnel Port\"\n#~ msgstr \"隧道（DNS）本地端口\"\n\n#~ msgid \"Forwarding Tunnel\"\n#~ msgstr \"隧道（DNS）转发地址\"\n\n#~ msgid \"Interfaces - WAN\"\n#~ msgstr \"接口 - WAN\"\n\n#~ msgid \"Bypassed IP List\"\n#~ msgstr \"被忽略 IP 列表\"\n\n#~ msgid \"NULL - As Global Proxy\"\n#~ msgstr \"留空 - 作为全局代理\"\n\n#~ msgid \"Bypassed IP\"\n#~ msgstr \"额外被忽略 IP\"\n\n#~ msgid \"Forwarded IP\"\n#~ msgstr \"强制走代理 IP\"\n\n#~ msgid \"Interfaces - LAN\"\n#~ msgstr \"接口 - LAN\"\n\n#~ msgid \"ShadowSocksR Server\"\n#~ msgstr \"ShadowSocksR 服务端\"\n\n#~ msgid \"ShadowSocksR Server is running\"\n#~ msgstr \"ShadowSocksR 服务端运行中\"\n\n#~ msgid \"ShadowSocksR Server is not running\"\n#~ msgstr \"ShadowSocksR 服务端未运行\"\n\n#~ msgid \"Enable Process Monitor\"\n#~ msgstr \"启用进程监控\"\n\n#~ msgid \"Running Status\"\n#~ msgstr \"运行状态\"\n\n#~ msgid \"Global SSR Server\"\n#~ msgstr \"SSR 服务端\"\n\n#~ msgid \"DNS Tunnel\"\n#~ msgstr \"DNS 隧道\"\n\n#~ msgid \"IPK Version\"\n#~ msgstr \"IPK 版本号\"\n\n#~ msgid \"IPK Installation Time\"\n#~ msgstr \"IPK 安装时间\"\n\n#~ msgid \"Project\"\n#~ msgstr \"项目地址\"\n\n#~ msgid \"Enable GFW mode\"\n#~ msgstr \"启用 GFW 模式\"\n\n#~ msgid \"Router Proxy\"\n#~ msgstr \"路由器访问控制\"\n\n#~ msgid \"Bypassed Proxy\"\n#~ msgstr \"不走代理\"\n\n#~ msgid \"Forwarded Proxy\"\n#~ msgstr \"强制走代理\"\n\n#~ msgid \"UDP Relay\"\n#~ msgstr \"UDP 中继\"\n\n#~ msgid \"Check\"\n#~ msgstr \"检查\"\n\n#~ msgid \"Proxy Check\"\n#~ msgstr \"代理检查\"\n\n#~ msgid \"Enable Process Deamon\"\n#~ msgstr \"启用进程自动守护\"\n\n#~ msgid \"DNS Server IP and Port\"\n#~ msgstr \"DNS 服务器地址和端口\"\n\n#~ msgid \"Use SSR DNS Tunnel\"\n#~ msgstr \"使用 SSR DNS 隧道\"\n\n#~ msgid \"Use Other DNS Tunnel(Need to install)\"\n#~ msgstr \"使用其他 DNS 转发（需要自己安装）\"\n\n#~ msgid \"Export SSR\"\n#~ msgstr \"导出 SSR 配置信息\"\n\n#~ msgid \"Servers Manage\"\n#~ msgstr \"服务器管理\"\n\n#~ msgid \"GFW List\"\n#~ msgstr \"GFW 列表\"\n\n#~ msgid \"Use MOSDNS query\"\n#~ msgstr \"使用 MOSDNS 查询\"\n\n#~ msgid \"DNS Server IP:Port\"\n#~ msgstr \"DNS 服务器 IP:Port\"\n\n#~ msgid \"Update\"\n#~ msgstr \"更新\"\n\n#~ msgid \"Router Self AC\"\n#~ msgstr \"路由器自身代理设置\"\n\n#~ msgid \"Router Self Proxy\"\n#~ msgstr \"路由器自身代理方式\"\n\n#~ msgid \"Normal Proxy\"\n#~ msgstr \"跟随全局设置\"\n\n#~ msgid \"GFW Custom List\"\n#~ msgstr \"GFW 用户自定义列表\"\n\n#~ msgid \"Please refer to the following writing\"\n#~ msgstr \"每行一个域名，无需写前面的 http(s)://，提交后即时生效\"\n\n#~ msgid \"Plugin\"\n#~ msgstr \"插件\"\n\n#~ msgid \"upload\"\n#~ msgstr \"上传\"\n\n#~ msgid \"SOCKS5 Proxy Server Settings\"\n#~ msgstr \"SOCKS5 代理服务端设置\"\n\n#~ msgid \"SOCKS5 Proxy Server\"\n#~ msgstr \"SOCKS5 代理服务端\"\n\n#~ msgid \"Enable SOCKS5 Proxy Server\"\n#~ msgstr \"启用 SOCKS5 代理服务\"\n\n#~ msgid \"Enable WAN Access\"\n#~ msgstr \"允许从 WAN 访问\"\n\n#~ msgid \"Netflix IP List\"\n#~ msgstr \"Netflix 分流IP列表\"\n\n#~ msgid \"Reset Error\"\n#~ msgstr \"重置错误\"\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/etc/config/shadowsocksr",
    "content": ""
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/etc/init.d/shadowsocksr",
    "content": "#!/bin/sh /etc/rc.common\n#\n# Copyright (C) 2017 openwrt-ssr\n# Copyright (C) 2017 yushi studio <ywb94@qq.com>\n# Copyright (C) 2018 lean <coolsnowwolf@gmail.com>\n# Copyright (C) 2020 Mattraks <mattraks@gmail.com>\n#\n# This is free software, licensed under the GNU General Public License v3.\n# See /LICENSE for more information.\n#\n\nSTART=95\nSTOP=15\nSERVICE_DAEMONIZE=1\nNAME=shadowsocksr\nLOCK_FILE=/var/lock/ssrplus.lock\nLOG_FILE=/var/log/ssrplus.log\nTMP_PATH=/var/etc/ssrplus\nTMP_BIN_PATH=$TMP_PATH/bin\nPERSIST_DIR=\"/usr/share/nftables.d/ruleset-post\"\nPERSIST_FILE=\"$PERSIST_DIR/99-shadowsocksr.nft\"\nBACKUP_DIR=\"/etc/ssrplus/ssrplus-persist\"\nBACKUP_FILE=\"$BACKUP_DIR/99-shadowsocksr.save\"\n# 设置 DNSMASQ_CONF_DIR 和 TMP_DNSMASQ_PATH\nif [ -f /etc/openwrt_release ]; then\n    # 获取默认的 DNSMASQ 配置 ID\n    DEFAULT_DNSMASQ_CFGID=\"$(uci -q show \"dhcp.@dnsmasq[0]\" | awk 'NR==1 {split($0, conf, /[.=]/); print conf[2]}')\"\n    # 从 conf-dir 行中提取配置目录路径\n    if [ -f \"/tmp/etc/dnsmasq.conf.$DEFAULT_DNSMASQ_CFGID\" ]; then\n        DNSMASQ_CONF_DIR=\"$(awk -F '=' '/^conf-dir=/ {print $2}' \"/tmp/etc/dnsmasq.conf.$DEFAULT_DNSMASQ_CFGID\")\"\n    else\n        DNSMASQ_CONF_DIR=\"/tmp/dnsmasq.d\"\n    fi\n    # 设置 TMP_DNSMASQ_PATH，并去除路径末尾的斜杠\n    TMP_DNSMASQ_PATH=\"${DNSMASQ_CONF_DIR%*/}/dnsmasq-ssrplus.d\"\nfi\n\nchain_config_file=\t\t   #generate shadowtls chain proxy config file\ntcp_config_file=\nudp_config_file=\nshunt_config_file=\nlocal_config_file=\nshunt_dns_config_file=\ntmp_local_port=\n\nARG_UDP=\n\ndns_port=\"5335\"            #dns port\nchina_dns_port=\"5333\"      #china_dns_port\ntmp_dns_port=\"300\"         #dns2socks temporary port\ntmp_udp_port=\"301\"         #udp temporary port\ntmp_udp_local_port=\"302\"   #udp socks temporary port\ntmp_shunt_port=\"303\"       #shunt temporary port\ntmp_shunt_local_port=\"304\" #shunt socks temporary port\ntmp_shunt_dns_port=\"305\"   #shunt dns2socks temporary port\ntmp_tcp_local_port=\"306\"   #tcp socks temporary port\n\nserver_count=0\nredir_tcp=0\nredir_udp=0\nlocal_enable=0\nkcp_enable_flag=0\npdnsd_enable_flag=0\n\nUSE_TABLES=\"\"\nHAS_NFT=0\nHAS_IPSET=0\nHAS_IPT=0\nHAS_FW4=0\nDNSMASQ_IPSET=0\nDNSMASQ_NFTSET=0\n\nswitch_server=$1\nCRON_FILE=/etc/crontabs/root\nEXTRA_COMMANDS='reset'\nEXTRA_HELP=\"        reset   Reset to default settings\"\n#extra_command \"reset\" \"Reset to default settings\"\nPS=\"/bin/busybox ps\"\n\nuci_get_by_name() {\n\tlocal ret=$(uci get $NAME.$1.$2 2>/dev/null)\n\techo ${ret:=$3}\n}\n\nuci_get_by_type() {\n\tlocal ret=$(uci get $NAME.@$1[0].$2 2>/dev/null)\n\techo \"${ret:=$3}\"\n}\n\nuci_set_by_name() {\n\tuci set $NAME.$1.$2=$3 2>/dev/null\n\tuci commit $NAME\n}\n\nuci_set_by_type() {\n\tuci set $NAME.@$1[0].$2=$3 2>/dev/null\n\tuci commit $NAME\n}\n\nuci_get_by_cfgid() {\n\tlocal ret=$(uci show $NAME.@$1[0].$2 | awk -F '.' '{print $2}' 2>/dev/null)\n\techo ${ret:=$3}\n}\n\nget_host_ip() {\n\tlocal host=$(uci_get_by_name $1 server)\n\tlocal ip=$host\n\tif [ -z \"$(echo $host | grep -E \"([0-9]{1,3}[\\.]){3}[0-9]{1,3}\")\" ]; then\n\t\tif [ \"$host\" == \"${host#*:[0-9a-fA-F]}\" ]; then\n\t\t\tip=$(resolveip -4 -t 3 $host | awk 'NR==1{print}')\n\t\t\t[ -z \"$ip\" ] && ip=$(curl -sSL \"http://119.29.29.29/d?dn=$host\" | awk -F ';' '{print $1}')\n\t\tfi\n\tfi\n\t[ -z \"$ip\" ] || uci_set_by_name $1 ip $ip\n\t[ -n \"$ip\" ] || ip=\"$(uci_get_by_name $1 ip \"ERROR\")\"\n\n\tlocal chinadns=\"$(uci_get_by_type global chinadns_forward)\"\n\tif [ -n \"$chinadns\" ] && [ \"$ip\" != \"$host\" ]; then\n\t\tgrep -q \"$host\" \"$TMP_DNSMASQ_PATH/chinadns_fixed_server.conf\" 2>\"/dev/null\" || \\\n\t\t\techo -e \"address=/$host/$ip\" >> \"$TMP_DNSMASQ_PATH/chinadns_fixed_server.conf\"\n\tfi\n\n\techo $ip\n}\n\nclean_log() {\n\tlocal logsnum=$(cat $LOG_FILE 2>/dev/null | wc -l)\n\t[ \"$logsnum\" -gt 1000 ] && {\n\t\techo \"$(date \"+%Y-%m-%d %H:%M:%S\") 日志文件过长，清空处理！\" >$LOG_FILE\n\t}\n}\n\necholog() {\n\tlocal d=\"$(date \"+%Y-%m-%d %H:%M:%S\")\"\n\techo -e \"$d: $*\" >>$LOG_FILE\n}\n\nadd_cron() {\n\ttouch $CRON_FILE\n\tsed -i '/ssrplus.log/d' $CRON_FILE\n\t[ $(uci_get_by_type server_subscribe auto_update 0) -eq 1 ] && echo \"$(uci_get_by_type server_subscribe auto_update_min_time) $(uci_get_by_type server_subscribe auto_update_day_time) * * $(uci_get_by_type server_subscribe auto_update_week_time) /usr/share/shadowsocksr/ssrplusupdate.sh >$LOG_FILE\" >>$CRON_FILE\n\tcrontab $CRON_FILE\n}\n\ndel_cron() {\n\ttouch $CRON_FILE\n\tsed -i '/ssrplus.log/d' $CRON_FILE\n\tcrontab $CRON_FILE\n\tclean_log\n}\n\nset_lock() {\n\texec 1000>\"$LOCK_FILE\"\n\tflock -xn 1000\n}\n\nunset_lock() {\n\tflock -u 1000\n\trm -rf \"$LOCK_FILE\"\n}\n\nunlock() {\n\tfailcount=1\n\twhile [ \"$failcount\" -le 10 ]; do\n\t\tif [ -f \"$LOCK_FILE\" ]; then\n\t\t\tlet \"failcount++\"\n\t\t\tsleep 1s\n\t\t\t[ \"$failcount\" -ge 10 ] && unset_lock\n\t\telse\n\t\t\tbreak\n\t\tfi\n\tdone\n}\n\n_exit() {\n\tlocal rc=$1\n\tunset_lock\n\texit ${rc}\n}\n\nfirst_type() {\n\ttype -t -p \"/bin/${1}\" -p \"/usr/bin/${1}\" -p \"${TMP_BIN_PATH}/${1}\" -p \"${1}\" \"$@\" | head -n1\n}\n\nln_start_bin() {\n\tlocal file_func=${1}\n\tlocal ln_name=${2}\n\tshift 2\n\tif [ \"${file_func%%/*}\" != \"${file_func}\" ]; then\n\t\t[ ! -L \"${file_func}\" ] && {\n\t\t\tln -s \"${file_func}\" \"${TMP_BIN_PATH}/${ln_name}\" >/dev/null 2>&1\n\t\t\tfile_func=\"${TMP_BIN_PATH}/${ln_name}\"\n\t\t}\n\t\t[ -x \"${file_func}\" ] || echolog \"$(readlink ${file_func}) 没有执行权限，无法启动：${file_func} $*\"\n\tfi\n\t#echo \"${file_func} $*\" >&2\n\t[ -x \"${file_func}\" ] || {\n\t\techolog \"找不到 ${file_func}，无法启动...\"\n\t\techolog \"-----------end------------\"\n\t\t_exit 2\n\t}\n\tulimit -n 1000000\n\t${file_func:-echolog \"  - ${ln_name}\"} \"$@\" >/dev/null 2>&1 &\n}\n\ncheck_run_environment() {\n\tlocal prefer_nft=\"$(uci_get_by_type global prefer_nft 1)\"\n\tlocal dnsmasq_info=$(dnsmasq -v 2>/dev/null)\n\tlocal dnsmasq_ver=$(echo \"$dnsmasq_info\" | sed -n '1s/.*version \\([0-9.]*\\).*/\\1/p')\n\n\tDNSMASQ_IPSET=0; [[ \"$dnsmasq_info\" == *\" ipset\"* ]] && DNSMASQ_IPSET=1\n\tDNSMASQ_NFTSET=0; [[ \"$dnsmasq_info\" == *\" nftset\"* ]] && DNSMASQ_NFTSET=1\n\tHAS_IPT=0; { command -v iptables-legacy || command -v iptables; } >/dev/null && HAS_IPT=1\n\tHAS_IPSET=$(command -v ipset >/dev/null && echo 1 || echo 0)\n\tHAS_FW4=$(command -v fw4 >/dev/null && echo 1 || echo 0)\n\tHAS_NFT=$(command -v nft >/dev/null && echo 1 || echo 0)\n\n\t# 重置 USE_TABLES\n\tUSE_TABLES=\"\"\n\n\tif [ \"$prefer_nft\" = \"1\" ]; then\n\t\techolog \"提示：优先使用 nftables...\"\n\t\tif [ \"$DNSMASQ_NFTSET\" -eq 1 ] && [ \"$HAS_NFT\" -eq 1 ] && [ \"$HAS_FW4\" -eq 1 ]; then\n\t\t\tUSE_TABLES=\"nftables\"\n\t\telif [ \"$HAS_IPSET\" -eq 1 ] && [ \"$HAS_IPT\" -eq 1 ] && [ \"$DNSMASQ_IPSET\" -eq 1 ]; then\n\t\t\techolog \"警告：nftables (fw4) 应用环境不完整，切换至 iptables。(has_fw4:$HAS_FW4/dnsmasq_nftset:$DNSMASQ_NFTSET)\"\n\t\t\tUSE_TABLES=\"iptables\"\n\t\tfi\n\telse\n\t\techolog \"提示：优先使用 iptables...\"\n\t\tif [ \"$HAS_IPSET\" -eq 1 ] && [ \"$HAS_IPT\" -eq 1 ] && [ \"$DNSMASQ_IPSET\" -eq 1 ]; then\n\t\t\tUSE_TABLES=\"iptables\"\n\t\telif [ \"$DNSMASQ_NFTSET\" -eq 1 ] && [ \"$HAS_FW4\" -eq 1 ]; then\n\t\t\techolog \"警告：iptables (fw3) 应用环境不完整，切换至 nftables。(has_ipt:$HAS_IPT/has_ipset:$HAS_IPSET/dnsmasq_ipset:$DNSMASQ_IPSET)\"\n\t\t\tUSE_TABLES=\"nftables\"\n\t\tfi\n\tfi\n\n\tif [ -n \"$USE_TABLES\" ]; then\n\t\tlocal dep_list\n\t\tlocal file_path=\"/usr/lib/opkg/info\"\n\t\tlocal file_ext=\".control\"\n\t\t[ -d \"/lib/apk/packages\" ] && { file_path=\"/lib/apk/packages\"; file_ext=\".list\"; }\n\n\t\tif [ \"$USE_TABLES\" = \"iptables\" ]; then\n\t\t\tdep_list=\"iptables-mod-tproxy iptables-mod-socket iptables-mod-iprange iptables-mod-conntrack-extra kmod-ipt-nat\"\n\t\telse\n\t\t\tdep_list=\"kmod-nft-socket kmod-nft-tproxy kmod-nft-nat\"\n\t\t\tlocal v_num=$(echo \"$dnsmasq_ver\" | tr -cd '0-9')\n\t\t\tif [ \"${v_num:-0}\" -lt 290 ]; then\n\t\t\t\techolog \"提示：Dnsmasq ($dnsmasq_ver) 低于 2.90，建议升级以增强稳定性。\"\n\t\t\tfi\n\t\tfi\n\t\tlocal pkg\n\t\tfor pkg in $dep_list; do\n\t\t\tif [ ! -s \"${file_path}/${pkg}${file_ext}\" ]; then\n\t\t\t\techolog \"警告：${USE_TABLES} 透明代理缺失基础依赖 ${pkg}！\"\n\t\t\tfi\n\t\tdone\n\telse\n\t\techolog \"警告：不满足任何透明代理系统环境。\"\n\tfi\n}\n\nadd_dns_into_ipset() {\n\tcase \"$1\" in\n\tgfw) ipset add gfwlist ${2%:*} 2>/dev/null ;;\n\toversea) ipset add oversea ${2%:*} 2>/dev/null ;;\n\t*) ipset add ss_spec_wan_ac ${2%:*} nomatch 2>/dev/null ;;\n\tesac\n}\n\nstart_dns() {\n\tlocal ssrplus_dns=\"$(uci_get_by_type global pdnsd_enable 0)\"\n\tlocal dnsproxy_dnsserver=\"$(uci_get_by_type global parse_method)\"\n\tif [ -n \"$dnsproxy_dnsserver\" ] && [ \"$dnsproxy_dnsserver\" != \"parse_file\" ]; then\n\t\tdnsserver=\"$(uci_get_by_type global dnsproxy_tunnel_forward 8.8.4.4:53)\"\n\telif [ -n \"$ssrplus_dns\" ] && [ \"$ssrplus_dns\" = \"6\" ]; then\n\t\tdnsserver=\"$(uci_get_by_type global chinadns_ng_tunnel_forward 8.8.4.4:53)\"\n\telse\n\t\tdnsserver=\"$(uci_get_by_type global tunnel_forward 8.8.4.4:53)\"\n\tfi\n\tlocal run_mode=\"$(uci_get_by_type global run_mode)\"\n\n\tif [ \"$ssrplus_dns\" != \"0\" ]; then\n\t\tif [ \"$HAS_IPSET\" -eq 1 ]; then\n\t\t\tif [ -n \"$dnsserver\" ]; then\n\t\t\t\tadd_dns_into_ipset $run_mode $dnsserver\n\t\t\tfi\n\t\tfi\n\t\tcase \"$ssrplus_dns\" in\n\t\t1)\n\t\t\tln_start_bin $(first_type dns2tcp) dns2tcp -L 127.0.0.1#$dns_port -R ${dnsserver/:/#}\n\t\t\tpdnsd_enable_flag=1\n\t\t\t;;\n\t\t2)\n\t\t\tln_start_bin $(first_type microsocks) microsocks -i 127.0.0.1 -p $tmp_dns_port ssrplus-dns\n\t\t\tln_start_bin $(first_type dns2socks) dns2socks 127.0.0.1:$tmp_dns_port $dnsserver 127.0.0.1:$dns_port -q\n\t\t\tpdnsd_enable_flag=2\n\t\t\t;;\n\t\t3)\n\t\t\tln_start_bin $(first_type microsocks) microsocks -i 127.0.0.1 -p $tmp_dns_port ssrplus-dns\n\t\t\tln_start_bin $(first_type dns2socks-rust) dns2socks-rust -s socks5://127.0.0.1:$tmp_dns_port -d $dnsserver -l 127.0.0.1:$dns_port -f -c\n\t\t\techolog \"DNS2SOCKS Rust query and cache Started!\"\n\t\t\tpdnsd_enable_flag=3\n\t\t\t;;\n\t\t4)\n\t\t\tlocal mosdns_ipv6=\"$(uci_get_by_type global mosdns_ipv6)\"\n\t\t\tlocal mosdns_dnsserver=\"$(uci_get_by_type global tunnel_forward_mosdns)\"\n\t\t\toutput=$(for i in $(echo $mosdns_dnsserver | sed \"s/,/ /g\"); do\n\t\t\t\tdnsserver=${i%:*}\n\t\t\t\tdnsserver=${i##*/}\n\t\t\t\tif [ \"$HAS_IPSET\" -eq 1 ]; then\n\t\t\t\t\tadd_dns_into_ipset $run_mode $dnsserver\n\t\t\t\tfi\n\t\t\t\techo \"            - addr: $i\"\n\t\t\t\techo \"              enable_pipeline: true\"\n\t\t\tdone)\n\n\t\t\tawk -v line=14 -v text=\"$output\" 'NR == line+1 {print text} 1' /etc/ssrplus/mosdns-config.yaml | sed \"s/DNS_PORT/$dns_port/g\" | sed \"s/\\(concurrent:\\).*/\\1 $(echo \"$mosdns_dnsserver\" | sed 's/,/ /g' | wc -w)/g\"> $TMP_PATH/mosdns-config.yaml\n\t\t\tif [ \"$mosdns_ipv6\" == \"0\" ]; then\n\t\t\t\tsed -i \"s/DNS_MODE/main_sequence_with_IPv6/g\" $TMP_PATH/mosdns-config.yaml\n\t\t\telse\n\t\t\t\tsed -i \"s/DNS_MODE/main_sequence_disable_IPv6/g\" $TMP_PATH/mosdns-config.yaml\n\t\t\tfi\n\t\t\tln_start_bin $(first_type mosdns) mosdns start -c $TMP_PATH/mosdns-config.yaml\n\t\t\tpdnsd_enable_flag=4\n\t\t\t;;\n\t\t5)\n\t\t\tdnsproxy_ipv6=\"$(uci_get_by_type global dnsproxy_ipv6)\"\n\t\t\tif [ \"$dnsproxy_ipv6\" -eq \"1\" ]; then\n\t\t\t\tdisabled_ipv6=\"--ipv6-disabled\"\n\t\t\tfi\n\t\t\tif [ \"$dnsproxy_dnsserver\" != \"parse_file\" ]; then\n\t\t\t\tln_start_bin $(first_type dnsproxy) dnsproxy -l 127.0.0.1 -p $tmp_dns_port  -p $dns_port -u $dnsserver $disabled_ipv6 --cache --cache-min-ttl=3600\n\t\t\telse\n\t\t\t\tdnsproxy_dnsserver_file=\"$TMP_PATH/dnsproxy_dns.list\"\n\t\t\t\tcleaned_file=\"$TMP_PATH/cleaned_dns.list\"\n\t\t\t\ttemp_file=\"$TMP_PATH/temp_dns.list\"\n\t\t\t\t> \"$cleaned_file\"\n\t\t\t\t# 清理输入文件并去重\n\t\t\t\twhile IFS= read -r line || [ -n \"$line\" ]; do\n\t\t\t\t    line=$(echo \"$line\" | sed -E 's/^[ \\t\\r]+//; s/[ \\t\\r]+$//')\n\t\t\t\t\t[ -z \"$line\" ] && continue\n\t\t\t\t\techo \"$line\" | grep -qE '^#' && continue\n\t\t\t\t\techo \"$line\" >> \"$cleaned_file\"\n\t\t\t\tdone < \"/etc/ssrplus/dnsproxy_dns.list\"\n\t\t\t\t# 获取清理后文件的MD5\n\t\t\t\tcleaned_md5=$(md5sum \"$cleaned_file\" | awk '{print $1}')\n\t\t\t\tif [ ! -f \"$dnsproxy_dnsserver_file\" ]; then\n\t\t\t\t    cp \"$cleaned_file\" \"$dnsproxy_dnsserver_file\"\n\t\t\t\telse\n\t\t\t\t    target_md5=$(md5sum \"$dnsproxy_dnsserver_file\" | awk '{print $1}')\n\t\t\t\t\tif [ \"$cleaned_md5\" != \"$target_md5\" ]; then\n\t\t\t\t\t    > \"$temp_file\"\n\t\t\t\t\t    # 保留目标文件中也存在于清理文件的记录（去重）\n\t\t\t\t\t    while IFS= read -r line; do\n\t\t\t\t\t\t    line=$(echo \"$line\" | sed -E 's/^[ \\t\\r]+//; s/[ \\t\\r]+$//')\n\t\t\t\t\t\t    if grep -qixF \"$line\" \"$cleaned_file\" && ! grep -qixF \"$line\" \"$temp_file\"; then\n\t\t\t\t\t\t\t    echo \"$line\" >> \"$temp_file\"\n\t\t\t\t\t\t    fi\n\t\t\t\t\t\tdone < \"$dnsproxy_dnsserver_file\"\n\t\t\t\t\t\t# 添加清理文件中有但目标文件没有的记录（去重）\n\t\t\t\t\t\twhile IFS= read -r line; do\n\t\t\t\t\t\t    line=$(echo \"$line\" | sed -E 's/^[ \\t\\r]+//; s/[ \\t\\r]+$//')\n\t\t\t\t\t\t\tif ! grep -qixF \"$line\" \"$temp_file\"; then\n\t\t\t\t\t\t\t    echo \"$line\" >> \"$temp_file\"\n\t\t\t\t\t\t\tfi\n\t\t\t\t\t\tdone < \"$cleaned_file\"\n\t\t\t\t\t\ttemp_md5=$(md5sum \"$temp_file\" | awk '{print $1}')\n\t\t\t\t\t\tif [ \"$temp_md5\" != \"$target_md5\" ]; then\n\t\t\t\t\t\t    mv \"$temp_file\" \"$dnsproxy_dnsserver_file\"\n\t\t\t\t\t\telse\n\t\t\t\t\t\t    rm -f \"$temp_file\"\n\t\t\t\t\t\tfi\n\t\t\t\t\tfi\n\t\t\t\tfi\n\t\t\t\trm -f \"$cleaned_file\"\n\n\t\t\t\tif [ -n \"$dnsproxy_dnsserver_file\" ] && [ -s \"$dnsproxy_dnsserver_file\" ]; then\n\t\t\t\t\tlocal upstreams_logic_mode=\"$(uci_get_by_type global upstreams_logic_mode)\"\n\t\t\t\t\tln_start_bin $(first_type dnsproxy) dnsproxy -l 127.0.0.1 -p $tmp_dns_port  -p $dns_port -u $dnsproxy_dnsserver_file $disabled_ipv6 --cache --cache-min-ttl=3600 --upstream-mode=$upstreams_logic_mode\n\t\t\t\tfi\n\t\t\tfi\n\t\t\techolog \"DNSPROXY query and cache Started!\"\n\t\t\tpdnsd_enable_flag=5\n\t\t\t;;\n\t\t6)\n\t\t\tlocal chinadns_ng_proto=\"$(uci_get_by_type global chinadns_ng_proto)\"\n\t\t\tlocal chinadns_ng_dns=\"\"\n\t\t\t# 遍历每个 DNS 服务器\n\t\t\tIFS=','  # 设置分隔符为逗号\n\t\t\tfor chinadns_ng_server in $dnsserver; do\n\t\t\t\t# 处理单个服务器地址\n\t\t\t\tlocal chinadns_ng_ip=\"${chinadns_ng_server%%:*}\"\n\t\t\t\tlocal chinadns_ng_port=\"${chinadns_ng_server##*:}\"\n\t\t\t\t[ \"$chinadns_ng_ip\" = \"$chinadns_ng_port\" ] && chinadns_ng_port=\"53\"\n\t\t\t\tchinadns_ng_tls_port=\"853\"\n\t\t\t\t# 根据协议类型格式化服务器地址\n\t\t\t\tcase \"$chinadns_ng_proto\" in\n\t\t\t\t\t\"none\")\n            \t\t\t\t\tchinadns_ng_server=\"${chinadns_ng_ip}#${chinadns_ng_port}\"\n            \t\t\t\t\t;;\n\t\t\t\t\t\"tls\")\n            \t\t\t\t\tchinadns_ng_server=\"${chinadns_ng_proto}://${chinadns_ng_ip}#${chinadns_ng_tls_port}\"\n            \t\t\t\t\t;;\n\t\t\t\t\t*)\n            \t\t\t\t\tchinadns_ng_server=\"${chinadns_ng_proto}://${chinadns_ng_ip}#${chinadns_ng_port}\"\n            \t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\t\t# 添加到参数列表\n\t\t\t\tchinadns_ng_dns=\"${chinadns_ng_dns} -t ${chinadns_ng_server}\"\n\t\t\tdone\n\t\t\tunset IFS  # 恢复默认分隔符\n\t\t\tdnsserver=\"$chinadns_ng_dns\"\n\t\t\tln_start_bin $(first_type chinadns-ng) chinadns-ng -b 127.0.0.1 -l $tmp_dns_port -l $dns_port -p 3 -d gfw $dnsserver -N --filter-qtype 64,65 -f -r --cache 4096 --cache-stale 86400 --cache-refresh 20\n\t\t\techolog \"ChinaDNS-NG query and cache Started!\"\n\t\t\tpdnsd_enable_flag=6\n\t\t\t;;\n\t\tesac\n\n\t\tif [ \"$run_mode\" = \"router\" ]; then\n\t\t\tlocal chinadns=\"$(uci_get_by_type global chinadns_forward)\"\n\t\t\tif [ -n \"$chinadns\" ]; then\n\t\t\t\tlocal wandns=\"$(ifstatus wan | jsonfilter -e '@[\"dns-server\"][0]' || echo \"119.29.29.29\")\"\n\t\t\t\tcase \"$chinadns\" in\n\t\t\t\t\"wan\") chinadns=\"$wandns\" ;;\n\t\t\t\t\"wan_114\") chinadns=\"$wandns,114.114.114.114\" ;;\n\t\t\t\tesac\n\n\t\t\t\tln_start_bin $(first_type chinadns-ng) chinadns-ng -l $china_dns_port -4 china -p 3 -c ${chinadns/:/#} -t 127.0.0.1#$dns_port -N -f -r\n\n\t\t\t\tcat <<-EOF >> \"$TMP_DNSMASQ_PATH/chinadns_fixed_server.conf\"\n\t\t\t\t\tno-poll\n\t\t\t\t\tno-resolv\n\t\t\t\t\tserver=127.0.0.1#$china_dns_port\n\t\t\t\tEOF\n\t\t\tfi\n\t\tfi\n\tfi\n\n\tif [ \"$(uci_get_by_type global apple_optimization 1)\" == \"1\" ]; then\n\t\tlocal new_appledns=\"$(uci_get_by_type global apple_dns)\"\n\t\tif [ -n \"$new_appledns\" ]; then\t\t\n\t\t\tsed -i 's/[[:space:]]//g' /etc/ssrplus/applechina.conf #去除所有空白字符\n\t\t\tlocal old_appledns=$(grep -oE '[0-9]+\\.[0-9]+\\.[0-9]+\\.[0-9]+' /etc/ssrplus/applechina.conf | sort -u)\n\t\t\tif [ -n \"$old_appledns\" ] && [ \"$old_appledns\" != \"$new_appledns\" ]; then\n\t\t\t\tsed -i \"s,$(printf '%s' \"$old_appledns\"),$(printf '%s' \"$new_appledns\"),g\" /etc/ssrplus/applechina.conf\n\t\t\tfi\n\t\tfi\n\t\techolog \"Apple 域名中国大陆 CDN 的 优化规则正在加载。\"\n\t\tcp -f /etc/ssrplus/applechina.conf $TMP_DNSMASQ_PATH/\n\t\techolog \"Apple 域名中国大陆 CDN 的 优化规则加载完毕。\"\n\tfi\n}\n\ngen_service_file() { #1-server.type 2-cfgname 3-file_path\n\tlocal fastopen\n\tif [ $(uci_get_by_name $2 fast_open) == \"1\" ]; then\n\t\tfastopen=\"true\"\n\telse\n\t\tfastopen=\"false\"\n\tfi\n\tcase $1 in\n\t\tssr)\n\t\tcat <<-EOF >$3\n\t\t\t{\n\t\t\t\t\"server\": \"0.0.0.0\",\n\t\t\t\t\"server_ipv6\": \"::\",\n\t\t\t\t\"server_port\": $(uci_get_by_name $2 server_port),\n\t\t\t\t\"mode\": \"tcp_and_udp\",\n\t\t\t\t\"password\": \"$(uci_get_by_name $2 password)\",\n\t\t\t\t\"timeout\": $(uci_get_by_name $2 timeout 60),\n\t\t\t\t\"method\": \"$(uci_get_by_name $2 encrypt_method)\",\n\t\t\t\t\"protocol\": \"$(uci_get_by_name $2 protocol)\",\n\t\t\t\t\"protocol_param\": \"$(uci_get_by_name $2 protocol_param)\",\n\t\t\t\t\"obfs\": \"$(uci_get_by_name $2 obfs)\",\n\t\t\t\t\"obfs_param\": \"$(uci_get_by_name $2 obfs_param)\",\n\t\t\t\t\"fast_open\": $fastopen\n\t\t\t}\n\t\t\tEOF\n\t\t;;\n\t\tss)\n\t\t\tcat <<-EOF >$3\n\t\t\t\t{\n\t\t\t\t\t\"server\": \"0.0.0.0\",\n\t\t\t\t\t\"server_ipv6\": \"::\",\n\t\t\t\t\t\"server_port\": $(uci_get_by_name $2 server_port),\n\t\t\t\t\t\"mode\": \"tcp_and_udp\",\n\t\t\t\t\t\"password\": \"$(uci_get_by_name $2 password)\",\n\t\t\t\t\t\"timeout\": $(uci_get_by_name $2 timeout 60),\n\t\t\t\t\t\"method\": \"$(uci_get_by_name $2 encrypt_method_ss)\",\n\t\t\t\t\t\"protocol\": \"socks\",\n\t\t\t\t\t\"fast_open\": $fastopen\n\t\t\t\t}\n\t\t\tEOF\n\t\t;;\n\tesac\n}\n\nget_name() {\n\tcase \"$1\" in\n\tss) echo \"ShadowSocks\" ;;\n\tssr) echo \"ShadowsocksR\" ;;\n\tesac\n}\n\ngen_config_file() { #server1 type2 code3 local_port4 socks_port5 chain6 threads5\n\tcase \"$3\" in\n\t1)\n\t\tconfig_file=$tcp_config_file\n\t\tchain_config_file=$(echo ${config_file}|sed 's/ssrplus\\//ssrplus\\/chain-/')\n\t\t;;\n\t2)\n\t\tconfig_file=$udp_config_file\n\t\tchain_config_file=$(echo ${config_file}|sed 's/ssrplus\\//ssrplus\\/chain-/')\n\t\t;;\n\t3)\n\t\tif [ -n \"$tmp_local_port\" ]; then\n\t\t\tlocal tmp_port=$tmp_local_port\n\t\telse\n\t\t\tlocal tmp_port=$tmp_shunt_local_port\n\t\tfi\n\t\tconfig_file=$shunt_config_file\n\t\tchain_config_file=$(echo ${config_file}|sed 's/ssrplus\\//ssrplus\\/chain-/')\n\t\t;;\n\t4)\n\t\tlocal ss_protocol=\"socks\"\n\t\tconfig_file=$local_config_file\n\t\tchain_config_file=$(echo ${config_file}|sed 's/ssrplus\\//ssrplus\\/chain-/')\n\t\t;;\n\tesac\n\tcase \"$2\" in\n\tss | ssr)\n\t\tlua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 ${ss_protocol:-redir} >$config_file\n\t\tif [ \"$3\" == \"3\" ]; then\n\t\t\tlua /usr/share/shadowsocksr/gen_config.lua $1 $mode $tmp_port socks >$shunt_dns_config_file\n\t\tfi\n\t\t;;\n\tv2ray)\n\t\tlua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 $5 >$config_file\n\t\t;;\n\ttrojan)\n\t\tcase \"$3\" in\n\t\t1)\n\t\t\tlua /usr/share/shadowsocksr/gen_config.lua $1 nat $4 >$config_file\n\t\t\t;;\n\t\t2)\n\t\t\tlua /usr/share/shadowsocksr/gen_config.lua $1 client $4 >$config_file\n\t\t\t;;\n\t\t3)\n\t\t\tlua /usr/share/shadowsocksr/gen_config.lua $1 nat $4 >$config_file\n\t\t\tlua /usr/share/shadowsocksr/gen_config.lua $1 client $tmp_port >$shunt_dns_config_file\n\t\t\t;;\n\t\t4)\n\t\t\tlua /usr/share/shadowsocksr/gen_config.lua $1 client $4 >$config_file\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tnaiveproxy)\n\t\tcase \"$3\" in\n\t\t1)\n\t\t\tlua /usr/share/shadowsocksr/gen_config.lua $1 redir $4 >$config_file\n\t\t\t;;\n\t\t3)\n\t\t\tlua /usr/share/shadowsocksr/gen_config.lua $1 redir $4 >$config_file\n\t\t\tlua /usr/share/shadowsocksr/gen_config.lua $1 socks $tmp_port >$shunt_dns_config_file\n\t\t\t;;\n\t\t4)\n\t\t\tlua /usr/share/shadowsocksr/gen_config.lua $1 socks $4 >$config_file\n\t\t\t;;\n\t\tesac\n\t\t;;\n\thysteria2)\n\t\tlua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 $5 >$config_file\n\t\t;;\n\ttuic)\n\t\tcase \"$3\" in\n\t\t1|2|4)\n\t\t\tlua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 >$config_file\n\t\t\t;;\n\t\t3)\n\t\t\t[ -z \"$6\" ] && lua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 >$shunt_dns_config_file || lua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 >$config_file\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tshadowtls)\n\t\tcase \"$3\" in\n\t\t1|2|4)\n\t\t\t[ -z \"$6\" ] && lua /usr/share/shadowsocksr/gen_config.lua $1 $type $4 >$chain_config_file || lua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 $5 $6 >$config_file\n\t\t\t;;\n\t\t3)\n\t\t\tlua /usr/share/shadowsocksr/gen_config.lua $1 $type $4 >$chain_config_file\n\t\t\tlua /usr/share/shadowsocksr/gen_config.lua $1 $mode $4 $5 $6 >$config_file\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tsocks5)\n\t\t/usr/share/shadowsocksr/genred2config.sh $config_file $2 $mode $4 \\\n\t\t\t\"$(uci_get_by_name $1 server)\" \\\n\t\t\t\"$(uci_get_by_name $1 server_port)\" \\\n\t\t\t\"$(uci_get_by_name $1 auth_enable 0)\" \\\n\t\t\t\"$(uci_get_by_name $1 username)\" \\\n\t\t\t\"$(uci_get_by_name $1 password)\"\n\t\t;;\n\ttun)\n\t\t/usr/share/shadowsocksr/genred2config.sh $config_file $2 $(uci_get_by_name $1 iface \"br-lan\") $4\n\t\t;;\n\tesac\n\tsed -i 's/\\\\//g' $TMP_PATH/*-ssr-*.json #>/dev/null > 2>&1\n}\n\nstart_udp() {\n\tlocal udp_relay_server_type=$(uci_get_by_name $UDP_RELAY_SERVER type)\n\tlocal type=$udp_relay_server_type\n\tif [ \"$udp_relay_server_type\" = \"ss-rust\" ] || [ \"$udp_relay_server_type\" = \"ss-libev\" ]; then\n\t\ttype=\"ss\"\n\tfi\n\tredir_udp=1\n\tcase \"$type\" in\n\tss | ssr)\n\t\tgen_config_file $UDP_RELAY_SERVER $type 2 $tmp_udp_port\n\t\tif [ \"$udp_relay_server_type\" = \"ss-libev\" ] || [ \"$udp_relay_server_type\" = \"ssr\" ]; then\n\t\t\tss_program=\"$(first_type ${type}-redir)\"\n\t\telif [ \"$udp_relay_server_type\" = \"ss-rust\" ]; then\n\t\t\tss_program=\"$(first_type ${type}local)\"\n\t\tfi\n\t\techolog \"$(get_name $type) program is: $ss_program\"\n\t\t# 获取当前软链接指向的执行文件路径\n\t\told_ss_program=$(readlink -f \"$TMP_PATH/bin/${type}-redir\" 2>/dev/null)\n\t\t# **当新旧执行文件路径不同时，删除旧链接**\n\t\tif [ \"$old_ss_program\" != \"$ss_program\" ]; then\n\t\t\trm -rf \"$TMP_PATH/bin/${type}-redir\"\n\t\tfi\n\t\tln_start_bin $ss_program ${type}-redir -c $udp_config_file\n\t\techolog \"UDP TPROXY Relay:$(get_name $type) Started!\"\n\t\t;;\n\tv2ray)\n\t\tgen_config_file $UDP_RELAY_SERVER $type 2 $tmp_udp_port\n\t\tln_start_bin $(first_type xray v2ray) v2ray run -c $udp_config_file\n\t\techolog \"UDP TPROXY Relay:$($(first_type \"xray\" \"v2ray\") version | head -1) Started!\"\n\t\t;;\n\ttrojan) #client\n\t\tgen_config_file $UDP_RELAY_SERVER $type 2 $tmp_udp_local_port\n\t\tln_start_bin $(first_type trojan) $type --config $udp_config_file\n\t\tln_start_bin $(first_type ipt2socks) ipt2socks -U -b 0.0.0.0 -4 -s 127.0.0.1 -p $tmp_udp_local_port -l $tmp_udp_port\n\t\techolog \"UDP TPROXY Relay:$($(first_type trojan) --version 2>&1 | head -1) Started!\"\n\t\t;;\n\tnaiveproxy)\n\t\techolog \"NaïveProxy UDP TPROXY Relay not supported!\"\n\t\tredir_udp=0\n\t\tARG_UDP=\"\"\n\t\t;;\n\thysteria2)\n\t\tgen_config_file $UDP_RELAY_SERVER $type 2 $tmp_udp_port\n\t\tln_start_bin $(first_type hysteria) hysteria client --config $udp_config_file\n\t\techolog \"UDP TPROXY Relay:$($(first_type \"hysteria\") version | grep Version | awk '{print \"Hysteria2: \" $2}') Started!\"\n\t\t;;\n\ttuic)\n\t\t# FIXME: ipt2socks cannot handle udp reply from tuic\n\t\t# 20230726 uncomment following 4 lines\n\t\tgen_config_file $UDP_RELAY_SERVER $type 2 $tmp_udp_local_port\n\t\tln_start_bin $(first_type tuic-client) tuic-client --config $udp_config_file\n\t\tln_start_bin $(first_type ipt2socks) ipt2socks -U -b 0.0.0.0 -4 -s 127.0.0.1 -p $tmp_udp_local_port -l $tmp_udp_port\n\t\techolog \"UDP TPROXY Relay:$($(first_type tuic-client) --version) Started!\"\n\t\techolog \"TUIC UDP TPROXY Relay not supported!\"\n\t\t#redir_udp=0\n\t\t#ARG_UDP=\"\"\n\t\t;;\n\tshadowtls)\n\t\tgen_config_file $UDP_RELAY_SERVER $type 2 ${tmp_udp_local_port}\n\t\tgen_config_file $UDP_RELAY_SERVER $type 2 ${tmp_udp_local_port} 0 chain\n\t\tln_start_bin $(first_type shadow-tls) shadow-tls config --config $chain_config_file\n\t\tlocal chain_type=$(uci_get_by_name $UDP_RELAY_SERVER chain_type)\n\t\tcase ${chain_type} in\n\t\tvmess)\n\t\t\tln_start_bin $(first_type xray v2ray) v2ray run -c $udp_config_file\n\t\t\techolog \"UDP TPROXY Relay:shadow-tls chain-to $($(first_type xray) --version) Started!\"\n\t\t\t;;\n\t\tsslocal)\n\t\t\tln_start_bin $(first_type sslocal) sslocal -c $udp_config_file\n\t\t\techolog \"UDP TPROXY Relay:shadow-tls chain-to $($(first_type sslocal) --version) Started!\"\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tsocks5)\n\t\t# if [ \"$(uci_get_by_name $UDP_RELAY_SERVER auth_enable 0)\" == \"1\" ]; then\n\t\t# \tlocal auth=\"-a $(uci_get_by_name $UDP_RELAY_SERVER username) -k $(uci_get_by_name $UDP_RELAY_SERVER password)\"\n\t\t# fi\n\t\t# ln_start_bin $(first_type ipt2socks) ipt2socks $udp_config_file -U -4 -s $(uci_get_by_name $UDP_RELAY_SERVER server) -p $(uci_get_by_name $UDP_RELAY_SERVER server_port) -l $tmp_udp_port $auth\n\t\tgen_config_file $UDP_RELAY_SERVER $type 2 $tmp_udp_port\n\t\tln_start_bin $(first_type redsocks2) redsocks2 -c $udp_config_file\n\t\techolog \"UDP TPROXY Relay:Socks5 REDIRECT/TPROXY Started!\"\n\t\t;;\n\ttun)\n\t\techolog \"Network Tunnel UDP TPROXY Relay not supported!\"\n\t\tredir_udp=0\n\t\tARG_UDP=\"\"\n\t\t;;\n\tesac\n}\n\nshunt_dns_command() {\n\tlocal shunt_dns_mode=\"$(uci_get_by_type global shunt_dns_mode)\"\n\tlocal shunt_dnsproxy_dnsserver=\"$(uci_get_by_type global shunt_parse_method)\"\n\tif [ -n \"$shunt_dnsproxy_dnsserver\" ] && [ \"$shunt_dnsproxy_dnsserver\" != \"parse_file\" ]; then\n\t\tshunt_dnsserver=\"$(uci_get_by_type global dnsproxy_shunt_forward 8.8.4.4:53)\"\n\telif [ -n \"shunt_dns_mode\" ] && [ \"$shunt_dns_mode\" = \"5\" ]; then\n\t\tshunt_dnsserver=\"$(uci_get_by_type global chinadns_ng_shunt_dnsserver 8.8.4.4:53)\"\n\telse\n\t\tshunt_dnsserver=\"$(uci_get_by_type global shunt_dnsserver 8.8.4.4:53)\"\n\tfi\n\tlocal tmp_port=$1\n\tcase \"$shunt_dns_mode\" in\n\t1)\n\t\tln_start_bin $(first_type dns2socks) dns2socks 127.0.0.1:$tmp_port $shunt_dnsserver 127.0.0.1:$tmp_shunt_dns_port -q\n\t\t;;\n\t2)\n\t\tln_start_bin $(first_type dns2socks-rust) dns2socks-rust -s socks5://127.0.0.1:$tmp_port -d $shunt_dnsserver -l 127.0.0.1:$tmp_shunt_dns_port -f -c\n\t\techolog \"DNS2SOCKS Rust Shunt query Started!\"\n\t\t;;\n\t3)\n\t\tlocal shunt_mosdns_ipv6=\"$(uci_get_by_type global shunt_mosdns_ipv6)\"\n\t\tlocal shunt_mosdns_dnsserver=\"$(uci_get_by_type global shunt_mosdns_dnsserver)\"\n\t\toutput=$(for i in $(echo $shunt_mosdns_dnsserver | sed \"s/,/ /g\"); do\n\t\t\techo \"            - addr: $i\"\n\t\t\techo \"              socks5: \\\"127.0.0.1:$tmp_port\\\"\"\n\t\t\techo \"              enable_pipeline: true\"\n\t\tdone)\n\t\tawk -v line=14 -v text=\"$output\" 'NR == line+1 {print text} 1' /etc/ssrplus/mosdns-config.yaml | sed \"s/DNS_PORT/$tmp_shunt_dns_port/g\" | sed \"s/\\(concurrent:\\).*/\\1 $(echo \"$mosdns_dnsserver\" | sed 's/,/ /g' | wc -w)/g\" > $TMP_PATH/mosdns-config-shunt.yaml\n\n\t\tif [ \"$shunt_mosdns_ipv6\" == \"0\" ]; then\n\t\t\tsed -i \"s/DNS_MODE/main_sequence_with_IPv6/g\" $TMP_PATH/mosdns-config-shunt.yaml\n\t\telse\n\t\t\tsed -i \"s/DNS_MODE/main_sequence_disable_IPv6/g\" $TMP_PATH/mosdns-config-shunt.yaml\n\t\tfi\n\t\tln_start_bin $(first_type mosdns) mosdns start -c $TMP_PATH/mosdns-config-shunt.yaml\n\t\t;;\n\t4)\n\t\tshunt_dnsproxy_ipv6=\"$(uci_get_by_type global shunt_dnsproxy_ipv6)\"\n\t\tif [ \"$shunt_dnsproxy_ipv6\" -eq \"1\" ]; then\n\t\t\tshunt_disabled_ipv6=\"--ipv6-disabled\"\n\t\tfi\n\t\tif [ \"$shunt_dnsproxy_dnsserver\" != \"parse_file\" ]; then\n\t\t\tln_start_bin $(first_type dnsproxy) dnsproxy -l 127.0.0.1 -p $tmp_port -p $tmp_shunt_dns_port -u $shunt_dnsserver $shunt_disabled_ipv6 --cache --cache-min-ttl=3600\n\t\telse\n\t\t\tshunt_dnsproxy_dnsserver_file=\"$TMP_PATH/dnsproxy_dns.list\"\n\t\t\tcleaned_file=\"$TMP_PATH/cleaned_dns_servers.list\"\n\t\t\ttemp_file=\"$TMP_PATH/temp_dns_servers.list\"\n\t\t\t> \"$cleaned_file\"\n\t\t\t# 清理输入文件并去重\n\t\t\twhile IFS= read -r line || [ -n \"$line\" ]; do\n\t\t\t    line=$(echo \"$line\" | sed -E 's/^[ \\t\\r]+//; s/[ \\t\\r]+$//')\n\t\t\t\t[ -z \"$line\" ] && continue\n\t\t\t\techo \"$line\" | grep -qE '^#' && continue\n\t\t\t\techo \"$line\" >> \"$cleaned_file\"\n\t\t\tdone < \"/etc/ssrplus/dnsproxy_dns.list\"\n\t\t\t# 获取清理后文件的MD5\n\t\t\tcleaned_md5=$(md5sum \"$cleaned_file\" | awk '{print $1}')\n\t\t\tif [ ! -f \"$shunt_dnsproxy_dnsserver_file\" ]; then\n\t\t\t    cp \"$cleaned_file\" \"$shunt_dnsproxy_dnsserver_file\"\n\t\t\telse\n\t\t\t    target_md5=$(md5sum \"$shunt_dnsproxy_dnsserver_file\" | awk '{print $1}')\n\t\t\t\tif [ \"$cleaned_md5\" != \"$target_md5\" ]; then\n\t\t\t\t    > \"$temp_file\"\n\t\t\t\t\t# 保留目标文件中也存在于清理文件的记录（去重）\n\t\t\t\t\twhile IFS= read -r line; do\n\t\t\t\t\t    line=$(echo \"$line\" | sed -E 's/^[ \\t\\r]+//; s/[ \\t\\r]+$//')\n\t\t\t\t\t\tif grep -qixF \"$line\" \"$cleaned_file\" && ! grep -qixF \"$line\" \"$temp_file\"; then\n\t\t\t\t\t\t    echo \"$line\" >> \"$temp_file\"\n\t\t\t\t\t\tfi\n\t\t\t\t\tdone < \"$shunt_dnsproxy_dnsserver_file\"\n\t\t\t\t\t# 添加清理文件中有但目标文件没有的记录（去重）\n\t\t\t\t\twhile IFS= read -r line; do\n\t\t\t\t\t    line=$(echo \"$line\" | sed -E 's/^[ \\t\\r]+//; s/[ \\t\\r]+$//')\n\t\t\t\t\t\tif ! grep -qixF \"$line\" \"$temp_file\"; then\n\t\t\t\t\t\t    echo \"$line\" >> \"$temp_file\"\n\t\t\t\t\t\tfi\n\t\t\t\t\tdone < \"$cleaned_file\"\n\t\t\t\t\ttemp_md5=$(md5sum \"$temp_file\" | awk '{print $1}')\n\t\t\t\t\tif [ \"$temp_md5\" != \"$target_md5\" ]; then\n\t\t\t\t\t    mv \"$temp_file\" \"$shunt_dnsproxy_dnsserver_file\"\n\t\t\t\t\telse\n\t\t\t\t\t\trm -f \"$temp_file\"\n\t\t\t\t\tfi\n\t\t\t\tfi\n\t\t\tfi\n\t\t\trm -f \"$cleaned_file\"\n\t\t\t\n\t\t\tif [ -n \"$shunt_dnsproxy_dnsserver_file\" ] && [ -s \"$shunt_dnsproxy_dnsserver_file\" ]; then\n\t\t\t\tlocal shunt_upstreams_logic_mode=\"$(uci_get_by_type global shunt_upstreams_logic_mode)\"\n\t\t\t\tln_start_bin $(first_type dnsproxy) dnsproxy -l 127.0.0.1 -p $tmp_port -p $tmp_shunt_dns_port -u $shunt_dnsproxy_dnsserver_file $shunt_disabled_ipv6 --cache --cache-min-ttl=3600 --upstream-mode=$shunt_upstreams_logic_mode\n\t\t\tfi\n\t\tfi\n\t\techolog \"DNSPROXY shunt query and cache Started!\"\n\t\t;;\n\t5)\n\t\tlocal chinadns_ng_shunt_proto=\"$(uci_get_by_type global chinadns_ng_shunt_proto)\"\n\t\tlocal chinadns_ng_shunt_dns=\"\"\n\t\t# 遍历每个 DNS 服务器\n\t\tIFS=','  # 设置分隔符为逗号\n\t\tfor chinadns_ng_shunt_server in $shunt_dnsserver; do\n\t\t\t# 处理单个服务器地址\n\t\t\tlocal chinadns_ng_shunt_ip=\"${chinadns_ng_shunt_server%%:*}\"\n\t\t\tlocal chinadns_ng_shunt_port=\"${chinadns_ng_shunt_server##*:}\"\n\t\t\t[ \"$chinadns_ng_shunt_ip\" = \"$chinadns_ng_shunt_port\" ] && chinadns_ng_shunt_port=\"53\"\n\t\t\tchinadns_ng_shunt_tls_port=\"853\"\n\t\t\t# 根据协议类型格式化服务器地址\n\t\t\tcase \"$chinadns_ng_shunt_proto\" in\n\t\t\t\t\"none\")\n            \t\t\t\tchinadns_ng_shunt_server=\"${chinadns_ng_shunt_ip}#${chinadns_ng_shunt_port}\"\n            \t\t\t\t;;\n\t\t\t\t\"tls\")\n            \t\t\t\tchinadns_ng_shunt_server=\"${chinadns_ng_shunt_proto}://${chinadns_ng_shunt_ip}#${chinadns_ng_shunt_tls_port}\"\n            \t\t\t\t;;\n\t\t\t\t*)\n            \t\t\t\tchinadns_ng_shunt_server=\"${chinadns_ng_shunt_proto}://${chinadns_ng_shunt_ip}#${chinadns_ng_shunt_port}\"\n            \t\t\t\t;;\n\t\t\tesac\n\t\t\t# 添加到参数列表\n\t\t\tchinadns_ng_shunt_dns=\"${chinadns_ng_shunt_dns} -t ${chinadns_ng_shunt_server}\"\n\t\tdone\n\t\tunset IFS  # 恢复默认分隔符\n\t\tshunt_dnsserver=\"$chinadns_ng_shunt_dns\"\n\t\t# 启动 chinadns-ng\n\t\tln_start_bin $(first_type chinadns-ng) chinadns-ng -b 127.0.0.1 -l $tmp_port -l $tmp_shunt_dns_port -p 3 -d gfw $shunt_dnsserver -N --filter-qtype 64,65 -f -r --cache 4096 --cache-stale 86400 --cache-refresh 20\n\t\techolog \"ChinaDNS-NG shunt query and cache Started!\"\n\t\t;;\n\tesac\n}\n\nshunt_dns_config_file_port() {\n    if [ \"$LOCAL_SERVER\" == \"$SHUNT_SERVER\" ]; then\n        # NetFlix 和 全局socks 节点相同\n        if [ \"$(uci_get_by_type socks5_proxy socks5_auth nil)\" != \"noauth\" ]; then\n            # 全局socks 有密码，NetFlix 不能使用 auth 验证，需更换为新端口并使用无密码的 socks 配置用于分流\n            # 新增NetFlix dns 使用端口\n            local port=$tmp_shunt_local_port\n            jq --arg port \"$port\" '.inbounds |= .[0:1] + [{\"protocol\":\"socks\",\"port\":($port | tonumber),\"settings\":{\"udp\":true,\"auth\":\"noauth\"}}] + .[1:]' \"$shunt_config_file\" > \"$shunt_config_file.tmp\" && mv \"$shunt_config_file.tmp\" $shunt_config_file\n            echo $port  # 返回端口号\n            return 0  # 成功返回\n        else\n            sed -i -e '/\"mixed\"/d' $shunt_config_file\n        fi\n    else\n        # NetFlix 和 全局 socks 节点不相同\n        if [ \"$(uci_get_by_type socks5_proxy socks5_auth nil)\" != \"noauth\" ]; then\n            # 全局socks 有密码，NetFlix不能使用auth验证，需设置为无密码的socks配置用于分流\n            # 删除 NetFlix dns 端口密码验证\n            sed -i \\\n                   -e '/\"mixed\"/d' \\\n                   -e 's/\"auth\"\\s*:\\s*\"password\"/\\\"auth\\\": \\\"noauth\\\"/g' \\\n                   -e '/\"accounts\": \\[/,/\\]/d' $shunt_config_file\n        else\n            sed -i -e '/\"mixed\"/d' $shunt_config_file\n        fi\n    fi\n    # 使用传入的端口\n    echo $1  # 返回传入的端口号\n    return 0  # 成功返回\n}\n\nstart_shunt() {\n\tlocal shunt_server_type=$(uci_get_by_name $SHUNT_SERVER type)\n\tlocal type=$shunt_server_type\n\tif [ \"$shunt_server_type\" = \"ss-rust\" ] || [ \"$shunt_server_type\" = \"ss-libev\" ]; then\n\t\ttype=\"ss\"\n\tfi\n\tcase \"$type\" in\n\tss | ssr)\n\t\tgen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port\n\t\tif [ \"$shunt_server_type\" = \"ss-libev\" ] || [ \"$shunt_server_type\" = \"ssr\" ]; then\n\t\t\tss_program=\"$(first_type ${type}-redir)\"\n\t\telif [ \"$shunt_server_type\" = \"ss-rust\" ]; then\n\t\t\tss_program=\"$(first_type ${type}local)\"\n\t\tfi\n\t\techolog \"$(get_name $type) program is: $ss_program\"\n\t\t# 获取当前软链接指向的执行文件路径\n\t\told_ss_program=$(readlink -f \"$TMP_PATH/bin/${type}-redir\" 2>/dev/null)\n\t\t# **当新旧执行文件路径不同时，删除旧链接**\n\t\tif [ \"$old_ss_program\" != \"$ss_program\" ]; then\n\t\t\trm -rf \"$TMP_PATH/bin/${type}-redir\"\n\t\tfi\n\t\tln_start_bin $ss_program ${type}-redir -c $shunt_config_file\n\t\tif [ -n \"$tmp_local_port\" ]; then\n\t\t\tlocal tmp_port=$tmp_local_port\n\t\telse\n\t\t\tlocal tmp_port=$tmp_shunt_local_port\n\t\t\tif [ \"$shunt_server_type\" = \"ss-libev\" ] || [ \"$shunt_server_type\" = \"ssr\" ]; then\n\t\t\t\tdns_ss_program=\"$(first_type ${type}-local)\"\n\t\t\telif [ \"$shunt_server_type\" = \"ss-rust\" ]; then\n\t\t\t\tdns_ss_program=\"$(first_type ${type}local)\"\n\t\t\tfi\n\t\t\t# 获取当前软链接指向的执行文件路径\n\t\t\told_dns_ss_program=$(readlink -f \"$TMP_PATH/bin/${type}-local\" 2>/dev/null)\n\t\t\tif [ \"$old_dns_ss_program\" != \"$dns_ss_program\" ]; then\n\t\t\t\trm -rf \"$TMP_PATH/bin/${type}-local\"\n\t\t\tfi\n\t\t\tln_start_bin $dns_ss_program ${type}-local -c $shunt_dns_config_file\n\t\tfi\n\t\tshunt_dns_command $tmp_port\n\t\techolog \"shunt:$(get_name $type) Started!\"\n\t\t;;\n\tv2ray)\n\t\tlocal tmp_port=${tmp_local_port:-$tmp_shunt_local_port}\n\t\tgen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port $tmp_port\n\t\t# 处理配置文件中的 NetFlix 端口\n\t\ttmp_port=$(shunt_dns_config_file_port $tmp_port)\n\t\tln_start_bin $(first_type xray v2ray) v2ray run -c $shunt_config_file\n\t\tshunt_dns_command $tmp_port\n\t\techolog \"shunt:$($(first_type xray v2ray) version | head -1) Started!\"\n\t\t;;\n\ttrojan)\n\t\tgen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port\n\t\tln_start_bin $(first_type trojan) $type --config $shunt_config_file\n\t\tif [ -n \"$tmp_local_port\" ]; then\n\t\t\tlocal tmp_port=$tmp_local_port\n\t\telse\n\t\t\tlocal tmp_port=$tmp_shunt_local_port\n\t\t\tln_start_bin $(first_type trojan) $type --config $shunt_dns_config_file\n\t\tfi\n\t\tshunt_dns_command $tmp_port\n\t\techolog \"shunt:$($(first_type trojan) --version 2>&1 | head -1) Started!\"\n\t\t;;\n\tnaiveproxy)\n\t\tgen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port\n\t\tln_start_bin $(first_type naive) naive --config $shunt_config_file\n\t\tif [ -n \"$tmp_local_port\" ]; then\n\t\t\tlocal tmp_port=$tmp_local_port\n\t\telse\n\t\t\tlocal tmp_port=$tmp_shunt_local_port\n\t\t\tln_start_bin $(first_type naive) naive --config $shunt_dns_config_file\n\t\tfi\n\t\tshunt_dns_command $tmp_port\n\t\techolog \"shunt:$($(first_type \"naive\") --version 2>&1 | head -1) Started!\"\n\t\tredir_udp=0\n\t\t;;\n\thysteria2)\n\t\tif [ -n \"$tmp_local_port\" ]; then\n\t\t\tlocal tmp_port=$tmp_local_port\n\t\t\tgen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port\n\t\telse\n\t\t\tlocal tmp_port=$tmp_shunt_local_port\n\t\t\tgen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port $tmp_port\n\t\tfi\n\t\tln_start_bin $(first_type hysteria) hysteria client --config $shunt_config_file\n\t\tshunt_dns_command $tmp_port\n\t\techolog \"shunt:$($(first_type hysteria) version | grep Version | awk '{print \"Hysteria2: \" $2}') Started!\"\n\t\t;;\n\ttuic)\n\t\tlocal chain_shunt_port=\"30${tmp_shunt_port}\"\n\t\tgen_config_file $SHUNT_SERVER $type 3 $chain_shunt_port 0 chain #make a tuic socks:30303, make a ipt2socks redir:303\n\t\tln_start_bin $(first_type tuic-client) tuic-client --config $shunt_config_file\n\t\tln_start_bin $(first_type ipt2socks) ipt2socks -R -b 0.0.0.0 -4 -s 127.0.0.1 -p $chain_shunt_port -l $tmp_shunt_port\n\n\t\t[ -n \"$tmp_local_port\" ] && tmp_port=$tmp_local_port || tmp_port=$tmp_shunt_local_port\n\t\tgen_config_file $SHUNT_SERVER $type 3 $tmp_port\t\t# make a tuic socks :304\n\t\tln_start_bin $(first_type tuic-client) tuic-client --config $shunt_dns_config_file\n\t\tshunt_dns_command $tmp_port\n\t\techolog \"Netflix Separated Shunt Server:$($(first_type tuic-client) --version) Started!\"\n\t\t# FIXME: ipt2socks cannot handle udp reply from tuic\n\t\t#redir_udp=0\n\t\t;;\n\tshadowtls)\n\t\t[ -n \"$tmp_local_port\" ] && tmp_port=$tmp_local_port || tmp_port=$tmp_shunt_local_port\n\t\tgen_config_file $SHUNT_SERVER $type 3 \"10${tmp_shunt_port}\" $tmp_port chain/$tmp_shunt_port #make a redir:303 and a socks:304\n\t\t#echo \"debug \\$tmp_port=$tmp_port, \\$tmp_shunt_port=${tmp_shunt_port},  \\$tmp_shunt_local_port=$tmp_shunt_local_port\"\n\t\tln_start_bin $(first_type shadow-tls) shadow-tls config --config $chain_config_file\n\t\tshunt_dns_command $tmp_port\n\t\tlocal chain_type=$(uci_get_by_name $SHUNT_SERVER chain_type)\n\t\tcase ${chain_type} in\n\t\tvmess)\n\t\t\tln_start_bin $(first_type xray v2ray) v2ray run -c $shunt_config_file\n\t\t\techolog \"Netflix Separated Shunt Server:shadow-tls chain-to$($(first_type xray) --version) Started!\"\n\t\t\t;;\n\t\tsslocal)\n\t\t\tln_start_bin $(first_type sslocal) sslocal -c $shunt_config_file\n\t\t\techolog \"Netflix Separated Shunt Server:shadow-tls chain-to$($(first_type sslocal) --version) Started!\"\n\t\t\t;;\n\t\tesac\n\t\t;;\n\t# socks5)\n\t# \tif [ \"$(uci_get_by_name $SHUNT_SERVER auth_enable 0)\" == \"1\" ]; then\n\t# \t\tlocal auth=\"-a $(uci_get_by_name $SHUNT_SERVER username) -k $(uci_get_by_name $SHUNT_SERVER password)\"\n\t# \tfi\n\t# \tln_start_bin $(first_type ipt2socks) ipt2socks $shunt_config_file -R -4 -s $(uci_get_by_name $SHUNT_SERVER server) -p $(uci_get_by_name $SHUNT_SERVER server_port) -l $tmp_shunt_port $auth\n\t# \t#gen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port\n\t# \t#ln_start_bin $(first_type redsocks2) redsocks2 -c $shunt_config_file\n\t# \tif [ -n \"$tmp_local_port\" ]; then\n\t# \t\tlocal tmp_port=$tmp_local_port\n\t# \telse\n\t# \t\tlocal tmp_port=$tmp_shunt_local_port\n\t# \t\tln_start_bin $(first_type microsocks) microsocks -i 127.0.0.1 -p $tmp_port shunt-dns-ssr-plus\n\t# \tfi\n\t# \tshunt_dns_command $tmp_port\n\t# \techolog \"shunt:$type REDIRECT/TPROXY Started!\"\n\t# \t;;\n\t*)\n\t\tgen_config_file $SHUNT_SERVER $type 3 $tmp_shunt_port\n\t\tln_start_bin $(first_type redsocks2) redsocks2 -c $shunt_config_file\n\t\tif [ -n \"$tmp_local_port\" ]; then\n\t\t\tlocal tmp_port=$tmp_local_port\n\t\telse\n\t\t\tlocal tmp_port=$tmp_shunt_local_port\n\t\t\tln_start_bin $(first_type microsocks) microsocks -i 127.0.0.1 -p $tmp_port shunt-dns-ssr-plus\n\t\tfi\n\t\tshunt_dns_command $tmp_port\n\t\techolog \"shunt:$type REDIRECT/TPROXY Started!\"\n\t\t;;\n\tesac\n\treturn 0\n}\n\nstart_local() {\n\t[ \"$LOCAL_SERVER\" = \"nil\" ] && return 1\n\tlocal local_port=$(uci_get_by_type socks5_proxy local_port)\n\t[ \"$LOCAL_SERVER\" == \"$SHUNT_SERVER\" ] && tmp_local_port=$local_port\n\tlocal local_server_type=$(uci_get_by_name $LOCAL_SERVER type)\n\tlocal type=$local_server_type\n\tif [ \"$local_server_type\" = \"ss-rust\" ] || [ \"$local_server_type\" = \"ss-libev\" ]; then\n\t\ttype=\"ss\"\n\tfi\n\tcase \"$type\" in\n\tss | ssr)\n\t\tgen_config_file $LOCAL_SERVER $type 4 $local_port\n\t\tif [ \"$local_server_type\" = \"ss-libev\" ] || [ \"$local_server_type\" = \"ssr\" ]; then\n\t\t\tss_program=\"$(first_type ${type}-local)\"\n\t\telif [ \"$local_server_type\" = \"ss-rust\" ]; then\n\t\t\tss_program=\"$(first_type ${type}local)\"\n\t\tfi\n\t\techolog \"$(get_name $type) program is: $ss_program\"\n\t\t# 获取当前软链接指向的执行文件路径\n\t\told_ss_program=$(readlink -f \"$TMP_PATH/bin/${type}-local\" 2>/dev/null)\n\t\t# **当 新旧执行文件路径不同时，删除旧链接**\n\t\tif [ \"$old_ss_program\" != \"$ss_program\" ]; then\n\t\t\trm -rf \"$TMP_PATH/bin/${type}-local\"\n\t\tfi\n\t\tln_start_bin $ss_program ${type}-local -c $local_config_file\n\t\techolog \"Global_Socks5:$(get_name $type) Started!\"\n\t\t;;\n\tv2ray)\n\t\tif [ \"$_local\" == \"2\" ]; then\n\t\t\tgen_config_file $LOCAL_SERVER $type 4 0 $local_port\n\t\t\tln_start_bin $(first_type xray v2ray) v2ray run -c $local_config_file\n\t\tfi\n\t\techolog \"Global_Socks5:$($(first_type \"xray\" \"v2ray\") version | head -1) Started!\"\n\t\t;;\n\ttrojan) #client\n\t\tgen_config_file $LOCAL_SERVER $type 4 $local_port\n\t\tln_start_bin $(first_type trojan) $type --config $local_config_file\n\t\techolog \"Global_Socks5:$($(first_type trojan) --version 2>&1 | head -1) Started!\"\n\t\t;;\n\tnaiveproxy)\n\t\tgen_config_file $LOCAL_SERVER $type 4 $local_port\n\t\tln_start_bin $(first_type naive) naive --config $local_config_file\n\t\techolog \"Global_Socks5:$($(first_type naive) --version | head -1) Started!\"\n\t\t;;\n\thysteria2)\n\t\tif [ \"$_local\" == \"2\" ]; then\n\t\t\tgen_config_file $LOCAL_SERVER $type 4 0 $local_port\n\t\t\tln_start_bin $(first_type hysteria) hysteria client --config $local_config_file\n\t\t\techolog \"Global_Socks5:$($(first_type hysteria) version | grep Version | awk '{print \"Hysteria2: \" $2}') Started!\"\n\t\tfi\n\t\t;;\n\ttuic)\n\t\tif [ \"$_local\" == \"2\" ]; then\n\t\t\tgen_config_file $LOCAL_SERVER $type 4 $local_port\n\t\t\tln_start_bin $(first_type tuic-client) tuic-client --config $local_config_file\n\t\t\techolog \"Global Socks5:$($(first_type tuic-client) --version) Started!\"\n\t\tfi\n\t\t;;\n\tshadowtls)\n\t\t#respective config for global socks and main node\n\t\tif [ \"$_local\" == \"2\" ]; then\n\t\t\tgen_config_file $LOCAL_SERVER $type 4 \"10${tmp_tcp_local_port}\"\n\t\t\tgen_config_file $LOCAL_SERVER $type 4 0 $local_port chain/\"10${tmp_tcp_local_port}\"\n\t\t\tln_start_bin $(first_type shadow-tls) shadow-tls config --config $chain_local_config_file\n\t\t\tlocal chain_type=$(uci_get_by_name $LOCAL_SERVER chain_type)\n\t\t\tcase ${chain_type} in\n\t\t\tvmess)\n\t\t\t\tln_start_bin $(first_type xray v2ray) v2ray run -c $local_config_file\n\t\t\t\techolog \"Global Socks5 Proxy:shadow-tls chain-to$($(first_type xray) --version) Started!\"\n\t\t\t\t;;\n\t\t\tsslocal)\n\t\t\t\tln_start_bin $(first_type sslocal) sslocal -c $local_config_file\n\t\t\t\techolog \"Global Socks5 Proxy:shadow-tls chain-to$($(first_type sslocal) --version) Started!\"\n\t\t\t\t;;\n\t\t\tesac\n\t\tfi\n\t\t;;\n\t*)\n\t\t[ -e /proc/sys/net/ipv6 ] && local listenip='-i ::'\n\t\tln_start_bin $(first_type microsocks) microsocks $listenip -p $local_port tcp-udp-ssr-local\n\t\techolog \"Global_Socks5:$type Started!\"\n\t\t;;\n\tesac\n\tlocal_enable=1\n\treturn 0\n}\n\nStart_Run() {\n\tif [ \"$(uci_get_by_type global threads 0)\" == \"0\" ]; then\n\t\tlocal threads=$(cat /proc/cpuinfo | grep 'processor' | wc -l)\n\telse\n\t\tlocal threads=$(uci_get_by_type global threads)\n\tfi\n\tif [ \"$(uci_get_by_name $GLOBAL_SERVER kcp_enable 0)\" == \"1\" ]; then\n\t\t[ ! -f \"/usr/bin/kcptun-client\" ] && return 1\n\t\tlocal kcp_str=$(/usr/bin/kcptun-client -v | grep kcptun | wc -l)\n\t\t[ \"0\" == \"$kcp_str\" ] && return 1\n\t\tlocal kcp_server=$(uci_get_by_name $GLOBAL_SERVER server)\n\t\tlocal kcp_port=$(uci_get_by_name $GLOBAL_SERVER kcp_port)\n\t\tlocal server_port=$(uci_get_by_name $GLOBAL_SERVER server_port)\n\t\tlocal password=$(uci_get_by_name $GLOBAL_SERVER kcp_password)\n\t\tlocal kcp_param=$(uci_get_by_name $GLOBAL_SERVER kcp_param)\n\t\t[ \"$password\" != \"\" ] && password=\"--key \"$password\n\t\tservice_start /usr/bin/kcptun-client -r $kcp_server:$kcp_port -l :$server_port $password $kcp_param\n\t\tkcp_enable_flag=1\n\t\tARG_UDP=\"\"\n\tfi\n\tif [ \"$_local\" == \"1\" ]; then\n\t\tlocal socks_port=$(uci_get_by_type socks5_proxy local_port)\n\t\ttcp_config_file=$TMP_PATH/local-ssr-retcp.json\n\t\t[ \"$mode\" == \"tcp,udp\" ] && tcp_config_file=$TMP_PATH/local-udp-ssr-retcp.json\n\t\t#[ \"$mode\" == \"tcp,udp\" ] && {\n\t\t#\tif [ \"$USE_TABLES\" = \"nftables\" ]; then\n\t\t#\t\t# nftables / fw4\n\t\t#\t\ttcp_config_file=$TMP_PATH/local-nft-ssr-retcp.json\n\t\t#\telif [ \"$USE_TABLES\" = \"iptables\" ]; then\n\t\t#\t\t# iptables / fw3\n\t\t#\t\ttcp_config_file=$TMP_PATH/local-udp-ssr-retcp.json\n\t\t#\tfi\n\t\t#}\n\tfi\n\tlocal tcp_port=$(uci_get_by_name $GLOBAL_SERVER local_port)\n\tlocal global_server_type=$(uci_get_by_name $GLOBAL_SERVER type)\n\tlocal type=$global_server_type\n\tif [ \"$global_server_type\" = \"ss-rust\" ] || [ \"$global_server_type\" = \"ss-libev\" ]; then\n\t\ttype=\"ss\"\n\tfi\n\tcase \"$type\" in\n\tss | ssr)\n\t\tgen_config_file $GLOBAL_SERVER $type 1 $tcp_port\n\t\tif [ \"$global_server_type\" = \"ss-libev\" ] || [ \"$global_server_type\" = \"ssr\" ]; then\n\t\t\tss_program=\"$(first_type ${type}-redir)\"\n\t\telif [ \"$global_server_type\" = \"ss-rust\" ]; then\n\t\t\tss_program=\"$(first_type ${type}local)\"\n\t\tfi\n\t\techolog \"$(get_name $type) program is: $ss_program\"\n\t\t# 获取当前软链接指向的执行文件路径\n\t\told_ss_program=$(readlink -f \"$TMP_PATH/bin/${type}-redir\" 2>/dev/null)\n\t\t# **当新旧执行文件路径不同时，删除旧链接**\n\t\tif [ \"$old_ss_program\" != \"$ss_program\" ]; then\n\t\t\trm -rf \"$TMP_PATH/bin/${type}-redir\"\n\t\tfi\n\t\tfor i in $(seq 1 $threads); do\n\t\t\tln_start_bin $ss_program ${type}-redir -c $tcp_config_file\n\t\tdone\n\t\techolog \"Main node:$(get_name $type) $threads Threads Started!\"\n\t\t;;\n\tv2ray)\n\t\tgen_config_file $GLOBAL_SERVER $type 1 $tcp_port $socks_port\n\t\tln_start_bin $(first_type xray v2ray) v2ray run -c $tcp_config_file\n\t\techolog \"Main node:$($(first_type xray v2ray) version | head -1) Started!\"\n\t\t;;\n\ttrojan)\n\t\tgen_config_file $GLOBAL_SERVER $type 1 $tcp_port\n\t\tfor i in $(seq 1 $threads); do\n\t\t\tln_start_bin $(first_type $type) $type --config $tcp_config_file\n\t\tdone\n\t\techolog \"Main node:$($(first_type $type) --version 2>&1 | head -1) , $threads Threads Started!\"\n\t\t;;\n\tnaiveproxy)\n\t\tgen_config_file $GLOBAL_SERVER $type 1 $tcp_port\n\t\tln_start_bin $(first_type naive) naive $tcp_config_file\n\t\techolog \"Main node:$($(first_type naive) --version 2>&1 | head -1) , $threads Threads Started!\"\n\t\t;;\n\thysteria2)\n\t\tgen_config_file $GLOBAL_SERVER $type 1 $tcp_port $socks_port\n\t\tln_start_bin $(first_type hysteria) hysteria client --config $tcp_config_file\n\t\techolog \"Main node:$($(first_type hysteria) version | grep Version | awk '{print \"Hysteria2: \" $2}') Started!\"\n\t\t;;\n\ttuic)\n\t\tlocal PARAM\n\t\t[ $mode == \"tcp\" ] && PARAM=\"-T\" || PARAM=\"\"\n\t\tgen_config_file $GLOBAL_SERVER $type 1 $tmp_tcp_local_port\n\t\tln_start_bin $(first_type tuic-client) tuic-client --config $tcp_config_file\n\t\tln_start_bin $(first_type ipt2socks) ipt2socks \"$PARAM\" -R -b 0.0.0.0 -4 -s 127.0.0.1 -p $tmp_tcp_local_port -l $tcp_port\n\t\tif [ -n $socks_port ] && [ $GLOBAL_SERVER == $LOCAL_SERVER ]; then #start a new tuic instance\n\t\t\tgen_config_file $GLOBAL_SERVER $type 4 $socks_port\n\t\t\tln_start_bin $(first_type tuic-client) tuic-client --config $local_config_file\n\t\t\techolog \"Global Socks5:$($(first_type tuic-client) --version) Started!\"\n\t\tfi\n\t\techolog \"Main node:$($(first_type tuic-client) --version) Started!\"\n\t\t;;\n\tshadowtls)\n\t\tif [ -z \"$socks_port\" ]; then\n\t\t\tgen_config_file $GLOBAL_SERVER $type 1 \"10${tmp_tcp_local_port}\"\n\t\t\tgen_config_file $GLOBAL_SERVER $type 1 \"10${tmp_tcp_local_port}\" 0 chain\n\t\telse\n\t\t\tgen_config_file $GLOBAL_SERVER $type 1 \"10${tmp_tcp_local_port}\"\n\t\t\tgen_config_file $GLOBAL_SERVER $type 1 \"10${tmp_tcp_local_port}\" $socks_port chain\n\t\tfi\n\t\tlocal chain_type=$(uci_get_by_name $GLOBAL_SERVER chain_type)\n\t\tcase ${chain_type} in\n\t\tvmess)\n\t\t\tln_start_bin $(first_type shadow-tls) shadow-tls config --config $chain_config_file\n\t\t\tln_start_bin $(first_type xray v2ray) v2ray run -c $tcp_config_file\n\t\t\techolog \"Mian node:shadow-tls chain-to $($(first_type xray) --version) Started!\"\n\t\t\t;;\n\t\tsslocal)\n\t\t\tln_start_bin $(first_type shadow-tls) shadow-tls config --config $chain_config_file\n\t\t\tln_start_bin $(first_type sslocal) sslocal -c $tcp_config_file\n\t\t\techolog \"Main node:shadow-tls chain-to $($(first_type sslocal) --version) Started!\"\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tsocks5)\n\t\tif [ \"$(uci_get_by_name $GLOBAL_SERVER auth_enable 0)\" == \"1\" ]; then\n\t\t\tlocal auth=\"-a $(uci_get_by_name $GLOBAL_SERVER username) -k $(uci_get_by_name $GLOBAL_SERVER password)\"\n\t\tfi\n\t\tln_start_bin $(first_type ipt2socks) ipt2socks $tcp_config_file -R -4 -j $threads -s $(uci_get_by_name $GLOBAL_SERVER server) -p $(uci_get_by_name $GLOBAL_SERVER server_port) -l $tcp_port $auth\n\t\t#gen_config_file $GLOBAL_SERVER $type 1 $tcp_port\n\t\t#for i in $(seq 1 $threads); do\n\t\t#\tln_start_bin $(first_type redsocks2) redsocks2 -c $tcp_config_file\n\t\t#done\n\t\techolog \"Main node:Socks5 REDIRECT/TPROXY $threads Threads Started!\"\n\t\t;;\n\ttun)\n\t\tgen_config_file $GLOBAL_SERVER $type 1 $tcp_port\n\t\tfor i in $(seq 1 $threads); do\n\t\t\tln_start_bin $(first_type redsocks2) redsocks2 -c $tcp_config_file\n\t\tdone\n\t\techolog \"Main node:Network Tunnel REDIRECT $threads Threads Started!\"\n\t\t;;\n\tesac\n\tredir_tcp=1\n\treturn 0\n}\n\nload_config() {\n\tif [ -z \"$switch_server\" ]; then\n\t\tGLOBAL_SERVER=$(uci_get_by_type global global_server nil)\n\telse\n\t\tGLOBAL_SERVER=$switch_server\n\tfi\n\tif [ \"$(uci_get_by_type socks5_proxy enabled 0)\" == \"1\" ]; then\n\t\t# 只有开启 全局socks 才需要取值\n\t\tLOCAL_SERVER=$(uci_get_by_type socks5_proxy server nil)\n\telse\n\t\t# 没有开启 设置为 nil\n\t\tLOCAL_SERVER=nil\n\tfi\n\tif [ \"$GLOBAL_SERVER\" == \"nil\" ]; then\n\t\tmode=\"tcp,udp\"\n\t\t_local=\"2\"\n\t\tlocal_config_file=$TMP_PATH/tcp-udp-ssr-local.json\n\t\tstart_local\n\t\treturn 1\n\tfi\n\tUDP_RELAY_SERVER=$(uci_get_by_type global udp_relay_server nil)\n\tif [ \"$(uci_get_by_type global netflix_enable 0)\" == \"1\" ]; then\n\t\t# 只有开启 NetFlix分流 才需要取值\n\t\tSHUNT_SERVER=$(uci_get_by_type global netflix_server nil)\n\telse\n\t\t# 没有开启 设置为 nil\n\t\tSHUNT_SERVER=nil\n\tfi\n\t#tcp_config_file=$TMP_PATH/tcp-udp-dual-ssr-retcp.json\n\ttcp_config_file=$TMP_PATH/tcp-only-ssr-retcp.json\n\tcase \"$UDP_RELAY_SERVER\" in\n\tnil)\n\t\t#mode=\"tcp,udp\"\n\t\tmode=\"tcp\"\n\t\tARG_UDP=\"\"\n\t\tudp_config_file=\"\"\n\t\t;;\n\t$GLOBAL_SERVER | same)\n\t\tmode=\"tcp,udp\"\n\t\ttcp_config_file=$TMP_PATH/tcp-udp-ssr-retcp.json\n\t\tARG_UDP=\"-u\"\n\t\tUDP_RELAY_SERVER=$GLOBAL_SERVER\n\t\t;;\n\t*)\n\t\tmode=\"udp\"\n\t\tudp_config_file=$TMP_PATH/udp-only-ssr-reudp.json\n\t\tARG_UDP=\"-U\"\n\t\tstart_udp\n\t\t#mode=\"tcp,udp\"\n\t\tmode=\"tcp\"\n\t\t;;\n\tesac\n\tcase \"$LOCAL_SERVER\" in\n\tnil)\n\t\t_local=\"0\"\n\t\t;;\n\t$GLOBAL_SERVER | same)\n\t\t_local=\"1\"\n\t\tLOCAL_SERVER=$GLOBAL_SERVER\n\t\tlocal_config_file=$TMP_PATH/tcp-udp-ssr-local.json\n\t\tstart_local\n\t\tlocal_enable=0\n\t\t;;\n\t$SHUNT_SERVER)\n\t\t_local=\"3\"\n\t\tlocal_config_file=$TMP_PATH/tcp-udp-ssr-local.json\n\t\tstart_local\n\t\t;;\n\t*)\n\t\t_local=\"2\"\n\t\tlocal_config_file=$TMP_PATH/tcp-udp-ssr-local.json\n\t\tstart_local\n\t\t;;\n\tesac\n\tcase \"$SHUNT_SERVER\" in\n\tnil)\n\t\tshunt=\"0\"\n\t\t;;\n\t$GLOBAL_SERVER | same)\n\t\tshunt=\"1\"\n\t\tSHUNT_SERVER=$GLOBAL_SERVER\n\t\t;;\n\t$LOCAL_SERVER)\n\t\tshunt=\"$tmp_shunt_port\"\n\t\tshunt_config_file=$TMP_PATH/tcp-udp-ssr-local.json\n\t\tshunt_dns_config_file=$TMP_PATH/shunt-dns-ssr-plus.json\n\t\tstart_shunt\n\t\t;;\n\t*)\n\t\tshunt=\"$tmp_shunt_port\"\n\t\tshunt_config_file=$TMP_PATH/shunt-ssr-retcp.json\n\t\tshunt_dns_config_file=$TMP_PATH/shunt-dns-ssr-plus.json\n\t\tstart_shunt\n\t\t;;\n\tesac\n\treturn 0\n}\n\ncheck_server() {\n\tENABLE_SERVER=$(uci_get_by_type global global_server nil)\n\tif [ \"$ENABLE_SERVER\" == \"nil\" ]; then\n\t\treturn 1\n\telse\n\t\tlocal STYPE=$(uci_get_by_name $ENABLE_SERVER type nil)\n\t\tif [ \"$STYPE\" == \"nil\" ]; then\n\t\t\tlocal CFGID=$(uci_get_by_cfgid servers type nil)\n\t\t\tif [ \"$CFGID\" == \"nil\" ]; then\n\t\t\t\tuci_set_by_type global global_server 'nil'\n\t\t\telse\n\t\t\t\tuci_set_by_type global global_server $CFGID\n\t\t\tfi\n\t\t\t/etc/init.d/shadowsocksr restart\n\t\tfi\n\tfi\n}\n\nstart_server() {\n\t[ \"$(uci_get_by_type server_global enable_server 0)\" == \"0\" ] && return 0\n\tserver_service() {\n\t\t[ \"$(uci_get_by_name $1 enable 0)\" == \"0\" ] && return 1\n\t\tlet server_count=server_count+1\n\t\tif [ \"$server_count\" == \"1\" ]; then\n\t\t\tif [ \"$USE_TABLES\" = \"nftables\" ]; then\n\t\t\t\t# nftables / fw4\n\t\t\t\tif nft list table inet fw4 >/dev/null 2>&1; then\n\t\t\t\t\tif ! nft list chain inet fw4 SSR-SERVER-RULE >/dev/null 2>&1; then\n\t\t\t\t\t\tnft add chain inet fw4 SSR-SERVER-RULE 2>/dev/null\n\t\t\t\t\tfi\n\t\t\t\t\tif ! nft list chain inet fw4 input 2>/dev/null | grep -q \"jump SSR-SERVER-RULE\"; then\n\t\t\t\t\t\tnft insert rule inet fw4 input jump SSR-SERVER-RULE comment \\\"SSR Server Input Hook\\\" 2>/dev/null\n\t\t\t\t\tfi\n\t\t\t\t\tnft flush chain inet fw4 SSR-SERVER-RULE 2>/dev/null\n\t\t\t\tfi\n\t\t\telif [ \"$USE_TABLES\" = \"iptables\" ]; then\n\t\t\t\t# iptables / fw3\n\t\t\t\tif ! (iptables-save -t filter | grep -q \"SSR-SERVER-RULE\"); then\n\t\t\t\t\tiptables -N SSR-SERVER-RULE\n\t\t\t\t\tiptables -t filter -I INPUT -j SSR-SERVER-RULE\n\t\t\t\tfi\n\t\t\tfi\n\t\tfi\n\t\tlocal node_type=$(uci_get_by_name $1 type)\n\t\tlocal type=$node_type\n\t\tif [ \"$node_type\" = \"ss-rust\" ] || [ \"$node_type\" = \"ss-libev\" ]; then\n\t\t\ttype=\"ss\"\n\t\tfi\n\t\tcase \"$type\" in\n\t\tss | ssr)\n\t\t\tgen_service_file ${type} $1 $TMP_PATH/ssr-server$server_count.json\n\t\t\tif [ \"$node_type\" = \"ss-libev\" ] || [ \"$node_type\" = \"ssr\" ]; then\n\t\t\t\tss_program=\"$(first_type ${type}-server)\"\n\t\t\telif [ \"$node_type\" = \"ss-rust\" ]; then\n\t\t\t\tss_program=\"$(first_type ${type}server)\"\n\t\t\tfi\n\t\t\t# 获取当前软链接指向的执行文件路径\n\t\t\told_ss_program=$(readlink -f \"$TMP_PATH/bin/${type}-server\" 2>/dev/null)\n\t\t\t# **当新旧执行文件路径不同时，删除旧链接**\n\t\t\tif [ \"$old_ss_program\" != \"$ss_program\" ]; then\n\t\t\t\trm -rf \"$TMP_PATH/bin/${type}-server\" \n\t\t\tfi\n\t\t\tln_start_bin $ss_program ${type}-server -c $TMP_PATH/ssr-server$server_count.json\n\t\t\techolog \"Server: $(get_name ${type}) Server$server_count Started!\"\n\t\t\t;;\n\t\tsocks5)\n\t\t\t[ -e /proc/sys/net/ipv6 ] && local listenip='-i ::'\n\t\t\tlocal username=$(uci_get_by_name $1 username)\n\t\t\tlocal password=$(uci_get_by_name $1 password)\n\t\t\tlocal auth_opts=\"\"\n\t\t\tif [ -n \"$username\" ] && [ -n \"$password\" ]; then\n\t\t\t\tauth_opts=\"-u $username -P $password\"\n\t\t\tfi\n\t\t\tln_start_bin $(first_type microsocks) microsocks $listenip -p $(uci_get_by_name $1 server_port) -1 $auth_opts ssr-server$server_count\n\t\t\techolog \"Server:Socks5 Server$server_count Started!\"\n\t\t\t;;\n\t\tesac\n\t\tserver_port=$(uci_get_by_name $1 server_port)\n\t\tif [ \"$USE_TABLES\" = \"nftables\" ]; then\n\t\t\t# nftables / fw4\n\t\t\tnft add rule inet fw4 SSR-SERVER-RULE tcp dport $server_port accept\n\t\t\tnft add rule inet fw4 SSR-SERVER-RULE udp dport $server_port accept\n\t\telif [ \"$USE_TABLES\" = \"iptables\" ]; then\n\t\t\t# iptables / fw3\n\t\t\tiptables -t filter -A SSR-SERVER-RULE -p tcp --dport $server_port -j ACCEPT\n\t\t\tiptables -t filter -A SSR-SERVER-RULE -p udp --dport $server_port -j ACCEPT\n\t\tfi\n\t\treturn 0\n\t}\n\tgen_serv_include() {\n\t\tlocal FWI=$(uci get firewall.shadowsocksr.path 2>/dev/null)\n\t\t[ -n \"$FWI\" ] || return 0\n\t\tif [ ! -f $FWI ]; then\n\t\t\techo '#!/bin/sh' >$FWI\n\t\tfi\n\t\tif [ \"$USE_TABLES\" = \"nftables\" ]; then\n\t\t\t# nftables / fw4\n\t\t\tcat <<-'EOF' >>\"$FWI\"\n\t\t\t\t# 确保表存在\n\t\t\t\tif nft list table inet fw4 >/dev/null 2>&1; then\n\t\t\t\t\t# 如果不存在 SSR-SERVER-RULE 链，则创建\n\t\t\t\t\tif ! nft list chain inet fw4 SSR-SERVER-RULE >/dev/null 2>&1; then\n\t\t\t\t\t\tnft add chain inet fw4 SSR-SERVER-RULE 2>/dev/null\n\t\t\t\t\tfi\n\t\t\t\t\t# 从 input 链跳转到 SSR-SERVER-RULE（如果未添加）\n\t\t\t\t\tif ! nft list chain inet fw4 input | grep -q 'jump SSR-SERVER-RULE'; then\n\t\t\t\t\t\tnft insert rule inet fw4 input jump SSR-SERVER-RULE comment \\\"SSR Server Input Hook\\\" 2>/dev/null\n\t\t\t\t\tfi\n\t\t\t\t\t# 已存在则清空链\n\t\t\t\t\tnft flush chain inet fw4 SSR-SERVER-RULE 2>/dev/null\n\t\t\t\tfi\n\t\t\tEOF\n\t\telif [ \"$USE_TABLES\" = \"iptables\" ]; then\n\t\t\t# iptables / fw3\n\t\t\textract_rules() {\n\t\t\t\techo \"*filter\"\n\t\t\t\tiptables-save -t filter | grep SSR-SERVER-RULE | sed -e \"s/^-A INPUT/-I INPUT/\"\n\t\t\t\techo 'COMMIT'\n\t\t\t}\n\t\t\tcat <<-EOF >>$FWI\n\t\t\t\tiptables-save -c | grep -v \"SSR-SERVER\" | iptables-restore -c\n\t\t\t\tiptables-restore -n <<-EOT\n\t\t\t\t$(extract_rules)\n\t\t\t\tEOT\n\t\t\tEOF\n\t\tfi\n\t}\n\n\tconfig_load $NAME\n\tconfig_foreach server_service server_config\n\tgen_serv_include\n\treturn 0\n}\n\nstart_switch() {\n\tif [ \"$(uci_get_by_type global enable_switch 0)\" == \"1\" ]; then\n\t\tif [ -z \"$switch_server\" ]; then\n\t\t\tlocal switch_time=$(uci_get_by_type global switch_time)s\n\t\t\tlocal switch_timeout=$(uci_get_by_type global switch_timeout)\n\t\t\tservice_start /usr/bin/ssr-switch start $switch_time $switch_timeout\n\t\tfi\n\tfi\n}\n\nstart_monitor() {\n\tif [ $(uci_get_by_type global monitor_enable 1) == \"1\" ]; then\n\t\tlet total_count=server_count+redir_tcp+redir_udp+kcp_enable_flag+local_enable+pdnsd_enable_flag\n\t\tif [ $total_count -gt 0 ]; then\n\t\t\tservice_start /usr/bin/ssr-monitor $server_count $redir_tcp $redir_udp $kcp_enable_flag $local_enable $pdnsd_enable_flag\n\t\tfi\n\tfi\n}\n\nstart_xhttp_addr() {\n\tlocal xhttp_addr_file=\"/etc/ssrplus/xhttp_address.txt\"\n\tlocal tmp_file=\"/tmp/.xhttp_addr.tmp\"\n\n\t# 收集所有节点的 download_address 值，去掉空行并去重排序\n\t{\n\t\tfor sec in \"$GLOBAL_SERVER\" \"$SHUNT_SERVER\" \"$UDP_RELAY_SERVER\"; do\n\t\t\tlocal addr\n\t\t\taddr=$(uci_get_by_name \"$sec\" download_address)\n\t\t\t[ -n \"$addr\" ] && echo \"$addr\"\n\t\tdone\n\t} | grep -v '^$' | sort -u > \"$tmp_file\"\n\n\t# 如果没有 download_address 地址，删除旧文件并退出\n\tif [ ! -s \"$tmp_file\" ]; then\n\t\t[ -f \"$xhttp_addr_file\" ] && rm -f \"$xhttp_addr_file\"\n\t\trm -f \"$tmp_file\"\n\t\treturn 0\n\tfi\n\n\t# 比较 MD5 判断 download_address 地址是否有变化\n\tlocal md5_new md5_old\n\tmd5_new=$(md5sum \"$tmp_file\" | awk '{print $1}')\n\tif [ -f \"$xhttp_addr_file\" ]; then\n\t\tmd5_old=$(md5sum \"$xhttp_addr_file\" | awk '{print $1}')\n\telse\n\t\tmd5_old=\"\"\n\tfi\n\n\t# MD5 不同更新 download_address 地址文件\n\tif [ \"$md5_new\" != \"$md5_old\" ]; then\n\t\tmv -f \"$tmp_file\" \"$xhttp_addr_file\"\n\t\tlogger -t ssrplus-xhttp \"download_address.txt updated\"\n\telse\n\t\trm -f \"$tmp_file\"\n\tfi\n}\n\nstart_rules() {\n\tlocal server=$(get_host_ip $GLOBAL_SERVER)\n\tlocal local_port=$(uci_get_by_name $GLOBAL_SERVER local_port)\n\tlocal lan_ac_ips=$(uci_get_by_type access_control lan_ac_ips)\n\tlocal lan_ac_mode=$(uci_get_by_type access_control lan_ac_mode)\n\tif [ \"$kcp_enable_flag\" == \"0\" -a \"$redir_udp\" == \"1\" ]; then\n\t\tlocal udp_server=$(get_host_ip $UDP_RELAY_SERVER)\n\t\tlocal udp_local_port=$tmp_udp_port\n\tfi\n\tif [ \"$shunt\" != \"0\" ]; then\n\t\tlocal shunt_ip=$(get_host_ip $SHUNT_SERVER)\n\tfi\n\tif [ -n \"$lan_ac_ips\" ]; then\n\t\tcase \"$lan_ac_mode\" in\n\t\tw | W | b | B) local ac_ips=\"$lan_ac_mode$lan_ac_ips\" ;;\n\t\tesac\n\tfi\n\tgfwmode() {\n\t\tcase \"$(uci_get_by_type global run_mode)\" in\n\t\tgfw) echo \"-g\" ;;\n\t\trouter) echo \"-r\" ;;\n\t\toversea) echo \"-c\" ;;\n\t\tall) echo \"-z\" ;;\n\t\tesac\n\t}\n\tif [ \"$(uci_get_by_type global dports)\" == \"3\" ]; then\n\t\tlocal custom_ports=$(uci_get_by_name $GLOBAL_SERVER custom_ports)  #  custom_ports 存储了用户自定义的端口\n\t\tif [ -n \"$custom_ports\" ]; then\n\t\t\tlocal proxyport=\"-m multiport --dports $custom_ports\"\n\t\tfi\n\telse\n\t\tif [ \"$(uci_get_by_type global dports 1)\" == \"2\" ]; then\n\t\t\tlocal proxyport=\"-m multiport --dports 22,53,587,465,995,993,143,80,443,853,9418\"\n\t\tfi\n\tfi\n\n\tget_arg_out() {\n\t\tcase \"$(uci_get_by_type access_control router_proxy 1)\" in\n\t\t1) echo \"-o\" ;;\n\t\t2) echo \"-O\" ;;\n\t\tesac\n\t}\n\tif [ \"$USE_TABLES\" = \"nftables\" ]; then\n\t\tARG_A=\"-A\"\n\t\t# Restore nft persistence rules\n\t\tif [ -f \"$BACKUP_FILE\" ]; then\n\t\t\tmkdir -p \"$PERSIST_DIR\"\n\t\t\tmv \"$BACKUP_FILE\" \"$PERSIST_FILE\"\n\t\t\trm -rf \"$BACKUP_DIR\"\n\t\tfi\n\telif [ \"$USE_TABLES\" = \"iptables\" ]; then\n\t\tARG_A=\"\"\n\tfi\n\t/usr/share/shadowsocksr/gfw2ipset.sh\n\t/usr/bin/ssr-rules \\\n\t\t-s \"$server\" \\\n\t\t-l \"$local_port\" \\\n\t\t-S \"$udp_server\" \\\n\t\t-L \"$udp_local_port\" \\\n\t\t-a \"$ac_ips\" \\\n\t\t-i \"/etc/ssrplus/china_ssr.txt\" \\\n\t\t-b \"$(uci_get_by_type access_control wan_bp_ips)\" \\\n\t\t-w \"$(uci_get_by_type access_control wan_fw_ips)\" \\\n\t\t-B \"$(uci_get_by_type access_control lan_bp_ips)\" \\\n\t\t-p \"$(uci_get_by_type access_control lan_fp_ips)\" \\\n\t\t-G \"$(uci_get_by_type access_control lan_gm_ips)\" \\\n\t\t-m \"$(uci_get_by_type access_control Interface)\" \\\n\t\t-D \"$proxyport\" \\\n\t\t-F \"$shunt\" \\\n\t\t-N \"$shunt_ip\" \\\n\t\t-M \"$(uci_get_by_type global netflix_proxy 0)\" \\\n\t\t-I \"/etc/ssrplus/netflixip.list\" \\\n\t\t$(get_arg_out) $(gfwmode) $ARG_UDP $ARG_A\n\n\treturn $?\n}\n\nstart() {\n\tset_lock\n\techolog \"----------start------------\"\n\tmkdir -p /var/run /var/lock /var/log $DNSMASQ_CONF_DIR $TMP_BIN_PATH $TMP_DNSMASQ_PATH\n\techo \"conf-dir=${TMP_DNSMASQ_PATH}\" >\"$DNSMASQ_CONF_DIR/dnsmasq-ssrplus.conf\"\n\tcheck_run_environment\n\tif load_config; then\n\t\tStart_Run\n\t\tstart_xhttp_addr\n\t\tstart_rules\n\t\tstart_dns\n\t\t# Restore ipsets after rules creation\n\t\tif [ \"$HAS_IPSET\" -eq 1 ]; then\n\t\t\tfor setname in gfwlist china blacklist whitelist netflix; do\n\t\t\t\t[ \"$setname\" = \"gfwlist\" ] && [ \"$run_mode\" != \"gfw\" ] && continue\n\t\t\t\tif [ -f \"/tmp/ssrplus_save/${setname}.save\" ]; then\n\t\t\t\t\tipset restore -! < \"/tmp/ssrplus_save/${setname}.save\" 2>/dev/null\n\t\t\t\tfi\n\t\t\tdone\n\t\tfi\n\t\tadd_cron\n\t\tstart_switch\n\telse\n\t\techolog \"未启动主节点，禁止连接的域名正在加载。\"\n\t\tcat /etc/ssrplus/deny.list | sed '/^$/d' | sed '/#/d' | sed \"/.*/s/.*/address=\\/&\\//\" >$TMP_DNSMASQ_PATH/denylist.conf\n\t\techolog \"禁止连接的域名加载完毕。\"\n\t\tif [ \"$(uci_get_by_type global adblock 0)\" == \"1\" ]; then\n\t\t\techolog \"未启动主节点，广告过滤正在加载。\"\n\t\t\tcp -f /etc/ssrplus/ad.conf $TMP_DNSMASQ_PATH/\n\t\t\tif [ -f \"$TMP_DNSMASQ_PATH/ad.conf\" ]; then\n\t\t\t\t# Optimize: Batch filter using grep instead of looping sed\n\t\t\t\tfor list_file in /etc/ssrplus/black.list /etc/ssrplus/white.list /etc/ssrplus/deny.list; do\n\t\t\t\t\tif [ -s \"$list_file\" ]; then\n\t\t\t\t\t\t# Clean list file (remove comments and empty lines)\n\t\t\t\t\t\tgrep -vE '^\\s*#|^\\s*$' \"$list_file\" > \"${list_file}.clean\"\n\t\t\t\t\t\tif [ -s \"${list_file}.clean\" ]; then\n\t\t\t\t\t\t\tgrep -v -F -f \"${list_file}.clean\" \"$TMP_DNSMASQ_PATH/ad.conf\" > \"$TMP_DNSMASQ_PATH/ad.conf.tmp\"\n\t\t\t\t\t\t\tmv \"$TMP_DNSMASQ_PATH/ad.conf.tmp\" \"$TMP_DNSMASQ_PATH/ad.conf\"\n\t\t\t\t\t\tfi\n\t\t\t\t\t\trm -f \"${list_file}.clean\"\n\t\t\t\t\tfi\n\t\t\t\tdone\n\t\t\tfi\n\t\t\techolog \"广告过滤加载完毕。\"\n\t\tfi\n\tfi\n\t/etc/init.d/dnsmasq restart >/dev/null 2>&1\n\tcheck_server\n\tif [ \"$USE_TABLES\" = \"nftables\" ]; then\n\t\tlocal CURRENT_SERVER=\"$(uci_get_by_type global global_server nil)\"\n\t\tif [ \"$CURRENT_SERVER\" != \"nil\" ]; then\n\t\t\tuci set shadowsocksr.@global[0].old_global_server=\"$CURRENT_SERVER\"\n\t\t\tuci commit shadowsocksr\n\t\tfi\n\tfi\n\tstart_server\n\tstart_monitor\n\tclean_log\n\techolog \"-----------end------------\"\n\tunset_lock\n}\n\nboot() {\n\techolog \"boot！\"\n\tmkdir -p /var/run /var/lock /var/log $DNSMASQ_CONF_DIR $TMP_BIN_PATH $TMP_DNSMASQ_PATH\n\tstart\n}\n\nstop() {\n\tunlock\n\tset_lock\n\tcheck_run_environment\n\t# Save ipsets before stopping to persist transparent proxy state\n\tif [ \"$HAS_IPSET\" -eq 1 ]; then\n\t\tmkdir -p /tmp/ssrplus_save\n\t\tlocal run_mode=\"$(uci_get_by_type global run_mode)\"\n\t\tif [ \"$run_mode\" = \"gfw\" ]; then\n\t\t\tipset save gfwlist > /tmp/ssrplus_save/gfwlist.save 2>/dev/null\n\t\tfi\n\t\tfor setname in china blacklist whitelist netflix; do\n\t\t\tipset save $setname > /tmp/ssrplus_save/$setname.save 2>/dev/null\n\t\tdone\n\tfi\n\tif [ \"$USE_TABLES\" = \"nftables\" ]; then\n\t\t# Save nft rules before stopping to persist transparent proxy state\n\t\tif [ -f \"$PERSIST_FILE\" ]; then\n\t\t\tmkdir -p \"$BACKUP_DIR\"\n\t\t\tmv \"$PERSIST_FILE\" \"$BACKUP_FILE\"\n\t\tfi\n\t\t/usr/bin/ssr-rules -K\n\t\tlocal OLD_SERVER=\"$(uci_get_by_type global old_global_server nil)\"\n\t\tlocal NEW_SERVER=\"$(uci_get_by_type global global_server nil)\"\n\t\tif [ \"$OLD_SERVER\" != \"nil\" ] && [ \"$NEW_SERVER\" != \"nil\" ] && [ \"$OLD_SERVER\" != \"$NEW_SERVER\" ]; then\n\t\t\t/usr/bin/ssr-rules -X\n\t\tfi\n\t\tuci delete shadowsocksr.@global[0].old_global_server 2>/dev/null\n\t\tuci commit shadowsocksr\n\tfi\n\t/usr/bin/ssr-rules -f\n\tlocal srulecount=0\n\tif [ \"$USE_TABLES\" = \"nftables\" ]; then\n\t\t# nftables / fw4\n\t\t#local srulecount=$(nft list ruleset 2>/dev/null | grep -c 'SSR-SERVER-RULE')\n\t\tif nft list chain inet fw4 SSR-SERVER-RULE >/dev/null 2>&1; then\n\t\t\tsrulecount=$(nft list chain inet fw4 SSR-SERVER-RULE | grep SSR-SERVER-RULE | wc -l)\n\t\tfi\n\telif [ \"$USE_TABLES\" = \"iptables\" ]; then\n\t\t# iptables / fw3\n\t\tsrulecount=$(iptables -L | grep SSR-SERVER-RULE | wc -l)\n\tfi\n\tif [ $srulecount -gt 0 ]; then\n\t\tif [ \"$USE_TABLES\" = \"nftables\" ]; then\n\t\t\t# nftables / fw4\n\t\t\tif nft list table inet fw4 >/dev/null 2>&1; then\n\t\t\t\tif nft list chain inet fw4 SSR-SERVER-RULE >/dev/null 2>&1; then\n\t\t\t\t\tfor handle in $(nft --handle list chain inet fw4 input 2>/dev/null | \\\n\t\t\t\t\t\tgrep 'jump SSR-SERVER-RULE' | awk '{for(i=1;i<=NF;i++) if($i==\"handle\") print $(i+1)}'); do\n\t\t\t\t\t\tnft delete rule inet fw4 input handle $handle 2>/dev/null || true\n\t\t\t\t\tdone\n\t\t\t\t\tnft flush chain inet fw4 SSR-SERVER-RULE 2>/dev/null || true\n\t\t\t\t\tnft delete chain inet fw4 SSR-SERVER-RULE 2>/dev/null || true\n\t\t\t\tfi\n\t\t\tfi\n\t\telif [ \"$USE_TABLES\" = \"iptables\" ]; then\n\t\t\t# iptables / fw3\n\t\t\tif iptables-save -t filter | grep -q \"SSR-SERVER-RULE\"; then\n\t\t\t\tlogger -t ssr-rules \"Flushing and deleting SSR-SERVER-RULE chain (iptables)\"\n\t\t\t\tiptables -F SSR-SERVER-RULE 2>/dev/null || true\n\t\t\t\tiptables -t filter -D INPUT -j SSR-SERVER-RULE 2>/dev/null || true\n\t\t\t\tiptables -X SSR-SERVER-RULE 2>/dev/null || true\n\t\t\tfi\n\t\tfi\n\tfi\n\tif [ -z \"$switch_server\" ]; then\n\t\t$PS -w | grep -v \"grep\" | grep ssr-switch | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1 &\n\t\trm -f /var/lock/ssr-switch.lock\n\t\tkillall -q -9 kcptun-client\n\tfi\n\t$PS -w | grep -v \"grep\" | grep ssr-monitor | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1 &\n\t$PS -w | grep -v \"grep\" | grep ssr-rules | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1 &\n\t$PS -w | grep -v \"grep\" | grep \"sleep 0000\" | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1 &\n\t( \\\n\t\t# Graceful kill first, so programs have the chance to stop its subprocesses\n\t\t$PS -w | grep -v \"grep\" | grep \"$TMP_PATH\" | awk '{print $1}' | xargs kill >/dev/null 2>&1 ; \\\n\t\tsleep 3s; \\\n\t\t# Force kill hanged programs\n\t\t$PS -w | grep -v \"grep\" | grep \"$TMP_PATH\" | awk '{print $1}' | xargs kill -9 >/dev/null 2>&1 ; \\\n\t)\n\tkillall -q -9 v2ray-plugin obfs-local xray-plugin shadow-tls\n\trm -f /var/lock/ssr-monitor.lock\n\tif [ \"$(uci -q get \"dhcp.@dnsmasq[0]._unused_ssrp_changed\")\" = \"1\" ]; then\n\t\tuci -q del \"dhcp.@dnsmasq[0].noresolv\"\n\t\tuci -q del_list \"dhcp.@dnsmasq[0].server\"=\"127.0.0.1#$china_dns_port\"\n\t\tuci -q rename \"dhcp.@dnsmasq[0]._orig_noresolv\"=\"noresolv\"\n\t\tuci -q rename \"dhcp.@dnsmasq[0]._orig_server\"=\"server\"\n\t\tuci -q del \"dhcp.@dnsmasq[0]._unused_ssrp_changed\"\n\t\tuci -q commit \"dhcp\"\n\tfi\n\tif [ -f \"$DNSMASQ_CONF_DIR/dnsmasq-ssrplus.conf\" ]; then\n\t\trm -rf $DNSMASQ_CONF_DIR/dnsmasq-ssrplus.conf \\\n\t\t\t$TMP_DNSMASQ_PATH \\\n\t\t\t$TMP_PATH/*-ssr-*.json \\\n\t\t\t$TMP_PATH/ssr-server*.json \\\n\t\t\t$TMP_PATH/*-config-*.json\n\n\t\t/etc/init.d/dnsmasq restart >/dev/null 2>&1\n\tfi\n\tdel_cron\n\tunset_lock\n}\n\nreset() {\n\tstop\n\tset_lock\n\trm -rf /etc/config/shadowsocksr $LOG_FILE\n\t[ -f \"/etc/ssrplus/xhttp_address.txt\" ] && rm -f /etc/ssrplus/xhttp_address.txt\n\ttouch /etc/config/shadowsocksr $LOG_FILE\n\tcp /usr/share/shadowsocksr/shadowsocksr.config /etc/config/shadowsocksr\n\tunset_lock\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/etc/ssrplus/ad.conf",
    "content": ""
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/etc/ssrplus/applechina.conf",
    "content": "server=/a1.mzstatic.com/114.114.114.114\nserver=/a2.mzstatic.com/114.114.114.114\nserver=/a3.mzstatic.com/114.114.114.114\nserver=/a4.mzstatic.com/114.114.114.114\nserver=/a5.mzstatic.com/114.114.114.114\nserver=/adcdownload.apple.com.akadns.net/114.114.114.114\nserver=/adcdownload.apple.com/114.114.114.114\nserver=/amp-api-updates.apps.apple.com/114.114.114.114\nserver=/amp-api.media.apple.com/114.114.114.114\nserver=/api-p-ap-c.smoot.apple.com/114.114.114.114\nserver=/api-p-ap-d.smoot.apple.com/114.114.114.114\nserver=/api-p-ap-e.smoot.apple.com/114.114.114.114\nserver=/app-site-association.cdn-apple.com/114.114.114.114\nserver=/appldnld.apple.com/114.114.114.114\nserver=/appldnld.g.aaplimg.com/114.114.114.114\nserver=/appleid.cdn-apple.com/114.114.114.114\nserver=/apps.apple.com/114.114.114.114\nserver=/apps.mzstatic.com/114.114.114.114\nserver=/bag-cdn.itunes-apple.com.akadns.net/114.114.114.114\nserver=/cdn-cn1.apple-mapkit.com/114.114.114.114\nserver=/cdn-cn2.apple-mapkit.com/114.114.114.114\nserver=/cdn-cn3.apple-mapkit.com/114.114.114.114\nserver=/cdn-cn4.apple-mapkit.com/114.114.114.114\nserver=/cdn.apple-mapkit.com/114.114.114.114\nserver=/cdn1.apple-mapkit.com/114.114.114.114\nserver=/cdn2.apple-mapkit.com/114.114.114.114\nserver=/cdn3.apple-mapkit.com/114.114.114.114\nserver=/cdn4.apple-mapkit.com/114.114.114.114\nserver=/cds-cdn.v.aaplimg.com/114.114.114.114\nserver=/cds.apple.com.akadns.net/114.114.114.114\nserver=/cds.apple.com/114.114.114.114\nserver=/cdsassets.apple.com/114.114.114.114\nserver=/cl1-cdn.origin-apple.com.akadns.net/114.114.114.114\nserver=/cl1.apple.com/114.114.114.114\nserver=/cl2-cn.apple.com/114.114.114.114\nserver=/cl2.apple.com/114.114.114.114\nserver=/cl3-cdn.origin-apple.com.akadns.net/114.114.114.114\nserver=/cl3.apple.com/114.114.114.114\nserver=/cl4-cdn.origin-apple.com.akadns.net/114.114.114.114\nserver=/cl4-cn.apple.com/114.114.114.114\nserver=/cl4.apple.com/114.114.114.114\nserver=/cl5-cdn.origin-apple.com.akadns.net/114.114.114.114\nserver=/cl5.apple.com/114.114.114.114\nserver=/clientflow.apple.com.akadns.net/114.114.114.114\nserver=/clientflow.apple.com/114.114.114.114\nserver=/cn-smp-paymentservices.apple.com/114.114.114.114\nserver=/configuration.apple.com.akadns.net/114.114.114.114\nserver=/configuration.apple.com/114.114.114.114\nserver=/crl.apple.com/114.114.114.114\nserver=/cstat.apple.com/114.114.114.114\nserver=/cstat.cdn-apple.com/114.114.114.114\nserver=/dd-cdn.origin-apple.com.akadns.net/114.114.114.114\nserver=/dejavu.apple.com/114.114.114.114\nserver=/devstreaming-cdn.apple.com/114.114.114.114\nserver=/download.developer.apple.com/114.114.114.114\nserver=/experiments.apple.com/114.114.114.114\nserver=/gs-loc-cn.apple.com/114.114.114.114\nserver=/gs-loc.apple.com/114.114.114.114\nserver=/gsp10-ssl-cn.ls.apple.com/114.114.114.114\nserver=/gsp12-cn.ls.apple.com/114.114.114.114\nserver=/gsp13-cn.ls.apple.com/114.114.114.114\nserver=/gsp4-cn.ls.apple.com.edgekey.net.globalredir.akadns.net/114.114.114.114\nserver=/gsp4-cn.ls.apple.com.edgekey.net/114.114.114.114\nserver=/gsp4-cn.ls.apple.com/114.114.114.114\nserver=/gsp5-cn.ls.apple.com/114.114.114.114\nserver=/gsp85-cn-ssl.ls.apple.com/114.114.114.114\nserver=/gspe19-2-cn-ssl.ls-apple.com.akadns.net/114.114.114.114\nserver=/gspe19-2-cn-ssl.ls.apple.com/114.114.114.114\nserver=/gspe19-cn-ssl.ls.apple.com/114.114.114.114\nserver=/gspe19-cn.ls-apple.com.akadns.net/114.114.114.114\nserver=/gspe19-cn.ls.apple.com/114.114.114.114\nserver=/gspe21-ssl.ls.apple.com/114.114.114.114\nserver=/gspe21.ls.apple.com/114.114.114.114\nserver=/gspe35-ssl.ls.apple.com/114.114.114.114\nserver=/gspe79-cn-ssl.ls.apple.com/114.114.114.114\nserver=/guzzoni-apple-com.v.aaplimg.com/114.114.114.114\nserver=/guzzoni.apple.com/114.114.114.114\nserver=/guzzoni.smoot.apple.com/114.114.114.114\nserver=/iadsdk.apple.com/114.114.114.114\nserver=/icloud-cdn.icloud.com.akadns.net/114.114.114.114\nserver=/icloud.cdn-apple.com/114.114.114.114\nserver=/images.apple.com.akadns.net/114.114.114.114\nserver=/images.apple.com.edgekey.net.globalredir.akadns.net/114.114.114.114\nserver=/images.apple.com/114.114.114.114\nserver=/init-kt.apple.com/114.114.114.114\nserver=/init-p01md-lb.push-apple.com.akadns.net/114.114.114.114\nserver=/init-p01md.apple.com/114.114.114.114\nserver=/init-p01st-lb.push-apple.com.akadns.net/114.114.114.114\nserver=/init-p01st.push.apple.com/114.114.114.114\nserver=/init-s01st-lb.push-apple.com.akadns.net/114.114.114.114\nserver=/init-s01st.push.apple.com/114.114.114.114\nserver=/init.ess.apple.com/114.114.114.114\nserver=/iosapps.itunes.g.aaplimg.com/114.114.114.114\nserver=/ipcdn.apple.com/114.114.114.114\nserver=/iphone-ld.apple.com/114.114.114.114\nserver=/iphone-ld.origin-apple.com.akadns.net/114.114.114.114\nserver=/is-ssl.mzstatic.com-cn-lb.itunes-apple.com.akadns.net/114.114.114.114\nserver=/is1-ssl.mzstatic.com/114.114.114.114\nserver=/is1.mzstatic.com/114.114.114.114\nserver=/is2-ssl.mzstatic.com/114.114.114.114\nserver=/is2.mzstatic.com/114.114.114.114\nserver=/is3-ssl.mzstatic.com/114.114.114.114\nserver=/is3.mzstatic.com/114.114.114.114\nserver=/is4-ssl.mzstatic.com/114.114.114.114\nserver=/is4.mzstatic.com/114.114.114.114\nserver=/is5-ssl.mzstatic.com/114.114.114.114\nserver=/is5.mzstatic.com/114.114.114.114\nserver=/itunes-apple.com.akadns.net/114.114.114.114\nserver=/itunes.apple.com/114.114.114.114\nserver=/itunesconnect.apple.com/114.114.114.114\nserver=/mesu-cdn.apple.com.akadns.net/114.114.114.114\nserver=/mesu-china.apple.com.akadns.net/114.114.114.114\nserver=/mesu.apple.com/114.114.114.114\nserver=/ml.cdn-apple.com/114.114.114.114\nserver=/music.apple.com/114.114.114.114\nserver=/ocsp-lb.apple.com.akadns.net/114.114.114.114\nserver=/ocsp.apple.com/114.114.114.114\nserver=/ocsp2-lb.apple.com.akadns.net/114.114.114.114\nserver=/ocsp2.apple.com/114.114.114.114\nserver=/oscdn.apple.com/114.114.114.114\nserver=/oscdn.origin-apple.com.akadns.net/114.114.114.114\nserver=/osxapps.itunes.g.aaplimg.com/114.114.114.114\nserver=/pancake.apple.com/114.114.114.114\nserver=/pancake.cdn-apple.com.akadns.net/114.114.114.114\nserver=/pba0.apple.com/114.114.114.114\nserver=/probe.siri.apple.com/114.114.114.114\nserver=/prod-support.apple-support.akadns.net/114.114.114.114\nserver=/publicassets.cdn-apple.com/114.114.114.114\nserver=/reserve-prime.apple.com/114.114.114.114\nserver=/s.mzstatic.com/114.114.114.114\nserver=/seed-sequoia.siri.apple.com/114.114.114.114\nserver=/seed-swallow.siri.apple.com/114.114.114.114\nserver=/seed.siri.apple.com/114.114.114.114\nserver=/sequoia.apple.com/114.114.114.114\nserver=/sh-pod2-smp-device.apple.com/114.114.114.114\nserver=/shazam-insights.cdn-apple.com/114.114.114.114\nserver=/smp-device-content.apple.com/114.114.114.114\nserver=/static.gc.apple.com/114.114.114.114\nserver=/stocks-sparkline-lb.apple.com.akadns.net/114.114.114.114\nserver=/stocks-sparkline.apple.com/114.114.114.114\nserver=/store.apple.com.edgekey.net.globalredir.akadns.net/114.114.114.114\nserver=/store.apple.com.edgekey.net/114.114.114.114\nserver=/store.apple.com/114.114.114.114\nserver=/store.storeimages.apple.com.akadns.net/114.114.114.114\nserver=/store.storeimages.cdn-apple.com/114.114.114.114\nserver=/support-china.apple-support.akadns.net/114.114.114.114\nserver=/support.apple.com/114.114.114.114\nserver=/swallow-apple-com.v.aaplimg.com/114.114.114.114\nserver=/swallow.apple.com/114.114.114.114\nserver=/swcatalog-cdn.apple.com.akadns.net/114.114.114.114\nserver=/swcatalog.apple.com/114.114.114.114\nserver=/swcdn.apple.com/114.114.114.114\nserver=/swcdn.g.aaplimg.com/114.114.114.114\nserver=/swdist.apple.com.akadns.net/114.114.114.114\nserver=/swdist.apple.com/114.114.114.114\nserver=/swscan-cdn.apple.com.akadns.net/114.114.114.114\nserver=/swscan.apple.com/114.114.114.114\nserver=/sylvan.apple.com/114.114.114.114\nserver=/tj-pod1-smp-device.apple.com/114.114.114.114\nserver=/updates-http.cdn-apple.com.akadns.net/114.114.114.114\nserver=/updates-http.cdn-apple.com/114.114.114.114\nserver=/updates.cdn-apple.com/114.114.114.114\nserver=/valid.apple.com/114.114.114.114\nserver=/valid.origin-apple.com.akadns.net/114.114.114.114\nserver=/weather-data.apple.com.akadns.net/114.114.114.114\nserver=/weather-data.apple.com/114.114.114.114\nserver=/weather-map.apple.com/114.114.114.114\nserver=/weather-map2.apple.com/114.114.114.114\nserver=/weatherkit.apple.com/114.114.114.114\nserver=/www.apple.com.edgekey.net.globalredir.akadns.net/114.114.114.114\nserver=/www.apple.com.edgekey.net/114.114.114.114\nserver=/www.apple.com/114.114.114.114\nserver=/xp.apple.com/114.114.114.114\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/etc/ssrplus/black.list",
    "content": ""
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/etc/ssrplus/china_ssr.txt",
    "content": "1.0.1.0/24\n1.0.2.0/23\n1.0.8.0/21\n1.0.32.0/19\n1.1.0.0/24\n1.1.2.0/23\n1.1.4.0/22\n1.1.8.0/24\n1.1.9.0/24\n1.1.10.0/23\n1.1.12.0/22\n1.1.16.0/20\n1.1.32.0/19\n1.2.0.0/23\n1.2.2.0/24\n1.2.4.0/24\n1.2.5.0/24\n1.2.6.0/23\n1.2.8.0/24\n1.2.9.0/24\n1.2.10.0/23\n1.2.12.0/22\n1.2.16.0/20\n1.2.32.0/19\n1.2.64.0/18\n1.3.0.0/16\n1.4.1.0/24\n1.4.2.0/23\n1.4.4.0/24\n1.4.5.0/24\n1.4.6.0/23\n1.4.8.0/21\n1.4.16.0/20\n1.4.32.0/19\n1.4.64.0/18\n1.8.0.0/16\n1.10.0.0/21\n1.10.8.0/23\n1.10.11.0/24\n1.10.12.0/22\n1.10.16.0/20\n1.10.32.0/19\n1.10.64.0/18\n1.12.0.0/14\n1.24.0.0/13\n1.45.0.0/16\n1.48.0.0/15\n1.50.0.0/16\n1.51.0.0/16\n1.56.0.0/13\n1.68.0.0/14\n1.80.0.0/13\n1.88.0.0/14\n1.92.0.0/15\n1.94.0.0/15\n1.116.0.0/15\n1.118.0.0/16\n1.119.0.0/17\n1.119.128.0/17\n1.180.0.0/14\n1.184.0.0/15\n1.188.0.0/14\n1.192.0.0/13\n1.202.0.0/15\n1.204.0.0/14\n14.0.0.0/21\n14.0.12.0/22\n14.1.0.0/22\n14.1.24.0/22\n14.1.96.0/22\n14.1.108.0/22\n14.16.0.0/12\n14.102.128.0/22\n14.102.156.0/22\n14.102.180.0/22\n14.103.0.0/16\n14.104.0.0/13\n14.112.0.0/12\n14.130.0.0/15\n14.134.0.0/15\n14.144.0.0/12\n14.192.60.0/22\n14.192.76.0/22\n14.196.0.0/15\n14.204.0.0/15\n14.208.0.0/12\n27.0.128.0/22\n27.0.132.0/22\n27.0.160.0/22\n27.0.164.0/22\n27.0.188.0/22\n27.0.204.0/22\n27.0.208.0/22\n27.0.212.0/22\n27.8.0.0/13\n27.16.0.0/12\n27.34.232.0/21\n27.36.0.0/14\n27.40.0.0/13\n27.50.40.0/21\n27.50.128.0/17\n27.54.72.0/21\n27.54.152.0/21\n27.54.192.0/18\n27.98.208.0/20\n27.98.224.0/19\n27.99.128.0/17\n27.103.0.0/16\n27.106.128.0/18\n27.106.204.0/22\n27.109.32.0/19\n27.109.124.0/22\n27.112.0.0/18\n27.112.80.0/20\n27.112.112.0/22\n27.112.116.0/22\n27.113.128.0/18\n27.115.0.0/17\n27.116.44.0/22\n27.121.72.0/21\n27.121.120.0/21\n27.128.0.0/15\n27.131.220.0/22\n27.144.0.0/16\n27.148.0.0/14\n27.152.0.0/13\n27.184.0.0/13\n27.192.0.0/11\n27.224.0.0/14\n36.0.0.0/22\n36.0.8.0/21\n36.0.16.0/20\n36.0.32.0/19\n36.0.64.0/18\n36.0.128.0/17\n36.1.0.0/16\n36.4.0.0/14\n36.16.0.0/12\n36.32.0.0/14\n36.36.0.0/16\n36.37.0.0/19\n36.37.36.0/23\n36.37.39.0/24\n36.37.40.0/21\n36.37.48.0/20\n36.40.0.0/13\n36.48.0.0/15\n36.51.0.0/16\n36.56.0.0/13\n36.96.0.0/11\n36.128.0.0/10\n36.192.0.0/11\n36.248.0.0/14\n36.254.0.0/16\n36.255.116.0/22\n36.255.128.0/22\n36.255.164.0/22\n36.255.172.0/22\n36.255.176.0/22\n39.0.0.0/24\n39.0.2.0/23\n39.0.4.0/22\n39.0.8.0/21\n39.0.16.0/20\n39.0.32.0/19\n39.0.64.0/18\n39.0.128.0/17\n39.64.0.0/11\n39.96.0.0/13\n39.104.0.0/14\n39.108.0.0/16\n39.128.0.0/10\n40.72.0.0/15\n40.125.128.0/17\n40.126.64.0/18\n42.0.0.0/22\n42.0.8.0/21\n42.0.16.0/21\n42.0.24.0/22\n42.0.32.0/19\n42.0.128.0/17\n42.1.0.0/19\n42.1.32.0/20\n42.1.48.0/21\n42.1.56.0/22\n42.1.128.0/17\n42.4.0.0/14\n42.48.0.0/15\n42.50.0.0/16\n42.51.0.0/16\n42.52.0.0/14\n42.56.0.0/14\n42.62.0.0/17\n42.62.128.0/19\n42.62.160.0/20\n42.62.180.0/22\n42.62.184.0/21\n42.63.0.0/16\n42.80.0.0/15\n42.83.64.0/20\n42.83.80.0/22\n42.83.88.0/21\n42.83.96.0/19\n42.83.128.0/17\n42.84.0.0/14\n42.88.0.0/13\n42.96.64.0/19\n42.96.96.0/21\n42.96.108.0/22\n42.96.112.0/20\n42.96.128.0/17\n42.97.0.0/16\n42.99.0.0/18\n42.99.64.0/19\n42.99.96.0/20\n42.99.112.0/22\n42.99.120.0/21\n42.100.0.0/14\n42.120.0.0/15\n42.122.0.0/16\n42.123.0.0/19\n42.123.36.0/22\n42.123.40.0/21\n42.123.48.0/20\n42.123.64.0/18\n42.123.128.0/17\n42.128.0.0/12\n42.156.0.0/19\n42.156.36.0/22\n42.156.40.0/21\n42.156.48.0/20\n42.156.64.0/18\n42.156.128.0/17\n42.157.0.0/16\n42.158.0.0/16\n42.159.0.0/16\n42.160.0.0/12\n42.176.0.0/13\n42.184.0.0/15\n42.186.0.0/16\n42.187.0.0/18\n42.187.64.0/19\n42.187.96.0/20\n42.187.112.0/21\n42.187.120.0/22\n42.187.128.0/17\n42.192.0.0/15\n42.194.0.0/21\n42.194.8.0/22\n42.194.12.0/22\n42.194.16.0/20\n42.194.32.0/19\n42.194.64.0/18\n42.194.128.0/17\n42.195.0.0/16\n42.196.0.0/14\n42.201.0.0/17\n42.202.0.0/15\n42.204.0.0/14\n42.208.0.0/12\n42.224.0.0/12\n42.240.0.0/17\n42.240.128.0/17\n42.242.0.0/15\n42.244.0.0/14\n42.248.0.0/13\n43.136.0.0/13\n43.144.0.0/13\n43.176.0.0/12\n43.192.0.0/14\n43.196.0.0/15\n43.224.12.0/22\n43.224.24.0/22\n43.224.44.0/22\n43.224.52.0/22\n43.224.56.0/22\n43.224.64.0/22\n43.224.68.0/22\n43.224.72.0/22\n43.224.80.0/22\n43.224.100.0/22\n43.224.144.0/22\n43.224.160.0/22\n43.224.176.0/22\n43.224.184.0/22\n43.224.200.0/22\n43.224.204.0/22\n43.224.208.0/22\n43.224.212.0/22\n43.224.216.0/22\n43.224.240.0/22\n43.225.76.0/22\n43.225.84.0/22\n43.225.120.0/22\n43.225.172.0/22\n43.225.180.0/22\n43.225.208.0/22\n43.225.216.0/22\n43.225.220.0/22\n43.225.224.0/22\n43.225.228.0/22\n43.225.232.0/22\n43.225.236.0/22\n43.225.240.0/22\n43.225.244.0/22\n43.225.252.0/22\n43.226.32.0/22\n43.226.36.0/22\n43.226.40.0/22\n43.226.44.0/22\n43.226.48.0/22\n43.226.52.0/22\n43.226.56.0/22\n43.226.60.0/22\n43.226.64.0/22\n43.226.68.0/22\n43.226.72.0/22\n43.226.76.0/22\n43.226.80.0/22\n43.226.84.0/22\n43.226.88.0/22\n43.226.92.0/22\n43.226.96.0/22\n43.226.100.0/22\n43.226.104.0/22\n43.226.108.0/22\n43.226.112.0/22\n43.226.116.0/22\n43.226.120.0/22\n43.226.128.0/22\n43.226.132.0/22\n43.226.136.0/22\n43.226.140.0/22\n43.226.144.0/22\n43.226.148.0/22\n43.226.152.0/22\n43.226.156.0/22\n43.226.160.0/22\n43.226.164.0/22\n43.226.168.0/22\n43.226.172.0/22\n43.226.176.0/22\n43.226.180.0/22\n43.226.184.0/22\n43.226.188.0/22\n43.226.192.0/22\n43.226.196.0/22\n43.226.200.0/22\n43.226.204.0/22\n43.226.208.0/22\n43.226.212.0/22\n43.226.236.0/22\n43.226.240.0/22\n43.226.244.0/22\n43.226.248.0/22\n43.226.252.0/22\n43.227.0.0/22\n43.227.4.0/22\n43.227.8.0/22\n43.227.32.0/22\n43.227.36.0/22\n43.227.40.0/22\n43.227.44.0/22\n43.227.48.0/22\n43.227.52.0/22\n43.227.56.0/22\n43.227.60.0/22\n43.227.64.0/22\n43.227.68.0/22\n43.227.72.0/22\n43.227.76.0/22\n43.227.80.0/22\n43.227.84.0/22\n43.227.88.0/22\n43.227.92.0/22\n43.227.96.0/22\n43.227.100.0/22\n43.227.104.0/22\n43.227.136.0/22\n43.227.140.0/22\n43.227.144.0/22\n43.227.152.0/22\n43.227.156.0/22\n43.227.160.0/22\n43.227.164.0/22\n43.227.168.0/22\n43.227.172.0/22\n43.227.176.0/22\n43.227.180.0/22\n43.227.188.0/22\n43.227.192.0/22\n43.227.196.0/22\n43.227.200.0/22\n43.227.204.0/22\n43.227.208.0/22\n43.227.212.0/22\n43.227.216.0/22\n43.227.220.0/22\n43.227.232.0/22\n43.227.248.0/22\n43.227.252.0/22\n43.228.0.0/22\n43.228.4.0/22\n43.228.8.0/22\n43.228.12.0/22\n43.228.16.0/22\n43.228.20.0/22\n43.228.24.0/22\n43.228.28.0/22\n43.228.32.0/22\n43.228.36.0/22\n43.228.40.0/22\n43.228.44.0/22\n43.228.48.0/22\n43.228.52.0/22\n43.228.56.0/22\n43.228.60.0/22\n43.228.64.0/22\n43.228.68.0/22\n43.228.76.0/22\n43.228.100.0/22\n43.228.116.0/22\n43.228.120.0/22\n43.228.132.0/22\n43.228.136.0/22\n43.228.148.0/22\n43.228.152.0/22\n43.228.188.0/22\n43.228.204.0/22\n43.228.240.0/22\n43.229.40.0/22\n43.229.48.0/22\n43.229.56.0/22\n43.229.96.0/22\n43.229.136.0/22\n43.229.140.0/22\n43.229.144.0/22\n43.229.168.0/22\n43.229.172.0/22\n43.229.176.0/22\n43.229.180.0/22\n43.229.184.0/22\n43.229.188.0/22\n43.229.192.0/22\n43.229.196.0/22\n43.229.216.0/22\n43.229.220.0/22\n43.229.232.0/22\n43.229.236.0/22\n43.230.20.0/22\n43.230.32.0/22\n43.230.68.0/22\n43.230.72.0/22\n43.230.84.0/22\n43.230.124.0/22\n43.230.136.0/22\n43.230.220.0/22\n43.230.224.0/22\n43.230.228.0/22\n43.230.232.0/22\n43.230.236.0/22\n43.230.240.0/22\n43.230.244.0/22\n43.230.248.0/22\n43.230.252.0/22\n43.231.32.0/22\n43.231.36.0/22\n43.231.40.0/22\n43.231.44.0/22\n43.231.80.0/22\n43.231.84.0/22\n43.231.88.0/22\n43.231.92.0/22\n43.231.96.0/22\n43.231.100.0/22\n43.231.104.0/22\n43.231.108.0/22\n43.231.136.0/22\n43.231.140.0/22\n43.231.144.0/22\n43.231.148.0/22\n43.231.152.0/22\n43.231.156.0/22\n43.231.160.0/22\n43.231.164.0/22\n43.231.168.0/22\n43.231.172.0/22\n43.231.176.0/22\n43.231.180.0/22\n43.236.0.0/22\n43.236.4.0/22\n43.236.8.0/22\n43.236.12.0/22\n43.236.16.0/22\n43.236.20.0/22\n43.236.24.0/22\n43.236.28.0/22\n43.236.32.0/22\n43.236.36.0/22\n43.236.40.0/22\n43.236.44.0/22\n43.236.48.0/22\n43.236.52.0/22\n43.236.56.0/22\n43.236.60.0/22\n43.236.64.0/22\n43.236.68.0/22\n43.236.72.0/22\n43.236.76.0/22\n43.236.80.0/22\n43.236.84.0/22\n43.236.88.0/22\n43.236.92.0/22\n43.236.96.0/22\n43.236.100.0/22\n43.236.104.0/22\n43.236.108.0/22\n43.236.112.0/22\n43.236.116.0/22\n43.236.120.0/22\n43.236.124.0/22\n43.236.128.0/22\n43.236.132.0/22\n43.236.136.0/22\n43.236.140.0/22\n43.236.144.0/22\n43.236.148.0/22\n43.236.152.0/22\n43.236.156.0/22\n43.236.160.0/22\n43.236.164.0/22\n43.236.168.0/22\n43.236.172.0/22\n43.236.176.0/22\n43.236.180.0/22\n43.236.184.0/22\n43.236.188.0/22\n43.236.192.0/22\n43.236.196.0/22\n43.236.200.0/22\n43.236.204.0/22\n43.236.208.0/22\n43.236.212.0/22\n43.236.216.0/22\n43.236.220.0/22\n43.236.224.0/22\n43.236.228.0/22\n43.236.232.0/22\n43.236.236.0/22\n43.236.240.0/22\n43.236.244.0/22\n43.236.248.0/22\n43.236.252.0/22\n43.237.0.0/22\n43.237.4.0/22\n43.237.8.0/22\n43.237.12.0/22\n43.237.16.0/22\n43.237.20.0/22\n43.237.24.0/22\n43.237.28.0/22\n43.237.32.0/22\n43.237.36.0/22\n43.237.40.0/22\n43.237.44.0/22\n43.237.48.0/22\n43.237.52.0/22\n43.237.56.0/22\n43.237.60.0/22\n43.237.64.0/22\n43.237.68.0/22\n43.237.72.0/22\n43.237.76.0/22\n43.237.80.0/22\n43.237.84.0/22\n43.237.88.0/22\n43.237.92.0/22\n43.237.96.0/22\n43.237.100.0/22\n43.237.104.0/22\n43.237.108.0/22\n43.237.112.0/22\n43.237.116.0/22\n43.237.120.0/22\n43.237.124.0/22\n43.237.128.0/22\n43.237.132.0/22\n43.237.136.0/22\n43.237.140.0/22\n43.237.144.0/22\n43.237.148.0/22\n43.237.152.0/22\n43.237.156.0/22\n43.237.160.0/22\n43.237.164.0/22\n43.237.168.0/22\n43.237.172.0/22\n43.237.176.0/22\n43.237.180.0/22\n43.237.184.0/22\n43.237.188.0/22\n43.237.192.0/22\n43.237.200.0/22\n43.237.204.0/22\n43.237.208.0/22\n43.237.212.0/22\n43.237.216.0/22\n43.237.220.0/22\n43.237.224.0/22\n43.237.228.0/22\n43.237.232.0/22\n43.237.236.0/22\n43.237.240.0/22\n43.237.244.0/22\n43.237.248.0/22\n43.237.252.0/22\n43.238.0.0/22\n43.238.4.0/22\n43.238.8.0/22\n43.238.12.0/22\n43.238.16.0/22\n43.238.20.0/22\n43.238.24.0/22\n43.238.28.0/22\n43.238.32.0/22\n43.238.36.0/22\n43.238.40.0/22\n43.238.44.0/22\n43.238.48.0/22\n43.238.52.0/22\n43.238.56.0/22\n43.238.60.0/22\n43.238.64.0/22\n43.238.68.0/22\n43.238.72.0/22\n43.238.76.0/22\n43.238.80.0/22\n43.238.84.0/22\n43.238.88.0/22\n43.238.92.0/22\n43.238.96.0/22\n43.238.100.0/22\n43.238.104.0/22\n43.238.108.0/22\n43.238.112.0/22\n43.238.116.0/22\n43.238.120.0/22\n43.238.124.0/22\n43.238.128.0/22\n43.238.132.0/22\n43.238.136.0/22\n43.238.140.0/22\n43.238.144.0/22\n43.238.148.0/22\n43.238.152.0/22\n43.238.156.0/22\n43.238.160.0/22\n43.238.164.0/22\n43.238.168.0/22\n43.238.172.0/22\n43.238.176.0/22\n43.238.180.0/22\n43.238.184.0/22\n43.238.188.0/22\n43.238.192.0/22\n43.238.196.0/22\n43.238.200.0/22\n43.238.204.0/22\n43.238.208.0/22\n43.238.212.0/22\n43.238.216.0/22\n43.238.220.0/22\n43.238.224.0/22\n43.238.228.0/22\n43.238.232.0/22\n43.238.236.0/22\n43.238.240.0/22\n43.238.244.0/22\n43.238.248.0/22\n43.238.252.0/22\n43.239.0.0/22\n43.239.4.0/22\n43.239.8.0/21\n43.239.16.0/22\n43.239.20.0/22\n43.239.24.0/22\n43.239.28.0/22\n43.239.32.0/22\n43.239.36.0/22\n43.239.40.0/22\n43.239.44.0/22\n43.239.48.0/22\n43.239.116.0/22\n43.239.120.0/22\n43.239.172.0/22\n43.239.176.0/22\n43.240.0.0/22\n43.240.56.0/22\n43.240.60.0/22\n43.240.68.0/22\n43.240.72.0/22\n43.240.76.0/22\n43.240.84.0/22\n43.240.124.0/22\n43.240.128.0/22\n43.240.132.0/22\n43.240.136.0/22\n43.240.144.0/22\n43.240.156.0/22\n43.240.160.0/22\n43.240.164.0/22\n43.240.168.0/22\n43.240.172.0/22\n43.240.176.0/22\n43.240.180.0/22\n43.240.184.0/22\n43.240.188.0/22\n43.240.192.0/22\n43.240.196.0/22\n43.240.200.0/22\n43.240.204.0/22\n43.240.208.0/22\n43.240.212.0/22\n43.240.216.0/22\n43.240.220.0/22\n43.240.240.0/22\n43.240.244.0/22\n43.240.248.0/22\n43.240.252.0/22\n43.241.0.0/22\n43.241.4.0/22\n43.241.8.0/22\n43.241.12.0/22\n43.241.16.0/22\n43.241.20.0/22\n43.241.48.0/22\n43.241.76.0/22\n43.241.80.0/22\n43.241.84.0/22\n43.241.88.0/22\n43.241.92.0/22\n43.241.112.0/22\n43.241.168.0/22\n43.241.172.0/22\n43.241.176.0/22\n43.241.180.0/22\n43.241.184.0/22\n43.241.208.0/22\n43.241.212.0/22\n43.241.216.0/22\n43.241.220.0/22\n43.241.224.0/22\n43.241.228.0/22\n43.241.232.0/22\n43.241.236.0/22\n43.241.240.0/22\n43.241.248.0/22\n43.241.252.0/22\n43.242.8.0/22\n43.242.12.0/22\n43.242.16.0/21\n43.242.24.0/22\n43.242.28.0/22\n43.242.44.0/22\n43.242.48.0/22\n43.242.52.0/22\n43.242.56.0/22\n43.242.60.0/22\n43.242.64.0/22\n43.242.72.0/22\n43.242.76.0/22\n43.242.80.0/22\n43.242.84.0/22\n43.242.88.0/22\n43.242.92.0/22\n43.242.96.0/22\n43.242.144.0/22\n43.242.148.0/22\n43.242.152.0/22\n43.242.156.0/22\n43.242.160.0/22\n43.242.164.0/22\n43.242.168.0/22\n43.242.180.0/22\n43.242.188.0/22\n43.242.192.0/22\n43.242.196.0/22\n43.242.204.0/22\n43.242.216.0/22\n43.242.220.0/22\n43.242.252.0/22\n43.243.4.0/22\n43.243.8.0/22\n43.243.12.0/22\n43.243.16.0/22\n43.243.88.0/22\n43.243.128.0/22\n43.243.136.0/22\n43.243.144.0/22\n43.243.148.0/22\n43.243.156.0/22\n43.243.180.0/22\n43.243.228.0/22\n43.243.232.0/22\n43.243.244.0/22\n43.246.0.0/22\n43.246.4.0/22\n43.246.8.0/22\n43.246.12.0/22\n43.246.16.0/22\n43.246.20.0/22\n43.246.24.0/22\n43.246.28.0/22\n43.246.32.0/22\n43.246.36.0/22\n43.246.40.0/22\n43.246.44.0/22\n43.246.48.0/22\n43.246.52.0/22\n43.246.56.0/22\n43.246.60.0/22\n43.246.64.0/22\n43.246.68.0/22\n43.246.72.0/22\n43.246.76.0/22\n43.246.80.0/22\n43.246.84.0/22\n43.246.88.0/22\n43.246.92.0/22\n43.246.96.0/22\n43.246.112.0/22\n43.246.228.0/22\n43.247.4.0/22\n43.247.8.0/22\n43.247.44.0/22\n43.247.48.0/22\n43.247.68.0/22\n43.247.76.0/22\n43.247.84.0/22\n43.247.88.0/22\n43.247.92.0/22\n43.247.96.0/22\n43.247.100.0/22\n43.247.108.0/22\n43.247.112.0/22\n43.247.148.0/22\n43.247.152.0/22\n43.247.176.0/22\n43.247.180.0/22\n43.247.184.0/22\n43.247.188.0/22\n43.247.196.0/22\n43.247.200.0/22\n43.247.204.0/22\n43.247.208.0/22\n43.247.212.0/22\n43.247.216.0/22\n43.247.220.0/22\n43.247.224.0/22\n43.247.228.0/22\n43.247.232.0/22\n43.247.236.0/22\n43.247.240.0/22\n43.247.244.0/22\n43.247.248.0/22\n43.247.252.0/22\n43.248.0.0/22\n43.248.4.0/22\n43.248.20.0/22\n43.248.28.0/22\n43.248.48.0/22\n43.248.76.0/22\n43.248.80.0/22\n43.248.84.0/22\n43.248.88.0/22\n43.248.92.0/22\n43.248.96.0/22\n43.248.100.0/22\n43.248.104.0/22\n43.248.108.0/22\n43.248.112.0/22\n43.248.116.0/22\n43.248.120.0/22\n43.248.124.0/22\n43.248.128.0/22\n43.248.132.0/22\n43.248.136.0/22\n43.248.140.0/22\n43.248.144.0/22\n43.248.148.0/22\n43.248.176.0/22\n43.248.180.0/22\n43.248.184.0/22\n43.248.188.0/22\n43.248.192.0/22\n43.248.196.0/22\n43.248.200.0/22\n43.248.204.0/22\n43.248.208.0/22\n43.248.228.0/22\n43.248.232.0/22\n43.248.244.0/22\n43.249.4.0/22\n43.249.8.0/22\n43.249.120.0/22\n43.249.132.0/22\n43.249.136.0/22\n43.249.144.0/22\n43.249.148.0/22\n43.249.152.0/22\n43.249.156.0/22\n43.249.160.0/22\n43.249.164.0/22\n43.249.168.0/22\n43.249.192.0/22\n43.249.236.0/22\n43.250.4.0/22\n43.250.12.0/22\n43.250.16.0/22\n43.250.20.0/22\n43.250.28.0/22\n43.250.32.0/22\n43.250.36.0/22\n43.250.72.0/22\n43.250.96.0/22\n43.250.100.0/22\n43.250.104.0/22\n43.250.108.0/22\n43.250.112.0/22\n43.250.116.0/22\n43.250.128.0/22\n43.250.144.0/22\n43.250.148.0/22\n43.250.160.0/22\n43.250.168.0/22\n43.250.172.0/22\n43.250.176.0/22\n43.250.200.0/22\n43.250.212.0/22\n43.250.216.0/22\n43.250.220.0/22\n43.250.236.0/22\n43.250.244.0/22\n43.251.4.0/22\n43.251.8.0/22\n43.251.36.0/22\n43.251.100.0/22\n43.251.116.0/22\n43.251.192.0/22\n43.251.232.0/22\n43.251.236.0/22\n43.251.244.0/22\n43.252.48.0/22\n43.252.56.0/22\n43.254.0.0/22\n43.254.4.0/22\n43.254.8.0/22\n43.254.24.0/22\n43.254.36.0/22\n43.254.44.0/22\n43.254.52.0/22\n43.254.64.0/22\n43.254.72.0/22\n43.254.84.0/22\n43.254.88.0/22\n43.254.92.0/22\n43.254.100.0/22\n43.254.104.0/22\n43.254.112.0/22\n43.254.116.0/22\n43.254.128.0/22\n43.254.136.0/22\n43.254.140.0/22\n43.254.144.0/22\n43.254.148.0/22\n43.254.152.0/22\n43.254.156.0/22\n43.254.168.0/22\n43.254.172.0/22\n43.254.180.0/22\n43.254.184.0/22\n43.254.188.0/22\n43.254.192.0/22\n43.254.196.0/22\n43.254.200.0/22\n43.254.208.0/22\n43.254.220.0/22\n43.254.224.0/22\n43.254.228.0/22\n43.254.232.0/22\n43.254.236.0/22\n43.254.240.0/22\n43.254.248.0/22\n43.254.252.0/22\n43.255.0.0/22\n43.255.4.0/22\n43.255.8.0/22\n43.255.16.0/22\n43.255.48.0/22\n43.255.64.0/22\n43.255.68.0/22\n43.255.72.0/22\n43.255.76.0/22\n43.255.84.0/22\n43.255.96.0/22\n43.255.144.0/22\n43.255.176.0/22\n43.255.184.0/22\n43.255.192.0/22\n43.255.200.0/22\n43.255.204.0/22\n43.255.208.0/22\n43.255.212.0/22\n43.255.224.0/22\n43.255.228.0/22\n43.255.232.0/22\n43.255.244.0/22\n45.40.192.0/18\n45.65.16.0/22\n45.65.20.0/22\n45.65.24.0/22\n45.65.28.0/22\n45.112.132.0/22\n45.112.188.0/22\n45.112.208.0/22\n45.112.212.0/22\n45.112.216.0/22\n45.112.220.0/22\n45.112.228.0/22\n45.112.232.0/22\n45.112.236.0/22\n45.113.12.0/22\n45.113.16.0/22\n45.113.20.0/22\n45.113.24.0/22\n45.113.28.0/22\n45.113.40.0/22\n45.113.52.0/22\n45.113.56.0/22\n45.113.72.0/22\n45.113.144.0/22\n45.113.148.0/22\n45.113.168.0/22\n45.113.176.0/22\n45.113.184.0/22\n45.113.200.0/22\n45.113.204.0/22\n45.113.208.0/22\n45.113.212.0/22\n45.113.216.0/22\n45.113.220.0/22\n45.113.240.0/22\n45.113.252.0/22\n45.114.0.0/22\n45.114.32.0/22\n45.114.40.0/22\n45.114.52.0/22\n45.114.96.0/22\n45.114.124.0/22\n45.114.136.0/22\n45.114.196.0/22\n45.114.200.0/22\n45.114.228.0/22\n45.114.252.0/22\n45.115.44.0/22\n45.115.100.0/22\n45.115.120.0/22\n45.115.132.0/22\n45.115.144.0/22\n45.115.156.0/22\n45.115.164.0/22\n45.115.200.0/22\n45.115.212.0/22\n45.115.228.0/22\n45.115.236.0/22\n45.115.244.0/22\n45.115.248.0/22\n45.116.16.0/22\n45.116.24.0/22\n45.116.32.0/22\n45.116.36.0/22\n45.116.52.0/22\n45.116.96.0/22\n45.116.100.0/22\n45.116.140.0/22\n45.116.152.0/22\n45.116.208.0/22\n45.117.8.0/22\n45.117.20.0/22\n45.117.68.0/22\n45.117.124.0/22\n45.117.252.0/22\n45.119.52.0/22\n45.119.60.0/22\n45.119.64.0/22\n45.119.68.0/22\n45.119.72.0/22\n45.119.104.0/22\n45.119.116.0/22\n45.119.232.0/22\n45.120.100.0/22\n45.120.140.0/22\n45.120.164.0/22\n45.120.240.0/22\n45.121.52.0/22\n45.121.64.0/22\n45.121.68.0/22\n45.121.72.0/22\n45.121.92.0/22\n45.121.96.0/22\n45.121.172.0/22\n45.121.176.0/22\n45.121.212.0/22\n45.121.240.0/22\n45.121.244.0/22\n45.121.248.0/22\n45.121.252.0/22\n45.122.0.0/22\n45.122.4.0/22\n45.122.8.0/22\n45.122.12.0/22\n45.122.16.0/22\n45.122.20.0/22\n45.122.24.0/22\n45.122.28.0/22\n45.122.32.0/22\n45.122.36.0/22\n45.122.40.0/22\n45.122.60.0/22\n45.122.64.0/22\n45.122.68.0/22\n45.122.72.0/22\n45.122.76.0/22\n45.122.80.0/22\n45.122.84.0/22\n45.122.88.0/22\n45.122.92.0/22\n45.122.96.0/21\n45.122.104.0/22\n45.122.108.0/22\n45.122.112.0/22\n45.122.116.0/22\n45.122.160.0/22\n45.122.164.0/22\n45.122.168.0/22\n45.122.172.0/22\n45.122.176.0/22\n45.122.180.0/22\n45.122.184.0/22\n45.122.188.0/22\n45.122.192.0/22\n45.122.196.0/22\n45.122.200.0/22\n45.122.204.0/22\n45.122.208.0/22\n45.122.212.0/22\n45.122.216.0/22\n45.123.28.0/22\n45.123.32.0/22\n45.123.36.0/22\n45.123.44.0/22\n45.123.48.0/22\n45.123.52.0/22\n45.123.56.0/22\n45.123.60.0/22\n45.123.64.0/22\n45.123.68.0/22\n45.123.72.0/22\n45.123.76.0/22\n45.123.80.0/22\n45.123.84.0/22\n45.123.88.0/22\n45.123.120.0/22\n45.123.128.0/22\n45.123.132.0/22\n45.123.136.0/22\n45.123.148.0/22\n45.123.152.0/22\n45.123.156.0/22\n45.123.164.0/22\n45.123.168.0/22\n45.123.172.0/22\n45.123.176.0/22\n45.123.180.0/22\n45.123.184.0/22\n45.123.204.0/22\n45.123.212.0/22\n45.123.224.0/22\n45.123.228.0/22\n45.123.232.0/22\n45.123.236.0/22\n45.123.240.0/22\n45.123.244.0/22\n45.123.248.0/22\n45.123.252.0/22\n45.124.0.0/22\n45.124.20.0/22\n45.124.28.0/22\n45.124.32.0/22\n45.124.36.0/22\n45.124.44.0/22\n45.124.68.0/22\n45.124.76.0/22\n45.124.80.0/22\n45.124.100.0/22\n45.124.124.0/22\n45.124.172.0/22\n45.124.176.0/22\n45.124.208.0/22\n45.124.248.0/22\n45.125.16.0/22\n45.125.24.0/22\n45.125.44.0/22\n45.125.52.0/22\n45.125.56.0/22\n45.125.76.0/22\n45.125.80.0/22\n45.125.84.0/22\n45.125.88.0/22\n45.125.92.0/22\n45.125.96.0/22\n45.125.100.0/22\n45.125.136.0/22\n45.126.48.0/22\n45.126.52.0/22\n45.126.100.0/22\n45.126.108.0/22\n45.126.112.0/22\n45.126.116.0/22\n45.126.120.0/22\n45.126.212.0/22\n45.126.220.0/22\n45.127.8.0/22\n45.127.12.0/22\n45.127.128.0/22\n45.127.144.0/22\n45.127.148.0/22\n45.127.156.0/22\n45.127.216.0/22\n45.248.8.0/22\n45.248.80.0/22\n45.248.84.0/22\n45.248.88.0/22\n45.248.96.0/22\n45.248.100.0/22\n45.248.104.0/22\n45.248.108.0/22\n45.248.128.0/22\n45.248.132.0/22\n45.248.204.0/22\n45.248.208.0/22\n45.248.212.0/22\n45.248.216.0/22\n45.248.220.0/22\n45.248.224.0/22\n45.248.228.0/22\n45.248.232.0/22\n45.248.236.0/22\n45.248.240.0/22\n45.248.244.0/22\n45.248.248.0/22\n45.248.252.0/22\n45.249.0.0/22\n45.249.4.0/22\n45.249.12.0/22\n45.249.16.0/22\n45.249.20.0/22\n45.249.24.0/22\n45.249.28.0/22\n45.249.32.0/22\n45.249.36.0/22\n45.249.112.0/22\n45.249.188.0/22\n45.249.192.0/22\n45.249.196.0/22\n45.249.200.0/22\n45.249.204.0/22\n45.249.208.0/22\n45.249.212.0/22\n45.250.12.0/22\n45.250.16.0/22\n45.250.28.0/22\n45.250.32.0/22\n45.250.36.0/22\n45.250.40.0/22\n45.250.76.0/22\n45.250.80.0/22\n45.250.84.0/22\n45.250.88.0/22\n45.250.92.0/22\n45.250.96.0/22\n45.250.104.0/22\n45.250.108.0/22\n45.250.112.0/22\n45.250.116.0/22\n45.250.120.0/22\n45.250.124.0/22\n45.250.128.0/22\n45.250.132.0/22\n45.250.136.0/22\n45.250.140.0/22\n45.250.144.0/22\n45.250.148.0/22\n45.250.152.0/22\n45.250.164.0/22\n45.250.180.0/22\n45.250.184.0/22\n45.250.188.0/22\n45.250.192.0/22\n45.251.0.0/22\n45.251.8.0/22\n45.251.16.0/22\n45.251.20.0/22\n45.251.52.0/22\n45.251.84.0/22\n45.251.88.0/22\n45.251.92.0/22\n45.251.96.0/22\n45.251.100.0/22\n45.251.120.0/22\n45.251.124.0/22\n45.251.136.0/22\n45.251.140.0/22\n45.251.144.0/22\n45.251.148.0/22\n45.251.152.0/22\n45.251.156.0/22\n45.251.160.0/22\n45.251.164.0/22\n45.251.168.0/22\n45.251.172.0/22\n45.251.176.0/22\n45.251.180.0/22\n45.251.184.0/22\n45.251.188.0/22\n45.251.192.0/22\n45.251.196.0/22\n45.251.200.0/22\n45.251.204.0/22\n45.251.208.0/22\n45.251.212.0/22\n45.251.216.0/22\n45.251.220.0/22\n45.251.224.0/22\n45.251.240.0/22\n45.252.0.0/22\n45.252.4.0/22\n45.252.8.0/22\n45.252.12.0/22\n45.252.16.0/22\n45.252.20.0/22\n45.252.24.0/22\n45.252.28.0/22\n45.252.32.0/22\n45.252.36.0/22\n45.252.40.0/22\n45.252.44.0/22\n45.252.48.0/22\n45.252.84.0/22\n45.252.88.0/22\n45.252.92.0/22\n45.252.96.0/22\n45.252.100.0/22\n45.252.104.0/22\n45.252.108.0/22\n45.252.112.0/22\n45.252.116.0/22\n45.252.120.0/22\n45.252.124.0/22\n45.252.128.0/22\n45.252.132.0/22\n45.252.136.0/22\n45.252.140.0/22\n45.252.144.0/22\n45.252.148.0/22\n45.252.152.0/22\n45.252.156.0/22\n45.252.160.0/22\n45.252.164.0/22\n45.252.168.0/22\n45.252.172.0/22\n45.252.176.0/22\n45.252.192.0/22\n45.252.196.0/22\n45.252.200.0/22\n45.252.204.0/22\n45.252.208.0/22\n45.252.212.0/22\n45.252.216.0/22\n45.252.220.0/22\n45.252.224.0/22\n45.252.228.0/22\n45.252.232.0/22\n45.253.0.0/22\n45.253.4.0/22\n45.253.8.0/22\n45.253.12.0/22\n45.253.16.0/22\n45.253.20.0/22\n45.253.24.0/22\n45.253.28.0/22\n45.253.32.0/22\n45.253.36.0/22\n45.253.40.0/22\n45.253.44.0/22\n45.253.48.0/22\n45.253.52.0/22\n45.253.56.0/22\n45.253.60.0/22\n45.253.64.0/22\n45.253.68.0/22\n45.253.72.0/22\n45.253.76.0/22\n45.253.80.0/22\n45.253.84.0/22\n45.253.92.0/22\n45.253.96.0/22\n45.253.100.0/22\n45.253.104.0/22\n45.253.108.0/22\n45.253.112.0/22\n45.253.116.0/22\n45.253.120.0/22\n45.253.132.0/22\n45.253.136.0/22\n45.253.140.0/22\n45.253.144.0/22\n45.253.148.0/22\n45.253.152.0/22\n45.253.156.0/22\n45.253.160.0/22\n45.253.164.0/22\n45.253.168.0/22\n45.253.172.0/22\n45.253.176.0/22\n45.253.180.0/22\n45.253.184.0/22\n45.253.188.0/22\n45.253.192.0/22\n45.253.196.0/22\n45.253.200.0/22\n45.253.204.0/22\n45.253.208.0/22\n45.253.212.0/22\n45.253.216.0/22\n45.253.220.0/22\n45.253.224.0/22\n45.253.228.0/22\n45.253.232.0/22\n45.253.236.0/22\n45.253.240.0/22\n45.253.244.0/22\n45.254.0.0/22\n45.254.4.0/22\n45.254.8.0/22\n45.254.12.0/22\n45.254.16.0/22\n45.254.20.0/22\n45.254.24.0/22\n45.254.28.0/22\n45.254.40.0/22\n45.254.48.0/22\n45.254.52.0/22\n45.254.56.0/22\n45.254.60.0/22\n45.254.64.0/22\n45.254.68.0/22\n45.254.72.0/22\n45.254.76.0/22\n45.254.80.0/22\n45.254.84.0/22\n45.254.88.0/22\n45.254.92.0/22\n45.254.96.0/22\n45.254.100.0/22\n45.254.104.0/22\n45.254.108.0/22\n45.254.112.0/22\n45.254.116.0/22\n45.254.120.0/22\n45.254.124.0/22\n45.254.128.0/22\n45.254.132.0/22\n45.254.136.0/22\n45.254.140.0/22\n45.254.144.0/22\n45.254.148.0/22\n45.254.152.0/22\n45.254.156.0/22\n45.254.160.0/22\n45.254.164.0/22\n45.254.168.0/22\n45.254.172.0/22\n45.254.176.0/22\n45.254.180.0/22\n45.254.184.0/22\n45.254.188.0/22\n45.254.192.0/22\n45.254.196.0/22\n45.254.200.0/22\n45.254.204.0/22\n45.254.208.0/22\n45.254.212.0/22\n45.254.216.0/22\n45.254.220.0/22\n45.254.224.0/22\n45.254.228.0/22\n45.254.236.0/22\n45.254.240.0/22\n45.254.248.0/22\n45.255.0.0/22\n45.255.4.0/22\n45.255.8.0/22\n45.255.12.0/22\n45.255.16.0/22\n45.255.20.0/22\n45.255.24.0/22\n45.255.28.0/22\n45.255.32.0/22\n45.255.36.0/22\n45.255.40.0/22\n45.255.44.0/22\n45.255.48.0/22\n45.255.52.0/22\n45.255.56.0/22\n45.255.60.0/22\n45.255.64.0/22\n45.255.68.0/22\n45.255.72.0/22\n45.255.76.0/22\n45.255.80.0/22\n45.255.84.0/22\n45.255.88.0/22\n45.255.92.0/22\n45.255.96.0/22\n45.255.100.0/22\n45.255.104.0/22\n45.255.108.0/22\n45.255.112.0/22\n45.255.116.0/22\n45.255.120.0/22\n45.255.124.0/22\n45.255.132.0/22\n45.255.136.0/22\n45.255.140.0/22\n45.255.144.0/22\n45.255.148.0/22\n45.255.152.0/22\n45.255.156.0/22\n45.255.160.0/22\n45.255.164.0/22\n45.255.168.0/22\n45.255.172.0/22\n45.255.176.0/22\n45.255.180.0/22\n45.255.184.0/22\n45.255.188.0/22\n45.255.192.0/22\n45.255.196.0/22\n45.255.200.0/22\n45.255.204.0/22\n45.255.208.0/22\n45.255.212.0/22\n45.255.216.0/22\n45.255.220.0/22\n45.255.224.0/22\n45.255.228.0/22\n45.255.232.0/22\n45.255.236.0/22\n45.255.240.0/22\n45.255.244.0/22\n45.255.248.0/22\n47.92.0.0/14\n47.96.0.0/11\n49.4.0.0/14\n49.51.0.0/16\n49.52.0.0/14\n49.64.0.0/11\n49.112.0.0/13\n49.120.0.0/14\n49.128.0.0/24\n49.128.2.0/23\n49.128.4.0/22\n49.140.0.0/15\n49.152.0.0/14\n49.208.0.0/15\n49.210.0.0/15\n49.220.0.0/14\n49.232.0.0/14\n49.239.0.0/18\n49.239.192.0/18\n49.246.224.0/19\n52.80.0.0/15\n52.82.0.0/15\n52.130.0.0/15\n54.222.0.0/15\n57.176.0.0/15\n58.14.0.0/15\n58.16.0.0/16\n58.17.0.0/17\n58.17.128.0/17\n58.18.0.0/16\n58.19.0.0/16\n58.20.0.0/16\n58.21.0.0/16\n58.22.0.0/15\n58.24.0.0/15\n58.30.0.0/15\n58.32.0.0/13\n58.40.0.0/15\n58.42.0.0/16\n58.43.0.0/16\n58.44.0.0/14\n58.48.0.0/13\n58.56.0.0/15\n58.58.0.0/16\n58.59.0.0/17\n58.59.128.0/17\n58.60.0.0/14\n58.65.232.0/21\n58.66.0.0/15\n58.68.128.0/17\n58.82.0.0/17\n58.83.0.0/17\n58.83.128.0/17\n58.87.64.0/18\n58.99.128.0/17\n58.100.0.0/15\n58.116.0.0/14\n58.128.0.0/13\n58.144.0.0/16\n58.154.0.0/15\n58.192.0.0/15\n58.194.0.0/15\n58.196.0.0/15\n58.198.0.0/15\n58.200.0.0/13\n58.208.0.0/12\n58.240.0.0/15\n58.242.0.0/15\n58.244.0.0/15\n58.246.0.0/15\n58.248.0.0/13\n59.32.0.0/13\n59.40.0.0/15\n59.42.0.0/16\n59.43.0.0/16\n59.44.0.0/14\n59.48.0.0/16\n59.49.0.0/17\n59.49.128.0/17\n59.50.0.0/16\n59.51.0.0/17\n59.51.128.0/17\n59.52.0.0/14\n59.56.0.0/14\n59.60.0.0/15\n59.62.0.0/15\n59.64.0.0/14\n59.68.0.0/14\n59.72.0.0/15\n59.74.0.0/15\n59.76.0.0/16\n59.77.0.0/16\n59.78.0.0/15\n59.80.0.0/15\n59.82.0.0/15\n59.107.0.0/17\n59.107.128.0/17\n59.108.0.0/15\n59.110.0.0/15\n59.151.0.0/17\n59.152.16.0/22\n59.152.20.0/22\n59.152.24.0/22\n59.152.28.0/22\n59.152.32.0/22\n59.152.36.0/22\n59.152.64.0/22\n59.152.68.0/22\n59.152.72.0/22\n59.152.76.0/22\n59.152.112.0/22\n59.152.116.0/22\n59.153.4.0/22\n59.153.32.0/22\n59.153.60.0/22\n59.153.64.0/22\n59.153.68.0/22\n59.153.72.0/22\n59.153.92.0/22\n59.153.116.0/22\n59.153.136.0/22\n59.153.152.0/22\n59.153.164.0/22\n59.153.168.0/22\n59.153.172.0/22\n59.153.176.0/22\n59.153.180.0/22\n59.153.184.0/22\n59.153.188.0/22\n59.153.192.0/22\n59.155.0.0/16\n59.172.0.0/15\n59.174.0.0/15\n59.191.0.0/17\n59.192.0.0/10\n60.0.0.0/13\n60.8.0.0/15\n60.10.0.0/16\n60.11.0.0/16\n60.12.0.0/16\n60.13.0.0/18\n60.13.64.0/18\n60.13.128.0/17\n60.14.0.0/15\n60.16.0.0/13\n60.24.0.0/14\n60.28.0.0/15\n60.30.0.0/16\n60.31.0.0/16\n60.55.0.0/16\n60.63.0.0/16\n60.160.0.0/15\n60.162.0.0/15\n60.164.0.0/15\n60.166.0.0/15\n60.168.0.0/13\n60.176.0.0/12\n60.194.0.0/15\n60.200.0.0/14\n60.204.0.0/16\n60.205.0.0/16\n60.206.0.0/15\n60.208.0.0/13\n60.216.0.0/15\n60.218.0.0/15\n60.220.0.0/14\n60.232.0.0/15\n60.235.0.0/16\n60.245.128.0/17\n60.247.0.0/16\n60.252.0.0/16\n60.253.128.0/17\n60.255.0.0/16\n61.4.80.0/22\n61.4.84.0/22\n61.4.88.0/21\n61.4.176.0/20\n61.8.160.0/20\n61.14.212.0/22\n61.14.216.0/22\n61.14.220.0/22\n61.14.240.0/22\n61.14.244.0/22\n61.28.0.0/20\n61.28.16.0/20\n61.28.32.0/19\n61.28.64.0/18\n61.29.128.0/18\n61.29.192.0/19\n61.29.224.0/20\n61.29.240.0/21\n61.29.248.0/22\n61.29.254.0/23\n61.45.128.0/18\n61.45.224.0/20\n61.47.128.0/18\n61.48.0.0/14\n61.52.0.0/15\n61.54.0.0/16\n61.55.0.0/16\n61.87.192.0/18\n61.128.0.0/15\n61.130.0.0/15\n61.132.0.0/16\n61.133.0.0/17\n61.133.128.0/17\n61.134.0.0/18\n61.134.64.0/19\n61.134.96.0/19\n61.134.128.0/18\n61.134.192.0/18\n61.135.0.0/16\n61.136.0.0/18\n61.136.64.0/18\n61.136.128.0/17\n61.137.0.0/17\n61.137.128.0/17\n61.138.0.0/18\n61.138.64.0/18\n61.138.128.0/18\n61.138.192.0/18\n61.139.0.0/17\n61.139.128.0/18\n61.139.192.0/18\n61.140.0.0/14\n61.144.0.0/14\n61.148.0.0/15\n61.150.0.0/15\n61.152.0.0/16\n61.153.0.0/16\n61.154.0.0/15\n61.156.0.0/16\n61.157.0.0/16\n61.158.0.0/17\n61.158.128.0/17\n61.159.0.0/18\n61.159.64.0/18\n61.159.128.0/17\n61.160.0.0/16\n61.161.0.0/18\n61.161.64.0/18\n61.161.128.0/17\n61.162.0.0/16\n61.163.0.0/16\n61.164.0.0/16\n61.165.0.0/16\n61.166.0.0/16\n61.167.0.0/16\n61.168.0.0/16\n61.169.0.0/16\n61.170.0.0/15\n61.172.0.0/14\n61.176.0.0/16\n61.177.0.0/16\n61.178.0.0/16\n61.179.0.0/16\n61.180.0.0/17\n61.180.128.0/17\n61.181.0.0/16\n61.182.0.0/16\n61.183.0.0/16\n61.184.0.0/14\n61.188.0.0/16\n61.189.0.0/17\n61.189.128.0/17\n61.190.0.0/15\n61.232.0.0/14\n61.236.0.0/15\n61.240.0.0/14\n62.234.0.0/16\n68.79.0.0/18\n69.230.192.0/18\n69.231.128.0/18\n69.234.192.0/18\n69.235.128.0/18\n71.131.192.0/18\n71.132.0.0/18\n71.136.64.0/18\n71.137.0.0/18\n81.68.0.0/14\n82.156.0.0/15\n94.191.0.0/17\n101.0.0.0/22\n101.1.0.0/22\n101.2.172.0/22\n101.4.0.0/14\n101.16.0.0/12\n101.33.128.0/17\n101.34.0.0/15\n101.36.0.0/18\n101.36.64.0/19\n101.36.128.0/17\n101.37.0.0/16\n101.38.0.0/15\n101.40.0.0/15\n101.42.0.0/15\n101.47.0.0/16\n101.48.0.0/15\n101.50.8.0/22\n101.50.12.0/22\n101.50.56.0/22\n101.52.0.0/16\n101.53.100.0/22\n101.54.0.0/16\n101.55.224.0/21\n101.64.0.0/13\n101.72.0.0/14\n101.76.0.0/15\n101.78.0.0/22\n101.78.32.0/19\n101.80.0.0/12\n101.96.0.0/21\n101.96.8.0/22\n101.96.16.0/20\n101.96.128.0/17\n101.99.96.0/19\n101.101.64.0/19\n101.101.100.0/24\n101.101.102.0/23\n101.101.104.0/21\n101.101.112.0/20\n101.102.64.0/19\n101.102.100.0/23\n101.102.102.0/24\n101.102.104.0/21\n101.102.112.0/20\n101.104.0.0/14\n101.110.64.0/19\n101.110.96.0/20\n101.110.116.0/22\n101.110.120.0/21\n101.120.0.0/14\n101.124.0.0/15\n101.126.0.0/16\n101.128.0.0/22\n101.128.8.0/21\n101.128.16.0/20\n101.128.32.0/19\n101.129.0.0/16\n101.130.0.0/15\n101.132.0.0/14\n101.144.0.0/12\n101.192.0.0/14\n101.196.0.0/16\n101.197.0.0/16\n101.198.0.0/15\n101.200.0.0/15\n101.203.128.0/19\n101.203.160.0/21\n101.203.172.0/22\n101.203.176.0/20\n101.204.0.0/14\n101.224.0.0/13\n101.232.0.0/15\n101.234.64.0/21\n101.234.76.0/22\n101.234.80.0/20\n101.234.96.0/19\n101.236.0.0/14\n101.240.0.0/14\n101.244.0.0/16\n101.245.0.0/16\n101.246.0.0/15\n101.248.0.0/15\n101.251.0.0/22\n101.251.8.0/21\n101.251.16.0/20\n101.251.32.0/19\n101.251.64.0/18\n101.251.128.0/17\n101.252.0.0/15\n101.254.0.0/16\n103.1.8.0/22\n103.1.20.0/22\n103.1.24.0/22\n103.1.72.0/22\n103.1.88.0/22\n103.1.168.0/22\n103.2.108.0/22\n103.2.156.0/22\n103.2.164.0/22\n103.2.200.0/22\n103.2.204.0/22\n103.2.208.0/22\n103.2.212.0/22\n103.3.84.0/22\n103.3.88.0/22\n103.3.92.0/22\n103.3.96.0/22\n103.3.100.0/22\n103.3.104.0/22\n103.3.108.0/22\n103.3.112.0/22\n103.3.116.0/22\n103.3.120.0/22\n103.3.124.0/22\n103.3.128.0/22\n103.3.132.0/22\n103.3.136.0/22\n103.3.140.0/22\n103.3.148.0/22\n103.3.152.0/22\n103.3.156.0/22\n103.4.56.0/22\n103.4.168.0/22\n103.4.184.0/22\n103.4.224.0/22\n103.5.36.0/22\n103.5.52.0/22\n103.5.56.0/22\n103.5.152.0/22\n103.5.168.0/22\n103.5.192.0/22\n103.5.252.0/22\n103.6.76.0/22\n103.6.108.0/22\n103.6.220.0/22\n103.6.228.0/22\n103.7.28.0/22\n103.7.140.0/22\n103.7.212.0/22\n103.7.216.0/22\n103.7.220.0/22\n103.8.0.0/22\n103.8.4.0/22\n103.8.8.0/22\n103.8.32.0/22\n103.8.52.0/22\n103.8.68.0/22\n103.8.108.0/22\n103.8.156.0/22\n103.8.200.0/22\n103.8.204.0/22\n103.8.220.0/22\n103.9.8.0/22\n103.9.24.0/22\n103.9.108.0/22\n103.9.152.0/22\n103.9.248.0/22\n103.9.252.0/22\n103.10.0.0/22\n103.10.16.0/22\n103.10.84.0/22\n103.10.140.0/22\n103.11.16.0/22\n103.11.168.0/22\n103.11.180.0/22\n103.12.32.0/22\n103.12.68.0/22\n103.12.92.0/22\n103.12.98.0/23\n103.12.136.0/22\n103.12.184.0/22\n103.12.232.0/22\n103.13.12.0/22\n103.13.124.0/22\n103.13.144.0/22\n103.13.196.0/22\n103.13.220.0/22\n103.13.244.0/22\n103.14.84.0/22\n103.14.100.0/22\n103.14.132.0/22\n103.14.136.0/22\n103.14.156.0/22\n103.14.240.0/22\n103.15.4.0/22\n103.15.8.0/22\n103.15.16.0/22\n103.15.96.0/22\n103.15.200.0/22\n103.16.52.0/22\n103.16.80.0/22\n103.16.84.0/22\n103.16.88.0/22\n103.16.108.0/22\n103.16.124.0/22\n103.17.40.0/22\n103.17.64.0/22\n103.17.120.0/22\n103.17.136.0/22\n103.17.160.0/22\n103.17.204.0/22\n103.17.228.0/22\n103.18.186.0/23\n103.18.192.0/22\n103.18.206.0/23\n103.18.208.0/22\n103.18.212.0/22\n103.18.224.0/22\n103.19.12.0/22\n103.19.40.0/22\n103.19.44.0/22\n103.19.50.0/23\n103.19.64.0/22\n103.19.68.0/22\n103.19.72.0/22\n103.19.232.0/22\n103.20.12.0/22\n103.20.32.0/22\n103.20.44.0/22\n103.20.68.0/22\n103.20.112.0/22\n103.20.128.0/22\n103.20.160.0/22\n103.20.248.0/22\n103.21.112.0/22\n103.21.116.0/22\n103.21.136.0/22\n103.21.140.0/22\n103.21.176.0/22\n103.21.208.0/22\n103.21.240.0/22\n103.22.0.0/22\n103.22.4.0/22\n103.22.8.0/22\n103.22.12.0/22\n103.22.16.0/22\n103.22.20.0/22\n103.22.24.0/22\n103.22.28.0/22\n103.22.32.0/22\n103.22.36.0/22\n103.22.40.0/22\n103.22.44.0/22\n103.22.48.0/22\n103.22.52.0/22\n103.22.56.0/22\n103.22.60.0/22\n103.22.64.0/22\n103.22.68.0/22\n103.22.72.0/22\n103.22.76.0/22\n103.22.80.0/22\n103.22.84.0/22\n103.22.88.0/22\n103.22.92.0/22\n103.22.100.0/22\n103.22.104.0/22\n103.22.108.0/22\n103.22.112.0/22\n103.22.116.0/22\n103.22.120.0/22\n103.22.124.0/22\n103.22.188.0/22\n103.22.228.0/22\n103.22.252.0/22\n103.23.8.0/22\n103.23.56.0/22\n103.23.160.0/22\n103.23.164.0/22\n103.23.176.0/22\n103.23.228.0/22\n103.24.24.0/22\n103.24.116.0/22\n103.24.128.0/22\n103.24.144.0/22\n103.24.176.0/22\n103.24.184.0/22\n103.24.220.0/22\n103.24.228.0/22\n103.24.252.0/22\n103.25.8.0/23\n103.25.20.0/22\n103.25.24.0/22\n103.25.28.0/22\n103.25.32.0/22\n103.25.36.0/22\n103.25.40.0/22\n103.25.48.0/22\n103.25.64.0/22\n103.25.68.0/22\n103.25.148.0/22\n103.25.156.0/22\n103.25.216.0/22\n103.26.0.0/22\n103.26.64.0/22\n103.26.76.0/22\n103.26.132.0/22\n103.26.156.0/22\n103.26.160.0/22\n103.26.228.0/22\n103.26.240.0/22\n103.27.4.0/22\n103.27.12.0/22\n103.27.24.0/22\n103.27.56.0/22\n103.27.96.0/22\n103.27.184.0/22\n103.27.208.0/22\n103.27.212.0/22\n103.27.240.0/22\n103.28.4.0/22\n103.28.8.0/22\n103.28.184.0/22\n103.28.204.0/22\n103.28.212.0/22\n103.29.16.0/22\n103.29.24.0/23\n103.29.29.0/24\n103.29.128.0/22\n103.29.132.0/22\n103.29.136.0/22\n103.29.236.0/23\n103.30.20.0/22\n103.30.96.0/22\n103.30.104.0/23\n103.30.106.0/23\n103.30.148.0/22\n103.30.200.0/22\n103.30.228.0/22\n103.30.236.0/22\n103.31.0.0/22\n103.31.48.0/22\n103.31.52.0/22\n103.31.56.0/22\n103.31.60.0/22\n103.31.64.0/22\n103.31.68.0/22\n103.31.148.0/22\n103.31.160.0/22\n103.31.168.0/22\n103.31.200.0/22\n103.31.236.0/22\n103.31.242.0/23\n103.32.0.0/22\n103.32.4.0/22\n103.32.8.0/22\n103.32.12.0/22\n103.32.16.0/22\n103.32.20.0/22\n103.32.24.0/22\n103.32.28.0/22\n103.32.32.0/22\n103.32.36.0/22\n103.32.40.0/22\n103.32.44.0/22\n103.32.48.0/22\n103.32.52.0/22\n103.32.56.0/22\n103.32.60.0/22\n103.32.64.0/22\n103.32.68.0/22\n103.32.72.0/22\n103.32.76.0/22\n103.32.80.0/22\n103.32.84.0/22\n103.32.88.0/22\n103.32.92.0/22\n103.32.96.0/22\n103.32.100.0/22\n103.32.104.0/22\n103.32.108.0/22\n103.32.112.0/22\n103.32.116.0/22\n103.32.120.0/22\n103.32.124.0/22\n103.32.128.0/22\n103.32.132.0/22\n103.32.136.0/22\n103.32.140.0/22\n103.32.144.0/22\n103.32.148.0/22\n103.32.152.0/22\n103.32.156.0/22\n103.32.160.0/22\n103.32.164.0/22\n103.32.168.0/22\n103.32.172.0/22\n103.32.176.0/22\n103.32.180.0/22\n103.32.184.0/22\n103.32.188.0/22\n103.32.192.0/22\n103.32.196.0/22\n103.32.200.0/22\n103.32.204.0/22\n103.32.208.0/22\n103.32.212.0/22\n103.32.216.0/22\n103.32.220.0/22\n103.32.224.0/22\n103.32.228.0/22\n103.32.232.0/22\n103.32.236.0/22\n103.32.240.0/22\n103.32.244.0/22\n103.32.248.0/22\n103.32.252.0/22\n103.33.0.0/22\n103.33.4.0/22\n103.33.8.0/22\n103.33.12.0/22\n103.33.16.0/22\n103.33.20.0/22\n103.33.24.0/22\n103.33.28.0/22\n103.33.32.0/22\n103.33.36.0/22\n103.33.40.0/22\n103.33.44.0/22\n103.33.48.0/22\n103.33.52.0/22\n103.33.56.0/22\n103.33.60.0/22\n103.33.64.0/22\n103.33.68.0/22\n103.33.72.0/22\n103.33.76.0/22\n103.33.80.0/22\n103.33.84.0/22\n103.33.88.0/22\n103.33.92.0/22\n103.33.96.0/22\n103.33.100.0/22\n103.33.104.0/22\n103.33.108.0/22\n103.33.112.0/22\n103.33.116.0/22\n103.33.120.0/22\n103.33.124.0/22\n103.33.128.0/22\n103.33.132.0/22\n103.33.136.0/22\n103.33.140.0/22\n103.33.144.0/22\n103.33.148.0/22\n103.33.152.0/22\n103.33.156.0/22\n103.33.160.0/22\n103.33.164.0/22\n103.33.168.0/22\n103.33.172.0/22\n103.33.176.0/22\n103.33.180.0/22\n103.33.184.0/22\n103.33.188.0/22\n103.33.192.0/22\n103.33.196.0/22\n103.33.200.0/22\n103.33.204.0/22\n103.33.208.0/22\n103.33.212.0/22\n103.33.216.0/22\n103.33.220.0/22\n103.33.224.0/22\n103.33.228.0/22\n103.33.232.0/22\n103.33.236.0/22\n103.33.240.0/22\n103.33.244.0/22\n103.33.248.0/22\n103.33.252.0/22\n103.34.0.0/22\n103.34.4.0/22\n103.34.8.0/22\n103.34.12.0/22\n103.34.16.0/22\n103.34.20.0/22\n103.34.24.0/22\n103.34.28.0/22\n103.34.32.0/22\n103.34.36.0/22\n103.34.40.0/22\n103.34.44.0/22\n103.34.48.0/22\n103.34.52.0/22\n103.34.56.0/22\n103.34.60.0/22\n103.34.64.0/22\n103.34.68.0/22\n103.34.72.0/22\n103.34.76.0/22\n103.34.80.0/22\n103.34.84.0/22\n103.34.88.0/22\n103.34.92.0/22\n103.34.96.0/22\n103.34.100.0/22\n103.34.104.0/22\n103.34.108.0/22\n103.34.112.0/22\n103.34.116.0/22\n103.34.120.0/22\n103.34.124.0/22\n103.34.128.0/22\n103.34.132.0/22\n103.34.136.0/22\n103.34.140.0/22\n103.34.144.0/22\n103.34.148.0/22\n103.34.152.0/22\n103.34.156.0/22\n103.34.160.0/22\n103.34.164.0/22\n103.34.168.0/22\n103.34.172.0/22\n103.34.176.0/22\n103.34.180.0/22\n103.34.184.0/22\n103.34.188.0/22\n103.34.192.0/22\n103.34.196.0/22\n103.34.200.0/22\n103.34.204.0/22\n103.34.208.0/22\n103.34.212.0/22\n103.34.216.0/22\n103.34.220.0/22\n103.34.224.0/22\n103.34.228.0/22\n103.34.232.0/22\n103.34.236.0/22\n103.34.240.0/22\n103.34.244.0/22\n103.34.248.0/22\n103.34.252.0/22\n103.35.0.0/22\n103.35.4.0/22\n103.35.8.0/22\n103.35.12.0/22\n103.35.16.0/22\n103.35.20.0/22\n103.35.24.0/22\n103.35.28.0/22\n103.35.32.0/22\n103.35.36.0/22\n103.35.40.0/22\n103.35.44.0/22\n103.35.48.0/22\n103.35.104.0/22\n103.35.116.0/22\n103.35.180.0/22\n103.35.220.0/22\n103.36.28.0/22\n103.36.36.0/22\n103.36.56.0/22\n103.36.60.0/22\n103.36.64.0/22\n103.36.72.0/22\n103.36.96.0/22\n103.36.132.0/22\n103.36.136.0/22\n103.36.160.0/22\n103.36.164.0/22\n103.36.168.0/22\n103.36.172.0/22\n103.36.176.0/22\n103.36.180.0/22\n103.36.184.0/22\n103.36.188.0/22\n103.36.192.0/22\n103.36.196.0/22\n103.36.200.0/22\n103.36.204.0/22\n103.36.208.0/22\n103.36.212.0/22\n103.36.216.0/22\n103.36.220.0/22\n103.36.224.0/22\n103.36.228.0/22\n103.36.232.0/22\n103.36.236.0/22\n103.36.240.0/22\n103.36.244.0/22\n103.37.12.0/22\n103.37.16.0/22\n103.37.24.0/22\n103.37.44.0/22\n103.37.52.0/22\n103.37.56.0/22\n103.37.72.0/22\n103.37.100.0/22\n103.37.104.0/22\n103.37.136.0/22\n103.37.140.0/22\n103.37.144.0/22\n103.37.148.0/22\n103.37.152.0/22\n103.37.156.0/22\n103.37.160.0/22\n103.37.164.0/22\n103.37.172.0/22\n103.37.176.0/22\n103.37.188.0/22\n103.37.208.0/22\n103.37.212.0/22\n103.37.216.0/21\n103.37.248.0/22\n103.37.252.0/22\n103.38.0.0/22\n103.38.32.0/22\n103.38.40.0/22\n103.38.44.0/22\n103.38.56.0/22\n103.38.76.0/22\n103.38.84.0/22\n103.38.92.0/22\n103.38.96.0/22\n103.38.116.0/22\n103.38.132.0/22\n103.38.140.0/22\n103.38.224.0/22\n103.38.228.0/22\n103.38.232.0/22\n103.39.64.0/22\n103.39.88.0/22\n103.39.100.0/22\n103.39.104.0/22\n103.39.160.0/22\n103.39.164.0/22\n103.39.168.0/22\n103.39.172.0/22\n103.39.176.0/22\n103.39.180.0/22\n103.39.184.0/22\n103.39.188.0/22\n103.39.200.0/22\n103.39.204.0/22\n103.39.208.0/22\n103.39.212.0/22\n103.39.216.0/22\n103.39.220.0/22\n103.39.224.0/22\n103.39.228.0/22\n103.39.232.0/22\n103.40.12.0/22\n103.40.16.0/22\n103.40.20.0/22\n103.40.24.0/22\n103.40.28.0/22\n103.40.32.0/22\n103.40.36.0/22\n103.40.40.0/22\n103.40.44.0/22\n103.40.88.0/22\n103.40.100.0/22\n103.40.158.0/23\n103.40.192.0/22\n103.40.212.0/22\n103.40.220.0/22\n103.40.228.0/22\n103.40.232.0/22\n103.40.236.0/22\n103.40.240.0/22\n103.40.244.0/22\n103.40.248.0/22\n103.40.252.0/22\n103.41.0.0/22\n103.41.16.0/22\n103.41.52.0/22\n103.41.116.0/22\n103.41.140.0/22\n103.41.148.0/22\n103.41.152.0/22\n103.41.160.0/22\n103.41.164.0/22\n103.41.220.0/22\n103.41.224.0/22\n103.41.228.0/22\n103.41.232.0/22\n103.42.8.0/22\n103.42.24.0/22\n103.42.28.0/22\n103.42.32.0/22\n103.42.64.0/22\n103.42.68.0/22\n103.42.76.0/22\n103.42.104.0/22\n103.42.180.0/22\n103.42.232.0/22\n103.43.16.0/22\n103.43.84.0/22\n103.43.96.0/22\n103.43.100.0/22\n103.43.104.0/22\n103.43.124.0/22\n103.43.132.0/22\n103.43.184.0/22\n103.43.192.0/22\n103.43.196.0/22\n103.43.208.0/22\n103.43.220.0/22\n103.43.224.0/22\n103.43.240.0/22\n103.44.56.0/22\n103.44.80.0/22\n103.44.120.0/22\n103.44.124.0/22\n103.44.132.0/22\n103.44.144.0/22\n103.44.168.0/22\n103.44.176.0/22\n103.44.180.0/22\n103.44.184.0/22\n103.44.188.0/22\n103.44.192.0/22\n103.44.196.0/22\n103.44.200.0/22\n103.44.204.0/22\n103.44.224.0/22\n103.44.236.0/22\n103.44.240.0/22\n103.44.244.0/22\n103.44.248.0/22\n103.44.252.0/22\n103.45.0.0/22\n103.45.4.0/22\n103.45.8.0/22\n103.45.12.0/22\n103.45.16.0/22\n103.45.20.0/22\n103.45.24.0/22\n103.45.28.0/22\n103.45.32.0/22\n103.45.36.0/22\n103.45.40.0/22\n103.45.44.0/22\n103.45.48.0/22\n103.45.52.0/22\n103.45.56.0/22\n103.45.60.0/22\n103.45.72.0/22\n103.45.76.0/22\n103.45.80.0/22\n103.45.84.0/22\n103.45.88.0/22\n103.45.92.0/22\n103.45.96.0/22\n103.45.100.0/22\n103.45.104.0/22\n103.45.108.0/22\n103.45.112.0/22\n103.45.116.0/22\n103.45.120.0/22\n103.45.124.0/22\n103.45.128.0/22\n103.45.132.0/22\n103.45.136.0/22\n103.45.140.0/22\n103.45.144.0/22\n103.45.148.0/22\n103.45.152.0/22\n103.45.156.0/22\n103.45.160.0/22\n103.45.164.0/22\n103.45.168.0/22\n103.45.172.0/22\n103.45.176.0/22\n103.45.180.0/22\n103.45.184.0/22\n103.45.188.0/22\n103.45.192.0/22\n103.45.196.0/22\n103.45.200.0/22\n103.45.204.0/22\n103.45.208.0/22\n103.45.212.0/22\n103.45.216.0/22\n103.45.220.0/22\n103.45.224.0/22\n103.45.248.0/22\n103.46.0.0/22\n103.46.12.0/22\n103.46.16.0/22\n103.46.20.0/22\n103.46.24.0/22\n103.46.28.0/22\n103.46.32.0/22\n103.46.36.0/22\n103.46.40.0/22\n103.46.44.0/22\n103.46.48.0/22\n103.46.52.0/22\n103.46.56.0/22\n103.46.60.0/22\n103.46.64.0/22\n103.46.68.0/22\n103.46.72.0/22\n103.46.76.0/22\n103.46.80.0/22\n103.46.84.0/22\n103.46.88.0/22\n103.46.92.0/22\n103.46.96.0/22\n103.46.100.0/22\n103.46.104.0/22\n103.46.108.0/22\n103.46.112.0/22\n103.46.116.0/22\n103.46.120.0/22\n103.46.124.0/22\n103.46.128.0/22\n103.46.132.0/22\n103.46.136.0/22\n103.46.152.0/22\n103.46.156.0/22\n103.46.160.0/22\n103.46.164.0/22\n103.46.168.0/22\n103.46.172.0/22\n103.46.176.0/22\n103.46.180.0/22\n103.46.244.0/22\n103.46.248.0/22\n103.47.4.0/22\n103.47.20.0/22\n103.47.36.0/22\n103.47.40.0/22\n103.47.48.0/22\n103.47.80.0/22\n103.47.96.0/22\n103.47.108.0/22\n103.47.116.0/22\n103.47.120.0/22\n103.47.136.0/22\n103.47.140.0/22\n103.47.212.0/22\n103.48.52.0/22\n103.48.92.0/22\n103.48.148.0/22\n103.48.152.0/22\n103.48.156.0/22\n103.48.202.0/23\n103.48.216.0/22\n103.48.220.0/22\n103.48.224.0/22\n103.48.228.0/22\n103.48.232.0/22\n103.48.236.0/22\n103.48.240.0/22\n103.48.244.0/22\n103.49.12.0/22\n103.49.20.0/22\n103.49.72.0/22\n103.49.76.0/22\n103.49.96.0/22\n103.49.108.0/22\n103.49.128.0/22\n103.49.176.0/22\n103.49.180.0/22\n103.49.196.0/22\n103.50.36.0/22\n103.50.44.0/22\n103.50.48.0/22\n103.50.52.0/22\n103.50.56.0/22\n103.50.60.0/22\n103.50.64.0/22\n103.50.68.0/22\n103.50.72.0/22\n103.50.108.0/22\n103.50.112.0/22\n103.50.116.0/22\n103.50.120.0/22\n103.50.124.0/22\n103.50.132.0/22\n103.50.136.0/22\n103.50.140.0/22\n103.50.172.0/22\n103.50.176.0/22\n103.50.180.0/22\n103.50.184.0/22\n103.50.188.0/22\n103.50.192.0/22\n103.50.196.0/22\n103.50.200.0/22\n103.50.220.0/22\n103.50.224.0/22\n103.50.228.0/22\n103.50.232.0/22\n103.50.236.0/22\n103.50.240.0/22\n103.50.244.0/22\n103.50.248.0/22\n103.52.40.0/22\n103.52.72.0/22\n103.52.76.0/22\n103.52.80.0/22\n103.52.84.0/22\n103.52.96.0/22\n103.52.100.0/22\n103.52.104.0/22\n103.52.160.0/22\n103.52.164.0/22\n103.52.172.0/22\n103.52.176.0/22\n103.52.184.0/22\n103.52.196.0/22\n103.53.64.0/22\n103.53.68.0/22\n103.53.92.0/22\n103.53.100.0/22\n103.53.124.0/22\n103.53.128.0/22\n103.53.132.0/22\n103.53.136.0/22\n103.53.140.0/22\n103.53.144.0/22\n103.53.180.0/22\n103.53.204.0/22\n103.53.208.0/22\n103.53.212.0/22\n103.53.236.0/22\n103.53.248.0/22\n103.54.8.0/22\n103.54.48.0/22\n103.54.160.0/22\n103.54.164.0/22\n103.54.212.0/22\n103.54.240.0/22\n103.55.80.0/22\n103.55.120.0/22\n103.55.152.0/22\n103.55.172.0/22\n103.55.204.0/22\n103.55.208.0/22\n103.55.228.0/22\n103.55.236.0/22\n103.56.8.0/22\n103.56.16.0/22\n103.56.20.0/22\n103.56.32.0/22\n103.56.56.0/22\n103.56.60.0/22\n103.56.72.0/22\n103.56.76.0/22\n103.56.94.0/23\n103.56.100.0/22\n103.56.104.0/22\n103.56.140.0/22\n103.56.152.0/22\n103.56.184.0/22\n103.56.200.0/22\n103.57.12.0/22\n103.57.52.0/22\n103.57.56.0/22\n103.57.76.0/22\n103.57.136.0/22\n103.57.196.0/22\n103.58.24.0/22\n103.59.76.0/22\n103.59.100.0/22\n103.59.112.0/22\n103.59.116.0/22\n103.59.120.0/22\n103.59.124.0/22\n103.59.128.0/22\n103.59.148.0/22\n103.59.164.0/22\n103.59.168.0/23\n103.60.32.0/22\n103.60.44.0/22\n103.60.164.0/22\n103.60.228.0/22\n103.60.236.0/22\n103.61.60.0/22\n103.61.104.0/22\n103.61.140.0/22\n103.61.152.0/22\n103.61.156.0/22\n103.61.160.0/22\n103.61.172.0/22\n103.61.176.0/22\n103.61.188.0/22\n103.62.24.0/22\n103.62.52.0/22\n103.62.72.0/22\n103.62.76.0/22\n103.62.80.0/22\n103.62.84.0/22\n103.62.88.0/22\n103.62.96.0/22\n103.62.100.0/22\n103.62.104.0/22\n103.62.108.0/22\n103.62.112.0/22\n103.62.116.0/22\n103.62.120.0/22\n103.62.124.0/22\n103.62.128.0/22\n103.62.132.0/22\n103.62.156.0/22\n103.62.160.0/22\n103.62.164.0/22\n103.62.168.0/22\n103.62.172.0/22\n103.62.176.0/22\n103.62.180.0/22\n103.62.184.0/22\n103.62.188.0/22\n103.62.192.0/22\n103.62.204.0/22\n103.62.208.0/22\n103.62.212.0/22\n103.62.216.0/22\n103.62.220.0/22\n103.62.224.0/22\n103.63.32.0/22\n103.63.36.0/22\n103.63.40.0/22\n103.63.44.0/22\n103.63.48.0/22\n103.63.52.0/22\n103.63.56.0/22\n103.63.60.0/22\n103.63.64.0/22\n103.63.68.0/22\n103.63.72.0/22\n103.63.76.0/22\n103.63.80.0/22\n103.63.84.0/22\n103.63.88.0/22\n103.63.140.0/22\n103.63.144.0/22\n103.63.152.0/22\n103.63.160.0/22\n103.63.164.0/22\n103.63.168.0/22\n103.63.172.0/22\n103.63.176.0/22\n103.63.180.0/22\n103.63.184.0/22\n103.63.192.0/22\n103.63.196.0/22\n103.63.200.0/22\n103.63.204.0/22\n103.63.208.0/22\n103.63.240.0/22\n103.63.244.0/22\n103.63.248.0/22\n103.63.252.0/22\n103.64.0.0/22\n103.64.4.0/22\n103.64.24.0/22\n103.64.28.0/22\n103.64.32.0/22\n103.64.36.0/22\n103.64.40.0/22\n103.64.44.0/22\n103.64.48.0/22\n103.64.52.0/22\n103.64.56.0/22\n103.64.60.0/22\n103.64.64.0/22\n103.64.68.0/22\n103.64.72.0/22\n103.64.76.0/22\n103.64.80.0/22\n103.64.84.0/22\n103.64.88.0/22\n103.64.92.0/22\n103.64.96.0/22\n103.64.100.0/22\n103.64.104.0/22\n103.64.108.0/22\n103.64.112.0/22\n103.64.116.0/22\n103.64.120.0/22\n103.64.124.0/22\n103.64.140.0/22\n103.64.144.0/22\n103.64.152.0/22\n103.64.156.0/22\n103.64.160.0/22\n103.64.164.0/22\n103.64.168.0/22\n103.64.172.0/22\n103.64.176.0/22\n103.64.180.0/22\n103.64.184.0/22\n103.64.188.0/22\n103.64.192.0/22\n103.64.196.0/22\n103.64.200.0/22\n103.64.204.0/22\n103.64.208.0/22\n103.64.212.0/22\n103.64.216.0/22\n103.64.220.0/22\n103.64.224.0/22\n103.64.228.0/22\n103.64.232.0/22\n103.64.236.0/22\n103.64.240.0/22\n103.64.244.0/22\n103.64.248.0/22\n103.64.252.0/22\n103.65.0.0/22\n103.65.4.0/22\n103.65.8.0/22\n103.65.12.0/22\n103.65.16.0/22\n103.65.36.0/22\n103.65.40.0/22\n103.65.48.0/22\n103.65.52.0/22\n103.65.56.0/22\n103.65.60.0/22\n103.65.64.0/22\n103.65.68.0/22\n103.65.72.0/22\n103.65.76.0/22\n103.65.80.0/22\n103.65.84.0/22\n103.65.88.0/22\n103.65.92.0/22\n103.65.100.0/22\n103.65.104.0/22\n103.65.108.0/22\n103.65.112.0/22\n103.65.144.0/22\n103.65.148.0/22\n103.65.152.0/22\n103.65.156.0/22\n103.65.160.0/22\n103.65.164.0/22\n103.65.168.0/22\n103.65.172.0/22\n103.65.204.0/23\n103.65.206.0/23\n103.65.224.0/23\n103.66.32.0/22\n103.66.40.0/22\n103.66.92.0/22\n103.66.108.0/22\n103.66.200.0/22\n103.66.216.0/22\n103.66.240.0/22\n103.66.244.0/22\n103.66.248.0/22\n103.66.252.0/22\n103.67.0.0/22\n103.67.4.0/22\n103.67.8.0/22\n103.67.100.0/22\n103.67.104.0/22\n103.67.108.0/22\n103.67.112.0/22\n103.67.116.0/22\n103.67.120.0/22\n103.67.124.0/22\n103.67.128.0/22\n103.67.132.0/22\n103.67.136.0/22\n103.67.140.0/22\n103.67.144.0/22\n103.67.148.0/22\n103.67.172.0/22\n103.67.192.0/22\n103.67.212.0/22\n103.67.252.0/22\n103.68.64.0/22\n103.68.88.0/22\n103.68.100.0/22\n103.68.128.0/22\n103.68.192.0/22\n103.69.16.0/22\n103.69.62.0/23\n103.69.116.0/22\n103.69.132.0/22\n103.69.152.0/22\n103.70.8.0/22\n103.70.14.0/23\n103.70.148.0/22\n103.70.220.0/22\n103.70.224.0/22\n103.70.236.0/22\n103.70.252.0/22\n103.71.0.0/22\n103.71.48.0/22\n103.71.68.0/22\n103.71.72.0/22\n103.71.80.0/22\n103.71.84.0/22\n103.71.88.0/22\n103.71.120.0/22\n103.71.124.0/22\n103.71.128.0/22\n103.71.144.0/22\n103.71.196.0/22\n103.71.200.0/22\n103.71.232.0/22\n103.72.12.0/22\n103.72.16.0/22\n103.72.20.0/22\n103.72.24.0/22\n103.72.28.0/22\n103.72.32.0/22\n103.72.36.0/22\n103.72.40.0/22\n103.72.44.0/22\n103.72.48.0/22\n103.72.52.0/22\n103.72.112.0/22\n103.72.116.0/22\n103.72.120.0/22\n103.72.124.0/22\n103.72.128.0/22\n103.72.132.0/22\n103.72.148.0/22\n103.72.172.0/22\n103.72.180.0/22\n103.72.224.0/22\n103.72.228.0/22\n103.72.232.0/22\n103.72.236.0/22\n103.72.240.0/22\n103.72.244.0/22\n103.72.248.0/22\n103.72.252.0/22\n103.73.0.0/22\n103.73.4.0/22\n103.73.8.0/22\n103.73.12.0/22\n103.73.16.0/22\n103.73.20.0/22\n103.73.24.0/22\n103.73.28.0/22\n103.73.48.0/22\n103.73.116.0/22\n103.73.120.0/22\n103.73.128.0/22\n103.73.132.0/22\n103.73.136.0/22\n103.73.140.0/22\n103.73.144.0/22\n103.73.168.0/22\n103.73.176.0/22\n103.73.204.0/22\n103.73.208.0/22\n103.73.240.0/22\n103.73.244.0/22\n103.73.248.0/22\n103.74.24.0/22\n103.74.28.0/22\n103.74.32.0/22\n103.74.36.0/22\n103.74.40.0/22\n103.74.44.0/22\n103.74.48.0/22\n103.74.56.0/22\n103.74.60.0/22\n103.74.80.0/22\n103.74.124.0/22\n103.74.148.0/22\n103.74.152.0/22\n103.74.156.0/22\n103.74.204.0/22\n103.74.232.0/22\n103.75.88.0/22\n103.75.92.0/22\n103.75.104.0/22\n103.75.108.0/22\n103.75.112.0/22\n103.75.120.0/22\n103.75.128.0/22\n103.75.144.0/22\n103.75.152.0/22\n103.75.236.0/24\n103.76.60.0/22\n103.76.64.0/22\n103.76.68.0/22\n103.76.72.0/22\n103.76.92.0/22\n103.76.216.0/22\n103.76.220.0/22\n103.76.224.0/22\n103.77.28.0/22\n103.77.52.0/22\n103.77.56.0/22\n103.77.72.0/22\n103.77.88.0/22\n103.77.92.0/22\n103.77.132.0/22\n103.77.148.0/22\n103.77.220.0/22\n103.78.56.0/22\n103.78.60.0/22\n103.78.64.0/22\n103.78.68.0/22\n103.78.124.0/22\n103.78.172.0/22\n103.78.176.0/22\n103.78.196.0/22\n103.78.228.0/22\n103.79.24.0/22\n103.79.28.0/22\n103.79.36.0/22\n103.79.40.0/22\n103.79.44.0/22\n103.79.52.0/22\n103.79.56.0/22\n103.79.60.0/22\n103.79.64.0/22\n103.79.68.0/22\n103.79.80.0/22\n103.79.84.0/22\n103.79.120.0/22\n103.79.136.0/22\n103.79.188.0/22\n103.79.192.0/22\n103.79.196.0/22\n103.79.200.0/22\n103.79.204.0/22\n103.79.208.0/22\n103.79.212.0/22\n103.79.228.0/23\n103.79.240.0/22\n103.80.28.0/22\n103.80.44.0/22\n103.80.72.0/22\n103.80.176.0/22\n103.80.180.0/22\n103.80.184.0/22\n103.80.192.0/22\n103.80.200.0/22\n103.80.232.0/22\n103.81.4.0/22\n103.81.8.0/22\n103.81.16.0/22\n103.81.20.0/22\n103.81.44.0/22\n103.81.48.0/22\n103.81.96.0/22\n103.81.120.0/22\n103.81.148.0/22\n103.81.164.0/22\n103.81.168.0/22\n103.81.183.0/24\n103.81.184.0/22\n103.81.200.0/22\n103.81.232.0/22\n103.82.52.0/22\n103.82.60.0/22\n103.82.68.0/22\n103.82.84.0/22\n103.82.104.0/22\n103.82.224.0/22\n103.82.236.0/22\n103.83.44.0/22\n103.83.52.0/22\n103.83.60.0/22\n103.83.64.0/22\n103.83.72.0/22\n103.83.112.0/22\n103.83.120.0/22\n103.83.180.0/22\n103.84.0.0/22\n103.84.12.0/22\n103.84.16.0/22\n103.84.20.0/22\n103.84.24.0/22\n103.84.28.0/22\n103.84.48.0/22\n103.84.64.0/22\n103.84.72.0/22\n103.84.136.0/22\n103.85.20.0/22\n103.85.24.0/22\n103.85.44.0/22\n103.85.48.0/22\n103.85.84.0/22\n103.85.136.0/22\n103.85.144.0/22\n103.85.164.0/22\n103.85.168.0/22\n103.85.172.0/22\n103.85.176.0/22\n103.85.224.0/22\n103.86.28.0/22\n103.86.32.0/22\n103.86.60.0/22\n103.86.80.0/22\n103.86.84.0/22\n103.86.204.0/22\n103.86.208.0/22\n103.86.212.0/22\n103.86.216.0/22\n103.86.220.0/22\n103.86.224.0/22\n103.86.228.0/22\n103.86.232.0/22\n103.86.236.0/22\n103.86.240.0/22\n103.86.244.0/22\n103.86.248.0/22\n103.86.252.0/22\n103.87.0.0/22\n103.87.4.0/22\n103.87.20.0/22\n103.87.32.0/22\n103.87.72.0/22\n103.87.96.0/22\n103.87.132.0/22\n103.87.180.0/22\n103.87.224.0/22\n103.88.4.0/22\n103.88.8.0/22\n103.88.12.0/22\n103.88.16.0/22\n103.88.20.0/22\n103.88.32.0/22\n103.88.36.0/22\n103.88.60.0/22\n103.88.64.0/22\n103.88.72.0/22\n103.88.96.0/22\n103.88.164.0/22\n103.88.176.0/22\n103.88.188.0/22\n103.88.212.0/22\n103.89.28.0/22\n103.89.96.0/22\n103.89.100.0/22\n103.89.104.0/22\n103.89.108.0/22\n103.89.112.0/22\n103.89.116.0/22\n103.89.148.0/22\n103.89.172.0/22\n103.89.184.0/22\n103.89.188.0/22\n103.89.192.0/22\n103.89.196.0/22\n103.89.200.0/22\n103.89.204.0/22\n103.89.208.0/22\n103.89.212.0/22\n103.89.216.0/22\n103.89.220.0/22\n103.89.224.0/22\n103.89.228.0/22\n103.90.52.0/22\n103.90.92.0/22\n103.90.100.0/22\n103.90.104.0/22\n103.90.108.0/22\n103.90.112.0/22\n103.90.116.0/22\n103.90.120.0/22\n103.90.124.0/22\n103.90.128.0/22\n103.90.132.0/22\n103.90.152.0/22\n103.90.168.0/22\n103.90.173.0/24\n103.90.176.0/22\n103.90.188.0/22\n103.90.192.0/22\n103.91.36.0/22\n103.91.40.0/22\n103.91.108.0/22\n103.91.112.0/23\n103.91.138.0/23\n103.91.152.0/22\n103.91.176.0/22\n103.91.200.0/22\n103.91.208.0/22\n103.91.212.0/22\n103.91.236.0/22\n103.91.252.0/22\n103.92.0.0/22\n103.92.4.0/22\n103.92.8.0/22\n103.92.12.0/22\n103.92.48.0/22\n103.92.52.0/22\n103.92.56.0/22\n103.92.60.0/22\n103.92.64.0/22\n103.92.68.0/22\n103.92.72.0/22\n103.92.76.0/22\n103.92.80.0/22\n103.92.86.0/24\n103.92.88.0/22\n103.92.108.0/22\n103.92.124.0/22\n103.92.128.0/24\n103.92.132.0/22\n103.92.156.0/22\n103.92.164.0/22\n103.92.168.0/22\n103.92.172.0/22\n103.92.176.0/22\n103.92.180.0/22\n103.92.184.0/22\n103.92.188.0/22\n103.92.192.0/22\n103.92.236.0/22\n103.92.240.0/22\n103.92.244.0/22\n103.92.248.0/22\n103.92.252.0/22\n103.93.0.0/22\n103.93.4.0/22\n103.93.28.0/22\n103.93.76.0/22\n103.93.84.0/22\n103.93.152.0/22\n103.93.180.0/22\n103.93.204.0/22\n103.94.12.0/22\n103.94.20.0/22\n103.94.28.0/22\n103.94.32.0/22\n103.94.36.0/22\n103.94.40.0/22\n103.94.44.0/22\n103.94.72.0/22\n103.94.88.0/22\n103.94.116.0/22\n103.94.160.0/22\n103.94.200.0/22\n103.95.52.0/22\n103.95.64.0/22\n103.95.68.0/22\n103.95.88.0/22\n103.95.92.0/22\n103.95.128.0/22\n103.95.136.0/22\n103.95.140.0/22\n103.95.144.0/22\n103.95.152.0/22\n103.95.216.0/22\n103.95.220.0/22\n103.95.224.0/22\n103.95.236.0/22\n103.95.240.0/22\n103.95.244.0/22\n103.95.248.0/22\n103.95.252.0/22\n103.96.0.0/22\n103.96.8.0/22\n103.96.80.0/22\n103.96.124.0/22\n103.96.136.0/22\n103.96.140.0/24\n103.96.152.0/22\n103.96.156.0/22\n103.96.160.0/22\n103.96.164.0/22\n103.96.168.0/22\n103.96.172.0/22\n103.96.176.0/22\n103.96.180.0/22\n103.96.184.0/22\n103.96.188.0/22\n103.96.192.0/22\n103.96.196.0/22\n103.96.200.0/22\n103.96.204.0/22\n103.96.208.0/22\n103.96.212.0/22\n103.96.216.0/22\n103.97.8.0/22\n103.97.12.0/22\n103.97.16.0/22\n103.97.20.0/22\n103.97.24.0/22\n103.97.28.0/22\n103.97.32.0/22\n103.97.36.0/22\n103.97.40.0/22\n103.97.56.0/22\n103.97.60.0/22\n103.97.64.0/22\n103.97.68.0/22\n103.97.72.0/22\n103.97.80.0/22\n103.97.112.0/22\n103.97.116.0/22\n103.97.128.0/22\n103.97.144.0/22\n103.97.148.0/22\n103.97.188.0/22\n103.97.192.0/22\n103.97.228.0/23\n103.98.28.0/23\n103.98.40.0/22\n103.98.44.0/22\n103.98.48.0/22\n103.98.56.0/22\n103.98.80.0/22\n103.98.88.0/22\n103.98.92.0/22\n103.98.96.0/22\n103.98.100.0/22\n103.98.124.0/22\n103.98.136.0/22\n103.98.140.0/22\n103.98.144.0/22\n103.98.164.0/22\n103.98.168.0/22\n103.98.180.0/22\n103.98.196.0/22\n103.98.216.0/22\n103.98.220.0/22\n103.98.224.0/22\n103.98.228.0/22\n103.98.232.0/22\n103.98.240.0/22\n103.98.244.0/22\n103.98.248.0/22\n103.98.252.0/22\n103.99.40.0/23\n103.99.52.0/22\n103.99.56.0/22\n103.99.60.0/22\n103.99.76.0/22\n103.99.104.0/22\n103.99.116.0/22\n103.99.120.0/22\n103.99.152.0/22\n103.99.220.0/22\n103.99.232.0/22\n103.99.236.0/22\n103.100.0.0/22\n103.100.32.0/22\n103.100.40.0/22\n103.100.48.0/22\n103.100.52.0/22\n103.100.56.0/22\n103.100.60.0/22\n103.100.64.0/22\n103.100.68.0/22\n103.100.88.0/22\n103.100.116.0/22\n103.100.144.0/22\n103.100.236.0/22\n103.100.240.0/22\n103.100.248.0/22\n103.100.252.0/22\n103.101.4.0/22\n103.101.8.0/22\n103.101.12.0/22\n103.101.28.0/22\n103.101.60.0/22\n103.101.120.0/22\n103.101.124.0/22\n103.101.144.0/22\n103.101.148.0/22\n103.101.180.0/22\n103.101.184.0/22\n103.102.76.0/22\n103.102.80.0/22\n103.102.168.0/22\n103.102.172.0/22\n103.102.180.0/22\n103.102.184.0/22\n103.102.188.0/22\n103.102.192.0/22\n103.102.196.0/22\n103.102.200.0/22\n103.102.208.0/22\n103.102.212.0/22\n103.103.12.0/22\n103.103.16.0/22\n103.103.36.0/22\n103.103.68.0/22\n103.103.72.0/22\n103.103.176.0/22\n103.103.188.0/22\n103.103.200.0/22\n103.103.204.0/22\n103.103.220.0/22\n103.103.224.0/22\n103.103.228.0/22\n103.103.232.0/22\n103.103.248.0/22\n103.103.252.0/22\n103.104.0.0/22\n103.104.4.0/22\n103.104.36.0/22\n103.104.40.0/22\n103.104.64.0/22\n103.104.104.0/22\n103.104.152.0/22\n103.104.168.0/22\n103.104.172.0/22\n103.104.188.0/22\n103.104.198.0/23\n103.104.252.0/22\n103.105.0.0/22\n103.105.4.0/22\n103.105.12.0/22\n103.105.16.0/22\n103.105.23.0/24\n103.105.60.0/22\n103.105.116.0/22\n103.105.132.0/22\n103.105.180.0/22\n103.105.184.0/22\n103.105.200.0/22\n103.105.204.0/22\n103.105.220.0/22\n103.106.36.0/22\n103.106.40.0/22\n103.106.44.0/22\n103.106.60.0/22\n103.106.68.0/22\n103.106.96.0/22\n103.106.120.0/22\n103.106.128.0/22\n103.106.132.0/22\n103.106.160.0/22\n103.106.196.0/22\n103.106.202.0/23\n103.106.212.0/22\n103.106.244.0/22\n103.106.252.0/22\n103.107.0.0/22\n103.107.28.0/22\n103.107.32.0/22\n103.107.44.0/22\n103.107.72.0/22\n103.107.108.0/22\n103.107.164.0/22\n103.107.168.0/22\n103.107.188.0/22\n103.107.192.0/22\n103.107.208.0/22\n103.107.212.0/22\n103.107.216.0/22\n103.107.220.0/22\n103.108.52.0/22\n103.108.160.0/22\n103.108.164.0/22\n103.108.184.0/23\n103.108.188.0/23\n103.108.192.0/22\n103.108.196.0/22\n103.108.208.0/22\n103.108.212.0/22\n103.108.224.0/22\n103.108.244.0/22\n103.109.20.0/22\n103.109.48.0/22\n103.109.88.0/22\n103.109.106.0/23\n103.109.248.0/22\n103.110.80.0/23\n103.110.92.0/22\n103.110.116.0/22\n103.110.132.0/22\n103.110.136.0/22\n103.110.152.0/22\n103.110.156.0/22\n103.110.188.0/22\n103.110.204.0/22\n103.111.64.0/22\n103.111.172.0/22\n103.111.252.0/22\n103.112.28.0/22\n103.112.68.0/22\n103.112.72.0/22\n103.112.88.0/22\n103.112.92.0/22\n103.112.96.0/22\n103.112.108.0/22\n103.112.112.0/22\n103.112.116.0/22\n103.112.140.0/22\n103.112.172.0/22\n103.112.184.0/22\n103.113.4.0/22\n103.113.92.0/22\n103.113.144.0/22\n103.113.220.0/22\n103.113.232.0/22\n103.113.236.0/22\n103.114.4.0/22\n103.114.28.0/22\n103.114.68.0/22\n103.114.72.0/22\n103.114.100.0/22\n103.114.132.0/22\n103.114.148.0/22\n103.114.156.0/22\n103.114.176.0/22\n103.114.212.0/22\n103.114.236.0/22\n103.114.240.0/22\n103.115.16.0/22\n103.115.40.0/22\n103.115.44.0/22\n103.115.48.0/22\n103.115.52.0/22\n103.115.56.0/22\n103.115.60.0/22\n103.115.64.0/22\n103.115.68.0/22\n103.115.92.0/22\n103.115.120.0/22\n103.115.148.0/22\n103.115.204.0/23\n103.115.248.0/22\n103.116.20.0/22\n103.116.40.0/22\n103.116.64.0/22\n103.116.72.0/22\n103.116.76.0/22\n103.116.92.0/22\n103.116.120.0/22\n103.116.128.0/22\n103.116.132.0/23\n103.116.148.0/22\n103.116.184.0/22\n103.116.206.0/23\n103.116.220.0/22\n103.116.224.0/22\n103.116.228.0/22\n103.117.16.0/22\n103.117.72.0/22\n103.117.88.0/22\n103.117.136.0/22\n103.117.188.0/22\n103.117.220.0/22\n103.118.36.0/22\n103.118.52.0/22\n103.118.56.0/22\n103.118.60.0/22\n103.118.64.0/22\n103.118.68.0/22\n103.118.72.0/22\n103.118.88.0/22\n103.118.173.0/24\n103.118.192.0/22\n103.118.196.0/22\n103.118.200.0/22\n103.118.204.0/22\n103.118.208.0/22\n103.118.212.0/22\n103.118.216.0/22\n103.118.220.0/22\n103.118.240.0/22\n103.118.244.0/22\n103.118.248.0/22\n103.118.252.0/22\n103.119.0.0/22\n103.119.12.0/22\n103.119.16.0/22\n103.119.28.0/22\n103.119.44.0/22\n103.119.104.0/22\n103.119.115.0/24\n103.119.156.0/22\n103.119.180.0/22\n103.119.200.0/22\n103.119.224.0/22\n103.120.52.0/22\n103.120.72.0/22\n103.120.88.0/22\n103.120.96.0/22\n103.120.100.0/22\n103.120.140.0/22\n103.120.196.0/22\n103.120.224.0/22\n103.121.52.0/22\n103.121.92.0/22\n103.121.160.0/22\n103.121.164.0/22\n103.121.250.0/24\n103.121.252.0/22\n103.122.48.0/22\n103.122.176.0/22\n103.122.192.0/22\n103.122.240.0/22\n103.123.4.0/22\n103.123.56.0/22\n103.123.88.0/22\n103.123.92.0/22\n103.123.116.0/22\n103.123.160.0/22\n103.123.176.0/22\n103.123.200.0/22\n103.123.204.0/22\n103.123.208.0/22\n103.123.212.0/22\n103.124.24.0/22\n103.124.48.0/22\n103.124.64.0/22\n103.124.212.0/22\n103.124.216.0/22\n103.125.20.0/22\n103.125.44.0/22\n103.125.132.0/22\n103.125.164.0/22\n103.125.196.0/22\n103.125.236.0/22\n103.125.248.0/22\n103.126.0.0/22\n103.126.16.0/22\n103.126.44.0/22\n103.126.100.0/22\n103.126.124.0/22\n103.126.128.0/22\n103.126.132.0/22\n103.126.208.0/22\n103.129.52.0/22\n103.130.132.0/22\n103.130.152.0/24\n103.130.160.0/22\n103.130.228.0/22\n103.131.20.0/22\n103.131.36.0/22\n103.131.152.0/22\n103.131.168.0/22\n103.131.176.0/22\n103.131.224.0/22\n103.131.228.0/22\n103.131.240.0/22\n103.132.60.0/22\n103.132.64.0/22\n103.132.68.0/22\n103.132.72.0/22\n103.132.76.0/22\n103.132.80.0/22\n103.132.104.0/22\n103.132.108.0/22\n103.132.112.0/22\n103.132.116.0/22\n103.132.120.0/22\n103.132.160.0/22\n103.132.164.0/22\n103.132.188.0/22\n103.132.208.0/22\n103.132.212.0/22\n103.132.234.0/23\n103.133.12.0/22\n103.133.40.0/22\n103.133.128.0/22\n103.133.136.0/22\n103.133.176.0/22\n103.133.232.0/22\n103.134.12.0/24\n103.134.196.0/22\n103.135.80.0/22\n103.135.124.0/22\n103.135.148.0/22\n103.135.156.0/22\n103.135.160.0/22\n103.135.164.0/22\n103.135.176.0/22\n103.135.184.0/22\n103.135.192.0/22\n103.135.196.0/22\n103.135.236.0/22\n103.136.128.0/22\n103.136.232.0/22\n103.137.58.0/23\n103.137.60.0/24\n103.137.76.0/22\n103.137.136.0/23\n103.137.149.0/24\n103.137.180.0/22\n103.137.236.0/22\n103.138.2.0/23\n103.138.12.0/23\n103.138.80.0/22\n103.138.134.0/23\n103.138.156.0/23\n103.138.208.0/23\n103.138.220.0/23\n103.138.246.0/23\n103.138.248.0/23\n103.139.0.0/23\n103.139.2.0/23\n103.139.22.0/23\n103.139.92.0/23\n103.139.113.0/24\n103.139.134.0/23\n103.139.136.0/23\n103.139.172.0/23\n103.139.204.0/23\n103.139.212.0/23\n103.140.8.0/23\n103.140.14.0/23\n103.140.70.0/23\n103.140.126.0/23\n103.140.140.0/23\n103.140.144.0/23\n103.140.152.0/23\n103.140.192.0/23\n103.140.228.0/23\n103.141.10.0/23\n103.141.58.0/23\n103.141.128.0/23\n103.141.186.0/23\n103.141.242.0/23\n103.142.28.0/23\n103.142.58.0/23\n103.142.82.0/23\n103.142.96.0/23\n103.142.102.0/23\n103.142.122.0/23\n103.142.128.0/23\n103.142.140.0/23\n103.142.154.0/23\n103.142.156.0/23\n103.142.172.0/23\n103.142.180.0/23\n103.142.186.0/23\n103.142.190.0/23\n103.142.220.0/23\n103.142.230.0/24\n103.142.234.0/23\n103.142.238.0/23\n103.142.248.0/23\n103.143.16.0/23\n103.143.18.0/23\n103.143.31.0/24\n103.143.74.0/23\n103.143.120.0/23\n103.143.124.0/23\n103.143.132.0/23\n103.143.134.0/23\n103.143.174.0/23\n103.143.228.0/23\n103.144.40.0/23\n103.144.52.0/23\n103.144.66.0/23\n103.144.70.0/23\n103.144.72.0/23\n103.144.108.0/23\n103.144.136.0/23\n103.144.148.0/23\n103.144.158.0/23\n103.144.240.0/23\n103.145.38.0/23\n103.145.40.0/23\n103.145.42.0/23\n103.145.60.0/23\n103.145.72.0/23\n103.145.80.0/23\n103.145.86.0/23\n103.145.92.0/23\n103.145.94.0/23\n103.145.98.0/23\n103.145.106.0/23\n103.145.122.0/23\n103.145.188.0/23\n103.145.190.0/23\n103.146.72.0/23\n103.146.88.0/23\n103.146.90.0/23\n103.146.124.0/23\n103.146.126.0/23\n103.146.138.0/23\n103.146.230.0/23\n103.146.236.0/23\n103.146.252.0/23\n103.147.12.0/23\n103.147.124.0/23\n103.147.198.0/23\n103.147.206.0/23\n103.148.174.0/23\n103.149.6.0/23\n103.149.17.0/24\n103.149.44.0/23\n103.149.110.0/23\n103.149.132.0/23\n103.149.144.0/23\n103.149.156.0/23\n103.149.181.0/24\n103.149.210.0/23\n103.149.214.0/23\n103.149.220.0/23\n103.149.242.0/23\n103.149.244.0/23\n103.149.246.0/23\n103.149.248.0/23\n103.150.24.0/23\n103.150.66.0/23\n103.150.72.0/23\n103.150.122.0/23\n103.150.126.0/23\n103.150.128.0/23\n103.150.130.0/23\n103.150.146.0/23\n103.150.164.0/23\n103.150.172.0/23\n103.150.180.0/23\n103.150.200.0/23\n103.150.210.0/23\n103.150.214.0/23\n103.150.216.0/23\n103.150.244.0/23\n103.151.4.0/23\n103.151.44.0/23\n103.151.138.0/23\n103.151.142.0/23\n103.151.148.0/23\n103.151.150.0/23\n103.151.158.0/23\n103.151.178.0/23\n103.151.206.0/23\n103.151.216.0/23\n103.151.228.0/23\n103.152.14.0/23\n103.152.24.0/23\n103.152.28.0/23\n103.152.30.0/23\n103.152.56.0/23\n103.152.76.0/23\n103.152.98.0/23\n103.152.112.0/23\n103.152.120.0/23\n103.152.122.0/23\n103.152.132.0/23\n103.152.152.0/23\n103.152.168.0/23\n103.152.170.0/23\n103.152.186.0/23\n103.152.190.0/23\n103.152.192.0/23\n103.152.200.0/23\n103.152.208.0/23\n103.152.224.0/23\n103.152.226.0/23\n103.152.246.0/23\n103.152.250.0/23\n103.153.4.0/23\n103.153.36.0/23\n103.153.100.0/23\n103.153.114.0/23\n103.153.122.0/23\n103.153.128.0/23\n103.153.132.0/23\n103.153.138.0/23\n103.153.146.0/23\n103.153.160.0/23\n103.154.18.0/23\n103.154.30.0/23\n103.154.32.0/23\n103.154.40.0/23\n103.154.66.0/23\n103.154.162.0/23\n103.154.164.0/23\n103.154.168.0/23\n103.154.242.0/23\n103.155.14.0/23\n103.155.16.0/23\n103.155.34.0/23\n103.155.48.0/23\n103.155.76.0/23\n103.155.100.0/23\n103.155.110.0/23\n103.155.120.0/23\n103.155.214.0/23\n103.155.248.0/23\n103.156.28.0/23\n103.156.68.0/23\n103.156.78.0/23\n103.156.104.0/23\n103.156.158.0/23\n103.156.174.0/23\n103.156.186.0/23\n103.156.228.0/23\n103.157.30.0/23\n103.157.138.0/23\n103.157.174.0/23\n103.157.212.0/23\n103.157.234.0/23\n103.157.254.0/23\n103.158.0.0/23\n103.158.8.0/23\n103.158.16.0/23\n103.158.190.0/23\n103.158.200.0/23\n103.158.224.0/23\n103.159.80.0/23\n103.159.122.0/23\n103.159.124.0/23\n103.159.134.0/23\n103.159.142.0/23\n103.160.32.0/23\n103.160.34.0/23\n103.160.112.0/23\n103.160.114.0/23\n103.160.244.0/23\n103.160.254.0/23\n103.161.14.0/23\n103.161.102.0/23\n103.161.138.0/23\n103.161.208.0/23\n103.161.220.0/23\n103.161.254.0/23\n103.162.10.0/23\n103.162.32.0/23\n103.162.116.0/23\n103.163.28.0/23\n103.163.32.0/23\n103.163.46.0/23\n103.163.74.0/23\n103.163.180.0/23\n103.164.4.0/23\n103.164.32.0/23\n103.164.40.0/23\n103.164.42.0/23\n103.164.64.0/23\n103.164.76.0/23\n103.164.178.0/23\n103.165.44.0/23\n103.165.52.0/23\n103.165.82.0/23\n103.165.110.0/23\n103.166.20.0/23\n103.166.50.0/23\n103.166.52.0/23\n103.166.54.0/23\n103.166.84.0/23\n103.166.138.0/23\n103.166.242.0/23\n103.166.246.0/23\n103.167.0.0/23\n103.167.36.0/23\n103.168.98.0/23\n103.168.170.0/23\n103.169.50.0/23\n103.169.62.0/23\n103.169.108.0/23\n103.169.162.0/23\n103.169.202.0/23\n103.169.216.0/23\n103.170.4.0/23\n103.170.72.0/23\n103.170.134.0/23\n103.170.210.0/23\n103.170.212.0/23\n103.171.32.0/23\n103.171.166.0/23\n103.171.214.0/23\n103.172.32.0/23\n103.172.160.0/23\n103.172.191.0/24\n103.173.102.0/23\n103.173.182.0/23\n103.173.184.0/23\n103.174.94.0/23\n103.175.14.0/23\n103.175.98.0/23\n103.175.114.0/23\n103.175.118.0/23\n103.176.52.0/23\n103.176.222.0/23\n103.176.244.0/23\n103.177.28.0/23\n103.177.44.0/23\n103.177.70.0/23\n103.177.136.0/23\n103.177.162.0/23\n103.178.56.0/23\n103.178.240.0/23\n103.179.76.0/23\n103.179.78.0/23\n103.180.108.0/23\n103.180.226.0/23\n103.181.164.0/23\n103.181.234.0/23\n103.183.26.0/23\n103.183.66.0/23\n103.183.122.0/23\n103.183.124.0/23\n103.184.44.0/23\n103.184.46.0/23\n103.184.60.0/23\n103.185.78.0/23\n103.185.80.0/23\n103.185.228.0/23\n103.186.4.0/23\n103.186.108.0/23\n103.186.112.0/23\n103.186.136.0/23\n103.186.158.0/23\n103.186.162.0/23\n103.186.228.0/23\n103.189.92.0/23\n103.189.140.0/23\n103.189.152.0/23\n103.189.154.0/23\n103.190.20.0/23\n103.190.71.0/24\n103.190.104.0/23\n103.190.116.0/23\n103.190.118.0/23\n103.190.122.0/23\n103.191.102.0/23\n103.191.242.0/23\n103.192.0.0/22\n103.192.4.0/22\n103.192.8.0/22\n103.192.12.0/22\n103.192.16.0/22\n103.192.20.0/22\n103.192.24.0/22\n103.192.28.0/22\n103.192.48.0/22\n103.192.52.0/22\n103.192.56.0/22\n103.192.84.0/22\n103.192.88.0/22\n103.192.92.0/22\n103.192.96.0/22\n103.192.100.0/22\n103.192.104.0/22\n103.192.108.0/22\n103.192.112.0/22\n103.192.128.0/22\n103.192.132.0/22\n103.192.136.0/22\n103.192.140.0/22\n103.192.144.0/22\n103.192.164.0/22\n103.192.188.0/22\n103.192.208.0/22\n103.192.212.0/22\n103.192.216.0/22\n103.192.252.0/22\n103.193.40.0/22\n103.193.44.0/22\n103.193.120.0/22\n103.193.140.0/22\n103.193.160.0/22\n103.193.188.0/22\n103.193.192.0/22\n103.193.212.0/22\n103.193.216.0/22\n103.193.220.0/22\n103.193.224.0/22\n103.193.228.0/22\n103.193.232.0/22\n103.193.236.0/22\n103.194.16.0/22\n103.195.104.0/22\n103.195.112.0/22\n103.195.148.0/22\n103.195.152.0/22\n103.195.160.0/22\n103.196.64.0/22\n103.196.72.0/22\n103.196.88.0/22\n103.196.92.0/22\n103.196.96.0/22\n103.196.168.0/22\n103.196.204.0/22\n103.197.180.0/22\n103.197.228.0/22\n103.198.20.0/22\n103.198.60.0/22\n103.198.64.0/22\n103.198.72.0/22\n103.198.124.0/22\n103.198.156.0/22\n103.198.180.0/22\n103.198.196.0/22\n103.198.216.0/22\n103.198.220.0/22\n103.198.224.0/22\n103.198.228.0/22\n103.198.232.0/22\n103.198.236.0/22\n103.198.240.0/22\n103.198.244.0/22\n103.199.164.0/22\n103.199.196.0/22\n103.199.228.0/22\n103.199.248.0/22\n103.199.252.0/22\n103.200.52.0/22\n103.200.64.0/22\n103.200.68.0/22\n103.200.136.0/22\n103.200.140.0/22\n103.200.144.0/22\n103.200.148.0/22\n103.200.152.0/22\n103.200.156.0/22\n103.200.160.0/22\n103.200.164.0/22\n103.200.168.0/22\n103.200.172.0/22\n103.200.176.0/22\n103.200.180.0/22\n103.200.184.0/22\n103.200.188.0/22\n103.200.192.0/22\n103.200.220.0/22\n103.200.224.0/22\n103.200.228.0/22\n103.200.232.0/22\n103.200.236.0/22\n103.200.240.0/22\n103.200.244.0/22\n103.200.248.0/22\n103.200.252.0/22\n103.201.0.0/22\n103.201.4.0/22\n103.201.8.0/22\n103.201.12.0/22\n103.201.16.0/22\n103.201.20.0/22\n103.201.28.0/22\n103.201.32.0/22\n103.201.36.0/22\n103.201.40.0/22\n103.201.44.0/22\n103.201.48.0/22\n103.201.52.0/22\n103.201.56.0/22\n103.201.60.0/22\n103.201.64.0/22\n103.201.76.0/22\n103.201.80.0/22\n103.201.84.0/22\n103.201.88.0/22\n103.201.92.0/22\n103.201.96.0/22\n103.201.100.0/22\n103.201.104.0/22\n103.201.108.0/22\n103.201.112.0/22\n103.201.116.0/22\n103.201.120.0/22\n103.201.152.0/22\n103.201.156.0/22\n103.201.160.0/22\n103.201.164.0/22\n103.201.168.0/22\n103.201.172.0/22\n103.201.176.0/22\n103.201.180.0/22\n103.201.184.0/22\n103.201.188.0/22\n103.201.192.0/22\n103.201.196.0/22\n103.201.200.0/22\n103.201.204.0/22\n103.201.208.0/22\n103.201.212.0/22\n103.201.216.0/22\n103.201.220.0/22\n103.201.224.0/22\n103.201.228.0/22\n103.201.232.0/22\n103.201.236.0/22\n103.201.240.0/22\n103.201.244.0/22\n103.201.248.0/22\n103.201.252.0/22\n103.202.0.0/22\n103.202.4.0/22\n103.202.8.0/22\n103.202.12.0/22\n103.202.16.0/22\n103.202.20.0/22\n103.202.24.0/22\n103.202.28.0/22\n103.202.32.0/22\n103.202.36.0/22\n103.202.40.0/22\n103.202.44.0/22\n103.202.56.0/22\n103.202.60.0/22\n103.202.64.0/22\n103.202.68.0/22\n103.202.72.0/22\n103.202.76.0/22\n103.202.80.0/22\n103.202.84.0/22\n103.202.88.0/22\n103.202.92.0/22\n103.202.96.0/22\n103.202.100.0/22\n103.202.104.0/22\n103.202.108.0/22\n103.202.112.0/22\n103.202.116.0/22\n103.202.120.0/22\n103.202.124.0/22\n103.202.128.0/22\n103.202.132.0/22\n103.202.136.0/22\n103.202.140.0/22\n103.202.144.0/22\n103.202.152.0/22\n103.202.156.0/22\n103.202.160.0/22\n103.202.164.0/22\n103.202.168.0/22\n103.202.172.0/22\n103.202.176.0/22\n103.202.180.0/22\n103.202.184.0/22\n103.202.188.0/22\n103.202.192.0/22\n103.202.196.0/22\n103.202.200.0/21\n103.202.212.0/22\n103.202.228.0/22\n103.202.236.0/22\n103.202.240.0/22\n103.202.244.0/22\n103.202.248.0/22\n103.202.252.0/22\n103.203.0.0/22\n103.203.4.0/22\n103.203.8.0/22\n103.203.12.0/22\n103.203.16.0/22\n103.203.20.0/22\n103.203.24.0/22\n103.203.28.0/22\n103.203.32.0/22\n103.203.56.0/22\n103.203.96.0/22\n103.203.100.0/22\n103.203.104.0/22\n103.203.108.0/22\n103.203.112.0/22\n103.203.116.0/22\n103.203.120.0/22\n103.203.124.0/22\n103.203.128.0/22\n103.203.140.0/22\n103.203.164.0/22\n103.203.168.0/22\n103.203.192.0/22\n103.203.200.0/22\n103.203.212.0/22\n103.203.216.0/22\n103.204.24.0/22\n103.204.72.0/22\n103.204.88.0/22\n103.204.112.0/22\n103.204.136.0/22\n103.204.140.0/22\n103.204.144.0/22\n103.204.148.0/22\n103.204.152.0/22\n103.204.196.0/22\n103.204.216.0/23\n103.204.232.0/22\n103.204.236.0/22\n103.205.4.0/22\n103.205.8.0/22\n103.205.40.0/22\n103.205.44.0/22\n103.205.52.0/22\n103.205.108.0/22\n103.205.116.0/22\n103.205.120.0/22\n103.205.136.0/22\n103.205.162.0/24\n103.205.188.0/22\n103.205.192.0/22\n103.205.196.0/22\n103.205.200.0/22\n103.205.236.0/22\n103.205.248.0/22\n103.205.252.0/22\n103.206.0.0/22\n103.206.44.0/22\n103.206.148.0/22\n103.207.48.0/22\n103.207.104.0/22\n103.207.184.0/22\n103.207.188.0/22\n103.207.192.0/22\n103.207.196.0/22\n103.207.200.0/22\n103.207.204.0/22\n103.207.208.0/22\n103.207.212.0/22\n103.207.220.0/22\n103.207.228.0/22\n103.207.232.0/22\n103.208.12.0/22\n103.208.16.0/22\n103.208.28.0/22\n103.208.40.0/22\n103.208.44.0/22\n103.208.48.0/22\n103.209.112.0/22\n103.209.136.0/22\n103.209.200.0/22\n103.209.208.0/22\n103.209.216.0/22\n103.210.96.0/22\n103.210.156.0/22\n103.210.160.0/22\n103.210.164.0/22\n103.210.168.0/22\n103.210.172.0/22\n103.210.176.0/22\n103.210.180.0/22\n103.210.184.0/22\n103.210.188.0/22\n103.210.216.0/22\n103.211.44.0/22\n103.211.96.0/22\n103.211.100.0/22\n103.211.156.0/22\n103.211.164.0/22\n103.211.192.0/22\n103.211.220.0/22\n103.211.224.0/22\n103.211.248.0/22\n103.212.0.0/22\n103.212.4.0/22\n103.212.8.0/22\n103.212.12.0/22\n103.212.44.0/22\n103.212.48.0/22\n103.212.84.0/22\n103.212.100.0/22\n103.212.108.0/22\n103.212.148.0/22\n103.212.164.0/22\n103.212.196.0/22\n103.212.200.0/22\n103.212.228.0/22\n103.212.252.0/22\n103.213.40.0/22\n103.213.44.0/22\n103.213.48.0/22\n103.213.52.0/22\n103.213.56.0/22\n103.213.60.0/22\n103.213.64.0/22\n103.213.68.0/22\n103.213.72.0/22\n103.213.76.0/22\n103.213.80.0/22\n103.213.84.0/22\n103.213.88.0/22\n103.213.92.0/22\n103.213.96.0/22\n103.213.132.0/22\n103.213.136.0/22\n103.213.140.0/22\n103.213.144.0/22\n103.213.148.0/22\n103.213.152.0/22\n103.213.156.0/22\n103.213.160.0/22\n103.213.164.0/22\n103.213.168.0/22\n103.213.172.0/22\n103.213.176.0/22\n103.213.180.0/22\n103.213.184.0/22\n103.213.188.0/22\n103.214.48.0/22\n103.214.84.0/22\n103.214.212.0/22\n103.214.240.0/22\n103.214.244.0/22\n103.215.28.0/22\n103.215.32.0/22\n103.215.36.0/22\n103.215.44.0/22\n103.215.48.0/22\n103.215.100.0/22\n103.215.108.0/22\n103.215.116.0/22\n103.215.120.0/22\n103.215.140.0/22\n103.216.4.0/22\n103.216.8.0/22\n103.216.12.0/22\n103.216.16.0/22\n103.216.20.0/22\n103.216.24.0/22\n103.216.28.0/22\n103.216.32.0/22\n103.216.36.0/22\n103.216.40.0/22\n103.216.44.0/22\n103.216.64.0/22\n103.216.108.0/22\n103.216.136.0/22\n103.216.152.0/22\n103.216.224.0/22\n103.216.228.0/22\n103.216.240.0/22\n103.216.244.0/22\n103.216.248.0/22\n103.216.252.0/22\n103.217.0.0/22\n103.217.4.0/22\n103.217.8.0/22\n103.217.12.0/22\n103.217.16.0/22\n103.217.20.0/22\n103.217.24.0/22\n103.217.28.0/22\n103.217.32.0/22\n103.217.36.0/22\n103.217.40.0/22\n103.217.44.0/22\n103.217.48.0/22\n103.217.52.0/22\n103.217.56.0/22\n103.217.60.0/22\n103.217.168.0/22\n103.217.180.0/22\n103.217.184.0/22\n103.217.188.0/22\n103.217.192.0/22\n103.217.196.0/22\n103.217.200.0/22\n103.217.204.0/22\n103.218.8.0/22\n103.218.12.0/22\n103.218.16.0/22\n103.218.20.0/22\n103.218.28.0/22\n103.218.32.0/22\n103.218.36.0/22\n103.218.40.0/22\n103.218.44.0/22\n103.218.48.0/22\n103.218.52.0/22\n103.218.56.0/22\n103.218.60.0/22\n103.218.64.0/22\n103.218.68.0/22\n103.218.72.0/22\n103.218.76.0/22\n103.218.80.0/22\n103.218.84.0/22\n103.218.88.0/22\n103.218.92.0/22\n103.218.192.0/22\n103.218.196.0/22\n103.218.200.0/22\n103.218.204.0/22\n103.218.208.0/22\n103.218.212.0/22\n103.218.216.0/22\n103.219.24.0/22\n103.219.28.0/22\n103.219.32.0/22\n103.219.36.0/22\n103.219.64.0/22\n103.219.84.0/22\n103.219.88.0/22\n103.219.92.0/22\n103.219.96.0/22\n103.219.100.0/22\n103.219.176.0/22\n103.219.184.0/22\n103.220.48.0/22\n103.220.52.0/22\n103.220.56.0/22\n103.220.60.0/22\n103.220.64.0/22\n103.220.92.0/22\n103.220.96.0/22\n103.220.100.0/22\n103.220.104.0/22\n103.220.108.0/22\n103.220.116.0/22\n103.220.120.0/22\n103.220.124.0/22\n103.220.128.0/22\n103.220.132.0/22\n103.220.136.0/22\n103.220.140.0/22\n103.220.144.0/22\n103.220.148.0/22\n103.220.152.0/22\n103.220.160.0/22\n103.220.164.0/22\n103.220.168.0/22\n103.220.172.0/22\n103.220.176.0/22\n103.220.180.0/22\n103.220.184.0/22\n103.220.188.0/22\n103.220.192.0/22\n103.220.196.0/22\n103.220.200.0/22\n103.220.240.0/22\n103.220.244.0/22\n103.220.248.0/22\n103.220.252.0/22\n103.221.0.0/22\n103.221.4.0/22\n103.221.8.0/22\n103.221.12.0/22\n103.221.16.0/22\n103.221.20.0/22\n103.221.24.0/22\n103.221.28.0/22\n103.221.32.0/22\n103.221.36.0/22\n103.221.40.0/22\n103.221.44.0/22\n103.221.48.0/22\n103.221.88.0/22\n103.221.92.0/22\n103.221.96.0/22\n103.221.100.0/22\n103.221.104.0/22\n103.221.108.0/22\n103.221.112.0/22\n103.221.116.0/22\n103.221.120.0/22\n103.221.124.0/22\n103.221.128.0/22\n103.221.132.0/22\n103.221.136.0/22\n103.221.140.0/22\n103.221.144.0/22\n103.221.148.0/22\n103.221.152.0/22\n103.221.156.0/22\n103.221.160.0/22\n103.221.164.0/22\n103.221.168.0/22\n103.221.172.0/22\n103.221.176.0/22\n103.221.180.0/22\n103.221.184.0/22\n103.221.188.0/22\n103.221.192.0/22\n103.221.196.0/22\n103.221.200.0/22\n103.221.204.0/22\n103.222.0.0/22\n103.222.4.0/22\n103.222.8.0/22\n103.222.12.0/22\n103.222.16.0/22\n103.222.24.0/22\n103.222.28.0/22\n103.222.32.0/22\n103.222.36.0/22\n103.222.40.0/22\n103.222.44.0/22\n103.222.48.0/22\n103.222.52.0/22\n103.222.56.0/22\n103.222.60.0/22\n103.222.64.0/22\n103.222.68.0/22\n103.222.72.0/22\n103.222.76.0/22\n103.222.80.0/22\n103.222.84.0/22\n103.222.88.0/22\n103.222.92.0/22\n103.222.96.0/22\n103.222.100.0/22\n103.222.104.0/22\n103.222.108.0/22\n103.222.112.0/22\n103.222.116.0/22\n103.222.120.0/22\n103.222.124.0/22\n103.222.128.0/22\n103.222.132.0/22\n103.222.136.0/22\n103.222.140.0/22\n103.222.144.0/22\n103.222.148.0/22\n103.222.152.0/22\n103.222.156.0/22\n103.222.160.0/22\n103.222.164.0/22\n103.222.168.0/22\n103.222.172.0/22\n103.222.176.0/22\n103.222.180.0/22\n103.222.184.0/22\n103.222.188.0/22\n103.222.192.0/22\n103.222.196.0/22\n103.222.200.0/22\n103.222.204.0/22\n103.222.208.0/22\n103.222.212.0/22\n103.222.216.0/22\n103.222.220.0/22\n103.222.224.0/22\n103.222.228.0/22\n103.222.232.0/22\n103.222.240.0/22\n103.222.244.0/22\n103.223.16.0/22\n103.223.20.0/22\n103.223.24.0/22\n103.223.28.0/22\n103.223.32.0/22\n103.223.36.0/22\n103.223.40.0/22\n103.223.44.0/22\n103.223.48.0/22\n103.223.52.0/22\n103.223.56.0/22\n103.223.60.0/22\n103.223.64.0/22\n103.223.68.0/22\n103.223.72.0/22\n103.223.76.0/22\n103.223.80.0/22\n103.223.84.0/22\n103.223.88.0/22\n103.223.92.0/22\n103.223.96.0/22\n103.223.100.0/22\n103.223.104.0/22\n103.223.108.0/22\n103.223.112.0/22\n103.223.116.0/22\n103.223.120.0/22\n103.223.124.0/22\n103.223.128.0/22\n103.223.132.0/22\n103.223.140.0/22\n103.223.144.0/22\n103.223.148.0/22\n103.223.152.0/22\n103.223.156.0/22\n103.223.160.0/22\n103.223.164.0/22\n103.223.168.0/22\n103.223.172.0/22\n103.223.176.0/22\n103.223.180.0/22\n103.223.188.0/22\n103.223.192.0/22\n103.223.196.0/22\n103.223.200.0/22\n103.223.204.0/22\n103.223.208.0/22\n103.223.212.0/22\n103.223.216.0/22\n103.223.220.0/22\n103.223.224.0/22\n103.223.228.0/22\n103.223.232.0/22\n103.223.236.0/22\n103.223.240.0/22\n103.223.244.0/22\n103.223.248.0/22\n103.223.252.0/22\n103.224.0.0/22\n103.224.40.0/22\n103.224.44.0/22\n103.224.60.0/22\n103.224.80.0/22\n103.224.220.0/22\n103.224.224.0/22\n103.224.228.0/22\n103.224.232.0/22\n103.225.84.0/22\n103.226.16.0/22\n103.226.40.0/22\n103.226.56.0/22\n103.226.60.0/22\n103.226.80.0/22\n103.226.132.0/22\n103.226.156.0/22\n103.226.180.0/22\n103.226.196.0/22\n103.227.48.0/22\n103.227.72.0/22\n103.227.76.0/22\n103.227.80.0/22\n103.227.100.0/22\n103.227.120.0/22\n103.227.132.0/22\n103.227.136.0/22\n103.227.196.0/22\n103.227.204.0/22\n103.227.212.0/22\n103.227.228.0/22\n103.228.12.0/22\n103.228.88.0/22\n103.228.136.0/22\n103.228.160.0/22\n103.228.176.0/22\n103.228.204.0/22\n103.228.208.0/22\n103.228.228.0/22\n103.228.232.0/22\n103.229.20.0/22\n103.229.60.0/22\n103.229.136.0/22\n103.229.148.0/22\n103.229.172.0/22\n103.229.212.0/22\n103.229.216.0/22\n103.229.220.0/22\n103.229.228.0/22\n103.229.236.0/22\n103.229.240.0/22\n103.230.0.0/22\n103.230.28.0/22\n103.230.44.0/22\n103.230.96.0/22\n103.230.196.0/22\n103.230.200.0/22\n103.230.204.0/22\n103.230.212.0/22\n103.230.236.0/22\n103.231.16.0/22\n103.231.20.0/22\n103.231.64.0/22\n103.231.68.0/22\n103.231.180.0/22\n103.231.184.0/22\n103.231.244.0/22\n103.232.4.0/22\n103.232.144.0/22\n103.232.188.0/22\n103.232.212.0/22\n103.233.4.0/22\n103.233.44.0/22\n103.233.52.0/22\n103.233.104.0/22\n103.233.128.0/22\n103.233.136.0/22\n103.233.162.0/23\n103.233.228.0/22\n103.234.0.0/22\n103.234.20.0/22\n103.234.56.0/22\n103.234.128.0/22\n103.234.172.0/22\n103.234.180.0/22\n103.234.244.0/22\n103.235.16.0/22\n103.235.48.0/22\n103.235.56.0/22\n103.235.60.0/22\n103.235.80.0/22\n103.235.84.0/22\n103.235.100.0/22\n103.235.128.0/22\n103.235.132.0/22\n103.235.136.0/22\n103.235.140.0/22\n103.235.144.0/22\n103.235.148.0/22\n103.235.184.0/22\n103.235.192.0/22\n103.235.200.0/22\n103.235.220.0/22\n103.235.224.0/22\n103.235.228.0/22\n103.235.232.0/22\n103.235.236.0/22\n103.235.240.0/22\n103.235.244.0/22\n103.235.248.0/22\n103.235.252.0/22\n103.236.0.0/22\n103.236.4.0/22\n103.236.8.0/22\n103.236.12.0/22\n103.236.16.0/22\n103.236.20.0/22\n103.236.24.0/22\n103.236.28.0/22\n103.236.32.0/22\n103.236.36.0/22\n103.236.40.0/22\n103.236.44.0/22\n103.236.48.0/22\n103.236.52.0/22\n103.236.56.0/22\n103.236.60.0/22\n103.236.64.0/22\n103.236.68.0/22\n103.236.72.0/22\n103.236.76.0/22\n103.236.80.0/22\n103.236.84.0/22\n103.236.88.0/22\n103.236.92.0/22\n103.236.96.0/22\n103.236.120.0/22\n103.236.184.0/22\n103.236.220.0/22\n103.236.232.0/22\n103.236.240.0/22\n103.236.244.0/22\n103.236.248.0/22\n103.236.252.0/22\n103.237.0.0/22\n103.237.4.0/22\n103.237.8.0/22\n103.237.12.0/22\n103.237.24.0/22\n103.237.28.0/22\n103.237.68.0/22\n103.237.88.0/22\n103.237.152.0/22\n103.237.176.0/22\n103.237.180.0/22\n103.237.184.0/22\n103.237.188.0/22\n103.237.192.0/22\n103.237.196.0/22\n103.237.200.0/22\n103.237.204.0/22\n103.237.208.0/22\n103.237.212.0/22\n103.237.216.0/22\n103.237.220.0/22\n103.237.224.0/22\n103.237.228.0/22\n103.237.232.0/22\n103.237.236.0/22\n103.237.240.0/22\n103.237.244.0/22\n103.237.248.0/22\n103.237.252.0/22\n103.238.0.0/22\n103.238.4.0/22\n103.238.16.0/22\n103.238.20.0/22\n103.238.24.0/22\n103.238.28.0/22\n103.238.32.0/22\n103.238.36.0/22\n103.238.40.0/22\n103.238.44.0/22\n103.238.48.0/22\n103.238.52.0/22\n103.238.56.0/22\n103.238.88.0/22\n103.238.92.0/22\n103.238.96.0/22\n103.238.132.0/22\n103.238.140.0/22\n103.238.144.0/22\n103.238.160.0/22\n103.238.164.0/22\n103.238.168.0/22\n103.238.172.0/22\n103.238.176.0/22\n103.238.180.0/22\n103.238.184.0/22\n103.238.188.0/22\n103.238.196.0/22\n103.238.204.0/22\n103.238.252.0/22\n103.239.0.0/22\n103.239.44.0/22\n103.239.68.0/22\n103.239.152.0/22\n103.239.156.0/22\n103.239.180.0/22\n103.239.184.0/22\n103.239.192.0/22\n103.239.196.0/22\n103.239.204.0/22\n103.239.208.0/22\n103.239.224.0/22\n103.239.244.0/22\n103.240.16.0/22\n103.240.36.0/22\n103.240.72.0/22\n103.240.84.0/22\n103.240.124.0/22\n103.240.172.0/22\n103.240.188.0/22\n103.240.244.0/22\n103.241.12.0/22\n103.241.72.0/22\n103.241.92.0/22\n103.241.96.0/22\n103.241.160.0/22\n103.241.184.0/22\n103.241.188.0/22\n103.241.220.0/22\n103.242.12.0/22\n103.242.64.0/22\n103.242.128.0/22\n103.242.132.0/22\n103.242.160.0/22\n103.242.168.0/22\n103.242.172.0/22\n103.242.176.0/22\n103.242.200.0/22\n103.242.212.0/22\n103.242.220.0/22\n103.242.240.0/22\n103.243.136.0/22\n103.243.252.0/22\n103.244.16.0/22\n103.244.58.0/23\n103.244.60.0/22\n103.244.64.0/22\n103.244.68.0/22\n103.244.72.0/22\n103.244.76.0/22\n103.244.80.0/22\n103.244.84.0/22\n103.244.116.0/22\n103.244.164.0/22\n103.244.232.0/22\n103.244.252.0/22\n103.245.23.0/24\n103.245.52.0/22\n103.245.60.0/22\n103.245.80.0/22\n103.245.124.0/22\n103.245.128.0/22\n103.246.8.0/22\n103.246.12.0/22\n103.246.120.0/22\n103.246.124.0/22\n103.246.132.0/22\n103.246.152.0/22\n103.246.156.0/22\n103.247.168.0/22\n103.247.172.0/22\n103.247.176.0/22\n103.247.200.0/22\n103.247.212.0/22\n103.248.0.0/23\n103.248.64.0/22\n103.248.100.0/22\n103.248.124.0/22\n103.248.152.0/22\n103.248.168.0/22\n103.248.192.0/22\n103.248.212.0/22\n103.248.224.0/22\n103.249.8.0/22\n103.249.12.0/22\n103.249.52.0/22\n103.249.104.0/22\n103.249.128.0/22\n103.249.136.0/22\n103.249.144.0/22\n103.249.164.0/22\n103.249.168.0/22\n103.249.172.0/22\n103.249.176.0/22\n103.249.188.0/22\n103.249.192.0/22\n103.249.244.0/22\n103.249.252.0/22\n103.250.32.0/22\n103.250.104.0/22\n103.250.124.0/22\n103.250.180.0/22\n103.250.192.0/22\n103.250.216.0/22\n103.250.224.0/22\n103.250.236.0/22\n103.250.248.0/22\n103.250.252.0/22\n103.251.32.0/22\n103.251.84.0/22\n103.251.96.0/22\n103.251.124.0/22\n103.251.128.0/22\n103.251.160.0/22\n103.251.192.0/22\n103.251.204.0/22\n103.251.240.0/22\n103.252.28.0/22\n103.252.36.0/22\n103.252.64.0/22\n103.252.96.0/22\n103.252.104.0/22\n103.252.172.0/22\n103.252.204.0/22\n103.252.208.0/22\n103.252.232.0/22\n103.252.248.0/22\n103.253.4.0/22\n103.253.60.0/22\n103.253.204.0/22\n103.253.220.0/22\n103.253.224.0/22\n103.253.232.0/22\n103.254.8.0/22\n103.254.20.0/22\n103.254.64.0/22\n103.254.68.0/22\n103.254.72.0/22\n103.254.76.0/22\n103.254.112.0/22\n103.254.176.0/22\n103.254.188.0/22\n103.254.196.0/24\n103.254.220.0/22\n103.255.56.0/22\n103.255.68.0/22\n103.255.88.0/22\n103.255.92.0/22\n103.255.136.0/22\n103.255.140.0/22\n103.255.184.0/22\n103.255.200.0/22\n103.255.212.0/22\n103.255.228.0/22\n106.0.0.0/24\n106.0.2.0/23\n106.0.4.0/22\n106.0.8.0/21\n106.0.16.0/20\n106.0.44.0/22\n106.0.64.0/18\n106.2.0.0/15\n106.4.0.0/14\n106.8.0.0/15\n106.11.0.0/16\n106.12.0.0/14\n106.16.0.0/12\n106.32.0.0/12\n106.48.0.0/15\n106.50.0.0/16\n106.52.0.0/14\n106.56.0.0/13\n106.74.0.0/16\n106.75.0.0/16\n106.80.0.0/12\n106.108.0.0/14\n106.112.0.0/13\n106.120.0.0/13\n106.224.0.0/12\n109.244.0.0/16\n110.6.0.0/15\n110.16.0.0/14\n110.34.40.0/22\n110.34.44.0/22\n110.40.0.0/14\n110.44.12.0/22\n110.44.144.0/20\n110.48.0.0/16\n110.51.0.0/16\n110.52.0.0/15\n110.56.0.0/13\n110.64.0.0/15\n110.72.0.0/15\n110.75.0.0/17\n110.75.128.0/19\n110.75.160.0/19\n110.75.192.0/18\n110.76.0.0/19\n110.76.32.0/19\n110.76.132.0/22\n110.76.156.0/22\n110.76.184.0/22\n110.76.192.0/18\n110.77.0.0/17\n110.80.0.0/13\n110.88.0.0/14\n110.92.68.0/22\n110.93.32.0/19\n110.94.0.0/15\n110.96.0.0/11\n110.152.0.0/14\n110.156.0.0/15\n110.165.32.0/19\n110.166.0.0/15\n110.172.192.0/18\n110.173.0.0/19\n110.173.32.0/20\n110.173.64.0/19\n110.173.96.0/19\n110.173.192.0/19\n110.176.0.0/13\n110.184.0.0/13\n110.192.0.0/11\n110.228.0.0/14\n110.232.32.0/19\n110.236.0.0/15\n110.240.0.0/12\n111.0.0.0/10\n111.66.0.0/16\n111.67.192.0/20\n111.68.64.0/19\n111.72.0.0/13\n111.85.0.0/16\n111.91.192.0/19\n111.92.240.0/22\n111.92.248.0/22\n111.92.252.0/22\n111.112.0.0/15\n111.114.0.0/15\n111.116.0.0/15\n111.118.200.0/21\n111.119.64.0/18\n111.119.128.0/19\n111.120.0.0/14\n111.124.0.0/16\n111.126.0.0/15\n111.128.0.0/11\n111.160.0.0/13\n111.170.0.0/16\n111.172.0.0/14\n111.176.0.0/13\n111.186.0.0/15\n111.192.0.0/12\n111.208.0.0/14\n111.212.0.0/14\n111.221.28.0/24\n111.221.128.0/17\n111.222.0.0/16\n111.223.4.0/22\n111.223.8.0/22\n111.223.12.0/22\n111.223.16.0/22\n111.223.240.0/22\n111.223.248.0/22\n111.224.0.0/14\n111.228.0.0/14\n111.235.96.0/19\n111.235.156.0/22\n111.235.160.0/19\n112.0.0.0/10\n112.64.0.0/15\n112.66.0.0/15\n112.73.0.0/16\n112.74.0.0/15\n112.80.0.0/13\n112.88.0.0/13\n112.96.0.0/15\n112.98.0.0/15\n112.100.0.0/14\n112.109.128.0/17\n112.111.0.0/16\n112.112.0.0/14\n112.116.0.0/15\n112.122.0.0/15\n112.124.0.0/14\n112.128.0.0/14\n112.132.0.0/16\n112.137.48.0/21\n112.192.0.0/14\n112.224.0.0/11\n113.0.0.0/13\n113.8.0.0/15\n113.11.192.0/19\n113.12.0.0/14\n113.16.0.0/15\n113.18.0.0/16\n113.21.232.0/22\n113.21.236.0/22\n113.24.0.0/14\n113.31.0.0/16\n113.44.0.0/14\n113.48.0.0/14\n113.52.160.0/19\n113.52.228.0/22\n113.54.0.0/15\n113.56.0.0/15\n113.58.0.0/16\n113.59.0.0/17\n113.59.224.0/22\n113.62.0.0/15\n113.64.0.0/11\n113.96.0.0/12\n113.112.0.0/13\n113.120.0.0/13\n113.128.0.0/15\n113.130.96.0/20\n113.130.112.0/21\n113.132.0.0/14\n113.136.0.0/13\n113.194.0.0/15\n113.197.100.0/22\n113.200.0.0/15\n113.202.0.0/16\n113.204.0.0/14\n113.208.96.0/19\n113.208.128.0/17\n113.209.0.0/16\n113.212.0.0/18\n113.212.88.0/22\n113.212.100.0/22\n113.212.184.0/21\n113.213.0.0/17\n113.214.0.0/15\n113.218.0.0/15\n113.220.0.0/14\n113.224.0.0/12\n113.240.0.0/13\n113.248.0.0/14\n114.28.0.0/16\n114.31.64.0/22\n114.31.68.0/22\n114.54.0.0/15\n114.60.0.0/14\n114.64.0.0/14\n114.68.0.0/16\n114.79.64.0/18\n114.80.0.0/12\n114.96.0.0/13\n114.104.0.0/14\n114.110.0.0/20\n114.110.64.0/18\n114.111.0.0/19\n114.111.160.0/19\n114.112.0.0/14\n114.116.0.0/16\n114.117.0.0/17\n114.117.128.0/17\n114.118.0.0/16\n114.119.0.0/17\n114.119.192.0/21\n114.119.200.0/22\n114.119.204.0/22\n114.119.208.0/20\n114.119.224.0/19\n114.132.0.0/16\n114.134.184.0/22\n114.134.188.0/23\n114.135.0.0/16\n114.138.0.0/15\n114.141.64.0/21\n114.141.80.0/22\n114.141.84.0/22\n114.141.128.0/18\n114.142.136.0/21\n114.196.0.0/15\n114.198.248.0/21\n114.208.0.0/14\n114.212.0.0/15\n114.214.0.0/16\n114.215.0.0/16\n114.216.0.0/13\n114.224.0.0/12\n114.240.0.0/12\n115.24.0.0/14\n115.28.0.0/15\n115.31.64.0/22\n115.31.68.0/22\n115.31.72.0/22\n115.31.76.0/22\n115.32.0.0/14\n115.42.56.0/22\n115.44.0.0/15\n115.46.0.0/16\n115.47.0.0/16\n115.48.0.0/12\n115.69.64.0/20\n115.84.0.0/18\n115.84.192.0/19\n115.85.192.0/18\n115.100.0.0/14\n115.104.0.0/14\n115.120.0.0/14\n115.124.16.0/20\n115.148.0.0/14\n115.152.0.0/15\n115.154.0.0/15\n115.156.0.0/15\n115.158.0.0/16\n115.159.0.0/16\n115.166.64.0/19\n115.168.0.0/14\n115.172.0.0/14\n115.180.0.0/15\n115.182.0.0/16\n115.183.0.0/16\n115.187.0.0/22\n115.187.4.0/22\n115.187.8.0/22\n115.187.12.0/22\n115.190.0.0/15\n115.192.0.0/11\n115.224.0.0/12\n116.0.8.0/21\n116.0.24.0/21\n116.1.0.0/16\n116.2.0.0/15\n116.4.0.0/14\n116.8.0.0/14\n116.13.0.0/16\n116.16.0.0/12\n116.50.0.0/20\n116.52.0.0/14\n116.56.0.0/15\n116.58.128.0/20\n116.58.208.0/20\n116.60.0.0/14\n116.66.0.0/17\n116.66.176.0/22\n116.68.136.0/22\n116.68.140.0/22\n116.68.176.0/22\n116.68.180.0/22\n116.69.0.0/16\n116.70.0.0/17\n116.76.0.0/15\n116.78.0.0/15\n116.85.0.0/16\n116.89.144.0/20\n116.89.240.0/22\n116.90.80.0/20\n116.90.184.0/21\n116.95.0.0/16\n116.112.0.0/14\n116.116.0.0/15\n116.128.0.0/10\n116.192.0.0/16\n116.193.16.0/20\n116.193.32.0/19\n116.193.152.0/22\n116.193.164.0/22\n116.193.176.0/21\n116.194.0.0/15\n116.196.0.0/17\n116.196.128.0/18\n116.196.192.0/18\n116.197.160.0/22\n116.197.164.0/22\n116.198.0.0/16\n116.199.0.0/17\n116.199.128.0/19\n116.204.0.0/17\n116.204.132.0/22\n116.204.216.0/22\n116.204.232.0/22\n116.205.0.0/16\n116.207.0.0/16\n116.208.0.0/14\n116.212.160.0/20\n116.213.44.0/22\n116.213.64.0/18\n116.213.128.0/17\n116.214.32.0/19\n116.214.64.0/20\n116.214.128.0/17\n116.215.0.0/16\n116.216.0.0/14\n116.224.0.0/12\n116.242.0.0/15\n116.244.0.0/15\n116.246.0.0/15\n116.248.0.0/15\n116.251.64.0/18\n116.252.0.0/15\n116.254.104.0/22\n116.254.108.0/22\n116.254.128.0/17\n116.255.128.0/17\n117.8.0.0/13\n117.21.0.0/16\n117.22.0.0/15\n117.24.0.0/13\n117.32.0.0/13\n117.40.0.0/14\n117.44.0.0/15\n117.48.0.0/14\n117.53.48.0/20\n117.53.176.0/20\n117.57.0.0/16\n117.58.0.0/17\n117.59.0.0/16\n117.60.0.0/14\n117.64.0.0/13\n117.72.0.0/15\n117.74.64.0/20\n117.74.80.0/20\n117.74.128.0/17\n117.75.0.0/16\n117.76.0.0/14\n117.80.0.0/12\n117.100.0.0/15\n117.103.16.0/20\n117.103.40.0/21\n117.103.72.0/21\n117.103.128.0/20\n117.104.168.0/21\n117.106.0.0/15\n117.112.0.0/13\n117.120.64.0/18\n117.120.128.0/17\n117.121.0.0/17\n117.121.128.0/18\n117.121.192.0/21\n117.122.128.0/17\n117.124.0.0/14\n117.128.0.0/10\n118.24.0.0/15\n118.26.0.0/19\n118.26.32.0/22\n118.26.40.0/21\n118.26.48.0/21\n118.26.56.0/21\n118.26.64.0/19\n118.26.96.0/21\n118.26.112.0/21\n118.26.120.0/21\n118.26.128.0/22\n118.26.133.0/24\n118.26.134.0/23\n118.26.136.0/21\n118.26.160.0/20\n118.26.188.0/22\n118.26.192.0/18\n118.28.0.0/15\n118.30.0.0/16\n118.31.0.0/16\n118.64.0.0/15\n118.66.0.0/16\n118.67.112.0/20\n118.72.0.0/13\n118.80.0.0/15\n118.84.0.0/15\n118.88.32.0/19\n118.88.64.0/18\n118.88.128.0/17\n118.89.0.0/16\n118.91.240.0/20\n118.102.16.0/20\n118.102.32.0/21\n118.103.164.0/22\n118.103.168.0/22\n118.103.172.0/22\n118.103.176.0/22\n118.112.0.0/13\n118.120.0.0/14\n118.124.0.0/15\n118.126.0.0/16\n118.127.128.0/19\n118.132.0.0/14\n118.144.0.0/14\n118.178.0.0/16\n118.180.0.0/14\n118.184.0.0/17\n118.184.128.0/17\n118.186.0.0/15\n118.188.0.0/16\n118.190.0.0/16\n118.191.0.0/21\n118.191.8.0/22\n118.191.12.0/24\n118.191.16.0/21\n118.191.64.0/20\n118.191.80.0/22\n118.191.128.0/19\n118.191.176.0/20\n118.191.192.0/20\n118.191.208.0/24\n118.191.216.0/22\n118.191.223.0/24\n118.191.224.0/24\n118.191.240.0/20\n118.192.0.0/16\n118.193.0.0/21\n118.193.8.0/21\n118.193.48.0/21\n118.193.96.0/19\n118.193.128.0/17\n118.194.0.0/17\n118.194.128.0/18\n118.194.192.0/19\n118.194.224.0/22\n118.194.240.0/21\n118.195.0.0/17\n118.195.128.0/17\n118.196.0.0/14\n118.202.0.0/15\n118.204.0.0/14\n118.212.0.0/16\n118.213.0.0/16\n118.215.192.0/18\n118.224.0.0/14\n118.228.0.0/15\n118.230.0.0/16\n118.239.0.0/16\n118.242.0.0/16\n118.244.0.0/14\n118.248.0.0/13\n119.0.0.0/15\n119.2.0.0/19\n119.2.128.0/17\n119.3.0.0/16\n119.4.0.0/14\n119.10.0.0/17\n119.15.136.0/21\n119.16.0.0/16\n119.18.192.0/20\n119.18.208.0/21\n119.18.224.0/20\n119.18.240.0/20\n119.19.0.0/16\n119.20.0.0/14\n119.27.64.0/18\n119.27.128.0/19\n119.27.160.0/19\n119.27.192.0/18\n119.28.0.0/15\n119.30.48.0/20\n119.31.192.0/19\n119.32.0.0/14\n119.36.0.0/16\n119.37.0.0/17\n119.37.128.0/18\n119.37.192.0/18\n119.38.0.0/17\n119.38.128.0/18\n119.38.192.0/20\n119.38.208.0/20\n119.38.224.0/19\n119.39.0.0/16\n119.40.0.0/18\n119.40.64.0/20\n119.40.128.0/17\n119.41.0.0/16\n119.42.0.0/19\n119.42.128.0/21\n119.42.136.0/21\n119.42.224.0/19\n119.44.0.0/15\n119.48.0.0/13\n119.57.0.0/16\n119.58.0.0/16\n119.59.128.0/17\n119.60.0.0/16\n119.61.0.0/16\n119.62.0.0/16\n119.63.32.0/19\n119.75.208.0/20\n119.78.0.0/15\n119.80.0.0/16\n119.82.208.0/20\n119.84.0.0/14\n119.88.0.0/14\n119.96.0.0/13\n119.108.0.0/15\n119.112.0.0/13\n119.120.0.0/13\n119.128.0.0/12\n119.144.0.0/14\n119.148.160.0/20\n119.148.176.0/20\n119.151.192.0/18\n119.160.200.0/21\n119.161.120.0/22\n119.161.124.0/22\n119.161.128.0/17\n119.162.0.0/15\n119.164.0.0/14\n119.176.0.0/12\n119.232.0.0/15\n119.235.128.0/18\n119.248.0.0/14\n119.252.96.0/21\n119.252.240.0/20\n119.253.0.0/16\n119.254.0.0/15\n120.0.0.0/12\n120.24.0.0/14\n120.30.0.0/16\n120.31.0.0/16\n120.32.0.0/13\n120.40.0.0/14\n120.44.0.0/15\n120.46.0.0/16\n120.47.0.0/16\n120.48.0.0/15\n120.52.0.0/16\n120.53.0.0/16\n120.54.0.0/15\n120.64.0.0/14\n120.68.0.0/14\n120.72.32.0/19\n120.72.128.0/17\n120.76.0.0/14\n120.80.0.0/13\n120.88.8.0/21\n120.90.0.0/15\n120.92.0.0/16\n120.94.0.0/16\n120.95.0.0/16\n120.128.0.0/14\n120.132.0.0/17\n120.132.128.0/17\n120.133.0.0/16\n120.134.0.0/15\n120.136.16.0/22\n120.136.20.0/22\n120.136.128.0/18\n120.137.0.0/17\n120.143.128.0/19\n120.192.0.0/10\n121.0.8.0/21\n121.0.16.0/20\n121.4.0.0/15\n121.8.0.0/13\n121.16.0.0/13\n121.24.0.0/14\n121.28.0.0/15\n121.30.0.0/16\n121.31.0.0/16\n121.32.0.0/14\n121.36.0.0/16\n121.37.0.0/16\n121.38.0.0/15\n121.40.0.0/14\n121.46.0.0/18\n121.46.76.0/22\n121.46.128.0/17\n121.47.0.0/16\n121.48.0.0/15\n121.50.8.0/21\n121.51.0.0/16\n121.52.160.0/19\n121.52.208.0/20\n121.52.224.0/19\n121.54.176.0/21\n121.54.188.0/22\n121.55.0.0/18\n121.56.0.0/15\n121.58.0.0/17\n121.58.136.0/21\n121.58.144.0/20\n121.58.160.0/21\n121.59.0.0/16\n121.60.0.0/14\n121.68.0.0/14\n121.76.0.0/15\n121.79.128.0/18\n121.89.0.0/16\n121.91.104.0/21\n121.100.128.0/17\n121.101.0.0/18\n121.101.208.0/20\n121.192.0.0/16\n121.193.0.0/16\n121.194.0.0/15\n121.196.0.0/14\n121.200.192.0/21\n121.201.0.0/16\n121.204.0.0/14\n121.224.0.0/12\n121.248.0.0/14\n121.255.0.0/16\n122.0.64.0/18\n122.0.128.0/17\n122.4.0.0/14\n122.8.0.0/17\n122.8.192.0/18\n122.9.0.0/16\n122.10.128.0/22\n122.10.132.0/23\n122.10.136.0/23\n122.10.164.0/22\n122.10.168.0/21\n122.10.176.0/20\n122.10.192.0/22\n122.10.200.0/21\n122.10.208.0/21\n122.10.216.0/22\n122.10.228.0/22\n122.10.232.0/21\n122.10.240.0/22\n122.11.0.0/17\n122.12.0.0/16\n122.13.0.0/16\n122.14.0.0/17\n122.14.128.0/18\n122.14.192.0/18\n122.48.0.0/16\n122.49.0.0/18\n122.51.0.0/16\n122.64.0.0/11\n122.96.0.0/15\n122.102.0.0/20\n122.102.64.0/20\n122.102.80.0/20\n122.112.0.0/18\n122.112.64.0/18\n122.112.128.0/17\n122.113.0.0/16\n122.114.0.0/16\n122.115.0.0/17\n122.115.128.0/19\n122.115.160.0/19\n122.115.192.0/19\n122.115.224.0/19\n122.119.0.0/16\n122.128.100.0/22\n122.128.120.0/21\n122.136.0.0/13\n122.144.128.0/17\n122.152.192.0/18\n122.156.0.0/14\n122.188.0.0/14\n122.192.0.0/14\n122.198.0.0/16\n122.200.40.0/22\n122.200.44.0/22\n122.200.64.0/18\n122.201.48.0/20\n122.204.0.0/14\n122.224.0.0/12\n122.240.0.0/13\n122.248.24.0/21\n122.248.48.0/20\n122.255.64.0/21\n123.0.128.0/18\n123.4.0.0/14\n123.8.0.0/13\n123.49.128.0/17\n123.50.160.0/19\n123.52.0.0/14\n123.56.0.0/15\n123.58.0.0/20\n123.58.16.0/20\n123.58.32.0/19\n123.58.64.0/19\n123.58.96.0/19\n123.58.128.0/18\n123.58.224.0/20\n123.58.240.0/20\n123.59.0.0/16\n123.60.0.0/16\n123.61.0.0/16\n123.62.0.0/16\n123.64.0.0/11\n123.96.0.0/15\n123.98.0.0/17\n123.99.128.0/17\n123.100.0.0/19\n123.101.0.0/16\n123.103.0.0/17\n123.108.128.0/20\n123.108.208.0/20\n123.112.0.0/12\n123.128.0.0/13\n123.136.80.0/20\n123.137.0.0/16\n123.138.0.0/15\n123.144.0.0/14\n123.148.0.0/16\n123.149.0.0/16\n123.150.0.0/15\n123.152.0.0/13\n123.160.0.0/14\n123.164.0.0/14\n123.168.0.0/14\n123.172.0.0/15\n123.174.0.0/15\n123.176.60.0/22\n123.176.80.0/20\n123.177.0.0/16\n123.178.0.0/15\n123.180.0.0/14\n123.184.0.0/14\n123.188.0.0/14\n123.196.0.0/15\n123.199.128.0/17\n123.206.0.0/15\n123.232.0.0/14\n123.242.0.0/17\n123.242.192.0/22\n123.242.196.0/22\n123.244.0.0/14\n123.249.0.0/16\n123.253.108.0/22\n123.253.240.0/22\n123.254.96.0/22\n123.254.100.0/22\n124.6.64.0/18\n124.14.0.0/15\n124.16.0.0/15\n124.20.0.0/16\n124.21.0.0/20\n124.21.16.0/20\n124.21.32.0/19\n124.21.64.0/18\n124.21.128.0/17\n124.22.0.0/15\n124.28.192.0/18\n124.29.0.0/17\n124.31.0.0/16\n124.40.112.0/20\n124.40.128.0/18\n124.40.192.0/19\n124.40.240.0/22\n124.42.0.0/17\n124.42.128.0/17\n124.47.0.0/18\n124.64.0.0/15\n124.66.0.0/17\n124.67.0.0/16\n124.68.0.0/15\n124.70.0.0/15\n124.72.0.0/16\n124.73.0.0/16\n124.74.0.0/15\n124.76.0.0/14\n124.88.0.0/16\n124.89.0.0/17\n124.89.128.0/17\n124.90.0.0/15\n124.92.0.0/14\n124.108.8.0/21\n124.108.40.0/21\n124.109.96.0/21\n124.112.0.0/15\n124.114.0.0/15\n124.116.0.0/16\n124.117.0.0/16\n124.118.0.0/15\n124.126.0.0/15\n124.128.0.0/13\n124.147.128.0/17\n124.150.137.0/24\n124.151.0.0/16\n124.152.0.0/16\n124.160.0.0/16\n124.161.0.0/16\n124.162.0.0/16\n124.163.0.0/16\n124.164.0.0/14\n124.172.0.0/15\n124.174.0.0/15\n124.192.0.0/15\n124.196.0.0/16\n124.200.0.0/13\n124.220.0.0/14\n124.224.0.0/16\n124.225.0.0/16\n124.226.0.0/15\n124.228.0.0/14\n124.232.0.0/15\n124.234.0.0/15\n124.236.0.0/14\n124.240.0.0/17\n124.240.128.0/18\n124.242.0.0/16\n124.243.192.0/18\n124.248.0.0/17\n124.249.0.0/16\n124.250.0.0/15\n124.254.0.0/18\n125.31.192.0/18\n125.32.0.0/16\n125.33.0.0/16\n125.34.0.0/16\n125.35.0.0/17\n125.35.128.0/17\n125.36.0.0/14\n125.40.0.0/13\n125.58.128.0/17\n125.61.128.0/17\n125.62.0.0/18\n125.64.0.0/13\n125.72.0.0/16\n125.73.0.0/16\n125.74.0.0/15\n125.76.0.0/17\n125.76.128.0/17\n125.77.0.0/16\n125.78.0.0/15\n125.80.0.0/13\n125.88.0.0/13\n125.96.0.0/15\n125.98.0.0/16\n125.104.0.0/13\n125.112.0.0/12\n125.169.0.0/16\n125.171.0.0/16\n125.208.0.0/18\n125.210.0.0/16\n125.211.0.0/16\n125.213.0.0/17\n125.214.96.0/19\n125.215.0.0/18\n125.216.0.0/15\n125.218.0.0/16\n125.219.0.0/16\n125.220.0.0/15\n125.222.0.0/15\n125.254.128.0/18\n125.254.192.0/18\n128.108.0.0/16\n129.28.0.0/16\n129.204.0.0/16\n129.211.0.0/16\n132.232.0.0/16\n134.175.0.0/16\n137.59.59.0/24\n137.59.88.0/22\n139.5.56.0/22\n139.5.60.0/22\n139.5.80.0/22\n139.5.92.0/22\n139.5.108.0/22\n139.5.128.0/22\n139.5.160.0/22\n139.5.192.0/22\n139.5.204.0/22\n139.5.212.0/22\n139.5.244.0/22\n139.9.0.0/16\n139.129.0.0/16\n139.148.0.0/16\n139.155.0.0/16\n139.159.0.0/16\n139.170.0.0/16\n139.176.0.0/16\n139.183.0.0/16\n139.186.0.0/16\n139.189.0.0/16\n139.196.0.0/14\n139.200.0.0/13\n139.208.0.0/13\n139.217.0.0/16\n139.219.0.0/16\n139.220.0.0/15\n139.224.0.0/16\n139.226.0.0/15\n140.75.0.0/16\n140.143.0.0/16\n140.179.0.0/16\n140.205.0.0/16\n140.206.0.0/15\n140.210.0.0/17\n140.210.128.0/17\n140.224.0.0/16\n140.237.0.0/16\n140.240.0.0/16\n140.243.0.0/16\n140.246.0.0/16\n140.249.0.0/16\n140.250.0.0/16\n140.255.0.0/16\n142.70.0.0/16\n142.86.0.0/16\n143.64.0.0/16\n144.0.0.0/16\n144.7.0.0/16\n144.12.0.0/16\n144.48.64.0/22\n144.48.88.0/22\n144.48.156.0/22\n144.48.180.0/22\n144.48.184.0/22\n144.48.204.0/22\n144.48.208.0/22\n144.48.212.0/22\n144.48.220.0/22\n144.48.252.0/22\n144.52.0.0/16\n144.123.0.0/16\n144.255.0.0/16\n146.56.192.0/18\n146.196.56.0/22\n146.196.68.0/22\n146.196.72.0/22\n146.196.92.0/22\n146.196.112.0/22\n146.196.116.0/22\n146.196.124.0/22\n148.70.0.0/16\n149.41.0.0/16\n150.0.0.0/16\n150.115.0.0/16\n150.121.0.0/16\n150.122.0.0/16\n150.129.136.0/22\n150.129.192.0/22\n150.129.216.0/22\n150.129.252.0/22\n150.138.0.0/15\n150.158.0.0/16\n150.223.0.0/16\n150.242.0.0/22\n150.242.4.0/22\n150.242.8.0/22\n150.242.28.0/22\n150.242.44.0/22\n150.242.48.0/22\n150.242.52.0/22\n150.242.56.0/22\n150.242.76.0/22\n150.242.80.0/22\n150.242.92.0/22\n150.242.96.0/22\n150.242.112.0/22\n150.242.116.0/22\n150.242.120.0/22\n150.242.152.0/22\n150.242.156.0/22\n150.242.160.0/22\n150.242.164.0/22\n150.242.168.0/22\n150.242.184.0/22\n150.242.188.0/22\n150.242.192.0/22\n150.242.212.0/22\n150.242.224.0/22\n150.242.232.0/22\n150.242.236.0/22\n150.242.240.0/22\n150.242.244.0/22\n150.242.248.0/22\n150.248.0.0/16\n150.255.0.0/16\n152.104.128.0/17\n152.136.0.0/16\n153.0.0.0/16\n153.3.0.0/16\n153.34.0.0/15\n153.36.0.0/15\n153.99.0.0/16\n153.101.0.0/16\n153.118.0.0/15\n154.8.128.0/17\n157.0.0.0/16\n157.18.0.0/16\n157.61.0.0/16\n157.119.8.0/22\n157.119.12.0/22\n157.119.16.0/22\n157.119.28.0/22\n157.119.132.0/22\n157.119.136.0/22\n157.119.140.0/22\n157.119.144.0/22\n157.119.148.0/22\n157.119.152.0/22\n157.119.156.0/22\n157.119.160.0/22\n157.119.164.0/22\n157.119.172.0/22\n157.119.192.0/22\n157.119.196.0/22\n157.119.240.0/22\n157.119.252.0/22\n157.122.0.0/16\n157.148.0.0/16\n157.156.0.0/16\n157.255.0.0/16\n158.60.0.0/16\n158.79.0.0/16\n159.27.0.0/16\n159.75.0.0/16\n159.226.0.0/16\n160.19.208.0/22\n160.19.212.0/22\n160.19.216.0/22\n160.20.48.0/22\n160.202.60.0/22\n160.202.148.0/22\n160.202.152.0/22\n160.202.168.0/22\n160.202.212.0/22\n160.202.216.0/22\n160.202.220.0/22\n160.202.224.0/22\n160.202.228.0/22\n160.202.232.0/22\n160.202.236.0/22\n160.202.240.0/22\n160.202.244.0/22\n160.202.248.0/22\n160.202.252.0/22\n160.238.64.0/22\n161.120.0.0/16\n161.189.0.0/16\n161.207.0.0/16\n162.14.0.0/16\n162.105.0.0/16\n163.0.0.0/16\n163.47.4.0/22\n163.53.0.0/22\n163.53.4.0/22\n163.53.8.0/22\n163.53.12.0/22\n163.53.36.0/22\n163.53.40.0/22\n163.53.44.0/22\n163.53.48.0/22\n163.53.52.0/22\n163.53.56.0/22\n163.53.60.0/22\n163.53.64.0/22\n163.53.88.0/22\n163.53.92.0/22\n163.53.96.0/22\n163.53.100.0/22\n163.53.104.0/22\n163.53.108.0/22\n163.53.112.0/22\n163.53.116.0/22\n163.53.120.0/22\n163.53.124.0/22\n163.53.128.0/22\n163.53.132.0/22\n163.53.136.0/22\n163.53.160.0/22\n163.53.164.0/22\n163.53.168.0/22\n163.53.172.0/22\n163.53.188.0/22\n163.53.220.0/22\n163.53.240.0/22\n163.125.0.0/16\n163.142.0.0/16\n163.177.0.0/16\n163.179.0.0/16\n163.204.0.0/16\n163.228.0.0/16\n164.52.0.0/17\n166.111.0.0/16\n167.139.0.0/16\n167.189.0.0/16\n167.220.244.0/22\n168.160.0.0/16\n170.179.0.0/16\n171.8.0.0/13\n171.34.0.0/15\n171.36.0.0/14\n171.40.0.0/13\n171.80.0.0/14\n171.84.0.0/14\n171.88.0.0/13\n171.104.0.0/13\n171.112.0.0/14\n171.116.0.0/14\n171.120.0.0/13\n171.208.0.0/12\n172.81.192.0/18\n175.0.0.0/12\n175.16.0.0/13\n175.24.0.0/16\n175.25.0.0/16\n175.26.0.0/16\n175.27.0.0/16\n175.30.0.0/15\n175.42.0.0/15\n175.44.0.0/16\n175.46.0.0/15\n175.48.0.0/12\n175.64.0.0/11\n175.102.0.0/16\n175.106.128.0/17\n175.111.144.0/22\n175.111.148.0/22\n175.111.152.0/22\n175.111.156.0/22\n175.111.160.0/22\n175.111.164.0/22\n175.111.168.0/22\n175.111.172.0/22\n175.111.184.0/22\n175.146.0.0/15\n175.148.0.0/14\n175.152.0.0/14\n175.158.96.0/22\n175.160.0.0/12\n175.176.156.0/22\n175.176.176.0/22\n175.176.188.0/22\n175.178.0.0/16\n175.184.128.0/18\n175.185.0.0/16\n175.186.0.0/15\n175.188.0.0/14\n180.76.0.0/16\n180.77.0.0/16\n180.78.0.0/15\n180.84.0.0/15\n180.86.0.0/16\n180.88.0.0/14\n180.94.56.0/21\n180.94.96.0/20\n180.94.120.0/22\n180.94.124.0/22\n180.95.128.0/17\n180.96.0.0/11\n180.129.128.0/17\n180.130.0.0/16\n180.136.0.0/13\n180.148.16.0/21\n180.148.152.0/21\n180.148.216.0/21\n180.148.224.0/19\n180.149.128.0/19\n180.149.236.0/22\n180.150.160.0/19\n180.152.0.0/13\n180.160.0.0/12\n180.178.112.0/22\n180.178.116.0/22\n180.178.192.0/18\n180.184.0.0/15\n180.186.0.0/16\n180.187.0.0/16\n180.188.0.0/17\n180.189.148.0/22\n180.200.252.0/22\n180.201.0.0/16\n180.202.0.0/15\n180.208.0.0/15\n180.210.212.0/22\n180.210.224.0/19\n180.212.0.0/15\n180.222.224.0/19\n180.223.0.0/16\n180.233.0.0/18\n180.233.64.0/19\n180.233.144.0/22\n180.235.64.0/19\n180.235.112.0/22\n182.16.144.0/22\n182.16.148.0/22\n182.16.192.0/19\n182.18.0.0/17\n182.23.184.0/21\n182.23.200.0/21\n182.32.0.0/12\n182.48.96.0/19\n182.49.0.0/16\n182.50.0.0/20\n182.50.112.0/20\n182.51.0.0/16\n182.54.0.0/17\n182.54.244.0/22\n182.61.0.0/16\n182.80.0.0/14\n182.84.0.0/14\n182.88.0.0/14\n182.92.0.0/16\n182.96.0.0/12\n182.112.0.0/12\n182.128.0.0/12\n182.144.0.0/13\n182.157.0.0/16\n182.160.64.0/19\n182.174.0.0/15\n182.200.0.0/13\n182.236.128.0/17\n182.237.24.0/22\n182.237.28.0/22\n182.238.0.0/16\n182.239.0.0/19\n182.240.0.0/13\n182.254.0.0/16\n182.255.60.0/22\n183.0.0.0/10\n183.64.0.0/13\n183.78.160.0/22\n183.78.164.0/22\n183.78.180.0/22\n183.81.172.0/22\n183.81.180.0/22\n183.84.0.0/15\n183.91.128.0/22\n183.91.136.0/21\n183.91.144.0/20\n183.92.0.0/14\n183.128.0.0/11\n183.160.0.0/13\n183.168.0.0/15\n183.170.0.0/16\n183.172.0.0/14\n183.182.0.0/19\n183.184.0.0/13\n183.192.0.0/10\n185.203.36.0/22\n188.131.128.0/17\n192.51.188.0/24\n192.55.46.0/24\n192.55.68.0/22\n192.102.204.0/23\n192.124.154.0/24\n192.140.128.0/22\n192.140.132.0/22\n192.140.136.0/22\n192.140.156.0/22\n192.140.160.0/22\n192.140.164.0/22\n192.140.168.0/22\n192.140.172.0/22\n192.140.176.0/22\n192.140.180.0/22\n192.140.184.0/22\n192.140.188.0/22\n192.140.192.0/22\n192.140.196.0/22\n192.140.200.0/22\n192.140.204.0/22\n192.140.208.0/22\n192.140.212.0/22\n192.144.128.0/17\n192.197.113.0/24\n193.112.0.0/16\n198.175.100.0/22\n199.212.57.0/24\n202.0.100.0/23\n202.0.122.0/23\n202.0.176.0/22\n202.3.128.0/23\n202.4.128.0/19\n202.4.252.0/22\n202.5.208.0/22\n202.5.212.0/22\n202.5.216.0/22\n202.6.6.0/23\n202.6.66.0/23\n202.6.72.0/23\n202.6.87.0/24\n202.6.88.0/23\n202.6.92.0/23\n202.6.103.0/24\n202.6.108.0/24\n202.6.110.0/23\n202.6.114.0/24\n202.6.176.0/20\n202.8.0.0/24\n202.8.2.0/23\n202.8.4.0/23\n202.8.12.0/24\n202.8.24.0/24\n202.8.77.0/24\n202.8.120.0/22\n202.8.128.0/19\n202.8.192.0/20\n202.9.32.0/24\n202.9.34.0/23\n202.9.48.0/23\n202.9.51.0/24\n202.9.52.0/23\n202.9.54.0/24\n202.9.57.0/24\n202.9.58.0/23\n202.10.64.0/20\n202.10.112.0/22\n202.10.116.0/22\n202.10.120.0/22\n202.10.124.0/22\n202.12.1.0/24\n202.12.2.0/24\n202.12.17.0/24\n202.12.18.0/24\n202.12.19.0/24\n202.12.72.0/24\n202.12.84.0/23\n202.12.96.0/24\n202.12.98.0/23\n202.12.106.0/24\n202.12.111.0/24\n202.12.116.0/24\n202.14.64.0/23\n202.14.69.0/24\n202.14.73.0/24\n202.14.74.0/23\n202.14.76.0/24\n202.14.78.0/23\n202.14.88.0/24\n202.14.97.0/24\n202.14.104.0/23\n202.14.108.0/23\n202.14.111.0/24\n202.14.114.0/23\n202.14.118.0/23\n202.14.124.0/23\n202.14.127.0/24\n202.14.129.0/24\n202.14.135.0/24\n202.14.136.0/24\n202.14.149.0/24\n202.14.151.0/24\n202.14.157.0/24\n202.14.158.0/23\n202.14.169.0/24\n202.14.170.0/23\n202.14.172.0/22\n202.14.176.0/24\n202.14.184.0/23\n202.14.208.0/23\n202.14.213.0/24\n202.14.219.0/24\n202.14.220.0/24\n202.14.222.0/23\n202.14.225.0/24\n202.14.226.0/23\n202.14.231.0/24\n202.14.235.0/24\n202.14.236.0/23\n202.14.238.0/24\n202.14.239.0/24\n202.14.246.0/24\n202.14.251.0/24\n202.20.66.0/24\n202.20.79.0/24\n202.20.87.0/24\n202.20.88.0/23\n202.20.90.0/24\n202.20.94.0/23\n202.20.114.0/24\n202.20.117.0/24\n202.20.120.0/24\n202.20.125.0/24\n202.20.126.0/24\n202.20.127.0/24\n202.21.48.0/22\n202.21.52.0/22\n202.21.56.0/22\n202.21.60.0/22\n202.21.131.0/24\n202.21.132.0/24\n202.21.141.0/24\n202.21.142.0/24\n202.21.147.0/24\n202.21.148.0/24\n202.21.150.0/23\n202.21.152.0/23\n202.21.154.0/24\n202.21.156.0/24\n202.22.248.0/22\n202.22.252.0/22\n202.27.12.0/24\n202.27.14.0/24\n202.27.136.0/23\n202.36.226.0/24\n202.38.0.0/23\n202.38.2.0/23\n202.38.8.0/21\n202.38.48.0/20\n202.38.64.0/19\n202.38.96.0/19\n202.38.128.0/23\n202.38.130.0/23\n202.38.132.0/23\n202.38.134.0/24\n202.38.135.0/24\n202.38.136.0/23\n202.38.138.0/24\n202.38.140.0/23\n202.38.142.0/23\n202.38.146.0/23\n202.38.149.0/24\n202.38.150.0/23\n202.38.152.0/23\n202.38.154.0/23\n202.38.156.0/24\n202.38.158.0/23\n202.38.160.0/23\n202.38.164.0/22\n202.38.168.0/23\n202.38.170.0/24\n202.38.171.0/24\n202.38.176.0/23\n202.38.184.0/21\n202.38.192.0/18\n202.40.4.0/23\n202.40.7.0/24\n202.40.15.0/24\n202.40.135.0/24\n202.40.136.0/24\n202.40.140.0/24\n202.40.143.0/24\n202.40.144.0/23\n202.40.150.0/24\n202.40.155.0/24\n202.40.156.0/24\n202.40.158.0/23\n202.40.162.0/24\n202.41.8.0/23\n202.41.11.0/24\n202.41.12.0/23\n202.41.128.0/24\n202.41.130.0/23\n202.41.152.0/21\n202.41.192.0/24\n202.41.196.0/22\n202.41.200.0/22\n202.41.240.0/20\n202.43.76.0/22\n202.43.144.0/20\n202.44.16.0/20\n202.44.48.0/22\n202.44.67.0/24\n202.44.74.0/24\n202.44.97.0/24\n202.44.129.0/24\n202.44.132.0/23\n202.44.146.0/23\n202.45.0.0/23\n202.45.2.0/24\n202.45.15.0/24\n202.45.16.0/20\n202.46.16.0/23\n202.46.18.0/24\n202.46.20.0/23\n202.46.32.0/19\n202.46.128.0/24\n202.46.224.0/20\n202.47.82.0/23\n202.47.96.0/22\n202.47.100.0/22\n202.47.104.0/22\n202.47.108.0/22\n202.47.126.0/24\n202.47.128.0/24\n202.47.130.0/23\n202.52.33.0/24\n202.52.34.0/24\n202.52.47.0/24\n202.52.143.0/24\n202.53.140.0/24\n202.53.143.0/24\n202.57.192.0/22\n202.57.196.0/22\n202.57.200.0/22\n202.57.204.0/22\n202.57.212.0/22\n202.57.216.0/22\n202.57.240.0/20\n202.58.0.0/24\n202.58.104.0/22\n202.58.112.0/22\n202.59.0.0/24\n202.59.1.0/24\n202.59.212.0/22\n202.59.236.0/24\n202.59.240.0/24\n202.60.48.0/21\n202.60.96.0/21\n202.60.112.0/20\n202.60.132.0/22\n202.60.136.0/21\n202.60.144.0/20\n202.61.68.0/22\n202.61.76.0/22\n202.61.88.0/22\n202.61.123.0/24\n202.61.127.0/24\n202.62.112.0/22\n202.62.248.0/22\n202.62.252.0/24\n202.62.255.0/24\n202.63.80.0/24\n202.63.81.0/24\n202.63.82.0/23\n202.63.84.0/22\n202.63.88.0/21\n202.63.160.0/19\n202.63.248.0/22\n202.63.253.0/24\n202.65.0.0/21\n202.65.8.0/23\n202.65.96.0/22\n202.65.100.0/22\n202.65.104.0/22\n202.65.108.0/22\n202.66.168.0/22\n202.67.0.0/22\n202.69.4.0/22\n202.69.16.0/20\n202.70.0.0/19\n202.70.96.0/20\n202.70.192.0/20\n202.71.32.0/22\n202.71.36.0/22\n202.71.40.0/22\n202.71.44.0/22\n202.72.40.0/21\n202.72.80.0/20\n202.72.112.0/22\n202.72.116.0/22\n202.72.120.0/22\n202.72.124.0/22\n202.73.128.0/22\n202.73.240.0/22\n202.73.244.0/22\n202.73.248.0/22\n202.73.252.0/22\n202.74.8.0/21\n202.74.36.0/24\n202.74.42.0/24\n202.74.52.0/24\n202.74.80.0/20\n202.74.254.0/23\n202.75.208.0/20\n202.75.252.0/22\n202.76.252.0/22\n202.77.80.0/21\n202.77.92.0/22\n202.78.8.0/21\n202.79.224.0/21\n202.79.248.0/22\n202.80.192.0/21\n202.80.200.0/21\n202.81.0.0/22\n202.81.176.0/22\n202.81.180.0/22\n202.81.184.0/22\n202.81.188.0/22\n202.83.252.0/22\n202.84.0.0/22\n202.84.4.0/22\n202.84.8.0/21\n202.84.16.0/23\n202.84.22.0/24\n202.84.24.0/21\n202.85.208.0/20\n202.86.249.0/24\n202.86.252.0/22\n202.87.80.0/20\n202.88.32.0/22\n202.89.8.0/21\n202.89.96.0/22\n202.89.108.0/22\n202.89.119.0/24\n202.89.232.0/21\n202.90.0.0/22\n202.90.16.0/22\n202.90.20.0/22\n202.90.24.0/22\n202.90.28.0/22\n202.90.37.0/24\n202.90.96.0/22\n202.90.100.0/22\n202.90.104.0/22\n202.90.108.0/22\n202.90.112.0/20\n202.90.193.0/24\n202.90.196.0/24\n202.90.205.0/24\n202.90.224.0/20\n202.91.0.0/22\n202.91.36.0/22\n202.91.96.0/20\n202.91.128.0/22\n202.91.176.0/20\n202.91.224.0/19\n202.92.0.0/22\n202.92.8.0/21\n202.92.48.0/20\n202.92.252.0/22\n202.93.0.0/22\n202.93.252.0/22\n202.94.74.0/24\n202.94.81.0/24\n202.94.92.0/22\n202.95.240.0/21\n202.95.252.0/22\n202.96.0.0/18\n202.96.64.0/21\n202.96.72.0/21\n202.96.80.0/20\n202.96.96.0/21\n202.96.104.0/21\n202.96.112.0/20\n202.96.128.0/21\n202.96.136.0/21\n202.96.144.0/20\n202.96.160.0/21\n202.96.168.0/21\n202.96.176.0/20\n202.96.192.0/21\n202.96.200.0/21\n202.96.208.0/20\n202.96.224.0/21\n202.96.232.0/21\n202.96.240.0/20\n202.97.0.0/21\n202.97.8.0/21\n202.97.16.0/20\n202.97.32.0/19\n202.97.64.0/19\n202.97.96.0/20\n202.97.112.0/20\n202.97.128.0/18\n202.97.192.0/19\n202.97.224.0/21\n202.97.232.0/21\n202.97.240.0/20\n202.98.0.0/21\n202.98.8.0/21\n202.98.16.0/20\n202.98.32.0/21\n202.98.40.0/21\n202.98.48.0/20\n202.98.64.0/19\n202.98.96.0/21\n202.98.104.0/21\n202.98.112.0/20\n202.98.128.0/19\n202.98.160.0/21\n202.98.168.0/21\n202.98.176.0/20\n202.98.192.0/21\n202.98.200.0/21\n202.98.208.0/20\n202.98.224.0/21\n202.98.232.0/21\n202.98.240.0/20\n202.99.0.0/18\n202.99.64.0/19\n202.99.96.0/21\n202.99.104.0/21\n202.99.112.0/20\n202.99.128.0/19\n202.99.160.0/21\n202.99.168.0/21\n202.99.176.0/20\n202.99.192.0/21\n202.99.200.0/21\n202.99.208.0/20\n202.99.224.0/21\n202.99.232.0/21\n202.99.240.0/20\n202.100.0.0/21\n202.100.8.0/21\n202.100.16.0/20\n202.100.32.0/19\n202.100.64.0/21\n202.100.72.0/21\n202.100.80.0/20\n202.100.96.0/21\n202.100.104.0/21\n202.100.112.0/20\n202.100.128.0/21\n202.100.136.0/21\n202.100.144.0/20\n202.100.160.0/21\n202.100.168.0/21\n202.100.176.0/20\n202.100.192.0/21\n202.100.200.0/21\n202.100.208.0/20\n202.100.224.0/19\n202.101.0.0/18\n202.101.64.0/19\n202.101.96.0/19\n202.101.128.0/18\n202.101.192.0/19\n202.101.224.0/21\n202.101.232.0/21\n202.101.240.0/20\n202.102.0.0/19\n202.102.32.0/19\n202.102.64.0/18\n202.102.128.0/21\n202.102.136.0/21\n202.102.144.0/20\n202.102.160.0/19\n202.102.192.0/21\n202.102.200.0/21\n202.102.208.0/20\n202.102.224.0/21\n202.102.232.0/21\n202.102.240.0/20\n202.103.0.0/21\n202.103.8.0/21\n202.103.16.0/20\n202.103.32.0/19\n202.103.64.0/19\n202.103.96.0/21\n202.103.104.0/21\n202.103.112.0/20\n202.103.128.0/18\n202.103.192.0/19\n202.103.224.0/21\n202.103.232.0/21\n202.103.240.0/20\n202.104.0.0/15\n202.106.0.0/16\n202.107.0.0/17\n202.107.128.0/17\n202.108.0.0/16\n202.109.0.0/16\n202.110.0.0/18\n202.110.64.0/18\n202.110.128.0/18\n202.110.192.0/18\n202.111.0.0/17\n202.111.128.0/19\n202.111.160.0/19\n202.111.192.0/18\n202.112.0.0/16\n202.113.0.0/20\n202.113.16.0/20\n202.113.32.0/19\n202.113.64.0/18\n202.113.128.0/18\n202.113.192.0/19\n202.113.224.0/20\n202.113.240.0/20\n202.114.0.0/19\n202.114.32.0/19\n202.114.64.0/18\n202.114.128.0/17\n202.115.0.0/19\n202.115.32.0/19\n202.115.64.0/18\n202.115.128.0/17\n202.116.0.0/19\n202.116.32.0/20\n202.116.48.0/20\n202.116.64.0/19\n202.116.96.0/19\n202.116.128.0/17\n202.117.0.0/18\n202.117.64.0/18\n202.117.128.0/17\n202.118.0.0/19\n202.118.32.0/19\n202.118.64.0/18\n202.118.128.0/17\n202.119.0.0/19\n202.119.32.0/19\n202.119.64.0/20\n202.119.80.0/20\n202.119.96.0/19\n202.119.128.0/17\n202.120.0.0/18\n202.120.64.0/18\n202.120.128.0/17\n202.121.0.0/16\n202.122.0.0/21\n202.122.32.0/21\n202.122.64.0/19\n202.122.112.0/21\n202.122.120.0/21\n202.122.128.0/24\n202.122.132.0/24\n202.123.96.0/20\n202.123.116.0/22\n202.123.120.0/22\n202.124.16.0/21\n202.124.24.0/22\n202.125.107.0/24\n202.125.109.0/24\n202.125.112.0/20\n202.125.176.0/20\n202.127.0.0/23\n202.127.2.0/24\n202.127.3.0/24\n202.127.4.0/24\n202.127.5.0/24\n202.127.6.0/23\n202.127.12.0/22\n202.127.16.0/20\n202.127.40.0/21\n202.127.48.0/20\n202.127.112.0/20\n202.127.128.0/20\n202.127.144.0/20\n202.127.160.0/21\n202.127.192.0/23\n202.127.194.0/23\n202.127.196.0/22\n202.127.200.0/21\n202.127.208.0/24\n202.127.209.0/24\n202.127.212.0/22\n202.127.216.0/21\n202.127.224.0/19\n202.129.208.0/24\n202.130.0.0/19\n202.130.39.0/24\n202.130.224.0/19\n202.131.16.0/21\n202.131.48.0/20\n202.131.208.0/20\n202.133.32.0/20\n202.134.58.0/24\n202.134.128.0/20\n202.134.208.0/22\n202.134.212.0/22\n202.134.216.0/22\n202.134.220.0/22\n202.136.48.0/20\n202.136.208.0/20\n202.136.224.0/20\n202.136.248.0/22\n202.137.231.0/24\n202.140.140.0/22\n202.140.144.0/22\n202.140.148.0/22\n202.140.152.0/22\n202.140.156.0/22\n202.141.160.0/19\n202.142.16.0/20\n202.143.4.0/22\n202.143.16.0/20\n202.143.32.0/20\n202.143.56.0/21\n202.143.100.0/22\n202.143.104.0/22\n202.144.196.0/22\n202.146.160.0/20\n202.146.186.0/24\n202.146.188.0/22\n202.146.196.0/22\n202.146.200.0/21\n202.147.144.0/20\n202.148.32.0/20\n202.148.64.0/19\n202.148.96.0/19\n202.149.32.0/19\n202.149.160.0/19\n202.149.224.0/19\n202.150.16.0/20\n202.150.32.0/20\n202.150.56.0/22\n202.150.192.0/20\n202.150.224.0/19\n202.151.0.0/22\n202.151.33.0/24\n202.151.128.0/19\n202.152.176.0/20\n202.153.0.0/22\n202.153.7.0/24\n202.153.48.0/20\n202.157.192.0/19\n202.158.160.0/19\n202.158.242.0/24\n202.160.140.0/22\n202.160.156.0/22\n202.160.176.0/20\n202.162.67.0/24\n202.162.75.0/24\n202.164.0.0/20\n202.164.96.0/19\n202.165.176.0/20\n202.165.208.0/20\n202.165.239.0/24\n202.165.240.0/23\n202.165.243.0/24\n202.165.245.0/24\n202.165.251.0/24\n202.165.252.0/22\n202.166.224.0/19\n202.168.80.0/22\n202.168.128.0/22\n202.168.132.0/22\n202.168.136.0/22\n202.168.140.0/22\n202.168.160.0/20\n202.168.176.0/20\n202.170.128.0/19\n202.170.216.0/21\n202.170.224.0/19\n202.171.216.0/21\n202.171.232.0/24\n202.171.235.0/24\n202.172.0.0/22\n202.172.7.0/24\n202.173.0.0/22\n202.173.6.0/24\n202.173.8.0/21\n202.173.112.0/22\n202.173.224.0/19\n202.174.64.0/20\n202.174.124.0/22\n202.176.224.0/19\n202.179.160.0/22\n202.179.164.0/22\n202.179.168.0/22\n202.179.172.0/22\n202.179.240.0/20\n202.180.128.0/19\n202.180.208.0/21\n202.181.8.0/22\n202.181.28.0/22\n202.181.112.0/20\n202.182.32.0/20\n202.182.192.0/19\n202.189.0.0/18\n202.189.80.0/20\n202.189.184.0/21\n202.191.0.0/24\n202.191.68.0/22\n202.191.72.0/21\n202.191.80.0/20\n202.192.0.0/13\n202.200.0.0/14\n202.204.0.0/14\n203.0.4.0/22\n203.0.10.0/23\n203.0.18.0/24\n203.0.24.0/24\n203.0.42.0/23\n203.0.45.0/24\n203.0.46.0/23\n203.0.81.0/24\n203.0.82.0/23\n203.0.90.0/23\n203.0.96.0/23\n203.0.104.0/21\n203.0.114.0/23\n203.0.122.0/24\n203.0.128.0/24\n203.0.130.0/23\n203.0.132.0/22\n203.0.137.0/24\n203.0.142.0/24\n203.0.144.0/24\n203.0.146.0/24\n203.0.148.0/24\n203.0.150.0/23\n203.0.152.0/24\n203.0.177.0/24\n203.0.224.0/24\n203.1.4.0/22\n203.1.18.0/24\n203.1.26.0/23\n203.1.65.0/24\n203.1.66.0/23\n203.1.70.0/23\n203.1.76.0/23\n203.1.90.0/24\n203.1.97.0/24\n203.1.98.0/23\n203.1.100.0/22\n203.1.108.0/24\n203.1.253.0/24\n203.1.254.0/24\n203.2.64.0/21\n203.2.73.0/24\n203.2.112.0/21\n203.2.126.0/23\n203.2.140.0/24\n203.2.150.0/24\n203.2.152.0/22\n203.2.156.0/23\n203.2.160.0/21\n203.2.180.0/23\n203.2.196.0/23\n203.2.209.0/24\n203.2.214.0/23\n203.2.226.0/23\n203.2.229.0/24\n203.2.236.0/23\n203.3.68.0/24\n203.3.72.0/23\n203.3.75.0/24\n203.3.80.0/21\n203.3.96.0/22\n203.3.105.0/24\n203.3.112.0/21\n203.3.120.0/24\n203.3.123.0/24\n203.3.135.0/24\n203.3.139.0/24\n203.3.143.0/24\n203.4.132.0/23\n203.4.134.0/24\n203.4.151.0/24\n203.4.152.0/22\n203.4.174.0/23\n203.4.180.0/24\n203.4.186.0/24\n203.4.205.0/24\n203.4.208.0/22\n203.4.227.0/24\n203.4.230.0/23\n203.5.4.0/23\n203.5.7.0/24\n203.5.8.0/23\n203.5.11.0/24\n203.5.21.0/24\n203.5.22.0/24\n203.5.44.0/24\n203.5.46.0/23\n203.5.52.0/22\n203.5.56.0/23\n203.5.60.0/23\n203.5.114.0/23\n203.5.118.0/24\n203.5.120.0/24\n203.5.172.0/24\n203.5.180.0/23\n203.5.182.0/24\n203.5.185.0/24\n203.5.186.0/24\n203.5.188.0/23\n203.5.190.0/24\n203.5.195.0/24\n203.5.214.0/23\n203.5.218.0/23\n203.6.131.0/24\n203.6.136.0/24\n203.6.138.0/23\n203.6.142.0/24\n203.6.150.0/23\n203.6.157.0/24\n203.6.159.0/24\n203.6.224.0/20\n203.6.248.0/23\n203.7.129.0/24\n203.7.138.0/23\n203.7.147.0/24\n203.7.150.0/23\n203.7.158.0/24\n203.7.192.0/23\n203.7.200.0/24\n203.8.0.0/24\n203.8.8.0/24\n203.8.23.0/24\n203.8.70.0/24\n203.8.82.0/24\n203.8.86.0/23\n203.8.91.0/24\n203.8.110.0/23\n203.8.115.0/24\n203.8.166.0/23\n203.8.169.0/24\n203.8.173.0/24\n203.8.184.0/24\n203.8.186.0/23\n203.8.190.0/23\n203.8.192.0/24\n203.8.197.0/24\n203.8.198.0/23\n203.8.203.0/24\n203.8.209.0/24\n203.8.210.0/23\n203.8.212.0/22\n203.8.217.0/24\n203.8.220.0/24\n203.9.32.0/24\n203.9.36.0/23\n203.9.57.0/24\n203.9.63.0/24\n203.9.65.0/24\n203.9.70.0/23\n203.9.72.0/24\n203.9.75.0/24\n203.9.76.0/23\n203.9.96.0/22\n203.9.100.0/23\n203.9.108.0/24\n203.9.158.0/24\n203.10.34.0/24\n203.10.56.0/24\n203.10.74.0/23\n203.10.84.0/22\n203.10.88.0/24\n203.10.95.0/24\n203.10.125.0/24\n203.11.70.0/24\n203.11.76.0/22\n203.11.82.0/24\n203.11.84.0/22\n203.11.100.0/22\n203.11.109.0/24\n203.11.117.0/24\n203.11.122.0/24\n203.11.126.0/24\n203.11.136.0/22\n203.11.141.0/24\n203.11.142.0/23\n203.11.180.0/22\n203.11.208.0/22\n203.12.16.0/24\n203.12.19.0/24\n203.12.24.0/24\n203.12.57.0/24\n203.12.65.0/24\n203.12.66.0/24\n203.12.70.0/23\n203.12.87.0/24\n203.12.100.0/23\n203.12.103.0/24\n203.12.114.0/24\n203.12.118.0/24\n203.12.130.0/24\n203.12.137.0/24\n203.12.196.0/22\n203.12.211.0/24\n203.12.219.0/24\n203.12.226.0/24\n203.12.240.0/22\n203.13.18.0/24\n203.13.24.0/24\n203.13.44.0/23\n203.13.88.0/23\n203.13.92.0/22\n203.13.173.0/24\n203.13.224.0/23\n203.13.227.0/24\n203.13.233.0/24\n203.14.24.0/22\n203.14.33.0/24\n203.14.56.0/24\n203.14.61.0/24\n203.14.62.0/24\n203.14.104.0/24\n203.14.114.0/23\n203.14.118.0/24\n203.14.162.0/24\n203.14.192.0/24\n203.14.194.0/23\n203.14.214.0/24\n203.14.231.0/24\n203.14.246.0/24\n203.15.0.0/20\n203.15.20.0/23\n203.15.22.0/24\n203.15.87.0/24\n203.15.88.0/23\n203.15.105.0/24\n203.15.112.0/21\n203.15.130.0/23\n203.15.149.0/24\n203.15.151.0/24\n203.15.156.0/22\n203.15.174.0/24\n203.15.227.0/24\n203.15.232.0/21\n203.15.240.0/23\n203.15.246.0/24\n203.16.10.0/24\n203.16.12.0/23\n203.16.16.0/21\n203.16.27.0/24\n203.16.38.0/24\n203.16.49.0/24\n203.16.50.0/23\n203.16.58.0/24\n203.16.63.0/24\n203.16.133.0/24\n203.16.161.0/24\n203.16.162.0/24\n203.16.186.0/23\n203.16.228.0/24\n203.16.238.0/24\n203.16.240.0/24\n203.16.245.0/24\n203.17.2.0/24\n203.17.18.0/24\n203.17.28.0/24\n203.17.39.0/24\n203.17.56.0/24\n203.17.74.0/23\n203.17.88.0/23\n203.17.136.0/24\n203.17.164.0/24\n203.17.187.0/24\n203.17.190.0/23\n203.17.231.0/24\n203.17.233.0/24\n203.17.248.0/24\n203.17.249.0/24\n203.17.255.0/24\n203.18.2.0/23\n203.18.4.0/24\n203.18.7.0/24\n203.18.31.0/24\n203.18.37.0/24\n203.18.48.0/23\n203.18.52.0/24\n203.18.72.0/22\n203.18.80.0/23\n203.18.87.0/24\n203.18.100.0/23\n203.18.105.0/24\n203.18.107.0/24\n203.18.110.0/24\n203.18.129.0/24\n203.18.131.0/24\n203.18.132.0/23\n203.18.144.0/24\n203.18.153.0/24\n203.18.199.0/24\n203.18.208.0/24\n203.18.211.0/24\n203.18.215.0/24\n203.19.1.0/24\n203.19.18.0/24\n203.19.24.0/24\n203.19.30.0/24\n203.19.32.0/21\n203.19.41.0/24\n203.19.44.0/23\n203.19.46.0/24\n203.19.58.0/24\n203.19.60.0/23\n203.19.64.0/24\n203.19.68.0/24\n203.19.72.0/24\n203.19.101.0/24\n203.19.111.0/24\n203.19.131.0/24\n203.19.133.0/24\n203.19.144.0/24\n203.19.147.0/24\n203.19.149.0/24\n203.19.156.0/24\n203.19.176.0/24\n203.19.178.0/23\n203.19.208.0/24\n203.19.228.0/22\n203.19.233.0/24\n203.19.242.0/24\n203.19.248.0/23\n203.19.255.0/24\n203.20.17.0/24\n203.20.40.0/23\n203.20.44.0/24\n203.20.48.0/24\n203.20.61.0/24\n203.20.65.0/24\n203.20.84.0/23\n203.20.89.0/24\n203.20.106.0/23\n203.20.115.0/24\n203.20.117.0/24\n203.20.118.0/23\n203.20.122.0/24\n203.20.126.0/23\n203.20.135.0/24\n203.20.136.0/21\n203.20.150.0/24\n203.20.230.0/24\n203.20.232.0/24\n203.20.236.0/24\n203.21.0.0/23\n203.21.2.0/24\n203.21.8.0/24\n203.21.10.0/24\n203.21.18.0/24\n203.21.33.0/24\n203.21.34.0/24\n203.21.41.0/24\n203.21.44.0/24\n203.21.68.0/24\n203.21.82.0/24\n203.21.96.0/22\n203.21.124.0/24\n203.21.136.0/23\n203.21.145.0/24\n203.21.206.0/24\n203.22.24.0/24\n203.22.28.0/23\n203.22.31.0/24\n203.22.68.0/24\n203.22.76.0/24\n203.22.78.0/24\n203.22.84.0/24\n203.22.87.0/24\n203.22.92.0/22\n203.22.99.0/24\n203.22.106.0/24\n203.22.122.0/23\n203.22.131.0/24\n203.22.163.0/24\n203.22.166.0/24\n203.22.170.0/24\n203.22.176.0/21\n203.22.194.0/24\n203.22.242.0/23\n203.22.245.0/24\n203.22.246.0/24\n203.22.252.0/23\n203.23.0.0/24\n203.23.47.0/24\n203.23.61.0/24\n203.23.62.0/23\n203.23.73.0/24\n203.23.85.0/24\n203.23.92.0/22\n203.23.98.0/24\n203.23.107.0/24\n203.23.112.0/24\n203.23.130.0/24\n203.23.140.0/23\n203.23.172.0/24\n203.23.182.0/24\n203.23.186.0/23\n203.23.192.0/24\n203.23.197.0/24\n203.23.198.0/24\n203.23.204.0/22\n203.23.224.0/24\n203.23.226.0/23\n203.23.228.0/22\n203.23.249.0/24\n203.23.251.0/24\n203.24.13.0/24\n203.24.18.0/24\n203.24.27.0/24\n203.24.43.0/24\n203.24.56.0/24\n203.24.58.0/24\n203.24.67.0/24\n203.24.74.0/24\n203.24.79.0/24\n203.24.80.0/23\n203.24.84.0/23\n203.24.86.0/24\n203.24.90.0/24\n203.24.111.0/24\n203.24.112.0/24\n203.24.116.0/24\n203.24.122.0/23\n203.24.145.0/24\n203.24.152.0/23\n203.24.157.0/24\n203.24.161.0/24\n203.24.167.0/24\n203.24.186.0/23\n203.24.199.0/24\n203.24.202.0/24\n203.24.212.0/23\n203.24.217.0/24\n203.24.219.0/24\n203.24.244.0/24\n203.25.19.0/24\n203.25.20.0/23\n203.25.46.0/24\n203.25.48.0/21\n203.25.64.0/23\n203.25.91.0/24\n203.25.99.0/24\n203.25.100.0/24\n203.25.106.0/24\n203.25.131.0/24\n203.25.135.0/24\n203.25.138.0/24\n203.25.147.0/24\n203.25.153.0/24\n203.25.154.0/23\n203.25.164.0/24\n203.25.166.0/24\n203.25.174.0/23\n203.25.180.0/24\n203.25.182.0/24\n203.25.191.0/24\n203.25.199.0/24\n203.25.200.0/24\n203.25.202.0/23\n203.25.208.0/20\n203.25.229.0/24\n203.25.235.0/24\n203.25.236.0/24\n203.25.242.0/24\n203.26.12.0/24\n203.26.34.0/24\n203.26.49.0/24\n203.26.50.0/24\n203.26.55.0/24\n203.26.56.0/23\n203.26.60.0/24\n203.26.65.0/24\n203.26.68.0/24\n203.26.76.0/24\n203.26.80.0/24\n203.26.84.0/24\n203.26.97.0/24\n203.26.102.0/23\n203.26.115.0/24\n203.26.116.0/24\n203.26.129.0/24\n203.26.143.0/24\n203.26.144.0/24\n203.26.148.0/23\n203.26.154.0/24\n203.26.158.0/23\n203.26.170.0/24\n203.26.173.0/24\n203.26.176.0/24\n203.26.185.0/24\n203.26.202.0/23\n203.26.210.0/24\n203.26.214.0/24\n203.26.222.0/24\n203.26.224.0/24\n203.26.228.0/24\n203.26.232.0/24\n203.27.0.0/24\n203.27.10.0/24\n203.27.15.0/24\n203.27.16.0/24\n203.27.20.0/24\n203.27.22.0/23\n203.27.40.0/24\n203.27.45.0/24\n203.27.53.0/24\n203.27.65.0/24\n203.27.66.0/24\n203.27.81.0/24\n203.27.88.0/24\n203.27.102.0/24\n203.27.109.0/24\n203.27.117.0/24\n203.27.121.0/24\n203.27.122.0/23\n203.27.125.0/24\n203.27.200.0/24\n203.27.202.0/24\n203.27.233.0/24\n203.27.241.0/24\n203.27.250.0/24\n203.28.10.0/24\n203.28.12.0/24\n203.28.33.0/24\n203.28.34.0/23\n203.28.43.0/24\n203.28.44.0/24\n203.28.54.0/24\n203.28.56.0/24\n203.28.73.0/24\n203.28.74.0/24\n203.28.76.0/24\n203.28.86.0/24\n203.28.88.0/24\n203.28.112.0/24\n203.28.131.0/24\n203.28.136.0/24\n203.28.140.0/24\n203.28.145.0/24\n203.28.165.0/24\n203.28.169.0/24\n203.28.170.0/24\n203.28.178.0/23\n203.28.185.0/24\n203.28.187.0/24\n203.28.196.0/24\n203.28.226.0/23\n203.28.239.0/24\n203.29.2.0/24\n203.29.8.0/23\n203.29.13.0/24\n203.29.14.0/24\n203.29.28.0/24\n203.29.46.0/24\n203.29.57.0/24\n203.29.61.0/24\n203.29.63.0/24\n203.29.69.0/24\n203.29.73.0/24\n203.29.81.0/24\n203.29.90.0/24\n203.29.95.0/24\n203.29.100.0/24\n203.29.103.0/24\n203.29.112.0/24\n203.29.120.0/22\n203.29.182.0/23\n203.29.187.0/24\n203.29.189.0/24\n203.29.190.0/24\n203.29.205.0/24\n203.29.210.0/24\n203.29.217.0/24\n203.29.227.0/24\n203.29.231.0/24\n203.29.233.0/24\n203.29.234.0/24\n203.29.248.0/24\n203.29.254.0/23\n203.30.16.0/23\n203.30.25.0/24\n203.30.27.0/24\n203.30.29.0/24\n203.30.66.0/24\n203.30.81.0/24\n203.30.87.0/24\n203.30.111.0/24\n203.30.121.0/24\n203.30.123.0/24\n203.30.152.0/24\n203.30.156.0/24\n203.30.162.0/24\n203.30.173.0/24\n203.30.175.0/24\n203.30.187.0/24\n203.30.194.0/24\n203.30.217.0/24\n203.30.220.0/24\n203.30.222.0/24\n203.30.232.0/23\n203.30.235.0/24\n203.30.240.0/23\n203.30.246.0/24\n203.30.250.0/23\n203.31.45.0/24\n203.31.46.0/24\n203.31.49.0/24\n203.31.51.0/24\n203.31.54.0/23\n203.31.69.0/24\n203.31.72.0/24\n203.31.80.0/24\n203.31.85.0/24\n203.31.97.0/24\n203.31.105.0/24\n203.31.106.0/24\n203.31.108.0/23\n203.31.124.0/24\n203.31.162.0/24\n203.31.174.0/24\n203.31.177.0/24\n203.31.181.0/24\n203.31.187.0/24\n203.31.189.0/24\n203.31.204.0/24\n203.31.220.0/24\n203.31.222.0/23\n203.31.225.0/24\n203.31.229.0/24\n203.31.248.0/23\n203.31.253.0/24\n203.32.20.0/24\n203.32.48.0/23\n203.32.56.0/24\n203.32.60.0/24\n203.32.62.0/24\n203.32.68.0/23\n203.32.76.0/24\n203.32.81.0/24\n203.32.84.0/23\n203.32.95.0/24\n203.32.102.0/24\n203.32.105.0/24\n203.32.130.0/24\n203.32.133.0/24\n203.32.140.0/24\n203.32.152.0/24\n203.32.186.0/23\n203.32.192.0/24\n203.32.196.0/24\n203.32.203.0/24\n203.32.204.0/23\n203.32.212.0/24\n203.33.4.0/24\n203.33.7.0/24\n203.33.8.0/21\n203.33.21.0/24\n203.33.26.0/24\n203.33.32.0/24\n203.33.63.0/24\n203.33.64.0/24\n203.33.67.0/24\n203.33.68.0/24\n203.33.73.0/24\n203.33.79.0/24\n203.33.100.0/24\n203.33.122.0/24\n203.33.129.0/24\n203.33.131.0/24\n203.33.145.0/24\n203.33.156.0/24\n203.33.158.0/23\n203.33.174.0/24\n203.33.185.0/24\n203.33.200.0/24\n203.33.202.0/23\n203.33.204.0/24\n203.33.206.0/23\n203.33.214.0/23\n203.33.224.0/23\n203.33.226.0/24\n203.33.233.0/24\n203.33.243.0/24\n203.33.250.0/24\n203.34.4.0/24\n203.34.21.0/24\n203.34.27.0/24\n203.34.39.0/24\n203.34.48.0/23\n203.34.54.0/24\n203.34.56.0/23\n203.34.67.0/24\n203.34.69.0/24\n203.34.76.0/24\n203.34.92.0/24\n203.34.106.0/24\n203.34.113.0/24\n203.34.147.0/24\n203.34.150.0/24\n203.34.152.0/23\n203.34.161.0/24\n203.34.162.0/24\n203.34.187.0/24\n203.34.192.0/21\n203.34.204.0/22\n203.34.232.0/24\n203.34.240.0/24\n203.34.242.0/24\n203.34.245.0/24\n203.34.251.0/24\n203.55.2.0/23\n203.55.4.0/24\n203.55.10.0/24\n203.55.13.0/24\n203.55.22.0/24\n203.55.30.0/24\n203.55.93.0/24\n203.55.101.0/24\n203.55.109.0/24\n203.55.110.0/24\n203.55.116.0/23\n203.55.119.0/24\n203.55.128.0/23\n203.55.146.0/23\n203.55.192.0/24\n203.55.196.0/24\n203.55.218.0/23\n203.55.221.0/24\n203.55.224.0/24\n203.56.1.0/24\n203.56.4.0/24\n203.56.12.0/24\n203.56.24.0/24\n203.56.38.0/24\n203.56.40.0/24\n203.56.46.0/24\n203.56.48.0/21\n203.56.68.0/23\n203.56.82.0/23\n203.56.84.0/23\n203.56.95.0/24\n203.56.110.0/24\n203.56.121.0/24\n203.56.161.0/24\n203.56.169.0/24\n203.56.172.0/23\n203.56.175.0/24\n203.56.183.0/24\n203.56.185.0/24\n203.56.187.0/24\n203.56.192.0/24\n203.56.198.0/24\n203.56.201.0/24\n203.56.208.0/23\n203.56.210.0/24\n203.56.214.0/24\n203.56.216.0/24\n203.56.227.0/24\n203.56.228.0/24\n203.56.231.0/24\n203.56.232.0/24\n203.56.240.0/24\n203.56.252.0/24\n203.56.254.0/24\n203.57.5.0/24\n203.57.6.0/24\n203.57.12.0/23\n203.57.28.0/24\n203.57.39.0/24\n203.57.46.0/24\n203.57.58.0/24\n203.57.61.0/24\n203.57.66.0/24\n203.57.69.0/24\n203.57.70.0/23\n203.57.73.0/24\n203.57.90.0/24\n203.57.101.0/24\n203.57.109.0/24\n203.57.123.0/24\n203.57.157.0/24\n203.57.200.0/24\n203.57.202.0/24\n203.57.206.0/24\n203.57.222.0/24\n203.57.224.0/20\n203.57.246.0/23\n203.57.249.0/24\n203.57.253.0/24\n203.57.254.0/23\n203.62.2.0/24\n203.62.131.0/24\n203.62.139.0/24\n203.62.161.0/24\n203.62.197.0/24\n203.62.228.0/22\n203.62.234.0/24\n203.62.246.0/24\n203.76.160.0/22\n203.76.168.0/22\n203.76.208.0/22\n203.76.212.0/22\n203.76.216.0/22\n203.76.240.0/22\n203.76.244.0/22\n203.77.180.0/22\n203.78.48.0/20\n203.78.156.0/22\n203.79.0.0/20\n203.79.32.0/20\n203.80.4.0/23\n203.80.32.0/20\n203.80.57.0/24\n203.80.129.0/24\n203.80.132.0/22\n203.80.136.0/21\n203.80.144.0/20\n203.81.0.0/21\n203.81.16.0/20\n203.81.244.0/22\n203.82.0.0/23\n203.82.16.0/21\n203.82.112.0/22\n203.82.116.0/22\n203.82.120.0/22\n203.82.124.0/22\n203.82.224.0/22\n203.82.228.0/22\n203.82.232.0/22\n203.82.236.0/22\n203.83.0.0/22\n203.83.8.0/22\n203.83.12.0/22\n203.83.56.0/21\n203.83.224.0/20\n203.86.0.0/19\n203.86.32.0/19\n203.86.64.0/20\n203.86.80.0/20\n203.86.96.0/19\n203.86.250.0/24\n203.86.254.0/23\n203.88.32.0/19\n203.88.192.0/19\n203.89.0.0/22\n203.89.8.0/21\n203.89.100.0/22\n203.89.133.0/24\n203.89.136.0/22\n203.89.144.0/24\n203.90.0.0/22\n203.90.8.0/22\n203.90.12.0/22\n203.90.128.0/19\n203.90.160.0/19\n203.90.192.0/19\n203.91.32.0/19\n203.91.96.0/20\n203.91.120.0/21\n203.92.0.0/22\n203.92.6.0/24\n203.92.160.0/19\n203.93.0.0/22\n203.93.4.0/22\n203.93.8.0/24\n203.93.9.0/24\n203.93.10.0/23\n203.93.12.0/22\n203.93.16.0/20\n203.93.32.0/19\n203.93.64.0/18\n203.93.128.0/21\n203.93.136.0/22\n203.93.140.0/24\n203.93.141.0/24\n203.93.142.0/23\n203.93.144.0/20\n203.93.160.0/19\n203.93.192.0/18\n203.94.0.0/22\n203.94.4.0/22\n203.94.8.0/21\n203.94.16.0/20\n203.95.0.0/21\n203.95.96.0/20\n203.95.112.0/20\n203.95.128.0/18\n203.95.200.0/22\n203.95.204.0/22\n203.95.208.0/22\n203.95.224.0/19\n203.99.8.0/21\n203.99.16.0/20\n203.99.80.0/20\n203.100.32.0/20\n203.100.48.0/21\n203.100.58.0/24\n203.100.60.0/24\n203.100.63.0/24\n203.100.80.0/20\n203.100.96.0/19\n203.100.192.0/20\n203.104.32.0/20\n203.105.96.0/19\n203.105.128.0/19\n203.107.0.0/17\n203.110.160.0/19\n203.110.208.0/20\n203.110.232.0/23\n203.110.234.0/24\n203.114.80.0/22\n203.114.84.0/22\n203.114.88.0/22\n203.114.92.0/22\n203.114.244.0/22\n203.118.192.0/19\n203.118.241.0/24\n203.118.248.0/22\n203.119.24.0/21\n203.119.32.0/22\n203.119.80.0/22\n203.119.85.0/24\n203.119.113.0/24\n203.119.114.0/23\n203.119.116.0/22\n203.119.120.0/21\n203.119.128.0/17\n203.123.58.0/24\n203.128.32.0/19\n203.128.96.0/19\n203.128.224.0/21\n203.129.8.0/21\n203.130.32.0/19\n203.132.32.0/19\n203.134.240.0/21\n203.135.96.0/20\n203.135.112.0/20\n203.135.160.0/20\n203.142.219.0/24\n203.142.224.0/19\n203.144.96.0/19\n203.145.0.0/19\n203.148.0.0/18\n203.148.64.0/20\n203.148.80.0/22\n203.148.86.0/23\n203.149.92.0/22\n203.152.64.0/19\n203.152.128.0/19\n203.153.0.0/22\n203.156.192.0/18\n203.158.16.0/21\n203.160.52.0/22\n203.160.104.0/21\n203.160.129.0/24\n203.160.192.0/19\n203.161.0.0/22\n203.161.180.0/24\n203.161.183.0/24\n203.161.192.0/19\n203.166.160.0/19\n203.167.28.0/22\n203.168.0.0/19\n203.170.58.0/23\n203.171.0.0/22\n203.171.208.0/24\n203.171.224.0/20\n203.174.4.0/24\n203.174.6.0/24\n203.174.7.0/24\n203.174.96.0/19\n203.175.128.0/19\n203.175.192.0/18\n203.176.0.0/18\n203.176.64.0/19\n203.176.168.0/21\n203.184.80.0/20\n203.185.189.0/24\n203.187.160.0/19\n203.189.0.0/23\n203.189.6.0/23\n203.189.112.0/22\n203.189.192.0/19\n203.189.240.0/22\n203.190.96.0/20\n203.190.249.0/24\n203.191.0.0/23\n203.191.2.0/24\n203.191.5.0/24\n203.191.7.0/24\n203.191.16.0/20\n203.191.64.0/18\n203.191.133.0/24\n203.191.144.0/21\n203.191.152.0/21\n203.192.0.0/19\n203.193.224.0/19\n203.194.120.0/21\n203.195.64.0/19\n203.195.112.0/21\n203.195.128.0/17\n203.196.0.0/21\n203.196.8.0/21\n203.196.28.0/22\n203.201.181.0/24\n203.201.182.0/24\n203.202.236.0/22\n203.205.64.0/19\n203.205.128.0/17\n203.207.64.0/20\n203.207.80.0/21\n203.207.88.0/22\n203.207.92.0/22\n203.207.96.0/20\n203.207.112.0/20\n203.207.128.0/18\n203.207.192.0/21\n203.207.200.0/21\n203.207.208.0/20\n203.207.224.0/19\n203.208.0.0/20\n203.208.16.0/22\n203.208.32.0/19\n203.209.224.0/19\n203.212.0.0/20\n203.212.80.0/20\n203.215.232.0/21\n203.217.164.0/22\n203.223.0.0/20\n203.223.16.0/21\n204.52.191.0/24\n210.2.0.0/20\n210.2.16.0/20\n210.5.0.0/19\n210.5.56.0/21\n210.5.128.0/20\n210.5.144.0/20\n210.7.56.0/22\n210.7.60.0/22\n210.12.0.0/18\n210.12.64.0/18\n210.12.128.0/18\n210.12.192.0/18\n210.13.0.0/18\n210.13.64.0/18\n210.13.128.0/17\n210.14.64.0/19\n210.14.112.0/20\n210.14.128.0/19\n210.14.160.0/19\n210.14.192.0/19\n210.14.224.0/19\n210.15.0.0/19\n210.15.32.0/19\n210.15.64.0/19\n210.15.96.0/19\n210.15.128.0/18\n210.16.104.0/22\n210.16.128.0/18\n210.21.0.0/17\n210.21.128.0/17\n210.22.0.0/16\n210.23.32.0/19\n210.25.0.0/16\n210.26.0.0/15\n210.28.0.0/14\n210.32.0.0/14\n210.36.0.0/14\n210.40.0.0/13\n210.51.0.0/16\n210.52.0.0/18\n210.52.64.0/18\n210.52.128.0/17\n210.53.0.0/17\n210.53.128.0/17\n210.56.192.0/19\n210.72.0.0/17\n210.72.128.0/19\n210.72.160.0/19\n210.72.192.0/18\n210.73.0.0/19\n210.73.32.0/19\n210.73.64.0/18\n210.73.128.0/17\n210.74.0.0/19\n210.74.32.0/19\n210.74.64.0/19\n210.74.96.0/19\n210.74.128.0/19\n210.74.160.0/19\n210.74.192.0/18\n210.75.0.0/16\n210.76.0.0/19\n210.76.32.0/19\n210.76.64.0/18\n210.76.128.0/17\n210.77.0.0/16\n210.78.0.0/19\n210.78.32.0/19\n210.78.64.0/18\n210.78.128.0/19\n210.78.160.0/19\n210.78.192.0/18\n210.79.64.0/18\n210.79.224.0/19\n210.82.0.0/15\n210.87.128.0/20\n210.87.144.0/20\n210.87.160.0/19\n210.185.192.0/18\n210.192.96.0/19\n211.64.0.0/14\n211.68.0.0/15\n211.70.0.0/15\n211.80.0.0/16\n211.81.0.0/16\n211.82.0.0/16\n211.83.0.0/16\n211.84.0.0/15\n211.86.0.0/15\n211.88.0.0/16\n211.89.0.0/16\n211.90.0.0/15\n211.92.0.0/15\n211.94.0.0/15\n211.96.0.0/15\n211.98.0.0/16\n211.99.0.0/18\n211.99.64.0/19\n211.99.96.0/19\n211.99.128.0/17\n211.100.0.0/16\n211.101.0.0/18\n211.101.64.0/18\n211.101.128.0/17\n211.102.0.0/16\n211.103.0.0/17\n211.103.128.0/17\n211.136.0.0/14\n211.140.0.0/15\n211.142.0.0/17\n211.142.128.0/17\n211.143.0.0/16\n211.144.0.0/15\n211.146.0.0/16\n211.147.0.0/16\n211.148.0.0/14\n211.152.0.0/15\n211.154.0.0/16\n211.155.0.0/18\n211.155.64.0/19\n211.155.96.0/19\n211.155.128.0/17\n211.156.0.0/14\n211.160.0.0/14\n211.164.0.0/14\n212.64.0.0/17\n212.129.128.0/17\n218.0.0.0/16\n218.1.0.0/16\n218.2.0.0/15\n218.4.0.0/15\n218.6.0.0/16\n218.7.0.0/16\n218.8.0.0/15\n218.10.0.0/16\n218.11.0.0/16\n218.12.0.0/16\n218.13.0.0/16\n218.14.0.0/15\n218.16.0.0/14\n218.20.0.0/16\n218.21.0.0/17\n218.21.128.0/17\n218.22.0.0/15\n218.24.0.0/15\n218.26.0.0/16\n218.27.0.0/16\n218.28.0.0/15\n218.30.0.0/15\n218.56.0.0/14\n218.60.0.0/15\n218.62.0.0/17\n218.62.128.0/17\n218.63.0.0/16\n218.64.0.0/15\n218.66.0.0/16\n218.67.0.0/17\n218.67.128.0/17\n218.68.0.0/15\n218.70.0.0/15\n218.72.0.0/14\n218.76.0.0/15\n218.78.0.0/15\n218.80.0.0/14\n218.84.0.0/14\n218.88.0.0/13\n218.96.0.0/15\n218.98.0.0/17\n218.98.128.0/18\n218.98.192.0/19\n218.98.224.0/19\n218.99.0.0/16\n218.100.88.0/21\n218.100.96.0/19\n218.100.128.0/17\n218.104.0.0/17\n218.104.128.0/19\n218.104.160.0/19\n218.104.192.0/21\n218.104.200.0/21\n218.104.208.0/20\n218.104.224.0/19\n218.105.0.0/16\n218.106.0.0/15\n218.108.0.0/16\n218.109.0.0/16\n218.185.192.0/19\n218.185.240.0/21\n218.192.0.0/16\n218.193.0.0/16\n218.194.0.0/16\n218.195.0.0/16\n218.196.0.0/14\n218.200.0.0/14\n218.204.0.0/15\n218.206.0.0/15\n218.240.0.0/14\n218.244.0.0/15\n218.246.0.0/15\n218.249.0.0/16\n219.72.0.0/16\n219.82.0.0/16\n219.83.128.0/17\n219.90.68.0/22\n219.90.72.0/22\n219.90.76.0/22\n219.128.0.0/12\n219.144.0.0/14\n219.148.0.0/16\n219.149.0.0/17\n219.149.128.0/18\n219.149.192.0/18\n219.150.0.0/19\n219.150.32.0/19\n219.150.64.0/19\n219.150.96.0/20\n219.150.112.0/20\n219.150.128.0/17\n219.151.0.0/19\n219.151.32.0/19\n219.151.64.0/18\n219.151.128.0/17\n219.152.0.0/15\n219.154.0.0/15\n219.156.0.0/15\n219.158.0.0/17\n219.158.128.0/17\n219.159.0.0/18\n219.159.64.0/18\n219.159.128.0/17\n219.216.0.0/15\n219.218.0.0/15\n219.220.0.0/16\n219.221.0.0/16\n219.222.0.0/15\n219.224.0.0/15\n219.226.0.0/16\n219.227.0.0/16\n219.228.0.0/15\n219.230.0.0/15\n219.232.0.0/14\n219.236.0.0/15\n219.238.0.0/15\n219.242.0.0/15\n219.244.0.0/14\n220.101.192.0/18\n220.112.0.0/14\n220.152.128.0/17\n220.154.0.0/15\n220.158.240.0/22\n220.160.0.0/11\n220.192.0.0/15\n220.194.0.0/15\n220.196.0.0/14\n220.200.0.0/13\n220.231.0.0/18\n220.231.128.0/17\n220.232.64.0/18\n220.234.0.0/16\n220.242.0.0/15\n220.247.136.0/21\n220.248.0.0/14\n220.252.0.0/16\n221.0.0.0/15\n221.2.0.0/16\n221.3.0.0/17\n221.3.128.0/17\n221.4.0.0/16\n221.5.0.0/17\n221.5.128.0/17\n221.6.0.0/16\n221.7.0.0/19\n221.7.32.0/19\n221.7.64.0/19\n221.7.96.0/19\n221.7.128.0/17\n221.8.0.0/15\n221.10.0.0/16\n221.11.0.0/17\n221.11.128.0/18\n221.11.192.0/19\n221.11.224.0/19\n221.12.0.0/17\n221.12.128.0/18\n221.13.0.0/18\n221.13.64.0/19\n221.13.96.0/19\n221.13.128.0/17\n221.14.0.0/15\n221.122.0.0/15\n221.128.128.0/17\n221.129.0.0/16\n221.130.0.0/15\n221.133.224.0/19\n221.136.0.0/16\n221.137.0.0/16\n221.172.0.0/14\n221.176.0.0/13\n221.192.0.0/15\n221.194.0.0/16\n221.195.0.0/16\n221.196.0.0/15\n221.198.0.0/16\n221.199.0.0/19\n221.199.32.0/20\n221.199.48.0/20\n221.199.64.0/18\n221.199.128.0/18\n221.199.192.0/20\n221.199.224.0/19\n221.200.0.0/14\n221.204.0.0/15\n221.206.0.0/16\n221.207.0.0/18\n221.207.64.0/18\n221.207.128.0/17\n221.208.0.0/14\n221.212.0.0/16\n221.213.0.0/16\n221.214.0.0/15\n221.216.0.0/13\n221.224.0.0/13\n221.232.0.0/14\n221.236.0.0/15\n221.238.0.0/16\n221.239.0.0/17\n221.239.128.0/17\n222.16.0.0/15\n222.18.0.0/15\n222.20.0.0/15\n222.22.0.0/16\n222.23.0.0/16\n222.24.0.0/15\n222.26.0.0/15\n222.28.0.0/14\n222.32.0.0/11\n222.64.0.0/13\n222.72.0.0/15\n222.74.0.0/16\n222.75.0.0/16\n222.76.0.0/14\n222.80.0.0/15\n222.82.0.0/16\n222.83.0.0/17\n222.83.128.0/17\n222.84.0.0/16\n222.85.0.0/17\n222.85.128.0/17\n222.86.0.0/15\n222.88.0.0/15\n222.90.0.0/15\n222.92.0.0/14\n222.125.0.0/16\n222.126.128.0/17\n222.128.0.0/14\n222.132.0.0/14\n222.136.0.0/13\n222.160.0.0/15\n222.162.0.0/16\n222.163.0.0/19\n222.163.32.0/19\n222.163.64.0/18\n222.163.128.0/17\n222.168.0.0/15\n222.170.0.0/15\n222.172.0.0/17\n222.172.128.0/17\n222.173.0.0/16\n222.174.0.0/15\n222.176.0.0/13\n222.184.0.0/13\n222.192.0.0/14\n222.196.0.0/15\n222.198.0.0/16\n222.199.0.0/16\n222.200.0.0/14\n222.204.0.0/15\n222.206.0.0/15\n222.208.0.0/13\n222.216.0.0/15\n222.218.0.0/16\n222.219.0.0/16\n222.220.0.0/15\n222.222.0.0/15\n222.240.0.0/13\n222.248.0.0/16\n222.249.0.0/17\n222.249.128.0/19\n222.249.160.0/20\n222.249.176.0/20\n222.249.192.0/18\n223.0.0.0/15\n223.2.0.0/15\n223.4.0.0/14\n223.8.0.0/13\n223.20.0.0/15\n223.27.184.0/22\n223.29.208.0/22\n223.29.252.0/22\n223.64.0.0/11\n223.96.0.0/12\n223.112.0.0/14\n223.116.0.0/15\n223.120.128.0/17\n223.121.128.0/17\n223.122.128.0/17\n223.123.128.0/17\n223.124.0.0/14\n223.128.0.0/15\n223.144.0.0/12\n223.160.0.0/14\n223.166.0.0/15\n223.192.0.0/15\n223.198.0.0/15\n223.201.0.0/16\n223.202.0.0/15\n223.208.0.0/14\n223.212.0.0/15\n223.214.0.0/15\n223.220.0.0/15\n223.223.176.0/20\n223.223.192.0/20\n223.240.0.0/13\n223.248.0.0/14\n223.252.128.0/17\n223.254.0.0/16\n223.255.0.0/17\n223.255.236.0/22\n223.255.252.0/23\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/etc/ssrplus/deny.list",
    "content": "gvod.aiseejapp.atianqi.com\nstat.pandora.xiaomi.com\nupgrade.mishop.pandora.xiaomi.com\nlogonext.tv.kuyun.com\nconfig.kuyun.com\nmishop.pandora.xiaomi.com\ndvb.pandora.xiaomi.com\napi.ad.xiaomi.com\nde.pandora.xiaomi.com\ndata.mistat.xiaomi.com\njellyfish.pandora.xiaomi.com\ngallery.pandora.xiaomi.com\no2o.api.xiaomi.com\nbss.pandora.xiaomi.com"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/etc/ssrplus/dnsproxy_dns.list",
    "content": "# cloudflare-dns.com\nsdns://AgcAAAAAAAAADjEwNC4xNi4yNDkuMjQ5ABJjbG91ZGZsYXJlLWRucy5jb20KL2Rucy1xdWVyeQ\n# Google\nsdns://AgUAAAAAAAAABzguOC40LjQgsKKKE4EwvtIbNjGjagI2607EdKSVHowYZtyvD9iPrkkHOC44LjQuNAovZG5zLXF1ZXJ5\n# dns.sb\nsdns://AgcAAAAAAAAADzE4NS4yMjIuMjIyLjIyMiAOp5Svj-oV-Fz-65-8H2VKHLKJ0egmfEgrdPeAQlUFFA8xODUuMjIyLjIyMi4yMjIKL2Rucy1xdWVyeQ\n# Quad9\nsdns://AgMAAAAAAAAADTE0OS4xMTIuMTEyLjkgsBkgdEu7dsmrBT4B4Ht-BQ5HPSD3n3vqQ1-v5DydJC8SZG5zOS5xdWFkOS5uZXQ6NDQzCi9kbnMtcXVlcnk\nsdns://AQMAAAAAAAAADDkuOS45Ljk6ODQ0MyBnyEe4yHWM0SAkVUO-dWdG3zTfHYTAC4xHA2jfgh2GPhkyLmRuc2NyeXB0LWNlcnQucXVhZDkubmV0\n# AdGuard\nsdns://AQMAAAAAAAAAETk0LjE0MC4xNC4xNDo1NDQzINErR_JS3PLCu_iZEIbq95zkSV2LFsigxDIuUso_OQhzIjIuZG5zY3J5cHQuZGVmYXVsdC5uczEuYWRndWFyZC5jb20\n# Cloudflare\nsdns://AgcAAAAAAAAABzEuMC4wLjGgENk8mGSlIfMGXMOlIlCcKvq7AVgcrZxtjon911-ep0cg63Ul-I8NlFj4GplQGb_TTLiczclX57DvMV8Q-JdjgRgSZG5zLmNsb3VkZmxhcmUuY29tCi9kbnMtcXVlcnk\n# TWNIC-101\nsdns://AgcAAAAAAAAAACC2vD25TAYM7EnyCH8Xw1-0g5OccnTsGH9vQUUH0njRtAxkbnMudHduaWMudHcKL2Rucy1xdWVyeQ\n# cs-tx\nsdns://AQYAAAAAAAAADTIwOS41OC4xNDcuMzYgMTNyrVlWMsJBa4cvCY-FG925ZShMbL6aTxkJZDDbqVoeMi5kbnNjcnlwdC1jZXJ0LmNyeXB0b3N0b3JtLmlz\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/etc/ssrplus/gfw_base.conf",
    "content": "server=/91smartyun.pt/127.0.0.1#5335\nipset=/91smartyun.pt/gfwlist\nserver=/adobe.com/127.0.0.1#5335\nipset=/adobe.com/gfwlist\nserver=/amazonaws.com/127.0.0.1#5335\nipset=/amazonaws.com/gfwlist\nserver=/ampproject.org/127.0.0.1#5335\nipset=/ampproject.org/gfwlist\nserver=/apple.news/127.0.0.1#5335\nipset=/apple.news/gfwlist\nserver=/aws.amazon.com/127.0.0.1#5335\nipset=/aws.amazon.com/gfwlist\nserver=/azureedge.net/127.0.0.1#5335\nipset=/azureedge.net/gfwlist\nserver=/backpackers.com.tw/127.0.0.1#5335\nipset=/backpackers.com.tw/gfwlist\nserver=/bitfinex.com/127.0.0.1#5335\nipset=/bitfinex.com/gfwlist\nserver=/buzzfeed.com/127.0.0.1#5335\nipset=/buzzfeed.com/gfwlist\nserver=/clockwise.ee/127.0.0.1#5335\nipset=/clockwise.ee/gfwlist\nserver=/cloudfront.net/127.0.0.1#5335\nipset=/cloudfront.net/gfwlist\nserver=/coindesk.com/127.0.0.1#5335\nipset=/coindesk.com/gfwlist\nserver=/coinsquare.io/127.0.0.1#5335\nipset=/coinsquare.io/gfwlist\nserver=/cryptocompare.com/127.0.0.1#5335\nipset=/cryptocompare.com/gfwlist\nserver=/dropboxstatic.com/127.0.0.1#5335\nipset=/dropboxstatic.com/gfwlist\nserver=/eurecom.fr/127.0.0.1#5335\nipset=/eurecom.fr/gfwlist\nserver=/gdax.com/127.0.0.1#5335\nipset=/gdax.com/gfwlist\nserver=/github.com/127.0.0.1#5335\nipset=/github.com/gfwlist\nserver=/kknews.cc/127.0.0.1#5335\nipset=/kknews.cc/gfwlist\nserver=/nutaq.com/127.0.0.1#5335\nipset=/nutaq.com/gfwlist\nserver=/openairinterface.org/127.0.0.1#5335\nipset=/openairinterface.org/gfwlist\nserver=/skype.com/127.0.0.1#5335\nipset=/skype.com/gfwlist\nserver=/sublimetext.com/127.0.0.1#5335\nipset=/sublimetext.com/gfwlist\nserver=/textnow.com/127.0.0.1#5335\nipset=/textnow.com/gfwlist\nserver=/textnow.me/127.0.0.1#5335\nipset=/textnow.me/gfwlist\nserver=/trouter.io/127.0.0.1#5335\nipset=/trouter.io/gfwlist\nserver=/t66y.com/127.0.0.1#5335\nipset=/t66y.com/gfwlist\nserver=/uploaded.net/127.0.0.1#5335\nipset=/uploaded.net/gfwlist\nserver=/v2rayssr.com/127.0.0.1#5335\nipset=/v2rayssr.com/gfwlist\nserver=/whatsapp.com/127.0.0.1#5335\nipset=/whatsapp.com/gfwlist\nserver=/whatsapp.net/127.0.0.1#5335\nipset=/whatsapp.net/gfwlist\nserver=/wsj.net/127.0.0.1#5335\nipset=/wsj.net/gfwlist\nserver=/google.com/127.0.0.1#5335\nipset=/google.com/gfwlist\nserver=/google.com.hk/127.0.0.1#5335\nipset=/google.com.hk/gfwlist\nserver=/gstatic.com/127.0.0.1#5335\nipset=/gstatic.com/gfwlist\nserver=/googleusercontent.com/127.0.0.1#5335\nipset=/googleusercontent.com/gfwlist\nserver=/googlepages.com/127.0.0.1#5335\nipset=/googlepages.com/gfwlist\nserver=/googlevideo.com/127.0.0.1#5335\nipset=/googlevideo.com/gfwlist\nserver=/googlecode.com/127.0.0.1#5335\nipset=/googlecode.com/gfwlist\nserver=/googleapis.com/127.0.0.1#5335\nipset=/googleapis.com/gfwlist\nserver=/googlesource.com/127.0.0.1#5335\nipset=/googlesource.com/gfwlist\nserver=/googledrive.com/127.0.0.1#5335\nipset=/googledrive.com/gfwlist\nserver=/ggpht.com/127.0.0.1#5335\nipset=/ggpht.com/gfwlist\nserver=/youtube.com/127.0.0.1#5335\nipset=/youtube.com/gfwlist\nserver=/youtu.be/127.0.0.1#5335\nipset=/youtu.be/gfwlist\nserver=/ytimg.com/127.0.0.1#5335\nipset=/ytimg.com/gfwlist\nserver=/twitter.com/127.0.0.1#5335\nipset=/twitter.com/gfwlist\nserver=/facebook.com/127.0.0.1#5335\nipset=/facebook.com/gfwlist\nserver=/fastly.net/127.0.0.1#5335\nipset=/fastly.net/gfwlist\nserver=/akamai.net/127.0.0.1#5335\nipset=/akamai.net/gfwlist\nserver=/akamaiedge.net/127.0.0.1#5335\nipset=/akamaiedge.net/gfwlist\nserver=/akamaihd.net/127.0.0.1#5335\nipset=/akamaihd.net/gfwlist\nserver=/edgesuite.net/127.0.0.1#5335\nipset=/edgesuite.net/gfwlist\nserver=/edgekey.net/127.0.0.1#5335\nipset=/edgekey.net/gfwlist\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/etc/ssrplus/gfw_list.conf",
    "content": "server=/samebags.com/127.0.0.1#5335\nipset=/samebags.com/gfwlist\nserver=/premiumhd.net/127.0.0.1#5335\nipset=/premiumhd.net/gfwlist\nserver=/facebool.com/127.0.0.1#5335\nipset=/facebool.com/gfwlist\nserver=/disneystore.com/127.0.0.1#5335\nipset=/disneystore.com/gfwlist\nserver=/lcsmerch.com/127.0.0.1#5335\nipset=/lcsmerch.com/gfwlist\nserver=/hentais.tube/127.0.0.1#5335\nipset=/hentais.tube/gfwlist\nserver=/teenport.com/127.0.0.1#5335\nipset=/teenport.com/gfwlist\nserver=/zeit.sh/127.0.0.1#5335\nipset=/zeit.sh/gfwlist\nserver=/mrvideosdesexo.xxx/127.0.0.1#5335\nipset=/mrvideosdesexo.xxx/gfwlist\nserver=/xxxindiantv.com/127.0.0.1#5335\nipset=/xxxindiantv.com/gfwlist\nserver=/visacheckout.org/127.0.0.1#5335\nipset=/visacheckout.org/gfwlist\nserver=/discordapp.net/127.0.0.1#5335\nipset=/discordapp.net/gfwlist\nserver=/kaggle.com/127.0.0.1#5335\nipset=/kaggle.com/gfwlist\nserver=/bbycontent.net/127.0.0.1#5335\nipset=/bbycontent.net/gfwlist\nserver=/imagebam.com/127.0.0.1#5335\nipset=/imagebam.com/gfwlist\nserver=/oreillystatic.com/127.0.0.1#5335\nipset=/oreillystatic.com/gfwlist\nserver=/ahxxx.club/127.0.0.1#5335\nipset=/ahxxx.club/gfwlist\nserver=/duckduckco.com/127.0.0.1#5335\nipset=/duckduckco.com/gfwlist\nserver=/duyaoss.com/127.0.0.1#5335\nipset=/duyaoss.com/gfwlist\nserver=/buyitnow.org/127.0.0.1#5335\nipset=/buyitnow.org/gfwlist\nserver=/paypali.net/127.0.0.1#5335\nipset=/paypali.net/gfwlist\nserver=/nvidia.com.tr/127.0.0.1#5335\nipset=/nvidia.com.tr/gfwlist\nserver=/applepaycash.tv/127.0.0.1#5335\nipset=/applepaycash.tv/gfwlist\nserver=/livestream.com/127.0.0.1#5335\nipset=/livestream.com/gfwlist\nserver=/homebrew.bintray.com/127.0.0.1#5335\nipset=/homebrew.bintray.com/gfwlist\nserver=/bustylornamorgan.com/127.0.0.1#5335\nipset=/bustylornamorgan.com/gfwlist\nserver=/18acg.us/127.0.0.1#5335\nipset=/18acg.us/gfwlist\nserver=/google.co.ke/127.0.0.1#5335\nipset=/google.co.ke/gfwlist\nserver=/itunes.mx/127.0.0.1#5335\nipset=/itunes.mx/gfwlist\nserver=/beatssingaporeshop.com/127.0.0.1#5335\nipset=/beatssingaporeshop.com/gfwlist\nserver=/beatsbydreuk.net/127.0.0.1#5335\nipset=/beatsbydreuk.net/gfwlist\nserver=/hentaiclub.net/127.0.0.1#5335\nipset=/hentaiclub.net/gfwlist\nserver=/cloudchoose.com/127.0.0.1#5335\nipset=/cloudchoose.com/gfwlist\nserver=/codeforces.com/127.0.0.1#5335\nipset=/codeforces.com/gfwlist\nserver=/lizol.co.in/127.0.0.1#5335\nipset=/lizol.co.in/gfwlist\nserver=/applecomputer.com.hk/127.0.0.1#5335\nipset=/applecomputer.com.hk/gfwlist\nserver=/bridgestonearena.com/127.0.0.1#5335\nipset=/bridgestonearena.com/gfwlist\nserver=/vpngate.net/127.0.0.1#5335\nipset=/vpngate.net/gfwlist\nserver=/developer-advisor.com/127.0.0.1#5335\nipset=/developer-advisor.com/gfwlist\nserver=/81jia.tv/127.0.0.1#5335\nipset=/81jia.tv/gfwlist\nserver=/youtube.co.uk/127.0.0.1#5335\nipset=/youtube.co.uk/gfwlist\nserver=/youporngay.com/127.0.0.1#5335\nipset=/youporngay.com/gfwlist\nserver=/alphabet.pt/127.0.0.1#5335\nipset=/alphabet.pt/gfwlist\nserver=/itfromtheinside.com/127.0.0.1#5335\nipset=/itfromtheinside.com/gfwlist\nserver=/teenchoice.com/127.0.0.1#5335\nipset=/teenchoice.com/gfwlist\nserver=/filmespornos.net/127.0.0.1#5335\nipset=/filmespornos.net/gfwlist\nserver=/ftvnews.com.tw/127.0.0.1#5335\nipset=/ftvnews.com.tw/gfwlist\nserver=/kindle.co.jp/127.0.0.1#5335\nipset=/kindle.co.jp/gfwlist\nserver=/terraform.io/127.0.0.1#5335\nipset=/terraform.io/gfwlist\nserver=/faycbok.com/127.0.0.1#5335\nipset=/faycbok.com/gfwlist\nserver=/scpwiki.com/127.0.0.1#5335\nipset=/scpwiki.com/gfwlist\nserver=/sexyandfunny.com/127.0.0.1#5335\nipset=/sexyandfunny.com/gfwlist\nserver=/google.vg/127.0.0.1#5335\nipset=/google.vg/gfwlist\nserver=/runporn.com/127.0.0.1#5335\nipset=/runporn.com/gfwlist\nserver=/alivertsm.com/127.0.0.1#5335\nipset=/alivertsm.com/gfwlist\nserver=/camwhores.forum/127.0.0.1#5335\nipset=/camwhores.forum/gfwlist\nserver=/wolfatbestbuy.net/127.0.0.1#5335\nipset=/wolfatbestbuy.net/gfwlist\nserver=/legaltracker.com/127.0.0.1#5335\nipset=/legaltracker.com/gfwlist\nserver=/centervillage.co.jp/127.0.0.1#5335\nipset=/centervillage.co.jp/gfwlist\nserver=/cshive.com/127.0.0.1#5335\nipset=/cshive.com/gfwlist\nserver=/fox13memphis.com/127.0.0.1#5335\nipset=/fox13memphis.com/gfwlist\nserver=/appleone.cloud/127.0.0.1#5335\nipset=/appleone.cloud/gfwlist\nserver=/aiaa.org/127.0.0.1#5335\nipset=/aiaa.org/gfwlist\nserver=/yahoo.rw/127.0.0.1#5335\nipset=/yahoo.rw/gfwlist\nserver=/dudethrill.com/127.0.0.1#5335\nipset=/dudethrill.com/gfwlist\nserver=/ouplaw.com/127.0.0.1#5335\nipset=/ouplaw.com/gfwlist\nserver=/anthemthegame.com/127.0.0.1#5335\nipset=/anthemthegame.com/gfwlist\nserver=/adobetag.com/127.0.0.1#5335\nipset=/adobetag.com/gfwlist\nserver=/kingkong.com.tw/127.0.0.1#5335\nipset=/kingkong.com.tw/gfwlist\nserver=/appleos.tv/127.0.0.1#5335\nipset=/appleos.tv/gfwlist\nserver=/igayporn.tv/127.0.0.1#5335\nipset=/igayporn.tv/gfwlist\nserver=/beatsheadphonesonline.com/127.0.0.1#5335\nipset=/beatsheadphonesonline.com/gfwlist\nserver=/maturetube.com/127.0.0.1#5335\nipset=/maturetube.com/gfwlist\nserver=/visasoutheasteurope.com/127.0.0.1#5335\nipset=/visasoutheasteurope.com/gfwlist\nserver=/trueamateurs.com/127.0.0.1#5335\nipset=/trueamateurs.com/gfwlist\nserver=/telesco.pe/127.0.0.1#5335\nipset=/telesco.pe/gfwlist\nserver=/monsterbeatsoutlet.us/127.0.0.1#5335\nipset=/monsterbeatsoutlet.us/gfwlist\nserver=/gettyimages.it/127.0.0.1#5335\nipset=/gettyimages.it/gfwlist\nserver=/videodesexo.blog/127.0.0.1#5335\nipset=/videodesexo.blog/gfwlist\nserver=/hpiie.org/127.0.0.1#5335\nipset=/hpiie.org/gfwlist\nserver=/ipadair.ie/127.0.0.1#5335\nipset=/ipadair.ie/gfwlist\nserver=/20thcenturystudios.com.br/127.0.0.1#5335\nipset=/20thcenturystudios.com.br/gfwlist\nserver=/beatsbydreoksale.com/127.0.0.1#5335\nipset=/beatsbydreoksale.com/gfwlist\nserver=/paypal-security.org/127.0.0.1#5335\nipset=/paypal-security.org/gfwlist\nserver=/visa.com.hk/127.0.0.1#5335\nipset=/visa.com.hk/gfwlist\nserver=/webcamtubexxx.com/127.0.0.1#5335\nipset=/webcamtubexxx.com/gfwlist\nserver=/hanime.tv/127.0.0.1#5335\nipset=/hanime.tv/gfwlist\nserver=/beatsbymusic.net/127.0.0.1#5335\nipset=/beatsbymusic.net/gfwlist\nserver=/czechvr.com/127.0.0.1#5335\nipset=/czechvr.com/gfwlist\nserver=/licdn.cn.cdn20.com/127.0.0.1#5335\nipset=/licdn.cn.cdn20.com/gfwlist\nserver=/sourceforge.net/127.0.0.1#5335\nipset=/sourceforge.net/gfwlist\nserver=/amazonianblog.com/127.0.0.1#5335\nipset=/amazonianblog.com/gfwlist\nserver=/visa.com.vn/127.0.0.1#5335\nipset=/visa.com.vn/gfwlist\nserver=/gaypinoyporn.com/127.0.0.1#5335\nipset=/gaypinoyporn.com/gfwlist\nserver=/blogspot.pt/127.0.0.1#5335\nipset=/blogspot.pt/gfwlist\nserver=/xnxxsexmovies.com/127.0.0.1#5335\nipset=/xnxxsexmovies.com/gfwlist\nserver=/ultimaonline.com/127.0.0.1#5335\nipset=/ultimaonline.com/gfwlist\nserver=/paypal-latam.com/127.0.0.1#5335\nipset=/paypal-latam.com/gfwlist\nserver=/echichimato.com/127.0.0.1#5335\nipset=/echichimato.com/gfwlist\nserver=/escort24h.net/127.0.0.1#5335\nipset=/escort24h.net/gfwlist\nserver=/apple.pk/127.0.0.1#5335\nipset=/apple.pk/gfwlist\nserver=/oculus2014.com/127.0.0.1#5335\nipset=/oculus2014.com/gfwlist\nserver=/intel.co.za/127.0.0.1#5335\nipset=/intel.co.za/gfwlist\nserver=/pornmegaload.com/127.0.0.1#5335\nipset=/pornmegaload.com/gfwlist\nserver=/facboo.com/127.0.0.1#5335\nipset=/facboo.com/gfwlist\nserver=/jtube.space/127.0.0.1#5335\nipset=/jtube.space/gfwlist\nserver=/pornomovies.mobi/127.0.0.1#5335\nipset=/pornomovies.mobi/gfwlist\nserver=/facebookswagemea.com/127.0.0.1#5335\nipset=/facebookswagemea.com/gfwlist\nserver=/mapbox.com/127.0.0.1#5335\nipset=/mapbox.com/gfwlist\nserver=/eurosexscene.com/127.0.0.1#5335\nipset=/eurosexscene.com/gfwlist\nserver=/kanzhongguo.com/127.0.0.1#5335\nipset=/kanzhongguo.com/gfwlist\nserver=/directtv.net/127.0.0.1#5335\nipset=/directtv.net/gfwlist\nserver=/swisssigngroup.ch/127.0.0.1#5335\nipset=/swisssigngroup.ch/gfwlist\nserver=/muycerdas.xxx/127.0.0.1#5335\nipset=/muycerdas.xxx/gfwlist\nserver=/facebuk.com/127.0.0.1#5335\nipset=/facebuk.com/gfwlist\nserver=/monsterbeatsau.com/127.0.0.1#5335\nipset=/monsterbeatsau.com/gfwlist\nserver=/yandex.com.am/127.0.0.1#5335\nipset=/yandex.com.am/gfwlist\nserver=/softbankbb.com/127.0.0.1#5335\nipset=/softbankbb.com/gfwlist\nserver=/finishinfo.nl/127.0.0.1#5335\nipset=/finishinfo.nl/gfwlist\nserver=/webex.com.hk/127.0.0.1#5335\nipset=/webex.com.hk/gfwlist\nserver=/pornzone.com/127.0.0.1#5335\nipset=/pornzone.com/gfwlist\nserver=/microsoft.be/127.0.0.1#5335\nipset=/microsoft.be/gfwlist\nserver=/bravoporn.com/127.0.0.1#5335\nipset=/bravoporn.com/gfwlist\nserver=/mitao.bar/127.0.0.1#5335\nipset=/mitao.bar/gfwlist\nserver=/illusionxz.com/127.0.0.1#5335\nipset=/illusionxz.com/gfwlist\nserver=/paypal-qrshopping.org/127.0.0.1#5335\nipset=/paypal-qrshopping.org/gfwlist\nserver=/nikeconfluence.com/127.0.0.1#5335\nipset=/nikeconfluence.com/gfwlist\nserver=/applewatch.hk/127.0.0.1#5335\nipset=/applewatch.hk/gfwlist\nserver=/foxfiles.com/127.0.0.1#5335\nipset=/foxfiles.com/gfwlist\nserver=/sony.at/127.0.0.1#5335\nipset=/sony.at/gfwlist\nserver=/openamt.com/127.0.0.1#5335\nipset=/openamt.com/gfwlist\nserver=/applemusic.com.au/127.0.0.1#5335\nipset=/applemusic.com.au/gfwlist\nserver=/manhub.com/127.0.0.1#5335\nipset=/manhub.com/gfwlist\nserver=/hentaiz.mobi/127.0.0.1#5335\nipset=/hentaiz.mobi/gfwlist\nserver=/covid19-rx.org/127.0.0.1#5335\nipset=/covid19-rx.org/gfwlist\nserver=/sexcartoon.biz/127.0.0.1#5335\nipset=/sexcartoon.biz/gfwlist\nserver=/hentai-ani.me/127.0.0.1#5335\nipset=/hentai-ani.me/gfwlist\nserver=/gandi.net/127.0.0.1#5335\nipset=/gandi.net/gfwlist\nserver=/ebaylisting.com/127.0.0.1#5335\nipset=/ebaylisting.com/gfwlist\nserver=/xxxvideoamatoriali.com/127.0.0.1#5335\nipset=/xxxvideoamatoriali.com/gfwlist\nserver=/persiankitty.com/127.0.0.1#5335\nipset=/persiankitty.com/gfwlist\nserver=/i-book.com/127.0.0.1#5335\nipset=/i-book.com/gfwlist\nserver=/spiedigitallibrary.org/127.0.0.1#5335\nipset=/spiedigitallibrary.org/gfwlist\nserver=/hentaicomics.life/127.0.0.1#5335\nipset=/hentaicomics.life/gfwlist\nserver=/icloud.ee/127.0.0.1#5335\nipset=/icloud.ee/gfwlist\nserver=/muscdn.com/127.0.0.1#5335\nipset=/muscdn.com/gfwlist\nserver=/xn--8uq428d76d.tokyo/127.0.0.1#5335\nipset=/xn--8uq428d76d.tokyo/gfwlist\nserver=/mytving.com/127.0.0.1#5335\nipset=/mytving.com/gfwlist\nserver=/topfreepornvideos.com/127.0.0.1#5335\nipset=/topfreepornvideos.com/gfwlist\nserver=/yahoo.sh/127.0.0.1#5335\nipset=/yahoo.sh/gfwlist\nserver=/stepfamilyporn.com/127.0.0.1#5335\nipset=/stepfamilyporn.com/gfwlist\nserver=/vim.org/127.0.0.1#5335\nipset=/vim.org/gfwlist\nserver=/nvidia.no/127.0.0.1#5335\nipset=/nvidia.no/gfwlist\nserver=/seqingx.com/127.0.0.1#5335\nipset=/seqingx.com/gfwlist\nserver=/liverail.tv/127.0.0.1#5335\nipset=/liverail.tv/gfwlist\nserver=/espn.net/127.0.0.1#5335\nipset=/espn.net/gfwlist\nserver=/beatsheadphones-discount.com/127.0.0.1#5335\nipset=/beatsheadphones-discount.com/gfwlist\nserver=/dvdstudiopro.info/127.0.0.1#5335\nipset=/dvdstudiopro.info/gfwlist\nserver=/khotruyentranhx.com/127.0.0.1#5335\nipset=/khotruyentranhx.com/gfwlist\nserver=/gettyimages.co.jp/127.0.0.1#5335\nipset=/gettyimages.co.jp/gfwlist\nserver=/avstar9.com/127.0.0.1#5335\nipset=/avstar9.com/gfwlist\nserver=/javseen.tv/127.0.0.1#5335\nipset=/javseen.tv/gfwlist\nserver=/amateur-gallery-post.com/127.0.0.1#5335\nipset=/amateur-gallery-post.com/gfwlist\nserver=/movefreerewards.com/127.0.0.1#5335\nipset=/movefreerewards.com/gfwlist\nserver=/ebayon.com/127.0.0.1#5335\nipset=/ebayon.com/gfwlist\nserver=/live.com.au/127.0.0.1#5335\nipset=/live.com.au/gfwlist\nserver=/easttouch.com.hk/127.0.0.1#5335\nipset=/easttouch.com.hk/gfwlist\nserver=/neuralink.com/127.0.0.1#5335\nipset=/neuralink.com/gfwlist\nserver=/europornstar.com/127.0.0.1#5335\nipset=/europornstar.com/gfwlist\nserver=/realestatejournal.com/127.0.0.1#5335\nipset=/realestatejournal.com/gfwlist\nserver=/ero-labs.net/127.0.0.1#5335\nipset=/ero-labs.net/gfwlist\nserver=/qingse.one/127.0.0.1#5335\nipset=/qingse.one/gfwlist\nserver=/oculusblog.com/127.0.0.1#5335\nipset=/oculusblog.com/gfwlist\nserver=/youngtube.me/127.0.0.1#5335\nipset=/youngtube.me/gfwlist\nserver=/xxxlucah.com/127.0.0.1#5335\nipset=/xxxlucah.com/gfwlist\nserver=/bmwmotorcycleusa.com/127.0.0.1#5335\nipset=/bmwmotorcycleusa.com/gfwlist\nserver=/vendu.com/127.0.0.1#5335\nipset=/vendu.com/gfwlist\nserver=/facebook-newsroom.org/127.0.0.1#5335\nipset=/facebook-newsroom.org/gfwlist\nserver=/disneychannelonstage.com/127.0.0.1#5335\nipset=/disneychannelonstage.com/gfwlist\nserver=/filmesporno.net.br/127.0.0.1#5335\nipset=/filmesporno.net.br/gfwlist\nserver=/iphonefc.com/127.0.0.1#5335\nipset=/iphonefc.com/gfwlist\nserver=/arabxnxx.org/127.0.0.1#5335\nipset=/arabxnxx.org/gfwlist\nserver=/google.bj/127.0.0.1#5335\nipset=/google.bj/gfwlist\nserver=/tvbweekly.com/127.0.0.1#5335\nipset=/tvbweekly.com/gfwlist\nserver=/avsee01.tv/127.0.0.1#5335\nipset=/avsee01.tv/gfwlist\nserver=/nikegadgets.com/127.0.0.1#5335\nipset=/nikegadgets.com/gfwlist\nserver=/turborepo.org/127.0.0.1#5335\nipset=/turborepo.org/gfwlist\nserver=/mature.nl/127.0.0.1#5335\nipset=/mature.nl/gfwlist\nserver=/ampproject.net/127.0.0.1#5335\nipset=/ampproject.net/gfwlist\nserver=/tnt-ea.com/127.0.0.1#5335\nipset=/tnt-ea.com/gfwlist\nserver=/huffingtonpost.in/127.0.0.1#5335\nipset=/huffingtonpost.in/gfwlist\nserver=/veet.co.nz/127.0.0.1#5335\nipset=/veet.co.nz/gfwlist\nserver=/lovesexdurex.com/127.0.0.1#5335\nipset=/lovesexdurex.com/gfwlist\nserver=/paypal-status.com/127.0.0.1#5335\nipset=/paypal-status.com/gfwlist\nserver=/volvotrucks.cl/127.0.0.1#5335\nipset=/volvotrucks.cl/gfwlist\nserver=/periscope.tv/127.0.0.1#5335\nipset=/periscope.tv/gfwlist\nserver=/interracial-sites.com/127.0.0.1#5335\nipset=/interracial-sites.com/gfwlist\nserver=/mini-connected.lv/127.0.0.1#5335\nipset=/mini-connected.lv/gfwlist\nserver=/vrfun18.com/127.0.0.1#5335\nipset=/vrfun18.com/gfwlist\nserver=/twttr.net/127.0.0.1#5335\nipset=/twttr.net/gfwlist\nserver=/yahoo.com.pa/127.0.0.1#5335\nipset=/yahoo.com.pa/gfwlist\nserver=/omtrdc.net/127.0.0.1#5335\nipset=/omtrdc.net/gfwlist\nserver=/pornoh.info/127.0.0.1#5335\nipset=/pornoh.info/gfwlist\nserver=/paypal-luxury.com/127.0.0.1#5335\nipset=/paypal-luxury.com/gfwlist\nserver=/theporndude.com/127.0.0.1#5335\nipset=/theporndude.com/gfwlist\nserver=/hentaiaction.net/127.0.0.1#5335\nipset=/hentaiaction.net/gfwlist\nserver=/pixnet.net/127.0.0.1#5335\nipset=/pixnet.net/gfwlist\nserver=/r18lu.com/127.0.0.1#5335\nipset=/r18lu.com/gfwlist\nserver=/hackerfacebook.com/127.0.0.1#5335\nipset=/hackerfacebook.com/gfwlist\nserver=/rupress.org/127.0.0.1#5335\nipset=/rupress.org/gfwlist\nserver=/eventsinfocus.org/127.0.0.1#5335\nipset=/eventsinfocus.org/gfwlist\nserver=/xnxxarab.cc/127.0.0.1#5335\nipset=/xnxxarab.cc/gfwlist\nserver=/chinatimes.com.tw/127.0.0.1#5335\nipset=/chinatimes.com.tw/gfwlist\nserver=/hbo.com/127.0.0.1#5335\nipset=/hbo.com/gfwlist\nserver=/shopee.es/127.0.0.1#5335\nipset=/shopee.es/gfwlist\nserver=/akamaihd.com/127.0.0.1#5335\nipset=/akamaihd.com/gfwlist\nserver=/hentaizap.com/127.0.0.1#5335\nipset=/hentaizap.com/gfwlist\nserver=/windows.net/127.0.0.1#5335\nipset=/windows.net/gfwlist\nserver=/machosaonatural.com.br/127.0.0.1#5335\nipset=/machosaonatural.com.br/gfwlist\nserver=/compresspdf.new/127.0.0.1#5335\nipset=/compresspdf.new/gfwlist\nserver=/amazonvideo.com/127.0.0.1#5335\nipset=/amazonvideo.com/gfwlist\nserver=/fbjav.com/127.0.0.1#5335\nipset=/fbjav.com/gfwlist\nserver=/docleradn.com/127.0.0.1#5335\nipset=/docleradn.com/gfwlist\nserver=/airmax360.com/127.0.0.1#5335\nipset=/airmax360.com/gfwlist\nserver=/xn--pearsonenespaol-brb.com/127.0.0.1#5335\nipset=/xn--pearsonenespaol-brb.com/gfwlist\nserver=/hpeventcenter.com/127.0.0.1#5335\nipset=/hpeventcenter.com/gfwlist\nserver=/apple.co/127.0.0.1#5335\nipset=/apple.co/gfwlist\nserver=/18porno.tv/127.0.0.1#5335\nipset=/18porno.tv/gfwlist\nserver=/r18.com/127.0.0.1#5335\nipset=/r18.com/gfwlist\nserver=/starbucks.co.nz/127.0.0.1#5335\nipset=/starbucks.co.nz/gfwlist\nserver=/justlesbianpussy.com/127.0.0.1#5335\nipset=/justlesbianpussy.com/gfwlist\nserver=/noc.syosetu.com/127.0.0.1#5335\nipset=/noc.syosetu.com/gfwlist\nserver=/certificate-transparency.org/127.0.0.1#5335\nipset=/certificate-transparency.org/gfwlist\nserver=/snapads.com/127.0.0.1#5335\nipset=/snapads.com/gfwlist\nserver=/txdirectv.com/127.0.0.1#5335\nipset=/txdirectv.com/gfwlist\nserver=/youflix.is/127.0.0.1#5335\nipset=/youflix.is/gfwlist\nserver=/foxsports.com.co/127.0.0.1#5335\nipset=/foxsports.com.co/gfwlist\nserver=/bmw.lv/127.0.0.1#5335\nipset=/bmw.lv/gfwlist\nserver=/rmbl.ws/127.0.0.1#5335\nipset=/rmbl.ws/gfwlist\nserver=/myfoxla.com/127.0.0.1#5335\nipset=/myfoxla.com/gfwlist\nserver=/microsoftteams.com/127.0.0.1#5335\nipset=/microsoftteams.com/gfwlist\nserver=/harica.gr/127.0.0.1#5335\nipset=/harica.gr/gfwlist\nserver=/visa.com.mx/127.0.0.1#5335\nipset=/visa.com.mx/gfwlist\nserver=/readthedocs.com/127.0.0.1#5335\nipset=/readthedocs.com/gfwlist\nserver=/uug26.com/127.0.0.1#5335\nipset=/uug26.com/gfwlist\nserver=/bmw-motorrad.pl/127.0.0.1#5335\nipset=/bmw-motorrad.pl/gfwlist\nserver=/akamam.com/127.0.0.1#5335\nipset=/akamam.com/gfwlist\nserver=/redtube9.com/127.0.0.1#5335\nipset=/redtube9.com/gfwlist\nserver=/mycardbenefits.com/127.0.0.1#5335\nipset=/mycardbenefits.com/gfwlist\nserver=/leecountytimes.com/127.0.0.1#5335\nipset=/leecountytimes.com/gfwlist\nserver=/sexasia.net/127.0.0.1#5335\nipset=/sexasia.net/gfwlist\nserver=/mcrouter.net/127.0.0.1#5335\nipset=/mcrouter.net/gfwlist\nserver=/bloomberg.tv/127.0.0.1#5335\nipset=/bloomberg.tv/gfwlist\nserver=/lagranepoca.com/127.0.0.1#5335\nipset=/lagranepoca.com/gfwlist\nserver=/ikea.es/127.0.0.1#5335\nipset=/ikea.es/gfwlist\nserver=/n0vadesktop.com/127.0.0.1#5335\nipset=/n0vadesktop.com/gfwlist\nserver=/google.tl/127.0.0.1#5335\nipset=/google.tl/gfwlist\nserver=/disneyjuniortreataday.com/127.0.0.1#5335\nipset=/disneyjuniortreataday.com/gfwlist\nserver=/minidealer.com/127.0.0.1#5335\nipset=/minidealer.com/gfwlist\nserver=/webex.es/127.0.0.1#5335\nipset=/webex.es/gfwlist\nserver=/intelemeastore.com/127.0.0.1#5335\nipset=/intelemeastore.com/gfwlist\nserver=/nlt-media.com/127.0.0.1#5335\nipset=/nlt-media.com/gfwlist\nserver=/pinterest.uk/127.0.0.1#5335\nipset=/pinterest.uk/gfwlist\nserver=/avsforum.com/127.0.0.1#5335\nipset=/avsforum.com/gfwlist\nserver=/cnnlabs.com/127.0.0.1#5335\nipset=/cnnlabs.com/gfwlist\nserver=/sexmomsex.com/127.0.0.1#5335\nipset=/sexmomsex.com/gfwlist\nserver=/mbheadphone.com/127.0.0.1#5335\nipset=/mbheadphone.com/gfwlist\nserver=/xn--gtvq61aiijy0b.xn--hxt814e/127.0.0.1#5335\nipset=/xn--gtvq61aiijy0b.xn--hxt814e/gfwlist\nserver=/buynikechina.com/127.0.0.1#5335\nipset=/buynikechina.com/gfwlist\nserver=/durex.com.my/127.0.0.1#5335\nipset=/durex.com.my/gfwlist\nserver=/pearsonhighered.com/127.0.0.1#5335\nipset=/pearsonhighered.com/gfwlist\nserver=/dongtaiwang.com/127.0.0.1#5335\nipset=/dongtaiwang.com/gfwlist\nserver=/visualstudio.com/127.0.0.1#5335\nipset=/visualstudio.com/gfwlist\nserver=/ikea.co.ph/127.0.0.1#5335\nipset=/ikea.co.ph/gfwlist\nserver=/jiyou520.com/127.0.0.1#5335\nipset=/jiyou520.com/gfwlist\nserver=/pocketcasts.com/127.0.0.1#5335\nipset=/pocketcasts.com/gfwlist\nserver=/ero-labs.com/127.0.0.1#5335\nipset=/ero-labs.com/gfwlist\nserver=/immxd.com/127.0.0.1#5335\nipset=/immxd.com/gfwlist\nserver=/bmw.com.ky/127.0.0.1#5335\nipset=/bmw.com.ky/gfwlist\nserver=/hooligapps.com/127.0.0.1#5335\nipset=/hooligapps.com/gfwlist\nserver=/embase.com/127.0.0.1#5335\nipset=/embase.com/gfwlist\nserver=/3dadultgames.net/127.0.0.1#5335\nipset=/3dadultgames.net/gfwlist\nserver=/amazon.com/127.0.0.1#5335\nipset=/amazon.com/gfwlist\nserver=/cheapbeatsbydremonster.com/127.0.0.1#5335\nipset=/cheapbeatsbydremonster.com/gfwlist\nserver=/fastly.com/127.0.0.1#5335\nipset=/fastly.com/gfwlist\nserver=/wwwfacebok.com/127.0.0.1#5335\nipset=/wwwfacebok.com/gfwlist\nserver=/drebeats-singaporecheap.net/127.0.0.1#5335\nipset=/drebeats-singaporecheap.net/gfwlist\nserver=/hcomic.net/127.0.0.1#5335\nipset=/hcomic.net/gfwlist\nserver=/dlib.eastview.com/127.0.0.1#5335\nipset=/dlib.eastview.com/gfwlist\nserver=/masseffect.com/127.0.0.1#5335\nipset=/masseffect.com/gfwlist\nserver=/ducksear.ch/127.0.0.1#5335\nipset=/ducksear.ch/gfwlist\nserver=/passion-hd.com/127.0.0.1#5335\nipset=/passion-hd.com/gfwlist\nserver=/secret-flirt-hub.com/127.0.0.1#5335\nipset=/secret-flirt-hub.com/gfwlist\nserver=/minirichmond.com/127.0.0.1#5335\nipset=/minirichmond.com/gfwlist\nserver=/google.lu/127.0.0.1#5335\nipset=/google.lu/gfwlist\nserver=/alibabacloud.com.my/127.0.0.1#5335\nipset=/alibabacloud.com.my/gfwlist\nserver=/veet.be/127.0.0.1#5335\nipset=/veet.be/gfwlist\nserver=/alteraforum.com/127.0.0.1#5335\nipset=/alteraforum.com/gfwlist\nserver=/shahvatsaraa.com/127.0.0.1#5335\nipset=/shahvatsaraa.com/gfwlist\nserver=/xxxcomics.org/127.0.0.1#5335\nipset=/xxxcomics.org/gfwlist\nserver=/porzo.tv/127.0.0.1#5335\nipset=/porzo.tv/gfwlist\nserver=/sovec.net/127.0.0.1#5335\nipset=/sovec.net/gfwlist\nserver=/stupidcams.com/127.0.0.1#5335\nipset=/stupidcams.com/gfwlist\nserver=/carekit.org/127.0.0.1#5335\nipset=/carekit.org/gfwlist\nserver=/apple.hu/127.0.0.1#5335\nipset=/apple.hu/gfwlist\nserver=/o2action.co.kr/127.0.0.1#5335\nipset=/o2action.co.kr/gfwlist\nserver=/minisaskatoon.com/127.0.0.1#5335\nipset=/minisaskatoon.com/gfwlist\nserver=/nflximg.net/127.0.0.1#5335\nipset=/nflximg.net/gfwlist\nserver=/hentai2games.com/127.0.0.1#5335\nipset=/hentai2games.com/gfwlist\nserver=/avn.com/127.0.0.1#5335\nipset=/avn.com/gfwlist\nserver=/google.by/127.0.0.1#5335\nipset=/google.by/gfwlist\nserver=/abellalist.com/127.0.0.1#5335\nipset=/abellalist.com/gfwlist\nserver=/dkcloud.cc/127.0.0.1#5335\nipset=/dkcloud.cc/gfwlist\nserver=/mudvod.tv/127.0.0.1#5335\nipset=/mudvod.tv/gfwlist\nserver=/wasdj.com/127.0.0.1#5335\nipset=/wasdj.com/gfwlist\nserver=/myhentaigallery.com/127.0.0.1#5335\nipset=/myhentaigallery.com/gfwlist\nserver=/swingerpornfun.com/127.0.0.1#5335\nipset=/swingerpornfun.com/gfwlist\nserver=/shahvani.site/127.0.0.1#5335\nipset=/shahvani.site/gfwlist\nserver=/naughtysophie.com/127.0.0.1#5335\nipset=/naughtysophie.com/gfwlist\nserver=/smartonesolutions.hk/127.0.0.1#5335\nipset=/smartonesolutions.hk/gfwlist\nserver=/minihalifax.com/127.0.0.1#5335\nipset=/minihalifax.com/gfwlist\nserver=/firestonecomercial.co.cr/127.0.0.1#5335\nipset=/firestonecomercial.co.cr/gfwlist\nserver=/onlyfreelatinaporn.com/127.0.0.1#5335\nipset=/onlyfreelatinaporn.com/gfwlist\nserver=/cairnspost.com.au/127.0.0.1#5335\nipset=/cairnspost.com.au/gfwlist\nserver=/easy.ac/127.0.0.1#5335\nipset=/easy.ac/gfwlist\nserver=/hugesex.tv/127.0.0.1#5335\nipset=/hugesex.tv/gfwlist\nserver=/opengraphprotocol.org/127.0.0.1#5335\nipset=/opengraphprotocol.org/gfwlist\nserver=/vilavpn.xyz/127.0.0.1#5335\nipset=/vilavpn.xyz/gfwlist\nserver=/pornsoldiers.com/127.0.0.1#5335\nipset=/pornsoldiers.com/gfwlist\nserver=/firestoneip.com/127.0.0.1#5335\nipset=/firestoneip.com/gfwlist\nserver=/ocul.us/127.0.0.1#5335\nipset=/ocul.us/gfwlist\nserver=/microsoftcloudsummit.com/127.0.0.1#5335\nipset=/microsoftcloudsummit.com/gfwlist\nserver=/hplipopensource.com/127.0.0.1#5335\nipset=/hplipopensource.com/gfwlist\nserver=/zoofilianet.com/127.0.0.1#5335\nipset=/zoofilianet.com/gfwlist\nserver=/intel.ua/127.0.0.1#5335\nipset=/intel.ua/gfwlist\nserver=/eroprofile.com/127.0.0.1#5335\nipset=/eroprofile.com/gfwlist\nserver=/xn--xsq421m.com/127.0.0.1#5335\nipset=/xn--xsq421m.com/gfwlist\nserver=/eromanga-mainichi.com/127.0.0.1#5335\nipset=/eromanga-mainichi.com/gfwlist\nserver=/facebooksite.net/127.0.0.1#5335\nipset=/facebooksite.net/gfwlist\nserver=/javcc.cc/127.0.0.1#5335\nipset=/javcc.cc/gfwlist\nserver=/gimy.cc/127.0.0.1#5335\nipset=/gimy.cc/gfwlist\nserver=/honkaiimpact3.com/127.0.0.1#5335\nipset=/honkaiimpact3.com/gfwlist\nserver=/line.me/127.0.0.1#5335\nipset=/line.me/gfwlist\nserver=/plumperpass.com/127.0.0.1#5335\nipset=/plumperpass.com/gfwlist\nserver=/durex.no/127.0.0.1#5335\nipset=/durex.no/gfwlist\nserver=/abema-tv.com/127.0.0.1#5335\nipset=/abema-tv.com/gfwlist\nserver=/sony.cz/127.0.0.1#5335\nipset=/sony.cz/gfwlist\nserver=/porndex.com/127.0.0.1#5335\nipset=/porndex.com/gfwlist\nserver=/faecebok.com/127.0.0.1#5335\nipset=/faecebok.com/gfwlist\nserver=/e-goods.ru/127.0.0.1#5335\nipset=/e-goods.ru/gfwlist\nserver=/boslife.biz/127.0.0.1#5335\nipset=/boslife.biz/gfwlist\nserver=/onepornlist.com/127.0.0.1#5335\nipset=/onepornlist.com/gfwlist\nserver=/ntdtv-dc.com/127.0.0.1#5335\nipset=/ntdtv-dc.com/gfwlist\nserver=/pornzog.com/127.0.0.1#5335\nipset=/pornzog.com/gfwlist\nserver=/disneymagicmoments.co.uk/127.0.0.1#5335\nipset=/disneymagicmoments.co.uk/gfwlist\nserver=/astm.org/127.0.0.1#5335\nipset=/astm.org/gfwlist\nserver=/gofucker.com/127.0.0.1#5335\nipset=/gofucker.com/gfwlist\nserver=/intramuscularinjection.info/127.0.0.1#5335\nipset=/intramuscularinjection.info/gfwlist\nserver=/camerfirma.com/127.0.0.1#5335\nipset=/camerfirma.com/gfwlist\nserver=/sony.com.hk/127.0.0.1#5335\nipset=/sony.com.hk/gfwlist\nserver=/ebayinc.net/127.0.0.1#5335\nipset=/ebayinc.net/gfwlist\nserver=/lesbiansubmission.com/127.0.0.1#5335\nipset=/lesbiansubmission.com/gfwlist\nserver=/paypa1.com/127.0.0.1#5335\nipset=/paypa1.com/gfwlist\nserver=/pctlwm.com/127.0.0.1#5335\nipset=/pctlwm.com/gfwlist\nserver=/volvogroup.ru/127.0.0.1#5335\nipset=/volvogroup.ru/gfwlist\nserver=/pearsonassessment.se/127.0.0.1#5335\nipset=/pearsonassessment.se/gfwlist\nserver=/ifuckedmy.mom/127.0.0.1#5335\nipset=/ifuckedmy.mom/gfwlist\nserver=/chimeforchange.org/127.0.0.1#5335\nipset=/chimeforchange.org/gfwlist\nserver=/intelrxt.com/127.0.0.1#5335\nipset=/intelrxt.com/gfwlist\nserver=/oneocsp.microsoft.com/127.0.0.1#5335\nipset=/oneocsp.microsoft.com/gfwlist\nserver=/hilostripper.com/127.0.0.1#5335\nipset=/hilostripper.com/gfwlist\nserver=/txxx1.com/127.0.0.1#5335\nipset=/txxx1.com/gfwlist\nserver=/signalbar.com/127.0.0.1#5335\nipset=/signalbar.com/gfwlist\nserver=/rule34.world/127.0.0.1#5335\nipset=/rule34.world/gfwlist\nserver=/goodreads.com/127.0.0.1#5335\nipset=/goodreads.com/gfwlist\nserver=/hairypornsite.com/127.0.0.1#5335\nipset=/hairypornsite.com/gfwlist\nserver=/beatsincanada.com/127.0.0.1#5335\nipset=/beatsincanada.com/gfwlist\nserver=/thebayuk.com/127.0.0.1#5335\nipset=/thebayuk.com/gfwlist\nserver=/ebaymarketplace.net/127.0.0.1#5335\nipset=/ebaymarketplace.net/gfwlist\nserver=/localizestatus.com/127.0.0.1#5335\nipset=/localizestatus.com/gfwlist\nserver=/thotvids.com/127.0.0.1#5335\nipset=/thotvids.com/gfwlist\nserver=/erogazo-jp.net/127.0.0.1#5335\nipset=/erogazo-jp.net/gfwlist\nserver=/akaint.net/127.0.0.1#5335\nipset=/akaint.net/gfwlist\nserver=/acm.org/127.0.0.1#5335\nipset=/acm.org/gfwlist\nserver=/whyiwantciscotelepresence.com/127.0.0.1#5335\nipset=/whyiwantciscotelepresence.com/gfwlist\nserver=/awetv.com/127.0.0.1#5335\nipset=/awetv.com/gfwlist\nserver=/sensueel.net/127.0.0.1#5335\nipset=/sensueel.net/gfwlist\nserver=/eprc.com.hk/127.0.0.1#5335\nipset=/eprc.com.hk/gfwlist\nserver=/youtube-nocookie.com/127.0.0.1#5335\nipset=/youtube-nocookie.com/gfwlist\nserver=/paypal-login.com/127.0.0.1#5335\nipset=/paypal-login.com/gfwlist\nserver=/macbook.wang/127.0.0.1#5335\nipset=/macbook.wang/gfwlist\nserver=/xn--4vq475g.com/127.0.0.1#5335\nipset=/xn--4vq475g.com/gfwlist\nserver=/ikea.sk/127.0.0.1#5335\nipset=/ikea.sk/gfwlist\nserver=/xxxscenes.net/127.0.0.1#5335\nipset=/xxxscenes.net/gfwlist\nserver=/mini.com.pe/127.0.0.1#5335\nipset=/mini.com.pe/gfwlist\nserver=/codeish.io/127.0.0.1#5335\nipset=/codeish.io/gfwlist\nserver=/hpcatridge.com/127.0.0.1#5335\nipset=/hpcatridge.com/gfwlist\nserver=/yahoo.st/127.0.0.1#5335\nipset=/yahoo.st/gfwlist\nserver=/starbuckssummergame.com/127.0.0.1#5335\nipset=/starbuckssummergame.com/gfwlist\nserver=/adultfriendfinder.com/127.0.0.1#5335\nipset=/adultfriendfinder.com/gfwlist\nserver=/showup.tv/127.0.0.1#5335\nipset=/showup.tv/gfwlist\nserver=/daretoku-eromanga.info/127.0.0.1#5335\nipset=/daretoku-eromanga.info/gfwlist\nserver=/wowpornlist.xyz/127.0.0.1#5335\nipset=/wowpornlist.xyz/gfwlist\nserver=/justpicsplease.com/127.0.0.1#5335\nipset=/justpicsplease.com/gfwlist\nserver=/readthedocs.io/127.0.0.1#5335\nipset=/readthedocs.io/gfwlist\nserver=/zoho.com.au/127.0.0.1#5335\nipset=/zoho.com.au/gfwlist\nserver=/sonykigyo.jp/127.0.0.1#5335\nipset=/sonykigyo.jp/gfwlist\nserver=/vscode.blob.core.windows.net/127.0.0.1#5335\nipset=/vscode.blob.core.windows.net/gfwlist\nserver=/ve-dash-uk-live.akamaized.net/127.0.0.1#5335\nipset=/ve-dash-uk-live.akamaized.net/gfwlist\nserver=/qualcomm.sc.omtrdc.net/127.0.0.1#5335\nipset=/qualcomm.sc.omtrdc.net/gfwlist\nserver=/teenagefucking.com/127.0.0.1#5335\nipset=/teenagefucking.com/gfwlist\nserver=/intel.uz/127.0.0.1#5335\nipset=/intel.uz/gfwlist\nserver=/facebook.shop/127.0.0.1#5335\nipset=/facebook.shop/gfwlist\nserver=/edcity.hk/127.0.0.1#5335\nipset=/edcity.hk/gfwlist\nserver=/5278.cc/127.0.0.1#5335\nipset=/5278.cc/gfwlist\nserver=/nbys.tv/127.0.0.1#5335\nipset=/nbys.tv/gfwlist\nserver=/youtubecisco.com/127.0.0.1#5335\nipset=/youtubecisco.com/gfwlist\nserver=/animezilla.com/127.0.0.1#5335\nipset=/animezilla.com/gfwlist\nserver=/fundinginstitutional.com/127.0.0.1#5335\nipset=/fundinginstitutional.com/gfwlist\nserver=/metart.com/127.0.0.1#5335\nipset=/metart.com/gfwlist\nserver=/httpsfacebook.com/127.0.0.1#5335\nipset=/httpsfacebook.com/gfwlist\nserver=/icegay.tv/127.0.0.1#5335\nipset=/icegay.tv/gfwlist\nserver=/animal-porn.net/127.0.0.1#5335\nipset=/animal-porn.net/gfwlist\nserver=/airwick.co.uk/127.0.0.1#5335\nipset=/airwick.co.uk/gfwlist\nserver=/beatsbysdrbre.com/127.0.0.1#5335\nipset=/beatsbysdrbre.com/gfwlist\nserver=/fblitho.com/127.0.0.1#5335\nipset=/fblitho.com/gfwlist\nserver=/iphonehangzhou.com/127.0.0.1#5335\nipset=/iphonehangzhou.com/gfwlist\nserver=/orientalasianporn.com/127.0.0.1#5335\nipset=/orientalasianporn.com/gfwlist\nserver=/av11.org/127.0.0.1#5335\nipset=/av11.org/gfwlist\nserver=/alphabet.com.mx/127.0.0.1#5335\nipset=/alphabet.com.mx/gfwlist\nserver=/goduckgo.com/127.0.0.1#5335\nipset=/goduckgo.com/gfwlist\nserver=/18-teen-porn.com/127.0.0.1#5335\nipset=/18-teen-porn.com/gfwlist\nserver=/pornofint.com/127.0.0.1#5335\nipset=/pornofint.com/gfwlist\nserver=/gfjizz.com/127.0.0.1#5335\nipset=/gfjizz.com/gfwlist\nserver=/monsterbeats-cheap.com/127.0.0.1#5335\nipset=/monsterbeats-cheap.com/gfwlist\nserver=/pinterest.info/127.0.0.1#5335\nipset=/pinterest.info/gfwlist\nserver=/azuredevopslaunch.com/127.0.0.1#5335\nipset=/azuredevopslaunch.com/gfwlist\nserver=/volvotrucks.se/127.0.0.1#5335\nipset=/volvotrucks.se/gfwlist\nserver=/otaku-168.com/127.0.0.1#5335\nipset=/otaku-168.com/gfwlist\nserver=/mini.mu/127.0.0.1#5335\nipset=/mini.mu/gfwlist\nserver=/bioone.org/127.0.0.1#5335\nipset=/bioone.org/gfwlist\nserver=/cnnamador.com/127.0.0.1#5335\nipset=/cnnamador.com/gfwlist\nserver=/hentai3dvideo.biz/127.0.0.1#5335\nipset=/hentai3dvideo.biz/gfwlist\nserver=/biowarestore.com/127.0.0.1#5335\nipset=/biowarestore.com/gfwlist\nserver=/veet.fr/127.0.0.1#5335\nipset=/veet.fr/gfwlist\nserver=/lolibus.cc/127.0.0.1#5335\nipset=/lolibus.cc/gfwlist\nserver=/fetishpapa.com/127.0.0.1#5335\nipset=/fetishpapa.com/gfwlist\nserver=/linkjunkies.com/127.0.0.1#5335\nipset=/linkjunkies.com/gfwlist\nserver=/inoreader.com/127.0.0.1#5335\nipset=/inoreader.com/gfwlist\nserver=/go-gaytube.com/127.0.0.1#5335\nipset=/go-gaytube.com/gfwlist\nserver=/kindle.in/127.0.0.1#5335\nipset=/kindle.in/gfwlist\nserver=/dandalinvoa.com/127.0.0.1#5335\nipset=/dandalinvoa.com/gfwlist\nserver=/cygames.jp/127.0.0.1#5335\nipset=/cygames.jp/gfwlist\nserver=/alt3-mtalk.google.com/127.0.0.1#5335\nipset=/alt3-mtalk.google.com/gfwlist\nserver=/hentai69.online/127.0.0.1#5335\nipset=/hentai69.online/gfwlist\nserver=/metacloud.com/127.0.0.1#5335\nipset=/metacloud.com/gfwlist\nserver=/weav.xyz/127.0.0.1#5335\nipset=/weav.xyz/gfwlist\nserver=/facebooklogs.com/127.0.0.1#5335\nipset=/facebooklogs.com/gfwlist\nserver=/uun82.com/127.0.0.1#5335\nipset=/uun82.com/gfwlist\nserver=/audio-ak-spotify-com.akamaized.net/127.0.0.1#5335\nipset=/audio-ak-spotify-com.akamaized.net/gfwlist\nserver=/xn--xsq605n.com/127.0.0.1#5335\nipset=/xn--xsq605n.com/gfwlist\nserver=/beatsboxingdayuksale.com/127.0.0.1#5335\nipset=/beatsboxingdayuksale.com/gfwlist\nserver=/apple.lk/127.0.0.1#5335\nipset=/apple.lk/gfwlist\nserver=/vmwhorizonair.com/127.0.0.1#5335\nipset=/vmwhorizonair.com/gfwlist\nserver=/akamaisingapore.net/127.0.0.1#5335\nipset=/akamaisingapore.net/gfwlist\nserver=/sukebei.nyaa.si/127.0.0.1#5335\nipset=/sukebei.nyaa.si/gfwlist\nserver=/youtube.ni/127.0.0.1#5335\nipset=/youtube.ni/gfwlist\nserver=/femdomcc.net/127.0.0.1#5335\nipset=/femdomcc.net/gfwlist\nserver=/abc-studios.com/127.0.0.1#5335\nipset=/abc-studios.com/gfwlist\nserver=/cheapbeatsbydreoutlet.com/127.0.0.1#5335\nipset=/cheapbeatsbydreoutlet.com/gfwlist\nserver=/nvidia.jp/127.0.0.1#5335\nipset=/nvidia.jp/gfwlist\nserver=/nvidia.com.pl/127.0.0.1#5335\nipset=/nvidia.com.pl/gfwlist\nserver=/travelex.com.au/127.0.0.1#5335\nipset=/travelex.com.au/gfwlist\nserver=/gnews.org/127.0.0.1#5335\nipset=/gnews.org/gfwlist\nserver=/eboobstore.com/127.0.0.1#5335\nipset=/eboobstore.com/gfwlist\nserver=/vanish.com.br/127.0.0.1#5335\nipset=/vanish.com.br/gfwlist\nserver=/swiftbank.us/127.0.0.1#5335\nipset=/swiftbank.us/gfwlist\nserver=/naver.jp/127.0.0.1#5335\nipset=/naver.jp/gfwlist\nserver=/google.se/127.0.0.1#5335\nipset=/google.se/gfwlist\nserver=/dawngate.com/127.0.0.1#5335\nipset=/dawngate.com/gfwlist\nserver=/icloud.de/127.0.0.1#5335\nipset=/icloud.de/gfwlist\nserver=/mini.be/127.0.0.1#5335\nipset=/mini.be/gfwlist\nserver=/illusionn4.com/127.0.0.1#5335\nipset=/illusionn4.com/gfwlist\nserver=/pornmd.com/127.0.0.1#5335\nipset=/pornmd.com/gfwlist\nserver=/stufferdb.com/127.0.0.1#5335\nipset=/stufferdb.com/gfwlist\nserver=/ebaybank.com/127.0.0.1#5335\nipset=/ebaybank.com/gfwlist\nserver=/porn-list.site/127.0.0.1#5335\nipset=/porn-list.site/gfwlist\nserver=/foxbusiness.tv/127.0.0.1#5335\nipset=/foxbusiness.tv/gfwlist\nserver=/quickiepage.com/127.0.0.1#5335\nipset=/quickiepage.com/gfwlist\nserver=/gettyimages.co.nz/127.0.0.1#5335\nipset=/gettyimages.co.nz/gfwlist\nserver=/doujin-freee.com/127.0.0.1#5335\nipset=/doujin-freee.com/gfwlist\nserver=/illusionn5.com/127.0.0.1#5335\nipset=/illusionn5.com/gfwlist\nserver=/sankei-ad-info.com/127.0.0.1#5335\nipset=/sankei-ad-info.com/gfwlist\nserver=/applelink.com/127.0.0.1#5335\nipset=/applelink.com/gfwlist\nserver=/nyahentai.re/127.0.0.1#5335\nipset=/nyahentai.re/gfwlist\nserver=/youtube.co.ug/127.0.0.1#5335\nipset=/youtube.co.ug/gfwlist\nserver=/youtube.pt/127.0.0.1#5335\nipset=/youtube.pt/gfwlist\nserver=/nikebetterworld.info/127.0.0.1#5335\nipset=/nikebetterworld.info/gfwlist\nserver=/bmwmontreal.ca/127.0.0.1#5335\nipset=/bmwmontreal.ca/gfwlist\nserver=/dollarphotoclub.com/127.0.0.1#5335\nipset=/dollarphotoclub.com/gfwlist\nserver=/jenkins.io/127.0.0.1#5335\nipset=/jenkins.io/gfwlist\nserver=/volvotruckcenter.kz/127.0.0.1#5335\nipset=/volvotruckcenter.kz/gfwlist\nserver=/bestbuybusinessadvantageaccount.com/127.0.0.1#5335\nipset=/bestbuybusinessadvantageaccount.com/gfwlist\nserver=/lineshoppingseller.com/127.0.0.1#5335\nipset=/lineshoppingseller.com/gfwlist\nserver=/kumo.com/127.0.0.1#5335\nipset=/kumo.com/gfwlist\nserver=/visacards.com/127.0.0.1#5335\nipset=/visacards.com/gfwlist\nserver=/nab.demdex.net/127.0.0.1#5335\nipset=/nab.demdex.net/gfwlist\nserver=/jibemobile.com/127.0.0.1#5335\nipset=/jibemobile.com/gfwlist\nserver=/wheelworks.net/127.0.0.1#5335\nipset=/wheelworks.net/gfwlist\nserver=/businessinsider.jp/127.0.0.1#5335\nipset=/businessinsider.jp/gfwlist\nserver=/boxofficemojo.com/127.0.0.1#5335\nipset=/boxofficemojo.com/gfwlist\nserver=/m2m.com/127.0.0.1#5335\nipset=/m2m.com/gfwlist\nserver=/lightbridge.com/127.0.0.1#5335\nipset=/lightbridge.com/gfwlist\nserver=/momsexypics.com/127.0.0.1#5335\nipset=/momsexypics.com/gfwlist\nserver=/fury.co/127.0.0.1#5335\nipset=/fury.co/gfwlist\nserver=/topchats.com/127.0.0.1#5335\nipset=/topchats.com/gfwlist\nserver=/xl-gaytube.com/127.0.0.1#5335\nipset=/xl-gaytube.com/gfwlist\nserver=/szcheapmonsterheadphones.com/127.0.0.1#5335\nipset=/szcheapmonsterheadphones.com/gfwlist\nserver=/visa.com.py/127.0.0.1#5335\nipset=/visa.com.py/gfwlist\nserver=/dettol.com.hk/127.0.0.1#5335\nipset=/dettol.com.hk/gfwlist\nserver=/dettolsitishield.co.in/127.0.0.1#5335\nipset=/dettolsitishield.co.in/gfwlist\nserver=/hightopnikes.com/127.0.0.1#5335\nipset=/hightopnikes.com/gfwlist\nserver=/ebay-delivery.com/127.0.0.1#5335\nipset=/ebay-delivery.com/gfwlist\nserver=/bmw-motorrad.com.py/127.0.0.1#5335\nipset=/bmw-motorrad.com.py/gfwlist\nserver=/bmw.vn/127.0.0.1#5335\nipset=/bmw.vn/gfwlist\nserver=/hellokittybeats.com/127.0.0.1#5335\nipset=/hellokittybeats.com/gfwlist\nserver=/apple.dk/127.0.0.1#5335\nipset=/apple.dk/gfwlist\nserver=/topexhib.net/127.0.0.1#5335\nipset=/topexhib.net/gfwlist\nserver=/hentaiera.com/127.0.0.1#5335\nipset=/hentaiera.com/gfwlist\nserver=/svensksexfilm.com/127.0.0.1#5335\nipset=/svensksexfilm.com/gfwlist\nserver=/citizenlab.ca/127.0.0.1#5335\nipset=/citizenlab.ca/gfwlist\nserver=/pornacho.com/127.0.0.1#5335\nipset=/pornacho.com/gfwlist\nserver=/doujinfree.com/127.0.0.1#5335\nipset=/doujinfree.com/gfwlist\nserver=/xn--gogl-0nd52e.com/127.0.0.1#5335\nipset=/xn--gogl-0nd52e.com/gfwlist\nserver=/ceicdata.com/127.0.0.1#5335\nipset=/ceicdata.com/gfwlist\nserver=/thomsonreuters.cn/127.0.0.1#5335\nipset=/thomsonreuters.cn/gfwlist\nserver=/lesboerotica.net/127.0.0.1#5335\nipset=/lesboerotica.net/gfwlist\nserver=/youtube.sv/127.0.0.1#5335\nipset=/youtube.sv/gfwlist\nserver=/pakistanporntube.net/127.0.0.1#5335\nipset=/pakistanporntube.net/gfwlist\nserver=/alhs.link/127.0.0.1#5335\nipset=/alhs.link/gfwlist\nserver=/ignites.com/127.0.0.1#5335\nipset=/ignites.com/gfwlist\nserver=/ikea.ph/127.0.0.1#5335\nipset=/ikea.ph/gfwlist\nserver=/duckduckgo.ca/127.0.0.1#5335\nipset=/duckduckgo.ca/gfwlist\nserver=/xvideos.com/127.0.0.1#5335\nipset=/xvideos.com/gfwlist\nserver=/youtube.bg/127.0.0.1#5335\nipset=/youtube.bg/gfwlist\nserver=/getadblock.com/127.0.0.1#5335\nipset=/getadblock.com/gfwlist\nserver=/hentai.pro/127.0.0.1#5335\nipset=/hentai.pro/gfwlist\nserver=/bmw-corporate-sales.com/127.0.0.1#5335\nipset=/bmw-corporate-sales.com/gfwlist\nserver=/amateursecrets.net/127.0.0.1#5335\nipset=/amateursecrets.net/gfwlist\nserver=/shopfacebook.com/127.0.0.1#5335\nipset=/shopfacebook.com/gfwlist\nserver=/mypornbookmarks.com/127.0.0.1#5335\nipset=/mypornbookmarks.com/gfwlist\nserver=/bigboobsalert.com/127.0.0.1#5335\nipset=/bigboobsalert.com/gfwlist\nserver=/nudeandhairy.com/127.0.0.1#5335\nipset=/nudeandhairy.com/gfwlist\nserver=/githubpreview.dev/127.0.0.1#5335\nipset=/githubpreview.dev/gfwlist\nserver=/pornopantry.com/127.0.0.1#5335\nipset=/pornopantry.com/gfwlist\nserver=/baselinestudy.com/127.0.0.1#5335\nipset=/baselinestudy.com/gfwlist\nserver=/braventures.com/127.0.0.1#5335\nipset=/braventures.com/gfwlist\nserver=/disney.ru/127.0.0.1#5335\nipset=/disney.ru/gfwlist\nserver=/xxvideoss.org/127.0.0.1#5335\nipset=/xxvideoss.org/gfwlist\nserver=/conan.xxx/127.0.0.1#5335\nipset=/conan.xxx/gfwlist\nserver=/findmyipad.com/127.0.0.1#5335\nipset=/findmyipad.com/gfwlist\nserver=/flickr.com/127.0.0.1#5335\nipset=/flickr.com/gfwlist\nserver=/ipod.co.za/127.0.0.1#5335\nipset=/ipod.co.za/gfwlist\nserver=/iwantmature.com/127.0.0.1#5335\nipset=/iwantmature.com/gfwlist\nserver=/hclips.com/127.0.0.1#5335\nipset=/hclips.com/gfwlist\nserver=/macosxlion.com/127.0.0.1#5335\nipset=/macosxlion.com/gfwlist\nserver=/dartpad.dev/127.0.0.1#5335\nipset=/dartpad.dev/gfwlist\nserver=/applewatchsport.com/127.0.0.1#5335\nipset=/applewatchsport.com/gfwlist\nserver=/wifesharingpics.com/127.0.0.1#5335\nipset=/wifesharingpics.com/gfwlist\nserver=/google.com.np/127.0.0.1#5335\nipset=/google.com.np/gfwlist\nserver=/googil.com/127.0.0.1#5335\nipset=/googil.com/gfwlist\nserver=/cloudinary.com/127.0.0.1#5335\nipset=/cloudinary.com/gfwlist\nserver=/canon.nl/127.0.0.1#5335\nipset=/canon.nl/gfwlist\nserver=/blogspot.com.by/127.0.0.1#5335\nipset=/blogspot.com.by/gfwlist\nserver=/tesla-cdn.thron.com/127.0.0.1#5335\nipset=/tesla-cdn.thron.com/gfwlist\nserver=/braintreegateway.com/127.0.0.1#5335\nipset=/braintreegateway.com/gfwlist\nserver=/zoopornmd.com/127.0.0.1#5335\nipset=/zoopornmd.com/gfwlist\nserver=/fuckmatureporn.com/127.0.0.1#5335\nipset=/fuckmatureporn.com/gfwlist\nserver=/llnw-trials.com/127.0.0.1#5335\nipset=/llnw-trials.com/gfwlist\nserver=/amdfanstore.com/127.0.0.1#5335\nipset=/amdfanstore.com/gfwlist\nserver=/beatsbydressolo.com/127.0.0.1#5335\nipset=/beatsbydressolo.com/gfwlist\nserver=/rarbgaccess.org/127.0.0.1#5335\nipset=/rarbgaccess.org/gfwlist\nserver=/drebeatscanada.com/127.0.0.1#5335\nipset=/drebeatscanada.com/gfwlist\nserver=/nflximg.com/127.0.0.1#5335\nipset=/nflximg.com/gfwlist\nserver=/wholesalediscountpurses.com/127.0.0.1#5335\nipset=/wholesalediscountpurses.com/gfwlist\nserver=/wvm0agb4.me/127.0.0.1#5335\nipset=/wvm0agb4.me/gfwlist\nserver=/debian.org/127.0.0.1#5335\nipset=/debian.org/gfwlist\nserver=/idol-sagasukun.com/127.0.0.1#5335\nipset=/idol-sagasukun.com/gfwlist\nserver=/scpdb.org/127.0.0.1#5335\nipset=/scpdb.org/gfwlist\nserver=/india.com/127.0.0.1#5335\nipset=/india.com/gfwlist\nserver=/vanish.com.mx/127.0.0.1#5335\nipset=/vanish.com.mx/gfwlist\nserver=/page3.com/127.0.0.1#5335\nipset=/page3.com/gfwlist\nserver=/signalprocessingsociety.org/127.0.0.1#5335\nipset=/signalprocessingsociety.org/gfwlist\nserver=/bmwgroupdirect.com/127.0.0.1#5335\nipset=/bmwgroupdirect.com/gfwlist\nserver=/avcrempie.com/127.0.0.1#5335\nipset=/avcrempie.com/gfwlist\nserver=/movefreeoffers.com/127.0.0.1#5335\nipset=/movefreeoffers.com/gfwlist\nserver=/pearsonclinical.ca/127.0.0.1#5335\nipset=/pearsonclinical.ca/gfwlist\nserver=/google.fr/127.0.0.1#5335\nipset=/google.fr/gfwlist\nserver=/foxnewschannel.com/127.0.0.1#5335\nipset=/foxnewschannel.com/gfwlist\nserver=/touhouwiki.net/127.0.0.1#5335\nipset=/touhouwiki.net/gfwlist\nserver=/youtube.it/127.0.0.1#5335\nipset=/youtube.it/gfwlist\nserver=/1lib.education/127.0.0.1#5335\nipset=/1lib.education/gfwlist\nserver=/forbiddenmomsarchive.com/127.0.0.1#5335\nipset=/forbiddenmomsarchive.com/gfwlist\nserver=/animalincum.com/127.0.0.1#5335\nipset=/animalincum.com/gfwlist\nserver=/alphabet.pl/127.0.0.1#5335\nipset=/alphabet.pl/gfwlist\nserver=/alteraforums.com/127.0.0.1#5335\nipset=/alteraforums.com/gfwlist\nserver=/xxxstreams.org/127.0.0.1#5335\nipset=/xxxstreams.org/gfwlist\nserver=/imgix.com/127.0.0.1#5335\nipset=/imgix.com/gfwlist\nserver=/mini-connected.se/127.0.0.1#5335\nipset=/mini-connected.se/gfwlist\nserver=/chubbypornonly.com/127.0.0.1#5335\nipset=/chubbypornonly.com/gfwlist\nserver=/radeon.com/127.0.0.1#5335\nipset=/radeon.com/gfwlist\nserver=/hplaptopbattery.com/127.0.0.1#5335\nipset=/hplaptopbattery.com/gfwlist\nserver=/google.fm/127.0.0.1#5335\nipset=/google.fm/gfwlist\nserver=/hqseek.com/127.0.0.1#5335\nipset=/hqseek.com/gfwlist\nserver=/zeetv.com/127.0.0.1#5335\nipset=/zeetv.com/gfwlist\nserver=/shadowcomplex.com/127.0.0.1#5335\nipset=/shadowcomplex.com/gfwlist\nserver=/get.rsvp/127.0.0.1#5335\nipset=/get.rsvp/gfwlist\nserver=/maturesinhd.com/127.0.0.1#5335\nipset=/maturesinhd.com/gfwlist\nserver=/cheapbeats365.com/127.0.0.1#5335\nipset=/cheapbeats365.com/gfwlist\nserver=/svc.ms/127.0.0.1#5335\nipset=/svc.ms/gfwlist\nserver=/asextube.net/127.0.0.1#5335\nipset=/asextube.net/gfwlist\nserver=/intel.hu/127.0.0.1#5335\nipset=/intel.hu/gfwlist\nserver=/directvcincinnatioh.com/127.0.0.1#5335\nipset=/directvcincinnatioh.com/gfwlist\nserver=/starbucks.ca/127.0.0.1#5335\nipset=/starbucks.ca/gfwlist\nserver=/muryouav.net/127.0.0.1#5335\nipset=/muryouav.net/gfwlist\nserver=/directvcrossvilletn.com/127.0.0.1#5335\nipset=/directvcrossvilletn.com/gfwlist\nserver=/msft.net/127.0.0.1#5335\nipset=/msft.net/gfwlist\nserver=/teensloveanal.com/127.0.0.1#5335\nipset=/teensloveanal.com/gfwlist\nserver=/beats1.tv/127.0.0.1#5335\nipset=/beats1.tv/gfwlist\nserver=/apple-pay.wang/127.0.0.1#5335\nipset=/apple-pay.wang/gfwlist\nserver=/ocsp.microsoft.com/127.0.0.1#5335\nipset=/ocsp.microsoft.com/gfwlist\nserver=/atttvnow.com/127.0.0.1#5335\nipset=/atttvnow.com/gfwlist\nserver=/milofetch.com/127.0.0.1#5335\nipset=/milofetch.com/gfwlist\nserver=/telegram-cdn.org/127.0.0.1#5335\nipset=/telegram-cdn.org/gfwlist\nserver=/researchkit.hk/127.0.0.1#5335\nipset=/researchkit.hk/gfwlist\nserver=/airport.eu/127.0.0.1#5335\nipset=/airport.eu/gfwlist\nserver=/ieeer10.org/127.0.0.1#5335\nipset=/ieeer10.org/gfwlist\nserver=/paramountplus.com/127.0.0.1#5335\nipset=/paramountplus.com/gfwlist\nserver=/nuget.org/127.0.0.1#5335\nipset=/nuget.org/gfwlist\nserver=/bbcpersian.com/127.0.0.1#5335\nipset=/bbcpersian.com/gfwlist\nserver=/idvd.eu/127.0.0.1#5335\nipset=/idvd.eu/gfwlist\nserver=/garena.co.th/127.0.0.1#5335\nipset=/garena.co.th/gfwlist\nserver=/scholar.google.dk/127.0.0.1#5335\nipset=/scholar.google.dk/gfwlist\nserver=/1lib.eu/127.0.0.1#5335\nipset=/1lib.eu/gfwlist\nserver=/intel.ly/127.0.0.1#5335\nipset=/intel.ly/gfwlist\nserver=/ohyeah1080.com/127.0.0.1#5335\nipset=/ohyeah1080.com/gfwlist\nserver=/xxxpornmovs.com/127.0.0.1#5335\nipset=/xxxpornmovs.com/gfwlist\nserver=/czechwifeswap.com/127.0.0.1#5335\nipset=/czechwifeswap.com/gfwlist\nserver=/facebookmanager.info/127.0.0.1#5335\nipset=/facebookmanager.info/gfwlist\nserver=/siska.video/127.0.0.1#5335\nipset=/siska.video/gfwlist\nserver=/4tubefree.net/127.0.0.1#5335\nipset=/4tubefree.net/gfwlist\nserver=/97dounai.top/127.0.0.1#5335\nipset=/97dounai.top/gfwlist\nserver=/wmt.co/127.0.0.1#5335\nipset=/wmt.co/gfwlist\nserver=/attic.io/127.0.0.1#5335\nipset=/attic.io/gfwlist\nserver=/drmario-world.com/127.0.0.1#5335\nipset=/drmario-world.com/gfwlist\nserver=/zingtruyen.net/127.0.0.1#5335\nipset=/zingtruyen.net/gfwlist\nserver=/dctbeatsbydre.com/127.0.0.1#5335\nipset=/dctbeatsbydre.com/gfwlist\nserver=/smm99999.com/127.0.0.1#5335\nipset=/smm99999.com/gfwlist\nserver=/anonproxy.info/127.0.0.1#5335\nipset=/anonproxy.info/gfwlist\nserver=/shopify.com/127.0.0.1#5335\nipset=/shopify.com/gfwlist\nserver=/zndsk.com/127.0.0.1#5335\nipset=/zndsk.com/gfwlist\nserver=/kingstagram.com/127.0.0.1#5335\nipset=/kingstagram.com/gfwlist\nserver=/metaporn.com/127.0.0.1#5335\nipset=/metaporn.com/gfwlist\nserver=/mini.ch/127.0.0.1#5335\nipset=/mini.ch/gfwlist\nserver=/buyitnow.net/127.0.0.1#5335\nipset=/buyitnow.net/gfwlist\nserver=/newsexwap.com/127.0.0.1#5335\nipset=/newsexwap.com/gfwlist\nserver=/blogspot.nl/127.0.0.1#5335\nipset=/blogspot.nl/gfwlist\nserver=/canon.co.za/127.0.0.1#5335\nipset=/canon.co.za/gfwlist\nserver=/aesworkshops.com/127.0.0.1#5335\nipset=/aesworkshops.com/gfwlist\nserver=/danemarket.com/127.0.0.1#5335\nipset=/danemarket.com/gfwlist\nserver=/bmw-world.net/127.0.0.1#5335\nipset=/bmw-world.net/gfwlist\nserver=/pornobrasileiro.tv/127.0.0.1#5335\nipset=/pornobrasileiro.tv/gfwlist\nserver=/tabustudios.co/127.0.0.1#5335\nipset=/tabustudios.co/gfwlist\nserver=/attproxy.com/127.0.0.1#5335\nipset=/attproxy.com/gfwlist\nserver=/hayabusa.dev/127.0.0.1#5335\nipset=/hayabusa.dev/gfwlist\nserver=/yahoo-news.com.hk/127.0.0.1#5335\nipset=/yahoo-news.com.hk/gfwlist\nserver=/hotwifemovies.com/127.0.0.1#5335\nipset=/hotwifemovies.com/gfwlist\nserver=/v2ex.com/127.0.0.1#5335\nipset=/v2ex.com/gfwlist\nserver=/ikea.hr/127.0.0.1#5335\nipset=/ikea.hr/gfwlist\nserver=/hk01.com/127.0.0.1#5335\nipset=/hk01.com/gfwlist\nserver=/boy18tube.com/127.0.0.1#5335\nipset=/boy18tube.com/gfwlist\nserver=/google.com.ua/127.0.0.1#5335\nipset=/google.com.ua/gfwlist\nserver=/hrsaz.com/127.0.0.1#5335\nipset=/hrsaz.com/gfwlist\nserver=/boodigogo.com/127.0.0.1#5335\nipset=/boodigogo.com/gfwlist\nserver=/fsacebok.com/127.0.0.1#5335\nipset=/fsacebok.com/gfwlist\nserver=/beats-bydrecheapsale.com/127.0.0.1#5335\nipset=/beats-bydrecheapsale.com/gfwlist\nserver=/alt8-mtalk.google.com/127.0.0.1#5335\nipset=/alt8-mtalk.google.com/gfwlist\nserver=/facebookpay.com/127.0.0.1#5335\nipset=/facebookpay.com/gfwlist\nserver=/pearson.ch/127.0.0.1#5335\nipset=/pearson.ch/gfwlist\nserver=/intel.ma/127.0.0.1#5335\nipset=/intel.ma/gfwlist\nserver=/canon.ua/127.0.0.1#5335\nipset=/canon.ua/gfwlist\nserver=/usaco.org/127.0.0.1#5335\nipset=/usaco.org/gfwlist\nserver=/scopus.com/127.0.0.1#5335\nipset=/scopus.com/gfwlist\nserver=/mortein.co.in/127.0.0.1#5335\nipset=/mortein.co.in/gfwlist\nserver=/savitahd.net/127.0.0.1#5335\nipset=/savitahd.net/gfwlist\nserver=/5i01.com/127.0.0.1#5335\nipset=/5i01.com/gfwlist\nserver=/facebookemail.com/127.0.0.1#5335\nipset=/facebookemail.com/gfwlist\nserver=/faproulette.co/127.0.0.1#5335\nipset=/faproulette.co/gfwlist\nserver=/bmw-voli.me/127.0.0.1#5335\nipset=/bmw-voli.me/gfwlist\nserver=/pearson.com.hk/127.0.0.1#5335\nipset=/pearson.com.hk/gfwlist\nserver=/webex.de/127.0.0.1#5335\nipset=/webex.de/gfwlist\nserver=/men.com/127.0.0.1#5335\nipset=/men.com/gfwlist\nserver=/skypeassets.net/127.0.0.1#5335\nipset=/skypeassets.net/gfwlist\nserver=/xxxfree.watch/127.0.0.1#5335\nipset=/xxxfree.watch/gfwlist\nserver=/verisign.co.in/127.0.0.1#5335\nipset=/verisign.co.in/gfwlist\nserver=/alphera.co.nz/127.0.0.1#5335\nipset=/alphera.co.nz/gfwlist\nserver=/stateofthemap.org/127.0.0.1#5335\nipset=/stateofthemap.org/gfwlist\nserver=/mobileporngames.com/127.0.0.1#5335\nipset=/mobileporngames.com/gfwlist\nserver=/strip-poker.xxx/127.0.0.1#5335\nipset=/strip-poker.xxx/gfwlist\nserver=/tytporno.online/127.0.0.1#5335\nipset=/tytporno.online/gfwlist\nserver=/bestbuycharityclassic.com/127.0.0.1#5335\nipset=/bestbuycharityclassic.com/gfwlist\nserver=/scholar.google.li/127.0.0.1#5335\nipset=/scholar.google.li/gfwlist\nserver=/unwire.hk/127.0.0.1#5335\nipset=/unwire.hk/gfwlist\nserver=/google.sr/127.0.0.1#5335\nipset=/google.sr/gfwlist\nserver=/kubeacademy.com/127.0.0.1#5335\nipset=/kubeacademy.com/gfwlist\nserver=/e-bay.it/127.0.0.1#5335\nipset=/e-bay.it/gfwlist\nserver=/fontawesome.com/127.0.0.1#5335\nipset=/fontawesome.com/gfwlist\nserver=/soundofhope.kr/127.0.0.1#5335\nipset=/soundofhope.kr/gfwlist\nserver=/globalriskregulator.com/127.0.0.1#5335\nipset=/globalriskregulator.com/gfwlist\nserver=/paofuyun.me/127.0.0.1#5335\nipset=/paofuyun.me/gfwlist\nserver=/pornoisy.com/127.0.0.1#5335\nipset=/pornoisy.com/gfwlist\nserver=/calgon.ch/127.0.0.1#5335\nipset=/calgon.ch/gfwlist\nserver=/xxxporndig.com/127.0.0.1#5335\nipset=/xxxporndig.com/gfwlist\nserver=/v2fly.org/127.0.0.1#5335\nipset=/v2fly.org/gfwlist\nserver=/ipad.co.kr/127.0.0.1#5335\nipset=/ipad.co.kr/gfwlist\nserver=/udn.com/127.0.0.1#5335\nipset=/udn.com/gfwlist\nserver=/ikea.com.pt/127.0.0.1#5335\nipset=/ikea.com.pt/gfwlist\nserver=/minirichmond.ca/127.0.0.1#5335\nipset=/minirichmond.ca/gfwlist\nserver=/fxnetworks.com/127.0.0.1#5335\nipset=/fxnetworks.com/gfwlist\nserver=/beatsbydreoutletsale.com/127.0.0.1#5335\nipset=/beatsbydreoutletsale.com/gfwlist\nserver=/virsto.net/127.0.0.1#5335\nipset=/virsto.net/gfwlist\nserver=/gayapatal.com/127.0.0.1#5335\nipset=/gayapatal.com/gfwlist\nserver=/facebooktv.org/127.0.0.1#5335\nipset=/facebooktv.org/gfwlist\nserver=/beatsbydrecolors.com/127.0.0.1#5335\nipset=/beatsbydrecolors.com/gfwlist\nserver=/adultgames.me/127.0.0.1#5335\nipset=/adultgames.me/gfwlist\nserver=/zoo-xvideo.com/127.0.0.1#5335\nipset=/zoo-xvideo.com/gfwlist\nserver=/nextwork.hk/127.0.0.1#5335\nipset=/nextwork.hk/gfwlist\nserver=/applestore.de/127.0.0.1#5335\nipset=/applestore.de/gfwlist\nserver=/azurecomm.net/127.0.0.1#5335\nipset=/azurecomm.net/gfwlist\nserver=/adult3dfantasycomics.com/127.0.0.1#5335\nipset=/adult3dfantasycomics.com/gfwlist\nserver=/directvbundles.com/127.0.0.1#5335\nipset=/directvbundles.com/gfwlist\nserver=/iijav.com/127.0.0.1#5335\nipset=/iijav.com/gfwlist\nserver=/serialssolutions.com/127.0.0.1#5335\nipset=/serialssolutions.com/gfwlist\nserver=/salecheaphandbags.com/127.0.0.1#5335\nipset=/salecheaphandbags.com/gfwlist\nserver=/vixvids.to/127.0.0.1#5335\nipset=/vixvids.to/gfwlist\nserver=/geeksquadcentral.com/127.0.0.1#5335\nipset=/geeksquadcentral.com/gfwlist\nserver=/myhpsupport.com/127.0.0.1#5335\nipset=/myhpsupport.com/gfwlist\nserver=/vipoo.es/127.0.0.1#5335\nipset=/vipoo.es/gfwlist\nserver=/xn--uis17aj9kmuf.com/127.0.0.1#5335\nipset=/xn--uis17aj9kmuf.com/gfwlist\nserver=/buycheapbeatsbus.com/127.0.0.1#5335\nipset=/buycheapbeatsbus.com/gfwlist\nserver=/bmw-golfsport.com/127.0.0.1#5335\nipset=/bmw-golfsport.com/gfwlist\nserver=/hbo.com.edgesuite.net/127.0.0.1#5335\nipset=/hbo.com.edgesuite.net/gfwlist\nserver=/giratina.com/127.0.0.1#5335\nipset=/giratina.com/gfwlist\nserver=/honawalaan.com/127.0.0.1#5335\nipset=/honawalaan.com/gfwlist\nserver=/thottok.com/127.0.0.1#5335\nipset=/thottok.com/gfwlist\nserver=/durexusa.com/127.0.0.1#5335\nipset=/durexusa.com/gfwlist\nserver=/nikecdn.com/127.0.0.1#5335\nipset=/nikecdn.com/gfwlist\nserver=/sciencedirectassets.com/127.0.0.1#5335\nipset=/sciencedirectassets.com/gfwlist\nserver=/minibrossard.com/127.0.0.1#5335\nipset=/minibrossard.com/gfwlist\nserver=/paypal-online.org/127.0.0.1#5335\nipset=/paypal-online.org/gfwlist\nserver=/awseducate.net/127.0.0.1#5335\nipset=/awseducate.net/gfwlist\nserver=/kirbysuperstarultra.com/127.0.0.1#5335\nipset=/kirbysuperstarultra.com/gfwlist\nserver=/disney.ph/127.0.0.1#5335\nipset=/disney.ph/gfwlist\nserver=/youtube.bh/127.0.0.1#5335\nipset=/youtube.bh/gfwlist\nserver=/globalsign.com.sg/127.0.0.1#5335\nipset=/globalsign.com.sg/gfwlist\nserver=/flipnotestudio.com/127.0.0.1#5335\nipset=/flipnotestudio.com/gfwlist\nserver=/amazon.in/127.0.0.1#5335\nipset=/amazon.in/gfwlist\nserver=/paypal-scoop.com/127.0.0.1#5335\nipset=/paypal-scoop.com/gfwlist\nserver=/vs-cmaf-pushb-ww-live.akamaized.net/127.0.0.1#5335\nipset=/vs-cmaf-pushb-ww-live.akamaized.net/gfwlist\nserver=/youngpornvideos.com/127.0.0.1#5335\nipset=/youngpornvideos.com/gfwlist\nserver=/yandex.co.il/127.0.0.1#5335\nipset=/yandex.co.il/gfwlist\nserver=/sexyseeker.com/127.0.0.1#5335\nipset=/sexyseeker.com/gfwlist\nserver=/ggjav.com/127.0.0.1#5335\nipset=/ggjav.com/gfwlist\nserver=/beatsbydreforyououtlet.com/127.0.0.1#5335\nipset=/beatsbydreforyououtlet.com/gfwlist\nserver=/follasian.com/127.0.0.1#5335\nipset=/follasian.com/gfwlist\nserver=/adultdvdmarketplace.com/127.0.0.1#5335\nipset=/adultdvdmarketplace.com/gfwlist\nserver=/xxxmofo.com/127.0.0.1#5335\nipset=/xxxmofo.com/gfwlist\nserver=/gitstar.com/127.0.0.1#5335\nipset=/gitstar.com/gfwlist\nserver=/pixtronix.com/127.0.0.1#5335\nipset=/pixtronix.com/gfwlist\nserver=/redfaptube.com/127.0.0.1#5335\nipset=/redfaptube.com/gfwlist\nserver=/danskpornofilm.com/127.0.0.1#5335\nipset=/danskpornofilm.com/gfwlist\nserver=/smutty.com/127.0.0.1#5335\nipset=/smutty.com/gfwlist\nserver=/talksport.com/127.0.0.1#5335\nipset=/talksport.com/gfwlist\nserver=/latintubeporn.com/127.0.0.1#5335\nipset=/latintubeporn.com/gfwlist\nserver=/analhomeporn.com/127.0.0.1#5335\nipset=/analhomeporn.com/gfwlist\nserver=/coedcherry.com/127.0.0.1#5335\nipset=/coedcherry.com/gfwlist\nserver=/javbraze.com/127.0.0.1#5335\nipset=/javbraze.com/gfwlist\nserver=/brazzer.com/127.0.0.1#5335\nipset=/brazzer.com/gfwlist\nserver=/apple.co.hu/127.0.0.1#5335\nipset=/apple.co.hu/gfwlist\nserver=/hkbn.com.hk/127.0.0.1#5335\nipset=/hkbn.com.hk/gfwlist\nserver=/iphone-vip1.com/127.0.0.1#5335\nipset=/iphone-vip1.com/gfwlist\nserver=/vmware.com/127.0.0.1#5335\nipset=/vmware.com/gfwlist\nserver=/ypmate.com/127.0.0.1#5335\nipset=/ypmate.com/gfwlist\nserver=/duck.co/127.0.0.1#5335\nipset=/duck.co/gfwlist\nserver=/bmw.ca/127.0.0.1#5335\nipset=/bmw.ca/gfwlist\nserver=/researchkit.org/127.0.0.1#5335\nipset=/researchkit.org/gfwlist\nserver=/cloudlive.com/127.0.0.1#5335\nipset=/cloudlive.com/gfwlist\nserver=/sexygloz.com/127.0.0.1#5335\nipset=/sexygloz.com/gfwlist\nserver=/ciscoknowledgenetwork.com/127.0.0.1#5335\nipset=/ciscoknowledgenetwork.com/gfwlist\nserver=/pdncommunity.com/127.0.0.1#5335\nipset=/pdncommunity.com/gfwlist\nserver=/yahoo.ph/127.0.0.1#5335\nipset=/yahoo.ph/gfwlist\nserver=/needforspeedtimeattack.com/127.0.0.1#5335\nipset=/needforspeedtimeattack.com/gfwlist\nserver=/worldemojiday.com/127.0.0.1#5335\nipset=/worldemojiday.com/gfwlist\nserver=/beatsfactoroutlets.com/127.0.0.1#5335\nipset=/beatsfactoroutlets.com/gfwlist\nserver=/manhwahentai.me/127.0.0.1#5335\nipset=/manhwahentai.me/gfwlist\nserver=/nike.com.hk/127.0.0.1#5335\nipset=/nike.com.hk/gfwlist\nserver=/spotifycdn.com/127.0.0.1#5335\nipset=/spotifycdn.com/gfwlist\nserver=/scholar.google.com.eg/127.0.0.1#5335\nipset=/scholar.google.com.eg/gfwlist\nserver=/title.sh/127.0.0.1#5335\nipset=/title.sh/gfwlist\nserver=/triokini.com/127.0.0.1#5335\nipset=/triokini.com/gfwlist\nserver=/xxxyoungxxx.com/127.0.0.1#5335\nipset=/xxxyoungxxx.com/gfwlist\nserver=/visasavingsedge.ca/127.0.0.1#5335\nipset=/visasavingsedge.ca/gfwlist\nserver=/echocdn.com/127.0.0.1#5335\nipset=/echocdn.com/gfwlist\nserver=/amateur-home-sex.com/127.0.0.1#5335\nipset=/amateur-home-sex.com/gfwlist\nserver=/fixtracking.com/127.0.0.1#5335\nipset=/fixtracking.com/gfwlist\nserver=/highwirepress.com/127.0.0.1#5335\nipset=/highwirepress.com/gfwlist\nserver=/celebrityslips.com/127.0.0.1#5335\nipset=/celebrityslips.com/gfwlist\nserver=/nurofen.co.uk/127.0.0.1#5335\nipset=/nurofen.co.uk/gfwlist\nserver=/disney.es/127.0.0.1#5335\nipset=/disney.es/gfwlist\nserver=/blogspot.ug/127.0.0.1#5335\nipset=/blogspot.ug/gfwlist\nserver=/facebokk.com/127.0.0.1#5335\nipset=/facebokk.com/gfwlist\nserver=/lezpoo.com/127.0.0.1#5335\nipset=/lezpoo.com/gfwlist\nserver=/sportswomanoftheyear.co.uk/127.0.0.1#5335\nipset=/sportswomanoftheyear.co.uk/gfwlist\nserver=/appbridge.io/127.0.0.1#5335\nipset=/appbridge.io/gfwlist\nserver=/teamneedforspeed.com/127.0.0.1#5335\nipset=/teamneedforspeed.com/gfwlist\nserver=/r-new-sale.blog.jp/127.0.0.1#5335\nipset=/r-new-sale.blog.jp/gfwlist\nserver=/freehdinterracialporn.in/127.0.0.1#5335\nipset=/freehdinterracialporn.in/gfwlist\nserver=/ffmpeg.org/127.0.0.1#5335\nipset=/ffmpeg.org/gfwlist\nserver=/liveporngirls.com/127.0.0.1#5335\nipset=/liveporngirls.com/gfwlist\nserver=/mirrorsedge2.com/127.0.0.1#5335\nipset=/mirrorsedge2.com/gfwlist\nserver=/01.org/127.0.0.1#5335\nipset=/01.org/gfwlist\nserver=/alphabetfinance.net/127.0.0.1#5335\nipset=/alphabetfinance.net/gfwlist\nserver=/camrabbit.com/127.0.0.1#5335\nipset=/camrabbit.com/gfwlist\nserver=/intel.nu/127.0.0.1#5335\nipset=/intel.nu/gfwlist\nserver=/pornpaw.com/127.0.0.1#5335\nipset=/pornpaw.com/gfwlist\nserver=/emac.co.in/127.0.0.1#5335\nipset=/emac.co.in/gfwlist\nserver=/altmetric.com/127.0.0.1#5335\nipset=/altmetric.com/gfwlist\nserver=/azure.microsoft.com/127.0.0.1#5335\nipset=/azure.microsoft.com/gfwlist\nserver=/drebeatssolocybermondaysale.com/127.0.0.1#5335\nipset=/drebeatssolocybermondaysale.com/gfwlist\nserver=/insiderdevtour.com/127.0.0.1#5335\nipset=/insiderdevtour.com/gfwlist\nserver=/mastercard.ch/127.0.0.1#5335\nipset=/mastercard.ch/gfwlist\nserver=/libgen.fun/127.0.0.1#5335\nipset=/libgen.fun/gfwlist\nserver=/visa.com.ms/127.0.0.1#5335\nipset=/visa.com.ms/gfwlist\nserver=/mucinex.cn/127.0.0.1#5335\nipset=/mucinex.cn/gfwlist\nserver=/apple.xyz/127.0.0.1#5335\nipset=/apple.xyz/gfwlist\nserver=/paypalnet.net/127.0.0.1#5335\nipset=/paypalnet.net/gfwlist\nserver=/hentai.toys/127.0.0.1#5335\nipset=/hentai.toys/gfwlist\nserver=/privatecasting-x.com/127.0.0.1#5335\nipset=/privatecasting-x.com/gfwlist\nserver=/foxnewsplayer-a.akamaihd.net/127.0.0.1#5335\nipset=/foxnewsplayer-a.akamaihd.net/gfwlist\nserver=/bellsouth.net/127.0.0.1#5335\nipset=/bellsouth.net/gfwlist\nserver=/sgp1.fun/127.0.0.1#5335\nipset=/sgp1.fun/gfwlist\nserver=/bellesa.co/127.0.0.1#5335\nipset=/bellesa.co/gfwlist\nserver=/tropictube.com/127.0.0.1#5335\nipset=/tropictube.com/gfwlist\nserver=/virsto.com/127.0.0.1#5335\nipset=/virsto.com/gfwlist\nserver=/getboxer.com/127.0.0.1#5335\nipset=/getboxer.com/gfwlist\nserver=/dirty.games/127.0.0.1#5335\nipset=/dirty.games/gfwlist\nserver=/vfsco.nl/127.0.0.1#5335\nipset=/vfsco.nl/gfwlist\nserver=/nudes7.com/127.0.0.1#5335\nipset=/nudes7.com/gfwlist\nserver=/zeit-world.com/127.0.0.1#5335\nipset=/zeit-world.com/gfwlist\nserver=/mixvintagesex.com/127.0.0.1#5335\nipset=/mixvintagesex.com/gfwlist\nserver=/fansnudes.com/127.0.0.1#5335\nipset=/fansnudes.com/gfwlist\nserver=/kijij.ca/127.0.0.1#5335\nipset=/kijij.ca/gfwlist\nserver=/hotstar.com/127.0.0.1#5335\nipset=/hotstar.com/gfwlist\nserver=/amateurs-fuck.com/127.0.0.1#5335\nipset=/amateurs-fuck.com/gfwlist\nserver=/lin.ee/127.0.0.1#5335\nipset=/lin.ee/gfwlist\nserver=/l-0005.dc-msedge.net/127.0.0.1#5335\nipset=/l-0005.dc-msedge.net/gfwlist\nserver=/agag.tw/127.0.0.1#5335\nipset=/agag.tw/gfwlist\nserver=/volvomerchandise.com/127.0.0.1#5335\nipset=/volvomerchandise.com/gfwlist\nserver=/xmoviesforyou.com/127.0.0.1#5335\nipset=/xmoviesforyou.com/gfwlist\nserver=/quora.com/127.0.0.1#5335\nipset=/quora.com/gfwlist\nserver=/iop.org/127.0.0.1#5335\nipset=/iop.org/gfwlist\nserver=/ebayvalet.com/127.0.0.1#5335\nipset=/ebayvalet.com/gfwlist\nserver=/oculus3d.com/127.0.0.1#5335\nipset=/oculus3d.com/gfwlist\nserver=/instagify.com/127.0.0.1#5335\nipset=/instagify.com/gfwlist\nserver=/beatsbydreformall2013-nl.com/127.0.0.1#5335\nipset=/beatsbydreformall2013-nl.com/gfwlist\nserver=/oyeloca.com/127.0.0.1#5335\nipset=/oyeloca.com/gfwlist\nserver=/foofle.com/127.0.0.1#5335\nipset=/foofle.com/gfwlist\nserver=/directvpomise.com/127.0.0.1#5335\nipset=/directvpomise.com/gfwlist\nserver=/aliverewind.com/127.0.0.1#5335\nipset=/aliverewind.com/gfwlist\nserver=/cbsi.video/127.0.0.1#5335\nipset=/cbsi.video/gfwlist\nserver=/bmwmotorshowblog.com/127.0.0.1#5335\nipset=/bmwmotorshowblog.com/gfwlist\nserver=/b-ok.org/127.0.0.1#5335\nipset=/b-ok.org/gfwlist\nserver=/xsava.xyz/127.0.0.1#5335\nipset=/xsava.xyz/gfwlist\nserver=/flow.org/127.0.0.1#5335\nipset=/flow.org/gfwlist\nserver=/adultepic.com/127.0.0.1#5335\nipset=/adultepic.com/gfwlist\nserver=/lysol.cl/127.0.0.1#5335\nipset=/lysol.cl/gfwlist\nserver=/crr.com/127.0.0.1#5335\nipset=/crr.com/gfwlist\nserver=/immidio.com/127.0.0.1#5335\nipset=/immidio.com/gfwlist\nserver=/thomsonreuters.com/127.0.0.1#5335\nipset=/thomsonreuters.com/gfwlist\nserver=/bigboobbundle.com/127.0.0.1#5335\nipset=/bigboobbundle.com/gfwlist\nserver=/bmw.bs/127.0.0.1#5335\nipset=/bmw.bs/gfwlist\nserver=/hentaihand.com/127.0.0.1#5335\nipset=/hentaihand.com/gfwlist\nserver=/macbookair.com/127.0.0.1#5335\nipset=/macbookair.com/gfwlist\nserver=/bloomberg.co.kr/127.0.0.1#5335\nipset=/bloomberg.co.kr/gfwlist\nserver=/mrpornlive.com/127.0.0.1#5335\nipset=/mrpornlive.com/gfwlist\nserver=/bigtitangelawhite.com/127.0.0.1#5335\nipset=/bigtitangelawhite.com/gfwlist\nserver=/meridian.net/127.0.0.1#5335\nipset=/meridian.net/gfwlist\nserver=/erome.it/127.0.0.1#5335\nipset=/erome.it/gfwlist\nserver=/mediafiles-cisco.com/127.0.0.1#5335\nipset=/mediafiles-cisco.com/gfwlist\nserver=/hentaibar.com/127.0.0.1#5335\nipset=/hentaibar.com/gfwlist\nserver=/sb-telecom.net/127.0.0.1#5335\nipset=/sb-telecom.net/gfwlist\nserver=/amiibo.com/127.0.0.1#5335\nipset=/amiibo.com/gfwlist\nserver=/ikea.com.do/127.0.0.1#5335\nipset=/ikea.com.do/gfwlist\nserver=/youtube.ph/127.0.0.1#5335\nipset=/youtube.ph/gfwlist\nserver=/12diasderegalosdeitunes.com.co/127.0.0.1#5335\nipset=/12diasderegalosdeitunes.com.co/gfwlist\nserver=/senzuritv.net/127.0.0.1#5335\nipset=/senzuritv.net/gfwlist\nserver=/xn--gtvz22d.wang/127.0.0.1#5335\nipset=/xn--gtvz22d.wang/gfwlist\nserver=/reabble.com/127.0.0.1#5335\nipset=/reabble.com/gfwlist\nserver=/bdsm123.xyz/127.0.0.1#5335\nipset=/bdsm123.xyz/gfwlist\nserver=/beastythumbs.com/127.0.0.1#5335\nipset=/beastythumbs.com/gfwlist\nserver=/yourcolonic.com/127.0.0.1#5335\nipset=/yourcolonic.com/gfwlist\nserver=/ebayshoesstore.com/127.0.0.1#5335\nipset=/ebayshoesstore.com/gfwlist\nserver=/playno1.com/127.0.0.1#5335\nipset=/playno1.com/gfwlist\nserver=/applestore.com.ro/127.0.0.1#5335\nipset=/applestore.com.ro/gfwlist\nserver=/ebayinc.org/127.0.0.1#5335\nipset=/ebayinc.org/gfwlist\nserver=/storage.live.com/127.0.0.1#5335\nipset=/storage.live.com/gfwlist\nserver=/cheapcustombeatsbydre.com/127.0.0.1#5335\nipset=/cheapcustombeatsbydre.com/gfwlist\nserver=/casquebeatsdocteurdre.com/127.0.0.1#5335\nipset=/casquebeatsdocteurdre.com/gfwlist\nserver=/ikea.com.lv/127.0.0.1#5335\nipset=/ikea.com.lv/gfwlist\nserver=/account-paypal.info/127.0.0.1#5335\nipset=/account-paypal.info/gfwlist\nserver=/google.de/127.0.0.1#5335\nipset=/google.de/gfwlist\nserver=/evilx.su/127.0.0.1#5335\nipset=/evilx.su/gfwlist\nserver=/artstation.com/127.0.0.1#5335\nipset=/artstation.com/gfwlist\nserver=/freshscat.com/127.0.0.1#5335\nipset=/freshscat.com/gfwlist\nserver=/hpconnected.net/127.0.0.1#5335\nipset=/hpconnected.net/gfwlist\nserver=/wbvm4s.com/127.0.0.1#5335\nipset=/wbvm4s.com/gfwlist\nserver=/binance.com/127.0.0.1#5335\nipset=/binance.com/gfwlist\nserver=/mini.is/127.0.0.1#5335\nipset=/mini.is/gfwlist\nserver=/rea-asia.com/127.0.0.1#5335\nipset=/rea-asia.com/gfwlist\nserver=/youtube.az/127.0.0.1#5335\nipset=/youtube.az/gfwlist\nserver=/hacklang.org/127.0.0.1#5335\nipset=/hacklang.org/gfwlist\nserver=/webtoons.com/127.0.0.1#5335\nipset=/webtoons.com/gfwlist\nserver=/volvogroup.mx/127.0.0.1#5335\nipset=/volvogroup.mx/gfwlist\nserver=/myavsuper.com/127.0.0.1#5335\nipset=/myavsuper.com/gfwlist\nserver=/csakporno.hu/127.0.0.1#5335\nipset=/csakporno.hu/gfwlist\nserver=/animeidhentai.com/127.0.0.1#5335\nipset=/animeidhentai.com/gfwlist\nserver=/consul.io/127.0.0.1#5335\nipset=/consul.io/gfwlist\nserver=/volvobuses.com.au/127.0.0.1#5335\nipset=/volvobuses.com.au/gfwlist\nserver=/beatsbydrestudio.com/127.0.0.1#5335\nipset=/beatsbydrestudio.com/gfwlist\nserver=/paypal-survey.com/127.0.0.1#5335\nipset=/paypal-survey.com/gfwlist\nserver=/valuegb.com/127.0.0.1#5335\nipset=/valuegb.com/gfwlist\nserver=/world3d.biz/127.0.0.1#5335\nipset=/world3d.biz/gfwlist\nserver=/yuvutu.com/127.0.0.1#5335\nipset=/yuvutu.com/gfwlist\nserver=/prettynubiles.com/127.0.0.1#5335\nipset=/prettynubiles.com/gfwlist\nserver=/zooporn.shiksha/127.0.0.1#5335\nipset=/zooporn.shiksha/gfwlist\nserver=/mastercard.com.ar/127.0.0.1#5335\nipset=/mastercard.com.ar/gfwlist\nserver=/xinmeitulu.com/127.0.0.1#5335\nipset=/xinmeitulu.com/gfwlist\nserver=/borderlessprepaid.com/127.0.0.1#5335\nipset=/borderlessprepaid.com/gfwlist\nserver=/miraheze.org/127.0.0.1#5335\nipset=/miraheze.org/gfwlist\nserver=/6parknews.com/127.0.0.1#5335\nipset=/6parknews.com/gfwlist\nserver=/drebeatsbuy.com/127.0.0.1#5335\nipset=/drebeatsbuy.com/gfwlist\nserver=/enpirion.com/127.0.0.1#5335\nipset=/enpirion.com/gfwlist\nserver=/miniso.co.id/127.0.0.1#5335\nipset=/miniso.co.id/gfwlist\nserver=/acgfabu.com/127.0.0.1#5335\nipset=/acgfabu.com/gfwlist\nserver=/date2night.xyz/127.0.0.1#5335\nipset=/date2night.xyz/gfwlist\nserver=/minicanada.ca/127.0.0.1#5335\nipset=/minicanada.ca/gfwlist\nserver=/gamedownloads-rockstargames-com.akamaized.net/127.0.0.1#5335\nipset=/gamedownloads-rockstargames-com.akamaized.net/gfwlist\nserver=/bandwagonhost.com/127.0.0.1#5335\nipset=/bandwagonhost.com/gfwlist\nserver=/alpherafs.ca/127.0.0.1#5335\nipset=/alpherafs.ca/gfwlist\nserver=/javcdn.cc/127.0.0.1#5335\nipset=/javcdn.cc/gfwlist\nserver=/bridgestonecomercial.com.mx/127.0.0.1#5335\nipset=/bridgestonecomercial.com.mx/gfwlist\nserver=/nijie.info/127.0.0.1#5335\nipset=/nijie.info/gfwlist\nserver=/dkr.com/127.0.0.1#5335\nipset=/dkr.com/gfwlist\nserver=/facdebook.com/127.0.0.1#5335\nipset=/facdebook.com/gfwlist\nserver=/japanxxxfilms.com/127.0.0.1#5335\nipset=/japanxxxfilms.com/gfwlist\nserver=/cms-twdigitalassets.com/127.0.0.1#5335\nipset=/cms-twdigitalassets.com/gfwlist\nserver=/malaypornhub.com/127.0.0.1#5335\nipset=/malaypornhub.com/gfwlist\nserver=/animehentaihub.com/127.0.0.1#5335\nipset=/animehentaihub.com/gfwlist\nserver=/curvybbwwives.com/127.0.0.1#5335\nipset=/curvybbwwives.com/gfwlist\nserver=/weareebay.com/127.0.0.1#5335\nipset=/weareebay.com/gfwlist\nserver=/bejewled-stars.com/127.0.0.1#5335\nipset=/bejewled-stars.com/gfwlist\nserver=/topcuckolds.com/127.0.0.1#5335\nipset=/topcuckolds.com/gfwlist\nserver=/aspbjournals.org/127.0.0.1#5335\nipset=/aspbjournals.org/gfwlist\nserver=/intel.com.br/127.0.0.1#5335\nipset=/intel.com.br/gfwlist\nserver=/bloombergbriefs.com/127.0.0.1#5335\nipset=/bloombergbriefs.com/gfwlist\nserver=/freebasics.net/127.0.0.1#5335\nipset=/freebasics.net/gfwlist\nserver=/google.com.hk/127.0.0.1#5335\nipset=/google.com.hk/gfwlist\nserver=/meetfasttrack.com/127.0.0.1#5335\nipset=/meetfasttrack.com/gfwlist\nserver=/xvideosamadoras.com/127.0.0.1#5335\nipset=/xvideosamadoras.com/gfwlist\nserver=/baeb.com/127.0.0.1#5335\nipset=/baeb.com/gfwlist\nserver=/macos.com.au/127.0.0.1#5335\nipset=/macos.com.au/gfwlist\nserver=/mastercard.com.eg/127.0.0.1#5335\nipset=/mastercard.com.eg/gfwlist\nserver=/hpbuiltforlearning.com/127.0.0.1#5335\nipset=/hpbuiltforlearning.com/gfwlist\nserver=/clitgames.com/127.0.0.1#5335\nipset=/clitgames.com/gfwlist\nserver=/nikesnowboarding.com/127.0.0.1#5335\nipset=/nikesnowboarding.com/gfwlist\nserver=/sexvid.xxx/127.0.0.1#5335\nipset=/sexvid.xxx/gfwlist\nserver=/pornogrund.com/127.0.0.1#5335\nipset=/pornogrund.com/gfwlist\nserver=/pornlulu.com/127.0.0.1#5335\nipset=/pornlulu.com/gfwlist\nserver=/youtube.co.th/127.0.0.1#5335\nipset=/youtube.co.th/gfwlist\nserver=/newscommercial.co.uk/127.0.0.1#5335\nipset=/newscommercial.co.uk/gfwlist\nserver=/xxxvideor.com/127.0.0.1#5335\nipset=/xxxvideor.com/gfwlist\nserver=/sexinsex.net/127.0.0.1#5335\nipset=/sexinsex.net/gfwlist\nserver=/daftporn.com/127.0.0.1#5335\nipset=/daftporn.com/gfwlist\nserver=/beatsbydreoutletscheap.com/127.0.0.1#5335\nipset=/beatsbydreoutletscheap.com/gfwlist\nserver=/mini-connected.dk/127.0.0.1#5335\nipset=/mini-connected.dk/gfwlist\nserver=/google.dm/127.0.0.1#5335\nipset=/google.dm/gfwlist\nserver=/starbuckscard.ph/127.0.0.1#5335\nipset=/starbuckscard.ph/gfwlist\nserver=/nike.xn--hxt814e/127.0.0.1#5335\nipset=/nike.xn--hxt814e/gfwlist\nserver=/terapeak.com.hk/127.0.0.1#5335\nipset=/terapeak.com.hk/gfwlist\nserver=/theverge.com/127.0.0.1#5335\nipset=/theverge.com/gfwlist\nserver=/youtube.com.py/127.0.0.1#5335\nipset=/youtube.com.py/gfwlist\nserver=/cisconetspace.info/127.0.0.1#5335\nipset=/cisconetspace.info/gfwlist\nserver=/youtube.co.hu/127.0.0.1#5335\nipset=/youtube.co.hu/gfwlist\nserver=/xmalay.com/127.0.0.1#5335\nipset=/xmalay.com/gfwlist\nserver=/wowindianporn.com/127.0.0.1#5335\nipset=/wowindianporn.com/gfwlist\nserver=/google.com.mx/127.0.0.1#5335\nipset=/google.com.mx/gfwlist\nserver=/watchmygf.to/127.0.0.1#5335\nipset=/watchmygf.to/gfwlist\nserver=/nikerunningshoes.com/127.0.0.1#5335\nipset=/nikerunningshoes.com/gfwlist\nserver=/ipadaustralia.com/127.0.0.1#5335\nipset=/ipadaustralia.com/gfwlist\nserver=/foxsports.cl/127.0.0.1#5335\nipset=/foxsports.cl/gfwlist\nserver=/duckduckgo.in/127.0.0.1#5335\nipset=/duckduckgo.in/gfwlist\nserver=/collins.co.uk/127.0.0.1#5335\nipset=/collins.co.uk/gfwlist\nserver=/playbar.biz/127.0.0.1#5335\nipset=/playbar.biz/gfwlist\nserver=/youtube.tn/127.0.0.1#5335\nipset=/youtube.tn/gfwlist\nserver=/tubepornclassic.com/127.0.0.1#5335\nipset=/tubepornclassic.com/gfwlist\nserver=/amandalist.com/127.0.0.1#5335\nipset=/amandalist.com/gfwlist\nserver=/allswingersclubs.org/127.0.0.1#5335\nipset=/allswingersclubs.org/gfwlist\nserver=/macbook.hk/127.0.0.1#5335\nipset=/macbook.hk/gfwlist\nserver=/50dh.app/127.0.0.1#5335\nipset=/50dh.app/gfwlist\nserver=/sony.no/127.0.0.1#5335\nipset=/sony.no/gfwlist\nserver=/radiyoyacuvoa.com/127.0.0.1#5335\nipset=/radiyoyacuvoa.com/gfwlist\nserver=/pwnedpasswords.com/127.0.0.1#5335\nipset=/pwnedpasswords.com/gfwlist\nserver=/intel.lk/127.0.0.1#5335\nipset=/intel.lk/gfwlist\nserver=/apple.bs/127.0.0.1#5335\nipset=/apple.bs/gfwlist\nserver=/go-lang.net/127.0.0.1#5335\nipset=/go-lang.net/gfwlist\nserver=/banatfun.com/127.0.0.1#5335\nipset=/banatfun.com/gfwlist\nserver=/johnpersons.com/127.0.0.1#5335\nipset=/johnpersons.com/gfwlist\nserver=/nextwork.tw/127.0.0.1#5335\nipset=/nextwork.tw/gfwlist\nserver=/office365.com/127.0.0.1#5335\nipset=/office365.com/gfwlist\nserver=/thebankerdatabase.com/127.0.0.1#5335\nipset=/thebankerdatabase.com/gfwlist\nserver=/animal-hentai.com/127.0.0.1#5335\nipset=/animal-hentai.com/gfwlist\nserver=/samsungknox.com/127.0.0.1#5335\nipset=/samsungknox.com/gfwlist\nserver=/veetclub.it/127.0.0.1#5335\nipset=/veetclub.it/gfwlist\nserver=/bmw-connecteddrive.at/127.0.0.1#5335\nipset=/bmw-connecteddrive.at/gfwlist\nserver=/hotstar-cdn.net/127.0.0.1#5335\nipset=/hotstar-cdn.net/gfwlist\nserver=/l-0005.l-msedge.net/127.0.0.1#5335\nipset=/l-0005.l-msedge.net/gfwlist\nserver=/fapster.xxx/127.0.0.1#5335\nipset=/fapster.xxx/gfwlist\nserver=/d2pass.com/127.0.0.1#5335\nipset=/d2pass.com/gfwlist\nserver=/magentomobile.com/127.0.0.1#5335\nipset=/magentomobile.com/gfwlist\nserver=/gayvl.net/127.0.0.1#5335\nipset=/gayvl.net/gfwlist\nserver=/facebock.com/127.0.0.1#5335\nipset=/facebock.com/gfwlist\nserver=/facerbooik.com/127.0.0.1#5335\nipset=/facerbooik.com/gfwlist\nserver=/ping.pe/127.0.0.1#5335\nipset=/ping.pe/gfwlist\nserver=/camgirlstemple.com/127.0.0.1#5335\nipset=/camgirlstemple.com/gfwlist\nserver=/beats-bydre-mall.com/127.0.0.1#5335\nipset=/beats-bydre-mall.com/gfwlist\nserver=/milfsexstart.nl/127.0.0.1#5335\nipset=/milfsexstart.nl/gfwlist\nserver=/machigoto.jp/127.0.0.1#5335\nipset=/machigoto.jp/gfwlist\nserver=/monsterbeats365buy.com/127.0.0.1#5335\nipset=/monsterbeats365buy.com/gfwlist\nserver=/newbienudes.com/127.0.0.1#5335\nipset=/newbienudes.com/gfwlist\nserver=/studiofow.com/127.0.0.1#5335\nipset=/studiofow.com/gfwlist\nserver=/beatsheadphoness.com/127.0.0.1#5335\nipset=/beatsheadphoness.com/gfwlist\nserver=/pyrobot.org/127.0.0.1#5335\nipset=/pyrobot.org/gfwlist\nserver=/befuck.com/127.0.0.1#5335\nipset=/befuck.com/gfwlist\nserver=/bimbim.com/127.0.0.1#5335\nipset=/bimbim.com/gfwlist\nserver=/yahoo.co.id/127.0.0.1#5335\nipset=/yahoo.co.id/gfwlist\nserver=/minisaskatoon.ca/127.0.0.1#5335\nipset=/minisaskatoon.ca/gfwlist\nserver=/macbookair.hk/127.0.0.1#5335\nipset=/macbookair.hk/gfwlist\nserver=/wiivc.net/127.0.0.1#5335\nipset=/wiivc.net/gfwlist\nserver=/bridgestone-korea.co.kr/127.0.0.1#5335\nipset=/bridgestone-korea.co.kr/gfwlist\nserver=/bestbuy.com/127.0.0.1#5335\nipset=/bestbuy.com/gfwlist\nserver=/trannyvideosxxx.com/127.0.0.1#5335\nipset=/trannyvideosxxx.com/gfwlist\nserver=/catalina.hk/127.0.0.1#5335\nipset=/catalina.hk/gfwlist\nserver=/lelavement.com/127.0.0.1#5335\nipset=/lelavement.com/gfwlist\nserver=/udacity.com/127.0.0.1#5335\nipset=/udacity.com/gfwlist\nserver=/sexzy4.com/127.0.0.1#5335\nipset=/sexzy4.com/gfwlist\nserver=/spankbang1.com/127.0.0.1#5335\nipset=/spankbang1.com/gfwlist\nserver=/pixnet.tw/127.0.0.1#5335\nipset=/pixnet.tw/gfwlist\nserver=/beatsbydrdrebiz.com/127.0.0.1#5335\nipset=/beatsbydrdrebiz.com/gfwlist\nserver=/applecoronavirus.com/127.0.0.1#5335\nipset=/applecoronavirus.com/gfwlist\nserver=/goodsdunk.net/127.0.0.1#5335\nipset=/goodsdunk.net/gfwlist\nserver=/youtube.com.pt/127.0.0.1#5335\nipset=/youtube.com.pt/gfwlist\nserver=/uncams.com/127.0.0.1#5335\nipset=/uncams.com/gfwlist\nserver=/salesforce.com/127.0.0.1#5335\nipset=/salesforce.com/gfwlist\nserver=/travelex.co.nz/127.0.0.1#5335\nipset=/travelex.co.nz/gfwlist\nserver=/vaultproject.io/127.0.0.1#5335\nipset=/vaultproject.io/gfwlist\nserver=/cervical-exam.com/127.0.0.1#5335\nipset=/cervical-exam.com/gfwlist\nserver=/microsoftnewsforkids.net/127.0.0.1#5335\nipset=/microsoftnewsforkids.net/gfwlist\nserver=/brandporno.com/127.0.0.1#5335\nipset=/brandporno.com/gfwlist\nserver=/anyhentai.com/127.0.0.1#5335\nipset=/anyhentai.com/gfwlist\nserver=/travelex.bh/127.0.0.1#5335\nipset=/travelex.bh/gfwlist\nserver=/ieeer8.org/127.0.0.1#5335\nipset=/ieeer8.org/gfwlist\nserver=/rat.xxx/127.0.0.1#5335\nipset=/rat.xxx/gfwlist\nserver=/tmdb.org/127.0.0.1#5335\nipset=/tmdb.org/gfwlist\nserver=/playsexygame.com/127.0.0.1#5335\nipset=/playsexygame.com/gfwlist\nserver=/akacrypto.net/127.0.0.1#5335\nipset=/akacrypto.net/gfwlist\nserver=/atlassian.com/127.0.0.1#5335\nipset=/atlassian.com/gfwlist\nserver=/cheapmonstersbeatsonsale.com/127.0.0.1#5335\nipset=/cheapmonstersbeatsonsale.com/gfwlist\nserver=/semanticscholar.org/127.0.0.1#5335\nipset=/semanticscholar.org/gfwlist\nserver=/vmware20mosaic.com/127.0.0.1#5335\nipset=/vmware20mosaic.com/gfwlist\nserver=/iphonese.tv/127.0.0.1#5335\nipset=/iphonese.tv/gfwlist\nserver=/vfsco.ru/127.0.0.1#5335\nipset=/vfsco.ru/gfwlist\nserver=/kubernetes.io/127.0.0.1#5335\nipset=/kubernetes.io/gfwlist\nserver=/eastbabes.com/127.0.0.1#5335\nipset=/eastbabes.com/gfwlist\nserver=/google.sh/127.0.0.1#5335\nipset=/google.sh/gfwlist\nserver=/facebook.ca/127.0.0.1#5335\nipset=/facebook.ca/gfwlist\nserver=/epicgames.com/127.0.0.1#5335\nipset=/epicgames.com/gfwlist\nserver=/beatsbydrdremall.com/127.0.0.1#5335\nipset=/beatsbydrdremall.com/gfwlist\nserver=/nhncorp.jp/127.0.0.1#5335\nipset=/nhncorp.jp/gfwlist\nserver=/pics.ee/127.0.0.1#5335\nipset=/pics.ee/gfwlist\nserver=/blog.descargasgay.com/127.0.0.1#5335\nipset=/blog.descargasgay.com/gfwlist\nserver=/smuttymoms.com/127.0.0.1#5335\nipset=/smuttymoms.com/gfwlist\nserver=/ueberamazon.de/127.0.0.1#5335\nipset=/ueberamazon.de/gfwlist\nserver=/yahoo.pt/127.0.0.1#5335\nipset=/yahoo.pt/gfwlist\nserver=/getsexgames.com/127.0.0.1#5335\nipset=/getsexgames.com/gfwlist\nserver=/investorschronicle.co.uk/127.0.0.1#5335\nipset=/investorschronicle.co.uk/gfwlist\nserver=/connected-drive.com/127.0.0.1#5335\nipset=/connected-drive.com/gfwlist\nserver=/udemycdn.com/127.0.0.1#5335\nipset=/udemycdn.com/gfwlist\nserver=/one.one.one/127.0.0.1#5335\nipset=/one.one.one/gfwlist\nserver=/nozomi.la/127.0.0.1#5335\nipset=/nozomi.la/gfwlist\nserver=/bloomberggovernment.com/127.0.0.1#5335\nipset=/bloomberggovernment.com/gfwlist\nserver=/logitechg.fr/127.0.0.1#5335\nipset=/logitechg.fr/gfwlist\nserver=/steam.cdn.slingshot.co.nz/127.0.0.1#5335\nipset=/steam.cdn.slingshot.co.nz/gfwlist\nserver=/g.dev/127.0.0.1#5335\nipset=/g.dev/gfwlist\nserver=/videosection.com/127.0.0.1#5335\nipset=/videosection.com/gfwlist\nserver=/mulheresafoder.com/127.0.0.1#5335\nipset=/mulheresafoder.com/gfwlist\nserver=/woodmancastingx.com/127.0.0.1#5335\nipset=/woodmancastingx.com/gfwlist\nserver=/imac.com/127.0.0.1#5335\nipset=/imac.com/gfwlist\nserver=/cartoonporn.com/127.0.0.1#5335\nipset=/cartoonporn.com/gfwlist\nserver=/bili2.cc/127.0.0.1#5335\nipset=/bili2.cc/gfwlist\nserver=/beatsbydresold.com/127.0.0.1#5335\nipset=/beatsbydresold.com/gfwlist\nserver=/kktv.me/127.0.0.1#5335\nipset=/kktv.me/gfwlist\nserver=/phimsex47.club/127.0.0.1#5335\nipset=/phimsex47.club/gfwlist\nserver=/wwwwebay.com/127.0.0.1#5335\nipset=/wwwwebay.com/gfwlist\nserver=/disneytickets.co.uk/127.0.0.1#5335\nipset=/disneytickets.co.uk/gfwlist\nserver=/hulufree.com/127.0.0.1#5335\nipset=/hulufree.com/gfwlist\nserver=/wnacg.com/127.0.0.1#5335\nipset=/wnacg.com/gfwlist\nserver=/ikea.pr/127.0.0.1#5335\nipset=/ikea.pr/gfwlist\nserver=/minispace.com/127.0.0.1#5335\nipset=/minispace.com/gfwlist\nserver=/cuckoldvideos.xxx/127.0.0.1#5335\nipset=/cuckoldvideos.xxx/gfwlist\nserver=/opensourceinsights.dev/127.0.0.1#5335\nipset=/opensourceinsights.dev/gfwlist\nserver=/connectcommerce.hk/127.0.0.1#5335\nipset=/connectcommerce.hk/gfwlist\nserver=/zohocdn.com/127.0.0.1#5335\nipset=/zohocdn.com/gfwlist\nserver=/netflix.net/127.0.0.1#5335\nipset=/netflix.net/gfwlist\nserver=/pornohd.plus/127.0.0.1#5335\nipset=/pornohd.plus/gfwlist\nserver=/battleforcecomix.com/127.0.0.1#5335\nipset=/battleforcecomix.com/gfwlist\nserver=/imgur.com/127.0.0.1#5335\nipset=/imgur.com/gfwlist\nserver=/pingguotv.xyz/127.0.0.1#5335\nipset=/pingguotv.xyz/gfwlist\nserver=/ipod.com.sg/127.0.0.1#5335\nipset=/ipod.com.sg/gfwlist\nserver=/avcens.xyz/127.0.0.1#5335\nipset=/avcens.xyz/gfwlist\nserver=/pbabes.com/127.0.0.1#5335\nipset=/pbabes.com/gfwlist\nserver=/paypal-cash.com/127.0.0.1#5335\nipset=/paypal-cash.com/gfwlist\nserver=/pornguide.blog/127.0.0.1#5335\nipset=/pornguide.blog/gfwlist\nserver=/yahoo.sn/127.0.0.1#5335\nipset=/yahoo.sn/gfwlist\nserver=/enfabebe.com.mx/127.0.0.1#5335\nipset=/enfabebe.com.mx/gfwlist\nserver=/massagerepublic.com/127.0.0.1#5335\nipset=/massagerepublic.com/gfwlist\nserver=/worldcurrencycard.co.za/127.0.0.1#5335\nipset=/worldcurrencycard.co.za/gfwlist\nserver=/myvisaluxuryhotels.com/127.0.0.1#5335\nipset=/myvisaluxuryhotels.com/gfwlist\nserver=/erodougazo.com/127.0.0.1#5335\nipset=/erodougazo.com/gfwlist\nserver=/mdlf.xyz/127.0.0.1#5335\nipset=/mdlf.xyz/gfwlist\nserver=/weblive-hamivideo.cdn.hinet.net/127.0.0.1#5335\nipset=/weblive-hamivideo.cdn.hinet.net/gfwlist\nserver=/bmw.bb/127.0.0.1#5335\nipset=/bmw.bb/gfwlist\nserver=/pornhubs.video/127.0.0.1#5335\nipset=/pornhubs.video/gfwlist\nserver=/fivestarpornsites.com/127.0.0.1#5335\nipset=/fivestarpornsites.com/gfwlist\nserver=/avhd101.com/127.0.0.1#5335\nipset=/avhd101.com/gfwlist\nserver=/tnaflix.com/127.0.0.1#5335\nipset=/tnaflix.com/gfwlist\nserver=/google.nr/127.0.0.1#5335\nipset=/google.nr/gfwlist\nserver=/applepay.hamburg/127.0.0.1#5335\nipset=/applepay.hamburg/gfwlist\nserver=/kampalaexclusiveescorts.com/127.0.0.1#5335\nipset=/kampalaexclusiveescorts.com/gfwlist\nserver=/pp-soc.com/127.0.0.1#5335\nipset=/pp-soc.com/gfwlist\nserver=/steamdb.info/127.0.0.1#5335\nipset=/steamdb.info/gfwlist\nserver=/apple.cz/127.0.0.1#5335\nipset=/apple.cz/gfwlist\nserver=/visa.com.lc/127.0.0.1#5335\nipset=/visa.com.lc/gfwlist\nserver=/certinomis.com/127.0.0.1#5335\nipset=/certinomis.com/gfwlist\nserver=/awsbraket.com/127.0.0.1#5335\nipset=/awsbraket.com/gfwlist\nserver=/animesexhq.com/127.0.0.1#5335\nipset=/animesexhq.com/gfwlist\nserver=/monsterbeatstang.com/127.0.0.1#5335\nipset=/monsterbeatstang.com/gfwlist\nserver=/hentai2w.com/127.0.0.1#5335\nipset=/hentai2w.com/gfwlist\nserver=/evemodels.com/127.0.0.1#5335\nipset=/evemodels.com/gfwlist\nserver=/porntea.com/127.0.0.1#5335\nipset=/porntea.com/gfwlist\nserver=/cloudflare-quic.com/127.0.0.1#5335\nipset=/cloudflare-quic.com/gfwlist\nserver=/disney-plus.net/127.0.0.1#5335\nipset=/disney-plus.net/gfwlist\nserver=/line-apps-rc.com/127.0.0.1#5335\nipset=/line-apps-rc.com/gfwlist\nserver=/cambridge.org/127.0.0.1#5335\nipset=/cambridge.org/gfwlist\nserver=/inside.com.tw/127.0.0.1#5335\nipset=/inside.com.tw/gfwlist\nserver=/ichat.co.in/127.0.0.1#5335\nipset=/ichat.co.in/gfwlist\nserver=/kannewyork.com/127.0.0.1#5335\nipset=/kannewyork.com/gfwlist\nserver=/alphabet.mx/127.0.0.1#5335\nipset=/alphabet.mx/gfwlist\nserver=/cdkworkshop.com/127.0.0.1#5335\nipset=/cdkworkshop.com/gfwlist\nserver=/5fang.cc/127.0.0.1#5335\nipset=/5fang.cc/gfwlist\nserver=/tctsx28d.xyz/127.0.0.1#5335\nipset=/tctsx28d.xyz/gfwlist\nserver=/escortdude.com/127.0.0.1#5335\nipset=/escortdude.com/gfwlist\nserver=/ksyp10.com/127.0.0.1#5335\nipset=/ksyp10.com/gfwlist\nserver=/mini.com.cy/127.0.0.1#5335\nipset=/mini.com.cy/gfwlist\nserver=/volvobuses.om/127.0.0.1#5335\nipset=/volvobuses.om/gfwlist\nserver=/enemanozzle.info/127.0.0.1#5335\nipset=/enemanozzle.info/gfwlist\nserver=/alphera.com.es/127.0.0.1#5335\nipset=/alphera.com.es/gfwlist\nserver=/hpcontinuum.com/127.0.0.1#5335\nipset=/hpcontinuum.com/gfwlist\nserver=/audiencenetwork.tv/127.0.0.1#5335\nipset=/audiencenetwork.tv/gfwlist\nserver=/yahoo.com.bd/127.0.0.1#5335\nipset=/yahoo.com.bd/gfwlist\nserver=/ebayinkblog.com/127.0.0.1#5335\nipset=/ebayinkblog.com/gfwlist\nserver=/govforce.com/127.0.0.1#5335\nipset=/govforce.com/gfwlist\nserver=/awssecworkshops.com/127.0.0.1#5335\nipset=/awssecworkshops.com/gfwlist\nserver=/bmw-art-journey.com/127.0.0.1#5335\nipset=/bmw-art-journey.com/gfwlist\nserver=/omniroot.com/127.0.0.1#5335\nipset=/omniroot.com/gfwlist\nserver=/swiftfinancial.net/127.0.0.1#5335\nipset=/swiftfinancial.net/gfwlist\nserver=/imdb.to/127.0.0.1#5335\nipset=/imdb.to/gfwlist\nserver=/jsbridgestone.com/127.0.0.1#5335\nipset=/jsbridgestone.com/gfwlist\nserver=/mcdelivery.co.id/127.0.0.1#5335\nipset=/mcdelivery.co.id/gfwlist\nserver=/thismon.ee/127.0.0.1#5335\nipset=/thismon.ee/gfwlist\nserver=/quickoffice.com/127.0.0.1#5335\nipset=/quickoffice.com/gfwlist\nserver=/facebook.wang/127.0.0.1#5335\nipset=/facebook.wang/gfwlist\nserver=/free64all.com/127.0.0.1#5335\nipset=/free64all.com/gfwlist\nserver=/ebaysocial.ru/127.0.0.1#5335\nipset=/ebaysocial.ru/gfwlist\nserver=/vanish.com.tr/127.0.0.1#5335\nipset=/vanish.com.tr/gfwlist\nserver=/quicinc.com/127.0.0.1#5335\nipset=/quicinc.com/gfwlist\nserver=/pinterest.be/127.0.0.1#5335\nipset=/pinterest.be/gfwlist\nserver=/filmesporno.com.br/127.0.0.1#5335\nipset=/filmesporno.com.br/gfwlist\nserver=/hsprepack.akamaized.net/127.0.0.1#5335\nipset=/hsprepack.akamaized.net/gfwlist\nserver=/verisign.net/127.0.0.1#5335\nipset=/verisign.net/gfwlist\nserver=/mhhanman.xyz/127.0.0.1#5335\nipset=/mhhanman.xyz/gfwlist\nserver=/bmwarchiv.at/127.0.0.1#5335\nipset=/bmwarchiv.at/gfwlist\nserver=/hxc10.vip/127.0.0.1#5335\nipset=/hxc10.vip/gfwlist\nserver=/famous-nudes.com/127.0.0.1#5335\nipset=/famous-nudes.com/gfwlist\nserver=/aavs.xyz/127.0.0.1#5335\nipset=/aavs.xyz/gfwlist\nserver=/bestbuycanada.com/127.0.0.1#5335\nipset=/bestbuycanada.com/gfwlist\nserver=/bmw-connecteddrive.dk/127.0.0.1#5335\nipset=/bmw-connecteddrive.dk/gfwlist\nserver=/escort.guide/127.0.0.1#5335\nipset=/escort.guide/gfwlist\nserver=/scholar.google.es/127.0.0.1#5335\nipset=/scholar.google.es/gfwlist\nserver=/igoogle.com/127.0.0.1#5335\nipset=/igoogle.com/gfwlist\nserver=/apple.no/127.0.0.1#5335\nipset=/apple.no/gfwlist\nserver=/ggoogle.com/127.0.0.1#5335\nipset=/ggoogle.com/gfwlist\nserver=/applecard.tv/127.0.0.1#5335\nipset=/applecard.tv/gfwlist\nserver=/epicreads.com/127.0.0.1#5335\nipset=/epicreads.com/gfwlist\nserver=/minivalueservice.com/127.0.0.1#5335\nipset=/minivalueservice.com/gfwlist\nserver=/heroesofthestorm.com/127.0.0.1#5335\nipset=/heroesofthestorm.com/gfwlist\nserver=/xnxxhamster.net/127.0.0.1#5335\nipset=/xnxxhamster.net/gfwlist\nserver=/blogspot.com.uy/127.0.0.1#5335\nipset=/blogspot.com.uy/gfwlist\nserver=/xeon.com/127.0.0.1#5335\nipset=/xeon.com/gfwlist\nserver=/101xxx.xyz/127.0.0.1#5335\nipset=/101xxx.xyz/gfwlist\nserver=/adobetechcommcallback.com/127.0.0.1#5335\nipset=/adobetechcommcallback.com/gfwlist\nserver=/pinterest.com.py/127.0.0.1#5335\nipset=/pinterest.com.py/gfwlist\nserver=/topmanga.biz/127.0.0.1#5335\nipset=/topmanga.biz/gfwlist\nserver=/efuckt.com/127.0.0.1#5335\nipset=/efuckt.com/gfwlist\nserver=/blinkload.zone/127.0.0.1#5335\nipset=/blinkload.zone/gfwlist\nserver=/mybabehotz.com/127.0.0.1#5335\nipset=/mybabehotz.com/gfwlist\nserver=/apple.de/127.0.0.1#5335\nipset=/apple.de/gfwlist\nserver=/pinterest.com.uy/127.0.0.1#5335\nipset=/pinterest.com.uy/gfwlist\nserver=/voaportugues.com/127.0.0.1#5335\nipset=/voaportugues.com/gfwlist\nserver=/cursecdn.com/127.0.0.1#5335\nipset=/cursecdn.com/gfwlist\nserver=/annstores.net/127.0.0.1#5335\nipset=/annstores.net/gfwlist\nserver=/wolfatbestbuy.com/127.0.0.1#5335\nipset=/wolfatbestbuy.com/gfwlist\nserver=/applepay.hk/127.0.0.1#5335\nipset=/applepay.hk/gfwlist\nserver=/xn--80aaazx1an0a.lol/127.0.0.1#5335\nipset=/xn--80aaazx1an0a.lol/gfwlist\nserver=/s-msn.com/127.0.0.1#5335\nipset=/s-msn.com/gfwlist\nserver=/feet9.com/127.0.0.1#5335\nipset=/feet9.com/gfwlist\nserver=/ioinformatics.org/127.0.0.1#5335\nipset=/ioinformatics.org/gfwlist\nserver=/themessengeradelaide.com.au/127.0.0.1#5335\nipset=/themessengeradelaide.com.au/gfwlist\nserver=/exploreintel.com/127.0.0.1#5335\nipset=/exploreintel.com/gfwlist\nserver=/facebooi.com/127.0.0.1#5335\nipset=/facebooi.com/gfwlist\nserver=/scholar.google.co.ve/127.0.0.1#5335\nipset=/scholar.google.co.ve/gfwlist\nserver=/alphabet.com.es/127.0.0.1#5335\nipset=/alphabet.com.es/gfwlist\nserver=/akamainewzealand.com/127.0.0.1#5335\nipset=/akamainewzealand.com/gfwlist\nserver=/buzzardflapper.com/127.0.0.1#5335\nipset=/buzzardflapper.com/gfwlist\nserver=/honestpornreviews.com/127.0.0.1#5335\nipset=/honestpornreviews.com/gfwlist\nserver=/amateurporndump.com/127.0.0.1#5335\nipset=/amateurporndump.com/gfwlist\nserver=/amebame.com/127.0.0.1#5335\nipset=/amebame.com/gfwlist\nserver=/line-apps.com/127.0.0.1#5335\nipset=/line-apps.com/gfwlist\nserver=/camelphat.com/127.0.0.1#5335\nipset=/camelphat.com/gfwlist\nserver=/techatbloomberg.com/127.0.0.1#5335\nipset=/techatbloomberg.com/gfwlist\nserver=/winhec.com/127.0.0.1#5335\nipset=/winhec.com/gfwlist\nserver=/hotgirl.asia/127.0.0.1#5335\nipset=/hotgirl.asia/gfwlist\nserver=/pvt.sexy/127.0.0.1#5335\nipset=/pvt.sexy/gfwlist\nserver=/animestigma.com/127.0.0.1#5335\nipset=/animestigma.com/gfwlist\nserver=/google.bt/127.0.0.1#5335\nipset=/google.bt/gfwlist\nserver=/becomeindex.com/127.0.0.1#5335\nipset=/becomeindex.com/gfwlist\nserver=/disney.dk/127.0.0.1#5335\nipset=/disney.dk/gfwlist\nserver=/videobreakdown.com/127.0.0.1#5335\nipset=/videobreakdown.com/gfwlist\nserver=/oculus.com/127.0.0.1#5335\nipset=/oculus.com/gfwlist\nserver=/joyhentai.com/127.0.0.1#5335\nipset=/joyhentai.com/gfwlist\nserver=/apple.at/127.0.0.1#5335\nipset=/apple.at/gfwlist\nserver=/experience-vmware.com/127.0.0.1#5335\nipset=/experience-vmware.com/gfwlist\nserver=/nvidiaforhp.com/127.0.0.1#5335\nipset=/nvidiaforhp.com/gfwlist\nserver=/facebookphotos.com/127.0.0.1#5335\nipset=/facebookphotos.com/gfwlist\nserver=/mini-connected.ie/127.0.0.1#5335\nipset=/mini-connected.ie/gfwlist\nserver=/visacheckout.net/127.0.0.1#5335\nipset=/visacheckout.net/gfwlist\nserver=/zweiporn.com/127.0.0.1#5335\nipset=/zweiporn.com/gfwlist\nserver=/airport.com/127.0.0.1#5335\nipset=/airport.com/gfwlist\nserver=/buyaapl.com/127.0.0.1#5335\nipset=/buyaapl.com/gfwlist\nserver=/realcleardefense.com/127.0.0.1#5335\nipset=/realcleardefense.com/gfwlist\nserver=/maktoob.com/127.0.0.1#5335\nipset=/maktoob.com/gfwlist\nserver=/linefriends.com.tw/127.0.0.1#5335\nipset=/linefriends.com.tw/gfwlist\nserver=/ebaytopratedseller.net/127.0.0.1#5335\nipset=/ebaytopratedseller.net/gfwlist\nserver=/database.asahi.com/127.0.0.1#5335\nipset=/database.asahi.com/gfwlist\nserver=/analytictech.com/127.0.0.1#5335\nipset=/analytictech.com/gfwlist\nserver=/foxsportsworld.com/127.0.0.1#5335\nipset=/foxsportsworld.com/gfwlist\nserver=/avgle.com/127.0.0.1#5335\nipset=/avgle.com/gfwlist\nserver=/ixquick.com/127.0.0.1#5335\nipset=/ixquick.com/gfwlist\nserver=/backroomcastingcouch.com/127.0.0.1#5335\nipset=/backroomcastingcouch.com/gfwlist\nserver=/xknoop.com/127.0.0.1#5335\nipset=/xknoop.com/gfwlist\nserver=/canon.lu/127.0.0.1#5335\nipset=/canon.lu/gfwlist\nserver=/nikerunner.com/127.0.0.1#5335\nipset=/nikerunner.com/gfwlist\nserver=/registerhulu.com/127.0.0.1#5335\nipset=/registerhulu.com/gfwlist\nserver=/yandex.com.ge/127.0.0.1#5335\nipset=/yandex.com.ge/gfwlist\nserver=/durex.ru/127.0.0.1#5335\nipset=/durex.ru/gfwlist\nserver=/wisekey.com.hk/127.0.0.1#5335\nipset=/wisekey.com.hk/gfwlist\nserver=/volvotrucks.ch/127.0.0.1#5335\nipset=/volvotrucks.ch/gfwlist\nserver=/detaliczny.com/127.0.0.1#5335\nipset=/detaliczny.com/gfwlist\nserver=/visa.co.ao/127.0.0.1#5335\nipset=/visa.co.ao/gfwlist\nserver=/dreamtoplay.com/127.0.0.1#5335\nipset=/dreamtoplay.com/gfwlist\nserver=/paypal-notify.com/127.0.0.1#5335\nipset=/paypal-notify.com/gfwlist\nserver=/buydrdrebeatbox.com/127.0.0.1#5335\nipset=/buydrdrebeatbox.com/gfwlist\nserver=/tryfunctions.com/127.0.0.1#5335\nipset=/tryfunctions.com/gfwlist\nserver=/scoregroup.com/127.0.0.1#5335\nipset=/scoregroup.com/gfwlist\nserver=/pypl.info/127.0.0.1#5335\nipset=/pypl.info/gfwlist\nserver=/nlsexfilmpjes.com/127.0.0.1#5335\nipset=/nlsexfilmpjes.com/gfwlist\nserver=/family.co.jp/127.0.0.1#5335\nipset=/family.co.jp/gfwlist\nserver=/finish.com.tr/127.0.0.1#5335\nipset=/finish.com.tr/gfwlist\nserver=/porndiscount.org/127.0.0.1#5335\nipset=/porndiscount.org/gfwlist\nserver=/ds-vod-abematv.akamaized.net/127.0.0.1#5335\nipset=/ds-vod-abematv.akamaized.net/gfwlist\nserver=/ikea.at/127.0.0.1#5335\nipset=/ikea.at/gfwlist\nserver=/altera.com/127.0.0.1#5335\nipset=/altera.com/gfwlist\nserver=/xhamster.desi/127.0.0.1#5335\nipset=/xhamster.desi/gfwlist\nserver=/scholar.google.fr/127.0.0.1#5335\nipset=/scholar.google.fr/gfwlist\nserver=/wolterskluwer.com/127.0.0.1#5335\nipset=/wolterskluwer.com/gfwlist\nserver=/youskbe.com/127.0.0.1#5335\nipset=/youskbe.com/gfwlist\nserver=/cameraboys.com/127.0.0.1#5335\nipset=/cameraboys.com/gfwlist\nserver=/intel.ar/127.0.0.1#5335\nipset=/intel.ar/gfwlist\nserver=/bmw-connecteddrive.nl/127.0.0.1#5335\nipset=/bmw-connecteddrive.nl/gfwlist\nserver=/google.com.cu/127.0.0.1#5335\nipset=/google.com.cu/gfwlist\nserver=/paypal-survey.org/127.0.0.1#5335\nipset=/paypal-survey.org/gfwlist\nserver=/nikehyperdunk.com/127.0.0.1#5335\nipset=/nikehyperdunk.com/gfwlist\nserver=/ieeenano.org/127.0.0.1#5335\nipset=/ieeenano.org/gfwlist\nserver=/monstercockland.com/127.0.0.1#5335\nipset=/monstercockland.com/gfwlist\nserver=/shopee.com.my/127.0.0.1#5335\nipset=/shopee.com.my/gfwlist\nserver=/volvotrucks.com.kw/127.0.0.1#5335\nipset=/volvotrucks.com.kw/gfwlist\nserver=/my-enema.com/127.0.0.1#5335\nipset=/my-enema.com/gfwlist\nserver=/vanish.it/127.0.0.1#5335\nipset=/vanish.it/gfwlist\nserver=/social.com/127.0.0.1#5335\nipset=/social.com/gfwlist\nserver=/scholar.google.hu/127.0.0.1#5335\nipset=/scholar.google.hu/gfwlist\nserver=/huluim.com/127.0.0.1#5335\nipset=/huluim.com/gfwlist\nserver=/andygod.com/127.0.0.1#5335\nipset=/andygod.com/gfwlist\nserver=/wikia.com/127.0.0.1#5335\nipset=/wikia.com/gfwlist\nserver=/ipadmini.cm/127.0.0.1#5335\nipset=/ipadmini.cm/gfwlist\nserver=/pdf.new/127.0.0.1#5335\nipset=/pdf.new/gfwlist\nserver=/cebay.com/127.0.0.1#5335\nipset=/cebay.com/gfwlist\nserver=/xxxfiles.com/127.0.0.1#5335\nipset=/xxxfiles.com/gfwlist\nserver=/foxtube.com/127.0.0.1#5335\nipset=/foxtube.com/gfwlist\nserver=/2ch.hk/127.0.0.1#5335\nipset=/2ch.hk/gfwlist\nserver=/cbsstatic.com/127.0.0.1#5335\nipset=/cbsstatic.com/gfwlist\nserver=/appletips.net/127.0.0.1#5335\nipset=/appletips.net/gfwlist\nserver=/vxxsred.xyz/127.0.0.1#5335\nipset=/vxxsred.xyz/gfwlist\nserver=/pokemon-moon.com/127.0.0.1#5335\nipset=/pokemon-moon.com/gfwlist\nserver=/facebookthreads.net/127.0.0.1#5335\nipset=/facebookthreads.net/gfwlist\nserver=/avizoone.com/127.0.0.1#5335\nipset=/avizoone.com/gfwlist\nserver=/durexcanada.com/127.0.0.1#5335\nipset=/durexcanada.com/gfwlist\nserver=/mypornwap.fun/127.0.0.1#5335\nipset=/mypornwap.fun/gfwlist\nserver=/microsoftpartnersolutions.com/127.0.0.1#5335\nipset=/microsoftpartnersolutions.com/gfwlist\nserver=/erogazo-ngo.com/127.0.0.1#5335\nipset=/erogazo-ngo.com/gfwlist\nserver=/iebay.com/127.0.0.1#5335\nipset=/iebay.com/gfwlist\nserver=/docker.com/127.0.0.1#5335\nipset=/docker.com/gfwlist\nserver=/rumporn.com/127.0.0.1#5335\nipset=/rumporn.com/gfwlist\nserver=/alphabet.us/127.0.0.1#5335\nipset=/alphabet.us/gfwlist\nserver=/momsneversayno.com/127.0.0.1#5335\nipset=/momsneversayno.com/gfwlist\nserver=/pricelessmarketingengine.com/127.0.0.1#5335\nipset=/pricelessmarketingengine.com/gfwlist\nserver=/bmw-motorrad.se/127.0.0.1#5335\nipset=/bmw-motorrad.se/gfwlist\nserver=/bestpornclip.com/127.0.0.1#5335\nipset=/bestpornclip.com/gfwlist\nserver=/soccerfanz.com.my/127.0.0.1#5335\nipset=/soccerfanz.com.my/gfwlist\nserver=/wiley.com/127.0.0.1#5335\nipset=/wiley.com/gfwlist\nserver=/beatsonblackfriday2013.com/127.0.0.1#5335\nipset=/beatsonblackfriday2013.com/gfwlist\nserver=/visa.fr/127.0.0.1#5335\nipset=/visa.fr/gfwlist\nserver=/shequ8.cam/127.0.0.1#5335\nipset=/shequ8.cam/gfwlist\nserver=/starbucks.ch/127.0.0.1#5335\nipset=/starbucks.ch/gfwlist\nserver=/torrentkitty.tv/127.0.0.1#5335\nipset=/torrentkitty.tv/gfwlist\nserver=/mini.dz/127.0.0.1#5335\nipset=/mini.dz/gfwlist\nserver=/girlsongirlstube.com/127.0.0.1#5335\nipset=/girlsongirlstube.com/gfwlist\nserver=/niuc2.com/127.0.0.1#5335\nipset=/niuc2.com/gfwlist\nserver=/speedracegear.com/127.0.0.1#5335\nipset=/speedracegear.com/gfwlist\nserver=/hpuae.com/127.0.0.1#5335\nipset=/hpuae.com/gfwlist\nserver=/yahoo.com.tw/127.0.0.1#5335\nipset=/yahoo.com.tw/gfwlist\nserver=/nikkan-gendai.com/127.0.0.1#5335\nipset=/nikkan-gendai.com/gfwlist\nserver=/buyonlineheadphones.com/127.0.0.1#5335\nipset=/buyonlineheadphones.com/gfwlist\nserver=/truedepth3d.com/127.0.0.1#5335\nipset=/truedepth3d.com/gfwlist\nserver=/ichigocandy.com/127.0.0.1#5335\nipset=/ichigocandy.com/gfwlist\nserver=/royalsocietypublishing.org/127.0.0.1#5335\nipset=/royalsocietypublishing.org/gfwlist\nserver=/zoomingin.tv/127.0.0.1#5335\nipset=/zoomingin.tv/gfwlist\nserver=/discordapp.io/127.0.0.1#5335\nipset=/discordapp.io/gfwlist\nserver=/sndcdn.com/127.0.0.1#5335\nipset=/sndcdn.com/gfwlist\nserver=/modelsfreecams.com/127.0.0.1#5335\nipset=/modelsfreecams.com/gfwlist\nserver=/daytontrucktires.com/127.0.0.1#5335\nipset=/daytontrucktires.com/gfwlist\nserver=/ero-kawa.com/127.0.0.1#5335\nipset=/ero-kawa.com/gfwlist\nserver=/cabletvdirectv.com/127.0.0.1#5335\nipset=/cabletvdirectv.com/gfwlist\nserver=/getdrebeatssale.com/127.0.0.1#5335\nipset=/getdrebeatssale.com/gfwlist\nserver=/apple.co.kr/127.0.0.1#5335\nipset=/apple.co.kr/gfwlist\nserver=/dealerspeed.net/127.0.0.1#5335\nipset=/dealerspeed.net/gfwlist\nserver=/rm2029.com/127.0.0.1#5335\nipset=/rm2029.com/gfwlist\nserver=/x1337x.ws/127.0.0.1#5335\nipset=/x1337x.ws/gfwlist\nserver=/pinkcore.com/127.0.0.1#5335\nipset=/pinkcore.com/gfwlist\nserver=/dirtyscat.org/127.0.0.1#5335\nipset=/dirtyscat.org/gfwlist\nserver=/bisq.network/127.0.0.1#5335\nipset=/bisq.network/gfwlist\nserver=/0x0.st/127.0.0.1#5335\nipset=/0x0.st/gfwlist\nserver=/durex.co.th/127.0.0.1#5335\nipset=/durex.co.th/gfwlist\nserver=/pullstring.net/127.0.0.1#5335\nipset=/pullstring.net/gfwlist\nserver=/dmmapis.com/127.0.0.1#5335\nipset=/dmmapis.com/gfwlist\nserver=/pornodebolivia.net/127.0.0.1#5335\nipset=/pornodebolivia.net/gfwlist\nserver=/adultdvdtalk.com/127.0.0.1#5335\nipset=/adultdvdtalk.com/gfwlist\nserver=/free-abbywinters.com/127.0.0.1#5335\nipset=/free-abbywinters.com/gfwlist\nserver=/aflamsexhd.com/127.0.0.1#5335\nipset=/aflamsexhd.com/gfwlist\nserver=/sexyculo.com/127.0.0.1#5335\nipset=/sexyculo.com/gfwlist\nserver=/sony.it/127.0.0.1#5335\nipset=/sony.it/gfwlist\nserver=/faronics.co.uk/127.0.0.1#5335\nipset=/faronics.co.uk/gfwlist\nserver=/bridgestonerewards.com/127.0.0.1#5335\nipset=/bridgestonerewards.com/gfwlist\nserver=/disney.com.tw/127.0.0.1#5335\nipset=/disney.com.tw/gfwlist\nserver=/herokussl.com/127.0.0.1#5335\nipset=/herokussl.com/gfwlist\nserver=/harpercollins.com.au/127.0.0.1#5335\nipset=/harpercollins.com.au/gfwlist\nserver=/camwhores-tv.com/127.0.0.1#5335\nipset=/camwhores-tv.com/gfwlist\nserver=/instagramhashtags.net/127.0.0.1#5335\nipset=/instagramhashtags.net/gfwlist\nserver=/ebayy.com/127.0.0.1#5335\nipset=/ebayy.com/gfwlist\nserver=/google.co.jp/127.0.0.1#5335\nipset=/google.co.jp/gfwlist\nserver=/7mm.tv/127.0.0.1#5335\nipset=/7mm.tv/gfwlist\nserver=/findhername.net/127.0.0.1#5335\nipset=/findhername.net/gfwlist\nserver=/thenipslip.com/127.0.0.1#5335\nipset=/thenipslip.com/gfwlist\nserver=/bmw-antilles.fr/127.0.0.1#5335\nipset=/bmw-antilles.fr/gfwlist\nserver=/yandexcloud.net/127.0.0.1#5335\nipset=/yandexcloud.net/gfwlist\nserver=/ubi.com/127.0.0.1#5335\nipset=/ubi.com/gfwlist\nserver=/inventorship.com.au/127.0.0.1#5335\nipset=/inventorship.com.au/gfwlist\nserver=/ds-linear-abematv.akamaized.net/127.0.0.1#5335\nipset=/ds-linear-abematv.akamaized.net/gfwlist\nserver=/recelebrity.com/127.0.0.1#5335\nipset=/recelebrity.com/gfwlist\nserver=/trello.com/127.0.0.1#5335\nipset=/trello.com/gfwlist\nserver=/nikeelite.com/127.0.0.1#5335\nipset=/nikeelite.com/gfwlist\nserver=/beatsblackfridayretails.com/127.0.0.1#5335\nipset=/beatsblackfridayretails.com/gfwlist\nserver=/whatsapp.com/127.0.0.1#5335\nipset=/whatsapp.com/gfwlist\nserver=/durex.pl/127.0.0.1#5335\nipset=/durex.pl/gfwlist\nserver=/na-att-idns.net/127.0.0.1#5335\nipset=/na-att-idns.net/gfwlist\nserver=/babypink.to/127.0.0.1#5335\nipset=/babypink.to/gfwlist\nserver=/xvideoscom.me/127.0.0.1#5335\nipset=/xvideoscom.me/gfwlist\nserver=/ipod.ch/127.0.0.1#5335\nipset=/ipod.ch/gfwlist\nserver=/veryladyboy.com/127.0.0.1#5335\nipset=/veryladyboy.com/gfwlist\nserver=/bloombergquint.com/127.0.0.1#5335\nipset=/bloombergquint.com/gfwlist\nserver=/animalsporn.tv/127.0.0.1#5335\nipset=/animalsporn.tv/gfwlist\nserver=/volvo.ca/127.0.0.1#5335\nipset=/volvo.ca/gfwlist\nserver=/hulunet.com/127.0.0.1#5335\nipset=/hulunet.com/gfwlist\nserver=/firestonetire.com/127.0.0.1#5335\nipset=/firestonetire.com/gfwlist\nserver=/thepornarea.com/127.0.0.1#5335\nipset=/thepornarea.com/gfwlist\nserver=/asianporntrends.com/127.0.0.1#5335\nipset=/asianporntrends.com/gfwlist\nserver=/mahajantech.com/127.0.0.1#5335\nipset=/mahajantech.com/gfwlist\nserver=/shopibay.net/127.0.0.1#5335\nipset=/shopibay.net/gfwlist\nserver=/mbeats-tech.com/127.0.0.1#5335\nipset=/mbeats-tech.com/gfwlist\nserver=/cnnarabic.com/127.0.0.1#5335\nipset=/cnnarabic.com/gfwlist\nserver=/fxnetwork.com/127.0.0.1#5335\nipset=/fxnetwork.com/gfwlist\nserver=/google.net/127.0.0.1#5335\nipset=/google.net/gfwlist\nserver=/google.ga/127.0.0.1#5335\nipset=/google.ga/gfwlist\nserver=/google.no/127.0.0.1#5335\nipset=/google.no/gfwlist\nserver=/drebeatsforsaleus.com/127.0.0.1#5335\nipset=/drebeatsforsaleus.com/gfwlist\nserver=/c4slive.com/127.0.0.1#5335\nipset=/c4slive.com/gfwlist\nserver=/youtube.is/127.0.0.1#5335\nipset=/youtube.is/gfwlist\nserver=/mscrl.microsoft.com/127.0.0.1#5335\nipset=/mscrl.microsoft.com/gfwlist\nserver=/facebboc.com/127.0.0.1#5335\nipset=/facebboc.com/gfwlist\nserver=/macruby.net/127.0.0.1#5335\nipset=/macruby.net/gfwlist\nserver=/txvlog.com/127.0.0.1#5335\nipset=/txvlog.com/gfwlist\nserver=/itunesfestivals.com/127.0.0.1#5335\nipset=/itunesfestivals.com/gfwlist\nserver=/vercel.events/127.0.0.1#5335\nipset=/vercel.events/gfwlist\nserver=/pastebin.com/127.0.0.1#5335\nipset=/pastebin.com/gfwlist\nserver=/enfagrow4.com/127.0.0.1#5335\nipset=/enfagrow4.com/gfwlist\nserver=/applenews.tv/127.0.0.1#5335\nipset=/applenews.tv/gfwlist\nserver=/volvogroup.com.br/127.0.0.1#5335\nipset=/volvogroup.com.br/gfwlist\nserver=/harpercollins.ca/127.0.0.1#5335\nipset=/harpercollins.ca/gfwlist\nserver=/knowswho.co.jp/127.0.0.1#5335\nipset=/knowswho.co.jp/gfwlist\nserver=/rarbgget.org/127.0.0.1#5335\nipset=/rarbgget.org/gfwlist\nserver=/palcomix.com/127.0.0.1#5335\nipset=/palcomix.com/gfwlist\nserver=/18jms.com/127.0.0.1#5335\nipset=/18jms.com/gfwlist\nserver=/gratisvideokijken.nl/127.0.0.1#5335\nipset=/gratisvideokijken.nl/gfwlist\nserver=/osm.org/127.0.0.1#5335\nipset=/osm.org/gfwlist\nserver=/me-gay.com/127.0.0.1#5335\nipset=/me-gay.com/gfwlist\nserver=/notion.site/127.0.0.1#5335\nipset=/notion.site/gfwlist\nserver=/keytransparency.foo/127.0.0.1#5335\nipset=/keytransparency.foo/gfwlist\nserver=/google.ru/127.0.0.1#5335\nipset=/google.ru/gfwlist\nserver=/asm.org/127.0.0.1#5335\nipset=/asm.org/gfwlist\nserver=/lushstories.com/127.0.0.1#5335\nipset=/lushstories.com/gfwlist\nserver=/foxcredit.org/127.0.0.1#5335\nipset=/foxcredit.org/gfwlist\nserver=/applestore.com.hk/127.0.0.1#5335\nipset=/applestore.com.hk/gfwlist\nserver=/google.com.gt/127.0.0.1#5335\nipset=/google.com.gt/gfwlist\nserver=/charlestonroadregistry.com/127.0.0.1#5335\nipset=/charlestonroadregistry.com/gfwlist\nserver=/asha.org/127.0.0.1#5335\nipset=/asha.org/gfwlist\nserver=/creativesdk.com/127.0.0.1#5335\nipset=/creativesdk.com/gfwlist\nserver=/airhorn.solutions/127.0.0.1#5335\nipset=/airhorn.solutions/gfwlist\nserver=/bittrex.com/127.0.0.1#5335\nipset=/bittrex.com/gfwlist\nserver=/cloudrobotics.com/127.0.0.1#5335\nipset=/cloudrobotics.com/gfwlist\nserver=/java.net/127.0.0.1#5335\nipset=/java.net/gfwlist\nserver=/pokemon-sun.com/127.0.0.1#5335\nipset=/pokemon-sun.com/gfwlist\nserver=/koubaibu.jp/127.0.0.1#5335\nipset=/koubaibu.jp/gfwlist\nserver=/volvobuses.de/127.0.0.1#5335\nipset=/volvobuses.de/gfwlist\nserver=/easymatureporn.com/127.0.0.1#5335\nipset=/easymatureporn.com/gfwlist\nserver=/extremepornfilms.com/127.0.0.1#5335\nipset=/extremepornfilms.com/gfwlist\nserver=/uun99.com/127.0.0.1#5335\nipset=/uun99.com/gfwlist\nserver=/ebayclassifieds.info/127.0.0.1#5335\nipset=/ebayclassifieds.info/gfwlist\nserver=/manyvids.com/127.0.0.1#5335\nipset=/manyvids.com/gfwlist\nserver=/gmossp-sp.jp/127.0.0.1#5335\nipset=/gmossp-sp.jp/gfwlist\nserver=/pearson.cl/127.0.0.1#5335\nipset=/pearson.cl/gfwlist\nserver=/epochcar.com/127.0.0.1#5335\nipset=/epochcar.com/gfwlist\nserver=/lululu.one/127.0.0.1#5335\nipset=/lululu.one/gfwlist\nserver=/cinemax.com/127.0.0.1#5335\nipset=/cinemax.com/gfwlist\nserver=/whatisairwatch.com/127.0.0.1#5335\nipset=/whatisairwatch.com/gfwlist\nserver=/pvzgw2.com/127.0.0.1#5335\nipset=/pvzgw2.com/gfwlist\nserver=/1e100.net/127.0.0.1#5335\nipset=/1e100.net/gfwlist\nserver=/dlsitestudio.com/127.0.0.1#5335\nipset=/dlsitestudio.com/gfwlist\nserver=/dettol.net/127.0.0.1#5335\nipset=/dettol.net/gfwlist\nserver=/nike-fr.com/127.0.0.1#5335\nipset=/nike-fr.com/gfwlist\nserver=/tedcdn.com/127.0.0.1#5335\nipset=/tedcdn.com/gfwlist\nserver=/youtube.com.ua/127.0.0.1#5335\nipset=/youtube.com.ua/gfwlist\nserver=/vsezoo.com/127.0.0.1#5335\nipset=/vsezoo.com/gfwlist\nserver=/intunewiki.com/127.0.0.1#5335\nipset=/intunewiki.com/gfwlist\nserver=/erotic-hentai.com/127.0.0.1#5335\nipset=/erotic-hentai.com/gfwlist\nserver=/beatsdreforsale.com/127.0.0.1#5335\nipset=/beatsdreforsale.com/gfwlist\nserver=/bmw-driving-center.co.kr/127.0.0.1#5335\nipset=/bmw-driving-center.co.kr/gfwlist\nserver=/intel.dz/127.0.0.1#5335\nipset=/intel.dz/gfwlist\nserver=/conair.me/127.0.0.1#5335\nipset=/conair.me/gfwlist\nserver=/cloudyzgirl.com/127.0.0.1#5335\nipset=/cloudyzgirl.com/gfwlist\nserver=/applewatch.tv/127.0.0.1#5335\nipset=/applewatch.tv/gfwlist\nserver=/hkt-enterprise.com/127.0.0.1#5335\nipset=/hkt-enterprise.com/gfwlist\nserver=/nvidia.it/127.0.0.1#5335\nipset=/nvidia.it/gfwlist\nserver=/welcomix.com/127.0.0.1#5335\nipset=/welcomix.com/gfwlist\nserver=/cispaletter.com/127.0.0.1#5335\nipset=/cispaletter.com/gfwlist\nserver=/drdrebeatsuk.com/127.0.0.1#5335\nipset=/drdrebeatsuk.com/gfwlist\nserver=/volvotrucks.tn/127.0.0.1#5335\nipset=/volvotrucks.tn/gfwlist\nserver=/adbecrsl.com/127.0.0.1#5335\nipset=/adbecrsl.com/gfwlist\nserver=/newscorp.com/127.0.0.1#5335\nipset=/newscorp.com/gfwlist\nserver=/paypal-profile.com/127.0.0.1#5335\nipset=/paypal-profile.com/gfwlist\nserver=/vfsco.bg/127.0.0.1#5335\nipset=/vfsco.bg/gfwlist\nserver=/quiksee.com/127.0.0.1#5335\nipset=/quiksee.com/gfwlist\nserver=/awsstatic.com/127.0.0.1#5335\nipset=/awsstatic.com/gfwlist\nserver=/bmw.md/127.0.0.1#5335\nipset=/bmw.md/gfwlist\nserver=/facebookdating.net/127.0.0.1#5335\nipset=/facebookdating.net/gfwlist\nserver=/62fh1bnj.me/127.0.0.1#5335\nipset=/62fh1bnj.me/gfwlist\nserver=/porngladiator.com/127.0.0.1#5335\nipset=/porngladiator.com/gfwlist\nserver=/cfake.com/127.0.0.1#5335\nipset=/cfake.com/gfwlist\nserver=/myxxgirl.com/127.0.0.1#5335\nipset=/myxxgirl.com/gfwlist\nserver=/dmed.technology/127.0.0.1#5335\nipset=/dmed.technology/gfwlist\nserver=/cricketcountry.com/127.0.0.1#5335\nipset=/cricketcountry.com/gfwlist\nserver=/pinterest.ru/127.0.0.1#5335\nipset=/pinterest.ru/gfwlist\nserver=/peoplenews.tw/127.0.0.1#5335\nipset=/peoplenews.tw/gfwlist\nserver=/ikea.com.my/127.0.0.1#5335\nipset=/ikea.com.my/gfwlist\nserver=/naturemag.org/127.0.0.1#5335\nipset=/naturemag.org/gfwlist\nserver=/intel.tv/127.0.0.1#5335\nipset=/intel.tv/gfwlist\nserver=/steamserver.net/127.0.0.1#5335\nipset=/steamserver.net/gfwlist\nserver=/realcuckoldsex.com/127.0.0.1#5335\nipset=/realcuckoldsex.com/gfwlist\nserver=/torproject.org/127.0.0.1#5335\nipset=/torproject.org/gfwlist\nserver=/narumiya.xii.jp/127.0.0.1#5335\nipset=/narumiya.xii.jp/gfwlist\nserver=/daytonbmw.com/127.0.0.1#5335\nipset=/daytonbmw.com/gfwlist\nserver=/netflixdnstest5.com/127.0.0.1#5335\nipset=/netflixdnstest5.com/gfwlist\nserver=/nude-pics.org/127.0.0.1#5335\nipset=/nude-pics.org/gfwlist\nserver=/applepay.jp/127.0.0.1#5335\nipset=/applepay.jp/gfwlist\nserver=/jav321.com/127.0.0.1#5335\nipset=/jav321.com/gfwlist\nserver=/finish.lv/127.0.0.1#5335\nipset=/finish.lv/gfwlist\nserver=/fbinfer.com/127.0.0.1#5335\nipset=/fbinfer.com/gfwlist\nserver=/amateurcuckoldporn.com/127.0.0.1#5335\nipset=/amateurcuckoldporn.com/gfwlist\nserver=/bareporno.com/127.0.0.1#5335\nipset=/bareporno.com/gfwlist\nserver=/keyporntube.com/127.0.0.1#5335\nipset=/keyporntube.com/gfwlist\nserver=/snap-dev.net/127.0.0.1#5335\nipset=/snap-dev.net/gfwlist\nserver=/researchkit.net/127.0.0.1#5335\nipset=/researchkit.net/gfwlist\nserver=/sokmil.com/127.0.0.1#5335\nipset=/sokmil.com/gfwlist\nserver=/telesec.de/127.0.0.1#5335\nipset=/telesec.de/gfwlist\nserver=/mastercard.com/127.0.0.1#5335\nipset=/mastercard.com/gfwlist\nserver=/insiderintelligence.com/127.0.0.1#5335\nipset=/insiderintelligence.com/gfwlist\nserver=/bridgestonemarketing.com/127.0.0.1#5335\nipset=/bridgestonemarketing.com/gfwlist\nserver=/amatporn.com/127.0.0.1#5335\nipset=/amatporn.com/gfwlist\nserver=/connectcommerce.info/127.0.0.1#5335\nipset=/connectcommerce.info/gfwlist\nserver=/shit-porn.net/127.0.0.1#5335\nipset=/shit-porn.net/gfwlist\nserver=/bmw-ghana.com/127.0.0.1#5335\nipset=/bmw-ghana.com/gfwlist\nserver=/microsoftads.com/127.0.0.1#5335\nipset=/microsoftads.com/gfwlist\nserver=/lolclub.org/127.0.0.1#5335\nipset=/lolclub.org/gfwlist\nserver=/vanish.at/127.0.0.1#5335\nipset=/vanish.at/gfwlist\nserver=/gfycat.com/127.0.0.1#5335\nipset=/gfycat.com/gfwlist\nserver=/google.be/127.0.0.1#5335\nipset=/google.be/gfwlist\nserver=/magicalmirai.com/127.0.0.1#5335\nipset=/magicalmirai.com/gfwlist\nserver=/vfsco.lv/127.0.0.1#5335\nipset=/vfsco.lv/gfwlist\nserver=/oann.com/127.0.0.1#5335\nipset=/oann.com/gfwlist\nserver=/smartonesolutions.com.hk/127.0.0.1#5335\nipset=/smartonesolutions.com.hk/gfwlist\nserver=/coolloud.org.tw/127.0.0.1#5335\nipset=/coolloud.org.tw/gfwlist\nserver=/pittpatt.com/127.0.0.1#5335\nipset=/pittpatt.com/gfwlist\nserver=/yourfreeporn.tv/127.0.0.1#5335\nipset=/yourfreeporn.tv/gfwlist\nserver=/kmc-av.com/127.0.0.1#5335\nipset=/kmc-av.com/gfwlist\nserver=/blackfridaydrebeatsshop.com/127.0.0.1#5335\nipset=/blackfridaydrebeatsshop.com/gfwlist\nserver=/zdusercontent.com/127.0.0.1#5335\nipset=/zdusercontent.com/gfwlist\nserver=/kindleoasis.info/127.0.0.1#5335\nipset=/kindleoasis.info/gfwlist\nserver=/pornhat.com/127.0.0.1#5335\nipset=/pornhat.com/gfwlist\nserver=/youtube.com.ng/127.0.0.1#5335\nipset=/youtube.com.ng/gfwlist\nserver=/exxxtrasmall1.com/127.0.0.1#5335\nipset=/exxxtrasmall1.com/gfwlist\nserver=/vmwdemo.com/127.0.0.1#5335\nipset=/vmwdemo.com/gfwlist\nserver=/facebzook.com/127.0.0.1#5335\nipset=/facebzook.com/gfwlist\nserver=/renderos.com/127.0.0.1#5335\nipset=/renderos.com/gfwlist\nserver=/thomsonreuters.com.my/127.0.0.1#5335\nipset=/thomsonreuters.com.my/gfwlist\nserver=/putty.org/127.0.0.1#5335\nipset=/putty.org/gfwlist\nserver=/voahausa.com/127.0.0.1#5335\nipset=/voahausa.com/gfwlist\nserver=/porndeepfake.net/127.0.0.1#5335\nipset=/porndeepfake.net/gfwlist\nserver=/apple-mapkit.com/127.0.0.1#5335\nipset=/apple-mapkit.com/gfwlist\nserver=/moxing.news/127.0.0.1#5335\nipset=/moxing.news/gfwlist\nserver=/nekoxxx.com/127.0.0.1#5335\nipset=/nekoxxx.com/gfwlist\nserver=/fei.ru/127.0.0.1#5335\nipset=/fei.ru/gfwlist\nserver=/applecomputer.hu/127.0.0.1#5335\nipset=/applecomputer.hu/gfwlist\nserver=/iphone.com/127.0.0.1#5335\nipset=/iphone.com/gfwlist\nserver=/mdpi.com/127.0.0.1#5335\nipset=/mdpi.com/gfwlist\nserver=/nginx.org/127.0.0.1#5335\nipset=/nginx.org/gfwlist\nserver=/sexanime.net/127.0.0.1#5335\nipset=/sexanime.net/gfwlist\nserver=/artstationmedia.com/127.0.0.1#5335\nipset=/artstationmedia.com/gfwlist\nserver=/bridgestone.com.br/127.0.0.1#5335\nipset=/bridgestone.com.br/gfwlist\nserver=/google.com.bn/127.0.0.1#5335\nipset=/google.com.bn/gfwlist\nserver=/shopdisney.com/127.0.0.1#5335\nipset=/shopdisney.com/gfwlist\nserver=/foxsports.net/127.0.0.1#5335\nipset=/foxsports.net/gfwlist\nserver=/beatsep.com/127.0.0.1#5335\nipset=/beatsep.com/gfwlist\nserver=/paypal-merchantloyalty.com/127.0.0.1#5335\nipset=/paypal-merchantloyalty.com/gfwlist\nserver=/atwiki.jp/127.0.0.1#5335\nipset=/atwiki.jp/gfwlist\nserver=/bmw-connecteddrive.pt/127.0.0.1#5335\nipset=/bmw-connecteddrive.pt/gfwlist\nserver=/nikeonlinestore.com/127.0.0.1#5335\nipset=/nikeonlinestore.com/gfwlist\nserver=/mastercard.com.sa/127.0.0.1#5335\nipset=/mastercard.com.sa/gfwlist\nserver=/amateuralbum.net/127.0.0.1#5335\nipset=/amateuralbum.net/gfwlist\nserver=/xvxxtube.com/127.0.0.1#5335\nipset=/xvxxtube.com/gfwlist\nserver=/bucketeer.jp/127.0.0.1#5335\nipset=/bucketeer.jp/gfwlist\nserver=/logitechio.com.cn/127.0.0.1#5335\nipset=/logitechio.com.cn/gfwlist\nserver=/ikea.hu/127.0.0.1#5335\nipset=/ikea.hu/gfwlist\nserver=/edge-skype-com.s-0001.s-msedge.net/127.0.0.1#5335\nipset=/edge-skype-com.s-0001.s-msedge.net/gfwlist\nserver=/sexgalaxy.net/127.0.0.1#5335\nipset=/sexgalaxy.net/gfwlist\nserver=/jstage.jst.go.jp/127.0.0.1#5335\nipset=/jstage.jst.go.jp/gfwlist\nserver=/amateurblowjobporn.com/127.0.0.1#5335\nipset=/amateurblowjobporn.com/gfwlist\nserver=/watchteencam.com/127.0.0.1#5335\nipset=/watchteencam.com/gfwlist\nserver=/facebookawards.com/127.0.0.1#5335\nipset=/facebookawards.com/gfwlist\nserver=/cloudflare-dns.com/127.0.0.1#5335\nipset=/cloudflare-dns.com/gfwlist\nserver=/porngeek.com/127.0.0.1#5335\nipset=/porngeek.com/gfwlist\nserver=/bmwgroup-posdigital.com/127.0.0.1#5335\nipset=/bmwgroup-posdigital.com/gfwlist\nserver=/bridgestone.com.mx/127.0.0.1#5335\nipset=/bridgestone.com.mx/gfwlist\nserver=/hqtube.xxx/127.0.0.1#5335\nipset=/hqtube.xxx/gfwlist\nserver=/deutschsex.com/127.0.0.1#5335\nipset=/deutschsex.com/gfwlist\nserver=/hidive.com/127.0.0.1#5335\nipset=/hidive.com/gfwlist\nserver=/lolusercontent.com/127.0.0.1#5335\nipset=/lolusercontent.com/gfwlist\nserver=/ikea.co.at/127.0.0.1#5335\nipset=/ikea.co.at/gfwlist\nserver=/pinterest.co.uk/127.0.0.1#5335\nipset=/pinterest.co.uk/gfwlist\nserver=/volvotrucks.com.ua/127.0.0.1#5335\nipset=/volvotrucks.com.ua/gfwlist\nserver=/wrenchead.com/127.0.0.1#5335\nipset=/wrenchead.com/gfwlist\nserver=/1337x.is/127.0.0.1#5335\nipset=/1337x.is/gfwlist\nserver=/mariokart8.com/127.0.0.1#5335\nipset=/mariokart8.com/gfwlist\nserver=/bangher.net/127.0.0.1#5335\nipset=/bangher.net/gfwlist\nserver=/cnbetacdn.com/127.0.0.1#5335\nipset=/cnbetacdn.com/gfwlist\nserver=/pearsonassessment.dk/127.0.0.1#5335\nipset=/pearsonassessment.dk/gfwlist\nserver=/bloombergbeta.com/127.0.0.1#5335\nipset=/bloombergbeta.com/gfwlist\nserver=/gittigidiyor.net/127.0.0.1#5335\nipset=/gittigidiyor.net/gfwlist\nserver=/pricelessarabia.com/127.0.0.1#5335\nipset=/pricelessarabia.com/gfwlist\nserver=/booksinprint.com/127.0.0.1#5335\nipset=/booksinprint.com/gfwlist\nserver=/letsencrypt.org/127.0.0.1#5335\nipset=/letsencrypt.org/gfwlist\nserver=/toppornsites.net/127.0.0.1#5335\nipset=/toppornsites.net/gfwlist\nserver=/visa.com.bs/127.0.0.1#5335\nipset=/visa.com.bs/gfwlist\nserver=/morisawa.co.jp/127.0.0.1#5335\nipset=/morisawa.co.jp/gfwlist\nserver=/nikeaw77.com/127.0.0.1#5335\nipset=/nikeaw77.com/gfwlist\nserver=/cordcloud.org/127.0.0.1#5335\nipset=/cordcloud.org/gfwlist\nserver=/igkbroker.com/127.0.0.1#5335\nipset=/igkbroker.com/gfwlist\nserver=/omotenashi.cygames.jp/127.0.0.1#5335\nipset=/omotenashi.cygames.jp/gfwlist\nserver=/blogspot.al/127.0.0.1#5335\nipset=/blogspot.al/gfwlist\nserver=/myfoxzone.com/127.0.0.1#5335\nipset=/myfoxzone.com/gfwlist\nserver=/nvidia.be/127.0.0.1#5335\nipset=/nvidia.be/gfwlist\nserver=/playwarcraft3.com/127.0.0.1#5335\nipset=/playwarcraft3.com/gfwlist\nserver=/bbhub.io/127.0.0.1#5335\nipset=/bbhub.io/gfwlist\nserver=/vercel.store/127.0.0.1#5335\nipset=/vercel.store/gfwlist\nserver=/google.co.il/127.0.0.1#5335\nipset=/google.co.il/gfwlist\nserver=/hegre.com/127.0.0.1#5335\nipset=/hegre.com/gfwlist\nserver=/enfagrow.com.bn/127.0.0.1#5335\nipset=/enfagrow.com.bn/gfwlist\nserver=/pornwild.to/127.0.0.1#5335\nipset=/pornwild.to/gfwlist\nserver=/nicodic.jp/127.0.0.1#5335\nipset=/nicodic.jp/gfwlist\nserver=/justporno.es/127.0.0.1#5335\nipset=/justporno.es/gfwlist\nserver=/kindle.de/127.0.0.1#5335\nipset=/kindle.de/gfwlist\nserver=/yahoo.bi/127.0.0.1#5335\nipset=/yahoo.bi/gfwlist\nserver=/amazon.ae/127.0.0.1#5335\nipset=/amazon.ae/gfwlist\nserver=/mageconf.com/127.0.0.1#5335\nipset=/mageconf.com/gfwlist\nserver=/voatiengviet.com/127.0.0.1#5335\nipset=/voatiengviet.com/gfwlist\nserver=/boylove1.cc/127.0.0.1#5335\nipset=/boylove1.cc/gfwlist\nserver=/latencytop.com/127.0.0.1#5335\nipset=/latencytop.com/gfwlist\nserver=/alexa.com/127.0.0.1#5335\nipset=/alexa.com/gfwlist\nserver=/porncana.com/127.0.0.1#5335\nipset=/porncana.com/gfwlist\nserver=/shopee.vn/127.0.0.1#5335\nipset=/shopee.vn/gfwlist\nserver=/hentaistube.com/127.0.0.1#5335\nipset=/hentaistube.com/gfwlist\nserver=/seniortgp.com/127.0.0.1#5335\nipset=/seniortgp.com/gfwlist\nserver=/wikinews.org/127.0.0.1#5335\nipset=/wikinews.org/gfwlist\nserver=/gettyimages.com.mx/127.0.0.1#5335\nipset=/gettyimages.com.mx/gfwlist\nserver=/3movs.com/127.0.0.1#5335\nipset=/3movs.com/gfwlist\nserver=/geeksquadonline.com/127.0.0.1#5335\nipset=/geeksquadonline.com/gfwlist\nserver=/alphera-finance.com.hk/127.0.0.1#5335\nipset=/alphera-finance.com.hk/gfwlist\nserver=/hustler.com/127.0.0.1#5335\nipset=/hustler.com/gfwlist\nserver=/openstreetmaps.org/127.0.0.1#5335\nipset=/openstreetmaps.org/gfwlist\nserver=/launchpad.net/127.0.0.1#5335\nipset=/launchpad.net/gfwlist\nserver=/ikea.pt/127.0.0.1#5335\nipset=/ikea.pt/gfwlist\nserver=/blacktowhite.net/127.0.0.1#5335\nipset=/blacktowhite.net/gfwlist\nserver=/youtube.ee/127.0.0.1#5335\nipset=/youtube.ee/gfwlist\nserver=/hddirectv.com/127.0.0.1#5335\nipset=/hddirectv.com/gfwlist\nserver=/visa.com.jm/127.0.0.1#5335\nipset=/visa.com.jm/gfwlist\nserver=/justporno.sex/127.0.0.1#5335\nipset=/justporno.sex/gfwlist\nserver=/pornoweb.win/127.0.0.1#5335\nipset=/pornoweb.win/gfwlist\nserver=/battlefieldbadcompany2.com/127.0.0.1#5335\nipset=/battlefieldbadcompany2.com/gfwlist\nserver=/adobeexchange.com/127.0.0.1#5335\nipset=/adobeexchange.com/gfwlist\nserver=/localizejs.com/127.0.0.1#5335\nipset=/localizejs.com/gfwlist\nserver=/bmworegon.com/127.0.0.1#5335\nipset=/bmworegon.com/gfwlist\nserver=/pcre.org/127.0.0.1#5335\nipset=/pcre.org/gfwlist\nserver=/ilove-movies.com/127.0.0.1#5335\nipset=/ilove-movies.com/gfwlist\nserver=/applescreensavers.com/127.0.0.1#5335\nipset=/applescreensavers.com/gfwlist\nserver=/hentailegendado.com/127.0.0.1#5335\nipset=/hentailegendado.com/gfwlist\nserver=/xn--x-qeu1ji09tzlg.biz/127.0.0.1#5335\nipset=/xn--x-qeu1ji09tzlg.biz/gfwlist\nserver=/instagramkusu.com/127.0.0.1#5335\nipset=/instagramkusu.com/gfwlist\nserver=/nikefoundation.org/127.0.0.1#5335\nipset=/nikefoundation.org/gfwlist\nserver=/vercel-status.com/127.0.0.1#5335\nipset=/vercel-status.com/gfwlist\nserver=/qzav.tv/127.0.0.1#5335\nipset=/qzav.tv/gfwlist\nserver=/hdtube1.com/127.0.0.1#5335\nipset=/hdtube1.com/gfwlist\nserver=/bmw-connecteddrive.ro/127.0.0.1#5335\nipset=/bmw-connecteddrive.ro/gfwlist\nserver=/mybeatsbydrestudio.com/127.0.0.1#5335\nipset=/mybeatsbydrestudio.com/gfwlist\nserver=/beatsbydrdrecustom.com/127.0.0.1#5335\nipset=/beatsbydrdrecustom.com/gfwlist\nserver=/metropolitana.tokyo/127.0.0.1#5335\nipset=/metropolitana.tokyo/gfwlist\nserver=/gimy.co/127.0.0.1#5335\nipset=/gimy.co/gfwlist\nserver=/e-bay.com/127.0.0.1#5335\nipset=/e-bay.com/gfwlist\nserver=/gannett-cdn.com/127.0.0.1#5335\nipset=/gannett-cdn.com/gfwlist\nserver=/vol.moe/127.0.0.1#5335\nipset=/vol.moe/gfwlist\nserver=/razer.com/127.0.0.1#5335\nipset=/razer.com/gfwlist\nserver=/nurofen.hr/127.0.0.1#5335\nipset=/nurofen.hr/gfwlist\nserver=/xiaofu.me/127.0.0.1#5335\nipset=/xiaofu.me/gfwlist\nserver=/jneurosci.org/127.0.0.1#5335\nipset=/jneurosci.org/gfwlist\nserver=/paypal-gifts.com/127.0.0.1#5335\nipset=/paypal-gifts.com/gfwlist\nserver=/yahoofinance.com/127.0.0.1#5335\nipset=/yahoofinance.com/gfwlist\nserver=/voxops.net/127.0.0.1#5335\nipset=/voxops.net/gfwlist\nserver=/okex.com/127.0.0.1#5335\nipset=/okex.com/gfwlist\nserver=/rustup.rs/127.0.0.1#5335\nipset=/rustup.rs/gfwlist\nserver=/teenporntube.xxx/127.0.0.1#5335\nipset=/teenporntube.xxx/gfwlist\nserver=/iphonecase5.com/127.0.0.1#5335\nipset=/iphonecase5.com/gfwlist\nserver=/akamai-cdn.com/127.0.0.1#5335\nipset=/akamai-cdn.com/gfwlist\nserver=/iqq3.cc/127.0.0.1#5335\nipset=/iqq3.cc/gfwlist\nserver=/extrajapaneseporn.com/127.0.0.1#5335\nipset=/extrajapaneseporn.com/gfwlist\nserver=/bydrebeats.com/127.0.0.1#5335\nipset=/bydrebeats.com/gfwlist\nserver=/pagecdn.io/127.0.0.1#5335\nipset=/pagecdn.io/gfwlist\nserver=/facebookcareer.com/127.0.0.1#5335\nipset=/facebookcareer.com/gfwlist\nserver=/mastercard.cl/127.0.0.1#5335\nipset=/mastercard.cl/gfwlist\nserver=/componentkit.org/127.0.0.1#5335\nipset=/componentkit.org/gfwlist\nserver=/mywife.cc/127.0.0.1#5335\nipset=/mywife.cc/gfwlist\nserver=/facebook.nl/127.0.0.1#5335\nipset=/facebook.nl/gfwlist\nserver=/keytransparency.com/127.0.0.1#5335\nipset=/keytransparency.com/gfwlist\nserver=/wwwxoom.com/127.0.0.1#5335\nipset=/wwwxoom.com/gfwlist\nserver=/amd.com/127.0.0.1#5335\nipset=/amd.com/gfwlist\nserver=/japteenx.com/127.0.0.1#5335\nipset=/japteenx.com/gfwlist\nserver=/hulucall.com/127.0.0.1#5335\nipset=/hulucall.com/gfwlist\nserver=/microsoftonline.com/127.0.0.1#5335\nipset=/microsoftonline.com/gfwlist\nserver=/graiasmovies.com/127.0.0.1#5335\nipset=/graiasmovies.com/gfwlist\nserver=/nikeidshoes.com/127.0.0.1#5335\nipset=/nikeidshoes.com/gfwlist\nserver=/google.rs/127.0.0.1#5335\nipset=/google.rs/gfwlist\nserver=/myfoxny.com/127.0.0.1#5335\nipset=/myfoxny.com/gfwlist\nserver=/xvideos.tv.br/127.0.0.1#5335\nipset=/xvideos.tv.br/gfwlist\nserver=/foxnews.tv/127.0.0.1#5335\nipset=/foxnews.tv/gfwlist\nserver=/hongmaodan100.com/127.0.0.1#5335\nipset=/hongmaodan100.com/gfwlist\nserver=/topbeatsforsale.com/127.0.0.1#5335\nipset=/topbeatsforsale.com/gfwlist\nserver=/pearsonperu.pe/127.0.0.1#5335\nipset=/pearsonperu.pe/gfwlist\nserver=/gayrawclub.com/127.0.0.1#5335\nipset=/gayrawclub.com/gfwlist\nserver=/chromebook.com/127.0.0.1#5335\nipset=/chromebook.com/gfwlist\nserver=/newsconcierge.com.au/127.0.0.1#5335\nipset=/newsconcierge.com.au/gfwlist\nserver=/velkaepocha.cz/127.0.0.1#5335\nipset=/velkaepocha.cz/gfwlist\nserver=/homo.xxx/127.0.0.1#5335\nipset=/homo.xxx/gfwlist\nserver=/mini.re/127.0.0.1#5335\nipset=/mini.re/gfwlist\nserver=/ieeemagnetics.org/127.0.0.1#5335\nipset=/ieeemagnetics.org/gfwlist\nserver=/halfjapan.com/127.0.0.1#5335\nipset=/halfjapan.com/gfwlist\nserver=/outlook.com/127.0.0.1#5335\nipset=/outlook.com/gfwlist\nserver=/filmeporno.blog/127.0.0.1#5335\nipset=/filmeporno.blog/gfwlist\nserver=/xxbook.cc/127.0.0.1#5335\nipset=/xxbook.cc/gfwlist\nserver=/huffingtonpost.gr/127.0.0.1#5335\nipset=/huffingtonpost.gr/gfwlist\nserver=/592r.com/127.0.0.1#5335\nipset=/592r.com/gfwlist\nserver=/beatsbydreauofficial.com/127.0.0.1#5335\nipset=/beatsbydreauofficial.com/gfwlist\nserver=/cuckwatchingwife.com/127.0.0.1#5335\nipset=/cuckwatchingwife.com/gfwlist\nserver=/cockofhorse.com/127.0.0.1#5335\nipset=/cockofhorse.com/gfwlist\nserver=/nutaku.com/127.0.0.1#5335\nipset=/nutaku.com/gfwlist\nserver=/mature-nl.eu/127.0.0.1#5335\nipset=/mature-nl.eu/gfwlist\nserver=/paypalnetwork.info/127.0.0.1#5335\nipset=/paypalnetwork.info/gfwlist\nserver=/azadiradio.com/127.0.0.1#5335\nipset=/azadiradio.com/gfwlist\nserver=/anaconda.com/127.0.0.1#5335\nipset=/anaconda.com/gfwlist\nserver=/affirmtrust.com/127.0.0.1#5335\nipset=/affirmtrust.com/gfwlist\nserver=/microsoft.fi/127.0.0.1#5335\nipset=/microsoft.fi/gfwlist\nserver=/iphone4.com.br/127.0.0.1#5335\nipset=/iphone4.com.br/gfwlist\nserver=/tyler-brown.com/127.0.0.1#5335\nipset=/tyler-brown.com/gfwlist\nserver=/buypass.com/127.0.0.1#5335\nipset=/buypass.com/gfwlist\nserver=/uplust.com/127.0.0.1#5335\nipset=/uplust.com/gfwlist\nserver=/nvidia.asia/127.0.0.1#5335\nipset=/nvidia.asia/gfwlist\nserver=/teendreams.com/127.0.0.1#5335\nipset=/teendreams.com/gfwlist\nserver=/longman.ch/127.0.0.1#5335\nipset=/longman.ch/gfwlist\nserver=/starbucks.com.gr/127.0.0.1#5335\nipset=/starbucks.com.gr/gfwlist\nserver=/fout.jp/127.0.0.1#5335\nipset=/fout.jp/gfwlist\nserver=/google.com.tw/127.0.0.1#5335\nipset=/google.com.tw/gfwlist\nserver=/intel.ch/127.0.0.1#5335\nipset=/intel.ch/gfwlist\nserver=/apa.org/127.0.0.1#5335\nipset=/apa.org/gfwlist\nserver=/strikingly.com/127.0.0.1#5335\nipset=/strikingly.com/gfwlist\nserver=/yahoo.tl/127.0.0.1#5335\nipset=/yahoo.tl/gfwlist\nserver=/xiaogirls.com/127.0.0.1#5335\nipset=/xiaogirls.com/gfwlist\nserver=/cargigileads.com/127.0.0.1#5335\nipset=/cargigileads.com/gfwlist\nserver=/google.com.kh/127.0.0.1#5335\nipset=/google.com.kh/gfwlist\nserver=/coinonecorp.com/127.0.0.1#5335\nipset=/coinonecorp.com/gfwlist\nserver=/javfuck.net/127.0.0.1#5335\nipset=/javfuck.net/gfwlist\nserver=/iskoot.com/127.0.0.1#5335\nipset=/iskoot.com/gfwlist\nserver=/2o7.net/127.0.0.1#5335\nipset=/2o7.net/gfwlist\nserver=/scholar.google.com.vn/127.0.0.1#5335\nipset=/scholar.google.com.vn/gfwlist\nserver=/comments.app/127.0.0.1#5335\nipset=/comments.app/gfwlist\nserver=/thebanker.com/127.0.0.1#5335\nipset=/thebanker.com/gfwlist\nserver=/skysports.com/127.0.0.1#5335\nipset=/skysports.com/gfwlist\nserver=/freenode.net/127.0.0.1#5335\nipset=/freenode.net/gfwlist\nserver=/mini.ru/127.0.0.1#5335\nipset=/mini.ru/gfwlist\nserver=/1lib.cloud/127.0.0.1#5335\nipset=/1lib.cloud/gfwlist\nserver=/supadou.blogism.jp/127.0.0.1#5335\nipset=/supadou.blogism.jp/gfwlist\nserver=/maddenrewards.com/127.0.0.1#5335\nipset=/maddenrewards.com/gfwlist\nserver=/freyalist.com/127.0.0.1#5335\nipset=/freyalist.com/gfwlist\nserver=/naughty.com/127.0.0.1#5335\nipset=/naughty.com/gfwlist\nserver=/sacduc.com/127.0.0.1#5335\nipset=/sacduc.com/gfwlist\nserver=/nypost.help/127.0.0.1#5335\nipset=/nypost.help/gfwlist\nserver=/17mimei.club/127.0.0.1#5335\nipset=/17mimei.club/gfwlist\nserver=/pornotube69.nl/127.0.0.1#5335\nipset=/pornotube69.nl/gfwlist\nserver=/visa.be/127.0.0.1#5335\nipset=/visa.be/gfwlist\nserver=/musical.ly/127.0.0.1#5335\nipset=/musical.ly/gfwlist\nserver=/app0le.com/127.0.0.1#5335\nipset=/app0le.com/gfwlist\nserver=/gaytube.com/127.0.0.1#5335\nipset=/gaytube.com/gfwlist\nserver=/delicious.com.au/127.0.0.1#5335\nipset=/delicious.com.au/gfwlist\nserver=/facebook-studio.com/127.0.0.1#5335\nipset=/facebook-studio.com/gfwlist\nserver=/macreach.com/127.0.0.1#5335\nipset=/macreach.com/gfwlist\nserver=/naughtygamesource.com/127.0.0.1#5335\nipset=/naughtygamesource.com/gfwlist\nserver=/blogspot.co.uk/127.0.0.1#5335\nipset=/blogspot.co.uk/gfwlist\nserver=/minecraft.net/127.0.0.1#5335\nipset=/minecraft.net/gfwlist\nserver=/androidify.com/127.0.0.1#5335\nipset=/androidify.com/gfwlist\nserver=/bmw-motorrad.be/127.0.0.1#5335\nipset=/bmw-motorrad.be/gfwlist\nserver=/vs-hls-push-uk-live.akamaized.net/127.0.0.1#5335\nipset=/vs-hls-push-uk-live.akamaized.net/gfwlist\nserver=/foxsmallbusinesscenter.com/127.0.0.1#5335\nipset=/foxsmallbusinesscenter.com/gfwlist\nserver=/nikesellorder.com/127.0.0.1#5335\nipset=/nikesellorder.com/gfwlist\nserver=/asianscreens.com/127.0.0.1#5335\nipset=/asianscreens.com/gfwlist\nserver=/jmcomic1.city/127.0.0.1#5335\nipset=/jmcomic1.city/gfwlist\nserver=/twistys.com/127.0.0.1#5335\nipset=/twistys.com/gfwlist\nserver=/deutschepornos-kostenlos.net/127.0.0.1#5335\nipset=/deutschepornos-kostenlos.net/gfwlist\nserver=/sdcountybmw.com/127.0.0.1#5335\nipset=/sdcountybmw.com/gfwlist\nserver=/bmw-classic.com/127.0.0.1#5335\nipset=/bmw-classic.com/gfwlist\nserver=/heptio.com/127.0.0.1#5335\nipset=/heptio.com/gfwlist\nserver=/visa.co.nz/127.0.0.1#5335\nipset=/visa.co.nz/gfwlist\nserver=/libgen.me/127.0.0.1#5335\nipset=/libgen.me/gfwlist\nserver=/bmw.hu/127.0.0.1#5335\nipset=/bmw.hu/gfwlist\nserver=/xn--mtswd61ejxq.com/127.0.0.1#5335\nipset=/xn--mtswd61ejxq.com/gfwlist\nserver=/terapeak.hk/127.0.0.1#5335\nipset=/terapeak.hk/gfwlist\nserver=/favepornvids.com/127.0.0.1#5335\nipset=/favepornvids.com/gfwlist\nserver=/ted.com/127.0.0.1#5335\nipset=/ted.com/gfwlist\nserver=/nikebbn.com/127.0.0.1#5335\nipset=/nikebbn.com/gfwlist\nserver=/oed.com/127.0.0.1#5335\nipset=/oed.com/gfwlist\nserver=/apple-cloudkit.com/127.0.0.1#5335\nipset=/apple-cloudkit.com/gfwlist\nserver=/bmw.hn/127.0.0.1#5335\nipset=/bmw.hn/gfwlist\nserver=/povpornonly.com/127.0.0.1#5335\nipset=/povpornonly.com/gfwlist\nserver=/mylust.com/127.0.0.1#5335\nipset=/mylust.com/gfwlist\nserver=/reiporno.com/127.0.0.1#5335\nipset=/reiporno.com/gfwlist\nserver=/asiansex.sexy/127.0.0.1#5335\nipset=/asiansex.sexy/gfwlist\nserver=/vfsco.es/127.0.0.1#5335\nipset=/vfsco.es/gfwlist\nserver=/pearsoneducacion.net/127.0.0.1#5335\nipset=/pearsoneducacion.net/gfwlist\nserver=/apple.nl/127.0.0.1#5335\nipset=/apple.nl/gfwlist\nserver=/brightcove.net/127.0.0.1#5335\nipset=/brightcove.net/gfwlist\nserver=/boshancy.com/127.0.0.1#5335\nipset=/boshancy.com/gfwlist\nserver=/facebookexchange.com/127.0.0.1#5335\nipset=/facebookexchange.com/gfwlist\nserver=/xnxx.health/127.0.0.1#5335\nipset=/xnxx.health/gfwlist\nserver=/adult-web-site.net/127.0.0.1#5335\nipset=/adult-web-site.net/gfwlist\nserver=/zzgays.com/127.0.0.1#5335\nipset=/zzgays.com/gfwlist\nserver=/beatsbydreirelandonlines.com/127.0.0.1#5335\nipset=/beatsbydreirelandonlines.com/gfwlist\nserver=/hentaia.net/127.0.0.1#5335\nipset=/hentaia.net/gfwlist\nserver=/google.co.th/127.0.0.1#5335\nipset=/google.co.th/gfwlist\nserver=/adidas.pl/127.0.0.1#5335\nipset=/adidas.pl/gfwlist\nserver=/google.la/127.0.0.1#5335\nipset=/google.la/gfwlist\nserver=/teenporngallery.net/127.0.0.1#5335\nipset=/teenporngallery.net/gfwlist\nserver=/bigblackdicklover.com/127.0.0.1#5335\nipset=/bigblackdicklover.com/gfwlist\nserver=/miniinvasion.ca/127.0.0.1#5335\nipset=/miniinvasion.ca/gfwlist\nserver=/intel.ca/127.0.0.1#5335\nipset=/intel.ca/gfwlist\nserver=/erofus.com/127.0.0.1#5335\nipset=/erofus.com/gfwlist\nserver=/novinhagostosa10.com/127.0.0.1#5335\nipset=/novinhagostosa10.com/gfwlist\nserver=/mirrormedia.mg/127.0.0.1#5335\nipset=/mirrormedia.mg/gfwlist\nserver=/pearsonactivelearn.com/127.0.0.1#5335\nipset=/pearsonactivelearn.com/gfwlist\nserver=/linotype.com/127.0.0.1#5335\nipset=/linotype.com/gfwlist\nserver=/bmw-motorrad.bh/127.0.0.1#5335\nipset=/bmw-motorrad.bh/gfwlist\nserver=/pantswalker.net/127.0.0.1#5335\nipset=/pantswalker.net/gfwlist\nserver=/alphera.ie/127.0.0.1#5335\nipset=/alphera.ie/gfwlist\nserver=/zeeuk.com/127.0.0.1#5335\nipset=/zeeuk.com/gfwlist\nserver=/ve-uhd-push-uk-live.akamaized.net/127.0.0.1#5335\nipset=/ve-uhd-push-uk-live.akamaized.net/gfwlist\nserver=/glam0ur.com/127.0.0.1#5335\nipset=/glam0ur.com/gfwlist\nserver=/ccav691api.com/127.0.0.1#5335\nipset=/ccav691api.com/gfwlist\nserver=/bbycloud.com/127.0.0.1#5335\nipset=/bbycloud.com/gfwlist\nserver=/bmw-motorrad.no/127.0.0.1#5335\nipset=/bmw-motorrad.no/gfwlist\nserver=/icloudsetup.com/127.0.0.1#5335\nipset=/icloudsetup.com/gfwlist\nserver=/abema.io/127.0.0.1#5335\nipset=/abema.io/gfwlist\nserver=/netvigator.com/127.0.0.1#5335\nipset=/netvigator.com/gfwlist\nserver=/fli8.xyz/127.0.0.1#5335\nipset=/fli8.xyz/gfwlist\nserver=/erogazou-pinkline.com/127.0.0.1#5335\nipset=/erogazou-pinkline.com/gfwlist\nserver=/jpg4.info/127.0.0.1#5335\nipset=/jpg4.info/gfwlist\nserver=/virtualtaboo.com/127.0.0.1#5335\nipset=/virtualtaboo.com/gfwlist\nserver=/netflix.com/127.0.0.1#5335\nipset=/netflix.com/gfwlist\nserver=/pstorage.space/127.0.0.1#5335\nipset=/pstorage.space/gfwlist\nserver=/applestoreonline.com/127.0.0.1#5335\nipset=/applestoreonline.com/gfwlist\nserver=/dettolarabia.com/127.0.0.1#5335\nipset=/dettolarabia.com/gfwlist\nserver=/trustwave.com/127.0.0.1#5335\nipset=/trustwave.com/gfwlist\nserver=/eroyakuba.com/127.0.0.1#5335\nipset=/eroyakuba.com/gfwlist\nserver=/encoretvb.com/127.0.0.1#5335\nipset=/encoretvb.com/gfwlist\nserver=/grannytube.net/127.0.0.1#5335\nipset=/grannytube.net/gfwlist\nserver=/eacodigos.com/127.0.0.1#5335\nipset=/eacodigos.com/gfwlist\nserver=/intel.mw/127.0.0.1#5335\nipset=/intel.mw/gfwlist\nserver=/porndigger.me/127.0.0.1#5335\nipset=/porndigger.me/gfwlist\nserver=/slackdemo.com/127.0.0.1#5335\nipset=/slackdemo.com/gfwlist\nserver=/bmw-connecteddrive.tw/127.0.0.1#5335\nipset=/bmw-connecteddrive.tw/gfwlist\nserver=/charticulator.com/127.0.0.1#5335\nipset=/charticulator.com/gfwlist\nserver=/7mmtv.sx/127.0.0.1#5335\nipset=/7mmtv.sx/gfwlist\nserver=/yahoo.by/127.0.0.1#5335\nipset=/yahoo.by/gfwlist\nserver=/cutt.ly/127.0.0.1#5335\nipset=/cutt.ly/gfwlist\nserver=/mycartoonsexgames.com/127.0.0.1#5335\nipset=/mycartoonsexgames.com/gfwlist\nserver=/google.com.qa/127.0.0.1#5335\nipset=/google.com.qa/gfwlist\nserver=/analpornosex.com/127.0.0.1#5335\nipset=/analpornosex.com/gfwlist\nserver=/asianporn.rest/127.0.0.1#5335\nipset=/asianporn.rest/gfwlist\nserver=/exposedlatinas.com/127.0.0.1#5335\nipset=/exposedlatinas.com/gfwlist\nserver=/swissid.ch/127.0.0.1#5335\nipset=/swissid.ch/gfwlist\nserver=/ksescortclub.com/127.0.0.1#5335\nipset=/ksescortclub.com/gfwlist\nserver=/applestore.com.ee/127.0.0.1#5335\nipset=/applestore.com.ee/gfwlist\nserver=/tegrazone.co.kr/127.0.0.1#5335\nipset=/tegrazone.co.kr/gfwlist\nserver=/drebeatsheadphones-nz.com/127.0.0.1#5335\nipset=/drebeatsheadphones-nz.com/gfwlist\nserver=/ftvmilfs.com/127.0.0.1#5335\nipset=/ftvmilfs.com/gfwlist\nserver=/picasa.com/127.0.0.1#5335\nipset=/picasa.com/gfwlist\nserver=/zoom.com/127.0.0.1#5335\nipset=/zoom.com/gfwlist\nserver=/xoom.com/127.0.0.1#5335\nipset=/xoom.com/gfwlist\nserver=/pokemonbank.com/127.0.0.1#5335\nipset=/pokemonbank.com/gfwlist\nserver=/adaptivecards.io/127.0.0.1#5335\nipset=/adaptivecards.io/gfwlist\nserver=/i-book.net/127.0.0.1#5335\nipset=/i-book.net/gfwlist\nserver=/openweather.co.uk/127.0.0.1#5335\nipset=/openweather.co.uk/gfwlist\nserver=/loveparents.org/127.0.0.1#5335\nipset=/loveparents.org/gfwlist\nserver=/google.tg/127.0.0.1#5335\nipset=/google.tg/gfwlist\nserver=/brasiltudoliberado.com/127.0.0.1#5335\nipset=/brasiltudoliberado.com/gfwlist\nserver=/beatspascher-fr.net/127.0.0.1#5335\nipset=/beatspascher-fr.net/gfwlist\nserver=/theporntoplist.com/127.0.0.1#5335\nipset=/theporntoplist.com/gfwlist\nserver=/vintagemedicalpictures.com/127.0.0.1#5335\nipset=/vintagemedicalpictures.com/gfwlist\nserver=/nikemarketing.com/127.0.0.1#5335\nipset=/nikemarketing.com/gfwlist\nserver=/youpornru.com/127.0.0.1#5335\nipset=/youpornru.com/gfwlist\nserver=/cambridgeschoolshakespeare.com/127.0.0.1#5335\nipset=/cambridgeschoolshakespeare.com/gfwlist\nserver=/onedinesfree.com/127.0.0.1#5335\nipset=/onedinesfree.com/gfwlist\nserver=/termius.com/127.0.0.1#5335\nipset=/termius.com/gfwlist\nserver=/hypnoporn.net/127.0.0.1#5335\nipset=/hypnoporn.net/gfwlist\nserver=/espn.com/127.0.0.1#5335\nipset=/espn.com/gfwlist\nserver=/nikkei.co.jp/127.0.0.1#5335\nipset=/nikkei.co.jp/gfwlist\nserver=/seedmov18.com/127.0.0.1#5335\nipset=/seedmov18.com/gfwlist\nserver=/tourporno.com/127.0.0.1#5335\nipset=/tourporno.com/gfwlist\nserver=/mini-coupe.ca/127.0.0.1#5335\nipset=/mini-coupe.ca/gfwlist\nserver=/akamaihd-staging.net/127.0.0.1#5335\nipset=/akamaihd-staging.net/gfwlist\nserver=/realamericanstories.com/127.0.0.1#5335\nipset=/realamericanstories.com/gfwlist\nserver=/google-syndication.com/127.0.0.1#5335\nipset=/google-syndication.com/gfwlist\nserver=/singlelogin.app/127.0.0.1#5335\nipset=/singlelogin.app/gfwlist\nserver=/marvel.com/127.0.0.1#5335\nipset=/marvel.com/gfwlist\nserver=/xn--9kr7l.com/127.0.0.1#5335\nipset=/xn--9kr7l.com/gfwlist\nserver=/facebokbook.com/127.0.0.1#5335\nipset=/facebokbook.com/gfwlist\nserver=/pornogayphy.com/127.0.0.1#5335\nipset=/pornogayphy.com/gfwlist\nserver=/hotporntubes.com/127.0.0.1#5335\nipset=/hotporntubes.com/gfwlist\nserver=/mastercard.us/127.0.0.1#5335\nipset=/mastercard.us/gfwlist\nserver=/spiritofecstasy.com/127.0.0.1#5335\nipset=/spiritofecstasy.com/gfwlist\nserver=/freepornq.com/127.0.0.1#5335\nipset=/freepornq.com/gfwlist\nserver=/ravm.tv/127.0.0.1#5335\nipset=/ravm.tv/gfwlist\nserver=/2kgames.com/127.0.0.1#5335\nipset=/2kgames.com/gfwlist\nserver=/bluefootcms.com/127.0.0.1#5335\nipset=/bluefootcms.com/gfwlist\nserver=/eastore.com/127.0.0.1#5335\nipset=/eastore.com/gfwlist\nserver=/2013beatsbydrdreonline.com/127.0.0.1#5335\nipset=/2013beatsbydrdreonline.com/gfwlist\nserver=/enfamama.com.ar/127.0.0.1#5335\nipset=/enfamama.com.ar/gfwlist\nserver=/monotype.com/127.0.0.1#5335\nipset=/monotype.com/gfwlist\nserver=/starwarsbattlefront.com/127.0.0.1#5335\nipset=/starwarsbattlefront.com/gfwlist\nserver=/visa.no/127.0.0.1#5335\nipset=/visa.no/gfwlist\nserver=/akamah.com/127.0.0.1#5335\nipset=/akamah.com/gfwlist\nserver=/fandom.com/127.0.0.1#5335\nipset=/fandom.com/gfwlist\nserver=/tver.co.jp/127.0.0.1#5335\nipset=/tver.co.jp/gfwlist\nserver=/fashionnike.com/127.0.0.1#5335\nipset=/fashionnike.com/gfwlist\nserver=/javsin.tv/127.0.0.1#5335\nipset=/javsin.tv/gfwlist\nserver=/exxxtrasmall.com/127.0.0.1#5335\nipset=/exxxtrasmall.com/gfwlist\nserver=/financialsoccer.ca/127.0.0.1#5335\nipset=/financialsoccer.ca/gfwlist\nserver=/zatrahal.online/127.0.0.1#5335\nipset=/zatrahal.online/gfwlist\nserver=/fbinnovation.com/127.0.0.1#5335\nipset=/fbinnovation.com/gfwlist\nserver=/gfarchive.com/127.0.0.1#5335\nipset=/gfarchive.com/gfwlist\nserver=/az764295.vo.msecnd.net/127.0.0.1#5335\nipset=/az764295.vo.msecnd.net/gfwlist\nserver=/firestonecomercial.cl/127.0.0.1#5335\nipset=/firestonecomercial.cl/gfwlist\nserver=/impact-ad.jp/127.0.0.1#5335\nipset=/impact-ad.jp/gfwlist\nserver=/volvotruckcenter.it/127.0.0.1#5335\nipset=/volvotruckcenter.it/gfwlist\nserver=/pornoelena.net/127.0.0.1#5335\nipset=/pornoelena.net/gfwlist\nserver=/ignitesasia.com/127.0.0.1#5335\nipset=/ignitesasia.com/gfwlist\nserver=/evanottyvideos.com/127.0.0.1#5335\nipset=/evanottyvideos.com/gfwlist\nserver=/feacbooke.com/127.0.0.1#5335\nipset=/feacbooke.com/gfwlist\nserver=/bcovlive.io/127.0.0.1#5335\nipset=/bcovlive.io/gfwlist\nserver=/wikihow.com/127.0.0.1#5335\nipset=/wikihow.com/gfwlist\nserver=/mini-qatar.com/127.0.0.1#5335\nipset=/mini-qatar.com/gfwlist\nserver=/idelreal.org/127.0.0.1#5335\nipset=/idelreal.org/gfwlist\nserver=/omnitek.tv/127.0.0.1#5335\nipset=/omnitek.tv/gfwlist\nserver=/monsterbeatsbydres.com/127.0.0.1#5335\nipset=/monsterbeatsbydres.com/gfwlist\nserver=/epochtimes-bg.com/127.0.0.1#5335\nipset=/epochtimes-bg.com/gfwlist\nserver=/starbucksrewardsstarland.com/127.0.0.1#5335\nipset=/starbucksrewardsstarland.com/gfwlist\nserver=/nu-bay.com/127.0.0.1#5335\nipset=/nu-bay.com/gfwlist\nserver=/mastercard.co.in/127.0.0.1#5335\nipset=/mastercard.co.in/gfwlist\nserver=/amateuranalvideos.com/127.0.0.1#5335\nipset=/amateuranalvideos.com/gfwlist\nserver=/asiansmaster.com/127.0.0.1#5335\nipset=/asiansmaster.com/gfwlist\nserver=/facebook.net/127.0.0.1#5335\nipset=/facebook.net/gfwlist\nserver=/minisojordan.com/127.0.0.1#5335\nipset=/minisojordan.com/gfwlist\nserver=/youtube.com.tn/127.0.0.1#5335\nipset=/youtube.com.tn/gfwlist\nserver=/finlitsummit.org/127.0.0.1#5335\nipset=/finlitsummit.org/gfwlist\nserver=/bookfi.net/127.0.0.1#5335\nipset=/bookfi.net/gfwlist\nserver=/ebayradio.com/127.0.0.1#5335\nipset=/ebayradio.com/gfwlist\nserver=/swisssign-group.ch/127.0.0.1#5335\nipset=/swisssign-group.ch/gfwlist\nserver=/realvision.com/127.0.0.1#5335\nipset=/realvision.com/gfwlist\nserver=/ipod.com.hk/127.0.0.1#5335\nipset=/ipod.com.hk/gfwlist\nserver=/bbgevent.com/127.0.0.1#5335\nipset=/bbgevent.com/gfwlist\nserver=/sexguide.ro/127.0.0.1#5335\nipset=/sexguide.ro/gfwlist\nserver=/travelexch.com/127.0.0.1#5335\nipset=/travelexch.com/gfwlist\nserver=/creativecommons.engineering/127.0.0.1#5335\nipset=/creativecommons.engineering/gfwlist\nserver=/londonreal.tv/127.0.0.1#5335\nipset=/londonreal.tv/gfwlist\nserver=/ipad3.com/127.0.0.1#5335\nipset=/ipad3.com/gfwlist\nserver=/azadliq.org/127.0.0.1#5335\nipset=/azadliq.org/gfwlist\nserver=/visualstudio.eu/127.0.0.1#5335\nipset=/visualstudio.eu/gfwlist\nserver=/bookclubgirl.com/127.0.0.1#5335\nipset=/bookclubgirl.com/gfwlist\nserver=/sluttyrat.com/127.0.0.1#5335\nipset=/sluttyrat.com/gfwlist\nserver=/headlinejobs.hk/127.0.0.1#5335\nipset=/headlinejobs.hk/gfwlist\nserver=/ie8.co/127.0.0.1#5335\nipset=/ie8.co/gfwlist\nserver=/sexygirlfriendtube.com/127.0.0.1#5335\nipset=/sexygirlfriendtube.com/gfwlist\nserver=/netlify.app/127.0.0.1#5335\nipset=/netlify.app/gfwlist\nserver=/mini.co.kr/127.0.0.1#5335\nipset=/mini.co.kr/gfwlist\nserver=/creampiehomevideos.com/127.0.0.1#5335\nipset=/creampiehomevideos.com/gfwlist\nserver=/appledaily.com.tw/127.0.0.1#5335\nipset=/appledaily.com.tw/gfwlist\nserver=/sci-hub.mksa.top/127.0.0.1#5335\nipset=/sci-hub.mksa.top/gfwlist\nserver=/domywife.com/127.0.0.1#5335\nipset=/domywife.com/gfwlist\nserver=/dreamworks.com/127.0.0.1#5335\nipset=/dreamworks.com/gfwlist\nserver=/dirtyshack.com/127.0.0.1#5335\nipset=/dirtyshack.com/gfwlist\nserver=/canonical.com/127.0.0.1#5335\nipset=/canonical.com/gfwlist\nserver=/volvotrucks.ro/127.0.0.1#5335\nipset=/volvotrucks.ro/gfwlist\nserver=/bmwdealercareers.com/127.0.0.1#5335\nipset=/bmwdealercareers.com/gfwlist\nserver=/canon-ois.qa/127.0.0.1#5335\nipset=/canon-ois.qa/gfwlist\nserver=/weltweitwachsen.de/127.0.0.1#5335\nipset=/weltweitwachsen.de/gfwlist\nserver=/visa.sx/127.0.0.1#5335\nipset=/visa.sx/gfwlist\nserver=/ebonywebcamhub.com/127.0.0.1#5335\nipset=/ebonywebcamhub.com/gfwlist\nserver=/xo104.com/127.0.0.1#5335\nipset=/xo104.com/gfwlist\nserver=/aboutamazon.it/127.0.0.1#5335\nipset=/aboutamazon.it/gfwlist\nserver=/facebookmarketingpartners.com/127.0.0.1#5335\nipset=/facebookmarketingpartners.com/gfwlist\nserver=/scc.ott.hinet.net/127.0.0.1#5335\nipset=/scc.ott.hinet.net/gfwlist\nserver=/jetfuelapps.com/127.0.0.1#5335\nipset=/jetfuelapps.com/gfwlist\nserver=/jambotube.com/127.0.0.1#5335\nipset=/jambotube.com/gfwlist\nserver=/gtvmediagroupfairfund.com/127.0.0.1#5335\nipset=/gtvmediagroupfairfund.com/gfwlist\nserver=/tbr.tangbr.net/127.0.0.1#5335\nipset=/tbr.tangbr.net/gfwlist\nserver=/apple.ru/127.0.0.1#5335\nipset=/apple.ru/gfwlist\nserver=/zdassets.com/127.0.0.1#5335\nipset=/zdassets.com/gfwlist\nserver=/derpibooru.org/127.0.0.1#5335\nipset=/derpibooru.org/gfwlist\nserver=/shopee.com.mx/127.0.0.1#5335\nipset=/shopee.com.mx/gfwlist\nserver=/stripparadise.com/127.0.0.1#5335\nipset=/stripparadise.com/gfwlist\nserver=/54647.global/127.0.0.1#5335\nipset=/54647.global/gfwlist\nserver=/businessinsider.mx/127.0.0.1#5335\nipset=/businessinsider.mx/gfwlist\nserver=/supanimegames.com/127.0.0.1#5335\nipset=/supanimegames.com/gfwlist\nserver=/paypal.us/127.0.0.1#5335\nipset=/paypal.us/gfwlist\nserver=/ntd.com/127.0.0.1#5335\nipset=/ntd.com/gfwlist\nserver=/scholar.google.com.pa/127.0.0.1#5335\nipset=/scholar.google.com.pa/gfwlist\nserver=/okazudouga.tokyo/127.0.0.1#5335\nipset=/okazudouga.tokyo/gfwlist\nserver=/cloudflareinsights.com/127.0.0.1#5335\nipset=/cloudflareinsights.com/gfwlist\nserver=/facebookpoke.org/127.0.0.1#5335\nipset=/facebookpoke.org/gfwlist\nserver=/messytube.com/127.0.0.1#5335\nipset=/messytube.com/gfwlist\nserver=/arirangmeari.com/127.0.0.1#5335\nipset=/arirangmeari.com/gfwlist\nserver=/ruinedking.com/127.0.0.1#5335\nipset=/ruinedking.com/gfwlist\nserver=/monsterbeatsbydrenew.com/127.0.0.1#5335\nipset=/monsterbeatsbydrenew.com/gfwlist\nserver=/xvidios.xxx/127.0.0.1#5335\nipset=/xvidios.xxx/gfwlist\nserver=/8muses.xxx/127.0.0.1#5335\nipset=/8muses.xxx/gfwlist\nserver=/facebook.cc/127.0.0.1#5335\nipset=/facebook.cc/gfwlist\nserver=/softbank-robotics.com/127.0.0.1#5335\nipset=/softbank-robotics.com/gfwlist\nserver=/bmwgroup-gaad.com/127.0.0.1#5335\nipset=/bmwgroup-gaad.com/gfwlist\nserver=/amaaozn.com/127.0.0.1#5335\nipset=/amaaozn.com/gfwlist\nserver=/microsoftiotinsiderlabs.com/127.0.0.1#5335\nipset=/microsoftiotinsiderlabs.com/gfwlist\nserver=/wwe9.com/127.0.0.1#5335\nipset=/wwe9.com/gfwlist\nserver=/akamii.com/127.0.0.1#5335\nipset=/akamii.com/gfwlist\nserver=/yahoodns.net/127.0.0.1#5335\nipset=/yahoodns.net/gfwlist\nserver=/fansta.me/127.0.0.1#5335\nipset=/fansta.me/gfwlist\nserver=/mastercard.co.uk/127.0.0.1#5335\nipset=/mastercard.co.uk/gfwlist\nserver=/pussy-pics.net/127.0.0.1#5335\nipset=/pussy-pics.net/gfwlist\nserver=/adidas.com.tw/127.0.0.1#5335\nipset=/adidas.com.tw/gfwlist\nserver=/meendo.com/127.0.0.1#5335\nipset=/meendo.com/gfwlist\nserver=/kyodonews.jp/127.0.0.1#5335\nipset=/kyodonews.jp/gfwlist\nserver=/pornoboliviaxxx.com/127.0.0.1#5335\nipset=/pornoboliviaxxx.com/gfwlist\nserver=/nvidia.co.kr/127.0.0.1#5335\nipset=/nvidia.co.kr/gfwlist\nserver=/ios-icloud.com/127.0.0.1#5335\nipset=/ios-icloud.com/gfwlist\nserver=/tamilsexvideos.cc/127.0.0.1#5335\nipset=/tamilsexvideos.cc/gfwlist\nserver=/youtube.ae/127.0.0.1#5335\nipset=/youtube.ae/gfwlist\nserver=/blogspot.com.ng/127.0.0.1#5335\nipset=/blogspot.com.ng/gfwlist\nserver=/steamdeck.com/127.0.0.1#5335\nipset=/steamdeck.com/gfwlist\nserver=/aboutamazon.co.uk/127.0.0.1#5335\nipset=/aboutamazon.co.uk/gfwlist\nserver=/netflav.com/127.0.0.1#5335\nipset=/netflav.com/gfwlist\nserver=/beatsdrdre2014.com/127.0.0.1#5335\nipset=/beatsdrdre2014.com/gfwlist\nserver=/swingerporntube.com/127.0.0.1#5335\nipset=/swingerporntube.com/gfwlist\nserver=/garena.vn/127.0.0.1#5335\nipset=/garena.vn/gfwlist\nserver=/genshinh.com/127.0.0.1#5335\nipset=/genshinh.com/gfwlist\nserver=/trendyporn.com/127.0.0.1#5335\nipset=/trendyporn.com/gfwlist\nserver=/pornhdtube.tv/127.0.0.1#5335\nipset=/pornhdtube.tv/gfwlist\nserver=/zoom.us/127.0.0.1#5335\nipset=/zoom.us/gfwlist\nserver=/moviepost.com/127.0.0.1#5335\nipset=/moviepost.com/gfwlist\nserver=/avxde.org/127.0.0.1#5335\nipset=/avxde.org/gfwlist\nserver=/milfnut.com/127.0.0.1#5335\nipset=/milfnut.com/gfwlist\nserver=/googletagservices.com/127.0.0.1#5335\nipset=/googletagservices.com/gfwlist\nserver=/googleacquisitionmigration.com/127.0.0.1#5335\nipset=/googleacquisitionmigration.com/gfwlist\nserver=/i.org/127.0.0.1#5335\nipset=/i.org/gfwlist\nserver=/hplfmedia.com/127.0.0.1#5335\nipset=/hplfmedia.com/gfwlist\nserver=/xbnat.com/127.0.0.1#5335\nipset=/xbnat.com/gfwlist\nserver=/nudistsexvideos.com/127.0.0.1#5335\nipset=/nudistsexvideos.com/gfwlist\nserver=/starbucks.co.uk/127.0.0.1#5335\nipset=/starbucks.co.uk/gfwlist\nserver=/slack-core.com/127.0.0.1#5335\nipset=/slack-core.com/gfwlist\nserver=/travelexae.com/127.0.0.1#5335\nipset=/travelexae.com/gfwlist\nserver=/crazyxxxworld.com/127.0.0.1#5335\nipset=/crazyxxxworld.com/gfwlist\nserver=/hp-invent.com/127.0.0.1#5335\nipset=/hp-invent.com/gfwlist\nserver=/w.org/127.0.0.1#5335\nipset=/w.org/gfwlist\nserver=/x.org/127.0.0.1#5335\nipset=/x.org/gfwlist\nserver=/bs-adreview.com/127.0.0.1#5335\nipset=/bs-adreview.com/gfwlist\nserver=/swisssigner.ch/127.0.0.1#5335\nipset=/swisssigner.ch/gfwlist\nserver=/wallet.com/127.0.0.1#5335\nipset=/wallet.com/gfwlist\nserver=/atos.net/127.0.0.1#5335\nipset=/atos.net/gfwlist\nserver=/disney.gr/127.0.0.1#5335\nipset=/disney.gr/gfwlist\nserver=/gogoanime.wiki/127.0.0.1#5335\nipset=/gogoanime.wiki/gfwlist\nserver=/youtube.com.lb/127.0.0.1#5335\nipset=/youtube.com.lb/gfwlist\nserver=/tvnaviweb.jp/127.0.0.1#5335\nipset=/tvnaviweb.jp/gfwlist\nserver=/david-laserscanner.com/127.0.0.1#5335\nipset=/david-laserscanner.com/gfwlist\nserver=/sweetmlif.net/127.0.0.1#5335\nipset=/sweetmlif.net/gfwlist\nserver=/vod-dash-uk-live.akamaized.net/127.0.0.1#5335\nipset=/vod-dash-uk-live.akamaized.net/gfwlist\nserver=/reastatic.net/127.0.0.1#5335\nipset=/reastatic.net/gfwlist\nserver=/tubemogul.com/127.0.0.1#5335\nipset=/tubemogul.com/gfwlist\nserver=/mastercard.com.kw/127.0.0.1#5335\nipset=/mastercard.com.kw/gfwlist\nserver=/webex.com.mx/127.0.0.1#5335\nipset=/webex.com.mx/gfwlist\nserver=/intel.cl/127.0.0.1#5335\nipset=/intel.cl/gfwlist\nserver=/skinstrip.net/127.0.0.1#5335\nipset=/skinstrip.net/gfwlist\nserver=/whisolutions.com/127.0.0.1#5335\nipset=/whisolutions.com/gfwlist\nserver=/500caocao.com/127.0.0.1#5335\nipset=/500caocao.com/gfwlist\nserver=/lysol.com.mx/127.0.0.1#5335\nipset=/lysol.com.mx/gfwlist\nserver=/clincha.cn/127.0.0.1#5335\nipset=/clincha.cn/gfwlist\nserver=/yahoo.co.th/127.0.0.1#5335\nipset=/yahoo.co.th/gfwlist\nserver=/ctitv.com.tw/127.0.0.1#5335\nipset=/ctitv.com.tw/gfwlist\nserver=/punishbang.com/127.0.0.1#5335\nipset=/punishbang.com/gfwlist\nserver=/bit.ly/127.0.0.1#5335\nipset=/bit.ly/gfwlist\nserver=/chedteb.eu/127.0.0.1#5335\nipset=/chedteb.eu/gfwlist\nserver=/bwin.com/127.0.0.1#5335\nipset=/bwin.com/gfwlist\nserver=/visiontimes.it/127.0.0.1#5335\nipset=/visiontimes.it/gfwlist\nserver=/mature-tube.sexy/127.0.0.1#5335\nipset=/mature-tube.sexy/gfwlist\nserver=/sourceforge.com/127.0.0.1#5335\nipset=/sourceforge.com/gfwlist\nserver=/51dh.site/127.0.0.1#5335\nipset=/51dh.site/gfwlist\nserver=/themathsfactor.com/127.0.0.1#5335\nipset=/themathsfactor.com/gfwlist\nserver=/bodyfluids-jav.com/127.0.0.1#5335\nipset=/bodyfluids-jav.com/gfwlist\nserver=/bestrecipes.com.au/127.0.0.1#5335\nipset=/bestrecipes.com.au/gfwlist\nserver=/videosporno.com.br/127.0.0.1#5335\nipset=/videosporno.com.br/gfwlist\nserver=/kompoz.com/127.0.0.1#5335\nipset=/kompoz.com/gfwlist\nserver=/canon.ba/127.0.0.1#5335\nipset=/canon.ba/gfwlist\nserver=/ozodlik.org/127.0.0.1#5335\nipset=/ozodlik.org/gfwlist\nserver=/garena.ph/127.0.0.1#5335\nipset=/garena.ph/gfwlist\nserver=/blogspot.hr/127.0.0.1#5335\nipset=/blogspot.hr/gfwlist\nserver=/tranny.one/127.0.0.1#5335\nipset=/tranny.one/gfwlist\nserver=/hentai44.com/127.0.0.1#5335\nipset=/hentai44.com/gfwlist\nserver=/ikea.sg/127.0.0.1#5335\nipset=/ikea.sg/gfwlist\nserver=/lihkg.com/127.0.0.1#5335\nipset=/lihkg.com/gfwlist\nserver=/flash-xxx.com/127.0.0.1#5335\nipset=/flash-xxx.com/gfwlist\nserver=/miniso.ge/127.0.0.1#5335\nipset=/miniso.ge/gfwlist\nserver=/pearsononlineacademy.com/127.0.0.1#5335\nipset=/pearsononlineacademy.com/gfwlist\nserver=/cloudflareclient.com/127.0.0.1#5335\nipset=/cloudflareclient.com/gfwlist\nserver=/campuslondon.com/127.0.0.1#5335\nipset=/campuslondon.com/gfwlist\nserver=/tryfuckmenow.com/127.0.0.1#5335\nipset=/tryfuckmenow.com/gfwlist\nserver=/nesaporn.com/127.0.0.1#5335\nipset=/nesaporn.com/gfwlist\nserver=/xnxx2.org/127.0.0.1#5335\nipset=/xnxx2.org/gfwlist\nserver=/zenodo.org/127.0.0.1#5335\nipset=/zenodo.org/gfwlist\nserver=/lsj2.shop/127.0.0.1#5335\nipset=/lsj2.shop/gfwlist\nserver=/ajsjx.com/127.0.0.1#5335\nipset=/ajsjx.com/gfwlist\nserver=/fakehub.com/127.0.0.1#5335\nipset=/fakehub.com/gfwlist\nserver=/bmw-connecteddrive.bg/127.0.0.1#5335\nipset=/bmw-connecteddrive.bg/gfwlist\nserver=/scholar.google.com.my/127.0.0.1#5335\nipset=/scholar.google.com.my/gfwlist\nserver=/netflixtechblog.com/127.0.0.1#5335\nipset=/netflixtechblog.com/gfwlist\nserver=/dopaminegirl.com/127.0.0.1#5335\nipset=/dopaminegirl.com/gfwlist\nserver=/freexxx.win/127.0.0.1#5335\nipset=/freexxx.win/gfwlist\nserver=/tdesktop.com/127.0.0.1#5335\nipset=/tdesktop.com/gfwlist\nserver=/himalaya.exchange/127.0.0.1#5335\nipset=/himalaya.exchange/gfwlist\nserver=/acgfbw.com/127.0.0.1#5335\nipset=/acgfbw.com/gfwlist\nserver=/live.eu/127.0.0.1#5335\nipset=/live.eu/gfwlist\nserver=/cnbcfm.com/127.0.0.1#5335\nipset=/cnbcfm.com/gfwlist\nserver=/playvids.com/127.0.0.1#5335\nipset=/playvids.com/gfwlist\nserver=/uninhibitedcomix.com/127.0.0.1#5335\nipset=/uninhibitedcomix.com/gfwlist\nserver=/moms-sex-videos.com/127.0.0.1#5335\nipset=/moms-sex-videos.com/gfwlist\nserver=/rukoebxx.com/127.0.0.1#5335\nipset=/rukoebxx.com/gfwlist\nserver=/msinnovationchallenge.com/127.0.0.1#5335\nipset=/msinnovationchallenge.com/gfwlist\nserver=/xnxx-com.cfd/127.0.0.1#5335\nipset=/xnxx-com.cfd/gfwlist\nserver=/alibabacloud.com.tw/127.0.0.1#5335\nipset=/alibabacloud.com.tw/gfwlist\nserver=/levelsex.com/127.0.0.1#5335\nipset=/levelsex.com/gfwlist\nserver=/tantaly.com/127.0.0.1#5335\nipset=/tantaly.com/gfwlist\nserver=/nvidia.eu/127.0.0.1#5335\nipset=/nvidia.eu/gfwlist\nserver=/z-lib.org/127.0.0.1#5335\nipset=/z-lib.org/gfwlist\nserver=/vipbeatsbydre.com/127.0.0.1#5335\nipset=/vipbeatsbydre.com/gfwlist\nserver=/dogmovie.net/127.0.0.1#5335\nipset=/dogmovie.net/gfwlist\nserver=/dettol.com.my/127.0.0.1#5335\nipset=/dettol.com.my/gfwlist\nserver=/teenpornvideo.xxx/127.0.0.1#5335\nipset=/teenpornvideo.xxx/gfwlist\nserver=/yomiuri-shimbun.pressreader.com/127.0.0.1#5335\nipset=/yomiuri-shimbun.pressreader.com/gfwlist\nserver=/pornhubpremium.com/127.0.0.1#5335\nipset=/pornhubpremium.com/gfwlist\nserver=/internationalconnectionsacademy.com/127.0.0.1#5335\nipset=/internationalconnectionsacademy.com/gfwlist\nserver=/bigassporn.tv/127.0.0.1#5335\nipset=/bigassporn.tv/gfwlist\nserver=/xxxreal.com/127.0.0.1#5335\nipset=/xxxreal.com/gfwlist\nserver=/volvotruckcenter.nl/127.0.0.1#5335\nipset=/volvotruckcenter.nl/gfwlist\nserver=/bmw-motorrad.com.pe/127.0.0.1#5335\nipset=/bmw-motorrad.com.pe/gfwlist\nserver=/free-wap-tube.com/127.0.0.1#5335\nipset=/free-wap-tube.com/gfwlist\nserver=/covid19rx.org/127.0.0.1#5335\nipset=/covid19rx.org/gfwlist\nserver=/xxxbullet.com/127.0.0.1#5335\nipset=/xxxbullet.com/gfwlist\nserver=/nike23.com/127.0.0.1#5335\nipset=/nike23.com/gfwlist\nserver=/facxebook.com/127.0.0.1#5335\nipset=/facxebook.com/gfwlist\nserver=/yusjb.com/127.0.0.1#5335\nipset=/yusjb.com/gfwlist\nserver=/webobjects.net/127.0.0.1#5335\nipset=/webobjects.net/gfwlist\nserver=/google.org/127.0.0.1#5335\nipset=/google.org/gfwlist\nserver=/disney.my.sentry.io/127.0.0.1#5335\nipset=/disney.my.sentry.io/gfwlist\nserver=/instagrampartners.com/127.0.0.1#5335\nipset=/instagrampartners.com/gfwlist\nserver=/truyen-hentai.ru/127.0.0.1#5335\nipset=/truyen-hentai.ru/gfwlist\nserver=/cumlouder.com/127.0.0.1#5335\nipset=/cumlouder.com/gfwlist\nserver=/hentaizilla.com/127.0.0.1#5335\nipset=/hentaizilla.com/gfwlist\nserver=/mini.co.il/127.0.0.1#5335\nipset=/mini.co.il/gfwlist\nserver=/thothub.ru/127.0.0.1#5335\nipset=/thothub.ru/gfwlist\nserver=/diamondgirls.co.uk/127.0.0.1#5335\nipset=/diamondgirls.co.uk/gfwlist\nserver=/shitjav.com/127.0.0.1#5335\nipset=/shitjav.com/gfwlist\nserver=/dtlgalleryint.cloudapp.net/127.0.0.1#5335\nipset=/dtlgalleryint.cloudapp.net/gfwlist\nserver=/darkness-risen.com/127.0.0.1#5335\nipset=/darkness-risen.com/gfwlist\nserver=/github.io/127.0.0.1#5335\nipset=/github.io/gfwlist\nserver=/adsensecustomsearchads.com/127.0.0.1#5335\nipset=/adsensecustomsearchads.com/gfwlist\nserver=/badaas.com/127.0.0.1#5335\nipset=/badaas.com/gfwlist\nserver=/ebaycafe.com/127.0.0.1#5335\nipset=/ebaycafe.com/gfwlist\nserver=/uun97.com/127.0.0.1#5335\nipset=/uun97.com/gfwlist\nserver=/nodesource.com/127.0.0.1#5335\nipset=/nodesource.com/gfwlist\nserver=/bmw.co.il/127.0.0.1#5335\nipset=/bmw.co.il/gfwlist\nserver=/cloudc.one/127.0.0.1#5335\nipset=/cloudc.one/gfwlist\nserver=/voyeurporntapes.com/127.0.0.1#5335\nipset=/voyeurporntapes.com/gfwlist\nserver=/mega.io/127.0.0.1#5335\nipset=/mega.io/gfwlist\nserver=/psg-int-eastus.cloudapp.net/127.0.0.1#5335\nipset=/psg-int-eastus.cloudapp.net/gfwlist\nserver=/webcam-teen.net/127.0.0.1#5335\nipset=/webcam-teen.net/gfwlist\nserver=/dcard.cc/127.0.0.1#5335\nipset=/dcard.cc/gfwlist\nserver=/youtube.ug/127.0.0.1#5335\nipset=/youtube.ug/gfwlist\nserver=/shuziyimin.org/127.0.0.1#5335\nipset=/shuziyimin.org/gfwlist\nserver=/islamiccenterofnewlondon.com/127.0.0.1#5335\nipset=/islamiccenterofnewlondon.com/gfwlist\nserver=/who.int/127.0.0.1#5335\nipset=/who.int/gfwlist\nserver=/shemaletubevideos.com/127.0.0.1#5335\nipset=/shemaletubevideos.com/gfwlist\nserver=/incezt.net/127.0.0.1#5335\nipset=/incezt.net/gfwlist\nserver=/girlfuckshorse.net/127.0.0.1#5335\nipset=/girlfuckshorse.net/gfwlist\nserver=/facebook-login.com/127.0.0.1#5335\nipset=/facebook-login.com/gfwlist\nserver=/luckyissue.com/127.0.0.1#5335\nipset=/luckyissue.com/gfwlist\nserver=/amerikayidzayn.com/127.0.0.1#5335\nipset=/amerikayidzayn.com/gfwlist\nserver=/ipod.cm/127.0.0.1#5335\nipset=/ipod.cm/gfwlist\nserver=/sonystoragemedia.co.jp/127.0.0.1#5335\nipset=/sonystoragemedia.co.jp/gfwlist\nserver=/blz-contentstack.com/127.0.0.1#5335\nipset=/blz-contentstack.com/gfwlist\nserver=/myq2.com/127.0.0.1#5335\nipset=/myq2.com/gfwlist\nserver=/fapvid.com/127.0.0.1#5335\nipset=/fapvid.com/gfwlist\nserver=/postgresql.org/127.0.0.1#5335\nipset=/postgresql.org/gfwlist\nserver=/mytrannycams.com/127.0.0.1#5335\nipset=/mytrannycams.com/gfwlist\nserver=/cheapbeatsbydreshop.com/127.0.0.1#5335\nipset=/cheapbeatsbydreshop.com/gfwlist\nserver=/bmw-motorrad.nl/127.0.0.1#5335\nipset=/bmw-motorrad.nl/gfwlist\nserver=/braveux.com/127.0.0.1#5335\nipset=/braveux.com/gfwlist\nserver=/dazndn.com/127.0.0.1#5335\nipset=/dazndn.com/gfwlist\nserver=/deepfakeporn.net/127.0.0.1#5335\nipset=/deepfakeporn.net/gfwlist\nserver=/thesexbible.com/127.0.0.1#5335\nipset=/thesexbible.com/gfwlist\nserver=/jizzhut.com/127.0.0.1#5335\nipset=/jizzhut.com/gfwlist\nserver=/techhub.ms/127.0.0.1#5335\nipset=/techhub.ms/gfwlist\nserver=/vgg8.com/127.0.0.1#5335\nipset=/vgg8.com/gfwlist\nserver=/ccna5.net/127.0.0.1#5335\nipset=/ccna5.net/gfwlist\nserver=/canon.ru/127.0.0.1#5335\nipset=/canon.ru/gfwlist\nserver=/huashundg.com/127.0.0.1#5335\nipset=/huashundg.com/gfwlist\nserver=/monsterbeatsbydre-nz.com/127.0.0.1#5335\nipset=/monsterbeatsbydre-nz.com/gfwlist\nserver=/ohpornocasero.com/127.0.0.1#5335\nipset=/ohpornocasero.com/gfwlist\nserver=/porncomics.com/127.0.0.1#5335\nipset=/porncomics.com/gfwlist\nserver=/visa.com.sv/127.0.0.1#5335\nipset=/visa.com.sv/gfwlist\nserver=/bmw-group.com/127.0.0.1#5335\nipset=/bmw-group.com/gfwlist\nserver=/pornxs.com/127.0.0.1#5335\nipset=/pornxs.com/gfwlist\nserver=/youx.xxx/127.0.0.1#5335\nipset=/youx.xxx/gfwlist\nserver=/compose-spec.io/127.0.0.1#5335\nipset=/compose-spec.io/gfwlist\nserver=/radiomango.fm/127.0.0.1#5335\nipset=/radiomango.fm/gfwlist\nserver=/scat-shop.net/127.0.0.1#5335\nipset=/scat-shop.net/gfwlist\nserver=/npmjs.org/127.0.0.1#5335\nipset=/npmjs.org/gfwlist\nserver=/gdansk-amazon.com/127.0.0.1#5335\nipset=/gdansk-amazon.com/gfwlist\nserver=/hyperdreams.com/127.0.0.1#5335\nipset=/hyperdreams.com/gfwlist\nserver=/fastly-terrarium.com/127.0.0.1#5335\nipset=/fastly-terrarium.com/gfwlist\nserver=/adobehiddentreasures.com/127.0.0.1#5335\nipset=/adobehiddentreasures.com/gfwlist\nserver=/appleid.hamburg/127.0.0.1#5335\nipset=/appleid.hamburg/gfwlist\nserver=/comsoc.org/127.0.0.1#5335\nipset=/comsoc.org/gfwlist\nserver=/nudography.com/127.0.0.1#5335\nipset=/nudography.com/gfwlist\nserver=/mastercard.com.pe/127.0.0.1#5335\nipset=/mastercard.com.pe/gfwlist\nserver=/nikeairhuarache.com/127.0.0.1#5335\nipset=/nikeairhuarache.com/gfwlist\nserver=/chwr7s8u.com/127.0.0.1#5335\nipset=/chwr7s8u.com/gfwlist\nserver=/cartoonsexfantazy.com/127.0.0.1#5335\nipset=/cartoonsexfantazy.com/gfwlist\nserver=/road-crew.com/127.0.0.1#5335\nipset=/road-crew.com/gfwlist\nserver=/ieeedeis.org/127.0.0.1#5335\nipset=/ieeedeis.org/gfwlist\nserver=/rbmavericks.com/127.0.0.1#5335\nipset=/rbmavericks.com/gfwlist\nserver=/senpaiheat.com/127.0.0.1#5335\nipset=/senpaiheat.com/gfwlist\nserver=/nflhotsalejerseys.com/127.0.0.1#5335\nipset=/nflhotsalejerseys.com/gfwlist\nserver=/codethemicrobit.com/127.0.0.1#5335\nipset=/codethemicrobit.com/gfwlist\nserver=/durex.lv/127.0.0.1#5335\nipset=/durex.lv/gfwlist\nserver=/wp-themes.com/127.0.0.1#5335\nipset=/wp-themes.com/gfwlist\nserver=/homealonemilfs.com/127.0.0.1#5335\nipset=/homealonemilfs.com/gfwlist\nserver=/wikiquote.org/127.0.0.1#5335\nipset=/wikiquote.org/gfwlist\nserver=/110xnxx.com/127.0.0.1#5335\nipset=/110xnxx.com/gfwlist\nserver=/xgaytube.com/127.0.0.1#5335\nipset=/xgaytube.com/gfwlist\nserver=/archiveofourown.net/127.0.0.1#5335\nipset=/archiveofourown.net/gfwlist\nserver=/volvotrucks.bg/127.0.0.1#5335\nipset=/volvotrucks.bg/gfwlist\nserver=/studywatchbyverily.org/127.0.0.1#5335\nipset=/studywatchbyverily.org/gfwlist\nserver=/svobodnaevropa.bg/127.0.0.1#5335\nipset=/svobodnaevropa.bg/gfwlist\nserver=/metrotoons.com/127.0.0.1#5335\nipset=/metrotoons.com/gfwlist\nserver=/amourangels.com/127.0.0.1#5335\nipset=/amourangels.com/gfwlist\nserver=/directvsports.com/127.0.0.1#5335\nipset=/directvsports.com/gfwlist\nserver=/niconico.com/127.0.0.1#5335\nipset=/niconico.com/gfwlist\nserver=/comdotgame.com/127.0.0.1#5335\nipset=/comdotgame.com/gfwlist\nserver=/iknowthatgirl.com/127.0.0.1#5335\nipset=/iknowthatgirl.com/gfwlist\nserver=/headphones-cool.com/127.0.0.1#5335\nipset=/headphones-cool.com/gfwlist\nserver=/office.net/127.0.0.1#5335\nipset=/office.net/gfwlist\nserver=/paypal-notice.com/127.0.0.1#5335\nipset=/paypal-notice.com/gfwlist\nserver=/foxsoccerplus.com/127.0.0.1#5335\nipset=/foxsoccerplus.com/gfwlist\nserver=/cna.com.tw/127.0.0.1#5335\nipset=/cna.com.tw/gfwlist\nserver=/aboutamazon.fr/127.0.0.1#5335\nipset=/aboutamazon.fr/gfwlist\nserver=/discord-activities.com/127.0.0.1#5335\nipset=/discord-activities.com/gfwlist\nserver=/i-o-u.info/127.0.0.1#5335\nipset=/i-o-u.info/gfwlist\nserver=/slideshare.net/127.0.0.1#5335\nipset=/slideshare.net/gfwlist\nserver=/nintendo.co.kr/127.0.0.1#5335\nipset=/nintendo.co.kr/gfwlist\nserver=/canon.ro/127.0.0.1#5335\nipset=/canon.ro/gfwlist\nserver=/intimateinvasions.com/127.0.0.1#5335\nipset=/intimateinvasions.com/gfwlist\nserver=/visafintechfasttrack.com/127.0.0.1#5335\nipset=/visafintechfasttrack.com/gfwlist\nserver=/svsgames.org/127.0.0.1#5335\nipset=/svsgames.org/gfwlist\nserver=/hpconnected.com/127.0.0.1#5335\nipset=/hpconnected.com/gfwlist\nserver=/bmw.lu/127.0.0.1#5335\nipset=/bmw.lu/gfwlist\nserver=/xn--gtvz22d.xn--hxt814e/127.0.0.1#5335\nipset=/xn--gtvz22d.xn--hxt814e/gfwlist\nserver=/pornov1080.name/127.0.0.1#5335\nipset=/pornov1080.name/gfwlist\nserver=/hotcuckoldwife.com/127.0.0.1#5335\nipset=/hotcuckoldwife.com/gfwlist\nserver=/smplace.com/127.0.0.1#5335\nipset=/smplace.com/gfwlist\nserver=/moefuns.co/127.0.0.1#5335\nipset=/moefuns.co/gfwlist\nserver=/deadspacegame.com/127.0.0.1#5335\nipset=/deadspacegame.com/gfwlist\nserver=/pornogram.xxx/127.0.0.1#5335\nipset=/pornogram.xxx/gfwlist\nserver=/beatsbydreireland-sales.com/127.0.0.1#5335\nipset=/beatsbydreireland-sales.com/gfwlist\nserver=/waranlov.com/127.0.0.1#5335\nipset=/waranlov.com/gfwlist\nserver=/glamourtits.com/127.0.0.1#5335\nipset=/glamourtits.com/gfwlist\nserver=/personaltrainermath.com/127.0.0.1#5335\nipset=/personaltrainermath.com/gfwlist\nserver=/boswp.com/127.0.0.1#5335\nipset=/boswp.com/gfwlist\nserver=/harvard.xxx/127.0.0.1#5335\nipset=/harvard.xxx/gfwlist\nserver=/naughtymachinima.com/127.0.0.1#5335\nipset=/naughtymachinima.com/gfwlist\nserver=/chinaclothesstore.com/127.0.0.1#5335\nipset=/chinaclothesstore.com/gfwlist\nserver=/av-baron.com/127.0.0.1#5335\nipset=/av-baron.com/gfwlist\nserver=/economist.com/127.0.0.1#5335\nipset=/economist.com/gfwlist\nserver=/amdigital.co.uk/127.0.0.1#5335\nipset=/amdigital.co.uk/gfwlist\nserver=/facebpook.com/127.0.0.1#5335\nipset=/facebpook.com/gfwlist\nserver=/lpsg.com/127.0.0.1#5335\nipset=/lpsg.com/gfwlist\nserver=/dicela.net/127.0.0.1#5335\nipset=/dicela.net/gfwlist\nserver=/stockagainstphotography.com/127.0.0.1#5335\nipset=/stockagainstphotography.com/gfwlist\nserver=/wto.org/127.0.0.1#5335\nipset=/wto.org/gfwlist\nserver=/hashicorp.com/127.0.0.1#5335\nipset=/hashicorp.com/gfwlist\nserver=/hp-ww.com/127.0.0.1#5335\nipset=/hp-ww.com/gfwlist\nserver=/bmwdcsnet.net/127.0.0.1#5335\nipset=/bmwdcsnet.net/gfwlist\nserver=/bmw-connecteddrive.pl/127.0.0.1#5335\nipset=/bmw-connecteddrive.pl/gfwlist\nserver=/applestore.com.bn/127.0.0.1#5335\nipset=/applestore.com.bn/gfwlist\nserver=/intel.sa/127.0.0.1#5335\nipset=/intel.sa/gfwlist\nserver=/visa.com.dm/127.0.0.1#5335\nipset=/visa.com.dm/gfwlist\nserver=/facebookloginhelp.net/127.0.0.1#5335\nipset=/facebookloginhelp.net/gfwlist\nserver=/enfabebe.com.do/127.0.0.1#5335\nipset=/enfabebe.com.do/gfwlist\nserver=/vjav.com/127.0.0.1#5335\nipset=/vjav.com/gfwlist\nserver=/akamaihd.net/127.0.0.1#5335\nipset=/akamaihd.net/gfwlist\nserver=/porngames.games/127.0.0.1#5335\nipset=/porngames.games/gfwlist\nserver=/veet.com.mx/127.0.0.1#5335\nipset=/veet.com.mx/gfwlist\nserver=/sexy-photos.net/127.0.0.1#5335\nipset=/sexy-photos.net/gfwlist\nserver=/wantblogger.com/127.0.0.1#5335\nipset=/wantblogger.com/gfwlist\nserver=/vkuservideo.net/127.0.0.1#5335\nipset=/vkuservideo.net/gfwlist\nserver=/bmw.com.au/127.0.0.1#5335\nipset=/bmw.com.au/gfwlist\nserver=/oxfordscholarlyeditions.com/127.0.0.1#5335\nipset=/oxfordscholarlyeditions.com/gfwlist\nserver=/pornkind.net/127.0.0.1#5335\nipset=/pornkind.net/gfwlist\nserver=/nikkei-cnbc.co.jp/127.0.0.1#5335\nipset=/nikkei-cnbc.co.jp/gfwlist\nserver=/ebaytradingassistant.com/127.0.0.1#5335\nipset=/ebaytradingassistant.com/gfwlist\nserver=/porndr.com/127.0.0.1#5335\nipset=/porndr.com/gfwlist\nserver=/debug.com/127.0.0.1#5335\nipset=/debug.com/gfwlist\nserver=/stin31.ru/127.0.0.1#5335\nipset=/stin31.ru/gfwlist\nserver=/hpstore.com/127.0.0.1#5335\nipset=/hpstore.com/gfwlist\nserver=/nxtdig.com.hk/127.0.0.1#5335\nipset=/nxtdig.com.hk/gfwlist\nserver=/watchmygf.me/127.0.0.1#5335\nipset=/watchmygf.me/gfwlist\nserver=/facebomok.com/127.0.0.1#5335\nipset=/facebomok.com/gfwlist\nserver=/shoping.com/127.0.0.1#5335\nipset=/shoping.com/gfwlist\nserver=/scholar.google.bg/127.0.0.1#5335\nipset=/scholar.google.bg/gfwlist\nserver=/hotmail.co/127.0.0.1#5335\nipset=/hotmail.co/gfwlist\nserver=/mini.com.do/127.0.0.1#5335\nipset=/mini.com.do/gfwlist\nserver=/sonypicturestelevisiongames.com/127.0.0.1#5335\nipset=/sonypicturestelevisiongames.com/gfwlist\nserver=/netvideogirls.com/127.0.0.1#5335\nipset=/netvideogirls.com/gfwlist\nserver=/innovations-i.com/127.0.0.1#5335\nipset=/innovations-i.com/gfwlist\nserver=/bitfinex.com/127.0.0.1#5335\nipset=/bitfinex.com/gfwlist\nserver=/godaddy.com/127.0.0.1#5335\nipset=/godaddy.com/gfwlist\nserver=/verisign.sg/127.0.0.1#5335\nipset=/verisign.sg/gfwlist\nserver=/3dsexvilla.com/127.0.0.1#5335\nipset=/3dsexvilla.com/gfwlist\nserver=/static.fun/127.0.0.1#5335\nipset=/static.fun/gfwlist\nserver=/bmw-connecteddrive.se/127.0.0.1#5335\nipset=/bmw-connecteddrive.se/gfwlist\nserver=/ssl-lvlt.cdn.ea.com/127.0.0.1#5335\nipset=/ssl-lvlt.cdn.ea.com/gfwlist\nserver=/beatsneon.com/127.0.0.1#5335\nipset=/beatsneon.com/gfwlist\nserver=/savvyshopper.net.au/127.0.0.1#5335\nipset=/savvyshopper.net.au/gfwlist\nserver=/muchohentai.com/127.0.0.1#5335\nipset=/muchohentai.com/gfwlist\nserver=/freechatnow.com/127.0.0.1#5335\nipset=/freechatnow.com/gfwlist\nserver=/binancezh.link/127.0.0.1#5335\nipset=/binancezh.link/gfwlist\nserver=/fap18.net/127.0.0.1#5335\nipset=/fap18.net/gfwlist\nserver=/web.app/127.0.0.1#5335\nipset=/web.app/gfwlist\nserver=/canon.sk/127.0.0.1#5335\nipset=/canon.sk/gfwlist\nserver=/cooliphonecasesstore.com/127.0.0.1#5335\nipset=/cooliphonecasesstore.com/gfwlist\nserver=/xvedo.net/127.0.0.1#5335\nipset=/xvedo.net/gfwlist\nserver=/faphouse.com/127.0.0.1#5335\nipset=/faphouse.com/gfwlist\nserver=/businessinsider.nl/127.0.0.1#5335\nipset=/businessinsider.nl/gfwlist\nserver=/mini-connected.de/127.0.0.1#5335\nipset=/mini-connected.de/gfwlist\nserver=/johren.games/127.0.0.1#5335\nipset=/johren.games/gfwlist\nserver=/gouri.xyz/127.0.0.1#5335\nipset=/gouri.xyz/gfwlist\nserver=/lantern.io/127.0.0.1#5335\nipset=/lantern.io/gfwlist\nserver=/cnbc.com/127.0.0.1#5335\nipset=/cnbc.com/gfwlist\nserver=/porner.tv/127.0.0.1#5335\nipset=/porner.tv/gfwlist\nserver=/pixiv.co.jp/127.0.0.1#5335\nipset=/pixiv.co.jp/gfwlist\nserver=/nurofen.cz/127.0.0.1#5335\nipset=/nurofen.cz/gfwlist\nserver=/harpercollinschristian.com/127.0.0.1#5335\nipset=/harpercollinschristian.com/gfwlist\nserver=/ctfassets.net/127.0.0.1#5335\nipset=/ctfassets.net/gfwlist\nserver=/cloupia.net/127.0.0.1#5335\nipset=/cloupia.net/gfwlist\nserver=/google.com.kw/127.0.0.1#5335\nipset=/google.com.kw/gfwlist\nserver=/yaeby.info/127.0.0.1#5335\nipset=/yaeby.info/gfwlist\nserver=/glasamerike.net/127.0.0.1#5335\nipset=/glasamerike.net/gfwlist\nserver=/pearsoninstitute.ac.za/127.0.0.1#5335\nipset=/pearsoninstitute.ac.za/gfwlist\nserver=/thesimssocial.com/127.0.0.1#5335\nipset=/thesimssocial.com/gfwlist\nserver=/minimotorsport.com/127.0.0.1#5335\nipset=/minimotorsport.com/gfwlist\nserver=/travelex.be/127.0.0.1#5335\nipset=/travelex.be/gfwlist\nserver=/viewgals.com/127.0.0.1#5335\nipset=/viewgals.com/gfwlist\nserver=/falundafa.org/127.0.0.1#5335\nipset=/falundafa.org/gfwlist\nserver=/wipower.com/127.0.0.1#5335\nipset=/wipower.com/gfwlist\nserver=/disneynow.com/127.0.0.1#5335\nipset=/disneynow.com/gfwlist\nserver=/findtubes.com/127.0.0.1#5335\nipset=/findtubes.com/gfwlist\nserver=/webex.com/127.0.0.1#5335\nipset=/webex.com/gfwlist\nserver=/chicagolandbmw.com/127.0.0.1#5335\nipset=/chicagolandbmw.com/gfwlist\nserver=/wnacg.org/127.0.0.1#5335\nipset=/wnacg.org/gfwlist\nserver=/bmw.ba/127.0.0.1#5335\nipset=/bmw.ba/gfwlist\nserver=/brightcovecdn.com/127.0.0.1#5335\nipset=/brightcovecdn.com/gfwlist\nserver=/mortein.com.ng/127.0.0.1#5335\nipset=/mortein.com.ng/gfwlist\nserver=/disneyenconcert.com/127.0.0.1#5335\nipset=/disneyenconcert.com/gfwlist\nserver=/llnw.net/127.0.0.1#5335\nipset=/llnw.net/gfwlist\nserver=/bestbuyrewardzone.ca/127.0.0.1#5335\nipset=/bestbuyrewardzone.ca/gfwlist\nserver=/xxx-porn.info/127.0.0.1#5335\nipset=/xxx-porn.info/gfwlist\nserver=/careersatfb.com/127.0.0.1#5335\nipset=/careersatfb.com/gfwlist\nserver=/fox47.com/127.0.0.1#5335\nipset=/fox47.com/gfwlist\nserver=/hpceo.com/127.0.0.1#5335\nipset=/hpceo.com/gfwlist\nserver=/faceboox.com/127.0.0.1#5335\nipset=/faceboox.com/gfwlist\nserver=/votolia.com/127.0.0.1#5335\nipset=/votolia.com/gfwlist\nserver=/bmw-connecteddrive.be/127.0.0.1#5335\nipset=/bmw-connecteddrive.be/gfwlist\nserver=/amateur-porn-clips.com/127.0.0.1#5335\nipset=/amateur-porn-clips.com/gfwlist\nserver=/sni1dcb6gl.wpc.edgecastcdn.net/127.0.0.1#5335\nipset=/sni1dcb6gl.wpc.edgecastcdn.net/gfwlist\nserver=/cotolia.com/127.0.0.1#5335\nipset=/cotolia.com/gfwlist\nserver=/whatsapp.cc/127.0.0.1#5335\nipset=/whatsapp.cc/gfwlist\nserver=/fotolia.com/127.0.0.1#5335\nipset=/fotolia.com/gfwlist\nserver=/megapornfreehd.com/127.0.0.1#5335\nipset=/megapornfreehd.com/gfwlist\nserver=/vkuservideo.com/127.0.0.1#5335\nipset=/vkuservideo.com/gfwlist\nserver=/mit.edu/127.0.0.1#5335\nipset=/mit.edu/gfwlist\nserver=/myfbfans.com/127.0.0.1#5335\nipset=/myfbfans.com/gfwlist\nserver=/handjobtube4free.com/127.0.0.1#5335\nipset=/handjobtube4free.com/gfwlist\nserver=/nikefootballjersey.com/127.0.0.1#5335\nipset=/nikefootballjersey.com/gfwlist\nserver=/galleryarchives.com/127.0.0.1#5335\nipset=/galleryarchives.com/gfwlist\nserver=/mytimesplus.co.uk/127.0.0.1#5335\nipset=/mytimesplus.co.uk/gfwlist\nserver=/v8.dev/127.0.0.1#5335\nipset=/v8.dev/gfwlist\nserver=/alphabet.jp/127.0.0.1#5335\nipset=/alphabet.jp/gfwlist\nserver=/attssl.com/127.0.0.1#5335\nipset=/attssl.com/gfwlist\nserver=/sexmex.xxx/127.0.0.1#5335\nipset=/sexmex.xxx/gfwlist\nserver=/paypal-integration.com/127.0.0.1#5335\nipset=/paypal-integration.com/gfwlist\nserver=/pccwsolutions.com/127.0.0.1#5335\nipset=/pccwsolutions.com/gfwlist\nserver=/yourflashporn.com/127.0.0.1#5335\nipset=/yourflashporn.com/gfwlist\nserver=/fox32.com/127.0.0.1#5335\nipset=/fox32.com/gfwlist\nserver=/dowjones.io/127.0.0.1#5335\nipset=/dowjones.io/gfwlist\nserver=/faceobk.com/127.0.0.1#5335\nipset=/faceobk.com/gfwlist\nserver=/vanish.nl/127.0.0.1#5335\nipset=/vanish.nl/gfwlist\nserver=/adx.promo/127.0.0.1#5335\nipset=/adx.promo/gfwlist\nserver=/disney.co.jp/127.0.0.1#5335\nipset=/disney.co.jp/gfwlist\nserver=/1monsterbeatsbydreus.com/127.0.0.1#5335\nipset=/1monsterbeatsbydreus.com/gfwlist\nserver=/ebayopensource.net/127.0.0.1#5335\nipset=/ebayopensource.net/gfwlist\nserver=/alphera.com/127.0.0.1#5335\nipset=/alphera.com/gfwlist\nserver=/line-beta.me/127.0.0.1#5335\nipset=/line-beta.me/gfwlist\nserver=/hbogoasia.id/127.0.0.1#5335\nipset=/hbogoasia.id/gfwlist\nserver=/linux.org/127.0.0.1#5335\nipset=/linux.org/gfwlist\nserver=/thefappening.pro/127.0.0.1#5335\nipset=/thefappening.pro/gfwlist\nserver=/localpresshk.com/127.0.0.1#5335\nipset=/localpresshk.com/gfwlist\nserver=/regex101.com/127.0.0.1#5335\nipset=/regex101.com/gfwlist\nserver=/snapvolumes.com/127.0.0.1#5335\nipset=/snapvolumes.com/gfwlist\nserver=/sarennasworld.com/127.0.0.1#5335\nipset=/sarennasworld.com/gfwlist\nserver=/google.cl/127.0.0.1#5335\nipset=/google.cl/gfwlist\nserver=/openstreetmap.com/127.0.0.1#5335\nipset=/openstreetmap.com/gfwlist\nserver=/heads4-ak-spotify-com.akamaized.net/127.0.0.1#5335\nipset=/heads4-ak-spotify-com.akamaized.net/gfwlist\nserver=/freehulu.com/127.0.0.1#5335\nipset=/freehulu.com/gfwlist\nserver=/shinhangmc.com/127.0.0.1#5335\nipset=/shinhangmc.com/gfwlist\nserver=/beatsbydre.jp/127.0.0.1#5335\nipset=/beatsbydre.jp/gfwlist\nserver=/swpr.livedoor.blog/127.0.0.1#5335\nipset=/swpr.livedoor.blog/gfwlist\nserver=/amateurthreesomeporn.com/127.0.0.1#5335\nipset=/amateurthreesomeporn.com/gfwlist\nserver=/whatsapp.tv/127.0.0.1#5335\nipset=/whatsapp.tv/gfwlist\nserver=/yahoo.co.mz/127.0.0.1#5335\nipset=/yahoo.co.mz/gfwlist\nserver=/acpica.com/127.0.0.1#5335\nipset=/acpica.com/gfwlist\nserver=/xshr.online/127.0.0.1#5335\nipset=/xshr.online/gfwlist\nserver=/scifisex.net/127.0.0.1#5335\nipset=/scifisex.net/gfwlist\nserver=/nudeteenladies.com/127.0.0.1#5335\nipset=/nudeteenladies.com/gfwlist\nserver=/microsoft.by/127.0.0.1#5335\nipset=/microsoft.by/gfwlist\nserver=/mingw.org/127.0.0.1#5335\nipset=/mingw.org/gfwlist\nserver=/skysports.fr/127.0.0.1#5335\nipset=/skysports.fr/gfwlist\nserver=/riotgames.info/127.0.0.1#5335\nipset=/riotgames.info/gfwlist\nserver=/ipadair.hk/127.0.0.1#5335\nipset=/ipadair.hk/gfwlist\nserver=/xnxxpornvid.com/127.0.0.1#5335\nipset=/xnxxpornvid.com/gfwlist\nserver=/web.dev/127.0.0.1#5335\nipset=/web.dev/gfwlist\nserver=/webmoneyinfo.com/127.0.0.1#5335\nipset=/webmoneyinfo.com/gfwlist\nserver=/amazonalexavoxcon.com/127.0.0.1#5335\nipset=/amazonalexavoxcon.com/gfwlist\nserver=/appe-store.com/127.0.0.1#5335\nipset=/appe-store.com/gfwlist\nserver=/bvfce6wz.xyz/127.0.0.1#5335\nipset=/bvfce6wz.xyz/gfwlist\nserver=/bmwclassic.com/127.0.0.1#5335\nipset=/bmwclassic.com/gfwlist\nserver=/theguardiandns.com/127.0.0.1#5335\nipset=/theguardiandns.com/gfwlist\nserver=/eduplus.hk/127.0.0.1#5335\nipset=/eduplus.hk/gfwlist\nserver=/manurefetish.com/127.0.0.1#5335\nipset=/manurefetish.com/gfwlist\nserver=/pinterest.nz/127.0.0.1#5335\nipset=/pinterest.nz/gfwlist\nserver=/wldfnjh.com/127.0.0.1#5335\nipset=/wldfnjh.com/gfwlist\nserver=/bmw-motorrad.gt/127.0.0.1#5335\nipset=/bmw-motorrad.gt/gfwlist\nserver=/visa.com.sg/127.0.0.1#5335\nipset=/visa.com.sg/gfwlist\nserver=/multicurrencycashpassport.com/127.0.0.1#5335\nipset=/multicurrencycashpassport.com/gfwlist\nserver=/travelex.co.in/127.0.0.1#5335\nipset=/travelex.co.in/gfwlist\nserver=/leakxxx.com/127.0.0.1#5335\nipset=/leakxxx.com/gfwlist\nserver=/youtube.qa/127.0.0.1#5335\nipset=/youtube.qa/gfwlist\nserver=/pinterest.com.pe/127.0.0.1#5335\nipset=/pinterest.com.pe/gfwlist\nserver=/respawnbyrazer.com/127.0.0.1#5335\nipset=/respawnbyrazer.com/gfwlist\nserver=/quip.com/127.0.0.1#5335\nipset=/quip.com/gfwlist\nserver=/mepn.com/127.0.0.1#5335\nipset=/mepn.com/gfwlist\nserver=/go.dev/127.0.0.1#5335\nipset=/go.dev/gfwlist\nserver=/thestandnews.com/127.0.0.1#5335\nipset=/thestandnews.com/gfwlist\nserver=/perfectkickz.net/127.0.0.1#5335\nipset=/perfectkickz.net/gfwlist\nserver=/beatswirelesscheap.com/127.0.0.1#5335\nipset=/beatswirelesscheap.com/gfwlist\nserver=/huluasks.com/127.0.0.1#5335\nipset=/huluasks.com/gfwlist\nserver=/babushky.club/127.0.0.1#5335\nipset=/babushky.club/gfwlist\nserver=/rust-lang.org/127.0.0.1#5335\nipset=/rust-lang.org/gfwlist\nserver=/facebookfacebook.com/127.0.0.1#5335\nipset=/facebookfacebook.com/gfwlist\nserver=/apple.cl/127.0.0.1#5335\nipset=/apple.cl/gfwlist\nserver=/dynacw.com.tw/127.0.0.1#5335\nipset=/dynacw.com.tw/gfwlist\nserver=/canon.uz/127.0.0.1#5335\nipset=/canon.uz/gfwlist\nserver=/bbestmall.com/127.0.0.1#5335\nipset=/bbestmall.com/gfwlist\nserver=/tegrazone.jp/127.0.0.1#5335\nipset=/tegrazone.jp/gfwlist\nserver=/51luoli.info/127.0.0.1#5335\nipset=/51luoli.info/gfwlist\nserver=/bmw-lebanon.com/127.0.0.1#5335\nipset=/bmw-lebanon.com/gfwlist\nserver=/pcloud.tw/127.0.0.1#5335\nipset=/pcloud.tw/gfwlist\nserver=/jokerlu1.cc/127.0.0.1#5335\nipset=/jokerlu1.cc/gfwlist\nserver=/audio4-ak-spotify-com.akamaized.net/127.0.0.1#5335\nipset=/audio4-ak-spotify-com.akamaized.net/gfwlist\nserver=/beatsbydreforsalesonline.com/127.0.0.1#5335\nipset=/beatsbydreforsalesonline.com/gfwlist\nserver=/vrpornranked.com/127.0.0.1#5335\nipset=/vrpornranked.com/gfwlist\nserver=/mini.jp/127.0.0.1#5335\nipset=/mini.jp/gfwlist\nserver=/microsoftreactor.info/127.0.0.1#5335\nipset=/microsoftreactor.info/gfwlist\nserver=/nikepioneer.com/127.0.0.1#5335\nipset=/nikepioneer.com/gfwlist\nserver=/mini.com.tw/127.0.0.1#5335\nipset=/mini.com.tw/gfwlist\nserver=/applepencil.net/127.0.0.1#5335\nipset=/applepencil.net/gfwlist\nserver=/vagrantup.com/127.0.0.1#5335\nipset=/vagrantup.com/gfwlist\nserver=/intelsecurity.com/127.0.0.1#5335\nipset=/intelsecurity.com/gfwlist\nserver=/angelbeats.jp/127.0.0.1#5335\nipset=/angelbeats.jp/gfwlist\nserver=/okaapps.com/127.0.0.1#5335\nipset=/okaapps.com/gfwlist\nserver=/heraldsun.com.au/127.0.0.1#5335\nipset=/heraldsun.com.au/gfwlist\nserver=/bustydanniashe.com/127.0.0.1#5335\nipset=/bustydanniashe.com/gfwlist\nserver=/mujikorea.net/127.0.0.1#5335\nipset=/mujikorea.net/gfwlist\nserver=/wogx.com/127.0.0.1#5335\nipset=/wogx.com/gfwlist\nserver=/streamporn.pw/127.0.0.1#5335\nipset=/streamporn.pw/gfwlist\nserver=/fapdude.com/127.0.0.1#5335\nipset=/fapdude.com/gfwlist\nserver=/fbboostyourbusiness.com/127.0.0.1#5335\nipset=/fbboostyourbusiness.com/gfwlist\nserver=/codeish.co/127.0.0.1#5335\nipset=/codeish.co/gfwlist\nserver=/patentgold.net/127.0.0.1#5335\nipset=/patentgold.net/gfwlist\nserver=/uun87.com/127.0.0.1#5335\nipset=/uun87.com/gfwlist\nserver=/kyodonews.net/127.0.0.1#5335\nipset=/kyodonews.net/gfwlist\nserver=/intagram.com/127.0.0.1#5335\nipset=/intagram.com/gfwlist\nserver=/minihk.com/127.0.0.1#5335\nipset=/minihk.com/gfwlist\nserver=/contentful.com/127.0.0.1#5335\nipset=/contentful.com/gfwlist\nserver=/gaybubble.com/127.0.0.1#5335\nipset=/gaybubble.com/gfwlist\nserver=/dnaindia.com/127.0.0.1#5335\nipset=/dnaindia.com/gfwlist\nserver=/csis-prod.s3.amazonaws.com/127.0.0.1#5335\nipset=/csis-prod.s3.amazonaws.com/gfwlist\nserver=/steamvideo-a.akamaihd.net/127.0.0.1#5335\nipset=/steamvideo-a.akamaihd.net/gfwlist\nserver=/hdb1.app/127.0.0.1#5335\nipset=/hdb1.app/gfwlist\nserver=/plug.game/127.0.0.1#5335\nipset=/plug.game/gfwlist\nserver=/chinaeconomicreview.com/127.0.0.1#5335\nipset=/chinaeconomicreview.com/gfwlist\nserver=/vercel.live/127.0.0.1#5335\nipset=/vercel.live/gfwlist\nserver=/theintelstore.com/127.0.0.1#5335\nipset=/theintelstore.com/gfwlist\nserver=/fastlylb.net/127.0.0.1#5335\nipset=/fastlylb.net/gfwlist\nserver=/lenkino.xxx/127.0.0.1#5335\nipset=/lenkino.xxx/gfwlist\nserver=/sankei-ad.net/127.0.0.1#5335\nipset=/sankei-ad.net/gfwlist\nserver=/fuskator.com/127.0.0.1#5335\nipset=/fuskator.com/gfwlist\nserver=/monsterbeatscasques.com/127.0.0.1#5335\nipset=/monsterbeatscasques.com/gfwlist\nserver=/paypalhere.info/127.0.0.1#5335\nipset=/paypalhere.info/gfwlist\nserver=/attvoip.com/127.0.0.1#5335\nipset=/attvoip.com/gfwlist\nserver=/intel.ee/127.0.0.1#5335\nipset=/intel.ee/gfwlist\nserver=/verisign.ch/127.0.0.1#5335\nipset=/verisign.ch/gfwlist\nserver=/jmcomic2.moe/127.0.0.1#5335\nipset=/jmcomic2.moe/gfwlist\nserver=/reut.rs/127.0.0.1#5335\nipset=/reut.rs/gfwlist\nserver=/myfreeporngames.com/127.0.0.1#5335\nipset=/myfreeporngames.com/gfwlist\nserver=/makesenseofdata.com/127.0.0.1#5335\nipset=/makesenseofdata.com/gfwlist\nserver=/letsjerk.cc/127.0.0.1#5335\nipset=/letsjerk.cc/gfwlist\nserver=/svscomics.asia/127.0.0.1#5335\nipset=/svscomics.asia/gfwlist\nserver=/mini.se/127.0.0.1#5335\nipset=/mini.se/gfwlist\nserver=/ikea.com.om/127.0.0.1#5335\nipset=/ikea.com.om/gfwlist\nserver=/offresspecialesbmw.ca/127.0.0.1#5335\nipset=/offresspecialesbmw.ca/gfwlist\nserver=/ietf.org/127.0.0.1#5335\nipset=/ietf.org/gfwlist\nserver=/ebay.com.mt/127.0.0.1#5335\nipset=/ebay.com.mt/gfwlist\nserver=/katestube.com/127.0.0.1#5335\nipset=/katestube.com/gfwlist\nserver=/yahoosandbox.com/127.0.0.1#5335\nipset=/yahoosandbox.com/gfwlist\nserver=/spacely.com.au/127.0.0.1#5335\nipset=/spacely.com.au/gfwlist\nserver=/assistirhentai.com/127.0.0.1#5335\nipset=/assistirhentai.com/gfwlist\nserver=/bmw-motorrad.ee/127.0.0.1#5335\nipset=/bmw-motorrad.ee/gfwlist\nserver=/attwirelessinternet.com/127.0.0.1#5335\nipset=/attwirelessinternet.com/gfwlist\nserver=/gazounabi.com/127.0.0.1#5335\nipset=/gazounabi.com/gfwlist\nserver=/jerk-porn.com/127.0.0.1#5335\nipset=/jerk-porn.com/gfwlist\nserver=/fakku.net/127.0.0.1#5335\nipset=/fakku.net/gfwlist\nserver=/tkb008.xyz/127.0.0.1#5335\nipset=/tkb008.xyz/gfwlist\nserver=/starbucks.fr/127.0.0.1#5335\nipset=/starbucks.fr/gfwlist\nserver=/minecraftshop.com/127.0.0.1#5335\nipset=/minecraftshop.com/gfwlist\nserver=/porngo.tube/127.0.0.1#5335\nipset=/porngo.tube/gfwlist\nserver=/wetpussygames.com/127.0.0.1#5335\nipset=/wetpussygames.com/gfwlist\nserver=/facebood.com/127.0.0.1#5335\nipset=/facebood.com/gfwlist\nserver=/ntdtv.ru/127.0.0.1#5335\nipset=/ntdtv.ru/gfwlist\nserver=/bmwarchiv.de/127.0.0.1#5335\nipset=/bmwarchiv.de/gfwlist\nserver=/visabg.com/127.0.0.1#5335\nipset=/visabg.com/gfwlist\nserver=/feceboox.com/127.0.0.1#5335\nipset=/feceboox.com/gfwlist\nserver=/iphone5casescovers.com/127.0.0.1#5335\nipset=/iphone5casescovers.com/gfwlist\nserver=/volvotrucks.co.mz/127.0.0.1#5335\nipset=/volvotrucks.co.mz/gfwlist\nserver=/alpinelinux.org/127.0.0.1#5335\nipset=/alpinelinux.org/gfwlist\nserver=/dba.dk/127.0.0.1#5335\nipset=/dba.dk/gfwlist\nserver=/pali.ltd/127.0.0.1#5335\nipset=/pali.ltd/gfwlist\nserver=/livrariart.com.br/127.0.0.1#5335\nipset=/livrariart.com.br/gfwlist\nserver=/imlive.com/127.0.0.1#5335\nipset=/imlive.com/gfwlist\nserver=/mvk.com/127.0.0.1#5335\nipset=/mvk.com/gfwlist\nserver=/mrcong.com/127.0.0.1#5335\nipset=/mrcong.com/gfwlist\nserver=/scoreland.com/127.0.0.1#5335\nipset=/scoreland.com/gfwlist\nserver=/fburl.com/127.0.0.1#5335\nipset=/fburl.com/gfwlist\nserver=/beatselectronicsllc.tt.omtrdc.net/127.0.0.1#5335\nipset=/beatselectronicsllc.tt.omtrdc.net/gfwlist\nserver=/keyhole.com/127.0.0.1#5335\nipset=/keyhole.com/gfwlist\nserver=/linecorp.com/127.0.0.1#5335\nipset=/linecorp.com/gfwlist\nserver=/fuqqt.com/127.0.0.1#5335\nipset=/fuqqt.com/gfwlist\nserver=/csnjcbnxdnb.com/127.0.0.1#5335\nipset=/csnjcbnxdnb.com/gfwlist\nserver=/porn7.net/127.0.0.1#5335\nipset=/porn7.net/gfwlist\nserver=/onindiansex.com/127.0.0.1#5335\nipset=/onindiansex.com/gfwlist\nserver=/youtube.com.br/127.0.0.1#5335\nipset=/youtube.com.br/gfwlist\nserver=/xbrasilporno.com/127.0.0.1#5335\nipset=/xbrasilporno.com/gfwlist\nserver=/beatsbydreforstore.com/127.0.0.1#5335\nipset=/beatsbydreforstore.com/gfwlist\nserver=/fapteencam.com/127.0.0.1#5335\nipset=/fapteencam.com/gfwlist\nserver=/connectedcommerce.tv/127.0.0.1#5335\nipset=/connectedcommerce.tv/gfwlist\nserver=/siteripz.net/127.0.0.1#5335\nipset=/siteripz.net/gfwlist\nserver=/twinkspornos.com/127.0.0.1#5335\nipset=/twinkspornos.com/gfwlist\nserver=/ctyun.online/127.0.0.1#5335\nipset=/ctyun.online/gfwlist\nserver=/18eighteen.com/127.0.0.1#5335\nipset=/18eighteen.com/gfwlist\nserver=/msn.com/127.0.0.1#5335\nipset=/msn.com/gfwlist\nserver=/bigtitsextapes.com/127.0.0.1#5335\nipset=/bigtitsextapes.com/gfwlist\nserver=/javspanking.com/127.0.0.1#5335\nipset=/javspanking.com/gfwlist\nserver=/dynacw.com.cn/127.0.0.1#5335\nipset=/dynacw.com.cn/gfwlist\nserver=/spotifycharts.com/127.0.0.1#5335\nipset=/spotifycharts.com/gfwlist\nserver=/newsadds.com.au/127.0.0.1#5335\nipset=/newsadds.com.au/gfwlist\nserver=/riot.im/127.0.0.1#5335\nipset=/riot.im/gfwlist\nserver=/animalforsex.com/127.0.0.1#5335\nipset=/animalforsex.com/gfwlist\nserver=/maturepornonly.com/127.0.0.1#5335\nipset=/maturepornonly.com/gfwlist\nserver=/youtube.ge/127.0.0.1#5335\nipset=/youtube.ge/gfwlist\nserver=/minigeorgian.ca/127.0.0.1#5335\nipset=/minigeorgian.ca/gfwlist\nserver=/muji.net/127.0.0.1#5335\nipset=/muji.net/gfwlist\nserver=/erodouga.8sp.biz/127.0.0.1#5335\nipset=/erodouga.8sp.biz/gfwlist\nserver=/chatango.com/127.0.0.1#5335\nipset=/chatango.com/gfwlist\nserver=/findbare.com/127.0.0.1#5335\nipset=/findbare.com/gfwlist\nserver=/thelancet.com/127.0.0.1#5335\nipset=/thelancet.com/gfwlist\nserver=/ebenporno.com/127.0.0.1#5335\nipset=/ebenporno.com/gfwlist\nserver=/moystoys.com/127.0.0.1#5335\nipset=/moystoys.com/gfwlist\nserver=/google.as/127.0.0.1#5335\nipset=/google.as/gfwlist\nserver=/appledaily.com.hk/127.0.0.1#5335\nipset=/appledaily.com.hk/gfwlist\nserver=/firestonecomercial.com.br/127.0.0.1#5335\nipset=/firestonecomercial.com.br/gfwlist\nserver=/hongkongpost.gov.hk/127.0.0.1#5335\nipset=/hongkongpost.gov.hk/gfwlist\nserver=/verily.com/127.0.0.1#5335\nipset=/verily.com/gfwlist\nserver=/duckduckgo.jp/127.0.0.1#5335\nipset=/duckduckgo.jp/gfwlist\nserver=/twlegs.com/127.0.0.1#5335\nipset=/twlegs.com/gfwlist\nserver=/dettol.com.br/127.0.0.1#5335\nipset=/dettol.com.br/gfwlist\nserver=/mansurfer.com/127.0.0.1#5335\nipset=/mansurfer.com/gfwlist\nserver=/eacashcard.com/127.0.0.1#5335\nipset=/eacashcard.com/gfwlist\nserver=/hacksear.ch/127.0.0.1#5335\nipset=/hacksear.ch/gfwlist\nserver=/mcdelivery.com.au/127.0.0.1#5335\nipset=/mcdelivery.com.au/gfwlist\nserver=/nugettest.org/127.0.0.1#5335\nipset=/nugettest.org/gfwlist\nserver=/softbank-jp.com/127.0.0.1#5335\nipset=/softbank-jp.com/gfwlist\nserver=/skysportsracing.com/127.0.0.1#5335\nipset=/skysportsracing.com/gfwlist\nserver=/onlinegeeksquad.com/127.0.0.1#5335\nipset=/onlinegeeksquad.com/gfwlist\nserver=/mygaysites.com/127.0.0.1#5335\nipset=/mygaysites.com/gfwlist\nserver=/twitch.tv/127.0.0.1#5335\nipset=/twitch.tv/gfwlist\nserver=/beatssaleus.com/127.0.0.1#5335\nipset=/beatssaleus.com/gfwlist\nserver=/gayharem.com/127.0.0.1#5335\nipset=/gayharem.com/gfwlist\nserver=/strepsils.es/127.0.0.1#5335\nipset=/strepsils.es/gfwlist\nserver=/porntsunami.com/127.0.0.1#5335\nipset=/porntsunami.com/gfwlist\nserver=/d-upp.com/127.0.0.1#5335\nipset=/d-upp.com/gfwlist\nserver=/pornxxx.bid/127.0.0.1#5335\nipset=/pornxxx.bid/gfwlist\nserver=/yahoo.im/127.0.0.1#5335\nipset=/yahoo.im/gfwlist\nserver=/hulusports.com/127.0.0.1#5335\nipset=/hulusports.com/gfwlist\nserver=/firestonetire.ca/127.0.0.1#5335\nipset=/firestonetire.ca/gfwlist\nserver=/favepornmovs.com/127.0.0.1#5335\nipset=/favepornmovs.com/gfwlist\nserver=/jdbimgs.com/127.0.0.1#5335\nipset=/jdbimgs.com/gfwlist\nserver=/tubev.sex/127.0.0.1#5335\nipset=/tubev.sex/gfwlist\nserver=/beatsbydreforshop2013-nl.com/127.0.0.1#5335\nipset=/beatsbydreforshop2013-nl.com/gfwlist\nserver=/pussyshine.info/127.0.0.1#5335\nipset=/pussyshine.info/gfwlist\nserver=/alphabet.com/127.0.0.1#5335\nipset=/alphabet.com/gfwlist\nserver=/twoo.com/127.0.0.1#5335\nipset=/twoo.com/gfwlist\nserver=/lss55.com/127.0.0.1#5335\nipset=/lss55.com/gfwlist\nserver=/ninecommentaries.com/127.0.0.1#5335\nipset=/ninecommentaries.com/gfwlist\nserver=/ahmia.fi/127.0.0.1#5335\nipset=/ahmia.fi/gfwlist\nserver=/windowsphone.com/127.0.0.1#5335\nipset=/windowsphone.com/gfwlist\nserver=/paypal-service.org/127.0.0.1#5335\nipset=/paypal-service.org/gfwlist\nserver=/pinkpussy.tv/127.0.0.1#5335\nipset=/pinkpussy.tv/gfwlist\nserver=/norsk.mobi/127.0.0.1#5335\nipset=/norsk.mobi/gfwlist\nserver=/cheapwirelessbeats.com/127.0.0.1#5335\nipset=/cheapwirelessbeats.com/gfwlist\nserver=/cultura-kolomna.ru/127.0.0.1#5335\nipset=/cultura-kolomna.ru/gfwlist\nserver=/bestamateurcumshots.com/127.0.0.1#5335\nipset=/bestamateurcumshots.com/gfwlist\nserver=/elsevier.io/127.0.0.1#5335\nipset=/elsevier.io/gfwlist\nserver=/voatibetan.com/127.0.0.1#5335\nipset=/voatibetan.com/gfwlist\nserver=/erogazoufactory.com/127.0.0.1#5335\nipset=/erogazoufactory.com/gfwlist\nserver=/av-top.com/127.0.0.1#5335\nipset=/av-top.com/gfwlist\nserver=/sankakucomplex.com/127.0.0.1#5335\nipset=/sankakucomplex.com/gfwlist\nserver=/paypal-engineering.com/127.0.0.1#5335\nipset=/paypal-engineering.com/gfwlist\nserver=/beatspascher.net/127.0.0.1#5335\nipset=/beatspascher.net/gfwlist\nserver=/alt7-mtalk.google.com/127.0.0.1#5335\nipset=/alt7-mtalk.google.com/gfwlist\nserver=/hentaixxx.vip/127.0.0.1#5335\nipset=/hentaixxx.vip/gfwlist\nserver=/efukt.com/127.0.0.1#5335\nipset=/efukt.com/gfwlist\nserver=/xxxgirls88.com/127.0.0.1#5335\nipset=/xxxgirls88.com/gfwlist\nserver=/gettyimages.ie/127.0.0.1#5335\nipset=/gettyimages.ie/gfwlist\nserver=/myporno.photos/127.0.0.1#5335\nipset=/myporno.photos/gfwlist\nserver=/isexomega.tw/127.0.0.1#5335\nipset=/isexomega.tw/gfwlist\nserver=/fse.tv/127.0.0.1#5335\nipset=/fse.tv/gfwlist\nserver=/5mb48g.com/127.0.0.1#5335\nipset=/5mb48g.com/gfwlist\nserver=/sun.com/127.0.0.1#5335\nipset=/sun.com/gfwlist\nserver=/beatsaudiobydre.net/127.0.0.1#5335\nipset=/beatsaudiobydre.net/gfwlist\nserver=/gandhara.ru/127.0.0.1#5335\nipset=/gandhara.ru/gfwlist\nserver=/azureplanetscale.info/127.0.0.1#5335\nipset=/azureplanetscale.info/gfwlist\nserver=/pornrox.com/127.0.0.1#5335\nipset=/pornrox.com/gfwlist\nserver=/bigsex.tv/127.0.0.1#5335\nipset=/bigsex.tv/gfwlist\nserver=/asianboygay.com/127.0.0.1#5335\nipset=/asianboygay.com/gfwlist\nserver=/amateurhomevids.com/127.0.0.1#5335\nipset=/amateurhomevids.com/gfwlist\nserver=/inkchoice.com/127.0.0.1#5335\nipset=/inkchoice.com/gfwlist\nserver=/amapornofilme.com/127.0.0.1#5335\nipset=/amapornofilme.com/gfwlist\nserver=/activeteachonline.com/127.0.0.1#5335\nipset=/activeteachonline.com/gfwlist\nserver=/yahoo.es/127.0.0.1#5335\nipset=/yahoo.es/gfwlist\nserver=/google.co.ao/127.0.0.1#5335\nipset=/google.co.ao/gfwlist\nserver=/171xx.com/127.0.0.1#5335\nipset=/171xx.com/gfwlist\nserver=/anyporn.com/127.0.0.1#5335\nipset=/anyporn.com/gfwlist\nserver=/sexy-more.com/127.0.0.1#5335\nipset=/sexy-more.com/gfwlist\nserver=/momentumms.com/127.0.0.1#5335\nipset=/momentumms.com/gfwlist\nserver=/sexxxtape.net/127.0.0.1#5335\nipset=/sexxxtape.net/gfwlist\nserver=/ebayadvertising.com/127.0.0.1#5335\nipset=/ebayadvertising.com/gfwlist\nserver=/nii.ac.jp/127.0.0.1#5335\nipset=/nii.ac.jp/gfwlist\nserver=/appleappstore.tv/127.0.0.1#5335\nipset=/appleappstore.tv/gfwlist\nserver=/infinitetoons.com/127.0.0.1#5335\nipset=/infinitetoons.com/gfwlist\nserver=/mini.co.th/127.0.0.1#5335\nipset=/mini.co.th/gfwlist\nserver=/cuckporn.com/127.0.0.1#5335\nipset=/cuckporn.com/gfwlist\nserver=/tokyoporns.com/127.0.0.1#5335\nipset=/tokyoporns.com/gfwlist\nserver=/vfsco.com/127.0.0.1#5335\nipset=/vfsco.com/gfwlist\nserver=/navercorp.com/127.0.0.1#5335\nipset=/navercorp.com/gfwlist\nserver=/tandf.co.uk/127.0.0.1#5335\nipset=/tandf.co.uk/gfwlist\nserver=/microsoft.ge/127.0.0.1#5335\nipset=/microsoft.ge/gfwlist\nserver=/javmost.com/127.0.0.1#5335\nipset=/javmost.com/gfwlist\nserver=/lovethiscity.com/127.0.0.1#5335\nipset=/lovethiscity.com/gfwlist\nserver=/seneporno.com/127.0.0.1#5335\nipset=/seneporno.com/gfwlist\nserver=/adventuresbydisney.com/127.0.0.1#5335\nipset=/adventuresbydisney.com/gfwlist\nserver=/asiamoviepass.com/127.0.0.1#5335\nipset=/asiamoviepass.com/gfwlist\nserver=/tianbiav10.com/127.0.0.1#5335\nipset=/tianbiav10.com/gfwlist\nserver=/damplips.com/127.0.0.1#5335\nipset=/damplips.com/gfwlist\nserver=/volvotrucks.lt/127.0.0.1#5335\nipset=/volvotrucks.lt/gfwlist\nserver=/boycall.com/127.0.0.1#5335\nipset=/boycall.com/gfwlist\nserver=/mcstories.com/127.0.0.1#5335\nipset=/mcstories.com/gfwlist\nserver=/akamai-access.net/127.0.0.1#5335\nipset=/akamai-access.net/gfwlist\nserver=/bumptop.org/127.0.0.1#5335\nipset=/bumptop.org/gfwlist\nserver=/fuck.sc/127.0.0.1#5335\nipset=/fuck.sc/gfwlist\nserver=/mastercard.fi/127.0.0.1#5335\nipset=/mastercard.fi/gfwlist\nserver=/odysee.com/127.0.0.1#5335\nipset=/odysee.com/gfwlist\nserver=/ebayprivacycenter.com/127.0.0.1#5335\nipset=/ebayprivacycenter.com/gfwlist\nserver=/durex.pt/127.0.0.1#5335\nipset=/durex.pt/gfwlist\nserver=/pnas.org/127.0.0.1#5335\nipset=/pnas.org/gfwlist\nserver=/boringcompany.com/127.0.0.1#5335\nipset=/boringcompany.com/gfwlist\nserver=/apkcombo.com/127.0.0.1#5335\nipset=/apkcombo.com/gfwlist\nserver=/infotimes.com.tw/127.0.0.1#5335\nipset=/infotimes.com.tw/gfwlist\nserver=/lingeriepornonly.com/127.0.0.1#5335\nipset=/lingeriepornonly.com/gfwlist\nserver=/orgasmlist.com/127.0.0.1#5335\nipset=/orgasmlist.com/gfwlist\nserver=/uplay-istrip.com/127.0.0.1#5335\nipset=/uplay-istrip.com/gfwlist\nserver=/smartline.com.au/127.0.0.1#5335\nipset=/smartline.com.au/gfwlist\nserver=/wide-youtube.l.google.com/127.0.0.1#5335\nipset=/wide-youtube.l.google.com/gfwlist\nserver=/xhub.tv/127.0.0.1#5335\nipset=/xhub.tv/gfwlist\nserver=/bmw-connecteddrive.com.hr/127.0.0.1#5335\nipset=/bmw-connecteddrive.com.hr/gfwlist\nserver=/unityads.unitychina.cn/127.0.0.1#5335\nipset=/unityads.unitychina.cn/gfwlist\nserver=/superpapermario.com/127.0.0.1#5335\nipset=/superpapermario.com/gfwlist\nserver=/qdmomentum.com/127.0.0.1#5335\nipset=/qdmomentum.com/gfwlist\nserver=/blogspot.cl/127.0.0.1#5335\nipset=/blogspot.cl/gfwlist\nserver=/practicalmoneyskills.jp/127.0.0.1#5335\nipset=/practicalmoneyskills.jp/gfwlist\nserver=/realclearfoundation.org/127.0.0.1#5335\nipset=/realclearfoundation.org/gfwlist\nserver=/feedburner.com/127.0.0.1#5335\nipset=/feedburner.com/gfwlist\nserver=/airwick.com.br/127.0.0.1#5335\nipset=/airwick.com.br/gfwlist\nserver=/techtimes.com/127.0.0.1#5335\nipset=/techtimes.com/gfwlist\nserver=/espncdn.com/127.0.0.1#5335\nipset=/espncdn.com/gfwlist\nserver=/amazonaws.com/127.0.0.1#5335\nipset=/amazonaws.com/gfwlist\nserver=/ikea.com.pl/127.0.0.1#5335\nipset=/ikea.com.pl/gfwlist\nserver=/acjj.net/127.0.0.1#5335\nipset=/acjj.net/gfwlist\nserver=/wuso.me/127.0.0.1#5335\nipset=/wuso.me/gfwlist\nserver=/bestbuy-communityrelations.com/127.0.0.1#5335\nipset=/bestbuy-communityrelations.com/gfwlist\nserver=/ituneas.com/127.0.0.1#5335\nipset=/ituneas.com/gfwlist\nserver=/kyodo-d.jp/127.0.0.1#5335\nipset=/kyodo-d.jp/gfwlist\nserver=/blogspot.cz/127.0.0.1#5335\nipset=/blogspot.cz/gfwlist\nserver=/vancouverbmwretailers.ca/127.0.0.1#5335\nipset=/vancouverbmwretailers.ca/gfwlist\nserver=/spearhead.kr/127.0.0.1#5335\nipset=/spearhead.kr/gfwlist\nserver=/visa.co.il/127.0.0.1#5335\nipset=/visa.co.il/gfwlist\nserver=/thai-xxx.com/127.0.0.1#5335\nipset=/thai-xxx.com/gfwlist\nserver=/facebook-inc.com/127.0.0.1#5335\nipset=/facebook-inc.com/gfwlist\nserver=/cloudsync-prod.s3.amazonaws.com/127.0.0.1#5335\nipset=/cloudsync-prod.s3.amazonaws.com/gfwlist\nserver=/waplog.com/127.0.0.1#5335\nipset=/waplog.com/gfwlist\nserver=/nvidia.dk/127.0.0.1#5335\nipset=/nvidia.dk/gfwlist\nserver=/xgsp.tv/127.0.0.1#5335\nipset=/xgsp.tv/gfwlist\nserver=/monsterbeats-headphone.com/127.0.0.1#5335\nipset=/monsterbeats-headphone.com/gfwlist\nserver=/youtube.co.id/127.0.0.1#5335\nipset=/youtube.co.id/gfwlist\nserver=/disneyturkiye.com.tr/127.0.0.1#5335\nipset=/disneyturkiye.com.tr/gfwlist\nserver=/iphone.ru/127.0.0.1#5335\nipset=/iphone.ru/gfwlist\nserver=/pics.vc/127.0.0.1#5335\nipset=/pics.vc/gfwlist\nserver=/redwap.pro/127.0.0.1#5335\nipset=/redwap.pro/gfwlist\nserver=/hyperscan.io/127.0.0.1#5335\nipset=/hyperscan.io/gfwlist\nserver=/sandisk.fr/127.0.0.1#5335\nipset=/sandisk.fr/gfwlist\nserver=/ccievoicelabs.com/127.0.0.1#5335\nipset=/ccievoicelabs.com/gfwlist\nserver=/mini-stjohns.ca/127.0.0.1#5335\nipset=/mini-stjohns.ca/gfwlist\nserver=/xkorean.cam/127.0.0.1#5335\nipset=/xkorean.cam/gfwlist\nserver=/yomiuri-ryokou.co.jp/127.0.0.1#5335\nipset=/yomiuri-ryokou.co.jp/gfwlist\nserver=/discord.media/127.0.0.1#5335\nipset=/discord.media/gfwlist\nserver=/thomsonreuters.com.tr/127.0.0.1#5335\nipset=/thomsonreuters.com.tr/gfwlist\nserver=/timestalks.com/127.0.0.1#5335\nipset=/timestalks.com/gfwlist\nserver=/geek-squad.net/127.0.0.1#5335\nipset=/geek-squad.net/gfwlist\nserver=/pornvideotop.com/127.0.0.1#5335\nipset=/pornvideotop.com/gfwlist\nserver=/qt-project.org/127.0.0.1#5335\nipset=/qt-project.org/gfwlist\nserver=/ciscospark.ca/127.0.0.1#5335\nipset=/ciscospark.ca/gfwlist\nserver=/headphoneshome.com/127.0.0.1#5335\nipset=/headphoneshome.com/gfwlist\nserver=/nurofen.bg/127.0.0.1#5335\nipset=/nurofen.bg/gfwlist\nserver=/visa.com.br/127.0.0.1#5335\nipset=/visa.com.br/gfwlist\nserver=/pearsonassessments.com/127.0.0.1#5335\nipset=/pearsonassessments.com/gfwlist\nserver=/bigbigshop.com/127.0.0.1#5335\nipset=/bigbigshop.com/gfwlist\nserver=/streamhentaimovies.com/127.0.0.1#5335\nipset=/streamhentaimovies.com/gfwlist\nserver=/hpgraphicspartners.com/127.0.0.1#5335\nipset=/hpgraphicspartners.com/gfwlist\nserver=/cnn.com/127.0.0.1#5335\nipset=/cnn.com/gfwlist\nserver=/teengirlfriendtube.com/127.0.0.1#5335\nipset=/teengirlfriendtube.com/gfwlist\nserver=/adult-list.com/127.0.0.1#5335\nipset=/adult-list.com/gfwlist\nserver=/realclearworld.com/127.0.0.1#5335\nipset=/realclearworld.com/gfwlist\nserver=/volvotruckcenter.es/127.0.0.1#5335\nipset=/volvotruckcenter.es/gfwlist\nserver=/braintreepayments.tv/127.0.0.1#5335\nipset=/braintreepayments.tv/gfwlist\nserver=/pokemonrubysapphire.com/127.0.0.1#5335\nipset=/pokemonrubysapphire.com/gfwlist\nserver=/yomiuri.co.jp/127.0.0.1#5335\nipset=/yomiuri.co.jp/gfwlist\nserver=/finishinfo.cl/127.0.0.1#5335\nipset=/finishinfo.cl/gfwlist\nserver=/volvotrucks.uy/127.0.0.1#5335\nipset=/volvotrucks.uy/gfwlist\nserver=/viet69.news/127.0.0.1#5335\nipset=/viet69.news/gfwlist\nserver=/suxib.com/127.0.0.1#5335\nipset=/suxib.com/gfwlist\nserver=/theclubprive.com/127.0.0.1#5335\nipset=/theclubprive.com/gfwlist\nserver=/thelittleslush.com/127.0.0.1#5335\nipset=/thelittleslush.com/gfwlist\nserver=/starbuckscoffeegear.com/127.0.0.1#5335\nipset=/starbuckscoffeegear.com/gfwlist\nserver=/indiangfvideos.com/127.0.0.1#5335\nipset=/indiangfvideos.com/gfwlist\nserver=/leporno.org/127.0.0.1#5335\nipset=/leporno.org/gfwlist\nserver=/thebestfetishsites.com/127.0.0.1#5335\nipset=/thebestfetishsites.com/gfwlist\nserver=/family-sex.me/127.0.0.1#5335\nipset=/family-sex.me/gfwlist\nserver=/bitchmomporn.com/127.0.0.1#5335\nipset=/bitchmomporn.com/gfwlist\nserver=/creamlemon.info/127.0.0.1#5335\nipset=/creamlemon.info/gfwlist\nserver=/fotolia.cc/127.0.0.1#5335\nipset=/fotolia.cc/gfwlist\nserver=/niketrainer.com/127.0.0.1#5335\nipset=/niketrainer.com/gfwlist\nserver=/zohomerchandise.com/127.0.0.1#5335\nipset=/zohomerchandise.com/gfwlist\nserver=/youtube.com.ro/127.0.0.1#5335\nipset=/youtube.com.ro/gfwlist\nserver=/fulib711.shop/127.0.0.1#5335\nipset=/fulib711.shop/gfwlist\nserver=/sexsaoy.com/127.0.0.1#5335\nipset=/sexsaoy.com/gfwlist\nserver=/uhtube.me/127.0.0.1#5335\nipset=/uhtube.me/gfwlist\nserver=/beatscheap-uk.com/127.0.0.1#5335\nipset=/beatscheap-uk.com/gfwlist\nserver=/kjj05.cn/127.0.0.1#5335\nipset=/kjj05.cn/gfwlist\nserver=/ie11.com/127.0.0.1#5335\nipset=/ie11.com/gfwlist\nserver=/garena.sg/127.0.0.1#5335\nipset=/garena.sg/gfwlist\nserver=/mini.com.sg/127.0.0.1#5335\nipset=/mini.com.sg/gfwlist\nserver=/roku.com/127.0.0.1#5335\nipset=/roku.com/gfwlist\nserver=/bmw.it/127.0.0.1#5335\nipset=/bmw.it/gfwlist\nserver=/xn--urs05q.jp/127.0.0.1#5335\nipset=/xn--urs05q.jp/gfwlist\nserver=/kotlinlang.org/127.0.0.1#5335\nipset=/kotlinlang.org/gfwlist\nserver=/imdb.com/127.0.0.1#5335\nipset=/imdb.com/gfwlist\nserver=/epochtimes.nl/127.0.0.1#5335\nipset=/epochtimes.nl/gfwlist\nserver=/trmini.com/127.0.0.1#5335\nipset=/trmini.com/gfwlist\nserver=/paisapay.tv/127.0.0.1#5335\nipset=/paisapay.tv/gfwlist\nserver=/coursera.community/127.0.0.1#5335\nipset=/coursera.community/gfwlist\nserver=/jwpsrv.com/127.0.0.1#5335\nipset=/jwpsrv.com/gfwlist\nserver=/vkgo.app/127.0.0.1#5335\nipset=/vkgo.app/gfwlist\nserver=/gamesfuckgirls.com/127.0.0.1#5335\nipset=/gamesfuckgirls.com/gfwlist\nserver=/nudecelebforum.com/127.0.0.1#5335\nipset=/nudecelebforum.com/gfwlist\nserver=/pornwebmasters.com/127.0.0.1#5335\nipset=/pornwebmasters.com/gfwlist\nserver=/disneyme.com/127.0.0.1#5335\nipset=/disneyme.com/gfwlist\nserver=/vanitha.in/127.0.0.1#5335\nipset=/vanitha.in/gfwlist\nserver=/babesandgirls.com/127.0.0.1#5335\nipset=/babesandgirls.com/gfwlist\nserver=/thawte.fr/127.0.0.1#5335\nipset=/thawte.fr/gfwlist\nserver=/site.com/127.0.0.1#5335\nipset=/site.com/gfwlist\nserver=/ieee-pels.org/127.0.0.1#5335\nipset=/ieee-pels.org/gfwlist\nserver=/google.sc/127.0.0.1#5335\nipset=/google.sc/gfwlist\nserver=/appleone.tech/127.0.0.1#5335\nipset=/appleone.tech/gfwlist\nserver=/facebook.in/127.0.0.1#5335\nipset=/facebook.in/gfwlist\nserver=/amerikaninsesi.com/127.0.0.1#5335\nipset=/amerikaninsesi.com/gfwlist\nserver=/bbci.co.uk/127.0.0.1#5335\nipset=/bbci.co.uk/gfwlist\nserver=/madpeople.net/127.0.0.1#5335\nipset=/madpeople.net/gfwlist\nserver=/chatwhores.net/127.0.0.1#5335\nipset=/chatwhores.net/gfwlist\nserver=/bmw-motorrad-test-ride.com/127.0.0.1#5335\nipset=/bmw-motorrad-test-ride.com/gfwlist\nserver=/braintreepayments.info/127.0.0.1#5335\nipset=/braintreepayments.info/gfwlist\nserver=/monsterbeatstienda.com/127.0.0.1#5335\nipset=/monsterbeatstienda.com/gfwlist\nserver=/ginmoe.com/127.0.0.1#5335\nipset=/ginmoe.com/gfwlist\nserver=/sapphicpornonly.com/127.0.0.1#5335\nipset=/sapphicpornonly.com/gfwlist\nserver=/foxcincy.com/127.0.0.1#5335\nipset=/foxcincy.com/gfwlist\nserver=/darknun.com/127.0.0.1#5335\nipset=/darknun.com/gfwlist\nserver=/bloombergforeducation.com/127.0.0.1#5335\nipset=/bloombergforeducation.com/gfwlist\nserver=/free-xxx-porn.org/127.0.0.1#5335\nipset=/free-xxx-porn.org/gfwlist\nserver=/mindmeld.com/127.0.0.1#5335\nipset=/mindmeld.com/gfwlist\nserver=/mobilevrxxx.com/127.0.0.1#5335\nipset=/mobilevrxxx.com/gfwlist\nserver=/12diasderegalosdeitunes.com.ni/127.0.0.1#5335\nipset=/12diasderegalosdeitunes.com.ni/gfwlist\nserver=/realclearbooks.com/127.0.0.1#5335\nipset=/realclearbooks.com/gfwlist\nserver=/tonicmovies.com/127.0.0.1#5335\nipset=/tonicmovies.com/gfwlist\nserver=/asian-max.com/127.0.0.1#5335\nipset=/asian-max.com/gfwlist\nserver=/shemalestube.com/127.0.0.1#5335\nipset=/shemalestube.com/gfwlist\nserver=/ancensored.com/127.0.0.1#5335\nipset=/ancensored.com/gfwlist\nserver=/clubtubes.com/127.0.0.1#5335\nipset=/clubtubes.com/gfwlist\nserver=/nikefuelband.com/127.0.0.1#5335\nipset=/nikefuelband.com/gfwlist\nserver=/zunked.com/127.0.0.1#5335\nipset=/zunked.com/gfwlist\nserver=/xvideoporno.tv/127.0.0.1#5335\nipset=/xvideoporno.tv/gfwlist\nserver=/wnacg.link/127.0.0.1#5335\nipset=/wnacg.link/gfwlist\nserver=/adobe.io/127.0.0.1#5335\nipset=/adobe.io/gfwlist\nserver=/easportsmma.com/127.0.0.1#5335\nipset=/easportsmma.com/gfwlist\nserver=/cuebic.biz/127.0.0.1#5335\nipset=/cuebic.biz/gfwlist\nserver=/foxtv.com/127.0.0.1#5335\nipset=/foxtv.com/gfwlist\nserver=/anal.casa/127.0.0.1#5335\nipset=/anal.casa/gfwlist\nserver=/playvalorant.com/127.0.0.1#5335\nipset=/playvalorant.com/gfwlist\nserver=/rebrandly.com/127.0.0.1#5335\nipset=/rebrandly.com/gfwlist\nserver=/fi11.com/127.0.0.1#5335\nipset=/fi11.com/gfwlist\nserver=/best3dhere.com/127.0.0.1#5335\nipset=/best3dhere.com/gfwlist\nserver=/starbucks.dk/127.0.0.1#5335\nipset=/starbucks.dk/gfwlist\nserver=/intel-research.net/127.0.0.1#5335\nipset=/intel-research.net/gfwlist\nserver=/ieee-ccnc.org/127.0.0.1#5335\nipset=/ieee-ccnc.org/gfwlist\nserver=/perfectsexnow.com/127.0.0.1#5335\nipset=/perfectsexnow.com/gfwlist\nserver=/trendmicro.com/127.0.0.1#5335\nipset=/trendmicro.com/gfwlist\nserver=/toptoonsites.com/127.0.0.1#5335\nipset=/toptoonsites.com/gfwlist\nserver=/softbankusa.net/127.0.0.1#5335\nipset=/softbankusa.net/gfwlist\nserver=/geoport.com/127.0.0.1#5335\nipset=/geoport.com/gfwlist\nserver=/google.je/127.0.0.1#5335\nipset=/google.je/gfwlist\nserver=/vanithaveedu.com/127.0.0.1#5335\nipset=/vanithaveedu.com/gfwlist\nserver=/ebay.com.ar/127.0.0.1#5335\nipset=/ebay.com.ar/gfwlist\nserver=/japan-whores.com/127.0.0.1#5335\nipset=/japan-whores.com/gfwlist\nserver=/opte.org/127.0.0.1#5335\nipset=/opte.org/gfwlist\nserver=/wetchicks.org/127.0.0.1#5335\nipset=/wetchicks.org/gfwlist\nserver=/vscode-sync.trafficmanager.net/127.0.0.1#5335\nipset=/vscode-sync.trafficmanager.net/gfwlist\nserver=/fotoiia.com/127.0.0.1#5335\nipset=/fotoiia.com/gfwlist\nserver=/myvodafone.com.ws/127.0.0.1#5335\nipset=/myvodafone.com.ws/gfwlist\nserver=/mini-grouparchiv.de/127.0.0.1#5335\nipset=/mini-grouparchiv.de/gfwlist\nserver=/microsoft-sap-events.com/127.0.0.1#5335\nipset=/microsoft-sap-events.com/gfwlist\nserver=/ebaygroup.com/127.0.0.1#5335\nipset=/ebaygroup.com/gfwlist\nserver=/chikiporn.com/127.0.0.1#5335\nipset=/chikiporn.com/gfwlist\nserver=/cumasianporn.com/127.0.0.1#5335\nipset=/cumasianporn.com/gfwlist\nserver=/twitchsvc.net/127.0.0.1#5335\nipset=/twitchsvc.net/gfwlist\nserver=/cashify.net/127.0.0.1#5335\nipset=/cashify.net/gfwlist\nserver=/sony-asia.com/127.0.0.1#5335\nipset=/sony-asia.com/gfwlist\nserver=/mingpaocanada.com/127.0.0.1#5335\nipset=/mingpaocanada.com/gfwlist\nserver=/gwins.org/127.0.0.1#5335\nipset=/gwins.org/gfwlist\nserver=/buyingfacebooklikes.com/127.0.0.1#5335\nipset=/buyingfacebooklikes.com/gfwlist\nserver=/yahoosportsbook.com/127.0.0.1#5335\nipset=/yahoosportsbook.com/gfwlist\nserver=/pornv.org/127.0.0.1#5335\nipset=/pornv.org/gfwlist\nserver=/gayporn.com/127.0.0.1#5335\nipset=/gayporn.com/gfwlist\nserver=/poopeegirls.com/127.0.0.1#5335\nipset=/poopeegirls.com/gfwlist\nserver=/coursera.help/127.0.0.1#5335\nipset=/coursera.help/gfwlist\nserver=/smart-edge.com/127.0.0.1#5335\nipset=/smart-edge.com/gfwlist\nserver=/everydayporn.co/127.0.0.1#5335\nipset=/everydayporn.co/gfwlist\nserver=/thecleversense.com/127.0.0.1#5335\nipset=/thecleversense.com/gfwlist\nserver=/hentaigasm.com/127.0.0.1#5335\nipset=/hentaigasm.com/gfwlist\nserver=/pornid.xxx/127.0.0.1#5335\nipset=/pornid.xxx/gfwlist\nserver=/bigbeans.solutions/127.0.0.1#5335\nipset=/bigbeans.solutions/gfwlist\nserver=/overthumbs.com/127.0.0.1#5335\nipset=/overthumbs.com/gfwlist\nserver=/purenudism.com/127.0.0.1#5335\nipset=/purenudism.com/gfwlist\nserver=/steambroadcast.akamaized.net/127.0.0.1#5335\nipset=/steambroadcast.akamaized.net/gfwlist\nserver=/mac.wang/127.0.0.1#5335\nipset=/mac.wang/gfwlist\nserver=/ie9.com/127.0.0.1#5335\nipset=/ie9.com/gfwlist\nserver=/xpee.com/127.0.0.1#5335\nipset=/xpee.com/gfwlist\nserver=/creamasia.com/127.0.0.1#5335\nipset=/creamasia.com/gfwlist\nserver=/iphone-vip5.com/127.0.0.1#5335\nipset=/iphone-vip5.com/gfwlist\nserver=/google.com.pg/127.0.0.1#5335\nipset=/google.com.pg/gfwlist\nserver=/kindnudist.com/127.0.0.1#5335\nipset=/kindnudist.com/gfwlist\nserver=/xn--ngstr-lra8j.com/127.0.0.1#5335\nipset=/xn--ngstr-lra8j.com/gfwlist\nserver=/anatomy.tv/127.0.0.1#5335\nipset=/anatomy.tv/gfwlist\nserver=/blogspot.my/127.0.0.1#5335\nipset=/blogspot.my/gfwlist\nserver=/dungeonkeeper.com/127.0.0.1#5335\nipset=/dungeonkeeper.com/gfwlist\nserver=/tidelift.com/127.0.0.1#5335\nipset=/tidelift.com/gfwlist\nserver=/youtube.se/127.0.0.1#5335\nipset=/youtube.se/gfwlist\nserver=/fetish-bb.com/127.0.0.1#5335\nipset=/fetish-bb.com/gfwlist\nserver=/myfoxdetroit.com/127.0.0.1#5335\nipset=/myfoxdetroit.com/gfwlist\nserver=/es-visiontimes.com/127.0.0.1#5335\nipset=/es-visiontimes.com/gfwlist\nserver=/sigmoidoscopeexam.com/127.0.0.1#5335\nipset=/sigmoidoscopeexam.com/gfwlist\nserver=/yahoo.ie/127.0.0.1#5335\nipset=/yahoo.ie/gfwlist\nserver=/voanews.eu/127.0.0.1#5335\nipset=/voanews.eu/gfwlist\nserver=/facebookstudios.net/127.0.0.1#5335\nipset=/facebookstudios.net/gfwlist\nserver=/vhxqa6.com/127.0.0.1#5335\nipset=/vhxqa6.com/gfwlist\nserver=/steamusercontent.com/127.0.0.1#5335\nipset=/steamusercontent.com/gfwlist\nserver=/crossborderexpansion.com/127.0.0.1#5335\nipset=/crossborderexpansion.com/gfwlist\nserver=/sexgamefun.com/127.0.0.1#5335\nipset=/sexgamefun.com/gfwlist\nserver=/bmwusrideracademy.com/127.0.0.1#5335\nipset=/bmwusrideracademy.com/gfwlist\nserver=/amzn.to/127.0.0.1#5335\nipset=/amzn.to/gfwlist\nserver=/applemusicconnect.com/127.0.0.1#5335\nipset=/applemusicconnect.com/gfwlist\nserver=/badoinkvr.com/127.0.0.1#5335\nipset=/badoinkvr.com/gfwlist\nserver=/foxsports.info/127.0.0.1#5335\nipset=/foxsports.info/gfwlist\nserver=/foxsuper6.com/127.0.0.1#5335\nipset=/foxsuper6.com/gfwlist\nserver=/microsoftinternetsafety.net/127.0.0.1#5335\nipset=/microsoftinternetsafety.net/gfwlist\nserver=/intgram.com/127.0.0.1#5335\nipset=/intgram.com/gfwlist\nserver=/bridgestone-tac-oman.com/127.0.0.1#5335\nipset=/bridgestone-tac-oman.com/gfwlist\nserver=/arphic.com.cn/127.0.0.1#5335\nipset=/arphic.com.cn/gfwlist\nserver=/miaomwu.com/127.0.0.1#5335\nipset=/miaomwu.com/gfwlist\nserver=/qmttqg3k.me/127.0.0.1#5335\nipset=/qmttqg3k.me/gfwlist\nserver=/hqcollect.net/127.0.0.1#5335\nipset=/hqcollect.net/gfwlist\nserver=/bmw.co.cr/127.0.0.1#5335\nipset=/bmw.co.cr/gfwlist\nserver=/imageshack.com/127.0.0.1#5335\nipset=/imageshack.com/gfwlist\nserver=/cherrybrady.com/127.0.0.1#5335\nipset=/cherrybrady.com/gfwlist\nserver=/photoshop.com/127.0.0.1#5335\nipset=/photoshop.com/gfwlist\nserver=/rarbgmirror.com/127.0.0.1#5335\nipset=/rarbgmirror.com/gfwlist\nserver=/storiesonline.net/127.0.0.1#5335\nipset=/storiesonline.net/gfwlist\nserver=/hindiweb.com/127.0.0.1#5335\nipset=/hindiweb.com/gfwlist\nserver=/1jsa22.vip/127.0.0.1#5335\nipset=/1jsa22.vip/gfwlist\nserver=/minivaughanwest.ca/127.0.0.1#5335\nipset=/minivaughanwest.ca/gfwlist\nserver=/hpsignage.com/127.0.0.1#5335\nipset=/hpsignage.com/gfwlist\nserver=/javlands.net/127.0.0.1#5335\nipset=/javlands.net/gfwlist\nserver=/ubisoftconnect.com/127.0.0.1#5335\nipset=/ubisoftconnect.com/gfwlist\nserver=/coolinet.net/127.0.0.1#5335\nipset=/coolinet.net/gfwlist\nserver=/azure-devices.net/127.0.0.1#5335\nipset=/azure-devices.net/gfwlist\nserver=/imperiodefamosas.com/127.0.0.1#5335\nipset=/imperiodefamosas.com/gfwlist\nserver=/voyeurstyle.com/127.0.0.1#5335\nipset=/voyeurstyle.com/gfwlist\nserver=/shopee.cl/127.0.0.1#5335\nipset=/shopee.cl/gfwlist\nserver=/shopdrebeats.com/127.0.0.1#5335\nipset=/shopdrebeats.com/gfwlist\nserver=/theyxxx.com/127.0.0.1#5335\nipset=/theyxxx.com/gfwlist\nserver=/ipodshop.com.au/127.0.0.1#5335\nipset=/ipodshop.com.au/gfwlist\nserver=/horsecock.guru/127.0.0.1#5335\nipset=/horsecock.guru/gfwlist\nserver=/heroku-charge.com/127.0.0.1#5335\nipset=/heroku-charge.com/gfwlist\nserver=/uug22.com/127.0.0.1#5335\nipset=/uug22.com/gfwlist\nserver=/microsoftsqlserver.com/127.0.0.1#5335\nipset=/microsoftsqlserver.com/gfwlist\nserver=/matureporner.com/127.0.0.1#5335\nipset=/matureporner.com/gfwlist\nserver=/vmwarehorizon.com/127.0.0.1#5335\nipset=/vmwarehorizon.com/gfwlist\nserver=/hornywhores.net/127.0.0.1#5335\nipset=/hornywhores.net/gfwlist\nserver=/verisign.pro/127.0.0.1#5335\nipset=/verisign.pro/gfwlist\nserver=/foundationdb.org/127.0.0.1#5335\nipset=/foundationdb.org/gfwlist\nserver=/porno365.net/127.0.0.1#5335\nipset=/porno365.net/gfwlist\nserver=/amazon.es/127.0.0.1#5335\nipset=/amazon.es/gfwlist\nserver=/matters.one/127.0.0.1#5335\nipset=/matters.one/gfwlist\nserver=/volvotrucks.hr/127.0.0.1#5335\nipset=/volvotrucks.hr/gfwlist\nserver=/alivevmax.com/127.0.0.1#5335\nipset=/alivevmax.com/gfwlist\nserver=/geeksquad.net/127.0.0.1#5335\nipset=/geeksquad.net/gfwlist\nserver=/instagramcn.com/127.0.0.1#5335\nipset=/instagramcn.com/gfwlist\nserver=/itunes.org/127.0.0.1#5335\nipset=/itunes.org/gfwlist\nserver=/mrssiren.com/127.0.0.1#5335\nipset=/mrssiren.com/gfwlist\nserver=/reachtheworldonfacebook.com/127.0.0.1#5335\nipset=/reachtheworldonfacebook.com/gfwlist\nserver=/pornburst.xxx/127.0.0.1#5335\nipset=/pornburst.xxx/gfwlist\nserver=/nintendo.co.za/127.0.0.1#5335\nipset=/nintendo.co.za/gfwlist\nserver=/whvuxtub.com/127.0.0.1#5335\nipset=/whvuxtub.com/gfwlist\nserver=/fb.gg/127.0.0.1#5335\nipset=/fb.gg/gfwlist\nserver=/720video.tv/127.0.0.1#5335\nipset=/720video.tv/gfwlist\nserver=/commerceos.com/127.0.0.1#5335\nipset=/commerceos.com/gfwlist\nserver=/spotifycodes.com/127.0.0.1#5335\nipset=/spotifycodes.com/gfwlist\nserver=/gaysheaven.blogspot.com/127.0.0.1#5335\nipset=/gaysheaven.blogspot.com/gfwlist\nserver=/poop-pee.online/127.0.0.1#5335\nipset=/poop-pee.online/gfwlist\nserver=/minilondon.ca/127.0.0.1#5335\nipset=/minilondon.ca/gfwlist\nserver=/google.ms/127.0.0.1#5335\nipset=/google.ms/gfwlist\nserver=/nikeairrift.com/127.0.0.1#5335\nipset=/nikeairrift.com/gfwlist\nserver=/ippstatic.com/127.0.0.1#5335\nipset=/ippstatic.com/gfwlist\nserver=/cisco.mobi/127.0.0.1#5335\nipset=/cisco.mobi/gfwlist\nserver=/girl-secret.com/127.0.0.1#5335\nipset=/girl-secret.com/gfwlist\nserver=/bmwworld.tv/127.0.0.1#5335\nipset=/bmwworld.tv/gfwlist\nserver=/tandfonline.com/127.0.0.1#5335\nipset=/tandfonline.com/gfwlist\nserver=/bmw.com.ge/127.0.0.1#5335\nipset=/bmw.com.ge/gfwlist\nserver=/ciscosoftware.com/127.0.0.1#5335\nipset=/ciscosoftware.com/gfwlist\nserver=/muyzorras.com/127.0.0.1#5335\nipset=/muyzorras.com/gfwlist\nserver=/healthreach.hk/127.0.0.1#5335\nipset=/healthreach.hk/gfwlist\nserver=/overleaf.com/127.0.0.1#5335\nipset=/overleaf.com/gfwlist\nserver=/gaypad.net/127.0.0.1#5335\nipset=/gaypad.net/gfwlist\nserver=/intel.com.py/127.0.0.1#5335\nipset=/intel.com.py/gfwlist\nserver=/ikea.co.id/127.0.0.1#5335\nipset=/ikea.co.id/gfwlist\nserver=/runnike.com/127.0.0.1#5335\nipset=/runnike.com/gfwlist\nserver=/wildcamporn.com/127.0.0.1#5335\nipset=/wildcamporn.com/gfwlist\nserver=/foxnebraska.com/127.0.0.1#5335\nipset=/foxnebraska.com/gfwlist\nserver=/verisign.com.cn/127.0.0.1#5335\nipset=/verisign.com.cn/gfwlist\nserver=/plusporn.net/127.0.0.1#5335\nipset=/plusporn.net/gfwlist\nserver=/gridaware.app/127.0.0.1#5335\nipset=/gridaware.app/gfwlist\nserver=/divas.com.uy/127.0.0.1#5335\nipset=/divas.com.uy/gfwlist\nserver=/primepornlist.com/127.0.0.1#5335\nipset=/primepornlist.com/gfwlist\nserver=/geeksquadprotectionplan.org/127.0.0.1#5335\nipset=/geeksquadprotectionplan.org/gfwlist\nserver=/mcdelivery.com.my/127.0.0.1#5335\nipset=/mcdelivery.com.my/gfwlist\nserver=/zooxxxsexporn.red/127.0.0.1#5335\nipset=/zooxxxsexporn.red/gfwlist\nserver=/pornhdvideos.tv/127.0.0.1#5335\nipset=/pornhdvideos.tv/gfwlist\nserver=/bongacams.com/127.0.0.1#5335\nipset=/bongacams.com/gfwlist\nserver=/thomsonreuters.com.sg/127.0.0.1#5335\nipset=/thomsonreuters.com.sg/gfwlist\nserver=/beatsbydrediscountonline.net/127.0.0.1#5335\nipset=/beatsbydrediscountonline.net/gfwlist\nserver=/instagramhilesi.org/127.0.0.1#5335\nipset=/instagramhilesi.org/gfwlist\nserver=/gettyimages.ch/127.0.0.1#5335\nipset=/gettyimages.ch/gfwlist\nserver=/fareastpornhub.com/127.0.0.1#5335\nipset=/fareastpornhub.com/gfwlist\nserver=/begin-trade.com/127.0.0.1#5335\nipset=/begin-trade.com/gfwlist\nserver=/chargenowusa.com/127.0.0.1#5335\nipset=/chargenowusa.com/gfwlist\nserver=/strepsils.com.ar/127.0.0.1#5335\nipset=/strepsils.com.ar/gfwlist\nserver=/verizon.com/127.0.0.1#5335\nipset=/verizon.com/gfwlist\nserver=/judeporn.com/127.0.0.1#5335\nipset=/judeporn.com/gfwlist\nserver=/monsterbeatsheadphones.net/127.0.0.1#5335\nipset=/monsterbeatsheadphones.net/gfwlist\nserver=/miniso-bh.com/127.0.0.1#5335\nipset=/miniso-bh.com/gfwlist\nserver=/cultoferotica.com/127.0.0.1#5335\nipset=/cultoferotica.com/gfwlist\nserver=/pornoid.com/127.0.0.1#5335\nipset=/pornoid.com/gfwlist\nserver=/datalore.io/127.0.0.1#5335\nipset=/datalore.io/gfwlist\nserver=/fnmt.es/127.0.0.1#5335\nipset=/fnmt.es/gfwlist\nserver=/thefacebook.com/127.0.0.1#5335\nipset=/thefacebook.com/gfwlist\nserver=/newcastlenewslocal.com.au/127.0.0.1#5335\nipset=/newcastlenewslocal.com.au/gfwlist\nserver=/enemas4fun.com/127.0.0.1#5335\nipset=/enemas4fun.com/gfwlist\nserver=/privatebrowsingmyths.com/127.0.0.1#5335\nipset=/privatebrowsingmyths.com/gfwlist\nserver=/alibabacloud.com.au/127.0.0.1#5335\nipset=/alibabacloud.com.au/gfwlist\nserver=/stripskunk.com/127.0.0.1#5335\nipset=/stripskunk.com/gfwlist\nserver=/intel.sv/127.0.0.1#5335\nipset=/intel.sv/gfwlist\nserver=/geolytics.com/127.0.0.1#5335\nipset=/geolytics.com/gfwlist\nserver=/dowjones.com/127.0.0.1#5335\nipset=/dowjones.com/gfwlist\nserver=/herexxx.com/127.0.0.1#5335\nipset=/herexxx.com/gfwlist\nserver=/elib.maruzen.co.jp/127.0.0.1#5335\nipset=/elib.maruzen.co.jp/gfwlist\nserver=/ieeesystemscouncil.org/127.0.0.1#5335\nipset=/ieeesystemscouncil.org/gfwlist\nserver=/nikeasia.com/127.0.0.1#5335\nipset=/nikeasia.com/gfwlist\nserver=/gigaxvideos.com/127.0.0.1#5335\nipset=/gigaxvideos.com/gfwlist\nserver=/inxporn.com/127.0.0.1#5335\nipset=/inxporn.com/gfwlist\nserver=/vnware.net/127.0.0.1#5335\nipset=/vnware.net/gfwlist\nserver=/20thcenturystudios.com.au/127.0.0.1#5335\nipset=/20thcenturystudios.com.au/gfwlist\nserver=/classicnike.com/127.0.0.1#5335\nipset=/classicnike.com/gfwlist\nserver=/flatpak.org/127.0.0.1#5335\nipset=/flatpak.org/gfwlist\nserver=/photo-image.monster/127.0.0.1#5335\nipset=/photo-image.monster/gfwlist\nserver=/xxx-hentai.blogspot.com/127.0.0.1#5335\nipset=/xxx-hentai.blogspot.com/gfwlist\nserver=/spaceexplored.com/127.0.0.1#5335\nipset=/spaceexplored.com/gfwlist\nserver=/powershellgallery.com/127.0.0.1#5335\nipset=/powershellgallery.com/gfwlist\nserver=/clasporno.org/127.0.0.1#5335\nipset=/clasporno.org/gfwlist\nserver=/movidius.net/127.0.0.1#5335\nipset=/movidius.net/gfwlist\nserver=/firestonerewards.com/127.0.0.1#5335\nipset=/firestonerewards.com/gfwlist\nserver=/ibookpartner.com/127.0.0.1#5335\nipset=/ibookpartner.com/gfwlist\nserver=/fox29.com/127.0.0.1#5335\nipset=/fox29.com/gfwlist\nserver=/yahoo.gl/127.0.0.1#5335\nipset=/yahoo.gl/gfwlist\nserver=/minitoronto.ca/127.0.0.1#5335\nipset=/minitoronto.ca/gfwlist\nserver=/53world.com/127.0.0.1#5335\nipset=/53world.com/gfwlist\nserver=/beatsbydrecybermondaydeals2013.com/127.0.0.1#5335\nipset=/beatsbydrecybermondaydeals2013.com/gfwlist\nserver=/hentaiathome.net/127.0.0.1#5335\nipset=/hentaiathome.net/gfwlist\nserver=/bmw-me.com/127.0.0.1#5335\nipset=/bmw-me.com/gfwlist\nserver=/nvidia.co.in/127.0.0.1#5335\nipset=/nvidia.co.in/gfwlist\nserver=/nbcsports.com/127.0.0.1#5335\nipset=/nbcsports.com/gfwlist\nserver=/paypal-online.net/127.0.0.1#5335\nipset=/paypal-online.net/gfwlist\nserver=/situero.com/127.0.0.1#5335\nipset=/situero.com/gfwlist\nserver=/tubevintageporn.com/127.0.0.1#5335\nipset=/tubevintageporn.com/gfwlist\nserver=/mom-gfs.com/127.0.0.1#5335\nipset=/mom-gfs.com/gfwlist\nserver=/steam.apac.qtlglb.com/127.0.0.1#5335\nipset=/steam.apac.qtlglb.com/gfwlist\nserver=/xpoleuno.com/127.0.0.1#5335\nipset=/xpoleuno.com/gfwlist\nserver=/cashpassportglobe.com/127.0.0.1#5335\nipset=/cashpassportglobe.com/gfwlist\nserver=/nudistlog.com/127.0.0.1#5335\nipset=/nudistlog.com/gfwlist\nserver=/globalsign.fr/127.0.0.1#5335\nipset=/globalsign.fr/gfwlist\nserver=/titsandtugs.com/127.0.0.1#5335\nipset=/titsandtugs.com/gfwlist\nserver=/porn300.com/127.0.0.1#5335\nipset=/porn300.com/gfwlist\nserver=/paypal-biz.com/127.0.0.1#5335\nipset=/paypal-biz.com/gfwlist\nserver=/google.mn/127.0.0.1#5335\nipset=/google.mn/gfwlist\nserver=/pinkvelvetvault.com/127.0.0.1#5335\nipset=/pinkvelvetvault.com/gfwlist\nserver=/minitakesthestates.com/127.0.0.1#5335\nipset=/minitakesthestates.com/gfwlist\nserver=/cenkei.com/127.0.0.1#5335\nipset=/cenkei.com/gfwlist\nserver=/bidvestbank.co.za/127.0.0.1#5335\nipset=/bidvestbank.co.za/gfwlist\nserver=/pearson.co.jp/127.0.0.1#5335\nipset=/pearson.co.jp/gfwlist\nserver=/foxsmallbusinesscenter.net/127.0.0.1#5335\nipset=/foxsmallbusinesscenter.net/gfwlist\nserver=/bigtithitomi.com/127.0.0.1#5335\nipset=/bigtithitomi.com/gfwlist\nserver=/vanish.ru/127.0.0.1#5335\nipset=/vanish.ru/gfwlist\nserver=/hsex.tv/127.0.0.1#5335\nipset=/hsex.tv/gfwlist\nserver=/facebok.com/127.0.0.1#5335\nipset=/facebok.com/gfwlist\nserver=/travelex.ca/127.0.0.1#5335\nipset=/travelex.ca/gfwlist\nserver=/dev.to/127.0.0.1#5335\nipset=/dev.to/gfwlist\nserver=/teentube.pro/127.0.0.1#5335\nipset=/teentube.pro/gfwlist\nserver=/intel.cr/127.0.0.1#5335\nipset=/intel.cr/gfwlist\nserver=/roloflix.com/127.0.0.1#5335\nipset=/roloflix.com/gfwlist\nserver=/pm.me/127.0.0.1#5335\nipset=/pm.me/gfwlist\nserver=/liveauction.com/127.0.0.1#5335\nipset=/liveauction.com/gfwlist\nserver=/d1k2us671qcoau.cloudfront.net/127.0.0.1#5335\nipset=/d1k2us671qcoau.cloudfront.net/gfwlist\nserver=/hplargeformatremote.com/127.0.0.1#5335\nipset=/hplargeformatremote.com/gfwlist\nserver=/ccpsx.com/127.0.0.1#5335\nipset=/ccpsx.com/gfwlist\nserver=/timesmembership.com/127.0.0.1#5335\nipset=/timesmembership.com/gfwlist\nserver=/mangoporn.net/127.0.0.1#5335\nipset=/mangoporn.net/gfwlist\nserver=/shopbmwmotorcycles.com/127.0.0.1#5335\nipset=/shopbmwmotorcycles.com/gfwlist\nserver=/canon.tj/127.0.0.1#5335\nipset=/canon.tj/gfwlist\nserver=/rfa.org/127.0.0.1#5335\nipset=/rfa.org/gfwlist\nserver=/blackhomeporn.com/127.0.0.1#5335\nipset=/blackhomeporn.com/gfwlist\nserver=/interactive-examples.mdn.mozilla.net/127.0.0.1#5335\nipset=/interactive-examples.mdn.mozilla.net/gfwlist\nserver=/amateursexpussy.com/127.0.0.1#5335\nipset=/amateursexpussy.com/gfwlist\nserver=/aalah.me/127.0.0.1#5335\nipset=/aalah.me/gfwlist\nserver=/1lib.tw/127.0.0.1#5335\nipset=/1lib.tw/gfwlist\nserver=/mimei.store/127.0.0.1#5335\nipset=/mimei.store/gfwlist\nserver=/leaksmodels.com/127.0.0.1#5335\nipset=/leaksmodels.com/gfwlist\nserver=/google.me/127.0.0.1#5335\nipset=/google.me/gfwlist\nserver=/momsgiveass.com/127.0.0.1#5335\nipset=/momsgiveass.com/gfwlist\nserver=/cdn77.org/127.0.0.1#5335\nipset=/cdn77.org/gfwlist\nserver=/sankie.net/127.0.0.1#5335\nipset=/sankie.net/gfwlist\nserver=/vk.me/127.0.0.1#5335\nipset=/vk.me/gfwlist\nserver=/asiansexdiary.com/127.0.0.1#5335\nipset=/asiansexdiary.com/gfwlist\nserver=/ioe.com/127.0.0.1#5335\nipset=/ioe.com/gfwlist\nserver=/needgayporn.com/127.0.0.1#5335\nipset=/needgayporn.com/gfwlist\nserver=/google.com.do/127.0.0.1#5335\nipset=/google.com.do/gfwlist\nserver=/babeimpact.com/127.0.0.1#5335\nipset=/babeimpact.com/gfwlist\nserver=/sexxx.cfd/127.0.0.1#5335\nipset=/sexxx.cfd/gfwlist\nserver=/faceboooik.com/127.0.0.1#5335\nipset=/faceboooik.com/gfwlist\nserver=/visa.com.pe/127.0.0.1#5335\nipset=/visa.com.pe/gfwlist\nserver=/antarvasnaclips.com/127.0.0.1#5335\nipset=/antarvasnaclips.com/gfwlist\nserver=/tube2011.com/127.0.0.1#5335\nipset=/tube2011.com/gfwlist\nserver=/beck-online.beck.de/127.0.0.1#5335\nipset=/beck-online.beck.de/gfwlist\nserver=/applepaymerchantsupplies.info/127.0.0.1#5335\nipset=/applepaymerchantsupplies.info/gfwlist\nserver=/dreamamateurs.com/127.0.0.1#5335\nipset=/dreamamateurs.com/gfwlist\nserver=/tophd.xxx/127.0.0.1#5335\nipset=/tophd.xxx/gfwlist\nserver=/drebyby.com/127.0.0.1#5335\nipset=/drebyby.com/gfwlist\nserver=/mini-corporate-sales.com/127.0.0.1#5335\nipset=/mini-corporate-sales.com/gfwlist\nserver=/sankei-shougakukai.jp/127.0.0.1#5335\nipset=/sankei-shougakukai.jp/gfwlist\nserver=/sexyhomewives.com/127.0.0.1#5335\nipset=/sexyhomewives.com/gfwlist\nserver=/truyentranh86.com/127.0.0.1#5335\nipset=/truyentranh86.com/gfwlist\nserver=/tsescortsdirectory.com/127.0.0.1#5335\nipset=/tsescortsdirectory.com/gfwlist\nserver=/attwirelesssolutions.com/127.0.0.1#5335\nipset=/attwirelesssolutions.com/gfwlist\nserver=/highporn.net/127.0.0.1#5335\nipset=/highporn.net/gfwlist\nserver=/babycondom.com/127.0.0.1#5335\nipset=/babycondom.com/gfwlist\nserver=/factwire.org/127.0.0.1#5335\nipset=/factwire.org/gfwlist\nserver=/cambro.tv/127.0.0.1#5335\nipset=/cambro.tv/gfwlist\nserver=/o365weve.com/127.0.0.1#5335\nipset=/o365weve.com/gfwlist\nserver=/momhomeporn.com/127.0.0.1#5335\nipset=/momhomeporn.com/gfwlist\nserver=/payppal.com/127.0.0.1#5335\nipset=/payppal.com/gfwlist\nserver=/hqbabes.com/127.0.0.1#5335\nipset=/hqbabes.com/gfwlist\nserver=/b-ok.cc/127.0.0.1#5335\nipset=/b-ok.cc/gfwlist\nserver=/volvopenta.us/127.0.0.1#5335\nipset=/volvopenta.us/gfwlist\nserver=/myfoxmaine.com/127.0.0.1#5335\nipset=/myfoxmaine.com/gfwlist\nserver=/skyoceanrescue.com/127.0.0.1#5335\nipset=/skyoceanrescue.com/gfwlist\nserver=/xiuren.org/127.0.0.1#5335\nipset=/xiuren.org/gfwlist\nserver=/nurofen.com/127.0.0.1#5335\nipset=/nurofen.com/gfwlist\nserver=/visacarddesignlab.com/127.0.0.1#5335\nipset=/visacarddesignlab.com/gfwlist\nserver=/bmwiventures.com/127.0.0.1#5335\nipset=/bmwiventures.com/gfwlist\nserver=/durexloveclub.com/127.0.0.1#5335\nipset=/durexloveclub.com/gfwlist\nserver=/woolitecarpet.com/127.0.0.1#5335\nipset=/woolitecarpet.com/gfwlist\nserver=/dump.xxx/127.0.0.1#5335\nipset=/dump.xxx/gfwlist\nserver=/bmw-motorrad-service-inclusive.com/127.0.0.1#5335\nipset=/bmw-motorrad-service-inclusive.com/gfwlist\nserver=/bingsandbox.com/127.0.0.1#5335\nipset=/bingsandbox.com/gfwlist\nserver=/amateurwifetits.com/127.0.0.1#5335\nipset=/amateurwifetits.com/gfwlist\nserver=/youtube.ro/127.0.0.1#5335\nipset=/youtube.ro/gfwlist\nserver=/thieme-connect.de/127.0.0.1#5335\nipset=/thieme-connect.de/gfwlist\nserver=/bestfreetube.xxx/127.0.0.1#5335\nipset=/bestfreetube.xxx/gfwlist\nserver=/hothomemade.com/127.0.0.1#5335\nipset=/hothomemade.com/gfwlist\nserver=/medone-education.thieme.com/127.0.0.1#5335\nipset=/medone-education.thieme.com/gfwlist\nserver=/thomsonreuters.ru/127.0.0.1#5335\nipset=/thomsonreuters.ru/gfwlist\nserver=/pearsonenespanol.com/127.0.0.1#5335\nipset=/pearsonenespanol.com/gfwlist\nserver=/inasian.club/127.0.0.1#5335\nipset=/inasian.club/gfwlist\nserver=/asianpornjav.com/127.0.0.1#5335\nipset=/asianpornjav.com/gfwlist\nserver=/ebay.nl/127.0.0.1#5335\nipset=/ebay.nl/gfwlist\nserver=/directtvdeals.tv/127.0.0.1#5335\nipset=/directtvdeals.tv/gfwlist\nserver=/blogspot.si/127.0.0.1#5335\nipset=/blogspot.si/gfwlist\nserver=/ed21.cc/127.0.0.1#5335\nipset=/ed21.cc/gfwlist\nserver=/softether.org/127.0.0.1#5335\nipset=/softether.org/gfwlist\nserver=/awseducate.org/127.0.0.1#5335\nipset=/awseducate.org/gfwlist\nserver=/facebookmarketing.info/127.0.0.1#5335\nipset=/facebookmarketing.info/gfwlist\nserver=/youtube.nl/127.0.0.1#5335\nipset=/youtube.nl/gfwlist\nserver=/iqq2.cc/127.0.0.1#5335\nipset=/iqq2.cc/gfwlist\nserver=/googlee.com/127.0.0.1#5335\nipset=/googlee.com/gfwlist\nserver=/yahoo.me/127.0.0.1#5335\nipset=/yahoo.me/gfwlist\nserver=/google.cg/127.0.0.1#5335\nipset=/google.cg/gfwlist\nserver=/videojs.com/127.0.0.1#5335\nipset=/videojs.com/gfwlist\nserver=/lobstertube.com/127.0.0.1#5335\nipset=/lobstertube.com/gfwlist\nserver=/visa.com.kz/127.0.0.1#5335\nipset=/visa.com.kz/gfwlist\nserver=/forthebadge.com/127.0.0.1#5335\nipset=/forthebadge.com/gfwlist\nserver=/rfi.fr/127.0.0.1#5335\nipset=/rfi.fr/gfwlist\nserver=/fuxporn.com/127.0.0.1#5335\nipset=/fuxporn.com/gfwlist\nserver=/youtube.lu/127.0.0.1#5335\nipset=/youtube.lu/gfwlist\nserver=/currently.com/127.0.0.1#5335\nipset=/currently.com/gfwlist\nserver=/veetarabia.com/127.0.0.1#5335\nipset=/veetarabia.com/gfwlist\nserver=/akamaietpphishingtest.com/127.0.0.1#5335\nipset=/akamaietpphishingtest.com/gfwlist\nserver=/free-strip-games.com/127.0.0.1#5335\nipset=/free-strip-games.com/gfwlist\nserver=/businessinsider.com.au/127.0.0.1#5335\nipset=/businessinsider.com.au/gfwlist\nserver=/babesandstars.com/127.0.0.1#5335\nipset=/babesandstars.com/gfwlist\nserver=/facebookpoker.info/127.0.0.1#5335\nipset=/facebookpoker.info/gfwlist\nserver=/microsoft.lv/127.0.0.1#5335\nipset=/microsoft.lv/gfwlist\nserver=/dazn.com/127.0.0.1#5335\nipset=/dazn.com/gfwlist\nserver=/sony.lu/127.0.0.1#5335\nipset=/sony.lu/gfwlist\nserver=/sinchew.my/127.0.0.1#5335\nipset=/sinchew.my/gfwlist\nserver=/mastercard.com.hk/127.0.0.1#5335\nipset=/mastercard.com.hk/gfwlist\nserver=/nintendo.ch/127.0.0.1#5335\nipset=/nintendo.ch/gfwlist\nserver=/lge.com/127.0.0.1#5335\nipset=/lge.com/gfwlist\nserver=/volvotrucks.com.bn/127.0.0.1#5335\nipset=/volvotrucks.com.bn/gfwlist\nserver=/dartlang.org/127.0.0.1#5335\nipset=/dartlang.org/gfwlist\nserver=/visa.com.bo/127.0.0.1#5335\nipset=/visa.com.bo/gfwlist\nserver=/nudevietnam.com/127.0.0.1#5335\nipset=/nudevietnam.com/gfwlist\nserver=/alt1-mtalk.google.com/127.0.0.1#5335\nipset=/alt1-mtalk.google.com/gfwlist\nserver=/wikifeet.com/127.0.0.1#5335\nipset=/wikifeet.com/gfwlist\nserver=/exec-appointments.com/127.0.0.1#5335\nipset=/exec-appointments.com/gfwlist\nserver=/ladies.com/127.0.0.1#5335\nipset=/ladies.com/gfwlist\nserver=/strepsilsarabia.com/127.0.0.1#5335\nipset=/strepsilsarabia.com/gfwlist\nserver=/fuckup.xxx/127.0.0.1#5335\nipset=/fuckup.xxx/gfwlist\nserver=/sexhubhd.com/127.0.0.1#5335\nipset=/sexhubhd.com/gfwlist\nserver=/sexo123.net/127.0.0.1#5335\nipset=/sexo123.net/gfwlist\nserver=/pankwire.com/127.0.0.1#5335\nipset=/pankwire.com/gfwlist\nserver=/foxuv.com/127.0.0.1#5335\nipset=/foxuv.com/gfwlist\nserver=/macruby.org/127.0.0.1#5335\nipset=/macruby.org/gfwlist\nserver=/fortawesome.com/127.0.0.1#5335\nipset=/fortawesome.com/gfwlist\nserver=/ikea.com.ua/127.0.0.1#5335\nipset=/ikea.com.ua/gfwlist\nserver=/isheppc.com/127.0.0.1#5335\nipset=/isheppc.com/gfwlist\nserver=/handjobcumvideos.com/127.0.0.1#5335\nipset=/handjobcumvideos.com/gfwlist\nserver=/headphonesbeatsbydre.com/127.0.0.1#5335\nipset=/headphonesbeatsbydre.com/gfwlist\nserver=/dronedj.com/127.0.0.1#5335\nipset=/dronedj.com/gfwlist\nserver=/myrimmingporn.com/127.0.0.1#5335\nipset=/myrimmingporn.com/gfwlist\nserver=/bmw-businessdrive.com/127.0.0.1#5335\nipset=/bmw-businessdrive.com/gfwlist\nserver=/cybertrust.ne.jp/127.0.0.1#5335\nipset=/cybertrust.ne.jp/gfwlist\nserver=/azurecosmosdb.net/127.0.0.1#5335\nipset=/azurecosmosdb.net/gfwlist\nserver=/farfetch-apps.com/127.0.0.1#5335\nipset=/farfetch-apps.com/gfwlist\nserver=/anybunny.tv/127.0.0.1#5335\nipset=/anybunny.tv/gfwlist\nserver=/gfashion.com/127.0.0.1#5335\nipset=/gfashion.com/gfwlist\nserver=/fanhaodian.com/127.0.0.1#5335\nipset=/fanhaodian.com/gfwlist\nserver=/seqing.one/127.0.0.1#5335\nipset=/seqing.one/gfwlist\nserver=/mypornstarbook.net/127.0.0.1#5335\nipset=/mypornstarbook.net/gfwlist\nserver=/corepublishingsolutions.com/127.0.0.1#5335\nipset=/corepublishingsolutions.com/gfwlist\nserver=/exgfvideos.xxx/127.0.0.1#5335\nipset=/exgfvideos.xxx/gfwlist\nserver=/buycheapbeatsbydreshop.com/127.0.0.1#5335\nipset=/buycheapbeatsbydreshop.com/gfwlist\nserver=/shopee.com.co/127.0.0.1#5335\nipset=/shopee.com.co/gfwlist\nserver=/oxyporn.com/127.0.0.1#5335\nipset=/oxyporn.com/gfwlist\nserver=/ebay-online.com/127.0.0.1#5335\nipset=/ebay-online.com/gfwlist\nserver=/allover30.com/127.0.0.1#5335\nipset=/allover30.com/gfwlist\nserver=/ieee-tems.org/127.0.0.1#5335\nipset=/ieee-tems.org/gfwlist\nserver=/auntymaza.com/127.0.0.1#5335\nipset=/auntymaza.com/gfwlist\nserver=/nomadlandmovie.ch/127.0.0.1#5335\nipset=/nomadlandmovie.ch/gfwlist\nserver=/applemusic.co/127.0.0.1#5335\nipset=/applemusic.co/gfwlist\nserver=/un.org/127.0.0.1#5335\nipset=/un.org/gfwlist\nserver=/itunesmatch.com/127.0.0.1#5335\nipset=/itunesmatch.com/gfwlist\nserver=/crossfitfirestone.com/127.0.0.1#5335\nipset=/crossfitfirestone.com/gfwlist\nserver=/intel.fi/127.0.0.1#5335\nipset=/intel.fi/gfwlist\nserver=/xdir.vip/127.0.0.1#5335\nipset=/xdir.vip/gfwlist\nserver=/paypalinc.com/127.0.0.1#5335\nipset=/paypalinc.com/gfwlist\nserver=/mastercard.ae/127.0.0.1#5335\nipset=/mastercard.ae/gfwlist\nserver=/mcd.com/127.0.0.1#5335\nipset=/mcd.com/gfwlist\nserver=/babesmachine.com/127.0.0.1#5335\nipset=/babesmachine.com/gfwlist\nserver=/xgroovy.com/127.0.0.1#5335\nipset=/xgroovy.com/gfwlist\nserver=/hairydivas.com/127.0.0.1#5335\nipset=/hairydivas.com/gfwlist\nserver=/applescript.info/127.0.0.1#5335\nipset=/applescript.info/gfwlist\nserver=/pixhost.to/127.0.0.1#5335\nipset=/pixhost.to/gfwlist\nserver=/yomilogi.com/127.0.0.1#5335\nipset=/yomilogi.com/gfwlist\nserver=/polymer-project.org/127.0.0.1#5335\nipset=/polymer-project.org/gfwlist\nserver=/crystalgunnsworld.com/127.0.0.1#5335\nipset=/crystalgunnsworld.com/gfwlist\nserver=/xxgasm.com/127.0.0.1#5335\nipset=/xxgasm.com/gfwlist\nserver=/indiancolleges.com/127.0.0.1#5335\nipset=/indiancolleges.com/gfwlist\nserver=/clubsweethearts.com/127.0.0.1#5335\nipset=/clubsweethearts.com/gfwlist\nserver=/bmw-connecteddrive.cz/127.0.0.1#5335\nipset=/bmw-connecteddrive.cz/gfwlist\nserver=/webmproject.org/127.0.0.1#5335\nipset=/webmproject.org/gfwlist\nserver=/frontiersin.org/127.0.0.1#5335\nipset=/frontiersin.org/gfwlist\nserver=/seiron-sankei.com/127.0.0.1#5335\nipset=/seiron-sankei.com/gfwlist\nserver=/microsoft.ru/127.0.0.1#5335\nipset=/microsoft.ru/gfwlist\nserver=/ipad.wang/127.0.0.1#5335\nipset=/ipad.wang/gfwlist\nserver=/coupangcdn.com/127.0.0.1#5335\nipset=/coupangcdn.com/gfwlist\nserver=/translatewiki.net/127.0.0.1#5335\nipset=/translatewiki.net/gfwlist\nserver=/minimarkham.ca/127.0.0.1#5335\nipset=/minimarkham.ca/gfwlist\nserver=/initproducts.com/127.0.0.1#5335\nipset=/initproducts.com/gfwlist\nserver=/windowsphone-int.com/127.0.0.1#5335\nipset=/windowsphone-int.com/gfwlist\nserver=/wish.com/127.0.0.1#5335\nipset=/wish.com/gfwlist\nserver=/babes34.pro/127.0.0.1#5335\nipset=/babes34.pro/gfwlist\nserver=/visualstudio-staging.com/127.0.0.1#5335\nipset=/visualstudio-staging.com/gfwlist\nserver=/omg.blog/127.0.0.1#5335\nipset=/omg.blog/gfwlist\nserver=/pornexpress.net/127.0.0.1#5335\nipset=/pornexpress.net/gfwlist\nserver=/whatisworkspaceone.com/127.0.0.1#5335\nipset=/whatisworkspaceone.com/gfwlist\nserver=/monsterbeats-solo.com/127.0.0.1#5335\nipset=/monsterbeats-solo.com/gfwlist\nserver=/vercel.blog/127.0.0.1#5335\nipset=/vercel.blog/gfwlist\nserver=/alpherafinancialservices.es/127.0.0.1#5335\nipset=/alpherafinancialservices.es/gfwlist\nserver=/tig-ol-bitties.live/127.0.0.1#5335\nipset=/tig-ol-bitties.live/gfwlist\nserver=/epochtimes.com/127.0.0.1#5335\nipset=/epochtimes.com/gfwlist\nserver=/yahoo.la/127.0.0.1#5335\nipset=/yahoo.la/gfwlist\nserver=/fox4news.com/127.0.0.1#5335\nipset=/fox4news.com/gfwlist\nserver=/poshtestgallery.cloudapp.net/127.0.0.1#5335\nipset=/poshtestgallery.cloudapp.net/gfwlist\nserver=/sony.ua/127.0.0.1#5335\nipset=/sony.ua/gfwlist\nserver=/modeloswebcambogota.com/127.0.0.1#5335\nipset=/modeloswebcambogota.com/gfwlist\nserver=/drebeatshome.com/127.0.0.1#5335\nipset=/drebeatshome.com/gfwlist\nserver=/babesaround.com/127.0.0.1#5335\nipset=/babesaround.com/gfwlist\nserver=/jav2be.com/127.0.0.1#5335\nipset=/jav2be.com/gfwlist\nserver=/tiava.com/127.0.0.1#5335\nipset=/tiava.com/gfwlist\nserver=/scholar.google.co.cr/127.0.0.1#5335\nipset=/scholar.google.co.cr/gfwlist\nserver=/erolabs.com/127.0.0.1#5335\nipset=/erolabs.com/gfwlist\nserver=/handbagsoutletebay.com/127.0.0.1#5335\nipset=/handbagsoutletebay.com/gfwlist\nserver=/ebay-stories.com/127.0.0.1#5335\nipset=/ebay-stories.com/gfwlist\nserver=/bestbuygsm.com/127.0.0.1#5335\nipset=/bestbuygsm.com/gfwlist\nserver=/builtfromebay.com/127.0.0.1#5335\nipset=/builtfromebay.com/gfwlist\nserver=/dishworld.com/127.0.0.1#5335\nipset=/dishworld.com/gfwlist\nserver=/reckittbenckiser.tv/127.0.0.1#5335\nipset=/reckittbenckiser.tv/gfwlist\nserver=/amazonstudiosguilds.com/127.0.0.1#5335\nipset=/amazonstudiosguilds.com/gfwlist\nserver=/monotypeimaging.com/127.0.0.1#5335\nipset=/monotypeimaging.com/gfwlist\nserver=/freepornvideos.life/127.0.0.1#5335\nipset=/freepornvideos.life/gfwlist\nserver=/godoc.org/127.0.0.1#5335\nipset=/godoc.org/gfwlist\nserver=/chromecast.com/127.0.0.1#5335\nipset=/chromecast.com/gfwlist\nserver=/instachecker.com/127.0.0.1#5335\nipset=/instachecker.com/gfwlist\nserver=/crazyxxx3dworld.com/127.0.0.1#5335\nipset=/crazyxxx3dworld.com/gfwlist\nserver=/coqnu.com/127.0.0.1#5335\nipset=/coqnu.com/gfwlist\nserver=/ebscohost.com/127.0.0.1#5335\nipset=/ebscohost.com/gfwlist\nserver=/cuckvideos.com/127.0.0.1#5335\nipset=/cuckvideos.com/gfwlist\nserver=/asn-online.org/127.0.0.1#5335\nipset=/asn-online.org/gfwlist\nserver=/appleone.website/127.0.0.1#5335\nipset=/appleone.website/gfwlist\nserver=/theweek.in/127.0.0.1#5335\nipset=/theweek.in/gfwlist\nserver=/jijiji.ca/127.0.0.1#5335\nipset=/jijiji.ca/gfwlist\nserver=/disney.be/127.0.0.1#5335\nipset=/disney.be/gfwlist\nserver=/intel.lt/127.0.0.1#5335\nipset=/intel.lt/gfwlist\nserver=/voalingala.com/127.0.0.1#5335\nipset=/voalingala.com/gfwlist\nserver=/paypaal.com/127.0.0.1#5335\nipset=/paypaal.com/gfwlist\nserver=/thestationbymaker.com/127.0.0.1#5335\nipset=/thestationbymaker.com/gfwlist\nserver=/adult3dcomics.com/127.0.0.1#5335\nipset=/adult3dcomics.com/gfwlist\nserver=/bridgestone.com.tw/127.0.0.1#5335\nipset=/bridgestone.com.tw/gfwlist\nserver=/ww9094.com/127.0.0.1#5335\nipset=/ww9094.com/gfwlist\nserver=/needforspeeddriftkings.com/127.0.0.1#5335\nipset=/needforspeeddriftkings.com/gfwlist\nserver=/tubegalore.com/127.0.0.1#5335\nipset=/tubegalore.com/gfwlist\nserver=/svoboda.org/127.0.0.1#5335\nipset=/svoboda.org/gfwlist\nserver=/video-one.com/127.0.0.1#5335\nipset=/video-one.com/gfwlist\nserver=/javout.co/127.0.0.1#5335\nipset=/javout.co/gfwlist\nserver=/mdn.mozit.cloud/127.0.0.1#5335\nipset=/mdn.mozit.cloud/gfwlist\nserver=/fljmh1.com/127.0.0.1#5335\nipset=/fljmh1.com/gfwlist\nserver=/huloo.tv/127.0.0.1#5335\nipset=/huloo.tv/gfwlist\nserver=/av01.tv/127.0.0.1#5335\nipset=/av01.tv/gfwlist\nserver=/cnn.io/127.0.0.1#5335\nipset=/cnn.io/gfwlist\nserver=/dubaihotties.org/127.0.0.1#5335\nipset=/dubaihotties.org/gfwlist\nserver=/wixanswers.com/127.0.0.1#5335\nipset=/wixanswers.com/gfwlist\nserver=/chargenow.com/127.0.0.1#5335\nipset=/chargenow.com/gfwlist\nserver=/realclearinvestigations.com/127.0.0.1#5335\nipset=/realclearinvestigations.com/gfwlist\nserver=/myporno.cz/127.0.0.1#5335\nipset=/myporno.cz/gfwlist\nserver=/nvidia.es/127.0.0.1#5335\nipset=/nvidia.es/gfwlist\nserver=/ikea.mx/127.0.0.1#5335\nipset=/ikea.mx/gfwlist\nserver=/xnxxcom.club/127.0.0.1#5335\nipset=/xnxxcom.club/gfwlist\nserver=/cuckfilmswifefuck.com/127.0.0.1#5335\nipset=/cuckfilmswifefuck.com/gfwlist\nserver=/sarajevopodopsadom.com/127.0.0.1#5335\nipset=/sarajevopodopsadom.com/gfwlist\nserver=/googletraveladservices.com/127.0.0.1#5335\nipset=/googletraveladservices.com/gfwlist\nserver=/onlyiphone5case.com/127.0.0.1#5335\nipset=/onlyiphone5case.com/gfwlist\nserver=/pp6.info/127.0.0.1#5335\nipset=/pp6.info/gfwlist\nserver=/bodgirls.com/127.0.0.1#5335\nipset=/bodgirls.com/gfwlist\nserver=/xvideosjingxiang.com/127.0.0.1#5335\nipset=/xvideosjingxiang.com/gfwlist\nserver=/intel.sn/127.0.0.1#5335\nipset=/intel.sn/gfwlist\nserver=/desiresecrets.com/127.0.0.1#5335\nipset=/desiresecrets.com/gfwlist\nserver=/ebayvakantiehuizen.com/127.0.0.1#5335\nipset=/ebayvakantiehuizen.com/gfwlist\nserver=/binance.info/127.0.0.1#5335\nipset=/binance.info/gfwlist\nserver=/nodejs.org/127.0.0.1#5335\nipset=/nodejs.org/gfwlist\nserver=/celebsroulette.com/127.0.0.1#5335\nipset=/celebsroulette.com/gfwlist\nserver=/daboja18.com/127.0.0.1#5335\nipset=/daboja18.com/gfwlist\nserver=/scholar.google.com.pk/127.0.0.1#5335\nipset=/scholar.google.com.pk/gfwlist\nserver=/hentaipornonly.com/127.0.0.1#5335\nipset=/hentaipornonly.com/gfwlist\nserver=/miniso.co.tz/127.0.0.1#5335\nipset=/miniso.co.tz/gfwlist\nserver=/sex-amateur-clips.com/127.0.0.1#5335\nipset=/sex-amateur-clips.com/gfwlist\nserver=/microsoft.com/127.0.0.1#5335\nipset=/microsoft.com/gfwlist\nserver=/erolabs.net/127.0.0.1#5335\nipset=/erolabs.net/gfwlist\nserver=/the-m-festival.com/127.0.0.1#5335\nipset=/the-m-festival.com/gfwlist\nserver=/osmfoundation.org/127.0.0.1#5335\nipset=/osmfoundation.org/gfwlist\nserver=/paypal-communications.net/127.0.0.1#5335\nipset=/paypal-communications.net/gfwlist\nserver=/scoop.sh/127.0.0.1#5335\nipset=/scoop.sh/gfwlist\nserver=/9hentaiz.com/127.0.0.1#5335\nipset=/9hentaiz.com/gfwlist\nserver=/sankei-digital.co.jp/127.0.0.1#5335\nipset=/sankei-digital.co.jp/gfwlist\nserver=/ap.org/127.0.0.1#5335\nipset=/ap.org/gfwlist\nserver=/nijioma.blog/127.0.0.1#5335\nipset=/nijioma.blog/gfwlist\nserver=/xxx-porn-tube.com/127.0.0.1#5335\nipset=/xxx-porn-tube.com/gfwlist\nserver=/oxfordpoliticstrove.com/127.0.0.1#5335\nipset=/oxfordpoliticstrove.com/gfwlist\nserver=/mini.cz/127.0.0.1#5335\nipset=/mini.cz/gfwlist\nserver=/homemadeamateur.com/127.0.0.1#5335\nipset=/homemadeamateur.com/gfwlist\nserver=/electrek.co/127.0.0.1#5335\nipset=/electrek.co/gfwlist\nserver=/bridgestone.co.in/127.0.0.1#5335\nipset=/bridgestone.co.in/gfwlist\nserver=/paypalonline.net/127.0.0.1#5335\nipset=/paypalonline.net/gfwlist\nserver=/pchomepay.com.tw/127.0.0.1#5335\nipset=/pchomepay.com.tw/gfwlist\nserver=/ebayclassifieds.com/127.0.0.1#5335\nipset=/ebayclassifieds.com/gfwlist\nserver=/akamaizercentral.com/127.0.0.1#5335\nipset=/akamaizercentral.com/gfwlist\nserver=/youtube.com.om/127.0.0.1#5335\nipset=/youtube.com.om/gfwlist\nserver=/monsterbeatsdrdrecheap.com/127.0.0.1#5335\nipset=/monsterbeatsdrdrecheap.com/gfwlist\nserver=/mobilefacebook.com/127.0.0.1#5335\nipset=/mobilefacebook.com/gfwlist\nserver=/intel.dk/127.0.0.1#5335\nipset=/intel.dk/gfwlist\nserver=/pururin.to/127.0.0.1#5335\nipset=/pururin.to/gfwlist\nserver=/javmodel.com/127.0.0.1#5335\nipset=/javmodel.com/gfwlist\nserver=/doceapower.com/127.0.0.1#5335\nipset=/doceapower.com/gfwlist\nserver=/eroticart-top100.com/127.0.0.1#5335\nipset=/eroticart-top100.com/gfwlist\nserver=/miniyaletown.ca/127.0.0.1#5335\nipset=/miniyaletown.ca/gfwlist\nserver=/volvotrucks.de/127.0.0.1#5335\nipset=/volvotrucks.de/gfwlist\nserver=/alibabacloud.com.hk/127.0.0.1#5335\nipset=/alibabacloud.com.hk/gfwlist\nserver=/ahpornogratuit.com/127.0.0.1#5335\nipset=/ahpornogratuit.com/gfwlist\nserver=/applefinalcutproworld.org/127.0.0.1#5335\nipset=/applefinalcutproworld.org/gfwlist\nserver=/tubebdsm.com/127.0.0.1#5335\nipset=/tubebdsm.com/gfwlist\nserver=/worldcoinpay.com/127.0.0.1#5335\nipset=/worldcoinpay.com/gfwlist\nserver=/nikeitalia.com/127.0.0.1#5335\nipset=/nikeitalia.com/gfwlist\nserver=/moapi1.club/127.0.0.1#5335\nipset=/moapi1.club/gfwlist\nserver=/ieeecss.org/127.0.0.1#5335\nipset=/ieeecss.org/gfwlist\nserver=/xujan.com/127.0.0.1#5335\nipset=/xujan.com/gfwlist\nserver=/wwe.com/127.0.0.1#5335\nipset=/wwe.com/gfwlist\nserver=/cbsig.net/127.0.0.1#5335\nipset=/cbsig.net/gfwlist\nserver=/fusker.xxx/127.0.0.1#5335\nipset=/fusker.xxx/gfwlist\nserver=/neurology.org/127.0.0.1#5335\nipset=/neurology.org/gfwlist\nserver=/0dzn.com/127.0.0.1#5335\nipset=/0dzn.com/gfwlist\nserver=/thinkwithgoogle.com/127.0.0.1#5335\nipset=/thinkwithgoogle.com/gfwlist\nserver=/friendfeed-api.com/127.0.0.1#5335\nipset=/friendfeed-api.com/gfwlist\nserver=/masalaseen.net/127.0.0.1#5335\nipset=/masalaseen.net/gfwlist\nserver=/thegay.com/127.0.0.1#5335\nipset=/thegay.com/gfwlist\nserver=/careerjournal.com/127.0.0.1#5335\nipset=/careerjournal.com/gfwlist\nserver=/sensualmothers.com/127.0.0.1#5335\nipset=/sensualmothers.com/gfwlist\nserver=/beatselectronics.com/127.0.0.1#5335\nipset=/beatselectronics.com/gfwlist\nserver=/buymeacoffee.com/127.0.0.1#5335\nipset=/buymeacoffee.com/gfwlist\nserver=/bloombergview.com/127.0.0.1#5335\nipset=/bloombergview.com/gfwlist\nserver=/duckduckgo.co.uk/127.0.0.1#5335\nipset=/duckduckgo.co.uk/gfwlist\nserver=/gettyimages.co.uk/127.0.0.1#5335\nipset=/gettyimages.co.uk/gfwlist\nserver=/h528.com/127.0.0.1#5335\nipset=/h528.com/gfwlist\nserver=/skebetter.com/127.0.0.1#5335\nipset=/skebetter.com/gfwlist\nserver=/beatsbydremall2013.com/127.0.0.1#5335\nipset=/beatsbydremall2013.com/gfwlist\nserver=/link69.com/127.0.0.1#5335\nipset=/link69.com/gfwlist\nserver=/freenetproject.org/127.0.0.1#5335\nipset=/freenetproject.org/gfwlist\nserver=/certsign.ro/127.0.0.1#5335\nipset=/certsign.ro/gfwlist\nserver=/asakonet.co.jp/127.0.0.1#5335\nipset=/asakonet.co.jp/gfwlist\nserver=/blogspot.jp/127.0.0.1#5335\nipset=/blogspot.jp/gfwlist\nserver=/desire-xx.supertop-100.com/127.0.0.1#5335\nipset=/desire-xx.supertop-100.com/gfwlist\nserver=/sshs.xyz/127.0.0.1#5335\nipset=/sshs.xyz/gfwlist\nserver=/porm.club/127.0.0.1#5335\nipset=/porm.club/gfwlist\nserver=/cheap-beatsbydre.com/127.0.0.1#5335\nipset=/cheap-beatsbydre.com/gfwlist\nserver=/2lib.org/127.0.0.1#5335\nipset=/2lib.org/gfwlist\nserver=/hu1u.com/127.0.0.1#5335\nipset=/hu1u.com/gfwlist\nserver=/taptotokyo.com/127.0.0.1#5335\nipset=/taptotokyo.com/gfwlist\nserver=/actalis.com/127.0.0.1#5335\nipset=/actalis.com/gfwlist\nserver=/bootysource.com/127.0.0.1#5335\nipset=/bootysource.com/gfwlist\nserver=/teen-sexy.com/127.0.0.1#5335\nipset=/teen-sexy.com/gfwlist\nserver=/dettol.be/127.0.0.1#5335\nipset=/dettol.be/gfwlist\nserver=/doujins.com/127.0.0.1#5335\nipset=/doujins.com/gfwlist\nserver=/midentsolutions.com/127.0.0.1#5335\nipset=/midentsolutions.com/gfwlist\nserver=/bmw.co.ke/127.0.0.1#5335\nipset=/bmw.co.ke/gfwlist\nserver=/xvideos-xxxx.com/127.0.0.1#5335\nipset=/xvideos-xxxx.com/gfwlist\nserver=/sharpdaily.tw/127.0.0.1#5335\nipset=/sharpdaily.tw/gfwlist\nserver=/thekarups.com/127.0.0.1#5335\nipset=/thekarups.com/gfwlist\nserver=/4gtv.tv/127.0.0.1#5335\nipset=/4gtv.tv/gfwlist\nserver=/amateurhousewifefuck.com/127.0.0.1#5335\nipset=/amateurhousewifefuck.com/gfwlist\nserver=/beatsbydrefr.com/127.0.0.1#5335\nipset=/beatsbydrefr.com/gfwlist\nserver=/8kpornvids.com/127.0.0.1#5335\nipset=/8kpornvids.com/gfwlist\nserver=/theebayshop.com/127.0.0.1#5335\nipset=/theebayshop.com/gfwlist\nserver=/visa.com.az/127.0.0.1#5335\nipset=/visa.com.az/gfwlist\nserver=/nanonamad.com/127.0.0.1#5335\nipset=/nanonamad.com/gfwlist\nserver=/onlineapplestore.com/127.0.0.1#5335\nipset=/onlineapplestore.com/gfwlist\nserver=/amateurswingersmovies.com/127.0.0.1#5335\nipset=/amateurswingersmovies.com/gfwlist\nserver=/paygonline.com/127.0.0.1#5335\nipset=/paygonline.com/gfwlist\nserver=/rbdigitallab.com/127.0.0.1#5335\nipset=/rbdigitallab.com/gfwlist\nserver=/yahoo.pl/127.0.0.1#5335\nipset=/yahoo.pl/gfwlist\nserver=/adidas.com.sa/127.0.0.1#5335\nipset=/adidas.com.sa/gfwlist\nserver=/oxfordfirstsource.com/127.0.0.1#5335\nipset=/oxfordfirstsource.com/gfwlist\nserver=/facebookconnect.com/127.0.0.1#5335\nipset=/facebookconnect.com/gfwlist\nserver=/thepornbest.com/127.0.0.1#5335\nipset=/thepornbest.com/gfwlist\nserver=/disneymagicmoments.de/127.0.0.1#5335\nipset=/disneymagicmoments.de/gfwlist\nserver=/bbycontent.com/127.0.0.1#5335\nipset=/bbycontent.com/gfwlist\nserver=/bethesdagamestudios.com/127.0.0.1#5335\nipset=/bethesdagamestudios.com/gfwlist\nserver=/uflash.tv/127.0.0.1#5335\nipset=/uflash.tv/gfwlist\nserver=/slack-msgs.com/127.0.0.1#5335\nipset=/slack-msgs.com/gfwlist\nserver=/youtube.sn/127.0.0.1#5335\nipset=/youtube.sn/gfwlist\nserver=/blink.org/127.0.0.1#5335\nipset=/blink.org/gfwlist\nserver=/googlestore.com/127.0.0.1#5335\nipset=/googlestore.com/gfwlist\nserver=/av69.us/127.0.0.1#5335\nipset=/av69.us/gfwlist\nserver=/trustdoc.ch/127.0.0.1#5335\nipset=/trustdoc.ch/gfwlist\nserver=/nvidia.ru/127.0.0.1#5335\nipset=/nvidia.ru/gfwlist\nserver=/likeseiyu.com/127.0.0.1#5335\nipset=/likeseiyu.com/gfwlist\nserver=/libgen.rs/127.0.0.1#5335\nipset=/libgen.rs/gfwlist\nserver=/peachy18.com/127.0.0.1#5335\nipset=/peachy18.com/gfwlist\nserver=/selfloversworld.com/127.0.0.1#5335\nipset=/selfloversworld.com/gfwlist\nserver=/videos4sale.com/127.0.0.1#5335\nipset=/videos4sale.com/gfwlist\nserver=/minioakville.com/127.0.0.1#5335\nipset=/minioakville.com/gfwlist\nserver=/bili888.com/127.0.0.1#5335\nipset=/bili888.com/gfwlist\nserver=/ieee-ecce.org/127.0.0.1#5335\nipset=/ieee-ecce.org/gfwlist\nserver=/dettol.co.nz/127.0.0.1#5335\nipset=/dettol.co.nz/gfwlist\nserver=/gitstar.net/127.0.0.1#5335\nipset=/gitstar.net/gfwlist\nserver=/eff.org/127.0.0.1#5335\nipset=/eff.org/gfwlist\nserver=/faceboom.com/127.0.0.1#5335\nipset=/faceboom.com/gfwlist\nserver=/cartoonregistry.com/127.0.0.1#5335\nipset=/cartoonregistry.com/gfwlist\nserver=/nintendo.ru/127.0.0.1#5335\nipset=/nintendo.ru/gfwlist\nserver=/makebettercode.com/127.0.0.1#5335\nipset=/makebettercode.com/gfwlist\nserver=/veet.se/127.0.0.1#5335\nipset=/veet.se/gfwlist\nserver=/fox6now.com/127.0.0.1#5335\nipset=/fox6now.com/gfwlist\nserver=/archivx.to/127.0.0.1#5335\nipset=/archivx.to/gfwlist\nserver=/thegayoffice.com/127.0.0.1#5335\nipset=/thegayoffice.com/gfwlist\nserver=/aaagradeheadphones.com/127.0.0.1#5335\nipset=/aaagradeheadphones.com/gfwlist\nserver=/discordmerch.com/127.0.0.1#5335\nipset=/discordmerch.com/gfwlist\nserver=/blogspot.kr/127.0.0.1#5335\nipset=/blogspot.kr/gfwlist\nserver=/truyenhentai.xyz/127.0.0.1#5335\nipset=/truyenhentai.xyz/gfwlist\nserver=/vk.cc/127.0.0.1#5335\nipset=/vk.cc/gfwlist\nserver=/dailyporn.club/127.0.0.1#5335\nipset=/dailyporn.club/gfwlist\nserver=/braeburncapital.com/127.0.0.1#5335\nipset=/braeburncapital.com/gfwlist\nserver=/fbrell.com/127.0.0.1#5335\nipset=/fbrell.com/gfwlist\nserver=/amateurpornsexvideos.com/127.0.0.1#5335\nipset=/amateurpornsexvideos.com/gfwlist\nserver=/blogspot.se/127.0.0.1#5335\nipset=/blogspot.se/gfwlist\nserver=/uun93.com/127.0.0.1#5335\nipset=/uun93.com/gfwlist\nserver=/zaobao.com/127.0.0.1#5335\nipset=/zaobao.com/gfwlist\nserver=/buyoculus.com/127.0.0.1#5335\nipset=/buyoculus.com/gfwlist\nserver=/bmwstep.com/127.0.0.1#5335\nipset=/bmwstep.com/gfwlist\nserver=/greatretroporn.com/127.0.0.1#5335\nipset=/greatretroporn.com/gfwlist\nserver=/bravotube.net/127.0.0.1#5335\nipset=/bravotube.net/gfwlist\nserver=/hanime.me/127.0.0.1#5335\nipset=/hanime.me/gfwlist\nserver=/jobmarket.com.hk/127.0.0.1#5335\nipset=/jobmarket.com.hk/gfwlist\nserver=/applefruity.com/127.0.0.1#5335\nipset=/applefruity.com/gfwlist\nserver=/visa.hu/127.0.0.1#5335\nipset=/visa.hu/gfwlist\nserver=/videoskaseros.com/127.0.0.1#5335\nipset=/videoskaseros.com/gfwlist\nserver=/paypalcommunity.net/127.0.0.1#5335\nipset=/paypalcommunity.net/gfwlist\nserver=/paypal-viewpoints.net/127.0.0.1#5335\nipset=/paypal-viewpoints.net/gfwlist\nserver=/newdrediscount.com/127.0.0.1#5335\nipset=/newdrediscount.com/gfwlist\nserver=/pchomeonline.com.tw/127.0.0.1#5335\nipset=/pchomeonline.com.tw/gfwlist\nserver=/gog.com/127.0.0.1#5335\nipset=/gog.com/gfwlist\nserver=/akamaietpmalwaretest.com/127.0.0.1#5335\nipset=/akamaietpmalwaretest.com/gfwlist\nserver=/volvotrucks.hu/127.0.0.1#5335\nipset=/volvotrucks.hu/gfwlist\nserver=/blogspot.cv/127.0.0.1#5335\nipset=/blogspot.cv/gfwlist\nserver=/festinhasbrasil.com/127.0.0.1#5335\nipset=/festinhasbrasil.com/gfwlist\nserver=/miniso.ua/127.0.0.1#5335\nipset=/miniso.ua/gfwlist\nserver=/adidas.co.uk/127.0.0.1#5335\nipset=/adidas.co.uk/gfwlist\nserver=/instangram.com/127.0.0.1#5335\nipset=/instangram.com/gfwlist\nserver=/bestpornsites.guide/127.0.0.1#5335\nipset=/bestpornsites.guide/gfwlist\nserver=/internet.org/127.0.0.1#5335\nipset=/internet.org/gfwlist\nserver=/besthandjobporn.com/127.0.0.1#5335\nipset=/besthandjobporn.com/gfwlist\nserver=/ikea.sa/127.0.0.1#5335\nipset=/ikea.sa/gfwlist\nserver=/housing.com/127.0.0.1#5335\nipset=/housing.com/gfwlist\nserver=/nudebeachpussy.com/127.0.0.1#5335\nipset=/nudebeachpussy.com/gfwlist\nserver=/intel.bh/127.0.0.1#5335\nipset=/intel.bh/gfwlist\nserver=/microsoft.cat/127.0.0.1#5335\nipset=/microsoft.cat/gfwlist\nserver=/pvue1.com/127.0.0.1#5335\nipset=/pvue1.com/gfwlist\nserver=/thomsonreuters.co.nz/127.0.0.1#5335\nipset=/thomsonreuters.co.nz/gfwlist\nserver=/ebay.in/127.0.0.1#5335\nipset=/ebay.in/gfwlist\nserver=/s8ds5gfm.xyz/127.0.0.1#5335\nipset=/s8ds5gfm.xyz/gfwlist\nserver=/minimontroyal.ca/127.0.0.1#5335\nipset=/minimontroyal.ca/gfwlist\nserver=/usvimosquitoproject.com/127.0.0.1#5335\nipset=/usvimosquitoproject.com/gfwlist\nserver=/bmw-connecteddrive.lv/127.0.0.1#5335\nipset=/bmw-connecteddrive.lv/gfwlist\nserver=/firestonedrivestore.com/127.0.0.1#5335\nipset=/firestonedrivestore.com/gfwlist\nserver=/miniso-np.com/127.0.0.1#5335\nipset=/miniso-np.com/gfwlist\nserver=/xxxv.mobi/127.0.0.1#5335\nipset=/xxxv.mobi/gfwlist\nserver=/enteentegeh.de/127.0.0.1#5335\nipset=/enteentegeh.de/gfwlist\nserver=/homefuckingmovies.com/127.0.0.1#5335\nipset=/homefuckingmovies.com/gfwlist\nserver=/casquebeatsenligne.com/127.0.0.1#5335\nipset=/casquebeatsenligne.com/gfwlist\nserver=/playcover.io/127.0.0.1#5335\nipset=/playcover.io/gfwlist\nserver=/battlebreakers.com/127.0.0.1#5335\nipset=/battlebreakers.com/gfwlist\nserver=/pornos.live/127.0.0.1#5335\nipset=/pornos.live/gfwlist\nserver=/vrsexgames.biz/127.0.0.1#5335\nipset=/vrsexgames.biz/gfwlist\nserver=/onenote.net/127.0.0.1#5335\nipset=/onenote.net/gfwlist\nserver=/oldhornymilfs.com/127.0.0.1#5335\nipset=/oldhornymilfs.com/gfwlist\nserver=/ok.xxx/127.0.0.1#5335\nipset=/ok.xxx/gfwlist\nserver=/paypal-login.us/127.0.0.1#5335\nipset=/paypal-login.us/gfwlist\nserver=/bing.com/127.0.0.1#5335\nipset=/bing.com/gfwlist\nserver=/desktopmovies.org/127.0.0.1#5335\nipset=/desktopmovies.org/gfwlist\nserver=/facebookcredits.info/127.0.0.1#5335\nipset=/facebookcredits.info/gfwlist\nserver=/nab.com.au/127.0.0.1#5335\nipset=/nab.com.au/gfwlist\nserver=/applestore.me/127.0.0.1#5335\nipset=/applestore.me/gfwlist\nserver=/gravatar.com/127.0.0.1#5335\nipset=/gravatar.com/gfwlist\nserver=/farfetch.com/127.0.0.1#5335\nipset=/farfetch.com/gfwlist\nserver=/giantessbooru.com/127.0.0.1#5335\nipset=/giantessbooru.com/gfwlist\nserver=/920share.com/127.0.0.1#5335\nipset=/920share.com/gfwlist\nserver=/intel.co.jp/127.0.0.1#5335\nipset=/intel.co.jp/gfwlist\nserver=/persianepochtimes.com/127.0.0.1#5335\nipset=/persianepochtimes.com/gfwlist\nserver=/ync.ne.jp/127.0.0.1#5335\nipset=/ync.ne.jp/gfwlist\nserver=/mybestbuyclaims.com/127.0.0.1#5335\nipset=/mybestbuyclaims.com/gfwlist\nserver=/gsrc.io/127.0.0.1#5335\nipset=/gsrc.io/gfwlist\nserver=/paypalnetwork.net/127.0.0.1#5335\nipset=/paypalnetwork.net/gfwlist\nserver=/intel.ng/127.0.0.1#5335\nipset=/intel.ng/gfwlist\nserver=/powerbi.com/127.0.0.1#5335\nipset=/powerbi.com/gfwlist\nserver=/httpfacebook.com/127.0.0.1#5335\nipset=/httpfacebook.com/gfwlist\nserver=/beatsbydresale-uk.com/127.0.0.1#5335\nipset=/beatsbydresale-uk.com/gfwlist\nserver=/lolita.bet/127.0.0.1#5335\nipset=/lolita.bet/gfwlist\nserver=/applfe.com/127.0.0.1#5335\nipset=/applfe.com/gfwlist\nserver=/bmw.com.kh/127.0.0.1#5335\nipset=/bmw.com.kh/gfwlist\nserver=/jsdelivr.net/127.0.0.1#5335\nipset=/jsdelivr.net/gfwlist\nserver=/pornmovies2.me/127.0.0.1#5335\nipset=/pornmovies2.me/gfwlist\nserver=/youtube.com.ve/127.0.0.1#5335\nipset=/youtube.com.ve/gfwlist\nserver=/a-teenz.com/127.0.0.1#5335\nipset=/a-teenz.com/gfwlist\nserver=/whatsapp-plus.me/127.0.0.1#5335\nipset=/whatsapp-plus.me/gfwlist\nserver=/nikeshoes-store.com/127.0.0.1#5335\nipset=/nikeshoes-store.com/gfwlist\nserver=/scat-japan.com/127.0.0.1#5335\nipset=/scat-japan.com/gfwlist\nserver=/nvidia.ro/127.0.0.1#5335\nipset=/nvidia.ro/gfwlist\nserver=/saffrontech.com/127.0.0.1#5335\nipset=/saffrontech.com/gfwlist\nserver=/appleworldwidedeveloper.sc.omtrdc.net/127.0.0.1#5335\nipset=/appleworldwidedeveloper.sc.omtrdc.net/gfwlist\nserver=/puretaboo.com/127.0.0.1#5335\nipset=/puretaboo.com/gfwlist\nserver=/bustyarianna.com/127.0.0.1#5335\nipset=/bustyarianna.com/gfwlist\nserver=/freindfeed.com/127.0.0.1#5335\nipset=/freindfeed.com/gfwlist\nserver=/avstar1.com/127.0.0.1#5335\nipset=/avstar1.com/gfwlist\nserver=/ieee-npss.org/127.0.0.1#5335\nipset=/ieee-npss.org/gfwlist\nserver=/intel.co.uk/127.0.0.1#5335\nipset=/intel.co.uk/gfwlist\nserver=/intel.ec/127.0.0.1#5335\nipset=/intel.ec/gfwlist\nserver=/pornocd.ru/127.0.0.1#5335\nipset=/pornocd.ru/gfwlist\nserver=/pokemonwifi.net/127.0.0.1#5335\nipset=/pokemonwifi.net/gfwlist\nserver=/blogspot.com.mt/127.0.0.1#5335\nipset=/blogspot.com.mt/gfwlist\nserver=/hentairules.net/127.0.0.1#5335\nipset=/hentairules.net/gfwlist\nserver=/duckduckgo.mx/127.0.0.1#5335\nipset=/duckduckgo.mx/gfwlist\nserver=/hp-printing.com/127.0.0.1#5335\nipset=/hp-printing.com/gfwlist\nserver=/da-files.com/127.0.0.1#5335\nipset=/da-files.com/gfwlist\nserver=/ieee-ras.org/127.0.0.1#5335\nipset=/ieee-ras.org/gfwlist\nserver=/canada-beatsbydre.com/127.0.0.1#5335\nipset=/canada-beatsbydre.com/gfwlist\nserver=/ftadviser.com/127.0.0.1#5335\nipset=/ftadviser.com/gfwlist\nserver=/mini.sk/127.0.0.1#5335\nipset=/mini.sk/gfwlist\nserver=/velocloud.com/127.0.0.1#5335\nipset=/velocloud.com/gfwlist\nserver=/donttrack.us/127.0.0.1#5335\nipset=/donttrack.us/gfwlist\nserver=/microsoftlatamaitour.com/127.0.0.1#5335\nipset=/microsoftlatamaitour.com/gfwlist\nserver=/bmwsfl.net/127.0.0.1#5335\nipset=/bmwsfl.net/gfwlist\nserver=/foxsports.com.ec/127.0.0.1#5335\nipset=/foxsports.com.ec/gfwlist\nserver=/officialheadphone.com/127.0.0.1#5335\nipset=/officialheadphone.com/gfwlist\nserver=/older.tube/127.0.0.1#5335\nipset=/older.tube/gfwlist\nserver=/52hyse.com/127.0.0.1#5335\nipset=/52hyse.com/gfwlist\nserver=/youtube.dk/127.0.0.1#5335\nipset=/youtube.dk/gfwlist\nserver=/azure-sphere.com/127.0.0.1#5335\nipset=/azure-sphere.com/gfwlist\nserver=/twca.com.tw/127.0.0.1#5335\nipset=/twca.com.tw/gfwlist\nserver=/hotporn.today/127.0.0.1#5335\nipset=/hotporn.today/gfwlist\nserver=/sony.com.co/127.0.0.1#5335\nipset=/sony.com.co/gfwlist\nserver=/signalusers.org/127.0.0.1#5335\nipset=/signalusers.org/gfwlist\nserver=/sankei.jp/127.0.0.1#5335\nipset=/sankei.jp/gfwlist\nserver=/foxdoua.com/127.0.0.1#5335\nipset=/foxdoua.com/gfwlist\nserver=/nicesshop.net/127.0.0.1#5335\nipset=/nicesshop.net/gfwlist\nserver=/businesscatalyst.com/127.0.0.1#5335\nipset=/businesscatalyst.com/gfwlist\nserver=/wmfusercontent.org/127.0.0.1#5335\nipset=/wmfusercontent.org/gfwlist\nserver=/on.cc/127.0.0.1#5335\nipset=/on.cc/gfwlist\nserver=/disneyjunior.com/127.0.0.1#5335\nipset=/disneyjunior.com/gfwlist\nserver=/nikeshoeswon.com/127.0.0.1#5335\nipset=/nikeshoeswon.com/gfwlist\nserver=/cuckoldinterracialwife.com/127.0.0.1#5335\nipset=/cuckoldinterracialwife.com/gfwlist\nserver=/zeebioskop.com/127.0.0.1#5335\nipset=/zeebioskop.com/gfwlist\nserver=/foxon.com/127.0.0.1#5335\nipset=/foxon.com/gfwlist\nserver=/interactivesex.xxx/127.0.0.1#5335\nipset=/interactivesex.xxx/gfwlist\nserver=/durex.com.pe/127.0.0.1#5335\nipset=/durex.com.pe/gfwlist\nserver=/manporn.xxx/127.0.0.1#5335\nipset=/manporn.xxx/gfwlist\nserver=/bustyinescudna.com/127.0.0.1#5335\nipset=/bustyinescudna.com/gfwlist\nserver=/youtubeeducation.com/127.0.0.1#5335\nipset=/youtubeeducation.com/gfwlist\nserver=/google.at/127.0.0.1#5335\nipset=/google.at/gfwlist\nserver=/windows8.hk/127.0.0.1#5335\nipset=/windows8.hk/gfwlist\nserver=/amsterdamluxescort.com/127.0.0.1#5335\nipset=/amsterdamluxescort.com/gfwlist\nserver=/youtubefanfest.com/127.0.0.1#5335\nipset=/youtubefanfest.com/gfwlist\nserver=/bloomberglabs.com/127.0.0.1#5335\nipset=/bloomberglabs.com/gfwlist\nserver=/visadigitalconcierge.com/127.0.0.1#5335\nipset=/visadigitalconcierge.com/gfwlist\nserver=/bestbuy-int.com/127.0.0.1#5335\nipset=/bestbuy-int.com/gfwlist\nserver=/pinterest.co.at/127.0.0.1#5335\nipset=/pinterest.co.at/gfwlist\nserver=/hpinkjet.com/127.0.0.1#5335\nipset=/hpinkjet.com/gfwlist\nserver=/xplr.co/127.0.0.1#5335\nipset=/xplr.co/gfwlist\nserver=/directvoffercodes.com/127.0.0.1#5335\nipset=/directvoffercodes.com/gfwlist\nserver=/quip-cdn.com/127.0.0.1#5335\nipset=/quip-cdn.com/gfwlist\nserver=/beth.games/127.0.0.1#5335\nipset=/beth.games/gfwlist\nserver=/xn--r8jwklh769hk43amcfoyl3z3a.com/127.0.0.1#5335\nipset=/xn--r8jwklh769hk43amcfoyl3z3a.com/gfwlist\nserver=/ipfs.eternum.io/127.0.0.1#5335\nipset=/ipfs.eternum.io/gfwlist\nserver=/pornhail.com/127.0.0.1#5335\nipset=/pornhail.com/gfwlist\nserver=/xbx.lv/127.0.0.1#5335\nipset=/xbx.lv/gfwlist\nserver=/faceobook.com/127.0.0.1#5335\nipset=/faceobook.com/gfwlist\nserver=/newsxtend.com.au/127.0.0.1#5335\nipset=/newsxtend.com.au/gfwlist\nserver=/brave.com/127.0.0.1#5335\nipset=/brave.com/gfwlist\nserver=/friendfeed-media.com/127.0.0.1#5335\nipset=/friendfeed-media.com/gfwlist\nserver=/ikea.fr/127.0.0.1#5335\nipset=/ikea.fr/gfwlist\nserver=/whichav.video/127.0.0.1#5335\nipset=/whichav.video/gfwlist\nserver=/beatssbyaustralia.com/127.0.0.1#5335\nipset=/beatssbyaustralia.com/gfwlist\nserver=/xnxx3.com/127.0.0.1#5335\nipset=/xnxx3.com/gfwlist\nserver=/qualcomm.de/127.0.0.1#5335\nipset=/qualcomm.de/gfwlist\nserver=/managed-pki.ch/127.0.0.1#5335\nipset=/managed-pki.ch/gfwlist\nserver=/newsfeed.com/127.0.0.1#5335\nipset=/newsfeed.com/gfwlist\nserver=/xxxpornozinho.blog.br/127.0.0.1#5335\nipset=/xxxpornozinho.blog.br/gfwlist\nserver=/freeadultgames.tv/127.0.0.1#5335\nipset=/freeadultgames.tv/gfwlist\nserver=/onbeatsbydresale.com/127.0.0.1#5335\nipset=/onbeatsbydresale.com/gfwlist\nserver=/nikkei4946.com/127.0.0.1#5335\nipset=/nikkei4946.com/gfwlist\nserver=/firestonecomercial.com.ar/127.0.0.1#5335\nipset=/firestonecomercial.com.ar/gfwlist\nserver=/telekom.com/127.0.0.1#5335\nipset=/telekom.com/gfwlist\nserver=/twitterflightschool.com/127.0.0.1#5335\nipset=/twitterflightschool.com/gfwlist\nserver=/certificat2.com/127.0.0.1#5335\nipset=/certificat2.com/gfwlist\nserver=/geilegratisporno.com/127.0.0.1#5335\nipset=/geilegratisporno.com/gfwlist\nserver=/amazon.de/127.0.0.1#5335\nipset=/amazon.de/gfwlist\nserver=/faceboak.com/127.0.0.1#5335\nipset=/faceboak.com/gfwlist\nserver=/limelight.com/127.0.0.1#5335\nipset=/limelight.com/gfwlist\nserver=/nikefirm.com/127.0.0.1#5335\nipset=/nikefirm.com/gfwlist\nserver=/airsextube.com/127.0.0.1#5335\nipset=/airsextube.com/gfwlist\nserver=/appspot.com/127.0.0.1#5335\nipset=/appspot.com/gfwlist\nserver=/pornxvideos.tv/127.0.0.1#5335\nipset=/pornxvideos.tv/gfwlist\nserver=/videos6.com/127.0.0.1#5335\nipset=/videos6.com/gfwlist\nserver=/748av.com/127.0.0.1#5335\nipset=/748av.com/gfwlist\nserver=/disney.sg/127.0.0.1#5335\nipset=/disney.sg/gfwlist\nserver=/intellinuxwireless.net/127.0.0.1#5335\nipset=/intellinuxwireless.net/gfwlist\nserver=/1drv.ms/127.0.0.1#5335\nipset=/1drv.ms/gfwlist\nserver=/h-top.supertop-100.com/127.0.0.1#5335\nipset=/h-top.supertop-100.com/gfwlist\nserver=/typography.com/127.0.0.1#5335\nipset=/typography.com/gfwlist\nserver=/peepholecam.com/127.0.0.1#5335\nipset=/peepholecam.com/gfwlist\nserver=/atandt.com/127.0.0.1#5335\nipset=/atandt.com/gfwlist\nserver=/ieee-isto.org/127.0.0.1#5335\nipset=/ieee-isto.org/gfwlist\nserver=/intellinuxgraphics.com/127.0.0.1#5335\nipset=/intellinuxgraphics.com/gfwlist\nserver=/ikea.com.tr/127.0.0.1#5335\nipset=/ikea.com.tr/gfwlist\nserver=/findsav.com/127.0.0.1#5335\nipset=/findsav.com/gfwlist\nserver=/alotporn.com/127.0.0.1#5335\nipset=/alotporn.com/gfwlist\nserver=/bmw-museum.net/127.0.0.1#5335\nipset=/bmw-museum.net/gfwlist\nserver=/alphera.es/127.0.0.1#5335\nipset=/alphera.es/gfwlist\nserver=/beatsbydrecybermondaydeals2013.net/127.0.0.1#5335\nipset=/beatsbydrecybermondaydeals2013.net/gfwlist\nserver=/bloombergtax.com/127.0.0.1#5335\nipset=/bloombergtax.com/gfwlist\nserver=/sexdollsshow.com/127.0.0.1#5335\nipset=/sexdollsshow.com/gfwlist\nserver=/jav4you.org/127.0.0.1#5335\nipset=/jav4you.org/gfwlist\nserver=/panoramio.com/127.0.0.1#5335\nipset=/panoramio.com/gfwlist\nserver=/fasttrackreadysupport.com/127.0.0.1#5335\nipset=/fasttrackreadysupport.com/gfwlist\nserver=/socrec.org/127.0.0.1#5335\nipset=/socrec.org/gfwlist\nserver=/bmwondemandusa.com/127.0.0.1#5335\nipset=/bmwondemandusa.com/gfwlist\nserver=/reconjet.com/127.0.0.1#5335\nipset=/reconjet.com/gfwlist\nserver=/mini-connected.no/127.0.0.1#5335\nipset=/mini-connected.no/gfwlist\nserver=/ebay.com.my/127.0.0.1#5335\nipset=/ebay.com.my/gfwlist\nserver=/drdrebeats-chen.com/127.0.0.1#5335\nipset=/drdrebeats-chen.com/gfwlist\nserver=/hot-sex-photos.com/127.0.0.1#5335\nipset=/hot-sex-photos.com/gfwlist\nserver=/yahoo.tg/127.0.0.1#5335\nipset=/yahoo.tg/gfwlist\nserver=/fine-art-nude.org/127.0.0.1#5335\nipset=/fine-art-nude.org/gfwlist\nserver=/gayroom.com/127.0.0.1#5335\nipset=/gayroom.com/gfwlist\nserver=/fuckingawesome.com/127.0.0.1#5335\nipset=/fuckingawesome.com/gfwlist\nserver=/darknaija.com/127.0.0.1#5335\nipset=/darknaija.com/gfwlist\nserver=/fappeningbook.com/127.0.0.1#5335\nipset=/fappeningbook.com/gfwlist\nserver=/gamboporn.com/127.0.0.1#5335\nipset=/gamboporn.com/gfwlist\nserver=/bmwwholesaleconnect.com/127.0.0.1#5335\nipset=/bmwwholesaleconnect.com/gfwlist\nserver=/nyaa.net/127.0.0.1#5335\nipset=/nyaa.net/gfwlist\nserver=/b3boos.com/127.0.0.1#5335\nipset=/b3boos.com/gfwlist\nserver=/xvidios.blog/127.0.0.1#5335\nipset=/xvidios.blog/gfwlist\nserver=/akamaized.net/127.0.0.1#5335\nipset=/akamaized.net/gfwlist\nserver=/spotifyforbrands.com/127.0.0.1#5335\nipset=/spotifyforbrands.com/gfwlist\nserver=/u9a9.com/127.0.0.1#5335\nipset=/u9a9.com/gfwlist\nserver=/elifesciences.org/127.0.0.1#5335\nipset=/elifesciences.org/gfwlist\nserver=/volvobuses.no/127.0.0.1#5335\nipset=/volvobuses.no/gfwlist\nserver=/nike-air-max.com/127.0.0.1#5335\nipset=/nike-air-max.com/gfwlist\nserver=/vod-abematv.akamaized.net/127.0.0.1#5335\nipset=/vod-abematv.akamaized.net/gfwlist\nserver=/evropaelire.org/127.0.0.1#5335\nipset=/evropaelire.org/gfwlist\nserver=/sinchew.com.my/127.0.0.1#5335\nipset=/sinchew.com.my/gfwlist\nserver=/ayudanintendo.com/127.0.0.1#5335\nipset=/ayudanintendo.com/gfwlist\nserver=/omoplanet.com/127.0.0.1#5335\nipset=/omoplanet.com/gfwlist\nserver=/sony.cl/127.0.0.1#5335\nipset=/sony.cl/gfwlist\nserver=/pikabu.monster/127.0.0.1#5335\nipset=/pikabu.monster/gfwlist\nserver=/nikkei.com/127.0.0.1#5335\nipset=/nikkei.com/gfwlist\nserver=/mature-amateur-sex.com/127.0.0.1#5335\nipset=/mature-amateur-sex.com/gfwlist\nserver=/mortein.com.pk/127.0.0.1#5335\nipset=/mortein.com.pk/gfwlist\nserver=/bmwasia.com/127.0.0.1#5335\nipset=/bmwasia.com/gfwlist\nserver=/appleaustralia.com/127.0.0.1#5335\nipset=/appleaustralia.com/gfwlist\nserver=/youngteenhomeporn.com/127.0.0.1#5335\nipset=/youngteenhomeporn.com/gfwlist\nserver=/bmw-connecteddrive.lu/127.0.0.1#5335\nipset=/bmw-connecteddrive.lu/gfwlist\nserver=/flirtmoms.com/127.0.0.1#5335\nipset=/flirtmoms.com/gfwlist\nserver=/my9nj.com/127.0.0.1#5335\nipset=/my9nj.com/gfwlist\nserver=/nikeliuxiang.com/127.0.0.1#5335\nipset=/nikeliuxiang.com/gfwlist\nserver=/mastercardadvisors.com/127.0.0.1#5335\nipset=/mastercardadvisors.com/gfwlist\nserver=/scholar.google.no/127.0.0.1#5335\nipset=/scholar.google.no/gfwlist\nserver=/r18av.com/127.0.0.1#5335\nipset=/r18av.com/gfwlist\nserver=/vanish.com.pe/127.0.0.1#5335\nipset=/vanish.com.pe/gfwlist\nserver=/orgasm.com/127.0.0.1#5335\nipset=/orgasm.com/gfwlist\nserver=/youtube.ba/127.0.0.1#5335\nipset=/youtube.ba/gfwlist\nserver=/elpube-scat-movies.blogspot.com/127.0.0.1#5335\nipset=/elpube-scat-movies.blogspot.com/gfwlist\nserver=/hulutv.com/127.0.0.1#5335\nipset=/hulutv.com/gfwlist\nserver=/gnom-cham.com/127.0.0.1#5335\nipset=/gnom-cham.com/gfwlist\nserver=/ibonedyourmom.com/127.0.0.1#5335\nipset=/ibonedyourmom.com/gfwlist\nserver=/pornocarioca.com/127.0.0.1#5335\nipset=/pornocarioca.com/gfwlist\nserver=/addthisedge.com/127.0.0.1#5335\nipset=/addthisedge.com/gfwlist\nserver=/pearsoned.co.nz/127.0.0.1#5335\nipset=/pearsoned.co.nz/gfwlist\nserver=/manga-mill.com/127.0.0.1#5335\nipset=/manga-mill.com/gfwlist\nserver=/nvidia.co.at/127.0.0.1#5335\nipset=/nvidia.co.at/gfwlist\nserver=/andysparis.com/127.0.0.1#5335\nipset=/andysparis.com/gfwlist\nserver=/alpherafs.my/127.0.0.1#5335\nipset=/alpherafs.my/gfwlist\nserver=/imac.co/127.0.0.1#5335\nipset=/imac.co/gfwlist\nserver=/icloud.si/127.0.0.1#5335\nipset=/icloud.si/gfwlist\nserver=/redd.it/127.0.0.1#5335\nipset=/redd.it/gfwlist\nserver=/litv.tv/127.0.0.1#5335\nipset=/litv.tv/gfwlist\nserver=/thesims.com/127.0.0.1#5335\nipset=/thesims.com/gfwlist\nserver=/apple.pt/127.0.0.1#5335\nipset=/apple.pt/gfwlist\nserver=/netarabic.com/127.0.0.1#5335\nipset=/netarabic.com/gfwlist\nserver=/rootsigning.com/127.0.0.1#5335\nipset=/rootsigning.com/gfwlist\nserver=/lovesexbody.com/127.0.0.1#5335\nipset=/lovesexbody.com/gfwlist\nserver=/airmay.com/127.0.0.1#5335\nipset=/airmay.com/gfwlist\nserver=/avstar8.com/127.0.0.1#5335\nipset=/avstar8.com/gfwlist\nserver=/firmaprofesional.com/127.0.0.1#5335\nipset=/firmaprofesional.com/gfwlist\nserver=/arxiv.org/127.0.0.1#5335\nipset=/arxiv.org/gfwlist\nserver=/arabianchicks.com/127.0.0.1#5335\nipset=/arabianchicks.com/gfwlist\nserver=/siege-amazon.com/127.0.0.1#5335\nipset=/siege-amazon.com/gfwlist\nserver=/nixos.org/127.0.0.1#5335\nipset=/nixos.org/gfwlist\nserver=/javhd3x.com/127.0.0.1#5335\nipset=/javhd3x.com/gfwlist\nserver=/pornotree.com/127.0.0.1#5335\nipset=/pornotree.com/gfwlist\nserver=/1xbet.co.ke/127.0.0.1#5335\nipset=/1xbet.co.ke/gfwlist\nserver=/bmw.co.za/127.0.0.1#5335\nipset=/bmw.co.za/gfwlist\nserver=/khayannpyar.blogspot.com/127.0.0.1#5335\nipset=/khayannpyar.blogspot.com/gfwlist\nserver=/ptt.cc/127.0.0.1#5335\nipset=/ptt.cc/gfwlist\nserver=/heroku.co/127.0.0.1#5335\nipset=/heroku.co/gfwlist\nserver=/da3dsoul.dev/127.0.0.1#5335\nipset=/da3dsoul.dev/gfwlist\nserver=/verisign.hk/127.0.0.1#5335\nipset=/verisign.hk/gfwlist\nserver=/fbidb.io/127.0.0.1#5335\nipset=/fbidb.io/gfwlist\nserver=/cartoonscity.com/127.0.0.1#5335\nipset=/cartoonscity.com/gfwlist\nserver=/vanish.se/127.0.0.1#5335\nipset=/vanish.se/gfwlist\nserver=/faronics.kayako.com/127.0.0.1#5335\nipset=/faronics.kayako.com/gfwlist\nserver=/xn--p8j9a0d9c9a.xn--q9jyb4c/127.0.0.1#5335\nipset=/xn--p8j9a0d9c9a.xn--q9jyb4c/gfwlist\nserver=/bestporntube.me/127.0.0.1#5335\nipset=/bestporntube.me/gfwlist\nserver=/javfull.net/127.0.0.1#5335\nipset=/javfull.net/gfwlist\nserver=/topcoder.com/127.0.0.1#5335\nipset=/topcoder.com/gfwlist\nserver=/miniusaservice.com/127.0.0.1#5335\nipset=/miniusaservice.com/gfwlist\nserver=/recoiljs.org/127.0.0.1#5335\nipset=/recoiljs.org/gfwlist\nserver=/meraki-go.com/127.0.0.1#5335\nipset=/meraki-go.com/gfwlist\nserver=/faceebok.com/127.0.0.1#5335\nipset=/faceebok.com/gfwlist\nserver=/steamstatic.com/127.0.0.1#5335\nipset=/steamstatic.com/gfwlist\nserver=/repsils.no/127.0.0.1#5335\nipset=/repsils.no/gfwlist\nserver=/yahoo.ch/127.0.0.1#5335\nipset=/yahoo.ch/gfwlist\nserver=/intel.se/127.0.0.1#5335\nipset=/intel.se/gfwlist\nserver=/foxsports.com.py/127.0.0.1#5335\nipset=/foxsports.com.py/gfwlist\nserver=/api.news/127.0.0.1#5335\nipset=/api.news/gfwlist\nserver=/mendeley.com/127.0.0.1#5335\nipset=/mendeley.com/gfwlist\nserver=/wixmp.com/127.0.0.1#5335\nipset=/wixmp.com/gfwlist\nserver=/ciscolivehls-i.akamaihd.net/127.0.0.1#5335\nipset=/ciscolivehls-i.akamaihd.net/gfwlist\nserver=/applf.com/127.0.0.1#5335\nipset=/applf.com/gfwlist\nserver=/futanarihq.com/127.0.0.1#5335\nipset=/futanarihq.com/gfwlist\nserver=/jmcomic.moe/127.0.0.1#5335\nipset=/jmcomic.moe/gfwlist\nserver=/ipleadership.org/127.0.0.1#5335\nipset=/ipleadership.org/gfwlist\nserver=/babepedia.com/127.0.0.1#5335\nipset=/babepedia.com/gfwlist\nserver=/slotbitches.com/127.0.0.1#5335\nipset=/slotbitches.com/gfwlist\nserver=/ikea.com.ro/127.0.0.1#5335\nipset=/ikea.com.ro/gfwlist\nserver=/112263.com/127.0.0.1#5335\nipset=/112263.com/gfwlist\nserver=/volvotruckcenter.be/127.0.0.1#5335\nipset=/volvotruckcenter.be/gfwlist\nserver=/ura-akiba.jp/127.0.0.1#5335\nipset=/ura-akiba.jp/gfwlist\nserver=/tfhub.dev/127.0.0.1#5335\nipset=/tfhub.dev/gfwlist\nserver=/bmw-welt.com/127.0.0.1#5335\nipset=/bmw-welt.com/gfwlist\nserver=/bmwpittsburgh.com/127.0.0.1#5335\nipset=/bmwpittsburgh.com/gfwlist\nserver=/jinmantiankong.com/127.0.0.1#5335\nipset=/jinmantiankong.com/gfwlist\nserver=/xxxsexzoo.com/127.0.0.1#5335\nipset=/xxxsexzoo.com/gfwlist\nserver=/venmo.s3.amazonaws.com/127.0.0.1#5335\nipset=/venmo.s3.amazonaws.com/gfwlist\nserver=/xnxxsexclips.com/127.0.0.1#5335\nipset=/xnxxsexclips.com/gfwlist\nserver=/dojindb.net/127.0.0.1#5335\nipset=/dojindb.net/gfwlist\nserver=/tbib.org/127.0.0.1#5335\nipset=/tbib.org/gfwlist\nserver=/mobile.de/127.0.0.1#5335\nipset=/mobile.de/gfwlist\nserver=/blogspot.ie/127.0.0.1#5335\nipset=/blogspot.ie/gfwlist\nserver=/freehdvideos.xxx/127.0.0.1#5335\nipset=/freehdvideos.xxx/gfwlist\nserver=/alphabet.co.za/127.0.0.1#5335\nipset=/alphabet.co.za/gfwlist\nserver=/xxxvideo.world/127.0.0.1#5335\nipset=/xxxvideo.world/gfwlist\nserver=/donkeykongcountryreturns.com/127.0.0.1#5335\nipset=/donkeykongcountryreturns.com/gfwlist\nserver=/2beatsdre.com/127.0.0.1#5335\nipset=/2beatsdre.com/gfwlist\nserver=/3d-comics.com/127.0.0.1#5335\nipset=/3d-comics.com/gfwlist\nserver=/camgirlvideos.org/127.0.0.1#5335\nipset=/camgirlvideos.org/gfwlist\nserver=/duckduckgo.dk/127.0.0.1#5335\nipset=/duckduckgo.dk/gfwlist\nserver=/onestore.ms/127.0.0.1#5335\nipset=/onestore.ms/gfwlist\nserver=/watchmyexgf.net/127.0.0.1#5335\nipset=/watchmyexgf.net/gfwlist\nserver=/heinonline.org/127.0.0.1#5335\nipset=/heinonline.org/gfwlist\nserver=/ddg.gg/127.0.0.1#5335\nipset=/ddg.gg/gfwlist\nserver=/macbook.tw/127.0.0.1#5335\nipset=/macbook.tw/gfwlist\nserver=/ixnxx.tv/127.0.0.1#5335\nipset=/ixnxx.tv/gfwlist\nserver=/what-fan.net/127.0.0.1#5335\nipset=/what-fan.net/gfwlist\nserver=/ebayjewelry.com/127.0.0.1#5335\nipset=/ebayjewelry.com/gfwlist\nserver=/onsaletrend.com/127.0.0.1#5335\nipset=/onsaletrend.com/gfwlist\nserver=/hmd.site/127.0.0.1#5335\nipset=/hmd.site/gfwlist\nserver=/dgwav.com/127.0.0.1#5335\nipset=/dgwav.com/gfwlist\nserver=/facebookland.com/127.0.0.1#5335\nipset=/facebookland.com/gfwlist\nserver=/db.tt/127.0.0.1#5335\nipset=/db.tt/gfwlist\nserver=/bmw-motorrad.pa/127.0.0.1#5335\nipset=/bmw-motorrad.pa/gfwlist\nserver=/getcomposer.org/127.0.0.1#5335\nipset=/getcomposer.org/gfwlist\nserver=/akamai-platform-internal.net/127.0.0.1#5335\nipset=/akamai-platform-internal.net/gfwlist\nserver=/sego8.xyz/127.0.0.1#5335\nipset=/sego8.xyz/gfwlist\nserver=/airwick.si/127.0.0.1#5335\nipset=/airwick.si/gfwlist\nserver=/bmwjamaica.com/127.0.0.1#5335\nipset=/bmwjamaica.com/gfwlist\nserver=/pornozona.tv/127.0.0.1#5335\nipset=/pornozona.tv/gfwlist\nserver=/comodo.net/127.0.0.1#5335\nipset=/comodo.net/gfwlist\nserver=/githubapp.com/127.0.0.1#5335\nipset=/githubapp.com/gfwlist\nserver=/usatodaynetworkservice.com/127.0.0.1#5335\nipset=/usatodaynetworkservice.com/gfwlist\nserver=/apple.co.th/127.0.0.1#5335\nipset=/apple.co.th/gfwlist\nserver=/javwide.tv/127.0.0.1#5335\nipset=/javwide.tv/gfwlist\nserver=/haitenjp.com/127.0.0.1#5335\nipset=/haitenjp.com/gfwlist\nserver=/visaluxuryhotelcollection.com.br/127.0.0.1#5335\nipset=/visaluxuryhotelcollection.com.br/gfwlist\nserver=/volvobuses.mx/127.0.0.1#5335\nipset=/volvobuses.mx/gfwlist\nserver=/topyoungporn.com/127.0.0.1#5335\nipset=/topyoungporn.com/gfwlist\nserver=/shopifystatus.com/127.0.0.1#5335\nipset=/shopifystatus.com/gfwlist\nserver=/danmarkbeatsbydrdre.com/127.0.0.1#5335\nipset=/danmarkbeatsbydrdre.com/gfwlist\nserver=/oxfordaasc.com/127.0.0.1#5335\nipset=/oxfordaasc.com/gfwlist\nserver=/thepornlinks.com/127.0.0.1#5335\nipset=/thepornlinks.com/gfwlist\nserver=/snapseed.com/127.0.0.1#5335\nipset=/snapseed.com/gfwlist\nserver=/tictoc.video/127.0.0.1#5335\nipset=/tictoc.video/gfwlist\nserver=/vmtestdrive.com/127.0.0.1#5335\nipset=/vmtestdrive.com/gfwlist\nserver=/volvotrucks.mn/127.0.0.1#5335\nipset=/volvotrucks.mn/gfwlist\nserver=/gogocdn.net/127.0.0.1#5335\nipset=/gogocdn.net/gfwlist\nserver=/comodoca.com/127.0.0.1#5335\nipset=/comodoca.com/gfwlist\nserver=/ipadpro.buzz/127.0.0.1#5335\nipset=/ipadpro.buzz/gfwlist\nserver=/hulu.com/127.0.0.1#5335\nipset=/hulu.com/gfwlist\nserver=/bmw-mountains.com/127.0.0.1#5335\nipset=/bmw-mountains.com/gfwlist\nserver=/google.com.sl/127.0.0.1#5335\nipset=/google.com.sl/gfwlist\nserver=/wwwfacebook.com/127.0.0.1#5335\nipset=/wwwfacebook.com/gfwlist\nserver=/adultgameson.com/127.0.0.1#5335\nipset=/adultgameson.com/gfwlist\nserver=/myfoxatlanta.com/127.0.0.1#5335\nipset=/myfoxatlanta.com/gfwlist\nserver=/beatspaschers.net/127.0.0.1#5335\nipset=/beatspaschers.net/gfwlist\nserver=/stackoverflow.email/127.0.0.1#5335\nipset=/stackoverflow.email/gfwlist\nserver=/lysol.net/127.0.0.1#5335\nipset=/lysol.net/gfwlist\nserver=/spankwire.com/127.0.0.1#5335\nipset=/spankwire.com/gfwlist\nserver=/nurofen.at/127.0.0.1#5335\nipset=/nurofen.at/gfwlist\nserver=/facebooik.com/127.0.0.1#5335\nipset=/facebooik.com/gfwlist\nserver=/spankmonster.com/127.0.0.1#5335\nipset=/spankmonster.com/gfwlist\nserver=/miniso.co/127.0.0.1#5335\nipset=/miniso.co/gfwlist\nserver=/businessinsider.co.za/127.0.0.1#5335\nipset=/businessinsider.co.za/gfwlist\nserver=/brazzers-porno.online/127.0.0.1#5335\nipset=/brazzers-porno.online/gfwlist\nserver=/sportstream.com/127.0.0.1#5335\nipset=/sportstream.com/gfwlist\nserver=/yourdailypornvideos.ws/127.0.0.1#5335\nipset=/yourdailypornvideos.ws/gfwlist\nserver=/facebook-hardware.com/127.0.0.1#5335\nipset=/facebook-hardware.com/gfwlist\nserver=/sexandsplash.com/127.0.0.1#5335\nipset=/sexandsplash.com/gfwlist\nserver=/realcleareducation.com/127.0.0.1#5335\nipset=/realcleareducation.com/gfwlist\nserver=/shopee.co.id/127.0.0.1#5335\nipset=/shopee.co.id/gfwlist\nserver=/fishmpegs.com/127.0.0.1#5335\nipset=/fishmpegs.com/gfwlist\nserver=/submityourflicks.com/127.0.0.1#5335\nipset=/submityourflicks.com/gfwlist\nserver=/ieee-edusociety.org/127.0.0.1#5335\nipset=/ieee-edusociety.org/gfwlist\nserver=/bloomberg.cn/127.0.0.1#5335\nipset=/bloomberg.cn/gfwlist\nserver=/redtube.com/127.0.0.1#5335\nipset=/redtube.com/gfwlist\nserver=/clearlinux.org/127.0.0.1#5335\nipset=/clearlinux.org/gfwlist\nserver=/tweetdeck.com/127.0.0.1#5335\nipset=/tweetdeck.com/gfwlist\nserver=/connectcommerce.tv/127.0.0.1#5335\nipset=/connectcommerce.tv/gfwlist\nserver=/aboutamazon.eu/127.0.0.1#5335\nipset=/aboutamazon.eu/gfwlist\nserver=/picacn.xyz/127.0.0.1#5335\nipset=/picacn.xyz/gfwlist\nserver=/yibaochina.com/127.0.0.1#5335\nipset=/yibaochina.com/gfwlist\nserver=/hentaidude.com/127.0.0.1#5335\nipset=/hentaidude.com/gfwlist\nserver=/gostorego.com/127.0.0.1#5335\nipset=/gostorego.com/gfwlist\nserver=/intel.com.pe/127.0.0.1#5335\nipset=/intel.com.pe/gfwlist\nserver=/waskucity.com/127.0.0.1#5335\nipset=/waskucity.com/gfwlist\nserver=/apple-expo.eu/127.0.0.1#5335\nipset=/apple-expo.eu/gfwlist\nserver=/4chan.org/127.0.0.1#5335\nipset=/4chan.org/gfwlist\nserver=/discoveryplus.com/127.0.0.1#5335\nipset=/discoveryplus.com/gfwlist\nserver=/paypal-sptam.com/127.0.0.1#5335\nipset=/paypal-sptam.com/gfwlist\nserver=/feacbook.com/127.0.0.1#5335\nipset=/feacbook.com/gfwlist\nserver=/amp.dev/127.0.0.1#5335\nipset=/amp.dev/gfwlist\nserver=/xxxifuck.com/127.0.0.1#5335\nipset=/xxxifuck.com/gfwlist\nserver=/nikepress.com/127.0.0.1#5335\nipset=/nikepress.com/gfwlist\nserver=/nintendo3ds.com/127.0.0.1#5335\nipset=/nintendo3ds.com/gfwlist\nserver=/hentaixxxvids.com/127.0.0.1#5335\nipset=/hentaixxxvids.com/gfwlist\nserver=/spreadprivacy.com/127.0.0.1#5335\nipset=/spreadprivacy.com/gfwlist\nserver=/shadbase.com/127.0.0.1#5335\nipset=/shadbase.com/gfwlist\nserver=/zishy.com/127.0.0.1#5335\nipset=/zishy.com/gfwlist\nserver=/dailytelegraph.com.au/127.0.0.1#5335\nipset=/dailytelegraph.com.au/gfwlist\nserver=/insider.com/127.0.0.1#5335\nipset=/insider.com/gfwlist\nserver=/hqtrannytube.com/127.0.0.1#5335\nipset=/hqtrannytube.com/gfwlist\nserver=/41maonn.com/127.0.0.1#5335\nipset=/41maonn.com/gfwlist\nserver=/furaffinity.net/127.0.0.1#5335\nipset=/furaffinity.net/gfwlist\nserver=/hentai.game/127.0.0.1#5335\nipset=/hentai.game/gfwlist\nserver=/bmw-connected-drive.com/127.0.0.1#5335\nipset=/bmw-connected-drive.com/gfwlist\nserver=/kamisama-maeda-lab.com/127.0.0.1#5335\nipset=/kamisama-maeda-lab.com/gfwlist\nserver=/yahoo.bt/127.0.0.1#5335\nipset=/yahoo.bt/gfwlist\nserver=/microsoft.vn/127.0.0.1#5335\nipset=/microsoft.vn/gfwlist\nserver=/mojang.com/127.0.0.1#5335\nipset=/mojang.com/gfwlist\nserver=/naughtytugs.com/127.0.0.1#5335\nipset=/naughtytugs.com/gfwlist\nserver=/perverttube.com/127.0.0.1#5335\nipset=/perverttube.com/gfwlist\nserver=/pearsonclinical.no/127.0.0.1#5335\nipset=/pearsonclinical.no/gfwlist\nserver=/instagda.com/127.0.0.1#5335\nipset=/instagda.com/gfwlist\nserver=/thestandard.com.hk/127.0.0.1#5335\nipset=/thestandard.com.hk/gfwlist\nserver=/twittercommunity.com/127.0.0.1#5335\nipset=/twittercommunity.com/gfwlist\nserver=/youtube.md/127.0.0.1#5335\nipset=/youtube.md/gfwlist\nserver=/whychooseview.com/127.0.0.1#5335\nipset=/whychooseview.com/gfwlist\nserver=/amazon-adsystem.com/127.0.0.1#5335\nipset=/amazon-adsystem.com/gfwlist\nserver=/penisbot.com/127.0.0.1#5335\nipset=/penisbot.com/gfwlist\nserver=/uverse.com/127.0.0.1#5335\nipset=/uverse.com/gfwlist\nserver=/nataliefiore.com/127.0.0.1#5335\nipset=/nataliefiore.com/gfwlist\nserver=/bmw.com.bd/127.0.0.1#5335\nipset=/bmw.com.bd/gfwlist\nserver=/shemalebestlabel.com/127.0.0.1#5335\nipset=/shemalebestlabel.com/gfwlist\nserver=/microsoftstore.com.hk/127.0.0.1#5335\nipset=/microsoftstore.com.hk/gfwlist\nserver=/imoviestage.com/127.0.0.1#5335\nipset=/imoviestage.com/gfwlist\nserver=/oraclefoundation.org/127.0.0.1#5335\nipset=/oraclefoundation.org/gfwlist\nserver=/amateurgalore.net/127.0.0.1#5335\nipset=/amateurgalore.net/gfwlist\nserver=/epochtimes.com.sg/127.0.0.1#5335\nipset=/epochtimes.com.sg/gfwlist\nserver=/minivictoria.com/127.0.0.1#5335\nipset=/minivictoria.com/gfwlist\nserver=/shopifycloud.com/127.0.0.1#5335\nipset=/shopifycloud.com/gfwlist\nserver=/icloud.ro/127.0.0.1#5335\nipset=/icloud.ro/gfwlist\nserver=/attcenter.com/127.0.0.1#5335\nipset=/attcenter.com/gfwlist\nserver=/canon-cmos-sensors.com/127.0.0.1#5335\nipset=/canon-cmos-sensors.com/gfwlist\nserver=/xvideosbrasileiro.net/127.0.0.1#5335\nipset=/xvideosbrasileiro.net/gfwlist\nserver=/ebaytrading.com/127.0.0.1#5335\nipset=/ebaytrading.com/gfwlist\nserver=/pornolaba.mobi/127.0.0.1#5335\nipset=/pornolaba.mobi/gfwlist\nserver=/calgon.fr/127.0.0.1#5335\nipset=/calgon.fr/gfwlist\nserver=/visa.fi/127.0.0.1#5335\nipset=/visa.fi/gfwlist\nserver=/kscisco.com/127.0.0.1#5335\nipset=/kscisco.com/gfwlist\nserver=/akamaientrypoint.net/127.0.0.1#5335\nipset=/akamaientrypoint.net/gfwlist\nserver=/bidorbuyindia.com/127.0.0.1#5335\nipset=/bidorbuyindia.com/gfwlist\nserver=/vanishstains.com/127.0.0.1#5335\nipset=/vanishstains.com/gfwlist\nserver=/sportswomenoftheyear.co.uk/127.0.0.1#5335\nipset=/sportswomenoftheyear.co.uk/gfwlist\nserver=/dyncdn.me/127.0.0.1#5335\nipset=/dyncdn.me/gfwlist\nserver=/holdemstripem.com/127.0.0.1#5335\nipset=/holdemstripem.com/gfwlist\nserver=/material.io/127.0.0.1#5335\nipset=/material.io/gfwlist\nserver=/vagina.nl/127.0.0.1#5335\nipset=/vagina.nl/gfwlist\nserver=/camwhoria.com/127.0.0.1#5335\nipset=/camwhoria.com/gfwlist\nserver=/eachpay.com/127.0.0.1#5335\nipset=/eachpay.com/gfwlist\nserver=/cloudflarestatus.com/127.0.0.1#5335\nipset=/cloudflarestatus.com/gfwlist\nserver=/jizzbunker.com/127.0.0.1#5335\nipset=/jizzbunker.com/gfwlist\nserver=/superstation.com.tw/127.0.0.1#5335\nipset=/superstation.com.tw/gfwlist\nserver=/newmonsterbeatsheadphones.com/127.0.0.1#5335\nipset=/newmonsterbeatsheadphones.com/gfwlist\nserver=/acgwr.com/127.0.0.1#5335\nipset=/acgwr.com/gfwlist\nserver=/intel.gl/127.0.0.1#5335\nipset=/intel.gl/gfwlist\nserver=/canon.ch/127.0.0.1#5335\nipset=/canon.ch/gfwlist\nserver=/piapp.com.tw/127.0.0.1#5335\nipset=/piapp.com.tw/gfwlist\nserver=/redporn.xxx/127.0.0.1#5335\nipset=/redporn.xxx/gfwlist\nserver=/sex-for-work.com/127.0.0.1#5335\nipset=/sex-for-work.com/gfwlist\nserver=/mastercardconnect.com/127.0.0.1#5335\nipset=/mastercardconnect.com/gfwlist\nserver=/getporn.tv/127.0.0.1#5335\nipset=/getporn.tv/gfwlist\nserver=/scholar.google.com.ec/127.0.0.1#5335\nipset=/scholar.google.com.ec/gfwlist\nserver=/gotblop.com/127.0.0.1#5335\nipset=/gotblop.com/gfwlist\nserver=/freesexyindians.org/127.0.0.1#5335\nipset=/freesexyindians.org/gfwlist\nserver=/playboy.com/127.0.0.1#5335\nipset=/playboy.com/gfwlist\nserver=/nimg.jp/127.0.0.1#5335\nipset=/nimg.jp/gfwlist\nserver=/thieme-connect.com/127.0.0.1#5335\nipset=/thieme-connect.com/gfwlist\nserver=/nvidia.com.ua/127.0.0.1#5335\nipset=/nvidia.com.ua/gfwlist\nserver=/apple.se/127.0.0.1#5335\nipset=/apple.se/gfwlist\nserver=/nikeshoesretro.com/127.0.0.1#5335\nipset=/nikeshoesretro.com/gfwlist\nserver=/osiri-suki-club.com/127.0.0.1#5335\nipset=/osiri-suki-club.com/gfwlist\nserver=/nikeresponsibility.com/127.0.0.1#5335\nipset=/nikeresponsibility.com/gfwlist\nserver=/bmw-motorrad.com.hr/127.0.0.1#5335\nipset=/bmw-motorrad.com.hr/gfwlist\nserver=/pearsonassessment.de/127.0.0.1#5335\nipset=/pearsonassessment.de/gfwlist\nserver=/mysinchew.com/127.0.0.1#5335\nipset=/mysinchew.com/gfwlist\nserver=/kindle4rss.com/127.0.0.1#5335\nipset=/kindle4rss.com/gfwlist\nserver=/yourbrain.com/127.0.0.1#5335\nipset=/yourbrain.com/gfwlist\nserver=/cloudfunctions.net/127.0.0.1#5335\nipset=/cloudfunctions.net/gfwlist\nserver=/veet.com.my/127.0.0.1#5335\nipset=/veet.com.my/gfwlist\nserver=/appleimac.com/127.0.0.1#5335\nipset=/appleimac.com/gfwlist\nserver=/cgkate.jinvod.com/127.0.0.1#5335\nipset=/cgkate.jinvod.com/gfwlist\nserver=/nikeairmaxshoes.com/127.0.0.1#5335\nipset=/nikeairmaxshoes.com/gfwlist\nserver=/opentgc.com/127.0.0.1#5335\nipset=/opentgc.com/gfwlist\nserver=/slackhq.com/127.0.0.1#5335\nipset=/slackhq.com/gfwlist\nserver=/wowstars.com/127.0.0.1#5335\nipset=/wowstars.com/gfwlist\nserver=/steamunlocked.net/127.0.0.1#5335\nipset=/steamunlocked.net/gfwlist\nserver=/beatsone.net/127.0.0.1#5335\nipset=/beatsone.net/gfwlist\nserver=/sexy-older-women.com/127.0.0.1#5335\nipset=/sexy-older-women.com/gfwlist\nserver=/joiasmr.com/127.0.0.1#5335\nipset=/joiasmr.com/gfwlist\nserver=/dailymail.com/127.0.0.1#5335\nipset=/dailymail.com/gfwlist\nserver=/bmw-connecteddrive.ee/127.0.0.1#5335\nipset=/bmw-connecteddrive.ee/gfwlist\nserver=/widgets.stripst.com/127.0.0.1#5335\nipset=/widgets.stripst.com/gfwlist\nserver=/breakdown.me/127.0.0.1#5335\nipset=/breakdown.me/gfwlist\nserver=/stimorolsex.com/127.0.0.1#5335\nipset=/stimorolsex.com/gfwlist\nserver=/xxxvirtualworld.com/127.0.0.1#5335\nipset=/xxxvirtualworld.com/gfwlist\nserver=/whyfacebook.com/127.0.0.1#5335\nipset=/whyfacebook.com/gfwlist\nserver=/facebookphonenumber.net/127.0.0.1#5335\nipset=/facebookphonenumber.net/gfwlist\nserver=/canon.lt/127.0.0.1#5335\nipset=/canon.lt/gfwlist\nserver=/drebeats-australia.com/127.0.0.1#5335\nipset=/drebeats-australia.com/gfwlist\nserver=/hpmini.com/127.0.0.1#5335\nipset=/hpmini.com/gfwlist\nserver=/besttube4you.com/127.0.0.1#5335\nipset=/besttube4you.com/gfwlist\nserver=/supercoach.com.au/127.0.0.1#5335\nipset=/supercoach.com.au/gfwlist\nserver=/mastercard.com.tw/127.0.0.1#5335\nipset=/mastercard.com.tw/gfwlist\nserver=/netflixdnstest3.com/127.0.0.1#5335\nipset=/netflixdnstest3.com/gfwlist\nserver=/funnyfacebook.org/127.0.0.1#5335\nipset=/funnyfacebook.org/gfwlist\nserver=/bitbucket.io/127.0.0.1#5335\nipset=/bitbucket.io/gfwlist\nserver=/ebay68.com/127.0.0.1#5335\nipset=/ebay68.com/gfwlist\nserver=/blogspot.co.il/127.0.0.1#5335\nipset=/blogspot.co.il/gfwlist\nserver=/scorevideos.com/127.0.0.1#5335\nipset=/scorevideos.com/gfwlist\nserver=/3dsexy.net/127.0.0.1#5335\nipset=/3dsexy.net/gfwlist\nserver=/softbank.jp/127.0.0.1#5335\nipset=/softbank.jp/gfwlist\nserver=/adultbay.org/127.0.0.1#5335\nipset=/adultbay.org/gfwlist\nserver=/google.ws/127.0.0.1#5335\nipset=/google.ws/gfwlist\nserver=/xxbay.com/127.0.0.1#5335\nipset=/xxbay.com/gfwlist\nserver=/meetsmartbook.com/127.0.0.1#5335\nipset=/meetsmartbook.com/gfwlist\nserver=/vhxqa3.com/127.0.0.1#5335\nipset=/vhxqa3.com/gfwlist\nserver=/gateway.dev/127.0.0.1#5335\nipset=/gateway.dev/gfwlist\nserver=/foxsports2.com/127.0.0.1#5335\nipset=/foxsports2.com/gfwlist\nserver=/recode.net/127.0.0.1#5335\nipset=/recode.net/gfwlist\nserver=/dexterhorn.com/127.0.0.1#5335\nipset=/dexterhorn.com/gfwlist\nserver=/nfsworld.com/127.0.0.1#5335\nipset=/nfsworld.com/gfwlist\nserver=/volvotrucks.ru/127.0.0.1#5335\nipset=/volvotrucks.ru/gfwlist\nserver=/ecchinohentai.ru/127.0.0.1#5335\nipset=/ecchinohentai.ru/gfwlist\nserver=/lldns.net/127.0.0.1#5335\nipset=/lldns.net/gfwlist\nserver=/cosplay-jav.com/127.0.0.1#5335\nipset=/cosplay-jav.com/gfwlist\nserver=/sublimedirectory.com/127.0.0.1#5335\nipset=/sublimedirectory.com/gfwlist\nserver=/starbucks.com.kz/127.0.0.1#5335\nipset=/starbucks.com.kz/gfwlist\nserver=/mastercard.bg/127.0.0.1#5335\nipset=/mastercard.bg/gfwlist\nserver=/dubai-escort-list.com/127.0.0.1#5335\nipset=/dubai-escort-list.com/gfwlist\nserver=/thenewporn.com/127.0.0.1#5335\nipset=/thenewporn.com/gfwlist\nserver=/windowscommunity.net/127.0.0.1#5335\nipset=/windowscommunity.net/gfwlist\nserver=/logitechg.com.cn/127.0.0.1#5335\nipset=/logitechg.com.cn/gfwlist\nserver=/woflthenewsstation.com/127.0.0.1#5335\nipset=/woflthenewsstation.com/gfwlist\nserver=/beatsbysdrdres.com/127.0.0.1#5335\nipset=/beatsbysdrdres.com/gfwlist\nserver=/epochtimes.co.kr/127.0.0.1#5335\nipset=/epochtimes.co.kr/gfwlist\nserver=/bmw.ly/127.0.0.1#5335\nipset=/bmw.ly/gfwlist\nserver=/vintageamateurporn.com/127.0.0.1#5335\nipset=/vintageamateurporn.com/gfwlist\nserver=/jsdelivr.com/127.0.0.1#5335\nipset=/jsdelivr.com/gfwlist\nserver=/sexvr.com/127.0.0.1#5335\nipset=/sexvr.com/gfwlist\nserver=/bmwproductnews.com/127.0.0.1#5335\nipset=/bmwproductnews.com/gfwlist\nserver=/spotify.com/127.0.0.1#5335\nipset=/spotify.com/gfwlist\nserver=/blogspot.pe/127.0.0.1#5335\nipset=/blogspot.pe/gfwlist\nserver=/vod360.net/127.0.0.1#5335\nipset=/vod360.net/gfwlist\nserver=/cisco.com/127.0.0.1#5335\nipset=/cisco.com/gfwlist\nserver=/myfreecams.com/127.0.0.1#5335\nipset=/myfreecams.com/gfwlist\nserver=/linuxfromscratch.org/127.0.0.1#5335\nipset=/linuxfromscratch.org/gfwlist\nserver=/bmw-connecteddrive.com.kw/127.0.0.1#5335\nipset=/bmw-connecteddrive.com.kw/gfwlist\nserver=/dettol.hu/127.0.0.1#5335\nipset=/dettol.hu/gfwlist\nserver=/buypass.no/127.0.0.1#5335\nipset=/buypass.no/gfwlist\nserver=/4greedy.com/127.0.0.1#5335\nipset=/4greedy.com/gfwlist\nserver=/device-manager.us/127.0.0.1#5335\nipset=/device-manager.us/gfwlist\nserver=/abema.tv/127.0.0.1#5335\nipset=/abema.tv/gfwlist\nserver=/biggggg.com/127.0.0.1#5335\nipset=/biggggg.com/gfwlist\nserver=/poopee-puke.com/127.0.0.1#5335\nipset=/poopee-puke.com/gfwlist\nserver=/hackfacebookid.com/127.0.0.1#5335\nipset=/hackfacebookid.com/gfwlist\nserver=/sony.com.hn/127.0.0.1#5335\nipset=/sony.com.hn/gfwlist\nserver=/amateurwivesvideos.com/127.0.0.1#5335\nipset=/amateurwivesvideos.com/gfwlist\nserver=/cios.org/127.0.0.1#5335\nipset=/cios.org/gfwlist\nserver=/inlethd.com/127.0.0.1#5335\nipset=/inlethd.com/gfwlist\nserver=/ytimg.com/127.0.0.1#5335\nipset=/ytimg.com/gfwlist\nserver=/zohopublic.com/127.0.0.1#5335\nipset=/zohopublic.com/gfwlist\nserver=/transarmuito.com/127.0.0.1#5335\nipset=/transarmuito.com/gfwlist\nserver=/javmost.xyz/127.0.0.1#5335\nipset=/javmost.xyz/gfwlist\nserver=/pornimg.xyz/127.0.0.1#5335\nipset=/pornimg.xyz/gfwlist\nserver=/bandag.com/127.0.0.1#5335\nipset=/bandag.com/gfwlist\nserver=/rbsgr.com/127.0.0.1#5335\nipset=/rbsgr.com/gfwlist\nserver=/nailedhard.com/127.0.0.1#5335\nipset=/nailedhard.com/gfwlist\nserver=/itcanwait.com/127.0.0.1#5335\nipset=/itcanwait.com/gfwlist\nserver=/bmw.com.mx/127.0.0.1#5335\nipset=/bmw.com.mx/gfwlist\nserver=/bridgestonewx.com/127.0.0.1#5335\nipset=/bridgestonewx.com/gfwlist\nserver=/questvisual.com/127.0.0.1#5335\nipset=/questvisual.com/gfwlist\nserver=/avmoo.com/127.0.0.1#5335\nipset=/avmoo.com/gfwlist\nserver=/thevirtualsexreview.com/127.0.0.1#5335\nipset=/thevirtualsexreview.com/gfwlist\nserver=/paypal-gpplus.com/127.0.0.1#5335\nipset=/paypal-gpplus.com/gfwlist\nserver=/bitflyer.jp/127.0.0.1#5335\nipset=/bitflyer.jp/gfwlist\nserver=/pinterest.se/127.0.0.1#5335\nipset=/pinterest.se/gfwlist\nserver=/technics.com/127.0.0.1#5335\nipset=/technics.com/gfwlist\nserver=/azuredns-prd.org/127.0.0.1#5335\nipset=/azuredns-prd.org/gfwlist\nserver=/spicybigtits.com/127.0.0.1#5335\nipset=/spicybigtits.com/gfwlist\nserver=/wix-code.com/127.0.0.1#5335\nipset=/wix-code.com/gfwlist\nserver=/nikedunks.net/127.0.0.1#5335\nipset=/nikedunks.net/gfwlist\nserver=/netflixinvestor.com/127.0.0.1#5335\nipset=/netflixinvestor.com/gfwlist\nserver=/hentainhaven.com/127.0.0.1#5335\nipset=/hentainhaven.com/gfwlist\nserver=/scatolo-guromania.com/127.0.0.1#5335\nipset=/scatolo-guromania.com/gfwlist\nserver=/tvb.com.au/127.0.0.1#5335\nipset=/tvb.com.au/gfwlist\nserver=/harpercollins.co.in/127.0.0.1#5335\nipset=/harpercollins.co.in/gfwlist\nserver=/adwords-community.com/127.0.0.1#5335\nipset=/adwords-community.com/gfwlist\nserver=/redtubepremium.com/127.0.0.1#5335\nipset=/redtubepremium.com/gfwlist\nserver=/fuckcuck.com/127.0.0.1#5335\nipset=/fuckcuck.com/gfwlist\nserver=/scholar.google.com.br/127.0.0.1#5335\nipset=/scholar.google.com.br/gfwlist\nserver=/nicovideo.jp/127.0.0.1#5335\nipset=/nicovideo.jp/gfwlist\nserver=/facebooki.com/127.0.0.1#5335\nipset=/facebooki.com/gfwlist\nserver=/ikea.eg/127.0.0.1#5335\nipset=/ikea.eg/gfwlist\nserver=/scoretv.tv/127.0.0.1#5335\nipset=/scoretv.tv/gfwlist\nserver=/bmw-connecteddrive.ca/127.0.0.1#5335\nipset=/bmw-connecteddrive.ca/gfwlist\nserver=/bmw-motorrad.com.au/127.0.0.1#5335\nipset=/bmw-motorrad.com.au/gfwlist\nserver=/kinkyfamily.com/127.0.0.1#5335\nipset=/kinkyfamily.com/gfwlist\nserver=/crazylivecams.com/127.0.0.1#5335\nipset=/crazylivecams.com/gfwlist\nserver=/streamingdisney.net/127.0.0.1#5335\nipset=/streamingdisney.net/gfwlist\nserver=/hentaiprno.com/127.0.0.1#5335\nipset=/hentaiprno.com/gfwlist\nserver=/nextdigital.com.tw/127.0.0.1#5335\nipset=/nextdigital.com.tw/gfwlist\nserver=/fuckingfreemovies.com/127.0.0.1#5335\nipset=/fuckingfreemovies.com/gfwlist\nserver=/uber-assets.com/127.0.0.1#5335\nipset=/uber-assets.com/gfwlist\nserver=/adultdeepfakes.com/127.0.0.1#5335\nipset=/adultdeepfakes.com/gfwlist\nserver=/mingkyaa.com/127.0.0.1#5335\nipset=/mingkyaa.com/gfwlist\nserver=/dropboxmail.com/127.0.0.1#5335\nipset=/dropboxmail.com/gfwlist\nserver=/topface.com/127.0.0.1#5335\nipset=/topface.com/gfwlist\nserver=/ftchinese.com/127.0.0.1#5335\nipset=/ftchinese.com/gfwlist\nserver=/intel.bs/127.0.0.1#5335\nipset=/intel.bs/gfwlist\nserver=/cosmosdb.info/127.0.0.1#5335\nipset=/cosmosdb.info/gfwlist\nserver=/inteliotmarketplace.com/127.0.0.1#5335\nipset=/inteliotmarketplace.com/gfwlist\nserver=/xxxhub123.com/127.0.0.1#5335\nipset=/xxxhub123.com/gfwlist\nserver=/eighteen-store18x.jp/127.0.0.1#5335\nipset=/eighteen-store18x.jp/gfwlist\nserver=/adsenseformobileapps.com/127.0.0.1#5335\nipset=/adsenseformobileapps.com/gfwlist\nserver=/hoge.7jp.info/127.0.0.1#5335\nipset=/hoge.7jp.info/gfwlist\nserver=/pa9pal.com/127.0.0.1#5335\nipset=/pa9pal.com/gfwlist\nserver=/paypalhere.com/127.0.0.1#5335\nipset=/paypalhere.com/gfwlist\nserver=/estudiopenthouse.com/127.0.0.1#5335\nipset=/estudiopenthouse.com/gfwlist\nserver=/nudevista.link/127.0.0.1#5335\nipset=/nudevista.link/gfwlist\nserver=/sexy-torrents.com/127.0.0.1#5335\nipset=/sexy-torrents.com/gfwlist\nserver=/pornkro.com/127.0.0.1#5335\nipset=/pornkro.com/gfwlist\nserver=/ninpu.cyou/127.0.0.1#5335\nipset=/ninpu.cyou/gfwlist\nserver=/animedao-tv.com/127.0.0.1#5335\nipset=/animedao-tv.com/gfwlist\nserver=/asiangfvideos.com/127.0.0.1#5335\nipset=/asiangfvideos.com/gfwlist\nserver=/tophdsex.com/127.0.0.1#5335\nipset=/tophdsex.com/gfwlist\nserver=/mini.it/127.0.0.1#5335\nipset=/mini.it/gfwlist\nserver=/hpcampus.com/127.0.0.1#5335\nipset=/hpcampus.com/gfwlist\nserver=/youtube.com.hr/127.0.0.1#5335\nipset=/youtube.com.hr/gfwlist\nserver=/bigbigchannel.com.hk/127.0.0.1#5335\nipset=/bigbigchannel.com.hk/gfwlist\nserver=/arcgisonline.com/127.0.0.1#5335\nipset=/arcgisonline.com/gfwlist\nserver=/doctor-videos.com/127.0.0.1#5335\nipset=/doctor-videos.com/gfwlist\nserver=/pornsearchengine.com/127.0.0.1#5335\nipset=/pornsearchengine.com/gfwlist\nserver=/steam.ru.qtlglb.com/127.0.0.1#5335\nipset=/steam.ru.qtlglb.com/gfwlist\nserver=/onlycartoonsex.com/127.0.0.1#5335\nipset=/onlycartoonsex.com/gfwlist\nserver=/ntdvn.com/127.0.0.1#5335\nipset=/ntdvn.com/gfwlist\nserver=/raspbian.org/127.0.0.1#5335\nipset=/raspbian.org/gfwlist\nserver=/playoverwatch.com/127.0.0.1#5335\nipset=/playoverwatch.com/gfwlist\nserver=/tsuradou.noonvob.com/127.0.0.1#5335\nipset=/tsuradou.noonvob.com/gfwlist\nserver=/mini-dubai.com/127.0.0.1#5335\nipset=/mini-dubai.com/gfwlist\nserver=/durex.com.sg/127.0.0.1#5335\nipset=/durex.com.sg/gfwlist\nserver=/garena.tw/127.0.0.1#5335\nipset=/garena.tw/gfwlist\nserver=/canon.com.al/127.0.0.1#5335\nipset=/canon.com.al/gfwlist\nserver=/ilife.eu/127.0.0.1#5335\nipset=/ilife.eu/gfwlist\nserver=/pornxp.com/127.0.0.1#5335\nipset=/pornxp.com/gfwlist\nserver=/google.co.mz/127.0.0.1#5335\nipset=/google.co.mz/gfwlist\nserver=/pretty-ass.xyz/127.0.0.1#5335\nipset=/pretty-ass.xyz/gfwlist\nserver=/bmwbikes.com/127.0.0.1#5335\nipset=/bmwbikes.com/gfwlist\nserver=/sling.com/127.0.0.1#5335\nipset=/sling.com/gfwlist\nserver=/monstershopcheapbeats.net/127.0.0.1#5335\nipset=/monstershopcheapbeats.net/gfwlist\nserver=/shopee.in/127.0.0.1#5335\nipset=/shopee.in/gfwlist\nserver=/quicktake.video/127.0.0.1#5335\nipset=/quicktake.video/gfwlist\nserver=/gamebeforethegame.com/127.0.0.1#5335\nipset=/gamebeforethegame.com/gfwlist\nserver=/apple.sg/127.0.0.1#5335\nipset=/apple.sg/gfwlist\nserver=/akamaietpcompromisedmalwaretest.com/127.0.0.1#5335\nipset=/akamaietpcompromisedmalwaretest.com/gfwlist\nserver=/cell.com/127.0.0.1#5335\nipset=/cell.com/gfwlist\nserver=/dell.com/127.0.0.1#5335\nipset=/dell.com/gfwlist\nserver=/garena.co.id/127.0.0.1#5335\nipset=/garena.co.id/gfwlist\nserver=/sex4arabxxx.com/127.0.0.1#5335\nipset=/sex4arabxxx.com/gfwlist\nserver=/ebsco.com/127.0.0.1#5335\nipset=/ebsco.com/gfwlist\nserver=/whatsapp-plus.info/127.0.0.1#5335\nipset=/whatsapp-plus.info/gfwlist\nserver=/itools.info/127.0.0.1#5335\nipset=/itools.info/gfwlist\nserver=/trannytube.tv/127.0.0.1#5335\nipset=/trannytube.tv/gfwlist\nserver=/pornicom.com/127.0.0.1#5335\nipset=/pornicom.com/gfwlist\nserver=/slinginternational.com/127.0.0.1#5335\nipset=/slinginternational.com/gfwlist\nserver=/pinterest.co/127.0.0.1#5335\nipset=/pinterest.co/gfwlist\nserver=/theporndude.cc/127.0.0.1#5335\nipset=/theporndude.cc/gfwlist\nserver=/cilk.com/127.0.0.1#5335\nipset=/cilk.com/gfwlist\nserver=/cuckoldinterracialporn.com/127.0.0.1#5335\nipset=/cuckoldinterracialporn.com/gfwlist\nserver=/clinicalkey.com/127.0.0.1#5335\nipset=/clinicalkey.com/gfwlist\nserver=/nurxxx.mobi/127.0.0.1#5335\nipset=/nurxxx.mobi/gfwlist\nserver=/volvotrucks.cz/127.0.0.1#5335\nipset=/volvotrucks.cz/gfwlist\nserver=/intel.mp/127.0.0.1#5335\nipset=/intel.mp/gfwlist\nserver=/starbucks.vn/127.0.0.1#5335\nipset=/starbucks.vn/gfwlist\nserver=/freexxx.best/127.0.0.1#5335\nipset=/freexxx.best/gfwlist\nserver=/edge.steam-dns.top.comcast.net/127.0.0.1#5335\nipset=/edge.steam-dns.top.comcast.net/gfwlist\nserver=/sony.co.kr/127.0.0.1#5335\nipset=/sony.co.kr/gfwlist\nserver=/nenitas.club/127.0.0.1#5335\nipset=/nenitas.club/gfwlist\nserver=/roshy.tv/127.0.0.1#5335\nipset=/roshy.tv/gfwlist\nserver=/vkuserlive.net/127.0.0.1#5335\nipset=/vkuserlive.net/gfwlist\nserver=/moviesneek.com/127.0.0.1#5335\nipset=/moviesneek.com/gfwlist\nserver=/zoohun.com/127.0.0.1#5335\nipset=/zoohun.com/gfwlist\nserver=/lsawards.com/127.0.0.1#5335\nipset=/lsawards.com/gfwlist\nserver=/z5.app/127.0.0.1#5335\nipset=/z5.app/gfwlist\nserver=/bejeweledstars.com/127.0.0.1#5335\nipset=/bejeweledstars.com/gfwlist\nserver=/momomall.com.tw/127.0.0.1#5335\nipset=/momomall.com.tw/gfwlist\nserver=/grannygetsafacial.com/127.0.0.1#5335\nipset=/grannygetsafacial.com/gfwlist\nserver=/binancezh.cc/127.0.0.1#5335\nipset=/binancezh.cc/gfwlist\nserver=/newlineporn.com/127.0.0.1#5335\nipset=/newlineporn.com/gfwlist\nserver=/plos.org/127.0.0.1#5335\nipset=/plos.org/gfwlist\nserver=/3lib.net/127.0.0.1#5335\nipset=/3lib.net/gfwlist\nserver=/scholar.google.com.uy/127.0.0.1#5335\nipset=/scholar.google.com.uy/gfwlist\nserver=/hackday.com.au/127.0.0.1#5335\nipset=/hackday.com.au/gfwlist\nserver=/miniso.ie/127.0.0.1#5335\nipset=/miniso.ie/gfwlist\nserver=/volvopenta.fr/127.0.0.1#5335\nipset=/volvopenta.fr/gfwlist\nserver=/hanime.xxx/127.0.0.1#5335\nipset=/hanime.xxx/gfwlist\nserver=/aoaou.iillii.net/127.0.0.1#5335\nipset=/aoaou.iillii.net/gfwlist\nserver=/picasaweb.org/127.0.0.1#5335\nipset=/picasaweb.org/gfwlist\nserver=/nikeaustralia.com/127.0.0.1#5335\nipset=/nikeaustralia.com/gfwlist\nserver=/firestonecomercial.com.co/127.0.0.1#5335\nipset=/firestonecomercial.com.co/gfwlist\nserver=/bookstagram.com/127.0.0.1#5335\nipset=/bookstagram.com/gfwlist\nserver=/vanish.com.hr/127.0.0.1#5335\nipset=/vanish.com.hr/gfwlist\nserver=/intel.rw/127.0.0.1#5335\nipset=/intel.rw/gfwlist\nserver=/marketwatch.com/127.0.0.1#5335\nipset=/marketwatch.com/gfwlist\nserver=/bmwmass.net/127.0.0.1#5335\nipset=/bmwmass.net/gfwlist\nserver=/hotcandyland.com/127.0.0.1#5335\nipset=/hotcandyland.com/gfwlist\nserver=/oculus-china.com/127.0.0.1#5335\nipset=/oculus-china.com/gfwlist\nserver=/twitpic.com/127.0.0.1#5335\nipset=/twitpic.com/gfwlist\nserver=/ebaybenefits.com/127.0.0.1#5335\nipset=/ebaybenefits.com/gfwlist\nserver=/google.vu/127.0.0.1#5335\nipset=/google.vu/gfwlist\nserver=/casimages.com/127.0.0.1#5335\nipset=/casimages.com/gfwlist\nserver=/xcams.com/127.0.0.1#5335\nipset=/xcams.com/gfwlist\nserver=/webhosting.com/127.0.0.1#5335\nipset=/webhosting.com/gfwlist\nserver=/pubmatic.com/127.0.0.1#5335\nipset=/pubmatic.com/gfwlist\nserver=/xvideo.run/127.0.0.1#5335\nipset=/xvideo.run/gfwlist\nserver=/myavok.com/127.0.0.1#5335\nipset=/myavok.com/gfwlist\nserver=/erothots.co/127.0.0.1#5335\nipset=/erothots.co/gfwlist\nserver=/cartoonpornonly.com/127.0.0.1#5335\nipset=/cartoonpornonly.com/gfwlist\nserver=/beatsfranceofficiel.com/127.0.0.1#5335\nipset=/beatsfranceofficiel.com/gfwlist\nserver=/azuremarketplace.microsoft.com/127.0.0.1#5335\nipset=/azuremarketplace.microsoft.com/gfwlist\nserver=/sissy.eu.org/127.0.0.1#5335\nipset=/sissy.eu.org/gfwlist\nserver=/scholar.google.co.za/127.0.0.1#5335\nipset=/scholar.google.co.za/gfwlist\nserver=/gaystream.pw/127.0.0.1#5335\nipset=/gaystream.pw/gfwlist\nserver=/indienudes.com/127.0.0.1#5335\nipset=/indienudes.com/gfwlist\nserver=/x99av.com/127.0.0.1#5335\nipset=/x99av.com/gfwlist\nserver=/uuk28.com/127.0.0.1#5335\nipset=/uuk28.com/gfwlist\nserver=/nflxvideo.net/127.0.0.1#5335\nipset=/nflxvideo.net/gfwlist\nserver=/myhulu.com/127.0.0.1#5335\nipset=/myhulu.com/gfwlist\nserver=/bmwchampionship.com/127.0.0.1#5335\nipset=/bmwchampionship.com/gfwlist\nserver=/nuuporn.com/127.0.0.1#5335\nipset=/nuuporn.com/gfwlist\nserver=/pornspark.com/127.0.0.1#5335\nipset=/pornspark.com/gfwlist\nserver=/wsj.com/127.0.0.1#5335\nipset=/wsj.com/gfwlist\nserver=/facebookflow.com/127.0.0.1#5335\nipset=/facebookflow.com/gfwlist\nserver=/volvotrucks.my/127.0.0.1#5335\nipset=/volvotrucks.my/gfwlist\nserver=/facebook.se/127.0.0.1#5335\nipset=/facebook.se/gfwlist\nserver=/enfa.com.vn/127.0.0.1#5335\nipset=/enfa.com.vn/gfwlist\nserver=/vmworld2013.com/127.0.0.1#5335\nipset=/vmworld2013.com/gfwlist\nserver=/aventertainments.com/127.0.0.1#5335\nipset=/aventertainments.com/gfwlist\nserver=/12diasderegalosdeitunes.co/127.0.0.1#5335\nipset=/12diasderegalosdeitunes.co/gfwlist\nserver=/fleshlyx.com/127.0.0.1#5335\nipset=/fleshlyx.com/gfwlist\nserver=/sora6.com/127.0.0.1#5335\nipset=/sora6.com/gfwlist\nserver=/bmw-ottawa.ca/127.0.0.1#5335\nipset=/bmw-ottawa.ca/gfwlist\nserver=/draftjs.org/127.0.0.1#5335\nipset=/draftjs.org/gfwlist\nserver=/youtube.com.jm/127.0.0.1#5335\nipset=/youtube.com.jm/gfwlist\nserver=/hbogo.eu/127.0.0.1#5335\nipset=/hbogo.eu/gfwlist\nserver=/gogo-load.com/127.0.0.1#5335\nipset=/gogo-load.com/gfwlist\nserver=/mcdindonesia.com/127.0.0.1#5335\nipset=/mcdindonesia.com/gfwlist\nserver=/icegaytube.tv/127.0.0.1#5335\nipset=/icegaytube.tv/gfwlist\nserver=/mailonsunday.co.uk/127.0.0.1#5335\nipset=/mailonsunday.co.uk/gfwlist\nserver=/amerikiskhma.com/127.0.0.1#5335\nipset=/amerikiskhma.com/gfwlist\nserver=/icloudos.net/127.0.0.1#5335\nipset=/icloudos.net/gfwlist\nserver=/nikey.com/127.0.0.1#5335\nipset=/nikey.com/gfwlist\nserver=/sciencemag.org/127.0.0.1#5335\nipset=/sciencemag.org/gfwlist\nserver=/brandeasygo.com/127.0.0.1#5335\nipset=/brandeasygo.com/gfwlist\nserver=/nintendo.com.pt/127.0.0.1#5335\nipset=/nintendo.com.pt/gfwlist\nserver=/faketaxi.com/127.0.0.1#5335\nipset=/faketaxi.com/gfwlist\nserver=/home-made-porn-movies.com/127.0.0.1#5335\nipset=/home-made-porn-movies.com/gfwlist\nserver=/firestone.com.co/127.0.0.1#5335\nipset=/firestone.com.co/gfwlist\nserver=/tesla.services/127.0.0.1#5335\nipset=/tesla.services/gfwlist\nserver=/epochshop.com/127.0.0.1#5335\nipset=/epochshop.com/gfwlist\nserver=/easypic.com/127.0.0.1#5335\nipset=/easypic.com/gfwlist\nserver=/ebaystyle.com/127.0.0.1#5335\nipset=/ebaystyle.com/gfwlist\nserver=/mansionglobal.com/127.0.0.1#5335\nipset=/mansionglobal.com/gfwlist\nserver=/pridetube.com/127.0.0.1#5335\nipset=/pridetube.com/gfwlist\nserver=/livemodels.co/127.0.0.1#5335\nipset=/livemodels.co/gfwlist\nserver=/veet.com.ar/127.0.0.1#5335\nipset=/veet.com.ar/gfwlist\nserver=/hentai.io/127.0.0.1#5335\nipset=/hentai.io/gfwlist\nserver=/ceskeporno.cz/127.0.0.1#5335\nipset=/ceskeporno.cz/gfwlist\nserver=/youtube.be/127.0.0.1#5335\nipset=/youtube.be/gfwlist\nserver=/prostate-exam-info.com/127.0.0.1#5335\nipset=/prostate-exam-info.com/gfwlist\nserver=/vfsco.fr/127.0.0.1#5335\nipset=/vfsco.fr/gfwlist\nserver=/gemini.yahoo.com/127.0.0.1#5335\nipset=/gemini.yahoo.com/gfwlist\nserver=/aadmv.com/127.0.0.1#5335\nipset=/aadmv.com/gfwlist\nserver=/youtube.hr/127.0.0.1#5335\nipset=/youtube.hr/gfwlist\nserver=/pornlist18.com/127.0.0.1#5335\nipset=/pornlist18.com/gfwlist\nserver=/beatsbydreaustralia-sale.com/127.0.0.1#5335\nipset=/beatsbydreaustralia-sale.com/gfwlist\nserver=/macruby.com/127.0.0.1#5335\nipset=/macruby.com/gfwlist\nserver=/xgirls.webcam/127.0.0.1#5335\nipset=/xgirls.webcam/gfwlist\nserver=/dogfartnetwork.com/127.0.0.1#5335\nipset=/dogfartnetwork.com/gfwlist\nserver=/kutjeporno.com/127.0.0.1#5335\nipset=/kutjeporno.com/gfwlist\nserver=/sexmummy.com/127.0.0.1#5335\nipset=/sexmummy.com/gfwlist\nserver=/secure-paypal.info/127.0.0.1#5335\nipset=/secure-paypal.info/gfwlist\nserver=/fast.com/127.0.0.1#5335\nipset=/fast.com/gfwlist\nserver=/hkgpao.com/127.0.0.1#5335\nipset=/hkgpao.com/gfwlist\nserver=/instanttelegram.com/127.0.0.1#5335\nipset=/instanttelegram.com/gfwlist\nserver=/xvideos.co/127.0.0.1#5335\nipset=/xvideos.co/gfwlist\nserver=/yiqilai99.cn/127.0.0.1#5335\nipset=/yiqilai99.cn/gfwlist\nserver=/igcdn.com/127.0.0.1#5335\nipset=/igcdn.com/gfwlist\nserver=/vanitaonline.com/127.0.0.1#5335\nipset=/vanitaonline.com/gfwlist\nserver=/avday.tv/127.0.0.1#5335\nipset=/avday.tv/gfwlist\nserver=/justmysocks4.net/127.0.0.1#5335\nipset=/justmysocks4.net/gfwlist\nserver=/xboxone.com/127.0.0.1#5335\nipset=/xboxone.com/gfwlist\nserver=/yt.be/127.0.0.1#5335\nipset=/yt.be/gfwlist\nserver=/stepmom.one/127.0.0.1#5335\nipset=/stepmom.one/gfwlist\nserver=/vanish.pl/127.0.0.1#5335\nipset=/vanish.pl/gfwlist\nserver=/scholar.google.com.do/127.0.0.1#5335\nipset=/scholar.google.com.do/gfwlist\nserver=/darwinsourcecode.com/127.0.0.1#5335\nipset=/darwinsourcecode.com/gfwlist\nserver=/blogspot.ca/127.0.0.1#5335\nipset=/blogspot.ca/gfwlist\nserver=/sponichi.co.jp/127.0.0.1#5335\nipset=/sponichi.co.jp/gfwlist\nserver=/musclegirlflix.com/127.0.0.1#5335\nipset=/musclegirlflix.com/gfwlist\nserver=/seagroup.com/127.0.0.1#5335\nipset=/seagroup.com/gfwlist\nserver=/nikekid.com/127.0.0.1#5335\nipset=/nikekid.com/gfwlist\nserver=/bmwsports.com/127.0.0.1#5335\nipset=/bmwsports.com/gfwlist\nserver=/czechlesbians.com/127.0.0.1#5335\nipset=/czechlesbians.com/gfwlist\nserver=/amazon.com.mx/127.0.0.1#5335\nipset=/amazon.com.mx/gfwlist\nserver=/catcert.cat/127.0.0.1#5335\nipset=/catcert.cat/gfwlist\nserver=/nextjs.org/127.0.0.1#5335\nipset=/nextjs.org/gfwlist\nserver=/jerkofftocelebs.com/127.0.0.1#5335\nipset=/jerkofftocelebs.com/gfwlist\nserver=/topartporn.com/127.0.0.1#5335\nipset=/topartporn.com/gfwlist\nserver=/rbe996.com/127.0.0.1#5335\nipset=/rbe996.com/gfwlist\nserver=/e-szigno.hu/127.0.0.1#5335\nipset=/e-szigno.hu/gfwlist\nserver=/lustylist.com/127.0.0.1#5335\nipset=/lustylist.com/gfwlist\nserver=/cuckoldwifesex.com/127.0.0.1#5335\nipset=/cuckoldwifesex.com/gfwlist\nserver=/beatbydreuk2014.com/127.0.0.1#5335\nipset=/beatbydreuk2014.com/gfwlist\nserver=/visa.com.ar/127.0.0.1#5335\nipset=/visa.com.ar/gfwlist\nserver=/twavking.com/127.0.0.1#5335\nipset=/twavking.com/gfwlist\nserver=/bmj.com/127.0.0.1#5335\nipset=/bmj.com/gfwlist\nserver=/alfera.com.hk/127.0.0.1#5335\nipset=/alfera.com.hk/gfwlist\nserver=/tube-sex-videos.com/127.0.0.1#5335\nipset=/tube-sex-videos.com/gfwlist\nserver=/helixstudios.net/127.0.0.1#5335\nipset=/helixstudios.net/gfwlist\nserver=/heroero.com/127.0.0.1#5335\nipset=/heroero.com/gfwlist\nserver=/oxfordclinicalpsych.com/127.0.0.1#5335\nipset=/oxfordclinicalpsych.com/gfwlist\nserver=/meilleurpornos.com/127.0.0.1#5335\nipset=/meilleurpornos.com/gfwlist\nserver=/ikea.com.tw/127.0.0.1#5335\nipset=/ikea.com.tw/gfwlist\nserver=/pearson.co.in/127.0.0.1#5335\nipset=/pearson.co.in/gfwlist\nserver=/sucksex.com/127.0.0.1#5335\nipset=/sucksex.com/gfwlist\nserver=/pppds.com/127.0.0.1#5335\nipset=/pppds.com/gfwlist\nserver=/bcicdn.com/127.0.0.1#5335\nipset=/bcicdn.com/gfwlist\nserver=/brandelectronic.com/127.0.0.1#5335\nipset=/brandelectronic.com/gfwlist\nserver=/pearsonvue.net/127.0.0.1#5335\nipset=/pearsonvue.net/gfwlist\nserver=/nurumassage.net/127.0.0.1#5335\nipset=/nurumassage.net/gfwlist\nserver=/mingshengbao.com/127.0.0.1#5335\nipset=/mingshengbao.com/gfwlist\nserver=/transcamslive.com/127.0.0.1#5335\nipset=/transcamslive.com/gfwlist\nserver=/2013beatsbydrdreshop.com/127.0.0.1#5335\nipset=/2013beatsbydrdreshop.com/gfwlist\nserver=/onedrive.co/127.0.0.1#5335\nipset=/onedrive.co/gfwlist\nserver=/tubepornlist.com/127.0.0.1#5335\nipset=/tubepornlist.com/gfwlist\nserver=/instamgram.com/127.0.0.1#5335\nipset=/instamgram.com/gfwlist\nserver=/spankingtube.com/127.0.0.1#5335\nipset=/spankingtube.com/gfwlist\nserver=/myamateurgirls.net/127.0.0.1#5335\nipset=/myamateurgirls.net/gfwlist\nserver=/google.sk/127.0.0.1#5335\nipset=/google.sk/gfwlist\nserver=/cartoonporno.xxx/127.0.0.1#5335\nipset=/cartoonporno.xxx/gfwlist\nserver=/hentaiz.cc/127.0.0.1#5335\nipset=/hentaiz.cc/gfwlist\nserver=/fbcdn-a.akamaihd.net/127.0.0.1#5335\nipset=/fbcdn-a.akamaihd.net/gfwlist\nserver=/simply-hentai.com/127.0.0.1#5335\nipset=/simply-hentai.com/gfwlist\nserver=/krymr.com/127.0.0.1#5335\nipset=/krymr.com/gfwlist\nserver=/youtube.gr/127.0.0.1#5335\nipset=/youtube.gr/gfwlist\nserver=/attbelieves.com/127.0.0.1#5335\nipset=/attbelieves.com/gfwlist\nserver=/sony-semicon.co.jp/127.0.0.1#5335\nipset=/sony-semicon.co.jp/gfwlist\nserver=/pobl-content.com/127.0.0.1#5335\nipset=/pobl-content.com/gfwlist\nserver=/volvotrucks.kr/127.0.0.1#5335\nipset=/volvotrucks.kr/gfwlist\nserver=/mini-windsor.com/127.0.0.1#5335\nipset=/mini-windsor.com/gfwlist\nserver=/hoes.com/127.0.0.1#5335\nipset=/hoes.com/gfwlist\nserver=/facebookmail.com/127.0.0.1#5335\nipset=/facebookmail.com/gfwlist\nserver=/netflixdnstest8.com/127.0.0.1#5335\nipset=/netflixdnstest8.com/gfwlist\nserver=/niceporn.tv/127.0.0.1#5335\nipset=/niceporn.tv/gfwlist\nserver=/ubnw.net/127.0.0.1#5335\nipset=/ubnw.net/gfwlist\nserver=/vfsco.cl/127.0.0.1#5335\nipset=/vfsco.cl/gfwlist\nserver=/sekswebsite.nl/127.0.0.1#5335\nipset=/sekswebsite.nl/gfwlist\nserver=/cloudproxy.app/127.0.0.1#5335\nipset=/cloudproxy.app/gfwlist\nserver=/daftsex-hd.com/127.0.0.1#5335\nipset=/daftsex-hd.com/gfwlist\nserver=/mjv-art.org/127.0.0.1#5335\nipset=/mjv-art.org/gfwlist\nserver=/marketing-cloud.com/127.0.0.1#5335\nipset=/marketing-cloud.com/gfwlist\nserver=/yahoo.ro/127.0.0.1#5335\nipset=/yahoo.ro/gfwlist\nserver=/netsolssl.com/127.0.0.1#5335\nipset=/netsolssl.com/gfwlist\nserver=/motherporn.ovh/127.0.0.1#5335\nipset=/motherporn.ovh/gfwlist\nserver=/malayalamanorama.com/127.0.0.1#5335\nipset=/malayalamanorama.com/gfwlist\nserver=/apple.co.jp/127.0.0.1#5335\nipset=/apple.co.jp/gfwlist\nserver=/ebayinc.com/127.0.0.1#5335\nipset=/ebayinc.com/gfwlist\nserver=/licdn.com/127.0.0.1#5335\nipset=/licdn.com/gfwlist\nserver=/yourwifemymeat.com/127.0.0.1#5335\nipset=/yourwifemymeat.com/gfwlist\nserver=/vanish.co.id/127.0.0.1#5335\nipset=/vanish.co.id/gfwlist\nserver=/alldrawingshere.com/127.0.0.1#5335\nipset=/alldrawingshere.com/gfwlist\nserver=/ckcdn.com/127.0.0.1#5335\nipset=/ckcdn.com/gfwlist\nserver=/ppe.lawyer/127.0.0.1#5335\nipset=/ppe.lawyer/gfwlist\nserver=/gradeuptube.com/127.0.0.1#5335\nipset=/gradeuptube.com/gfwlist\nserver=/xvideosnovinhas.com/127.0.0.1#5335\nipset=/xvideosnovinhas.com/gfwlist\nserver=/cryptocompare.com/127.0.0.1#5335\nipset=/cryptocompare.com/gfwlist\nserver=/18-teen-xxx.com/127.0.0.1#5335\nipset=/18-teen-xxx.com/gfwlist\nserver=/avstar.me/127.0.0.1#5335\nipset=/avstar.me/gfwlist\nserver=/zhengjian.org/127.0.0.1#5335\nipset=/zhengjian.org/gfwlist\nserver=/fuck6teen.com/127.0.0.1#5335\nipset=/fuck6teen.com/gfwlist\nserver=/40somethingmag.com/127.0.0.1#5335\nipset=/40somethingmag.com/gfwlist\nserver=/yahoo.com.ag/127.0.0.1#5335\nipset=/yahoo.com.ag/gfwlist\nserver=/brazzfan.com/127.0.0.1#5335\nipset=/brazzfan.com/gfwlist\nserver=/epoch.org.il/127.0.0.1#5335\nipset=/epoch.org.il/gfwlist\nserver=/faceboob.com/127.0.0.1#5335\nipset=/faceboob.com/gfwlist\nserver=/myatos.net/127.0.0.1#5335\nipset=/myatos.net/gfwlist\nserver=/getpocket.com/127.0.0.1#5335\nipset=/getpocket.com/gfwlist\nserver=/landofhope.tv/127.0.0.1#5335\nipset=/landofhope.tv/gfwlist\nserver=/pornktube.com/127.0.0.1#5335\nipset=/pornktube.com/gfwlist\nserver=/mininanaimo.com/127.0.0.1#5335\nipset=/mininanaimo.com/gfwlist\nserver=/freecartoons.biz/127.0.0.1#5335\nipset=/freecartoons.biz/gfwlist\nserver=/rarbgto.org/127.0.0.1#5335\nipset=/rarbgto.org/gfwlist\nserver=/pinksporn.com/127.0.0.1#5335\nipset=/pinksporn.com/gfwlist\nserver=/sexjk.com/127.0.0.1#5335\nipset=/sexjk.com/gfwlist\nserver=/xnxx-sex-tube.com/127.0.0.1#5335\nipset=/xnxx-sex-tube.com/gfwlist\nserver=/volvobuses.co.nz/127.0.0.1#5335\nipset=/volvobuses.co.nz/gfwlist\nserver=/aboutyourmini.com/127.0.0.1#5335\nipset=/aboutyourmini.com/gfwlist\nserver=/wetnhorny.com/127.0.0.1#5335\nipset=/wetnhorny.com/gfwlist\nserver=/vrporncat.com/127.0.0.1#5335\nipset=/vrporncat.com/gfwlist\nserver=/ubisoft-uplay-savegames.s3.amazonaws.com/127.0.0.1#5335\nipset=/ubisoft-uplay-savegames.s3.amazonaws.com/gfwlist\nserver=/xsvod.xyz/127.0.0.1#5335\nipset=/xsvod.xyz/gfwlist\nserver=/disco-api.com/127.0.0.1#5335\nipset=/disco-api.com/gfwlist\nserver=/nikestore.com.au/127.0.0.1#5335\nipset=/nikestore.com.au/gfwlist\nserver=/pageview.mobi/127.0.0.1#5335\nipset=/pageview.mobi/gfwlist\nserver=/ptt3.cc/127.0.0.1#5335\nipset=/ptt3.cc/gfwlist\nserver=/feook.com/127.0.0.1#5335\nipset=/feook.com/gfwlist\nserver=/google.td/127.0.0.1#5335\nipset=/google.td/gfwlist\nserver=/voa.gov/127.0.0.1#5335\nipset=/voa.gov/gfwlist\nserver=/vmwidm-ads.com/127.0.0.1#5335\nipset=/vmwidm-ads.com/gfwlist\nserver=/sexgamesbox.com/127.0.0.1#5335\nipset=/sexgamesbox.com/gfwlist\nserver=/masseffectarchives.com/127.0.0.1#5335\nipset=/masseffectarchives.com/gfwlist\nserver=/fmcebook.com/127.0.0.1#5335\nipset=/fmcebook.com/gfwlist\nserver=/xn--czrs0t4phtr3a.cn/127.0.0.1#5335\nipset=/xn--czrs0t4phtr3a.cn/gfwlist\nserver=/fbworkmail.com/127.0.0.1#5335\nipset=/fbworkmail.com/gfwlist\nserver=/sb.sb/127.0.0.1#5335\nipset=/sb.sb/gfwlist\nserver=/cheapbeatsbydreoutlet-nz.com/127.0.0.1#5335\nipset=/cheapbeatsbydreoutlet-nz.com/gfwlist\nserver=/azurecomcdn.net/127.0.0.1#5335\nipset=/azurecomcdn.net/gfwlist\nserver=/ebaynyc.com/127.0.0.1#5335\nipset=/ebaynyc.com/gfwlist\nserver=/japanesebeauties.net/127.0.0.1#5335\nipset=/japanesebeauties.net/gfwlist\nserver=/staxus.com/127.0.0.1#5335\nipset=/staxus.com/gfwlist\nserver=/volvotrucks.hk/127.0.0.1#5335\nipset=/volvotrucks.hk/gfwlist\nserver=/discord.design/127.0.0.1#5335\nipset=/discord.design/gfwlist\nserver=/pinterest.de/127.0.0.1#5335\nipset=/pinterest.de/gfwlist\nserver=/stacyvandenbergboobs.com/127.0.0.1#5335\nipset=/stacyvandenbergboobs.com/gfwlist\nserver=/ikea.in/127.0.0.1#5335\nipset=/ikea.in/gfwlist\nserver=/ip.sb/127.0.0.1#5335\nipset=/ip.sb/gfwlist\nserver=/codeberg.org/127.0.0.1#5335\nipset=/codeberg.org/gfwlist\nserver=/westlaw.com/127.0.0.1#5335\nipset=/westlaw.com/gfwlist\nserver=/phun.org/127.0.0.1#5335\nipset=/phun.org/gfwlist\nserver=/atdmt2.com/127.0.0.1#5335\nipset=/atdmt2.com/gfwlist\nserver=/visaeurope.si/127.0.0.1#5335\nipset=/visaeurope.si/gfwlist\nserver=/girlsway.com/127.0.0.1#5335\nipset=/girlsway.com/gfwlist\nserver=/epochtimes.it/127.0.0.1#5335\nipset=/epochtimes.it/gfwlist\nserver=/pacifickitchenandhome.com/127.0.0.1#5335\nipset=/pacifickitchenandhome.com/gfwlist\nserver=/mplstudios.com/127.0.0.1#5335\nipset=/mplstudios.com/gfwlist\nserver=/mgo-images.com/127.0.0.1#5335\nipset=/mgo-images.com/gfwlist\nserver=/lettherebeporn.com/127.0.0.1#5335\nipset=/lettherebeporn.com/gfwlist\nserver=/theshoppingexpresslane.net/127.0.0.1#5335\nipset=/theshoppingexpresslane.net/gfwlist\nserver=/jitsi.org/127.0.0.1#5335\nipset=/jitsi.org/gfwlist\nserver=/miniwholesaleconnect.com/127.0.0.1#5335\nipset=/miniwholesaleconnect.com/gfwlist\nserver=/paypal-referral.com/127.0.0.1#5335\nipset=/paypal-referral.com/gfwlist\nserver=/badjojo.com/127.0.0.1#5335\nipset=/badjojo.com/gfwlist\nserver=/binancezh.be/127.0.0.1#5335\nipset=/binancezh.be/gfwlist\nserver=/moviesfree4u.xyz/127.0.0.1#5335\nipset=/moviesfree4u.xyz/gfwlist\nserver=/bbycastatic.ca/127.0.0.1#5335\nipset=/bbycastatic.ca/gfwlist\nserver=/app-dynamics.com/127.0.0.1#5335\nipset=/app-dynamics.com/gfwlist\nserver=/freepornhentaigames.com/127.0.0.1#5335\nipset=/freepornhentaigames.com/gfwlist\nserver=/bmwgroup-classic-heart.com/127.0.0.1#5335\nipset=/bmwgroup-classic-heart.com/gfwlist\nserver=/github.com/127.0.0.1#5335\nipset=/github.com/gfwlist\nserver=/appledarwin.com/127.0.0.1#5335\nipset=/appledarwin.com/gfwlist\nserver=/beatsheadphonesusamall.com/127.0.0.1#5335\nipset=/beatsheadphonesusamall.com/gfwlist\nserver=/ind.sh/127.0.0.1#5335\nipset=/ind.sh/gfwlist\nserver=/cuckoldporntube.com/127.0.0.1#5335\nipset=/cuckoldporntube.com/gfwlist\nserver=/agzy1.com/127.0.0.1#5335\nipset=/agzy1.com/gfwlist\nserver=/thenextweb.com/127.0.0.1#5335\nipset=/thenextweb.com/gfwlist\nserver=/bridgestonetyre.com.my/127.0.0.1#5335\nipset=/bridgestonetyre.com.my/gfwlist\nserver=/milfslesbian.com/127.0.0.1#5335\nipset=/milfslesbian.com/gfwlist\nserver=/pornoboard.net/127.0.0.1#5335\nipset=/pornoboard.net/gfwlist\nserver=/ibradome.com/127.0.0.1#5335\nipset=/ibradome.com/gfwlist\nserver=/fuckthathussy.com/127.0.0.1#5335\nipset=/fuckthathussy.com/gfwlist\nserver=/sexmerci.com/127.0.0.1#5335\nipset=/sexmerci.com/gfwlist\nserver=/opentranslatorstothings.org/127.0.0.1#5335\nipset=/opentranslatorstothings.org/gfwlist\nserver=/collective99.com/127.0.0.1#5335\nipset=/collective99.com/gfwlist\nserver=/thenationalpulse.com/127.0.0.1#5335\nipset=/thenationalpulse.com/gfwlist\nserver=/bmia.org/127.0.0.1#5335\nipset=/bmia.org/gfwlist\nserver=/huffingtonpost.co.uk/127.0.0.1#5335\nipset=/huffingtonpost.co.uk/gfwlist\nserver=/adultsexgame.biz/127.0.0.1#5335\nipset=/adultsexgame.biz/gfwlist\nserver=/minilaval.com/127.0.0.1#5335\nipset=/minilaval.com/gfwlist\nserver=/visa.com.kh/127.0.0.1#5335\nipset=/visa.com.kh/gfwlist\nserver=/horse-cum.net/127.0.0.1#5335\nipset=/horse-cum.net/gfwlist\nserver=/visa.nl/127.0.0.1#5335\nipset=/visa.nl/gfwlist\nserver=/fox38corpuschristi.com/127.0.0.1#5335\nipset=/fox38corpuschristi.com/gfwlist\nserver=/bwh8.net/127.0.0.1#5335\nipset=/bwh8.net/gfwlist\nserver=/practicalmoneyskills.ca/127.0.0.1#5335\nipset=/practicalmoneyskills.ca/gfwlist\nserver=/kktv.com.tw/127.0.0.1#5335\nipset=/kktv.com.tw/gfwlist\nserver=/hentaifc.com/127.0.0.1#5335\nipset=/hentaifc.com/gfwlist\nserver=/crececonebay.com/127.0.0.1#5335\nipset=/crececonebay.com/gfwlist\nserver=/zteman.net/127.0.0.1#5335\nipset=/zteman.net/gfwlist\nserver=/javplatform.com/127.0.0.1#5335\nipset=/javplatform.com/gfwlist\nserver=/instafollower.com/127.0.0.1#5335\nipset=/instafollower.com/gfwlist\nserver=/beastiegals.com/127.0.0.1#5335\nipset=/beastiegals.com/gfwlist\nserver=/intel.cz/127.0.0.1#5335\nipset=/intel.cz/gfwlist\nserver=/applemalaysia.com.my/127.0.0.1#5335\nipset=/applemalaysia.com.my/gfwlist\nserver=/disneymusicpromotion.com/127.0.0.1#5335\nipset=/disneymusicpromotion.com/gfwlist\nserver=/applestore.ph/127.0.0.1#5335\nipset=/applestore.ph/gfwlist\nserver=/pages.dev/127.0.0.1#5335\nipset=/pages.dev/gfwlist\nserver=/paypal-apac.com/127.0.0.1#5335\nipset=/paypal-apac.com/gfwlist\nserver=/paypal-center.com/127.0.0.1#5335\nipset=/paypal-center.com/gfwlist\nserver=/iamremarkable.org/127.0.0.1#5335\nipset=/iamremarkable.org/gfwlist\nserver=/pornshare.biz/127.0.0.1#5335\nipset=/pornshare.biz/gfwlist\nserver=/adobecontent.io/127.0.0.1#5335\nipset=/adobecontent.io/gfwlist\nserver=/airwick.ch/127.0.0.1#5335\nipset=/airwick.ch/gfwlist\nserver=/ubuntu.net/127.0.0.1#5335\nipset=/ubuntu.net/gfwlist\nserver=/etheadphones.com/127.0.0.1#5335\nipset=/etheadphones.com/gfwlist\nserver=/fbfeedback.com/127.0.0.1#5335\nipset=/fbfeedback.com/gfwlist\nserver=/langsuirs.com/127.0.0.1#5335\nipset=/langsuirs.com/gfwlist\nserver=/microsoft.tv/127.0.0.1#5335\nipset=/microsoft.tv/gfwlist\nserver=/faseboox.com/127.0.0.1#5335\nipset=/faseboox.com/gfwlist\nserver=/img4.uk/127.0.0.1#5335\nipset=/img4.uk/gfwlist\nserver=/pictoa.com/127.0.0.1#5335\nipset=/pictoa.com/gfwlist\nserver=/jav24.com/127.0.0.1#5335\nipset=/jav24.com/gfwlist\nserver=/beastysexlinks.com/127.0.0.1#5335\nipset=/beastysexlinks.com/gfwlist\nserver=/calgon.ru/127.0.0.1#5335\nipset=/calgon.ru/gfwlist\nserver=/scitation.org/127.0.0.1#5335\nipset=/scitation.org/gfwlist\nserver=/sexykittenporn.com/127.0.0.1#5335\nipset=/sexykittenporn.com/gfwlist\nserver=/hentai.name/127.0.0.1#5335\nipset=/hentai.name/gfwlist\nserver=/latinaabuse.com/127.0.0.1#5335\nipset=/latinaabuse.com/gfwlist\nserver=/onlysiterip.com/127.0.0.1#5335\nipset=/onlysiterip.com/gfwlist\nserver=/volvobuses.us/127.0.0.1#5335\nipset=/volvobuses.us/gfwlist\nserver=/herokucharge.com/127.0.0.1#5335\nipset=/herokucharge.com/gfwlist\nserver=/nikereuseashoe.com/127.0.0.1#5335\nipset=/nikereuseashoe.com/gfwlist\nserver=/bmw-motorrad.gr/127.0.0.1#5335\nipset=/bmw-motorrad.gr/gfwlist\nserver=/bmw-konzernarchiv.de/127.0.0.1#5335\nipset=/bmw-konzernarchiv.de/gfwlist\nserver=/ashemaletv.com/127.0.0.1#5335\nipset=/ashemaletv.com/gfwlist\nserver=/4porn.com/127.0.0.1#5335\nipset=/4porn.com/gfwlist\nserver=/mingpaovan.com/127.0.0.1#5335\nipset=/mingpaovan.com/gfwlist\nserver=/itunesradio.tw/127.0.0.1#5335\nipset=/itunesradio.tw/gfwlist\nserver=/cixp.net/127.0.0.1#5335\nipset=/cixp.net/gfwlist\nserver=/htyj-bj.com/127.0.0.1#5335\nipset=/htyj-bj.com/gfwlist\nserver=/wikidot.com/127.0.0.1#5335\nipset=/wikidot.com/gfwlist\nserver=/sshs.club/127.0.0.1#5335\nipset=/sshs.club/gfwlist\nserver=/x1337x.eu/127.0.0.1#5335\nipset=/x1337x.eu/gfwlist\nserver=/firestone.co.cr/127.0.0.1#5335\nipset=/firestone.co.cr/gfwlist\nserver=/intel.nz/127.0.0.1#5335\nipset=/intel.nz/gfwlist\nserver=/atube.xxx/127.0.0.1#5335\nipset=/atube.xxx/gfwlist\nserver=/intel.com.ec/127.0.0.1#5335\nipset=/intel.com.ec/gfwlist\nserver=/pascherbeatsmonster.com/127.0.0.1#5335\nipset=/pascherbeatsmonster.com/gfwlist\nserver=/wholekidsfoundation.org/127.0.0.1#5335\nipset=/wholekidsfoundation.org/gfwlist\nserver=/parse.com/127.0.0.1#5335\nipset=/parse.com/gfwlist\nserver=/organicmaps.app/127.0.0.1#5335\nipset=/organicmaps.app/gfwlist\nserver=/doeda.com/127.0.0.1#5335\nipset=/doeda.com/gfwlist\nserver=/instastyle.tv/127.0.0.1#5335\nipset=/instastyle.tv/gfwlist\nserver=/ruby-lang.org/127.0.0.1#5335\nipset=/ruby-lang.org/gfwlist\nserver=/cmmedia.com.tw/127.0.0.1#5335\nipset=/cmmedia.com.tw/gfwlist\nserver=/google.gm/127.0.0.1#5335\nipset=/google.gm/gfwlist\nserver=/linear-abematv.akamaized.net/127.0.0.1#5335\nipset=/linear-abematv.akamaized.net/gfwlist\nserver=/fetishbank.net/127.0.0.1#5335\nipset=/fetishbank.net/gfwlist\nserver=/fightforux.com/127.0.0.1#5335\nipset=/fightforux.com/gfwlist\nserver=/pwmnet.com/127.0.0.1#5335\nipset=/pwmnet.com/gfwlist\nserver=/jerkmate.com/127.0.0.1#5335\nipset=/jerkmate.com/gfwlist\nserver=/fox7austin.com/127.0.0.1#5335\nipset=/fox7austin.com/gfwlist\nserver=/scala-lang.org/127.0.0.1#5335\nipset=/scala-lang.org/gfwlist\nserver=/disneyinflight.com/127.0.0.1#5335\nipset=/disneyinflight.com/gfwlist\nserver=/gamesstack.com/127.0.0.1#5335\nipset=/gamesstack.com/gfwlist\nserver=/volvotrucks.co.bw/127.0.0.1#5335\nipset=/volvotrucks.co.bw/gfwlist\nserver=/tiberiumalliances.com/127.0.0.1#5335\nipset=/tiberiumalliances.com/gfwlist\nserver=/kaamuu.com/127.0.0.1#5335\nipset=/kaamuu.com/gfwlist\nserver=/commandandconquer.com/127.0.0.1#5335\nipset=/commandandconquer.com/gfwlist\nserver=/finish.bg/127.0.0.1#5335\nipset=/finish.bg/gfwlist\nserver=/vporn.com/127.0.0.1#5335\nipset=/vporn.com/gfwlist\nserver=/bmw.com.ar/127.0.0.1#5335\nipset=/bmw.com.ar/gfwlist\nserver=/intel.co.cr/127.0.0.1#5335\nipset=/intel.co.cr/gfwlist\nserver=/kechtube.com/127.0.0.1#5335\nipset=/kechtube.com/gfwlist\nserver=/dreamforce.com/127.0.0.1#5335\nipset=/dreamforce.com/gfwlist\nserver=/beatsbydresstudio.com/127.0.0.1#5335\nipset=/beatsbydresstudio.com/gfwlist\nserver=/2beeg.me/127.0.0.1#5335\nipset=/2beeg.me/gfwlist\nserver=/google.com/127.0.0.1#5335\nipset=/google.com/gfwlist\nserver=/imzog.com/127.0.0.1#5335\nipset=/imzog.com/gfwlist\nserver=/swegold.com/127.0.0.1#5335\nipset=/swegold.com/gfwlist\nserver=/sexyfucking.ru/127.0.0.1#5335\nipset=/sexyfucking.ru/gfwlist\nserver=/sensualgirls.org/127.0.0.1#5335\nipset=/sensualgirls.org/gfwlist\nserver=/bululusexdoll.com/127.0.0.1#5335\nipset=/bululusexdoll.com/gfwlist\nserver=/ebaycourse.com/127.0.0.1#5335\nipset=/ebaycourse.com/gfwlist\nserver=/intel.sx/127.0.0.1#5335\nipset=/intel.sx/gfwlist\nserver=/12diasderegalosdeitunes.co.ni/127.0.0.1#5335\nipset=/12diasderegalosdeitunes.co.ni/gfwlist\nserver=/vanish.co.za/127.0.0.1#5335\nipset=/vanish.co.za/gfwlist\nserver=/alfera.com.my/127.0.0.1#5335\nipset=/alfera.com.my/gfwlist\nserver=/youtube.no/127.0.0.1#5335\nipset=/youtube.no/gfwlist\nserver=/woolite.com/127.0.0.1#5335\nipset=/woolite.com/gfwlist\nserver=/businessweekmag.com/127.0.0.1#5335\nipset=/businessweekmag.com/gfwlist\nserver=/fox23.com/127.0.0.1#5335\nipset=/fox23.com/gfwlist\nserver=/huobitoken.com/127.0.0.1#5335\nipset=/huobitoken.com/gfwlist\nserver=/thepornmap.com/127.0.0.1#5335\nipset=/thepornmap.com/gfwlist\nserver=/pokemonhome.com/127.0.0.1#5335\nipset=/pokemonhome.com/gfwlist\nserver=/77maott.com/127.0.0.1#5335\nipset=/77maott.com/gfwlist\nserver=/volvotrucks.lv/127.0.0.1#5335\nipset=/volvotrucks.lv/gfwlist\nserver=/modeltv.com/127.0.0.1#5335\nipset=/modeltv.com/gfwlist\nserver=/jpg4.pw/127.0.0.1#5335\nipset=/jpg4.pw/gfwlist\nserver=/facegbook.com/127.0.0.1#5335\nipset=/facegbook.com/gfwlist\nserver=/bmw-plant-munich.com/127.0.0.1#5335\nipset=/bmw-plant-munich.com/gfwlist\nserver=/appleone.film/127.0.0.1#5335\nipset=/appleone.film/gfwlist\nserver=/mini-georgia.com/127.0.0.1#5335\nipset=/mini-georgia.com/gfwlist\nserver=/fundraisingwithfacebook.com/127.0.0.1#5335\nipset=/fundraisingwithfacebook.com/gfwlist\nserver=/hpfeedback.com/127.0.0.1#5335\nipset=/hpfeedback.com/gfwlist\nserver=/leagueoflegends.net/127.0.0.1#5335\nipset=/leagueoflegends.net/gfwlist\nserver=/xxx-ways.com/127.0.0.1#5335\nipset=/xxx-ways.com/gfwlist\nserver=/youtube.al/127.0.0.1#5335\nipset=/youtube.al/gfwlist\nserver=/fetishes.cam/127.0.0.1#5335\nipset=/fetishes.cam/gfwlist\nserver=/webex.ca/127.0.0.1#5335\nipset=/webex.ca/gfwlist\nserver=/primevideo.cc/127.0.0.1#5335\nipset=/primevideo.cc/gfwlist\nserver=/streamporn.cc/127.0.0.1#5335\nipset=/streamporn.cc/gfwlist\nserver=/lecoin.cc/127.0.0.1#5335\nipset=/lecoin.cc/gfwlist\nserver=/ebay.de/127.0.0.1#5335\nipset=/ebay.de/gfwlist\nserver=/ameblo.jp/127.0.0.1#5335\nipset=/ameblo.jp/gfwlist\nserver=/miniso.pe/127.0.0.1#5335\nipset=/miniso.pe/gfwlist\nserver=/servicetalk.io/127.0.0.1#5335\nipset=/servicetalk.io/gfwlist\nserver=/facebooklogin.com/127.0.0.1#5335\nipset=/facebooklogin.com/gfwlist\nserver=/unityads.unity3d.com/127.0.0.1#5335\nipset=/unityads.unity3d.com/gfwlist\nserver=/beatsbydreinexpensive.com/127.0.0.1#5335\nipset=/beatsbydreinexpensive.com/gfwlist\nserver=/softbank-telecom.net/127.0.0.1#5335\nipset=/softbank-telecom.net/gfwlist\nserver=/ikea.com.de/127.0.0.1#5335\nipset=/ikea.com.de/gfwlist\nserver=/2bit8.com/127.0.0.1#5335\nipset=/2bit8.com/gfwlist\nserver=/rb-crisis.com/127.0.0.1#5335\nipset=/rb-crisis.com/gfwlist\nserver=/uug25.com/127.0.0.1#5335\nipset=/uug25.com/gfwlist\nserver=/alphabet.eu/127.0.0.1#5335\nipset=/alphabet.eu/gfwlist\nserver=/porn.to/127.0.0.1#5335\nipset=/porn.to/gfwlist\nserver=/vpornvideos.com/127.0.0.1#5335\nipset=/vpornvideos.com/gfwlist\nserver=/drunk6.com/127.0.0.1#5335\nipset=/drunk6.com/gfwlist\nserver=/vimeo-staging.com/127.0.0.1#5335\nipset=/vimeo-staging.com/gfwlist\nserver=/fbinc.com/127.0.0.1#5335\nipset=/fbinc.com/gfwlist\nserver=/dkk37.com/127.0.0.1#5335\nipset=/dkk37.com/gfwlist\nserver=/pinterest.kr/127.0.0.1#5335\nipset=/pinterest.kr/gfwlist\nserver=/vjmedia.com.hk/127.0.0.1#5335\nipset=/vjmedia.com.hk/gfwlist\nserver=/taose.tv/127.0.0.1#5335\nipset=/taose.tv/gfwlist\nserver=/bridgestone-plt-eng.com/127.0.0.1#5335\nipset=/bridgestone-plt-eng.com/gfwlist\nserver=/miniso.ma/127.0.0.1#5335\nipset=/miniso.ma/gfwlist\nserver=/dirtyleague.com/127.0.0.1#5335\nipset=/dirtyleague.com/gfwlist\nserver=/javmenu.com/127.0.0.1#5335\nipset=/javmenu.com/gfwlist\nserver=/getdirect.tv/127.0.0.1#5335\nipset=/getdirect.tv/gfwlist\nserver=/steampipe-kr.akamaized.net/127.0.0.1#5335\nipset=/steampipe-kr.akamaized.net/gfwlist\nserver=/adobeaemcloud.com/127.0.0.1#5335\nipset=/adobeaemcloud.com/gfwlist\nserver=/paypal.com/127.0.0.1#5335\nipset=/paypal.com/gfwlist\nserver=/crosswalk-project.net/127.0.0.1#5335\nipset=/crosswalk-project.net/gfwlist\nserver=/nikecloud.com/127.0.0.1#5335\nipset=/nikecloud.com/gfwlist\nserver=/easportsworld.com/127.0.0.1#5335\nipset=/easportsworld.com/gfwlist\nserver=/starbuckspoq.com/127.0.0.1#5335\nipset=/starbuckspoq.com/gfwlist\nserver=/binancezh.mobi/127.0.0.1#5335\nipset=/binancezh.mobi/gfwlist\nserver=/twinprime.com/127.0.0.1#5335\nipset=/twinprime.com/gfwlist\nserver=/179na.com/127.0.0.1#5335\nipset=/179na.com/gfwlist\nserver=/adidas.be/127.0.0.1#5335\nipset=/adidas.be/gfwlist\nserver=/googleventures.com/127.0.0.1#5335\nipset=/googleventures.com/gfwlist\nserver=/camvideos.org/127.0.0.1#5335\nipset=/camvideos.org/gfwlist\nserver=/beatsheadphonesforcheap.net/127.0.0.1#5335\nipset=/beatsheadphonesforcheap.net/gfwlist\nserver=/tubetop69.com/127.0.0.1#5335\nipset=/tubetop69.com/gfwlist\nserver=/cloudinsights.com/127.0.0.1#5335\nipset=/cloudinsights.com/gfwlist\nserver=/joysporn.com/127.0.0.1#5335\nipset=/joysporn.com/gfwlist\nserver=/bmwvalueservice.com/127.0.0.1#5335\nipset=/bmwvalueservice.com/gfwlist\nserver=/visa.com.vc/127.0.0.1#5335\nipset=/visa.com.vc/gfwlist\nserver=/finish.co.za/127.0.0.1#5335\nipset=/finish.co.za/gfwlist\nserver=/incestvidz.com/127.0.0.1#5335\nipset=/incestvidz.com/gfwlist\nserver=/beatsbydresales.us/127.0.0.1#5335\nipset=/beatsbydresales.us/gfwlist\nserver=/openresty.org/127.0.0.1#5335\nipset=/openresty.org/gfwlist\nserver=/canon.pt/127.0.0.1#5335\nipset=/canon.pt/gfwlist\nserver=/canon.fi/127.0.0.1#5335\nipset=/canon.fi/gfwlist\nserver=/globalsign.ch/127.0.0.1#5335\nipset=/globalsign.ch/gfwlist\nserver=/artstor.org/127.0.0.1#5335\nipset=/artstor.org/gfwlist\nserver=/thefoxnation.com/127.0.0.1#5335\nipset=/thefoxnation.com/gfwlist\nserver=/3pornstarmovies.com/127.0.0.1#5335\nipset=/3pornstarmovies.com/gfwlist\nserver=/jmcomic1.me/127.0.0.1#5335\nipset=/jmcomic1.me/gfwlist\nserver=/ieeefoundation.org/127.0.0.1#5335\nipset=/ieeefoundation.org/gfwlist\nserver=/pornjk.com/127.0.0.1#5335\nipset=/pornjk.com/gfwlist\nserver=/baterias-hp.com/127.0.0.1#5335\nipset=/baterias-hp.com/gfwlist\nserver=/ipad.de/127.0.0.1#5335\nipset=/ipad.de/gfwlist\nserver=/xn--x-qeu1ji09tzlg.net/127.0.0.1#5335\nipset=/xn--x-qeu1ji09tzlg.net/gfwlist\nserver=/porno.org.in/127.0.0.1#5335\nipset=/porno.org.in/gfwlist\nserver=/miniso-nz.com/127.0.0.1#5335\nipset=/miniso-nz.com/gfwlist\nserver=/worldscientific.com/127.0.0.1#5335\nipset=/worldscientific.com/gfwlist\nserver=/mypornadviser.com/127.0.0.1#5335\nipset=/mypornadviser.com/gfwlist\nserver=/bmw-motorrad.rs/127.0.0.1#5335\nipset=/bmw-motorrad.rs/gfwlist\nserver=/bestbuycanadaltd.ca/127.0.0.1#5335\nipset=/bestbuycanadaltd.ca/gfwlist\nserver=/ebay.jp/127.0.0.1#5335\nipset=/ebay.jp/gfwlist\nserver=/momon-ga.com/127.0.0.1#5335\nipset=/momon-ga.com/gfwlist\nserver=/x.co/127.0.0.1#5335\nipset=/x.co/gfwlist\nserver=/pornultras.com/127.0.0.1#5335\nipset=/pornultras.com/gfwlist\nserver=/t.co/127.0.0.1#5335\nipset=/t.co/gfwlist\nserver=/uun98.com/127.0.0.1#5335\nipset=/uun98.com/gfwlist\nserver=/netacad.net/127.0.0.1#5335\nipset=/netacad.net/gfwlist\nserver=/couplecam.co.uk/127.0.0.1#5335\nipset=/couplecam.co.uk/gfwlist\nserver=/placesdocs.com/127.0.0.1#5335\nipset=/placesdocs.com/gfwlist\nserver=/vimeogoods.com/127.0.0.1#5335\nipset=/vimeogoods.com/gfwlist\nserver=/dropboxforums.com/127.0.0.1#5335\nipset=/dropboxforums.com/gfwlist\nserver=/g.co/127.0.0.1#5335\nipset=/g.co/gfwlist\nserver=/lolfanart.net/127.0.0.1#5335\nipset=/lolfanart.net/gfwlist\nserver=/pixiv.me/127.0.0.1#5335\nipset=/pixiv.me/gfwlist\nserver=/iphoto.wang/127.0.0.1#5335\nipset=/iphoto.wang/gfwlist\nserver=/nasty.singles/127.0.0.1#5335\nipset=/nasty.singles/gfwlist\nserver=/bmw.az/127.0.0.1#5335\nipset=/bmw.az/gfwlist\nserver=/lihksnap.com/127.0.0.1#5335\nipset=/lihksnap.com/gfwlist\nserver=/ck101.com/127.0.0.1#5335\nipset=/ck101.com/gfwlist\nserver=/bestbuytradein.com/127.0.0.1#5335\nipset=/bestbuytradein.com/gfwlist\nserver=/paypalcorp.com/127.0.0.1#5335\nipset=/paypalcorp.com/gfwlist\nserver=/wtfpeople.com/127.0.0.1#5335\nipset=/wtfpeople.com/gfwlist\nserver=/developer.microsoft.com/127.0.0.1#5335\nipset=/developer.microsoft.com/gfwlist\nserver=/selectanescort.com/127.0.0.1#5335\nipset=/selectanescort.com/gfwlist\nserver=/vector.im/127.0.0.1#5335\nipset=/vector.im/gfwlist\nserver=/dgg.gg/127.0.0.1#5335\nipset=/dgg.gg/gfwlist\nserver=/adgoogle.net/127.0.0.1#5335\nipset=/adgoogle.net/gfwlist\nserver=/oath.com/127.0.0.1#5335\nipset=/oath.com/gfwlist\nserver=/thepornbin.com/127.0.0.1#5335\nipset=/thepornbin.com/gfwlist\nserver=/thetranny.com/127.0.0.1#5335\nipset=/thetranny.com/gfwlist\nserver=/alphabet.co.uk/127.0.0.1#5335\nipset=/alphabet.co.uk/gfwlist\nserver=/thesun.ie/127.0.0.1#5335\nipset=/thesun.ie/gfwlist\nserver=/frprn.com/127.0.0.1#5335\nipset=/frprn.com/gfwlist\nserver=/tufos.com.br/127.0.0.1#5335\nipset=/tufos.com.br/gfwlist\nserver=/hdporncomics.com/127.0.0.1#5335\nipset=/hdporncomics.com/gfwlist\nserver=/intel.gs/127.0.0.1#5335\nipset=/intel.gs/gfwlist\nserver=/cups.org/127.0.0.1#5335\nipset=/cups.org/gfwlist\nserver=/opera.com/127.0.0.1#5335\nipset=/opera.com/gfwlist\nserver=/applestore.ch/127.0.0.1#5335\nipset=/applestore.ch/gfwlist\nserver=/monsterdrebeats-usa.com/127.0.0.1#5335\nipset=/monsterdrebeats-usa.com/gfwlist\nserver=/freessl.com/127.0.0.1#5335\nipset=/freessl.com/gfwlist\nserver=/postegro.it/127.0.0.1#5335\nipset=/postegro.it/gfwlist\nserver=/75m.co/127.0.0.1#5335\nipset=/75m.co/gfwlist\nserver=/freewechat.com/127.0.0.1#5335\nipset=/freewechat.com/gfwlist\nserver=/atubex.com/127.0.0.1#5335\nipset=/atubex.com/gfwlist\nserver=/thehentaiworld.com/127.0.0.1#5335\nipset=/thehentaiworld.com/gfwlist\nserver=/mini.com.ph/127.0.0.1#5335\nipset=/mini.com.ph/gfwlist\nserver=/johren.net/127.0.0.1#5335\nipset=/johren.net/gfwlist\nserver=/shopifycdn.com/127.0.0.1#5335\nipset=/shopifycdn.com/gfwlist\nserver=/hdzog.com/127.0.0.1#5335\nipset=/hdzog.com/gfwlist\nserver=/fqcebook.com/127.0.0.1#5335\nipset=/fqcebook.com/gfwlist\nserver=/edgedatg.com/127.0.0.1#5335\nipset=/edgedatg.com/gfwlist\nserver=/freepornhdonlinegay.com/127.0.0.1#5335\nipset=/freepornhdonlinegay.com/gfwlist\nserver=/dealtree.org/127.0.0.1#5335\nipset=/dealtree.org/gfwlist\nserver=/ohgratisporrfilm.com/127.0.0.1#5335\nipset=/ohgratisporrfilm.com/gfwlist\nserver=/manhuntdaily.com/127.0.0.1#5335\nipset=/manhuntdaily.com/gfwlist\nserver=/att-rsvp.com/127.0.0.1#5335\nipset=/att-rsvp.com/gfwlist\nserver=/bmw-connecteddrive.jp/127.0.0.1#5335\nipset=/bmw-connecteddrive.jp/gfwlist\nserver=/v2ph.com/127.0.0.1#5335\nipset=/v2ph.com/gfwlist\nserver=/porzo.com/127.0.0.1#5335\nipset=/porzo.com/gfwlist\nserver=/app-measurement.com/127.0.0.1#5335\nipset=/app-measurement.com/gfwlist\nserver=/beatsforme.com/127.0.0.1#5335\nipset=/beatsforme.com/gfwlist\nserver=/typesquare.com/127.0.0.1#5335\nipset=/typesquare.com/gfwlist\nserver=/ashemaletube.com/127.0.0.1#5335\nipset=/ashemaletube.com/gfwlist\nserver=/azureiotsolutions.com/127.0.0.1#5335\nipset=/azureiotsolutions.com/gfwlist\nserver=/shywifeswap.com/127.0.0.1#5335\nipset=/shywifeswap.com/gfwlist\nserver=/applw.com/127.0.0.1#5335\nipset=/applw.com/gfwlist\nserver=/airwick.pt/127.0.0.1#5335\nipset=/airwick.pt/gfwlist\nserver=/snapstore.io/127.0.0.1#5335\nipset=/snapstore.io/gfwlist\nserver=/clickedu.co.uk/127.0.0.1#5335\nipset=/clickedu.co.uk/gfwlist\nserver=/firebaseio.com/127.0.0.1#5335\nipset=/firebaseio.com/gfwlist\nserver=/mastercard.com.ng/127.0.0.1#5335\nipset=/mastercard.com.ng/gfwlist\nserver=/hpwsn.com/127.0.0.1#5335\nipset=/hpwsn.com/gfwlist\nserver=/acgdv.com/127.0.0.1#5335\nipset=/acgdv.com/gfwlist\nserver=/geotrust.com/127.0.0.1#5335\nipset=/geotrust.com/gfwlist\nserver=/cheapbeatsie.com/127.0.0.1#5335\nipset=/cheapbeatsie.com/gfwlist\nserver=/mortein.com.au/127.0.0.1#5335\nipset=/mortein.com.au/gfwlist\nserver=/starbucks.co.th/127.0.0.1#5335\nipset=/starbucks.co.th/gfwlist\nserver=/realclearreligion.org/127.0.0.1#5335\nipset=/realclearreligion.org/gfwlist\nserver=/eroelog.com/127.0.0.1#5335\nipset=/eroelog.com/gfwlist\nserver=/publichealthdepartment.info/127.0.0.1#5335\nipset=/publichealthdepartment.info/gfwlist\nserver=/ebayrtm.com/127.0.0.1#5335\nipset=/ebayrtm.com/gfwlist\nserver=/guccimuseo.com/127.0.0.1#5335\nipset=/guccimuseo.com/gfwlist\nserver=/businessweekly.com.tw/127.0.0.1#5335\nipset=/businessweekly.com.tw/gfwlist\nserver=/intel.re/127.0.0.1#5335\nipset=/intel.re/gfwlist\nserver=/apple.uk/127.0.0.1#5335\nipset=/apple.uk/gfwlist\nserver=/passion.com/127.0.0.1#5335\nipset=/passion.com/gfwlist\nserver=/good-gay.com/127.0.0.1#5335\nipset=/good-gay.com/gfwlist\nserver=/google.hn/127.0.0.1#5335\nipset=/google.hn/gfwlist\nserver=/news.com.au/127.0.0.1#5335\nipset=/news.com.au/gfwlist\nserver=/hongkongfp.com/127.0.0.1#5335\nipset=/hongkongfp.com/gfwlist\nserver=/geeksquadwebroot.org/127.0.0.1#5335\nipset=/geeksquadwebroot.org/gfwlist\nserver=/imagefap.com/127.0.0.1#5335\nipset=/imagefap.com/gfwlist\nserver=/google.com.uy/127.0.0.1#5335\nipset=/google.com.uy/gfwlist\nserver=/foxsportsnetmilwaukee.com/127.0.0.1#5335\nipset=/foxsportsnetmilwaukee.com/gfwlist\nserver=/mikuexpo.com/127.0.0.1#5335\nipset=/mikuexpo.com/gfwlist\nserver=/intel.ph/127.0.0.1#5335\nipset=/intel.ph/gfwlist\nserver=/matrix.to/127.0.0.1#5335\nipset=/matrix.to/gfwlist\nserver=/alhs.xyz/127.0.0.1#5335\nipset=/alhs.xyz/gfwlist\nserver=/hpmarketplace.com/127.0.0.1#5335\nipset=/hpmarketplace.com/gfwlist\nserver=/nicomanga.jp/127.0.0.1#5335\nipset=/nicomanga.jp/gfwlist\nserver=/tubelombia.net/127.0.0.1#5335\nipset=/tubelombia.net/gfwlist\nserver=/thecandidbay.com/127.0.0.1#5335\nipset=/thecandidbay.com/gfwlist\nserver=/igaychat.com/127.0.0.1#5335\nipset=/igaychat.com/gfwlist\nserver=/epochweek.com/127.0.0.1#5335\nipset=/epochweek.com/gfwlist\nserver=/mingpao.com/127.0.0.1#5335\nipset=/mingpao.com/gfwlist\nserver=/comicsporno.es/127.0.0.1#5335\nipset=/comicsporno.es/gfwlist\nserver=/awflapp.top/127.0.0.1#5335\nipset=/awflapp.top/gfwlist\nserver=/hentaidude.xxx/127.0.0.1#5335\nipset=/hentaidude.xxx/gfwlist\nserver=/aspnetcdn.com/127.0.0.1#5335\nipset=/aspnetcdn.com/gfwlist\nserver=/faronics.tech/127.0.0.1#5335\nipset=/faronics.tech/gfwlist\nserver=/12diasderegalosdeitunes.com.ve/127.0.0.1#5335\nipset=/12diasderegalosdeitunes.com.ve/gfwlist\nserver=/applesurveys.com/127.0.0.1#5335\nipset=/applesurveys.com/gfwlist\nserver=/minimoncton.ca/127.0.0.1#5335\nipset=/minimoncton.ca/gfwlist\nserver=/gettyimages.no/127.0.0.1#5335\nipset=/gettyimages.no/gfwlist\nserver=/acrobat.com/127.0.0.1#5335\nipset=/acrobat.com/gfwlist\nserver=/czechstreets.com/127.0.0.1#5335\nipset=/czechstreets.com/gfwlist\nserver=/tmsnrt.rs/127.0.0.1#5335\nipset=/tmsnrt.rs/gfwlist\nserver=/hotmovs.com/127.0.0.1#5335\nipset=/hotmovs.com/gfwlist\nserver=/ashleysageellison.com/127.0.0.1#5335\nipset=/ashleysageellison.com/gfwlist\nserver=/ocsp-responder.com/127.0.0.1#5335\nipset=/ocsp-responder.com/gfwlist\nserver=/myanmar-porn.com/127.0.0.1#5335\nipset=/myanmar-porn.com/gfwlist\nserver=/sexmutant.com/127.0.0.1#5335\nipset=/sexmutant.com/gfwlist\nserver=/pokemonbw.com/127.0.0.1#5335\nipset=/pokemonbw.com/gfwlist\nserver=/sexbq.com/127.0.0.1#5335\nipset=/sexbq.com/gfwlist\nserver=/vmwarestuff.com/127.0.0.1#5335\nipset=/vmwarestuff.com/gfwlist\nserver=/bmwcharitygolf.com/127.0.0.1#5335\nipset=/bmwcharitygolf.com/gfwlist\nserver=/men18.net/127.0.0.1#5335\nipset=/men18.net/gfwlist\nserver=/machotube.tv/127.0.0.1#5335\nipset=/machotube.tv/gfwlist\nserver=/dellcdn.com/127.0.0.1#5335\nipset=/dellcdn.com/gfwlist\nserver=/parastorage.com/127.0.0.1#5335\nipset=/parastorage.com/gfwlist\nserver=/applenewsformat.com/127.0.0.1#5335\nipset=/applenewsformat.com/gfwlist\nserver=/pokemonchampionships.com/127.0.0.1#5335\nipset=/pokemonchampionships.com/gfwlist\nserver=/putinho.net/127.0.0.1#5335\nipset=/putinho.net/gfwlist\nserver=/itsbetterwhenyouwinit.com/127.0.0.1#5335\nipset=/itsbetterwhenyouwinit.com/gfwlist\nserver=/51mh.app/127.0.0.1#5335\nipset=/51mh.app/gfwlist\nserver=/porn91.org/127.0.0.1#5335\nipset=/porn91.org/gfwlist\nserver=/appleappstore.net/127.0.0.1#5335\nipset=/appleappstore.net/gfwlist\nserver=/corbinfisher.com/127.0.0.1#5335\nipset=/corbinfisher.com/gfwlist\nserver=/incestflix.com/127.0.0.1#5335\nipset=/incestflix.com/gfwlist\nserver=/bighead.group/127.0.0.1#5335\nipset=/bighead.group/gfwlist\nserver=/trixhentai.com/127.0.0.1#5335\nipset=/trixhentai.com/gfwlist\nserver=/xnalgas.com/127.0.0.1#5335\nipset=/xnalgas.com/gfwlist\nserver=/umass.edu/127.0.0.1#5335\nipset=/umass.edu/gfwlist\nserver=/rakuten.co.jp/127.0.0.1#5335\nipset=/rakuten.co.jp/gfwlist\nserver=/google.li/127.0.0.1#5335\nipset=/google.li/gfwlist\nserver=/adobesigncdn.com/127.0.0.1#5335\nipset=/adobesigncdn.com/gfwlist\nserver=/verisign.se/127.0.0.1#5335\nipset=/verisign.se/gfwlist\nserver=/ideal-teens.com/127.0.0.1#5335\nipset=/ideal-teens.com/gfwlist\nserver=/monsterbeatsbydrdrestudio.com/127.0.0.1#5335\nipset=/monsterbeatsbydrdrestudio.com/gfwlist\nserver=/javscatsex.com/127.0.0.1#5335\nipset=/javscatsex.com/gfwlist\nserver=/dtvce.com/127.0.0.1#5335\nipset=/dtvce.com/gfwlist\nserver=/cs4hs.com/127.0.0.1#5335\nipset=/cs4hs.com/gfwlist\nserver=/mm9c63ae.xyz/127.0.0.1#5335\nipset=/mm9c63ae.xyz/gfwlist\nserver=/microsoftstore.com/127.0.0.1#5335\nipset=/microsoftstore.com/gfwlist\nserver=/bandpage.com/127.0.0.1#5335\nipset=/bandpage.com/gfwlist\nserver=/prothots.com/127.0.0.1#5335\nipset=/prothots.com/gfwlist\nserver=/heroesofdragonage.com/127.0.0.1#5335\nipset=/heroesofdragonage.com/gfwlist\nserver=/chengjuanseo.com/127.0.0.1#5335\nipset=/chengjuanseo.com/gfwlist\nserver=/pornjav.org/127.0.0.1#5335\nipset=/pornjav.org/gfwlist\nserver=/darivoa.com/127.0.0.1#5335\nipset=/darivoa.com/gfwlist\nserver=/myhomemadesex.com/127.0.0.1#5335\nipset=/myhomemadesex.com/gfwlist\nserver=/foxsports-newyork.com/127.0.0.1#5335\nipset=/foxsports-newyork.com/gfwlist\nserver=/18qt.com/127.0.0.1#5335\nipset=/18qt.com/gfwlist\nserver=/bmw-motorrad-motorsport.com/127.0.0.1#5335\nipset=/bmw-motorrad-motorsport.com/gfwlist\nserver=/nature.com/127.0.0.1#5335\nipset=/nature.com/gfwlist\nserver=/huluspain.com/127.0.0.1#5335\nipset=/huluspain.com/gfwlist\nserver=/golang.com/127.0.0.1#5335\nipset=/golang.com/gfwlist\nserver=/ebayenterprise.tv/127.0.0.1#5335\nipset=/ebayenterprise.tv/gfwlist\nserver=/sankei.co.jp/127.0.0.1#5335\nipset=/sankei.co.jp/gfwlist\nserver=/emojipedia.org/127.0.0.1#5335\nipset=/emojipedia.org/gfwlist\nserver=/facebool.info/127.0.0.1#5335\nipset=/facebool.info/gfwlist\nserver=/privacytools.io/127.0.0.1#5335\nipset=/privacytools.io/gfwlist\nserver=/jiayoulu.com/127.0.0.1#5335\nipset=/jiayoulu.com/gfwlist\nserver=/miniso.jp/127.0.0.1#5335\nipset=/miniso.jp/gfwlist\nserver=/ebaysweden.com/127.0.0.1#5335\nipset=/ebaysweden.com/gfwlist\nserver=/pearsonclinical.be/127.0.0.1#5335\nipset=/pearsonclinical.be/gfwlist\nserver=/wal.co/127.0.0.1#5335\nipset=/wal.co/gfwlist\nserver=/sony.ro/127.0.0.1#5335\nipset=/sony.ro/gfwlist\nserver=/blackshemalevideo.com/127.0.0.1#5335\nipset=/blackshemalevideo.com/gfwlist\nserver=/xbooru.com/127.0.0.1#5335\nipset=/xbooru.com/gfwlist\nserver=/globalsign.es/127.0.0.1#5335\nipset=/globalsign.es/gfwlist\nserver=/directvatlantaga.com/127.0.0.1#5335\nipset=/directvatlantaga.com/gfwlist\nserver=/enemarotica.com/127.0.0.1#5335\nipset=/enemarotica.com/gfwlist\nserver=/hbomax.com/127.0.0.1#5335\nipset=/hbomax.com/gfwlist\nserver=/xboxlive.com/127.0.0.1#5335\nipset=/xboxlive.com/gfwlist\nserver=/visaeverywhereshop.com/127.0.0.1#5335\nipset=/visaeverywhereshop.com/gfwlist\nserver=/riotcdn.net/127.0.0.1#5335\nipset=/riotcdn.net/gfwlist\nserver=/sankei-call.jp/127.0.0.1#5335\nipset=/sankei-call.jp/gfwlist\nserver=/drebeatssite.com/127.0.0.1#5335\nipset=/drebeatssite.com/gfwlist\nserver=/pleasuremore.com/127.0.0.1#5335\nipset=/pleasuremore.com/gfwlist\nserver=/3789av.com/127.0.0.1#5335\nipset=/3789av.com/gfwlist\nserver=/2789av.com/127.0.0.1#5335\nipset=/2789av.com/gfwlist\nserver=/britsexcash.com/127.0.0.1#5335\nipset=/britsexcash.com/gfwlist\nserver=/pornreactor.cc/127.0.0.1#5335\nipset=/pornreactor.cc/gfwlist\nserver=/veet.tv/127.0.0.1#5335\nipset=/veet.tv/gfwlist\nserver=/iproperty.com.sg/127.0.0.1#5335\nipset=/iproperty.com.sg/gfwlist\nserver=/bmw-auslieferungszentrum.com/127.0.0.1#5335\nipset=/bmw-auslieferungszentrum.com/gfwlist\nserver=/visadns.com/127.0.0.1#5335\nipset=/visadns.com/gfwlist\nserver=/feedherfuckher.com/127.0.0.1#5335\nipset=/feedherfuckher.com/gfwlist\nserver=/fgirl.ch/127.0.0.1#5335\nipset=/fgirl.ch/gfwlist\nserver=/softbankhawksstore.jp/127.0.0.1#5335\nipset=/softbankhawksstore.jp/gfwlist\nserver=/pearsonclinical.se/127.0.0.1#5335\nipset=/pearsonclinical.se/gfwlist\nserver=/heartbreakers.info/127.0.0.1#5335\nipset=/heartbreakers.info/gfwlist\nserver=/ikea.bg/127.0.0.1#5335\nipset=/ikea.bg/gfwlist\nserver=/volvobuses.hu/127.0.0.1#5335\nipset=/volvobuses.hu/gfwlist\nserver=/wiifit.com/127.0.0.1#5335\nipset=/wiifit.com/gfwlist\nserver=/samsungqbe.com/127.0.0.1#5335\nipset=/samsungqbe.com/gfwlist\nserver=/bzazi.com/127.0.0.1#5335\nipset=/bzazi.com/gfwlist\nserver=/x-artvideo.net/127.0.0.1#5335\nipset=/x-artvideo.net/gfwlist\nserver=/yandex.pl/127.0.0.1#5335\nipset=/yandex.pl/gfwlist\nserver=/wikia.org/127.0.0.1#5335\nipset=/wikia.org/gfwlist\nserver=/bidong9.com/127.0.0.1#5335\nipset=/bidong9.com/gfwlist\nserver=/sandisk.co.kr/127.0.0.1#5335\nipset=/sandisk.co.kr/gfwlist\nserver=/veporno.net/127.0.0.1#5335\nipset=/veporno.net/gfwlist\nserver=/darwinsource.org/127.0.0.1#5335\nipset=/darwinsource.org/gfwlist\nserver=/ciscoconnectcloud.com/127.0.0.1#5335\nipset=/ciscoconnectcloud.com/gfwlist\nserver=/avmoo.click/127.0.0.1#5335\nipset=/avmoo.click/gfwlist\nserver=/sae.org/127.0.0.1#5335\nipset=/sae.org/gfwlist\nserver=/chatwhores.com/127.0.0.1#5335\nipset=/chatwhores.com/gfwlist\nserver=/meetyourdevices.com/127.0.0.1#5335\nipset=/meetyourdevices.com/gfwlist\nserver=/visa.sk/127.0.0.1#5335\nipset=/visa.sk/gfwlist\nserver=/mini.com.bn/127.0.0.1#5335\nipset=/mini.com.bn/gfwlist\nserver=/facebookphoto.com/127.0.0.1#5335\nipset=/facebookphoto.com/gfwlist\nserver=/mywaytopay.net/127.0.0.1#5335\nipset=/mywaytopay.net/gfwlist\nserver=/jpav.us/127.0.0.1#5335\nipset=/jpav.us/gfwlist\nserver=/clearasil.us/127.0.0.1#5335\nipset=/clearasil.us/gfwlist\nserver=/just.xxx/127.0.0.1#5335\nipset=/just.xxx/gfwlist\nserver=/naturalvoices.com/127.0.0.1#5335\nipset=/naturalvoices.com/gfwlist\nserver=/freegaypornhdtube.com/127.0.0.1#5335\nipset=/freegaypornhdtube.com/gfwlist\nserver=/google.sm/127.0.0.1#5335\nipset=/google.sm/gfwlist\nserver=/vilavpn6.xyz/127.0.0.1#5335\nipset=/vilavpn6.xyz/gfwlist\nserver=/xxbb9.com/127.0.0.1#5335\nipset=/xxbb9.com/gfwlist\nserver=/youtube.com.gt/127.0.0.1#5335\nipset=/youtube.com.gt/gfwlist\nserver=/applepodcasts.com/127.0.0.1#5335\nipset=/applepodcasts.com/gfwlist\nserver=/google.com.eg/127.0.0.1#5335\nipset=/google.com.eg/gfwlist\nserver=/ebalovo.com/127.0.0.1#5335\nipset=/ebalovo.com/gfwlist\nserver=/thieme.de/127.0.0.1#5335\nipset=/thieme.de/gfwlist\nserver=/openjsf.org/127.0.0.1#5335\nipset=/openjsf.org/gfwlist\nserver=/youassporn.com/127.0.0.1#5335\nipset=/youassporn.com/gfwlist\nserver=/85st.com/127.0.0.1#5335\nipset=/85st.com/gfwlist\nserver=/binance.net/127.0.0.1#5335\nipset=/binance.net/gfwlist\nserver=/projectmurphy.net/127.0.0.1#5335\nipset=/projectmurphy.net/gfwlist\nserver=/paypal-mobilemoney.com/127.0.0.1#5335\nipset=/paypal-mobilemoney.com/gfwlist\nserver=/goldgay.tv/127.0.0.1#5335\nipset=/goldgay.tv/gfwlist\nserver=/google.ci/127.0.0.1#5335\nipset=/google.ci/gfwlist\nserver=/duckduckgo.uk/127.0.0.1#5335\nipset=/duckduckgo.uk/gfwlist\nserver=/bdsm.com/127.0.0.1#5335\nipset=/bdsm.com/gfwlist\nserver=/frostbite.com/127.0.0.1#5335\nipset=/frostbite.com/gfwlist\nserver=/justporno.tv/127.0.0.1#5335\nipset=/justporno.tv/gfwlist\nserver=/googlevideo.com/127.0.0.1#5335\nipset=/googlevideo.com/gfwlist\nserver=/dacebook.com/127.0.0.1#5335\nipset=/dacebook.com/gfwlist\nserver=/thecuckold.com/127.0.0.1#5335\nipset=/thecuckold.com/gfwlist\nserver=/bmw-i-pure-impulse.com/127.0.0.1#5335\nipset=/bmw-i-pure-impulse.com/gfwlist\nserver=/simonsgirls.com/127.0.0.1#5335\nipset=/simonsgirls.com/gfwlist\nserver=/mysdn.net/127.0.0.1#5335\nipset=/mysdn.net/gfwlist\nserver=/mailhealth.com/127.0.0.1#5335\nipset=/mailhealth.com/gfwlist\nserver=/gacebook.com/127.0.0.1#5335\nipset=/gacebook.com/gfwlist\nserver=/facebook.com/127.0.0.1#5335\nipset=/facebook.com/gfwlist\nserver=/skysportsonline.com/127.0.0.1#5335\nipset=/skysportsonline.com/gfwlist\nserver=/hp3dprinter.com/127.0.0.1#5335\nipset=/hp3dprinter.com/gfwlist\nserver=/iphone.es/127.0.0.1#5335\nipset=/iphone.es/gfwlist\nserver=/nichepornsite.com/127.0.0.1#5335\nipset=/nichepornsite.com/gfwlist\nserver=/bmw.co.nz/127.0.0.1#5335\nipset=/bmw.co.nz/gfwlist\nserver=/bitstamp.net/127.0.0.1#5335\nipset=/bitstamp.net/gfwlist\nserver=/microsoft.se/127.0.0.1#5335\nipset=/microsoft.se/gfwlist\nserver=/ieee.ca/127.0.0.1#5335\nipset=/ieee.ca/gfwlist\nserver=/wireshark.org/127.0.0.1#5335\nipset=/wireshark.org/gfwlist\nserver=/bmw-motorrad.lu/127.0.0.1#5335\nipset=/bmw-motorrad.lu/gfwlist\nserver=/redditmedia.com/127.0.0.1#5335\nipset=/redditmedia.com/gfwlist\nserver=/nationalgeographicpartners.com/127.0.0.1#5335\nipset=/nationalgeographicpartners.com/gfwlist\nserver=/applestore.com.pl/127.0.0.1#5335\nipset=/applestore.com.pl/gfwlist\nserver=/foxla.com/127.0.0.1#5335\nipset=/foxla.com/gfwlist\nserver=/paypal-labs.com/127.0.0.1#5335\nipset=/paypal-labs.com/gfwlist\nserver=/conscrypt.com/127.0.0.1#5335\nipset=/conscrypt.com/gfwlist\nserver=/rebates.jp/127.0.0.1#5335\nipset=/rebates.jp/gfwlist\nserver=/guruofporn.com/127.0.0.1#5335\nipset=/guruofporn.com/gfwlist\nserver=/sony.com.ec/127.0.0.1#5335\nipset=/sony.com.ec/gfwlist\nserver=/pimg.tw/127.0.0.1#5335\nipset=/pimg.tw/gfwlist\nserver=/pornuj.cz/127.0.0.1#5335\nipset=/pornuj.cz/gfwlist\nserver=/hipaa6020.com/127.0.0.1#5335\nipset=/hipaa6020.com/gfwlist\nserver=/xxvids.net/127.0.0.1#5335\nipset=/xxvids.net/gfwlist\nserver=/dot-mac.de/127.0.0.1#5335\nipset=/dot-mac.de/gfwlist\nserver=/nytcn.me/127.0.0.1#5335\nipset=/nytcn.me/gfwlist\nserver=/foxstudiolot.com/127.0.0.1#5335\nipset=/foxstudiolot.com/gfwlist\nserver=/speybay.com/127.0.0.1#5335\nipset=/speybay.com/gfwlist\nserver=/rbc007.com/127.0.0.1#5335\nipset=/rbc007.com/gfwlist\nserver=/directtv-dish.com/127.0.0.1#5335\nipset=/directtv-dish.com/gfwlist\nserver=/hentaivn.la/127.0.0.1#5335\nipset=/hentaivn.la/gfwlist\nserver=/dl-iphone.com/127.0.0.1#5335\nipset=/dl-iphone.com/gfwlist\nserver=/thefind.com/127.0.0.1#5335\nipset=/thefind.com/gfwlist\nserver=/gamcore.com/127.0.0.1#5335\nipset=/gamcore.com/gfwlist\nserver=/bridgestoneperformancemedia.net/127.0.0.1#5335\nipset=/bridgestoneperformancemedia.net/gfwlist\nserver=/vmwarevmc.com/127.0.0.1#5335\nipset=/vmwarevmc.com/gfwlist\nserver=/gogoanime.vc/127.0.0.1#5335\nipset=/gogoanime.vc/gfwlist\nserver=/vfsco.de/127.0.0.1#5335\nipset=/vfsco.de/gfwlist\nserver=/hentai4manga.com/127.0.0.1#5335\nipset=/hentai4manga.com/gfwlist\nserver=/freebsd.org/127.0.0.1#5335\nipset=/freebsd.org/gfwlist\nserver=/sonorousporn.com/127.0.0.1#5335\nipset=/sonorousporn.com/gfwlist\nserver=/qualcomm.co.jp/127.0.0.1#5335\nipset=/qualcomm.co.jp/gfwlist\nserver=/ruten.com.tw/127.0.0.1#5335\nipset=/ruten.com.tw/gfwlist\nserver=/factograph.info/127.0.0.1#5335\nipset=/factograph.info/gfwlist\nserver=/verisign.com.tw/127.0.0.1#5335\nipset=/verisign.com.tw/gfwlist\nserver=/yahoo.co.ve/127.0.0.1#5335\nipset=/yahoo.co.ve/gfwlist\nserver=/wikia.nocookie.net/127.0.0.1#5335\nipset=/wikia.nocookie.net/gfwlist\nserver=/bmw.nl/127.0.0.1#5335\nipset=/bmw.nl/gfwlist\nserver=/bloombergarcade.com/127.0.0.1#5335\nipset=/bloombergarcade.com/gfwlist\nserver=/google.cv/127.0.0.1#5335\nipset=/google.cv/gfwlist\nserver=/minisoindia.com/127.0.0.1#5335\nipset=/minisoindia.com/gfwlist\nserver=/vaultify.com/127.0.0.1#5335\nipset=/vaultify.com/gfwlist\nserver=/appdynamics.fr/127.0.0.1#5335\nipset=/appdynamics.fr/gfwlist\nserver=/mastercard.ua/127.0.0.1#5335\nipset=/mastercard.ua/gfwlist\nserver=/uug27.com/127.0.0.1#5335\nipset=/uug27.com/gfwlist\nserver=/crosswalk-project.com/127.0.0.1#5335\nipset=/crosswalk-project.com/gfwlist\nserver=/bmwusaservice.com/127.0.0.1#5335\nipset=/bmwusaservice.com/gfwlist\nserver=/grannylovesbbc.com/127.0.0.1#5335\nipset=/grannylovesbbc.com/gfwlist\nserver=/volvo.com/127.0.0.1#5335\nipset=/volvo.com/gfwlist\nserver=/xfuckonline.com/127.0.0.1#5335\nipset=/xfuckonline.com/gfwlist\nserver=/bmw.ee/127.0.0.1#5335\nipset=/bmw.ee/gfwlist\nserver=/inhumanity.com/127.0.0.1#5335\nipset=/inhumanity.com/gfwlist\nserver=/click-url.com/127.0.0.1#5335\nipset=/click-url.com/gfwlist\nserver=/bnef.com/127.0.0.1#5335\nipset=/bnef.com/gfwlist\nserver=/pycon.org/127.0.0.1#5335\nipset=/pycon.org/gfwlist\nserver=/firstanalvideos.com/127.0.0.1#5335\nipset=/firstanalvideos.com/gfwlist\nserver=/beatsbydrecheaponlinesales.com/127.0.0.1#5335\nipset=/beatsbydrecheaponlinesales.com/gfwlist\nserver=/pinterest.mx/127.0.0.1#5335\nipset=/pinterest.mx/gfwlist\nserver=/justdoit.us/127.0.0.1#5335\nipset=/justdoit.us/gfwlist\nserver=/rentaride.de/127.0.0.1#5335\nipset=/rentaride.de/gfwlist\nserver=/m-power.com/127.0.0.1#5335\nipset=/m-power.com/gfwlist\nserver=/dowjoneson.com/127.0.0.1#5335\nipset=/dowjoneson.com/gfwlist\nserver=/seehorsepenis.com/127.0.0.1#5335\nipset=/seehorsepenis.com/gfwlist\nserver=/foxtel.com/127.0.0.1#5335\nipset=/foxtel.com/gfwlist\nserver=/zapper.fi/127.0.0.1#5335\nipset=/zapper.fi/gfwlist\nserver=/pros.ee/127.0.0.1#5335\nipset=/pros.ee/gfwlist\nserver=/strepsils.ch/127.0.0.1#5335\nipset=/strepsils.ch/gfwlist\nserver=/nudedxxx.com/127.0.0.1#5335\nipset=/nudedxxx.com/gfwlist\nserver=/hotstarext.com/127.0.0.1#5335\nipset=/hotstarext.com/gfwlist\nserver=/realclearmarkets.com/127.0.0.1#5335\nipset=/realclearmarkets.com/gfwlist\nserver=/lnkd.in/127.0.0.1#5335\nipset=/lnkd.in/gfwlist\nserver=/paylike.com/127.0.0.1#5335\nipset=/paylike.com/gfwlist\nserver=/custombeatsforcheap.com/127.0.0.1#5335\nipset=/custombeatsforcheap.com/gfwlist\nserver=/epochmall.com/127.0.0.1#5335\nipset=/epochmall.com/gfwlist\nserver=/lolibus.top/127.0.0.1#5335\nipset=/lolibus.top/gfwlist\nserver=/videopress.com/127.0.0.1#5335\nipset=/videopress.com/gfwlist\nserver=/fanfox.net/127.0.0.1#5335\nipset=/fanfox.net/gfwlist\nserver=/bmwofannapolis.com/127.0.0.1#5335\nipset=/bmwofannapolis.com/gfwlist\nserver=/powersunitedvr.com/127.0.0.1#5335\nipset=/powersunitedvr.com/gfwlist\nserver=/ieee-cas.org/127.0.0.1#5335\nipset=/ieee-cas.org/gfwlist\nserver=/startupschool.org/127.0.0.1#5335\nipset=/startupschool.org/gfwlist\nserver=/paypal-retail.com/127.0.0.1#5335\nipset=/paypal-retail.com/gfwlist\nserver=/needforspeedeliminator.com/127.0.0.1#5335\nipset=/needforspeedeliminator.com/gfwlist\nserver=/terk.nl/127.0.0.1#5335\nipset=/terk.nl/gfwlist\nserver=/netflav1.com/127.0.0.1#5335\nipset=/netflav1.com/gfwlist\nserver=/panasonic.jp/127.0.0.1#5335\nipset=/panasonic.jp/gfwlist\nserver=/yahoo.ge/127.0.0.1#5335\nipset=/yahoo.ge/gfwlist\nserver=/petardas.xxx/127.0.0.1#5335\nipset=/petardas.xxx/gfwlist\nserver=/telegram.space/127.0.0.1#5335\nipset=/telegram.space/gfwlist\nserver=/youtube.com.sv/127.0.0.1#5335\nipset=/youtube.com.sv/gfwlist\nserver=/ahsexfilme.com/127.0.0.1#5335\nipset=/ahsexfilme.com/gfwlist\nserver=/beatsbydresalesonline-australia.com/127.0.0.1#5335\nipset=/beatsbydresalesonline-australia.com/gfwlist\nserver=/beatsbydresingapores.com/127.0.0.1#5335\nipset=/beatsbydresingapores.com/gfwlist\nserver=/epochtimes.eu/127.0.0.1#5335\nipset=/epochtimes.eu/gfwlist\nserver=/bmw-yachtsport.com/127.0.0.1#5335\nipset=/bmw-yachtsport.com/gfwlist\nserver=/bmw.in/127.0.0.1#5335\nipset=/bmw.in/gfwlist\nserver=/microsoftlatamholiday.com/127.0.0.1#5335\nipset=/microsoftlatamholiday.com/gfwlist\nserver=/visa.ro/127.0.0.1#5335\nipset=/visa.ro/gfwlist\nserver=/adultgamesportal.com/127.0.0.1#5335\nipset=/adultgamesportal.com/gfwlist\nserver=/tubeshemales.com/127.0.0.1#5335\nipset=/tubeshemales.com/gfwlist\nserver=/apple.hr/127.0.0.1#5335\nipset=/apple.hr/gfwlist\nserver=/google.mu/127.0.0.1#5335\nipset=/google.mu/gfwlist\nserver=/hdabla.net/127.0.0.1#5335\nipset=/hdabla.net/gfwlist\nserver=/playhearthstone.com/127.0.0.1#5335\nipset=/playhearthstone.com/gfwlist\nserver=/howtohackfacebook-account.com/127.0.0.1#5335\nipset=/howtohackfacebook-account.com/gfwlist\nserver=/bmw.com.mt/127.0.0.1#5335\nipset=/bmw.com.mt/gfwlist\nserver=/hamsterfucktube.com/127.0.0.1#5335\nipset=/hamsterfucktube.com/gfwlist\nserver=/beatscustomblackfriday.com/127.0.0.1#5335\nipset=/beatscustomblackfriday.com/gfwlist\nserver=/17mimei.com/127.0.0.1#5335\nipset=/17mimei.com/gfwlist\nserver=/aoc.cat/127.0.0.1#5335\nipset=/aoc.cat/gfwlist\nserver=/777tv.net/127.0.0.1#5335\nipset=/777tv.net/gfwlist\nserver=/beatsbydre-studio.com/127.0.0.1#5335\nipset=/beatsbydre-studio.com/gfwlist\nserver=/bitly.com/127.0.0.1#5335\nipset=/bitly.com/gfwlist\nserver=/bnetshopus.akamaized.net/127.0.0.1#5335\nipset=/bnetshopus.akamaized.net/gfwlist\nserver=/foxrichmond.com/127.0.0.1#5335\nipset=/foxrichmond.com/gfwlist\nserver=/collectionofbestporn.com/127.0.0.1#5335\nipset=/collectionofbestporn.com/gfwlist\nserver=/yahoo.vg/127.0.0.1#5335\nipset=/yahoo.vg/gfwlist\nserver=/avstar09.me/127.0.0.1#5335\nipset=/avstar09.me/gfwlist\nserver=/miitomo.com/127.0.0.1#5335\nipset=/miitomo.com/gfwlist\nserver=/aibaobei.me/127.0.0.1#5335\nipset=/aibaobei.me/gfwlist\nserver=/hentaiero.net/127.0.0.1#5335\nipset=/hentaiero.net/gfwlist\nserver=/carebay.com/127.0.0.1#5335\nipset=/carebay.com/gfwlist\nserver=/speedtest.com.hk/127.0.0.1#5335\nipset=/speedtest.com.hk/gfwlist\nserver=/loanbuilder.com/127.0.0.1#5335\nipset=/loanbuilder.com/gfwlist\nserver=/bmw-motorrad.com.mx/127.0.0.1#5335\nipset=/bmw-motorrad.com.mx/gfwlist\nserver=/javjack.com/127.0.0.1#5335\nipset=/javjack.com/gfwlist\nserver=/linkshit.com/127.0.0.1#5335\nipset=/linkshit.com/gfwlist\nserver=/do.co/127.0.0.1#5335\nipset=/do.co/gfwlist\nserver=/ethereum.org/127.0.0.1#5335\nipset=/ethereum.org/gfwlist\nserver=/whatsappbrand.com/127.0.0.1#5335\nipset=/whatsappbrand.com/gfwlist\nserver=/nativeincolour.com.au/127.0.0.1#5335\nipset=/nativeincolour.com.au/gfwlist\nserver=/nbcuniversal.com/127.0.0.1#5335\nipset=/nbcuniversal.com/gfwlist\nserver=/pinterest.jp/127.0.0.1#5335\nipset=/pinterest.jp/gfwlist\nserver=/ebayanunsios.net/127.0.0.1#5335\nipset=/ebayanunsios.net/gfwlist\nserver=/trustcor.com/127.0.0.1#5335\nipset=/trustcor.com/gfwlist\nserver=/dinotube.com/127.0.0.1#5335\nipset=/dinotube.com/gfwlist\nserver=/freefacebookads.net/127.0.0.1#5335\nipset=/freefacebookads.net/gfwlist\nserver=/icloud.se/127.0.0.1#5335\nipset=/icloud.se/gfwlist\nserver=/surface.com/127.0.0.1#5335\nipset=/surface.com/gfwlist\nserver=/applepaycash.net/127.0.0.1#5335\nipset=/applepaycash.net/gfwlist\nserver=/freebs.com/127.0.0.1#5335\nipset=/freebs.com/gfwlist\nserver=/line-scdn.net/127.0.0.1#5335\nipset=/line-scdn.net/gfwlist\nserver=/bitbank.cc/127.0.0.1#5335\nipset=/bitbank.cc/gfwlist\nserver=/gaybf.com/127.0.0.1#5335\nipset=/gaybf.com/gfwlist\nserver=/rabbitscams.com/127.0.0.1#5335\nipset=/rabbitscams.com/gfwlist\nserver=/telegram-porn.com/127.0.0.1#5335\nipset=/telegram-porn.com/gfwlist\nserver=/hentai69.life/127.0.0.1#5335\nipset=/hentai69.life/gfwlist\nserver=/nextmag.com.tw/127.0.0.1#5335\nipset=/nextmag.com.tw/gfwlist\nserver=/xxxnxx.me/127.0.0.1#5335\nipset=/xxxnxx.me/gfwlist\nserver=/splatoon2tournament.com/127.0.0.1#5335\nipset=/splatoon2tournament.com/gfwlist\nserver=/tvbanywhere.com.sg/127.0.0.1#5335\nipset=/tvbanywhere.com.sg/gfwlist\nserver=/paypa1.org/127.0.0.1#5335\nipset=/paypa1.org/gfwlist\nserver=/alterauserforum.com/127.0.0.1#5335\nipset=/alterauserforum.com/gfwlist\nserver=/battlefieldv.com/127.0.0.1#5335\nipset=/battlefieldv.com/gfwlist\nserver=/livingyourambition.com/127.0.0.1#5335\nipset=/livingyourambition.com/gfwlist\nserver=/zoho.eu/127.0.0.1#5335\nipset=/zoho.eu/gfwlist\nserver=/drmgmggyi-mm.blogspot.com/127.0.0.1#5335\nipset=/drmgmggyi-mm.blogspot.com/gfwlist\nserver=/mysimsracing.com/127.0.0.1#5335\nipset=/mysimsracing.com/gfwlist\nserver=/gr-assets.com/127.0.0.1#5335\nipset=/gr-assets.com/gfwlist\nserver=/ehtracker.org/127.0.0.1#5335\nipset=/ehtracker.org/gfwlist\nserver=/hpdreamcolor.com/127.0.0.1#5335\nipset=/hpdreamcolor.com/gfwlist\nserver=/googlecode.com/127.0.0.1#5335\nipset=/googlecode.com/gfwlist\nserver=/huffingtonpost.de/127.0.0.1#5335\nipset=/huffingtonpost.de/gfwlist\nserver=/travelex.com.om/127.0.0.1#5335\nipset=/travelex.com.om/gfwlist\nserver=/disney.pl/127.0.0.1#5335\nipset=/disney.pl/gfwlist\nserver=/xda-developers.com/127.0.0.1#5335\nipset=/xda-developers.com/gfwlist\nserver=/nan-net.com/127.0.0.1#5335\nipset=/nan-net.com/gfwlist\nserver=/hentaiz.co/127.0.0.1#5335\nipset=/hentaiz.co/gfwlist\nserver=/termux.dev/127.0.0.1#5335\nipset=/termux.dev/gfwlist\nserver=/pingxiangpuer.com/127.0.0.1#5335\nipset=/pingxiangpuer.com/gfwlist\nserver=/amazonpay.in/127.0.0.1#5335\nipset=/amazonpay.in/gfwlist\nserver=/truebeachporn.com/127.0.0.1#5335\nipset=/truebeachporn.com/gfwlist\nserver=/ebayit.com/127.0.0.1#5335\nipset=/ebayit.com/gfwlist\nserver=/volvotrucks.am/127.0.0.1#5335\nipset=/volvotrucks.am/gfwlist\nserver=/youjizz.sex/127.0.0.1#5335\nipset=/youjizz.sex/gfwlist\nserver=/tribler.org/127.0.0.1#5335\nipset=/tribler.org/gfwlist\nserver=/bmw-grouparchives.com/127.0.0.1#5335\nipset=/bmw-grouparchives.com/gfwlist\nserver=/zencoder.com/127.0.0.1#5335\nipset=/zencoder.com/gfwlist\nserver=/freedomplatform.tv/127.0.0.1#5335\nipset=/freedomplatform.tv/gfwlist\nserver=/ninemediaroom.com.au/127.0.0.1#5335\nipset=/ninemediaroom.com.au/gfwlist\nserver=/dilcdn.com/127.0.0.1#5335\nipset=/dilcdn.com/gfwlist\nserver=/bbgwatch.com/127.0.0.1#5335\nipset=/bbgwatch.com/gfwlist\nserver=/billpoint.info/127.0.0.1#5335\nipset=/billpoint.info/gfwlist\nserver=/blogspot.co.nz/127.0.0.1#5335\nipset=/blogspot.co.nz/gfwlist\nserver=/enfamil.es/127.0.0.1#5335\nipset=/enfamil.es/gfwlist\nserver=/aorus.com/127.0.0.1#5335\nipset=/aorus.com/gfwlist\nserver=/ohentai.org/127.0.0.1#5335\nipset=/ohentai.org/gfwlist\nserver=/ebay-25-assets.s3-us-west-1.amazonaws.com/127.0.0.1#5335\nipset=/ebay-25-assets.s3-us-west-1.amazonaws.com/gfwlist\nserver=/mastercard.es/127.0.0.1#5335\nipset=/mastercard.es/gfwlist\nserver=/login-paypal.info/127.0.0.1#5335\nipset=/login-paypal.info/gfwlist\nserver=/nudistic.com/127.0.0.1#5335\nipset=/nudistic.com/gfwlist\nserver=/huffingtonpost.com/127.0.0.1#5335\nipset=/huffingtonpost.com/gfwlist\nserver=/fontshop.com/127.0.0.1#5335\nipset=/fontshop.com/gfwlist\nserver=/cnivogue.com.au/127.0.0.1#5335\nipset=/cnivogue.com.au/gfwlist\nserver=/turbogvideos.com/127.0.0.1#5335\nipset=/turbogvideos.com/gfwlist\nserver=/elgaronline.com/127.0.0.1#5335\nipset=/elgaronline.com/gfwlist\nserver=/ikea.com.sg/127.0.0.1#5335\nipset=/ikea.com.sg/gfwlist\nserver=/erovizor.ru/127.0.0.1#5335\nipset=/erovizor.ru/gfwlist\nserver=/141hongkong.com/127.0.0.1#5335\nipset=/141hongkong.com/gfwlist\nserver=/adobess.com/127.0.0.1#5335\nipset=/adobess.com/gfwlist\nserver=/mcdelivery.co.kr/127.0.0.1#5335\nipset=/mcdelivery.co.kr/gfwlist\nserver=/leakedmeat.com/127.0.0.1#5335\nipset=/leakedmeat.com/gfwlist\nserver=/facvebook.com/127.0.0.1#5335\nipset=/facvebook.com/gfwlist\nserver=/bmw-authority-vehicles.com/127.0.0.1#5335\nipset=/bmw-authority-vehicles.com/gfwlist\nserver=/amerikaninsesi.org/127.0.0.1#5335\nipset=/amerikaninsesi.org/gfwlist\nserver=/connectionslearning.com/127.0.0.1#5335\nipset=/connectionslearning.com/gfwlist\nserver=/satan18av.com/127.0.0.1#5335\nipset=/satan18av.com/gfwlist\nserver=/rssing.com/127.0.0.1#5335\nipset=/rssing.com/gfwlist\nserver=/ikea.pl/127.0.0.1#5335\nipset=/ikea.pl/gfwlist\nserver=/mini-tahiti.com/127.0.0.1#5335\nipset=/mini-tahiti.com/gfwlist\nserver=/gputechconf.com/127.0.0.1#5335\nipset=/gputechconf.com/gfwlist\nserver=/shopbmwusa.com/127.0.0.1#5335\nipset=/shopbmwusa.com/gfwlist\nserver=/wawatv.net/127.0.0.1#5335\nipset=/wawatv.net/gfwlist\nserver=/towerauction.com/127.0.0.1#5335\nipset=/towerauction.com/gfwlist\nserver=/hdouban2.com/127.0.0.1#5335\nipset=/hdouban2.com/gfwlist\nserver=/fury.help/127.0.0.1#5335\nipset=/fury.help/gfwlist\nserver=/azureiotcentral.com/127.0.0.1#5335\nipset=/azureiotcentral.com/gfwlist\nserver=/spektral.cc/127.0.0.1#5335\nipset=/spektral.cc/gfwlist\nserver=/workplace.com/127.0.0.1#5335\nipset=/workplace.com/gfwlist\nserver=/canon.com.by/127.0.0.1#5335\nipset=/canon.com.by/gfwlist\nserver=/manhunt.net/127.0.0.1#5335\nipset=/manhunt.net/gfwlist\nserver=/google.ps/127.0.0.1#5335\nipset=/google.ps/gfwlist\nserver=/bootyliciousmag.com/127.0.0.1#5335\nipset=/bootyliciousmag.com/gfwlist\nserver=/xxxtubeasian.net/127.0.0.1#5335\nipset=/xxxtubeasian.net/gfwlist\nserver=/enfagrow.com.ph/127.0.0.1#5335\nipset=/enfagrow.com.ph/gfwlist\nserver=/akamai-platform.net/127.0.0.1#5335\nipset=/akamai-platform.net/gfwlist\nserver=/youtube.com.bo/127.0.0.1#5335\nipset=/youtube.com.bo/gfwlist\nserver=/vpro.com/127.0.0.1#5335\nipset=/vpro.com/gfwlist\nserver=/intel.ae/127.0.0.1#5335\nipset=/intel.ae/gfwlist\nserver=/itsfuck.com/127.0.0.1#5335\nipset=/itsfuck.com/gfwlist\nserver=/bumpshare.com/127.0.0.1#5335\nipset=/bumpshare.com/gfwlist\nserver=/tukif.com/127.0.0.1#5335\nipset=/tukif.com/gfwlist\nserver=/sony.com.ar/127.0.0.1#5335\nipset=/sony.com.ar/gfwlist\nserver=/fi11tv1.com/127.0.0.1#5335\nipset=/fi11tv1.com/gfwlist\nserver=/pinterest.pt/127.0.0.1#5335\nipset=/pinterest.pt/gfwlist\nserver=/scholarpedia.org/127.0.0.1#5335\nipset=/scholarpedia.org/gfwlist\nserver=/visa.co.za/127.0.0.1#5335\nipset=/visa.co.za/gfwlist\nserver=/censorship.ai/127.0.0.1#5335\nipset=/censorship.ai/gfwlist\nserver=/futureshop.ca/127.0.0.1#5335\nipset=/futureshop.ca/gfwlist\nserver=/srebrenica360.com/127.0.0.1#5335\nipset=/srebrenica360.com/gfwlist\nserver=/visaluxuryhotels.com/127.0.0.1#5335\nipset=/visaluxuryhotels.com/gfwlist\nserver=/nudekenya.com/127.0.0.1#5335\nipset=/nudekenya.com/gfwlist\nserver=/hpsoftware.com/127.0.0.1#5335\nipset=/hpsoftware.com/gfwlist\nserver=/blogspot.com.au/127.0.0.1#5335\nipset=/blogspot.com.au/gfwlist\nserver=/minisothailand.com/127.0.0.1#5335\nipset=/minisothailand.com/gfwlist\nserver=/w.wiki/127.0.0.1#5335\nipset=/w.wiki/gfwlist\nserver=/localbitcoinschain.com/127.0.0.1#5335\nipset=/localbitcoinschain.com/gfwlist\nserver=/gbluebooks.blogspot.com/127.0.0.1#5335\nipset=/gbluebooks.blogspot.com/gfwlist\nserver=/nudematurewomenpics.com/127.0.0.1#5335\nipset=/nudematurewomenpics.com/gfwlist\nserver=/newisiknowledge.com/127.0.0.1#5335\nipset=/newisiknowledge.com/gfwlist\nserver=/edninfo.com/127.0.0.1#5335\nipset=/edninfo.com/gfwlist\nserver=/vaginacontest.com/127.0.0.1#5335\nipset=/vaginacontest.com/gfwlist\nserver=/intheknow.com.au/127.0.0.1#5335\nipset=/intheknow.com.au/gfwlist\nserver=/maddenchampionship.com/127.0.0.1#5335\nipset=/maddenchampionship.com/gfwlist\nserver=/beatsblackfridaydeals.net/127.0.0.1#5335\nipset=/beatsblackfridaydeals.net/gfwlist\nserver=/starbucksforlife.com/127.0.0.1#5335\nipset=/starbucksforlife.com/gfwlist\nserver=/doclercdn.com/127.0.0.1#5335\nipset=/doclercdn.com/gfwlist\nserver=/vanish.no/127.0.0.1#5335\nipset=/vanish.no/gfwlist\nserver=/google.co.bw/127.0.0.1#5335\nipset=/google.co.bw/gfwlist\nserver=/microsoftreactor.net/127.0.0.1#5335\nipset=/microsoftreactor.net/gfwlist\nserver=/themoviedb.org/127.0.0.1#5335\nipset=/themoviedb.org/gfwlist\nserver=/volvosaatio.fi/127.0.0.1#5335\nipset=/volvosaatio.fi/gfwlist\nserver=/dettol.co.ke/127.0.0.1#5335\nipset=/dettol.co.ke/gfwlist\nserver=/akamai-regression.net/127.0.0.1#5335\nipset=/akamai-regression.net/gfwlist\nserver=/hardsextube.com/127.0.0.1#5335\nipset=/hardsextube.com/gfwlist\nserver=/xnxx2.it/127.0.0.1#5335\nipset=/xnxx2.it/gfwlist\nserver=/thomsonreuters.co.uk/127.0.0.1#5335\nipset=/thomsonreuters.co.uk/gfwlist\nserver=/entermediadb.org/127.0.0.1#5335\nipset=/entermediadb.org/gfwlist\nserver=/gettyimages.nl/127.0.0.1#5335\nipset=/gettyimages.nl/gfwlist\nserver=/shadowsocks.org/127.0.0.1#5335\nipset=/shadowsocks.org/gfwlist\nserver=/deepmind.com/127.0.0.1#5335\nipset=/deepmind.com/gfwlist\nserver=/yandex.tj/127.0.0.1#5335\nipset=/yandex.tj/gfwlist\nserver=/steezylist.com/127.0.0.1#5335\nipset=/steezylist.com/gfwlist\nserver=/iamakamai.com/127.0.0.1#5335\nipset=/iamakamai.com/gfwlist\nserver=/directvonline.com/127.0.0.1#5335\nipset=/directvonline.com/gfwlist\nserver=/faceboobok.com/127.0.0.1#5335\nipset=/faceboobok.com/gfwlist\nserver=/blogspot.co.ke/127.0.0.1#5335\nipset=/blogspot.co.ke/gfwlist\nserver=/linemobile.com/127.0.0.1#5335\nipset=/linemobile.com/gfwlist\nserver=/fulanax.com/127.0.0.1#5335\nipset=/fulanax.com/gfwlist\nserver=/femjoy.com/127.0.0.1#5335\nipset=/femjoy.com/gfwlist\nserver=/azure-mobile.net/127.0.0.1#5335\nipset=/azure-mobile.net/gfwlist\nserver=/bestbuyus.com/127.0.0.1#5335\nipset=/bestbuyus.com/gfwlist\nserver=/oppainorakuen.com/127.0.0.1#5335\nipset=/oppainorakuen.com/gfwlist\nserver=/cheapbeatsbydrestudioutlet.com/127.0.0.1#5335\nipset=/cheapbeatsbydrestudioutlet.com/gfwlist\nserver=/softbankmobile.net/127.0.0.1#5335\nipset=/softbankmobile.net/gfwlist\nserver=/bloombergapps.com/127.0.0.1#5335\nipset=/bloombergapps.com/gfwlist\nserver=/manototv.com/127.0.0.1#5335\nipset=/manototv.com/gfwlist\nserver=/allfinegirls.com/127.0.0.1#5335\nipset=/allfinegirls.com/gfwlist\nserver=/sing68.com/127.0.0.1#5335\nipset=/sing68.com/gfwlist\nserver=/zavat.pw/127.0.0.1#5335\nipset=/zavat.pw/gfwlist\nserver=/fanatical.com/127.0.0.1#5335\nipset=/fanatical.com/gfwlist\nserver=/billpoint.tv/127.0.0.1#5335\nipset=/billpoint.tv/gfwlist\nserver=/hotzxgirl.com/127.0.0.1#5335\nipset=/hotzxgirl.com/gfwlist\nserver=/onlineteenhub.com/127.0.0.1#5335\nipset=/onlineteenhub.com/gfwlist\nserver=/btt804.com/127.0.0.1#5335\nipset=/btt804.com/gfwlist\nserver=/gumtree.sg/127.0.0.1#5335\nipset=/gumtree.sg/gfwlist\nserver=/volvogroup.kr/127.0.0.1#5335\nipset=/volvogroup.kr/gfwlist\nserver=/custombeatsny.com/127.0.0.1#5335\nipset=/custombeatsny.com/gfwlist\nserver=/visaitalia.com/127.0.0.1#5335\nipset=/visaitalia.com/gfwlist\nserver=/beatsbydre-chen.com/127.0.0.1#5335\nipset=/beatsbydre-chen.com/gfwlist\nserver=/monstercasquebeatspascher.net/127.0.0.1#5335\nipset=/monstercasquebeatspascher.net/gfwlist\nserver=/microsoftiotcentral.com/127.0.0.1#5335\nipset=/microsoftiotcentral.com/gfwlist\nserver=/hotstunners.com/127.0.0.1#5335\nipset=/hotstunners.com/gfwlist\nserver=/theman.in/127.0.0.1#5335\nipset=/theman.in/gfwlist\nserver=/visa.com.hn/127.0.0.1#5335\nipset=/visa.com.hn/gfwlist\nserver=/fireside.fm/127.0.0.1#5335\nipset=/fireside.fm/gfwlist\nserver=/sandisk.com/127.0.0.1#5335\nipset=/sandisk.com/gfwlist\nserver=/foxest.com/127.0.0.1#5335\nipset=/foxest.com/gfwlist\nserver=/mature-porn-flix.com/127.0.0.1#5335\nipset=/mature-porn-flix.com/gfwlist\nserver=/verilylifesciences.com/127.0.0.1#5335\nipset=/verilylifesciences.com/gfwlist\nserver=/monstersbeatbydres.com/127.0.0.1#5335\nipset=/monstersbeatbydres.com/gfwlist\nserver=/drdrebeatsdesale.com/127.0.0.1#5335\nipset=/drdrebeatsdesale.com/gfwlist\nserver=/momsyoungboys.net/127.0.0.1#5335\nipset=/momsyoungboys.net/gfwlist\nserver=/niketraining.com/127.0.0.1#5335\nipset=/niketraining.com/gfwlist\nserver=/ebay.co.za/127.0.0.1#5335\nipset=/ebay.co.za/gfwlist\nserver=/minilaval.ca/127.0.0.1#5335\nipset=/minilaval.ca/gfwlist\nserver=/amateurmommymovies.com/127.0.0.1#5335\nipset=/amateurmommymovies.com/gfwlist\nserver=/scholar.google.cz/127.0.0.1#5335\nipset=/scholar.google.cz/gfwlist\nserver=/hcomicbook.com/127.0.0.1#5335\nipset=/hcomicbook.com/gfwlist\nserver=/hentaivn.de/127.0.0.1#5335\nipset=/hentaivn.de/gfwlist\nserver=/moeimg.net/127.0.0.1#5335\nipset=/moeimg.net/gfwlist\nserver=/observable.net/127.0.0.1#5335\nipset=/observable.net/gfwlist\nserver=/porn34.me/127.0.0.1#5335\nipset=/porn34.me/gfwlist\nserver=/oldje.com/127.0.0.1#5335\nipset=/oldje.com/gfwlist\nserver=/xiaoyaoge.xyz/127.0.0.1#5335\nipset=/xiaoyaoge.xyz/gfwlist\nserver=/verisign.com/127.0.0.1#5335\nipset=/verisign.com/gfwlist\nserver=/ebayla.org/127.0.0.1#5335\nipset=/ebayla.org/gfwlist\nserver=/ntdtv.jp/127.0.0.1#5335\nipset=/ntdtv.jp/gfwlist\nserver=/google.bs/127.0.0.1#5335\nipset=/google.bs/gfwlist\nserver=/avgod.club/127.0.0.1#5335\nipset=/avgod.club/gfwlist\nserver=/z5.com/127.0.0.1#5335\nipset=/z5.com/gfwlist\nserver=/ikea.dk/127.0.0.1#5335\nipset=/ikea.dk/gfwlist\nserver=/sony.co.nz/127.0.0.1#5335\nipset=/sony.co.nz/gfwlist\nserver=/cnnpolitics.com/127.0.0.1#5335\nipset=/cnnpolitics.com/gfwlist\nserver=/google.com.na/127.0.0.1#5335\nipset=/google.com.na/gfwlist\nserver=/zoo-tube8.com/127.0.0.1#5335\nipset=/zoo-tube8.com/gfwlist\nserver=/book4you.org/127.0.0.1#5335\nipset=/book4you.org/gfwlist\nserver=/foxrad.io/127.0.0.1#5335\nipset=/foxrad.io/gfwlist\nserver=/teslazta.net/127.0.0.1#5335\nipset=/teslazta.net/gfwlist\nserver=/books.com.tw/127.0.0.1#5335\nipset=/books.com.tw/gfwlist\nserver=/bmwworld.net/127.0.0.1#5335\nipset=/bmwworld.net/gfwlist\nserver=/googleadapis.com/127.0.0.1#5335\nipset=/googleadapis.com/gfwlist\nserver=/alt5-mtalk.google.com/127.0.0.1#5335\nipset=/alt5-mtalk.google.com/gfwlist\nserver=/facebookvacation.com/127.0.0.1#5335\nipset=/facebookvacation.com/gfwlist\nserver=/mastercard.pl/127.0.0.1#5335\nipset=/mastercard.pl/gfwlist\nserver=/bekijkporno.nl/127.0.0.1#5335\nipset=/bekijkporno.nl/gfwlist\nserver=/citas-para-mayoresde50.ec/127.0.0.1#5335\nipset=/citas-para-mayoresde50.ec/gfwlist\nserver=/codivorexxx.com/127.0.0.1#5335\nipset=/codivorexxx.com/gfwlist\nserver=/h0930.com/127.0.0.1#5335\nipset=/h0930.com/gfwlist\nserver=/yandex.fi/127.0.0.1#5335\nipset=/yandex.fi/gfwlist\nserver=/nerdnudes.com/127.0.0.1#5335\nipset=/nerdnudes.com/gfwlist\nserver=/worldsfastestgamer.net/127.0.0.1#5335\nipset=/worldsfastestgamer.net/gfwlist\nserver=/postimages.org/127.0.0.1#5335\nipset=/postimages.org/gfwlist\nserver=/jable.tv/127.0.0.1#5335\nipset=/jable.tv/gfwlist\nserver=/netflixdnstest1.com/127.0.0.1#5335\nipset=/netflixdnstest1.com/gfwlist\nserver=/bingworld.com/127.0.0.1#5335\nipset=/bingworld.com/gfwlist\nserver=/pornhub-deutsch.net/127.0.0.1#5335\nipset=/pornhub-deutsch.net/gfwlist\nserver=/pokemonletsgopikachu.com/127.0.0.1#5335\nipset=/pokemonletsgopikachu.com/gfwlist\nserver=/antarvasnax.com/127.0.0.1#5335\nipset=/antarvasnax.com/gfwlist\nserver=/instagmania.com/127.0.0.1#5335\nipset=/instagmania.com/gfwlist\nserver=/stlouisbmw.net/127.0.0.1#5335\nipset=/stlouisbmw.net/gfwlist\nserver=/bokepvidz.com/127.0.0.1#5335\nipset=/bokepvidz.com/gfwlist\nserver=/asproex.com/127.0.0.1#5335\nipset=/asproex.com/gfwlist\nserver=/bandcamp.com/127.0.0.1#5335\nipset=/bandcamp.com/gfwlist\nserver=/nudeteen.org/127.0.0.1#5335\nipset=/nudeteen.org/gfwlist\nserver=/google.com.cy/127.0.0.1#5335\nipset=/google.com.cy/gfwlist\nserver=/veet.com.pk/127.0.0.1#5335\nipset=/veet.com.pk/gfwlist\nserver=/bmw-connecteddrive.co.uk/127.0.0.1#5335\nipset=/bmw-connecteddrive.co.uk/gfwlist\nserver=/tvbanywhere.com/127.0.0.1#5335\nipset=/tvbanywhere.com/gfwlist\nserver=/pashtovoa.com/127.0.0.1#5335\nipset=/pashtovoa.com/gfwlist\nserver=/swisssigner.com/127.0.0.1#5335\nipset=/swisssigner.com/gfwlist\nserver=/applepremiumreseller.com.au/127.0.0.1#5335\nipset=/applepremiumreseller.com.au/gfwlist\nserver=/myfavoritearcade.com/127.0.0.1#5335\nipset=/myfavoritearcade.com/gfwlist\nserver=/vaultify.info/127.0.0.1#5335\nipset=/vaultify.info/gfwlist\nserver=/6asianporn.com/127.0.0.1#5335\nipset=/6asianporn.com/gfwlist\nserver=/ieee-region6.org/127.0.0.1#5335\nipset=/ieee-region6.org/gfwlist\nserver=/zee5.com/127.0.0.1#5335\nipset=/zee5.com/gfwlist\nserver=/japanknowledge.com/127.0.0.1#5335\nipset=/japanknowledge.com/gfwlist\nserver=/facebooik.org/127.0.0.1#5335\nipset=/facebooik.org/gfwlist\nserver=/javtube.net/127.0.0.1#5335\nipset=/javtube.net/gfwlist\nserver=/iphone.host/127.0.0.1#5335\nipset=/iphone.host/gfwlist\nserver=/foxnews.cc/127.0.0.1#5335\nipset=/foxnews.cc/gfwlist\nserver=/youtube.co/127.0.0.1#5335\nipset=/youtube.co/gfwlist\nserver=/cbsi.live.ott.irdeto.com/127.0.0.1#5335\nipset=/cbsi.live.ott.irdeto.com/gfwlist\nserver=/kkfcc03.com/127.0.0.1#5335\nipset=/kkfcc03.com/gfwlist\nserver=/shakethesnake.com/127.0.0.1#5335\nipset=/shakethesnake.com/gfwlist\nserver=/redwap.me/127.0.0.1#5335\nipset=/redwap.me/gfwlist\nserver=/tiava1.com/127.0.0.1#5335\nipset=/tiava1.com/gfwlist\nserver=/skokka.com/127.0.0.1#5335\nipset=/skokka.com/gfwlist\nserver=/volvotruckcenter.fi/127.0.0.1#5335\nipset=/volvotruckcenter.fi/gfwlist\nserver=/pearsoneducationbooks.com/127.0.0.1#5335\nipset=/pearsoneducationbooks.com/gfwlist\nserver=/hpuniversity.info/127.0.0.1#5335\nipset=/hpuniversity.info/gfwlist\nserver=/xboyvids.com/127.0.0.1#5335\nipset=/xboyvids.com/gfwlist\nserver=/dcard.tw/127.0.0.1#5335\nipset=/dcard.tw/gfwlist\nserver=/blogspot.co.za/127.0.0.1#5335\nipset=/blogspot.co.za/gfwlist\nserver=/battlefield5.com/127.0.0.1#5335\nipset=/battlefield5.com/gfwlist\nserver=/xxxaporn.com/127.0.0.1#5335\nipset=/xxxaporn.com/gfwlist\nserver=/youtube.soy/127.0.0.1#5335\nipset=/youtube.soy/gfwlist\nserver=/itsoc.org/127.0.0.1#5335\nipset=/itsoc.org/gfwlist\nserver=/craigslist.org/127.0.0.1#5335\nipset=/craigslist.org/gfwlist\nserver=/sahabatsetiasmartone.com/127.0.0.1#5335\nipset=/sahabatsetiasmartone.com/gfwlist\nserver=/applepay.com.tw/127.0.0.1#5335\nipset=/applepay.com.tw/gfwlist\nserver=/asianxxxjoy.com/127.0.0.1#5335\nipset=/asianxxxjoy.com/gfwlist\nserver=/reneerossvideos.com/127.0.0.1#5335\nipset=/reneerossvideos.com/gfwlist\nserver=/directtv-deals.tv/127.0.0.1#5335\nipset=/directtv-deals.tv/gfwlist\nserver=/genshinimpact.com/127.0.0.1#5335\nipset=/genshinimpact.com/gfwlist\nserver=/porn2012.com/127.0.0.1#5335\nipset=/porn2012.com/gfwlist\nserver=/facewook.com/127.0.0.1#5335\nipset=/facewook.com/gfwlist\nserver=/fullxxxmovies.net/127.0.0.1#5335\nipset=/fullxxxmovies.net/gfwlist\nserver=/directvdeals.com/127.0.0.1#5335\nipset=/directvdeals.com/gfwlist\nserver=/epochtimes.de/127.0.0.1#5335\nipset=/epochtimes.de/gfwlist\nserver=/manhuabika.com/127.0.0.1#5335\nipset=/manhuabika.com/gfwlist\nserver=/paypal-database.com/127.0.0.1#5335\nipset=/paypal-database.com/gfwlist\nserver=/pinterest.com.bo/127.0.0.1#5335\nipset=/pinterest.com.bo/gfwlist\nserver=/paypalme.com/127.0.0.1#5335\nipset=/paypalme.com/gfwlist\nserver=/news.co.uk/127.0.0.1#5335\nipset=/news.co.uk/gfwlist\nserver=/o365weve-ppe.com/127.0.0.1#5335\nipset=/o365weve-ppe.com/gfwlist\nserver=/cosmosdb.net/127.0.0.1#5335\nipset=/cosmosdb.net/gfwlist\nserver=/beatsbydre-us.com/127.0.0.1#5335\nipset=/beatsbydre-us.com/gfwlist\nserver=/wii-u.com/127.0.0.1#5335\nipset=/wii-u.com/gfwlist\nserver=/bmw-motorrad.com/127.0.0.1#5335\nipset=/bmw-motorrad.com/gfwlist\nserver=/12diasderegalosdeitunes.gt/127.0.0.1#5335\nipset=/12diasderegalosdeitunes.gt/gfwlist\nserver=/faphdporn.com/127.0.0.1#5335\nipset=/faphdporn.com/gfwlist\nserver=/stackpath.com/127.0.0.1#5335\nipset=/stackpath.com/gfwlist\nserver=/theaffairs.com/127.0.0.1#5335\nipset=/theaffairs.com/gfwlist\nserver=/encuentroscasualesoecuador.com/127.0.0.1#5335\nipset=/encuentroscasualesoecuador.com/gfwlist\nserver=/bmw.co.jp/127.0.0.1#5335\nipset=/bmw.co.jp/gfwlist\nserver=/instagtram.com/127.0.0.1#5335\nipset=/instagtram.com/gfwlist\nserver=/airwick.ro/127.0.0.1#5335\nipset=/airwick.ro/gfwlist\nserver=/javtasty.com/127.0.0.1#5335\nipset=/javtasty.com/gfwlist\nserver=/vimeocdn.com/127.0.0.1#5335\nipset=/vimeocdn.com/gfwlist\nserver=/bluehatnights.com/127.0.0.1#5335\nipset=/bluehatnights.com/gfwlist\nserver=/myvodafone.com.au/127.0.0.1#5335\nipset=/myvodafone.com.au/gfwlist\nserver=/piwheels.org/127.0.0.1#5335\nipset=/piwheels.org/gfwlist\nserver=/monsterbeatsbydrefactory.com/127.0.0.1#5335\nipset=/monsterbeatsbydrefactory.com/gfwlist\nserver=/apibay.org/127.0.0.1#5335\nipset=/apibay.org/gfwlist\nserver=/ehgt.org/127.0.0.1#5335\nipset=/ehgt.org/gfwlist\nserver=/disneymagicmoments.it/127.0.0.1#5335\nipset=/disneymagicmoments.it/gfwlist\nserver=/doujinnomori.com/127.0.0.1#5335\nipset=/doujinnomori.com/gfwlist\nserver=/visa.com.ru/127.0.0.1#5335\nipset=/visa.com.ru/gfwlist\nserver=/goldnikeclub.com/127.0.0.1#5335\nipset=/goldnikeclub.com/gfwlist\nserver=/6-ar.com/127.0.0.1#5335\nipset=/6-ar.com/gfwlist\nserver=/ebayvietnam.net/127.0.0.1#5335\nipset=/ebayvietnam.net/gfwlist\nserver=/digitalid.ch/127.0.0.1#5335\nipset=/digitalid.ch/gfwlist\nserver=/akamai-thailand.com/127.0.0.1#5335\nipset=/akamai-thailand.com/gfwlist\nserver=/xhamster.xxx/127.0.0.1#5335\nipset=/xhamster.xxx/gfwlist\nserver=/bestbuy.ca/127.0.0.1#5335\nipset=/bestbuy.ca/gfwlist\nserver=/cherry-tale.com/127.0.0.1#5335\nipset=/cherry-tale.com/gfwlist\nserver=/disney.in/127.0.0.1#5335\nipset=/disney.in/gfwlist\nserver=/canon.fr/127.0.0.1#5335\nipset=/canon.fr/gfwlist\nserver=/youtube.si/127.0.0.1#5335\nipset=/youtube.si/gfwlist\nserver=/faproulette.online/127.0.0.1#5335\nipset=/faproulette.online/gfwlist\nserver=/go-disneyworldgo.com/127.0.0.1#5335\nipset=/go-disneyworldgo.com/gfwlist\nserver=/directvinternet.com/127.0.0.1#5335\nipset=/directvinternet.com/gfwlist\nserver=/facebokok.com/127.0.0.1#5335\nipset=/facebokok.com/gfwlist\nserver=/ikea.cz/127.0.0.1#5335\nipset=/ikea.cz/gfwlist\nserver=/sundanceignite2016.com/127.0.0.1#5335\nipset=/sundanceignite2016.com/gfwlist\nserver=/gemfury.com/127.0.0.1#5335\nipset=/gemfury.com/gfwlist\nserver=/bmw-connecteddrive.sg/127.0.0.1#5335\nipset=/bmw-connecteddrive.sg/gfwlist\nserver=/geforce.com/127.0.0.1#5335\nipset=/geforce.com/gfwlist\nserver=/dtv2009offers.com/127.0.0.1#5335\nipset=/dtv2009offers.com/gfwlist\nserver=/nexcat.com/127.0.0.1#5335\nipset=/nexcat.com/gfwlist\nserver=/nowjav.com/127.0.0.1#5335\nipset=/nowjav.com/gfwlist\nserver=/bridgestonerapiddelivery.com/127.0.0.1#5335\nipset=/bridgestonerapiddelivery.com/gfwlist\nserver=/wal-mart.com/127.0.0.1#5335\nipset=/wal-mart.com/gfwlist\nserver=/c-spanvideo.org/127.0.0.1#5335\nipset=/c-spanvideo.org/gfwlist\nserver=/99thz.cc/127.0.0.1#5335\nipset=/99thz.cc/gfwlist\nserver=/bmw.com.pa/127.0.0.1#5335\nipset=/bmw.com.pa/gfwlist\nserver=/singtaola.com/127.0.0.1#5335\nipset=/singtaola.com/gfwlist\nserver=/128100.xyz/127.0.0.1#5335\nipset=/128100.xyz/gfwlist\nserver=/empornium.site/127.0.0.1#5335\nipset=/empornium.site/gfwlist\nserver=/novinhabucetuda.com/127.0.0.1#5335\nipset=/novinhabucetuda.com/gfwlist\nserver=/wwwdecide.com/127.0.0.1#5335\nipset=/wwwdecide.com/gfwlist\nserver=/apornvideo.com/127.0.0.1#5335\nipset=/apornvideo.com/gfwlist\nserver=/uun86.com/127.0.0.1#5335\nipset=/uun86.com/gfwlist\nserver=/nflxsearch.net/127.0.0.1#5335\nipset=/nflxsearch.net/gfwlist\nserver=/esp32.com/127.0.0.1#5335\nipset=/esp32.com/gfwlist\nserver=/hoyoverse.com/127.0.0.1#5335\nipset=/hoyoverse.com/gfwlist\nserver=/pornluxme.com/127.0.0.1#5335\nipset=/pornluxme.com/gfwlist\nserver=/vimeoondemand.com/127.0.0.1#5335\nipset=/vimeoondemand.com/gfwlist\nserver=/binancezh.pro/127.0.0.1#5335\nipset=/binancezh.pro/gfwlist\nserver=/cherryasia.com/127.0.0.1#5335\nipset=/cherryasia.com/gfwlist\nserver=/facebookportal.com/127.0.0.1#5335\nipset=/facebookportal.com/gfwlist\nserver=/ecapi-pchome.cdn.hinet.net/127.0.0.1#5335\nipset=/ecapi-pchome.cdn.hinet.net/gfwlist\nserver=/pornotime.net/127.0.0.1#5335\nipset=/pornotime.net/gfwlist\nserver=/playcover.workers.dev/127.0.0.1#5335\nipset=/playcover.workers.dev/gfwlist\nserver=/eromanga-cafe.com/127.0.0.1#5335\nipset=/eromanga-cafe.com/gfwlist\nserver=/monsterbydrebeat.com/127.0.0.1#5335\nipset=/monsterbydrebeat.com/gfwlist\nserver=/leaguehighschool.com/127.0.0.1#5335\nipset=/leaguehighschool.com/gfwlist\nserver=/dettol.pt/127.0.0.1#5335\nipset=/dettol.pt/gfwlist\nserver=/veet.com/127.0.0.1#5335\nipset=/veet.com/gfwlist\nserver=/explorespanking.com/127.0.0.1#5335\nipset=/explorespanking.com/gfwlist\nserver=/spore.com/127.0.0.1#5335\nipset=/spore.com/gfwlist\nserver=/dot.net/127.0.0.1#5335\nipset=/dot.net/gfwlist\nserver=/viacomcbs.com/127.0.0.1#5335\nipset=/viacomcbs.com/gfwlist\nserver=/youtubego.co.in/127.0.0.1#5335\nipset=/youtubego.co.in/gfwlist\nserver=/mini-connected.ch/127.0.0.1#5335\nipset=/mini-connected.ch/gfwlist\nserver=/strepsils.ru/127.0.0.1#5335\nipset=/strepsils.ru/gfwlist\nserver=/kk.stream/127.0.0.1#5335\nipset=/kk.stream/gfwlist\nserver=/designeriphonescases.com/127.0.0.1#5335\nipset=/designeriphonescases.com/gfwlist\nserver=/porn-star.com/127.0.0.1#5335\nipset=/porn-star.com/gfwlist\nserver=/onlinexxxgames.com/127.0.0.1#5335\nipset=/onlinexxxgames.com/gfwlist\nserver=/shotwithgeforce.com/127.0.0.1#5335\nipset=/shotwithgeforce.com/gfwlist\nserver=/mcdonalds.com.hk/127.0.0.1#5335\nipset=/mcdonalds.com.hk/gfwlist\nserver=/heyzo.com/127.0.0.1#5335\nipset=/heyzo.com/gfwlist\nserver=/hpcodewarsbcn.com/127.0.0.1#5335\nipset=/hpcodewarsbcn.com/gfwlist\nserver=/dmm-extension.com/127.0.0.1#5335\nipset=/dmm-extension.com/gfwlist\nserver=/windowsupdate.com/127.0.0.1#5335\nipset=/windowsupdate.com/gfwlist\nserver=/akamaiphillipines.net/127.0.0.1#5335\nipset=/akamaiphillipines.net/gfwlist\nserver=/visa-atm.com/127.0.0.1#5335\nipset=/visa-atm.com/gfwlist\nserver=/pornbozz.com/127.0.0.1#5335\nipset=/pornbozz.com/gfwlist\nserver=/linegame.jp/127.0.0.1#5335\nipset=/linegame.jp/gfwlist\nserver=/xn--gogl-1nd42e.com/127.0.0.1#5335\nipset=/xn--gogl-1nd42e.com/gfwlist\nserver=/bmw.com.mo/127.0.0.1#5335\nipset=/bmw.com.mo/gfwlist\nserver=/bdawnvr.xyz/127.0.0.1#5335\nipset=/bdawnvr.xyz/gfwlist\nserver=/bloomberglaw.com/127.0.0.1#5335\nipset=/bloomberglaw.com/gfwlist\nserver=/qualcomm.com/127.0.0.1#5335\nipset=/qualcomm.com/gfwlist\nserver=/scoreuniverse.com/127.0.0.1#5335\nipset=/scoreuniverse.com/gfwlist\nserver=/czechmassage.com/127.0.0.1#5335\nipset=/czechmassage.com/gfwlist\nserver=/attexperts.com/127.0.0.1#5335\nipset=/attexperts.com/gfwlist\nserver=/soundofhope.org/127.0.0.1#5335\nipset=/soundofhope.org/gfwlist\nserver=/swissign.com/127.0.0.1#5335\nipset=/swissign.com/gfwlist\nserver=/dndbeyond.com/127.0.0.1#5335\nipset=/dndbeyond.com/gfwlist\nserver=/thawte.de/127.0.0.1#5335\nipset=/thawte.de/gfwlist\nserver=/picpost.com/127.0.0.1#5335\nipset=/picpost.com/gfwlist\nserver=/animalzoosex.me/127.0.0.1#5335\nipset=/animalzoosex.me/gfwlist\nserver=/motionpictureser.com/127.0.0.1#5335\nipset=/motionpictureser.com/gfwlist\nserver=/shopee.sg/127.0.0.1#5335\nipset=/shopee.sg/gfwlist\nserver=/bloombergspace.com/127.0.0.1#5335\nipset=/bloombergspace.com/gfwlist\nserver=/lghvacstory.com/127.0.0.1#5335\nipset=/lghvacstory.com/gfwlist\nserver=/instagram-press.com/127.0.0.1#5335\nipset=/instagram-press.com/gfwlist\nserver=/theepochtimessubscribe.com/127.0.0.1#5335\nipset=/theepochtimessubscribe.com/gfwlist\nserver=/pleasurebabe.com/127.0.0.1#5335\nipset=/pleasurebabe.com/gfwlist\nserver=/tube2012.com/127.0.0.1#5335\nipset=/tube2012.com/gfwlist\nserver=/unlocklimitlesslearning.com/127.0.0.1#5335\nipset=/unlocklimitlesslearning.com/gfwlist\nserver=/anm.co.uk/127.0.0.1#5335\nipset=/anm.co.uk/gfwlist\nserver=/newsensations.com/127.0.0.1#5335\nipset=/newsensations.com/gfwlist\nserver=/hulugo.com/127.0.0.1#5335\nipset=/hulugo.com/gfwlist\nserver=/nubileset.com/127.0.0.1#5335\nipset=/nubileset.com/gfwlist\nserver=/pornachi.com/127.0.0.1#5335\nipset=/pornachi.com/gfwlist\nserver=/verhentai.tv/127.0.0.1#5335\nipset=/verhentai.tv/gfwlist\nserver=/shoptraivip.com/127.0.0.1#5335\nipset=/shoptraivip.com/gfwlist\nserver=/anibooru.com/127.0.0.1#5335\nipset=/anibooru.com/gfwlist\nserver=/scholar.google.com.sv/127.0.0.1#5335\nipset=/scholar.google.com.sv/gfwlist\nserver=/archlinux.org/127.0.0.1#5335\nipset=/archlinux.org/gfwlist\nserver=/every1dns.net/127.0.0.1#5335\nipset=/every1dns.net/gfwlist\nserver=/zoozhamster.com/127.0.0.1#5335\nipset=/zoozhamster.com/gfwlist\nserver=/googel.com/127.0.0.1#5335\nipset=/googel.com/gfwlist\nserver=/binance.me/127.0.0.1#5335\nipset=/binance.me/gfwlist\nserver=/pre-bmwgroup.jobs/127.0.0.1#5335\nipset=/pre-bmwgroup.jobs/gfwlist\nserver=/freeuseporn.com/127.0.0.1#5335\nipset=/freeuseporn.com/gfwlist\nserver=/nbabot.net/127.0.0.1#5335\nipset=/nbabot.net/gfwlist\nserver=/hentaifromhell.org/127.0.0.1#5335\nipset=/hentaifromhell.org/gfwlist\nserver=/aboutporno.net/127.0.0.1#5335\nipset=/aboutporno.net/gfwlist\nserver=/sourcingforebay.tv/127.0.0.1#5335\nipset=/sourcingforebay.tv/gfwlist\nserver=/hketgroup.com/127.0.0.1#5335\nipset=/hketgroup.com/gfwlist\nserver=/91qk41rf.com/127.0.0.1#5335\nipset=/91qk41rf.com/gfwlist\nserver=/nintendo.at/127.0.0.1#5335\nipset=/nintendo.at/gfwlist\nserver=/sldolls.com/127.0.0.1#5335\nipset=/sldolls.com/gfwlist\nserver=/speeddreamride.com/127.0.0.1#5335\nipset=/speeddreamride.com/gfwlist\nserver=/disney.my/127.0.0.1#5335\nipset=/disney.my/gfwlist\nserver=/hdouga.com/127.0.0.1#5335\nipset=/hdouga.com/gfwlist\nserver=/instagranm.com/127.0.0.1#5335\nipset=/instagranm.com/gfwlist\nserver=/hellven.net/127.0.0.1#5335\nipset=/hellven.net/gfwlist\nserver=/bridgestone.co.th/127.0.0.1#5335\nipset=/bridgestone.co.th/gfwlist\nserver=/amazonworkdocs.com/127.0.0.1#5335\nipset=/amazonworkdocs.com/gfwlist\nserver=/ghettotube.com/127.0.0.1#5335\nipset=/ghettotube.com/gfwlist\nserver=/useplannr.com/127.0.0.1#5335\nipset=/useplannr.com/gfwlist\nserver=/disney.se/127.0.0.1#5335\nipset=/disney.se/gfwlist\nserver=/fontexplorerx.com/127.0.0.1#5335\nipset=/fontexplorerx.com/gfwlist\nserver=/yahoo.si/127.0.0.1#5335\nipset=/yahoo.si/gfwlist\nserver=/fescebook.com/127.0.0.1#5335\nipset=/fescebook.com/gfwlist\nserver=/arabgirls.us/127.0.0.1#5335\nipset=/arabgirls.us/gfwlist\nserver=/eroterest.net/127.0.0.1#5335\nipset=/eroterest.net/gfwlist\nserver=/justnudepic.com/127.0.0.1#5335\nipset=/justnudepic.com/gfwlist\nserver=/nikeairmaxs.com/127.0.0.1#5335\nipset=/nikeairmaxs.com/gfwlist\nserver=/fox35orlando.com/127.0.0.1#5335\nipset=/fox35orlando.com/gfwlist\nserver=/seksmet.nl/127.0.0.1#5335\nipset=/seksmet.nl/gfwlist\nserver=/visa.pt/127.0.0.1#5335\nipset=/visa.pt/gfwlist\nserver=/celebgramme.com/127.0.0.1#5335\nipset=/celebgramme.com/gfwlist\nserver=/d2mrry2to5rg.com/127.0.0.1#5335\nipset=/d2mrry2to5rg.com/gfwlist\nserver=/ebayoncampus.com/127.0.0.1#5335\nipset=/ebayoncampus.com/gfwlist\nserver=/sankei-eiga.co.jp/127.0.0.1#5335\nipset=/sankei-eiga.co.jp/gfwlist\nserver=/renminbao.com/127.0.0.1#5335\nipset=/renminbao.com/gfwlist\nserver=/youtrannytube.com/127.0.0.1#5335\nipset=/youtrannytube.com/gfwlist\nserver=/vmwgcomms.com/127.0.0.1#5335\nipset=/vmwgcomms.com/gfwlist\nserver=/vidmpreview.com/127.0.0.1#5335\nipset=/vidmpreview.com/gfwlist\nserver=/finehub.com/127.0.0.1#5335\nipset=/finehub.com/gfwlist\nserver=/nyt.net/127.0.0.1#5335\nipset=/nyt.net/gfwlist\nserver=/curseforge.com/127.0.0.1#5335\nipset=/curseforge.com/gfwlist\nserver=/francemail.com/127.0.0.1#5335\nipset=/francemail.com/gfwlist\nserver=/nutaku.net/127.0.0.1#5335\nipset=/nutaku.net/gfwlist\nserver=/vfsco.se/127.0.0.1#5335\nipset=/vfsco.se/gfwlist\nserver=/04647.club/127.0.0.1#5335\nipset=/04647.club/gfwlist\nserver=/miniworkshop.com/127.0.0.1#5335\nipset=/miniworkshop.com/gfwlist\nserver=/nike-org.com/127.0.0.1#5335\nipset=/nike-org.com/gfwlist\nserver=/paypal-business.org/127.0.0.1#5335\nipset=/paypal-business.org/gfwlist\nserver=/bmw.com.ph/127.0.0.1#5335\nipset=/bmw.com.ph/gfwlist\nserver=/bookclubcorner.com/127.0.0.1#5335\nipset=/bookclubcorner.com/gfwlist\nserver=/xnxx4porn.com/127.0.0.1#5335\nipset=/xnxx4porn.com/gfwlist\nserver=/eurobabeindex.com/127.0.0.1#5335\nipset=/eurobabeindex.com/gfwlist\nserver=/braintreeps.com/127.0.0.1#5335\nipset=/braintreeps.com/gfwlist\nserver=/siterips.org/127.0.0.1#5335\nipset=/siterips.org/gfwlist\nserver=/drebeats-singapore.net/127.0.0.1#5335\nipset=/drebeats-singapore.net/gfwlist\nserver=/czechhunter.com/127.0.0.1#5335\nipset=/czechhunter.com/gfwlist\nserver=/bili999.com/127.0.0.1#5335\nipset=/bili999.com/gfwlist\nserver=/volvotrucks.sg/127.0.0.1#5335\nipset=/volvotrucks.sg/gfwlist\nserver=/vct.news/127.0.0.1#5335\nipset=/vct.news/gfwlist\nserver=/cashbycashapp.com/127.0.0.1#5335\nipset=/cashbycashapp.com/gfwlist\nserver=/beats-headphones.us/127.0.0.1#5335\nipset=/beats-headphones.us/gfwlist\nserver=/alphera.co.in/127.0.0.1#5335\nipset=/alphera.co.in/gfwlist\nserver=/shegods.com/127.0.0.1#5335\nipset=/shegods.com/gfwlist\nserver=/webex.co.uk/127.0.0.1#5335\nipset=/webex.co.uk/gfwlist\nserver=/driverxxx.com/127.0.0.1#5335\nipset=/driverxxx.com/gfwlist\nserver=/youtube.hu/127.0.0.1#5335\nipset=/youtube.hu/gfwlist\nserver=/alphabet.asia/127.0.0.1#5335\nipset=/alphabet.asia/gfwlist\nserver=/claravenger.com/127.0.0.1#5335\nipset=/claravenger.com/gfwlist\nserver=/epicbrowser.com/127.0.0.1#5335\nipset=/epicbrowser.com/gfwlist\nserver=/beatsbydrdres.com/127.0.0.1#5335\nipset=/beatsbydrdres.com/gfwlist\nserver=/beatsbydreboxingdayca.com/127.0.0.1#5335\nipset=/beatsbydreboxingdayca.com/gfwlist\nserver=/youtube.co.jp/127.0.0.1#5335\nipset=/youtube.co.jp/gfwlist\nserver=/admob.com/127.0.0.1#5335\nipset=/admob.com/gfwlist\nserver=/paypal-plaza.com/127.0.0.1#5335\nipset=/paypal-plaza.com/gfwlist\nserver=/alterauserforums.com/127.0.0.1#5335\nipset=/alterauserforums.com/gfwlist\nserver=/vfsco.com.br/127.0.0.1#5335\nipset=/vfsco.com.br/gfwlist\nserver=/cfwives.com/127.0.0.1#5335\nipset=/cfwives.com/gfwlist\nserver=/rbbusinessshop.com/127.0.0.1#5335\nipset=/rbbusinessshop.com/gfwlist\nserver=/steamgames.com/127.0.0.1#5335\nipset=/steamgames.com/gfwlist\nserver=/aziani.com/127.0.0.1#5335\nipset=/aziani.com/gfwlist\nserver=/youpornxvideos.net/127.0.0.1#5335\nipset=/youpornxvideos.net/gfwlist\nserver=/bmw.tt/127.0.0.1#5335\nipset=/bmw.tt/gfwlist\nserver=/directvlosangeles.com/127.0.0.1#5335\nipset=/directvlosangeles.com/gfwlist\nserver=/javgrown.com/127.0.0.1#5335\nipset=/javgrown.com/gfwlist\nserver=/sonypicturesanimation.com/127.0.0.1#5335\nipset=/sonypicturesanimation.com/gfwlist\nserver=/canon-emea.com/127.0.0.1#5335\nipset=/canon-emea.com/gfwlist\nserver=/escortgirls.be/127.0.0.1#5335\nipset=/escortgirls.be/gfwlist\nserver=/faceboot.com/127.0.0.1#5335\nipset=/faceboot.com/gfwlist\nserver=/gopivotal.com/127.0.0.1#5335\nipset=/gopivotal.com/gfwlist\nserver=/tvmedia.net.au/127.0.0.1#5335\nipset=/tvmedia.net.au/gfwlist\nserver=/geeksquad.com/127.0.0.1#5335\nipset=/geeksquad.com/gfwlist\nserver=/time.gov/127.0.0.1#5335\nipset=/time.gov/gfwlist\nserver=/amplifyframework.com/127.0.0.1#5335\nipset=/amplifyframework.com/gfwlist\nserver=/licensebuttons.net/127.0.0.1#5335\nipset=/licensebuttons.net/gfwlist\nserver=/scolle.net/127.0.0.1#5335\nipset=/scolle.net/gfwlist\nserver=/microsoft365.com/127.0.0.1#5335\nipset=/microsoft365.com/gfwlist\nserver=/pypl.tv/127.0.0.1#5335\nipset=/pypl.tv/gfwlist\nserver=/zeenews-fonts.s3.amazonaws.com/127.0.0.1#5335\nipset=/zeenews-fonts.s3.amazonaws.com/gfwlist\nserver=/groupfun.com/127.0.0.1#5335\nipset=/groupfun.com/gfwlist\nserver=/paypalbeacon.com/127.0.0.1#5335\nipset=/paypalbeacon.com/gfwlist\nserver=/mray.club/127.0.0.1#5335\nipset=/mray.club/gfwlist\nserver=/pornoweb.hu/127.0.0.1#5335\nipset=/pornoweb.hu/gfwlist\nserver=/4pig.com/127.0.0.1#5335\nipset=/4pig.com/gfwlist\nserver=/zoig.com/127.0.0.1#5335\nipset=/zoig.com/gfwlist\nserver=/pokemonvgc.com/127.0.0.1#5335\nipset=/pokemonvgc.com/gfwlist\nserver=/booking.com/127.0.0.1#5335\nipset=/booking.com/gfwlist\nserver=/intel.sy/127.0.0.1#5335\nipset=/intel.sy/gfwlist\nserver=/paypal-signin.us/127.0.0.1#5335\nipset=/paypal-signin.us/gfwlist\nserver=/yuraku.8v8.be/127.0.0.1#5335\nipset=/yuraku.8v8.be/gfwlist\nserver=/foxsportssupports.com/127.0.0.1#5335\nipset=/foxsportssupports.com/gfwlist\nserver=/yahoo.com.om/127.0.0.1#5335\nipset=/yahoo.com.om/gfwlist\nserver=/google.dk/127.0.0.1#5335\nipset=/google.dk/gfwlist\nserver=/globaledu.org/127.0.0.1#5335\nipset=/globaledu.org/gfwlist\nserver=/veet.com.sg/127.0.0.1#5335\nipset=/veet.com.sg/gfwlist\nserver=/wealth.com.tw/127.0.0.1#5335\nipset=/wealth.com.tw/gfwlist\nserver=/downloadpass.com/127.0.0.1#5335\nipset=/downloadpass.com/gfwlist\nserver=/global-sci.org/127.0.0.1#5335\nipset=/global-sci.org/gfwlist\nserver=/paragon.com/127.0.0.1#5335\nipset=/paragon.com/gfwlist\nserver=/bangkokstreetwhores.com/127.0.0.1#5335\nipset=/bangkokstreetwhores.com/gfwlist\nserver=/genshin-porn.com/127.0.0.1#5335\nipset=/genshin-porn.com/gfwlist\nserver=/mastercard.com.ph/127.0.0.1#5335\nipset=/mastercard.com.ph/gfwlist\nserver=/shopee.com/127.0.0.1#5335\nipset=/shopee.com/gfwlist\nserver=/123sex.top/127.0.0.1#5335\nipset=/123sex.top/gfwlist\nserver=/sonydesign.com/127.0.0.1#5335\nipset=/sonydesign.com/gfwlist\nserver=/myconstructionworld.net/127.0.0.1#5335\nipset=/myconstructionworld.net/gfwlist\nserver=/celebforum.co/127.0.0.1#5335\nipset=/celebforum.co/gfwlist\nserver=/streamable.com/127.0.0.1#5335\nipset=/streamable.com/gfwlist\nserver=/foxkansas.com/127.0.0.1#5335\nipset=/foxkansas.com/gfwlist\nserver=/fbcdn.com/127.0.0.1#5335\nipset=/fbcdn.com/gfwlist\nserver=/retrohomevideos.com/127.0.0.1#5335\nipset=/retrohomevideos.com/gfwlist\nserver=/wearehairy.com/127.0.0.1#5335\nipset=/wearehairy.com/gfwlist\nserver=/dcard.io/127.0.0.1#5335\nipset=/dcard.io/gfwlist\nserver=/youtube.sa/127.0.0.1#5335\nipset=/youtube.sa/gfwlist\nserver=/21hub.com/127.0.0.1#5335\nipset=/21hub.com/gfwlist\nserver=/foxlexington.com/127.0.0.1#5335\nipset=/foxlexington.com/gfwlist\nserver=/lindylist.org/127.0.0.1#5335\nipset=/lindylist.org/gfwlist\nserver=/dvh30n.vip/127.0.0.1#5335\nipset=/dvh30n.vip/gfwlist\nserver=/property.com.au/127.0.0.1#5335\nipset=/property.com.au/gfwlist\nserver=/pussy3dporn.com/127.0.0.1#5335\nipset=/pussy3dporn.com/gfwlist\nserver=/gcolle.net/127.0.0.1#5335\nipset=/gcolle.net/gfwlist\nserver=/paypal.info/127.0.0.1#5335\nipset=/paypal.info/gfwlist\nserver=/xuite.net/127.0.0.1#5335\nipset=/xuite.net/gfwlist\nserver=/google.ne/127.0.0.1#5335\nipset=/google.ne/gfwlist\nserver=/rethink.net/127.0.0.1#5335\nipset=/rethink.net/gfwlist\nserver=/tinyurl.com/127.0.0.1#5335\nipset=/tinyurl.com/gfwlist\nserver=/trikepatrol.com/127.0.0.1#5335\nipset=/trikepatrol.com/gfwlist\nserver=/ettrade.com.hk/127.0.0.1#5335\nipset=/ettrade.com.hk/gfwlist\nserver=/volvotrucks.tm/127.0.0.1#5335\nipset=/volvotrucks.tm/gfwlist\nserver=/aacrjournals.org/127.0.0.1#5335\nipset=/aacrjournals.org/gfwlist\nserver=/gmoney.org/127.0.0.1#5335\nipset=/gmoney.org/gfwlist\nserver=/youtube.com.pk/127.0.0.1#5335\nipset=/youtube.com.pk/gfwlist\nserver=/fox46charlotte.com/127.0.0.1#5335\nipset=/fox46charlotte.com/gfwlist\nserver=/apple-store.wang/127.0.0.1#5335\nipset=/apple-store.wang/gfwlist\nserver=/phprcdn.com/127.0.0.1#5335\nipset=/phprcdn.com/gfwlist\nserver=/sagepub.com/127.0.0.1#5335\nipset=/sagepub.com/gfwlist\nserver=/onlyhomemadeanal.com/127.0.0.1#5335\nipset=/onlyhomemadeanal.com/gfwlist\nserver=/direectv.com/127.0.0.1#5335\nipset=/direectv.com/gfwlist\nserver=/durex.co.nz/127.0.0.1#5335\nipset=/durex.co.nz/gfwlist\nserver=/meitula.net/127.0.0.1#5335\nipset=/meitula.net/gfwlist\nserver=/flyflv.com/127.0.0.1#5335\nipset=/flyflv.com/gfwlist\nserver=/api-p.videomarket.jp/127.0.0.1#5335\nipset=/api-p.videomarket.jp/gfwlist\nserver=/applestore.qa/127.0.0.1#5335\nipset=/applestore.qa/gfwlist\nserver=/strepsils.co.kr/127.0.0.1#5335\nipset=/strepsils.co.kr/gfwlist\nserver=/mini101.ca/127.0.0.1#5335\nipset=/mini101.ca/gfwlist\nserver=/area51.to/127.0.0.1#5335\nipset=/area51.to/gfwlist\nserver=/minimotoringschool.com/127.0.0.1#5335\nipset=/minimotoringschool.com/gfwlist\nserver=/bbthat.com/127.0.0.1#5335\nipset=/bbthat.com/gfwlist\nserver=/freejavporn.mobi/127.0.0.1#5335\nipset=/freejavporn.mobi/gfwlist\nserver=/huanyuju.com/127.0.0.1#5335\nipset=/huanyuju.com/gfwlist\nserver=/chobit.cc/127.0.0.1#5335\nipset=/chobit.cc/gfwlist\nserver=/huluinstantmessenger.com/127.0.0.1#5335\nipset=/huluinstantmessenger.com/gfwlist\nserver=/gameuxmasterguide.com/127.0.0.1#5335\nipset=/gameuxmasterguide.com/gfwlist\nserver=/alphabet.lu/127.0.0.1#5335\nipset=/alphabet.lu/gfwlist\nserver=/mastercard.be/127.0.0.1#5335\nipset=/mastercard.be/gfwlist\nserver=/foxnewsgo.tv/127.0.0.1#5335\nipset=/foxnewsgo.tv/gfwlist\nserver=/ipodtouch.co/127.0.0.1#5335\nipset=/ipodtouch.co/gfwlist\nserver=/tjsbfj.com/127.0.0.1#5335\nipset=/tjsbfj.com/gfwlist\nserver=/markzuckerberg.com/127.0.0.1#5335\nipset=/markzuckerberg.com/gfwlist\nserver=/visa.tc/127.0.0.1#5335\nipset=/visa.tc/gfwlist\nserver=/totalmateria.com/127.0.0.1#5335\nipset=/totalmateria.com/gfwlist\nserver=/dnaspaces.io/127.0.0.1#5335\nipset=/dnaspaces.io/gfwlist\nserver=/bmw.co.uk/127.0.0.1#5335\nipset=/bmw.co.uk/gfwlist\nserver=/angle.com.tw/127.0.0.1#5335\nipset=/angle.com.tw/gfwlist\nserver=/facebook-pmdcenter.net/127.0.0.1#5335\nipset=/facebook-pmdcenter.net/gfwlist\nserver=/nvidia.com.ve/127.0.0.1#5335\nipset=/nvidia.com.ve/gfwlist\nserver=/nicoseiga.jp/127.0.0.1#5335\nipset=/nicoseiga.jp/gfwlist\nserver=/durex.com.hr/127.0.0.1#5335\nipset=/durex.com.hr/gfwlist\nserver=/69story.com/127.0.0.1#5335\nipset=/69story.com/gfwlist\nserver=/microsoftonline-p.com/127.0.0.1#5335\nipset=/microsoftonline-p.com/gfwlist\nserver=/aliveitsm.com/127.0.0.1#5335\nipset=/aliveitsm.com/gfwlist\nserver=/coova.com/127.0.0.1#5335\nipset=/coova.com/gfwlist\nserver=/ipod.es/127.0.0.1#5335\nipset=/ipod.es/gfwlist\nserver=/leagueoflegends.ca/127.0.0.1#5335\nipset=/leagueoflegends.ca/gfwlist\nserver=/examroom.info/127.0.0.1#5335\nipset=/examroom.info/gfwlist\nserver=/nintendo.net/127.0.0.1#5335\nipset=/nintendo.net/gfwlist\nserver=/linseysworld.com/127.0.0.1#5335\nipset=/linseysworld.com/gfwlist\nserver=/veet.cl/127.0.0.1#5335\nipset=/veet.cl/gfwlist\nserver=/pornsos.com/127.0.0.1#5335\nipset=/pornsos.com/gfwlist\nserver=/kingcomix.com/127.0.0.1#5335\nipset=/kingcomix.com/gfwlist\nserver=/volvotrucks.co.ao/127.0.0.1#5335\nipset=/volvotrucks.co.ao/gfwlist\nserver=/beegfree.com/127.0.0.1#5335\nipset=/beegfree.com/gfwlist\nserver=/fleshbot.com/127.0.0.1#5335\nipset=/fleshbot.com/gfwlist\nserver=/bsw.co.jp/127.0.0.1#5335\nipset=/bsw.co.jp/gfwlist\nserver=/freepornpreview.net/127.0.0.1#5335\nipset=/freepornpreview.net/gfwlist\nserver=/hothdsex.xxx/127.0.0.1#5335\nipset=/hothdsex.xxx/gfwlist\nserver=/horseporn.tv/127.0.0.1#5335\nipset=/horseporn.tv/gfwlist\nserver=/imagecurl.org/127.0.0.1#5335\nipset=/imagecurl.org/gfwlist\nserver=/floppy-tits.com/127.0.0.1#5335\nipset=/floppy-tits.com/gfwlist\nserver=/mastercard.cz/127.0.0.1#5335\nipset=/mastercard.cz/gfwlist\nserver=/volvogroup.fr/127.0.0.1#5335\nipset=/volvogroup.fr/gfwlist\nserver=/881903.com/127.0.0.1#5335\nipset=/881903.com/gfwlist\nserver=/webcams.tv/127.0.0.1#5335\nipset=/webcams.tv/gfwlist\nserver=/contactossexoecuador.com/127.0.0.1#5335\nipset=/contactossexoecuador.com/gfwlist\nserver=/bbystatic.com/127.0.0.1#5335\nipset=/bbystatic.com/gfwlist\nserver=/netflixdnstest9.com/127.0.0.1#5335\nipset=/netflixdnstest9.com/gfwlist\nserver=/suruga-ya.jp/127.0.0.1#5335\nipset=/suruga-ya.jp/gfwlist\nserver=/girlssexxxx.com/127.0.0.1#5335\nipset=/girlssexxxx.com/gfwlist\nserver=/sony.be/127.0.0.1#5335\nipset=/sony.be/gfwlist\nserver=/bmw-saudiarabia.com/127.0.0.1#5335\nipset=/bmw-saudiarabia.com/gfwlist\nserver=/ero-anime.net/127.0.0.1#5335\nipset=/ero-anime.net/gfwlist\nserver=/intel.af/127.0.0.1#5335\nipset=/intel.af/gfwlist\nserver=/whoreasianporn.com/127.0.0.1#5335\nipset=/whoreasianporn.com/gfwlist\nserver=/qualcomm.co.uk/127.0.0.1#5335\nipset=/qualcomm.co.uk/gfwlist\nserver=/cheapbeatsbydrestudioedition.com/127.0.0.1#5335\nipset=/cheapbeatsbydrestudioedition.com/gfwlist\nserver=/maddenseason.net/127.0.0.1#5335\nipset=/maddenseason.net/gfwlist\nserver=/verisign.vn/127.0.0.1#5335\nipset=/verisign.vn/gfwlist\nserver=/wildfreevideos.com/127.0.0.1#5335\nipset=/wildfreevideos.com/gfwlist\nserver=/intel.com.my/127.0.0.1#5335\nipset=/intel.com.my/gfwlist\nserver=/yahoo.com.mt/127.0.0.1#5335\nipset=/yahoo.com.mt/gfwlist\nserver=/spiceworksstatic.com/127.0.0.1#5335\nipset=/spiceworksstatic.com/gfwlist\nserver=/uhairy.com/127.0.0.1#5335\nipset=/uhairy.com/gfwlist\nserver=/pricelesshongkong.com/127.0.0.1#5335\nipset=/pricelesshongkong.com/gfwlist\nserver=/hkteducation.com/127.0.0.1#5335\nipset=/hkteducation.com/gfwlist\nserver=/mini.kz/127.0.0.1#5335\nipset=/mini.kz/gfwlist\nserver=/justindianporn.me/127.0.0.1#5335\nipset=/justindianporn.me/gfwlist\nserver=/google.com.af/127.0.0.1#5335\nipset=/google.com.af/gfwlist\nserver=/paypalonline.org/127.0.0.1#5335\nipset=/paypalonline.org/gfwlist\nserver=/rea.io/127.0.0.1#5335\nipset=/rea.io/gfwlist\nserver=/bmwcolorado.com/127.0.0.1#5335\nipset=/bmwcolorado.com/gfwlist\nserver=/financialadvisoriq.com/127.0.0.1#5335\nipset=/financialadvisoriq.com/gfwlist\nserver=/instantssl.com/127.0.0.1#5335\nipset=/instantssl.com/gfwlist\nserver=/strepsils.com.hk/127.0.0.1#5335\nipset=/strepsils.com.hk/gfwlist\nserver=/teen-girl.net/127.0.0.1#5335\nipset=/teen-girl.net/gfwlist\nserver=/iwara.tv/127.0.0.1#5335\nipset=/iwara.tv/gfwlist\nserver=/nudewomenpics.net/127.0.0.1#5335\nipset=/nudewomenpics.net/gfwlist\nserver=/facebook.design/127.0.0.1#5335\nipset=/facebook.design/gfwlist\nserver=/mini.com.uy/127.0.0.1#5335\nipset=/mini.com.uy/gfwlist\nserver=/illusion.jp/127.0.0.1#5335\nipset=/illusion.jp/gfwlist\nserver=/i-scmp.com/127.0.0.1#5335\nipset=/i-scmp.com/gfwlist\nserver=/kindteenporn.com/127.0.0.1#5335\nipset=/kindteenporn.com/gfwlist\nserver=/ikea.co.kr/127.0.0.1#5335\nipset=/ikea.co.kr/gfwlist\nserver=/volvotrucks.gr/127.0.0.1#5335\nipset=/volvotrucks.gr/gfwlist\nserver=/hentaiknight.com/127.0.0.1#5335\nipset=/hentaiknight.com/gfwlist\nserver=/foxplus.com/127.0.0.1#5335\nipset=/foxplus.com/gfwlist\nserver=/adult3dtoons.com/127.0.0.1#5335\nipset=/adult3dtoons.com/gfwlist\nserver=/hkcsl.com/127.0.0.1#5335\nipset=/hkcsl.com/gfwlist\nserver=/nurofen.it/127.0.0.1#5335\nipset=/nurofen.it/gfwlist\nserver=/instagramn.com/127.0.0.1#5335\nipset=/instagramn.com/gfwlist\nserver=/dafahao.com/127.0.0.1#5335\nipset=/dafahao.com/gfwlist\nserver=/zerohedge.com/127.0.0.1#5335\nipset=/zerohedge.com/gfwlist\nserver=/adobe-aemassets-value.com/127.0.0.1#5335\nipset=/adobe-aemassets-value.com/gfwlist\nserver=/login-account.net/127.0.0.1#5335\nipset=/login-account.net/gfwlist\nserver=/tubetria.mobi/127.0.0.1#5335\nipset=/tubetria.mobi/gfwlist\nserver=/gaysitessearch.cc/127.0.0.1#5335\nipset=/gaysitessearch.cc/gfwlist\nserver=/nikeselling.com/127.0.0.1#5335\nipset=/nikeselling.com/gfwlist\nserver=/satnym.com/127.0.0.1#5335\nipset=/satnym.com/gfwlist\nserver=/flow.dev/127.0.0.1#5335\nipset=/flow.dev/gfwlist\nserver=/beats-deal.com/127.0.0.1#5335\nipset=/beats-deal.com/gfwlist\nserver=/bigdickorgasm.com/127.0.0.1#5335\nipset=/bigdickorgasm.com/gfwlist\nserver=/linefriends.com/127.0.0.1#5335\nipset=/linefriends.com/gfwlist\nserver=/yourcolonoscopy.com/127.0.0.1#5335\nipset=/yourcolonoscopy.com/gfwlist\nserver=/comodo.com/127.0.0.1#5335\nipset=/comodo.com/gfwlist\nserver=/beatsmusic.wang/127.0.0.1#5335\nipset=/beatsmusic.wang/gfwlist\nserver=/powerbook.eu/127.0.0.1#5335\nipset=/powerbook.eu/gfwlist\nserver=/bmwoftulsa.com/127.0.0.1#5335\nipset=/bmwoftulsa.com/gfwlist\nserver=/wkap.nl/127.0.0.1#5335\nipset=/wkap.nl/gfwlist\nserver=/blogspot.cf/127.0.0.1#5335\nipset=/blogspot.cf/gfwlist\nserver=/paypal.com.sg/127.0.0.1#5335\nipset=/paypal.com.sg/gfwlist\nserver=/ebaymotorsblog.com/127.0.0.1#5335\nipset=/ebaymotorsblog.com/gfwlist\nserver=/youtube.com.bd/127.0.0.1#5335\nipset=/youtube.com.bd/gfwlist\nserver=/knoxemm.com/127.0.0.1#5335\nipset=/knoxemm.com/gfwlist\nserver=/wdc.com/127.0.0.1#5335\nipset=/wdc.com/gfwlist\nserver=/beats-seller.com/127.0.0.1#5335\nipset=/beats-seller.com/gfwlist\nserver=/voyeurhit.com/127.0.0.1#5335\nipset=/voyeurhit.com/gfwlist\nserver=/mrlivecam.com/127.0.0.1#5335\nipset=/mrlivecam.com/gfwlist\nserver=/appcloud.com/127.0.0.1#5335\nipset=/appcloud.com/gfwlist\nserver=/mini.hu/127.0.0.1#5335\nipset=/mini.hu/gfwlist\nserver=/discord.gifts/127.0.0.1#5335\nipset=/discord.gifts/gfwlist\nserver=/els-cdn.com/127.0.0.1#5335\nipset=/els-cdn.com/gfwlist\nserver=/visceralgames.com/127.0.0.1#5335\nipset=/visceralgames.com/gfwlist\nserver=/volvotrucks.com.tw/127.0.0.1#5335\nipset=/volvotrucks.com.tw/gfwlist\nserver=/chinapress.com.my/127.0.0.1#5335\nipset=/chinapress.com.my/gfwlist\nserver=/dettol.cz/127.0.0.1#5335\nipset=/dettol.cz/gfwlist\nserver=/paypal-activate.info/127.0.0.1#5335\nipset=/paypal-activate.info/gfwlist\nserver=/bmw.se/127.0.0.1#5335\nipset=/bmw.se/gfwlist\nserver=/nike-us.com/127.0.0.1#5335\nipset=/nike-us.com/gfwlist\nserver=/appstore.my/127.0.0.1#5335\nipset=/appstore.my/gfwlist\nserver=/ebay.it/127.0.0.1#5335\nipset=/ebay.it/gfwlist\nserver=/iza.ne.jp/127.0.0.1#5335\nipset=/iza.ne.jp/gfwlist\nserver=/adguard-vpn.com/127.0.0.1#5335\nipset=/adguard-vpn.com/gfwlist\nserver=/scmp.com/127.0.0.1#5335\nipset=/scmp.com/gfwlist\nserver=/voanouvel.com/127.0.0.1#5335\nipset=/voanouvel.com/gfwlist\nserver=/f3b7q2p3.ssl.hwcdn.net/127.0.0.1#5335\nipset=/f3b7q2p3.ssl.hwcdn.net/gfwlist\nserver=/goragay.com/127.0.0.1#5335\nipset=/goragay.com/gfwlist\nserver=/abc.com/127.0.0.1#5335\nipset=/abc.com/gfwlist\nserver=/bbc.com/127.0.0.1#5335\nipset=/bbc.com/gfwlist\nserver=/shopping-days.net/127.0.0.1#5335\nipset=/shopping-days.net/gfwlist\nserver=/naaktevrouwenporno.com/127.0.0.1#5335\nipset=/naaktevrouwenporno.com/gfwlist\nserver=/mypearsonshop.mx/127.0.0.1#5335\nipset=/mypearsonshop.mx/gfwlist\nserver=/tailwindtraders.com/127.0.0.1#5335\nipset=/tailwindtraders.com/gfwlist\nserver=/paypalcredit.com/127.0.0.1#5335\nipset=/paypalcredit.com/gfwlist\nserver=/pinterest.co.in/127.0.0.1#5335\nipset=/pinterest.co.in/gfwlist\nserver=/blogspot.com.es/127.0.0.1#5335\nipset=/blogspot.com.es/gfwlist\nserver=/videolan.org/127.0.0.1#5335\nipset=/videolan.org/gfwlist\nserver=/nbc.com/127.0.0.1#5335\nipset=/nbc.com/gfwlist\nserver=/facebookgraphsearch.info/127.0.0.1#5335\nipset=/facebookgraphsearch.info/gfwlist\nserver=/nurofengel.com/127.0.0.1#5335\nipset=/nurofengel.com/gfwlist\nserver=/bmw-motorrad.hu/127.0.0.1#5335\nipset=/bmw-motorrad.hu/gfwlist\nserver=/av234567.com/127.0.0.1#5335\nipset=/av234567.com/gfwlist\nserver=/89.com/127.0.0.1#5335\nipset=/89.com/gfwlist\nserver=/girlstryanal.com/127.0.0.1#5335\nipset=/girlstryanal.com/gfwlist\nserver=/beats-dre-us.com/127.0.0.1#5335\nipset=/beats-dre-us.com/gfwlist\nserver=/darwinsource.com/127.0.0.1#5335\nipset=/darwinsource.com/gfwlist\nserver=/travelex.com.my/127.0.0.1#5335\nipset=/travelex.com.my/gfwlist\nserver=/sexbookecuador.com/127.0.0.1#5335\nipset=/sexbookecuador.com/gfwlist\nserver=/topvids.net/127.0.0.1#5335\nipset=/topvids.net/gfwlist\nserver=/vmwarecertificationvideos.com/127.0.0.1#5335\nipset=/vmwarecertificationvideos.com/gfwlist\nserver=/miniusatires.com/127.0.0.1#5335\nipset=/miniusatires.com/gfwlist\nserver=/pleasefuck.org/127.0.0.1#5335\nipset=/pleasefuck.org/gfwlist\nserver=/paypalshopping.com/127.0.0.1#5335\nipset=/paypalshopping.com/gfwlist\nserver=/canon.me/127.0.0.1#5335\nipset=/canon.me/gfwlist\nserver=/battle.net/127.0.0.1#5335\nipset=/battle.net/gfwlist\nserver=/scnshop.cc/127.0.0.1#5335\nipset=/scnshop.cc/gfwlist\nserver=/baicaonetwork.com/127.0.0.1#5335\nipset=/baicaonetwork.com/gfwlist\nserver=/intel.mx/127.0.0.1#5335\nipset=/intel.mx/gfwlist\nserver=/hdjavonline.com/127.0.0.1#5335\nipset=/hdjavonline.com/gfwlist\nserver=/yahoo.com.bo/127.0.0.1#5335\nipset=/yahoo.com.bo/gfwlist\nserver=/ogp.me/127.0.0.1#5335\nipset=/ogp.me/gfwlist\nserver=/dumpxxx.net/127.0.0.1#5335\nipset=/dumpxxx.net/gfwlist\nserver=/fjlkajhgfa.top/127.0.0.1#5335\nipset=/fjlkajhgfa.top/gfwlist\nserver=/youtube.co.ma/127.0.0.1#5335\nipset=/youtube.co.ma/gfwlist\nserver=/firestone.cl/127.0.0.1#5335\nipset=/firestone.cl/gfwlist\nserver=/usatoday.com/127.0.0.1#5335\nipset=/usatoday.com/gfwlist\nserver=/18av.mm-cg.com/127.0.0.1#5335\nipset=/18av.mm-cg.com/gfwlist\nserver=/pearson.pl/127.0.0.1#5335\nipset=/pearson.pl/gfwlist\nserver=/yahoo.dj/127.0.0.1#5335\nipset=/yahoo.dj/gfwlist\nserver=/teeztube.com/127.0.0.1#5335\nipset=/teeztube.com/gfwlist\nserver=/xxxsexanal.com/127.0.0.1#5335\nipset=/xxxsexanal.com/gfwlist\nserver=/launchpadlibrarian.org/127.0.0.1#5335\nipset=/launchpadlibrarian.org/gfwlist\nserver=/directvcookevilletn.com/127.0.0.1#5335\nipset=/directvcookevilletn.com/gfwlist\nserver=/e-bay.net/127.0.0.1#5335\nipset=/e-bay.net/gfwlist\nserver=/adultgamesapk.com/127.0.0.1#5335\nipset=/adultgamesapk.com/gfwlist\nserver=/ikea.com.cy/127.0.0.1#5335\nipset=/ikea.com.cy/gfwlist\nserver=/amazon.jp/127.0.0.1#5335\nipset=/amazon.jp/gfwlist\nserver=/womenwill.in/127.0.0.1#5335\nipset=/womenwill.in/gfwlist\nserver=/mastercard.co.th/127.0.0.1#5335\nipset=/mastercard.co.th/gfwlist\nserver=/pchome.com.tw/127.0.0.1#5335\nipset=/pchome.com.tw/gfwlist\nserver=/feacboo.com/127.0.0.1#5335\nipset=/feacboo.com/gfwlist\nserver=/sesenovel.com/127.0.0.1#5335\nipset=/sesenovel.com/gfwlist\nserver=/tagapie.com.tw/127.0.0.1#5335\nipset=/tagapie.com.tw/gfwlist\nserver=/clipseksi.com/127.0.0.1#5335\nipset=/clipseksi.com/gfwlist\nserver=/collaboraoffice.com/127.0.0.1#5335\nipset=/collaboraoffice.com/gfwlist\nserver=/thawte.com/127.0.0.1#5335\nipset=/thawte.com/gfwlist\nserver=/dealsbeatsblackfriday.com/127.0.0.1#5335\nipset=/dealsbeatsblackfriday.com/gfwlist\nserver=/youtube.pr/127.0.0.1#5335\nipset=/youtube.pr/gfwlist\nserver=/sehuatang.net/127.0.0.1#5335\nipset=/sehuatang.net/gfwlist\nserver=/hentaikey.com/127.0.0.1#5335\nipset=/hentaikey.com/gfwlist\nserver=/zaobao.com.sg/127.0.0.1#5335\nipset=/zaobao.com.sg/gfwlist\nserver=/bmw.is/127.0.0.1#5335\nipset=/bmw.is/gfwlist\nserver=/elephanttube.com/127.0.0.1#5335\nipset=/elephanttube.com/gfwlist\nserver=/bidbay.com/127.0.0.1#5335\nipset=/bidbay.com/gfwlist\nserver=/yamoon.club/127.0.0.1#5335\nipset=/yamoon.club/gfwlist\nserver=/voaafaanoromoo.com/127.0.0.1#5335\nipset=/voaafaanoromoo.com/gfwlist\nserver=/mings-fashion.com/127.0.0.1#5335\nipset=/mings-fashion.com/gfwlist\nserver=/latamvmwareforum.com/127.0.0.1#5335\nipset=/latamvmwareforum.com/gfwlist\nserver=/marvelsuperheroseptember.com/127.0.0.1#5335\nipset=/marvelsuperheroseptember.com/gfwlist\nserver=/nintendonetwork.net/127.0.0.1#5335\nipset=/nintendonetwork.net/gfwlist\nserver=/bmwmotorrad.com.au/127.0.0.1#5335\nipset=/bmwmotorrad.com.au/gfwlist\nserver=/javsex.asia/127.0.0.1#5335\nipset=/javsex.asia/gfwlist\nserver=/sexxxxfilms.com/127.0.0.1#5335\nipset=/sexxxxfilms.com/gfwlist\nserver=/facdbook.com/127.0.0.1#5335\nipset=/facdbook.com/gfwlist\nserver=/youtube.ua/127.0.0.1#5335\nipset=/youtube.ua/gfwlist\nserver=/hdporn1080.net/127.0.0.1#5335\nipset=/hdporn1080.net/gfwlist\nserver=/heydouga.com/127.0.0.1#5335\nipset=/heydouga.com/gfwlist\nserver=/ecchi.xxx/127.0.0.1#5335\nipset=/ecchi.xxx/gfwlist\nserver=/khanacademy.org/127.0.0.1#5335\nipset=/khanacademy.org/gfwlist\nserver=/bigdick.com/127.0.0.1#5335\nipset=/bigdick.com/gfwlist\nserver=/facebook-ebook.com/127.0.0.1#5335\nipset=/facebook-ebook.com/gfwlist\nserver=/cloudflarestream.com/127.0.0.1#5335\nipset=/cloudflarestream.com/gfwlist\nserver=/ethereum.foundation/127.0.0.1#5335\nipset=/ethereum.foundation/gfwlist\nserver=/eromanga-hentai.com/127.0.0.1#5335\nipset=/eromanga-hentai.com/gfwlist\nserver=/ebay-inc.org/127.0.0.1#5335\nipset=/ebay-inc.org/gfwlist\nserver=/telekom.de/127.0.0.1#5335\nipset=/telekom.de/gfwlist\nserver=/slashdot.org/127.0.0.1#5335\nipset=/slashdot.org/gfwlist\nserver=/mktroute.com/127.0.0.1#5335\nipset=/mktroute.com/gfwlist\nserver=/taleofthenight.com/127.0.0.1#5335\nipset=/taleofthenight.com/gfwlist\nserver=/playsexgames.xxx/127.0.0.1#5335\nipset=/playsexgames.xxx/gfwlist\nserver=/battlefieldheroes.com/127.0.0.1#5335\nipset=/battlefieldheroes.com/gfwlist\nserver=/ebaymainstreet.com/127.0.0.1#5335\nipset=/ebaymainstreet.com/gfwlist\nserver=/cqcorea.com/127.0.0.1#5335\nipset=/cqcorea.com/gfwlist\nserver=/bustykellykay.com/127.0.0.1#5335\nipset=/bustykellykay.com/gfwlist\nserver=/whorevintagesex.com/127.0.0.1#5335\nipset=/whorevintagesex.com/gfwlist\nserver=/pivotalinitiative.com/127.0.0.1#5335\nipset=/pivotalinitiative.com/gfwlist\nserver=/cheapbeats.us/127.0.0.1#5335\nipset=/cheapbeats.us/gfwlist\nserver=/novostrong.com/127.0.0.1#5335\nipset=/novostrong.com/gfwlist\nserver=/yahoo.at/127.0.0.1#5335\nipset=/yahoo.at/gfwlist\nserver=/archlinuxarm.org/127.0.0.1#5335\nipset=/archlinuxarm.org/gfwlist\nserver=/bluemix.com/127.0.0.1#5335\nipset=/bluemix.com/gfwlist\nserver=/91gay.me/127.0.0.1#5335\nipset=/91gay.me/gfwlist\nserver=/superuser.com/127.0.0.1#5335\nipset=/superuser.com/gfwlist\nserver=/vfsco.sk/127.0.0.1#5335\nipset=/vfsco.sk/gfwlist\nserver=/yourporndump.com/127.0.0.1#5335\nipset=/yourporndump.com/gfwlist\nserver=/mini.com.mk/127.0.0.1#5335\nipset=/mini.com.mk/gfwlist\nserver=/genitourinaryexam.com/127.0.0.1#5335\nipset=/genitourinaryexam.com/gfwlist\nserver=/qatarescortsvip.com/127.0.0.1#5335\nipset=/qatarescortsvip.com/gfwlist\nserver=/shopee.id/127.0.0.1#5335\nipset=/shopee.id/gfwlist\nserver=/pearson-studium.ch/127.0.0.1#5335\nipset=/pearson-studium.ch/gfwlist\nserver=/8kcosplay.com/127.0.0.1#5335\nipset=/8kcosplay.com/gfwlist\nserver=/bmw-abudhabi.com/127.0.0.1#5335\nipset=/bmw-abudhabi.com/gfwlist\nserver=/momoshop.com.tw/127.0.0.1#5335\nipset=/momoshop.com.tw/gfwlist\nserver=/directvconnect.com/127.0.0.1#5335\nipset=/directvconnect.com/gfwlist\nserver=/serverlesslibrary.net/127.0.0.1#5335\nipset=/serverlesslibrary.net/gfwlist\nserver=/afappyending.com/127.0.0.1#5335\nipset=/afappyending.com/gfwlist\nserver=/msunlimitedcloudsummit.com/127.0.0.1#5335\nipset=/msunlimitedcloudsummit.com/gfwlist\nserver=/sagernet.org/127.0.0.1#5335\nipset=/sagernet.org/gfwlist\nserver=/dykycl.com/127.0.0.1#5335\nipset=/dykycl.com/gfwlist\nserver=/babosas.com/127.0.0.1#5335\nipset=/babosas.com/gfwlist\nserver=/bridgestone.com.sg/127.0.0.1#5335\nipset=/bridgestone.com.sg/gfwlist\nserver=/xvideo.com/127.0.0.1#5335\nipset=/xvideo.com/gfwlist\nserver=/ladyboygold.com/127.0.0.1#5335\nipset=/ladyboygold.com/gfwlist\nserver=/gockhuatviet.com/127.0.0.1#5335\nipset=/gockhuatviet.com/gfwlist\nserver=/sm.ms/127.0.0.1#5335\nipset=/sm.ms/gfwlist\nserver=/bmwsummerschool.com/127.0.0.1#5335\nipset=/bmwsummerschool.com/gfwlist\nserver=/simgbb.com/127.0.0.1#5335\nipset=/simgbb.com/gfwlist\nserver=/mushymush.tv/127.0.0.1#5335\nipset=/mushymush.tv/gfwlist\nserver=/fuzokudx.com/127.0.0.1#5335\nipset=/fuzokudx.com/gfwlist\nserver=/buckbuild.com/127.0.0.1#5335\nipset=/buckbuild.com/gfwlist\nserver=/gelbooru.me/127.0.0.1#5335\nipset=/gelbooru.me/gfwlist\nserver=/windowsmarketplace.com/127.0.0.1#5335\nipset=/windowsmarketplace.com/gfwlist\nserver=/dojin-dl.com/127.0.0.1#5335\nipset=/dojin-dl.com/gfwlist\nserver=/agendaweek.com/127.0.0.1#5335\nipset=/agendaweek.com/gfwlist\nserver=/mastercard.at/127.0.0.1#5335\nipset=/mastercard.at/gfwlist\nserver=/vodafone.com.tr/127.0.0.1#5335\nipset=/vodafone.com.tr/gfwlist\nserver=/nikeinstock.com/127.0.0.1#5335\nipset=/nikeinstock.com/gfwlist\nserver=/met-nude.com/127.0.0.1#5335\nipset=/met-nude.com/gfwlist\nserver=/carstagram.com/127.0.0.1#5335\nipset=/carstagram.com/gfwlist\nserver=/lojaiphone.com.br/127.0.0.1#5335\nipset=/lojaiphone.com.br/gfwlist\nserver=/bangbros.com/127.0.0.1#5335\nipset=/bangbros.com/gfwlist\nserver=/binancezh.kim/127.0.0.1#5335\nipset=/binancezh.kim/gfwlist\nserver=/jamanetwork.com/127.0.0.1#5335\nipset=/jamanetwork.com/gfwlist\nserver=/chinadigitaltimes.net/127.0.0.1#5335\nipset=/chinadigitaltimes.net/gfwlist\nserver=/xxxmovies.pro/127.0.0.1#5335\nipset=/xxxmovies.pro/gfwlist\nserver=/kindle.jp/127.0.0.1#5335\nipset=/kindle.jp/gfwlist\nserver=/bmwhk.com/127.0.0.1#5335\nipset=/bmwhk.com/gfwlist\nserver=/binancezh.biz/127.0.0.1#5335\nipset=/binancezh.biz/gfwlist\nserver=/wariowarediy.com/127.0.0.1#5335\nipset=/wariowarediy.com/gfwlist\nserver=/xzone.to/127.0.0.1#5335\nipset=/xzone.to/gfwlist\nserver=/sony.pt/127.0.0.1#5335\nipset=/sony.pt/gfwlist\nserver=/crates.io/127.0.0.1#5335\nipset=/crates.io/gfwlist\nserver=/xxxtubenote.com/127.0.0.1#5335\nipset=/xxxtubenote.com/gfwlist\nserver=/perfectshemales.com/127.0.0.1#5335\nipset=/perfectshemales.com/gfwlist\nserver=/homephoneplus.com/127.0.0.1#5335\nipset=/homephoneplus.com/gfwlist\nserver=/wordpress.org/127.0.0.1#5335\nipset=/wordpress.org/gfwlist\nserver=/paypass.net/127.0.0.1#5335\nipset=/paypass.net/gfwlist\nserver=/eaplay.com/127.0.0.1#5335\nipset=/eaplay.com/gfwlist\nserver=/globalsign.com.au/127.0.0.1#5335\nipset=/globalsign.com.au/gfwlist\nserver=/bitwarden.com/127.0.0.1#5335\nipset=/bitwarden.com/gfwlist\nserver=/xx-map.com/127.0.0.1#5335\nipset=/xx-map.com/gfwlist\nserver=/facebooklogin.info/127.0.0.1#5335\nipset=/facebooklogin.info/gfwlist\nserver=/dice.se/127.0.0.1#5335\nipset=/dice.se/gfwlist\nserver=/milfzr.com/127.0.0.1#5335\nipset=/milfzr.com/gfwlist\nserver=/getzola.org/127.0.0.1#5335\nipset=/getzola.org/gfwlist\nserver=/elsevier-ae.com/127.0.0.1#5335\nipset=/elsevier-ae.com/gfwlist\nserver=/sublimetext.com/127.0.0.1#5335\nipset=/sublimetext.com/gfwlist\nserver=/paypal-activate.com/127.0.0.1#5335\nipset=/paypal-activate.com/gfwlist\nserver=/xxx-blog.to/127.0.0.1#5335\nipset=/xxx-blog.to/gfwlist\nserver=/ero-comic-hunter.net/127.0.0.1#5335\nipset=/ero-comic-hunter.net/gfwlist\nserver=/beatsbydreofficialdanmark.com/127.0.0.1#5335\nipset=/beatsbydreofficialdanmark.com/gfwlist\nserver=/shopmonsterbeats.com/127.0.0.1#5335\nipset=/shopmonsterbeats.com/gfwlist\nserver=/hentai0.com/127.0.0.1#5335\nipset=/hentai0.com/gfwlist\nserver=/enemainformation.com/127.0.0.1#5335\nipset=/enemainformation.com/gfwlist\nserver=/pearson-anaya.com/127.0.0.1#5335\nipset=/pearson-anaya.com/gfwlist\nserver=/ilife.wang/127.0.0.1#5335\nipset=/ilife.wang/gfwlist\nserver=/directv-4-you.com/127.0.0.1#5335\nipset=/directv-4-you.com/gfwlist\nserver=/ingka.dev/127.0.0.1#5335\nipset=/ingka.dev/gfwlist\nserver=/dropbox.com/127.0.0.1#5335\nipset=/dropbox.com/gfwlist\nserver=/comeav.com/127.0.0.1#5335\nipset=/comeav.com/gfwlist\nserver=/flic.kr/127.0.0.1#5335\nipset=/flic.kr/gfwlist\nserver=/ipod.is/127.0.0.1#5335\nipset=/ipod.is/gfwlist\nserver=/youtube.com.sg/127.0.0.1#5335\nipset=/youtube.com.sg/gfwlist\nserver=/ssl-images-amazon.com/127.0.0.1#5335\nipset=/ssl-images-amazon.com/gfwlist\nserver=/apple-pay.rs/127.0.0.1#5335\nipset=/apple-pay.rs/gfwlist\nserver=/malayporn.space/127.0.0.1#5335\nipset=/malayporn.space/gfwlist\nserver=/hentai-top100.supertop-100.com/127.0.0.1#5335\nipset=/hentai-top100.supertop-100.com/gfwlist\nserver=/verizonenterprise.com/127.0.0.1#5335\nipset=/verizonenterprise.com/gfwlist\nserver=/xattractive.com/127.0.0.1#5335\nipset=/xattractive.com/gfwlist\nserver=/xo.com/127.0.0.1#5335\nipset=/xo.com/gfwlist\nserver=/bmwmotorrad.com.sg/127.0.0.1#5335\nipset=/bmwmotorrad.com.sg/gfwlist\nserver=/meadjohnson.net/127.0.0.1#5335\nipset=/meadjohnson.net/gfwlist\nserver=/uo.com/127.0.0.1#5335\nipset=/uo.com/gfwlist\nserver=/jayspov.net/127.0.0.1#5335\nipset=/jayspov.net/gfwlist\nserver=/appleinsider.com/127.0.0.1#5335\nipset=/appleinsider.com/gfwlist\nserver=/squarefoot.com.hk/127.0.0.1#5335\nipset=/squarefoot.com.hk/gfwlist\nserver=/youtube.com.tr/127.0.0.1#5335\nipset=/youtube.com.tr/gfwlist\nserver=/beatsshopstore.com/127.0.0.1#5335\nipset=/beatsshopstore.com/gfwlist\nserver=/topxxxpornvids.com/127.0.0.1#5335\nipset=/topxxxpornvids.com/gfwlist\nserver=/serviporno.com/127.0.0.1#5335\nipset=/serviporno.com/gfwlist\nserver=/pornloser.com/127.0.0.1#5335\nipset=/pornloser.com/gfwlist\nserver=/dulceecuador.com/127.0.0.1#5335\nipset=/dulceecuador.com/gfwlist\nserver=/go.com/127.0.0.1#5335\nipset=/go.com/gfwlist\nserver=/hbfile.net/127.0.0.1#5335\nipset=/hbfile.net/gfwlist\nserver=/venmo.com/127.0.0.1#5335\nipset=/venmo.com/gfwlist\nserver=/marketodesigner.com/127.0.0.1#5335\nipset=/marketodesigner.com/gfwlist\nserver=/tidalhifi.com/127.0.0.1#5335\nipset=/tidalhifi.com/gfwlist\nserver=/bazel.build/127.0.0.1#5335\nipset=/bazel.build/gfwlist\nserver=/wp.com/127.0.0.1#5335\nipset=/wp.com/gfwlist\nserver=/bbc-anal.com/127.0.0.1#5335\nipset=/bbc-anal.com/gfwlist\nserver=/googlecapital.com/127.0.0.1#5335\nipset=/googlecapital.com/gfwlist\nserver=/hp.com/127.0.0.1#5335\nipset=/hp.com/gfwlist\nserver=/dreprofy.com/127.0.0.1#5335\nipset=/dreprofy.com/gfwlist\nserver=/mastercard.fr/127.0.0.1#5335\nipset=/mastercard.fr/gfwlist\nserver=/iphone.wang/127.0.0.1#5335\nipset=/iphone.wang/gfwlist\nserver=/amateure-xtreme.com/127.0.0.1#5335\nipset=/amateure-xtreme.com/gfwlist\nserver=/milfhunter.com/127.0.0.1#5335\nipset=/milfhunter.com/gfwlist\nserver=/nypostreprints.com/127.0.0.1#5335\nipset=/nypostreprints.com/gfwlist\nserver=/wixstatic.com/127.0.0.1#5335\nipset=/wixstatic.com/gfwlist\nserver=/womenwill.com/127.0.0.1#5335\nipset=/womenwill.com/gfwlist\nserver=/whosthehost.com/127.0.0.1#5335\nipset=/whosthehost.com/gfwlist\nserver=/coreduo.com/127.0.0.1#5335\nipset=/coreduo.com/gfwlist\nserver=/aboutamazon.com/127.0.0.1#5335\nipset=/aboutamazon.com/gfwlist\nserver=/beatshopuk.com/127.0.0.1#5335\nipset=/beatshopuk.com/gfwlist\nserver=/hqxxxmovies.com/127.0.0.1#5335\nipset=/hqxxxmovies.com/gfwlist\nserver=/spicystory.net/127.0.0.1#5335\nipset=/spicystory.net/gfwlist\nserver=/googledanmark.com/127.0.0.1#5335\nipset=/googledanmark.com/gfwlist\nserver=/youtube.gt/127.0.0.1#5335\nipset=/youtube.gt/gfwlist\nserver=/hm.com/127.0.0.1#5335\nipset=/hm.com/gfwlist\nserver=/adobetechcommdemo.com/127.0.0.1#5335\nipset=/adobetechcommdemo.com/gfwlist\nserver=/hulustream.com/127.0.0.1#5335\nipset=/hulustream.com/gfwlist\nserver=/default.exp-tas.com/127.0.0.1#5335\nipset=/default.exp-tas.com/gfwlist\nserver=/deluxe.com.hk/127.0.0.1#5335\nipset=/deluxe.com.hk/gfwlist\nserver=/javcc.com/127.0.0.1#5335\nipset=/javcc.com/gfwlist\nserver=/volvobuses.hk/127.0.0.1#5335\nipset=/volvobuses.hk/gfwlist\nserver=/cochranelibrary.com/127.0.0.1#5335\nipset=/cochranelibrary.com/gfwlist\nserver=/kenya4.com/127.0.0.1#5335\nipset=/kenya4.com/gfwlist\nserver=/itunesparty.com/127.0.0.1#5335\nipset=/itunesparty.com/gfwlist\nserver=/underhentai.net/127.0.0.1#5335\nipset=/underhentai.net/gfwlist\nserver=/bitchesgirls.com/127.0.0.1#5335\nipset=/bitchesgirls.com/gfwlist\nserver=/beatspromotions.com/127.0.0.1#5335\nipset=/beatspromotions.com/gfwlist\nserver=/wwwitunes.com/127.0.0.1#5335\nipset=/wwwitunes.com/gfwlist\nserver=/dev-guardianapis.com/127.0.0.1#5335\nipset=/dev-guardianapis.com/gfwlist\nserver=/54647.online/127.0.0.1#5335\nipset=/54647.online/gfwlist\nserver=/momspornvideos.com/127.0.0.1#5335\nipset=/momspornvideos.com/gfwlist\nserver=/avstar09.com/127.0.0.1#5335\nipset=/avstar09.com/gfwlist\nserver=/nintendo.dk/127.0.0.1#5335\nipset=/nintendo.dk/gfwlist\nserver=/newestbeatsbydre.com/127.0.0.1#5335\nipset=/newestbeatsbydre.com/gfwlist\nserver=/primemomsex.com/127.0.0.1#5335\nipset=/primemomsex.com/gfwlist\nserver=/tryboobs.com/127.0.0.1#5335\nipset=/tryboobs.com/gfwlist\nserver=/hulurussia.com/127.0.0.1#5335\nipset=/hulurussia.com/gfwlist\nserver=/bangkokbangers.com/127.0.0.1#5335\nipset=/bangkokbangers.com/gfwlist\nserver=/coinbase.com/127.0.0.1#5335\nipset=/coinbase.com/gfwlist\nserver=/realclearpolicy.com/127.0.0.1#5335\nipset=/realclearpolicy.com/gfwlist\nserver=/cloudflareok.com/127.0.0.1#5335\nipset=/cloudflareok.com/gfwlist\nserver=/sandisk.in/127.0.0.1#5335\nipset=/sandisk.in/gfwlist\nserver=/pki-posta.ch/127.0.0.1#5335\nipset=/pki-posta.ch/gfwlist\nserver=/esri.com/127.0.0.1#5335\nipset=/esri.com/gfwlist\nserver=/foxnewsaroundtheworld.com/127.0.0.1#5335\nipset=/foxnewsaroundtheworld.com/gfwlist\nserver=/thecompaqstore.com/127.0.0.1#5335\nipset=/thecompaqstore.com/gfwlist\nserver=/apple-enews.com/127.0.0.1#5335\nipset=/apple-enews.com/gfwlist\nserver=/approvedusedbmw.com/127.0.0.1#5335\nipset=/approvedusedbmw.com/gfwlist\nserver=/100bucksbabes.com/127.0.0.1#5335\nipset=/100bucksbabes.com/gfwlist\nserver=/rexxx.org/127.0.0.1#5335\nipset=/rexxx.org/gfwlist\nserver=/gravitytank.com/127.0.0.1#5335\nipset=/gravitytank.com/gfwlist\nserver=/javdove.com/127.0.0.1#5335\nipset=/javdove.com/gfwlist\nserver=/deutsch-sexfilme.com/127.0.0.1#5335\nipset=/deutsch-sexfilme.com/gfwlist\nserver=/rt.com/127.0.0.1#5335\nipset=/rt.com/gfwlist\nserver=/razersupport.com/127.0.0.1#5335\nipset=/razersupport.com/gfwlist\nserver=/youngpornhd.com/127.0.0.1#5335\nipset=/youngpornhd.com/gfwlist\nserver=/instagram-engineering.com/127.0.0.1#5335\nipset=/instagram-engineering.com/gfwlist\nserver=/amp.akamaized.net/127.0.0.1#5335\nipset=/amp.akamaized.net/gfwlist\nserver=/funnyordie.com/127.0.0.1#5335\nipset=/funnyordie.com/gfwlist\nserver=/ft.com/127.0.0.1#5335\nipset=/ft.com/gfwlist\nserver=/akamai-thailand.net/127.0.0.1#5335\nipset=/akamai-thailand.net/gfwlist\nserver=/cambridgedigital.net/127.0.0.1#5335\nipset=/cambridgedigital.net/gfwlist\nserver=/ebay.us/127.0.0.1#5335\nipset=/ebay.us/gfwlist\nserver=/ieee-pes.org/127.0.0.1#5335\nipset=/ieee-pes.org/gfwlist\nserver=/tsumino.com/127.0.0.1#5335\nipset=/tsumino.com/gfwlist\nserver=/badteenspunished.com/127.0.0.1#5335\nipset=/badteenspunished.com/gfwlist\nserver=/sony.com.au/127.0.0.1#5335\nipset=/sony.com.au/gfwlist\nserver=/siteripz.com/127.0.0.1#5335\nipset=/siteripz.com/gfwlist\nserver=/sexuria.com/127.0.0.1#5335\nipset=/sexuria.com/gfwlist\nserver=/dezyred.com/127.0.0.1#5335\nipset=/dezyred.com/gfwlist\nserver=/beats-sale.com/127.0.0.1#5335\nipset=/beats-sale.com/gfwlist\nserver=/pornhat.one/127.0.0.1#5335\nipset=/pornhat.one/gfwlist\nserver=/thenewslens.com/127.0.0.1#5335\nipset=/thenewslens.com/gfwlist\nserver=/nikebuy.com/127.0.0.1#5335\nipset=/nikebuy.com/gfwlist\nserver=/applemx-icloud.com/127.0.0.1#5335\nipset=/applemx-icloud.com/gfwlist\nserver=/tr.com/127.0.0.1#5335\nipset=/tr.com/gfwlist\nserver=/electronjs.org/127.0.0.1#5335\nipset=/electronjs.org/gfwlist\nserver=/uusextoy.com/127.0.0.1#5335\nipset=/uusextoy.com/gfwlist\nserver=/google.com.sv/127.0.0.1#5335\nipset=/google.com.sv/gfwlist\nserver=/porntoplinks.com/127.0.0.1#5335\nipset=/porntoplinks.com/gfwlist\nserver=/proton.me/127.0.0.1#5335\nipset=/proton.me/gfwlist\nserver=/faasbook.com/127.0.0.1#5335\nipset=/faasbook.com/gfwlist\nserver=/dogfart.com/127.0.0.1#5335\nipset=/dogfart.com/gfwlist\nserver=/xvideos2.com/127.0.0.1#5335\nipset=/xvideos2.com/gfwlist\nserver=/amazon.sg/127.0.0.1#5335\nipset=/amazon.sg/gfwlist\nserver=/nflxext.com/127.0.0.1#5335\nipset=/nflxext.com/gfwlist\nserver=/lupoporno.com/127.0.0.1#5335\nipset=/lupoporno.com/gfwlist\nserver=/vodafone.co.uk/127.0.0.1#5335\nipset=/vodafone.co.uk/gfwlist\nserver=/xgaytube.tv/127.0.0.1#5335\nipset=/xgaytube.tv/gfwlist\nserver=/asianthumbs.org/127.0.0.1#5335\nipset=/asianthumbs.org/gfwlist\nserver=/ikea.lv/127.0.0.1#5335\nipset=/ikea.lv/gfwlist\nserver=/thzu.cc/127.0.0.1#5335\nipset=/thzu.cc/gfwlist\nserver=/atscaleconference.com/127.0.0.1#5335\nipset=/atscaleconference.com/gfwlist\nserver=/sexdollpornhd.com/127.0.0.1#5335\nipset=/sexdollpornhd.com/gfwlist\nserver=/cherrypai.com/127.0.0.1#5335\nipset=/cherrypai.com/gfwlist\nserver=/visa.es/127.0.0.1#5335\nipset=/visa.es/gfwlist\nserver=/eworld.com/127.0.0.1#5335\nipset=/eworld.com/gfwlist\nserver=/meuhentai.com/127.0.0.1#5335\nipset=/meuhentai.com/gfwlist\nserver=/auricularesbeatsbaratosshop.com/127.0.0.1#5335\nipset=/auricularesbeatsbaratosshop.com/gfwlist\nserver=/3d-xxx.com/127.0.0.1#5335\nipset=/3d-xxx.com/gfwlist\nserver=/applestore.cm/127.0.0.1#5335\nipset=/applestore.cm/gfwlist\nserver=/dw.com/127.0.0.1#5335\nipset=/dw.com/gfwlist\nserver=/hentai-gif-anime.com/127.0.0.1#5335\nipset=/hentai-gif-anime.com/gfwlist\nserver=/patreon.com/127.0.0.1#5335\nipset=/patreon.com/gfwlist\nserver=/travelex.com.hk/127.0.0.1#5335\nipset=/travelex.com.hk/gfwlist\nserver=/eroticbeautyhub.com/127.0.0.1#5335\nipset=/eroticbeautyhub.com/gfwlist\nserver=/voaindonesia.com/127.0.0.1#5335\nipset=/voaindonesia.com/gfwlist\nserver=/ebayforeclosure.org/127.0.0.1#5335\nipset=/ebayforeclosure.org/gfwlist\nserver=/paypal-security.net/127.0.0.1#5335\nipset=/paypal-security.net/gfwlist\nserver=/manoto1.tv/127.0.0.1#5335\nipset=/manoto1.tv/gfwlist\nserver=/webpkgcache.com/127.0.0.1#5335\nipset=/webpkgcache.com/gfwlist\nserver=/yourdirtymind.com/127.0.0.1#5335\nipset=/yourdirtymind.com/gfwlist\nserver=/quicktime.com/127.0.0.1#5335\nipset=/quicktime.com/gfwlist\nserver=/pornpics.com/127.0.0.1#5335\nipset=/pornpics.com/gfwlist\nserver=/volvobuses.sg/127.0.0.1#5335\nipset=/volvobuses.sg/gfwlist\nserver=/ikea.ae/127.0.0.1#5335\nipset=/ikea.ae/gfwlist\nserver=/europalibera.org/127.0.0.1#5335\nipset=/europalibera.org/gfwlist\nserver=/google.co.ma/127.0.0.1#5335\nipset=/google.co.ma/gfwlist\nserver=/starbucks.ie/127.0.0.1#5335\nipset=/starbucks.ie/gfwlist\nserver=/veetbangladesh.com/127.0.0.1#5335\nipset=/veetbangladesh.com/gfwlist\nserver=/ysm.yahoo.com/127.0.0.1#5335\nipset=/ysm.yahoo.com/gfwlist\nserver=/disneyarena.com/127.0.0.1#5335\nipset=/disneyarena.com/gfwlist\nserver=/globalvoicesonline.org/127.0.0.1#5335\nipset=/globalvoicesonline.org/gfwlist\nserver=/hentaifreak.org/127.0.0.1#5335\nipset=/hentaifreak.org/gfwlist\nserver=/pricelesssurprises.com/127.0.0.1#5335\nipset=/pricelesssurprises.com/gfwlist\nserver=/quiz.directory/127.0.0.1#5335\nipset=/quiz.directory/gfwlist\nserver=/lesbian8.com/127.0.0.1#5335\nipset=/lesbian8.com/gfwlist\nserver=/sandisk.co.jp/127.0.0.1#5335\nipset=/sandisk.co.jp/gfwlist\nserver=/bmw.sk/127.0.0.1#5335\nipset=/bmw.sk/gfwlist\nserver=/skillshare.com/127.0.0.1#5335\nipset=/skillshare.com/gfwlist\nserver=/sony-olympus-medical.com/127.0.0.1#5335\nipset=/sony-olympus-medical.com/gfwlist\nserver=/fuckgames.xxx/127.0.0.1#5335\nipset=/fuckgames.xxx/gfwlist\nserver=/zoo-porno.biz/127.0.0.1#5335\nipset=/zoo-porno.biz/gfwlist\nserver=/simplyipod.com/127.0.0.1#5335\nipset=/simplyipod.com/gfwlist\nserver=/newhampshirebmw.com/127.0.0.1#5335\nipset=/newhampshirebmw.com/gfwlist\nserver=/xxxindianporn2.com/127.0.0.1#5335\nipset=/xxxindianporn2.com/gfwlist\nserver=/girlfriendgalleries.net/127.0.0.1#5335\nipset=/girlfriendgalleries.net/gfwlist\nserver=/hpsupport.com/127.0.0.1#5335\nipset=/hpsupport.com/gfwlist\nserver=/bellotube.com/127.0.0.1#5335\nipset=/bellotube.com/gfwlist\nserver=/voyeurweb.com/127.0.0.1#5335\nipset=/voyeurweb.com/gfwlist\nserver=/fox247.com/127.0.0.1#5335\nipset=/fox247.com/gfwlist\nserver=/gv.com/127.0.0.1#5335\nipset=/gv.com/gfwlist\nserver=/hdporn92.com/127.0.0.1#5335\nipset=/hdporn92.com/gfwlist\nserver=/gaymaletube.com/127.0.0.1#5335\nipset=/gaymaletube.com/gfwlist\nserver=/ebayfashion.net/127.0.0.1#5335\nipset=/ebayfashion.net/gfwlist\nserver=/fuckableteens.net/127.0.0.1#5335\nipset=/fuckableteens.net/gfwlist\nserver=/projectvoyeur.com/127.0.0.1#5335\nipset=/projectvoyeur.com/gfwlist\nserver=/google.co.cr/127.0.0.1#5335\nipset=/google.co.cr/gfwlist\nserver=/youtube.com.tw/127.0.0.1#5335\nipset=/youtube.com.tw/gfwlist\nserver=/excitebots.com/127.0.0.1#5335\nipset=/excitebots.com/gfwlist\nserver=/visaconciergelac.com/127.0.0.1#5335\nipset=/visaconciergelac.com/gfwlist\nserver=/facebookswagstore.com/127.0.0.1#5335\nipset=/facebookswagstore.com/gfwlist\nserver=/mybukkakeporn.com/127.0.0.1#5335\nipset=/mybukkakeporn.com/gfwlist\nserver=/static-nike.com/127.0.0.1#5335\nipset=/static-nike.com/gfwlist\nserver=/nikestares.com/127.0.0.1#5335\nipset=/nikestares.com/gfwlist\nserver=/instagram-brand.com/127.0.0.1#5335\nipset=/instagram-brand.com/gfwlist\nserver=/fbreg.com/127.0.0.1#5335\nipset=/fbreg.com/gfwlist\nserver=/twitterstat.us/127.0.0.1#5335\nipset=/twitterstat.us/gfwlist\nserver=/elpornoamateur.com/127.0.0.1#5335\nipset=/elpornoamateur.com/gfwlist\nserver=/easynike.com/127.0.0.1#5335\nipset=/easynike.com/gfwlist\nserver=/finevids.xxx/127.0.0.1#5335\nipset=/finevids.xxx/gfwlist\nserver=/pinterest.pe/127.0.0.1#5335\nipset=/pinterest.pe/gfwlist\nserver=/foxnewsgo.org/127.0.0.1#5335\nipset=/foxnewsgo.org/gfwlist\nserver=/sex.cam/127.0.0.1#5335\nipset=/sex.cam/gfwlist\nserver=/purextc.com/127.0.0.1#5335\nipset=/purextc.com/gfwlist\nserver=/yoursigmoidoscopy.com/127.0.0.1#5335\nipset=/yoursigmoidoscopy.com/gfwlist\nserver=/familystrokes.com/127.0.0.1#5335\nipset=/familystrokes.com/gfwlist\nserver=/bmw-motorrad.co.id/127.0.0.1#5335\nipset=/bmw-motorrad.co.id/gfwlist\nserver=/slackcertified.com/127.0.0.1#5335\nipset=/slackcertified.com/gfwlist\nserver=/x-art.com/127.0.0.1#5335\nipset=/x-art.com/gfwlist\nserver=/pricelessbeijing.com/127.0.0.1#5335\nipset=/pricelessbeijing.com/gfwlist\nserver=/ebaymall.com/127.0.0.1#5335\nipset=/ebaymall.com/gfwlist\nserver=/xn--qoq462m.com/127.0.0.1#5335\nipset=/xn--qoq462m.com/gfwlist\nserver=/hentaicloud.com/127.0.0.1#5335\nipset=/hentaicloud.com/gfwlist\nserver=/mucinexprofessional.com/127.0.0.1#5335\nipset=/mucinexprofessional.com/gfwlist\nserver=/yahoo.cm/127.0.0.1#5335\nipset=/yahoo.cm/gfwlist\nserver=/fau11.com/127.0.0.1#5335\nipset=/fau11.com/gfwlist\nserver=/littleasians.com/127.0.0.1#5335\nipset=/littleasians.com/gfwlist\nserver=/hanime1.me/127.0.0.1#5335\nipset=/hanime1.me/gfwlist\nserver=/statsmakemecry.com/127.0.0.1#5335\nipset=/statsmakemecry.com/gfwlist\nserver=/jorropo.net/127.0.0.1#5335\nipset=/jorropo.net/gfwlist\nserver=/billpointnewzealand.com/127.0.0.1#5335\nipset=/billpointnewzealand.com/gfwlist\nserver=/gfw.report/127.0.0.1#5335\nipset=/gfw.report/gfwlist\nserver=/opensourceinsight.dev/127.0.0.1#5335\nipset=/opensourceinsight.dev/gfwlist\nserver=/avatargarenanow-a.akamaihd.net/127.0.0.1#5335\nipset=/avatargarenanow-a.akamaihd.net/gfwlist\nserver=/duck.com/127.0.0.1#5335\nipset=/duck.com/gfwlist\nserver=/fuck.com/127.0.0.1#5335\nipset=/fuck.com/gfwlist\nserver=/starcraft.com/127.0.0.1#5335\nipset=/starcraft.com/gfwlist\nserver=/instgram.com/127.0.0.1#5335\nipset=/instgram.com/gfwlist\nserver=/netlify.com/127.0.0.1#5335\nipset=/netlify.com/gfwlist\nserver=/streamlatina.com/127.0.0.1#5335\nipset=/streamlatina.com/gfwlist\nserver=/pornvideos.casa/127.0.0.1#5335\nipset=/pornvideos.casa/gfwlist\nserver=/javwide.com/127.0.0.1#5335\nipset=/javwide.com/gfwlist\nserver=/facebookhome.cc/127.0.0.1#5335\nipset=/facebookhome.cc/gfwlist\nserver=/syzbj36.xyz/127.0.0.1#5335\nipset=/syzbj36.xyz/gfwlist\nserver=/apple-expo.com/127.0.0.1#5335\nipset=/apple-expo.com/gfwlist\nserver=/akamaitechnologies.com/127.0.0.1#5335\nipset=/akamaitechnologies.com/gfwlist\nserver=/tubegold.xxx/127.0.0.1#5335\nipset=/tubegold.xxx/gfwlist\nserver=/facesbooc.com/127.0.0.1#5335\nipset=/facesbooc.com/gfwlist\nserver=/youtube.sg/127.0.0.1#5335\nipset=/youtube.sg/gfwlist\nserver=/vanish.ie/127.0.0.1#5335\nipset=/vanish.ie/gfwlist\nserver=/swoosh.com/127.0.0.1#5335\nipset=/swoosh.com/gfwlist\nserver=/javscat.net/127.0.0.1#5335\nipset=/javscat.net/gfwlist\nserver=/apple.hamburg/127.0.0.1#5335\nipset=/apple.hamburg/gfwlist\nserver=/sex.xxx/127.0.0.1#5335\nipset=/sex.xxx/gfwlist\nserver=/bitcoin.org/127.0.0.1#5335\nipset=/bitcoin.org/gfwlist\nserver=/img-prod-cms-rt-microsoft-com.akamaized.net/127.0.0.1#5335\nipset=/img-prod-cms-rt-microsoft-com.akamaized.net/gfwlist\nserver=/linemyshop.com/127.0.0.1#5335\nipset=/linemyshop.com/gfwlist\nserver=/disneysubscription.com/127.0.0.1#5335\nipset=/disneysubscription.com/gfwlist\nserver=/get.dev/127.0.0.1#5335\nipset=/get.dev/gfwlist\nserver=/pornofrog.com/127.0.0.1#5335\nipset=/pornofrog.com/gfwlist\nserver=/go-lang.org/127.0.0.1#5335\nipset=/go-lang.org/gfwlist\nserver=/tutanota.com/127.0.0.1#5335\nipset=/tutanota.com/gfwlist\nserver=/bmw-connecteddrive.my/127.0.0.1#5335\nipset=/bmw-connecteddrive.my/gfwlist\nserver=/mini.com.gr/127.0.0.1#5335\nipset=/mini.com.gr/gfwlist\nserver=/5lml.com/127.0.0.1#5335\nipset=/5lml.com/gfwlist\nserver=/avinin.com/127.0.0.1#5335\nipset=/avinin.com/gfwlist\nserver=/familysexsimulator.com/127.0.0.1#5335\nipset=/familysexsimulator.com/gfwlist\nserver=/wired.com/127.0.0.1#5335\nipset=/wired.com/gfwlist\nserver=/buzzav.com/127.0.0.1#5335\nipset=/buzzav.com/gfwlist\nserver=/dettol.com.sg/127.0.0.1#5335\nipset=/dettol.com.sg/gfwlist\nserver=/intel.az/127.0.0.1#5335\nipset=/intel.az/gfwlist\nserver=/hpservices.com/127.0.0.1#5335\nipset=/hpservices.com/gfwlist\nserver=/zeriamerikes.com/127.0.0.1#5335\nipset=/zeriamerikes.com/gfwlist\nserver=/fragrancebay.com/127.0.0.1#5335\nipset=/fragrancebay.com/gfwlist\nserver=/starbuckssummergame.ca/127.0.0.1#5335\nipset=/starbuckssummergame.ca/gfwlist\nserver=/minilondon.co/127.0.0.1#5335\nipset=/minilondon.co/gfwlist\nserver=/ads.youtube.com/127.0.0.1#5335\nipset=/ads.youtube.com/gfwlist\nserver=/pixinsight.com.tw/127.0.0.1#5335\nipset=/pixinsight.com.tw/gfwlist\nserver=/atlasonepoint.com/127.0.0.1#5335\nipset=/atlasonepoint.com/gfwlist\nserver=/billpoint.us/127.0.0.1#5335\nipset=/billpoint.us/gfwlist\nserver=/holaporno.xxx/127.0.0.1#5335\nipset=/holaporno.xxx/gfwlist\nserver=/nijinchu.com/127.0.0.1#5335\nipset=/nijinchu.com/gfwlist\nserver=/btt904.com/127.0.0.1#5335\nipset=/btt904.com/gfwlist\nserver=/s-msft.com/127.0.0.1#5335\nipset=/s-msft.com/gfwlist\nserver=/bmwstepconnections.com/127.0.0.1#5335\nipset=/bmwstepconnections.com/gfwlist\nserver=/hotpornbible.com/127.0.0.1#5335\nipset=/hotpornbible.com/gfwlist\nserver=/imgcrl.org/127.0.0.1#5335\nipset=/imgcrl.org/gfwlist\nserver=/manytoon.com/127.0.0.1#5335\nipset=/manytoon.com/gfwlist\nserver=/freehentaistream.com/127.0.0.1#5335\nipset=/freehentaistream.com/gfwlist\nserver=/evise.com/127.0.0.1#5335\nipset=/evise.com/gfwlist\nserver=/xxx-porn-fuck.com/127.0.0.1#5335\nipset=/xxx-porn-fuck.com/gfwlist\nserver=/familysimulator.io/127.0.0.1#5335\nipset=/familysimulator.io/gfwlist\nserver=/lgsalesportal.com/127.0.0.1#5335\nipset=/lgsalesportal.com/gfwlist\nserver=/beatsfactorycollection.com/127.0.0.1#5335\nipset=/beatsfactorycollection.com/gfwlist\nserver=/xlstudio.com/127.0.0.1#5335\nipset=/xlstudio.com/gfwlist\nserver=/faapy.com/127.0.0.1#5335\nipset=/faapy.com/gfwlist\nserver=/yandex.jobs/127.0.0.1#5335\nipset=/yandex.jobs/gfwlist\nserver=/volvobuses.com.tw/127.0.0.1#5335\nipset=/volvobuses.com.tw/gfwlist\nserver=/venmo.org/127.0.0.1#5335\nipset=/venmo.org/gfwlist\nserver=/illusiony.com/127.0.0.1#5335\nipset=/illusiony.com/gfwlist\nserver=/facebookgraphsearch.com/127.0.0.1#5335\nipset=/facebookgraphsearch.com/gfwlist\nserver=/racked.com/127.0.0.1#5335\nipset=/racked.com/gfwlist\nserver=/viewerswives.net/127.0.0.1#5335\nipset=/viewerswives.net/gfwlist\nserver=/thaichix.com/127.0.0.1#5335\nipset=/thaichix.com/gfwlist\nserver=/webobjects.co.uk/127.0.0.1#5335\nipset=/webobjects.co.uk/gfwlist\nserver=/monsterbeatsforsale.com/127.0.0.1#5335\nipset=/monsterbeatsforsale.com/gfwlist\nserver=/xvideosx.com.br/127.0.0.1#5335\nipset=/xvideosx.com.br/gfwlist\nserver=/cbsservice.aws.syncbak.com/127.0.0.1#5335\nipset=/cbsservice.aws.syncbak.com/gfwlist\nserver=/albastudio.co/127.0.0.1#5335\nipset=/albastudio.co/gfwlist\nserver=/fetishpornonly.com/127.0.0.1#5335\nipset=/fetishpornonly.com/gfwlist\nserver=/worldhack.com/127.0.0.1#5335\nipset=/worldhack.com/gfwlist\nserver=/myfoxchicago.com/127.0.0.1#5335\nipset=/myfoxchicago.com/gfwlist\nserver=/fortnite.com/127.0.0.1#5335\nipset=/fortnite.com/gfwlist\nserver=/yahoo.is/127.0.0.1#5335\nipset=/yahoo.is/gfwlist\nserver=/alphabet.de/127.0.0.1#5335\nipset=/alphabet.de/gfwlist\nserver=/yomiuri-johkai.co.jp/127.0.0.1#5335\nipset=/yomiuri-johkai.co.jp/gfwlist\nserver=/link2galleries.com/127.0.0.1#5335\nipset=/link2galleries.com/gfwlist\nserver=/geforce.co.kr/127.0.0.1#5335\nipset=/geforce.co.kr/gfwlist\nserver=/exploitedteensasia.com/127.0.0.1#5335\nipset=/exploitedteensasia.com/gfwlist\nserver=/bustyoldsluts.com/127.0.0.1#5335\nipset=/bustyoldsluts.com/gfwlist\nserver=/fap-xxx.com/127.0.0.1#5335\nipset=/fap-xxx.com/gfwlist\nserver=/geti2p.net/127.0.0.1#5335\nipset=/geti2p.net/gfwlist\nserver=/hulu.us/127.0.0.1#5335\nipset=/hulu.us/gfwlist\nserver=/comodoca4.com/127.0.0.1#5335\nipset=/comodoca4.com/gfwlist\nserver=/spankred3d.com/127.0.0.1#5335\nipset=/spankred3d.com/gfwlist\nserver=/scholar.google.com.py/127.0.0.1#5335\nipset=/scholar.google.com.py/gfwlist\nserver=/beatsbydrdreoutlet.com/127.0.0.1#5335\nipset=/beatsbydrdreoutlet.com/gfwlist\nserver=/myfoxcharlotte.com/127.0.0.1#5335\nipset=/myfoxcharlotte.com/gfwlist\nserver=/somanylolies.com/127.0.0.1#5335\nipset=/somanylolies.com/gfwlist\nserver=/fulltaboo.tv/127.0.0.1#5335\nipset=/fulltaboo.tv/gfwlist\nserver=/letsencrypt.com/127.0.0.1#5335\nipset=/letsencrypt.com/gfwlist\nserver=/disneyhentai.com/127.0.0.1#5335\nipset=/disneyhentai.com/gfwlist\nserver=/yo1health.com/127.0.0.1#5335\nipset=/yo1health.com/gfwlist\nserver=/bcrncdn.com/127.0.0.1#5335\nipset=/bcrncdn.com/gfwlist\nserver=/adobeaemcloud.net/127.0.0.1#5335\nipset=/adobeaemcloud.net/gfwlist\nserver=/conscrypt.org/127.0.0.1#5335\nipset=/conscrypt.org/gfwlist\nserver=/thaigirls.net/127.0.0.1#5335\nipset=/thaigirls.net/gfwlist\nserver=/facnbook.com/127.0.0.1#5335\nipset=/facnbook.com/gfwlist\nserver=/intercamcashpassport.com.mx/127.0.0.1#5335\nipset=/intercamcashpassport.com.mx/gfwlist\nserver=/cloudflare-ipfs.com/127.0.0.1#5335\nipset=/cloudflare-ipfs.com/gfwlist\nserver=/ebayca.com/127.0.0.1#5335\nipset=/ebayca.com/gfwlist\nserver=/webrtc.org/127.0.0.1#5335\nipset=/webrtc.org/gfwlist\nserver=/nikeusa.com/127.0.0.1#5335\nipset=/nikeusa.com/gfwlist\nserver=/v2ray.cool/127.0.0.1#5335\nipset=/v2ray.cool/gfwlist\nserver=/icloud.ch/127.0.0.1#5335\nipset=/icloud.ch/gfwlist\nserver=/ebay.co.ve/127.0.0.1#5335\nipset=/ebay.co.ve/gfwlist\nserver=/bmw-jordan.com/127.0.0.1#5335\nipset=/bmw-jordan.com/gfwlist\nserver=/canon.hu/127.0.0.1#5335\nipset=/canon.hu/gfwlist\nserver=/porn-stalker.fr/127.0.0.1#5335\nipset=/porn-stalker.fr/gfwlist\nserver=/topbeatsbydrdreoutlet.com/127.0.0.1#5335\nipset=/topbeatsbydrdreoutlet.com/gfwlist\nserver=/microsoft.de/127.0.0.1#5335\nipset=/microsoft.de/gfwlist\nserver=/minidurham.ca/127.0.0.1#5335\nipset=/minidurham.ca/gfwlist\nserver=/leannecrowvideos.com/127.0.0.1#5335\nipset=/leannecrowvideos.com/gfwlist\nserver=/freebasics.com/127.0.0.1#5335\nipset=/freebasics.com/gfwlist\nserver=/bmw-albania.com/127.0.0.1#5335\nipset=/bmw-albania.com/gfwlist\nserver=/wildxxxhardcore.com/127.0.0.1#5335\nipset=/wildxxxhardcore.com/gfwlist\nserver=/blogspot.mk/127.0.0.1#5335\nipset=/blogspot.mk/gfwlist\nserver=/drebeats-france.com/127.0.0.1#5335\nipset=/drebeats-france.com/gfwlist\nserver=/dagfs.com/127.0.0.1#5335\nipset=/dagfs.com/gfwlist\nserver=/paypalshopping.net/127.0.0.1#5335\nipset=/paypalshopping.net/gfwlist\nserver=/sex-hot-sites.com/127.0.0.1#5335\nipset=/sex-hot-sites.com/gfwlist\nserver=/verisign.com.br/127.0.0.1#5335\nipset=/verisign.com.br/gfwlist\nserver=/perfectnaked.com/127.0.0.1#5335\nipset=/perfectnaked.com/gfwlist\nserver=/hplip.net/127.0.0.1#5335\nipset=/hplip.net/gfwlist\nserver=/animegal.net/127.0.0.1#5335\nipset=/animegal.net/gfwlist\nserver=/xxxstreams.eu/127.0.0.1#5335\nipset=/xxxstreams.eu/gfwlist\nserver=/chaturbate.com/127.0.0.1#5335\nipset=/chaturbate.com/gfwlist\nserver=/nikeclub.com/127.0.0.1#5335\nipset=/nikeclub.com/gfwlist\nserver=/kktix.com/127.0.0.1#5335\nipset=/kktix.com/gfwlist\nserver=/hotladyhere.com/127.0.0.1#5335\nipset=/hotladyhere.com/gfwlist\nserver=/ahvideosexe.com/127.0.0.1#5335\nipset=/ahvideosexe.com/gfwlist\nserver=/instagramlogin.com/127.0.0.1#5335\nipset=/instagramlogin.com/gfwlist\nserver=/centos.org/127.0.0.1#5335\nipset=/centos.org/gfwlist\nserver=/oauthz.com/127.0.0.1#5335\nipset=/oauthz.com/gfwlist\nserver=/x1337x.se/127.0.0.1#5335\nipset=/x1337x.se/gfwlist\nserver=/mach-os.net/127.0.0.1#5335\nipset=/mach-os.net/gfwlist\nserver=/tsmodelstube.com/127.0.0.1#5335\nipset=/tsmodelstube.com/gfwlist\nserver=/hornygfporn.com/127.0.0.1#5335\nipset=/hornygfporn.com/gfwlist\nserver=/gloryofheracles.com/127.0.0.1#5335\nipset=/gloryofheracles.com/gfwlist\nserver=/booksc.me/127.0.0.1#5335\nipset=/booksc.me/gfwlist\nserver=/eca.hinet.net/127.0.0.1#5335\nipset=/eca.hinet.net/gfwlist\nserver=/vkontakte.ru/127.0.0.1#5335\nipset=/vkontakte.ru/gfwlist\nserver=/crit-staging.com/127.0.0.1#5335\nipset=/crit-staging.com/gfwlist\nserver=/fabuyemian.com/127.0.0.1#5335\nipset=/fabuyemian.com/gfwlist\nserver=/yourdoll.com/127.0.0.1#5335\nipset=/yourdoll.com/gfwlist\nserver=/beatsua.com/127.0.0.1#5335\nipset=/beatsua.com/gfwlist\nserver=/newtalk.tw/127.0.0.1#5335\nipset=/newtalk.tw/gfwlist\nserver=/nikeshoesmarket.com/127.0.0.1#5335\nipset=/nikeshoesmarket.com/gfwlist\nserver=/petiteballerinasfucked.com/127.0.0.1#5335\nipset=/petiteballerinasfucked.com/gfwlist\nserver=/vimeo.fr/127.0.0.1#5335\nipset=/vimeo.fr/gfwlist\nserver=/mastercard.pt/127.0.0.1#5335\nipset=/mastercard.pt/gfwlist\nserver=/nikegenealogy.com/127.0.0.1#5335\nipset=/nikegenealogy.com/gfwlist\nserver=/yahoo.com.sg/127.0.0.1#5335\nipset=/yahoo.com.sg/gfwlist\nserver=/windy.com/127.0.0.1#5335\nipset=/windy.com/gfwlist\nserver=/sony.lt/127.0.0.1#5335\nipset=/sony.lt/gfwlist\nserver=/facebookcoronavirus.com/127.0.0.1#5335\nipset=/facebookcoronavirus.com/gfwlist\nserver=/livephotos.tv/127.0.0.1#5335\nipset=/livephotos.tv/gfwlist\nserver=/att-japan.com/127.0.0.1#5335\nipset=/att-japan.com/gfwlist\nserver=/ikea.com.gr/127.0.0.1#5335\nipset=/ikea.com.gr/gfwlist\nserver=/zeit.co/127.0.0.1#5335\nipset=/zeit.co/gfwlist\nserver=/hairyclassic.com/127.0.0.1#5335\nipset=/hairyclassic.com/gfwlist\nserver=/zeitworld.com/127.0.0.1#5335\nipset=/zeitworld.com/gfwlist\nserver=/gaymenring.com/127.0.0.1#5335\nipset=/gaymenring.com/gfwlist\nserver=/liberapay.org/127.0.0.1#5335\nipset=/liberapay.org/gfwlist\nserver=/independentoperatorcn.com/127.0.0.1#5335\nipset=/independentoperatorcn.com/gfwlist\nserver=/javscatting.com/127.0.0.1#5335\nipset=/javscatting.com/gfwlist\nserver=/rakuten-static.com/127.0.0.1#5335\nipset=/rakuten-static.com/gfwlist\nserver=/s-bluemix.net/127.0.0.1#5335\nipset=/s-bluemix.net/gfwlist\nserver=/primevideo.tv/127.0.0.1#5335\nipset=/primevideo.tv/gfwlist\nserver=/javbus22.com/127.0.0.1#5335\nipset=/javbus22.com/gfwlist\nserver=/visa.ca/127.0.0.1#5335\nipset=/visa.ca/gfwlist\nserver=/directvhouston.com/127.0.0.1#5335\nipset=/directvhouston.com/gfwlist\nserver=/gloryholeswallow.com/127.0.0.1#5335\nipset=/gloryholeswallow.com/gfwlist\nserver=/ebayglobalshipping.com/127.0.0.1#5335\nipset=/ebayglobalshipping.com/gfwlist\nserver=/ozeex.com/127.0.0.1#5335\nipset=/ozeex.com/gfwlist\nserver=/donsnaughtymodels.com/127.0.0.1#5335\nipset=/donsnaughtymodels.com/gfwlist\nserver=/facebo-ok.com/127.0.0.1#5335\nipset=/facebo-ok.com/gfwlist\nserver=/anime-rule34-world.b-cdn.net/127.0.0.1#5335\nipset=/anime-rule34-world.b-cdn.net/gfwlist\nserver=/dropboxforum.com/127.0.0.1#5335\nipset=/dropboxforum.com/gfwlist\nserver=/mini.nc/127.0.0.1#5335\nipset=/mini.nc/gfwlist\nserver=/taiwannews.com.tw/127.0.0.1#5335\nipset=/taiwannews.com.tw/gfwlist\nserver=/paypal-europe.com/127.0.0.1#5335\nipset=/paypal-europe.com/gfwlist\nserver=/reallesbianexposed.com/127.0.0.1#5335\nipset=/reallesbianexposed.com/gfwlist\nserver=/discordsays.com/127.0.0.1#5335\nipset=/discordsays.com/gfwlist\nserver=/bmwdelawarevalley.com/127.0.0.1#5335\nipset=/bmwdelawarevalley.com/gfwlist\nserver=/haisetu.net/127.0.0.1#5335\nipset=/haisetu.net/gfwlist\nserver=/casquebeatsbydrdresolohd.com/127.0.0.1#5335\nipset=/casquebeatsbydrdresolohd.com/gfwlist\nserver=/icloud.com/127.0.0.1#5335\nipset=/icloud.com/gfwlist\nserver=/extraindiansex.com/127.0.0.1#5335\nipset=/extraindiansex.com/gfwlist\nserver=/abow.jp/127.0.0.1#5335\nipset=/abow.jp/gfwlist\nserver=/plusone8.com/127.0.0.1#5335\nipset=/plusone8.com/gfwlist\nserver=/appleonline.com/127.0.0.1#5335\nipset=/appleonline.com/gfwlist\nserver=/famouspornstars.com/127.0.0.1#5335\nipset=/famouspornstars.com/gfwlist\nserver=/shopee.io/127.0.0.1#5335\nipset=/shopee.io/gfwlist\nserver=/publicsexhub.com/127.0.0.1#5335\nipset=/publicsexhub.com/gfwlist\nserver=/yandex.ru/127.0.0.1#5335\nipset=/yandex.ru/gfwlist\nserver=/amateur-pussies.com/127.0.0.1#5335\nipset=/amateur-pussies.com/gfwlist\nserver=/nikeshoescity.com/127.0.0.1#5335\nipset=/nikeshoescity.com/gfwlist\nserver=/amazonaws.co.uk/127.0.0.1#5335\nipset=/amazonaws.co.uk/gfwlist\nserver=/lgappstv.com/127.0.0.1#5335\nipset=/lgappstv.com/gfwlist\nserver=/beatsbydresaleonlines-nz.com/127.0.0.1#5335\nipset=/beatsbydresaleonlines-nz.com/gfwlist\nserver=/microsoftadc.com/127.0.0.1#5335\nipset=/microsoftadc.com/gfwlist\nserver=/tps138.info/127.0.0.1#5335\nipset=/tps138.info/gfwlist\nserver=/onmanorama.com/127.0.0.1#5335\nipset=/onmanorama.com/gfwlist\nserver=/bmw.rs/127.0.0.1#5335\nipset=/bmw.rs/gfwlist\nserver=/rarbg.me/127.0.0.1#5335\nipset=/rarbg.me/gfwlist\nserver=/joinside.org/127.0.0.1#5335\nipset=/joinside.org/gfwlist\nserver=/girlsxxx.net/127.0.0.1#5335\nipset=/girlsxxx.net/gfwlist\nserver=/kamisama-day.jp/127.0.0.1#5335\nipset=/kamisama-day.jp/gfwlist\nserver=/hpcomputers.com/127.0.0.1#5335\nipset=/hpcomputers.com/gfwlist\nserver=/linearcollider.org/127.0.0.1#5335\nipset=/linearcollider.org/gfwlist\nserver=/lizardporn.com/127.0.0.1#5335\nipset=/lizardporn.com/gfwlist\nserver=/youtube.co.at/127.0.0.1#5335\nipset=/youtube.co.at/gfwlist\nserver=/youtube.rs/127.0.0.1#5335\nipset=/youtube.rs/gfwlist\nserver=/bestpremiumpornsite.com/127.0.0.1#5335\nipset=/bestpremiumpornsite.com/gfwlist\nserver=/dweb.link/127.0.0.1#5335\nipset=/dweb.link/gfwlist\nserver=/youtube.co.cr/127.0.0.1#5335\nipset=/youtube.co.cr/gfwlist\nserver=/facwebook.com/127.0.0.1#5335\nipset=/facwebook.com/gfwlist\nserver=/akastream.com/127.0.0.1#5335\nipset=/akastream.com/gfwlist\nserver=/createspace.com/127.0.0.1#5335\nipset=/createspace.com/gfwlist\nserver=/volvotrucks.nl/127.0.0.1#5335\nipset=/volvotrucks.nl/gfwlist\nserver=/instagramizlenme.com/127.0.0.1#5335\nipset=/instagramizlenme.com/gfwlist\nserver=/earngeek.com/127.0.0.1#5335\nipset=/earngeek.com/gfwlist\nserver=/googleapis.com/127.0.0.1#5335\nipset=/googleapis.com/gfwlist\nserver=/beatspillnewcolor.com/127.0.0.1#5335\nipset=/beatspillnewcolor.com/gfwlist\nserver=/sandisk.co.uk/127.0.0.1#5335\nipset=/sandisk.co.uk/gfwlist\nserver=/positivessl.com/127.0.0.1#5335\nipset=/positivessl.com/gfwlist\nserver=/shyav.com/127.0.0.1#5335\nipset=/shyav.com/gfwlist\nserver=/mariobroswii.com/127.0.0.1#5335\nipset=/mariobroswii.com/gfwlist\nserver=/pornodrome.tv/127.0.0.1#5335\nipset=/pornodrome.tv/gfwlist\nserver=/pearsonassessment.nl/127.0.0.1#5335\nipset=/pearsonassessment.nl/gfwlist\nserver=/xvideos-porn-video.com/127.0.0.1#5335\nipset=/xvideos-porn-video.com/gfwlist\nserver=/vfsco.pl/127.0.0.1#5335\nipset=/vfsco.pl/gfwlist\nserver=/briantreepayments.tv/127.0.0.1#5335\nipset=/briantreepayments.tv/gfwlist\nserver=/bmw-motorrad.dz/127.0.0.1#5335\nipset=/bmw-motorrad.dz/gfwlist\nserver=/bloombergnext.com/127.0.0.1#5335\nipset=/bloombergnext.com/gfwlist\nserver=/beatsbydreoordopjes.com/127.0.0.1#5335\nipset=/beatsbydreoordopjes.com/gfwlist\nserver=/touchsmartpc.com/127.0.0.1#5335\nipset=/touchsmartpc.com/gfwlist\nserver=/freefblikes.com/127.0.0.1#5335\nipset=/freefblikes.com/gfwlist\nserver=/youtubego.id/127.0.0.1#5335\nipset=/youtubego.id/gfwlist\nserver=/appdomain.cloud/127.0.0.1#5335\nipset=/appdomain.cloud/gfwlist\nserver=/pornmadeathome.com/127.0.0.1#5335\nipset=/pornmadeathome.com/gfwlist\nserver=/applecentar.co.rs/127.0.0.1#5335\nipset=/applecentar.co.rs/gfwlist\nserver=/oncars.in/127.0.0.1#5335\nipset=/oncars.in/gfwlist\nserver=/fontshop-prod-responsive-images.s3.amazonaws.com/127.0.0.1#5335\nipset=/fontshop-prod-responsive-images.s3.amazonaws.com/gfwlist\nserver=/applepay.berlin/127.0.0.1#5335\nipset=/applepay.berlin/gfwlist\nserver=/cnnmoneystream.com/127.0.0.1#5335\nipset=/cnnmoneystream.com/gfwlist\nserver=/bridgestonetire.com/127.0.0.1#5335\nipset=/bridgestonetire.com/gfwlist\nserver=/adidas.hu/127.0.0.1#5335\nipset=/adidas.hu/gfwlist\nserver=/telebay.com/127.0.0.1#5335\nipset=/telebay.com/gfwlist\nserver=/bingagencyawards.com/127.0.0.1#5335\nipset=/bingagencyawards.com/gfwlist\nserver=/thebeatsbydre.com/127.0.0.1#5335\nipset=/thebeatsbydre.com/gfwlist\nserver=/ikea.my/127.0.0.1#5335\nipset=/ikea.my/gfwlist\nserver=/rule34h.com/127.0.0.1#5335\nipset=/rule34h.com/gfwlist\nserver=/facebookmsn.com/127.0.0.1#5335\nipset=/facebookmsn.com/gfwlist\nserver=/facebookporn.org/127.0.0.1#5335\nipset=/facebookporn.org/gfwlist\nserver=/globalsign.net/127.0.0.1#5335\nipset=/globalsign.net/gfwlist\nserver=/billmelater.com/127.0.0.1#5335\nipset=/billmelater.com/gfwlist\nserver=/libgen.st/127.0.0.1#5335\nipset=/libgen.st/gfwlist\nserver=/xinfhw.com/127.0.0.1#5335\nipset=/xinfhw.com/gfwlist\nserver=/bmw-asia.com/127.0.0.1#5335\nipset=/bmw-asia.com/gfwlist\nserver=/pixiv.org/127.0.0.1#5335\nipset=/pixiv.org/gfwlist\nserver=/downloadsforipod.com/127.0.0.1#5335\nipset=/downloadsforipod.com/gfwlist\nserver=/alphabet.lv/127.0.0.1#5335\nipset=/alphabet.lv/gfwlist\nserver=/pornxvideos.win/127.0.0.1#5335\nipset=/pornxvideos.win/gfwlist\nserver=/free-aa.com/127.0.0.1#5335\nipset=/free-aa.com/gfwlist\nserver=/sislovesme.com/127.0.0.1#5335\nipset=/sislovesme.com/gfwlist\nserver=/cbspressexpress.com/127.0.0.1#5335\nipset=/cbspressexpress.com/gfwlist\nserver=/hex.pm/127.0.0.1#5335\nipset=/hex.pm/gfwlist\nserver=/sanspo.com/127.0.0.1#5335\nipset=/sanspo.com/gfwlist\nserver=/ptt.sex/127.0.0.1#5335\nipset=/ptt.sex/gfwlist\nserver=/mingpaomonthly.com/127.0.0.1#5335\nipset=/mingpaomonthly.com/gfwlist\nserver=/titanfall.com/127.0.0.1#5335\nipset=/titanfall.com/gfwlist\nserver=/durex.ro/127.0.0.1#5335\nipset=/durex.ro/gfwlist\nserver=/momsbangteens.com/127.0.0.1#5335\nipset=/momsbangteens.com/gfwlist\nserver=/realmaturesfuck.com/127.0.0.1#5335\nipset=/realmaturesfuck.com/gfwlist\nserver=/12diasderegalosdeitunes.co.cr/127.0.0.1#5335\nipset=/12diasderegalosdeitunes.co.cr/gfwlist\nserver=/xnxx2.info/127.0.0.1#5335\nipset=/xnxx2.info/gfwlist\nserver=/thegatewaypundit.com/127.0.0.1#5335\nipset=/thegatewaypundit.com/gfwlist\nserver=/zononi.com/127.0.0.1#5335\nipset=/zononi.com/gfwlist\nserver=/amazonauthorinsights.com/127.0.0.1#5335\nipset=/amazonauthorinsights.com/gfwlist\nserver=/vrbgay.com/127.0.0.1#5335\nipset=/vrbgay.com/gfwlist\nserver=/xn--fiqs8sxootzz.xn--hxt814e/127.0.0.1#5335\nipset=/xn--fiqs8sxootzz.xn--hxt814e/gfwlist\nserver=/nintendowii.com/127.0.0.1#5335\nipset=/nintendowii.com/gfwlist\nserver=/oculusforbusiness.com/127.0.0.1#5335\nipset=/oculusforbusiness.com/gfwlist\nserver=/xxnxx-porn.com/127.0.0.1#5335\nipset=/xxnxx-porn.com/gfwlist\nserver=/vokevr.com/127.0.0.1#5335\nipset=/vokevr.com/gfwlist\nserver=/accountpaypal.net/127.0.0.1#5335\nipset=/accountpaypal.net/gfwlist\nserver=/shelfstuff.com/127.0.0.1#5335\nipset=/shelfstuff.com/gfwlist\nserver=/facebookatschool.com/127.0.0.1#5335\nipset=/facebookatschool.com/gfwlist\nserver=/yourmomsgotbigtits.com/127.0.0.1#5335\nipset=/yourmomsgotbigtits.com/gfwlist\nserver=/applexpo.net/127.0.0.1#5335\nipset=/applexpo.net/gfwlist\nserver=/justmysocks1.net/127.0.0.1#5335\nipset=/justmysocks1.net/gfwlist\nserver=/weeklytimesnow.com.au/127.0.0.1#5335\nipset=/weeklytimesnow.com.au/gfwlist\nserver=/hotfiesta.com/127.0.0.1#5335\nipset=/hotfiesta.com/gfwlist\nserver=/pixplug.in/127.0.0.1#5335\nipset=/pixplug.in/gfwlist\nserver=/smallteenpussy.com/127.0.0.1#5335\nipset=/smallteenpussy.com/gfwlist\nserver=/line.biz/127.0.0.1#5335\nipset=/line.biz/gfwlist\nserver=/usa-beatsbydreheadphonesonsale.net/127.0.0.1#5335\nipset=/usa-beatsbydreheadphonesonsale.net/gfwlist\nserver=/mingpaotor.com/127.0.0.1#5335\nipset=/mingpaotor.com/gfwlist\nserver=/erodoujinshi-world.com/127.0.0.1#5335\nipset=/erodoujinshi-world.com/gfwlist\nserver=/akahost.net/127.0.0.1#5335\nipset=/akahost.net/gfwlist\nserver=/mythicentertainment.net/127.0.0.1#5335\nipset=/mythicentertainment.net/gfwlist\nserver=/vervesex.com/127.0.0.1#5335\nipset=/vervesex.com/gfwlist\nserver=/bluemix.net/127.0.0.1#5335\nipset=/bluemix.net/gfwlist\nserver=/12diasderegalosdeitunes.com/127.0.0.1#5335\nipset=/12diasderegalosdeitunes.com/gfwlist\nserver=/half.tv/127.0.0.1#5335\nipset=/half.tv/gfwlist\nserver=/microsoftadvertising.com/127.0.0.1#5335\nipset=/microsoftadvertising.com/gfwlist\nserver=/vidown.com/127.0.0.1#5335\nipset=/vidown.com/gfwlist\nserver=/cnet.com/127.0.0.1#5335\nipset=/cnet.com/gfwlist\nserver=/spacex.com/127.0.0.1#5335\nipset=/spacex.com/gfwlist\nserver=/freegaysexgames.com/127.0.0.1#5335\nipset=/freegaysexgames.com/gfwlist\nserver=/ikea.jo/127.0.0.1#5335\nipset=/ikea.jo/gfwlist\nserver=/starbucks.com.sg/127.0.0.1#5335\nipset=/starbucks.com.sg/gfwlist\nserver=/nikefrance.com/127.0.0.1#5335\nipset=/nikefrance.com/gfwlist\nserver=/justduckit.com/127.0.0.1#5335\nipset=/justduckit.com/gfwlist\nserver=/bmw-drivingexperience.com/127.0.0.1#5335\nipset=/bmw-drivingexperience.com/gfwlist\nserver=/bypasscensorship.org/127.0.0.1#5335\nipset=/bypasscensorship.org/gfwlist\nserver=/hbo.map.fastly.net/127.0.0.1#5335\nipset=/hbo.map.fastly.net/gfwlist\nserver=/zoho.in/127.0.0.1#5335\nipset=/zoho.in/gfwlist\nserver=/fapporn.me/127.0.0.1#5335\nipset=/fapporn.me/gfwlist\nserver=/etpress.com.hk/127.0.0.1#5335\nipset=/etpress.com.hk/gfwlist\nserver=/ebayclassifieds.tv/127.0.0.1#5335\nipset=/ebayclassifieds.tv/gfwlist\nserver=/neuerporno.com/127.0.0.1#5335\nipset=/neuerporno.com/gfwlist\nserver=/ozvoice.org/127.0.0.1#5335\nipset=/ozvoice.org/gfwlist\nserver=/thedailysnkr.com/127.0.0.1#5335\nipset=/thedailysnkr.com/gfwlist\nserver=/jkforum.net/127.0.0.1#5335\nipset=/jkforum.net/gfwlist\nserver=/finishinfo.it/127.0.0.1#5335\nipset=/finishinfo.it/gfwlist\nserver=/teensnow.com/127.0.0.1#5335\nipset=/teensnow.com/gfwlist\nserver=/americasvoice.news/127.0.0.1#5335\nipset=/americasvoice.news/gfwlist\nserver=/redis.io/127.0.0.1#5335\nipset=/redis.io/gfwlist\nserver=/liverail.com/127.0.0.1#5335\nipset=/liverail.com/gfwlist\nserver=/hbomaxdash.s.llnwi.net/127.0.0.1#5335\nipset=/hbomaxdash.s.llnwi.net/gfwlist\nserver=/contest.com/127.0.0.1#5335\nipset=/contest.com/gfwlist\nserver=/githubassets.com/127.0.0.1#5335\nipset=/githubassets.com/gfwlist\nserver=/pahabicilemezsurprizler.com/127.0.0.1#5335\nipset=/pahabicilemezsurprizler.com/gfwlist\nserver=/verisign.dk/127.0.0.1#5335\nipset=/verisign.dk/gfwlist\nserver=/beatswholesale.us/127.0.0.1#5335\nipset=/beatswholesale.us/gfwlist\nserver=/swissign.li/127.0.0.1#5335\nipset=/swissign.li/gfwlist\nserver=/stepmaturesex.com/127.0.0.1#5335\nipset=/stepmaturesex.com/gfwlist\nserver=/iphoneplus.wang/127.0.0.1#5335\nipset=/iphoneplus.wang/gfwlist\nserver=/stripselector.com/127.0.0.1#5335\nipset=/stripselector.com/gfwlist\nserver=/ituneslogin.net/127.0.0.1#5335\nipset=/ituneslogin.net/gfwlist\nserver=/instituteofwar.org/127.0.0.1#5335\nipset=/instituteofwar.org/gfwlist\nserver=/javhub.net/127.0.0.1#5335\nipset=/javhub.net/gfwlist\nserver=/whimn.com.au/127.0.0.1#5335\nipset=/whimn.com.au/gfwlist\nserver=/indiansexmms2.com/127.0.0.1#5335\nipset=/indiansexmms2.com/gfwlist\nserver=/weekly-economist.com/127.0.0.1#5335\nipset=/weekly-economist.com/gfwlist\nserver=/volvotrucks.kg/127.0.0.1#5335\nipset=/volvotrucks.kg/gfwlist\nserver=/watch-ebay.org/127.0.0.1#5335\nipset=/watch-ebay.org/gfwlist\nserver=/facebook-forum.com/127.0.0.1#5335\nipset=/facebook-forum.com/gfwlist\nserver=/uplay.com/127.0.0.1#5335\nipset=/uplay.com/gfwlist\nserver=/outletnike.com/127.0.0.1#5335\nipset=/outletnike.com/gfwlist\nserver=/mini.tn/127.0.0.1#5335\nipset=/mini.tn/gfwlist\nserver=/hket.com/127.0.0.1#5335\nipset=/hket.com/gfwlist\nserver=/nke6.com/127.0.0.1#5335\nipset=/nke6.com/gfwlist\nserver=/intel.ie/127.0.0.1#5335\nipset=/intel.ie/gfwlist\nserver=/dirtyship.com/127.0.0.1#5335\nipset=/dirtyship.com/gfwlist\nserver=/colombianas.webcam/127.0.0.1#5335\nipset=/colombianas.webcam/gfwlist\nserver=/fonts.com/127.0.0.1#5335\nipset=/fonts.com/gfwlist\nserver=/porn-discounts.com/127.0.0.1#5335\nipset=/porn-discounts.com/gfwlist\nserver=/mit.net/127.0.0.1#5335\nipset=/mit.net/gfwlist\nserver=/365buymy.com/127.0.0.1#5335\nipset=/365buymy.com/gfwlist\nserver=/huluad.com/127.0.0.1#5335\nipset=/huluad.com/gfwlist\nserver=/golos-ameriki.ru/127.0.0.1#5335\nipset=/golos-ameriki.ru/gfwlist\nserver=/bmwspecialoffers.ca/127.0.0.1#5335\nipset=/bmwspecialoffers.ca/gfwlist\nserver=/sego8.cc/127.0.0.1#5335\nipset=/sego8.cc/gfwlist\nserver=/pearson.fr/127.0.0.1#5335\nipset=/pearson.fr/gfwlist\nserver=/yahoo.mw/127.0.0.1#5335\nipset=/yahoo.mw/gfwlist\nserver=/autumn-jade.com/127.0.0.1#5335\nipset=/autumn-jade.com/gfwlist\nserver=/fury.io/127.0.0.1#5335\nipset=/fury.io/gfwlist\nserver=/amateurpornonly.com/127.0.0.1#5335\nipset=/amateurpornonly.com/gfwlist\nserver=/highcolonic.info/127.0.0.1#5335\nipset=/highcolonic.info/gfwlist\nserver=/appleinclegal.com/127.0.0.1#5335\nipset=/appleinclegal.com/gfwlist\nserver=/hornysexgame.com/127.0.0.1#5335\nipset=/hornysexgame.com/gfwlist\nserver=/bmw-group.net/127.0.0.1#5335\nipset=/bmw-group.net/gfwlist\nserver=/hentaibros.com/127.0.0.1#5335\nipset=/hentaibros.com/gfwlist\nserver=/52fuliji.cc/127.0.0.1#5335\nipset=/52fuliji.cc/gfwlist\nserver=/att.net/127.0.0.1#5335\nipset=/att.net/gfwlist\nserver=/bmw.lk/127.0.0.1#5335\nipset=/bmw.lk/gfwlist\nserver=/nextdigital.com.hk/127.0.0.1#5335\nipset=/nextdigital.com.hk/gfwlist\nserver=/gayasiantheater.com/127.0.0.1#5335\nipset=/gayasiantheater.com/gfwlist\nserver=/microsoft.hu/127.0.0.1#5335\nipset=/microsoft.hu/gfwlist\nserver=/debank.com/127.0.0.1#5335\nipset=/debank.com/gfwlist\nserver=/beats-bydreoutletonline.com/127.0.0.1#5335\nipset=/beats-bydreoutletonline.com/gfwlist\nserver=/1337xx.to/127.0.0.1#5335\nipset=/1337xx.to/gfwlist\nserver=/page.link/127.0.0.1#5335\nipset=/page.link/gfwlist\nserver=/gputechconf.com.au/127.0.0.1#5335\nipset=/gputechconf.com.au/gfwlist\nserver=/oath.cloud/127.0.0.1#5335\nipset=/oath.cloud/gfwlist\nserver=/paypal-apps.com/127.0.0.1#5335\nipset=/paypal-apps.com/gfwlist\nserver=/newenergyfinance.com/127.0.0.1#5335\nipset=/newenergyfinance.com/gfwlist\nserver=/hpconnected.us/127.0.0.1#5335\nipset=/hpconnected.us/gfwlist\nserver=/applepaysupplies.tv/127.0.0.1#5335\nipset=/applepaysupplies.tv/gfwlist\nserver=/volvobuses.com.pt/127.0.0.1#5335\nipset=/volvobuses.com.pt/gfwlist\nserver=/airwick.es/127.0.0.1#5335\nipset=/airwick.es/gfwlist\nserver=/speedrun.com/127.0.0.1#5335\nipset=/speedrun.com/gfwlist\nserver=/google.ht/127.0.0.1#5335\nipset=/google.ht/gfwlist\nserver=/lewdvrgames.com/127.0.0.1#5335\nipset=/lewdvrgames.com/gfwlist\nserver=/hdpornt.com/127.0.0.1#5335\nipset=/hdpornt.com/gfwlist\nserver=/disneyinternational.com/127.0.0.1#5335\nipset=/disneyinternational.com/gfwlist\nserver=/masterintelligence.com/127.0.0.1#5335\nipset=/masterintelligence.com/gfwlist\nserver=/deepl.com/127.0.0.1#5335\nipset=/deepl.com/gfwlist\nserver=/paypal-team.com/127.0.0.1#5335\nipset=/paypal-team.com/gfwlist\nserver=/instagramtakiphilesi.com/127.0.0.1#5335\nipset=/instagramtakiphilesi.com/gfwlist\nserver=/pornpros.com/127.0.0.1#5335\nipset=/pornpros.com/gfwlist\nserver=/2gayboys.com/127.0.0.1#5335\nipset=/2gayboys.com/gfwlist\nserver=/afpforum.com/127.0.0.1#5335\nipset=/afpforum.com/gfwlist\nserver=/bigtopsites.com/127.0.0.1#5335\nipset=/bigtopsites.com/gfwlist\nserver=/anime-tube.pw/127.0.0.1#5335\nipset=/anime-tube.pw/gfwlist\nserver=/eropasture.com/127.0.0.1#5335\nipset=/eropasture.com/gfwlist\nserver=/twitteroauth.com/127.0.0.1#5335\nipset=/twitteroauth.com/gfwlist\nserver=/scholar.google.de/127.0.0.1#5335\nipset=/scholar.google.de/gfwlist\nserver=/ohsexfilm.com/127.0.0.1#5335\nipset=/ohsexfilm.com/gfwlist\nserver=/gateway.pinata.cloud/127.0.0.1#5335\nipset=/gateway.pinata.cloud/gfwlist\nserver=/minneapolisbmw.com/127.0.0.1#5335\nipset=/minneapolisbmw.com/gfwlist\nserver=/pokemongoldsilver.com/127.0.0.1#5335\nipset=/pokemongoldsilver.com/gfwlist\nserver=/hpdriver.com/127.0.0.1#5335\nipset=/hpdriver.com/gfwlist\nserver=/valvesoftware.com/127.0.0.1#5335\nipset=/valvesoftware.com/gfwlist\nserver=/rsshub.app/127.0.0.1#5335\nipset=/rsshub.app/gfwlist\nserver=/beatsbydrdre-headphones.com/127.0.0.1#5335\nipset=/beatsbydrdre-headphones.com/gfwlist\nserver=/0emm.com/127.0.0.1#5335\nipset=/0emm.com/gfwlist\nserver=/shopify.dev/127.0.0.1#5335\nipset=/shopify.dev/gfwlist\nserver=/xn--74q035i.xn--hxt814e/127.0.0.1#5335\nipset=/xn--74q035i.xn--hxt814e/gfwlist\nserver=/calendarserver.org/127.0.0.1#5335\nipset=/calendarserver.org/gfwlist\nserver=/anysex.com/127.0.0.1#5335\nipset=/anysex.com/gfwlist\nserver=/d2anahhhmp1ffz.cloudfront.net/127.0.0.1#5335\nipset=/d2anahhhmp1ffz.cloudfront.net/gfwlist\nserver=/snapwebcams.com/127.0.0.1#5335\nipset=/snapwebcams.com/gfwlist\nserver=/dis.gd/127.0.0.1#5335\nipset=/dis.gd/gfwlist\nserver=/foxsoccershop.com/127.0.0.1#5335\nipset=/foxsoccershop.com/gfwlist\nserver=/fbhome.com/127.0.0.1#5335\nipset=/fbhome.com/gfwlist\nserver=/ohpornovideo.com/127.0.0.1#5335\nipset=/ohpornovideo.com/gfwlist\nserver=/terapeak.info/127.0.0.1#5335\nipset=/terapeak.info/gfwlist\nserver=/privatemarketplaces.us/127.0.0.1#5335\nipset=/privatemarketplaces.us/gfwlist\nserver=/typenetwork.com/127.0.0.1#5335\nipset=/typenetwork.com/gfwlist\nserver=/bastropfirestone.com/127.0.0.1#5335\nipset=/bastropfirestone.com/gfwlist\nserver=/beurettesvideo.com/127.0.0.1#5335\nipset=/beurettesvideo.com/gfwlist\nserver=/mini-lebanon.com/127.0.0.1#5335\nipset=/mini-lebanon.com/gfwlist\nserver=/paradisehotelquizfox.com/127.0.0.1#5335\nipset=/paradisehotelquizfox.com/gfwlist\nserver=/buypass-ssl.com/127.0.0.1#5335\nipset=/buypass-ssl.com/gfwlist\nserver=/newsgawakaru.com/127.0.0.1#5335\nipset=/newsgawakaru.com/gfwlist\nserver=/www-paypal.info/127.0.0.1#5335\nipset=/www-paypal.info/gfwlist\nserver=/ipod.ru/127.0.0.1#5335\nipset=/ipod.ru/gfwlist\nserver=/demdex.net/127.0.0.1#5335\nipset=/demdex.net/gfwlist\nserver=/deps.dev/127.0.0.1#5335\nipset=/deps.dev/gfwlist\nserver=/cosplayeromania.jp/127.0.0.1#5335\nipset=/cosplayeromania.jp/gfwlist\nserver=/epochtimes.com.br/127.0.0.1#5335\nipset=/epochtimes.com.br/gfwlist\nserver=/xlecx.org/127.0.0.1#5335\nipset=/xlecx.org/gfwlist\nserver=/customnikeshoes.com/127.0.0.1#5335\nipset=/customnikeshoes.com/gfwlist\nserver=/volvotruckcenter.kr/127.0.0.1#5335\nipset=/volvotruckcenter.kr/gfwlist\nserver=/whatsapp.info/127.0.0.1#5335\nipset=/whatsapp.info/gfwlist\nserver=/monsterbeatsfactory.net/127.0.0.1#5335\nipset=/monsterbeatsfactory.net/gfwlist\nserver=/directvrichmond.com/127.0.0.1#5335\nipset=/directvrichmond.com/gfwlist\nserver=/fbbmarket.com/127.0.0.1#5335\nipset=/fbbmarket.com/gfwlist\nserver=/ikea.com.pr/127.0.0.1#5335\nipset=/ikea.com.pr/gfwlist\nserver=/fetishtown.net/127.0.0.1#5335\nipset=/fetishtown.net/gfwlist\nserver=/terrapeak.com/127.0.0.1#5335\nipset=/terrapeak.com/gfwlist\nserver=/prime-video.com/127.0.0.1#5335\nipset=/prime-video.com/gfwlist\nserver=/stonefoxlingerie.com/127.0.0.1#5335\nipset=/stonefoxlingerie.com/gfwlist\nserver=/3d-toon.com/127.0.0.1#5335\nipset=/3d-toon.com/gfwlist\nserver=/canon.ge/127.0.0.1#5335\nipset=/canon.ge/gfwlist\nserver=/hppavillionlaptop.com/127.0.0.1#5335\nipset=/hppavillionlaptop.com/gfwlist\nserver=/microsoftuwp.com/127.0.0.1#5335\nipset=/microsoftuwp.com/gfwlist\nserver=/openmaps.org/127.0.0.1#5335\nipset=/openmaps.org/gfwlist\nserver=/durex.dk/127.0.0.1#5335\nipset=/durex.dk/gfwlist\nserver=/wankizer.com/127.0.0.1#5335\nipset=/wankizer.com/gfwlist\nserver=/theinitium.com/127.0.0.1#5335\nipset=/theinitium.com/gfwlist\nserver=/sharkyporn.com/127.0.0.1#5335\nipset=/sharkyporn.com/gfwlist\nserver=/cheapbeatsbydrenz.net/127.0.0.1#5335\nipset=/cheapbeatsbydrenz.net/gfwlist\nserver=/shesfreaky.com/127.0.0.1#5335\nipset=/shesfreaky.com/gfwlist\nserver=/topescort.nl/127.0.0.1#5335\nipset=/topescort.nl/gfwlist\nserver=/pornojux.com/127.0.0.1#5335\nipset=/pornojux.com/gfwlist\nserver=/dmgmediaprivacy.co.uk/127.0.0.1#5335\nipset=/dmgmediaprivacy.co.uk/gfwlist\nserver=/nintendo.eu/127.0.0.1#5335\nipset=/nintendo.eu/gfwlist\nserver=/ebi.ac.uk/127.0.0.1#5335\nipset=/ebi.ac.uk/gfwlist\nserver=/cheapbeatsbus.com/127.0.0.1#5335\nipset=/cheapbeatsbus.com/gfwlist\nserver=/bestbuy-jobs.com/127.0.0.1#5335\nipset=/bestbuy-jobs.com/gfwlist\nserver=/imac.one/127.0.0.1#5335\nipset=/imac.one/gfwlist\nserver=/clip16.com/127.0.0.1#5335\nipset=/clip16.com/gfwlist\nserver=/viewpointsfromfacebook.com/127.0.0.1#5335\nipset=/viewpointsfromfacebook.com/gfwlist\nserver=/geeksquad.tv/127.0.0.1#5335\nipset=/geeksquad.tv/gfwlist\nserver=/latex-project.org/127.0.0.1#5335\nipset=/latex-project.org/gfwlist\nserver=/wetandpuffy.com/127.0.0.1#5335\nipset=/wetandpuffy.com/gfwlist\nserver=/pmatehunter.com/127.0.0.1#5335\nipset=/pmatehunter.com/gfwlist\nserver=/epochtimes.com.au/127.0.0.1#5335\nipset=/epochtimes.com.au/gfwlist\nserver=/thz7.net/127.0.0.1#5335\nipset=/thz7.net/gfwlist\nserver=/alphabet.cz/127.0.0.1#5335\nipset=/alphabet.cz/gfwlist\nserver=/adguard.com/127.0.0.1#5335\nipset=/adguard.com/gfwlist\nserver=/bmw-motorrad.com.my/127.0.0.1#5335\nipset=/bmw-motorrad.com.my/gfwlist\nserver=/liketruyen.net/127.0.0.1#5335\nipset=/liketruyen.net/gfwlist\nserver=/nubiles-porn.com/127.0.0.1#5335\nipset=/nubiles-porn.com/gfwlist\nserver=/all-sex-links.com/127.0.0.1#5335\nipset=/all-sex-links.com/gfwlist\nserver=/embed.ly/127.0.0.1#5335\nipset=/embed.ly/gfwlist\nserver=/incommon-rsa.org/127.0.0.1#5335\nipset=/incommon-rsa.org/gfwlist\nserver=/pornfuror.com/127.0.0.1#5335\nipset=/pornfuror.com/gfwlist\nserver=/starbucks.com.tr/127.0.0.1#5335\nipset=/starbucks.com.tr/gfwlist\nserver=/spreadporn.org/127.0.0.1#5335\nipset=/spreadporn.org/gfwlist\nserver=/volvospares.com/127.0.0.1#5335\nipset=/volvospares.com/gfwlist\nserver=/pornohut.info/127.0.0.1#5335\nipset=/pornohut.info/gfwlist\nserver=/wd.com/127.0.0.1#5335\nipset=/wd.com/gfwlist\nserver=/dotcernpilot.info/127.0.0.1#5335\nipset=/dotcernpilot.info/gfwlist\nserver=/foxcreativeuniversity.com/127.0.0.1#5335\nipset=/foxcreativeuniversity.com/gfwlist\nserver=/porndisk.com/127.0.0.1#5335\nipset=/porndisk.com/gfwlist\nserver=/bloombergradio.com/127.0.0.1#5335\nipset=/bloombergradio.com/gfwlist\nserver=/visa.com.co/127.0.0.1#5335\nipset=/visa.com.co/gfwlist\nserver=/yandex.com.ua/127.0.0.1#5335\nipset=/yandex.com.ua/gfwlist\nserver=/vodafone.de/127.0.0.1#5335\nipset=/vodafone.de/gfwlist\nserver=/ikea.co.pl/127.0.0.1#5335\nipset=/ikea.co.pl/gfwlist\nserver=/xxx.xxx/127.0.0.1#5335\nipset=/xxx.xxx/gfwlist\nserver=/addison-wesley.ch/127.0.0.1#5335\nipset=/addison-wesley.ch/gfwlist\nserver=/voaafrique.com/127.0.0.1#5335\nipset=/voaafrique.com/gfwlist\nserver=/intel.us/127.0.0.1#5335\nipset=/intel.us/gfwlist\nserver=/psg-int-centralus.cloudapp.net/127.0.0.1#5335\nipset=/psg-int-centralus.cloudapp.net/gfwlist\nserver=/fb.com/127.0.0.1#5335\nipset=/fb.com/gfwlist\nserver=/passport.net/127.0.0.1#5335\nipset=/passport.net/gfwlist\nserver=/hplaptop.com/127.0.0.1#5335\nipset=/hplaptop.com/gfwlist\nserver=/ea.com/127.0.0.1#5335\nipset=/ea.com/gfwlist\nserver=/jtvnw.net/127.0.0.1#5335\nipset=/jtvnw.net/gfwlist\nserver=/voxcreative.com/127.0.0.1#5335\nipset=/voxcreative.com/gfwlist\nserver=/youtube.com.ph/127.0.0.1#5335\nipset=/youtube.com.ph/gfwlist\nserver=/zb.com/127.0.0.1#5335\nipset=/zb.com/gfwlist\nserver=/nikedunksshoes.com/127.0.0.1#5335\nipset=/nikedunksshoes.com/gfwlist\nserver=/mainichibooks.com/127.0.0.1#5335\nipset=/mainichibooks.com/gfwlist\nserver=/farfetch.net/127.0.0.1#5335\nipset=/farfetch.net/gfwlist\nserver=/explicittube.com/127.0.0.1#5335\nipset=/explicittube.com/gfwlist\nserver=/ttvnw.net/127.0.0.1#5335\nipset=/ttvnw.net/gfwlist\nserver=/volvobuses.be/127.0.0.1#5335\nipset=/volvobuses.be/gfwlist\nserver=/luvmov.com/127.0.0.1#5335\nipset=/luvmov.com/gfwlist\nserver=/paypalnetwork.org/127.0.0.1#5335\nipset=/paypalnetwork.org/gfwlist\nserver=/bmw-world.tv/127.0.0.1#5335\nipset=/bmw-world.tv/gfwlist\nserver=/facebookworld.com/127.0.0.1#5335\nipset=/facebookworld.com/gfwlist\nserver=/alt6-mtalk.google.com/127.0.0.1#5335\nipset=/alt6-mtalk.google.com/gfwlist\nserver=/16fhgdty.xyz/127.0.0.1#5335\nipset=/16fhgdty.xyz/gfwlist\nserver=/adultfreex.com/127.0.0.1#5335\nipset=/adultfreex.com/gfwlist\nserver=/historyofdota.com/127.0.0.1#5335\nipset=/historyofdota.com/gfwlist\nserver=/alpherafs.ie/127.0.0.1#5335\nipset=/alpherafs.ie/gfwlist\nserver=/finishkilpailu.fi/127.0.0.1#5335\nipset=/finishkilpailu.fi/gfwlist\nserver=/google.rw/127.0.0.1#5335\nipset=/google.rw/gfwlist\nserver=/attglobal.net/127.0.0.1#5335\nipset=/attglobal.net/gfwlist\nserver=/alivevm.com/127.0.0.1#5335\nipset=/alivevm.com/gfwlist\nserver=/aranzadi.es/127.0.0.1#5335\nipset=/aranzadi.es/gfwlist\nserver=/gaypornlove.net/127.0.0.1#5335\nipset=/gaypornlove.net/gfwlist\nserver=/0cgdklr5sfwj.com/127.0.0.1#5335\nipset=/0cgdklr5sfwj.com/gfwlist\nserver=/younger19.com/127.0.0.1#5335\nipset=/younger19.com/gfwlist\nserver=/psyccareers.com/127.0.0.1#5335\nipset=/psyccareers.com/gfwlist\nserver=/me.com/127.0.0.1#5335\nipset=/me.com/gfwlist\nserver=/zohouniversity.com/127.0.0.1#5335\nipset=/zohouniversity.com/gfwlist\nserver=/javbus.com/127.0.0.1#5335\nipset=/javbus.com/gfwlist\nserver=/nebay.net/127.0.0.1#5335\nipset=/nebay.net/gfwlist\nserver=/thepornscat.com/127.0.0.1#5335\nipset=/thepornscat.com/gfwlist\nserver=/blogspot.td/127.0.0.1#5335\nipset=/blogspot.td/gfwlist\nserver=/canon.co.il/127.0.0.1#5335\nipset=/canon.co.il/gfwlist\nserver=/69-sexgames.com/127.0.0.1#5335\nipset=/69-sexgames.com/gfwlist\nserver=/kijijiraps.ca/127.0.0.1#5335\nipset=/kijijiraps.ca/gfwlist\nserver=/mofosnetwork.com/127.0.0.1#5335\nipset=/mofosnetwork.com/gfwlist\nserver=/yahoo.com.vn/127.0.0.1#5335\nipset=/yahoo.com.vn/gfwlist\nserver=/gettyimages.pt/127.0.0.1#5335\nipset=/gettyimages.pt/gfwlist\nserver=/srwwu.uno/127.0.0.1#5335\nipset=/srwwu.uno/gfwlist\nserver=/microsoft.uz/127.0.0.1#5335\nipset=/microsoft.uz/gfwlist\nserver=/pinterest.com.vn/127.0.0.1#5335\nipset=/pinterest.com.vn/gfwlist\nserver=/cabletv.com.hk/127.0.0.1#5335\nipset=/cabletv.com.hk/gfwlist\nserver=/diablo3.com/127.0.0.1#5335\nipset=/diablo3.com/gfwlist\nserver=/nakadashi.to/127.0.0.1#5335\nipset=/nakadashi.to/gfwlist\nserver=/oreilly.review/127.0.0.1#5335\nipset=/oreilly.review/gfwlist\nserver=/hot-teens.com/127.0.0.1#5335\nipset=/hot-teens.com/gfwlist\nserver=/makeitopen.com/127.0.0.1#5335\nipset=/makeitopen.com/gfwlist\nserver=/dynacw.com/127.0.0.1#5335\nipset=/dynacw.com/gfwlist\nserver=/lede-project.org/127.0.0.1#5335\nipset=/lede-project.org/gfwlist\nserver=/beatsbydresonline-nz.com/127.0.0.1#5335\nipset=/beatsbydresonline-nz.com/gfwlist\nserver=/beatsbydresalemall2013.com/127.0.0.1#5335\nipset=/beatsbydresalemall2013.com/gfwlist\nserver=/porcore.com/127.0.0.1#5335\nipset=/porcore.com/gfwlist\nserver=/powerappscdn.net/127.0.0.1#5335\nipset=/powerappscdn.net/gfwlist\nserver=/rakuten.ca/127.0.0.1#5335\nipset=/rakuten.ca/gfwlist\nserver=/rk.com/127.0.0.1#5335\nipset=/rk.com/gfwlist\nserver=/elasticbeanstalk.com/127.0.0.1#5335\nipset=/elasticbeanstalk.com/gfwlist\nserver=/vk.com/127.0.0.1#5335\nipset=/vk.com/gfwlist\nserver=/oxlife.co/127.0.0.1#5335\nipset=/oxlife.co/gfwlist\nserver=/internationalsaimoe.com/127.0.0.1#5335\nipset=/internationalsaimoe.com/gfwlist\nserver=/idservice.inc/127.0.0.1#5335\nipset=/idservice.inc/gfwlist\nserver=/bffshd.com/127.0.0.1#5335\nipset=/bffshd.com/gfwlist\nserver=/squirrelgroup.net/127.0.0.1#5335\nipset=/squirrelgroup.net/gfwlist\nserver=/blogspot.sk/127.0.0.1#5335\nipset=/blogspot.sk/gfwlist\nserver=/microsoft.ua/127.0.0.1#5335\nipset=/microsoft.ua/gfwlist\nserver=/bountyhunterporn.com/127.0.0.1#5335\nipset=/bountyhunterporn.com/gfwlist\nserver=/ipadair.cl/127.0.0.1#5335\nipset=/ipadair.cl/gfwlist\nserver=/takegoto.com/127.0.0.1#5335\nipset=/takegoto.com/gfwlist\nserver=/ikea.au/127.0.0.1#5335\nipset=/ikea.au/gfwlist\nserver=/av69.tv/127.0.0.1#5335\nipset=/av69.tv/gfwlist\nserver=/logitech.com.cn/127.0.0.1#5335\nipset=/logitech.com.cn/gfwlist\nserver=/hbogoasia.sg/127.0.0.1#5335\nipset=/hbogoasia.sg/gfwlist\nserver=/cbsplaylistserver.aws.syncbak.com/127.0.0.1#5335\nipset=/cbsplaylistserver.aws.syncbak.com/gfwlist\nserver=/hpprinterinstalls.com/127.0.0.1#5335\nipset=/hpprinterinstalls.com/gfwlist\nserver=/intercom.com/127.0.0.1#5335\nipset=/intercom.com/gfwlist\nserver=/nikehelp.com/127.0.0.1#5335\nipset=/nikehelp.com/gfwlist\nserver=/mallandrinhas.net/127.0.0.1#5335\nipset=/mallandrinhas.net/gfwlist\nserver=/gettyimages.be/127.0.0.1#5335\nipset=/gettyimages.be/gfwlist\nserver=/2k.com/127.0.0.1#5335\nipset=/2k.com/gfwlist\nserver=/bestgames-2022.com/127.0.0.1#5335\nipset=/bestgames-2022.com/gfwlist\nserver=/apple.is/127.0.0.1#5335\nipset=/apple.is/gfwlist\nserver=/pinterest.co.nz/127.0.0.1#5335\nipset=/pinterest.co.nz/gfwlist\nserver=/finishbrasil.com.br/127.0.0.1#5335\nipset=/finishbrasil.com.br/gfwlist\nserver=/skype-edf.akadns.net/127.0.0.1#5335\nipset=/skype-edf.akadns.net/gfwlist\nserver=/mastercard.com.co/127.0.0.1#5335\nipset=/mastercard.com.co/gfwlist\nserver=/pornyeah.com/127.0.0.1#5335\nipset=/pornyeah.com/gfwlist\nserver=/microsoft.ee/127.0.0.1#5335\nipset=/microsoft.ee/gfwlist\nserver=/intel.md/127.0.0.1#5335\nipset=/intel.md/gfwlist\nserver=/58avgo.com/127.0.0.1#5335\nipset=/58avgo.com/gfwlist\nserver=/ass4all.com/127.0.0.1#5335\nipset=/ass4all.com/gfwlist\nserver=/myxvids.com/127.0.0.1#5335\nipset=/myxvids.com/gfwlist\nserver=/youtube.my/127.0.0.1#5335\nipset=/youtube.my/gfwlist\nserver=/lasvegasbmw.com/127.0.0.1#5335\nipset=/lasvegasbmw.com/gfwlist\nserver=/healthcarecareeronline.com/127.0.0.1#5335\nipset=/healthcarecareeronline.com/gfwlist\nserver=/randyblue.com/127.0.0.1#5335\nipset=/randyblue.com/gfwlist\nserver=/avstar6.com/127.0.0.1#5335\nipset=/avstar6.com/gfwlist\nserver=/vipstudiocali.com/127.0.0.1#5335\nipset=/vipstudiocali.com/gfwlist\nserver=/nikewear.com/127.0.0.1#5335\nipset=/nikewear.com/gfwlist\nserver=/myaccountglobalcash.com/127.0.0.1#5335\nipset=/myaccountglobalcash.com/gfwlist\nserver=/petite.one/127.0.0.1#5335\nipset=/petite.one/gfwlist\nserver=/ro89.com/127.0.0.1#5335\nipset=/ro89.com/gfwlist\nserver=/annualpelvicexam.com/127.0.0.1#5335\nipset=/annualpelvicexam.com/gfwlist\nserver=/mybestbuy.com/127.0.0.1#5335\nipset=/mybestbuy.com/gfwlist\nserver=/blogspot.bj/127.0.0.1#5335\nipset=/blogspot.bj/gfwlist\nserver=/radiosvoboda.org/127.0.0.1#5335\nipset=/radiosvoboda.org/gfwlist\nserver=/xhamsterlive.com/127.0.0.1#5335\nipset=/xhamsterlive.com/gfwlist\nserver=/akamai.com/127.0.0.1#5335\nipset=/akamai.com/gfwlist\nserver=/unraveltwo.com/127.0.0.1#5335\nipset=/unraveltwo.com/gfwlist\nserver=/bluehatil.com/127.0.0.1#5335\nipset=/bluehatil.com/gfwlist\nserver=/juliamiles.com/127.0.0.1#5335\nipset=/juliamiles.com/gfwlist\nserver=/sexytuber.com/127.0.0.1#5335\nipset=/sexytuber.com/gfwlist\nserver=/adorevids.com/127.0.0.1#5335\nipset=/adorevids.com/gfwlist\nserver=/lavteam.org/127.0.0.1#5335\nipset=/lavteam.org/gfwlist\nserver=/facebookwork.com/127.0.0.1#5335\nipset=/facebookwork.com/gfwlist\nserver=/iwork.se/127.0.0.1#5335\nipset=/iwork.se/gfwlist\nserver=/nurofen.hu/127.0.0.1#5335\nipset=/nurofen.hu/gfwlist\nserver=/thinkboxsoftware.com/127.0.0.1#5335\nipset=/thinkboxsoftware.com/gfwlist\nserver=/pornsexer.com/127.0.0.1#5335\nipset=/pornsexer.com/gfwlist\nserver=/sellercommunity.com/127.0.0.1#5335\nipset=/sellercommunity.com/gfwlist\nserver=/mastercard.co.id/127.0.0.1#5335\nipset=/mastercard.co.id/gfwlist\nserver=/mirar.xxx/127.0.0.1#5335\nipset=/mirar.xxx/gfwlist\nserver=/callabitch.org/127.0.0.1#5335\nipset=/callabitch.org/gfwlist\nserver=/brightcove.com/127.0.0.1#5335\nipset=/brightcove.com/gfwlist\nserver=/morteincam.com/127.0.0.1#5335\nipset=/morteincam.com/gfwlist\nserver=/new-jero.net/127.0.0.1#5335\nipset=/new-jero.net/gfwlist\nserver=/iphoto.no/127.0.0.1#5335\nipset=/iphoto.no/gfwlist\nserver=/play4free.com/127.0.0.1#5335\nipset=/play4free.com/gfwlist\nserver=/huluteam.com/127.0.0.1#5335\nipset=/huluteam.com/gfwlist\nserver=/pornking.fun/127.0.0.1#5335\nipset=/pornking.fun/gfwlist\nserver=/myhelpinglab.com/127.0.0.1#5335\nipset=/myhelpinglab.com/gfwlist\nserver=/oxfordmusiconline.com/127.0.0.1#5335\nipset=/oxfordmusiconline.com/gfwlist\nserver=/stripchat.com/127.0.0.1#5335\nipset=/stripchat.com/gfwlist\nserver=/supermario3dworld.com/127.0.0.1#5335\nipset=/supermario3dworld.com/gfwlist\nserver=/huffingtonpost.com.au/127.0.0.1#5335\nipset=/huffingtonpost.com.au/gfwlist\nserver=/pornoko.net/127.0.0.1#5335\nipset=/pornoko.net/gfwlist\nserver=/thebeatsbydre.net/127.0.0.1#5335\nipset=/thebeatsbydre.net/gfwlist\nserver=/torrindex.net/127.0.0.1#5335\nipset=/torrindex.net/gfwlist\nserver=/google.com.pe/127.0.0.1#5335\nipset=/google.com.pe/gfwlist\nserver=/vodafone.com/127.0.0.1#5335\nipset=/vodafone.com/gfwlist\nserver=/dribbble.com/127.0.0.1#5335\nipset=/dribbble.com/gfwlist\nserver=/applestore.sg/127.0.0.1#5335\nipset=/applestore.sg/gfwlist\nserver=/pokemonswordshield.com/127.0.0.1#5335\nipset=/pokemonswordshield.com/gfwlist\nserver=/btcbox.co.jp/127.0.0.1#5335\nipset=/btcbox.co.jp/gfwlist\nserver=/alexanderstreet.com/127.0.0.1#5335\nipset=/alexanderstreet.com/gfwlist\nserver=/picasaweb.net/127.0.0.1#5335\nipset=/picasaweb.net/gfwlist\nserver=/youtube.lt/127.0.0.1#5335\nipset=/youtube.lt/gfwlist\nserver=/hptouchpointmanager.com/127.0.0.1#5335\nipset=/hptouchpointmanager.com/gfwlist\nserver=/usvimosquito.com/127.0.0.1#5335\nipset=/usvimosquito.com/gfwlist\nserver=/desiporn.tube/127.0.0.1#5335\nipset=/desiporn.tube/gfwlist\nserver=/akadeem.net/127.0.0.1#5335\nipset=/akadeem.net/gfwlist\nserver=/llnwd.net/127.0.0.1#5335\nipset=/llnwd.net/gfwlist\nserver=/beatsbydrehd.com/127.0.0.1#5335\nipset=/beatsbydrehd.com/gfwlist\nserver=/google.ee/127.0.0.1#5335\nipset=/google.ee/gfwlist\nserver=/tgp6.com/127.0.0.1#5335\nipset=/tgp6.com/gfwlist\nserver=/amateur-porn-tube.net/127.0.0.1#5335\nipset=/amateur-porn-tube.net/gfwlist\nserver=/powerautomate.com/127.0.0.1#5335\nipset=/powerautomate.com/gfwlist\nserver=/javtag.net/127.0.0.1#5335\nipset=/javtag.net/gfwlist\nserver=/volvotrucks.pl/127.0.0.1#5335\nipset=/volvotrucks.pl/gfwlist\nserver=/epochtimes.fr/127.0.0.1#5335\nipset=/epochtimes.fr/gfwlist\nserver=/freedirecttvspecial.com/127.0.0.1#5335\nipset=/freedirecttvspecial.com/gfwlist\nserver=/freematuresgallery.com/127.0.0.1#5335\nipset=/freematuresgallery.com/gfwlist\nserver=/iina.io/127.0.0.1#5335\nipset=/iina.io/gfwlist\nserver=/foxnewspolitics.com/127.0.0.1#5335\nipset=/foxnewspolitics.com/gfwlist\nserver=/zb.io/127.0.0.1#5335\nipset=/zb.io/gfwlist\nserver=/hotgirlsclips.com/127.0.0.1#5335\nipset=/hotgirlsclips.com/gfwlist\nserver=/foxd.tv/127.0.0.1#5335\nipset=/foxd.tv/gfwlist\nserver=/forthethrone.com/127.0.0.1#5335\nipset=/forthethrone.com/gfwlist\nserver=/visualstudio.net/127.0.0.1#5335\nipset=/visualstudio.net/gfwlist\nserver=/conda.io/127.0.0.1#5335\nipset=/conda.io/gfwlist\nserver=/xvideo.vlog.br/127.0.0.1#5335\nipset=/xvideo.vlog.br/gfwlist\nserver=/nordstrom.com/127.0.0.1#5335\nipset=/nordstrom.com/gfwlist\nserver=/vipheadphones.com/127.0.0.1#5335\nipset=/vipheadphones.com/gfwlist\nserver=/premiumpornlist.com/127.0.0.1#5335\nipset=/premiumpornlist.com/gfwlist\nserver=/hpprintersupplies.com/127.0.0.1#5335\nipset=/hpprintersupplies.com/gfwlist\nserver=/intel.tw/127.0.0.1#5335\nipset=/intel.tw/gfwlist\nserver=/freeteenporn.xxx/127.0.0.1#5335\nipset=/freeteenporn.xxx/gfwlist\nserver=/1lib.to/127.0.0.1#5335\nipset=/1lib.to/gfwlist\nserver=/thomsonreuters.com.pe/127.0.0.1#5335\nipset=/thomsonreuters.com.pe/gfwlist\nserver=/freesitexxx.com/127.0.0.1#5335\nipset=/freesitexxx.com/gfwlist\nserver=/hcaptcha.com/127.0.0.1#5335\nipset=/hcaptcha.com/gfwlist\nserver=/oculusdiving.com/127.0.0.1#5335\nipset=/oculusdiving.com/gfwlist\nserver=/pearsonschoolsandfecolleges.co.uk/127.0.0.1#5335\nipset=/pearsonschoolsandfecolleges.co.uk/gfwlist\nserver=/beatsdreoutletsale.com/127.0.0.1#5335\nipset=/beatsdreoutletsale.com/gfwlist\nserver=/demoprint.com/127.0.0.1#5335\nipset=/demoprint.com/gfwlist\nserver=/v.gd/127.0.0.1#5335\nipset=/v.gd/gfwlist\nserver=/huluqa.com/127.0.0.1#5335\nipset=/huluqa.com/gfwlist\nserver=/casquesbeatsaudio.com/127.0.0.1#5335\nipset=/casquesbeatsaudio.com/gfwlist\nserver=/onlyleaks.me/127.0.0.1#5335\nipset=/onlyleaks.me/gfwlist\nserver=/sextubeset.com/127.0.0.1#5335\nipset=/sextubeset.com/gfwlist\nserver=/youtube.by/127.0.0.1#5335\nipset=/youtube.by/gfwlist\nserver=/family-simulator.io/127.0.0.1#5335\nipset=/family-simulator.io/gfwlist\nserver=/tktube.com/127.0.0.1#5335\nipset=/tktube.com/gfwlist\nserver=/freesexalbum.com/127.0.0.1#5335\nipset=/freesexalbum.com/gfwlist\nserver=/casquemonsterbeatsbydre2013.com/127.0.0.1#5335\nipset=/casquemonsterbeatsbydre2013.com/gfwlist\nserver=/kinkypeepz.com/127.0.0.1#5335\nipset=/kinkypeepz.com/gfwlist\nserver=/video01.org/127.0.0.1#5335\nipset=/video01.org/gfwlist\nserver=/asme.org/127.0.0.1#5335\nipset=/asme.org/gfwlist\nserver=/yeyuehuachao11.com/127.0.0.1#5335\nipset=/yeyuehuachao11.com/gfwlist\nserver=/shopbydre.com/127.0.0.1#5335\nipset=/shopbydre.com/gfwlist\nserver=/erosberry.com/127.0.0.1#5335\nipset=/erosberry.com/gfwlist\nserver=/intel.nl/127.0.0.1#5335\nipset=/intel.nl/gfwlist\nserver=/bingapistatistics.com/127.0.0.1#5335\nipset=/bingapistatistics.com/gfwlist\nserver=/seaofsolitude.com/127.0.0.1#5335\nipset=/seaofsolitude.com/gfwlist\nserver=/6mature9.com/127.0.0.1#5335\nipset=/6mature9.com/gfwlist\nserver=/besterpornos.com/127.0.0.1#5335\nipset=/besterpornos.com/gfwlist\nserver=/gosq.co/127.0.0.1#5335\nipset=/gosq.co/gfwlist\nserver=/aapl.tw/127.0.0.1#5335\nipset=/aapl.tw/gfwlist\nserver=/truyengihay.net/127.0.0.1#5335\nipset=/truyengihay.net/gfwlist\nserver=/sankei-kurashi.com/127.0.0.1#5335\nipset=/sankei-kurashi.com/gfwlist\nserver=/hpindigopress.com/127.0.0.1#5335\nipset=/hpindigopress.com/gfwlist\nserver=/bmw.fr/127.0.0.1#5335\nipset=/bmw.fr/gfwlist\nserver=/msauth.net/127.0.0.1#5335\nipset=/msauth.net/gfwlist\nserver=/activelearnprimary.co.uk/127.0.0.1#5335\nipset=/activelearnprimary.co.uk/gfwlist\nserver=/dell-brand.com/127.0.0.1#5335\nipset=/dell-brand.com/gfwlist\nserver=/championshipseriesleague.com/127.0.0.1#5335\nipset=/championshipseriesleague.com/gfwlist\nserver=/bmw.com.sv/127.0.0.1#5335\nipset=/bmw.com.sv/gfwlist\nserver=/spankbang.com/127.0.0.1#5335\nipset=/spankbang.com/gfwlist\nserver=/shemaletube.pro/127.0.0.1#5335\nipset=/shemaletube.pro/gfwlist\nserver=/needforspeedundergroundeast.com/127.0.0.1#5335\nipset=/needforspeedundergroundeast.com/gfwlist\nserver=/sslpaypal.org/127.0.0.1#5335\nipset=/sslpaypal.org/gfwlist\nserver=/etnet.com.hk/127.0.0.1#5335\nipset=/etnet.com.hk/gfwlist\nserver=/beatsdrenewcolorful4usale.com/127.0.0.1#5335\nipset=/beatsdrenewcolorful4usale.com/gfwlist\nserver=/facebooe.com/127.0.0.1#5335\nipset=/facebooe.com/gfwlist\nserver=/uxxxporn.com/127.0.0.1#5335\nipset=/uxxxporn.com/gfwlist\nserver=/dkbeatsbydre.com/127.0.0.1#5335\nipset=/dkbeatsbydre.com/gfwlist\nserver=/dldshare.net/127.0.0.1#5335\nipset=/dldshare.net/gfwlist\nserver=/coomer.party/127.0.0.1#5335\nipset=/coomer.party/gfwlist\nserver=/google.sn/127.0.0.1#5335\nipset=/google.sn/gfwlist\nserver=/beats-bydrestore.com/127.0.0.1#5335\nipset=/beats-bydrestore.com/gfwlist\nserver=/cherrypornhd.com/127.0.0.1#5335\nipset=/cherrypornhd.com/gfwlist\nserver=/seemyporn.com/127.0.0.1#5335\nipset=/seemyporn.com/gfwlist\nserver=/blogspot.rs/127.0.0.1#5335\nipset=/blogspot.rs/gfwlist\nserver=/bridgestonecomercial.com.br/127.0.0.1#5335\nipset=/bridgestonecomercial.com.br/gfwlist\nserver=/dualeotruyen1s.com/127.0.0.1#5335\nipset=/dualeotruyen1s.com/gfwlist\nserver=/tail-f.com/127.0.0.1#5335\nipset=/tail-f.com/gfwlist\nserver=/sexxxx.rodeo/127.0.0.1#5335\nipset=/sexxxx.rodeo/gfwlist\nserver=/bromo.com/127.0.0.1#5335\nipset=/bromo.com/gfwlist\nserver=/yogalayout.com/127.0.0.1#5335\nipset=/yogalayout.com/gfwlist\nserver=/hornygamer.com/127.0.0.1#5335\nipset=/hornygamer.com/gfwlist\nserver=/jiuzhouyihuo.com/127.0.0.1#5335\nipset=/jiuzhouyihuo.com/gfwlist\nserver=/parstream.net/127.0.0.1#5335\nipset=/parstream.net/gfwlist\nserver=/xlinkz.to/127.0.0.1#5335\nipset=/xlinkz.to/gfwlist\nserver=/mini-connected.nl/127.0.0.1#5335\nipset=/mini-connected.nl/gfwlist\nserver=/indianpornfast.com/127.0.0.1#5335\nipset=/indianpornfast.com/gfwlist\nserver=/drdrebeatsbillig.com/127.0.0.1#5335\nipset=/drdrebeatsbillig.com/gfwlist\nserver=/youtube.co.kr/127.0.0.1#5335\nipset=/youtube.co.kr/gfwlist\nserver=/vfsco.it/127.0.0.1#5335\nipset=/vfsco.it/gfwlist\nserver=/openweave.io/127.0.0.1#5335\nipset=/openweave.io/gfwlist\nserver=/xapplist.com/127.0.0.1#5335\nipset=/xapplist.com/gfwlist\nserver=/shopee.tw/127.0.0.1#5335\nipset=/shopee.tw/gfwlist\nserver=/beatsbydrestorevip.com/127.0.0.1#5335\nipset=/beatsbydrestorevip.com/gfwlist\nserver=/garena.com/127.0.0.1#5335\nipset=/garena.com/gfwlist\nserver=/bmw.bg/127.0.0.1#5335\nipset=/bmw.bg/gfwlist\nserver=/gearspop.com/127.0.0.1#5335\nipset=/gearspop.com/gfwlist\nserver=/fire-emblem-heroes.com/127.0.0.1#5335\nipset=/fire-emblem-heroes.com/gfwlist\nserver=/exoticuganda.com/127.0.0.1#5335\nipset=/exoticuganda.com/gfwlist\nserver=/europepmc.org/127.0.0.1#5335\nipset=/europepmc.org/gfwlist\nserver=/toon-3d.com/127.0.0.1#5335\nipset=/toon-3d.com/gfwlist\nserver=/miniwidget.ca/127.0.0.1#5335\nipset=/miniwidget.ca/gfwlist\nserver=/alchemysynth.com/127.0.0.1#5335\nipset=/alchemysynth.com/gfwlist\nserver=/mini.am/127.0.0.1#5335\nipset=/mini.am/gfwlist\nserver=/reaxys.com/127.0.0.1#5335\nipset=/reaxys.com/gfwlist\nserver=/mini-connected.at/127.0.0.1#5335\nipset=/mini-connected.at/gfwlist\nserver=/ebaybags.com/127.0.0.1#5335\nipset=/ebaybags.com/gfwlist\nserver=/appleone.space/127.0.0.1#5335\nipset=/appleone.space/gfwlist\nserver=/yamaxun.com/127.0.0.1#5335\nipset=/yamaxun.com/gfwlist\nserver=/briantreepayments.net/127.0.0.1#5335\nipset=/briantreepayments.net/gfwlist\nserver=/developria.com/127.0.0.1#5335\nipset=/developria.com/gfwlist\nserver=/kali.org/127.0.0.1#5335\nipset=/kali.org/gfwlist\nserver=/amazonlaunchpad.com/127.0.0.1#5335\nipset=/amazonlaunchpad.com/gfwlist\nserver=/headphonessupply.com/127.0.0.1#5335\nipset=/headphonessupply.com/gfwlist\nserver=/icloudos.de/127.0.0.1#5335\nipset=/icloudos.de/gfwlist\nserver=/influencersgonewild.com/127.0.0.1#5335\nipset=/influencersgonewild.com/gfwlist\nserver=/one889.app/127.0.0.1#5335\nipset=/one889.app/gfwlist\nserver=/city-hentai.com/127.0.0.1#5335\nipset=/city-hentai.com/gfwlist\nserver=/poweredbyintel.com/127.0.0.1#5335\nipset=/poweredbyintel.com/gfwlist\nserver=/brightcove.imgix.net/127.0.0.1#5335\nipset=/brightcove.imgix.net/gfwlist\nserver=/sb-mobile.jp/127.0.0.1#5335\nipset=/sb-mobile.jp/gfwlist\nserver=/aerogardcn.com/127.0.0.1#5335\nipset=/aerogardcn.com/gfwlist\nserver=/beatsbydrespeakers.com/127.0.0.1#5335\nipset=/beatsbydrespeakers.com/gfwlist\nserver=/serbiporno.net/127.0.0.1#5335\nipset=/serbiporno.net/gfwlist\nserver=/volvotrucks.co.nz/127.0.0.1#5335\nipset=/volvotrucks.co.nz/gfwlist\nserver=/chuporno.com/127.0.0.1#5335\nipset=/chuporno.com/gfwlist\nserver=/gooddaychicago.com/127.0.0.1#5335\nipset=/gooddaychicago.com/gfwlist\nserver=/bestbuysolutions.net/127.0.0.1#5335\nipset=/bestbuysolutions.net/gfwlist\nserver=/valoryirene.com/127.0.0.1#5335\nipset=/valoryirene.com/gfwlist\nserver=/shp.ee/127.0.0.1#5335\nipset=/shp.ee/gfwlist\nserver=/javpush.com/127.0.0.1#5335\nipset=/javpush.com/gfwlist\nserver=/bnetcmsus-a.akamaihd.net/127.0.0.1#5335\nipset=/bnetcmsus-a.akamaihd.net/gfwlist\nserver=/hot-arab-films.com/127.0.0.1#5335\nipset=/hot-arab-films.com/gfwlist\nserver=/clipsbai.com/127.0.0.1#5335\nipset=/clipsbai.com/gfwlist\nserver=/capitaliq.com/127.0.0.1#5335\nipset=/capitaliq.com/gfwlist\nserver=/ciscojabbervideo.net/127.0.0.1#5335\nipset=/ciscojabbervideo.net/gfwlist\nserver=/bokep.net/127.0.0.1#5335\nipset=/bokep.net/gfwlist\nserver=/mini.lu/127.0.0.1#5335\nipset=/mini.lu/gfwlist\nserver=/qmap.pub/127.0.0.1#5335\nipset=/qmap.pub/gfwlist\nserver=/booksc.eu/127.0.0.1#5335\nipset=/booksc.eu/gfwlist\nserver=/nesaporn.mobi/127.0.0.1#5335\nipset=/nesaporn.mobi/gfwlist\nserver=/softbankventuresasia.com/127.0.0.1#5335\nipset=/softbankventuresasia.com/gfwlist\nserver=/pinterest.ca/127.0.0.1#5335\nipset=/pinterest.ca/gfwlist\nserver=/69loli.com/127.0.0.1#5335\nipset=/69loli.com/gfwlist\nserver=/yahoo.co.il/127.0.0.1#5335\nipset=/yahoo.co.il/gfwlist\nserver=/squarecdn.com/127.0.0.1#5335\nipset=/squarecdn.com/gfwlist\nserver=/identrust.net/127.0.0.1#5335\nipset=/identrust.net/gfwlist\nserver=/booth.pm/127.0.0.1#5335\nipset=/booth.pm/gfwlist\nserver=/canon.bg/127.0.0.1#5335\nipset=/canon.bg/gfwlist\nserver=/appleenews.com/127.0.0.1#5335\nipset=/appleenews.com/gfwlist\nserver=/mult34.com/127.0.0.1#5335\nipset=/mult34.com/gfwlist\nserver=/google.ml/127.0.0.1#5335\nipset=/google.ml/gfwlist\nserver=/tomonews.net/127.0.0.1#5335\nipset=/tomonews.net/gfwlist\nserver=/imagepost.com/127.0.0.1#5335\nipset=/imagepost.com/gfwlist\nserver=/custom-iphonecase.com/127.0.0.1#5335\nipset=/custom-iphonecase.com/gfwlist\nserver=/hgsacx.com/127.0.0.1#5335\nipset=/hgsacx.com/gfwlist\nserver=/myfoxdc.com/127.0.0.1#5335\nipset=/myfoxdc.com/gfwlist\nserver=/youtube.com.do/127.0.0.1#5335\nipset=/youtube.com.do/gfwlist\nserver=/foxnetworks.info/127.0.0.1#5335\nipset=/foxnetworks.info/gfwlist\nserver=/phimsexnhanh.club/127.0.0.1#5335\nipset=/phimsexnhanh.club/gfwlist\nserver=/porndudecasting.com/127.0.0.1#5335\nipset=/porndudecasting.com/gfwlist\nserver=/xecce.com/127.0.0.1#5335\nipset=/xecce.com/gfwlist\nserver=/euroipad.com/127.0.0.1#5335\nipset=/euroipad.com/gfwlist\nserver=/touchid.wang/127.0.0.1#5335\nipset=/touchid.wang/gfwlist\nserver=/bitly.is/127.0.0.1#5335\nipset=/bitly.is/gfwlist\nserver=/kyodoimages.jp/127.0.0.1#5335\nipset=/kyodoimages.jp/gfwlist\nserver=/sweetsinner.com/127.0.0.1#5335\nipset=/sweetsinner.com/gfwlist\nserver=/ekhindi.com/127.0.0.1#5335\nipset=/ekhindi.com/gfwlist\nserver=/epoch.cloud/127.0.0.1#5335\nipset=/epoch.cloud/gfwlist\nserver=/friendbook.info/127.0.0.1#5335\nipset=/friendbook.info/gfwlist\nserver=/thisismoney.co.uk/127.0.0.1#5335\nipset=/thisismoney.co.uk/gfwlist\nserver=/google.it/127.0.0.1#5335\nipset=/google.it/gfwlist\nserver=/yahoo.com.pr/127.0.0.1#5335\nipset=/yahoo.com.pr/gfwlist\nserver=/thesafeporn.com/127.0.0.1#5335\nipset=/thesafeporn.com/gfwlist\nserver=/gayasianamateurs.com/127.0.0.1#5335\nipset=/gayasianamateurs.com/gfwlist\nserver=/youtube.kr/127.0.0.1#5335\nipset=/youtube.kr/gfwlist\nserver=/shegg.com/127.0.0.1#5335\nipset=/shegg.com/gfwlist\nserver=/muse.jhu.edu/127.0.0.1#5335\nipset=/muse.jhu.edu/gfwlist\nserver=/luoli.info/127.0.0.1#5335\nipset=/luoli.info/gfwlist\nserver=/directvsavings.com/127.0.0.1#5335\nipset=/directvsavings.com/gfwlist\nserver=/hddgames.cc/127.0.0.1#5335\nipset=/hddgames.cc/gfwlist\nserver=/ebay.com.ph/127.0.0.1#5335\nipset=/ebay.com.ph/gfwlist\nserver=/indianpornvideos2.com/127.0.0.1#5335\nipset=/indianpornvideos2.com/gfwlist\nserver=/cortanaanalytics.com/127.0.0.1#5335\nipset=/cortanaanalytics.com/gfwlist\nserver=/thelegendarystarfy.com/127.0.0.1#5335\nipset=/thelegendarystarfy.com/gfwlist\nserver=/gogole.com/127.0.0.1#5335\nipset=/gogole.com/gfwlist\nserver=/kodi.tv/127.0.0.1#5335\nipset=/kodi.tv/gfwlist\nserver=/xxxtubeset.com/127.0.0.1#5335\nipset=/xxxtubeset.com/gfwlist\nserver=/blackstonespoliceservice.com/127.0.0.1#5335\nipset=/blackstonespoliceservice.com/gfwlist\nserver=/usercontent.dev/127.0.0.1#5335\nipset=/usercontent.dev/gfwlist\nserver=/outbound.io/127.0.0.1#5335\nipset=/outbound.io/gfwlist\nserver=/applefilmaker.com/127.0.0.1#5335\nipset=/applefilmaker.com/gfwlist\nserver=/wofl.tv/127.0.0.1#5335\nipset=/wofl.tv/gfwlist\nserver=/sexmodel.wordpress.com/127.0.0.1#5335\nipset=/sexmodel.wordpress.com/gfwlist\nserver=/instagran.com/127.0.0.1#5335\nipset=/instagran.com/gfwlist\nserver=/yandex.de/127.0.0.1#5335\nipset=/yandex.de/gfwlist\nserver=/beatsdre-monster.com/127.0.0.1#5335\nipset=/beatsdre-monster.com/gfwlist\nserver=/xxx2023.com/127.0.0.1#5335\nipset=/xxx2023.com/gfwlist\nserver=/steamcontent.com/127.0.0.1#5335\nipset=/steamcontent.com/gfwlist\nserver=/certinomis.fr/127.0.0.1#5335\nipset=/certinomis.fr/gfwlist\nserver=/javtrust.com/127.0.0.1#5335\nipset=/javtrust.com/gfwlist\nserver=/topanime.biz/127.0.0.1#5335\nipset=/topanime.biz/gfwlist\nserver=/hentaiseason.com/127.0.0.1#5335\nipset=/hentaiseason.com/gfwlist\nserver=/bestiality.guru/127.0.0.1#5335\nipset=/bestiality.guru/gfwlist\nserver=/cheapmonsterbeatssale.com/127.0.0.1#5335\nipset=/cheapmonsterbeatssale.com/gfwlist\nserver=/paypal-innovationlab.com/127.0.0.1#5335\nipset=/paypal-innovationlab.com/gfwlist\nserver=/shields.io/127.0.0.1#5335\nipset=/shields.io/gfwlist\nserver=/bmwstartupgarage.com/127.0.0.1#5335\nipset=/bmwstartupgarage.com/gfwlist\nserver=/avstar05.me/127.0.0.1#5335\nipset=/avstar05.me/gfwlist\nserver=/zuckerberg.net/127.0.0.1#5335\nipset=/zuckerberg.net/gfwlist\nserver=/jwt.ms/127.0.0.1#5335\nipset=/jwt.ms/gfwlist\nserver=/ebay.be/127.0.0.1#5335\nipset=/ebay.be/gfwlist\nserver=/intel.de/127.0.0.1#5335\nipset=/intel.de/gfwlist\nserver=/pornoitaliano.com/127.0.0.1#5335\nipset=/pornoitaliano.com/gfwlist\nserver=/leaguoflegends.com/127.0.0.1#5335\nipset=/leaguoflegends.com/gfwlist\nserver=/chatsex.xxx/127.0.0.1#5335\nipset=/chatsex.xxx/gfwlist\nserver=/sharmota.com/127.0.0.1#5335\nipset=/sharmota.com/gfwlist\nserver=/vfsco.us/127.0.0.1#5335\nipset=/vfsco.us/gfwlist\nserver=/ieee-vics.org/127.0.0.1#5335\nipset=/ieee-vics.org/gfwlist\nserver=/minilangley.com/127.0.0.1#5335\nipset=/minilangley.com/gfwlist\nserver=/raponlinereview.com/127.0.0.1#5335\nipset=/raponlinereview.com/gfwlist\nserver=/volvobuses.com/127.0.0.1#5335\nipset=/volvobuses.com/gfwlist\nserver=/over18arcade.com/127.0.0.1#5335\nipset=/over18arcade.com/gfwlist\nserver=/fsdn.com/127.0.0.1#5335\nipset=/fsdn.com/gfwlist\nserver=/googledomains.com/127.0.0.1#5335\nipset=/googledomains.com/gfwlist\nserver=/yeswegays.com/127.0.0.1#5335\nipset=/yeswegays.com/gfwlist\nserver=/swisssign-group.li/127.0.0.1#5335\nipset=/swisssign-group.li/gfwlist\nserver=/msdn.com/127.0.0.1#5335\nipset=/msdn.com/gfwlist\nserver=/nbyy.tv/127.0.0.1#5335\nipset=/nbyy.tv/gfwlist\nserver=/simplifycommerce.com/127.0.0.1#5335\nipset=/simplifycommerce.com/gfwlist\nserver=/espn.hb.omtrdc.net/127.0.0.1#5335\nipset=/espn.hb.omtrdc.net/gfwlist\nserver=/hentaitube.online/127.0.0.1#5335\nipset=/hentaitube.online/gfwlist\nserver=/nextstop.com/127.0.0.1#5335\nipset=/nextstop.com/gfwlist\nserver=/niosii.com/127.0.0.1#5335\nipset=/niosii.com/gfwlist\nserver=/adultgamestop.com/127.0.0.1#5335\nipset=/adultgamestop.com/gfwlist\nserver=/apple.ee/127.0.0.1#5335\nipset=/apple.ee/gfwlist\nserver=/live-patreon-marketing.pantheonsite.io/127.0.0.1#5335\nipset=/live-patreon-marketing.pantheonsite.io/gfwlist\nserver=/alphera-finance.in/127.0.0.1#5335\nipset=/alphera-finance.in/gfwlist\nserver=/youtubemobilesupport.com/127.0.0.1#5335\nipset=/youtubemobilesupport.com/gfwlist\nserver=/thepornbet.com/127.0.0.1#5335\nipset=/thepornbet.com/gfwlist\nserver=/galaxymobile.jp/127.0.0.1#5335\nipset=/galaxymobile.jp/gfwlist\nserver=/volvobuses.fi/127.0.0.1#5335\nipset=/volvobuses.fi/gfwlist\nserver=/masaladesi.com/127.0.0.1#5335\nipset=/masaladesi.com/gfwlist\nserver=/redlightcenter.com/127.0.0.1#5335\nipset=/redlightcenter.com/gfwlist\nserver=/disneystreaming.com/127.0.0.1#5335\nipset=/disneystreaming.com/gfwlist\nserver=/xerotica.com/127.0.0.1#5335\nipset=/xerotica.com/gfwlist\nserver=/ikea.ee/127.0.0.1#5335\nipset=/ikea.ee/gfwlist\nserver=/k8s.io/127.0.0.1#5335\nipset=/k8s.io/gfwlist\nserver=/blogblog.com/127.0.0.1#5335\nipset=/blogblog.com/gfwlist\nserver=/ekolojik.org/127.0.0.1#5335\nipset=/ekolojik.org/gfwlist\nserver=/facebgook.com/127.0.0.1#5335\nipset=/facebgook.com/gfwlist\nserver=/beatsshop-uk.com/127.0.0.1#5335\nipset=/beatsshop-uk.com/gfwlist\nserver=/camsvids.tv/127.0.0.1#5335\nipset=/camsvids.tv/gfwlist\nserver=/jetfuelapp.com/127.0.0.1#5335\nipset=/jetfuelapp.com/gfwlist\nserver=/gsccdn.com/127.0.0.1#5335\nipset=/gsccdn.com/gfwlist\nserver=/attdns.com/127.0.0.1#5335\nipset=/attdns.com/gfwlist\nserver=/vmwareemeablog.com/127.0.0.1#5335\nipset=/vmwareemeablog.com/gfwlist\nserver=/bmw-product-highlights.com/127.0.0.1#5335\nipset=/bmw-product-highlights.com/gfwlist\nserver=/vscode.search.windows.net/127.0.0.1#5335\nipset=/vscode.search.windows.net/gfwlist\nserver=/jizzboom.com/127.0.0.1#5335\nipset=/jizzboom.com/gfwlist\nserver=/whatsapp.org/127.0.0.1#5335\nipset=/whatsapp.org/gfwlist\nserver=/netflixdnstest10.com/127.0.0.1#5335\nipset=/netflixdnstest10.com/gfwlist\nserver=/toprealvideos.com/127.0.0.1#5335\nipset=/toprealvideos.com/gfwlist\nserver=/needforspeedredline.com/127.0.0.1#5335\nipset=/needforspeedredline.com/gfwlist\nserver=/bmw.pl/127.0.0.1#5335\nipset=/bmw.pl/gfwlist\nserver=/dvdstudiopro.net/127.0.0.1#5335\nipset=/dvdstudiopro.net/gfwlist\nserver=/qt.io/127.0.0.1#5335\nipset=/qt.io/gfwlist\nserver=/boltdns.net/127.0.0.1#5335\nipset=/boltdns.net/gfwlist\nserver=/mastercard.az/127.0.0.1#5335\nipset=/mastercard.az/gfwlist\nserver=/porndork.com/127.0.0.1#5335\nipset=/porndork.com/gfwlist\nserver=/asahi.com/127.0.0.1#5335\nipset=/asahi.com/gfwlist\nserver=/vimeostatus.com/127.0.0.1#5335\nipset=/vimeostatus.com/gfwlist\nserver=/omg.adult/127.0.0.1#5335\nipset=/omg.adult/gfwlist\nserver=/amateurslovesporn.com/127.0.0.1#5335\nipset=/amateurslovesporn.com/gfwlist\nserver=/googlefinland.com/127.0.0.1#5335\nipset=/googlefinland.com/gfwlist\nserver=/shellcheck.net/127.0.0.1#5335\nipset=/shellcheck.net/gfwlist\nserver=/volvotrucks.co.zm/127.0.0.1#5335\nipset=/volvotrucks.co.zm/gfwlist\nserver=/attalascom.com/127.0.0.1#5335\nipset=/attalascom.com/gfwlist\nserver=/discord.store/127.0.0.1#5335\nipset=/discord.store/gfwlist\nserver=/angulardart.org/127.0.0.1#5335\nipset=/angulardart.org/gfwlist\nserver=/cybertrust.co.jp/127.0.0.1#5335\nipset=/cybertrust.co.jp/gfwlist\nserver=/mini-jordan.com/127.0.0.1#5335\nipset=/mini-jordan.com/gfwlist\nserver=/tandberg.com/127.0.0.1#5335\nipset=/tandberg.com/gfwlist\nserver=/tryrating.com/127.0.0.1#5335\nipset=/tryrating.com/gfwlist\nserver=/hpbestbuy.com/127.0.0.1#5335\nipset=/hpbestbuy.com/gfwlist\nserver=/familyporn.tv/127.0.0.1#5335\nipset=/familyporn.tv/gfwlist\nserver=/axios.com/127.0.0.1#5335\nipset=/axios.com/gfwlist\nserver=/pornodanke.com/127.0.0.1#5335\nipset=/pornodanke.com/gfwlist\nserver=/imacsources.com/127.0.0.1#5335\nipset=/imacsources.com/gfwlist\nserver=/insidefilms.com/127.0.0.1#5335\nipset=/insidefilms.com/gfwlist\nserver=/camwhoreshd.com/127.0.0.1#5335\nipset=/camwhoreshd.com/gfwlist\nserver=/gwiki.net/127.0.0.1#5335\nipset=/gwiki.net/gfwlist\nserver=/epochmediagroup.com/127.0.0.1#5335\nipset=/epochmediagroup.com/gfwlist\nserver=/ebayenterprise.net/127.0.0.1#5335\nipset=/ebayenterprise.net/gfwlist\nserver=/hentaisub.info/127.0.0.1#5335\nipset=/hentaisub.info/gfwlist\nserver=/cheapbeatsbydremall.com/127.0.0.1#5335\nipset=/cheapbeatsbydremall.com/gfwlist\nserver=/muji.com/127.0.0.1#5335\nipset=/muji.com/gfwlist\nserver=/macbookair.com.es/127.0.0.1#5335\nipset=/macbookair.com.es/gfwlist\nserver=/iphone5.com/127.0.0.1#5335\nipset=/iphone5.com/gfwlist\nserver=/rolsociety.org/127.0.0.1#5335\nipset=/rolsociety.org/gfwlist\nserver=/digitalplayground.com/127.0.0.1#5335\nipset=/digitalplayground.com/gfwlist\nserver=/2371tom.com/127.0.0.1#5335\nipset=/2371tom.com/gfwlist\nserver=/google.mv/127.0.0.1#5335\nipset=/google.mv/gfwlist\nserver=/apkpure.com/127.0.0.1#5335\nipset=/apkpure.com/gfwlist\nserver=/fotolja.com/127.0.0.1#5335\nipset=/fotolja.com/gfwlist\nserver=/nintendo-europe-sales.com/127.0.0.1#5335\nipset=/nintendo-europe-sales.com/gfwlist\nserver=/jav-vr.net/127.0.0.1#5335\nipset=/jav-vr.net/gfwlist\nserver=/updatetube.com/127.0.0.1#5335\nipset=/updatetube.com/gfwlist\nserver=/kindleoasis.jp/127.0.0.1#5335\nipset=/kindleoasis.jp/gfwlist\nserver=/durex.es/127.0.0.1#5335\nipset=/durex.es/gfwlist\nserver=/nikeshoesinc.com/127.0.0.1#5335\nipset=/nikeshoesinc.com/gfwlist\nserver=/getdropbox.com/127.0.0.1#5335\nipset=/getdropbox.com/gfwlist\nserver=/bastillepost.com/127.0.0.1#5335\nipset=/bastillepost.com/gfwlist\nserver=/ikea.ch/127.0.0.1#5335\nipset=/ikea.ch/gfwlist\nserver=/ikea.gr/127.0.0.1#5335\nipset=/ikea.gr/gfwlist\nserver=/camster.com/127.0.0.1#5335\nipset=/camster.com/gfwlist\nserver=/trueanal.com/127.0.0.1#5335\nipset=/trueanal.com/gfwlist\nserver=/foxsports.pe/127.0.0.1#5335\nipset=/foxsports.pe/gfwlist\nserver=/milta1980.co.uk/127.0.0.1#5335\nipset=/milta1980.co.uk/gfwlist\nserver=/indiangirlsclub.com/127.0.0.1#5335\nipset=/indiangirlsclub.com/gfwlist\nserver=/justswallows.com/127.0.0.1#5335\nipset=/justswallows.com/gfwlist\nserver=/bmw-motorrad.co/127.0.0.1#5335\nipset=/bmw-motorrad.co/gfwlist\nserver=/google.hu/127.0.0.1#5335\nipset=/google.hu/gfwlist\nserver=/sissy-university.com/127.0.0.1#5335\nipset=/sissy-university.com/gfwlist\nserver=/bmw-connecteddrive.ru/127.0.0.1#5335\nipset=/bmw-connecteddrive.ru/gfwlist\nserver=/hkbnes.net/127.0.0.1#5335\nipset=/hkbnes.net/gfwlist\nserver=/hdouban.com/127.0.0.1#5335\nipset=/hdouban.com/gfwlist\nserver=/dogspics.net/127.0.0.1#5335\nipset=/dogspics.net/gfwlist\nserver=/avpanda.cc/127.0.0.1#5335\nipset=/avpanda.cc/gfwlist\nserver=/oxfordwesternmusic.com/127.0.0.1#5335\nipset=/oxfordwesternmusic.com/gfwlist\nserver=/disney.asia/127.0.0.1#5335\nipset=/disney.asia/gfwlist\nserver=/scholar.google.com.au/127.0.0.1#5335\nipset=/scholar.google.com.au/gfwlist\nserver=/bmw-museum.com/127.0.0.1#5335\nipset=/bmw-museum.com/gfwlist\nserver=/foxgay.com/127.0.0.1#5335\nipset=/foxgay.com/gfwlist\nserver=/gfpics.com/127.0.0.1#5335\nipset=/gfpics.com/gfwlist\nserver=/vmwlabconnect.com/127.0.0.1#5335\nipset=/vmwlabconnect.com/gfwlist\nserver=/indiansexpussy.com/127.0.0.1#5335\nipset=/indiansexpussy.com/gfwlist\nserver=/t21ipau.nikkei.co.jp/127.0.0.1#5335\nipset=/t21ipau.nikkei.co.jp/gfwlist\nserver=/kyodo-d.info/127.0.0.1#5335\nipset=/kyodo-d.info/gfwlist\nserver=/qwant.it/127.0.0.1#5335\nipset=/qwant.it/gfwlist\nserver=/ebay-cz.com/127.0.0.1#5335\nipset=/ebay-cz.com/gfwlist\nserver=/mariadb.org/127.0.0.1#5335\nipset=/mariadb.org/gfwlist\nserver=/mat6tube.com/127.0.0.1#5335\nipset=/mat6tube.com/gfwlist\nserver=/acmvalidationsaws.com/127.0.0.1#5335\nipset=/acmvalidationsaws.com/gfwlist\nserver=/hkbigman.net/127.0.0.1#5335\nipset=/hkbigman.net/gfwlist\nserver=/beatsbydreheadphones-nz.com/127.0.0.1#5335\nipset=/beatsbydreheadphones-nz.com/gfwlist\nserver=/scala-sbt.org/127.0.0.1#5335\nipset=/scala-sbt.org/gfwlist\nserver=/appleiphone.net/127.0.0.1#5335\nipset=/appleiphone.net/gfwlist\nserver=/3animalsextube.com/127.0.0.1#5335\nipset=/3animalsextube.com/gfwlist\nserver=/macintoshsoftware.com/127.0.0.1#5335\nipset=/macintoshsoftware.com/gfwlist\nserver=/onlyhentaistuff.com/127.0.0.1#5335\nipset=/onlyhentaistuff.com/gfwlist\nserver=/sharizelvideos.com/127.0.0.1#5335\nipset=/sharizelvideos.com/gfwlist\nserver=/indianporngirls.com/127.0.0.1#5335\nipset=/indianporngirls.com/gfwlist\nserver=/scholar.google.lt/127.0.0.1#5335\nipset=/scholar.google.lt/gfwlist\nserver=/minicaribbean.com/127.0.0.1#5335\nipset=/minicaribbean.com/gfwlist\nserver=/vfsco.ch/127.0.0.1#5335\nipset=/vfsco.ch/gfwlist\nserver=/javhard.org/127.0.0.1#5335\nipset=/javhard.org/gfwlist\nserver=/adidas.ru/127.0.0.1#5335\nipset=/adidas.ru/gfwlist\nserver=/yourfantasybeginsnow.com/127.0.0.1#5335\nipset=/yourfantasybeginsnow.com/gfwlist\nserver=/milfpornpics.xxx/127.0.0.1#5335\nipset=/milfpornpics.xxx/gfwlist\nserver=/mickey.tv/127.0.0.1#5335\nipset=/mickey.tv/gfwlist\nserver=/bmw-diplomatic-sales.com/127.0.0.1#5335\nipset=/bmw-diplomatic-sales.com/gfwlist\nserver=/appleid.hk/127.0.0.1#5335\nipset=/appleid.hk/gfwlist\nserver=/paypal-photocard.com/127.0.0.1#5335\nipset=/paypal-photocard.com/gfwlist\nserver=/misa-prod.s3.ap-northeast-1.amazonaws.com/127.0.0.1#5335\nipset=/misa-prod.s3.ap-northeast-1.amazonaws.com/gfwlist\nserver=/infowars.com/127.0.0.1#5335\nipset=/infowars.com/gfwlist\nserver=/lyzsxx.com/127.0.0.1#5335\nipset=/lyzsxx.com/gfwlist\nserver=/bsw.jp/127.0.0.1#5335\nipset=/bsw.jp/gfwlist\nserver=/4ertik.live/127.0.0.1#5335\nipset=/4ertik.live/gfwlist\nserver=/gitlab.net/127.0.0.1#5335\nipset=/gitlab.net/gfwlist\nserver=/kissjav.li/127.0.0.1#5335\nipset=/kissjav.li/gfwlist\nserver=/kaob3.xyz/127.0.0.1#5335\nipset=/kaob3.xyz/gfwlist\nserver=/tblop.com/127.0.0.1#5335\nipset=/tblop.com/gfwlist\nserver=/oxfordscholarship.com/127.0.0.1#5335\nipset=/oxfordscholarship.com/gfwlist\nserver=/wellmaturetube.com/127.0.0.1#5335\nipset=/wellmaturetube.com/gfwlist\nserver=/porkahd.co/127.0.0.1#5335\nipset=/porkahd.co/gfwlist\nserver=/strepsils.com.ph/127.0.0.1#5335\nipset=/strepsils.com.ph/gfwlist\nserver=/minneapolisbmw.net/127.0.0.1#5335\nipset=/minneapolisbmw.net/gfwlist\nserver=/the-japan-news.com/127.0.0.1#5335\nipset=/the-japan-news.com/gfwlist\nserver=/pornogramxxx.com/127.0.0.1#5335\nipset=/pornogramxxx.com/gfwlist\nserver=/ibb.co/127.0.0.1#5335\nipset=/ibb.co/gfwlist\nserver=/nintendo.de/127.0.0.1#5335\nipset=/nintendo.de/gfwlist\nserver=/spotifyjobs.com/127.0.0.1#5335\nipset=/spotifyjobs.com/gfwlist\nserver=/canon.kz/127.0.0.1#5335\nipset=/canon.kz/gfwlist\nserver=/theclyster.com/127.0.0.1#5335\nipset=/theclyster.com/gfwlist\nserver=/youtube.ng/127.0.0.1#5335\nipset=/youtube.ng/gfwlist\nserver=/ipns.co/127.0.0.1#5335\nipset=/ipns.co/gfwlist\nserver=/microsoft.rs/127.0.0.1#5335\nipset=/microsoft.rs/gfwlist\nserver=/enemasupplier.com/127.0.0.1#5335\nipset=/enemasupplier.com/gfwlist\nserver=/beatsbydrecustomwireless.com/127.0.0.1#5335\nipset=/beatsbydrecustomwireless.com/gfwlist\nserver=/google.co.ug/127.0.0.1#5335\nipset=/google.co.ug/gfwlist\nserver=/mashaalradio.com/127.0.0.1#5335\nipset=/mashaalradio.com/gfwlist\nserver=/wireless.radio/127.0.0.1#5335\nipset=/wireless.radio/gfwlist\nserver=/vultr.com/127.0.0.1#5335\nipset=/vultr.com/gfwlist\nserver=/nyti.ms/127.0.0.1#5335\nipset=/nyti.ms/gfwlist\nserver=/renchead.com/127.0.0.1#5335\nipset=/renchead.com/gfwlist\nserver=/azureiotsuite.com/127.0.0.1#5335\nipset=/azureiotsuite.com/gfwlist\nserver=/i.jeded.com/127.0.0.1#5335\nipset=/i.jeded.com/gfwlist\nserver=/swingers-homemade-videos.com/127.0.0.1#5335\nipset=/swingers-homemade-videos.com/gfwlist\nserver=/visamiddleeast.com/127.0.0.1#5335\nipset=/visamiddleeast.com/gfwlist\nserver=/banatal3arab.com/127.0.0.1#5335\nipset=/banatal3arab.com/gfwlist\nserver=/proxyadult.org/127.0.0.1#5335\nipset=/proxyadult.org/gfwlist\nserver=/visaluxuryhotelcollection.com.mx/127.0.0.1#5335\nipset=/visaluxuryhotelcollection.com.mx/gfwlist\nserver=/gastrointestinalexam.com/127.0.0.1#5335\nipset=/gastrointestinalexam.com/gfwlist\nserver=/imovie.eu/127.0.0.1#5335\nipset=/imovie.eu/gfwlist\nserver=/wantmywife.com/127.0.0.1#5335\nipset=/wantmywife.com/gfwlist\nserver=/avstar2.com/127.0.0.1#5335\nipset=/avstar2.com/gfwlist\nserver=/dawngatechronicles.com/127.0.0.1#5335\nipset=/dawngatechronicles.com/gfwlist\nserver=/ohsexotube.com/127.0.0.1#5335\nipset=/ohsexotube.com/gfwlist\nserver=/facultyopinions.com/127.0.0.1#5335\nipset=/facultyopinions.com/gfwlist\nserver=/azureedge.net/127.0.0.1#5335\nipset=/azureedge.net/gfwlist\nserver=/faicbooc.com/127.0.0.1#5335\nipset=/faicbooc.com/gfwlist\nserver=/cash.app/127.0.0.1#5335\nipset=/cash.app/gfwlist\nserver=/applewatchedition.com/127.0.0.1#5335\nipset=/applewatchedition.com/gfwlist\nserver=/filme2.xxx/127.0.0.1#5335\nipset=/filme2.xxx/gfwlist\nserver=/dssott.com/127.0.0.1#5335\nipset=/dssott.com/gfwlist\nserver=/duckmovie.com/127.0.0.1#5335\nipset=/duckmovie.com/gfwlist\nserver=/earpod.net/127.0.0.1#5335\nipset=/earpod.net/gfwlist\nserver=/ss7.app/127.0.0.1#5335\nipset=/ss7.app/gfwlist\nserver=/ipfs.anonymize.com/127.0.0.1#5335\nipset=/ipfs.anonymize.com/gfwlist\nserver=/megapornpics.com/127.0.0.1#5335\nipset=/megapornpics.com/gfwlist\nserver=/ipodcleaner.com/127.0.0.1#5335\nipset=/ipodcleaner.com/gfwlist\nserver=/facebof.com/127.0.0.1#5335\nipset=/facebof.com/gfwlist\nserver=/apyarstorybooks.blogspot.com/127.0.0.1#5335\nipset=/apyarstorybooks.blogspot.com/gfwlist\nserver=/activelearnprimary.com.au/127.0.0.1#5335\nipset=/activelearnprimary.com.au/gfwlist\nserver=/deepfreeze.tech/127.0.0.1#5335\nipset=/deepfreeze.tech/gfwlist\nserver=/swingersexorgy.com/127.0.0.1#5335\nipset=/swingersexorgy.com/gfwlist\nserver=/leavinghpinc.com/127.0.0.1#5335\nipset=/leavinghpinc.com/gfwlist\nserver=/foampositeshoes.com/127.0.0.1#5335\nipset=/foampositeshoes.com/gfwlist\nserver=/pornadoo.com/127.0.0.1#5335\nipset=/pornadoo.com/gfwlist\nserver=/ilecture.co.nz/127.0.0.1#5335\nipset=/ilecture.co.nz/gfwlist\nserver=/volvotrucks.pe/127.0.0.1#5335\nipset=/volvotrucks.pe/gfwlist\nserver=/office.com/127.0.0.1#5335\nipset=/office.com/gfwlist\nserver=/pinterestmail.com/127.0.0.1#5335\nipset=/pinterestmail.com/gfwlist\nserver=/immoral.jp/127.0.0.1#5335\nipset=/immoral.jp/gfwlist\nserver=/visa.com.gt/127.0.0.1#5335\nipset=/visa.com.gt/gfwlist\nserver=/bodyandsoul.com.au/127.0.0.1#5335\nipset=/bodyandsoul.com.au/gfwlist\nserver=/veet.no/127.0.0.1#5335\nipset=/veet.no/gfwlist\nserver=/premiumbooty.com/127.0.0.1#5335\nipset=/premiumbooty.com/gfwlist\nserver=/nineteentube.com/127.0.0.1#5335\nipset=/nineteentube.com/gfwlist\nserver=/adidas.at/127.0.0.1#5335\nipset=/adidas.at/gfwlist\nserver=/saleblackfridaydrebeats.com/127.0.0.1#5335\nipset=/saleblackfridaydrebeats.com/gfwlist\nserver=/youtube.mn/127.0.0.1#5335\nipset=/youtube.mn/gfwlist\nserver=/paypal-activate.org/127.0.0.1#5335\nipset=/paypal-activate.org/gfwlist\nserver=/icloud-isupport.com/127.0.0.1#5335\nipset=/icloud-isupport.com/gfwlist\nserver=/south-plus.net/127.0.0.1#5335\nipset=/south-plus.net/gfwlist\nserver=/foxsports.com.pe/127.0.0.1#5335\nipset=/foxsports.com.pe/gfwlist\nserver=/mydirtyhobby.com/127.0.0.1#5335\nipset=/mydirtyhobby.com/gfwlist\nserver=/adultgames18.com/127.0.0.1#5335\nipset=/adultgames18.com/gfwlist\nserver=/internetexplorer.co/127.0.0.1#5335\nipset=/internetexplorer.co/gfwlist\nserver=/ifontcloud.com/127.0.0.1#5335\nipset=/ifontcloud.com/gfwlist\nserver=/strepsils.pt/127.0.0.1#5335\nipset=/strepsils.pt/gfwlist\nserver=/darksidemagazine.com/127.0.0.1#5335\nipset=/darksidemagazine.com/gfwlist\nserver=/crazyshit.com/127.0.0.1#5335\nipset=/crazyshit.com/gfwlist\nserver=/bustymomsvideo.com/127.0.0.1#5335\nipset=/bustymomsvideo.com/gfwlist\nserver=/archiveofourown.com/127.0.0.1#5335\nipset=/archiveofourown.com/gfwlist\nserver=/kidsnikeshoes.com/127.0.0.1#5335\nipset=/kidsnikeshoes.com/gfwlist\nserver=/macports.org/127.0.0.1#5335\nipset=/macports.org/gfwlist\nserver=/wetplace.com/127.0.0.1#5335\nipset=/wetplace.com/gfwlist\nserver=/eromanga-school.com/127.0.0.1#5335\nipset=/eromanga-school.com/gfwlist\nserver=/babesbang.com/127.0.0.1#5335\nipset=/babesbang.com/gfwlist\nserver=/alpherafinancialservices.in/127.0.0.1#5335\nipset=/alpherafinancialservices.in/gfwlist\nserver=/mask.icloud.com/127.0.0.1#5335\nipset=/mask.icloud.com/gfwlist\nserver=/photos18.com/127.0.0.1#5335\nipset=/photos18.com/gfwlist\nserver=/gohentai.net/127.0.0.1#5335\nipset=/gohentai.net/gfwlist\nserver=/venmo.info/127.0.0.1#5335\nipset=/venmo.info/gfwlist\nserver=/mini.in/127.0.0.1#5335\nipset=/mini.in/gfwlist\nserver=/yandex.fr/127.0.0.1#5335\nipset=/yandex.fr/gfwlist\nserver=/dianapost.com/127.0.0.1#5335\nipset=/dianapost.com/gfwlist\nserver=/grss-ieee.org/127.0.0.1#5335\nipset=/grss-ieee.org/gfwlist\nserver=/fandom.zendesk.com/127.0.0.1#5335\nipset=/fandom.zendesk.com/gfwlist\nserver=/escortrankings.uk/127.0.0.1#5335\nipset=/escortrankings.uk/gfwlist\nserver=/ptzwx.com/127.0.0.1#5335\nipset=/ptzwx.com/gfwlist\nserver=/strepsils.si/127.0.0.1#5335\nipset=/strepsils.si/gfwlist\nserver=/uriminzokkiri.com/127.0.0.1#5335\nipset=/uriminzokkiri.com/gfwlist\nserver=/as-hls-uk-live.akamaized.net/127.0.0.1#5335\nipset=/as-hls-uk-live.akamaized.net/gfwlist\nserver=/winudf.com/127.0.0.1#5335\nipset=/winudf.com/gfwlist\nserver=/boylove.live/127.0.0.1#5335\nipset=/boylove.live/gfwlist\nserver=/paypal-center.org/127.0.0.1#5335\nipset=/paypal-center.org/gfwlist\nserver=/discordactivities.com/127.0.0.1#5335\nipset=/discordactivities.com/gfwlist\nserver=/familymart.com.my/127.0.0.1#5335\nipset=/familymart.com.my/gfwlist\nserver=/bmw-motorrad.pt/127.0.0.1#5335\nipset=/bmw-motorrad.pt/gfwlist\nserver=/nikefind.com/127.0.0.1#5335\nipset=/nikefind.com/gfwlist\nserver=/nintendoswitch.net/127.0.0.1#5335\nipset=/nintendoswitch.net/gfwlist\nserver=/nicky.xxx/127.0.0.1#5335\nipset=/nicky.xxx/gfwlist\nserver=/sxarab.top/127.0.0.1#5335\nipset=/sxarab.top/gfwlist\nserver=/airsupportapp.com/127.0.0.1#5335\nipset=/airsupportapp.com/gfwlist\nserver=/tati-log.com/127.0.0.1#5335\nipset=/tati-log.com/gfwlist\nserver=/akatns.net/127.0.0.1#5335\nipset=/akatns.net/gfwlist\nserver=/zhainanjidid.top/127.0.0.1#5335\nipset=/zhainanjidid.top/gfwlist\nserver=/porngo.com/127.0.0.1#5335\nipset=/porngo.com/gfwlist\nserver=/zeenews.com/127.0.0.1#5335\nipset=/zeenews.com/gfwlist\nserver=/facebookcanadianelectionintegrityinitiative.com/127.0.0.1#5335\nipset=/facebookcanadianelectionintegrityinitiative.com/gfwlist\nserver=/casquebeatsfracheter.com/127.0.0.1#5335\nipset=/casquebeatsfracheter.com/gfwlist\nserver=/ibm.eu/127.0.0.1#5335\nipset=/ibm.eu/gfwlist\nserver=/analscreen.com/127.0.0.1#5335\nipset=/analscreen.com/gfwlist\nserver=/tube8.com/127.0.0.1#5335\nipset=/tube8.com/gfwlist\nserver=/airwick.sk/127.0.0.1#5335\nipset=/airwick.sk/gfwlist\nserver=/clco.cc/127.0.0.1#5335\nipset=/clco.cc/gfwlist\nserver=/intel.ba/127.0.0.1#5335\nipset=/intel.ba/gfwlist\nserver=/imgsmail.ru/127.0.0.1#5335\nipset=/imgsmail.ru/gfwlist\nserver=/duckduckgo.com.mx/127.0.0.1#5335\nipset=/duckduckgo.com.mx/gfwlist\nserver=/machogaytube.com/127.0.0.1#5335\nipset=/machogaytube.com/gfwlist\nserver=/bitporno.com/127.0.0.1#5335\nipset=/bitporno.com/gfwlist\nserver=/pearsoncmg.com/127.0.0.1#5335\nipset=/pearsoncmg.com/gfwlist\nserver=/underlords.com/127.0.0.1#5335\nipset=/underlords.com/gfwlist\nserver=/karger.com/127.0.0.1#5335\nipset=/karger.com/gfwlist\nserver=/beatsdre.net/127.0.0.1#5335\nipset=/beatsdre.net/gfwlist\nserver=/aebn.com/127.0.0.1#5335\nipset=/aebn.com/gfwlist\nserver=/revenue-performance-management.com/127.0.0.1#5335\nipset=/revenue-performance-management.com/gfwlist\nserver=/coithienthai.com/127.0.0.1#5335\nipset=/coithienthai.com/gfwlist\nserver=/epochtimeshk.org/127.0.0.1#5335\nipset=/epochtimeshk.org/gfwlist\nserver=/watch-porn.net/127.0.0.1#5335\nipset=/watch-porn.net/gfwlist\nserver=/google.com.ag/127.0.0.1#5335\nipset=/google.com.ag/gfwlist\nserver=/yahoo.com.gt/127.0.0.1#5335\nipset=/yahoo.com.gt/gfwlist\nserver=/mini.com.pl/127.0.0.1#5335\nipset=/mini.com.pl/gfwlist\nserver=/miniso.by/127.0.0.1#5335\nipset=/miniso.by/gfwlist\nserver=/beatsbydres-shop.com/127.0.0.1#5335\nipset=/beatsbydres-shop.com/gfwlist\nserver=/pokemon.com/127.0.0.1#5335\nipset=/pokemon.com/gfwlist\nserver=/nijifeti.com/127.0.0.1#5335\nipset=/nijifeti.com/gfwlist\nserver=/videoindexer.ai/127.0.0.1#5335\nipset=/videoindexer.ai/gfwlist\nserver=/youporner.eu/127.0.0.1#5335\nipset=/youporner.eu/gfwlist\nserver=/wmflabs.org/127.0.0.1#5335\nipset=/wmflabs.org/gfwlist\nserver=/widevine.com/127.0.0.1#5335\nipset=/widevine.com/gfwlist\nserver=/realestate.com.au/127.0.0.1#5335\nipset=/realestate.com.au/gfwlist\nserver=/calgon.tv/127.0.0.1#5335\nipset=/calgon.tv/gfwlist\nserver=/javsex.to/127.0.0.1#5335\nipset=/javsex.to/gfwlist\nserver=/mylf.com/127.0.0.1#5335\nipset=/mylf.com/gfwlist\nserver=/fm4.jp/127.0.0.1#5335\nipset=/fm4.jp/gfwlist\nserver=/ipod.com.tw/127.0.0.1#5335\nipset=/ipod.com.tw/gfwlist\nserver=/zaobao.sg/127.0.0.1#5335\nipset=/zaobao.sg/gfwlist\nserver=/xbox360.eu/127.0.0.1#5335\nipset=/xbox360.eu/gfwlist\nserver=/swisssign-group.com/127.0.0.1#5335\nipset=/swisssign-group.com/gfwlist\nserver=/askubuntu.com/127.0.0.1#5335\nipset=/askubuntu.com/gfwlist\nserver=/nfsc.global/127.0.0.1#5335\nipset=/nfsc.global/gfwlist\nserver=/sociolotron.com/127.0.0.1#5335\nipset=/sociolotron.com/gfwlist\nserver=/myfonts.net/127.0.0.1#5335\nipset=/myfonts.net/gfwlist\nserver=/krux.com/127.0.0.1#5335\nipset=/krux.com/gfwlist\nserver=/github.community/127.0.0.1#5335\nipset=/github.community/gfwlist\nserver=/gputechconf.co.kr/127.0.0.1#5335\nipset=/gputechconf.co.kr/gfwlist\nserver=/morganclaypool.com/127.0.0.1#5335\nipset=/morganclaypool.com/gfwlist\nserver=/xn--6eup7j.net/127.0.0.1#5335\nipset=/xn--6eup7j.net/gfwlist\nserver=/youtube.com.hn/127.0.0.1#5335\nipset=/youtube.com.hn/gfwlist\nserver=/packer.io/127.0.0.1#5335\nipset=/packer.io/gfwlist\nserver=/bethsoft.com/127.0.0.1#5335\nipset=/bethsoft.com/gfwlist\nserver=/epikporn.com/127.0.0.1#5335\nipset=/epikporn.com/gfwlist\nserver=/filmporno.it/127.0.0.1#5335\nipset=/filmporno.it/gfwlist\nserver=/moez-m.com/127.0.0.1#5335\nipset=/moez-m.com/gfwlist\nserver=/microsoftgamestack.com/127.0.0.1#5335\nipset=/microsoftgamestack.com/gfwlist\nserver=/9to5terminal.com/127.0.0.1#5335\nipset=/9to5terminal.com/gfwlist\nserver=/anilos.com/127.0.0.1#5335\nipset=/anilos.com/gfwlist\nserver=/travelex.it/127.0.0.1#5335\nipset=/travelex.it/gfwlist\nserver=/asproexapi.com/127.0.0.1#5335\nipset=/asproexapi.com/gfwlist\nserver=/yahoo.com.lb/127.0.0.1#5335\nipset=/yahoo.com.lb/gfwlist\nserver=/isca-speech.org/127.0.0.1#5335\nipset=/isca-speech.org/gfwlist\nserver=/icloud.fr/127.0.0.1#5335\nipset=/icloud.fr/gfwlist\nserver=/v8project.org/127.0.0.1#5335\nipset=/v8project.org/gfwlist\nserver=/avgigi.com/127.0.0.1#5335\nipset=/avgigi.com/gfwlist\nserver=/pornomineiro.com/127.0.0.1#5335\nipset=/pornomineiro.com/gfwlist\nserver=/veet.us/127.0.0.1#5335\nipset=/veet.us/gfwlist\nserver=/yiqiedoushiganggangkaishi.org/127.0.0.1#5335\nipset=/yiqiedoushiganggangkaishi.org/gfwlist\nserver=/porno800.com/127.0.0.1#5335\nipset=/porno800.com/gfwlist\nserver=/yarnpkg.com/127.0.0.1#5335\nipset=/yarnpkg.com/gfwlist\nserver=/visa.mn/127.0.0.1#5335\nipset=/visa.mn/gfwlist\nserver=/adidas.co.in/127.0.0.1#5335\nipset=/adidas.co.in/gfwlist\nserver=/cc18.tv/127.0.0.1#5335\nipset=/cc18.tv/gfwlist\nserver=/sky.com/127.0.0.1#5335\nipset=/sky.com/gfwlist\nserver=/facebook.org/127.0.0.1#5335\nipset=/facebook.org/gfwlist\nserver=/beatsbydrdrestore.com/127.0.0.1#5335\nipset=/beatsbydrdrestore.com/gfwlist\nserver=/insider-intelligence.com/127.0.0.1#5335\nipset=/insider-intelligence.com/gfwlist\nserver=/gclubs.com/127.0.0.1#5335\nipset=/gclubs.com/gfwlist\nserver=/sustainthesound.com/127.0.0.1#5335\nipset=/sustainthesound.com/gfwlist\nserver=/budatt.com/127.0.0.1#5335\nipset=/budatt.com/gfwlist\nserver=/kilmeadeandfriends.com/127.0.0.1#5335\nipset=/kilmeadeandfriends.com/gfwlist\nserver=/nikenews.com/127.0.0.1#5335\nipset=/nikenews.com/gfwlist\nserver=/bestporncomix.com/127.0.0.1#5335\nipset=/bestporncomix.com/gfwlist\nserver=/onenote.com/127.0.0.1#5335\nipset=/onenote.com/gfwlist\nserver=/javtorrent.me/127.0.0.1#5335\nipset=/javtorrent.me/gfwlist\nserver=/bmwmass.com/127.0.0.1#5335\nipset=/bmwmass.com/gfwlist\nserver=/facebookpokerchips.info/127.0.0.1#5335\nipset=/facebookpokerchips.info/gfwlist\nserver=/researchkit.tv/127.0.0.1#5335\nipset=/researchkit.tv/gfwlist\nserver=/free3dadultgames.com/127.0.0.1#5335\nipset=/free3dadultgames.com/gfwlist\nserver=/facebookstudios.org/127.0.0.1#5335\nipset=/facebookstudios.org/gfwlist\nserver=/zeplin.io/127.0.0.1#5335\nipset=/zeplin.io/gfwlist\nserver=/ourshemales.com/127.0.0.1#5335\nipset=/ourshemales.com/gfwlist\nserver=/beeg.com/127.0.0.1#5335\nipset=/beeg.com/gfwlist\nserver=/macbookair.co.uk/127.0.0.1#5335\nipset=/macbookair.co.uk/gfwlist\nserver=/milfs-now.com/127.0.0.1#5335\nipset=/milfs-now.com/gfwlist\nserver=/dengiamerika.com/127.0.0.1#5335\nipset=/dengiamerika.com/gfwlist\nserver=/sex0098.com/127.0.0.1#5335\nipset=/sex0098.com/gfwlist\nserver=/discordpartygames.com/127.0.0.1#5335\nipset=/discordpartygames.com/gfwlist\nserver=/twitterinc.com/127.0.0.1#5335\nipset=/twitterinc.com/gfwlist\nserver=/miniso.my/127.0.0.1#5335\nipset=/miniso.my/gfwlist\nserver=/pearsonassessment.be/127.0.0.1#5335\nipset=/pearsonassessment.be/gfwlist\nserver=/wujieliulan.com/127.0.0.1#5335\nipset=/wujieliulan.com/gfwlist\nserver=/onsalekey.com/127.0.0.1#5335\nipset=/onsalekey.com/gfwlist\nserver=/issitedownrightnow.com/127.0.0.1#5335\nipset=/issitedownrightnow.com/gfwlist\nserver=/disneysrivieraresort.com/127.0.0.1#5335\nipset=/disneysrivieraresort.com/gfwlist\nserver=/canon.lv/127.0.0.1#5335\nipset=/canon.lv/gfwlist\nserver=/directvmonitoring.com/127.0.0.1#5335\nipset=/directvmonitoring.com/gfwlist\nserver=/strepsils.at/127.0.0.1#5335\nipset=/strepsils.at/gfwlist\nserver=/kenyanporn.blogspot.com/127.0.0.1#5335\nipset=/kenyanporn.blogspot.com/gfwlist\nserver=/amplifyapp.com/127.0.0.1#5335\nipset=/amplifyapp.com/gfwlist\nserver=/lge.co.kr/127.0.0.1#5335\nipset=/lge.co.kr/gfwlist\nserver=/beatsbydrsmonsterinusa.com/127.0.0.1#5335\nipset=/beatsbydrsmonsterinusa.com/gfwlist\nserver=/pornocaserotube.com/127.0.0.1#5335\nipset=/pornocaserotube.com/gfwlist\nserver=/q13.com/127.0.0.1#5335\nipset=/q13.com/gfwlist\nserver=/adult-home-videos.com/127.0.0.1#5335\nipset=/adult-home-videos.com/gfwlist\nserver=/pornofilmlist.com/127.0.0.1#5335\nipset=/pornofilmlist.com/gfwlist\nserver=/steamcommunity.com/127.0.0.1#5335\nipset=/steamcommunity.com/gfwlist\nserver=/onlineporn-vids.com/127.0.0.1#5335\nipset=/onlineporn-vids.com/gfwlist\nserver=/airwick.cl/127.0.0.1#5335\nipset=/airwick.cl/gfwlist\nserver=/ebayads.net/127.0.0.1#5335\nipset=/ebayads.net/gfwlist\nserver=/amazon-jp-recruiting.com/127.0.0.1#5335\nipset=/amazon-jp-recruiting.com/gfwlist\nserver=/worldsex.com/127.0.0.1#5335\nipset=/worldsex.com/gfwlist\nserver=/bbbaihu.vip/127.0.0.1#5335\nipset=/bbbaihu.vip/gfwlist\nserver=/haho.moe/127.0.0.1#5335\nipset=/haho.moe/gfwlist\nserver=/bloomsburydesignlibrary.com/127.0.0.1#5335\nipset=/bloomsburydesignlibrary.com/gfwlist\nserver=/pearson-intl.com/127.0.0.1#5335\nipset=/pearson-intl.com/gfwlist\nserver=/facbook.com/127.0.0.1#5335\nipset=/facbook.com/gfwlist\nserver=/bmw-motorrad.jp/127.0.0.1#5335\nipset=/bmw-motorrad.jp/gfwlist\nserver=/hqdesexo.com/127.0.0.1#5335\nipset=/hqdesexo.com/gfwlist\nserver=/suruga-ya.com/127.0.0.1#5335\nipset=/suruga-ya.com/gfwlist\nserver=/usertrust.com/127.0.0.1#5335\nipset=/usertrust.com/gfwlist\nserver=/rakuten.com.tw/127.0.0.1#5335\nipset=/rakuten.com.tw/gfwlist\nserver=/xxxfile.org/127.0.0.1#5335\nipset=/xxxfile.org/gfwlist\nserver=/hamsterporn.tv/127.0.0.1#5335\nipset=/hamsterporn.tv/gfwlist\nserver=/isgame365.cc/127.0.0.1#5335\nipset=/isgame365.cc/gfwlist\nserver=/googleoptimize.com/127.0.0.1#5335\nipset=/googleoptimize.com/gfwlist\nserver=/garotaporno.com/127.0.0.1#5335\nipset=/garotaporno.com/gfwlist\nserver=/intel.pe/127.0.0.1#5335\nipset=/intel.pe/gfwlist\nserver=/beatsbydreshops.net/127.0.0.1#5335\nipset=/beatsbydreshops.net/gfwlist\nserver=/nikecraft.com/127.0.0.1#5335\nipset=/nikecraft.com/gfwlist\nserver=/boylabs.net/127.0.0.1#5335\nipset=/boylabs.net/gfwlist\nserver=/hpsmartstage.com/127.0.0.1#5335\nipset=/hpsmartstage.com/gfwlist\nserver=/stark-verlag.ch/127.0.0.1#5335\nipset=/stark-verlag.ch/gfwlist\nserver=/visadpsonline.us/127.0.0.1#5335\nipset=/visadpsonline.us/gfwlist\nserver=/menshin-channel.com/127.0.0.1#5335\nipset=/menshin-channel.com/gfwlist\nserver=/sonyprotechnosupport.co.jp/127.0.0.1#5335\nipset=/sonyprotechnosupport.co.jp/gfwlist\nserver=/applepaysupplies.com/127.0.0.1#5335\nipset=/applepaysupplies.com/gfwlist\nserver=/devcon.org/127.0.0.1#5335\nipset=/devcon.org/gfwlist\nserver=/thomsonreuters.co.kr/127.0.0.1#5335\nipset=/thomsonreuters.co.kr/gfwlist\nserver=/apple.fr/127.0.0.1#5335\nipset=/apple.fr/gfwlist\nserver=/macbookpro.com/127.0.0.1#5335\nipset=/macbookpro.com/gfwlist\nserver=/ebayopen.com/127.0.0.1#5335\nipset=/ebayopen.com/gfwlist\nserver=/bmw.de/127.0.0.1#5335\nipset=/bmw.de/gfwlist\nserver=/copro.pw/127.0.0.1#5335\nipset=/copro.pw/gfwlist\nserver=/volvotrucks.al/127.0.0.1#5335\nipset=/volvotrucks.al/gfwlist\nserver=/rule34.xxx/127.0.0.1#5335\nipset=/rule34.xxx/gfwlist\nserver=/facfebook.com/127.0.0.1#5335\nipset=/facfebook.com/gfwlist\nserver=/xnxx2.pro/127.0.0.1#5335\nipset=/xnxx2.pro/gfwlist\nserver=/edisebay.com/127.0.0.1#5335\nipset=/edisebay.com/gfwlist\nserver=/yahoo.as/127.0.0.1#5335\nipset=/yahoo.as/gfwlist\nserver=/bmw.sn/127.0.0.1#5335\nipset=/bmw.sn/gfwlist\nserver=/yahoo.fr/127.0.0.1#5335\nipset=/yahoo.fr/gfwlist\nserver=/bbcmedia.co.uk/127.0.0.1#5335\nipset=/bbcmedia.co.uk/gfwlist\nserver=/paypal-communication.com/127.0.0.1#5335\nipset=/paypal-communication.com/gfwlist\nserver=/rumah123.com/127.0.0.1#5335\nipset=/rumah123.com/gfwlist\nserver=/zoosexfarm.com/127.0.0.1#5335\nipset=/zoosexfarm.com/gfwlist\nserver=/icloude.com/127.0.0.1#5335\nipset=/icloude.com/gfwlist\nserver=/youpornlist.com/127.0.0.1#5335\nipset=/youpornlist.com/gfwlist\nserver=/strikinglycdn.com/127.0.0.1#5335\nipset=/strikinglycdn.com/gfwlist\nserver=/sbitravelcard.com/127.0.0.1#5335\nipset=/sbitravelcard.com/gfwlist\nserver=/ipodnano.com/127.0.0.1#5335\nipset=/ipodnano.com/gfwlist\nserver=/disneybaby.com/127.0.0.1#5335\nipset=/disneybaby.com/gfwlist\nserver=/veet.ca/127.0.0.1#5335\nipset=/veet.ca/gfwlist\nserver=/xboxone.eu/127.0.0.1#5335\nipset=/xboxone.eu/gfwlist\nserver=/pokemon-sunmoon.com/127.0.0.1#5335\nipset=/pokemon-sunmoon.com/gfwlist\nserver=/mdn.mozillademos.org/127.0.0.1#5335\nipset=/mdn.mozillademos.org/gfwlist\nserver=/aliveipc.com/127.0.0.1#5335\nipset=/aliveipc.com/gfwlist\nserver=/homemadefucktube.com/127.0.0.1#5335\nipset=/homemadefucktube.com/gfwlist\nserver=/vanish.si/127.0.0.1#5335\nipset=/vanish.si/gfwlist\nserver=/cherrypimps.com/127.0.0.1#5335\nipset=/cherrypimps.com/gfwlist\nserver=/ikea.com.mx/127.0.0.1#5335\nipset=/ikea.com.mx/gfwlist\nserver=/beatsbydre-outlet.com/127.0.0.1#5335\nipset=/beatsbydre-outlet.com/gfwlist\nserver=/porn4days.cc/127.0.0.1#5335\nipset=/porn4days.cc/gfwlist\nserver=/hentai-for.net/127.0.0.1#5335\nipset=/hentai-for.net/gfwlist\nserver=/behance.net/127.0.0.1#5335\nipset=/behance.net/gfwlist\nserver=/brotli.org/127.0.0.1#5335\nipset=/brotli.org/gfwlist\nserver=/newsamerica.com/127.0.0.1#5335\nipset=/newsamerica.com/gfwlist\nserver=/customizedbeatsdre.com/127.0.0.1#5335\nipset=/customizedbeatsdre.com/gfwlist\nserver=/xwebporn.com/127.0.0.1#5335\nipset=/xwebporn.com/gfwlist\nserver=/medium.systems/127.0.0.1#5335\nipset=/medium.systems/gfwlist\nserver=/ciscolive.com/127.0.0.1#5335\nipset=/ciscolive.com/gfwlist\nserver=/hkej.com/127.0.0.1#5335\nipset=/hkej.com/gfwlist\nserver=/windowsuem.com/127.0.0.1#5335\nipset=/windowsuem.com/gfwlist\nserver=/bonedathome.com/127.0.0.1#5335\nipset=/bonedathome.com/gfwlist\nserver=/mochajs.org/127.0.0.1#5335\nipset=/mochajs.org/gfwlist\nserver=/link.theplatform.com/127.0.0.1#5335\nipset=/link.theplatform.com/gfwlist\nserver=/omniture.com/127.0.0.1#5335\nipset=/omniture.com/gfwlist\nserver=/microsoftnews.org/127.0.0.1#5335\nipset=/microsoftnews.org/gfwlist\nserver=/bmwdealerdirect.com/127.0.0.1#5335\nipset=/bmwdealerdirect.com/gfwlist\nserver=/mach-os.com/127.0.0.1#5335\nipset=/mach-os.com/gfwlist\nserver=/mini.nl/127.0.0.1#5335\nipset=/mini.nl/gfwlist\nserver=/mastercard.com.lb/127.0.0.1#5335\nipset=/mastercard.com.lb/gfwlist\nserver=/limeteensex.com/127.0.0.1#5335\nipset=/limeteensex.com/gfwlist\nserver=/bloombergindustry.com/127.0.0.1#5335\nipset=/bloombergindustry.com/gfwlist\nserver=/nurgay.to/127.0.0.1#5335\nipset=/nurgay.to/gfwlist\nserver=/netflixdnstest4.com/127.0.0.1#5335\nipset=/netflixdnstest4.com/gfwlist\nserver=/canon.com.mt/127.0.0.1#5335\nipset=/canon.com.mt/gfwlist\nserver=/hentaifox.com/127.0.0.1#5335\nipset=/hentaifox.com/gfwlist\nserver=/breasthealthinfo.com/127.0.0.1#5335\nipset=/breasthealthinfo.com/gfwlist\nserver=/thecuckoldporn.com/127.0.0.1#5335\nipset=/thecuckoldporn.com/gfwlist\nserver=/drebeats-solo.com/127.0.0.1#5335\nipset=/drebeats-solo.com/gfwlist\nserver=/visa.is/127.0.0.1#5335\nipset=/visa.is/gfwlist\nserver=/youtubego.co.id/127.0.0.1#5335\nipset=/youtubego.co.id/gfwlist\nserver=/finishwin.be/127.0.0.1#5335\nipset=/finishwin.be/gfwlist\nserver=/cheapbeatsbydrefau.com/127.0.0.1#5335\nipset=/cheapbeatsbydrefau.com/gfwlist\nserver=/b3bos.com/127.0.0.1#5335\nipset=/b3bos.com/gfwlist\nserver=/vdoav.com/127.0.0.1#5335\nipset=/vdoav.com/gfwlist\nserver=/adultartsites.com/127.0.0.1#5335\nipset=/adultartsites.com/gfwlist\nserver=/alphabet.com.pt/127.0.0.1#5335\nipset=/alphabet.com.pt/gfwlist\nserver=/ebayclassifiedsgroup.info/127.0.0.1#5335\nipset=/ebayclassifiedsgroup.info/gfwlist\nserver=/applepay.tv/127.0.0.1#5335\nipset=/applepay.tv/gfwlist\nserver=/arabysexy.mobi/127.0.0.1#5335\nipset=/arabysexy.mobi/gfwlist\nserver=/mastercard.co.ke/127.0.0.1#5335\nipset=/mastercard.co.ke/gfwlist\nserver=/beatsep.net/127.0.0.1#5335\nipset=/beatsep.net/gfwlist\nserver=/beatsbydreol.com/127.0.0.1#5335\nipset=/beatsbydreol.com/gfwlist\nserver=/twifuli.com/127.0.0.1#5335\nipset=/twifuli.com/gfwlist\nserver=/youtube.com.pe/127.0.0.1#5335\nipset=/youtube.com.pe/gfwlist\nserver=/sony.com.vn/127.0.0.1#5335\nipset=/sony.com.vn/gfwlist\nserver=/beats-soaho.com/127.0.0.1#5335\nipset=/beats-soaho.com/gfwlist\nserver=/bitvise.com/127.0.0.1#5335\nipset=/bitvise.com/gfwlist\nserver=/bmw.co.kr/127.0.0.1#5335\nipset=/bmw.co.kr/gfwlist\nserver=/xvideos5.com.br/127.0.0.1#5335\nipset=/xvideos5.com.br/gfwlist\nserver=/nijieronavi.com/127.0.0.1#5335\nipset=/nijieronavi.com/gfwlist\nserver=/adelaidenow.com.au/127.0.0.1#5335\nipset=/adelaidenow.com.au/gfwlist\nserver=/discountedporn.com/127.0.0.1#5335\nipset=/discountedporn.com/gfwlist\nserver=/igniteseurope.com/127.0.0.1#5335\nipset=/igniteseurope.com/gfwlist\nserver=/redporno.cz/127.0.0.1#5335\nipset=/redporno.cz/gfwlist\nserver=/starbucks.com.bn/127.0.0.1#5335\nipset=/starbucks.com.bn/gfwlist\nserver=/xnostars.com/127.0.0.1#5335\nipset=/xnostars.com/gfwlist\nserver=/icloud.is/127.0.0.1#5335\nipset=/icloud.is/gfwlist\nserver=/bbwmilftube.com/127.0.0.1#5335\nipset=/bbwmilftube.com/gfwlist\nserver=/milflove.live/127.0.0.1#5335\nipset=/milflove.live/gfwlist\nserver=/r10s.com/127.0.0.1#5335\nipset=/r10s.com/gfwlist\nserver=/icloud.fi/127.0.0.1#5335\nipset=/icloud.fi/gfwlist\nserver=/facebookdusexe.org/127.0.0.1#5335\nipset=/facebookdusexe.org/gfwlist\nserver=/mobile01.com/127.0.0.1#5335\nipset=/mobile01.com/gfwlist\nserver=/googletagmanager.com/127.0.0.1#5335\nipset=/googletagmanager.com/gfwlist\nserver=/visaicsdirect.com/127.0.0.1#5335\nipset=/visaicsdirect.com/gfwlist\nserver=/ciscotr.com/127.0.0.1#5335\nipset=/ciscotr.com/gfwlist\nserver=/beatsbydressale.com/127.0.0.1#5335\nipset=/beatsbydressale.com/gfwlist\nserver=/sextubish.com/127.0.0.1#5335\nipset=/sextubish.com/gfwlist\nserver=/volvotrucks.be/127.0.0.1#5335\nipset=/volvotrucks.be/gfwlist\nserver=/dechamora.com/127.0.0.1#5335\nipset=/dechamora.com/gfwlist\nserver=/move-free.net/127.0.0.1#5335\nipset=/move-free.net/gfwlist\nserver=/pornteen123.com/127.0.0.1#5335\nipset=/pornteen123.com/gfwlist\nserver=/applewallet.tv/127.0.0.1#5335\nipset=/applewallet.tv/gfwlist\nserver=/sony.com.br/127.0.0.1#5335\nipset=/sony.com.br/gfwlist\nserver=/pornfidelity.com/127.0.0.1#5335\nipset=/pornfidelity.com/gfwlist\nserver=/hyu2.com/127.0.0.1#5335\nipset=/hyu2.com/gfwlist\nserver=/directvmetropolisil.com/127.0.0.1#5335\nipset=/directvmetropolisil.com/gfwlist\nserver=/detentiongirls.com/127.0.0.1#5335\nipset=/detentiongirls.com/gfwlist\nserver=/bbg.gov/127.0.0.1#5335\nipset=/bbg.gov/gfwlist\nserver=/ikea.no/127.0.0.1#5335\nipset=/ikea.no/gfwlist\nserver=/java.com/127.0.0.1#5335\nipset=/java.com/gfwlist\nserver=/javdoe.com/127.0.0.1#5335\nipset=/javdoe.com/gfwlist\nserver=/applereach.com/127.0.0.1#5335\nipset=/applereach.com/gfwlist\nserver=/erotic-photos.net/127.0.0.1#5335\nipset=/erotic-photos.net/gfwlist\nserver=/volvotrucks.es/127.0.0.1#5335\nipset=/volvotrucks.es/gfwlist\nserver=/kodi.wiki/127.0.0.1#5335\nipset=/kodi.wiki/gfwlist\nserver=/oppai-doga.info/127.0.0.1#5335\nipset=/oppai-doga.info/gfwlist\nserver=/nintendo.it/127.0.0.1#5335\nipset=/nintendo.it/gfwlist\nserver=/blogspot.re/127.0.0.1#5335\nipset=/blogspot.re/gfwlist\nserver=/cmpaas.com/127.0.0.1#5335\nipset=/cmpaas.com/gfwlist\nserver=/xvideoz.win/127.0.0.1#5335\nipset=/xvideoz.win/gfwlist\nserver=/beatsbydrecheaper.com/127.0.0.1#5335\nipset=/beatsbydrecheaper.com/gfwlist\nserver=/attwirelessonline.com/127.0.0.1#5335\nipset=/attwirelessonline.com/gfwlist\nserver=/nbc.co/127.0.0.1#5335\nipset=/nbc.co/gfwlist\nserver=/yahoo.co.jp/127.0.0.1#5335\nipset=/yahoo.co.jp/gfwlist\nserver=/applepay.rs/127.0.0.1#5335\nipset=/applepay.rs/gfwlist\nserver=/amazon.red/127.0.0.1#5335\nipset=/amazon.red/gfwlist\nserver=/happymeal.com.au/127.0.0.1#5335\nipset=/happymeal.com.au/gfwlist\nserver=/maturesexual.com/127.0.0.1#5335\nipset=/maturesexual.com/gfwlist\nserver=/intel.la/127.0.0.1#5335\nipset=/intel.la/gfwlist\nserver=/fruitycams.com/127.0.0.1#5335\nipset=/fruitycams.com/gfwlist\nserver=/bridgestonecomercial.com.ar/127.0.0.1#5335\nipset=/bridgestonecomercial.com.ar/gfwlist\nserver=/multipornfor.me/127.0.0.1#5335\nipset=/multipornfor.me/gfwlist\nserver=/wix.com/127.0.0.1#5335\nipset=/wix.com/gfwlist\nserver=/blogspot.com/127.0.0.1#5335\nipset=/blogspot.com/gfwlist\nserver=/sambaporno.com/127.0.0.1#5335\nipset=/sambaporno.com/gfwlist\nserver=/aria.ms/127.0.0.1#5335\nipset=/aria.ms/gfwlist\nserver=/applestore.bg/127.0.0.1#5335\nipset=/applestore.bg/gfwlist\nserver=/awsthinkbox.com/127.0.0.1#5335\nipset=/awsthinkbox.com/gfwlist\nserver=/asahishimbun.sc.omtrdc.net/127.0.0.1#5335\nipset=/asahishimbun.sc.omtrdc.net/gfwlist\nserver=/thisvid.com/127.0.0.1#5335\nipset=/thisvid.com/gfwlist\nserver=/facebooksz.com/127.0.0.1#5335\nipset=/facebooksz.com/gfwlist\nserver=/paypallabs.com/127.0.0.1#5335\nipset=/paypallabs.com/gfwlist\nserver=/eachpay.net/127.0.0.1#5335\nipset=/eachpay.net/gfwlist\nserver=/cheapbeatsbydresale.com/127.0.0.1#5335\nipset=/cheapbeatsbydresale.com/gfwlist\nserver=/paypal-login.org/127.0.0.1#5335\nipset=/paypal-login.org/gfwlist\nserver=/momtarts3d.com/127.0.0.1#5335\nipset=/momtarts3d.com/gfwlist\nserver=/jable.org/127.0.0.1#5335\nipset=/jable.org/gfwlist\nserver=/espressif.com/127.0.0.1#5335\nipset=/espressif.com/gfwlist\nserver=/analcamshow.com/127.0.0.1#5335\nipset=/analcamshow.com/gfwlist\nserver=/adobe-video-partner-finder.com/127.0.0.1#5335\nipset=/adobe-video-partner-finder.com/gfwlist\nserver=/dev-theguardian.com/127.0.0.1#5335\nipset=/dev-theguardian.com/gfwlist\nserver=/dropbox-dns.com/127.0.0.1#5335\nipset=/dropbox-dns.com/gfwlist\nserver=/videosdesexo.com.br/127.0.0.1#5335\nipset=/videosdesexo.com.br/gfwlist\nserver=/85tube.com/127.0.0.1#5335\nipset=/85tube.com/gfwlist\nserver=/ebonyinlove.com/127.0.0.1#5335\nipset=/ebonyinlove.com/gfwlist\nserver=/fox.tv/127.0.0.1#5335\nipset=/fox.tv/gfwlist\nserver=/tristatebmw.com/127.0.0.1#5335\nipset=/tristatebmw.com/gfwlist\nserver=/escobarvip.it/127.0.0.1#5335\nipset=/escobarvip.it/gfwlist\nserver=/apigee.com/127.0.0.1#5335\nipset=/apigee.com/gfwlist\nserver=/bang-movies.com/127.0.0.1#5335\nipset=/bang-movies.com/gfwlist\nserver=/marvelparty.net/127.0.0.1#5335\nipset=/marvelparty.net/gfwlist\nserver=/cloupia.com/127.0.0.1#5335\nipset=/cloupia.com/gfwlist\nserver=/huffingtonpost.com.mx/127.0.0.1#5335\nipset=/huffingtonpost.com.mx/gfwlist\nserver=/bmw-connecteddrive.co.za/127.0.0.1#5335\nipset=/bmw-connecteddrive.co.za/gfwlist\nserver=/shopee.fr/127.0.0.1#5335\nipset=/shopee.fr/gfwlist\nserver=/cython.org/127.0.0.1#5335\nipset=/cython.org/gfwlist\nserver=/bintray.com/127.0.0.1#5335\nipset=/bintray.com/gfwlist\nserver=/imagecurl.com/127.0.0.1#5335\nipset=/imagecurl.com/gfwlist\nserver=/xxxgames.games/127.0.0.1#5335\nipset=/xxxgames.games/gfwlist\nserver=/pornhubselect.com/127.0.0.1#5335\nipset=/pornhubselect.com/gfwlist\nserver=/zoosexnet.com/127.0.0.1#5335\nipset=/zoosexnet.com/gfwlist\nserver=/igetnaughty.com/127.0.0.1#5335\nipset=/igetnaughty.com/gfwlist\nserver=/aporntv.com/127.0.0.1#5335\nipset=/aporntv.com/gfwlist\nserver=/clojure.org/127.0.0.1#5335\nipset=/clojure.org/gfwlist\nserver=/riotgames.com/127.0.0.1#5335\nipset=/riotgames.com/gfwlist\nserver=/python.org/127.0.0.1#5335\nipset=/python.org/gfwlist\nserver=/ikea.co.jp/127.0.0.1#5335\nipset=/ikea.co.jp/gfwlist\nserver=/blogspot.co.id/127.0.0.1#5335\nipset=/blogspot.co.id/gfwlist\nserver=/1to1computing.com.au/127.0.0.1#5335\nipset=/1to1computing.com.au/gfwlist\nserver=/jerkdolls.com/127.0.0.1#5335\nipset=/jerkdolls.com/gfwlist\nserver=/milfmovs.com/127.0.0.1#5335\nipset=/milfmovs.com/gfwlist\nserver=/vanishcentroamerica.com/127.0.0.1#5335\nipset=/vanishcentroamerica.com/gfwlist\nserver=/dansmovies.com/127.0.0.1#5335\nipset=/dansmovies.com/gfwlist\nserver=/epochhk.com/127.0.0.1#5335\nipset=/epochhk.com/gfwlist\nserver=/gotraffic.net/127.0.0.1#5335\nipset=/gotraffic.net/gfwlist\nserver=/1classtube.com/127.0.0.1#5335\nipset=/1classtube.com/gfwlist\nserver=/drebeats-monsterusa.com/127.0.0.1#5335\nipset=/drebeats-monsterusa.com/gfwlist\nserver=/epochtimes.com.ua/127.0.0.1#5335\nipset=/epochtimes.com.ua/gfwlist\nserver=/beatsbydrebeatsby.com/127.0.0.1#5335\nipset=/beatsbydrebeatsby.com/gfwlist\nserver=/billmelater.net/127.0.0.1#5335\nipset=/billmelater.net/gfwlist\nserver=/abeatsbydrdre.com/127.0.0.1#5335\nipset=/abeatsbydrdre.com/gfwlist\nserver=/sex.com/127.0.0.1#5335\nipset=/sex.com/gfwlist\nserver=/wzlthw.com/127.0.0.1#5335\nipset=/wzlthw.com/gfwlist\nserver=/tsundora.com/127.0.0.1#5335\nipset=/tsundora.com/gfwlist\nserver=/drebeatsstudio2013.com/127.0.0.1#5335\nipset=/drebeatsstudio2013.com/gfwlist\nserver=/88kkn.com/127.0.0.1#5335\nipset=/88kkn.com/gfwlist\nserver=/analqts.com/127.0.0.1#5335\nipset=/analqts.com/gfwlist\nserver=/twinktube.sexy/127.0.0.1#5335\nipset=/twinktube.sexy/gfwlist\nserver=/4club.com/127.0.0.1#5335\nipset=/4club.com/gfwlist\nserver=/nikeit.com/127.0.0.1#5335\nipset=/nikeit.com/gfwlist\nserver=/hdpornmax.net/127.0.0.1#5335\nipset=/hdpornmax.net/gfwlist\nserver=/p-events-delivery.akamaized.net/127.0.0.1#5335\nipset=/p-events-delivery.akamaized.net/gfwlist\nserver=/guangming.com.my/127.0.0.1#5335\nipset=/guangming.com.my/gfwlist\nserver=/microsoftnews.cc/127.0.0.1#5335\nipset=/microsoftnews.cc/gfwlist\nserver=/next.com/127.0.0.1#5335\nipset=/next.com/gfwlist\nserver=/nicolepeters.com/127.0.0.1#5335\nipset=/nicolepeters.com/gfwlist\nserver=/quicktime.eu/127.0.0.1#5335\nipset=/quicktime.eu/gfwlist\nserver=/bigcocker.com/127.0.0.1#5335\nipset=/bigcocker.com/gfwlist\nserver=/cherrypanpan.com/127.0.0.1#5335\nipset=/cherrypanpan.com/gfwlist\nserver=/hdxnxx.xxx/127.0.0.1#5335\nipset=/hdxnxx.xxx/gfwlist\nserver=/cheapbeatsla.com/127.0.0.1#5335\nipset=/cheapbeatsla.com/gfwlist\nserver=/nbys1.tv/127.0.0.1#5335\nipset=/nbys1.tv/gfwlist\nserver=/blaoshi.cc/127.0.0.1#5335\nipset=/blaoshi.cc/gfwlist\nserver=/aboutamazon.jp/127.0.0.1#5335\nipset=/aboutamazon.jp/gfwlist\nserver=/bb33.net/127.0.0.1#5335\nipset=/bb33.net/gfwlist\nserver=/xnxx.net/127.0.0.1#5335\nipset=/xnxx.net/gfwlist\nserver=/disney.no/127.0.0.1#5335\nipset=/disney.no/gfwlist\nserver=/sci-hub.se/127.0.0.1#5335\nipset=/sci-hub.se/gfwlist\nserver=/pornobuzz.net/127.0.0.1#5335\nipset=/pornobuzz.net/gfwlist\nserver=/webcamjackers.com/127.0.0.1#5335\nipset=/webcamjackers.com/gfwlist\nserver=/headphones-outlet-online.com/127.0.0.1#5335\nipset=/headphones-outlet-online.com/gfwlist\nserver=/microsoft.is/127.0.0.1#5335\nipset=/microsoft.is/gfwlist\nserver=/starfox.com/127.0.0.1#5335\nipset=/starfox.com/gfwlist\nserver=/tabooporn.tv/127.0.0.1#5335\nipset=/tabooporn.tv/gfwlist\nserver=/adobeoobe.com/127.0.0.1#5335\nipset=/adobeoobe.com/gfwlist\nserver=/adobeku.com/127.0.0.1#5335\nipset=/adobeku.com/gfwlist\nserver=/nakedamateurmilf.com/127.0.0.1#5335\nipset=/nakedamateurmilf.com/gfwlist\nserver=/daindianporn.com/127.0.0.1#5335\nipset=/daindianporn.com/gfwlist\nserver=/limedia.tw/127.0.0.1#5335\nipset=/limedia.tw/gfwlist\nserver=/syhacked.com/127.0.0.1#5335\nipset=/syhacked.com/gfwlist\nserver=/fedoraforum.org/127.0.0.1#5335\nipset=/fedoraforum.org/gfwlist\nserver=/msftnet.org/127.0.0.1#5335\nipset=/msftnet.org/gfwlist\nserver=/facebookenespanol.com/127.0.0.1#5335\nipset=/facebookenespanol.com/gfwlist\nserver=/67maoab.com/127.0.0.1#5335\nipset=/67maoab.com/gfwlist\nserver=/miniso-au.com/127.0.0.1#5335\nipset=/miniso-au.com/gfwlist\nserver=/xxxwow.net/127.0.0.1#5335\nipset=/xxxwow.net/gfwlist\nserver=/donkparty.com/127.0.0.1#5335\nipset=/donkparty.com/gfwlist\nserver=/paypal-excelinvoicing.com/127.0.0.1#5335\nipset=/paypal-excelinvoicing.com/gfwlist\nserver=/fuckmaturepussy.com/127.0.0.1#5335\nipset=/fuckmaturepussy.com/gfwlist\nserver=/freesexgames.games/127.0.0.1#5335\nipset=/freesexgames.games/gfwlist\nserver=/xn--cck4d8b3009a.com/127.0.0.1#5335\nipset=/xn--cck4d8b3009a.com/gfwlist\nserver=/marketingcloud.com/127.0.0.1#5335\nipset=/marketingcloud.com/gfwlist\nserver=/hdfreeporn.net/127.0.0.1#5335\nipset=/hdfreeporn.net/gfwlist\nserver=/volvotruckcenter.dk/127.0.0.1#5335\nipset=/volvotruckcenter.dk/gfwlist\nserver=/gcld-line.com/127.0.0.1#5335\nipset=/gcld-line.com/gfwlist\nserver=/bluekai.com/127.0.0.1#5335\nipset=/bluekai.com/gfwlist\nserver=/videostravestis.xxx/127.0.0.1#5335\nipset=/videostravestis.xxx/gfwlist\nserver=/bayvoice.net/127.0.0.1#5335\nipset=/bayvoice.net/gfwlist\nserver=/needforspeedtherun.com/127.0.0.1#5335\nipset=/needforspeedtherun.com/gfwlist\nserver=/aljazeera.com/127.0.0.1#5335\nipset=/aljazeera.com/gfwlist\nserver=/188channel.com/127.0.0.1#5335\nipset=/188channel.com/gfwlist\nserver=/cpz.to/127.0.0.1#5335\nipset=/cpz.to/gfwlist\nserver=/vod-sub-uk-live.akamaized.net/127.0.0.1#5335\nipset=/vod-sub-uk-live.akamaized.net/gfwlist\nserver=/googleapps.com/127.0.0.1#5335\nipset=/googleapps.com/gfwlist\nserver=/famousnudes.com/127.0.0.1#5335\nipset=/famousnudes.com/gfwlist\nserver=/all3dsexpics.com/127.0.0.1#5335\nipset=/all3dsexpics.com/gfwlist\nserver=/rectovaginalexam.com/127.0.0.1#5335\nipset=/rectovaginalexam.com/gfwlist\nserver=/tiktokv.com/127.0.0.1#5335\nipset=/tiktokv.com/gfwlist\nserver=/harpercollinsspeakersbureau.com/127.0.0.1#5335\nipset=/harpercollinsspeakersbureau.com/gfwlist\nserver=/hentainanime.com/127.0.0.1#5335\nipset=/hentainanime.com/gfwlist\nserver=/dlercloud.com/127.0.0.1#5335\nipset=/dlercloud.com/gfwlist\nserver=/issquareup.com/127.0.0.1#5335\nipset=/issquareup.com/gfwlist\nserver=/smartcommunitiescoalition.com/127.0.0.1#5335\nipset=/smartcommunitiescoalition.com/gfwlist\nserver=/jjdong7.com/127.0.0.1#5335\nipset=/jjdong7.com/gfwlist\nserver=/cheapmonsterbeatsusa.us/127.0.0.1#5335\nipset=/cheapmonsterbeatsusa.us/gfwlist\nserver=/epochtimes.ru/127.0.0.1#5335\nipset=/epochtimes.ru/gfwlist\nserver=/myfistingporn.com/127.0.0.1#5335\nipset=/myfistingporn.com/gfwlist\nserver=/directtvreviews.com/127.0.0.1#5335\nipset=/directtvreviews.com/gfwlist\nserver=/gelbooru.com/127.0.0.1#5335\nipset=/gelbooru.com/gfwlist\nserver=/volvotrucks.ge/127.0.0.1#5335\nipset=/volvotrucks.ge/gfwlist\nserver=/mortein.com.br/127.0.0.1#5335\nipset=/mortein.com.br/gfwlist\nserver=/1watchmygf.com/127.0.0.1#5335\nipset=/1watchmygf.com/gfwlist\nserver=/adwords.com/127.0.0.1#5335\nipset=/adwords.com/gfwlist\nserver=/bmw-motorrad.cl/127.0.0.1#5335\nipset=/bmw-motorrad.cl/gfwlist\nserver=/bentobox.tv/127.0.0.1#5335\nipset=/bentobox.tv/gfwlist\nserver=/qckprn.com/127.0.0.1#5335\nipset=/qckprn.com/gfwlist\nserver=/pornpander.com/127.0.0.1#5335\nipset=/pornpander.com/gfwlist\nserver=/paypal-database.us/127.0.0.1#5335\nipset=/paypal-database.us/gfwlist\nserver=/pornolab.net/127.0.0.1#5335\nipset=/pornolab.net/gfwlist\nserver=/bnbstatic.com/127.0.0.1#5335\nipset=/bnbstatic.com/gfwlist\nserver=/googlecert.net/127.0.0.1#5335\nipset=/googlecert.net/gfwlist\nserver=/foxsportsflorida.com/127.0.0.1#5335\nipset=/foxsportsflorida.com/gfwlist\nserver=/bloomberglp.com/127.0.0.1#5335\nipset=/bloomberglp.com/gfwlist\nserver=/livexxx.me/127.0.0.1#5335\nipset=/livexxx.me/gfwlist\nserver=/bmw-motorrad.fr/127.0.0.1#5335\nipset=/bmw-motorrad.fr/gfwlist\nserver=/intel.it/127.0.0.1#5335\nipset=/intel.it/gfwlist\nserver=/cuckoldingwifey.com/127.0.0.1#5335\nipset=/cuckoldingwifey.com/gfwlist\nserver=/sohcradio.com/127.0.0.1#5335\nipset=/sohcradio.com/gfwlist\nserver=/realclear.com/127.0.0.1#5335\nipset=/realclear.com/gfwlist\nserver=/google.co.uz/127.0.0.1#5335\nipset=/google.co.uz/gfwlist\nserver=/durexukraine.com/127.0.0.1#5335\nipset=/durexukraine.com/gfwlist\nserver=/finishinfo.com.au/127.0.0.1#5335\nipset=/finishinfo.com.au/gfwlist\nserver=/bmw-connecteddrive.com.au/127.0.0.1#5335\nipset=/bmw-connecteddrive.com.au/gfwlist\nserver=/stxmosquito.com/127.0.0.1#5335\nipset=/stxmosquito.com/gfwlist\nserver=/bloombergtax1.com/127.0.0.1#5335\nipset=/bloombergtax1.com/gfwlist\nserver=/bustysammieblack.com/127.0.0.1#5335\nipset=/bustysammieblack.com/gfwlist\nserver=/whoreslag.com/127.0.0.1#5335\nipset=/whoreslag.com/gfwlist\nserver=/www-paypal.us/127.0.0.1#5335\nipset=/www-paypal.us/gfwlist\nserver=/openthread.io/127.0.0.1#5335\nipset=/openthread.io/gfwlist\nserver=/blowjobqueens.net/127.0.0.1#5335\nipset=/blowjobqueens.net/gfwlist\nserver=/foxweatherwatch.com/127.0.0.1#5335\nipset=/foxweatherwatch.com/gfwlist\nserver=/ipadair.tw/127.0.0.1#5335\nipset=/ipadair.tw/gfwlist\nserver=/walmart-content.com/127.0.0.1#5335\nipset=/walmart-content.com/gfwlist\nserver=/sirenxxxstudios.com/127.0.0.1#5335\nipset=/sirenxxxstudios.com/gfwlist\nserver=/attwifi.com/127.0.0.1#5335\nipset=/attwifi.com/gfwlist\nserver=/paypal-communications.com/127.0.0.1#5335\nipset=/paypal-communications.com/gfwlist\nserver=/manoramanews.com/127.0.0.1#5335\nipset=/manoramanews.com/gfwlist\nserver=/realgfporn.com/127.0.0.1#5335\nipset=/realgfporn.com/gfwlist\nserver=/nikesportswear.com/127.0.0.1#5335\nipset=/nikesportswear.com/gfwlist\nserver=/porno365.website/127.0.0.1#5335\nipset=/porno365.website/gfwlist\nserver=/yahoo.com.do/127.0.0.1#5335\nipset=/yahoo.com.do/gfwlist\nserver=/anacams.com/127.0.0.1#5335\nipset=/anacams.com/gfwlist\nserver=/bestbuyrewards.com/127.0.0.1#5335\nipset=/bestbuyrewards.com/gfwlist\nserver=/facebooklivestaging.org/127.0.0.1#5335\nipset=/facebooklivestaging.org/gfwlist\nserver=/backdoorlesbians.com/127.0.0.1#5335\nipset=/backdoorlesbians.com/gfwlist\nserver=/hentaiblue.com/127.0.0.1#5335\nipset=/hentaiblue.com/gfwlist\nserver=/managedpki.com/127.0.0.1#5335\nipset=/managedpki.com/gfwlist\nserver=/beascoremodel.com/127.0.0.1#5335\nipset=/beascoremodel.com/gfwlist\nserver=/alpherafinance.com.hk/127.0.0.1#5335\nipset=/alpherafinance.com.hk/gfwlist\nserver=/mini-oman.com/127.0.0.1#5335\nipset=/mini-oman.com/gfwlist\nserver=/porngogo.supertop-100.com/127.0.0.1#5335\nipset=/porngogo.supertop-100.com/gfwlist\nserver=/nintendo.pt/127.0.0.1#5335\nipset=/nintendo.pt/gfwlist\nserver=/dollarphotosclub.com/127.0.0.1#5335\nipset=/dollarphotosclub.com/gfwlist\nserver=/hot-sex-tube.com/127.0.0.1#5335\nipset=/hot-sex-tube.com/gfwlist\nserver=/szabadeuropa.hu/127.0.0.1#5335\nipset=/szabadeuropa.hu/gfwlist\nserver=/verisign.asia/127.0.0.1#5335\nipset=/verisign.asia/gfwlist\nserver=/footstockings.com/127.0.0.1#5335\nipset=/footstockings.com/gfwlist\nserver=/finishinfo.ru/127.0.0.1#5335\nipset=/finishinfo.ru/gfwlist\nserver=/beatsaudios.net/127.0.0.1#5335\nipset=/beatsaudios.net/gfwlist\nserver=/definebabe.com/127.0.0.1#5335\nipset=/definebabe.com/gfwlist\nserver=/sankeishop.jp/127.0.0.1#5335\nipset=/sankeishop.jp/gfwlist\nserver=/scientificlinux.org/127.0.0.1#5335\nipset=/scientificlinux.org/gfwlist\nserver=/lolshop.co.kr/127.0.0.1#5335\nipset=/lolshop.co.kr/gfwlist\nserver=/researchandcare.org/127.0.0.1#5335\nipset=/researchandcare.org/gfwlist\nserver=/lovebeatsdr.com/127.0.0.1#5335\nipset=/lovebeatsdr.com/gfwlist\nserver=/bmw-motorcycles.vn/127.0.0.1#5335\nipset=/bmw-motorcycles.vn/gfwlist\nserver=/phxbmw.com/127.0.0.1#5335\nipset=/phxbmw.com/gfwlist\nserver=/18push.com/127.0.0.1#5335\nipset=/18push.com/gfwlist\nserver=/hpeurope.com/127.0.0.1#5335\nipset=/hpeurope.com/gfwlist\nserver=/hardcore-sex-filme.com/127.0.0.1#5335\nipset=/hardcore-sex-filme.com/gfwlist\nserver=/bobvoyeur.com/127.0.0.1#5335\nipset=/bobvoyeur.com/gfwlist\nserver=/istripper.com/127.0.0.1#5335\nipset=/istripper.com/gfwlist\nserver=/canon.hr/127.0.0.1#5335\nipset=/canon.hr/gfwlist\nserver=/youngpornonly.com/127.0.0.1#5335\nipset=/youngpornonly.com/gfwlist\nserver=/apple.it/127.0.0.1#5335\nipset=/apple.it/gfwlist\nserver=/volvobuses.ma/127.0.0.1#5335\nipset=/volvobuses.ma/gfwlist\nserver=/nintendo.com.hk/127.0.0.1#5335\nipset=/nintendo.com.hk/gfwlist\nserver=/shopifysvc.com/127.0.0.1#5335\nipset=/shopifysvc.com/gfwlist\nserver=/blackboxgames.com/127.0.0.1#5335\nipset=/blackboxgames.com/gfwlist\nserver=/1pondo.tv/127.0.0.1#5335\nipset=/1pondo.tv/gfwlist\nserver=/xn--mts47c3w9b1qr.net/127.0.0.1#5335\nipset=/xn--mts47c3w9b1qr.net/gfwlist\nserver=/jade-net-home.com/127.0.0.1#5335\nipset=/jade-net-home.com/gfwlist\nserver=/scholar.google.pl/127.0.0.1#5335\nipset=/scholar.google.pl/gfwlist\nserver=/deepfreeze.co.uk/127.0.0.1#5335\nipset=/deepfreeze.co.uk/gfwlist\nserver=/yahoo.co.tz/127.0.0.1#5335\nipset=/yahoo.co.tz/gfwlist\nserver=/teatroporno.com/127.0.0.1#5335\nipset=/teatroporno.com/gfwlist\nserver=/businesswebwise.com/127.0.0.1#5335\nipset=/businesswebwise.com/gfwlist\nserver=/drdreprobeatssale.com/127.0.0.1#5335\nipset=/drdreprobeatssale.com/gfwlist\nserver=/lokinet.org/127.0.0.1#5335\nipset=/lokinet.org/gfwlist\nserver=/book18.org/127.0.0.1#5335\nipset=/book18.org/gfwlist\nserver=/fapforfun.net/127.0.0.1#5335\nipset=/fapforfun.net/gfwlist\nserver=/hot-cartoon.com/127.0.0.1#5335\nipset=/hot-cartoon.com/gfwlist\nserver=/scival.com/127.0.0.1#5335\nipset=/scival.com/gfwlist\nserver=/science.com/127.0.0.1#5335\nipset=/science.com/gfwlist\nserver=/impala-media-production.s3.amazonaws.com/127.0.0.1#5335\nipset=/impala-media-production.s3.amazonaws.com/gfwlist\nserver=/lol-europe.com/127.0.0.1#5335\nipset=/lol-europe.com/gfwlist\nserver=/repe21.com/127.0.0.1#5335\nipset=/repe21.com/gfwlist\nserver=/teacherfucksteens.com/127.0.0.1#5335\nipset=/teacherfucksteens.com/gfwlist\nserver=/bmw.lc/127.0.0.1#5335\nipset=/bmw.lc/gfwlist\nserver=/babesnetwork.com/127.0.0.1#5335\nipset=/babesnetwork.com/gfwlist\nserver=/tube18.sex/127.0.0.1#5335\nipset=/tube18.sex/gfwlist\nserver=/bmw-motorrad-now-or-never.com/127.0.0.1#5335\nipset=/bmw-motorrad-now-or-never.com/gfwlist\nserver=/gab.com/127.0.0.1#5335\nipset=/gab.com/gfwlist\nserver=/pornoorzel.com/127.0.0.1#5335\nipset=/pornoorzel.com/gfwlist\nserver=/sego8.co/127.0.0.1#5335\nipset=/sego8.co/gfwlist\nserver=/yaddal.tv/127.0.0.1#5335\nipset=/yaddal.tv/gfwlist\nserver=/nikeplus.com/127.0.0.1#5335\nipset=/nikeplus.com/gfwlist\nserver=/xn--m1abbbgjah.lol/127.0.0.1#5335\nipset=/xn--m1abbbgjah.lol/gfwlist\nserver=/devopsassessment.net/127.0.0.1#5335\nipset=/devopsassessment.net/gfwlist\nserver=/yahoo.hu/127.0.0.1#5335\nipset=/yahoo.hu/gfwlist\nserver=/berlincompanions.com/127.0.0.1#5335\nipset=/berlincompanions.com/gfwlist\nserver=/intel.vu/127.0.0.1#5335\nipset=/intel.vu/gfwlist\nserver=/bmw-tahiti.com/127.0.0.1#5335\nipset=/bmw-tahiti.com/gfwlist\nserver=/drdreheadphonekey.com/127.0.0.1#5335\nipset=/drdreheadphonekey.com/gfwlist\nserver=/yahoo.com.kw/127.0.0.1#5335\nipset=/yahoo.com.kw/gfwlist\nserver=/ebay.sg/127.0.0.1#5335\nipset=/ebay.sg/gfwlist\nserver=/workstations.tv/127.0.0.1#5335\nipset=/workstations.tv/gfwlist\nserver=/fcaebook.com/127.0.0.1#5335\nipset=/fcaebook.com/gfwlist\nserver=/dicela.com/127.0.0.1#5335\nipset=/dicela.com/gfwlist\nserver=/see.xxx/127.0.0.1#5335\nipset=/see.xxx/gfwlist\nserver=/nytchina.com/127.0.0.1#5335\nipset=/nytchina.com/gfwlist\nserver=/nikefr.com/127.0.0.1#5335\nipset=/nikefr.com/gfwlist\nserver=/pdxbmw.com/127.0.0.1#5335\nipset=/pdxbmw.com/gfwlist\nserver=/mmonsterheadphones.net/127.0.0.1#5335\nipset=/mmonsterheadphones.net/gfwlist\nserver=/tiltbrush.com/127.0.0.1#5335\nipset=/tiltbrush.com/gfwlist\nserver=/scholar.google.co.jp/127.0.0.1#5335\nipset=/scholar.google.co.jp/gfwlist\nserver=/likuoo.video/127.0.0.1#5335\nipset=/likuoo.video/gfwlist\nserver=/ftop.ru/127.0.0.1#5335\nipset=/ftop.ru/gfwlist\nserver=/powerbeats2wireless.com/127.0.0.1#5335\nipset=/powerbeats2wireless.com/gfwlist\nserver=/infolinker.com.tw/127.0.0.1#5335\nipset=/infolinker.com.tw/gfwlist\nserver=/minimarkham.com/127.0.0.1#5335\nipset=/minimarkham.com/gfwlist\nserver=/gittigidiyorsikayet.com/127.0.0.1#5335\nipset=/gittigidiyorsikayet.com/gfwlist\nserver=/apple.sa/127.0.0.1#5335\nipset=/apple.sa/gfwlist\nserver=/heartbreakers.gallery/127.0.0.1#5335\nipset=/heartbreakers.gallery/gfwlist\nserver=/xxx.com/127.0.0.1#5335\nipset=/xxx.com/gfwlist\nserver=/inkedravens.com/127.0.0.1#5335\nipset=/inkedravens.com/gfwlist\nserver=/porndude2.com/127.0.0.1#5335\nipset=/porndude2.com/gfwlist\nserver=/dirctv.com/127.0.0.1#5335\nipset=/dirctv.com/gfwlist\nserver=/cams.com/127.0.0.1#5335\nipset=/cams.com/gfwlist\nserver=/ecgapp.net/127.0.0.1#5335\nipset=/ecgapp.net/gfwlist\nserver=/tastyblacks.com/127.0.0.1#5335\nipset=/tastyblacks.com/gfwlist\nserver=/laowang.vip/127.0.0.1#5335\nipset=/laowang.vip/gfwlist\nserver=/apple.kr/127.0.0.1#5335\nipset=/apple.kr/gfwlist\nserver=/extensionworkshop.com/127.0.0.1#5335\nipset=/extensionworkshop.com/gfwlist\nserver=/teraperk.com/127.0.0.1#5335\nipset=/teraperk.com/gfwlist\nserver=/aljazeera.net/127.0.0.1#5335\nipset=/aljazeera.net/gfwlist\nserver=/allhen.online/127.0.0.1#5335\nipset=/allhen.online/gfwlist\nserver=/airwick.at/127.0.0.1#5335\nipset=/airwick.at/gfwlist\nserver=/csgfnmdb.com/127.0.0.1#5335\nipset=/csgfnmdb.com/gfwlist\nserver=/firewire.eu/127.0.0.1#5335\nipset=/firewire.eu/gfwlist\nserver=/mobileme.dk/127.0.0.1#5335\nipset=/mobileme.dk/gfwlist\nserver=/bmw-qatar.com/127.0.0.1#5335\nipset=/bmw-qatar.com/gfwlist\nserver=/trust-provider.com/127.0.0.1#5335\nipset=/trust-provider.com/gfwlist\nserver=/jav.dog/127.0.0.1#5335\nipset=/jav.dog/gfwlist\nserver=/publicpornvideo.com/127.0.0.1#5335\nipset=/publicpornvideo.com/gfwlist\nserver=/eablackbox.com/127.0.0.1#5335\nipset=/eablackbox.com/gfwlist\nserver=/mypornfox.com/127.0.0.1#5335\nipset=/mypornfox.com/gfwlist\nserver=/desiraesworld.com/127.0.0.1#5335\nipset=/desiraesworld.com/gfwlist\nserver=/appule.com/127.0.0.1#5335\nipset=/appule.com/gfwlist\nserver=/esmatube.com/127.0.0.1#5335\nipset=/esmatube.com/gfwlist\nserver=/bmwgroup-plants.com/127.0.0.1#5335\nipset=/bmwgroup-plants.com/gfwlist\nserver=/ntdtv.org/127.0.0.1#5335\nipset=/ntdtv.org/gfwlist\nserver=/wwwmfacebook.com/127.0.0.1#5335\nipset=/wwwmfacebook.com/gfwlist\nserver=/edu-research.org/127.0.0.1#5335\nipset=/edu-research.org/gfwlist\nserver=/watchjavonline.com/127.0.0.1#5335\nipset=/watchjavonline.com/gfwlist\nserver=/ptapjmp.com/127.0.0.1#5335\nipset=/ptapjmp.com/gfwlist\nserver=/stream-mydirtyhobby.biz/127.0.0.1#5335\nipset=/stream-mydirtyhobby.biz/gfwlist\nserver=/love7.xyz/127.0.0.1#5335\nipset=/love7.xyz/gfwlist\nserver=/bdsmlibrary.com/127.0.0.1#5335\nipset=/bdsmlibrary.com/gfwlist\nserver=/dart.dev/127.0.0.1#5335\nipset=/dart.dev/gfwlist\nserver=/nakedasiansex.com/127.0.0.1#5335\nipset=/nakedasiansex.com/gfwlist\nserver=/branchportal.com/127.0.0.1#5335\nipset=/branchportal.com/gfwlist\nserver=/pornobrasil.org/127.0.0.1#5335\nipset=/pornobrasil.org/gfwlist\nserver=/xvideosbrasil.com/127.0.0.1#5335\nipset=/xvideosbrasil.com/gfwlist\nserver=/sexoquente.blog/127.0.0.1#5335\nipset=/sexoquente.blog/gfwlist\nserver=/fb.watch/127.0.0.1#5335\nipset=/fb.watch/gfwlist\nserver=/mono-project.com/127.0.0.1#5335\nipset=/mono-project.com/gfwlist\nserver=/facebooa.com/127.0.0.1#5335\nipset=/facebooa.com/gfwlist\nserver=/pinterest.com.au/127.0.0.1#5335\nipset=/pinterest.com.au/gfwlist\nserver=/hornybutt.com/127.0.0.1#5335\nipset=/hornybutt.com/gfwlist\nserver=/rokutime.com/127.0.0.1#5335\nipset=/rokutime.com/gfwlist\nserver=/binads.com/127.0.0.1#5335\nipset=/binads.com/gfwlist\nserver=/applewatch.wang/127.0.0.1#5335\nipset=/applewatch.wang/gfwlist\nserver=/rtings.com/127.0.0.1#5335\nipset=/rtings.com/gfwlist\nserver=/compass.is/127.0.0.1#5335\nipset=/compass.is/gfwlist\nserver=/xn--tkry91n.com/127.0.0.1#5335\nipset=/xn--tkry91n.com/gfwlist\nserver=/sextvx.com/127.0.0.1#5335\nipset=/sextvx.com/gfwlist\nserver=/renzhe.cloud/127.0.0.1#5335\nipset=/renzhe.cloud/gfwlist\nserver=/faceid99.net/127.0.0.1#5335\nipset=/faceid99.net/gfwlist\nserver=/amz123.com/127.0.0.1#5335\nipset=/amz123.com/gfwlist\nserver=/icuminside.com/127.0.0.1#5335\nipset=/icuminside.com/gfwlist\nserver=/hypodermic-injection.com/127.0.0.1#5335\nipset=/hypodermic-injection.com/gfwlist\nserver=/beatsbydrdresale.net/127.0.0.1#5335\nipset=/beatsbydrdresale.net/gfwlist\nserver=/homemadepornclip.com/127.0.0.1#5335\nipset=/homemadepornclip.com/gfwlist\nserver=/camwhores.video/127.0.0.1#5335\nipset=/camwhores.video/gfwlist\nserver=/mmaaxx.com/127.0.0.1#5335\nipset=/mmaaxx.com/gfwlist\nserver=/xxxporn.su/127.0.0.1#5335\nipset=/xxxporn.su/gfwlist\nserver=/2013cheapestbeats.com/127.0.0.1#5335\nipset=/2013cheapestbeats.com/gfwlist\nserver=/twitter.jp/127.0.0.1#5335\nipset=/twitter.jp/gfwlist\nserver=/nike-uk.com/127.0.0.1#5335\nipset=/nike-uk.com/gfwlist\nserver=/google.cat/127.0.0.1#5335\nipset=/google.cat/gfwlist\nserver=/dazn-api.com/127.0.0.1#5335\nipset=/dazn-api.com/gfwlist\nserver=/statics-marketingsites-eas-ms-com.akamaized.net/127.0.0.1#5335\nipset=/statics-marketingsites-eas-ms-com.akamaized.net/gfwlist\nserver=/celebritystorysite.com/127.0.0.1#5335\nipset=/celebritystorysite.com/gfwlist\nserver=/fuck55.net/127.0.0.1#5335\nipset=/fuck55.net/gfwlist\nserver=/icevirtuallibrary.com/127.0.0.1#5335\nipset=/icevirtuallibrary.com/gfwlist\nserver=/mastercard.lu/127.0.0.1#5335\nipset=/mastercard.lu/gfwlist\nserver=/fbrpms.com/127.0.0.1#5335\nipset=/fbrpms.com/gfwlist\nserver=/linkedin.at/127.0.0.1#5335\nipset=/linkedin.at/gfwlist\nserver=/gettyimages.hk/127.0.0.1#5335\nipset=/gettyimages.hk/gfwlist\nserver=/fontbook.com/127.0.0.1#5335\nipset=/fontbook.com/gfwlist\nserver=/money-link.com.tw/127.0.0.1#5335\nipset=/money-link.com.tw/gfwlist\nserver=/naked.com/127.0.0.1#5335\nipset=/naked.com/gfwlist\nserver=/fox.com/127.0.0.1#5335\nipset=/fox.com/gfwlist\nserver=/bmw.mq/127.0.0.1#5335\nipset=/bmw.mq/gfwlist\nserver=/best-sex-games.com/127.0.0.1#5335\nipset=/best-sex-games.com/gfwlist\nserver=/blackandstacked.com/127.0.0.1#5335\nipset=/blackandstacked.com/gfwlist\nserver=/ebaymotors.org/127.0.0.1#5335\nipset=/ebaymotors.org/gfwlist\nserver=/dirtydoglinks.com/127.0.0.1#5335\nipset=/dirtydoglinks.com/gfwlist\nserver=/shooshtime.com/127.0.0.1#5335\nipset=/shooshtime.com/gfwlist\nserver=/n3ro.wtf/127.0.0.1#5335\nipset=/n3ro.wtf/gfwlist\nserver=/joyclub.de/127.0.0.1#5335\nipset=/joyclub.de/gfwlist\nserver=/drebeatspill.com/127.0.0.1#5335\nipset=/drebeatspill.com/gfwlist\nserver=/bmw.mn/127.0.0.1#5335\nipset=/bmw.mn/gfwlist\nserver=/ebayshop.com/127.0.0.1#5335\nipset=/ebayshop.com/gfwlist\nserver=/yandex.lt/127.0.0.1#5335\nipset=/yandex.lt/gfwlist\nserver=/estudio360.com.co/127.0.0.1#5335\nipset=/estudio360.com.co/gfwlist\nserver=/stxmosquitoproject.org/127.0.0.1#5335\nipset=/stxmosquitoproject.org/gfwlist\nserver=/hentaiheroes.com/127.0.0.1#5335\nipset=/hentaiheroes.com/gfwlist\nserver=/clickserver.googleads.com/127.0.0.1#5335\nipset=/clickserver.googleads.com/gfwlist\nserver=/ipod.no/127.0.0.1#5335\nipset=/ipod.no/gfwlist\nserver=/tubeenema.com/127.0.0.1#5335\nipset=/tubeenema.com/gfwlist\nserver=/singtaobooks.com/127.0.0.1#5335\nipset=/singtaobooks.com/gfwlist\nserver=/marketexecutive.net/127.0.0.1#5335\nipset=/marketexecutive.net/gfwlist\nserver=/veet.ro/127.0.0.1#5335\nipset=/veet.ro/gfwlist\nserver=/javgg.net/127.0.0.1#5335\nipset=/javgg.net/gfwlist\nserver=/starwars.com/127.0.0.1#5335\nipset=/starwars.com/gfwlist\nserver=/camwhores.tv/127.0.0.1#5335\nipset=/camwhores.tv/gfwlist\nserver=/embs.org/127.0.0.1#5335\nipset=/embs.org/gfwlist\nserver=/openmidas.com/127.0.0.1#5335\nipset=/openmidas.com/gfwlist\nserver=/disney-studio.com/127.0.0.1#5335\nipset=/disney-studio.com/gfwlist\nserver=/fakings.com/127.0.0.1#5335\nipset=/fakings.com/gfwlist\nserver=/bmw.com.uy/127.0.0.1#5335\nipset=/bmw.com.uy/gfwlist\nserver=/freexxxporn.org/127.0.0.1#5335\nipset=/freexxxporn.org/gfwlist\nserver=/xxxhubvideos.com/127.0.0.1#5335\nipset=/xxxhubvideos.com/gfwlist\nserver=/dartsearch.net/127.0.0.1#5335\nipset=/dartsearch.net/gfwlist\nserver=/wheelpop.com/127.0.0.1#5335\nipset=/wheelpop.com/gfwlist\nserver=/softbankci.com/127.0.0.1#5335\nipset=/softbankci.com/gfwlist\nserver=/wikimediacloud.org/127.0.0.1#5335\nipset=/wikimediacloud.org/gfwlist\nserver=/beatssbydredanmark.com/127.0.0.1#5335\nipset=/beatssbydredanmark.com/gfwlist\nserver=/diddykongracing.com/127.0.0.1#5335\nipset=/diddykongracing.com/gfwlist\nserver=/bugzilla.org/127.0.0.1#5335\nipset=/bugzilla.org/gfwlist\nserver=/bgov.com/127.0.0.1#5335\nipset=/bgov.com/gfwlist\nserver=/hpayshop.com/127.0.0.1#5335\nipset=/hpayshop.com/gfwlist\nserver=/termux.org/127.0.0.1#5335\nipset=/termux.org/gfwlist\nserver=/poshtestgallery.com/127.0.0.1#5335\nipset=/poshtestgallery.com/gfwlist\nserver=/airport-gov-cn.com/127.0.0.1#5335\nipset=/airport-gov-cn.com/gfwlist\nserver=/mspairlift.com/127.0.0.1#5335\nipset=/mspairlift.com/gfwlist\nserver=/riotgames.tv/127.0.0.1#5335\nipset=/riotgames.tv/gfwlist\nserver=/ankarazirvesi2018.com/127.0.0.1#5335\nipset=/ankarazirvesi2018.com/gfwlist\nserver=/bmw-motorrad-authorities.com/127.0.0.1#5335\nipset=/bmw-motorrad-authorities.com/gfwlist\nserver=/sony.kz/127.0.0.1#5335\nipset=/sony.kz/gfwlist\nserver=/hdrplusdata.org/127.0.0.1#5335\nipset=/hdrplusdata.org/gfwlist\nserver=/volvo.se/127.0.0.1#5335\nipset=/volvo.se/gfwlist\nserver=/ebayhabit.com/127.0.0.1#5335\nipset=/ebayhabit.com/gfwlist\nserver=/torcidadeouro.com/127.0.0.1#5335\nipset=/torcidadeouro.com/gfwlist\nserver=/facebookhome.info/127.0.0.1#5335\nipset=/facebookhome.info/gfwlist\nserver=/xbox.org/127.0.0.1#5335\nipset=/xbox.org/gfwlist\nserver=/pinterest.engineering/127.0.0.1#5335\nipset=/pinterest.engineering/gfwlist\nserver=/wegamedeveloper.com/127.0.0.1#5335\nipset=/wegamedeveloper.com/gfwlist\nserver=/okx.com/127.0.0.1#5335\nipset=/okx.com/gfwlist\nserver=/wzmyg.com/127.0.0.1#5335\nipset=/wzmyg.com/gfwlist\nserver=/monsterbeats-solo.net/127.0.0.1#5335\nipset=/monsterbeats-solo.net/gfwlist\nserver=/eaaccess.com/127.0.0.1#5335\nipset=/eaaccess.com/gfwlist\nserver=/abclider.com/127.0.0.1#5335\nipset=/abclider.com/gfwlist\nserver=/comodoca2.com/127.0.0.1#5335\nipset=/comodoca2.com/gfwlist\nserver=/sakuralive.com/127.0.0.1#5335\nipset=/sakuralive.com/gfwlist\nserver=/visa.se/127.0.0.1#5335\nipset=/visa.se/gfwlist\nserver=/zootube1.com/127.0.0.1#5335\nipset=/zootube1.com/gfwlist\nserver=/hp-webplatform.com/127.0.0.1#5335\nipset=/hp-webplatform.com/gfwlist\nserver=/rbspeakup.com/127.0.0.1#5335\nipset=/rbspeakup.com/gfwlist\nserver=/fetishpornfilms.com/127.0.0.1#5335\nipset=/fetishpornfilms.com/gfwlist\nserver=/beatfactoryoutlets.com/127.0.0.1#5335\nipset=/beatfactoryoutlets.com/gfwlist\nserver=/battlefield.com/127.0.0.1#5335\nipset=/battlefield.com/gfwlist\nserver=/moveaws.com/127.0.0.1#5335\nipset=/moveaws.com/gfwlist\nserver=/openwrt.org/127.0.0.1#5335\nipset=/openwrt.org/gfwlist\nserver=/supermariogalaxy.com/127.0.0.1#5335\nipset=/supermariogalaxy.com/gfwlist\nserver=/tuta.io/127.0.0.1#5335\nipset=/tuta.io/gfwlist\nserver=/paaypal.com/127.0.0.1#5335\nipset=/paaypal.com/gfwlist\nserver=/naiadsystems.com/127.0.0.1#5335\nipset=/naiadsystems.com/gfwlist\nserver=/hpusertraining.com/127.0.0.1#5335\nipset=/hpusertraining.com/gfwlist\nserver=/yahoo.cl/127.0.0.1#5335\nipset=/yahoo.cl/gfwlist\nserver=/huluusa.com/127.0.0.1#5335\nipset=/huluusa.com/gfwlist\nserver=/ebayimg.com/127.0.0.1#5335\nipset=/ebayimg.com/gfwlist\nserver=/visa.com.tr/127.0.0.1#5335\nipset=/visa.com.tr/gfwlist\nserver=/ok.ru/127.0.0.1#5335\nipset=/ok.ru/gfwlist\nserver=/bmw-motorrad.co.za/127.0.0.1#5335\nipset=/bmw-motorrad.co.za/gfwlist\nserver=/javextreme.net/127.0.0.1#5335\nipset=/javextreme.net/gfwlist\nserver=/nowe.com/127.0.0.1#5335\nipset=/nowe.com/gfwlist\nserver=/yinmh.com/127.0.0.1#5335\nipset=/yinmh.com/gfwlist\nserver=/iporntoo.com/127.0.0.1#5335\nipset=/iporntoo.com/gfwlist\nserver=/appl4e.com/127.0.0.1#5335\nipset=/appl4e.com/gfwlist\nserver=/thisav.org/127.0.0.1#5335\nipset=/thisav.org/gfwlist\nserver=/videosdesexo.br.com/127.0.0.1#5335\nipset=/videosdesexo.br.com/gfwlist\nserver=/nbcuni.com/127.0.0.1#5335\nipset=/nbcuni.com/gfwlist\nserver=/ubisoft.com/127.0.0.1#5335\nipset=/ubisoft.com/gfwlist\nserver=/nudeteenboys.net/127.0.0.1#5335\nipset=/nudeteenboys.net/gfwlist\nserver=/voasomali.com/127.0.0.1#5335\nipset=/voasomali.com/gfwlist\nserver=/medow.ru/127.0.0.1#5335\nipset=/medow.ru/gfwlist\nserver=/beatsbydreonlie2013-nl.com/127.0.0.1#5335\nipset=/beatsbydreonlie2013-nl.com/gfwlist\nserver=/xboxab.com/127.0.0.1#5335\nipset=/xboxab.com/gfwlist\nserver=/povr.com/127.0.0.1#5335\nipset=/povr.com/gfwlist\nserver=/appletaiwan.com/127.0.0.1#5335\nipset=/appletaiwan.com/gfwlist\nserver=/youtube.mx/127.0.0.1#5335\nipset=/youtube.mx/gfwlist\nserver=/wirelessgroup.co.uk/127.0.0.1#5335\nipset=/wirelessgroup.co.uk/gfwlist\nserver=/ya.ru/127.0.0.1#5335\nipset=/ya.ru/gfwlist\nserver=/cheapheadsetshop.com/127.0.0.1#5335\nipset=/cheapheadsetshop.com/gfwlist\nserver=/ltn.com.tw/127.0.0.1#5335\nipset=/ltn.com.tw/gfwlist\nserver=/calgonit.com/127.0.0.1#5335\nipset=/calgonit.com/gfwlist\nserver=/sonypcl.jp/127.0.0.1#5335\nipset=/sonypcl.jp/gfwlist\nserver=/paypalhere.tv/127.0.0.1#5335\nipset=/paypalhere.tv/gfwlist\nserver=/sexmadeathome.com/127.0.0.1#5335\nipset=/sexmadeathome.com/gfwlist\nserver=/bmwconnecteddrive.com/127.0.0.1#5335\nipset=/bmwconnecteddrive.com/gfwlist\nserver=/sexy-beauties.com/127.0.0.1#5335\nipset=/sexy-beauties.com/gfwlist\nserver=/69games.xxx/127.0.0.1#5335\nipset=/69games.xxx/gfwlist\nserver=/canon.cz/127.0.0.1#5335\nipset=/canon.cz/gfwlist\nserver=/dajiyuan.eu/127.0.0.1#5335\nipset=/dajiyuan.eu/gfwlist\nserver=/vod-thumb-uk-live.akamaized.net/127.0.0.1#5335\nipset=/vod-thumb-uk-live.akamaized.net/gfwlist\nserver=/lgecareers.com/127.0.0.1#5335\nipset=/lgecareers.com/gfwlist\nserver=/voacantonese.com/127.0.0.1#5335\nipset=/voacantonese.com/gfwlist\nserver=/boobpedia.com/127.0.0.1#5335\nipset=/boobpedia.com/gfwlist\nserver=/10musume.com/127.0.0.1#5335\nipset=/10musume.com/gfwlist\nserver=/thumbzilla.com/127.0.0.1#5335\nipset=/thumbzilla.com/gfwlist\nserver=/starbucks.com.mx/127.0.0.1#5335\nipset=/starbucks.com.mx/gfwlist\nserver=/smartoneholdings.com/127.0.0.1#5335\nipset=/smartoneholdings.com/gfwlist\nserver=/ikea.co.uk/127.0.0.1#5335\nipset=/ikea.co.uk/gfwlist\nserver=/drebeats-studio.com/127.0.0.1#5335\nipset=/drebeats-studio.com/gfwlist\nserver=/airwick.ca/127.0.0.1#5335\nipset=/airwick.ca/gfwlist\nserver=/whispersystems.org/127.0.0.1#5335\nipset=/whispersystems.org/gfwlist\nserver=/paypal-prepaid.com/127.0.0.1#5335\nipset=/paypal-prepaid.com/gfwlist\nserver=/hentaiporn.com/127.0.0.1#5335\nipset=/hentaiporn.com/gfwlist\nserver=/wwwinstagram.com/127.0.0.1#5335\nipset=/wwwinstagram.com/gfwlist\nserver=/cartoon-sex.tv/127.0.0.1#5335\nipset=/cartoon-sex.tv/gfwlist\nserver=/cheapbeatsbydrdrepro.com/127.0.0.1#5335\nipset=/cheapbeatsbydrdrepro.com/gfwlist\nserver=/shemalespoiledwhore.com/127.0.0.1#5335\nipset=/shemalespoiledwhore.com/gfwlist\nserver=/nike-usa.com/127.0.0.1#5335\nipset=/nike-usa.com/gfwlist\nserver=/hpinstantink.ca/127.0.0.1#5335\nipset=/hpinstantink.ca/gfwlist\nserver=/hshsxkj.com/127.0.0.1#5335\nipset=/hshsxkj.com/gfwlist\nserver=/tvbeventpower.com.hk/127.0.0.1#5335\nipset=/tvbeventpower.com.hk/gfwlist\nserver=/wwwicloud.com/127.0.0.1#5335\nipset=/wwwicloud.com/gfwlist\nserver=/wuyefuli.org/127.0.0.1#5335\nipset=/wuyefuli.org/gfwlist\nserver=/newschristmasshopping.com/127.0.0.1#5335\nipset=/newschristmasshopping.com/gfwlist\nserver=/bloombergtaxtech.com/127.0.0.1#5335\nipset=/bloombergtaxtech.com/gfwlist\nserver=/mymmode.com/127.0.0.1#5335\nipset=/mymmode.com/gfwlist\nserver=/girlfriendvids.net/127.0.0.1#5335\nipset=/girlfriendvids.net/gfwlist\nserver=/fapnado.com/127.0.0.1#5335\nipset=/fapnado.com/gfwlist\nserver=/mypearsonshop.com.mx/127.0.0.1#5335\nipset=/mypearsonshop.com.mx/gfwlist\nserver=/sony.com.bo/127.0.0.1#5335\nipset=/sony.com.bo/gfwlist\nserver=/intelvmwarecybersecurity.com/127.0.0.1#5335\nipset=/intelvmwarecybersecurity.com/gfwlist\nserver=/928.plus/127.0.0.1#5335\nipset=/928.plus/gfwlist\nserver=/xozilla.com/127.0.0.1#5335\nipset=/xozilla.com/gfwlist\nserver=/bitquick.co/127.0.0.1#5335\nipset=/bitquick.co/gfwlist\nserver=/bidong25.com/127.0.0.1#5335\nipset=/bidong25.com/gfwlist\nserver=/macosforge.org/127.0.0.1#5335\nipset=/macosforge.org/gfwlist\nserver=/topescortbabes.com/127.0.0.1#5335\nipset=/topescortbabes.com/gfwlist\nserver=/xxxhdvideo.mobi/127.0.0.1#5335\nipset=/xxxhdvideo.mobi/gfwlist\nserver=/wwwebay.com/127.0.0.1#5335\nipset=/wwwebay.com/gfwlist\nserver=/themilfmovies.com/127.0.0.1#5335\nipset=/themilfmovies.com/gfwlist\nserver=/gizmoxxx.com/127.0.0.1#5335\nipset=/gizmoxxx.com/gfwlist\nserver=/buyaapl.net/127.0.0.1#5335\nipset=/buyaapl.net/gfwlist\nserver=/n15zev3w.shop/127.0.0.1#5335\nipset=/n15zev3w.shop/gfwlist\nserver=/sis001.com/127.0.0.1#5335\nipset=/sis001.com/gfwlist\nserver=/adobedc.net/127.0.0.1#5335\nipset=/adobedc.net/gfwlist\nserver=/minivilledequebec.com/127.0.0.1#5335\nipset=/minivilledequebec.com/gfwlist\nserver=/teachmyass.com/127.0.0.1#5335\nipset=/teachmyass.com/gfwlist\nserver=/favelaporno.com/127.0.0.1#5335\nipset=/favelaporno.com/gfwlist\nserver=/yandex.uz/127.0.0.1#5335\nipset=/yandex.uz/gfwlist\nserver=/47gyosei.jp/127.0.0.1#5335\nipset=/47gyosei.jp/gfwlist\nserver=/ebaymag.com/127.0.0.1#5335\nipset=/ebaymag.com/gfwlist\nserver=/icloudhome.com/127.0.0.1#5335\nipset=/icloudhome.com/gfwlist\nserver=/rtm.tnt-ea.com/127.0.0.1#5335\nipset=/rtm.tnt-ea.com/gfwlist\nserver=/girls2see.ch/127.0.0.1#5335\nipset=/girls2see.ch/gfwlist\nserver=/herokucdn.com/127.0.0.1#5335\nipset=/herokucdn.com/gfwlist\nserver=/hpspeaker.com/127.0.0.1#5335\nipset=/hpspeaker.com/gfwlist\nserver=/jav.gallery/127.0.0.1#5335\nipset=/jav.gallery/gfwlist\nserver=/globalsecurity.org/127.0.0.1#5335\nipset=/globalsecurity.org/gfwlist\nserver=/tubesex.me/127.0.0.1#5335\nipset=/tubesex.me/gfwlist\nserver=/daoc.net/127.0.0.1#5335\nipset=/daoc.net/gfwlist\nserver=/theav.cc/127.0.0.1#5335\nipset=/theav.cc/gfwlist\nserver=/disney-asia.com/127.0.0.1#5335\nipset=/disney-asia.com/gfwlist\nserver=/esposasymaridos.com/127.0.0.1#5335\nipset=/esposasymaridos.com/gfwlist\nserver=/bustykerrymarie.com/127.0.0.1#5335\nipset=/bustykerrymarie.com/gfwlist\nserver=/apple.hn/127.0.0.1#5335\nipset=/apple.hn/gfwlist\nserver=/binance.cloud/127.0.0.1#5335\nipset=/binance.cloud/gfwlist\nserver=/hackerguardian.com/127.0.0.1#5335\nipset=/hackerguardian.com/gfwlist\nserver=/picacomic.xyz/127.0.0.1#5335\nipset=/picacomic.xyz/gfwlist\nserver=/ams02.space/127.0.0.1#5335\nipset=/ams02.space/gfwlist\nserver=/xvideos.blog/127.0.0.1#5335\nipset=/xvideos.blog/gfwlist\nserver=/young-amateur-movies.com/127.0.0.1#5335\nipset=/young-amateur-movies.com/gfwlist\nserver=/cheerwholesale.us/127.0.0.1#5335\nipset=/cheerwholesale.us/gfwlist\nserver=/eamythic.net/127.0.0.1#5335\nipset=/eamythic.net/gfwlist\nserver=/beatsbydrediscount.com/127.0.0.1#5335\nipset=/beatsbydrediscount.com/gfwlist\nserver=/amazingcuckold.com/127.0.0.1#5335\nipset=/amazingcuckold.com/gfwlist\nserver=/webcamgirls.chat/127.0.0.1#5335\nipset=/webcamgirls.chat/gfwlist\nserver=/virtualearth.net/127.0.0.1#5335\nipset=/virtualearth.net/gfwlist\nserver=/home-sex-tapes.com/127.0.0.1#5335\nipset=/home-sex-tapes.com/gfwlist\nserver=/nvidia.com/127.0.0.1#5335\nipset=/nvidia.com/gfwlist\nserver=/modelmediaus.com/127.0.0.1#5335\nipset=/modelmediaus.com/gfwlist\nserver=/facebook-texas-holdem.com/127.0.0.1#5335\nipset=/facebook-texas-holdem.com/gfwlist\nserver=/unstyle.us/127.0.0.1#5335\nipset=/unstyle.us/gfwlist\nserver=/ccav69.info/127.0.0.1#5335\nipset=/ccav69.info/gfwlist\nserver=/paypal-gift.com/127.0.0.1#5335\nipset=/paypal-gift.com/gfwlist\nserver=/muji.eu/127.0.0.1#5335\nipset=/muji.eu/gfwlist\nserver=/xoom-experience.com/127.0.0.1#5335\nipset=/xoom-experience.com/gfwlist\nserver=/binancezh.live/127.0.0.1#5335\nipset=/binancezh.live/gfwlist\nserver=/transpornsites.com/127.0.0.1#5335\nipset=/transpornsites.com/gfwlist\nserver=/playartifact.com/127.0.0.1#5335\nipset=/playartifact.com/gfwlist\nserver=/nomulus.foo/127.0.0.1#5335\nipset=/nomulus.foo/gfwlist\nserver=/lliusno.com/127.0.0.1#5335\nipset=/lliusno.com/gfwlist\nserver=/softbank-telecom.com/127.0.0.1#5335\nipset=/softbank-telecom.com/gfwlist\nserver=/bmw-connecteddrive.no/127.0.0.1#5335\nipset=/bmw-connecteddrive.no/gfwlist\nserver=/geeksquad.ca/127.0.0.1#5335\nipset=/geeksquad.ca/gfwlist\nserver=/nakedmodelsxxx.com/127.0.0.1#5335\nipset=/nakedmodelsxxx.com/gfwlist\nserver=/homemoviestube.com/127.0.0.1#5335\nipset=/homemoviestube.com/gfwlist\nserver=/jmcomic.me/127.0.0.1#5335\nipset=/jmcomic.me/gfwlist\nserver=/yourgynexam.com/127.0.0.1#5335\nipset=/yourgynexam.com/gfwlist\nserver=/dettol.ie/127.0.0.1#5335\nipset=/dettol.ie/gfwlist\nserver=/onefifteen.net/127.0.0.1#5335\nipset=/onefifteen.net/gfwlist\nserver=/hentaigamer.org/127.0.0.1#5335\nipset=/hentaigamer.org/gfwlist\nserver=/static-cisco.com/127.0.0.1#5335\nipset=/static-cisco.com/gfwlist\nserver=/wanokokorosoh.com/127.0.0.1#5335\nipset=/wanokokorosoh.com/gfwlist\nserver=/myappleid.com/127.0.0.1#5335\nipset=/myappleid.com/gfwlist\nserver=/onlyincestporn.com/127.0.0.1#5335\nipset=/onlyincestporn.com/gfwlist\nserver=/ladsp.com/127.0.0.1#5335\nipset=/ladsp.com/gfwlist\nserver=/bmw.co.ao/127.0.0.1#5335\nipset=/bmw.co.ao/gfwlist\nserver=/betterexplained.com/127.0.0.1#5335\nipset=/betterexplained.com/gfwlist\nserver=/appletv.fr/127.0.0.1#5335\nipset=/appletv.fr/gfwlist\nserver=/storyful.com/127.0.0.1#5335\nipset=/storyful.com/gfwlist\nserver=/bmw.es/127.0.0.1#5335\nipset=/bmw.es/gfwlist\nserver=/sub147.com/127.0.0.1#5335\nipset=/sub147.com/gfwlist\nserver=/berkeley.edu/127.0.0.1#5335\nipset=/berkeley.edu/gfwlist\nserver=/miniso.ca/127.0.0.1#5335\nipset=/miniso.ca/gfwlist\nserver=/instaadder.com/127.0.0.1#5335\nipset=/instaadder.com/gfwlist\nserver=/novinhasdozapzap.com/127.0.0.1#5335\nipset=/novinhasdozapzap.com/gfwlist\nserver=/beatspascher-bydre.com/127.0.0.1#5335\nipset=/beatspascher-bydre.com/gfwlist\nserver=/tawny-peaks.com/127.0.0.1#5335\nipset=/tawny-peaks.com/gfwlist\nserver=/codeforaliving.io/127.0.0.1#5335\nipset=/codeforaliving.io/gfwlist\nserver=/bmwauslieferungszentrum.com/127.0.0.1#5335\nipset=/bmwauslieferungszentrum.com/gfwlist\nserver=/nbcnews.com/127.0.0.1#5335\nipset=/nbcnews.com/gfwlist\nserver=/www-cdn.icloud.com.akadns.net/127.0.0.1#5335\nipset=/www-cdn.icloud.com.akadns.net/gfwlist\nserver=/bbc.net.uk/127.0.0.1#5335\nipset=/bbc.net.uk/gfwlist\nserver=/volvotrucks.co.za/127.0.0.1#5335\nipset=/volvotrucks.co.za/gfwlist\nserver=/appleaustralia.net.au/127.0.0.1#5335\nipset=/appleaustralia.net.au/gfwlist\nserver=/jav-1080.com/127.0.0.1#5335\nipset=/jav-1080.com/gfwlist\nserver=/my-magazine.me/127.0.0.1#5335\nipset=/my-magazine.me/gfwlist\nserver=/xlgirls.com/127.0.0.1#5335\nipset=/xlgirls.com/gfwlist\nserver=/cnshopin.com/127.0.0.1#5335\nipset=/cnshopin.com/gfwlist\nserver=/wisecoin.com/127.0.0.1#5335\nipset=/wisecoin.com/gfwlist\nserver=/paypal-corp.com/127.0.0.1#5335\nipset=/paypal-corp.com/gfwlist\nserver=/9to5google.com/127.0.0.1#5335\nipset=/9to5google.com/gfwlist\nserver=/jmcomic.mobi/127.0.0.1#5335\nipset=/jmcomic.mobi/gfwlist\nserver=/supjav.com/127.0.0.1#5335\nipset=/supjav.com/gfwlist\nserver=/fappcelebs.com/127.0.0.1#5335\nipset=/fappcelebs.com/gfwlist\nserver=/porngamesverse.com/127.0.0.1#5335\nipset=/porngamesverse.com/gfwlist\nserver=/fox46.com/127.0.0.1#5335\nipset=/fox46.com/gfwlist\nserver=/hornychat.net/127.0.0.1#5335\nipset=/hornychat.net/gfwlist\nserver=/reddit.com/127.0.0.1#5335\nipset=/reddit.com/gfwlist\nserver=/nikkansports.com/127.0.0.1#5335\nipset=/nikkansports.com/gfwlist\nserver=/asianpornmovies.com/127.0.0.1#5335\nipset=/asianpornmovies.com/gfwlist\nserver=/ieeemce.org/127.0.0.1#5335\nipset=/ieeemce.org/gfwlist\nserver=/258porn.com/127.0.0.1#5335\nipset=/258porn.com/gfwlist\nserver=/anal.media/127.0.0.1#5335\nipset=/anal.media/gfwlist\nserver=/jjgirls.com/127.0.0.1#5335\nipset=/jjgirls.com/gfwlist\nserver=/gopivotal.net/127.0.0.1#5335\nipset=/gopivotal.net/gfwlist\nserver=/pornvideotube.online/127.0.0.1#5335\nipset=/pornvideotube.online/gfwlist\nserver=/openvpn.net/127.0.0.1#5335\nipset=/openvpn.net/gfwlist\nserver=/rosemarydoll.com/127.0.0.1#5335\nipset=/rosemarydoll.com/gfwlist\nserver=/hdhole.com/127.0.0.1#5335\nipset=/hdhole.com/gfwlist\nserver=/youtube.com.hk/127.0.0.1#5335\nipset=/youtube.com.hk/gfwlist\nserver=/cdnpure.com/127.0.0.1#5335\nipset=/cdnpure.com/gfwlist\nserver=/xvideostravestis.xxx/127.0.0.1#5335\nipset=/xvideostravestis.xxx/gfwlist\nserver=/vrporn.com/127.0.0.1#5335\nipset=/vrporn.com/gfwlist\nserver=/ppaypal.com/127.0.0.1#5335\nipset=/ppaypal.com/gfwlist\nserver=/paypal-secure.net/127.0.0.1#5335\nipset=/paypal-secure.net/gfwlist\nserver=/cliphunter.com/127.0.0.1#5335\nipset=/cliphunter.com/gfwlist\nserver=/facebookgames.com/127.0.0.1#5335\nipset=/facebookgames.com/gfwlist\nserver=/pornhost.com/127.0.0.1#5335\nipset=/pornhost.com/gfwlist\nserver=/apl-hamivideo.cdn.hinet.net/127.0.0.1#5335\nipset=/apl-hamivideo.cdn.hinet.net/gfwlist\nserver=/vmwsalesrewards.com/127.0.0.1#5335\nipset=/vmwsalesrewards.com/gfwlist\nserver=/xxx-files.org/127.0.0.1#5335\nipset=/xxx-files.org/gfwlist\nserver=/allhorsesex.com/127.0.0.1#5335\nipset=/allhorsesex.com/gfwlist\nserver=/xscale.com/127.0.0.1#5335\nipset=/xscale.com/gfwlist\nserver=/babesandbitches.net/127.0.0.1#5335\nipset=/babesandbitches.net/gfwlist\nserver=/settv.com.tw/127.0.0.1#5335\nipset=/settv.com.tw/gfwlist\nserver=/nikefoamposites.com/127.0.0.1#5335\nipset=/nikefoamposites.com/gfwlist\nserver=/pentium.com/127.0.0.1#5335\nipset=/pentium.com/gfwlist\nserver=/azurestackvalidation.com/127.0.0.1#5335\nipset=/azurestackvalidation.com/gfwlist\nserver=/bmwperformancecenter.com/127.0.0.1#5335\nipset=/bmwperformancecenter.com/gfwlist\nserver=/ukipad.com/127.0.0.1#5335\nipset=/ukipad.com/gfwlist\nserver=/yandex.st/127.0.0.1#5335\nipset=/yandex.st/gfwlist\nserver=/ebaycoins.com/127.0.0.1#5335\nipset=/ebaycoins.com/gfwlist\nserver=/gosq.com/127.0.0.1#5335\nipset=/gosq.com/gfwlist\nserver=/sexiframe.com/127.0.0.1#5335\nipset=/sexiframe.com/gfwlist\nserver=/citytourgirls.com/127.0.0.1#5335\nipset=/citytourgirls.com/gfwlist\nserver=/pincong.rocks/127.0.0.1#5335\nipset=/pincong.rocks/gfwlist\nserver=/hunk.ws/127.0.0.1#5335\nipset=/hunk.ws/gfwlist\nserver=/blpprofessional.com/127.0.0.1#5335\nipset=/blpprofessional.com/gfwlist\nserver=/tgirlcentral.com/127.0.0.1#5335\nipset=/tgirlcentral.com/gfwlist\nserver=/uhub.com/127.0.0.1#5335\nipset=/uhub.com/gfwlist\nserver=/datasheets360.com/127.0.0.1#5335\nipset=/datasheets360.com/gfwlist\nserver=/airwick.us/127.0.0.1#5335\nipset=/airwick.us/gfwlist\nserver=/hentaihaven.me/127.0.0.1#5335\nipset=/hentaihaven.me/gfwlist\nserver=/shireyishunjian.com/127.0.0.1#5335\nipset=/shireyishunjian.com/gfwlist\nserver=/adidas.cz/127.0.0.1#5335\nipset=/adidas.cz/gfwlist\nserver=/rarbg.is/127.0.0.1#5335\nipset=/rarbg.is/gfwlist\nserver=/businessinsider.com/127.0.0.1#5335\nipset=/businessinsider.com/gfwlist\nserver=/visa.gr/127.0.0.1#5335\nipset=/visa.gr/gfwlist\nserver=/storm.mg/127.0.0.1#5335\nipset=/storm.mg/gfwlist\nserver=/cockyboys.com/127.0.0.1#5335\nipset=/cockyboys.com/gfwlist\nserver=/netflix.com.edgesuite.net/127.0.0.1#5335\nipset=/netflix.com.edgesuite.net/gfwlist\nserver=/monsterbeatsmall.com/127.0.0.1#5335\nipset=/monsterbeatsmall.com/gfwlist\nserver=/18doujin.com/127.0.0.1#5335\nipset=/18doujin.com/gfwlist\nserver=/itunes.us/127.0.0.1#5335\nipset=/itunes.us/gfwlist\nserver=/thetimes.co.uk/127.0.0.1#5335\nipset=/thetimes.co.uk/gfwlist\nserver=/tellapart.com/127.0.0.1#5335\nipset=/tellapart.com/gfwlist\nserver=/smutindia.com/127.0.0.1#5335\nipset=/smutindia.com/gfwlist\nserver=/netpornsex.net/127.0.0.1#5335\nipset=/netpornsex.net/gfwlist\nserver=/qualcommlabs.com/127.0.0.1#5335\nipset=/qualcommlabs.com/gfwlist\nserver=/applepaysupplies.net/127.0.0.1#5335\nipset=/applepaysupplies.net/gfwlist\nserver=/faeboook.com/127.0.0.1#5335\nipset=/faeboook.com/gfwlist\nserver=/ecimg.tw/127.0.0.1#5335\nipset=/ecimg.tw/gfwlist\nserver=/duckduckgo.ke/127.0.0.1#5335\nipset=/duckduckgo.ke/gfwlist\nserver=/gen.lib.rus.ec/127.0.0.1#5335\nipset=/gen.lib.rus.ec/gfwlist\nserver=/nukemanga.com/127.0.0.1#5335\nipset=/nukemanga.com/gfwlist\nserver=/guardianapps.co.uk/127.0.0.1#5335\nipset=/guardianapps.co.uk/gfwlist\nserver=/durex.com.tr/127.0.0.1#5335\nipset=/durex.com.tr/gfwlist\nserver=/earphonescheapest.com/127.0.0.1#5335\nipset=/earphonescheapest.com/gfwlist\nserver=/c-ij.com/127.0.0.1#5335\nipset=/c-ij.com/gfwlist\nserver=/desihoes.com/127.0.0.1#5335\nipset=/desihoes.com/gfwlist\nserver=/exxxtra.net/127.0.0.1#5335\nipset=/exxxtra.net/gfwlist\nserver=/reuters.com/127.0.0.1#5335\nipset=/reuters.com/gfwlist\nserver=/payhulu.com/127.0.0.1#5335\nipset=/payhulu.com/gfwlist\nserver=/veporn.com/127.0.0.1#5335\nipset=/veporn.com/gfwlist\nserver=/homofans.blogspot.com/127.0.0.1#5335\nipset=/homofans.blogspot.com/gfwlist\nserver=/amznl.com/127.0.0.1#5335\nipset=/amznl.com/gfwlist\nserver=/thepornlistdude.com/127.0.0.1#5335\nipset=/thepornlistdude.com/gfwlist\nserver=/incentivetravelgifts.com/127.0.0.1#5335\nipset=/incentivetravelgifts.com/gfwlist\nserver=/volvotrucks.rs/127.0.0.1#5335\nipset=/volvotrucks.rs/gfwlist\nserver=/reuters.tv/127.0.0.1#5335\nipset=/reuters.tv/gfwlist\nserver=/intel.si/127.0.0.1#5335\nipset=/intel.si/gfwlist\nserver=/vfsco.ie/127.0.0.1#5335\nipset=/vfsco.ie/gfwlist\nserver=/ah-me.com/127.0.0.1#5335\nipset=/ah-me.com/gfwlist\nserver=/sonybo.co.jp/127.0.0.1#5335\nipset=/sonybo.co.jp/gfwlist\nserver=/sexwebvideo.com/127.0.0.1#5335\nipset=/sexwebvideo.com/gfwlist\nserver=/businessinsider.fr/127.0.0.1#5335\nipset=/businessinsider.fr/gfwlist\nserver=/digitalassetlinks.org/127.0.0.1#5335\nipset=/digitalassetlinks.org/gfwlist\nserver=/javfor.me/127.0.0.1#5335\nipset=/javfor.me/gfwlist\nserver=/monsterbeatstudio.com/127.0.0.1#5335\nipset=/monsterbeatstudio.com/gfwlist\nserver=/booloo.com/127.0.0.1#5335\nipset=/booloo.com/gfwlist\nserver=/php.net/127.0.0.1#5335\nipset=/php.net/gfwlist\nserver=/snapcraft.io/127.0.0.1#5335\nipset=/snapcraft.io/gfwlist\nserver=/beatsstudiohodetelefoner.com/127.0.0.1#5335\nipset=/beatsstudiohodetelefoner.com/gfwlist\nserver=/redditmail.com/127.0.0.1#5335\nipset=/redditmail.com/gfwlist\nserver=/ikea.om/127.0.0.1#5335\nipset=/ikea.om/gfwlist\nserver=/canon.ee/127.0.0.1#5335\nipset=/canon.ee/gfwlist\nserver=/marketolive.com/127.0.0.1#5335\nipset=/marketolive.com/gfwlist\nserver=/4porn4.com/127.0.0.1#5335\nipset=/4porn4.com/gfwlist\nserver=/reconinstruments.com/127.0.0.1#5335\nipset=/reconinstruments.com/gfwlist\nserver=/scholar.google.com.ly/127.0.0.1#5335\nipset=/scholar.google.com.ly/gfwlist\nserver=/asianporn.sexy/127.0.0.1#5335\nipset=/asianporn.sexy/gfwlist\nserver=/emagic.de/127.0.0.1#5335\nipset=/emagic.de/gfwlist\nserver=/qkjuyet.com/127.0.0.1#5335\nipset=/qkjuyet.com/gfwlist\nserver=/xxxpornotuber.com/127.0.0.1#5335\nipset=/xxxpornotuber.com/gfwlist\nserver=/ipple.com/127.0.0.1#5335\nipset=/ipple.com/gfwlist\nserver=/jkbeats.com/127.0.0.1#5335\nipset=/jkbeats.com/gfwlist\nserver=/topnudemalecelebs.com/127.0.0.1#5335\nipset=/topnudemalecelebs.com/gfwlist\nserver=/universalpicturesinternational.com/127.0.0.1#5335\nipset=/universalpicturesinternational.com/gfwlist\nserver=/vilavpn.com/127.0.0.1#5335\nipset=/vilavpn.com/gfwlist\nserver=/skyoceanrescue.de/127.0.0.1#5335\nipset=/skyoceanrescue.de/gfwlist\nserver=/namemybeats.com/127.0.0.1#5335\nipset=/namemybeats.com/gfwlist\nserver=/facebooj.com/127.0.0.1#5335\nipset=/facebooj.com/gfwlist\nserver=/shikorina.net/127.0.0.1#5335\nipset=/shikorina.net/gfwlist\nserver=/moneywithfacebook.com/127.0.0.1#5335\nipset=/moneywithfacebook.com/gfwlist\nserver=/facecbgook.com/127.0.0.1#5335\nipset=/facecbgook.com/gfwlist\nserver=/sissy.game/127.0.0.1#5335\nipset=/sissy.game/gfwlist\nserver=/wiipartyu.com/127.0.0.1#5335\nipset=/wiipartyu.com/gfwlist\nserver=/chatwhores.org/127.0.0.1#5335\nipset=/chatwhores.org/gfwlist\nserver=/awstrack.me/127.0.0.1#5335\nipset=/awstrack.me/gfwlist\nserver=/anaconda.org/127.0.0.1#5335\nipset=/anaconda.org/gfwlist\nserver=/bangbrosnetwork.com/127.0.0.1#5335\nipset=/bangbrosnetwork.com/gfwlist\nserver=/discord.tools/127.0.0.1#5335\nipset=/discord.tools/gfwlist\nserver=/hottestfilms.com/127.0.0.1#5335\nipset=/hottestfilms.com/gfwlist\nserver=/chromeos.dev/127.0.0.1#5335\nipset=/chromeos.dev/gfwlist\nserver=/xnxxx.cc/127.0.0.1#5335\nipset=/xnxxx.cc/gfwlist\nserver=/signal.org/127.0.0.1#5335\nipset=/signal.org/gfwlist\nserver=/intercom.io/127.0.0.1#5335\nipset=/intercom.io/gfwlist\nserver=/starbucks.co.id/127.0.0.1#5335\nipset=/starbucks.co.id/gfwlist\nserver=/imaypb.com/127.0.0.1#5335\nipset=/imaypb.com/gfwlist\nserver=/hpdrivers.com/127.0.0.1#5335\nipset=/hpdrivers.com/gfwlist\nserver=/taiwansex.tw/127.0.0.1#5335\nipset=/taiwansex.tw/gfwlist\nserver=/hptv.fun/127.0.0.1#5335\nipset=/hptv.fun/gfwlist\nserver=/typeisbeautiful.com/127.0.0.1#5335\nipset=/typeisbeautiful.com/gfwlist\nserver=/svipshipin.store/127.0.0.1#5335\nipset=/svipshipin.store/gfwlist\nserver=/vipergirls.to/127.0.0.1#5335\nipset=/vipergirls.to/gfwlist\nserver=/archive.org/127.0.0.1#5335\nipset=/archive.org/gfwlist\nserver=/qoo10.jp/127.0.0.1#5335\nipset=/qoo10.jp/gfwlist\nserver=/zuckerberg.com/127.0.0.1#5335\nipset=/zuckerberg.com/gfwlist\nserver=/cbsinteractive.com/127.0.0.1#5335\nipset=/cbsinteractive.com/gfwlist\nserver=/awempire.com/127.0.0.1#5335\nipset=/awempire.com/gfwlist\nserver=/empflix.com/127.0.0.1#5335\nipset=/empflix.com/gfwlist\nserver=/onstream.cc/127.0.0.1#5335\nipset=/onstream.cc/gfwlist\nserver=/mycomicsxxx.com/127.0.0.1#5335\nipset=/mycomicsxxx.com/gfwlist\nserver=/github.dev/127.0.0.1#5335\nipset=/github.dev/gfwlist\nserver=/cam4.com/127.0.0.1#5335\nipset=/cam4.com/gfwlist\nserver=/shameless.com/127.0.0.1#5335\nipset=/shameless.com/gfwlist\nserver=/pornjam.com/127.0.0.1#5335\nipset=/pornjam.com/gfwlist\nserver=/nintendoswitchtogether.com/127.0.0.1#5335\nipset=/nintendoswitchtogether.com/gfwlist\nserver=/moeero-library.com/127.0.0.1#5335\nipset=/moeero-library.com/gfwlist\nserver=/noisullifb.com/127.0.0.1#5335\nipset=/noisullifb.com/gfwlist\nserver=/perfectgirls.net/127.0.0.1#5335\nipset=/perfectgirls.net/gfwlist\nserver=/intel.in/127.0.0.1#5335\nipset=/intel.in/gfwlist\nserver=/primevideo.org/127.0.0.1#5335\nipset=/primevideo.org/gfwlist\nserver=/authorxml.com/127.0.0.1#5335\nipset=/authorxml.com/gfwlist\nserver=/wwwpornhub.pro/127.0.0.1#5335\nipset=/wwwpornhub.pro/gfwlist\nserver=/logitechg.com/127.0.0.1#5335\nipset=/logitechg.com/gfwlist\nserver=/hawaiibmw.com/127.0.0.1#5335\nipset=/hawaiibmw.com/gfwlist\nserver=/management-azure-devices.net/127.0.0.1#5335\nipset=/management-azure-devices.net/gfwlist\nserver=/xgames.zone/127.0.0.1#5335\nipset=/xgames.zone/gfwlist\nserver=/xsela.cc/127.0.0.1#5335\nipset=/xsela.cc/gfwlist\nserver=/netfapx.com/127.0.0.1#5335\nipset=/netfapx.com/gfwlist\nserver=/vox-cdn.com/127.0.0.1#5335\nipset=/vox-cdn.com/gfwlist\nserver=/youtube.ly/127.0.0.1#5335\nipset=/youtube.ly/gfwlist\nserver=/hentai.desi/127.0.0.1#5335\nipset=/hentai.desi/gfwlist\nserver=/javday.tv/127.0.0.1#5335\nipset=/javday.tv/gfwlist\nserver=/enematube.com/127.0.0.1#5335\nipset=/enematube.com/gfwlist\nserver=/dontbubble.us/127.0.0.1#5335\nipset=/dontbubble.us/gfwlist\nserver=/services-exchange.com/127.0.0.1#5335\nipset=/services-exchange.com/gfwlist\nserver=/brasilincesto.com/127.0.0.1#5335\nipset=/brasilincesto.com/gfwlist\nserver=/marketo.co.uk/127.0.0.1#5335\nipset=/marketo.co.uk/gfwlist\nserver=/nintendo-europe.com/127.0.0.1#5335\nipset=/nintendo-europe.com/gfwlist\nserver=/nxtdig.com.tw/127.0.0.1#5335\nipset=/nxtdig.com.tw/gfwlist\nserver=/blogspot.co.at/127.0.0.1#5335\nipset=/blogspot.co.at/gfwlist\nserver=/watchanimeattheoffice.com/127.0.0.1#5335\nipset=/watchanimeattheoffice.com/gfwlist\nserver=/dojin.com/127.0.0.1#5335\nipset=/dojin.com/gfwlist\nserver=/intel.my/127.0.0.1#5335\nipset=/intel.my/gfwlist\nserver=/nintendo.co.uk/127.0.0.1#5335\nipset=/nintendo.co.uk/gfwlist\nserver=/bmw-motorrad.co.uk/127.0.0.1#5335\nipset=/bmw-motorrad.co.uk/gfwlist\nserver=/tgirlpostop.com/127.0.0.1#5335\nipset=/tgirlpostop.com/gfwlist\nserver=/minivaughanwest.com/127.0.0.1#5335\nipset=/minivaughanwest.com/gfwlist\nserver=/ippog.org/127.0.0.1#5335\nipset=/ippog.org/gfwlist\nserver=/aeasyshop.com/127.0.0.1#5335\nipset=/aeasyshop.com/gfwlist\nserver=/bmw-eg.com/127.0.0.1#5335\nipset=/bmw-eg.com/gfwlist\nserver=/visb.org/127.0.0.1#5335\nipset=/visb.org/gfwlist\nserver=/faebok.com/127.0.0.1#5335\nipset=/faebok.com/gfwlist\nserver=/mcdonalds.no/127.0.0.1#5335\nipset=/mcdonalds.no/gfwlist\nserver=/paypal-special.com/127.0.0.1#5335\nipset=/paypal-special.com/gfwlist\nserver=/bunnylust.com/127.0.0.1#5335\nipset=/bunnylust.com/gfwlist\nserver=/scholar.google.com.pr/127.0.0.1#5335\nipset=/scholar.google.com.pr/gfwlist\nserver=/itunesu.net/127.0.0.1#5335\nipset=/itunesu.net/gfwlist\nserver=/directvforhotels.com/127.0.0.1#5335\nipset=/directvforhotels.com/gfwlist\nserver=/youtube.co.nz/127.0.0.1#5335\nipset=/youtube.co.nz/gfwlist\nserver=/moneyswift.online/127.0.0.1#5335\nipset=/moneyswift.online/gfwlist\nserver=/durex.co.il/127.0.0.1#5335\nipset=/durex.co.il/gfwlist\nserver=/microsoftnewskids.com/127.0.0.1#5335\nipset=/microsoftnewskids.com/gfwlist\nserver=/hetzner.de/127.0.0.1#5335\nipset=/hetzner.de/gfwlist\nserver=/bmw-military-sales.com/127.0.0.1#5335\nipset=/bmw-military-sales.com/gfwlist\nserver=/buyitnow.com/127.0.0.1#5335\nipset=/buyitnow.com/gfwlist\nserver=/goldteenporn.com/127.0.0.1#5335\nipset=/goldteenporn.com/gfwlist\nserver=/pornmz.net/127.0.0.1#5335\nipset=/pornmz.net/gfwlist\nserver=/oxforddnb.com/127.0.0.1#5335\nipset=/oxforddnb.com/gfwlist\nserver=/applicationinsights.io/127.0.0.1#5335\nipset=/applicationinsights.io/gfwlist\nserver=/get.new/127.0.0.1#5335\nipset=/get.new/gfwlist\nserver=/sssins.com/127.0.0.1#5335\nipset=/sssins.com/gfwlist\nserver=/mastercard.hr/127.0.0.1#5335\nipset=/mastercard.hr/gfwlist\nserver=/playnintendo.com/127.0.0.1#5335\nipset=/playnintendo.com/gfwlist\nserver=/amazon.co.jp/127.0.0.1#5335\nipset=/amazon.co.jp/gfwlist\nserver=/visa.com.ge/127.0.0.1#5335\nipset=/visa.com.ge/gfwlist\nserver=/didce.com/127.0.0.1#5335\nipset=/didce.com/gfwlist\nserver=/milkmanbook.com/127.0.0.1#5335\nipset=/milkmanbook.com/gfwlist\nserver=/itu.int/127.0.0.1#5335\nipset=/itu.int/gfwlist\nserver=/beatscheap-nz.com/127.0.0.1#5335\nipset=/beatscheap-nz.com/gfwlist\nserver=/zbporn.com/127.0.0.1#5335\nipset=/zbporn.com/gfwlist\nserver=/verisigninc.com/127.0.0.1#5335\nipset=/verisigninc.com/gfwlist\nserver=/lucasentertainment.com/127.0.0.1#5335\nipset=/lucasentertainment.com/gfwlist\nserver=/intercomcdn.com/127.0.0.1#5335\nipset=/intercomcdn.com/gfwlist\nserver=/embl.fr/127.0.0.1#5335\nipset=/embl.fr/gfwlist\nserver=/tunsafe.com/127.0.0.1#5335\nipset=/tunsafe.com/gfwlist\nserver=/editorx.com/127.0.0.1#5335\nipset=/editorx.com/gfwlist\nserver=/pixanalytics.com/127.0.0.1#5335\nipset=/pixanalytics.com/gfwlist\nserver=/wholeplanetfoundation.org/127.0.0.1#5335\nipset=/wholeplanetfoundation.org/gfwlist\nserver=/txxx.com/127.0.0.1#5335\nipset=/txxx.com/gfwlist\nserver=/lightxxxtube.com/127.0.0.1#5335\nipset=/lightxxxtube.com/gfwlist\nserver=/trustsign.ch/127.0.0.1#5335\nipset=/trustsign.ch/gfwlist\nserver=/schemer.com/127.0.0.1#5335\nipset=/schemer.com/gfwlist\nserver=/pinterest.it/127.0.0.1#5335\nipset=/pinterest.it/gfwlist\nserver=/milfpornonly.com/127.0.0.1#5335\nipset=/milfpornonly.com/gfwlist\nserver=/msropendata.com/127.0.0.1#5335\nipset=/msropendata.com/gfwlist\nserver=/zobry.site/127.0.0.1#5335\nipset=/zobry.site/gfwlist\nserver=/ie10.com/127.0.0.1#5335\nipset=/ie10.com/gfwlist\nserver=/google.com.py/127.0.0.1#5335\nipset=/google.com.py/gfwlist\nserver=/azuredigitaltwins.net/127.0.0.1#5335\nipset=/azuredigitaltwins.net/gfwlist\nserver=/pornobom.com.br/127.0.0.1#5335\nipset=/pornobom.com.br/gfwlist\nserver=/jmlr.org/127.0.0.1#5335\nipset=/jmlr.org/gfwlist\nserver=/bloombergtv.mn/127.0.0.1#5335\nipset=/bloombergtv.mn/gfwlist\nserver=/link-o-rama.com/127.0.0.1#5335\nipset=/link-o-rama.com/gfwlist\nserver=/drebeatstudio.com/127.0.0.1#5335\nipset=/drebeatstudio.com/gfwlist\nserver=/milffox.com/127.0.0.1#5335\nipset=/milffox.com/gfwlist\nserver=/digitalcertvalidation.com/127.0.0.1#5335\nipset=/digitalcertvalidation.com/gfwlist\nserver=/facebookstories.com/127.0.0.1#5335\nipset=/facebookstories.com/gfwlist\nserver=/themercury.com.au/127.0.0.1#5335\nipset=/themercury.com.au/gfwlist\nserver=/zoom.com.cn/127.0.0.1#5335\nipset=/zoom.com.cn/gfwlist\nserver=/trans500.com/127.0.0.1#5335\nipset=/trans500.com/gfwlist\nserver=/faceboof.com/127.0.0.1#5335\nipset=/faceboof.com/gfwlist\nserver=/radiofarda.com/127.0.0.1#5335\nipset=/radiofarda.com/gfwlist\nserver=/warp.plus/127.0.0.1#5335\nipset=/warp.plus/gfwlist\nserver=/paypalbenefits.com/127.0.0.1#5335\nipset=/paypalbenefits.com/gfwlist\nserver=/qualcomm.co.id/127.0.0.1#5335\nipset=/qualcomm.co.id/gfwlist\nserver=/findacard.com/127.0.0.1#5335\nipset=/findacard.com/gfwlist\nserver=/nvidia.fr/127.0.0.1#5335\nipset=/nvidia.fr/gfwlist\nserver=/bmw.pt/127.0.0.1#5335\nipset=/bmw.pt/gfwlist\nserver=/yaptube.com/127.0.0.1#5335\nipset=/yaptube.com/gfwlist\nserver=/studiobeatsbydrdre.com/127.0.0.1#5335\nipset=/studiobeatsbydrdre.com/gfwlist\nserver=/rubygems.org/127.0.0.1#5335\nipset=/rubygems.org/gfwlist\nserver=/yahoo.com.mx/127.0.0.1#5335\nipset=/yahoo.com.mx/gfwlist\nserver=/makecode.org/127.0.0.1#5335\nipset=/makecode.org/gfwlist\nserver=/caijinglengyan.com/127.0.0.1#5335\nipset=/caijinglengyan.com/gfwlist\nserver=/hentaiworld.tv/127.0.0.1#5335\nipset=/hentaiworld.tv/gfwlist\nserver=/nudistbeachporn.com/127.0.0.1#5335\nipset=/nudistbeachporn.com/gfwlist\nserver=/ultradonkey.com/127.0.0.1#5335\nipset=/ultradonkey.com/gfwlist\nserver=/cbssports.com/127.0.0.1#5335\nipset=/cbssports.com/gfwlist\nserver=/tsthai.com/127.0.0.1#5335\nipset=/tsthai.com/gfwlist\nserver=/durex.com/127.0.0.1#5335\nipset=/durex.com/gfwlist\nserver=/monbeats2013.com/127.0.0.1#5335\nipset=/monbeats2013.com/gfwlist\nserver=/tiaz.site/127.0.0.1#5335\nipset=/tiaz.site/gfwlist\nserver=/atlantaminidealers.com/127.0.0.1#5335\nipset=/atlantaminidealers.com/gfwlist\nserver=/slack-files.com/127.0.0.1#5335\nipset=/slack-files.com/gfwlist\nserver=/ddh.gg/127.0.0.1#5335\nipset=/ddh.gg/gfwlist\nserver=/espndotcom.tt.omtrdc.net/127.0.0.1#5335\nipset=/espndotcom.tt.omtrdc.net/gfwlist\nserver=/lovegirls.cam/127.0.0.1#5335\nipset=/lovegirls.cam/gfwlist\nserver=/mastercardworldwide.com/127.0.0.1#5335\nipset=/mastercardworldwide.com/gfwlist\nserver=/hentai2read.com/127.0.0.1#5335\nipset=/hentai2read.com/gfwlist\nserver=/jove.com/127.0.0.1#5335\nipset=/jove.com/gfwlist\nserver=/amateur-fetish.com/127.0.0.1#5335\nipset=/amateur-fetish.com/gfwlist\nserver=/illusionze.com/127.0.0.1#5335\nipset=/illusionze.com/gfwlist\nserver=/amazon.nl/127.0.0.1#5335\nipset=/amazon.nl/gfwlist\nserver=/x3vid.com/127.0.0.1#5335\nipset=/x3vid.com/gfwlist\nserver=/bbcpornonly.com/127.0.0.1#5335\nipset=/bbcpornonly.com/gfwlist\nserver=/nuki-dokoro.com/127.0.0.1#5335\nipset=/nuki-dokoro.com/gfwlist\nserver=/hentai247.net/127.0.0.1#5335\nipset=/hentai247.net/gfwlist\nserver=/casquebeatsofficiel-fr.com/127.0.0.1#5335\nipset=/casquebeatsofficiel-fr.com/gfwlist\nserver=/dollnight.com/127.0.0.1#5335\nipset=/dollnight.com/gfwlist\nserver=/appleone.chat/127.0.0.1#5335\nipset=/appleone.chat/gfwlist\nserver=/javhdonline.com/127.0.0.1#5335\nipset=/javhdonline.com/gfwlist\nserver=/hentaihub.xxx/127.0.0.1#5335\nipset=/hentaihub.xxx/gfwlist\nserver=/latampartneruniversity.com/127.0.0.1#5335\nipset=/latampartneruniversity.com/gfwlist\nserver=/facecbook.com/127.0.0.1#5335\nipset=/facecbook.com/gfwlist\nserver=/60plusmilfs.com/127.0.0.1#5335\nipset=/60plusmilfs.com/gfwlist\nserver=/50plusmilfs.com/127.0.0.1#5335\nipset=/50plusmilfs.com/gfwlist\nserver=/myfreeblack.com/127.0.0.1#5335\nipset=/myfreeblack.com/gfwlist\nserver=/bmw.com.bn/127.0.0.1#5335\nipset=/bmw.com.bn/gfwlist\nserver=/fox49.tv/127.0.0.1#5335\nipset=/fox49.tv/gfwlist\nserver=/pearsonelt.ch/127.0.0.1#5335\nipset=/pearsonelt.ch/gfwlist\nserver=/collins.in/127.0.0.1#5335\nipset=/collins.in/gfwlist\nserver=/thaicherry.com/127.0.0.1#5335\nipset=/thaicherry.com/gfwlist\nserver=/chocam.com/127.0.0.1#5335\nipset=/chocam.com/gfwlist\nserver=/brill.com/127.0.0.1#5335\nipset=/brill.com/gfwlist\nserver=/internetexxxplorer.com/127.0.0.1#5335\nipset=/internetexxxplorer.com/gfwlist\nserver=/hboasia.com/127.0.0.1#5335\nipset=/hboasia.com/gfwlist\nserver=/mastercard.eu/127.0.0.1#5335\nipset=/mastercard.eu/gfwlist\nserver=/accv.es/127.0.0.1#5335\nipset=/accv.es/gfwlist\nserver=/bcvp0rtal.com/127.0.0.1#5335\nipset=/bcvp0rtal.com/gfwlist\nserver=/fotoscaserasx.com/127.0.0.1#5335\nipset=/fotoscaserasx.com/gfwlist\nserver=/udnfunlife.com/127.0.0.1#5335\nipset=/udnfunlife.com/gfwlist\nserver=/newsmax.in/127.0.0.1#5335\nipset=/newsmax.in/gfwlist\nserver=/youtube.ru/127.0.0.1#5335\nipset=/youtube.ru/gfwlist\nserver=/nurofen.es/127.0.0.1#5335\nipset=/nurofen.es/gfwlist\nserver=/pscp.tv/127.0.0.1#5335\nipset=/pscp.tv/gfwlist\nserver=/excedo.com/127.0.0.1#5335\nipset=/excedo.com/gfwlist\nserver=/stocking-tease.com/127.0.0.1#5335\nipset=/stocking-tease.com/gfwlist\nserver=/topcartoonsites.com/127.0.0.1#5335\nipset=/topcartoonsites.com/gfwlist\nserver=/adult-sex-games.com/127.0.0.1#5335\nipset=/adult-sex-games.com/gfwlist\nserver=/homemadeanalporn.com/127.0.0.1#5335\nipset=/homemadeanalporn.com/gfwlist\nserver=/adobeexperienceawards.com/127.0.0.1#5335\nipset=/adobeexperienceawards.com/gfwlist\nserver=/pki-post.ch/127.0.0.1#5335\nipset=/pki-post.ch/gfwlist\nserver=/hp3dsamplepromo.com/127.0.0.1#5335\nipset=/hp3dsamplepromo.com/gfwlist\nserver=/mewe.com/127.0.0.1#5335\nipset=/mewe.com/gfwlist\nserver=/gputechconf.eu/127.0.0.1#5335\nipset=/gputechconf.eu/gfwlist\nserver=/tokyo-sports.co.jp/127.0.0.1#5335\nipset=/tokyo-sports.co.jp/gfwlist\nserver=/mcdonalds.se/127.0.0.1#5335\nipset=/mcdonalds.se/gfwlist\nserver=/2013beatsbydreshop.com/127.0.0.1#5335\nipset=/2013beatsbydreshop.com/gfwlist\nserver=/zooporn.pro/127.0.0.1#5335\nipset=/zooporn.pro/gfwlist\nserver=/pornosphere.com/127.0.0.1#5335\nipset=/pornosphere.com/gfwlist\nserver=/i91av.org/127.0.0.1#5335\nipset=/i91av.org/gfwlist\nserver=/erito.com/127.0.0.1#5335\nipset=/erito.com/gfwlist\nserver=/fox9.com/127.0.0.1#5335\nipset=/fox9.com/gfwlist\nserver=/durex.ie/127.0.0.1#5335\nipset=/durex.ie/gfwlist\nserver=/facebook-program.com/127.0.0.1#5335\nipset=/facebook-program.com/gfwlist\nserver=/amebaowndme.com/127.0.0.1#5335\nipset=/amebaowndme.com/gfwlist\nserver=/bmwartjourney.com/127.0.0.1#5335\nipset=/bmwartjourney.com/gfwlist\nserver=/volvotruckrental.be/127.0.0.1#5335\nipset=/volvotruckrental.be/gfwlist\nserver=/paramount.com/127.0.0.1#5335\nipset=/paramount.com/gfwlist\nserver=/scene7.com/127.0.0.1#5335\nipset=/scene7.com/gfwlist\nserver=/indian-free-xnxx.com/127.0.0.1#5335\nipset=/indian-free-xnxx.com/gfwlist\nserver=/easports.com/127.0.0.1#5335\nipset=/easports.com/gfwlist\nserver=/avstar04.com/127.0.0.1#5335\nipset=/avstar04.com/gfwlist\nserver=/apple.co.uk/127.0.0.1#5335\nipset=/apple.co.uk/gfwlist\nserver=/bloombergsurvey.com/127.0.0.1#5335\nipset=/bloombergsurvey.com/gfwlist\nserver=/javhdporn.com/127.0.0.1#5335\nipset=/javhdporn.com/gfwlist\nserver=/huluapp.com/127.0.0.1#5335\nipset=/huluapp.com/gfwlist\nserver=/icloudo.net/127.0.0.1#5335\nipset=/icloudo.net/gfwlist\nserver=/vfsforgit.com/127.0.0.1#5335\nipset=/vfsforgit.com/gfwlist\nserver=/icloud.sk/127.0.0.1#5335\nipset=/icloud.sk/gfwlist\nserver=/adultgamereviews.com/127.0.0.1#5335\nipset=/adultgamereviews.com/gfwlist\nserver=/swjedifallenorder.com/127.0.0.1#5335\nipset=/swjedifallenorder.com/gfwlist\nserver=/kusugurizanmai.com/127.0.0.1#5335\nipset=/kusugurizanmai.com/gfwlist\nserver=/nbcolympics.com/127.0.0.1#5335\nipset=/nbcolympics.com/gfwlist\nserver=/sony.pl/127.0.0.1#5335\nipset=/sony.pl/gfwlist\nserver=/nownews.com/127.0.0.1#5335\nipset=/nownews.com/gfwlist\nserver=/kindle.it/127.0.0.1#5335\nipset=/kindle.it/gfwlist\nserver=/foxsports.com.ve/127.0.0.1#5335\nipset=/foxsports.com.ve/gfwlist\nserver=/161sex.com/127.0.0.1#5335\nipset=/161sex.com/gfwlist\nserver=/jizzle.com/127.0.0.1#5335\nipset=/jizzle.com/gfwlist\nserver=/docs.rs/127.0.0.1#5335\nipset=/docs.rs/gfwlist\nserver=/verisign.es/127.0.0.1#5335\nipset=/verisign.es/gfwlist\nserver=/scharferporno.com/127.0.0.1#5335\nipset=/scharferporno.com/gfwlist\nserver=/hentaihaven.xxx/127.0.0.1#5335\nipset=/hentaihaven.xxx/gfwlist\nserver=/bmw.com.pe/127.0.0.1#5335\nipset=/bmw.com.pe/gfwlist\nserver=/hentaimovieplanet.com/127.0.0.1#5335\nipset=/hentaimovieplanet.com/gfwlist\nserver=/democracy.earth/127.0.0.1#5335\nipset=/democracy.earth/gfwlist\nserver=/ipodnano.net/127.0.0.1#5335\nipset=/ipodnano.net/gfwlist\nserver=/discordcdn.com/127.0.0.1#5335\nipset=/discordcdn.com/gfwlist\nserver=/lonestarnaughtygirls.com/127.0.0.1#5335\nipset=/lonestarnaughtygirls.com/gfwlist\nserver=/drebeatsdeutschland.net/127.0.0.1#5335\nipset=/drebeatsdeutschland.net/gfwlist\nserver=/bestbuyideax.com/127.0.0.1#5335\nipset=/bestbuyideax.com/gfwlist\nserver=/xfreehd.com/127.0.0.1#5335\nipset=/xfreehd.com/gfwlist\nserver=/ccnsite.com/127.0.0.1#5335\nipset=/ccnsite.com/gfwlist\nserver=/volvotrucks.co.uk/127.0.0.1#5335\nipset=/volvotrucks.co.uk/gfwlist\nserver=/attspecial.com/127.0.0.1#5335\nipset=/attspecial.com/gfwlist\nserver=/momsteachsex.com/127.0.0.1#5335\nipset=/momsteachsex.com/gfwlist\nserver=/janor6.net/127.0.0.1#5335\nipset=/janor6.net/gfwlist\nserver=/uniswap.org/127.0.0.1#5335\nipset=/uniswap.org/gfwlist\nserver=/washa.tv/127.0.0.1#5335\nipset=/washa.tv/gfwlist\nserver=/idnike.com/127.0.0.1#5335\nipset=/idnike.com/gfwlist\nserver=/bmw-connecteddrive.ch/127.0.0.1#5335\nipset=/bmw-connecteddrive.ch/gfwlist\nserver=/directvdealer.com/127.0.0.1#5335\nipset=/directvdealer.com/gfwlist\nserver=/awstrust.com/127.0.0.1#5335\nipset=/awstrust.com/gfwlist\nserver=/bmw.hr/127.0.0.1#5335\nipset=/bmw.hr/gfwlist\nserver=/finishinfo.se/127.0.0.1#5335\nipset=/finishinfo.se/gfwlist\nserver=/realmilwaukeenow.com/127.0.0.1#5335\nipset=/realmilwaukeenow.com/gfwlist\nserver=/pinterest.at/127.0.0.1#5335\nipset=/pinterest.at/gfwlist\nserver=/itunesessentials.com/127.0.0.1#5335\nipset=/itunesessentials.com/gfwlist\nserver=/eenike.com/127.0.0.1#5335\nipset=/eenike.com/gfwlist\nserver=/cisco-returns.com/127.0.0.1#5335\nipset=/cisco-returns.com/gfwlist\nserver=/apple.ro/127.0.0.1#5335\nipset=/apple.ro/gfwlist\nserver=/volvotrucks.md/127.0.0.1#5335\nipset=/volvotrucks.md/gfwlist\nserver=/appleipodsettlement.com/127.0.0.1#5335\nipset=/appleipodsettlement.com/gfwlist\nserver=/shemalehd.sex/127.0.0.1#5335\nipset=/shemalehd.sex/gfwlist\nserver=/starbucks.ad/127.0.0.1#5335\nipset=/starbucks.ad/gfwlist\nserver=/h-flash.com/127.0.0.1#5335\nipset=/h-flash.com/gfwlist\nserver=/rundf665.cyou/127.0.0.1#5335\nipset=/rundf665.cyou/gfwlist\nserver=/fastlane.tools/127.0.0.1#5335\nipset=/fastlane.tools/gfwlist\nserver=/kindgirls.com/127.0.0.1#5335\nipset=/kindgirls.com/gfwlist\nserver=/famousinternetgirls.com/127.0.0.1#5335\nipset=/famousinternetgirls.com/gfwlist\nserver=/mcdonalds.com/127.0.0.1#5335\nipset=/mcdonalds.com/gfwlist\nserver=/sign.new/127.0.0.1#5335\nipset=/sign.new/gfwlist\nserver=/chroniclesec.com/127.0.0.1#5335\nipset=/chroniclesec.com/gfwlist\nserver=/ddd-smart.net/127.0.0.1#5335\nipset=/ddd-smart.net/gfwlist\nserver=/sextop1.net/127.0.0.1#5335\nipset=/sextop1.net/gfwlist\nserver=/xxxtubegf.com/127.0.0.1#5335\nipset=/xxxtubegf.com/gfwlist\nserver=/hulugans.com/127.0.0.1#5335\nipset=/hulugans.com/gfwlist\nserver=/paheal.net/127.0.0.1#5335\nipset=/paheal.net/gfwlist\nserver=/allfet.net/127.0.0.1#5335\nipset=/allfet.net/gfwlist\nserver=/pussyporntubes.com/127.0.0.1#5335\nipset=/pussyporntubes.com/gfwlist\nserver=/favebook.com/127.0.0.1#5335\nipset=/favebook.com/gfwlist\nserver=/beatselectronic.net/127.0.0.1#5335\nipset=/beatselectronic.net/gfwlist\nserver=/meetandfuckgames.com/127.0.0.1#5335\nipset=/meetandfuckgames.com/gfwlist\nserver=/marvelsuperwar.com/127.0.0.1#5335\nipset=/marvelsuperwar.com/gfwlist\nserver=/spotify.map.fastlylb.net/127.0.0.1#5335\nipset=/spotify.map.fastlylb.net/gfwlist\nserver=/fastlane.ci/127.0.0.1#5335\nipset=/fastlane.ci/gfwlist\nserver=/shemaletrannypics.com/127.0.0.1#5335\nipset=/shemaletrannypics.com/gfwlist\nserver=/adulti01.com/127.0.0.1#5335\nipset=/adulti01.com/gfwlist\nserver=/applestore.com.tw/127.0.0.1#5335\nipset=/applestore.com.tw/gfwlist\nserver=/xnxx-cdn.com/127.0.0.1#5335\nipset=/xnxx-cdn.com/gfwlist\nserver=/porn-sex-video.me/127.0.0.1#5335\nipset=/porn-sex-video.me/gfwlist\nserver=/raspberrypi.org/127.0.0.1#5335\nipset=/raspberrypi.org/gfwlist\nserver=/bloomberg.fm/127.0.0.1#5335\nipset=/bloomberg.fm/gfwlist\nserver=/vhxqa2.com/127.0.0.1#5335\nipset=/vhxqa2.com/gfwlist\nserver=/mini.by/127.0.0.1#5335\nipset=/mini.by/gfwlist\nserver=/girlsfuck-tube.com/127.0.0.1#5335\nipset=/girlsfuck-tube.com/gfwlist\nserver=/40momporntube.com/127.0.0.1#5335\nipset=/40momporntube.com/gfwlist\nserver=/pornyteen.com/127.0.0.1#5335\nipset=/pornyteen.com/gfwlist\nserver=/epigeum.com/127.0.0.1#5335\nipset=/epigeum.com/gfwlist\nserver=/salebeatslasteststyle4you.com/127.0.0.1#5335\nipset=/salebeatslasteststyle4you.com/gfwlist\nserver=/xxxhentai.net/127.0.0.1#5335\nipset=/xxxhentai.net/gfwlist\nserver=/ebay.ie/127.0.0.1#5335\nipset=/ebay.ie/gfwlist\nserver=/e-tugra.com/127.0.0.1#5335\nipset=/e-tugra.com/gfwlist\nserver=/esm.run/127.0.0.1#5335\nipset=/esm.run/gfwlist\nserver=/yahoo.co.bw/127.0.0.1#5335\nipset=/yahoo.co.bw/gfwlist\nserver=/dropbox.tech/127.0.0.1#5335\nipset=/dropbox.tech/gfwlist\nserver=/badasianpussy.com/127.0.0.1#5335\nipset=/badasianpussy.com/gfwlist\nserver=/monsterbeatsbydre-usa.com/127.0.0.1#5335\nipset=/monsterbeatsbydre-usa.com/gfwlist\nserver=/coronavirusnow.com/127.0.0.1#5335\nipset=/coronavirusnow.com/gfwlist\nserver=/blackamateurfuck.com/127.0.0.1#5335\nipset=/blackamateurfuck.com/gfwlist\nserver=/xxxtubezoo.com/127.0.0.1#5335\nipset=/xxxtubezoo.com/gfwlist\nserver=/paypal-secure.org/127.0.0.1#5335\nipset=/paypal-secure.org/gfwlist\nserver=/ubuntu-touch.io/127.0.0.1#5335\nipset=/ubuntu-touch.io/gfwlist\nserver=/venmo-touch.com/127.0.0.1#5335\nipset=/venmo-touch.com/gfwlist\nserver=/notepad-plus-plus.org/127.0.0.1#5335\nipset=/notepad-plus-plus.org/gfwlist\nserver=/bmw-sports.com/127.0.0.1#5335\nipset=/bmw-sports.com/gfwlist\nserver=/creampieforgranny.com/127.0.0.1#5335\nipset=/creampieforgranny.com/gfwlist\nserver=/bdsmland.org/127.0.0.1#5335\nipset=/bdsmland.org/gfwlist\nserver=/jiuse905.com/127.0.0.1#5335\nipset=/jiuse905.com/gfwlist\nserver=/beatscasque-france.com/127.0.0.1#5335\nipset=/beatscasque-france.com/gfwlist\nserver=/bmw.ht/127.0.0.1#5335\nipset=/bmw.ht/gfwlist\nserver=/yahoo.dk/127.0.0.1#5335\nipset=/yahoo.dk/gfwlist\nserver=/hornygirlsonline.org/127.0.0.1#5335\nipset=/hornygirlsonline.org/gfwlist\nserver=/yaoiotaku.com/127.0.0.1#5335\nipset=/yaoiotaku.com/gfwlist\nserver=/bitsquare.io/127.0.0.1#5335\nipset=/bitsquare.io/gfwlist\nserver=/starwarstheoldrepublic.com/127.0.0.1#5335\nipset=/starwarstheoldrepublic.com/gfwlist\nserver=/asahicom.jp/127.0.0.1#5335\nipset=/asahicom.jp/gfwlist\nserver=/golang.org/127.0.0.1#5335\nipset=/golang.org/gfwlist\nserver=/visainfinite.ca/127.0.0.1#5335\nipset=/visainfinite.ca/gfwlist\nserver=/bmw.cc/127.0.0.1#5335\nipset=/bmw.cc/gfwlist\nserver=/foxnewsnetwork.com/127.0.0.1#5335\nipset=/foxnewsnetwork.com/gfwlist\nserver=/visainfiniteluxuryhotels.ca/127.0.0.1#5335\nipset=/visainfiniteluxuryhotels.ca/gfwlist\nserver=/bloombergstatus.com/127.0.0.1#5335\nipset=/bloombergstatus.com/gfwlist\nserver=/yarininsuyu.com/127.0.0.1#5335\nipset=/yarininsuyu.com/gfwlist\nserver=/xxxxvideo.uno/127.0.0.1#5335\nipset=/xxxxvideo.uno/gfwlist\nserver=/melonbooks.co.jp/127.0.0.1#5335\nipset=/melonbooks.co.jp/gfwlist\nserver=/realamericanstories.info/127.0.0.1#5335\nipset=/realamericanstories.info/gfwlist\nserver=/disneyadsales.com/127.0.0.1#5335\nipset=/disneyadsales.com/gfwlist\nserver=/needforspeedlightning.com/127.0.0.1#5335\nipset=/needforspeedlightning.com/gfwlist\nserver=/ebaycom.com/127.0.0.1#5335\nipset=/ebaycom.com/gfwlist\nserver=/d-trust.net/127.0.0.1#5335\nipset=/d-trust.net/gfwlist\nserver=/gfpornmovies.com/127.0.0.1#5335\nipset=/gfpornmovies.com/gfwlist\nserver=/iphoneacessorios.com.br/127.0.0.1#5335\nipset=/iphoneacessorios.com.br/gfwlist\nserver=/redgifs.com/127.0.0.1#5335\nipset=/redgifs.com/gfwlist\nserver=/fox26houston.com/127.0.0.1#5335\nipset=/fox26houston.com/gfwlist\nserver=/upjav.cc/127.0.0.1#5335\nipset=/upjav.cc/gfwlist\nserver=/blazor.net/127.0.0.1#5335\nipset=/blazor.net/gfwlist\nserver=/nextwork.com.tw/127.0.0.1#5335\nipset=/nextwork.com.tw/gfwlist\nserver=/blogspot.lt/127.0.0.1#5335\nipset=/blogspot.lt/gfwlist\nserver=/merakigo.com/127.0.0.1#5335\nipset=/merakigo.com/gfwlist\nserver=/onefifteen.org/127.0.0.1#5335\nipset=/onefifteen.org/gfwlist\nserver=/life-global.org/127.0.0.1#5335\nipset=/life-global.org/gfwlist\nserver=/shockingmovies.com/127.0.0.1#5335\nipset=/shockingmovies.com/gfwlist\nserver=/pca.st/127.0.0.1#5335\nipset=/pca.st/gfwlist\nserver=/drbizzaro.com/127.0.0.1#5335\nipset=/drbizzaro.com/gfwlist\nserver=/camgoddess.tv/127.0.0.1#5335\nipset=/camgoddess.tv/gfwlist\nserver=/gaythebest.com/127.0.0.1#5335\nipset=/gaythebest.com/gfwlist\nserver=/databank.worldbank.org/127.0.0.1#5335\nipset=/databank.worldbank.org/gfwlist\nserver=/6arabs.com/127.0.0.1#5335\nipset=/6arabs.com/gfwlist\nserver=/xxxpicz.com/127.0.0.1#5335\nipset=/xxxpicz.com/gfwlist\nserver=/volvotrucks.ee/127.0.0.1#5335\nipset=/volvotrucks.ee/gfwlist\nserver=/xenoblade.com/127.0.0.1#5335\nipset=/xenoblade.com/gfwlist\nserver=/icloud-content.com/127.0.0.1#5335\nipset=/icloud-content.com/gfwlist\nserver=/gemfire.net/127.0.0.1#5335\nipset=/gemfire.net/gfwlist\nserver=/udn.com.tw/127.0.0.1#5335\nipset=/udn.com.tw/gfwlist\nserver=/vivaxnxx.com/127.0.0.1#5335\nipset=/vivaxnxx.com/gfwlist\nserver=/forbiddenasian.com/127.0.0.1#5335\nipset=/forbiddenasian.com/gfwlist\nserver=/ydn.com.tw/127.0.0.1#5335\nipset=/ydn.com.tw/gfwlist\nserver=/mktorest.com/127.0.0.1#5335\nipset=/mktorest.com/gfwlist\nserver=/epochtimes.com.tw/127.0.0.1#5335\nipset=/epochtimes.com.tw/gfwlist\nserver=/pornhubdeutsch.net/127.0.0.1#5335\nipset=/pornhubdeutsch.net/gfwlist\nserver=/ebay-us.com/127.0.0.1#5335\nipset=/ebay-us.com/gfwlist\nserver=/volvopenta.com/127.0.0.1#5335\nipset=/volvopenta.com/gfwlist\nserver=/faststone.org/127.0.0.1#5335\nipset=/faststone.org/gfwlist\nserver=/googledrive.com/127.0.0.1#5335\nipset=/googledrive.com/gfwlist\nserver=/mybmw.ca/127.0.0.1#5335\nipset=/mybmw.ca/gfwlist\nserver=/iproperty.com/127.0.0.1#5335\nipset=/iproperty.com/gfwlist\nserver=/truyen-hentai.fr/127.0.0.1#5335\nipset=/truyen-hentai.fr/gfwlist\nserver=/brdteengal.com/127.0.0.1#5335\nipset=/brdteengal.com/gfwlist\nserver=/attpurchasing.com/127.0.0.1#5335\nipset=/attpurchasing.com/gfwlist\nserver=/hzmn.net/127.0.0.1#5335\nipset=/hzmn.net/gfwlist\nserver=/xxxassfuck.com/127.0.0.1#5335\nipset=/xxxassfuck.com/gfwlist\nserver=/xvideos-dl.top/127.0.0.1#5335\nipset=/xvideos-dl.top/gfwlist\nserver=/adidas.dk/127.0.0.1#5335\nipset=/adidas.dk/gfwlist\nserver=/yahoo.com.tj/127.0.0.1#5335\nipset=/yahoo.com.tj/gfwlist\nserver=/gamer2-cds.cdn.hinet.net/127.0.0.1#5335\nipset=/gamer2-cds.cdn.hinet.net/gfwlist\nserver=/mingky.org/127.0.0.1#5335\nipset=/mingky.org/gfwlist\nserver=/ebayenterprise.info/127.0.0.1#5335\nipset=/ebayenterprise.info/gfwlist\nserver=/yandex.ee/127.0.0.1#5335\nipset=/yandex.ee/gfwlist\nserver=/beatsoutlet.net/127.0.0.1#5335\nipset=/beatsoutlet.net/gfwlist\nserver=/amazonvideodirect.com/127.0.0.1#5335\nipset=/amazonvideodirect.com/gfwlist\nserver=/bmwtampabay.com/127.0.0.1#5335\nipset=/bmwtampabay.com/gfwlist\nserver=/dealbay.com/127.0.0.1#5335\nipset=/dealbay.com/gfwlist\nserver=/opensuse.org/127.0.0.1#5335\nipset=/opensuse.org/gfwlist\nserver=/zeronet.io/127.0.0.1#5335\nipset=/zeronet.io/gfwlist\nserver=/finishinfo.jp/127.0.0.1#5335\nipset=/finishinfo.jp/gfwlist\nserver=/pornstreams.tv/127.0.0.1#5335\nipset=/pornstreams.tv/gfwlist\nserver=/newmonst1erbeatsto1re.com/127.0.0.1#5335\nipset=/newmonst1erbeatsto1re.com/gfwlist\nserver=/qq.design/127.0.0.1#5335\nipset=/qq.design/gfwlist\nserver=/townsvillebulletin.com.au/127.0.0.1#5335\nipset=/townsvillebulletin.com.au/gfwlist\nserver=/javmuch.com/127.0.0.1#5335\nipset=/javmuch.com/gfwlist\nserver=/jbe-platform.com/127.0.0.1#5335\nipset=/jbe-platform.com/gfwlist\nserver=/huffpostbrasil.com/127.0.0.1#5335\nipset=/huffpostbrasil.com/gfwlist\nserver=/totoleak.com/127.0.0.1#5335\nipset=/totoleak.com/gfwlist\nserver=/facebook30.net/127.0.0.1#5335\nipset=/facebook30.net/gfwlist\nserver=/mastercard.my/127.0.0.1#5335\nipset=/mastercard.my/gfwlist\nserver=/sexarea.org/127.0.0.1#5335\nipset=/sexarea.org/gfwlist\nserver=/digicert.com/127.0.0.1#5335\nipset=/digicert.com/gfwlist\nserver=/straightouttasomewhere.com/127.0.0.1#5335\nipset=/straightouttasomewhere.com/gfwlist\nserver=/vtvan.com/127.0.0.1#5335\nipset=/vtvan.com/gfwlist\nserver=/filmesdesexo.blog/127.0.0.1#5335\nipset=/filmesdesexo.blog/gfwlist\nserver=/netflixdnstest2.com/127.0.0.1#5335\nipset=/netflixdnstest2.com/gfwlist\nserver=/pornoslon.me/127.0.0.1#5335\nipset=/pornoslon.me/gfwlist\nserver=/cashpassport.com/127.0.0.1#5335\nipset=/cashpassport.com/gfwlist\nserver=/osdn.net/127.0.0.1#5335\nipset=/osdn.net/gfwlist\nserver=/doujin-eromanga.com/127.0.0.1#5335\nipset=/doujin-eromanga.com/gfwlist\nserver=/youtube.com.ec/127.0.0.1#5335\nipset=/youtube.com.ec/gfwlist\nserver=/icloudbox.net/127.0.0.1#5335\nipset=/icloudbox.net/gfwlist\nserver=/google.kg/127.0.0.1#5335\nipset=/google.kg/gfwlist\nserver=/paypal-proserv.com/127.0.0.1#5335\nipset=/paypal-proserv.com/gfwlist\nserver=/cheapbeatsbydreonsale.com/127.0.0.1#5335\nipset=/cheapbeatsbydreonsale.com/gfwlist\nserver=/facbool.com/127.0.0.1#5335\nipset=/facbool.com/gfwlist\nserver=/tencent.design/127.0.0.1#5335\nipset=/tencent.design/gfwlist\nserver=/localizecdn.com/127.0.0.1#5335\nipset=/localizecdn.com/gfwlist\nserver=/shadowslaves.com/127.0.0.1#5335\nipset=/shadowslaves.com/gfwlist\nserver=/office365tw.com/127.0.0.1#5335\nipset=/office365tw.com/gfwlist\nserver=/onedrive.co.uk/127.0.0.1#5335\nipset=/onedrive.co.uk/gfwlist\nserver=/xogogo.com/127.0.0.1#5335\nipset=/xogogo.com/gfwlist\nserver=/github.blog/127.0.0.1#5335\nipset=/github.blog/gfwlist\nserver=/yahoo.com.pk/127.0.0.1#5335\nipset=/yahoo.com.pk/gfwlist\nserver=/macromedia.com/127.0.0.1#5335\nipset=/macromedia.com/gfwlist\nserver=/appleone.club/127.0.0.1#5335\nipset=/appleone.club/gfwlist\nserver=/volvobuses.tn/127.0.0.1#5335\nipset=/volvobuses.tn/gfwlist\nserver=/nubilefilms.com/127.0.0.1#5335\nipset=/nubilefilms.com/gfwlist\nserver=/admeld.com/127.0.0.1#5335\nipset=/admeld.com/gfwlist\nserver=/worldsecuresystems.com/127.0.0.1#5335\nipset=/worldsecuresystems.com/gfwlist\nserver=/freeanimalporn.net/127.0.0.1#5335\nipset=/freeanimalporn.net/gfwlist\nserver=/redmatureporn.com/127.0.0.1#5335\nipset=/redmatureporn.com/gfwlist\nserver=/3dsexgames.biz/127.0.0.1#5335\nipset=/3dsexgames.biz/gfwlist\nserver=/voadeewanews.com/127.0.0.1#5335\nipset=/voadeewanews.com/gfwlist\nserver=/bttzyw.com/127.0.0.1#5335\nipset=/bttzyw.com/gfwlist\nserver=/gorin.jp/127.0.0.1#5335\nipset=/gorin.jp/gfwlist\nserver=/pornprosnetwork.com/127.0.0.1#5335\nipset=/pornprosnetwork.com/gfwlist\nserver=/singtaoopo.com/127.0.0.1#5335\nipset=/singtaoopo.com/gfwlist\nserver=/xkeezmovies.com/127.0.0.1#5335\nipset=/xkeezmovies.com/gfwlist\nserver=/bestialitytaboo.tv/127.0.0.1#5335\nipset=/bestialitytaboo.tv/gfwlist\nserver=/sexy-models.net/127.0.0.1#5335\nipset=/sexy-models.net/gfwlist\nserver=/centrino.com/127.0.0.1#5335\nipset=/centrino.com/gfwlist\nserver=/paulsimon-music.com/127.0.0.1#5335\nipset=/paulsimon-music.com/gfwlist\nserver=/beatsodre.com/127.0.0.1#5335\nipset=/beatsodre.com/gfwlist\nserver=/simcity-buildit.com/127.0.0.1#5335\nipset=/simcity-buildit.com/gfwlist\nserver=/jstor.org/127.0.0.1#5335\nipset=/jstor.org/gfwlist\nserver=/urlgalleries.net/127.0.0.1#5335\nipset=/urlgalleries.net/gfwlist\nserver=/businessinsider.com.pl/127.0.0.1#5335\nipset=/businessinsider.com.pl/gfwlist\nserver=/wowyoungporn.com/127.0.0.1#5335\nipset=/wowyoungporn.com/gfwlist\nserver=/rbeuroinfo.com/127.0.0.1#5335\nipset=/rbeuroinfo.com/gfwlist\nserver=/265sdwe3.com/127.0.0.1#5335\nipset=/265sdwe3.com/gfwlist\nserver=/iwank.tv/127.0.0.1#5335\nipset=/iwank.tv/gfwlist\nserver=/cdnjs.com/127.0.0.1#5335\nipset=/cdnjs.com/gfwlist\nserver=/privateclassics.com/127.0.0.1#5335\nipset=/privateclassics.com/gfwlist\nserver=/feedly.com/127.0.0.1#5335\nipset=/feedly.com/gfwlist\nserver=/xnxx.tv/127.0.0.1#5335\nipset=/xnxx.tv/gfwlist\nserver=/bmw-connecteddrive.fr/127.0.0.1#5335\nipset=/bmw-connecteddrive.fr/gfwlist\nserver=/rbnainternational.com/127.0.0.1#5335\nipset=/rbnainternational.com/gfwlist\nserver=/wankoz.com/127.0.0.1#5335\nipset=/wankoz.com/gfwlist\nserver=/analfuckvideo.com/127.0.0.1#5335\nipset=/analfuckvideo.com/gfwlist\nserver=/microsofttradein.com/127.0.0.1#5335\nipset=/microsofttradein.com/gfwlist\nserver=/statics-marketingsites-wcus-ms-com.akamaized.net/127.0.0.1#5335\nipset=/statics-marketingsites-wcus-ms-com.akamaized.net/gfwlist\nserver=/c4rex.co/127.0.0.1#5335\nipset=/c4rex.co/gfwlist\nserver=/fapopedia.net/127.0.0.1#5335\nipset=/fapopedia.net/gfwlist\nserver=/kamababa.com/127.0.0.1#5335\nipset=/kamababa.com/gfwlist\nserver=/videosdepornografia.blog.br/127.0.0.1#5335\nipset=/videosdepornografia.blog.br/gfwlist\nserver=/thomsonreuters.com.au/127.0.0.1#5335\nipset=/thomsonreuters.com.au/gfwlist\nserver=/thrixxx.com/127.0.0.1#5335\nipset=/thrixxx.com/gfwlist\nserver=/amazontrust.com/127.0.0.1#5335\nipset=/amazontrust.com/gfwlist\nserver=/porndroids.com/127.0.0.1#5335\nipset=/porndroids.com/gfwlist\nserver=/viddeo-jav.net/127.0.0.1#5335\nipset=/viddeo-jav.net/gfwlist\nserver=/qmov.com/127.0.0.1#5335\nipset=/qmov.com/gfwlist\nserver=/seasidestory.tokyo/127.0.0.1#5335\nipset=/seasidestory.tokyo/gfwlist\nserver=/nikebiz.info/127.0.0.1#5335\nipset=/nikebiz.info/gfwlist\nserver=/4hu.tv/127.0.0.1#5335\nipset=/4hu.tv/gfwlist\nserver=/crustwebsites.net/127.0.0.1#5335\nipset=/crustwebsites.net/gfwlist\nserver=/srtcdn.net/127.0.0.1#5335\nipset=/srtcdn.net/gfwlist\nserver=/facebookw.com/127.0.0.1#5335\nipset=/facebookw.com/gfwlist\nserver=/monsterbeatsstore.com/127.0.0.1#5335\nipset=/monsterbeatsstore.com/gfwlist\nserver=/volvotrucks.id/127.0.0.1#5335\nipset=/volvotrucks.id/gfwlist\nserver=/sextubebox.com/127.0.0.1#5335\nipset=/sextubebox.com/gfwlist\nserver=/femalefounderscomp.com/127.0.0.1#5335\nipset=/femalefounderscomp.com/gfwlist\nserver=/sexecherche.com/127.0.0.1#5335\nipset=/sexecherche.com/gfwlist\nserver=/classymomsex.com/127.0.0.1#5335\nipset=/classymomsex.com/gfwlist\nserver=/pokemonblackwhite.com/127.0.0.1#5335\nipset=/pokemonblackwhite.com/gfwlist\nserver=/monsterbeats-onsale.com/127.0.0.1#5335\nipset=/monsterbeats-onsale.com/gfwlist\nserver=/amazonsdi.com/127.0.0.1#5335\nipset=/amazonsdi.com/gfwlist\nserver=/iwantgalleries.com/127.0.0.1#5335\nipset=/iwantgalleries.com/gfwlist\nserver=/kimosex.com/127.0.0.1#5335\nipset=/kimosex.com/gfwlist\nserver=/bdsmstreak.com/127.0.0.1#5335\nipset=/bdsmstreak.com/gfwlist\nserver=/optimumssl.com/127.0.0.1#5335\nipset=/optimumssl.com/gfwlist\nserver=/sqlserveronlinux.com/127.0.0.1#5335\nipset=/sqlserveronlinux.com/gfwlist\nserver=/ctee.com.tw/127.0.0.1#5335\nipset=/ctee.com.tw/gfwlist\nserver=/eiu.com/127.0.0.1#5335\nipset=/eiu.com/gfwlist\nserver=/doujin-info.net/127.0.0.1#5335\nipset=/doujin-info.net/gfwlist\nserver=/dropboxpartners.com/127.0.0.1#5335\nipset=/dropboxpartners.com/gfwlist\nserver=/scholar.google.gr/127.0.0.1#5335\nipset=/scholar.google.gr/gfwlist\nserver=/bitflyer.com/127.0.0.1#5335\nipset=/bitflyer.com/gfwlist\nserver=/appleworldwidedeveloper.hb-api.omtrdc.net/127.0.0.1#5335\nipset=/appleworldwidedeveloper.hb-api.omtrdc.net/gfwlist\nserver=/oneapi.com/127.0.0.1#5335\nipset=/oneapi.com/gfwlist\nserver=/amazon.it/127.0.0.1#5335\nipset=/amazon.it/gfwlist\nserver=/mvideoporno.xxx/127.0.0.1#5335\nipset=/mvideoporno.xxx/gfwlist\nserver=/fappeningthots.com/127.0.0.1#5335\nipset=/fappeningthots.com/gfwlist\nserver=/buddymedia.com/127.0.0.1#5335\nipset=/buddymedia.com/gfwlist\nserver=/ipod.com.fr/127.0.0.1#5335\nipset=/ipod.com.fr/gfwlist\nserver=/thegithubshop.com/127.0.0.1#5335\nipset=/thegithubshop.com/gfwlist\nserver=/mu6bce1c.xyz/127.0.0.1#5335\nipset=/mu6bce1c.xyz/gfwlist\nserver=/google.com.gh/127.0.0.1#5335\nipset=/google.com.gh/gfwlist\nserver=/stacksnippets.net/127.0.0.1#5335\nipset=/stacksnippets.net/gfwlist\nserver=/shenyunperformingarts.org/127.0.0.1#5335\nipset=/shenyunperformingarts.org/gfwlist\nserver=/gotporn.com/127.0.0.1#5335\nipset=/gotporn.com/gfwlist\nserver=/voabambara.com/127.0.0.1#5335\nipset=/voabambara.com/gfwlist\nserver=/porngub.com/127.0.0.1#5335\nipset=/porngub.com/gfwlist\nserver=/vscode-cdn.net/127.0.0.1#5335\nipset=/vscode-cdn.net/gfwlist\nserver=/sexsim.com/127.0.0.1#5335\nipset=/sexsim.com/gfwlist\nserver=/veet.co.kr/127.0.0.1#5335\nipset=/veet.co.kr/gfwlist\nserver=/pandamovies.pw/127.0.0.1#5335\nipset=/pandamovies.pw/gfwlist\nserver=/paypal-center.info/127.0.0.1#5335\nipset=/paypal-center.info/gfwlist\nserver=/watch-my-gf.com/127.0.0.1#5335\nipset=/watch-my-gf.com/gfwlist\nserver=/zohowebstatic.com/127.0.0.1#5335\nipset=/zohowebstatic.com/gfwlist\nserver=/paypal-marketing.com/127.0.0.1#5335\nipset=/paypal-marketing.com/gfwlist\nserver=/hackthedrive.com/127.0.0.1#5335\nipset=/hackthedrive.com/gfwlist\nserver=/liketwice.com/127.0.0.1#5335\nipset=/liketwice.com/gfwlist\nserver=/target.com/127.0.0.1#5335\nipset=/target.com/gfwlist\nserver=/viu.tv/127.0.0.1#5335\nipset=/viu.tv/gfwlist\nserver=/art1lib.com/127.0.0.1#5335\nipset=/art1lib.com/gfwlist\nserver=/theuab.net/127.0.0.1#5335\nipset=/theuab.net/gfwlist\nserver=/djreprints.com/127.0.0.1#5335\nipset=/djreprints.com/gfwlist\nserver=/sexu.com/127.0.0.1#5335\nipset=/sexu.com/gfwlist\nserver=/2013pascherbeatsbydre.com/127.0.0.1#5335\nipset=/2013pascherbeatsbydre.com/gfwlist\nserver=/sspanel.net/127.0.0.1#5335\nipset=/sspanel.net/gfwlist\nserver=/vmwxw.com/127.0.0.1#5335\nipset=/vmwxw.com/gfwlist\nserver=/proctoscopeexam.com/127.0.0.1#5335\nipset=/proctoscopeexam.com/gfwlist\nserver=/facebook4business.com/127.0.0.1#5335\nipset=/facebook4business.com/gfwlist\nserver=/mdnkids.com/127.0.0.1#5335\nipset=/mdnkids.com/gfwlist\nserver=/realclearenergy.org/127.0.0.1#5335\nipset=/realclearenergy.org/gfwlist\nserver=/jusmynote.wordpress.com/127.0.0.1#5335\nipset=/jusmynote.wordpress.com/gfwlist\nserver=/monsterbeatsbydreshop.com/127.0.0.1#5335\nipset=/monsterbeatsbydreshop.com/gfwlist\nserver=/silkengirl.com/127.0.0.1#5335\nipset=/silkengirl.com/gfwlist\nserver=/pornbest.org/127.0.0.1#5335\nipset=/pornbest.org/gfwlist\nserver=/visa.hk/127.0.0.1#5335\nipset=/visa.hk/gfwlist\nserver=/bmw-connecteddrive.lt/127.0.0.1#5335\nipset=/bmw-connecteddrive.lt/gfwlist\nserver=/monsterdrebeats-usa.net/127.0.0.1#5335\nipset=/monsterdrebeats-usa.net/gfwlist\nserver=/foxneo.com/127.0.0.1#5335\nipset=/foxneo.com/gfwlist\nserver=/cisco-warrantyfinder.com/127.0.0.1#5335\nipset=/cisco-warrantyfinder.com/gfwlist\nserver=/weverse.io/127.0.0.1#5335\nipset=/weverse.io/gfwlist\nserver=/ftvgirls.com/127.0.0.1#5335\nipset=/ftvgirls.com/gfwlist\nserver=/bukkake.link/127.0.0.1#5335\nipset=/bukkake.link/gfwlist\nserver=/snapchat.com/127.0.0.1#5335\nipset=/snapchat.com/gfwlist\nserver=/primecurves.com/127.0.0.1#5335\nipset=/primecurves.com/gfwlist\nserver=/ahpornotube.com/127.0.0.1#5335\nipset=/ahpornotube.com/gfwlist\nserver=/iwantporn.net/127.0.0.1#5335\nipset=/iwantporn.net/gfwlist\nserver=/bmwzentrum.com/127.0.0.1#5335\nipset=/bmwzentrum.com/gfwlist\nserver=/mastercard.de/127.0.0.1#5335\nipset=/mastercard.de/gfwlist\nserver=/alphabet.org.uk/127.0.0.1#5335\nipset=/alphabet.org.uk/gfwlist\nserver=/umamusume.akamaized.net/127.0.0.1#5335\nipset=/umamusume.akamaized.net/gfwlist\nserver=/yahoo.com.uy/127.0.0.1#5335\nipset=/yahoo.com.uy/gfwlist\nserver=/mwhentai.net/127.0.0.1#5335\nipset=/mwhentai.net/gfwlist\nserver=/hbogoasia.hk/127.0.0.1#5335\nipset=/hbogoasia.hk/gfwlist\nserver=/bmw-connecteddrive.co.nz/127.0.0.1#5335\nipset=/bmw-connecteddrive.co.nz/gfwlist\nserver=/hotmail.net/127.0.0.1#5335\nipset=/hotmail.net/gfwlist\nserver=/youtube.com.ly/127.0.0.1#5335\nipset=/youtube.com.ly/gfwlist\nserver=/caime.xyz/127.0.0.1#5335\nipset=/caime.xyz/gfwlist\nserver=/curve.fi/127.0.0.1#5335\nipset=/curve.fi/gfwlist\nserver=/monsterbeatsshops.net/127.0.0.1#5335\nipset=/monsterbeatsshops.net/gfwlist\nserver=/vanish.sk/127.0.0.1#5335\nipset=/vanish.sk/gfwlist\nserver=/hentai2.net/127.0.0.1#5335\nipset=/hentai2.net/gfwlist\nserver=/enfabebe.com/127.0.0.1#5335\nipset=/enfabebe.com/gfwlist\nserver=/bmwgroup.jobs/127.0.0.1#5335\nipset=/bmwgroup.jobs/gfwlist\nserver=/lacomics.org/127.0.0.1#5335\nipset=/lacomics.org/gfwlist\nserver=/homedepot-static.com/127.0.0.1#5335\nipset=/homedepot-static.com/gfwlist\nserver=/postyourgirls.ws/127.0.0.1#5335\nipset=/postyourgirls.ws/gfwlist\nserver=/onlynudes.org/127.0.0.1#5335\nipset=/onlynudes.org/gfwlist\nserver=/leagueoflegends.co.kr/127.0.0.1#5335\nipset=/leagueoflegends.co.kr/gfwlist\nserver=/mastercard.com.mx/127.0.0.1#5335\nipset=/mastercard.com.mx/gfwlist\nserver=/duoweiweek.com/127.0.0.1#5335\nipset=/duoweiweek.com/gfwlist\nserver=/sexvideos.tel/127.0.0.1#5335\nipset=/sexvideos.tel/gfwlist\nserver=/integral7.com/127.0.0.1#5335\nipset=/integral7.com/gfwlist\nserver=/now.sh/127.0.0.1#5335\nipset=/now.sh/gfwlist\nserver=/madshi.net/127.0.0.1#5335\nipset=/madshi.net/gfwlist\nserver=/visa.com/127.0.0.1#5335\nipset=/visa.com/gfwlist\nserver=/techstreet.com/127.0.0.1#5335\nipset=/techstreet.com/gfwlist\nserver=/vanish.es/127.0.0.1#5335\nipset=/vanish.es/gfwlist\nserver=/adventofcode.com/127.0.0.1#5335\nipset=/adventofcode.com/gfwlist\nserver=/mastercard.com.gt/127.0.0.1#5335\nipset=/mastercard.com.gt/gfwlist\nserver=/applestore.co.uk/127.0.0.1#5335\nipset=/applestore.co.uk/gfwlist\nserver=/sheflix.com/127.0.0.1#5335\nipset=/sheflix.com/gfwlist\nserver=/9ccms.me/127.0.0.1#5335\nipset=/9ccms.me/gfwlist\nserver=/verisign.com.vn/127.0.0.1#5335\nipset=/verisign.com.vn/gfwlist\nserver=/apple.ca/127.0.0.1#5335\nipset=/apple.ca/gfwlist\nserver=/thehulubraintrust.com/127.0.0.1#5335\nipset=/thehulubraintrust.com/gfwlist\nserver=/older-women-porn.com/127.0.0.1#5335\nipset=/older-women-porn.com/gfwlist\nserver=/5q5zu9f1.me/127.0.0.1#5335\nipset=/5q5zu9f1.me/gfwlist\nserver=/whereilive.com.au/127.0.0.1#5335\nipset=/whereilive.com.au/gfwlist\nserver=/microsoftsilverlight.com/127.0.0.1#5335\nipset=/microsoftsilverlight.com/gfwlist\nserver=/bmw-motorrad.fi/127.0.0.1#5335\nipset=/bmw-motorrad.fi/gfwlist\nserver=/sextubedot.com/127.0.0.1#5335\nipset=/sextubedot.com/gfwlist\nserver=/whatbrowser.org/127.0.0.1#5335\nipset=/whatbrowser.org/gfwlist\nserver=/amateurgirlfriends.net/127.0.0.1#5335\nipset=/amateurgirlfriends.net/gfwlist\nserver=/globalsign.nl/127.0.0.1#5335\nipset=/globalsign.nl/gfwlist\nserver=/mini.my/127.0.0.1#5335\nipset=/mini.my/gfwlist\nserver=/clubhouseapi.com/127.0.0.1#5335\nipset=/clubhouseapi.com/gfwlist\nserver=/sale-nikeshoes.com/127.0.0.1#5335\nipset=/sale-nikeshoes.com/gfwlist\nserver=/fapxl.com/127.0.0.1#5335\nipset=/fapxl.com/gfwlist\nserver=/hentaicore.net/127.0.0.1#5335\nipset=/hentaicore.net/gfwlist\nserver=/wsjmediakit.com/127.0.0.1#5335\nipset=/wsjmediakit.com/gfwlist\nserver=/haskell.org/127.0.0.1#5335\nipset=/haskell.org/gfwlist\nserver=/moviesarena.com/127.0.0.1#5335\nipset=/moviesarena.com/gfwlist\nserver=/beatsbydreaustraliaonline.com/127.0.0.1#5335\nipset=/beatsbydreaustraliaonline.com/gfwlist\nserver=/scholar.google.fi/127.0.0.1#5335\nipset=/scholar.google.fi/gfwlist\nserver=/visa.com.gy/127.0.0.1#5335\nipset=/visa.com.gy/gfwlist\nserver=/ebaystore77.com/127.0.0.1#5335\nipset=/ebaystore77.com/gfwlist\nserver=/cheapmonsterbeatsbydrdre.com/127.0.0.1#5335\nipset=/cheapmonsterbeatsbydrdre.com/gfwlist\nserver=/scientificamerican.com/127.0.0.1#5335\nipset=/scientificamerican.com/gfwlist\nserver=/ebayopensource.com/127.0.0.1#5335\nipset=/ebayopensource.com/gfwlist\nserver=/xtube.com/127.0.0.1#5335\nipset=/xtube.com/gfwlist\nserver=/0xxx.ws/127.0.0.1#5335\nipset=/0xxx.ws/gfwlist\nserver=/omobi.cc/127.0.0.1#5335\nipset=/omobi.cc/gfwlist\nserver=/bestbuy-audio.com/127.0.0.1#5335\nipset=/bestbuy-audio.com/gfwlist\nserver=/herodex.org/127.0.0.1#5335\nipset=/herodex.org/gfwlist\nserver=/deps.info/127.0.0.1#5335\nipset=/deps.info/gfwlist\nserver=/hpsuresupply.com/127.0.0.1#5335\nipset=/hpsuresupply.com/gfwlist\nserver=/worldflipper.jp/127.0.0.1#5335\nipset=/worldflipper.jp/gfwlist\nserver=/foxneodigital.com/127.0.0.1#5335\nipset=/foxneodigital.com/gfwlist\nserver=/hpccp.com/127.0.0.1#5335\nipset=/hpccp.com/gfwlist\nserver=/mini.no/127.0.0.1#5335\nipset=/mini.no/gfwlist\nserver=/amateursexstart.nl/127.0.0.1#5335\nipset=/amateursexstart.nl/gfwlist\nserver=/accountkit.com/127.0.0.1#5335\nipset=/accountkit.com/gfwlist\nserver=/facebookcovers.org/127.0.0.1#5335\nipset=/facebookcovers.org/gfwlist\nserver=/besztbuy.com/127.0.0.1#5335\nipset=/besztbuy.com/gfwlist\nserver=/digitaldesire.com/127.0.0.1#5335\nipset=/digitaldesire.com/gfwlist\nserver=/canon.com.mk/127.0.0.1#5335\nipset=/canon.com.mk/gfwlist\nserver=/applemusicfestival.com/127.0.0.1#5335\nipset=/applemusicfestival.com/gfwlist\nserver=/xn--d4ty0ojsqzfd.com/127.0.0.1#5335\nipset=/xn--d4ty0ojsqzfd.com/gfwlist\nserver=/notion.new/127.0.0.1#5335\nipset=/notion.new/gfwlist\nserver=/scholar.google.co.th/127.0.0.1#5335\nipset=/scholar.google.co.th/gfwlist\nserver=/4beatsbydre.com/127.0.0.1#5335\nipset=/4beatsbydre.com/gfwlist\nserver=/5beatsbydre.com/127.0.0.1#5335\nipset=/5beatsbydre.com/gfwlist\nserver=/erotera.blogo.jp/127.0.0.1#5335\nipset=/erotera.blogo.jp/gfwlist\nserver=/beatsbydreheadphonesolo.com/127.0.0.1#5335\nipset=/beatsbydreheadphonesolo.com/gfwlist\nserver=/mostly.jp/127.0.0.1#5335\nipset=/mostly.jp/gfwlist\nserver=/drebeats-singapore.com/127.0.0.1#5335\nipset=/drebeats-singapore.com/gfwlist\nserver=/google.lt/127.0.0.1#5335\nipset=/google.lt/gfwlist\nserver=/disneylatino.com/127.0.0.1#5335\nipset=/disneylatino.com/gfwlist\nserver=/grupobmw.com/127.0.0.1#5335\nipset=/grupobmw.com/gfwlist\nserver=/minisolife.co.za/127.0.0.1#5335\nipset=/minisolife.co.za/gfwlist\nserver=/fox-news.com/127.0.0.1#5335\nipset=/fox-news.com/gfwlist\nserver=/monsterbeatsbydrdrecanada.com/127.0.0.1#5335\nipset=/monsterbeatsbydrdrecanada.com/gfwlist\nserver=/pinterest.co.kr/127.0.0.1#5335\nipset=/pinterest.co.kr/gfwlist\nserver=/localbitcoins.com/127.0.0.1#5335\nipset=/localbitcoins.com/gfwlist\nserver=/propertysex.com/127.0.0.1#5335\nipset=/propertysex.com/gfwlist\nserver=/h2porn.com/127.0.0.1#5335\nipset=/h2porn.com/gfwlist\nserver=/acmvalidations.com/127.0.0.1#5335\nipset=/acmvalidations.com/gfwlist\nserver=/appleid-uk.us/127.0.0.1#5335\nipset=/appleid-uk.us/gfwlist\nserver=/appyq.com/127.0.0.1#5335\nipset=/appyq.com/gfwlist\nserver=/wasmer.io/127.0.0.1#5335\nipset=/wasmer.io/gfwlist\nserver=/enfamil.com/127.0.0.1#5335\nipset=/enfamil.com/gfwlist\nserver=/pejyyah.com/127.0.0.1#5335\nipset=/pejyyah.com/gfwlist\nserver=/enfamil.pl/127.0.0.1#5335\nipset=/enfamil.pl/gfwlist\nserver=/cy22.tv/127.0.0.1#5335\nipset=/cy22.tv/gfwlist\nserver=/ebayexpress.sg/127.0.0.1#5335\nipset=/ebayexpress.sg/gfwlist\nserver=/casualhomemadesex.com/127.0.0.1#5335\nipset=/casualhomemadesex.com/gfwlist\nserver=/91porn.com/127.0.0.1#5335\nipset=/91porn.com/gfwlist\nserver=/ffotolia.com/127.0.0.1#5335\nipset=/ffotolia.com/gfwlist\nserver=/gfotolia.com/127.0.0.1#5335\nipset=/gfotolia.com/gfwlist\nserver=/bmw-tunisia.com/127.0.0.1#5335\nipset=/bmw-tunisia.com/gfwlist\nserver=/alphera.ca/127.0.0.1#5335\nipset=/alphera.ca/gfwlist\nserver=/tubinge.com/127.0.0.1#5335\nipset=/tubinge.com/gfwlist\nserver=/ibeatsbydre.com/127.0.0.1#5335\nipset=/ibeatsbydre.com/gfwlist\nserver=/spotify.design/127.0.0.1#5335\nipset=/spotify.design/gfwlist\nserver=/zzcartoon.com/127.0.0.1#5335\nipset=/zzcartoon.com/gfwlist\nserver=/ladyboygold.eu/127.0.0.1#5335\nipset=/ladyboygold.eu/gfwlist\nserver=/lethalhardcorevr.com/127.0.0.1#5335\nipset=/lethalhardcorevr.com/gfwlist\nserver=/retroclassicporn.com/127.0.0.1#5335\nipset=/retroclassicporn.com/gfwlist\nserver=/ipadmini.lk/127.0.0.1#5335\nipset=/ipadmini.lk/gfwlist\nserver=/9anime.cz/127.0.0.1#5335\nipset=/9anime.cz/gfwlist\nserver=/shadowsocks.com/127.0.0.1#5335\nipset=/shadowsocks.com/gfwlist\nserver=/chla3.com/127.0.0.1#5335\nipset=/chla3.com/gfwlist\nserver=/young-webcam.net/127.0.0.1#5335\nipset=/young-webcam.net/gfwlist\nserver=/vilavpn2.xyz/127.0.0.1#5335\nipset=/vilavpn2.xyz/gfwlist\nserver=/durexindia.com/127.0.0.1#5335\nipset=/durexindia.com/gfwlist\nserver=/protonmail.com/127.0.0.1#5335\nipset=/protonmail.com/gfwlist\nserver=/aplestore.com/127.0.0.1#5335\nipset=/aplestore.com/gfwlist\nserver=/scholar.google.hn/127.0.0.1#5335\nipset=/scholar.google.hn/gfwlist\nserver=/youtube.com.es/127.0.0.1#5335\nipset=/youtube.com.es/gfwlist\nserver=/letmejerk.fun/127.0.0.1#5335\nipset=/letmejerk.fun/gfwlist\nserver=/movefrees.com/127.0.0.1#5335\nipset=/movefrees.com/gfwlist\nserver=/medium.com/127.0.0.1#5335\nipset=/medium.com/gfwlist\nserver=/insidemacintosh.com/127.0.0.1#5335\nipset=/insidemacintosh.com/gfwlist\nserver=/gslink.us/127.0.0.1#5335\nipset=/gslink.us/gfwlist\nserver=/ehwiki.org/127.0.0.1#5335\nipset=/ehwiki.org/gfwlist\nserver=/twhentai.com/127.0.0.1#5335\nipset=/twhentai.com/gfwlist\nserver=/terapeak.com/127.0.0.1#5335\nipset=/terapeak.com/gfwlist\nserver=/fbooktaiwan.com/127.0.0.1#5335\nipset=/fbooktaiwan.com/gfwlist\nserver=/bmw.am/127.0.0.1#5335\nipset=/bmw.am/gfwlist\nserver=/gisplanning.com/127.0.0.1#5335\nipset=/gisplanning.com/gfwlist\nserver=/bmw.com.ni/127.0.0.1#5335\nipset=/bmw.com.ni/gfwlist\nserver=/bestlistofporn.com/127.0.0.1#5335\nipset=/bestlistofporn.com/gfwlist\nserver=/beatspills.com/127.0.0.1#5335\nipset=/beatspills.com/gfwlist\nserver=/volvobuses.ru/127.0.0.1#5335\nipset=/volvobuses.ru/gfwlist\nserver=/18p2p.com/127.0.0.1#5335\nipset=/18p2p.com/gfwlist\nserver=/pinterest.hu/127.0.0.1#5335\nipset=/pinterest.hu/gfwlist\nserver=/hackfacebook.com/127.0.0.1#5335\nipset=/hackfacebook.com/gfwlist\nserver=/f6988.com/127.0.0.1#5335\nipset=/f6988.com/gfwlist\nserver=/luxuretv.fun/127.0.0.1#5335\nipset=/luxuretv.fun/gfwlist\nserver=/veet.de/127.0.0.1#5335\nipset=/veet.de/gfwlist\nserver=/wordpress.com/127.0.0.1#5335\nipset=/wordpress.com/gfwlist\nserver=/bridgestone.com.co/127.0.0.1#5335\nipset=/bridgestone.com.co/gfwlist\nserver=/ricefever.com/127.0.0.1#5335\nipset=/ricefever.com/gfwlist\nserver=/spotify.com.edgesuite.net/127.0.0.1#5335\nipset=/spotify.com.edgesuite.net/gfwlist\nserver=/paypal-optimizer.com/127.0.0.1#5335\nipset=/paypal-optimizer.com/gfwlist\nserver=/xvds.tv/127.0.0.1#5335\nipset=/xvds.tv/gfwlist\nserver=/soirt4.fun/127.0.0.1#5335\nipset=/soirt4.fun/gfwlist\nserver=/jav-subtitles.com/127.0.0.1#5335\nipset=/jav-subtitles.com/gfwlist\nserver=/rhodeislandbmw.com/127.0.0.1#5335\nipset=/rhodeislandbmw.com/gfwlist\nserver=/videoxxxporn.biz/127.0.0.1#5335\nipset=/videoxxxporn.biz/gfwlist\nserver=/xtubezoo.com/127.0.0.1#5335\nipset=/xtubezoo.com/gfwlist\nserver=/beatsbydre-headphonesshop.com/127.0.0.1#5335\nipset=/beatsbydre-headphonesshop.com/gfwlist\nserver=/beejp.net/127.0.0.1#5335\nipset=/beejp.net/gfwlist\nserver=/pornvideobb.com/127.0.0.1#5335\nipset=/pornvideobb.com/gfwlist\nserver=/famifun.com.tw/127.0.0.1#5335\nipset=/famifun.com.tw/gfwlist\nserver=/beatsbestdeals.com/127.0.0.1#5335\nipset=/beatsbestdeals.com/gfwlist\nserver=/24porn.com/127.0.0.1#5335\nipset=/24porn.com/gfwlist\nserver=/uguisupapa.net/127.0.0.1#5335\nipset=/uguisupapa.net/gfwlist\nserver=/xnxvideos.org/127.0.0.1#5335\nipset=/xnxvideos.org/gfwlist\nserver=/bromite.org/127.0.0.1#5335\nipset=/bromite.org/gfwlist\nserver=/airitilibrary.com/127.0.0.1#5335\nipset=/airitilibrary.com/gfwlist\nserver=/applestore.cc/127.0.0.1#5335\nipset=/applestore.cc/gfwlist\nserver=/itunbes.com/127.0.0.1#5335\nipset=/itunbes.com/gfwlist\nserver=/btec.co.uk/127.0.0.1#5335\nipset=/btec.co.uk/gfwlist\nserver=/intercomassets.com/127.0.0.1#5335\nipset=/intercomassets.com/gfwlist\nserver=/rocksdb.org/127.0.0.1#5335\nipset=/rocksdb.org/gfwlist\nserver=/foxnewssunday.com/127.0.0.1#5335\nipset=/foxnewssunday.com/gfwlist\nserver=/flowtype.org/127.0.0.1#5335\nipset=/flowtype.org/gfwlist\nserver=/alivercm.com/127.0.0.1#5335\nipset=/alivercm.com/gfwlist\nserver=/clipsex.asia/127.0.0.1#5335\nipset=/clipsex.asia/gfwlist\nserver=/futpromos.com/127.0.0.1#5335\nipset=/futpromos.com/gfwlist\nserver=/hutpromos.com/127.0.0.1#5335\nipset=/hutpromos.com/gfwlist\nserver=/science.org/127.0.0.1#5335\nipset=/science.org/gfwlist\nserver=/blogspot.vn/127.0.0.1#5335\nipset=/blogspot.vn/gfwlist\nserver=/webkitgtk.org/127.0.0.1#5335\nipset=/webkitgtk.org/gfwlist\nserver=/bmw.co.id/127.0.0.1#5335\nipset=/bmw.co.id/gfwlist\nserver=/mcrouter.org/127.0.0.1#5335\nipset=/mcrouter.org/gfwlist\nserver=/nushemale.com/127.0.0.1#5335\nipset=/nushemale.com/gfwlist\nserver=/hdpornvideo.xxx/127.0.0.1#5335\nipset=/hdpornvideo.xxx/gfwlist\nserver=/planetsuzy.org/127.0.0.1#5335\nipset=/planetsuzy.org/gfwlist\nserver=/avelip.com/127.0.0.1#5335\nipset=/avelip.com/gfwlist\nserver=/akamaietpcompromisedcnctest.com/127.0.0.1#5335\nipset=/akamaietpcompromisedcnctest.com/gfwlist\nserver=/falundafa.org.tw/127.0.0.1#5335\nipset=/falundafa.org.tw/gfwlist\nserver=/darkcategories.com/127.0.0.1#5335\nipset=/darkcategories.com/gfwlist\nserver=/japanesegirlspictures.com/127.0.0.1#5335\nipset=/japanesegirlspictures.com/gfwlist\nserver=/hotescortdusseldorf.com/127.0.0.1#5335\nipset=/hotescortdusseldorf.com/gfwlist\nserver=/sg1lib.org/127.0.0.1#5335\nipset=/sg1lib.org/gfwlist\nserver=/monsterbeatsheadphone.com/127.0.0.1#5335\nipset=/monsterbeatsheadphone.com/gfwlist\nserver=/videosporno.life/127.0.0.1#5335\nipset=/videosporno.life/gfwlist\nserver=/intel.mk/127.0.0.1#5335\nipset=/intel.mk/gfwlist\nserver=/paypalsurvey.com/127.0.0.1#5335\nipset=/paypalsurvey.com/gfwlist\nserver=/bmw-calgary.ca/127.0.0.1#5335\nipset=/bmw-calgary.ca/gfwlist\nserver=/foxmediacloud.com/127.0.0.1#5335\nipset=/foxmediacloud.com/gfwlist\nserver=/cloudflaressl.com/127.0.0.1#5335\nipset=/cloudflaressl.com/gfwlist\nserver=/kastatic.org/127.0.0.1#5335\nipset=/kastatic.org/gfwlist\nserver=/via0.com/127.0.0.1#5335\nipset=/via0.com/gfwlist\nserver=/kindleoasisnews.com/127.0.0.1#5335\nipset=/kindleoasisnews.com/gfwlist\nserver=/hulugermany.com/127.0.0.1#5335\nipset=/hulugermany.com/gfwlist\nserver=/el-ladies.com/127.0.0.1#5335\nipset=/el-ladies.com/gfwlist\nserver=/foxnewsaffiliates.com/127.0.0.1#5335\nipset=/foxnewsaffiliates.com/gfwlist\nserver=/beatsdreinau.com/127.0.0.1#5335\nipset=/beatsdreinau.com/gfwlist\nserver=/supremacy.com/127.0.0.1#5335\nipset=/supremacy.com/gfwlist\nserver=/appleaccount.net/127.0.0.1#5335\nipset=/appleaccount.net/gfwlist\nserver=/paypal-support.com/127.0.0.1#5335\nipset=/paypal-support.com/gfwlist\nserver=/trithucvn.org/127.0.0.1#5335\nipset=/trithucvn.org/gfwlist\nserver=/visanet.net/127.0.0.1#5335\nipset=/visanet.net/gfwlist\nserver=/appleid-applemx.com/127.0.0.1#5335\nipset=/appleid-applemx.com/gfwlist\nserver=/google.co.id/127.0.0.1#5335\nipset=/google.co.id/gfwlist\nserver=/computingreviews.com/127.0.0.1#5335\nipset=/computingreviews.com/gfwlist\nserver=/nejm.org/127.0.0.1#5335\nipset=/nejm.org/gfwlist\nserver=/qprize.com/127.0.0.1#5335\nipset=/qprize.com/gfwlist\nserver=/huluhuluhuluhulu10.work/127.0.0.1#5335\nipset=/huluhuluhuluhulu10.work/gfwlist\nserver=/mostpopularpornsites.com/127.0.0.1#5335\nipset=/mostpopularpornsites.com/gfwlist\nserver=/directvmurfreesborotn.com/127.0.0.1#5335\nipset=/directvmurfreesborotn.com/gfwlist\nserver=/xbox.eu/127.0.0.1#5335\nipset=/xbox.eu/gfwlist\nserver=/18h.mm-cg.com/127.0.0.1#5335\nipset=/18h.mm-cg.com/gfwlist\nserver=/porncrash.com/127.0.0.1#5335\nipset=/porncrash.com/gfwlist\nserver=/foxsports.com/127.0.0.1#5335\nipset=/foxsports.com/gfwlist\nserver=/advertisercommunity.com/127.0.0.1#5335\nipset=/advertisercommunity.com/gfwlist\nserver=/bestporngames.com/127.0.0.1#5335\nipset=/bestporngames.com/gfwlist\nserver=/3movs.xyz/127.0.0.1#5335\nipset=/3movs.xyz/gfwlist\nserver=/travelex.fr/127.0.0.1#5335\nipset=/travelex.fr/gfwlist\nserver=/facboox.com/127.0.0.1#5335\nipset=/facboox.com/gfwlist\nserver=/newsexxxx.com/127.0.0.1#5335\nipset=/newsexxxx.com/gfwlist\nserver=/lysol.co.cr/127.0.0.1#5335\nipset=/lysol.co.cr/gfwlist\nserver=/unity.com/127.0.0.1#5335\nipset=/unity.com/gfwlist\nserver=/hentai2012.com/127.0.0.1#5335\nipset=/hentai2012.com/gfwlist\nserver=/vkmessenger.com/127.0.0.1#5335\nipset=/vkmessenger.com/gfwlist\nserver=/nettyinternet.com/127.0.0.1#5335\nipset=/nettyinternet.com/gfwlist\nserver=/youtube.de/127.0.0.1#5335\nipset=/youtube.de/gfwlist\nserver=/amateurxx.org/127.0.0.1#5335\nipset=/amateurxx.org/gfwlist\nserver=/guardianapis.com/127.0.0.1#5335\nipset=/guardianapis.com/gfwlist\nserver=/veet.co.in/127.0.0.1#5335\nipset=/veet.co.in/gfwlist\nserver=/harperacademic.com/127.0.0.1#5335\nipset=/harperacademic.com/gfwlist\nserver=/keepmovingwithmovefree.com/127.0.0.1#5335\nipset=/keepmovingwithmovefree.com/gfwlist\nserver=/bridgestone.com/127.0.0.1#5335\nipset=/bridgestone.com/gfwlist\nserver=/vk-portal.net/127.0.0.1#5335\nipset=/vk-portal.net/gfwlist\nserver=/webobjects.com/127.0.0.1#5335\nipset=/webobjects.com/gfwlist\nserver=/nikestore.com/127.0.0.1#5335\nipset=/nikestore.com/gfwlist\nserver=/ipfs.best-practice.se/127.0.0.1#5335\nipset=/ipfs.best-practice.se/gfwlist\nserver=/pse.is/127.0.0.1#5335\nipset=/pse.is/gfwlist\nserver=/volvobuses.it/127.0.0.1#5335\nipset=/volvobuses.it/gfwlist\nserver=/ganjing.com/127.0.0.1#5335\nipset=/ganjing.com/gfwlist\nserver=/crazy-amateurs.com/127.0.0.1#5335\nipset=/crazy-amateurs.com/gfwlist\nserver=/youtube.co.tz/127.0.0.1#5335\nipset=/youtube.co.tz/gfwlist\nserver=/fullhdxxx.com/127.0.0.1#5335\nipset=/fullhdxxx.com/gfwlist\nserver=/paypal.so/127.0.0.1#5335\nipset=/paypal.so/gfwlist\nserver=/aiv-cdn.net/127.0.0.1#5335\nipset=/aiv-cdn.net/gfwlist\nserver=/pinterest.com/127.0.0.1#5335\nipset=/pinterest.com/gfwlist\nserver=/mktdns.com/127.0.0.1#5335\nipset=/mktdns.com/gfwlist\nserver=/api.ai/127.0.0.1#5335\nipset=/api.ai/gfwlist\nserver=/iafd.com/127.0.0.1#5335\nipset=/iafd.com/gfwlist\nserver=/videoleak.me/127.0.0.1#5335\nipset=/videoleak.me/gfwlist\nserver=/meadjohnson.com.tw/127.0.0.1#5335\nipset=/meadjohnson.com.tw/gfwlist\nserver=/googleearth.com/127.0.0.1#5335\nipset=/googleearth.com/gfwlist\nserver=/celebsporno.com/127.0.0.1#5335\nipset=/celebsporno.com/gfwlist\nserver=/megaphone.fm/127.0.0.1#5335\nipset=/megaphone.fm/gfwlist\nserver=/xh-porn.com/127.0.0.1#5335\nipset=/xh-porn.com/gfwlist\nserver=/sextreffen-portale.com/127.0.0.1#5335\nipset=/sextreffen-portale.com/gfwlist\nserver=/hypodermicinjectiononline.com/127.0.0.1#5335\nipset=/hypodermicinjectiononline.com/gfwlist\nserver=/akastream.net/127.0.0.1#5335\nipset=/akastream.net/gfwlist\nserver=/appletvapp.apple/127.0.0.1#5335\nipset=/appletvapp.apple/gfwlist\nserver=/clarivate.com/127.0.0.1#5335\nipset=/clarivate.com/gfwlist\nserver=/blogspot.com.ee/127.0.0.1#5335\nipset=/blogspot.com.ee/gfwlist\nserver=/pwabuilder.com/127.0.0.1#5335\nipset=/pwabuilder.com/gfwlist\nserver=/rushporn.online/127.0.0.1#5335\nipset=/rushporn.online/gfwlist\nserver=/hanzhen.xmulib.org/127.0.0.1#5335\nipset=/hanzhen.xmulib.org/gfwlist\nserver=/centrino.net/127.0.0.1#5335\nipset=/centrino.net/gfwlist\nserver=/facebooksignup.net/127.0.0.1#5335\nipset=/facebooksignup.net/gfwlist\nserver=/vfsco.com.tr/127.0.0.1#5335\nipset=/vfsco.com.tr/gfwlist\nserver=/milfs-gone-wild.com/127.0.0.1#5335\nipset=/milfs-gone-wild.com/gfwlist\nserver=/chillingo.com/127.0.0.1#5335\nipset=/chillingo.com/gfwlist\nserver=/pornvidhd.club/127.0.0.1#5335\nipset=/pornvidhd.club/gfwlist\nserver=/hentaicovid.com/127.0.0.1#5335\nipset=/hentaicovid.com/gfwlist\nserver=/adidas.se/127.0.0.1#5335\nipset=/adidas.se/gfwlist\nserver=/vfsco.co.za/127.0.0.1#5335\nipset=/vfsco.co.za/gfwlist\nserver=/artnudegalleries.com/127.0.0.1#5335\nipset=/artnudegalleries.com/gfwlist\nserver=/sextubexxl.com/127.0.0.1#5335\nipset=/sextubexxl.com/gfwlist\nserver=/redxxx.cc/127.0.0.1#5335\nipset=/redxxx.cc/gfwlist\nserver=/arabxn.com/127.0.0.1#5335\nipset=/arabxn.com/gfwlist\nserver=/camvideos.tv/127.0.0.1#5335\nipset=/camvideos.tv/gfwlist\nserver=/herokuapp.com/127.0.0.1#5335\nipset=/herokuapp.com/gfwlist\nserver=/beatsmusic.com/127.0.0.1#5335\nipset=/beatsmusic.com/gfwlist\nserver=/youtube.jp/127.0.0.1#5335\nipset=/youtube.jp/gfwlist\nserver=/scathd.com/127.0.0.1#5335\nipset=/scathd.com/gfwlist\nserver=/sextoystop.com/127.0.0.1#5335\nipset=/sextoystop.com/gfwlist\nserver=/camstagestudio.com/127.0.0.1#5335\nipset=/camstagestudio.com/gfwlist\nserver=/ccstatic.org/127.0.0.1#5335\nipset=/ccstatic.org/gfwlist\nserver=/gettyimages.fr/127.0.0.1#5335\nipset=/gettyimages.fr/gfwlist\nserver=/fury.blog/127.0.0.1#5335\nipset=/fury.blog/gfwlist\nserver=/maileoch.com/127.0.0.1#5335\nipset=/maileoch.com/gfwlist\nserver=/nextwork.com.hk/127.0.0.1#5335\nipset=/nextwork.com.hk/gfwlist\nserver=/1bigclub.com/127.0.0.1#5335\nipset=/1bigclub.com/gfwlist\nserver=/bmw.by/127.0.0.1#5335\nipset=/bmw.by/gfwlist\nserver=/mitpressjournals.org/127.0.0.1#5335\nipset=/mitpressjournals.org/gfwlist\nserver=/gobeatsye.com/127.0.0.1#5335\nipset=/gobeatsye.com/gfwlist\nserver=/xn--d1acpjx3f.xn--p1ai/127.0.0.1#5335\nipset=/xn--d1acpjx3f.xn--p1ai/gfwlist\nserver=/lcgirls.com/127.0.0.1#5335\nipset=/lcgirls.com/gfwlist\nserver=/spizoo.com/127.0.0.1#5335\nipset=/spizoo.com/gfwlist\nserver=/pricelessafrica.com/127.0.0.1#5335\nipset=/pricelessafrica.com/gfwlist\nserver=/fox42kptm.com/127.0.0.1#5335\nipset=/fox42kptm.com/gfwlist\nserver=/xhot.pro/127.0.0.1#5335\nipset=/xhot.pro/gfwlist\nserver=/html5rocks.com/127.0.0.1#5335\nipset=/html5rocks.com/gfwlist\nserver=/ieee-aess.org/127.0.0.1#5335\nipset=/ieee-aess.org/gfwlist\nserver=/zoo-hardcore.com/127.0.0.1#5335\nipset=/zoo-hardcore.com/gfwlist\nserver=/pictocum.com/127.0.0.1#5335\nipset=/pictocum.com/gfwlist\nserver=/zukunftswerkstatt.de/127.0.0.1#5335\nipset=/zukunftswerkstatt.de/gfwlist\nserver=/mangahasu.se/127.0.0.1#5335\nipset=/mangahasu.se/gfwlist\nserver=/fox10news.com/127.0.0.1#5335\nipset=/fox10news.com/gfwlist\nserver=/intel.co.kr/127.0.0.1#5335\nipset=/intel.co.kr/gfwlist\nserver=/seematureporn.com/127.0.0.1#5335\nipset=/seematureporn.com/gfwlist\nserver=/vfsco.be/127.0.0.1#5335\nipset=/vfsco.be/gfwlist\nserver=/atnext.com/127.0.0.1#5335\nipset=/atnext.com/gfwlist\nserver=/zooyouporn.com/127.0.0.1#5335\nipset=/zooyouporn.com/gfwlist\nserver=/damnhotz.com/127.0.0.1#5335\nipset=/damnhotz.com/gfwlist\nserver=/asmhentai.com/127.0.0.1#5335\nipset=/asmhentai.com/gfwlist\nserver=/fairmarket.com/127.0.0.1#5335\nipset=/fairmarket.com/gfwlist\nserver=/scandalplanet.com/127.0.0.1#5335\nipset=/scandalplanet.com/gfwlist\nserver=/chocolatey.org/127.0.0.1#5335\nipset=/chocolatey.org/gfwlist\nserver=/iceporncasting.com/127.0.0.1#5335\nipset=/iceporncasting.com/gfwlist\nserver=/imperial.insendi.com/127.0.0.1#5335\nipset=/imperial.insendi.com/gfwlist\nserver=/illusnoi.com/127.0.0.1#5335\nipset=/illusnoi.com/gfwlist\nserver=/intellij.com/127.0.0.1#5335\nipset=/intellij.com/gfwlist\nserver=/wxoyt.com/127.0.0.1#5335\nipset=/wxoyt.com/gfwlist\nserver=/shopeemobile.com/127.0.0.1#5335\nipset=/shopeemobile.com/gfwlist\nserver=/mini-connected.com/127.0.0.1#5335\nipset=/mini-connected.com/gfwlist\nserver=/pornfoolery.com/127.0.0.1#5335\nipset=/pornfoolery.com/gfwlist\nserver=/wowgirls.com/127.0.0.1#5335\nipset=/wowgirls.com/gfwlist\nserver=/polygon.com/127.0.0.1#5335\nipset=/polygon.com/gfwlist\nserver=/sexbombo.com/127.0.0.1#5335\nipset=/sexbombo.com/gfwlist\nserver=/intellij.net/127.0.0.1#5335\nipset=/intellij.net/gfwlist\nserver=/sankei-kaihatsu.co.jp/127.0.0.1#5335\nipset=/sankei-kaihatsu.co.jp/gfwlist\nserver=/truyen-hentai.com/127.0.0.1#5335\nipset=/truyen-hentai.com/gfwlist\nserver=/minisexdoll.com/127.0.0.1#5335\nipset=/minisexdoll.com/gfwlist\nserver=/yahoo.nl/127.0.0.1#5335\nipset=/yahoo.nl/gfwlist\nserver=/telex.cc/127.0.0.1#5335\nipset=/telex.cc/gfwlist\nserver=/volvopenta.com.br/127.0.0.1#5335\nipset=/volvopenta.com.br/gfwlist\nserver=/golosameriki.com/127.0.0.1#5335\nipset=/golosameriki.com/gfwlist\nserver=/videosmadeathome.com/127.0.0.1#5335\nipset=/videosmadeathome.com/gfwlist\nserver=/chemnetbase.com/127.0.0.1#5335\nipset=/chemnetbase.com/gfwlist\nserver=/facebookgroups.com/127.0.0.1#5335\nipset=/facebookgroups.com/gfwlist\nserver=/akamaiphillipines.com/127.0.0.1#5335\nipset=/akamaiphillipines.com/gfwlist\nserver=/thefacebook.net/127.0.0.1#5335\nipset=/thefacebook.net/gfwlist\nserver=/cozydrdrebeats.com/127.0.0.1#5335\nipset=/cozydrdrebeats.com/gfwlist\nserver=/onlineinstagram.com/127.0.0.1#5335\nipset=/onlineinstagram.com/gfwlist\nserver=/velostrata.com/127.0.0.1#5335\nipset=/velostrata.com/gfwlist\nserver=/ebay.pk/127.0.0.1#5335\nipset=/ebay.pk/gfwlist\nserver=/hkcnews.com/127.0.0.1#5335\nipset=/hkcnews.com/gfwlist\nserver=/yahoo.co.in/127.0.0.1#5335\nipset=/yahoo.co.in/gfwlist\nserver=/anallivecams.com/127.0.0.1#5335\nipset=/anallivecams.com/gfwlist\nserver=/kenyaraha.net/127.0.0.1#5335\nipset=/kenyaraha.net/gfwlist\nserver=/bondagesm.xyz/127.0.0.1#5335\nipset=/bondagesm.xyz/gfwlist\nserver=/openstreetmap.net/127.0.0.1#5335\nipset=/openstreetmap.net/gfwlist\nserver=/scholar.google.at/127.0.0.1#5335\nipset=/scholar.google.at/gfwlist\nserver=/llnwi.net/127.0.0.1#5335\nipset=/llnwi.net/gfwlist\nserver=/vxnbbrs.xyz/127.0.0.1#5335\nipset=/vxnbbrs.xyz/gfwlist\nserver=/githubhackathon.com/127.0.0.1#5335\nipset=/githubhackathon.com/gfwlist\nserver=/beatsbydreuk.com/127.0.0.1#5335\nipset=/beatsbydreuk.com/gfwlist\nserver=/hkgolden.media/127.0.0.1#5335\nipset=/hkgolden.media/gfwlist\nserver=/erome.com/127.0.0.1#5335\nipset=/erome.com/gfwlist\nserver=/realclearhistory.com/127.0.0.1#5335\nipset=/realclearhistory.com/gfwlist\nserver=/ccdc.cam.ac.uk/127.0.0.1#5335\nipset=/ccdc.cam.ac.uk/gfwlist\nserver=/wildfanny.com/127.0.0.1#5335\nipset=/wildfanny.com/gfwlist\nserver=/duckduckgo.nl/127.0.0.1#5335\nipset=/duckduckgo.nl/gfwlist\nserver=/furrypornvideos.com/127.0.0.1#5335\nipset=/furrypornvideos.com/gfwlist\nserver=/xxxvideos247.com/127.0.0.1#5335\nipset=/xxxvideos247.com/gfwlist\nserver=/studioluxus.com/127.0.0.1#5335\nipset=/studioluxus.com/gfwlist\nserver=/1337x.gd/127.0.0.1#5335\nipset=/1337x.gd/gfwlist\nserver=/alphabet.es/127.0.0.1#5335\nipset=/alphabet.es/gfwlist\nserver=/sharethis.com/127.0.0.1#5335\nipset=/sharethis.com/gfwlist\nserver=/japan-forward.com/127.0.0.1#5335\nipset=/japan-forward.com/gfwlist\nserver=/docker.io/127.0.0.1#5335\nipset=/docker.io/gfwlist\nserver=/firefox.com/127.0.0.1#5335\nipset=/firefox.com/gfwlist\nserver=/tiktokcdn.com/127.0.0.1#5335\nipset=/tiktokcdn.com/gfwlist\nserver=/logicoolg.com/127.0.0.1#5335\nipset=/logicoolg.com/gfwlist\nserver=/youtube.ch/127.0.0.1#5335\nipset=/youtube.ch/gfwlist\nserver=/boysfood.com/127.0.0.1#5335\nipset=/boysfood.com/gfwlist\nserver=/babesinporn.com/127.0.0.1#5335\nipset=/babesinporn.com/gfwlist\nserver=/ptt2.cc/127.0.0.1#5335\nipset=/ptt2.cc/gfwlist\nserver=/applecomputer.co.in/127.0.0.1#5335\nipset=/applecomputer.co.in/gfwlist\nserver=/ipodcentre.nl/127.0.0.1#5335\nipset=/ipodcentre.nl/gfwlist\nserver=/byteoversea.com/127.0.0.1#5335\nipset=/byteoversea.com/gfwlist\nserver=/nikeprice.com/127.0.0.1#5335\nipset=/nikeprice.com/gfwlist\nserver=/seemilfporn.com/127.0.0.1#5335\nipset=/seemilfporn.com/gfwlist\nserver=/vrpornmania.com/127.0.0.1#5335\nipset=/vrpornmania.com/gfwlist\nserver=/jqueryui.com/127.0.0.1#5335\nipset=/jqueryui.com/gfwlist\nserver=/planetminecraft.com/127.0.0.1#5335\nipset=/planetminecraft.com/gfwlist\nserver=/cableav.tv/127.0.0.1#5335\nipset=/cableav.tv/gfwlist\nserver=/disneycareers.com/127.0.0.1#5335\nipset=/disneycareers.com/gfwlist\nserver=/dyttapi.com/127.0.0.1#5335\nipset=/dyttapi.com/gfwlist\nserver=/redhdtube.xxx/127.0.0.1#5335\nipset=/redhdtube.xxx/gfwlist\nserver=/dirtyflix.com/127.0.0.1#5335\nipset=/dirtyflix.com/gfwlist\nserver=/vfsco.kr/127.0.0.1#5335\nipset=/vfsco.kr/gfwlist\nserver=/apple-watch.com.ru/127.0.0.1#5335\nipset=/apple-watch.com.ru/gfwlist\nserver=/thetimes.ie/127.0.0.1#5335\nipset=/thetimes.ie/gfwlist\nserver=/paypalgivingfund.org/127.0.0.1#5335\nipset=/paypalgivingfund.org/gfwlist\nserver=/volvobuses.com.br/127.0.0.1#5335\nipset=/volvobuses.com.br/gfwlist\nserver=/drdreheadphonesusstore.com/127.0.0.1#5335\nipset=/drdreheadphonesusstore.com/gfwlist\nserver=/minikelowna.com/127.0.0.1#5335\nipset=/minikelowna.com/gfwlist\nserver=/k9vidz.com/127.0.0.1#5335\nipset=/k9vidz.com/gfwlist\nserver=/msocdn.com/127.0.0.1#5335\nipset=/msocdn.com/gfwlist\nserver=/gettyimages.fi/127.0.0.1#5335\nipset=/gettyimages.fi/gfwlist\nserver=/voadeewaradio.com/127.0.0.1#5335\nipset=/voadeewaradio.com/gfwlist\nserver=/3dhentaix.com/127.0.0.1#5335\nipset=/3dhentaix.com/gfwlist\nserver=/instagramphoto.com/127.0.0.1#5335\nipset=/instagramphoto.com/gfwlist\nserver=/zeenite.com/127.0.0.1#5335\nipset=/zeenite.com/gfwlist\nserver=/truthordarepics.com/127.0.0.1#5335\nipset=/truthordarepics.com/gfwlist\nserver=/hpdrivers.org/127.0.0.1#5335\nipset=/hpdrivers.org/gfwlist\nserver=/opengraphprotocol.com/127.0.0.1#5335\nipset=/opengraphprotocol.com/gfwlist\nserver=/adult789.futoka.jp/127.0.0.1#5335\nipset=/adult789.futoka.jp/gfwlist\nserver=/fimfiction.net/127.0.0.1#5335\nipset=/fimfiction.net/gfwlist\nserver=/bmw-carit.de/127.0.0.1#5335\nipset=/bmw-carit.de/gfwlist\nserver=/thepornblender.com/127.0.0.1#5335\nipset=/thepornblender.com/gfwlist\nserver=/machos.net/127.0.0.1#5335\nipset=/machos.net/gfwlist\nserver=/onedrive.live.com/127.0.0.1#5335\nipset=/onedrive.live.com/gfwlist\nserver=/att.tv/127.0.0.1#5335\nipset=/att.tv/gfwlist\nserver=/pornmaster.fun/127.0.0.1#5335\nipset=/pornmaster.fun/gfwlist\nserver=/latticedata.com/127.0.0.1#5335\nipset=/latticedata.com/gfwlist\nserver=/imsrbx.xyz/127.0.0.1#5335\nipset=/imsrbx.xyz/gfwlist\nserver=/bmwgroup-classic.com/127.0.0.1#5335\nipset=/bmwgroup-classic.com/gfwlist\nserver=/vanish.co.uk/127.0.0.1#5335\nipset=/vanish.co.uk/gfwlist\nserver=/fox2detroit.com/127.0.0.1#5335\nipset=/fox2detroit.com/gfwlist\nserver=/heywire.com/127.0.0.1#5335\nipset=/heywire.com/gfwlist\nserver=/intell.com/127.0.0.1#5335\nipset=/intell.com/gfwlist\nserver=/91fans.org/127.0.0.1#5335\nipset=/91fans.org/gfwlist\nserver=/roborecall.com/127.0.0.1#5335\nipset=/roborecall.com/gfwlist\nserver=/collabora.org/127.0.0.1#5335\nipset=/collabora.org/gfwlist\nserver=/syosetu.com/127.0.0.1#5335\nipset=/syosetu.com/gfwlist\nserver=/hxcsxs.pro/127.0.0.1#5335\nipset=/hxcsxs.pro/gfwlist\nserver=/lusthero.com/127.0.0.1#5335\nipset=/lusthero.com/gfwlist\nserver=/xxmovz.com/127.0.0.1#5335\nipset=/xxmovz.com/gfwlist\nserver=/ipadair.jp/127.0.0.1#5335\nipset=/ipadair.jp/gfwlist\nserver=/ams.org/127.0.0.1#5335\nipset=/ams.org/gfwlist\nserver=/disney.bg/127.0.0.1#5335\nipset=/disney.bg/gfwlist\nserver=/bmw.at/127.0.0.1#5335\nipset=/bmw.at/gfwlist\nserver=/ahentaitv.com/127.0.0.1#5335\nipset=/ahentaitv.com/gfwlist\nserver=/drebeats-monster.com/127.0.0.1#5335\nipset=/drebeats-monster.com/gfwlist\nserver=/canon.ca/127.0.0.1#5335\nipset=/canon.ca/gfwlist\nserver=/neowin.net/127.0.0.1#5335\nipset=/neowin.net/gfwlist\nserver=/wholefoods.com/127.0.0.1#5335\nipset=/wholefoods.com/gfwlist\nserver=/now.com.hk/127.0.0.1#5335\nipset=/now.com.hk/gfwlist\nserver=/mini.com.ec/127.0.0.1#5335\nipset=/mini.com.ec/gfwlist\nserver=/mypornads.com/127.0.0.1#5335\nipset=/mypornads.com/gfwlist\nserver=/xoxoteiras.com/127.0.0.1#5335\nipset=/xoxoteiras.com/gfwlist\nserver=/midatlanticbmwmotorcycles.com/127.0.0.1#5335\nipset=/midatlanticbmwmotorcycles.com/gfwlist\nserver=/imgbb.com/127.0.0.1#5335\nipset=/imgbb.com/gfwlist\nserver=/1drv.com/127.0.0.1#5335\nipset=/1drv.com/gfwlist\nserver=/nikedawn.com/127.0.0.1#5335\nipset=/nikedawn.com/gfwlist\nserver=/kiji.ca/127.0.0.1#5335\nipset=/kiji.ca/gfwlist\nserver=/bbc.co.uk/127.0.0.1#5335\nipset=/bbc.co.uk/gfwlist\nserver=/ospray.org/127.0.0.1#5335\nipset=/ospray.org/gfwlist\nserver=/universalstudioshollywood.com/127.0.0.1#5335\nipset=/universalstudioshollywood.com/gfwlist\nserver=/pornhd8k.net/127.0.0.1#5335\nipset=/pornhd8k.net/gfwlist\nserver=/mkt.com/127.0.0.1#5335\nipset=/mkt.com/gfwlist\nserver=/seselah.com/127.0.0.1#5335\nipset=/seselah.com/gfwlist\nserver=/rferl.org/127.0.0.1#5335\nipset=/rferl.org/gfwlist\nserver=/boulx.com/127.0.0.1#5335\nipset=/boulx.com/gfwlist\nserver=/google.com.tj/127.0.0.1#5335\nipset=/google.com.tj/gfwlist\nserver=/yandex.sx/127.0.0.1#5335\nipset=/yandex.sx/gfwlist\nserver=/xxxccc4.com/127.0.0.1#5335\nipset=/xxxccc4.com/gfwlist\nserver=/x.company/127.0.0.1#5335\nipset=/x.company/gfwlist\nserver=/itnel.com/127.0.0.1#5335\nipset=/itnel.com/gfwlist\nserver=/wrds-www.wharton.upenn.edu/127.0.0.1#5335\nipset=/wrds-www.wharton.upenn.edu/gfwlist\nserver=/crazyxxx3dworld.net/127.0.0.1#5335\nipset=/crazyxxx3dworld.net/gfwlist\nserver=/voabangla.com/127.0.0.1#5335\nipset=/voabangla.com/gfwlist\nserver=/weinvoiceit.com/127.0.0.1#5335\nipset=/weinvoiceit.com/gfwlist\nserver=/googlefiber.net/127.0.0.1#5335\nipset=/googlefiber.net/gfwlist\nserver=/pornditos.com/127.0.0.1#5335\nipset=/pornditos.com/gfwlist\nserver=/yourporngod.com/127.0.0.1#5335\nipset=/yourporngod.com/gfwlist\nserver=/pornhits.com/127.0.0.1#5335\nipset=/pornhits.com/gfwlist\nserver=/muncloud.dog/127.0.0.1#5335\nipset=/muncloud.dog/gfwlist\nserver=/eprintsw.com/127.0.0.1#5335\nipset=/eprintsw.com/gfwlist\nserver=/adobegov.com/127.0.0.1#5335\nipset=/adobegov.com/gfwlist\nserver=/vmwareviewpoint.com/127.0.0.1#5335\nipset=/vmwareviewpoint.com/gfwlist\nserver=/momtube.club/127.0.0.1#5335\nipset=/momtube.club/gfwlist\nserver=/barrons-conferences.com/127.0.0.1#5335\nipset=/barrons-conferences.com/gfwlist\nserver=/beatsbydrestudio-australia.com/127.0.0.1#5335\nipset=/beatsbydrestudio-australia.com/gfwlist\nserver=/foxdcg.com/127.0.0.1#5335\nipset=/foxdcg.com/gfwlist\nserver=/canonfoundation.org/127.0.0.1#5335\nipset=/canonfoundation.org/gfwlist\nserver=/netpornsex.com/127.0.0.1#5335\nipset=/netpornsex.com/gfwlist\nserver=/maturescam.com/127.0.0.1#5335\nipset=/maturescam.com/gfwlist\nserver=/b6b33.com/127.0.0.1#5335\nipset=/b6b33.com/gfwlist\nserver=/applewatch.tw/127.0.0.1#5335\nipset=/applewatch.tw/gfwlist\nserver=/papalah.com/127.0.0.1#5335\nipset=/papalah.com/gfwlist\nserver=/facewbook.co/127.0.0.1#5335\nipset=/facewbook.co/gfwlist\nserver=/rea.design/127.0.0.1#5335\nipset=/rea.design/gfwlist\nserver=/sexyhumorgames.com/127.0.0.1#5335\nipset=/sexyhumorgames.com/gfwlist\nserver=/facecbook.org/127.0.0.1#5335\nipset=/facecbook.org/gfwlist\nserver=/foxcincy.net/127.0.0.1#5335\nipset=/foxcincy.net/gfwlist\nserver=/foxsports.co/127.0.0.1#5335\nipset=/foxsports.co/gfwlist\nserver=/bridgestone-asiapacific.com/127.0.0.1#5335\nipset=/bridgestone-asiapacific.com/gfwlist\nserver=/xnxxhd.tv/127.0.0.1#5335\nipset=/xnxxhd.tv/gfwlist\nserver=/fury.dev/127.0.0.1#5335\nipset=/fury.dev/gfwlist\nserver=/blogspot.tw/127.0.0.1#5335\nipset=/blogspot.tw/gfwlist\nserver=/cstatic.net/127.0.0.1#5335\nipset=/cstatic.net/gfwlist\nserver=/rstatic.net/127.0.0.1#5335\nipset=/rstatic.net/gfwlist\nserver=/annamilk.com/127.0.0.1#5335\nipset=/annamilk.com/gfwlist\nserver=/itunes.ca/127.0.0.1#5335\nipset=/itunes.ca/gfwlist\nserver=/nikeadidas.com/127.0.0.1#5335\nipset=/nikeadidas.com/gfwlist\nserver=/huffpostarabi.com/127.0.0.1#5335\nipset=/huffpostarabi.com/gfwlist\nserver=/connectionseducation.com/127.0.0.1#5335\nipset=/connectionseducation.com/gfwlist\nserver=/notion-static.com/127.0.0.1#5335\nipset=/notion-static.com/gfwlist\nserver=/asknudes.com/127.0.0.1#5335\nipset=/asknudes.com/gfwlist\nserver=/yandex.aero/127.0.0.1#5335\nipset=/yandex.aero/gfwlist\nserver=/freebeacon.com/127.0.0.1#5335\nipset=/freebeacon.com/gfwlist\nserver=/google.com.bo/127.0.0.1#5335\nipset=/google.com.bo/gfwlist\nserver=/esperanzagomez.org/127.0.0.1#5335\nipset=/esperanzagomez.org/gfwlist\nserver=/ibeatsbydre.cc/127.0.0.1#5335\nipset=/ibeatsbydre.cc/gfwlist\nserver=/azureedge-test.net/127.0.0.1#5335\nipset=/azureedge-test.net/gfwlist\nserver=/disneyiejobs.com/127.0.0.1#5335\nipset=/disneyiejobs.com/gfwlist\nserver=/post852.com/127.0.0.1#5335\nipset=/post852.com/gfwlist\nserver=/services-apple.net/127.0.0.1#5335\nipset=/services-apple.net/gfwlist\nserver=/55dndn.com/127.0.0.1#5335\nipset=/55dndn.com/gfwlist\nserver=/beatsdrdrecuffie.net/127.0.0.1#5335\nipset=/beatsdrdrecuffie.net/gfwlist\nserver=/fotiolia.com/127.0.0.1#5335\nipset=/fotiolia.com/gfwlist\nserver=/sonytc.co.jp/127.0.0.1#5335\nipset=/sonytc.co.jp/gfwlist\nserver=/new-akiba.com/127.0.0.1#5335\nipset=/new-akiba.com/gfwlist\nserver=/asebay.com/127.0.0.1#5335\nipset=/asebay.com/gfwlist\nserver=/sexhdmovs.com/127.0.0.1#5335\nipset=/sexhdmovs.com/gfwlist\nserver=/yeyuehuachao13.com/127.0.0.1#5335\nipset=/yeyuehuachao13.com/gfwlist\nserver=/intel.ga/127.0.0.1#5335\nipset=/intel.ga/gfwlist\nserver=/webex.fr/127.0.0.1#5335\nipset=/webex.fr/gfwlist\nserver=/paypal-community.com/127.0.0.1#5335\nipset=/paypal-community.com/gfwlist\nserver=/foxsoccerplus.tv/127.0.0.1#5335\nipset=/foxsoccerplus.tv/gfwlist\nserver=/foxnews.net/127.0.0.1#5335\nipset=/foxnews.net/gfwlist\nserver=/collegejournal.com/127.0.0.1#5335\nipset=/collegejournal.com/gfwlist\nserver=/digitalplaygroundnetwork.com/127.0.0.1#5335\nipset=/digitalplaygroundnetwork.com/gfwlist\nserver=/adultgamingroom.com/127.0.0.1#5335\nipset=/adultgamingroom.com/gfwlist\nserver=/yourpelvicexam.com/127.0.0.1#5335\nipset=/yourpelvicexam.com/gfwlist\nserver=/minisokorea.com/127.0.0.1#5335\nipset=/minisokorea.com/gfwlist\nserver=/durex.com.ng/127.0.0.1#5335\nipset=/durex.com.ng/gfwlist\nserver=/redislabs.com/127.0.0.1#5335\nipset=/redislabs.com/gfwlist\nserver=/dettol.com.au/127.0.0.1#5335\nipset=/dettol.com.au/gfwlist\nserver=/kingofpics.com/127.0.0.1#5335\nipset=/kingofpics.com/gfwlist\nserver=/freebrowser.org/127.0.0.1#5335\nipset=/freebrowser.org/gfwlist\nserver=/originalhulu.com/127.0.0.1#5335\nipset=/originalhulu.com/gfwlist\nserver=/pornsites.xxx/127.0.0.1#5335\nipset=/pornsites.xxx/gfwlist\nserver=/yahoo.cz/127.0.0.1#5335\nipset=/yahoo.cz/gfwlist\nserver=/wholefoodsmarket.com/127.0.0.1#5335\nipset=/wholefoodsmarket.com/gfwlist\nserver=/youtube.pa/127.0.0.1#5335\nipset=/youtube.pa/gfwlist\nserver=/firstpelvicexam.com/127.0.0.1#5335\nipset=/firstpelvicexam.com/gfwlist\nserver=/av-channel.com/127.0.0.1#5335\nipset=/av-channel.com/gfwlist\nserver=/lfai.foundation/127.0.0.1#5335\nipset=/lfai.foundation/gfwlist\nserver=/urchin.com/127.0.0.1#5335\nipset=/urchin.com/gfwlist\nserver=/extremetube.com/127.0.0.1#5335\nipset=/extremetube.com/gfwlist\nserver=/mommystoytime.com/127.0.0.1#5335\nipset=/mommystoytime.com/gfwlist\nserver=/dlmobilegarena-a.akamaihd.net/127.0.0.1#5335\nipset=/dlmobilegarena-a.akamaihd.net/gfwlist\nserver=/lmmbtc.com/127.0.0.1#5335\nipset=/lmmbtc.com/gfwlist\nserver=/hotindianxxxsex.com/127.0.0.1#5335\nipset=/hotindianxxxsex.com/gfwlist\nserver=/shianyuanfang.com/127.0.0.1#5335\nipset=/shianyuanfang.com/gfwlist\nserver=/txqzz34r.com/127.0.0.1#5335\nipset=/txqzz34r.com/gfwlist\nserver=/vmwareusergroupstore.com/127.0.0.1#5335\nipset=/vmwareusergroupstore.com/gfwlist\nserver=/asagaku.com/127.0.0.1#5335\nipset=/asagaku.com/gfwlist\nserver=/qumingwz.com/127.0.0.1#5335\nipset=/qumingwz.com/gfwlist\nserver=/babyzone.com/127.0.0.1#5335\nipset=/babyzone.com/gfwlist\nserver=/girlfriendhomeporn.com/127.0.0.1#5335\nipset=/girlfriendhomeporn.com/gfwlist\nserver=/sexlikereal.com/127.0.0.1#5335\nipset=/sexlikereal.com/gfwlist\nserver=/ebaytv.org/127.0.0.1#5335\nipset=/ebaytv.org/gfwlist\nserver=/newssyndication.com/127.0.0.1#5335\nipset=/newssyndication.com/gfwlist\nserver=/bcove.video/127.0.0.1#5335\nipset=/bcove.video/gfwlist\nserver=/freudbox.com/127.0.0.1#5335\nipset=/freudbox.com/gfwlist\nserver=/xboxstudios.com/127.0.0.1#5335\nipset=/xboxstudios.com/gfwlist\nserver=/fastlylabs.com/127.0.0.1#5335\nipset=/fastlylabs.com/gfwlist\nserver=/ipod.tw/127.0.0.1#5335\nipset=/ipod.tw/gfwlist\nserver=/hp3d.com/127.0.0.1#5335\nipset=/hp3d.com/gfwlist\nserver=/scoreland2.com/127.0.0.1#5335\nipset=/scoreland2.com/gfwlist\nserver=/ryokoyomiuri.co.jp/127.0.0.1#5335\nipset=/ryokoyomiuri.co.jp/gfwlist\nserver=/burningcamel.com/127.0.0.1#5335\nipset=/burningcamel.com/gfwlist\nserver=/xxvideos.xxx/127.0.0.1#5335\nipset=/xxvideos.xxx/gfwlist\nserver=/twistedlinks.net/127.0.0.1#5335\nipset=/twistedlinks.net/gfwlist\nserver=/hentai-archive.com/127.0.0.1#5335\nipset=/hentai-archive.com/gfwlist\nserver=/myfoxphilly.com/127.0.0.1#5335\nipset=/myfoxphilly.com/gfwlist\nserver=/bmw-motorrad.com.tr/127.0.0.1#5335\nipset=/bmw-motorrad.com.tr/gfwlist\nserver=/skunkgirl.cc/127.0.0.1#5335\nipset=/skunkgirl.cc/gfwlist\nserver=/facebuok.com/127.0.0.1#5335\nipset=/facebuok.com/gfwlist\nserver=/finishinfo.no/127.0.0.1#5335\nipset=/finishinfo.no/gfwlist\nserver=/paypal-network.org/127.0.0.1#5335\nipset=/paypal-network.org/gfwlist\nserver=/xoomcom.com/127.0.0.1#5335\nipset=/xoomcom.com/gfwlist\nserver=/abbywintersfree.com/127.0.0.1#5335\nipset=/abbywintersfree.com/gfwlist\nserver=/airwick.pl/127.0.0.1#5335\nipset=/airwick.pl/gfwlist\nserver=/dialga.com/127.0.0.1#5335\nipset=/dialga.com/gfwlist\nserver=/tanflix.com/127.0.0.1#5335\nipset=/tanflix.com/gfwlist\nserver=/nintendo.be/127.0.0.1#5335\nipset=/nintendo.be/gfwlist\nserver=/vsmarketplacebadge.apphb.com/127.0.0.1#5335\nipset=/vsmarketplacebadge.apphb.com/gfwlist\nserver=/vrpornjack.com/127.0.0.1#5335\nipset=/vrpornjack.com/gfwlist\nserver=/fifastreet.com/127.0.0.1#5335\nipset=/fifastreet.com/gfwlist\nserver=/tokyomotion.com/127.0.0.1#5335\nipset=/tokyomotion.com/gfwlist\nserver=/tvbusa.com/127.0.0.1#5335\nipset=/tvbusa.com/gfwlist\nserver=/xlovecam.com/127.0.0.1#5335\nipset=/xlovecam.com/gfwlist\nserver=/cloudflare.net/127.0.0.1#5335\nipset=/cloudflare.net/gfwlist\nserver=/fljmh.com/127.0.0.1#5335\nipset=/fljmh.com/gfwlist\nserver=/m5ir5np1.shop/127.0.0.1#5335\nipset=/m5ir5np1.shop/gfwlist\nserver=/cas.org/127.0.0.1#5335\nipset=/cas.org/gfwlist\nserver=/starcraft2.com/127.0.0.1#5335\nipset=/starcraft2.com/gfwlist\nserver=/eurogirlsescort.com/127.0.0.1#5335\nipset=/eurogirlsescort.com/gfwlist\nserver=/4channel.org/127.0.0.1#5335\nipset=/4channel.org/gfwlist\nserver=/cylink0122.icu/127.0.0.1#5335\nipset=/cylink0122.icu/gfwlist\nserver=/appl-e.com/127.0.0.1#5335\nipset=/appl-e.com/gfwlist\nserver=/6parkbbs.com/127.0.0.1#5335\nipset=/6parkbbs.com/gfwlist\nserver=/xsrxpwvg.com/127.0.0.1#5335\nipset=/xsrxpwvg.com/gfwlist\nserver=/beatsdrdre-solo.com/127.0.0.1#5335\nipset=/beatsdrdre-solo.com/gfwlist\nserver=/porn2018.com/127.0.0.1#5335\nipset=/porn2018.com/gfwlist\nserver=/ebaycar.com/127.0.0.1#5335\nipset=/ebaycar.com/gfwlist\nserver=/neotokyo.supertop-100.com/127.0.0.1#5335\nipset=/neotokyo.supertop-100.com/gfwlist\nserver=/ikea.jp/127.0.0.1#5335\nipset=/ikea.jp/gfwlist\nserver=/mageconf.com.ua/127.0.0.1#5335\nipset=/mageconf.com.ua/gfwlist\nserver=/uporno.xxx/127.0.0.1#5335\nipset=/uporno.xxx/gfwlist\nserver=/nxta.org/127.0.0.1#5335\nipset=/nxta.org/gfwlist\nserver=/xcafe.com/127.0.0.1#5335\nipset=/xcafe.com/gfwlist\nserver=/root-signing.ch/127.0.0.1#5335\nipset=/root-signing.ch/gfwlist\nserver=/lovemstudios.com/127.0.0.1#5335\nipset=/lovemstudios.com/gfwlist\nserver=/google.ca/127.0.0.1#5335\nipset=/google.ca/gfwlist\nserver=/microsoft.dk/127.0.0.1#5335\nipset=/microsoft.dk/gfwlist\nserver=/txcloud.net/127.0.0.1#5335\nipset=/txcloud.net/gfwlist\nserver=/ieeeday.org/127.0.0.1#5335\nipset=/ieeeday.org/gfwlist\nserver=/scholar.google.nl/127.0.0.1#5335\nipset=/scholar.google.nl/gfwlist\nserver=/acs.org/127.0.0.1#5335\nipset=/acs.org/gfwlist\nserver=/masterwanker.com/127.0.0.1#5335\nipset=/masterwanker.com/gfwlist\nserver=/hardsex8.com/127.0.0.1#5335\nipset=/hardsex8.com/gfwlist\nserver=/ebay-vacation.com/127.0.0.1#5335\nipset=/ebay-vacation.com/gfwlist\nserver=/qporno.xxx/127.0.0.1#5335\nipset=/qporno.xxx/gfwlist\nserver=/playstation.com/127.0.0.1#5335\nipset=/playstation.com/gfwlist\nserver=/custombeatsbydrebuy.com/127.0.0.1#5335\nipset=/custombeatsbydrebuy.com/gfwlist\nserver=/xnxx-xxx.win/127.0.0.1#5335\nipset=/xnxx-xxx.win/gfwlist\nserver=/att.com/127.0.0.1#5335\nipset=/att.com/gfwlist\nserver=/pricelesspick.com/127.0.0.1#5335\nipset=/pricelesspick.com/gfwlist\nserver=/microsoftreactor.org/127.0.0.1#5335\nipset=/microsoftreactor.org/gfwlist\nserver=/tube.bz/127.0.0.1#5335\nipset=/tube.bz/gfwlist\nserver=/91rb.com/127.0.0.1#5335\nipset=/91rb.com/gfwlist\nserver=/cotweet.com/127.0.0.1#5335\nipset=/cotweet.com/gfwlist\nserver=/hentainstream.com/127.0.0.1#5335\nipset=/hentainstream.com/gfwlist\nserver=/powerofresolve.com/127.0.0.1#5335\nipset=/powerofresolve.com/gfwlist\nserver=/bmwbkk.de/127.0.0.1#5335\nipset=/bmwbkk.de/gfwlist\nserver=/s-books.com/127.0.0.1#5335\nipset=/s-books.com/gfwlist\nserver=/rrtis.com/127.0.0.1#5335\nipset=/rrtis.com/gfwlist\nserver=/xn--9trs65b.com/127.0.0.1#5335\nipset=/xn--9trs65b.com/gfwlist\nserver=/desktopmovie.org/127.0.0.1#5335\nipset=/desktopmovie.org/gfwlist\nserver=/dotfacebook.com/127.0.0.1#5335\nipset=/dotfacebook.com/gfwlist\nserver=/mailonline.com/127.0.0.1#5335\nipset=/mailonline.com/gfwlist\nserver=/bridgestone.co.jp/127.0.0.1#5335\nipset=/bridgestone.co.jp/gfwlist\nserver=/pornohoo.com.mx/127.0.0.1#5335\nipset=/pornohoo.com.mx/gfwlist\nserver=/videosamadoresreais.com/127.0.0.1#5335\nipset=/videosamadoresreais.com/gfwlist\nserver=/javleak.com/127.0.0.1#5335\nipset=/javleak.com/gfwlist\nserver=/protonmail.ch/127.0.0.1#5335\nipset=/protonmail.ch/gfwlist\nserver=/netlifystatus.com/127.0.0.1#5335\nipset=/netlifystatus.com/gfwlist\nserver=/pornfind.org/127.0.0.1#5335\nipset=/pornfind.org/gfwlist\nserver=/mortein.co.nz/127.0.0.1#5335\nipset=/mortein.co.nz/gfwlist\nserver=/honkaistarrail.com/127.0.0.1#5335\nipset=/honkaistarrail.com/gfwlist\nserver=/volvogrouptruckcenter.nl/127.0.0.1#5335\nipset=/volvogrouptruckcenter.nl/gfwlist\nserver=/rarbggo.org/127.0.0.1#5335\nipset=/rarbggo.org/gfwlist\nserver=/joylovedolls.com/127.0.0.1#5335\nipset=/joylovedolls.com/gfwlist\nserver=/hentaiverse.org/127.0.0.1#5335\nipset=/hentaiverse.org/gfwlist\nserver=/javhd.com/127.0.0.1#5335\nipset=/javhd.com/gfwlist\nserver=/playpornogames.com/127.0.0.1#5335\nipset=/playpornogames.com/gfwlist\nserver=/blender.org/127.0.0.1#5335\nipset=/blender.org/gfwlist\nserver=/topbeatsdealer.com/127.0.0.1#5335\nipset=/topbeatsdealer.com/gfwlist\nserver=/bmw-adventskalender.com/127.0.0.1#5335\nipset=/bmw-adventskalender.com/gfwlist\nserver=/nytstyle.com/127.0.0.1#5335\nipset=/nytstyle.com/gfwlist\nserver=/www-bestbuystores.com/127.0.0.1#5335\nipset=/www-bestbuystores.com/gfwlist\nserver=/huluitaly.com/127.0.0.1#5335\nipset=/huluitaly.com/gfwlist\nserver=/shopdurex.com/127.0.0.1#5335\nipset=/shopdurex.com/gfwlist\nserver=/mini.co.cr/127.0.0.1#5335\nipset=/mini.co.cr/gfwlist\nserver=/scholar.google.cn/127.0.0.1#5335\nipset=/scholar.google.cn/gfwlist\nserver=/bmw-connecteddrive.com.cy/127.0.0.1#5335\nipset=/bmw-connecteddrive.com.cy/gfwlist\nserver=/ministcatharines.ca/127.0.0.1#5335\nipset=/ministcatharines.ca/gfwlist\nserver=/thisvidscat.net/127.0.0.1#5335\nipset=/thisvidscat.net/gfwlist\nserver=/hbogo.com/127.0.0.1#5335\nipset=/hbogo.com/gfwlist\nserver=/ateam-oracle.com/127.0.0.1#5335\nipset=/ateam-oracle.com/gfwlist\nserver=/foxnewspodcasts.com/127.0.0.1#5335\nipset=/foxnewspodcasts.com/gfwlist\nserver=/ciattackers.com/127.0.0.1#5335\nipset=/ciattackers.com/gfwlist\nserver=/pvue2.com/127.0.0.1#5335\nipset=/pvue2.com/gfwlist\nserver=/vsassets.io/127.0.0.1#5335\nipset=/vsassets.io/gfwlist\nserver=/volvotrucks.com.br/127.0.0.1#5335\nipset=/volvotrucks.com.br/gfwlist\nserver=/apple-darwin.org/127.0.0.1#5335\nipset=/apple-darwin.org/gfwlist\nserver=/venmo.net/127.0.0.1#5335\nipset=/venmo.net/gfwlist\nserver=/z676869.com/127.0.0.1#5335\nipset=/z676869.com/gfwlist\nserver=/hoolu.com/127.0.0.1#5335\nipset=/hoolu.com/gfwlist\nserver=/hotgaylist.com/127.0.0.1#5335\nipset=/hotgaylist.com/gfwlist\nserver=/reachporn.com/127.0.0.1#5335\nipset=/reachporn.com/gfwlist\nserver=/blogspot.is/127.0.0.1#5335\nipset=/blogspot.is/gfwlist\nserver=/orzqwq.com/127.0.0.1#5335\nipset=/orzqwq.com/gfwlist\nserver=/femalestars.com/127.0.0.1#5335\nipset=/femalestars.com/gfwlist\nserver=/google.co.in/127.0.0.1#5335\nipset=/google.co.in/gfwlist\nserver=/brocaproject.com/127.0.0.1#5335\nipset=/brocaproject.com/gfwlist\nserver=/strepsils.com.tw/127.0.0.1#5335\nipset=/strepsils.com.tw/gfwlist\nserver=/aerogard.com.au/127.0.0.1#5335\nipset=/aerogard.com.au/gfwlist\nserver=/airwick.co.in/127.0.0.1#5335\nipset=/airwick.co.in/gfwlist\nserver=/applecentre.info/127.0.0.1#5335\nipset=/applecentre.info/gfwlist\nserver=/ecpa.fr/127.0.0.1#5335\nipset=/ecpa.fr/gfwlist\nserver=/pornoamateurlatino.net/127.0.0.1#5335\nipset=/pornoamateurlatino.net/gfwlist\nserver=/vikiporn.com/127.0.0.1#5335\nipset=/vikiporn.com/gfwlist\nserver=/facebook-corp.com/127.0.0.1#5335\nipset=/facebook-corp.com/gfwlist\nserver=/scorepass.com/127.0.0.1#5335\nipset=/scorepass.com/gfwlist\nserver=/javhub.me/127.0.0.1#5335\nipset=/javhub.me/gfwlist\nserver=/16885858.com/127.0.0.1#5335\nipset=/16885858.com/gfwlist\nserver=/shemaleporn.fun/127.0.0.1#5335\nipset=/shemaleporn.fun/gfwlist\nserver=/xbabe.com/127.0.0.1#5335\nipset=/xbabe.com/gfwlist\nserver=/xxxporn123.com/127.0.0.1#5335\nipset=/xxxporn123.com/gfwlist\nserver=/volvotrucks.in/127.0.0.1#5335\nipset=/volvotrucks.in/gfwlist\nserver=/intel.bo/127.0.0.1#5335\nipset=/intel.bo/gfwlist\nserver=/sony.com.mx/127.0.0.1#5335\nipset=/sony.com.mx/gfwlist\nserver=/hentaihere.com/127.0.0.1#5335\nipset=/hentaihere.com/gfwlist\nserver=/beatsdrdrekaufenschweiz.net/127.0.0.1#5335\nipset=/beatsdrdrekaufenschweiz.net/gfwlist\nserver=/apple.net/127.0.0.1#5335\nipset=/apple.net/gfwlist\nserver=/riotgames.net/127.0.0.1#5335\nipset=/riotgames.net/gfwlist\nserver=/tsyum.com/127.0.0.1#5335\nipset=/tsyum.com/gfwlist\nserver=/intel.pl/127.0.0.1#5335\nipset=/intel.pl/gfwlist\nserver=/ministjohns.ca/127.0.0.1#5335\nipset=/ministjohns.ca/gfwlist\nserver=/aboutamazon.es/127.0.0.1#5335\nipset=/aboutamazon.es/gfwlist\nserver=/asianpornonly.com/127.0.0.1#5335\nipset=/asianpornonly.com/gfwlist\nserver=/entrust.net/127.0.0.1#5335\nipset=/entrust.net/gfwlist\nserver=/foxtel.com.au/127.0.0.1#5335\nipset=/foxtel.com.au/gfwlist\nserver=/uwpcommunitytoolkit.com/127.0.0.1#5335\nipset=/uwpcommunitytoolkit.com/gfwlist\nserver=/ebay.es/127.0.0.1#5335\nipset=/ebay.es/gfwlist\nserver=/getfedora.org/127.0.0.1#5335\nipset=/getfedora.org/gfwlist\nserver=/pacopacomama.com/127.0.0.1#5335\nipset=/pacopacomama.com/gfwlist\nserver=/blizzard.com/127.0.0.1#5335\nipset=/blizzard.com/gfwlist\nserver=/foxpoker.com/127.0.0.1#5335\nipset=/foxpoker.com/gfwlist\nserver=/30plusgirls.com/127.0.0.1#5335\nipset=/30plusgirls.com/gfwlist\nserver=/iphone-zh.com/127.0.0.1#5335\nipset=/iphone-zh.com/gfwlist\nserver=/radiotavisupleba.ge/127.0.0.1#5335\nipset=/radiotavisupleba.ge/gfwlist\nserver=/facebook30.org/127.0.0.1#5335\nipset=/facebook30.org/gfwlist\nserver=/aliveprofiler.com/127.0.0.1#5335\nipset=/aliveprofiler.com/gfwlist\nserver=/1jjdg2.vip/127.0.0.1#5335\nipset=/1jjdg2.vip/gfwlist\nserver=/minilat.com/127.0.0.1#5335\nipset=/minilat.com/gfwlist\nserver=/9anime.to/127.0.0.1#5335\nipset=/9anime.to/gfwlist\nserver=/dmmrex.com/127.0.0.1#5335\nipset=/dmmrex.com/gfwlist\nserver=/movetv.com/127.0.0.1#5335\nipset=/movetv.com/gfwlist\nserver=/apkmirror.com/127.0.0.1#5335\nipset=/apkmirror.com/gfwlist\nserver=/aboutamazon.pl/127.0.0.1#5335\nipset=/aboutamazon.pl/gfwlist\nserver=/next.hk/127.0.0.1#5335\nipset=/next.hk/gfwlist\nserver=/applepay.co.rs/127.0.0.1#5335\nipset=/applepay.co.rs/gfwlist\nserver=/madonna-av.com/127.0.0.1#5335\nipset=/madonna-av.com/gfwlist\nserver=/firebaseapp.com/127.0.0.1#5335\nipset=/firebaseapp.com/gfwlist\nserver=/yourporn.sexy/127.0.0.1#5335\nipset=/yourporn.sexy/gfwlist\nserver=/porngem.com/127.0.0.1#5335\nipset=/porngem.com/gfwlist\nserver=/gayheaven.org/127.0.0.1#5335\nipset=/gayheaven.org/gfwlist\nserver=/bustymerilyn.com/127.0.0.1#5335\nipset=/bustymerilyn.com/gfwlist\nserver=/qqgamedesign.com/127.0.0.1#5335\nipset=/qqgamedesign.com/gfwlist\nserver=/ooni.org/127.0.0.1#5335\nipset=/ooni.org/gfwlist\nserver=/viralporn.com/127.0.0.1#5335\nipset=/viralporn.com/gfwlist\nserver=/imperial.ac.uk/127.0.0.1#5335\nipset=/imperial.ac.uk/gfwlist\nserver=/huffpost.com/127.0.0.1#5335\nipset=/huffpost.com/gfwlist\nserver=/foxtvdvd.com/127.0.0.1#5335\nipset=/foxtvdvd.com/gfwlist\nserver=/fbmessenger.com/127.0.0.1#5335\nipset=/fbmessenger.com/gfwlist\nserver=/tracking-location.com/127.0.0.1#5335\nipset=/tracking-location.com/gfwlist\nserver=/a2z.com/127.0.0.1#5335\nipset=/a2z.com/gfwlist\nserver=/thedreadwolfrises.com/127.0.0.1#5335\nipset=/thedreadwolfrises.com/gfwlist\nserver=/9news.com.au/127.0.0.1#5335\nipset=/9news.com.au/gfwlist\nserver=/getoutline.org/127.0.0.1#5335\nipset=/getoutline.org/gfwlist\nserver=/exs8fkw0.xyz/127.0.0.1#5335\nipset=/exs8fkw0.xyz/gfwlist\nserver=/xxeronetxx.info/127.0.0.1#5335\nipset=/xxeronetxx.info/gfwlist\nserver=/youtube.com.my/127.0.0.1#5335\nipset=/youtube.com.my/gfwlist\nserver=/hdgaytube.xxx/127.0.0.1#5335\nipset=/hdgaytube.xxx/gfwlist\nserver=/ntdimg.com/127.0.0.1#5335\nipset=/ntdimg.com/gfwlist\nserver=/flagrasamadores.net/127.0.0.1#5335\nipset=/flagrasamadores.net/gfwlist\nserver=/jizzonline.com/127.0.0.1#5335\nipset=/jizzonline.com/gfwlist\nserver=/visa.com.vi/127.0.0.1#5335\nipset=/visa.com.vi/gfwlist\nserver=/xvideos-cdn.com/127.0.0.1#5335\nipset=/xvideos-cdn.com/gfwlist\nserver=/nikkei.jp/127.0.0.1#5335\nipset=/nikkei.jp/gfwlist\nserver=/pickinguppussy.com/127.0.0.1#5335\nipset=/pickinguppussy.com/gfwlist\nserver=/burstly.net/127.0.0.1#5335\nipset=/burstly.net/gfwlist\nserver=/intelfreepress.com/127.0.0.1#5335\nipset=/intelfreepress.com/gfwlist\nserver=/ikea.co.de/127.0.0.1#5335\nipset=/ikea.co.de/gfwlist\nserver=/sonypictures.com/127.0.0.1#5335\nipset=/sonypictures.com/gfwlist\nserver=/pornojefe.com/127.0.0.1#5335\nipset=/pornojefe.com/gfwlist\nserver=/amd.com.cn/127.0.0.1#5335\nipset=/amd.com.cn/gfwlist\nserver=/gigaporn.org/127.0.0.1#5335\nipset=/gigaporn.org/gfwlist\nserver=/prpops.com/127.0.0.1#5335\nipset=/prpops.com/gfwlist\nserver=/itcfonts.com/127.0.0.1#5335\nipset=/itcfonts.com/gfwlist\nserver=/sh-xuxingda.com/127.0.0.1#5335\nipset=/sh-xuxingda.com/gfwlist\nserver=/public-sex-porn.com/127.0.0.1#5335\nipset=/public-sex-porn.com/gfwlist\nserver=/instagram-press.net/127.0.0.1#5335\nipset=/instagram-press.net/gfwlist\nserver=/uun78.com/127.0.0.1#5335\nipset=/uun78.com/gfwlist\nserver=/bmwgroupclassic.com/127.0.0.1#5335\nipset=/bmwgroupclassic.com/gfwlist\nserver=/beatsbydrdre-store.us/127.0.0.1#5335\nipset=/beatsbydrdre-store.us/gfwlist\nserver=/seemygf.com/127.0.0.1#5335\nipset=/seemygf.com/gfwlist\nserver=/javdisk.com/127.0.0.1#5335\nipset=/javdisk.com/gfwlist\nserver=/castro.fm/127.0.0.1#5335\nipset=/castro.fm/gfwlist\nserver=/startupjournal.com/127.0.0.1#5335\nipset=/startupjournal.com/gfwlist\nserver=/attonlineoffers.com/127.0.0.1#5335\nipset=/attonlineoffers.com/gfwlist\nserver=/protondb.com/127.0.0.1#5335\nipset=/protondb.com/gfwlist\nserver=/washingtondcbmw.com/127.0.0.1#5335\nipset=/washingtondcbmw.com/gfwlist\nserver=/mings.hk/127.0.0.1#5335\nipset=/mings.hk/gfwlist\nserver=/mallheadphone.com/127.0.0.1#5335\nipset=/mallheadphone.com/gfwlist\nserver=/fantasiasguatemala.com/127.0.0.1#5335\nipset=/fantasiasguatemala.com/gfwlist\nserver=/ahtranny.com/127.0.0.1#5335\nipset=/ahtranny.com/gfwlist\nserver=/code.org/127.0.0.1#5335\nipset=/code.org/gfwlist\nserver=/niketracking.com/127.0.0.1#5335\nipset=/niketracking.com/gfwlist\nserver=/xbahis44.com/127.0.0.1#5335\nipset=/xbahis44.com/gfwlist\nserver=/paypal-recargacelular.com/127.0.0.1#5335\nipset=/paypal-recargacelular.com/gfwlist\nserver=/ciscospark.com/127.0.0.1#5335\nipset=/ciscospark.com/gfwlist\nserver=/18commic.com/127.0.0.1#5335\nipset=/18commic.com/gfwlist\nserver=/spankingstudio.com/127.0.0.1#5335\nipset=/spankingstudio.com/gfwlist\nserver=/facebookook.com/127.0.0.1#5335\nipset=/facebookook.com/gfwlist\nserver=/zeebiz.com/127.0.0.1#5335\nipset=/zeebiz.com/gfwlist\nserver=/jwpcdn.com/127.0.0.1#5335\nipset=/jwpcdn.com/gfwlist\nserver=/vk-cdn.me/127.0.0.1#5335\nipset=/vk-cdn.me/gfwlist\nserver=/zopim.com/127.0.0.1#5335\nipset=/zopim.com/gfwlist\nserver=/libgen.is/127.0.0.1#5335\nipset=/libgen.is/gfwlist\nserver=/omekinteractive.com/127.0.0.1#5335\nipset=/omekinteractive.com/gfwlist\nserver=/bestbuy.info/127.0.0.1#5335\nipset=/bestbuy.info/gfwlist\nserver=/huluaction.com/127.0.0.1#5335\nipset=/huluaction.com/gfwlist\nserver=/blogspot.be/127.0.0.1#5335\nipset=/blogspot.be/gfwlist\nserver=/beatsdre4cheap.com/127.0.0.1#5335\nipset=/beatsdre4cheap.com/gfwlist\nserver=/hnext.jp/127.0.0.1#5335\nipset=/hnext.jp/gfwlist\nserver=/youtu.be/127.0.0.1#5335\nipset=/youtu.be/gfwlist\nserver=/fox51tns.net/127.0.0.1#5335\nipset=/fox51tns.net/gfwlist\nserver=/annualreviews.org/127.0.0.1#5335\nipset=/annualreviews.org/gfwlist\nserver=/p16-tiktokcdn-com.akamaized.net/127.0.0.1#5335\nipset=/p16-tiktokcdn-com.akamaized.net/gfwlist\nserver=/minishop.ca/127.0.0.1#5335\nipset=/minishop.ca/gfwlist\nserver=/rude.com/127.0.0.1#5335\nipset=/rude.com/gfwlist\nserver=/rbrandlibrary.com/127.0.0.1#5335\nipset=/rbrandlibrary.com/gfwlist\nserver=/iyalc.com/127.0.0.1#5335\nipset=/iyalc.com/gfwlist\nserver=/sankei-tours.com/127.0.0.1#5335\nipset=/sankei-tours.com/gfwlist\nserver=/asexdoll.com/127.0.0.1#5335\nipset=/asexdoll.com/gfwlist\nserver=/sibreal.org/127.0.0.1#5335\nipset=/sibreal.org/gfwlist\nserver=/myebay.com/127.0.0.1#5335\nipset=/myebay.com/gfwlist\nserver=/pokemonsunmoon.com/127.0.0.1#5335\nipset=/pokemonsunmoon.com/gfwlist\nserver=/unrealengine.com/127.0.0.1#5335\nipset=/unrealengine.com/gfwlist\nserver=/sexemulator.com/127.0.0.1#5335\nipset=/sexemulator.com/gfwlist\nserver=/git-scm.com/127.0.0.1#5335\nipset=/git-scm.com/gfwlist\nserver=/adobexdplatform.com/127.0.0.1#5335\nipset=/adobexdplatform.com/gfwlist\nserver=/hbonow.com/127.0.0.1#5335\nipset=/hbonow.com/gfwlist\nserver=/bmw-connecteddrive.gr/127.0.0.1#5335\nipset=/bmw-connecteddrive.gr/gfwlist\nserver=/emerald.com/127.0.0.1#5335\nipset=/emerald.com/gfwlist\nserver=/kristenbjorn.com/127.0.0.1#5335\nipset=/kristenbjorn.com/gfwlist\nserver=/pinterest.es/127.0.0.1#5335\nipset=/pinterest.es/gfwlist\nserver=/forbesimg.com/127.0.0.1#5335\nipset=/forbesimg.com/gfwlist\nserver=/mtt.org/127.0.0.1#5335\nipset=/mtt.org/gfwlist\nserver=/bitnamiapp.com/127.0.0.1#5335\nipset=/bitnamiapp.com/gfwlist\nserver=/shahvani.com/127.0.0.1#5335\nipset=/shahvani.com/gfwlist\nserver=/hkbn.net/127.0.0.1#5335\nipset=/hkbn.net/gfwlist\nserver=/sony.com.ni/127.0.0.1#5335\nipset=/sony.com.ni/gfwlist\nserver=/yandex.eu/127.0.0.1#5335\nipset=/yandex.eu/gfwlist\nserver=/appdynamics.info/127.0.0.1#5335\nipset=/appdynamics.info/gfwlist\nserver=/flutterapp.com/127.0.0.1#5335\nipset=/flutterapp.com/gfwlist\nserver=/amazon-fashions.com/127.0.0.1#5335\nipset=/amazon-fashions.com/gfwlist\nserver=/iphoto.eu/127.0.0.1#5335\nipset=/iphoto.eu/gfwlist\nserver=/facebookpmdcenter.com/127.0.0.1#5335\nipset=/facebookpmdcenter.com/gfwlist\nserver=/bigcharts.com/127.0.0.1#5335\nipset=/bigcharts.com/gfwlist\nserver=/mybeatsbydreuk.com/127.0.0.1#5335\nipset=/mybeatsbydreuk.com/gfwlist\nserver=/emome.net/127.0.0.1#5335\nipset=/emome.net/gfwlist\nserver=/pornfu.tv/127.0.0.1#5335\nipset=/pornfu.tv/gfwlist\nserver=/sexflexible.com/127.0.0.1#5335\nipset=/sexflexible.com/gfwlist\nserver=/kopfhorergunstigshop.com/127.0.0.1#5335\nipset=/kopfhorergunstigshop.com/gfwlist\nserver=/bestbuyforbusiness.ca/127.0.0.1#5335\nipset=/bestbuyforbusiness.ca/gfwlist\nserver=/sexsiam.com/127.0.0.1#5335\nipset=/sexsiam.com/gfwlist\nserver=/hpeclipse.com/127.0.0.1#5335\nipset=/hpeclipse.com/gfwlist\nserver=/nowe.hk/127.0.0.1#5335\nipset=/nowe.hk/gfwlist\nserver=/xxx18teen.net/127.0.0.1#5335\nipset=/xxx18teen.net/gfwlist\nserver=/anypornhd.com/127.0.0.1#5335\nipset=/anypornhd.com/gfwlist\nserver=/yahoo.cd/127.0.0.1#5335\nipset=/yahoo.cd/gfwlist\nserver=/zeetv.co.uk/127.0.0.1#5335\nipset=/zeetv.co.uk/gfwlist\nserver=/9cdn.net/127.0.0.1#5335\nipset=/9cdn.net/gfwlist\nserver=/nike.com/127.0.0.1#5335\nipset=/nike.com/gfwlist\nserver=/like.com/127.0.0.1#5335\nipset=/like.com/gfwlist\nserver=/finishinfo.be/127.0.0.1#5335\nipset=/finishinfo.be/gfwlist\nserver=/facebvook.com/127.0.0.1#5335\nipset=/facebvook.com/gfwlist\nserver=/drbeatsukmart.com/127.0.0.1#5335\nipset=/drbeatsukmart.com/gfwlist\nserver=/cygames.co.jp/127.0.0.1#5335\nipset=/cygames.co.jp/gfwlist\nserver=/3dsexplay.xyz/127.0.0.1#5335\nipset=/3dsexplay.xyz/gfwlist\nserver=/nudedrawer.com/127.0.0.1#5335\nipset=/nudedrawer.com/gfwlist\nserver=/definefetish.com/127.0.0.1#5335\nipset=/definefetish.com/gfwlist\nserver=/bmw-lao.la/127.0.0.1#5335\nipset=/bmw-lao.la/gfwlist\nserver=/highbolt.net/127.0.0.1#5335\nipset=/highbolt.net/gfwlist\nserver=/wirelessreach.com/127.0.0.1#5335\nipset=/wirelessreach.com/gfwlist\nserver=/ferabook.com/127.0.0.1#5335\nipset=/ferabook.com/gfwlist\nserver=/mini-connected.pt/127.0.0.1#5335\nipset=/mini-connected.pt/gfwlist\nserver=/mangahome.com/127.0.0.1#5335\nipset=/mangahome.com/gfwlist\nserver=/blubrry.com/127.0.0.1#5335\nipset=/blubrry.com/gfwlist\nserver=/toomadporn.pro/127.0.0.1#5335\nipset=/toomadporn.pro/gfwlist\nserver=/verisign.com.hk/127.0.0.1#5335\nipset=/verisign.com.hk/gfwlist\nserver=/uun85.com/127.0.0.1#5335\nipset=/uun85.com/gfwlist\nserver=/tacamateurs.com/127.0.0.1#5335\nipset=/tacamateurs.com/gfwlist\nserver=/akam.net/127.0.0.1#5335\nipset=/akam.net/gfwlist\nserver=/infura.io/127.0.0.1#5335\nipset=/infura.io/gfwlist\nserver=/dtsell.com/127.0.0.1#5335\nipset=/dtsell.com/gfwlist\nserver=/missav.com/127.0.0.1#5335\nipset=/missav.com/gfwlist\nserver=/mcdonalds.ca/127.0.0.1#5335\nipset=/mcdonalds.ca/gfwlist\nserver=/atypi.org/127.0.0.1#5335\nipset=/atypi.org/gfwlist\nserver=/msn.net/127.0.0.1#5335\nipset=/msn.net/gfwlist\nserver=/nsfw.xxx/127.0.0.1#5335\nipset=/nsfw.xxx/gfwlist\nserver=/discord.dev/127.0.0.1#5335\nipset=/discord.dev/gfwlist\nserver=/kompoz2.com/127.0.0.1#5335\nipset=/kompoz2.com/gfwlist\nserver=/pornovideow.com/127.0.0.1#5335\nipset=/pornovideow.com/gfwlist\nserver=/sneakerskick.com/127.0.0.1#5335\nipset=/sneakerskick.com/gfwlist\nserver=/firstasianpussy.com/127.0.0.1#5335\nipset=/firstasianpussy.com/gfwlist\nserver=/intel.ru/127.0.0.1#5335\nipset=/intel.ru/gfwlist\nserver=/bmwgroupinfobahn.com/127.0.0.1#5335\nipset=/bmwgroupinfobahn.com/gfwlist\nserver=/metacpan.org/127.0.0.1#5335\nipset=/metacpan.org/gfwlist\nserver=/hentaipros.com/127.0.0.1#5335\nipset=/hentaipros.com/gfwlist\nserver=/real-mature-porn.com/127.0.0.1#5335\nipset=/real-mature-porn.com/gfwlist\nserver=/hsex.men/127.0.0.1#5335\nipset=/hsex.men/gfwlist\nserver=/stickofjoy.com/127.0.0.1#5335\nipset=/stickofjoy.com/gfwlist\nserver=/wsj.jobs/127.0.0.1#5335\nipset=/wsj.jobs/gfwlist\nserver=/dx9527.cc/127.0.0.1#5335\nipset=/dx9527.cc/gfwlist\nserver=/studywatchbyverily.com/127.0.0.1#5335\nipset=/studywatchbyverily.com/gfwlist\nserver=/mastercard.se/127.0.0.1#5335\nipset=/mastercard.se/gfwlist\nserver=/photolia.net/127.0.0.1#5335\nipset=/photolia.net/gfwlist\nserver=/hot-gayporn.com/127.0.0.1#5335\nipset=/hot-gayporn.com/gfwlist\nserver=/flipfap.com/127.0.0.1#5335\nipset=/flipfap.com/gfwlist\nserver=/sukebelinks.com/127.0.0.1#5335\nipset=/sukebelinks.com/gfwlist\nserver=/vercel.app/127.0.0.1#5335\nipset=/vercel.app/gfwlist\nserver=/imilfs.com/127.0.0.1#5335\nipset=/imilfs.com/gfwlist\nserver=/bravotube.tv/127.0.0.1#5335\nipset=/bravotube.tv/gfwlist\nserver=/neweconomyforum.com/127.0.0.1#5335\nipset=/neweconomyforum.com/gfwlist\nserver=/volvotrucks.com.au/127.0.0.1#5335\nipset=/volvotrucks.com.au/gfwlist\nserver=/princesscum.com/127.0.0.1#5335\nipset=/princesscum.com/gfwlist\nserver=/my20dc.com/127.0.0.1#5335\nipset=/my20dc.com/gfwlist\nserver=/xpornplease.com/127.0.0.1#5335\nipset=/xpornplease.com/gfwlist\nserver=/applemusic.hamburg/127.0.0.1#5335\nipset=/applemusic.hamburg/gfwlist\nserver=/verizonwireless.com/127.0.0.1#5335\nipset=/verizonwireless.com/gfwlist\nserver=/qorno.com/127.0.0.1#5335\nipset=/qorno.com/gfwlist\nserver=/issquaredown.com/127.0.0.1#5335\nipset=/issquaredown.com/gfwlist\nserver=/nvidia.ch/127.0.0.1#5335\nipset=/nvidia.ch/gfwlist\nserver=/ipfs.lain.la/127.0.0.1#5335\nipset=/ipfs.lain.la/gfwlist\nserver=/googl.com/127.0.0.1#5335\nipset=/googl.com/gfwlist\nserver=/beatsbydretoutlet.com/127.0.0.1#5335\nipset=/beatsbydretoutlet.com/gfwlist\nserver=/mucinex.com.cn/127.0.0.1#5335\nipset=/mucinex.com.cn/gfwlist\nserver=/bestbeats4u.com/127.0.0.1#5335\nipset=/bestbeats4u.com/gfwlist\nserver=/intel.fr/127.0.0.1#5335\nipset=/intel.fr/gfwlist\nserver=/imonsterbeats.com/127.0.0.1#5335\nipset=/imonsterbeats.com/gfwlist\nserver=/swapsmut.com/127.0.0.1#5335\nipset=/swapsmut.com/gfwlist\nserver=/gamepedia.com/127.0.0.1#5335\nipset=/gamepedia.com/gfwlist\nserver=/youtube.uy/127.0.0.1#5335\nipset=/youtube.uy/gfwlist\nserver=/dirtyasiantube.com/127.0.0.1#5335\nipset=/dirtyasiantube.com/gfwlist\nserver=/billpoint.com/127.0.0.1#5335\nipset=/billpoint.com/gfwlist\nserver=/q13fox.com/127.0.0.1#5335\nipset=/q13fox.com/gfwlist\nserver=/bmwmotorcycles.com/127.0.0.1#5335\nipset=/bmwmotorcycles.com/gfwlist\nserver=/mickybells.com/127.0.0.1#5335\nipset=/mickybells.com/gfwlist\nserver=/fluidpreview.com/127.0.0.1#5335\nipset=/fluidpreview.com/gfwlist\nserver=/vercel.com/127.0.0.1#5335\nipset=/vercel.com/gfwlist\nserver=/kikdirty.com/127.0.0.1#5335\nipset=/kikdirty.com/gfwlist\nserver=/pccwglobal.com/127.0.0.1#5335\nipset=/pccwglobal.com/gfwlist\nserver=/nickscipio.com/127.0.0.1#5335\nipset=/nickscipio.com/gfwlist\nserver=/carbon.com/127.0.0.1#5335\nipset=/carbon.com/gfwlist\nserver=/ieee.org/127.0.0.1#5335\nipset=/ieee.org/gfwlist\nserver=/gigantits.com/127.0.0.1#5335\nipset=/gigantits.com/gfwlist\nserver=/nhentai.to/127.0.0.1#5335\nipset=/nhentai.to/gfwlist\nserver=/nurofen.ru/127.0.0.1#5335\nipset=/nurofen.ru/gfwlist\nserver=/facbeok.com/127.0.0.1#5335\nipset=/facbeok.com/gfwlist\nserver=/lucahmelayu.club/127.0.0.1#5335\nipset=/lucahmelayu.club/gfwlist\nserver=/conquerwithcharacter.com/127.0.0.1#5335\nipset=/conquerwithcharacter.com/gfwlist\nserver=/wnoaissulli1.com/127.0.0.1#5335\nipset=/wnoaissulli1.com/gfwlist\nserver=/sexnaweb.net/127.0.0.1#5335\nipset=/sexnaweb.net/gfwlist\nserver=/blackmonsterterror.com/127.0.0.1#5335\nipset=/blackmonsterterror.com/gfwlist\nserver=/porn-images-xxx.com/127.0.0.1#5335\nipset=/porn-images-xxx.com/gfwlist\nserver=/intelcloudfinder.com/127.0.0.1#5335\nipset=/intelcloudfinder.com/gfwlist\nserver=/xvideosincesto.com/127.0.0.1#5335\nipset=/xvideosincesto.com/gfwlist\nserver=/highdefinitionbeatsbydre.com/127.0.0.1#5335\nipset=/highdefinitionbeatsbydre.com/gfwlist\nserver=/eroshiko.net/127.0.0.1#5335\nipset=/eroshiko.net/gfwlist\nserver=/momo.dm/127.0.0.1#5335\nipset=/momo.dm/gfwlist\nserver=/ads.yahoo.com/127.0.0.1#5335\nipset=/ads.yahoo.com/gfwlist\nserver=/lolislove.info/127.0.0.1#5335\nipset=/lolislove.info/gfwlist\nserver=/facebookappcenter.info/127.0.0.1#5335\nipset=/facebookappcenter.info/gfwlist\nserver=/pornguz.com/127.0.0.1#5335\nipset=/pornguz.com/gfwlist\nserver=/hentai.tv/127.0.0.1#5335\nipset=/hentai.tv/gfwlist\nserver=/javhard.net/127.0.0.1#5335\nipset=/javhard.net/gfwlist\nserver=/facebooklikeexchange.com/127.0.0.1#5335\nipset=/facebooklikeexchange.com/gfwlist\nserver=/hcaptchastatus.com/127.0.0.1#5335\nipset=/hcaptchastatus.com/gfwlist\nserver=/t66y.com/127.0.0.1#5335\nipset=/t66y.com/gfwlist\nserver=/mtalk.google.com/127.0.0.1#5335\nipset=/mtalk.google.com/gfwlist\nserver=/9hentai.to/127.0.0.1#5335\nipset=/9hentai.to/gfwlist\nserver=/duckduckco.de/127.0.0.1#5335\nipset=/duckduckco.de/gfwlist\nserver=/xposed.info/127.0.0.1#5335\nipset=/xposed.info/gfwlist\nserver=/pearson.com/127.0.0.1#5335\nipset=/pearson.com/gfwlist\nserver=/gofundme.com/127.0.0.1#5335\nipset=/gofundme.com/gfwlist\nserver=/onlyindianporn.tv/127.0.0.1#5335\nipset=/onlyindianporn.tv/gfwlist\nserver=/apple.cm/127.0.0.1#5335\nipset=/apple.cm/gfwlist\nserver=/edgemeplease.com/127.0.0.1#5335\nipset=/edgemeplease.com/gfwlist\nserver=/githubstatus.com/127.0.0.1#5335\nipset=/githubstatus.com/gfwlist\nserver=/v-has.com/127.0.0.1#5335\nipset=/v-has.com/gfwlist\nserver=/documentforce.com/127.0.0.1#5335\nipset=/documentforce.com/gfwlist\nserver=/ikea.ro/127.0.0.1#5335\nipset=/ikea.ro/gfwlist\nserver=/ebay-course.com/127.0.0.1#5335\nipset=/ebay-course.com/gfwlist\nserver=/imac-applecomputer.com/127.0.0.1#5335\nipset=/imac-applecomputer.com/gfwlist\nserver=/bridgestonecomercial.co.cr/127.0.0.1#5335\nipset=/bridgestonecomercial.co.cr/gfwlist\nserver=/ckck.fun/127.0.0.1#5335\nipset=/ckck.fun/gfwlist\nserver=/news.net.au/127.0.0.1#5335\nipset=/news.net.au/gfwlist\nserver=/playporngames.com/127.0.0.1#5335\nipset=/playporngames.com/gfwlist\nserver=/40shopping.com/127.0.0.1#5335\nipset=/40shopping.com/gfwlist\nserver=/businessinsider.es/127.0.0.1#5335\nipset=/businessinsider.es/gfwlist\nserver=/erotikaweb.hu/127.0.0.1#5335\nipset=/erotikaweb.hu/gfwlist\nserver=/marketing-nirvana.com/127.0.0.1#5335\nipset=/marketing-nirvana.com/gfwlist\nserver=/dropboxinsiders.com/127.0.0.1#5335\nipset=/dropboxinsiders.com/gfwlist\nserver=/slack-edge.com/127.0.0.1#5335\nipset=/slack-edge.com/gfwlist\nserver=/cyyeshb.com/127.0.0.1#5335\nipset=/cyyeshb.com/gfwlist\nserver=/hp3dmetals.com/127.0.0.1#5335\nipset=/hp3dmetals.com/gfwlist\nserver=/buycheapbeatsbydre.com/127.0.0.1#5335\nipset=/buycheapbeatsbydre.com/gfwlist\nserver=/voazimbabwe.com/127.0.0.1#5335\nipset=/voazimbabwe.com/gfwlist\nserver=/adultblogranking.com/127.0.0.1#5335\nipset=/adultblogranking.com/gfwlist\nserver=/visa.com.ng/127.0.0.1#5335\nipset=/visa.com.ng/gfwlist\nserver=/theatlantic.com/127.0.0.1#5335\nipset=/theatlantic.com/gfwlist\nserver=/qualcomm.com.br/127.0.0.1#5335\nipset=/qualcomm.com.br/gfwlist\nserver=/vmware.tt.omtrdc.net/127.0.0.1#5335\nipset=/vmware.tt.omtrdc.net/gfwlist\nserver=/3arabporn.com/127.0.0.1#5335\nipset=/3arabporn.com/gfwlist\nserver=/pinterest.cl/127.0.0.1#5335\nipset=/pinterest.cl/gfwlist\nserver=/litbus-anime.com/127.0.0.1#5335\nipset=/litbus-anime.com/gfwlist\nserver=/hoolu.tv/127.0.0.1#5335\nipset=/hoolu.tv/gfwlist\nserver=/directvplans.com/127.0.0.1#5335\nipset=/directvplans.com/gfwlist\nserver=/bacsitinhyeu.vn/127.0.0.1#5335\nipset=/bacsitinhyeu.vn/gfwlist\nserver=/beatsbydreoslo.com/127.0.0.1#5335\nipset=/beatsbydreoslo.com/gfwlist\nserver=/visa.cz/127.0.0.1#5335\nipset=/visa.cz/gfwlist\nserver=/youtube.co.ae/127.0.0.1#5335\nipset=/youtube.co.ae/gfwlist\nserver=/monsterdrebeats-canada.net/127.0.0.1#5335\nipset=/monsterdrebeats-canada.net/gfwlist\nserver=/azurecosmosdb.info/127.0.0.1#5335\nipset=/azurecosmosdb.info/gfwlist\nserver=/scholar.google.com.tw/127.0.0.1#5335\nipset=/scholar.google.com.tw/gfwlist\nserver=/hbogo.co.th/127.0.0.1#5335\nipset=/hbogo.co.th/gfwlist\nserver=/rabbitsreviews.com/127.0.0.1#5335\nipset=/rabbitsreviews.com/gfwlist\nserver=/jgg18.xyz/127.0.0.1#5335\nipset=/jgg18.xyz/gfwlist\nserver=/vk.design/127.0.0.1#5335\nipset=/vk.design/gfwlist\nserver=/xn--90wwvt03e.com/127.0.0.1#5335\nipset=/xn--90wwvt03e.com/gfwlist\nserver=/thunderbird.net/127.0.0.1#5335\nipset=/thunderbird.net/gfwlist\nserver=/tubxporn.xxx/127.0.0.1#5335\nipset=/tubxporn.xxx/gfwlist\nserver=/cloudflarebolt.com/127.0.0.1#5335\nipset=/cloudflarebolt.com/gfwlist\nserver=/cencoastbmw.com/127.0.0.1#5335\nipset=/cencoastbmw.com/gfwlist\nserver=/bdsmcafe.com/127.0.0.1#5335\nipset=/bdsmcafe.com/gfwlist\nserver=/pornogratis.vlog.br/127.0.0.1#5335\nipset=/pornogratis.vlog.br/gfwlist\nserver=/appdynamics.de/127.0.0.1#5335\nipset=/appdynamics.de/gfwlist\nserver=/erlang.org/127.0.0.1#5335\nipset=/erlang.org/gfwlist\nserver=/mastercard.om/127.0.0.1#5335\nipset=/mastercard.om/gfwlist\nserver=/sonybsc.com/127.0.0.1#5335\nipset=/sonybsc.com/gfwlist\nserver=/groups.com/127.0.0.1#5335\nipset=/groups.com/gfwlist\nserver=/go141.com/127.0.0.1#5335\nipset=/go141.com/gfwlist\nserver=/nikeinc.com/127.0.0.1#5335\nipset=/nikeinc.com/gfwlist\nserver=/awsglobalaccelerator.com/127.0.0.1#5335\nipset=/awsglobalaccelerator.com/gfwlist\nserver=/playshowtv.com/127.0.0.1#5335\nipset=/playshowtv.com/gfwlist\nserver=/24porn.pro/127.0.0.1#5335\nipset=/24porn.pro/gfwlist\nserver=/hippyhillscomix.com/127.0.0.1#5335\nipset=/hippyhillscomix.com/gfwlist\nserver=/anyshemale.com/127.0.0.1#5335\nipset=/anyshemale.com/gfwlist\nserver=/findvrporn.com/127.0.0.1#5335\nipset=/findvrporn.com/gfwlist\nserver=/pearsonclinical.es/127.0.0.1#5335\nipset=/pearsonclinical.es/gfwlist\nserver=/monsterbeatsale.com/127.0.0.1#5335\nipset=/monsterbeatsale.com/gfwlist\nserver=/porn300.online/127.0.0.1#5335\nipset=/porn300.online/gfwlist\nserver=/catalinacruz.com/127.0.0.1#5335\nipset=/catalinacruz.com/gfwlist\nserver=/faceboonk.com/127.0.0.1#5335\nipset=/faceboonk.com/gfwlist\nserver=/asp-cc.com/127.0.0.1#5335\nipset=/asp-cc.com/gfwlist\nserver=/twister.net.co/127.0.0.1#5335\nipset=/twister.net.co/gfwlist\nserver=/binancezh.ink/127.0.0.1#5335\nipset=/binancezh.ink/gfwlist\nserver=/qualcommhalo.com/127.0.0.1#5335\nipset=/qualcommhalo.com/gfwlist\nserver=/visaeurope.at/127.0.0.1#5335\nipset=/visaeurope.at/gfwlist\nserver=/porntrex.com/127.0.0.1#5335\nipset=/porntrex.com/gfwlist\nserver=/hotteenfreecam.com/127.0.0.1#5335\nipset=/hotteenfreecam.com/gfwlist\nserver=/flathub.org/127.0.0.1#5335\nipset=/flathub.org/gfwlist\nserver=/fulldesisex.com/127.0.0.1#5335\nipset=/fulldesisex.com/gfwlist\nserver=/monstersexporn.net/127.0.0.1#5335\nipset=/monstersexporn.net/gfwlist\nserver=/gaito.xyz/127.0.0.1#5335\nipset=/gaito.xyz/gfwlist\nserver=/hornybitches.org/127.0.0.1#5335\nipset=/hornybitches.org/gfwlist\nserver=/misshotgirls.com/127.0.0.1#5335\nipset=/misshotgirls.com/gfwlist\nserver=/icloudads.net/127.0.0.1#5335\nipset=/icloudads.net/gfwlist\nserver=/bmw.com.ve/127.0.0.1#5335\nipset=/bmw.com.ve/gfwlist\nserver=/airwick.com.au/127.0.0.1#5335\nipset=/airwick.com.au/gfwlist\nserver=/heavy-r.com/127.0.0.1#5335\nipset=/heavy-r.com/gfwlist\nserver=/amazonlumberyard.wang/127.0.0.1#5335\nipset=/amazonlumberyard.wang/gfwlist\nserver=/javynow.com/127.0.0.1#5335\nipset=/javynow.com/gfwlist\nserver=/vanish.dk/127.0.0.1#5335\nipset=/vanish.dk/gfwlist\nserver=/hoyo.link/127.0.0.1#5335\nipset=/hoyo.link/gfwlist\nserver=/inclusivegrowthscore.com/127.0.0.1#5335\nipset=/inclusivegrowthscore.com/gfwlist\nserver=/speedfantasybid.com/127.0.0.1#5335\nipset=/speedfantasybid.com/gfwlist\nserver=/gayasianxxx.com/127.0.0.1#5335\nipset=/gayasianxxx.com/gfwlist\nserver=/tumblr.com/127.0.0.1#5335\nipset=/tumblr.com/gfwlist\nserver=/dirtypornvids.com/127.0.0.1#5335\nipset=/dirtypornvids.com/gfwlist\nserver=/69tubesex.com/127.0.0.1#5335\nipset=/69tubesex.com/gfwlist\nserver=/ibm.us/127.0.0.1#5335\nipset=/ibm.us/gfwlist\nserver=/fececbook.com/127.0.0.1#5335\nipset=/fececbook.com/gfwlist\nserver=/oiobbs.com/127.0.0.1#5335\nipset=/oiobbs.com/gfwlist\nserver=/jerkmate.tv/127.0.0.1#5335\nipset=/jerkmate.tv/gfwlist\nserver=/disney-studio.net/127.0.0.1#5335\nipset=/disney-studio.net/gfwlist\nserver=/shadowsocks.nl/127.0.0.1#5335\nipset=/shadowsocks.nl/gfwlist\nserver=/acebooik.com/127.0.0.1#5335\nipset=/acebooik.com/gfwlist\nserver=/appla.com/127.0.0.1#5335\nipset=/appla.com/gfwlist\nserver=/mcdonaldsparties.com.au/127.0.0.1#5335\nipset=/mcdonaldsparties.com.au/gfwlist\nserver=/www.sb/127.0.0.1#5335\nipset=/www.sb/gfwlist\nserver=/vixen.com/127.0.0.1#5335\nipset=/vixen.com/gfwlist\nserver=/namethatporn.com/127.0.0.1#5335\nipset=/namethatporn.com/gfwlist\nserver=/ieee.tv/127.0.0.1#5335\nipset=/ieee.tv/gfwlist\nserver=/dettol.ch/127.0.0.1#5335\nipset=/dettol.ch/gfwlist\nserver=/sony.si/127.0.0.1#5335\nipset=/sony.si/gfwlist\nserver=/beatsbydrehd.net/127.0.0.1#5335\nipset=/beatsbydrehd.net/gfwlist\nserver=/famima.vn/127.0.0.1#5335\nipset=/famima.vn/gfwlist\nserver=/office365love.com/127.0.0.1#5335\nipset=/office365love.com/gfwlist\nserver=/fox5dc.com/127.0.0.1#5335\nipset=/fox5dc.com/gfwlist\nserver=/pubmatic.co.jp/127.0.0.1#5335\nipset=/pubmatic.co.jp/gfwlist\nserver=/amateur-cougar.com/127.0.0.1#5335\nipset=/amateur-cougar.com/gfwlist\nserver=/beatsbydrdredanmark.com/127.0.0.1#5335\nipset=/beatsbydrdredanmark.com/gfwlist\nserver=/pornelephant.com/127.0.0.1#5335\nipset=/pornelephant.com/gfwlist\nserver=/vodafone.com.au/127.0.0.1#5335\nipset=/vodafone.com.au/gfwlist\nserver=/camsoda.com/127.0.0.1#5335\nipset=/camsoda.com/gfwlist\nserver=/appdynamics.com/127.0.0.1#5335\nipset=/appdynamics.com/gfwlist\nserver=/scaleflex.com/127.0.0.1#5335\nipset=/scaleflex.com/gfwlist\nserver=/absolutewhores.com/127.0.0.1#5335\nipset=/absolutewhores.com/gfwlist\nserver=/wixipedia.net/127.0.0.1#5335\nipset=/wixipedia.net/gfwlist\nserver=/ironna.jp/127.0.0.1#5335\nipset=/ironna.jp/gfwlist\nserver=/google.cz/127.0.0.1#5335\nipset=/google.cz/gfwlist\nserver=/cheapbeats4sale.net/127.0.0.1#5335\nipset=/cheapbeats4sale.net/gfwlist\nserver=/j2objc.org/127.0.0.1#5335\nipset=/j2objc.org/gfwlist\nserver=/beatsshop-usa.com/127.0.0.1#5335\nipset=/beatsshop-usa.com/gfwlist\nserver=/greenend.org.uk/127.0.0.1#5335\nipset=/greenend.org.uk/gfwlist\nserver=/gifnuki.com/127.0.0.1#5335\nipset=/gifnuki.com/gfwlist\nserver=/sway.com/127.0.0.1#5335\nipset=/sway.com/gfwlist\nserver=/lanasbigboobs.com/127.0.0.1#5335\nipset=/lanasbigboobs.com/gfwlist\nserver=/hotpornfile.org/127.0.0.1#5335\nipset=/hotpornfile.org/gfwlist\nserver=/bbcfmt.s.llnwi.net/127.0.0.1#5335\nipset=/bbcfmt.s.llnwi.net/gfwlist\nserver=/freesexvideos2k.com/127.0.0.1#5335\nipset=/freesexvideos2k.com/gfwlist\nserver=/whatboyswant.com/127.0.0.1#5335\nipset=/whatboyswant.com/gfwlist\nserver=/fuckvideos.biz/127.0.0.1#5335\nipset=/fuckvideos.biz/gfwlist\nserver=/clinical-videos.com/127.0.0.1#5335\nipset=/clinical-videos.com/gfwlist\nserver=/kingkongapp.com/127.0.0.1#5335\nipset=/kingkongapp.com/gfwlist\nserver=/wsjplus.com/127.0.0.1#5335\nipset=/wsjplus.com/gfwlist\nserver=/content-ause1-ur-discovery1.uplynk.com/127.0.0.1#5335\nipset=/content-ause1-ur-discovery1.uplynk.com/gfwlist\nserver=/hayabusa.io/127.0.0.1#5335\nipset=/hayabusa.io/gfwlist\nserver=/ciscolearningsociety.org/127.0.0.1#5335\nipset=/ciscolearningsociety.org/gfwlist\nserver=/yahoo.no/127.0.0.1#5335\nipset=/yahoo.no/gfwlist\nserver=/fapsafari.com/127.0.0.1#5335\nipset=/fapsafari.com/gfwlist\nserver=/lewdweb.net/127.0.0.1#5335\nipset=/lewdweb.net/gfwlist\nserver=/coursera.org/127.0.0.1#5335\nipset=/coursera.org/gfwlist\nserver=/cosplayporntube.com/127.0.0.1#5335\nipset=/cosplayporntube.com/gfwlist\nserver=/stackoverflow.com/127.0.0.1#5335\nipset=/stackoverflow.com/gfwlist\nserver=/tgtube.com/127.0.0.1#5335\nipset=/tgtube.com/gfwlist\nserver=/scholar.google.ca/127.0.0.1#5335\nipset=/scholar.google.ca/gfwlist\nserver=/volvotrucks.jp/127.0.0.1#5335\nipset=/volvotrucks.jp/gfwlist\nserver=/canon.az/127.0.0.1#5335\nipset=/canon.az/gfwlist\nserver=/hktshop.com/127.0.0.1#5335\nipset=/hktshop.com/gfwlist\nserver=/hentai-vostfr.net/127.0.0.1#5335\nipset=/hentai-vostfr.net/gfwlist\nserver=/manhwa24h.com/127.0.0.1#5335\nipset=/manhwa24h.com/gfwlist\nserver=/incesto.blog.br/127.0.0.1#5335\nipset=/incesto.blog.br/gfwlist\nserver=/ebay.co.uk/127.0.0.1#5335\nipset=/ebay.co.uk/gfwlist\nserver=/rule34.xyz/127.0.0.1#5335\nipset=/rule34.xyz/gfwlist\nserver=/xzxxporn.com/127.0.0.1#5335\nipset=/xzxxporn.com/gfwlist\nserver=/mi9cdn.com/127.0.0.1#5335\nipset=/mi9cdn.com/gfwlist\nserver=/orithegame.com/127.0.0.1#5335\nipset=/orithegame.com/gfwlist\nserver=/applepaysupplies.berlin/127.0.0.1#5335\nipset=/applepaysupplies.berlin/gfwlist\nserver=/sexypornpictures.org/127.0.0.1#5335\nipset=/sexypornpictures.org/gfwlist\nserver=/alfera.my/127.0.0.1#5335\nipset=/alfera.my/gfwlist\nserver=/microsoftaccountguard.com/127.0.0.1#5335\nipset=/microsoftaccountguard.com/gfwlist\nserver=/mom50.com/127.0.0.1#5335\nipset=/mom50.com/gfwlist\nserver=/doi.info/127.0.0.1#5335\nipset=/doi.info/gfwlist\nserver=/volvotrucks.com.tr/127.0.0.1#5335\nipset=/volvotrucks.com.tr/gfwlist\nserver=/sexjobs.it/127.0.0.1#5335\nipset=/sexjobs.it/gfwlist\nserver=/ifuckedtheboss.com/127.0.0.1#5335\nipset=/ifuckedtheboss.com/gfwlist\nserver=/bigboobswives.com/127.0.0.1#5335\nipset=/bigboobswives.com/gfwlist\nserver=/finishinfo.cz/127.0.0.1#5335\nipset=/finishinfo.cz/gfwlist\nserver=/oursexgames.com/127.0.0.1#5335\nipset=/oursexgames.com/gfwlist\nserver=/uun83.com/127.0.0.1#5335\nipset=/uun83.com/gfwlist\nserver=/bigbuckbunny.org/127.0.0.1#5335\nipset=/bigbuckbunny.org/gfwlist\nserver=/myfonts.com/127.0.0.1#5335\nipset=/myfonts.com/gfwlist\nserver=/fastindianporn.com/127.0.0.1#5335\nipset=/fastindianporn.com/gfwlist\nserver=/kindleoasis.com/127.0.0.1#5335\nipset=/kindleoasis.com/gfwlist\nserver=/facebook-privacy.com/127.0.0.1#5335\nipset=/facebook-privacy.com/gfwlist\nserver=/enemasexfetish.com/127.0.0.1#5335\nipset=/enemasexfetish.com/gfwlist\nserver=/canon.gr/127.0.0.1#5335\nipset=/canon.gr/gfwlist\nserver=/burstlyrewards.com/127.0.0.1#5335\nipset=/burstlyrewards.com/gfwlist\nserver=/applestore.com.ru/127.0.0.1#5335\nipset=/applestore.com.ru/gfwlist\nserver=/cloudlatex.io/127.0.0.1#5335\nipset=/cloudlatex.io/gfwlist\nserver=/paypal-signin.com/127.0.0.1#5335\nipset=/paypal-signin.com/gfwlist\nserver=/topfantasyart.com/127.0.0.1#5335\nipset=/topfantasyart.com/gfwlist\nserver=/intelcloudbuilders.com/127.0.0.1#5335\nipset=/intelcloudbuilders.com/gfwlist\nserver=/mysims.com/127.0.0.1#5335\nipset=/mysims.com/gfwlist\nserver=/foxsports.com.br/127.0.0.1#5335\nipset=/foxsports.com.br/gfwlist\nserver=/mcdonalds.it/127.0.0.1#5335\nipset=/mcdonalds.it/gfwlist\nserver=/take2games.com/127.0.0.1#5335\nipset=/take2games.com/gfwlist\nserver=/water-and-power.com/127.0.0.1#5335\nipset=/water-and-power.com/gfwlist\nserver=/mynike.com/127.0.0.1#5335\nipset=/mynike.com/gfwlist\nserver=/binance.co/127.0.0.1#5335\nipset=/binance.co/gfwlist\nserver=/milftugs.com/127.0.0.1#5335\nipset=/milftugs.com/gfwlist\nserver=/youtube.in/127.0.0.1#5335\nipset=/youtube.in/gfwlist\nserver=/sabuibo.net/127.0.0.1#5335\nipset=/sabuibo.net/gfwlist\nserver=/ikea.fi/127.0.0.1#5335\nipset=/ikea.fi/gfwlist\nserver=/picsee.co/127.0.0.1#5335\nipset=/picsee.co/gfwlist\nserver=/zettai-ero.com/127.0.0.1#5335\nipset=/zettai-ero.com/gfwlist\nserver=/taradinhos.com/127.0.0.1#5335\nipset=/taradinhos.com/gfwlist\nserver=/mastercard.gr/127.0.0.1#5335\nipset=/mastercard.gr/gfwlist\nserver=/wankz.com/127.0.0.1#5335\nipset=/wankz.com/gfwlist\nserver=/voanews.com/127.0.0.1#5335\nipset=/voanews.com/gfwlist\nserver=/sohfrance.org/127.0.0.1#5335\nipset=/sohfrance.org/gfwlist\nserver=/madthumbs.com/127.0.0.1#5335\nipset=/madthumbs.com/gfwlist\nserver=/bookshome.world/127.0.0.1#5335\nipset=/bookshome.world/gfwlist\nserver=/bloombergsef.com/127.0.0.1#5335\nipset=/bloombergsef.com/gfwlist\nserver=/flirt4free.com/127.0.0.1#5335\nipset=/flirt4free.com/gfwlist\nserver=/letmejerk.com/127.0.0.1#5335\nipset=/letmejerk.com/gfwlist\nserver=/microsofteca.com/127.0.0.1#5335\nipset=/microsofteca.com/gfwlist\nserver=/beatsbydreaustraliasales.com/127.0.0.1#5335\nipset=/beatsbydreaustraliasales.com/gfwlist\nserver=/fappenist.com/127.0.0.1#5335\nipset=/fappenist.com/gfwlist\nserver=/paypalhere.net/127.0.0.1#5335\nipset=/paypalhere.net/gfwlist\nserver=/calgoncarbon-china.com/127.0.0.1#5335\nipset=/calgoncarbon-china.com/gfwlist\nserver=/directvgrandslam.com/127.0.0.1#5335\nipset=/directvgrandslam.com/gfwlist\nserver=/primevideo.info/127.0.0.1#5335\nipset=/primevideo.info/gfwlist\nserver=/javvids.com/127.0.0.1#5335\nipset=/javvids.com/gfwlist\nserver=/mirailab.tech/127.0.0.1#5335\nipset=/mirailab.tech/gfwlist\nserver=/cerdas.com/127.0.0.1#5335\nipset=/cerdas.com/gfwlist\nserver=/mpweekly.com/127.0.0.1#5335\nipset=/mpweekly.com/gfwlist\nserver=/erotic-artsites.com/127.0.0.1#5335\nipset=/erotic-artsites.com/gfwlist\nserver=/yandex.org/127.0.0.1#5335\nipset=/yandex.org/gfwlist\nserver=/userapi.com/127.0.0.1#5335\nipset=/userapi.com/gfwlist\nserver=/amateurpornhouse.com/127.0.0.1#5335\nipset=/amateurpornhouse.com/gfwlist\nserver=/myradio.hk/127.0.0.1#5335\nipset=/myradio.hk/gfwlist\nserver=/pornstripgames.com/127.0.0.1#5335\nipset=/pornstripgames.com/gfwlist\nserver=/100beatscheap.com/127.0.0.1#5335\nipset=/100beatscheap.com/gfwlist\nserver=/starbucks.com.co/127.0.0.1#5335\nipset=/starbucks.com.co/gfwlist\nserver=/msecnd.net/127.0.0.1#5335\nipset=/msecnd.net/gfwlist\nserver=/intel.bi/127.0.0.1#5335\nipset=/intel.bi/gfwlist\nserver=/vanishstains.com.au/127.0.0.1#5335\nipset=/vanishstains.com.au/gfwlist\nserver=/exiporn.com/127.0.0.1#5335\nipset=/exiporn.com/gfwlist\nserver=/bmwcustomapparel.com/127.0.0.1#5335\nipset=/bmwcustomapparel.com/gfwlist\nserver=/pornhun.xyz/127.0.0.1#5335\nipset=/pornhun.xyz/gfwlist\nserver=/pornoxo.com/127.0.0.1#5335\nipset=/pornoxo.com/gfwlist\nserver=/fuckteenvids.com/127.0.0.1#5335\nipset=/fuckteenvids.com/gfwlist\nserver=/walmart.pharmacy/127.0.0.1#5335\nipset=/walmart.pharmacy/gfwlist\nserver=/facerbook.com/127.0.0.1#5335\nipset=/facerbook.com/gfwlist\nserver=/kama-nk.ru/127.0.0.1#5335\nipset=/kama-nk.ru/gfwlist\nserver=/cashify.com/127.0.0.1#5335\nipset=/cashify.com/gfwlist\nserver=/cuckold69.com/127.0.0.1#5335\nipset=/cuckold69.com/gfwlist\nserver=/cool-comics.com/127.0.0.1#5335\nipset=/cool-comics.com/gfwlist\nserver=/realtype.co.jp/127.0.0.1#5335\nipset=/realtype.co.jp/gfwlist\nserver=/karinahart.com/127.0.0.1#5335\nipset=/karinahart.com/gfwlist\nserver=/cs.co/127.0.0.1#5335\nipset=/cs.co/gfwlist\nserver=/rb.net/127.0.0.1#5335\nipset=/rb.net/gfwlist\nserver=/redxxxvideos.com/127.0.0.1#5335\nipset=/redxxxvideos.com/gfwlist\nserver=/dettol.cl/127.0.0.1#5335\nipset=/dettol.cl/gfwlist\nserver=/xvideosup.com.br/127.0.0.1#5335\nipset=/xvideosup.com.br/gfwlist\nserver=/applebk.net/127.0.0.1#5335\nipset=/applebk.net/gfwlist\nserver=/flaru.com/127.0.0.1#5335\nipset=/flaru.com/gfwlist\nserver=/intel.eg/127.0.0.1#5335\nipset=/intel.eg/gfwlist\nserver=/hentaitk.com/127.0.0.1#5335\nipset=/hentaitk.com/gfwlist\nserver=/amazonvideo.cc/127.0.0.1#5335\nipset=/amazonvideo.cc/gfwlist\nserver=/applecare.hamburg/127.0.0.1#5335\nipset=/applecare.hamburg/gfwlist\nserver=/bestbuy-giftcard.info/127.0.0.1#5335\nipset=/bestbuy-giftcard.info/gfwlist\nserver=/scholar.google.com.cu/127.0.0.1#5335\nipset=/scholar.google.com.cu/gfwlist\nserver=/drdrebeatsale.com/127.0.0.1#5335\nipset=/drdrebeatsale.com/gfwlist\nserver=/sexpornpictures.com/127.0.0.1#5335\nipset=/sexpornpictures.com/gfwlist\nserver=/bmw-worldfinal.com/127.0.0.1#5335\nipset=/bmw-worldfinal.com/gfwlist\nserver=/chyoa.com/127.0.0.1#5335\nipset=/chyoa.com/gfwlist\nserver=/townofsins.com/127.0.0.1#5335\nipset=/townofsins.com/gfwlist\nserver=/bdsmsexgame.com/127.0.0.1#5335\nipset=/bdsmsexgame.com/gfwlist\nserver=/u.nu/127.0.0.1#5335\nipset=/u.nu/gfwlist\nserver=/xxx2022.com/127.0.0.1#5335\nipset=/xxx2022.com/gfwlist\nserver=/sheshaft.com/127.0.0.1#5335\nipset=/sheshaft.com/gfwlist\nserver=/picasaweb.com/127.0.0.1#5335\nipset=/picasaweb.com/gfwlist\nserver=/hummingbird.ms/127.0.0.1#5335\nipset=/hummingbird.ms/gfwlist\nserver=/jdavsp.pw/127.0.0.1#5335\nipset=/jdavsp.pw/gfwlist\nserver=/bvdinfo.com/127.0.0.1#5335\nipset=/bvdinfo.com/gfwlist\nserver=/trycuckold.com/127.0.0.1#5335\nipset=/trycuckold.com/gfwlist\nserver=/erocurves.com/127.0.0.1#5335\nipset=/erocurves.com/gfwlist\nserver=/onlinefucktube.com/127.0.0.1#5335\nipset=/onlinefucktube.com/gfwlist\nserver=/9now.com.au/127.0.0.1#5335\nipset=/9now.com.au/gfwlist\nserver=/apple.fi/127.0.0.1#5335\nipset=/apple.fi/gfwlist\nserver=/moemax.net/127.0.0.1#5335\nipset=/moemax.net/gfwlist\nserver=/whatthefox.com/127.0.0.1#5335\nipset=/whatthefox.com/gfwlist\nserver=/terragraph.com/127.0.0.1#5335\nipset=/terragraph.com/gfwlist\nserver=/facebook.us/127.0.0.1#5335\nipset=/facebook.us/gfwlist\nserver=/logitech.biz/127.0.0.1#5335\nipset=/logitech.biz/gfwlist\nserver=/messenger.com/127.0.0.1#5335\nipset=/messenger.com/gfwlist\nserver=/wifehomeporn.com/127.0.0.1#5335\nipset=/wifehomeporn.com/gfwlist\nserver=/disneymagicmoments.gr/127.0.0.1#5335\nipset=/disneymagicmoments.gr/gfwlist\nserver=/mini.ie/127.0.0.1#5335\nipset=/mini.ie/gfwlist\nserver=/eromangajukujo.com/127.0.0.1#5335\nipset=/eromangajukujo.com/gfwlist\nserver=/39group.info/127.0.0.1#5335\nipset=/39group.info/gfwlist\nserver=/ero-labs.site/127.0.0.1#5335\nipset=/ero-labs.site/gfwlist\nserver=/womenwill.com.br/127.0.0.1#5335\nipset=/womenwill.com.br/gfwlist\nserver=/my13la.com/127.0.0.1#5335\nipset=/my13la.com/gfwlist\nserver=/quanben-xiaoshuo.com/127.0.0.1#5335\nipset=/quanben-xiaoshuo.com/gfwlist\nserver=/applestore.co.hu/127.0.0.1#5335\nipset=/applestore.co.hu/gfwlist\nserver=/mastercard.si/127.0.0.1#5335\nipset=/mastercard.si/gfwlist\nserver=/ebay.com/127.0.0.1#5335\nipset=/ebay.com/gfwlist\nserver=/intelcapital.net/127.0.0.1#5335\nipset=/intelcapital.net/gfwlist\nserver=/beatsbydre-outletsale.net/127.0.0.1#5335\nipset=/beatsbydre-outletsale.net/gfwlist\nserver=/nikeswim.com/127.0.0.1#5335\nipset=/nikeswim.com/gfwlist\nserver=/adobecc.com/127.0.0.1#5335\nipset=/adobecc.com/gfwlist\nserver=/businesstoday.com.tw/127.0.0.1#5335\nipset=/businesstoday.com.tw/gfwlist\nserver=/newsprestigenetwork.com.au/127.0.0.1#5335\nipset=/newsprestigenetwork.com.au/gfwlist\nserver=/foxcharlotte.com/127.0.0.1#5335\nipset=/foxcharlotte.com/gfwlist\nserver=/epochtimes-romania.com/127.0.0.1#5335\nipset=/epochtimes-romania.com/gfwlist\nserver=/bustydustystash.com/127.0.0.1#5335\nipset=/bustydustystash.com/gfwlist\nserver=/acasadasbrasileirinhas.com.br/127.0.0.1#5335\nipset=/acasadasbrasileirinhas.com.br/gfwlist\nserver=/lbtube.com/127.0.0.1#5335\nipset=/lbtube.com/gfwlist\nserver=/disneymagicmoments.fr/127.0.0.1#5335\nipset=/disneymagicmoments.fr/gfwlist\nserver=/nabtravellercard.com.au/127.0.0.1#5335\nipset=/nabtravellercard.com.au/gfwlist\nserver=/paypal-center.net/127.0.0.1#5335\nipset=/paypal-center.net/gfwlist\nserver=/watchout.tw/127.0.0.1#5335\nipset=/watchout.tw/gfwlist\nserver=/banned.video/127.0.0.1#5335\nipset=/banned.video/gfwlist\nserver=/sf.net/127.0.0.1#5335\nipset=/sf.net/gfwlist\nserver=/popjav.tv/127.0.0.1#5335\nipset=/popjav.tv/gfwlist\nserver=/he.net/127.0.0.1#5335\nipset=/he.net/gfwlist\nserver=/xx9.app/127.0.0.1#5335\nipset=/xx9.app/gfwlist\nserver=/ebay.co.nz/127.0.0.1#5335\nipset=/ebay.co.nz/gfwlist\nserver=/spotifycdn.net/127.0.0.1#5335\nipset=/spotifycdn.net/gfwlist\nserver=/blogspot.com.co/127.0.0.1#5335\nipset=/blogspot.com.co/gfwlist\nserver=/brandproducts1688.com/127.0.0.1#5335\nipset=/brandproducts1688.com/gfwlist\nserver=/sextube.desi/127.0.0.1#5335\nipset=/sextube.desi/gfwlist\nserver=/shops-disney.com/127.0.0.1#5335\nipset=/shops-disney.com/gfwlist\nserver=/instagram-help.com/127.0.0.1#5335\nipset=/instagram-help.com/gfwlist\nserver=/justusboys.com/127.0.0.1#5335\nipset=/justusboys.com/gfwlist\nserver=/lnstagram-help.com/127.0.0.1#5335\nipset=/lnstagram-help.com/gfwlist\nserver=/sexwithhorse.net/127.0.0.1#5335\nipset=/sexwithhorse.net/gfwlist\nserver=/instagramm.com/127.0.0.1#5335\nipset=/instagramm.com/gfwlist\nserver=/new3dcomics.com/127.0.0.1#5335\nipset=/new3dcomics.com/gfwlist\nserver=/xxxbule.com/127.0.0.1#5335\nipset=/xxxbule.com/gfwlist\nserver=/skype.com/127.0.0.1#5335\nipset=/skype.com/gfwlist\nserver=/visabusinessinsights.com/127.0.0.1#5335\nipset=/visabusinessinsights.com/gfwlist\nserver=/sex-douga.jp/127.0.0.1#5335\nipset=/sex-douga.jp/gfwlist\nserver=/appstore.ph/127.0.0.1#5335\nipset=/appstore.ph/gfwlist\nserver=/nvidia.com.br/127.0.0.1#5335\nipset=/nvidia.com.br/gfwlist\nserver=/topless.com.ua/127.0.0.1#5335\nipset=/topless.com.ua/gfwlist\nserver=/coinone.co.kr/127.0.0.1#5335\nipset=/coinone.co.kr/gfwlist\nserver=/universalorlando.com/127.0.0.1#5335\nipset=/universalorlando.com/gfwlist\nserver=/huobi.pro/127.0.0.1#5335\nipset=/huobi.pro/gfwlist\nserver=/steamcommunity-a.akamaihd.net/127.0.0.1#5335\nipset=/steamcommunity-a.akamaihd.net/gfwlist\nserver=/volvotrucks.no/127.0.0.1#5335\nipset=/volvotrucks.no/gfwlist\nserver=/paisapay.info/127.0.0.1#5335\nipset=/paisapay.info/gfwlist\nserver=/vfsco.at/127.0.0.1#5335\nipset=/vfsco.at/gfwlist\nserver=/hentaifox.tv/127.0.0.1#5335\nipset=/hentaifox.tv/gfwlist\nserver=/sleazyneasy.com/127.0.0.1#5335\nipset=/sleazyneasy.com/gfwlist\nserver=/sikiswap.com/127.0.0.1#5335\nipset=/sikiswap.com/gfwlist\nserver=/magentocommerce.com/127.0.0.1#5335\nipset=/magentocommerce.com/gfwlist\nserver=/xamarin.com/127.0.0.1#5335\nipset=/xamarin.com/gfwlist\nserver=/ipfs.fleek.co/127.0.0.1#5335\nipset=/ipfs.fleek.co/gfwlist\nserver=/dailymail.com.au/127.0.0.1#5335\nipset=/dailymail.com.au/gfwlist\nserver=/mini-clubs-international.com/127.0.0.1#5335\nipset=/mini-clubs-international.com/gfwlist\nserver=/paofu.cloud/127.0.0.1#5335\nipset=/paofu.cloud/gfwlist\nserver=/bwbx.io/127.0.0.1#5335\nipset=/bwbx.io/gfwlist\nserver=/japan18tube.com/127.0.0.1#5335\nipset=/japan18tube.com/gfwlist\nserver=/qualphone.com/127.0.0.1#5335\nipset=/qualphone.com/gfwlist\nserver=/viacbs.com/127.0.0.1#5335\nipset=/viacbs.com/gfwlist\nserver=/ebay.com.ec/127.0.0.1#5335\nipset=/ebay.com.ec/gfwlist\nserver=/pussymomsex.com/127.0.0.1#5335\nipset=/pussymomsex.com/gfwlist\nserver=/skate2.com/127.0.0.1#5335\nipset=/skate2.com/gfwlist\nserver=/faceobok.com/127.0.0.1#5335\nipset=/faceobok.com/gfwlist\nserver=/thai69.com/127.0.0.1#5335\nipset=/thai69.com/gfwlist\nserver=/aka-ai.com/127.0.0.1#5335\nipset=/aka-ai.com/gfwlist\nserver=/boobieblog.com/127.0.0.1#5335\nipset=/boobieblog.com/gfwlist\nserver=/askfacebook.net/127.0.0.1#5335\nipset=/askfacebook.net/gfwlist\nserver=/minie.com/127.0.0.1#5335\nipset=/minie.com/gfwlist\nserver=/hpstore-emea.com/127.0.0.1#5335\nipset=/hpstore-emea.com/gfwlist\nserver=/mininanaimo.ca/127.0.0.1#5335\nipset=/mininanaimo.ca/gfwlist\nserver=/greatergothammini.com/127.0.0.1#5335\nipset=/greatergothammini.com/gfwlist\nserver=/facebookpoke.net/127.0.0.1#5335\nipset=/facebookpoke.net/gfwlist\nserver=/gaypornhdfree.com/127.0.0.1#5335\nipset=/gaypornhdfree.com/gfwlist\nserver=/dynacw.com.hk/127.0.0.1#5335\nipset=/dynacw.com.hk/gfwlist\nserver=/ebayfrance.com/127.0.0.1#5335\nipset=/ebayfrance.com/gfwlist\nserver=/bmw-motorrad.uy/127.0.0.1#5335\nipset=/bmw-motorrad.uy/gfwlist\nserver=/chinese-porn-videos.com/127.0.0.1#5335\nipset=/chinese-porn-videos.com/gfwlist\nserver=/geeksquadcares.com/127.0.0.1#5335\nipset=/geeksquadcares.com/gfwlist\nserver=/bmwmc.net/127.0.0.1#5335\nipset=/bmwmc.net/gfwlist\nserver=/microbit.org/127.0.0.1#5335\nipset=/microbit.org/gfwlist\nserver=/ikea.co.om/127.0.0.1#5335\nipset=/ikea.co.om/gfwlist\nserver=/hentai.pink/127.0.0.1#5335\nipset=/hentai.pink/gfwlist\nserver=/asto.re/127.0.0.1#5335\nipset=/asto.re/gfwlist\nserver=/cern.ch/127.0.0.1#5335\nipset=/cern.ch/gfwlist\nserver=/beatscollection2014.com/127.0.0.1#5335\nipset=/beatscollection2014.com/gfwlist\nserver=/microsoftdiplomados.com/127.0.0.1#5335\nipset=/microsoftdiplomados.com/gfwlist\nserver=/mixasiansex.com/127.0.0.1#5335\nipset=/mixasiansex.com/gfwlist\nserver=/literatumonline.com/127.0.0.1#5335\nipset=/literatumonline.com/gfwlist\nserver=/facebookpaper.com/127.0.0.1#5335\nipset=/facebookpaper.com/gfwlist\nserver=/visa.com.tw/127.0.0.1#5335\nipset=/visa.com.tw/gfwlist\nserver=/apple.si/127.0.0.1#5335\nipset=/apple.si/gfwlist\nserver=/callersbane.com/127.0.0.1#5335\nipset=/callersbane.com/gfwlist\nserver=/agu.org/127.0.0.1#5335\nipset=/agu.org/gfwlist\nserver=/ferronetwork.com/127.0.0.1#5335\nipset=/ferronetwork.com/gfwlist\nserver=/motherless.com/127.0.0.1#5335\nipset=/motherless.com/gfwlist\nserver=/paypal-forward.com/127.0.0.1#5335\nipset=/paypal-forward.com/gfwlist\nserver=/xn--6eup7j.com/127.0.0.1#5335\nipset=/xn--6eup7j.com/gfwlist\nserver=/londonmithraeum.com/127.0.0.1#5335\nipset=/londonmithraeum.com/gfwlist\nserver=/dettol.co.id/127.0.0.1#5335\nipset=/dettol.co.id/gfwlist\nserver=/doseofporn.com/127.0.0.1#5335\nipset=/doseofporn.com/gfwlist\nserver=/paxful.com/127.0.0.1#5335\nipset=/paxful.com/gfwlist\nserver=/vfsco.no/127.0.0.1#5335\nipset=/vfsco.no/gfwlist\nserver=/lotcrap.com/127.0.0.1#5335\nipset=/lotcrap.com/gfwlist\nserver=/digitalpack.com/127.0.0.1#5335\nipset=/digitalpack.com/gfwlist\nserver=/bmwgroup-werke.com/127.0.0.1#5335\nipset=/bmwgroup-werke.com/gfwlist\nserver=/finish.co.kr/127.0.0.1#5335\nipset=/finish.co.kr/gfwlist\nserver=/mrskin.com/127.0.0.1#5335\nipset=/mrskin.com/gfwlist\nserver=/comicunivers.com/127.0.0.1#5335\nipset=/comicunivers.com/gfwlist\nserver=/haplorrhini.com/127.0.0.1#5335\nipset=/haplorrhini.com/gfwlist\nserver=/intellij.org/127.0.0.1#5335\nipset=/intellij.org/gfwlist\nserver=/zhaimankan.com/127.0.0.1#5335\nipset=/zhaimankan.com/gfwlist\nserver=/youngamateursporn.com/127.0.0.1#5335\nipset=/youngamateursporn.com/gfwlist\nserver=/lbfmaddiction.com/127.0.0.1#5335\nipset=/lbfmaddiction.com/gfwlist\nserver=/theclub.com.hk/127.0.0.1#5335\nipset=/theclub.com.hk/gfwlist\nserver=/google.com.ai/127.0.0.1#5335\nipset=/google.com.ai/gfwlist\nserver=/solarcity.com/127.0.0.1#5335\nipset=/solarcity.com/gfwlist\nserver=/kslive.tv/127.0.0.1#5335\nipset=/kslive.tv/gfwlist\nserver=/pinimg.com/127.0.0.1#5335\nipset=/pinimg.com/gfwlist\nserver=/xnxxarabsex.com/127.0.0.1#5335\nipset=/xnxxarabsex.com/gfwlist\nserver=/realpornclip.com/127.0.0.1#5335\nipset=/realpornclip.com/gfwlist\nserver=/vimeobusiness.com/127.0.0.1#5335\nipset=/vimeobusiness.com/gfwlist\nserver=/eroxia.com/127.0.0.1#5335\nipset=/eroxia.com/gfwlist\nserver=/sextube.fm/127.0.0.1#5335\nipset=/sextube.fm/gfwlist\nserver=/bmwgroup.at/127.0.0.1#5335\nipset=/bmwgroup.at/gfwlist\nserver=/bnetproduct-a.akamaihd.net/127.0.0.1#5335\nipset=/bnetproduct-a.akamaihd.net/gfwlist\nserver=/12diasderegalosdeitunes.pe/127.0.0.1#5335\nipset=/12diasderegalosdeitunes.pe/gfwlist\nserver=/ebay.pl/127.0.0.1#5335\nipset=/ebay.pl/gfwlist\nserver=/fullsexmovs.com/127.0.0.1#5335\nipset=/fullsexmovs.com/gfwlist\nserver=/sss.xxx/127.0.0.1#5335\nipset=/sss.xxx/gfwlist\nserver=/quatrowireless.com/127.0.0.1#5335\nipset=/quatrowireless.com/gfwlist\nserver=/123-hp.com/127.0.0.1#5335\nipset=/123-hp.com/gfwlist\nserver=/hotasianbabes.com/127.0.0.1#5335\nipset=/hotasianbabes.com/gfwlist\nserver=/acheter-followers-instagram.com/127.0.0.1#5335\nipset=/acheter-followers-instagram.com/gfwlist\nserver=/steampowered.com/127.0.0.1#5335\nipset=/steampowered.com/gfwlist\nserver=/cumswappingsis.com/127.0.0.1#5335\nipset=/cumswappingsis.com/gfwlist\nserver=/dfp6rglgjqszk.cloudfront.net/127.0.0.1#5335\nipset=/dfp6rglgjqszk.cloudfront.net/gfwlist\nserver=/clients1.google.com/127.0.0.1#5335\nipset=/clients1.google.com/gfwlist\nserver=/vod-hls-uk-live.akamaized.net/127.0.0.1#5335\nipset=/vod-hls-uk-live.akamaized.net/gfwlist\nserver=/bmw-motorrad.co.nz/127.0.0.1#5335\nipset=/bmw-motorrad.co.nz/gfwlist\nserver=/applecarbon.com/127.0.0.1#5335\nipset=/applecarbon.com/gfwlist\nserver=/nudevista.club/127.0.0.1#5335\nipset=/nudevista.club/gfwlist\nserver=/amazon.com.tr/127.0.0.1#5335\nipset=/amazon.com.tr/gfwlist\nserver=/javtorrent.tk/127.0.0.1#5335\nipset=/javtorrent.tk/gfwlist\nserver=/boodigo.com/127.0.0.1#5335\nipset=/boodigo.com/gfwlist\nserver=/riotgames.jp/127.0.0.1#5335\nipset=/riotgames.jp/gfwlist\nserver=/gordonmoore.com/127.0.0.1#5335\nipset=/gordonmoore.com/gfwlist\nserver=/adobecreativityawards.com/127.0.0.1#5335\nipset=/adobecreativityawards.com/gfwlist\nserver=/scatvids.club/127.0.0.1#5335\nipset=/scatvids.club/gfwlist\nserver=/ebayjob.com/127.0.0.1#5335\nipset=/ebayjob.com/gfwlist\nserver=/viacomcbspressexpress.com/127.0.0.1#5335\nipset=/viacomcbspressexpress.com/gfwlist\nserver=/nhentai.net/127.0.0.1#5335\nipset=/nhentai.net/gfwlist\nserver=/holloporn.com/127.0.0.1#5335\nipset=/holloporn.com/gfwlist\nserver=/foxnetworksinfo.com/127.0.0.1#5335\nipset=/foxnetworksinfo.com/gfwlist\nserver=/swoo.sh/127.0.0.1#5335\nipset=/swoo.sh/gfwlist\nserver=/fox28media.com/127.0.0.1#5335\nipset=/fox28media.com/gfwlist\nserver=/desertbmw.com/127.0.0.1#5335\nipset=/desertbmw.com/gfwlist\nserver=/voatibetanenglish.com/127.0.0.1#5335\nipset=/voatibetanenglish.com/gfwlist\nserver=/arcadewank.com/127.0.0.1#5335\nipset=/arcadewank.com/gfwlist\nserver=/epochtime.com/127.0.0.1#5335\nipset=/epochtime.com/gfwlist\nserver=/1337xto.to/127.0.0.1#5335\nipset=/1337xto.to/gfwlist\nserver=/cnix-gov-cn.com/127.0.0.1#5335\nipset=/cnix-gov-cn.com/gfwlist\nserver=/ebaycommercenetwork.com/127.0.0.1#5335\nipset=/ebaycommercenetwork.com/gfwlist\nserver=/managedmeetingrooms.com/127.0.0.1#5335\nipset=/managedmeetingrooms.com/gfwlist\nserver=/ads-twitter.com/127.0.0.1#5335\nipset=/ads-twitter.com/gfwlist\nserver=/myboylove.com/127.0.0.1#5335\nipset=/myboylove.com/gfwlist\nserver=/xandr.com/127.0.0.1#5335\nipset=/xandr.com/gfwlist\nserver=/mybmw.com/127.0.0.1#5335\nipset=/mybmw.com/gfwlist\nserver=/rolls-roycemotorcarsna.com/127.0.0.1#5335\nipset=/rolls-roycemotorcarsna.com/gfwlist\nserver=/drebeats-singaporecheap.com/127.0.0.1#5335\nipset=/drebeats-singaporecheap.com/gfwlist\nserver=/ladyboypornonly.com/127.0.0.1#5335\nipset=/ladyboypornonly.com/gfwlist\nserver=/ijavhd.com/127.0.0.1#5335\nipset=/ijavhd.com/gfwlist\nserver=/api-extractor.com/127.0.0.1#5335\nipset=/api-extractor.com/gfwlist\nserver=/guardianproject.info/127.0.0.1#5335\nipset=/guardianproject.info/gfwlist\nserver=/truyen18.xyz/127.0.0.1#5335\nipset=/truyen18.xyz/gfwlist\nserver=/firesidegatherings.com/127.0.0.1#5335\nipset=/firesidegatherings.com/gfwlist\nserver=/x6av.com/127.0.0.1#5335\nipset=/x6av.com/gfwlist\nserver=/nudistvoyeurbeach.com/127.0.0.1#5335\nipset=/nudistvoyeurbeach.com/gfwlist\nserver=/3hentai.net/127.0.0.1#5335\nipset=/3hentai.net/gfwlist\nserver=/zee5.in/127.0.0.1#5335\nipset=/zee5.in/gfwlist\nserver=/bmw-iraq.com/127.0.0.1#5335\nipset=/bmw-iraq.com/gfwlist\nserver=/azure-dns.net/127.0.0.1#5335\nipset=/azure-dns.net/gfwlist\nserver=/youtubego.com.br/127.0.0.1#5335\nipset=/youtubego.com.br/gfwlist\nserver=/90seconds.asia/127.0.0.1#5335\nipset=/90seconds.asia/gfwlist\nserver=/ikea.lt/127.0.0.1#5335\nipset=/ikea.lt/gfwlist\nserver=/flexsig.com/127.0.0.1#5335\nipset=/flexsig.com/gfwlist\nserver=/babesource.com/127.0.0.1#5335\nipset=/babesource.com/gfwlist\nserver=/ubereats.com/127.0.0.1#5335\nipset=/ubereats.com/gfwlist\nserver=/facebookporn.net/127.0.0.1#5335\nipset=/facebookporn.net/gfwlist\nserver=/smartexpos.com/127.0.0.1#5335\nipset=/smartexpos.com/gfwlist\nserver=/hpcomputerservices.com/127.0.0.1#5335\nipset=/hpcomputerservices.com/gfwlist\nserver=/avstar07.com/127.0.0.1#5335\nipset=/avstar07.com/gfwlist\nserver=/ywbclx.top/127.0.0.1#5335\nipset=/ywbclx.top/gfwlist\nserver=/yahoo.com.my/127.0.0.1#5335\nipset=/yahoo.com.my/gfwlist\nserver=/egghead.io/127.0.0.1#5335\nipset=/egghead.io/gfwlist\nserver=/volvogroup.pl/127.0.0.1#5335\nipset=/volvogroup.pl/gfwlist\nserver=/amazon.jobs/127.0.0.1#5335\nipset=/amazon.jobs/gfwlist\nserver=/silverchair-cdn.com/127.0.0.1#5335\nipset=/silverchair-cdn.com/gfwlist\nserver=/intc.com/127.0.0.1#5335\nipset=/intc.com/gfwlist\nserver=/addthis.com/127.0.0.1#5335\nipset=/addthis.com/gfwlist\nserver=/bmw.ch/127.0.0.1#5335\nipset=/bmw.ch/gfwlist\nserver=/slutdump.com/127.0.0.1#5335\nipset=/slutdump.com/gfwlist\nserver=/visa.com.lk/127.0.0.1#5335\nipset=/visa.com.lk/gfwlist\nserver=/airav.wiki/127.0.0.1#5335\nipset=/airav.wiki/gfwlist\nserver=/accessfacebookfromschool.com/127.0.0.1#5335\nipset=/accessfacebookfromschool.com/gfwlist\nserver=/teensloveporn.net/127.0.0.1#5335\nipset=/teensloveporn.net/gfwlist\nserver=/fbcdn.net/127.0.0.1#5335\nipset=/fbcdn.net/gfwlist\nserver=/edx-cdn.org/127.0.0.1#5335\nipset=/edx-cdn.org/gfwlist\nserver=/footseen.com/127.0.0.1#5335\nipset=/footseen.com/gfwlist\nserver=/pornoscanner.com/127.0.0.1#5335\nipset=/pornoscanner.com/gfwlist\nserver=/javhdporn.net/127.0.0.1#5335\nipset=/javhdporn.net/gfwlist\nserver=/ebay-inc.com/127.0.0.1#5335\nipset=/ebay-inc.com/gfwlist\nserver=/avstar5.com/127.0.0.1#5335\nipset=/avstar5.com/gfwlist\nserver=/topsexart.com/127.0.0.1#5335\nipset=/topsexart.com/gfwlist\nserver=/calgon.pt/127.0.0.1#5335\nipset=/calgon.pt/gfwlist\nserver=/91se.fun/127.0.0.1#5335\nipset=/91se.fun/gfwlist\nserver=/karlajames.com/127.0.0.1#5335\nipset=/karlajames.com/gfwlist\nserver=/sexmovies24.com/127.0.0.1#5335\nipset=/sexmovies24.com/gfwlist\nserver=/nike.gy/127.0.0.1#5335\nipset=/nike.gy/gfwlist\nserver=/milehighmedia.com/127.0.0.1#5335\nipset=/milehighmedia.com/gfwlist\nserver=/xn--3et96bj49ahpq.com/127.0.0.1#5335\nipset=/xn--3et96bj49ahpq.com/gfwlist\nserver=/trueamateurmodels.com/127.0.0.1#5335\nipset=/trueamateurmodels.com/gfwlist\nserver=/volvogroup.pe/127.0.0.1#5335\nipset=/volvogroup.pe/gfwlist\nserver=/engineeringvillage.com/127.0.0.1#5335\nipset=/engineeringvillage.com/gfwlist\nserver=/youtube.fi/127.0.0.1#5335\nipset=/youtube.fi/gfwlist\nserver=/ebay.vn/127.0.0.1#5335\nipset=/ebay.vn/gfwlist\nserver=/livecamclips.com/127.0.0.1#5335\nipset=/livecamclips.com/gfwlist\nserver=/flirtyhoookup.com/127.0.0.1#5335\nipset=/flirtyhoookup.com/gfwlist\nserver=/microsofthouse.com/127.0.0.1#5335\nipset=/microsofthouse.com/gfwlist\nserver=/speedxtra.com/127.0.0.1#5335\nipset=/speedxtra.com/gfwlist\nserver=/ebayclassifiedsgroup.com/127.0.0.1#5335\nipset=/ebayclassifiedsgroup.com/gfwlist\nserver=/bmw-motorrad.co.th/127.0.0.1#5335\nipset=/bmw-motorrad.co.th/gfwlist\nserver=/garena.my/127.0.0.1#5335\nipset=/garena.my/gfwlist\nserver=/instagramsepeti.com/127.0.0.1#5335\nipset=/instagramsepeti.com/gfwlist\nserver=/globalsign.com/127.0.0.1#5335\nipset=/globalsign.com/gfwlist\nserver=/iphone.cm/127.0.0.1#5335\nipset=/iphone.cm/gfwlist\nserver=/ems-ph.org/127.0.0.1#5335\nipset=/ems-ph.org/gfwlist\nserver=/pornwhite.com/127.0.0.1#5335\nipset=/pornwhite.com/gfwlist\nserver=/gettyimages.in/127.0.0.1#5335\nipset=/gettyimages.in/gfwlist\nserver=/hardcoregayblog.com/127.0.0.1#5335\nipset=/hardcoregayblog.com/gfwlist\nserver=/bestescortgirls.nl/127.0.0.1#5335\nipset=/bestescortgirls.nl/gfwlist\nserver=/nightclub.eu/127.0.0.1#5335\nipset=/nightclub.eu/gfwlist\nserver=/ukwhoswho.com/127.0.0.1#5335\nipset=/ukwhoswho.com/gfwlist\nserver=/coitustube.com/127.0.0.1#5335\nipset=/coitustube.com/gfwlist\nserver=/beats4salecheap.com/127.0.0.1#5335\nipset=/beats4salecheap.com/gfwlist\nserver=/pornmagnet.org/127.0.0.1#5335\nipset=/pornmagnet.org/gfwlist\nserver=/applecare.wang/127.0.0.1#5335\nipset=/applecare.wang/gfwlist\nserver=/wa.me/127.0.0.1#5335\nipset=/wa.me/gfwlist\nserver=/needforspeedtakedown.com/127.0.0.1#5335\nipset=/needforspeedtakedown.com/gfwlist\nserver=/cliphayho.com/127.0.0.1#5335\nipset=/cliphayho.com/gfwlist\nserver=/runwayescorts.com/127.0.0.1#5335\nipset=/runwayescorts.com/gfwlist\nserver=/riotforgegames.com/127.0.0.1#5335\nipset=/riotforgegames.com/gfwlist\nserver=/x-fetish.org/127.0.0.1#5335\nipset=/x-fetish.org/gfwlist\nserver=/s-xoom.com/127.0.0.1#5335\nipset=/s-xoom.com/gfwlist\nserver=/gfleaks.com/127.0.0.1#5335\nipset=/gfleaks.com/gfwlist\nserver=/eamythic.com/127.0.0.1#5335\nipset=/eamythic.com/gfwlist\nserver=/tiffany-towers.com/127.0.0.1#5335\nipset=/tiffany-towers.com/gfwlist\nserver=/hpwellnesscentral.com/127.0.0.1#5335\nipset=/hpwellnesscentral.com/gfwlist\nserver=/myradio.com.hk/127.0.0.1#5335\nipset=/myradio.com.hk/gfwlist\nserver=/cbsistatic.com/127.0.0.1#5335\nipset=/cbsistatic.com/gfwlist\nserver=/hbogoasia.tw/127.0.0.1#5335\nipset=/hbogoasia.tw/gfwlist\nserver=/wiifitu.com/127.0.0.1#5335\nipset=/wiifitu.com/gfwlist\nserver=/airwatchqa.com/127.0.0.1#5335\nipset=/airwatchqa.com/gfwlist\nserver=/futunited.com/127.0.0.1#5335\nipset=/futunited.com/gfwlist\nserver=/spermyporn.com/127.0.0.1#5335\nipset=/spermyporn.com/gfwlist\nserver=/eskimotube.com/127.0.0.1#5335\nipset=/eskimotube.com/gfwlist\nserver=/slutclit.com/127.0.0.1#5335\nipset=/slutclit.com/gfwlist\nserver=/adidas.com/127.0.0.1#5335\nipset=/adidas.com/gfwlist\nserver=/durex-shop.ch/127.0.0.1#5335\nipset=/durex-shop.ch/gfwlist\nserver=/iphonexs.tv/127.0.0.1#5335\nipset=/iphonexs.tv/gfwlist\nserver=/yahoo.lu/127.0.0.1#5335\nipset=/yahoo.lu/gfwlist\nserver=/myfoxtampabay.com/127.0.0.1#5335\nipset=/myfoxtampabay.com/gfwlist\nserver=/gloryholefucking.com/127.0.0.1#5335\nipset=/gloryholefucking.com/gfwlist\nserver=/microsoftnews.com/127.0.0.1#5335\nipset=/microsoftnews.com/gfwlist\nserver=/standardsuniversity.org/127.0.0.1#5335\nipset=/standardsuniversity.org/gfwlist\nserver=/gate.cc/127.0.0.1#5335\nipset=/gate.cc/gfwlist\nserver=/iphonecases100.com/127.0.0.1#5335\nipset=/iphonecases100.com/gfwlist\nserver=/bmw-pma.com.sg/127.0.0.1#5335\nipset=/bmw-pma.com.sg/gfwlist\nserver=/akamaa.com/127.0.0.1#5335\nipset=/akamaa.com/gfwlist\nserver=/swiftfinancial.com/127.0.0.1#5335\nipset=/swiftfinancial.com/gfwlist\nserver=/zb.app/127.0.0.1#5335\nipset=/zb.app/gfwlist\nserver=/sex.sex/127.0.0.1#5335\nipset=/sex.sex/gfwlist\nserver=/applefinalcutproworld.net/127.0.0.1#5335\nipset=/applefinalcutproworld.net/gfwlist\nserver=/afp.com/127.0.0.1#5335\nipset=/afp.com/gfwlist\nserver=/bmw-werk-berlin.de/127.0.0.1#5335\nipset=/bmw-werk-berlin.de/gfwlist\nserver=/zb.live/127.0.0.1#5335\nipset=/zb.live/gfwlist\nserver=/get.app/127.0.0.1#5335\nipset=/get.app/gfwlist\nserver=/scholar.google.ch/127.0.0.1#5335\nipset=/scholar.google.ch/gfwlist\nserver=/mylittlenieces.com/127.0.0.1#5335\nipset=/mylittlenieces.com/gfwlist\nserver=/megahdporno.net/127.0.0.1#5335\nipset=/megahdporno.net/gfwlist\nserver=/adidas.it/127.0.0.1#5335\nipset=/adidas.it/gfwlist\nserver=/youngheaven.com/127.0.0.1#5335\nipset=/youngheaven.com/gfwlist\nserver=/pearson.com.ar/127.0.0.1#5335\nipset=/pearson.com.ar/gfwlist\nserver=/alt4-mtalk.google.com/127.0.0.1#5335\nipset=/alt4-mtalk.google.com/gfwlist\nserver=/gettyimages.se/127.0.0.1#5335\nipset=/gettyimages.se/gfwlist\nserver=/nuddess.com/127.0.0.1#5335\nipset=/nuddess.com/gfwlist\nserver=/onani-daisuki.com/127.0.0.1#5335\nipset=/onani-daisuki.com/gfwlist\nserver=/coursera-for-business.org/127.0.0.1#5335\nipset=/coursera-for-business.org/gfwlist\nserver=/gamesathletes.com/127.0.0.1#5335\nipset=/gamesathletes.com/gfwlist\nserver=/alphabet.com.lv/127.0.0.1#5335\nipset=/alphabet.com.lv/gfwlist\nserver=/hdreporn.com/127.0.0.1#5335\nipset=/hdreporn.com/gfwlist\nserver=/decrypt.day/127.0.0.1#5335\nipset=/decrypt.day/gfwlist\nserver=/espn.co.uk/127.0.0.1#5335\nipset=/espn.co.uk/gfwlist\nserver=/sandisk.id/127.0.0.1#5335\nipset=/sandisk.id/gfwlist\nserver=/scholar.google.hr/127.0.0.1#5335\nipset=/scholar.google.hr/gfwlist\nserver=/beatsbydregot.com/127.0.0.1#5335\nipset=/beatsbydregot.com/gfwlist\nserver=/tesla.com/127.0.0.1#5335\nipset=/tesla.com/gfwlist\nserver=/dickhardon.com/127.0.0.1#5335\nipset=/dickhardon.com/gfwlist\nserver=/imageshack.us/127.0.0.1#5335\nipset=/imageshack.us/gfwlist\nserver=/baselinestudy.org/127.0.0.1#5335\nipset=/baselinestudy.org/gfwlist\nserver=/mucinex.co.nz/127.0.0.1#5335\nipset=/mucinex.co.nz/gfwlist\nserver=/xingrz.me/127.0.0.1#5335\nipset=/xingrz.me/gfwlist\nserver=/cash2.com/127.0.0.1#5335\nipset=/cash2.com/gfwlist\nserver=/unrealtournament.com/127.0.0.1#5335\nipset=/unrealtournament.com/gfwlist\nserver=/travelex.de/127.0.0.1#5335\nipset=/travelex.de/gfwlist\nserver=/jwplayer.com/127.0.0.1#5335\nipset=/jwplayer.com/gfwlist\nserver=/swingercuckoldporn.com/127.0.0.1#5335\nipset=/swingercuckoldporn.com/gfwlist\nserver=/pagespeedmobilizer.com/127.0.0.1#5335\nipset=/pagespeedmobilizer.com/gfwlist\nserver=/casquebeatsdre2013.com/127.0.0.1#5335\nipset=/casquebeatsdre2013.com/gfwlist\nserver=/homepornking.com/127.0.0.1#5335\nipset=/homepornking.com/gfwlist\nserver=/iphone.net.gr/127.0.0.1#5335\nipset=/iphone.net.gr/gfwlist\nserver=/blogspot.lu/127.0.0.1#5335\nipset=/blogspot.lu/gfwlist\nserver=/intel.com/127.0.0.1#5335\nipset=/intel.com/gfwlist\nserver=/bdsm-mov.net/127.0.0.1#5335\nipset=/bdsm-mov.net/gfwlist\nserver=/iwaponline.com/127.0.0.1#5335\nipset=/iwaponline.com/gfwlist\nserver=/applehongkong.com.hk/127.0.0.1#5335\nipset=/applehongkong.com.hk/gfwlist\nserver=/visiontimes.fr/127.0.0.1#5335\nipset=/visiontimes.fr/gfwlist\nserver=/69luolie.com/127.0.0.1#5335\nipset=/69luolie.com/gfwlist\nserver=/ieee-into-focus.org/127.0.0.1#5335\nipset=/ieee-into-focus.org/gfwlist\nserver=/hotladsworld.com/127.0.0.1#5335\nipset=/hotladsworld.com/gfwlist\nserver=/edengay.net/127.0.0.1#5335\nipset=/edengay.net/gfwlist\nserver=/beatsbydreexecutivesale.com/127.0.0.1#5335\nipset=/beatsbydreexecutivesale.com/gfwlist\nserver=/akadns.com/127.0.0.1#5335\nipset=/akadns.com/gfwlist\nserver=/googlemail.com/127.0.0.1#5335\nipset=/googlemail.com/gfwlist\nserver=/jabcomix.com/127.0.0.1#5335\nipset=/jabcomix.com/gfwlist\nserver=/fujinkoron.jp/127.0.0.1#5335\nipset=/fujinkoron.jp/gfwlist\nserver=/ponyanimalsex.com/127.0.0.1#5335\nipset=/ponyanimalsex.com/gfwlist\nserver=/facebookappcenter.net/127.0.0.1#5335\nipset=/facebookappcenter.net/gfwlist\nserver=/bigtitsgallery.net/127.0.0.1#5335\nipset=/bigtitsgallery.net/gfwlist\nserver=/crazyxxx3dworld.org/127.0.0.1#5335\nipset=/crazyxxx3dworld.org/gfwlist\nserver=/gitbook.com/127.0.0.1#5335\nipset=/gitbook.com/gfwlist\nserver=/absoluporn.com/127.0.0.1#5335\nipset=/absoluporn.com/gfwlist\nserver=/paypal.com.hk/127.0.0.1#5335\nipset=/paypal.com.hk/gfwlist\nserver=/worldpornvideos.com/127.0.0.1#5335\nipset=/worldpornvideos.com/gfwlist\nserver=/indiansexstories.net/127.0.0.1#5335\nipset=/indiansexstories.net/gfwlist\nserver=/nvidia.com.mx/127.0.0.1#5335\nipset=/nvidia.com.mx/gfwlist\nserver=/qdiehzz7.me/127.0.0.1#5335\nipset=/qdiehzz7.me/gfwlist\nserver=/arabnek.com/127.0.0.1#5335\nipset=/arabnek.com/gfwlist\nserver=/nonktube.com/127.0.0.1#5335\nipset=/nonktube.com/gfwlist\nserver=/nlm.io/127.0.0.1#5335\nipset=/nlm.io/gfwlist\nserver=/pokemonultrasunmoon.com/127.0.0.1#5335\nipset=/pokemonultrasunmoon.com/gfwlist\nserver=/sp.cool/127.0.0.1#5335\nipset=/sp.cool/gfwlist\nserver=/facetook.com/127.0.0.1#5335\nipset=/facetook.com/gfwlist\nserver=/animalporn.me/127.0.0.1#5335\nipset=/animalporn.me/gfwlist\nserver=/desipornfilms.com/127.0.0.1#5335\nipset=/desipornfilms.com/gfwlist\nserver=/casquedrdrebeatssfr.com/127.0.0.1#5335\nipset=/casquedrdrebeatssfr.com/gfwlist\nserver=/milfmaturesex.net/127.0.0.1#5335\nipset=/milfmaturesex.net/gfwlist\nserver=/bbc.in/127.0.0.1#5335\nipset=/bbc.in/gfwlist\nserver=/hypnohub.net/127.0.0.1#5335\nipset=/hypnohub.net/gfwlist\nserver=/paypal-online.info/127.0.0.1#5335\nipset=/paypal-online.info/gfwlist\nserver=/scholar.google.com.bo/127.0.0.1#5335\nipset=/scholar.google.com.bo/gfwlist\nserver=/masalabin.com/127.0.0.1#5335\nipset=/masalabin.com/gfwlist\nserver=/twttr.com/127.0.0.1#5335\nipset=/twttr.com/gfwlist\nserver=/mafia-linkz.to/127.0.0.1#5335\nipset=/mafia-linkz.to/gfwlist\nserver=/awscommandlineinterface.com/127.0.0.1#5335\nipset=/awscommandlineinterface.com/gfwlist\nserver=/vpro.net/127.0.0.1#5335\nipset=/vpro.net/gfwlist\nserver=/bmw.ma/127.0.0.1#5335\nipset=/bmw.ma/gfwlist\nserver=/pise.pw/127.0.0.1#5335\nipset=/pise.pw/gfwlist\nserver=/pornobae.com/127.0.0.1#5335\nipset=/pornobae.com/gfwlist\nserver=/minnano-av.com/127.0.0.1#5335\nipset=/minnano-av.com/gfwlist\nserver=/gamesofdesire.com/127.0.0.1#5335\nipset=/gamesofdesire.com/gfwlist\nserver=/xxxgratisfilms.com/127.0.0.1#5335\nipset=/xxxgratisfilms.com/gfwlist\nserver=/autodesk.com/127.0.0.1#5335\nipset=/autodesk.com/gfwlist\nserver=/tearapeak.com/127.0.0.1#5335\nipset=/tearapeak.com/gfwlist\nserver=/foxphiladelphia.com/127.0.0.1#5335\nipset=/foxphiladelphia.com/gfwlist\nserver=/livejasmin.com/127.0.0.1#5335\nipset=/livejasmin.com/gfwlist\nserver=/bmw-motorrad.com.ar/127.0.0.1#5335\nipset=/bmw-motorrad.com.ar/gfwlist\nserver=/nudelive.com/127.0.0.1#5335\nipset=/nudelive.com/gfwlist\nserver=/gtv.org/127.0.0.1#5335\nipset=/gtv.org/gfwlist\nserver=/blizzardgearstore.com/127.0.0.1#5335\nipset=/blizzardgearstore.com/gfwlist\nserver=/hotsexydolls.com/127.0.0.1#5335\nipset=/hotsexydolls.com/gfwlist\nserver=/thomsonreuters.co.jp/127.0.0.1#5335\nipset=/thomsonreuters.co.jp/gfwlist\nserver=/oreilly.com/127.0.0.1#5335\nipset=/oreilly.com/gfwlist\nserver=/mysql.com/127.0.0.1#5335\nipset=/mysql.com/gfwlist\nserver=/kijji.ca/127.0.0.1#5335\nipset=/kijji.ca/gfwlist\nserver=/visa.com.hr/127.0.0.1#5335\nipset=/visa.com.hr/gfwlist\nserver=/ig.me/127.0.0.1#5335\nipset=/ig.me/gfwlist\nserver=/2mdn.net/127.0.0.1#5335\nipset=/2mdn.net/gfwlist\nserver=/steampipe.akamaized.net/127.0.0.1#5335\nipset=/steampipe.akamaized.net/gfwlist\nserver=/travelex.com.tr/127.0.0.1#5335\nipset=/travelex.com.tr/gfwlist\nserver=/takens.tw/127.0.0.1#5335\nipset=/takens.tw/gfwlist\nserver=/moviesanywhere.com/127.0.0.1#5335\nipset=/moviesanywhere.com/gfwlist\nserver=/youjizz.com/127.0.0.1#5335\nipset=/youjizz.com/gfwlist\nserver=/tubemovies4k.com/127.0.0.1#5335\nipset=/tubemovies4k.com/gfwlist\nserver=/superjapanesesex.com/127.0.0.1#5335\nipset=/superjapanesesex.com/gfwlist\nserver=/kinklive.com/127.0.0.1#5335\nipset=/kinklive.com/gfwlist\nserver=/pornone.com/127.0.0.1#5335\nipset=/pornone.com/gfwlist\nserver=/infrapedia.com/127.0.0.1#5335\nipset=/infrapedia.com/gfwlist\nserver=/apple.in/127.0.0.1#5335\nipset=/apple.in/gfwlist\nserver=/ingka.com/127.0.0.1#5335\nipset=/ingka.com/gfwlist\nserver=/facebocke.com/127.0.0.1#5335\nipset=/facebocke.com/gfwlist\nserver=/realclearhealth.com/127.0.0.1#5335\nipset=/realclearhealth.com/gfwlist\nserver=/rocketfishproducts.com/127.0.0.1#5335\nipset=/rocketfishproducts.com/gfwlist\nserver=/facebookbrand.com/127.0.0.1#5335\nipset=/facebookbrand.com/gfwlist\nserver=/facebookcheats.com/127.0.0.1#5335\nipset=/facebookcheats.com/gfwlist\nserver=/modular.im/127.0.0.1#5335\nipset=/modular.im/gfwlist\nserver=/duckduckgo.sg/127.0.0.1#5335\nipset=/duckduckgo.sg/gfwlist\nserver=/pearsonassessment.fr/127.0.0.1#5335\nipset=/pearsonassessment.fr/gfwlist\nserver=/now.com/127.0.0.1#5335\nipset=/now.com/gfwlist\nserver=/bmw-connecteddrive.com.br/127.0.0.1#5335\nipset=/bmw-connecteddrive.com.br/gfwlist\nserver=/xnxxporn.de/127.0.0.1#5335\nipset=/xnxxporn.de/gfwlist\nserver=/pinterest.fr/127.0.0.1#5335\nipset=/pinterest.fr/gfwlist\nserver=/facebooknews.com/127.0.0.1#5335\nipset=/facebooknews.com/gfwlist\nserver=/faronics.eu/127.0.0.1#5335\nipset=/faronics.eu/gfwlist\nserver=/adultvideotop.com/127.0.0.1#5335\nipset=/adultvideotop.com/gfwlist\nserver=/abc.xyz/127.0.0.1#5335\nipset=/abc.xyz/gfwlist\nserver=/linuxmint.com/127.0.0.1#5335\nipset=/linuxmint.com/gfwlist\nserver=/girlswelustfor.com/127.0.0.1#5335\nipset=/girlswelustfor.com/gfwlist\nserver=/wikawika.xyz/127.0.0.1#5335\nipset=/wikawika.xyz/gfwlist\nserver=/intel.lu/127.0.0.1#5335\nipset=/intel.lu/gfwlist\nserver=/zeit-world.co.uk/127.0.0.1#5335\nipset=/zeit-world.co.uk/gfwlist\nserver=/realteengirls.com/127.0.0.1#5335\nipset=/realteengirls.com/gfwlist\nserver=/unkoscene.com/127.0.0.1#5335\nipset=/unkoscene.com/gfwlist\nserver=/is.gd/127.0.0.1#5335\nipset=/is.gd/gfwlist\nserver=/mini-connected.lu/127.0.0.1#5335\nipset=/mini-connected.lu/gfwlist\nserver=/47news.jp/127.0.0.1#5335\nipset=/47news.jp/gfwlist\nserver=/rbgraduates.com/127.0.0.1#5335\nipset=/rbgraduates.com/gfwlist\nserver=/google.lv/127.0.0.1#5335\nipset=/google.lv/gfwlist\nserver=/mymasturbators.com/127.0.0.1#5335\nipset=/mymasturbators.com/gfwlist\nserver=/8thstreetlatinas.com/127.0.0.1#5335\nipset=/8thstreetlatinas.com/gfwlist\nserver=/juliamovies.com/127.0.0.1#5335\nipset=/juliamovies.com/gfwlist\nserver=/nmbmw.com/127.0.0.1#5335\nipset=/nmbmw.com/gfwlist\nserver=/trellocdn.com/127.0.0.1#5335\nipset=/trellocdn.com/gfwlist\nserver=/devtools-paypal.com/127.0.0.1#5335\nipset=/devtools-paypal.com/gfwlist\nserver=/swingers.theadulthub.com/127.0.0.1#5335\nipset=/swingers.theadulthub.com/gfwlist\nserver=/qwant.de/127.0.0.1#5335\nipset=/qwant.de/gfwlist\nserver=/wifewantstoplay.com/127.0.0.1#5335\nipset=/wifewantstoplay.com/gfwlist\nserver=/vfsco.ee/127.0.0.1#5335\nipset=/vfsco.ee/gfwlist\nserver=/youtube.am/127.0.0.1#5335\nipset=/youtube.am/gfwlist\nserver=/pornoreino.com/127.0.0.1#5335\nipset=/pornoreino.com/gfwlist\nserver=/vmw.com/127.0.0.1#5335\nipset=/vmw.com/gfwlist\nserver=/canon.se/127.0.0.1#5335\nipset=/canon.se/gfwlist\nserver=/nikeshoes21.com/127.0.0.1#5335\nipset=/nikeshoes21.com/gfwlist\nserver=/beatsbydreaustraliaonlines.com/127.0.0.1#5335\nipset=/beatsbydreaustraliaonlines.com/gfwlist\nserver=/flipshare.com/127.0.0.1#5335\nipset=/flipshare.com/gfwlist\nserver=/camgirlfinder.net/127.0.0.1#5335\nipset=/camgirlfinder.net/gfwlist\nserver=/ssx3.com/127.0.0.1#5335\nipset=/ssx3.com/gfwlist\nserver=/candycumcity.com/127.0.0.1#5335\nipset=/candycumcity.com/gfwlist\nserver=/scatville.com/127.0.0.1#5335\nipset=/scatville.com/gfwlist\nserver=/applewatchseries3.net/127.0.0.1#5335\nipset=/applewatchseries3.net/gfwlist\nserver=/mkto-c0100.com/127.0.0.1#5335\nipset=/mkto-c0100.com/gfwlist\nserver=/bmw.bm/127.0.0.1#5335\nipset=/bmw.bm/gfwlist\nserver=/skyoceanrescue.it/127.0.0.1#5335\nipset=/skyoceanrescue.it/gfwlist\nserver=/withyoutube.com/127.0.0.1#5335\nipset=/withyoutube.com/gfwlist\nserver=/pornqd.com/127.0.0.1#5335\nipset=/pornqd.com/gfwlist\nserver=/moozporn.com/127.0.0.1#5335\nipset=/moozporn.com/gfwlist\nserver=/sandisk.ae/127.0.0.1#5335\nipset=/sandisk.ae/gfwlist\nserver=/hentaicomics.asia/127.0.0.1#5335\nipset=/hentaicomics.asia/gfwlist\nserver=/bmw.co.th/127.0.0.1#5335\nipset=/bmw.co.th/gfwlist\nserver=/bestcamsites.net/127.0.0.1#5335\nipset=/bestcamsites.net/gfwlist\nserver=/boundhub.com/127.0.0.1#5335\nipset=/boundhub.com/gfwlist\nserver=/youtube.hk/127.0.0.1#5335\nipset=/youtube.hk/gfwlist\nserver=/pyhapp.com/127.0.0.1#5335\nipset=/pyhapp.com/gfwlist\nserver=/xchina.co/127.0.0.1#5335\nipset=/xchina.co/gfwlist\nserver=/bmw-i.jp/127.0.0.1#5335\nipset=/bmw-i.jp/gfwlist\nserver=/tryengineering.org/127.0.0.1#5335\nipset=/tryengineering.org/gfwlist\nserver=/hbogoasia.ph/127.0.0.1#5335\nipset=/hbogoasia.ph/gfwlist\nserver=/chinadecoding.com/127.0.0.1#5335\nipset=/chinadecoding.com/gfwlist\nserver=/ipoditouch.com/127.0.0.1#5335\nipset=/ipoditouch.com/gfwlist\nserver=/faronics.com/127.0.0.1#5335\nipset=/faronics.com/gfwlist\nserver=/88gals.com/127.0.0.1#5335\nipset=/88gals.com/gfwlist\nserver=/zencdn.net/127.0.0.1#5335\nipset=/zencdn.net/gfwlist\nserver=/mini-srilanka.com/127.0.0.1#5335\nipset=/mini-srilanka.com/gfwlist\nserver=/mrporngeek.com/127.0.0.1#5335\nipset=/mrporngeek.com/gfwlist\nserver=/visafulfillment.com/127.0.0.1#5335\nipset=/visafulfillment.com/gfwlist\nserver=/volvobuses.ca/127.0.0.1#5335\nipset=/volvobuses.ca/gfwlist\nserver=/selectyourgame.com/127.0.0.1#5335\nipset=/selectyourgame.com/gfwlist\nserver=/q10.jp/127.0.0.1#5335\nipset=/q10.jp/gfwlist\nserver=/tubetubetube.com/127.0.0.1#5335\nipset=/tubetubetube.com/gfwlist\nserver=/tubous.com/127.0.0.1#5335\nipset=/tubous.com/gfwlist\nserver=/spotify-everywhere.com/127.0.0.1#5335\nipset=/spotify-everywhere.com/gfwlist\nserver=/dvdtrailertube.com/127.0.0.1#5335\nipset=/dvdtrailertube.com/gfwlist\nserver=/friendfeed.com/127.0.0.1#5335\nipset=/friendfeed.com/gfwlist\nserver=/hifixxx.fun/127.0.0.1#5335\nipset=/hifixxx.fun/gfwlist\nserver=/google.co/127.0.0.1#5335\nipset=/google.co/gfwlist\nserver=/kichikuou.com/127.0.0.1#5335\nipset=/kichikuou.com/gfwlist\nserver=/babes34.com/127.0.0.1#5335\nipset=/babes34.com/gfwlist\nserver=/elsevier.com/127.0.0.1#5335\nipset=/elsevier.com/gfwlist\nserver=/tsquare.tv/127.0.0.1#5335\nipset=/tsquare.tv/gfwlist\nserver=/starbucksslovakia.sk/127.0.0.1#5335\nipset=/starbucksslovakia.sk/gfwlist\nserver=/darkageofcamelot.com/127.0.0.1#5335\nipset=/darkageofcamelot.com/gfwlist\nserver=/starbucksromania.ro/127.0.0.1#5335\nipset=/starbucksromania.ro/gfwlist\nserver=/avstar06.me/127.0.0.1#5335\nipset=/avstar06.me/gfwlist\nserver=/cuckoldwifetube.com/127.0.0.1#5335\nipset=/cuckoldwifetube.com/gfwlist\nserver=/yzzk.com/127.0.0.1#5335\nipset=/yzzk.com/gfwlist\nserver=/mediawiki.org/127.0.0.1#5335\nipset=/mediawiki.org/gfwlist\nserver=/starbucksreserve.com/127.0.0.1#5335\nipset=/starbucksreserve.com/gfwlist\nserver=/starbucksforlife.ca/127.0.0.1#5335\nipset=/starbucksforlife.ca/gfwlist\nserver=/starbuckscoffeegearstore.com/127.0.0.1#5335\nipset=/starbuckscoffeegearstore.com/gfwlist\nserver=/sharks-lagoon.fr/127.0.0.1#5335\nipset=/sharks-lagoon.fr/gfwlist\nserver=/starbuckscoffee.cz/127.0.0.1#5335\nipset=/starbuckscoffee.cz/gfwlist\nserver=/starbuckscardb2b.com/127.0.0.1#5335\nipset=/starbuckscardb2b.com/gfwlist\nserver=/volvobrandshop.com/127.0.0.1#5335\nipset=/volvobrandshop.com/gfwlist\nserver=/starbucksavie.ca/127.0.0.1#5335\nipset=/starbucksavie.ca/gfwlist\nserver=/ebayworlds.com/127.0.0.1#5335\nipset=/ebayworlds.com/gfwlist\nserver=/starbucksathome.com/127.0.0.1#5335\nipset=/starbucksathome.com/gfwlist\nserver=/insidevoa.com/127.0.0.1#5335\nipset=/insidevoa.com/gfwlist\nserver=/starbucks.tt/127.0.0.1#5335\nipset=/starbucks.tt/gfwlist\nserver=/webgirlsonline.net/127.0.0.1#5335\nipset=/webgirlsonline.net/gfwlist\nserver=/starbucks.se/127.0.0.1#5335\nipset=/starbucks.se/gfwlist\nserver=/starbucks.ru/127.0.0.1#5335\nipset=/starbucks.ru/gfwlist\nserver=/starbucks.rs/127.0.0.1#5335\nipset=/starbucks.rs/gfwlist\nserver=/freecodecamp.org/127.0.0.1#5335\nipset=/freecodecamp.org/gfwlist\nserver=/starbucks.pt/127.0.0.1#5335\nipset=/starbucks.pt/gfwlist\nserver=/bmw-motorrad.sa/127.0.0.1#5335\nipset=/bmw-motorrad.sa/gfwlist\nserver=/paypal-portal.com/127.0.0.1#5335\nipset=/paypal-portal.com/gfwlist\nserver=/starbucks.pl/127.0.0.1#5335\nipset=/starbucks.pl/gfwlist\nserver=/apple.me/127.0.0.1#5335\nipset=/apple.me/gfwlist\nserver=/b-ok.global/127.0.0.1#5335\nipset=/b-ok.global/gfwlist\nserver=/kendralist.com/127.0.0.1#5335\nipset=/kendralist.com/gfwlist\nserver=/erohentai.net/127.0.0.1#5335\nipset=/erohentai.net/gfwlist\nserver=/screenwisetrends.com/127.0.0.1#5335\nipset=/screenwisetrends.com/gfwlist\nserver=/starbucks.nl/127.0.0.1#5335\nipset=/starbucks.nl/gfwlist\nserver=/cuckoldwifesexxx.com/127.0.0.1#5335\nipset=/cuckoldwifesexxx.com/gfwlist\nserver=/sexfilmstube.com/127.0.0.1#5335\nipset=/sexfilmstube.com/gfwlist\nserver=/starbucks.it/127.0.0.1#5335\nipset=/starbucks.it/gfwlist\nserver=/ebayd.com/127.0.0.1#5335\nipset=/ebayd.com/gfwlist\nserver=/xxxhd.pro/127.0.0.1#5335\nipset=/xxxhd.pro/gfwlist\nserver=/ebay-fashion.com/127.0.0.1#5335\nipset=/ebay-fashion.com/gfwlist\nserver=/starbucks.in/127.0.0.1#5335\nipset=/starbucks.in/gfwlist\nserver=/koalaporn.com/127.0.0.1#5335\nipset=/koalaporn.com/gfwlist\nserver=/pornofiles.ru/127.0.0.1#5335\nipset=/pornofiles.ru/gfwlist\nserver=/zoomobileporn.com/127.0.0.1#5335\nipset=/zoomobileporn.com/gfwlist\nserver=/paypalcreditcard.com/127.0.0.1#5335\nipset=/paypalcreditcard.com/gfwlist\nserver=/starbucks.hu/127.0.0.1#5335\nipset=/starbucks.hu/gfwlist\nserver=/faceboik.com/127.0.0.1#5335\nipset=/faceboik.com/gfwlist\nserver=/bestbuyphotoworkshoptours.com/127.0.0.1#5335\nipset=/bestbuyphotoworkshoptours.com/gfwlist\nserver=/starbucks.com.uy/127.0.0.1#5335\nipset=/starbucks.com.uy/gfwlist\nserver=/starbucks.com.pe/127.0.0.1#5335\nipset=/starbucks.com.pe/gfwlist\nserver=/starbucks.com.my/127.0.0.1#5335\nipset=/starbucks.com.my/gfwlist\nserver=/starbucks.com.kh/127.0.0.1#5335\nipset=/starbucks.com.kh/gfwlist\nserver=/starbucks.com.hk/127.0.0.1#5335\nipset=/starbucks.com.hk/gfwlist\nserver=/starbucks.com.cy/127.0.0.1#5335\nipset=/starbucks.com.cy/gfwlist\nserver=/durex.fr/127.0.0.1#5335\nipset=/durex.fr/gfwlist\nserver=/starbucks.com/127.0.0.1#5335\nipset=/starbucks.com/gfwlist\nserver=/hxdoll.com/127.0.0.1#5335\nipset=/hxdoll.com/gfwlist\nserver=/starbucks.co.jp/127.0.0.1#5335\nipset=/starbucks.co.jp/gfwlist\nserver=/starbucks.bg/127.0.0.1#5335\nipset=/starbucks.bg/gfwlist\nserver=/starbucks.be/127.0.0.1#5335\nipset=/starbucks.be/gfwlist\nserver=/starbucks.at/127.0.0.1#5335\nipset=/starbucks.at/gfwlist\nserver=/apple.my/127.0.0.1#5335\nipset=/apple.my/gfwlist\nserver=/disneymagicmoments.co.za/127.0.0.1#5335\nipset=/disneymagicmoments.co.za/gfwlist\nserver=/starbucks-stars.com/127.0.0.1#5335\nipset=/starbucks-stars.com/gfwlist\nserver=/sbuxcard.com/127.0.0.1#5335\nipset=/sbuxcard.com/gfwlist\nserver=/hpto.net/127.0.0.1#5335\nipset=/hpto.net/gfwlist\nserver=/sbux.com.my/127.0.0.1#5335\nipset=/sbux.com.my/gfwlist\nserver=/hulu.tv/127.0.0.1#5335\nipset=/hulu.tv/gfwlist\nserver=/scenesource.me/127.0.0.1#5335\nipset=/scenesource.me/gfwlist\nserver=/thinkofliving.com/127.0.0.1#5335\nipset=/thinkofliving.com/gfwlist\nserver=/javheroine.com/127.0.0.1#5335\nipset=/javheroine.com/gfwlist\nserver=/realtor.com/127.0.0.1#5335\nipset=/realtor.com/gfwlist\nserver=/caribbeancompr.com/127.0.0.1#5335\nipset=/caribbeancompr.com/gfwlist\nserver=/porn-portal.com/127.0.0.1#5335\nipset=/porn-portal.com/gfwlist\nserver=/realcommercial.com.au/127.0.0.1#5335\nipset=/realcommercial.com.au/gfwlist\nserver=/rea.tech/127.0.0.1#5335\nipset=/rea.tech/gfwlist\nserver=/adblockplus.org/127.0.0.1#5335\nipset=/adblockplus.org/gfwlist\nserver=/rea.global/127.0.0.1#5335\nipset=/rea.global/gfwlist\nserver=/rea-group.com/127.0.0.1#5335\nipset=/rea-group.com/gfwlist\nserver=/iphonecollcase.com/127.0.0.1#5335\nipset=/iphonecollcase.com/gfwlist\nserver=/adobe.com/127.0.0.1#5335\nipset=/adobe.com/gfwlist\nserver=/8008206616.com/127.0.0.1#5335\nipset=/8008206616.com/gfwlist\nserver=/adbkm.com/127.0.0.1#5335\nipset=/adbkm.com/gfwlist\nserver=/proptiger.com/127.0.0.1#5335\nipset=/proptiger.com/gfwlist\nserver=/myfun.com/127.0.0.1#5335\nipset=/myfun.com/gfwlist\nserver=/move.com/127.0.0.1#5335\nipset=/move.com/gfwlist\nserver=/technews.tw/127.0.0.1#5335\nipset=/technews.tw/gfwlist\nserver=/makaan.com/127.0.0.1#5335\nipset=/makaan.com/gfwlist\nserver=/iproperty.com.my/127.0.0.1#5335\nipset=/iproperty.com.my/gfwlist\nserver=/housingcdn.com/127.0.0.1#5335\nipset=/housingcdn.com/gfwlist\nserver=/hometrack.com.au/127.0.0.1#5335\nipset=/hometrack.com.au/gfwlist\nserver=/bmwi.jp/127.0.0.1#5335\nipset=/bmwi.jp/gfwlist\nserver=/facesounds.com/127.0.0.1#5335\nipset=/facesounds.com/gfwlist\nserver=/azathabar.com/127.0.0.1#5335\nipset=/azathabar.com/gfwlist\nserver=/playboyplus.com/127.0.0.1#5335\nipset=/playboyplus.com/gfwlist\nserver=/123videos.tv/127.0.0.1#5335\nipset=/123videos.tv/gfwlist\nserver=/shemalemodelstube.com/127.0.0.1#5335\nipset=/shemalemodelstube.com/gfwlist\nserver=/reckittbenckiser.net/127.0.0.1#5335\nipset=/reckittbenckiser.net/gfwlist\nserver=/reckittbenckiser.com/127.0.0.1#5335\nipset=/reckittbenckiser.com/gfwlist\nserver=/reckitt.net/127.0.0.1#5335\nipset=/reckitt.net/gfwlist\nserver=/rbplc.com/127.0.0.1#5335\nipset=/rbplc.com/gfwlist\nserver=/rbgrads.com/127.0.0.1#5335\nipset=/rbgrads.com/gfwlist\nserver=/pplusstatic.com/127.0.0.1#5335\nipset=/pplusstatic.com/gfwlist\nserver=/rb.com/127.0.0.1#5335\nipset=/rb.com/gfwlist\nserver=/porntry.com/127.0.0.1#5335\nipset=/porntry.com/gfwlist\nserver=/offerairjordanlebron.com/127.0.0.1#5335\nipset=/offerairjordanlebron.com/gfwlist\nserver=/gettr.com/127.0.0.1#5335\nipset=/gettr.com/gfwlist\nserver=/avxhm.se/127.0.0.1#5335\nipset=/avxhm.se/gfwlist\nserver=/woolite.us/127.0.0.1#5335\nipset=/woolite.us/gfwlist\nserver=/kobe-pastel.com/127.0.0.1#5335\nipset=/kobe-pastel.com/gfwlist\nserver=/woolite.pl/127.0.0.1#5335\nipset=/woolite.pl/gfwlist\nserver=/woolite.ca/127.0.0.1#5335\nipset=/woolite.ca/gfwlist\nserver=/veetcentroamerica.com/127.0.0.1#5335\nipset=/veetcentroamerica.com/gfwlist\nserver=/veet.ru/127.0.0.1#5335\nipset=/veet.ru/gfwlist\nserver=/visa.gp/127.0.0.1#5335\nipset=/visa.gp/gfwlist\nserver=/veet.pt/127.0.0.1#5335\nipset=/veet.pt/gfwlist\nserver=/veet.nl/127.0.0.1#5335\nipset=/veet.nl/gfwlist\nserver=/creativecloud.com/127.0.0.1#5335\nipset=/creativecloud.com/gfwlist\nserver=/veet.jp/127.0.0.1#5335\nipset=/veet.jp/gfwlist\nserver=/thesffblog.com/127.0.0.1#5335\nipset=/thesffblog.com/gfwlist\nserver=/nudevista.com/127.0.0.1#5335\nipset=/nudevista.com/gfwlist\nserver=/veet.hu/127.0.0.1#5335\nipset=/veet.hu/gfwlist\nserver=/sexbomba.ru/127.0.0.1#5335\nipset=/sexbomba.ru/gfwlist\nserver=/veet.fi/127.0.0.1#5335\nipset=/veet.fi/gfwlist\nserver=/veet.es/127.0.0.1#5335\nipset=/veet.es/gfwlist\nserver=/myhentaicomics.com/127.0.0.1#5335\nipset=/myhentaicomics.com/gfwlist\nserver=/newxxx24.cc/127.0.0.1#5335\nipset=/newxxx24.cc/gfwlist\nserver=/veet.dk/127.0.0.1#5335\nipset=/veet.dk/gfwlist\nserver=/veet.com.tr/127.0.0.1#5335\nipset=/veet.com.tr/gfwlist\nserver=/veet.com.ph/127.0.0.1#5335\nipset=/veet.com.ph/gfwlist\nserver=/beatsfactoryoutles.com/127.0.0.1#5335\nipset=/beatsfactoryoutles.com/gfwlist\nserver=/veet.com.hk/127.0.0.1#5335\nipset=/veet.com.hk/gfwlist\nserver=/veet.com.co/127.0.0.1#5335\nipset=/veet.com.co/gfwlist\nserver=/veet.com.br/127.0.0.1#5335\nipset=/veet.com.br/gfwlist\nserver=/swisssigngroup.com/127.0.0.1#5335\nipset=/swisssigngroup.com/gfwlist\nserver=/veet.com.bd/127.0.0.1#5335\nipset=/veet.com.bd/gfwlist\nserver=/fox5storm.com/127.0.0.1#5335\nipset=/fox5storm.com/gfwlist\nserver=/newsupermariobrosu.com/127.0.0.1#5335\nipset=/newsupermariobrosu.com/gfwlist\nserver=/veet.com.au/127.0.0.1#5335\nipset=/veet.com.au/gfwlist\nserver=/discordapp.com/127.0.0.1#5335\nipset=/discordapp.com/gfwlist\nserver=/veet.co.za/127.0.0.1#5335\nipset=/veet.co.za/gfwlist\nserver=/18porncomic.com/127.0.0.1#5335\nipset=/18porncomic.com/gfwlist\nserver=/mastercard.com.ve/127.0.0.1#5335\nipset=/mastercard.com.ve/gfwlist\nserver=/veet.co.id/127.0.0.1#5335\nipset=/veet.co.id/gfwlist\nserver=/veet.ch/127.0.0.1#5335\nipset=/veet.ch/gfwlist\nserver=/porndeals.com/127.0.0.1#5335\nipset=/porndeals.com/gfwlist\nserver=/icloudo.de/127.0.0.1#5335\nipset=/icloudo.de/gfwlist\nserver=/phncdn.com/127.0.0.1#5335\nipset=/phncdn.com/gfwlist\nserver=/tubepornup.com/127.0.0.1#5335\nipset=/tubepornup.com/gfwlist\nserver=/vanishinfo.cz/127.0.0.1#5335\nipset=/vanishinfo.cz/gfwlist\nserver=/vanishbancaseulook.com.br/127.0.0.1#5335\nipset=/vanishbancaseulook.com.br/gfwlist\nserver=/vanisharabia.com/127.0.0.1#5335\nipset=/vanisharabia.com/gfwlist\nserver=/renovacionxboxlive.com/127.0.0.1#5335\nipset=/renovacionxboxlive.com/gfwlist\nserver=/mastercardbusinessnetwork.com/127.0.0.1#5335\nipset=/mastercardbusinessnetwork.com/gfwlist\nserver=/vanish.hu/127.0.0.1#5335\nipset=/vanish.hu/gfwlist\nserver=/nudefiles.net/127.0.0.1#5335\nipset=/nudefiles.net/gfwlist\nserver=/abematv.akamaized.net/127.0.0.1#5335\nipset=/abematv.akamaized.net/gfwlist\nserver=/milfthreesomes.com/127.0.0.1#5335\nipset=/milfthreesomes.com/gfwlist\nserver=/vanish.fi/127.0.0.1#5335\nipset=/vanish.fi/gfwlist\nserver=/xxxgames.biz/127.0.0.1#5335\nipset=/xxxgames.biz/gfwlist\nserver=/vanish.de/127.0.0.1#5335\nipset=/vanish.de/gfwlist\nserver=/vanish.com.sg/127.0.0.1#5335\nipset=/vanish.com.sg/gfwlist\nserver=/nikeproduct.com/127.0.0.1#5335\nipset=/nikeproduct.com/gfwlist\nserver=/vanish.com.my/127.0.0.1#5335\nipset=/vanish.com.my/gfwlist\nserver=/royalcams.com/127.0.0.1#5335\nipset=/royalcams.com/gfwlist\nserver=/niceanimegames.com/127.0.0.1#5335\nipset=/niceanimegames.com/gfwlist\nserver=/epochtimestr.com/127.0.0.1#5335\nipset=/epochtimestr.com/gfwlist\nserver=/seaporn.org/127.0.0.1#5335\nipset=/seaporn.org/gfwlist\nserver=/mail.ru/127.0.0.1#5335\nipset=/mail.ru/gfwlist\nserver=/hayabusa.media/127.0.0.1#5335\nipset=/hayabusa.media/gfwlist\nserver=/mucinex.ca/127.0.0.1#5335\nipset=/mucinex.ca/gfwlist\nserver=/vanish.co.nz/127.0.0.1#5335\nipset=/vanish.co.nz/gfwlist\nserver=/game-platform.net/127.0.0.1#5335\nipset=/game-platform.net/gfwlist\nserver=/ciscopartnermarketing.com/127.0.0.1#5335\nipset=/ciscopartnermarketing.com/gfwlist\nserver=/vanish.co.il/127.0.0.1#5335\nipset=/vanish.co.il/gfwlist\nserver=/sexei.net/127.0.0.1#5335\nipset=/sexei.net/gfwlist\nserver=/area120.com/127.0.0.1#5335\nipset=/area120.com/gfwlist\nserver=/vanish.cl/127.0.0.1#5335\nipset=/vanish.cl/gfwlist\nserver=/verisign.co.uk/127.0.0.1#5335\nipset=/verisign.co.uk/gfwlist\nserver=/static-hamivideo.cdn.hinet.net/127.0.0.1#5335\nipset=/static-hamivideo.cdn.hinet.net/gfwlist\nserver=/bmw-welt.net/127.0.0.1#5335\nipset=/bmw-welt.net/gfwlist\nserver=/miniso.uz/127.0.0.1#5335\nipset=/miniso.uz/gfwlist\nserver=/vanish.be/127.0.0.1#5335\nipset=/vanish.be/gfwlist\nserver=/pornerbros.com/127.0.0.1#5335\nipset=/pornerbros.com/gfwlist\nserver=/spraynwash.com/127.0.0.1#5335\nipset=/spraynwash.com/gfwlist\nserver=/google.iq/127.0.0.1#5335\nipset=/google.iq/gfwlist\nserver=/strepsils.us/127.0.0.1#5335\nipset=/strepsils.us/gfwlist\nserver=/xn--hhr917d3fecva.xyz/127.0.0.1#5335\nipset=/xn--hhr917d3fecva.xyz/gfwlist\nserver=/ntdca.com/127.0.0.1#5335\nipset=/ntdca.com/gfwlist\nserver=/grabpussy.com/127.0.0.1#5335\nipset=/grabpussy.com/gfwlist\nserver=/strepsils.ro/127.0.0.1#5335\nipset=/strepsils.ro/gfwlist\nserver=/strepsils.pl/127.0.0.1#5335\nipset=/strepsils.pl/gfwlist\nserver=/strepsils.net/127.0.0.1#5335\nipset=/strepsils.net/gfwlist\nserver=/sextubehub.com/127.0.0.1#5335\nipset=/sextubehub.com/gfwlist\nserver=/strepsils.ie/127.0.0.1#5335\nipset=/strepsils.ie/gfwlist\nserver=/strepsils.hu/127.0.0.1#5335\nipset=/strepsils.hu/gfwlist\nserver=/javfv.com/127.0.0.1#5335\nipset=/javfv.com/gfwlist\nserver=/vhx.tv/127.0.0.1#5335\nipset=/vhx.tv/gfwlist\nserver=/strepsils.fr/127.0.0.1#5335\nipset=/strepsils.fr/gfwlist\nserver=/strepsils.fi/127.0.0.1#5335\nipset=/strepsils.fi/gfwlist\nserver=/strepsils.com.au/127.0.0.1#5335\nipset=/strepsils.com.au/gfwlist\nserver=/bustynudebabes.com/127.0.0.1#5335\nipset=/bustynudebabes.com/gfwlist\nserver=/mastercard.com.bh/127.0.0.1#5335\nipset=/mastercard.com.bh/gfwlist\nserver=/getfappy.com/127.0.0.1#5335\nipset=/getfappy.com/gfwlist\nserver=/strepsils.com.br/127.0.0.1#5335\nipset=/strepsils.com.br/gfwlist\nserver=/strepsils.co.za/127.0.0.1#5335\nipset=/strepsils.co.za/gfwlist\nserver=/cdninstagram.com/127.0.0.1#5335\nipset=/cdninstagram.com/gfwlist\nserver=/strepsils.co.nz/127.0.0.1#5335\nipset=/strepsils.co.nz/gfwlist\nserver=/thtmod1.com/127.0.0.1#5335\nipset=/thtmod1.com/gfwlist\nserver=/dobendan.de/127.0.0.1#5335\nipset=/dobendan.de/gfwlist\nserver=/cepacol.com/127.0.0.1#5335\nipset=/cepacol.com/gfwlist\nserver=/beatsdresolo2013.com/127.0.0.1#5335\nipset=/beatsdresolo2013.com/gfwlist\nserver=/minimoncton.com/127.0.0.1#5335\nipset=/minimoncton.com/gfwlist\nserver=/linguee.com/127.0.0.1#5335\nipset=/linguee.com/gfwlist\nserver=/nurofensk-prod-env.eu-west-1.elasticbeanstalk.com/127.0.0.1#5335\nipset=/nurofensk-prod-env.eu-west-1.elasticbeanstalk.com/gfwlist\nserver=/nurofen.sk/127.0.0.1#5335\nipset=/nurofen.sk/gfwlist\nserver=/nurofen.ro/127.0.0.1#5335\nipset=/nurofen.ro/gfwlist\nserver=/cmhalq.com/127.0.0.1#5335\nipset=/cmhalq.com/gfwlist\nserver=/nurofen.pt/127.0.0.1#5335\nipset=/nurofen.pt/gfwlist\nserver=/icloud.jp/127.0.0.1#5335\nipset=/icloud.jp/gfwlist\nserver=/nurofen.pl/127.0.0.1#5335\nipset=/nurofen.pl/gfwlist\nserver=/desktopmovie.com/127.0.0.1#5335\nipset=/desktopmovie.com/gfwlist\nserver=/bridgestone.co.cr/127.0.0.1#5335\nipset=/bridgestone.co.cr/gfwlist\nserver=/hentaiasmr.moe/127.0.0.1#5335\nipset=/hentaiasmr.moe/gfwlist\nserver=/nurofen.co.za/127.0.0.1#5335\nipset=/nurofen.co.za/gfwlist\nserver=/beatbydrekopen.com/127.0.0.1#5335\nipset=/beatbydrekopen.com/gfwlist\nserver=/puresexmovies.com/127.0.0.1#5335\nipset=/puresexmovies.com/gfwlist\nserver=/dldlinks.com/127.0.0.1#5335\nipset=/dldlinks.com/gfwlist\nserver=/sorcerersarena.com/127.0.0.1#5335\nipset=/sorcerersarena.com/gfwlist\nserver=/nurofen.fr/127.0.0.1#5335\nipset=/nurofen.fr/gfwlist\nserver=/sandisk.sg/127.0.0.1#5335\nipset=/sandisk.sg/gfwlist\nserver=/nurofen.com.sg/127.0.0.1#5335\nipset=/nurofen.com.sg/gfwlist\nserver=/w3schools.com/127.0.0.1#5335\nipset=/w3schools.com/gfwlist\nserver=/nurofen.com.au/127.0.0.1#5335\nipset=/nurofen.com.au/gfwlist\nserver=/nurofen.net/127.0.0.1#5335\nipset=/nurofen.net/gfwlist\nserver=/faceboon.com/127.0.0.1#5335\nipset=/faceboon.com/gfwlist\nserver=/google.com.mm/127.0.0.1#5335\nipset=/google.com.mm/gfwlist\nserver=/myfreepaysite.com/127.0.0.1#5335\nipset=/myfreepaysite.com/gfwlist\nserver=/nurofen.co.il/127.0.0.1#5335\nipset=/nurofen.co.il/gfwlist\nserver=/mucinex.tv/127.0.0.1#5335\nipset=/mucinex.tv/gfwlist\nserver=/mucinex.net/127.0.0.1#5335\nipset=/mucinex.net/gfwlist\nserver=/mucinex.com/127.0.0.1#5335\nipset=/mucinex.com/gfwlist\nserver=/faceidglobal.com/127.0.0.1#5335\nipset=/faceidglobal.com/gfwlist\nserver=/vanish.com.ar/127.0.0.1#5335\nipset=/vanish.com.ar/gfwlist\nserver=/schiffvitamins.com/127.0.0.1#5335\nipset=/schiffvitamins.com/gfwlist\nserver=/bestialityvideo.us/127.0.0.1#5335\nipset=/bestialityvideo.us/gfwlist\nserver=/pifpafarabia.com/127.0.0.1#5335\nipset=/pifpafarabia.com/gfwlist\nserver=/toosexyvaginas.com/127.0.0.1#5335\nipset=/toosexyvaginas.com/gfwlist\nserver=/cheapheadphonesland.com/127.0.0.1#5335\nipset=/cheapheadphonesland.com/gfwlist\nserver=/iphone-x.tv/127.0.0.1#5335\nipset=/iphone-x.tv/gfwlist\nserver=/playnft.es.ht/127.0.0.1#5335\nipset=/playnft.es.ht/gfwlist\nserver=/toppornguide.com/127.0.0.1#5335\nipset=/toppornguide.com/gfwlist\nserver=/mortein.com/127.0.0.1#5335\nipset=/mortein.com/gfwlist\nserver=/foxsportsracing.com/127.0.0.1#5335\nipset=/foxsportsracing.com/gfwlist\nserver=/akasha.world/127.0.0.1#5335\nipset=/akasha.world/gfwlist\nserver=/meadjohnson.com.hk/127.0.0.1#5335\nipset=/meadjohnson.com.hk/gfwlist\nserver=/intel.gr/127.0.0.1#5335\nipset=/intel.gr/gfwlist\nserver=/meadjohnson.com/127.0.0.1#5335\nipset=/meadjohnson.com/gfwlist\nserver=/sandisk.com.au/127.0.0.1#5335\nipset=/sandisk.com.au/gfwlist\nserver=/lysol.ca/127.0.0.1#5335\nipset=/lysol.ca/gfwlist\nserver=/finishinfo.fi/127.0.0.1#5335\nipset=/finishinfo.fi/gfwlist\nserver=/finishinfo.com.ar/127.0.0.1#5335\nipset=/finishinfo.com.ar/gfwlist\nserver=/mini.com.co/127.0.0.1#5335\nipset=/mini.com.co/gfwlist\nserver=/registry.google/127.0.0.1#5335\nipset=/registry.google/gfwlist\nserver=/finishdishwashing.com/127.0.0.1#5335\nipset=/finishdishwashing.com/gfwlist\nserver=/whengirlsplay.com/127.0.0.1#5335\nipset=/whengirlsplay.com/gfwlist\nserver=/finishdishwashing.ca/127.0.0.1#5335\nipset=/finishdishwashing.ca/gfwlist\nserver=/finisharabia.com/127.0.0.1#5335\nipset=/finisharabia.com/gfwlist\nserver=/myfoxboston.com/127.0.0.1#5335\nipset=/myfoxboston.com/gfwlist\nserver=/finish.sk/127.0.0.1#5335\nipset=/finish.sk/gfwlist\nserver=/japanfist.org/127.0.0.1#5335\nipset=/japanfist.org/gfwlist\nserver=/finish.si/127.0.0.1#5335\nipset=/finish.si/gfwlist\nserver=/perverse.sex/127.0.0.1#5335\nipset=/perverse.sex/gfwlist\nserver=/youtube.com.gr/127.0.0.1#5335\nipset=/youtube.com.gr/gfwlist\nserver=/infinitetube.com/127.0.0.1#5335\nipset=/infinitetube.com/gfwlist\nserver=/bridgestonegolf.com/127.0.0.1#5335\nipset=/bridgestonegolf.com/gfwlist\nserver=/finish.pl/127.0.0.1#5335\nipset=/finish.pl/gfwlist\nserver=/finish.hu/127.0.0.1#5335\nipset=/finish.hu/gfwlist\nserver=/prostores.com/127.0.0.1#5335\nipset=/prostores.com/gfwlist\nserver=/finish.gr/127.0.0.1#5335\nipset=/finish.gr/gfwlist\nserver=/grannylovesyoungcock.com/127.0.0.1#5335\nipset=/grannylovesyoungcock.com/gfwlist\nserver=/finish.fr/127.0.0.1#5335\nipset=/finish.fr/gfwlist\nserver=/finish.es/127.0.0.1#5335\nipset=/finish.es/gfwlist\nserver=/finish.de/127.0.0.1#5335\nipset=/finish.de/gfwlist\nserver=/hqporner.com/127.0.0.1#5335\nipset=/hqporner.com/gfwlist\nserver=/google.co.vi/127.0.0.1#5335\nipset=/google.co.vi/gfwlist\nserver=/finish.com.hr/127.0.0.1#5335\nipset=/finish.com.hr/gfwlist\nserver=/yahoo.com.tr/127.0.0.1#5335\nipset=/yahoo.com.tr/gfwlist\nserver=/finish.co.nz/127.0.0.1#5335\nipset=/finish.co.nz/gfwlist\nserver=/youtube.com.bh/127.0.0.1#5335\nipset=/youtube.com.bh/gfwlist\nserver=/wpewebkit.org/127.0.0.1#5335\nipset=/wpewebkit.org/gfwlist\nserver=/buyminibeatbox.com/127.0.0.1#5335\nipset=/buyminibeatbox.com/gfwlist\nserver=/pornobrasil.com/127.0.0.1#5335\nipset=/pornobrasil.com/gfwlist\nserver=/nutramigen.pl/127.0.0.1#5335\nipset=/nutramigen.pl/gfwlist\nserver=/pornoecuadorxxx.com/127.0.0.1#5335\nipset=/pornoecuadorxxx.com/gfwlist\nserver=/enspireformula.com/127.0.0.1#5335\nipset=/enspireformula.com/gfwlist\nserver=/huobiasia.vip/127.0.0.1#5335\nipset=/huobiasia.vip/gfwlist\nserver=/enfamil.pt/127.0.0.1#5335\nipset=/enfamil.pt/gfwlist\nserver=/enfamil.ca/127.0.0.1#5335\nipset=/enfamil.ca/gfwlist\nserver=/enfamama.com.ph/127.0.0.1#5335\nipset=/enfamama.com.ph/gfwlist\nserver=/facebooll.com/127.0.0.1#5335\nipset=/facebooll.com/gfwlist\nserver=/thomsonreuters.ca/127.0.0.1#5335\nipset=/thomsonreuters.ca/gfwlist\nserver=/enfagrow.com.sg/127.0.0.1#5335\nipset=/enfagrow.com.sg/gfwlist\nserver=/enfagrow.com.my/127.0.0.1#5335\nipset=/enfagrow.com.my/gfwlist\nserver=/applestore.net.gr/127.0.0.1#5335\nipset=/applestore.net.gr/gfwlist\nserver=/enfagrow.co.in/127.0.0.1#5335\nipset=/enfagrow.co.in/gfwlist\nserver=/enfabebe3.com.ar/127.0.0.1#5335\nipset=/enfabebe3.com.ar/gfwlist\nserver=/mini.at/127.0.0.1#5335\nipset=/mini.at/gfwlist\nserver=/sexhd.pics/127.0.0.1#5335\nipset=/sexhd.pics/gfwlist\nserver=/hentaiplay.net/127.0.0.1#5335\nipset=/hentaiplay.net/gfwlist\nserver=/enfabebe.com.ve/127.0.0.1#5335\nipset=/enfabebe.com.ve/gfwlist\nserver=/enfabebe.com.pe/127.0.0.1#5335\nipset=/enfabebe.com.pe/gfwlist\nserver=/enfabebe.com.ec/127.0.0.1#5335\nipset=/enfabebe.com.ec/gfwlist\nserver=/enfabebe.com.co/127.0.0.1#5335\nipset=/enfabebe.com.co/gfwlist\nserver=/enfabebe.com.br/127.0.0.1#5335\nipset=/enfabebe.com.br/gfwlist\nserver=/enfababy.com/127.0.0.1#5335\nipset=/enfababy.com/gfwlist\nserver=/enfaaplus.com/127.0.0.1#5335\nipset=/enfaaplus.com/gfwlist\nserver=/xxxn.tv/127.0.0.1#5335\nipset=/xxxn.tv/gfwlist\nserver=/enfa.co.id/127.0.0.1#5335\nipset=/enfa.co.id/gfwlist\nserver=/zoos.gold/127.0.0.1#5335\nipset=/zoos.gold/gfwlist\nserver=/bannedbook.org/127.0.0.1#5335\nipset=/bannedbook.org/gfwlist\nserver=/bebepremium3.com.bo/127.0.0.1#5335\nipset=/bebepremium3.com.bo/gfwlist\nserver=/mrpinks.com/127.0.0.1#5335\nipset=/mrpinks.com/gfwlist\nserver=/drdreheadphonebeats.com/127.0.0.1#5335\nipset=/drdreheadphonebeats.com/gfwlist\nserver=/trydurex.tv/127.0.0.1#5335\nipset=/trydurex.tv/gfwlist\nserver=/trydurex.net/127.0.0.1#5335\nipset=/trydurex.net/gfwlist\nserver=/hooloo.tv/127.0.0.1#5335\nipset=/hooloo.tv/gfwlist\nserver=/playbydurex.com/127.0.0.1#5335\nipset=/playbydurex.com/gfwlist\nserver=/durexchina.com/127.0.0.1#5335\nipset=/durexchina.com/gfwlist\nserver=/brutalfetish.com/127.0.0.1#5335\nipset=/brutalfetish.com/gfwlist\nserver=/microsoft.it/127.0.0.1#5335\nipset=/microsoft.it/gfwlist\nserver=/durexcam.com/127.0.0.1#5335\nipset=/durexcam.com/gfwlist\nserver=/amateurarchiver.com/127.0.0.1#5335\nipset=/amateurarchiver.com/gfwlist\nserver=/hentai4free.net/127.0.0.1#5335\nipset=/hentai4free.net/gfwlist\nserver=/gputechconf.com.tw/127.0.0.1#5335\nipset=/gputechconf.com.tw/gfwlist\nserver=/dodgersexcartoons.com/127.0.0.1#5335\nipset=/dodgersexcartoons.com/gfwlist\nserver=/watchinese.com/127.0.0.1#5335\nipset=/watchinese.com/gfwlist\nserver=/quanben.io/127.0.0.1#5335\nipset=/quanben.io/gfwlist\nserver=/docs.com/127.0.0.1#5335\nipset=/docs.com/gfwlist\nserver=/marketo.net/127.0.0.1#5335\nipset=/marketo.net/gfwlist\nserver=/xxx-videos.tv/127.0.0.1#5335\nipset=/xxx-videos.tv/gfwlist\nserver=/durex.mx/127.0.0.1#5335\nipset=/durex.mx/gfwlist\nserver=/awsedstart.com/127.0.0.1#5335\nipset=/awsedstart.com/gfwlist\nserver=/google.bf/127.0.0.1#5335\nipset=/google.bf/gfwlist\nserver=/durex.it/127.0.0.1#5335\nipset=/durex.it/gfwlist\nserver=/durex.hu/127.0.0.1#5335\nipset=/durex.hu/gfwlist\nserver=/rolls-roycecullinan.com/127.0.0.1#5335\nipset=/rolls-roycecullinan.com/gfwlist\nserver=/starbucks.com.ar/127.0.0.1#5335\nipset=/starbucks.com.ar/gfwlist\nserver=/amateuranalporn.com/127.0.0.1#5335\nipset=/amateuranalporn.com/gfwlist\nserver=/mcdonaldsarabia.com/127.0.0.1#5335\nipset=/mcdonaldsarabia.com/gfwlist\nserver=/bmw-motorsport.com/127.0.0.1#5335\nipset=/bmw-motorsport.com/gfwlist\nserver=/durex.fi/127.0.0.1#5335\nipset=/durex.fi/gfwlist\nserver=/durex.ee/127.0.0.1#5335\nipset=/durex.ee/gfwlist\nserver=/verisign.biz/127.0.0.1#5335\nipset=/verisign.biz/gfwlist\nserver=/durex.de/127.0.0.1#5335\nipset=/durex.de/gfwlist\nserver=/jetbrains.net/127.0.0.1#5335\nipset=/jetbrains.net/gfwlist\nserver=/elixir-lang.org/127.0.0.1#5335\nipset=/elixir-lang.org/gfwlist\nserver=/fap666.com/127.0.0.1#5335\nipset=/fap666.com/gfwlist\nserver=/durex.com.pk/127.0.0.1#5335\nipset=/durex.com.pk/gfwlist\nserver=/durex.com.ph/127.0.0.1#5335\nipset=/durex.com.ph/gfwlist\nserver=/intel.yt/127.0.0.1#5335\nipset=/intel.yt/gfwlist\nserver=/naughtymag.com/127.0.0.1#5335\nipset=/naughtymag.com/gfwlist\nserver=/adhelpnews.com/127.0.0.1#5335\nipset=/adhelpnews.com/gfwlist\nserver=/durex.com.bd/127.0.0.1#5335\nipset=/durex.com.bd/gfwlist\nserver=/bmw.cz/127.0.0.1#5335\nipset=/bmw.cz/gfwlist\nserver=/visiontimesjp.com/127.0.0.1#5335\nipset=/visiontimesjp.com/gfwlist\nserver=/durex.com.au/127.0.0.1#5335\nipset=/durex.com.au/gfwlist\nserver=/disney.com.hk/127.0.0.1#5335\nipset=/disney.com.hk/gfwlist\nserver=/2buybeatsbydre.com/127.0.0.1#5335\nipset=/2buybeatsbydre.com/gfwlist\nserver=/durex.co.uk/127.0.0.1#5335\nipset=/durex.co.uk/gfwlist\nserver=/durex.co.id/127.0.0.1#5335\nipset=/durex.co.id/gfwlist\nserver=/aimsciences.org/127.0.0.1#5335\nipset=/aimsciences.org/gfwlist\nserver=/popcap.com/127.0.0.1#5335\nipset=/popcap.com/gfwlist\nserver=/iphoneclaro.com.br/127.0.0.1#5335\nipset=/iphoneclaro.com.br/gfwlist\nserver=/durex.be/127.0.0.1#5335\nipset=/durex.be/gfwlist\nserver=/durex.at/127.0.0.1#5335\nipset=/durex.at/gfwlist\nserver=/economistgroup.com/127.0.0.1#5335\nipset=/economistgroup.com/gfwlist\nserver=/pricelesshonolulu.com/127.0.0.1#5335\nipset=/pricelesshonolulu.com/gfwlist\nserver=/durex-shopline.com/127.0.0.1#5335\nipset=/durex-shopline.com/gfwlist\nserver=/dotherex.com/127.0.0.1#5335\nipset=/dotherex.com/gfwlist\nserver=/dewitwithdurex.com/127.0.0.1#5335\nipset=/dewitwithdurex.com/gfwlist\nserver=/bloomberglive.com/127.0.0.1#5335\nipset=/bloomberglive.com/gfwlist\nserver=/parler.com/127.0.0.1#5335\nipset=/parler.com/gfwlist\nserver=/bmw.cw/127.0.0.1#5335\nipset=/bmw.cw/gfwlist\nserver=/dettolcleannaija.com/127.0.0.1#5335\nipset=/dettolcleannaija.com/gfwlist\nserver=/dettol.ru/127.0.0.1#5335\nipset=/dettol.ru/gfwlist\nserver=/dettol.pl/127.0.0.1#5335\nipset=/dettol.pl/gfwlist\nserver=/dettol.pk/127.0.0.1#5335\nipset=/dettol.pk/gfwlist\nserver=/dettol.nl/127.0.0.1#5335\nipset=/dettol.nl/gfwlist\nserver=/dettol.fr/127.0.0.1#5335\nipset=/dettol.fr/gfwlist\nserver=/dettol.com.ng/127.0.0.1#5335\nipset=/dettol.com.ng/gfwlist\nserver=/dettol.com.eg/127.0.0.1#5335\nipset=/dettol.com.eg/gfwlist\nserver=/dettol.com.bd/127.0.0.1#5335\nipset=/dettol.com.bd/gfwlist\nserver=/dettol.com/127.0.0.1#5335\nipset=/dettol.com/gfwlist\nserver=/dettol.co.uk/127.0.0.1#5335\nipset=/dettol.co.uk/gfwlist\nserver=/dettol.co.in/127.0.0.1#5335\nipset=/dettol.co.in/gfwlist\nserver=/dettol.at/127.0.0.1#5335\nipset=/dettol.at/gfwlist\nserver=/dettol-prize.com/127.0.0.1#5335\nipset=/dettol-prize.com/gfwlist\nserver=/paypalbrasil.com/127.0.0.1#5335\nipset=/paypalbrasil.com/gfwlist\nserver=/calgon.nl/127.0.0.1#5335\nipset=/calgon.nl/gfwlist\nserver=/goldsexvideos.com/127.0.0.1#5335\nipset=/goldsexvideos.com/gfwlist\nserver=/calgon.it/127.0.0.1#5335\nipset=/calgon.it/gfwlist\nserver=/calgon.ie/127.0.0.1#5335\nipset=/calgon.ie/gfwlist\nserver=/cht.com.tw/127.0.0.1#5335\nipset=/cht.com.tw/gfwlist\nserver=/calgon.es/127.0.0.1#5335\nipset=/calgon.es/gfwlist\nserver=/famousinternetgirlsgalleries.com/127.0.0.1#5335\nipset=/famousinternetgirlsgalleries.com/gfwlist\nserver=/calgon.de/127.0.0.1#5335\nipset=/calgon.de/gfwlist\nserver=/swiftbank.info/127.0.0.1#5335\nipset=/swiftbank.info/gfwlist\nserver=/calgon.com.tr/127.0.0.1#5335\nipset=/calgon.com.tr/gfwlist\nserver=/yahoo.com.nf/127.0.0.1#5335\nipset=/yahoo.com.nf/gfwlist\nserver=/mastercardrestaurant.com/127.0.0.1#5335\nipset=/mastercardrestaurant.com/gfwlist\nserver=/gamer.com.tw/127.0.0.1#5335\nipset=/gamer.com.tw/gfwlist\nserver=/calgon.com/127.0.0.1#5335\nipset=/calgon.com/gfwlist\nserver=/calgon.co.uk/127.0.0.1#5335\nipset=/calgon.co.uk/gfwlist\nserver=/calgon.be/127.0.0.1#5335\nipset=/calgon.be/gfwlist\nserver=/mobatek.net/127.0.0.1#5335\nipset=/mobatek.net/gfwlist\nserver=/nvidia.com.pe/127.0.0.1#5335\nipset=/nvidia.com.pe/gfwlist\nserver=/calgon.at/127.0.0.1#5335\nipset=/calgon.at/gfwlist\nserver=/iphone-sh.com/127.0.0.1#5335\nipset=/iphone-sh.com/gfwlist\nserver=/dotfreesex.com/127.0.0.1#5335\nipset=/dotfreesex.com/gfwlist\nserver=/ipadair.com.es/127.0.0.1#5335\nipset=/ipadair.com.es/gfwlist\nserver=/airwickarabia.com/127.0.0.1#5335\nipset=/airwickarabia.com/gfwlist\nserver=/vfsco.mx/127.0.0.1#5335\nipset=/vfsco.mx/gfwlist\nserver=/airwick.tv/127.0.0.1#5335\nipset=/airwick.tv/gfwlist\nserver=/google.st/127.0.0.1#5335\nipset=/google.st/gfwlist\nserver=/macbookair.jp/127.0.0.1#5335\nipset=/macbookair.jp/gfwlist\nserver=/airwick.se/127.0.0.1#5335\nipset=/airwick.se/gfwlist\nserver=/airwick.ru/127.0.0.1#5335\nipset=/airwick.ru/gfwlist\nserver=/airwick.no/127.0.0.1#5335\nipset=/airwick.no/gfwlist\nserver=/oxfordreference.com/127.0.0.1#5335\nipset=/oxfordreference.com/gfwlist\nserver=/hotnudegirls.net/127.0.0.1#5335\nipset=/hotnudegirls.net/gfwlist\nserver=/applecentar.rs/127.0.0.1#5335\nipset=/applecentar.rs/gfwlist\nserver=/google.com.bz/127.0.0.1#5335\nipset=/google.com.bz/gfwlist\nserver=/applestore.wang/127.0.0.1#5335\nipset=/applestore.wang/gfwlist\nserver=/airwick.net/127.0.0.1#5335\nipset=/airwick.net/gfwlist\nserver=/wifesexorgy.com/127.0.0.1#5335\nipset=/wifesexorgy.com/gfwlist\nserver=/foxcorporation.com/127.0.0.1#5335\nipset=/foxcorporation.com/gfwlist\nserver=/volvopenta.nl/127.0.0.1#5335\nipset=/volvopenta.nl/gfwlist\nserver=/microsoft-give.com/127.0.0.1#5335\nipset=/microsoft-give.com/gfwlist\nserver=/apple-online.com/127.0.0.1#5335\nipset=/apple-online.com/gfwlist\nserver=/airwick.ie/127.0.0.1#5335\nipset=/airwick.ie/gfwlist\nserver=/cheaperbeatsbydresale.com/127.0.0.1#5335\nipset=/cheaperbeatsbydresale.com/gfwlist\nserver=/ethiosex2.wordpress.com/127.0.0.1#5335\nipset=/ethiosex2.wordpress.com/gfwlist\nserver=/taknai.com/127.0.0.1#5335\nipset=/taknai.com/gfwlist\nserver=/kobbeatssbydredk.com/127.0.0.1#5335\nipset=/kobbeatssbydredk.com/gfwlist\nserver=/sony.ie/127.0.0.1#5335\nipset=/sony.ie/gfwlist\nserver=/airwick.hr/127.0.0.1#5335\nipset=/airwick.hr/gfwlist\nserver=/rarbgmirror.org/127.0.0.1#5335\nipset=/rarbgmirror.org/gfwlist\nserver=/airwick.fr/127.0.0.1#5335\nipset=/airwick.fr/gfwlist\nserver=/airwick.fi/127.0.0.1#5335\nipset=/airwick.fi/gfwlist\nserver=/airwick.dk/127.0.0.1#5335\nipset=/airwick.dk/gfwlist\nserver=/redtub3xxx.com/127.0.0.1#5335\nipset=/redtub3xxx.com/gfwlist\nserver=/airwick.cz/127.0.0.1#5335\nipset=/airwick.cz/gfwlist\nserver=/airwick.com.tr/127.0.0.1#5335\nipset=/airwick.com.tr/gfwlist\nserver=/airwick.com.mx/127.0.0.1#5335\nipset=/airwick.com.mx/gfwlist\nserver=/chinesespanking.com/127.0.0.1#5335\nipset=/chinesespanking.com/gfwlist\nserver=/airwick.com/127.0.0.1#5335\nipset=/airwick.com/gfwlist\nserver=/airwick.co.za/127.0.0.1#5335\nipset=/airwick.co.za/gfwlist\nserver=/universalpictures.com/127.0.0.1#5335\nipset=/universalpictures.com/gfwlist\nserver=/ktvu.com/127.0.0.1#5335\nipset=/ktvu.com/gfwlist\nserver=/fafacebook.com/127.0.0.1#5335\nipset=/fafacebook.com/gfwlist\nserver=/hpjav.tv/127.0.0.1#5335\nipset=/hpjav.tv/gfwlist\nserver=/xn--qhrx81fxh2a.xn--55qx5d.hk/127.0.0.1#5335\nipset=/xn--qhrx81fxh2a.xn--55qx5d.hk/gfwlist\nserver=/stackpath.dev/127.0.0.1#5335\nipset=/stackpath.dev/gfwlist\nserver=/cnnmoney.ch/127.0.0.1#5335\nipset=/cnnmoney.ch/gfwlist\nserver=/steamusercontent-a.akamaihd.net/127.0.0.1#5335\nipset=/steamusercontent-a.akamaihd.net/gfwlist\nserver=/akafms.net/127.0.0.1#5335\nipset=/akafms.net/gfwlist\nserver=/amazonliterarypartnership.com/127.0.0.1#5335\nipset=/amazonliterarypartnership.com/gfwlist\nserver=/mcdonalds.co.uk/127.0.0.1#5335\nipset=/mcdonalds.co.uk/gfwlist\nserver=/golang.net/127.0.0.1#5335\nipset=/golang.net/gfwlist\nserver=/mcdelivery.com.sg/127.0.0.1#5335\nipset=/mcdelivery.com.sg/gfwlist\nserver=/doubleclick.net/127.0.0.1#5335\nipset=/doubleclick.net/gfwlist\nserver=/instagor.com/127.0.0.1#5335\nipset=/instagor.com/gfwlist\nserver=/aboutmcdonalds.com/127.0.0.1#5335\nipset=/aboutmcdonalds.com/gfwlist\nserver=/huanghuagang.org/127.0.0.1#5335\nipset=/huanghuagang.org/gfwlist\nserver=/hkreadingcity.net/127.0.0.1#5335\nipset=/hkreadingcity.net/gfwlist\nserver=/xn--r8jwklh769h2mc880dk1o431a.com/127.0.0.1#5335\nipset=/xn--r8jwklh769h2mc880dk1o431a.com/gfwlist\nserver=/fffdm.com/127.0.0.1#5335\nipset=/fffdm.com/gfwlist\nserver=/fzdm.com/127.0.0.1#5335\nipset=/fzdm.com/gfwlist\nserver=/familymart.com.ph/127.0.0.1#5335\nipset=/familymart.com.ph/gfwlist\nserver=/ebayedu.com/127.0.0.1#5335\nipset=/ebayedu.com/gfwlist\nserver=/mastercard.com.tr/127.0.0.1#5335\nipset=/mastercard.com.tr/gfwlist\nserver=/family.com.tw/127.0.0.1#5335\nipset=/family.com.tw/gfwlist\nserver=/apina.biz/127.0.0.1#5335\nipset=/apina.biz/gfwlist\nserver=/ikea.it/127.0.0.1#5335\nipset=/ikea.it/gfwlist\nserver=/esp8266.com/127.0.0.1#5335\nipset=/esp8266.com/gfwlist\nserver=/nijiyome.jp/127.0.0.1#5335\nipset=/nijiyome.jp/gfwlist\nserver=/dlsite.com.tw/127.0.0.1#5335\nipset=/dlsite.com.tw/gfwlist\nserver=/dlsite.com/127.0.0.1#5335\nipset=/dlsite.com/gfwlist\nserver=/ci-en.net/127.0.0.1#5335\nipset=/ci-en.net/gfwlist\nserver=/sankeibiz.jp/127.0.0.1#5335\nipset=/sankeibiz.jp/gfwlist\nserver=/114av.xyz/127.0.0.1#5335\nipset=/114av.xyz/gfwlist\nserver=/swtor.net/127.0.0.1#5335\nipset=/swtor.net/gfwlist\nserver=/lilith-soft.com/127.0.0.1#5335\nipset=/lilith-soft.com/gfwlist\nserver=/fackebook.com/127.0.0.1#5335\nipset=/fackebook.com/gfwlist\nserver=/itasoftware.com/127.0.0.1#5335\nipset=/itasoftware.com/gfwlist\nserver=/avxhm.is/127.0.0.1#5335\nipset=/avxhm.is/gfwlist\nserver=/beatsbydrdreus.com/127.0.0.1#5335\nipset=/beatsbydrdreus.com/gfwlist\nserver=/paipal.com/127.0.0.1#5335\nipset=/paipal.com/gfwlist\nserver=/foxcincy.jobs/127.0.0.1#5335\nipset=/foxcincy.jobs/gfwlist\nserver=/youtube.com.gh/127.0.0.1#5335\nipset=/youtube.com.gh/gfwlist\nserver=/toolforge.org/127.0.0.1#5335\nipset=/toolforge.org/gfwlist\nserver=/wiktionary.org/127.0.0.1#5335\nipset=/wiktionary.org/gfwlist\nserver=/globalsign.com.hk/127.0.0.1#5335\nipset=/globalsign.com.hk/gfwlist\nserver=/wikivoyage.org/127.0.0.1#5335\nipset=/wikivoyage.org/gfwlist\nserver=/expresswifi.com/127.0.0.1#5335\nipset=/expresswifi.com/gfwlist\nserver=/exascale-tech.com/127.0.0.1#5335\nipset=/exascale-tech.com/gfwlist\nserver=/wikiversity.org/127.0.0.1#5335\nipset=/wikiversity.org/gfwlist\nserver=/wikisource.org/127.0.0.1#5335\nipset=/wikisource.org/gfwlist\nserver=/wikipedia.org/127.0.0.1#5335\nipset=/wikipedia.org/gfwlist\nserver=/cinepornogratis.com/127.0.0.1#5335\nipset=/cinepornogratis.com/gfwlist\nserver=/sexharlot.com/127.0.0.1#5335\nipset=/sexharlot.com/gfwlist\nserver=/wikimedia.org/127.0.0.1#5335\nipset=/wikimedia.org/gfwlist\nserver=/wikimediafoundation.org/127.0.0.1#5335\nipset=/wikimediafoundation.org/gfwlist\nserver=/truyenkk1.com/127.0.0.1#5335\nipset=/truyenkk1.com/gfwlist\nserver=/wikidata.org/127.0.0.1#5335\nipset=/wikidata.org/gfwlist\nserver=/wikibooks.org/127.0.0.1#5335\nipset=/wikibooks.org/gfwlist\nserver=/ebc.net.tw/127.0.0.1#5335\nipset=/ebc.net.tw/gfwlist\nserver=/starbucksrewardsstarland.ca/127.0.0.1#5335\nipset=/starbucksrewardsstarland.ca/gfwlist\nserver=/wdfiles.com/127.0.0.1#5335\nipset=/wdfiles.com/gfwlist\nserver=/nftstorage.link/127.0.0.1#5335\nipset=/nftstorage.link/gfwlist\nserver=/firstgynexam.com/127.0.0.1#5335\nipset=/firstgynexam.com/gfwlist\nserver=/twcomix.com/127.0.0.1#5335\nipset=/twcomix.com/gfwlist\nserver=/wholesaleonlinemart.com/127.0.0.1#5335\nipset=/wholesaleonlinemart.com/gfwlist\nserver=/cortexrpg.com/127.0.0.1#5335\nipset=/cortexrpg.com/gfwlist\nserver=/muthead.com/127.0.0.1#5335\nipset=/muthead.com/gfwlist\nserver=/beatscheapforsale.com/127.0.0.1#5335\nipset=/beatscheapforsale.com/gfwlist\nserver=/hutao.cloud/127.0.0.1#5335\nipset=/hutao.cloud/gfwlist\nserver=/disney.hu/127.0.0.1#5335\nipset=/disney.hu/gfwlist\nserver=/sweetsext.com/127.0.0.1#5335\nipset=/sweetsext.com/gfwlist\nserver=/yabang.org/127.0.0.1#5335\nipset=/yabang.org/gfwlist\nserver=/bmw-connecteddrive.es/127.0.0.1#5335\nipset=/bmw-connecteddrive.es/gfwlist\nserver=/pornkai.com/127.0.0.1#5335\nipset=/pornkai.com/gfwlist\nserver=/zeeentertainment.com/127.0.0.1#5335\nipset=/zeeentertainment.com/gfwlist\nserver=/stc-server.com/127.0.0.1#5335\nipset=/stc-server.com/gfwlist\nserver=/paper-attachments.s3.amazonaws.com/127.0.0.1#5335\nipset=/paper-attachments.s3.amazonaws.com/gfwlist\nserver=/mailonsunday.ie/127.0.0.1#5335\nipset=/mailonsunday.ie/gfwlist\nserver=/ssrpass.pw/127.0.0.1#5335\nipset=/ssrpass.pw/gfwlist\nserver=/bmwmyanmar.com/127.0.0.1#5335\nipset=/bmwmyanmar.com/gfwlist\nserver=/ssplive.pw/127.0.0.1#5335\nipset=/ssplive.pw/gfwlist\nserver=/visa.lt/127.0.0.1#5335\nipset=/visa.lt/gfwlist\nserver=/sony.com.gt/127.0.0.1#5335\nipset=/sony.com.gt/gfwlist\nserver=/maying.co/127.0.0.1#5335\nipset=/maying.co/gfwlist\nserver=/vaultify.net/127.0.0.1#5335\nipset=/vaultify.net/gfwlist\nserver=/intel.wf/127.0.0.1#5335\nipset=/intel.wf/gfwlist\nserver=/gfw.press/127.0.0.1#5335\nipset=/gfw.press/gfwlist\nserver=/geph.io/127.0.0.1#5335\nipset=/geph.io/gfwlist\nserver=/hottestheadphonesonline.com/127.0.0.1#5335\nipset=/hottestheadphonesonline.com/gfwlist\nserver=/acheterfollowersinstagram.com/127.0.0.1#5335\nipset=/acheterfollowersinstagram.com/gfwlist\nserver=/cloudn.me/127.0.0.1#5335\nipset=/cloudn.me/gfwlist\nserver=/pinflix.com/127.0.0.1#5335\nipset=/pinflix.com/gfwlist\nserver=/ark.to/127.0.0.1#5335\nipset=/ark.to/gfwlist\nserver=/amytele.com/127.0.0.1#5335\nipset=/amytele.com/gfwlist\nserver=/aaex.uk/127.0.0.1#5335\nipset=/aaex.uk/gfwlist\nserver=/slack.com/127.0.0.1#5335\nipset=/slack.com/gfwlist\nserver=/xcg123.com/127.0.0.1#5335\nipset=/xcg123.com/gfwlist\nserver=/vilavpn7.xyz/127.0.0.1#5335\nipset=/vilavpn7.xyz/gfwlist\nserver=/vilavpn5.xyz/127.0.0.1#5335\nipset=/vilavpn5.xyz/gfwlist\nserver=/vilavpn4.xyz/127.0.0.1#5335\nipset=/vilavpn4.xyz/gfwlist\nserver=/msfteducation.ca/127.0.0.1#5335\nipset=/msfteducation.ca/gfwlist\nserver=/mastercard.ru/127.0.0.1#5335\nipset=/mastercard.ru/gfwlist\nserver=/nvidia.co.jp/127.0.0.1#5335\nipset=/nvidia.co.jp/gfwlist\nserver=/vilavpn1.xyz/127.0.0.1#5335\nipset=/vilavpn1.xyz/gfwlist\nserver=/watchdisneyfe.com/127.0.0.1#5335\nipset=/watchdisneyfe.com/gfwlist\nserver=/surflite.net/127.0.0.1#5335\nipset=/surflite.net/gfwlist\nserver=/molesports.com/127.0.0.1#5335\nipset=/molesports.com/gfwlist\nserver=/visa.com.ag/127.0.0.1#5335\nipset=/visa.com.ag/gfwlist\nserver=/geek-squad.org/127.0.0.1#5335\nipset=/geek-squad.org/gfwlist\nserver=/swisstsa.ch/127.0.0.1#5335\nipset=/swisstsa.ch/gfwlist\nserver=/crunchyroll.com/127.0.0.1#5335\nipset=/crunchyroll.com/gfwlist\nserver=/nexitcore.com/127.0.0.1#5335\nipset=/nexitcore.com/gfwlist\nserver=/sexfilm.al.ru/127.0.0.1#5335\nipset=/sexfilm.al.ru/gfwlist\nserver=/nexitallysafe.com/127.0.0.1#5335\nipset=/nexitallysafe.com/gfwlist\nserver=/intel.mn/127.0.0.1#5335\nipset=/intel.mn/gfwlist\nserver=/gog-statics.com/127.0.0.1#5335\nipset=/gog-statics.com/gfwlist\nserver=/n3ro.net/127.0.0.1#5335\nipset=/n3ro.net/gfwlist\nserver=/n3ro.lol/127.0.0.1#5335\nipset=/n3ro.lol/gfwlist\nserver=/justmysocks2.net/127.0.0.1#5335\nipset=/justmysocks2.net/gfwlist\nserver=/justmysocks.net/127.0.0.1#5335\nipset=/justmysocks.net/gfwlist\nserver=/hitun.io/127.0.0.1#5335\nipset=/hitun.io/gfwlist\nserver=/duyaossr.com/127.0.0.1#5335\nipset=/duyaossr.com/gfwlist\nserver=/dleris.best/127.0.0.1#5335\nipset=/dleris.best/gfwlist\nserver=/dlercloud.me/127.0.0.1#5335\nipset=/dlercloud.me/gfwlist\nserver=/gyakusimei.com/127.0.0.1#5335\nipset=/gyakusimei.com/gfwlist\nserver=/cortanaskills.com/127.0.0.1#5335\nipset=/cortanaskills.com/gfwlist\nserver=/youtube.com.sa/127.0.0.1#5335\nipset=/youtube.com.sa/gfwlist\nserver=/cylink.pro/127.0.0.1#5335\nipset=/cylink.pro/gfwlist\nserver=/geeksquad.cc/127.0.0.1#5335\nipset=/geeksquad.cc/gfwlist\nserver=/bmw-motorrad-abudhabi.com/127.0.0.1#5335\nipset=/bmw-motorrad-abudhabi.com/gfwlist\nserver=/ubisoft-orbit-savegames.s3.amazonaws.com/127.0.0.1#5335\nipset=/ubisoft-orbit-savegames.s3.amazonaws.com/gfwlist\nserver=/twinkboyfriends.tv/127.0.0.1#5335\nipset=/twinkboyfriends.tv/gfwlist\nserver=/googleblog.com/127.0.0.1#5335\nipset=/googleblog.com/gfwlist\nserver=/hpgift.com/127.0.0.1#5335\nipset=/hpgift.com/gfwlist\nserver=/springerlink.com/127.0.0.1#5335\nipset=/springerlink.com/gfwlist\nserver=/geodesummit.com/127.0.0.1#5335\nipset=/geodesummit.com/gfwlist\nserver=/rarbgunblock.com/127.0.0.1#5335\nipset=/rarbgunblock.com/gfwlist\nserver=/youtubei.googleapis.com/127.0.0.1#5335\nipset=/youtubei.googleapis.com/gfwlist\nserver=/escapestudios.co.uk/127.0.0.1#5335\nipset=/escapestudios.co.uk/gfwlist\nserver=/yimg.com/127.0.0.1#5335\nipset=/yimg.com/gfwlist\nserver=/rarbgproxy.org/127.0.0.1#5335\nipset=/rarbgproxy.org/gfwlist\nserver=/rarbgaccessed.org/127.0.0.1#5335\nipset=/rarbgaccessed.org/gfwlist\nserver=/proxyrarbg.org/127.0.0.1#5335\nipset=/proxyrarbg.org/gfwlist\nserver=/mamacitaz.com/127.0.0.1#5335\nipset=/mamacitaz.com/gfwlist\nserver=/shapelcounset.xyz/127.0.0.1#5335\nipset=/shapelcounset.xyz/gfwlist\nserver=/xdporner.com/127.0.0.1#5335\nipset=/xdporner.com/gfwlist\nserver=/pornhub00.com/127.0.0.1#5335\nipset=/pornhub00.com/gfwlist\nserver=/xjavporn.com/127.0.0.1#5335\nipset=/xjavporn.com/gfwlist\nserver=/rarbg.to/127.0.0.1#5335\nipset=/rarbg.to/gfwlist\nserver=/thepiratebay.org/127.0.0.1#5335\nipset=/thepiratebay.org/gfwlist\nserver=/gayforit.eu/127.0.0.1#5335\nipset=/gayforit.eu/gfwlist\nserver=/pirates-forum.org/127.0.0.1#5335\nipset=/pirates-forum.org/gfwlist\nserver=/mastercard.com.ge/127.0.0.1#5335\nipset=/mastercard.com.ge/gfwlist\nserver=/demonoid.is/127.0.0.1#5335\nipset=/demonoid.is/gfwlist\nserver=/btdig.com/127.0.0.1#5335\nipset=/btdig.com/gfwlist\nserver=/porntitan.com/127.0.0.1#5335\nipset=/porntitan.com/gfwlist\nserver=/1337x.tw/127.0.0.1#5335\nipset=/1337x.tw/gfwlist\nserver=/1337x.st/127.0.0.1#5335\nipset=/1337x.st/gfwlist\nserver=/truyenwk.com/127.0.0.1#5335\nipset=/truyenwk.com/gfwlist\nserver=/1337x.to/127.0.0.1#5335\nipset=/1337x.to/gfwlist\nserver=/porkbun.com/127.0.0.1#5335\nipset=/porkbun.com/gfwlist\nserver=/volvotrucks.kz/127.0.0.1#5335\nipset=/volvotrucks.kz/gfwlist\nserver=/yastatic.net/127.0.0.1#5335\nipset=/yastatic.net/gfwlist\nserver=/fcebook.com/127.0.0.1#5335\nipset=/fcebook.com/gfwlist\nserver=/ebayaustralia.com/127.0.0.1#5335\nipset=/ebayaustralia.com/gfwlist\nserver=/binanceapi.com/127.0.0.1#5335\nipset=/binanceapi.com/gfwlist\nserver=/yandex.tm/127.0.0.1#5335\nipset=/yandex.tm/gfwlist\nserver=/yandex.net/127.0.0.1#5335\nipset=/yandex.net/gfwlist\nserver=/yandex.md/127.0.0.1#5335\nipset=/yandex.md/gfwlist\nserver=/cnnikebrand.com/127.0.0.1#5335\nipset=/cnnikebrand.com/gfwlist\nserver=/porndish.com/127.0.0.1#5335\nipset=/porndish.com/gfwlist\nserver=/yandex.kg/127.0.0.1#5335\nipset=/yandex.kg/gfwlist\nserver=/yandex.com.tr/127.0.0.1#5335\nipset=/yandex.com.tr/gfwlist\nserver=/yandex.com.ru/127.0.0.1#5335\nipset=/yandex.com.ru/gfwlist\nserver=/looporn.com/127.0.0.1#5335\nipset=/looporn.com/gfwlist\nserver=/yandex.com/127.0.0.1#5335\nipset=/yandex.com/gfwlist\nserver=/yandex.by/127.0.0.1#5335\nipset=/yandex.by/gfwlist\nserver=/yandex.az/127.0.0.1#5335\nipset=/yandex.az/gfwlist\nserver=/alicloud.com/127.0.0.1#5335\nipset=/alicloud.com/gfwlist\nserver=/elephantsdream.org/127.0.0.1#5335\nipset=/elephantsdream.org/gfwlist\nserver=/yimg.jp/127.0.0.1#5335\nipset=/yimg.jp/gfwlist\nserver=/rarbgprx.org/127.0.0.1#5335\nipset=/rarbgprx.org/gfwlist\nserver=/yho.com/127.0.0.1#5335\nipset=/yho.com/gfwlist\nserver=/yahoomusic.com/127.0.0.1#5335\nipset=/yahoomusic.com/gfwlist\nserver=/xvxx.stream/127.0.0.1#5335\nipset=/xvxx.stream/gfwlist\nserver=/yahoohealth.com/127.0.0.1#5335\nipset=/yahoohealth.com/gfwlist\nserver=/kavkazr.com/127.0.0.1#5335\nipset=/kavkazr.com/gfwlist\nserver=/nikeitaly.com/127.0.0.1#5335\nipset=/nikeitaly.com/gfwlist\nserver=/yahooapis.com/127.0.0.1#5335\nipset=/yahooapis.com/gfwlist\nserver=/techcrunch.com/127.0.0.1#5335\nipset=/techcrunch.com/gfwlist\nserver=/yasarang.net/127.0.0.1#5335\nipset=/yasarang.net/gfwlist\nserver=/myguide.hk/127.0.0.1#5335\nipset=/myguide.hk/gfwlist\nserver=/yahoo.ws/127.0.0.1#5335\nipset=/yahoo.ws/gfwlist\nserver=/yahoo.tn/127.0.0.1#5335\nipset=/yahoo.tn/gfwlist\nserver=/yahoo.tm/127.0.0.1#5335\nipset=/yahoo.tm/gfwlist\nserver=/yahoo.tk/127.0.0.1#5335\nipset=/yahoo.tk/gfwlist\nserver=/mastercardcenter.org/127.0.0.1#5335\nipset=/mastercardcenter.org/gfwlist\nserver=/yahoo.sr/127.0.0.1#5335\nipset=/yahoo.sr/gfwlist\nserver=/pornobox.net/127.0.0.1#5335\nipset=/pornobox.net/gfwlist\nserver=/finish.co.uk/127.0.0.1#5335\nipset=/finish.co.uk/gfwlist\nserver=/yahoo.sk/127.0.0.1#5335\nipset=/yahoo.sk/gfwlist\nserver=/yahoo.sg/127.0.0.1#5335\nipset=/yahoo.sg/gfwlist\nserver=/yahoo.se/127.0.0.1#5335\nipset=/yahoo.se/gfwlist\nserver=/yahoo.ru/127.0.0.1#5335\nipset=/yahoo.ru/gfwlist\nserver=/ggdiao.com/127.0.0.1#5335\nipset=/ggdiao.com/gfwlist\nserver=/yahoo.pn/127.0.0.1#5335\nipset=/yahoo.pn/gfwlist\nserver=/pearsonelt.com/127.0.0.1#5335\nipset=/pearsonelt.com/gfwlist\nserver=/yahoo.net/127.0.0.1#5335\nipset=/yahoo.net/gfwlist\nserver=/dragoniscoming.com/127.0.0.1#5335\nipset=/dragoniscoming.com/gfwlist\nserver=/discord.new/127.0.0.1#5335\nipset=/discord.new/gfwlist\nserver=/yahoo.mx/127.0.0.1#5335\nipset=/yahoo.mx/gfwlist\nserver=/dailymailonline.com/127.0.0.1#5335\nipset=/dailymailonline.com/gfwlist\nserver=/llnw.com/127.0.0.1#5335\nipset=/llnw.com/gfwlist\nserver=/bmwgroup.com/127.0.0.1#5335\nipset=/bmwgroup.com/gfwlist\nserver=/sverigebeatsbydrdre.com/127.0.0.1#5335\nipset=/sverigebeatsbydrdre.com/gfwlist\nserver=/elog-ch.com/127.0.0.1#5335\nipset=/elog-ch.com/gfwlist\nserver=/igoshopping.net/127.0.0.1#5335\nipset=/igoshopping.net/gfwlist\nserver=/cumshotlist.com/127.0.0.1#5335\nipset=/cumshotlist.com/gfwlist\nserver=/intel.sr/127.0.0.1#5335\nipset=/intel.sr/gfwlist\nserver=/ikea.be/127.0.0.1#5335\nipset=/ikea.be/gfwlist\nserver=/yahoo.mk/127.0.0.1#5335\nipset=/yahoo.mk/gfwlist\nserver=/yahoo.md/127.0.0.1#5335\nipset=/yahoo.md/gfwlist\nserver=/movenetworks.com/127.0.0.1#5335\nipset=/movenetworks.com/gfwlist\nserver=/wisekey.com/127.0.0.1#5335\nipset=/wisekey.com/gfwlist\nserver=/yahoo.lt/127.0.0.1#5335\nipset=/yahoo.lt/gfwlist\nserver=/yahoo.jo/127.0.0.1#5335\nipset=/yahoo.jo/gfwlist\nserver=/yahoo.je/127.0.0.1#5335\nipset=/yahoo.je/gfwlist\nserver=/blogoverflow.com/127.0.0.1#5335\nipset=/blogoverflow.com/gfwlist\nserver=/pigav.com/127.0.0.1#5335\nipset=/pigav.com/gfwlist\nserver=/dogecoin.com/127.0.0.1#5335\nipset=/dogecoin.com/gfwlist\nserver=/yahoo.in/127.0.0.1#5335\nipset=/yahoo.in/gfwlist\nserver=/yahoo.hr/127.0.0.1#5335\nipset=/yahoo.hr/gfwlist\nserver=/ahegao.online/127.0.0.1#5335\nipset=/ahegao.online/gfwlist\nserver=/yahoo.hk/127.0.0.1#5335\nipset=/yahoo.hk/gfwlist\nserver=/apexprint.com.hk/127.0.0.1#5335\nipset=/apexprint.com.hk/gfwlist\nserver=/yahoo.gy/127.0.0.1#5335\nipset=/yahoo.gy/gfwlist\nserver=/snapkit.co/127.0.0.1#5335\nipset=/snapkit.co/gfwlist\nserver=/gettyimages.es/127.0.0.1#5335\nipset=/gettyimages.es/gfwlist\nserver=/night.livedoor.biz/127.0.0.1#5335\nipset=/night.livedoor.biz/gfwlist\nserver=/bmw.com.py/127.0.0.1#5335\nipset=/bmw.com.py/gfwlist\nserver=/yahoo.gr/127.0.0.1#5335\nipset=/yahoo.gr/gfwlist\nserver=/yahoo.gp/127.0.0.1#5335\nipset=/yahoo.gp/gfwlist\nserver=/verizonfios.com/127.0.0.1#5335\nipset=/verizonfios.com/gfwlist\nserver=/yahoo.gm/127.0.0.1#5335\nipset=/yahoo.gm/gfwlist\nserver=/pinterest.ch/127.0.0.1#5335\nipset=/pinterest.ch/gfwlist\nserver=/rocksdb.com/127.0.0.1#5335\nipset=/rocksdb.com/gfwlist\nserver=/meraki.hk/127.0.0.1#5335\nipset=/meraki.hk/gfwlist\nserver=/javmany.com/127.0.0.1#5335\nipset=/javmany.com/gfwlist\nserver=/drunkenstepfather.com/127.0.0.1#5335\nipset=/drunkenstepfather.com/gfwlist\nserver=/520aa.tv/127.0.0.1#5335\nipset=/520aa.tv/gfwlist\nserver=/sony.rs/127.0.0.1#5335\nipset=/sony.rs/gfwlist\nserver=/yahoo.gg/127.0.0.1#5335\nipset=/yahoo.gg/gfwlist\nserver=/yahoo.fm/127.0.0.1#5335\nipset=/yahoo.fm/gfwlist\nserver=/fbredex.com/127.0.0.1#5335\nipset=/fbredex.com/gfwlist\nserver=/yahoo.ee/127.0.0.1#5335\nipset=/yahoo.ee/gfwlist\nserver=/wballiance.com/127.0.0.1#5335\nipset=/wballiance.com/gfwlist\nserver=/nvidia.lu/127.0.0.1#5335\nipset=/nvidia.lu/gfwlist\nserver=/urukawa.com/127.0.0.1#5335\nipset=/urukawa.com/gfwlist\nserver=/roughman.net/127.0.0.1#5335\nipset=/roughman.net/gfwlist\nserver=/wapm.io/127.0.0.1#5335\nipset=/wapm.io/gfwlist\nserver=/yahoo.com.vc/127.0.0.1#5335\nipset=/yahoo.com.vc/gfwlist\nserver=/zlib.life/127.0.0.1#5335\nipset=/zlib.life/gfwlist\nserver=/dreambmw.ca/127.0.0.1#5335\nipset=/dreambmw.ca/gfwlist\nserver=/yahoo.com.ua/127.0.0.1#5335\nipset=/yahoo.com.ua/gfwlist\nserver=/yahoo.sm/127.0.0.1#5335\nipset=/yahoo.sm/gfwlist\nserver=/iw8j.cc/127.0.0.1#5335\nipset=/iw8j.cc/gfwlist\nserver=/yahoo.com.sv/127.0.0.1#5335\nipset=/yahoo.com.sv/gfwlist\nserver=/chickteases.com/127.0.0.1#5335\nipset=/chickteases.com/gfwlist\nserver=/jwplatform.com/127.0.0.1#5335\nipset=/jwplatform.com/gfwlist\nserver=/mypornolab.click/127.0.0.1#5335\nipset=/mypornolab.click/gfwlist\nserver=/yahoo.com.py/127.0.0.1#5335\nipset=/yahoo.com.py/gfwlist\nserver=/yahoo.com.ph/127.0.0.1#5335\nipset=/yahoo.com.ph/gfwlist\nserver=/proporn.com/127.0.0.1#5335\nipset=/proporn.com/gfwlist\nserver=/yahoo.com.pe/127.0.0.1#5335\nipset=/yahoo.com.pe/gfwlist\nserver=/youporn-germany.com/127.0.0.1#5335\nipset=/youporn-germany.com/gfwlist\nserver=/kubeapps.com/127.0.0.1#5335\nipset=/kubeapps.com/gfwlist\nserver=/jerkdude.com/127.0.0.1#5335\nipset=/jerkdude.com/gfwlist\nserver=/yahoo.com.ly/127.0.0.1#5335\nipset=/yahoo.com.ly/gfwlist\nserver=/uoherald.com/127.0.0.1#5335\nipset=/uoherald.com/gfwlist\nserver=/ebahy.com/127.0.0.1#5335\nipset=/ebahy.com/gfwlist\nserver=/codecademy.com/127.0.0.1#5335\nipset=/codecademy.com/gfwlist\nserver=/squareup.com/127.0.0.1#5335\nipset=/squareup.com/gfwlist\nserver=/homedepot.com/127.0.0.1#5335\nipset=/homedepot.com/gfwlist\nserver=/visa.com.tt/127.0.0.1#5335\nipset=/visa.com.tt/gfwlist\nserver=/dragonagemovie.com/127.0.0.1#5335\nipset=/dragonagemovie.com/gfwlist\nserver=/casquemonsterbeats.com/127.0.0.1#5335\nipset=/casquemonsterbeats.com/gfwlist\nserver=/yahoo.com.eg/127.0.0.1#5335\nipset=/yahoo.com.eg/gfwlist\nserver=/officecdn-microsoft-com.akamaized.net/127.0.0.1#5335\nipset=/officecdn-microsoft-com.akamaized.net/gfwlist\nserver=/yahoo.com.co/127.0.0.1#5335\nipset=/yahoo.com.co/gfwlist\nserver=/yahoo.com.bz/127.0.0.1#5335\nipset=/yahoo.com.bz/gfwlist\nserver=/mastercard.inc/127.0.0.1#5335\nipset=/mastercard.inc/gfwlist\nserver=/yahoo.com.br/127.0.0.1#5335\nipset=/yahoo.com.br/gfwlist\nserver=/sony.com.tw/127.0.0.1#5335\nipset=/sony.com.tw/gfwlist\nserver=/paypal-brandcentral.com/127.0.0.1#5335\nipset=/paypal-brandcentral.com/gfwlist\nserver=/trustedanalytics.net/127.0.0.1#5335\nipset=/trustedanalytics.net/gfwlist\nserver=/yahoo.com.au/127.0.0.1#5335\nipset=/yahoo.com.au/gfwlist\nserver=/yahoo.com.ar/127.0.0.1#5335\nipset=/yahoo.com.ar/gfwlist\nserver=/porn1videos.com/127.0.0.1#5335\nipset=/porn1videos.com/gfwlist\nserver=/yahoo.com.ai/127.0.0.1#5335\nipset=/yahoo.com.ai/gfwlist\nserver=/yahoo.com.af/127.0.0.1#5335\nipset=/yahoo.com.af/gfwlist\nserver=/bmw-sudan.com/127.0.0.1#5335\nipset=/bmw-sudan.com/gfwlist\nserver=/yahoo.co.za/127.0.0.1#5335\nipset=/yahoo.co.za/gfwlist\nserver=/cloudburstresearch.com/127.0.0.1#5335\nipset=/cloudburstresearch.com/gfwlist\nserver=/offrezdesipods.com/127.0.0.1#5335\nipset=/offrezdesipods.com/gfwlist\nserver=/nude-share.com/127.0.0.1#5335\nipset=/nude-share.com/gfwlist\nserver=/yahoo.co.uz/127.0.0.1#5335\nipset=/yahoo.co.uz/gfwlist\nserver=/yahoo.co.uk/127.0.0.1#5335\nipset=/yahoo.co.uk/gfwlist\nserver=/yahoo.co.nz/127.0.0.1#5335\nipset=/yahoo.co.nz/gfwlist\nserver=/yahoo.co.kr/127.0.0.1#5335\nipset=/yahoo.co.kr/gfwlist\nserver=/yahoo.co.cr/127.0.0.1#5335\nipset=/yahoo.co.cr/gfwlist\nserver=/yahoo.co.ck/127.0.0.1#5335\nipset=/yahoo.co.ck/gfwlist\nserver=/cheapwireless04.com/127.0.0.1#5335\nipset=/cheapwireless04.com/gfwlist\nserver=/yahoo.co.ao/127.0.0.1#5335\nipset=/yahoo.co.ao/gfwlist\nserver=/yahoo.cg/127.0.0.1#5335\nipset=/yahoo.cg/gfwlist\nserver=/lustteens.net/127.0.0.1#5335\nipset=/lustteens.net/gfwlist\nserver=/themarvelexperiencetour.com/127.0.0.1#5335\nipset=/themarvelexperiencetour.com/gfwlist\nserver=/yahoo.cat/127.0.0.1#5335\nipset=/yahoo.cat/gfwlist\nserver=/yahoo.ca/127.0.0.1#5335\nipset=/yahoo.ca/gfwlist\nserver=/beatsinsingapore.com/127.0.0.1#5335\nipset=/beatsinsingapore.com/gfwlist\nserver=/yahoo.bs/127.0.0.1#5335\nipset=/yahoo.bs/gfwlist\nserver=/yahoo.bg/127.0.0.1#5335\nipset=/yahoo.bg/gfwlist\nserver=/xxxstreams.watch/127.0.0.1#5335\nipset=/xxxstreams.watch/gfwlist\nserver=/trannygem.com/127.0.0.1#5335\nipset=/trannygem.com/gfwlist\nserver=/yahoo.ba/127.0.0.1#5335\nipset=/yahoo.ba/gfwlist\nserver=/riotpoints.com/127.0.0.1#5335\nipset=/riotpoints.com/gfwlist\nserver=/xv1.monster/127.0.0.1#5335\nipset=/xv1.monster/gfwlist\nserver=/yahoo.am/127.0.0.1#5335\nipset=/yahoo.am/gfwlist\nserver=/lanternal.com/127.0.0.1#5335\nipset=/lanternal.com/gfwlist\nserver=/javhd.pro/127.0.0.1#5335\nipset=/javhd.pro/gfwlist\nserver=/rapefilms.net/127.0.0.1#5335\nipset=/rapefilms.net/gfwlist\nserver=/accountpaypal.org/127.0.0.1#5335\nipset=/accountpaypal.org/gfwlist\nserver=/nurofen.de/127.0.0.1#5335\nipset=/nurofen.de/gfwlist\nserver=/ycombinator.com/127.0.0.1#5335\nipset=/ycombinator.com/gfwlist\nserver=/aps.org/127.0.0.1#5335\nipset=/aps.org/gfwlist\nserver=/intel.com.ph/127.0.0.1#5335\nipset=/intel.com.ph/gfwlist\nserver=/sandisk.nl/127.0.0.1#5335\nipset=/sandisk.nl/gfwlist\nserver=/sandisk.hk/127.0.0.1#5335\nipset=/sandisk.hk/gfwlist\nserver=/welcometobestbuy.ca/127.0.0.1#5335\nipset=/welcometobestbuy.ca/gfwlist\nserver=/mini.co.uk/127.0.0.1#5335\nipset=/mini.co.uk/gfwlist\nserver=/sandisk.de/127.0.0.1#5335\nipset=/sandisk.de/gfwlist\nserver=/ichineseporn.com/127.0.0.1#5335\nipset=/ichineseporn.com/gfwlist\nserver=/sandisk.com.tw/127.0.0.1#5335\nipset=/sandisk.com.tw/gfwlist\nserver=/qwapi.com/127.0.0.1#5335\nipset=/qwapi.com/gfwlist\nserver=/sandisk.com.tr/127.0.0.1#5335\nipset=/sandisk.com.tr/gfwlist\nserver=/attsavings.com/127.0.0.1#5335\nipset=/attsavings.com/gfwlist\nserver=/sandisk.com.br/127.0.0.1#5335\nipset=/sandisk.com.br/gfwlist\nserver=/lysol.com/127.0.0.1#5335\nipset=/lysol.com/gfwlist\nserver=/foxsportsla.com/127.0.0.1#5335\nipset=/foxsportsla.com/gfwlist\nserver=/timelinestoryteller.com/127.0.0.1#5335\nipset=/timelinestoryteller.com/gfwlist\nserver=/vmware-techcenter.com/127.0.0.1#5335\nipset=/vmware-techcenter.com/gfwlist\nserver=/vmworld.com/127.0.0.1#5335\nipset=/vmworld.com/gfwlist\nserver=/sonybuilding.jp/127.0.0.1#5335\nipset=/sonybuilding.jp/gfwlist\nserver=/g-technology.com/127.0.0.1#5335\nipset=/g-technology.com/gfwlist\nserver=/uber.com/127.0.0.1#5335\nipset=/uber.com/gfwlist\nserver=/tonec.com/127.0.0.1#5335\nipset=/tonec.com/gfwlist\nserver=/registeridm.com/127.0.0.1#5335\nipset=/registeridm.com/gfwlist\nserver=/hornyelephant.com/127.0.0.1#5335\nipset=/hornyelephant.com/gfwlist\nserver=/hairy-women-pussy.net/127.0.0.1#5335\nipset=/hairy-women-pussy.net/gfwlist\nserver=/lewdthots.com/127.0.0.1#5335\nipset=/lewdthots.com/gfwlist\nserver=/internetdownloadmanager.com/127.0.0.1#5335\nipset=/internetdownloadmanager.com/gfwlist\nserver=/x.com/127.0.0.1#5335\nipset=/x.com/gfwlist\nserver=/sonylatvija.com/127.0.0.1#5335\nipset=/sonylatvija.com/gfwlist\nserver=/disneymagicmoments.gen.tr/127.0.0.1#5335\nipset=/disneymagicmoments.gen.tr/gfwlist\nserver=/sonyglobalsolutions.jp/127.0.0.1#5335\nipset=/sonyglobalsolutions.jp/gfwlist\nserver=/monster-beats-by-dr-dre.com/127.0.0.1#5335\nipset=/monster-beats-by-dr-dre.com/gfwlist\nserver=/sonydna.com/127.0.0.1#5335\nipset=/sonydna.com/gfwlist\nserver=/japanbeast.com/127.0.0.1#5335\nipset=/japanbeast.com/gfwlist\nserver=/amazon-lantern.com/127.0.0.1#5335\nipset=/amazon-lantern.com/gfwlist\nserver=/sony.se/127.0.0.1#5335\nipset=/sony.se/gfwlist\nserver=/cheapbeatsshopbydre.com/127.0.0.1#5335\nipset=/cheapbeatsshopbydre.com/gfwlist\nserver=/visakorea.com/127.0.0.1#5335\nipset=/visakorea.com/gfwlist\nserver=/sony.nl/127.0.0.1#5335\nipset=/sony.nl/gfwlist\nserver=/sony.net/127.0.0.1#5335\nipset=/sony.net/gfwlist\nserver=/sony.lv/127.0.0.1#5335\nipset=/sony.lv/gfwlist\nserver=/sony.hu/127.0.0.1#5335\nipset=/sony.hu/gfwlist\nserver=/sony.hr/127.0.0.1#5335\nipset=/sony.hr/gfwlist\nserver=/appexchange.com/127.0.0.1#5335\nipset=/appexchange.com/gfwlist\nserver=/sony.gr/127.0.0.1#5335\nipset=/sony.gr/gfwlist\nserver=/yaburi.men/127.0.0.1#5335\nipset=/yaburi.men/gfwlist\nserver=/cnbeta.com/127.0.0.1#5335\nipset=/cnbeta.com/gfwlist\nserver=/sony.fr/127.0.0.1#5335\nipset=/sony.fr/gfwlist\nserver=/yibei.org/127.0.0.1#5335\nipset=/yibei.org/gfwlist\nserver=/sony.fi/127.0.0.1#5335\nipset=/sony.fi/gfwlist\nserver=/realamericanstories.org/127.0.0.1#5335\nipset=/realamericanstories.org/gfwlist\nserver=/intel.ro/127.0.0.1#5335\nipset=/intel.ro/gfwlist\nserver=/sony.es/127.0.0.1#5335\nipset=/sony.es/gfwlist\nserver=/sony.ee/127.0.0.1#5335\nipset=/sony.ee/gfwlist\nserver=/boyfriendtv.com/127.0.0.1#5335\nipset=/boyfriendtv.com/gfwlist\nserver=/sony.dk/127.0.0.1#5335\nipset=/sony.dk/gfwlist\nserver=/onlygayvideo.com/127.0.0.1#5335\nipset=/onlygayvideo.com/gfwlist\nserver=/sony.de/127.0.0.1#5335\nipset=/sony.de/gfwlist\nserver=/naked-girls.me/127.0.0.1#5335\nipset=/naked-girls.me/gfwlist\nserver=/sony.com.tr/127.0.0.1#5335\nipset=/sony.com.tr/gfwlist\nserver=/adidas.ch/127.0.0.1#5335\nipset=/adidas.ch/gfwlist\nserver=/twvid.com/127.0.0.1#5335\nipset=/twvid.com/gfwlist\nserver=/get.page/127.0.0.1#5335\nipset=/get.page/gfwlist\nserver=/vmworld2010.com/127.0.0.1#5335\nipset=/vmworld2010.com/gfwlist\nserver=/sony.com.ph/127.0.0.1#5335\nipset=/sony.com.ph/gfwlist\nserver=/vfsco.fi/127.0.0.1#5335\nipset=/vfsco.fi/gfwlist\nserver=/1to1conference.com.au/127.0.0.1#5335\nipset=/1to1conference.com.au/gfwlist\nserver=/adultartlinks.supertop-100.com/127.0.0.1#5335\nipset=/adultartlinks.supertop-100.com/gfwlist\nserver=/sony.com.pe/127.0.0.1#5335\nipset=/sony.com.pe/gfwlist\nserver=/atom.io/127.0.0.1#5335\nipset=/atom.io/gfwlist\nserver=/sony.com.pa/127.0.0.1#5335\nipset=/sony.com.pa/gfwlist\nserver=/sony.com.my/127.0.0.1#5335\nipset=/sony.com.my/gfwlist\nserver=/sony.com.mk/127.0.0.1#5335\nipset=/sony.com.mk/gfwlist\nserver=/sony.com.do/127.0.0.1#5335\nipset=/sony.com.do/gfwlist\nserver=/dependabot.com/127.0.0.1#5335\nipset=/dependabot.com/gfwlist\nserver=/peacocktv.com/127.0.0.1#5335\nipset=/peacocktv.com/gfwlist\nserver=/sony.co.uk/127.0.0.1#5335\nipset=/sony.co.uk/gfwlist\nserver=/sony.co.th/127.0.0.1#5335\nipset=/sony.co.th/gfwlist\nserver=/sony.co.jp/127.0.0.1#5335\nipset=/sony.co.jp/gfwlist\nserver=/sony.co.in/127.0.0.1#5335\nipset=/sony.co.in/gfwlist\nserver=/sony.co.id/127.0.0.1#5335\nipset=/sony.co.id/gfwlist\nserver=/sony.co.cr/127.0.0.1#5335\nipset=/sony.co.cr/gfwlist\nserver=/sony.ch/127.0.0.1#5335\nipset=/sony.ch/gfwlist\nserver=/sony.ca/127.0.0.1#5335\nipset=/sony.ca/gfwlist\nserver=/globalsign.co.uk/127.0.0.1#5335\nipset=/globalsign.co.uk/gfwlist\nserver=/verisign.in/127.0.0.1#5335\nipset=/verisign.in/gfwlist\nserver=/sony.bg/127.0.0.1#5335\nipset=/sony.bg/gfwlist\nserver=/sony.ba/127.0.0.1#5335\nipset=/sony.ba/gfwlist\nserver=/sony-promotion.eu/127.0.0.1#5335\nipset=/sony-promotion.eu/gfwlist\nserver=/sony-mea.com/127.0.0.1#5335\nipset=/sony-mea.com/gfwlist\nserver=/sony-latin.com/127.0.0.1#5335\nipset=/sony-latin.com/gfwlist\nserver=/tensorflow.org/127.0.0.1#5335\nipset=/tensorflow.org/gfwlist\nserver=/sony-europe.com/127.0.0.1#5335\nipset=/sony-europe.com/gfwlist\nserver=/camwhoresbay.com/127.0.0.1#5335\nipset=/camwhoresbay.com/gfwlist\nserver=/whychoosevmwareeuc.com/127.0.0.1#5335\nipset=/whychoosevmwareeuc.com/gfwlist\nserver=/momsteachsex.info/127.0.0.1#5335\nipset=/momsteachsex.info/gfwlist\nserver=/df-bet.com/127.0.0.1#5335\nipset=/df-bet.com/gfwlist\nserver=/worldescortindex.com/127.0.0.1#5335\nipset=/worldescortindex.com/gfwlist\nserver=/snap.com/127.0.0.1#5335\nipset=/snap.com/gfwlist\nserver=/pornaxo.com/127.0.0.1#5335\nipset=/pornaxo.com/gfwlist\nserver=/sc-cdn.net/127.0.0.1#5335\nipset=/sc-cdn.net/gfwlist\nserver=/wise-research.com/127.0.0.1#5335\nipset=/wise-research.com/gfwlist\nserver=/smartonerobotics.com/127.0.0.1#5335\nipset=/smartonerobotics.com/gfwlist\nserver=/dialogflow.com/127.0.0.1#5335\nipset=/dialogflow.com/gfwlist\nserver=/sony.com.sv/127.0.0.1#5335\nipset=/sony.com.sv/gfwlist\nserver=/wiisports.com/127.0.0.1#5335\nipset=/wiisports.com/gfwlist\nserver=/s-rewards.hk/127.0.0.1#5335\nipset=/s-rewards.hk/gfwlist\nserver=/s-cashonmobile.com/127.0.0.1#5335\nipset=/s-cashonmobile.com/gfwlist\nserver=/ip73.com/127.0.0.1#5335\nipset=/ip73.com/gfwlist\nserver=/12diasderegalosdeitunes.co.ve/127.0.0.1#5335\nipset=/12diasderegalosdeitunes.co.ve/gfwlist\nserver=/hkcircleapp.com/127.0.0.1#5335\nipset=/hkcircleapp.com/gfwlist\nserver=/barkadahansasmartone.com/127.0.0.1#5335\nipset=/barkadahansasmartone.com/gfwlist\nserver=/appleone.community/127.0.0.1#5335\nipset=/appleone.community/gfwlist\nserver=/samsunggalaxyfriends.com/127.0.0.1#5335\nipset=/samsunggalaxyfriends.com/gfwlist\nserver=/canon-cee.com/127.0.0.1#5335\nipset=/canon-cee.com/gfwlist\nserver=/fcfacebook.com/127.0.0.1#5335\nipset=/fcfacebook.com/gfwlist\nserver=/ntc.party/127.0.0.1#5335\nipset=/ntc.party/gfwlist\nserver=/nuvid.com/127.0.0.1#5335\nipset=/nuvid.com/gfwlist\nserver=/vmwarelearning.com/127.0.0.1#5335\nipset=/vmwarelearning.com/gfwlist\nserver=/samsungapps.com/127.0.0.1#5335\nipset=/samsungapps.com/gfwlist\nserver=/bloombergprep.com/127.0.0.1#5335\nipset=/bloombergprep.com/gfwlist\nserver=/samsung.com/127.0.0.1#5335\nipset=/samsung.com/gfwlist\nserver=/vanish.co.in/127.0.0.1#5335\nipset=/vanish.co.in/gfwlist\nserver=/galaxyappstore.com/127.0.0.1#5335\nipset=/galaxyappstore.com/gfwlist\nserver=/steelbrick.com/127.0.0.1#5335\nipset=/steelbrick.com/gfwlist\nserver=/xvideosnovinha.com.br/127.0.0.1#5335\nipset=/xvideosnovinha.com.br/gfwlist\nserver=/sforce.com/127.0.0.1#5335\nipset=/sforce.com/gfwlist\nserver=/sfdcstatic.com/127.0.0.1#5335\nipset=/sfdcstatic.com/gfwlist\nserver=/sequence.com/127.0.0.1#5335\nipset=/sequence.com/gfwlist\nserver=/dataliberation.org/127.0.0.1#5335\nipset=/dataliberation.org/gfwlist\nserver=/google.com.ni/127.0.0.1#5335\nipset=/google.com.ni/gfwlist\nserver=/salesforceliveagent.com/127.0.0.1#5335\nipset=/salesforceliveagent.com/gfwlist\nserver=/salesforceiq.com/127.0.0.1#5335\nipset=/salesforceiq.com/gfwlist\nserver=/line-apps-beta.com/127.0.0.1#5335\nipset=/line-apps-beta.com/gfwlist\nserver=/straightpornstuds.com/127.0.0.1#5335\nipset=/straightpornstuds.com/gfwlist\nserver=/2chav.com/127.0.0.1#5335\nipset=/2chav.com/gfwlist\nserver=/pearsonclinical.eu/127.0.0.1#5335\nipset=/pearsonclinical.eu/gfwlist\nserver=/salesforce.org/127.0.0.1#5335\nipset=/salesforce.org/gfwlist\nserver=/faceboook.com/127.0.0.1#5335\nipset=/faceboook.com/gfwlist\nserver=/unbrandedproducts.com/127.0.0.1#5335\nipset=/unbrandedproducts.com/gfwlist\nserver=/quotable.com/127.0.0.1#5335\nipset=/quotable.com/gfwlist\nserver=/pardot.com/127.0.0.1#5335\nipset=/pardot.com/gfwlist\nserver=/microsoft.ca/127.0.0.1#5335\nipset=/microsoft.ca/gfwlist\nserver=/force.com/127.0.0.1#5335\nipset=/force.com/gfwlist\nserver=/exacttarget.com/127.0.0.1#5335\nipset=/exacttarget.com/gfwlist\nserver=/liboggirls.net/127.0.0.1#5335\nipset=/liboggirls.net/gfwlist\nserver=/minikelowna.ca/127.0.0.1#5335\nipset=/minikelowna.ca/gfwlist\nserver=/einstein.com/127.0.0.1#5335\nipset=/einstein.com/gfwlist\nserver=/desk.com/127.0.0.1#5335\nipset=/desk.com/gfwlist\nserver=/google.mk/127.0.0.1#5335\nipset=/google.mk/gfwlist\nserver=/demandware.com/127.0.0.1#5335\nipset=/demandware.com/gfwlist\nserver=/drdrebeatsforu.com/127.0.0.1#5335\nipset=/drdrebeatsforu.com/gfwlist\nserver=/ilife.gr/127.0.0.1#5335\nipset=/ilife.gr/gfwlist\nserver=/cloudcraze.com/127.0.0.1#5335\nipset=/cloudcraze.com/gfwlist\nserver=/chatter.com/127.0.0.1#5335\nipset=/chatter.com/gfwlist\nserver=/beyondcore.com/127.0.0.1#5335\nipset=/beyondcore.com/gfwlist\nserver=/razerzone.jp/127.0.0.1#5335\nipset=/razerzone.jp/gfwlist\nserver=/razerzone.com/127.0.0.1#5335\nipset=/razerzone.com/gfwlist\nserver=/newhentai.org/127.0.0.1#5335\nipset=/newhentai.org/gfwlist\nserver=/qwant.fr/127.0.0.1#5335\nipset=/qwant.fr/gfwlist\nserver=/ieee-sensors.org/127.0.0.1#5335\nipset=/ieee-sensors.org/gfwlist\nserver=/soso7778.com/127.0.0.1#5335\nipset=/soso7778.com/gfwlist\nserver=/shemalestardb.com/127.0.0.1#5335\nipset=/shemalestardb.com/gfwlist\nserver=/qwant.com/127.0.0.1#5335\nipset=/qwant.com/gfwlist\nserver=/intel.ag/127.0.0.1#5335\nipset=/intel.ag/gfwlist\nserver=/mongodb.org/127.0.0.1#5335\nipset=/mongodb.org/gfwlist\nserver=/uplinq.com/127.0.0.1#5335\nipset=/uplinq.com/gfwlist\nserver=/bestialitysextaboo.com/127.0.0.1#5335\nipset=/bestialitysextaboo.com/gfwlist\nserver=/snapdragonbooth.com/127.0.0.1#5335\nipset=/snapdragonbooth.com/gfwlist\nserver=/snapdragon.cn/127.0.0.1#5335\nipset=/snapdragon.cn/gfwlist\nserver=/minilangley.ca/127.0.0.1#5335\nipset=/minilangley.ca/gfwlist\nserver=/qualcommventures.cn/127.0.0.1#5335\nipset=/qualcommventures.cn/gfwlist\nserver=/qualcommretail.com/127.0.0.1#5335\nipset=/qualcommretail.com/gfwlist\nserver=/avfox.cc/127.0.0.1#5335\nipset=/avfox.cc/gfwlist\nserver=/sexxxhd.com/127.0.0.1#5335\nipset=/sexxxhd.com/gfwlist\nserver=/volvobuses.pk/127.0.0.1#5335\nipset=/volvobuses.pk/gfwlist\nserver=/qualcommmea.com/127.0.0.1#5335\nipset=/qualcommmea.com/gfwlist\nserver=/qualcomm.fr/127.0.0.1#5335\nipset=/qualcomm.fr/gfwlist\nserver=/lexisnexis.com/127.0.0.1#5335\nipset=/lexisnexis.com/gfwlist\nserver=/qualcomm.com.tw/127.0.0.1#5335\nipset=/qualcomm.com.tw/gfwlist\nserver=/qualcomm.co.kr/127.0.0.1#5335\nipset=/qualcomm.co.kr/gfwlist\nserver=/qualcomm.co.in/127.0.0.1#5335\nipset=/qualcomm.co.in/gfwlist\nserver=/whatsapp-plus.net/127.0.0.1#5335\nipset=/whatsapp-plus.net/gfwlist\nserver=/mypearson.com/127.0.0.1#5335\nipset=/mypearson.com/gfwlist\nserver=/qctconnect.com/127.0.0.1#5335\nipset=/qctconnect.com/gfwlist\nserver=/patenttruth.org/127.0.0.1#5335\nipset=/patenttruth.org/gfwlist\nserver=/pavpal.com/127.0.0.1#5335\nipset=/pavpal.com/gfwlist\nserver=/mhshosting.com/127.0.0.1#5335\nipset=/mhshosting.com/gfwlist\nserver=/imod.com/127.0.0.1#5335\nipset=/imod.com/gfwlist\nserver=/vip-beats.com/127.0.0.1#5335\nipset=/vip-beats.com/gfwlist\nserver=/gobianywhere.com/127.0.0.1#5335\nipset=/gobianywhere.com/gfwlist\nserver=/cdmatech.com/127.0.0.1#5335\nipset=/cdmatech.com/gfwlist\nserver=/sexgames.xxx/127.0.0.1#5335\nipset=/sexgames.xxx/gfwlist\nserver=/donmai.us/127.0.0.1#5335\nipset=/donmai.us/gfwlist\nserver=/berkanawireless.com/127.0.0.1#5335\nipset=/berkanawireless.com/gfwlist\nserver=/bridgestonemerchandise.com/127.0.0.1#5335\nipset=/bridgestonemerchandise.com/gfwlist\nserver=/cheap-nike.com/127.0.0.1#5335\nipset=/cheap-nike.com/gfwlist\nserver=/jpg4us.net/127.0.0.1#5335\nipset=/jpg4us.net/gfwlist\nserver=/volvotrucks.az/127.0.0.1#5335\nipset=/volvotrucks.az/gfwlist\nserver=/stockingfetishvideo.com/127.0.0.1#5335\nipset=/stockingfetishvideo.com/gfwlist\nserver=/ebayfashion.com/127.0.0.1#5335\nipset=/ebayfashion.com/gfwlist\nserver=/genkai-hounyo.com/127.0.0.1#5335\nipset=/genkai-hounyo.com/gfwlist\nserver=/bmw-motorrad.ua/127.0.0.1#5335\nipset=/bmw-motorrad.ua/gfwlist\nserver=/pccw.com/127.0.0.1#5335\nipset=/pccw.com/gfwlist\nserver=/hktpremier.com/127.0.0.1#5335\nipset=/hktpremier.com/gfwlist\nserver=/hkt.com/127.0.0.1#5335\nipset=/hkt.com/gfwlist\nserver=/media-rockstargames-com.akamaized.net/127.0.0.1#5335\nipset=/media-rockstargames-com.akamaized.net/gfwlist\nserver=/scholar.google.com.hk/127.0.0.1#5335\nipset=/scholar.google.com.hk/gfwlist\nserver=/hkt-eye.com/127.0.0.1#5335\nipset=/hkt-eye.com/gfwlist\nserver=/esmarthealth.com/127.0.0.1#5335\nipset=/esmarthealth.com/gfwlist\nserver=/drdrebeats-headphone.com/127.0.0.1#5335\nipset=/drdrebeats-headphone.com/gfwlist\nserver=/panasonic.com/127.0.0.1#5335\nipset=/panasonic.com/gfwlist\nserver=/facebookofsex.com/127.0.0.1#5335\nipset=/facebookofsex.com/gfwlist\nserver=/oracleinfinity.io/127.0.0.1#5335\nipset=/oracleinfinity.io/gfwlist\nserver=/oracleimg.com/127.0.0.1#5335\nipset=/oracleimg.com/gfwlist\nserver=/oraclecloud.com/127.0.0.1#5335\nipset=/oraclecloud.com/gfwlist\nserver=/oracle.com/127.0.0.1#5335\nipset=/oracle.com/gfwlist\nserver=/jquerymobile.com/127.0.0.1#5335\nipset=/jquerymobile.com/gfwlist\nserver=/openweathermap.org/127.0.0.1#5335\nipset=/openweathermap.org/gfwlist\nserver=/nvidia.tt.omtrdc.net/127.0.0.1#5335\nipset=/nvidia.tt.omtrdc.net/gfwlist\nserver=/tegrazone.kr/127.0.0.1#5335\nipset=/tegrazone.kr/gfwlist\nserver=/mini.com.pa/127.0.0.1#5335\nipset=/mini.com.pa/gfwlist\nserver=/steamstore-a.akamaihd.net/127.0.0.1#5335\nipset=/steamstore-a.akamaihd.net/gfwlist\nserver=/tegrazone.com/127.0.0.1#5335\nipset=/tegrazone.com/gfwlist\nserver=/deno.land/127.0.0.1#5335\nipset=/deno.land/gfwlist\nserver=/hdready.xxx/127.0.0.1#5335\nipset=/hdready.xxx/gfwlist\nserver=/pensions-expert.com/127.0.0.1#5335\nipset=/pensions-expert.com/gfwlist\nserver=/nvidiagrid.net/127.0.0.1#5335\nipset=/nvidiagrid.net/gfwlist\nserver=/fans-here.com/127.0.0.1#5335\nipset=/fans-here.com/gfwlist\nserver=/nvidia.tw/127.0.0.1#5335\nipset=/nvidia.tw/gfwlist\nserver=/nvidia.se/127.0.0.1#5335\nipset=/nvidia.se/gfwlist\nserver=/reckittprofessional.com/127.0.0.1#5335\nipset=/reckittprofessional.com/gfwlist\nserver=/pornoprive.xxx/127.0.0.1#5335\nipset=/pornoprive.xxx/gfwlist\nserver=/nvidia.mx/127.0.0.1#5335\nipset=/nvidia.mx/gfwlist\nserver=/yahoo.de/127.0.0.1#5335\nipset=/yahoo.de/gfwlist\nserver=/nvidia.in/127.0.0.1#5335\nipset=/nvidia.in/gfwlist\nserver=/microsoft.pt/127.0.0.1#5335\nipset=/microsoft.pt/gfwlist\nserver=/nvidia.fi/127.0.0.1#5335\nipset=/nvidia.fi/gfwlist\nserver=/candidforum-videos.com/127.0.0.1#5335\nipset=/candidforum-videos.com/gfwlist\nserver=/nvidia.de/127.0.0.1#5335\nipset=/nvidia.de/gfwlist\nserver=/cncrivals.com/127.0.0.1#5335\nipset=/cncrivals.com/gfwlist\nserver=/nvidia.cz/127.0.0.1#5335\nipset=/nvidia.cz/gfwlist\nserver=/love-sextoys.co.uk/127.0.0.1#5335\nipset=/love-sextoys.co.uk/gfwlist\nserver=/nvidia.com.tw/127.0.0.1#5335\nipset=/nvidia.com.tw/gfwlist\nserver=/enemaprocedure.com/127.0.0.1#5335\nipset=/enemaprocedure.com/gfwlist\nserver=/thunderbolttechnology.net/127.0.0.1#5335\nipset=/thunderbolttechnology.net/gfwlist\nserver=/nvidia.co.uk/127.0.0.1#5335\nipset=/nvidia.co.uk/gfwlist\nserver=/nvidia.at/127.0.0.1#5335\nipset=/nvidia.at/gfwlist\nserver=/gputechconf.jp/127.0.0.1#5335\nipset=/gputechconf.jp/gfwlist\nserver=/gputechconf.in/127.0.0.1#5335\nipset=/gputechconf.in/gfwlist\nserver=/durex.se/127.0.0.1#5335\nipset=/durex.se/gfwlist\nserver=/anon-v.lol/127.0.0.1#5335\nipset=/anon-v.lol/gfwlist\nserver=/lolespor.com/127.0.0.1#5335\nipset=/lolespor.com/gfwlist\nserver=/taxidrivermovie.com/127.0.0.1#5335\nipset=/taxidrivermovie.com/gfwlist\nserver=/instagramtakipcisatinal.net/127.0.0.1#5335\nipset=/instagramtakipcisatinal.net/gfwlist\nserver=/geforce.co.uk/127.0.0.1#5335\nipset=/geforce.co.uk/gfwlist\nserver=/hdxx.tv/127.0.0.1#5335\nipset=/hdxx.tv/gfwlist\nserver=/megaporno.com.br/127.0.0.1#5335\nipset=/megaporno.com.br/gfwlist\nserver=/pstatic.net/127.0.0.1#5335\nipset=/pstatic.net/gfwlist\nserver=/famosascalvas.com/127.0.0.1#5335\nipset=/famosascalvas.com/gfwlist\nserver=/maxis.com/127.0.0.1#5335\nipset=/maxis.com/gfwlist\nserver=/ywoos.com/127.0.0.1#5335\nipset=/ywoos.com/gfwlist\nserver=/springernature.com/127.0.0.1#5335\nipset=/springernature.com/gfwlist\nserver=/grafolio.com/127.0.0.1#5335\nipset=/grafolio.com/gfwlist\nserver=/mxmcdn.net/127.0.0.1#5335\nipset=/mxmcdn.net/gfwlist\nserver=/musixmatch.com/127.0.0.1#5335\nipset=/musixmatch.com/gfwlist\nserver=/cafr.ca/127.0.0.1#5335\nipset=/cafr.ca/gfwlist\nserver=/paypalinsuranceservices.org/127.0.0.1#5335\nipset=/paypalinsuranceservices.org/gfwlist\nserver=/poofetish.com/127.0.0.1#5335\nipset=/poofetish.com/gfwlist\nserver=/mozilla.org/127.0.0.1#5335\nipset=/mozilla.org/gfwlist\nserver=/mozilla.net/127.0.0.1#5335\nipset=/mozilla.net/gfwlist\nserver=/crocotube.com/127.0.0.1#5335\nipset=/crocotube.com/gfwlist\nserver=/nordstrommedia.com/127.0.0.1#5335\nipset=/nordstrommedia.com/gfwlist\nserver=/illusion111.com/127.0.0.1#5335\nipset=/illusion111.com/gfwlist\nserver=/mozilla.com/127.0.0.1#5335\nipset=/mozilla.com/gfwlist\nserver=/developer.mozilla.org/127.0.0.1#5335\nipset=/developer.mozilla.org/gfwlist\nserver=/quoracdn.net/127.0.0.1#5335\nipset=/quoracdn.net/gfwlist\nserver=/indiansexstories2.net/127.0.0.1#5335\nipset=/indiansexstories2.net/gfwlist\nserver=/yahoo.com.ec/127.0.0.1#5335\nipset=/yahoo.com.ec/gfwlist\nserver=/beatsoutletanytime.com/127.0.0.1#5335\nipset=/beatsoutletanytime.com/gfwlist\nserver=/img-s-msn-com.akamaized.net/127.0.0.1#5335\nipset=/img-s-msn-com.akamaized.net/gfwlist\nserver=/media-imdb.com/127.0.0.1#5335\nipset=/media-imdb.com/gfwlist\nserver=/cityoflove.com/127.0.0.1#5335\nipset=/cityoflove.com/gfwlist\nserver=/intelinsight.com/127.0.0.1#5335\nipset=/intelinsight.com/gfwlist\nserver=/thinkquarterly.co.uk/127.0.0.1#5335\nipset=/thinkquarterly.co.uk/gfwlist\nserver=/winhec.net/127.0.0.1#5335\nipset=/winhec.net/gfwlist\nserver=/jadult.net/127.0.0.1#5335\nipset=/jadult.net/gfwlist\nserver=/jerkmatelive.org/127.0.0.1#5335\nipset=/jerkmatelive.org/gfwlist\nserver=/windowssearch.com/127.0.0.1#5335\nipset=/windowssearch.com/gfwlist\nserver=/windows.nl/127.0.0.1#5335\nipset=/windows.nl/gfwlist\nserver=/alphabet.lt/127.0.0.1#5335\nipset=/alphabet.lt/gfwlist\nserver=/windows.com/127.0.0.1#5335\nipset=/windows.com/gfwlist\nserver=/windows-int.net/127.0.0.1#5335\nipset=/windows-int.net/gfwlist\nserver=/paypal-mainstreet.net/127.0.0.1#5335\nipset=/paypal-mainstreet.net/gfwlist\nserver=/wbd.ms/127.0.0.1#5335\nipset=/wbd.ms/gfwlist\nserver=/facebooksafety.com/127.0.0.1#5335\nipset=/facebooksafety.com/gfwlist\nserver=/hsxhr.cc/127.0.0.1#5335\nipset=/hsxhr.cc/gfwlist\nserver=/vsallin.net/127.0.0.1#5335\nipset=/vsallin.net/gfwlist\nserver=/userpxt.io/127.0.0.1#5335\nipset=/userpxt.io/gfwlist\nserver=/google.az/127.0.0.1#5335\nipset=/google.az/gfwlist\nserver=/tfsallin.net/127.0.0.1#5335\nipset=/tfsallin.net/gfwlist\nserver=/cruel-furies.com/127.0.0.1#5335\nipset=/cruel-furies.com/gfwlist\nserver=/facebookshop.com/127.0.0.1#5335\nipset=/facebookshop.com/gfwlist\nserver=/castingcouch-x.com/127.0.0.1#5335\nipset=/castingcouch-x.com/gfwlist\nserver=/ipostnaked.com/127.0.0.1#5335\nipset=/ipostnaked.com/gfwlist\nserver=/motorshowblog.com/127.0.0.1#5335\nipset=/motorshowblog.com/gfwlist\nserver=/headphoneshotsales.com/127.0.0.1#5335\nipset=/headphoneshotsales.com/gfwlist\nserver=/perfectjizz.com/127.0.0.1#5335\nipset=/perfectjizz.com/gfwlist\nserver=/geceguby.ru/127.0.0.1#5335\nipset=/geceguby.ru/gfwlist\nserver=/staffhub.ms/127.0.0.1#5335\nipset=/staffhub.ms/gfwlist\nserver=/skypeassets.com/127.0.0.1#5335\nipset=/skypeassets.com/gfwlist\nserver=/skype.net/127.0.0.1#5335\nipset=/skype.net/gfwlist\nserver=/sharepointonline.com/127.0.0.1#5335\nipset=/sharepointonline.com/gfwlist\nserver=/rou.video/127.0.0.1#5335\nipset=/rou.video/gfwlist\nserver=/mini.mq/127.0.0.1#5335\nipset=/mini.mq/gfwlist\nserver=/girlscanner.cc/127.0.0.1#5335\nipset=/girlscanner.cc/gfwlist\nserver=/alt2-mtalk.google.com/127.0.0.1#5335\nipset=/alt2-mtalk.google.com/gfwlist\nserver=/viacom.com/127.0.0.1#5335\nipset=/viacom.com/gfwlist\nserver=/sfbassets.net/127.0.0.1#5335\nipset=/sfbassets.net/gfwlist\nserver=/pinterest.com.ec/127.0.0.1#5335\nipset=/pinterest.com.ec/gfwlist\nserver=/eyny.com/127.0.0.1#5335\nipset=/eyny.com/gfwlist\nserver=/sfbassets.com/127.0.0.1#5335\nipset=/sfbassets.com/gfwlist\nserver=/s-microsoft.com/127.0.0.1#5335\nipset=/s-microsoft.com/gfwlist\nserver=/akamaietpcnctest.com/127.0.0.1#5335\nipset=/akamaietpcnctest.com/gfwlist\nserver=/beatsbydreonlines-uk.com/127.0.0.1#5335\nipset=/beatsbydreonlines-uk.com/gfwlist\nserver=/pearson-schule.ch/127.0.0.1#5335\nipset=/pearson-schule.ch/gfwlist\nserver=/projectsangam.com/127.0.0.1#5335\nipset=/projectsangam.com/gfwlist\nserver=/pixapp.net/127.0.0.1#5335\nipset=/pixapp.net/gfwlist\nserver=/54647.org/127.0.0.1#5335\nipset=/54647.org/gfwlist\nserver=/lowergiseries.com/127.0.0.1#5335\nipset=/lowergiseries.com/gfwlist\nserver=/nikeshoponline.com/127.0.0.1#5335\nipset=/nikeshoponline.com/gfwlist\nserver=/informs.org/127.0.0.1#5335\nipset=/informs.org/gfwlist\nserver=/outingsapp.com/127.0.0.1#5335\nipset=/outingsapp.com/gfwlist\nserver=/tubepatrol.org/127.0.0.1#5335\nipset=/tubepatrol.org/gfwlist\nserver=/opticsforthecloud.net/127.0.0.1#5335\nipset=/opticsforthecloud.net/gfwlist\nserver=/runningnike.com/127.0.0.1#5335\nipset=/runningnike.com/gfwlist\nserver=/bitballoon.com/127.0.0.1#5335\nipset=/bitballoon.com/gfwlist\nserver=/illusionas.com/127.0.0.1#5335\nipset=/illusionas.com/gfwlist\nserver=/pugpig-stage.com/127.0.0.1#5335\nipset=/pugpig-stage.com/gfwlist\nserver=/niosii.net/127.0.0.1#5335\nipset=/niosii.net/gfwlist\nserver=/mymicrosoft.com/127.0.0.1#5335\nipset=/mymicrosoft.com/gfwlist\nserver=/bmwgroupdesignworks.com/127.0.0.1#5335\nipset=/bmwgroupdesignworks.com/gfwlist\nserver=/msudalosti.com/127.0.0.1#5335\nipset=/msudalosti.com/gfwlist\nserver=/msturing.org/127.0.0.1#5335\nipset=/msturing.org/gfwlist\nserver=/adanaatikhaber.com/127.0.0.1#5335\nipset=/adanaatikhaber.com/gfwlist\nserver=/vilavpn3.xyz/127.0.0.1#5335\nipset=/vilavpn3.xyz/gfwlist\nserver=/topporn.me/127.0.0.1#5335\nipset=/topporn.me/gfwlist\nserver=/msft.info/127.0.0.1#5335\nipset=/msft.info/gfwlist\nserver=/geraldoatlarge.com/127.0.0.1#5335\nipset=/geraldoatlarge.com/gfwlist\nserver=/screens-lab.jp/127.0.0.1#5335\nipset=/screens-lab.jp/gfwlist\nserver=/kanzhongguo.eu/127.0.0.1#5335\nipset=/kanzhongguo.eu/gfwlist\nserver=/msedge.net/127.0.0.1#5335\nipset=/msedge.net/gfwlist\nserver=/mschallenge2018.com/127.0.0.1#5335\nipset=/mschallenge2018.com/gfwlist\nserver=/binancezh.info/127.0.0.1#5335\nipset=/binancezh.info/gfwlist\nserver=/ms365surfaceoffer.com/127.0.0.1#5335\nipset=/ms365surfaceoffer.com/gfwlist\nserver=/ms-studiosmedia.com/127.0.0.1#5335\nipset=/ms-studiosmedia.com/gfwlist\nserver=/disneymagicmoments.pl/127.0.0.1#5335\nipset=/disneymagicmoments.pl/gfwlist\nserver=/mpnevolution.com/127.0.0.1#5335\nipset=/mpnevolution.com/gfwlist\nserver=/manoramaonline.com/127.0.0.1#5335\nipset=/manoramaonline.com/gfwlist\nserver=/vepornhd.club/127.0.0.1#5335\nipset=/vepornhd.club/gfwlist\nserver=/morphcharts.com/127.0.0.1#5335\nipset=/morphcharts.com/gfwlist\nserver=/freeviewplus.net.au/127.0.0.1#5335\nipset=/freeviewplus.net.au/gfwlist\nserver=/microsoftstream.com/127.0.0.1#5335\nipset=/microsoftstream.com/gfwlist\nserver=/microsoftsiteselection.com/127.0.0.1#5335\nipset=/microsoftsiteselection.com/gfwlist\nserver=/microsoftready.com/127.0.0.1#5335\nipset=/microsoftready.com/gfwlist\nserver=/telegra.ph/127.0.0.1#5335\nipset=/telegra.ph/gfwlist\nserver=/microsoftpartnercommunity.com/127.0.0.1#5335\nipset=/microsoftpartnercommunity.com/gfwlist\nserver=/microsoftlinc.com/127.0.0.1#5335\nipset=/microsoftlinc.com/gfwlist\nserver=/microsofthouse.net/127.0.0.1#5335\nipset=/microsofthouse.net/gfwlist\nserver=/beatsdanmark2013.com/127.0.0.1#5335\nipset=/beatsdanmark2013.com/gfwlist\nserver=/microsoftcommunitytraining.com/127.0.0.1#5335\nipset=/microsoftcommunitytraining.com/gfwlist\nserver=/microsoftcloudworkshop.com/127.0.0.1#5335\nipset=/microsoftcloudworkshop.com/gfwlist\nserver=/theporndude.vip/127.0.0.1#5335\nipset=/theporndude.vip/gfwlist\nserver=/megacamz.com/127.0.0.1#5335\nipset=/megacamz.com/gfwlist\nserver=/microsoftadvertisingregionalawards.com/127.0.0.1#5335\nipset=/microsoftadvertisingregionalawards.com/gfwlist\nserver=/microsoft-sbs-domains.com/127.0.0.1#5335\nipset=/microsoft-sbs-domains.com/gfwlist\nserver=/easportsfootball.com/127.0.0.1#5335\nipset=/easportsfootball.com/gfwlist\nserver=/microsoft-int.com/127.0.0.1#5335\nipset=/microsoft-int.com/gfwlist\nserver=/live.net/127.0.0.1#5335\nipset=/live.net/gfwlist\nserver=/live.com/127.0.0.1#5335\nipset=/live.com/gfwlist\nserver=/ameba.jp/127.0.0.1#5335\nipset=/ameba.jp/gfwlist\nserver=/anthemgame.com/127.0.0.1#5335\nipset=/anthemgame.com/gfwlist\nserver=/celeron.net/127.0.0.1#5335\nipset=/celeron.net/gfwlist\nserver=/figma.com/127.0.0.1#5335\nipset=/figma.com/gfwlist\nserver=/applecomputers.co.nz/127.0.0.1#5335\nipset=/applecomputers.co.nz/gfwlist\nserver=/rink.hockeyapp.net/127.0.0.1#5335\nipset=/rink.hockeyapp.net/gfwlist\nserver=/aka-ai.net/127.0.0.1#5335\nipset=/aka-ai.net/gfwlist\nserver=/18comic.cc/127.0.0.1#5335\nipset=/18comic.cc/gfwlist\nserver=/lgbtq.games/127.0.0.1#5335\nipset=/lgbtq.games/gfwlist\nserver=/hamivideo.hinet.net/127.0.0.1#5335\nipset=/hamivideo.hinet.net/gfwlist\nserver=/entrustdatacard.com/127.0.0.1#5335\nipset=/entrustdatacard.com/gfwlist\nserver=/fundfire.com/127.0.0.1#5335\nipset=/fundfire.com/gfwlist\nserver=/beats-headphones-buy-cheap.com/127.0.0.1#5335\nipset=/beats-headphones-buy-cheap.com/gfwlist\nserver=/nintendo.nl/127.0.0.1#5335\nipset=/nintendo.nl/gfwlist\nserver=/nubiles.net/127.0.0.1#5335\nipset=/nubiles.net/gfwlist\nserver=/tik-tokapi.com/127.0.0.1#5335\nipset=/tik-tokapi.com/gfwlist\nserver=/tvmost.com.hk/127.0.0.1#5335\nipset=/tvmost.com.hk/gfwlist\nserver=/facebookadvertisingsecrets.com/127.0.0.1#5335\nipset=/facebookadvertisingsecrets.com/gfwlist\nserver=/bmw-vancouver.ca/127.0.0.1#5335\nipset=/bmw-vancouver.ca/gfwlist\nserver=/ieeeusa.org/127.0.0.1#5335\nipset=/ieeeusa.org/gfwlist\nserver=/lspimg.com/127.0.0.1#5335\nipset=/lspimg.com/gfwlist\nserver=/hoodamateurs.com/127.0.0.1#5335\nipset=/hoodamateurs.com/gfwlist\nserver=/huffpostmaghreb.com/127.0.0.1#5335\nipset=/huffpostmaghreb.com/gfwlist\nserver=/ingads.com/127.0.0.1#5335\nipset=/ingads.com/gfwlist\nserver=/imaginecup.pl/127.0.0.1#5335\nipset=/imaginecup.pl/gfwlist\nserver=/32bm.cc/127.0.0.1#5335\nipset=/32bm.cc/gfwlist\nserver=/internetexplorer.com/127.0.0.1#5335\nipset=/internetexplorer.com/gfwlist\nserver=/xb18.me/127.0.0.1#5335\nipset=/xb18.me/gfwlist\nserver=/beatsbydresolohdonline-canada.com/127.0.0.1#5335\nipset=/beatsbydresolohdonline-canada.com/gfwlist\nserver=/touchid.tv/127.0.0.1#5335\nipset=/touchid.tv/gfwlist\nserver=/intelserveredge.com/127.0.0.1#5335\nipset=/intelserveredge.com/gfwlist\nserver=/scholar.google.cat/127.0.0.1#5335\nipset=/scholar.google.cat/gfwlist\nserver=/cambridgemaths.org/127.0.0.1#5335\nipset=/cambridgemaths.org/gfwlist\nserver=/beatsbydrdre4sale.com/127.0.0.1#5335\nipset=/beatsbydrdre4sale.com/gfwlist\nserver=/drebeatsoldes.com/127.0.0.1#5335\nipset=/drebeatsoldes.com/gfwlist\nserver=/onahodouga.com/127.0.0.1#5335\nipset=/onahodouga.com/gfwlist\nserver=/bmw.com.gt/127.0.0.1#5335\nipset=/bmw.com.gt/gfwlist\nserver=/hotmail.org/127.0.0.1#5335\nipset=/hotmail.org/gfwlist\nserver=/tvappstore.net/127.0.0.1#5335\nipset=/tvappstore.net/gfwlist\nserver=/hotmail.eu/127.0.0.1#5335\nipset=/hotmail.eu/gfwlist\nserver=/foxcredit.com/127.0.0.1#5335\nipset=/foxcredit.com/gfwlist\nserver=/adulttoontube.com/127.0.0.1#5335\nipset=/adulttoontube.com/gfwlist\nserver=/smutstone.com/127.0.0.1#5335\nipset=/smutstone.com/gfwlist\nserver=/hololens.com/127.0.0.1#5335\nipset=/hololens.com/gfwlist\nserver=/lepornofrais.com/127.0.0.1#5335\nipset=/lepornofrais.com/gfwlist\nserver=/gigjam.com/127.0.0.1#5335\nipset=/gigjam.com/gfwlist\nserver=/jpavcom.com/127.0.0.1#5335\nipset=/jpavcom.com/gfwlist\nserver=/9to5toys.com/127.0.0.1#5335\nipset=/9to5toys.com/gfwlist\nserver=/gearstactics.com/127.0.0.1#5335\nipset=/gearstactics.com/gfwlist\nserver=/washingtonpost.com/127.0.0.1#5335\nipset=/washingtonpost.com/gfwlist\nserver=/management-azure-devices-int.net/127.0.0.1#5335\nipset=/management-azure-devices-int.net/gfwlist\nserver=/applehongkong.com/127.0.0.1#5335\nipset=/applehongkong.com/gfwlist\nserver=/gears5.com/127.0.0.1#5335\nipset=/gears5.com/gfwlist\nserver=/foxsports.co.ve/127.0.0.1#5335\nipset=/foxsports.co.ve/gfwlist\nserver=/gettyimages.ae/127.0.0.1#5335\nipset=/gettyimages.ae/gfwlist\nserver=/magento.net/127.0.0.1#5335\nipset=/magento.net/gfwlist\nserver=/ulifestyle.com.hk/127.0.0.1#5335\nipset=/ulifestyle.com.hk/gfwlist\nserver=/alphabet.at/127.0.0.1#5335\nipset=/alphabet.at/gfwlist\nserver=/origin.tv/127.0.0.1#5335\nipset=/origin.tv/gfwlist\nserver=/bmw-connecteddrive.com/127.0.0.1#5335\nipset=/bmw-connecteddrive.com/gfwlist\nserver=/efproject.net/127.0.0.1#5335\nipset=/efproject.net/gfwlist\nserver=/dat.foundation/127.0.0.1#5335\nipset=/dat.foundation/gfwlist\nserver=/ebayauction.com/127.0.0.1#5335\nipset=/ebayauction.com/gfwlist\nserver=/bookshome.info/127.0.0.1#5335\nipset=/bookshome.info/gfwlist\nserver=/am730.com.hk/127.0.0.1#5335\nipset=/am730.com.hk/gfwlist\nserver=/beats4outlets.com/127.0.0.1#5335\nipset=/beats4outlets.com/gfwlist\nserver=/disney.ch/127.0.0.1#5335\nipset=/disney.ch/gfwlist\nserver=/jav01.cc/127.0.0.1#5335\nipset=/jav01.cc/gfwlist\nserver=/bmw-rrdays.com/127.0.0.1#5335\nipset=/bmw-rrdays.com/gfwlist\nserver=/mini.fr/127.0.0.1#5335\nipset=/mini.fr/gfwlist\nserver=/crmdynint.com/127.0.0.1#5335\nipset=/crmdynint.com/gfwlist\nserver=/ciscoresearch.com/127.0.0.1#5335\nipset=/ciscoresearch.com/gfwlist\nserver=/hentai-moon.com/127.0.0.1#5335\nipset=/hentai-moon.com/gfwlist\nserver=/crmdynint-gcc.com/127.0.0.1#5335\nipset=/crmdynint-gcc.com/gfwlist\nserver=/entermediadb.net/127.0.0.1#5335\nipset=/entermediadb.net/gfwlist\nserver=/gu-web.net/127.0.0.1#5335\nipset=/gu-web.net/gfwlist\nserver=/4u4c.com/127.0.0.1#5335\nipset=/4u4c.com/gfwlist\nserver=/paypalindia.com/127.0.0.1#5335\nipset=/paypalindia.com/gfwlist\nserver=/coreml.net/127.0.0.1#5335\nipset=/coreml.net/gfwlist\nserver=/cloudappsecurity.com/127.0.0.1#5335\nipset=/cloudappsecurity.com/gfwlist\nserver=/amateurwifefuck.com/127.0.0.1#5335\nipset=/amateurwifefuck.com/gfwlist\nserver=/cloudapp.net/127.0.0.1#5335\nipset=/cloudapp.net/gfwlist\nserver=/youtube.vn/127.0.0.1#5335\nipset=/youtube.vn/gfwlist\nserver=/lubetube.com/127.0.0.1#5335\nipset=/lubetube.com/gfwlist\nserver=/applecom.com/127.0.0.1#5335\nipset=/applecom.com/gfwlist\nserver=/now-tv.com/127.0.0.1#5335\nipset=/now-tv.com/gfwlist\nserver=/coinglass.com/127.0.0.1#5335\nipset=/coinglass.com/gfwlist\nserver=/youtube.cz/127.0.0.1#5335\nipset=/youtube.cz/gfwlist\nserver=/mini.ua/127.0.0.1#5335\nipset=/mini.ua/gfwlist\nserver=/bmw.com.tw/127.0.0.1#5335\nipset=/bmw.com.tw/gfwlist\nserver=/applestore.com.au/127.0.0.1#5335\nipset=/applestore.com.au/gfwlist\nserver=/mini.ca/127.0.0.1#5335\nipset=/mini.ca/gfwlist\nserver=/centralvalidation.com/127.0.0.1#5335\nipset=/centralvalidation.com/gfwlist\nserver=/bmwgroup.net/127.0.0.1#5335\nipset=/bmwgroup.net/gfwlist\nserver=/thesims4.com/127.0.0.1#5335\nipset=/thesims4.com/gfwlist\nserver=/brazilpartneruniversity.com/127.0.0.1#5335\nipset=/brazilpartneruniversity.com/gfwlist\nserver=/heroku.com/127.0.0.1#5335\nipset=/heroku.com/gfwlist\nserver=/osakamotion.net/127.0.0.1#5335\nipset=/osakamotion.net/gfwlist\nserver=/collector.xhamster.com/127.0.0.1#5335\nipset=/collector.xhamster.com/gfwlist\nserver=/asp.net/127.0.0.1#5335\nipset=/asp.net/gfwlist\nserver=/princeton.edu/127.0.0.1#5335\nipset=/princeton.edu/gfwlist\nserver=/gdsrx888.com/127.0.0.1#5335\nipset=/gdsrx888.com/gfwlist\nserver=/barelist.com/127.0.0.1#5335\nipset=/barelist.com/gfwlist\nserver=/battlelog.com/127.0.0.1#5335\nipset=/battlelog.com/gfwlist\nserver=/applicationinsights.net/127.0.0.1#5335\nipset=/applicationinsights.net/gfwlist\nserver=/camfinder.com/127.0.0.1#5335\nipset=/camfinder.com/gfwlist\nserver=/ebay.at/127.0.0.1#5335\nipset=/ebay.at/gfwlist\nserver=/musicbay.net/127.0.0.1#5335\nipset=/musicbay.net/gfwlist\nserver=/blogspot.com.ar/127.0.0.1#5335\nipset=/blogspot.com.ar/gfwlist\nserver=/aka.ms/127.0.0.1#5335\nipset=/aka.ms/gfwlist\nserver=/m12.vc/127.0.0.1#5335\nipset=/m12.vc/gfwlist\nserver=/teensnow.link/127.0.0.1#5335\nipset=/teensnow.link/gfwlist\nserver=/faceboop.com/127.0.0.1#5335\nipset=/faceboop.com/gfwlist\nserver=/playshow.io/127.0.0.1#5335\nipset=/playshow.io/gfwlist\nserver=/adobetarget.com/127.0.0.1#5335\nipset=/adobetarget.com/gfwlist\nserver=/wwtbam.com/127.0.0.1#5335\nipset=/wwtbam.com/gfwlist\nserver=/91sesex.xyz/127.0.0.1#5335\nipset=/91sesex.xyz/gfwlist\nserver=/webcammedellin.co/127.0.0.1#5335\nipset=/webcammedellin.co/gfwlist\nserver=/paypall.com/127.0.0.1#5335\nipset=/paypall.com/gfwlist\nserver=/steam.eca.qtlglb.com/127.0.0.1#5335\nipset=/steam.eca.qtlglb.com/gfwlist\nserver=/mini.cc/127.0.0.1#5335\nipset=/mini.cc/gfwlist\nserver=/qualcommventures.com/127.0.0.1#5335\nipset=/qualcommventures.com/gfwlist\nserver=/hdsexxx.net/127.0.0.1#5335\nipset=/hdsexxx.net/gfwlist\nserver=/egotastic.com/127.0.0.1#5335\nipset=/egotastic.com/gfwlist\nserver=/xn--hckl3e1e8a8ajin0czf.net/127.0.0.1#5335\nipset=/xn--hckl3e1e8a8ajin0czf.net/gfwlist\nserver=/nike.ci/127.0.0.1#5335\nipset=/nike.ci/gfwlist\nserver=/naughtyhentai.biz/127.0.0.1#5335\nipset=/naughtyhentai.biz/gfwlist\nserver=/microsoft.si/127.0.0.1#5335\nipset=/microsoft.si/gfwlist\nserver=/convrgencegame.com/127.0.0.1#5335\nipset=/convrgencegame.com/gfwlist\nserver=/yourpelvicultrasound.com/127.0.0.1#5335\nipset=/yourpelvicultrasound.com/gfwlist\nserver=/goodporno.cc/127.0.0.1#5335\nipset=/goodporno.cc/gfwlist\nserver=/microsoft.red/127.0.0.1#5335\nipset=/microsoft.red/gfwlist\nserver=/curbed.com/127.0.0.1#5335\nipset=/curbed.com/gfwlist\nserver=/shemaleleaks.com/127.0.0.1#5335\nipset=/shemaleleaks.com/gfwlist\nserver=/googlearth.com/127.0.0.1#5335\nipset=/googlearth.com/gfwlist\nserver=/urduvoa.com/127.0.0.1#5335\nipset=/urduvoa.com/gfwlist\nserver=/mastercardcenterforinclusivegrowth.org/127.0.0.1#5335\nipset=/mastercardcenterforinclusivegrowth.org/gfwlist\nserver=/minipetfriendly.com/127.0.0.1#5335\nipset=/minipetfriendly.com/gfwlist\nserver=/youtube.pl/127.0.0.1#5335\nipset=/youtube.pl/gfwlist\nserver=/microsoft.net/127.0.0.1#5335\nipset=/microsoft.net/gfwlist\nserver=/relateiq.com/127.0.0.1#5335\nipset=/relateiq.com/gfwlist\nserver=/amateurest.com/127.0.0.1#5335\nipset=/amateurest.com/gfwlist\nserver=/paypal-specialoffers.com/127.0.0.1#5335\nipset=/paypal-specialoffers.com/gfwlist\nserver=/sandisk.es/127.0.0.1#5335\nipset=/sandisk.es/gfwlist\nserver=/cloudlock.com/127.0.0.1#5335\nipset=/cloudlock.com/gfwlist\nserver=/nudewifeporn.com/127.0.0.1#5335\nipset=/nudewifeporn.com/gfwlist\nserver=/microsoft.lt/127.0.0.1#5335\nipset=/microsoft.lt/gfwlist\nserver=/microsoft.jp/127.0.0.1#5335\nipset=/microsoft.jp/gfwlist\nserver=/fdiintelligence.com/127.0.0.1#5335\nipset=/fdiintelligence.com/gfwlist\nserver=/w3.org/127.0.0.1#5335\nipset=/w3.org/gfwlist\nserver=/javlibrary.com/127.0.0.1#5335\nipset=/javlibrary.com/gfwlist\nserver=/safechat.com/127.0.0.1#5335\nipset=/safechat.com/gfwlist\nserver=/beatsbydre-store.com/127.0.0.1#5335\nipset=/beatsbydre-store.com/gfwlist\nserver=/avbebe.com/127.0.0.1#5335\nipset=/avbebe.com/gfwlist\nserver=/autodraw.com/127.0.0.1#5335\nipset=/autodraw.com/gfwlist\nserver=/microsoft.io/127.0.0.1#5335\nipset=/microsoft.io/gfwlist\nserver=/paypal-galactic.com/127.0.0.1#5335\nipset=/paypal-galactic.com/gfwlist\nserver=/scholar.google.se/127.0.0.1#5335\nipset=/scholar.google.se/gfwlist\nserver=/vaginal-ultrasound.com/127.0.0.1#5335\nipset=/vaginal-ultrasound.com/gfwlist\nserver=/mac.com.au/127.0.0.1#5335\nipset=/mac.com.au/gfwlist\nserver=/momsboysmovies.net/127.0.0.1#5335\nipset=/momsboysmovies.net/gfwlist\nserver=/microsoft.eu/127.0.0.1#5335\nipset=/microsoft.eu/gfwlist\nserver=/microsoft.es/127.0.0.1#5335\nipset=/microsoft.es/gfwlist\nserver=/google.bg/127.0.0.1#5335\nipset=/google.bg/gfwlist\nserver=/voatour.com/127.0.0.1#5335\nipset=/voatour.com/gfwlist\nserver=/disneymovieinsiders.com/127.0.0.1#5335\nipset=/disneymovieinsiders.com/gfwlist\nserver=/pypl.net/127.0.0.1#5335\nipset=/pypl.net/gfwlist\nserver=/swisssign.ch/127.0.0.1#5335\nipset=/swisssign.ch/gfwlist\nserver=/fbthirdpartypixel.net/127.0.0.1#5335\nipset=/fbthirdpartypixel.net/gfwlist\nserver=/pieceofplastic.com/127.0.0.1#5335\nipset=/pieceofplastic.com/gfwlist\nserver=/heaven-burns-red.com/127.0.0.1#5335\nipset=/heaven-burns-red.com/gfwlist\nserver=/visa.pl/127.0.0.1#5335\nipset=/visa.pl/gfwlist\nserver=/fantasticyoungporn.com/127.0.0.1#5335\nipset=/fantasticyoungporn.com/gfwlist\nserver=/rocksdb.net/127.0.0.1#5335\nipset=/rocksdb.net/gfwlist\nserver=/sony.com/127.0.0.1#5335\nipset=/sony.com/gfwlist\nserver=/b-ok.africa/127.0.0.1#5335\nipset=/b-ok.africa/gfwlist\nserver=/nikeincchemistry.com/127.0.0.1#5335\nipset=/nikeincchemistry.com/gfwlist\nserver=/pornpair.com/127.0.0.1#5335\nipset=/pornpair.com/gfwlist\nserver=/half.com/127.0.0.1#5335\nipset=/half.com/gfwlist\nserver=/telegram.me/127.0.0.1#5335\nipset=/telegram.me/gfwlist\nserver=/mastercard.by/127.0.0.1#5335\nipset=/mastercard.by/gfwlist\nserver=/xxxclub.club/127.0.0.1#5335\nipset=/xxxclub.club/gfwlist\nserver=/pornhat.tv/127.0.0.1#5335\nipset=/pornhat.tv/gfwlist\nserver=/microsoft.ch/127.0.0.1#5335\nipset=/microsoft.ch/gfwlist\nserver=/virtualrealgay.com/127.0.0.1#5335\nipset=/virtualrealgay.com/gfwlist\nserver=/cbsnews.com/127.0.0.1#5335\nipset=/cbsnews.com/gfwlist\nserver=/metamind.io/127.0.0.1#5335\nipset=/metamind.io/gfwlist\nserver=/google.pn/127.0.0.1#5335\nipset=/google.pn/gfwlist\nserver=/greginhollywood.com/127.0.0.1#5335\nipset=/greginhollywood.com/gfwlist\nserver=/foxsportsgo.com/127.0.0.1#5335\nipset=/foxsportsgo.com/gfwlist\nserver=/youtube.com.co/127.0.0.1#5335\nipset=/youtube.com.co/gfwlist\nserver=/discountporn.club/127.0.0.1#5335\nipset=/discountporn.club/gfwlist\nserver=/areyoucreditwise.com/127.0.0.1#5335\nipset=/areyoucreditwise.com/gfwlist\nserver=/enemabasics.com/127.0.0.1#5335\nipset=/enemabasics.com/gfwlist\nserver=/amateuroldsluts.com/127.0.0.1#5335\nipset=/amateuroldsluts.com/gfwlist\nserver=/walmart.com/127.0.0.1#5335\nipset=/walmart.com/gfwlist\nserver=/analpornhouse.com/127.0.0.1#5335\nipset=/analpornhouse.com/gfwlist\nserver=/nikekd.com/127.0.0.1#5335\nipset=/nikekd.com/gfwlist\nserver=/9to5mac.com/127.0.0.1#5335\nipset=/9to5mac.com/gfwlist\nserver=/bubbaporn.com/127.0.0.1#5335\nipset=/bubbaporn.com/gfwlist\nserver=/udemy.com/127.0.0.1#5335\nipset=/udemy.com/gfwlist\nserver=/ozodi.org/127.0.0.1#5335\nipset=/ozodi.org/gfwlist\nserver=/faronicslabs.com/127.0.0.1#5335\nipset=/faronicslabs.com/gfwlist\nserver=/playerjs.io/127.0.0.1#5335\nipset=/playerjs.io/gfwlist\nserver=/sprinklesapp.com/127.0.0.1#5335\nipset=/sprinklesapp.com/gfwlist\nserver=/microsoft.az/127.0.0.1#5335\nipset=/microsoft.az/gfwlist\nserver=/canon.de/127.0.0.1#5335\nipset=/canon.de/gfwlist\nserver=/naoconto.com/127.0.0.1#5335\nipset=/naoconto.com/gfwlist\nserver=/onedrive.org/127.0.0.1#5335\nipset=/onedrive.org/gfwlist\nserver=/pvp.net/127.0.0.1#5335\nipset=/pvp.net/gfwlist\nserver=/onedrive.net/127.0.0.1#5335\nipset=/onedrive.net/gfwlist\nserver=/onedrive.eu/127.0.0.1#5335\nipset=/onedrive.eu/gfwlist\nserver=/packagist.org/127.0.0.1#5335\nipset=/packagist.org/gfwlist\nserver=/onedrive.com/127.0.0.1#5335\nipset=/onedrive.com/gfwlist\nserver=/livefilestore.com/127.0.0.1#5335\nipset=/livefilestore.com/gfwlist\nserver=/zoophilist.net/127.0.0.1#5335\nipset=/zoophilist.net/gfwlist\nserver=/ebaymotors.ca/127.0.0.1#5335\nipset=/ebaymotors.ca/gfwlist\nserver=/msnkids.com/127.0.0.1#5335\nipset=/msnkids.com/gfwlist\nserver=/yahoo.az/127.0.0.1#5335\nipset=/yahoo.az/gfwlist\nserver=/scholar.google.com.sg/127.0.0.1#5335\nipset=/scholar.google.com.sg/gfwlist\nserver=/xnxx.com/127.0.0.1#5335\nipset=/xnxx.com/gfwlist\nserver=/msnewskids.org/127.0.0.1#5335\nipset=/msnewskids.org/gfwlist\nserver=/fecbook.com/127.0.0.1#5335\nipset=/fecbook.com/gfwlist\nserver=/embl-hamburg.de/127.0.0.1#5335\nipset=/embl-hamburg.de/gfwlist\nserver=/msnewskids.net/127.0.0.1#5335\nipset=/msnewskids.net/gfwlist\nserver=/msnewskids.com/127.0.0.1#5335\nipset=/msnewskids.com/gfwlist\nserver=/enjoyfuck.com/127.0.0.1#5335\nipset=/enjoyfuck.com/gfwlist\nserver=/bs-awh.ne.jp/127.0.0.1#5335\nipset=/bs-awh.ne.jp/gfwlist\nserver=/clannad-movie.jp/127.0.0.1#5335\nipset=/clannad-movie.jp/gfwlist\nserver=/microsoftnewskids.org/127.0.0.1#5335\nipset=/microsoftnewskids.org/gfwlist\nserver=/microsoftnewskids.net/127.0.0.1#5335\nipset=/microsoftnewskids.net/gfwlist\nserver=/kimogirl.cc/127.0.0.1#5335\nipset=/kimogirl.cc/gfwlist\nserver=/microsoftnewsforkids.org/127.0.0.1#5335\nipset=/microsoftnewsforkids.org/gfwlist\nserver=/swiftfinancial.info/127.0.0.1#5335\nipset=/swiftfinancial.info/gfwlist\nserver=/svaboda.org/127.0.0.1#5335\nipset=/svaboda.org/gfwlist\nserver=/facbebook.com/127.0.0.1#5335\nipset=/facbebook.com/gfwlist\nserver=/foxdeportes.net/127.0.0.1#5335\nipset=/foxdeportes.net/gfwlist\nserver=/ahorsecock.com/127.0.0.1#5335\nipset=/ahorsecock.com/gfwlist\nserver=/foxnation.com/127.0.0.1#5335\nipset=/foxnation.com/gfwlist\nserver=/wiseid.com/127.0.0.1#5335\nipset=/wiseid.com/gfwlist\nserver=/microsoftnewsforkids.com/127.0.0.1#5335\nipset=/microsoftnewsforkids.com/gfwlist\nserver=/microsoftnews.net/127.0.0.1#5335\nipset=/microsoftnews.net/gfwlist\nserver=/renovacionoffice.com/127.0.0.1#5335\nipset=/renovacionoffice.com/gfwlist\nserver=/sstatic.net/127.0.0.1#5335\nipset=/sstatic.net/gfwlist\nserver=/microsoftmxfilantropia.com/127.0.0.1#5335\nipset=/microsoftmxfilantropia.com/gfwlist\nserver=/monsterbeatsbydrdre-nz.com/127.0.0.1#5335\nipset=/monsterbeatsbydrdre-nz.com/gfwlist\nserver=/amabitch.com/127.0.0.1#5335\nipset=/amabitch.com/gfwlist\nserver=/zeit-world.org/127.0.0.1#5335\nipset=/zeit-world.org/gfwlist\nserver=/amateurpages.com/127.0.0.1#5335\nipset=/amateurpages.com/gfwlist\nserver=/cilk.net/127.0.0.1#5335\nipset=/cilk.net/gfwlist\nserver=/cheapbeatsaustraliasale.com/127.0.0.1#5335\nipset=/cheapbeatsaustraliasale.com/gfwlist\nserver=/airwick.it/127.0.0.1#5335\nipset=/airwick.it/gfwlist\nserver=/masalladeloslimites.com/127.0.0.1#5335\nipset=/masalladeloslimites.com/gfwlist\nserver=/afriboyz.com/127.0.0.1#5335\nipset=/afriboyz.com/gfwlist\nserver=/voanoticias.com/127.0.0.1#5335\nipset=/voanoticias.com/gfwlist\nserver=/guambmw.com/127.0.0.1#5335\nipset=/guambmw.com/gfwlist\nserver=/flipwithsurface.com/127.0.0.1#5335\nipset=/flipwithsurface.com/gfwlist\nserver=/dictate.ms/127.0.0.1#5335\nipset=/dictate.ms/gfwlist\nserver=/wellfuckedwife.com/127.0.0.1#5335\nipset=/wellfuckedwife.com/gfwlist\nserver=/subscene.com/127.0.0.1#5335\nipset=/subscene.com/gfwlist\nserver=/hentaix.me/127.0.0.1#5335\nipset=/hentaix.me/gfwlist\nserver=/kkbox.com/127.0.0.1#5335\nipset=/kkbox.com/gfwlist\nserver=/ads.pubmatic.com/127.0.0.1#5335\nipset=/ads.pubmatic.com/gfwlist\nserver=/exgirlfriendmarket.com/127.0.0.1#5335\nipset=/exgirlfriendmarket.com/gfwlist\nserver=/lepornochaud.com/127.0.0.1#5335\nipset=/lepornochaud.com/gfwlist\nserver=/bisyoujyogyaruge.topaz.ne.jp/127.0.0.1#5335\nipset=/bisyoujyogyaruge.topaz.ne.jp/gfwlist\nserver=/adobesign.com/127.0.0.1#5335\nipset=/adobesign.com/gfwlist\nserver=/minihalifax.ca/127.0.0.1#5335\nipset=/minihalifax.ca/gfwlist\nserver=/dailybasis.com/127.0.0.1#5335\nipset=/dailybasis.com/gfwlist\nserver=/harpercollins.co.uk/127.0.0.1#5335\nipset=/harpercollins.co.uk/gfwlist\nserver=/bing.net/127.0.0.1#5335\nipset=/bing.net/gfwlist\nserver=/theinstagramhack.com/127.0.0.1#5335\nipset=/theinstagramhack.com/gfwlist\nserver=/azure-dns.org/127.0.0.1#5335\nipset=/azure-dns.org/gfwlist\nserver=/azure-dns.info/127.0.0.1#5335\nipset=/azure-dns.info/gfwlist\nserver=/mocloudplus.com/127.0.0.1#5335\nipset=/mocloudplus.com/gfwlist\nserver=/ebayincconnectedcommerce.net/127.0.0.1#5335\nipset=/ebayincconnectedcommerce.net/gfwlist\nserver=/disney.it/127.0.0.1#5335\nipset=/disney.it/gfwlist\nserver=/steamofporn.com/127.0.0.1#5335\nipset=/steamofporn.com/gfwlist\nserver=/tomatespodres.com/127.0.0.1#5335\nipset=/tomatespodres.com/gfwlist\nserver=/gsuite.com/127.0.0.1#5335\nipset=/gsuite.com/gfwlist\nserver=/windowsazure.com/127.0.0.1#5335\nipset=/windowsazure.com/gfwlist\nserver=/workspaceone.com/127.0.0.1#5335\nipset=/workspaceone.com/gfwlist\nserver=/picacomic.com/127.0.0.1#5335\nipset=/picacomic.com/gfwlist\nserver=/trafficmanager.net/127.0.0.1#5335\nipset=/trafficmanager.net/gfwlist\nserver=/bestpornsites.eu/127.0.0.1#5335\nipset=/bestpornsites.eu/gfwlist\nserver=/awsloft-johannesburg.com/127.0.0.1#5335\nipset=/awsloft-johannesburg.com/gfwlist\nserver=/foxsoccermatchpass.com/127.0.0.1#5335\nipset=/foxsoccermatchpass.com/gfwlist\nserver=/starbucks.co.za/127.0.0.1#5335\nipset=/starbucks.co.za/gfwlist\nserver=/jetbrains.com/127.0.0.1#5335\nipset=/jetbrains.com/gfwlist\nserver=/hotcumporn.com/127.0.0.1#5335\nipset=/hotcumporn.com/gfwlist\nserver=/huffingtonpost.it/127.0.0.1#5335\nipset=/huffingtonpost.it/gfwlist\nserver=/direcpath.com/127.0.0.1#5335\nipset=/direcpath.com/gfwlist\nserver=/gotcosmos.com/127.0.0.1#5335\nipset=/gotcosmos.com/gfwlist\nserver=/devopsms.com/127.0.0.1#5335\nipset=/devopsms.com/gfwlist\nserver=/beats-bydreuk.com/127.0.0.1#5335\nipset=/beats-bydreuk.com/gfwlist\nserver=/pricelesssantiago.com/127.0.0.1#5335\nipset=/pricelesssantiago.com/gfwlist\nserver=/printeron.com/127.0.0.1#5335\nipset=/printeron.com/gfwlist\nserver=/visa.com.ph/127.0.0.1#5335\nipset=/visa.com.ph/gfwlist\nserver=/embed-cdn.com/127.0.0.1#5335\nipset=/embed-cdn.com/gfwlist\nserver=/minidowntown.com/127.0.0.1#5335\nipset=/minidowntown.com/gfwlist\nserver=/azurewebsites.net/127.0.0.1#5335\nipset=/azurewebsites.net/gfwlist\nserver=/ebaypark.com/127.0.0.1#5335\nipset=/ebaypark.com/gfwlist\nserver=/azuresmartspaces.net/127.0.0.1#5335\nipset=/azuresmartspaces.net/gfwlist\nserver=/md.hkgolden.com/127.0.0.1#5335\nipset=/md.hkgolden.com/gfwlist\nserver=/ero-mangalife.com/127.0.0.1#5335\nipset=/ero-mangalife.com/gfwlist\nserver=/newbrazz.com/127.0.0.1#5335\nipset=/newbrazz.com/gfwlist\nserver=/javdb.com/127.0.0.1#5335\nipset=/javdb.com/gfwlist\nserver=/azureserviceprofiler.com/127.0.0.1#5335\nipset=/azureserviceprofiler.com/gfwlist\nserver=/msgamesresearch.com/127.0.0.1#5335\nipset=/msgamesresearch.com/gfwlist\nserver=/youlucky.com/127.0.0.1#5335\nipset=/youlucky.com/gfwlist\nserver=/enemahistory.com/127.0.0.1#5335\nipset=/enemahistory.com/gfwlist\nserver=/lovemarca.com/127.0.0.1#5335\nipset=/lovemarca.com/gfwlist\nserver=/cheapbeatsdrdresolo.com/127.0.0.1#5335\nipset=/cheapbeatsdrdresolo.com/gfwlist\nserver=/anal-pantyhose.com/127.0.0.1#5335\nipset=/anal-pantyhose.com/gfwlist\nserver=/maddenseason.info/127.0.0.1#5335\nipset=/maddenseason.info/gfwlist\nserver=/steampipe-partner.akamaized.net/127.0.0.1#5335\nipset=/steampipe-partner.akamaized.net/gfwlist\nserver=/poisontube.com/127.0.0.1#5335\nipset=/poisontube.com/gfwlist\nserver=/hpstore.corpmerchandise.com/127.0.0.1#5335\nipset=/hpstore.corpmerchandise.com/gfwlist\nserver=/eafootballworld.com/127.0.0.1#5335\nipset=/eafootballworld.com/gfwlist\nserver=/yahoo.com.es/127.0.0.1#5335\nipset=/yahoo.com.es/gfwlist\nserver=/cam69.com/127.0.0.1#5335\nipset=/cam69.com/gfwlist\nserver=/azuredns-prd.info/127.0.0.1#5335\nipset=/azuredns-prd.info/gfwlist\nserver=/largecamtube.com/127.0.0.1#5335\nipset=/largecamtube.com/gfwlist\nserver=/siri.com/127.0.0.1#5335\nipset=/siri.com/gfwlist\nserver=/prd-priconne-redive.akamaized.net/127.0.0.1#5335\nipset=/prd-priconne-redive.akamaized.net/gfwlist\nserver=/azuredigitaltwins.com/127.0.0.1#5335\nipset=/azuredigitaltwins.com/gfwlist\nserver=/openapiplatform.com/127.0.0.1#5335\nipset=/openapiplatform.com/gfwlist\nserver=/azuredigitaltwin.com/127.0.0.1#5335\nipset=/azuredigitaltwin.com/gfwlist\nserver=/get.how/127.0.0.1#5335\nipset=/get.how/gfwlist\nserver=/azuredatabricks.net/127.0.0.1#5335\nipset=/azuredatabricks.net/gfwlist\nserver=/facebkkk.com/127.0.0.1#5335\nipset=/facebkkk.com/gfwlist\nserver=/yahoo.lv/127.0.0.1#5335\nipset=/yahoo.lv/gfwlist\nserver=/playz.jp/127.0.0.1#5335\nipset=/playz.jp/gfwlist\nserver=/veryshortintroductions.com/127.0.0.1#5335\nipset=/veryshortintroductions.com/gfwlist\nserver=/typekit.com/127.0.0.1#5335\nipset=/typekit.com/gfwlist\nserver=/paypal-exchanges.com/127.0.0.1#5335\nipset=/paypal-exchanges.com/gfwlist\nserver=/mini-e.com/127.0.0.1#5335\nipset=/mini-e.com/gfwlist\nserver=/azurecosmosdb.com/127.0.0.1#5335\nipset=/azurecosmosdb.com/gfwlist\nserver=/mobilepornmovies.com/127.0.0.1#5335\nipset=/mobilepornmovies.com/gfwlist\nserver=/azurecosmos.net/127.0.0.1#5335\nipset=/azurecosmos.net/gfwlist\nserver=/azurecontainer.io/127.0.0.1#5335\nipset=/azurecontainer.io/gfwlist\nserver=/stadia.dev/127.0.0.1#5335\nipset=/stadia.dev/gfwlist\nserver=/redkix.com/127.0.0.1#5335\nipset=/redkix.com/gfwlist\nserver=/attwatchtv.com/127.0.0.1#5335\nipset=/attwatchtv.com/gfwlist\nserver=/pearson.com.au/127.0.0.1#5335\nipset=/pearson.com.au/gfwlist\nserver=/brokenteens.com/127.0.0.1#5335\nipset=/brokenteens.com/gfwlist\nserver=/bestbuy.com.mx/127.0.0.1#5335\nipset=/bestbuy.com.mx/gfwlist\nserver=/ebayclassifies.com/127.0.0.1#5335\nipset=/ebayclassifies.com/gfwlist\nserver=/sexycandidgirls.com/127.0.0.1#5335\nipset=/sexycandidgirls.com/gfwlist\nserver=/fullbookmm.blogspot.com/127.0.0.1#5335\nipset=/fullbookmm.blogspot.com/gfwlist\nserver=/aflamsex.net/127.0.0.1#5335\nipset=/aflamsex.net/gfwlist\nserver=/gucci.com/127.0.0.1#5335\nipset=/gucci.com/gfwlist\nserver=/thetype.com/127.0.0.1#5335\nipset=/thetype.com/gfwlist\nserver=/verilystudyhub.com/127.0.0.1#5335\nipset=/verilystudyhub.com/gfwlist\nserver=/2014cheapbeatsbydre.com/127.0.0.1#5335\nipset=/2014cheapbeatsbydre.com/gfwlist\nserver=/azure.com/127.0.0.1#5335\nipset=/azure.com/gfwlist\nserver=/minivilledequebec.ca/127.0.0.1#5335\nipset=/minivilledequebec.ca/gfwlist\nserver=/azure-test.net/127.0.0.1#5335\nipset=/azure-test.net/gfwlist\nserver=/pki.goog/127.0.0.1#5335\nipset=/pki.goog/gfwlist\nserver=/braintreepayments.com/127.0.0.1#5335\nipset=/braintreepayments.com/gfwlist\nserver=/azure-devices-int.net/127.0.0.1#5335\nipset=/azure-devices-int.net/gfwlist\nserver=/translatetheweb.com/127.0.0.1#5335\nipset=/translatetheweb.com/gfwlist\nserver=/londonhotescort.com/127.0.0.1#5335\nipset=/londonhotescort.com/gfwlist\nserver=/oculusvr.com/127.0.0.1#5335\nipset=/oculusvr.com/gfwlist\nserver=/inaporn.com/127.0.0.1#5335\nipset=/inaporn.com/gfwlist\nserver=/paypal-knowledge.com/127.0.0.1#5335\nipset=/paypal-knowledge.com/gfwlist\nserver=/oculusconnect.com/127.0.0.1#5335\nipset=/oculusconnect.com/gfwlist\nserver=/managed-pki.de/127.0.0.1#5335\nipset=/managed-pki.de/gfwlist\nserver=/wiiugamepad.com/127.0.0.1#5335\nipset=/wiiugamepad.com/gfwlist\nserver=/oculusbrand.com/127.0.0.1#5335\nipset=/oculusbrand.com/gfwlist\nserver=/googlecompare.co.uk/127.0.0.1#5335\nipset=/googlecompare.co.uk/gfwlist\nserver=/nikebetrue.com/127.0.0.1#5335\nipset=/nikebetrue.com/gfwlist\nserver=/bmw-pakistan.com/127.0.0.1#5335\nipset=/bmw-pakistan.com/gfwlist\nserver=/superadultgames.com/127.0.0.1#5335\nipset=/superadultgames.com/gfwlist\nserver=/youtube.googleapis.com/127.0.0.1#5335\nipset=/youtube.googleapis.com/gfwlist\nserver=/x18r.com/127.0.0.1#5335\nipset=/x18r.com/gfwlist\nserver=/wsjbarrons.com/127.0.0.1#5335\nipset=/wsjbarrons.com/gfwlist\nserver=/volvotrucks.com.pt/127.0.0.1#5335\nipset=/volvotrucks.com.pt/gfwlist\nserver=/streamate.com/127.0.0.1#5335\nipset=/streamate.com/gfwlist\nserver=/thisispolaris.com/127.0.0.1#5335\nipset=/thisispolaris.com/gfwlist\nserver=/cloudflarestorage.com/127.0.0.1#5335\nipset=/cloudflarestorage.com/gfwlist\nserver=/ikea.co.ca/127.0.0.1#5335\nipset=/ikea.co.ca/gfwlist\nserver=/binoculus.com/127.0.0.1#5335\nipset=/binoculus.com/gfwlist\nserver=/intel.pa/127.0.0.1#5335\nipset=/intel.pa/gfwlist\nserver=/mycdn.me/127.0.0.1#5335\nipset=/mycdn.me/gfwlist\nserver=/1degree.com.au/127.0.0.1#5335\nipset=/1degree.com.au/gfwlist\nserver=/webgata.net/127.0.0.1#5335\nipset=/webgata.net/gfwlist\nserver=/mydirectvchannels.com/127.0.0.1#5335\nipset=/mydirectvchannels.com/gfwlist\nserver=/rocksextube.com/127.0.0.1#5335\nipset=/rocksextube.com/gfwlist\nserver=/volvobuses.kr/127.0.0.1#5335\nipset=/volvobuses.kr/gfwlist\nserver=/tube8.fr/127.0.0.1#5335\nipset=/tube8.fr/gfwlist\nserver=/filmeporno.xxx/127.0.0.1#5335\nipset=/filmeporno.xxx/gfwlist\nserver=/iutunes.com/127.0.0.1#5335\nipset=/iutunes.com/gfwlist\nserver=/cartoontube.com/127.0.0.1#5335\nipset=/cartoontube.com/gfwlist\nserver=/logitech.fr/127.0.0.1#5335\nipset=/logitech.fr/gfwlist\nserver=/theaustralian.com.au/127.0.0.1#5335\nipset=/theaustralian.com.au/gfwlist\nserver=/ieee-ceda.org/127.0.0.1#5335\nipset=/ieee-ceda.org/gfwlist\nserver=/voathai.com/127.0.0.1#5335\nipset=/voathai.com/gfwlist\nserver=/lolstatic.com/127.0.0.1#5335\nipset=/lolstatic.com/gfwlist\nserver=/xxxtubedot.com/127.0.0.1#5335\nipset=/xxxtubedot.com/gfwlist\nserver=/logitech.com/127.0.0.1#5335\nipset=/logitech.com/gfwlist\nserver=/comicbox.xyz/127.0.0.1#5335\nipset=/comicbox.xyz/gfwlist\nserver=/supersexeamateur.com/127.0.0.1#5335\nipset=/supersexeamateur.com/gfwlist\nserver=/headphoneses.com/127.0.0.1#5335\nipset=/headphoneses.com/gfwlist\nserver=/mini-connected.pl/127.0.0.1#5335\nipset=/mini-connected.pl/gfwlist\nserver=/youtube.lv/127.0.0.1#5335\nipset=/youtube.lv/gfwlist\nserver=/logi.com/127.0.0.1#5335\nipset=/logi.com/gfwlist\nserver=/pinterest.dk/127.0.0.1#5335\nipset=/pinterest.dk/gfwlist\nserver=/lgelectronics.122.2o7.net/127.0.0.1#5335\nipset=/lgelectronics.122.2o7.net/gfwlist\nserver=/freesexgames.ws/127.0.0.1#5335\nipset=/freesexgames.ws/gfwlist\nserver=/vipshoes2.com/127.0.0.1#5335\nipset=/vipshoes2.com/gfwlist\nserver=/baazee.com/127.0.0.1#5335\nipset=/baazee.com/gfwlist\nserver=/hotfucktube.com/127.0.0.1#5335\nipset=/hotfucktube.com/gfwlist\nserver=/lgrecyclingprogram.com/127.0.0.1#5335\nipset=/lgrecyclingprogram.com/gfwlist\nserver=/avple.tv/127.0.0.1#5335\nipset=/avple.tv/gfwlist\nserver=/lghvac.com/127.0.0.1#5335\nipset=/lghvac.com/gfwlist\nserver=/mandatewire.com/127.0.0.1#5335\nipset=/mandatewire.com/gfwlist\nserver=/google.com.vc/127.0.0.1#5335\nipset=/google.com.vc/gfwlist\nserver=/nintendo.fr/127.0.0.1#5335\nipset=/nintendo.fr/gfwlist\nserver=/vcloudair.net/127.0.0.1#5335\nipset=/vcloudair.net/gfwlist\nserver=/bmw.nc/127.0.0.1#5335\nipset=/bmw.nc/gfwlist\nserver=/jfengtime.com/127.0.0.1#5335\nipset=/jfengtime.com/gfwlist\nserver=/erotictube.me/127.0.0.1#5335\nipset=/erotictube.me/gfwlist\nserver=/vfsco.com.au/127.0.0.1#5335\nipset=/vfsco.com.au/gfwlist\nserver=/lg.com/127.0.0.1#5335\nipset=/lg.com/gfwlist\nserver=/trustisfps.com/127.0.0.1#5335\nipset=/trustisfps.com/gfwlist\nserver=/public-trust.com/127.0.0.1#5335\nipset=/public-trust.com/gfwlist\nserver=/yaoimangaonline.com/127.0.0.1#5335\nipset=/yaoimangaonline.com/gfwlist\nserver=/trustedanalytics.com/127.0.0.1#5335\nipset=/trustedanalytics.com/gfwlist\nserver=/nvidia.com.au/127.0.0.1#5335\nipset=/nvidia.com.au/gfwlist\nserver=/kink.com/127.0.0.1#5335\nipset=/kink.com/gfwlist\nserver=/openvinotoolkit.org/127.0.0.1#5335\nipset=/openvinotoolkit.org/gfwlist\nserver=/gothdporn.com/127.0.0.1#5335\nipset=/gothdporn.com/gfwlist\nserver=/shopee.com.br/127.0.0.1#5335\nipset=/shopee.com.br/gfwlist\nserver=/beatsdreus.com/127.0.0.1#5335\nipset=/beatsdreus.com/gfwlist\nserver=/nextfilm.com.hk/127.0.0.1#5335\nipset=/nextfilm.com.hk/gfwlist\nserver=/2adultflashgames.com/127.0.0.1#5335\nipset=/2adultflashgames.com/gfwlist\nserver=/foxcollegesports.com/127.0.0.1#5335\nipset=/foxcollegesports.com/gfwlist\nserver=/siport.com/127.0.0.1#5335\nipset=/siport.com/gfwlist\nserver=/htvncdn.net/127.0.0.1#5335\nipset=/htvncdn.net/gfwlist\nserver=/sensorynetworks.com/127.0.0.1#5335\nipset=/sensorynetworks.com/gfwlist\nserver=/patreoncommunity.com/127.0.0.1#5335\nipset=/patreoncommunity.com/gfwlist\nserver=/bloombergpolarlake.com/127.0.0.1#5335\nipset=/bloombergpolarlake.com/gfwlist\nserver=/azattyq.org/127.0.0.1#5335\nipset=/azattyq.org/gfwlist\nserver=/iphoto.se/127.0.0.1#5335\nipset=/iphoto.se/gfwlist\nserver=/photonicssociety.org/127.0.0.1#5335\nipset=/photonicssociety.org/gfwlist\nserver=/researchintel.com/127.0.0.1#5335\nipset=/researchintel.com/gfwlist\nserver=/pintool.com/127.0.0.1#5335\nipset=/pintool.com/gfwlist\nserver=/apnews.com/127.0.0.1#5335\nipset=/apnews.com/gfwlist\nserver=/pentium.net/127.0.0.1#5335\nipset=/pentium.net/gfwlist\nserver=/pc.com/127.0.0.1#5335\nipset=/pc.com/gfwlist\nserver=/optanedifference.com/127.0.0.1#5335\nipset=/optanedifference.com/gfwlist\nserver=/opendroneid.org/127.0.0.1#5335\nipset=/opendroneid.org/gfwlist\nserver=/google.pl/127.0.0.1#5335\nipset=/google.pl/gfwlist\nserver=/249dw7.cn/127.0.0.1#5335\nipset=/249dw7.cn/gfwlist\nserver=/ibook.co.nz/127.0.0.1#5335\nipset=/ibook.co.nz/gfwlist\nserver=/mastercard.com.br/127.0.0.1#5335\nipset=/mastercard.com.br/gfwlist\nserver=/booksc.org/127.0.0.1#5335\nipset=/booksc.org/gfwlist\nserver=/niken7.com/127.0.0.1#5335\nipset=/niken7.com/gfwlist\nserver=/pornoaid.com/127.0.0.1#5335\nipset=/pornoaid.com/gfwlist\nserver=/nextgenerationcenter.com/127.0.0.1#5335\nipset=/nextgenerationcenter.com/gfwlist\nserver=/ciscocontest.com/127.0.0.1#5335\nipset=/ciscocontest.com/gfwlist\nserver=/loverslab.com/127.0.0.1#5335\nipset=/loverslab.com/gfwlist\nserver=/hipzoom.net/127.0.0.1#5335\nipset=/hipzoom.net/gfwlist\nserver=/nevex.com/127.0.0.1#5335\nipset=/nevex.com/gfwlist\nserver=/nist.gov/127.0.0.1#5335\nipset=/nist.gov/gfwlist\nserver=/geelongadvertiser.com.au/127.0.0.1#5335\nipset=/geelongadvertiser.com.au/gfwlist\nserver=/instantfap.com/127.0.0.1#5335\nipset=/instantfap.com/gfwlist\nserver=/movidius.com/127.0.0.1#5335\nipset=/movidius.com/gfwlist\nserver=/hpstorethailand.com/127.0.0.1#5335\nipset=/hpstorethailand.com/gfwlist\nserver=/headphones-dre.com/127.0.0.1#5335\nipset=/headphones-dre.com/gfwlist\nserver=/zeit-world.net/127.0.0.1#5335\nipset=/zeit-world.net/gfwlist\nserver=/lookinside.com/127.0.0.1#5335\nipset=/lookinside.com/gfwlist\nserver=/inteltechnologyprovider.com/127.0.0.1#5335\nipset=/inteltechnologyprovider.com/gfwlist\nserver=/intelstore.com/127.0.0.1#5335\nipset=/intelstore.com/gfwlist\nserver=/yaoyaomumu.com/127.0.0.1#5335\nipset=/yaoyaomumu.com/gfwlist\nserver=/postimg.cc/127.0.0.1#5335\nipset=/postimg.cc/gfwlist\nserver=/eu-consumer-empowerment.com/127.0.0.1#5335\nipset=/eu-consumer-empowerment.com/gfwlist\nserver=/monsterbeatssydneyaustralia.com/127.0.0.1#5335\nipset=/monsterbeatssydneyaustralia.com/gfwlist\nserver=/intelsoftwarenetwork.com/127.0.0.1#5335\nipset=/intelsoftwarenetwork.com/gfwlist\nserver=/myavfun.com/127.0.0.1#5335\nipset=/myavfun.com/gfwlist\nserver=/brew.sh/127.0.0.1#5335\nipset=/brew.sh/gfwlist\nserver=/blogspot.sn/127.0.0.1#5335\nipset=/blogspot.sn/gfwlist\nserver=/porn555.com/127.0.0.1#5335\nipset=/porn555.com/gfwlist\nserver=/foxacrossamerica.com/127.0.0.1#5335\nipset=/foxacrossamerica.com/gfwlist\nserver=/intelsalestraining.com/127.0.0.1#5335\nipset=/intelsalestraining.com/gfwlist\nserver=/costco.com/127.0.0.1#5335\nipset=/costco.com/gfwlist\nserver=/tittykings.com/127.0.0.1#5335\nipset=/tittykings.com/gfwlist\nserver=/poringa.net/127.0.0.1#5335\nipset=/poringa.net/gfwlist\nserver=/pypa.io/127.0.0.1#5335\nipset=/pypa.io/gfwlist\nserver=/intelrealsense.com/127.0.0.1#5335\nipset=/intelrealsense.com/gfwlist\nserver=/intelquark.com/127.0.0.1#5335\nipset=/intelquark.com/gfwlist\nserver=/bmwmotorradhk.com/127.0.0.1#5335\nipset=/bmwmotorradhk.com/gfwlist\nserver=/xxxjapanesemovies.com/127.0.0.1#5335\nipset=/xxxjapanesemovies.com/gfwlist\nserver=/newsmart.jp/127.0.0.1#5335\nipset=/newsmart.jp/gfwlist\nserver=/nhentai.io/127.0.0.1#5335\nipset=/nhentai.io/gfwlist\nserver=/thomsonreutersmexico.com/127.0.0.1#5335\nipset=/thomsonreutersmexico.com/gfwlist\nserver=/intelnervana.com/127.0.0.1#5335\nipset=/intelnervana.com/gfwlist\nserver=/wankgames.com/127.0.0.1#5335\nipset=/wankgames.com/gfwlist\nserver=/naughtyblog.org/127.0.0.1#5335\nipset=/naughtyblog.org/gfwlist\nserver=/cuntempire.com/127.0.0.1#5335\nipset=/cuntempire.com/gfwlist\nserver=/fbsupport-covid.net/127.0.0.1#5335\nipset=/fbsupport-covid.net/gfwlist\nserver=/realzoomovies.com/127.0.0.1#5335\nipset=/realzoomovies.com/gfwlist\nserver=/avnana5.com/127.0.0.1#5335\nipset=/avnana5.com/gfwlist\nserver=/hcpdts.com/127.0.0.1#5335\nipset=/hcpdts.com/gfwlist\nserver=/logicool.co.jp/127.0.0.1#5335\nipset=/logicool.co.jp/gfwlist\nserver=/sexy3dtoon.com/127.0.0.1#5335\nipset=/sexy3dtoon.com/gfwlist\nserver=/intelgo.net/127.0.0.1#5335\nipset=/intelgo.net/gfwlist\nserver=/iphone4.com/127.0.0.1#5335\nipset=/iphone4.com/gfwlist\nserver=/bandgirlz.com/127.0.0.1#5335\nipset=/bandgirlz.com/gfwlist\nserver=/intelforchange.com/127.0.0.1#5335\nipset=/intelforchange.com/gfwlist\nserver=/inteleventexpress.com/127.0.0.1#5335\nipset=/inteleventexpress.com/gfwlist\nserver=/vpngate.jp/127.0.0.1#5335\nipset=/vpngate.jp/gfwlist\nserver=/benliton.com/127.0.0.1#5335\nipset=/benliton.com/gfwlist\nserver=/intelcapital.com/127.0.0.1#5335\nipset=/intelcapital.com/gfwlist\nserver=/thepornlist.com/127.0.0.1#5335\nipset=/thepornlist.com/gfwlist\nserver=/nikelink.com/127.0.0.1#5335\nipset=/nikelink.com/gfwlist\nserver=/intelapacstore.com/127.0.0.1#5335\nipset=/intelapacstore.com/gfwlist\nserver=/bmw-connecteddrive.ie/127.0.0.1#5335\nipset=/bmw-connecteddrive.ie/gfwlist\nserver=/radiomarsho.com/127.0.0.1#5335\nipset=/radiomarsho.com/gfwlist\nserver=/intelamericasstore.com/127.0.0.1#5335\nipset=/intelamericasstore.com/gfwlist\nserver=/bmwlat.com/127.0.0.1#5335\nipset=/bmwlat.com/gfwlist\nserver=/adobepress.ch/127.0.0.1#5335\nipset=/adobepress.ch/gfwlist\nserver=/amazon.com.br/127.0.0.1#5335\nipset=/amazon.com.br/gfwlist\nserver=/bttzyw.net/127.0.0.1#5335\nipset=/bttzyw.net/gfwlist\nserver=/intel-university-collaboration.net/127.0.0.1#5335\nipset=/intel-university-collaboration.net/gfwlist\nserver=/payypal.com/127.0.0.1#5335\nipset=/payypal.com/gfwlist\nserver=/pornorips.com/127.0.0.1#5335\nipset=/pornorips.com/gfwlist\nserver=/dandanzan.cc/127.0.0.1#5335\nipset=/dandanzan.cc/gfwlist\nserver=/mini.dk/127.0.0.1#5335\nipset=/mini.dk/gfwlist\nserver=/intel.tj/127.0.0.1#5335\nipset=/intel.tj/gfwlist\nserver=/comicuniverse.org/127.0.0.1#5335\nipset=/comicuniverse.org/gfwlist\nserver=/protonstatus.com/127.0.0.1#5335\nipset=/protonstatus.com/gfwlist\nserver=/blogspot.hk/127.0.0.1#5335\nipset=/blogspot.hk/gfwlist\nserver=/alterauserforums.net/127.0.0.1#5335\nipset=/alterauserforums.net/gfwlist\nserver=/easic.com/127.0.0.1#5335\nipset=/easic.com/gfwlist\nserver=/akamai-trials.com/127.0.0.1#5335\nipset=/akamai-trials.com/gfwlist\nserver=/foxsoccerplus.net/127.0.0.1#5335\nipset=/foxsoccerplus.net/gfwlist\nserver=/machigle-sp.com/127.0.0.1#5335\nipset=/machigle-sp.com/gfwlist\nserver=/coreextreme.com/127.0.0.1#5335\nipset=/coreextreme.com/gfwlist\nserver=/bmw.kz/127.0.0.1#5335\nipset=/bmw.kz/gfwlist\nserver=/amateurcool.com/127.0.0.1#5335\nipset=/amateurcool.com/gfwlist\nserver=/faacebook.com/127.0.0.1#5335\nipset=/faacebook.com/gfwlist\nserver=/rentaride.com/127.0.0.1#5335\nipset=/rentaride.com/gfwlist\nserver=/clusterconnection.com/127.0.0.1#5335\nipset=/clusterconnection.com/gfwlist\nserver=/imhentai.xxx/127.0.0.1#5335\nipset=/imhentai.xxx/gfwlist\nserver=/mrloli.com/127.0.0.1#5335\nipset=/mrloli.com/gfwlist\nserver=/facebookexchange.net/127.0.0.1#5335\nipset=/facebookexchange.net/gfwlist\nserver=/mini-connected.ee/127.0.0.1#5335\nipset=/mini-connected.ee/gfwlist\nserver=/chips.com/127.0.0.1#5335\nipset=/chips.com/gfwlist\nserver=/newyorker.com/127.0.0.1#5335\nipset=/newyorker.com/gfwlist\nserver=/akami.com/127.0.0.1#5335\nipset=/akami.com/gfwlist\nserver=/marvelsdoubleagent.com/127.0.0.1#5335\nipset=/marvelsdoubleagent.com/gfwlist\nserver=/iwantavnow.com/127.0.0.1#5335\nipset=/iwantavnow.com/gfwlist\nserver=/alphera.com.my/127.0.0.1#5335\nipset=/alphera.com.my/gfwlist\nserver=/bigboss.video/127.0.0.1#5335\nipset=/bigboss.video/gfwlist\nserver=/bmw-motorrad.bo/127.0.0.1#5335\nipset=/bmw-motorrad.bo/gfwlist\nserver=/ipod.com/127.0.0.1#5335\nipset=/ipod.com/gfwlist\nserver=/starbucksrtd.com/127.0.0.1#5335\nipset=/starbucksrtd.com/gfwlist\nserver=/celeron.com/127.0.0.1#5335\nipset=/celeron.com/gfwlist\nserver=/buyaltera.com/127.0.0.1#5335\nipset=/buyaltera.com/gfwlist\nserver=/vfsco.hu/127.0.0.1#5335\nipset=/vfsco.hu/gfwlist\nserver=/mini.com.tr/127.0.0.1#5335\nipset=/mini.com.tr/gfwlist\nserver=/monsterbeatsalestore.com/127.0.0.1#5335\nipset=/monsterbeatsalestore.com/gfwlist\nserver=/alterauserforum.net/127.0.0.1#5335\nipset=/alterauserforum.net/gfwlist\nserver=/kingextre.me/127.0.0.1#5335\nipset=/kingextre.me/gfwlist\nserver=/alteraforums.net/127.0.0.1#5335\nipset=/alteraforums.net/gfwlist\nserver=/volvotrucks.mk/127.0.0.1#5335\nipset=/volvotrucks.mk/gfwlist\nserver=/bestbuybusiness.com/127.0.0.1#5335\nipset=/bestbuybusiness.com/gfwlist\nserver=/foxfaq.com/127.0.0.1#5335\nipset=/foxfaq.com/gfwlist\nserver=/evilangel.com/127.0.0.1#5335\nipset=/evilangel.com/gfwlist\nserver=/worldemojiawards.com/127.0.0.1#5335\nipset=/worldemojiawards.com/gfwlist\nserver=/mini.com.ar/127.0.0.1#5335\nipset=/mini.com.ar/gfwlist\nserver=/crysis.jp/127.0.0.1#5335\nipset=/crysis.jp/gfwlist\nserver=/readthedocs-hosted.com/127.0.0.1#5335\nipset=/readthedocs-hosted.com/gfwlist\nserver=/beats-bydreoutletsale.net/127.0.0.1#5335\nipset=/beats-bydreoutletsale.net/gfwlist\nserver=/cbscorporation.com/127.0.0.1#5335\nipset=/cbscorporation.com/gfwlist\nserver=/garenanow.com/127.0.0.1#5335\nipset=/garenanow.com/gfwlist\nserver=/overcast.fm/127.0.0.1#5335\nipset=/overcast.fm/gfwlist\nserver=/airwatchexpress.com/127.0.0.1#5335\nipset=/airwatchexpress.com/gfwlist\nserver=/findmybeats.com/127.0.0.1#5335\nipset=/findmybeats.com/gfwlist\nserver=/durex.com.co/127.0.0.1#5335\nipset=/durex.com.co/gfwlist\nserver=/yourvoyeurvideos.com/127.0.0.1#5335\nipset=/yourvoyeurvideos.com/gfwlist\nserver=/topsexygames.com/127.0.0.1#5335\nipset=/topsexygames.com/gfwlist\nserver=/assylum.com/127.0.0.1#5335\nipset=/assylum.com/gfwlist\nserver=/paypalcommunity.org/127.0.0.1#5335\nipset=/paypalcommunity.org/gfwlist\nserver=/nikebetterworld.net/127.0.0.1#5335\nipset=/nikebetterworld.net/gfwlist\nserver=/southfloridamini.com/127.0.0.1#5335\nipset=/southfloridamini.com/gfwlist\nserver=/hkgolden.com/127.0.0.1#5335\nipset=/hkgolden.com/gfwlist\nserver=/pogo.com/127.0.0.1#5335\nipset=/pogo.com/gfwlist\nserver=/intel.vn/127.0.0.1#5335\nipset=/intel.vn/gfwlist\nserver=/visualarts.gr.jp/127.0.0.1#5335\nipset=/visualarts.gr.jp/gfwlist\nserver=/intel.vg/127.0.0.1#5335\nipset=/intel.vg/gfwlist\nserver=/masterpassteststore.com/127.0.0.1#5335\nipset=/masterpassteststore.com/gfwlist\nserver=/maximumerotica.com/127.0.0.1#5335\nipset=/maximumerotica.com/gfwlist\nserver=/intel.lc/127.0.0.1#5335\nipset=/intel.lc/gfwlist\nserver=/nextmgz.com/127.0.0.1#5335\nipset=/nextmgz.com/gfwlist\nserver=/intel.uy/127.0.0.1#5335\nipset=/intel.uy/gfwlist\nserver=/javscreens.com/127.0.0.1#5335\nipset=/javscreens.com/gfwlist\nserver=/digicert-cn.com/127.0.0.1#5335\nipset=/digicert-cn.com/gfwlist\nserver=/yahoo.com.hk/127.0.0.1#5335\nipset=/yahoo.com.hk/gfwlist\nserver=/voandebele.com/127.0.0.1#5335\nipset=/voandebele.com/gfwlist\nserver=/cyber-bay.info/127.0.0.1#5335\nipset=/cyber-bay.info/gfwlist\nserver=/intel.tt/127.0.0.1#5335\nipset=/intel.tt/gfwlist\nserver=/ebayseller.com/127.0.0.1#5335\nipset=/ebayseller.com/gfwlist\nserver=/hentaivideos.net/127.0.0.1#5335\nipset=/hentaivideos.net/gfwlist\nserver=/foxnewsgo.net/127.0.0.1#5335\nipset=/foxnewsgo.net/gfwlist\nserver=/voyeurpapa.com/127.0.0.1#5335\nipset=/voyeurpapa.com/gfwlist\nserver=/disqusservice.com/127.0.0.1#5335\nipset=/disqusservice.com/gfwlist\nserver=/scholar.google.com.gt/127.0.0.1#5335\nipset=/scholar.google.com.gt/gfwlist\nserver=/intel.tn/127.0.0.1#5335\nipset=/intel.tn/gfwlist\nserver=/intel.tm/127.0.0.1#5335\nipset=/intel.tm/gfwlist\nserver=/nikeseason.com/127.0.0.1#5335\nipset=/nikeseason.com/gfwlist\nserver=/akamaized-staging.net/127.0.0.1#5335\nipset=/akamaized-staging.net/gfwlist\nserver=/intel.tl/127.0.0.1#5335\nipset=/intel.tl/gfwlist\nserver=/intel.tf/127.0.0.1#5335\nipset=/intel.tf/gfwlist\nserver=/foxbet.com/127.0.0.1#5335\nipset=/foxbet.com/gfwlist\nserver=/facebookads.com/127.0.0.1#5335\nipset=/facebookads.com/gfwlist\nserver=/libgen.life/127.0.0.1#5335\nipset=/libgen.life/gfwlist\nserver=/element.io/127.0.0.1#5335\nipset=/element.io/gfwlist\nserver=/hentairank.supertop-100.com/127.0.0.1#5335\nipset=/hentairank.supertop-100.com/gfwlist\nserver=/amazon.ca/127.0.0.1#5335\nipset=/amazon.ca/gfwlist\nserver=/bestfreetube.net/127.0.0.1#5335\nipset=/bestfreetube.net/gfwlist\nserver=/intel.st/127.0.0.1#5335\nipset=/intel.st/gfwlist\nserver=/gold-gay.com/127.0.0.1#5335\nipset=/gold-gay.com/gfwlist\nserver=/theindianleaks.com/127.0.0.1#5335\nipset=/theindianleaks.com/gfwlist\nserver=/account-paypal.net/127.0.0.1#5335\nipset=/account-paypal.net/gfwlist\nserver=/intel.sk/127.0.0.1#5335\nipset=/intel.sk/gfwlist\nserver=/mywifecuckold.com/127.0.0.1#5335\nipset=/mywifecuckold.com/gfwlist\nserver=/softbankbb.net/127.0.0.1#5335\nipset=/softbankbb.net/gfwlist\nserver=/tex-talk.net/127.0.0.1#5335\nipset=/tex-talk.net/gfwlist\nserver=/applecare.eu/127.0.0.1#5335\nipset=/applecare.eu/gfwlist\nserver=/icloudpay.net/127.0.0.1#5335\nipset=/icloudpay.net/gfwlist\nserver=/otbm.com/127.0.0.1#5335\nipset=/otbm.com/gfwlist\nserver=/facevbook.com/127.0.0.1#5335\nipset=/facevbook.com/gfwlist\nserver=/huffingtonpost.es/127.0.0.1#5335\nipset=/huffingtonpost.es/gfwlist\nserver=/edgefonts.net/127.0.0.1#5335\nipset=/edgefonts.net/gfwlist\nserver=/sony.eu/127.0.0.1#5335\nipset=/sony.eu/gfwlist\nserver=/20thcenturystudios.jp/127.0.0.1#5335\nipset=/20thcenturystudios.jp/gfwlist\nserver=/petardas.com/127.0.0.1#5335\nipset=/petardas.com/gfwlist\nserver=/intel.pn/127.0.0.1#5335\nipset=/intel.pn/gfwlist\nserver=/ahtops.com/127.0.0.1#5335\nipset=/ahtops.com/gfwlist\nserver=/exhentai.org/127.0.0.1#5335\nipset=/exhentai.org/gfwlist\nserver=/touchsmartpc.net/127.0.0.1#5335\nipset=/touchsmartpc.net/gfwlist\nserver=/hqbutt.com/127.0.0.1#5335\nipset=/hqbutt.com/gfwlist\nserver=/iloveinterracial.com/127.0.0.1#5335\nipset=/iloveinterracial.com/gfwlist\nserver=/ftcdn.net/127.0.0.1#5335\nipset=/ftcdn.net/gfwlist\nserver=/facebook.tv/127.0.0.1#5335\nipset=/facebook.tv/gfwlist\nserver=/volvopenta.es/127.0.0.1#5335\nipset=/volvopenta.es/gfwlist\nserver=/drdrebeatssale7.com/127.0.0.1#5335\nipset=/drdrebeatssale7.com/gfwlist\nserver=/faceabook.com/127.0.0.1#5335\nipset=/faceabook.com/gfwlist\nserver=/leagueoflegends.org/127.0.0.1#5335\nipset=/leagueoflegends.org/gfwlist\nserver=/foxbusiness.com/127.0.0.1#5335\nipset=/foxbusiness.com/gfwlist\nserver=/watchmygirlfriend.tv/127.0.0.1#5335\nipset=/watchmygirlfriend.tv/gfwlist\nserver=/yespornplease.com/127.0.0.1#5335\nipset=/yespornplease.com/gfwlist\nserver=/blpcareers.com/127.0.0.1#5335\nipset=/blpcareers.com/gfwlist\nserver=/headphonepubs.com/127.0.0.1#5335\nipset=/headphonepubs.com/gfwlist\nserver=/womenwill.id/127.0.0.1#5335\nipset=/womenwill.id/gfwlist\nserver=/pearsonclinical.de/127.0.0.1#5335\nipset=/pearsonclinical.de/gfwlist\nserver=/brazzers.xxx/127.0.0.1#5335\nipset=/brazzers.xxx/gfwlist\nserver=/paxlicense.org/127.0.0.1#5335\nipset=/paxlicense.org/gfwlist\nserver=/intel.mu/127.0.0.1#5335\nipset=/intel.mu/gfwlist\nserver=/experiencebillmelater.com/127.0.0.1#5335\nipset=/experiencebillmelater.com/gfwlist\nserver=/intel.mt/127.0.0.1#5335\nipset=/intel.mt/gfwlist\nserver=/wixsite.com/127.0.0.1#5335\nipset=/wixsite.com/gfwlist\nserver=/bmw.kg/127.0.0.1#5335\nipset=/bmw.kg/gfwlist\nserver=/truefi.io/127.0.0.1#5335\nipset=/truefi.io/gfwlist\nserver=/applestore.com.eg/127.0.0.1#5335\nipset=/applestore.com.eg/gfwlist\nserver=/nexitally.com/127.0.0.1#5335\nipset=/nexitally.com/gfwlist\nserver=/bmwlifestyle.ca/127.0.0.1#5335\nipset=/bmwlifestyle.ca/gfwlist\nserver=/erabaru.net/127.0.0.1#5335\nipset=/erabaru.net/gfwlist\nserver=/discord.co/127.0.0.1#5335\nipset=/discord.co/gfwlist\nserver=/nhentaihaven.com/127.0.0.1#5335\nipset=/nhentaihaven.com/gfwlist\nserver=/buyfast-paysmart.net/127.0.0.1#5335\nipset=/buyfast-paysmart.net/gfwlist\nserver=/intel.mg/127.0.0.1#5335\nipset=/intel.mg/gfwlist\nserver=/instagramci.com/127.0.0.1#5335\nipset=/instagramci.com/gfwlist\nserver=/facebooknude.com/127.0.0.1#5335\nipset=/facebooknude.com/gfwlist\nserver=/gauleporno.xxx/127.0.0.1#5335\nipset=/gauleporno.xxx/gfwlist\nserver=/orlandohurricane.com/127.0.0.1#5335\nipset=/orlandohurricane.com/gfwlist\nserver=/intel.me/127.0.0.1#5335\nipset=/intel.me/gfwlist\nserver=/volvobuses.pl/127.0.0.1#5335\nipset=/volvobuses.pl/gfwlist\nserver=/porndoepremium.com/127.0.0.1#5335\nipset=/porndoepremium.com/gfwlist\nserver=/knovel.com/127.0.0.1#5335\nipset=/knovel.com/gfwlist\nserver=/intel.ke/127.0.0.1#5335\nipset=/intel.ke/gfwlist\nserver=/intel.jp/127.0.0.1#5335\nipset=/intel.jp/gfwlist\nserver=/stripe.com/127.0.0.1#5335\nipset=/stripe.com/gfwlist\nserver=/ebaytechblog.com/127.0.0.1#5335\nipset=/ebaytechblog.com/gfwlist\nserver=/intel.je/127.0.0.1#5335\nipset=/intel.je/gfwlist\nserver=/intel.io/127.0.0.1#5335\nipset=/intel.io/gfwlist\nserver=/nivod.tv/127.0.0.1#5335\nipset=/nivod.tv/gfwlist\nserver=/avcar.vip/127.0.0.1#5335\nipset=/avcar.vip/gfwlist\nserver=/bingvisualsearch.com/127.0.0.1#5335\nipset=/bingvisualsearch.com/gfwlist\nserver=/fucktube.com/127.0.0.1#5335\nipset=/fucktube.com/gfwlist\nserver=/huffingtonpost.jp/127.0.0.1#5335\nipset=/huffingtonpost.jp/gfwlist\nserver=/intel.ht/127.0.0.1#5335\nipset=/intel.ht/gfwlist\nserver=/intel.hn/127.0.0.1#5335\nipset=/intel.hn/gfwlist\nserver=/monitrix.net/127.0.0.1#5335\nipset=/monitrix.net/gfwlist\nserver=/intel.hk/127.0.0.1#5335\nipset=/intel.hk/gfwlist\nserver=/microsoft.cl/127.0.0.1#5335\nipset=/microsoft.cl/gfwlist\nserver=/intel.gy/127.0.0.1#5335\nipset=/intel.gy/gfwlist\nserver=/466453.com/127.0.0.1#5335\nipset=/466453.com/gfwlist\nserver=/theguardian.com/127.0.0.1#5335\nipset=/theguardian.com/gfwlist\nserver=/intel.gt/127.0.0.1#5335\nipset=/intel.gt/gfwlist\nserver=/alphabet.uk/127.0.0.1#5335\nipset=/alphabet.uk/gfwlist\nserver=/xshaker.net/127.0.0.1#5335\nipset=/xshaker.net/gfwlist\nserver=/viralcum.com/127.0.0.1#5335\nipset=/viralcum.com/gfwlist\nserver=/ebay.ch/127.0.0.1#5335\nipset=/ebay.ch/gfwlist\nserver=/youtube.com.ni/127.0.0.1#5335\nipset=/youtube.com.ni/gfwlist\nserver=/intel.gm/127.0.0.1#5335\nipset=/intel.gm/gfwlist\nserver=/walmartimages.com/127.0.0.1#5335\nipset=/walmartimages.com/gfwlist\nserver=/intel.ge/127.0.0.1#5335\nipset=/intel.ge/gfwlist\nserver=/intel.gd/127.0.0.1#5335\nipset=/intel.gd/gfwlist\nserver=/fc2ppv.tv/127.0.0.1#5335\nipset=/fc2ppv.tv/gfwlist\nserver=/startpath.com/127.0.0.1#5335\nipset=/startpath.com/gfwlist\nserver=/smartcommunitiescoalition.org/127.0.0.1#5335\nipset=/smartcommunitiescoalition.org/gfwlist\nserver=/applepaysupplies.info/127.0.0.1#5335\nipset=/applepaysupplies.info/gfwlist\nserver=/avstar02.me/127.0.0.1#5335\nipset=/avstar02.me/gfwlist\nserver=/jav-legend.com/127.0.0.1#5335\nipset=/jav-legend.com/gfwlist\nserver=/enterprisessl.com/127.0.0.1#5335\nipset=/enterprisessl.com/gfwlist\nserver=/intel.es/127.0.0.1#5335\nipset=/intel.es/gfwlist\nserver=/vitukali.com/127.0.0.1#5335\nipset=/vitukali.com/gfwlist\nserver=/cheapbeatsbydre-au.com/127.0.0.1#5335\nipset=/cheapbeatsbydre-au.com/gfwlist\nserver=/fssta.com/127.0.0.1#5335\nipset=/fssta.com/gfwlist\nserver=/facebooksecurity.net/127.0.0.1#5335\nipset=/facebooksecurity.net/gfwlist\nserver=/anaconda.cloud/127.0.0.1#5335\nipset=/anaconda.cloud/gfwlist\nserver=/madvagina.com/127.0.0.1#5335\nipset=/madvagina.com/gfwlist\nserver=/gigabyte.com/127.0.0.1#5335\nipset=/gigabyte.com/gfwlist\nserver=/serving-sys.com/127.0.0.1#5335\nipset=/serving-sys.com/gfwlist\nserver=/babes.com/127.0.0.1#5335\nipset=/babes.com/gfwlist\nserver=/intel.com.ve/127.0.0.1#5335\nipset=/intel.com.ve/gfwlist\nserver=/dachix.com/127.0.0.1#5335\nipset=/dachix.com/gfwlist\nserver=/intel.com.uy/127.0.0.1#5335\nipset=/intel.com.uy/gfwlist\nserver=/intel.com.tw/127.0.0.1#5335\nipset=/intel.com.tw/gfwlist\nserver=/intel.com.tr/127.0.0.1#5335\nipset=/intel.com.tr/gfwlist\nserver=/icloudo.com/127.0.0.1#5335\nipset=/icloudo.com/gfwlist\nserver=/pichunter.com/127.0.0.1#5335\nipset=/pichunter.com/gfwlist\nserver=/amzn.asia/127.0.0.1#5335\nipset=/amzn.asia/gfwlist\nserver=/nunuyy.cc/127.0.0.1#5335\nipset=/nunuyy.cc/gfwlist\nserver=/jav.guru/127.0.0.1#5335\nipset=/jav.guru/gfwlist\nserver=/tellmewhygame.com/127.0.0.1#5335\nipset=/tellmewhygame.com/gfwlist\nserver=/kemono.party/127.0.0.1#5335\nipset=/kemono.party/gfwlist\nserver=/bridge-studio.co.uk/127.0.0.1#5335\nipset=/bridge-studio.co.uk/gfwlist\nserver=/intel.com.pr/127.0.0.1#5335\nipset=/intel.com.pr/gfwlist\nserver=/visaglobalfinance.com/127.0.0.1#5335\nipset=/visaglobalfinance.com/gfwlist\nserver=/sxyprn.com/127.0.0.1#5335\nipset=/sxyprn.com/gfwlist\nserver=/malvastudios.com/127.0.0.1#5335\nipset=/malvastudios.com/gfwlist\nserver=/needforspeedproven.com/127.0.0.1#5335\nipset=/needforspeedproven.com/gfwlist\nserver=/fxporn.net/127.0.0.1#5335\nipset=/fxporn.net/gfwlist\nserver=/intel.com.mx/127.0.0.1#5335\nipset=/intel.com.mx/gfwlist\nserver=/intel.com.jm/127.0.0.1#5335\nipset=/intel.com.jm/gfwlist\nserver=/bmw.ro/127.0.0.1#5335\nipset=/bmw.ro/gfwlist\nserver=/intel.com.hk/127.0.0.1#5335\nipset=/intel.com.hk/gfwlist\nserver=/intel.com.co/127.0.0.1#5335\nipset=/intel.com.co/gfwlist\nserver=/google.tt/127.0.0.1#5335\nipset=/google.tt/gfwlist\nserver=/nuita.net/127.0.0.1#5335\nipset=/nuita.net/gfwlist\nserver=/intel.com.bo/127.0.0.1#5335\nipset=/intel.com.bo/gfwlist\nserver=/vercel.pub/127.0.0.1#5335\nipset=/vercel.pub/gfwlist\nserver=/intel.com.au/127.0.0.1#5335\nipset=/intel.com.au/gfwlist\nserver=/google.mw/127.0.0.1#5335\nipset=/google.mw/gfwlist\nserver=/mangahentai.me/127.0.0.1#5335\nipset=/mangahentai.me/gfwlist\nserver=/bmwgroupna.com/127.0.0.1#5335\nipset=/bmwgroupna.com/gfwlist\nserver=/monsterbeatsbydrdre-usa.com/127.0.0.1#5335\nipset=/monsterbeatsbydrdre-usa.com/gfwlist\nserver=/pugpig.com/127.0.0.1#5335\nipset=/pugpig.com/gfwlist\nserver=/intel.co.il/127.0.0.1#5335\nipset=/intel.co.il/gfwlist\nserver=/toget.com.tw/127.0.0.1#5335\nipset=/toget.com.tw/gfwlist\nserver=/fapphub.com/127.0.0.1#5335\nipset=/fapphub.com/gfwlist\nserver=/skypedata.akadns.net/127.0.0.1#5335\nipset=/skypedata.akadns.net/gfwlist\nserver=/qmov.net/127.0.0.1#5335\nipset=/qmov.net/gfwlist\nserver=/intel.co.id/127.0.0.1#5335\nipset=/intel.co.id/gfwlist\nserver=/pornxxxplace.com/127.0.0.1#5335\nipset=/pornxxxplace.com/gfwlist\nserver=/creativecommons.org/127.0.0.1#5335\nipset=/creativecommons.org/gfwlist\nserver=/volvotrucks.at/127.0.0.1#5335\nipset=/volvotrucks.at/gfwlist\nserver=/adobesc.com/127.0.0.1#5335\nipset=/adobesc.com/gfwlist\nserver=/intel.co.ae/127.0.0.1#5335\nipset=/intel.co.ae/gfwlist\nserver=/redtube.com.br/127.0.0.1#5335\nipset=/redtube.com.br/gfwlist\nserver=/ieee-uffc.org/127.0.0.1#5335\nipset=/ieee-uffc.org/gfwlist\nserver=/intel.cm/127.0.0.1#5335\nipset=/intel.cm/gfwlist\nserver=/iphone-vip4.com/127.0.0.1#5335\nipset=/iphone-vip4.com/gfwlist\nserver=/intel.cg/127.0.0.1#5335\nipset=/intel.cg/gfwlist\nserver=/intel.cc/127.0.0.1#5335\nipset=/intel.cc/gfwlist\nserver=/huobi.me/127.0.0.1#5335\nipset=/huobi.me/gfwlist\nserver=/stackexchange.com/127.0.0.1#5335\nipset=/stackexchange.com/gfwlist\nserver=/seamonkey-project.org/127.0.0.1#5335\nipset=/seamonkey-project.org/gfwlist\nserver=/bmw.com.sg/127.0.0.1#5335\nipset=/bmw.com.sg/gfwlist\nserver=/appleafrica.com/127.0.0.1#5335\nipset=/appleafrica.com/gfwlist\nserver=/brepolis.net/127.0.0.1#5335\nipset=/brepolis.net/gfwlist\nserver=/paypalcommunity.com/127.0.0.1#5335\nipset=/paypalcommunity.com/gfwlist\nserver=/vagabundasdoorkut.net/127.0.0.1#5335\nipset=/vagabundasdoorkut.net/gfwlist\nserver=/gayporno.fm/127.0.0.1#5335\nipset=/gayporno.fm/gfwlist\nserver=/whoreteensex.com/127.0.0.1#5335\nipset=/whoreteensex.com/gfwlist\nserver=/intel.bg/127.0.0.1#5335\nipset=/intel.bg/gfwlist\nserver=/akamci.com/127.0.0.1#5335\nipset=/akamci.com/gfwlist\nserver=/peach-cherry.com/127.0.0.1#5335\nipset=/peach-cherry.com/gfwlist\nserver=/intel.at/127.0.0.1#5335\nipset=/intel.at/gfwlist\nserver=/analdin.com/127.0.0.1#5335\nipset=/analdin.com/gfwlist\nserver=/intel.ai/127.0.0.1#5335\nipset=/intel.ai/gfwlist\nserver=/brewmp.com/127.0.0.1#5335\nipset=/brewmp.com/gfwlist\nserver=/cocktailsandcocktalk.com/127.0.0.1#5335\nipset=/cocktailsandcocktalk.com/gfwlist\nserver=/1vwapi4d.xyz/127.0.0.1#5335\nipset=/1vwapi4d.xyz/gfwlist\nserver=/mgo.com/127.0.0.1#5335\nipset=/mgo.com/gfwlist\nserver=/dailymail.dk/127.0.0.1#5335\nipset=/dailymail.dk/gfwlist\nserver=/stripcamfun.com/127.0.0.1#5335\nipset=/stripcamfun.com/gfwlist\nserver=/echosign.com/127.0.0.1#5335\nipset=/echosign.com/gfwlist\nserver=/haskellstack.org/127.0.0.1#5335\nipset=/haskellstack.org/gfwlist\nserver=/intel.ac/127.0.0.1#5335\nipset=/intel.ac/gfwlist\nserver=/s81c.com/127.0.0.1#5335\nipset=/s81c.com/gfwlist\nserver=/haveibeenpwned.com/127.0.0.1#5335\nipset=/haveibeenpwned.com/gfwlist\nserver=/bmw.com.ec/127.0.0.1#5335\nipset=/bmw.com.ec/gfwlist\nserver=/wwwapple.net/127.0.0.1#5335\nipset=/wwwapple.net/gfwlist\nserver=/ibm.net/127.0.0.1#5335\nipset=/ibm.net/gfwlist\nserver=/hq69.com/127.0.0.1#5335\nipset=/hq69.com/gfwlist\nserver=/minuporno.com/127.0.0.1#5335\nipset=/minuporno.com/gfwlist\nserver=/bnext.com.tw/127.0.0.1#5335\nipset=/bnext.com.tw/gfwlist\nserver=/driving.co.uk/127.0.0.1#5335\nipset=/driving.co.uk/gfwlist\nserver=/ivintageporn.com/127.0.0.1#5335\nipset=/ivintageporn.com/gfwlist\nserver=/sunbingo.co.uk/127.0.0.1#5335\nipset=/sunbingo.co.uk/gfwlist\nserver=/voakorea.com/127.0.0.1#5335\nipset=/voakorea.com/gfwlist\nserver=/hpbundle.com/127.0.0.1#5335\nipset=/hpbundle.com/gfwlist\nserver=/miktex.org/127.0.0.1#5335\nipset=/miktex.org/gfwlist\nserver=/www8-hp.com/127.0.0.1#5335\nipset=/www8-hp.com/gfwlist\nserver=/mini-me.com/127.0.0.1#5335\nipset=/mini-me.com/gfwlist\nserver=/hbogoasia.com/127.0.0.1#5335\nipset=/hbogoasia.com/gfwlist\nserver=/touchsmartpc.org/127.0.0.1#5335\nipset=/touchsmartpc.org/gfwlist\nserver=/bmw-clubs-international.com/127.0.0.1#5335\nipset=/bmw-clubs-international.com/gfwlist\nserver=/oup.com/127.0.0.1#5335\nipset=/oup.com/gfwlist\nserver=/nine.com.au/127.0.0.1#5335\nipset=/nine.com.au/gfwlist\nserver=/premobay.com/127.0.0.1#5335\nipset=/premobay.com/gfwlist\nserver=/pornmz.com/127.0.0.1#5335\nipset=/pornmz.com/gfwlist\nserver=/adulters.org/127.0.0.1#5335\nipset=/adulters.org/gfwlist\nserver=/pinterest.id/127.0.0.1#5335\nipset=/pinterest.id/gfwlist\nserver=/serviceshp.com/127.0.0.1#5335\nipset=/serviceshp.com/gfwlist\nserver=/printspots.net/127.0.0.1#5335\nipset=/printspots.net/gfwlist\nserver=/printspots.com/127.0.0.1#5335\nipset=/printspots.com/gfwlist\nserver=/jenporno.cz/127.0.0.1#5335\nipset=/jenporno.cz/gfwlist\nserver=/bmw-ksa.com/127.0.0.1#5335\nipset=/bmw-ksa.com/gfwlist\nserver=/printersetupsupport.com/127.0.0.1#5335\nipset=/printersetupsupport.com/gfwlist\nserver=/wholefoodsmarket.co.uk/127.0.0.1#5335\nipset=/wholefoodsmarket.co.uk/gfwlist\nserver=/intel.by/127.0.0.1#5335\nipset=/intel.by/gfwlist\nserver=/starbucks.no/127.0.0.1#5335\nipset=/starbucks.no/gfwlist\nserver=/heads-ak-spotify-com.akamaized.net/127.0.0.1#5335\nipset=/heads-ak-spotify-com.akamaized.net/gfwlist\nserver=/porstoporno.site/127.0.0.1#5335\nipset=/porstoporno.site/gfwlist\nserver=/instantink.com/127.0.0.1#5335\nipset=/instantink.com/gfwlist\nserver=/i-123-hp.com/127.0.0.1#5335\nipset=/i-123-hp.com/gfwlist\nserver=/vivaldi.com/127.0.0.1#5335\nipset=/vivaldi.com/gfwlist\nserver=/hpwallart.com/127.0.0.1#5335\nipset=/hpwallart.com/gfwlist\nserver=/wsj.net/127.0.0.1#5335\nipset=/wsj.net/gfwlist\nserver=/fbmarketing.com/127.0.0.1#5335\nipset=/fbmarketing.com/gfwlist\nserver=/google.com.ly/127.0.0.1#5335\nipset=/google.com.ly/gfwlist\nserver=/hpveer.com/127.0.0.1#5335\nipset=/hpveer.com/gfwlist\nserver=/freeav.tv/127.0.0.1#5335\nipset=/freeav.tv/gfwlist\nserver=/hptrainingcenter.com/127.0.0.1#5335\nipset=/hptrainingcenter.com/gfwlist\nserver=/chatwhores.tv/127.0.0.1#5335\nipset=/chatwhores.tv/gfwlist\nserver=/hptouch.com/127.0.0.1#5335\nipset=/hptouch.com/gfwlist\nserver=/scholar.google.co.kr/127.0.0.1#5335\nipset=/scholar.google.co.kr/gfwlist\nserver=/deiightfuidates.net/127.0.0.1#5335\nipset=/deiightfuidates.net/gfwlist\nserver=/didilist.com/127.0.0.1#5335\nipset=/didilist.com/gfwlist\nserver=/acces-vod.com/127.0.0.1#5335\nipset=/acces-vod.com/gfwlist\nserver=/amodoll.com/127.0.0.1#5335\nipset=/amodoll.com/gfwlist\nserver=/azureplanetscale.net/127.0.0.1#5335\nipset=/azureplanetscale.net/gfwlist\nserver=/scnsrc.me/127.0.0.1#5335\nipset=/scnsrc.me/gfwlist\nserver=/privatemarketplaces.net/127.0.0.1#5335\nipset=/privatemarketplaces.net/gfwlist\nserver=/mobilemarketo.com/127.0.0.1#5335\nipset=/mobilemarketo.com/gfwlist\nserver=/addthiscdn.com/127.0.0.1#5335\nipset=/addthiscdn.com/gfwlist\nserver=/xvidzz.com/127.0.0.1#5335\nipset=/xvidzz.com/gfwlist\nserver=/elog-ch.net/127.0.0.1#5335\nipset=/elog-ch.net/gfwlist\nserver=/hpstore-china.com/127.0.0.1#5335\nipset=/hpstore-china.com/gfwlist\nserver=/aflamporn.com/127.0.0.1#5335\nipset=/aflamporn.com/gfwlist\nserver=/thanksloyalty.com/127.0.0.1#5335\nipset=/thanksloyalty.com/gfwlist\nserver=/beatsireland.net/127.0.0.1#5335\nipset=/beatsireland.net/gfwlist\nserver=/my29tv.com/127.0.0.1#5335\nipset=/my29tv.com/gfwlist\nserver=/mini-ksa.com/127.0.0.1#5335\nipset=/mini-ksa.com/gfwlist\nserver=/badvirtue.com/127.0.0.1#5335\nipset=/badvirtue.com/gfwlist\nserver=/nextmedia.com/127.0.0.1#5335\nipset=/nextmedia.com/gfwlist\nserver=/hpsprocket.com/127.0.0.1#5335\nipset=/hpsprocket.com/gfwlist\nserver=/sandisk.it/127.0.0.1#5335\nipset=/sandisk.it/gfwlist\nserver=/bby.com/127.0.0.1#5335\nipset=/bby.com/gfwlist\nserver=/lolstatic-a.akamaihd.net/127.0.0.1#5335\nipset=/lolstatic-a.akamaihd.net/gfwlist\nserver=/inikesneakers.com/127.0.0.1#5335\nipset=/inikesneakers.com/gfwlist\nserver=/ghostgames.com/127.0.0.1#5335\nipset=/ghostgames.com/gfwlist\nserver=/omafotze.com/127.0.0.1#5335\nipset=/omafotze.com/gfwlist\nserver=/youtube.sk/127.0.0.1#5335\nipset=/youtube.sk/gfwlist\nserver=/91tv.tw/127.0.0.1#5335\nipset=/91tv.tw/gfwlist\nserver=/hpsmartupdate.com/127.0.0.1#5335\nipset=/hpsmartupdate.com/gfwlist\nserver=/youtube.pe/127.0.0.1#5335\nipset=/youtube.pe/gfwlist\nserver=/foxhq.com/127.0.0.1#5335\nipset=/foxhq.com/gfwlist\nserver=/fedoramagazine.org/127.0.0.1#5335\nipset=/fedoramagazine.org/gfwlist\nserver=/volvogroup.de/127.0.0.1#5335\nipset=/volvogroup.de/gfwlist\nserver=/bridgestone.com.ar/127.0.0.1#5335\nipset=/bridgestone.com.ar/gfwlist\nserver=/niketradeweb.com/127.0.0.1#5335\nipset=/niketradeweb.com/gfwlist\nserver=/nsfw247.to/127.0.0.1#5335\nipset=/nsfw247.to/gfwlist\nserver=/fosebook.com/127.0.0.1#5335\nipset=/fosebook.com/gfwlist\nserver=/hpsmarts.com/127.0.0.1#5335\nipset=/hpsmarts.com/gfwlist\nserver=/symcb.com/127.0.0.1#5335\nipset=/symcb.com/gfwlist\nserver=/adsense.com/127.0.0.1#5335\nipset=/adsense.com/gfwlist\nserver=/hpsmart.com/127.0.0.1#5335\nipset=/hpsmart.com/gfwlist\nserver=/want-media.com/127.0.0.1#5335\nipset=/want-media.com/gfwlist\nserver=/hpshopping.hk/127.0.0.1#5335\nipset=/hpshopping.hk/gfwlist\nserver=/nikeairmax.com/127.0.0.1#5335\nipset=/nikeairmax.com/gfwlist\nserver=/ratedgross.com/127.0.0.1#5335\nipset=/ratedgross.com/gfwlist\nserver=/hpshoping.com/127.0.0.1#5335\nipset=/hpshoping.com/gfwlist\nserver=/toppornoduro.com/127.0.0.1#5335\nipset=/toppornoduro.com/gfwlist\nserver=/inmediahk.net/127.0.0.1#5335\nipset=/inmediahk.net/gfwlist\nserver=/pcmarket.com.hk/127.0.0.1#5335\nipset=/pcmarket.com.hk/gfwlist\nserver=/cometotheduckside.com/127.0.0.1#5335\nipset=/cometotheduckside.com/gfwlist\nserver=/hpshop.com/127.0.0.1#5335\nipset=/hpshop.com/gfwlist\nserver=/hpdesignjetl25500.com/127.0.0.1#5335\nipset=/hpdesignjetl25500.com/gfwlist\nserver=/asiancamgirllive.com/127.0.0.1#5335\nipset=/asiancamgirllive.com/gfwlist\nserver=/fapmovz.com/127.0.0.1#5335\nipset=/fapmovz.com/gfwlist\nserver=/crowdtangle.com/127.0.0.1#5335\nipset=/crowdtangle.com/gfwlist\nserver=/currenttime.tv/127.0.0.1#5335\nipset=/currenttime.tv/gfwlist\nserver=/hpserver.com/127.0.0.1#5335\nipset=/hpserver.com/gfwlist\nserver=/hpsalescentral.com/127.0.0.1#5335\nipset=/hpsalescentral.com/gfwlist\nserver=/volvobuses.co/127.0.0.1#5335\nipset=/volvobuses.co/gfwlist\nserver=/pornocomic.net/127.0.0.1#5335\nipset=/pornocomic.net/gfwlist\nserver=/ipfs.io/127.0.0.1#5335\nipset=/ipfs.io/gfwlist\nserver=/directvadsales.com/127.0.0.1#5335\nipset=/directvadsales.com/gfwlist\nserver=/volvotrucks.com/127.0.0.1#5335\nipset=/volvotrucks.com/gfwlist\nserver=/hentaiz.vip/127.0.0.1#5335\nipset=/hentaiz.vip/gfwlist\nserver=/hpprinterdrivers.com/127.0.0.1#5335\nipset=/hpprinterdrivers.com/gfwlist\nserver=/hpphotoscanners.com/127.0.0.1#5335\nipset=/hpphotoscanners.com/gfwlist\nserver=/hppage5000.com/127.0.0.1#5335\nipset=/hppage5000.com/gfwlist\nserver=/slack-redir.net/127.0.0.1#5335\nipset=/slack-redir.net/gfwlist\nserver=/youtube.com.by/127.0.0.1#5335\nipset=/youtube.com.by/gfwlist\nserver=/thaicuties.com/127.0.0.1#5335\nipset=/thaicuties.com/gfwlist\nserver=/hponlinehelp.com/127.0.0.1#5335\nipset=/hponlinehelp.com/gfwlist\nserver=/dengeamerika.com/127.0.0.1#5335\nipset=/dengeamerika.com/gfwlist\nserver=/mastercardmoments.com/127.0.0.1#5335\nipset=/mastercardmoments.com/gfwlist\nserver=/fesebook.com/127.0.0.1#5335\nipset=/fesebook.com/gfwlist\nserver=/hpmobile.com/127.0.0.1#5335\nipset=/hpmobile.com/gfwlist\nserver=/twitcomike.jp/127.0.0.1#5335\nipset=/twitcomike.jp/gfwlist\nserver=/mut.ch/127.0.0.1#5335\nipset=/mut.ch/gfwlist\nserver=/hpmicrcartridge.com/127.0.0.1#5335\nipset=/hpmicrcartridge.com/gfwlist\nserver=/hpmemorychips.com/127.0.0.1#5335\nipset=/hpmemorychips.com/gfwlist\nserver=/apple.be/127.0.0.1#5335\nipset=/apple.be/gfwlist\nserver=/youtube.com.uy/127.0.0.1#5335\nipset=/youtube.com.uy/gfwlist\nserver=/verizonbusinessfios.com/127.0.0.1#5335\nipset=/verizonbusinessfios.com/gfwlist\nserver=/iphone4s.com/127.0.0.1#5335\nipset=/iphone4s.com/gfwlist\nserver=/eporner.com/127.0.0.1#5335\nipset=/eporner.com/gfwlist\nserver=/alibabacloud.com/127.0.0.1#5335\nipset=/alibabacloud.com/gfwlist\nserver=/dettolthailand.com/127.0.0.1#5335\nipset=/dettolthailand.com/gfwlist\nserver=/mastercard.qa/127.0.0.1#5335\nipset=/mastercard.qa/gfwlist\nserver=/mythicentertainment.com/127.0.0.1#5335\nipset=/mythicentertainment.com/gfwlist\nserver=/hpkeyboard.com/127.0.0.1#5335\nipset=/hpkeyboard.com/gfwlist\nserver=/hpinstantink.com/127.0.0.1#5335\nipset=/hpinstantink.com/gfwlist\nserver=/facebooklive.com/127.0.0.1#5335\nipset=/facebooklive.com/gfwlist\nserver=/hpinc.net/127.0.0.1#5335\nipset=/hpinc.net/gfwlist\nserver=/foxsports.com.gt/127.0.0.1#5335\nipset=/foxsports.com.gt/gfwlist\nserver=/hpinc.info/127.0.0.1#5335\nipset=/hpinc.info/gfwlist\nserver=/crystalmiss.com/127.0.0.1#5335\nipset=/crystalmiss.com/gfwlist\nserver=/ekhokavkaza.com/127.0.0.1#5335\nipset=/ekhokavkaza.com/gfwlist\nserver=/paypaly.com/127.0.0.1#5335\nipset=/paypaly.com/gfwlist\nserver=/images-amazon.com/127.0.0.1#5335\nipset=/images-amazon.com/gfwlist\nserver=/hpgpas.com/127.0.0.1#5335\nipset=/hpgpas.com/gfwlist\nserver=/pornovesem.tv/127.0.0.1#5335\nipset=/pornovesem.tv/gfwlist\nserver=/visaplus.com/127.0.0.1#5335\nipset=/visaplus.com/gfwlist\nserver=/cheap-beats-by-dre.net/127.0.0.1#5335\nipset=/cheap-beats-by-dre.net/gfwlist\nserver=/tube188.com/127.0.0.1#5335\nipset=/tube188.com/gfwlist\nserver=/pornmate.com/127.0.0.1#5335\nipset=/pornmate.com/gfwlist\nserver=/facebookmobile.com/127.0.0.1#5335\nipset=/facebookmobile.com/gfwlist\nserver=/cashpassport.net/127.0.0.1#5335\nipset=/cashpassport.net/gfwlist\nserver=/cheapdrebeats8.net/127.0.0.1#5335\nipset=/cheapdrebeats8.net/gfwlist\nserver=/cnnmoney.com/127.0.0.1#5335\nipset=/cnnmoney.com/gfwlist\nserver=/ntdtv.kr/127.0.0.1#5335\nipset=/ntdtv.kr/gfwlist\nserver=/hpfaqs.com/127.0.0.1#5335\nipset=/hpfaqs.com/gfwlist\nserver=/itunes.com/127.0.0.1#5335\nipset=/itunes.com/gfwlist\nserver=/stripe.network/127.0.0.1#5335\nipset=/stripe.network/gfwlist\nserver=/hpeprint.com/127.0.0.1#5335\nipset=/hpeprint.com/gfwlist\nserver=/hpengage.com/127.0.0.1#5335\nipset=/hpengage.com/gfwlist\nserver=/auricularemonsterbeats.com/127.0.0.1#5335\nipset=/auricularemonsterbeats.com/gfwlist\nserver=/amazon-launchpad.com/127.0.0.1#5335\nipset=/amazon-launchpad.com/gfwlist\nserver=/ubistatic3-a.akamaihd.net/127.0.0.1#5335\nipset=/ubistatic3-a.akamaihd.net/gfwlist\nserver=/hpdownloadstore.com/127.0.0.1#5335\nipset=/hpdownloadstore.com/gfwlist\nserver=/datawav.club/127.0.0.1#5335\nipset=/datawav.club/gfwlist\nserver=/asus.com/127.0.0.1#5335\nipset=/asus.com/gfwlist\nserver=/hpdesktopcomputer.com/127.0.0.1#5335\nipset=/hpdesktopcomputer.com/gfwlist\nserver=/hpdaas.com/127.0.0.1#5335\nipset=/hpdaas.com/gfwlist\nserver=/tvcastlive-hamivideo.cdn.hinet.net/127.0.0.1#5335\nipset=/tvcastlive-hamivideo.cdn.hinet.net/gfwlist\nserver=/bridgestone.cl/127.0.0.1#5335\nipset=/bridgestone.cl/gfwlist\nserver=/hpcustomersupport.com/127.0.0.1#5335\nipset=/hpcustomersupport.com/gfwlist\nserver=/hpcu.org/127.0.0.1#5335\nipset=/hpcu.org/gfwlist\nserver=/your-server.de/127.0.0.1#5335\nipset=/your-server.de/gfwlist\nserver=/bingads.com/127.0.0.1#5335\nipset=/bingads.com/gfwlist\nserver=/scholar.google.is/127.0.0.1#5335\nipset=/scholar.google.is/gfwlist\nserver=/eilieili.cc/127.0.0.1#5335\nipset=/eilieili.cc/gfwlist\nserver=/scholar.google.com.pe/127.0.0.1#5335\nipset=/scholar.google.com.pe/gfwlist\nserver=/foxsports.uy/127.0.0.1#5335\nipset=/foxsports.uy/gfwlist\nserver=/jav19.com/127.0.0.1#5335\nipset=/jav19.com/gfwlist\nserver=/faceid99.com/127.0.0.1#5335\nipset=/faceid99.com/gfwlist\nserver=/voxfieldguide.com/127.0.0.1#5335\nipset=/voxfieldguide.com/gfwlist\nserver=/hpconnectedstage.com/127.0.0.1#5335\nipset=/hpconnectedstage.com/gfwlist\nserver=/bikaios.xyz/127.0.0.1#5335\nipset=/bikaios.xyz/gfwlist\nserver=/freeporn.com/127.0.0.1#5335\nipset=/freeporn.com/gfwlist\nserver=/dvdstudiopro.org/127.0.0.1#5335\nipset=/dvdstudiopro.org/gfwlist\nserver=/hpconnected.org/127.0.0.1#5335\nipset=/hpconnected.org/gfwlist\nserver=/coova.org/127.0.0.1#5335\nipset=/coova.org/gfwlist\nserver=/kundun1069.com/127.0.0.1#5335\nipset=/kundun1069.com/gfwlist\nserver=/hpcmw.net/127.0.0.1#5335\nipset=/hpcmw.net/gfwlist\nserver=/ikea.co.il/127.0.0.1#5335\nipset=/ikea.co.il/gfwlist\nserver=/shoers.com/127.0.0.1#5335\nipset=/shoers.com/gfwlist\nserver=/vnanchoi.ca/127.0.0.1#5335\nipset=/vnanchoi.ca/gfwlist\nserver=/change.org/127.0.0.1#5335\nipset=/change.org/gfwlist\nserver=/google.so/127.0.0.1#5335\nipset=/google.so/gfwlist\nserver=/paily.net/127.0.0.1#5335\nipset=/paily.net/gfwlist\nserver=/wsjwine.com/127.0.0.1#5335\nipset=/wsjwine.com/gfwlist\nserver=/hpbluecarpet.net/127.0.0.1#5335\nipset=/hpbluecarpet.net/gfwlist\nserver=/hpbluecarpet.com/127.0.0.1#5335\nipset=/hpbluecarpet.com/gfwlist\nserver=/ecert.gov.hk/127.0.0.1#5335\nipset=/ecert.gov.hk/gfwlist\nserver=/9hentai.ru/127.0.0.1#5335\nipset=/9hentai.ru/gfwlist\nserver=/fuckbookecuador.com/127.0.0.1#5335\nipset=/fuckbookecuador.com/gfwlist\nserver=/hpallinoneprinter.com/127.0.0.1#5335\nipset=/hpallinoneprinter.com/gfwlist\nserver=/mastercard.co.il/127.0.0.1#5335\nipset=/mastercard.co.il/gfwlist\nserver=/bmw-motorrad.ca/127.0.0.1#5335\nipset=/bmw-motorrad.ca/gfwlist\nserver=/adultcamslover.com/127.0.0.1#5335\nipset=/adultcamslover.com/gfwlist\nserver=/ikea.hk/127.0.0.1#5335\nipset=/ikea.hk/gfwlist\nserver=/api.viu.now.com/127.0.0.1#5335\nipset=/api.viu.now.com/gfwlist\nserver=/disney.co.uk/127.0.0.1#5335\nipset=/disney.co.uk/gfwlist\nserver=/mofos.com/127.0.0.1#5335\nipset=/mofos.com/gfwlist\nserver=/mwf-service.akamaized.net/127.0.0.1#5335\nipset=/mwf-service.akamaized.net/gfwlist\nserver=/unusualporn.net/127.0.0.1#5335\nipset=/unusualporn.net/gfwlist\nserver=/financeleadsonline.com/127.0.0.1#5335\nipset=/financeleadsonline.com/gfwlist\nserver=/hp.io/127.0.0.1#5335\nipset=/hp.io/gfwlist\nserver=/adultmagazinespdf.com/127.0.0.1#5335\nipset=/adultmagazinespdf.com/gfwlist\nserver=/4myminicard.com/127.0.0.1#5335\nipset=/4myminicard.com/gfwlist\nserver=/69vj.com/127.0.0.1#5335\nipset=/69vj.com/gfwlist\nserver=/sa78gs.wpc.edgecastcdn.net/127.0.0.1#5335\nipset=/sa78gs.wpc.edgecastcdn.net/gfwlist\nserver=/alpherafs.in/127.0.0.1#5335\nipset=/alpherafs.in/gfwlist\nserver=/duckduckgo.org/127.0.0.1#5335\nipset=/duckduckgo.org/gfwlist\nserver=/hotmail.com/127.0.0.1#5335\nipset=/hotmail.com/gfwlist\nserver=/hp-mns.com/127.0.0.1#5335\nipset=/hp-mns.com/gfwlist\nserver=/hp-invent.info/127.0.0.1#5335\nipset=/hp-invent.info/gfwlist\nserver=/hp-infolab.com/127.0.0.1#5335\nipset=/hp-infolab.com/gfwlist\nserver=/nhentaihaven.org/127.0.0.1#5335\nipset=/nhentaihaven.org/gfwlist\nserver=/hp-imagine.com/127.0.0.1#5335\nipset=/hp-imagine.com/gfwlist\nserver=/gaming-notebooks.com/127.0.0.1#5335\nipset=/gaming-notebooks.com/gfwlist\nserver=/e-cba.org/127.0.0.1#5335\nipset=/e-cba.org/gfwlist\nserver=/cheapshoesvip.com/127.0.0.1#5335\nipset=/cheapshoesvip.com/gfwlist\nserver=/optica.org/127.0.0.1#5335\nipset=/optica.org/gfwlist\nserver=/businessinsider.de/127.0.0.1#5335\nipset=/businessinsider.de/gfwlist\nserver=/compaq.org/127.0.0.1#5335\nipset=/compaq.org/gfwlist\nserver=/filesmonster.vip/127.0.0.1#5335\nipset=/filesmonster.vip/gfwlist\nserver=/dianepoppos.com/127.0.0.1#5335\nipset=/dianepoppos.com/gfwlist\nserver=/campushp.com/127.0.0.1#5335\nipset=/campushp.com/gfwlist\nserver=/pornlistdude.com/127.0.0.1#5335\nipset=/pornlistdude.com/gfwlist\nserver=/diyarbakirescort.com/127.0.0.1#5335\nipset=/diyarbakirescort.com/gfwlist\nserver=/supermariorun.com/127.0.0.1#5335\nipset=/supermariorun.com/gfwlist\nserver=/faebookc.com/127.0.0.1#5335\nipset=/faebookc.com/gfwlist\nserver=/fox5atlanta.com/127.0.0.1#5335\nipset=/fox5atlanta.com/gfwlist\nserver=/fecbbok.com/127.0.0.1#5335\nipset=/fecbbok.com/gfwlist\nserver=/hexdocs.pm/127.0.0.1#5335\nipset=/hexdocs.pm/gfwlist\nserver=/travelex.qa/127.0.0.1#5335\nipset=/travelex.qa/gfwlist\nserver=/nudeeroticteens.com/127.0.0.1#5335\nipset=/nudeeroticteens.com/gfwlist\nserver=/scdn.co/127.0.0.1#5335\nipset=/scdn.co/gfwlist\nserver=/fantasti.cc/127.0.0.1#5335\nipset=/fantasti.cc/gfwlist\nserver=/ntdtv.com.tw/127.0.0.1#5335\nipset=/ntdtv.com.tw/gfwlist\nserver=/fawgaf.xyz/127.0.0.1#5335\nipset=/fawgaf.xyz/gfwlist\nserver=/jos.com/127.0.0.1#5335\nipset=/jos.com/gfwlist\nserver=/coupang.com/127.0.0.1#5335\nipset=/coupang.com/gfwlist\nserver=/bmw.ps/127.0.0.1#5335\nipset=/bmw.ps/gfwlist\nserver=/analvids.com/127.0.0.1#5335\nipset=/analvids.com/gfwlist\nserver=/fpacebook.com/127.0.0.1#5335\nipset=/fpacebook.com/gfwlist\nserver=/damduc.org/127.0.0.1#5335\nipset=/damduc.org/gfwlist\nserver=/vod-thumb-ww-live.akamaized.net/127.0.0.1#5335\nipset=/vod-thumb-ww-live.akamaized.net/gfwlist\nserver=/kraken.com/127.0.0.1#5335\nipset=/kraken.com/gfwlist\nserver=/instagramtips.com/127.0.0.1#5335\nipset=/instagramtips.com/gfwlist\nserver=/csifund.org/127.0.0.1#5335\nipset=/csifund.org/gfwlist\nserver=/durex.co.za/127.0.0.1#5335\nipset=/durex.co.za/gfwlist\nserver=/shopminiusa.com/127.0.0.1#5335\nipset=/shopminiusa.com/gfwlist\nserver=/thepervs.com/127.0.0.1#5335\nipset=/thepervs.com/gfwlist\nserver=/chtf.org.tw/127.0.0.1#5335\nipset=/chtf.org.tw/gfwlist\nserver=/steam.cdn.webra.ru/127.0.0.1#5335\nipset=/steam.cdn.webra.ru/gfwlist\nserver=/onlyprime.ru/127.0.0.1#5335\nipset=/onlyprime.ru/gfwlist\nserver=/orgyxxxhub.com/127.0.0.1#5335\nipset=/orgyxxxhub.com/gfwlist\nserver=/16honeys.com/127.0.0.1#5335\nipset=/16honeys.com/gfwlist\nserver=/appleiservices.com/127.0.0.1#5335\nipset=/appleiservices.com/gfwlist\nserver=/love6.tv/127.0.0.1#5335\nipset=/love6.tv/gfwlist\nserver=/kimchi.tv/127.0.0.1#5335\nipset=/kimchi.tv/gfwlist\nserver=/bedstegratisporno.com/127.0.0.1#5335\nipset=/bedstegratisporno.com/gfwlist\nserver=/hetzner.com/127.0.0.1#5335\nipset=/hetzner.com/gfwlist\nserver=/hetzner.cloud/127.0.0.1#5335\nipset=/hetzner.cloud/gfwlist\nserver=/dropboxusercontent.com/127.0.0.1#5335\nipset=/dropboxusercontent.com/gfwlist\nserver=/quicktime.tv/127.0.0.1#5335\nipset=/quicktime.tv/gfwlist\nserver=/att-idns.net/127.0.0.1#5335\nipset=/att-idns.net/gfwlist\nserver=/lollipopescorts.com/127.0.0.1#5335\nipset=/lollipopescorts.com/gfwlist\nserver=/nbcudigitaladops.com/127.0.0.1#5335\nipset=/nbcudigitaladops.com/gfwlist\nserver=/authy.com/127.0.0.1#5335\nipset=/authy.com/gfwlist\nserver=/mini-stjohns.com/127.0.0.1#5335\nipset=/mini-stjohns.com/gfwlist\nserver=/bmw-motorrad.at/127.0.0.1#5335\nipset=/bmw-motorrad.at/gfwlist\nserver=/xn--ggle-55da.com/127.0.0.1#5335\nipset=/xn--ggle-55da.com/gfwlist\nserver=/xn--flw351e.com/127.0.0.1#5335\nipset=/xn--flw351e.com/gfwlist\nserver=/mastercard.ie/127.0.0.1#5335\nipset=/mastercard.ie/gfwlist\nserver=/swisssign.li/127.0.0.1#5335\nipset=/swisssign.li/gfwlist\nserver=/pinkporno.com/127.0.0.1#5335\nipset=/pinkporno.com/gfwlist\nserver=/oreil.ly/127.0.0.1#5335\nipset=/oreil.ly/gfwlist\nserver=/intellinuxgraphics.net/127.0.0.1#5335\nipset=/intellinuxgraphics.net/gfwlist\nserver=/lencr.org/127.0.0.1#5335\nipset=/lencr.org/gfwlist\nserver=/avstar04.me/127.0.0.1#5335\nipset=/avstar04.me/gfwlist\nserver=/waterdamagesandiego.org/127.0.0.1#5335\nipset=/waterdamagesandiego.org/gfwlist\nserver=/ibeats-uk.com/127.0.0.1#5335\nipset=/ibeats-uk.com/gfwlist\nserver=/homepornvideo.net/127.0.0.1#5335\nipset=/homepornvideo.net/gfwlist\nserver=/reactjs.com/127.0.0.1#5335\nipset=/reactjs.com/gfwlist\nserver=/apornotube.net/127.0.0.1#5335\nipset=/apornotube.net/gfwlist\nserver=/ebay.com.au/127.0.0.1#5335\nipset=/ebay.com.au/gfwlist\nserver=/gay.bingo/127.0.0.1#5335\nipset=/gay.bingo/gfwlist\nserver=/withgoogle.com/127.0.0.1#5335\nipset=/withgoogle.com/gfwlist\nserver=/hentai01.com/127.0.0.1#5335\nipset=/hentai01.com/gfwlist\nserver=/apple.us/127.0.0.1#5335\nipset=/apple.us/gfwlist\nserver=/keiba.net/127.0.0.1#5335\nipset=/keiba.net/gfwlist\nserver=/dns.sb/127.0.0.1#5335\nipset=/dns.sb/gfwlist\nserver=/erolabs.game/127.0.0.1#5335\nipset=/erolabs.game/gfwlist\nserver=/launchpad.wang/127.0.0.1#5335\nipset=/launchpad.wang/gfwlist\nserver=/forhertube.com/127.0.0.1#5335\nipset=/forhertube.com/gfwlist\nserver=/teamskeet.com/127.0.0.1#5335\nipset=/teamskeet.com/gfwlist\nserver=/mac-mini.com/127.0.0.1#5335\nipset=/mac-mini.com/gfwlist\nserver=/stripecdn.com/127.0.0.1#5335\nipset=/stripecdn.com/gfwlist\nserver=/koreanpornmovie.com/127.0.0.1#5335\nipset=/koreanpornmovie.com/gfwlist\nserver=/vscode-sync-insiders.trafficmanager.net/127.0.0.1#5335\nipset=/vscode-sync-insiders.trafficmanager.net/gfwlist\nserver=/bmw-motorrad-dubai.com/127.0.0.1#5335\nipset=/bmw-motorrad-dubai.com/gfwlist\nserver=/webappfieldguide.com/127.0.0.1#5335\nipset=/webappfieldguide.com/gfwlist\nserver=/vmwidm.com/127.0.0.1#5335\nipset=/vmwidm.com/gfwlist\nserver=/waze.com/127.0.0.1#5335\nipset=/waze.com/gfwlist\nserver=/waymo.com/127.0.0.1#5335\nipset=/waymo.com/gfwlist\nserver=/fnacebook.com/127.0.0.1#5335\nipset=/fnacebook.com/gfwlist\nserver=/fox10.tv/127.0.0.1#5335\nipset=/fox10.tv/gfwlist\nserver=/fox7.com/127.0.0.1#5335\nipset=/fox7.com/gfwlist\nserver=/ebayclub.com/127.0.0.1#5335\nipset=/ebayclub.com/gfwlist\nserver=/bmw-grouparchiv.de/127.0.0.1#5335\nipset=/bmw-grouparchiv.de/gfwlist\nserver=/verilystudywatch.org/127.0.0.1#5335\nipset=/verilystudywatch.org/gfwlist\nserver=/casoneexchange.com/127.0.0.1#5335\nipset=/casoneexchange.com/gfwlist\nserver=/verilystudywatch.com/127.0.0.1#5335\nipset=/verilystudywatch.com/gfwlist\nserver=/aokwholesale.net/127.0.0.1#5335\nipset=/aokwholesale.net/gfwlist\nserver=/fapcat.com/127.0.0.1#5335\nipset=/fapcat.com/gfwlist\nserver=/cobatt.com/127.0.0.1#5335\nipset=/cobatt.com/gfwlist\nserver=/soccerfinancier.ca/127.0.0.1#5335\nipset=/soccerfinancier.ca/gfwlist\nserver=/cumteenporn.com/127.0.0.1#5335\nipset=/cumteenporn.com/gfwlist\nserver=/seiroganmania.com/127.0.0.1#5335\nipset=/seiroganmania.com/gfwlist\nserver=/watchindianporn.net/127.0.0.1#5335\nipset=/watchindianporn.net/gfwlist\nserver=/discord.com/127.0.0.1#5335\nipset=/discord.com/gfwlist\nserver=/hotmonsterbeats.com/127.0.0.1#5335\nipset=/hotmonsterbeats.com/gfwlist\nserver=/bienvenuechezbestbuy.ca/127.0.0.1#5335\nipset=/bienvenuechezbestbuy.ca/gfwlist\nserver=/minifs.com/127.0.0.1#5335\nipset=/minifs.com/gfwlist\nserver=/pornaroma.com/127.0.0.1#5335\nipset=/pornaroma.com/gfwlist\nserver=/unfiltered.news/127.0.0.1#5335\nipset=/unfiltered.news/gfwlist\nserver=/aclweb.org/127.0.0.1#5335\nipset=/aclweb.org/gfwlist\nserver=/ffprofile.com/127.0.0.1#5335\nipset=/ffprofile.com/gfwlist\nserver=/scholar.google.com.ni/127.0.0.1#5335\nipset=/scholar.google.com.ni/gfwlist\nserver=/txvia.com/127.0.0.1#5335\nipset=/txvia.com/gfwlist\nserver=/cbsiam.com/127.0.0.1#5335\nipset=/cbsiam.com/gfwlist\nserver=/vbejeyv.shop/127.0.0.1#5335\nipset=/vbejeyv.shop/gfwlist\nserver=/youtube.com.mk/127.0.0.1#5335\nipset=/youtube.com.mk/gfwlist\nserver=/mysocialworklab.com/127.0.0.1#5335\nipset=/mysocialworklab.com/gfwlist\nserver=/thinkquarterly.com/127.0.0.1#5335\nipset=/thinkquarterly.com/gfwlist\nserver=/youtube.co.ve/127.0.0.1#5335\nipset=/youtube.co.ve/gfwlist\nserver=/vscode.dev/127.0.0.1#5335\nipset=/vscode.dev/gfwlist\nserver=/yammer.com/127.0.0.1#5335\nipset=/yammer.com/gfwlist\nserver=/analpornonly.com/127.0.0.1#5335\nipset=/analpornonly.com/gfwlist\nserver=/02weqj32.com/127.0.0.1#5335\nipset=/02weqj32.com/gfwlist\nserver=/volvogroup.jp/127.0.0.1#5335\nipset=/volvogroup.jp/gfwlist\nserver=/launchpadlibrarian.com/127.0.0.1#5335\nipset=/launchpadlibrarian.com/gfwlist\nserver=/vs-cmaf-push-uk-live.akamaized.net/127.0.0.1#5335\nipset=/vs-cmaf-push-uk-live.akamaized.net/gfwlist\nserver=/hath.network/127.0.0.1#5335\nipset=/hath.network/gfwlist\nserver=/mathoverflow.net/127.0.0.1#5335\nipset=/mathoverflow.net/gfwlist\nserver=/sony-hes.co.jp/127.0.0.1#5335\nipset=/sony-hes.co.jp/gfwlist\nserver=/synergyse.com/127.0.0.1#5335\nipset=/synergyse.com/gfwlist\nserver=/blogspot.sg/127.0.0.1#5335\nipset=/blogspot.sg/gfwlist\nserver=/matureladiesxxx.com/127.0.0.1#5335\nipset=/matureladiesxxx.com/gfwlist\nserver=/casque-fr.com/127.0.0.1#5335\nipset=/casque-fr.com/gfwlist\nserver=/stxmosquitoproject.com/127.0.0.1#5335\nipset=/stxmosquitoproject.com/gfwlist\nserver=/beatsbydreausale.net/127.0.0.1#5335\nipset=/beatsbydreausale.net/gfwlist\nserver=/amamanualofstyle.com/127.0.0.1#5335\nipset=/amamanualofstyle.com/gfwlist\nserver=/getbraintree.com/127.0.0.1#5335\nipset=/getbraintree.com/gfwlist\nserver=/realclearpublicaffairs.com/127.0.0.1#5335\nipset=/realclearpublicaffairs.com/gfwlist\nserver=/webex.co.kr/127.0.0.1#5335\nipset=/webex.co.kr/gfwlist\nserver=/animalpornxxx.me/127.0.0.1#5335\nipset=/animalpornxxx.me/gfwlist\nserver=/faceboo.com/127.0.0.1#5335\nipset=/faceboo.com/gfwlist\nserver=/stcroixmosquitoproject.com/127.0.0.1#5335\nipset=/stcroixmosquitoproject.com/gfwlist\nserver=/beddit.tv/127.0.0.1#5335\nipset=/beddit.tv/gfwlist\nserver=/stcroixmosquito.com/127.0.0.1#5335\nipset=/stcroixmosquito.com/gfwlist\nserver=/mottainai.info/127.0.0.1#5335\nipset=/mottainai.info/gfwlist\nserver=/mirrorsedge.com/127.0.0.1#5335\nipset=/mirrorsedge.com/gfwlist\nserver=/realclearscience.com/127.0.0.1#5335\nipset=/realclearscience.com/gfwlist\nserver=/fictionmania.tv/127.0.0.1#5335\nipset=/fictionmania.tv/gfwlist\nserver=/solveforx.com/127.0.0.1#5335\nipset=/solveforx.com/gfwlist\nserver=/cashpassport.com.br/127.0.0.1#5335\nipset=/cashpassport.com.br/gfwlist\nserver=/alohatube.com/127.0.0.1#5335\nipset=/alohatube.com/gfwlist\nserver=/xnxx18.pro/127.0.0.1#5335\nipset=/xnxx18.pro/gfwlist\nserver=/screenwisetrendspanel.com/127.0.0.1#5335\nipset=/screenwisetrendspanel.com/gfwlist\nserver=/webobjects.de/127.0.0.1#5335\nipset=/webobjects.de/gfwlist\nserver=/saynow.com/127.0.0.1#5335\nipset=/saynow.com/gfwlist\nserver=/fi11.cn/127.0.0.1#5335\nipset=/fi11.cn/gfwlist\nserver=/run.app/127.0.0.1#5335\nipset=/run.app/gfwlist\nserver=/ridepenguin.com/127.0.0.1#5335\nipset=/ridepenguin.com/gfwlist\nserver=/setn.com/127.0.0.1#5335\nipset=/setn.com/gfwlist\nserver=/revolv.com/127.0.0.1#5335\nipset=/revolv.com/gfwlist\nserver=/gettyimages.de/127.0.0.1#5335\nipset=/gettyimages.de/gfwlist\nserver=/bmwmotorsport.com/127.0.0.1#5335\nipset=/bmwmotorsport.com/gfwlist\nserver=/colegialasdeverdad.com/127.0.0.1#5335\nipset=/colegialasdeverdad.com/gfwlist\nserver=/pvr-hamivideo.cdn.hinet.net/127.0.0.1#5335\nipset=/pvr-hamivideo.cdn.hinet.net/gfwlist\nserver=/adwordsexpress.com/127.0.0.1#5335\nipset=/adwordsexpress.com/gfwlist\nserver=/ajplus.net/127.0.0.1#5335\nipset=/ajplus.net/gfwlist\nserver=/muji.tw/127.0.0.1#5335\nipset=/muji.tw/gfwlist\nserver=/publishproxy.com/127.0.0.1#5335\nipset=/publishproxy.com/gfwlist\nserver=/google.com.au/127.0.0.1#5335\nipset=/google.com.au/gfwlist\nserver=/heavyfetish.com/127.0.0.1#5335\nipset=/heavyfetish.com/gfwlist\nserver=/thehealthsite.com/127.0.0.1#5335\nipset=/thehealthsite.com/gfwlist\nserver=/21naturals.com/127.0.0.1#5335\nipset=/21naturals.com/gfwlist\nserver=/mytokenapi.com/127.0.0.1#5335\nipset=/mytokenapi.com/gfwlist\nserver=/projectara.com/127.0.0.1#5335\nipset=/projectara.com/gfwlist\nserver=/privacysandbox.com/127.0.0.1#5335\nipset=/privacysandbox.com/gfwlist\nserver=/arewereadyyet.com/127.0.0.1#5335\nipset=/arewereadyyet.com/gfwlist\nserver=/pixate.com/127.0.0.1#5335\nipset=/pixate.com/gfwlist\nserver=/canon.com.au/127.0.0.1#5335\nipset=/canon.com.au/gfwlist\nserver=/sorairi.info/127.0.0.1#5335\nipset=/sorairi.info/gfwlist\nserver=/picnik.com/127.0.0.1#5335\nipset=/picnik.com/gfwlist\nserver=/bejav.net/127.0.0.1#5335\nipset=/bejav.net/gfwlist\nserver=/pornma.com/127.0.0.1#5335\nipset=/pornma.com/gfwlist\nserver=/myyoungmomisnude.com/127.0.0.1#5335\nipset=/myyoungmomisnude.com/gfwlist\nserver=/economistgroupcareers.com/127.0.0.1#5335\nipset=/economistgroupcareers.com/gfwlist\nserver=/charmescorts.com/127.0.0.1#5335\nipset=/charmescorts.com/gfwlist\nserver=/kijijii.ca/127.0.0.1#5335\nipset=/kijijii.ca/gfwlist\nserver=/dogofcum.com/127.0.0.1#5335\nipset=/dogofcum.com/gfwlist\nserver=/guo.media/127.0.0.1#5335\nipset=/guo.media/gfwlist\nserver=/youtube.cl/127.0.0.1#5335\nipset=/youtube.cl/gfwlist\nserver=/botframework.com/127.0.0.1#5335\nipset=/botframework.com/gfwlist\nserver=/epochtimes.se/127.0.0.1#5335\nipset=/epochtimes.se/gfwlist\nserver=/singlelogin.me/127.0.0.1#5335\nipset=/singlelogin.me/gfwlist\nserver=/visiontimes.com/127.0.0.1#5335\nipset=/visiontimes.com/gfwlist\nserver=/actalis.it/127.0.0.1#5335\nipset=/actalis.it/gfwlist\nserver=/google.is/127.0.0.1#5335\nipset=/google.is/gfwlist\nserver=/riot.com/127.0.0.1#5335\nipset=/riot.com/gfwlist\nserver=/bmw-rp.com/127.0.0.1#5335\nipset=/bmw-rp.com/gfwlist\nserver=/ebayca.org/127.0.0.1#5335\nipset=/ebayca.org/gfwlist\nserver=/grandfuckauto.xxx/127.0.0.1#5335\nipset=/grandfuckauto.xxx/gfwlist\nserver=/18schoolgirlz.me/127.0.0.1#5335\nipset=/18schoolgirlz.me/gfwlist\nserver=/oneworldmanystories.com/127.0.0.1#5335\nipset=/oneworldmanystories.com/gfwlist\nserver=/hpapplicationscenter.com/127.0.0.1#5335\nipset=/hpapplicationscenter.com/gfwlist\nserver=/mastercard.com.my/127.0.0.1#5335\nipset=/mastercard.com.my/gfwlist\nserver=/pornfuck.net/127.0.0.1#5335\nipset=/pornfuck.net/gfwlist\nserver=/on2.com/127.0.0.1#5335\nipset=/on2.com/gfwlist\nserver=/on.here/127.0.0.1#5335\nipset=/on.here/gfwlist\nserver=/cbsi.com/127.0.0.1#5335\nipset=/cbsi.com/gfwlist\nserver=/avseesee.com/127.0.0.1#5335\nipset=/avseesee.com/gfwlist\nserver=/titsbox.com/127.0.0.1#5335\nipset=/titsbox.com/gfwlist\nserver=/nest.com/127.0.0.1#5335\nipset=/nest.com/gfwlist\nserver=/near.by/127.0.0.1#5335\nipset=/near.by/gfwlist\nserver=/6sextube.com/127.0.0.1#5335\nipset=/6sextube.com/gfwlist\nserver=/girlfur.com/127.0.0.1#5335\nipset=/girlfur.com/gfwlist\nserver=/moodstocks.com/127.0.0.1#5335\nipset=/moodstocks.com/gfwlist\nserver=/appleclub.com.hk/127.0.0.1#5335\nipset=/appleclub.com.hk/gfwlist\nserver=/beatsdrdre-headphones.com/127.0.0.1#5335\nipset=/beatsdrdre-headphones.com/gfwlist\nserver=/mfg-inspector.com/127.0.0.1#5335\nipset=/mfg-inspector.com/gfwlist\nserver=/fucksexhub.com/127.0.0.1#5335\nipset=/fucksexhub.com/gfwlist\nserver=/dragonhentai.net/127.0.0.1#5335\nipset=/dragonhentai.net/gfwlist\nserver=/meet.new/127.0.0.1#5335\nipset=/meet.new/gfwlist\nserver=/hifiporn.fun/127.0.0.1#5335\nipset=/hifiporn.fun/gfwlist\nserver=/tx5ptbp7.com/127.0.0.1#5335\nipset=/tx5ptbp7.com/gfwlist\nserver=/customizedbeatsbydre.com/127.0.0.1#5335\nipset=/customizedbeatsbydre.com/gfwlist\nserver=/rapidssl.com/127.0.0.1#5335\nipset=/rapidssl.com/gfwlist\nserver=/madewithcode.com/127.0.0.1#5335\nipset=/madewithcode.com/gfwlist\nserver=/listinganalytics.net/127.0.0.1#5335\nipset=/listinganalytics.net/gfwlist\nserver=/yahoo.ae/127.0.0.1#5335\nipset=/yahoo.ae/gfwlist\nserver=/keytransparency.org/127.0.0.1#5335\nipset=/keytransparency.org/gfwlist\nserver=/xcity.jp/127.0.0.1#5335\nipset=/xcity.jp/gfwlist\nserver=/sexcord.com/127.0.0.1#5335\nipset=/sexcord.com/gfwlist\nserver=/alpherafs.com.my/127.0.0.1#5335\nipset=/alpherafs.com.my/gfwlist\nserver=/joeswall.com/127.0.0.1#5335\nipset=/joeswall.com/gfwlist\nserver=/plantsvszombies2.com/127.0.0.1#5335\nipset=/plantsvszombies2.com/gfwlist\nserver=/op.gg/127.0.0.1#5335\nipset=/op.gg/gfwlist\nserver=/ebaya.com/127.0.0.1#5335\nipset=/ebaya.com/gfwlist\nserver=/impermium.com/127.0.0.1#5335\nipset=/impermium.com/gfwlist\nserver=/only3x.com/127.0.0.1#5335\nipset=/only3x.com/gfwlist\nserver=/topadultgames.biz/127.0.0.1#5335\nipset=/topadultgames.biz/gfwlist\nserver=/amateurbdsmporn.com/127.0.0.1#5335\nipset=/amateurbdsmporn.com/gfwlist\nserver=/hwgo.com/127.0.0.1#5335\nipset=/hwgo.com/gfwlist\nserver=/hereistheporn.com/127.0.0.1#5335\nipset=/hereistheporn.com/gfwlist\nserver=/hentailabs.com/127.0.0.1#5335\nipset=/hentailabs.com/gfwlist\nserver=/playforceone.com/127.0.0.1#5335\nipset=/playforceone.com/gfwlist\nserver=/deepfake-porn.com/127.0.0.1#5335\nipset=/deepfake-porn.com/gfwlist\nserver=/adorable-teens.net/127.0.0.1#5335\nipset=/adorable-teens.net/gfwlist\nserver=/metro.co.uk/127.0.0.1#5335\nipset=/metro.co.uk/gfwlist\nserver=/ikea.com.kw/127.0.0.1#5335\nipset=/ikea.com.kw/gfwlist\nserver=/bmw-motorrad.it/127.0.0.1#5335\nipset=/bmw-motorrad.it/gfwlist\nserver=/beatbydreheadphonesonsale.com/127.0.0.1#5335\nipset=/beatbydreheadphonesonsale.com/gfwlist\nserver=/girls.xyz/127.0.0.1#5335\nipset=/girls.xyz/gfwlist\nserver=/hobonichielog.com/127.0.0.1#5335\nipset=/hobonichielog.com/gfwlist\nserver=/scholar.google.co.in/127.0.0.1#5335\nipset=/scholar.google.co.in/gfwlist\nserver=/luscious.net/127.0.0.1#5335\nipset=/luscious.net/gfwlist\nserver=/blogspot.ch/127.0.0.1#5335\nipset=/blogspot.ch/gfwlist\nserver=/smartone.com/127.0.0.1#5335\nipset=/smartone.com/gfwlist\nserver=/mobilelive-hamivideo.cdn.hinet.net/127.0.0.1#5335\nipset=/mobilelive-hamivideo.cdn.hinet.net/gfwlist\nserver=/gvt9.com/127.0.0.1#5335\nipset=/gvt9.com/gfwlist\nserver=/funshemale.com/127.0.0.1#5335\nipset=/funshemale.com/gfwlist\nserver=/wwwapplemusic.com/127.0.0.1#5335\nipset=/wwwapplemusic.com/gfwlist\nserver=/elephantlist.com/127.0.0.1#5335\nipset=/elephantlist.com/gfwlist\nserver=/tidal.com/127.0.0.1#5335\nipset=/tidal.com/gfwlist\nserver=/gvt6.com/127.0.0.1#5335\nipset=/gvt6.com/gfwlist\nserver=/bmwmotorrad.co.kr/127.0.0.1#5335\nipset=/bmwmotorrad.co.kr/gfwlist\nserver=/2013newbeatsworld.com/127.0.0.1#5335\nipset=/2013newbeatsworld.com/gfwlist\nserver=/springer.com/127.0.0.1#5335\nipset=/springer.com/gfwlist\nserver=/battlefield1943.com/127.0.0.1#5335\nipset=/battlefield1943.com/gfwlist\nserver=/gvt2.com/127.0.0.1#5335\nipset=/gvt2.com/gfwlist\nserver=/volvobuses.my/127.0.0.1#5335\nipset=/volvobuses.my/gfwlist\nserver=/4everland.io/127.0.0.1#5335\nipset=/4everland.io/gfwlist\nserver=/gvt1.com/127.0.0.1#5335\nipset=/gvt1.com/gfwlist\nserver=/bmw.dz/127.0.0.1#5335\nipset=/bmw.dz/gfwlist\nserver=/gstatic.com/127.0.0.1#5335\nipset=/gstatic.com/gfwlist\nserver=/friendfed.com/127.0.0.1#5335\nipset=/friendfed.com/gfwlist\nserver=/buyitnow.tv/127.0.0.1#5335\nipset=/buyitnow.tv/gfwlist\nserver=/ysporn.com/127.0.0.1#5335\nipset=/ysporn.com/gfwlist\nserver=/gooogle.com/127.0.0.1#5335\nipset=/gooogle.com/gfwlist\nserver=/6twseb.com/127.0.0.1#5335\nipset=/6twseb.com/gfwlist\nserver=/goolge.com/127.0.0.1#5335\nipset=/goolge.com/gfwlist\nserver=/googlr.com/127.0.0.1#5335\nipset=/googlr.com/gfwlist\nserver=/espadoldettol.com.ar/127.0.0.1#5335\nipset=/espadoldettol.com.ar/gfwlist\nserver=/pornobrasil.blog.br/127.0.0.1#5335\nipset=/pornobrasil.blog.br/gfwlist\nserver=/e621.net/127.0.0.1#5335\nipset=/e621.net/gfwlist\nserver=/mini-connected.be/127.0.0.1#5335\nipset=/mini-connected.be/gfwlist\nserver=/fasebook.com/127.0.0.1#5335\nipset=/fasebook.com/gfwlist\nserver=/cloudflarewarp.com/127.0.0.1#5335\nipset=/cloudflarewarp.com/gfwlist\nserver=/googlesverige.com/127.0.0.1#5335\nipset=/googlesverige.com/gfwlist\nserver=/indaznlab.com/127.0.0.1#5335\nipset=/indaznlab.com/gfwlist\nserver=/nikesku.com/127.0.0.1#5335\nipset=/nikesku.com/gfwlist\nserver=/projectapex.com/127.0.0.1#5335\nipset=/projectapex.com/gfwlist\nserver=/anime-pictures.net/127.0.0.1#5335\nipset=/anime-pictures.net/gfwlist\nserver=/cheapnikedunks.com/127.0.0.1#5335\nipset=/cheapnikedunks.com/gfwlist\nserver=/wariolandshakeit.com/127.0.0.1#5335\nipset=/wariolandshakeit.com/gfwlist\nserver=/hentai24h.tv/127.0.0.1#5335\nipset=/hentai24h.tv/gfwlist\nserver=/teenrave.org/127.0.0.1#5335\nipset=/teenrave.org/gfwlist\nserver=/primeindianporn.com/127.0.0.1#5335\nipset=/primeindianporn.com/gfwlist\nserver=/ebaypakistan.net/127.0.0.1#5335\nipset=/ebaypakistan.net/gfwlist\nserver=/ebay.mn/127.0.0.1#5335\nipset=/ebay.mn/gfwlist\nserver=/firestonebpco.com/127.0.0.1#5335\nipset=/firestonebpco.com/gfwlist\nserver=/herringnetwork.com/127.0.0.1#5335\nipset=/herringnetwork.com/gfwlist\nserver=/opinionjournal.com/127.0.0.1#5335\nipset=/opinionjournal.com/gfwlist\nserver=/rule34.us/127.0.0.1#5335\nipset=/rule34.us/gfwlist\nserver=/monsterbeatscommunity.com/127.0.0.1#5335\nipset=/monsterbeatscommunity.com/gfwlist\nserver=/dynafleetonline.com/127.0.0.1#5335\nipset=/dynafleetonline.com/gfwlist\nserver=/googleplus.com/127.0.0.1#5335\nipset=/googleplus.com/gfwlist\nserver=/googleplay.com/127.0.0.1#5335\nipset=/googleplay.com/gfwlist\nserver=/googlephotos.com/127.0.0.1#5335\nipset=/googlephotos.com/gfwlist\nserver=/playmation.com/127.0.0.1#5335\nipset=/playmation.com/gfwlist\nserver=/googlepagecreator.com/127.0.0.1#5335\nipset=/googlepagecreator.com/gfwlist\nserver=/googlemaps.com/127.0.0.1#5335\nipset=/googlemaps.com/gfwlist\nserver=/fgacebook.com/127.0.0.1#5335\nipset=/fgacebook.com/gfwlist\nserver=/bestbuycanada.ca/127.0.0.1#5335\nipset=/bestbuycanada.ca/gfwlist\nserver=/xfockers.com/127.0.0.1#5335\nipset=/xfockers.com/gfwlist\nserver=/avinetworks.com/127.0.0.1#5335\nipset=/avinetworks.com/gfwlist\nserver=/googlefiber.com/127.0.0.1#5335\nipset=/googlefiber.com/gfwlist\nserver=/weiyuksj.com/127.0.0.1#5335\nipset=/weiyuksj.com/gfwlist\nserver=/volvotrucks.net/127.0.0.1#5335\nipset=/volvotrucks.net/gfwlist\nserver=/nikeoutletstores.com/127.0.0.1#5335\nipset=/nikeoutletstores.com/gfwlist\nserver=/mastercardacademy.com/127.0.0.1#5335\nipset=/mastercardacademy.com/gfwlist\nserver=/thefappeningblog.com/127.0.0.1#5335\nipset=/thefappeningblog.com/gfwlist\nserver=/visabank.org/127.0.0.1#5335\nipset=/visabank.org/gfwlist\nserver=/apple.news/127.0.0.1#5335\nipset=/apple.news/gfwlist\nserver=/wenzhao.ca/127.0.0.1#5335\nipset=/wenzhao.ca/gfwlist\nserver=/microad.co.jp/127.0.0.1#5335\nipset=/microad.co.jp/gfwlist\nserver=/neow.in/127.0.0.1#5335\nipset=/neow.in/gfwlist\nserver=/ocbmwdealers.com/127.0.0.1#5335\nipset=/ocbmwdealers.com/gfwlist\nserver=/myfoxhouston.com/127.0.0.1#5335\nipset=/myfoxhouston.com/gfwlist\nserver=/bmw.tm/127.0.0.1#5335\nipset=/bmw.tm/gfwlist\nserver=/bitstream.com/127.0.0.1#5335\nipset=/bitstream.com/gfwlist\nserver=/savitabhabhi.com/127.0.0.1#5335\nipset=/savitabhabhi.com/gfwlist\nserver=/googlecommerce.com/127.0.0.1#5335\nipset=/googlecommerce.com/gfwlist\nserver=/ikea.com.hk/127.0.0.1#5335\nipset=/ikea.com.hk/gfwlist\nserver=/facebol.com/127.0.0.1#5335\nipset=/facebol.com/gfwlist\nserver=/libraryofthumbs.com/127.0.0.1#5335\nipset=/libraryofthumbs.com/gfwlist\nserver=/statuspage.io/127.0.0.1#5335\nipset=/statuspage.io/gfwlist\nserver=/epochtimes.jp/127.0.0.1#5335\nipset=/epochtimes.jp/gfwlist\nserver=/googlebot.com/127.0.0.1#5335\nipset=/googlebot.com/gfwlist\nserver=/google.ventures/127.0.0.1#5335\nipset=/google.ventures/gfwlist\nserver=/google.dev/127.0.0.1#5335\nipset=/google.dev/gfwlist\nserver=/google.berlin/127.0.0.1#5335\nipset=/google.berlin/gfwlist\nserver=/google-access.net/127.0.0.1#5335\nipset=/google-access.net/gfwlist\nserver=/pornoincreible.com/127.0.0.1#5335\nipset=/pornoincreible.com/gfwlist\nserver=/priceless.org/127.0.0.1#5335\nipset=/priceless.org/gfwlist\nserver=/ffacebook.com/127.0.0.1#5335\nipset=/ffacebook.com/gfwlist\nserver=/goo.gl/127.0.0.1#5335\nipset=/goo.gl/gfwlist\nserver=/napiszex.com/127.0.0.1#5335\nipset=/napiszex.com/gfwlist\nserver=/gonglchuangl.net/127.0.0.1#5335\nipset=/gonglchuangl.net/gfwlist\nserver=/gogle.com/127.0.0.1#5335\nipset=/gogle.com/gfwlist\nserver=/instagramtr.com/127.0.0.1#5335\nipset=/instagramtr.com/gfwlist\nserver=/gmodules.com/127.0.0.1#5335\nipset=/gmodules.com/gfwlist\nserver=/awsautopilot.com/127.0.0.1#5335\nipset=/awsautopilot.com/gfwlist\nserver=/gipscorp.com/127.0.0.1#5335\nipset=/gipscorp.com/gfwlist\nserver=/c-span.org/127.0.0.1#5335\nipset=/c-span.org/gfwlist\nserver=/getbumptop.com/127.0.0.1#5335\nipset=/getbumptop.com/gfwlist\nserver=/gerritcodereview.com/127.0.0.1#5335\nipset=/gerritcodereview.com/gfwlist\nserver=/videodelivery.net/127.0.0.1#5335\nipset=/videodelivery.net/gfwlist\nserver=/gimy.tv/127.0.0.1#5335\nipset=/gimy.tv/gfwlist\nserver=/g.page/127.0.0.1#5335\nipset=/g.page/gfwlist\nserver=/ctv.com.tw/127.0.0.1#5335\nipset=/ctv.com.tw/gfwlist\nserver=/porngameshub.com/127.0.0.1#5335\nipset=/porngameshub.com/gfwlist\nserver=/g-tun.com/127.0.0.1#5335\nipset=/g-tun.com/gfwlist\nserver=/fuchsia.dev/127.0.0.1#5335\nipset=/fuchsia.dev/gfwlist\nserver=/volvopenta.se/127.0.0.1#5335\nipset=/volvopenta.se/gfwlist\nserver=/enf-cmnf.com/127.0.0.1#5335\nipset=/enf-cmnf.com/gfwlist\nserver=/zooporn.video/127.0.0.1#5335\nipset=/zooporn.video/gfwlist\nserver=/ad.games.dmm.com/127.0.0.1#5335\nipset=/ad.games.dmm.com/gfwlist\nserver=/ikea.com/127.0.0.1#5335\nipset=/ikea.com/gfwlist\nserver=/pinyinxiang.com/127.0.0.1#5335\nipset=/pinyinxiang.com/gfwlist\nserver=/workplaceusecases.com/127.0.0.1#5335\nipset=/workplaceusecases.com/gfwlist\nserver=/okkisokuho.com/127.0.0.1#5335\nipset=/okkisokuho.com/gfwlist\nserver=/fflick.com/127.0.0.1#5335\nipset=/fflick.com/gfwlist\nserver=/episodic.com/127.0.0.1#5335\nipset=/episodic.com/gfwlist\nserver=/udndata.com/127.0.0.1#5335\nipset=/udndata.com/gfwlist\nserver=/paidpornsites.com/127.0.0.1#5335\nipset=/paidpornsites.com/gfwlist\nserver=/ganjingworld.com/127.0.0.1#5335\nipset=/ganjingworld.com/gfwlist\nserver=/needforspeedoverdrive.com/127.0.0.1#5335\nipset=/needforspeedoverdrive.com/gfwlist\nserver=/myfappening.org/127.0.0.1#5335\nipset=/myfappening.org/gfwlist\nserver=/bmwchampionshipusa.com/127.0.0.1#5335\nipset=/bmwchampionshipusa.com/gfwlist\nserver=/mastercard.hu/127.0.0.1#5335\nipset=/mastercard.hu/gfwlist\nserver=/cherrynudes.com/127.0.0.1#5335\nipset=/cherrynudes.com/gfwlist\nserver=/icloud.lv/127.0.0.1#5335\nipset=/icloud.lv/gfwlist\nserver=/twnextdigital.com/127.0.0.1#5335\nipset=/twnextdigital.com/gfwlist\nserver=/2013beatshdcybermonday.com/127.0.0.1#5335\nipset=/2013beatshdcybermonday.com/gfwlist\nserver=/acgdg.com/127.0.0.1#5335\nipset=/acgdg.com/gfwlist\nserver=/fuckmypakistanigf.com/127.0.0.1#5335\nipset=/fuckmypakistanigf.com/gfwlist\nserver=/salesforcemarketingcloud.com/127.0.0.1#5335\nipset=/salesforcemarketingcloud.com/gfwlist\nserver=/nubilesunscripted.com/127.0.0.1#5335\nipset=/nubilesunscripted.com/gfwlist\nserver=/crossmediapanel.com/127.0.0.1#5335\nipset=/crossmediapanel.com/gfwlist\nserver=/coova.net/127.0.0.1#5335\nipset=/coova.net/gfwlist\nserver=/purelyceleb.com/127.0.0.1#5335\nipset=/purelyceleb.com/gfwlist\nserver=/cookiechoices.org/127.0.0.1#5335\nipset=/cookiechoices.org/gfwlist\nserver=/nekora.main.jp/127.0.0.1#5335\nipset=/nekora.main.jp/gfwlist\nserver=/ieeecsc.org/127.0.0.1#5335\nipset=/ieeecsc.org/gfwlist\nserver=/smpte.org/127.0.0.1#5335\nipset=/smpte.org/gfwlist\nserver=/google.gr/127.0.0.1#5335\nipset=/google.gr/gfwlist\nserver=/codespot.com/127.0.0.1#5335\nipset=/codespot.com/gfwlist\nserver=/cobrasearch.com/127.0.0.1#5335\nipset=/cobrasearch.com/gfwlist\nserver=/ciscowebseminars.com/127.0.0.1#5335\nipset=/ciscowebseminars.com/gfwlist\nserver=/ixxx.com/127.0.0.1#5335\nipset=/ixxx.com/gfwlist\nserver=/chronicle.security/127.0.0.1#5335\nipset=/chronicle.security/gfwlist\nserver=/intel.sg/127.0.0.1#5335\nipset=/intel.sg/gfwlist\nserver=/onlinemonsterbeatsonsale.com/127.0.0.1#5335\nipset=/onlinemonsterbeatsonsale.com/gfwlist\nserver=/steam.cdn.orcon.net.nz/127.0.0.1#5335\nipset=/steam.cdn.orcon.net.nz/gfwlist\nserver=/mastercard.md/127.0.0.1#5335\nipset=/mastercard.md/gfwlist\nserver=/hbrowse.com/127.0.0.1#5335\nipset=/hbrowse.com/gfwlist\nserver=/nutramigen.net/127.0.0.1#5335\nipset=/nutramigen.net/gfwlist\nserver=/2ch.net/127.0.0.1#5335\nipset=/2ch.net/gfwlist\nserver=/mini-antilles.fr/127.0.0.1#5335\nipset=/mini-antilles.fr/gfwlist\nserver=/grandepornogratis.com/127.0.0.1#5335\nipset=/grandepornogratis.com/gfwlist\nserver=/5ch.net/127.0.0.1#5335\nipset=/5ch.net/gfwlist\nserver=/mzstatic.com/127.0.0.1#5335\nipset=/mzstatic.com/gfwlist\nserver=/winticket.jp/127.0.0.1#5335\nipset=/winticket.jp/gfwlist\nserver=/bumptunes.com/127.0.0.1#5335\nipset=/bumptunes.com/gfwlist\nserver=/buycheapbeatsdreuk.com/127.0.0.1#5335\nipset=/buycheapbeatsdreuk.com/gfwlist\nserver=/foxnewsradio.com/127.0.0.1#5335\nipset=/foxnewsradio.com/gfwlist\nserver=/bumptop.net/127.0.0.1#5335\nipset=/bumptop.net/gfwlist\nserver=/bumptop.com/127.0.0.1#5335\nipset=/bumptop.com/gfwlist\nserver=/javpost.net/127.0.0.1#5335\nipset=/javpost.net/gfwlist\nserver=/adulterfree.com/127.0.0.1#5335\nipset=/adulterfree.com/gfwlist\nserver=/bumptop.ca/127.0.0.1#5335\nipset=/bumptop.ca/gfwlist\nserver=/javcl.com/127.0.0.1#5335\nipset=/javcl.com/gfwlist\nserver=/foxtelevisionstations.com/127.0.0.1#5335\nipset=/foxtelevisionstations.com/gfwlist\nserver=/bmw-world.com/127.0.0.1#5335\nipset=/bmw-world.com/gfwlist\nserver=/binance.cc/127.0.0.1#5335\nipset=/binance.cc/gfwlist\nserver=/doujinland.info/127.0.0.1#5335\nipset=/doujinland.info/gfwlist\nserver=/streamxxx.tv/127.0.0.1#5335\nipset=/streamxxx.tv/gfwlist\nserver=/ebay.com.hk/127.0.0.1#5335\nipset=/ebay.com.hk/gfwlist\nserver=/apture.com/127.0.0.1#5335\nipset=/apture.com/gfwlist\nserver=/zooskoolvideos.com/127.0.0.1#5335\nipset=/zooskoolvideos.com/gfwlist\nserver=/6park.com/127.0.0.1#5335\nipset=/6park.com/gfwlist\nserver=/himalaya-exchange.zendesk.com/127.0.0.1#5335\nipset=/himalaya-exchange.zendesk.com/gfwlist\nserver=/appbridge.it/127.0.0.1#5335\nipset=/appbridge.it/gfwlist\nserver=/twinkybf.com/127.0.0.1#5335\nipset=/twinkybf.com/gfwlist\nserver=/ipod.eu/127.0.0.1#5335\nipset=/ipod.eu/gfwlist\nserver=/nikeshoes4u.com/127.0.0.1#5335\nipset=/nikeshoes4u.com/gfwlist\nserver=/foxdeportes.tv/127.0.0.1#5335\nipset=/foxdeportes.tv/gfwlist\nserver=/triballo.net/127.0.0.1#5335\nipset=/triballo.net/gfwlist\nserver=/scholar.google.si/127.0.0.1#5335\nipset=/scholar.google.si/gfwlist\nserver=/curvyerotic.com/127.0.0.1#5335\nipset=/curvyerotic.com/gfwlist\nserver=/arabidopsis.org/127.0.0.1#5335\nipset=/arabidopsis.org/gfwlist\nserver=/nflxso.net/127.0.0.1#5335\nipset=/nflxso.net/gfwlist\nserver=/1ucrs.com/127.0.0.1#5335\nipset=/1ucrs.com/gfwlist\nserver=/dreammovies.com/127.0.0.1#5335\nipset=/dreammovies.com/gfwlist\nserver=/ciscokinetic.com/127.0.0.1#5335\nipset=/ciscokinetic.com/gfwlist\nserver=/shopee.ph/127.0.0.1#5335\nipset=/shopee.ph/gfwlist\nserver=/6xxxvideos.com/127.0.0.1#5335\nipset=/6xxxvideos.com/gfwlist\nserver=/stonefoxproductions.com/127.0.0.1#5335\nipset=/stonefoxproductions.com/gfwlist\nserver=/google.to/127.0.0.1#5335\nipset=/google.to/gfwlist\nserver=/myoctocat.com/127.0.0.1#5335\nipset=/myoctocat.com/gfwlist\nserver=/google.tn/127.0.0.1#5335\nipset=/google.tn/gfwlist\nserver=/google.tm/127.0.0.1#5335\nipset=/google.tm/gfwlist\nserver=/tubexclips.com/127.0.0.1#5335\nipset=/tubexclips.com/gfwlist\nserver=/beatdrdres.com/127.0.0.1#5335\nipset=/beatdrdres.com/gfwlist\nserver=/vmwareidentity.com/127.0.0.1#5335\nipset=/vmwareidentity.com/gfwlist\nserver=/paypalhere.org/127.0.0.1#5335\nipset=/paypalhere.org/gfwlist\nserver=/firestone.com.br/127.0.0.1#5335\nipset=/firestone.com.br/gfwlist\nserver=/pornhub.org/127.0.0.1#5335\nipset=/pornhub.org/gfwlist\nserver=/91avfuli.com/127.0.0.1#5335\nipset=/91avfuli.com/gfwlist\nserver=/korewaeroi.com/127.0.0.1#5335\nipset=/korewaeroi.com/gfwlist\nserver=/pchomeec.tw/127.0.0.1#5335\nipset=/pchomeec.tw/gfwlist\nserver=/google.si/127.0.0.1#5335\nipset=/google.si/gfwlist\nserver=/eromazofu.com/127.0.0.1#5335\nipset=/eromazofu.com/gfwlist\nserver=/familysimulator.com/127.0.0.1#5335\nipset=/familysimulator.com/gfwlist\nserver=/xn--7hv594h.com/127.0.0.1#5335\nipset=/xn--7hv594h.com/gfwlist\nserver=/internetofeverything.com/127.0.0.1#5335\nipset=/internetofeverything.com/gfwlist\nserver=/casquebeatssolo.net/127.0.0.1#5335\nipset=/casquebeatssolo.net/gfwlist\nserver=/google.pt/127.0.0.1#5335\nipset=/google.pt/gfwlist\nserver=/gtlsca.nat.gov.tw/127.0.0.1#5335\nipset=/gtlsca.nat.gov.tw/gfwlist\nserver=/fracebook.com/127.0.0.1#5335\nipset=/fracebook.com/gfwlist\nserver=/webofknowledge.com/127.0.0.1#5335\nipset=/webofknowledge.com/gfwlist\nserver=/sextubespot.com/127.0.0.1#5335\nipset=/sextubespot.com/gfwlist\nserver=/applemasters.info/127.0.0.1#5335\nipset=/applemasters.info/gfwlist\nserver=/bestbuystores.com/127.0.0.1#5335\nipset=/bestbuystores.com/gfwlist\nserver=/nikebetterworld.com/127.0.0.1#5335\nipset=/nikebetterworld.com/gfwlist\nserver=/pearsoned.com/127.0.0.1#5335\nipset=/pearsoned.com/gfwlist\nserver=/init.shop/127.0.0.1#5335\nipset=/init.shop/gfwlist\nserver=/4kporn.xxx/127.0.0.1#5335\nipset=/4kporn.xxx/gfwlist\nserver=/1lib.pl/127.0.0.1#5335\nipset=/1lib.pl/gfwlist\nserver=/google.nu/127.0.0.1#5335\nipset=/google.nu/gfwlist\nserver=/visa.co.cr/127.0.0.1#5335\nipset=/visa.co.cr/gfwlist\nserver=/monster-beats-headphones.com/127.0.0.1#5335\nipset=/monster-beats-headphones.com/gfwlist\nserver=/videochampion.com/127.0.0.1#5335\nipset=/videochampion.com/gfwlist\nserver=/strepsils.hr/127.0.0.1#5335\nipset=/strepsils.hr/gfwlist\nserver=/google.nl/127.0.0.1#5335\nipset=/google.nl/gfwlist\nserver=/kidspot.com.au/127.0.0.1#5335\nipset=/kidspot.com.au/gfwlist\nserver=/gitbook.io/127.0.0.1#5335\nipset=/gitbook.io/gfwlist\nserver=/intel.com.ar/127.0.0.1#5335\nipset=/intel.com.ar/gfwlist\nserver=/smashed.xxx/127.0.0.1#5335\nipset=/smashed.xxx/gfwlist\nserver=/verisign.fr/127.0.0.1#5335\nipset=/verisign.fr/gfwlist\nserver=/google.mg/127.0.0.1#5335\nipset=/google.mg/gfwlist\nserver=/waterfox.net/127.0.0.1#5335\nipset=/waterfox.net/gfwlist\nserver=/javfree.sh/127.0.0.1#5335\nipset=/javfree.sh/gfwlist\nserver=/marketo.com/127.0.0.1#5335\nipset=/marketo.com/gfwlist\nserver=/onlyindianporn2.com/127.0.0.1#5335\nipset=/onlyindianporn2.com/gfwlist\nserver=/disney.com.au/127.0.0.1#5335\nipset=/disney.com.au/gfwlist\nserver=/mini.com/127.0.0.1#5335\nipset=/mini.com/gfwlist\nserver=/ebay.org/127.0.0.1#5335\nipset=/ebay.org/gfwlist\nserver=/thesundaytimes.co.uk/127.0.0.1#5335\nipset=/thesundaytimes.co.uk/gfwlist\nserver=/xxvideo.mobi/127.0.0.1#5335\nipset=/xxvideo.mobi/gfwlist\nserver=/javqd.com/127.0.0.1#5335\nipset=/javqd.com/gfwlist\nserver=/gfpornvideos.com/127.0.0.1#5335\nipset=/gfpornvideos.com/gfwlist\nserver=/guccitimeless.com/127.0.0.1#5335\nipset=/guccitimeless.com/gfwlist\nserver=/google.kz/127.0.0.1#5335\nipset=/google.kz/gfwlist\nserver=/google.ki/127.0.0.1#5335\nipset=/google.ki/gfwlist\nserver=/shufflesex.com/127.0.0.1#5335\nipset=/shufflesex.com/gfwlist\nserver=/hentaimama.io/127.0.0.1#5335\nipset=/hentaimama.io/gfwlist\nserver=/ieeesmc.org/127.0.0.1#5335\nipset=/ieeesmc.org/gfwlist\nserver=/google.jo/127.0.0.1#5335\nipset=/google.jo/gfwlist\nserver=/beatsbydrecasquesfr.com/127.0.0.1#5335\nipset=/beatsbydrecasquesfr.com/gfwlist\nserver=/applestore.com.my/127.0.0.1#5335\nipset=/applestore.com.my/gfwlist\nserver=/powerofresolve.ca/127.0.0.1#5335\nipset=/powerofresolve.ca/gfwlist\nserver=/google.im/127.0.0.1#5335\nipset=/google.im/gfwlist\nserver=/google.ie/127.0.0.1#5335\nipset=/google.ie/gfwlist\nserver=/showybeauty.com/127.0.0.1#5335\nipset=/showybeauty.com/gfwlist\nserver=/pinterest.ph/127.0.0.1#5335\nipset=/pinterest.ph/gfwlist\nserver=/travelex.com/127.0.0.1#5335\nipset=/travelex.com/gfwlist\nserver=/bmwccrc.ca/127.0.0.1#5335\nipset=/bmwccrc.ca/gfwlist\nserver=/foxsoccer.net/127.0.0.1#5335\nipset=/foxsoccer.net/gfwlist\nserver=/google.hr/127.0.0.1#5335\nipset=/google.hr/gfwlist\nserver=/visa.co.ve/127.0.0.1#5335\nipset=/visa.co.ve/gfwlist\nserver=/google.gl/127.0.0.1#5335\nipset=/google.gl/gfwlist\nserver=/anigema.jp/127.0.0.1#5335\nipset=/anigema.jp/gfwlist\nserver=/google.gg/127.0.0.1#5335\nipset=/google.gg/gfwlist\nserver=/google.ge/127.0.0.1#5335\nipset=/google.ge/gfwlist\nserver=/yahoo.dm/127.0.0.1#5335\nipset=/yahoo.dm/gfwlist\nserver=/repo.new/127.0.0.1#5335\nipset=/repo.new/gfwlist\nserver=/duckduckgo.co/127.0.0.1#5335\nipset=/duckduckgo.co/gfwlist\nserver=/softbank-ipo.com/127.0.0.1#5335\nipset=/softbank-ipo.com/gfwlist\nserver=/eroero69.work/127.0.0.1#5335\nipset=/eroero69.work/gfwlist\nserver=/google.fi/127.0.0.1#5335\nipset=/google.fi/gfwlist\nserver=/ebaysocial.com/127.0.0.1#5335\nipset=/ebaysocial.com/gfwlist\nserver=/cartoon3thumbs.com/127.0.0.1#5335\nipset=/cartoon3thumbs.com/gfwlist\nserver=/pornper.com/127.0.0.1#5335\nipset=/pornper.com/gfwlist\nserver=/pearsonclinical.com.br/127.0.0.1#5335\nipset=/pearsonclinical.com.br/gfwlist\nserver=/google.es/127.0.0.1#5335\nipset=/google.es/gfwlist\nserver=/boyloves.cc/127.0.0.1#5335\nipset=/boyloves.cc/gfwlist\nserver=/fbf8.com/127.0.0.1#5335\nipset=/fbf8.com/gfwlist\nserver=/automobile.fr/127.0.0.1#5335\nipset=/automobile.fr/gfwlist\nserver=/applestore.co.jp/127.0.0.1#5335\nipset=/applestore.co.jp/gfwlist\nserver=/similar-porn.fun/127.0.0.1#5335\nipset=/similar-porn.fun/gfwlist\nserver=/scat-enema.com/127.0.0.1#5335\nipset=/scat-enema.com/gfwlist\nserver=/secom.co.jp/127.0.0.1#5335\nipset=/secom.co.jp/gfwlist\nserver=/foxfdm.com/127.0.0.1#5335\nipset=/foxfdm.com/gfwlist\nserver=/pornheed.com/127.0.0.1#5335\nipset=/pornheed.com/gfwlist\nserver=/bmw-special-sales.com/127.0.0.1#5335\nipset=/bmw-special-sales.com/gfwlist\nserver=/google.dj/127.0.0.1#5335\nipset=/google.dj/gfwlist\nserver=/skysports.ie/127.0.0.1#5335\nipset=/skysports.ie/gfwlist\nserver=/remirepo.net/127.0.0.1#5335\nipset=/remirepo.net/gfwlist\nserver=/tubedna.com/127.0.0.1#5335\nipset=/tubedna.com/gfwlist\nserver=/myfoxlubbock.com/127.0.0.1#5335\nipset=/myfoxlubbock.com/gfwlist\nserver=/acaric.co.jp/127.0.0.1#5335\nipset=/acaric.co.jp/gfwlist\nserver=/apple.ch/127.0.0.1#5335\nipset=/apple.ch/gfwlist\nserver=/opensource.guide/127.0.0.1#5335\nipset=/opensource.guide/gfwlist\nserver=/kindindianporn.com/127.0.0.1#5335\nipset=/kindindianporn.com/gfwlist\nserver=/pvp.tv/127.0.0.1#5335\nipset=/pvp.tv/gfwlist\nserver=/scholar.google.cl/127.0.0.1#5335\nipset=/scholar.google.cl/gfwlist\nserver=/bmw-connecteddrive.hu/127.0.0.1#5335\nipset=/bmw-connecteddrive.hu/gfwlist\nserver=/youtube.iq/127.0.0.1#5335\nipset=/youtube.iq/gfwlist\nserver=/chomp.com/127.0.0.1#5335\nipset=/chomp.com/gfwlist\nserver=/nikefootballcleats.com/127.0.0.1#5335\nipset=/nikefootballcleats.com/gfwlist\nserver=/blznav.akamaized.net/127.0.0.1#5335\nipset=/blznav.akamaized.net/gfwlist\nserver=/google.com.tr/127.0.0.1#5335\nipset=/google.com.tr/gfwlist\nserver=/collegepornonly.com/127.0.0.1#5335\nipset=/collegepornonly.com/gfwlist\nserver=/bloombergtradingchallenge.com/127.0.0.1#5335\nipset=/bloombergtradingchallenge.com/gfwlist\nserver=/4ertik.one/127.0.0.1#5335\nipset=/4ertik.one/gfwlist\nserver=/leagueoflegendsscripts.com/127.0.0.1#5335\nipset=/leagueoflegendsscripts.com/gfwlist\nserver=/filmsexeporno.com/127.0.0.1#5335\nipset=/filmsexeporno.com/gfwlist\nserver=/bridgestonevan.com/127.0.0.1#5335\nipset=/bridgestonevan.com/gfwlist\nserver=/ipod.co.nz/127.0.0.1#5335\nipset=/ipod.co.nz/gfwlist\nserver=/teen-lover.net/127.0.0.1#5335\nipset=/teen-lover.net/gfwlist\nserver=/facebook.br/127.0.0.1#5335\nipset=/facebook.br/gfwlist\nserver=/google.com.pr/127.0.0.1#5335\nipset=/google.com.pr/gfwlist\nserver=/sweetandmaxwell.co.uk/127.0.0.1#5335\nipset=/sweetandmaxwell.co.uk/gfwlist\nserver=/pinterest.ie/127.0.0.1#5335\nipset=/pinterest.ie/gfwlist\nserver=/peachyforum.com/127.0.0.1#5335\nipset=/peachyforum.com/gfwlist\nserver=/google.com.pk/127.0.0.1#5335\nipset=/google.com.pk/gfwlist\nserver=/google.com.ph/127.0.0.1#5335\nipset=/google.com.ph/gfwlist\nserver=/xnxx-teens.com/127.0.0.1#5335\nipset=/xnxx-teens.com/gfwlist\nserver=/pornheli.com/127.0.0.1#5335\nipset=/pornheli.com/gfwlist\nserver=/google.com.pa/127.0.0.1#5335\nipset=/google.com.pa/gfwlist\nserver=/google.com.om/127.0.0.1#5335\nipset=/google.com.om/gfwlist\nserver=/google.com.ng/127.0.0.1#5335\nipset=/google.com.ng/gfwlist\nserver=/top100sexgames.com/127.0.0.1#5335\nipset=/top100sexgames.com/gfwlist\nserver=/horse4sex.com/127.0.0.1#5335\nipset=/horse4sex.com/gfwlist\nserver=/ebay.ph/127.0.0.1#5335\nipset=/ebay.ph/gfwlist\nserver=/bookmark.xxx/127.0.0.1#5335\nipset=/bookmark.xxx/gfwlist\nserver=/ero-manga-platinum.net/127.0.0.1#5335\nipset=/ero-manga-platinum.net/gfwlist\nserver=/applecomputer.com.tw/127.0.0.1#5335\nipset=/applecomputer.com.tw/gfwlist\nserver=/javdove8.xyz/127.0.0.1#5335\nipset=/javdove8.xyz/gfwlist\nserver=/visa.co.id/127.0.0.1#5335\nipset=/visa.co.id/gfwlist\nserver=/imoviegallery.com/127.0.0.1#5335\nipset=/imoviegallery.com/gfwlist\nserver=/getlantern.org/127.0.0.1#5335\nipset=/getlantern.org/gfwlist\nserver=/pleasuregirl.net/127.0.0.1#5335\nipset=/pleasuregirl.net/gfwlist\nserver=/macmini.com/127.0.0.1#5335\nipset=/macmini.com/gfwlist\nserver=/data.com/127.0.0.1#5335\nipset=/data.com/gfwlist\nserver=/google.com.jm/127.0.0.1#5335\nipset=/google.com.jm/gfwlist\nserver=/static9.net.au/127.0.0.1#5335\nipset=/static9.net.au/gfwlist\nserver=/google.com.gi/127.0.0.1#5335\nipset=/google.com.gi/gfwlist\nserver=/iphine.com/127.0.0.1#5335\nipset=/iphine.com/gfwlist\nserver=/sexgamesclub.com/127.0.0.1#5335\nipset=/sexgamesclub.com/gfwlist\nserver=/graphengine.io/127.0.0.1#5335\nipset=/graphengine.io/gfwlist\nserver=/alivevue.com/127.0.0.1#5335\nipset=/alivevue.com/gfwlist\nserver=/google.com.fj/127.0.0.1#5335\nipset=/google.com.fj/gfwlist\nserver=/zooporno.biz/127.0.0.1#5335\nipset=/zooporno.biz/gfwlist\nserver=/needforspeedshowdown.com/127.0.0.1#5335\nipset=/needforspeedshowdown.com/gfwlist\nserver=/miniargentina.com/127.0.0.1#5335\nipset=/miniargentina.com/gfwlist\nserver=/google.com.et/127.0.0.1#5335\nipset=/google.com.et/gfwlist\nserver=/meijinsen.jp/127.0.0.1#5335\nipset=/meijinsen.jp/gfwlist\nserver=/volvotrucks.ma/127.0.0.1#5335\nipset=/volvotrucks.ma/gfwlist\nserver=/headset987.com/127.0.0.1#5335\nipset=/headset987.com/gfwlist\nserver=/attinternetservice.com/127.0.0.1#5335\nipset=/attinternetservice.com/gfwlist\nserver=/google.com.ec/127.0.0.1#5335\nipset=/google.com.ec/gfwlist\nserver=/mobileinternational.com/127.0.0.1#5335\nipset=/mobileinternational.com/gfwlist\nserver=/mini-connected.fr/127.0.0.1#5335\nipset=/mini-connected.fr/gfwlist\nserver=/bridgestonecomercial.com.co/127.0.0.1#5335\nipset=/bridgestonecomercial.com.co/gfwlist\nserver=/staticflickr.com/127.0.0.1#5335\nipset=/staticflickr.com/gfwlist\nserver=/illusion.co.jp/127.0.0.1#5335\nipset=/illusion.co.jp/gfwlist\nserver=/hdtube.co/127.0.0.1#5335\nipset=/hdtube.co/gfwlist\nserver=/linuxfoundation.org/127.0.0.1#5335\nipset=/linuxfoundation.org/gfwlist\nserver=/ciscoturk.net/127.0.0.1#5335\nipset=/ciscoturk.net/gfwlist\nserver=/hentaistream.com/127.0.0.1#5335\nipset=/hentaistream.com/gfwlist\nserver=/xn--ztsq84g.cn/127.0.0.1#5335\nipset=/xn--ztsq84g.cn/gfwlist\nserver=/ladybaba.net/127.0.0.1#5335\nipset=/ladybaba.net/gfwlist\nserver=/google.com.co/127.0.0.1#5335\nipset=/google.com.co/gfwlist\nserver=/doubleclick.com/127.0.0.1#5335\nipset=/doubleclick.com/gfwlist\nserver=/illusionl.com/127.0.0.1#5335\nipset=/illusionl.com/gfwlist\nserver=/sbnation.com/127.0.0.1#5335\nipset=/sbnation.com/gfwlist\nserver=/outdoorpublicsex.com/127.0.0.1#5335\nipset=/outdoorpublicsex.com/gfwlist\nserver=/bmw.com.br/127.0.0.1#5335\nipset=/bmw.com.br/gfwlist\nserver=/mox.moe/127.0.0.1#5335\nipset=/mox.moe/gfwlist\nserver=/wifi-mx.com/127.0.0.1#5335\nipset=/wifi-mx.com/gfwlist\nserver=/rpmfusion.org/127.0.0.1#5335\nipset=/rpmfusion.org/gfwlist\nserver=/pornsites.com/127.0.0.1#5335\nipset=/pornsites.com/gfwlist\nserver=/eastweek.com.hk/127.0.0.1#5335\nipset=/eastweek.com.hk/gfwlist\nserver=/vl4x.net/127.0.0.1#5335\nipset=/vl4x.net/gfwlist\nserver=/ouroath.com/127.0.0.1#5335\nipset=/ouroath.com/gfwlist\nserver=/google.com.ar/127.0.0.1#5335\nipset=/google.com.ar/gfwlist\nserver=/quatrum.com.br/127.0.0.1#5335\nipset=/quatrum.com.br/gfwlist\nserver=/cybermondaybeats4sale.com/127.0.0.1#5335\nipset=/cybermondaybeats4sale.com/gfwlist\nserver=/clipcake.com/127.0.0.1#5335\nipset=/clipcake.com/gfwlist\nserver=/pagecdn.com/127.0.0.1#5335\nipset=/pagecdn.com/gfwlist\nserver=/deviantart.net/127.0.0.1#5335\nipset=/deviantart.net/gfwlist\nserver=/8teenxxx.com/127.0.0.1#5335\nipset=/8teenxxx.com/gfwlist\nserver=/videos-rockstargames-com.akamaized.net/127.0.0.1#5335\nipset=/videos-rockstargames-com.akamaized.net/gfwlist\nserver=/google.co.zw/127.0.0.1#5335\nipset=/google.co.zw/gfwlist\nserver=/nikegolf.ca/127.0.0.1#5335\nipset=/nikegolf.ca/gfwlist\nserver=/egta.com/127.0.0.1#5335\nipset=/egta.com/gfwlist\nserver=/dungeonkeeper.com.cn/127.0.0.1#5335\nipset=/dungeonkeeper.com.cn/gfwlist\nserver=/coinonecore.com/127.0.0.1#5335\nipset=/coinonecore.com/gfwlist\nserver=/google.co.za/127.0.0.1#5335\nipset=/google.co.za/gfwlist\nserver=/mini.md/127.0.0.1#5335\nipset=/mini.md/gfwlist\nserver=/verizon.net/127.0.0.1#5335\nipset=/verizon.net/gfwlist\nserver=/porntube.com/127.0.0.1#5335\nipset=/porntube.com/gfwlist\nserver=/google.co.ve/127.0.0.1#5335\nipset=/google.co.ve/gfwlist\nserver=/flashtranny.com/127.0.0.1#5335\nipset=/flashtranny.com/gfwlist\nserver=/minisovietam.vn/127.0.0.1#5335\nipset=/minisovietam.vn/gfwlist\nserver=/google.co.tz/127.0.0.1#5335\nipset=/google.co.tz/gfwlist\nserver=/verygoodnike.com/127.0.0.1#5335\nipset=/verygoodnike.com/gfwlist\nserver=/google.co.nz/127.0.0.1#5335\nipset=/google.co.nz/gfwlist\nserver=/facebookhub.com/127.0.0.1#5335\nipset=/facebookhub.com/gfwlist\nserver=/google.co.ls/127.0.0.1#5335\nipset=/google.co.ls/gfwlist\nserver=/google.co.kr/127.0.0.1#5335\nipset=/google.co.kr/gfwlist\nserver=/paypal-hrsystem.com/127.0.0.1#5335\nipset=/paypal-hrsystem.com/gfwlist\nserver=/sexpornimg.com/127.0.0.1#5335\nipset=/sexpornimg.com/gfwlist\nserver=/google.com.vn/127.0.0.1#5335\nipset=/google.com.vn/gfwlist\nserver=/cloudvolumes.com/127.0.0.1#5335\nipset=/cloudvolumes.com/gfwlist\nserver=/geinoueroch.com/127.0.0.1#5335\nipset=/geinoueroch.com/gfwlist\nserver=/bloombergmedia.com/127.0.0.1#5335\nipset=/bloombergmedia.com/gfwlist\nserver=/thesun.co.uk/127.0.0.1#5335\nipset=/thesun.co.uk/gfwlist\nserver=/bokepseks.org/127.0.0.1#5335\nipset=/bokepseks.org/gfwlist\nserver=/everia.club/127.0.0.1#5335\nipset=/everia.club/gfwlist\nserver=/moxing.mobi/127.0.0.1#5335\nipset=/moxing.mobi/gfwlist\nserver=/itaeromanga.com/127.0.0.1#5335\nipset=/itaeromanga.com/gfwlist\nserver=/vidspornoduro.com/127.0.0.1#5335\nipset=/vidspornoduro.com/gfwlist\nserver=/vfsco.lt/127.0.0.1#5335\nipset=/vfsco.lt/gfwlist\nserver=/negoziomonsterbeats.com/127.0.0.1#5335\nipset=/negoziomonsterbeats.com/gfwlist\nserver=/pirouvr.com/127.0.0.1#5335\nipset=/pirouvr.com/gfwlist\nserver=/xnxx-sex-videos.com/127.0.0.1#5335\nipset=/xnxx-sex-videos.com/gfwlist\nserver=/video.fc2.com/127.0.0.1#5335\nipset=/video.fc2.com/gfwlist\nserver=/google.cm/127.0.0.1#5335\nipset=/google.cm/gfwlist\nserver=/origin.com/127.0.0.1#5335\nipset=/origin.com/gfwlist\nserver=/appleid.com/127.0.0.1#5335\nipset=/appleid.com/gfwlist\nserver=/monsterproduct.net/127.0.0.1#5335\nipset=/monsterproduct.net/gfwlist\nserver=/google.ch/127.0.0.1#5335\nipset=/google.ch/gfwlist\nserver=/skyporn.online/127.0.0.1#5335\nipset=/skyporn.online/gfwlist\nserver=/babestube.com/127.0.0.1#5335\nipset=/babestube.com/gfwlist\nserver=/masturbate2gether.com/127.0.0.1#5335\nipset=/masturbate2gether.com/gfwlist\nserver=/7tb.cc/127.0.0.1#5335\nipset=/7tb.cc/gfwlist\nserver=/porn-bokep.com/127.0.0.1#5335\nipset=/porn-bokep.com/gfwlist\nserver=/moapi1.online/127.0.0.1#5335\nipset=/moapi1.online/gfwlist\nserver=/google.cf/127.0.0.1#5335\nipset=/google.cf/gfwlist\nserver=/newscareers.co.uk/127.0.0.1#5335\nipset=/newscareers.co.uk/gfwlist\nserver=/scholar.google.co.il/127.0.0.1#5335\nipset=/scholar.google.co.il/gfwlist\nserver=/google.cd/127.0.0.1#5335\nipset=/google.cd/gfwlist\nserver=/redzonechannel.com/127.0.0.1#5335\nipset=/redzonechannel.com/gfwlist\nserver=/google.bi/127.0.0.1#5335\nipset=/google.bi/gfwlist\nserver=/elpadrote.com/127.0.0.1#5335\nipset=/elpadrote.com/gfwlist\nserver=/bridgestone-bandag.com/127.0.0.1#5335\nipset=/bridgestone-bandag.com/gfwlist\nserver=/google.ba/127.0.0.1#5335\nipset=/google.ba/gfwlist\nserver=/bmwcitychallenge.com/127.0.0.1#5335\nipset=/bmwcitychallenge.com/gfwlist\nserver=/meta.com/127.0.0.1#5335\nipset=/meta.com/gfwlist\nserver=/illusionn3.com/127.0.0.1#5335\nipset=/illusionn3.com/gfwlist\nserver=/dobbyporn.com/127.0.0.1#5335\nipset=/dobbyporn.com/gfwlist\nserver=/google.am/127.0.0.1#5335\nipset=/google.am/gfwlist\nserver=/shopee.co.th/127.0.0.1#5335\nipset=/shopee.co.th/gfwlist\nserver=/facebookck.com/127.0.0.1#5335\nipset=/facebookck.com/gfwlist\nserver=/ministeagathe.com/127.0.0.1#5335\nipset=/ministeagathe.com/gfwlist\nserver=/google.al/127.0.0.1#5335\nipset=/google.al/gfwlist\nserver=/lih.kg/127.0.0.1#5335\nipset=/lih.kg/gfwlist\nserver=/google.ad/127.0.0.1#5335\nipset=/google.ad/gfwlist\nserver=/travelex.co.jp/127.0.0.1#5335\nipset=/travelex.co.jp/gfwlist\nserver=/51pincha.cc/127.0.0.1#5335\nipset=/51pincha.cc/gfwlist\nserver=/volvobuses.ph/127.0.0.1#5335\nipset=/volvobuses.ph/gfwlist\nserver=/visagiftcard.us/127.0.0.1#5335\nipset=/visagiftcard.us/gfwlist\nserver=/starbucks.ph/127.0.0.1#5335\nipset=/starbucks.ph/gfwlist\nserver=/mirrorsedge.jp/127.0.0.1#5335\nipset=/mirrorsedge.jp/gfwlist\nserver=/ebayheels.com/127.0.0.1#5335\nipset=/ebayheels.com/gfwlist\nserver=/douwriteright.com/127.0.0.1#5335\nipset=/douwriteright.com/gfwlist\nserver=/fdacebook.info/127.0.0.1#5335\nipset=/fdacebook.info/gfwlist\nserver=/nintendonyc.com/127.0.0.1#5335\nipset=/nintendonyc.com/gfwlist\nserver=/hentaidirectory.org/127.0.0.1#5335\nipset=/hentaidirectory.org/gfwlist\nserver=/r18.clickme.net/127.0.0.1#5335\nipset=/r18.clickme.net/gfwlist\nserver=/hnalady.com/127.0.0.1#5335\nipset=/hnalady.com/gfwlist\nserver=/svscomics.com/127.0.0.1#5335\nipset=/svscomics.com/gfwlist\nserver=/collection-3d.com/127.0.0.1#5335\nipset=/collection-3d.com/gfwlist\nserver=/barium-enema.com/127.0.0.1#5335\nipset=/barium-enema.com/gfwlist\nserver=/elrepo.org/127.0.0.1#5335\nipset=/elrepo.org/gfwlist\nserver=/milfbundle.com/127.0.0.1#5335\nipset=/milfbundle.com/gfwlist\nserver=/new.day/127.0.0.1#5335\nipset=/new.day/gfwlist\nserver=/gfx.ms/127.0.0.1#5335\nipset=/gfx.ms/gfwlist\nserver=/brazzers.com/127.0.0.1#5335\nipset=/brazzers.com/gfwlist\nserver=/cougarsexmovies.com/127.0.0.1#5335\nipset=/cougarsexmovies.com/gfwlist\nserver=/iam.soy/127.0.0.1#5335\nipset=/iam.soy/gfwlist\nserver=/passiontimes.hk/127.0.0.1#5335\nipset=/passiontimes.hk/gfwlist\nserver=/hey.boo/127.0.0.1#5335\nipset=/hey.boo/gfwlist\nserver=/sony.com.sg/127.0.0.1#5335\nipset=/sony.com.sg/gfwlist\nserver=/xoteens.com/127.0.0.1#5335\nipset=/xoteens.com/gfwlist\nserver=/youtube.es/127.0.0.1#5335\nipset=/youtube.es/gfwlist\nserver=/illianacomputerrecycling.com/127.0.0.1#5335\nipset=/illianacomputerrecycling.com/gfwlist\nserver=/yahoo.nu/127.0.0.1#5335\nipset=/yahoo.nu/gfwlist\nserver=/apole.com/127.0.0.1#5335\nipset=/apole.com/gfwlist\nserver=/visa.ie/127.0.0.1#5335\nipset=/visa.ie/gfwlist\nserver=/mini.co.id/127.0.0.1#5335\nipset=/mini.co.id/gfwlist\nserver=/zooredtube.com/127.0.0.1#5335\nipset=/zooredtube.com/gfwlist\nserver=/fireemblemawakening.com/127.0.0.1#5335\nipset=/fireemblemawakening.com/gfwlist\nserver=/easports.jp/127.0.0.1#5335\nipset=/easports.jp/gfwlist\nserver=/oxfordartonline.com/127.0.0.1#5335\nipset=/oxfordartonline.com/gfwlist\nserver=/finishinfo.com/127.0.0.1#5335\nipset=/finishinfo.com/gfwlist\nserver=/durex.nl/127.0.0.1#5335\nipset=/durex.nl/gfwlist\nserver=/sfx.ms/127.0.0.1#5335\nipset=/sfx.ms/gfwlist\nserver=/telega.one/127.0.0.1#5335\nipset=/telega.one/gfwlist\nserver=/googlesyndication.com/127.0.0.1#5335\nipset=/googlesyndication.com/gfwlist\nserver=/bigtitsmodelsdirectory.com/127.0.0.1#5335\nipset=/bigtitsmodelsdirectory.com/gfwlist\nserver=/cbsaavideo.com/127.0.0.1#5335\nipset=/cbsaavideo.com/gfwlist\nserver=/googleadservices.com/127.0.0.1#5335\nipset=/googleadservices.com/gfwlist\nserver=/wikisexguide.com/127.0.0.1#5335\nipset=/wikisexguide.com/gfwlist\nserver=/esbeatsbydrebuy.com/127.0.0.1#5335\nipset=/esbeatsbydrebuy.com/gfwlist\nserver=/google-analytics.com/127.0.0.1#5335\nipset=/google-analytics.com/gfwlist\nserver=/happymeal.co.nz/127.0.0.1#5335\nipset=/happymeal.co.nz/gfwlist\nserver=/v2ray.com/127.0.0.1#5335\nipset=/v2ray.com/gfwlist\nserver=/ragnaporn.com/127.0.0.1#5335\nipset=/ragnaporn.com/gfwlist\nserver=/foxrobots.com/127.0.0.1#5335\nipset=/foxrobots.com/gfwlist\nserver=/dtci.co/127.0.0.1#5335\nipset=/dtci.co/gfwlist\nserver=/blogspot.ro/127.0.0.1#5335\nipset=/blogspot.ro/gfwlist\nserver=/bmw-connecteddrive.mx/127.0.0.1#5335\nipset=/bmw-connecteddrive.mx/gfwlist\nserver=/bmwmagazine.de/127.0.0.1#5335\nipset=/bmwmagazine.de/gfwlist\nserver=/spiritclubs.com/127.0.0.1#5335\nipset=/spiritclubs.com/gfwlist\nserver=/adservice.google.com/127.0.0.1#5335\nipset=/adservice.google.com/gfwlist\nserver=/mt-ssul1.com/127.0.0.1#5335\nipset=/mt-ssul1.com/gfwlist\nserver=/kindleoasis.us/127.0.0.1#5335\nipset=/kindleoasis.us/gfwlist\nserver=/bmw-motorrad.de/127.0.0.1#5335\nipset=/bmw-motorrad.de/gfwlist\nserver=/applestore.co.ug/127.0.0.1#5335\nipset=/applestore.co.ug/gfwlist\nserver=/ntdtv.ca/127.0.0.1#5335\nipset=/ntdtv.ca/gfwlist\nserver=/100shmar.net/127.0.0.1#5335\nipset=/100shmar.net/gfwlist\nserver=/xxxshame.com/127.0.0.1#5335\nipset=/xxxshame.com/gfwlist\nserver=/vox.com/127.0.0.1#5335\nipset=/vox.com/gfwlist\nserver=/icloud.org/127.0.0.1#5335\nipset=/icloud.org/gfwlist\nserver=/brand-protection-team.com/127.0.0.1#5335\nipset=/brand-protection-team.com/gfwlist\nserver=/potenza.jp/127.0.0.1#5335\nipset=/potenza.jp/gfwlist\nserver=/pornhuub.xyz/127.0.0.1#5335\nipset=/pornhuub.xyz/gfwlist\nserver=/acer-group.com/127.0.0.1#5335\nipset=/acer-group.com/gfwlist\nserver=/colorprotechnology.com/127.0.0.1#5335\nipset=/colorprotechnology.com/gfwlist\nserver=/disney.de/127.0.0.1#5335\nipset=/disney.de/gfwlist\nserver=/porntop.com/127.0.0.1#5335\nipset=/porntop.com/gfwlist\nserver=/youav.com/127.0.0.1#5335\nipset=/youav.com/gfwlist\nserver=/blackfridaydrebeatsnew.com/127.0.0.1#5335\nipset=/blackfridaydrebeatsnew.com/gfwlist\nserver=/monsterheadphone.net/127.0.0.1#5335\nipset=/monsterheadphone.net/gfwlist\nserver=/thegeorgiascene.com/127.0.0.1#5335\nipset=/thegeorgiascene.com/gfwlist\nserver=/tubemature.tv/127.0.0.1#5335\nipset=/tubemature.tv/gfwlist\nserver=/mundomais.com.br/127.0.0.1#5335\nipset=/mundomais.com.br/gfwlist\nserver=/tug.org/127.0.0.1#5335\nipset=/tug.org/gfwlist\nserver=/blogspot.ru/127.0.0.1#5335\nipset=/blogspot.ru/gfwlist\nserver=/graias.com/127.0.0.1#5335\nipset=/graias.com/gfwlist\nserver=/businessinsider.in/127.0.0.1#5335\nipset=/businessinsider.in/gfwlist\nserver=/blogspot.qa/127.0.0.1#5335\nipset=/blogspot.qa/gfwlist\nserver=/milfvr.com/127.0.0.1#5335\nipset=/milfvr.com/gfwlist\nserver=/marranazas.com/127.0.0.1#5335\nipset=/marranazas.com/gfwlist\nserver=/itunes.co/127.0.0.1#5335\nipset=/itunes.co/gfwlist\nserver=/blogspot.mx/127.0.0.1#5335\nipset=/blogspot.mx/gfwlist\nserver=/gettyimages.com.au/127.0.0.1#5335\nipset=/gettyimages.com.au/gfwlist\nserver=/blogspot.md/127.0.0.1#5335\nipset=/blogspot.md/gfwlist\nserver=/shemaleporn.xxx/127.0.0.1#5335\nipset=/shemaleporn.xxx/gfwlist\nserver=/virtualrealtrans.com/127.0.0.1#5335\nipset=/virtualrealtrans.com/gfwlist\nserver=/nikefree.com/127.0.0.1#5335\nipset=/nikefree.com/gfwlist\nserver=/paypal-media.com/127.0.0.1#5335\nipset=/paypal-media.com/gfwlist\nserver=/applecare.berlin/127.0.0.1#5335\nipset=/applecare.berlin/gfwlist\nserver=/blogspot.li/127.0.0.1#5335\nipset=/blogspot.li/gfwlist\nserver=/blogspot.it/127.0.0.1#5335\nipset=/blogspot.it/gfwlist\nserver=/beatsbydredanmarks.com/127.0.0.1#5335\nipset=/beatsbydredanmarks.com/gfwlist\nserver=/blogspot.in/127.0.0.1#5335\nipset=/blogspot.in/gfwlist\nserver=/bmw-motorrad.cz/127.0.0.1#5335\nipset=/bmw-motorrad.cz/gfwlist\nserver=/garena.live/127.0.0.1#5335\nipset=/garena.live/gfwlist\nserver=/blogspot.hu/127.0.0.1#5335\nipset=/blogspot.hu/gfwlist\nserver=/appleiphonecell.com/127.0.0.1#5335\nipset=/appleiphonecell.com/gfwlist\nserver=/justporn.link/127.0.0.1#5335\nipset=/justporn.link/gfwlist\nserver=/blogspot.gr/127.0.0.1#5335\nipset=/blogspot.gr/gfwlist\nserver=/youtube.at/127.0.0.1#5335\nipset=/youtube.at/gfwlist\nserver=/blogspot.fr/127.0.0.1#5335\nipset=/blogspot.fr/gfwlist\nserver=/newsnowfox.com/127.0.0.1#5335\nipset=/newsnowfox.com/gfwlist\nserver=/blogspot.fi/127.0.0.1#5335\nipset=/blogspot.fi/gfwlist\nserver=/blogspot.dk/127.0.0.1#5335\nipset=/blogspot.dk/gfwlist\nserver=/blogspot.de/127.0.0.1#5335\nipset=/blogspot.de/gfwlist\nserver=/pricelessaruba.com/127.0.0.1#5335\nipset=/pricelessaruba.com/gfwlist\nserver=/momo5188.com/127.0.0.1#5335\nipset=/momo5188.com/gfwlist\nserver=/scholar.google.co.id/127.0.0.1#5335\nipset=/scholar.google.co.id/gfwlist\nserver=/nudity911.com/127.0.0.1#5335\nipset=/nudity911.com/gfwlist\nserver=/blogspot.com.tr/127.0.0.1#5335\nipset=/blogspot.com.tr/gfwlist\nserver=/mofosex.com/127.0.0.1#5335\nipset=/mofosex.com/gfwlist\nserver=/bwh88.net/127.0.0.1#5335\nipset=/bwh88.net/gfwlist\nserver=/hentaihaven.red/127.0.0.1#5335\nipset=/hentaihaven.red/gfwlist\nserver=/duckduckhack.com/127.0.0.1#5335\nipset=/duckduckhack.com/gfwlist\nserver=/camsoda1.com/127.0.0.1#5335\nipset=/camsoda1.com/gfwlist\nserver=/ninemsn.com.au/127.0.0.1#5335\nipset=/ninemsn.com.au/gfwlist\nserver=/visa.dk/127.0.0.1#5335\nipset=/visa.dk/gfwlist\nserver=/cc18tv.com/127.0.0.1#5335\nipset=/cc18tv.com/gfwlist\nserver=/szwinnertechnology.com/127.0.0.1#5335\nipset=/szwinnertechnology.com/gfwlist\nserver=/officialdrdre.com/127.0.0.1#5335\nipset=/officialdrdre.com/gfwlist\nserver=/jiuse904.com/127.0.0.1#5335\nipset=/jiuse904.com/gfwlist\nserver=/blogspot.com.cy/127.0.0.1#5335\nipset=/blogspot.com.cy/gfwlist\nserver=/botorch.org/127.0.0.1#5335\nipset=/botorch.org/gfwlist\nserver=/blogspot.com.br/127.0.0.1#5335\nipset=/blogspot.com.br/gfwlist\nserver=/capitalgames.com/127.0.0.1#5335\nipset=/capitalgames.com/gfwlist\nserver=/nurofen.no/127.0.0.1#5335\nipset=/nurofen.no/gfwlist\nserver=/joyourself.com/127.0.0.1#5335\nipset=/joyourself.com/gfwlist\nserver=/openapiservice.com/127.0.0.1#5335\nipset=/openapiservice.com/gfwlist\nserver=/bannedbook.net/127.0.0.1#5335\nipset=/bannedbook.net/gfwlist\nserver=/finish.pt/127.0.0.1#5335\nipset=/finish.pt/gfwlist\nserver=/akamaitechnologies.net/127.0.0.1#5335\nipset=/akamaitechnologies.net/gfwlist\nserver=/foxdeportes.com/127.0.0.1#5335\nipset=/foxdeportes.com/gfwlist\nserver=/lsnzxzy1.com/127.0.0.1#5335\nipset=/lsnzxzy1.com/gfwlist\nserver=/asiangirlsnextdoor.com/127.0.0.1#5335\nipset=/asiangirlsnextdoor.com/gfwlist\nserver=/petardashd.com.ve/127.0.0.1#5335\nipset=/petardashd.com.ve/gfwlist\nserver=/primeday.info/127.0.0.1#5335\nipset=/primeday.info/gfwlist\nserver=/beatsbydredealscybermonday.com/127.0.0.1#5335\nipset=/beatsbydredealscybermonday.com/gfwlist\nserver=/paypal-prepagata.net/127.0.0.1#5335\nipset=/paypal-prepagata.net/gfwlist\nserver=/yale.edu/127.0.0.1#5335\nipset=/yale.edu/gfwlist\nserver=/blogspot.am/127.0.0.1#5335\nipset=/blogspot.am/gfwlist\nserver=/boobsrealm.com/127.0.0.1#5335\nipset=/boobsrealm.com/gfwlist\nserver=/ecoforme.jp/127.0.0.1#5335\nipset=/ecoforme.jp/gfwlist\nserver=/igpublish.com/127.0.0.1#5335\nipset=/igpublish.com/gfwlist\nserver=/blogspot.ae/127.0.0.1#5335\nipset=/blogspot.ae/gfwlist\nserver=/blogger.com/127.0.0.1#5335\nipset=/blogger.com/gfwlist\nserver=/comixzilla.com/127.0.0.1#5335\nipset=/comixzilla.com/gfwlist\nserver=/macintosh.eu/127.0.0.1#5335\nipset=/macintosh.eu/gfwlist\nserver=/gigabyte2.azureedge.net/127.0.0.1#5335\nipset=/gigabyte2.azureedge.net/gfwlist\nserver=/jokerlu1.info/127.0.0.1#5335\nipset=/jokerlu1.info/gfwlist\nserver=/faronicswise.com/127.0.0.1#5335\nipset=/faronicswise.com/gfwlist\nserver=/myclitgames.com/127.0.0.1#5335\nipset=/myclitgames.com/gfwlist\nserver=/blogterest.net/127.0.0.1#5335\nipset=/blogterest.net/gfwlist\nserver=/nikegrid.com/127.0.0.1#5335\nipset=/nikegrid.com/gfwlist\nserver=/etwealth.com/127.0.0.1#5335\nipset=/etwealth.com/gfwlist\nserver=/facebookinc.com/127.0.0.1#5335\nipset=/facebookinc.com/gfwlist\nserver=/intelatom.net/127.0.0.1#5335\nipset=/intelatom.net/gfwlist\nserver=/faronics.com.sg/127.0.0.1#5335\nipset=/faronics.com.sg/gfwlist\nserver=/strepsils.com.co/127.0.0.1#5335\nipset=/strepsils.com.co/gfwlist\nserver=/faronics.ca/127.0.0.1#5335\nipset=/faronics.ca/gfwlist\nserver=/deepfreeze.net/127.0.0.1#5335\nipset=/deepfreeze.net/gfwlist\nserver=/volvobuses.ch/127.0.0.1#5335\nipset=/volvobuses.ch/gfwlist\nserver=/pornbraze.com/127.0.0.1#5335\nipset=/pornbraze.com/gfwlist\nserver=/sci-hub.ee/127.0.0.1#5335\nipset=/sci-hub.ee/gfwlist\nserver=/deepfreeze.eu/127.0.0.1#5335\nipset=/deepfreeze.eu/gfwlist\nserver=/pornoingyen.hu/127.0.0.1#5335\nipset=/pornoingyen.hu/gfwlist\nserver=/nvidia.pl/127.0.0.1#5335\nipset=/nvidia.pl/gfwlist\nserver=/techliquidators.com/127.0.0.1#5335\nipset=/techliquidators.com/gfwlist\nserver=/lolpcs.com/127.0.0.1#5335\nipset=/lolpcs.com/gfwlist\nserver=/mainichi-athletepartners.jp/127.0.0.1#5335\nipset=/mainichi-athletepartners.jp/gfwlist\nserver=/disney.com.br/127.0.0.1#5335\nipset=/disney.com.br/gfwlist\nserver=/getwsone.com/127.0.0.1#5335\nipset=/getwsone.com/gfwlist\nserver=/adultgamescollector.com/127.0.0.1#5335\nipset=/adultgamescollector.com/gfwlist\nserver=/beatbd.com/127.0.0.1#5335\nipset=/beatbd.com/gfwlist\nserver=/account-paypal.org/127.0.0.1#5335\nipset=/account-paypal.org/gfwlist\nserver=/volvotrucks.co.il/127.0.0.1#5335\nipset=/volvotrucks.co.il/gfwlist\nserver=/limertw.cc/127.0.0.1#5335\nipset=/limertw.cc/gfwlist\nserver=/air-watch.com/127.0.0.1#5335\nipset=/air-watch.com/gfwlist\nserver=/vsphere.net/127.0.0.1#5335\nipset=/vsphere.net/gfwlist\nserver=/nfscdict.com/127.0.0.1#5335\nipset=/nfscdict.com/gfwlist\nserver=/rakuya.com.tw/127.0.0.1#5335\nipset=/rakuya.com.tw/gfwlist\nserver=/fox23maine.com/127.0.0.1#5335\nipset=/fox23maine.com/gfwlist\nserver=/vsphere.com/127.0.0.1#5335\nipset=/vsphere.com/gfwlist\nserver=/hyper.is/127.0.0.1#5335\nipset=/hyper.is/gfwlist\nserver=/ghcr.io/127.0.0.1#5335\nipset=/ghcr.io/gfwlist\nserver=/bmw.com.tr/127.0.0.1#5335\nipset=/bmw.com.tr/gfwlist\nserver=/physiology.org/127.0.0.1#5335\nipset=/physiology.org/gfwlist\nserver=/xbahis33.com/127.0.0.1#5335\nipset=/xbahis33.com/gfwlist\nserver=/disney.cz/127.0.0.1#5335\nipset=/disney.cz/gfwlist\nserver=/hentaicore.org/127.0.0.1#5335\nipset=/hentaicore.org/gfwlist\nserver=/erofights.com/127.0.0.1#5335\nipset=/erofights.com/gfwlist\nserver=/rakuten.ne.jp/127.0.0.1#5335\nipset=/rakuten.ne.jp/gfwlist\nserver=/beatsbydrdre-officials5.com/127.0.0.1#5335\nipset=/beatsbydrdre-officials5.com/gfwlist\nserver=/dombosco.com.br/127.0.0.1#5335\nipset=/dombosco.com.br/gfwlist\nserver=/livesexasian.com/127.0.0.1#5335\nipset=/livesexasian.com/gfwlist\nserver=/100classicbooks.com/127.0.0.1#5335\nipset=/100classicbooks.com/gfwlist\nserver=/yahoo.com.na/127.0.0.1#5335\nipset=/yahoo.com.na/gfwlist\nserver=/cloudhealthtech.com/127.0.0.1#5335\nipset=/cloudhealthtech.com/gfwlist\nserver=/cloudcredibility.com/127.0.0.1#5335\nipset=/cloudcredibility.com/gfwlist\nserver=/visa.de/127.0.0.1#5335\nipset=/visa.de/gfwlist\nserver=/dockerizer.com/127.0.0.1#5335\nipset=/dockerizer.com/gfwlist\nserver=/bitnamistudio.com/127.0.0.1#5335\nipset=/bitnamistudio.com/gfwlist\nserver=/nikechosen.com/127.0.0.1#5335\nipset=/nikechosen.com/gfwlist\nserver=/drkogyi.com/127.0.0.1#5335\nipset=/drkogyi.com/gfwlist\nserver=/corporatecashpassport.com/127.0.0.1#5335\nipset=/corporatecashpassport.com/gfwlist\nserver=/illusionh.com/127.0.0.1#5335\nipset=/illusionh.com/gfwlist\nserver=/youtube.com.pa/127.0.0.1#5335\nipset=/youtube.com.pa/gfwlist\nserver=/bitnami.com/127.0.0.1#5335\nipset=/bitnami.com/gfwlist\nserver=/2kcoretech.online/127.0.0.1#5335\nipset=/2kcoretech.online/gfwlist\nserver=/disneymagicmoments.es/127.0.0.1#5335\nipset=/disneymagicmoments.es/gfwlist\nserver=/cosplayworld.net/127.0.0.1#5335\nipset=/cosplayworld.net/gfwlist\nserver=/nginxconfig.io/127.0.0.1#5335\nipset=/nginxconfig.io/gfwlist\nserver=/workspaceair.com/127.0.0.1#5335\nipset=/workspaceair.com/gfwlist\nserver=/oranum.com/127.0.0.1#5335\nipset=/oranum.com/gfwlist\nserver=/cashback69.com/127.0.0.1#5335\nipset=/cashback69.com/gfwlist\nserver=/fox5ny.com/127.0.0.1#5335\nipset=/fox5ny.com/gfwlist\nserver=/legsex.com/127.0.0.1#5335\nipset=/legsex.com/gfwlist\nserver=/ikea.bh/127.0.0.1#5335\nipset=/ikea.bh/gfwlist\nserver=/oculusrift.com/127.0.0.1#5335\nipset=/oculusrift.com/gfwlist\nserver=/fffucked.com/127.0.0.1#5335\nipset=/fffucked.com/gfwlist\nserver=/animalsporn.net/127.0.0.1#5335\nipset=/animalsporn.net/gfwlist\nserver=/sony-africa.com/127.0.0.1#5335\nipset=/sony-africa.com/gfwlist\nserver=/ncl.edu.tw/127.0.0.1#5335\nipset=/ncl.edu.tw/gfwlist\nserver=/tabootube.xxx/127.0.0.1#5335\nipset=/tabootube.xxx/gfwlist\nserver=/bloombergchina.com/127.0.0.1#5335\nipset=/bloombergchina.com/gfwlist\nserver=/binancezh.net/127.0.0.1#5335\nipset=/binancezh.net/gfwlist\nserver=/whychoosehorizon.com/127.0.0.1#5335\nipset=/whychoosehorizon.com/gfwlist\nserver=/vmwservices.com/127.0.0.1#5335\nipset=/vmwservices.com/gfwlist\nserver=/ebayshop111.com/127.0.0.1#5335\nipset=/ebayshop111.com/gfwlist\nserver=/t21.nikkei.co.jp/127.0.0.1#5335\nipset=/t21.nikkei.co.jp/gfwlist\nserver=/buyaple.com/127.0.0.1#5335\nipset=/buyaple.com/gfwlist\nserver=/12diasdepresentesdeitunes.com/127.0.0.1#5335\nipset=/12diasdepresentesdeitunes.com/gfwlist\nserver=/5mo.fun/127.0.0.1#5335\nipset=/5mo.fun/gfwlist\nserver=/line.naver.jp/127.0.0.1#5335\nipset=/line.naver.jp/gfwlist\nserver=/socialmediagirls.com/127.0.0.1#5335\nipset=/socialmediagirls.com/gfwlist\nserver=/bmwcenternet.com/127.0.0.1#5335\nipset=/bmwcenternet.com/gfwlist\nserver=/amazondevicesupport.com/127.0.0.1#5335\nipset=/amazondevicesupport.com/gfwlist\nserver=/rclon.com/127.0.0.1#5335\nipset=/rclon.com/gfwlist\nserver=/ikea.ma/127.0.0.1#5335\nipset=/ikea.ma/gfwlist\nserver=/bmw-mdrivetour.com/127.0.0.1#5335\nipset=/bmw-mdrivetour.com/gfwlist\nserver=/vmwlearningplatform.com/127.0.0.1#5335\nipset=/vmwlearningplatform.com/gfwlist\nserver=/tteshop.com/127.0.0.1#5335\nipset=/tteshop.com/gfwlist\nserver=/stateofthemap.com/127.0.0.1#5335\nipset=/stateofthemap.com/gfwlist\nserver=/scatsite.com/127.0.0.1#5335\nipset=/scatsite.com/gfwlist\nserver=/prodrive-japan.com/127.0.0.1#5335\nipset=/prodrive-japan.com/gfwlist\nserver=/thomsonreuters.in/127.0.0.1#5335\nipset=/thomsonreuters.in/gfwlist\nserver=/visa.co.ni/127.0.0.1#5335\nipset=/visa.co.ni/gfwlist\nserver=/ikea.com.in/127.0.0.1#5335\nipset=/ikea.com.in/gfwlist\nserver=/placemyad.com.au/127.0.0.1#5335\nipset=/placemyad.com.au/gfwlist\nserver=/vmwarelearningplatform.com/127.0.0.1#5335\nipset=/vmwarelearningplatform.com/gfwlist\nserver=/samsungcloud.com/127.0.0.1#5335\nipset=/samsungcloud.com/gfwlist\nserver=/paypal-comunidad.com/127.0.0.1#5335\nipset=/paypal-comunidad.com/gfwlist\nserver=/appleoriginalproductions.com/127.0.0.1#5335\nipset=/appleoriginalproductions.com/gfwlist\nserver=/mirrorsedge.net/127.0.0.1#5335\nipset=/mirrorsedge.net/gfwlist\nserver=/carcare-and-tireshop.jp/127.0.0.1#5335\nipset=/carcare-and-tireshop.jp/gfwlist\nserver=/vmwaregrid.com/127.0.0.1#5335\nipset=/vmwaregrid.com/gfwlist\nserver=/facebookbrand.net/127.0.0.1#5335\nipset=/facebookbrand.net/gfwlist\nserver=/foxsoccer.tv/127.0.0.1#5335\nipset=/foxsoccer.tv/gfwlist\nserver=/clubseventeen.com/127.0.0.1#5335\nipset=/clubseventeen.com/gfwlist\nserver=/vmwaredemandcenter.com/127.0.0.1#5335\nipset=/vmwaredemandcenter.com/gfwlist\nserver=/yande.re/127.0.0.1#5335\nipset=/yande.re/gfwlist\nserver=/cindymovies.com/127.0.0.1#5335\nipset=/cindymovies.com/gfwlist\nserver=/applefinalcutproworld.com/127.0.0.1#5335\nipset=/applefinalcutproworld.com/gfwlist\nserver=/camfox.com/127.0.0.1#5335\nipset=/camfox.com/gfwlist\nserver=/vmwareausnews.com/127.0.0.1#5335\nipset=/vmwareausnews.com/gfwlist\nserver=/verisign.de/127.0.0.1#5335\nipset=/verisign.de/gfwlist\nserver=/yahoo.ps/127.0.0.1#5335\nipset=/yahoo.ps/gfwlist\nserver=/bamtoki.com/127.0.0.1#5335\nipset=/bamtoki.com/gfwlist\nserver=/dlercloud.org/127.0.0.1#5335\nipset=/dlercloud.org/gfwlist\nserver=/akamai-staging.net/127.0.0.1#5335\nipset=/akamai-staging.net/gfwlist\nserver=/viet69.link/127.0.0.1#5335\nipset=/viet69.link/gfwlist\nserver=/microsofttranslator.com/127.0.0.1#5335\nipset=/microsofttranslator.com/gfwlist\nserver=/softbankrobotics.com/127.0.0.1#5335\nipset=/softbankrobotics.com/gfwlist\nserver=/vmware-cloudmanagement.com/127.0.0.1#5335\nipset=/vmware-cloudmanagement.com/gfwlist\nserver=/babesofindia.com/127.0.0.1#5335\nipset=/babesofindia.com/gfwlist\nserver=/vmmark.com/127.0.0.1#5335\nipset=/vmmark.com/gfwlist\nserver=/business-i.jp/127.0.0.1#5335\nipset=/business-i.jp/gfwlist\nserver=/facebook30.com/127.0.0.1#5335\nipset=/facebook30.com/gfwlist\nserver=/enemaexperiences.com/127.0.0.1#5335\nipset=/enemaexperiences.com/gfwlist\nserver=/vmglobal.net/127.0.0.1#5335\nipset=/vmglobal.net/gfwlist\nserver=/vfabric.net/127.0.0.1#5335\nipset=/vfabric.net/gfwlist\nserver=/maxgo.com/127.0.0.1#5335\nipset=/maxgo.com/gfwlist\nserver=/termux.com/127.0.0.1#5335\nipset=/termux.com/gfwlist\nserver=/vcanedge.com/127.0.0.1#5335\nipset=/vcanedge.com/gfwlist\nserver=/ssdevrd.com/127.0.0.1#5335\nipset=/ssdevrd.com/gfwlist\nserver=/blackamateursvideos.com/127.0.0.1#5335\nipset=/blackamateursvideos.com/gfwlist\nserver=/bmwusfactory.com/127.0.0.1#5335\nipset=/bmwusfactory.com/gfwlist\nserver=/youtube.bo/127.0.0.1#5335\nipset=/youtube.bo/gfwlist\nserver=/drdre-beats.com/127.0.0.1#5335\nipset=/drdre-beats.com/gfwlist\nserver=/electbabe.com/127.0.0.1#5335\nipset=/electbabe.com/gfwlist\nserver=/klik.me/127.0.0.1#5335\nipset=/klik.me/gfwlist\nserver=/hwslabs.com/127.0.0.1#5335\nipset=/hwslabs.com/gfwlist\nserver=/greenplum.net/127.0.0.1#5335\nipset=/greenplum.net/gfwlist\nserver=/beatsbydre-club.com/127.0.0.1#5335\nipset=/beatsbydre-club.com/gfwlist\nserver=/cisconetapp.com/127.0.0.1#5335\nipset=/cisconetapp.com/gfwlist\nserver=/gelbooru.wjcodes.com/127.0.0.1#5335\nipset=/gelbooru.wjcodes.com/gfwlist\nserver=/eliteindianporn.com/127.0.0.1#5335\nipset=/eliteindianporn.com/gfwlist\nserver=/hochi.news/127.0.0.1#5335\nipset=/hochi.news/gfwlist\nserver=/hentairead.info/127.0.0.1#5335\nipset=/hentairead.info/gfwlist\nserver=/youngmommyfucksme.com/127.0.0.1#5335\nipset=/youngmommyfucksme.com/gfwlist\nserver=/rarbgunblock.org/127.0.0.1#5335\nipset=/rarbgunblock.org/gfwlist\nserver=/cpedge.com/127.0.0.1#5335\nipset=/cpedge.com/gfwlist\nserver=/bollywoodlife.com/127.0.0.1#5335\nipset=/bollywoodlife.com/gfwlist\nserver=/pornhubapparel.com/127.0.0.1#5335\nipset=/pornhubapparel.com/gfwlist\nserver=/rolls-roycemotorcars.com/127.0.0.1#5335\nipset=/rolls-roycemotorcars.com/gfwlist\nserver=/archiveofourown.org/127.0.0.1#5335\nipset=/archiveofourown.org/gfwlist\nserver=/bookmybridgestonetyre.com/127.0.0.1#5335\nipset=/bookmybridgestonetyre.com/gfwlist\nserver=/cfblob.com/127.0.0.1#5335\nipset=/cfblob.com/gfwlist\nserver=/costco-static.com/127.0.0.1#5335\nipset=/costco-static.com/gfwlist\nserver=/duckduckgo.pl/127.0.0.1#5335\nipset=/duckduckgo.pl/gfwlist\nserver=/filmeleporno.xxx/127.0.0.1#5335\nipset=/filmeleporno.xxx/gfwlist\nserver=/monsterbeatssales.com/127.0.0.1#5335\nipset=/monsterbeatssales.com/gfwlist\nserver=/4cdn.org/127.0.0.1#5335\nipset=/4cdn.org/gfwlist\nserver=/akamai.co.kr/127.0.0.1#5335\nipset=/akamai.co.kr/gfwlist\nserver=/telegram.dog/127.0.0.1#5335\nipset=/telegram.dog/gfwlist\nserver=/collabora.co.uk/127.0.0.1#5335\nipset=/collabora.co.uk/gfwlist\nserver=/cloudcone.net/127.0.0.1#5335\nipset=/cloudcone.net/gfwlist\nserver=/besthentaitube.com/127.0.0.1#5335\nipset=/besthentaitube.com/gfwlist\nserver=/cnyes.com/127.0.0.1#5335\nipset=/cnyes.com/gfwlist\nserver=/cloudcone.com/127.0.0.1#5335\nipset=/cloudcone.com/gfwlist\nserver=/ikea.is/127.0.0.1#5335\nipset=/ikea.is/gfwlist\nserver=/aweencore.com/127.0.0.1#5335\nipset=/aweencore.com/gfwlist\nserver=/melonstube.com/127.0.0.1#5335\nipset=/melonstube.com/gfwlist\nserver=/jilhub.com/127.0.0.1#5335\nipset=/jilhub.com/gfwlist\nserver=/armovs.com/127.0.0.1#5335\nipset=/armovs.com/gfwlist\nserver=/hitxhot.com/127.0.0.1#5335\nipset=/hitxhot.com/gfwlist\nserver=/cisco.evergage.com/127.0.0.1#5335\nipset=/cisco.evergage.com/gfwlist\nserver=/nikeshoesgroup.com/127.0.0.1#5335\nipset=/nikeshoesgroup.com/gfwlist\nserver=/tettediferro.it/127.0.0.1#5335\nipset=/tettediferro.it/gfwlist\nserver=/tailf.com/127.0.0.1#5335\nipset=/tailf.com/gfwlist\nserver=/hindawi.com/127.0.0.1#5335\nipset=/hindawi.com/gfwlist\nserver=/thomsonreuters.com.hk/127.0.0.1#5335\nipset=/thomsonreuters.com.hk/gfwlist\nserver=/thecamdude.com/127.0.0.1#5335\nipset=/thecamdude.com/gfwlist\nserver=/wet-ass-pussy.com/127.0.0.1#5335\nipset=/wet-ass-pussy.com/gfwlist\nserver=/toplayerserver.com/127.0.0.1#5335\nipset=/toplayerserver.com/gfwlist\nserver=/appdynamics.org/127.0.0.1#5335\nipset=/appdynamics.org/gfwlist\nserver=/dmm.co.jp/127.0.0.1#5335\nipset=/dmm.co.jp/gfwlist\nserver=/climateone.blogspot.co.id/127.0.0.1#5335\nipset=/climateone.blogspot.co.id/gfwlist\nserver=/appdynamics.jp/127.0.0.1#5335\nipset=/appdynamics.jp/gfwlist\nserver=/foxandfriends.com/127.0.0.1#5335\nipset=/foxandfriends.com/gfwlist\nserver=/beatsbydre-sell.com/127.0.0.1#5335\nipset=/beatsbydre-sell.com/gfwlist\nserver=/appdynamics.co.uk/127.0.0.1#5335\nipset=/appdynamics.co.uk/gfwlist\nserver=/rule34.asia/127.0.0.1#5335\nipset=/rule34.asia/gfwlist\nserver=/facebookcom.com/127.0.0.1#5335\nipset=/facebookcom.com/gfwlist\nserver=/konachan.wjcodes.com/127.0.0.1#5335\nipset=/konachan.wjcodes.com/gfwlist\nserver=/nytco.com/127.0.0.1#5335\nipset=/nytco.com/gfwlist\nserver=/boylove.cc/127.0.0.1#5335\nipset=/boylove.cc/gfwlist\nserver=/elite.com/127.0.0.1#5335\nipset=/elite.com/gfwlist\nserver=/vfsco.pe/127.0.0.1#5335\nipset=/vfsco.pe/gfwlist\nserver=/bcovlive-a.akamaihd.net/127.0.0.1#5335\nipset=/bcovlive-a.akamaihd.net/gfwlist\nserver=/virtuata.com/127.0.0.1#5335\nipset=/virtuata.com/gfwlist\nserver=/ssl.com/127.0.0.1#5335\nipset=/ssl.com/gfwlist\nserver=/ciscoinvestments.com/127.0.0.1#5335\nipset=/ciscoinvestments.com/gfwlist\nserver=/worldofwarcraft.com/127.0.0.1#5335\nipset=/worldofwarcraft.com/gfwlist\nserver=/versly.com/127.0.0.1#5335\nipset=/versly.com/gfwlist\nserver=/cowboom.com/127.0.0.1#5335\nipset=/cowboom.com/gfwlist\nserver=/accountpaypal.com/127.0.0.1#5335\nipset=/accountpaypal.com/gfwlist\nserver=/tandberg-china.com/127.0.0.1#5335\nipset=/tandberg-china.com/gfwlist\nserver=/myfoxtampa.com/127.0.0.1#5335\nipset=/myfoxtampa.com/gfwlist\nserver=/hoyolab.com/127.0.0.1#5335\nipset=/hoyolab.com/gfwlist\nserver=/nintendo.no/127.0.0.1#5335\nipset=/nintendo.no/gfwlist\nserver=/mornporn.com/127.0.0.1#5335\nipset=/mornporn.com/gfwlist\nserver=/regiongold.com/127.0.0.1#5335\nipset=/regiongold.com/gfwlist\nserver=/parstream.org/127.0.0.1#5335\nipset=/parstream.org/gfwlist\nserver=/top100nl.net/127.0.0.1#5335\nipset=/top100nl.net/gfwlist\nserver=/greatfire.org/127.0.0.1#5335\nipset=/greatfire.org/gfwlist\nserver=/free-sns.com/127.0.0.1#5335\nipset=/free-sns.com/gfwlist\nserver=/camelspaceeffect.com/127.0.0.1#5335\nipset=/camelspaceeffect.com/gfwlist\nserver=/githubusercontent.com/127.0.0.1#5335\nipset=/githubusercontent.com/gfwlist\nserver=/obsrvbl.com/127.0.0.1#5335\nipset=/obsrvbl.com/gfwlist\nserver=/allporncomic.com/127.0.0.1#5335\nipset=/allporncomic.com/gfwlist\nserver=/netacad.com/127.0.0.1#5335\nipset=/netacad.com/gfwlist\nserver=/cloudflare.com/127.0.0.1#5335\nipset=/cloudflare.com/gfwlist\nserver=/mysdn.info/127.0.0.1#5335\nipset=/mysdn.info/gfwlist\nserver=/zoofiction.com/127.0.0.1#5335\nipset=/zoofiction.com/gfwlist\nserver=/mysdn.com/127.0.0.1#5335\nipset=/mysdn.com/gfwlist\nserver=/myciscobenefits.com/127.0.0.1#5335\nipset=/myciscobenefits.com/gfwlist\nserver=/multiplydiversity.com/127.0.0.1#5335\nipset=/multiplydiversity.com/gfwlist\nserver=/adultgames.games/127.0.0.1#5335\nipset=/adultgames.games/gfwlist\nserver=/securepaypal.info/127.0.0.1#5335\nipset=/securepaypal.info/gfwlist\nserver=/beatsbydrefriday.com/127.0.0.1#5335\nipset=/beatsbydrefriday.com/gfwlist\nserver=/bmw-motorrad.ch/127.0.0.1#5335\nipset=/bmw-motorrad.ch/gfwlist\nserver=/onlyams.com/127.0.0.1#5335\nipset=/onlyams.com/gfwlist\nserver=/matters.news/127.0.0.1#5335\nipset=/matters.news/gfwlist\nserver=/facebookdevelopergarage.com/127.0.0.1#5335\nipset=/facebookdevelopergarage.com/gfwlist\nserver=/scholar.google.it/127.0.0.1#5335\nipset=/scholar.google.it/gfwlist\nserver=/gpstheseries.com/127.0.0.1#5335\nipset=/gpstheseries.com/gfwlist\nserver=/devm2m.com/127.0.0.1#5335\nipset=/devm2m.com/gfwlist\nserver=/xxxdinotube.com/127.0.0.1#5335\nipset=/xxxdinotube.com/gfwlist\nserver=/careerfundas.com/127.0.0.1#5335\nipset=/careerfundas.com/gfwlist\nserver=/badsexygirl.com/127.0.0.1#5335\nipset=/badsexygirl.com/gfwlist\nserver=/coreoptics.net/127.0.0.1#5335\nipset=/coreoptics.net/gfwlist\nserver=/managedpki.ne.jp/127.0.0.1#5335\nipset=/managedpki.ne.jp/gfwlist\nserver=/beatthatquote.com/127.0.0.1#5335\nipset=/beatthatquote.com/gfwlist\nserver=/foxnewshealth.com/127.0.0.1#5335\nipset=/foxnewshealth.com/gfwlist\nserver=/connect-in-canada.com/127.0.0.1#5335\nipset=/connect-in-canada.com/gfwlist\nserver=/celebritygay.com/127.0.0.1#5335\nipset=/celebritygay.com/gfwlist\nserver=/mdialog.com/127.0.0.1#5335\nipset=/mdialog.com/gfwlist\nserver=/seancody.com/127.0.0.1#5335\nipset=/seancody.com/gfwlist\nserver=/ciscovideo.com/127.0.0.1#5335\nipset=/ciscovideo.com/gfwlist\nserver=/ciscotaccc.com/127.0.0.1#5335\nipset=/ciscotaccc.com/gfwlist\nserver=/psiphon3.com/127.0.0.1#5335\nipset=/psiphon3.com/gfwlist\nserver=/ciscospark.jp/127.0.0.1#5335\nipset=/ciscospark.jp/gfwlist\nserver=/dutrai.com/127.0.0.1#5335\nipset=/dutrai.com/gfwlist\nserver=/severreal.org/127.0.0.1#5335\nipset=/severreal.org/gfwlist\nserver=/mini.co.me/127.0.0.1#5335\nipset=/mini.co.me/gfwlist\nserver=/bmw-oman.com/127.0.0.1#5335\nipset=/bmw-oman.com/gfwlist\nserver=/acheterdesfollowersinstagram.com/127.0.0.1#5335\nipset=/acheterdesfollowersinstagram.com/gfwlist\nserver=/beatsdresale2013.com/127.0.0.1#5335\nipset=/beatsdresale2013.com/gfwlist\nserver=/fbwat.ch/127.0.0.1#5335\nipset=/fbwat.ch/gfwlist\nserver=/volvotrucks.it/127.0.0.1#5335\nipset=/volvotrucks.it/gfwlist\nserver=/sex-teen.net/127.0.0.1#5335\nipset=/sex-teen.net/gfwlist\nserver=/ciscoprice.com/127.0.0.1#5335\nipset=/ciscoprice.com/gfwlist\nserver=/gfrevenge.com/127.0.0.1#5335\nipset=/gfrevenge.com/gfwlist\nserver=/ciscopowercube.com/127.0.0.1#5335\nipset=/ciscopowercube.com/gfwlist\nserver=/cisconetspace.net/127.0.0.1#5335\nipset=/cisconetspace.net/gfwlist\nserver=/cisconetspace.com/127.0.0.1#5335\nipset=/cisconetspace.com/gfwlist\nserver=/ciscolearningsystem.com/127.0.0.1#5335\nipset=/ciscolearningsystem.com/gfwlist\nserver=/horsedick.net/127.0.0.1#5335\nipset=/horsedick.net/gfwlist\nserver=/mol.im/127.0.0.1#5335\nipset=/mol.im/gfwlist\nserver=/mastercardidtheftalerts.com/127.0.0.1#5335\nipset=/mastercardidtheftalerts.com/gfwlist\nserver=/777xporn.com/127.0.0.1#5335\nipset=/777xporn.com/gfwlist\nserver=/ciscoerate.com/127.0.0.1#5335\nipset=/ciscoerate.com/gfwlist\nserver=/ciscoconnectcloud.org/127.0.0.1#5335\nipset=/ciscoconnectcloud.org/gfwlist\nserver=/ciscoconnectcloud.net/127.0.0.1#5335\nipset=/ciscoconnectcloud.net/gfwlist\nserver=/myporngay.com/127.0.0.1#5335\nipset=/myporngay.com/gfwlist\nserver=/ciscoccservice.com/127.0.0.1#5335\nipset=/ciscoccservice.com/gfwlist\nserver=/twitchcdn.net/127.0.0.1#5335\nipset=/twitchcdn.net/gfwlist\nserver=/airav.cc/127.0.0.1#5335\nipset=/airav.cc/gfwlist\nserver=/tssp.best/127.0.0.1#5335\nipset=/tssp.best/gfwlist\nserver=/cdnlab.live/127.0.0.1#5335\nipset=/cdnlab.live/gfwlist\nserver=/barrons-advisor.com/127.0.0.1#5335\nipset=/barrons-advisor.com/gfwlist\nserver=/beatsheadphonesale.com/127.0.0.1#5335\nipset=/beatsheadphonesale.com/gfwlist\nserver=/cciesecuritylabs.com/127.0.0.1#5335\nipset=/cciesecuritylabs.com/gfwlist\nserver=/disneynewseries.com/127.0.0.1#5335\nipset=/disneynewseries.com/gfwlist\nserver=/pornodoido.com/127.0.0.1#5335\nipset=/pornodoido.com/gfwlist\nserver=/cciernslabs.com/127.0.0.1#5335\nipset=/cciernslabs.com/gfwlist\nserver=/academynetriders.com/127.0.0.1#5335\nipset=/academynetriders.com/gfwlist\nserver=/volvotrucks.com.co/127.0.0.1#5335\nipset=/volvotrucks.com.co/gfwlist\nserver=/dierectv.com/127.0.0.1#5335\nipset=/dierectv.com/gfwlist\nserver=/webex.com.br/127.0.0.1#5335\nipset=/webex.com.br/gfwlist\nserver=/discord.gift/127.0.0.1#5335\nipset=/discord.gift/gfwlist\nserver=/evgld7cg58l8.com/127.0.0.1#5335\nipset=/evgld7cg58l8.com/gfwlist\nserver=/womensnikeshox.com/127.0.0.1#5335\nipset=/womensnikeshox.com/gfwlist\nserver=/bmw-security-vehicles.com/127.0.0.1#5335\nipset=/bmw-security-vehicles.com/gfwlist\nserver=/beatsbydre-outletstore.com/127.0.0.1#5335\nipset=/beatsbydre-outletstore.com/gfwlist\nserver=/finish.at/127.0.0.1#5335\nipset=/finish.at/gfwlist\nserver=/shemalez.com/127.0.0.1#5335\nipset=/shemalez.com/gfwlist\nserver=/webex.co.jp/127.0.0.1#5335\nipset=/webex.co.jp/gfwlist\nserver=/webex.co.it/127.0.0.1#5335\nipset=/webex.co.it/gfwlist\nserver=/as-dash-uk-live.akamaized.net/127.0.0.1#5335\nipset=/as-dash-uk-live.akamaized.net/gfwlist\nserver=/webex.co.in/127.0.0.1#5335\nipset=/webex.co.in/gfwlist\nserver=/faceebot.com/127.0.0.1#5335\nipset=/faceebot.com/gfwlist\nserver=/instagainer.com/127.0.0.1#5335\nipset=/instagainer.com/gfwlist\nserver=/platinumlinks.org/127.0.0.1#5335\nipset=/platinumlinks.org/gfwlist\nserver=/hp.company/127.0.0.1#5335\nipset=/hp.company/gfwlist\nserver=/vpejey.xyz/127.0.0.1#5335\nipset=/vpejey.xyz/gfwlist\nserver=/tradevip1.com/127.0.0.1#5335\nipset=/tradevip1.com/gfwlist\nserver=/canon.si/127.0.0.1#5335\nipset=/canon.si/gfwlist\nserver=/uux68.com/127.0.0.1#5335\nipset=/uux68.com/gfwlist\nserver=/papermc.io/127.0.0.1#5335\nipset=/papermc.io/gfwlist\nserver=/blizzak-juken.jp/127.0.0.1#5335\nipset=/blizzak-juken.jp/gfwlist\nserver=/xvirtual.com/127.0.0.1#5335\nipset=/xvirtual.com/gfwlist\nserver=/foxinc.com/127.0.0.1#5335\nipset=/foxinc.com/gfwlist\nserver=/free-avx.jp/127.0.0.1#5335\nipset=/free-avx.jp/gfwlist\nserver=/nintendo.se/127.0.0.1#5335\nipset=/nintendo.se/gfwlist\nserver=/hentai-gamer.com/127.0.0.1#5335\nipset=/hentai-gamer.com/gfwlist\nserver=/appstore.co.id/127.0.0.1#5335\nipset=/appstore.co.id/gfwlist\nserver=/newsukadops.com/127.0.0.1#5335\nipset=/newsukadops.com/gfwlist\nserver=/akamaitech.com/127.0.0.1#5335\nipset=/akamaitech.com/gfwlist\nserver=/applehealth.com.hk/127.0.0.1#5335\nipset=/applehealth.com.hk/gfwlist\nserver=/canon.no/127.0.0.1#5335\nipset=/canon.no/gfwlist\nserver=/wiisportsresort.com/127.0.0.1#5335\nipset=/wiisportsresort.com/gfwlist\nserver=/nverxs.xyz/127.0.0.1#5335\nipset=/nverxs.xyz/gfwlist\nserver=/binancezh.com/127.0.0.1#5335\nipset=/binancezh.com/gfwlist\nserver=/visadigital.com/127.0.0.1#5335\nipset=/visadigital.com/gfwlist\nserver=/riotpin.com/127.0.0.1#5335\nipset=/riotpin.com/gfwlist\nserver=/canon.it/127.0.0.1#5335\nipset=/canon.it/gfwlist\nserver=/google.dz/127.0.0.1#5335\nipset=/google.dz/gfwlist\nserver=/canon.ie/127.0.0.1#5335\nipset=/canon.ie/gfwlist\nserver=/adobetcstrialdvd.com/127.0.0.1#5335\nipset=/adobetcstrialdvd.com/gfwlist\nserver=/nfscofficial.com/127.0.0.1#5335\nipset=/nfscofficial.com/gfwlist\nserver=/monsterbeats8beatsbydre.com/127.0.0.1#5335\nipset=/monsterbeats8beatsbydre.com/gfwlist\nserver=/bmw.com.my/127.0.0.1#5335\nipset=/bmw.com.my/gfwlist\nserver=/gfysex.com/127.0.0.1#5335\nipset=/gfysex.com/gfwlist\nserver=/dogatch.jp/127.0.0.1#5335\nipset=/dogatch.jp/gfwlist\nserver=/otokonokoland.com/127.0.0.1#5335\nipset=/otokonokoland.com/gfwlist\nserver=/amakings.com/127.0.0.1#5335\nipset=/amakings.com/gfwlist\nserver=/visaeurope.ch/127.0.0.1#5335\nipset=/visaeurope.ch/gfwlist\nserver=/geileomas.com/127.0.0.1#5335\nipset=/geileomas.com/gfwlist\nserver=/canon.es/127.0.0.1#5335\nipset=/canon.es/gfwlist\nserver=/canon-cna.com/127.0.0.1#5335\nipset=/canon-cna.com/gfwlist\nserver=/beatsbydrdre-onsale.com/127.0.0.1#5335\nipset=/beatsbydrdre-onsale.com/gfwlist\nserver=/amazonprimevideos.com/127.0.0.1#5335\nipset=/amazonprimevideos.com/gfwlist\nserver=/kaktuz.com/127.0.0.1#5335\nipset=/kaktuz.com/gfwlist\nserver=/sexyhub.com/127.0.0.1#5335\nipset=/sexyhub.com/gfwlist\nserver=/forbes.com/127.0.0.1#5335\nipset=/forbes.com/gfwlist\nserver=/debugproject.com/127.0.0.1#5335\nipset=/debugproject.com/gfwlist\nserver=/firestonecompleteautocare.com/127.0.0.1#5335\nipset=/firestonecompleteautocare.com/gfwlist\nserver=/canon.com.tw/127.0.0.1#5335\nipset=/canon.com.tw/gfwlist\nserver=/canon.com.tr/127.0.0.1#5335\nipset=/canon.com.tr/gfwlist\nserver=/canon.com.my/127.0.0.1#5335\nipset=/canon.com.my/gfwlist\nserver=/javjunkies.com/127.0.0.1#5335\nipset=/javjunkies.com/gfwlist\nserver=/ebayenterprise.com/127.0.0.1#5335\nipset=/ebayenterprise.com/gfwlist\nserver=/brourou.com/127.0.0.1#5335\nipset=/brourou.com/gfwlist\nserver=/deutschewelle.h-cdn.com/127.0.0.1#5335\nipset=/deutschewelle.h-cdn.com/gfwlist\nserver=/canon.com/127.0.0.1#5335\nipset=/canon.com/gfwlist\nserver=/canon.co.uk/127.0.0.1#5335\nipset=/canon.co.uk/gfwlist\nserver=/aiasahi.jp/127.0.0.1#5335\nipset=/aiasahi.jp/gfwlist\nserver=/canon.be/127.0.0.1#5335\nipset=/canon.be/gfwlist\nserver=/mini.com.br/127.0.0.1#5335\nipset=/mini.com.br/gfwlist\nserver=/applestor.com/127.0.0.1#5335\nipset=/applestor.com/gfwlist\nserver=/google.com.bh/127.0.0.1#5335\nipset=/google.com.bh/gfwlist\nserver=/canon.at/127.0.0.1#5335\nipset=/canon.at/gfwlist\nserver=/mainichi.jp/127.0.0.1#5335\nipset=/mainichi.jp/gfwlist\nserver=/canon.am/127.0.0.1#5335\nipset=/canon.am/gfwlist\nserver=/scholar.google.ro/127.0.0.1#5335\nipset=/scholar.google.ro/gfwlist\nserver=/virginpornlinks.com/127.0.0.1#5335\nipset=/virginpornlinks.com/gfwlist\nserver=/verisign.jobs/127.0.0.1#5335\nipset=/verisign.jobs/gfwlist\nserver=/mini-connected.cz/127.0.0.1#5335\nipset=/mini-connected.cz/gfwlist\nserver=/canon-se.com.tw/127.0.0.1#5335\nipset=/canon-se.com.tw/gfwlist\nserver=/macbook.co/127.0.0.1#5335\nipset=/macbook.co/gfwlist\nserver=/enema-videos.com/127.0.0.1#5335\nipset=/enema-videos.com/gfwlist\nserver=/ero-ma-nia.com/127.0.0.1#5335\nipset=/ero-ma-nia.com/gfwlist\nserver=/canon-europa.com/127.0.0.1#5335\nipset=/canon-europa.com/gfwlist\nserver=/magicmovies.com/127.0.0.1#5335\nipset=/magicmovies.com/gfwlist\nserver=/canon.pl/127.0.0.1#5335\nipset=/canon.pl/gfwlist\nserver=/scatkings.com/127.0.0.1#5335\nipset=/scatkings.com/gfwlist\nserver=/kijjiji.ca/127.0.0.1#5335\nipset=/kijjiji.ca/gfwlist\nserver=/repswing.com/127.0.0.1#5335\nipset=/repswing.com/gfwlist\nserver=/xvideos.red/127.0.0.1#5335\nipset=/xvideos.red/gfwlist\nserver=/canon-emirates.ae/127.0.0.1#5335\nipset=/canon-emirates.ae/gfwlist\nserver=/canon-ebm.com.hk/127.0.0.1#5335\nipset=/canon-ebm.com.hk/gfwlist\nserver=/paypal-redeem.com/127.0.0.1#5335\nipset=/paypal-redeem.com/gfwlist\nserver=/18av.pro/127.0.0.1#5335\nipset=/18av.pro/gfwlist\nserver=/brilliant.org/127.0.0.1#5335\nipset=/brilliant.org/gfwlist\nserver=/facebook-texas-holdem.net/127.0.0.1#5335\nipset=/facebook-texas-holdem.net/gfwlist\nserver=/mastercardbiz.ca/127.0.0.1#5335\nipset=/mastercardbiz.ca/gfwlist\nserver=/adultism.com/127.0.0.1#5335\nipset=/adultism.com/gfwlist\nserver=/avstar4.com/127.0.0.1#5335\nipset=/avstar4.com/gfwlist\nserver=/samsungdm.com/127.0.0.1#5335\nipset=/samsungdm.com/gfwlist\nserver=/puripuriunkomura.com/127.0.0.1#5335\nipset=/puripuriunkomura.com/gfwlist\nserver=/asianprivatetube.com/127.0.0.1#5335\nipset=/asianprivatetube.com/gfwlist\nserver=/scienceonline.org/127.0.0.1#5335\nipset=/scienceonline.org/gfwlist\nserver=/wifeinterracialfuck.com/127.0.0.1#5335\nipset=/wifeinterracialfuck.com/gfwlist\nserver=/sony.ru/127.0.0.1#5335\nipset=/sony.ru/gfwlist\nserver=/bwh1.net/127.0.0.1#5335\nipset=/bwh1.net/gfwlist\nserver=/pugetsoundmini.com/127.0.0.1#5335\nipset=/pugetsoundmini.com/gfwlist\nserver=/mega.co.nz/127.0.0.1#5335\nipset=/mega.co.nz/gfwlist\nserver=/google.com.sg/127.0.0.1#5335\nipset=/google.com.sg/gfwlist\nserver=/googleanalytics.com/127.0.0.1#5335\nipset=/googleanalytics.com/gfwlist\nserver=/mydirectgroove.com/127.0.0.1#5335\nipset=/mydirectgroove.com/gfwlist\nserver=/le-direct.tv/127.0.0.1#5335\nipset=/le-direct.tv/gfwlist\nserver=/youtube.mk/127.0.0.1#5335\nipset=/youtube.mk/gfwlist\nserver=/newsprinters.co.uk/127.0.0.1#5335\nipset=/newsprinters.co.uk/gfwlist\nserver=/dropboxcaptcha.com/127.0.0.1#5335\nipset=/dropboxcaptcha.com/gfwlist\nserver=/successwithteams.com/127.0.0.1#5335\nipset=/successwithteams.com/gfwlist\nserver=/diretv.com/127.0.0.1#5335\nipset=/diretv.com/gfwlist\nserver=/directvsundayticket.com/127.0.0.1#5335\nipset=/directvsundayticket.com/gfwlist\nserver=/paypalservice.com/127.0.0.1#5335\nipset=/paypalservice.com/gfwlist\nserver=/bestbhy.com/127.0.0.1#5335\nipset=/bestbhy.com/gfwlist\nserver=/directvrebate.com/127.0.0.1#5335\nipset=/directvrebate.com/gfwlist\nserver=/directvpromotions.com/127.0.0.1#5335\nipset=/directvpromotions.com/gfwlist\nserver=/directvpromise.com/127.0.0.1#5335\nipset=/directvpromise.com/gfwlist\nserver=/barrons.com/127.0.0.1#5335\nipset=/barrons.com/gfwlist\nserver=/directvnow.com/127.0.0.1#5335\nipset=/directvnow.com/gfwlist\nserver=/airwick.be/127.0.0.1#5335\nipset=/airwick.be/gfwlist\nserver=/directvnewhampshire.com/127.0.0.1#5335\nipset=/directvnewhampshire.com/gfwlist\nserver=/superearsenjoy.com/127.0.0.1#5335\nipset=/superearsenjoy.com/gfwlist\nserver=/kijii.ca/127.0.0.1#5335\nipset=/kijii.ca/gfwlist\nserver=/myfoxtwincities.com/127.0.0.1#5335\nipset=/myfoxtwincities.com/gfwlist\nserver=/directvkentucky.com/127.0.0.1#5335\nipset=/directvkentucky.com/gfwlist\nserver=/cashpassport.ca/127.0.0.1#5335\nipset=/cashpassport.ca/gfwlist\nserver=/grannylister.com/127.0.0.1#5335\nipset=/grannylister.com/gfwlist\nserver=/fritchy.com/127.0.0.1#5335\nipset=/fritchy.com/gfwlist\nserver=/attstadium.com/127.0.0.1#5335\nipset=/attstadium.com/gfwlist\nserver=/moov.hk/127.0.0.1#5335\nipset=/moov.hk/gfwlist\nserver=/toonsexblog.com/127.0.0.1#5335\nipset=/toonsexblog.com/gfwlist\nserver=/laracasts.com/127.0.0.1#5335\nipset=/laracasts.com/gfwlist\nserver=/directvdsl.tv/127.0.0.1#5335\nipset=/directvdsl.tv/gfwlist\nserver=/tiktok.com/127.0.0.1#5335\nipset=/tiktok.com/gfwlist\nserver=/yogify.com/127.0.0.1#5335\nipset=/yogify.com/gfwlist\nserver=/directvdealsnow.com/127.0.0.1#5335\nipset=/directvdealsnow.com/gfwlist\nserver=/fox32chicago.com/127.0.0.1#5335\nipset=/fox32chicago.com/gfwlist\nserver=/hentairox.com/127.0.0.1#5335\nipset=/hentairox.com/gfwlist\nserver=/realclearpolitics.com/127.0.0.1#5335\nipset=/realclearpolitics.com/gfwlist\nserver=/directvbusiness.com/127.0.0.1#5335\nipset=/directvbusiness.com/gfwlist\nserver=/nikestyles.com/127.0.0.1#5335\nipset=/nikestyles.com/gfwlist\nserver=/routledgehandbooks.com/127.0.0.1#5335\nipset=/routledgehandbooks.com/gfwlist\nserver=/book.com.tw/127.0.0.1#5335\nipset=/book.com.tw/gfwlist\nserver=/ajtalk.com/127.0.0.1#5335\nipset=/ajtalk.com/gfwlist\nserver=/verizondigitalmedia.com/127.0.0.1#5335\nipset=/verizondigitalmedia.com/gfwlist\nserver=/directvboston.com/127.0.0.1#5335\nipset=/directvboston.com/gfwlist\nserver=/bestbuys.com/127.0.0.1#5335\nipset=/bestbuys.com/gfwlist\nserver=/directv-newyork.com/127.0.0.1#5335\nipset=/directv-newyork.com/gfwlist\nserver=/instafallow.com/127.0.0.1#5335\nipset=/instafallow.com/gfwlist\nserver=/firstsearch.oclc.org/127.0.0.1#5335\nipset=/firstsearch.oclc.org/gfwlist\nserver=/freeb.com/127.0.0.1#5335\nipset=/freeb.com/gfwlist\nserver=/dkrecttv.com/127.0.0.1#5335\nipset=/dkrecttv.com/gfwlist\nserver=/young-xxx.net/127.0.0.1#5335\nipset=/young-xxx.net/gfwlist\nserver=/meme111.com/127.0.0.1#5335\nipset=/meme111.com/gfwlist\nserver=/hdvideosporn.net/127.0.0.1#5335\nipset=/hdvideosporn.net/gfwlist\nserver=/direcpath.net/127.0.0.1#5335\nipset=/direcpath.net/gfwlist\nserver=/hentaistream.tv/127.0.0.1#5335\nipset=/hentaistream.tv/gfwlist\nserver=/mcdonalds.hk/127.0.0.1#5335\nipset=/mcdonalds.hk/gfwlist\nserver=/softbanktelecom.com/127.0.0.1#5335\nipset=/softbanktelecom.com/gfwlist\nserver=/hotgoo.com/127.0.0.1#5335\nipset=/hotgoo.com/gfwlist\nserver=/boylove.com/127.0.0.1#5335\nipset=/boylove.com/gfwlist\nserver=/zorglist.com/127.0.0.1#5335\nipset=/zorglist.com/gfwlist\nserver=/loveamateurfacials.com/127.0.0.1#5335\nipset=/loveamateurfacials.com/gfwlist\nserver=/booru.org/127.0.0.1#5335\nipset=/booru.org/gfwlist\nserver=/3danimeworld.com/127.0.0.1#5335\nipset=/3danimeworld.com/gfwlist\nserver=/infocert.digital/127.0.0.1#5335\nipset=/infocert.digital/gfwlist\nserver=/mini.si/127.0.0.1#5335\nipset=/mini.si/gfwlist\nserver=/tvpromise.com/127.0.0.1#5335\nipset=/tvpromise.com/gfwlist\nserver=/porngames.tv/127.0.0.1#5335\nipset=/porngames.tv/gfwlist\nserver=/pinkworld.com/127.0.0.1#5335\nipset=/pinkworld.com/gfwlist\nserver=/yes123.com.tw/127.0.0.1#5335\nipset=/yes123.com.tw/gfwlist\nserver=/synaptic.net/127.0.0.1#5335\nipset=/synaptic.net/gfwlist\nserver=/safebooru.org/127.0.0.1#5335\nipset=/safebooru.org/gfwlist\nserver=/sundayready.com/127.0.0.1#5335\nipset=/sundayready.com/gfwlist\nserver=/susiewildin.com/127.0.0.1#5335\nipset=/susiewildin.com/gfwlist\nserver=/girlsdelta.com/127.0.0.1#5335\nipset=/girlsdelta.com/gfwlist\nserver=/hotbeatsonsale.com/127.0.0.1#5335\nipset=/hotbeatsonsale.com/gfwlist\nserver=/bmw-motorrad.ro/127.0.0.1#5335\nipset=/bmw-motorrad.ro/gfwlist\nserver=/visa.com.cy/127.0.0.1#5335\nipset=/visa.com.cy/gfwlist\nserver=/8xxx.net/127.0.0.1#5335\nipset=/8xxx.net/gfwlist\nserver=/bmwsafari.com/127.0.0.1#5335\nipset=/bmwsafari.com/gfwlist\nserver=/enterprisepaging.com/127.0.0.1#5335\nipset=/enterprisepaging.com/gfwlist\nserver=/foxaffiliateportal.com/127.0.0.1#5335\nipset=/foxaffiliateportal.com/gfwlist\nserver=/directvbusinessmarket.com/127.0.0.1#5335\nipset=/directvbusinessmarket.com/gfwlist\nserver=/naizitv.top/127.0.0.1#5335\nipset=/naizitv.top/gfwlist\nserver=/swissstick.com/127.0.0.1#5335\nipset=/swissstick.com/gfwlist\nserver=/bmw-connecteddrive.sk/127.0.0.1#5335\nipset=/bmw-connecteddrive.sk/gfwlist\nserver=/microsoft.ro/127.0.0.1#5335\nipset=/microsoft.ro/gfwlist\nserver=/cbs.com/127.0.0.1#5335\nipset=/cbs.com/gfwlist\nserver=/customdrdrebeats.com/127.0.0.1#5335\nipset=/customdrdrebeats.com/gfwlist\nserver=/currently.net/127.0.0.1#5335\nipset=/currently.net/gfwlist\nserver=/ntdtv.com/127.0.0.1#5335\nipset=/ntdtv.com/gfwlist\nserver=/oudoll.com/127.0.0.1#5335\nipset=/oudoll.com/gfwlist\nserver=/ebaychina.net/127.0.0.1#5335\nipset=/ebaychina.net/gfwlist\nserver=/enablementadobe.com/127.0.0.1#5335\nipset=/enablementadobe.com/gfwlist\nserver=/18comic.vip/127.0.0.1#5335\nipset=/18comic.vip/gfwlist\nserver=/acgvipss.com/127.0.0.1#5335\nipset=/acgvipss.com/gfwlist\nserver=/nexpart.com/127.0.0.1#5335\nipset=/nexpart.com/gfwlist\nserver=/headphonesol.com/127.0.0.1#5335\nipset=/headphonesol.com/gfwlist\nserver=/pearsonvue.com/127.0.0.1#5335\nipset=/pearsonvue.com/gfwlist\nserver=/beatsmonstersales.com/127.0.0.1#5335\nipset=/beatsmonstersales.com/gfwlist\nserver=/attuverseonline.com/127.0.0.1#5335\nipset=/attuverseonline.com/gfwlist\nserver=/attuverseoffers.com/127.0.0.1#5335\nipset=/attuverseoffers.com/gfwlist\nserver=/attsuppliers.com/127.0.0.1#5335\nipset=/attsuppliers.com/gfwlist\nserver=/opencollective.com/127.0.0.1#5335\nipset=/opencollective.com/gfwlist\nserver=/anidom.com/127.0.0.1#5335\nipset=/anidom.com/gfwlist\nserver=/slackb.com/127.0.0.1#5335\nipset=/slackb.com/gfwlist\nserver=/niketaiwan.net/127.0.0.1#5335\nipset=/niketaiwan.net/gfwlist\nserver=/m.me/127.0.0.1#5335\nipset=/m.me/gfwlist\nserver=/matures-loving-sex.com/127.0.0.1#5335\nipset=/matures-loving-sex.com/gfwlist\nserver=/musickit.net/127.0.0.1#5335\nipset=/musickit.net/gfwlist\nserver=/attpublicpolicy.com/127.0.0.1#5335\nipset=/attpublicpolicy.com/gfwlist\nserver=/gitlab-assets.oss-cn-hongkong.aliyuncs.com/127.0.0.1#5335\nipset=/gitlab-assets.oss-cn-hongkong.aliyuncs.com/gfwlist\nserver=/attnetclient.com/127.0.0.1#5335\nipset=/attnetclient.com/gfwlist\nserver=/attjoy.com/127.0.0.1#5335\nipset=/attjoy.com/gfwlist\nserver=/attcollaborate.com/127.0.0.1#5335\nipset=/attcollaborate.com/gfwlist\nserver=/goldengate.hu/127.0.0.1#5335\nipset=/goldengate.hu/gfwlist\nserver=/attbusiness.net/127.0.0.1#5335\nipset=/attbusiness.net/gfwlist\nserver=/sexbebin.com/127.0.0.1#5335\nipset=/sexbebin.com/gfwlist\nserver=/iphoneimessage.com/127.0.0.1#5335\nipset=/iphoneimessage.com/gfwlist\nserver=/1pornlist.com/127.0.0.1#5335\nipset=/1pornlist.com/gfwlist\nserver=/eadultgames.com/127.0.0.1#5335\nipset=/eadultgames.com/gfwlist\nserver=/fameregistry.com/127.0.0.1#5335\nipset=/fameregistry.com/gfwlist\nserver=/cumfox.com/127.0.0.1#5335\nipset=/cumfox.com/gfwlist\nserver=/att.jobs/127.0.0.1#5335\nipset=/att.jobs/gfwlist\nserver=/gwktravelex.nl/127.0.0.1#5335\nipset=/gwktravelex.nl/gfwlist\nserver=/youngermommy.com/127.0.0.1#5335\nipset=/youngermommy.com/gfwlist\nserver=/porn-discounts.xxx/127.0.0.1#5335\nipset=/porn-discounts.xxx/gfwlist\nserver=/pixnet.cc/127.0.0.1#5335\nipset=/pixnet.cc/gfwlist\nserver=/att-promotions.com/127.0.0.1#5335\nipset=/att-promotions.com/gfwlist\nserver=/digital-id.ch/127.0.0.1#5335\nipset=/digital-id.ch/gfwlist\nserver=/t.me/127.0.0.1#5335\nipset=/t.me/gfwlist\nserver=/att-mail.com/127.0.0.1#5335\nipset=/att-mail.com/gfwlist\nserver=/f-droid.org/127.0.0.1#5335\nipset=/f-droid.org/gfwlist\nserver=/sarapbabe.com/127.0.0.1#5335\nipset=/sarapbabe.com/gfwlist\nserver=/att-bundles.com/127.0.0.1#5335\nipset=/att-bundles.com/gfwlist\nserver=/accbusiness.com/127.0.0.1#5335\nipset=/accbusiness.com/gfwlist\nserver=/miohentai.com/127.0.0.1#5335\nipset=/miohentai.com/gfwlist\nserver=/bitbucket.org/127.0.0.1#5335\nipset=/bitbucket.org/gfwlist\nserver=/volvobuses.in/127.0.0.1#5335\nipset=/volvobuses.in/gfwlist\nserver=/person.com/127.0.0.1#5335\nipset=/person.com/gfwlist\nserver=/xn--kput3imi374g.xn--hxt814e/127.0.0.1#5335\nipset=/xn--kput3imi374g.xn--hxt814e/gfwlist\nserver=/ebayhots.com/127.0.0.1#5335\nipset=/ebayhots.com/gfwlist\nserver=/mini.tm/127.0.0.1#5335\nipset=/mini.tm/gfwlist\nserver=/line-cdn.net/127.0.0.1#5335\nipset=/line-cdn.net/gfwlist\nserver=/beatsallsale.com/127.0.0.1#5335\nipset=/beatsallsale.com/gfwlist\nserver=/ao3.org/127.0.0.1#5335\nipset=/ao3.org/gfwlist\nserver=/xn--fiqs8sxootzz.cn/127.0.0.1#5335\nipset=/xn--fiqs8sxootzz.cn/gfwlist\nserver=/qinav.com/127.0.0.1#5335\nipset=/qinav.com/gfwlist\nserver=/wwapple.net/127.0.0.1#5335\nipset=/wwapple.net/gfwlist\nserver=/gobuyonlinestore.net/127.0.0.1#5335\nipset=/gobuyonlinestore.net/gfwlist\nserver=/pornhub.com/127.0.0.1#5335\nipset=/pornhub.com/gfwlist\nserver=/applestore.com.pt/127.0.0.1#5335\nipset=/applestore.com.pt/gfwlist\nserver=/webobjects.eu/127.0.0.1#5335\nipset=/webobjects.eu/gfwlist\nserver=/freeomovie.to/127.0.0.1#5335\nipset=/freeomovie.to/gfwlist\nserver=/kubakuba.global/127.0.0.1#5335\nipset=/kubakuba.global/gfwlist\nserver=/freearabsexx.com/127.0.0.1#5335\nipset=/freearabsexx.com/gfwlist\nserver=/canon-me.com/127.0.0.1#5335\nipset=/canon-me.com/gfwlist\nserver=/pearsonclinical.fr/127.0.0.1#5335\nipset=/pearsonclinical.fr/gfwlist\nserver=/etbc.com.hk/127.0.0.1#5335\nipset=/etbc.com.hk/gfwlist\nserver=/quicktime.net/127.0.0.1#5335\nipset=/quicktime.net/gfwlist\nserver=/rprimelab.com/127.0.0.1#5335\nipset=/rprimelab.com/gfwlist\nserver=/speedhunters.com/127.0.0.1#5335\nipset=/speedhunters.com/gfwlist\nserver=/177picyy.com/127.0.0.1#5335\nipset=/177picyy.com/gfwlist\nserver=/pornovenezolanox.com/127.0.0.1#5335\nipset=/pornovenezolanox.com/gfwlist\nserver=/quicktime.com.au/127.0.0.1#5335\nipset=/quicktime.com.au/gfwlist\nserver=/quicktime.cc/127.0.0.1#5335\nipset=/quicktime.cc/gfwlist\nserver=/camelot-europe.com/127.0.0.1#5335\nipset=/camelot-europe.com/gfwlist\nserver=/xn--xsq959n.com/127.0.0.1#5335\nipset=/xn--xsq959n.com/gfwlist\nserver=/xn--gmq92kd2rm1kx34a.com/127.0.0.1#5335\nipset=/xn--gmq92kd2rm1kx34a.com/gfwlist\nserver=/catmiimi.com/127.0.0.1#5335\nipset=/catmiimi.com/gfwlist\nserver=/la-mama.ru/127.0.0.1#5335\nipset=/la-mama.ru/gfwlist\nserver=/oanencore.com/127.0.0.1#5335\nipset=/oanencore.com/gfwlist\nserver=/newton.com/127.0.0.1#5335\nipset=/newton.com/gfwlist\nserver=/achat-followers-instagram.com/127.0.0.1#5335\nipset=/achat-followers-instagram.com/gfwlist\nserver=/macreach.net/127.0.0.1#5335\nipset=/macreach.net/gfwlist\nserver=/macpazar.com/127.0.0.1#5335\nipset=/macpazar.com/gfwlist\nserver=/practicalbusinessskills.com/127.0.0.1#5335\nipset=/practicalbusinessskills.com/gfwlist\nserver=/kphimsex.net/127.0.0.1#5335\nipset=/kphimsex.net/gfwlist\nserver=/macosx.info/127.0.0.1#5335\nipset=/macosx.info/gfwlist\nserver=/volvobuses.fr/127.0.0.1#5335\nipset=/volvobuses.fr/gfwlist\nserver=/visa.so/127.0.0.1#5335\nipset=/visa.so/gfwlist\nserver=/youtube.com.az/127.0.0.1#5335\nipset=/youtube.com.az/gfwlist\nserver=/bikac.xyz/127.0.0.1#5335\nipset=/bikac.xyz/gfwlist\nserver=/google.com.lb/127.0.0.1#5335\nipset=/google.com.lb/gfwlist\nserver=/icashpassport.com.mx/127.0.0.1#5335\nipset=/icashpassport.com.mx/gfwlist\nserver=/bmw-motorrad.dk/127.0.0.1#5335\nipset=/bmw-motorrad.dk/gfwlist\nserver=/bmw-int1.com/127.0.0.1#5335\nipset=/bmw-int1.com/gfwlist\nserver=/yomiuri-systec.co.jp/127.0.0.1#5335\nipset=/yomiuri-systec.co.jp/gfwlist\nserver=/disney.fi/127.0.0.1#5335\nipset=/disney.fi/gfwlist\nserver=/disney.io/127.0.0.1#5335\nipset=/disney.io/gfwlist\nserver=/eac-cdn.com/127.0.0.1#5335\nipset=/eac-cdn.com/gfwlist\nserver=/supercell.com/127.0.0.1#5335\nipset=/supercell.com/gfwlist\nserver=/macboxset.com/127.0.0.1#5335\nipset=/macboxset.com/gfwlist\nserver=/scholar.google.com/127.0.0.1#5335\nipset=/scholar.google.com/gfwlist\nserver=/emblstatic.net/127.0.0.1#5335\nipset=/emblstatic.net/gfwlist\nserver=/mac.rs/127.0.0.1#5335\nipset=/mac.rs/gfwlist\nserver=/singpao.com.hk/127.0.0.1#5335\nipset=/singpao.com.hk/gfwlist\nserver=/oxfordhandbooks.com/127.0.0.1#5335\nipset=/oxfordhandbooks.com/gfwlist\nserver=/mac.eu/127.0.0.1#5335\nipset=/mac.eu/gfwlist\nserver=/javpub.me/127.0.0.1#5335\nipset=/javpub.me/gfwlist\nserver=/familypornhd.com/127.0.0.1#5335\nipset=/familypornhd.com/gfwlist\nserver=/mac.com/127.0.0.1#5335\nipset=/mac.com/gfwlist\nserver=/milfporn.pro/127.0.0.1#5335\nipset=/milfporn.pro/gfwlist\nserver=/noodlemagazine.com/127.0.0.1#5335\nipset=/noodlemagazine.com/gfwlist\nserver=/bangyourwife.com/127.0.0.1#5335\nipset=/bangyourwife.com/gfwlist\nserver=/facebookblueprint.net/127.0.0.1#5335\nipset=/facebookblueprint.net/gfwlist\nserver=/ksd235qw.com/127.0.0.1#5335\nipset=/ksd235qw.com/gfwlist\nserver=/bmwmagazine.com/127.0.0.1#5335\nipset=/bmwmagazine.com/gfwlist\nserver=/vgcareers.net/127.0.0.1#5335\nipset=/vgcareers.net/gfwlist\nserver=/anyxxx.pro/127.0.0.1#5335\nipset=/anyxxx.pro/gfwlist\nserver=/instaplayer.net/127.0.0.1#5335\nipset=/instaplayer.net/gfwlist\nserver=/volvotrucks.qa/127.0.0.1#5335\nipset=/volvotrucks.qa/gfwlist\nserver=/foxsportsuniversity.com/127.0.0.1#5335\nipset=/foxsportsuniversity.com/gfwlist\nserver=/nudecams.cam/127.0.0.1#5335\nipset=/nudecams.cam/gfwlist\nserver=/minivictoria.ca/127.0.0.1#5335\nipset=/minivictoria.ca/gfwlist\nserver=/yahoo.co.vi/127.0.0.1#5335\nipset=/yahoo.co.vi/gfwlist\nserver=/iwork.wang/127.0.0.1#5335\nipset=/iwork.wang/gfwlist\nserver=/ischool.com/127.0.0.1#5335\nipset=/ischool.com/gfwlist\nserver=/applenews.hamburg/127.0.0.1#5335\nipset=/applenews.hamburg/gfwlist\nserver=/ipa-iphone.net/127.0.0.1#5335\nipset=/ipa-iphone.net/gfwlist\nserver=/akamaimagicmath.net/127.0.0.1#5335\nipset=/akamaimagicmath.net/gfwlist\nserver=/iosinthecar.com/127.0.0.1#5335\nipset=/iosinthecar.com/gfwlist\nserver=/voxmedia.com/127.0.0.1#5335\nipset=/voxmedia.com/gfwlist\nserver=/hentaipapa.com/127.0.0.1#5335\nipset=/hentaipapa.com/gfwlist\nserver=/bestiphonestuff.com/127.0.0.1#5335\nipset=/bestiphonestuff.com/gfwlist\nserver=/amerikaovozi.com/127.0.0.1#5335\nipset=/amerikaovozi.com/gfwlist\nserver=/imessage.tv/127.0.0.1#5335\nipset=/imessage.tv/gfwlist\nserver=/ikids.com/127.0.0.1#5335\nipset=/ikids.com/gfwlist\nserver=/epochstories.com/127.0.0.1#5335\nipset=/epochstories.com/gfwlist\nserver=/beatsbydrecheap-outletstore.com/127.0.0.1#5335\nipset=/beatsbydrecheap-outletstore.com/gfwlist\nserver=/swisstsa.li/127.0.0.1#5335\nipset=/swisstsa.li/gfwlist\nserver=/firewire.cl/127.0.0.1#5335\nipset=/firewire.cl/gfwlist\nserver=/finalcutpro.com/127.0.0.1#5335\nipset=/finalcutpro.com/gfwlist\nserver=/freefacebook.net/127.0.0.1#5335\nipset=/freefacebook.net/gfwlist\nserver=/facetime.net/127.0.0.1#5335\nipset=/facetime.net/gfwlist\nserver=/hulunetwork.com/127.0.0.1#5335\nipset=/hulunetwork.com/gfwlist\nserver=/promonsterbeatsbydre.com/127.0.0.1#5335\nipset=/promonsterbeatsbydre.com/gfwlist\nserver=/shopbeatsdre.com/127.0.0.1#5335\nipset=/shopbeatsdre.com/gfwlist\nserver=/lostbetsgames.com/127.0.0.1#5335\nipset=/lostbetsgames.com/gfwlist\nserver=/park-now.com/127.0.0.1#5335\nipset=/park-now.com/gfwlist\nserver=/bbyintl.com/127.0.0.1#5335\nipset=/bbyintl.com/gfwlist\nserver=/bdsmbunker.com/127.0.0.1#5335\nipset=/bdsmbunker.com/gfwlist\nserver=/google.com.bd/127.0.0.1#5335\nipset=/google.com.bd/gfwlist\nserver=/leaguesharp.info/127.0.0.1#5335\nipset=/leaguesharp.info/gfwlist\nserver=/ipfs.eth.aragon.network/127.0.0.1#5335\nipset=/ipfs.eth.aragon.network/gfwlist\nserver=/emac.in/127.0.0.1#5335\nipset=/emac.in/gfwlist\nserver=/pogobeta.com/127.0.0.1#5335\nipset=/pogobeta.com/gfwlist\nserver=/uun95.com/127.0.0.1#5335\nipset=/uun95.com/gfwlist\nserver=/dvdstudiopro.us/127.0.0.1#5335\nipset=/dvdstudiopro.us/gfwlist\nserver=/only-xxx-porn.com/127.0.0.1#5335\nipset=/only-xxx-porn.com/gfwlist\nserver=/mini.com.py/127.0.0.1#5335\nipset=/mini.com.py/gfwlist\nserver=/azure.net/127.0.0.1#5335\nipset=/azure.net/gfwlist\nserver=/embl.de/127.0.0.1#5335\nipset=/embl.de/gfwlist\nserver=/dvdstudiopro.com/127.0.0.1#5335\nipset=/dvdstudiopro.com/gfwlist\nserver=/beatsbydre2081.com/127.0.0.1#5335\nipset=/beatsbydre2081.com/gfwlist\nserver=/whonix.org/127.0.0.1#5335\nipset=/whonix.org/gfwlist\nserver=/dvdstudiopro.biz/127.0.0.1#5335\nipset=/dvdstudiopro.biz/gfwlist\nserver=/macrumors.com/127.0.0.1#5335\nipset=/macrumors.com/gfwlist\nserver=/dotmac.de/127.0.0.1#5335\nipset=/dotmac.de/gfwlist\nserver=/bmw-m.com/127.0.0.1#5335\nipset=/bmw-m.com/gfwlist\nserver=/digitalhub.com/127.0.0.1#5335\nipset=/digitalhub.com/gfwlist\nserver=/cheapestbeatsdrdre.com/127.0.0.1#5335\nipset=/cheapestbeatsdrdre.com/gfwlist\nserver=/nextechafrica.net/127.0.0.1#5335\nipset=/nextechafrica.net/gfwlist\nserver=/appcenter.ms/127.0.0.1#5335\nipset=/appcenter.ms/gfwlist\nserver=/desktopmovies.net/127.0.0.1#5335\nipset=/desktopmovies.net/gfwlist\nserver=/gcrtires.com/127.0.0.1#5335\nipset=/gcrtires.com/gfwlist\nserver=/desktopmovie.net/127.0.0.1#5335\nipset=/desktopmovie.net/gfwlist\nserver=/online-deals.net/127.0.0.1#5335\nipset=/online-deals.net/gfwlist\nserver=/dashwood360.com/127.0.0.1#5335\nipset=/dashwood360.com/gfwlist\nserver=/fotolia.tv/127.0.0.1#5335\nipset=/fotolia.tv/gfwlist\nserver=/niziero.info/127.0.0.1#5335\nipset=/niziero.info/gfwlist\nserver=/parstream.com/127.0.0.1#5335\nipset=/parstream.com/gfwlist\nserver=/boxun.com/127.0.0.1#5335\nipset=/boxun.com/gfwlist\nserver=/disneyinternationalhd.com/127.0.0.1#5335\nipset=/disneyinternationalhd.com/gfwlist\nserver=/dropboxbusiness.com/127.0.0.1#5335\nipset=/dropboxbusiness.com/gfwlist\nserver=/nurofen.ie/127.0.0.1#5335\nipset=/nurofen.ie/gfwlist\nserver=/faccebook.com/127.0.0.1#5335\nipset=/faccebook.com/gfwlist\nserver=/ssl-certificate.ch/127.0.0.1#5335\nipset=/ssl-certificate.ch/gfwlist\nserver=/volvotruckcenter.se/127.0.0.1#5335\nipset=/volvotruckcenter.se/gfwlist\nserver=/xxnxx-sex.com/127.0.0.1#5335\nipset=/xxnxx-sex.com/gfwlist\nserver=/alphabet.biz/127.0.0.1#5335\nipset=/alphabet.biz/gfwlist\nserver=/faacebok.com/127.0.0.1#5335\nipset=/faacebok.com/gfwlist\nserver=/duckduckgo.com/127.0.0.1#5335\nipset=/duckduckgo.com/gfwlist\nserver=/forzamotorsport.net/127.0.0.1#5335\nipset=/forzamotorsport.net/gfwlist\nserver=/paypal-search.com/127.0.0.1#5335\nipset=/paypal-search.com/gfwlist\nserver=/dreamteamfc.com/127.0.0.1#5335\nipset=/dreamteamfc.com/gfwlist\nserver=/apyle.com/127.0.0.1#5335\nipset=/apyle.com/gfwlist\nserver=/epochtimes.co.uk/127.0.0.1#5335\nipset=/epochtimes.co.uk/gfwlist\nserver=/appye.com/127.0.0.1#5335\nipset=/appye.com/gfwlist\nserver=/appmediagroup.com/127.0.0.1#5335\nipset=/appmediagroup.com/gfwlist\nserver=/12diasderegalosdeitunes.com.hn/127.0.0.1#5335\nipset=/12diasderegalosdeitunes.com.hn/gfwlist\nserver=/blogebay.com/127.0.0.1#5335\nipset=/blogebay.com/gfwlist\nserver=/indian-pornstars.com/127.0.0.1#5335\nipset=/indian-pornstars.com/gfwlist\nserver=/applle.com/127.0.0.1#5335\nipset=/applle.com/gfwlist\nserver=/xxx-fap.com/127.0.0.1#5335\nipset=/xxx-fap.com/gfwlist\nserver=/swisssign.net/127.0.0.1#5335\nipset=/swisssign.net/gfwlist\nserver=/applezh.com/127.0.0.1#5335\nipset=/applezh.com/gfwlist\nserver=/ebayt.com/127.0.0.1#5335\nipset=/ebayt.com/gfwlist\nserver=/paisapay.cc/127.0.0.1#5335\nipset=/paisapay.cc/gfwlist\nserver=/appleweb.net/127.0.0.1#5335\nipset=/appleweb.net/gfwlist\nserver=/statics-marketingsites-eus-ms-com.akamaized.net/127.0.0.1#5335\nipset=/statics-marketingsites-eus-ms-com.akamaized.net/gfwlist\nserver=/ctwant.com/127.0.0.1#5335\nipset=/ctwant.com/gfwlist\nserver=/gonike.com/127.0.0.1#5335\nipset=/gonike.com/gfwlist\nserver=/facebookclub.com/127.0.0.1#5335\nipset=/facebookclub.com/gfwlist\nserver=/bowsersinsidestory.com/127.0.0.1#5335\nipset=/bowsersinsidestory.com/gfwlist\nserver=/orgypornonly.com/127.0.0.1#5335\nipset=/orgypornonly.com/gfwlist\nserver=/boslife.net/127.0.0.1#5335\nipset=/boslife.net/gfwlist\nserver=/appleshop.co.uk/127.0.0.1#5335\nipset=/appleshop.co.uk/gfwlist\nserver=/appleshare.info/127.0.0.1#5335\nipset=/appleshare.info/gfwlist\nserver=/cpan.org/127.0.0.1#5335\nipset=/cpan.org/gfwlist\nserver=/pricelesstv.com/127.0.0.1#5335\nipset=/pricelesstv.com/gfwlist\nserver=/ntnews.com.au/127.0.0.1#5335\nipset=/ntnews.com.au/gfwlist\nserver=/apples-msk.ru/127.0.0.1#5335\nipset=/apples-msk.ru/gfwlist\nserver=/minidealernet.com/127.0.0.1#5335\nipset=/minidealernet.com/gfwlist\nserver=/bestxxxsites.com/127.0.0.1#5335\nipset=/bestxxxsites.com/gfwlist\nserver=/secretbabes.co.uk/127.0.0.1#5335\nipset=/secretbabes.co.uk/gfwlist\nserver=/applereach.net/127.0.0.1#5335\nipset=/applereach.net/gfwlist\nserver=/applepremiumresellers.com.au/127.0.0.1#5335\nipset=/applepremiumresellers.com.au/gfwlist\nserver=/amazon.co.uk/127.0.0.1#5335\nipset=/amazon.co.uk/gfwlist\nserver=/visiontimes.net/127.0.0.1#5335\nipset=/visiontimes.net/gfwlist\nserver=/biomedcentral.com/127.0.0.1#5335\nipset=/biomedcentral.com/gfwlist\nserver=/iceporn.com/127.0.0.1#5335\nipset=/iceporn.com/gfwlist\nserver=/bossagency.co.uk/127.0.0.1#5335\nipset=/bossagency.co.uk/gfwlist\nserver=/appleonline.net/127.0.0.1#5335\nipset=/appleonline.net/gfwlist\nserver=/applemagickeyboard.com/127.0.0.1#5335\nipset=/applemagickeyboard.com/gfwlist\nserver=/ygugu4.com/127.0.0.1#5335\nipset=/ygugu4.com/gfwlist\nserver=/pearsoncanada.ca/127.0.0.1#5335\nipset=/pearsoncanada.ca/gfwlist\nserver=/brazzersnetwork.com/127.0.0.1#5335\nipset=/brazzersnetwork.com/gfwlist\nserver=/yourlust.com/127.0.0.1#5335\nipset=/yourlust.com/gfwlist\nserver=/huffingtonpost.ca/127.0.0.1#5335\nipset=/huffingtonpost.ca/gfwlist\nserver=/mtvnservices.com/127.0.0.1#5335\nipset=/mtvnservices.com/gfwlist\nserver=/muji.com.hk/127.0.0.1#5335\nipset=/muji.com.hk/gfwlist\nserver=/huloo.cc/127.0.0.1#5335\nipset=/huloo.cc/gfwlist\nserver=/oreno3d.com/127.0.0.1#5335\nipset=/oreno3d.com/gfwlist\nserver=/httpwwwfacebook.com/127.0.0.1#5335\nipset=/httpwwwfacebook.com/gfwlist\nserver=/omgteens.com/127.0.0.1#5335\nipset=/omgteens.com/gfwlist\nserver=/vmwarecloud.com/127.0.0.1#5335\nipset=/vmwarecloud.com/gfwlist\nserver=/sharepoint.com/127.0.0.1#5335\nipset=/sharepoint.com/gfwlist\nserver=/pornmaturetube.com/127.0.0.1#5335\nipset=/pornmaturetube.com/gfwlist\nserver=/applefilmmaker.com/127.0.0.1#5335\nipset=/applefilmmaker.com/gfwlist\nserver=/iamakamai.net/127.0.0.1#5335\nipset=/iamakamai.net/gfwlist\nserver=/monsterbeatshere.com/127.0.0.1#5335\nipset=/monsterbeatshere.com/gfwlist\nserver=/disneytvajobs.com/127.0.0.1#5335\nipset=/disneytvajobs.com/gfwlist\nserver=/animesex.me/127.0.0.1#5335\nipset=/animesex.me/gfwlist\nserver=/appleexpo.eu/127.0.0.1#5335\nipset=/appleexpo.eu/gfwlist\nserver=/secretchina.com/127.0.0.1#5335\nipset=/secretchina.com/gfwlist\nserver=/foxredeem.com/127.0.0.1#5335\nipset=/foxredeem.com/gfwlist\nserver=/belamionline.com/127.0.0.1#5335\nipset=/belamionline.com/gfwlist\nserver=/dojinmanga.net/127.0.0.1#5335\nipset=/dojinmanga.net/gfwlist\nserver=/applecomputerinc.info/127.0.0.1#5335\nipset=/applecomputerinc.info/gfwlist\nserver=/ebayetc.com/127.0.0.1#5335\nipset=/ebayetc.com/gfwlist\nserver=/pornnetworkdeals.com/127.0.0.1#5335\nipset=/pornnetworkdeals.com/gfwlist\nserver=/ikea.ca/127.0.0.1#5335\nipset=/ikea.ca/gfwlist\nserver=/applecomputerimac.com/127.0.0.1#5335\nipset=/applecomputerimac.com/gfwlist\nserver=/applecomputer.kr/127.0.0.1#5335\nipset=/applecomputer.kr/gfwlist\nserver=/hhtdq17.com/127.0.0.1#5335\nipset=/hhtdq17.com/gfwlist\nserver=/magento.com/127.0.0.1#5335\nipset=/magento.com/gfwlist\nserver=/google.com.mt/127.0.0.1#5335\nipset=/google.com.mt/gfwlist\nserver=/bridgestonegz.com/127.0.0.1#5335\nipset=/bridgestonegz.com/gfwlist\nserver=/applecomputer.com/127.0.0.1#5335\nipset=/applecomputer.com/gfwlist\nserver=/applecomputer.co.nz/127.0.0.1#5335\nipset=/applecomputer.co.nz/gfwlist\nserver=/applecomputer-imac.com/127.0.0.1#5335\nipset=/applecomputer-imac.com/gfwlist\nserver=/borwap.com/127.0.0.1#5335\nipset=/borwap.com/gfwlist\nserver=/disneyplus.bn5x.net/127.0.0.1#5335\nipset=/disneyplus.bn5x.net/gfwlist\nserver=/mobileview.page/127.0.0.1#5335\nipset=/mobileview.page/gfwlist\nserver=/youtube.co.za/127.0.0.1#5335\nipset=/youtube.co.za/gfwlist\nserver=/simility.com/127.0.0.1#5335\nipset=/simility.com/gfwlist\nserver=/beatsbydreblackfridaypro.com/127.0.0.1#5335\nipset=/beatsbydreblackfridaypro.com/gfwlist\nserver=/pinkcore.net/127.0.0.1#5335\nipset=/pinkcore.net/gfwlist\nserver=/now-ashare.com/127.0.0.1#5335\nipset=/now-ashare.com/gfwlist\nserver=/reurl.cc/127.0.0.1#5335\nipset=/reurl.cc/gfwlist\nserver=/rockettube.com/127.0.0.1#5335\nipset=/rockettube.com/gfwlist\nserver=/evernote.com/127.0.0.1#5335\nipset=/evernote.com/gfwlist\nserver=/voacambodia.com/127.0.0.1#5335\nipset=/voacambodia.com/gfwlist\nserver=/appleaustralia.com.au/127.0.0.1#5335\nipset=/appleaustralia.com.au/gfwlist\nserver=/talentlens.com/127.0.0.1#5335\nipset=/talentlens.com/gfwlist\nserver=/electricluxury.com/127.0.0.1#5335\nipset=/electricluxury.com/gfwlist\nserver=/ebaydlassifieds.com/127.0.0.1#5335\nipset=/ebaydlassifieds.com/gfwlist\nserver=/gay0day.com/127.0.0.1#5335\nipset=/gay0day.com/gfwlist\nserver=/thotbook.tv/127.0.0.1#5335\nipset=/thotbook.tv/gfwlist\nserver=/realamericanstories.tv/127.0.0.1#5335\nipset=/realamericanstories.tv/gfwlist\nserver=/bmw-gta.ca/127.0.0.1#5335\nipset=/bmw-gta.ca/gfwlist\nserver=/kisscos.net/127.0.0.1#5335\nipset=/kisscos.net/gfwlist\nserver=/apple-usa.net/127.0.0.1#5335\nipset=/apple-usa.net/gfwlist\nserver=/beatsbydre-headphones.com/127.0.0.1#5335\nipset=/beatsbydre-headphones.com/gfwlist\nserver=/youtube.com.jo/127.0.0.1#5335\nipset=/youtube.com.jo/gfwlist\nserver=/tubesafari.com/127.0.0.1#5335\nipset=/tubesafari.com/gfwlist\nserver=/forzarc.com/127.0.0.1#5335\nipset=/forzarc.com/gfwlist\nserver=/erogazopple.com/127.0.0.1#5335\nipset=/erogazopple.com/gfwlist\nserver=/bml.info/127.0.0.1#5335\nipset=/bml.info/gfwlist\nserver=/duckduckgo.de/127.0.0.1#5335\nipset=/duckduckgo.de/gfwlist\nserver=/ebaysoho.com/127.0.0.1#5335\nipset=/ebaysoho.com/gfwlist\nserver=/itunes-radio.net/127.0.0.1#5335\nipset=/itunes-radio.net/gfwlist\nserver=/apple-livephotoskit.com/127.0.0.1#5335\nipset=/apple-livephotoskit.com/gfwlist\nserver=/rgpub.io/127.0.0.1#5335\nipset=/rgpub.io/gfwlist\nserver=/savethedate.foo/127.0.0.1#5335\nipset=/savethedate.foo/gfwlist\nserver=/apple-inc.net/127.0.0.1#5335\nipset=/apple-inc.net/gfwlist\nserver=/apple-hk.com/127.0.0.1#5335\nipset=/apple-hk.com/gfwlist\nserver=/illusiongw.com/127.0.0.1#5335\nipset=/illusiongw.com/gfwlist\nserver=/adultsexgames.biz/127.0.0.1#5335\nipset=/adultsexgames.biz/gfwlist\nserver=/ebayuae.net/127.0.0.1#5335\nipset=/ebayuae.net/gfwlist\nserver=/thenewgirlspooping.com/127.0.0.1#5335\nipset=/thenewgirlspooping.com/gfwlist\nserver=/apple-dns.net/127.0.0.1#5335\nipset=/apple-dns.net/gfwlist\nserver=/alliancesages.com/127.0.0.1#5335\nipset=/alliancesages.com/gfwlist\nserver=/apple-dns.com/127.0.0.1#5335\nipset=/apple-dns.com/gfwlist\nserver=/vintage-erotica-forum.com/127.0.0.1#5335\nipset=/vintage-erotica-forum.com/gfwlist\nserver=/apple-darwin.net/127.0.0.1#5335\nipset=/apple-darwin.net/gfwlist\nserver=/cdngarenanow-a.akamaihd.net/127.0.0.1#5335\nipset=/cdngarenanow-a.akamaihd.net/gfwlist\nserver=/apple-darwin.com/127.0.0.1#5335\nipset=/apple-darwin.com/gfwlist\nserver=/nijiclamp.com/127.0.0.1#5335\nipset=/nijiclamp.com/gfwlist\nserver=/mystrikingly.com/127.0.0.1#5335\nipset=/mystrikingly.com/gfwlist\nserver=/mastercard.co.za/127.0.0.1#5335\nipset=/mastercard.co.za/gfwlist\nserver=/eakorea.co.kr/127.0.0.1#5335\nipset=/eakorea.co.kr/gfwlist\nserver=/nikefreeshoes.com/127.0.0.1#5335\nipset=/nikefreeshoes.com/gfwlist\nserver=/doom.com/127.0.0.1#5335\nipset=/doom.com/gfwlist\nserver=/jodic-forum.org/127.0.0.1#5335\nipset=/jodic-forum.org/gfwlist\nserver=/tyms2022.com/127.0.0.1#5335\nipset=/tyms2022.com/gfwlist\nserver=/miniccrc.ca/127.0.0.1#5335\nipset=/miniccrc.ca/gfwlist\nserver=/viet69.dev/127.0.0.1#5335\nipset=/viet69.dev/gfwlist\nserver=/ap0le.com/127.0.0.1#5335\nipset=/ap0le.com/gfwlist\nserver=/airtunes.net/127.0.0.1#5335\nipset=/airtunes.net/gfwlist\nserver=/diabloimmortal.com/127.0.0.1#5335\nipset=/diabloimmortal.com/gfwlist\nserver=/tnntoday.com/127.0.0.1#5335\nipset=/tnntoday.com/gfwlist\nserver=/airtunes.info/127.0.0.1#5335\nipset=/airtunes.info/gfwlist\nserver=/alt.com/127.0.0.1#5335\nipset=/alt.com/gfwlist\nserver=/airport.brussels/127.0.0.1#5335\nipset=/airport.brussels/gfwlist\nserver=/a0pple.net/127.0.0.1#5335\nipset=/a0pple.net/gfwlist\nserver=/2022.dev/127.0.0.1#5335\nipset=/2022.dev/gfwlist\nserver=/wixapps.net/127.0.0.1#5335\nipset=/wixapps.net/gfwlist\nserver=/18avx.com/127.0.0.1#5335\nipset=/18avx.com/gfwlist\nserver=/shazam.com/127.0.0.1#5335\nipset=/shazam.com/gfwlist\nserver=/huobigroup.com/127.0.0.1#5335\nipset=/huobigroup.com/gfwlist\nserver=/eroticbeauties.net/127.0.0.1#5335\nipset=/eroticbeauties.net/gfwlist\nserver=/horsedicks.net/127.0.0.1#5335\nipset=/horsedicks.net/gfwlist\nserver=/dnsvisa.com/127.0.0.1#5335\nipset=/dnsvisa.com/gfwlist\nserver=/appleone.host/127.0.0.1#5335\nipset=/appleone.host/gfwlist\nserver=/appleone.guide/127.0.0.1#5335\nipset=/appleone.guide/gfwlist\nserver=/paypal-prepagata.com/127.0.0.1#5335\nipset=/paypal-prepagata.com/gfwlist\nserver=/terapeack.com/127.0.0.1#5335\nipset=/terapeack.com/gfwlist\nserver=/cheapbagshoes.com/127.0.0.1#5335\nipset=/cheapbagshoes.com/gfwlist\nserver=/123hplaserjet.com/127.0.0.1#5335\nipset=/123hplaserjet.com/gfwlist\nserver=/cdn.jsdelivr.net/127.0.0.1#5335\nipset=/cdn.jsdelivr.net/gfwlist\nserver=/appleone.blog/127.0.0.1#5335\nipset=/appleone.blog/gfwlist\nserver=/appleone.audio/127.0.0.1#5335\nipset=/appleone.audio/gfwlist\nserver=/appletv.wang/127.0.0.1#5335\nipset=/appletv.wang/gfwlist\nserver=/shopcustomizedbeats.com/127.0.0.1#5335\nipset=/shopcustomizedbeats.com/gfwlist\nserver=/vkmessenger.app/127.0.0.1#5335\nipset=/vkmessenger.app/gfwlist\nserver=/appletv.com/127.0.0.1#5335\nipset=/appletv.com/gfwlist\nserver=/sevgikurtulmaz.com/127.0.0.1#5335\nipset=/sevgikurtulmaz.com/gfwlist\nserver=/kenxxx.com/127.0.0.1#5335\nipset=/kenxxx.com/gfwlist\nserver=/redsexhub.com/127.0.0.1#5335\nipset=/redsexhub.com/gfwlist\nserver=/paypal-donations.com/127.0.0.1#5335\nipset=/paypal-donations.com/gfwlist\nserver=/appleid.berlin/127.0.0.1#5335\nipset=/appleid.berlin/gfwlist\nserver=/deeper.com/127.0.0.1#5335\nipset=/deeper.com/gfwlist\nserver=/colorfulstage.com/127.0.0.1#5335\nipset=/colorfulstage.com/gfwlist\nserver=/microsoft.cz/127.0.0.1#5335\nipset=/microsoft.cz/gfwlist\nserver=/lesbianpics.org/127.0.0.1#5335\nipset=/lesbianpics.org/gfwlist\nserver=/appleid-iclou.com/127.0.0.1#5335\nipset=/appleid-iclou.com/gfwlist\nserver=/appleid-applemx.us/127.0.0.1#5335\nipset=/appleid-applemx.us/gfwlist\nserver=/ertk.net/127.0.0.1#5335\nipset=/ertk.net/gfwlist\nserver=/the-monster-beats.com/127.0.0.1#5335\nipset=/the-monster-beats.com/gfwlist\nserver=/mypornhere.com/127.0.0.1#5335\nipset=/mypornhere.com/gfwlist\nserver=/beatswirelesscuffie.com/127.0.0.1#5335\nipset=/beatswirelesscuffie.com/gfwlist\nserver=/binance.org/127.0.0.1#5335\nipset=/binance.org/gfwlist\nserver=/betternike.com/127.0.0.1#5335\nipset=/betternike.com/gfwlist\nserver=/technologyandsociety.org/127.0.0.1#5335\nipset=/technologyandsociety.org/gfwlist\nserver=/foxnewsb2b.com/127.0.0.1#5335\nipset=/foxnewsb2b.com/gfwlist\nserver=/benaughty.fun/127.0.0.1#5335\nipset=/benaughty.fun/gfwlist\nserver=/vfsco.ca/127.0.0.1#5335\nipset=/vfsco.ca/gfwlist\nserver=/sexy-babe-pics.com/127.0.0.1#5335\nipset=/sexy-babe-pics.com/gfwlist\nserver=/duga.jp/127.0.0.1#5335\nipset=/duga.jp/gfwlist\nserver=/facebcook.com/127.0.0.1#5335\nipset=/facebcook.com/gfwlist\nserver=/canonproprinters.com/127.0.0.1#5335\nipset=/canonproprinters.com/gfwlist\nserver=/beatsbydreonlines-ireland.com/127.0.0.1#5335\nipset=/beatsbydreonlines-ireland.com/gfwlist\nserver=/npmjs.com/127.0.0.1#5335\nipset=/npmjs.com/gfwlist\nserver=/affect3dstore.com/127.0.0.1#5335\nipset=/affect3dstore.com/gfwlist\nserver=/largeporntube.com/127.0.0.1#5335\nipset=/largeporntube.com/gfwlist\nserver=/ebay-authenticate.net/127.0.0.1#5335\nipset=/ebay-authenticate.net/gfwlist\nserver=/google.co.uk/127.0.0.1#5335\nipset=/google.co.uk/gfwlist\nserver=/cuntwars.com/127.0.0.1#5335\nipset=/cuntwars.com/gfwlist\nserver=/nationalgeographic.com/127.0.0.1#5335\nipset=/nationalgeographic.com/gfwlist\nserver=/amazon.fr/127.0.0.1#5335\nipset=/amazon.fr/gfwlist\nserver=/botstop.com/127.0.0.1#5335\nipset=/botstop.com/gfwlist\nserver=/arphic.com/127.0.0.1#5335\nipset=/arphic.com/gfwlist\nserver=/ibooksauthor.com/127.0.0.1#5335\nipset=/ibooksauthor.com/gfwlist\nserver=/wiremoneytoirelandwithxoomeasierandcheaper.com/127.0.0.1#5335\nipset=/wiremoneytoirelandwithxoomeasierandcheaper.com/gfwlist\nserver=/wionews.com/127.0.0.1#5335\nipset=/wionews.com/gfwlist\nserver=/kindle.com/127.0.0.1#5335\nipset=/kindle.com/gfwlist\nserver=/alphabet.no/127.0.0.1#5335\nipset=/alphabet.no/gfwlist\nserver=/anon-v.com/127.0.0.1#5335\nipset=/anon-v.com/gfwlist\nserver=/bmw.dk/127.0.0.1#5335\nipset=/bmw.dk/gfwlist\nserver=/ibook.com/127.0.0.1#5335\nipset=/ibook.com/gfwlist\nserver=/ithaisex.com/127.0.0.1#5335\nipset=/ithaisex.com/gfwlist\nserver=/magentoliveconference.com/127.0.0.1#5335\nipset=/magentoliveconference.com/gfwlist\nserver=/applewallet.com/127.0.0.1#5335\nipset=/applewallet.com/gfwlist\nserver=/torrentleen.com/127.0.0.1#5335\nipset=/torrentleen.com/gfwlist\nserver=/mywaytopay.info/127.0.0.1#5335\nipset=/mywaytopay.info/gfwlist\nserver=/firestonecomercial.com.mx/127.0.0.1#5335\nipset=/firestonecomercial.com.mx/gfwlist\nserver=/bondagecomixxx.net/127.0.0.1#5335\nipset=/bondagecomixxx.net/gfwlist\nserver=/kmff17.com/127.0.0.1#5335\nipset=/kmff17.com/gfwlist\nserver=/applepay.info/127.0.0.1#5335\nipset=/applepay.info/gfwlist\nserver=/hentai-books.com/127.0.0.1#5335\nipset=/hentai-books.com/gfwlist\nserver=/youtube.co.zw/127.0.0.1#5335\nipset=/youtube.co.zw/gfwlist\nserver=/shemaleporntube.tv/127.0.0.1#5335\nipset=/shemaleporntube.tv/gfwlist\nserver=/beatsbeatsmonster.com/127.0.0.1#5335\nipset=/beatsbeatsmonster.com/gfwlist\nserver=/zind.cloud/127.0.0.1#5335\nipset=/zind.cloud/gfwlist\nserver=/easysexporn.com/127.0.0.1#5335\nipset=/easysexporn.com/gfwlist\nserver=/apple-pay.com/127.0.0.1#5335\nipset=/apple-pay.com/gfwlist\nserver=/needforspeedboost.com/127.0.0.1#5335\nipset=/needforspeedboost.com/gfwlist\nserver=/gayboystube.com/127.0.0.1#5335\nipset=/gayboystube.com/gfwlist\nserver=/applenews.berlin/127.0.0.1#5335\nipset=/applenews.berlin/gfwlist\nserver=/cex.io/127.0.0.1#5335\nipset=/cex.io/gfwlist\nserver=/download.visualstudio.microsoft.com/127.0.0.1#5335\nipset=/download.visualstudio.microsoft.com/gfwlist\nserver=/pornokrol.com/127.0.0.1#5335\nipset=/pornokrol.com/gfwlist\nserver=/nsfwmemes.com/127.0.0.1#5335\nipset=/nsfwmemes.com/gfwlist\nserver=/biorxiv.org/127.0.0.1#5335\nipset=/biorxiv.org/gfwlist\nserver=/hkopentv.com/127.0.0.1#5335\nipset=/hkopentv.com/gfwlist\nserver=/applemusic.wang/127.0.0.1#5335\nipset=/applemusic.wang/gfwlist\nserver=/sextreffensite.com/127.0.0.1#5335\nipset=/sextreffensite.com/gfwlist\nserver=/espnqa.com/127.0.0.1#5335\nipset=/espnqa.com/gfwlist\nserver=/myrewardzone.com/127.0.0.1#5335\nipset=/myrewardzone.com/gfwlist\nserver=/beautyandthebeastmusical.co.uk/127.0.0.1#5335\nipset=/beautyandthebeastmusical.co.uk/gfwlist\nserver=/applemusic.com/127.0.0.1#5335\nipset=/applemusic.com/gfwlist\nserver=/bmw.com.co/127.0.0.1#5335\nipset=/bmw.com.co/gfwlist\nserver=/xxxpornzeed.com/127.0.0.1#5335\nipset=/xxxpornzeed.com/gfwlist\nserver=/javbangers.com/127.0.0.1#5335\nipset=/javbangers.com/gfwlist\nserver=/stackoverflowbusiness.com/127.0.0.1#5335\nipset=/stackoverflowbusiness.com/gfwlist\nserver=/applemusic.berlin/127.0.0.1#5335\nipset=/applemusic.berlin/gfwlist\nserver=/cheapbeatssale4u.com/127.0.0.1#5335\nipset=/cheapbeatssale4u.com/gfwlist\nserver=/rakuten.tw/127.0.0.1#5335\nipset=/rakuten.tw/gfwlist\nserver=/verisign.info/127.0.0.1#5335\nipset=/verisign.info/gfwlist\nserver=/typekit.net/127.0.0.1#5335\nipset=/typekit.net/gfwlist\nserver=/home-made-videos.com/127.0.0.1#5335\nipset=/home-made-videos.com/gfwlist\nserver=/fujossy.jp/127.0.0.1#5335\nipset=/fujossy.jp/gfwlist\nserver=/blizzcon-a.akamaihd.net/127.0.0.1#5335\nipset=/blizzcon-a.akamaihd.net/gfwlist\nserver=/nsimg.net/127.0.0.1#5335\nipset=/nsimg.net/gfwlist\nserver=/starwarskids.com/127.0.0.1#5335\nipset=/starwarskids.com/gfwlist\nserver=/francecasquebeatssolde.com/127.0.0.1#5335\nipset=/francecasquebeatssolde.com/gfwlist\nserver=/ehv.cc/127.0.0.1#5335\nipset=/ehv.cc/gfwlist\nserver=/wwwpaypass.com/127.0.0.1#5335\nipset=/wwwpaypass.com/gfwlist\nserver=/trycloudflare.com/127.0.0.1#5335\nipset=/trycloudflare.com/gfwlist\nserver=/wwwmacbookair.com/127.0.0.1#5335\nipset=/wwwmacbookair.com/gfwlist\nserver=/macbooksale.com/127.0.0.1#5335\nipset=/macbooksale.com/gfwlist\nserver=/facebook-pmdcenter.org/127.0.0.1#5335\nipset=/facebook-pmdcenter.org/gfwlist\nserver=/clipsaoyai.com/127.0.0.1#5335\nipset=/clipsaoyai.com/gfwlist\nserver=/gvt3.com/127.0.0.1#5335\nipset=/gvt3.com/gfwlist\nserver=/macbookpro.us/127.0.0.1#5335\nipset=/macbookpro.us/gfwlist\nserver=/macbookpro.net/127.0.0.1#5335\nipset=/macbookpro.net/gfwlist\nserver=/macbookpro.com.au/127.0.0.1#5335\nipset=/macbookpro.com.au/gfwlist\nserver=/epochtimes.pl/127.0.0.1#5335\nipset=/epochtimes.pl/gfwlist\nserver=/macbookpro.co/127.0.0.1#5335\nipset=/macbookpro.co/gfwlist\nserver=/wonporn.net/127.0.0.1#5335\nipset=/wonporn.net/gfwlist\nserver=/facebhook.com/127.0.0.1#5335\nipset=/facebhook.com/gfwlist\nserver=/macbookair.net/127.0.0.1#5335\nipset=/macbookair.net/gfwlist\nserver=/apple.es/127.0.0.1#5335\nipset=/apple.es/gfwlist\nserver=/macbookair.es/127.0.0.1#5335\nipset=/macbookair.es/gfwlist\nserver=/macbookair.com.au/127.0.0.1#5335\nipset=/macbookair.com.au/gfwlist\nserver=/bmwm.com/127.0.0.1#5335\nipset=/bmwm.com/gfwlist\nserver=/macbookair.co.kr/127.0.0.1#5335\nipset=/macbookair.co.kr/gfwlist\nserver=/redwap-xxx.com/127.0.0.1#5335\nipset=/redwap-xxx.com/gfwlist\nserver=/iana.org/127.0.0.1#5335\nipset=/iana.org/gfwlist\nserver=/redamateurtube.com/127.0.0.1#5335\nipset=/redamateurtube.com/gfwlist\nserver=/blzmedia-a.akamaihd.net/127.0.0.1#5335\nipset=/blzmedia-a.akamaihd.net/gfwlist\nserver=/dragonage.com/127.0.0.1#5335\nipset=/dragonage.com/gfwlist\nserver=/braintreepayments.org/127.0.0.1#5335\nipset=/braintreepayments.org/gfwlist\nserver=/hammerandchisel.ssl.zendesk.com/127.0.0.1#5335\nipset=/hammerandchisel.ssl.zendesk.com/gfwlist\nserver=/gfpornbox.com/127.0.0.1#5335\nipset=/gfpornbox.com/gfwlist\nserver=/21centuryaccess.com/127.0.0.1#5335\nipset=/21centuryaccess.com/gfwlist\nserver=/wwwipodlounge.com/127.0.0.1#5335\nipset=/wwwipodlounge.com/gfwlist\nserver=/bmw.be/127.0.0.1#5335\nipset=/bmw.be/gfwlist\nserver=/cwcams.com/127.0.0.1#5335\nipset=/cwcams.com/gfwlist\nserver=/starfieldtech.com/127.0.0.1#5335\nipset=/starfieldtech.com/gfwlist\nserver=/myipod.net/127.0.0.1#5335\nipset=/myipod.net/gfwlist\nserver=/bestbuy24x7solutions.com/127.0.0.1#5335\nipset=/bestbuy24x7solutions.com/gfwlist\nserver=/zzycdz.com/127.0.0.1#5335\nipset=/zzycdz.com/gfwlist\nserver=/thomsonreuters.com.br/127.0.0.1#5335\nipset=/thomsonreuters.com.br/gfwlist\nserver=/audiobeatsau.com/127.0.0.1#5335\nipset=/audiobeatsau.com/gfwlist\nserver=/ipods.com/127.0.0.1#5335\nipset=/ipods.com/gfwlist\nserver=/ipodrocks.com.au/127.0.0.1#5335\nipset=/ipodrocks.com.au/gfwlist\nserver=/hplatexknowledgecenter.com/127.0.0.1#5335\nipset=/hplatexknowledgecenter.com/gfwlist\nserver=/ipodrip.ca/127.0.0.1#5335\nipset=/ipodrip.ca/gfwlist\nserver=/ipodprices.com/127.0.0.1#5335\nipset=/ipodprices.com/gfwlist\nserver=/modrinth.com/127.0.0.1#5335\nipset=/modrinth.com/gfwlist\nserver=/sourcingforebay.net/127.0.0.1#5335\nipset=/sourcingforebay.net/gfwlist\nserver=/allpornsites.net/127.0.0.1#5335\nipset=/allpornsites.net/gfwlist\nserver=/ipod.rs/127.0.0.1#5335\nipset=/ipod.rs/gfwlist\nserver=/ipod.pk/127.0.0.1#5335\nipset=/ipod.pk/gfwlist\nserver=/justporn.com/127.0.0.1#5335\nipset=/justporn.com/gfwlist\nserver=/ipod.hk/127.0.0.1#5335\nipset=/ipod.hk/gfwlist\nserver=/ipod.gr/127.0.0.1#5335\nipset=/ipod.gr/gfwlist\nserver=/ipod.fr/127.0.0.1#5335\nipset=/ipod.fr/gfwlist\nserver=/gostosanovinha.com/127.0.0.1#5335\nipset=/gostosanovinha.com/gfwlist\nserver=/thinkdifferent.us/127.0.0.1#5335\nipset=/thinkdifferent.us/gfwlist\nserver=/coliriodemacho.com.br/127.0.0.1#5335\nipset=/coliriodemacho.com.br/gfwlist\nserver=/ipod.de/127.0.0.1#5335\nipset=/ipod.de/gfwlist\nserver=/pixiv.net/127.0.0.1#5335\nipset=/pixiv.net/gfwlist\nserver=/fastly.net/127.0.0.1#5335\nipset=/fastly.net/gfwlist\nserver=/iphone-cd.com/127.0.0.1#5335\nipset=/iphone-cd.com/gfwlist\nserver=/canon.com.cy/127.0.0.1#5335\nipset=/canon.com.cy/gfwlist\nserver=/vanish.ch/127.0.0.1#5335\nipset=/vanish.ch/gfwlist\nserver=/yourmonsterbeats.com/127.0.0.1#5335\nipset=/yourmonsterbeats.com/gfwlist\nserver=/sci.hubg.org/127.0.0.1#5335\nipset=/sci.hubg.org/gfwlist\nserver=/workers.dev/127.0.0.1#5335\nipset=/workers.dev/gfwlist\nserver=/bmw.no/127.0.0.1#5335\nipset=/bmw.no/gfwlist\nserver=/cocksuckersguide.com/127.0.0.1#5335\nipset=/cocksuckersguide.com/gfwlist\nserver=/foxsportsneworleans.com/127.0.0.1#5335\nipset=/foxsportsneworleans.com/gfwlist\nserver=/camdolls.com/127.0.0.1#5335\nipset=/camdolls.com/gfwlist\nserver=/steemit.com/127.0.0.1#5335\nipset=/steemit.com/gfwlist\nserver=/ipod.com.au/127.0.0.1#5335\nipset=/ipod.com.au/gfwlist\nserver=/eamirrorsedge.com/127.0.0.1#5335\nipset=/eamirrorsedge.com/gfwlist\nserver=/ipod.co.uk/127.0.0.1#5335\nipset=/ipod.co.uk/gfwlist\nserver=/ipod.co/127.0.0.1#5335\nipset=/ipod.co/gfwlist\nserver=/igtv.com/127.0.0.1#5335\nipset=/igtv.com/gfwlist\nserver=/91rb.net/127.0.0.1#5335\nipset=/91rb.net/gfwlist\nserver=/fb.careers/127.0.0.1#5335\nipset=/fb.careers/gfwlist\nserver=/sexfilm4free.com/127.0.0.1#5335\nipset=/sexfilm4free.com/gfwlist\nserver=/volvobuses.se/127.0.0.1#5335\nipset=/volvobuses.se/gfwlist\nserver=/volvopenta.de/127.0.0.1#5335\nipset=/volvopenta.de/gfwlist\nserver=/ebuyheadphones.com/127.0.0.1#5335\nipset=/ebuyheadphones.com/gfwlist\nserver=/mastercard.com.sg/127.0.0.1#5335\nipset=/mastercard.com.sg/gfwlist\nserver=/ipod.ca/127.0.0.1#5335\nipset=/ipod.ca/gfwlist\nserver=/palestineremix.com/127.0.0.1#5335\nipset=/palestineremix.com/gfwlist\nserver=/mycams.com/127.0.0.1#5335\nipset=/mycams.com/gfwlist\nserver=/etvonline.hk/127.0.0.1#5335\nipset=/etvonline.hk/gfwlist\nserver=/swingexpert.nl/127.0.0.1#5335\nipset=/swingexpert.nl/gfwlist\nserver=/battlefront2.com/127.0.0.1#5335\nipset=/battlefront2.com/gfwlist\nserver=/appleclassicipod.com/127.0.0.1#5335\nipset=/appleclassicipod.com/gfwlist\nserver=/gannettdigital.com/127.0.0.1#5335\nipset=/gannettdigital.com/gfwlist\nserver=/thomsonreuters.com.ar/127.0.0.1#5335\nipset=/thomsonreuters.com.ar/gfwlist\nserver=/aplleipods.com/127.0.0.1#5335\nipset=/aplleipods.com/gfwlist\nserver=/s2stagehance.com/127.0.0.1#5335\nipset=/s2stagehance.com/gfwlist\nserver=/comicscartoonporn.com/127.0.0.1#5335\nipset=/comicscartoonporn.com/gfwlist\nserver=/gitlab-static.net/127.0.0.1#5335\nipset=/gitlab-static.net/gfwlist\nserver=/bmw-connecteddrive.it/127.0.0.1#5335\nipset=/bmw-connecteddrive.it/gfwlist\nserver=/iphonerip.net/127.0.0.1#5335\nipset=/iphonerip.net/gfwlist\nserver=/1lib.limited/127.0.0.1#5335\nipset=/1lib.limited/gfwlist\nserver=/miniofmonrovia.com/127.0.0.1#5335\nipset=/miniofmonrovia.com/gfwlist\nserver=/wireguard.com/127.0.0.1#5335\nipset=/wireguard.com/gfwlist\nserver=/newscdn.com.au/127.0.0.1#5335\nipset=/newscdn.com.au/gfwlist\nserver=/linetv.tw/127.0.0.1#5335\nipset=/linetv.tw/gfwlist\nserver=/hpcustomersupport.net/127.0.0.1#5335\nipset=/hpcustomersupport.net/gfwlist\nserver=/iphonegermany.com/127.0.0.1#5335\nipset=/iphonegermany.com/gfwlist\nserver=/adobecce.com/127.0.0.1#5335\nipset=/adobecce.com/gfwlist\nserver=/durex.cl/127.0.0.1#5335\nipset=/durex.cl/gfwlist\nserver=/iphonecases5.com/127.0.0.1#5335\nipset=/iphonecases5.com/gfwlist\nserver=/intagrm.com/127.0.0.1#5335\nipset=/intagrm.com/gfwlist\nserver=/iphonecase2013.com/127.0.0.1#5335\nipset=/iphonecase2013.com/gfwlist\nserver=/iphone5s5case.com/127.0.0.1#5335\nipset=/iphone5s5case.com/gfwlist\nserver=/mini.cl/127.0.0.1#5335\nipset=/mini.cl/gfwlist\nserver=/xoom.us/127.0.0.1#5335\nipset=/xoom.us/gfwlist\nserver=/bronto.com/127.0.0.1#5335\nipset=/bronto.com/gfwlist\nserver=/discordstatus.com/127.0.0.1#5335\nipset=/discordstatus.com/gfwlist\nserver=/sway-cdn.com/127.0.0.1#5335\nipset=/sway-cdn.com/gfwlist\nserver=/bridgestone.co.id/127.0.0.1#5335\nipset=/bridgestone.co.id/gfwlist\nserver=/cyber-bay.org/127.0.0.1#5335\nipset=/cyber-bay.org/gfwlist\nserver=/megafilmporno.com/127.0.0.1#5335\nipset=/megafilmporno.com/gfwlist\nserver=/forzaracingchampionship.com/127.0.0.1#5335\nipset=/forzaracingchampionship.com/gfwlist\nserver=/wwwebay.net/127.0.0.1#5335\nipset=/wwwebay.net/gfwlist\nserver=/arabysexy.com/127.0.0.1#5335\nipset=/arabysexy.com/gfwlist\nserver=/vs-hls-pushb-uk-live.akamaized.net/127.0.0.1#5335\nipset=/vs-hls-pushb-uk-live.akamaized.net/gfwlist\nserver=/viu.com/127.0.0.1#5335\nipset=/viu.com/gfwlist\nserver=/karupspc.com/127.0.0.1#5335\nipset=/karupspc.com/gfwlist\nserver=/iphone.rs/127.0.0.1#5335\nipset=/iphone.rs/gfwlist\nserver=/hitomi.la/127.0.0.1#5335\nipset=/hitomi.la/gfwlist\nserver=/iphone.pt/127.0.0.1#5335\nipset=/iphone.pt/gfwlist\nserver=/opensea.io/127.0.0.1#5335\nipset=/opensea.io/gfwlist\nserver=/vipissy.com/127.0.0.1#5335\nipset=/vipissy.com/gfwlist\nserver=/awsautoscaling.com/127.0.0.1#5335\nipset=/awsautoscaling.com/gfwlist\nserver=/warroom.org/127.0.0.1#5335\nipset=/warroom.org/gfwlist\nserver=/ikea.com.au/127.0.0.1#5335\nipset=/ikea.com.au/gfwlist\nserver=/uchicago.edu/127.0.0.1#5335\nipset=/uchicago.edu/gfwlist\nserver=/iphone.com.gr/127.0.0.1#5335\nipset=/iphone.com.gr/gfwlist\nserver=/myminisexdoll.com/127.0.0.1#5335\nipset=/myminisexdoll.com/gfwlist\nserver=/scholar.google.co.nz/127.0.0.1#5335\nipset=/scholar.google.co.nz/gfwlist\nserver=/realitykings.com/127.0.0.1#5335\nipset=/realitykings.com/gfwlist\nserver=/hulupurchase.com/127.0.0.1#5335\nipset=/hulupurchase.com/gfwlist\nserver=/drebeatsbydreoutlet.com/127.0.0.1#5335\nipset=/drebeatsbydreoutlet.com/gfwlist\nserver=/iphone.com.au/127.0.0.1#5335\nipset=/iphone.com.au/gfwlist\nserver=/jpboy1069.net/127.0.0.1#5335\nipset=/jpboy1069.net/gfwlist\nserver=/alphassl.com/127.0.0.1#5335\nipset=/alphassl.com/gfwlist\nserver=/e-hentai.org/127.0.0.1#5335\nipset=/e-hentai.org/gfwlist\nserver=/cdn77.com/127.0.0.1#5335\nipset=/cdn77.com/gfwlist\nserver=/sonypicturesstudios.com/127.0.0.1#5335\nipset=/sonypicturesstudios.com/gfwlist\nserver=/feacebook.com/127.0.0.1#5335\nipset=/feacebook.com/gfwlist\nserver=/ampproject.org/127.0.0.1#5335\nipset=/ampproject.org/gfwlist\nserver=/iphone-yh.com/127.0.0.1#5335\nipset=/iphone-yh.com/gfwlist\nserver=/iphone-vip3.com/127.0.0.1#5335\nipset=/iphone-vip3.com/gfwlist\nserver=/rabbitscams.sex/127.0.0.1#5335\nipset=/rabbitscams.sex/gfwlist\nserver=/iphone-vip2.com/127.0.0.1#5335\nipset=/iphone-vip2.com/gfwlist\nserver=/nentindo.net/127.0.0.1#5335\nipset=/nentindo.net/gfwlist\nserver=/tubxporn.com/127.0.0.1#5335\nipset=/tubxporn.com/gfwlist\nserver=/grooby.com/127.0.0.1#5335\nipset=/grooby.com/gfwlist\nserver=/iphone-cn.com/127.0.0.1#5335\nipset=/iphone-cn.com/gfwlist\nserver=/facfacebook.com/127.0.0.1#5335\nipset=/facfacebook.com/gfwlist\nserver=/hf-iphone.com/127.0.0.1#5335\nipset=/hf-iphone.com/gfwlist\nserver=/npr.org/127.0.0.1#5335\nipset=/npr.org/gfwlist\nserver=/hebiphone.com/127.0.0.1#5335\nipset=/hebiphone.com/gfwlist\nserver=/pornvibe.org/127.0.0.1#5335\nipset=/pornvibe.org/gfwlist\nserver=/dgaqp.com/127.0.0.1#5335\nipset=/dgaqp.com/gfwlist\nserver=/udtrucksmeena.com/127.0.0.1#5335\nipset=/udtrucksmeena.com/gfwlist\nserver=/fundaiphone5s.com/127.0.0.1#5335\nipset=/fundaiphone5s.com/gfwlist\nserver=/bestjapanesepornsites.com/127.0.0.1#5335\nipset=/bestjapanesepornsites.com/gfwlist\nserver=/cloudflarepreview.com/127.0.0.1#5335\nipset=/cloudflarepreview.com/gfwlist\nserver=/91porny.com/127.0.0.1#5335\nipset=/91porny.com/gfwlist\nserver=/starbucks.de/127.0.0.1#5335\nipset=/starbucks.de/gfwlist\nserver=/bowlroll.net/127.0.0.1#5335\nipset=/bowlroll.net/gfwlist\nserver=/symcd.com/127.0.0.1#5335\nipset=/symcd.com/gfwlist\nserver=/sneakerpage.net/127.0.0.1#5335\nipset=/sneakerpage.net/gfwlist\nserver=/perfectgonzo.com/127.0.0.1#5335\nipset=/perfectgonzo.com/gfwlist\nserver=/9anime.id/127.0.0.1#5335\nipset=/9anime.id/gfwlist\nserver=/ntdtv.co.kr/127.0.0.1#5335\nipset=/ntdtv.co.kr/gfwlist\nserver=/bloggrowup.com/127.0.0.1#5335\nipset=/bloggrowup.com/gfwlist\nserver=/fbacebook.com/127.0.0.1#5335\nipset=/fbacebook.com/gfwlist\nserver=/geek-squad-support.com/127.0.0.1#5335\nipset=/geek-squad-support.com/gfwlist\nserver=/businessinsider.sg/127.0.0.1#5335\nipset=/businessinsider.sg/gfwlist\nserver=/itunesstore.co/127.0.0.1#5335\nipset=/itunesstore.co/gfwlist\nserver=/ipadmini.com.lk/127.0.0.1#5335\nipset=/ipadmini.com.lk/gfwlist\nserver=/bbcverticals.com/127.0.0.1#5335\nipset=/bbcverticals.com/gfwlist\nserver=/barefootnetworks.com/127.0.0.1#5335\nipset=/barefootnetworks.com/gfwlist\nserver=/ipadair.fr/127.0.0.1#5335\nipset=/ipadair.fr/gfwlist\nserver=/gettyimages.com.br/127.0.0.1#5335\nipset=/gettyimages.com.br/gfwlist\nserver=/minimotoringrewards.com/127.0.0.1#5335\nipset=/minimotoringrewards.com/gfwlist\nserver=/howtogetmo.co.uk/127.0.0.1#5335\nipset=/howtogetmo.co.uk/gfwlist\nserver=/yandex.lv/127.0.0.1#5335\nipset=/yandex.lv/gfwlist\nserver=/analsaga.com/127.0.0.1#5335\nipset=/analsaga.com/gfwlist\nserver=/adultgeek.net/127.0.0.1#5335\nipset=/adultgeek.net/gfwlist\nserver=/ipadair.com.br/127.0.0.1#5335\nipset=/ipadair.com.br/gfwlist\nserver=/scholar.google.com.co/127.0.0.1#5335\nipset=/scholar.google.com.co/gfwlist\nserver=/cloudflareresolve.com/127.0.0.1#5335\nipset=/cloudflareresolve.com/gfwlist\nserver=/4tube.com/127.0.0.1#5335\nipset=/4tube.com/gfwlist\nserver=/mini.co.za/127.0.0.1#5335\nipset=/mini.co.za/gfwlist\nserver=/oxfordlawtrove.com/127.0.0.1#5335\nipset=/oxfordlawtrove.com/gfwlist\nserver=/xacmbq.xyz/127.0.0.1#5335\nipset=/xacmbq.xyz/gfwlist\nserver=/svpply.com/127.0.0.1#5335\nipset=/svpply.com/gfwlist\nserver=/ipadair.cm/127.0.0.1#5335\nipset=/ipadair.cm/gfwlist\nserver=/electronicarts.fr/127.0.0.1#5335\nipset=/electronicarts.fr/gfwlist\nserver=/dukgo.com/127.0.0.1#5335\nipset=/dukgo.com/gfwlist\nserver=/zlibcdn.com/127.0.0.1#5335\nipset=/zlibcdn.com/gfwlist\nserver=/ipad.host/127.0.0.1#5335\nipset=/ipad.host/gfwlist\nserver=/camvideoshub.com/127.0.0.1#5335\nipset=/camvideoshub.com/gfwlist\nserver=/pornky.com/127.0.0.1#5335\nipset=/pornky.com/gfwlist\nserver=/fbthirdpartypixel.org/127.0.0.1#5335\nipset=/fbthirdpartypixel.org/gfwlist\nserver=/steamcdn-a.akamaihd.net/127.0.0.1#5335\nipset=/steamcdn-a.akamaihd.net/gfwlist\nserver=/tiresplus.com/127.0.0.1#5335\nipset=/tiresplus.com/gfwlist\nserver=/ebaynow.com/127.0.0.1#5335\nipset=/ebaynow.com/gfwlist\nserver=/fcacebook.com/127.0.0.1#5335\nipset=/fcacebook.com/gfwlist\nserver=/quovadisglobal.com/127.0.0.1#5335\nipset=/quovadisglobal.com/gfwlist\nserver=/ebookforipad.com/127.0.0.1#5335\nipset=/ebookforipad.com/gfwlist\nserver=/imac.rs/127.0.0.1#5335\nipset=/imac.rs/gfwlist\nserver=/kindleproject.com/127.0.0.1#5335\nipset=/kindleproject.com/gfwlist\nserver=/futureofbusinesssurvey.org/127.0.0.1#5335\nipset=/futureofbusinesssurvey.org/gfwlist\nserver=/itunes.hk/127.0.0.1#5335\nipset=/itunes.hk/gfwlist\nserver=/hpofficejetprinter.com/127.0.0.1#5335\nipset=/hpofficejetprinter.com/gfwlist\nserver=/bbyurl.us/127.0.0.1#5335\nipset=/bbyurl.us/gfwlist\nserver=/monsterbeatsbydre2015.com/127.0.0.1#5335\nipset=/monsterbeatsbydre2015.com/gfwlist\nserver=/imac.gr/127.0.0.1#5335\nipset=/imac.gr/gfwlist\nserver=/julesjordan.com/127.0.0.1#5335\nipset=/julesjordan.com/gfwlist\nserver=/imac.co.nz/127.0.0.1#5335\nipset=/imac.co.nz/gfwlist\nserver=/bgr.in/127.0.0.1#5335\nipset=/bgr.in/gfwlist\nserver=/ma1lib.org/127.0.0.1#5335\nipset=/ma1lib.org/gfwlist\nserver=/hentai-fun.com/127.0.0.1#5335\nipset=/hentai-fun.com/gfwlist\nserver=/xxxvideoszoo.com/127.0.0.1#5335\nipset=/xxxvideoszoo.com/gfwlist\nserver=/adobeplatinumclub.com/127.0.0.1#5335\nipset=/adobeplatinumclub.com/gfwlist\nserver=/apple-imac.com/127.0.0.1#5335\nipset=/apple-imac.com/gfwlist\nserver=/osapublishing.org/127.0.0.1#5335\nipset=/osapublishing.org/gfwlist\nserver=/appstore.hk/127.0.0.1#5335\nipset=/appstore.hk/gfwlist\nserver=/bmwgroupfs.com/127.0.0.1#5335\nipset=/bmwgroupfs.com/gfwlist\nserver=/e122475.dscg.akamaiedge.net/127.0.0.1#5335\nipset=/e122475.dscg.akamaiedge.net/gfwlist\nserver=/sex-young.com/127.0.0.1#5335\nipset=/sex-young.com/gfwlist\nserver=/jmcomic1.mobi/127.0.0.1#5335\nipset=/jmcomic1.mobi/gfwlist\nserver=/pvzheroes.com/127.0.0.1#5335\nipset=/pvzheroes.com/gfwlist\nserver=/persagg.com/127.0.0.1#5335\nipset=/persagg.com/gfwlist\nserver=/appsto.re/127.0.0.1#5335\nipset=/appsto.re/gfwlist\nserver=/dungeonkeeper.cn/127.0.0.1#5335\nipset=/dungeonkeeper.cn/gfwlist\nserver=/jafgrown.com/127.0.0.1#5335\nipset=/jafgrown.com/gfwlist\nserver=/foxporns.com/127.0.0.1#5335\nipset=/foxporns.com/gfwlist\nserver=/erotichdworld.com/127.0.0.1#5335\nipset=/erotichdworld.com/gfwlist\nserver=/applestorepro.eu/127.0.0.1#5335\nipset=/applestorepro.eu/gfwlist\nserver=/handjobhub.com/127.0.0.1#5335\nipset=/handjobhub.com/gfwlist\nserver=/applestore.net/127.0.0.1#5335\nipset=/applestore.net/gfwlist\nserver=/imtagram.com/127.0.0.1#5335\nipset=/imtagram.com/gfwlist\nserver=/applestore.kr/127.0.0.1#5335\nipset=/applestore.kr/gfwlist\nserver=/applestore.hk/127.0.0.1#5335\nipset=/applestore.hk/gfwlist\nserver=/applestore.com.sn/127.0.0.1#5335\nipset=/applestore.com.sn/gfwlist\nserver=/bmw-motorrad.co.kr/127.0.0.1#5335\nipset=/bmw-motorrad.co.kr/gfwlist\nserver=/microsoftsilverlight.net/127.0.0.1#5335\nipset=/microsoftsilverlight.net/gfwlist\nserver=/tiny4k.com/127.0.0.1#5335\nipset=/tiny4k.com/gfwlist\nserver=/i-mobile.co.jp/127.0.0.1#5335\nipset=/i-mobile.co.jp/gfwlist\nserver=/applestore.com.ph/127.0.0.1#5335\nipset=/applestore.com.ph/gfwlist\nserver=/applestore.com.jo/127.0.0.1#5335\nipset=/applestore.com.jo/gfwlist\nserver=/applestore.com.hr/127.0.0.1#5335\nipset=/applestore.com.hr/gfwlist\nserver=/applestore.com.gr/127.0.0.1#5335\nipset=/applestore.com.gr/gfwlist\nserver=/kkbox.com.tw/127.0.0.1#5335\nipset=/kkbox.com.tw/gfwlist\nserver=/mtao.fun/127.0.0.1#5335\nipset=/mtao.fun/gfwlist\nserver=/severeporn.com/127.0.0.1#5335\nipset=/severeporn.com/gfwlist\nserver=/applestore.com/127.0.0.1#5335\nipset=/applestore.com/gfwlist\nserver=/matrix.org/127.0.0.1#5335\nipset=/matrix.org/gfwlist\nserver=/froogle.com/127.0.0.1#5335\nipset=/froogle.com/gfwlist\nserver=/apisof.net/127.0.0.1#5335\nipset=/apisof.net/gfwlist\nserver=/pornbrb.com/127.0.0.1#5335\nipset=/pornbrb.com/gfwlist\nserver=/nikehightops.com/127.0.0.1#5335\nipset=/nikehightops.com/gfwlist\nserver=/volvogroup.be/127.0.0.1#5335\nipset=/volvogroup.be/gfwlist\nserver=/icloudmail.net/127.0.0.1#5335\nipset=/icloudmail.net/gfwlist\nserver=/whatsapp.net/127.0.0.1#5335\nipset=/whatsapp.net/gfwlist\nserver=/paypal.jp/127.0.0.1#5335\nipset=/paypal.jp/gfwlist\nserver=/apple-store.net/127.0.0.1#5335\nipset=/apple-store.net/gfwlist\nserver=/mypearsonenglish.ch/127.0.0.1#5335\nipset=/mypearsonenglish.ch/gfwlist\nserver=/msocsp.com/127.0.0.1#5335\nipset=/msocsp.com/gfwlist\nserver=/uusexdoll.com/127.0.0.1#5335\nipset=/uusexdoll.com/gfwlist\nserver=/apple.xn--fiqs8s/127.0.0.1#5335\nipset=/apple.xn--fiqs8s/gfwlist\nserver=/apple.xn--czr694b/127.0.0.1#5335\nipset=/apple.xn--czr694b/gfwlist\nserver=/youtube.cat/127.0.0.1#5335\nipset=/youtube.cat/gfwlist\nserver=/finish.ro/127.0.0.1#5335\nipset=/finish.ro/gfwlist\nserver=/apple.tw/127.0.0.1#5335\nipset=/apple.tw/gfwlist\nserver=/ikea.do/127.0.0.1#5335\nipset=/ikea.do/gfwlist\nserver=/bayareabmw.com/127.0.0.1#5335\nipset=/bayareabmw.com/gfwlist\nserver=/youtube.lk/127.0.0.1#5335\nipset=/youtube.lk/gfwlist\nserver=/porn62.com/127.0.0.1#5335\nipset=/porn62.com/gfwlist\nserver=/longtailvideo.com/127.0.0.1#5335\nipset=/longtailvideo.com/gfwlist\nserver=/minibrossard.ca/127.0.0.1#5335\nipset=/minibrossard.ca/gfwlist\nserver=/apple.tt/127.0.0.1#5335\nipset=/apple.tt/gfwlist\nserver=/apple.so/127.0.0.1#5335\nipset=/apple.so/gfwlist\nserver=/facebdok.com/127.0.0.1#5335\nipset=/facebdok.com/gfwlist\nserver=/apple.sk/127.0.0.1#5335\nipset=/apple.sk/gfwlist\nserver=/instagy.com/127.0.0.1#5335\nipset=/instagy.com/gfwlist\nserver=/appledaily.hk/127.0.0.1#5335\nipset=/appledaily.hk/gfwlist\nserver=/charlotte-anime.jp/127.0.0.1#5335\nipset=/charlotte-anime.jp/gfwlist\nserver=/bmw-motorcycle.com/127.0.0.1#5335\nipset=/bmw-motorcycle.com/gfwlist\nserver=/verpeliculasporno.gratis/127.0.0.1#5335\nipset=/verpeliculasporno.gratis/gfwlist\nserver=/apple.rs/127.0.0.1#5335\nipset=/apple.rs/gfwlist\nserver=/xxxvideo.vip/127.0.0.1#5335\nipset=/xxxvideo.vip/gfwlist\nserver=/apple.pl/127.0.0.1#5335\nipset=/apple.pl/gfwlist\nserver=/beatsforcheap-usa.com/127.0.0.1#5335\nipset=/beatsforcheap-usa.com/gfwlist\nserver=/disney.co.il/127.0.0.1#5335\nipset=/disney.co.il/gfwlist\nserver=/apple.net.gr/127.0.0.1#5335\nipset=/apple.net.gr/gfwlist\nserver=/fanaken.com/127.0.0.1#5335\nipset=/fanaken.com/gfwlist\nserver=/petitehdporn.com/127.0.0.1#5335\nipset=/petitehdporn.com/gfwlist\nserver=/tg.dev/127.0.0.1#5335\nipset=/tg.dev/gfwlist\nserver=/volvotrucks.co.na/127.0.0.1#5335\nipset=/volvotrucks.co.na/gfwlist\nserver=/dynacw.co.jp/127.0.0.1#5335\nipset=/dynacw.co.jp/gfwlist\nserver=/geeksquadforums.com/127.0.0.1#5335\nipset=/geeksquadforums.com/gfwlist\nserver=/apple.lv/127.0.0.1#5335\nipset=/apple.lv/gfwlist\nserver=/d100.net/127.0.0.1#5335\nipset=/d100.net/gfwlist\nserver=/apple.lt/127.0.0.1#5335\nipset=/apple.lt/gfwlist\nserver=/apple.jp/127.0.0.1#5335\nipset=/apple.jp/gfwlist\nserver=/beatsbydresdanmark.net/127.0.0.1#5335\nipset=/beatsbydresdanmark.net/gfwlist\nserver=/login-paypal.com/127.0.0.1#5335\nipset=/login-paypal.com/gfwlist\nserver=/ultimaforever.com/127.0.0.1#5335\nipset=/ultimaforever.com/gfwlist\nserver=/bigboobsonline.org/127.0.0.1#5335\nipset=/bigboobsonline.org/gfwlist\nserver=/mediasama.com/127.0.0.1#5335\nipset=/mediasama.com/gfwlist\nserver=/minitroisrivieres.ca/127.0.0.1#5335\nipset=/minitroisrivieres.ca/gfwlist\nserver=/pearsoncred.com/127.0.0.1#5335\nipset=/pearsoncred.com/gfwlist\nserver=/mypornvid.fun/127.0.0.1#5335\nipset=/mypornvid.fun/gfwlist\nserver=/opengw.net/127.0.0.1#5335\nipset=/opengw.net/gfwlist\nserver=/makeeu.com/127.0.0.1#5335\nipset=/makeeu.com/gfwlist\nserver=/mybeatscheapbydre.com/127.0.0.1#5335\nipset=/mybeatscheapbydre.com/gfwlist\nserver=/macbookair.kr/127.0.0.1#5335\nipset=/macbookair.kr/gfwlist\nserver=/lp99.pw/127.0.0.1#5335\nipset=/lp99.pw/gfwlist\nserver=/ieeeaps.org/127.0.0.1#5335\nipset=/ieeeaps.org/gfwlist\nserver=/faptitans.com/127.0.0.1#5335\nipset=/faptitans.com/gfwlist\nserver=/fecebook.net/127.0.0.1#5335\nipset=/fecebook.net/gfwlist\nserver=/apple.co.mz/127.0.0.1#5335\nipset=/apple.co.mz/gfwlist\nserver=/dotfacebook.net/127.0.0.1#5335\nipset=/dotfacebook.net/gfwlist\nserver=/yinac.xyz/127.0.0.1#5335\nipset=/yinac.xyz/gfwlist\nserver=/digitaloceanspaces.com/127.0.0.1#5335\nipset=/digitaloceanspaces.com/gfwlist\nserver=/rewrite-anime.tv/127.0.0.1#5335\nipset=/rewrite-anime.tv/gfwlist\nserver=/epochtimes.co.il/127.0.0.1#5335\nipset=/epochtimes.co.il/gfwlist\nserver=/boyvid.com/127.0.0.1#5335\nipset=/boyvid.com/gfwlist\nserver=/apple.co.cr/127.0.0.1#5335\nipset=/apple.co.cr/gfwlist\nserver=/pornfinder.biz/127.0.0.1#5335\nipset=/pornfinder.biz/gfwlist\nserver=/bridgestoneamericas.com/127.0.0.1#5335\nipset=/bridgestoneamericas.com/gfwlist\nserver=/assetsadobe.com/127.0.0.1#5335\nipset=/assetsadobe.com/gfwlist\nserver=/momami18.livedoor.blog/127.0.0.1#5335\nipset=/momami18.livedoor.blog/gfwlist\nserver=/avxlive.icu/127.0.0.1#5335\nipset=/avxlive.icu/gfwlist\nserver=/aboutfacebook.com/127.0.0.1#5335\nipset=/aboutfacebook.com/gfwlist\nserver=/air-nike-shoes.com/127.0.0.1#5335\nipset=/air-nike-shoes.com/gfwlist\nserver=/etviet.com/127.0.0.1#5335\nipset=/etviet.com/gfwlist\nserver=/verisign.tw/127.0.0.1#5335\nipset=/verisign.tw/gfwlist\nserver=/oxfordmedicine.com/127.0.0.1#5335\nipset=/oxfordmedicine.com/gfwlist\nserver=/ruleporn.com/127.0.0.1#5335\nipset=/ruleporn.com/gfwlist\nserver=/ebay.ca/127.0.0.1#5335\nipset=/ebay.ca/gfwlist\nserver=/the-tls.co.uk/127.0.0.1#5335\nipset=/the-tls.co.uk/gfwlist\nserver=/logitech.io/127.0.0.1#5335\nipset=/logitech.io/gfwlist\nserver=/pornhoho.com/127.0.0.1#5335\nipset=/pornhoho.com/gfwlist\nserver=/itunesu.com/127.0.0.1#5335\nipset=/itunesu.com/gfwlist\nserver=/humblebundle.com/127.0.0.1#5335\nipset=/humblebundle.com/gfwlist\nserver=/punishworld.com/127.0.0.1#5335\nipset=/punishworld.com/gfwlist\nserver=/itunesradio.tv/127.0.0.1#5335\nipset=/itunesradio.tv/gfwlist\nserver=/verisign.us/127.0.0.1#5335\nipset=/verisign.us/gfwlist\nserver=/rumble.com/127.0.0.1#5335\nipset=/rumble.com/gfwlist\nserver=/itunesradio.rio/127.0.0.1#5335\nipset=/itunesradio.rio/gfwlist\nserver=/itunesradio.com/127.0.0.1#5335\nipset=/itunesradio.com/gfwlist\nserver=/ituneslatino.com/127.0.0.1#5335\nipset=/ituneslatino.com/gfwlist\nserver=/yahoo.com.gi/127.0.0.1#5335\nipset=/yahoo.com.gi/gfwlist\nserver=/itunesiradio.com/127.0.0.1#5335\nipset=/itunesiradio.com/gfwlist\nserver=/bmw-connecteddrive.si/127.0.0.1#5335\nipset=/bmw-connecteddrive.si/gfwlist\nserver=/itunes.rio/127.0.0.1#5335\nipset=/itunes.rio/gfwlist\nserver=/imgurinc.com/127.0.0.1#5335\nipset=/imgurinc.com/gfwlist\nserver=/alphera.de/127.0.0.1#5335\nipset=/alphera.de/gfwlist\nserver=/tubsexer.com/127.0.0.1#5335\nipset=/tubsexer.com/gfwlist\nserver=/mini.pt/127.0.0.1#5335\nipset=/mini.pt/gfwlist\nserver=/myfoxsanfran.com/127.0.0.1#5335\nipset=/myfoxsanfran.com/gfwlist\nserver=/baraero.com/127.0.0.1#5335\nipset=/baraero.com/gfwlist\nserver=/vklive.app/127.0.0.1#5335\nipset=/vklive.app/gfwlist\nserver=/hpeprintcenter.com/127.0.0.1#5335\nipset=/hpeprintcenter.com/gfwlist\nserver=/myfoxdfw.com/127.0.0.1#5335\nipset=/myfoxdfw.com/gfwlist\nserver=/quantil.com/127.0.0.1#5335\nipset=/quantil.com/gfwlist\nserver=/itunes.co.th/127.0.0.1#5335\nipset=/itunes.co.th/gfwlist\nserver=/javporn.ws/127.0.0.1#5335\nipset=/javporn.ws/gfwlist\nserver=/mmdnn.com/127.0.0.1#5335\nipset=/mmdnn.com/gfwlist\nserver=/google.com.sb/127.0.0.1#5335\nipset=/google.com.sb/gfwlist\nserver=/fi11av1.com/127.0.0.1#5335\nipset=/fi11av1.com/gfwlist\nserver=/realtype.jp/127.0.0.1#5335\nipset=/realtype.jp/gfwlist\nserver=/mini.com.mx/127.0.0.1#5335\nipset=/mini.com.mx/gfwlist\nserver=/livesex.com/127.0.0.1#5335\nipset=/livesex.com/gfwlist\nserver=/itun.es/127.0.0.1#5335\nipset=/itun.es/gfwlist\nserver=/pixfs.net/127.0.0.1#5335\nipset=/pixfs.net/gfwlist\nserver=/12joursdecadeauxdeitunes.com/127.0.0.1#5335\nipset=/12joursdecadeauxdeitunes.com/gfwlist\nserver=/hk1lib.org/127.0.0.1#5335\nipset=/hk1lib.org/gfwlist\nserver=/12diasderegalosdeitunes.hn/127.0.0.1#5335\nipset=/12diasderegalosdeitunes.hn/gfwlist\nserver=/disneyredirects.com/127.0.0.1#5335\nipset=/disneyredirects.com/gfwlist\nserver=/hairynature.com/127.0.0.1#5335\nipset=/hairynature.com/gfwlist\nserver=/pornovideoshub.com/127.0.0.1#5335\nipset=/pornovideoshub.com/gfwlist\nserver=/cheapbeatsbydr.com/127.0.0.1#5335\nipset=/cheapbeatsbydr.com/gfwlist\nserver=/fecbooc.com/127.0.0.1#5335\nipset=/fecbooc.com/gfwlist\nserver=/wsjshop.com/127.0.0.1#5335\nipset=/wsjshop.com/gfwlist\nserver=/12diasderegalosdeitunes.cr/127.0.0.1#5335\nipset=/12diasderegalosdeitunes.cr/gfwlist\nserver=/originalindianporn.com/127.0.0.1#5335\nipset=/originalindianporn.com/gfwlist\nserver=/beatsbydrefrcasquepascher.com/127.0.0.1#5335\nipset=/beatsbydrefrcasquepascher.com/gfwlist\nserver=/xxbrits.com/127.0.0.1#5335\nipset=/xxbrits.com/gfwlist\nserver=/fetishshrine.com/127.0.0.1#5335\nipset=/fetishshrine.com/gfwlist\nserver=/sinoinsider.com/127.0.0.1#5335\nipset=/sinoinsider.com/gfwlist\nserver=/12diasderegalosdeitunes.cl/127.0.0.1#5335\nipset=/12diasderegalosdeitunes.cl/gfwlist\nserver=/foxnews.com/127.0.0.1#5335\nipset=/foxnews.com/gfwlist\nserver=/iloveprettylolimm.com/127.0.0.1#5335\nipset=/iloveprettylolimm.com/gfwlist\nserver=/mylcloud.net/127.0.0.1#5335\nipset=/mylcloud.net/gfwlist\nserver=/ingkacentres.com/127.0.0.1#5335\nipset=/ingkacentres.com/gfwlist\nserver=/easportsfootballclub.com/127.0.0.1#5335\nipset=/easportsfootballclub.com/gfwlist\nserver=/prepsure.com/127.0.0.1#5335\nipset=/prepsure.com/gfwlist\nserver=/myicloud.net/127.0.0.1#5335\nipset=/myicloud.net/gfwlist\nserver=/myferrariheadphones.com/127.0.0.1#5335\nipset=/myferrariheadphones.com/gfwlist\nserver=/disneyplus.com.ssl.sc.omtrdc.net/127.0.0.1#5335\nipset=/disneyplus.com.ssl.sc.omtrdc.net/gfwlist\nserver=/de1lib.org/127.0.0.1#5335\nipset=/de1lib.org/gfwlist\nserver=/icloudsecure.net/127.0.0.1#5335\nipset=/icloudsecure.net/gfwlist\nserver=/multporn.net/127.0.0.1#5335\nipset=/multporn.net/gfwlist\nserver=/globalsign.be/127.0.0.1#5335\nipset=/globalsign.be/gfwlist\nserver=/storesense.com/127.0.0.1#5335\nipset=/storesense.com/gfwlist\nserver=/youtubego.com/127.0.0.1#5335\nipset=/youtubego.com/gfwlist\nserver=/foxnews.org/127.0.0.1#5335\nipset=/foxnews.org/gfwlist\nserver=/directv.com/127.0.0.1#5335\nipset=/directv.com/gfwlist\nserver=/macbookpros.com/127.0.0.1#5335\nipset=/macbookpros.com/gfwlist\nserver=/freebdsmxxx.org/127.0.0.1#5335\nipset=/freebdsmxxx.org/gfwlist\nserver=/arzon.jp/127.0.0.1#5335\nipset=/arzon.jp/gfwlist\nserver=/youtube.com.ee/127.0.0.1#5335\nipset=/youtube.com.ee/gfwlist\nserver=/yahoo.com.fj/127.0.0.1#5335\nipset=/yahoo.com.fj/gfwlist\nserver=/microad.jp/127.0.0.1#5335\nipset=/microad.jp/gfwlist\nserver=/foxdigitalmovies.com/127.0.0.1#5335\nipset=/foxdigitalmovies.com/gfwlist\nserver=/veet.at/127.0.0.1#5335\nipset=/veet.at/gfwlist\nserver=/icloudnet.net/127.0.0.1#5335\nipset=/icloudnet.net/gfwlist\nserver=/icloudbrowser.net/127.0.0.1#5335\nipset=/icloudbrowser.net/gfwlist\nserver=/facebook.hu/127.0.0.1#5335\nipset=/facebook.hu/gfwlist\nserver=/icloud.vn/127.0.0.1#5335\nipset=/icloud.vn/gfwlist\nserver=/sexsex1.com/127.0.0.1#5335\nipset=/sexsex1.com/gfwlist\nserver=/disneymagicmoments.co.il/127.0.0.1#5335\nipset=/disneymagicmoments.co.il/gfwlist\nserver=/hotamateurblowjobs.com/127.0.0.1#5335\nipset=/hotamateurblowjobs.com/gfwlist\nserver=/girlspoopingtube.com/127.0.0.1#5335\nipset=/girlspoopingtube.com/gfwlist\nserver=/icloud.pt/127.0.0.1#5335\nipset=/icloud.pt/gfwlist\nserver=/avstar03.me/127.0.0.1#5335\nipset=/avstar03.me/gfwlist\nserver=/icloud.om/127.0.0.1#5335\nipset=/icloud.om/gfwlist\nserver=/vrcams.io/127.0.0.1#5335\nipset=/vrcams.io/gfwlist\nserver=/icloud.ie/127.0.0.1#5335\nipset=/icloud.ie/gfwlist\nserver=/canon.dk/127.0.0.1#5335\nipset=/canon.dk/gfwlist\nserver=/henti-night.com/127.0.0.1#5335\nipset=/henti-night.com/gfwlist\nserver=/mastercard.co.jp/127.0.0.1#5335\nipset=/mastercard.co.jp/gfwlist\nserver=/older-women-movies.com/127.0.0.1#5335\nipset=/older-women-movies.com/gfwlist\nserver=/instawank.com/127.0.0.1#5335\nipset=/instawank.com/gfwlist\nserver=/mi9.com.au/127.0.0.1#5335\nipset=/mi9.com.au/gfwlist\nserver=/supportfacebook.com/127.0.0.1#5335\nipset=/supportfacebook.com/gfwlist\nserver=/bmw-connecteddrive.de/127.0.0.1#5335\nipset=/bmw-connecteddrive.de/gfwlist\nserver=/vrsmash.com/127.0.0.1#5335\nipset=/vrsmash.com/gfwlist\nserver=/alljapanesepass.com/127.0.0.1#5335\nipset=/alljapanesepass.com/gfwlist\nserver=/mask-h2.icloud.com/127.0.0.1#5335\nipset=/mask-h2.icloud.com/gfwlist\nserver=/facecook.com/127.0.0.1#5335\nipset=/facecook.com/gfwlist\nserver=/scp-wiki.net/127.0.0.1#5335\nipset=/scp-wiki.net/gfwlist\nserver=/wholesalefine.com/127.0.0.1#5335\nipset=/wholesalefine.com/gfwlist\nserver=/bmwi.ca/127.0.0.1#5335\nipset=/bmwi.ca/gfwlist\nserver=/wholesale-exporter1.com/127.0.0.1#5335\nipset=/wholesale-exporter1.com/gfwlist\nserver=/digicert-validation.com/127.0.0.1#5335\nipset=/digicert-validation.com/gfwlist\nserver=/kyurem.com/127.0.0.1#5335\nipset=/kyurem.com/gfwlist\nserver=/foxsports-chicago.com/127.0.0.1#5335\nipset=/foxsports-chicago.com/gfwlist\nserver=/canon.com.hk/127.0.0.1#5335\nipset=/canon.com.hk/gfwlist\nserver=/hellosmartbook.com/127.0.0.1#5335\nipset=/hellosmartbook.com/gfwlist\nserver=/online-instagram.com/127.0.0.1#5335\nipset=/online-instagram.com/gfwlist\nserver=/alphera.my/127.0.0.1#5335\nipset=/alphera.my/gfwlist\nserver=/nervanasys.com/127.0.0.1#5335\nipset=/nervanasys.com/gfwlist\nserver=/advancediddetection.com/127.0.0.1#5335\nipset=/advancediddetection.com/gfwlist\nserver=/xboxplayanywhere.com/127.0.0.1#5335\nipset=/xboxplayanywhere.com/gfwlist\nserver=/vimeo-staging2.com/127.0.0.1#5335\nipset=/vimeo-staging2.com/gfwlist\nserver=/18comic.org/127.0.0.1#5335\nipset=/18comic.org/gfwlist\nserver=/pornburger.com/127.0.0.1#5335\nipset=/pornburger.com/gfwlist\nserver=/gofuckmenow.com/127.0.0.1#5335\nipset=/gofuckmenow.com/gfwlist\nserver=/adidas.ie/127.0.0.1#5335\nipset=/adidas.ie/gfwlist\nserver=/bmw.gr/127.0.0.1#5335\nipset=/bmw.gr/gfwlist\nserver=/voashona.com/127.0.0.1#5335\nipset=/voashona.com/gfwlist\nserver=/fcebookk.com/127.0.0.1#5335\nipset=/fcebookk.com/gfwlist\nserver=/google.gy/127.0.0.1#5335\nipset=/google.gy/gfwlist\nserver=/volvogroup.com/127.0.0.1#5335\nipset=/volvogroup.com/gfwlist\nserver=/bloombergbreakaway.com/127.0.0.1#5335\nipset=/bloombergbreakaway.com/gfwlist\nserver=/volvotrucks.ae/127.0.0.1#5335\nipset=/volvotrucks.ae/gfwlist\nserver=/adultsextoys.com/127.0.0.1#5335\nipset=/adultsextoys.com/gfwlist\nserver=/akiba-online.com/127.0.0.1#5335\nipset=/akiba-online.com/gfwlist\nserver=/beibao.com/127.0.0.1#5335\nipset=/beibao.com/gfwlist\nserver=/faccebookk.com/127.0.0.1#5335\nipset=/faccebookk.com/gfwlist\nserver=/www-facebook.com/127.0.0.1#5335\nipset=/www-facebook.com/gfwlist\nserver=/pearsonclinical.dk/127.0.0.1#5335\nipset=/pearsonclinical.dk/gfwlist\nserver=/eanordic.com/127.0.0.1#5335\nipset=/eanordic.com/gfwlist\nserver=/dynamics.com/127.0.0.1#5335\nipset=/dynamics.com/gfwlist\nserver=/bmwshop.ca/127.0.0.1#5335\nipset=/bmwshop.ca/gfwlist\nserver=/sulwerphoto.com/127.0.0.1#5335\nipset=/sulwerphoto.com/gfwlist\nserver=/couriermail.com.au/127.0.0.1#5335\nipset=/couriermail.com.au/gfwlist\nserver=/freebigmovies.com/127.0.0.1#5335\nipset=/freebigmovies.com/gfwlist\nserver=/specialtyheadphones.com/127.0.0.1#5335\nipset=/specialtyheadphones.com/gfwlist\nserver=/mastercard.ke/127.0.0.1#5335\nipset=/mastercard.ke/gfwlist\nserver=/xbeegtube.com/127.0.0.1#5335\nipset=/xbeegtube.com/gfwlist\nserver=/solostudioksale.com/127.0.0.1#5335\nipset=/solostudioksale.com/gfwlist\nserver=/gotgayporn.com/127.0.0.1#5335\nipset=/gotgayporn.com/gfwlist\nserver=/mini.es/127.0.0.1#5335\nipset=/mini.es/gfwlist\nserver=/mini-egypt.com/127.0.0.1#5335\nipset=/mini-egypt.com/gfwlist\nserver=/sneaker666.com/127.0.0.1#5335\nipset=/sneaker666.com/gfwlist\nserver=/shoppinguheadphones.com/127.0.0.1#5335\nipset=/shoppinguheadphones.com/gfwlist\nserver=/webtype.com/127.0.0.1#5335\nipset=/webtype.com/gfwlist\nserver=/pinterest.com.mx/127.0.0.1#5335\nipset=/pinterest.com.mx/gfwlist\nserver=/bmw-motorrad.sv/127.0.0.1#5335\nipset=/bmw-motorrad.sv/gfwlist\nserver=/gallery-dump.club/127.0.0.1#5335\nipset=/gallery-dump.club/gfwlist\nserver=/shop-headphones.net/127.0.0.1#5335\nipset=/shop-headphones.net/gfwlist\nserver=/myrz.com/127.0.0.1#5335\nipset=/myrz.com/gfwlist\nserver=/femscat.com/127.0.0.1#5335\nipset=/femscat.com/gfwlist\nserver=/volvobuses.es/127.0.0.1#5335\nipset=/volvobuses.es/gfwlist\nserver=/shoestop2.com/127.0.0.1#5335\nipset=/shoestop2.com/gfwlist\nserver=/sanvaras.com/127.0.0.1#5335\nipset=/sanvaras.com/gfwlist\nserver=/spoti.fi/127.0.0.1#5335\nipset=/spoti.fi/gfwlist\nserver=/mini.com.mo/127.0.0.1#5335\nipset=/mini.com.mo/gfwlist\nserver=/como-hackearfacebook.com/127.0.0.1#5335\nipset=/como-hackearfacebook.com/gfwlist\nserver=/chloesworld.com/127.0.0.1#5335\nipset=/chloesworld.com/gfwlist\nserver=/repsneakermall.com/127.0.0.1#5335\nipset=/repsneakermall.com/gfwlist\nserver=/prostudiobeatscybersale.com/127.0.0.1#5335\nipset=/prostudiobeatscybersale.com/gfwlist\nserver=/haori888.com/127.0.0.1#5335\nipset=/haori888.com/gfwlist\nserver=/mini-bosnia.com/127.0.0.1#5335\nipset=/mini-bosnia.com/gfwlist\nserver=/flatmates.com.au/127.0.0.1#5335\nipset=/flatmates.com.au/gfwlist\nserver=/powerbeatsbydre.com/127.0.0.1#5335\nipset=/powerbeatsbydre.com/gfwlist\nserver=/powerbeatsbydrdre.com/127.0.0.1#5335\nipset=/powerbeatsbydrdre.com/gfwlist\nserver=/bamgrid.com/127.0.0.1#5335\nipset=/bamgrid.com/gfwlist\nserver=/pocketbiketrader.com/127.0.0.1#5335\nipset=/pocketbiketrader.com/gfwlist\nserver=/iporntv.net/127.0.0.1#5335\nipset=/iporntv.net/gfwlist\nserver=/pillbeatsblackfridaysale.com/127.0.0.1#5335\nipset=/pillbeatsblackfridaysale.com/gfwlist\nserver=/pickshoesclothes.com/127.0.0.1#5335\nipset=/pickshoesclothes.com/gfwlist\nserver=/picknicekicks.net/127.0.0.1#5335\nipset=/picknicekicks.net/gfwlist\nserver=/personeelsland.com/127.0.0.1#5335\nipset=/personeelsland.com/gfwlist\nserver=/monsterbeatssalg.com/127.0.0.1#5335\nipset=/monsterbeatssalg.com/gfwlist\nserver=/breitbart.com/127.0.0.1#5335\nipset=/breitbart.com/gfwlist\nserver=/pugetsoundbmw.com/127.0.0.1#5335\nipset=/pugetsoundbmw.com/gfwlist\nserver=/cmu.edu/127.0.0.1#5335\nipset=/cmu.edu/gfwlist\nserver=/edx.org/127.0.0.1#5335\nipset=/edx.org/gfwlist\nserver=/javprice.com/127.0.0.1#5335\nipset=/javprice.com/gfwlist\nserver=/mastercard-email.com/127.0.0.1#5335\nipset=/mastercard-email.com/gfwlist\nserver=/zee5.tv/127.0.0.1#5335\nipset=/zee5.tv/gfwlist\nserver=/officialbeatsbydrestore.com/127.0.0.1#5335\nipset=/officialbeatsbydrestore.com/gfwlist\nserver=/mega.nz/127.0.0.1#5335\nipset=/mega.nz/gfwlist\nserver=/disquscdn.com/127.0.0.1#5335\nipset=/disquscdn.com/gfwlist\nserver=/theclasshroom.com/127.0.0.1#5335\nipset=/theclasshroom.com/gfwlist\nserver=/bmw.fi/127.0.0.1#5335\nipset=/bmw.fi/gfwlist\nserver=/newlysprung.net/127.0.0.1#5335\nipset=/newlysprung.net/gfwlist\nserver=/ficeboock.com/127.0.0.1#5335\nipset=/ficeboock.com/gfwlist\nserver=/xdsummit.com/127.0.0.1#5335\nipset=/xdsummit.com/gfwlist\nserver=/thetvdb.com/127.0.0.1#5335\nipset=/thetvdb.com/gfwlist\nserver=/1lib.domains/127.0.0.1#5335\nipset=/1lib.domains/gfwlist\nserver=/acgnmanhua.com/127.0.0.1#5335\nipset=/acgnmanhua.com/gfwlist\nserver=/newbemany.com/127.0.0.1#5335\nipset=/newbemany.com/gfwlist\nserver=/bmwmotorrad.com.ph/127.0.0.1#5335\nipset=/bmwmotorrad.com.ph/gfwlist\nserver=/atkgallery.com/127.0.0.1#5335\nipset=/atkgallery.com/gfwlist\nserver=/cheapbeatsbydre99.com/127.0.0.1#5335\nipset=/cheapbeatsbydre99.com/gfwlist\nserver=/negozimonsterbeats.com/127.0.0.1#5335\nipset=/negozimonsterbeats.com/gfwlist\nserver=/zohostatic.com/127.0.0.1#5335\nipset=/zohostatic.com/gfwlist\nserver=/paypalnet.org/127.0.0.1#5335\nipset=/paypalnet.org/gfwlist\nserver=/skyassets.com/127.0.0.1#5335\nipset=/skyassets.com/gfwlist\nserver=/bmwmuseum.net/127.0.0.1#5335\nipset=/bmwmuseum.net/gfwlist\nserver=/bmw-arts-design.com/127.0.0.1#5335\nipset=/bmw-arts-design.com/gfwlist\nserver=/neborder.com/127.0.0.1#5335\nipset=/neborder.com/gfwlist\nserver=/cool18.com/127.0.0.1#5335\nipset=/cool18.com/gfwlist\nserver=/apple.eu/127.0.0.1#5335\nipset=/apple.eu/gfwlist\nserver=/disney.co.th/127.0.0.1#5335\nipset=/disney.co.th/gfwlist\nserver=/facecook.org/127.0.0.1#5335\nipset=/facecook.org/gfwlist\nserver=/bioporno.com/127.0.0.1#5335\nipset=/bioporno.com/gfwlist\nserver=/mini.rs/127.0.0.1#5335\nipset=/mini.rs/gfwlist\nserver=/starbucks.es/127.0.0.1#5335\nipset=/starbucks.es/gfwlist\nserver=/ms4dre.com/127.0.0.1#5335\nipset=/ms4dre.com/gfwlist\nserver=/google.ae/127.0.0.1#5335\nipset=/google.ae/gfwlist\nserver=/ccav69.me/127.0.0.1#5335\nipset=/ccav69.me/gfwlist\nserver=/goldcoastbulletin.com.au/127.0.0.1#5335\nipset=/goldcoastbulletin.com.au/gfwlist\nserver=/minidurham.com/127.0.0.1#5335\nipset=/minidurham.com/gfwlist\nserver=/aishegw.com/127.0.0.1#5335\nipset=/aishegw.com/gfwlist\nserver=/socdm.com/127.0.0.1#5335\nipset=/socdm.com/gfwlist\nserver=/xxxymovies.com/127.0.0.1#5335\nipset=/xxxymovies.com/gfwlist\nserver=/nikepromax.com/127.0.0.1#5335\nipset=/nikepromax.com/gfwlist\nserver=/facebooksupplier.com/127.0.0.1#5335\nipset=/facebooksupplier.com/gfwlist\nserver=/monstersdebea.com/127.0.0.1#5335\nipset=/monstersdebea.com/gfwlist\nserver=/10xfotolia.com/127.0.0.1#5335\nipset=/10xfotolia.com/gfwlist\nserver=/scatfinder.com/127.0.0.1#5335\nipset=/scatfinder.com/gfwlist\nserver=/flbjc.net/127.0.0.1#5335\nipset=/flbjc.net/gfwlist\nserver=/ebayeletro.com/127.0.0.1#5335\nipset=/ebayeletro.com/gfwlist\nserver=/icsd.fiz-karlsruhe.de/127.0.0.1#5335\nipset=/icsd.fiz-karlsruhe.de/gfwlist\nserver=/xbox360.com/127.0.0.1#5335\nipset=/xbox360.com/gfwlist\nserver=/gayfuckporn.com/127.0.0.1#5335\nipset=/gayfuckporn.com/gfwlist\nserver=/waa.tw/127.0.0.1#5335\nipset=/waa.tw/gfwlist\nserver=/cloudflareaccess.com/127.0.0.1#5335\nipset=/cloudflareaccess.com/gfwlist\nserver=/beatsbydremonsteraustralia.com/127.0.0.1#5335\nipset=/beatsbydremonsteraustralia.com/gfwlist\nserver=/s-nbcnews.com/127.0.0.1#5335\nipset=/s-nbcnews.com/gfwlist\nserver=/visasignature.co.kr/127.0.0.1#5335\nipset=/visasignature.co.kr/gfwlist\nserver=/monsterbeatsru.com/127.0.0.1#5335\nipset=/monsterbeatsru.com/gfwlist\nserver=/monsterbeatsonlinestoreuk.com/127.0.0.1#5335\nipset=/monsterbeatsonlinestoreuk.com/gfwlist\nserver=/vfsco.dk/127.0.0.1#5335\nipset=/vfsco.dk/gfwlist\nserver=/monsterbeatsok.com/127.0.0.1#5335\nipset=/monsterbeatsok.com/gfwlist\nserver=/monsterbeatsnegozi.net/127.0.0.1#5335\nipset=/monsterbeatsnegozi.net/gfwlist\nserver=/porngames.com/127.0.0.1#5335\nipset=/porngames.com/gfwlist\nserver=/monsterbeatsitaly.com/127.0.0.1#5335\nipset=/monsterbeatsitaly.com/gfwlist\nserver=/stunnel.org/127.0.0.1#5335\nipset=/stunnel.org/gfwlist\nserver=/monsterbeatsfinland.com/127.0.0.1#5335\nipset=/monsterbeatsfinland.com/gfwlist\nserver=/mastercard.kz/127.0.0.1#5335\nipset=/mastercard.kz/gfwlist\nserver=/bmw-motorrad.bg/127.0.0.1#5335\nipset=/bmw-motorrad.bg/gfwlist\nserver=/siam.org/127.0.0.1#5335\nipset=/siam.org/gfwlist\nserver=/kicksnike1.com/127.0.0.1#5335\nipset=/kicksnike1.com/gfwlist\nserver=/squarecloudservices.com/127.0.0.1#5335\nipset=/squarecloudservices.com/gfwlist\nserver=/bmw-connecteddrive.ae/127.0.0.1#5335\nipset=/bmw-connecteddrive.ae/gfwlist\nserver=/youyu.services/127.0.0.1#5335\nipset=/youyu.services/gfwlist\nserver=/phimsexhentai.me/127.0.0.1#5335\nipset=/phimsexhentai.me/gfwlist\nserver=/nginx.com/127.0.0.1#5335\nipset=/nginx.com/gfwlist\nserver=/binancezh.sh/127.0.0.1#5335\nipset=/binancezh.sh/gfwlist\nserver=/gonzo-movies.com/127.0.0.1#5335\nipset=/gonzo-movies.com/gfwlist\nserver=/monsterbeatsbydrebilligde.com/127.0.0.1#5335\nipset=/monsterbeatsbydrebilligde.com/gfwlist\nserver=/starwarsgalacticstarcruiser.com/127.0.0.1#5335\nipset=/starwarsgalacticstarcruiser.com/gfwlist\nserver=/gaycock4u.com/127.0.0.1#5335\nipset=/gaycock4u.com/gfwlist\nserver=/nikesbdunks.net/127.0.0.1#5335\nipset=/nikesbdunks.net/gfwlist\nserver=/bandag.cc/127.0.0.1#5335\nipset=/bandag.cc/gfwlist\nserver=/manhuagui.com/127.0.0.1#5335\nipset=/manhuagui.com/gfwlist\nserver=/artoferotica.info/127.0.0.1#5335\nipset=/artoferotica.info/gfwlist\nserver=/gaypornforyou.com/127.0.0.1#5335\nipset=/gaypornforyou.com/gfwlist\nserver=/hentaigamesplanet.com/127.0.0.1#5335\nipset=/hentaigamesplanet.com/gfwlist\nserver=/youtube.com.qa/127.0.0.1#5335\nipset=/youtube.com.qa/gfwlist\nserver=/mzed.com/127.0.0.1#5335\nipset=/mzed.com/gfwlist\nserver=/heavenlyhentai.com/127.0.0.1#5335\nipset=/heavenlyhentai.com/gfwlist\nserver=/youtube.la/127.0.0.1#5335\nipset=/youtube.la/gfwlist\nserver=/bmwworld.com/127.0.0.1#5335\nipset=/bmwworld.com/gfwlist\nserver=/micstl.com/127.0.0.1#5335\nipset=/micstl.com/gfwlist\nserver=/8muses.io/127.0.0.1#5335\nipset=/8muses.io/gfwlist\nserver=/visapcsdirect.com/127.0.0.1#5335\nipset=/visapcsdirect.com/gfwlist\nserver=/gettyimages.at/127.0.0.1#5335\nipset=/gettyimages.at/gfwlist\nserver=/media-amazon.com/127.0.0.1#5335\nipset=/media-amazon.com/gfwlist\nserver=/instagrm.com/127.0.0.1#5335\nipset=/instagrm.com/gfwlist\nserver=/mairbeats.com/127.0.0.1#5335\nipset=/mairbeats.com/gfwlist\nserver=/dtci.technology/127.0.0.1#5335\nipset=/dtci.technology/gfwlist\nserver=/airwick.hu/127.0.0.1#5335\nipset=/airwick.hu/gfwlist\nserver=/kickshatchannel.com/127.0.0.1#5335\nipset=/kickshatchannel.com/gfwlist\nserver=/sacredhentai.com/127.0.0.1#5335\nipset=/sacredhentai.com/gfwlist\nserver=/lifeselector.com/127.0.0.1#5335\nipset=/lifeselector.com/gfwlist\nserver=/italiabeatsbydrdre.com/127.0.0.1#5335\nipset=/italiabeatsbydrdre.com/gfwlist\nserver=/chinapower.csis.org/127.0.0.1#5335\nipset=/chinapower.csis.org/gfwlist\nserver=/kijijiauto.ca/127.0.0.1#5335\nipset=/kijijiauto.ca/gfwlist\nserver=/bmw-motorrad.si/127.0.0.1#5335\nipset=/bmw-motorrad.si/gfwlist\nserver=/topcelebnudes.com/127.0.0.1#5335\nipset=/topcelebnudes.com/gfwlist\nserver=/marketo.tv/127.0.0.1#5335\nipset=/marketo.tv/gfwlist\nserver=/billmelater.info/127.0.0.1#5335\nipset=/billmelater.info/gfwlist\nserver=/canon.net/127.0.0.1#5335\nipset=/canon.net/gfwlist\nserver=/geforce.com.tw/127.0.0.1#5335\nipset=/geforce.com.tw/gfwlist\nserver=/yomikyo.or.jp/127.0.0.1#5335\nipset=/yomikyo.or.jp/gfwlist\nserver=/omghk.com/127.0.0.1#5335\nipset=/omghk.com/gfwlist\nserver=/bridgestonenationalfleet.com/127.0.0.1#5335\nipset=/bridgestonenationalfleet.com/gfwlist\nserver=/anb.org/127.0.0.1#5335\nipset=/anb.org/gfwlist\nserver=/milftube.pro/127.0.0.1#5335\nipset=/milftube.pro/gfwlist\nserver=/csis.org/127.0.0.1#5335\nipset=/csis.org/gfwlist\nserver=/librarylovefest.com/127.0.0.1#5335\nipset=/librarylovefest.com/gfwlist\nserver=/dlgarenanow-a.akamaihd.net/127.0.0.1#5335\nipset=/dlgarenanow-a.akamaihd.net/gfwlist\nserver=/milfprime.com/127.0.0.1#5335\nipset=/milfprime.com/gfwlist\nserver=/facebook-support.org/127.0.0.1#5335\nipset=/facebook-support.org/gfwlist\nserver=/fifastreet3.com/127.0.0.1#5335\nipset=/fifastreet3.com/gfwlist\nserver=/lexuemei.com/127.0.0.1#5335\nipset=/lexuemei.com/gfwlist\nserver=/appbridge.ca/127.0.0.1#5335\nipset=/appbridge.ca/gfwlist\nserver=/slobodnaevropa.mk/127.0.0.1#5335\nipset=/slobodnaevropa.mk/gfwlist\nserver=/3dfuckhouse.com/127.0.0.1#5335\nipset=/3dfuckhouse.com/gfwlist\nserver=/japaneselovelygirl.com/127.0.0.1#5335\nipset=/japaneselovelygirl.com/gfwlist\nserver=/faronics.com.au/127.0.0.1#5335\nipset=/faronics.com.au/gfwlist\nserver=/intelplay.com/127.0.0.1#5335\nipset=/intelplay.com/gfwlist\nserver=/fuhouse.club/127.0.0.1#5335\nipset=/fuhouse.club/gfwlist\nserver=/headphonezip.com/127.0.0.1#5335\nipset=/headphonezip.com/gfwlist\nserver=/bexjt5wz.xyz/127.0.0.1#5335\nipset=/bexjt5wz.xyz/gfwlist\nserver=/travelex.co.uk/127.0.0.1#5335\nipset=/travelex.co.uk/gfwlist\nserver=/headphonesretailer.com/127.0.0.1#5335\nipset=/headphonesretailer.com/gfwlist\nserver=/sysinternals.com/127.0.0.1#5335\nipset=/sysinternals.com/gfwlist\nserver=/nike.us/127.0.0.1#5335\nipset=/nike.us/gfwlist\nserver=/jquery.com/127.0.0.1#5335\nipset=/jquery.com/gfwlist\nserver=/volvotrucks.sk/127.0.0.1#5335\nipset=/volvotrucks.sk/gfwlist\nserver=/ebayde.com/127.0.0.1#5335\nipset=/ebayde.com/gfwlist\nserver=/lesbianpornvideos.com/127.0.0.1#5335\nipset=/lesbianpornvideos.com/gfwlist\nserver=/cloudinary.net/127.0.0.1#5335\nipset=/cloudinary.net/gfwlist\nserver=/volvobuses.at/127.0.0.1#5335\nipset=/volvobuses.at/gfwlist\nserver=/mythicgames.com/127.0.0.1#5335\nipset=/mythicgames.com/gfwlist\nserver=/atlasdmt.com/127.0.0.1#5335\nipset=/atlasdmt.com/gfwlist\nserver=/verisign.com.es/127.0.0.1#5335\nipset=/verisign.com.es/gfwlist\nserver=/jdbstatic.com/127.0.0.1#5335\nipset=/jdbstatic.com/gfwlist\nserver=/minid.no/127.0.0.1#5335\nipset=/minid.no/gfwlist\nserver=/pornlegendsclub.com/127.0.0.1#5335\nipset=/pornlegendsclub.com/gfwlist\nserver=/amatura.com/127.0.0.1#5335\nipset=/amatura.com/gfwlist\nserver=/ballbustingtube.com/127.0.0.1#5335\nipset=/ballbustingtube.com/gfwlist\nserver=/jav101.com/127.0.0.1#5335\nipset=/jav101.com/gfwlist\nserver=/nationalaustraliaban.tt.omtrdc.net/127.0.0.1#5335\nipset=/nationalaustraliaban.tt.omtrdc.net/gfwlist\nserver=/gmnetworks.net/127.0.0.1#5335\nipset=/gmnetworks.net/gfwlist\nserver=/frishoes.com/127.0.0.1#5335\nipset=/frishoes.com/gfwlist\nserver=/frcasquesbeats.com/127.0.0.1#5335\nipset=/frcasquesbeats.com/gfwlist\nserver=/fr-beatsbydrestore.com/127.0.0.1#5335\nipset=/fr-beatsbydrestore.com/gfwlist\nserver=/fox26.com/127.0.0.1#5335\nipset=/fox26.com/gfwlist\nserver=/foxsports.com.ar/127.0.0.1#5335\nipset=/foxsports.com.ar/gfwlist\nserver=/mastercardcenter.com/127.0.0.1#5335\nipset=/mastercardcenter.com/gfwlist\nserver=/vimeo.com/127.0.0.1#5335\nipset=/vimeo.com/gfwlist\nserver=/naver.net/127.0.0.1#5335\nipset=/naver.net/gfwlist\nserver=/ebaka.ru/127.0.0.1#5335\nipset=/ebaka.ru/gfwlist\nserver=/awsloft-stockholm.com/127.0.0.1#5335\nipset=/awsloft-stockholm.com/gfwlist\nserver=/attinnovationspace.com/127.0.0.1#5335\nipset=/attinnovationspace.com/gfwlist\nserver=/ts.la/127.0.0.1#5335\nipset=/ts.la/gfwlist\nserver=/pinduck.com/127.0.0.1#5335\nipset=/pinduck.com/gfwlist\nserver=/dreprobeats.com/127.0.0.1#5335\nipset=/dreprobeats.com/gfwlist\nserver=/kicu.tv/127.0.0.1#5335\nipset=/kicu.tv/gfwlist\nserver=/frescolib.org/127.0.0.1#5335\nipset=/frescolib.org/gfwlist\nserver=/drebeatsaustralia-cheap.com/127.0.0.1#5335\nipset=/drebeatsaustralia-cheap.com/gfwlist\nserver=/limer.tw/127.0.0.1#5335\nipset=/limer.tw/gfwlist\nserver=/newscorpaustralia.com/127.0.0.1#5335\nipset=/newscorpaustralia.com/gfwlist\nserver=/ak1.net/127.0.0.1#5335\nipset=/ak1.net/gfwlist\nserver=/google.com.my/127.0.0.1#5335\nipset=/google.com.my/gfwlist\nserver=/tryquinn.com/127.0.0.1#5335\nipset=/tryquinn.com/gfwlist\nserver=/yandex.kz/127.0.0.1#5335\nipset=/yandex.kz/gfwlist\nserver=/microsoftaffiliates.com/127.0.0.1#5335\nipset=/microsoftaffiliates.com/gfwlist\nserver=/twgreatnews.com/127.0.0.1#5335\nipset=/twgreatnews.com/gfwlist\nserver=/albagals.com/127.0.0.1#5335\nipset=/albagals.com/gfwlist\nserver=/hentaiyes.com/127.0.0.1#5335\nipset=/hentaiyes.com/gfwlist\nserver=/drebeatsaustralia-cheap.net/127.0.0.1#5335\nipset=/drebeatsaustralia-cheap.net/gfwlist\nserver=/naughtyamerica.com/127.0.0.1#5335\nipset=/naughtyamerica.com/gfwlist\nserver=/mini.com.gt/127.0.0.1#5335\nipset=/mini.com.gt/gfwlist\nserver=/drebeats-monsteraustralia.com/127.0.0.1#5335\nipset=/drebeats-monsteraustralia.com/gfwlist\nserver=/akami.net/127.0.0.1#5335\nipset=/akami.net/gfwlist\nserver=/erogames.com/127.0.0.1#5335\nipset=/erogames.com/gfwlist\nserver=/sectigo.com/127.0.0.1#5335\nipset=/sectigo.com/gfwlist\nserver=/mengnan.shop/127.0.0.1#5335\nipset=/mengnan.shop/gfwlist\nserver=/tx5254.com/127.0.0.1#5335\nipset=/tx5254.com/gfwlist\nserver=/xbox.com/127.0.0.1#5335\nipset=/xbox.com/gfwlist\nserver=/nintendodsi.com/127.0.0.1#5335\nipset=/nintendodsi.com/gfwlist\nserver=/my20houston.com/127.0.0.1#5335\nipset=/my20houston.com/gfwlist\nserver=/bmw-fleet.net/127.0.0.1#5335\nipset=/bmw-fleet.net/gfwlist\nserver=/mortein.co.za/127.0.0.1#5335\nipset=/mortein.co.za/gfwlist\nserver=/visa.ky/127.0.0.1#5335\nipset=/visa.ky/gfwlist\nserver=/bmw-yemen.com/127.0.0.1#5335\nipset=/bmw-yemen.com/gfwlist\nserver=/enanyang.my/127.0.0.1#5335\nipset=/enanyang.my/gfwlist\nserver=/drdremonster-beats.com/127.0.0.1#5335\nipset=/drdremonster-beats.com/gfwlist\nserver=/attdns.net/127.0.0.1#5335\nipset=/attdns.net/gfwlist\nserver=/signal.art/127.0.0.1#5335\nipset=/signal.art/gfwlist\nserver=/cuckoldplacetube.com/127.0.0.1#5335\nipset=/cuckoldplacetube.com/gfwlist\nserver=/drdrebeatsretail2013.com/127.0.0.1#5335\nipset=/drdrebeatsretail2013.com/gfwlist\nserver=/xindelu.com/127.0.0.1#5335\nipset=/xindelu.com/gfwlist\nserver=/nhentai.com/127.0.0.1#5335\nipset=/nhentai.com/gfwlist\nserver=/doodhwali.com/127.0.0.1#5335\nipset=/doodhwali.com/gfwlist\nserver=/wankzvr.com/127.0.0.1#5335\nipset=/wankzvr.com/gfwlist\nserver=/slutload.com/127.0.0.1#5335\nipset=/slutload.com/gfwlist\nserver=/radian6.com/127.0.0.1#5335\nipset=/radian6.com/gfwlist\nserver=/audible.com/127.0.0.1#5335\nipset=/audible.com/gfwlist\nserver=/disneyworld-go.com/127.0.0.1#5335\nipset=/disneyworld-go.com/gfwlist\nserver=/npm.community/127.0.0.1#5335\nipset=/npm.community/gfwlist\nserver=/mini-connected.es/127.0.0.1#5335\nipset=/mini-connected.es/gfwlist\nserver=/gyutto.com/127.0.0.1#5335\nipset=/gyutto.com/gfwlist\nserver=/computer.org/127.0.0.1#5335\nipset=/computer.org/gfwlist\nserver=/1010.com.hk/127.0.0.1#5335\nipset=/1010.com.hk/gfwlist\nserver=/yourspeculumexam.com/127.0.0.1#5335\nipset=/yourspeculumexam.com/gfwlist\nserver=/59mvmv.com/127.0.0.1#5335\nipset=/59mvmv.com/gfwlist\nserver=/codei.sh/127.0.0.1#5335\nipset=/codei.sh/gfwlist\nserver=/tferwq.com/127.0.0.1#5335\nipset=/tferwq.com/gfwlist\nserver=/discountbeatsstore.com/127.0.0.1#5335\nipset=/discountbeatsstore.com/gfwlist\nserver=/taylorfrancis.com/127.0.0.1#5335\nipset=/taylorfrancis.com/gfwlist\nserver=/yoshisnewisland.com/127.0.0.1#5335\nipset=/yoshisnewisland.com/gfwlist\nserver=/wikileaks.org/127.0.0.1#5335\nipset=/wikileaks.org/gfwlist\nserver=/adidas.de/127.0.0.1#5335\nipset=/adidas.de/gfwlist\nserver=/custombeatssbydreus.com/127.0.0.1#5335\nipset=/custombeatssbydreus.com/gfwlist\nserver=/custombeatsdeals.com/127.0.0.1#5335\nipset=/custombeatsdeals.com/gfwlist\nserver=/beatsbydreus.com/127.0.0.1#5335\nipset=/beatsbydreus.com/gfwlist\nserver=/nintendo.fi/127.0.0.1#5335\nipset=/nintendo.fi/gfwlist\nserver=/cuffiesaldi.com/127.0.0.1#5335\nipset=/cuffiesaldi.com/gfwlist\nserver=/eamobile.com/127.0.0.1#5335\nipset=/eamobile.com/gfwlist\nserver=/acgww.cyou/127.0.0.1#5335\nipset=/acgww.cyou/gfwlist\nserver=/coolmonster.net/127.0.0.1#5335\nipset=/coolmonster.net/gfwlist\nserver=/miniwindsor.com/127.0.0.1#5335\nipset=/miniwindsor.com/gfwlist\nserver=/chihair-straightener.com/127.0.0.1#5335\nipset=/chihair-straightener.com/gfwlist\nserver=/pearsonlongman.ch/127.0.0.1#5335\nipset=/pearsonlongman.ch/gfwlist\nserver=/cheapsalemonster.com/127.0.0.1#5335\nipset=/cheapsalemonster.com/gfwlist\nserver=/cheapnewbeatsbydre.com/127.0.0.1#5335\nipset=/cheapnewbeatsbydre.com/gfwlist\nserver=/xbox360.co/127.0.0.1#5335\nipset=/xbox360.co/gfwlist\nserver=/bobs-tube.com/127.0.0.1#5335\nipset=/bobs-tube.com/gfwlist\nserver=/cheapmonsterbeatsheadsets.com/127.0.0.1#5335\nipset=/cheapmonsterbeatsheadsets.com/gfwlist\nserver=/ea.tt.omtrdc.net/127.0.0.1#5335\nipset=/ea.tt.omtrdc.net/gfwlist\nserver=/cheapheadphonessale.com/127.0.0.1#5335\nipset=/cheapheadphonessale.com/gfwlist\nserver=/xxx4hindi.com/127.0.0.1#5335\nipset=/xxx4hindi.com/gfwlist\nserver=/cheapdrdrebeatsca.com/127.0.0.1#5335\nipset=/cheapdrdrebeatsca.com/gfwlist\nserver=/chuokoron.jp/127.0.0.1#5335\nipset=/chuokoron.jp/gfwlist\nserver=/cheapdrdrebeats8.com/127.0.0.1#5335\nipset=/cheapdrdrebeats8.com/gfwlist\nserver=/infocert.it/127.0.0.1#5335\nipset=/infocert.it/gfwlist\nserver=/fox13news.com/127.0.0.1#5335\nipset=/fox13news.com/gfwlist\nserver=/mini-vietnam.com/127.0.0.1#5335\nipset=/mini-vietnam.com/gfwlist\nserver=/freexvideos.org/127.0.0.1#5335\nipset=/freexvideos.org/gfwlist\nserver=/bridgestoneperformance.com/127.0.0.1#5335\nipset=/bridgestoneperformance.com/gfwlist\nserver=/myfoxaustin.com/127.0.0.1#5335\nipset=/myfoxaustin.com/gfwlist\nserver=/cheapbeatsheadphones.us/127.0.0.1#5335\nipset=/cheapbeatsheadphones.us/gfwlist\nserver=/cheapbeatsheadphone2014.com/127.0.0.1#5335\nipset=/cheapbeatsheadphone2014.com/gfwlist\nserver=/ilovexs.com/127.0.0.1#5335\nipset=/ilovexs.com/gfwlist\nserver=/99thz.com/127.0.0.1#5335\nipset=/99thz.com/gfwlist\nserver=/fteproxy.org/127.0.0.1#5335\nipset=/fteproxy.org/gfwlist\nserver=/xxxbunker.com/127.0.0.1#5335\nipset=/xxxbunker.com/gfwlist\nserver=/xnxxhd.biz/127.0.0.1#5335\nipset=/xnxxhd.biz/gfwlist\nserver=/cheapbeatsbydreoutlets2013.com/127.0.0.1#5335\nipset=/cheapbeatsbydreoutlets2013.com/gfwlist\nserver=/beatsheadphonesdealer.com/127.0.0.1#5335\nipset=/beatsheadphonesdealer.com/gfwlist\nserver=/18tube.xxx/127.0.0.1#5335\nipset=/18tube.xxx/gfwlist\nserver=/czechvideo.org/127.0.0.1#5335\nipset=/czechvideo.org/gfwlist\nserver=/gfacecbook.com/127.0.0.1#5335\nipset=/gfacecbook.com/gfwlist\nserver=/xhamster.com/127.0.0.1#5335\nipset=/xhamster.com/gfwlist\nserver=/ipod.net/127.0.0.1#5335\nipset=/ipod.net/gfwlist\nserver=/verizonmedia.com/127.0.0.1#5335\nipset=/verizonmedia.com/gfwlist\nserver=/apple.jo/127.0.0.1#5335\nipset=/apple.jo/gfwlist\nserver=/casquebeatspascher2013.com/127.0.0.1#5335\nipset=/casquebeatspascher2013.com/gfwlist\nserver=/yourphysicalexam.com/127.0.0.1#5335\nipset=/yourphysicalexam.com/gfwlist\nserver=/casquebeatsmer.net/127.0.0.1#5335\nipset=/casquebeatsmer.net/gfwlist\nserver=/blpevents.com/127.0.0.1#5335\nipset=/blpevents.com/gfwlist\nserver=/xbox.co/127.0.0.1#5335\nipset=/xbox.co/gfwlist\nserver=/gentoo.org/127.0.0.1#5335\nipset=/gentoo.org/gfwlist\nserver=/camonster.com/127.0.0.1#5335\nipset=/camonster.com/gfwlist\nserver=/namethatpornad.com/127.0.0.1#5335\nipset=/namethatpornad.com/gfwlist\nserver=/stxmosquitoproject.net/127.0.0.1#5335\nipset=/stxmosquitoproject.net/gfwlist\nserver=/easylist.to/127.0.0.1#5335\nipset=/easylist.to/gfwlist\nserver=/buyshoponly.com/127.0.0.1#5335\nipset=/buyshoponly.com/gfwlist\nserver=/hentaiheadlines.com/127.0.0.1#5335\nipset=/hentaiheadlines.com/gfwlist\nserver=/justfamilyporn.com/127.0.0.1#5335\nipset=/justfamilyporn.com/gfwlist\nserver=/dailym.ai/127.0.0.1#5335\nipset=/dailym.ai/gfwlist\nserver=/vodafone.it/127.0.0.1#5335\nipset=/vodafone.it/gfwlist\nserver=/buybeatsheadphonesbydre.com/127.0.0.1#5335\nipset=/buybeatsheadphonesbydre.com/gfwlist\nserver=/bmwusa.com/127.0.0.1#5335\nipset=/bmwusa.com/gfwlist\nserver=/buybeatsbydre-uk.com/127.0.0.1#5335\nipset=/buybeatsbydre-uk.com/gfwlist\nserver=/nintendo.co.jp/127.0.0.1#5335\nipset=/nintendo.co.jp/gfwlist\nserver=/firestone.com.ar/127.0.0.1#5335\nipset=/firestone.com.ar/gfwlist\nserver=/buy-from-shanghai.com/127.0.0.1#5335\nipset=/buy-from-shanghai.com/gfwlist\nserver=/brands098.com/127.0.0.1#5335\nipset=/brands098.com/gfwlist\nserver=/steam.cdn.on.net/127.0.0.1#5335\nipset=/steam.cdn.on.net/gfwlist\nserver=/thegooglestore.com/127.0.0.1#5335\nipset=/thegooglestore.com/gfwlist\nserver=/nokiantyres.com/127.0.0.1#5335\nipset=/nokiantyres.com/gfwlist\nserver=/isfocus.net/127.0.0.1#5335\nipset=/isfocus.net/gfwlist\nserver=/badgen.net/127.0.0.1#5335\nipset=/badgen.net/gfwlist\nserver=/maturewomenanal.com/127.0.0.1#5335\nipset=/maturewomenanal.com/gfwlist\nserver=/scatshop.com/127.0.0.1#5335\nipset=/scatshop.com/gfwlist\nserver=/youtube.com.kw/127.0.0.1#5335\nipset=/youtube.com.kw/gfwlist\nserver=/bookonsky.net/127.0.0.1#5335\nipset=/bookonsky.net/gfwlist\nserver=/bloommicroventures.com/127.0.0.1#5335\nipset=/bloommicroventures.com/gfwlist\nserver=/biitii.com/127.0.0.1#5335\nipset=/biitii.com/gfwlist\nserver=/azatutyun.am/127.0.0.1#5335\nipset=/azatutyun.am/gfwlist\nserver=/thecandidforum-voyeur.ru/127.0.0.1#5335\nipset=/thecandidforum-voyeur.ru/gfwlist\nserver=/facebooks.com/127.0.0.1#5335\nipset=/facebooks.com/gfwlist\nserver=/54647.io/127.0.0.1#5335\nipset=/54647.io/gfwlist\nserver=/playparagon.com/127.0.0.1#5335\nipset=/playparagon.com/gfwlist\nserver=/eebay.com/127.0.0.1#5335\nipset=/eebay.com/gfwlist\nserver=/xn--ubt498knmf.com/127.0.0.1#5335\nipset=/xn--ubt498knmf.com/gfwlist\nserver=/javfree.me/127.0.0.1#5335\nipset=/javfree.me/gfwlist\nserver=/beatssingapores.com/127.0.0.1#5335\nipset=/beatssingapores.com/gfwlist\nserver=/pythonhosted.org/127.0.0.1#5335\nipset=/pythonhosted.org/gfwlist\nserver=/eurekaselect.com/127.0.0.1#5335\nipset=/eurekaselect.com/gfwlist\nserver=/ocsp-certum.com/127.0.0.1#5335\nipset=/ocsp-certum.com/gfwlist\nserver=/porncoil.com/127.0.0.1#5335\nipset=/porncoil.com/gfwlist\nserver=/xbox360.org/127.0.0.1#5335\nipset=/xbox360.org/gfwlist\nserver=/advertiserscommunity.com/127.0.0.1#5335\nipset=/advertiserscommunity.com/gfwlist\nserver=/beatspromonsterjp.com/127.0.0.1#5335\nipset=/beatspromonsterjp.com/gfwlist\nserver=/bmwfilms.com/127.0.0.1#5335\nipset=/bmwfilms.com/gfwlist\nserver=/xero.porn/127.0.0.1#5335\nipset=/xero.porn/gfwlist\nserver=/appledaily.com/127.0.0.1#5335\nipset=/appledaily.com/gfwlist\nserver=/uselessjunk.com/127.0.0.1#5335\nipset=/uselessjunk.com/gfwlist\nserver=/bcsecure01-a.akamaihd.net/127.0.0.1#5335\nipset=/bcsecure01-a.akamaihd.net/gfwlist\nserver=/soasta-dswb.com/127.0.0.1#5335\nipset=/soasta-dswb.com/gfwlist\nserver=/jav9999.com/127.0.0.1#5335\nipset=/jav9999.com/gfwlist\nserver=/beatsofdre-usa.com/127.0.0.1#5335\nipset=/beatsofdre-usa.com/gfwlist\nserver=/adulto.vip/127.0.0.1#5335\nipset=/adulto.vip/gfwlist\nserver=/aznude.com/127.0.0.1#5335\nipset=/aznude.com/gfwlist\nserver=/my3dhentai.com/127.0.0.1#5335\nipset=/my3dhentai.com/gfwlist\nserver=/volvotrucks.ps/127.0.0.1#5335\nipset=/volvotrucks.ps/gfwlist\nserver=/miiverse.com/127.0.0.1#5335\nipset=/miiverse.com/gfwlist\nserver=/huobi.sc/127.0.0.1#5335\nipset=/huobi.sc/gfwlist\nserver=/dokusho-ojikan.jp/127.0.0.1#5335\nipset=/dokusho-ojikan.jp/gfwlist\nserver=/pinkteentube.net/127.0.0.1#5335\nipset=/pinkteentube.net/gfwlist\nserver=/airgonetworks.com/127.0.0.1#5335\nipset=/airgonetworks.com/gfwlist\nserver=/bestshoesale2014.net/127.0.0.1#5335\nipset=/bestshoesale2014.net/gfwlist\nserver=/beatsheadphonestudio.com/127.0.0.1#5335\nipset=/beatsheadphonestudio.com/gfwlist\nserver=/bmw-motorrad.in/127.0.0.1#5335\nipset=/bmw-motorrad.in/gfwlist\nserver=/bestfreesexgames.com/127.0.0.1#5335\nipset=/bestfreesexgames.com/gfwlist\nserver=/freesexyindians.com/127.0.0.1#5335\nipset=/freesexyindians.com/gfwlist\nserver=/yahoo.so/127.0.0.1#5335\nipset=/yahoo.so/gfwlist\nserver=/oninstagram.com/127.0.0.1#5335\nipset=/oninstagram.com/gfwlist\nserver=/cambb.xxx/127.0.0.1#5335\nipset=/cambb.xxx/gfwlist\nserver=/bmw-motorrad.es/127.0.0.1#5335\nipset=/bmw-motorrad.es/gfwlist\nserver=/beatsheadphones2u.com/127.0.0.1#5335\nipset=/beatsheadphones2u.com/gfwlist\nserver=/beatsheadphones1.com/127.0.0.1#5335\nipset=/beatsheadphones1.com/gfwlist\nserver=/jupyter.org/127.0.0.1#5335\nipset=/jupyter.org/gfwlist\nserver=/yahoo.fi/127.0.0.1#5335\nipset=/yahoo.fi/gfwlist\nserver=/joox.com/127.0.0.1#5335\nipset=/joox.com/gfwlist\nserver=/test-ipv6.com/127.0.0.1#5335\nipset=/test-ipv6.com/gfwlist\nserver=/dajiyuan.com/127.0.0.1#5335\nipset=/dajiyuan.com/gfwlist\nserver=/cygwin.com/127.0.0.1#5335\nipset=/cygwin.com/gfwlist\nserver=/whynotbi.com/127.0.0.1#5335\nipset=/whynotbi.com/gfwlist\nserver=/hulu.jp/127.0.0.1#5335\nipset=/hulu.jp/gfwlist\nserver=/vrv.co/127.0.0.1#5335\nipset=/vrv.co/gfwlist\nserver=/girlscv.com/127.0.0.1#5335\nipset=/girlscv.com/gfwlist\nserver=/beatsfacstore.com/127.0.0.1#5335\nipset=/beatsfacstore.com/gfwlist\nserver=/beatsearbudsheadphoness.com/127.0.0.1#5335\nipset=/beatsearbudsheadphoness.com/gfwlist\nserver=/nyt.com/127.0.0.1#5335\nipset=/nyt.com/gfwlist\nserver=/doujincg.blog.jp/127.0.0.1#5335\nipset=/doujincg.blog.jp/gfwlist\nserver=/fontsinuse.com/127.0.0.1#5335\nipset=/fontsinuse.com/gfwlist\nserver=/pplah.com/127.0.0.1#5335\nipset=/pplah.com/gfwlist\nserver=/googleusercontent.com/127.0.0.1#5335\nipset=/googleusercontent.com/gfwlist\nserver=/cepacol.ca/127.0.0.1#5335\nipset=/cepacol.ca/gfwlist\nserver=/beatsdresalestore.com/127.0.0.1#5335\nipset=/beatsdresalestore.com/gfwlist\nserver=/beatsdremonster-uk.com/127.0.0.1#5335\nipset=/beatsdremonster-uk.com/gfwlist\nserver=/beatsdredreheadphones.com/127.0.0.1#5335\nipset=/beatsdredreheadphones.com/gfwlist\nserver=/cnpmjs.org/127.0.0.1#5335\nipset=/cnpmjs.org/gfwlist\nserver=/ipfs.runfission.com/127.0.0.1#5335\nipset=/ipfs.runfission.com/gfwlist\nserver=/visa.co.th/127.0.0.1#5335\nipset=/visa.co.th/gfwlist\nserver=/beatsdrecheap.com/127.0.0.1#5335\nipset=/beatsdrecheap.com/gfwlist\nserver=/82mvmv.com/127.0.0.1#5335\nipset=/82mvmv.com/gfwlist\nserver=/wwwhuluplus.com/127.0.0.1#5335\nipset=/wwwhuluplus.com/gfwlist\nserver=/beatsdrdreneon.com/127.0.0.1#5335\nipset=/beatsdrdreneon.com/gfwlist\nserver=/18yiren.tv/127.0.0.1#5335\nipset=/18yiren.tv/gfwlist\nserver=/amazonfctours.com/127.0.0.1#5335\nipset=/amazonfctours.com/gfwlist\nserver=/ss2.us/127.0.0.1#5335\nipset=/ss2.us/gfwlist\nserver=/hentairead.vip/127.0.0.1#5335\nipset=/hentairead.vip/gfwlist\nserver=/eater.com/127.0.0.1#5335\nipset=/eater.com/gfwlist\nserver=/bmw.com.bo/127.0.0.1#5335\nipset=/bmw.com.bo/gfwlist\nserver=/bridgestonecntc.com/127.0.0.1#5335\nipset=/bridgestonecntc.com/gfwlist\nserver=/beatsdrdre-it.com/127.0.0.1#5335\nipset=/beatsdrdre-it.com/gfwlist\nserver=/freehqtube.com/127.0.0.1#5335\nipset=/freehqtube.com/gfwlist\nserver=/microsoftedge.com/127.0.0.1#5335\nipset=/microsoftedge.com/gfwlist\nserver=/mini-kuwait.com/127.0.0.1#5335\nipset=/mini-kuwait.com/gfwlist\nserver=/epochtimes.cz/127.0.0.1#5335\nipset=/epochtimes.cz/gfwlist\nserver=/calvappd.me/127.0.0.1#5335\nipset=/calvappd.me/gfwlist\nserver=/fundpaypal.com/127.0.0.1#5335\nipset=/fundpaypal.com/gfwlist\nserver=/openstreetmap.org/127.0.0.1#5335\nipset=/openstreetmap.org/gfwlist\nserver=/smokinmovies.com/127.0.0.1#5335\nipset=/smokinmovies.com/gfwlist\nserver=/feceboock.com/127.0.0.1#5335\nipset=/feceboock.com/gfwlist\nserver=/futhead.com/127.0.0.1#5335\nipset=/futhead.com/gfwlist\nserver=/pornwatchers.com/127.0.0.1#5335\nipset=/pornwatchers.com/gfwlist\nserver=/jav168.cc/127.0.0.1#5335\nipset=/jav168.cc/gfwlist\nserver=/scholar.google.be/127.0.0.1#5335\nipset=/scholar.google.be/gfwlist\nserver=/directvlebanontn.com/127.0.0.1#5335\nipset=/directvlebanontn.com/gfwlist\nserver=/battlefield3.com/127.0.0.1#5335\nipset=/battlefield3.com/gfwlist\nserver=/beatsbydrew.com/127.0.0.1#5335\nipset=/beatsbydrew.com/gfwlist\nserver=/earlyob.com/127.0.0.1#5335\nipset=/earlyob.com/gfwlist\nserver=/beatsbydrevipde.com/127.0.0.1#5335\nipset=/beatsbydrevipde.com/gfwlist\nserver=/69xporn.com/127.0.0.1#5335\nipset=/69xporn.com/gfwlist\nserver=/bstatic.com/127.0.0.1#5335\nipset=/bstatic.com/gfwlist\nserver=/taboola.com/127.0.0.1#5335\nipset=/taboola.com/gfwlist\nserver=/google.lk/127.0.0.1#5335\nipset=/google.lk/gfwlist\nserver=/beatsbydresingaporesale.com/127.0.0.1#5335\nipset=/beatsbydresingaporesale.com/gfwlist\nserver=/littlesexdolls.com/127.0.0.1#5335\nipset=/littlesexdolls.com/gfwlist\nserver=/hponlineprinting.com/127.0.0.1#5335\nipset=/hponlineprinting.com/gfwlist\nserver=/pokemonplatinum.com/127.0.0.1#5335\nipset=/pokemonplatinum.com/gfwlist\nserver=/steamuserimages-a.akamaihd.net/127.0.0.1#5335\nipset=/steamuserimages-a.akamaihd.net/gfwlist\nserver=/bmw-bahrain.com/127.0.0.1#5335\nipset=/bmw-bahrain.com/gfwlist\nserver=/beatsbydreshop-uk.com/127.0.0.1#5335\nipset=/beatsbydreshop-uk.com/gfwlist\nserver=/nikeby.com/127.0.0.1#5335\nipset=/nikeby.com/gfwlist\nserver=/linkedin.sc.omtrdc.net/127.0.0.1#5335\nipset=/linkedin.sc.omtrdc.net/gfwlist\nserver=/myfoxhurricane.com/127.0.0.1#5335\nipset=/myfoxhurricane.com/gfwlist\nserver=/facebooklivestaging.net/127.0.0.1#5335\nipset=/facebooklivestaging.net/gfwlist\nserver=/beatsbydrerealstore.com/127.0.0.1#5335\nipset=/beatsbydrerealstore.com/gfwlist\nserver=/xxxbit.com/127.0.0.1#5335\nipset=/xxxbit.com/gfwlist\nserver=/privilege.hk/127.0.0.1#5335\nipset=/privilege.hk/gfwlist\nserver=/mastercard.it/127.0.0.1#5335\nipset=/mastercard.it/gfwlist\nserver=/beatsbydreonlinesale-nz.com/127.0.0.1#5335\nipset=/beatsbydreonlinesale-nz.com/gfwlist\nserver=/mozilla.community/127.0.0.1#5335\nipset=/mozilla.community/gfwlist\nserver=/kismia.com/127.0.0.1#5335\nipset=/kismia.com/gfwlist\nserver=/pxt.io/127.0.0.1#5335\nipset=/pxt.io/gfwlist\nserver=/testonfox.com/127.0.0.1#5335\nipset=/testonfox.com/gfwlist\nserver=/pussyboy.net/127.0.0.1#5335\nipset=/pussyboy.net/gfwlist\nserver=/enfasmart.com/127.0.0.1#5335\nipset=/enfasmart.com/gfwlist\nserver=/taste.com.au/127.0.0.1#5335\nipset=/taste.com.au/gfwlist\nserver=/porndiscounts.com/127.0.0.1#5335\nipset=/porndiscounts.com/gfwlist\nserver=/beatsbydrenorge1.net/127.0.0.1#5335\nipset=/beatsbydrenorge1.net/gfwlist\nserver=/beatsbydrenls.com/127.0.0.1#5335\nipset=/beatsbydrenls.com/gfwlist\nserver=/nikezoom.com/127.0.0.1#5335\nipset=/nikezoom.com/gfwlist\nserver=/lilhumpers.com/127.0.0.1#5335\nipset=/lilhumpers.com/gfwlist\nserver=/crypton.co.jp/127.0.0.1#5335\nipset=/crypton.co.jp/gfwlist\nserver=/blzddistkr1-a.akamaihd.net/127.0.0.1#5335\nipset=/blzddistkr1-a.akamaihd.net/gfwlist\nserver=/beatsbydreirelandsonline.com/127.0.0.1#5335\nipset=/beatsbydreirelandsonline.com/gfwlist\nserver=/ign.jp/127.0.0.1#5335\nipset=/ign.jp/gfwlist\nserver=/beatsbydreirelandsale.com/127.0.0.1#5335\nipset=/beatsbydreirelandsale.com/gfwlist\nserver=/emcs.org/127.0.0.1#5335\nipset=/emcs.org/gfwlist\nserver=/paypal-learning.com/127.0.0.1#5335\nipset=/paypal-learning.com/gfwlist\nserver=/beatsbydrehut.com/127.0.0.1#5335\nipset=/beatsbydrehut.com/gfwlist\nserver=/daylenerio.com/127.0.0.1#5335\nipset=/daylenerio.com/gfwlist\nserver=/stackmod.blog/127.0.0.1#5335\nipset=/stackmod.blog/gfwlist\nserver=/sextime.tv/127.0.0.1#5335\nipset=/sextime.tv/gfwlist\nserver=/yeyuehuachao12.com/127.0.0.1#5335\nipset=/yeyuehuachao12.com/gfwlist\nserver=/libsolutions.app/127.0.0.1#5335\nipset=/libsolutions.app/gfwlist\nserver=/beatsbydredr.com/127.0.0.1#5335\nipset=/beatsbydredr.com/gfwlist\nserver=/f95zone.to/127.0.0.1#5335\nipset=/f95zone.to/gfwlist\nserver=/imagetwist.com/127.0.0.1#5335\nipset=/imagetwist.com/gfwlist\nserver=/youtube.com.mt/127.0.0.1#5335\nipset=/youtube.com.mt/gfwlist\nserver=/beatsjoy.com/127.0.0.1#5335\nipset=/beatsjoy.com/gfwlist\nserver=/dropboxapi.com/127.0.0.1#5335\nipset=/dropboxapi.com/gfwlist\nserver=/blogspot.ba/127.0.0.1#5335\nipset=/blogspot.ba/gfwlist\nserver=/beatsbydredealsblackfriday.com/127.0.0.1#5335\nipset=/beatsbydredealsblackfriday.com/gfwlist\nserver=/playporngame.com/127.0.0.1#5335\nipset=/playporngame.com/gfwlist\nserver=/oxfordbibliographies.com/127.0.0.1#5335\nipset=/oxfordbibliographies.com/gfwlist\nserver=/akamak.com/127.0.0.1#5335\nipset=/akamak.com/gfwlist\nserver=/buhidoh.net/127.0.0.1#5335\nipset=/buhidoh.net/gfwlist\nserver=/spotify.map.fastly.net/127.0.0.1#5335\nipset=/spotify.map.fastly.net/gfwlist\nserver=/braintreegateway.tv/127.0.0.1#5335\nipset=/braintreegateway.tv/gfwlist\nserver=/fadebook.com/127.0.0.1#5335\nipset=/fadebook.com/gfwlist\nserver=/bmw-routes.com/127.0.0.1#5335\nipset=/bmw-routes.com/gfwlist\nserver=/beatsbydreblackfriday2013.com/127.0.0.1#5335\nipset=/beatsbydreblackfriday2013.com/gfwlist\nserver=/hnntube.com/127.0.0.1#5335\nipset=/hnntube.com/gfwlist\nserver=/boypost.com/127.0.0.1#5335\nipset=/boypost.com/gfwlist\nserver=/beatsbydre4usales.com/127.0.0.1#5335\nipset=/beatsbydre4usales.com/gfwlist\nserver=/beatsbydre411.com/127.0.0.1#5335\nipset=/beatsbydre411.com/gfwlist\nserver=/rsc.org/127.0.0.1#5335\nipset=/rsc.org/gfwlist\nserver=/mrchewsasianbeaver.com/127.0.0.1#5335\nipset=/mrchewsasianbeaver.com/gfwlist\nserver=/verisign.org/127.0.0.1#5335\nipset=/verisign.org/gfwlist\nserver=/huluplus.com/127.0.0.1#5335\nipset=/huluplus.com/gfwlist\nserver=/beatsbydre-mall.com/127.0.0.1#5335\nipset=/beatsbydre-mall.com/gfwlist\nserver=/nextplus.com.hk/127.0.0.1#5335\nipset=/nextplus.com.hk/gfwlist\nserver=/joinclubhouse.com/127.0.0.1#5335\nipset=/joinclubhouse.com/gfwlist\nserver=/88square.com/127.0.0.1#5335\nipset=/88square.com/gfwlist\nserver=/69gayporno.com/127.0.0.1#5335\nipset=/69gayporno.com/gfwlist\nserver=/beatsbydre-beatsheadphone.com/127.0.0.1#5335\nipset=/beatsbydre-beatsheadphone.com/gfwlist\nserver=/avh.world/127.0.0.1#5335\nipset=/avh.world/gfwlist\nserver=/bdn.dev/127.0.0.1#5335\nipset=/bdn.dev/gfwlist\nserver=/alphaporno.com/127.0.0.1#5335\nipset=/alphaporno.com/gfwlist\nserver=/mastercard.nl/127.0.0.1#5335\nipset=/mastercard.nl/gfwlist\nserver=/miniitalianjob.com/127.0.0.1#5335\nipset=/miniitalianjob.com/gfwlist\nserver=/cuckoldfuck.com/127.0.0.1#5335\nipset=/cuckoldfuck.com/gfwlist\nserver=/volvobuses.com.kw/127.0.0.1#5335\nipset=/volvobuses.com.kw/gfwlist\nserver=/favjapaneseporn.com/127.0.0.1#5335\nipset=/favjapaneseporn.com/gfwlist\nserver=/cbsivideo.com/127.0.0.1#5335\nipset=/cbsivideo.com/gfwlist\nserver=/businessweek.com/127.0.0.1#5335\nipset=/businessweek.com/gfwlist\nserver=/beatsbydrdre-store.com/127.0.0.1#5335\nipset=/beatsbydrdre-store.com/gfwlist\nserver=/forgecdn.net/127.0.0.1#5335\nipset=/forgecdn.net/gfwlist\nserver=/beatsbydrdre-online.com/127.0.0.1#5335\nipset=/beatsbydrdre-online.com/gfwlist\nserver=/graph.org/127.0.0.1#5335\nipset=/graph.org/gfwlist\nserver=/ikea.ua/127.0.0.1#5335\nipset=/ikea.ua/gfwlist\nserver=/pokemonmysterydungeon.com/127.0.0.1#5335\nipset=/pokemonmysterydungeon.com/gfwlist\nserver=/volvobuses.co.uk/127.0.0.1#5335\nipset=/volvobuses.co.uk/gfwlist\nserver=/aga-expo.com/127.0.0.1#5335\nipset=/aga-expo.com/gfwlist\nserver=/beatsaudiobydre.com/127.0.0.1#5335\nipset=/beatsaudiobydre.com/gfwlist\nserver=/jfrog.org/127.0.0.1#5335\nipset=/jfrog.org/gfwlist\nserver=/beatsaudifonos.com/127.0.0.1#5335\nipset=/beatsaudifonos.com/gfwlist\nserver=/sexysexdoll.com/127.0.0.1#5335\nipset=/sexysexdoll.com/gfwlist\nserver=/fetishfishcams.com/127.0.0.1#5335\nipset=/fetishfishcams.com/gfwlist\nserver=/marioandluigidreamteam.com/127.0.0.1#5335\nipset=/marioandluigidreamteam.com/gfwlist\nserver=/xn--hxtr4rozx.xn--czr694b/127.0.0.1#5335\nipset=/xn--hxtr4rozx.xn--czr694b/gfwlist\nserver=/beats4.net/127.0.0.1#5335\nipset=/beats4.net/gfwlist\nserver=/igsonar.com/127.0.0.1#5335\nipset=/igsonar.com/gfwlist\nserver=/beats123.com/127.0.0.1#5335\nipset=/beats123.com/gfwlist\nserver=/javfilms.com/127.0.0.1#5335\nipset=/javfilms.com/gfwlist\nserver=/beats1.cc/127.0.0.1#5335\nipset=/beats1.cc/gfwlist\nserver=/nineentertainmentco.com.au/127.0.0.1#5335\nipset=/nineentertainmentco.com.au/gfwlist\nserver=/visa.mq/127.0.0.1#5335\nipset=/visa.mq/gfwlist\nserver=/bmwmperformance.com/127.0.0.1#5335\nipset=/bmwmperformance.com/gfwlist\nserver=/lordofultima.com/127.0.0.1#5335\nipset=/lordofultima.com/gfwlist\nserver=/cloudflare.tv/127.0.0.1#5335\nipset=/cloudflare.tv/gfwlist\nserver=/mini.bg/127.0.0.1#5335\nipset=/mini.bg/gfwlist\nserver=/hugedildo.com/127.0.0.1#5335\nipset=/hugedildo.com/gfwlist\nserver=/connectionsacademy.com/127.0.0.1#5335\nipset=/connectionsacademy.com/gfwlist\nserver=/citasecuador.com/127.0.0.1#5335\nipset=/citasecuador.com/gfwlist\nserver=/cartoonpornvideos.com/127.0.0.1#5335\nipset=/cartoonpornvideos.com/gfwlist\nserver=/mini-abudhabi.com/127.0.0.1#5335\nipset=/mini-abudhabi.com/gfwlist\nserver=/beats-bydreoutletssale.net/127.0.0.1#5335\nipset=/beats-bydreoutletssale.net/gfwlist\nserver=/hibdontire.com/127.0.0.1#5335\nipset=/hibdontire.com/gfwlist\nserver=/beats-bydreoutletsale.com/127.0.0.1#5335\nipset=/beats-bydreoutletsale.com/gfwlist\nserver=/minimontroyal.com/127.0.0.1#5335\nipset=/minimontroyal.com/gfwlist\nserver=/8111y.top/127.0.0.1#5335\nipset=/8111y.top/gfwlist\nserver=/nikeshoxsale.com/127.0.0.1#5335\nipset=/nikeshoxsale.com/gfwlist\nserver=/beats-bydrdre.net/127.0.0.1#5335\nipset=/beats-bydrdre.net/gfwlist\nserver=/beats-by-dre-australia.com/127.0.0.1#5335\nipset=/beats-by-dre-australia.com/gfwlist\nserver=/volvotrucks.dk/127.0.0.1#5335\nipset=/volvotrucks.dk/gfwlist\nserver=/9zipai.net/127.0.0.1#5335\nipset=/9zipai.net/gfwlist\nserver=/volvotrucks.fi/127.0.0.1#5335\nipset=/volvotrucks.fi/gfwlist\nserver=/mini.ro/127.0.0.1#5335\nipset=/mini.ro/gfwlist\nserver=/porn7.xxx/127.0.0.1#5335\nipset=/porn7.xxx/gfwlist\nserver=/beatmonstersaustralia.net/127.0.0.1#5335\nipset=/beatmonstersaustralia.net/gfwlist\nserver=/lxxlxx.com/127.0.0.1#5335\nipset=/lxxlxx.com/gfwlist\nserver=/beatbydremonster.com/127.0.0.1#5335\nipset=/beatbydremonster.com/gfwlist\nserver=/beatbydre2013.com/127.0.0.1#5335\nipset=/beatbydre2013.com/gfwlist\nserver=/getws1.com/127.0.0.1#5335\nipset=/getws1.com/gfwlist\nserver=/baxsound.com/127.0.0.1#5335\nipset=/baxsound.com/gfwlist\nserver=/auricularesbeatsmarkt.com/127.0.0.1#5335\nipset=/auricularesbeatsmarkt.com/gfwlist\nserver=/nudegfporn.com/127.0.0.1#5335\nipset=/nudegfporn.com/gfwlist\nserver=/epochbuy.com/127.0.0.1#5335\nipset=/epochbuy.com/gfwlist\nserver=/faceboock.com/127.0.0.1#5335\nipset=/faceboock.com/gfwlist\nserver=/anandtech.com/127.0.0.1#5335\nipset=/anandtech.com/gfwlist\nserver=/audiobeatsbydre.com/127.0.0.1#5335\nipset=/audiobeatsbydre.com/gfwlist\nserver=/app-store.wang/127.0.0.1#5335\nipset=/app-store.wang/gfwlist\nserver=/historyofdota.net/127.0.0.1#5335\nipset=/historyofdota.net/gfwlist\nserver=/foxrelease.com/127.0.0.1#5335\nipset=/foxrelease.com/gfwlist\nserver=/stepdaughter.love/127.0.0.1#5335\nipset=/stepdaughter.love/gfwlist\nserver=/alphera-finance.co.in/127.0.0.1#5335\nipset=/alphera-finance.co.in/gfwlist\nserver=/farfetch-contents.com/127.0.0.1#5335\nipset=/farfetch-contents.com/gfwlist\nserver=/gay1069sex.com/127.0.0.1#5335\nipset=/gay1069sex.com/gfwlist\nserver=/aws-iot-hackathon.com/127.0.0.1#5335\nipset=/aws-iot-hackathon.com/gfwlist\nserver=/volvo-truck.nl/127.0.0.1#5335\nipset=/volvo-truck.nl/gfwlist\nserver=/aanaan.com/127.0.0.1#5335\nipset=/aanaan.com/gfwlist\nserver=/pearsonassessment.no/127.0.0.1#5335\nipset=/pearsonassessment.no/gfwlist\nserver=/adobelogin.com/127.0.0.1#5335\nipset=/adobelogin.com/gfwlist\nserver=/bridgestone-brand.com/127.0.0.1#5335\nipset=/bridgestone-brand.com/gfwlist\nserver=/bmw-motorrad.com.do/127.0.0.1#5335\nipset=/bmw-motorrad.com.do/gfwlist\nserver=/2drdrebeats.com/127.0.0.1#5335\nipset=/2drdrebeats.com/gfwlist\nserver=/ultrayoungsex.com/127.0.0.1#5335\nipset=/ultrayoungsex.com/gfwlist\nserver=/allpasswords.com/127.0.0.1#5335\nipset=/allpasswords.com/gfwlist\nserver=/xn--4vq477m.com/127.0.0.1#5335\nipset=/xn--4vq477m.com/gfwlist\nserver=/metcams.com/127.0.0.1#5335\nipset=/metcams.com/gfwlist\nserver=/caribbeancom.com/127.0.0.1#5335\nipset=/caribbeancom.com/gfwlist\nserver=/voaswahili.com/127.0.0.1#5335\nipset=/voaswahili.com/gfwlist\nserver=/fanqianglu.com/127.0.0.1#5335\nipset=/fanqianglu.com/gfwlist\nserver=/pearsonplaces.com.au/127.0.0.1#5335\nipset=/pearsonplaces.com.au/gfwlist\nserver=/starwarsfallenorder.com/127.0.0.1#5335\nipset=/starwarsfallenorder.com/gfwlist\nserver=/womenwill.mx/127.0.0.1#5335\nipset=/womenwill.mx/gfwlist\nserver=/bizographics.com/127.0.0.1#5335\nipset=/bizographics.com/gfwlist\nserver=/certum.pl/127.0.0.1#5335\nipset=/certum.pl/gfwlist\nserver=/disneyplus.com/127.0.0.1#5335\nipset=/disneyplus.com/gfwlist\nserver=/bluffyporn.com/127.0.0.1#5335\nipset=/bluffyporn.com/gfwlist\nserver=/terrlficdates.com/127.0.0.1#5335\nipset=/terrlficdates.com/gfwlist\nserver=/gameon-masters.com/127.0.0.1#5335\nipset=/gameon-masters.com/gfwlist\nserver=/associates-amazon.com/127.0.0.1#5335\nipset=/associates-amazon.com/gfwlist\nserver=/3xplanet.com/127.0.0.1#5335\nipset=/3xplanet.com/gfwlist\nserver=/amzn.com/127.0.0.1#5335\nipset=/amzn.com/gfwlist\nserver=/sex021.net/127.0.0.1#5335\nipset=/sex021.net/gfwlist\nserver=/ulrichsweb.serialssolutions.com/127.0.0.1#5335\nipset=/ulrichsweb.serialssolutions.com/gfwlist\nserver=/espn.api.edge.bamgrid.com/127.0.0.1#5335\nipset=/espn.api.edge.bamgrid.com/gfwlist\nserver=/halfcanada.com/127.0.0.1#5335\nipset=/halfcanada.com/gfwlist\nserver=/ebayboutique.com/127.0.0.1#5335\nipset=/ebayboutique.com/gfwlist\nserver=/amazonpay.com/127.0.0.1#5335\nipset=/amazonpay.com/gfwlist\nserver=/battlefield4.com/127.0.0.1#5335\nipset=/battlefield4.com/gfwlist\nserver=/opencreate.org/127.0.0.1#5335\nipset=/opencreate.org/gfwlist\nserver=/hentaivvz.com/127.0.0.1#5335\nipset=/hentaivvz.com/gfwlist\nserver=/paypal-community.net/127.0.0.1#5335\nipset=/paypal-community.net/gfwlist\nserver=/gvt5.com/127.0.0.1#5335\nipset=/gvt5.com/gfwlist\nserver=/amazonimages.com/127.0.0.1#5335\nipset=/amazonimages.com/gfwlist\nserver=/ipfs-gateway.cloud/127.0.0.1#5335\nipset=/ipfs-gateway.cloud/gfwlist\nserver=/iwork.com/127.0.0.1#5335\nipset=/iwork.com/gfwlist\nserver=/amazonbusiness.org/127.0.0.1#5335\nipset=/amazonbusiness.org/gfwlist\nserver=/hentai-img.com/127.0.0.1#5335\nipset=/hentai-img.com/gfwlist\nserver=/gendai.net/127.0.0.1#5335\nipset=/gendai.net/gfwlist\nserver=/eubluecardvisa.com/127.0.0.1#5335\nipset=/eubluecardvisa.com/gfwlist\nserver=/pornproxy.app/127.0.0.1#5335\nipset=/pornproxy.app/gfwlist\nserver=/researchgate.net/127.0.0.1#5335\nipset=/researchgate.net/gfwlist\nserver=/bestbuyethics.com/127.0.0.1#5335\nipset=/bestbuyethics.com/gfwlist\nserver=/amazon.com.au/127.0.0.1#5335\nipset=/amazon.com.au/gfwlist\nserver=/imageworks.com/127.0.0.1#5335\nipset=/imageworks.com/gfwlist\nserver=/youtube.co.il/127.0.0.1#5335\nipset=/youtube.co.il/gfwlist\nserver=/sony.sk/127.0.0.1#5335\nipset=/sony.sk/gfwlist\nserver=/aboutamazon.in/127.0.0.1#5335\nipset=/aboutamazon.in/gfwlist\nserver=/aboutamazon.de/127.0.0.1#5335\nipset=/aboutamazon.de/gfwlist\nserver=/rthk.hk/127.0.0.1#5335\nipset=/rthk.hk/gfwlist\nserver=/aboutamazon.com.au/127.0.0.1#5335\nipset=/aboutamazon.com.au/gfwlist\nserver=/bloombergenvironment.com/127.0.0.1#5335\nipset=/bloombergenvironment.com/gfwlist\nserver=/wfm.com/127.0.0.1#5335\nipset=/wfm.com/gfwlist\nserver=/heydoga.com/127.0.0.1#5335\nipset=/heydoga.com/gfwlist\nserver=/pearson.com.uy/127.0.0.1#5335\nipset=/pearson.com.uy/gfwlist\nserver=/demfhz.xyz/127.0.0.1#5335\nipset=/demfhz.xyz/gfwlist\nserver=/bridgestonecomercial.cl/127.0.0.1#5335\nipset=/bridgestonecomercial.cl/gfwlist\nserver=/libsolutions.domains/127.0.0.1#5335\nipset=/libsolutions.domains/gfwlist\nserver=/zohomeetups.com/127.0.0.1#5335\nipset=/zohomeetups.com/gfwlist\nserver=/mastercard.com.vn/127.0.0.1#5335\nipset=/mastercard.com.vn/gfwlist\nserver=/kindle.co.uk/127.0.0.1#5335\nipset=/kindle.co.uk/gfwlist\nserver=/containersonaws.com/127.0.0.1#5335\nipset=/containersonaws.com/gfwlist\nserver=/cloudfront.net/127.0.0.1#5335\nipset=/cloudfront.net/gfwlist\nserver=/gaypornlinks.com/127.0.0.1#5335\nipset=/gaypornlinks.com/gfwlist\nserver=/monsterbeatspascher.net/127.0.0.1#5335\nipset=/monsterbeatspascher.net/gfwlist\nserver=/hulu.playback.edge.bamgrid.com/127.0.0.1#5335\nipset=/hulu.playback.edge.bamgrid.com/gfwlist\nserver=/bcbits.com/127.0.0.1#5335\nipset=/bcbits.com/gfwlist\nserver=/appl.com/127.0.0.1#5335\nipset=/appl.com/gfwlist\nserver=/awseducate.com/127.0.0.1#5335\nipset=/awseducate.com/gfwlist\nserver=/durex.jp/127.0.0.1#5335\nipset=/durex.jp/gfwlist\nserver=/kinkbook.com/127.0.0.1#5335\nipset=/kinkbook.com/gfwlist\nserver=/origin-a.akamaihd.net/127.0.0.1#5335\nipset=/origin-a.akamaihd.net/gfwlist\nserver=/alfera.in/127.0.0.1#5335\nipset=/alfera.in/gfwlist\nserver=/mhradio.org/127.0.0.1#5335\nipset=/mhradio.org/gfwlist\nserver=/gmail.com/127.0.0.1#5335\nipset=/gmail.com/gfwlist\nserver=/minidowntown.ca/127.0.0.1#5335\nipset=/minidowntown.ca/gfwlist\nserver=/ikea.de/127.0.0.1#5335\nipset=/ikea.de/gfwlist\nserver=/uun92.com/127.0.0.1#5335\nipset=/uun92.com/gfwlist\nserver=/visa.com.ua/127.0.0.1#5335\nipset=/visa.com.ua/gfwlist\nserver=/ebayclassifieds.org/127.0.0.1#5335\nipset=/ebayclassifieds.org/gfwlist\nserver=/product.co.jp/127.0.0.1#5335\nipset=/product.co.jp/gfwlist\nserver=/amazonses.com/127.0.0.1#5335\nipset=/amazonses.com/gfwlist\nserver=/cheapbeatsdrestudios.com/127.0.0.1#5335\nipset=/cheapbeatsdrestudios.com/gfwlist\nserver=/amazonaws.tv/127.0.0.1#5335\nipset=/amazonaws.tv/gfwlist\nserver=/6japaneseporn.com/127.0.0.1#5335\nipset=/6japaneseporn.com/gfwlist\nserver=/amazonaws-china.com/127.0.0.1#5335\nipset=/amazonaws-china.com/gfwlist\nserver=/digital-rb.com/127.0.0.1#5335\nipset=/digital-rb.com/gfwlist\nserver=/hopstop.tv/127.0.0.1#5335\nipset=/hopstop.tv/gfwlist\nserver=/ymail.com/127.0.0.1#5335\nipset=/ymail.com/gfwlist\nserver=/69flv.com/127.0.0.1#5335\nipset=/69flv.com/gfwlist\nserver=/bootstrapcdn.com/127.0.0.1#5335\nipset=/bootstrapcdn.com/gfwlist\nserver=/mastercard.ro/127.0.0.1#5335\nipset=/mastercard.ro/gfwlist\nserver=/alibabacloud.com.sg/127.0.0.1#5335\nipset=/alibabacloud.com.sg/gfwlist\nserver=/nintendoswitch.com/127.0.0.1#5335\nipset=/nintendoswitch.com/gfwlist\nserver=/b-ok.asia/127.0.0.1#5335\nipset=/b-ok.asia/gfwlist\nserver=/medrxiv.org/127.0.0.1#5335\nipset=/medrxiv.org/gfwlist\nserver=/fetlife.com/127.0.0.1#5335\nipset=/fetlife.com/gfwlist\nserver=/fzdshare.net/127.0.0.1#5335\nipset=/fzdshare.net/gfwlist\nserver=/omscr.com/127.0.0.1#5335\nipset=/omscr.com/gfwlist\nserver=/pearsonclinical.com.au/127.0.0.1#5335\nipset=/pearsonclinical.com.au/gfwlist\nserver=/alibabacloud.co.in/127.0.0.1#5335\nipset=/alibabacloud.co.in/gfwlist\nserver=/hptechventures.com/127.0.0.1#5335\nipset=/hptechventures.com/gfwlist\nserver=/sonyclassics.com/127.0.0.1#5335\nipset=/sonyclassics.com/gfwlist\nserver=/rexcha.com/127.0.0.1#5335\nipset=/rexcha.com/gfwlist\nserver=/redditstatic.com/127.0.0.1#5335\nipset=/redditstatic.com/gfwlist\nserver=/amateurwifevideos.com/127.0.0.1#5335\nipset=/amateurwifevideos.com/gfwlist\nserver=/nikefootballgloves.com/127.0.0.1#5335\nipset=/nikefootballgloves.com/gfwlist\nserver=/rimg.com.tw/127.0.0.1#5335\nipset=/rimg.com.tw/gfwlist\nserver=/orbitera.com/127.0.0.1#5335\nipset=/orbitera.com/gfwlist\nserver=/sex-ly.com/127.0.0.1#5335\nipset=/sex-ly.com/gfwlist\nserver=/youtube.com.ar/127.0.0.1#5335\nipset=/youtube.com.ar/gfwlist\nserver=/juggsjoy.com/127.0.0.1#5335\nipset=/juggsjoy.com/gfwlist\nserver=/ntd.tv/127.0.0.1#5335\nipset=/ntd.tv/gfwlist\nserver=/motolia.com/127.0.0.1#5335\nipset=/motolia.com/gfwlist\nserver=/wife-home-videos.com/127.0.0.1#5335\nipset=/wife-home-videos.com/gfwlist\nserver=/netname.com.br/127.0.0.1#5335\nipset=/netname.com.br/gfwlist\nserver=/fptolia.com/127.0.0.1#5335\nipset=/fptolia.com/gfwlist\nserver=/deviantclip.com/127.0.0.1#5335\nipset=/deviantclip.com/gfwlist\nserver=/fotolia-noticias.com/127.0.0.1#5335\nipset=/fotolia-noticias.com/gfwlist\nserver=/worldflipper.akamaized.net/127.0.0.1#5335\nipset=/worldflipper.akamaized.net/gfwlist\nserver=/fonolia.com/127.0.0.1#5335\nipset=/fonolia.com/gfwlist\nserver=/disneymeetingsandevents.com/127.0.0.1#5335\nipset=/disneymeetingsandevents.com/gfwlist\nserver=/bridgestone-business-service.jp/127.0.0.1#5335\nipset=/bridgestone-business-service.jp/gfwlist\nserver=/huffingtonpost.co.za/127.0.0.1#5335\nipset=/huffingtonpost.co.za/gfwlist\nserver=/foftolia.com/127.0.0.1#5335\nipset=/foftolia.com/gfwlist\nserver=/fiotolia.com/127.0.0.1#5335\nipset=/fiotolia.com/gfwlist\nserver=/visa.com.bz/127.0.0.1#5335\nipset=/visa.com.bz/gfwlist\nserver=/webex.co.nz/127.0.0.1#5335\nipset=/webex.co.nz/gfwlist\nserver=/nexttv.com.tw/127.0.0.1#5335\nipset=/nexttv.com.tw/gfwlist\nserver=/adobeccstatic.com/127.0.0.1#5335\nipset=/adobeccstatic.com/gfwlist\nserver=/worldsecureemail.com/127.0.0.1#5335\nipset=/worldsecureemail.com/gfwlist\nserver=/ettoday.net/127.0.0.1#5335\nipset=/ettoday.net/gfwlist\nserver=/dirtyhomefuck.com/127.0.0.1#5335\nipset=/dirtyhomefuck.com/gfwlist\nserver=/battlefrontii.com/127.0.0.1#5335\nipset=/battlefrontii.com/gfwlist\nserver=/imagineecommerce.com/127.0.0.1#5335\nipset=/imagineecommerce.com/gfwlist\nserver=/wiz-s.jp/127.0.0.1#5335\nipset=/wiz-s.jp/gfwlist\nserver=/zee.com/127.0.0.1#5335\nipset=/zee.com/gfwlist\nserver=/fuckingthreesome.com/127.0.0.1#5335\nipset=/fuckingthreesome.com/gfwlist\nserver=/tx.me/127.0.0.1#5335\nipset=/tx.me/gfwlist\nserver=/kidgrid.tv/127.0.0.1#5335\nipset=/kidgrid.tv/gfwlist\nserver=/porno-erotica.com/127.0.0.1#5335\nipset=/porno-erotica.com/gfwlist\nserver=/flyingjizz.com/127.0.0.1#5335\nipset=/flyingjizz.com/gfwlist\nserver=/pornobrasileiro.xyz/127.0.0.1#5335\nipset=/pornobrasileiro.xyz/gfwlist\nserver=/microsoft.md/127.0.0.1#5335\nipset=/microsoft.md/gfwlist\nserver=/bestfreecams.club/127.0.0.1#5335\nipset=/bestfreecams.club/gfwlist\nserver=/9nation.com.au/127.0.0.1#5335\nipset=/9nation.com.au/gfwlist\nserver=/watersex.com/127.0.0.1#5335\nipset=/watersex.com/gfwlist\nserver=/mailonline.co.uk/127.0.0.1#5335\nipset=/mailonline.co.uk/gfwlist\nserver=/adobetechcomm.com/127.0.0.1#5335\nipset=/adobetechcomm.com/gfwlist\nserver=/adobestock.com/127.0.0.1#5335\nipset=/adobestock.com/gfwlist\nserver=/jinnaju.com/127.0.0.1#5335\nipset=/jinnaju.com/gfwlist\nserver=/sci-hub.it.nf/127.0.0.1#5335\nipset=/sci-hub.it.nf/gfwlist\nserver=/bmw-motorrad.tw/127.0.0.1#5335\nipset=/bmw-motorrad.tw/gfwlist\nserver=/albeats.com/127.0.0.1#5335\nipset=/albeats.com/gfwlist\nserver=/gaypornonly.com/127.0.0.1#5335\nipset=/gaypornonly.com/gfwlist\nserver=/adobelanding.com/127.0.0.1#5335\nipset=/adobelanding.com/gfwlist\nserver=/adobejanus.com/127.0.0.1#5335\nipset=/adobejanus.com/gfwlist\nserver=/adultvideodump.com/127.0.0.1#5335\nipset=/adultvideodump.com/gfwlist\nserver=/google.co.zm/127.0.0.1#5335\nipset=/google.co.zm/gfwlist\nserver=/visa.com.ai/127.0.0.1#5335\nipset=/visa.com.ai/gfwlist\nserver=/nytimes.com/127.0.0.1#5335\nipset=/nytimes.com/gfwlist\nserver=/mastercard.com.bz/127.0.0.1#5335\nipset=/mastercard.com.bz/gfwlist\nserver=/adobedemo.com/127.0.0.1#5335\nipset=/adobedemo.com/gfwlist\nserver=/facebopk.com/127.0.0.1#5335\nipset=/facebopk.com/gfwlist\nserver=/imacapplecomputer.com/127.0.0.1#5335\nipset=/imacapplecomputer.com/gfwlist\nserver=/youtube.com/127.0.0.1#5335\nipset=/youtube.com/gfwlist\nserver=/vhxqa4.com/127.0.0.1#5335\nipset=/vhxqa4.com/gfwlist\nserver=/indianpornvideo.org/127.0.0.1#5335\nipset=/indianpornvideo.org/gfwlist\nserver=/voachinese.com/127.0.0.1#5335\nipset=/voachinese.com/gfwlist\nserver=/indianfuck2.com/127.0.0.1#5335\nipset=/indianfuck2.com/gfwlist\nserver=/manoramayearbook.in/127.0.0.1#5335\nipset=/manoramayearbook.in/gfwlist\nserver=/airtunes.com/127.0.0.1#5335\nipset=/airtunes.com/gfwlist\nserver=/adobe.ly/127.0.0.1#5335\nipset=/adobe.ly/gfwlist\nserver=/mymusclevideo.com/127.0.0.1#5335\nipset=/mymusclevideo.com/gfwlist\nserver=/targetimg1.com/127.0.0.1#5335\nipset=/targetimg1.com/gfwlist\nserver=/visa.com.pr/127.0.0.1#5335\nipset=/visa.com.pr/gfwlist\nserver=/elderscrolls.com/127.0.0.1#5335\nipset=/elderscrolls.com/gfwlist\nserver=/scholar.google.com.tr/127.0.0.1#5335\nipset=/scholar.google.com.tr/gfwlist\nserver=/uun96.com/127.0.0.1#5335\nipset=/uun96.com/gfwlist\nserver=/hbabit.com/127.0.0.1#5335\nipset=/hbabit.com/gfwlist\nserver=/adobe-audience-finder.com/127.0.0.1#5335\nipset=/adobe-audience-finder.com/gfwlist\nserver=/allpornsitespass.com/127.0.0.1#5335\nipset=/allpornsitespass.com/gfwlist\nserver=/beatsoutletonlines.com/127.0.0.1#5335\nipset=/beatsoutletonlines.com/gfwlist\nserver=/bybeatsdre.com/127.0.0.1#5335\nipset=/bybeatsdre.com/gfwlist\nserver=/qualcomm-email.com/127.0.0.1#5335\nipset=/qualcomm-email.com/gfwlist\nserver=/vod-dash-ww-live.akamaized.net/127.0.0.1#5335\nipset=/vod-dash-ww-live.akamaized.net/gfwlist\nserver=/onxxxtube.com/127.0.0.1#5335\nipset=/onxxxtube.com/gfwlist\nserver=/goldjizz.com/127.0.0.1#5335\nipset=/goldjizz.com/gfwlist\nserver=/electronicarts.com/127.0.0.1#5335\nipset=/electronicarts.com/gfwlist\nserver=/advertising.adobe.com/127.0.0.1#5335\nipset=/advertising.adobe.com/gfwlist\nserver=/acer.com/127.0.0.1#5335\nipset=/acer.com/gfwlist\nserver=/ikea.co.th/127.0.0.1#5335\nipset=/ikea.co.th/gfwlist\nserver=/zsh.org/127.0.0.1#5335\nipset=/zsh.org/gfwlist\nserver=/readmoo.com/127.0.0.1#5335\nipset=/readmoo.com/gfwlist\nserver=/unpkg.com/127.0.0.1#5335\nipset=/unpkg.com/gfwlist\nserver=/sqlite.org/127.0.0.1#5335\nipset=/sqlite.org/gfwlist\nserver=/maddenseason.org/127.0.0.1#5335\nipset=/maddenseason.org/gfwlist\nserver=/r-project.org/127.0.0.1#5335\nipset=/r-project.org/gfwlist\nserver=/betterhdporn.com/127.0.0.1#5335\nipset=/betterhdporn.com/gfwlist\nserver=/macappsto.re/127.0.0.1#5335\nipset=/macappsto.re/gfwlist\nserver=/phantomjs.org/127.0.0.1#5335\nipset=/phantomjs.org/gfwlist\nserver=/im-apps.net/127.0.0.1#5335\nipset=/im-apps.net/gfwlist\nserver=/gayfuror.com/127.0.0.1#5335\nipset=/gayfuror.com/gfwlist\nserver=/pornmonde.com/127.0.0.1#5335\nipset=/pornmonde.com/gfwlist\nserver=/openai.com/127.0.0.1#5335\nipset=/openai.com/gfwlist\nserver=/porncomixonline.net/127.0.0.1#5335\nipset=/porncomixonline.net/gfwlist\nserver=/apple.bg/127.0.0.1#5335\nipset=/apple.bg/gfwlist\nserver=/sunglassessale2014.com/127.0.0.1#5335\nipset=/sunglassessale2014.com/gfwlist\nserver=/exploitedcollegegirls.com/127.0.0.1#5335\nipset=/exploitedcollegegirls.com/gfwlist\nserver=/lua.org/127.0.0.1#5335\nipset=/lua.org/gfwlist\nserver=/visasignaturehotels.com/127.0.0.1#5335\nipset=/visasignaturehotels.com/gfwlist\nserver=/js.org/127.0.0.1#5335\nipset=/js.org/gfwlist\nserver=/mastercard.co.ve/127.0.0.1#5335\nipset=/mastercard.co.ve/gfwlist\nserver=/ebaysohos.com/127.0.0.1#5335\nipset=/ebaysohos.com/gfwlist\nserver=/nuespournous.com/127.0.0.1#5335\nipset=/nuespournous.com/gfwlist\nserver=/deepfreeze.com.br/127.0.0.1#5335\nipset=/deepfreeze.com.br/gfwlist\nserver=/pypi.io/127.0.0.1#5335\nipset=/pypi.io/gfwlist\nserver=/gnu.org/127.0.0.1#5335\nipset=/gnu.org/gfwlist\nserver=/icloudmusic.net/127.0.0.1#5335\nipset=/icloudmusic.net/gfwlist\nserver=/juicytwink.com/127.0.0.1#5335\nipset=/juicytwink.com/gfwlist\nserver=/drdremonsterdre.com/127.0.0.1#5335\nipset=/drdremonsterdre.com/gfwlist\nserver=/dditsadn.com/127.0.0.1#5335\nipset=/dditsadn.com/gfwlist\nserver=/meetandfuck.games/127.0.0.1#5335\nipset=/meetandfuck.games/gfwlist\nserver=/steamygamer.com/127.0.0.1#5335\nipset=/steamygamer.com/gfwlist\nserver=/bdsmlr.com/127.0.0.1#5335\nipset=/bdsmlr.com/gfwlist\nserver=/apache.org/127.0.0.1#5335\nipset=/apache.org/gfwlist\nserver=/mini.com.mt/127.0.0.1#5335\nipset=/mini.com.mt/gfwlist\nserver=/fox-corporation.com/127.0.0.1#5335\nipset=/fox-corporation.com/gfwlist\nserver=/webex.com.au/127.0.0.1#5335\nipset=/webex.com.au/gfwlist\nserver=/swoosh.tv/127.0.0.1#5335\nipset=/swoosh.tv/gfwlist\nserver=/bmw-motorrad.ma/127.0.0.1#5335\nipset=/bmw-motorrad.ma/gfwlist\nserver=/xda-cdn.com/127.0.0.1#5335\nipset=/xda-cdn.com/gfwlist\nserver=/intelnet.component/127.0.0.1#5335\nipset=/intelnet.component/gfwlist\nserver=/bukkake-jav.com/127.0.0.1#5335\nipset=/bukkake-jav.com/gfwlist\nserver=/adult.toonsearch.net/127.0.0.1#5335\nipset=/adult.toonsearch.net/gfwlist\nserver=/kav.tw/127.0.0.1#5335\nipset=/kav.tw/gfwlist\nserver=/dealtime.com/127.0.0.1#5335\nipset=/dealtime.com/gfwlist\nserver=/girlfriendvideos.com/127.0.0.1#5335\nipset=/girlfriendvideos.com/gfwlist\nserver=/unity3d.com/127.0.0.1#5335\nipset=/unity3d.com/gfwlist\nserver=/disp.cc/127.0.0.1#5335\nipset=/disp.cc/gfwlist\nserver=/xn--yf1at58a.com/127.0.0.1#5335\nipset=/xn--yf1at58a.com/gfwlist\nserver=/dlsitenews.com/127.0.0.1#5335\nipset=/dlsitenews.com/gfwlist\nserver=/booksc.xyz/127.0.0.1#5335\nipset=/booksc.xyz/gfwlist\nserver=/ampproject.com/127.0.0.1#5335\nipset=/ampproject.com/gfwlist\nserver=/applecare.cc/127.0.0.1#5335\nipset=/applecare.cc/gfwlist\nserver=/fstopimages.com/127.0.0.1#5335\nipset=/fstopimages.com/gfwlist\nserver=/camelotherald.net/127.0.0.1#5335\nipset=/camelotherald.net/gfwlist\nserver=/kernel.org/127.0.0.1#5335\nipset=/kernel.org/gfwlist\nserver=/dropboxstatic.com/127.0.0.1#5335\nipset=/dropboxstatic.com/gfwlist\nserver=/privilege.tw/127.0.0.1#5335\nipset=/privilege.tw/gfwlist\nserver=/android.com/127.0.0.1#5335\nipset=/android.com/gfwlist\nserver=/batsa.me/127.0.0.1#5335\nipset=/batsa.me/gfwlist\nserver=/vanish.fr/127.0.0.1#5335\nipset=/vanish.fr/gfwlist\nserver=/alphera.net/127.0.0.1#5335\nipset=/alphera.net/gfwlist\nserver=/wifevideos.net/127.0.0.1#5335\nipset=/wifevideos.net/gfwlist\nserver=/dremonsterbeatsoutlets.com/127.0.0.1#5335\nipset=/dremonsterbeatsoutlets.com/gfwlist\nserver=/fox2news.com/127.0.0.1#5335\nipset=/fox2news.com/gfwlist\nserver=/beatsnzsale.com/127.0.0.1#5335\nipset=/beatsnzsale.com/gfwlist\nserver=/intel.sc/127.0.0.1#5335\nipset=/intel.sc/gfwlist\nserver=/stackoverflowcareers.com/127.0.0.1#5335\nipset=/stackoverflowcareers.com/gfwlist\nserver=/uun79.com/127.0.0.1#5335\nipset=/uun79.com/gfwlist\nserver=/volvobuses.jo/127.0.0.1#5335\nipset=/volvobuses.jo/gfwlist\nserver=/ecuatorianas.best/127.0.0.1#5335\nipset=/ecuatorianas.best/gfwlist\nserver=/stackoverflow.co/127.0.0.1#5335\nipset=/stackoverflow.co/gfwlist\nserver=/stackoverflow.blog/127.0.0.1#5335\nipset=/stackoverflow.blog/gfwlist\nserver=/connectedcommerce.com/127.0.0.1#5335\nipset=/connectedcommerce.com/gfwlist\nserver=/orsm.net/127.0.0.1#5335\nipset=/orsm.net/gfwlist\nserver=/paypal-business.com/127.0.0.1#5335\nipset=/paypal-business.com/gfwlist\nserver=/momoniji.com/127.0.0.1#5335\nipset=/momoniji.com/gfwlist\nserver=/homegrownfreaks.net/127.0.0.1#5335\nipset=/homegrownfreaks.net/gfwlist\nserver=/youtube.co.ke/127.0.0.1#5335\nipset=/youtube.co.ke/gfwlist\nserver=/goodporn.to/127.0.0.1#5335\nipset=/goodporn.to/gfwlist\nserver=/kindle.fr/127.0.0.1#5335\nipset=/kindle.fr/gfwlist\nserver=/javher.com/127.0.0.1#5335\nipset=/javher.com/gfwlist\nserver=/pypi.org/127.0.0.1#5335\nipset=/pypi.org/gfwlist\nserver=/lustery.com/127.0.0.1#5335\nipset=/lustery.com/gfwlist\nserver=/polymerproject.org/127.0.0.1#5335\nipset=/polymerproject.org/gfwlist\nserver=/facebook-covid-19.com/127.0.0.1#5335\nipset=/facebook-covid-19.com/gfwlist\nserver=/hairy-amateurs.com/127.0.0.1#5335\nipset=/hairy-amateurs.com/gfwlist\nserver=/jetbrains.space/127.0.0.1#5335\nipset=/jetbrains.space/gfwlist\nserver=/hinet.net/127.0.0.1#5335\nipset=/hinet.net/gfwlist\nserver=/perl.org/127.0.0.1#5335\nipset=/perl.org/gfwlist\nserver=/maya5.net/127.0.0.1#5335\nipset=/maya5.net/gfwlist\nserver=/disney.nl/127.0.0.1#5335\nipset=/disney.nl/gfwlist\nserver=/garena.tv/127.0.0.1#5335\nipset=/garena.tv/gfwlist\nserver=/hentaizz.net/127.0.0.1#5335\nipset=/hentaizz.net/gfwlist\nserver=/mongodb.com/127.0.0.1#5335\nipset=/mongodb.com/gfwlist\nserver=/eroan.xyz/127.0.0.1#5335\nipset=/eroan.xyz/gfwlist\nserver=/ikea.si/127.0.0.1#5335\nipset=/ikea.si/gfwlist\nserver=/visa.co.ke/127.0.0.1#5335\nipset=/visa.co.ke/gfwlist\nserver=/volvotrucks.by/127.0.0.1#5335\nipset=/volvotrucks.by/gfwlist\nserver=/babylongirls.co.uk/127.0.0.1#5335\nipset=/babylongirls.co.uk/gfwlist\nserver=/cairn.info/127.0.0.1#5335\nipset=/cairn.info/gfwlist\nserver=/alphera.in/127.0.0.1#5335\nipset=/alphera.in/gfwlist\nserver=/alpherafs.com.hk/127.0.0.1#5335\nipset=/alpherafs.com.hk/gfwlist\nserver=/volvotrucks.fr/127.0.0.1#5335\nipset=/volvotrucks.fr/gfwlist\nserver=/vscode-unpkg.net/127.0.0.1#5335\nipset=/vscode-unpkg.net/gfwlist\nserver=/vfsforgit.org/127.0.0.1#5335\nipset=/vfsforgit.org/gfwlist\nserver=/nexpart.tv/127.0.0.1#5335\nipset=/nexpart.tv/gfwlist\nserver=/visualstudio.co.uk/127.0.0.1#5335\nipset=/visualstudio.co.uk/gfwlist\nserver=/volvogroup.se/127.0.0.1#5335\nipset=/volvogroup.se/gfwlist\nserver=/visualstudio.co/127.0.0.1#5335\nipset=/visualstudio.co/gfwlist\nserver=/bmw-motorrad.cr/127.0.0.1#5335\nipset=/bmw-motorrad.cr/gfwlist\nserver=/blacked.com/127.0.0.1#5335\nipset=/blacked.com/gfwlist\nserver=/escape.com.au/127.0.0.1#5335\nipset=/escape.com.au/gfwlist\nserver=/bag-glasses1.com/127.0.0.1#5335\nipset=/bag-glasses1.com/gfwlist\nserver=/cloudflaretest.com/127.0.0.1#5335\nipset=/cloudflaretest.com/gfwlist\nserver=/microsoftsilverlight.org/127.0.0.1#5335\nipset=/microsoftsilverlight.org/gfwlist\nserver=/bill-safe.com/127.0.0.1#5335\nipset=/bill-safe.com/gfwlist\nserver=/priceless.com/127.0.0.1#5335\nipset=/priceless.com/gfwlist\nserver=/bmw.re/127.0.0.1#5335\nipset=/bmw.re/gfwlist\nserver=/analtime.org/127.0.0.1#5335\nipset=/analtime.org/gfwlist\nserver=/nikelives.com/127.0.0.1#5335\nipset=/nikelives.com/gfwlist\nserver=/google.com.sa/127.0.0.1#5335\nipset=/google.com.sa/gfwlist\nserver=/camelotherald.com/127.0.0.1#5335\nipset=/camelotherald.com/gfwlist\nserver=/gay4tube.com/127.0.0.1#5335\nipset=/gay4tube.com/gfwlist\nserver=/d29vzk4ow07wi7.cloudfront.net/127.0.0.1#5335\nipset=/d29vzk4ow07wi7.cloudfront.net/gfwlist\nserver=/av-th.net/127.0.0.1#5335\nipset=/av-th.net/gfwlist\nserver=/adobespark.com/127.0.0.1#5335\nipset=/adobespark.com/gfwlist\nserver=/jfrog.com/127.0.0.1#5335\nipset=/jfrog.com/gfwlist\nserver=/kijiji.ca/127.0.0.1#5335\nipset=/kijiji.ca/gfwlist\nserver=/oxfordre.com/127.0.0.1#5335\nipset=/oxfordre.com/gfwlist\nserver=/i69.com.tw/127.0.0.1#5335\nipset=/i69.com.tw/gfwlist\nserver=/upornia.com/127.0.0.1#5335\nipset=/upornia.com/gfwlist\nserver=/jjaaxyz.com/127.0.0.1#5335\nipset=/jjaaxyz.com/gfwlist\nserver=/mcpeaceofmind.com/127.0.0.1#5335\nipset=/mcpeaceofmind.com/gfwlist\nserver=/18novel.xyz/127.0.0.1#5335\nipset=/18novel.xyz/gfwlist\nserver=/bridgestone.com.vn/127.0.0.1#5335\nipset=/bridgestone.com.vn/gfwlist\nserver=/cbart.net/127.0.0.1#5335\nipset=/cbart.net/gfwlist\nserver=/piapro.net/127.0.0.1#5335\nipset=/piapro.net/gfwlist\nserver=/facebokc.com/127.0.0.1#5335\nipset=/facebokc.com/gfwlist\nserver=/mastercad.com/127.0.0.1#5335\nipset=/mastercad.com/gfwlist\nserver=/girl7942.com/127.0.0.1#5335\nipset=/girl7942.com/gfwlist\nserver=/snap-telemetry.io/127.0.0.1#5335\nipset=/snap-telemetry.io/gfwlist\nserver=/bidi.net.uk/127.0.0.1#5335\nipset=/bidi.net.uk/gfwlist\nserver=/soundcloud.com/127.0.0.1#5335\nipset=/soundcloud.com/gfwlist\nserver=/canon.rs/127.0.0.1#5335\nipset=/canon.rs/gfwlist\nserver=/ebaycdn.net/127.0.0.1#5335\nipset=/ebaycdn.net/gfwlist\nserver=/instagram.com/127.0.0.1#5335\nipset=/instagram.com/gfwlist\nserver=/mastercard.ca/127.0.0.1#5335\nipset=/mastercard.ca/gfwlist\nserver=/foxnewslatino.com/127.0.0.1#5335\nipset=/foxnewslatino.com/gfwlist\nserver=/google.md/127.0.0.1#5335\nipset=/google.md/gfwlist\nserver=/simcity.com/127.0.0.1#5335\nipset=/simcity.com/gfwlist\nserver=/newslicensing.co.uk/127.0.0.1#5335\nipset=/newslicensing.co.uk/gfwlist\nserver=/niketrainers.com/127.0.0.1#5335\nipset=/niketrainers.com/gfwlist\nserver=/marvelspotlightplays.com/127.0.0.1#5335\nipset=/marvelspotlightplays.com/gfwlist\nserver=/beatssaustraliabuy.com/127.0.0.1#5335\nipset=/beatssaustraliabuy.com/gfwlist\nserver=/stackage.org/127.0.0.1#5335\nipset=/stackage.org/gfwlist\nserver=/ebay.fr/127.0.0.1#5335\nipset=/ebay.fr/gfwlist\nserver=/theleakbay.com/127.0.0.1#5335\nipset=/theleakbay.com/gfwlist\nserver=/youtube.fr/127.0.0.1#5335\nipset=/youtube.fr/gfwlist\nserver=/dogcumshot.net/127.0.0.1#5335\nipset=/dogcumshot.net/gfwlist\nserver=/slidesharecdn.com/127.0.0.1#5335\nipset=/slidesharecdn.com/gfwlist\nserver=/vagrantcloud.com/127.0.0.1#5335\nipset=/vagrantcloud.com/gfwlist\nserver=/mcdelivery.com.tw/127.0.0.1#5335\nipset=/mcdelivery.com.tw/gfwlist\nserver=/netflix.ca/127.0.0.1#5335\nipset=/netflix.ca/gfwlist\nserver=/nijigen-daiaru.com/127.0.0.1#5335\nipset=/nijigen-daiaru.com/gfwlist\nserver=/99re.com/127.0.0.1#5335\nipset=/99re.com/gfwlist\nserver=/ebaystore.com/127.0.0.1#5335\nipset=/ebaystore.com/gfwlist\nserver=/go-lang.com/127.0.0.1#5335\nipset=/go-lang.com/gfwlist\nserver=/rajwaphq.com/127.0.0.1#5335\nipset=/rajwaphq.com/gfwlist\nserver=/ieeer5.org/127.0.0.1#5335\nipset=/ieeer5.org/gfwlist\nserver=/gettyimages.com/127.0.0.1#5335\nipset=/gettyimages.com/gfwlist\nserver=/filipino-music.net/127.0.0.1#5335\nipset=/filipino-music.net/gfwlist\nserver=/costcobusinessdelivery.com/127.0.0.1#5335\nipset=/costcobusinessdelivery.com/gfwlist\nserver=/mini-connected.it/127.0.0.1#5335\nipset=/mini-connected.it/gfwlist\nserver=/jwkcgd.xyz/127.0.0.1#5335\nipset=/jwkcgd.xyz/gfwlist\nserver=/blzddist1-a.akamaihd.net/127.0.0.1#5335\nipset=/blzddist1-a.akamaihd.net/gfwlist\nserver=/fasebokk.com/127.0.0.1#5335\nipset=/fasebokk.com/gfwlist\nserver=/industrialtoys.com/127.0.0.1#5335\nipset=/industrialtoys.com/gfwlist\nserver=/bloombergbna.com/127.0.0.1#5335\nipset=/bloombergbna.com/gfwlist\nserver=/gitlab.io/127.0.0.1#5335\nipset=/gitlab.io/gfwlist\nserver=/gitlab.com/127.0.0.1#5335\nipset=/gitlab.com/gfwlist\nserver=/disney.com/127.0.0.1#5335\nipset=/disney.com/gfwlist\nserver=/github-cloud.s3.amazonaws.com/127.0.0.1#5335\nipset=/github-cloud.s3.amazonaws.com/gfwlist\nserver=/apexlegends.com/127.0.0.1#5335\nipset=/apexlegends.com/gfwlist\nserver=/githubuniverse.com/127.0.0.1#5335\nipset=/githubuniverse.com/gfwlist\nserver=/instantfapgay.com/127.0.0.1#5335\nipset=/instantfapgay.com/gfwlist\nserver=/sankei.com/127.0.0.1#5335\nipset=/sankei.com/gfwlist\nserver=/googlesource.com/127.0.0.1#5335\nipset=/googlesource.com/gfwlist\nserver=/freecamstars.com/127.0.0.1#5335\nipset=/freecamstars.com/gfwlist\nserver=/xnxxfap.info/127.0.0.1#5335\nipset=/xnxxfap.info/gfwlist\nserver=/marvel10thanniversary.com/127.0.0.1#5335\nipset=/marvel10thanniversary.com/gfwlist\nserver=/pypl.com/127.0.0.1#5335\nipset=/pypl.com/gfwlist\nserver=/dnai.in/127.0.0.1#5335\nipset=/dnai.in/gfwlist\nserver=/shoppercentre.com/127.0.0.1#5335\nipset=/shoppercentre.com/gfwlist\nserver=/mini-connected.lt/127.0.0.1#5335\nipset=/mini-connected.lt/gfwlist\nserver=/pki.google.com/127.0.0.1#5335\nipset=/pki.google.com/gfwlist\nserver=/besttitstube.com/127.0.0.1#5335\nipset=/besttitstube.com/gfwlist\nserver=/vfsco.ro/127.0.0.1#5335\nipset=/vfsco.ro/gfwlist\nserver=/hsfacebook.com/127.0.0.1#5335\nipset=/hsfacebook.com/gfwlist\nserver=/virtualrealporn.com/127.0.0.1#5335\nipset=/virtualrealporn.com/gfwlist\nserver=/riot.net/127.0.0.1#5335\nipset=/riot.net/gfwlist\nserver=/bmw-motorrad.com.br/127.0.0.1#5335\nipset=/bmw-motorrad.com.br/gfwlist\nserver=/nude.hu/127.0.0.1#5335\nipset=/nude.hu/gfwlist\nserver=/foxnewsmagazine.com/127.0.0.1#5335\nipset=/foxnewsmagazine.com/gfwlist\nserver=/flutter.dev/127.0.0.1#5335\nipset=/flutter.dev/gfwlist\nserver=/pearsonclinical.nl/127.0.0.1#5335\nipset=/pearsonclinical.nl/gfwlist\nserver=/facebboook.com/127.0.0.1#5335\nipset=/facebboook.com/gfwlist\nserver=/fedoraproject.org/127.0.0.1#5335\nipset=/fedoraproject.org/gfwlist\nserver=/baltimorebmw.com/127.0.0.1#5335\nipset=/baltimorebmw.com/gfwlist\nserver=/ieee-ies.org/127.0.0.1#5335\nipset=/ieee-ies.org/gfwlist\nserver=/symantec.com/127.0.0.1#5335\nipset=/symantec.com/gfwlist\nserver=/taipeitimes.com/127.0.0.1#5335\nipset=/taipeitimes.com/gfwlist\nserver=/payserve.com/127.0.0.1#5335\nipset=/payserve.com/gfwlist\nserver=/pornotube.blog.br/127.0.0.1#5335\nipset=/pornotube.blog.br/gfwlist\nserver=/yahoo.it/127.0.0.1#5335\nipset=/yahoo.it/gfwlist\nserver=/reactjs.org/127.0.0.1#5335\nipset=/reactjs.org/gfwlist\nserver=/garotoesperto.com/127.0.0.1#5335\nipset=/garotoesperto.com/gfwlist\nserver=/7mmtv.tv/127.0.0.1#5335\nipset=/7mmtv.tv/gfwlist\nserver=/minispygear.com/127.0.0.1#5335\nipset=/minispygear.com/gfwlist\nserver=/keezmovies.com/127.0.0.1#5335\nipset=/keezmovies.com/gfwlist\nserver=/minidrivingexperienceusa.com/127.0.0.1#5335\nipset=/minidrivingexperienceusa.com/gfwlist\nserver=/react.com/127.0.0.1#5335\nipset=/react.com/gfwlist\nserver=/rockstargames.com/127.0.0.1#5335\nipset=/rockstargames.com/gfwlist\nserver=/messengerdevelopers.com/127.0.0.1#5335\nipset=/messengerdevelopers.com/gfwlist\nserver=/dollarfotoclub.com/127.0.0.1#5335\nipset=/dollarfotoclub.com/gfwlist\nserver=/globalvoices.org/127.0.0.1#5335\nipset=/globalvoices.org/gfwlist\nserver=/projecteuclid.org/127.0.0.1#5335\nipset=/projecteuclid.org/gfwlist\nserver=/foxsports.com.bo/127.0.0.1#5335\nipset=/foxsports.com.bo/gfwlist\nserver=/hbomaxcdn.com/127.0.0.1#5335\nipset=/hbomaxcdn.com/gfwlist\nserver=/fasttext.cc/127.0.0.1#5335\nipset=/fasttext.cc/gfwlist\nserver=/faciometrics.com/127.0.0.1#5335\nipset=/faciometrics.com/gfwlist\nserver=/hentaispark.com/127.0.0.1#5335\nipset=/hentaispark.com/gfwlist\nserver=/google.ro/127.0.0.1#5335\nipset=/google.ro/gfwlist\nserver=/porn.com/127.0.0.1#5335\nipset=/porn.com/gfwlist\nserver=/hlbelygl.com/127.0.0.1#5335\nipset=/hlbelygl.com/gfwlist\nserver=/paydiant.com/127.0.0.1#5335\nipset=/paydiant.com/gfwlist\nserver=/f8.com/127.0.0.1#5335\nipset=/f8.com/gfwlist\nserver=/buck.build/127.0.0.1#5335\nipset=/buck.build/gfwlist\nserver=/embedly.com/127.0.0.1#5335\nipset=/embedly.com/gfwlist\nserver=/star-brasil.com/127.0.0.1#5335\nipset=/star-brasil.com/gfwlist\nserver=/nikeoutletstore.com/127.0.0.1#5335\nipset=/nikeoutletstore.com/gfwlist\nserver=/imstagram.com/127.0.0.1#5335\nipset=/imstagram.com/gfwlist\nserver=/twitter.com/127.0.0.1#5335\nipset=/twitter.com/gfwlist\nserver=/stackapps.com/127.0.0.1#5335\nipset=/stackapps.com/gfwlist\nserver=/cispaletter.org/127.0.0.1#5335\nipset=/cispaletter.org/gfwlist\nserver=/dotdeb.org/127.0.0.1#5335\nipset=/dotdeb.org/gfwlist\nserver=/ubuntuforums.org/127.0.0.1#5335\nipset=/ubuntuforums.org/gfwlist\nserver=/ubuntu.com/127.0.0.1#5335\nipset=/ubuntu.com/gfwlist\nserver=/xn--yt8h.la/127.0.0.1#5335\nipset=/xn--yt8h.la/gfwlist\nserver=/nintendoeurope.com/127.0.0.1#5335\nipset=/nintendoeurope.com/gfwlist\nserver=/launchpadlibrarian.net/127.0.0.1#5335\nipset=/launchpadlibrarian.net/gfwlist\nserver=/getbootstrap.com/127.0.0.1#5335\nipset=/getbootstrap.com/gfwlist\nserver=/applecensorship.com/127.0.0.1#5335\nipset=/applecensorship.com/gfwlist\nserver=/cloudflareapps.com/127.0.0.1#5335\nipset=/cloudflareapps.com/gfwlist\nserver=/muji.us/127.0.0.1#5335\nipset=/muji.us/gfwlist\nserver=/lanik.us/127.0.0.1#5335\nipset=/lanik.us/gfwlist\nserver=/star-latam.com/127.0.0.1#5335\nipset=/star-latam.com/gfwlist\nserver=/videosdemadurasx.com/127.0.0.1#5335\nipset=/videosdemadurasx.com/gfwlist\nserver=/netflixdnstest6.com/127.0.0.1#5335\nipset=/netflixdnstest6.com/gfwlist\nserver=/as-hp.ca/127.0.0.1#5335\nipset=/as-hp.ca/gfwlist\nserver=/volvotrucks.com.ar/127.0.0.1#5335\nipset=/volvotrucks.com.ar/gfwlist\nserver=/visual-arts.jp/127.0.0.1#5335\nipset=/visual-arts.jp/gfwlist\nserver=/18exgfs.com/127.0.0.1#5335\nipset=/18exgfs.com/gfwlist\nserver=/argotunnel.com/127.0.0.1#5335\nipset=/argotunnel.com/gfwlist\nserver=/audiencenetwork.com/127.0.0.1#5335\nipset=/audiencenetwork.com/gfwlist\nserver=/swift.org/127.0.0.1#5335\nipset=/swift.org/gfwlist\nserver=/parkinfo.com/127.0.0.1#5335\nipset=/parkinfo.com/gfwlist\nserver=/appleswift.com/127.0.0.1#5335\nipset=/appleswift.com/gfwlist\nserver=/acebook.com/127.0.0.1#5335\nipset=/acebook.com/gfwlist\nserver=/upmedia.mg/127.0.0.1#5335\nipset=/upmedia.mg/gfwlist\nserver=/auroraoss.com/127.0.0.1#5335\nipset=/auroraoss.com/gfwlist\nserver=/harpercollinsadvantage.com/127.0.0.1#5335\nipset=/harpercollinsadvantage.com/gfwlist\nserver=/zohostatic.in/127.0.0.1#5335\nipset=/zohostatic.in/gfwlist\nserver=/zeplin.dev/127.0.0.1#5335\nipset=/zeplin.dev/gfwlist\nserver=/bsersd.xyz/127.0.0.1#5335\nipset=/bsersd.xyz/gfwlist\nserver=/facebooknfl.com/127.0.0.1#5335\nipset=/facebooknfl.com/gfwlist\nserver=/zendesk.com/127.0.0.1#5335\nipset=/zendesk.com/gfwlist\nserver=/wpvip.com/127.0.0.1#5335\nipset=/wpvip.com/gfwlist\nserver=/wordpress.tv/127.0.0.1#5335\nipset=/wordpress.tv/gfwlist\nserver=/uun89.com/127.0.0.1#5335\nipset=/uun89.com/gfwlist\nserver=/scholar.google.com.ph/127.0.0.1#5335\nipset=/scholar.google.com.ph/gfwlist\nserver=/reutersagency.cn/127.0.0.1#5335\nipset=/reutersagency.cn/gfwlist\nserver=/dailymail.co.uk/127.0.0.1#5335\nipset=/dailymail.co.uk/gfwlist\nserver=/projectbaseline.com/127.0.0.1#5335\nipset=/projectbaseline.com/gfwlist\nserver=/dditscdn.com/127.0.0.1#5335\nipset=/dditscdn.com/gfwlist\nserver=/mastercard.com.au/127.0.0.1#5335\nipset=/mastercard.com.au/gfwlist\nserver=/geeksquadservices.org/127.0.0.1#5335\nipset=/geeksquadservices.org/gfwlist\nserver=/webflow.com/127.0.0.1#5335\nipset=/webflow.com/gfwlist\nserver=/1xbet.cm/127.0.0.1#5335\nipset=/1xbet.cm/gfwlist\nserver=/vercel.sh/127.0.0.1#5335\nipset=/vercel.sh/gfwlist\nserver=/nijidoujin.com/127.0.0.1#5335\nipset=/nijidoujin.com/gfwlist\nserver=/instagramhilecim.com/127.0.0.1#5335\nipset=/instagramhilecim.com/gfwlist\nserver=/imgix.net/127.0.0.1#5335\nipset=/imgix.net/gfwlist\nserver=/streamingporn.xyz/127.0.0.1#5335\nipset=/streamingporn.xyz/gfwlist\nserver=/visa.cl/127.0.0.1#5335\nipset=/visa.cl/gfwlist\nserver=/scholar.google.co.uk/127.0.0.1#5335\nipset=/scholar.google.co.uk/gfwlist\nserver=/i-cable.com/127.0.0.1#5335\nipset=/i-cable.com/gfwlist\nserver=/err.sh/127.0.0.1#5335\nipset=/err.sh/gfwlist\nserver=/ctan.org/127.0.0.1#5335\nipset=/ctan.org/gfwlist\nserver=/svp-team.com/127.0.0.1#5335\nipset=/svp-team.com/gfwlist\nserver=/bingsettingssearch.trafficmanager.net/127.0.0.1#5335\nipset=/bingsettingssearch.trafficmanager.net/gfwlist\nserver=/facebookmarketingpartner.com/127.0.0.1#5335\nipset=/facebookmarketingpartner.com/gfwlist\nserver=/creditcardsbay.com/127.0.0.1#5335\nipset=/creditcardsbay.com/gfwlist\nserver=/biguz.net/127.0.0.1#5335\nipset=/biguz.net/gfwlist\nserver=/scholar.l.google.com/127.0.0.1#5335\nipset=/scholar.l.google.com/gfwlist\nserver=/steam.naeu.qtlglb.com/127.0.0.1#5335\nipset=/steam.naeu.qtlglb.com/gfwlist\nserver=/thescottishsun.co.uk/127.0.0.1#5335\nipset=/thescottishsun.co.uk/gfwlist\nserver=/bmw.com/127.0.0.1#5335\nipset=/bmw.com/gfwlist\nserver=/analamateursex.com/127.0.0.1#5335\nipset=/analamateursex.com/gfwlist\nserver=/startpage.com/127.0.0.1#5335\nipset=/startpage.com/gfwlist\nserver=/squarecapital.com/127.0.0.1#5335\nipset=/squarecapital.com/gfwlist\nserver=/git.io/127.0.0.1#5335\nipset=/git.io/gfwlist\nserver=/exporntoons.net/127.0.0.1#5335\nipset=/exporntoons.net/gfwlist\nserver=/itripto.com/127.0.0.1#5335\nipset=/itripto.com/gfwlist\nserver=/91porn.best/127.0.0.1#5335\nipset=/91porn.best/gfwlist\nserver=/rplay.live/127.0.0.1#5335\nipset=/rplay.live/gfwlist\nserver=/slideshare.com/127.0.0.1#5335\nipset=/slideshare.com/gfwlist\nserver=/shorturl.at/127.0.0.1#5335\nipset=/shorturl.at/gfwlist\nserver=/visa.co.in/127.0.0.1#5335\nipset=/visa.co.in/gfwlist\nserver=/dl.begellhouse.com/127.0.0.1#5335\nipset=/dl.begellhouse.com/gfwlist\nserver=/nyansa.com/127.0.0.1#5335\nipset=/nyansa.com/gfwlist\nserver=/spaindisney.com/127.0.0.1#5335\nipset=/spaindisney.com/gfwlist\nserver=/shop.app/127.0.0.1#5335\nipset=/shop.app/gfwlist\nserver=/myshopify.com/127.0.0.1#5335\nipset=/myshopify.com/gfwlist\nserver=/setapp.com/127.0.0.1#5335\nipset=/setapp.com/gfwlist\nserver=/bellebound.com/127.0.0.1#5335\nipset=/bellebound.com/gfwlist\nserver=/loli.net/127.0.0.1#5335\nipset=/loli.net/gfwlist\nserver=/rb.gy/127.0.0.1#5335\nipset=/rb.gy/gfwlist\nserver=/6neek.com/127.0.0.1#5335\nipset=/6neek.com/gfwlist\nserver=/thebeatsheadphonesale.com/127.0.0.1#5335\nipset=/thebeatsheadphonesale.com/gfwlist\nserver=/lqh0bon3.xyz/127.0.0.1#5335\nipset=/lqh0bon3.xyz/gfwlist\nserver=/stackauth.com/127.0.0.1#5335\nipset=/stackauth.com/gfwlist\nserver=/pacloudflare.com/127.0.0.1#5335\nipset=/pacloudflare.com/gfwlist\nserver=/foxsmallbusinesscenter.org/127.0.0.1#5335\nipset=/foxsmallbusinesscenter.org/gfwlist\nserver=/tnatryouts.com/127.0.0.1#5335\nipset=/tnatryouts.com/gfwlist\nserver=/teenqueens.net/127.0.0.1#5335\nipset=/teenqueens.net/gfwlist\nserver=/cdn-terapeak.com/127.0.0.1#5335\nipset=/cdn-terapeak.com/gfwlist\nserver=/rolfoundation.org/127.0.0.1#5335\nipset=/rolfoundation.org/gfwlist\nserver=/patreonusercontent.com/127.0.0.1#5335\nipset=/patreonusercontent.com/gfwlist\nserver=/miniusa.com/127.0.0.1#5335\nipset=/miniusa.com/gfwlist\nserver=/omaps.app/127.0.0.1#5335\nipset=/omaps.app/gfwlist\nserver=/cloudimg.io/127.0.0.1#5335\nipset=/cloudimg.io/gfwlist\nserver=/notion.so/127.0.0.1#5335\nipset=/notion.so/gfwlist\nserver=/notion.com/127.0.0.1#5335\nipset=/notion.com/gfwlist\nserver=/nintendo.com/127.0.0.1#5335\nipset=/nintendo.com/gfwlist\nserver=/newsextv.com/127.0.0.1#5335\nipset=/newsextv.com/gfwlist\nserver=/d33wubrfki0l68.cloudfront.net/127.0.0.1#5335\nipset=/d33wubrfki0l68.cloudfront.net/gfwlist\nserver=/mpv.io/127.0.0.1#5335\nipset=/mpv.io/gfwlist\nserver=/huffingtonpost.kr/127.0.0.1#5335\nipset=/huffingtonpost.kr/gfwlist\nserver=/madvrlabs.llc/127.0.0.1#5335\nipset=/madvrlabs.llc/gfwlist\nserver=/crl.microsoft.com/127.0.0.1#5335\nipset=/crl.microsoft.com/gfwlist\nserver=/madvr.net/127.0.0.1#5335\nipset=/madvr.net/gfwlist\nserver=/awayoutgame.com/127.0.0.1#5335\nipset=/awayoutgame.com/gfwlist\nserver=/amazonbusinessblog.com/127.0.0.1#5335\nipset=/amazonbusinessblog.com/gfwlist\nserver=/madvr.com/127.0.0.1#5335\nipset=/madvr.com/gfwlist\nserver=/ebay-confirm.com/127.0.0.1#5335\nipset=/ebay-confirm.com/gfwlist\nserver=/chunja19.net/127.0.0.1#5335\nipset=/chunja19.net/gfwlist\nserver=/swiftcapital.com/127.0.0.1#5335\nipset=/swiftcapital.com/gfwlist\nserver=/liberapay.com/127.0.0.1#5335\nipset=/liberapay.com/gfwlist\nserver=/venezporn.com/127.0.0.1#5335\nipset=/venezporn.com/gfwlist\nserver=/bustyangelique.com/127.0.0.1#5335\nipset=/bustyangelique.com/gfwlist\nserver=/jwpltx.com/127.0.0.1#5335\nipset=/jwpltx.com/gfwlist\nserver=/xxx-com.cfd/127.0.0.1#5335\nipset=/xxx-com.cfd/gfwlist\nserver=/xxxner.com/127.0.0.1#5335\nipset=/xxxner.com/gfwlist\nserver=/visa.co.uk/127.0.0.1#5335\nipset=/visa.co.uk/gfwlist\nserver=/disney.pt/127.0.0.1#5335\nipset=/disney.pt/gfwlist\nserver=/teslamotors.com/127.0.0.1#5335\nipset=/teslamotors.com/gfwlist\nserver=/bowenpress.com/127.0.0.1#5335\nipset=/bowenpress.com/gfwlist\nserver=/3dhentai.tv/127.0.0.1#5335\nipset=/3dhentai.tv/gfwlist\nserver=/dlfacebook.com/127.0.0.1#5335\nipset=/dlfacebook.com/gfwlist\nserver=/heroku-app.com/127.0.0.1#5335\nipset=/heroku-app.com/gfwlist\nserver=/secomtrust.net/127.0.0.1#5335\nipset=/secomtrust.net/gfwlist\nserver=/predictivetechnologies.com/127.0.0.1#5335\nipset=/predictivetechnologies.com/gfwlist\nserver=/fabuye.top/127.0.0.1#5335\nipset=/fabuye.top/gfwlist\nserver=/appleexpo.info/127.0.0.1#5335\nipset=/appleexpo.info/gfwlist\nserver=/xxxland.net/127.0.0.1#5335\nipset=/xxxland.net/gfwlist\nserver=/translatewiki.org/127.0.0.1#5335\nipset=/translatewiki.org/gfwlist\nserver=/sexcelebrity.net/127.0.0.1#5335\nipset=/sexcelebrity.net/gfwlist\nserver=/arcgis.com/127.0.0.1#5335\nipset=/arcgis.com/gfwlist\nserver=/duckside.com/127.0.0.1#5335\nipset=/duckside.com/gfwlist\nserver=/intel.eu/127.0.0.1#5335\nipset=/intel.eu/gfwlist\nserver=/chatterbate.io/127.0.0.1#5335\nipset=/chatterbate.io/gfwlist\nserver=/streetmeatasia.com/127.0.0.1#5335\nipset=/streetmeatasia.com/gfwlist\nserver=/xxxhomefuck.com/127.0.0.1#5335\nipset=/xxxhomefuck.com/gfwlist\nserver=/hotscope.tv/127.0.0.1#5335\nipset=/hotscope.tv/gfwlist\nserver=/pornomasse.com/127.0.0.1#5335\nipset=/pornomasse.com/gfwlist\nserver=/xvideosnovinha.com/127.0.0.1#5335\nipset=/xvideosnovinha.com/gfwlist\nserver=/byjav.me/127.0.0.1#5335\nipset=/byjav.me/gfwlist\nserver=/duckduckgo.com.tw/127.0.0.1#5335\nipset=/duckduckgo.com.tw/gfwlist\nserver=/nike.com.br/127.0.0.1#5335\nipset=/nike.com.br/gfwlist\nserver=/asiancamly.com/127.0.0.1#5335\nipset=/asiancamly.com/gfwlist\nserver=/zlibcdn2.com/127.0.0.1#5335\nipset=/zlibcdn2.com/gfwlist\nserver=/ahswingerporno.com/127.0.0.1#5335\nipset=/ahswingerporno.com/gfwlist\nserver=/pornenix.com/127.0.0.1#5335\nipset=/pornenix.com/gfwlist\nserver=/ddg.co/127.0.0.1#5335\nipset=/ddg.co/gfwlist\nserver=/bondagesex-xxx.com/127.0.0.1#5335\nipset=/bondagesex-xxx.com/gfwlist\nserver=/erodou.tousatu.fun/127.0.0.1#5335\nipset=/erodou.tousatu.fun/gfwlist\nserver=/disqus.com/127.0.0.1#5335\nipset=/disqus.com/gfwlist\nserver=/pornxxxweb.com/127.0.0.1#5335\nipset=/pornxxxweb.com/gfwlist\nserver=/digitalocean.com/127.0.0.1#5335\nipset=/digitalocean.com/gfwlist\nserver=/cloudconvert.com/127.0.0.1#5335\nipset=/cloudconvert.com/gfwlist\nserver=/steam-chat.com/127.0.0.1#5335\nipset=/steam-chat.com/gfwlist\nserver=/buymeacoff.ee/127.0.0.1#5335\nipset=/buymeacoff.ee/gfwlist\nserver=/myfoxorlando.com/127.0.0.1#5335\nipset=/myfoxorlando.com/gfwlist\nserver=/anyxxx.me/127.0.0.1#5335\nipset=/anyxxx.me/gfwlist\nserver=/sexyfeet.tv/127.0.0.1#5335\nipset=/sexyfeet.tv/gfwlist\nserver=/volvotrucks.ph/127.0.0.1#5335\nipset=/volvotrucks.ph/gfwlist\nserver=/youtube.com.lv/127.0.0.1#5335\nipset=/youtube.com.lv/gfwlist\nserver=/fonts.net/127.0.0.1#5335\nipset=/fonts.net/gfwlist\nserver=/horsemecum.com/127.0.0.1#5335\nipset=/horsemecum.com/gfwlist\nserver=/brightcove.services/127.0.0.1#5335\nipset=/brightcove.services/gfwlist\nserver=/thri.xxx/127.0.0.1#5335\nipset=/thri.xxx/gfwlist\nserver=/hrecords.jp/127.0.0.1#5335\nipset=/hrecords.jp/gfwlist\nserver=/isiknowledge.com/127.0.0.1#5335\nipset=/isiknowledge.com/gfwlist\nserver=/doom9.org/127.0.0.1#5335\nipset=/doom9.org/gfwlist\nserver=/bahamut.akamaized.net/127.0.0.1#5335\nipset=/bahamut.akamaized.net/gfwlist\nserver=/arphic.com.tw/127.0.0.1#5335\nipset=/arphic.com.tw/gfwlist\nserver=/literotica.com/127.0.0.1#5335\nipset=/literotica.com/gfwlist\nserver=/fabhairypussy.com/127.0.0.1#5335\nipset=/fabhairypussy.com/gfwlist\nserver=/fbsbx.com/127.0.0.1#5335\nipset=/fbsbx.com/gfwlist\nserver=/kaggle.io/127.0.0.1#5335\nipset=/kaggle.io/gfwlist\nserver=/abcheadphones.com/127.0.0.1#5335\nipset=/abcheadphones.com/gfwlist\nserver=/gamer-cds.cdn.hinet.net/127.0.0.1#5335\nipset=/gamer-cds.cdn.hinet.net/gfwlist\nserver=/ikea.com.eg/127.0.0.1#5335\nipset=/ikea.com.eg/gfwlist\nserver=/msads.net/127.0.0.1#5335\nipset=/msads.net/gfwlist\nserver=/addtoany.com/127.0.0.1#5335\nipset=/addtoany.com/gfwlist\nserver=/konachan.net/127.0.0.1#5335\nipset=/konachan.net/gfwlist\nserver=/gscanada.info/127.0.0.1#5335\nipset=/gscanada.info/gfwlist\nserver=/globalspec.com/127.0.0.1#5335\nipset=/globalspec.com/gfwlist\nserver=/avstar3.com/127.0.0.1#5335\nipset=/avstar3.com/gfwlist\nserver=/zoo-xnxx.com/127.0.0.1#5335\nipset=/zoo-xnxx.com/gfwlist\nserver=/zh99.net/127.0.0.1#5335\nipset=/zh99.net/gfwlist\nserver=/firefoxusercontent.com/127.0.0.1#5335\nipset=/firefoxusercontent.com/gfwlist\nserver=/yepporn.com/127.0.0.1#5335\nipset=/yepporn.com/gfwlist\nserver=/binance.us/127.0.0.1#5335\nipset=/binance.us/gfwlist\nserver=/a-hentai.tv/127.0.0.1#5335\nipset=/a-hentai.tv/gfwlist\nserver=/thomsonreuters.es/127.0.0.1#5335\nipset=/thomsonreuters.es/gfwlist\nserver=/easportsactive.com/127.0.0.1#5335\nipset=/easportsactive.com/gfwlist\nserver=/shenyun.com/127.0.0.1#5335\nipset=/shenyun.com/gfwlist\nserver=/foxcanvasroom.com/127.0.0.1#5335\nipset=/foxcanvasroom.com/gfwlist\nserver=/devsitetest.how/127.0.0.1#5335\nipset=/devsitetest.how/gfwlist\nserver=/rule34video.com/127.0.0.1#5335\nipset=/rule34video.com/gfwlist\nserver=/hkedcity.net/127.0.0.1#5335\nipset=/hkedcity.net/gfwlist\nserver=/zohoschools.com/127.0.0.1#5335\nipset=/zohoschools.com/gfwlist\nserver=/yavtube.com/127.0.0.1#5335\nipset=/yavtube.com/gfwlist\nserver=/volvodefense.com/127.0.0.1#5335\nipset=/volvodefense.com/gfwlist\nserver=/zzitube.com/127.0.0.1#5335\nipset=/zzitube.com/gfwlist\nserver=/realdoll.com/127.0.0.1#5335\nipset=/realdoll.com/gfwlist\nserver=/zqqpwz.com/127.0.0.1#5335\nipset=/zqqpwz.com/gfwlist\nserver=/xboxgamepass.com/127.0.0.1#5335\nipset=/xboxgamepass.com/gfwlist\nserver=/xemales.com/127.0.0.1#5335\nipset=/xemales.com/gfwlist\nserver=/web-instagram.net/127.0.0.1#5335\nipset=/web-instagram.net/gfwlist\nserver=/bridgestonela.com/127.0.0.1#5335\nipset=/bridgestonela.com/gfwlist\nserver=/faebook.com/127.0.0.1#5335\nipset=/faebook.com/gfwlist\nserver=/adult.contents.fc2.com/127.0.0.1#5335\nipset=/adult.contents.fc2.com/gfwlist\nserver=/gayporn.pro/127.0.0.1#5335\nipset=/gayporn.pro/gfwlist\nserver=/drdrefnac.com/127.0.0.1#5335\nipset=/drdrefnac.com/gfwlist\nserver=/javtube.com/127.0.0.1#5335\nipset=/javtube.com/gfwlist\nserver=/swag.live/127.0.0.1#5335\nipset=/swag.live/gfwlist\nserver=/visiontimes.de/127.0.0.1#5335\nipset=/visiontimes.de/gfwlist\nserver=/nikkeibp.co.jp/127.0.0.1#5335\nipset=/nikkeibp.co.jp/gfwlist\nserver=/zhainanjidi.xyz/127.0.0.1#5335\nipset=/zhainanjidi.xyz/gfwlist\nserver=/pearsonclinical.in/127.0.0.1#5335\nipset=/pearsonclinical.in/gfwlist\nserver=/daddyslilangel.com/127.0.0.1#5335\nipset=/daddyslilangel.com/gfwlist\nserver=/nikesoccercleats.com/127.0.0.1#5335\nipset=/nikesoccercleats.com/gfwlist\nserver=/naughtyfootjobs.com/127.0.0.1#5335\nipset=/naughtyfootjobs.com/gfwlist\nserver=/pornobengala.com/127.0.0.1#5335\nipset=/pornobengala.com/gfwlist\nserver=/diamondgirlstudio.com/127.0.0.1#5335\nipset=/diamondgirlstudio.com/gfwlist\nserver=/spyjinx.com/127.0.0.1#5335\nipset=/spyjinx.com/gfwlist\nserver=/geek-squads.net/127.0.0.1#5335\nipset=/geek-squads.net/gfwlist\nserver=/zerochan.net/127.0.0.1#5335\nipset=/zerochan.net/gfwlist\nserver=/zen8ok.xyz/127.0.0.1#5335\nipset=/zen8ok.xyz/gfwlist\nserver=/zazzybabes.com/127.0.0.1#5335\nipset=/zazzybabes.com/gfwlist\nserver=/z00.world/127.0.0.1#5335\nipset=/z00.world/gfwlist\nserver=/leagueoflegends.com/127.0.0.1#5335\nipset=/leagueoflegends.com/gfwlist\nserver=/cashpassport.co.za/127.0.0.1#5335\nipset=/cashpassport.co.za/gfwlist\nserver=/adulttime.com/127.0.0.1#5335\nipset=/adulttime.com/gfwlist\nserver=/ospray.net/127.0.0.1#5335\nipset=/ospray.net/gfwlist\nserver=/bigtitvenera.com/127.0.0.1#5335\nipset=/bigtitvenera.com/gfwlist\nserver=/facebbook.com/127.0.0.1#5335\nipset=/facebbook.com/gfwlist\nserver=/721av.com/127.0.0.1#5335\nipset=/721av.com/gfwlist\nserver=/verisign.mobi/127.0.0.1#5335\nipset=/verisign.mobi/gfwlist\nserver=/unravel2.com/127.0.0.1#5335\nipset=/unravel2.com/gfwlist\nserver=/cf-ipfs.com/127.0.0.1#5335\nipset=/cf-ipfs.com/gfwlist\nserver=/bmw-nigeria.com/127.0.0.1#5335\nipset=/bmw-nigeria.com/gfwlist\nserver=/easportsactiveonline.com/127.0.0.1#5335\nipset=/easportsactiveonline.com/gfwlist\nserver=/bmw.mu/127.0.0.1#5335\nipset=/bmw.mu/gfwlist\nserver=/youramateurporn.com/127.0.0.1#5335\nipset=/youramateurporn.com/gfwlist\nserver=/youporn.com/127.0.0.1#5335\nipset=/youporn.com/gfwlist\nserver=/pornve.com/127.0.0.1#5335\nipset=/pornve.com/gfwlist\nserver=/telesell.com/127.0.0.1#5335\nipset=/telesell.com/gfwlist\nserver=/screw-my-wife.com/127.0.0.1#5335\nipset=/screw-my-wife.com/gfwlist\nserver=/youngsex.video/127.0.0.1#5335\nipset=/youngsex.video/gfwlist\nserver=/youngsex.sexy/127.0.0.1#5335\nipset=/youngsex.sexy/gfwlist\nserver=/facebookhome.com/127.0.0.1#5335\nipset=/facebookhome.com/gfwlist\nserver=/howfuck.me/127.0.0.1#5335\nipset=/howfuck.me/gfwlist\nserver=/youngerbabes.com/127.0.0.1#5335\nipset=/youngerbabes.com/gfwlist\nserver=/airhornbot.com/127.0.0.1#5335\nipset=/airhornbot.com/gfwlist\nserver=/youjism.com/127.0.0.1#5335\nipset=/youjism.com/gfwlist\nserver=/troisrivieresmini.com/127.0.0.1#5335\nipset=/troisrivieresmini.com/gfwlist\nserver=/pornaffected.com/127.0.0.1#5335\nipset=/pornaffected.com/gfwlist\nserver=/hardx.com/127.0.0.1#5335\nipset=/hardx.com/gfwlist\nserver=/gbnews.uk/127.0.0.1#5335\nipset=/gbnews.uk/gfwlist\nserver=/cup.com.hk/127.0.0.1#5335\nipset=/cup.com.hk/gfwlist\nserver=/goshemalecams.com/127.0.0.1#5335\nipset=/goshemalecams.com/gfwlist\nserver=/aod-pod-uk-live.akamaized.net/127.0.0.1#5335\nipset=/aod-pod-uk-live.akamaized.net/gfwlist\nserver=/yinac5.top/127.0.0.1#5335\nipset=/yinac5.top/gfwlist\nserver=/yieamnd.com/127.0.0.1#5335\nipset=/yieamnd.com/gfwlist\nserver=/adobedtm.com/127.0.0.1#5335\nipset=/adobedtm.com/gfwlist\nserver=/yhy.cool/127.0.0.1#5335\nipset=/yhy.cool/gfwlist\nserver=/vfsco.cz/127.0.0.1#5335\nipset=/vfsco.cz/gfwlist\nserver=/yespornpleasexxx.com/127.0.0.1#5335\nipset=/yespornpleasexxx.com/gfwlist\nserver=/mastercard.com.cy/127.0.0.1#5335\nipset=/mastercard.com.cy/gfwlist\nserver=/disney-portal.my.onetrust.com/127.0.0.1#5335\nipset=/disney-portal.my.onetrust.com/gfwlist\nserver=/yespornfree.com/127.0.0.1#5335\nipset=/yespornfree.com/gfwlist\nserver=/yes.xxx/127.0.0.1#5335\nipset=/yes.xxx/gfwlist\nserver=/hentaiworld.eu/127.0.0.1#5335\nipset=/hentaiworld.eu/gfwlist\nserver=/volvobuses.dk/127.0.0.1#5335\nipset=/volvobuses.dk/gfwlist\nserver=/buyitnowshop.net/127.0.0.1#5335\nipset=/buyitnowshop.net/gfwlist\nserver=/galegroup.com/127.0.0.1#5335\nipset=/galegroup.com/gfwlist\nserver=/yazhouse8.com/127.0.0.1#5335\nipset=/yazhouse8.com/gfwlist\nserver=/jessicaturner.com/127.0.0.1#5335\nipset=/jessicaturner.com/gfwlist\nserver=/foxsports.gt/127.0.0.1#5335\nipset=/foxsports.gt/gfwlist\nserver=/bmw-motorrad.ec/127.0.0.1#5335\nipset=/bmw-motorrad.ec/gfwlist\nserver=/yatong.info/127.0.0.1#5335\nipset=/yatong.info/gfwlist\nserver=/theteenhome.com/127.0.0.1#5335\nipset=/theteenhome.com/gfwlist\nserver=/visa.gd/127.0.0.1#5335\nipset=/visa.gd/gfwlist\nserver=/yadori.club/127.0.0.1#5335\nipset=/yadori.club/gfwlist\nserver=/jasmin.com/127.0.0.1#5335\nipset=/jasmin.com/gfwlist\nserver=/sumomo-ch.com/127.0.0.1#5335\nipset=/sumomo-ch.com/gfwlist\nserver=/avwong.com/127.0.0.1#5335\nipset=/avwong.com/gfwlist\nserver=/132288.cc/127.0.0.1#5335\nipset=/132288.cc/gfwlist\nserver=/supremacy.net/127.0.0.1#5335\nipset=/supremacy.net/gfwlist\nserver=/facebyook.com/127.0.0.1#5335\nipset=/facebyook.com/gfwlist\nserver=/gaytopcams.com/127.0.0.1#5335\nipset=/gaytopcams.com/gfwlist\nserver=/veet.co.uk/127.0.0.1#5335\nipset=/veet.co.uk/gfwlist\nserver=/xxxvogue.net/127.0.0.1#5335\nipset=/xxxvogue.net/gfwlist\nserver=/paypal-cardcash.com/127.0.0.1#5335\nipset=/paypal-cardcash.com/gfwlist\nserver=/xxxvideo.blog.br/127.0.0.1#5335\nipset=/xxxvideo.blog.br/gfwlist\nserver=/bigtitterrynova.com/127.0.0.1#5335\nipset=/bigtitterrynova.com/gfwlist\nserver=/epochweekly.com/127.0.0.1#5335\nipset=/epochweekly.com/gfwlist\nserver=/aimei133.com/127.0.0.1#5335\nipset=/aimei133.com/gfwlist\nserver=/xx159.com.cn/127.0.0.1#5335\nipset=/xx159.com.cn/gfwlist\nserver=/xxxsexocasero.com/127.0.0.1#5335\nipset=/xxxsexocasero.com/gfwlist\nserver=/xxxsexcinema.com/127.0.0.1#5335\nipset=/xxxsexcinema.com/gfwlist\nserver=/browserleaks.com/127.0.0.1#5335\nipset=/browserleaks.com/gfwlist\nserver=/xxxpornhd.pro/127.0.0.1#5335\nipset=/xxxpornhd.pro/gfwlist\nserver=/disneychannelroadtrip.com/127.0.0.1#5335\nipset=/disneychannelroadtrip.com/gfwlist\nserver=/bethesda.net/127.0.0.1#5335\nipset=/bethesda.net/gfwlist\nserver=/ausbeatsbydrdre.com/127.0.0.1#5335\nipset=/ausbeatsbydrdre.com/gfwlist\nserver=/citizenlab.org/127.0.0.1#5335\nipset=/citizenlab.org/gfwlist\nserver=/xxxmovies.fun/127.0.0.1#5335\nipset=/xxxmovies.fun/gfwlist\nserver=/alphabet.fr/127.0.0.1#5335\nipset=/alphabet.fr/gfwlist\nserver=/xxxmomporn.tube/127.0.0.1#5335\nipset=/xxxmomporn.tube/gfwlist\nserver=/facebooksuppliers.com/127.0.0.1#5335\nipset=/facebooksuppliers.com/gfwlist\nserver=/paypal-pages.com/127.0.0.1#5335\nipset=/paypal-pages.com/gfwlist\nserver=/chickstagram.com/127.0.0.1#5335\nipset=/chickstagram.com/gfwlist\nserver=/thepornlist.net/127.0.0.1#5335\nipset=/thepornlist.net/gfwlist\nserver=/bloombergvault.com/127.0.0.1#5335\nipset=/bloombergvault.com/gfwlist\nserver=/xfantazy.com/127.0.0.1#5335\nipset=/xfantazy.com/gfwlist\nserver=/bonyu.cyou/127.0.0.1#5335\nipset=/bonyu.cyou/gfwlist\nserver=/8muses.com/127.0.0.1#5335\nipset=/8muses.com/gfwlist\nserver=/xxxfuckmom.com/127.0.0.1#5335\nipset=/xxxfuckmom.com/gfwlist\nserver=/xxxforte.com/127.0.0.1#5335\nipset=/xxxforte.com/gfwlist\nserver=/xxxflare.com/127.0.0.1#5335\nipset=/xxxflare.com/gfwlist\nserver=/mastercard.ba/127.0.0.1#5335\nipset=/mastercard.ba/gfwlist\nserver=/hitbdsm.com/127.0.0.1#5335\nipset=/hitbdsm.com/gfwlist\nserver=/hardanalfucking.com/127.0.0.1#5335\nipset=/hardanalfucking.com/gfwlist\nserver=/mistresskym.com/127.0.0.1#5335\nipset=/mistresskym.com/gfwlist\nserver=/xxxbolivianas.com/127.0.0.1#5335\nipset=/xxxbolivianas.com/gfwlist\nserver=/paypal.ca/127.0.0.1#5335\nipset=/paypal.ca/gfwlist\nserver=/disney-discount.com/127.0.0.1#5335\nipset=/disney-discount.com/gfwlist\nserver=/bijukujo.club/127.0.0.1#5335\nipset=/bijukujo.club/gfwlist\nserver=/fb.me/127.0.0.1#5335\nipset=/fb.me/gfwlist\nserver=/xxx-video.cfd/127.0.0.1#5335\nipset=/xxx-video.cfd/gfwlist\nserver=/xxu.mobi/127.0.0.1#5335\nipset=/xxu.mobi/gfwlist\nserver=/needforspeedstreetkings.com/127.0.0.1#5335\nipset=/needforspeedstreetkings.com/gfwlist\nserver=/facebook123.org/127.0.0.1#5335\nipset=/facebook123.org/gfwlist\nserver=/clips4sale.com/127.0.0.1#5335\nipset=/clips4sale.com/gfwlist\nserver=/volvotrucks.co.zw/127.0.0.1#5335\nipset=/volvotrucks.co.zw/gfwlist\nserver=/xxindianporn.com/127.0.0.1#5335\nipset=/xxindianporn.com/gfwlist\nserver=/calgoncarbon.com/127.0.0.1#5335\nipset=/calgoncarbon.com/gfwlist\nserver=/pjgirls.com/127.0.0.1#5335\nipset=/pjgirls.com/gfwlist\nserver=/bahamut.com.tw/127.0.0.1#5335\nipset=/bahamut.com.tw/gfwlist\nserver=/minivancouver.ca/127.0.0.1#5335\nipset=/minivancouver.ca/gfwlist\nserver=/ngeo.com/127.0.0.1#5335\nipset=/ngeo.com/gfwlist\nserver=/minigrandriver.com/127.0.0.1#5335\nipset=/minigrandriver.com/gfwlist\nserver=/biologists.com/127.0.0.1#5335\nipset=/biologists.com/gfwlist\nserver=/ikea.ie/127.0.0.1#5335\nipset=/ikea.ie/gfwlist\nserver=/foxsports.net.br/127.0.0.1#5335\nipset=/foxsports.net.br/gfwlist\nserver=/durex.us/127.0.0.1#5335\nipset=/durex.us/gfwlist\nserver=/thechronicle.com.au/127.0.0.1#5335\nipset=/thechronicle.com.au/gfwlist\nserver=/watchespn.com/127.0.0.1#5335\nipset=/watchespn.com/gfwlist\nserver=/mirrormedia.com.tw/127.0.0.1#5335\nipset=/mirrormedia.com.tw/gfwlist\nserver=/xvideos.la/127.0.0.1#5335\nipset=/xvideos.la/gfwlist\nserver=/xvideo-jp.com/127.0.0.1#5335\nipset=/xvideo-jp.com/gfwlist\nserver=/faesebook.com/127.0.0.1#5335\nipset=/faesebook.com/gfwlist\nserver=/mini.fi/127.0.0.1#5335\nipset=/mini.fi/gfwlist\nserver=/vine.co/127.0.0.1#5335\nipset=/vine.co/gfwlist\nserver=/epinions.com/127.0.0.1#5335\nipset=/epinions.com/gfwlist\nserver=/adultrental.com/127.0.0.1#5335\nipset=/adultrental.com/gfwlist\nserver=/microsoftcloud.com/127.0.0.1#5335\nipset=/microsoftcloud.com/gfwlist\nserver=/fanbox.cc/127.0.0.1#5335\nipset=/fanbox.cc/gfwlist\nserver=/xpornblog.com/127.0.0.1#5335\nipset=/xpornblog.com/gfwlist\nserver=/xpaja.net/127.0.0.1#5335\nipset=/xpaja.net/gfwlist\nserver=/mr-tireman.jp/127.0.0.1#5335\nipset=/mr-tireman.jp/gfwlist\nserver=/xnxxporn.fun/127.0.0.1#5335\nipset=/xnxxporn.fun/gfwlist\nserver=/xnxxmovies.com/127.0.0.1#5335\nipset=/xnxxmovies.com/gfwlist\nserver=/trithucvn.net/127.0.0.1#5335\nipset=/trithucvn.net/gfwlist\nserver=/xnxxcomvideos.com/127.0.0.1#5335\nipset=/xnxxcomvideos.com/gfwlist\nserver=/physicalexam.info/127.0.0.1#5335\nipset=/physicalexam.info/gfwlist\nserver=/fank.ru/127.0.0.1#5335\nipset=/fank.ru/gfwlist\nserver=/zert.ch/127.0.0.1#5335\nipset=/zert.ch/gfwlist\nserver=/scholar.google.lv/127.0.0.1#5335\nipset=/scholar.google.lv/gfwlist\nserver=/hentaitalk.com/127.0.0.1#5335\nipset=/hentaitalk.com/gfwlist\nserver=/ebayads.com/127.0.0.1#5335\nipset=/ebayads.com/gfwlist\nserver=/xmissy.nl/127.0.0.1#5335\nipset=/xmissy.nl/gfwlist\nserver=/pokemonpicross.com/127.0.0.1#5335\nipset=/pokemonpicross.com/gfwlist\nserver=/drdrebeatsdiscount.com/127.0.0.1#5335\nipset=/drdrebeatsdiscount.com/gfwlist\nserver=/anudetube.com/127.0.0.1#5335\nipset=/anudetube.com/gfwlist\nserver=/ibook.net/127.0.0.1#5335\nipset=/ibook.net/gfwlist\nserver=/wholecitiesfoundation.org/127.0.0.1#5335\nipset=/wholecitiesfoundation.org/gfwlist\nserver=/gvt0.com/127.0.0.1#5335\nipset=/gvt0.com/gfwlist\nserver=/silversluts.com/127.0.0.1#5335\nipset=/silversluts.com/gfwlist\nserver=/minghui.org/127.0.0.1#5335\nipset=/minghui.org/gfwlist\nserver=/xdaddy.in/127.0.0.1#5335\nipset=/xdaddy.in/gfwlist\nserver=/soccermatchpass.com/127.0.0.1#5335\nipset=/soccermatchpass.com/gfwlist\nserver=/faceebook.com/127.0.0.1#5335\nipset=/faceebook.com/gfwlist\nserver=/xchina.fun/127.0.0.1#5335\nipset=/xchina.fun/gfwlist\nserver=/volvotrucks.ba/127.0.0.1#5335\nipset=/volvotrucks.ba/gfwlist\nserver=/facrbook.com/127.0.0.1#5335\nipset=/facrbook.com/gfwlist\nserver=/mastercard.sk/127.0.0.1#5335\nipset=/mastercard.sk/gfwlist\nserver=/cheapnikeoutlet.com/127.0.0.1#5335\nipset=/cheapnikeoutlet.com/gfwlist\nserver=/cbsimg.net/127.0.0.1#5335\nipset=/cbsimg.net/gfwlist\nserver=/foxentertainment.com/127.0.0.1#5335\nipset=/foxentertainment.com/gfwlist\nserver=/xbahis55.com/127.0.0.1#5335\nipset=/xbahis55.com/gfwlist\nserver=/kissjav.com/127.0.0.1#5335\nipset=/kissjav.com/gfwlist\nserver=/xanimeporn.tv/127.0.0.1#5335\nipset=/xanimeporn.tv/gfwlist\nserver=/douyintt10.me/127.0.0.1#5335\nipset=/douyintt10.me/gfwlist\nserver=/shemalepornonly.com/127.0.0.1#5335\nipset=/shemalepornonly.com/gfwlist\nserver=/embl.org/127.0.0.1#5335\nipset=/embl.org/gfwlist\nserver=/durex-slovenia.si/127.0.0.1#5335\nipset=/durex-slovenia.si/gfwlist\nserver=/ntdtvla.com/127.0.0.1#5335\nipset=/ntdtvla.com/gfwlist\nserver=/x3guide.com/127.0.0.1#5335\nipset=/x3guide.com/gfwlist\nserver=/yjcontentdelivery.com/127.0.0.1#5335\nipset=/yjcontentdelivery.com/gfwlist\nserver=/buypass.se/127.0.0.1#5335\nipset=/buypass.se/gfwlist\nserver=/alpherafs.co.nz/127.0.0.1#5335\nipset=/alpherafs.co.nz/gfwlist\nserver=/bestbuysgeeksquad.com/127.0.0.1#5335\nipset=/bestbuysgeeksquad.com/gfwlist\nserver=/myteenwebcam.com/127.0.0.1#5335\nipset=/myteenwebcam.com/gfwlist\nserver=/douya.org/127.0.0.1#5335\nipset=/douya.org/gfwlist\nserver=/ginzasonypark.jp/127.0.0.1#5335\nipset=/ginzasonypark.jp/gfwlist\nserver=/braintreepaymentsolutions.com/127.0.0.1#5335\nipset=/braintreepaymentsolutions.com/gfwlist\nserver=/winning11.com/127.0.0.1#5335\nipset=/winning11.com/gfwlist\nserver=/willyporn.com/127.0.0.1#5335\nipset=/willyporn.com/gfwlist\nserver=/wifemovies.net/127.0.0.1#5335\nipset=/wifemovies.net/gfwlist\nserver=/wifeloversporn.com/127.0.0.1#5335\nipset=/wifeloversporn.com/gfwlist\nserver=/minimontrealcentre.ca/127.0.0.1#5335\nipset=/minimontrealcentre.ca/gfwlist\nserver=/playmeow.com/127.0.0.1#5335\nipset=/playmeow.com/gfwlist\nserver=/allmomsex.com/127.0.0.1#5335\nipset=/allmomsex.com/gfwlist\nserver=/freegaypornfinder.com/127.0.0.1#5335\nipset=/freegaypornfinder.com/gfwlist\nserver=/hpvirtualthin.com/127.0.0.1#5335\nipset=/hpvirtualthin.com/gfwlist\nserver=/whitexxxtube.com/127.0.0.1#5335\nipset=/whitexxxtube.com/gfwlist\nserver=/nike-dunksb.com/127.0.0.1#5335\nipset=/nike-dunksb.com/gfwlist\nserver=/monstercheapbeatss.com/127.0.0.1#5335\nipset=/monstercheapbeatss.com/gfwlist\nserver=/whentai.com/127.0.0.1#5335\nipset=/whentai.com/gfwlist\nserver=/visa.com.pa/127.0.0.1#5335\nipset=/visa.com.pa/gfwlist\nserver=/maskedsingerfox.com/127.0.0.1#5335\nipset=/maskedsingerfox.com/gfwlist\nserver=/facebook-newsroom.com/127.0.0.1#5335\nipset=/facebook-newsroom.com/gfwlist\nserver=/ebay-discoveries.com/127.0.0.1#5335\nipset=/ebay-discoveries.com/gfwlist\nserver=/weknowporn.com/127.0.0.1#5335\nipset=/weknowporn.com/gfwlist\nserver=/cfna.com/127.0.0.1#5335\nipset=/cfna.com/gfwlist\nserver=/pornworld.to/127.0.0.1#5335\nipset=/pornworld.to/gfwlist\nserver=/pinterest.nl/127.0.0.1#5335\nipset=/pinterest.nl/gfwlist\nserver=/tospo-keiba.jp/127.0.0.1#5335\nipset=/tospo-keiba.jp/gfwlist\nserver=/linkedin.com/127.0.0.1#5335\nipset=/linkedin.com/gfwlist\nserver=/outletbeatsshop.com/127.0.0.1#5335\nipset=/outletbeatsshop.com/gfwlist\nserver=/tvbs.com.tw/127.0.0.1#5335\nipset=/tvbs.com.tw/gfwlist\nserver=/binancezh.co/127.0.0.1#5335\nipset=/binancezh.co/gfwlist\nserver=/watchersweb.com/127.0.0.1#5335\nipset=/watchersweb.com/gfwlist\nserver=/warddogs.com/127.0.0.1#5335\nipset=/warddogs.com/gfwlist\nserver=/vrfdgswx.xyz/127.0.0.1#5335\nipset=/vrfdgswx.xyz/gfwlist\nserver=/youtube.cr/127.0.0.1#5335\nipset=/youtube.cr/gfwlist\nserver=/newsmaxtv.com/127.0.0.1#5335\nipset=/newsmaxtv.com/gfwlist\nserver=/visa.com.kn/127.0.0.1#5335\nipset=/visa.com.kn/gfwlist\nserver=/pornohutdeutsch.net/127.0.0.1#5335\nipset=/pornohutdeutsch.net/gfwlist\nserver=/watchmygf.net/127.0.0.1#5335\nipset=/watchmygf.net/gfwlist\nserver=/mini-connected.co.uk/127.0.0.1#5335\nipset=/mini-connected.co.uk/gfwlist\nserver=/voyeurhouse.com/127.0.0.1#5335\nipset=/voyeurhouse.com/gfwlist\nserver=/pornovenezolano.com.ve/127.0.0.1#5335\nipset=/pornovenezolano.com.ve/gfwlist\nserver=/vomitkings.com/127.0.0.1#5335\nipset=/vomitkings.com/gfwlist\nserver=/onesiterip.com/127.0.0.1#5335\nipset=/onesiterip.com/gfwlist\nserver=/4kup.net/127.0.0.1#5335\nipset=/4kup.net/gfwlist\nserver=/virtualpartyworld.com/127.0.0.1#5335\nipset=/virtualpartyworld.com/gfwlist\nserver=/vintagexxxfilms.com/127.0.0.1#5335\nipset=/vintagexxxfilms.com/gfwlist\nserver=/megatitsminka.com/127.0.0.1#5335\nipset=/megatitsminka.com/gfwlist\nserver=/hycgm1324.shop/127.0.0.1#5335\nipset=/hycgm1324.shop/gfwlist\nserver=/celebritynakeds.com/127.0.0.1#5335\nipset=/celebritynakeds.com/gfwlist\nserver=/viet.sex/127.0.0.1#5335\nipset=/viet.sex/gfwlist\nserver=/bmw-connecteddrive.com.mt/127.0.0.1#5335\nipset=/bmw-connecteddrive.com.mt/gfwlist\nserver=/kenyasexparadise.com/127.0.0.1#5335\nipset=/kenyasexparadise.com/gfwlist\nserver=/only-xxx.com/127.0.0.1#5335\nipset=/only-xxx.com/gfwlist\nserver=/menhdv.com/127.0.0.1#5335\nipset=/menhdv.com/gfwlist\nserver=/malayporn.site/127.0.0.1#5335\nipset=/malayporn.site/gfwlist\nserver=/nike.shop/127.0.0.1#5335\nipset=/nike.shop/gfwlist\nserver=/bookshome.net/127.0.0.1#5335\nipset=/bookshome.net/gfwlist\nserver=/youtube.ca/127.0.0.1#5335\nipset=/youtube.ca/gfwlist\nserver=/harpercollinschildrensbooks.co.uk/127.0.0.1#5335\nipset=/harpercollinschildrensbooks.co.uk/gfwlist\nserver=/volvobuses.com.ar/127.0.0.1#5335\nipset=/volvobuses.com.ar/gfwlist\nserver=/4ksex.me/127.0.0.1#5335\nipset=/4ksex.me/gfwlist\nserver=/videosxxxnicaragua.top/127.0.0.1#5335\nipset=/videosxxxnicaragua.top/gfwlist\nserver=/disney.co.za/127.0.0.1#5335\nipset=/disney.co.za/gfwlist\nserver=/apress.com/127.0.0.1#5335\nipset=/apress.com/gfwlist\nserver=/nikefactorystore.com/127.0.0.1#5335\nipset=/nikefactorystore.com/gfwlist\nserver=/starwarsjedifallenorder.com/127.0.0.1#5335\nipset=/starwarsjedifallenorder.com/gfwlist\nserver=/mcisco.com/127.0.0.1#5335\nipset=/mcisco.com/gfwlist\nserver=/drebeatsoutletstore.com/127.0.0.1#5335\nipset=/drebeatsoutletstore.com/gfwlist\nserver=/choicereviews.org/127.0.0.1#5335\nipset=/choicereviews.org/gfwlist\nserver=/vanish.pt/127.0.0.1#5335\nipset=/vanish.pt/gfwlist\nserver=/simg.jp/127.0.0.1#5335\nipset=/simg.jp/gfwlist\nserver=/picsee.pro/127.0.0.1#5335\nipset=/picsee.pro/gfwlist\nserver=/natgeomaps.com/127.0.0.1#5335\nipset=/natgeomaps.com/gfwlist\nserver=/free18.net/127.0.0.1#5335\nipset=/free18.net/gfwlist\nserver=/alphabet.com.pl/127.0.0.1#5335\nipset=/alphabet.com.pl/gfwlist\nserver=/vercomicsporno.xxx/127.0.0.1#5335\nipset=/vercomicsporno.xxx/gfwlist\nserver=/ftiecla.com/127.0.0.1#5335\nipset=/ftiecla.com/gfwlist\nserver=/vaginalultrasound.info/127.0.0.1#5335\nipset=/vaginalultrasound.info/gfwlist\nserver=/v7hds.com/127.0.0.1#5335\nipset=/v7hds.com/gfwlist\nserver=/visaluxuryhotelcollection.com/127.0.0.1#5335\nipset=/visaluxuryhotelcollection.com/gfwlist\nserver=/face-book.com/127.0.0.1#5335\nipset=/face-book.com/gfwlist\nserver=/fnlondon.com/127.0.0.1#5335\nipset=/fnlondon.com/gfwlist\nserver=/ikea.com.ru/127.0.0.1#5335\nipset=/ikea.com.ru/gfwlist\nserver=/pearson.es/127.0.0.1#5335\nipset=/pearson.es/gfwlist\nserver=/tgutube.com/127.0.0.1#5335\nipset=/tgutube.com/gfwlist\nserver=/urasma.com/127.0.0.1#5335\nipset=/urasma.com/gfwlist\nserver=/akaeai.com/127.0.0.1#5335\nipset=/akaeai.com/gfwlist\nserver=/beautifulandbusty.com/127.0.0.1#5335\nipset=/beautifulandbusty.com/gfwlist\nserver=/reutersmedia.net/127.0.0.1#5335\nipset=/reutersmedia.net/gfwlist\nserver=/icloud.hu/127.0.0.1#5335\nipset=/icloud.hu/gfwlist\nserver=/ibm.com/127.0.0.1#5335\nipset=/ibm.com/gfwlist\nserver=/uncensoredsexparties.com/127.0.0.1#5335\nipset=/uncensoredsexparties.com/gfwlist\nserver=/bridgestonetire.ca/127.0.0.1#5335\nipset=/bridgestonetire.ca/gfwlist\nserver=/openssl.org/127.0.0.1#5335\nipset=/openssl.org/gfwlist\nserver=/ujapanesesex.com/127.0.0.1#5335\nipset=/ujapanesesex.com/gfwlist\nserver=/telegram.org/127.0.0.1#5335\nipset=/telegram.org/gfwlist\nserver=/tytng189.com/127.0.0.1#5335\nipset=/tytng189.com/gfwlist\nserver=/aple.com/127.0.0.1#5335\nipset=/aple.com/gfwlist\nserver=/tomovie.net/127.0.0.1#5335\nipset=/tomovie.net/gfwlist\nserver=/ius.io/127.0.0.1#5335\nipset=/ius.io/gfwlist\nserver=/tushy.com/127.0.0.1#5335\nipset=/tushy.com/gfwlist\nserver=/glyphsapp.com/127.0.0.1#5335\nipset=/glyphsapp.com/gfwlist\nserver=/nikelunarglide.com/127.0.0.1#5335\nipset=/nikelunarglide.com/gfwlist\nserver=/fxn.ws/127.0.0.1#5335\nipset=/fxn.ws/gfwlist\nserver=/bmw.lt/127.0.0.1#5335\nipset=/bmw.lt/gfwlist\nserver=/ebayforcharity.org/127.0.0.1#5335\nipset=/ebayforcharity.org/gfwlist\nserver=/ebay-inc.net/127.0.0.1#5335\nipset=/ebay-inc.net/gfwlist\nserver=/eracom.com.tw/127.0.0.1#5335\nipset=/eracom.com.tw/gfwlist\nserver=/thesims3.com/127.0.0.1#5335\nipset=/thesims3.com/gfwlist\nserver=/tubepornstars.com/127.0.0.1#5335\nipset=/tubepornstars.com/gfwlist\nserver=/webkit.org/127.0.0.1#5335\nipset=/webkit.org/gfwlist\nserver=/youtubegaming.com/127.0.0.1#5335\nipset=/youtubegaming.com/gfwlist\nserver=/hcbdsm.com/127.0.0.1#5335\nipset=/hcbdsm.com/gfwlist\nserver=/tubeorigin.com/127.0.0.1#5335\nipset=/tubeorigin.com/gfwlist\nserver=/youtube.tv/127.0.0.1#5335\nipset=/youtube.tv/gfwlist\nserver=/monsterbeatsbydreaustraliacheap.com/127.0.0.1#5335\nipset=/monsterbeatsbydreaustraliacheap.com/gfwlist\nserver=/connaissancesfinancierespratiques.ca/127.0.0.1#5335\nipset=/connaissancesfinancierespratiques.ca/gfwlist\nserver=/tiendabestbuy.com/127.0.0.1#5335\nipset=/tiendabestbuy.com/gfwlist\nserver=/tubedupe.com/127.0.0.1#5335\nipset=/tubedupe.com/gfwlist\nserver=/tubecaptain.com/127.0.0.1#5335\nipset=/tubecaptain.com/gfwlist\nserver=/tube8zoo.com/127.0.0.1#5335\nipset=/tube8zoo.com/gfwlist\nserver=/tube-pornomovs.com/127.0.0.1#5335\nipset=/tube-pornomovs.com/gfwlist\nserver=/alphera.com.hk/127.0.0.1#5335\nipset=/alphera.com.hk/gfwlist\nserver=/ftopx.com/127.0.0.1#5335\nipset=/ftopx.com/gfwlist\nserver=/tiohentai.com/127.0.0.1#5335\nipset=/tiohentai.com/gfwlist\nserver=/uug23.com/127.0.0.1#5335\nipset=/uug23.com/gfwlist\nserver=/kbdxlesx.xyz/127.0.0.1#5335\nipset=/kbdxlesx.xyz/gfwlist\nserver=/audiomonsterbeatsonline.com/127.0.0.1#5335\nipset=/audiomonsterbeatsonline.com/gfwlist\nserver=/justhd.xyz/127.0.0.1#5335\nipset=/justhd.xyz/gfwlist\nserver=/mastercard.dk/127.0.0.1#5335\nipset=/mastercard.dk/gfwlist\nserver=/travelgirls.com/127.0.0.1#5335\nipset=/travelgirls.com/gfwlist\nserver=/sexgame.com/127.0.0.1#5335\nipset=/sexgame.com/gfwlist\nserver=/transangels.com/127.0.0.1#5335\nipset=/transangels.com/gfwlist\nserver=/yahoo.be/127.0.0.1#5335\nipset=/yahoo.be/gfwlist\nserver=/colegialasreales.com/127.0.0.1#5335\nipset=/colegialasreales.com/gfwlist\nserver=/cbssvideo.com/127.0.0.1#5335\nipset=/cbssvideo.com/gfwlist\nserver=/imac.eu/127.0.0.1#5335\nipset=/imac.eu/gfwlist\nserver=/msftauth.net/127.0.0.1#5335\nipset=/msftauth.net/gfwlist\nserver=/binancezh.top/127.0.0.1#5335\nipset=/binancezh.top/gfwlist\nserver=/foxnewsrundown.com/127.0.0.1#5335\nipset=/foxnewsrundown.com/gfwlist\nserver=/akamai-platform-staging.com/127.0.0.1#5335\nipset=/akamai-platform-staging.com/gfwlist\nserver=/tophentaicomics.com/127.0.0.1#5335\nipset=/tophentaicomics.com/gfwlist\nserver=/tophentai.biz/127.0.0.1#5335\nipset=/tophentai.biz/gfwlist\nserver=/facebooktv.net/127.0.0.1#5335\nipset=/facebooktv.net/gfwlist\nserver=/etherscan.io/127.0.0.1#5335\nipset=/etherscan.io/gfwlist\nserver=/mingwatch.com/127.0.0.1#5335\nipset=/mingwatch.com/gfwlist\nserver=/natgeokidsbooks.co.uk/127.0.0.1#5335\nipset=/natgeokidsbooks.co.uk/gfwlist\nserver=/airwick.co.nz/127.0.0.1#5335\nipset=/airwick.co.nz/gfwlist\nserver=/toperoticartsites.com/127.0.0.1#5335\nipset=/toperoticartsites.com/gfwlist\nserver=/intel.uk/127.0.0.1#5335\nipset=/intel.uk/gfwlist\nserver=/tokyomotion.net/127.0.0.1#5335\nipset=/tokyomotion.net/gfwlist\nserver=/mariosupersluggers.com/127.0.0.1#5335\nipset=/mariosupersluggers.com/gfwlist\nserver=/byspotify.com/127.0.0.1#5335\nipset=/byspotify.com/gfwlist\nserver=/ebayon.net/127.0.0.1#5335\nipset=/ebayon.net/gfwlist\nserver=/titsintops.com/127.0.0.1#5335\nipset=/titsintops.com/gfwlist\nserver=/collabora.com/127.0.0.1#5335\nipset=/collabora.com/gfwlist\nserver=/sonyentertainmentnetwork.com/127.0.0.1#5335\nipset=/sonyentertainmentnetwork.com/gfwlist\nserver=/hentai24h.org/127.0.0.1#5335\nipset=/hentai24h.org/gfwlist\nserver=/visa.com.au/127.0.0.1#5335\nipset=/visa.com.au/gfwlist\nserver=/3dsexmovies.biz/127.0.0.1#5335\nipset=/3dsexmovies.biz/gfwlist\nserver=/tinhduc.org/127.0.0.1#5335\nipset=/tinhduc.org/gfwlist\nserver=/timo0.com/127.0.0.1#5335\nipset=/timo0.com/gfwlist\nserver=/fbsbx.net/127.0.0.1#5335\nipset=/fbsbx.net/gfwlist\nserver=/thumbnailseries.com/127.0.0.1#5335\nipset=/thumbnailseries.com/gfwlist\nserver=/graneodin.com.mx/127.0.0.1#5335\nipset=/graneodin.com.mx/gfwlist\nserver=/porndig.com/127.0.0.1#5335\nipset=/porndig.com/gfwlist\nserver=/pornscum.com/127.0.0.1#5335\nipset=/pornscum.com/gfwlist\nserver=/akamai-sucks.net/127.0.0.1#5335\nipset=/akamai-sucks.net/gfwlist\nserver=/facebookporno.net/127.0.0.1#5335\nipset=/facebookporno.net/gfwlist\nserver=/metartnetwork.com/127.0.0.1#5335\nipset=/metartnetwork.com/gfwlist\nserver=/r34porn.net/127.0.0.1#5335\nipset=/r34porn.net/gfwlist\nserver=/hairy-beauty.com/127.0.0.1#5335\nipset=/hairy-beauty.com/gfwlist\nserver=/scoreclassics.com/127.0.0.1#5335\nipset=/scoreclassics.com/gfwlist\nserver=/onionshare.org/127.0.0.1#5335\nipset=/onionshare.org/gfwlist\nserver=/pscdn.co/127.0.0.1#5335\nipset=/pscdn.co/gfwlist\nserver=/uncensoredhentai.xxx/127.0.0.1#5335\nipset=/uncensoredhentai.xxx/gfwlist\nserver=/smyw.org/127.0.0.1#5335\nipset=/smyw.org/gfwlist\nserver=/porn93.cc/127.0.0.1#5335\nipset=/porn93.cc/gfwlist\nserver=/redino.tw/127.0.0.1#5335\nipset=/redino.tw/gfwlist\nserver=/thehabibshow.com/127.0.0.1#5335\nipset=/thehabibshow.com/gfwlist\nserver=/thefappening.wiki/127.0.0.1#5335\nipset=/thefappening.wiki/gfwlist\nserver=/mini.de/127.0.0.1#5335\nipset=/mini.de/gfwlist\nserver=/academic.eb.com/127.0.0.1#5335\nipset=/academic.eb.com/gfwlist\nserver=/rsf.org/127.0.0.1#5335\nipset=/rsf.org/gfwlist\nserver=/thebondagefiles.com/127.0.0.1#5335\nipset=/thebondagefiles.com/gfwlist\nserver=/russianrape.org/127.0.0.1#5335\nipset=/russianrape.org/gfwlist\nserver=/gaysonic.eu/127.0.0.1#5335\nipset=/gaysonic.eu/gfwlist\nserver=/xxxpenguin.com/127.0.0.1#5335\nipset=/xxxpenguin.com/gfwlist\nserver=/travelcontroller.com/127.0.0.1#5335\nipset=/travelcontroller.com/gfwlist\nserver=/thaigirls100.net/127.0.0.1#5335\nipset=/thaigirls100.net/gfwlist\nserver=/amsterdamhotescort.com/127.0.0.1#5335\nipset=/amsterdamhotescort.com/gfwlist\nserver=/msnbc.com/127.0.0.1#5335\nipset=/msnbc.com/gfwlist\nserver=/hpcpi.com/127.0.0.1#5335\nipset=/hpcpi.com/gfwlist\nserver=/cartoonville.net/127.0.0.1#5335\nipset=/cartoonville.net/gfwlist\nserver=/boyztube.com/127.0.0.1#5335\nipset=/boyztube.com/gfwlist\nserver=/teenwebcamtube.com/127.0.0.1#5335\nipset=/teenwebcamtube.com/gfwlist\nserver=/illusionchn.com/127.0.0.1#5335\nipset=/illusionchn.com/gfwlist\nserver=/azatliq.org/127.0.0.1#5335\nipset=/azatliq.org/gfwlist\nserver=/devilsfilm.com/127.0.0.1#5335\nipset=/devilsfilm.com/gfwlist\nserver=/ic.ac.uk/127.0.0.1#5335\nipset=/ic.ac.uk/gfwlist\nserver=/blowjobit.com/127.0.0.1#5335\nipset=/blowjobit.com/gfwlist\nserver=/teen3x.mobi/127.0.0.1#5335\nipset=/teen3x.mobi/gfwlist\nserver=/ciscofax.com/127.0.0.1#5335\nipset=/ciscofax.com/gfwlist\nserver=/friendfeedmedia.com/127.0.0.1#5335\nipset=/friendfeedmedia.com/gfwlist\nserver=/netflixdnstest7.com/127.0.0.1#5335\nipset=/netflixdnstest7.com/gfwlist\nserver=/mirrorsedge2d.com/127.0.0.1#5335\nipset=/mirrorsedge2d.com/gfwlist\nserver=/prastitutki.ru/127.0.0.1#5335\nipset=/prastitutki.ru/gfwlist\nserver=/disneycruisebrasil.com/127.0.0.1#5335\nipset=/disneycruisebrasil.com/gfwlist\nserver=/uk-exhibitionist.com/127.0.0.1#5335\nipset=/uk-exhibitionist.com/gfwlist\nserver=/taxi69.com/127.0.0.1#5335\nipset=/taxi69.com/gfwlist\nserver=/disney.id/127.0.0.1#5335\nipset=/disney.id/gfwlist\nserver=/ovid.com/127.0.0.1#5335\nipset=/ovid.com/gfwlist\nserver=/tabooporns.com/127.0.0.1#5335\nipset=/tabooporns.com/gfwlist\nserver=/foxsports.sv/127.0.0.1#5335\nipset=/foxsports.sv/gfwlist\nserver=/sxshentai.com/127.0.0.1#5335\nipset=/sxshentai.com/gfwlist\nserver=/paysitesreviews.net/127.0.0.1#5335\nipset=/paysitesreviews.net/gfwlist\nserver=/youtube.ie/127.0.0.1#5335\nipset=/youtube.ie/gfwlist\nserver=/cloudimage.io/127.0.0.1#5335\nipset=/cloudimage.io/gfwlist\nserver=/disneyaulani.com/127.0.0.1#5335\nipset=/disneyaulani.com/gfwlist\nserver=/superhqporn.com/127.0.0.1#5335\nipset=/superhqporn.com/gfwlist\nserver=/supergratisporno.com/127.0.0.1#5335\nipset=/supergratisporno.com/gfwlist\nserver=/beatstoreusa.com/127.0.0.1#5335\nipset=/beatstoreusa.com/gfwlist\nserver=/deviantart.com/127.0.0.1#5335\nipset=/deviantart.com/gfwlist\nserver=/sunporno.com/127.0.0.1#5335\nipset=/sunporno.com/gfwlist\nserver=/globalsign-media.com/127.0.0.1#5335\nipset=/globalsign-media.com/gfwlist\nserver=/mediachinese.com/127.0.0.1#5335\nipset=/mediachinese.com/gfwlist\nserver=/streamsex.com/127.0.0.1#5335\nipset=/streamsex.com/gfwlist\nserver=/stileproject.com/127.0.0.1#5335\nipset=/stileproject.com/gfwlist\nserver=/taiav.com/127.0.0.1#5335\nipset=/taiav.com/gfwlist\nserver=/amateursvid.com/127.0.0.1#5335\nipset=/amateursvid.com/gfwlist\nserver=/ikea.net/127.0.0.1#5335\nipset=/ikea.net/gfwlist\nserver=/jennylist.xyz/127.0.0.1#5335\nipset=/jennylist.xyz/gfwlist\nserver=/microsoft-ppe.com/127.0.0.1#5335\nipset=/microsoft-ppe.com/gfwlist\nserver=/supplybestjerseys.com/127.0.0.1#5335\nipset=/supplybestjerseys.com/gfwlist\nserver=/sshs.pw/127.0.0.1#5335\nipset=/sshs.pw/gfwlist\nserver=/nexusmods.com/127.0.0.1#5335\nipset=/nexusmods.com/gfwlist\nserver=/ebayclassifiedsgroup.org/127.0.0.1#5335\nipset=/ebayclassifiedsgroup.org/gfwlist\nserver=/riot-games.com/127.0.0.1#5335\nipset=/riot-games.com/gfwlist\nserver=/spectraltube.com/127.0.0.1#5335\nipset=/spectraltube.com/gfwlist\nserver=/youtube.me/127.0.0.1#5335\nipset=/youtube.me/gfwlist\nserver=/hbo.com.c.footprint.net/127.0.0.1#5335\nipset=/hbo.com.c.footprint.net/gfwlist\nserver=/thehun.net/127.0.0.1#5335\nipset=/thehun.net/gfwlist\nserver=/smutcam.com/127.0.0.1#5335\nipset=/smutcam.com/gfwlist\nserver=/sksarab.top/127.0.0.1#5335\nipset=/sksarab.top/gfwlist\nserver=/millymarks.com/127.0.0.1#5335\nipset=/millymarks.com/gfwlist\nserver=/nike.hk/127.0.0.1#5335\nipset=/nike.hk/gfwlist\nserver=/pki-poste.ch/127.0.0.1#5335\nipset=/pki-poste.ch/gfwlist\nserver=/electrochem.org/127.0.0.1#5335\nipset=/electrochem.org/gfwlist\nserver=/newsmax.com/127.0.0.1#5335\nipset=/newsmax.com/gfwlist\nserver=/cashvideotube.com/127.0.0.1#5335\nipset=/cashvideotube.com/gfwlist\nserver=/firestone.com.mx/127.0.0.1#5335\nipset=/firestone.com.mx/gfwlist\nserver=/sisisl.com/127.0.0.1#5335\nipset=/sisisl.com/gfwlist\nserver=/bloombergindices.com/127.0.0.1#5335\nipset=/bloombergindices.com/gfwlist\nserver=/instagramq.com/127.0.0.1#5335\nipset=/instagramq.com/gfwlist\nserver=/hpshooping.com/127.0.0.1#5335\nipset=/hpshooping.com/gfwlist\nserver=/orl.ly/127.0.0.1#5335\nipset=/orl.ly/gfwlist\nserver=/nikeshoemarket.com/127.0.0.1#5335\nipset=/nikeshoemarket.com/gfwlist\nserver=/chromium.org/127.0.0.1#5335\nipset=/chromium.org/gfwlist\nserver=/free-3d-porn.com/127.0.0.1#5335\nipset=/free-3d-porn.com/gfwlist\nserver=/av1688.cc/127.0.0.1#5335\nipset=/av1688.cc/gfwlist\nserver=/shittytube.com/127.0.0.1#5335\nipset=/shittytube.com/gfwlist\nserver=/mini-bahrain.com/127.0.0.1#5335\nipset=/mini-bahrain.com/gfwlist\nserver=/bloomberg.com.br/127.0.0.1#5335\nipset=/bloomberg.com.br/gfwlist\nserver=/shithd.com/127.0.0.1#5335\nipset=/shithd.com/gfwlist\nserver=/javmix.tv/127.0.0.1#5335\nipset=/javmix.tv/gfwlist\nserver=/humoron.com/127.0.0.1#5335\nipset=/humoron.com/gfwlist\nserver=/shemale-porn-galls.com/127.0.0.1#5335\nipset=/shemale-porn-galls.com/gfwlist\nserver=/masterclass.com/127.0.0.1#5335\nipset=/masterclass.com/gfwlist\nserver=/accuweather.com/127.0.0.1#5335\nipset=/accuweather.com/gfwlist\nserver=/volvobuses.co.za/127.0.0.1#5335\nipset=/volvobuses.co.za/gfwlist\nserver=/sexywetpussy.com/127.0.0.1#5335\nipset=/sexywetpussy.com/gfwlist\nserver=/sexyteenssite.com/127.0.0.1#5335\nipset=/sexyteenssite.com/gfwlist\nserver=/sexysites.com.ph/127.0.0.1#5335\nipset=/sexysites.com.ph/gfwlist\nserver=/theepochtimes.com/127.0.0.1#5335\nipset=/theepochtimes.com/gfwlist\nserver=/asredas.com/127.0.0.1#5335\nipset=/asredas.com/gfwlist\nserver=/jav.land/127.0.0.1#5335\nipset=/jav.land/gfwlist\nserver=/hot2048.com/127.0.0.1#5335\nipset=/hot2048.com/gfwlist\nserver=/sexyfuckgames.com/127.0.0.1#5335\nipset=/sexyfuckgames.com/gfwlist\nserver=/youtubeembeddedplayer.googleapis.com/127.0.0.1#5335\nipset=/youtubeembeddedplayer.googleapis.com/gfwlist\nserver=/gladporn.com/127.0.0.1#5335\nipset=/gladporn.com/gfwlist\nserver=/4ebaytraders.com/127.0.0.1#5335\nipset=/4ebaytraders.com/gfwlist\nserver=/youtube.kz/127.0.0.1#5335\nipset=/youtube.kz/gfwlist\nserver=/bmw-dubai.com/127.0.0.1#5335\nipset=/bmw-dubai.com/gfwlist\nserver=/ac-pocketcamp.com/127.0.0.1#5335\nipset=/ac-pocketcamp.com/gfwlist\nserver=/bmw.uz/127.0.0.1#5335\nipset=/bmw.uz/gfwlist\nserver=/google.com.br/127.0.0.1#5335\nipset=/google.com.br/gfwlist\nserver=/redtube.blog/127.0.0.1#5335\nipset=/redtube.blog/gfwlist\nserver=/sexxxdoll.com/127.0.0.1#5335\nipset=/sexxxdoll.com/gfwlist\nserver=/sexxhd.de/127.0.0.1#5335\nipset=/sexxhd.de/gfwlist\nserver=/nike0594.com/127.0.0.1#5335\nipset=/nike0594.com/gfwlist\nserver=/sexualhentai.net/127.0.0.1#5335\nipset=/sexualhentai.net/gfwlist\nserver=/infowarsmedia.com/127.0.0.1#5335\nipset=/infowarsmedia.com/gfwlist\nserver=/youwuss.com/127.0.0.1#5335\nipset=/youwuss.com/gfwlist\nserver=/qr.ae/127.0.0.1#5335\nipset=/qr.ae/gfwlist\nserver=/sapphicerotica.com/127.0.0.1#5335\nipset=/sapphicerotica.com/gfwlist\nserver=/sexstoriespost.com/127.0.0.1#5335\nipset=/sexstoriespost.com/gfwlist\nserver=/sexsimulator.com/127.0.0.1#5335\nipset=/sexsimulator.com/gfwlist\nserver=/scholar.google.com.ar/127.0.0.1#5335\nipset=/scholar.google.com.ar/gfwlist\nserver=/sexopornolive.com/127.0.0.1#5335\nipset=/sexopornolive.com/gfwlist\nserver=/bmw-kuwait.com/127.0.0.1#5335\nipset=/bmw-kuwait.com/gfwlist\nserver=/drbl.in/127.0.0.1#5335\nipset=/drbl.in/gfwlist\nserver=/applecentre.com.au/127.0.0.1#5335\nipset=/applecentre.com.au/gfwlist\nserver=/xhcdn.com/127.0.0.1#5335\nipset=/xhcdn.com/gfwlist\nserver=/mearki.com/127.0.0.1#5335\nipset=/mearki.com/gfwlist\nserver=/sexmix.net/127.0.0.1#5335\nipset=/sexmix.net/gfwlist\nserver=/spiceworks.com/127.0.0.1#5335\nipset=/spiceworks.com/gfwlist\nserver=/sexkorea.net/127.0.0.1#5335\nipset=/sexkorea.net/gfwlist\nserver=/sexiranian.party/127.0.0.1#5335\nipset=/sexiranian.party/gfwlist\nserver=/itunes12days.com/127.0.0.1#5335\nipset=/itunes12days.com/gfwlist\nserver=/sexhotgames.com/127.0.0.1#5335\nipset=/sexhotgames.com/gfwlist\nserver=/ebaystatic.com/127.0.0.1#5335\nipset=/ebaystatic.com/gfwlist\nserver=/my45.com/127.0.0.1#5335\nipset=/my45.com/gfwlist\nserver=/youtube-ui.l.google.com/127.0.0.1#5335\nipset=/youtube-ui.l.google.com/gfwlist\nserver=/directvcinema.com/127.0.0.1#5335\nipset=/directvcinema.com/gfwlist\nserver=/sexgames.cc/127.0.0.1#5335\nipset=/sexgames.cc/gfwlist\nserver=/appledarwin.net/127.0.0.1#5335\nipset=/appledarwin.net/gfwlist\nserver=/lolesports.com/127.0.0.1#5335\nipset=/lolesports.com/gfwlist\nserver=/bioware.com/127.0.0.1#5335\nipset=/bioware.com/gfwlist\nserver=/sexfilmeporno.com/127.0.0.1#5335\nipset=/sexfilmeporno.com/gfwlist\nserver=/joanabliss.com/127.0.0.1#5335\nipset=/joanabliss.com/gfwlist\nserver=/sexedanslepre.net/127.0.0.1#5335\nipset=/sexedanslepre.net/gfwlist\nserver=/sexdug.com/127.0.0.1#5335\nipset=/sexdug.com/gfwlist\nserver=/facebookappcenter.org/127.0.0.1#5335\nipset=/facebookappcenter.org/gfwlist\nserver=/sexdolls.com/127.0.0.1#5335\nipset=/sexdolls.com/gfwlist\nserver=/ieee-ims.org/127.0.0.1#5335\nipset=/ieee-ims.org/gfwlist\nserver=/eromanga-ace.com/127.0.0.1#5335\nipset=/eromanga-ace.com/gfwlist\nserver=/pinterest.th/127.0.0.1#5335\nipset=/pinterest.th/gfwlist\nserver=/nikecompany.com/127.0.0.1#5335\nipset=/nikecompany.com/gfwlist\nserver=/marvelpinball.com/127.0.0.1#5335\nipset=/marvelpinball.com/gfwlist\nserver=/sexanimalvideos.com/127.0.0.1#5335\nipset=/sexanimalvideos.com/gfwlist\nserver=/sexalarab.com/127.0.0.1#5335\nipset=/sexalarab.com/gfwlist\nserver=/paily.org/127.0.0.1#5335\nipset=/paily.org/gfwlist\nserver=/bmw.si/127.0.0.1#5335\nipset=/bmw.si/gfwlist\nserver=/pinterest.tw/127.0.0.1#5335\nipset=/pinterest.tw/gfwlist\nserver=/sex-hay.pro/127.0.0.1#5335\nipset=/sex-hay.pro/gfwlist\nserver=/mpfinance.com/127.0.0.1#5335\nipset=/mpfinance.com/gfwlist\nserver=/familypies.net/127.0.0.1#5335\nipset=/familypies.net/gfwlist\nserver=/paypalx.com/127.0.0.1#5335\nipset=/paypalx.com/gfwlist\nserver=/sex-gif.org/127.0.0.1#5335\nipset=/sex-gif.org/gfwlist\nserver=/fortuneinsight.com/127.0.0.1#5335\nipset=/fortuneinsight.com/gfwlist\nserver=/sessoamatorialeitaliano.com/127.0.0.1#5335\nipset=/sessoamatorialeitaliano.com/gfwlist\nserver=/g-tvapp.com/127.0.0.1#5335\nipset=/g-tvapp.com/gfwlist\nserver=/camcam.cc/127.0.0.1#5335\nipset=/camcam.cc/gfwlist\nserver=/texttobuy.org/127.0.0.1#5335\nipset=/texttobuy.org/gfwlist\nserver=/publicagentxxx.com/127.0.0.1#5335\nipset=/publicagentxxx.com/gfwlist\nserver=/pokedex3d.com/127.0.0.1#5335\nipset=/pokedex3d.com/gfwlist\nserver=/search.xxx/127.0.0.1#5335\nipset=/search.xxx/gfwlist\nserver=/myfoxlosangeles.com/127.0.0.1#5335\nipset=/myfoxlosangeles.com/gfwlist\nserver=/vanish.com.co/127.0.0.1#5335\nipset=/vanish.com.co/gfwlist\nserver=/primevideo.com/127.0.0.1#5335\nipset=/primevideo.com/gfwlist\nserver=/beatsstudiosite.com/127.0.0.1#5335\nipset=/beatsstudiosite.com/gfwlist\nserver=/comodoca3.com/127.0.0.1#5335\nipset=/comodoca3.com/gfwlist\nserver=/bextbuy.com/127.0.0.1#5335\nipset=/bextbuy.com/gfwlist\nserver=/avhome.one/127.0.0.1#5335\nipset=/avhome.one/gfwlist\nserver=/yingpianqu.com/127.0.0.1#5335\nipset=/yingpianqu.com/gfwlist\nserver=/riotgames.co.kr/127.0.0.1#5335\nipset=/riotgames.co.kr/gfwlist\nserver=/scorediscounts.club/127.0.0.1#5335\nipset=/scorediscounts.club/gfwlist\nserver=/bigtithooker.com/127.0.0.1#5335\nipset=/bigtithooker.com/gfwlist\nserver=/azattyk.org/127.0.0.1#5335\nipset=/azattyk.org/gfwlist\nserver=/callhulu.com/127.0.0.1#5335\nipset=/callhulu.com/gfwlist\nserver=/cartoon18.com/127.0.0.1#5335\nipset=/cartoon18.com/gfwlist\nserver=/savitabhabhi.vip/127.0.0.1#5335\nipset=/savitabhabhi.vip/gfwlist\nserver=/krakenjs.com/127.0.0.1#5335\nipset=/krakenjs.com/gfwlist\nserver=/facegbok.com/127.0.0.1#5335\nipset=/facegbok.com/gfwlist\nserver=/gaypornsky.com/127.0.0.1#5335\nipset=/gaypornsky.com/gfwlist\nserver=/xoom.io/127.0.0.1#5335\nipset=/xoom.io/gfwlist\nserver=/ebayshopping.org/127.0.0.1#5335\nipset=/ebayshopping.org/gfwlist\nserver=/blogspot.com.eg/127.0.0.1#5335\nipset=/blogspot.com.eg/gfwlist\nserver=/ruvideos.net/127.0.0.1#5335\nipset=/ruvideos.net/gfwlist\nserver=/paypal-japan.com/127.0.0.1#5335\nipset=/paypal-japan.com/gfwlist\nserver=/isexlove.tw/127.0.0.1#5335\nipset=/isexlove.tw/gfwlist\nserver=/taylorandfrancis.com/127.0.0.1#5335\nipset=/taylorandfrancis.com/gfwlist\nserver=/moreheadphones.com/127.0.0.1#5335\nipset=/moreheadphones.com/gfwlist\nserver=/apple.ae/127.0.0.1#5335\nipset=/apple.ae/gfwlist\nserver=/ebaymotors.com/127.0.0.1#5335\nipset=/ebaymotors.com/gfwlist\nserver=/6e8xr2gk.me/127.0.0.1#5335\nipset=/6e8xr2gk.me/gfwlist\nserver=/rule34pornvids.com/127.0.0.1#5335\nipset=/rule34pornvids.com/gfwlist\nserver=/scholar.google.com.ua/127.0.0.1#5335\nipset=/scholar.google.com.ua/gfwlist\nserver=/jdforum.net/127.0.0.1#5335\nipset=/jdforum.net/gfwlist\nserver=/10bet.com/127.0.0.1#5335\nipset=/10bet.com/gfwlist\nserver=/romantic-sex-video.com/127.0.0.1#5335\nipset=/romantic-sex-video.com/gfwlist\nserver=/gimy.to/127.0.0.1#5335\nipset=/gimy.to/gfwlist\nserver=/hentaicomic.ru/127.0.0.1#5335\nipset=/hentaicomic.ru/gfwlist\nserver=/risextube.com/127.0.0.1#5335\nipset=/risextube.com/gfwlist\nserver=/volvotrucks.si/127.0.0.1#5335\nipset=/volvotrucks.si/gfwlist\nserver=/instagramium.com/127.0.0.1#5335\nipset=/instagramium.com/gfwlist\nserver=/heroku.me/127.0.0.1#5335\nipset=/heroku.me/gfwlist\nserver=/ikea.nl/127.0.0.1#5335\nipset=/ikea.nl/gfwlist\nserver=/alphabet.be/127.0.0.1#5335\nipset=/alphabet.be/gfwlist\nserver=/airwick.de/127.0.0.1#5335\nipset=/airwick.de/gfwlist\nserver=/durex.cz/127.0.0.1#5335\nipset=/durex.cz/gfwlist\nserver=/kirbysepicyarn.com/127.0.0.1#5335\nipset=/kirbysepicyarn.com/gfwlist\nserver=/realsexdoll.com/127.0.0.1#5335\nipset=/realsexdoll.com/gfwlist\nserver=/blizzard.nefficient.co.kr/127.0.0.1#5335\nipset=/blizzard.nefficient.co.kr/gfwlist\nserver=/myfoxphoenix.com/127.0.0.1#5335\nipset=/myfoxphoenix.com/gfwlist\nserver=/vzw.com/127.0.0.1#5335\nipset=/vzw.com/gfwlist\nserver=/fetishdreamz.com/127.0.0.1#5335\nipset=/fetishdreamz.com/gfwlist\nserver=/real-thaipussy.com/127.0.0.1#5335\nipset=/real-thaipussy.com/gfwlist\nserver=/real-homemade-movies.com/127.0.0.1#5335\nipset=/real-homemade-movies.com/gfwlist\nserver=/readerswivesonline.com/127.0.0.1#5335\nipset=/readerswivesonline.com/gfwlist\nserver=/ebaycareers.com/127.0.0.1#5335\nipset=/ebaycareers.com/gfwlist\nserver=/ogameblog.com/127.0.0.1#5335\nipset=/ogameblog.com/gfwlist\nserver=/funimation.com/127.0.0.1#5335\nipset=/funimation.com/gfwlist\nserver=/rbeopp.com/127.0.0.1#5335\nipset=/rbeopp.com/gfwlist\nserver=/petiteamateurteen.com/127.0.0.1#5335\nipset=/petiteamateurteen.com/gfwlist\nserver=/s.team/127.0.0.1#5335\nipset=/s.team/gfwlist\nserver=/google.co.ck/127.0.0.1#5335\nipset=/google.co.ck/gfwlist\nserver=/yourmomlovesanal.com/127.0.0.1#5335\nipset=/yourmomlovesanal.com/gfwlist\nserver=/westerndigital.com/127.0.0.1#5335\nipset=/westerndigital.com/gfwlist\nserver=/quipelements.com/127.0.0.1#5335\nipset=/quipelements.com/gfwlist\nserver=/irribay.com/127.0.0.1#5335\nipset=/irribay.com/gfwlist\nserver=/store-bridgestonesports.com/127.0.0.1#5335\nipset=/store-bridgestonesports.com/gfwlist\nserver=/beijingnike.com/127.0.0.1#5335\nipset=/beijingnike.com/gfwlist\nserver=/enjoyasianporn.com/127.0.0.1#5335\nipset=/enjoyasianporn.com/gfwlist\nserver=/verisign.com.sg/127.0.0.1#5335\nipset=/verisign.com.sg/gfwlist\nserver=/qombol.com/127.0.0.1#5335\nipset=/qombol.com/gfwlist\nserver=/x.team/127.0.0.1#5335\nipset=/x.team/gfwlist\nserver=/66wwmm.com/127.0.0.1#5335\nipset=/66wwmm.com/gfwlist\nserver=/scatnetwork.com/127.0.0.1#5335\nipset=/scatnetwork.com/gfwlist\nserver=/faceboks.com/127.0.0.1#5335\nipset=/faceboks.com/gfwlist\nserver=/paypal.me/127.0.0.1#5335\nipset=/paypal.me/gfwlist\nserver=/xanimeporn.com/127.0.0.1#5335\nipset=/xanimeporn.com/gfwlist\nserver=/toutapp.com/127.0.0.1#5335\nipset=/toutapp.com/gfwlist\nserver=/luxuretv.com/127.0.0.1#5335\nipset=/luxuretv.com/gfwlist\nserver=/o365weve-dev.com/127.0.0.1#5335\nipset=/o365weve-dev.com/gfwlist\nserver=/g1d1goob.xyz/127.0.0.1#5335\nipset=/g1d1goob.xyz/gfwlist\nserver=/twitter.biz/127.0.0.1#5335\nipset=/twitter.biz/gfwlist\nserver=/christymarks.com/127.0.0.1#5335\nipset=/christymarks.com/gfwlist\nserver=/uproxy.org/127.0.0.1#5335\nipset=/uproxy.org/gfwlist\nserver=/nikeplus.org/127.0.0.1#5335\nipset=/nikeplus.org/gfwlist\nserver=/pheonix.money/127.0.0.1#5335\nipset=/pheonix.money/gfwlist\nserver=/prostoporno.net/127.0.0.1#5335\nipset=/prostoporno.net/gfwlist\nserver=/mastercard.no/127.0.0.1#5335\nipset=/mastercard.no/gfwlist\nserver=/profreeporno.com/127.0.0.1#5335\nipset=/profreeporno.com/gfwlist\nserver=/disneymagicmomentsme.com/127.0.0.1#5335\nipset=/disneymagicmomentsme.com/gfwlist\nserver=/private.com/127.0.0.1#5335\nipset=/private.com/gfwlist\nserver=/fbthirdpartypixel.com/127.0.0.1#5335\nipset=/fbthirdpartypixel.com/gfwlist\nserver=/primematures.com/127.0.0.1#5335\nipset=/primematures.com/gfwlist\nserver=/ciscopress.ch/127.0.0.1#5335\nipset=/ciscopress.ch/gfwlist\nserver=/hentaiprn.com/127.0.0.1#5335\nipset=/hentaiprn.com/gfwlist\nserver=/pricelesssydney.com/127.0.0.1#5335\nipset=/pricelesssydney.com/gfwlist\nserver=/businessfocus.io/127.0.0.1#5335\nipset=/businessfocus.io/gfwlist\nserver=/disneypeoplesurveys.com/127.0.0.1#5335\nipset=/disneypeoplesurveys.com/gfwlist\nserver=/getscorecash.com/127.0.0.1#5335\nipset=/getscorecash.com/gfwlist\nserver=/rakuten.com/127.0.0.1#5335\nipset=/rakuten.com/gfwlist\nserver=/pornwhitelist.com/127.0.0.1#5335\nipset=/pornwhitelist.com/gfwlist\nserver=/aucheapbeats.com/127.0.0.1#5335\nipset=/aucheapbeats.com/gfwlist\nserver=/fox247.tv/127.0.0.1#5335\nipset=/fox247.tv/gfwlist\nserver=/porntn.com/127.0.0.1#5335\nipset=/porntn.com/gfwlist\nserver=/pornstarbyface.com/127.0.0.1#5335\nipset=/pornstarbyface.com/gfwlist\nserver=/pornsocket.com/127.0.0.1#5335\nipset=/pornsocket.com/gfwlist\nserver=/ebay.lt/127.0.0.1#5335\nipset=/ebay.lt/gfwlist\nserver=/pornsitesnow.com/127.0.0.1#5335\nipset=/pornsitesnow.com/gfwlist\nserver=/pornrips.cc/127.0.0.1#5335\nipset=/pornrips.cc/gfwlist\nserver=/nineentertainment.com.au/127.0.0.1#5335\nipset=/nineentertainment.com.au/gfwlist\nserver=/xn--ruq8a011kt6y.xn--hxt814e/127.0.0.1#5335\nipset=/xn--ruq8a011kt6y.xn--hxt814e/gfwlist\nserver=/needforspeed.com/127.0.0.1#5335\nipset=/needforspeed.com/gfwlist\nserver=/pornrabbit.com/127.0.0.1#5335\nipset=/pornrabbit.com/gfwlist\nserver=/tellme.pw/127.0.0.1#5335\nipset=/tellme.pw/gfwlist\nserver=/azure-dns.com/127.0.0.1#5335\nipset=/azure-dns.com/gfwlist\nserver=/foxnewsopinion.com/127.0.0.1#5335\nipset=/foxnewsopinion.com/gfwlist\nserver=/aspenpublishing.com/127.0.0.1#5335\nipset=/aspenpublishing.com/gfwlist\nserver=/enemaporn.blogspot.com/127.0.0.1#5335\nipset=/enemaporn.blogspot.com/gfwlist\nserver=/facedbook.com/127.0.0.1#5335\nipset=/facedbook.com/gfwlist\nserver=/hiddenvoyeurspy.com/127.0.0.1#5335\nipset=/hiddenvoyeurspy.com/gfwlist\nserver=/hkcitizenmedia.com/127.0.0.1#5335\nipset=/hkcitizenmedia.com/gfwlist\nserver=/pornotron.net/127.0.0.1#5335\nipset=/pornotron.net/gfwlist\nserver=/bridgestonesyb.com/127.0.0.1#5335\nipset=/bridgestonesyb.com/gfwlist\nserver=/gayonthenet.net/127.0.0.1#5335\nipset=/gayonthenet.net/gfwlist\nserver=/pornosfilmes.com/127.0.0.1#5335\nipset=/pornosfilmes.com/gfwlist\nserver=/bmw.com.cy/127.0.0.1#5335\nipset=/bmw.com.cy/gfwlist\nserver=/nvidia.nl/127.0.0.1#5335\nipset=/nvidia.nl/gfwlist\nserver=/pornolandia.xxx/127.0.0.1#5335\nipset=/pornolandia.xxx/gfwlist\nserver=/doi.org/127.0.0.1#5335\nipset=/doi.org/gfwlist\nserver=/pornoirado.com/127.0.0.1#5335\nipset=/pornoirado.com/gfwlist\nserver=/c0930.com/127.0.0.1#5335\nipset=/c0930.com/gfwlist\nserver=/53worldsweeps.com/127.0.0.1#5335\nipset=/53worldsweeps.com/gfwlist\nserver=/assoass.com/127.0.0.1#5335\nipset=/assoass.com/gfwlist\nserver=/98916.tv/127.0.0.1#5335\nipset=/98916.tv/gfwlist\nserver=/tpornstars.com/127.0.0.1#5335\nipset=/tpornstars.com/gfwlist\nserver=/ikea.us/127.0.0.1#5335\nipset=/ikea.us/gfwlist\nserver=/pornogids.net/127.0.0.1#5335\nipset=/pornogids.net/gfwlist\nserver=/socalbmw.com/127.0.0.1#5335\nipset=/socalbmw.com/gfwlist\nserver=/pornnut.com/127.0.0.1#5335\nipset=/pornnut.com/gfwlist\nserver=/pornmaki.com/127.0.0.1#5335\nipset=/pornmaki.com/gfwlist\nserver=/fuck-xxx-movies.com/127.0.0.1#5335\nipset=/fuck-xxx-movies.com/gfwlist\nserver=/sourcingforebay.com.cn/127.0.0.1#5335\nipset=/sourcingforebay.com.cn/gfwlist\nserver=/visa.co.jp/127.0.0.1#5335\nipset=/visa.co.jp/gfwlist\nserver=/pornjizz.co/127.0.0.1#5335\nipset=/pornjizz.co/gfwlist\nserver=/novojoy.com/127.0.0.1#5335\nipset=/novojoy.com/gfwlist\nserver=/faceook.com/127.0.0.1#5335\nipset=/faceook.com/gfwlist\nserver=/leagueoflegends.kr/127.0.0.1#5335\nipset=/leagueoflegends.kr/gfwlist\nserver=/pornhd3x.tv/127.0.0.1#5335\nipset=/pornhd3x.tv/gfwlist\nserver=/pornhd.com/127.0.0.1#5335\nipset=/pornhd.com/gfwlist\nserver=/hkheadline.com/127.0.0.1#5335\nipset=/hkheadline.com/gfwlist\nserver=/rushporn.xxx/127.0.0.1#5335\nipset=/rushporn.xxx/gfwlist\nserver=/porngrabbz.com/127.0.0.1#5335\nipset=/porngrabbz.com/gfwlist\nserver=/kum.com/127.0.0.1#5335\nipset=/kum.com/gfwlist\nserver=/beatssales.com/127.0.0.1#5335\nipset=/beatssales.com/gfwlist\nserver=/chinatimes.com/127.0.0.1#5335\nipset=/chinatimes.com/gfwlist\nserver=/hackyourconsole.com/127.0.0.1#5335\nipset=/hackyourconsole.com/gfwlist\nserver=/volvotrucks.pk/127.0.0.1#5335\nipset=/volvotrucks.pk/gfwlist\nserver=/discord.gg/127.0.0.1#5335\nipset=/discord.gg/gfwlist\nserver=/adobeprojectm.com/127.0.0.1#5335\nipset=/adobeprojectm.com/gfwlist\nserver=/porngames.club/127.0.0.1#5335\nipset=/porngames.club/gfwlist\nserver=/microsoft.lu/127.0.0.1#5335\nipset=/microsoft.lu/gfwlist\nserver=/manorama.com/127.0.0.1#5335\nipset=/manorama.com/gfwlist\nserver=/czechav.com/127.0.0.1#5335\nipset=/czechav.com/gfwlist\nserver=/finenike.com/127.0.0.1#5335\nipset=/finenike.com/gfwlist\nserver=/pornfactory.info/127.0.0.1#5335\nipset=/pornfactory.info/gfwlist\nserver=/pinterest.in/127.0.0.1#5335\nipset=/pinterest.in/gfwlist\nserver=/mini.ma/127.0.0.1#5335\nipset=/mini.ma/gfwlist\nserver=/porndoe.com/127.0.0.1#5335\nipset=/porndoe.com/gfwlist\nserver=/bmwsfl.com/127.0.0.1#5335\nipset=/bmwsfl.com/gfwlist\nserver=/disney.ca/127.0.0.1#5335\nipset=/disney.ca/gfwlist\nserver=/moapi.site/127.0.0.1#5335\nipset=/moapi.site/gfwlist\nserver=/porndiamond.com/127.0.0.1#5335\nipset=/porndiamond.com/gfwlist\nserver=/playapex.com/127.0.0.1#5335\nipset=/playapex.com/gfwlist\nserver=/porndabster.com/127.0.0.1#5335\nipset=/porndabster.com/gfwlist\nserver=/porncore.net/127.0.0.1#5335\nipset=/porncore.net/gfwlist\nserver=/ulol.com/127.0.0.1#5335\nipset=/ulol.com/gfwlist\nserver=/gcr.io/127.0.0.1#5335\nipset=/gcr.io/gfwlist\nserver=/pornagent.xyz/127.0.0.1#5335\nipset=/pornagent.xyz/gfwlist\nserver=/macossierra.com/127.0.0.1#5335\nipset=/macossierra.com/gfwlist\nserver=/apple.ie/127.0.0.1#5335\nipset=/apple.ie/gfwlist\nserver=/freeadultcomix.com/127.0.0.1#5335\nipset=/freeadultcomix.com/gfwlist\nserver=/afewmomentswith.com/127.0.0.1#5335\nipset=/afewmomentswith.com/gfwlist\nserver=/pearsonclinical.co.uk/127.0.0.1#5335\nipset=/pearsonclinical.co.uk/gfwlist\nserver=/porn.xxx/127.0.0.1#5335\nipset=/porn.xxx/gfwlist\nserver=/askfacebook.org/127.0.0.1#5335\nipset=/askfacebook.org/gfwlist\nserver=/pussyspace.com/127.0.0.1#5335\nipset=/pussyspace.com/gfwlist\nserver=/porn-gratis.info/127.0.0.1#5335\nipset=/porn-gratis.info/gfwlist\nserver=/porn-comic.com/127.0.0.1#5335\nipset=/porn-comic.com/gfwlist\nserver=/freeporno.asia/127.0.0.1#5335\nipset=/freeporno.asia/gfwlist\nserver=/playyoungtube.com/127.0.0.1#5335\nipset=/playyoungtube.com/gfwlist\nserver=/foxla.tv/127.0.0.1#5335\nipset=/foxla.tv/gfwlist\nserver=/piratecams.com/127.0.0.1#5335\nipset=/piratecams.com/gfwlist\nserver=/paradisehill.cc/127.0.0.1#5335\nipset=/paradisehill.cc/gfwlist\nserver=/pinkdino.com/127.0.0.1#5335\nipset=/pinkdino.com/gfwlist\nserver=/picacg2022.com/127.0.0.1#5335\nipset=/picacg2022.com/gfwlist\nserver=/kindleoasis.org/127.0.0.1#5335\nipset=/kindleoasis.org/gfwlist\nserver=/fuckmeplease.net/127.0.0.1#5335\nipset=/fuckmeplease.net/gfwlist\nserver=/doujin-night.com/127.0.0.1#5335\nipset=/doujin-night.com/gfwlist\nserver=/facebookmail.tv/127.0.0.1#5335\nipset=/facebookmail.tv/gfwlist\nserver=/pervclips.com/127.0.0.1#5335\nipset=/pervclips.com/gfwlist\nserver=/apple.co.nz/127.0.0.1#5335\nipset=/apple.co.nz/gfwlist\nserver=/ikea.kr/127.0.0.1#5335\nipset=/ikea.kr/gfwlist\nserver=/deutsche-pornos-kostenlos.xxx/127.0.0.1#5335\nipset=/deutsche-pornos-kostenlos.xxx/gfwlist\nserver=/peopledreamfunding.com/127.0.0.1#5335\nipset=/peopledreamfunding.com/gfwlist\nserver=/xtapes.to/127.0.0.1#5335\nipset=/xtapes.to/gfwlist\nserver=/kijijiforbusiness.ca/127.0.0.1#5335\nipset=/kijijiforbusiness.ca/gfwlist\nserver=/lifewire.com/127.0.0.1#5335\nipset=/lifewire.com/gfwlist\nserver=/youtube.com.eg/127.0.0.1#5335\nipset=/youtube.com.eg/gfwlist\nserver=/sweetadult-tube.com/127.0.0.1#5335\nipset=/sweetadult-tube.com/gfwlist\nserver=/pasionmujeres.com/127.0.0.1#5335\nipset=/pasionmujeres.com/gfwlist\nserver=/pancolle-movie.jp/127.0.0.1#5335\nipset=/pancolle-movie.jp/gfwlist\nserver=/paidpornguide.com/127.0.0.1#5335\nipset=/paidpornguide.com/gfwlist\nserver=/hhvm.com/127.0.0.1#5335\nipset=/hhvm.com/gfwlist\nserver=/bitmex.com/127.0.0.1#5335\nipset=/bitmex.com/gfwlist\nserver=/candypleasure.com/127.0.0.1#5335\nipset=/candypleasure.com/gfwlist\nserver=/pelvicexam.info/127.0.0.1#5335\nipset=/pelvicexam.info/gfwlist\nserver=/op7979.com/127.0.0.1#5335\nipset=/op7979.com/gfwlist\nserver=/onlyfanspw.com/127.0.0.1#5335\nipset=/onlyfanspw.com/gfwlist\nserver=/onlydudes.com/127.0.0.1#5335\nipset=/onlydudes.com/gfwlist\nserver=/binance.vision/127.0.0.1#5335\nipset=/binance.vision/gfwlist\nserver=/fscebook.com/127.0.0.1#5335\nipset=/fscebook.com/gfwlist\nserver=/bmw-connecteddrive.kr/127.0.0.1#5335\nipset=/bmw-connecteddrive.kr/gfwlist\nserver=/onejav.com/127.0.0.1#5335\nipset=/onejav.com/gfwlist\nserver=/omorashi.org/127.0.0.1#5335\nipset=/omorashi.org/gfwlist\nserver=/axbdoll.com.tw/127.0.0.1#5335\nipset=/axbdoll.com.tw/gfwlist\nserver=/fandango.com/127.0.0.1#5335\nipset=/fandango.com/gfwlist\nserver=/obutu.com/127.0.0.1#5335\nipset=/obutu.com/gfwlist\nserver=/findyourlimits.com/127.0.0.1#5335\nipset=/findyourlimits.com/gfwlist\nserver=/nintendostore.com/127.0.0.1#5335\nipset=/nintendostore.com/gfwlist\nserver=/ebaycbt.co.kr/127.0.0.1#5335\nipset=/ebaycbt.co.kr/gfwlist\nserver=/expertmaker.com/127.0.0.1#5335\nipset=/expertmaker.com/gfwlist\nserver=/iyottube.com/127.0.0.1#5335\nipset=/iyottube.com/gfwlist\nserver=/jiyu-kobo.co.jp/127.0.0.1#5335\nipset=/jiyu-kobo.co.jp/gfwlist\nserver=/disney.ro/127.0.0.1#5335\nipset=/disney.ro/gfwlist\nserver=/flickr.net/127.0.0.1#5335\nipset=/flickr.net/gfwlist\nserver=/noveltrove.com/127.0.0.1#5335\nipset=/noveltrove.com/gfwlist\nserver=/theopportunityproject.org/127.0.0.1#5335\nipset=/theopportunityproject.org/gfwlist\nserver=/rarbgway.org/127.0.0.1#5335\nipset=/rarbgway.org/gfwlist\nserver=/youtube.pk/127.0.0.1#5335\nipset=/youtube.pk/gfwlist\nserver=/embl.it/127.0.0.1#5335\nipset=/embl.it/gfwlist\nserver=/terapeak.ca/127.0.0.1#5335\nipset=/terapeak.ca/gfwlist\nserver=/livejasminbabes.net/127.0.0.1#5335\nipset=/livejasminbabes.net/gfwlist\nserver=/nichepornsites.com/127.0.0.1#5335\nipset=/nichepornsites.com/gfwlist\nserver=/dragonagekeep.com/127.0.0.1#5335\nipset=/dragonagekeep.com/gfwlist\nserver=/new-redtube.com/127.0.0.1#5335\nipset=/new-redtube.com/gfwlist\nserver=/neswangy.net/127.0.0.1#5335\nipset=/neswangy.net/gfwlist\nserver=/simplify.com/127.0.0.1#5335\nipset=/simplify.com/gfwlist\nserver=/hdpornfree.xxx/127.0.0.1#5335\nipset=/hdpornfree.xxx/gfwlist\nserver=/identrust.com/127.0.0.1#5335\nipset=/identrust.com/gfwlist\nserver=/mini-connected.fi/127.0.0.1#5335\nipset=/mini-connected.fi/gfwlist\nserver=/nakednews.com/127.0.0.1#5335\nipset=/nakednews.com/gfwlist\nserver=/airiti.com/127.0.0.1#5335\nipset=/airiti.com/gfwlist\nserver=/naijauncut.com/127.0.0.1#5335\nipset=/naijauncut.com/gfwlist\nserver=/blogspot.bg/127.0.0.1#5335\nipset=/blogspot.bg/gfwlist\nserver=/nomadproject.io/127.0.0.1#5335\nipset=/nomadproject.io/gfwlist\nserver=/myyoungwifeisnude.com/127.0.0.1#5335\nipset=/myyoungwifeisnude.com/gfwlist\nserver=/partylikeits1986.org/127.0.0.1#5335\nipset=/partylikeits1986.org/gfwlist\nserver=/globalsign.eu/127.0.0.1#5335\nipset=/globalsign.eu/gfwlist\nserver=/gaycamvideos.net/127.0.0.1#5335\nipset=/gaycamvideos.net/gfwlist\nserver=/mysexygfs.com/127.0.0.1#5335\nipset=/mysexygfs.com/gfwlist\nserver=/mysexgames.com/127.0.0.1#5335\nipset=/mysexgames.com/gfwlist\nserver=/bmw-powertrain.com/127.0.0.1#5335\nipset=/bmw-powertrain.com/gfwlist\nserver=/fox11.com/127.0.0.1#5335\nipset=/fox11.com/gfwlist\nserver=/yahoo.com.sa/127.0.0.1#5335\nipset=/yahoo.com.sa/gfwlist\nserver=/nurofen.co.nz/127.0.0.1#5335\nipset=/nurofen.co.nz/gfwlist\nserver=/javporn.tech/127.0.0.1#5335\nipset=/javporn.tech/gfwlist\nserver=/gannett.com/127.0.0.1#5335\nipset=/gannett.com/gfwlist\nserver=/wimpmusic.com/127.0.0.1#5335\nipset=/wimpmusic.com/gfwlist\nserver=/xn--q41am8x.com/127.0.0.1#5335\nipset=/xn--q41am8x.com/gfwlist\nserver=/donpornogratis.com/127.0.0.1#5335\nipset=/donpornogratis.com/gfwlist\nserver=/hentaimangaporn.com/127.0.0.1#5335\nipset=/hentaimangaporn.com/gfwlist\nserver=/slack-imgs.com/127.0.0.1#5335\nipset=/slack-imgs.com/gfwlist\nserver=/bestkinky.com/127.0.0.1#5335\nipset=/bestkinky.com/gfwlist\nserver=/ero-labs.online/127.0.0.1#5335\nipset=/ero-labs.online/gfwlist\nserver=/officialbeatsbydreshop.com/127.0.0.1#5335\nipset=/officialbeatsbydreshop.com/gfwlist\nserver=/dyttapis.com/127.0.0.1#5335\nipset=/dyttapis.com/gfwlist\nserver=/xboxgamestudios.com/127.0.0.1#5335\nipset=/xboxgamestudios.com/gfwlist\nserver=/mrdeepfakes.com/127.0.0.1#5335\nipset=/mrdeepfakes.com/gfwlist\nserver=/menatplay.com/127.0.0.1#5335\nipset=/menatplay.com/gfwlist\nserver=/bizarresexuality.com/127.0.0.1#5335\nipset=/bizarresexuality.com/gfwlist\nserver=/bloomberg.co.jp/127.0.0.1#5335\nipset=/bloomberg.co.jp/gfwlist\nserver=/lethalhardcore.com/127.0.0.1#5335\nipset=/lethalhardcore.com/gfwlist\nserver=/morazzia.com/127.0.0.1#5335\nipset=/morazzia.com/gfwlist\nserver=/appleiphone.hu/127.0.0.1#5335\nipset=/appleiphone.hu/gfwlist\nserver=/hotntubes.com/127.0.0.1#5335\nipset=/hotntubes.com/gfwlist\nserver=/hentaisea.com/127.0.0.1#5335\nipset=/hentaisea.com/gfwlist\nserver=/momshardcoreporn.com/127.0.0.1#5335\nipset=/momshardcoreporn.com/gfwlist\nserver=/fantv.hk/127.0.0.1#5335\nipset=/fantv.hk/gfwlist\nserver=/singtaousa.com/127.0.0.1#5335\nipset=/singtaousa.com/gfwlist\nserver=/foxsports.com.uy/127.0.0.1#5335\nipset=/foxsports.com.uy/gfwlist\nserver=/snowmiku.com/127.0.0.1#5335\nipset=/snowmiku.com/gfwlist\nserver=/momsfuckingboys.net/127.0.0.1#5335\nipset=/momsfuckingboys.net/gfwlist\nserver=/foxcareers.com/127.0.0.1#5335\nipset=/foxcareers.com/gfwlist\nserver=/serverfault.com/127.0.0.1#5335\nipset=/serverfault.com/gfwlist\nserver=/dentalhypotheses.com/127.0.0.1#5335\nipset=/dentalhypotheses.com/gfwlist\nserver=/tasteofpremium.jp/127.0.0.1#5335\nipset=/tasteofpremium.jp/gfwlist\nserver=/exotic-ghana.com/127.0.0.1#5335\nipset=/exotic-ghana.com/gfwlist\nserver=/ebay25.com/127.0.0.1#5335\nipset=/ebay25.com/gfwlist\nserver=/nna.jp/127.0.0.1#5335\nipset=/nna.jp/gfwlist\nserver=/mixmaturesex.com/127.0.0.1#5335\nipset=/mixmaturesex.com/gfwlist\nserver=/gtv1.org/127.0.0.1#5335\nipset=/gtv1.org/gfwlist\nserver=/mitnaka.com/127.0.0.1#5335\nipset=/mitnaka.com/gfwlist\nserver=/blogspot.no/127.0.0.1#5335\nipset=/blogspot.no/gfwlist\nserver=/pin.it/127.0.0.1#5335\nipset=/pin.it/gfwlist\nserver=/milfsover30.com/127.0.0.1#5335\nipset=/milfsover30.com/gfwlist\nserver=/imperialbusiness.school/127.0.0.1#5335\nipset=/imperialbusiness.school/gfwlist\nserver=/ftv.com.tw/127.0.0.1#5335\nipset=/ftv.com.tw/gfwlist\nserver=/akamai-access.com/127.0.0.1#5335\nipset=/akamai-access.com/gfwlist\nserver=/18comic.company/127.0.0.1#5335\nipset=/18comic.company/gfwlist\nserver=/huobi.com/127.0.0.1#5335\nipset=/huobi.com/gfwlist\nserver=/milfed.com/127.0.0.1#5335\nipset=/milfed.com/gfwlist\nserver=/deepfreeze.com/127.0.0.1#5335\nipset=/deepfreeze.com/gfwlist\nserver=/paypal-login.info/127.0.0.1#5335\nipset=/paypal-login.info/gfwlist\nserver=/bestmallawards.com/127.0.0.1#5335\nipset=/bestmallawards.com/gfwlist\nserver=/mantochichi.com/127.0.0.1#5335\nipset=/mantochichi.com/gfwlist\nserver=/kfs.io/127.0.0.1#5335\nipset=/kfs.io/gfwlist\nserver=/manga18.art/127.0.0.1#5335\nipset=/manga18.art/gfwlist\nserver=/realclearlife.com/127.0.0.1#5335\nipset=/realclearlife.com/gfwlist\nserver=/diao.asia/127.0.0.1#5335\nipset=/diao.asia/gfwlist\nserver=/fatstube.com/127.0.0.1#5335\nipset=/fatstube.com/gfwlist\nserver=/singtaonewscorp.com/127.0.0.1#5335\nipset=/singtaonewscorp.com/gfwlist\nserver=/intel.cu/127.0.0.1#5335\nipset=/intel.cu/gfwlist\nserver=/asminternational.org/127.0.0.1#5335\nipset=/asminternational.org/gfwlist\nserver=/ikea.com.sa/127.0.0.1#5335\nipset=/ikea.com.sa/gfwlist\nserver=/madchensex.com/127.0.0.1#5335\nipset=/madchensex.com/gfwlist\nserver=/getprintersupports.com/127.0.0.1#5335\nipset=/getprintersupports.com/gfwlist\nserver=/businessinsider.my/127.0.0.1#5335\nipset=/businessinsider.my/gfwlist\nserver=/gettyimages.ca/127.0.0.1#5335\nipset=/gettyimages.ca/gfwlist\nserver=/pugpig-dev.com/127.0.0.1#5335\nipset=/pugpig-dev.com/gfwlist\nserver=/singtao.com/127.0.0.1#5335\nipset=/singtao.com/gfwlist\nserver=/lovepartners.life/127.0.0.1#5335\nipset=/lovepartners.life/gfwlist\nserver=/lovehomeporn.com/127.0.0.1#5335\nipset=/lovehomeporn.com/gfwlist\nserver=/vk-cdn.net/127.0.0.1#5335\nipset=/vk-cdn.net/gfwlist\nserver=/ltsports.com.tw/127.0.0.1#5335\nipset=/ltsports.com.tw/gfwlist\nserver=/lolhentai.net/127.0.0.1#5335\nipset=/lolhentai.net/gfwlist\nserver=/loholidayhk.com/127.0.0.1#5335\nipset=/loholidayhk.com/gfwlist\nserver=/localxlist.org/127.0.0.1#5335\nipset=/localxlist.org/gfwlist\nserver=/liveprivates.com/127.0.0.1#5335\nipset=/liveprivates.com/gfwlist\nserver=/diamantewebcam.com/127.0.0.1#5335\nipset=/diamantewebcam.com/gfwlist\nserver=/ikea.ru/127.0.0.1#5335\nipset=/ikea.ru/gfwlist\nserver=/nintendo.es/127.0.0.1#5335\nipset=/nintendo.es/gfwlist\nserver=/letsfuckme.net/127.0.0.1#5335\nipset=/letsfuckme.net/gfwlist\nserver=/letsdoeit.com/127.0.0.1#5335\nipset=/letsdoeit.com/gfwlist\nserver=/lemoncams.com/127.0.0.1#5335\nipset=/lemoncams.com/gfwlist\nserver=/kindle.es/127.0.0.1#5335\nipset=/kindle.es/gfwlist\nserver=/egmontbooks.co.uk/127.0.0.1#5335\nipset=/egmontbooks.co.uk/gfwlist\nserver=/lazymike.com/127.0.0.1#5335\nipset=/lazymike.com/gfwlist\nserver=/101boyvideos.com/127.0.0.1#5335\nipset=/101boyvideos.com/gfwlist\nserver=/voyeurmonkey.com/127.0.0.1#5335\nipset=/voyeurmonkey.com/gfwlist\nserver=/javprime.net/127.0.0.1#5335\nipset=/javprime.net/gfwlist\nserver=/avstar01.me/127.0.0.1#5335\nipset=/avstar01.me/gfwlist\nserver=/igi-global.com/127.0.0.1#5335\nipset=/igi-global.com/gfwlist\nserver=/nyaa.si/127.0.0.1#5335\nipset=/nyaa.si/gfwlist\nserver=/api-priconne-redive.cygames.jp/127.0.0.1#5335\nipset=/api-priconne-redive.cygames.jp/gfwlist\nserver=/jetbrains.team/127.0.0.1#5335\nipset=/jetbrains.team/gfwlist\nserver=/freefacebook.com/127.0.0.1#5335\nipset=/freefacebook.com/gfwlist\nserver=/kostenlosepornoclips.com/127.0.0.1#5335\nipset=/kostenlosepornoclips.com/gfwlist\nserver=/visa-news.jp/127.0.0.1#5335\nipset=/visa-news.jp/gfwlist\nserver=/marveldimensionofheroes.com/127.0.0.1#5335\nipset=/marveldimensionofheroes.com/gfwlist\nserver=/kir2kos.net/127.0.0.1#5335\nipset=/kir2kos.net/gfwlist\nserver=/swjfo.com/127.0.0.1#5335\nipset=/swjfo.com/gfwlist\nserver=/iaablog.com/127.0.0.1#5335\nipset=/iaablog.com/gfwlist\nserver=/mastercard.co.nz/127.0.0.1#5335\nipset=/mastercard.co.nz/gfwlist\nserver=/xdty.org/127.0.0.1#5335\nipset=/xdty.org/gfwlist\nserver=/nakedgirls.biz/127.0.0.1#5335\nipset=/nakedgirls.biz/gfwlist\nserver=/card.io/127.0.0.1#5335\nipset=/card.io/gfwlist\nserver=/disney.fr/127.0.0.1#5335\nipset=/disney.fr/gfwlist\nserver=/karupsha.com/127.0.0.1#5335\nipset=/karupsha.com/gfwlist\nserver=/faronicswise.co.uk/127.0.0.1#5335\nipset=/faronicswise.co.uk/gfwlist\nserver=/guim.co.uk/127.0.0.1#5335\nipset=/guim.co.uk/gfwlist\nserver=/kairakudoujin.net/127.0.0.1#5335\nipset=/kairakudoujin.net/gfwlist\nserver=/bmw.com.do/127.0.0.1#5335\nipset=/bmw.com.do/gfwlist\nserver=/peerj.com/127.0.0.1#5335\nipset=/peerj.com/gfwlist\nserver=/universitypressscholarship.com/127.0.0.1#5335\nipset=/universitypressscholarship.com/gfwlist\nserver=/alphabet.co.hu/127.0.0.1#5335\nipset=/alphabet.co.hu/gfwlist\nserver=/vrsumo.com/127.0.0.1#5335\nipset=/vrsumo.com/gfwlist\nserver=/justfullporn.org/127.0.0.1#5335\nipset=/justfullporn.org/gfwlist\nserver=/appsonebay.net/127.0.0.1#5335\nipset=/appsonebay.net/gfwlist\nserver=/sankei-books.co.jp/127.0.0.1#5335\nipset=/sankei-books.co.jp/gfwlist\nserver=/tenbyfotolia.com/127.0.0.1#5335\nipset=/tenbyfotolia.com/gfwlist\nserver=/joinmaidez.com/127.0.0.1#5335\nipset=/joinmaidez.com/gfwlist\nserver=/jpg4.biz/127.0.0.1#5335\nipset=/jpg4.biz/gfwlist\nserver=/degruyter.com/127.0.0.1#5335\nipset=/degruyter.com/gfwlist\nserver=/vuvuzela.io/127.0.0.1#5335\nipset=/vuvuzela.io/gfwlist\nserver=/erolabs.cloud/127.0.0.1#5335\nipset=/erolabs.cloud/gfwlist\nserver=/softbank.tv/127.0.0.1#5335\nipset=/softbank.tv/gfwlist\nserver=/pixnet.pro/127.0.0.1#5335\nipset=/pixnet.pro/gfwlist\nserver=/akadns6.net/127.0.0.1#5335\nipset=/akadns6.net/gfwlist\nserver=/hentaihaven.com/127.0.0.1#5335\nipset=/hentaihaven.com/gfwlist\nserver=/penthouse.com/127.0.0.1#5335\nipset=/penthouse.com/gfwlist\nserver=/vanish.ro/127.0.0.1#5335\nipset=/vanish.ro/gfwlist\nserver=/zwtvusa.com/127.0.0.1#5335\nipset=/zwtvusa.com/gfwlist\nserver=/facebookconsultant.org/127.0.0.1#5335\nipset=/facebookconsultant.org/gfwlist\nserver=/javhdfree.net/127.0.0.1#5335\nipset=/javhdfree.net/gfwlist\nserver=/javhaven.com/127.0.0.1#5335\nipset=/javhaven.com/gfwlist\nserver=/harperapps.com/127.0.0.1#5335\nipset=/harperapps.com/gfwlist\nserver=/pussysexgames.com/127.0.0.1#5335\nipset=/pussysexgames.com/gfwlist\nserver=/newbeatsblackfriday.com/127.0.0.1#5335\nipset=/newbeatsblackfriday.com/gfwlist\nserver=/ggsrv.com/127.0.0.1#5335\nipset=/ggsrv.com/gfwlist\nserver=/tube4world.com/127.0.0.1#5335\nipset=/tube4world.com/gfwlist\nserver=/jav.place/127.0.0.1#5335\nipset=/jav.place/gfwlist\nserver=/japon-girls.com/127.0.0.1#5335\nipset=/japon-girls.com/gfwlist\nserver=/youtubego.in/127.0.0.1#5335\nipset=/youtubego.in/gfwlist\nserver=/ita-do.com/127.0.0.1#5335\nipset=/ita-do.com/gfwlist\nserver=/iranx.net/127.0.0.1#5335\nipset=/iranx.net/gfwlist\nserver=/umagazine.com.hk/127.0.0.1#5335\nipset=/umagazine.com.hk/gfwlist\nserver=/intescort.com/127.0.0.1#5335\nipset=/intescort.com/gfwlist\nserver=/instabang.com/127.0.0.1#5335\nipset=/instabang.com/gfwlist\nserver=/ipodtouch.com/127.0.0.1#5335\nipset=/ipodtouch.com/gfwlist\nserver=/visa.lv/127.0.0.1#5335\nipset=/visa.lv/gfwlist\nserver=/verisign.name/127.0.0.1#5335\nipset=/verisign.name/gfwlist\nserver=/akamai.net/127.0.0.1#5335\nipset=/akamai.net/gfwlist\nserver=/indianhiddencams.com/127.0.0.1#5335\nipset=/indianhiddencams.com/gfwlist\nserver=/foxsports-world.com/127.0.0.1#5335\nipset=/foxsports-world.com/gfwlist\nserver=/oculuscasino.net/127.0.0.1#5335\nipset=/oculuscasino.net/gfwlist\nserver=/adobeawards.com/127.0.0.1#5335\nipset=/adobeawards.com/gfwlist\nserver=/independentdubaiescorts.com/127.0.0.1#5335\nipset=/independentdubaiescorts.com/gfwlist\nserver=/incestporn.xxx/127.0.0.1#5335\nipset=/incestporn.xxx/gfwlist\nserver=/visaluxuryhotels.com.ar/127.0.0.1#5335\nipset=/visaluxuryhotels.com.ar/gfwlist\nserver=/sciencedirect.com/127.0.0.1#5335\nipset=/sciencedirect.com/gfwlist\nserver=/readthedocs.org/127.0.0.1#5335\nipset=/readthedocs.org/gfwlist\nserver=/duckgo.com/127.0.0.1#5335\nipset=/duckgo.com/gfwlist\nserver=/igotpornpics.com/127.0.0.1#5335\nipset=/igotpornpics.com/gfwlist\nserver=/pcstore.com.tw/127.0.0.1#5335\nipset=/pcstore.com.tw/gfwlist\nserver=/hypnotube.com/127.0.0.1#5335\nipset=/hypnotube.com/gfwlist\nserver=/premiumfs.de/127.0.0.1#5335\nipset=/premiumfs.de/gfwlist\nserver=/mastercardservices.com/127.0.0.1#5335\nipset=/mastercardservices.com/gfwlist\nserver=/dmm.com/127.0.0.1#5335\nipset=/dmm.com/gfwlist\nserver=/hussiepass.com/127.0.0.1#5335\nipset=/hussiepass.com/gfwlist\nserver=/jinsilubanzhao.com/127.0.0.1#5335\nipset=/jinsilubanzhao.com/gfwlist\nserver=/huangse.love/127.0.0.1#5335\nipset=/huangse.love/gfwlist\nserver=/nextmedia.com.tw/127.0.0.1#5335\nipset=/nextmedia.com.tw/gfwlist\nserver=/zoho.com/127.0.0.1#5335\nipset=/zoho.com/gfwlist\nserver=/hottystop.com/127.0.0.1#5335\nipset=/hottystop.com/gfwlist\nserver=/av4.us/127.0.0.1#5335\nipset=/av4.us/gfwlist\nserver=/hotsexvideo.mobi/127.0.0.1#5335\nipset=/hotsexvideo.mobi/gfwlist\nserver=/ebay-sales.com/127.0.0.1#5335\nipset=/ebay-sales.com/gfwlist\nserver=/javrave.club/127.0.0.1#5335\nipset=/javrave.club/gfwlist\nserver=/steam-api.com/127.0.0.1#5335\nipset=/steam-api.com/gfwlist\nserver=/airwick.nl/127.0.0.1#5335\nipset=/airwick.nl/gfwlist\nserver=/historyofdota.org/127.0.0.1#5335\nipset=/historyofdota.org/gfwlist\nserver=/nikefoampositeshoes.com/127.0.0.1#5335\nipset=/nikefoampositeshoes.com/gfwlist\nserver=/illusionfb.cn/127.0.0.1#5335\nipset=/illusionfb.cn/gfwlist\nserver=/paypal-here.com/127.0.0.1#5335\nipset=/paypal-here.com/gfwlist\nserver=/akamqi.com/127.0.0.1#5335\nipset=/akamqi.com/gfwlist\nserver=/newsapi.com.au/127.0.0.1#5335\nipset=/newsapi.com.au/gfwlist\nserver=/sexygirlspics.com/127.0.0.1#5335\nipset=/sexygirlspics.com/gfwlist\nserver=/mcdonaldsparties.co.nz/127.0.0.1#5335\nipset=/mcdonaldsparties.co.nz/gfwlist\nserver=/horsecumshot.net/127.0.0.1#5335\nipset=/horsecumshot.net/gfwlist\nserver=/kuke.com/127.0.0.1#5335\nipset=/kuke.com/gfwlist\nserver=/press.vin/127.0.0.1#5335\nipset=/press.vin/gfwlist\nserver=/stepsiblingscaught.com/127.0.0.1#5335\nipset=/stepsiblingscaught.com/gfwlist\nserver=/hidefporn.ws/127.0.0.1#5335\nipset=/hidefporn.ws/gfwlist\nserver=/hernudepics.com/127.0.0.1#5335\nipset=/hernudepics.com/gfwlist\nserver=/nypost.com/127.0.0.1#5335\nipset=/nypost.com/gfwlist\nserver=/hentaiworldporn.com/127.0.0.1#5335\nipset=/hentaiworldporn.com/gfwlist\nserver=/pureapk.com/127.0.0.1#5335\nipset=/pureapk.com/gfwlist\nserver=/ucla.edu/127.0.0.1#5335\nipset=/ucla.edu/gfwlist\nserver=/hgamer.pro/127.0.0.1#5335\nipset=/hgamer.pro/gfwlist\nserver=/verisign.com.au/127.0.0.1#5335\nipset=/verisign.com.au/gfwlist\nserver=/tube2017.com/127.0.0.1#5335\nipset=/tube2017.com/gfwlist\nserver=/cock4stepmom.com/127.0.0.1#5335\nipset=/cock4stepmom.com/gfwlist\nserver=/indazn.com/127.0.0.1#5335\nipset=/indazn.com/gfwlist\nserver=/chatwhores.sex/127.0.0.1#5335\nipset=/chatwhores.sex/gfwlist\nserver=/facebook-pmdcenter.com/127.0.0.1#5335\nipset=/facebook-pmdcenter.com/gfwlist\nserver=/hulupremium.com/127.0.0.1#5335\nipset=/hulupremium.com/gfwlist\nserver=/yahoo.com.sb/127.0.0.1#5335\nipset=/yahoo.com.sb/gfwlist\nserver=/foxsports.com.mx/127.0.0.1#5335\nipset=/foxsports.com.mx/gfwlist\nserver=/leagueoflegends.info/127.0.0.1#5335\nipset=/leagueoflegends.info/gfwlist\nserver=/vkcache.com/127.0.0.1#5335\nipset=/vkcache.com/gfwlist\nserver=/hentaihaven.io/127.0.0.1#5335\nipset=/hentaihaven.io/gfwlist\nserver=/postini.com/127.0.0.1#5335\nipset=/postini.com/gfwlist\nserver=/hentai-space.supertop-100.com/127.0.0.1#5335\nipset=/hentai-space.supertop-100.com/gfwlist\nserver=/visa.com.ec/127.0.0.1#5335\nipset=/visa.com.ec/gfwlist\nserver=/hentai-cosplays.com/127.0.0.1#5335\nipset=/hentai-cosplays.com/gfwlist\nserver=/bmw-motorrad.ru/127.0.0.1#5335\nipset=/bmw-motorrad.ru/gfwlist\nserver=/identrust.co.uk/127.0.0.1#5335\nipset=/identrust.co.uk/gfwlist\nserver=/hdsex.pro/127.0.0.1#5335\nipset=/hdsex.pro/gfwlist\nserver=/hotindianbabe.com/127.0.0.1#5335\nipset=/hotindianbabe.com/gfwlist\nserver=/9anime.ws/127.0.0.1#5335\nipset=/9anime.ws/gfwlist\nserver=/youtube.com.mx/127.0.0.1#5335\nipset=/youtube.com.mx/gfwlist\nserver=/familyswap.xxx/127.0.0.1#5335\nipset=/familyswap.xxx/gfwlist\nserver=/china-facebook.com/127.0.0.1#5335\nipset=/china-facebook.com/gfwlist\nserver=/bikaa.xyz/127.0.0.1#5335\nipset=/bikaa.xyz/gfwlist\nserver=/scholar.google.lu/127.0.0.1#5335\nipset=/scholar.google.lu/gfwlist\nserver=/hentaivn.net/127.0.0.1#5335\nipset=/hentaivn.net/gfwlist\nserver=/thepornguy.org/127.0.0.1#5335\nipset=/thepornguy.org/gfwlist\nserver=/supermario.com/127.0.0.1#5335\nipset=/supermario.com/gfwlist\nserver=/thetread.com/127.0.0.1#5335\nipset=/thetread.com/gfwlist\nserver=/guysnightlife.com/127.0.0.1#5335\nipset=/guysnightlife.com/gfwlist\nserver=/youtube.com.au/127.0.0.1#5335\nipset=/youtube.com.au/gfwlist\nserver=/guaranitermal.com/127.0.0.1#5335\nipset=/guaranitermal.com/gfwlist\nserver=/cheapheadsetmall.com/127.0.0.1#5335\nipset=/cheapheadsetmall.com/gfwlist\nserver=/grabhentai.com/127.0.0.1#5335\nipset=/grabhentai.com/gfwlist\nserver=/chrome.com/127.0.0.1#5335\nipset=/chrome.com/gfwlist\nserver=/mastercard.co.kr/127.0.0.1#5335\nipset=/mastercard.co.kr/gfwlist\nserver=/beeg.rest/127.0.0.1#5335\nipset=/beeg.rest/gfwlist\nserver=/iphoneunlockimei.com/127.0.0.1#5335\nipset=/iphoneunlockimei.com/gfwlist\nserver=/yourtv.com.au/127.0.0.1#5335\nipset=/yourtv.com.au/gfwlist\nserver=/proquest.com/127.0.0.1#5335\nipset=/proquest.com/gfwlist\nserver=/binance.charity/127.0.0.1#5335\nipset=/binance.charity/gfwlist\nserver=/udfs.com/127.0.0.1#5335\nipset=/udfs.com/gfwlist\nserver=/cambiaip.org/127.0.0.1#5335\nipset=/cambiaip.org/gfwlist\nserver=/fflnk.net/127.0.0.1#5335\nipset=/fflnk.net/gfwlist\nserver=/gaystarnews.com/127.0.0.1#5335\nipset=/gaystarnews.com/gfwlist\nserver=/mastercard.rs/127.0.0.1#5335\nipset=/mastercard.rs/gfwlist\nserver=/roloxxx.com/127.0.0.1#5335\nipset=/roloxxx.com/gfwlist\nserver=/swtor.com/127.0.0.1#5335\nipset=/swtor.com/gfwlist\nserver=/mariokart7.com/127.0.0.1#5335\nipset=/mariokart7.com/gfwlist\nserver=/pornaf.com/127.0.0.1#5335\nipset=/pornaf.com/gfwlist\nserver=/flatandfuckedmilfs.com/127.0.0.1#5335\nipset=/flatandfuckedmilfs.com/gfwlist\nserver=/gaybeeg.info/127.0.0.1#5335\nipset=/gaybeeg.info/gfwlist\nserver=/gamerotic.com/127.0.0.1#5335\nipset=/gamerotic.com/gfwlist\nserver=/escandinavia-arg.com/127.0.0.1#5335\nipset=/escandinavia-arg.com/gfwlist\nserver=/ox.ac.uk/127.0.0.1#5335\nipset=/ox.ac.uk/gfwlist\nserver=/bdsmpornonly.com/127.0.0.1#5335\nipset=/bdsmpornonly.com/gfwlist\nserver=/fuq.com/127.0.0.1#5335\nipset=/fuq.com/gfwlist\nserver=/gameroom.com/127.0.0.1#5335\nipset=/gameroom.com/gfwlist\nserver=/bloomsburycollections.com/127.0.0.1#5335\nipset=/bloomsburycollections.com/gfwlist\nserver=/nonstopfap.com/127.0.0.1#5335\nipset=/nonstopfap.com/gfwlist\nserver=/fuckingmatures.com/127.0.0.1#5335\nipset=/fuckingmatures.com/gfwlist\nserver=/mini-windsor.ca/127.0.0.1#5335\nipset=/mini-windsor.ca/gfwlist\nserver=/uplynk.com/127.0.0.1#5335\nipset=/uplynk.com/gfwlist\nserver=/xn--hb4aw0g.com/127.0.0.1#5335\nipset=/xn--hb4aw0g.com/gfwlist\nserver=/freelifetimefuckbook.com/127.0.0.1#5335\nipset=/freelifetimefuckbook.com/gfwlist\nserver=/vfsco.co.uk/127.0.0.1#5335\nipset=/vfsco.co.uk/gfwlist\nserver=/paypalprepagata.com/127.0.0.1#5335\nipset=/paypalprepagata.com/gfwlist\nserver=/0plkijj.vip/127.0.0.1#5335\nipset=/0plkijj.vip/gfwlist\nserver=/shopspeedtv.com/127.0.0.1#5335\nipset=/shopspeedtv.com/gfwlist\nserver=/mastercard.jo/127.0.0.1#5335\nipset=/mastercard.jo/gfwlist\nserver=/sipriyearbook.org/127.0.0.1#5335\nipset=/sipriyearbook.org/gfwlist\nserver=/freejavbt.com/127.0.0.1#5335\nipset=/freejavbt.com/gfwlist\nserver=/naver.com/127.0.0.1#5335\nipset=/naver.com/gfwlist\nserver=/pinterest.ec/127.0.0.1#5335\nipset=/pinterest.ec/gfwlist\nserver=/fitnakedgirls.com/127.0.0.1#5335\nipset=/fitnakedgirls.com/gfwlist\nserver=/minicooper.ca/127.0.0.1#5335\nipset=/minicooper.ca/gfwlist\nserver=/hbox.jp/127.0.0.1#5335\nipset=/hbox.jp/gfwlist\nserver=/bmw.com.mk/127.0.0.1#5335\nipset=/bmw.com.mk/gfwlist\nserver=/kijijiautos.ca/127.0.0.1#5335\nipset=/kijijiautos.ca/gfwlist\nserver=/mini.gp/127.0.0.1#5335\nipset=/mini.gp/gfwlist\nserver=/av6k.com/127.0.0.1#5335\nipset=/av6k.com/gfwlist\nserver=/amlg.io/127.0.0.1#5335\nipset=/amlg.io/gfwlist\nserver=/fapality.com/127.0.0.1#5335\nipset=/fapality.com/gfwlist\nserver=/fansteek.com/127.0.0.1#5335\nipset=/fansteek.com/gfwlist\nserver=/fanleakstoday.com/127.0.0.1#5335\nipset=/fanleakstoday.com/gfwlist\nserver=/trustcor.ca/127.0.0.1#5335\nipset=/trustcor.ca/gfwlist\nserver=/facebooc.com/127.0.0.1#5335\nipset=/facebooc.com/gfwlist\nserver=/ext-twitch.tv/127.0.0.1#5335\nipset=/ext-twitch.tv/gfwlist\nserver=/facebolk.com/127.0.0.1#5335\nipset=/facebolk.com/gfwlist\nserver=/amateur-exhibitionist.org/127.0.0.1#5335\nipset=/amateur-exhibitionist.org/gfwlist\nserver=/amebaownd.com/127.0.0.1#5335\nipset=/amebaownd.com/gfwlist\nserver=/evaelfie.com/127.0.0.1#5335\nipset=/evaelfie.com/gfwlist\nserver=/escortamsterdam1.com/127.0.0.1#5335\nipset=/escortamsterdam1.com/gfwlist\nserver=/airwick.jp/127.0.0.1#5335\nipset=/airwick.jp/gfwlist\nserver=/vhxqa1.com/127.0.0.1#5335\nipset=/vhxqa1.com/gfwlist\nserver=/nintendo.tw/127.0.0.1#5335\nipset=/nintendo.tw/gfwlist\nserver=/canon-europe.com/127.0.0.1#5335\nipset=/canon-europe.com/gfwlist\nserver=/volvopenta.it/127.0.0.1#5335\nipset=/volvopenta.it/gfwlist\nserver=/volvogroup.nl/127.0.0.1#5335\nipset=/volvogroup.nl/gfwlist\nserver=/entensity.net/127.0.0.1#5335\nipset=/entensity.net/gfwlist\nserver=/instagramdi.com/127.0.0.1#5335\nipset=/instagramdi.com/gfwlist\nserver=/harpercollins.com/127.0.0.1#5335\nipset=/harpercollins.com/gfwlist\nserver=/nubiles-casting.com/127.0.0.1#5335\nipset=/nubiles-casting.com/gfwlist\nserver=/twtrdns.net/127.0.0.1#5335\nipset=/twtrdns.net/gfwlist\nserver=/enema-porn.com/127.0.0.1#5335\nipset=/enema-porn.com/gfwlist\nserver=/adultlister.com/127.0.0.1#5335\nipset=/adultlister.com/gfwlist\nserver=/mylogiclab.com/127.0.0.1#5335\nipset=/mylogiclab.com/gfwlist\nserver=/microsoft.pl/127.0.0.1#5335\nipset=/microsoft.pl/gfwlist\nserver=/youtube.co.in/127.0.0.1#5335\nipset=/youtube.co.in/gfwlist\nserver=/adidas.nl/127.0.0.1#5335\nipset=/adidas.nl/gfwlist\nserver=/extreme-board.com/127.0.0.1#5335\nipset=/extreme-board.com/gfwlist\nserver=/thewonderful101.com/127.0.0.1#5335\nipset=/thewonderful101.com/gfwlist\nserver=/dumps69.com/127.0.0.1#5335\nipset=/dumps69.com/gfwlist\nserver=/dswz88.xyz/127.0.0.1#5335\nipset=/dswz88.xyz/gfwlist\nserver=/drunkentop.com/127.0.0.1#5335\nipset=/drunkentop.com/gfwlist\nserver=/drtuber.com/127.0.0.1#5335\nipset=/drtuber.com/gfwlist\nserver=/beautyescortsamsterdam.com/127.0.0.1#5335\nipset=/beautyescortsamsterdam.com/gfwlist\nserver=/lawdata.com.tw/127.0.0.1#5335\nipset=/lawdata.com.tw/gfwlist\nserver=/tvb.com/127.0.0.1#5335\nipset=/tvb.com/gfwlist\nserver=/bossae.com/127.0.0.1#5335\nipset=/bossae.com/gfwlist\nserver=/bmwofcentralpa.com/127.0.0.1#5335\nipset=/bmwofcentralpa.com/gfwlist\nserver=/dirtyonline.com/127.0.0.1#5335\nipset=/dirtyonline.com/gfwlist\nserver=/illusionn2.com/127.0.0.1#5335\nipset=/illusionn2.com/gfwlist\nserver=/yy55.tv/127.0.0.1#5335\nipset=/yy55.tv/gfwlist\nserver=/dirtyfarmer.com/127.0.0.1#5335\nipset=/dirtyfarmer.com/gfwlist\nserver=/rbdigitalab.com/127.0.0.1#5335\nipset=/rbdigitalab.com/gfwlist\nserver=/bmw-yeg.ca/127.0.0.1#5335\nipset=/bmw-yeg.ca/gfwlist\nserver=/dhlestudio.com.co/127.0.0.1#5335\nipset=/dhlestudio.com.co/gfwlist\nserver=/deasians.com/127.0.0.1#5335\nipset=/deasians.com/gfwlist\nserver=/bmw-motorrad.sk/127.0.0.1#5335\nipset=/bmw-motorrad.sk/gfwlist\nserver=/rapetube.me/127.0.0.1#5335\nipset=/rapetube.me/gfwlist\nserver=/czechcasting.com/127.0.0.1#5335\nipset=/czechcasting.com/gfwlist\nserver=/paypal.hk/127.0.0.1#5335\nipset=/paypal.hk/gfwlist\nserver=/hifacebook.info/127.0.0.1#5335\nipset=/hifacebook.info/gfwlist\nserver=/adcommerce.tv/127.0.0.1#5335\nipset=/adcommerce.tv/gfwlist\nserver=/czechbiporn.com/127.0.0.1#5335\nipset=/czechbiporn.com/gfwlist\nserver=/mybridgestoneeducation.com/127.0.0.1#5335\nipset=/mybridgestoneeducation.com/gfwlist\nserver=/developers.facebook.com/127.0.0.1#5335\nipset=/developers.facebook.com/gfwlist\nserver=/ebaydts.com/127.0.0.1#5335\nipset=/ebaydts.com/gfwlist\nserver=/yandex.ua/127.0.0.1#5335\nipset=/yandex.ua/gfwlist\nserver=/starwarsbattlefront2.com/127.0.0.1#5335\nipset=/starwarsbattlefront2.com/gfwlist\nserver=/wmcloud.org/127.0.0.1#5335\nipset=/wmcloud.org/gfwlist\nserver=/tegrazone.co/127.0.0.1#5335\nipset=/tegrazone.co/gfwlist\nserver=/gvt7.com/127.0.0.1#5335\nipset=/gvt7.com/gfwlist\nserver=/crabporn.com/127.0.0.1#5335\nipset=/crabporn.com/gfwlist\nserver=/okazudouga.blog.jp/127.0.0.1#5335\nipset=/okazudouga.blog.jp/gfwlist\nserver=/scholar.google.sk/127.0.0.1#5335\nipset=/scholar.google.sk/gfwlist\nserver=/indiaipad.com/127.0.0.1#5335\nipset=/indiaipad.com/gfwlist\nserver=/sportsfacebook.com/127.0.0.1#5335\nipset=/sportsfacebook.com/gfwlist\nserver=/discountbeatsbydre-us.com/127.0.0.1#5335\nipset=/discountbeatsbydre-us.com/gfwlist\nserver=/hentairead.com/127.0.0.1#5335\nipset=/hentairead.com/gfwlist\nserver=/lapriere.jp/127.0.0.1#5335\nipset=/lapriere.jp/gfwlist\nserver=/netlock.hu/127.0.0.1#5335\nipset=/netlock.hu/gfwlist\nserver=/mastercardbiz.com/127.0.0.1#5335\nipset=/mastercardbiz.com/gfwlist\nserver=/webofscience.com/127.0.0.1#5335\nipset=/webofscience.com/gfwlist\nserver=/ch9.ms/127.0.0.1#5335\nipset=/ch9.ms/gfwlist\nserver=/miamifintechfestival.com/127.0.0.1#5335\nipset=/miamifintechfestival.com/gfwlist\nserver=/cc18.biz/127.0.0.1#5335\nipset=/cc18.biz/gfwlist\nserver=/gaypornmenu.com/127.0.0.1#5335\nipset=/gaypornmenu.com/gfwlist\nserver=/vfsco.jp/127.0.0.1#5335\nipset=/vfsco.jp/gfwlist\nserver=/ilongman.com/127.0.0.1#5335\nipset=/ilongman.com/gfwlist\nserver=/ieeeoes.org/127.0.0.1#5335\nipset=/ieeeoes.org/gfwlist\nserver=/ebaylocationsdevacances.com/127.0.0.1#5335\nipset=/ebaylocationsdevacances.com/gfwlist\nserver=/iotinactionevents.com/127.0.0.1#5335\nipset=/iotinactionevents.com/gfwlist\nserver=/sonypicturesmuseum.com/127.0.0.1#5335\nipset=/sonypicturesmuseum.com/gfwlist\nserver=/scatfap.com/127.0.0.1#5335\nipset=/scatfap.com/gfwlist\nserver=/ebay.com.sg/127.0.0.1#5335\nipset=/ebay.com.sg/gfwlist\nserver=/yahoo.com/127.0.0.1#5335\nipset=/yahoo.com/gfwlist\nserver=/scholar.google.ru/127.0.0.1#5335\nipset=/scholar.google.ru/gfwlist\nserver=/nikebetterworld.org/127.0.0.1#5335\nipset=/nikebetterworld.org/gfwlist\nserver=/learnwithleague.com/127.0.0.1#5335\nipset=/learnwithleague.com/gfwlist\nserver=/zakzak.co.jp/127.0.0.1#5335\nipset=/zakzak.co.jp/gfwlist\nserver=/drdrebeats-usa.com/127.0.0.1#5335\nipset=/drdrebeats-usa.com/gfwlist\nserver=/camstreams.tv/127.0.0.1#5335\nipset=/camstreams.tv/gfwlist\nserver=/privacysimplified.com/127.0.0.1#5335\nipset=/privacysimplified.com/gfwlist\nserver=/softether-download.com/127.0.0.1#5335\nipset=/softether-download.com/gfwlist\nserver=/bigboobsandhotsex.com/127.0.0.1#5335\nipset=/bigboobsandhotsex.com/gfwlist\nserver=/xboxone.co/127.0.0.1#5335\nipset=/xboxone.co/gfwlist\nserver=/headphonesbeatsaudio.com/127.0.0.1#5335\nipset=/headphonesbeatsaudio.com/gfwlist\nserver=/newpppp.com/127.0.0.1#5335\nipset=/newpppp.com/gfwlist\nserver=/paypal-business.net/127.0.0.1#5335\nipset=/paypal-business.net/gfwlist\nserver=/bdsmboard.org/127.0.0.1#5335\nipset=/bdsmboard.org/gfwlist\nserver=/sex-av.com/127.0.0.1#5335\nipset=/sex-av.com/gfwlist\nserver=/r10s.jp/127.0.0.1#5335\nipset=/r10s.jp/gfwlist\nserver=/bmw.cl/127.0.0.1#5335\nipset=/bmw.cl/gfwlist\nserver=/youtube.ma/127.0.0.1#5335\nipset=/youtube.ma/gfwlist\nserver=/kkff2484.live/127.0.0.1#5335\nipset=/kkff2484.live/gfwlist\nserver=/youtube.jo/127.0.0.1#5335\nipset=/youtube.jo/gfwlist\nserver=/byjhd.com/127.0.0.1#5335\nipset=/byjhd.com/gfwlist\nserver=/ebaylocal.net/127.0.0.1#5335\nipset=/ebaylocal.net/gfwlist\nserver=/visa.com.my/127.0.0.1#5335\nipset=/visa.com.my/gfwlist\nserver=/playstation.net/127.0.0.1#5335\nipset=/playstation.net/gfwlist\nserver=/tver.jp/127.0.0.1#5335\nipset=/tver.jp/gfwlist\nserver=/vercel-dns.com/127.0.0.1#5335\nipset=/vercel-dns.com/gfwlist\nserver=/brazzers-xxx.net/127.0.0.1#5335\nipset=/brazzers-xxx.net/gfwlist\nserver=/gynoexam.info/127.0.0.1#5335\nipset=/gynoexam.info/gfwlist\nserver=/yours-customised.mini.com/127.0.0.1#5335\nipset=/yours-customised.mini.com/gfwlist\nserver=/dojinwatch.com/127.0.0.1#5335\nipset=/dojinwatch.com/gfwlist\nserver=/acgcf.com/127.0.0.1#5335\nipset=/acgcf.com/gfwlist\nserver=/miniso.pk/127.0.0.1#5335\nipset=/miniso.pk/gfwlist\nserver=/dcard.link/127.0.0.1#5335\nipset=/dcard.link/gfwlist\nserver=/volvotruckcenter.no/127.0.0.1#5335\nipset=/volvotruckcenter.no/gfwlist\nserver=/visa.com.do/127.0.0.1#5335\nipset=/visa.com.do/gfwlist\nserver=/blacksonblondes.com/127.0.0.1#5335\nipset=/blacksonblondes.com/gfwlist\nserver=/sonypicturestelevision.com/127.0.0.1#5335\nipset=/sonypicturestelevision.com/gfwlist\nserver=/sexflashgame.org/127.0.0.1#5335\nipset=/sexflashgame.org/gfwlist\nserver=/toppornsites.com/127.0.0.1#5335\nipset=/toppornsites.com/gfwlist\nserver=/amateurporn.photos/127.0.0.1#5335\nipset=/amateurporn.photos/gfwlist\nserver=/texture.com/127.0.0.1#5335\nipset=/texture.com/gfwlist\nserver=/elitvip.ru/127.0.0.1#5335\nipset=/elitvip.ru/gfwlist\nserver=/ikea.qa/127.0.0.1#5335\nipset=/ikea.qa/gfwlist\nserver=/sextop.net/127.0.0.1#5335\nipset=/sextop.net/gfwlist\nserver=/vtsociety.org/127.0.0.1#5335\nipset=/vtsociety.org/gfwlist\nserver=/scholar.google.pt/127.0.0.1#5335\nipset=/scholar.google.pt/gfwlist\nserver=/visaeurope.lu/127.0.0.1#5335\nipset=/visaeurope.lu/gfwlist\nserver=/swisssign.org/127.0.0.1#5335\nipset=/swisssign.org/gfwlist\nserver=/ikea.cl/127.0.0.1#5335\nipset=/ikea.cl/gfwlist\nserver=/teslaenergy.services/127.0.0.1#5335\nipset=/teslaenergy.services/gfwlist\nserver=/ggpht.com/127.0.0.1#5335\nipset=/ggpht.com/gfwlist\nserver=/mastercardezsavings.com/127.0.0.1#5335\nipset=/mastercardezsavings.com/gfwlist\nserver=/pximg.net/127.0.0.1#5335\nipset=/pximg.net/gfwlist\nserver=/gettyimages.dk/127.0.0.1#5335\nipset=/gettyimages.dk/gfwlist\nserver=/mini.com.hr/127.0.0.1#5335\nipset=/mini.com.hr/gfwlist\nserver=/customizedbeatbydre.com/127.0.0.1#5335\nipset=/customizedbeatbydre.com/gfwlist\nserver=/tickdata.com/127.0.0.1#5335\nipset=/tickdata.com/gfwlist\nserver=/animepornhd.com/127.0.0.1#5335\nipset=/animepornhd.com/gfwlist\nserver=/ibook.eu/127.0.0.1#5335\nipset=/ibook.eu/gfwlist\nserver=/handbags-nike.com/127.0.0.1#5335\nipset=/handbags-nike.com/gfwlist\nserver=/oculuscdn.com/127.0.0.1#5335\nipset=/oculuscdn.com/gfwlist\nserver=/realamericanstories.net/127.0.0.1#5335\nipset=/realamericanstories.net/gfwlist\nserver=/citylab.com/127.0.0.1#5335\nipset=/citylab.com/gfwlist\nserver=/aptoide.com/127.0.0.1#5335\nipset=/aptoide.com/gfwlist\nserver=/scholar.google.ae/127.0.0.1#5335\nipset=/scholar.google.ae/gfwlist\nserver=/pricelesstoronto.ca/127.0.0.1#5335\nipset=/pricelesstoronto.ca/gfwlist\nserver=/amateurs-gone-wild.com/127.0.0.1#5335\nipset=/amateurs-gone-wild.com/gfwlist\nserver=/instagrem.com/127.0.0.1#5335\nipset=/instagrem.com/gfwlist\nserver=/bmw.ie/127.0.0.1#5335\nipset=/bmw.ie/gfwlist\nserver=/paypalprepagata.net/127.0.0.1#5335\nipset=/paypalprepagata.net/gfwlist\nserver=/nhentai.xxx/127.0.0.1#5335\nipset=/nhentai.xxx/gfwlist\nserver=/my-formosa.com/127.0.0.1#5335\nipset=/my-formosa.com/gfwlist\nserver=/scholar.google.com.mx/127.0.0.1#5335\nipset=/scholar.google.com.mx/gfwlist\nserver=/allinternal.com/127.0.0.1#5335\nipset=/allinternal.com/gfwlist\nserver=/bisq.io/127.0.0.1#5335\nipset=/bisq.io/gfwlist\nserver=/opgg-static.akamaized.net/127.0.0.1#5335\nipset=/opgg-static.akamaized.net/gfwlist\nserver=/9cao9.com/127.0.0.1#5335\nipset=/9cao9.com/gfwlist\nserver=/bmw.ua/127.0.0.1#5335\nipset=/bmw.ua/gfwlist\nserver=/ioffergift.com/127.0.0.1#5335\nipset=/ioffergift.com/gfwlist\nserver=/adultvirtualworlds.net/127.0.0.1#5335\nipset=/adultvirtualworlds.net/gfwlist\nserver=/sexsexe1.com/127.0.0.1#5335\nipset=/sexsexe1.com/gfwlist\nserver=/adultinfojpn.com/127.0.0.1#5335\nipset=/adultinfojpn.com/gfwlist\nserver=/twimg.com/127.0.0.1#5335\nipset=/twimg.com/gfwlist\nserver=/adultblogtoplist.com/127.0.0.1#5335\nipset=/adultblogtoplist.com/gfwlist\nserver=/intellearningseries.com/127.0.0.1#5335\nipset=/intellearningseries.com/gfwlist\nserver=/alphabet.ch/127.0.0.1#5335\nipset=/alphabet.ch/gfwlist\nserver=/adult3dporno.com/127.0.0.1#5335\nipset=/adult3dporno.com/gfwlist\nserver=/9xlove.xyz/127.0.0.1#5335\nipset=/9xlove.xyz/gfwlist\nserver=/cnn.it/127.0.0.1#5335\nipset=/cnn.it/gfwlist\nserver=/91cy.app/127.0.0.1#5335\nipset=/91cy.app/gfwlist\nserver=/61jxbs42.xyz/127.0.0.1#5335\nipset=/61jxbs42.xyz/gfwlist\nserver=/rsg.sc/127.0.0.1#5335\nipset=/rsg.sc/gfwlist\nserver=/vfsco.in/127.0.0.1#5335\nipset=/vfsco.in/gfwlist\nserver=/sg120.me/127.0.0.1#5335\nipset=/sg120.me/gfwlist\nserver=/intel.jo/127.0.0.1#5335\nipset=/intel.jo/gfwlist\nserver=/18pornsex.com/127.0.0.1#5335\nipset=/18pornsex.com/gfwlist\nserver=/akamaitech.net/127.0.0.1#5335\nipset=/akamaitech.net/gfwlist\nserver=/gale.com/127.0.0.1#5335\nipset=/gale.com/gfwlist\nserver=/fox10phoenix.com/127.0.0.1#5335\nipset=/fox10phoenix.com/gfwlist\nserver=/avstar07.me/127.0.0.1#5335\nipset=/avstar07.me/gfwlist\nserver=/youtubekids.com/127.0.0.1#5335\nipset=/youtubekids.com/gfwlist\nserver=/bmwusatires.com/127.0.0.1#5335\nipset=/bmwusatires.com/gfwlist\nserver=/bloomberg.com/127.0.0.1#5335\nipset=/bloomberg.com/gfwlist\nserver=/nikeb.com/127.0.0.1#5335\nipset=/nikeb.com/gfwlist\nserver=/minispecialoffers.ca/127.0.0.1#5335\nipset=/minispecialoffers.ca/gfwlist\nserver=/cw.com.tw/127.0.0.1#5335\nipset=/cw.com.tw/gfwlist\nserver=/appleantilles.com/127.0.0.1#5335\nipset=/appleantilles.com/gfwlist\nserver=/bigboobspov.com/127.0.0.1#5335\nipset=/bigboobspov.com/gfwlist\nserver=/pokemonletsgoeevee.com/127.0.0.1#5335\nipset=/pokemonletsgoeevee.com/gfwlist\nserver=/bmw-welt.tv/127.0.0.1#5335\nipset=/bmw-welt.tv/gfwlist\nserver=/ebayparts.com/127.0.0.1#5335\nipset=/ebayparts.com/gfwlist\nserver=/visa.com.uy/127.0.0.1#5335\nipset=/visa.com.uy/gfwlist\nserver=/ikea.rs/127.0.0.1#5335\nipset=/ikea.rs/gfwlist\nserver=/kubakuba1996.com/127.0.0.1#5335\nipset=/kubakuba1996.com/gfwlist\nserver=/nikesb.com/127.0.0.1#5335\nipset=/nikesb.com/gfwlist\nserver=/vkuseraudio.com/127.0.0.1#5335\nipset=/vkuseraudio.com/gfwlist\nserver=/paypalobjects.com/127.0.0.1#5335\nipset=/paypalobjects.com/gfwlist\nserver=/alphabet.info/127.0.0.1#5335\nipset=/alphabet.info/gfwlist\nserver=/pinterest.vn/127.0.0.1#5335\nipset=/pinterest.vn/gfwlist\nserver=/sitepoint.com/127.0.0.1#5335\nipset=/sitepoint.com/gfwlist\nserver=/sci-hub.st/127.0.0.1#5335\nipset=/sci-hub.st/gfwlist\nserver=/amateur-threesomes.com/127.0.0.1#5335\nipset=/amateur-threesomes.com/gfwlist\nserver=/aomedia.org/127.0.0.1#5335\nipset=/aomedia.org/gfwlist\nserver=/ea-anz-press.com/127.0.0.1#5335\nipset=/ea-anz-press.com/gfwlist\nserver=/delvenetworks.com/127.0.0.1#5335\nipset=/delvenetworks.com/gfwlist\nserver=/vk.link/127.0.0.1#5335\nipset=/vk.link/gfwlist\nserver=/squirrelvpn.com/127.0.0.1#5335\nipset=/squirrelvpn.com/gfwlist\nserver=/ebayinternetsalestax.com/127.0.0.1#5335\nipset=/ebayinternetsalestax.com/gfwlist\nserver=/stheadline.com/127.0.0.1#5335\nipset=/stheadline.com/gfwlist\nserver=/tiburon.com/127.0.0.1#5335\nipset=/tiburon.com/gfwlist\nserver=/boyspornpics.com/127.0.0.1#5335\nipset=/boyspornpics.com/gfwlist\nserver=/oecd-ilibrary.org/127.0.0.1#5335\nipset=/oecd-ilibrary.org/gfwlist\nserver=/bmw-connecteddrive.fi/127.0.0.1#5335\nipset=/bmw-connecteddrive.fi/gfwlist\nserver=/anfutong.com/127.0.0.1#5335\nipset=/anfutong.com/gfwlist\nserver=/libsolutions.net/127.0.0.1#5335\nipset=/libsolutions.net/gfwlist\nserver=/travelexmoneycard.com/127.0.0.1#5335\nipset=/travelexmoneycard.com/gfwlist\nserver=/paypal-dynamic.com/127.0.0.1#5335\nipset=/paypal-dynamic.com/gfwlist\nserver=/easyanticheat.net/127.0.0.1#5335\nipset=/easyanticheat.net/gfwlist\nserver=/thepaypalshop.com/127.0.0.1#5335\nipset=/thepaypalshop.com/gfwlist\nserver=/eaassets-a.akamaihd.net/127.0.0.1#5335\nipset=/eaassets-a.akamaihd.net/gfwlist\nserver=/swisssign.com/127.0.0.1#5335\nipset=/swisssign.com/gfwlist\nserver=/softbankworld.com/127.0.0.1#5335\nipset=/softbankworld.com/gfwlist\nserver=/huffingtonpost.fr/127.0.0.1#5335\nipset=/huffingtonpost.fr/gfwlist\nserver=/volvoce.com/127.0.0.1#5335\nipset=/volvoce.com/gfwlist\nserver=/ascelibrary.org/127.0.0.1#5335\nipset=/ascelibrary.org/gfwlist\nserver=/disney.co.kr/127.0.0.1#5335\nipset=/disney.co.kr/gfwlist\nserver=/mytvsuper.com/127.0.0.1#5335\nipset=/mytvsuper.com/gfwlist\nserver=/bestsexcam.com/127.0.0.1#5335\nipset=/bestsexcam.com/gfwlist\nserver=/bestbuycoffeemakers.com/127.0.0.1#5335\nipset=/bestbuycoffeemakers.com/gfwlist\nserver=/bmw-m-safetycar.com/127.0.0.1#5335\nipset=/bmw-m-safetycar.com/gfwlist\nserver=/foxbusinessgo.com/127.0.0.1#5335\nipset=/foxbusinessgo.com/gfwlist\nserver=/static-verizon.com/127.0.0.1#5335\nipset=/static-verizon.com/gfwlist\nserver=/decorativemodels.com/127.0.0.1#5335\nipset=/decorativemodels.com/gfwlist\nserver=/surflite.co/127.0.0.1#5335\nipset=/surflite.co/gfwlist\nserver=/babble.com/127.0.0.1#5335\nipset=/babble.com/gfwlist\nserver=/achievementanalytics.com/127.0.0.1#5335\nipset=/achievementanalytics.com/gfwlist\nserver=/javfun.me/127.0.0.1#5335\nipset=/javfun.me/gfwlist\nserver=/ebayauthenticate.com.cn/127.0.0.1#5335\nipset=/ebayauthenticate.com.cn/gfwlist\nserver=/mini-grouparchive.com/127.0.0.1#5335\nipset=/mini-grouparchive.com/gfwlist\nserver=/bmw.gp/127.0.0.1#5335\nipset=/bmw.gp/gfwlist\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/etc/ssrplus/mosdns-config.yaml",
    "content": "log:\n    level: info\nplugins:\n    - tag: lazy_cache\n      type: cache\n      args:\n        size: 8000\n        lazy_cache_ttl: 86400\n\n    - tag: forward_google\n      type: forward\n      args:\n        concurrent: 2\n        upstreams:\n\n    - tag: main_sequence_disable_IPv6\n      type: sequence\n      args:\n        - exec: $lazy_cache\n        - exec: prefer_ipv4\n        - exec: $forward_google\n        - matches: \n          - qtype 28 65\n          exec: reject 0\n\n    - tag: main_sequence_with_IPv6\n      type: sequence\n      args:\n        - exec: $lazy_cache\n        - exec: $forward_google\n\n    - tag: udp_server\n      type: udp_server\n      args:\n        entry: DNS_MODE\n        listen: 0.0.0.0:DNS_PORT\n      \n    - tag: tcp_server\n      type: tcp_server\n      args:\n        entry: DNS_MODE\n        listen: 0.0.0.0:DNS_PORT\n\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/etc/ssrplus/netflix.list",
    "content": "amazonaws.com\naws.amazon.com\nawsstatic.com\nfast.com\nnetflix.com\nnetflix.net\nnflxext.com\nnflximg.net\nnflxso.net\nnflxvideo.net\nnetflixdnstest0.com\nnetflixdnstest1.com\nnetflixdnstest2.com\nnetflixdnstest3.com\nnetflixdnstest4.com\nnetflixdnstest5.com\nnetflixdnstest6.com\nnetflixdnstest7.com\nnetflixdnstest8.com\nnetflixdnstest9.com\nhulu.com\nhuluim.com\nhbonow.com\nhbogo.com\nhbo.com\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/etc/ssrplus/netflixip.list",
    "content": "8.41.4.0/24\n23.23.189.144/28\n23.246.0.0/18\n34.195.253.0/25\n34.210.42.111/32\n37.77.184.0/21\n38.72.126.0/24\n45.57.0.0/17\n52.24.178.0/24\n52.35.140.0/24\n52.89.124.203/32\n54.148.37.5/32\n54.204.25.0/28\n54.213.167.0/24\n64.120.128.0/17\n66.197.128.0/17\n69.53.224.0/19\n103.87.204.0/22\n108.175.32.0/20\n185.2.220.0/22\n185.9.188.0/22\n192.173.64.0/18\n198.38.96.0/19\n198.45.48.0/20\n203.75.84.0/24\n203.198.13.0/24\n203.198.80.0/24\n207.45.72.0/22\n208.75.76.0/22\n210.0.153.0/24\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/etc/ssrplus/oversea_list.conf",
    "content": "server=/v.youku.com/127.0.0.1#5335\nserver=/api.youku.com/127.0.0.1#5335\nserver=/v2.tudou.com/127.0.0.1#5335\nserver=/www.tudou.com/127.0.0.1#5335\nserver=/s.plcloud.music.qq.com/127.0.0.1#5335\nserver=/i.y.qq.com/127.0.0.1#5335\nserver=/hot.vrs.sohu.com/127.0.0.1#5335\nserver=/live.tv.sohu.com/127.0.0.1#5335\nserver=/pad.tv.sohu.com/127.0.0.1#5335\nserver=/my.tv.sohu.com/127.0.0.1#5335\nserver=/hot.vrs.letv.com/127.0.0.1#5335\nserver=/data.video.qiyi.com/127.0.0.1#5335\nserver=/cache.video.qiyi.com/127.0.0.1#5335\nserver=/cache.vip.qiyi.com/127.0.0.1#5335\nserver=/vv.video.qq.com/127.0.0.1#5335\nserver=/tt.video.qq.com/127.0.0.1#5335\nserver=/ice.video.qq.com/127.0.0.1#5335\nserver=/tjsa.video.qq.com/127.0.0.1#5335\nserver=/a10.video.qq.com/127.0.0.1#5335\nserver=/xyy.video.qq.com/127.0.0.1#5335\nserver=/vcq.video.qq.com/127.0.0.1#5335\nserver=/vsh.video.qq.com/127.0.0.1#5335\nserver=/vbj.video.qq.com/127.0.0.1#5335\nserver=/bobo.video.qq.com/127.0.0.1#5335\nserver=/flvs.video.qq.com/127.0.0.1#5335\nserver=/bkvv.video.qq.com/127.0.0.1#5335\nserver=/info.zb.qq.com/127.0.0.1#5335\nserver=/geo.js.kankan.xunlei.com/127.0.0.1#5335\nserver=/web-play.pptv.com/127.0.0.1#5335\nserver=/web-play.pplive.cn/127.0.0.1#5335\nserver=/dyn.ugc.pps.tv/127.0.0.1#5335\nserver=/v.pps.tv/127.0.0.1#5335\nserver=/inner.kandian.com/127.0.0.1#5335\nserver=/ipservice.163.com/127.0.0.1#5335\nserver=/so.open.163.com/127.0.0.1#5335\nserver=/zb.s.qq.com/127.0.0.1#5335\nserver=/ip.kankan.xunlei.com/127.0.0.1#5335\nserver=/vxml.56.com/127.0.0.1#5335\nserver=/music.sina.com.cn/127.0.0.1#5335\nserver=/play.baidu.com/127.0.0.1#5335\nserver=/v.iask.com/127.0.0.1#5335\nserver=/tv.weibo.com/127.0.0.1#5335\nserver=/wtv.v.iask.com/127.0.0.1#5335\nserver=/video.sina.com.cn/127.0.0.1#5335\nserver=/www.yinyuetai.com/127.0.0.1#5335\nserver=/api.letv.com/127.0.0.1#5335\nserver=/live.gslb.letv.com/127.0.0.1#5335\nserver=/static.itv.letv.com/127.0.0.1#5335\nserver=/ip.apps.cntv.cn/127.0.0.1#5335\nserver=/vdn.apps.cntv.cn/127.0.0.1#5335\nserver=/vdn.live.cntv.cn/127.0.0.1#5335\nserver=/vip.sports.cntv.cn/127.0.0.1#5335\nserver=/a.play.api.3g.youku.com/127.0.0.1#5335\nserver=/i.play.api.3g.youku.com/127.0.0.1#5335\nserver=/api.3g.youku.com/127.0.0.1#5335\nserver=/tv.api.3g.youku.com/127.0.0.1#5335\nserver=/play.api.3g.youku.com/127.0.0.1#5335\nserver=/play.api.3g.tudou.com/127.0.0.1#5335\nserver=/tv.api.3g.tudou.com/127.0.0.1#5335\nserver=/api.3g.tudou.com/127.0.0.1#5335\nserver=/api.tv.sohu.com/127.0.0.1#5335\nserver=/access.tv.sohu.com/127.0.0.1#5335\nserver=/iface.iqiyi.com/127.0.0.1#5335\nserver=/iface2.iqiyi.com/127.0.0.1#5335\nserver=/cache.m.iqiyi.com/127.0.0.1#5335\nserver=/dynamic.app.m.letv.com/127.0.0.1#5335\nserver=/dynamic.meizi.app.m.letv.com/127.0.0.1#5335\nserver=/dynamic.search.app.m.letv.com/127.0.0.1#5335\nserver=/dynamic.live.app.m.letv.com/127.0.0.1#5335\nserver=/listso.m.areainfo.ppstream.com/127.0.0.1#5335\nserver=/epg.api.pptv.com/127.0.0.1#5335\nserver=/play.api.pptv.com/127.0.0.1#5335\nserver=/m.letv.com/127.0.0.1#5335\nserver=/interface.bilibili.com/127.0.0.1#5335\nserver=/3g.music.qq.com/127.0.0.1#5335\nserver=/mqqplayer.3g.qq.com/127.0.0.1#5335\nserver=/proxy.music.qq.com/127.0.0.1#5335\nserver=/proxymc.qq.com/127.0.0.1#5335\nserver=/ip2.kugou.com/127.0.0.1#5335\nserver=/ip.kugou.com/127.0.0.1#5335\nserver=/client.api.ttpod.com/127.0.0.1#5335\nserver=/mobi.kuwo.cn/127.0.0.1#5335\nserver=/mobilefeedback.kugou.com/127.0.0.1#5335\nserver=/tingapi.ting.baidu.com/127.0.0.1#5335\nserver=/music.baidu.com/127.0.0.1#5335\nserver=/serviceinfo.sdk.duomi.com/127.0.0.1#5335\nserver=/music.163.com/127.0.0.1#5335\nserver=/www.xiami.com/127.0.0.1#5335\nserver=/spark.api.xiami.com/127.0.0.1#5335\nserver=/iplocation.geo.qiyi.com/127.0.0.1#5335\nserver=/sns.video.qq.com/127.0.0.1#5335\nserver=/v5.pc.duomi.com/127.0.0.1#5335\nserver=/tms.is.ysten.com/127.0.0.1#5335\nserver=/internal.check.duokanbox.com/127.0.0.1#5335\nserver=/openapi.youku.com/127.0.0.1#5335\nserver=/y.qq.com/127.0.0.1#5335\nipset=/v.youku.com/oversea\nipset=/api.youku.com/oversea\nipset=/v2.tudou.com/oversea\nipset=/www.tudou.com/oversea\nipset=/s.plcloud.music.qq.com/oversea\nipset=/i.y.qq.com/oversea\nipset=/hot.vrs.sohu.com/oversea\nipset=/live.tv.sohu.com/oversea\nipset=/pad.tv.sohu.com/oversea\nipset=/my.tv.sohu.com/oversea\nipset=/hot.vrs.letv.com/oversea\nipset=/data.video.qiyi.com/oversea\nipset=/cache.video.qiyi.com/oversea\nipset=/cache.vip.qiyi.com/oversea\nipset=/vv.video.qq.com/oversea\nipset=/tt.video.qq.com/oversea\nipset=/ice.video.qq.com/oversea\nipset=/tjsa.video.qq.com/oversea\nipset=/a10.video.qq.com/oversea\nipset=/xyy.video.qq.com/oversea\nipset=/vcq.video.qq.com/oversea\nipset=/vsh.video.qq.com/oversea\nipset=/vbj.video.qq.com/oversea\nipset=/bobo.video.qq.com/oversea\nipset=/flvs.video.qq.com/oversea\nipset=/bkvv.video.qq.com/oversea\nipset=/info.zb.qq.com/oversea\nipset=/geo.js.kankan.xunlei.com/oversea\nipset=/web-play.pptv.com/oversea\nipset=/web-play.pplive.cn/oversea\nipset=/dyn.ugc.pps.tv/oversea\nipset=/v.pps.tv/oversea\nipset=/inner.kandian.com/oversea\nipset=/ipservice.163.com/oversea\nipset=/so.open.163.com/oversea\nipset=/zb.s.qq.com/oversea\nipset=/ip.kankan.xunlei.com/oversea\nipset=/vxml.56.com/oversea\nipset=/music.sina.com.cn/oversea\nipset=/play.baidu.com/oversea\nipset=/v.iask.com/oversea\nipset=/tv.weibo.com/oversea\nipset=/wtv.v.iask.com/oversea\nipset=/video.sina.com.cn/oversea\nipset=/www.yinyuetai.com/oversea\nipset=/api.letv.com/oversea\nipset=/live.gslb.letv.com/oversea\nipset=/static.itv.letv.com/oversea\nipset=/ip.apps.cntv.cn/oversea\nipset=/vdn.apps.cntv.cn/oversea\nipset=/vdn.live.cntv.cn/oversea\nipset=/vip.sports.cntv.cn/oversea\nipset=/a.play.api.3g.youku.com/oversea\nipset=/i.play.api.3g.youku.com/oversea\nipset=/api.3g.youku.com/oversea\nipset=/tv.api.3g.youku.com/oversea\nipset=/play.api.3g.youku.com/oversea\nipset=/play.api.3g.tudou.com/oversea\nipset=/tv.api.3g.tudou.com/oversea\nipset=/api.3g.tudou.com/oversea\nipset=/api.tv.sohu.com/oversea\nipset=/access.tv.sohu.com/oversea\nipset=/iface.iqiyi.com/oversea\nipset=/iface2.iqiyi.com/oversea\nipset=/cache.m.iqiyi.com/oversea\nipset=/dynamic.app.m.letv.com/oversea\nipset=/dynamic.meizi.app.m.letv.com/oversea\nipset=/dynamic.search.app.m.letv.com/oversea\nipset=/dynamic.live.app.m.letv.com/oversea\nipset=/listso.m.areainfo.ppstream.com/oversea\nipset=/epg.api.pptv.com/oversea\nipset=/play.api.pptv.com/oversea\nipset=/m.letv.com/oversea\nipset=/interface.bilibili.com/oversea\nipset=/3g.music.qq.com/oversea\nipset=/mqqplayer.3g.qq.com/oversea\nipset=/proxy.music.qq.com/oversea\nipset=/proxymc.qq.com/oversea\nipset=/ip2.kugou.com/oversea\nipset=/ip.kugou.com/oversea\nipset=/client.api.ttpod.com/oversea\nipset=/mobi.kuwo.cn/oversea\nipset=/mobilefeedback.kugou.com/oversea\nipset=/tingapi.ting.baidu.com/oversea\nipset=/music.baidu.com/oversea\nipset=/serviceinfo.sdk.duomi.com/oversea\nipset=/music.163.com/oversea\nipset=/www.xiami.com/oversea\nipset=/spark.api.xiami.com/oversea\nipset=/iplocation.geo.qiyi.com/oversea\nipset=/sns.video.qq.com/oversea\nipset=/v5.pc.duomi.com/oversea\nipset=/tms.is.ysten.com/oversea\nipset=/internal.check.duokanbox.com/oversea\nipset=/openapi.youku.com/oversea\nipset=/y.qq.com/oversea\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/etc/ssrplus/white.list",
    "content": "bilibili.com\nbilibili.cn\nbilivideo.com\nbilivideo.cn\nbiliapi.com\nbiliapi.net\napple.com"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/etc/uci-defaults/luci-ssr-plus",
    "content": "#!/bin/sh\n\nif [ -e \"/etc/config/ucitrack\" ]; then\n    uci -q batch <<-EOF\n        delete ucitrack.@shadowsocksr[-1]\n        add ucitrack shadowsocksr\n        set ucitrack.@shadowsocksr[-1].init=shadowsocksr\n        commit ucitrack\nEOF\nfi\n\nuci -q batch <<-EOF\n\tdelete firewall.shadowsocksr\n\tset firewall.shadowsocksr=include\n\tset firewall.shadowsocksr.type=script\n\tset firewall.shadowsocksr.path=/var/etc/shadowsocksr.include\n\t$(command -v fw4 >/dev/null 2>&1 || echo \"set firewall.shadowsocksr.reload=1\")\n\tcommit firewall\nEOF\n\nrm -rf /etc/config/shadowsocksr-opkg /etc/ssrplus/*opkg\ntouch /etc/ssrplus/china_ssr.txt\ntouch /etc/ssrplus/deny.list\ntouch /etc/ssrplus/white.list\ntouch /etc/ssrplus/black.list\ntouch /etc/ssrplus/netflix.list\ntouch /etc/ssrplus/netflixip.list\ntouch /etc/ssrplus/gfw_base.conf\ntouch /etc/ssrplus/gfw_list.conf\ntouch /etc/ssrplus/oversea_list.conf\ntouch /etc/ssrplus/ad.conf\ntouch /etc/config/shadowsocksr\n\nif [ -s \"/etc/config/shadowsocksr\" ]; then\n    if uci -q get shadowsocksr.@server_subscribe[0].auto_update_time > /dev/null; then\n        uci -q delete shadowsocksr.@server_subscribe[0].auto_update_time\n    fi\n\n    if ! uci -q get shadowsocksr.@server_subscribe[0].auto_update_week_time > /dev/null; then\n        uci -q set shadowsocksr.@server_subscribe[0].auto_update_week_time='*'\n        uci -q set shadowsocksr.@server_subscribe[0].auto_update_day_time='2'\n        uci -q set shadowsocksr.@server_subscribe[0].auto_update_min_time='0'\n    fi\n\n    if ! uci -q get shadowsocksr.@server_subscribe[0].ss_type > /dev/null; then\n        uci -q set shadowsocksr.@server_subscribe[0].ss_type='ss-rust'\n    fi\n\n    if ! uci -q get shadowsocksr.@server_subscribe[0].user_agent > /dev/null; then\n        uci -q set shadowsocksr.@server_subscribe[0].user_agent='v2rayN/9.99'\n    fi\n\n    if ! uci -q get shadowsocksr.@server_subscribe[0].xray_hy2_type > /dev/null; then\n        uci -q set shadowsocksr.@server_subscribe[0].xray_hy2_type='hysteria2'\n    fi\n\n    if ! uci -q get shadowsocksr.@global_xray_fragment[0] > /dev/null; then\n        uci -q add shadowsocksr global_xray_fragment\n        uci -q set shadowsocksr.@global_xray_fragment[0].fragment='0'\n        uci -q set shadowsocksr.@global_xray_fragment[0].noise='0'\n    fi\n\n    uci -q commit shadowsocksr\nfi\n\n[ -s \"/etc/config/shadowsocksr\" ] || /etc/init.d/shadowsocksr reset\n\nsed -i \"s/option type 'vmess'/option type 'v2ray'\\n\\toption v2ray_protocol 'vmess'/g\" /etc/config/shadowsocksr\nsed -i \"s/option type 'vless'/option type 'v2ray'\\n\\toption v2ray_protocol 'vless'/g\" /etc/config/shadowsocksr\nsed -i \"s/option encrypt_method_v2ray_ss/option encrypt_method_ss/g\" /etc/config/shadowsocksr\nsed -i \"s/option xtls/option tls/g\" /etc/config/shadowsocksr\nsed -i \"/option vless_flow/d\" /etc/config/shadowsocksr\nsed -i \"/option fingerprint 'disable'/d\" /etc/config/shadowsocksr\n\nif [ -s \"/etc/uwsgi/vassals/luci-webui.ini\" ];then\n\tlimit=$(cat /etc/uwsgi/vassals/luci-webui.ini  | grep -Eo \"limit-as.*\"|grep -Eo \"[0-9]+\")\n\t[ $limit -lt 5000 ] && sed -i '/limit-as/c\\limit-as = 5000' /etc/uwsgi/vassals/luci-webui.ini && \\\n\t/etc/init.d/uwsgi restart\nfi\n\nrm -f /tmp/luci-indexcache /tmp/luci-indexcache.*\nrm -rf /tmp/luci-modulecache/\nexit 0\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/usr/bin/ssr-monitor",
    "content": "#!/bin/sh\n#\n# Copyright (C) 2017 openwrt-ssr\n# Copyright (C) 2017 yushi studio <ywb94@qq.com>\n#\n# This is free software, licensed under the GNU General Public License v3.\n# See /LICENSE for more information.\n#\n. $IPKG_INSTROOT/etc/init.d/shadowsocksr\nLOCK_FILE=\"/var/lock/ssr-monitor.lock\"\n[ -f \"$LOCK_FILE\" ] && exit 2\ntouch \"$LOCK_FILE\"\nserver_process_count=$1\nredir_tcp_process=$2\nredir_udp_process=$3\nkcp_process=$4\nlocal_process=$5\npdnsd_process=$6\nif [ -z \"$pdnsd_process\" ]; then\n\tpdnsd_process=0\nfi\ni=0\nGLOBAL_SERVER=$(uci_get_by_type global global_server)\nserver=$(uci_get_by_name $GLOBAL_SERVER server)\nkcp_port=$(uci_get_by_name $GLOBAL_SERVER kcp_port)\nserver_port=$(uci_get_by_name $GLOBAL_SERVER server_port)\npassword=$(uci_get_by_name $GLOBAL_SERVER kcp_password)\nkcp_param=$(uci_get_by_name $GLOBAL_SERVER kcp_param)\n[ \"$password\" != \"\" ] && password=\"--key \"${password}\n\nwhile [ \"1\" == \"1\" ]; do #死循环\n\tsleep 000030s\n\t#redir tcp\n\tif [ \"$redir_tcp_process\" -gt 0 ]; then\n\t\ticount=$(busybox ps -w | grep ssr-retcp | grep -v grep | wc -l)\n\t\tif [ \"$icount\" == 0 ]; then\n\t\t\tlogger -t \"$NAME\" \"ssrplus redir tcp error.restart!\"\n\t\t\techolog \"ssrplus redir tcp error.restart!\"\n\t\t\t/etc/init.d/shadowsocksr restart\n\t\t\texit 0\n\t\tfi\n\tfi\n\t#redir udp\n\tif [ \"$redir_udp_process\" -gt 0 ]; then\n\t\ticount=$(busybox ps -w | grep ssr-reudp | grep -v grep | wc -l)\n\t\tif [ \"$icount\" == 0 ]; then\n\t\t\tlogger -t \"$NAME\" \"ssrplus redir udp error.restart!\"\n\t\t\techolog \"ssrplus redir udp error.restart!\"\n\t\t\t/etc/init.d/shadowsocksr restart\n\t\t\texit 0\n\t\tfi\n\tfi\n\t#server\n\tif [ \"$server_process_count\" -gt 0 ]; then\n\t\ticount=$(busybox ps -w | grep ssr-server | grep -v grep | wc -l)\n\t\tif [ \"$icount\" -lt \"$server_process_count\" ]; then #如果进程挂掉就重启它\n\t\t\tlogger -t \"$NAME\" \"ssrplus server error.restart!\"\n\t\t\techolog \"ssrplus server error.restart!\"\n\t\t\tkill -9 $(busybox ps -w | grep ssr-server | grep -v grep | awk '{print $1}') >/dev/null 2>&1\n\t\t\t/etc/init.d/shadowsocksr restart\n\t\t\texit 0\n\t\tfi\n\tfi\n\t#kcptun\n\tif [ \"$kcp_process\" -gt 0 ]; then\n\t\ticount=$(busybox ps -w | grep kcptun-client | grep -v grep | wc -l)\n\t\tif [ \"$icount\" -lt \"$kcp_process\" ]; then #如果进程挂掉就重启它\n\t\t\tlogger -t \"$NAME\" \"ssrplus kcptun error.restart!\"\n\t\t\techolog \"ssrplus kcptun error.restart!\"\n\t\t\tkillall -q -9 kcptun-client\n\t\t\t(/usr/bin/kcptun-client -r $server:$kcp_port -l :$server_port $password $kcp_param &)\n\t\tfi\n\tfi\n\t#localsocks\n\tif [ \"$local_process\" -gt 0 ]; then\n\t\ticount=$(busybox ps -w | grep ssr-local | grep -v grep | wc -l)\n\t\tif [ \"$icount\" -lt \"$local_process\" ]; then #如果进程挂掉就重启它\n\t\t\tlogger -t \"$NAME\" \"global socks server error.restart!\"\n\t\t\techolog \"global socks server error.restart!\"\n\t\t\tkill -9 $(busybox ps -w | grep ssr-local | grep -v grep | awk '{print $1}') >/dev/null 2>&1\n\t\t\t/etc/init.d/shadowsocksr restart\n\t\t\texit 0\n\t\tfi\n\tfi\n\t#dns2tcp\n\tif [ \"$pdnsd_process\" -eq 1 ]; then\n\t\ticount=$(busybox ps -w | grep $TMP_BIN_PATH/dns2tcp | grep -v grep | wc -l)\n\t\tif [ \"$icount\" -lt 1 ]; then #如果进程挂掉就重启它\n\t\t\tlogger -t \"$NAME\" \"dns2tcp tunnel error.restart!\"\n\t\t\techolog \"dns2tcp tunnel error.restart!\"\n\t\t\tdnsserver=$(uci_get_by_type global tunnel_forward 8.8.4.4:53)\n\t\t\tkill -9 $(busybox ps -w | grep $TMP_BIN_PATH/dns2tcp | grep -v grep | awk '{print $1}') >/dev/null 2>&1\n\t\t\tln_start_bin $(first_type dns2tcp) dns2tcp -L \"127.0.0.1#$dns_port\" -R \"${dnsserver/:/#}\"\n\t\tfi\n\t#dns2socks\n\telif [ \"$pdnsd_process\" -eq 2 ]; then\n\t\ticount=$(busybox ps -w | grep -e ssrplus-dns -e \"dns2socks 127.0.0.1 $tmp_dns_port\" | grep -v grep | wc -l)\n\t\tif [ \"$icount\" -lt 1 ]; then #如果进程挂掉就重启它\n\t\t\tlogger -t \"$NAME\" \"dns2socks $dnsserver tunnel error.restart!\"\n\t\t\techolog \"dns2socks $dnsserver tunnel error.restart!\"\n\t\t\tdnsserver=$(uci_get_by_type global tunnel_forward 8.8.4.4:53)\n\t\t\tkill -9 $(busybox ps -w | grep ssrplus-dns | grep -v grep | awk '{print $1}') >/dev/null 2>&1\n\t\t\tkill -9 $(busybox ps -w | grep \"dns2socks 127.0.0.1 $tmp_dns_port\" | grep -v grep | awk '{print $1}') >/dev/null 2>&1\n\t\t\tln_start_bin $(first_type microsocks) microsocks -i 127.0.0.1 -p $tmp_dns_port ssrplus-dns\n\t\t\tln_start_bin $(first_type dns2socks) dns2socks 127.0.0.1:$tmp_dns_port $dnsserver 127.0.0.1:$dns_port -q\n\t\tfi\n\t#dns2socks-rust\n\telif [ \"$pdnsd_process\" -eq 3 ]; then\n\t\ticount=$(busybox ps -w | grep -e ssrplus-dns -e \"dns2socks-rust -s socks5://127.0.0.1 $tmp_dns_port\" | grep -v grep | wc -l)\n\t\tif [ \"$icount\" -lt 1 ]; then #如果进程挂掉就重启它\n\t\t\tlogger -t \"$NAME\" \"dns2socks-rust $dnsserver tunnel error.restart!\"\n\t\t\techolog \"dns2socks-rust $dnsserver tunnel error.restart!\"\n\t\t\tdnsserver=$(uci_get_by_type global tunnel_forward 8.8.4.4:53)\n\t\t\tkill -9 $(busybox ps -w | grep ssrplus-dns | grep -v grep | awk '{print $1}') >/dev/null 2>&1\n\t\t\tkill -9 $(busybox ps -w | grep \"dns2socks-rust -s socks5://127.0.0.1 $tmp_dns_port\" | grep -v grep | awk '{print $1}') >/dev/null 2>&1\n\t\t\tln_start_bin $(first_type microsocks) microsocks -i 127.0.0.1 -p $tmp_dns_port ssrplus-dns\n\t\t\tln_start_bin $(first_type dns2socks) dns2socks-rust -s socks5://127.0.0.1:$tmp_dns_port -d $dnsserver -l 127.0.0.1:$dns_port -f -c\n\t\tfi\n\t#mosdns\n\telif [ \"$pdnsd_process\" -eq 4 ]; then\n\t\ticount=$(busybox ps -w | grep $TMP_BIN_PATH/mosdns | grep -v grep | wc -l)\n\t\tif [ \"$icount\" -lt 1 ]; then #如果进程挂掉就重启它\n\t\t\tlogger -t \"$NAME\" \"mosdns tunnel error.restart!\"\n\t\t\techolog \"mosdns tunnel error.restart!\"\n\t\t\tdnsserver=$(uci_get_by_type global tunnel_forward 8.8.4.4:53)\n\t\t\tkill -9 $(busybox ps -w | grep $TMP_BIN_PATH/mosdns | grep -v grep | awk '{print $1}') >/dev/null 2>&1\n\t\t\tln_start_bin $(first_type mosdns) mosdns start -c /etc/mosdns/config.yaml\n\t#dnsproxy\n\telif [ \"$pdnsd_process\" -eq 5 ]; then\n\t\ticount=$(busybox ps -w | grep -e ssrplus-dns -e \"dnsproxy -l 127.0.0.1 -p $tmp_dns_port\" | grep -v grep | wc -l)\n\t\tif [ \"$icount\" -lt 1 ]; then #如果进程挂掉就重启它\n\t\t\tlogger -t \"$NAME\" \"dnsproxy $dnsserver tunnel error.restart!\"\n\t\t\techolog \"dnsproxy $dnsserver tunnel error.restart!\"\n\t\t\tlocal dnsproxy_dnsserver=\"$(uci_get_by_type global parse_method)\"\n\t\t\tif [ -n \"$dnsproxy_dnsserver\" ] && [ \"$dnsproxy_dnsserver\" != \"parse_file\" ]; then\n\t\t\t\tdnsserver=\"$(uci_get_by_type global dnsproxy_tunnel_forward 8.8.4.4:53)\"\n\t\t\tfi\n\t\t\tkill -9 $(busybox ps -w | grep \"dnsproxy -l 127.0.0.1 -p $tmp_dns_port\" | grep -v grep | awk '{print $1}') >/dev/null 2>&1\n\t\t\tdnsproxy_ipv6=\"$(uci_get_by_type global dnsproxy_ipv6)\"\n\t\t\t\tdisabled_ipv6=\"--ipv6-disabled\"\n\t\t\tfi\n\t\t\tif [ \"$dnsproxy_dnsserver\" != \"parse_file\" ]; then\n\t\t\t\tln_start_bin $(first_type dnsproxy) dnsproxy -l 127.0.0.1 -p $tmp_dns_port  -p $dns_port -u $dnsserver $disabled_ipv6 --cache --cache-min-ttl=3600\n\t\t\telse\n\t\t\t\tdnsproxy_dnsserver_file=\"$TMP_PATH/dnsproxy_dns.list\"\n\t\t\t\tcleaned_file=\"$TMP_PATH/cleaned_dns.list\"\n\t\t\t\ttemp_file=\"$TMP_PATH/temp_dns.list\"\n\t\t\t\t> \"$cleaned_file\"\n\t\t\t\t# 清理输入文件并去重\n\t\t\t\twhile IFS= read -r line || [ -n \"$line\" ]; do\n\t\t\t\t    line=$(echo \"$line\" | sed -E 's/^[ \\t\\r]+//; s/[ \\t\\r]+$//')\n\t\t\t\t\t[ -z \"$line\" ] && continue\n\t\t\t\t\techo \"$line\" | grep -qE '^#' && continue\n\t\t\t\t\techo \"$line\" >> \"$cleaned_file\"\n\t\t\t\tdone < \"/etc/ssrplus/dnsproxy_dns.list\"\n\t\t\t\t# 获取清理后文件的MD5\n\t\t\t\tcleaned_md5=$(md5sum \"$cleaned_file\" | awk '{print $1}')\n\t\t\t\tif [ ! -f \"$dnsproxy_dnsserver_file\" ]; then\n\t\t\t\t    cp \"$cleaned_file\" \"$dnsproxy_dnsserver_file\"\n\t\t\t\telse\n\t\t\t\t    target_md5=$(md5sum \"$dnsproxy_dnsserver_file\" | awk '{print $1}')\n\t\t\t\t\tif [ \"$cleaned_md5\" != \"$target_md5\" ]; then\n\t\t\t\t\t    > \"$temp_file\"\n\t\t\t\t\t    # 保留目标文件中也存在于清理文件的记录（去重）\n\t\t\t\t\t    while IFS= read -r line; do\n\t\t\t\t\t\t    line=$(echo \"$line\" | sed -E 's/^[ \\t\\r]+//; s/[ \\t\\r]+$//')\n\t\t\t\t\t\t    if grep -qixF \"$line\" \"$cleaned_file\" && ! grep -qixF \"$line\" \"$temp_file\"; then\n\t\t\t\t\t\t\t    echo \"$line\" >> \"$temp_file\"\n\t\t\t\t\t\t    fi\n\t\t\t\t\t\tdone < \"$dnsproxy_dnsserver_file\"\n\t\t\t\t\t\t# 添加清理文件中有但目标文件没有的记录（去重）\n\t\t\t\t\t\twhile IFS= read -r line; do\n\t\t\t\t\t\t    line=$(echo \"$line\" | sed -E 's/^[ \\t\\r]+//; s/[ \\t\\r]+$//')\n\t\t\t\t\t\t\tif ! grep -qixF \"$line\" \"$temp_file\"; then\n\t\t\t\t\t\t\t    echo \"$line\" >> \"$temp_file\"\n\t\t\t\t\t\t\tfi\n\t\t\t\t\t\tdone < \"$cleaned_file\"\n\t\t\t\t\t\ttemp_md5=$(md5sum \"$temp_file\" | awk '{print $1}')\n\t\t\t\t\t\tif [ \"$temp_md5\" != \"$target_md5\" ]; then\n\t\t\t\t\t\t    mv \"$temp_file\" \"$dnsproxy_dnsserver_file\"\n\t\t\t\t\t\telse\n\t\t\t\t\t\t    rm -f \"$temp_file\"\n\t\t\t\t\t\tfi\n\t\t\t\t\tfi\n\t\t\t\tfi\n\t\t\t\trm -f \"$cleaned_file\"\n\n\t\t\t\tif [ -n \"$dnsproxy_dnsserver_file\" ] && [ -s \"$dnsproxy_dnsserver_file\" ]; then\n\t\t\t\t\tlocal upstreams_logic_mode=\"$(uci_get_by_type global upstreams_logic_mode)\"\n\t\t\t\t\tln_start_bin $(first_type dnsproxy) dnsproxy -l 127.0.0.1 -p $tmp_dns_port  -p $dns_port -u $dnsproxy_dnsserver_file $disabled_ipv6 --cache --cache-min-ttl=3600 --upstream-mode=$upstreams_logic_mode\n\t\t\t\tfi\n\t\t\tfi\n\t\tfi\n\t#chinadns-ng(proxy)\n\telif [ \"$pdnsd_process\" -eq 6 ]; then\n\t\ticount=$(busybox ps -w | grep -e ssrplus-dns -e \"chinadns-ng -b 127.0.0.1 -l $tmp_dns_port\" | grep -v grep | wc -l)\n\t\tif [ \"$icount\" -lt 1 ]; then #如果进程挂掉就重启它\n\t\t\tlogger -t \"$NAME\" \"chinadns-ng $dnsserver tunnel error.restart!\"\n\t\t\techolog \"chinadns-ng $dnsserver tunnel error.restart!\"\n\t\t\tdnsserver=$(uci_get_by_type global chinadns_ng_tunnel_forward 8.8.4.4:53)\n\t\t\tkill -9 $(busybox ps -w | grep \"chinadns-ng -b 127.0.0.1 -l $tmp_dns_port\" | grep -v grep | awk '{print $1}') >/dev/null 2>&1\n\t\t\tlocal chinadns_ng_proto=\"$(uci_get_by_type global chinadns_ng_proto)\"\n\t\t\tlocal chinadns_ng_dns=\"\"\n\t\t\tIFS=','\n\t\t\tfor chinadns_ng_server in $dnsserver; do\n\t\t\t\tlocal chinadns_ng_ip=\"${chinadns_ng_server%%:*}\"\n\t\t\t\tlocal chinadns_ng_port=\"${chinadns_ng_server##*:}\"\n\t\t\t\t[ \"$chinadns_ng_ip\" = \"$chinadns_ng_port\" ] && chinadns_ng_port=\"53\"\n\t\t\t\tchinadns_ng_tls_port=\"853\"\n\t\t\t\tcase \"$chinadns_ng_proto\" in\n\t\t\t\t\t\"none\")\n\t\t\t\t\t\tchinadns_ng_server=\"${chinadns_ng_ip}#${chinadns_ng_port}\"\n\t\t\t\t\t\t;;\n\t\t\t\t\t\"tls\")\n\t\t\t\t\t\tchinadns_ng_server=\"${chinadns_ng_proto}://${chinadns_ng_ip}#${chinadns_ng_tls_port}\"\n\t\t\t\t\t\t;;\n\t\t\t\t\t*)\n\t\t\t\t\t\tchinadns_ng_server=\"${chinadns_ng_proto}://${chinadns_ng_ip}#${chinadns_ng_port}\"\n\t\t\t\t\t\t;;\n\t\t\t\tesac\n\t\t\t\t\tchinadns_ng_dns=\"${chinadns_ng_dns} -t ${chinadns_ng_server}\"\n\t\t\tdone\n\t\t\tunset IFS\n\t\t\tdnsserver=\"$chinadns_ng_dns\"\n\t\t\tln_start_bin $(first_type chinadns-ng) chinadns-ng -b 127.0.0.1 -l $tmp_dns_port -l $dns_port -p 3 -d gfw $dnsserver -N --filter-qtype 64,65 -f -r --cache 4096 --cache-stale 86400 --cache-refresh 20\n\t\tfi\n\tfi\n\t#chinadns-ng(china)\n\tif [ \"$(uci -q get \"dhcp.@dnsmasq[0]._unused_ssrp_changed\")\" = \"1\" ]; then\n\t\ticount=$(busybox ps -w | grep $TMP_BIN_PATH/chinadns-ng | grep -v grep | wc -l)\n\t\tif [ \"$icount\" -lt 1 ]; then #如果进程挂掉就重启它\n\t\t\tlogger -t \"$NAME\" \"chinadns-ng tunnel error.restart!\"\n\t\t\techolog \"chinadns-ng tunnel error.restart!\"\n\t\t\tchinadns=$(uci_get_by_type global chinadns_forward)\n\t\t\twandns=\"$(ifstatus wan | jsonfilter -e '@[\"dns-server\"][0]' || echo \"119.29.29.29\")\"\n\t\t\tcase \"$chinadns\" in\n\t\t\t\"wan\") chinadns=\"$wandns\" ;;\n\t\t\t\"\"|\"wan_114\") chinadns=\"$wandns,114.114.114.114\" ;;\n\t\t\tesac\n\t\t\tkill -9 $(busybox ps -w | grep $TMP_BIN_PATH/chinadns-ng | grep -v grep | awk '{print $1}') >/dev/null 2>&1\n\t\t\tln_start_bin $(first_type chinadns-ng) chinadns-ng -l $china_dns_port -4 china -p 3 -c ${chinadns/:/#} -t 127.0.0.1#$dns_port -N -f -r\n\t\tfi\n\tfi\ndone\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/usr/bin/ssr-rules",
    "content": "#!/bin/sh\n#\n# Copyright (C) 2017 openwrt-ssr\n# Copyright (C) 2017 yushi studio <ywb94@qq.com>\n#\n# This is free software, licensed under the GNU General Public License v3.\n# See /LICENSE for more information.\n#\n\n. $IPKG_INSTROOT/etc/init.d/shadowsocksr\n\n# Detect firewall version and set appropriate tools\ndetect_firewall() {\n\tcheck_run_environment\n\tcase \"$USE_TABLES\" in\n\t\tnftables)\n\t\t\tUSE_NFT=1  \n\t\t\tNFT=\"nft\"\n\t\t\techolog \"ssr-rules: Using nftables\"\n\t\t\t;;\n\t\tiptables)\n\t\t\tUSE_NFT=0\n\t\t\tIPT=\"iptables -t nat\"        # alias of iptables TCP\n\t\t\tipt=\"iptables -t mangle\"     # alias of iptables UDP\n\t\t\techolog \"ssr-rules: Using iptables\"\n\t\t\t;;\n\t\t*)\n\t\t\techolog \"ERROR: No supported firewall backend\"\n\t\t\treturn 1\n\t\t\t;;\n\tesac\n\tFWI=$(uci get firewall.shadowsocksr.path 2>/dev/null)  # firewall include file\n}\n\n# Initialize firewall detection\ndetect_firewall\n\nTAG=\"_SS_SPEC_RULE_\"                                  # comment tag\n\n# Initialize all global switch variables (for both NFT and IPT)\n# These variables will be set in getopts parameter parsing\nENABLE_AUTO_UPDATE=0\nSTOP_AUTO_UPDATE=0\nFORCE_UPDATE=0\nCHECK_STATUS=0\nRESTORE_RULES=0\nFLUSH_RULES=0\nCLEANUP_PERSISTENCE=0\n# ASCII code for SSRP.Use whatever,just not the same.\nFWMARK=\"0x53535250\"\n\nif [ \"$USE_NFT\" = \"1\" ]; then\n\t# NFTables persistence directory\n\tNFTABLES_RULES_DIR=\"/usr/share/nftables.d/ruleset-post\"\n\tNFTABLES_RULES_FILE=\"$NFTABLES_RULES_DIR/99-shadowsocksr.nft\"\n\t# Auto-update configuration\n\tAUTO_UPDATE_INTERVAL=300  # auto-update check interval (seconds), 0 means disable\nfi\n\n# Modified usage function\nusage() {\n\tcat <<-EOF\n\t\tUsage: ssr-rules [options]\n\n\t\tValid options are:\n\n\t\t    -s <server_ip>          ip address of shadowsocksr remote server\n\t\t    -l <local_port>         port number of shadowsocksr local server\n\t\t    -S <server_ip>          ip address of shadowsocksr remote UDP server\n\t\t    -L <local_port>         port number of shadowsocksr local UDP server\n\t\t    -i <ip_list_file>       a file content is bypassed ip list\n\t\t    -a <lan_ips>            lan ip of access control, need a prefix to\n\t\t                            define access control mode\n\t\t    -b <wan_ips>            wan ip of will be bypassed\n\t\t    -w <wan_ips>            wan ip of will be forwarded\n\t\t    -B <bp_lan_ips>         lan ip of will be bypassed proxy\n\t\t    -p <fp_lan_ips>         lan ip of will be global proxy\n\t\t    -G <gm_lan_ips>         lan ip of will be game mode proxy\n\t\t    -D <proxy_ports>        proxy ports\n\t\t    -F                      shunt mode\n\t\t    -N                      shunt server IP\n\t\t    -M                      shunt proxy mode\n\t\t    -m <Interface>          Interface name\n\t\t    -I <ip_list_file>       a file content is bypassed shunt ip list\n\t\t    -e <extra_options>      extra options for iptables\n\t\t    -o                      apply the rules to the OUTPUT chain\n\t\t    -O                      apply the global rules to the OUTPUT chain\n\t\t    -u                      enable udprelay mode, TPROXY is required\n\t\t    -U                      enable udprelay mode, using different IP\n\t\t                            and ports for TCP and UDP\n\t\t    -f                      flush the rules\n\t\t    -g                      gfwlist mode\n\t\t    -r                      router mode\n\t\t    -c                      oversea mode\n\t\t    -z                      all mode\n\t\t    \n\t\t    # New persistence management options (use different letters to avoid conflicts)\n\t\t    -A                      enable auto-update daemon\n\t\t    -K                      stop auto-update daemon  \n\t\t    -P                      force update persistence\n\t\t    -C                      check rules status\n\t\t    -R                      restore rules from persistence file\n\t\t    -X                      cleanup persistence files on stop\n\t\t    \n\t\t    -h                      show this help message and exit\n\tEOF\n\texit $1\n}\n\nloger() {\n\t# 1.alert 2.crit 3.err 4.warn 5.notice 6.info 7.debug\n\tlogger -st ssr-rules[$$] -p$1 $2\n}\n\n# IP list normalization function (for comparison)\nnormalize_ip_list() {\n\techo \"$1\" | tr ' ' '\\n' | sort | tr '\\n' ' ' | sed 's/ $//'\n}\n\n# Check if IP list has changed\ncheck_ip_list_changed() {\n\tlocal current_list=\"$1\"\n\tlocal last_list=\"$2\"\n\tlocal list_name=\"$3\"\n\t\n\tlocal current_norm=$(normalize_ip_list \"$current_list\")\n\tlocal last_norm=$(normalize_ip_list \"$last_list\")\n\t\n\tif [ \"$current_norm\" != \"$last_norm\" ]; then\n\t\tloger 6 \"$list_name changed: '$last_norm' -> '$current_norm'\"\n\t\treturn 1  # changed\n\telse\n\t\tloger 6 \"$list_name unchanged: '$current_norm'\"\n\t\treturn 0  # unchanged\n\tfi\n}\n\n# Cleanup persistence and runtime module files\ncleanup_persistence_files() {\n\tif [ \"$USE_NFT\" != \"1\" ]; then\n\t\treturn 0\n\tfi\n\n\t# Remove persistence rule file\n\tif [ -f \"$NFTABLES_RULES_FILE\" ]; then\n\t\trm -f \"$NFTABLES_RULES_FILE\" 2>/dev/null\n\t\tloger 5 \"Removed persistence file: $NFTABLES_RULES_FILE\"\n\tfi\n\n\t# Remove run mode file\n\tif [ -f \"/tmp/.ssr_run_mode\" ]; then\n\t\trm -f \"/tmp/.ssr_run_mode\" 2>/dev/null\n\t\tloger 5 \"Removed run mode file: /tmp/.ssr_run_mode\"\n\tfi\n\n\t# Remove TPROXY file\n\tif [ -f \"/tmp/.last_tproxy\" ]; then\n\t\trm -f \"/tmp/.last_tproxy\" 2>/dev/null\n\t\tloger 5 \"Removed run mode file: /tmp/.last_tproxy\"\n\tfi\n\n\t# Remove PROXY_PORTS file\n\tif [ -f \"/tmp/.last_proxy_ports\" ]; then\n\t\trm -f \"/tmp/.last_proxy_ports\" 2>/dev/null\n\t\tloger 5 \"Removed run mode file: /tmp/.last_proxy_ports\"\n\tfi\n\n\t# Remove WAN_BP_IP file\n\tif [ -f \"/tmp/.last_wan_bp_ip\" ]; then\n\t\trm -f \"/tmp/.last_wan_bp_ip\" 2>/dev/null\n\t\tloger 5 \"Removed run mode file: /tmp/.last_wan_bp_ip\"\n\tfi\n\n\t# Remove LAN_AC_IP file\n\tif [ -f \"/tmp/.last_lan_ac_ip\" ]; then\n\t\trm -f \"/tmp/.last_lan_ac_ip\" 2>/dev/null\n\t\tloger 5 \"Removed run mode file: /tmp/.last_lan_ac_ip\"\n\tfi\n\n\t# Remove LAN_BP_IP file\n\tif [ -f \"/tmp/.last_lan_bp_ip\" ]; then\n\t\trm -f \"/tmp/.last_lan_bp_ip\" 2>/dev/null\n\t\tloger 5 \"Removed run mode file: /tmp/.last_lan_bp_ip\"\n\tfi\n\n\t# Remove WAN_FW_IP file\n\tif [ -f \"/tmp/.last_wan_fw_ip\" ]; then\n\t\trm -f \"/tmp/.last_wan_fw_ip\" 2>/dev/null\n\t\tloger 5 \"Removed run mode file: /tmp/.last_wan_fw_ip\"\n\tfi\n\n\t# Remove LAN_FP_IP file\n\tif [ -f \"/tmp/.last_lan_fp_ip\" ]; then\n\t\trm -f \"/tmp/.last_lan_fp_ip\" 2>/dev/null\n\t\tloger 5 \"Removed run mode file: /tmp/.last_lan_fp_ip\"\n\tfi\n\n\t# Remove LAN_GM_IP file\n\tif [ -f \"/tmp/.last_lan_gm_ip\" ]; then\n\t\trm -f \"/tmp/.last_lan_gm_ip\" 2>/dev/null\n\t\tloger 5 \"Removed run mode file: /tmp/.last_lan_gm_ip\"\n\tfi\n\n\t# Remove xhttp file state and hash files\n\tif [ -f \"/tmp/.last_xhttp_file\" ]; then\n\t\trm -f \"/tmp/.last_xhttp_file\" 2>/dev/null\n\t\tloger 5 \"Removed xhttp file state: /tmp/.last_xhttp_file\"\n\tfi\n\tif [ -f \"/tmp/.last_xhttp_hash\" ]; then\n\t\trm -f \"/tmp/.last_xhttp_hash\" 2>/dev/null\n\t\tloger 5 \"Removed xhttp hash file: /tmp/.last_xhttp_hash\"\n\tfi\n\n\tloger 5 \"Persistence cleanup completed\"\n\treturn 0\n}\n\nflush_r() {\n\tif [ \"$USE_NFT\" = \"1\" ]; then\n\t\tflush_nftables\n\telse\n\t\tflush_iptables_legacy\n\tfi\n\treturn 0\n}\n\nflush_nftables() {\n\t# Delete inet ss_spec table\n\tif $NFT list table inet ss_spec >/dev/null 2>&1; then\n\t\t# Delete all chains\n\t\tlocal CHAINS=$($NFT list table inet ss_spec | awk '/chain [a-zA-Z0-9_-]+/ {print $2}' | sort -u)\n\t\tfor chain in $CHAINS; do\n\t\t\t$NFT flush chain inet ss_spec $chain 2>/dev/null\n\t\t\t$NFT delete chain inet ss_spec $chain 2>/dev/null\n\t\tdone\n\n\t\t# Delete all sets\n\t\tlocal SETS=$($NFT list table inet ss_spec | awk '/set [a-zA-Z0-9_-]+/ {print $2}' | sort -u)\n\t\tfor setname in $SETS; do\n\t\t\t$NFT flush set inet ss_spec $setname 2>/dev/null\n\t\t\t$NFT delete set inet ss_spec $setname 2>/dev/null\n\t\tdone\n\n\t\t# Delete entire table\n\t\t$NFT delete table inet ss_spec 2>/dev/null\n\tfi\n\n\t# Delete ip ss_spec_mangle table (if exists)\n\tif $NFT list table ip ss_spec_mangle >/dev/null 2>&1; then\n\t\t# Delete all chains\n\t\tlocal CHAINS=$($NFT list table ip ss_spec_mangle | awk '/chain [a-zA-Z0-9_-]+/ {print $2}' | sort -u)\n\t\tfor chain in $CHAINS; do\n\t\t\t$NFT flush chain ip ss_spec_mangle $chain 2>/dev/null\n\t\t\t$NFT delete chain ip ss_spec_mangle $chain 2>/dev/null\n\t\tdone\n\n\t\t# Delete all sets\n\t\tlocal SETS=$($NFT list table ip ss_spec_mangle | awk '/set [a-zA-Z0-9_-]+/ {print $2}' | sort -u)\n\t\tfor setname in $SETS; do\n\t\t\t$NFT flush set ip ss_spec_mangle $setname 2>/dev/null\n\t\t\t$NFT delete set ip ss_spec_mangle $setname 2>/dev/null\n\t\tdone\n\t\t# Delete entire table\n\t\t$NFT delete table ip ss_spec_mangle 2>/dev/null\n\tfi\n\n\t# Delete policy routing mark rules\n\tif ip rule show | grep -Eq \"fwmark ${FWMARK}.*lookup 999\"; then\n\t\tip rule del fwmark ${FWMARK} table 999 2>/dev/null\n\tfi\n\tif ip route show table 999 | grep -Eq \"^local.*dev lo\"; then\n\t\tip route del local 0.0.0.0/0 dev lo table 999 2>/dev/null\n\tfi\n\n\t# Optional: force delete all ss_spec related sets (even if table was accidentally deleted)\n\tfor setname in ss_spec_lan_ac ss_spec_wan_ac ssr_gen_router \\\n\t\t\tchina fplan bplan gmlan oversea whitelist blacklist netflix gfwlist music; do\n\t\t$NFT delete set inet ss_spec $setname 2>/dev/null\n\t\t$NFT delete set ip ss_spec_mangle $setname 2>/dev/null\n\tdone\n\n\t# Reset firewall include file\n\t[ -n \"$FWI\" ] && echo '#!/bin/sh' >\"$FWI\"\n\n\t# Cleanup persistence and runtime module files\n\tif [ \"$CLEANUP_PERSISTENCE\" = \"1\" ]; then\n\t\tcleanup_persistence_files\n\tfi\n\n\tloger 6 \"Memory rules flushed successfully\"\n\n\treturn 0\n}\n\nflush_iptables_legacy() {\n\tflush_iptables() {\n\t\tlocal ipt=\"iptables -t $1\"\n\t\tlocal DAT=$(iptables-save -t $1)\n\t\teval $(echo \"$DAT\" | grep \"$TAG\" | sed -e 's/^-A/$ipt -D/' -e 's/$/;/')\n\t\tfor chain in $(echo \"$DAT\" | awk '/^:SS_SPEC/{print $1}'); do\n\t\t\t$ipt -F ${chain:1} 2>/dev/null && $ipt -X ${chain:1}\n\t\tdone\n\t}\n\tflush_iptables nat\n\tflush_iptables mangle\n\tif ip rule show | grep -Eq \"fwmark ${FWMARK}.*lookup 999\"; then\n\t\tip rule del fwmark ${FWMARK} table 999 2>/dev/null\n\tfi\n\tif ip route show table 999 | grep -Eq \"^local.*dev lo\"; then\n\t\tip route del local 0.0.0.0/0 dev lo table 999 2>/dev/null\n\tfi\n\tfor setname in ss_spec_lan_ac ss_spec_wan_ac ssr_gen_router \\\n\t\t\tchina fplan bplan gmlan oversea whitelist blacklist netflix gfwlist music; do\n\t\tipset -X $setname 2>/dev/null\n\tdone\n\t[ -n \"$FWI\" ] && echo '#!/bin/sh' >$FWI\n\treturn 0\n}\n\nipset_r() {\n\tif [ \"$USE_NFT\" = \"1\" ]; then\n\t\tipset_nft\n\telse\n\t\tipset_iptables\n\tfi\n\treturn $?\n}\n\nipset_nft() {\n\t# Create nftables table and sets\n\tif ! $NFT list table inet ss_spec >/dev/null 2>&1; then\n\t\t$NFT add table inet ss_spec 2>/dev/null\n\tfi\n\n\t# Create necessary collections\n\tfor setname in china gmlan fplan bplan whitelist blacklist netflix music; do\n\t\tif ! $NFT list set inet ss_spec $setname >/dev/null 2>&1; then\n\t\t\t$NFT add set inet ss_spec $setname '{ type ipv4_addr; flags interval; auto-merge; }' 2>/dev/null\n\t\telse\n\t\t\t$NFT flush set inet ss_spec $setname 2>/dev/null\n\t\tfi\n\tdone\n\n\t# Bulk import china ip list safely (avoid huge single element limitation)\n\tif [ -f \"$IGNORE_LIST\" ]; then\n\t\tSKIP_INET=1 /usr/share/shadowsocksr/chinaipset.sh \"$IGNORE_LIST\"\n\tfi\n\n\t# Bulk import xhttp ip list into nft whitelist (server + shunt)\n\tif [ -f \"${xhttp_ip:=/etc/ssrplus/xhttp_address.txt}\" ]; then\n\t\t$NFT add element inet ss_spec whitelist \"{ $(tr '\\n' ',' < \"${xhttp_ip}\" | sed 's/,$//') }\" 2>/dev/null\n\tfi\n\n\t# Add IP addresses to sets\n\tfor ip in $LAN_GM_IP; do \n\t\t[ -n \"$ip\" ] && $NFT add element inet ss_spec gmlan \"{ $ip }\" 2>/dev/null\n\tdone\n\tfor ip in $LAN_FP_IP; do \n\t\t[ -n \"$ip\" ] && $NFT add element inet ss_spec fplan \"{ $ip }\" 2>/dev/null\n\tdone\n\tfor ip in $LAN_BP_IP; do \n\t\t[ -n \"$ip\" ] && $NFT add element inet ss_spec bplan \"{ $ip }\" 2>/dev/null\n\tdone\n\tfor ip in $WAN_BP_IP; do \n\t\t[ -n \"$ip\" ] && $NFT add element inet ss_spec whitelist \"{ $ip }\" 2>/dev/null\n\tdone\n\tfor ip in $WAN_FW_IP; do \n\t\t[ -n \"$ip\" ] && $NFT add element inet ss_spec blacklist \"{ $ip }\" 2>/dev/null\n\tdone\n\n\t# Create main chains for WAN access control\n\tfor chain in ss_spec_wan_fw ss_spec_wan_ac; do\n\t\tif ! $NFT list chain inet ss_spec $chain >/dev/null 2>&1; then\n\t\t\t$NFT add chain inet ss_spec $chain\n\t\tfi\n\t\t$NFT flush chain inet ss_spec $chain\n\tdone\n\n\t# Add basic rules\n\t# BASIC RULES (exceptions first) — TCP\n\t$NFT add rule inet ss_spec ss_spec_wan_ac meta l4proto tcp tcp dport 53 ip daddr 127.0.0.0/8 return\n\t[ -n \"$server\" ] && $NFT add rule inet ss_spec ss_spec_wan_ac meta l4proto tcp tcp dport != 53 ip daddr \"$server\" return\n\n\t# Access control: blacklist -> whitelist -> fplan/bplan — TCP\n\t$NFT add rule inet ss_spec ss_spec_wan_ac ip daddr @blacklist jump ss_spec_wan_fw\n\t$NFT add rule inet ss_spec ss_spec_wan_ac ip daddr @whitelist return\n\t$NFT add rule inet ss_spec ss_spec_wan_ac ip saddr @fplan jump ss_spec_wan_fw\n\t$NFT add rule inet ss_spec ss_spec_wan_ac ip saddr @bplan return\n\n\t# Music unlocking support\n\tif $NFT list set inet ss_spec music >/dev/null 2>&1; then\n\t\t$NFT add rule inet ss_spec ss_spec_wan_ac meta l4proto tcp ip daddr @music return\n\tfi\n\n\t# Shunt/Netflix rules\n\tif [ -f \"$SHUNT_LIST\" ]; then\n\t\tfor ip in $(cat \"$SHUNT_LIST\" 2>/dev/null); do \n\t\t\t[ -n \"$ip\" ] && $NFT add element inet ss_spec netflix \"{ $ip }\" 2>/dev/null\n\t\tdone\n\tfi\n\n\t# Set up mode-specific rules\n\tcase \"$RUNMODE\" in\n\trouter)\n\t\tif ! $NFT list set inet ss_spec ss_spec_wan_ac >/dev/null 2>&1; then\n\t\t\t$NFT add set inet ss_spec ss_spec_wan_ac '{ type ipv4_addr; flags interval; auto-merge; }'\n\t\telse\n\t\t\t$NFT flush set inet ss_spec ss_spec_wan_ac 2>/dev/null\n\t\tfi\n\t\t# Add special IP ranges to WAN AC set\n\t\tfor ip in $(gen_spec_iplist); do\n\t\t\t[ -n \"$ip\" ] && $NFT add element inet ss_spec ss_spec_wan_ac \"{ $ip }\" 2>/dev/null\n\t\tdone\n\n\t\t$NFT add rule inet ss_spec ss_spec_wan_ac ip daddr @ss_spec_wan_ac return\n\t\t$NFT add rule inet ss_spec ss_spec_wan_ac ip daddr @china return\n\t\tif $NFT list chain inet ss_spec ss_spec_wan_ac >/dev/null 2>&1; then\n\t\t\t$NFT add rule inet ss_spec ss_spec_wan_ac ip saddr @gmlan ip daddr != @china jump ss_spec_wan_fw\n\t\t\t$NFT add rule inet ss_spec ss_spec_wan_ac jump ss_spec_wan_fw\n\t\tfi\n\t\t;;\n\tgfw)\n\t\tif ! $NFT list set inet ss_spec gfwlist >/dev/null 2>&1; then\n\t\t\t$NFT add set inet ss_spec gfwlist '{ type ipv4_addr; flags interval; auto-merge; }' 2>/dev/null\n\t\tfi\n\t\t$NFT add rule inet ss_spec ss_spec_wan_ac ip daddr @china return\n\t\t$NFT add rule inet ss_spec ss_spec_wan_ac ip daddr @gfwlist jump ss_spec_wan_fw\n\t\t$NFT add rule inet ss_spec ss_spec_wan_ac ip saddr @gmlan ip daddr != @china jump ss_spec_wan_fw\n\t\t;;\n\toversea)\n\t\tif ! $NFT list set inet ss_spec oversea >/dev/null 2>&1; then\n\t\t\t$NFT add set inet ss_spec oversea '{ type ipv4_addr; flags interval; auto-merge; }' 2>/dev/null\n\t\tfi\n\t\t$NFT add rule inet ss_spec ss_spec_wan_ac ip daddr @oversea jump ss_spec_wan_fw\n\t\t$NFT add rule inet ss_spec ss_spec_wan_ac ip saddr @gmlan jump ss_spec_wan_fw\n\t\t$NFT add rule inet ss_spec ss_spec_wan_ac ip daddr @china jump ss_spec_wan_fw\n\t\t;;\n\tall)\n\t\tif $NFT list chain inet ss_spec ss_spec_wan_fw >/dev/null 2>&1; then\n\t\t\t$NFT add rule inet ss_spec ss_spec_wan_ac jump ss_spec_wan_fw\n\t\tfi\n\t\t;;\n\tesac\n\n\treturn $?\n}\n\nipset_iptables() {\n\t[ -f \"$IGNORE_LIST\" ] && /usr/share/shadowsocksr/chinaipset.sh \"$IGNORE_LIST\"\n\n\t$IPT -N SS_SPEC_WAN_AC 2>/dev/null\n\t$IPT -F SS_SPEC_WAN_AC\n\n\t$IPT -I SS_SPEC_WAN_AC -p tcp --dport 53 -d 127.0.0.0/8 -j RETURN\n\t$IPT -I SS_SPEC_WAN_AC -p tcp ! --dport 53 -d \"$server\" -j RETURN\n\n\tipset -N gmlan hash:net 2>/dev/null\n\tfor ip in $LAN_GM_IP; do ipset -! add gmlan \"$ip\"; done\n\n\tcase \"$RUNMODE\" in\n\trouter)\n\t\tipset -! -R <<-EOF || return 1\n\t\t\tcreate ss_spec_wan_ac hash:net\n\t\t\t$(gen_spec_iplist | sed -e \"s/^/add ss_spec_wan_ac /\")\n\t\tEOF\n\t\t$IPT -A SS_SPEC_WAN_AC -m set --match-set ss_spec_wan_ac dst -j RETURN\n\t\t$IPT -A SS_SPEC_WAN_AC -m set --match-set china dst -j RETURN\n\t\t$IPT -A SS_SPEC_WAN_AC -m set --match-set gmlan src -m set ! --match-set china dst -j SS_SPEC_WAN_FW\n\t\t$IPT -A SS_SPEC_WAN_AC -j SS_SPEC_WAN_FW\n\t\t;;\n\tgfw)\n\t\tipset -N gfwlist hash:net 2>/dev/null\n\t\t$IPT -A SS_SPEC_WAN_AC -m set --match-set china dst -j RETURN\n\t\t$IPT -A SS_SPEC_WAN_AC -m set --match-set gfwlist dst -j SS_SPEC_WAN_FW\n\t\t$IPT -A SS_SPEC_WAN_AC -m set --match-set gmlan src -m set ! --match-set china dst -j SS_SPEC_WAN_FW\n\t\t;;\n\toversea)\n\t\tipset -N oversea hash:net 2>/dev/null\n\t\t$IPT -I SS_SPEC_WAN_AC -m set --match-set oversea dst -j SS_SPEC_WAN_FW\n\t\t$IPT -A SS_SPEC_WAN_AC -m set --match-set gmlan src -j SS_SPEC_WAN_FW\n\t\t$IPT -A SS_SPEC_WAN_AC -m set --match-set china dst -j SS_SPEC_WAN_FW\n\t\t;;\n\tall)\n\t\t$IPT -A SS_SPEC_WAN_AC -j SS_SPEC_WAN_FW\n\t\t;;\n\tesac\n\n\tipset -N fplan hash:net 2>/dev/null\n\tfor ip in $LAN_FP_IP; do ipset -! add fplan \"$ip\"; done\n\t$IPT -I SS_SPEC_WAN_AC -m set --match-set fplan src -j SS_SPEC_WAN_FW\n\n\tipset -N bplan hash:net 2>/dev/null\n\tfor ip in $LAN_BP_IP; do ipset -! add bplan \"$ip\"; done\n\t$IPT -I SS_SPEC_WAN_AC -m set --match-set bplan src -j RETURN\n\n\tipset -N whitelist hash:net 2>/dev/null\n\tif [ -f \"${xhttp_ip:=/etc/ssrplus/xhttp_address.txt}\" ]; then\n\t\twhile IFS= read -r ip; do\n\t\t\t[ -n \"$ip\" ] && ipset add whitelist \"$ip\" -exist\n\t\tdone < \"$xhttp_ip\"\n\tfi\n\n\tipset -N blacklist hash:net 2>/dev/null\n\t$IPT -I SS_SPEC_WAN_AC -m set --match-set blacklist dst -j SS_SPEC_WAN_FW\n\t$IPT -I SS_SPEC_WAN_AC -m set --match-set whitelist dst -j RETURN\n\n\tif [ $(ipset list music -name -quiet | grep music) ]; then\n\t\t$IPT -I SS_SPEC_WAN_AC -m set --match-set music dst -j RETURN 2>/dev/null\n\tfi\n\n\tfor ip in $WAN_BP_IP; do ipset -! add whitelist \"$ip\"; done\n\tfor ip in $WAN_FW_IP; do ipset -! add blacklist \"$ip\"; done\n\n\tif [ \"$SHUNT_PORT\" != \"0\" ]; then\n\t\tipset -N netflix hash:net 2>/dev/null\n\t\tfor ip in $(cat \"${SHUNT_LIST:=/dev/null}\" 2>/dev/null); do ipset -! add netflix \"$ip\"; done\n\t\tcase \"$SHUNT_PORT\" in\n\t\t0) ;;\n\t\t1)\n\t\t\t$IPT -I SS_SPEC_WAN_AC -p tcp -m set --match-set netflix dst -j REDIRECT --to-ports \"$local_port\"\n\t\t\t;;\n\t\t*)\n\t\t\t$IPT -I SS_SPEC_WAN_AC -p tcp -m set --match-set netflix dst -j REDIRECT --to-ports \"$SHUNT_PORT\"\n\t\t\tif [ \"$SHUNT_PROXY\" = \"1\" ]; then\n\t\t\t\t$IPT -I SS_SPEC_WAN_AC -p tcp -d \"$SHUNT_IP\" -j REDIRECT --to-ports \"$local_port\"\n\t\t\telse\n\t\t\t\tipset -! add whitelist \"$SHUNT_IP\"\n\t\t\tfi\n\t\t\t;;\n\t\tesac\n\tfi\n\treturn $?\n}\n\nfw_rule() {\n\tif [ \"$USE_NFT\" = \"1\" ]; then\n\t\tfw_rule_nft\n\telse\n\t\tfw_rule_iptables\n\tfi\n\treturn $?\n}\n\nfw_rule_nft() {\n\t# redirect/translation: when PROXY_PORTS present, redirect those tcp ports to local_port\n\tif [ -n \"$PROXY_PORTS\" ]; then\n\t\tPORTS_ARGS=$(echo \"$PROXY_PORTS\" | sed 's/-m multiport --dports //')\n\t\tif [ -n \"$PORTS_ARGS\" ]; then\n\t\t\tTCP_EXT_ARGS=\"meta l4proto tcp tcp dport { $PORTS_ARGS }\"\n\t\t\tTCP_RULE=\"meta l4proto tcp tcp dport { $PORTS_ARGS } counter redirect to :$local_port\"\n\t\tfi\n\telse\n\t\tTCP_EXT_ARGS=\"meta l4proto tcp\"\n\t\t# default: redirect everything except ssh(22)\n\t\tTCP_RULE=\"meta l4proto tcp tcp dport != 22 counter redirect to :$local_port\"\n\tfi\n\t# add TCP rule to fw chain if not exists (use -F exact match)\n\tif ! $NFT list chain inet ss_spec ss_spec_wan_fw 2>/dev/null | grep -F -- \"$TCP_RULE\" >/dev/null 2>&1; then\n\t\tif ! $NFT add rule inet ss_spec ss_spec_wan_fw $TCP_RULE 2>/dev/null; then\n\t\t\tloger 3 \"Can't redirect TCP, please check nftables.\"\n\t\t\treturn 1\n\t\tfi\n\tfi\n\n\tif [ \"$SHUNT_PORT\" != \"0\" ] && [ -f \"$SHUNT_LIST\" ]; then\n\t\tcase \"$SHUNT_PORT\" in\n\t\t1)\n\t\t\t$NFT add rule inet ss_spec ss_spec_wan_ac $TCP_EXT_ARGS ip daddr @netflix counter redirect to :$local_port\n\t\t\t;;\n\t\t*)\n\t\t\t$NFT add rule inet ss_spec ss_spec_wan_ac $TCP_EXT_ARGS ip daddr @netflix counter redirect to :$SHUNT_PORT\n\t\t\tif [ \"$SHUNT_PROXY\" = \"1\" ]; then\n\t\t\t\t$NFT add rule inet ss_spec ss_spec_wan_ac $TCP_EXT_ARGS ip daddr $SHUNT_IP counter redirect to :$local_port\n\t\t\telse\n                [ -n \"$SHUNT_IP\" ] && $NFT add element inet ss_spec whitelist \"{ $SHUNT_IP }\" 2>/dev/null\n\t\t\tfi\n            ;;\n\t\tesac\n\tfi\n\n\treturn $?\n}\n\nfw_rule_iptables() {\n\t# Create TCP chain in NAT table\n\t$IPT -N SS_SPEC_WAN_FW 2>/dev/null\n\t$IPT -F SS_SPEC_WAN_FW\n\n\tfor net in \\\n\t\t0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16 \\\n\t\t172.16.0.0/12 192.168.0.0/16 224.0.0.0/4 240.0.0.0/4\n\tdo\n\t\t$IPT -A SS_SPEC_WAN_FW -d \"$net\" -j RETURN\n\tdone\n\n\t$IPT -A SS_SPEC_WAN_FW -p tcp $PROXY_PORTS -j REDIRECT --to-ports \"$local_port\" 2>/dev/null || {\n\t\tloger 3 \"Can't redirect TCP, please check the iptables.\"\n\t\texit 1\n\t}\n\n\treturn $?\n}\n\nac_rule() {\n\tif [ \"$USE_NFT\" = \"1\" ]; then\n\t\tac_rule_nft\n\telse\n\t\tac_rule_iptables\n\tfi\n\treturn $?\n}\n\nac_rule_nft() {\n\tlocal MATCH_SET=\"\"\n\n\tif [ -n \"$LAN_AC_IP\" ]; then\n\t\t# Create LAN access control set if needed\n\t\tif ! $NFT list set inet ss_spec ss_spec_lan_ac >/dev/null 2>&1; then\n\t\t\t$NFT add set inet ss_spec ss_spec_lan_ac '{ type ipv4_addr; flags interval; }' 2>/dev/null\n\t\telse\n\t\t\t$NFT flush set inet ss_spec ss_spec_lan_ac 2>/dev/null\n\t\tfi\n\n\t\tfor ip in ${LAN_AC_IP#?}; do\n\t\t\t[ -n \"$ip\" ] && $NFT add element inet ss_spec ss_spec_lan_ac \"{ $ip }\" 2>/dev/null\n\t\tdone\n\n\t\tcase \"${LAN_AC_IP%${LAN_AC_IP#?}}\" in\n\t\tw | W)\n\t\t\tMATCH_SET=\"ip saddr @ss_spec_lan_ac\"\n\t\t\t;;\n\t\tb | B)\n\t\t\tMATCH_SET=\"ip saddr != @ss_spec_lan_ac\"\n\t\t\t;;\n\t\t*)\n\t\t\tloger 3 \"Bad argument \\`-a $LAN_AC_IP\\`.\"\n\t\t\treturn 2\n\t\t\t;;\n\t\tesac\n\tfi\n\n\t# Create ss_spec_prerouting tcp chain\n\tif ! $NFT list chain inet ss_spec ss_spec_prerouting >/dev/null 2>&1; then\n\t\t$NFT add chain inet ss_spec ss_spec_prerouting '{ type nat hook prerouting priority 0; policy accept; }'\n\tfi\n\t$NFT flush chain inet ss_spec ss_spec_prerouting 2>/dev/null\n\n\t# Exclude special local addresses\n\tif $NFT list chain inet ss_spec ss_spec_prerouting >/dev/null 2>&1; then\n\t\tfor net in 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16 172.16.0.0/12 192.168.0.0/16 224.0.0.0/4 240.0.0.0/4; do\n\t\t\t$NFT add rule inet ss_spec ss_spec_prerouting ip daddr $net return 2>/dev/null\n\t\tdone\n\tfi\n\n\t# Temporarily comment IPV6 for future enablement\n\t#if $NFT list chain inet ss_spec ss_spec_prerouting >/dev/null 2>&1; then\n\t#\tfor net in ::1/128 fe80::/10 fc00::/7 ff00::/8 ::/128 ::ffff:0:0/96; do\n\t#\t\t$NFT add rule inet ss_spec ss_spec_prerouting ip6 daddr $net return 2>/dev/null\n\t#\tdone\n\t#fi\n\n\t# Build a rule in the prerouting hook chain that jumps to business chain with conditions\n\tif [ -n \"$PROXY_PORTS\" ]; then\n\t\tPORTS_ARGS=$(echo \"$PROXY_PORTS\" | sed 's/-m multiport --dports //')\n\t\tif [ -n \"$PORTS_ARGS\" ]; then\n\t\t\tTCP_EXT_ARGS=\"meta l4proto tcp tcp dport { $PORTS_ARGS }\"\n\t\tfi\n\telse\n\t\tTCP_EXT_ARGS=\"meta l4proto tcp\"\n\tfi\n\n\t# Block UDP port 443 when TPROXY not Enable\n\tif [ -z \"$TPROXY\" ]; then\n\t\t# Add UDP 443 block rule\n\t\tif [ -z \"$Interface\" ]; then\n\t\t\tif [ -n \"$MATCH_SET\" ]; then\n\t\t\t\t$NFT add rule inet ss_spec ss_spec_prerouting meta l4proto udp $MATCH_SET udp dport 443 drop comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\t\telse\n\t\t\t\t$NFT add rule inet ss_spec ss_spec_prerouting meta l4proto udp udp dport 443 drop comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\t\tfi\n\t\telse\n\t\t\tfor name in $Interface; do\n\t\t\t\tlocal IFNAME=$(uci -P /var/state get network.\"$name\".ifname 2>/dev/null)\n\t\t\t\t[ -z \"$IFNAME\" ] && IFNAME=$(uci -P /var/state get network.\"$name\".device 2>/dev/null)\n\t\t\t\tif [ -n \"$IFNAME\" ]; then\n\t\t\t\t\tif [ -n \"$MATCH_SET\" ]; then\n\t\t\t\t\t\t$NFT add rule inet ss_spec ss_spec_prerouting meta iifname \"$IFNAME\" meta l4proto udp $MATCH_SET udp dport 443 drop comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\t\t\t\telse\n\t\t\t\t\t\t$NFT add rule inet ss_spec ss_spec_prerouting meta iifname \"$IFNAME\" meta l4proto udp udp dport 443 drop comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\t\t\t\tfi\n\t\t\t\tfi\n\t\t\tdone\n\t\tfi\n\tfi\n\tif [ -z \"$Interface\" ]; then\n\t\t# generic prerouting jump already exists (see ipset_nft), but if we have MATCH_SET_CONDITION we add a more specific rule\n\t\tif [ -n \"$MATCH_SET\" ]; then\n\t\t\t# add a more specific rule at the top of ss_spec_prerouting\n\t\t\t$NFT add rule inet ss_spec ss_spec_prerouting $TCP_EXT_ARGS $MATCH_SET jump ss_spec_wan_ac comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\telse\n\t\t\t$NFT add rule inet ss_spec ss_spec_prerouting $TCP_EXT_ARGS jump ss_spec_wan_ac comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\tfi\n\telse\n\t\t# For each Interface, find its actual ifname and add an iifname-limited prerouting rule\n\t\tfor name in $Interface; do\n\t\t\tlocal IFNAME=$(uci -P /var/state get network.\"$name\".ifname 2>/dev/null)\n\t\t\t[ -z \"$IFNAME\" ] && IFNAME=$(uci -P /var/state get network.\"$name\".device 2>/dev/null)\n\t\t\tif [ -n \"$IFNAME\" ]; then\n\t\t\t\tif [ -n \"$MATCH_SET\" ]; then\n\t\t\t\t\t$NFT add rule inet ss_spec ss_spec_prerouting meta iifname \"$IFNAME\" $TCP_EXT_ARGS $MATCH_SET jump ss_spec_wan_ac comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\t\t\telse\n\t\t\t\t\t$NFT add rule inet ss_spec ss_spec_prerouting meta iifname \"$IFNAME\" $TCP_EXT_ARGS jump ss_spec_wan_ac comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\t\t\tfi\n\t\t\tfi\n\t\tdone\n\tfi\n\tcase \"$OUTPUT\" in\n\t1)\n\t\t# Create ss_spec_output tcp chain\n\t\tif ! $NFT list chain inet ss_spec ss_spec_output >/dev/null 2>&1; then\n\t\t\t$NFT add chain inet ss_spec ss_spec_output '{ type nat hook output priority 0; policy accept; }'\n\t\tfi\n\t\t$NFT flush chain inet ss_spec ss_spec_output 2>/dev/null\n\t\t\n\t\t# Exclude special local addresses\n\t\tif $NFT list chain inet ss_spec ss_spec_output >/dev/null 2>&1; then\n\t\t\tfor net in 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16 172.16.0.0/12 192.168.0.0/16 224.0.0.0/4 240.0.0.0/4; do\n\t\t\t\t$NFT add rule inet ss_spec ss_spec_output ip daddr $net return 2>/dev/null\n\t\t\tdone\n\t\tfi\n\n\t\t# Temporarily comment IPV6 for future enablement\n\t\t#if $NFT list chain inet ss_spec ss_spec_output >/dev/null 2>&1; then\n\t\t#\tfor net in ::1/128 fe80::/10 fc00::/7 ff00::/8 ::/128 ::ffff:0:0/96; do\n\t\t#\t\t$NFT add rule inet ss_spec ss_spec_output ip6 daddr $net return 2>/dev/null\n\t\t#\tdone\n\t\t#fi\n\n\t\t# create output hook chain & route output traffic into router chain\n\t\t$NFT add rule inet ss_spec ss_spec_output $TCP_EXT_ARGS jump ss_spec_wan_ac comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\t;;\n\t2)\n\t\t# Create ss_spec_output tcp chain\n\t\tif ! $NFT list chain inet ss_spec ss_spec_output >/dev/null 2>&1; then\n\t\t\t$NFT add chain inet ss_spec ss_spec_output '{ type nat hook output priority 0; policy accept; }'\n\t\tfi\n\t\t$NFT flush chain inet ss_spec ss_spec_output 2>/dev/null\n\t\t\n\t\t# Exclude special local addresses\n\t\tif $NFT list chain inet ss_spec ss_spec_output >/dev/null 2>&1; then\n\t\t\tfor net in 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16 172.16.0.0/12 192.168.0.0/16 224.0.0.0/4 240.0.0.0/4; do\n\t\t\t\t$NFT add rule inet ss_spec ss_spec_output ip daddr $net return 2>/dev/null\n\t\t\tdone\n\t\tfi\n\n\t\t# router mode output chain: create ssr_gen_router set & router chain\n\t\t$NFT add set inet ss_spec ssr_gen_router '{ type ipv4_addr; flags interval; }' 2>/dev/null\n\t\tfor ip in $(gen_spec_iplist); do\n\t\t\t[ -n \"$ip\" ] && $NFT add element inet ss_spec ssr_gen_router \"{ $ip }\" 2>/dev/null\n\t\tdone\n\t\tif ! $NFT list chain inet ss_spec ss_spec_router >/dev/null 2>&1; then\n\t\t\t$NFT add chain inet ss_spec ss_spec_router 2>/dev/null\n\t\tfi\n\t\t$NFT flush chain inet ss_spec ss_spec_router 2>/dev/null\n\t\t$NFT add rule inet ss_spec ss_spec_router ip daddr @ssr_gen_router return 2>/dev/null\n\t\t$NFT add rule inet ss_spec ss_spec_router jump ss_spec_wan_fw 2>/dev/null\n\t\t$NFT add rule inet ss_spec ss_spec_output $TCP_EXT_ARGS jump ss_spec_router comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\t;;\n\tesac\n\treturn 0\n}\n\nac_rule_iptables() {\n\tlocal MATCH_SET=\"\"\n\tif [ -n \"$LAN_AC_IP\" ]; then\n\t\tcase \"${LAN_AC_IP%${LAN_AC_IP#?}}\" in\n\t\tw | W)\n\t\t\tMATCH_SET=\"-m set --match-set ss_spec_lan_ac src\"\n\t\t\t;;\n\t\tb | B)\n\t\t\tMATCH_SET=\"-m set ! --match-set ss_spec_lan_ac src\"\n\t\t\t;;\n\t\t*)\n\t\t\tloger 3 \"Bad argument \\`-a $LAN_AC_IP\\`.\"\n\t\t\treturn 2\n\t\t\t;;\n\t\tesac\n\tfi\n\tipset -! -R <<-EOF || return 1\n\t\tcreate ss_spec_lan_ac hash:net\n\t\t$(for ip in ${LAN_AC_IP#?}; do echo \"add ss_spec_lan_ac $ip\"; done)\n\tEOF\n\n\t# Block UDP port 443 when TPROXY not Enable\n\tif [ -z \"$TPROXY\" ]; then\n\t\t# Add UDP 443 block rule\n\t\tif [ -z \"$Interface\" ]; then\n\t\t\t# Global rules\n\t\t\tif [ -n \"$MATCH_SET\" ]; then\n\t\t\t\t$ipt -I PREROUTING 1 -p udp $EXT_ARGS $MATCH_SET --dport 443 -j DROP -m comment --comment \"$TAG\"\n\t\t\telse\n\t\t\t\t$ipt -I PREROUTING 1 -p udp $EXT_ARGS --dport 443 -j DROP -m comment --comment \"$TAG\"\n\t\t\tfi\n\t\telse\n\t\t\tfor name in $Interface; do\n\t\t\t\tlocal IFNAME=$(uci -P /var/state get network.\"$name\".ifname 2>/dev/null)\n\t\t\t\t[ -z \"$IFNAME\" ] && IFNAME=$(uci -P /var/state get network.\"$name\".device 2>/dev/null)\n\t\t\t\tif [ -n \"$IFNAME\" ]; then\n\t\t\t\t\tif [ -n \"$MATCH_SET\" ]; then\n\t\t\t\t\t\t$ipt -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p udp $EXT_ARGS $MATCH_SET --dport 443 -j DROP -m comment --comment \"$TAG\"\n\t\t\t\t\telse\n\t\t\t\t\t\t$ipt -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p udp $EXT_ARGS --dport 443 -j DROP -m comment --comment \"$TAG\"\n\t\t\t\t\tfi\n\t\t\t\tfi\n\t\t\tdone\n\t\tfi\n\tfi\n\tif [ -z \"$Interface\" ]; then\n\t\t# Global rules\n\t\tif [ -n \"$MATCH_SET\" ]; then\n\t\t\t$IPT -I PREROUTING 1 -p tcp $EXT_ARGS $MATCH_SET -m comment --comment \"$TAG\" -j SS_SPEC_WAN_AC\n\t\telse\n\t\t\t$IPT -I PREROUTING 1 -p tcp $EXT_ARGS -m comment --comment \"$TAG\" -j SS_SPEC_WAN_AC\n\t\tfi\n\telse\n\t\tfor name in $Interface; do\n\t\t\tlocal IFNAME=$(uci -P /var/state get network.\"$name\".ifname 2>/dev/null)\n\t\t\t[ -z \"$IFNAME\" ] && IFNAME=$(uci -P /var/state get network.\"$name\".device 2>/dev/null)\n\t\t\tif [ -n \"$IFNAME\" ]; then\n\t\t\t\tif [ -n \"$MATCH_SET\" ]; then\n\t\t\t\t\t$IPT -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p tcp $EXT_ARGS $MATCH_SET -m comment --comment \"$TAG\" -j SS_SPEC_WAN_AC\n\t\t\t\telse\n\t\t\t\t\t$IPT -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p tcp $EXT_ARGS -m comment --comment \"$TAG\" -j SS_SPEC_WAN_AC\n\t\t\t\tfi\n\t\t\tfi\n\t\tdone\n\tfi\n\n\tcase \"$OUTPUT\" in\n\t1)\n\t\t$IPT -I OUTPUT 1 -p tcp $EXT_ARGS -m comment --comment \"$TAG\" -j SS_SPEC_WAN_AC\n\t\t;;\n\t2)\n\t\tipset -! -R <<-EOF || return 1\n\t\t\tcreate ssr_gen_router hash:net\n\t\t\t$(gen_spec_iplist | sed -e \"s/^/add ssr_gen_router /\")\n\t\tEOF\n\t\t$IPT -N SS_SPEC_ROUTER 2>/dev/null\n\t\t$IPT -F SS_SPEC_ROUTER 2>/dev/null\n\t\t$IPT -A SS_SPEC_ROUTER -m set --match-set ssr_gen_router dst -j RETURN && \\\n\t\t$IPT -A SS_SPEC_ROUTER -j SS_SPEC_WAN_FW\n\t\t$IPT -I OUTPUT 1 -p tcp -m comment --comment \"$TAG\" -j SS_SPEC_ROUTER\n\t\t;;\n\tesac\n\treturn $?\n}\n\ntp_rule() {\n\t[ -n \"$TPROXY\" ] || return 0\n\tif [ \"$USE_NFT\" = \"1\" ]; then\n\t\ttp_rule_nft\n\telse\n\t\ttp_rule_iptables\n\tfi\n\treturn $?\n}\n\ntp_rule_nft() {\n\t# set up routing table for tproxy\n\tif ! ip rule show | grep -Eq \"fwmark ${FWMARK}.*lookup 999\"; then\n\t\tip rule add fwmark ${FWMARK} table 999 priority 999 2>/dev/null\n\tfi\n\n\tif ! ip route show table 999 | grep -Eq \"^local.*dev lo\"; then\n\t\tip route add local 0.0.0.0/0 dev lo table 999 2>/dev/null\n\tfi\n\n\t# create mangle table and tproxy chain\n\tif ! $NFT list table ip ss_spec_mangle >/dev/null 2>&1; then\n\t\t$NFT add table ip ss_spec_mangle 2>/dev/null\n\tfi\n\n\tlocal MATCH_SET=\"\"\n\n\tif [ -n \"$PROXY_PORTS\" ]; then\n\t\tPORTS_ARGS=$(echo \"$PROXY_PORTS\" | sed 's/-m multiport --dports //')\n\t\tif [ -n \"$PORTS_ARGS\" ]; then\n\t\t\tEXT_ARGS=\"udp dport { $PORTS_ARGS }\"\n\t\telse\n\t\t\tEXT_ARGS=\"\"\n\t\tfi\n\tfi\n\n\tif [ -n \"$LAN_AC_IP\" ]; then\n\t\t# Create LAN access control set if needed\n\t\tif ! $NFT list set ip ss_spec_mangle ss_spec_lan_ac >/dev/null 2>&1; then\n\t\t\t$NFT add set ip ss_spec_mangle ss_spec_lan_ac '{ type ipv4_addr; flags interval; auto-merge; }' 2>/dev/null\n\t\telse\n\t\t\t$NFT flush set ip ss_spec_mangle ss_spec_lan_ac 2>/dev/null\n\t\tfi\n\n\t\tfor ip in ${LAN_AC_IP#?}; do\n\t\t\t[ -n \"$ip\" ] && $NFT add element ip ss_spec_mangle ss_spec_lan_ac \"{ $ip }\" 2>/dev/null\n\t\tdone\n\n\t\tcase \"${LAN_AC_IP%${LAN_AC_IP#?}}\" in\n\t\tw | W)\n\t\t\tMATCH_SET=\"ip saddr @ss_spec_lan_ac\"\n\t\t\t;;\n\t\tb | B)\n\t\t\tMATCH_SET=\"ip saddr != @ss_spec_lan_ac\"\n\t\t\t;;\n\t\t*)\n\t\t\tloger 3 \"Bad argument \\`-a $LAN_AC_IP\\`.\"\n\t\t\treturn 2\n\t\t\t;;\n\t\tesac\n\tfi\n\n\t# Create necessary collections\n\tfor setname in china gmlan fplan bplan whitelist; do\n\t\tif ! $NFT list set ip ss_spec_mangle $setname >/dev/null 2>&1; then\n\t\t\t$NFT add set ip ss_spec_mangle $setname '{ type ipv4_addr; flags interval; auto-merge; }'\n\t\telse\n\t\t\t$NFT flush set ip ss_spec_mangle $setname 2>/dev/null\n\t\tfi\n\tdone\n\n\t# Bulk import china ip list safely (avoid huge single element limitation)\n\tif [ -f \"$IGNORE_LIST\" ]; then\n\t\tSKIP_INET=2 /usr/share/shadowsocksr/chinaipset.sh \"$IGNORE_LIST\"\n\tfi\n\n\t# Bulk import xhttp ip list into nft whitelist (server + shunt)\n\tif [ -f \"${xhttp_ip:=/etc/ssrplus/xhttp_address.txt}\" ]; then\n\t\t$NFT add element ip ss_spec_mangle whitelist \"{ $(tr '\\n' ',' < \"${xhttp_ip}\" | sed 's/,$//') }\" 2>/dev/null\n\tfi\n\n\t# use priority mangle for compatibility with other rules\n\tif ! $NFT list chain ip ss_spec_mangle ss_spec_tproxy >/dev/null 2>&1; then\n\t\t$NFT add chain ip ss_spec_mangle ss_spec_tproxy 2>/dev/null\n\telse\n\t\t$NFT flush chain ip ss_spec_mangle ss_spec_tproxy 2>/dev/null\n\tfi\n\n\tif $NFT list chain ip ss_spec_mangle ss_spec_tproxy >/dev/null 2>&1; then\n\t\tfor net in 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16 172.16.0.0/12 192.168.0.0/16 224.0.0.0/4 240.0.0.0/4; do\n\t\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy ip daddr $net return 2>/dev/null\n\t\tdone\n\tfi\n\n\t# Temporarily comment IPV6 for future enablement\n\t#if $NFT list chain ip ss_spec_mangle ss_spec_tproxy >/dev/null 2>&1; then\n\t#\tfor net in ::1/128 fe80::/10 fc00::/7 ff00::/8 fe80::/10 ::/128 ::ffff:0:0/96; do\n\t#\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy ip6 daddr $net return 2>/dev/null\n\t#\tdone\n\t#fi\n\n\t# basic return rules in tproxy chain\n\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp dport 53 return 2>/dev/null\n\n\t# avoid redirecting to udp server address\n\tif [ -n \"$server\" ]; then\n\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp dport != 53 ip daddr \"$server\" return 2>/dev/null\n\tfi\n\n\t# if server != SERVER add SERVER to whitelist set (so tproxy won't touch it)\n\tif [ -n \"$server\" ]; then\n\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy ip daddr \"$server\" return 2>/dev/null\n\tfi\n\tif [ -n \"$SERVER\" ] && [ \"$server\" != \"$SERVER\" ]; then\n\t\t$NFT add element ip ss_spec_mangle whitelist \"{ $SERVER }\" 2>/dev/null\n\tfi\n\n\t# access control and tproxy rules\n\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp ip saddr @bplan return 2>/dev/null\n\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS ip saddr @fplan counter tproxy ip to :\"$LOCAL_PORT\" meta mark set ${FWMARK} 2>/dev/null\n\n\t# Handle different run modes for nftables\n\tcase \"$RUNMODE\" in\n\trouter)\n\t\tif ! $NFT list set ip ss_spec_mangle ss_spec_wan_ac >/dev/null 2>&1; then\n\t\t\t$NFT add set ip ss_spec_mangle ss_spec_wan_ac '{ type ipv4_addr; flags interval; auto-merge; }'\n\t\telse\n\t\t\t$NFT flush set ip ss_spec_mangle ss_spec_wan_ac 2>/dev/null\n\t\tfi\n\t\t# Add special IP ranges to WAN AC set\n\t\tfor ip in $(gen_spec_iplist); do\n\t\t\t[ -n \"$ip\" ] && $NFT add element ip ss_spec_mangle ss_spec_wan_ac \"{ $ip }\" 2>/dev/null\n\t\tdone\n\n\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp ip daddr @ss_spec_wan_ac return 2>/dev/null\n\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp ip daddr @china return 2>/dev/null\n\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp udp dport 80 counter drop comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp udp dport 443 counter drop comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp ip saddr @gmlan ip daddr != @china counter tproxy ip to :\"$LOCAL_PORT\" meta mark set ${FWMARK} 2>/dev/null\n\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS ip daddr != @ss_spec_wan_ac counter tproxy ip to :\"$LOCAL_PORT\" meta mark set ${FWMARK} 2>/dev/null\n\t\t;;\n\tgfw)\n\t\tif ! $NFT list set ip ss_spec_mangle gfwlist >/dev/null 2>&1; then\n\t\t\t$NFT add set ip ss_spec_mangle gfwlist '{ type ipv4_addr; flags interval; auto-merge; }' 2>/dev/null\n\t\tfi\n\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp ip daddr @china return 2>/dev/null\n\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp udp dport 80 counter drop comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp udp dport 443 counter drop comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS ip daddr @gfwlist counter tproxy ip to :\"$LOCAL_PORT\" meta mark set ${FWMARK} 2>/dev/null\n\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp ip saddr @gmlan ip daddr != @china counter tproxy ip to :\"$LOCAL_PORT\" meta mark set ${FWMARK} 2>/dev/null\n\t\t;;\n\toversea)\n\t\tif ! $NFT list set ip ss_spec_mangle oversea >/dev/null 2>&1; then\n\t\t\t$NFT add set ip ss_spec_mangle oversea '{ type ipv4_addr; flags interval; auto-merge; }' 2>/dev/null\n\t\tfi\n\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS ip saddr @oversea counter tproxy ip to :\"$LOCAL_PORT\" meta mark set ${FWMARK} 2>/dev/null\n\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS ip daddr @china counter tproxy ip to :\"$LOCAL_PORT\" meta mark set ${FWMARK} 2>/dev/null\n\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp ip saddr @gmlan counter tproxy ip to :\"$LOCAL_PORT\" meta mark set ${FWMARK} 2>/dev/null\n\t\t;;\n\tall)\n\t\t$NFT add rule ip ss_spec_mangle ss_spec_tproxy meta l4proto udp $EXT_ARGS counter tproxy ip to :\"$LOCAL_PORT\" meta mark set ${FWMARK} 2>/dev/null\n\t\t;;\n\tesac\n\n\t# finally, ensure prerouting hook entry to jump to tproxy chain\n\tif ! $NFT list chain ip ss_spec_mangle prerouting >/dev/null 2>&1; then\n\t\t$NFT add chain ip ss_spec_mangle prerouting '{ type filter hook prerouting priority mangle; policy accept; }'\n\tfi\n\n\t# add prerouting jump (idempotent)\n\tif [ -z \"$Interface\" ]; then\n\t\t# Global rules\n\t\tif [ -n \"$MATCH_SET\" ]; then\n\t\t\t$NFT add rule ip ss_spec_mangle prerouting meta l4proto udp $EXT_ARGS $MATCH_SET jump ss_spec_tproxy comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\telse\n\t\t\t$NFT add rule ip ss_spec_mangle prerouting meta l4proto udp $EXT_ARGS jump ss_spec_tproxy comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\tfi\n\telse\n\t\t# Specific interface\n\t\tfor name in $Interface; do\n\t\t\tIFNAME=$(uci -P /var/state get network.\"$name\".ifname 2>/dev/null)\n\t\t\t[ -z \"$IFNAME\" ] && IFNAME=$(uci -P /var/state get network.\"$name\".device 2>/dev/null)\n\t\t\tif [ -n \"$IFNAME\" ]; then\n\t\t\t\tif [ -n \"$MATCH_SET\" ]; then\n\t\t\t\t\t$NFT add rule ip ss_spec_mangle prerouting meta iifname \"$IFNAME\" meta l4proto udp $EXT_ARGS $MATCH_SET jump ss_spec_tproxy comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\t\t\telse\n\t\t\t\t\t$NFT add rule ip ss_spec_mangle prerouting meta iifname \"$IFNAME\" meta l4proto udp $EXT_ARGS jump ss_spec_tproxy comment \"\\\"$TAG\\\"\" 2>/dev/null\n\t\t\t\tfi\n\t\t\tfi\n\t\tdone\n\tfi\n\n\treturn $?\n}\n\ntp_rule_iptables() {\n\t# set up routing table for tproxy\n\tif ! ip rule show | grep -Eq \"fwmark ${FWMARK}.*lookup 999\"; then\n\t\tip rule add fwmark ${FWMARK} table 999 priority 999 2>/dev/null\n\tfi\n\n\tif ! ip route show table 999 | grep -Eq \"^local.*dev lo\"; then\n\t\tip route add local 0.0.0.0/0 dev lo table 999 2>/dev/null\n\tfi\n\t$ipt -N SS_SPEC_TPROXY 2>/dev/null\n\t$ipt -F SS_SPEC_TPROXY\n\n\t$ipt -A SS_SPEC_TPROXY -p udp --dport 53 -j RETURN\n\n\tlocal MATCH_SET=\"\"\n\tif [ -n \"$LAN_AC_IP\" ]; then\n\t\tcase \"${LAN_AC_IP%${LAN_AC_IP#?}}\" in\n\t\tw | W)\n\t\t\tMATCH_SET=\"-m set --match-set ss_spec_lan_ac src\"\n\t\t\t;;\n\t\tb | B)\n\t\t\tMATCH_SET=\"-m set ! --match-set ss_spec_lan_ac src\"\n\t\t\t;;\n\t\t*)\n\t\t\tloger 3 \"Bad argument \\`-a $LAN_AC_IP\\`.\"\n\t\t\treturn 2\n\t\t\t;;\n\t\tesac\n\tfi\n\tipset -! -R <<-EOF || return 1\n\t\tcreate ss_spec_lan_ac hash:net\n\t\t$(for ip in ${LAN_AC_IP#?}; do echo \"add ss_spec_lan_ac $ip\"; done)\n\tEOF\n\n\tfor net in \\\n\t\t0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16 \\\n\t\t172.16.0.0/12 192.168.0.0/16 224.0.0.0/4 240.0.0.0/4\n\tdo\n\t\t$ipt -A SS_SPEC_TPROXY -p udp -d \"$net\" -j RETURN\n\tdone\n\t$ipt -A SS_SPEC_TPROXY -p udp ! --dport 53 -d \"$SERVER\" -j RETURN\n\t[ \"$server\" != \"$SERVER\" ] && ipset -! add whitelist \"$SERVER\"\n\tif [ -f \"${xhttp_ip:=/etc/ssrplus/xhttp_address.txt}\" ]; then\n\t\twhile IFS= read -r ip; do\n\t\t\t[ -n \"$ip\" ] && ipset add whitelist \"$ip\" -exist\n\t\tdone < \"$xhttp_ip\"\n\tfi\n\t$ipt -A SS_SPEC_TPROXY -p udp -m set --match-set bplan src -j RETURN\n\t$ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set fplan src -j TPROXY --on-port \"$LOCAL_PORT\" --tproxy-mark ${FWMARK}\n\tcase \"$RUNMODE\" in\n\trouter)\n\t\tipset -! -R <<-EOF || return 1\n\t\t\tcreate ss_spec_wan_ac hash:net\n\t\t\t$(gen_spec_iplist | sed -e \"s/^/add ss_spec_wan_ac /\")\n\t\tEOF\n\t\t$ipt -A SS_SPEC_TPROXY -p udp -m set --match-set ss_spec_wan_ac dst -j RETURN\n\t\t$ipt -A SS_SPEC_TPROXY -p udp -m set --match-set china dst -j RETURN\n\t\t$ipt -A SS_SPEC_TPROXY -p udp --dport 80 -j DROP\n\t\t$ipt -A SS_SPEC_TPROXY -p udp --dport 443 -j DROP \n\t\t$ipt -A SS_SPEC_TPROXY -p udp -m set --match-set gmlan src -m set ! --match-set china dst -j TPROXY --on-port \"$LOCAL_PORT\" --tproxy-mark ${FWMARK}\n\t\t$ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set ! --match-set ss_spec_wan_ac dst -j TPROXY --on-port \"$LOCAL_PORT\" --tproxy-mark ${FWMARK}\n\t\t;;\n\tgfw)\n\t\t$ipt -A SS_SPEC_TPROXY -p udp -m set --match-set china dst -j RETURN\n\t\t$ipt -A SS_SPEC_TPROXY -p udp --dport 80 -j DROP\n\t\t$ipt -A SS_SPEC_TPROXY -p udp --dport 443 -j DROP \n\t\t$ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set gfwlist dst -j TPROXY --on-port \"$LOCAL_PORT\" --tproxy-mark ${FWMARK}\n\t\t$ipt -A SS_SPEC_TPROXY -p udp -m set --match-set gmlan src -m set ! --match-set china dst -j TPROXY --on-port \"$LOCAL_PORT\" --tproxy-mark ${FWMARK}\n\t\t;;\n\toversea)\n\t\t$ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set oversea src -m dst -j TPROXY --on-port \"$LOCAL_PORT\" --tproxy-mark ${FWMARK}\n\t\t$ipt -A SS_SPEC_TPROXY -p udp -m set --match-set gmlan src -m set -j TPROXY --on-port \"$LOCAL_PORT\" --tproxy-mark ${FWMARK}\n\t\t$ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -m set --match-set china dst -j TPROXY --on-port \"$LOCAL_PORT\" --tproxy-mark ${FWMARK}\n\t\t;;\n\tall)\n\t\t$ipt -A SS_SPEC_TPROXY -p udp $PROXY_PORTS -j TPROXY --on-port \"$LOCAL_PORT\" --tproxy-mark ${FWMARK}\n\t\t;;\n\tesac\n\tif [ -z \"$Interface\" ]; then\n\t\t# Global rules\n\t\tif [ -n \"$MATCH_SET\" ]; then\n\t\t\t$ipt -I PREROUTING 1 -p udp $EXT_ARGS $MATCH_SET -m comment --comment \"$TAG\" -j SS_SPEC_TPROXY\n\t\telse\n\t\t\t$ipt -I PREROUTING 1 -p udp $EXT_ARGS -m comment --comment \"$TAG\" -j SS_SPEC_TPROXY\n\t\tfi\n\telse\n\t\tfor name in $Interface; do\n\t\t\tlocal IFNAME=$(uci -P /var/state get network.\"$name\".ifname 2>/dev/null)\n\t\t\t[ -z \"$IFNAME\" ] && IFNAME=$(uci -P /var/state get network.\"$name\".device 2>/dev/null)\n\t\t\tif [ -n \"$IFNAME\" ]; then\n\t\t\t\tif [ -n \"$MATCH_SET\" ]; then\n\t\t\t\t\t$ipt -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p udp $EXT_ARGS $MATCH_SET -m comment --comment \"$TAG\" -j SS_SPEC_TPROXY\n\t\t\t\telse\n\t\t\t\t\t$ipt -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p udp $EXT_ARGS -m comment --comment \"$TAG\" -j SS_SPEC_TPROXY\n\t\t\t\tfi\n\t\t\tfi\n\t\tdone\n\tfi\n\treturn $?\n}\n\nget_wan_ip() {\n\tcat <<-EOF | grep -E \"^([0-9]{1,3}\\.){3}[0-9]{1,3}\"\n\t\t$server\n\t\t$SERVER\n\t\t$WAN_BP_IP\n\tEOF\n}\n\ngen_spec_iplist() {\n\tcat <<-EOF\n\t\t0.0.0.0/8\n\t\t10.0.0.0/8\n\t\t100.64.0.0/10\n\t\t127.0.0.0/8\n\t\t169.254.0.0/16\n\t\t172.16.0.0/12\n\t\t192.0.0.0/24\n\t\t192.0.2.0/24\n\t\t192.88.99.0/24\n\t\t192.168.0.0/16\n\t\t198.18.0.0/15\n\t\t198.51.100.0/24\n\t\t203.0.113.0/24\n\t\t224.0.0.0/4\n\t\t240.0.0.0/4\n\t\t255.255.255.255\n\t\t$(get_wan_ip)\n\tEOF\n}\n\ngen_include() {\n\t[ -n \"$FWI\" ] || return 0\n\tif [ \"$USE_NFT\" = \"1\" ]; then\n\t\tgen_include_nft\n\telse\n\t\tgen_include_iptables\n\tfi\n\treturn $?\n}\n\n# Modified gen_include_nft to call persistence function\ngen_include_nft() {\n\t# Generate nftables include file for firewall4\n\t[ -n \"$FWI\" ] && echo '#!/bin/sh' >\"$FWI\"\n\tcat <<-EOF >>\"$FWI\"\n\t\t# Clear existing ss_spec tables\n\t\tnft delete table inet ss_spec 2>/dev/null\n\t\tnft delete table ip ss_spec 2>/dev/null\n\t\tnft delete table ip ss_spec_mangle 2>/dev/null\n\n\t\t# Restore shadowsocks nftables rules from persistent file\n\t\tif [ -f \"/usr/share/nftables.d/ruleset-post/99-shadowsocksr.nft\" ]; then\n\t\t\tnft -f /usr/share/nftables.d/ruleset-post/99-shadowsocksr.nft\n\t\telse\n\t\t\t# Fallback: restore from current ruleset (filtered)\n\t\t\tnft list ruleset | awk '/^table (inet|ip) ss_spec/{flag=1} /^table / && !/^table (inet|ip) ss_spec/{flag=0} flag' | nft -f -\n\t\tfi\n\tEOF\n\tchmod +x \"$FWI\"\n}\n\ngen_include_iptables() {\n\textract_rules() {\n\t\techo \"*$1\"\n\t\tiptables-save -t $1 | grep SS_SPEC_ | sed -e \"s/^-A \\(OUTPUT\\|PREROUTING\\)/-I \\1 1/\"\n\t\techo 'COMMIT'\n\t}\n\tcat <<-EOF >>$FWI\n\t\tiptables-save -c | grep -v \"SS_SPEC\" | iptables-restore -c\n\t\tiptables-restore -n <<-EOT\n\t\t$(extract_rules nat)\n\t\t$(extract_rules mangle)\n\t\tEOT\n\tEOF\n}\n\n# Check nftables rules status\ncheck_nftables_status() {\n\tif [ \"$USE_NFT\" != \"1\" ]; then\n\t\techo \"NFTables not in use\"\n\t\treturn 0\n\tfi\n\n\t# Check if ss_spec tables exist\n\tif ! $NFT list table inet ss_spec >/dev/null 2>&1 && \\\n\t   ! $NFT list table ip ss_spec_mangle >/dev/null 2>&1; then\n\t\techo \"ss_spec tables missing in nftables\"\n\t\treturn 1\n\tfi\n\n\t# Check if basic rules exist\n\tif ! $NFT list table inet ss_spec 2>/dev/null | grep -q \"chain.*ss_spec_wan_ac\" || \\\n\t   ! $NFT list table inet ss_spec 2>/dev/null | grep -q \"jump.*ss_spec_wan_fw\"; then\n\t\techo \"Basic SSR rules missing\"\n\t\treturn 1\n\tfi\n\n\techo \"NFTables rules status: OK\"\n\treturn 0\n}\n\n# Compare current rules with persistence rules\ncompare_rules() {\n\tif [ \"$USE_NFT\" != \"1\" ]; then\n\t\treturn 1  # NFTables not used, need update\n\tfi\n\n\t# If no persistence file, update persistence file\n\tif [ ! -f \"$NFTABLES_RULES_FILE\" ]; then\n\t\tloger 6 \"No persistence file found, update needed\"\n\t\treturn 1  # Need to update persistence file\n\tfi\n\n\t# Check if ss_spec tables exist\n\tif ! $NFT list table inet ss_spec >/dev/null 2>&1 && \\\n\t   ! $NFT list table ip ss_spec_mangle >/dev/null 2>&1; then\n\t\tloger 6 \"ss_spec tables missing, update needed\"\n\t\treturn 1  # Need to update ss_spec table\n\tfi\n\n\t# Generate temporary file for current rules\n\tlocal rules_file=$(mktemp)\n\tloger 7 \"DEBUG: Temporary file path: $rules_file\"\n\n\t# Export current rules to temporary file\n\t$NFT list ruleset | awk '\n\t\t/^table (inet ss_spec|ip ss_spec_mangle)/ {flag=1}\n\t\t/^table / && !/^table (inet ss_spec|ip ss_spec_mangle)/ {flag=0}\n\t\tflag\n\t' > \"$rules_file\" 2>/dev/null\n\n\t# Check if current rules were exported successfully\n\tif [ ! -s \"$rules_file\" ] || ! grep -q \"table\" \"$rules_file\" 2>/dev/null; then\n\t\tloger 4 \"Failed to export current rules\"\n\t\trm -f \"$rules_file\"\n\t\treturn 1  # Export failed, need update\n\tfi\n\n\t# Compare current rules with rules in persistence file\n\tif ! cmp -s \"$rules_file\" \"$NFTABLES_RULES_FILE\"; then\n\t\tloger 6 \"Rules differ, update needed\"\n\t\trm -f \"$rules_file\"\n\t\treturn 1  # Need update\n\tfi\n\n\trm -f \"$rules_file\"\n\tloger 6 \"Rules unchanged, no update needed\"\n\treturn 0  # No update needed\n}\n\n# Auto-update persistence rules\npersist_nftables_rules() {\n\tif [ \"$USE_NFT\" != \"1\" ]; then\n\t\treturn 0\n\tfi\n\n\t# Force update: skip comparison check and delete old file\n\tif [ \"$FORCE_UPDATE\" = \"1\" ]; then\n\t\tloger 6 \"Force update requested, removing old persistence file\"\n\t\trm -f \"$NFTABLES_RULES_FILE\" 2>/dev/null\n\t# Otherwise, if persistence file exists, compare rules\n\telif [ -f \"$NFTABLES_RULES_FILE\" ]; then\n\t\tif compare_rules; then\n\t\t\tloger 6 \"Rules unchanged, skipping persistence update\"\n\t\t\treturn 0\n\t\telse\n\t\t\tloger 6 \"Rules changed, updating persistence\"\n\t\tfi\n\tfi\n\n\t# Ensure directory exists\n\tmkdir -p \"$NFTABLES_RULES_DIR\" 2>/dev/null\n\n\t# Generate nftables rule file\n\tcat <<-'EOF' > \"$NFTABLES_RULES_FILE\"\n\t\t#!/usr/sbin/nft -f\n\n\t\t# ShadowsocksR nftables rules\n\t\t# Generated by ssr-rules script\n\tEOF\n\n\techo \"# Auto-updated: $(date)\" >> \"$NFTABLES_RULES_FILE\"\n\techo \"# Runmode: ${RUNMODE:-router}\" >> \"$NFTABLES_RULES_FILE\"\n\techo \"# Server: $server, Port: $local_port\" >> \"$NFTABLES_RULES_FILE\"\n\techo \"# WAN_BP_IP: $WAN_BP_IP\" >> \"$NFTABLES_RULES_FILE\"\n\techo \"# LAN_AC_IP: $LAN_AC_IP\" >> \"$NFTABLES_RULES_FILE\"\n\techo \"# LAN_BP_IP: $LAN_BP_IP\" >> \"$NFTABLES_RULES_FILE\"\n\techo \"# WAN_FW_IP: $WAN_FW_IP\" >> \"$NFTABLES_RULES_FILE\"\n\techo \"# LAN_FP_IP: $LAN_FP_IP\" >> \"$NFTABLES_RULES_FILE\"\n\techo \"# LAN_GM_IP: $LAN_GM_IP\" >> \"$NFTABLES_RULES_FILE\"\n\techo \"\" >> \"$NFTABLES_RULES_FILE\"\n\n\tlocal HAS_RULES=0\n\n\t# Export each table separately\n\tif $NFT list table inet ss_spec >/dev/null 2>&1; then\n\t\tloger 6 \"Exporting table inet ss_spec\"\n\t\t{\n\t\t\techo \"\"\n\t\t\techo \"# inet ss_spec table for main rules\"\n\t\t\t$NFT list table inet ss_spec 2>/dev/null\n\t\t} >> \"$NFTABLES_RULES_FILE\"\n\t\tHAS_RULES=1\n\tfi\n\n\tif $NFT list table ip ss_spec_mangle >/dev/null 2>&1; then\n\t\tloger 6 \"Exporting table ip ss_spec_mangle\"\n\t\t{\n\t\t\techo \"\"\n\t\t\techo \"# ip ss_spec_mangle table for TPROXY rules\"\n\t\t\t$NFT list table ip ss_spec_mangle 2>/dev/null\n\t\t} >> \"$NFTABLES_RULES_FILE\"\n\t\tHAS_RULES=1\n\tfi\n\n\t# Check if rules were exported successfully\n\tif [ $HAS_RULES -eq 0 ] || [ ! -s \"$NFTABLES_RULES_FILE\" ] || ! grep -q \"table\" \"$NFTABLES_RULES_FILE\" 2>/dev/null; then\n\t\tloger 4 \"No ss_spec nftables rules found to persist\"\n\t\trm -f \"$NFTABLES_RULES_FILE\" 2>/dev/null\n\t\treturn 1\n\tfi\n\n\t# Set file permissions\n\tchmod 644 \"$NFTABLES_RULES_FILE\" 2>/dev/null\n\n\t# Log success information\n\tlocal TABLES=$(grep \"^table\" \"$NFTABLES_RULES_FILE\" | awk '{print $2 \" \" $3}' | tr '\\n' ',' | sed 's/,$//')\n\tloger 5 \"NFTables rules persisted to $NFTABLES_RULES_FILE (Tables: $TABLES)\"\n\n\treturn 0\n}\n\n# Auto-update daemon\nstart_auto_update_daemon() {\n\tif [ \"$USE_NFT\" != \"1\" ] || [ \"$AUTO_UPDATE_INTERVAL\" = \"0\" ]; then\n\t\treturn 0\n\tfi\n\n\tloger 6 \"Starting nftables rules auto-update daemon\"\n\n\t# Stop already running daemon\n\tstop_auto_update_daemon\n\n\t# Start daemon directly in background\n\t(\n\t\tlogger -t ssr-rules[daemon] \"Auto-update daemon started - PID: $$\"\n\t\techo $$ > \"/var/run/ssr-rules-daemon.pid\"\n\n\t\twhile true; do\n\t\t\tsleep \"$AUTO_UPDATE_INTERVAL\"\n\t\t\tif [ -x \"/usr/bin/ssr-rules\" ]; then\n\t\t\t\t# -C returns 0 if rules are OK, non-zero if need update\n\t\t\t\tif /usr/bin/ssr-rules -C >/dev/null 2>&1; then\n\t\t\t\t\tlogger -t ssr-rules[daemon] \"Rules status OK, no update needed\"\n\t\t\t\telse\n\t\t\t\t\tlogger -t ssr-rules[daemon] \"Rules changed or missing, updating persistence\"\n\t\t\t\t\tif /usr/bin/ssr-rules -P >/dev/null 2>&1; then\n\t\t\t\t\t\tlogger -t ssr-rules[daemon] \"Persistence rules updated successfully\"\n\t\t\t\t\telse\n\t\t\t\t\t\tlogger -t ssr-rules[daemon] \"Failed to update persistence\"\n\t\t\t\t\tfi\n\t\t\t\tfi\n\t\t\telse\n\t\t\t\tlogger -t ssr-rules[daemon] \"Script not found, exiting daemon\"\n\t\t\t\texit 1\n\t\t\tfi\n\t\tdone\n\t) &\n\n\tlocal DAEMON_PID=$!\n\tsleep 2\n\n\tif kill -0 \"$DAEMON_PID\" 2>/dev/null; then\n\t\tloger 6 \"Auto-update daemon started with PID: $DAEMON_PID\"\n\t\treturn 0\n\telse\n\t\tloger 3 \"Auto-update daemon failed to start\"\n\t\treturn 1\n\tfi\n}\n\n# Stop auto-update daemon function\nstop_auto_update_daemon() {\n\tlocal PID_FILE=\"/var/run/ssr-rules-daemon.pid\"\n\n\tif [ -f \"$PID_FILE\" ]; then\n\t\tlocal DAEMON_PID=$(cat \"$PID_FILE\" 2>/dev/null)\n\t\tif [ -n \"$DAEMON_PID\" ] && kill -0 \"$DAEMON_PID\" 2>/dev/null; then\n\t\t\tkill \"$DAEMON_PID\" 2>/dev/null\n\t\t\tloger 6 \"Stopped auto-update daemon (PID: $DAEMON_PID)\"\n\t\tfi\n\t\trm -f \"$PID_FILE\" 2>/dev/null\n\tfi\n\n\tloger 6 \"Auto-update daemon stopped\"\n}\n\n# Force update persistence rules function\nforce_update_persistence() {\n\tif [ \"$USE_NFT\" != \"1\" ]; then\n\t\techo \"NFTables not in use\"\n\t\treturn 0\n\tfi\n\n\t# Remove existing rule file to ensure recreation\n\trm -f \"$NFTABLES_RULES_FILE\" 2>/dev/null\n\n\t# Call persistence function\n\tif persist_nftables_rules; then\n\t\tloger 5 \"Persistence update completed successfully\"\n\t\treturn 0\n\telse\n\t\tloger 3 \"Persistence update failed\"\n\t\treturn 1\n\tfi\n}\n\n# Restore rules from persistence file\nrestore_from_persistence() {\n\tif [ \"$USE_NFT\" != \"1\" ]; then\n\t\tloger 3 \"NFTables not in use, cannot restore rules\"\n\t\treturn 1\n\tfi\n\n\tif [ ! -f \"$NFTABLES_RULES_FILE\" ]; then\n\t\tloger 4 \"Persistence file not found: $NFTABLES_RULES_FILE\"\n\t\treturn 1\n\tfi\n\n\tloger 6 \"Restoring rules from persistence file\"\n\n\t# Cleanup existing rules\n\tflush_r\n\n\t# Restore rules from file\n\tif $NFT -f \"$NFTABLES_RULES_FILE\" 2>/dev/null; then\n\t\tloger 5 \"Rules restored successfully from persistence file\"\n\t\treturn 0\n\telse\n\t\tloger 4 \"Failed to restore rules from persistence file\"\n\t\treturn 1\n\tfi\n}\n\nwhile getopts \":m:s:l:S:L:i:e:a:B:b:w:p:G:D:F:N:M:I:oOuUfgrczAKPCRXh\" arg; do\n\tcase \"$arg\" in\n\tm)\n\t\tInterface=$OPTARG\n\t\t;;\n\ts)\n\t\tserver=$OPTARG\n\t\t;;\n\tl)\n\t\tlocal_port=$OPTARG\n\t\t;;\n\tS)\n\t\tSERVER=$OPTARG\n\t\t;;\n\tL)\n\t\tLOCAL_PORT=$OPTARG\n\t\t;;\n\ti)\n\t\tIGNORE_LIST=$OPTARG\n\t\t;;\n\te)\n\t\tEXT_ARGS=$OPTARG\n\t\t;;\n\ta)\n\t\tLAN_AC_IP=$OPTARG\n\t\t;;\n\tB)\n\t\tLAN_BP_IP=$OPTARG\n\t\t;;\n\tb)\n\t\tWAN_BP_IP=$(for ip in $OPTARG; do echo \"$ip\"; done)\n\t\t;;\n\tw)\n\t\tWAN_FW_IP=$OPTARG\n\t\t;;\n\tp)\n\t\tLAN_FP_IP=$OPTARG\n\t\t;;\n\tG)\n\t\tLAN_GM_IP=$OPTARG\n\t\t;;\n\tD)\n\t\tPROXY_PORTS=$OPTARG\n\t\t;;\n\tF)\n\t\tSHUNT_PORT=$OPTARG\n\t\t;;\n\tN)\n\t\tSHUNT_IP=$OPTARG\n\t\t;;\n\tM)\n\t\tSHUNT_PROXY=$OPTARG\n\t\t;;\n\tI)\n\t\tSHUNT_LIST=$OPTARG\n\t\t;;\n\to)\n\t\tOUTPUT=1\n\t\t;;\n\tO)\n\t\tOUTPUT=2\n\t\t;;\n\tu)\n\t\tTPROXY=1\n\t\t;;\n\tU)\n\t\tTPROXY=2\n\t\t;;\n\tg)\n\t\tRUNMODE=gfw\n\t\t;;\n\tr)\n\t\tRUNMODE=router\n\t\t;;\n\tc)\n\t\tRUNMODE=oversea\n\t\t;;\n\tz)\n\t\tRUNMODE=all\n\t\t;;\n\t# New persistence management options\n\tA)\n\t\tENABLE_AUTO_UPDATE=1\n\t\t;;\n\tK)\n\t\tSTOP_AUTO_UPDATE=1\n\t\t;;\n\tP)\n\t\tFORCE_UPDATE=1\n\t\t;;\n\tC)\n\t\tCHECK_STATUS=1\n\t\t;;\n\tR)\n\t\tRESTORE_RULES=1\n\t\t;;\n\tX)\n\t\tCLEANUP_PERSISTENCE=1\n\t\t;;\n\tf)\n\t\tFLUSH_RULES=1\n\t\t;;\n\th) \n\t\tusage 0 \n\t\t;;\n\tesac\ndone\n\n# First process options that need immediate exit\nif [ \"$CHECK_STATUS\" = \"1\" ]; then\n\tcheck_nftables_status\n\texit $?\nfi\n\nif [ \"$STOP_AUTO_UPDATE\" = \"1\" ]; then\n\tstop_auto_update_daemon\n\texit 0\nfi\n\n# Only -X option, cleanup and exit\nif [ \"$CLEANUP_PERSISTENCE\" = \"1\" ] && [ \"$FLUSH_RULES\" != \"1\" ] && [ -z \"$server\" ] && [ -z \"$local_port\" ] && \\\n   [ \"$FORCE_UPDATE\" != \"1\" ] && [ \"$RESTORE_RULES\" != \"1\" ] && [ \"$ENABLE_AUTO_UPDATE\" != \"1\" ]; then\n\tcleanup_persistence_files\n\texit $?\nfi\n\n# Check if there are persistence management options only\nPERSISTENCE_ONLY=0\nif [ -z \"$server\" ] && [ -z \"$local_port\" ] && [ \"$FLUSH_RULES\" != \"1\" ]; then\n\tif [ \"$FORCE_UPDATE\" = \"1\" ] || [ \"$RESTORE_RULES\" = \"1\" ] || [ \"$ENABLE_AUTO_UPDATE\" = \"1\" ] || [ \"$CLEANUP_PERSISTENCE\" = \"1\" ]; then\n\t\tPERSISTENCE_ONLY=1\n\telse\n\t\tusage 2\n\tfi\nfi\n\n# Handle persistence management options\nif [ \"$PERSISTENCE_ONLY\" = \"1\" ]; then\n\tif [ \"$FORCE_UPDATE\" = \"1\" ]; then\n\t\tforce_update_persistence\n\t\texit $?\n\tfi\n\n\tif [ \"$RESTORE_RULES\" = \"1\" ]; then\n\t\trestore_from_persistence\n\t\texit $?\n\tfi\n\n\tif [ \"$ENABLE_AUTO_UPDATE\" = \"1\" ]; then\n\t\tstart_auto_update_daemon\n\t\texit $?\n\tfi\nfi\n\n# Force flush rules\nif [ \"$FLUSH_RULES\" = \"1\" ]; then\n\tflush_r\n\t# If only -f option, then exit\n\tif [ -z \"$server\" ] && [ -z \"$local_port\" ] && [ \"$FORCE_UPDATE\" != \"1\" ] && \\\n\t\t[ \"$RESTORE_RULES\" != \"1\" ] && [ \"$ENABLE_AUTO_UPDATE\" != \"1\" ] && \\\n\t\t[ \"$CLEANUP_PERSISTENCE\" != \"1\" ]; then\n\t\texit 0\n\tfi\nfi\n\n# Restore rules from persistence file (before rule application)\nif [ \"$RESTORE_RULES\" = \"1\" ]; then\n\trestore_from_persistence\n\tif [ $? -ne 0 ]; then\n\t\tloger 3 \"Failed to restore from persistence, continuing with rule application\"\n\tfi\nfi\n\n# Run mode change\nrunmode_change() {\n\tlocal mode_file=\"/tmp/.ssr_run_mode\"\n\tlocal new_mode=\"\"\n\tlocal old_mode=\"\"\n\n\t# Get mode from parameters\n\tif [ -n \"$1\" ]; then\n\t\tnew_mode=\"$1\"\n\tfi\n\n\t# Read previous run mode from file\n\tif [ -f \"$mode_file\" ]; then\n\t\told_mode=$(cat \"$mode_file\" 2>/dev/null)\n\tfi\n\n\t# Compare if mode changed\n\tif [ \"$old_mode\" = \"$new_mode\" ] && [ -n \"$old_mode\" ]; then\n\t\t# Mode unchanged\n\t\techo \"$new_mode\" > \"$mode_file\"  # Update file timestamp\n\t\tloger 6 \"Runmode unchanged: $new_mode\"\n\t\treturn 1  # Return 1 means unchanged\n\telse\n\t\t# Mode changed or first run\n\t\techo \"$new_mode\" > \"$mode_file\"\n\t\tif [ -n \"$old_mode\" ]; then\n\t\t\tloger 6 \"Runmode changed from '$old_mode' to '$new_mode'\"\n\t\telse\n\t\t\tloger 6 \"Runmode set to '$new_mode'\"\n\t\tfi\n\t\treturn 0  # Return 0 means changed\n\tfi\n}\n\n# Main process\nif [ -n \"$server\" ] && [ -n \"$local_port\" ]; then\n\tif ! echo \"$local_port\" | grep -qE '^[0-9]+$'; then\n\t\tloger 3 \"Invalid local port: $local_port\"\n\t\texit 1\n\tfi\n\n\tcase \"$TPROXY\" in\n\t1)\n\t\tSERVER=$server\n\t\tLOCAL_PORT=$local_port\n\t\t;;\n\t2)\n\t\t: ${SERVER:?\"You must assign an ip for the udp relay server.\"}\n\t\t: ${LOCAL_PORT:?\"You must assign a port for the udp relay server.\"}\n\t\t;;\n\tesac\n\n\tif [ \"$USE_NFT\" = \"1\" ]; then\n\t\t# NFTables\n\t\t# Save previous TPROXY state file\n\t\tTPROXY_STATE_FILE=\"/tmp/.last_tproxy\"\n\t\tif [ -f \"$TPROXY_STATE_FILE\" ]; then\n\t\t\tLAST_TPROXY=$(cat \"$TPROXY_STATE_FILE\")\n\t\telse\n\t\t\tLAST_TPROXY=\"\"\n\t\tfi\n\n\t\t# Save previous PROXY_PORTS state\n\t\tPROXY_PORTS_STATE_FILE=\"/tmp/.last_proxy_ports\"\n\t\tif [ -f \"$PROXY_PORTS_STATE_FILE\" ]; then\n\t\t\tLAST_PROXY_PORTS=$(cat \"$PROXY_PORTS_STATE_FILE\")\n\t\telse\n\t\t\tLAST_PROXY_PORTS=\"\"\n\t\tfi\n\n\t\t# Save previous WAN_BP_IP state\n\t\tWAN_BP_IP_STATE_FILE=\"/tmp/.last_wan_bp_ip\"\n\t\tif [ -f \"$WAN_BP_IP_STATE_FILE\" ]; then\n\t\t\tLAST_WAN_BP_IP=$(cat \"$WAN_BP_IP_STATE_FILE\")\n\t\telse\n\t\t\tLAST_WAN_BP_IP=\"\"\n\t\tfi\n\n\t\t# Save previous LAN_AC_IP state\n\t\tLAN_AC_IP_STATE_FILE=\"/tmp/.last_lan_ac_ip\"\n\t\tif [ -f \"$LAN_AC_IP_STATE_FILE\" ]; then\n\t\t\tLAST_LAN_AC_IP=$(cat \"$LAN_AC_IP_STATE_FILE\")\n\t\telse\n\t\t\tLAST_LAN_AC_IP=\"\"\n\t\tfi\n\n\t\t# Save previous LAN_BP_IP state\n\t\tLAN_BP_IP_STATE_FILE=\"/tmp/.last_lan_bp_ip\"\n\t\tif [ -f \"$LAN_BP_IP_STATE_FILE\" ]; then\n\t\t\tLAST_LAN_BP_IP=$(cat \"$LAN_BP_IP_STATE_FILE\")\n\t\telse\n\t\t\tLAST_LAN_BP_IP=\"\"\n\t\tfi\n\n\t\t# Save previous WAN_FW_IP state\n\t\tWAN_FW_IP_STATE_FILE=\"/tmp/.last_wan_fw_ip\"\n\t\tif [ -f \"$WAN_FW_IP_STATE_FILE\" ]; then\n\t\t\tLAST_WAN_FW_IP=$(cat \"$WAN_FW_IP_STATE_FILE\")\n\t\telse\n\t\t\tLAST_WAN_FW_IP=\"\"\n\t\tfi\n\n\t\t# Save previous LAN_FP_IP state\n\t\tLAN_FP_IP_STATE_FILE=\"/tmp/.last_lan_fp_ip\"\n\t\tif [ -f \"$LAN_FP_IP_STATE_FILE\" ]; then\n\t\t\tLAST_LAN_FP_IP=$(cat \"$LAN_FP_IP_STATE_FILE\")\n\t\telse\n\t\t\tLAST_LAN_FP_IP=\"\"\n\t\tfi\n\n\t\t# Save previous LAN_GM_IP state\n\t\tLAN_GM_IP_STATE_FILE=\"/tmp/.last_lan_gm_ip\"\n\t\tif [ -f \"$LAN_GM_IP_STATE_FILE\" ]; then\n\t\t\tLAST_LAN_GM_IP=$(cat \"$LAN_GM_IP_STATE_FILE\")\n\t\telse\n\t\t\tLAST_LAN_GM_IP=\"\"\n\t\tfi\n\n\t\t# Check for changes in the existence and content of the server XHTTP address file\n\t\tXHTTP_FILE_STATE_FILE=\"/tmp/.last_xhttp_file\"\n\t\tXHTTP_FILE_HASH_FILE=\"/tmp/.last_xhttp_hash\"\n\n\t\t# Get the current server XHTTP file status\n\t\tXHTTP_FILE_EXISTS=0\n\t\tXHTTP_FILE_HASH=\"\"\n\t\tif [ -f \"/etc/ssrplus/xhttp_address.txt\" ]; then\n\t\t\tXHTTP_FILE_EXISTS=1\n\t\t\tXHTTP_FILE_HASH=$(md5sum /etc/ssrplus/xhttp_address.txt 2>/dev/null | awk '{print $1}')\n\t\tfi\n\n\t\t# Read the previous server XHTTP file status and hash\n\t\tif [ -f \"$XHTTP_FILE_STATE_FILE\" ]; then\n\t\t\tLAST_XHTTP_FILE_EXISTS=$(cat \"$XHTTP_FILE_STATE_FILE\")\n\t\telse\n\t\t\tLAST_XHTTP_FILE_EXISTS=\"\"\n\t\tfi\n\n\t\tif [ -f \"$XHTTP_FILE_HASH_FILE\" ]; then\n\t\t\tLAST_XHTTP_FILE_HASH=$(cat \"$XHTTP_FILE_HASH_FILE\")\n\t\telse\n\t\t\tLAST_XHTTP_FILE_HASH=\"\"\n\t\tfi\n\n\t\t# STEP 1: Check if TPROXY has value (1 or 2)\n\t\tif [ \"$TPROXY\" = \"1\" ] || [ \"$TPROXY\" = \"2\" ]; then\n\t\t\tTPROXY_HAS_VALUE=1\n\t\telse\n\t\t\tTPROXY_HAS_VALUE=0\n\t\tfi\n\n\t\tif [ \"$LAST_TPROXY\" = \"1\" ] || [ \"$LAST_TPROXY\" = \"2\" ]; then\n\t\t\tLAST_HAS_VALUE=1\n\t\telse\n\t\t\tLAST_HAS_VALUE=0\n\t\tfi\n\n\t\t# STEP 2: Check if PROXY_PORTS has value (non-empty string)\n\t\tif [ -n \"${PROXY_PORTS// }\" ]; then\n\t\t\tPROXY_HAS_VALUE=1\n\t\telse\n\t\t\tPROXY_HAS_VALUE=0\n\t\tfi\n\n\t\tif [ -n \"${LAST_PROXY_PORTS// }\" ]; then\n\t\t\tLAST_PROXY_HAS_VALUE=1\n\t\telse\n\t\t\tLAST_PROXY_HAS_VALUE=0\n\t\tfi\n\n\t\t# STEP 2.5: Check if any IP list has changed\n\t\tANY_IP_LIST_CHANGED=0\n\t\t\n\t\t# Check WAN_BP_IP\n\t\tcheck_ip_list_changed \"$WAN_BP_IP\" \"$LAST_WAN_BP_IP\" \"WAN_BP_IP\"\n\t\tif [ $? -eq 1 ]; then\n\t\t\tANY_IP_LIST_CHANGED=1\n\t\tfi\n\t\t\n\t\t# Check LAN_AC_IP\n\t\tcheck_ip_list_changed \"$LAN_AC_IP\" \"$LAST_LAN_AC_IP\" \"LAN_AC_IP\"\n\t\tif [ $? -eq 1 ]; then\n\t\t\tANY_IP_LIST_CHANGED=1\n\t\tfi\n\t\t\n\t\t# Check LAN_BP_IP\n\t\tcheck_ip_list_changed \"$LAN_BP_IP\" \"$LAST_LAN_BP_IP\" \"LAN_BP_IP\"\n\t\tif [ $? -eq 1 ]; then\n\t\t\tANY_IP_LIST_CHANGED=1\n\t\tfi\n\t\t\n\t\t# Check WAN_FW_IP\n\t\tcheck_ip_list_changed \"$WAN_FW_IP\" \"$LAST_WAN_FW_IP\" \"WAN_FW_IP\"\n\t\tif [ $? -eq 1 ]; then\n\t\t\tANY_IP_LIST_CHANGED=1\n\t\tfi\n\t\t\n\t\t# Check LAN_FP_IP\n\t\tcheck_ip_list_changed \"$LAN_FP_IP\" \"$LAST_LAN_FP_IP\" \"LAN_FP_IP\"\n\t\tif [ $? -eq 1 ]; then\n\t\t\tANY_IP_LIST_CHANGED=1\n\t\tfi\n\t\t\n\t\t# Check LAN_GM_IP\n\t\tcheck_ip_list_changed \"$LAN_GM_IP\" \"$LAST_LAN_GM_IP\" \"LAN_GM_IP\"\n\t\tif [ $? -eq 1 ]; then\n\t\t\tANY_IP_LIST_CHANGED=1\n\t\tfi\n\n\t\t# Check for changes in the existence of the server XHTTP address file.\n\t\tif [ \"$XHTTP_FILE_EXISTS\" != \"$LAST_XHTTP_FILE_EXISTS\" ]; then\n\t\t\tloger 6 \"xhttp address file existence changed: '$LAST_XHTTP_FILE_EXISTS' -> '$XHTTP_FILE_EXISTS'\"\n\t\t\tANY_IP_LIST_CHANGED=1\n\t\tfi\n\n\t\t# Check for XHTTP file content changes (compare hashes only when the file exists in both checks)\n\t\tif [ \"$XHTTP_FILE_EXISTS\" = \"1\" ] && [ \"$LAST_XHTTP_FILE_EXISTS\" = \"1\" ]; then\n\t\t\tif [ \"$XHTTP_FILE_HASH\" != \"$LAST_XHTTP_FILE_HASH\" ]; then\n\t\t\t\tloger 6 \"xhttp address file content changed (hash: '$LAST_XHTTP_FILE_HASH' -> '$XHTTP_FILE_HASH')\"\n\t\t\t\tANY_IP_LIST_CHANGED=1\n\t\t\telse\n\t\t\t\tloger 6 \"xhttp address file content unchanged\"\n\t\t\tfi\n\t\telif [ \"$XHTTP_FILE_EXISTS\" = \"0\" ] && [ \"$LAST_XHTTP_FILE_EXISTS\" = \"1\" ]; then\n\t\t\tloger 6 \"xhttp address file deleted\"\n\t\t\tANY_IP_LIST_CHANGED=1\n\t\telif [ \"$XHTTP_FILE_EXISTS\" = \"1\" ] && [ \"$LAST_XHTTP_FILE_EXISTS\" = \"0\" ]; then\n\t\t\tloger 6 \"xhttp address file created\"\n\t\t\tANY_IP_LIST_CHANGED=1\n\t\tfi\n\n\t\t# STEP 3: Determine if forced rebuild is needed\n\t\tFORCE_RECREATE=0\n\t\tPERSISTENCE_EXISTS=0\n\n\t\t# Trigger conditions:\n\t\t# 1. TPROXY changes from empty ↔ has value\n\t\t# 2. PROXY_PORTS changes from empty ↔ has value\n\t\t# 3. Any IP list has changed\n\t\tif [ \"$TPROXY_HAS_VALUE\" != \"$LAST_HAS_VALUE\" ] || \\\n\t\t   [ \"$PROXY_HAS_VALUE\" != \"$LAST_PROXY_HAS_VALUE\" ] || \\\n\t\t   [ \"$ANY_IP_LIST_CHANGED\" = \"1\" ]; then\n\t\t\tFORCE_RECREATE=1\n\t\t\tloger 6 \"TPROXY, PROXY_PORTS or any IP list changed → force rebuild rules\"\n\t\t\trm -f \"$NFTABLES_RULES_FILE\" 2>/dev/null\n\t\telse\n\t\t\t# No FORCE_RECREATE triggered → check persistence file\n\t\t\tif [ -f \"$NFTABLES_RULES_FILE\" ] && [ -s \"$NFTABLES_RULES_FILE\" ]; then\n\t\t\t\tPERSISTENCE_EXISTS=1\n\t\t\t\tloger 6 \"Persistence file exists: $NFTABLES_RULES_FILE\"\n\t\t\telse\n\t\t\t\tPERSISTENCE_EXISTS=0\n\t\t\t\tloger 6 \"Persistence file does not exist or empty\"\n\t\t\tfi\n\t\tfi\n\n\t\t# STEP 4: Save current state\n\t\techo \"$TPROXY\" > \"$TPROXY_STATE_FILE\"\n\t\techo \"$PROXY_PORTS\" > \"$PROXY_PORTS_STATE_FILE\"\n\t\techo \"$(normalize_ip_list \"$WAN_BP_IP\")\" > \"$WAN_BP_IP_STATE_FILE\"\n\t\techo \"$(normalize_ip_list \"$LAN_AC_IP\")\" > \"$LAN_AC_IP_STATE_FILE\"\n\t\techo \"$(normalize_ip_list \"$LAN_BP_IP\")\" > \"$LAN_BP_IP_STATE_FILE\"\n\t\techo \"$(normalize_ip_list \"$WAN_FW_IP\")\" > \"$WAN_FW_IP_STATE_FILE\"\n\t\techo \"$(normalize_ip_list \"$LAN_FP_IP\")\" > \"$LAN_FP_IP_STATE_FILE\"\n\t\techo \"$(normalize_ip_list \"$LAN_GM_IP\")\" > \"$LAN_GM_IP_STATE_FILE\"\n\t\techo \"$XHTTP_FILE_EXISTS\" > \"$XHTTP_FILE_STATE_FILE\"\n\t\techo \"$XHTTP_FILE_HASH\" > \"$XHTTP_FILE_HASH_FILE\"\n\n\t\t# STEP 5: Check if run mode changed\n\t\tif runmode_change \"$RUNMODE\"; then\n\t\t\tMODE_CHANGED=1\n\t\t\tloger 6 \"Runmode changed: MODE_CHANGED=1\"\n\t\telse\n\t\t\tMODE_CHANGED=0\n\t\t\tloger 6 \"Runmode unchanged: MODE_CHANGED=0\"\n\t\tfi\n\n\t\t# STEP 6: Mode changed and persistence exists → delete once\n\t\tif [ \"$MODE_CHANGED\" = \"1\" ] && [ \"$PERSISTENCE_EXISTS\" = \"1\" ]; then\n\t\t\tloger 6 \"Mode changed → removing persistence file\"\n\t\t\trm -f \"$NFTABLES_RULES_FILE\"\n\t\t\tPERSISTENCE_EXISTS=0\n\t\tfi\n\n\t\t# STEP 7: FORCE_RECREATE priority → must rebuild rules\n\t\tif [ \"$FORCE_RECREATE\" = \"1\" ]; then\n\t\t\tloger 5 \"Forced regeneration of NFTables rules\"\n\t\t\tif flush_r && ipset_r && fw_rule && ac_rule && tp_rule && gen_include; then\n\t\t\t\tloger 5 \"NFT rules applied successfully (forced rebuild)\"\n\t\t\t\tpersist_nftables_rules\n\t\t\t\t[ \"$ENABLE_AUTO_UPDATE\" = \"1\" ] && start_auto_update_daemon\n\t\t\t\texit 0\n\t\t\telse\n\t\t\t\tloger 3 \"NFT forced rebuild failed!\"\n\t\t\t\texit 1\n\t\t\tfi\n\t\tfi\n\n\t\t# STEP 8: Persistence exists → try restore\n\t\tif [ \"$PERSISTENCE_EXISTS\" = \"1\" ]; then\n\t\t\t# Restore rules\n\t\t\tif restore_from_persistence; then\n\t\t\t\tloger 5 \"NFT rules restored from persistence\"\n\t\t\t\tgen_include\n\t\t\t\t[ \"$ENABLE_AUTO_UPDATE\" = \"1\" ] && start_auto_update_daemon\n\t\t\t\texit 0\n\t\t\telse\n\t\t\t\tloger 3 \"Restore failed → fallback to full setup\"\n\t\t\t\tPERSISTENCE_EXISTS=0\n\t\t\tfi\n\t\tfi\n\n\t\t# STEP 9: Persistence doesn't exist or restore failed → generate new rules\n\t\tif flush_r && ipset_r && fw_rule && ac_rule && tp_rule && gen_include; then\n\t\t\tloger 5 \"NFTables rules applied successfully\"\n\t\t\tpersist_nftables_rules\n\t\t\t[ \"$ENABLE_AUTO_UPDATE\" = \"1\" ] && start_auto_update_daemon\n\t\t\texit 0\n\t\telse\n\t\t\tloger 3 \"NFTables setup failed!\"\n\t\t\texit 1\n\t\tfi\n\telse\n\t\t# iptables\n\t\tif flush_r && fw_rule && ipset_r && ac_rule && tp_rule && gen_include; then\n\t\t\tloger 5 \"iptables rules applied successfully\"\n\t\t\texit 0\n\t\telse\n\t\t\tloger 3 \"iptables setup failed!\"\n\t\t\texit 1\n\t\tfi\n\tfi\nfi\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/usr/bin/ssr-switch",
    "content": "#!/bin/sh /etc/rc.common\n#\n# Copyright (C) 2017 openwrt-ssr\n# Copyright (C) 2017 yushi studio <ywb94@qq.com>\n#\n# This is free software, licensed under the GNU General Public License v3.\n# See /LICENSE for more information.\n#\n\n. $IPKG_INSTROOT/etc/init.d/shadowsocksr\nLOCK_FILE=\"/var/lock/ssr-switch.lock\"\n[ -f \"$LOCK_FILE\" ] && exit 2\ntouch \"$LOCK_FILE\"\nLOG_FILE=/var/log/ssrplus.log\n\ncycle_time=60\nswitch_time=3\nnormal_flag=0\nserver_locate=0\nserver_count=0\nENABLE_SERVER=nil\n[ -n \"$1\" ] && cycle_time=$1\n[ -n \"$2\" ] && switch_time=$2\nDEFAULT_SERVER=$(uci_get_by_type global global_server)\nCURRENT_SERVER=$DEFAULT_SERVER\n\n#判断代理是否正常\ncheck_proxy() {\n\tlocal result=0\n\tlocal try_count=$(uci_get_by_type global switch_try_count 3)\n\tfor i in $(seq 1 $try_count); do\n\t\t/usr/bin/ssr-check www.google.com 80 $switch_time 1\n\t\tif [ \"$?\" == \"0\" ]; then\n\t\t\t# echolog \"Check Google Proxy Success, count=$i\"\n\t\t\tresult=0\n\t\t\tbreak\n\t\telse\n\t\t\t# echolog \"Check Google Proxy Fail, count=$i\"\n\t\t\t/usr/bin/ssr-check www.baidu.com 80 $switch_time 1\n\t\t\tif [ \"$?\" == \"0\" ]; then\n\t\t\t\tresult=1\n\t\t\telse\n\t\t\t\tresult=2\n\t\t\tfi\n\t\tfi\n\t\tsleep 1\n\tdone\n\treturn $result\n}\n\ntest_proxy() {\n\tlocal servername=$(uci_get_by_name $1 server)\n\tlocal serverport=$(uci_get_by_name $1 server_port)\n\tipset add whitelist $servername 2>/dev/null\n\ttcping -q -c 3 -i 1 -t 2 -p $serverport $servername\n\tif [ \"$?\" -gt \"0\" ]; then\n\t\tipset del whitelist $servername 2>/dev/null\n\t\treturn 1\n\tfi\n\t/usr/bin/ssr-check $servername $serverport $switch_time\n\tlocal ret=$?\n\tipset del whitelist $servername 2>/dev/null\n\tif [ \"$ret\" == \"0\" ]; then\n\t\treturn 0\n\telse\n\t\treturn 1\n\tfi\n}\n\nsearch_proxy() {\n\tlet server_count=server_count+1\n\t[ \"$normal_flag\" == \"1\" -a \"$server_count\" -le \"$server_locate\" ] && return 0\n\t[ \"$(uci_get_by_name $1 switch_enable 0)\" != \"1\" ] && return 1\n\t[ $ENABLE_SERVER != nil ] && return 0\n\t[ \"$1\" == \"$CURRENT_SERVER\" ] && return 0\n\tlocal servername=$(uci_get_by_name $1 server)\n\tlocal serverport=$(uci_get_by_name $1 server_port)\n\tipset add whitelist $servername 2>/dev/null\n\t/usr/bin/ssr-check $servername $serverport $switch_time\n\tlocal ret=$?\n\tipset del whitelist $servername 2>/dev/null\n\tif [ \"$ret\" == \"0\" ]; then\n\t\tserver_locate=$server_count\n\t\tENABLE_SERVER=$1\n\t\treturn 0\n\telse\n\t\treturn 1\n\tfi\n}\n\n#选择可用的代理\nselect_proxy() {\n\tconfig_load $NAME\n\tENABLE_SERVER=nil\n\tmkdir -p /var/run /var/etc\n\tserver_count=0\n\tconfig_foreach search_proxy servers\n}\n\n#切换代理\nswitch_proxy() {\n\t/etc/init.d/shadowsocksr restart $1\n\treturn 0\n}\n\nstart() {\n\t#不支持kcptun启用时的切换\n\t[ $(uci_get_by_name $DEFAULT_SERVER kcp_enable) = \"1\" ] && return 1\n\twhile [ \"1\" == \"1\" ]; do #死循环\n\t\tsleep 0000$cycle_time\n\t\tLOGTIME=$(date \"+%Y-%m-%d %H:%M:%S\")\n\t\t#判断当前代理是否为缺省服务器\n\t\tif [ \"$CURRENT_SERVER\" != \"$DEFAULT_SERVER\" ]; then\n\t\t\t#echo \"not default proxy\"\n\t\t\techolog \"Current server is not default Main server, try to switch back.\"\n\t\t\t#检查缺省服务器是否正常\n\t\t\tif test_proxy $DEFAULT_SERVER; then\n\t\t\t\t#echo \"switch to default proxy\"\n\t\t\t\techolog \"Main server is avilable.\"\n\t\t\t\t#缺省服务器正常，切换回来\n\t\t\t\tCURRENT_SERVER=$DEFAULT_SERVER\n\t\t\t\tswitch_proxy $CURRENT_SERVER\n\t\t\t\techolog \"switch to default \"$(uci_get_by_name $CURRENT_SERVER alias)\" proxy!\"\n\t\t\telse\n\t\t\t\techolog \"Main server is NOT avilable.Continue using current server.\"\n\t\t\tfi\n\t\tfi\n\t\t#判断当前代理是否正常\n\t\t#echolog \"Start checking if the current server is available.\"\n\t\tcheck_proxy\n\t\tcurrent_ret=$?\n\t\tif [ \"$current_ret\" == \"1\" ]; then\n\t\t\t#当前代理错误，判断有无可用的服务器\n\t\t\t#echo \"current error\"\n\t\t\techolog \"Current server error, try to switch another server.\"\n\t\t\tselect_proxy\n\t\t\tif [ \"$ENABLE_SERVER\" != nil ]; then\n\t\t\t\t#有其他服务器可用，进行切换\n\t\t\t\t#echo $(uci_get_by_name $new_proxy server)\n\t\t\t\techolog \"Another server is avilable, now switching server.\"\n\t\t\t\tCURRENT_SERVER=$ENABLE_SERVER\n\t\t\t\tswitch_proxy $CURRENT_SERVER\n\t\t\t\tnormal_flag=1\n\t\t\t\techolog \"Switch to \"$(uci_get_by_name $CURRENT_SERVER alias)\" proxy!\"\n\t\t\telse\n\t\t\t\tswitch_proxy $CURRENT_SERVER\n\t\t\t\tnormal_flag=1\n\t\t\t\techolog \"Try restart current server.\"\n\t\t\tfi\n\t\telse\n\t\t\tnormal_flag=0\n\t\t\t# echolog \"ShadowsocksR No Problem.\"\n\t\tfi\n\tdone\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/usr/share/rpcd/acl.d/luci-app-ssr-plus.json",
    "content": "{\n\t\"luci-app-ssr-plus\": {\n\t\t\"description\": \"Grant UCI access for luci-app-ssr-plus\",\n\t\t\"read\": {\n\t\t\t\"file\": {\n\t\t\t\t\"/etc/ssrplus/*\": [ \"read\" ]\n\t\t\t},\n\t\t\t\"uci\": [\"shadowsocksr\"]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"file\": {\n\t\t\t\t\"/etc/ssrplus/*\": [ \"write\" ]\n\t\t\t},\n\t\t\t\"uci\": [\"shadowsocksr\"]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/usr/share/shadowsocksr/chinaipset.sh",
    "content": "#!/bin/sh\n\n. $IPKG_INSTROOT/etc/init.d/shadowsocksr\n\ncheck_run_environment\n\n# 设置 china_ip 变量并检查文件是否存在\nchina_ip=\"${1:-${china_ip:-/etc/ssrplus/china_ssr.txt}}\"\n[ -f \"$china_ip\" ] || exit 1\n\ncase \"$USE_TABLES\" in\n\tnftables)\n\t\tskip_inet=\"${SKIP_INET:-0}\"\n\n\t\tcase \"$skip_inet\" in\n\t\t\t1)\n\t\t\t\t{\n\t\t\t\t\t# ss_spec / inet (仅在表和 set 存在时添加)\n\t\t\t\t\tif nft list set inet ss_spec china >/dev/null 2>&1; then\n\t\t\t\t\t\techo \"add element inet ss_spec china {\"\n\t\t\t\t\t\tgrep -vE '^\\s*#|^\\s*$' \"$china_ip\" | sed 's/^/  /;s/$/,/'\n\t\t\t\t\t\techo \"}\"\n\t\t\t\t\tfi\n\t\t\t\t} | nft -f - || exit 1\n\t\t\t\t;;\n\t\t\t2)\n\t\t\t\t{\n\t\t\t\t\t# ss_spec_mangle / ip (仅在表和 set 存在时添加)\n\t\t\t\t\tif nft list set ip ss_spec_mangle china >/dev/null 2>&1; then\n\t\t\t\t\t\techo \"add element ip ss_spec_mangle china {\"\n\t\t\t\t\t\tgrep -vE '^\\s*#|^\\s*$' \"$china_ip\" | sed 's/^/  /;s/$/,/'\n\t\t\t\t\t\techo \"}\"\n\t\t\t\t\tfi\n\t\t\t\t} | nft -f - || exit 1\n\t\t\t\t;;\n\t\t\t*)\n\t\t\t\techolog \"chinaipset: invalid SKIP_INET=$skip_inet\"\n\t\t\t\texit 1\n\t\t\t\t;;\n\t\tesac\n\t\t;;\n\tiptables)\n\t\tipset -! flush china 2>/dev/null\n\t\tipset -! -R <<-EOF || exit 1\n\t\t\tcreate china hash:net\n\t\t\t$(grep -vE '^\\s*#|^\\s*$' \"$china_ip\" | sed 's/^/add china /')\n\t\tEOF\n\t\t;;\n\t*)\n\t\techolog \"ERROR: No supported firewall backend detected\"\n\t\texit 1\n\t\t;;\nesac\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/usr/share/shadowsocksr/gen_config.lua",
    "content": "#!/usr/bin/lua\n\nrequire \"luci.sys\"\nlocal ucursor = require \"luci.model.uci\".cursor()\nlocal datatypes = require \"luci.cbi.datatypes\"\nlocal json = require \"luci.jsonc\"\n\nlocal server_section = arg[1]\nlocal proto          = arg[2] or \"tcp\"\nlocal local_port     = arg[3] or \"0\"\nlocal socks_port     = arg[4] or \"0\"\n\nlocal chain          = arg[5] or \"0\"\n\nlocal GLOBAL = {\n\tDNS_SERVER = {},\n\tDNS_HOSTNAME = {},\n\tVPS_EXCLUDE = {}\n}\n\n-- 辅助函数：拆分字符串（若 luci.util 未加载则定义）\nlocal function split(str, pat)\n\tlocal t = {}\n\tlocal last = 1\n\twhile true do\n\t\tlocal pos = str:find(pat, last, true)\n\t\tif not pos then break end\n\t\ttable.insert(t, str:sub(last, pos - 1))\n\t\tlast = pos + 1\n\tend\n\ttable.insert(t, str:sub(last))\n\treturn t\nend\n\nlocal chain_local_port = split(chain, \"/\")[2] or \"0\"\n\nlocal server = ucursor:get_all(\"shadowsocksr\", server_section)\nlocal socks_server = ucursor:get_all(\"shadowsocksr\", \"@socks5_proxy[0]\") or {}\nlocal xray_fragment = ucursor:get_all(\"shadowsocksr\", \"@global_xray_fragment[0]\") or {}\nlocal xray_noise = ucursor:get_all(\"shadowsocksr\", \"@xray_noise_packets[0]\") or {}\nlocal outbound_settings = nil\nlocal xray_version = nil\nlocal xray_version_val = 0\n\nlocal node_id = server_section\nlocal remarks = server.alias or \"\"\nlocal b64decode = nixio.bin.b64decode\nlocal b64encode = nixio.bin.b64encode\n\n-- 解析 URL（简单实现，仅用于 DoH）\nlocal function parseURL(url)\n\tif not url then return nil end\n\tlocal schema, rest = url:match(\"^(https?)://(.*)$\")\n\tif not schema then return nil end\n\tlocal host, port_str = rest:match(\"^([^:]+):?(%d*)/?.*$\")\n\tlocal port = tonumber(port_str) or (schema == \"https\" and 443 or 80)\n\treturn { host = host, port = port, schema = schema }\nend\n\nif server.type == \"ss-rust\" or server.type == \"ss-libev\" then\n    server.type = \"ss\"\nend\n\n-- base64 解码\nlocal function base64Decode(text)\n\tlocal raw = text\n\tif not text or text == \"\" then\n\t\treturn ''\n\tend\n\ttext = text:gsub(\"%z\", \"\")\n\ttext = text:gsub(\"%c\", \"\")\n\ttext = text:gsub(\"%s\", \"\")\n\ttext = text:gsub(\"_\", \"/\")\n\ttext = text:gsub(\"-\", \"+\")\n\ttext = text:gsub(\"=\", \"\")\n\tlocal mod4 = #text % 4\n\ttext = text .. string.sub('====', mod4 + 1)\n\tlocal result = b64decode(text)\n\tif result then\n\t\treturn result:gsub(\"%z\", \"\")\n\telse\n\t\treturn raw\n\tend\nend\n\n-- base64 编码\nlocal function base64Encode(text)\n\tif not text or text == \"\" then\n\t\treturn ''\n\tend\n\tlocal result = b64encode(text)\n\tif result then\n\t\tresult = result:gsub(\"%z\", \"\")\n\t\treturn result\n\telse\n\t\treturn text\n\tend\nend\n\n-- Hex 编码\nlocal function hexEncode(text)\n\tif not text or text == \"\" then\n\t\treturn ''\n\tend\n\tlocal hex = ''\n\tfor i = 1, #text do\n\t\tlocal byte = string.byte(text, i)\n\t\thex = hex .. string.format('%02X', byte)\n\tend\n\treturn hex\nend\n\nlocal function cleanEmptyTables(t)\n\tif type(t) ~= \"table\" then return nil end\n\tfor k, v in pairs(t) do\n\t\tif type(v) == \"table\" then\n\t\t\tt[k] = cleanEmptyTables(v)\n\t\tend\n\tend\n\treturn next(t) and t or nil\nend\n\n-- 确保正确判断程序是否存在\nlocal function is_finded(e)\n\treturn luci.sys.exec(string.format('type -t -p \"%s\" 2>/dev/null', e)) ~= \"\"\nend\n\n-- 获取 Xray 版本号\nif is_finded(\"xray\") then\n\tlocal version = luci.sys.exec(\"xray version 2>&1\")\n\tif version and version ~= \"\" then\n\t\txray_version = version:match(\"Xray%s+([%d%.]+)\")\n\tend\nend\n\n-- 将 Xray 版本号转换为数字\nif xray_version and xray_version ~= \"\" then\n\tlocal major, minor, patch =\n\t\txray_version:match(\"(%d+)%.?(%d*)%.?(%d*)\")\n\n\tmajor = tonumber(major) or 0\n\tminor = tonumber(minor) or 0\n\tpatch = tonumber(patch) or 0\n\n\txray_version_val = major * 10000 + minor * 100 + patch\nend\n\nfunction vmess_vless()\n\toutbound_settings = {\n\t\tvnext = {\n\t\t\t{\n\t\t\t\taddress = server.server,\n\t\t\t\tport = tonumber(server.server_port),\n\t\t\t\tusers = {\n\t\t\t\t\t{\n\t\t\t\t\t\tid = server.vmess_id,\n\t\t\t\t\t\talterId = (server.v2ray_protocol == \"vmess\" or not server.v2ray_protocol) and tonumber(server.alter_id) or nil,\n\t\t\t\t\t\tsecurity = (server.v2ray_protocol == \"vmess\" or not server.v2ray_protocol) and server.security or nil,\n\t\t\t\t\t\ttestpre = (server.v2ray_protocol == \"vless\" or not server.v2ray_protocol) and tonumber(server.preconns) or nil,\n\t\t\t\t\t\tencryption = (server.v2ray_protocol == \"vless\" or (not server.v2ray_protocol and server.vless_encryption)) and (server.vless_encryption or \"none\") or nil,\n\t\t\t\t\t\tflow = (server.v2ray_protocol == \"vless\" and (server.xtls == \"1\" or server.tls == \"1\" or server.reality == \"1\"\n\t\t\t\t\t\t\t\tor (server.vless_encryption and server.vless_encryption ~= \"\" and server.vless_encryption ~= \"none\")) and (\n\t\t\t\t\t\t\t\tserver.transport == \"raw\" or server.transport == \"tcp\" or server.transport == \"xhttp\" or server.transport == \"splithttp\") and (\n\t\t\t\t\t\t\t\tserver.tls_flow and server.tls_flow ~= \"none\")) and server.tls_flow or nil\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\nend\nfunction trojan_shadowsocks()\n\toutbound_settings = {\n\t\tservers = {\n\t\t\t{\n\t\t\t\taddress = server.server,\n\t\t\t\tport = tonumber(server.server_port),\n\t\t\t\tpassword = server.password,\n\t\t\t\tmethod = ((server.v2ray_protocol == \"shadowsocks\") and server.encrypt_method_ss) or nil,\n\t\t\t\tuot = (server.v2ray_protocol == \"shadowsocks\") and (server.uot == '1') or nil,\n\t\t\t\tivCheck = (server.v2ray_protocol == \"shadowsocks\") and (server.ivCheck == '1') or nil,\n\t\t\t}\n\t\t}\n\t}\nend\nfunction socks_http()\n\toutbound_settings = {\n\t\tversion = server.socks_ver or nil,\n\t\tservers = {\n\t\t\t{\n\t\t\t\taddress = server.server,\n\t\t\t\tport = tonumber(server.server_port),\n\t\t\t\tusers = (server.auth_enable == \"1\") and {\n\t\t\t\t\t{\n\t\t\t\t\t\tuser = server.username,\n\t\t\t\t\t\tpass = server.password\n\t\t\t\t\t}\n\t\t\t\t} or nil\n\t\t\t}\n\t\t}\n\t}\nend\nfunction wireguard()\n\t-- 处理 reserved 字段，支持逗号分隔的数字或 Base64 编码\n\tlocal reserved = nil\n\tif server.reserved then\n\t\tlocal bytes = {}\n\t\tif not server.reserved:match(\"[^%d,]+\") then\n\t\t\t-- 纯数字和逗号，解析为数字列表\n\t\t\tserver.reserved:gsub(\"%d+\", function(b)\n\t\t\t\tbytes[#bytes + 1] = tonumber(b)\n\t\t\tend)\n\t\telse\n\t\t\t-- Base64 编码的二进制数据\n\t\t\tlocal result = base64Decode(server.reserved)\n\t\t\tfor i = 1, #result do\n\t\t\t\tbytes[i] = result:byte(i)\n\t\t\tend\n\t\tend\n\t\treserved = #bytes > 0 and bytes or nil\n\tend\n\n\toutbound_settings = {\n\t\tsecretKey = server.private_key,\n\t\taddress = server.local_addresses,\n\t\tpeers = {\n\t\t\t{\n\t\t\t\tpublicKey = server.peer_pubkey,\n\t\t\t\tpreSharedKey = server.preshared_key,\n\t\t\t\tendpoint = server.server .. \":\" .. server.server_port,\n\t\t\t\tkeepAlive = tonumber(server.keepaliveperiod),\n\t\t\t\tallowedIPs = (server.allowedips) or nil,\n\t\t\t}\n\t\t},\n\t\tnoKernelTun = (server.kernelmode == \"1\") and true or false,\n\t\treserved = reserved,\n\t\tmtu = tonumber(server.mtu)\n\t}\nend\nfunction xray_hysteria2()\n\toutbound_settings = {\n\t\tversion = (server.v2ray_protocol == \"hysteria2\") and 2 or nil,\n\t\taddress = server.server,\n\t\tport = tonumber(server.server_port)\n\t}\nend\nlocal outbound = {}\nfunction outbound:new(o)\n\to = o or {}\n\tsetmetatable(o, self)\n\tself.__index = self\n\treturn o\nend\nfunction outbound:handleIndex(index)\n\tlocal switch = {\n\t\tvmess = function()\n\t\t\tvmess_vless()\n\t\tend,\n\t\tvless = function()\n\t\t\tvmess_vless()\n\t\tend,\n\t\ttrojan = function()\n\t\t\ttrojan_shadowsocks()\n\t\tend,\n\t\tshadowsocks = function()\n\t\t\ttrojan_shadowsocks()\n\t\tend,\n\t\tsocks = function()\n\t\t\tsocks_http()\n\t\tend,\n\t\thttp = function()\n\t\t\tsocks_http()\n\t\tend,\n\t\twireguard = function()\n\t\t\twireguard()\n\t\tend,\n\t\thysteria2 = function()\n\t\t\txray_hysteria2()\n\t\tend\n\t}\n\tif switch[index] then\n\t\tswitch[index]()\n\tend\nend\nlocal settings = outbound:new()\nsettings:handleIndex(server.v2ray_protocol)\nlocal Xray = {\n\tlog = {\n\t\t-- error = \"/var/ssrplus.log\",\n\t\t-- loglevel = \"debug\",\n\t\t-- dnsLog = true,\n\t\t-- access = \"/var/log/ssrplus-access.log\",\n\t\t-- error = \"/var/log/ssrplus-error.log\"\n\t\tloglevel = \"warning\"\n\t},\n\n\t-- 初始化 inbounds 表\n\tinbounds = {},\n\n\t-- 初始化 outbounds 表\n\toutbounds = {},\n}\n\t-- 传入连接\n\t-- 添加 dokodemo-door 配置，如果 local_port 不为 0\nif local_port ~= \"0\" then\n    table.insert(Xray.inbounds, {\n\t\t\t-- listening\n\t\t\tport = tonumber(local_port),\n\t\t\tprotocol = \"dokodemo-door\",\n\t\t\tsettings = {network = proto, followRedirect = true},\n\t\t\tsniffing = {\n\t\t\t\tenabled = true,\n\t\t\t\tdestOverride = {\"http\", \"tls\", \"quic\"},\n\t\t\t\tmetadataOnly = false,\n\t\t\t\tdomainsExcluded = {\n\t\t\t\t\t\"courier.push.apple.com\",\n\t\t\t\t\t\"rbsxbxp-mim.vivox.com\",\n\t\t\t\t\t\"rbsxbxp.www.vivox.com\",\n\t\t\t\t\t\"rbsxbxp-ws.vivox.com\",\n\t\t\t\t\t\"rbspsxp.www.vivox.com\",\n\t\t\t\t\t\"rbspsxp-mim.vivox.com\",\n\t\t\t\t\t\"rbspsxp-ws.vivox.com\",\n\t\t\t\t\t\"rbswxp.www.vivox.com\",\n\t\t\t\t\t\"rbswxp-mim.vivox.com\",\n\t\t\t\t\t\"disp-rbspsp-5-1.vivox.com\",\n\t\t\t\t\t\"disp-rbsxbp-5-1.vivox.com\",\n\t\t\t\t\t\"proxy.rbsxbp.vivox.com\",\n\t\t\t\t\t\"proxy.rbspsp.vivox.com\",\n\t\t\t\t\t\"proxy.rbswp.vivox.com\",\n\t\t\t\t\t\"rbswp.vivox.com\",\n\t\t\t\t\t\"rbsxbp.vivox.com\",\n\t\t\t\t\t\"rbspsp.vivox.com\",\n\t\t\t\t\t\"rbspsp.www.vivox.com\",\n\t\t\t\t\t\"rbswp.www.vivox.com\",\n\t\t\t\t\t\"rbsxbp.www.vivox.com\",\n\t\t\t\t\t\"rbsxbxp.vivox.com\",\n\t\t\t\t\t\"rbspsxp.vivox.com\",\n\t\t\t\t\t\"rbswxp.vivox.com\",\n\t\t\t\t\t\"Mijia Cloud\",\n\t\t\t\t\t\"dlg.io.mi.com\"\n\t\t\t\t}\n\t\t\t}\n    })\nend\n\n\t-- 开启 socks 代理\n\t-- 检查是否启用 socks 代理\nif proto and proto:find(\"tcp\") and socks_port ~= \"0\" then\n    table.insert(Xray.inbounds, {\n        -- socks\n        protocol = \"socks\",\n        port = tonumber(socks_port),\n        settings = {\n\t\t\tauth = socks_server.socks5_auth or \"noauth\",\n\t\t\tudp = true,\n\t\t\tmixed = ((socks_server.socks5_mixed == '1') and true or false) or (socks_server.server == 'same') and nil,\n\t\t\taccounts = (socks_server.server ~= \"same\" and (socks_server.socks5_auth and socks_server.socks5_auth ~= \"noauth\")) and {\n\t\t\t\t{\n\t\t\t\t\tuser = socks_server.socks5_user,\n\t\t\t\t\tpass = socks_server.socks5_pass\n\t\t\t\t}\n\t\t\t} or nil\n\t\t} or nil\n    })\nend\n\n-- 传出连接\nXray.outbounds = {\n\t{\n\t\tprotocol = (server.v2ray_protocol == \"hysteria2\") and \"hysteria\" or server.v2ray_protocol,\n\t\tsettings = outbound_settings,\n\t\ttag = (remarks ~= nil and remarks ~= \"\") and (node_id .. \":\" .. remarks) or node_id,\n\t\t-- 底层传输配置\n\t\tstreamSettings = (server.v2ray_protocol ~= \"wireguard\") and {\n\t\t\tnetwork = (server.v2ray_protocol == \"hysteria2\") and \"hysteria\" or (server.transport or \"raw\"),\n\t\t\tsecurity = (server.xtls == '1') and \"xtls\" or (server.tls == '1') and \"tls\" or (server.reality == '1') and \"reality\" or nil,\n\t\t\ttlsSettings = (server.tls == '1') and {\n\t\t\t\t-- tls\n\t\t\t\talpn = (server.tls_alpn and server.tls_alpn ~= \"\") and (function()\n\t\t\t\t\tlocal alpn = {}\n\t\t\t\t\tstring.gsub(server.tls_alpn, '[^,]+', function(w)\n\t\t\t\t\t\ttable.insert(alpn, w)\n\t\t\t\t\tend)\n\t\t\t\t\tif #alpn > 0 then\n\t\t\t\t\t\treturn alpn\n\t\t\t\t\telse\n\t\t\t\t\t\treturn nil\n\t\t\t\t\tend\n\t\t\t\tend)() or nil,\n\t\t\t\tfingerprint = server.fingerprint,\n\t\t\t\tallowInsecure = (function()\n\t\t\t\t\tif server.tls_CertSha and server.tls_CertSha ~= \"\" then return nil end\n\t\t\t\t\tif os.date(\"%Y.%m.%d\") < \"2026.06.01\" then\n\t\t\t\t\t\treturn server.insecure == \"1\"\n\t\t\t\t\tend\n\t\t\t\t\treturn nil\n\t\t\t\tend)(),\n\t\t\t\tserverName = server.tls_host,\n\t\t\t\tcertificates = server.certificate and {\n\t\t\t\t\tusage = \"verify\",\n\t\t\t\t\tcertificateFile = server.certpath\n\t\t\t\t} or nil,\n\t\t\t\tpinnedPeerCertSha256 = (function()\n\t\t\t\t\tif xray_version_val < 260131 then return nil end\n\t\t\t\t\tif not server.tls_CertSha then return \"\" end\n\t\t\t\t\treturn server.tls_CertSha\n\t\t\t\tend)(),\n\t\t\t\tverifyPeerCertByName = (function()\n\t\t\t\t\tif xray_version_val < 260131 then return nil end\n\t\t\t\t\tif not server.tls_CertByName then return \"\" end\n\t\t\t\t\treturn server.tls_CertByName\n\t\t\t\tend)(),\n\t\t\t\techConfigList = (server.enable_ech == \"1\") and server.ech_config or nil,\n\t\t\t\techForceQuery = (server.enable_ech == \"1\") and (server.ech_ForceQuery or \"full\") or nil\n\t\t\t} or nil,\n\t\t\txtlsSettings = (server.xtls == '1') and server.tls_host and {\n\t\t\t\t-- xtls\n\t\t\t\tallowInsecure = (server.insecure == \"1\") and true or nil,\n\t\t\t\tserverName = server.tls_host,\n\t\t\t\tminVersion = \"1.3\"\n\t\t\t} or nil,\n\t\t\trealitySettings = (server.reality == '1') and {\n\t\t\t\tpublicKey = server.reality_publickey,\n\t\t\t\tshortId = server.reality_shortid or \"\",\n\t\t\t\tspiderX = server.reality_spiderx or \"\",\n\t\t\t\tfingerprint = server.fingerprint,\n\t\t\t\tmldsa65Verify = (server.enable_mldsa65verify == '1') and server.reality_mldsa65verify or nil,\n\t\t\t\tserverName = server.tls_host\n\t\t\t} or nil,\n\t\t\trawSettings = ((server.transport == \"raw\" or server.transport == \"tcp\")\n\t\t\t\tand (server.tcp_guise and server.tcp_guise ~= \"none\")) and {\n\t\t\t\t-- tcp\n\t\t\t\theader = {\n\t\t\t\t\ttype = server.tcp_guise,\n\t\t\t\t\trequest = (server.tcp_guise == \"http\") and {\n\t\t\t\t\t\tpath = server.http_path and (function()\n\t\t\t\t\t\t\tlocal t, r = server.http_path, {}\n\t\t\t\t\t\t\tif type(t) == \"string\" then t = {t} end\n\t\t\t\t\t\t\tfor _, v in ipairs(t) do\n\t\t\t\t\t\t\t\tr[#r + 1] = (v == \"\" and \"/\" or v)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\treturn r\n\t\t\t\t\t\tend)() or {\"/\"},\n\t\t\t\t\t\theaders = (server.http_path or server.user_agent) and {\n\t\t\t\t\t\t\tHost = (type(server.http_host) == \"string\") and {server.http_host} or server.http_host,\n\t\t\t\t\t\t\t[\"User-Agent\"] = server.user_agent and {server.user_agent} or nil\n\t\t\t\t\t\t} or nil\n\t\t\t\t\t} or nil\n\t\t\t\t}\n\t\t\t} or nil,\n\t\t\tkcpSettings = (server.transport == \"kcp\") and {\n\t\t\t\t-- kcp\n\t\t\t\tmtu =  (server.mtu and server.mtu ~= \"\") and tonumber(server.mtu) or 1350,\n\t\t\t\ttti = 50,\n\t\t\t\tuplinkCapacity = 12,\n\t\t\t\tdownlinkCapacity = 100,\n\t\t\t\tCwndMultiplier = 1,\n\t\t\t\tMaxSendingWindow = 2 * 1024 * 1024\n\t\t\t} or nil,\n\t\t\twsSettings = (server.transport == \"ws\") and (server.ws_path or server.ws_host or server.tls_host) and {\n\t\t\t\t-- ws\n\t\t\t\thost = server.ws_host or server.tls_host or nil,\n\t\t\t\tpath = server.ws_path or \"/\",\n\t\t\t\theaders = server.user_agent and {\n\t\t\t\t\t[\"User-Agent\"] = server.user_agent\n\t\t\t\t} or nil,\n\t\t\t\tmaxEarlyData = tonumber(server.ws_ed) or nil,\n\t\t\t\tearlyDataHeaderName = server.ws_ed_header or nil,\n\t\t\t\theartbeatPeriod = tonumber(server.ws_heartbeatPeriod) or nil\n\t\t\t} or nil,\n\t\t\thttpupgradeSettings = (server.transport == \"httpupgrade\") and {\n\t\t\t\t-- httpupgrade\n\t\t\t\thost = (server.httpupgrade_host or server.tls_host) or nil,\n\t\t\t\tpath = server.httpupgrade_path or \"\",\n\t\t\t\theaders =  server.user_agent and {\n\t\t\t\t\t[\"User-Agent\"] = server.user_agent\n\t\t\t\t} or nil\n\t\t\t} or nil,\n\t\t\txhttpSettings = (server.transport == \"xhttp\" or server.transport == \"splithttp\") and {\n\t\t\t\t-- xhttp\n\t\t\t\tmode = server.xhttp_mode or \"auto\",\n\t\t\t\thost = (server.xhttp_host or server.tls_host) or nil,\n\t\t\t\tpath = server.xhttp_path or \"/\",\n\t\t\t\textra = (function()\n\t\t\t\t\tlocal extra = {}\n\t\t\t\t\t-- 解析 xhttp_extra（Base64 编码的 JSON）\n\t\t\t\t\tif (server.enable_xhttp_extra == \"1\" and server.xhttp_extra) then\n\t\t\t\t\t\tlocal ok, parsed = pcall(json.parse, base64Decode(server.xhttp_extra))\n\t\t\t\t\t\tif ok and type(parsed) == \"table\" then\n\t\t\t\t\t\t\textra = parsed.extra or parsed   -- 取 \"extra\" 节，若无则整个 parsed\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\t-- 处理 User-Agent\n\t\t\t\t\tif server.user_agent and server.user_agent ~= \"\" then\n\t\t\t\t\t\textra.headers = extra.headers or {}\n\t\t\t\t\t\tif not extra.headers[\"User-Agent\"] and not extra.headers[\"user-agent\"] then\n\t\t\t\t\t\t\textra.headers[\"User-Agent\"] = server.user_agent\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\t\t-- 递归清理空表（如空 headers 会被删除）\n\t\t\t\t\treturn cleanEmptyTables(extra)\n\t\t\t\tend)()\n\t\t\t} or nil,\n\t\t\thttpSettings = (server.transport == \"h2\") and {\n\t\t\t\t-- h2\n\t\t\t\tpath = server.h2_path or \"\",\n\t\t\t\thost = {server.h2_host} or nil,\n\t\t\t\tread_idle_timeout = tonumber(server.read_idle_timeout) or nil,\n\t\t\t\thealth_check_timeout = tonumber(server.health_check_timeout) or nil\n\t\t\t} or nil,\n\t\t\tquicSettings = (server.transport == \"quic\") and {\n\t\t\t\t-- quic\n\t\t\t\tsecurity = server.quic_security,\n\t\t\t\tkey = server.quic_key,\n\t\t\t\theader = {type = server.quic_guise}\n\t\t\t} or nil,\n\t\t\tgrpcSettings = (server.transport == \"grpc\") and {\n\t\t\t\t-- grpc\n\t\t\t\tserviceName = (server.serviceName and server.serviceName ~= \"\") and server.serviceName or nil,\n\t\t\t\tmultiMode = (server.grpc_mode == \"multi\") and true or nil,\n\t\t\t\tidle_timeout = server.idle_timeout and (tonumber(server.idle_timeout) < 10 and 10 or tonumber(server.idle_timeout)) or nil,\n\t\t\t\thealth_check_timeout = server.health_check_timeout and tonumber(server.health_check_timeout) or nil,\n\t\t\t\tpermit_without_stream = (server.permit_without_stream == \"1\") and true or nil,\n\t\t\t\tinitial_windows_size = server.initial_windows_size and tonumber(server.initial_windows_size) or nil,\n\t\t\t\tuser_agent = server.user_agent\n\t\t\t} or nil,\n\t\t\thysteriaSettings = (server.v2ray_protocol == \"hysteria2\") and {\n\t\t\t\t-- hysteria2\n\t\t\t\tversion = 2,\n\t\t\t\tauth = server.hy2_auth\n\t\t\t} or nil,\n\t\t\tfinalmask = (function()\n\t\t\t\tlocal finalmask = {}\n\t\t\t\tlocal PT = server.v2ray_protocol\n\t\t\t\tlocal TP = server.transport\n\t\t\t\tif server.transport == \"kcp\" then\n\t\t\t\t\tlocal map = {none = \"none\", srtp = \"header-srtp\", utp = \"header-utp\", [\"wechat-video\"] = \"header-wechat\",\n\t\t\t\t\t\tdtls = \"header-dtls\", wireguard = \"header-wireguard\", dns = \"header-dns\"}\n\t\t\t\t\tlocal udp = {}\n\t\t\t\t\tif server.kcp_guise and server.kcp_guise ~= \"none\" then\n\t\t\t\t\t\tlocal g = { type = map[server.kcp_guise] }\n\t\t\t\t\t\tif server.kcp_guise == \"dns\" and server.kcp_domain and server.kcp_domain ~= \"\" then\n\t\t\t\t\t\t\tg.settings = { domain = server.kcp_domain }\n\t\t\t\t\t\tend\n\t\t\t\t\t\tudp[#udp+1] = g\n\t\t\t\t\tend\n\t\t\t\t\tlocal c = { type = (server.seed and server.seed ~= \"\") and \"mkcp-aes128gcm\" or \"mkcp-original\" }\n\t\t\t\t\tif server.seed and server.seed ~= \"\" then\n\t\t\t\t\t\tc.settings = { password = server.seed }\n\t\t\t\t\tend\n\t\t\t\t\tudp[#udp+1] = c\n\t\t\t\t\tfinalmask.udp = udp\n\t\t\t\telseif PT == \"hysteria2\" then\n\t\t\t\t\tif (server.flag_obfs == \"1\" and (server.obfs_type and server.obfs_type ~= \"\")) then\n\t\t\t\t\t\tfinalmask.udp = {{\n\t\t\t\t\t\t\ttype = server.obfs_type,\n\t\t\t\t\t\t\tsettings = server.salamander and {\n\t\t\t\t\t\t\t\tpassword = server.salamander\n\t\t\t\t\t\t\t} or nil\n\t\t\t\t\t\t}}\n\t\t\t\t\tend\n\t\t\t\t\tlocal up = tonumber(server.uplink_capacity) or 0\n\t\t\t\t\tlocal down = tonumber(server.downlink_capacity) or 0\n\t\t\t\t\tfinalmask.quicParams = {\n\t\t\t\t\t\tcongestion = server.hy2_tcpcongestion or nil,\n\t\t\t\t\t\tbrutalUp = up > 0 and (up .. \"mbps\") or nil,\n\t\t\t\t\t\tbrutalDown = down > 0 and (down .. \"mbps\") or nil,\n\t\t\t\t\t\tudpHop = (server.flag_port_hopping == \"1\") and {\n\t\t\t\t\t\t\tports = string.gsub(server.port_range, \":\", \"-\"),\n\t\t\t\t\t\t\tinterval = (function(v)\n\t\t\t\t\t\t\t\tif not v then return 30 end\n\t\t\t\t\t\t\t\tif v:find(\"-\", 1, true) then\n\t\t\t\t\t\t\t\t\tlocal min, max = v:match(\"^(%d+)%-(%d+)$\")\n\t\t\t\t\t\t\t\t\tmin = tonumber(min)\n\t\t\t\t\t\t\t\t\tmax = tonumber(max)\n\t\t\t\t\t\t\t\t\tif min and max then\n\t\t\t\t\t\t\t\t\t\tmin = (min >= 5) and min or 5\n\t\t\t\t\t\t\t\t\t\tmax = (max >= min) and max or min\n\t\t\t\t\t\t\t\t\t\treturn min .. \"-\" .. max\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\treturn 30\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tv = tonumber((v or \"30\"):match(\"^%d+\"))\n\t\t\t\t\t\t\t\treturn (v and v >= 5) and v or 30\n\t\t\t\t\t\t\tend)(server.hopinterval)\n\t\t\t\t\t\t} or nil,\n\t\t\t\t\t\tinitStreamReceiveWindow = (server.flag_quicparam == \"1\" and server.initstreamreceivewindow) and tonumber(server.initstreamreceivewindow) or nil,\n\t\t\t\t\t\tmaxStreamReceiveWindow = (server.flag_quicparam == \"1\" and server.maxstreamreceivewindow) and tonumber(server.maxstreamreceivewindow) or nil,\n\t\t\t\t\t\tinitConnectionReceiveWindow = (server.flag_quicparam == \"1\" and server.initconnreceivewindow) and tonumber(server.initconnreceivewindow) or nil,\n\t\t\t\t\t\tmaxConnectionReceiveWindow = (server.flag_quicparam == \"1\" and server.maxconnreceivewindow) and tonumber(server.maxconnreceivewindow) or nil,\n\t\t\t\t\t\tmaxIdleTimeout = (server.flag_quicparam == \"1\" and (function(t)\n\t\t\t\t\t\t\tt = tonumber(tostring(t or \"30\"):match(\"^%d+\"))\n\t\t\t\t\t\t\treturn (t and t >= 4 and t <= 120) and t or 30\n\t\t\t\t\t\tend)(server.maxidletimeout) or 30),\n\t\t\t\t\t\tkeepAlivePeriod = (server.flag_quicparam == \"1\" and server.keepaliveperiod) and tonumber(server.keepaliveperiod) or nil,\n\t\t\t\t\t\tdisablePathMTUDiscovery = (server.flag_quicparam == \"1\" and tostring(server.disablepathmtudiscovery) == \"1\") and true or nil\n\t\t\t\t\t}\n\t\t\t\tend\n\t\t\t\tif xray_fragment.fragment == \"1\" and ({raw=1, ws=1, httpupgrade=1, grpc=1, xhttp=1})[TP] then\n\t\t\t\t\tlocal n_packets = xray_fragment.fragment_packets\n\t\t\t\t\tlocal n_length = xray_fragment.fragment_length\n\t\t\t\t\tlocal n_delay = xray_fragment.fragment_delay\n\t\t\t\t\tlocal n_maxsplit = xray_fragment.fragment_maxSplit\n\t\t\t\t\t--local domainstr = xray_noise.domainStrategy\n\t\t\t\t\tfinalmask.tcp = finalmask.tcp or {}\n\t\t\t\t\tfinalmask.tcp[#finalmask.tcp + 1] = {\n\t\t\t\t\t\ttype = \"fragment\",\n\t\t\t\t\t\tsettings = {\n\t\t\t\t\t\t\t--domainStrategy = (xray_fragment.noise == \"1\" and xray_noise.enabled == \"1\") and domainstr or nil,\n\t\t\t\t\t\t\tpackets = (n_packets and n_packets ~= \"\") and n_packets or nil,\n\t\t\t\t\t\t\tlength = (n_length and n_length ~= \"\") and n_length or nil,\n\t\t\t\t\t\t\tdelay = (type(n_delay) == \"string\" and string.find(n_delay, \"-\")) and n_delay or (n_delay and tonumber(n_delay)),\n\t\t\t\t\t\t\tmaxSplit = (n_maxsplit and n_maxsplit ~= \"\") and n_maxsplit or nil\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\tend\n\t\t\t\tif xray_fragment.noise == \"1\" and (TP == \"kcp\" or (TP == \"xhttp\" and (server.tls_alpn == \"h3\" or server.tls_alpn == \"h3,h2\"))) then \n\t\t\t\t\tif xray_noise.enabled == \"1\" then\n\t\t\t\t\t\tlocal n_type = xray_noise.type\n\t\t\t\t\t\tlocal n_delay = xray_noise.delay\n\t\t\t\t\t\tlocal n_packet = xray_noise.packet\n\t\t\t\t\t\tfinalmask.udp = finalmask.udp or {}\n\t\t\t\t\t\tfinalmask.udp[#finalmask.udp + 1] = {\n\t\t\t\t\t\t\ttype = \"noise\",\n\t\t\t\t\t\t\tsettings = {\n\t\t\t\t\t\t\t\treset = 0,\n\t\t\t\t\t\t\t\tnoise = {\n\t\t\t\t\t\t\t\t\t{\n\t\t\t\t\t\t\t\t\t\trand = (n_type == \"rand\") and (n_packet and (type(n_packet) == \"string\" and (n_packet:find(\"-\")) and n_packet or tonumber(n_packet))) or nil,\n\t\t\t\t\t\t\t\t\t\ttype = (type(n_type) == \"string\" and n_type ~= \"rand\") and n_type or nil,\n\t\t\t\t\t\t\t\t\t\tpacket = (n_type ~= \"rand\") and ((n_packet and type(n_packet) == \"string\") and ((n_type == \"hex\" and hexEncode(n_packet)) or (n_type == \"base64\" and base64Encode(n_packet))) or n_packet) or nil,\n\t\t\t\t\t\t\t\t\t\tdelay = (type(n_delay) == \"string\" and string.find(n_delay, \"-\")) and n_delay or (n_delay and tonumber(n_delay))\n\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t}\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif server.finalmask and server.finalmask ~= \"\" then\n\t\t\t\t\tlocal ok, fm = pcall(json.parse, base64Decode(server.finalmask))\n\t\t\t\t\tif ok and type(fm) == \"table\" then\n\t\t\t\t\t\tfinalmask = fm\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\treturn cleanEmptyTables(finalmask)\n\t\t\tend)(),\n\t\t\tsockopt = {\n\t\t\t\tmark = 255,\n\t\t\t\tdomainStrategy = server.domain_strategy or \"UseIP\",\n\t\t\t\ttcpFastOpen = (function()\n\t\t\t\t\tif server.transport == \"xhttp\" then\n\t\t\t\t\t\treturn (server.fast_open == \"1\") and true or false\n\t\t\t\t\telseif server.v2ray_protocol == \"hysteria2\" then\n\t\t\t\t\t\treturn (server.fast_open == \"1\") and true or nil\n\t\t\t\t\telse\n\t\t\t\t\t\treturn nil\n\t\t\t\t\tend\n\t\t\t\tend)(), -- XHTTP Tcp Fast Open\n\t\t\t\ttcpMptcp = (server.mptcp == \"1\") and true or nil, -- MPTCP\n\t\t\t\tPenetrate = (server.mptcp == \"1\") and true or nil, -- Penetrate MPTCP\n\t\t\t\ttcpcongestion = server.custom_tcpcongestion, -- 连接服务器节点的 TCP 拥塞控制算法\n\t\t\t\t-- 出站的 dialerProxy（与 fragment 中的 tag 保持一致）\n\t\t\t\tdialerProxy = (xray_fragment.fragment == \"1\" or xray_fragment.noise == \"1\") and\n\t\t\t\t              ((remarks ~= nil and remarks ~= \"\") and (node_id .. \".\" .. remarks) or node_id) or nil\n\t\t\t}\n\t\t} or nil,\n\t\tmux = (server.v2ray_protocol ~= \"hysteria2\" and server.v2ray_protocol ~= \"wireguard\") and {\n\t\t\t-- mux\n\t\t\tenabled = (server.mux == \"1\"), -- Mux\n\t\t\tconcurrency = (server.mux == \"1\" and (tonumber(server.concurrency) or -1)) or nil, -- TCP 最大并发连接数\n\t\t\txudpConcurrency = (server.mux == \"1\" and (tonumber(server.xudpConcurrency) or 16)) or nil, -- UDP 最大并发连接数\n\t\t\txudpProxyUDP443 = (server.mux == \"1\" and (server.xudpProxyUDP443 or \"reject\")) or nil -- 对被代理的 UDP/443 流量处理方式\n\t\t} or nil\n\t}\n}\n\ntable.insert(Xray.outbounds, {\n\tprotocol = \"freedom\",\n\ttag = \"direct\",\n\tsettings = {\n\t\tdomainStrategy = server.domain_strategy or \"UseIP\"   -- 可根据需要改为 direct_dns_query_strategy\n\t},\n    streamSettings = {\n\t\tsockopt = {\n\t\t\tmark = 255\n\t\t}\n\t}\n})\n\n-- 添加带有 fragment 设置的 dialerproxy 配置\nif xray_fragment.fragment ~= \"0\" or (xray_fragment.noise ~= \"0\" and xray_noise.enabled ~= \"0\") then\n\tlocal n_domainstrategy = xray_noise.domainStrategy\n\ttable.insert(Xray.outbounds, {\n\t\tprotocol = \"freedom\",\n\t\ttag = (remarks ~= nil and remarks ~= \"\") and (node_id .. \".\" .. remarks) or node_id,\n\t\tsettings = (xray_fragment.noise == \"1\" and xray_noise.enabled == \"1\") and n_domainstrategy and n_domainstrategy ~= \"\" and {\n\t\t\tdomainStrategy = n_domainstrategy\n\t\t} or nil,\n\t\tstreamSettings = {\n\t\t\tsockopt = {\n\t\t\tmark = 255,\n\t\t\ttcpFastOpen = (function()\n\t\t\t\tif server.transport == \"xhttp\" then\n\t\t\t\t\treturn (server.fast_open == \"1\") and true or false\n\t\t\t\telseif server.v2ray_protocol == \"hysteria2\" then\n\t\t\t\t\treturn (server.fast_open == \"1\") and true or nil\n\t\t\t\telse\n\t\t\t\t\treturn nil\n\t\t\t\tend\n\t\t\tend)(), -- XHTTP Tcp Fast Open\n\t\t\ttcpMptcp = (server.mptcp == \"1\") and true or nil, -- MPTCP\n\t\t\tPenetrate = (server.mptcp == \"1\") and true or nil, -- Penetrate MPTCP\n\t\t\ttcpcongestion = server.custom_tcpcongestion -- 连接服务器节点的 TCP 拥塞控制算法\n\t\t\t}\n\t\t}\n\t})\nend\n\n-- Xray DNS 解析配置\nif datatypes.hostname(server.server) and server.domain_resolver and (server.domain_resolver_dns or server.domain_resolver_dns_https) then\n\t-- 解析 DNS 服务器配置\n\tlocal dns_proto = server.domain_resolver\n\tlocal config_address\n\tlocal config_port\n\tif dns_proto == \"https\" then\n\t\tlocal _a = parseURL(server.domain_resolver_dns_https)\n\t\tif _a then\n\t\t\tconfig_address = server.domain_resolver_dns_https\n\t\t\tconfig_port = _a.port or 443\n\t\t\tif _a.hostname and datatypes.hostname(_a.hostname) then\n\t\t\t\tGLOBAL.DNS_HOSTNAME[_a.hostname] = true\n\t\t\tend\n\t\tend\n\telse\n\t\tlocal server_address = server.domain_resolver_dns\n\t\tconfig_port = 53\n\t\tlocal parts = split(server_address, \":\")\n\t\tif #parts > 1 then\n\t\t\tserver_address = parts[1]\n\t\t\tconfig_port = tonumber(parts[#parts])\n\t\tend\n\t\tconfig_address = server_address\n\t\tif dns_proto == \"tcp\" then\n\t\t\tconfig_address = dns_proto .. \"://\" .. server_address .. \":\" .. config_port\n\t\tend\n\tend\n\n\t-- 存入 GLOBAL.DNS_SERVER（去重）\n\tlocal dns_key = dns_proto .. \"|\" .. config_address .. \"|\" .. tostring(config_port)\n\tif not GLOBAL.DNS_SERVER[dns_key] then\n\t\tGLOBAL.DNS_SERVER[dns_key] = {\n\t\t\ttag = \"dns-node-\" .. node_id,\n\t\t\taddress = config_address,\n\t\t\tport = config_port,\n\t\t\tfinalQuery = true,\n\t\t\tdisableCache = false,\n\t\t\tserveStale = true,\n\t\t\tserveExpiredTTL = 30,\n\t\t\tdomains = {}\n\t\t}\n\tend\n\n\t-- 添加当前节点域名到该 DNS 服务器的 domains 列表\n\tlocal domain = \"full:\" .. server.server\n\tlocal exists\n\tfor _, d in ipairs(GLOBAL.DNS_SERVER[dns_key].domains) do\n\t\tif d == domain then exists = true; break end\n\tend\n\tif not exists then\n\t\ttable.insert(GLOBAL.DNS_SERVER[dns_key].domains, domain)\n\tend\n\tGLOBAL.VPS_EXCLUDE[server.server] = true\n\n\t-- 构建 Xray.dns\n\tlocal dns_servers = { \"localhost\" }\n\tfor key, dns_server in pairs(GLOBAL.DNS_SERVER) do\n\t\ttable.insert(dns_servers, {\n\t\t\ttag = dns_server.tag,\n\t\t\taddress = dns_server.address,\n\t\t\tport = dns_server.port,\n\t\t\tdomains = dns_server.domains,\n\t\t\tfinalQuery = dns_server.finalQuery,\n\t\t\tserveStale = dns_server.serveStale,\n\t\t\tserveExpiredTTL = dns_server.serveExpiredTTL,\n\t\t\tdisableCache = dns_server.disableCache\n\t\t})\n\tend\n\tXray.dns = {\n\t\tservers = dns_servers,\n\t\tdisableFallback = true,\n\t\tdisableFallbackIfMatch = true,\n\t\tuseSystemHosts = true,\n\t\tqueryStrategy = \"UseIP\",\n\t\tdisableCache = false,\n\t\ttag = \"dns-global\"   -- 用于 routing\n\t}\nend\n\n-- 代理出站的 tag（与 outbound 中的 tag 保持一致）\nlocal proxy_tag = (remarks ~= nil and remarks ~= \"\") and (node_id .. \":\" .. remarks) or node_id\n-- 构建 routing 规则表\nlocal routing_rules = {}\n-- 1. 为每个自定义 DNS 服务器添加直连规则（inboundTag 匹配 dns-node-xxx）\nif GLOBAL.DNS_SERVER and next(GLOBAL.DNS_SERVER) then\n\tfor _, dns_server in pairs(GLOBAL.DNS_SERVER) do\n\t\ttable.insert(routing_rules, {\n\t\t\tinboundTag = { dns_server.tag },\n\t\t\toutboundTag = \"direct\"\n\t\t})\n\tend\nend\n\n-- 2. 添加全局 DNS 直连规则（需要 Xray.dns 中已设置 tag = \"dns-global\"）\nif Xray.dns and Xray.dns.tag then\n\ttable.insert(routing_rules, {\n\t\tinboundTag = { \"dns-global\" },\n\t\toutboundTag = \"direct\"\n\t})\nend\n\n-- 3. 添加默认规则：所有 TCP/UDP 流量走代理\ntable.insert(routing_rules, {\n\tnetwork = \"tcp,udp\",\n\truleTag = \"default\",\n\toutboundTag = proxy_tag\n})\n\n-- 构建 routing 对象\nXray.routing = {\n\trules = routing_rules,\n\tdomainStrategy = \"AsIs\"\n}\n\nlocal cipher = \"ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES128-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA\"\nlocal cipher13 = \"TLS_AES_128_GCM_SHA256:TLS_CHACHA20_POLY1305_SHA256:TLS_AES_256_GCM_SHA384\"\nlocal trojan = {\n\tlog_level = 3,\n\trun_type = (proto == \"nat\" or proto == \"tcp\") and \"nat\" or \"client\",\n\tlocal_addr = \"0.0.0.0\",\n\tlocal_port = tonumber(local_port),\n\tremote_addr = server.server,\n\tremote_port = tonumber(server.server_port),\n\tudp_timeout = 60,\n\t-- 传入连接\n\tpassword = {server.password},\n\t-- 传出连接\n\tssl = {\n\t\tverify = (server.insecure == \"0\") and true or false,\n\t\tverify_hostname = (server.tls == \"1\") and true or false,\n\t\tcert = (server.certificate) and server.certpath or nil,\n\t\tcipher = cipher,\n\t\tcipher_tls13 = cipher13,\n\t\tsni = server.tls_host,\n\t\talpn = (server.tls == \"1\") and (function()\n\t\t\tlocal alpn = {}\n\t\t\tif server.tls_alpn and server.tls_alpn ~= \"\" then\n\t\t\t\tstring.gsub(server.tls_alpn, '[^,]+', function(w)\n\t\t\t\t\ttable.insert(alpn, w)\n\t\t\t\tend)\n\t\t\tend\n\t\t\tif #alpn > 0 then\n\t\t\t\treturn alpn\n\t\t\telse\n\t\t\t\treturn nil\n\t\t\tend\n\t\tend)() or {\"h2\", \"http/1.1\"},\n\t\tcurve = \"\",\n\t\treuse_session = true,\n\t\tsession_ticket = (server.tls_sessionTicket == \"1\") and true or false\n\t},\n\ttcp = {\n\t\t-- tcp\n\t\tno_delay = true,\n\t\tkeep_alive = true,\n\t\treuse_port = true,\n\t\tfast_open = (server.fast_open == \"1\") and true or false,\n\t\tfast_open_qlen = 20\n\t}\n}\nlocal naiveproxy = {\n\tproxy = (server.username and server.password and server.server and server.server_port) and \"https://\" .. server.username .. \":\" .. server.password .. \"@\" .. server.server .. \":\" .. server.server_port,\n\tlisten = (proto == \"redir\") and \"redir\" .. \"://0.0.0.0:\" .. tonumber(local_port) or \"socks\" .. \"://0.0.0.0:\" .. tonumber(local_port),\n\t[\"insecure-concurrency\"] = tonumber(server.concurrency) or 1\n}\nlocal ss = {\n\tserver = (server.kcp_enable == \"1\") and \"127.0.0.1\" or server.server,\n\tserver_port = tonumber(server.server_port),\n\tlocal_address = \"0.0.0.0\",\n\tlocal_port = tonumber(local_port),\n\tmode = (proto == \"tcp,udp\") and \"tcp_and_udp\" or (proto .. \"_only\"),\n\tpassword = server.password,\n\tmethod = server.encrypt_method_ss,\n\ttimeout = tonumber(server.timeout),\n\tfast_open = (server.fast_open == \"1\") and true or false,\n\treuse_port = true\n}\nlocal hysteria2 = {\n\tserver = (\n\t\tserver.server_port and \n\t\t(\n\t\t\tserver.port_range and \n\t\t\t(server.server .. \":\" .. server.server_port .. \",\" .. string.gsub(server.port_range, \":\", \"-\")) \n\t\t\tor \n\t\t\t(server.server .. \":\" .. server.server_port)\n\t\t) \n\t\tor \n\t\t(\n\t\t\tserver.port_range and \n\t\t\tserver.server .. \":\" .. string.gsub(server.port_range, \":\", \"-\") \n\t\t\tor \n\t\t\tserver.server and server.server .. \":443\"\n\t\t)\n\t),\n\tbandwidth = (server.uplink_capacity or server.downlink_capacity) and {\n\t\tup = tonumber(server.uplink_capacity) and tonumber(server.uplink_capacity) .. \" mbps\" or nil,\n\t\tdown = tonumber(server.downlink_capacity) and tonumber(server.downlink_capacity) .. \" mbps\" or nil\n\t} or nil,\n\tsocks5 = (proto:find(\"tcp\") and tonumber(socks_port) and tonumber(socks_port) ~= 0) and {\n\t\tlisten = \"0.0.0.0:\" .. tonumber(socks_port),\n\t\tdisableUDP = false\n\t} or nil,\n\ttransport = {\n\t\ttype = server.transport_protocol or \"udp\",\n\t\tudp = server.port_range and (function()\n\t\t\tlocal udp = {}\n\t\t\tlocal t = server.hopinterval\n\t\t\tif not t then return nil end\n\t\t\tif t:find(\"-\", 1, true) then\n\t\t\t\tlocal min, max = t:match(\"^(%d+)%-(%d+)$\")\n\t\t\t\tmin = tonumber(min)\n\t\t\t\tmax = tonumber(max)\n\t\t\t\tif min and max then\n\t\t\t\t\tmin = (min >= 5) and min or 5\n\t\t\t\t\tmax = (max >= min) and max or min\n\t\t\t\t\tudp.minHopInterval = min .. \"s\"\n\t\t\t\t\tudp.maxHopInterval = max .. \"s\"\n\t\t\t\t\treturn udp\n\t\t\t\tend\n\t\t\tend\n\t\t\tt = tonumber((t or \"30\"):match(\"^%d+\"))\n\t\t\tt = (t and t >= 5) and t or 30\n\t\t\tudp.hopInterval = t .. \"s\"\n\t\t\treturn udp\n\t\tend)() or nil\n\t},\n--[[\n\ttcpTProxy = (proto:find(\"tcp\") and local_port ~= \"0\") and {\n\t\tlisten = \"0.0.0.0:\" .. tonumber(local_port)\n\t} or nil,\n]]--\n\ttcpRedirect = (proto:find(\"tcp\") and local_port ~= \"0\") and {\n\t\tlisten = \"0.0.0.0:\" .. tonumber(local_port)\n\t} or nil,\n\tudpTProxy = (proto:find(\"udp\") and local_port ~= \"0\") and {\n\t\tlisten = \"0.0.0.0:\" .. tonumber(local_port)\n\t} or nil,\n\tobfs = (server.flag_obfs == \"1\") and {\n\t\ttype = server.obfs_type,\n\t\tsalamander = { password = server.salamander }\n\t} or nil,\n\tquic = (server.flag_quicparam == \"1\" ) and {\n\t\tinitStreamReceiveWindow = (server.initstreamreceivewindow and server.initstreamreceivewindow or nil),\n\t\tmaxStreamReceiveWindow = (server.maxstreamreceivewindow and server.maxstreamreceivewindow or nil),\n\t\tinitConnReceiveWindow = (server.initconnreceivewindow and server.initconnreceivewindow or nil),\n\t\tmaxConnReceiveWindow = (server.maxconnreceivewindow and server.maxconnreceivewindow or nil),\n\t\tmaxIdleTimeout = (tonumber(server.maxidletimeout) and tonumber(server.maxidletimeout) .. \"s\" or nil),\n\t\tkeepAlivePeriod = (tonumber(server.keepaliveperiod) and tonumber(server.keepaliveperiod) .. \"s\" or nil),\n\t\tdisablePathMTUDiscovery = (server.disablepathmtudiscovery == \"1\") and true or false\n\t} or nil,\n\tauth = server.hy2_auth,\n\ttls = (server.tls_host and server.tls_host ~= \"\") and {\n\t\tsni = server.tls_host,\n\t\talpn = (server.tls_alpn and server.tls_alpn ~= \"\") and (function()\n\t\t\tlocal alpn = {}\n\t\t\tstring.gsub(server.tls_alpn, '[^,]+', function(w)\n\t\t\t\ttable.insert(alpn, w)\n\t\t\tend)\n\t\t\tif #alpn > 0 then\n\t\t\t\treturn alpn\n\t\t\telse\n\t\t\t\treturn nil\n\t\t\tend\n\t\tend)() or nil,\n\t\t--sni = server.tls_host or (server.tls_host and server.tls_alpn) or nil,\n\t\tinsecure = (server.insecure == \"1\") and true or false,\n\t\tpinSHA256 = server.pinsha256 or nil\n\t} or {\n\t\tsni = server.server,\n\t\talpn = (server.type == \"hysteria2\") and (function()\n\t\t\tlocal alpn = {}\n\t\t\tif server.tls_alpn and server.tls_alpn ~= \"\" then\n\t\t\t\tstring.gsub(server.tls_alpn, '[^,]+', function(w)\n\t\t\t\t\ttable.insert(alpn, w)\n\t\t\t\tend)\n\t\t\tend\n\t\t\tif #alpn > 0 then\n\t\t\t\treturn alpn\n\t\t\telse\n\t\t\t\treturn nil\n\t\t\tend\n\t\tend)() or nil,\n\t\tinsecure = (server.insecure == \"1\") and true or false,\n\t\tpinSHA256 = server.pinsha256 or nil\n\t},\n\tfast_open = (server.fast_open == \"1\") and true or false,\n\tlazy = (server.lazy_mode == \"1\") and true or false\n}\nlocal shadowtls = {\n\tclient = {\n\t\tserver_addr = server.server_port and server.server .. \":\" .. server.server_port or nil,\n\t\tlisten = \"127.0.0.1:\" .. tonumber(local_port),\n\t\ttls_names = server.shadowtls_sni,\n\t\tpassword = server.password\n\t},\n\tv3 = (server.shadowtls_protocol == \"v3\") and true or false,\n\tdisable_nodelay = (server.disable_nodelay == \"1\") and true or false,\n\tfastopen = (server.fastopen == \"1\") and true or false,\n\tstrict = (server.strict == \"1\") and true or false\n}\nlocal chain_sslocal = {\n\tlocals = local_port ~= \"0\" and {\n\t\t{\n\t\t\tlocal_address = \"0.0.0.0\",\n\t\t\tlocal_port = (chain_local_port == \"0\" and tonumber(server.local_port) or tonumber(chain_local_port)),\n\t\t\tmode = (proto:find(\"tcp,udp\") and \"tcp_and_udp\") or proto .. \"_only\",\n\t\t\tprotocol = \"redir\",\n\t\t\ttcp_redir = \"redirect\",\n\t\t\t--tcp_redir = \"tproxy\",\n\t\t\tudp_redir = \"tproxy\"\n\t\t},\n\t\tsocks_port ~= \"0\" and {\n\t\t\tprotocol = \"socks\",\n\t\t\tlocal_address = \"0.0.0.0\",\n\t\t\tlocal_port = tonumber(socks_port)\n\t\t} or nil\n\t} or {{\n\t\tprotocol = \"socks\",\n\t\tlocal_address = \"0.0.0.0\",\n\t\tlocal_port = tonumber(socks_port)\n\t}},\n\tservers = {\n\t\t{\n\t\t\tserver = \"127.0.0.1\",\n\t\t\tserver_port = (tonumber(local_port) == 0 and tonumber(chain_local_port) or tonumber(local_port)),\n\t\t\tmethod = server.sslocal_method,\n\t\t\tpassword = server.sslocal_password\n\t\t}\n\t}\n}\nlocal chain_vmess = {\n\tinbounds = (local_port ~= \"0\") and {\n\t\t{\n\t\t\tport = (chain_local_port == \"0\" and tonumber(server.local_port) or tonumber(chain_local_port)),\n\t\t\tprotocol = \"dokodemo-door\",\n\t\t\tsettings = {\n\t\t\t\tnetwork = proto,\n\t\t\t\tfollowRedirect = true\n\t\t\t},\n\t\t\tstreamSettings = {\n\t\t\t\tsockopt = {tproxy = \"redirect\"}\n\t\t\t},\n\t\t\tsniffing = {\n\t\t\t\tenable = true,\n\t\t\t\tdestOverride = {\"http\",\"tls\"}\n\t\t\t}\n\t\t},\n\t\t(proto:find(\"tcp\") and socks_port ~= \"0\") and {\n\t\t\tprotocol = \"socks\",\n\t\t\tport = tonumber(socks_port)\n\t\t} or nil\n\t} or { protocol = \"socks\", port = tonumber(socks_port) },\n\toutbound = {\n\t\tprotocol = \"vmess\",\n\t\tsettings = {\n\t\t\tvnext = {{\n\t\t\t\taddress = \"127.0.0.1\",\n\t\t\t\tport = (tonumber(local_port) == 0 and tonumber(chain_local_port) or tonumber(local_port)),\n\t\t\t\tusers = {{\n\t\t\t\t\tid = (server.vmess_uuid),\n\t\t\t\t\tsecurity = server.vmess_method,\n\t\t\t\t\tlevel = 0\n\t\t\t\t}}\n\t\t\t}}\n\t\t}\n\t}\n}\nlocal tuic = {\n\trelay = {\n\t\tserver = server.server_port and server.server .. \":\" .. server.server_port,\n\t\tip = server.tuic_ip,\n\t\tuuid = server.tuic_uuid,\n\t\tpassword = server.tuic_passwd,\n\t\tcertificates = server.certificate and { server.certpath } or nil,\n\t\tudp_relay_mode = server.udp_relay_mode,\n\t\tcongestion_control = server.congestion_control,\n\t\theartbeat = server.heartbeat and tonumber(server.heartbeat) .. \"s\" or nil,\n\t\ttimeout = server.timeout and tonumber(server.timeout) .. \"s\" or nil,\n\t\tgc_interval = server.gc_interval and tonumber(server.gc_interval) .. \"s\" or nil,\n\t\tgc_lifetime = server.gc_lifetime and tonumber(server.gc_lifetime) .. \"s\" or nil,\n\t\talpn = (server.tuic_alpn and server.tuic_alpn ~= \"\") and (function()\n\t\t\tlocal alpn = {}\n\t\t\tstring.gsub(server.tuic_alpn, '[^,]+', function(w)\n\t\t\t\ttable.insert(alpn, w)\n\t\t\tend)\n\t\t\tif #alpn > 0 then\n\t\t\t\treturn alpn\n\t\t\telse\n\t\t\t\treturn nil\n\t\t\tend\n\t\tend)() or nil,\n\t\tipstack_prefer = (server.tuic_dual_stack == \"1\") and server.ipstack_prefer or nil,\n\t\tskip_cert_verify = (server.insecure == \"1\" or server.insecure == true or server.insecure == \"true\"),\n\t\tdisable_sni = (server.disable_sni == \"1\") and true or false,\n\t\tzero_rtt_handshake = (server.zero_rtt_handshake == \"1\") and true or false,\n\t\tsend_window = tonumber(server.send_window),\n\t\treceive_window = tonumber(server.receive_window)\n\t},\n\t[\"local\"] = {\n\t\tserver = tonumber(socks_port) and \"[::]:\" .. (socks_port == \"0\" and local_port or tonumber(socks_port)),\n\t\tdual_stack = (server.tuic_dual_stack == \"1\") and true or nil,\n\t\tmax_packet_size = tonumber(server.tuic_max_package_size)\n\t}\n}\n\nlocal config = {}\nfunction config:new(o)\n\to = o or {}\n\tsetmetatable(o, self)\n\tself.__index = self\n\treturn o\nend\nfunction config:handleIndex(index)\n\tlocal switch = {\n\t\tss = function()\n\t\t\tss.protocol = socks_port\n\t\t\tif server.enable_plugin == \"1\" and server.plugin and server.plugin ~= \"none\" then\n\t\t\t\tif server.plugin == \"custom\" then\n\t\t\t\t\tss.plugin = server.custom_plugin\n\t\t\t\telse\n\t\t\t\t\tss.plugin = server.plugin\n\t\t\t\tend\n\t\t\t\tss.plugin_opts = server.plugin_opts or nil\n\t\t\tend\n\t\t\tprint(json.stringify(ss, 1))\n\t\tend,\n\t\tssr = function()\n\t\t\tss.protocol = server.protocol\n\t\t\tss.protocol_param = server.protocol_param\n\t\t\tss.method = server.encrypt_method\n\t\t\tss.obfs = server.obfs\n\t\t\tss.obfs_param = server.obfs_param\n\t\t\tprint(json.stringify(ss, 1))\n\t\tend,\n\t\tv2ray = function()\n\t\t\tprint(json.stringify(Xray, 1))\n\t\tend,\n\t\ttrojan = function()\n\t\t\tprint(json.stringify(trojan, 1))\n\t\tend,\n\t\tnaiveproxy = function()\n\t\t\tprint(json.stringify(naiveproxy, 1))\n\t\tend,\n\t\thysteria2 = function()\n\t\t\tprint(json.stringify(hysteria2, 1))\n\t\tend,\n\t\tshadowtls = function()\n\t\t\tlocal chain_switch = {\n\t\t\t\tsslocal = function()\n\t\t\t\t\tif (chain:find(\"chain\")) then\n\t\t\t\t\t\tprint(json.stringify(chain_sslocal, 1))\n\t\t\t\t\telse\n\t\t\t\t\t\tprint(json.stringify(shadowtls, 1))\n\t\t\t\t\tend\n\t\t\t\tend,\n\t\t\t\tvmess = function()\n\t\t\t\t\tif (chain:find(\"chain\")) then\n\t\t\t\t\t\tprint(json.stringify(chain_vmess, 1))\n\t\t\t\t\telse\n\t\t\t\t\t\tprint(json.stringify(shadowtls, 1))\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t}\n\t\t\tlocal ChainType = server.chain_type\n\t\t\tif chain_switch[ChainType] then\n\t\t\t\tchain_switch[ChainType]()\n\t\t\tend\n\t\tend,\n\t\ttuic = function()\n\t\t\tprint(json.stringify(tuic, 1))\n\t\tend\n\t}\n\tif switch[index] then\n\t\tswitch[index]()\n\tend\nend\nlocal f = config:new()\nf:handleIndex(server.type)\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/usr/share/shadowsocksr/genred2config.sh",
    "content": "#!/bin/sh\nargv1=$1\nargv2=$2\nargv3=$3\nargv4=$4\nargv5=$5\nargv6=$6\nargv7=$7\nargv8=$8\nargv9=$9\ncat <<-EOF >$argv1\n\tbase {\n\tlog_debug = off;\n\tlog_info = off;\n\tlog = stderr;\n\tdaemon = on;\n\tredirector = iptables;\n\treuseport = on;\n\t}\nEOF\ntcp() {\n\tif [ \"$argv7\" == \"0\" ]; then\n\t\tcat <<-EOF >>$argv1\n\t\t\tredsocks {\n\t\t\tbind = \"0.0.0.0:$argv4\";\n\t\t\trelay = \"$argv5:$argv6\";\n\t\t\ttype = socks5;\n\t\t\tautoproxy = 0;\n\t\t\ttimeout = 10;\n\t\t\t}\n\t\tEOF\n\telse\n\t\tcat <<-EOF >>$argv1\n\t\t\tredsocks {\n\t\t\tbind = \"0.0.0.0:$argv4\";\n\t\t\trelay = \"$argv5:$argv6\";\n\t\t\ttype = socks5;\n\t\t\tautoproxy = 0;\n\t\t\ttimeout = 10;\n\t\t\tlogin = \"$argv8\";\n\t\t\tpassword = \"$argv9\";\n\t\t\t}\n\t\tEOF\n\tfi\n}\nudp() {\n\tif [ \"$argv7\" == \"0\" ]; then\n\t\tcat <<-EOF >>$argv1\n\t\t\tredudp {\n\t\t\tbind = \"0.0.0.0:$argv4\";\n\t\t\trelay = \"$argv5:$argv6\";\n\t\t\ttype = socks5;\n\t\t\tudp_timeout = 10;\n\t\t\t}\n\t\tEOF\n\telse\n\t\tcat <<-EOF >>$argv1\n\t\t\tredudp {\n\t\t\tbind = \"0.0.0.0:$argv4\";\n\t\t\trelay = \"$argv5:$argv6\";\n\t\t\ttype = socks5;\n\t\t\tudp_timeout = 10;\n\t\t\tlogin = \"$argv8\";\n\t\t\tpassword = \"$argv9\";\n\t\t\t}\n\t\tEOF\n\tfi\n}\ncase \"$argv2\" in\nsocks5)\n\tcase \"$argv3\" in\n\ttcp)\n\t\ttcp\n\t\t;;\n\tudp)\n\t\tudp\n\t\t;;\n\t*)\n\t\ttcp\n\t\tudp\n\t\t;;\n\tesac\n\t;;\n*)\n\tcat <<-EOF >>$argv1\n\t\tredsocks {\n\t\tbind = \"0.0.0.0:$argv4\";\n\t\ttype = direct;\n\t\tinterface = $argv3;\n\t\tautoproxy = 0;\n\t\ttimeout = 10;\n\t\t}\n\tEOF\n\t;;\nesac\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/usr/share/shadowsocksr/gfw2ipset.sh",
    "content": "#!/bin/sh\n\n. $IPKG_INSTROOT/etc/init.d/shadowsocksr\n\ncheck_run_environment\n\ncase \"$USE_TABLES\" in\n\tnftables)\n\t\tnft_support=1\n\t\techolog \"gfw2ipset: Using nftables\"\n\t\t;;\n\tiptables)\n\t\tnft_support=0\n\t\techolog \"gfw2ipset: Using iptables\"\n\t\t;;\n\t*)\n\t\techolog \"ERROR: No supported firewall backend detected\"\n\t\texit 1\n\t\t;;\nesac\n\nnetflix() {\n\tlocal port=\"$1\"\n\tif [ -f \"$TMP_DNSMASQ_PATH/gfw_list.conf\" ] && [ -s /etc/ssrplus/netflix.list ]; then\n\t\tgrep -vE '^\\s*#|^\\s*$' /etc/ssrplus/netflix.list > /tmp/ssrplus_netflix.list.clean\n\t\tif [ -s /tmp/ssrplus_netflix.list.clean ]; then\n\t\t\tgrep -v -F -f /tmp/ssrplus_netflix.list.clean \"$TMP_DNSMASQ_PATH/gfw_list.conf\" > \"$TMP_DNSMASQ_PATH/gfw_list.conf.tmp\"\n\t\t\tmv \"$TMP_DNSMASQ_PATH/gfw_list.conf.tmp\" \"$TMP_DNSMASQ_PATH/gfw_list.conf\"\n\t\t\tif [ -f \"$TMP_DNSMASQ_PATH/gfw_base.conf\" ]; then\n\t\t\t\tgrep -v -F -f /tmp/ssrplus_netflix.list.clean \"$TMP_DNSMASQ_PATH/gfw_base.conf\" > \"$TMP_DNSMASQ_PATH/gfw_base.conf.tmp\"\n\t\t\t\tmv \"$TMP_DNSMASQ_PATH/gfw_base.conf.tmp\" \"$TMP_DNSMASQ_PATH/gfw_base.conf\"\n\t\t\tfi\n\t\tfi\n\t\trm -f /tmp/ssrplus_netflix.list.clean\n\tfi\n\tif [ \"$nft_support\" = \"1\" ]; then\n\t\t# 移除 ipset\n\t\tcat /etc/ssrplus/netflix.list | sed '/^$/d' | sed '/#/d' | sed \"/.*/s/.*/server=\\/&\\/127.0.0.1#$port\\nnftset=\\/&\\/inet#ss_spec#netflix/\" >$TMP_DNSMASQ_PATH/netflix_forward.conf\n\telif [ \"$nft_support\" = \"0\" ]; then\n\t\tcat /etc/ssrplus/netflix.list | sed '/^$/d' | sed '/#/d' | sed \"/.*/s/.*/server=\\/&\\/127.0.0.1#$port\\nipset=\\/&\\/netflix/\" >$TMP_DNSMASQ_PATH/netflix_forward.conf\n\tfi\n}\nmkdir -p $TMP_DNSMASQ_PATH\n\nrun_mode=$(uci_get_by_type global run_mode router)\n\nif [ \"$run_mode\" = \"oversea\" ]; then\n\tcp -rf /etc/ssrplus/oversea_list.conf $TMP_DNSMASQ_PATH/\nelse\n\tcp -rf /etc/ssrplus/gfw_list.conf $TMP_DNSMASQ_PATH/\n\tcp -rf /etc/ssrplus/gfw_base.conf $TMP_DNSMASQ_PATH/\nfi\n\nfor conf_file in gfw_base.conf gfw_list.conf; do\n\tconf=\"$TMP_DNSMASQ_PATH/$conf_file\"\n\t[ -f \"$conf\" ] || continue\n\n\tif [ \"$run_mode\" = \"gfw\" ]; then\n\t\tif [ \"$nft_support\" = \"1\" ]; then\n\t\t\t# gfw + nft：ipset → nftset\n\t\t\tsed -i 's|ipset=/\\([^/]*\\)/\\([^[:space:]]*\\)|nftset=/\\1/inet#ss_spec#\\2|g' \"$conf\"\n\t\tfi\n\telse\n\t\t# 非 gfw：无条件清理所有分流引用\n\t\t# sed -i '/^[[:space:]]*\\(ipset=\\|nftset=\\)/d' \"$conf\"\n\t\tsed -i '/^[[:space:]]*ipset=/d' \"$conf\"\n\tfi\ndone\n\nif [ \"$(uci_get_by_type global netflix_enable 0)\" == \"1\" ]; then\n\t# 只有开启 NetFlix分流 才需要取值\n\tSHUNT_SERVER=$(uci_get_by_type global netflix_server nil)\nelse\n\t# 没有开启 设置为 nil\n\tSHUNT_SERVER=nil\nfi\ncase \"$SHUNT_SERVER\" in\nnil)\n\trm -f $TMP_DNSMASQ_PATH/netflix_forward.conf\n\t;;\n$(uci_get_by_type global global_server nil) | $switch_server | same)\n\tnetflix $dns_port\n\t;;\n*)\n\tnetflix $tmp_shunt_dns_port\n\t;;\nesac\n\n# 此处使用 for 方式读取 防止 /etc/ssrplus/ 目录下的 black.list white.list deny.list 等2个或多个文件一行中存在空格 比如:# abc.com 而丢失：server\n# Optimize: Batch filter using grep\nfor list_file in /etc/ssrplus/black.list /etc/ssrplus/white.list /etc/ssrplus/deny.list; do\n\tif [ -s \"$list_file\" ]; then\n\t\tgrep -vE '^\\s*#|^\\s*$' \"$list_file\" > \"${list_file}.clean\"\n\t\tif [ -s \"${list_file}.clean\" ]; then\n\t\t\tfor target_file in \"$TMP_DNSMASQ_PATH/gfw_list.conf\" \"$TMP_DNSMASQ_PATH/gfw_base.conf\"; do\n\t\t\t\tif [ -f \"$target_file\" ]; then\n\t\t\t\t\tgrep -v -F -f \"${list_file}.clean\" \"$target_file\" > \"${target_file}.tmp\"\n\t\t\t\t\tmv \"${target_file}.tmp\" \"$target_file\"\n\t\t\t\tfi\n\t\t\tdone\n\t\tfi\n\t\trm -f \"${list_file}.clean\"\n\tfi\ndone\n\n# 此处直接使用 cat 因为有 sed '/#/d' 删除了 数据\nif [ \"$nft_support\" = \"1\" ]; then\n\tcat /etc/ssrplus/black.list | sed '/^$/d' | sed '/#/d' | sed \"/.*/s/.*/server=\\/&\\/127.0.0.1#$dns_port\\nnftset=\\/&\\/inet#ss_spec#blacklist/\" >$TMP_DNSMASQ_PATH/blacklist_forward.conf\n\tcat /etc/ssrplus/white.list | sed '/^$/d' | sed '/#/d' | sed \"/.*/s/.*/server=\\/&\\/127.0.0.1\\nnftset=\\/&\\/inet#ss_spec#whitelist/\" >$TMP_DNSMASQ_PATH/whitelist_forward.conf\nelif [ \"$nft_support\" = \"0\" ]; then\n\tcat /etc/ssrplus/black.list | sed '/^$/d' | sed '/#/d' | sed \"/.*/s/.*/server=\\/&\\/127.0.0.1#$dns_port\\nipset=\\/&\\/blacklist/\" >$TMP_DNSMASQ_PATH/blacklist_forward.conf\n\tcat /etc/ssrplus/white.list | sed '/^$/d' | sed '/#/d' | sed \"/.*/s/.*/server=\\/&\\/127.0.0.1\\nipset=\\/&\\/whitelist/\" >$TMP_DNSMASQ_PATH/whitelist_forward.conf\nfi\ncat /etc/ssrplus/deny.list | sed '/^$/d' | sed '/#/d' | sed \"/.*/s/.*/address=\\/&\\//\" >$TMP_DNSMASQ_PATH/denylist.conf\n\nif [ \"$(uci_get_by_type global adblock 0)\" == \"1\" ]; then\n\tcp -f /etc/ssrplus/ad.conf $TMP_DNSMASQ_PATH/\n\tif [ -f \"$TMP_DNSMASQ_PATH/ad.conf\" ]; then\n\t\tfor list_file in /etc/ssrplus/black.list /etc/ssrplus/white.list /etc/ssrplus/deny.list /etc/ssrplus/netflix.list; do\n\t\t\tif [ -s \"$list_file\" ]; then\n\t\t\t\tgrep -vE '^\\s*#|^\\s*$' \"$list_file\" > \"${list_file}.clean\"\n\t\t\t\tif [ -s \"${list_file}.clean\" ]; then\n\t\t\t\t\tgrep -v -F -f \"${list_file}.clean\" \"$TMP_DNSMASQ_PATH/ad.conf\" > \"$TMP_DNSMASQ_PATH/ad.conf.tmp\"\n\t\t\t\t\tmv \"$TMP_DNSMASQ_PATH/ad.conf.tmp\" \"$TMP_DNSMASQ_PATH/ad.conf\"\n\t\t\t\tfi\n\t\t\t\trm -f \"${list_file}.clean\"\n\t\t\tfi\n\t\tdone\n\tfi\nelse\n\trm -f $TMP_DNSMASQ_PATH/ad.conf\nfi\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/usr/share/shadowsocksr/hy2_test.sh",
    "content": "#!/bin/sh\n# /usr/share/shadowsocksr/test.sh\n\nCONFIG=\"shadowsocksr\"\nLOCK_PATH=/tmp/lock\nTMP_PATH=/var/etc/ssrplus\n\nuci_get_by_name() {\n\tlocal ret=$(uci -q get $CONFIG.$1.$2 2>/dev/null)\n\techo \"${ret:=$3}\"\n}\n\nuci_get_by_type() {\n\tlocal ret=$(uci -q get $CONFIG.@$1[0].$2 2>/dev/null)\n\techo \"${ret:=$3}\"\n}\n\ncheck_port_exists() {\n\tlocal port=$1\n\tlocal protocol=$2\n\t[ -n \"$protocol\" ] || protocol=\"tcp,udp\"\n\tlocal result=\n\tif [ \"$protocol\" = \"tcp\" ]; then\n\t\tresult=$(netstat -tln | grep -c \":$port \")\n\telif [ \"$protocol\" = \"udp\" ]; then\n\t\tresult=$(netstat -uln | grep -c \":$port \")\n\telif [ \"$protocol\" = \"tcp,udp\" ]; then\n\t\tresult=$(netstat -tuln | grep -c \":$port \")\n\tfi\n\techo \"${result}\"\n}\n\nset_cache_var() {\n\tlocal key=\"${1}\"\n\tshift 1\n\tlocal val=\"$@\"\n\t[ -n \"${key}\" ] && [ -n \"${val}\" ] && {\n\t\tsed -i \"/${key}=/d\" $TMP_PATH/var >/dev/null 2>&1\n\t\techo \"${key}=\\\"${val}\\\"\" >> $TMP_PATH/var\n\t\teval ${key}=\\\"${val}\\\"\n\t}\n}\n\nget_cache_var() {\n\tlocal key=\"${1}\"\n\t[ -n \"${key}\" ] && [ -s \"$TMP_PATH/var\" ] && {\n\t\techo $(cat $TMP_PATH/var | grep \"^${key}=\" | awk -F '=' '{print $2}' | tail -n 1 | awk -F'\"' '{print $2}')\n\t}\n}\n\n#uci_get_by_port() {\n#    local port=$1\n#    while netstat -tuln 2>/dev/null | grep -q \":${port} \"; do\n#        port=$((port + 1))\n#    done\n#    echo $port\n\nuci_get_by_port() {\n\tlocal default_start_port=2001\n\tlocal min_port=1025\n\tlocal max_port=49151\n\tlocal port=\"$1\"\n\tlocal protocol=$(echo \"$2\" | tr 'A-Z' 'a-z')\n\tlocal LOCK_FILE=\"${LOCK_PATH}/${CONFIG}_get_prot.lock\"\n\twhile ! mkdir \"$LOCK_FILE\" 2>/dev/null; do\n\t\tsleep 1\n\tdone\n\tif [ \"$port\" = \"auto\" ]; then\n\t\tlocal now last_time diff last_port\n\t\tnow=$(date +%s 2>/dev/null)\n\t\tlast_time=$(get_cache_var \"last_get_new_port_time\")\n\t\tif [ -n \"$now\" ] && [ -n \"$last_time\" ]; then\n\t\t\tdiff=$(expr \"$now\" - \"$last_time\")\n\t\t\t[ \"$diff\" -lt 0 ] && diff=$(expr 0 - \"$diff\")\n\t\telse\n\t\t\tdiff=999\n\t\tfi\n\t\tif [ \"$diff\" -gt 10 ]; then\n\t\t\tport=$default_start_port\n\t\telse\n\t\t\tlast_port=$(get_cache_var \"last_get_new_port_auto\")\n\t\t\tif [ -n \"$last_port\" ]; then\n\t\t\t\tport=$(expr \"$last_port\" + 1)\n\t\t\telse\n\t\t\t\tport=$default_start_port\n\t\t\tfi\n\t\tfi\n\tfi\n\t[ \"$port\" -lt $min_port -o \"$port\" -gt $max_port ] && port=$default_start_port\n\tlocal start_port=\"$port\"\n\twhile :; do\n\t\tif [ \"$(check_port_exists \"$port\" \"$protocol\")\" = 0 ]; then\n\t\t\tbreak\n\t\tfi\n\t\tport=$(expr \"$port\" + 1)\n\t\tif [ \"$port\" -gt $max_port ]; then\n\t\t\tport=$min_port\n\t\tfi\n\t\t[ \"$port\" = \"$start_port\" ] && {\n\t\t\trmdir \"$LOCK_FILE\" 2>/dev/null\n\t\t\treturn 1\n\t\t}\n\tdone\n\tif [ \"$1\" = \"auto\" ]; then\n\t\tset_cache_var \"last_get_new_port_auto\" \"$port\"\n\t\t[ -n \"$now\" ] && set_cache_var \"last_get_new_port_time\" \"$now\"\n\tfi\n\trmdir \"$LOCK_FILE\" 2>/dev/null\n\techo \"$port\"\n}\n\nurl_test_hy2() {\n    local node_id=$1\n\n    # 读取配置\n    local server=$(uci_get_by_name ${node_id} server)\n    local port=$(uci_get_by_name ${node_id} server_port)\n    local auth=$(uci_get_by_name ${node_id} hy2_auth)\n    local tls=$(uci_get_by_name ${node_id} tls)\n    local insecure=$(uci_get_by_name ${node_id} insecure)\n    local tls_host=$(uci_get_by_name ${node_id} tls_host)\n\n    # 获取本地端口\n\t# local tmp_port=$(uci_get_by_port 48900 tcp,udp)\n    local tmp_port=$(uci_get_by_port auto tcp,udp)\n\n    # 生成Hysteria2配置文件\n    local config_file=\"/tmp/hy2_test_${node_id}.yaml\"\n    cat > \"$config_file\" <<-EOF\n\t\tserver: ${server}:${port}\n\t\tauth: \"${auth}\"\n\t\ttls:\n\t\t  insecure: true\n\tEOF\n\n    # 如果 tls_host 非空，动态添加 sni 行\n    [ -n \"$tls_host\" ] && echo \"  sni: \\\"${tls_host}\\\"\" >> \"$config_file\"\n\n    # 追加 socks5 监听配置\n    cat >> \"$config_file\" <<-EOF\n\t\tsocks5:\n\t\t  listen: 127.0.0.1:${tmp_port}\n\tEOF\n\n    # echo \"Debug: 配置文件已生成: $config_file\" >&2\n\n    # 启动Hysteria2客户端\n    hysteria client --disable-update-check -c \"$config_file\" >/dev/null 2>&1 &\n    local pid=$!\n    echo $pid > \"/tmp/hy2_test_${node_id}.pid\"\n\n    # 等待端口启动\n    sleep 1\n\n    # 测试代理\n    # local result=$(curl --connect-timeout 3 --max-time 3 -s -o /dev/null -I -w \"%{http_code}:%{time_pretransfer}\" --socks5 127.0.0.1:${tmp_port} \"${probeUrl}\" 2>/dev/null)\n\tlocal curlx=\"socks5h://127.0.0.1:${tmp_port}\"\n\tlocal probeUrl=$(uci_get_by_type server_subscribe url_test_url https://www.google.com/generate_204)\n\tlocal result=$(curl --connect-timeout 3 --max-time 5 -o /dev/null -I -skL -w \"%{http_code}:%{time_pretransfer}\" -x ${curlx} \"${probeUrl}\" 2>/dev/null)\n\n    # 清理\n    # kill -9 $pid 2>/dev/null\n\tlocal pid_file=\"/tmp/hy2_test_${node_id}.pid\"\n\t[ -s \"$pid_file\" ] && kill -9 \"$(head -n 1 \"$pid_file\")\" >/dev/null 2>&1\n\tpgrep -af \"hysteria.*${config_file}\" | awk '! /test\\.sh/{print $1}' | xargs kill -9 >/dev/null 2>&1\n    rm -f \"$config_file\" \"$pid_file\"\n\n    echo $result\n}\n\ncase $1 in\n\turl_test_hy2)\n\t\turl_test_hy2 $2\n\t\t;;\nesac"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/usr/share/shadowsocksr/shadowsocksr.config",
    "content": "\nconfig global\n\toption global_server 'nil'\n\toption netflix_server 'nil'\n\toption netflix_proxy '0'\n\toption threads '0'\n\toption run_mode 'router'\n\toption dports '2'\n\toption custom_ports '80,443'\n\toption pdnsd_enable '1'\n\toption prefer_nft '1'\n\toption tunnel_forward '8.8.4.4:53'\n\toption monitor_enable '1'\n\toption enable_switch '1'\n\toption switch_time '667'\n\toption switch_timeout '5'\n\toption switch_try_count '3'\n\toption shunt_dns '1'\n\toption gfwlist_url 'https://fastly.jsdelivr.net/gh/YW5vbnltb3Vz/domain-list-community@release/gfwlist.txt'\n\toption chnroute_url 'https://ispip.clang.cn/all_cn.txt'\n\toption nfip_url 'https://fastly.jsdelivr.net/gh/QiuSimons/Netflix_IP/NF_only.txt'\n\toption adblock_url 'https://anti-ad.net/anti-ad-for-dnsmasq.conf'\n\nconfig server_subscribe\n\toption proxy '0'\n\toption auto_update '1'\n\toption auto_update_week_time '*'\n\toption auto_update_day_time '2'\n\toption auto_update_min_time '0'\n\toption url_test_url 'https://www.google.com/generate_204'\n\toption user_agent 'v2rayN/9.99'\n\toption filter_words '过期/套餐/剩余/QQ群/官网/防失联/回国'\n\nconfig access_control\n\toption lan_ac_mode '0'\n\toption router_proxy '1'\n\tlist wan_fw_ips '149.154.160.0/20'\n\tlist wan_fw_ips '67.198.55.0/24'\n\tlist wan_fw_ips '91.108.4.0/22'\n\tlist wan_fw_ips '91.108.56.0/22'\n\tlist wan_fw_ips '109.239.140.0/24'\n\tlist wan_fw_ips '8.8.8.8'\n\tlist wan_fw_ips '1.1.1.1'\n\tlist Interface 'lan'\n\nconfig socks5_proxy\n\toption server 'nil'\n\toption local_port '1080'\n\nconfig server_global\n\toption enable_server '0'\n\nconfig global_xray_fragment\n\toption fragment '0'\n\toption noise '0'\n\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/usr/share/shadowsocksr/ssrplusupdate.sh",
    "content": "#!/bin/sh\n/usr/bin/lua /usr/share/shadowsocksr/update.lua\nsleep 2s\n/usr/share/shadowsocksr/chinaipset.sh /var/etc/ssrplus/china_ssr.txt\nsleep 2s\n/usr/bin/lua /usr/share/shadowsocksr/subscribe.lua\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/usr/share/shadowsocksr/subscribe.lua",
    "content": "#!/usr/bin/lua\n\n------------------------------------------------\n-- This file is part of the luci-app-ssr-plus subscribe.lua\n-- @author William Chan <root@williamchan.me>\n------------------------------------------------\nrequire \"luci.model.uci\"\nrequire \"nixio\"\nrequire \"luci.util\"\nrequire \"luci.sys\"\nrequire \"luci.jsonc\"\n\n-- these global functions are accessed all the time by the event handler\n-- so caching them is worth the effort\nlocal tinsert = table.insert\nlocal ssub, slen, schar, sbyte, sformat, sgsub = string.sub, string.len, string.char, string.byte, string.format, string.gsub\nlocal jsonParse, jsonStringify = luci.jsonc.parse, luci.jsonc.stringify\nlocal b64decode = nixio.bin.b64decode\nlocal b64encode = nixio.bin.b64encode\nlocal URL = require \"url\"\nlocal cache = {}\nlocal nodeResult = setmetatable({}, {__index = cache}) -- update result\nlocal name = 'shadowsocksr'\nlocal uciType = 'servers'\nlocal ucic = require \"luci.model.uci\".cursor()\nlocal proxy = ucic:get_first(name, 'server_subscribe', 'proxy') or '0'\nlocal switch = ucic:get_first(name, 'server_subscribe', 'switch') or '1'\nlocal allow_insecure = ucic:get_first(name, 'server_subscribe', 'allow_insecure') or '0'\nlocal subscribe_url = ucic:get_first(name, 'server_subscribe', 'subscribe_url') or {}\nlocal filter_words = ucic:get_first(name, 'server_subscribe', 'filter_words') or '过期时间/剩余流量'\nlocal save_words = ucic:get_first(name, 'server_subscribe', 'save_words') or ''\nlocal user_agent = ucic:get_first(name, 'server_subscribe', 'user_agent') or 'v2rayN/9.99'\nlocal domain_resolver = ucic:get_first(name, 'server_subscribe', 'domain_resolver') or ''\nlocal domain_resolver_dns = ucic:get_first(name, 'server_subscribe', 'domain_resolver_dns') or ''\nlocal domain_resolver_dns_https = ucic:get_first(name, 'server_subscribe', 'domain_resolver_dns_https') or ''\nlocal domain_strategy = ucic:get_first(name, 'server_subscribe', 'domain_strategy') or ''\n\n-- 读取 ss_type 设置\nlocal ss_type = ucic:get_first(name, 'server_subscribe', 'ss_type') or ''\n-- 读取 xray_hy2_type 设置\nlocal xray_hy2_type = ucic:get_first(name, 'server_subscribe', 'xray_hy2_type') or ''\n-- 读取 xray_tj_type 设置\nlocal xray_tj_type = ucic:get_first(name, 'server_subscribe', 'xray_tj_type') or ''\n\nlocal has_ss_rust = luci.sys.exec('type -t -p sslocal 2>/dev/null || type -t -p ssserver 2>/dev/null') ~= \"\"\nlocal has_ss_libev = luci.sys.exec('type -t -p ss-redir 2>/dev/null || type -t -p ss-local 2>/dev/null') ~= \"\"\nlocal has_hysteria = luci.sys.exec('type -t -p hysteria 2>/dev/null') ~= \"\"\nlocal has_trojan = luci.sys.exec('type -t -p trojan 2>/dev/null') ~= \"\"\nlocal has_xray = luci.sys.exec('type -t -p xray 2>/dev/null') ~= \"\"\n\nlocal tuic_type = luci.sys.exec('type -t -p tuic-client') ~= \"\" and \"tuic\"\nlocal log = function(...)\n\tprint(os.date(\"%Y-%m-%d %H:%M:%S \") .. table.concat({...}, \" \"))\nend\nlocal encrypt_methods_ss = {\n\t-- plain\n\t\"none\",\n\t\"plain\",\n\t-- aead\n\t\"aes-128-gcm\",\n\t\"aes-192-gcm\",\n\t\"aes-256-gcm\",\n\t\"chacha20-ietf-poly1305\",\n\t\"xchacha20-ietf-poly1305\",\n\t-- aead 2022\n\t\"2022-blake3-aes-128-gcm\",\n\t\"2022-blake3-aes-256-gcm\",\n\t\"2022-blake3-chacha20-poly1305\"\n\t--[[ stream\n\t\"table\",\n\t\"rc4\",\n\t\"rc4-md5\",\n\t\"aes-128-cfb\",\n\t\"aes-192-cfb\",\n\t\"aes-256-cfb\",\n\t\"aes-128-ctr\",\n\t\"aes-192-ctr\",\n\t\"aes-256-ctr\",\n\t\"bf-cfb\",\n\t\"camellia-128-cfb\",\n\t\"camellia-192-cfb\",\n\t\"camellia-256-cfb\",\n\t\"salsa20\",\n\t\"chacha20\",\n\t\"chacha20-ietf\" ]]--\n}\n-- 分割字符串\nlocal function split(full, sep)\n\tif full == nil or type(full) ~= \"string\" then\n\t\t-- print(\"Debug: split() received nil or non-string value\")\n\t\treturn {}\n\tend\n\tfull = full:gsub(\"%z\", \"\"):gsub(\"^%s+\", \"\"):gsub(\"%s+$\", \"\") -- 去除首尾空白字符和\\0\n\tif full == \"\" then\n\t\t-- print(\"Debug: split() received empty string after trimming\")\n\t\treturn {}\n\tend\n\tsep = sep or \",\" -- 默认分隔符\n\tlocal off, result = 1, {}\n\twhile true do\n\t\tlocal nStart, nEnd = full:find(sep, off)\n\t\tif not nEnd then\n\t\t\tlocal res = ssub(full, off, slen(full))\n\t\t\tif #res > 0 then -- 过滤掉 \\0\n\t\t\t\ttinsert(result, res)\n\t\t\tend\n\t\t\tbreak\n\t\telse\n\t\t\ttinsert(result, ssub(full, off, nStart - 1))\n\t\t\toff = nEnd + 1\n\t\tend\n\tend\n\treturn result\nend\n-- urlencode\nlocal function get_urlencode(c)\n\treturn sformat(\"%%%02X\", sbyte(c))\nend\n\nlocal function urlEncode(szText)\n\tlocal str = szText:gsub(\"([^0-9a-zA-Z ])\", get_urlencode)\n\tstr = str:gsub(\" \", \"+\")\n\treturn str\nend\n\nlocal function get_urldecode(h)\n\treturn schar(tonumber(h, 16))\nend\nlocal function UrlDecode(szText)\n\treturn szText:gsub(\"+\", \" \"):gsub(\"%%(%x%x)\", get_urldecode)\nend\n\n-- trim\nlocal function trim(text)\n\tif not text or text == \"\" then\n\t\treturn \"\"\n\tend\n\treturn (sgsub(text, \"^%s*(.-)%s*$\", \"%1\"))\nend\n-- md5\nlocal function md5(content)\n\tlocal stdout = luci.sys.exec('echo \\\"' .. urlEncode(content) .. '\\\" | md5sum | cut -d \\\" \\\" -f1')\n\t-- assert(nixio.errno() == 0)\n\treturn trim(stdout)\nend\n-- base64 解码\nlocal function base64Decode(text)\n\tlocal raw = text\n\tif not text or text == \"\" then\n\t\treturn ''\n\tend\n\ttext = text:gsub(\"%z\", \"\")\n\ttext = text:gsub(\"%c\", \"\")\n\ttext = text:gsub(\"%s\", \"\")\n\ttext = text:gsub(\"_\", \"/\")\n\ttext = text:gsub(\"-\", \"+\")\n\ttext = text:gsub(\"=\", \"\")\n\tlocal mod4 = #text % 4\n\ttext = text .. string.sub('====', mod4 + 1)\n\tlocal result = b64decode(text)\n\tif result then\n\t\treturn result:gsub(\"%z\", \"\")\n\telse\n\t\treturn raw\n\tend\nend\n-- base64 编码\nlocal function base64Encode(text)\n\tif not text or text == \"\" then\n\t\treturn ''\n\tend\n\tlocal result = b64encode(text)\n\tif result then\n\t\tresult = result:gsub(\"%z\", \"\")\n\t\treturn result\n\telse\n\t\treturn text\n\tend\nend\n-- 检查数组(table)中是否存在某个字符值\n-- https://www.04007.cn/article/135.html\nlocal function checkTabValue(tab)\n\tlocal revtab = {}\n\tfor k,v in pairs(tab) do\n\t\trevtab[v] = true\n\tend\n\treturn revtab\nend\n-- JSON完整性检查\nlocal function isCompleteJSON(str)\n\t-- 检查JSON格式\n\tif type(str) ~= \"string\" or str:match(\"^%s*$\") then\n        return false\n    end\n\t-- 尝试解析JSON验证完整性\n\tlocal success, _ = pcall(jsonParse, str)\n\treturn success\nend\n-- 处理数据\nlocal function processData(szType, content, cfgid)\n\tlocal result = {type = szType, local_port = 1234, kcp_param = '--nocomp'}\n\t-- 检查JSON的格式如不完整丢弃\n\tif not (szType == \"sip008\" or szType == \"ssd\") then\n\t\tif not isCompleteJSON(content) then\n\t\t\treturn nil\n\t\tend\n\tend\n\n\tif szType == \"hysteria2\" or szType == \"hy2\" then\n\t\tlocal url = URL.parse(\"http://\" .. content)\n\t\tlocal params = url.query\n\n\t\t-- 调试输出所有参数\n\t\t-- log(\"Hysteria2 原始参数:\")\n\t\t-- for k,v in pairs(params) do\n\t\t--\tlog(k..\"=\"..v)\n\t\t-- end\n\n\t\t-- 自动决定模式（true=Xray, false=普通）\n\t\tlocal xray_hy2_mode = false  -- 默认普通模式\n\t\tif xray_hy2_type == \"v2ray\" then\n\t\t\t-- Xray 模式\n\t\t\tif has_xray then\n\t\t\t\txray_hy2_mode = true\n\t\t\telseif has_hysteria then\n\t\t\t\txray_hy2_mode = false   -- 回退到普通 Hysteria2\n\t\t\telse\n\t\t\t\txray_hy2_mode = nil\n\t\t\tend\n\t\telseif xray_hy2_type == \"hysteria2\" then\n\t\t\t-- 普通 Hysteria2 模式\n\t\t\tif has_hysteria then\n\t\t\t\txray_hy2_mode = false\n\t\t\telseif has_xray then\n\t\t\t\txray_hy2_mode = true   -- 回退到 Xray\n\t\t\telse\n\t\t\t\txray_hy2_mode = nil\n\t\t\tend\n\t\telse\n\t\t\t-- auto 或空：优先普通 Hysteria2，若不存在则使用 Xray\n\t\t\tif has_hysteria then\n\t\t\t\txray_hy2_mode = false\n\t\t\telseif has_xray then\n\t\t\t\txray_hy2_mode = true   -- 回退到 Xray\n\t\t\telse\n\t\t\t\txray_hy2_mode = nil\n\t\t\tend\n\t\tend\n\t\n\t\t-- 如果无法确定模式，跳过该订阅\n\t\tif xray_hy2_mode == nil then\n\t\t\treturn nil\n\t\tend\n\t\n\t\tif xray_hy2_mode then\n\t\t\tresult.type = \"v2ray\"\n\t\t\tresult.v2ray_protocol = \"hysteria2\"\n\t\t\tif params.fm and params.fm ~= \"\" then\n\t\t\t\tresult.enable_finalmask = \"1\"\n\t\t\t\tresult.finalmask = base64Encode(params.fm)\n\t\t\tend\n\t\t\tif (params.security and params.security:lower() == \"tls\")\n\t\t\t\t\tor (params.sni and params.sni ~= \"\")\n\t\t\t\t\tor (params.alpn and params.alpn ~= \"\")\n\t\t\t\t\tor (params.pcs or params.vcn) then\n\t\t\t\tresult.tls = \"1\"\n\t\t\t\tif params.sni then\n\t\t\t\t\tresult.tls_host = params.sni\n\t\t\t\tend\n\t\t\t\tif params.alpn and params.alpn ~= \"\" then\n\t\t\t\t\tlocal alpn = {}\n\t\t\t\t\tfor v in params.alpn:gmatch(\"[^,;|%s]+\") do\n\t\t\t\t\t\ttable.insert(alpn, v)\n\t\t\t\t\tend\n\t\t\t\t\tif #alpn > 0 then\n\t\t\t\t\t\tresult.tls_alpn = table.concat(alpn, \",\")  -- 确保为字符串\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\t\tif params.pcs then\n\t\t\t\t\tresult.tls_CertSha = params.pcs\n\t\t\t\tend\n\t\t\t\tif params.vcn then\n\t\t\t\t\tresult.tls_CertByName = params.vcn\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tresult.type = \"hysteria2\"\n\t\t\tif params.protocol and params.protocol ~= \"\" then\n\t\t\t\tresult.flag_transport = \"1\"\n\t\t\t\tresult.transport_protocol = params.protocol\n\t\t\telse\n\t\t\t\tresult.flag_transport = \"1\"\n\t\t\t\tresult.transport_protocol = \"udp\"\n\t\t\tend\n\t\t\tif params.lazy and params.lazy ~= \"\" then\n\t\t\t\tresult.lazy_mode = \"1\"\n\t\t\tend\n\t\t\tif (params.sni and params.sni ~= \"\") or (params.alpn and params.alpn ~= \"\") then\n\t\t\t\tresult.tls = \"1\"\n\t\t\t\tif params.sni then\n\t\t\t\t\tresult.tls_host = params.sni\n\t\t\t\tend\n\t\t\t\tif params.alpn and params.alpn ~= \"\" then\n\t\t\t\t\tlocal alpn = {}\n\t\t\t\t\tfor v in params.alpn:gmatch(\"[^,;|%s]+\") do\n\t\t\t\t\t\ttable.insert(alpn, v)\n\t\t\t\t\tend\n\t\t\t\t\tif #alpn > 0 then\n\t\t\t\t\t\tresult.tls_alpn = table.concat(alpn, \",\")  -- 确保为字符串\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\t\tif params.pinSHA256 and params.pinSHA256 ~= \"\" then\n\t\t\t\tresult.pinsha256 = params.pinSHA256\n\t\t\tend\n\t\tend\n\n\t\tlocal raw_alias = url.fragment and UrlDecode(url.fragment) or nil\n\t\tresult.raw_alias = raw_alias   -- 新增\n\t\tresult.alias = raw_alias       -- 临时赋值（后面会被覆盖）\n\t\tresult.server = url.host\n\t\tresult.server_port = url.port or 443\n\t\tresult.hy2_auth = url.user\n\n\t\tif params.mport then\n\t\t\tresult.flag_port_hopping = \"1\"\n\t\t\tresult.port_range = params.mport\n\t\tend\n\t\tresult.uplink_capacity = tonumber((params.upmbps or \"\"):match(\"^(%d+)\")) or nil\n\t\tresult.downlink_capacity = tonumber((params.downmbps or \"\"):match(\"^(%d+)\")) or nil\n\t\tif params.obfs and params.obfs ~= \"none\" then\n\t\t\tresult.flag_obfs = \"1\"\n\t\t\tresult.obfs_type = params.obfs\n\t\t\tresult.salamander = params[\"obfs-password\"] or params[\"obfs_password\"]\n\t\tend\n\t\tif params.allowInsecure or params.insecure then\n\t\t\tlocal insecure = params.allowInsecure or params.insecure\n\t\t\tif insecure == true or insecure == \"1\" or insecure == \"true\" then\n\t\t\t\tresult.insecure = \"1\"\n\t\t\tend\n\t\tend\n\t\tif params.tfo then\n\t\t\t-- 处理 fast open 参数\n\t\t\tresult.fast_open = params.tfo\n\t\tend\n\telseif szType == 'ssr' then\n\t\t-- 去掉前后空白和#注释\n\t\tlocal link = trim(content:gsub(\"#.*$\", \"\"))\n\t\tlocal dat = split(link, \"/%?\")\n\t\tlocal hostInfo = split(dat[1] or '', ':')\n\n\t\tresult.type = 'ssr'\n\t\tresult.server = hostInfo[1] or ''\n\t\tresult.server_port = hostInfo[2] or ''\n\t\tresult.protocol = hostInfo[3] or ''\n\t\tresult.encrypt_method = hostInfo[4] or ''\n\t\tresult.obfs = hostInfo[5] or ''\n\t\tresult.password = base64Decode(hostInfo[6] or '')\n\n\t\tlocal params = {}\n\t\tif dat[2] and dat[2] ~= '' then\n            for _, v in pairs(split(dat[2], '&')) do\n                local t = split(v, '=')\n                if t[1] and t[2] then\n                    params[t[1]] = t[2]\n                end\n            end\n\t\tend\n\n\t\tresult.obfs_param = base64Decode(params.obfsparam or '')\n\t\tresult.protocol_param = base64Decode(params.protoparam or '')\n\n\t\tif params.tfo then\n\t\t\t-- 处理 fast open 参数\n\t\t\tresult.fast_open = params.tfo\n\t\tend\n\n\t\tlocal group = base64Decode(params.group or '')\n\t\tlocal remarks = base64Decode(params.remarks or '')\n\n\t\t-- 拼接 alias\n\t\tlocal alias = \"\"\n\t\tif group ~= \"\" then\n\t\t\traw_alias = \"[\" .. group .. \"] \"\n\t\tend\n\t\traw_alias = raw_alias .. remarks\n\t\tresult.raw_alias = raw_alias   -- 新增\n\t\tresult.alias = raw_alias       -- 临时赋值（后面会被覆盖）\n\telseif szType == \"vmess\" then\n\t\t-- 去掉前后空白和注释\n\t\tlocal link = trim(content:gsub(\"#.*$\", \"\"))\n\n\t\t-- Base64 解码\n\t\tlocal decoded = base64Decode(link)\n\t\tif not decoded or decoded == \"\" then\n\t\t\treturn nil\n\t\tend\n\n\t\t-- 解析 JSON\n\t\tlocal ok, info = pcall(jsonParse, decoded)\n\t\tif not ok or type(info) ~= \"table\" then\n\t\t\treturn nil\n\t\tend\n\n\t\t-- 基本信息\n\t\tresult.type = 'v2ray'\n\t\tresult.v2ray_protocol = 'vmess'\n\t\tresult.server = info.add\n\t\tresult.server_port = info.port\n\t\tresult.alter_id = info.aid\n\t\tresult.vmess_id = info.id\n\t\tresult.raw_alias = info.ps   -- 新增\n\t\tresult.alias = info.ps       -- 临时赋值（后面会被覆盖）\n\n\t\t-- 调整传输协议\n\t\tif info.net == \"tcp\" then\n\t\t\tinfo.net = \"raw\"\n\t\tend\n\t\tif info.net == \"splithttp\" then\n\t\t\tinfo.net = \"xhttp\"\n\t\tend\n\t\tresult.transport = info.net\n\n\t\t-- result.mux = 1\n\t\t-- result.concurrency = 8\n\t\tif info.net == 'ws' then\n\t\t\tresult.ws_host = info.host\n\t\t\tresult.ws_path = info.path\n\t\tend\n\t\tif info.net == 'httpupgrade' then\n\t\t\tresult.httpupgrade_host = info.host\n\t\t\tresult.httpupgrade_path = info.path\n\t\tend\n\t\tif info.net == 'xhttp' or info.net == 'splithttp' then\n\t\t\tresult.xhttp_mode = info.mode\n\t\t\tresult.xhttp_host = info.host\n\t\t\tresult.xhttp_path = info.path\n\t\t\t-- 检查 extra 参数是否存在且非空\n\t\t\tif info.extra and info.extra ~= \"\" then\n\t\t\t\tresult.enable_xhttp_extra = \"1\"\n\t\t\t\tresult.xhttp_extra = base64Encode(info.extra)\n\t\t\tend\n\t\t\t-- 尝试解析 JSON 数据\n\t\t\tlocal success, Data = pcall(jsonParse, info.extra or \"\")\n\t\t\tif success and type(Data) == \"table\" then\n\t\t\t\tlocal address = (Data.extra and Data.extra.downloadSettings and Data.extra.downloadSettings.address)\n\t\t\t\t\tor (Data.downloadSettings and Data.downloadSettings.address)\n\t\t\t\tresult.download_address = (address and address ~= \"\") and address:gsub(\"^%[\", \"\"):gsub(\"%]$\", \"\")\n\t\t\telse\n\t\t\t\t-- 如果解析失败，清空下载地址\n\t\t\t\tresult.download_address = nil\n\t\t\tend\n\t\tend\n\t\tif info.net == 'h2' then\n\t\t\tresult.h2_host = info.host\n\t\t\tresult.h2_path = info.path\n\t\tend\n\t\tif info.net == 'raw' or info.net == 'tcp' then\n\t\t\tresult.tcp_guise = info.type or \"none\"\n\t\t\tif result.tcp_guise == \"http\" then\n\t\t\t\tresult.http_host = info.host\n\t\t\t\tresult.http_path = info.path\n\t\t\tend\n\t\tend\n\t\tif info.net == 'kcp' then\n\t\t\tresult.kcp_guise = info.type or \"none\"\n\t\t\tif info.type and info.type == \"dns\" then\n\t\t\t\tresult.kcp_guise = info.host or \"\"\n\t\t\tend\n\t\t\tresult.seed = params.seed\n\t\tend\n\t\tif info.net == 'grpc' then\n\t\t\tif info.path then\n\t\t\t\tresult.serviceName = info.path\n\t\t\telseif info.serviceName then\n\t\t\t\tresult.serviceName = info.serviceName\n\t\t\tend\n\t\tend\n\t\tif info.net == 'quic' then\n\t\t\tresult.quic_guise = info.type\n\t\t\tresult.quic_key = info.key\n\t\t\tresult.quic_security = info.security\n\t\tend\n\t\tif info.security then\n\t\t\tresult.security = info.security\n\t\tend\n\t\tif info.fm and info.fm ~= \"\" then\n\t\t\tinfo.fm = UrlDecode(info.fm)\n\t\t\tresult.enable_finalmask = \"1\"\n\t\t\tresult.finalmask = base64Encode(info.fm)\n\t\tend\n\t\tif info.tls == \"tls\" or info.tls == \"1\" then\n\t\t\tresult.tls = \"1\"\n\t\t\tresult.fingerprint = info.fp\n\t\t\tif info.alpn and info.alpn ~= \"\" then\n\t\t\t\tlocal alpn = {}\n\t\t\t\tfor v in info.alpn:gmatch(\"[^,]+\") do\n\t\t\t\t\ttable.insert(alpn, v)\n\t\t\t\tend\n\t\t\t\tif #alpn > 0 then\n\t\t\t\t\tresult.tls_alpn = table.concat(alpn, \",\")  -- 确保为字符串\n\t\t\t\tend\n\t\t\tend\n\t\t\tif info.sni and info.sni ~= \"\" then\n\t\t\t\tresult.tls_host = info.sni\n\t\t\telseif info.host and info.host ~= \"\" then\n\t\t\t\tresult.tls_host = info.host\n\t\t\tend\n\t\t\tif info.ech and info.ech ~= \"\" then\n\t\t\t\tresult.enable_ech = \"1\"\n\t\t\t\tresult.ech_config = info.ech\n\t\t\tend\n\t\t\tif info.pcs and info.pcs ~= \"\" then\n\t\t\t\tresult.tls_CertSha = info.pcs\n\t\t\tend\n\t\t\tif info.vcn and info.vcn ~= \"\" then\n\t\t\t\tresult.tls_CertByName = info.vcn\n\t\t\tend\n\t\t\t-- 兼容 allowInsecure / allowlnsecure / skip-cert-verify\n\t\t\tif info.allowInsecure or info.allowlnsecure or info.insecure or info[\"skip-cert-verify\"] then\n\t\t\t\tlocal insecure = info.allowInsecure or info.allowlnsecure or info.insecure or info[\"skip-cert-verify\"]\n\t\t\t\tif insecure == true or insecure == \"1\" or insecure == \"true\" then\n\t\t\t\t\tresult.insecure = \"1\"\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tresult.tls = \"0\"\n\t\tend\n\telseif szType == \"ss\" then\n\t\tlocal idx_sp = content:find(\"#\") or 0\n\t\tlocal alias = \"\"\n\t\tif idx_sp > 0 then\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\t\tcontent = content:sub(0, idx_sp - 1):gsub(\"/%?\", \"?\")\n\t\tend\n\t\tlocal raw_alias = UrlDecode(alias)\n\t\tresult.raw_alias = raw_alias   -- 新增\n\t\tresult.alias = raw_alias       -- 临时赋值（后面会被覆盖）\n\n\t\t-- 拆 base64 主体和 ? 参数部分\n\t\tlocal info = content\n\t\tlocal find_index, query = info:match(\"^([^?]+)%??(.*)$\")\n\t\t--log(\"SS 节点格式:\", find_index)\n\t\tlocal params = {}\n\t\tif query and query ~= \"\" then\n\t\t\tfor _, v in ipairs(split(query, '&')) do\n\t\t\t\tlocal t = split(v, '=')\n\t\t\t\tif #t >= 2 then\n\t\t\t\t\tparams[t[1]] = UrlDecode(t[2])\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\tif params.tfo and params.tfo ~= \"\" then\n\t\t\t-- 处理 fast open 参数\n\t\t\tresult.fast_open = params.tfo\n\t\tend\n\n\t\t-- 自动决定模式（true=Xray, false=普通 SS）\n\t\tlocal xray_ss_mode = false\n\t\tif ss_type == \"v2ray\" then\n\t\t\t-- Xray 模式\n\t\t\tif has_xray then\n\t\t\t\txray_ss_mode = true\n\t\t\telseif has_ss_rust or has_ss_libev then\n\t\t\t\txray_ss_mode = false   -- 回退到普通 SS\n\t\t\telse\n\t\t\t\txray_ss_mode = nil\n\t\t\tend\n\t\telseif ss_type == \"ss-rust\" or ss_type == \"ss-libev\" then\n\t\t\t-- 普通 SS 模式\n\t\t\tlocal user_core = (ss_type == \"ss-rust\" and has_ss_rust) or (ss_type == \"ss-libev\" and has_ss_libev)\n\t\t\tif user_core then\n\t\t\t\txray_ss_mode = false  -- 否则普通 SS\n\t\t\telse\n\t\t\t\t-- 指定的核心不存在，尝试另一个 SS 核心\n\t\t\t\tlocal other_core = (ss_type == \"ss-rust\" and has_ss_libev) or (ss_type == \"ss-libev\" and has_ss_rust)\n\t\t\t\tif other_core then\n\t\t\t\t\txray_ss_mode = false  -- 使用存在的另一个 SS 核心\n\t\t\t\telseif has_xray then\n\t\t\t\t\txray_ss_mode = true    -- 回退到 Xray\n\t\t\t\telse\n\t\t\t\t\txray_ss_mode = nil\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t    -- ss_type 为空或 auto：根据链接中是否有 type 参数决定\n\t\t\tlocal has_type = params.type and params.type ~= \"\"\n\t\t\tif has_type then\n\t\t\t\t-- 有 type 参数，优先 Xray\n\t\t\t\tif has_xray then\n\t\t\t\t\txray_ss_mode = true\n\t\t\t\telseif has_ss_rust or has_ss_libev then\n\t\t\t\t\txray_ss_mode = false   -- 回退到普通 SS\n\t\t\t\telse\n\t\t\t\t\txray_ss_mode = nil\n\t\t\t\tend\n\t\t\telse\n\t\t\t\t-- 无 type 参数，优先普通 SS\n\t\t\t\tif has_ss_rust or has_ss_libev then\n\t\t\t\t\t-- 普通 SS 模式\n\t\t\t\t\txray_ss_mode = false\n\t\t\t\telseif has_xray then\n\t\t\t\t\txray_ss_mode = true    -- 回退到 Xray\n\t\t\t\telse\n\t\t\t\t\txray_ss_mode = nil\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\t-- 如果最终无可用核心，跳过该订阅\n\t\tif xray_ss_mode == nil then\n\t\t\treturn nil\n\t\tend\n\n\t\tif xray_ss_mode then\n\t\t\tlocal url = URL.parse(\"http://\" .. info)\n\t\t\tlocal params = url.query\n\n\t\t\tresult.type = \"v2ray\"\n\t\t\tresult.v2ray_protocol = \"shadowsocks\"\n\t\t\tresult.server = url.host\n\t\t\tresult.server_port = url.port\n\n\t\t\t-- 判断 @ 前部分是否为 Base64\n\t\t\tlocal is_base64 = base64Decode(UrlDecode(url.user))\n\t\t\tif is_base64:find(\":\") then\n        \t\t-- 新格式：method:password\n        \t\tresult.encrypt_method_ss, result.password = is_base64:match(\"^(.-):(.*)$\")\n\t\t\telse\n\t\t\t\t-- 旧格式：UUID 直接作为密码\n\t\t\t\tresult.password = url.user\n\t\t\t\tresult.encrypt_method_ss = params.encryption or \"none\"\n\t\t\tend\n\n\t\t\tif params.udp then\n\t\t\t\t-- 处理 udp 参数\n\t\t\t\tresult.uot = params.udp\n\t\t\tend\n\n\t\t\tresult.transport = params.type or \"raw\"\n\t\t\tif result.transport == \"tcp\" then\n\t\t\t\tresult.transport = \"raw\"\n\t\t\tend\n\t\t\tif result.transport == \"splithttp\" then\n\t\t\t\tresult.transport = \"xhttp\"\n\t\t\tend\n\t\t\tresult.tls = (params.security == \"tls\" or params.security == \"xtls\") and \"1\" or \"0\"\n\t\t\tif params.alpn and params.alpn ~= \"\" then\n\t\t\t\tlocal alpn = {}\n\t\t\t\tfor v in params.alpn:gmatch(\"[^,;|%s]+\") do\n\t\t\t\t\ttable.insert(alpn, v)\n\t\t\t\tend\n\t\t\t\tif #alpn > 0 then\n\t\t\t\t\tresult.tls_alpn = table.concat(alpn, \",\")  -- 确保为字符串\n\t\t\t\tend\n\t\t\tend\n\t\t\tif params.pcs and params.pcs ~= \"\" then\n\t\t\t\tresult.tls_CertSha = params.pcs\n\t\t\tend\n\t\t\tif params.vcn and params.vcn ~= \"\" then\n\t\t\t\tresult.tls_CertByName = params.vcn\n\t\t\tend\n\t\t\tresult.tls_host = params.sni\n\t\t\tresult.tls_flow = (params.security == \"tls\" or params.security == \"reality\") and params.flow or nil\n\t\t\tresult.fingerprint = params.fp\n\t\t\tresult.reality = (params.security == \"reality\") and \"1\" or \"0\"\n\t\t\tresult.reality_publickey = params.pbk and UrlDecode(params.pbk) or nil\n\t\t\tresult.reality_shortid = params.sid\n\t\t\tresult.reality_spiderx = params.spx and UrlDecode(params.spx) or nil\n\t\t\t-- 检查 ech 参数是否存在且非空\n\t\t\tif params.ech and params.ech ~= \"\" then\n\t\t\t\tresult.enable_ech = \"1\"\n\t\t\t\tresult.ech_config = params.ech\n\t\t\tend\n\t\t\t-- 检查 finalmaskg 参数是否存在且非空\n\t\t\tif params.fm and params.fm ~= \"\" then\n\t\t\t\tresult.enable_finalmask = \"1\"\n\t\t\t\tresult.finalmaskg = base64Encode(params.fm)\n\t\t\tend\n\t\t\t-- 检查 pqv 参数是否存在且非空\n\t\t\tif params.pqv and params.pqv ~= \"\" then\n\t\t\t\tresult.enable_mldsa65verify = \"1\"\n\t\t\t\tresult.reality_mldsa65verify = params.pqv\n\t\t\tend\n\t\t\tif params.allowInsecure or params.insecure then\n\t\t\t\tlocal insecure = params.allowInsecure or params.insecure\n\t\t\t\tif insecure == true or insecure == \"1\" or insecure == \"true\" then\n\t\t\t\t\tresult.insecure = \"1\"\n\t\t\t\tend\n\t\t\tend\n\t\t\tif result.transport == \"ws\" then\n\t\t\t\tresult.ws_host = (result.tls ~= \"1\") and (params.host and UrlDecode(params.host)) or nil\n\t\t\t\tresult.ws_path = params.path and UrlDecode(params.path) or \"/\"\n\t\t\telseif result.transport == \"httpupgrade\" then\n\t\t\t\tresult.httpupgrade_host = (result.tls ~= \"1\") and (params.host and UrlDecode(params.host)) or nil\n\t\t\t\tresult.httpupgrade_path = params.path and UrlDecode(params.path) or \"/\"\n\t\t\telseif result.transport == \"xhttp\" or result.transport == \"splithttp\" then\n\t\t\t\tresult.xhttp_mode = params.mode or \"auto\"\n\t\t\t\tresult.xhttp_host = params.host and UrlDecode(params.host) or nil\n\t\t\t\tresult.xhttp_path = params.path and UrlDecode(params.path) or \"/\"\n\t\t\t\t-- 检查 extra 参数是否存在且非空\n\t\t\t\tif params.extra and params.extra ~= \"\" then\n\t\t\t\t\tresult.enable_xhttp_extra = \"1\"\n\t\t\t\t\tresult.xhttp_extra = base64Encode(params.extra)\n\t\t\t\tend\n\t\t\t\t-- 尝试解析 JSON 数据\n\t\t\t\tlocal success, Data = pcall(jsonParse, params.extra or \"\")\n\t\t\t\tif success and type(Data) == \"table\" then\n\t\t\t\t\tlocal address = (Data.extra and Data.extra.downloadSettings and Data.extra.downloadSettings.address)\n\t\t\t\t\t\tor (Data.downloadSettings and Data.downloadSettings.address)\n\t\t\t\t\tresult.download_address = (address and address ~= \"\") and address:gsub(\"^%[\", \"\"):gsub(\"%]$\", \"\")\n\t\t\t\telse\n\t\t\t\t\t-- 如果解析失败，清空下载地址\n\t\t\t\t\tresult.download_address = nil\n\t\t\t\tend\n\t\t\t-- make it compatible with bullshit, \"h2\" transport is non-existent at all\n\t\t\telseif result.transport == \"http\" or result.transport == \"h2\" then\n\t\t\t\tresult.transport = \"h2\"\n\t\t\t\tresult.h2_host = params.host and UrlDecode(params.host) or nil\n\t\t\t\tresult.h2_path = params.path and UrlDecode(params.path) or nil\n\t\t\telseif result.transport == \"kcp\" then\n\t\t\t\tresult.kcp_guise = params.headerType or \"none\"\n\t\t\t\tif params.headerType and params.headerType == \"dns\" then\n\t\t\t\t\tresult.kcp_domain = params.host or \"\"\n\t\t\t\tend\n\t\t\t\tresult.seed = params.seed\n\t\t\telseif result.transport == \"quic\" then\n\t\t\t\tresult.quic_guise = params.headerType or \"none\"\n\t\t\t\tresult.quic_security = params.quicSecurity or \"none\"\n\t\t\t\tresult.quic_key = params.key\n\t\t\telseif result.transport == \"grpc\" then\n\t\t\t\tresult.serviceName = params.serviceName\n\t\t\t\tresult.grpc_mode = params.mode or \"gun\"\n\t\t\telseif result.transport == \"tcp\" or result.transport == \"raw\" then\n\t\t\t\tresult.tcp_guise = params.headerType or \"none\"\n\t\t\t\tif result.tcp_guise == \"http\" then\n\t\t\t\t\tresult.tcp_host = params.host and UrlDecode(params.host) or nil\n\t\t\t\t\tresult.tcp_path = params.path and UrlDecode(params.path) or nil\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tlocal is_old_format = find_index:find(\"@\") and not find_index:find(\"://.*@\")\n\t\t\tlocal old_base64, host_port, userinfo, server, port, method, password\n\n\t\t\tif is_old_format then\n\t\t\t\t-- 旧格式：base64(method:pass)@host:port\n\t\t\t\told_base64, host_port = find_index:match(\"^([^@]+)@(.-)$\")\n\t\t\t\tlog(\"SS 节点旧格式解析:\", old_base64)\n\t\t\t\tif not old_base64 or not host_port then\n\t\t\t\t\tlog(\"SS 节点旧格式解析失败:\", find_index)\n\t\t\t\t\treturn nil\n\t\t\t\tend\n\t\t\t\tlocal decoded = base64Decode(UrlDecode(old_base64))\n\t\t\t\tif not decoded then\n\t\t\t\t\tlog(\"SS base64 解码失败（旧格式）:\", old_base64)\n\t\t\t\t\treturn nil\n\t\t\t\tend\n\t\t\t\tuserinfo = decoded\n\t\t\telse\n\t\t\t\t-- 新格式：base64(method:pass@host:port)\n\t\t\t\tlocal decoded = base64Decode(UrlDecode(find_index))\n\t\t\t\tif not decoded then\n\t\t\t\t\tlog(\"SS base64 解码失败（新格式）:\", find_index)\n\t\t\t\t\treturn nil\n\t\t\t\tend\n\t\t\t\tuserinfo, host_port = decoded:match(\"^(.-)@(.-)$\")\n\t\t\t\tif not userinfo or not host_port then\n\t\t\t\t\tlog(\"SS 解码内容缺失 @ 分隔:\", decoded)\n\t\t\t\t\treturn nil\n\t\t\t\tend\n\t\t\tend\n\n\t\t\t-- 解析加密方式和密码（允许密码包含冒号）\n\t\t\tlocal meth_pass = userinfo:find(\":\")\n\t\t\tif not meth_pass then\n\t\t\t\tlog(\"SS 用户信息格式错误:\", userinfo)\n\t\t\t\treturn nil\n\t\t\tend\n\t\t\tmethod = userinfo:sub(1, meth_pass - 1)\n\t\t\tpassword = userinfo:sub(meth_pass + 1)\n\n\t\t\t-- 判断密码是否经过url编码\n\t\t\tlocal function isURLEncodedPassword(pwd)\n\t\t\t\tif not pwd:find(\"%%[0-9A-Fa-f][0-9A-Fa-f]\") then\n\t\t\t\t\treturn false\n\t\t\t\tend\n\t\t\t\tlocal ok, decoded = pcall(UrlDecode, pwd)\n\t\t\t\treturn ok and urlEncode(decoded) == pwd\n\t\t\tend\n\n\t\t\tlocal decoded = UrlDecode(password)\n\t\t\tif isURLEncodedPassword(password) and decoded then\n\t\t\t\tpassword = decoded\n\t\t\tend\n\n\t\t\t-- 解析服务器地址和端口（兼容 IPv6）\n\t\t\tif host_port:find(\"^%[.*%]:%d+$\") then\n\t\t\t\tserver, port = host_port:match(\"^%[(.*)%]:(%d+)$\")\n\t\t\telse\n\t\t\t\tserver, port = host_port:match(\"^(.-):(%d+)$\")\n\t\t\tend\n\t\t\tif not server or not port then\n\t\t\t\tlog(\"SS 节点服务器信息格式错误:\", host_port)\n\t\t\t\treturn nil\n\t\t\tend\n\n\t\t\t-- 填充 result\n\t\t\tlocal xray_ss_type\n\t\t\tif ss_type == \"ss-rust\" or ss_type == \"ss-libev\" then\n\t\t\t\txray_ss_type = ss_type\n\t\t\telse\n\t\t\t\txray_ss_type = has_ss_rust and \"ss-rust\" or \"ss-libev\"\n\t\t\tend\n\t\t\tresult.type = xray_ss_type\n\t\t\tresult.encrypt_method_ss = method\n\t\t\tresult.password = password\n\t\t\tresult.server = server\n\t\t\tresult.server_port = port\n\n\t\t\t-- 插件处理\n\t\t\tif params.plugin then\n\t\t\t\tlocal plugin_info = UrlDecode(params.plugin)\n\t\t\t\tlocal idx_pn = plugin_info:find(\";\")\n\t\t\t\tif idx_pn then\n\t\t\t\t\tresult.plugin = plugin_info:sub(1, idx_pn - 1)\n\t\t\t\t\tresult.plugin_opts = plugin_info:sub(idx_pn + 1, #plugin_info)\n\t\t\t\telse\n\t\t\t\t\tresult.plugin = plugin_info\n\t\t\t\t\tresult.plugin_opts = \"\"\n\t\t\t\tend\n\t\t\t\t-- 部分机场下发的插件名为 simple-obfs，这里应该改为 obfs-local\n\t\t\t\tif result.plugin == \"simple-obfs\" then\n\t\t\t\t\tresult.plugin = \"obfs-local\"\n\t\t\t\tend\n\t\t\t\t-- 如果插件不为 none，确保 enable_plugin 为 1\n\t\t\t\tif result.plugin ~= \"none\" and result.plugin ~= \"\" then\n\t\t\t\t\tresult.enable_plugin = 1\n\t\t\t\tend\n\t\t\telseif has_ss_type and has_ss_type ~= \"ss-libev\" then\n\t\t\t\tif params[\"shadow-tls\"] then\n\t\t\t\t\t-- 特别处理 shadow-tls 作为插件\n\t\t\t\t\t-- log(\"原始 shadow-tls 参数:\", params[\"shadow-tls\"])\n\t\t\t\t\tlocal decoded_tls = base64Decode(UrlDecode(params[\"shadow-tls\"]))\n\t\t\t\t\t--log(\"SS 节点 shadow-tls 解码后:\", decoded_tls or \"nil\")\n\t\t\t\t\tif decoded_tls then\n\t\t\t\t\t\tlocal ok, st = pcall(jsonParse, decoded_tls)\n\t\t\t\t\t\tif ok and st then\n\t\t\t\t\t\t\tresult.plugin = \"shadow-tls\"\n\t\t\t\t\t\t\tresult.enable_plugin = 1\n\t\t\t\t\t\t\tlocal version_flag = \"\"\n\t\t\t\t\t\t\tif st.version and tonumber(st.version) then\n\t\t\t\t\t\t\t\tversion_flag = string.format(\"v%s=1;\", st.version)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\n\t\t\t\t\t\t\t-- 合成 plugin_opts 格式：v%s=1;host=xxx;password=xxx\n\t\t\t\t\t\t\tresult.plugin_opts = string.format(\"%shost=%s;passwd=%s\",\n\t\t\t\t\t\t\t\tversion_flag,\n\t\t\t\t\t\t\t\tst.host or \"\",\n\t\t\t\t\t\t\t\tst.password or \"\")\n\t\t\t\t\t\telse\n\t\t\t\t\t\t\tlog(\"shadow-tls JSON 解析失败\")\n\t\t\t\t\t\tend\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tif params[\"shadow-tls\"] then\n\t\t\t\t\tlog(\"错误：ShadowSocks-libev 不支持使用 shadow-tls 插件\")\n\t\t\t\t\treturn nil, \"ShadowSocks-libev 不支持使用 shadow-tls 插件\"\n\t\t\t\tend\n\t\t\tend\n\n\t\t\t-- 检查加密方法是否受支持\n\t\t\tif not checkTabValue(encrypt_methods_ss)[method] then\n\t\t\t\t-- 1202 年了还不支持 SS AEAD 的屑机场\n\t\t\t\t-- log(\"不支持的SS加密方法:\", method)\n\t\t\t\tresult.server = nil\n\t\t\tend\n\t\tend\n\telseif szType == \"sip008\" then\n\t\tresult.type = v2_ss\n\t\tif v2_ss ~= \"v2ray\" then\n\t\t\tresult.has_ss_type = has_ss_type\n\t\telse\n\t\t\tresult.xray_has_ss_type = \"v2ray\"\n\t\t\tresult.v2ray_protocol = has_v2_ss_type\n\t\tend\n\t\tresult.server = content.server\n\t\tresult.server_port = content.server_port\n\t\tresult.password = content.password\n\t\tresult.encrypt_method_ss = content.method\n\t\tresult.plugin = content.plugin\n\t\tresult.plugin_opts = content.plugin_opts\n\t\tresult.raw_alias = content.remarks   -- 新增\n\t\tresult.alias = content.remarks       -- 临时赋值（后面会被覆盖）\n\t\tif not checkTabValue(encrypt_methods_ss)[content.method] then\n\t\t\tresult.server = nil\n\t\tend\n\telseif szType == \"ssd\" then\n\t\tresult.type = v2_ss\n\t\tif v2_ss ~= \"v2ray\" then\n\t\t\tresult.has_ss_type = has_ss_type\n\t\telse\n\t\t\tresult.xray_has_ss_type = \"v2ray\"\n\t\t\tresult.v2ray_protocol = has_v2_ss_type\n\t\tend\n\t\tresult.server = content.server\n\t\tresult.server_port = content.port\n\t\tresult.password = content.password\n\t\tresult.encrypt_method_ss = content.method\n\t\tresult.plugin_opts = content.plugin_options\n\t\tlocal raw_alias = \"[\" .. content.airport .. \"] \" .. content.remarks\n\t\tresult.raw_alias = raw_alias   -- 新增\n\t\tresult.alias = raw_alias       -- 临时赋值（后面会被覆盖）\n\t\tif content.plugin == \"simple-obfs\" then\n\t\t\tresult.plugin = \"obfs-local\"\n\t\telse\n\t\t\tresult.plugin = content.plugin\n\t\tend\n\t\tif not checkTabValue(encrypt_methods_ss)[content.encryption] then\n\t\t\tresult.server = nil\n\t\tend\n\telseif szType == \"trojan\" then\n\t\t-- 提取别名（如果存在）\n\t\tlocal alias = \"\"\n\t\tif content:find(\"#\") then\n\t\t\tlocal idx_sp = content:find(\"#\")\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\t\tcontent = content:sub(0, idx_sp - 1)\n\t\tend\n\t\tlocal raw_alias = UrlDecode(alias)\n\t\tresult.raw_alias = raw_alias   -- 新增\n\t\tresult.alias = raw_alias       -- 临时赋值（后面会被覆盖）\n\n\t\t-- 分离和提取 password\t\t\n\t\tlocal Info = content\n\t\tlocal params = {}\n\t\tif Info:find(\"@\") then\n\t\t\tlocal contents = split(Info, \"@\")\n\t\t\tresult.password = UrlDecode(contents[1])\n\t\t\tlocal port = \"443\"\n\t\t\tInfo = (contents[2] or \"\"):gsub(\"/%?\", \"?\")\n\n\t\t\t-- 分离主机和 query 参数（key=value&key2=value2）\n\t\t\tlocal query = split(Info, \"%?\")\n\t\t\tlocal host_port = query[1]\n\t\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\t\tlocal t = split(v, '=')\n\t\t\t\tif #t > 1 then\n\t\t\t\t\tparams[string.lower(t[1])] = UrlDecode(t[2])\n\t\t\t\tend\n\t\t\tend\n\n\t\t\t-- 提取服务器地址和端口\n\t\t\tif host_port:find(\":\") then\n\t\t\t\tlocal sp = split(host_port, \":\")\n\t\t\t\tresult.server_port = sp[#sp]\n\t\t\t\tresult.server = sp[1]\n\t\t\telse\n\t\t\t\tresult.server = host_port\n\t\t\tend\n\n\t\t\t-- 默认设置\n\t\t\t-- 按照官方的建议 默认验证ssl证书\n\t\t\tresult.insecure = \"0\"\n\t\t\tresult.tls = \"1\"\n\n\t\t\t-- 处理参数\n\t\t\tif params.alpn and params.alpn ~= \"\" then\n\t\t\t\t-- 处理 alpn 参数\n\t\t\t\tlocal alpn = {}\n\t\t\t\tfor v in params.alpn:gmatch(\"[^,;|%s]+\") do\n\t\t\t\t\ttable.insert(alpn, v)\n\t\t\t\tend\n\t\t\t\tif #alpn > 0 then\n\t\t\t\t\tresult.tls_alpn = table.concat(alpn, \",\")  -- 确保为字符串\n\t\t\t\tend\n\t\t\tend\n\n\t\t\tif params.peer or params.sni then\n\t\t\t\t-- 未指定peer（sni）默认使用remote addr\n\t\t\t\tresult.tls_host = params.peer or params.sni\n\t\t\tend\n\t\t\t-- 处理 insecure 参数\n\t\t\tif params.allowInsecure or params.allowinsecure or params.insecure then\n\t\t\t\tlocal insecure = params.allowInsecure or params.allowinsecure or params.insecure\n\t\t\t\tif insecure == true or insecure == \"1\" or insecure == \"true\" then\n\t\t\t\t\tresult.insecure = \"1\"\n\t\t\t\tend\n\t\t\tend\n\t\t\tif params.tfo then\n\t\t\t\t-- 处理 fast open 参数\n\t\t\t\tresult.fast_open = params.tfo\n\t\t\tend\n\t\telse\n\t\t\tresult.server_port = port\n\t\tend\n\n\t\t-- 自动决定模式（true=Xray, false=普通 Trojan）\n\t\tlocal xray_tj_mode = false\n\t\tif xray_tj_type == \"v2ray\" then\n\t\t\t-- Xray 模式\n\t\t\tif has_xray then\n\t\t\t\txray_tj_mode = true\n\t\t\telseif has_trojan then\n\t\t\t\txray_tj_mode = false   -- 回退到普通 Trojan\n\t\t\telse\n\t\t\t\txray_tj_mode = nil  -- 两类核心均不存在，停止订阅\n\t\t\tend\n\t\telseif xray_tj_type == \"trojan\" then\n\t\t\t-- 普通 Trojan 模式\n\t\t\tif has_trojan then\n\t\t\t\txray_tj_mode = false\n\t\t\telseif has_xray then\n\t\t\t\txray_tj_mode = true    -- 回退到 Xray\n\t\t\telse\n\t\t\t\txray_tj_mode = nil  -- 两类核心均不存在，停止订阅\n\t\t\tend\n\t\telse\n\t\t\t-- 全局配置为空或 auto，根据链接中是否有 type 参数决定\n\t\t\tlocal has_type = params.type and params.type ~= \"\"\n\t\t\t-- 有 type 参数，优先 Xray\n\t\t\tif has_type then\n\t\t\t\tif has_xray then\n\t\t\t\t\txray_tj_mode = true   -- 有 type 参数使用 Xray\n\t\t\t\telseif has_trojan then\n\t\t\t\t\txray_tj_mode = false  -- 否则普通 Trojan\n\t\t\t\telse\n\t\t\t\t\txray_tj_mode = nil -- 两类核心均不存在，停止订阅\n\t\t\t\tend\n\t\t\telse\n\t\t\t\t-- 无 type 参数，优先普通 Trojan\n\t\t\t\tif has_trojan then\n\t\t\t\t\txray_tj_mode = false  -- 普通 Trojan\n\t\t\t\telseif has_xray then\n\t\t\t\t\txray_tj_mode = true   -- 否则使用 Xray\n\t\t\t\telse\n\t\t\t\t\txray_tj_mode = nil -- 两类核心均不存在，停止订阅\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\n\t\t-- 如果最终无可用核心，跳过该订阅\n\t\tif xray_tj_mode == nil then\n\t\t\treturn nil\n\t\tend\n\n\t\tif xray_tj_mode then\n\t\t\tresult.type = \"v2ray\"\n\t\t\tresult.v2ray_protocol = \"trojan\"\n\t\t\tif params.fp then\n\t\t\t\t-- 处理 fingerprint 参数\n\t\t\t\tresult.fingerprint = params.fp\n\t\t\tend\n\t\t\t-- 处理 ech 参数\n\t\t\tif params.ech and params.ech ~= \"\" then\n\t\t\t\tresult.enable_ech = \"1\"\n\t\t\t\tresult.ech_config = params.ech\n\t\t\tend\n\t\t\t-- 检查 finalmaskg 参数是否存在且非空\n\t\t\tif params.fm and params.fm ~= \"\" then\n\t\t\t\tresult.enable_finalmask = \"1\"\n\t\t\t\tresult.finalmaskg = base64Encode(params.fm)\n\t\t\tend\n\t\t\t-- 处理传输协议\n\t\t\tresult.transport = params.type or \"raw\" -- 默认传输协议为 raw\n\t\t\tif result.transport == \"tcp\" then\n\t\t\t\tresult.transport = \"raw\"\n\t\t\tend\n\t\t\tif result.transport == \"splithttp\" then\n\t\t\t\tresult.transport = \"xhttp\"\n\t\t\tend\n\t\t\tif params.pcs and params.pcs ~= \"\" then\n\t\t\t\tresult.tls_CertSha = params.pcs\n\t\t\tend\n\t\t\tif params.vcn and params.vcn ~= \"\" then\n\t\t\t\tresult.tls_CertByName = params.vcn\n\t\t\tend\n\t\t\tif result.transport == \"ws\" then\n\t\t\t\tresult.ws_host = (result.tls ~= \"1\") and (params.host and UrlDecode(params.host)) or nil\n\t\t\t\tresult.ws_path = params.path and UrlDecode(params.path) or \"/\"\n\t\t\telseif result.transport == \"httpupgrade\" then\n\t\t\t\tresult.httpupgrade_host = (result.tls ~= \"1\") and (params.host and UrlDecode(params.host)) or nil\n\t\t\t\tresult.httpupgrade_path = params.path and UrlDecode(params.path) or \"/\"\n\t\t\telseif result.transport == \"xhttp\" or result.transport == \"splithttp\" then\n\t\t\t\tresult.xhttp_mode = params.mode or \"auto\"\n\t\t\t\tresult.xhttp_host = params.host and UrlDecode(params.host) or nil\n\t\t\t\tresult.xhttp_path = params.path and UrlDecode(params.path) or \"/\"\n\t\t\t\t-- 检查 extra 参数是否存在且非空\n\t\t\t\tif params.extra and params.extra ~= \"\" then\n\t\t\t\t\tresult.enable_xhttp_extra = \"1\"\n\t\t\t\t\tresult.xhttp_extra = base64Encode(params.extra)\n\t\t\t\tend\n\t\t\t\t-- 尝试解析 JSON 数据\n\t\t\t\tlocal success, Data = pcall(jsonParse, params.extra or \"\")\n\t\t\t\tif success and type(Data) == \"table\" then\n\t\t\t\t\tlocal address = (Data.extra and Data.extra.downloadSettings and Data.extra.downloadSettings.address)\n\t\t\t\t\t\tor (Data.downloadSettings and Data.downloadSettings.address)\n\t\t\t\t\tresult.download_address = (address and address ~= \"\") and address:gsub(\"^%[\", \"\"):gsub(\"%]$\", \"\")\n\t\t\t\telse\n\t\t\t\t\t-- 如果解析失败，清空下载地址\n\t\t\t\t\tresult.download_address = nil\n\t\t\t\tend\n\t\t\telseif result.transport == \"http\" or result.transport == \"h2\" then\n\t\t\t\tresult.transport = \"h2\"\n\t\t\t\tresult.h2_host = params.host and UrlDecode(params.host) or nil\n\t\t\t\tresult.h2_path = params.path and UrlDecode(params.path) or nil\n\t\t\telseif result.transport == \"kcp\" then\n\t\t\t\tresult.kcp_guise = params.headerType or \"none\"\n\t\t\t\tif params.headerType and params.headerType == \"dns\" then\n\t\t\t\t\tresult.kcp_domain = params.host or \"\"\n\t\t\t\tend\n\t\t\t\tresult.seed = params.seed\n\t\t\telseif result.transport == \"quic\" then\n\t\t\t\tresult.quic_guise = params.headerType or \"none\"\n\t\t\t\tresult.quic_security = params.quicSecurity or \"none\"\n\t\t\t\tresult.quic_key = params.key\n\t\t\telseif result.transport == \"grpc\" then\n\t\t\t\tresult.serviceName = params.serviceName\n\t\t\t\tresult.grpc_mode = params.mode or \"gun\"\n\t\t\telseif result.transport == \"tcp\" or result.transport == \"raw\" then\n\t\t\t\tresult.tcp_guise = params.headerType and params.headerType ~= \"\" and params.headerType or \"none\"\n\t\t\t\tif result.tcp_guise == \"http\" then\n\t\t\t\t\tresult.tcp_host = params.host and UrlDecode(params.host) or nil\n\t\t\t\t\tresult.tcp_path = params.path and UrlDecode(params.path) or nil\n\t\t\t\tend\n\t\t\tend\n\t\telse\n\t\t\tresult.type = \"trojan\"\n\t\tend\n\telseif szType == \"vless\" then\n\t\tlocal url = URL.parse(\"http://\" .. content)\n\t\tlocal params = url.query\n\n\t\tlocal raw_alias = url.fragment and UrlDecode(url.fragment) or nil\n\t\tresult.raw_alias = raw_alias   -- 新增\n\t\tresult.alias = raw_alias       -- 临时赋值（后面会被覆盖）\n\t\tresult.type = \"v2ray\"\n\t\tresult.v2ray_protocol = \"vless\"\n\t\tresult.server = url.host\n\t\tresult.server_port = url.port\n\t\tresult.vmess_id = url.user\n\t\tresult.vless_encryption = params.encryption or \"none\"\n\n\t\t-- 处理传输类型\n\t\tresult.transport = params.type or \"raw\"\n\t\tif result.transport == \"tcp\" then\n\t\t\tresult.transport = \"raw\"\n\t\telseif result.transport == \"splithttp\" then\n\t\t\tresult.transport = \"xhttp\"\n\t\telseif result.transport == \"http\" then\n\t\t\tresult.transport = \"h2\"\n\t\tend\n\n\t\t-- TLS / Reality 标志\n\t\tlocal security = params.security or \"\"\n\t\tresult.tls = (security == \"tls\" or security == \"xtls\") and \"1\" or \"0\"\n\t\tresult.reality = (security == \"reality\") and \"1\" or \"0\"\n\n\t\t-- 统一 TLS / Reality 公共字段\n\t\tresult.tls_host = params.sni\n\t\tresult.fingerprint = params.fp\n\t\tresult.tls_flow = params.flow or nil\n\n\t\t-- 处理 alpn 列表\n\t\tif params.alpn and params.alpn ~= \"\" then\n\t\t\tlocal alpn = {}\n\t\t\tfor v in params.alpn:gmatch(\"[^,;|%s]+\") do\n\t\t\t\ttable.insert(alpn, v)\n\t\t\tend\n\t\t\tif #alpn > 0 then\n\t\t\t\tresult.tls_alpn = table.concat(alpn, \",\")  -- 确保为字符串\n\t\t\tend\n\t\tend\n\n\t\t-- 处理 insecure 参数\n\t\tif params.allowInsecure or params.insecure then\n\t\t\tlocal insecure = params.allowInsecure or params.insecure\n\t\t\tif insecure == true or insecure == \"1\" or insecure == \"true\" then\n\t\t\t\tresult.insecure = \"1\"\n\t\t\tend\n\t\tend\n\n\t\t-- ECH 参数（TLS 才有）\n\t\tif security == \"tls\" and params.ech and params.ech ~= \"\" then\n\t\t\tresult.enable_ech = \"1\"\n\t\t\tresult.ech_config = params.ech\n\t\tend\n\n\t\t-- 处理 finalmask 参数\n\t\tif params.fm and params.fm ~= \"\" then\n\t\t\tresult.enable_finalmask = \"1\"\n\t\t\tresult.finalmask = base64Encode(params.fm)\n\t\tend\n\n\t\t-- 处理 pinsha256 参数\n\t\tif params.pcs and params.pcs ~= \"\" then\n\t\t\tresult.tls_CertSha = params.pcs\n\t\tend\n\n\t\t-- 处理 Leaf Certificate Name 参数\n\t\tif params.vcn and params.vcn ~= \"\" then\n\t\t\tresult.tls_CertByName = params.vcn\n\t\tend\n\n\t\t-- Reality 参数\n\t\tif security == \"reality\" then\n\t\t\tresult.reality_publickey = params.pbk and UrlDecode(params.pbk) or nil\n\t\t\tresult.reality_shortid = params.sid\n\t\t\tresult.reality_spiderx = params.spx and UrlDecode(params.spx) or nil\n\n\t\t\t-- PQV 验证参数\n\t\t\tif params.pqv and params.pqv ~= \"\" then\n\t\t\t\tresult.enable_mldsa65verify = \"1\"\n\t\t\t\tresult.reality_mldsa65verify = params.pqv\n\t\t\tend\n\t\tend\n\n\t\t-- 各种传输类型\n\t\tif result.transport == \"ws\" then\n\t\t\tresult.ws_host = (result.tls ~= \"1\" and result.reality ~= \"1\") and (params.host and UrlDecode(params.host)) or nil\n\t\t\tresult.ws_path = params.path and UrlDecode(params.path) or \"/\"\n\t\telseif result.transport == \"httpupgrade\" then\n\t\t\tresult.httpupgrade_host = (result.tls ~= \"1\" and result.reality ~= \"1\") and (params.host and UrlDecode(params.host)) or nil\n\t\t\tresult.httpupgrade_path = params.path and UrlDecode(params.path) or \"/\"\n\t\telseif result.transport == \"xhttp\" then\n\t\t\tresult.xhttp_mode = params.mode or \"auto\"\n\t\t\tresult.xhttp_host = params.host and UrlDecode(params.host) or nil\n\t\t\tresult.xhttp_path = params.path and UrlDecode(params.path) or \"/\"\n\t\t\tif params.tfo then\n\t\t\t\t-- 处理 fast open 参数\n\t\t\t\tresult.fast_open = params.tfo\n\t\t\tend\n\t\t\tif params.extra and params.extra ~= \"\" then\n\t\t\t\tresult.enable_xhttp_extra = \"1\"\n\t\t\t\tresult.xhttp_extra = base64Encode(params.extra)\n\t\t\tend\n\t\t\tlocal success, Data = pcall(jsonParse, params.extra or \"\")\n\t\t\tif success and type(Data) == \"table\" then\n\t\t\t\tlocal address = (Data.extra and Data.extra.downloadSettings and Data.extra.downloadSettings.address)\n\t\t\t\t\tor (Data.downloadSettings and Data.downloadSettings.address)\n\t\t\t\tresult.download_address = (address and address ~= \"\") and address:gsub(\"^%[\", \"\"):gsub(\"%]$\", \"\")\n\t\t\telse\n\t\t\t\tresult.download_address = nil\n\t\t\tend\n\t\telseif result.transport == \"h2\" then\n\t\t\tresult.h2_host = params.host and UrlDecode(params.host) or nil\n\t\t\tresult.h2_path = params.path and UrlDecode(params.path) or nil\n\t\telseif result.transport == \"kcp\" then\n\t\t\tresult.kcp_guise = params.headerType or \"none\"\n\t\t\tif params.headerType and params.headerType == \"dns\" then\n\t\t\t\tresult.kcp_domain = params.host or \"\"\n\t\t\tend\n\t\t\tresult.seed = params.seed\n\t\telseif result.transport == \"quic\" then\n\t\t\tresult.quic_guise = params.headerType or \"none\"\n\t\t\tresult.quic_security = params.quicSecurity or \"none\"\n\t\t\tresult.quic_key = params.key\n\t\telseif result.transport == \"grpc\" then\n\t\t\tresult.serviceName = params.serviceName\n\t\t\tresult.grpc_mode = params.mode or \"gun\"\n\t\telseif result.transport == \"raw\" then\n\t\t\tresult.tcp_guise = params.headerType or \"none\"\n\t\t\tif result.tcp_guise == \"http\" then\n\t\t\t\tresult.tcp_host = params.host and UrlDecode(params.host) or nil\n\t\t\t\tresult.tcp_path = params.path and UrlDecode(params.path) or nil\n\t\t\tend\n\t\tend\n\telseif szType == \"tuic\" then\n\t\t-- 提取别名（如果存在）\n\t\tlocal alias = \"\"\n\t\tif content:find(\"#\") then\n\t\t\tlocal idx_sp = content:find(\"#\")\n\t\t\talias = content:sub(idx_sp + 1, -1)\n\t\t\tcontent = content:sub(0, idx_sp - 1)\n\t\tend\n\t\tlocal raw_alias = UrlDecode(alias)\n\t\tresult.raw_alias = raw_alias   -- 新增\n\t\tresult.alias = raw_alias       -- 临时赋值（后面会被覆盖）\n\n\t\t-- 分离和提取 uuid 和 password\n\t\tlocal Info = content\n\t\tif Info:find(\"@\") then\n\t\t\tlocal contents = split(Info, \"@\")\n\t\t\tlocal userinfo_raw = UrlDecode(contents[1] or \"\") -- 如有Url编码进行解码\n\t\t\tif userinfo_raw:find(\":\") then\n\t\t\t\tlocal userinfo = split(userinfo_raw, \":\")\n\t\t\t\tresult.tuic_uuid = userinfo[1]\n\t\t\t\tresult.tuic_passwd = userinfo[2]\n\t\t\tend\n\t\t\tInfo = (contents[2] or \"\"):gsub(\"/%?\", \"?\")\n\t\tend\n\n\t\t-- 分离主机和 query 参数（key=value&key2=value2）\n\t\tlocal query = split(Info, \"%?\")\n\t\tlocal host_port = query[1]\n\t\tlocal params = {}\n\t\tfor _, v in pairs(split(query[2], '&')) do\n\t\t\tlocal t = split(v, '=')\n\t\t\tif #t > 1 then\n\t\t\t\tparams[string.lower(t[1])] = UrlDecode(t[2])\n\t\t\tend\n\t\tend\n\n\t\t-- 提取服务器地址和端口\n\t\tif host_port:find(\":\") then\n\t\t\tlocal sp = split(host_port, \":\")\n\t\t\tresult.server_port = sp[#sp]\n\t\t\tresult.server = sp[1]\n\t\telse\n\t\t\tresult.server = host_port\n\t\tend\n\n\t\tresult.type = tuic_type\n\t\tresult.tuic_ip = params.ip or \"\"\n\t\tresult.udp_relay_mode = params.udp_relay_mode or \"native\"\n\t\tresult.congestion_control = params.congestion_control or \"cubic\"\n\t\tresult.heartbeat = params.heartbeat or \"3\"\n\t\tresult.timeout = params.timeout or \"8\"\n\t\tresult.gc_interval = params.gc_interval or \"3\"\n\t\tresult.gc_lifetime = params.gc_lifetime or \"15\"\n\t\tresult.send_window = params.send_window or \"20971520\"\n\t\tresult.receive_window = params.receive_window or \"10485760\"\n\t\tresult.tuic_max_package_size = params.max_packet_size or \"1500\"\n\n\t\t-- alpn 支持逗号或分号分隔\n\t\tif params.alpn and params.alpn ~= \"\" then\n\t\t\tlocal alpn = {}\n\t\t\tfor v in params.alpn:gmatch(\"[^,;|%s]+\") do\n\t\t\t\ttable.insert(alpn, v)\n\t\t\tend\n\t\t\tif #alpn > 0 then\n\t\t\t\tresult.tls_alpn = table.concat(alpn, \",\")  -- 确保为字符串\n\t\t\tend\n\t\tend\n\n\t\t-- 处理 disable_sni 参数\n\t\tif params.disable_sni then\n\t\t\tif params.disable_sni == \"1\" or params.disable_sni == \"0\" then\n\t\t\t\tresult.disable_sni = params.disable_sni\n\t\t\telse\n\t\t\t\tresult.disable_sni = string.lower(params.disable_sni) == \"true\" and \"1\" or \"0\"\n\t\t\tend\n\t\tend\n\n\t\t-- 处理 zero_rtt_handshake 参数\n\t\tif params.zero_rtt_handshake then\n\t\t\tif params.zero_rtt_handshake == \"1\" or params.zero_rtt_handshake == \"0\" then\n\t\t\t\tresult.zero_rtt_handshake = params.zero_rtt_handshake\n\t\t\telse\n\t\t\t\tresult.zero_rtt_handshake = string.lower(params.zero_rtt_handshake) == \"true\" and \"1\" or \"0\"\n\t\t\tend\n\t\tend\n\n\t\t-- 处理 dual_stack 参数\n\t\tif params.dual_stack then\n\t\t\tif params.dual_stack == \"1\" or params.dual_stack == \"0\" then\n\t\t\t\tresult.dual_stack = params.dual_stack\n\t\t\telse\n\t\t\t\tresult.dual_stack = string.lower(params.dual_stack) == \"true\" and \"1\" or \"0\"\n\t\t\tend\n\t\t\t-- 处理 ipstack_prefer 参数\n\t\t\tif params.ipstack_prefer and params.ipstack_prefer ~= \"\" then\n\t\t\t\tresult.ipstack_prefer = params.ipstack_prefer\n\t\t\tend\n\t\tend\n\n\t\t-- 兼容 allowInsecure / allowlnsecure / insecure\n\t\tif params.allowInsecure or params.allowlnsecure or params.insecure then\n\t\t\tlocal insecure = params.allowInsecure or params.allowlnsecure or params.insecure\n\t\t\tif insecure == true or insecure == \"1\" or insecure == \"true\" then\n\t\t\t\tresult.insecure = \"1\"\n\t\t\tend\n\t\tend\n\tend\n\n\tif not result.alias then\n\t\tif result.server and result.server_port then\n\t\t\tresult.alias = result.server .. ':' .. result.server_port\n\t\telse\n\t\t\tresult.alias = \"NULL\"\n\t\tend\n\t\tresult.raw_alias = result.alias\n\tend\n\t-- alias 不参与 hashkey 计算\n\tlocal alias = result.alias\n\tresult.alias = nil\n\tlocal switch_enable = result.switch_enable\n\tresult.switch_enable = nil\n\tresult.hashkey = md5(jsonStringify(result) .. \"_\" .. (alias or \"\"))\n\tresult.alias = alias\n\tresult.switch_enable = switch_enable\n\treturn result\nend\n\n-- 计算、储存和读取 md5 值\n-- 计算 md5 值\nlocal function md5_string(data)\n\t-- 生成临时文件名\n\tlocal tmp = \"/tmp/md5_tmp_\" .. os.time() .. \"_\" .. math.random(1000,9999) -- os.time 保证每秒唯一，但不足以避免全部冲突；math.random(1000,9999) 增加文件名唯一性，避免并发时冲突\n\tnixio.fs.writefile(tmp, data) -- 写入临时文件\n\t-- 执行 md5sum 命令\n\tlocal md5 = luci.sys.exec(string.format('md5sum \"%s\" 2>/dev/null | cut -d \" \" -f1', tmp)):gsub(\"%s+\", \"\")\n\tnixio.fs.remove(tmp) -- 删除临时文件\n\treturn md5\nend\n\n-- 返回临时文件路径，用来存储订阅的 MD5 值，以便判断订阅内容是否发生变化。\nlocal function get_md5_path(groupHash)\n\treturn \"/tmp/sub_md5_\" .. groupHash\nend\n\n-- 读取上次订阅时记录的 MD5 值，以便和当前内容的 MD5 进行对比，从而判断是否需要更新节点列表。\nlocal function read_old_md5(groupHash)\n\tlocal path = get_md5_path(groupHash)\n\tif nixio.fs.access(path) then\n\t\treturn trim(nixio.fs.readfile(path) or \"\")\n\tend\n\treturn \"\"\nend\n\n-- 将订阅分组最新内容的 MD5 值保存到对应的临时文件中，以便下次更新时进行对比。\nlocal function write_new_md5(groupHash, md5)\n\tnixio.fs.writefile(get_md5_path(groupHash), md5)\nend\n\n-- curl\nlocal function curl(url, user_agent)\n\tif not url or url == \"\" then\n\t\treturn \"\", nil\n\tend\n\n\t-- 清理 URL\n\turl = url:gsub(\"%s+$\", \"\"):gsub(\"^%s+\", \"\"):gsub(\"%z\", \"\"):gsub(\"[\\r\\n]\", \"\")\n\n\t-- 处理 user_agent 参数\n\tlocal ua_opt = \"\"\n\tif user_agent and user_agent ~= \"\" then\n\t\t-- 安全 shell quoting\n\t\tlocal safe_ua = string.format(\"%q\", user_agent)\n\t\tua_opt = \"-A \" .. safe_ua\n\telse\n\t\t-- 默认 UA（避免被拦）\n\t\tua_opt = '-A \"Mozilla/5.0\"'\n\tend\n\n\tlocal cmd = string.format(\n\t\t'curl -fskL --retry 3 --connect-timeout 3 --max-time 30 ' ..\n\t\t'-H \"Accept-Encoding: identity\" %s ' ..\n\t\t'-w \"%%{http_code}\" \"%s\"',\n\t\tua_opt,\n\t\turl\n\t)\n\n\tlocal result = luci.sys.exec(cmd) or \"\"\n\tresult = trim(result)\n\n\tif result == \"\" then\n\t\treturn \"\", nil\n\tend\n\n\t-- 解析 HTTP code（最后3位）\n\tlocal stdout = result:sub(1, -4)\n\tlocal code = tonumber(result:sub(-3))\n\n\tif code ~= 200 then\n\t\treturn \"\", code\n\tend\n\n\tlocal md5 = md5_string(stdout)\n\treturn stdout, md5\nend\n\nlocal function check_filer(result)\n\t-- 过滤的关键词列表\n\tlocal filter_word = split(filter_words, \"/\")\n\t-- 保留的关键词列表\n\tlocal check_save = false\n\tif save_words ~= nil and save_words ~= \"\" and save_words ~= \"NULL\" then\n\t\tcheck_save = true\n\tend\n\tlocal save_word = split(save_words, \"/\")\n\n\t-- 检查结果\n\tlocal filter_result = false\n\tlocal save_result = true\n\n\t-- 检查是否存在过滤关键词\n\tfor i, v in pairs(filter_word) do\n\t\tif tostring(result.alias):find(v, nil, true) then\n\t\t\tfilter_result = true\n\t\tend\n\tend\n\n\t-- 检查是否打开了保留关键词检查，并且进行过滤\n\tif check_save == true then\n\t\tfor i, v in pairs(save_word) do\n\t\t\tif tostring(result.alias):find(v, nil, true) then\n\t\t\t\tsave_result = false\n\t\t\tend\n\t\tend\n\telse\n\t\tsave_result = false\n\tend\n\n\t-- 不等时返回\n\tif filter_result == true or save_result == true then\n\t\treturn true\n\telse\n\t\treturn false\n\tend\nend\n\n-- 加载订阅未变化的节点用于防止被误删\nlocal function loadOldNodes(groupHash)\n\tlocal nodes = {}\n\tcache[groupHash] = {}\n\tnodeResult[#nodeResult + 1] = nodes\n\tlocal index = #nodeResult\n\n\tucic:foreach(name, uciType, function(s)\n\t\tif s.grouphashkey == groupHash and s.hashkey then\n\t\t\tlocal section = setmetatable({}, {__index = s})\n\t\t\tnodes[s.hashkey] = section\n\t\t\tcache[groupHash][s.hashkey] = section\n\t\tend\n\tend)\nend\n\nlocal execute = function()\n\tlocal updated = false\n\tlocal service_stopped = false\n\tfor k, url in ipairs(subscribe_url) do\n\t\tlocal raw, new_md5 = curl(url)\n\t\tlog(\"raw 长度: \"..#raw)\n\t\tlocal groupHash = md5(url)\n\t\tlocal old_md5 = read_old_md5(groupHash)\n\n\t\tlog(\"处理订阅: \" .. url)\n\t\tlog(\"groupHash: \" .. groupHash)\n\t\tlog(\"old_md5: \" .. tostring(old_md5))\n\t\tlog(\"new_md5: \" .. tostring(new_md5))\n\n\t\tif #raw > 0 then\n\t\t\tif old_md5 and new_md5 == old_md5 then\n\t\t\t\tlog(\"订阅未变化, 跳过无需更新的订阅: \" .. url)\n\t\t\t\t-- 防止 diff 阶段误删未更新订阅节点\n\t\t\t\tloadOldNodes(groupHash)\n\t\t\t\t--ucic:foreach(name, uciType, function(s)\n\t\t\t\t--\tif s.grouphashkey == groupHash and s.hashkey then\n\t\t\t\t--\t\tcache[groupHash][s.hashkey] = s\n\t\t\t\t--\t\ttinsert(nodeResult[index], s)\n\t\t\t\t--\tend\n\t\t\t\t--end)\n\t\t\telse\n\t\t\t\tupdated = true\n\t\t\t\t-- 保存更新后的 MD5 值到以 groupHash 为标识的临时文件中，用于下次订阅更新时进行对比\n\t\t\t\twrite_new_md5(groupHash, new_md5)\n\n\t\t\t\t-- 暂停服务（仅当 MD5 有变化时才执行）\n\t\t\t\tif proxy == '0' and not service_stopped then\n\t\t\t\t\tlog('服务正在暂停')\n\t\t\t\t\tluci.sys.init.stop(name)\n\t\t\t\t\tservice_stopped = true\n\t\t\t\tend\n\n\t\t\t\tcache[groupHash] = {}\n\t\t\t\ttinsert(nodeResult, {})\n\t\t\t\tlocal index = #nodeResult\n\t\t\t\tlocal nodes, szType\n\n\t\t\t\t-- SSD 似乎是这种格式 ssd:// 开头的\n\t\t\t\tif raw:find('ssd://') then\n\t\t\t\t\tszType = 'ssd'\n\t\t\t\t\tlocal nEnd = select(2, raw:find('ssd://'))\n\t\t\t\t\tnodes = base64Decode(raw:sub(nEnd + 1, #raw))\n\t\t\t\t\tnodes = jsonParse(nodes)\n\t\t\t\t\tlocal extra = {\n\t\t\t\t\t\tairport = nodes.airport,\n\t\t\t\t\t\tport = nodes.port,\n\t\t\t\t\t\tencryption = nodes.encryption,\n\t\t\t\t\t\tpassword = nodes.password\n\t\t\t\t\t}\n\t\t\t\t\tlocal servers = {}\n\t\t\t\t\t-- SS里面包着 干脆直接这样\n\t\t\t\t\tfor _, server in ipairs(nodes.servers or {}) do\n\t\t\t\t\t\ttinsert(servers, setmetatable(server, {__index = extra}))\n\t\t\t\t\tend\n\t\t\t\t\tnodes = servers\n\t\t\t\t-- SS SIP008 直接使用 Json 格式\n\t\t\t\telseif jsonParse(raw) then\n\t\t\t\t\tnodes = jsonParse(raw).servers or jsonParse(raw)\n\t\t\t\t\tif nodes[1] and nodes[1].server and nodes[1].method then\n\t\t\t\t\t\tszType = 'sip008'\n\t\t\t\t\tend\n\t\t\t\t-- 其他 base64 格式\n\t\t\t\telse\n\t\t\t\t\t-- ssd 外的格式\n\t\t\t\t\tnodes = split(base64Decode(raw):gsub(\"\\r\\n\", \"\\n\"), \"\\n\")\n\t\t\t\tend\n\n\t\t\t\t-- 临时存储该订阅解析出的节点（带原始别名）\n\t\t\t\tlocal groupRawNodes = {}\n\n\t\t\t\tfor _, v in ipairs(nodes) do\n\t\t\t\t\tif v and not string.match(v, \"^%s*$\") then\n\t\t\t\t\t\txpcall(function()\n\t\t\t\t\t\t\tlocal result\n\t\t\t\t\t\t\tif szType then\n\t\t\t\t\t\t\t\tresult = processData(szType, v)\n\t\t\t\t\t\t\telseif not szType then\n\t\t\t\t\t\t\t\tlocal node = trim(v)\n\t\t\t\t\t\t\t\t-- 一些奇葩的链接用\"&amp;\"、\"&lt;\"当做\"&\"，\"#\"前后带空格\n\t\t\t\t\t\t\t\tlocal link = node:gsub(\"&[a-zA-Z]+;\", \"&\"):gsub(\"%s*#%s*\", \"#\")\n\t\t\t\t\t\t\t\tlocal dat = split(link, \"://\")\n\t\t\t\t\t\t\t\tif dat and dat[1] and dat[2] then\n\t\t\t\t\t\t\t\t\tlocal dat3 = \"\"\n\t\t\t\t\t\t\t\t\tif dat[3] then\n\t\t\t\t\t\t\t\t\t\tdat3 = \"://\" .. dat[3]\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\t\tif dat[1] == 'ss' or dat[1] == 'trojan' or dat[1] == 'tuic' then\n\t\t\t\t\t\t\t\t\t\tresult = processData(dat[1], dat[2] .. dat3)\n\t\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t\tresult = processData(dat[1], base64Decode(dat[2]))\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\tlog('跳过未知类型: ' .. szType)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t-- log(result)\n\t\t\t\t\t\t\tif result then\n\t\t\t\t\t\t\t\t-- 中文做地址的 也没有人拿中文域名搞，就算中文域也有Puny Code SB 机场\n\t\t\t\t\t\t\t\tif not result.server or not result.server_port\n\t\t\t\t\t\t\t\t\tor result.server == \"127.0.0.1\"\n\t\t\t\t\t\t\t\t\tor result.alias == \"NULL\"\n\t\t\t\t\t\t\t\t\tor check_filer(result)\n\t\t\t\t\t\t\t\t\tor result.server:match(\"[^0-9a-zA-Z%-_%.%s]\")\n\t\t\t\t\t\t\t\t\tor cache[groupHash][result.hashkey] then\n\t\t\t\t\t\t\t\t\tlog('丢弃无效节点: ' .. result.alias)\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\t-- 暂存节点\n\t\t\t\t\t\t\t\t\ttable.insert(groupRawNodes, result)\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend, function(err)\n\t\t\t\t\t\t\tlog(string.format(\"解析节点出错: %s\\n原始数据: %s\", tostring(err), tostring(v)))\n\t\t\t\t\t\tend)\n\t\t\t\t\tend\n\t\t\t\tend\n\n\t\t\t\t-- 对该组节点进行别名编号：重复节点加后缀，唯一节点不加\n\t\t\t\tlocal freq = {}\n\t\t\t\tfor _, node in ipairs(groupRawNodes) do\n\t\t\t\t\tlocal raw = node.raw_alias or \"\"\n\t\t\t\t\tfreq[raw] = (freq[raw] or 0) + 1\n\t\t\t\tend\n\t\t\t\tlocal aliasCount = {}\n\t\t\t\tfor _, node in ipairs(groupRawNodes) do\n\t\t\t\t\tlocal raw = node.raw_alias or \"\"\n\t\t\t\t\tif freq[raw] > 1 then\n\t\t\t\t\t\tlocal count = (aliasCount[raw] or 0) + 1\n\t\t\t\t\t\taliasCount[raw] = count\n\t\t\t\t\t\tnode.alias = raw .. \"_\" .. count\n\t\t\t\t\telse\n\t\t\t\t\t\tnode.alias = raw\n\t\t\t\t\tend\n\t\t\t\t\t-- 清理临时字段\n\t\t\t\t\tnode.raw_alias = nil\n\t\t\t\t\t-- 存入 nodeResult\n\t\t\t\t\tnode.grouphashkey = groupHash\n\t\t\t\t\ttable.insert(nodeResult[index], node)\n\t\t\t\t\tcache[groupHash][node.hashkey] = node\n\t\t\t\tend\n\n\t\t\t\tlog('成功解析节点数量: ' .. #groupRawNodes)\n\t\t\tend\n\t\telse\n\t\t\tlog(url .. ': 获取内容为空')\n\t\tend\n\tend\n\t-- 输出日志并判断是否需要进行 diff\n\tif not updated then\n\t\tlog(\"订阅未变化，无需更新节点信息。\")\n\t\tlog('保留手动添加的节点。')\n\t\treturn\n\tend\n\n\t-- diff 阶段\n\tif next(nodeResult) == nil then\n\t\tlog(\"更新失败，没有可用的节点信息\")\n\t\tif proxy == '0' then\n\t\t\tluci.sys.init.start(name)\n\t\t\tlog('订阅失败, 恢复服务')\n\t\tend\n\t\treturn\n\tend\n\tlocal add, del = 0, 0\n\tucic:foreach(name, uciType, function(old)\n\t\tif old.grouphashkey or old.hashkey then -- 没有 hash 的不参与删除\n\t\t\tif not nodeResult[old.grouphashkey] or not nodeResult[old.grouphashkey][old.hashkey] then\n\t\t\t\tucic:delete(name, old['.name'])\n\t\t\t\tdel = del + 1\n\t\t\telse\n\t\t\t\tlocal dat = nodeResult[old.grouphashkey][old.hashkey]\n\t\t\t\tucic:tset(name, old['.name'], dat)\n\t\t\t\t-- 标记一下\n\t\t\t\tsetmetatable(nodeResult[old.grouphashkey][old.hashkey], {__index = {_ignore = true}})\n\t\t\tend\n\t\telse\n\t\t\tif not old.alias then\n\t\t\t\tif old.server or old.server_port then\n\t\t\t\t\told.alias = old.server .. ':' .. old.server_port\n\t\t\t\t\tlog('忽略手动添加的节点: ' .. old.alias)\n\t\t\t\telse\n\t\t\t\t\tucic:delete(name, old['.name'])\n\t\t\t\tend\n\t\t\telse\n\t\t\t\tlog('忽略手动添加的节点: ' .. old.alias)\n\t\t\tend\n\t\tend\n\tend)\n\t-- 1615-1653 行为生成 sid\n\t-- 记录已使用编号\n\tlocal used_sid = {}\n\tlocal next_sid = 1\n\t-- 扫描已有 section\n\tucic:foreach(name, uciType, function(s)\n\t\tlocal num = s[\".name\"]:match(\"^cfg(%x%x)\")  -- 提取两位十六进制序号\n\t\tif num then\n\t\t\tlocal n = tonumber(num, 16)\n\t\t\tused_sid[n] = true\n\t\tend\n\tend)\n\t-- 获取下一个可用编号（O(1)）\n\tlocal function get_next_sid()\n\t\twhile used_sid[next_sid] do\n\t\t\tnext_sid = next_sid + 1\n\t\tend\n\t\tused_sid[next_sid] = true\n\t\treturn next_sid\n\tend\n\n\tfor _, v in ipairs(nodeResult) do\n\t\tfor _, vv in ipairs(v) do\n\t\t\tif not vv._ignore then\n\t\t\t\tlocal sid = ucic:add(name, uciType)\n\t\t\t\tif sid then\n\t\t\t\t\tlocal suffix = sid:sub(-4)\n\t\t\t\t\tucic:delete(name, sid)\n\t\t\t\t\tlocal id = get_next_sid()\n\t\t\t\t\tlocal cfgid = string.format(\"cfg%02x%s\", id, suffix)\n\t\t\t\t\tlocal section = ucic:section(name, uciType, cfgid)\n\t\t\t\t\tif section then\n\t\t\t\t\t\tucic:tset(name, section, vv)\n\t\t\t\t\t\tucic:set(name, section, \"switch_enable\", switch)\n\t\t\t\t\t\t-- 为 Xray 节点添加域名解析配置\n\t\t\t\t\t\tif vv.type == \"v2ray\" then\n\t\t\t\t\t\t\tif domain_resolver and domain_resolver ~= \"\" then\n\t\t\t\t\t\t\t\tucic:set(name, section, \"domain_resolver\", domain_resolver)\n\t\t\t\t\t\t\t\tif domain_resolver == \"https\" then\n\t\t\t\t\t\t\t\t\tif domain_resolver_dns_https and domain_resolver_dns_https ~= \"\" then\n\t\t\t\t\t\t\t\t\t\tucic:set(name, section, \"domain_resolver_dns_https\", domain_resolver_dns_https)\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\telse\n\t\t\t\t\t\t\t\t\tif domain_resolver_dns and domain_resolver_dns ~= \"\" then\n\t\t\t\t\t\t\t\t\t\tucic:set(name, section, \"domain_resolver_dns\", domain_resolver_dns)\n\t\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\t\tif domain_strategy and domain_strategy ~= \"\" then\n\t\t\t\t\t\t\t\tucic:set(name, section, \"domain_strategy\", domain_strategy)\n\t\t\t\t\t\t\tend\n\t\t\t\t\t\tend\n\t\t\t\t\t\tadd = add + 1\n\t\t\t\t\tend\n\t\t\t\tend\n\t\t\tend\n\t\tend\n\tend\n\tucic:commit(name)\n\t-- 如果原有服务器节点已经不见了就尝试换为第一个节点\n\tlocal globalServer = ucic:get_first(name, 'global', 'global_server', '')\n\tif globalServer ~= \"nil\" then\n\t\tlocal firstServer = ucic:get_first(name, uciType)\n\t\tif firstServer then\n\t\t\tif not ucic:get(name, globalServer) then\n\t\t\t\tluci.sys.call(\"/etc/init.d/\" .. name .. \" stop > /dev/null 2>&1 &\")\n\t\t\t\tucic:commit(name)\n\t\t\t\tucic:set(name, ucic:get_first(name, 'global'), 'global_server', firstServer)\n\t\t\t\tucic:commit(name)\n\t\t\t\tlog('当前主服务器节点已被删除，正在自动更换为第一个节点。')\n\t\t\t\tluci.sys.call(\"/etc/init.d/\" .. name .. \" start > /dev/null 2>&1 &\")\n\t\t\telse\n\t\t\t\tlog('维持当前主服务器节点。')\n\t\t\t\tluci.sys.call(\"/etc/init.d/\" .. name .. \" restart > /dev/null 2>&1 &\")\n\t\t\tend\n\t\telse\n\t\t\tlog('没有服务器节点了，停止服务')\n\t\t\tluci.sys.call(\"/etc/init.d/\" .. name .. \" stop > /dev/null 2>&1 &\")\n\t\tend\n\tend\n\tlog('新增节点数量: ' .. add .. ', 删除节点数量: ' .. del)\n\tlog('订阅更新成功')\nend\n\nif subscribe_url and #subscribe_url > 0 then\n\txpcall(execute, function(e)\n\t\tlog(e)\n\t\tlog(debug.traceback())\n\t\tlog('发生错误, 正在恢复服务')\n\t\tlocal firstServer = ucic:get_first(name, uciType)\n\t\tif firstServer then\n\t\t\tluci.sys.call(\"/etc/init.d/\" .. name .. \" restart > /dev/null 2>&1 &\") -- 不加&的话日志会出现的更早\n\t\t\tlog('重启服务成功')\n\t\telse\n\t\t\tluci.sys.call(\"/etc/init.d/\" .. name .. \" stop > /dev/null 2>&1 &\") -- 不加&的话日志会出现的更早\n\t\t\tlog('停止服务成功')\n\t\tend\n\tend)\nend\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/usr/share/shadowsocksr/update.lua",
    "content": "#!/usr/bin/lua\n\n------------------------------------------------\n-- This file is part of the luci-app-ssr-plus update.lua\n-- By Mattraks\n------------------------------------------------\nrequire \"luci.sys\"\nrequire \"luci.model.uci\"\nlocal icount = 0\nlocal args = arg[1]\nlocal uci = require \"luci.model.uci\".cursor()\n\n-- 以下设置更新数据库至 DNSMASQ 配置路径\n-- 获取 DNSMASQ 配置 ID\nlocal DNSMASQ_UCI_CONFIG = uci:get_first(\"dhcp\", \"dnsmasq\", \".name\")\n\n-- 获取 DNSMASQ 默认配置文件\nlocal DNSMASQ_CONF_PATH = \"/tmp/etc/dnsmasq.conf.\" .. DNSMASQ_UCI_CONFIG\n\n-- 检查 DNSMASQ 配置文件是否存在，如果存在则提取 conf-dir\nfor line in io.lines(DNSMASQ_CONF_PATH) do\n    local conf_dir = line:match(\"^conf%-dir=(.+)\")\n    if conf_dir then\n        DNSMASQ_CONF_DIR = conf_dir:gsub(\"%s+\", \"\") -- 去除空白字符\n        break\n    end\nend\n\n-- 设置 dnsmasq-ssrplus.d 目录路径，并去除路径末尾的斜杠\nlocal TMP_DNSMASQ_PATH = DNSMASQ_CONF_DIR:match(\"^(.-)/?$\") .. \"/dnsmasq-ssrplus.d\"\n\nlocal TMP_PATH = \"/var/etc/ssrplus\"\n-- match comments/title/whitelist/ip address/excluded_domain\nlocal comment_pattern = \"^[!\\\\[@]+\"\nlocal ip_pattern = \"^%d+%.%d+%.%d+%.%d+\"\nlocal domain_pattern = \"([%w%-%_]+%.[%w%.%-%_]+)[%/%*]*\"\nlocal excluded_domain = {\n    \"apple.com\", \"sina.cn\", \"sina.com.cn\", \"baidu.com\", \"byr.cn\", \"jlike.com\", \n    \"weibo.com\", \"zhongsou.com\", \"youdao.com\", \"sogou.com\", \"so.com\", \"soso.com\", \n    \"aliyun.com\", \"taobao.com\", \"jd.com\", \"qq.com\"\n}\n-- gfwlist parameter\nlocal mydnsip = '127.0.0.1'\nlocal mydnsport = '5335'\nlocal ipsetname = 'gfwlist'\nlocal new_appledns = uci:get_first(\"shadowsocksr\", \"global\", \"apple_dns\")\nlocal bc = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'\n-- base64decoding\nlocal function base64_dec(data)\n\tdata = string.gsub(data, '[^' .. bc .. '=]', '')\n\treturn (data:gsub('.', function(x)\n\t\tif (x == '=') then\n\t\t\treturn ''\n\t\tend\n\t\tlocal r, f = '', (bc:find(x) - 1)\n\t\tfor i = 6, 1, -1 do\n\t\t\tr = r .. (f % 2 ^ i - f % 2 ^ (i - 1) > 0 and '1' or '0')\n\t\tend\n\t\treturn r;\n\tend):gsub('%d%d%d?%d?%d?%d?%d?%d?', function(x)\n\t\tif (#x ~= 8) then\n\t\t\treturn ''\n\t\tend\n\t\tlocal c = 0\n\t\tfor i = 1, 8 do\n\t\t\tc = c + (x:sub(i, i) == '1' and 2 ^ (8 - i) or 0)\n\t\tend\n\t\treturn string.char(c)\n\tend))\nend\n-- check if domain is excluded\nlocal function check_excluded_domain(value)\n\tfor _, domain in ipairs(excluded_domain) do\n\t\tif value:find(domain) then\n\t\t\treturn true\n\t\tend\n\tend\nend\n-- gfwlist转码至dnsmasq格式\nlocal function generate_gfwlist(type)\n    local domains, domains_map = {}, {}\n    local out = io.open(\"/tmp/ssr-update.\" .. type, \"w\")\n    for line in io.lines(\"/tmp/ssr-update.tmp\") do\n        if not (string.find(line, comment_pattern) or string.find(line, ip_pattern) or check_excluded_domain(line)) then\n            local start, finish, match = string.find(line, domain_pattern)\n            if start and not domains_map[match] then\n                domains_map[match] = true\n                table.insert(domains, match)\n            end\n        end\n    end\n    for _, domain in ipairs(domains) do\n        out:write(string.format(\"server=/%s/%s#%s\\n\", domain, mydnsip, mydnsport))\n        out:write(string.format(\"ipset=/%s/%s\\n\", domain, ipsetname))\n    end\n    out:close()\n    os.remove(\"/tmp/ssr-update.tmp\")\nend\n\n-- 更换 Apple dns\nlocal function generate_apple(type)\n\tlocal domains, domains_map = {}, {}\n\tlocal out = io.open(\"/tmp/ssr-update.\" .. type, \"w\")\n\tfor line in io.lines(\"/tmp/ssr-update.tmp\") do\n\t\tif not (string.find(line, comment_pattern)) then\n\t\t\tlocal start, finish, match = string.find(line, domain_pattern)\n\t\t\tif start and not domains_map[match] then\n\t\t\t\tdomains_map[match] = true\n\t\t\t\tmatch = string.gsub(match, \"%s\", \"\") --从域名中去除所有空白字符\n\t\t\t\ttable.insert(domains, match)\n\t\t\tend\n\t\tend\n\tend\n\tfor _, domain in ipairs(domains) do\n        if new_appledns and new_appledns ~= \"\" then\n            out:write(string.format(\"server=/%s/%s\\n\", domain, new_appledns))\n        end\n\tend\n\tout:close()\n\tos.remove(\"/tmp/ssr-update.tmp\")\nend\n\n-- adblock转码至dnsmasq格式\nlocal function generate_adblock(type)\n\tlocal domains, domains_map = {}, {}\n\tlocal out = io.open(\"/tmp/ssr-update.\" .. type, \"w\")\n\tfor line in io.lines(\"/tmp/ssr-update.tmp\") do\n\t\tif not (string.find(line, comment_pattern)) then\n\t\t\tlocal start, finish, match = string.find(line, domain_pattern)\n\t\t\tif start and not domains_map[match] then\n\t\t\t\tdomains_map[match] = true\n\t\t\t\ttable.insert(domains, match)\n\t\t\tend\n\t\tend\n\tend\n\tfor _, domain in ipairs(domains) do\n\t\tout:write(string.format(\"address=/%s/\\n\", domain))\n\tend\n\tout:close()\n\tos.remove(\"/tmp/ssr-update.tmp\")\nend\n\nlocal log = function(...)\n\tif args then\n\t\tprint(\"{ret=\" .. table.concat({...}, \",retcount=\") .. \"}\")\n\telse\n\t\tprint(os.date(\"%Y-%m-%d %H:%M:%S \") .. table.concat({...}, \" \"))\n\tend\nend\n\nlocal function update(url, file, type, file2)\n\tlocal Num = 1\n\tlocal refresh_cmd = \"curl -sSL --insecure -o /tmp/ssr-update.\" .. type .. \" \" .. url\n\tlocal sret = luci.sys.call(refresh_cmd)\n\tif sret == 0 then\n\t\tif type == \"gfw_data\" then\n\t\t\tlocal gfwlist = io.open(\"/tmp/ssr-update.\" .. type, \"r\")\n\t\t\tlocal decode = gfwlist:read(\"*a\")\n\t\t\tif not decode:find(\"google\") then\n\t\t\t\tdecode = base64_dec(decode)\n\t\t\tend\n\t\t\tgfwlist:close()\n\t\t\t-- 写回gfwlist\n\t\t\tgfwlist = io.open(\"/tmp/ssr-update.tmp\", \"w\")\n\t\t\tgfwlist:write(decode)\n\t\t\tgfwlist:close()\n\t\t\tgenerate_gfwlist(type)\n\t\t\tNum = 2\n\t\tend\n\t\tif type == \"apple_data\" then\n\t\t\tlocal apple = io.open(\"/tmp/ssr-update.\" .. type, \"r\")\n\t\t\tlocal decode = apple:read(\"*a\")\n\t\t\tif not decode:find(\"apple\") then\n\t\t\t\tdecode = base64_dec(decode)\n\t\t\tend\n\t\t\tapple:close()\n\t\t\t-- 写回applechina\n\t\t\tapple = io.open(\"/tmp/ssr-update.tmp\", \"w\")\n\t\t\tapple:write(decode)\n\t\t\tapple:close()\n\t\t\tif new_appledns and new_appledns ~= \"\" then\n\t\t\t\tgenerate_apple(type)\n\t\t\tend\n\t\tend\n\t\tif type == \"ad_data\" then\n\t\t\tlocal adblock = io.open(\"/tmp/ssr-update.\" .. type, \"r\")\n\t\t\tlocal decode = adblock:read(\"*a\")\n\t\t\tif decode:find(\"address=\") then\n\t\t\t\tadblock:close()\n\t\t\telse\n\t\t\t\tadblock:close()\n\t\t\t\t-- 写回adblock\n\t\t\t\tadblock = io.open(\"/tmp/ssr-update.tmp\", \"w\")\n\t\t\t\tadblock:write(decode)\n\t\t\t\tadblock:close()\n\t\t\t\tgenerate_adblock(type)\n\t\t\tend\n\t\tend\n\t\tlocal new_md5 = luci.sys.exec(\"echo -n $([ -f '/tmp/ssr-update.\" .. type .. \"' ] && md5sum /tmp/ssr-update.\" .. type .. \" | awk '{print $1}')\")\n\t\tlocal old_md5 = luci.sys.exec(\"echo -n $([ -f '\" .. file .. \"' ] && md5sum \" .. file .. \" | awk '{print $1}')\")\n\t\tif new_md5 == old_md5 then\n\t\t\tif args then\n\t\t\t\tlog(1)\n\t\t\telse\n\t\t\t\tlog(\"你已经是最新数据，无需更新！\")\n\t\t\tend\n\t\telse\n\t\t\ticount = luci.sys.exec(\"cat /tmp/ssr-update.\" .. type .. \" | wc -l\")\n\t\t\tluci.sys.exec(\"cp -f /tmp/ssr-update.\" .. type .. \" \" .. file)\n\t\t\tif file2 then\n\t\t\t\tluci.sys.exec(\"cp -f /tmp/ssr-update.\" .. type .. \" \" .. file2)\n\t\t\tend\n\t\t\tif type == \"gfw_data\" or type == \"ad_data\" then\n\t\t\t\tluci.sys.call(\"/usr/share/shadowsocksr/gfw2ipset.sh\")\n\t\t\telse\n\t\t\t\tif luci.sys.call(\"command -v ipset >/dev/null 2>&1\") == 0 then\n\t\t\t\t\tluci.sys.call(\"/usr/share/shadowsocksr/chinaipset.sh \" .. TMP_PATH .. \"/china_ssr.txt\")\n\t\t\t\tend\n\t\t\tend\n\t\t\tif args then\n\t\t\t\tlog(0, tonumber(icount) / Num)\n\t\t\telse\n\t\t\t\tlog(\"更新成功！ 新的总记录数：\" .. tostring(tonumber(icount) / Num))\n\t\t\tend\n\t\tend\n\telse\n\t\tif args then\n\t\t\tlog(-1)\n\t\telse\n\t\t\tlog(\"更新失败！\")\n\t\tend\n\tend\n\tos.remove(\"/tmp/ssr-update.\" .. type)\nend\n\nif args then\n\tif args == \"gfw_data\" then\n\t\tupdate(uci:get_first(\"shadowsocksr\", \"global\", \"gfwlist_url\"), \"/etc/ssrplus/gfw_list.conf\", args, TMP_DNSMASQ_PATH .. \"/gfw_list.conf\")\n\t\tos.exit(0)\n\tend\n\tif args == \"ip_data\" then\n\t\tupdate(uci:get_first(\"shadowsocksr\", \"global\", \"chnroute_url\"), \"/etc/ssrplus/china_ssr.txt\", args, TMP_PATH .. \"/china_ssr.txt\")\n\t\tos.exit(0)\n\tend\n\tif args == \"apple_data\" then\n\t\tupdate(uci:get_first(\"shadowsocksr\", \"global\", \"apple_url\"), \"/etc/ssrplus/applechina.conf\", args, TMP_DNSMASQ_PATH .. \"/applechina.conf\")\n\t\tos.exit(0)\n\tend\n\tif args == \"ad_data\" then\n\t\tupdate(uci:get_first(\"shadowsocksr\", \"global\", \"adblock_url\"), \"/etc/ssrplus/ad.conf\", args, TMP_DNSMASQ_PATH .. \"/ad.conf\")\n\t\tos.exit(0)\n\tend\n\tif args == \"nfip_data\" then\n\t\tupdate(uci:get_first(\"shadowsocksr\", \"global\", \"nfip_url\"), \"/etc/ssrplus/netflixip.list\", args, TMP_DNSMASQ_PATH .. \"/netflixip.list\")\n\t\tos.exit(0)\n\tend\nelse\n\tlog(\"正在更新【GFW列表】数据库\")\n\tupdate(uci:get_first(\"shadowsocksr\", \"global\", \"gfwlist_url\"), \"/etc/ssrplus/gfw_list.conf\", \"gfw_data\", TMP_DNSMASQ_PATH .. \"/gfw_list.conf\")\n\tlog(\"正在更新【国内IP段】数据库\")\n\tupdate(uci:get_first(\"shadowsocksr\", \"global\", \"chnroute_url\"), \"/etc/ssrplus/china_ssr.txt\", \"ip_data\", TMP_PATH .. \"/china_ssr.txt\")\n\tif uci:get_first(\"shadowsocksr\", \"global\", \"apple_optimization\", \"0\") == \"1\" then\n\t\tlog(\"正在更新【Apple域名】数据库\")\n\t\tupdate(uci:get_first(\"shadowsocksr\", \"global\", \"apple_url\"), \"/etc/ssrplus/applechina.conf\", \"apple_data\", TMP_DNSMASQ_PATH .. \"/applechina.conf\")\n\tend\n\tif uci:get_first(\"shadowsocksr\", \"global\", \"adblock\", \"0\") == \"1\" then\n\t\tlog(\"正在更新【广告屏蔽】数据库\")\n\t\tupdate(uci:get_first(\"shadowsocksr\", \"global\", \"adblock_url\"), \"/etc/ssrplus/ad.conf\", \"ad_data\", TMP_DNSMASQ_PATH .. \"/ad.conf\")\n\tend\n\tif uci:get_first(\"shadowsocksr\", \"global\", \"netflix_enable\", \"0\") == \"1\" then\n\t\tlog(\"正在更新【Netflix IP段】数据库\")\n\t\tupdate(uci:get_first(\"shadowsocksr\", \"global\", \"nfip_url\"), \"/etc/ssrplus/netflixip.list\", \"nfip_data\", TMP_DNSMASQ_PATH .. \"/netflixip.list\")\n\tend\n\t-- log(\"正在更新【Netflix IP段】数据库\")\n\t-- update(uci:get_first(\"shadowsocksr\", \"global\", \"nfip_url\"), \"/etc/ssrplus/netflixip.list\", \"nfip_data\")\nend\n"
  },
  {
    "path": "luci-app-ssr-plus/luci-app-ssr-plus/root/usr/share/ucitrack/luci-app-ssr-plus.json",
    "content": "{\n\t\"config\": \"shadowsocksr\",\n\t\"init\": \"shadowsocksr\"\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/microsocks/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=microsocks\nPKG_VERSION:=1.0.5\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/rofl0r/microsocks/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=939d1851a18a4c03f3cc5c92ff7a50eaf045da7814764b4cb9e26921db15abc8\n\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILES:=COPYING\nPKG_MAINTAINER:=lean\n\nPKG_BUILD_PARALLEL:=1\nPKG_INSTALL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/microsocks\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=Web Servers/Proxies\n  TITLE:=Tiny, portable SOCKS5 server\n  URL:=https://github.com/rofl0r/microsocks\n  DEPENDS:=+libpthread\nendef\n\ndefine Package/microsocks/description\n  A SOCKS5 service that you can run on your remote boxes to tunnel connections\n  through them, if for some reason SSH doesn't cut it for you.\nendef\n\ndefine Package/microsocks/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/local/bin/microsocks $(1)/usr/bin/microsocks\nendef\n\n$(eval $(call BuildPackage,microsocks))\n"
  },
  {
    "path": "luci-app-ssr-plus/mosdns/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=mosdns\nPKG_VERSION:=5.3.4\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/IrineSistiana/mosdns/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=0302a685db2a6c3c09af7bf4ff0dffd24f1e583383a47f064564f5270033671b\n\nPKG_LICENSE:=GPL-3.0\nPKG_LICENSE_FILE:=LICENSE\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/IrineSistiana/mosdns\nGO_PKG_LDFLAGS_X:=main.version=v$(PKG_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/mosdns\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=IP Addresses and Names\n  TITLE:=A plug-in DNS forwarder/splitter\n  URL:=https://github.com/IrineSistiana/mosdns\n  DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle\nendef\n\ndefine Package/mosdns/install\n\t$(call GoPackage/Package/Install/Bin,$(1))\nendef\n\n$(eval $(call GoBinPackage,mosdns))\n$(eval $(call BuildPackage,mosdns))\n"
  },
  {
    "path": "luci-app-ssr-plus/mosdns/patches/203-add-response-for-bad-request-in-ServeHTTP-handler.patch",
    "content": "From 0b86b89629f32e7c8b859239aa1a4814f256053c Mon Sep 17 00:00:00 2001\nFrom: sbwml <admin@cooluc.com>\nDate: Thu, 28 Sep 2023 16:42:54 +0800\nSubject: [PATCH 3/5] add response for bad request in ServeHTTP handler\n\n---\n pkg/server/http_handler.go | 1 +\n 1 file changed, 1 insertion(+)\n\n--- a/pkg/server/http_handler.go\n+++ b/pkg/server/http_handler.go\n@@ -91,6 +91,7 @@ func (h *HttpHandler) ServeHTTP(w http.R\n \tif err != nil {\n \t\th.warnErr(req, \"invalid request\", err)\n \t\tw.WriteHeader(http.StatusBadRequest)\n+\t\tw.Write([]byte(\"Bad Request\"))\n \t\treturn\n \t}\n \n"
  },
  {
    "path": "luci-app-ssr-plus/mosdns/patches/204-black_hole-apply-Fisher-Yates-shuffle-algorithm-to-r.patch",
    "content": "From e34dca717e78d24a84b98c2b5d371c4253b7e260 Mon Sep 17 00:00:00 2001\nFrom: sbwml <admin@cooluc.com>\nDate: Wed, 20 Sep 2023 14:51:19 +0800\nSubject: [PATCH 4/5] black_hole: apply Fisher-Yates shuffle algorithm to\n randomize IP order\n\n---\n plugin/executable/black_hole/black_hole.go | 15 +++++++++++++++\n 1 file changed, 15 insertions(+)\n\n--- a/plugin/executable/black_hole/black_hole.go\n+++ b/plugin/executable/black_hole/black_hole.go\n@@ -27,6 +27,8 @@ import (\n \t\"github.com/miekg/dns\"\n \t\"net/netip\"\n \t\"strings\"\n+\t\"math/rand\"\n+\t\"sync\"\n )\n \n const PluginType = \"black_hole\"\n@@ -40,6 +42,7 @@ var _ sequence.Executable = (*BlackHole)\n type BlackHole struct {\n \tipv4 []netip.Addr\n \tipv6 []netip.Addr\n+\tshuffleMutex sync.Mutex\n }\n \n // QuickSetup format: [ipv4|ipv6] ...\n@@ -65,9 +68,21 @@ func NewBlackHole(ips []string) (*BlackH\n \treturn b, nil\n }\n \n+func (b *BlackHole) shuffleIPs() {\n+\tb.shuffleMutex.Lock()\n+\tdefer b.shuffleMutex.Unlock()\n+\trand.Shuffle(len(b.ipv4), func(i, j int) {\n+\t\tb.ipv4[i], b.ipv4[j] = b.ipv4[j], b.ipv4[i]\n+\t})\n+\trand.Shuffle(len(b.ipv6), func(i, j int) {\n+\t\tb.ipv6[i], b.ipv6[j] = b.ipv6[j], b.ipv6[i]\n+\t})\n+}\n+\n // Exec implements sequence.Executable. It set a response with given ips if\n // query has corresponding qtypes.\n func (b *BlackHole) Exec(_ context.Context, qCtx *query_context.Context) error {\n+\tb.shuffleIPs()\n \tif r := b.Response(qCtx.Q()); r != nil {\n \t\tqCtx.SetResponse(r)\n \t}\n"
  },
  {
    "path": "luci-app-ssr-plus/mosdns/patches/205-format-logtime.patch",
    "content": "From 2dc08749e2de8f19ef869e7f89c9979edbbc71ff Mon Sep 17 00:00:00 2001\nFrom: sbwml <admin@cooluc.com>\nDate: Wed, 20 Sep 2023 21:05:18 +0800\nSubject: [PATCH 5/5] format logtime\n\n---\n mlog/logger.go | 18 ++++++++++++++----\n 1 file changed, 14 insertions(+), 4 deletions(-)\n\n--- a/mlog/logger.go\n+++ b/mlog/logger.go\n@@ -21,9 +21,11 @@ package mlog\n \n import (\n \t\"fmt\"\n+\t\"os\"\n+\t\"time\"\n+\n \t\"go.uber.org/zap\"\n \t\"go.uber.org/zap/zapcore\"\n-\t\"os\"\n )\n \n type LogConfig struct {\n@@ -64,10 +66,18 @@ func NewLogger(lc LogConfig) (*zap.Logge\n \t\tout = stderr\n \t}\n \n-\tif lc.Production {\n-\t\treturn zap.New(zapcore.NewCore(zapcore.NewJSONEncoder(zap.NewProductionEncoderConfig()), out, lvl)), nil\n+\tencoderConfig := zap.NewDevelopmentEncoderConfig()\n+\tencoderConfig.EncodeTime = func(t time.Time, enc zapcore.PrimitiveArrayEncoder) {\n+\t\tenc.AppendString(t.Format(\"2006-01-02 15:04:05\"))\n \t}\n-\treturn zap.New(zapcore.NewCore(zapcore.NewConsoleEncoder(zap.NewDevelopmentEncoderConfig()), out, lvl)), nil\n+\n+\tcore := zapcore.NewCore(\n+\t\tzapcore.NewConsoleEncoder(encoderConfig),\n+\t\tout,\n+\t\tlvl,\n+\t)\n+\n+\treturn zap.New(core), nil\n }\n \n // L is a global logger.\n"
  },
  {
    "path": "luci-app-ssr-plus/naiveproxy/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=naiveproxy\nPKG_REAL_VERSION:=147.0.7727.49-1\nPKG_VERSION:=$(subst -,.,$(PKG_REAL_VERSION))\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_REAL_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/klzgrad/naiveproxy/tar.gz/v$(PKG_REAL_VERSION)?\nPKG_HASH:=5102b57a25ee88509634c0e4b7e7c47c6128b10b4d1630c4ab9ded639105630a\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_REAL_VERSION)\n\nPKG_LICENSE:=BSD 3-Clause\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\n\nPKG_BUILD_DEPENDS:=gn/host\nPKG_BUILD_PARALLEL:=1\nPKG_BUILD_FLAGS:=no-mips16\n\nifneq ($(CONFIG_CPU_TYPE),\" \")\n  CPU_TYPE:=$(word 1, $(subst +,\" ,$(CONFIG_CPU_TYPE)))\n  CPU_SUBTYPE:=$(word 2, $(subst +, \",$(CONFIG_CPU_TYPE)))\n  ifeq ($(CPU_SUBTYPE),)\n    CPU_SUBTYPE:=\"\"\n  endif\nelse\n  CPU_TYPE:=\"\"\n  CPU_SUBTYPE:=\"\"\nendif\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/naiveproxy\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=Web Servers/Proxies\n  TITLE:=Make a fortune quietly\n  URL:=https://github.com/klzgrad/naiveproxy\n  DEPENDS:=@!(arc||armeb||loongarch64||mips||mips64||powerpc||TARGET_gemini) +libatomic\nendef\n\ndefine Package/naiveproxy/description\n  NaïveProxy uses Chrome's network stack to camouflage traffic with strong\n  censorship resistance and low detectability. Reusing Chrome's stack also\n  ensures best practices in performance and security.\nendef\n\nifneq ($(CONFIG_CCACHE),)\n  export CCACHE_SLOPPINESS=time_macros\n  export CCACHE_BASEDIR=$(PKG_BUILD_DIR)/src\n  export CCACHE_CPP2=yes\n  export naive_ccache_flags=cc_wrapper=\"$(CCACHE)\"\nendif\n\nCLANG_VER:=23-init-5669-g8a0be0bc-1\nCLANG_FILE:=clang-llvmorg-$(CLANG_VER).tar.xz\ndefine Download/CLANG\n\tURL:=https://commondatastorage.googleapis.com/chromium-browser-clang/Linux_x64\n\tURL_FILE:=$(CLANG_FILE)\n\tFILE:=$(CLANG_FILE)\n\tHASH:=750b331006635281d7d90696629f67db748ba62004c46675eccb8af144141847\nendef\n\nPGO_VER:=7727-1774978896-38e5deba67117246fc20e2afbaafb6ff138882a3-3f44451a3565db8934451c0ce67293ed93a78b74\nPGO_FILE:=chrome-linux-$(PGO_VER).profdata\ndefine Download/PGO_PROF\n\tURL:=https://storage.googleapis.com/chromium-optimization-profiles/pgo_profiles\n\tURL_FILE:=$(PGO_FILE)\n\tFILE:=$(PGO_FILE)\n\tHASH:=f37730feed6ce1abec80e58cc5198300b53e4e66bbcdc0fe63c73bb441a07c03\nendef\n\ndefine Build/Prepare\n\t$(call Build/Prepare/Default)\n\n\t( \\\n\t\tpushd $(PKG_BUILD_DIR)/src ; \\\n\t\tmkdir -p \"chrome/build/pgo_profiles\" ; \\\n\t\t$(CP) \"$(DL_DIR)/$(PGO_FILE)\" \"chrome/build/pgo_profiles\" ; \\\n\t\tmkdir -p \"third_party/llvm-build/Release+Asserts\" ; \\\n\t\t$(TAR) -xJf \"$(DL_DIR)/$(CLANG_FILE)\" -C \"third_party/llvm-build/Release+Asserts\" ; \\\n\t\techo -e \"llvmorg-$(CLANG_VER)\" > \"third_party/llvm-build/Release+Asserts/cr_build_revision\" ; \\\n\t\tpopd ; \\\n\t)\nendef\n\ndefine Build/Configure\n\t( \\\n\t\tpushd \"$(PKG_BUILD_DIR)/src\" ; \\\n\t\t. ../init_env.sh \"$(ARCH)\" $(CPU_TYPE) $(CPU_SUBTYPE) \"$(TOOLCHAIN_ROOT_DIR)\" ; \\\n\t\texport naive_flags+=\" $$$${naive_ccache_flags}\" ; \\\n\t\tmkdir -p \"out\" ; \\\n\t\tgn gen \"out/Release\" --args=\"$$$${naive_flags}\" --script-executable=\"$(PYTHON)\" ; \\\n\t\tpopd ; \\\n\t)\nendef\n\ndefine Build/Compile\n\t+$(NINJA) -C \"$(PKG_BUILD_DIR)/src/out/Release\" naive\nendef\n\ndefine Package/naiveproxy/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/out/Release/naive $(1)/usr/bin/naive\nendef\n\n$(eval $(call Download,CLANG))\n$(eval $(call Download,PGO_PROF))\n\n$(eval $(call BuildPackage,naiveproxy))\n"
  },
  {
    "path": "luci-app-ssr-plus/naiveproxy/src/init_env.sh",
    "content": "#!/bin/bash\n# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n# --------------------------------------------------------\n# Init build dependencies for naiveproxy\n\n# Read args from shell\ntarget_arch=\"$1\"\ncpu_type=\"$2\"\ncpu_subtype=\"$3\"\ntoolchain_dir=\"$4\"\n\n# Set arch info\ncase \"${target_arch}\" in\n\"aarch64\")\n\tnaive_arch=\"arm64\"\n\t;;\n\"i386\")\n\tnaive_arch=\"x86\"\n\t;;\n\"loongarch64\")\n\tnaive_arch=\"loong64\"\n\t;;\n\"x86_64\")\n\tnaive_arch=\"x64\"\n\t;;\n*)\n\tnaive_arch=\"${target_arch}\"\n\t;;\nesac\n\n# OS detection\n[ \"$(uname)\" != \"Linux\" -o \"$(uname -m)\" != \"x86_64\" ] && { echo -e \"Support Linux AMD64 only.\"; exit 1; }\n\n# Create TMP dir\nmkdir -p \"$PWD/tmp\"\nexport TMPDIR=\"$PWD/tmp\"\n\n# Set ENV\nexport DEPOT_TOOLS_WIN_TOOLCHAIN=0\nexport naive_flags=\"\nis_official_build=true\nexclude_unwind_tables=true\nenable_resource_allowlist_generation=false\nchrome_pgo_phase=2\nsymbol_level=0\n\nis_clang=true\nuse_sysroot=false\n\nfatal_linker_warnings=false\ntreat_warnings_as_errors=false\n\nis_cronet_build=true\n\nuse_udev=false\nuse_aura=false\nuse_ozone=false\nuse_gio=false\nuse_platform_icu_alternatives=true\nuse_glib=false\nis_perfetto_embedder=true\n\ndisable_file_support=true\nenable_websockets=false\nuse_kerberos=false\ndisable_file_support=true\ndisable_zstd_filter=false\nenable_mdns=false\nenable_reporting=false\ninclude_transport_security_state_preload_list=false\nenable_device_bound_sessions=false\nenable_bracketed_proxy_uris=true\nenable_quic_proxy_support=true\nenable_disk_cache_sql_backend=false\n\nuse_nss_certs=false\n\nenable_backup_ref_ptr_support=false\nenable_dangling_raw_ptr_checks=false\n\ntarget_os=\\\"openwrt\\\"\ntarget_cpu=\\\"${naive_arch}\\\"\ntarget_sysroot=\\\"${toolchain_dir}\\\"\"\n\ncase \"${target_arch}\" in\n\"arm\")\n\tnaive_flags+=\" arm_version=0 arm_cpu=\\\"${cpu_type}\\\"\"\n\tcase \"${cpu_type}\" in \"arm1176jzf-s\"|\"arm926ej-s\"|\"mpcore\"|\"xscale\") naive_flags+=\" arm_use_thumb=false\" ;; esac\n\tif [ -n \"${cpu_subtype}\" ]; then\n\t\tif grep -q \"neon\" <<< \"${cpu_subtype}\"; then\n\t\t\tneon_flag=\"arm_use_neon=true\"\n\t\telse\n\t\t\tneon_flag=\"arm_use_neon=false\"\n\t\tfi\n\t\tnaive_flags+=\" arm_fpu=\\\"${cpu_subtype}\\\" arm_float_abi=\\\"hard\\\" ${neon_flag}\"\n\telse\n\t\tnaive_flags+=\" arm_float_abi=\\\"soft\\\" arm_use_neon=false\"\n\tfi\n\n\t# LLVM does not accept muslgnueabi as the target triple environment\n\tif [ -d \"$toolchain_dir/lib/gcc/arm-openwrt-linux-muslgnueabi\" ] && [ ! -d \"$toolchain_dir/lib/gcc/arm-openwrt-linux-musleabi\" ]; then\n\t\tln -sf \"$toolchain_dir/lib/gcc/arm-openwrt-linux-muslgnueabi\" \"$toolchain_dir/lib/gcc/arm-openwrt-linux-musleabi\"\n\tfi\n\t;;\n\"arm64\")\n\t[ -n \"${cpu_type}\" ] && naive_flags+=\" arm_cpu=\\\"${cpu_type}\\\"\"\n\t;;\n\"mipsel\"|\"mips64el\")\n\tif [ -z \"${cpu_type}\" ] || [ \"${cpu_type}\" == \"mips32\" ]; then\n\t\tnaive_flags+=\" mips_arch_variant=\\\"r1\\\"\"\n\telse\n\t\tnaive_flags+=\" mips_arch_variant=\\\"r2\\\"\"\n\tfi\n\tif [ \"${target_arch}\" == \"mipsel\" ]; then\n\t\tif [ \"${cpu_subtype}\" == \"24kf\" ]; then\n\t\t\tnaive_flags+=\" mips_float_abi=\\\"hard\\\"\"\n\t\telse\n\t\t\tnaive_flags+=\" mips_float_abi=\\\"soft\\\"\"\n\t\tfi\n\tfi\n\t;;\n\"x86_64\")\n\tnaive_flags+=\" use_cfi_icall=false\"\n\t;;\nesac\n"
  },
  {
    "path": "luci-app-ssr-plus/redsocks2/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=redsocks2\nPKG_VERSION:=0.71\nPKG_RELEASE:=1\n\nPKG_SOURCE_PROTO:=git\nPKG_SOURCE_URL:=https://github.com/semigodking/redsocks.git\nPKG_SOURCE_DATE:=2025-12-12\nPKG_SOURCE_VERSION:=fca772289edc56fa54b2eb413209ca38d55a57f3\nPKG_MIRROR_HASH:=adbe999c4c68ffa9dc622e365f5d3fe8501336e8f3c3563630c960291cc77849\n\nPKG_MAINTAINER:=semigodking <semigodking@gmail.com>\nPKG_LICENSE:=Apache-2.0\nPKG_LICENSE_FILES:=LICENSE\n\nPKG_BUILD_PARALLEL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/redsocks2\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=Web Servers/Proxies\n  TITLE:=Redirect any TCP connection to a SOCKS or HTTPS proxy server\n  URL:=https://github.com/semigodking/redsocks\n  DEPENDS:=+libevent2 +libopenssl\nendef\n\ndefine Package/redsocks2/description\nThis is a modified version of original redsocks. \\\nThe name is changed to be REDSOCKS2 since this release to distinguish with original redsocks. \\\nThis variant is useful for anti-GFW (Great Fire Wall).\nendef\n\ndefine Build/Compile\n\t$(call Build/Compile/Default,DISABLE_SHADOWSOCKS=true)\nendef\n\ndefine Package/redsocks2/install\n\t$(INSTALL_DIR) $(1)/usr/sbin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/redsocks2 $(1)/usr/sbin\nendef\n\n$(eval $(call BuildPackage,redsocks2))\n"
  },
  {
    "path": "luci-app-ssr-plus/shadow-tls/Makefile",
    "content": "# SPDX-License-Identifier: GPL-2.0-only\n#\n# Copyright (C) 2025 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=shadow-tls\nPKG_VERSION:=0.2.25\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/ihciah/shadow-tls/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=1d1d436734823ba0302de6e91883ed892ea710769c722a139990194ff5837224\n\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILES:=LICENSE\n\nPKG_BUILD_DEPENDS:=rust/host\nPKG_BUILD_PARALLEL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/rust/rust-package.mk\n\ndefine Package/shadow-tls\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=Web Servers/Proxies\n  TITLE:=A proxy to expose real tls handshake to the firewall\n  URL:=https://github.com/ihciah/shadow-tls\n  DEPENDS:=@(aarch64||arm||x86_64)\nendef\n\ndefine Package/shadow-tls/description\n  A proxy to expose real tls handshake to the firewall.\n\n  It works like trojan but it does not require signing certificate.\n  The firewall will see real tls handshake with valid certificate\n  that you choose.\nendef\n\n$(eval $(call RustBinPackage,shadow-tls))\n$(eval $(call BuildPackage,shadow-tls))\n"
  },
  {
    "path": "luci-app-ssr-plus/shadow-tls/patches/010-Fix-reading-WildcardSNI-from-sip003_arg-115.patch",
    "content": "From 045014130570dd23d5a9cce124b78b2bb1ddaf5f Mon Sep 17 00:00:00 2001\nFrom: =?UTF-8?q?=E1=A1=A0=E1=A0=B5=E1=A1=A0=E1=A1=B3=20=E1=A1=A0=E1=A0=B5?=\n =?UTF-8?q?=E1=A1=A0=20=E1=A0=AE=E1=A0=A0=E1=A0=A8=E1=A1=A9=E1=A0=8B?=\n =?UTF-8?q?=E1=A0=A0=E1=A0=A8?=\n <125150101+UjuiUjuMandan@users.noreply.github.com>\nDate: Thu, 24 Apr 2025 22:39:07 +0000\nSubject: [PATCH] Fix reading WildcardSNI from sip003_arg (#115)\n\n---\n src/main.rs | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\n--- a/src/main.rs\n+++ b/src/main.rs\n@@ -269,7 +269,7 @@ pub(crate) fn get_sip003_arg() -> Option\n         let tls_addrs = parse_server_addrs(tls_addr)\n             .expect(\"tls param parse failed(like tls=xxx.com:443 or tls=yyy.com:1.2.3.4:443;zzz.com:443;xxx.com)\");\n         let wildcard_sni =\n-            WildcardSNI::from_str(opts.get(\"tls\").map(AsRef::as_ref).unwrap_or_default(), true)\n+            WildcardSNI::from_str(opts.get(\"wildcard-sni\").map(AsRef::as_ref).unwrap_or(\"off\"), true)\n                 .expect(\"wildcard_sni format error\");\n         Args {\n             cmd: crate::Commands::Server {\n"
  },
  {
    "path": "luci-app-ssr-plus/shadow-tls/patches/011-fix-use-tls1-2-only-website-for-tls12-test-suites-129.patch",
    "content": "From 02dd0bc7bae8a2011729f95021690e694fd8e43e Mon Sep 17 00:00:00 2001\nFrom: V <vendettareborn@proton.me>\nDate: Fri, 25 Apr 2025 18:27:13 +0200\nSubject: [PATCH] fix: use tls1.2 only website for tls12 test suites (#129)\n\n* fix: use tls1.2 only website for tls12 test suites\n---\n src/helper_v2.rs |  2 ++\n src/main.rs      | 12 +++++++-----\n src/sip003.rs    |  6 +++---\n src/util.rs      |  2 +-\n tests/tls12.rs   | 32 ++++++++++++++++----------------\n 5 files changed, 29 insertions(+), 25 deletions(-)\n\n--- a/src/helper_v2.rs\n+++ b/src/helper_v2.rs\n@@ -26,6 +26,7 @@ use crate::util::prelude::*;\n \n pub(crate) const HMAC_SIZE_V2: usize = 8;\n \n+#[allow(unused)]\n pub(crate) trait HashedStream {\n     fn hash_stream(&self) -> [u8; 20];\n }\n@@ -98,6 +99,7 @@ impl<S> HashedWriteStream<S> {\n         })\n     }\n \n+    #[allow(unused)]\n     pub(crate) fn hash(&self) -> [u8; 20] {\n         self.hmac\n             .borrow()\n--- a/src/main.rs\n+++ b/src/main.rs\n@@ -252,7 +252,7 @@ pub(crate) fn get_sip003_arg() -> Option\n     let opts: HashMap<_, _> = opts.into_iter().collect();\n \n     let threads = opts.get(\"threads\").map(|s| s.parse::<u8>().unwrap());\n-    let v3 = opts.get(\"v3\").is_some();\n+    let v3 = opts.contains_key(\"v3\");\n     let passwd = opts\n         .get(\"passwd\")\n         .expect(\"need passwd param(like passwd=123456)\");\n@@ -262,15 +262,17 @@ pub(crate) fn get_sip003_arg() -> Option\n         v3,\n         ..Default::default()\n     };\n-    let args = if opts.get(\"server\").is_some() {\n+    let args = if opts.contains_key(\"server\") {\n         let tls_addr = opts\n             .get(\"tls\")\n             .expect(\"tls param must be specified(like tls=xxx.com:443)\");\n         let tls_addrs = parse_server_addrs(tls_addr)\n             .expect(\"tls param parse failed(like tls=xxx.com:443 or tls=yyy.com:1.2.3.4:443;zzz.com:443;xxx.com)\");\n-        let wildcard_sni =\n-            WildcardSNI::from_str(opts.get(\"wildcard-sni\").map(AsRef::as_ref).unwrap_or(\"off\"), true)\n-                .expect(\"wildcard_sni format error\");\n+        let wildcard_sni = WildcardSNI::from_str(\n+            opts.get(\"wildcard-sni\").map(AsRef::as_ref).unwrap_or(\"off\"),\n+            true,\n+        )\n+        .expect(\"wildcard_sni format error\");\n         Args {\n             cmd: crate::Commands::Server {\n                 listen: format!(\"{ss_remote_host}:{ss_remote_port}\"),\n--- a/src/sip003.rs\n+++ b/src/sip003.rs\n@@ -6,7 +6,7 @@ pub fn parse_sip003_options(s: &str) ->\n     let mut i = 0;\n     while i < s.len() {\n         // read key\n-        let (offset, key) = index_unescaped(&s[i..], &[b'=', b';']).context(\"read key\")?;\n+        let (offset, key) = index_unescaped(&s[i..], b\"=;\").context(\"read key\")?;\n         if key.is_empty() {\n             bail!(\"empty key in {}\", &s[i..]);\n         }\n@@ -21,7 +21,7 @@ pub fn parse_sip003_options(s: &str) ->\n         // skip equals\n         i += 1;\n         // read value\n-        let (offset, value) = index_unescaped(&s[i..], &[b'=', b';']).context(\"read value\")?;\n+        let (offset, value) = index_unescaped(&s[i..], b\"=;\").context(\"read value\")?;\n         i += offset;\n         opts.push((key, value));\n         // Skip the semicolon.\n@@ -36,7 +36,7 @@ fn index_unescaped(s: &str, term: &[u8])\n \n     while i < s.len() {\n         let mut b: u8 = s.as_bytes()[i];\n-        if term.iter().any(|&e| b == e) {\n+        if term.contains(&b) {\n             break;\n         }\n         if b == b'\\\\' {\n--- a/src/util.rs\n+++ b/src/util.rs\n@@ -599,7 +599,7 @@ pub(crate) async fn resolve(addr: &str)\n     addr_iter.next().ok_or_else(|| {\n         std::io::Error::new(\n             std::io::ErrorKind::InvalidInput,\n-            format!(\"unable to resolve addr: {}\", addr),\n+            format!(\"unable to resolve addr: {addr}\"),\n         )\n     })\n }\n--- a/tests/tls12.rs\n+++ b/tests/tls12.rs\n@@ -4,7 +4,7 @@ use shadow_tls::{RunningArgs, TlsAddrs,\n mod utils;\n use utils::*;\n \n-// handshake: bing.com(tls1.2 only)\n+// handshake: badssl.com(tls1.2 only)\n // data: captive.apple.com:80\n // protocol: v2\n #[test]\n@@ -12,7 +12,7 @@ fn tls12_v2() {\n     let client = RunningArgs::Client {\n         listen_addr: \"127.0.0.1:30000\".to_string(),\n         target_addr: \"127.0.0.1:30001\".to_string(),\n-        tls_names: TlsNames::try_from(\"bing.com\").unwrap(),\n+        tls_names: TlsNames::try_from(\"badssl.com\").unwrap(),\n         tls_ext: TlsExtConfig::new(None),\n         password: \"test\".to_string(),\n         nodelay: true,\n@@ -22,7 +22,7 @@ fn tls12_v2() {\n     let server = RunningArgs::Server {\n         listen_addr: \"127.0.0.1:30001\".to_string(),\n         target_addr: \"captive.apple.com:80\".to_string(),\n-        tls_addr: TlsAddrs::try_from(\"bing.com\").unwrap(),\n+        tls_addr: TlsAddrs::try_from(\"badssl.com\").unwrap(),\n         password: \"test\".to_string(),\n         nodelay: true,\n         fastopen: true,\n@@ -31,7 +31,7 @@ fn tls12_v2() {\n     test_ok(client, server, CAPTIVE_HTTP_REQUEST, CAPTIVE_HTTP_RESP);\n }\n \n-// handshake: bing.com(tls1.2 only)\n+// handshake: badssl.com(tls1.2 only)\n // data: captive.apple.com:80\n // protocol: v3 lossy\n #[test]\n@@ -39,7 +39,7 @@ fn tls12_v3_lossy() {\n     let client = RunningArgs::Client {\n         listen_addr: \"127.0.0.1:30002\".to_string(),\n         target_addr: \"127.0.0.1:30003\".to_string(),\n-        tls_names: TlsNames::try_from(\"bing.com\").unwrap(),\n+        tls_names: TlsNames::try_from(\"badssl.com\").unwrap(),\n         tls_ext: TlsExtConfig::new(None),\n         password: \"test\".to_string(),\n         nodelay: true,\n@@ -49,7 +49,7 @@ fn tls12_v3_lossy() {\n     let server = RunningArgs::Server {\n         listen_addr: \"127.0.0.1:30003\".to_string(),\n         target_addr: \"captive.apple.com:80\".to_string(),\n-        tls_addr: TlsAddrs::try_from(\"bing.com\").unwrap(),\n+        tls_addr: TlsAddrs::try_from(\"badssl.com\").unwrap(),\n         password: \"test\".to_string(),\n         nodelay: true,\n         fastopen: true,\n@@ -58,7 +58,7 @@ fn tls12_v3_lossy() {\n     utils::test_ok(client, server, CAPTIVE_HTTP_REQUEST, CAPTIVE_HTTP_RESP);\n }\n \n-// handshake: bing.com(tls1.2 only)\n+// handshake: badssl.com(tls1.2 only)\n // data: captive.apple.com:80\n // protocol: v3 strict\n // v3 strict cannot work with tls1.2, so it must fail\n@@ -68,7 +68,7 @@ fn tls12_v3_strict() {\n     let client = RunningArgs::Client {\n         listen_addr: \"127.0.0.1:30004\".to_string(),\n         target_addr: \"127.0.0.1:30005\".to_string(),\n-        tls_names: TlsNames::try_from(\"bing.com\").unwrap(),\n+        tls_names: TlsNames::try_from(\"badssl.com\").unwrap(),\n         tls_ext: TlsExtConfig::new(None),\n         password: \"test\".to_string(),\n         nodelay: true,\n@@ -78,7 +78,7 @@ fn tls12_v3_strict() {\n     let server = RunningArgs::Server {\n         listen_addr: \"127.0.0.1:30005\".to_string(),\n         target_addr: \"captive.apple.com:80\".to_string(),\n-        tls_addr: TlsAddrs::try_from(\"bing.com\").unwrap(),\n+        tls_addr: TlsAddrs::try_from(\"badssl.com\").unwrap(),\n         password: \"test\".to_string(),\n         nodelay: true,\n         fastopen: true,\n@@ -87,8 +87,8 @@ fn tls12_v3_strict() {\n     utils::test_ok(client, server, CAPTIVE_HTTP_REQUEST, CAPTIVE_HTTP_RESP);\n }\n \n-// handshake: bing.com(tls1.2 only)\n-// data: bing.com:443\n+// handshake: badssl.com(tls1.2 only)\n+// data: badssl.com:443\n // protocol: v2\n // Note: v2 can not defend against hijack attack.\n // Here hijack means directly connect to the handshake server.\n@@ -98,8 +98,8 @@ fn tls12_v3_strict() {\n fn tls12_v2_hijack() {\n     let client = RunningArgs::Client {\n         listen_addr: \"127.0.0.1:30006\".to_string(),\n-        target_addr: \"bing.com:443\".to_string(),\n-        tls_names: TlsNames::try_from(\"bing.com\").unwrap(),\n+        target_addr: \"badssl.com:443\".to_string(),\n+        tls_names: TlsNames::try_from(\"badssl.com\").unwrap(),\n         tls_ext: TlsExtConfig::new(None),\n         password: \"test\".to_string(),\n         nodelay: true,\n@@ -109,7 +109,7 @@ fn tls12_v2_hijack() {\n     test_hijack(client);\n }\n \n-// handshake: bing.com(tls1.2 only)\n+// handshake: badssl.com(tls1.2 only)\n // data: captive.apple.com:80\n // protocol: v3 lossy\n // (v3 strict can not work with tls1.2)\n@@ -121,8 +121,8 @@ fn tls12_v2_hijack() {\n fn tls12_v3_lossy_hijack() {\n     let client = RunningArgs::Client {\n         listen_addr: \"127.0.0.1:30007\".to_string(),\n-        target_addr: \"bing.com:443\".to_string(),\n-        tls_names: TlsNames::try_from(\"bing.com\").unwrap(),\n+        target_addr: \"badssl.com:443\".to_string(),\n+        tls_names: TlsNames::try_from(\"badssl.com\").unwrap(),\n         tls_ext: TlsExtConfig::new(None),\n         password: \"test\".to_string(),\n         nodelay: true,\n"
  },
  {
    "path": "luci-app-ssr-plus/shadow-tls/patches/100-update-monoio.patch",
    "content": "--- a/Cargo.lock\n+++ b/Cargo.lock\n@@ -1,6 +1,6 @@\n # This file is automatically @generated by Cargo.\n # It is not intended for manual editing.\n-version = 3\n+version = 4\n \n [[package]]\n name = \"aho-corasick\"\n@@ -224,14 +224,13 @@ dependencies = [\n \n [[package]]\n name = \"flume\"\n-version = \"0.10.14\"\n+version = \"0.11.1\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577\"\n+checksum = \"da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095\"\n dependencies = [\n  \"futures-core\",\n  \"futures-sink\",\n  \"nanorand\",\n- \"pin-project\",\n  \"spin 0.9.8\",\n ]\n \n@@ -393,9 +392,9 @@ dependencies = [\n \n [[package]]\n name = \"memchr\"\n-version = \"2.6.4\"\n+version = \"2.7.5\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167\"\n+checksum = \"32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0\"\n \n [[package]]\n name = \"memoffset\"\n@@ -420,9 +419,9 @@ dependencies = [\n \n [[package]]\n name = \"monoio\"\n-version = \"0.2.0\"\n+version = \"0.2.2\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"c91a9bcc2622991bc92f3b6d7dc495329c4863e4dc530d1748529b009bb2170a\"\n+checksum = \"fd5be7ef0eea41e4e5b30fe55aa6fd15288c415118bcdceadd52fd3656816cc7\"\n dependencies = [\n  \"auto-const-array\",\n  \"bytes\",\n@@ -430,9 +429,11 @@ dependencies = [\n  \"fxhash\",\n  \"io-uring\",\n  \"libc\",\n+ \"memchr\",\n  \"mio\",\n  \"monoio-macros\",\n  \"nix 0.26.4\",\n+ \"once_cell\",\n  \"pin-project-lite\",\n  \"socket2\",\n  \"threadpool\",\n@@ -538,26 +539,6 @@ source = \"registry+https://github.com/ru\n checksum = \"b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39\"\n \n [[package]]\n-name = \"pin-project\"\n-version = \"1.1.3\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422\"\n-dependencies = [\n- \"pin-project-internal\",\n-]\n-\n-[[package]]\n-name = \"pin-project-internal\"\n-version = \"1.1.3\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405\"\n-dependencies = [\n- \"proc-macro2\",\n- \"quote\",\n- \"syn\",\n-]\n-\n-[[package]]\n name = \"pin-project-lite\"\n version = \"0.2.13\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n--- a/Cargo.toml\n+++ b/Cargo.toml\n@@ -10,7 +10,7 @@ repository = \"https://github.com/ihciah/\n version = \"0.2.25\"\n \n [dependencies]\n-monoio = { version = \"0.2.0\", features = [\"sync\"] }\n+monoio = { version = \"=0.2.2\", features = [\"sync\"] }\n monoio-rustls-fork-shadow-tls = { version = \"0.3.0-mod.2\" }\n rustls-fork-shadow-tls = { version = \"0.20.9-mod.2\", default-features = false }\n \n--- a/src/lib.rs\n+++ b/src/lib.rs\n@@ -1,5 +1,3 @@\n-#![feature(impl_trait_in_assoc_type)]\n-\n mod client;\n mod helper_v2;\n mod server;\n--- a/src/main.rs\n+++ b/src/main.rs\n@@ -1,5 +1,3 @@\n-#![feature(type_alias_impl_trait)]\n-\n use std::{collections::HashMap, path::PathBuf, process::exit};\n \n use clap::{Parser, Subcommand, ValueEnum};\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocks-libev/Makefile",
    "content": "#\n# Copyright (C) 2017-2020 Yousong Zhou <yszhou4tech@gmail.com>\n#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\n# Checklist when bumping versions\n#\n# - update cipher list by checking src/crypto.c:crypto_init()\n# - check if default mode has changed from being tcp_only\n#\nPKG_NAME:=shadowsocks-libev\nPKG_VERSION:=3.3.5\nPKG_RELEASE:=13\n\nPKG_SOURCE_PROTO:=git\nPKG_SOURCE_URL:=https://github.com/shadowsocks/shadowsocks-libev.git\nPKG_SOURCE_DATE:=2025-1-20\nPKG_SOURCE_VERSION:=9afa3cacf947f910be46b69fc5a7a1fdd02fd5e6\nPKG_MIRROR_HASH:=b56d015394a3217750ec232570e012461a30af17de20d5598c3b026c8fcaa5b5\n\nPKG_MAINTAINER:=Yousong Zhou <yszhou4tech@gmail.com>\n\nPKG_LICENSE:=GPL-3.0-or-later\nPKG_LICENSE_FILES:=LICENSE\nPKG_CPE_ID:=cpe:/a:shadowsocks:shadowsocks-libev\n\nPKG_FIXUP:=autoreconf\nPKG_INSTALL:=1\nPKG_BUILD_FLAGS:=no-mips16 lto\nPKG_BUILD_PARALLEL:=1\nPKG_BUILD_DEPENDS:=c-ares pcre2\n\ninclude $(INCLUDE_DIR)/package.mk\n\n\ndefine Package/shadowsocks-libev-config\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=Web Servers/Proxies\n  TITLE:=shadowsocks-libev config scripts\n  URL:=https://github.com/shadowsocks/shadowsocks-libev\nendef\n\ndefine Package/shadowsocks-libev-config/conffiles\n/etc/config/shadowsocks-libev\nendef\n\ndefine Package/shadowsocks-libev-config/install\n\t$(INSTALL_DIR) $(1)/etc/config\n\t$(INSTALL_DATA) ./files/shadowsocks-libev.config $(1)/etc/config/shadowsocks-libev\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_BIN) ./files/shadowsocks-libev.init $(1)/etc/init.d/shadowsocks-libev\nendef\n\n\ndefine Package/shadowsocks-libev/Default\n  define Package/shadowsocks-libev-$(1)\n    SECTION:=net\n    CATEGORY:=Network\n    SUBMENU:=Web Servers/Proxies\n    TITLE:=shadowsocks-libev $(1)\n    URL:=https://github.com/shadowsocks/shadowsocks-libev\n    DEPENDS:=+libev +libmbedtls +libpthread +libsodium +shadowsocks-libev-config $(DEPENDS_$(1))\n  endef\n\n  define Package/shadowsocks-libev-$(1)/install\n\t$$(INSTALL_DIR) $$(1)/usr/bin\n\t$$(INSTALL_BIN) $$(PKG_INSTALL_DIR)/usr/bin/$(1) $$(1)/usr/bin\n  endef\n\nendef\n\nDEPENDS_ss-local = +libpcre2\nDEPENDS_ss-server = +libcares +libpcre2\n\nSHADOWSOCKS_COMPONENTS:=ss-local ss-redir ss-tunnel ss-server\ndefine shadowsocks-libev/templates\n  $(foreach component,$(SHADOWSOCKS_COMPONENTS),\n    $(call Package/shadowsocks-libev/Default,$(component))\n  )\nendef\n$(eval $(call shadowsocks-libev/templates))\n\n\ndefine Package/shadowsocks-libev-ss-rules\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=Web Servers/Proxies\n  TITLE:=shadowsocks-libev ss-rules\n  URL:=https://github.com/shadowsocks/shadowsocks-libev\n  DEPENDS:=+firewall4 \\\n\t   +ip \\\n\t   +resolveip \\\n\t   +ucode \\\n\t   +ucode-mod-fs \\\n\t   +shadowsocks-libev-ss-redir \\\n\t   +shadowsocks-libev-config \\\n\t   +kmod-nft-tproxy\nendef\n\ndefine Package/shadowsocks-libev-ss-rules/install\n\t$(INSTALL_DIR) $(1)/usr/share/ss-rules\n\t$(INSTALL_DATA) ./files/ss-rules/* $(1)/usr/share/ss-rules/\nendef\n\ndefine Build/Prepare\n\t$(call Build/Prepare/Default)\n\t$(FIND) $(PKG_BUILD_DIR) \\\n\t\t\t   -name '*.o' \\\n\t\t\t-o -name '*.lo' \\\n\t\t\t-o -name '.deps' \\\n\t\t\t-o -name '.libs' \\\n\t\t| $(XARGS) rm -rvf\nendef\n\nCONFIGURE_ARGS += \\\n\t--disable-documentation \\\n\t--disable-silent-rules \\\n\t--disable-assert \\\n\t--disable-ssp \\\n\nTARGET_LDFLAGS += -Wl,--gc-sections,--as-needed\n\n$(eval $(call BuildPackage,shadowsocks-libev-config))\n$(eval $(call BuildPackage,shadowsocks-libev-ss-rules))\n$(foreach component,$(SHADOWSOCKS_COMPONENTS), \\\n  $(eval $(call BuildPackage,shadowsocks-libev-$(component))) \\\n)\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocks-libev/files/shadowsocks-libev.config",
    "content": "config ss_local\n\toption disabled 1\n\toption server 'sss0'\n\toption local_address '0.0.0.0'\n\toption local_port '1080'\n\toption timeout '30'\n\nconfig ss_tunnel\n\toption disabled 1\n\toption server 'sss0'\n\toption local_address '0.0.0.0'\n\toption local_port '1090'\n\toption tunnel_address 'example.com:80'\n\toption mode 'tcp_and_udp'\n\toption timeout '60'\n\nconfig ss_redir hi\n\toption disabled 1\n\toption server 'sss0'\n\toption local_address '0.0.0.0'\n\toption local_port '1100'\n\toption mode 'tcp_and_udp'\n\toption timeout '60'\n\toption fast_open 1\n\toption verbose 1\n\toption reuse_port 1\n\nconfig ss_redir hj\n\toption disabled 1\n\toption server 'sss0'\n\toption local_address '0.0.0.0'\n\toption local_port '1100'\n\toption mode 'tcp_and_udp'\n\toption timeout '60'\n\toption fast_open 1\n\toption verbose 1\n\toption reuse_port 1\n\nconfig ss_rules 'ss_rules'\n\toption disabled 1\n\toption redir_tcp 'hi'\n\toption redir_udp 'hi'\n\toption src_default 'checkdst'\n\toption dst_default 'bypass'\n\toption local_default 'checkdst'\n\tlist src_ips_forward '192.168.1.4'\n\tlist dst_ips_forward '8.8.8.8'\n\nconfig server 'sss0'\n\toption disabled 1\n\toption server '192.168.1.3'\n\toption server_port '9001'\n\toption password '********'\n\toption method 'aes-256-cfb'\n\nconfig ss_server\n\toption disabled 1\n\toption server_port '9001'\n\toption password '********'\n\toption method 'aes-256-cfb'\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocks-libev/files/shadowsocks-libev.init",
    "content": "#!/bin/sh /etc/rc.common\n#\n# Copyright (C) 2017-2019 Yousong Zhou <yszhou4tech@gmail.com>\n#\n# This is free software, licensed under the GNU General Public License v3.\n# See /LICENSE for more information.\n#\n\nUSE_PROCD=1\nSTART=99\n\nss_confdir=/var/etc/shadowsocks-libev\nss_bindir=/usr/bin\n\nssrules_uc=\"/usr/share/ss-rules/ss-rules.uc\"\nssrules_nft=\"/etc/nftables.d/90-ss-rules.nft\"\n\nss_mkjson_server_conf() {\n\tlocal cfgserver\n\n\tconfig_get cfgserver \"$cfg\" server\n\t[ -n \"$cfgserver\" ] || return 1\n\teval \"$(validate_server_section \"$cfg\" ss_validate_mklocal)\"\n\tvalidate_server_section \"$cfgserver\" || return 1\n\t[ \"$disabled\" = 0 ] || return 1\n\tss_mkjson_server_conf_ \"$cfgserver\"\n}\n\nss_mkjson_server_conf_() {\n\t[ -n \"$server_port\" ] || return 1\n\t[ -z \"$server\" ] || json_add_string server \"$server\"\n\tjson_add_int server_port \"$server_port\"\n\t[ -z \"$method\" ] || json_add_string method \"$method\"\n\t[ -z \"$key\" ] || json_add_string key \"$key\"\n\t[ -z \"$password\" ] || json_add_string password \"$password\"\n\t[ -z \"$plugin\" ] || json_add_string plugin \"$plugin\"\n\t[ -z \"$plugin_opts\" ] || json_add_string plugin_opts \"$plugin_opts\"\n}\n\nss_mkjson_ss_local_conf() {\n\tss_mkjson_server_conf\n}\n\nss_mkjson_ss_redir_conf() {\n\tss_mkjson_server_conf\n}\n\nss_mkjson_ss_server_conf() {\n\tss_mkjson_server_conf_\n}\n\nss_mkjson_ss_tunnel_conf() {\n\tss_mkjson_server_conf || return 1\n\t[ -n \"$tunnel_address\" ] || return 1\n\tjson_add_string tunnel_address \"$tunnel_address\"\n}\n\nss_xxx() {\n\tlocal cfg=\"$1\"\n\tlocal cfgtype=\"$2\"\n\tlocal bin=\"$ss_bindir/${cfgtype/_/-}\"\n\tlocal confjson=\"$ss_confdir/$cfgtype.$cfg.json\"\n\n\t[ -x \"$bin\" ] || return\n\teval \"$(\"validate_${cfgtype}_section\" \"$cfg\" ss_validate_mklocal)\"\n\t\"validate_${cfgtype}_section\" \"$cfg\" || return\n\t[ \"$disabled\" = 0 ] || return\n\n\tjson_init\n\tss_mkjson_${cfgtype}_conf || return\n\tjson_add_boolean use_syslog 1\n\tjson_add_boolean ipv6_first \"$ipv6_first\"\n\tjson_add_boolean fast_open \"$fast_open\"\n\tjson_add_boolean reuse_port \"$reuse_port\"\n\tjson_add_boolean no_delay \"$no_delay\"\n\t[ -z \"$local_address\" ] || json_add_string local_address \"$local_address\"\n\t[ -z \"$local_port\" ] || json_add_int local_port \"$local_port\"\n\t[ -z \"$local_ipv4_address\" ] || json_add_string local_ipv4_address \"$local_ipv4_address\"\n\t[ -z \"$local_ipv6_address\" ] || json_add_string local_ipv6_address \"$local_ipv6_address\"\n\t[ -z \"$mode\" ] || json_add_string mode \"$mode\"\n\t[ -z \"$mtu\" ] || json_add_int mtu \"$mtu\"\n\t[ -z \"$timeout\" ] || json_add_int timeout \"$timeout\"\n\t[ -z \"$user\" ] || json_add_string user \"$user\"\n\t[ -z \"$acl\" ] || json_add_string acl \"$acl\"\n\tjson_dump -i >\"$confjson\"\n\n\tprocd_open_instance \"$cfgtype.$cfg\"\n\tprocd_set_param command \"$bin\" -c \"$confjson\"\n\t[ \"$verbose\" = 0 ] || procd_append_param command -v\n\tif [ -n \"$bind_address\" ]; then\n\t\techo \"$cfgtype $cfg: uci option bind_address deprecated, please switch to local_address\" >&2\n\t\tprocd_append_param command -b \"$bind_address\"\n\tfi\n\tprocd_set_param file \"$confjson\"\n\tprocd_set_param respawn\n\tprocd_close_instance\n\tss_rules_cb\n}\n\nss_rules_cb() {\n\tlocal cfgserver server\n\n\tif [ \"$cfgtype\" = ss_redir ]; then\n\t\tconfig_get cfgserver \"$cfg\" server\n\t\tconfig_get server \"$cfgserver\" server\n\t\tss_redir_servers=\"$ss_redir_servers $server\"\n\t\tif [ \"$mode\" = tcp_only -o \"$mode\" = \"tcp_and_udp\" ]; then\n\t\t\teval \"ss_rules_redir_tcp_$cfg=$local_port\"\n\t\tfi\n\t\tif [ \"$mode\" = udp_only -o \"$mode\" = \"tcp_and_udp\" ]; then\n\t\t\teval \"ss_rules_redir_udp_$cfg=$local_port\"\n\t\tfi\n\tfi\n}\n\nss_rules_nft_gen() {\n\tlocal cfg=\"ss_rules\"\n\tlocal cfgtype\n\tlocal local_port_tcp local_port_udp\n\tlocal remote_servers\n\n\t[ -s \"$ssrules_uc\" ] || return 1\n\n\tconfig_get cfgtype \"$cfg\" TYPE\n\t[ \"$cfgtype\" = ss_rules ] || return 1\n\n\teval \"$(validate_ss_rules_section \"$cfg\" ss_validate_mklocal)\"\n\tvalidate_ss_rules_section \"$cfg\" || return 1\n\t[ \"$disabled\" = 0 ] || return 2\n\n\teval local_port_tcp=\"\\$ss_rules_redir_tcp_$redir_tcp\"\n\teval local_port_udp=\"\\$ss_rules_redir_udp_$redir_udp\"\n\t[ -n \"$local_port_tcp\" -o -n \"$local_port_udp\" ] || return 1\n\tremote_servers=\"$(echo $ss_redir_servers \\\n\t\t| tr ' ' '\\n' \\\n\t\t| sort -u \\\n\t\t| xargs -n 1 resolveip \\\n\t\t| sort -u)\"\n\n\tlocal tmp=\"/tmp/ssrules\"\n\tjson_init\n\tjson_add_string o_remote_servers \"$remote_servers\"\n\tjson_add_int o_redir_tcp_port \"$local_port_tcp\"\n\tjson_add_int o_redir_udp_port \"$local_port_udp\"\n\tjson_add_string o_ifnames \"$ifnames\"\n\tjson_add_string o_local_default \"$local_default\"\n\tjson_add_string o_src_bypass \"$src_ips_bypass\"\n\tjson_add_string o_src_forward \"$src_ips_forward\"\n\tjson_add_string o_src_checkdst \"$src_ips_checkdst\"\n\tjson_add_string o_src_default \"$src_default\"\n\tjson_add_string o_dst_bypass \"$dst_ips_bypass\"\n\tjson_add_string o_dst_forward \"$dst_ips_forward\"\n\tjson_add_string o_dst_bypass_file \"$dst_ips_bypass_file\"\n\tjson_add_string o_dst_forward_file \"$dst_ips_forward_file\"\n\tjson_add_string o_dst_default \"$dst_default\"\n\tjson_add_string o_nft_tcp_extra \"$nft_tcp_extra\"\n\tjson_add_string o_nft_udp_extra \"$nft_udp_extra\"\n\tjson_dump -i >\"$tmp.json\"\n\n\tif utpl -S -F \"$tmp.json\" \"$ssrules_uc\" >\"$tmp.nft\" \\\n\t\t&& ! cmp -s \"$tmp.nft\" \"$ssrules_nft\"; then\n\t\techo \"table inet chk {include \\\"$tmp.nft\\\";}\" >\"$tmp.nft.chk\"\n\t\tif nft -f \"$tmp.nft.chk\" -c; then\n\t\t\tmv \"$tmp.nft\" \"$ssrules_nft\"\n\t\t\tfw4 restart\n\t\tfi\n\t\trm -f \"$tmp.nft.chk\"\n\tfi\n\trm -f \"$tmp.json\"\n\trm -f \"$tmp.nft\"\n}\n\nss_rules_nft_reset() {\n\tif [ -f \"$ssrules_nft\" ]; then\n\t\trm -f \"$ssrules_nft\"\n\t\tfw4 restart\n\tfi\n}\n\nss_rules() {\n\tif ! ss_rules_nft_gen; then\n\t\tss_rules_nft_reset\n\tfi\n}\n\nstart_service() {\n\tlocal cfgtype\n\n\tmkdir -p \"$ss_confdir\"\n\tconfig_load shadowsocks-libev\n\tfor cfgtype in ss_local ss_redir ss_server ss_tunnel; do\n\t\tconfig_foreach ss_xxx \"$cfgtype\" \"$cfgtype\"\n\tdone\n\tss_rules\n}\n\nstop_service() {\n\tss_rules_nft_reset\n\trm -rf \"$ss_confdir\"\n}\n\nservice_triggers() {\n\tprocd_add_reload_interface_trigger wan\n\tprocd_add_reload_trigger shadowsocks-libev\n\tprocd_open_validate\n\tvalidate_server_section\n\tvalidate_ss_local_section\n\tvalidate_ss_redir_section\n\tvalidate_ss_rules_section\n\tvalidate_ss_server_section\n\tvalidate_ss_tunnel_section\n\tprocd_close_validate\n}\n\nss_validate_mklocal() {\n\tlocal tuple opts\n\n\tshift 2\n\tfor tuple in \"$@\"; do\n\t\topts=\"${tuple%%:*} $opts\"\n\tdone\n\t[ -z \"$opts\" ] || echo \"local $opts\"\n}\n\nss_validate() {\n\tuci_validate_section shadowsocks-libev \"$@\"\n}\n\nvalidate_common_server_options_() {\n\tlocal cfgtype=\"$1\"; shift\n\tlocal cfg=\"$1\"; shift\n\tlocal func=\"$1\"; shift\n\tlocal stream_methods='\"table\", \"rc4\", \"rc4-md5\", \"aes-128-cfb\", \"aes-192-cfb\", \"aes-256-cfb\", \"aes-128-ctr\", \"aes-192-ctr\", \"aes-256-ctr\", \"bf-cfb\", \"camellia-128-cfb\", \"camellia-192-cfb\", \"camellia-256-cfb\", \"salsa20\", \"chacha20\", \"chacha20-ietf\"'\n\tlocal aead_methods='\"aes-128-gcm\", \"aes-192-gcm\", \"aes-256-gcm\", \"chacha20-ietf-poly1305\", \"xchacha20-ietf-poly1305\"'\n\n\t\"${func:-ss_validate}\" \"$cfgtype\" \"$cfg\" \"$@\" \\\n\t\t'disabled:bool:0' \\\n\t\t'server:host' \\\n\t\t'server_port:port' \\\n\t\t'password:string' \\\n\t\t'key:string' \\\n\t\t\"method:or($stream_methods, $aead_methods)\" \\\n\t\t'plugin:string' \\\n\t\t'plugin_opts:string'\n}\n\nvalidate_common_client_options_() {\n\tvalidate_common_options_ \"$@\" \\\n\t\t'server:uci(\"shadowsocks-libev\", \"@server\")' \\\n\t\t'local_address:ipaddr:0.0.0.0' \\\n\t\t'local_port:port'\n}\n\nvalidate_common_options_() {\n\tlocal cfgtype=\"$1\"; shift\n\tlocal cfg=\"$1\"; shift\n\tlocal func=\"$1\"; shift\n\n\t\"${func:-ss_validate}\" \"$cfgtype\" \"$cfg\" \"$@\" \\\n\t\t'disabled:bool:0' \\\n\t\t'fast_open:bool:0' \\\n\t\t'ipv6_first:bool:0' \\\n\t\t'no_delay:bool:0' \\\n\t\t'reuse_port:bool:0' \\\n\t\t'verbose:bool:0' \\\n\t\t'mode:or(\"tcp_only\", \"udp_only\", \"tcp_and_udp\"):tcp_only' \\\n\t\t'mtu:uinteger' \\\n\t\t'timeout:uinteger' \\\n\t\t'user:string'\n}\n\nvalidate_server_section() {\n\tvalidate_common_server_options_ server \"$1\" \"$2\"\n}\n\nvalidate_ss_local_section() {\n\tvalidate_common_client_options_ ss_local \"$1\" \"$2\" \\\n\t\t'acl:file'\n}\n\nvalidate_ss_redir_section() {\n\tvalidate_common_client_options_ ss_redir \"$1\" \"$2\"\n}\n\nvalidate_ss_rules_section() {\n\t\"${2:-ss_validate}\" ss_rules \"$1\" \\\n\t\t'disabled:bool:0' \\\n\t\t'redir_tcp:uci(\"shadowsocks-libev\", \"@ss_redir\")' \\\n\t\t'redir_udp:uci(\"shadowsocks-libev\", \"@ss_redir\")' \\\n\t\t'src_ips_bypass:or(ipaddr,cidr)' \\\n\t\t'src_ips_forward:or(ipaddr,cidr)' \\\n\t\t'src_ips_checkdst:or(ipaddr,cidr)' \\\n\t\t'dst_ips_bypass_file:file' \\\n\t\t'dst_ips_bypass:or(ipaddr,cidr)' \\\n\t\t'dst_ips_forward_file:file' \\\n\t\t'dst_ips_forward:or(ipaddr,cidr)' \\\n\t\t'src_default:or(\"bypass\", \"forward\", \"checkdst\"):checkdst' \\\n\t\t'dst_default:or(\"bypass\", \"forward\"):bypass' \\\n\t\t'local_default:or(\"bypass\", \"forward\", \"checkdst\"):bypass' \\\n\t\t'nft_tcp_extra:string' \\\n\t\t'nft_udp_extra:string' \\\n\t\t'ifnames:maxlength(15)'\n}\n\nvalidate_ss_server_section() {\n\tvalidate_common_server_options_ ss_server \"$1\" \\\n\t\tvalidate_common_options_ \\\n\t\t\"$2\" \\\n\t\t'local_address:ipaddr' \\\n\t\t'local_ipv4_address:ip4addr' \\\n\t\t'local_ipv6_address:ip6addr' \\\n\t\t'bind_address:ipaddr' \\\n\t\t'acl:file'\n}\n\nvalidate_ss_tunnel_section() {\n\tvalidate_common_client_options_ ss_tunnel \"$1\" \\\n\t\t\"$2\" \\\n\t\t'tunnel_address:regex(\".+\\:[0-9]+\")'\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocks-libev/files/ss-rules/chain.uc",
    "content": "{%\nfunction get_local_verdict() {\n\tlet v = o_local_default;\n\tif (v == \"checkdst\") {\n\t\treturn \"goto ss_rules_dst_\" + proto;\n\t} else if (v == \"forward\") {\n\t\treturn \"goto ss_rules_forward_\" + proto;\n\t} else {\n\t\treturn null;\n\t}\n}\n\nfunction get_src_default_verdict() {\n\tlet v = o_src_default;\n\tif (v == \"checkdst\") {\n\t\treturn \"goto ss_rules_dst_\" + proto;\n\t} else if (v == \"forward\") {\n\t\treturn \"goto ss_rules_forward_\" + proto;\n\t} else {\n\t\treturn \"accept\";\n\t}\n}\n\nfunction get_dst_default_verdict() {\n\tlet v = o_dst_default;\n\tif (v == \"forward\") {\n\t\treturn \"goto ss_rules_forward_\" + proto;\n\t} else {\n\t\treturn \"accept\";\n\t}\n}\n\nfunction get_ifnames() {\n\tlet res = [];\n\tfor (let ifname in split(o_ifnames, /[ \\t\\n]/)) {\n\t\tifname = trim(ifname);\n\t\tif (ifname) push(res, ifname);\n\t}\n\treturn res;\n}\n\nlet type, hook, priority, redir_port;\nif (proto == \"tcp\") {\n\ttype = \"nat\";\n\thook = \"prerouting\";\n\tpriority = -1;\n\tredir_port = o_redir_tcp_port;\n} else if (proto == \"udp\") {\n\ttype = \"filter\";\n\thook = \"prerouting\";\n\tpriority = \"mangle\";\n\tredir_port = o_redir_udp_port;\n\tif (system(\"\n\t\tset -o errexit\n\t\tiprr() {\n\t\t\twhile ip $1 rule del fwmark 1 lookup 100 2>/dev/null; do true; done\n\t\t\t      ip $1 rule add fwmark 1 lookup 100\n\t\t\tip $1 route flush table 100 2>/dev/null || true\n\t\t\tip $1 route add local default dev lo table 100\n\t\t}\n\t\tiprr -4\n\t\tiprr -6\n\t\") != 0) {\n\t\treturn ;\n\t}\n} else {\n\treturn;\n}\n\n%}\n{% if (redir_port): %}\n\nchain ss_rules_pre_{{ proto }} {\n\ttype {{ type }} hook {{ hook }} priority {{ priority }};\n\tmeta l4proto {{ proto }}{%- let ifnames=get_ifnames(); if (length(ifnames)): %} iifname { {{join(\", \", ifnames)}} }{% endif %} goto ss_rules_pre_src_{{ proto }};\n}\n\nchain ss_rules_pre_src_{{ proto }} {\n\tip daddr @ss_rules_dst_bypass_ accept;\n\tip6 daddr @ss_rules6_dst_bypass_ accept;\n\tgoto ss_rules_src_{{ proto }};\n}\n\nchain ss_rules_src_{{ proto }} {\n\tip saddr @ss_rules_src_bypass accept;\n\tip saddr @ss_rules_src_forward goto ss_rules_forward_{{ proto }};\n\tip saddr @ss_rules_src_checkdst goto ss_rules_dst_{{ proto }};\n\tip6 saddr @ss_rules6_src_bypass accept;\n\tip6 saddr @ss_rules6_src_forward goto ss_rules_forward_{{ proto }};\n\tip6 saddr @ss_rules6_src_checkdst goto ss_rules_dst_{{ proto }};\n\t{{ get_src_default_verdict() }};\n}\n\nchain ss_rules_dst_{{ proto }} {\n\tip daddr @ss_rules_dst_bypass accept;\n\tip daddr @ss_rules_dst_forward goto ss_rules_forward_{{ proto }};\n\tip6 daddr @ss_rules6_dst_bypass accept;\n\tip6 daddr @ss_rules6_dst_forward goto ss_rules_forward_{{ proto }};\n\t{{ get_dst_default_verdict() }};\n}\n\n{%   if (proto == \"tcp\"): %}\nchain ss_rules_forward_{{ proto }} {\n\tmeta l4proto tcp {{ o_nft_tcp_extra }} redirect to :{{ redir_port }};\n}\n{%   let local_verdict = get_local_verdict(); if (local_verdict): %}\nchain ss_rules_local_out {\n\ttype {{ type }} hook output priority -1;\n\tmeta l4proto != tcp accept;\n\tip daddr @ss_rules_dst_bypass_ accept;\n\tip daddr @ss_rules_dst_bypass accept;\n\tip6 daddr @ss_rules6_dst_bypass_ accept;\n\tip6 daddr @ss_rules6_dst_bypass accept;\n\t{{ local_verdict }};\n}\n{%     endif %}\n{%   elif (proto == \"udp\"): %}\nchain ss_rules_forward_{{ proto }} {\n\tmeta l4proto udp {{ o_nft_udp_extra }} meta mark set 1 tproxy to :{{ redir_port }};\n}\n{%   endif %}\n{% endif %}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocks-libev/files/ss-rules/set.uc",
    "content": "{%\nlet fs = require(\"fs\");\n\nlet o_dst_bypass4_ = \"\n\t0.0.0.0/8\n\t10.0.0.0/8\n\t100.64.0.0/10\n\t127.0.0.0/8\n\t169.254.0.0/16\n\t172.16.0.0/12\n\t192.0.0.0/24\n\t192.0.2.0/24\n\t192.31.196.0/24\n\t192.52.193.0/24\n\t192.88.99.0/24\n\t192.168.0.0/16\n\t192.175.48.0/24\n\t198.18.0.0/15\n\t198.51.100.0/24\n\t203.0.113.0/24\n\t224.0.0.0/4\n\t240.0.0.0/4\n\";\nlet o_dst_bypass6_ = \"\n\t::1/128\n\t::/128\n\t::ffff:0:0/96\n\t64:ff9b:1::/48\n\t100::/64\n\tfe80::/10\n\t2001::/23\n\tfc00::/7\n\";\nlet o_dst_bypass_ = o_dst_bypass4_ + \" \" + o_dst_bypass6_;\n\nlet set_suffix = {\n\t\"src_bypass\": {\n\t\tstr: o_src_bypass,\n\t},\n\t\"src_forward\": {\n\t\tstr: o_src_forward,\n\t},\n\t\"src_checkdst\": {\n\t\tstr: o_src_checkdst,\n\t},\n\t\"dst_bypass\": {\n\t\tstr: o_dst_bypass + \" \" + o_remote_servers,\n\t\tfile: o_dst_bypass_file,\n\t},\n\t\"dst_bypass_\": {\n\t\tstr: o_dst_bypass_,\n\t},\n\t\"dst_forward\": {\n\t\tstr: o_dst_forward,\n\t\tfile: o_dst_forward_file,\n\t},\n\t\"dst_forward_rrst_\": {},\n};\n\nfunction set_name(suf, af) {\n\tif (af == 4) {\n\t\treturn \"ss_rules_\"+suf;\n\t} else {\n\t\treturn \"ss_rules6_\"+suf;\n\t}\n}\n\nfunction set_elements_parse(res, str, af) {\n\tfor (let addr in split(str, /[ \\t\\n]/)) {\n\t\taddr = trim(addr);\n\t\tif (!addr) continue;\n\t\tif (af == 4 && index(addr, \":\") != -1) continue;\n\t\tif (af == 6 && index(addr, \":\") == -1) continue;\n\t\tpush(res, addr);\n\t}\n}\n\nfunction set_elements(suf, af) {\n\tlet obj = set_suffix[suf];\n\tlet res = [];\n\tlet addr;\n\n\tlet str = obj[\"str\"];\n\tif (str) {\n\t\tset_elements_parse(res, str, af);\n\t}\n\n\tlet file = obj[\"file\"];\n\tif (file) {\n\t\tlet fd = fs.open(file);\n\t\tif (fd) {\n\t\t\tstr = fd.read(\"all\");\n\t\t\tset_elements_parse(res, str, af);\n\t\t}\n\t}\n\n\treturn res;\n}\n%}\n\n{% for (let suf in set_suffix): for (let af in [4, 6]): %}\nset {{ set_name(suf, af) }} {\n\ttype ipv{{af}}_addr;\n\tflags interval;\n\tauto-merge;\n{%   let elems = set_elements(suf, af); if (length(elems)): %}\n\telements = {\n{%     for (let i = 0; i < length(elems); i++): %}\n\t\t{{ elems[i] }}{% if (i < length(elems) - 1): %},{% endif %}{% print(\"\\n\") %}\n{%     endfor %}\n\t}\n{%   endif %}\n}\n{% endfor; endfor %}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocks-libev/files/ss-rules/ss-rules.uc",
    "content": "{%\n\ninclude(\"set.uc\");\ninclude(\"chain.uc\", {proto: \"tcp\"});\ninclude(\"chain.uc\", {proto: \"udp\"});\n\n%}\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocks-libev/patches/100-Upgrade-PCRE-to-PCRE2.patch",
    "content": "From d4f4d9761cbd41c3ab6de79383ff39b9f97bf452 Mon Sep 17 00:00:00 2001\nFrom: Syrone Wong <wong.syrone@gmail.com>\nDate: Sat, 18 Nov 2017 20:06:50 +0800\nSubject: [PATCH] Upgrade PCRE to PCRE2\n\n- Use 8bit variant by default\n\nThis comes from a PR closed and never reopen as at times PCRE2 was too\nnew(???.)\n\nRef: https://github.com/shadowsocks/shadowsocks-libev/pull/1792\nSigned-off-by: Syrone Wong <wong.syrone@gmail.com>\n[ squash the first 2 patch from PR, drop the last one ]\nSigned-off-by: Christian Marangi <ansuelsmth@gmail.com>\n---\n .travis.yml  |   9 ++-\n configure.ac |   8 +--\n m4/pcre.m4   | 152 ------------------------------------------\n m4/pcre2.m4  | 181 +++++++++++++++++++++++++++++++++++++++++++++++++++\n src/rule.c   |  53 ++++++++++++---\n src/rule.h   |  23 +++++--\n 6 files changed, 253 insertions(+), 173 deletions(-)\n delete mode 100644 m4/pcre.m4\n create mode 100644 m4/pcre2.m4\n\n# diff --git a/.travis.yml b/.travis.yml\n# index ee3424c..e7da08c 100644\n# --- a/.travis.yml\n# +++ b/.travis.yml\n# @@ -11,11 +11,12 @@ env:\n#      global:\n#          - LIBSODIUM_VER=1.0.12\n#          - MBEDTLS_VER=2.4.0\n# +        - PCRE2_VER=10.30\n#  before_install:\n#      - |\n#        if [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n#            # All dependencies for macOS build. Some packages has been installed by travis so use reinstall.\n# -          brew reinstall autoconf automake xmlto c-ares libev mbedtls libsodium asciidoc >> /dev/null 2>&1;\n# +          brew reinstall autoconf automake xmlto pcre2 c-ares libev mbedtls libsodium asciidoc >> /dev/null 2>&1;\n#        else\n#            wget  https://github.com/jedisct1/libsodium/releases/download/$LIBSODIUM_VER/libsodium-$LIBSODIUM_VER.tar.gz;\n#            tar xvf libsodium-$LIBSODIUM_VER.tar.gz;\n# @@ -29,6 +30,12 @@ before_install:\n#            make SHARED=1;\n#            sudo make install;\n#            popd;\n# +          wget https://ftp.pcre.org/pub/pcre/pcre2-$PCRE2_VER.tar.gz;\n# +          tar xvf pcre2-$PCRE2_VER.tar.gz;\n# +          pushd pcre2-$PCRE2_VER;\n# +          ./configure --prefix=/usr --enable-pcre2-16 --enable-pcre2-32 && make;\n# +          sudo make install;\n# +          popd;\n#            # Load cached docker images\n#            if [[ -d $HOME/docker ]]; then\n#                ls $HOME/docker/*.tar.gz | xargs -I {file} sh -c \"zcat {file} | docker load\";\n--- a/configure.ac\n+++ b/configure.ac\n@@ -20,10 +20,10 @@ AC_DISABLE_STATIC\n AC_DISABLE_SHARED\n LT_INIT([dlopen])\n \n-dnl Check for pcre library\n-TS_CHECK_PCRE\n-if test \"x${enable_pcre}\" != \"xyes\"; then\n-  AC_MSG_ERROR([Cannot find pcre library. Configure --with-pcre=DIR])\n+dnl Check for pcre2 library\n+TS_CHECK_PCRE2\n+if test \"x${enable_pcre2}\" != \"xyes\"; then\n+  AC_MSG_ERROR([Cannot find pcre2 library. Configure --with-pcre2=DIR])\n fi\n \n dnl Checks for using shared libraries from system\n--- a/m4/pcre.m4\n+++ /dev/null\n@@ -1,152 +0,0 @@\n-dnl -------------------------------------------------------- -*- autoconf -*-\n-dnl Licensed to the Apache Software Foundation (ASF) under one or more\n-dnl contributor license agreements.  See the NOTICE file distributed with\n-dnl this work for additional information regarding copyright ownership.\n-dnl The ASF licenses this file to You under the Apache License, Version 2.0\n-dnl (the \"License\"); you may not use this file except in compliance with\n-dnl the License.  You may obtain a copy of the License at\n-dnl\n-dnl     http://www.apache.org/licenses/LICENSE-2.0\n-dnl\n-dnl Unless required by applicable law or agreed to in writing, software\n-dnl distributed under the License is distributed on an \"AS IS\" BASIS,\n-dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n-dnl See the License for the specific language governing permissions and\n-dnl limitations under the License.\n-\n-dnl\n-dnl TS_ADDTO(variable, value)\n-dnl\n-dnl  Add value to variable\n-dnl\n-AC_DEFUN([TS_ADDTO], [\n-  if test \"x$$1\" = \"x\"; then\n-    test \"x$verbose\" = \"xyes\" && echo \"  setting $1 to \\\"$2\\\"\"\n-    $1=\"$2\"\n-  else\n-    ats_addto_bugger=\"$2\"\n-    for i in $ats_addto_bugger; do\n-      ats_addto_duplicate=\"0\"\n-      for j in $$1; do\n-        if test \"x$i\" = \"x$j\"; then\n-          ats_addto_duplicate=\"1\"\n-          break\n-        fi\n-      done\n-      if test $ats_addto_duplicate = \"0\"; then\n-        test \"x$verbose\" = \"xyes\" && echo \"  adding \\\"$i\\\" to $1\"\n-        $1=\"$$1 $i\"\n-      fi\n-    done\n-  fi\n-])dnl\n-\n-dnl\n-dnl TS_ADDTO_RPATH(path)\n-dnl\n-dnl   Adds path to variable with the '-rpath' directive.\n-dnl\n-AC_DEFUN([TS_ADDTO_RPATH], [\n-  AC_MSG_NOTICE([adding $1 to RPATH])\n-  TS_ADDTO(LIBTOOL_LINK_FLAGS, [-R$1])\n-])dnl\n-\n-dnl\n-dnl pcre.m4: Trafficserver's pcre autoconf macros\n-dnl\n-\n-dnl\n-dnl TS_CHECK_PCRE: look for pcre libraries and headers\n-dnl\n-AC_DEFUN([TS_CHECK_PCRE], [\n-enable_pcre=no\n-AC_ARG_WITH(pcre, [AC_HELP_STRING([--with-pcre=DIR],[use a specific pcre library])],\n-[\n-  if test \"x$withval\" != \"xyes\" && test \"x$withval\" != \"x\"; then\n-    pcre_base_dir=\"$withval\"\n-    if test \"$withval\" != \"no\"; then\n-      enable_pcre=yes\n-      case \"$withval\" in\n-      *\":\"*)\n-        pcre_include=\"`echo $withval |sed -e 's/:.*$//'`\"\n-        pcre_ldflags=\"`echo $withval |sed -e 's/^.*://'`\"\n-        AC_MSG_CHECKING(checking for pcre includes in $pcre_include libs in $pcre_ldflags )\n-        ;;\n-      *)\n-        pcre_include=\"$withval/include\"\n-        pcre_ldflags=\"$withval/lib\"\n-        AC_MSG_CHECKING(checking for pcre includes in $withval)\n-        ;;\n-      esac\n-    fi\n-  fi\n-],\n-[\n-  AC_CHECK_PROG(PCRE_CONFIG, pcre-config, pcre-config)\n-  if test \"x$PCRE_CONFIG\" != \"x\"; then\n-    enable_pcre=yes\n-    pcre_base_dir=\"`$PCRE_CONFIG --prefix`\"\n-    pcre_include=\"`$PCRE_CONFIG --cflags | sed -es/-I//`\"\n-    pcre_ldflags=\"`$PCRE_CONFIG --libs | sed -es/-lpcre// -es/-L//`\"\n-  fi\n-])\n-\n-if test \"x$pcre_base_dir\" = \"x\"; then\n-  AC_MSG_CHECKING([for pcre location])\n-  AC_CACHE_VAL(ats_cv_pcre_dir,[\n-  for dir in /usr/local /usr ; do\n-    if test -d $dir && ( test -f $dir/include/pcre.h || test -f $dir/include/pcre/pcre.h ); then\n-      ats_cv_pcre_dir=$dir\n-      break\n-    fi\n-  done\n-  ])\n-  pcre_base_dir=$ats_cv_pcre_dir\n-  if test \"x$pcre_base_dir\" = \"x\"; then\n-    enable_pcre=no\n-    AC_MSG_RESULT([not found])\n-  else\n-    enable_pcre=yes\n-    pcre_include=\"$pcre_base_dir/include\"\n-    pcre_ldflags=\"$pcre_base_dir/lib\"\n-    AC_MSG_RESULT([$pcre_base_dir])\n-  fi\n-else\n-  AC_MSG_CHECKING(for pcre headers in $pcre_include)\n-  if test -d $pcre_include && test -d $pcre_ldflags && ( test -f $pcre_include/pcre.h || test -f $pcre_include/pcre/pcre.h ); then\n-    AC_MSG_RESULT([ok])\n-  else\n-    AC_MSG_RESULT([not found])\n-  fi\n-fi\n-\n-pcreh=0\n-pcre_pcreh=0\n-if test \"$enable_pcre\" != \"no\"; then\n-  saved_ldflags=$LDFLAGS\n-  saved_cppflags=$CFLAGS\n-  pcre_have_headers=0\n-  pcre_have_libs=0\n-  if test \"$pcre_base_dir\" != \"/usr\"; then\n-    TS_ADDTO(CFLAGS, [-I${pcre_include}])\n-    TS_ADDTO(CFLAGS, [-DPCRE_STATIC])\n-    TS_ADDTO(LDFLAGS, [-L${pcre_ldflags}])\n-    TS_ADDTO_RPATH(${pcre_ldflags})\n-  fi\n-  AC_SEARCH_LIBS([pcre_exec], [pcre], [pcre_have_libs=1])\n-  if test \"$pcre_have_libs\" != \"0\"; then\n-    AC_CHECK_HEADERS(pcre.h, [pcre_have_headers=1])\n-    AC_CHECK_HEADERS(pcre/pcre.h, [pcre_have_headers=1])\n-  fi\n-  if test \"$pcre_have_headers\" != \"0\"; then\n-    AC_DEFINE(HAVE_LIBPCRE,1,[Compiling with pcre support])\n-    AC_SUBST(LIBPCRE, [-lpcre])\n-  else\n-    enable_pcre=no\n-    CFLAGS=$saved_cppflags\n-    LDFLAGS=$saved_ldflags\n-  fi\n-fi\n-AC_SUBST(pcreh)\n-AC_SUBST(pcre_pcreh)\n-])\n--- /dev/null\n+++ b/m4/pcre2.m4\n@@ -0,0 +1,181 @@\n+dnl -------------------------------------------------------- -*- autoconf -*-\n+dnl Licensed to the Apache Software Foundation (ASF) under one or more\n+dnl contributor license agreements.  See the NOTICE file distributed with\n+dnl this work for additional information regarding copyright ownership.\n+dnl The ASF licenses this file to You under the Apache License, Version 2.0\n+dnl (the \"License\"); you may not use this file except in compliance with\n+dnl the License.  You may obtain a copy of the License at\n+dnl\n+dnl     http://www.apache.org/licenses/LICENSE-2.0\n+dnl\n+dnl Unless required by applicable law or agreed to in writing, software\n+dnl distributed under the License is distributed on an \"AS IS\" BASIS,\n+dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+dnl See the License for the specific language governing permissions and\n+dnl limitations under the License.\n+\n+dnl Modified by Syrone Wong <wong.syrone@gmail.com> to support pcre2 8bit variant only\n+\n+dnl\n+dnl TS_ADDTO(variable, value)\n+dnl\n+dnl  Add value to variable\n+dnl\n+AC_DEFUN([TS_ADDTO], [\n+  if test \"x$$1\" = \"x\"; then\n+    test \"x$verbose\" = \"xyes\" && echo \"  setting $1 to \\\"$2\\\"\"\n+    $1=\"$2\"\n+  else\n+    ats_addto_bugger=\"$2\"\n+    for i in $ats_addto_bugger; do\n+      ats_addto_duplicate=\"0\"\n+      for j in $$1; do\n+        if test \"x$i\" = \"x$j\"; then\n+          ats_addto_duplicate=\"1\"\n+          break\n+        fi\n+      done\n+      if test $ats_addto_duplicate = \"0\"; then\n+        test \"x$verbose\" = \"xyes\" && echo \"  adding \\\"$i\\\" to $1\"\n+        $1=\"$$1 $i\"\n+      fi\n+    done\n+  fi\n+])dnl\n+\n+dnl\n+dnl TS_ADDTO_RPATH(path)\n+dnl\n+dnl   Adds path to variable with the '-rpath' directive.\n+dnl\n+AC_DEFUN([TS_ADDTO_RPATH], [\n+  AC_MSG_NOTICE([adding $1 to RPATH])\n+  TS_ADDTO(LIBTOOL_LINK_FLAGS, [-R$1])\n+])dnl\n+\n+dnl\n+dnl pcre2.m4: Trafficserver's pcre2 autoconf macros\n+dnl\n+\n+dnl\n+dnl TS_CHECK_PCRE2: look for pcre2 libraries and headers\n+dnl\n+AC_DEFUN([TS_CHECK_PCRE2], [\n+enable_pcre2=no\n+AC_ARG_WITH(pcre2, [AC_HELP_STRING([--with-pcre2=DIR],[use a specific pcre2 library])],\n+[\n+  if test \"x$withval\" != \"xyes\" && test \"x$withval\" != \"x\"; then\n+    pcre2_base_dir=\"$withval\"\n+    if test \"$withval\" != \"no\"; then\n+      enable_pcre2=yes\n+      case \"$withval\" in\n+      *\":\"*)\n+        pcre2_include=\"`echo $withval |sed -e 's/:.*$//'`\"\n+        pcre2_ldflags=\"`echo $withval |sed -e 's/^.*://'`\"\n+        AC_MSG_CHECKING(checking for pcre2 includes in $pcre2_include libs in $pcre2_ldflags )\n+        ;;\n+      *)\n+        pcre2_include=\"$withval/include\"\n+        pcre2_ldflags=\"$withval/lib\"\n+        AC_MSG_CHECKING(checking for pcre2 includes in $withval)\n+        ;;\n+      esac\n+    fi\n+  fi\n+],\n+[\n+  AC_CHECK_PROG(PCRE2_CONFIG, pcre2-config, pcre2-config)\n+  if test \"x$PCRE2_CONFIG\" != \"x\"; then\n+    enable_pcre2=yes\n+    pcre2_base_dir=\"`$PCRE2_CONFIG --prefix`\"\n+    pcre2_include=\"`$PCRE2_CONFIG --cflags | sed -es/-I//`\"\n+    pcre2_ldflags=\"`$PCRE2_CONFIG --libs8 | sed -es/-lpcre2-8// -es/-L//`\"\n+  fi\n+])\n+\n+if test \"x$pcre2_base_dir\" = \"x\"; then\n+  AC_MSG_CHECKING([for pcre2 location])\n+  AC_CACHE_VAL(ats_cv_pcre2_dir,[\n+  for dir in /usr/local /usr ; do\n+    if test -d $dir && ( test -f $dir/include/pcre2.h || test -f $dir/include/pcre2/pcre2.h ); then\n+      ats_cv_pcre2_dir=$dir\n+      break\n+    fi\n+  done\n+  ])\n+  pcre2_base_dir=$ats_cv_pcre2_dir\n+  if test \"x$pcre2_base_dir\" = \"x\"; then\n+    enable_pcre2=no\n+    AC_MSG_RESULT([not found])\n+  else\n+    enable_pcre2=yes\n+    pcre2_include=\"$pcre2_base_dir/include\"\n+    pcre2_ldflags=\"$pcre2_base_dir/lib\"\n+    AC_MSG_RESULT([$pcre2_base_dir])\n+  fi\n+else\n+  AC_MSG_CHECKING(for pcre2 headers in $pcre2_include)\n+  if test -d $pcre2_include && test -d $pcre2_ldflags && ( test -f $pcre2_include/pcre2.h || test -f $pcre2_include/pcre2/pcre2.h ); then\n+    AC_MSG_RESULT([ok])\n+  else\n+    AC_MSG_RESULT([not found])\n+  fi\n+fi\n+\n+pcre2h=0\n+pcre2_pcre2h=0\n+if test \"$enable_pcre2\" != \"no\"; then\n+  saved_ldflags=$LDFLAGS\n+  saved_cppflags=$CFLAGS\n+  pcre2_have_headers=0\n+  pcre2_have_libs=0\n+  if test \"$pcre2_base_dir\" != \"/usr\"; then\n+    TS_ADDTO(CFLAGS, [-I${pcre2_include}])\n+    TS_ADDTO(CFLAGS, [-DPCRE2_STATIC])\n+    TS_ADDTO(LDFLAGS, [-L${pcre2_ldflags}])\n+    TS_ADDTO_RPATH(${pcre2_ldflags})\n+  fi\n+  AC_SEARCH_LIBS([pcre2_match_8], [pcre2-8], [pcre2_have_libs=1])\n+  if test \"$pcre2_have_libs\" != \"0\"; then\n+      AC_MSG_CHECKING([pcre2.h])\n+  AC_COMPILE_IFELSE(\n+    [AC_LANG_PROGRAM(\n+      [[\n+#define PCRE2_CODE_UNIT_WIDTH 8\n+#include <pcre2.h>\n+      ]],\n+      [[\n+      ]]\n+    )],\n+    [pcre2_have_headers=1\n+    AC_MSG_RESULT([ok])],\n+    [AC_MSG_RESULT([not found])]\n+  )\n+\n+    AC_MSG_CHECKING([pcre2/pcre2.h])\n+  AC_COMPILE_IFELSE(\n+    [AC_LANG_PROGRAM(\n+      [[\n+#define PCRE2_CODE_UNIT_WIDTH 8\n+#include <pcre2/pcre2.h>\n+      ]],\n+      [[\n+      ]]\n+    )],\n+    [pcre2_have_headers=1\n+    AC_MSG_RESULT([ok])],\n+    [AC_MSG_RESULT([not found])]\n+  )\n+  fi\n+  if test \"$pcre2_have_headers\" != \"0\"; then\n+    AC_DEFINE(HAVE_LIBPCRE2,1,[Compiling with pcre2 support])\n+    AC_SUBST(LIBPCRE2, [-lpcre2-8])\n+  else\n+    enable_pcre2=no\n+    CFLAGS=$saved_cppflags\n+    LDFLAGS=$saved_ldflags\n+  fi\n+fi\n+AC_SUBST(pcre2h)\n+AC_SUBST(pcre2_pcre2h)\n+])\n--- a/src/rule.c\n+++ b/src/rule.c\n@@ -1,6 +1,7 @@\n /*\n  * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n  * Copyright (c) 2011 Manuel Kasper <mk@neon1.net>\n+ * Copyright (c) 2017 Syrone Wong <wong.syrone@gmail.com>\n  * All rights reserved.\n  *\n  * Redistribution and use in source and binary forms, with or without\n@@ -74,18 +75,37 @@ add_rule(struct cork_dllist *rules, rule\n     cork_dllist_add(rules, &rule->entries);\n }\n \n+/*\n+ * XXX: As pattern and subject are char arguments, they can be straightforwardly\n+ *      cast to PCRE2_SPTR as we are working in 8-bit code units.\n+ */\n+\n int\n init_rule(rule_t *rule)\n {\n     if (rule->pattern_re == NULL) {\n-        const char *reerr;\n-        int reerroffset;\n+        int errornumber;\n+        PCRE2_SIZE erroroffset;\n+        rule->pattern_re = pcre2_compile(\n+            (PCRE2_SPTR)rule->pattern,   /* the pattern */\n+            PCRE2_ZERO_TERMINATED,       /* indicates pattern is zero-terminated */\n+            0,                           /* default options */\n+            &errornumber,                /* for error number */\n+            &erroroffset,                /* for error offset */\n+            NULL);                       /* use default compile context */\n \n-        rule->pattern_re =\n-            pcre_compile(rule->pattern, 0, &reerr, &reerroffset, NULL);\n         if (rule->pattern_re == NULL) {\n-            LOGE(\"Regex compilation of \\\"%s\\\" failed: %s, offset %d\",\n-                 rule->pattern, reerr, reerroffset);\n+            PCRE2_UCHAR errbuffer[512];\n+            pcre2_get_error_message(errornumber, errbuffer, sizeof(errbuffer));\n+            LOGE(\"PCRE2 regex compilation failed at offset %d: %s\\n\", (int)erroroffset,\n+                 errbuffer);\n+            return 0;\n+        }\n+\n+        rule->pattern_re_match_data = pcre2_match_data_create_from_pattern(rule->pattern_re, NULL);\n+\n+        if (rule->pattern_re_match_data == NULL) {\n+            ERROR(\"PCRE2: the memory for the block could not be obtained\");\n             return 0;\n         }\n     }\n@@ -105,8 +125,15 @@ lookup_rule(const struct cork_dllist *ru\n \n     cork_dllist_foreach_void(rules, curr, next) {\n         rule_t *rule = cork_container_of(curr, rule_t, entries);\n-        if (pcre_exec(rule->pattern_re, NULL,\n-                      name, name_len, 0, 0, NULL, 0) >= 0)\n+        if (pcre2_match(\n+                rule->pattern_re,            /* the compiled pattern */\n+                (PCRE2_SPTR)name,            /* the subject string */\n+                name_len,                    /* the length of the subject */\n+                0,                           /* start at offset 0 in the subject */\n+                0,                           /* default options */\n+                rule->pattern_re_match_data, /* block for storing the result */\n+                NULL                         /* use default match context */\n+                ) >= 0)\n             return rule;\n     }\n \n@@ -127,7 +154,13 @@ free_rule(rule_t *rule)\n         return;\n \n     ss_free(rule->pattern);\n-    if (rule->pattern_re != NULL)\n-        pcre_free(rule->pattern_re);\n+    if (rule->pattern_re != NULL) {\n+        pcre2_code_free(rule->pattern_re);                    /* data and the compiled pattern. */\n+        rule->pattern_re            = NULL;\n+    }\n+    if (rule->pattern_re_match_data != NULL) {\n+        pcre2_match_data_free(rule->pattern_re_match_data);   /* Release memory used for the match */\n+        rule->pattern_re_match_data = NULL;\n+    }\n     ss_free(rule);\n }\n--- a/src/rule.h\n+++ b/src/rule.h\n@@ -1,6 +1,7 @@\n /*\n  * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n  * Copyright (c) 2011 Manuel Kasper <mk@neon1.net>\n+ * Copyright (c) 2017 Syrone Wong <wong.syrone@gmail.com>\n  * All rights reserved.\n  *\n  * Redistribution and use in source and binary forms, with or without\n@@ -33,17 +34,27 @@\n \n #include <libcork/ds.h>\n \n-#ifdef HAVE_PCRE_H\n-#include <pcre.h>\n-#elif HAVE_PCRE_PCRE_H\n-#include <pcre/pcre.h>\n-#endif\n+/*\n+ * The PCRE2_CODE_UNIT_WIDTH macro must be defined before including pcre2.h.\n+ * For a program that uses only one code unit width, setting it to 8, 16, or 32\n+ * makes it possible to use generic function names such as pcre2_compile(). Note\n+ * that just changing 8 to 16 (for example) is not sufficient to convert this\n+ * program to process 16-bit characters. Even in a fully 16-bit environment, where\n+ * string-handling functions such as strcmp() and printf() work with 16-bit\n+ * characters, the code for handling the table of named substrings will still need\n+ * to be modified.\n+ */\n+/* we only need to support ASCII chartable, thus set it to 8 */\n+#define PCRE2_CODE_UNIT_WIDTH 8\n+\n+#include <pcre2.h>\n \n typedef struct rule {\n     char *pattern;\n \n     /* Runtime fields */\n-    pcre *pattern_re;\n+    pcre2_code *pattern_re;\n+    pcre2_match_data *pattern_re_match_data;\n \n     struct cork_dllist_item entries;\n } rule_t;\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocks-libev/patches/101-Fix-mishandling-of-incoming-socket-buffer.-It-must-b.patch",
    "content": "From 8be7a7cb00b9540e9be05d409191b0bc1ba424f0 Mon Sep 17 00:00:00 2001\nFrom: notsure2 <notsure2@protonmail.com>\nDate: Mon, 11 Dec 2023 09:15:47 +0200\nSubject: [PATCH] Fix mishandling of incoming socket buffer. It must be set on\n the listening socket not the accepted socket.\n\n---\n src/local.c  | 16 ++++++++--------\n src/redir.c  | 16 ++++++++--------\n src/server.c | 16 ++++++++--------\n src/tunnel.c | 16 ++++++++--------\n 4 files changed, 32 insertions(+), 32 deletions(-)\n\n--- a/src/local.c\n+++ b/src/local.c\n@@ -205,6 +205,14 @@ create_and_bind(const char *addr, const\n             }\n         }\n \n+        if (tcp_incoming_sndbuf > 0) {\n+            setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));\n+        }\n+\n+        if (tcp_incoming_rcvbuf > 0) {\n+            setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));\n+        }\n+\n         s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);\n         if (s == 0) {\n             /* We managed to bind successfully! */\n@@ -1406,14 +1414,6 @@ accept_cb(EV_P_ ev_io *w, int revents)\n     setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n #endif\n \n-    if (tcp_incoming_sndbuf > 0) {\n-        setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));\n-    }\n-\n-    if (tcp_incoming_rcvbuf > 0) {\n-        setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));\n-    }\n-\n     server_t *server = new_server(serverfd);\n     server->listener = listener;\n \n--- a/src/redir.c\n+++ b/src/redir.c\n@@ -201,6 +201,14 @@ create_and_bind(const char *addr, const\n             LOGI(\"tcp tproxy mode enabled\");\n         }\n \n+        if (tcp_incoming_sndbuf > 0) {\n+            setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));\n+        }\n+\n+        if (tcp_incoming_rcvbuf > 0) {\n+            setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));\n+        }\n+\n         s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);\n         if (s == 0) {\n             /* We managed to bind successfully! */\n@@ -759,14 +767,6 @@ accept_cb(EV_P_ ev_io *w, int revents)\n     setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n #endif\n \n-    if (tcp_incoming_sndbuf > 0) {\n-        setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));\n-    }\n-\n-    if (tcp_incoming_rcvbuf > 0) {\n-        setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));\n-    }\n-\n     int index                    = rand() % listener->remote_num;\n     struct sockaddr *remote_addr = listener->remote_addr[index];\n \n--- a/src/server.c\n+++ b/src/server.c\n@@ -620,6 +620,14 @@ create_and_bind(const char *host, const\n             }\n         }\n \n+        if (tcp_incoming_sndbuf > 0) {\n+            setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));\n+        }\n+\n+        if (tcp_incoming_rcvbuf > 0) {\n+            setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));\n+        }\n+\n         // Enable out-of-tree mptcp\n         if (mptcp == 1) {\n             int i = 0;\n@@ -1769,14 +1777,6 @@ accept_cb(EV_P_ ev_io *w, int revents)\n     setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n #endif\n \n-    if (tcp_incoming_sndbuf > 0) {\n-        setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));\n-    }\n-\n-    if (tcp_incoming_rcvbuf > 0) {\n-        setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));\n-    }\n-\n     setnonblocking(serverfd);\n \n     server_t *server = new_server(serverfd, listener);\n--- a/src/tunnel.c\n+++ b/src/tunnel.c\n@@ -166,6 +166,14 @@ create_and_bind(const char *addr, const\n             }\n         }\n \n+        if (tcp_incoming_sndbuf > 0) {\n+            setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));\n+        }\n+\n+        if (tcp_incoming_rcvbuf > 0) {\n+            setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));\n+        }\n+\n         s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);\n         if (s == 0) {\n             /* We managed to bind successfully! */\n@@ -725,14 +733,6 @@ accept_cb(EV_P_ ev_io *w, int revents)\n     setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n #endif\n \n-    if (tcp_incoming_sndbuf > 0) {\n-        setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));\n-    }\n-\n-    if (tcp_incoming_rcvbuf > 0) {\n-        setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));\n-    }\n-\n     int index                    = rand() % listener->remote_num;\n     struct sockaddr *remote_addr = listener->remote_addr[index];\n \n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocks-libev/patches/102-deprecate-load16-be-replace-with-ntohs.patch",
    "content": "From f4ee43fa27e00a573d90a8cac68f12655570bbf7 Mon Sep 17 00:00:00 2001\nFrom: lwb1978 <86697442+lwb1978@users.noreply.github.com>\nDate: Tue, 4 Feb 2025 15:51:17 +0800\nSubject: [PATCH] Deprecate load16_be() function in favor to ntohs() function\n\n---\n src/aead.c     | 2 +-\n src/local.c    | 6 +++---\n src/server.c   | 2 +-\n src/udprelay.c | 2 +-\n src/utils.c    | 8 --------\n src/utils.h    | 1 -\n 6 files changed, 6 insertions(+), 15 deletions(-)\n\n--- a/src/aead.c\n+++ b/src/aead.c\n@@ -605,7 +605,7 @@ aead_chunk_decrypt(cipher_ctx_t *ctx, ui\n         return CRYPTO_ERROR;\n     assert(*plen == CHUNK_SIZE_LEN);\n \n-    mlen = load16_be(len_buf);\n+    mlen = ntohs(*(uint16_t*)len_buf);\n     mlen = mlen & CHUNK_SIZE_MASK;\n \n     if (mlen == 0)\n--- a/src/local.c\n+++ b/src/local.c\n@@ -390,7 +390,7 @@ server_handshake(EV_P_ ev_io *w, buffer_\n         abuf->len += in_addr_len + 2;\n \n         if (acl || verbose) {\n-            uint16_t p = load16_be(buf->data + request_len + in_addr_len);\n+            uint16_t p = ntohs(*(uint16_t*)(buf->data + request_len + in_addr_len));\n             if (!inet_ntop(AF_INET, (const void *)(buf->data + request_len),\n                            ip, INET_ADDRSTRLEN)) {\n                 LOGI(\"inet_ntop(AF_INET): %s\", strerror(errno));\n@@ -408,7 +408,7 @@ server_handshake(EV_P_ ev_io *w, buffer_\n         abuf->len += name_len + 2;\n \n         if (acl || verbose) {\n-            uint16_t p = load16_be(buf->data + request_len + 1 + name_len);\n+            uint16_t p = ntohs(*(uint16_t*)(buf->data + request_len + 1 + name_len));\n             memcpy(host, buf->data + request_len + 1, name_len);\n             host[name_len] = '\\0';\n             sprintf(port, \"%d\", p);\n@@ -422,7 +422,7 @@ server_handshake(EV_P_ ev_io *w, buffer_\n         abuf->len += in6_addr_len + 2;\n \n         if (acl || verbose) {\n-            uint16_t p = load16_be(buf->data + request_len + in6_addr_len);\n+            uint16_t p = ntohs(*(uint16_t*)(buf->data + request_len + in6_addr_len));\n             if (!inet_ntop(AF_INET6, (const void *)(buf->data + request_len),\n                            ip, INET6_ADDRSTRLEN)) {\n                 LOGI(\"inet_ntop(AF_INET6): %s\", strerror(errno));\n--- a/src/server.c\n+++ b/src/server.c\n@@ -1137,7 +1137,7 @@ server_recv_cb(EV_P_ ev_io *w, int reven\n             return;\n         }\n \n-        port = ntohs(load16_be(server->buf->data + offset));\n+        port = *(uint16_t*)(server->buf->data + offset);\n \n         offset += 2;\n \n--- a/src/udprelay.c\n+++ b/src/udprelay.c\n@@ -316,7 +316,7 @@ parse_udprelay_header(const char *buf, c\n     }\n \n     if (port != NULL) {\n-        sprintf(port, \"%d\", load16_be(buf + offset));\n+        sprintf(port, \"%d\", ntohs(*(uint16_t*)(buf + offset)));\n     }\n     offset += 2;\n \n--- a/src/utils.c\n+++ b/src/utils.c\n@@ -571,14 +571,6 @@ get_default_conf(void)\n #endif\n }\n \n-uint16_t\n-load16_be(const void *s)\n-{\n-    const uint8_t *in = (const uint8_t *)s;\n-    return ((uint16_t)in[0] << 8)\n-           | ((uint16_t)in[1]);\n-}\n-\n int\n get_mptcp(int enable)\n {\n--- a/src/utils.h\n+++ b/src/utils.h\n@@ -249,7 +249,6 @@ void *ss_realloc(void *ptr, size_t new_s\n \n int ss_is_ipv6addr(const char *addr);\n char *get_default_conf(void);\n-uint16_t load16_be(const void *s);\n int get_mptcp(int enable);\n \n #endif // _UTILS_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocks-rust/Makefile",
    "content": "# SPDX-License-Identifier: GPL-2.0-only\n#\n# Copyright (C) 2017-2020 Yousong Zhou <yszhou4tech@gmail.com>\n# Copyright (C) 2021-2023 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=shadowsocks-rust\nPKG_VERSION:=1.24.0\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/shadowsocks/shadowsocks-rust/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=a89865d1c5203de1b732017dd032e85f943d1592e8d3152eb7d2c4f3fca387bf\n\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILES:=LICENSE\n\nPKG_BUILD_DEPENDS:=rust/host\nPKG_BUILD_PARALLEL:=1\n\nRUST_PKG_FEATURES:=local-redir\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/rust/rust-package.mk\n\ndefine Package/shadowsocks-rust/Default\n  define Package/shadowsocks-rust-$(1)\n    SECTION:=net\n    CATEGORY:=Network\n    SUBMENU:=Web Servers/Proxies\n    TITLE:=shadowsocks-rust $(1)\n    URL:=https://github.com/shadowsocks/shadowsocks-rust\n    DEPENDS:=$$(RUST_ARCH_DEPENDS)\n  endef\n\n  define Package/shadowsocks-rust-$(1)/install\n\t$$(INSTALL_DIR) $$(1)/usr/bin\n\t$$(INSTALL_BIN) $$(PKG_INSTALL_DIR)/bin/$(1) $$(1)/usr/bin/\n  endef\nendef\n\nSHADOWSOCKS_COMPONENTS:=sslocal ssmanager ssserver ssurl ssservice\ndefine shadowsocks-rust/templates\n  $(foreach component,$(SHADOWSOCKS_COMPONENTS),\n    $(call Package/shadowsocks-rust/Default,$(component))\n  )\nendef\n$(eval $(call shadowsocks-rust/templates))\n\n$(foreach component,$(SHADOWSOCKS_COMPONENTS), \\\n  $(eval $(call BuildPackage,shadowsocks-rust-$(component))) \\\n)\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/Makefile",
    "content": "# SPDX-License-Identifier: GPL-2.0-only\n#\n# Copyright (C) 2017-2020 Yousong Zhou <yszhou4tech@gmail.com>\n# Copyright (C) 2018 Lean <coolsnowwolf@gmail.com>\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=shadowsocksr-libev\nPKG_VERSION:=2.5.6\nPKG_RELEASE:=12\n\nPKG_LICENSE:=GPL-3.0\nPKG_LICENSE_FILES:=LICENSE\n\nPKG_FIXUP:=autoreconf\nPKG_USE_MIPS16:=0\nPKG_BUILD_FLAGS:=no-mips16\nPKG_BUILD_PARALLEL:=1\nPKG_INSTALL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/shadowsocksr-libev/Default\n  define Package/shadowsocksr-libev-ssr-$(1)\n    SECTION:=net\n    CATEGORY:=Network\n    SUBMENU:=Web Servers/Proxies\n    TITLE:=shadowsocksr-libev ssr-$(1)\n    URL:=https://github.com/shadowsocksrr/shadowsocksr-libev\n    DEPENDS:=+libev +libsodium +libopenssl +libpthread +libpcre2 +libudns +zlib\n  endef\n\n  define Package/shadowsocksr-libev-ssr-$(1)/install\n\t$$(INSTALL_DIR) $$(1)/usr/bin\n\t$$(INSTALL_BIN) $$(PKG_INSTALL_DIR)/usr/bin/ss-$(1) $$(1)/usr/bin/ssr-$(1)\n  endef\nendef\n\nSHADOWSOCKSR_COMPONENTS:=check local nat redir server\ndefine shadowsocksr-libev/templates\n  $(foreach component,$(SHADOWSOCKSR_COMPONENTS),\n    $(call Package/shadowsocksr-libev/Default,$(component))\n  )\nendef\n$(eval $(call shadowsocksr-libev/templates))\n\nCONFIGURE_ARGS += \\\n\t--disable-documentation \\\n\t--disable-ssp \\\n\t--disable-assert \\\n\t--enable-system-shared-lib\n\nTARGET_CFLAGS += -flto\nTARGET_LDFLAGS += -Wl,--gc-sections,--as-needed\n\n$(foreach component,$(SHADOWSOCKSR_COMPONENTS), \\\n  $(eval $(call BuildPackage,shadowsocksr-libev-ssr-$(component))) \\\n)\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/patches/0001-Add-ss-server-and-ss-check.patch",
    "content": "--- a/Makefile.am\n+++ b/Makefile.am\n@@ -1,7 +1,7 @@\n if USE_SYSTEM_SHARED_LIB\n-SUBDIRS = libcork libipset src\n+SUBDIRS = libcork libipset src server\n else\n-SUBDIRS = libsodium libcork libipset libudns libev src\n+SUBDIRS = libsodium libcork libipset libudns libev src server\n endif\n \n if ENABLE_DOCUMENTATION\n--- a/Makefile.in\n+++ b/Makefile.in\n@@ -195,7 +195,7 @@ am__define_uniq_tagged_files = \\\n ETAGS = etags\n CTAGS = ctags\n CSCOPE = cscope\n-DIST_SUBDIRS = libsodium libcork libipset libudns libev src doc\n+DIST_SUBDIRS = libsodium libcork libipset libudns libev src server doc\n am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \\\n \t$(srcdir)/shadowsocks-libev.pc.in $(top_srcdir)/auto/ar-lib \\\n \t$(top_srcdir)/auto/compile $(top_srcdir)/auto/config.guess \\\n@@ -377,8 +377,9 @@ top_build_prefix = @top_build_prefix@\n top_builddir = @top_builddir@\n top_srcdir = @top_srcdir@\n @USE_SYSTEM_SHARED_LIB_FALSE@SUBDIRS = libsodium libcork libipset \\\n-@USE_SYSTEM_SHARED_LIB_FALSE@\tlibudns libev src $(am__append_1)\n-@USE_SYSTEM_SHARED_LIB_TRUE@SUBDIRS = libcork libipset src \\\n+@USE_SYSTEM_SHARED_LIB_FALSE@\tlibudns libev src server \\\n+@USE_SYSTEM_SHARED_LIB_FALSE@\t$(am__append_1)\n+@USE_SYSTEM_SHARED_LIB_TRUE@SUBDIRS = libcork libipset src server \\\n @USE_SYSTEM_SHARED_LIB_TRUE@\t$(am__append_1)\n ACLOCAL_AMFLAGS = -I m4\n pkgconfiglibdir = $(libdir)/pkgconfig\n--- a/configure\n+++ b/configure\n@@ -649,7 +649,6 @@ PTHREAD_CC\n ax_pthread_config\n INET_NTOP_LIB\n MV\n-RM\n GZIP\n XMLTO\n ASCIIDOC\n@@ -757,6 +756,7 @@ infodir\n docdir\n oldincludedir\n includedir\n+runstatedir\n localstatedir\n sharedstatedir\n sysconfdir\n@@ -857,6 +857,7 @@ datadir='${datarootdir}'\n sysconfdir='${prefix}/etc'\n sharedstatedir='${prefix}/com'\n localstatedir='${prefix}/var'\n+runstatedir='${localstatedir}/run'\n includedir='${prefix}/include'\n oldincludedir='/usr/include'\n docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'\n@@ -1109,6 +1110,15 @@ do\n   | -silent | --silent | --silen | --sile | --sil)\n     silent=yes ;;\n \n+  -runstatedir | --runstatedir | --runstatedi | --runstated \\\n+  | --runstate | --runstat | --runsta | --runst | --runs \\\n+  | --run | --ru | --r)\n+    ac_prev=runstatedir ;;\n+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \\\n+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \\\n+  | --run=* | --ru=* | --r=*)\n+    runstatedir=$ac_optarg ;;\n+\n   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)\n     ac_prev=sbindir ;;\n   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \\\n@@ -1246,7 +1256,7 @@ fi\n for ac_var in\texec_prefix prefix bindir sbindir libexecdir datarootdir \\\n \t\tdatadir sysconfdir sharedstatedir localstatedir includedir \\\n \t\toldincludedir docdir infodir htmldir dvidir pdfdir psdir \\\n-\t\tlibdir localedir mandir\n+\t\tlibdir localedir mandir runstatedir\n do\n   eval ac_val=\\$$ac_var\n   # Remove trailing slashes.\n@@ -1399,6 +1409,7 @@ Fine tuning of the installation director\n   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]\n   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]\n   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]\n+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]\n   --libdir=DIR            object code libraries [EPREFIX/lib]\n   --includedir=DIR        C header files [PREFIX/include]\n   --oldincludedir=DIR     C header files for non-gcc [/usr/include]\n@@ -2472,8 +2483,8 @@ ac_configure=\"$SHELL $ac_aux_dir/configu\n \n \n \n-# expand $ac_aux_dir to an absolute path\n-am_aux_dir=`cd $ac_aux_dir && pwd`\n+# Expand $ac_aux_dir to an absolute path.\n+am_aux_dir=`cd \"$ac_aux_dir\" && pwd`\n \n ac_ext=c\n ac_cpp='$CPP $CPPFLAGS'\n@@ -3783,7 +3794,7 @@ $as_echo \"$ac_cv_safe_to_define___extens\n \n \n \n-am__api_version='1.14'\n+am__api_version='1.15'\n \n # Find a good install program.  We prefer a C program (faster),\n # so one script is as good as another.  But avoid the broken or\n@@ -3972,7 +3983,7 @@ else\n $as_echo \"$as_me: WARNING: 'missing' script is too old or missing\" >&2;}\n fi\n \n-if test x\"${install_sh}\" != xset; then\n+if test x\"${install_sh+set}\" != xset; then\n   case $am_aux_dir in\n   *\\ * | *\\\t*)\n     install_sh=\"\\${SHELL} '$am_aux_dir/install-sh'\" ;;\n@@ -4363,8 +4374,8 @@ MAKEINFO=${MAKEINFO-\"${am_missing_run}ma\n # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>\n mkdir_p='$(MKDIR_P)'\n \n-# We need awk for the \"check\" target.  The system \"awk\" is bad on\n-# some platforms.\n+# We need awk for the \"check\" target (and possibly the TAP driver).  The\n+# system \"awk\" is bad on some platforms.\n # Always define AMTAR for backward compatibility.  Yes, it's still used\n # in the wild :-(  We should find a proper way to deprecate it ...\n AMTAR='$${TAR-tar}'\n@@ -4549,6 +4560,7 @@ END\n     as_fn_error $? \"Your 'rm' program is bad, sorry.\" \"$LINENO\" 5\n   fi\n fi\n+\n if test -n \"$ac_tool_prefix\"; then\n   for ac_prog in ar lib \"link -lib\"\n   do\n@@ -12494,47 +12506,6 @@ $as_echo \"no\" >&6; }\n fi\n \n \n-  # Extract the first word of \"rm\", so it can be a program name with args.\n-set dummy rm; ac_word=$2\n-{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n-$as_echo_n \"checking for $ac_word... \" >&6; }\n-if ${ac_cv_path_RM+:} false; then :\n-  $as_echo_n \"(cached) \" >&6\n-else\n-  case $RM in\n-  [\\\\/]* | ?:[\\\\/]*)\n-  ac_cv_path_RM=\"$RM\" # Let the user override the test with a path.\n-  ;;\n-  *)\n-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\n-for as_dir in $PATH\n-do\n-  IFS=$as_save_IFS\n-  test -z \"$as_dir\" && as_dir=.\n-    for ac_exec_ext in '' $ac_executable_extensions; do\n-  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n-    ac_cv_path_RM=\"$as_dir/$ac_word$ac_exec_ext\"\n-    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n-    break 2\n-  fi\n-done\n-  done\n-IFS=$as_save_IFS\n-\n-  test -z \"$ac_cv_path_RM\" && ac_cv_path_RM=\"rm\"\n-  ;;\n-esac\n-fi\n-RM=$ac_cv_path_RM\n-if test -n \"$RM\"; then\n-  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $RM\" >&5\n-$as_echo \"$RM\" >&6; }\n-else\n-  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n-$as_echo \"no\" >&6; }\n-fi\n-\n-\n   # Extract the first word of \"mv\", so it can be a program name with args.\n set dummy mv; ac_word=$2\n { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n@@ -16204,15 +16175,162 @@ $as_echo \"#define HAVE_IPv6 1\" >>confdef\n \n \n if test -z \"$USE_SYSTEM_SHARED_LIB_TRUE\"; then :\n-  else\n+\n+    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for sodium_init in -lsodium\" >&5\n+$as_echo_n \"checking for sodium_init in -lsodium... \" >&6; }\n+if ${ac_cv_lib_sodium_sodium_init+:} false; then :\n+  $as_echo_n \"(cached) \" >&6\n+else\n+  ac_check_lib_save_LIBS=$LIBS\n+LIBS=\"-lsodium  $LIBS\"\n+cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n+/* end confdefs.h.  */\n+\n+/* Override any GCC internal prototype to avoid an error.\n+   Use char because int might match the return type of a GCC\n+   builtin and then its argument prototype would still apply.  */\n+#ifdef __cplusplus\n+extern \"C\"\n+#endif\n+char sodium_init ();\n+int\n+main ()\n+{\n+return sodium_init ();\n+  ;\n+  return 0;\n+}\n+_ACEOF\n+if ac_fn_c_try_link \"$LINENO\"; then :\n+  ac_cv_lib_sodium_sodium_init=yes\n+else\n+  ac_cv_lib_sodium_sodium_init=no\n+fi\n+rm -f core conftest.err conftest.$ac_objext \\\n+    conftest$ac_exeext conftest.$ac_ext\n+LIBS=$ac_check_lib_save_LIBS\n+fi\n+{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sodium_sodium_init\" >&5\n+$as_echo \"$ac_cv_lib_sodium_sodium_init\" >&6; }\n+if test \"x$ac_cv_lib_sodium_sodium_init\" = xyes; then :\n+  cat >>confdefs.h <<_ACEOF\n+#define HAVE_LIBSODIUM 1\n+_ACEOF\n+\n+  LIBS=\"-lsodium $LIBS\"\n+\n+else\n+\n+       as_fn_error $? \"Couldn't find libsodium. Try installing libsodium-dev[el].\" \"$LINENO\" 5\n+\n+fi\n+\n+\n+else\n   subdirs=\"$subdirs libsodium\"\n \n fi\n \n-ac_config_files=\"$ac_config_files shadowsocks-libev.pc Makefile libcork/Makefile libipset/Makefile src/Makefile\"\n+ac_config_files=\"$ac_config_files shadowsocks-libev.pc Makefile libcork/Makefile libipset/Makefile src/Makefile server/Makefile\"\n \n if test -z \"$USE_SYSTEM_SHARED_LIB_TRUE\"; then :\n-  else\n+\n+    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dns_dnlen in -ludns\" >&5\n+$as_echo_n \"checking for dns_dnlen in -ludns... \" >&6; }\n+if ${ac_cv_lib_udns_dns_dnlen+:} false; then :\n+  $as_echo_n \"(cached) \" >&6\n+else\n+  ac_check_lib_save_LIBS=$LIBS\n+LIBS=\"-ludns  $LIBS\"\n+cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n+/* end confdefs.h.  */\n+\n+/* Override any GCC internal prototype to avoid an error.\n+   Use char because int might match the return type of a GCC\n+   builtin and then its argument prototype would still apply.  */\n+#ifdef __cplusplus\n+extern \"C\"\n+#endif\n+char dns_dnlen ();\n+int\n+main ()\n+{\n+return dns_dnlen ();\n+  ;\n+  return 0;\n+}\n+_ACEOF\n+if ac_fn_c_try_link \"$LINENO\"; then :\n+  ac_cv_lib_udns_dns_dnlen=yes\n+else\n+  ac_cv_lib_udns_dns_dnlen=no\n+fi\n+rm -f core conftest.err conftest.$ac_objext \\\n+    conftest$ac_exeext conftest.$ac_ext\n+LIBS=$ac_check_lib_save_LIBS\n+fi\n+{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_udns_dns_dnlen\" >&5\n+$as_echo \"$ac_cv_lib_udns_dns_dnlen\" >&6; }\n+if test \"x$ac_cv_lib_udns_dns_dnlen\" = xyes; then :\n+  cat >>confdefs.h <<_ACEOF\n+#define HAVE_LIBUDNS 1\n+_ACEOF\n+\n+  LIBS=\"-ludns $LIBS\"\n+\n+else\n+  as_fn_error $? \"Couldn't find libudns. Try installing libudns-dev or udns-devel.\" \"$LINENO\" 5\n+fi\n+\n+    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ev_loop_destroy in -lev\" >&5\n+$as_echo_n \"checking for ev_loop_destroy in -lev... \" >&6; }\n+if ${ac_cv_lib_ev_ev_loop_destroy+:} false; then :\n+  $as_echo_n \"(cached) \" >&6\n+else\n+  ac_check_lib_save_LIBS=$LIBS\n+LIBS=\"-lev  $LIBS\"\n+cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n+/* end confdefs.h.  */\n+\n+/* Override any GCC internal prototype to avoid an error.\n+   Use char because int might match the return type of a GCC\n+   builtin and then its argument prototype would still apply.  */\n+#ifdef __cplusplus\n+extern \"C\"\n+#endif\n+char ev_loop_destroy ();\n+int\n+main ()\n+{\n+return ev_loop_destroy ();\n+  ;\n+  return 0;\n+}\n+_ACEOF\n+if ac_fn_c_try_link \"$LINENO\"; then :\n+  ac_cv_lib_ev_ev_loop_destroy=yes\n+else\n+  ac_cv_lib_ev_ev_loop_destroy=no\n+fi\n+rm -f core conftest.err conftest.$ac_objext \\\n+    conftest$ac_exeext conftest.$ac_ext\n+LIBS=$ac_check_lib_save_LIBS\n+fi\n+{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ev_ev_loop_destroy\" >&5\n+$as_echo \"$ac_cv_lib_ev_ev_loop_destroy\" >&6; }\n+if test \"x$ac_cv_lib_ev_ev_loop_destroy\" = xyes; then :\n+  cat >>confdefs.h <<_ACEOF\n+#define HAVE_LIBEV 1\n+_ACEOF\n+\n+  LIBS=\"-lev $LIBS\"\n+\n+else\n+  as_fn_error $? \"Couldn't find libev. Try installing libev-dev[el].\" \"$LINENO\" 5\n+fi\n+\n+\n+else\n   ac_config_files=\"$ac_config_files libudns/Makefile libev/Makefile\"\n \n fi\n@@ -17258,6 +17376,7 @@ do\n     \"libcork/Makefile\") CONFIG_FILES=\"$CONFIG_FILES libcork/Makefile\" ;;\n     \"libipset/Makefile\") CONFIG_FILES=\"$CONFIG_FILES libipset/Makefile\" ;;\n     \"src/Makefile\") CONFIG_FILES=\"$CONFIG_FILES src/Makefile\" ;;\n+    \"server/Makefile\") CONFIG_FILES=\"$CONFIG_FILES server/Makefile\" ;;\n     \"libudns/Makefile\") CONFIG_FILES=\"$CONFIG_FILES libudns/Makefile\" ;;\n     \"libev/Makefile\") CONFIG_FILES=\"$CONFIG_FILES libev/Makefile\" ;;\n     \"doc/Makefile\") CONFIG_FILES=\"$CONFIG_FILES doc/Makefile\" ;;\n@@ -17958,8 +18077,8 @@ $as_echo X\"$file\" |\n     fi\n \n     cfgfile=\"${ofile}T\"\n-    trap \"$RM -f \\\"$cfgfile\\\"; exit 1\" 1 2 15\n-    $RM -f \"$cfgfile\"\n+    trap \"$RM \\\"$cfgfile\\\"; exit 1\" 1 2 15\n+    $RM \"$cfgfile\"\n \n     cat <<_LT_EOF >> \"$cfgfile\"\n #! $SHELL\n--- a/configure.ac\n+++ b/configure.ac\n@@ -315,7 +315,8 @@ AC_CONFIG_FILES([ shadowsocks-libev.pc\n                  Makefile\n                  libcork/Makefile\n                  libipset/Makefile\n-                 src/Makefile])\n+                 src/Makefile\n+\t\t server/Makefile])\n AM_COND_IF([USE_SYSTEM_SHARED_LIB],[\n     AC_CHECK_LIB([udns], [dns_dnlen], ,[AC_MSG_ERROR([Couldn't find libudns. Try installing libudns-dev or udns-devel.])])\n     AC_CHECK_LIB([ev], [ev_loop_destroy], ,[AC_MSG_ERROR([Couldn't find libev. Try installing libev-dev@<:@el@:>@.])])\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/patches/0002-Revert-verify_simple-and-auth_simple.patch",
    "content": "--- a/src/obfs/obfs.c\n+++ b/src/obfs/obfs.c\n@@ -88,7 +88,7 @@ obfs_class *new_obfs_class(const char *p\n         plugin->client_decode = tls12_ticket_auth_client_decode;\n \n         return plugin;\n-        /*} else if (strcmp(plugin_name, \"verify_simple\") == 0) {\n+        } else if (strcmp(plugin_name, \"verify_simple\") == 0) {\n             obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs_class));\n             plugin->init_data = init_data;\n             plugin->new_obfs = verify_simple_new_obfs;\n@@ -115,7 +115,7 @@ obfs_class *new_obfs_class(const char *p\n             plugin->client_udp_pre_encrypt = NULL;\n             plugin->client_udp_post_decrypt = NULL;\n \n-            return plugin;*/\n+            return plugin;\n     } else if (strcmp(plugin_name, \"auth_sha1\") == 0) {\n         obfs_class *plugin = (obfs_class *) malloc(sizeof(obfs_class));\n         plugin->init_data = auth_simple_init_data;\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/patches/0003-Refine-Usage.patch",
    "content": "--- a/src/utils.c\n+++ b/src/utils.c\n@@ -258,8 +258,6 @@ usage()\n {\n     printf(\"\\n\");\n     printf(\"shadowsocks-libev %s with %s\\n\\n\", VERSION, USING_CRYPTO);\n-    printf(\n-        \"  maintained by Max Lv <max.c.lv@gmail.com> and Linus Yang <laokongzi@gmail.com>\\n\\n\");\n     printf(\"  usage:\\n\\n\");\n #ifdef MODULE_LOCAL\n     printf(\"    ss-local\\n\");\n@@ -299,6 +297,25 @@ usage()\n         \"                                  The default cipher is rc4-md5.\\n\");\n     printf(\"\\n\");\n     printf(\n+        \"       -o <obfs>                  Obfs of your remote server: plain,\\n\");\n+    printf(\n+        \"                                  http_simple, http_post and tls1.2_ticket_auth.\\n\");\n+    printf(\n+        \"       -g <obfs-param>            Obfs-Param of your remote server.\\n\");\n+    printf(\n+        \"       -O <protocol>              Protocol of your remote server: origin,\\n\");\n+    printf(\n+        \"                                  auth_sha1, auth_sha1_v2, auth_sha1_v4,\\n\");\n+    printf(\n+        \"                                  auth_aes128_md5, auth_aes128_sha1,\\n\");\n+    printf(\n+        \"                                  auth_chain_a, auth_chain_b, auth_chain_c,\\n\");\n+    printf(\n+        \"                                  auth_chain_d, auth_chain_e and auth_chain_f.\\n\");\n+    printf(\n+        \"       -G <protocol-param>        Protocol-Param of your remote server.\\n\");\n+    printf(\"\\n\");\n+    printf(\n         \"       [-a <user>]                Run as another user.\\n\");\n     printf(\n         \"       [-f <pid_file>]            The file path to store pid.\\n\");\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/patches/100-fix-gcc-10.patch",
    "content": "--- a/src/http.h\n+++ b/src/http.h\n@@ -29,6 +29,6 @@\n #include <stdio.h>\n #include \"protocol.h\"\n \n-const protocol_t *const http_protocol;\n+extern const protocol_t *const http_protocol;\n \n #endif\n--- a/src/tls.h\n+++ b/src/tls.h\n@@ -28,6 +28,6 @@\n \n #include \"protocol.h\"\n \n-const protocol_t *const tls_protocol;\n+extern const protocol_t *const tls_protocol;\n \n #endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/patches/101-Fix-Werror-sizeof-pointer-memaccess.patch",
    "content": "--- a/src/local.c\n+++ b/src/local.c\n@@ -718,7 +718,7 @@ server_recv_cb(EV_P_ ev_io *w, int reven\n \r\n                     ss_free(hostname);\r\n                 } else {\r\n-                    strncpy(host, ip, sizeof(ip));\r\n+                    strncpy(host, ip, INET6_ADDRSTRLEN);\r\n                 }\r\n             }\r\n \r\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/patches/102-Read-listening-mode-from-config.patch",
    "content": "--- a/src/jconf.c\n+++ b/src/jconf.c\n@@ -259,6 +259,19 @@ read_jconf(const char *file)\n                     conf.server_legacy.obfs = to_string(value);\n                 } else if (strcmp(name, \"obfs_param\") == 0) { // SSR\n                     conf.server_legacy.obfs_param = to_string(value);\n+                } else if (strcmp(name, \"mode\") == 0) {\n+                    char *mode_str = to_string(value);\n+\n+                    if (strcmp(mode_str, \"tcp_only\") == 0)\n+                        conf.mode = TCP_ONLY;\n+                    else if (strcmp(mode_str, \"tcp_and_udp\") == 0)\n+                        conf.mode = TCP_AND_UDP;\n+                    else if (strcmp(mode_str, \"udp_only\") == 0)\n+                        conf.mode = UDP_ONLY;\n+                    else\n+                        LOGI(\"ignore unknown mode: %s, use tcp_only as fallback\",\n+                             mode_str);\n+                    ss_free(mode_str);\n                 } else {\n                     match = 0;\n                 }\n--- a/src/redir.c\n+++ b/src/redir.c\n@@ -1252,6 +1252,9 @@ main(int argc, char **argv)\n         if (user == NULL) {\n             user = conf->user;\n         }\n+        if (mode == TCP_ONLY) {\n+            mode = conf->mode;\n+        }\n         if (mtu == 0) {\n             mtu = conf->mtu;\n         }\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/patches/103-Add-TPROXY-support-for-TCP-ssr-redir.patch",
    "content": "--- a/completions/bash/ss-redir\n+++ b/completions/bash/ss-redir\n@@ -2,7 +2,7 @@ _ss_redir()\n {\n     local cur prev opts ciphers\n     ciphers='rc4-md5 table rc4 aes-128-cfb aes-192-cfb aes-256-cfb aes-128-ctr aes-192-ctr aes-256-ctr bf-cfb camellia-128-cfb camellia-192-cfb camellia-256-cfb cast5-cfb des-cfb idea-cfb rc2-cfb seed-cfb salsa20 chacha20 and chacha20-ietf'\n-    opts='-s -b -p -k -f -t -m -c -a -n -u -U -v -h -A --mtu --help --mptcp -l'\n+    opts='-s -b -p -k -f -t -m -c -a -n -u -U -T -v -h -A --mtu --help --mptcp -l'\n     cur=${COMP_WORDS[COMP_CWORD]}\n     prev=\"${COMP_WORDS[COMP_CWORD-1]}\"\n     case \"$prev\" in\n--- a/src/jconf.c\n+++ b/src/jconf.c\n@@ -338,7 +338,11 @@ read_jconf(const char *file)\n                     check_json_value_type(value, json_boolean,\n                                           \"invalid config file: option 'ipv6_first' must be a boolean\");\n                     conf.ipv6_first = value->u.boolean;\n-                }\n+                } else if (strcmp(name, \"tcp_tproxy\") == 0) {\n+                    check_json_value_type(value, json_boolean,\n+                                          \"invalid config file: option 'tcp_tproxy' must be a boolean\");\n+\t\t\t\t\tconf.tcp_tproxy = value->u.boolean;\n+\t\t\t\t}\n             }\n         }\n     } else {\n--- a/src/jconf.h\n+++ b/src/jconf.h\n@@ -105,6 +105,7 @@ typedef struct {\n     int mtu;\n     int mptcp;\n     int ipv6_first;\n+\tint tcp_tproxy;\n } jconf_t;\n \n jconf_t *read_jconf(const char *file);\n--- a/src/redir.c\n+++ b/src/redir.c\n@@ -71,6 +71,14 @@\n #define IP6T_SO_ORIGINAL_DST 80\n #endif\n \n+#ifndef IP_TRANSPARENT\n+#define IP_TRANSPARENT       19\n+#endif\n+\n+#ifndef IPV6_TRANSPARENT\n+#define IPV6_TRANSPARENT     75\n+#endif\n+\n #include \"includeobfs.h\" // I don't want to modify makefile\n #include \"jconf.h\"\n \n@@ -101,18 +109,28 @@ static struct cork_dllist inactive_profi\n static listen_ctx_t *current_profile;\n static struct cork_dllist all_connections;\n \n+static int tcp_tproxy = 0; /* use tproxy instead of redirect (for tcp) */\n+\n int\n getdestaddr(int fd, struct sockaddr_storage *destaddr)\n {\n     socklen_t socklen = sizeof(*destaddr);\n     int error         = 0;\n \n-    error = getsockopt(fd, SOL_IPV6, IP6T_SO_ORIGINAL_DST, destaddr, &socklen);\n-    if (error) { // Didn't find a proper way to detect IP version.\n-        error = getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, destaddr, &socklen);\n-        if (error) {\n-            return -1;\n-        }\n+\tif (tcp_tproxy) {\n+        error = getsockname(fd, (void *)destaddr, &socklen);\n+    } else {\n+\t\terror = getsockopt(fd, SOL_IPV6, IP6T_SO_ORIGINAL_DST, destaddr, &socklen);\n+\t\tif (error) { // Didn't find a proper way to detect IP version.\n+\t\t\terror = getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, destaddr, &socklen);\n+\t\t\tif (error) {\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t}\n+\t}\n+\t\n+\tif (error) {\n+        return -1;\n     }\n     return 0;\n }\n@@ -164,6 +182,23 @@ create_and_bind(const char *addr, const\n         if (err == 0) {\n             LOGI(\"tcp port reuse enabled\");\n         }\n+\t\t\n+\t\tif (tcp_tproxy) {\n+            int level = 0, optname = 0;\n+            if (rp->ai_family == AF_INET) {\n+                level = IPPROTO_IP;\n+                optname = IP_TRANSPARENT;\n+            } else {\n+                level = IPPROTO_IPV6;\n+                optname = IPV6_TRANSPARENT;\n+            }\n+\n+            if (setsockopt(listen_sock, level, optname, &opt, sizeof(opt)) != 0) {\n+                ERROR(\"setsockopt IP_TRANSPARENT\");\n+                exit(EXIT_FAILURE);\n+            }\n+            LOGI(\"tcp tproxy mode enabled\");\n+        }\n \n         s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);\n         if (s == 0) {\n@@ -1094,7 +1129,7 @@ main(int argc, char **argv)\n \n     USE_TTY();\n \n-    while ((c = getopt_long(argc, argv, \"f:s:p:l:k:t:m:c:b:a:n:huUvA6\"\n+    while ((c = getopt_long(argc, argv, \"f:s:p:l:k:t:m:c:b:a:n:huUTvA6\"\n                             \"O:o:G:g:\",\n                             long_options, &option_index)) != -1) {\n         switch (c) {\n@@ -1169,6 +1204,9 @@ main(int argc, char **argv)\n         case 'U':\n             mode = UDP_ONLY;\n             break;\n+\t\tcase 'T':\n+            tcp_tproxy = 1;\n+            break;\n         case 'v':\n             verbose = 1;\n             break;\n@@ -1255,6 +1293,9 @@ main(int argc, char **argv)\n         if (mode == TCP_ONLY) {\n             mode = conf->mode;\n         }\n+\t\tif (tcp_tproxy == 0) {\n+            tcp_tproxy = conf->tcp_tproxy;\n+        }\n         if (mtu == 0) {\n             mtu = conf->mtu;\n         }\n--- a/src/utils.c\n+++ b/src/utils.c\n@@ -342,6 +342,10 @@ usage()\n #endif\n     printf(\n         \"       [-U]                       Enable UDP relay and disable TCP relay.\\n\");\n+#ifdef MODULE_REDIR\n+    printf(\n+        \"       [-T]                       Use tproxy instead of redirect (for tcp).\\n\");\n+#endif\n #ifdef MODULE_REMOTE\n     printf(\n         \"       [-6]                       Resovle hostname to IPv6 address first.\\n\");\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/patches/104-fix-use-after-free.patch",
    "content": "From 445a484de9c9bf801572d970f45ad0e11a18e35d Mon Sep 17 00:00:00 2001\nFrom: MoetaYuko <loli@yuko.moe>\nDate: Sun, 31 Mar 2024 19:06:59 +0800\nSubject: [PATCH] shadowsocksr-libev: fix use-after-free due to a typo (#193)\n\n---\n shadowsocksr-libev/src/server/server.c | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\n--- a/server/server.c\n+++ b/server/server.c\n@@ -1943,7 +1943,7 @@ main(int argc, char **argv)\n             memcpy(text, protocol, strlen(protocol) - 11);\n             int length = strlen(protocol) - 11;\n             free(protocol);\n-            obfs = (char*)malloc(length);\n+            protocol = (char*)malloc(length);\n             memset(protocol, 0x00, length);\n             memcpy(protocol, text, length);\n             LOGI(\"protocol compatible enable, %s\", protocol);\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/patches/105-Upgrade-PCRE-to-PCRE2.patch",
    "content": "From 32f944b9a06fb2be4cd50da2434f2fd4b4decede Mon Sep 17 00:00:00 2001\nFrom: sbwml <984419930@qq.com>\nDate: Thu, 1 Feb 2024 21:21:56 +0800\nSubject: [PATCH] Upgrade PCRE to PCRE2\n\nSigned-off-by: sbwml <984419930@qq.com>\n---\n configure.ac |   8 +--\n m4/pcre.m4   | 152 ------------------------------------------\n m4/pcre2.m4  | 181 +++++++++++++++++++++++++++++++++++++++++++++++++++\n src/rule.c   |  47 ++++++++++---\n src/rule.h   |  22 +++++--\n 5 files changed, 238 insertions(+), 172 deletions(-)\n delete mode 100644 m4/pcre.m4\n create mode 100644 m4/pcre2.m4\n\n--- a/configure.ac\n+++ b/configure.ac\n@@ -20,10 +20,10 @@ AC_DISABLE_STATIC\n AC_DISABLE_SHARED\n LT_INIT([dlopen])\n \n-dnl Check for pcre library\n-TS_CHECK_PCRE\n-if test \"x${enable_pcre}\" != \"xyes\"; then\n-  AC_MSG_ERROR([Cannot find pcre library. Configure --with-pcre=DIR])\n+dnl Check for pcre2 library\n+TS_CHECK_PCRE2\n+if test \"x${enable_pcre2}\" != \"xyes\"; then\n+  AC_MSG_ERROR([Cannot find pcre2 library. Configure --with-pcre2=DIR])\n fi\n \n dnl Checks for using shared libraries from system\n--- a/m4/pcre.m4\n+++ /dev/null\n@@ -1,152 +0,0 @@\n-dnl -------------------------------------------------------- -*- autoconf -*-\n-dnl Licensed to the Apache Software Foundation (ASF) under one or more\n-dnl contributor license agreements.  See the NOTICE file distributed with\n-dnl this work for additional information regarding copyright ownership.\n-dnl The ASF licenses this file to You under the Apache License, Version 2.0\n-dnl (the \"License\"); you may not use this file except in compliance with\n-dnl the License.  You may obtain a copy of the License at\n-dnl\n-dnl     http://www.apache.org/licenses/LICENSE-2.0\n-dnl\n-dnl Unless required by applicable law or agreed to in writing, software\n-dnl distributed under the License is distributed on an \"AS IS\" BASIS,\n-dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n-dnl See the License for the specific language governing permissions and\n-dnl limitations under the License.\n-\n-dnl\n-dnl TS_ADDTO(variable, value)\n-dnl\n-dnl  Add value to variable\n-dnl\n-AC_DEFUN([TS_ADDTO], [\n-  if test \"x$$1\" = \"x\"; then\n-    test \"x$verbose\" = \"xyes\" && echo \"  setting $1 to \\\"$2\\\"\"\n-    $1=\"$2\"\n-  else\n-    ats_addto_bugger=\"$2\"\n-    for i in $ats_addto_bugger; do\n-      ats_addto_duplicate=\"0\"\n-      for j in $$1; do\n-        if test \"x$i\" = \"x$j\"; then\n-          ats_addto_duplicate=\"1\"\n-          break\n-        fi\n-      done\n-      if test $ats_addto_duplicate = \"0\"; then\n-        test \"x$verbose\" = \"xyes\" && echo \"  adding \\\"$i\\\" to $1\"\n-        $1=\"$$1 $i\"\n-      fi\n-    done\n-  fi\n-])dnl\n-\n-dnl\n-dnl TS_ADDTO_RPATH(path)\n-dnl\n-dnl   Adds path to variable with the '-rpath' directive.\n-dnl\n-AC_DEFUN([TS_ADDTO_RPATH], [\n-  AC_MSG_NOTICE([adding $1 to RPATH])\n-  TS_ADDTO(LIBTOOL_LINK_FLAGS, [-R$1])\n-])dnl\n-\n-dnl\n-dnl pcre.m4: Trafficserver's pcre autoconf macros\n-dnl\n-\n-dnl\n-dnl TS_CHECK_PCRE: look for pcre libraries and headers\n-dnl\n-AC_DEFUN([TS_CHECK_PCRE], [\n-enable_pcre=no\n-AC_ARG_WITH(pcre, [AC_HELP_STRING([--with-pcre=DIR],[use a specific pcre library])],\n-[\n-  if test \"x$withval\" != \"xyes\" && test \"x$withval\" != \"x\"; then\n-    pcre_base_dir=\"$withval\"\n-    if test \"$withval\" != \"no\"; then\n-      enable_pcre=yes\n-      case \"$withval\" in\n-      *\":\"*)\n-        pcre_include=\"`echo $withval |sed -e 's/:.*$//'`\"\n-        pcre_ldflags=\"`echo $withval |sed -e 's/^.*://'`\"\n-        AC_MSG_CHECKING(checking for pcre includes in $pcre_include libs in $pcre_ldflags )\n-        ;;\n-      *)\n-        pcre_include=\"$withval/include\"\n-        pcre_ldflags=\"$withval/lib\"\n-        AC_MSG_CHECKING(checking for pcre includes in $withval)\n-        ;;\n-      esac\n-    fi\n-  fi\n-],\n-[\n-  AC_CHECK_PROG(PCRE_CONFIG, pcre-config, pcre-config)\n-  if test \"x$PCRE_CONFIG\" != \"x\"; then\n-    enable_pcre=yes\n-    pcre_base_dir=\"`$PCRE_CONFIG --prefix`\"\n-    pcre_include=\"`$PCRE_CONFIG --cflags | sed -es/-I//`\"\n-    pcre_ldflags=\"`$PCRE_CONFIG --libs | sed -es/-lpcre// -es/-L//`\"\n-  fi\n-])\n-\n-if test \"x$pcre_base_dir\" = \"x\"; then\n-  AC_MSG_CHECKING([for pcre location])\n-  AC_CACHE_VAL(ats_cv_pcre_dir,[\n-  for dir in /usr/local /usr ; do\n-    if test -d $dir && ( test -f $dir/include/pcre.h || test -f $dir/include/pcre/pcre.h ); then\n-      ats_cv_pcre_dir=$dir\n-      break\n-    fi\n-  done\n-  ])\n-  pcre_base_dir=$ats_cv_pcre_dir\n-  if test \"x$pcre_base_dir\" = \"x\"; then\n-    enable_pcre=no\n-    AC_MSG_RESULT([not found])\n-  else\n-    enable_pcre=yes\n-    pcre_include=\"$pcre_base_dir/include\"\n-    pcre_ldflags=\"$pcre_base_dir/lib\"\n-    AC_MSG_RESULT([$pcre_base_dir])\n-  fi\n-else\n-  AC_MSG_CHECKING(for pcre headers in $pcre_include)\n-  if test -d $pcre_include && test -d $pcre_ldflags && ( test -f $pcre_include/pcre.h || test -f $pcre_include/pcre/pcre.h ); then\n-    AC_MSG_RESULT([ok])\n-  else\n-    AC_MSG_RESULT([not found])\n-  fi\n-fi\n-\n-pcreh=0\n-pcre_pcreh=0\n-if test \"$enable_pcre\" != \"no\"; then\n-  saved_ldflags=$LDFLAGS\n-  saved_cppflags=$CFLAGS\n-  pcre_have_headers=0\n-  pcre_have_libs=0\n-  if test \"$pcre_base_dir\" != \"/usr\"; then\n-    TS_ADDTO(CFLAGS, [-I${pcre_include}])\n-    TS_ADDTO(CFLAGS, [-DPCRE_STATIC])\n-    TS_ADDTO(LDFLAGS, [-L${pcre_ldflags}])\n-    TS_ADDTO_RPATH(${pcre_ldflags})\n-  fi\n-  AC_SEARCH_LIBS([pcre_exec], [pcre], [pcre_have_libs=1])\n-  if test \"$pcre_have_libs\" != \"0\"; then\n-    AC_CHECK_HEADERS(pcre.h, [pcre_have_headers=1])\n-    AC_CHECK_HEADERS(pcre/pcre.h, [pcre_have_headers=1])\n-  fi\n-  if test \"$pcre_have_headers\" != \"0\"; then\n-    AC_DEFINE(HAVE_LIBPCRE,1,[Compiling with pcre support])\n-    AC_SUBST(LIBPCRE, [-lpcre])\n-  else\n-    enable_pcre=no\n-    CFLAGS=$saved_cppflags\n-    LDFLAGS=$saved_ldflags\n-  fi\n-fi\n-AC_SUBST(pcreh)\n-AC_SUBST(pcre_pcreh)\n-])\n--- /dev/null\n+++ b/m4/pcre2.m4\n@@ -0,0 +1,181 @@\n+dnl -------------------------------------------------------- -*- autoconf -*-\n+dnl Licensed to the Apache Software Foundation (ASF) under one or more\n+dnl contributor license agreements.  See the NOTICE file distributed with\n+dnl this work for additional information regarding copyright ownership.\n+dnl The ASF licenses this file to You under the Apache License, Version 2.0\n+dnl (the \"License\"); you may not use this file except in compliance with\n+dnl the License.  You may obtain a copy of the License at\n+dnl\n+dnl     http://www.apache.org/licenses/LICENSE-2.0\n+dnl\n+dnl Unless required by applicable law or agreed to in writing, software\n+dnl distributed under the License is distributed on an \"AS IS\" BASIS,\n+dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+dnl See the License for the specific language governing permissions and\n+dnl limitations under the License.\n+\n+dnl Modified by Syrone Wong <wong.syrone@gmail.com> to support pcre2 8bit variant only\n+\n+dnl\n+dnl TS_ADDTO(variable, value)\n+dnl\n+dnl  Add value to variable\n+dnl\n+AC_DEFUN([TS_ADDTO], [\n+  if test \"x$$1\" = \"x\"; then\n+    test \"x$verbose\" = \"xyes\" && echo \"  setting $1 to \\\"$2\\\"\"\n+    $1=\"$2\"\n+  else\n+    ats_addto_bugger=\"$2\"\n+    for i in $ats_addto_bugger; do\n+      ats_addto_duplicate=\"0\"\n+      for j in $$1; do\n+        if test \"x$i\" = \"x$j\"; then\n+          ats_addto_duplicate=\"1\"\n+          break\n+        fi\n+      done\n+      if test $ats_addto_duplicate = \"0\"; then\n+        test \"x$verbose\" = \"xyes\" && echo \"  adding \\\"$i\\\" to $1\"\n+        $1=\"$$1 $i\"\n+      fi\n+    done\n+  fi\n+])dnl\n+\n+dnl\n+dnl TS_ADDTO_RPATH(path)\n+dnl\n+dnl   Adds path to variable with the '-rpath' directive.\n+dnl\n+AC_DEFUN([TS_ADDTO_RPATH], [\n+  AC_MSG_NOTICE([adding $1 to RPATH])\n+  TS_ADDTO(LIBTOOL_LINK_FLAGS, [-R$1])\n+])dnl\n+\n+dnl\n+dnl pcre2.m4: Trafficserver's pcre2 autoconf macros\n+dnl\n+\n+dnl\n+dnl TS_CHECK_PCRE2: look for pcre2 libraries and headers\n+dnl\n+AC_DEFUN([TS_CHECK_PCRE2], [\n+enable_pcre2=no\n+AC_ARG_WITH(pcre2, [AC_HELP_STRING([--with-pcre2=DIR],[use a specific pcre2 library])],\n+[\n+  if test \"x$withval\" != \"xyes\" && test \"x$withval\" != \"x\"; then\n+    pcre2_base_dir=\"$withval\"\n+    if test \"$withval\" != \"no\"; then\n+      enable_pcre2=yes\n+      case \"$withval\" in\n+      *\":\"*)\n+        pcre2_include=\"`echo $withval |sed -e 's/:.*$//'`\"\n+        pcre2_ldflags=\"`echo $withval |sed -e 's/^.*://'`\"\n+        AC_MSG_CHECKING(checking for pcre2 includes in $pcre2_include libs in $pcre2_ldflags )\n+        ;;\n+      *)\n+        pcre2_include=\"$withval/include\"\n+        pcre2_ldflags=\"$withval/lib\"\n+        AC_MSG_CHECKING(checking for pcre2 includes in $withval)\n+        ;;\n+      esac\n+    fi\n+  fi\n+],\n+[\n+  AC_CHECK_PROG(PCRE2_CONFIG, pcre2-config, pcre2-config)\n+  if test \"x$PCRE2_CONFIG\" != \"x\"; then\n+    enable_pcre2=yes\n+    pcre2_base_dir=\"`$PCRE2_CONFIG --prefix`\"\n+    pcre2_include=\"`$PCRE2_CONFIG --cflags | sed -es/-I//`\"\n+    pcre2_ldflags=\"`$PCRE2_CONFIG --libs8 | sed -es/-lpcre2-8// -es/-L//`\"\n+  fi\n+])\n+\n+if test \"x$pcre2_base_dir\" = \"x\"; then\n+  AC_MSG_CHECKING([for pcre2 location])\n+  AC_CACHE_VAL(ats_cv_pcre2_dir,[\n+  for dir in /usr/local /usr ; do\n+    if test -d $dir && ( test -f $dir/include/pcre2.h || test -f $dir/include/pcre2/pcre2.h ); then\n+      ats_cv_pcre2_dir=$dir\n+      break\n+    fi\n+  done\n+  ])\n+  pcre2_base_dir=$ats_cv_pcre2_dir\n+  if test \"x$pcre2_base_dir\" = \"x\"; then\n+    enable_pcre2=no\n+    AC_MSG_RESULT([not found])\n+  else\n+    enable_pcre2=yes\n+    pcre2_include=\"$pcre2_base_dir/include\"\n+    pcre2_ldflags=\"$pcre2_base_dir/lib\"\n+    AC_MSG_RESULT([$pcre2_base_dir])\n+  fi\n+else\n+  AC_MSG_CHECKING(for pcre2 headers in $pcre2_include)\n+  if test -d $pcre2_include && test -d $pcre2_ldflags && ( test -f $pcre2_include/pcre2.h || test -f $pcre2_include/pcre2/pcre2.h ); then\n+    AC_MSG_RESULT([ok])\n+  else\n+    AC_MSG_RESULT([not found])\n+  fi\n+fi\n+\n+pcre2h=0\n+pcre2_pcre2h=0\n+if test \"$enable_pcre2\" != \"no\"; then\n+  saved_ldflags=$LDFLAGS\n+  saved_cppflags=$CFLAGS\n+  pcre2_have_headers=0\n+  pcre2_have_libs=0\n+  if test \"$pcre2_base_dir\" != \"/usr\"; then\n+    TS_ADDTO(CFLAGS, [-I${pcre2_include}])\n+    TS_ADDTO(CFLAGS, [-DPCRE2_STATIC])\n+    TS_ADDTO(LDFLAGS, [-L${pcre2_ldflags}])\n+    TS_ADDTO_RPATH(${pcre2_ldflags})\n+  fi\n+  AC_SEARCH_LIBS([pcre2_match_8], [pcre2-8], [pcre2_have_libs=1])\n+  if test \"$pcre2_have_libs\" != \"0\"; then\n+      AC_MSG_CHECKING([pcre2.h])\n+  AC_COMPILE_IFELSE(\n+    [AC_LANG_PROGRAM(\n+      [[\n+#define PCRE2_CODE_UNIT_WIDTH 8\n+#include <pcre2.h>\n+      ]],\n+      [[\n+      ]]\n+    )],\n+    [pcre2_have_headers=1\n+    AC_MSG_RESULT([ok])],\n+    [AC_MSG_RESULT([not found])]\n+  )\n+\n+    AC_MSG_CHECKING([pcre2/pcre2.h])\n+  AC_COMPILE_IFELSE(\n+    [AC_LANG_PROGRAM(\n+      [[\n+#define PCRE2_CODE_UNIT_WIDTH 8\n+#include <pcre2/pcre2.h>\n+      ]],\n+      [[\n+      ]]\n+    )],\n+    [pcre2_have_headers=1\n+    AC_MSG_RESULT([ok])],\n+    [AC_MSG_RESULT([not found])]\n+  )\n+  fi\n+  if test \"$pcre2_have_headers\" != \"0\"; then\n+    AC_DEFINE(HAVE_LIBPCRE2,1,[Compiling with pcre2 support])\n+    AC_SUBST(LIBPCRE2, [-lpcre2-8])\n+  else\n+    enable_pcre2=no\n+    CFLAGS=$saved_cppflags\n+    LDFLAGS=$saved_ldflags\n+  fi\n+fi\n+AC_SUBST(pcre2h)\n+AC_SUBST(pcre2_pcre2h)\n+])\n--- a/src/rule.c\n+++ b/src/rule.c\n@@ -82,14 +82,28 @@ int\n init_rule(rule_t *rule)\n {\n     if (rule->pattern_re == NULL) {\n-        const char *reerr;\n-        int reerroffset;\n+        int errornumber;\n+        PCRE2_SIZE erroroffset;\n+        rule->pattern_re = pcre2_compile(\n+            (PCRE2_SPTR)rule->pattern,   /* the pattern */\n+            PCRE2_ZERO_TERMINATED,       /* indicates pattern is zero-terminated */\n+            0,                           /* default options */\n+            &errornumber,                /* for error number */\n+            &erroroffset,                /* for error offset */\n+            NULL);                       /* use default compile context */\n \n-        rule->pattern_re =\n-            pcre_compile(rule->pattern, 0, &reerr, &reerroffset, NULL);\n         if (rule->pattern_re == NULL) {\n-            LOGE(\"Regex compilation of \\\"%s\\\" failed: %s, offset %d\",\n-                 rule->pattern, reerr, reerroffset);\n+            PCRE2_UCHAR errbuffer[512];\n+            pcre2_get_error_message(errornumber, errbuffer, sizeof(errbuffer));\n+            LOGE(\"PCRE2 regex compilation failed at offset %d: %s\\n\", (int)erroroffset,\n+                 errbuffer);\n+            return 0;\n+        }\n+\n+        rule->pattern_re_match_data = pcre2_match_data_create_from_pattern(rule->pattern_re, NULL);\n+\n+        if (rule->pattern_re_match_data == NULL) {\n+            ERROR(\"PCRE2: the memory for the block could not be obtained\");\n             return 0;\n         }\n     }\n@@ -109,8 +123,15 @@ lookup_rule(const struct cork_dllist *ru\n \n     cork_dllist_foreach_void(rules, curr, next) {\n         rule_t *rule = cork_container_of(curr, rule_t, entries);\n-        if (pcre_exec(rule->pattern_re, NULL,\n-                      name, name_len, 0, 0, NULL, 0) >= 0)\n+        if (pcre2_match(\n+                rule->pattern_re,            /* the compiled pattern */\n+                (PCRE2_SPTR)name,            /* the subject string */\n+                name_len,                    /* the length of the subject */\n+                0,                           /* start at offset 0 in the subject */\n+                0,                           /* default options */\n+                rule->pattern_re_match_data, /* block for storing the result */\n+                NULL                         /* use default match context */\n+                ) >= 0)\n             return rule;\n     }\n \n@@ -131,7 +152,13 @@ free_rule(rule_t *rule)\n         return;\n \n     ss_free(rule->pattern);\n-    if (rule->pattern_re != NULL)\n-        pcre_free(rule->pattern_re);\n+    if (rule->pattern_re != NULL) {\n+        pcre2_code_free(rule->pattern_re);                    /* data and the compiled pattern. */\n+        rule->pattern_re            = NULL;\n+    }\n+    if (rule->pattern_re_match_data != NULL) {\n+        pcre2_match_data_free(rule->pattern_re_match_data);   /* Release memory used for the match */\n+        rule->pattern_re_match_data = NULL;\n+    }\n     ss_free(rule);\n }\n--- a/src/rule.h\n+++ b/src/rule.h\n@@ -33,17 +33,27 @@\n \n #include <libcork/ds.h>\n \n-#ifdef HAVE_PCRE_H\n-#include <pcre.h>\n-#elif HAVE_PCRE_PCRE_H\n-#include <pcre/pcre.h>\n-#endif\n+/*\n+ * The PCRE2_CODE_UNIT_WIDTH macro must be defined before including pcre2.h.\n+ * For a program that uses only one code unit width, setting it to 8, 16, or 32\n+ * makes it possible to use generic function names such as pcre2_compile(). Note\n+ * that just changing 8 to 16 (for example) is not sufficient to convert this\n+ * program to process 16-bit characters. Even in a fully 16-bit environment, where\n+ * string-handling functions such as strcmp() and printf() work with 16-bit\n+ * characters, the code for handling the table of named substrings will still need\n+ * to be modified.\n+ */\n+/* we only need to support ASCII chartable, thus set it to 8 */\n+#define PCRE2_CODE_UNIT_WIDTH 8\n+\n+#include <pcre2.h>\n \n typedef struct rule {\n     char *pattern;\n \n     /* Runtime fields */\n-    pcre *pattern_re;\n+    pcre2_code *pattern_re;\n+    pcre2_match_data *pattern_re_match_data;\n \n     struct cork_dllist_item entries;\n } rule_t;\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/AUTHORS",
    "content": "Shadowsocks-libev was originally created in late 2013, by\nClowwindy <clowwindy@gmail.com>, then rewritten and maintained by\nMax Lv <max.c.lv@gmail.com>.\n\nHere is an inevitably incomplete list of MUCH-APPRECIATED CONTRIBUTORS --\npeople who have submitted patches, fixed bugs, added translations, and\ngenerally made shadowsocks-libev that much better:\n\nhttps://github.com/shadowsocks/shadowsocks-libev/graphs/contributors\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/CMakeLists.txt",
    "content": "# -*- coding: utf-8 -*-\n# ----------------------------------------------------------------------\n# Copyright © 2011-2015, RedJack, LLC.\n# All rights reserved.\n#\n# Please see the COPYING file in this distribution for license details.\n# ----------------------------------------------------------------------\n\nset(CMAKE_LEGACY_CYGWIN_WIN32 0)\n\ncmake_minimum_required(VERSION 2.6)\nset(PROJECT_NAME shadowsocks-libev)\nset(RELEASE_DATE 2015-09-03)\nproject(${PROJECT_NAME})\n\nset(VERSION 2.5.6)\n\n\nset(with_crypto_library \"openssl\" CACHE STRING \"build with the given crypto library, TYPE=openssl|polarssl|mbedtls default=openssl\")\n\n\n\ninclude ( cmake/dist.cmake )\ninclude ( configure )\n\nconfigure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h )\n\nadd_subdirectory(libsodium)\nadd_subdirectory(libcork)\nadd_subdirectory(libipset)\nadd_subdirectory(libev)\n\n\ninclude_directories( ${CMAKE_CURRENT_BINARY_DIR} )\n\nadd_subdirectory(libudns)\nadd_subdirectory(src)\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/COPYING",
    "content": "This program is free software: you can redistribute it and/or modify\nit under the terms of the GNU General Public License as published by\nthe Free Software Foundation, either version 3 of the License, or\n(at your option) any later version.\n\nThis program is distributed in the hope that it will be useful, \nbut WITHOUT ANY WARRANTY; without even the implied warranty of\nMERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\nGNU General Public License for more details.\n\nYou should have received a copy of the GNU General Public License\nalong with this program.  If not, see <http://www.gnu.org/licenses/>.\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/Changes",
    "content": "shadowsocks-libev (2.5.6-1) unstable; urgency=medium\n\n  * Add outbound ACL for server.\n  * Refine log format.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 01 Nov 2016 09:51:52 +0800\n\nshadowsocks-libev (2.5.5-1) unstable; urgency=medium\n\n  * Refine attack detection.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 11 Oct 2016 15:45:09 +0800\n\nshadowsocks-libev (2.5.4-1) unstable; urgency=medium\n\n  * Fix a bug of auto blocking mechanism.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 09 Oct 2016 19:36:37 +0800\n\nshadowsocks-libev (2.5.3-1) unstable; urgency=medium\n\n  * Fix TCP Fast Open on macOS.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 21 Sep 2016 19:31:57 +0800\n\nshadowsocks-libev (2.5.2-1) unstable; urgency=medium\n\n  * Fix a bug of UDP relay mode of ss-local.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 12 Sep 2016 12:54:33 +0800\n\nshadowsocks-libev (2.5.1-1) unstable; urgency=medium\n\n  * Refine ACL feature with hostname support.\n  * Add HTTP/SNI parser for ss-local/ss-redir.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 10 Sep 2016 17:06:49 +0800\n\nshadowsocks-libev (2.5.0-1) unstable; urgency=medium\n\n  * Fix several bugs of the command line interface.\n  * Add aes-128/192/256-ctr ciphers.\n  * Add option MTU for UDP relay.\n  * Add MultiPath TCP support.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 29 Aug 2016 13:07:51 +0800\n\nshadowsocks-libev (2.4.8-1) unstable; urgency=low\n\n  * Update manual pages with asciidoc.\n  * Fix issues of bind_address option.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 20 Jul 2016 09:25:50 +0800\n\nshadowsocks-libev (2.4.7-1) unstable; urgency=low\n\n  * Add ss-nat, a helper script to set up NAT rules for ss-redir.\n  * Fix several issues for debian package.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 1 Jun 2016 18:21:45 +0800\n\nshadowsocks-libev (2.4.6-1) unstable; urgency=low\n\n  * Update manual pages.\n\n -- Max Lv <max.c.lv@gmail.com>  Thu, 21 Apr 2016 17:33:34 +0800\n\nshadowsocks-libev (2.4.5-1) unstable; urgency=low\n\n  * Fix build issues on OpenWRT.\n  * Reduce the latency of redir mode.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 01 Feb 2016 13:22:50 +0800\n\nshadowsocks-libev (2.4.4-1) unstable; urgency=low\n\n  * Fix a potential memory leak.\n  * Fix some compiler related issues.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 13 Jan 2016 11:50:12 +0800\n\nshadowsocks-libev (2.4.3-1) unstable; urgency=high\n\n  * Refine the buffer allocation.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 19 Dec 2015 12:30:21 +0900\n\nshadowsocks-libev (2.4.1-1) unstable; urgency=high\n\n  * Fix a security bug.\n\n -- Max Lv <max.c.lv@gmail.com>  Thu, 29 Oct 2015 15:42:47 +0900\n\nshadowsocks-libev (2.4.0-1) unstable; urgency=low\n\n  * Update the one-time authentication\n\n -- Max Lv <max.c.lv@gmail.com>  Thu, 24 Sep 2015 14:11:05 +0900\n\nshadowsocks-libev (2.3.3-1) unstable; urgency=low\n\n  * Refine the onetime authentication of header.\n  * Enforce CRC16 on the payload.\n\n -- Max Lv <max.c.lv@gmail.com>  Fri, 18 Sep 2015 10:38:21 +0900\n\nshadowsocks-libev (2.3.2-1) unstable; urgency=low\n\n  * Fix minor issues of build scripts.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 13 Sep 2015 15:22:28 +0900\n\nshadowsocks-libev (2.3.1-1) unstable; urgency=low\n\n  * Fix an issue of connection cache of UDP relay.\n  * Add support of onetime authentication for header verification.\n\n -- Max Lv <max.c.lv@gmail.com>  Fri, 04 Sep 2015 07:54:02 +0900\n\nshadowsocks-libev (2.3.0-1) unstable; urgency=low\n\n  * Add manager mode to support multi-user and traffic stat.\n  * Fix a build issue on OS X El Capitan.\n\n -- Max Lv <max.c.lv@gmail.com>  Thu, 30 Jul 2015 17:30:43 +0900\n\nshadowsocks-libev (2.2.3-1) unstable; urgency=high\n\n  * Fix the multiple UDP source port issue.\n  * Allow working in UDP only mode.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 11 Jul 2015 08:31:02 +0900\n\nshadowsocks-libev (2.2.2-1) unstable; urgency=low\n\n  * Fix the timer of UDP relay.\n  * Check name_len in the header.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 15 Jun 2015 10:26:40 +0900\n\nshadowsocks-libev (2.2.1-1) unstable; urgency=low\n\n  * Fix an issue of UDP relay.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 10 May 2015 21:23:44 +0900\n\nshadowsocks-libev (2.2.0-1) unstable; urgency=low\n\n  * Add TPROXY support in redir mode.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 04 May 2015 02:44:17 -0300\n\nshadowsocks-libev (2.1.4-1) unstable; urgency=low\n\n  * Fix a bug of server mode ACL.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 08 Feb 2015 20:24:43 +0900\n\nshadowsocks-libev (2.1.3-1) unstable; urgency=low\n\n  * Add ACL support to remote server.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 08 Feb 2015 10:59:44 +0900\n\nshadowsocks-libev (2.1.2-1) unstable; urgency=low\n\n  * Refine multiple port binding.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 31 Jan 2015 18:56:25 +0900\n\nshadowsocks-libev (2.1.1-1) unstable; urgency=low\n\n  * Fix a memory leak.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 21 Jan 2015 21:40:58 +0900\n\nshadowsocks-libev (2.1.0-1) unstable; urgency=low\n\n  * Fix a bug of tunnel mode.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 19 Jan 2015 09:59:52 +0900\n\nshadowsocks-libev (2.0.8-1) unstable; urgency=low\n\n  * Fix a bug of IPv6.\n\n -- Max Lv <max.c.lv@gmail.com>  Fri, 16 Jan 2015 10:58:12 +0900\n\nshadowsocks-libev (2.0.7-1) unstable; urgency=low\n\n  * Fix some performance issue.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 13 Jan 2015 13:17:58 +0900\n\nshadowsocks-libev (2.0.6-1) unstable; urgency=high\n\n  * Fix a critical issue in redir mode.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 12 Jan 2015 21:51:19 +0900\n\nshadowsocks-libev (2.0.5-1) unstable; urgency=low\n\n  * Refine local, tunnel, and redir modes.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 12 Jan 2015 12:39:05 +0800\n\nshadowsocks-libev (2.0.4-1) unstable; urgency=low\n\n  * Fix building issues with MinGW32.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 11 Jan 2015 13:33:31 +0900\n\nshadowsocks-libev (2.0.3-1) unstable; urgency=high\n\n  * Fix some issues.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 10 Jan 2015 16:27:54 +0800\n\nshadowsocks-libev (2.0.2-1) unstable; urgency=low\n\n  * Fix issues with MinGW.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 10 Jan 2015 15:17:10 +0800\n\nshadowsocks-libev (2.0.1-1) unstable; urgency=low\n\n  * Implement a real asynchronous DNS resolver.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 10 Jan 2015 10:04:28 +0800\n\nshadowsocks-libev (1.6.4-1) unstable; urgency=low\n\n  * Update documents.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 07 Jan 2015 21:48:58 +0900\n\nshadowsocks-libev (1.6.3-1) unstable; urgency=low\n\n  * Refine ss-redir.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 04 Jan 2015 19:23:52 +0900\n\nshadowsocks-libev (1.6.2-1) unstable; urgency=low\n\n  * Fix some build issues.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 30 Dec 2014 10:30:28 +0800\n\nshadowsocks-libev (1.6.1-1) unstable; urgency=high\n\n  * Add salsa20 and chacha20 support.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 13 Dec 2014 15:11:34 +0800\n\nshadowsocks-libev (1.6.0-1) unstable; urgency=low\n\n  * Solve conflicts with other shadowsocks portings.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 17 Nov 2014 14:10:21 +0800\n\nshadowsocks-libev (1.5.3-2) unstable; urgency=low\n\n  * rename as shadowsocks-libev.\n\n -- Symeon Huang <hzwhuang@gmail.com>  Sat, 15 Nov 2014 14:55:28 +0000\n\nshadowsocks (1.5.3-1) unstable; urgency=low\n\n  * Fix log on Win32.\n\n -- Max Lv <max.c.lv@gmail.com>  Fri, 14 Nov 2014 09:10:06 +0800\n\nshadowsocks (1.5.2-1) unstable; urgency=low\n\n  * Handle SIGTERM and SIGKILL nicely.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 12 Nov 2014 13:11:29 +0800\n\nshadowsocks (1.5.1-1) unstable; urgency=low\n\n  * Fix a bug of tcp fast open.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 08 Nov 2014 19:45:37 +0900\n\nshadowsocks (1.5.0-1) unstable; urgency=low\n\n  * Support to build static or shared library.\n  * Supprot IPv6 NAT in redirect mode.\n  * Refine the cache size of UDPRelay.\n\n -- Max Lv <max.c.lv@gmail.com>  Fri, 07 Nov 2014 09:33:19 +0800\n\nshadowsocks (1.4.8-1) unstable; urgency=low\n\n  * Fix a bug of tcp fast open.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 08 Oct 2014 18:02:02 +0800\n\nshadowsocks (1.4.7-1) unstable; urgency=low\n\n  * Add a new encryptor rc4-md5.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 09 Sep 2014 07:50:10 +0800\n\nshadowsocks (1.4.6-1) unstable; urgency=low\n\n  * Add ACL support.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 03 May 2014 04:37:10 -0400\n\nshadowsocks (1.4.5-1) unstable; urgency=high\n\n  * Fix the compatibility issue of udprelay.\n  * Enhance asyncns to reduce the latency.\n  * Add TCP_FASTOPEN support.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 20 Apr 2014 08:12:45 +0800\n\nshadowsocks (1.4.4-1) unstable; urgency=low\n\n  * Add CommonCrypto support for darwin.\n  * Fix some config related issues.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 26 Mar 2014 13:29:03 +0800\n\nshadowsocks (1.4.3-1) unstable; urgency=low\n\n  * Add tunnel mode with local port forwarding feature.\n\n -- Max Lv <max.c.lv@gmail.com>  Fri, 21 Feb 2014 11:52:13 +0900\n\nshadowsocks (1.4.2-1) unstable; urgency=high\n\n  * Fix the UDP relay issues.\n  * Add syslog support.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 05 Jan 2014 10:05:29 +0900\n\nshadowsocks (1.4.1-1) unstable; urgency=low\n\n  * Add multi-port support.\n  * Add PolarSSL support by @linusyang.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 12 Nov 2013 03:57:21 +0000\n\nshadowsocks (1.4.0-1) unstable; urgency=low\n\n  * Add standard socks5 udp support.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 08 Sep 2013 02:20:40 +0000\n\nshadowsocks (1.3.3-1) unstable; urgency=high\n\n  * Provide more info in verbose mode.\n\n -- Max Lv <max.c.lv@gmail.com>  Fri, 21 Jun 2013 09:59:20 +0800\n\nshadowsocks (1.3.2-1) unstable; urgency=high\n\n  * Fix some ciphers by @linusyang.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 09 Jun 2013 09:52:31 +0000\n\nshadowsocks (1.3.1-1) unstable; urgency=low\n\n  * Support more cihpers: camellia, idea, rc2 and seed.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 04 Jun 2013 00:56:17 +0000\n\nshadowsocks (1.3-1) unstable; urgency=low\n\n  * Able to bind connections to specific interface.\n  * Support more ciphers: aes-128-cfb, aes-192-cfb, aes-256-cfb, bf-cfb, cast5-cfb, des-cfb.\n\n -- Max Lv <max.c.lv@gmail.com>  Thu, 16 May 2013 10:51:15 +0800\n\nshadowsocks (1.2-2) unstable; urgency=low\n\n  * Close timeouted TCP connections.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 07 May 2013 14:10:33 +0800\n\nshadowsocks (1.2-1) unstable; urgency=low\n\n  * Fix a high load issue.\n\n -- Max Lv <max.c.lv@gmail.com>  Thu, 18 Apr 2013 10:52:34 +0800\n\nshadowsocks (1.1-1) unstable; urgency=low\n\n  * Fix a IPV6 resolve issue.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 10 Apr 2013 12:11:36 +0800\n\nshadowsocks (1.0-2) unstable; urgency=low\n\n  * Initial release.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 06 Apr 2013 16:59:15 +0800\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/INSTALL",
    "content": "Installation Instructions\n*************************\n\nCopyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002, 2004, 2005,\n2006, 2007, 2008, 2009 Free Software Foundation, Inc.\n\n   Copying and distribution of this file, with or without modification,\nare permitted in any medium without royalty provided the copyright\nnotice and this notice are preserved.  This file is offered as-is,\nwithout warranty of any kind.\n\nBasic Installation\n==================\n\n   Briefly, the shell commands `./configure; make; make install' should\nconfigure, build, and install this package.  The following\nmore-detailed instructions are generic; see the `README' file for\ninstructions specific to this package.  Some packages provide this\n`INSTALL' file but do not implement all of the features documented\nbelow.  The lack of an optional feature in a given package is not\nnecessarily a bug.  More recommendations for GNU packages can be found\nin *note Makefile Conventions: (standards)Makefile Conventions.\n\n   The `configure' shell script attempts to guess correct values for\nvarious system-dependent variables used during compilation.  It uses\nthose values to create a `Makefile' in each directory of the package.\nIt may also create one or more `.h' files containing system-dependent\ndefinitions.  Finally, it creates a shell script `config.status' that\nyou can run in the future to recreate the current configuration, and a\nfile `config.log' containing compiler output (useful mainly for\ndebugging `configure').\n\n   It can also use an optional file (typically called `config.cache'\nand enabled with `--cache-file=config.cache' or simply `-C') that saves\nthe results of its tests to speed up reconfiguring.  Caching is\ndisabled by default to prevent problems with accidental use of stale\ncache files.\n\n   If you need to do unusual things to compile the package, please try\nto figure out how `configure' could check whether to do them, and mail\ndiffs or instructions to the address given in the `README' so they can\nbe considered for the next release.  If you are using the cache, and at\nsome point `config.cache' contains results you don't want to keep, you\nmay remove or edit it.\n\n   The file `configure.ac' (or `configure.in') is used to create\n`configure' by a program called `autoconf'.  You need `configure.ac' if\nyou want to change it or regenerate `configure' using a newer version\nof `autoconf'.\n\n   The simplest way to compile this package is:\n\n  1. `cd' to the directory containing the package's source code and type\n     `./configure' to configure the package for your system.\n\n     Running `configure' might take a while.  While running, it prints\n     some messages telling which features it is checking for.\n\n  2. Type `make' to compile the package.\n\n  3. Optionally, type `make check' to run any self-tests that come with\n     the package, generally using the just-built uninstalled binaries.\n\n  4. Type `make install' to install the programs and any data files and\n     documentation.  When installing into a prefix owned by root, it is\n     recommended that the package be configured and built as a regular\n     user, and only the `make install' phase executed with root\n     privileges.\n\n  5. Optionally, type `make installcheck' to repeat any self-tests, but\n     this time using the binaries in their final installed location.\n     This target does not install anything.  Running this target as a\n     regular user, particularly if the prior `make install' required\n     root privileges, verifies that the installation completed\n     correctly.\n\n  6. You can remove the program binaries and object files from the\n     source code directory by typing `make clean'.  To also remove the\n     files that `configure' created (so you can compile the package for\n     a different kind of computer), type `make distclean'.  There is\n     also a `make maintainer-clean' target, but that is intended mainly\n     for the package's developers.  If you use it, you may have to get\n     all sorts of other programs in order to regenerate files that came\n     with the distribution.\n\n  7. Often, you can also type `make uninstall' to remove the installed\n     files again.  In practice, not all packages have tested that\n     uninstallation works correctly, even though it is required by the\n     GNU Coding Standards.\n\n  8. Some packages, particularly those that use Automake, provide `make\n     distcheck', which can by used by developers to test that all other\n     targets like `make install' and `make uninstall' work correctly.\n     This target is generally not run by end users.\n\nCompilers and Options\n=====================\n\n   Some systems require unusual options for compilation or linking that\nthe `configure' script does not know about.  Run `./configure --help'\nfor details on some of the pertinent environment variables.\n\n   You can give `configure' initial values for configuration parameters\nby setting variables in the command line or in the environment.  Here\nis an example:\n\n     ./configure CC=c99 CFLAGS=-g LIBS=-lposix\n\n   *Note Defining Variables::, for more details.\n\nCompiling For Multiple Architectures\n====================================\n\n   You can compile the package for more than one kind of computer at the\nsame time, by placing the object files for each architecture in their\nown directory.  To do this, you can use GNU `make'.  `cd' to the\ndirectory where you want the object files and executables to go and run\nthe `configure' script.  `configure' automatically checks for the\nsource code in the directory that `configure' is in and in `..'.  This\nis known as a \"VPATH\" build.\n\n   With a non-GNU `make', it is safer to compile the package for one\narchitecture at a time in the source code directory.  After you have\ninstalled the package for one architecture, use `make distclean' before\nreconfiguring for another architecture.\n\n   On MacOS X 10.5 and later systems, you can create libraries and\nexecutables that work on multiple system types--known as \"fat\" or\n\"universal\" binaries--by specifying multiple `-arch' options to the\ncompiler but only a single `-arch' option to the preprocessor.  Like\nthis:\n\n     ./configure CC=\"gcc -arch i386 -arch x86_64 -arch ppc -arch ppc64\" \\\n                 CXX=\"g++ -arch i386 -arch x86_64 -arch ppc -arch ppc64\" \\\n                 CPP=\"gcc -E\" CXXCPP=\"g++ -E\"\n\n   This is not guaranteed to produce working output in all cases, you\nmay have to build one architecture at a time and combine the results\nusing the `lipo' tool if you have problems.\n\nInstallation Names\n==================\n\n   By default, `make install' installs the package's commands under\n`/usr/local/bin', include files under `/usr/local/include', etc.  You\ncan specify an installation prefix other than `/usr/local' by giving\n`configure' the option `--prefix=PREFIX', where PREFIX must be an\nabsolute file name.\n\n   You can specify separate installation prefixes for\narchitecture-specific files and architecture-independent files.  If you\npass the option `--exec-prefix=PREFIX' to `configure', the package uses\nPREFIX as the prefix for installing programs and libraries.\nDocumentation and other data files still use the regular prefix.\n\n   In addition, if you use an unusual directory layout you can give\noptions like `--bindir=DIR' to specify different values for particular\nkinds of files.  Run `configure --help' for a list of the directories\nyou can set and what kinds of files go in them.  In general, the\ndefault for these options is expressed in terms of `${prefix}', so that\nspecifying just `--prefix' will affect all of the other directory\nspecifications that were not explicitly provided.\n\n   The most portable way to affect installation locations is to pass the\ncorrect locations to `configure'; however, many packages provide one or\nboth of the following shortcuts of passing variable assignments to the\n`make install' command line to change installation locations without\nhaving to reconfigure or recompile.\n\n   The first method involves providing an override variable for each\naffected directory.  For example, `make install\nprefix=/alternate/directory' will choose an alternate location for all\ndirectory configuration variables that were expressed in terms of\n`${prefix}'.  Any directories that were specified during `configure',\nbut not in terms of `${prefix}', must each be overridden at install\ntime for the entire installation to be relocated.  The approach of\nmakefile variable overrides for each directory variable is required by\nthe GNU Coding Standards, and ideally causes no recompilation.\nHowever, some platforms have known limitations with the semantics of\nshared libraries that end up requiring recompilation when using this\nmethod, particularly noticeable in packages that use GNU Libtool.\n\n   The second method involves providing the `DESTDIR' variable.  For\nexample, `make install DESTDIR=/alternate/directory' will prepend\n`/alternate/directory' before all installation names.  The approach of\n`DESTDIR' overrides is not required by the GNU Coding Standards, and\ndoes not work on platforms that have drive letters.  On the other hand,\nit does better at avoiding recompilation issues, and works well even\nwhen some directory options were not specified in terms of `${prefix}'\nat `configure' time.\n\nOptional Features\n=================\n\n   If the package supports it, you can cause programs to be installed\nwith an extra prefix or suffix on their names by giving `configure' the\noption `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'.\n\n   Some packages pay attention to `--enable-FEATURE' options to\n`configure', where FEATURE indicates an optional part of the package.\nThey may also pay attention to `--with-PACKAGE' options, where PACKAGE\nis something like `gnu-as' or `x' (for the X Window System).  The\n`README' should mention any `--enable-' and `--with-' options that the\npackage recognizes.\n\n   For packages that use the X Window System, `configure' can usually\nfind the X include and library files automatically, but if it doesn't,\nyou can use the `configure' options `--x-includes=DIR' and\n`--x-libraries=DIR' to specify their locations.\n\n   Some packages offer the ability to configure how verbose the\nexecution of `make' will be.  For these packages, running `./configure\n--enable-silent-rules' sets the default to minimal output, which can be\noverridden with `make V=1'; while running `./configure\n--disable-silent-rules' sets the default to verbose, which can be\noverridden with `make V=0'.\n\nParticular systems\n==================\n\n   On HP-UX, the default C compiler is not ANSI C compatible.  If GNU\nCC is not installed, it is recommended to use the following options in\norder to use an ANSI C compiler:\n\n     ./configure CC=\"cc -Ae -D_XOPEN_SOURCE=500\"\n\nand if that doesn't work, install pre-built binaries of GCC for HP-UX.\n\n   On OSF/1 a.k.a. Tru64, some versions of the default C compiler cannot\nparse its `<wchar.h>' header file.  The option `-nodtk' can be used as\na workaround.  If GNU CC is not installed, it is therefore recommended\nto try\n\n     ./configure CC=\"cc\"\n\nand if that doesn't work, try\n\n     ./configure CC=\"cc -nodtk\"\n\n   On Solaris, don't put `/usr/ucb' early in your `PATH'.  This\ndirectory contains several dysfunctional programs; working variants of\nthese programs are available in `/usr/bin'.  So, if you need `/usr/ucb'\nin your `PATH', put it _after_ `/usr/bin'.\n\n   On Haiku, software installed for all users goes in `/boot/common',\nnot `/usr/local'.  It is recommended to use the following options:\n\n     ./configure --prefix=/boot/common\n\nSpecifying the System Type\n==========================\n\n   There may be some features `configure' cannot figure out\nautomatically, but needs to determine by the type of machine the package\nwill run on.  Usually, assuming the package is built to be run on the\n_same_ architectures, `configure' can figure that out, but if it prints\na message saying it cannot guess the machine type, give it the\n`--build=TYPE' option.  TYPE can either be a short name for the system\ntype, such as `sun4', or a canonical name which has the form:\n\n     CPU-COMPANY-SYSTEM\n\nwhere SYSTEM can have one of these forms:\n\n     OS\n     KERNEL-OS\n\n   See the file `config.sub' for the possible values of each field.  If\n`config.sub' isn't included in this package, then this package doesn't\nneed to know the machine type.\n\n   If you are _building_ compiler tools for cross-compiling, you should\nuse the option `--target=TYPE' to select the type of system they will\nproduce code for.\n\n   If you want to _use_ a cross compiler, that generates code for a\nplatform different from the build platform, you should specify the\n\"host\" platform (i.e., that on which the generated programs will\neventually be run) with `--host=TYPE'.\n\nSharing Defaults\n================\n\n   If you want to set default values for `configure' scripts to share,\nyou can create a site shell script called `config.site' that gives\ndefault values for variables like `CC', `cache_file', and `prefix'.\n`configure' looks for `PREFIX/share/config.site' if it exists, then\n`PREFIX/etc/config.site' if it exists.  Or, you can set the\n`CONFIG_SITE' environment variable to the location of the site script.\nA warning: not all `configure' scripts look for a site script.\n\nDefining Variables\n==================\n\n   Variables not defined in a site shell script can be set in the\nenvironment passed to `configure'.  However, some packages may run\nconfigure again during the build, and the customized values of these\nvariables may be lost.  In order to avoid this problem, you should set\nthem in the `configure' command line, using `VAR=value'.  For example:\n\n     ./configure CC=/usr/local2/bin/gcc\n\ncauses the specified `gcc' to be used as the C compiler (unless it is\noverridden in the site shell script).\n\nUnfortunately, this technique does not work for `CONFIG_SHELL' due to\nan Autoconf bug.  Until the bug is fixed you can use this workaround:\n\n     CONFIG_SHELL=/bin/bash /bin/bash ./configure CONFIG_SHELL=/bin/bash\n\n`configure' Invocation\n======================\n\n   `configure' recognizes the following options to control how it\noperates.\n\n`--help'\n`-h'\n     Print a summary of all of the options to `configure', and exit.\n\n`--help=short'\n`--help=recursive'\n     Print a summary of the options unique to this package's\n     `configure', and exit.  The `short' variant lists options used\n     only in the top level, while the `recursive' variant lists options\n     also present in any nested packages.\n\n`--version'\n`-V'\n     Print the version of Autoconf used to generate the `configure'\n     script, and exit.\n\n`--cache-file=FILE'\n     Enable the cache: use and save the results of the tests in FILE,\n     traditionally `config.cache'.  FILE defaults to `/dev/null' to\n     disable caching.\n\n`--config-cache'\n`-C'\n     Alias for `--cache-file=config.cache'.\n\n`--quiet'\n`--silent'\n`-q'\n     Do not print messages saying which checks are being made.  To\n     suppress all normal output, redirect it to `/dev/null' (any error\n     messages will still be shown).\n\n`--srcdir=DIR'\n     Look for the package's source code in directory DIR.  Usually\n     `configure' can determine that directory automatically.\n\n`--prefix=DIR'\n     Use DIR as the installation prefix.  *note Installation Names::\n     for more details, including other options available for fine-tuning\n     the installation locations.\n\n`--no-create'\n`-n'\n     Run the configure checks, but stop before creating any output\n     files.\n\n`configure' also accepts some other, not widely useful, options.  Run\n`configure --help' for more details.\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/Makefile.am",
    "content": "if USE_SYSTEM_SHARED_LIB\nSUBDIRS = libcork libipset src\nelse\nSUBDIRS = libsodium libcork libipset libudns libev src\nendif\n\nif ENABLE_DOCUMENTATION\nSUBDIRS += doc\nendif\n\nACLOCAL_AMFLAGS = -I m4\n\npkgconfiglibdir = $(libdir)/pkgconfig\npkgconfiglib_DATA = shadowsocks-libev.pc\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/Makefile.in",
    "content": "# Makefile.in generated by automake 1.15 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2014 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\nam__is_gnu_make = { \\\n  if test -z '$(MAKELEVEL)'; then \\\n    false; \\\n  elif test -n '$(MAKE_HOST)'; then \\\n    true; \\\n  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \\\n    true; \\\n  else \\\n    false; \\\n  fi; \\\n}\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\n@ENABLE_DOCUMENTATION_TRUE@am__append_1 = doc\nsubdir = .\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \\\n\t$(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/inet_ntop.m4 \\\n\t$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \\\n\t$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \\\n\t$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/mbedtls.m4 \\\n\t$(top_srcdir)/m4/openssl.m4 $(top_srcdir)/m4/pcre.m4 \\\n\t$(top_srcdir)/m4/polarssl.m4 \\\n\t$(top_srcdir)/m4/stack-protector.m4 $(top_srcdir)/m4/zlib.m4 \\\n\t$(top_srcdir)/libev/libev.m4 $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nDIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \\\n\t$(am__configure_deps) $(am__DIST_COMMON)\nam__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \\\n configure.lineno config.status.lineno\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = config.h\nCONFIG_CLEAN_FILES = shadowsocks-libev.pc\nCONFIG_CLEAN_VPATH_FILES =\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nSOURCES =\nDIST_SOURCES =\nRECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \\\n\tctags-recursive dvi-recursive html-recursive info-recursive \\\n\tinstall-data-recursive install-dvi-recursive \\\n\tinstall-exec-recursive install-html-recursive \\\n\tinstall-info-recursive install-pdf-recursive \\\n\tinstall-ps-recursive install-recursive installcheck-recursive \\\n\tinstalldirs-recursive pdf-recursive ps-recursive \\\n\ttags-recursive uninstall-recursive\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nam__vpath_adj_setup = srcdirstrip=`echo \"$(srcdir)\" | sed 's|.|.|g'`;\nam__vpath_adj = case $$p in \\\n    $(srcdir)/*) f=`echo \"$$p\" | sed \"s|^$$srcdirstrip/||\"`;; \\\n    *) f=$$p;; \\\n  esac;\nam__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;\nam__install_max = 40\nam__nobase_strip_setup = \\\n  srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*|]/\\\\\\\\&/g'`\nam__nobase_strip = \\\n  for p in $$list; do echo \"$$p\"; done | sed -e \"s|$$srcdirstrip/||\"\nam__nobase_list = $(am__nobase_strip_setup); \\\n  for p in $$list; do echo \"$$p $$p\"; done | \\\n  sed \"s| $$srcdirstrip/| |;\"' / .*\\//!s/ .*/ ./; s,\\( .*\\)/[^/]*$$,\\1,' | \\\n  $(AWK) 'BEGIN { files[\".\"] = \"\" } { files[$$2] = files[$$2] \" \" $$1; \\\n    if (++n[$$2] == $(am__install_max)) \\\n      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = \"\" } } \\\n    END { for (dir in files) print dir, files[dir] }'\nam__base_list = \\\n  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\\n/ /g' | \\\n  sed '$$!N;$$!N;$$!N;$$!N;s/\\n/ /g'\nam__uninstall_files_from_dir = { \\\n  test -z \"$$files\" \\\n    || { test ! -d \"$$dir\" && test ! -f \"$$dir\" && test ! -r \"$$dir\"; } \\\n    || { echo \" ( cd '$$dir' && rm -f\" $$files \")\"; \\\n         $(am__cd) \"$$dir\" && rm -f $$files; }; \\\n  }\nam__installdirs = \"$(DESTDIR)$(pkgconfiglibdir)\"\nDATA = $(pkgconfiglib_DATA)\nRECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive\t\\\n  distclean-recursive maintainer-clean-recursive\nam__recursive_targets = \\\n  $(RECURSIVE_TARGETS) \\\n  $(RECURSIVE_CLEAN_TARGETS) \\\n  $(am__extra_recursive_targets)\nAM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \\\n\tcscope distdir dist dist-all distcheck\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \\\n\t$(LISP)config.h.in\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nCSCOPE = cscope\nDIST_SUBDIRS = libsodium libcork libipset libudns libev src doc\nam__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \\\n\t$(srcdir)/shadowsocks-libev.pc.in $(top_srcdir)/auto/ar-lib \\\n\t$(top_srcdir)/auto/compile $(top_srcdir)/auto/config.guess \\\n\t$(top_srcdir)/auto/config.sub $(top_srcdir)/auto/install-sh \\\n\t$(top_srcdir)/auto/ltmain.sh $(top_srcdir)/auto/missing \\\n\tAUTHORS COPYING INSTALL auto/ar-lib auto/compile \\\n\tauto/config.guess auto/config.rpath auto/config.sub \\\n\tauto/depcomp auto/install-sh auto/ltmain.sh auto/missing\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\ndistdir = $(PACKAGE)-$(VERSION)\ntop_distdir = $(distdir)\nam__remove_distdir = \\\n  if test -d \"$(distdir)\"; then \\\n    find \"$(distdir)\" -type d ! -perm -200 -exec chmod u+w {} ';' \\\n      && rm -rf \"$(distdir)\" \\\n      || { sleep 5 && rm -rf \"$(distdir)\"; }; \\\n  else :; fi\nam__post_remove_distdir = $(am__remove_distdir)\nam__relativize = \\\n  dir0=`pwd`; \\\n  sed_first='s,^\\([^/]*\\)/.*$$,\\1,'; \\\n  sed_rest='s,^[^/]*/*,,'; \\\n  sed_last='s,^.*/\\([^/]*\\)$$,\\1,'; \\\n  sed_butlast='s,/*[^/]*$$,,'; \\\n  while test -n \"$$dir1\"; do \\\n    first=`echo \"$$dir1\" | sed -e \"$$sed_first\"`; \\\n    if test \"$$first\" != \".\"; then \\\n      if test \"$$first\" = \"..\"; then \\\n        dir2=`echo \"$$dir0\" | sed -e \"$$sed_last\"`/\"$$dir2\"; \\\n        dir0=`echo \"$$dir0\" | sed -e \"$$sed_butlast\"`; \\\n      else \\\n        first2=`echo \"$$dir2\" | sed -e \"$$sed_first\"`; \\\n        if test \"$$first2\" = \"$$first\"; then \\\n          dir2=`echo \"$$dir2\" | sed -e \"$$sed_rest\"`; \\\n        else \\\n          dir2=\"../$$dir2\"; \\\n        fi; \\\n        dir0=\"$$dir0\"/\"$$first\"; \\\n      fi; \\\n    fi; \\\n    dir1=`echo \"$$dir1\" | sed -e \"$$sed_rest\"`; \\\n  done; \\\n  reldir=\"$$dir2\"\nDIST_ARCHIVES = $(distdir).tar.gz\nGZIP_ENV = --best\nDIST_TARGETS = dist-gzip\ndistuninstallcheck_listfiles = find . -type f -print\nam__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \\\n  | sed 's|^\\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'\ndistcleancheck_listfiles = find . -type f -print\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAR = @AR@\nASCIIDOC = @ASCIIDOC@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDLLTOOL = @DLLTOOL@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nGZIP = @GZIP@\nINET_NTOP_LIB = @INET_NTOP_LIB@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBPCRE = @LIBPCRE@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMANIFEST_TOOL = @MANIFEST_TOOL@\nMKDIR_P = @MKDIR_P@\nMV = @MV@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nPCRE_CONFIG = @PCRE_CONFIG@\nPTHREAD_CC = @PTHREAD_CC@\nPTHREAD_CFLAGS = @PTHREAD_CFLAGS@\nPTHREAD_LIBS = @PTHREAD_LIBS@\nRANLIB = @RANLIB@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nXMLTO = @XMLTO@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_AR = @ac_ct_AR@\nac_ct_CC = @ac_ct_CC@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nax_pthread_config = @ax_pthread_config@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npcre_pcreh = @pcre_pcreh@\npcreh = @pcreh@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nrunstatedir = @runstatedir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsubdirs = @subdirs@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\n@USE_SYSTEM_SHARED_LIB_FALSE@SUBDIRS = libsodium libcork libipset \\\n@USE_SYSTEM_SHARED_LIB_FALSE@\tlibudns libev src $(am__append_1)\n@USE_SYSTEM_SHARED_LIB_TRUE@SUBDIRS = libcork libipset src \\\n@USE_SYSTEM_SHARED_LIB_TRUE@\t$(am__append_1)\nACLOCAL_AMFLAGS = -I m4\npkgconfiglibdir = $(libdir)/pkgconfig\npkgconfiglib_DATA = shadowsocks-libev.pc\nall: config.h\n\t$(MAKE) $(AM_MAKEFLAGS) all-recursive\n\n.SUFFIXES:\nam--refresh: Makefile\n\t@:\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \\\n\t      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \\\n\t\t&& exit 0; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    echo ' $(SHELL) ./config.status'; \\\n\t    $(SHELL) ./config.status;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\t$(SHELL) ./config.status --recheck\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\t$(am__cd) $(srcdir) && $(AUTOCONF)\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\t$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)\n$(am__aclocal_m4_deps):\n\nconfig.h: stamp-h1\n\t@test -f $@ || rm -f stamp-h1\n\t@test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1\n\nstamp-h1: $(srcdir)/config.h.in $(top_builddir)/config.status\n\t@rm -f stamp-h1\n\tcd $(top_builddir) && $(SHELL) ./config.status config.h\n$(srcdir)/config.h.in: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) \n\t($(am__cd) $(top_srcdir) && $(AUTOHEADER))\n\trm -f stamp-h1\n\ttouch $@\n\ndistclean-hdr:\n\t-rm -f config.h stamp-h1\nshadowsocks-libev.pc: $(top_builddir)/config.status $(srcdir)/shadowsocks-libev.pc.in\n\tcd $(top_builddir) && $(SHELL) ./config.status $@\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\n\ndistclean-libtool:\n\t-rm -f libtool config.lt\ninstall-pkgconfiglibDATA: $(pkgconfiglib_DATA)\n\t@$(NORMAL_INSTALL)\n\t@list='$(pkgconfiglib_DATA)'; test -n \"$(pkgconfiglibdir)\" || list=; \\\n\tif test -n \"$$list\"; then \\\n\t  echo \" $(MKDIR_P) '$(DESTDIR)$(pkgconfiglibdir)'\"; \\\n\t  $(MKDIR_P) \"$(DESTDIR)$(pkgconfiglibdir)\" || exit 1; \\\n\tfi; \\\n\tfor p in $$list; do \\\n\t  if test -f \"$$p\"; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; \\\n\tdone | $(am__base_list) | \\\n\twhile read files; do \\\n\t  echo \" $(INSTALL_DATA) $$files '$(DESTDIR)$(pkgconfiglibdir)'\"; \\\n\t  $(INSTALL_DATA) $$files \"$(DESTDIR)$(pkgconfiglibdir)\" || exit $$?; \\\n\tdone\n\nuninstall-pkgconfiglibDATA:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(pkgconfiglib_DATA)'; test -n \"$(pkgconfiglibdir)\" || list=; \\\n\tfiles=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \\\n\tdir='$(DESTDIR)$(pkgconfiglibdir)'; $(am__uninstall_files_from_dir)\n\n# This directory's subdirectories are mostly independent; you can cd\n# into them and run 'make' without going through this Makefile.\n# To change the values of 'make' variables: instead of editing Makefiles,\n# (1) if the variable is set in 'config.status', edit 'config.status'\n#     (which will cause the Makefiles to be regenerated when you run 'make');\n# (2) otherwise, pass the desired values on the 'make' command line.\n$(am__recursive_targets):\n\t@fail=; \\\n\tif $(am__make_keepgoing); then \\\n\t  failcom='fail=yes'; \\\n\telse \\\n\t  failcom='exit 1'; \\\n\tfi; \\\n\tdot_seen=no; \\\n\ttarget=`echo $@ | sed s/-recursive//`; \\\n\tcase \"$@\" in \\\n\t  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \\\n\t  *) list='$(SUBDIRS)' ;; \\\n\tesac; \\\n\tfor subdir in $$list; do \\\n\t  echo \"Making $$target in $$subdir\"; \\\n\t  if test \"$$subdir\" = \".\"; then \\\n\t    dot_seen=yes; \\\n\t    local_target=\"$$target-am\"; \\\n\t  else \\\n\t    local_target=\"$$target\"; \\\n\t  fi; \\\n\t  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \\\n\t  || eval $$failcom; \\\n\tdone; \\\n\tif test \"$$dot_seen\" = \"no\"; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) \"$$target-am\" || exit 1; \\\n\tfi; test -z \"$$fail\"\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-recursive\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\tif ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \\\n\t  include_option=--etags-include; \\\n\t  empty_fix=.; \\\n\telse \\\n\t  include_option=--include; \\\n\t  empty_fix=; \\\n\tfi; \\\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    test ! -f $$subdir/TAGS || \\\n\t      set \"$$@\" \"$$include_option=$$here/$$subdir/TAGS\"; \\\n\t  fi; \\\n\tdone; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-recursive\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscope: cscope.files\n\ttest ! -s cscope.files \\\n\t  || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)\nclean-cscope:\n\t-rm -f cscope.files\ncscope.files: clean-cscope cscopelist\ncscopelist: cscopelist-recursive\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\t-rm -f cscope.out cscope.in.out cscope.po.out cscope.files\n\ndistdir: $(DISTFILES)\n\t$(am__remove_distdir)\n\ttest -d \"$(distdir)\" || mkdir \"$(distdir)\"\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\n\t@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    $(am__make_dryrun) \\\n\t      || test -d \"$(distdir)/$$subdir\" \\\n\t      || $(MKDIR_P) \"$(distdir)/$$subdir\" \\\n\t      || exit 1; \\\n\t    dir1=$$subdir; dir2=\"$(distdir)/$$subdir\"; \\\n\t    $(am__relativize); \\\n\t    new_distdir=$$reldir; \\\n\t    dir1=$$subdir; dir2=\"$(top_distdir)\"; \\\n\t    $(am__relativize); \\\n\t    new_top_distdir=$$reldir; \\\n\t    echo \" (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=\"$$new_top_distdir\" distdir=\"$$new_distdir\" \\\\\"; \\\n\t    echo \"     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)\"; \\\n\t    ($(am__cd) $$subdir && \\\n\t      $(MAKE) $(AM_MAKEFLAGS) \\\n\t        top_distdir=\"$$new_top_distdir\" \\\n\t        distdir=\"$$new_distdir\" \\\n\t\tam__remove_distdir=: \\\n\t\tam__skip_length_check=: \\\n\t\tam__skip_mode_fix=: \\\n\t        distdir) \\\n\t      || exit 1; \\\n\t  fi; \\\n\tdone\n\t-test -n \"$(am__skip_mode_fix)\" \\\n\t|| find \"$(distdir)\" -type d ! -perm -755 \\\n\t\t-exec chmod u+rwx,go+rx {} \\; -o \\\n\t  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \\; -o \\\n\t  ! -type d ! -perm -400 -exec chmod a+r {} \\; -o \\\n\t  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \\; \\\n\t|| chmod -R a+r \"$(distdir)\"\ndist-gzip: distdir\n\ttardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz\n\t$(am__post_remove_distdir)\n\ndist-bzip2: distdir\n\ttardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2\n\t$(am__post_remove_distdir)\n\ndist-lzip: distdir\n\ttardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz\n\t$(am__post_remove_distdir)\n\ndist-xz: distdir\n\ttardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz\n\t$(am__post_remove_distdir)\n\ndist-tarZ: distdir\n\t@echo WARNING: \"Support for distribution archives compressed with\" \\\n\t\t       \"legacy program 'compress' is deprecated.\" >&2\n\t@echo WARNING: \"It will be removed altogether in Automake 2.0\" >&2\n\ttardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z\n\t$(am__post_remove_distdir)\n\ndist-shar: distdir\n\t@echo WARNING: \"Support for shar distribution archives is\" \\\n\t               \"deprecated.\" >&2\n\t@echo WARNING: \"It will be removed altogether in Automake 2.0\" >&2\n\tshar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz\n\t$(am__post_remove_distdir)\n\ndist-zip: distdir\n\t-rm -f $(distdir).zip\n\tzip -rq $(distdir).zip $(distdir)\n\t$(am__post_remove_distdir)\n\ndist dist-all:\n\t$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'\n\t$(am__post_remove_distdir)\n\n# This target untars the dist file and tries a VPATH configuration.  Then\n# it guarantees that the distribution is self-contained by making another\n# tarfile.\ndistcheck: dist\n\tcase '$(DIST_ARCHIVES)' in \\\n\t*.tar.gz*) \\\n\t  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\\\n\t*.tar.bz2*) \\\n\t  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\\\n\t*.tar.lz*) \\\n\t  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\\\n\t*.tar.xz*) \\\n\t  xz -dc $(distdir).tar.xz | $(am__untar) ;;\\\n\t*.tar.Z*) \\\n\t  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\\\n\t*.shar.gz*) \\\n\t  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\\\n\t*.zip*) \\\n\t  unzip $(distdir).zip ;;\\\n\tesac\n\tchmod -R a-w $(distdir)\n\tchmod u+w $(distdir)\n\tmkdir $(distdir)/_build $(distdir)/_build/sub $(distdir)/_inst\n\tchmod a-w $(distdir)\n\ttest -d $(distdir)/_build || exit 0; \\\n\tdc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\\\/]:[\\\\/],/,'` \\\n\t  && dc_destdir=\"$${TMPDIR-/tmp}/am-dc-$$$$/\" \\\n\t  && am__cwd=`pwd` \\\n\t  && $(am__cd) $(distdir)/_build/sub \\\n\t  && ../../configure \\\n\t    $(AM_DISTCHECK_CONFIGURE_FLAGS) \\\n\t    $(DISTCHECK_CONFIGURE_FLAGS) \\\n\t    --srcdir=../.. --prefix=\"$$dc_install_base\" \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) dvi \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) check \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) install \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) installcheck \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) uninstall \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir=\"$$dc_install_base\" \\\n\t        distuninstallcheck \\\n\t  && chmod -R a-w \"$$dc_install_base\" \\\n\t  && ({ \\\n\t       (cd ../.. && umask 077 && mkdir \"$$dc_destdir\") \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" install \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" uninstall \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" \\\n\t            distuninstallcheck_dir=\"$$dc_destdir\" distuninstallcheck; \\\n\t      } || { rm -rf \"$$dc_destdir\"; exit 1; }) \\\n\t  && rm -rf \"$$dc_destdir\" \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) dist \\\n\t  && rm -rf $(DIST_ARCHIVES) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \\\n\t  && cd \"$$am__cwd\" \\\n\t  || exit 1\n\t$(am__post_remove_distdir)\n\t@(echo \"$(distdir) archives ready for distribution: \"; \\\n\t  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \\\n\t  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'\ndistuninstallcheck:\n\t@test -n '$(distuninstallcheck_dir)' || { \\\n\t  echo 'ERROR: trying to run $@ with an empty' \\\n\t       '$$(distuninstallcheck_dir)' >&2; \\\n\t  exit 1; \\\n\t}; \\\n\t$(am__cd) '$(distuninstallcheck_dir)' || { \\\n\t  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \\\n\t  exit 1; \\\n\t}; \\\n\ttest `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \\\n\t   || { echo \"ERROR: files left after uninstall:\" ; \\\n\t        if test -n \"$(DESTDIR)\"; then \\\n\t          echo \"  (check DESTDIR support)\"; \\\n\t        fi ; \\\n\t        $(distuninstallcheck_listfiles) ; \\\n\t        exit 1; } >&2\ndistcleancheck: distclean\n\t@if test '$(srcdir)' = . ; then \\\n\t  echo \"ERROR: distcleancheck can only run from a VPATH build\" ; \\\n\t  exit 1 ; \\\n\tfi\n\t@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \\\n\t  || { echo \"ERROR: files left in build directory after distclean:\" ; \\\n\t       $(distcleancheck_listfiles) ; \\\n\t       exit 1; } >&2\ncheck-am: all-am\ncheck: check-recursive\nall-am: Makefile $(DATA) config.h\ninstalldirs: installdirs-recursive\ninstalldirs-am:\n\tfor dir in \"$(DESTDIR)$(pkgconfiglibdir)\"; do \\\n\t  test -z \"$$dir\" || $(MKDIR_P) \"$$dir\"; \\\n\tdone\ninstall: install-recursive\ninstall-exec: install-exec-recursive\ninstall-data: install-data-recursive\nuninstall: uninstall-recursive\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-recursive\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-recursive\n\nclean-am: clean-generic clean-libtool mostlyclean-am\n\ndistclean: distclean-recursive\n\t-rm -f $(am__CONFIG_DISTCLEAN_FILES)\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-generic distclean-hdr \\\n\tdistclean-libtool distclean-tags\n\ndvi: dvi-recursive\n\ndvi-am:\n\nhtml: html-recursive\n\nhtml-am:\n\ninfo: info-recursive\n\ninfo-am:\n\ninstall-data-am: install-pkgconfiglibDATA\n\ninstall-dvi: install-dvi-recursive\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-recursive\n\ninstall-html-am:\n\ninstall-info: install-info-recursive\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-recursive\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-recursive\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-recursive\n\t-rm -f $(am__CONFIG_DISTCLEAN_FILES)\n\t-rm -rf $(top_srcdir)/autom4te.cache\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-recursive\n\nmostlyclean-am: mostlyclean-generic mostlyclean-libtool\n\npdf: pdf-recursive\n\npdf-am:\n\nps: ps-recursive\n\nps-am:\n\nuninstall-am: uninstall-pkgconfiglibDATA\n\n.MAKE: $(am__recursive_targets) all install-am install-strip\n\n.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \\\n\tam--refresh check check-am clean clean-cscope clean-generic \\\n\tclean-libtool cscope cscopelist-am ctags ctags-am dist \\\n\tdist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \\\n\tdist-xz dist-zip distcheck distclean distclean-generic \\\n\tdistclean-hdr distclean-libtool distclean-tags distcleancheck \\\n\tdistdir distuninstallcheck dvi dvi-am html html-am info \\\n\tinfo-am install install-am install-data install-data-am \\\n\tinstall-dvi install-dvi-am install-exec install-exec-am \\\n\tinstall-html install-html-am install-info install-info-am \\\n\tinstall-man install-pdf install-pdf-am \\\n\tinstall-pkgconfiglibDATA install-ps install-ps-am \\\n\tinstall-strip installcheck installcheck-am installdirs \\\n\tinstalldirs-am maintainer-clean maintainer-clean-generic \\\n\tmostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \\\n\tps ps-am tags tags-am uninstall uninstall-am \\\n\tuninstall-pkgconfiglibDATA\n\n.PRECIOUS: Makefile\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/acl/chn.acl",
    "content": "[proxy_all]\n\n[bypass_list]\n1.0.1.0/24\n1.0.2.0/23\n1.0.8.0/21\n1.0.32.0/19\n1.1.0.0/24\n1.1.2.0/23\n1.1.4.0/22\n1.1.8.0/21\n1.1.16.0/20\n1.1.32.0/19\n1.2.0.0/23\n1.2.2.0/24\n1.2.4.0/24\n1.2.5.0/24\n1.2.6.0/23\n1.2.8.0/24\n1.2.9.0/24\n1.2.10.0/23\n1.2.12.0/22\n1.2.16.0/20\n1.2.32.0/19\n1.2.64.0/18\n1.3.0.0/16\n1.4.1.0/24\n1.4.2.0/23\n1.4.4.0/24\n1.4.5.0/24\n1.4.6.0/23\n1.4.8.0/21\n1.4.16.0/20\n1.4.32.0/19\n1.4.64.0/18\n1.8.0.0/16\n1.10.0.0/21\n1.10.8.0/23\n1.10.11.0/24\n1.10.12.0/22\n1.10.16.0/20\n1.10.32.0/19\n1.10.64.0/18\n1.12.0.0/14\n1.24.0.0/13\n1.45.0.0/16\n1.48.0.0/15\n1.50.0.0/16\n1.51.0.0/16\n1.56.0.0/13\n1.68.0.0/14\n1.80.0.0/13\n1.88.0.0/14\n1.92.0.0/15\n1.94.0.0/15\n1.116.0.0/14\n1.180.0.0/14\n1.184.0.0/15\n1.188.0.0/14\n1.192.0.0/13\n1.202.0.0/15\n1.204.0.0/14\n14.0.0.0/21\n14.0.12.0/22\n14.1.0.0/22\n14.16.0.0/12\n14.102.128.0/22\n14.102.156.0/22\n14.103.0.0/16\n14.104.0.0/13\n14.112.0.0/12\n14.130.0.0/15\n14.134.0.0/15\n14.144.0.0/12\n14.192.60.0/22\n14.192.76.0/22\n14.196.0.0/15\n14.204.0.0/15\n14.208.0.0/12\n27.8.0.0/13\n27.16.0.0/12\n27.34.232.0/21\n27.36.0.0/14\n27.40.0.0/13\n27.50.40.0/21\n27.50.128.0/17\n27.54.72.0/21\n27.54.152.0/21\n27.54.192.0/18\n27.98.208.0/20\n27.98.224.0/19\n27.99.128.0/17\n27.103.0.0/16\n27.106.128.0/18\n27.106.204.0/22\n27.109.32.0/19\n27.112.0.0/18\n27.112.80.0/20\n27.113.128.0/18\n27.115.0.0/17\n27.116.44.0/22\n27.121.72.0/21\n27.121.120.0/21\n27.128.0.0/15\n27.131.220.0/22\n27.144.0.0/16\n27.148.0.0/14\n27.152.0.0/13\n27.184.0.0/13\n27.192.0.0/11\n27.224.0.0/14\n36.0.0.0/22\n36.0.8.0/21\n36.0.16.0/20\n36.0.32.0/19\n36.0.64.0/18\n36.0.128.0/17\n36.1.0.0/16\n36.4.0.0/14\n36.16.0.0/12\n36.32.0.0/14\n36.36.0.0/16\n36.37.0.0/19\n36.37.36.0/23\n36.37.39.0/24\n36.37.40.0/21\n36.37.48.0/20\n36.40.0.0/13\n36.48.0.0/15\n36.51.0.0/16\n36.56.0.0/13\n36.96.0.0/11\n36.128.0.0/10\n36.192.0.0/11\n36.248.0.0/14\n36.254.0.0/16\n39.0.0.0/24\n39.0.2.0/23\n39.0.4.0/22\n39.0.8.0/21\n39.0.16.0/20\n39.0.32.0/19\n39.0.64.0/18\n39.0.128.0/17\n39.64.0.0/11\n39.128.0.0/10\n42.0.0.0/22\n42.0.8.0/21\n42.0.16.0/21\n42.0.24.0/22\n42.0.32.0/19\n42.0.128.0/17\n42.1.0.0/19\n42.1.32.0/20\n42.1.48.0/21\n42.1.56.0/22\n42.1.128.0/17\n42.4.0.0/14\n42.48.0.0/15\n42.50.0.0/16\n42.51.0.0/16\n42.52.0.0/14\n42.56.0.0/14\n42.62.0.0/17\n42.62.128.0/19\n42.62.160.0/20\n42.62.180.0/22\n42.62.184.0/21\n42.63.0.0/16\n42.80.0.0/15\n42.83.64.0/20\n42.83.80.0/22\n42.83.88.0/21\n42.83.96.0/19\n42.83.128.0/17\n42.84.0.0/14\n42.88.0.0/13\n42.96.64.0/19\n42.96.96.0/21\n42.96.108.0/22\n42.96.112.0/20\n42.96.128.0/17\n42.97.0.0/16\n42.99.0.0/18\n42.99.64.0/19\n42.99.96.0/20\n42.99.112.0/22\n42.99.120.0/21\n42.100.0.0/14\n42.120.0.0/15\n42.122.0.0/16\n42.123.0.0/19\n42.123.36.0/22\n42.123.40.0/21\n42.123.48.0/20\n42.123.64.0/18\n42.123.128.0/17\n42.128.0.0/12\n42.156.0.0/19\n42.156.36.0/22\n42.156.40.0/21\n42.156.48.0/20\n42.156.64.0/18\n42.156.128.0/17\n42.157.0.0/16\n42.158.0.0/15\n42.160.0.0/12\n42.176.0.0/13\n42.184.0.0/15\n42.186.0.0/16\n42.187.0.0/18\n42.187.64.0/19\n42.187.96.0/20\n42.187.112.0/21\n42.187.120.0/22\n42.187.128.0/17\n42.192.0.0/15\n42.194.0.0/21\n42.194.8.0/22\n42.194.12.0/22\n42.194.16.0/20\n42.194.32.0/19\n42.194.64.0/18\n42.194.128.0/17\n42.195.0.0/16\n42.196.0.0/14\n42.201.0.0/17\n42.202.0.0/15\n42.204.0.0/14\n42.208.0.0/12\n42.224.0.0/12\n42.240.0.0/17\n42.240.128.0/17\n42.242.0.0/15\n42.244.0.0/14\n42.248.0.0/13\n49.4.0.0/14\n49.51.0.0/16\n49.52.0.0/14\n49.64.0.0/11\n49.112.0.0/13\n49.120.0.0/14\n49.128.0.0/24\n49.128.2.0/23\n49.140.0.0/15\n49.152.0.0/14\n49.208.0.0/15\n49.210.0.0/15\n49.220.0.0/14\n49.232.0.0/14\n49.239.0.0/18\n49.239.192.0/18\n49.246.224.0/19\n54.222.0.0/15\n58.14.0.0/15\n58.16.0.0/16\n58.17.0.0/17\n58.17.128.0/17\n58.18.0.0/16\n58.19.0.0/16\n58.20.0.0/16\n58.21.0.0/16\n58.22.0.0/15\n58.24.0.0/15\n58.30.0.0/15\n58.32.0.0/13\n58.40.0.0/15\n58.42.0.0/16\n58.43.0.0/16\n58.44.0.0/14\n58.48.0.0/13\n58.56.0.0/15\n58.58.0.0/16\n58.59.0.0/17\n58.59.128.0/17\n58.60.0.0/14\n58.65.232.0/21\n58.66.0.0/15\n58.68.128.0/17\n58.82.0.0/17\n58.83.0.0/17\n58.83.128.0/17\n58.87.64.0/18\n58.99.128.0/17\n58.100.0.0/15\n58.116.0.0/14\n58.128.0.0/13\n58.144.0.0/16\n58.154.0.0/15\n58.192.0.0/15\n58.194.0.0/15\n58.196.0.0/15\n58.198.0.0/15\n58.200.0.0/13\n58.208.0.0/12\n58.240.0.0/15\n58.242.0.0/15\n58.244.0.0/15\n58.246.0.0/15\n58.248.0.0/13\n59.32.0.0/13\n59.40.0.0/15\n59.42.0.0/16\n59.43.0.0/16\n59.44.0.0/14\n59.48.0.0/16\n59.49.0.0/17\n59.49.128.0/17\n59.50.0.0/16\n59.51.0.0/17\n59.51.128.0/17\n59.52.0.0/14\n59.56.0.0/14\n59.60.0.0/15\n59.62.0.0/15\n59.64.0.0/14\n59.68.0.0/14\n59.72.0.0/15\n59.74.0.0/15\n59.76.0.0/16\n59.77.0.0/16\n59.78.0.0/15\n59.80.0.0/14\n59.107.0.0/17\n59.107.128.0/17\n59.108.0.0/15\n59.110.0.0/15\n59.151.0.0/17\n59.155.0.0/16\n59.172.0.0/15\n59.174.0.0/15\n59.191.0.0/17\n59.191.240.0/20\n59.192.0.0/10\n60.0.0.0/13\n60.8.0.0/15\n60.10.0.0/16\n60.11.0.0/16\n60.12.0.0/16\n60.13.0.0/18\n60.13.64.0/18\n60.13.128.0/17\n60.14.0.0/15\n60.16.0.0/13\n60.24.0.0/14\n60.28.0.0/15\n60.30.0.0/16\n60.31.0.0/16\n60.55.0.0/16\n60.63.0.0/16\n60.160.0.0/15\n60.162.0.0/15\n60.164.0.0/15\n60.166.0.0/15\n60.168.0.0/13\n60.176.0.0/12\n60.194.0.0/15\n60.200.0.0/14\n60.204.0.0/16\n60.205.0.0/16\n60.206.0.0/15\n60.208.0.0/13\n60.216.0.0/15\n60.218.0.0/15\n60.220.0.0/14\n60.232.0.0/15\n60.235.0.0/16\n60.245.128.0/17\n60.247.0.0/16\n60.252.0.0/16\n60.253.128.0/17\n60.255.0.0/16\n61.4.80.0/22\n61.4.84.0/22\n61.4.88.0/21\n61.4.176.0/20\n61.8.160.0/20\n61.28.0.0/20\n61.28.16.0/20\n61.28.32.0/19\n61.28.64.0/18\n61.29.128.0/18\n61.29.192.0/19\n61.29.224.0/20\n61.29.240.0/20\n61.45.128.0/18\n61.45.224.0/20\n61.47.128.0/18\n61.48.0.0/14\n61.52.0.0/15\n61.54.0.0/16\n61.55.0.0/16\n61.87.192.0/18\n61.128.0.0/15\n61.130.0.0/15\n61.132.0.0/16\n61.133.0.0/17\n61.133.128.0/17\n61.134.0.0/18\n61.134.64.0/19\n61.134.96.0/19\n61.134.128.0/18\n61.134.192.0/18\n61.135.0.0/16\n61.136.0.0/18\n61.136.64.0/18\n61.136.128.0/17\n61.137.0.0/17\n61.137.128.0/17\n61.138.0.0/18\n61.138.64.0/18\n61.138.128.0/18\n61.138.192.0/18\n61.139.0.0/17\n61.139.128.0/18\n61.139.192.0/18\n61.140.0.0/14\n61.144.0.0/14\n61.148.0.0/15\n61.150.0.0/15\n61.152.0.0/16\n61.153.0.0/16\n61.154.0.0/15\n61.156.0.0/16\n61.157.0.0/16\n61.158.0.0/17\n61.158.128.0/17\n61.159.0.0/18\n61.159.64.0/18\n61.159.128.0/17\n61.160.0.0/16\n61.161.0.0/18\n61.161.64.0/18\n61.161.128.0/17\n61.162.0.0/16\n61.163.0.0/16\n61.164.0.0/16\n61.165.0.0/16\n61.166.0.0/16\n61.167.0.0/16\n61.168.0.0/16\n61.169.0.0/16\n61.170.0.0/15\n61.172.0.0/14\n61.176.0.0/16\n61.177.0.0/16\n61.178.0.0/16\n61.179.0.0/16\n61.180.0.0/17\n61.180.128.0/17\n61.181.0.0/16\n61.182.0.0/16\n61.183.0.0/16\n61.184.0.0/14\n61.188.0.0/16\n61.189.0.0/17\n61.189.128.0/17\n61.190.0.0/15\n61.232.0.0/14\n61.236.0.0/15\n61.240.0.0/14\n101.0.0.0/22\n101.1.0.0/22\n101.2.172.0/22\n101.4.0.0/14\n101.16.0.0/12\n101.32.0.0/12\n101.48.0.0/15\n101.50.56.0/22\n101.52.0.0/16\n101.53.100.0/22\n101.54.0.0/16\n101.55.224.0/21\n101.64.0.0/13\n101.72.0.0/14\n101.76.0.0/15\n101.78.0.0/22\n101.78.32.0/19\n101.80.0.0/12\n101.96.0.0/21\n101.96.8.0/22\n101.96.16.0/20\n101.96.128.0/17\n101.99.96.0/19\n101.101.64.0/19\n101.101.100.0/24\n101.101.102.0/23\n101.101.104.0/21\n101.101.112.0/20\n101.102.64.0/19\n101.102.100.0/23\n101.102.102.0/24\n101.102.104.0/21\n101.102.112.0/20\n101.104.0.0/14\n101.110.64.0/19\n101.110.96.0/20\n101.110.116.0/22\n101.110.120.0/21\n101.120.0.0/14\n101.124.0.0/15\n101.126.0.0/16\n101.128.0.0/22\n101.128.8.0/21\n101.128.16.0/20\n101.128.32.0/19\n101.129.0.0/16\n101.130.0.0/15\n101.132.0.0/14\n101.144.0.0/12\n101.192.0.0/14\n101.196.0.0/14\n101.200.0.0/15\n101.203.128.0/19\n101.203.160.0/21\n101.203.172.0/22\n101.203.176.0/20\n101.204.0.0/14\n101.224.0.0/13\n101.232.0.0/15\n101.234.64.0/21\n101.234.76.0/22\n101.234.80.0/20\n101.234.96.0/19\n101.236.0.0/14\n101.240.0.0/14\n101.244.0.0/14\n101.248.0.0/15\n101.251.0.0/22\n101.251.8.0/21\n101.251.16.0/20\n101.251.32.0/19\n101.251.64.0/18\n101.251.128.0/17\n101.252.0.0/15\n101.254.0.0/16\n103.1.8.0/22\n103.1.20.0/22\n103.1.24.0/22\n103.1.72.0/22\n103.1.88.0/22\n103.1.168.0/22\n103.2.108.0/22\n103.2.156.0/22\n103.2.164.0/22\n103.2.200.0/22\n103.2.204.0/22\n103.2.208.0/22\n103.2.212.0/22\n103.3.84.0/22\n103.3.88.0/22\n103.3.92.0/22\n103.3.96.0/22\n103.3.100.0/22\n103.3.104.0/22\n103.3.108.0/22\n103.3.112.0/22\n103.3.116.0/22\n103.3.120.0/22\n103.3.124.0/22\n103.3.128.0/22\n103.3.132.0/22\n103.3.136.0/22\n103.3.140.0/22\n103.3.148.0/22\n103.3.152.0/22\n103.3.156.0/22\n103.4.56.0/22\n103.4.168.0/22\n103.4.184.0/22\n103.5.36.0/22\n103.5.52.0/22\n103.5.56.0/22\n103.5.252.0/22\n103.6.76.0/22\n103.6.220.0/22\n103.7.4.0/22\n103.7.28.0/22\n103.7.212.0/22\n103.7.216.0/22\n103.7.220.0/22\n103.8.4.0/22\n103.8.8.0/22\n103.8.32.0/22\n103.8.52.0/22\n103.8.108.0/22\n103.8.156.0/22\n103.8.200.0/22\n103.8.204.0/22\n103.8.220.0/22\n103.9.152.0/22\n103.9.248.0/22\n103.9.252.0/22\n103.10.0.0/22\n103.10.16.0/22\n103.10.84.0/22\n103.10.111.0/24\n103.10.140.0/22\n103.11.180.0/22\n103.12.32.0/22\n103.12.68.0/22\n103.12.136.0/22\n103.12.184.0/22\n103.12.232.0/22\n103.13.124.0/22\n103.13.144.0/22\n103.13.196.0/22\n103.13.244.0/22\n103.14.84.0/22\n103.14.112.0/22\n103.14.132.0/22\n103.14.136.0/22\n103.14.156.0/22\n103.14.240.0/22\n103.15.4.0/22\n103.15.8.0/22\n103.15.16.0/22\n103.15.96.0/22\n103.15.200.0/22\n103.16.52.0/22\n103.16.80.0/22\n103.16.84.0/22\n103.16.88.0/22\n103.16.108.0/22\n103.16.124.0/22\n103.17.40.0/22\n103.17.120.0/22\n103.17.160.0/22\n103.17.204.0/22\n103.17.228.0/22\n103.18.192.0/22\n103.18.208.0/22\n103.18.212.0/22\n103.18.224.0/22\n103.19.12.0/22\n103.19.40.0/22\n103.19.44.0/22\n103.19.64.0/22\n103.19.68.0/22\n103.19.72.0/22\n103.19.232.0/22\n103.20.12.0/22\n103.20.32.0/22\n103.20.112.0/22\n103.20.128.0/22\n103.20.160.0/22\n103.20.248.0/22\n103.21.112.0/22\n103.21.116.0/22\n103.21.136.0/22\n103.21.140.0/22\n103.21.176.0/22\n103.21.208.0/22\n103.21.240.0/22\n103.22.0.0/22\n103.22.4.0/22\n103.22.8.0/22\n103.22.12.0/22\n103.22.16.0/22\n103.22.20.0/22\n103.22.24.0/22\n103.22.28.0/22\n103.22.32.0/22\n103.22.36.0/22\n103.22.40.0/22\n103.22.44.0/22\n103.22.48.0/22\n103.22.52.0/22\n103.22.56.0/22\n103.22.60.0/22\n103.22.64.0/22\n103.22.68.0/22\n103.22.72.0/22\n103.22.76.0/22\n103.22.80.0/22\n103.22.84.0/22\n103.22.88.0/22\n103.22.92.0/22\n103.22.100.0/22\n103.22.104.0/22\n103.22.108.0/22\n103.22.112.0/22\n103.22.116.0/22\n103.22.120.0/22\n103.22.124.0/22\n103.22.188.0/22\n103.22.228.0/22\n103.22.252.0/22\n103.23.8.0/22\n103.23.56.0/22\n103.23.160.0/22\n103.23.164.0/22\n103.23.176.0/22\n103.23.228.0/22\n103.24.116.0/22\n103.24.128.0/22\n103.24.144.0/22\n103.24.176.0/22\n103.24.184.0/22\n103.24.220.0/22\n103.24.228.0/22\n103.24.248.0/22\n103.24.252.0/22\n103.25.8.0/23\n103.25.20.0/22\n103.25.24.0/22\n103.25.28.0/22\n103.25.32.0/22\n103.25.36.0/22\n103.25.40.0/22\n103.25.48.0/22\n103.25.64.0/22\n103.25.68.0/22\n103.25.148.0/22\n103.25.156.0/22\n103.25.216.0/22\n103.26.0.0/22\n103.26.64.0/22\n103.26.156.0/22\n103.26.160.0/22\n103.26.228.0/22\n103.26.240.0/22\n103.27.4.0/22\n103.27.12.0/22\n103.27.24.0/22\n103.27.56.0/22\n103.27.96.0/22\n103.27.208.0/22\n103.27.240.0/22\n103.28.4.0/22\n103.28.8.0/22\n103.28.204.0/22\n103.29.16.0/22\n103.29.128.0/22\n103.29.132.0/22\n103.29.136.0/22\n103.30.20.0/22\n103.30.96.0/22\n103.30.148.0/22\n103.30.200.0/22\n103.30.216.0/22\n103.30.228.0/22\n103.30.232.0/22\n103.30.236.0/22\n103.31.0.0/22\n103.31.48.0/22\n103.31.52.0/22\n103.31.56.0/22\n103.31.60.0/22\n103.31.64.0/22\n103.31.68.0/22\n103.31.72.0/22\n103.31.148.0/22\n103.31.160.0/22\n103.31.168.0/22\n103.31.200.0/22\n103.224.40.0/22\n103.224.44.0/22\n103.224.60.0/22\n103.224.80.0/22\n103.224.220.0/22\n103.224.224.0/22\n103.224.228.0/22\n103.224.232.0/22\n103.225.84.0/22\n103.226.16.0/22\n103.226.40.0/22\n103.226.56.0/22\n103.226.60.0/22\n103.226.80.0/22\n103.226.116.0/22\n103.226.132.0/22\n103.226.156.0/22\n103.226.180.0/22\n103.226.196.0/22\n103.227.48.0/22\n103.227.72.0/22\n103.227.76.0/22\n103.227.80.0/22\n103.227.100.0/22\n103.227.120.0/22\n103.227.132.0/22\n103.227.136.0/22\n103.227.196.0/22\n103.227.204.0/22\n103.227.212.0/22\n103.227.228.0/22\n103.228.12.0/22\n103.228.28.0/22\n103.228.68.0/22\n103.228.88.0/22\n103.228.128.0/22\n103.228.160.0/22\n103.228.176.0/22\n103.228.204.0/22\n103.228.208.0/22\n103.228.228.0/22\n103.228.232.0/22\n103.229.20.0/22\n103.229.136.0/22\n103.229.148.0/22\n103.229.172.0/22\n103.229.212.0/22\n103.229.216.0/22\n103.229.220.0/22\n103.229.228.0/22\n103.229.236.0/22\n103.229.240.0/22\n103.230.0.0/22\n103.230.28.0/22\n103.230.40.0/22\n103.230.44.0/22\n103.230.96.0/22\n103.230.196.0/22\n103.230.200.0/22\n103.230.204.0/22\n103.230.212.0/22\n103.230.236.0/22\n103.231.16.0/22\n103.231.20.0/22\n103.231.64.0/22\n103.231.68.0/22\n103.240.16.0/22\n103.240.36.0/22\n103.240.72.0/22\n103.240.84.0/22\n103.240.124.0/22\n103.240.156.0/22\n103.240.172.0/22\n103.240.244.0/22\n103.241.12.0/22\n103.241.72.0/22\n103.241.92.0/22\n103.241.96.0/22\n103.241.160.0/22\n103.241.184.0/22\n103.241.188.0/22\n103.241.220.0/22\n103.242.8.0/22\n103.242.64.0/22\n103.242.128.0/22\n103.242.132.0/22\n103.242.160.0/22\n103.242.168.0/22\n103.242.172.0/22\n103.242.176.0/22\n103.242.200.0/22\n103.242.212.0/22\n103.242.220.0/22\n103.242.240.0/22\n103.243.24.0/22\n103.243.136.0/22\n103.243.252.0/22\n103.244.16.0/22\n103.244.56.0/22\n103.244.60.0/22\n103.244.64.0/22\n103.244.68.0/22\n103.244.72.0/22\n103.244.76.0/22\n103.244.80.0/22\n103.244.84.0/22\n103.244.164.0/22\n103.244.232.0/22\n103.244.252.0/22\n103.245.23.0/24\n103.245.52.0/22\n103.245.60.0/22\n103.245.80.0/22\n103.245.124.0/22\n103.245.128.0/22\n103.246.8.0/22\n103.246.12.0/22\n103.246.120.0/22\n103.246.124.0/22\n103.246.132.0/22\n103.246.152.0/22\n103.246.156.0/22\n103.247.168.0/22\n103.247.172.0/22\n103.247.176.0/22\n103.247.200.0/22\n103.247.212.0/22\n103.248.0.0/23\n103.248.64.0/22\n103.248.100.0/22\n103.248.124.0/22\n103.248.152.0/22\n103.248.168.0/22\n103.248.192.0/22\n103.248.212.0/22\n103.248.224.0/22\n103.248.228.0/22\n103.249.12.0/22\n103.249.52.0/22\n103.249.128.0/22\n103.249.136.0/22\n103.249.144.0/22\n103.249.164.0/22\n103.249.168.0/22\n103.249.172.0/22\n103.249.176.0/22\n103.249.188.0/22\n103.249.192.0/22\n103.249.244.0/22\n103.249.252.0/22\n103.250.32.0/22\n103.250.104.0/22\n103.250.124.0/22\n103.250.180.0/22\n103.250.192.0/22\n103.250.216.0/22\n103.250.224.0/22\n103.250.236.0/22\n103.250.248.0/22\n103.250.252.0/22\n103.251.32.0/22\n103.251.84.0/22\n103.251.96.0/22\n103.251.124.0/22\n103.251.128.0/22\n103.251.160.0/22\n103.251.204.0/22\n103.251.236.0/22\n103.251.240.0/22\n103.252.28.0/22\n103.252.36.0/22\n103.252.64.0/22\n103.252.104.0/22\n103.252.172.0/22\n103.252.204.0/22\n103.252.208.0/22\n103.252.232.0/22\n103.252.248.0/22\n103.253.4.0/22\n103.253.60.0/22\n103.253.204.0/22\n103.253.220.0/22\n103.253.224.0/22\n103.253.232.0/22\n103.254.8.0/22\n103.254.20.0/22\n103.254.64.0/22\n103.254.68.0/22\n103.254.72.0/22\n103.254.76.0/22\n103.254.112.0/22\n103.254.148.0/22\n103.254.176.0/22\n103.254.188.0/22\n103.254.196.0/24\n103.254.220.0/22\n103.255.68.0/22\n103.255.88.0/22\n103.255.92.0/22\n103.255.136.0/22\n103.255.140.0/22\n103.255.184.0/22\n103.255.200.0/22\n103.255.208.0/22\n103.255.212.0/22\n103.255.228.0/22\n106.0.0.0/24\n106.0.2.0/23\n106.0.4.0/22\n106.0.8.0/21\n106.0.16.0/20\n106.0.64.0/18\n106.2.0.0/15\n106.4.0.0/14\n106.8.0.0/15\n106.11.0.0/16\n106.12.0.0/14\n106.16.0.0/12\n106.32.0.0/12\n106.48.0.0/15\n106.50.0.0/16\n106.52.0.0/14\n106.56.0.0/13\n106.74.0.0/15\n106.80.0.0/12\n106.108.0.0/14\n106.112.0.0/13\n106.120.0.0/13\n106.224.0.0/12\n110.6.0.0/15\n110.16.0.0/14\n110.40.0.0/14\n110.44.144.0/20\n110.48.0.0/16\n110.51.0.0/16\n110.52.0.0/15\n110.56.0.0/13\n110.64.0.0/15\n110.72.0.0/15\n110.75.0.0/17\n110.75.128.0/19\n110.75.160.0/19\n110.75.192.0/18\n110.76.0.0/19\n110.76.32.0/19\n110.76.156.0/22\n110.76.184.0/22\n110.76.192.0/18\n110.77.0.0/17\n110.80.0.0/13\n110.88.0.0/14\n110.93.32.0/19\n110.94.0.0/15\n110.96.0.0/11\n110.152.0.0/14\n110.156.0.0/15\n110.165.32.0/19\n110.166.0.0/15\n110.172.192.0/18\n110.173.0.0/19\n110.173.32.0/20\n110.173.64.0/19\n110.173.96.0/19\n110.173.192.0/19\n110.176.0.0/13\n110.184.0.0/13\n110.192.0.0/11\n110.228.0.0/14\n110.232.32.0/19\n110.236.0.0/15\n110.240.0.0/12\n111.0.0.0/10\n111.66.0.0/16\n111.67.192.0/20\n111.68.64.0/19\n111.72.0.0/13\n111.85.0.0/16\n111.91.192.0/19\n111.112.0.0/15\n111.114.0.0/15\n111.116.0.0/15\n111.118.200.0/21\n111.119.64.0/18\n111.119.128.0/19\n111.120.0.0/14\n111.124.0.0/16\n111.126.0.0/15\n111.128.0.0/11\n111.160.0.0/13\n111.170.0.0/16\n111.172.0.0/14\n111.176.0.0/13\n111.186.0.0/15\n111.192.0.0/12\n111.208.0.0/14\n111.212.0.0/14\n111.221.128.0/17\n111.222.0.0/16\n111.223.240.0/22\n111.223.248.0/22\n111.224.0.0/14\n111.228.0.0/14\n111.235.96.0/19\n111.235.156.0/22\n111.235.160.0/19\n112.0.0.0/10\n112.64.0.0/15\n112.66.0.0/15\n112.73.0.0/16\n112.74.0.0/15\n112.80.0.0/13\n112.88.0.0/13\n112.96.0.0/15\n112.98.0.0/15\n112.100.0.0/14\n112.109.128.0/17\n112.111.0.0/16\n112.112.0.0/14\n112.116.0.0/15\n112.122.0.0/15\n112.124.0.0/14\n112.128.0.0/14\n112.132.0.0/16\n112.137.48.0/21\n112.192.0.0/14\n112.224.0.0/11\n113.0.0.0/13\n113.8.0.0/15\n113.11.192.0/19\n113.12.0.0/14\n113.16.0.0/15\n113.18.0.0/16\n113.24.0.0/14\n113.31.0.0/16\n113.44.0.0/14\n113.48.0.0/14\n113.52.160.0/19\n113.54.0.0/15\n113.56.0.0/15\n113.58.0.0/16\n113.59.0.0/17\n113.59.224.0/22\n113.62.0.0/15\n113.64.0.0/11\n113.96.0.0/12\n113.112.0.0/13\n113.120.0.0/13\n113.128.0.0/15\n113.130.96.0/20\n113.130.112.0/21\n113.132.0.0/14\n113.136.0.0/13\n113.194.0.0/15\n113.197.100.0/22\n113.200.0.0/15\n113.202.0.0/16\n113.204.0.0/14\n113.208.96.0/19\n113.208.128.0/17\n113.209.0.0/16\n113.212.0.0/18\n113.212.100.0/22\n113.212.184.0/21\n113.213.0.0/17\n113.214.0.0/15\n113.218.0.0/15\n113.220.0.0/14\n113.224.0.0/12\n113.240.0.0/13\n113.248.0.0/14\n114.28.0.0/16\n114.54.0.0/15\n114.60.0.0/14\n114.64.0.0/14\n114.68.0.0/16\n114.79.64.0/18\n114.80.0.0/12\n114.96.0.0/13\n114.104.0.0/14\n114.110.0.0/20\n114.110.64.0/18\n114.111.0.0/19\n114.111.160.0/19\n114.112.0.0/14\n114.116.0.0/15\n114.118.0.0/15\n114.132.0.0/16\n114.135.0.0/16\n114.138.0.0/15\n114.141.64.0/21\n114.141.128.0/18\n114.196.0.0/15\n114.198.248.0/21\n114.208.0.0/14\n114.212.0.0/15\n114.214.0.0/16\n114.215.0.0/16\n114.216.0.0/13\n114.224.0.0/12\n114.240.0.0/12\n115.24.0.0/14\n115.28.0.0/15\n115.32.0.0/14\n115.44.0.0/15\n115.46.0.0/16\n115.47.0.0/16\n115.48.0.0/12\n115.69.64.0/20\n115.84.0.0/18\n115.84.192.0/19\n115.85.192.0/18\n115.100.0.0/14\n115.104.0.0/14\n115.120.0.0/14\n115.124.16.0/20\n115.148.0.0/14\n115.152.0.0/15\n115.154.0.0/15\n115.156.0.0/15\n115.158.0.0/16\n115.159.0.0/16\n115.166.64.0/19\n115.168.0.0/14\n115.172.0.0/14\n115.180.0.0/14\n115.190.0.0/15\n115.192.0.0/11\n115.224.0.0/12\n116.0.8.0/21\n116.0.24.0/21\n116.1.0.0/16\n116.2.0.0/15\n116.4.0.0/14\n116.8.0.0/14\n116.13.0.0/16\n116.16.0.0/12\n116.50.0.0/20\n116.52.0.0/14\n116.56.0.0/15\n116.58.128.0/20\n116.58.208.0/20\n116.60.0.0/14\n116.66.0.0/17\n116.69.0.0/16\n116.70.0.0/17\n116.76.0.0/15\n116.78.0.0/15\n116.85.0.0/16\n116.89.144.0/20\n116.90.80.0/20\n116.90.184.0/21\n116.95.0.0/16\n116.112.0.0/14\n116.116.0.0/15\n116.128.0.0/10\n116.192.0.0/16\n116.193.16.0/20\n116.193.32.0/19\n116.193.176.0/21\n116.194.0.0/15\n116.196.0.0/16\n116.198.0.0/16\n116.199.0.0/17\n116.199.128.0/19\n116.204.0.0/15\n116.207.0.0/16\n116.208.0.0/14\n116.212.160.0/20\n116.213.64.0/18\n116.213.128.0/17\n116.214.32.0/19\n116.214.64.0/20\n116.214.128.0/17\n116.215.0.0/16\n116.216.0.0/14\n116.224.0.0/12\n116.242.0.0/15\n116.244.0.0/15\n116.246.0.0/15\n116.248.0.0/15\n116.251.64.0/18\n116.252.0.0/15\n116.254.128.0/17\n116.255.128.0/17\n117.8.0.0/13\n117.21.0.0/16\n117.22.0.0/15\n117.24.0.0/13\n117.32.0.0/13\n117.40.0.0/14\n117.44.0.0/15\n117.48.0.0/14\n117.53.48.0/20\n117.53.176.0/20\n117.57.0.0/16\n117.58.0.0/17\n117.59.0.0/16\n117.60.0.0/14\n117.64.0.0/13\n117.72.0.0/15\n117.74.64.0/20\n117.74.80.0/20\n117.74.128.0/17\n117.75.0.0/16\n117.76.0.0/14\n117.80.0.0/12\n117.100.0.0/15\n117.103.16.0/20\n117.103.40.0/21\n117.103.72.0/21\n117.103.128.0/20\n117.104.168.0/21\n117.106.0.0/15\n117.112.0.0/13\n117.120.64.0/18\n117.120.128.0/17\n117.121.0.0/17\n117.121.128.0/18\n117.121.192.0/21\n117.122.128.0/17\n117.124.0.0/14\n117.128.0.0/10\n118.24.0.0/15\n118.26.0.0/16\n118.28.0.0/15\n118.30.0.0/16\n118.31.0.0/16\n118.64.0.0/15\n118.66.0.0/16\n118.67.112.0/20\n118.72.0.0/13\n118.80.0.0/15\n118.84.0.0/15\n118.88.32.0/19\n118.88.64.0/18\n118.88.128.0/17\n118.89.0.0/16\n118.91.240.0/20\n118.102.16.0/20\n118.102.32.0/21\n118.112.0.0/13\n118.120.0.0/14\n118.124.0.0/15\n118.126.0.0/16\n118.127.128.0/19\n118.132.0.0/14\n118.144.0.0/14\n118.178.0.0/16\n118.180.0.0/14\n118.184.0.0/16\n118.186.0.0/15\n118.188.0.0/16\n118.190.0.0/15\n118.192.0.0/15\n118.194.0.0/17\n118.194.128.0/17\n118.195.0.0/17\n118.195.128.0/17\n118.196.0.0/14\n118.202.0.0/15\n118.204.0.0/14\n118.212.0.0/16\n118.213.0.0/16\n118.224.0.0/14\n118.228.0.0/15\n118.230.0.0/16\n118.239.0.0/16\n118.242.0.0/16\n118.244.0.0/14\n118.248.0.0/13\n119.0.0.0/15\n119.2.0.0/19\n119.2.128.0/17\n119.3.0.0/16\n119.4.0.0/14\n119.8.0.0/16\n119.10.0.0/17\n119.15.136.0/21\n119.16.0.0/16\n119.18.192.0/20\n119.18.208.0/21\n119.18.224.0/20\n119.18.240.0/20\n119.19.0.0/16\n119.20.0.0/14\n119.27.64.0/18\n119.27.128.0/19\n119.27.160.0/19\n119.27.192.0/18\n119.28.0.0/15\n119.30.48.0/20\n119.31.192.0/19\n119.32.0.0/14\n119.36.0.0/16\n119.37.0.0/17\n119.37.128.0/18\n119.37.192.0/18\n119.38.0.0/17\n119.38.128.0/18\n119.38.192.0/20\n119.38.208.0/20\n119.38.224.0/19\n119.39.0.0/16\n119.40.0.0/18\n119.40.64.0/20\n119.40.128.0/17\n119.41.0.0/16\n119.42.0.0/19\n119.42.128.0/21\n119.42.136.0/21\n119.42.224.0/19\n119.44.0.0/15\n119.48.0.0/13\n119.57.0.0/16\n119.58.0.0/16\n119.59.128.0/17\n119.60.0.0/16\n119.61.0.0/16\n119.62.0.0/16\n119.63.32.0/19\n119.75.208.0/20\n119.78.0.0/15\n119.80.0.0/16\n119.82.208.0/20\n119.84.0.0/14\n119.88.0.0/14\n119.96.0.0/13\n119.108.0.0/15\n119.112.0.0/13\n119.120.0.0/13\n119.128.0.0/12\n119.144.0.0/14\n119.148.160.0/20\n119.148.176.0/20\n119.151.192.0/18\n119.160.200.0/21\n119.161.128.0/17\n119.162.0.0/15\n119.164.0.0/14\n119.176.0.0/12\n119.232.0.0/15\n119.235.128.0/18\n119.248.0.0/14\n119.252.96.0/21\n119.252.240.0/20\n119.253.0.0/16\n119.254.0.0/15\n120.0.0.0/12\n120.24.0.0/14\n120.30.0.0/16\n120.31.0.0/16\n120.32.0.0/13\n120.40.0.0/14\n120.44.0.0/14\n120.48.0.0/15\n120.52.0.0/14\n120.64.0.0/14\n120.68.0.0/14\n120.72.32.0/19\n120.72.128.0/17\n120.76.0.0/14\n120.80.0.0/13\n120.88.8.0/21\n120.90.0.0/15\n120.92.0.0/16\n120.94.0.0/16\n120.95.0.0/16\n120.128.0.0/14\n120.132.0.0/17\n120.132.128.0/17\n120.133.0.0/16\n120.134.0.0/15\n120.136.128.0/18\n120.137.0.0/17\n120.143.128.0/19\n120.192.0.0/10\n121.0.8.0/21\n121.0.16.0/20\n121.4.0.0/15\n121.8.0.0/13\n121.16.0.0/13\n121.24.0.0/14\n121.28.0.0/15\n121.30.0.0/16\n121.31.0.0/16\n121.32.0.0/14\n121.36.0.0/16\n121.37.0.0/16\n121.38.0.0/15\n121.40.0.0/14\n121.46.0.0/18\n121.46.128.0/17\n121.47.0.0/16\n121.48.0.0/15\n121.50.8.0/21\n121.51.0.0/16\n121.52.160.0/19\n121.52.208.0/20\n121.52.224.0/19\n121.54.176.0/21\n121.55.0.0/18\n121.56.0.0/15\n121.58.0.0/17\n121.58.136.0/21\n121.58.144.0/20\n121.58.160.0/21\n121.59.0.0/16\n121.60.0.0/14\n121.68.0.0/14\n121.76.0.0/15\n121.79.128.0/18\n121.89.0.0/16\n121.100.128.0/17\n121.101.0.0/18\n121.101.208.0/20\n121.192.0.0/16\n121.193.0.0/16\n121.194.0.0/15\n121.196.0.0/14\n121.200.192.0/21\n121.201.0.0/16\n121.204.0.0/14\n121.224.0.0/12\n121.248.0.0/14\n121.255.0.0/16\n122.0.64.0/18\n122.0.128.0/17\n122.4.0.0/14\n122.8.0.0/16\n122.9.0.0/16\n122.10.0.0/17\n122.10.128.0/17\n122.11.0.0/17\n122.12.0.0/16\n122.13.0.0/16\n122.14.0.0/16\n122.48.0.0/16\n122.49.0.0/18\n122.51.0.0/16\n122.64.0.0/11\n122.96.0.0/15\n122.102.0.0/20\n122.102.64.0/20\n122.102.80.0/20\n122.112.0.0/14\n122.119.0.0/16\n122.128.120.0/21\n122.136.0.0/13\n122.144.128.0/17\n122.152.192.0/18\n122.156.0.0/14\n122.188.0.0/14\n122.192.0.0/14\n122.198.0.0/16\n122.200.64.0/18\n122.201.48.0/20\n122.204.0.0/14\n122.224.0.0/12\n122.240.0.0/13\n122.248.24.0/21\n122.248.48.0/20\n122.255.64.0/21\n123.0.128.0/18\n123.4.0.0/14\n123.8.0.0/13\n123.49.128.0/17\n123.50.160.0/19\n123.52.0.0/14\n123.56.0.0/15\n123.58.0.0/16\n123.59.0.0/16\n123.60.0.0/16\n123.61.0.0/16\n123.62.0.0/16\n123.64.0.0/11\n123.96.0.0/15\n123.98.0.0/17\n123.99.128.0/17\n123.100.0.0/19\n123.101.0.0/16\n123.103.0.0/17\n123.108.128.0/20\n123.108.208.0/20\n123.112.0.0/12\n123.128.0.0/13\n123.136.80.0/20\n123.137.0.0/16\n123.138.0.0/15\n123.144.0.0/14\n123.148.0.0/16\n123.149.0.0/16\n123.150.0.0/15\n123.152.0.0/13\n123.160.0.0/14\n123.164.0.0/14\n123.168.0.0/14\n123.172.0.0/15\n123.174.0.0/15\n123.176.60.0/22\n123.176.80.0/20\n123.177.0.0/16\n123.178.0.0/15\n123.180.0.0/14\n123.184.0.0/14\n123.188.0.0/14\n123.196.0.0/15\n123.199.128.0/17\n123.206.0.0/15\n123.232.0.0/14\n123.242.0.0/17\n123.244.0.0/14\n123.249.0.0/16\n123.253.0.0/16\n124.6.64.0/18\n124.14.0.0/15\n124.16.0.0/15\n124.20.0.0/16\n124.21.0.0/20\n124.21.16.0/20\n124.21.32.0/19\n124.21.64.0/18\n124.21.128.0/17\n124.22.0.0/15\n124.28.192.0/18\n124.29.0.0/17\n124.31.0.0/16\n124.40.112.0/20\n124.40.128.0/18\n124.40.192.0/19\n124.42.0.0/17\n124.42.128.0/17\n124.47.0.0/18\n124.64.0.0/15\n124.66.0.0/17\n124.67.0.0/16\n124.68.0.0/14\n124.72.0.0/16\n124.73.0.0/16\n124.74.0.0/15\n124.76.0.0/14\n124.88.0.0/16\n124.89.0.0/17\n124.89.128.0/17\n124.90.0.0/15\n124.92.0.0/14\n124.108.8.0/21\n124.108.40.0/21\n124.109.96.0/21\n124.112.0.0/15\n124.114.0.0/15\n124.116.0.0/16\n124.117.0.0/16\n124.118.0.0/15\n124.126.0.0/15\n124.128.0.0/13\n124.147.128.0/17\n124.151.0.0/16\n124.152.0.0/16\n124.156.0.0/16\n124.160.0.0/16\n124.161.0.0/16\n124.162.0.0/16\n124.163.0.0/16\n124.164.0.0/14\n124.172.0.0/15\n124.174.0.0/15\n124.192.0.0/15\n124.196.0.0/16\n124.200.0.0/13\n124.220.0.0/14\n124.224.0.0/16\n124.225.0.0/16\n124.226.0.0/15\n124.228.0.0/14\n124.232.0.0/15\n124.234.0.0/15\n124.236.0.0/14\n124.240.0.0/17\n124.240.128.0/18\n124.242.0.0/16\n124.243.192.0/18\n124.248.0.0/17\n124.249.0.0/16\n124.250.0.0/15\n124.254.0.0/18\n125.31.192.0/18\n125.32.0.0/16\n125.33.0.0/16\n125.34.0.0/16\n125.35.0.0/17\n125.35.128.0/17\n125.36.0.0/14\n125.40.0.0/13\n125.58.128.0/17\n125.61.128.0/17\n125.62.0.0/18\n125.64.0.0/13\n125.72.0.0/16\n125.73.0.0/16\n125.74.0.0/15\n125.76.0.0/17\n125.76.128.0/17\n125.77.0.0/16\n125.78.0.0/15\n125.80.0.0/13\n125.88.0.0/13\n125.96.0.0/15\n125.98.0.0/16\n125.104.0.0/13\n125.112.0.0/12\n125.169.0.0/16\n125.171.0.0/16\n125.208.0.0/18\n125.210.0.0/16\n125.211.0.0/16\n125.213.0.0/17\n125.214.96.0/19\n125.215.0.0/18\n125.216.0.0/15\n125.218.0.0/16\n125.219.0.0/16\n125.220.0.0/15\n125.222.0.0/15\n125.254.128.0/18\n125.254.192.0/18\n134.196.0.0/16\n139.9.0.0/16\n139.129.0.0/16\n139.148.0.0/16\n139.155.0.0/16\n139.159.0.0/16\n139.170.0.0/16\n139.176.0.0/16\n139.183.0.0/16\n139.186.0.0/16\n139.189.0.0/16\n139.196.0.0/14\n139.200.0.0/13\n139.208.0.0/13\n139.220.0.0/15\n139.224.0.0/16\n139.226.0.0/15\n140.75.0.0/16\n140.143.0.0/16\n140.205.0.0/16\n140.206.0.0/15\n140.210.0.0/16\n140.224.0.0/16\n140.237.0.0/16\n140.240.0.0/16\n140.243.0.0/16\n140.246.0.0/16\n140.249.0.0/16\n140.250.0.0/16\n140.255.0.0/16\n144.0.0.0/16\n144.7.0.0/16\n144.12.0.0/16\n144.52.0.0/16\n144.123.0.0/16\n144.255.0.0/16\n150.0.0.0/16\n150.115.0.0/16\n150.121.0.0/16\n150.122.0.0/16\n150.138.0.0/15\n150.223.0.0/16\n150.255.0.0/16\n153.0.0.0/16\n153.3.0.0/16\n153.34.0.0/15\n153.36.0.0/15\n153.99.0.0/16\n153.101.0.0/16\n153.118.0.0/15\n157.0.0.0/16\n157.18.0.0/16\n157.61.0.0/16\n157.122.0.0/16\n157.148.0.0/16\n157.156.0.0/16\n157.255.0.0/16\n159.226.0.0/16\n161.207.0.0/16\n162.105.0.0/16\n163.0.0.0/16\n163.125.0.0/16\n163.142.0.0/16\n163.177.0.0/16\n163.179.0.0/16\n163.204.0.0/16\n166.111.0.0/16\n167.139.0.0/16\n167.189.0.0/16\n168.160.0.0/16\n171.8.0.0/13\n171.34.0.0/15\n171.36.0.0/14\n171.40.0.0/13\n171.80.0.0/14\n171.84.0.0/14\n171.88.0.0/13\n171.104.0.0/13\n171.112.0.0/14\n171.116.0.0/14\n171.120.0.0/13\n171.208.0.0/12\n175.0.0.0/12\n175.16.0.0/13\n175.24.0.0/14\n175.30.0.0/15\n175.42.0.0/15\n175.44.0.0/16\n175.46.0.0/15\n175.48.0.0/12\n175.64.0.0/11\n175.102.0.0/16\n175.106.128.0/17\n175.146.0.0/15\n175.148.0.0/14\n175.152.0.0/14\n175.160.0.0/12\n175.178.0.0/16\n175.184.128.0/18\n175.185.0.0/16\n175.186.0.0/15\n175.188.0.0/14\n180.76.0.0/16\n180.77.0.0/16\n180.78.0.0/15\n180.84.0.0/15\n180.86.0.0/16\n180.88.0.0/14\n180.94.56.0/21\n180.94.96.0/20\n180.95.128.0/17\n180.96.0.0/11\n180.129.128.0/17\n180.130.0.0/16\n180.136.0.0/13\n180.148.16.0/21\n180.148.152.0/21\n180.148.216.0/21\n180.148.224.0/19\n180.149.128.0/19\n180.150.160.0/19\n180.152.0.0/13\n180.160.0.0/12\n180.178.192.0/18\n180.184.0.0/14\n180.188.0.0/17\n180.189.148.0/22\n180.200.252.0/22\n180.201.0.0/16\n180.202.0.0/15\n180.208.0.0/15\n180.210.224.0/19\n180.212.0.0/15\n180.222.224.0/19\n180.223.0.0/16\n180.233.0.0/18\n180.233.64.0/19\n180.235.64.0/19\n182.16.192.0/19\n182.18.0.0/17\n182.23.184.0/21\n182.23.200.0/21\n182.32.0.0/12\n182.48.96.0/19\n182.49.0.0/16\n182.50.0.0/20\n182.50.112.0/20\n182.51.0.0/16\n182.54.0.0/17\n182.61.0.0/16\n182.80.0.0/14\n182.84.0.0/14\n182.88.0.0/14\n182.92.0.0/16\n182.96.0.0/12\n182.112.0.0/12\n182.128.0.0/12\n182.144.0.0/13\n182.157.0.0/16\n182.160.64.0/19\n182.174.0.0/15\n182.200.0.0/13\n182.236.128.0/17\n182.238.0.0/16\n182.239.0.0/19\n182.240.0.0/13\n182.254.0.0/16\n183.0.0.0/10\n183.64.0.0/13\n183.78.180.0/22\n183.81.180.0/22\n183.84.0.0/15\n183.91.128.0/22\n183.91.136.0/21\n183.91.144.0/20\n183.92.0.0/14\n183.128.0.0/11\n183.160.0.0/13\n183.168.0.0/15\n183.170.0.0/16\n183.172.0.0/14\n183.182.0.0/19\n183.184.0.0/13\n183.192.0.0/10\n192.124.154.0/24\n192.188.170.0/24\n202.0.100.0/23\n202.0.122.0/23\n202.0.176.0/22\n202.3.128.0/23\n202.4.128.0/19\n202.4.252.0/22\n202.6.6.0/23\n202.6.66.0/23\n202.6.72.0/23\n202.6.87.0/24\n202.6.88.0/23\n202.6.92.0/23\n202.6.103.0/24\n202.6.108.0/24\n202.6.110.0/23\n202.6.114.0/24\n202.6.176.0/20\n202.8.0.0/24\n202.8.2.0/23\n202.8.4.0/23\n202.8.12.0/24\n202.8.24.0/24\n202.8.77.0/24\n202.8.128.0/19\n202.8.192.0/20\n202.9.32.0/24\n202.9.34.0/23\n202.9.48.0/23\n202.9.51.0/24\n202.9.52.0/23\n202.9.54.0/24\n202.9.57.0/24\n202.9.58.0/23\n202.10.64.0/20\n202.12.1.0/24\n202.12.2.0/24\n202.12.17.0/24\n202.12.18.0/24\n202.12.19.0/24\n202.12.72.0/24\n202.12.84.0/23\n202.12.96.0/24\n202.12.98.0/23\n202.12.106.0/24\n202.12.111.0/24\n202.12.116.0/24\n202.14.64.0/23\n202.14.69.0/24\n202.14.73.0/24\n202.14.74.0/23\n202.14.76.0/24\n202.14.78.0/23\n202.14.88.0/24\n202.14.97.0/24\n202.14.104.0/23\n202.14.108.0/23\n202.14.111.0/24\n202.14.114.0/23\n202.14.118.0/23\n202.14.124.0/23\n202.14.127.0/24\n202.14.129.0/24\n202.14.135.0/24\n202.14.136.0/24\n202.14.149.0/24\n202.14.151.0/24\n202.14.157.0/24\n202.14.158.0/23\n202.14.169.0/24\n202.14.170.0/23\n202.14.176.0/24\n202.14.184.0/23\n202.14.208.0/23\n202.14.213.0/24\n202.14.219.0/24\n202.14.220.0/24\n202.14.222.0/23\n202.14.225.0/24\n202.14.226.0/23\n202.14.231.0/24\n202.14.235.0/24\n202.14.236.0/23\n202.14.238.0/24\n202.14.239.0/24\n202.14.246.0/24\n202.14.251.0/24\n202.20.66.0/24\n202.20.79.0/24\n202.20.87.0/24\n202.20.88.0/23\n202.20.90.0/24\n202.20.94.0/23\n202.20.114.0/24\n202.20.117.0/24\n202.20.120.0/24\n202.20.125.0/24\n202.20.127.0/24\n202.21.131.0/24\n202.21.132.0/24\n202.21.141.0/24\n202.21.142.0/24\n202.21.147.0/24\n202.21.148.0/24\n202.21.150.0/23\n202.21.152.0/23\n202.21.154.0/24\n202.21.156.0/24\n202.22.248.0/22\n202.22.252.0/22\n202.27.136.0/23\n202.38.0.0/23\n202.38.2.0/23\n202.38.8.0/21\n202.38.48.0/20\n202.38.64.0/19\n202.38.96.0/19\n202.38.128.0/23\n202.38.130.0/23\n202.38.132.0/23\n202.38.134.0/24\n202.38.135.0/24\n202.38.136.0/23\n202.38.138.0/24\n202.38.140.0/23\n202.38.142.0/23\n202.38.146.0/23\n202.38.149.0/24\n202.38.150.0/23\n202.38.152.0/23\n202.38.154.0/23\n202.38.156.0/24\n202.38.158.0/23\n202.38.160.0/23\n202.38.164.0/22\n202.38.168.0/23\n202.38.170.0/24\n202.38.171.0/24\n202.38.176.0/23\n202.38.184.0/21\n202.38.192.0/18\n202.40.4.0/23\n202.40.7.0/24\n202.40.15.0/24\n202.40.135.0/24\n202.40.136.0/24\n202.40.140.0/24\n202.40.143.0/24\n202.40.144.0/23\n202.40.150.0/24\n202.40.155.0/24\n202.40.156.0/24\n202.40.158.0/23\n202.40.162.0/24\n202.41.8.0/23\n202.41.11.0/24\n202.41.12.0/23\n202.41.128.0/24\n202.41.130.0/23\n202.41.152.0/21\n202.41.192.0/24\n202.41.240.0/20\n202.43.76.0/22\n202.43.144.0/20\n202.44.16.0/20\n202.44.67.0/24\n202.44.74.0/24\n202.44.129.0/24\n202.44.132.0/23\n202.44.146.0/23\n202.45.0.0/23\n202.45.2.0/24\n202.45.15.0/24\n202.45.16.0/20\n202.46.16.0/23\n202.46.18.0/24\n202.46.20.0/23\n202.46.32.0/19\n202.46.128.0/24\n202.46.224.0/20\n202.47.82.0/23\n202.47.126.0/24\n202.47.128.0/24\n202.47.130.0/23\n202.57.240.0/20\n202.58.0.0/24\n202.59.0.0/24\n202.59.212.0/22\n202.59.232.0/23\n202.59.236.0/24\n202.60.48.0/21\n202.60.96.0/21\n202.60.112.0/20\n202.60.132.0/22\n202.60.136.0/21\n202.60.144.0/20\n202.62.112.0/22\n202.62.248.0/22\n202.62.252.0/24\n202.62.255.0/24\n202.63.81.0/24\n202.63.82.0/23\n202.63.84.0/22\n202.63.88.0/21\n202.63.160.0/19\n202.63.248.0/22\n202.65.0.0/21\n202.65.8.0/23\n202.67.0.0/22\n202.69.4.0/22\n202.69.16.0/20\n202.70.0.0/19\n202.70.96.0/20\n202.70.192.0/20\n202.72.40.0/21\n202.72.80.0/20\n202.73.128.0/22\n202.74.8.0/21\n202.74.80.0/20\n202.74.254.0/23\n202.75.208.0/20\n202.75.252.0/22\n202.76.252.0/22\n202.77.80.0/21\n202.77.92.0/22\n202.78.8.0/21\n202.79.224.0/21\n202.79.248.0/22\n202.80.192.0/21\n202.80.200.0/21\n202.81.0.0/22\n202.83.252.0/22\n202.84.4.0/22\n202.84.8.0/21\n202.84.24.0/21\n202.85.208.0/20\n202.86.249.0/24\n202.86.252.0/22\n202.87.80.0/20\n202.89.8.0/21\n202.90.0.0/22\n202.90.112.0/20\n202.90.196.0/24\n202.90.224.0/20\n202.91.0.0/22\n202.91.96.0/20\n202.91.128.0/22\n202.91.176.0/20\n202.91.224.0/19\n202.92.0.0/22\n202.92.8.0/21\n202.92.48.0/20\n202.92.252.0/22\n202.93.0.0/22\n202.93.252.0/22\n202.94.92.0/22\n202.95.0.0/22\n202.95.4.0/22\n202.95.8.0/21\n202.95.16.0/20\n202.95.240.0/21\n202.95.252.0/22\n202.96.0.0/18\n202.96.64.0/21\n202.96.72.0/21\n202.96.80.0/20\n202.96.96.0/21\n202.96.104.0/21\n202.96.112.0/20\n202.96.128.0/21\n202.96.136.0/21\n202.96.144.0/20\n202.96.160.0/21\n202.96.168.0/21\n202.96.176.0/20\n202.96.192.0/21\n202.96.200.0/21\n202.96.208.0/20\n202.96.224.0/21\n202.96.232.0/21\n202.96.240.0/20\n202.97.0.0/21\n202.97.8.0/21\n202.97.16.0/20\n202.97.32.0/19\n202.97.64.0/19\n202.97.96.0/20\n202.97.112.0/20\n202.97.128.0/18\n202.97.192.0/19\n202.97.224.0/21\n202.97.232.0/21\n202.97.240.0/20\n202.98.0.0/21\n202.98.8.0/21\n202.98.16.0/20\n202.98.32.0/21\n202.98.40.0/21\n202.98.48.0/20\n202.98.64.0/19\n202.98.96.0/21\n202.98.104.0/21\n202.98.112.0/20\n202.98.128.0/19\n202.98.160.0/21\n202.98.168.0/21\n202.98.176.0/20\n202.98.192.0/21\n202.98.200.0/21\n202.98.208.0/20\n202.98.224.0/21\n202.98.232.0/21\n202.98.240.0/20\n202.99.0.0/18\n202.99.64.0/19\n202.99.96.0/21\n202.99.104.0/21\n202.99.112.0/20\n202.99.128.0/19\n202.99.160.0/21\n202.99.168.0/21\n202.99.176.0/20\n202.99.192.0/21\n202.99.200.0/21\n202.99.208.0/20\n202.99.224.0/21\n202.99.232.0/21\n202.99.240.0/20\n202.100.0.0/21\n202.100.8.0/21\n202.100.16.0/20\n202.100.32.0/19\n202.100.64.0/21\n202.100.72.0/21\n202.100.80.0/20\n202.100.96.0/21\n202.100.104.0/21\n202.100.112.0/20\n202.100.128.0/21\n202.100.136.0/21\n202.100.144.0/20\n202.100.160.0/21\n202.100.168.0/21\n202.100.176.0/20\n202.100.192.0/21\n202.100.200.0/21\n202.100.208.0/20\n202.100.224.0/19\n202.101.0.0/18\n202.101.64.0/19\n202.101.96.0/19\n202.101.128.0/18\n202.101.192.0/19\n202.101.224.0/21\n202.101.232.0/21\n202.101.240.0/20\n202.102.0.0/19\n202.102.32.0/19\n202.102.64.0/18\n202.102.128.0/21\n202.102.136.0/21\n202.102.144.0/20\n202.102.160.0/19\n202.102.192.0/21\n202.102.200.0/21\n202.102.208.0/20\n202.102.224.0/21\n202.102.232.0/21\n202.102.240.0/20\n202.103.0.0/21\n202.103.8.0/21\n202.103.16.0/20\n202.103.32.0/19\n202.103.64.0/19\n202.103.96.0/21\n202.103.104.0/21\n202.103.112.0/20\n202.103.128.0/18\n202.103.192.0/19\n202.103.224.0/21\n202.103.232.0/21\n202.103.240.0/20\n202.104.0.0/15\n202.106.0.0/16\n202.107.0.0/17\n202.107.128.0/17\n202.108.0.0/16\n202.109.0.0/16\n202.110.0.0/18\n202.110.64.0/18\n202.110.128.0/18\n202.110.192.0/18\n202.111.0.0/17\n202.111.128.0/19\n202.111.160.0/19\n202.111.192.0/18\n202.112.0.0/16\n202.113.0.0/20\n202.113.16.0/20\n202.113.32.0/19\n202.113.64.0/18\n202.113.128.0/18\n202.113.192.0/19\n202.113.224.0/20\n202.113.240.0/20\n202.114.0.0/19\n202.114.32.0/19\n202.114.64.0/18\n202.114.128.0/17\n202.115.0.0/19\n202.115.32.0/19\n202.115.64.0/18\n202.115.128.0/17\n202.116.0.0/19\n202.116.32.0/20\n202.116.48.0/20\n202.116.64.0/19\n202.116.96.0/19\n202.116.128.0/17\n202.117.0.0/18\n202.117.64.0/18\n202.117.128.0/17\n202.118.0.0/19\n202.118.32.0/19\n202.118.64.0/18\n202.118.128.0/17\n202.119.0.0/19\n202.119.32.0/19\n202.119.64.0/20\n202.119.80.0/20\n202.119.96.0/19\n202.119.128.0/17\n202.120.0.0/18\n202.120.64.0/18\n202.120.128.0/17\n202.121.0.0/16\n202.122.0.0/21\n202.122.32.0/21\n202.122.64.0/19\n202.122.112.0/21\n202.122.120.0/21\n202.122.128.0/24\n202.122.132.0/24\n202.123.96.0/20\n202.124.16.0/21\n202.124.24.0/22\n202.125.112.0/20\n202.125.176.0/20\n202.127.0.0/23\n202.127.2.0/24\n202.127.3.0/24\n202.127.4.0/24\n202.127.5.0/24\n202.127.6.0/23\n202.127.12.0/22\n202.127.16.0/20\n202.127.40.0/21\n202.127.48.0/20\n202.127.112.0/20\n202.127.128.0/20\n202.127.144.0/20\n202.127.160.0/21\n202.127.192.0/23\n202.127.194.0/23\n202.127.196.0/22\n202.127.200.0/21\n202.127.208.0/24\n202.127.209.0/24\n202.127.212.0/22\n202.127.216.0/21\n202.127.224.0/19\n202.130.0.0/19\n202.130.224.0/19\n202.131.16.0/21\n202.131.48.0/20\n202.131.208.0/20\n202.133.32.0/20\n202.134.58.0/24\n202.134.128.0/20\n202.136.48.0/20\n202.136.208.0/20\n202.136.224.0/20\n202.137.231.0/24\n202.141.160.0/19\n202.142.16.0/20\n202.143.4.0/22\n202.143.16.0/20\n202.143.32.0/20\n202.143.56.0/21\n202.146.160.0/20\n202.146.188.0/22\n202.146.196.0/22\n202.146.200.0/21\n202.147.144.0/20\n202.148.32.0/20\n202.148.64.0/19\n202.148.96.0/19\n202.149.32.0/19\n202.149.160.0/19\n202.149.224.0/19\n202.150.16.0/20\n202.150.32.0/20\n202.150.56.0/22\n202.150.192.0/20\n202.150.224.0/19\n202.151.0.0/22\n202.151.128.0/19\n202.152.176.0/20\n202.153.0.0/22\n202.153.48.0/20\n202.157.192.0/19\n202.158.160.0/19\n202.160.176.0/20\n202.162.67.0/24\n202.162.75.0/24\n202.164.0.0/20\n202.164.96.0/19\n202.165.96.0/20\n202.165.176.0/20\n202.165.208.0/20\n202.165.239.0/24\n202.165.240.0/23\n202.165.243.0/24\n202.165.245.0/24\n202.165.251.0/24\n202.165.252.0/22\n202.166.224.0/19\n202.168.160.0/20\n202.168.176.0/20\n202.170.128.0/19\n202.170.216.0/21\n202.170.224.0/19\n202.171.216.0/21\n202.171.235.0/24\n202.172.0.0/22\n202.173.0.0/22\n202.173.8.0/21\n202.173.224.0/19\n202.174.64.0/20\n202.176.224.0/19\n202.179.240.0/20\n202.180.128.0/19\n202.180.208.0/21\n202.181.112.0/20\n202.182.32.0/20\n202.182.192.0/19\n202.189.0.0/18\n202.189.80.0/20\n202.189.184.0/21\n202.191.0.0/24\n202.191.68.0/22\n202.191.72.0/21\n202.191.80.0/20\n202.192.0.0/13\n202.200.0.0/14\n202.204.0.0/14\n203.0.4.0/22\n203.0.10.0/23\n203.0.18.0/24\n203.0.24.0/24\n203.0.42.0/23\n203.0.45.0/24\n203.0.46.0/23\n203.0.81.0/24\n203.0.82.0/23\n203.0.90.0/23\n203.0.96.0/23\n203.0.104.0/21\n203.0.114.0/23\n203.0.122.0/24\n203.0.128.0/24\n203.0.130.0/23\n203.0.132.0/22\n203.0.137.0/24\n203.0.142.0/24\n203.0.144.0/24\n203.0.146.0/24\n203.0.148.0/24\n203.0.150.0/23\n203.0.152.0/24\n203.0.177.0/24\n203.0.224.0/24\n203.1.4.0/22\n203.1.18.0/24\n203.1.26.0/23\n203.1.65.0/24\n203.1.66.0/23\n203.1.70.0/23\n203.1.76.0/23\n203.1.90.0/24\n203.1.97.0/24\n203.1.98.0/23\n203.1.100.0/22\n203.1.108.0/24\n203.1.253.0/24\n203.1.254.0/24\n203.2.64.0/21\n203.2.73.0/24\n203.2.112.0/21\n203.2.126.0/23\n203.2.140.0/24\n203.2.150.0/24\n203.2.152.0/22\n203.2.156.0/23\n203.2.160.0/21\n203.2.180.0/23\n203.2.196.0/23\n203.2.209.0/24\n203.2.214.0/23\n203.2.226.0/23\n203.2.229.0/24\n203.2.236.0/23\n203.3.68.0/24\n203.3.72.0/23\n203.3.75.0/24\n203.3.80.0/21\n203.3.96.0/22\n203.3.105.0/24\n203.3.112.0/21\n203.3.120.0/24\n203.3.123.0/24\n203.3.135.0/24\n203.3.139.0/24\n203.3.143.0/24\n203.4.132.0/23\n203.4.134.0/24\n203.4.151.0/24\n203.4.152.0/22\n203.4.174.0/23\n203.4.180.0/24\n203.4.186.0/24\n203.4.205.0/24\n203.4.208.0/22\n203.4.227.0/24\n203.4.230.0/23\n203.5.4.0/23\n203.5.7.0/24\n203.5.8.0/23\n203.5.11.0/24\n203.5.21.0/24\n203.5.22.0/24\n203.5.44.0/24\n203.5.46.0/23\n203.5.52.0/22\n203.5.56.0/23\n203.5.60.0/23\n203.5.114.0/23\n203.5.118.0/24\n203.5.120.0/24\n203.5.172.0/24\n203.5.180.0/23\n203.5.182.0/24\n203.5.185.0/24\n203.5.186.0/24\n203.5.188.0/23\n203.5.190.0/24\n203.5.195.0/24\n203.5.214.0/23\n203.5.218.0/23\n203.6.131.0/24\n203.6.136.0/24\n203.6.138.0/23\n203.6.142.0/24\n203.6.150.0/23\n203.6.157.0/24\n203.6.159.0/24\n203.6.224.0/20\n203.6.248.0/23\n203.7.129.0/24\n203.7.138.0/23\n203.7.147.0/24\n203.7.150.0/23\n203.7.158.0/24\n203.7.192.0/23\n203.7.200.0/24\n203.8.0.0/24\n203.8.8.0/24\n203.8.23.0/24\n203.8.24.0/21\n203.8.70.0/24\n203.8.82.0/24\n203.8.86.0/23\n203.8.91.0/24\n203.8.110.0/23\n203.8.115.0/24\n203.8.166.0/23\n203.8.169.0/24\n203.8.173.0/24\n203.8.184.0/24\n203.8.186.0/23\n203.8.190.0/23\n203.8.192.0/24\n203.8.197.0/24\n203.8.198.0/23\n203.8.203.0/24\n203.8.209.0/24\n203.8.210.0/23\n203.8.212.0/22\n203.8.217.0/24\n203.8.220.0/24\n203.9.32.0/24\n203.9.36.0/23\n203.9.57.0/24\n203.9.63.0/24\n203.9.65.0/24\n203.9.70.0/23\n203.9.72.0/24\n203.9.75.0/24\n203.9.76.0/23\n203.9.96.0/22\n203.9.100.0/23\n203.9.108.0/24\n203.9.158.0/24\n203.10.34.0/24\n203.10.56.0/24\n203.10.74.0/23\n203.10.84.0/22\n203.10.88.0/24\n203.10.95.0/24\n203.10.125.0/24\n203.11.70.0/24\n203.11.76.0/22\n203.11.82.0/24\n203.11.84.0/22\n203.11.100.0/22\n203.11.109.0/24\n203.11.117.0/24\n203.11.122.0/24\n203.11.126.0/24\n203.11.136.0/22\n203.11.141.0/24\n203.11.142.0/23\n203.11.180.0/22\n203.11.208.0/22\n203.12.16.0/24\n203.12.19.0/24\n203.12.24.0/24\n203.12.57.0/24\n203.12.65.0/24\n203.12.66.0/24\n203.12.70.0/23\n203.12.87.0/24\n203.12.88.0/21\n203.12.100.0/23\n203.12.103.0/24\n203.12.114.0/24\n203.12.118.0/24\n203.12.130.0/24\n203.12.137.0/24\n203.12.196.0/22\n203.12.200.0/21\n203.12.211.0/24\n203.12.219.0/24\n203.12.226.0/24\n203.12.240.0/22\n203.13.18.0/24\n203.13.24.0/24\n203.13.44.0/23\n203.13.80.0/21\n203.13.88.0/23\n203.13.92.0/22\n203.13.173.0/24\n203.13.224.0/23\n203.13.227.0/24\n203.13.233.0/24\n203.14.24.0/22\n203.14.33.0/24\n203.14.56.0/24\n203.14.61.0/24\n203.14.62.0/24\n203.14.104.0/24\n203.14.114.0/23\n203.14.118.0/24\n203.14.162.0/24\n203.14.184.0/21\n203.14.192.0/24\n203.14.194.0/23\n203.14.214.0/24\n203.14.231.0/24\n203.14.246.0/24\n203.15.0.0/20\n203.15.20.0/23\n203.15.22.0/24\n203.15.87.0/24\n203.15.88.0/23\n203.15.105.0/24\n203.15.112.0/21\n203.15.130.0/23\n203.15.149.0/24\n203.15.151.0/24\n203.15.156.0/22\n203.15.174.0/24\n203.15.227.0/24\n203.15.232.0/21\n203.15.240.0/23\n203.15.246.0/24\n203.16.10.0/24\n203.16.12.0/23\n203.16.16.0/21\n203.16.27.0/24\n203.16.38.0/24\n203.16.49.0/24\n203.16.50.0/23\n203.16.58.0/24\n203.16.133.0/24\n203.16.161.0/24\n203.16.162.0/24\n203.16.186.0/23\n203.16.228.0/24\n203.16.238.0/24\n203.16.240.0/24\n203.16.245.0/24\n203.17.2.0/24\n203.17.18.0/24\n203.17.28.0/24\n203.17.39.0/24\n203.17.56.0/24\n203.17.74.0/23\n203.17.88.0/23\n203.17.136.0/24\n203.17.164.0/24\n203.17.187.0/24\n203.17.190.0/23\n203.17.231.0/24\n203.17.233.0/24\n203.17.248.0/24\n203.17.255.0/24\n203.18.2.0/23\n203.18.4.0/24\n203.18.7.0/24\n203.18.31.0/24\n203.18.37.0/24\n203.18.48.0/23\n203.18.50.0/24\n203.18.52.0/24\n203.18.72.0/22\n203.18.80.0/23\n203.18.87.0/24\n203.18.100.0/23\n203.18.105.0/24\n203.18.107.0/24\n203.18.110.0/24\n203.18.129.0/24\n203.18.131.0/24\n203.18.132.0/23\n203.18.144.0/24\n203.18.153.0/24\n203.18.199.0/24\n203.18.208.0/24\n203.18.211.0/24\n203.18.215.0/24\n203.19.18.0/24\n203.19.24.0/24\n203.19.30.0/24\n203.19.32.0/21\n203.19.41.0/24\n203.19.44.0/23\n203.19.46.0/24\n203.19.58.0/24\n203.19.60.0/23\n203.19.64.0/24\n203.19.68.0/24\n203.19.72.0/24\n203.19.101.0/24\n203.19.111.0/24\n203.19.131.0/24\n203.19.133.0/24\n203.19.144.0/24\n203.19.149.0/24\n203.19.156.0/24\n203.19.176.0/24\n203.19.178.0/23\n203.19.208.0/24\n203.19.228.0/22\n203.19.233.0/24\n203.19.242.0/24\n203.19.248.0/23\n203.19.255.0/24\n203.20.17.0/24\n203.20.40.0/23\n203.20.48.0/24\n203.20.61.0/24\n203.20.65.0/24\n203.20.84.0/23\n203.20.89.0/24\n203.20.106.0/23\n203.20.115.0/24\n203.20.117.0/24\n203.20.118.0/23\n203.20.122.0/24\n203.20.126.0/23\n203.20.135.0/24\n203.20.136.0/21\n203.20.150.0/24\n203.20.230.0/24\n203.20.232.0/24\n203.20.236.0/24\n203.21.0.0/23\n203.21.2.0/24\n203.21.8.0/24\n203.21.10.0/24\n203.21.18.0/24\n203.21.33.0/24\n203.21.34.0/24\n203.21.41.0/24\n203.21.44.0/24\n203.21.68.0/24\n203.21.82.0/24\n203.21.96.0/22\n203.21.124.0/24\n203.21.136.0/23\n203.21.145.0/24\n203.21.206.0/24\n203.22.24.0/24\n203.22.28.0/23\n203.22.31.0/24\n203.22.68.0/24\n203.22.76.0/24\n203.22.78.0/24\n203.22.84.0/24\n203.22.87.0/24\n203.22.92.0/22\n203.22.99.0/24\n203.22.106.0/24\n203.22.122.0/23\n203.22.131.0/24\n203.22.163.0/24\n203.22.166.0/24\n203.22.170.0/24\n203.22.176.0/21\n203.22.194.0/24\n203.22.242.0/23\n203.22.245.0/24\n203.22.246.0/24\n203.22.252.0/23\n203.23.0.0/24\n203.23.47.0/24\n203.23.61.0/24\n203.23.62.0/23\n203.23.73.0/24\n203.23.85.0/24\n203.23.92.0/22\n203.23.98.0/24\n203.23.107.0/24\n203.23.112.0/24\n203.23.130.0/24\n203.23.140.0/23\n203.23.172.0/24\n203.23.182.0/24\n203.23.186.0/23\n203.23.192.0/24\n203.23.197.0/24\n203.23.198.0/24\n203.23.204.0/22\n203.23.224.0/24\n203.23.226.0/23\n203.23.228.0/22\n203.23.249.0/24\n203.23.251.0/24\n203.24.13.0/24\n203.24.18.0/24\n203.24.27.0/24\n203.24.43.0/24\n203.24.56.0/24\n203.24.58.0/24\n203.24.67.0/24\n203.24.74.0/24\n203.24.79.0/24\n203.24.80.0/23\n203.24.84.0/23\n203.24.86.0/24\n203.24.90.0/24\n203.24.111.0/24\n203.24.112.0/24\n203.24.116.0/24\n203.24.122.0/23\n203.24.145.0/24\n203.24.152.0/23\n203.24.157.0/24\n203.24.161.0/24\n203.24.167.0/24\n203.24.186.0/23\n203.24.199.0/24\n203.24.202.0/24\n203.24.212.0/23\n203.24.217.0/24\n203.24.219.0/24\n203.24.244.0/24\n203.25.19.0/24\n203.25.20.0/23\n203.25.46.0/24\n203.25.48.0/21\n203.25.64.0/23\n203.25.91.0/24\n203.25.99.0/24\n203.25.100.0/24\n203.25.106.0/24\n203.25.131.0/24\n203.25.135.0/24\n203.25.138.0/24\n203.25.147.0/24\n203.25.153.0/24\n203.25.154.0/23\n203.25.164.0/24\n203.25.166.0/24\n203.25.174.0/23\n203.25.180.0/24\n203.25.182.0/24\n203.25.191.0/24\n203.25.199.0/24\n203.25.200.0/24\n203.25.202.0/23\n203.25.208.0/20\n203.25.229.0/24\n203.25.235.0/24\n203.25.236.0/24\n203.25.242.0/24\n203.26.12.0/24\n203.26.34.0/24\n203.26.49.0/24\n203.26.50.0/24\n203.26.55.0/24\n203.26.56.0/23\n203.26.60.0/24\n203.26.65.0/24\n203.26.68.0/24\n203.26.76.0/24\n203.26.80.0/24\n203.26.84.0/24\n203.26.97.0/24\n203.26.102.0/23\n203.26.115.0/24\n203.26.116.0/24\n203.26.129.0/24\n203.26.143.0/24\n203.26.144.0/24\n203.26.148.0/23\n203.26.154.0/24\n203.26.158.0/23\n203.26.170.0/24\n203.26.173.0/24\n203.26.176.0/24\n203.26.185.0/24\n203.26.202.0/23\n203.26.210.0/24\n203.26.214.0/24\n203.26.222.0/24\n203.26.224.0/24\n203.26.228.0/24\n203.26.232.0/24\n203.27.0.0/24\n203.27.10.0/24\n203.27.15.0/24\n203.27.16.0/24\n203.27.20.0/24\n203.27.22.0/23\n203.27.40.0/24\n203.27.45.0/24\n203.27.53.0/24\n203.27.65.0/24\n203.27.66.0/24\n203.27.81.0/24\n203.27.88.0/24\n203.27.102.0/24\n203.27.109.0/24\n203.27.117.0/24\n203.27.121.0/24\n203.27.122.0/23\n203.27.125.0/24\n203.27.200.0/24\n203.27.202.0/24\n203.27.233.0/24\n203.27.241.0/24\n203.27.250.0/24\n203.28.10.0/24\n203.28.12.0/24\n203.28.33.0/24\n203.28.34.0/23\n203.28.43.0/24\n203.28.44.0/24\n203.28.54.0/24\n203.28.56.0/24\n203.28.73.0/24\n203.28.74.0/24\n203.28.76.0/24\n203.28.86.0/24\n203.28.88.0/24\n203.28.112.0/24\n203.28.131.0/24\n203.28.136.0/24\n203.28.140.0/24\n203.28.145.0/24\n203.28.165.0/24\n203.28.169.0/24\n203.28.170.0/24\n203.28.178.0/23\n203.28.185.0/24\n203.28.187.0/24\n203.28.196.0/24\n203.28.226.0/23\n203.28.239.0/24\n203.29.2.0/24\n203.29.8.0/23\n203.29.13.0/24\n203.29.14.0/24\n203.29.28.0/24\n203.29.46.0/24\n203.29.57.0/24\n203.29.61.0/24\n203.29.63.0/24\n203.29.69.0/24\n203.29.73.0/24\n203.29.81.0/24\n203.29.90.0/24\n203.29.95.0/24\n203.29.100.0/24\n203.29.103.0/24\n203.29.112.0/24\n203.29.120.0/22\n203.29.182.0/23\n203.29.187.0/24\n203.29.189.0/24\n203.29.190.0/24\n203.29.205.0/24\n203.29.210.0/24\n203.29.217.0/24\n203.29.227.0/24\n203.29.231.0/24\n203.29.233.0/24\n203.29.234.0/24\n203.29.248.0/24\n203.29.254.0/23\n203.30.16.0/23\n203.30.25.0/24\n203.30.27.0/24\n203.30.29.0/24\n203.30.66.0/24\n203.30.81.0/24\n203.30.87.0/24\n203.30.111.0/24\n203.30.121.0/24\n203.30.123.0/24\n203.30.152.0/24\n203.30.156.0/24\n203.30.162.0/24\n203.30.173.0/24\n203.30.175.0/24\n203.30.187.0/24\n203.30.194.0/24\n203.30.217.0/24\n203.30.220.0/24\n203.30.222.0/24\n203.30.232.0/23\n203.30.235.0/24\n203.30.240.0/23\n203.30.246.0/24\n203.30.250.0/23\n203.31.45.0/24\n203.31.46.0/24\n203.31.49.0/24\n203.31.51.0/24\n203.31.54.0/23\n203.31.69.0/24\n203.31.72.0/24\n203.31.80.0/24\n203.31.85.0/24\n203.31.97.0/24\n203.31.105.0/24\n203.31.106.0/24\n203.31.108.0/23\n203.31.124.0/24\n203.31.162.0/24\n203.31.174.0/24\n203.31.177.0/24\n203.31.181.0/24\n203.31.187.0/24\n203.31.189.0/24\n203.31.204.0/24\n203.31.220.0/24\n203.31.222.0/23\n203.31.225.0/24\n203.31.229.0/24\n203.31.248.0/23\n203.31.253.0/24\n203.32.20.0/24\n203.32.48.0/23\n203.32.56.0/24\n203.32.60.0/24\n203.32.62.0/24\n203.32.68.0/23\n203.32.76.0/24\n203.32.81.0/24\n203.32.84.0/23\n203.32.95.0/24\n203.32.102.0/24\n203.32.105.0/24\n203.32.130.0/24\n203.32.133.0/24\n203.32.140.0/24\n203.32.152.0/24\n203.32.186.0/23\n203.32.192.0/24\n203.32.196.0/24\n203.32.203.0/24\n203.32.204.0/23\n203.32.212.0/24\n203.33.4.0/24\n203.33.7.0/24\n203.33.8.0/21\n203.33.21.0/24\n203.33.26.0/24\n203.33.32.0/24\n203.33.63.0/24\n203.33.64.0/24\n203.33.67.0/24\n203.33.68.0/24\n203.33.73.0/24\n203.33.79.0/24\n203.33.100.0/24\n203.33.122.0/24\n203.33.129.0/24\n203.33.131.0/24\n203.33.145.0/24\n203.33.156.0/24\n203.33.158.0/23\n203.33.174.0/24\n203.33.185.0/24\n203.33.200.0/24\n203.33.202.0/23\n203.33.204.0/24\n203.33.206.0/23\n203.33.214.0/23\n203.33.224.0/23\n203.33.226.0/24\n203.33.233.0/24\n203.33.243.0/24\n203.33.250.0/24\n203.34.4.0/24\n203.34.21.0/24\n203.34.27.0/24\n203.34.39.0/24\n203.34.48.0/23\n203.34.54.0/24\n203.34.56.0/23\n203.34.67.0/24\n203.34.69.0/24\n203.34.76.0/24\n203.34.92.0/24\n203.34.106.0/24\n203.34.113.0/24\n203.34.147.0/24\n203.34.150.0/24\n203.34.152.0/23\n203.34.161.0/24\n203.34.162.0/24\n203.34.187.0/24\n203.34.192.0/21\n203.34.204.0/22\n203.34.232.0/24\n203.34.240.0/24\n203.34.242.0/24\n203.34.245.0/24\n203.34.251.0/24\n203.55.2.0/23\n203.55.4.0/24\n203.55.10.0/24\n203.55.13.0/24\n203.55.22.0/24\n203.55.30.0/24\n203.55.93.0/24\n203.55.101.0/24\n203.55.109.0/24\n203.55.110.0/24\n203.55.116.0/23\n203.55.119.0/24\n203.55.128.0/23\n203.55.146.0/23\n203.55.192.0/24\n203.55.196.0/24\n203.55.218.0/23\n203.55.221.0/24\n203.55.224.0/24\n203.56.1.0/24\n203.56.4.0/24\n203.56.12.0/24\n203.56.24.0/24\n203.56.38.0/24\n203.56.40.0/24\n203.56.46.0/24\n203.56.48.0/21\n203.56.68.0/23\n203.56.82.0/23\n203.56.84.0/23\n203.56.95.0/24\n203.56.110.0/24\n203.56.121.0/24\n203.56.161.0/24\n203.56.169.0/24\n203.56.172.0/23\n203.56.175.0/24\n203.56.183.0/24\n203.56.185.0/24\n203.56.187.0/24\n203.56.192.0/24\n203.56.198.0/24\n203.56.201.0/24\n203.56.208.0/23\n203.56.210.0/24\n203.56.214.0/24\n203.56.216.0/24\n203.56.227.0/24\n203.56.228.0/24\n203.56.232.0/24\n203.56.240.0/24\n203.56.252.0/24\n203.56.254.0/24\n203.57.5.0/24\n203.57.6.0/24\n203.57.12.0/23\n203.57.28.0/24\n203.57.39.0/24\n203.57.46.0/24\n203.57.58.0/24\n203.57.61.0/24\n203.57.66.0/24\n203.57.69.0/24\n203.57.70.0/23\n203.57.73.0/24\n203.57.90.0/24\n203.57.101.0/24\n203.57.109.0/24\n203.57.123.0/24\n203.57.157.0/24\n203.57.200.0/24\n203.57.202.0/24\n203.57.206.0/24\n203.57.222.0/24\n203.57.224.0/20\n203.57.246.0/23\n203.57.249.0/24\n203.57.253.0/24\n203.57.254.0/23\n203.62.2.0/24\n203.62.131.0/24\n203.62.139.0/24\n203.62.161.0/24\n203.62.197.0/24\n203.62.228.0/22\n203.62.234.0/24\n203.62.246.0/24\n203.76.160.0/22\n203.76.168.0/22\n203.77.180.0/22\n203.78.48.0/20\n203.79.0.0/20\n203.79.32.0/20\n203.80.4.0/23\n203.80.32.0/20\n203.80.57.0/24\n203.80.132.0/22\n203.80.136.0/21\n203.80.144.0/20\n203.81.0.0/21\n203.81.16.0/20\n203.82.0.0/23\n203.82.16.0/21\n203.83.0.0/22\n203.83.56.0/21\n203.83.224.0/20\n203.86.0.0/19\n203.86.32.0/19\n203.86.64.0/20\n203.86.80.0/20\n203.86.96.0/19\n203.86.254.0/23\n203.88.32.0/19\n203.88.192.0/19\n203.89.0.0/22\n203.89.8.0/21\n203.89.136.0/22\n203.90.0.0/22\n203.90.8.0/22\n203.90.128.0/19\n203.90.160.0/19\n203.90.192.0/19\n203.91.32.0/19\n203.91.96.0/20\n203.91.120.0/21\n203.92.0.0/22\n203.92.160.0/19\n203.93.0.0/22\n203.93.4.0/22\n203.93.8.0/24\n203.93.9.0/24\n203.93.10.0/23\n203.93.12.0/22\n203.93.16.0/20\n203.93.32.0/19\n203.93.64.0/18\n203.93.128.0/21\n203.93.136.0/22\n203.93.140.0/24\n203.93.141.0/24\n203.93.142.0/23\n203.93.144.0/20\n203.93.160.0/19\n203.93.192.0/18\n203.94.0.0/22\n203.94.4.0/22\n203.94.8.0/21\n203.94.16.0/20\n203.95.0.0/21\n203.95.96.0/20\n203.95.112.0/20\n203.95.128.0/18\n203.95.224.0/19\n203.99.8.0/21\n203.99.16.0/20\n203.99.80.0/20\n203.100.32.0/20\n203.100.48.0/21\n203.100.63.0/24\n203.100.80.0/20\n203.100.96.0/19\n203.100.192.0/20\n203.104.32.0/20\n203.105.96.0/19\n203.105.128.0/19\n203.107.0.0/17\n203.110.160.0/19\n203.110.208.0/20\n203.110.232.0/23\n203.110.234.0/24\n203.114.244.0/22\n203.118.192.0/19\n203.118.241.0/24\n203.118.248.0/22\n203.119.24.0/21\n203.119.32.0/22\n203.119.80.0/22\n203.119.85.0/24\n203.119.113.0/24\n203.119.114.0/23\n203.119.116.0/22\n203.119.120.0/21\n203.119.128.0/17\n203.128.32.0/19\n203.128.96.0/19\n203.128.224.0/21\n203.129.8.0/21\n203.130.32.0/19\n203.132.32.0/19\n203.134.240.0/21\n203.135.96.0/20\n203.135.112.0/20\n203.135.160.0/20\n203.142.224.0/19\n203.144.96.0/19\n203.145.0.0/19\n203.148.0.0/18\n203.148.64.0/20\n203.148.80.0/22\n203.148.86.0/23\n203.149.92.0/22\n203.152.64.0/19\n203.152.128.0/19\n203.153.0.0/22\n203.156.192.0/18\n203.158.16.0/21\n203.160.104.0/21\n203.160.129.0/24\n203.160.192.0/19\n203.161.0.0/22\n203.161.180.0/24\n203.161.192.0/19\n203.166.160.0/19\n203.168.0.0/19\n203.170.58.0/23\n203.171.0.0/22\n203.171.224.0/20\n203.174.4.0/24\n203.174.7.0/24\n203.174.96.0/19\n203.175.128.0/19\n203.175.192.0/18\n203.176.0.0/18\n203.176.64.0/19\n203.176.168.0/21\n203.184.80.0/20\n203.187.160.0/19\n203.189.0.0/23\n203.189.6.0/23\n203.189.112.0/22\n203.189.192.0/19\n203.190.96.0/20\n203.190.249.0/24\n203.191.0.0/23\n203.191.16.0/20\n203.191.64.0/18\n203.191.144.0/21\n203.191.152.0/21\n203.192.0.0/19\n203.193.224.0/19\n203.194.120.0/21\n203.195.64.0/19\n203.195.112.0/21\n203.195.128.0/17\n203.196.0.0/21\n203.196.8.0/21\n203.202.236.0/22\n203.205.64.0/19\n203.205.128.0/17\n203.207.64.0/18\n203.207.128.0/17\n203.208.0.0/20\n203.208.16.0/22\n203.208.32.0/19\n203.209.224.0/19\n203.212.0.0/20\n203.212.80.0/20\n203.215.232.0/21\n203.222.192.0/20\n203.223.0.0/20\n203.223.16.0/21\n210.2.0.0/20\n210.2.16.0/20\n210.5.0.0/19\n210.5.56.0/21\n210.5.128.0/20\n210.5.144.0/20\n210.12.0.0/18\n210.12.64.0/18\n210.12.128.0/18\n210.12.192.0/18\n210.13.0.0/18\n210.13.64.0/18\n210.13.128.0/17\n210.14.64.0/19\n210.14.112.0/20\n210.14.128.0/19\n210.14.160.0/19\n210.14.192.0/19\n210.14.224.0/19\n210.15.0.0/19\n210.15.32.0/19\n210.15.64.0/19\n210.15.96.0/19\n210.15.128.0/18\n210.16.128.0/18\n210.21.0.0/17\n210.21.128.0/17\n210.22.0.0/16\n210.23.32.0/19\n210.25.0.0/16\n210.26.0.0/15\n210.28.0.0/14\n210.32.0.0/14\n210.36.0.0/14\n210.40.0.0/13\n210.48.136.0/21\n210.51.0.0/16\n210.52.0.0/18\n210.52.64.0/18\n210.52.128.0/17\n210.53.0.0/17\n210.53.128.0/17\n210.56.192.0/19\n210.72.0.0/17\n210.72.128.0/19\n210.72.160.0/19\n210.72.192.0/18\n210.73.0.0/19\n210.73.32.0/19\n210.73.64.0/18\n210.73.128.0/17\n210.74.0.0/19\n210.74.32.0/19\n210.74.64.0/19\n210.74.96.0/19\n210.74.128.0/19\n210.74.160.0/19\n210.74.192.0/18\n210.75.0.0/16\n210.76.0.0/19\n210.76.32.0/19\n210.76.64.0/18\n210.76.128.0/17\n210.77.0.0/16\n210.78.0.0/19\n210.78.32.0/19\n210.78.64.0/18\n210.78.128.0/19\n210.78.160.0/19\n210.78.192.0/18\n210.79.64.0/18\n210.79.224.0/19\n210.82.0.0/15\n210.87.128.0/20\n210.87.144.0/20\n210.87.160.0/19\n210.185.192.0/18\n210.192.96.0/19\n211.64.0.0/14\n211.68.0.0/15\n211.70.0.0/15\n211.80.0.0/16\n211.81.0.0/16\n211.82.0.0/16\n211.83.0.0/16\n211.84.0.0/15\n211.86.0.0/15\n211.88.0.0/16\n211.89.0.0/16\n211.90.0.0/15\n211.92.0.0/15\n211.94.0.0/15\n211.96.0.0/15\n211.98.0.0/16\n211.99.0.0/18\n211.99.64.0/19\n211.99.96.0/19\n211.99.128.0/17\n211.100.0.0/16\n211.101.0.0/18\n211.101.64.0/18\n211.101.128.0/17\n211.102.0.0/16\n211.103.0.0/17\n211.103.128.0/17\n211.136.0.0/14\n211.140.0.0/15\n211.142.0.0/17\n211.142.128.0/17\n211.143.0.0/16\n211.144.0.0/15\n211.146.0.0/16\n211.147.0.0/16\n211.148.0.0/14\n211.152.0.0/15\n211.154.0.0/16\n211.155.0.0/18\n211.155.64.0/19\n211.155.96.0/19\n211.155.128.0/17\n211.156.0.0/14\n211.160.0.0/14\n211.164.0.0/14\n218.0.0.0/16\n218.1.0.0/16\n218.2.0.0/15\n218.4.0.0/15\n218.6.0.0/16\n218.7.0.0/16\n218.8.0.0/15\n218.10.0.0/16\n218.11.0.0/16\n218.12.0.0/16\n218.13.0.0/16\n218.14.0.0/15\n218.16.0.0/14\n218.20.0.0/16\n218.21.0.0/17\n218.21.128.0/17\n218.22.0.0/15\n218.24.0.0/15\n218.26.0.0/16\n218.27.0.0/16\n218.28.0.0/15\n218.30.0.0/15\n218.56.0.0/14\n218.60.0.0/15\n218.62.0.0/17\n218.62.128.0/17\n218.63.0.0/16\n218.64.0.0/15\n218.66.0.0/16\n218.67.0.0/17\n218.67.128.0/17\n218.68.0.0/15\n218.70.0.0/15\n218.72.0.0/14\n218.76.0.0/15\n218.78.0.0/15\n218.80.0.0/14\n218.84.0.0/14\n218.88.0.0/13\n218.96.0.0/15\n218.98.0.0/17\n218.98.128.0/18\n218.98.192.0/19\n218.98.224.0/19\n218.99.0.0/16\n218.100.88.0/21\n218.100.96.0/19\n218.100.128.0/17\n218.104.0.0/17\n218.104.128.0/19\n218.104.160.0/19\n218.104.192.0/21\n218.104.200.0/21\n218.104.208.0/20\n218.104.224.0/19\n218.105.0.0/16\n218.106.0.0/15\n218.108.0.0/16\n218.109.0.0/16\n218.185.192.0/19\n218.185.240.0/21\n218.192.0.0/16\n218.193.0.0/16\n218.194.0.0/16\n218.195.0.0/16\n218.196.0.0/14\n218.200.0.0/14\n218.204.0.0/15\n218.206.0.0/15\n218.240.0.0/14\n218.244.0.0/15\n218.246.0.0/15\n218.249.0.0/16\n219.72.0.0/16\n219.82.0.0/16\n219.83.128.0/17\n219.128.0.0/12\n219.144.0.0/14\n219.148.0.0/16\n219.149.0.0/17\n219.149.128.0/18\n219.149.192.0/18\n219.150.0.0/19\n219.150.32.0/19\n219.150.64.0/19\n219.150.96.0/20\n219.150.112.0/20\n219.150.128.0/17\n219.151.0.0/19\n219.151.32.0/19\n219.151.64.0/18\n219.151.128.0/17\n219.152.0.0/15\n219.154.0.0/15\n219.156.0.0/15\n219.158.0.0/17\n219.158.128.0/17\n219.159.0.0/18\n219.159.64.0/18\n219.159.128.0/17\n219.216.0.0/15\n219.218.0.0/15\n219.220.0.0/16\n219.221.0.0/16\n219.222.0.0/15\n219.224.0.0/15\n219.226.0.0/16\n219.227.0.0/16\n219.228.0.0/15\n219.230.0.0/15\n219.232.0.0/14\n219.236.0.0/15\n219.238.0.0/15\n219.242.0.0/15\n219.244.0.0/14\n220.101.192.0/18\n220.112.0.0/14\n220.152.128.0/17\n220.154.0.0/15\n220.160.0.0/11\n220.192.0.0/15\n220.194.0.0/15\n220.196.0.0/14\n220.200.0.0/13\n220.231.0.0/18\n220.231.128.0/17\n220.232.64.0/18\n220.234.0.0/16\n220.242.0.0/15\n220.247.136.0/21\n220.248.0.0/14\n220.252.0.0/16\n221.0.0.0/15\n221.2.0.0/16\n221.3.0.0/17\n221.3.128.0/17\n221.4.0.0/16\n221.5.0.0/17\n221.5.128.0/17\n221.6.0.0/16\n221.7.0.0/19\n221.7.32.0/19\n221.7.64.0/19\n221.7.96.0/19\n221.7.128.0/17\n221.8.0.0/15\n221.10.0.0/16\n221.11.0.0/17\n221.11.128.0/18\n221.11.192.0/19\n221.11.224.0/19\n221.12.0.0/17\n221.12.128.0/18\n221.13.0.0/18\n221.13.64.0/19\n221.13.96.0/19\n221.13.128.0/17\n221.14.0.0/15\n221.122.0.0/15\n221.128.128.0/17\n221.129.0.0/16\n221.130.0.0/15\n221.133.224.0/19\n221.136.0.0/16\n221.137.0.0/16\n221.172.0.0/14\n221.176.0.0/13\n221.192.0.0/15\n221.194.0.0/16\n221.195.0.0/16\n221.196.0.0/15\n221.198.0.0/16\n221.199.0.0/19\n221.199.32.0/20\n221.199.48.0/20\n221.199.64.0/18\n221.199.128.0/18\n221.199.192.0/20\n221.199.224.0/19\n221.200.0.0/14\n221.204.0.0/15\n221.206.0.0/16\n221.207.0.0/18\n221.207.64.0/18\n221.207.128.0/17\n221.208.0.0/14\n221.212.0.0/16\n221.213.0.0/16\n221.214.0.0/15\n221.216.0.0/13\n221.224.0.0/13\n221.232.0.0/14\n221.236.0.0/15\n221.238.0.0/16\n221.239.0.0/17\n221.239.128.0/17\n222.16.0.0/15\n222.18.0.0/15\n222.20.0.0/15\n222.22.0.0/16\n222.23.0.0/16\n222.24.0.0/15\n222.26.0.0/15\n222.28.0.0/14\n222.32.0.0/11\n222.64.0.0/13\n222.72.0.0/15\n222.74.0.0/16\n222.75.0.0/16\n222.76.0.0/14\n222.80.0.0/15\n222.82.0.0/16\n222.83.0.0/17\n222.83.128.0/17\n222.84.0.0/16\n222.85.0.0/17\n222.85.128.0/17\n222.86.0.0/15\n222.88.0.0/15\n222.90.0.0/15\n222.92.0.0/14\n222.125.0.0/16\n222.126.128.0/17\n222.128.0.0/14\n222.132.0.0/14\n222.136.0.0/13\n222.160.0.0/15\n222.162.0.0/16\n222.163.0.0/19\n222.163.32.0/19\n222.163.64.0/18\n222.163.128.0/17\n222.168.0.0/15\n222.170.0.0/15\n222.172.0.0/17\n222.172.128.0/17\n222.173.0.0/16\n222.174.0.0/15\n222.176.0.0/13\n222.184.0.0/13\n222.192.0.0/14\n222.196.0.0/15\n222.198.0.0/16\n222.199.0.0/16\n222.200.0.0/14\n222.204.0.0/15\n222.206.0.0/15\n222.208.0.0/13\n222.216.0.0/15\n222.218.0.0/16\n222.219.0.0/16\n222.220.0.0/15\n222.222.0.0/15\n222.240.0.0/13\n222.248.0.0/16\n222.249.0.0/17\n222.249.128.0/19\n222.249.160.0/20\n222.249.176.0/20\n222.249.192.0/18\n223.0.0.0/15\n223.2.0.0/15\n223.4.0.0/14\n223.8.0.0/13\n223.20.0.0/15\n223.27.184.0/22\n223.64.0.0/11\n223.96.0.0/12\n223.112.0.0/14\n223.116.0.0/15\n223.120.0.0/13\n223.128.0.0/15\n223.144.0.0/12\n223.160.0.0/14\n223.166.0.0/15\n223.192.0.0/15\n223.198.0.0/15\n223.201.0.0/16\n223.202.0.0/15\n223.208.0.0/14\n223.212.0.0/15\n223.214.0.0/15\n223.220.0.0/15\n223.223.176.0/20\n223.223.192.0/20\n223.240.0.0/13\n223.248.0.0/14\n223.252.128.0/17\n223.254.0.0/16\n223.255.0.0/17\n223.255.236.0/22\n223.255.252.0/23\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/acl/gfwlist.acl",
    "content": "# gfw list rules for shadowsocks-libev $\n# updated on 2016-09-08 12:09:55$\n[bypass_all]\n\n[proxy_list]\n# Telegram IPs$\n91.108.4.0/22\n91.108.56.0/22\n109.239.140.0/24\n149.154.160.0/20\n^(.*\\.)?4tern\\.com$\n^(.*\\.)?adorama\\.com$\n^(.*\\.)?akiba-web\\.com$\n^(.*\\.)?alien-ufos\\.com$\n^(.*\\.)?altrec\\.com$\n^(.*\\.)?arena\\.taipei$\n^(.*\\.)?asianspiss\\.com$\n^(.*\\.)?athenaeizou\\.com$\n^(.*\\.)?barracuda\\.com$\n^(.*\\.)?beeg\\.com$\n^(.*\\.)?bloombergview\\.com$\n^(.*\\.)?boysmaster\\.com$\n^(.*\\.)?carfax\\.com$\n^(.*\\.)?casinobellini\\.com$\n^(.*\\.)?centauro\\.com\\.br$\n^(.*\\.)?crossfire\\.co\\.kr$\n^(.*\\.)?darpa\\.mil$\n^(.*\\.)?dish\\.com$\n^(.*\\.)?dm530\\.net$\n^(.*\\.)?eesti\\.ee$\n^(.*\\.)?expekt\\.com$\n^(.*\\.)?extmatrix\\.com$\n^(.*\\.)?fakku\\.net$\n^(.*\\.)?filesor\\.com$\n^(.*\\.)?financetwitter\\.com$\n^(.*\\.)?findmima\\.com$\n^(.*\\.)?flipboard\\.com$\n^(.*\\.)?flitto\\.com$\n^(.*\\.)?fxnetworks\\.com$\n^(.*\\.)?gettyimages\\.com$\n^(.*\\.)?getuploader\\.com$\n^(.*\\.)?github\\.com$\n^(.*\\.)?glype\\.com$\n^(.*\\.)?go141\\.com$\n^(.*\\.)?hautelook\\.com$\n^(.*\\.)?hautelookcdn\\.com$\n^(.*\\.)?hmvdigital\\.ca$\n^(.*\\.)?hmvdigital\\.com$\n^(.*\\.)?homedepot\\.com$\n^(.*\\.)?hoovers\\.com$\n^(.*\\.)?hulu\\.com$\n^(.*\\.)?huluim\\.com$\n^(.*\\.)?secure\\.hustler\\.com$\n^(.*\\.)?hustlercash\\.com$\n^(.*\\.)?www\\.hustlercash\\.com$\n^(.*\\.)?hybrid-analysis\\.com$\n^(.*\\.)?ilovelongtoes\\.com$\n^(.*\\.)?imgmega\\.com$\n^(.*\\.)?imgur\\.com$\n^(.*\\.)?javhub\\.net$\n^(.*\\.)?javhuge\\.com$\n^(.*\\.)?javlibrary\\.com$\n^(.*\\.)?jcpenney\\.com$\n^(.*\\.)?juliepost\\.com$\n^(.*\\.)?khatrimaza\\.org$\n^(.*\\.)?leisurepro\\.com$\n^(.*\\.)?longtoes\\.com$\n^(.*\\.)?lovetvshow\\.com$\n^(.*\\.)?macgamestore\\.com$\n^(.*\\.)?madonna-av\\.com$\n^(.*\\.)?mangafox\\.com$\n^(.*\\.)?mangafox\\.me$\n^(.*\\.)?matome-plus\\.com$\n^(.*\\.)?matome-plus\\.net$\n^(.*\\.)?mattwilcox\\.net$\n^(.*\\.)?metarthunter\\.com$\n^(.*\\.)?mfxmedia\\.com$\n^(.*\\.)?monster\\.com$\n^(.*\\.)?moodyz\\.com$\n^(.*\\.)?nationwide\\.com$\n^(.*\\.)?www\\.nbc\\.com$\n^(.*\\.)?netflix\\.com$\n^(.*\\.)?mo\\.nightlife141\\.com$\n^(.*\\.)?nordstrom\\.com$\n^(.*\\.)?nordstromimage\\.com$\n^(.*\\.)?nordstromrack\\.com$\n^(.*\\.)?nottinghampost\\.com$\n^(.*\\.)?ntdtv\\.cz$\n^(.*\\.)?nusatrip\\.com$\n^(.*\\.)?nuuvem\\.com$\n^(.*\\.)?ontrac\\.com$\n^(.*\\.)?pandora\\.com$\n^(.*\\.)?parkansky\\.com$\n^(.*\\.)?pure18\\.com$\n^(.*\\.)?qq\\.co\\.za$\n^(.*\\.)?r18\\.com$\n^(.*\\.)?rd\\.com$\n^(.*\\.)?rdio\\.com$\n^(.*\\.)?sadistic-v\\.com$\n^(.*\\.)?search\\.xxx$\n^(.*\\.)?shutterstock\\.com$\n^(.*\\.)?slacker\\.com$\n^(.*\\.)?spotify\\.com$\n^(.*\\.)?springboardplatform\\.com$\n^(.*\\.)?sprite\\.org$\n^(.*\\.)?superpages\\.com$\n^(.*\\.)?swagbucks\\.com$\n^(.*\\.)?tapanwap\\.com$\n^(.*\\.)?target\\.com$\n^(.*\\.)?turntable\\.fm$\n^(.*\\.)?twerkingbutt\\.com$\n^(.*\\.)?vegasred\\.com$\n^(.*\\.)?vevo\\.com$\n^(.*\\.)?ecsm\\.vs\\.com$\n^(.*\\.)?wanz-factory\\.com$\n^(.*\\.)?wheretowatch\\.com$\n^(.*\\.)?wingamestore\\.com$\n^(.*\\.)?wizcrafts\\.net$\n^(.*\\.)?xfinity\\.com$\n^(.*\\.)?zattoo\\.com$\n^(.*\\.)?zozotown\\.com$\n^(.*\\.)?xn--4gq171p\\.com$\n^(.*\\.)?xn--p8j9a0d9c9a\\.xn--q9jyb4c$\n^(.*\\.)?china-mmm\\.jp\\.net$\n^(.*\\.)?lsxszzg\\.com$\n^(.*\\.)?china-mmm\\.net$\n^(.*\\.)?china-mmm\\.sa\\.com$\n^(.*\\.)?s3-ap-northeast-1\\.amazonaws\\.com$\n^(.*\\.)?avmo\\.pw$\n^(.*\\.)?avmoo\\.com$\n^(.*\\.)?avmoo\\.net$\n^(.*\\.)?avmoo\\.pw$\n^(.*\\.)?javmoo\\.xyz$\n^(.*\\.)?javtag\\.com$\n^(.*\\.)?javzoo\\.com$\n^(.*\\.)?1dumb\\.com$\n^(.*\\.)?25u\\.com$\n^(.*\\.)?2waky\\.com$\n^(.*\\.)?3-a\\.net$\n^(.*\\.)?4dq\\.com$\n^(.*\\.)?4mydomain\\.com$\n^(.*\\.)?4pu\\.com$\n^(.*\\.)?acmetoy\\.com$\n^(.*\\.)?almostmy\\.com$\n^(.*\\.)?americanunfinished\\.com$\n^(.*\\.)?authorizeddns\\.net$\n^(.*\\.)?authorizeddns\\.org$\n^(.*\\.)?authorizeddns\\.us$\n^(.*\\.)?bigmoney\\.biz$\n^(.*\\.)?changeip\\.name$\n^(.*\\.)?changeip\\.net$\n^(.*\\.)?changeip\\.org$\n^(.*\\.)?cleansite\\.biz$\n^(.*\\.)?cleansite\\.info$\n^(.*\\.)?cleansite\\.us$\n^(.*\\.)?compress\\.to$\n^(.*\\.)?ddns\\.info$\n^(.*\\.)?ddns\\.mobi$\n^(.*\\.)?ddns\\.ms$\n^(.*\\.)?ddns\\.name$\n^(.*\\.)?ddns\\.us$\n^(.*\\.)?dhcp\\.biz$\n^(.*\\.)?dns-dns\\.com$\n^(.*\\.)?dns-stuff\\.com$\n^(.*\\.)?dns04\\.com$\n^(.*\\.)?dns05\\.com$\n^(.*\\.)?dns1\\.us$\n^(.*\\.)?dns2\\.us$\n^(.*\\.)?dnset\\.com$\n^(.*\\.)?dnsrd\\.com$\n^(.*\\.)?dsmtp\\.com$\n^(.*\\.)?dumb1\\.com$\n^(.*\\.)?dynamic-dns\\.net$\n^(.*\\.)?dynamicdns\\.biz$\n^(.*\\.)?dyndns\\.pro$\n^(.*\\.)?dynssl\\.com$\n^(.*\\.)?edns\\.biz$\n^(.*\\.)?epac\\.to$\n^(.*\\.)?esmtp\\.biz$\n^(.*\\.)?ezua\\.com$\n^(.*\\.)?faqserv\\.com$\n^(.*\\.)?fartit\\.com$\n^(.*\\.)?freeddns\\.com$\n^(.*\\.)?freetcp\\.com$\n^(.*\\.)?freewww\\.biz$\n^(.*\\.)?freewww\\.info$\n^(.*\\.)?ftp1\\.biz$\n^(.*\\.)?ftpserver\\.biz$\n^(.*\\.)?gettrials\\.com$\n^(.*\\.)?got-game\\.org$\n^(.*\\.)?gr8domain\\.biz$\n^(.*\\.)?gr8name\\.biz$\n^(.*\\.)?https443\\.net$\n^(.*\\.)?https443\\.org$\n^(.*\\.)?ikwb\\.com$\n^(.*\\.)?instanthq\\.com$\n^(.*\\.)?iownyour\\.biz$\n^(.*\\.)?iownyour\\.org$\n^(.*\\.)?isasecret\\.com$\n^(.*\\.)?itemdb\\.com$\n^(.*\\.)?itsaol\\.com$\n^(.*\\.)?jetos\\.com$\n^(.*\\.)?jkub\\.com$\n^(.*\\.)?jungleheart\\.com$\n^(.*\\.)?justdied\\.com$\n^(.*\\.)?lflink\\.com$\n^(.*\\.)?lflinkup\\.com$\n^(.*\\.)?lflinkup\\.net$\n^(.*\\.)?lflinkup\\.org$\n^(.*\\.)?longmusic\\.com$\n^(.*\\.)?mefound\\.com$\n^(.*\\.)?moneyhome\\.biz$\n^(.*\\.)?mrbasic\\.com$\n^(.*\\.)?mrbonus\\.com$\n^(.*\\.)?mrface\\.com$\n^(.*\\.)?mrslove\\.com$\n^(.*\\.)?my03\\.com$\n^(.*\\.)?mydad\\.info$\n^(.*\\.)?myddns\\.com$\n^(.*\\.)?myftp\\.info$\n^(.*\\.)?myftp\\.name$\n^(.*\\.)?mylftv\\.com$\n^(.*\\.)?mymom\\.info$\n^(.*\\.)?mynetav\\.net$\n^(.*\\.)?mynetav\\.org$\n^(.*\\.)?mynumber\\.org$\n^(.*\\.)?mypicture\\.info$\n^(.*\\.)?mypop3\\.net$\n^(.*\\.)?mypop3\\.org$\n^(.*\\.)?mysecondarydns\\.com$\n^(.*\\.)?mywww\\.biz$\n^(.*\\.)?myz\\.info$\n^(.*\\.)?ninth\\.biz$\n^(.*\\.)?ns01\\.biz$\n^(.*\\.)?ns01\\.info$\n^(.*\\.)?ns01\\.us$\n^(.*\\.)?ns02\\.biz$\n^(.*\\.)?ns02\\.info$\n^(.*\\.)?ns02\\.us$\n^(.*\\.)?ns1\\.name$\n^(.*\\.)?ns2\\.name$\n^(.*\\.)?ns3\\.name$\n^(.*\\.)?ocry\\.com$\n^(.*\\.)?onedumb\\.com$\n^(.*\\.)?onmypc\\.biz$\n^(.*\\.)?onmypc\\.info$\n^(.*\\.)?onmypc\\.net$\n^(.*\\.)?onmypc\\.org$\n^(.*\\.)?onmypc\\.us$\n^(.*\\.)?organiccrap\\.com$\n^(.*\\.)?otzo\\.com$\n^(.*\\.)?ourhobby\\.com$\n^(.*\\.)?pcanywhere\\.net$\n^(.*\\.)?port25\\.biz$\n^(.*\\.)?qhigh\\.com$\n^(.*\\.)?qpoe\\.com$\n^(.*\\.)?rebatesrule\\.net$\n^(.*\\.)?sellclassics\\.com$\n^(.*\\.)?sendsmtp\\.com$\n^(.*\\.)?serveuser\\.com$\n^(.*\\.)?serveusers\\.com$\n^(.*\\.)?sixth\\.biz$\n^(.*\\.)?squirly\\.info$\n^(.*\\.)?ssl443\\.org$\n^(.*\\.)?toh\\.info$\n^(.*\\.)?toythieves\\.com$\n^(.*\\.)?trickip\\.net$\n^(.*\\.)?trickip\\.org$\n^(.*\\.)?vizvaz\\.com$\n^(.*\\.)?wha\\.la$\n^(.*\\.)?wikaba\\.com$\n^(.*\\.)?www1\\.biz$\n^(.*\\.)?wwwhost\\.biz$\n^(.*\\.)?x24hr\\.com$\n^(.*\\.)?xxuz\\.com$\n^(.*\\.)?xxxy\\.biz$\n^(.*\\.)?xxxy\\.info$\n^(.*\\.)?ygto\\.com$\n^(.*\\.)?youdontcare\\.com$\n^(.*\\.)?yourtrap\\.com$\n^(.*\\.)?zyns\\.com$\n^(.*\\.)?zzux\\.com$\n^(.*\\.)?d3rhr7kgmtrq1v\\.cloudfront\\.net$\n^(.*\\.)?3d-game\\.com$\n^(.*\\.)?4irc\\.com$\n^(.*\\.)?b0ne\\.com$\n^(.*\\.)?chatnook\\.com$\n^(.*\\.)?darktech\\.org$\n^(.*\\.)?deaftone\\.com$\n^(.*\\.)?dtdns\\.net$\n^(.*\\.)?effers\\.com$\n^(.*\\.)?etowns\\.net$\n^(.*\\.)?etowns\\.org$\n^(.*\\.)?flnet\\.org$\n^(.*\\.)?gotgeeks\\.com$\n^(.*\\.)?scieron\\.com$\n^(.*\\.)?slyip\\.com$\n^(.*\\.)?slyip\\.net$\n^(.*\\.)?suroot\\.com$\n^(.*\\.)?facebook\\.br$\n^(.*\\.)?facebook\\.com$\n^(.*\\.)?connect\\.facebook\\.net$\n^(.*\\.)?facebook\\.hu$\n^(.*\\.)?facebook\\.nl$\n^(.*\\.)?facebook\\.se$\n^(.*\\.)?fb\\.com$\n^(.*\\.)?fb\\.me$\n^(.*\\.)?m\\.me$\n^(.*\\.)?messenger\\.com$\n^(.*\\.)?oculus\\.com$\n^(.*\\.)?1e100\\.net$\n^(.*\\.)?abc\\.xyz$\n^(.*\\.)?admob\\.com$\n^(.*\\.)?agoogleaday\\.com$\n^(.*\\.)?ampproject\\.org$\n^(.*\\.)?android\\.com$\n^(.*\\.)?androidify\\.com$\n^(.*\\.)?appspot\\.com$\n^(.*\\.)?blogspot\\.com$\n^(.*\\.)?certificate-transparency\\.org$\n^(.*\\.)?chrome\\.com$\n^(.*\\.)?chromecast\\.com$\n^(.*\\.)?chromeexperiments\\.com$\n^(.*\\.)?chromercise\\.com$\n^(.*\\.)?chromestatus\\.com$\n^(.*\\.)?chromium\\.org$\n^(.*\\.)?com\\.google$\n^(.*\\.)?data-vocabulary\\.org$\n^(.*\\.)?deepmind\\.com$\n^(.*\\.)?deja\\.com$\n^(.*\\.)?digisfera\\.com$\n^(.*\\.)?domains\\.google$\n^(.*\\.)?feedburner\\.com$\n^(.*\\.)?g\\.co$\n^(.*\\.)?gcr\\.io$\n^(.*\\.)?get\\.how$\n^(.*\\.)?getmdl\\.io$\n^(.*\\.)?ggpht\\.com$\n^(.*\\.)?gmail\\.com$\n^(.*\\.)?gmodules\\.com$\n^(.*\\.)?goo\\.gl$\n^(.*\\.)?google(\\.[^.]{2,4}){1,2}$\n^(.*\\.)?googleapis(\\.[^.]{2,4}){1,2}$\n^(.*\\.)?googleapps\\.com$\n^(.*\\.)?googleartproject\\.com$\n^(.*\\.)?googleblog\\.com$\n^(.*\\.)?googlebot\\.com$\n^(.*\\.)?googlecode\\.com$\n^(.*\\.)?googlecommerce\\.com$\n^(.*\\.)?googledomains\\.com$\n^(.*\\.)?googleearth\\.com$\n^(.*\\.)?googledrive\\.com$\n^(.*\\.)?googlegroups\\.com$\n^(.*\\.)?googlehosted\\.com$\n^(.*\\.)?googleideas\\.com$\n^(.*\\.)?googlelabs\\.com$\n^(.*\\.)?googlemail\\.com$\n^(.*\\.)?googleplay\\.com$\n^(.*\\.)?googleplus\\.com$\n^(.*\\.)?googlesource\\.com$\n^(.*\\.)?googleusercontent\\.com$\n^(.*\\.)?googlevideo\\.com$\n^(.*\\.)?googlezip\\.net$\n^(.*\\.)?gvt0\\.com$\n^(.*\\.)?gvt1\\.com$\n^(.*\\.)?gvt3\\.com$\n^(.*\\.)?html5rocks\\.com$\n^(.*\\.)?iam\\.soy$\n^(.*\\.)?igoogle\\.com$\n^(.*\\.)?itasoftware\\.com$\n^(.*\\.)?like\\.com$\n^(.*\\.)?nic\\.google$\n^(.*\\.)?on2\\.com$\n^(.*\\.)?panoramio\\.com$\n^(.*\\.)?picasaweb\\.com$\n^(.*\\.)?polymer-project\\.org$\n^(.*\\.)?questvisual\\.com$\n^(.*\\.)?recaptcha\\.net$\n^(.*\\.)?redhotlabs\\.com$\n^(.*\\.)?registry\\.google$\n^(.*\\.)?schema\\.org$\n^(.*\\.)?sipml5\\.org$\n^(.*\\.)?stories\\.google$\n^(.*\\.)?synergyse\\.com$\n^(.*\\.)?tensorflow\\.org$\n^(.*\\.)?thinkwithgoogle\\.com$\n^(.*\\.)?tiltbrush\\.com$\n^(.*\\.)?waveprotocol\\.org$\n^(.*\\.)?webmproject\\.org$\n^(.*\\.)?webrtc\\.org$\n^(.*\\.)?whatbrowser\\.org$\n^(.*\\.)?withgoogle\\.com$\n^(.*\\.)?youtu\\.be$\n^(.*\\.)?youtube\\.com$\n^(.*\\.)?youtube-nocookie\\.com$\n^(.*\\.)?ytimg\\.com$\n^(.*\\.)?zynamics\\.com$\n^(.*\\.)?kat\\.cr$\n^(.*\\.)?naughtyamerica\\.com$\n^(.*\\.)?v2ex\\.com$\n^(.*\\.)?0to255\\.com$\n^(.*\\.)?100ke\\.org$\n^(.*\\.)?1000giri\\.net$\n^(.*\\.)?10conditionsoflove\\.com$\n^(.*\\.)?10musume\\.com$\n^(.*\\.)?123rf\\.com$\n^(.*\\.)?12bet\\.com$\n^(.*\\.)?141hongkong\\.com$\n^(.*\\.)?141tube\\.com$\n^(.*\\.)?173ng\\.com$\n^(.*\\.)?177pic\\.info$\n^(.*\\.)?17t17p\\.com$\n^(.*\\.)?18onlygirls\\.com$\n^(.*\\.)?1949er\\.org$\n^(.*\\.)?zhao\\.1984\\.city$\n^(.*\\.)?1984bbs\\.com$\n^(.*\\.)?1984bbs\\.org$\n^(.*\\.)?1998cdp\\.org$\n^(.*\\.)?1bao\\.org$\n^(.*\\.)?1eew\\.com$\n^(.*\\.)?1mobile\\.com$\n^(.*\\.)?2-hand\\.info$\n^(.*\\.)?2000fun\\.com$\n^(.*\\.)?2008xianzhang\\.info$\n^(.*\\.)?21andy\\.com$\n^(.*\\.)?21pron\\.com$\n^(.*\\.)?24hrs\\.ca$\n^(.*\\.)?24smile\\.org$\n^(.*\\.)?2lipstube\\.com$\n^(.*\\.)?2shared\\.com$\n^(.*\\.)?30boxes\\.com$\n^(.*\\.)?315lz\\.com$\n^(.*\\.)?32red\\.com$\n^(.*\\.)?36rain\\.com$\n^(.*\\.)?3a5a\\.com$\n^(.*\\.)?3arabtv\\.com$\n^(.*\\.)?3boys2girls\\.com$\n^(.*\\.)?3ren\\.ca$\n^(.*\\.)?3tui\\.net$\n^(.*\\.)?4bluestones\\.biz$\n^(.*\\.)?4rbtv\\.com$\n^(.*\\.)?4shared\\.com$\n^(.*\\.)?taiwannation\\.50webs\\.com$\n^(.*\\.)?51\\.ca$\n^(.*\\.)?51luoben\\.com$\n^(.*\\.)?5aimiku\\.com$\n^(.*\\.)?5i01\\.com$\n^(.*\\.)?5isotoi5\\.org$\n^(.*\\.)?5maodang\\.com$\n^(.*\\.)?63i\\.com$\n^(.*\\.)?66\\.ca$\n^(.*\\.)?666kb\\.com$\n^(.*\\.)?6park\\.com$\n^(.*\\.)?7capture\\.com$\n^(.*\\.)?7cow\\.com$\n^(.*\\.)?8-d\\.com$\n^(.*\\.)?85cc\\.net$\n^(.*\\.)?85st\\.com$\n^(.*\\.)?881903\\.com$\n^(.*\\.)?888\\.com$\n^(.*\\.)?888poker\\.com$\n^(.*\\.)?8z1\\.net$\n^(.*\\.)?9001700\\.com$\n^(.*\\.)?908taiwan\\.org$\n^(.*\\.)?91porn\\.com$\n^(.*\\.)?92ccav\\.com$\n^(.*\\.)?991\\.com$\n^(.*\\.)?99btgc01\\.com$\n^(.*\\.)?99cn\\.info$\n^(.*\\.)?9bis\\.com$\n^(.*\\.)?9bis\\.net$\n^(.*\\.)?tibet\\.a\\.se$\n^(.*\\.)?a-normal-day\\.com$\n^(.*\\.)?aamacau\\.com$\n^(.*\\.)?abc\\.com$\n^(.*\\.)?abchinese\\.com$\n^(.*\\.)?ablwang\\.com$\n^(.*\\.)?aboluowang\\.com$\n^(.*\\.)?aboutgfw\\.com$\n^(.*\\.)?abs\\.edu$\n^(.*\\.)?accim\\.org$\n^(.*\\.)?aceros-de-hispania\\.com$\n^(.*\\.)?acg18\\.me$\n^(.*\\.)?acgkj\\.com$\n^(.*\\.)?aculo\\.us$\n^(.*\\.)?adelaidebbs\\.com$\n^(.*\\.)?adultfriendfinder\\.com$\n^(.*\\.)?adultkeep\\.net$\n^(.*\\.)?advanscene\\.com$\n^(.*\\.)?advertfan\\.com$\n^(.*\\.)?ae\\.org$\n^(.*\\.)?aenhancers\\.com$\n^(.*\\.)?af\\.mil$\n^(.*\\.)?afantibbs\\.com$\n^(.*\\.)?ai-kan\\.net$\n^(.*\\.)?ai-wen\\.net$\n^(.*\\.)?aiph\\.net$\n^(.*\\.)?airconsole\\.com$\n^(.*\\.)?download\\.aircrack-ng\\.org$\n^(.*\\.)?aiweiwei\\.com$\n^(.*\\.)?aiweiweiblog\\.com$\n^(.*\\.)?www\\.ajsands\\.com$\n^(.*\\.)?akamaihd\\.net$\n^(.*\\.)?a248\\.e\\.akamai\\.net$\n^(.*\\.)?voa-11\\.akacast\\.akamaistream\\.net$\n^(.*\\.)?akademiye\\.org$\n^(.*\\.)?akiba-online\\.com$\n^(.*\\.)?al-qimmah\\.net$\n^(.*\\.)?alabout\\.com$\n^(.*\\.)?alanhou\\.com$\n^(.*\\.)?alasbarricadas\\.org$\n^(.*\\.)?alexlur\\.org$\n^(.*\\.)?alforattv\\.net$\n^(.*\\.)?alhayat\\.com$\n^(.*\\.)?aliengu\\.com$\n^(.*\\.)?alkasir\\.com$\n^(.*\\.)?allconnected\\.co$\n^(.*\\.)?allgirlsallowed\\.org$\n^(.*\\.)?allinfa\\.com$\n^(.*\\.)?alljackpotscasino\\.com$\n^(.*\\.)?allmovie\\.com$\n^(.*\\.)?alphaporno\\.com$\n^(.*\\.)?alternate-tools\\.com$\n^(.*\\.)?alvinalexander\\.com$\n^(.*\\.)?alwaysdata\\.com$\n^(.*\\.)?alwaysdata\\.net$\n^(.*\\.)?amazon\\.com$\n^(.*\\.)?www1\\.american\\.edu$\n^(.*\\.)?americangreencard\\.com$\n^(.*\\.)?www\\.americorps\\.gov$\n^(.*\\.)?amiblockedornot\\.com$\n^(.*\\.)?amigobbs\\.net$\n^(.*\\.)?amitabhafoundation\\.us$\n^(.*\\.)?amnesty\\.org$\n^(.*\\.)?amnestyusa\\.org$\n^(.*\\.)?amnyemachen\\.org$\n^(.*\\.)?amoiist\\.com$\n^(.*\\.)?annatam\\.com$\n^(.*\\.)?anchorfree\\.com$\n^(.*\\.)?ancsconf\\.org$\n^(.*\\.)?andfaraway\\.net$\n^(.*\\.)?android-x86\\.org$\n^(.*\\.)?angelfire\\.com$\n^(.*\\.)?angularjs\\.org$\n^(.*\\.)?animecrazy\\.net$\n^(.*\\.)?animeshippuuden\\.com$\n^(.*\\.)?aniscartujo\\.com$\n^(.*\\.)?anobii\\.com$\n^(.*\\.)?anonymitynetwork\\.com$\n^(.*\\.)?anonymizer\\.com$\n^(.*\\.)?anontext\\.com$\n^(.*\\.)?anpopo\\.com$\n^(.*\\.)?answering-islam\\.org$\n^(.*\\.)?www\\.antd\\.org$\n^(.*\\.)?anthonycalzadilla\\.com$\n^(.*\\.)?antiwave\\.net$\n^(.*\\.)?aofriend\\.com$\n^(.*\\.)?aojiao\\.org$\n^(.*\\.)?aolchannels\\.aol\\.com$\n^(.*\\.)?video\\.aol\\.ca$\n^(.*\\.)?video\\.aol\\.com$\n^(.*\\.)?search\\.aol\\.com$\n^(.*\\.)?www\\.aolnews\\.com$\n^(.*\\.)?aomiwang\\.com$\n^(.*\\.)?video\\.ap\\.org$\n^(.*\\.)?apetube\\.com$\n^(.*\\.)?apiary\\.io$\n^(.*\\.)?apigee\\.com$\n^(.*\\.)?apk-dl\\.com$\n^(.*\\.)?apkdler\\.com$\n^(.*\\.)?appdownloader\\.net$\n^(.*\\.)?apkpure\\.com$\n^(.*\\.)?appledaily\\.com$\n^(.*\\.)?appsocks\\.net$\n^(.*\\.)?appsto\\.re$\n^(.*\\.)?archives\\.gov$\n^(.*\\.)?archive\\.is$\n^(.*\\.)?archive\\.org$\n^(.*\\.)?arctosia\\.com$\n^(.*\\.)?areca-backup\\.org$\n^(.*\\.)?arethusa\\.su$\n^(.*\\.)?arlingtoncemetery\\.mil$\n^(.*\\.)?army\\.mil$\n^(.*\\.)?arstechnica\\.com$\n^(.*\\.)?art4tibet1998\\.org$\n^(.*\\.)?artsy\\.net$\n^(.*\\.)?asacp\\.org$\n^(.*\\.)?asahichinese\\.com$\n^(.*\\.)?asg\\.to$\n^(.*\\.)?japanfirst\\.asianfreeforum\\.com$\n^(.*\\.)?asiaharvest\\.org$\n^(.*\\.)?asianews\\.it$\n^(.*\\.)?asiatgp\\.com$\n^(.*\\.)?askstudent\\.com$\n^(.*\\.)?askynz\\.net$\n^(.*\\.)?assembla\\.com$\n^(.*\\.)?astonmartinnews\\.com$\n^(.*\\.)?astrill\\.com$\n^(.*\\.)?atchinese\\.com$\n^(.*\\.)?atgfw\\.org$\n^(.*\\.)?atlaspost\\.com$\n^(.*\\.)?atdmt\\.com$\n^(.*\\.)?atnext\\.com$\n^(.*\\.)?avaaz\\.org$\n^(.*\\.)?avcool\\.com$\n^(.*\\.)?avfantasy\\.com$\n^(.*\\.)?avidemux\\.org$\n^(.*\\.)?avoision\\.com$\n^(.*\\.)?avyahoo\\.com$\n^(.*\\.)?axureformac\\.com$\n^(.*\\.)?azerimix\\.com$\n^(.*\\.)?azurewebsites\\.net$\n^(.*\\.)?forum\\.baby-kingdom\\.com$\n^(.*\\.)?backchina\\.com$\n^(.*\\.)?backtotiananmen\\.com$\n^(.*\\.)?badjojo\\.com$\n^(.*\\.)?badoo\\.com$\n^(.*\\.)?bailandaily\\.com$\n^(.*\\.)?baixing\\.me$\n^(.*\\.)?bangchen\\.net$\n^(.*\\.)?bangyoulater\\.com$\n^(.*\\.)?bannedbook\\.org$\n^(.*\\.)?bannednews\\.org$\n^(.*\\.)?barenakedislam\\.com$\n^(.*\\.)?bayvoice\\.net$\n^(.*\\.)?dajusha\\.baywords\\.com$\n^(.*\\.)?bbc\\.com$\n^(.*\\.)?bbcchinese\\.com$\n^(.*\\.)?bbg\\.gov$\n^(.*\\.)?bbkz\\.com$\n^(.*\\.)?bbnradio\\.org$\n^(.*\\.)?bbs-tw\\.com$\n^(.*\\.)?bbsdigest\\.com$\n^(.*\\.)?bbsfeed\\.com$\n^(.*\\.)?bbsland\\.com$\n^(.*\\.)?bbsmo\\.com$\n^(.*\\.)?bbsone\\.com$\n^(.*\\.)?bbtoystore\\.com$\n^(.*\\.)?bcast\\.co\\.nz$\n^(.*\\.)?bcchinese\\.net$\n^(.*\\.)?bcmorning\\.com$\n^(.*\\.)?bdsmvideos\\.net$\n^(.*\\.)?beaconevents\\.com$\n^(.*\\.)?bebo\\.com$\n^(.*\\.)?behindkink\\.com$\n^(.*\\.)?beijing1989\\.com$\n^(.*\\.)?beijingspring\\.com$\n^(.*\\.)?belamionline\\.com$\n^(.*\\.)?bemywife\\.cc$\n^(.*\\.)?beric\\.me$\n^(.*\\.)?berlintwitterwall\\.com$\n^(.*\\.)?berm\\.co\\.nz$\n^(.*\\.)?bestforchina\\.org$\n^(.*\\.)?bet365\\.com$\n^(.*\\.)?betfair\\.com$\n^(.*\\.)?bettween\\.com$\n^(.*\\.)?betvictor\\.com$\n^(.*\\.)?bewww\\.net$\n^(.*\\.)?beyondfirewall\\.com$\n^(.*\\.)?bfnn\\.org$\n^(.*\\.)?biantailajiao\\.com$\n^(.*\\.)?biblesforamerica\\.org$\n^(.*\\.)?bic2011\\.org$\n^(.*\\.)?bigfools\\.com$\n^(.*\\.)?bignews\\.org$\n^(.*\\.)?bigsound\\.org$\n^(.*\\.)?billypan\\.com$\n^(.*\\.)?billywr\\.com$\n^(.*\\.)?bipic\\.net$\n^(.*\\.)?bit\\.do$\n^(.*\\.)?bit\\.ly$\n^(.*\\.)?bitcointalk\\.org$\n^(.*\\.)?bitshare\\.com$\n^(.*\\.)?bitsnoop\\.com$\n^(.*\\.)?bizhat\\.com$\n^(.*\\.)?bl-doujinsouko\\.com$\n^(.*\\.)?bjnewlife\\.org$\n^(.*\\.)?bjzc\\.org$\n^(.*\\.)?blacklogic\\.com$\n^(.*\\.)?tor\\.blingblingsquad\\.net$\n^(.*\\.)?blinkx\\.com$\n^(.*\\.)?blinw\\.com$\n^(.*\\.)?blockcn\\.com$\n^(.*\\.)?blogblog\\.com$\n^(.*\\.)?blogcatalog\\.com$\n^(.*\\.)?blogcity\\.me$\n^(.*\\.)?blogger\\.com$\n^(.*\\.)?blog\\.kangye\\.org$\n^(.*\\.)?bloglines\\.com$\n^(.*\\.)?bloglovin\\.com$\n^(.*\\.)?rconversation\\.blogs\\.com$\n^(.*\\.)?blogtd\\.net$\n^(.*\\.)?blogtd\\.org$\n^(.*\\.)?bloodshed\\.net$\n^(.*\\.)?bloomberg\\.com$\n^(.*\\.)?bloomfortune\\.com$\n^(.*\\.)?blueangellive\\.com$\n^(.*\\.)?bmfinn\\.com$\n^(.*\\.)?bnrmetal\\.com$\n^(.*\\.)?boardreader\\.com$\n^(.*\\.)?bod\\.asia$\n^(.*\\.)?bodog88\\.com$\n^(.*\\.)?bonbonme\\.com$\n^(.*\\.)?bongacams\\.com$\n^(.*\\.)?boobstagram\\.com$\n^(.*\\.)?bookepub\\.com$\n^(.*\\.)?botanwang\\.com$\n^(.*\\.)?bot\\.nu$\n^(.*\\.)?bowenpress\\.com$\n^(.*\\.)?app\\.box\\.com$\n^(.*\\.)?dl\\.box\\.net$\n^(.*\\.)?boxpn\\.com$\n^(.*\\.)?boxun\\.com$\n^(.*\\.)?boxunblog\\.com$\n^(.*\\.)?boxunclub\\.com$\n^(.*\\.)?boyangu\\.com$\n^(.*\\.)?boyfriendtv\\.com$\n^(.*\\.)?boysfood\\.com$\n^(.*\\.)?br\\.st$\n^(.*\\.)?brainyquote\\.com$\n^(.*\\.)?brandonhutchinson\\.com$\n^(.*\\.)?braumeister\\.org$\n^(.*\\.)?bravotube\\.net$\n^(.*\\.)?brazzers\\.com$\n^(.*\\.)?break\\.com$\n^(.*\\.)?breakgfw\\.com$\n^(.*\\.)?breakingtweets\\.com$\n^(.*\\.)?breakwall\\.net$\n^(.*\\.)?briian\\.com$\n^(.*\\.)?briefdream\\.com$\n^(.*\\.)?brizzly\\.com$\n^(.*\\.)?broadbook\\.com$\n^(.*\\.)?broadpressinc\\.com$\n^(.*\\.)?bbs\\.brockbbs\\.com$\n^(.*\\.)?brucewang\\.net$\n^(.*\\.)?brutaltgp\\.com$\n^(.*\\.)?bt95\\.com$\n^(.*\\.)?btdigg\\.org$\n^(.*\\.)?btku\\.me$\n^(.*\\.)?btku\\.org$\n^(.*\\.)?btspread\\.com$\n^(.*\\.)?budaedu\\.org$\n^(.*\\.)?buffered\\.com$\n^(.*\\.)?bullog\\.org$\n^(.*\\.)?bullogger\\.com$\n^(.*\\.)?bunbunhk\\.com$\n^(.*\\.)?busayari\\.com$\n^(.*\\.)?businessinsider\\.com$\n^(.*\\.)?businessweek\\.com$\n^(.*\\.)?busu\\.org$\n^(.*\\.)?busytrade\\.com$\n^(.*\\.)?buugaa\\.com$\n^(.*\\.)?buzzhand\\.com$\n^(.*\\.)?buzzhand\\.net$\n^(.*\\.)?bx\\.tl$\n^(.*\\.)?holz\\.byethost8\\.com$\n^(.*\\.)?c-spanvideo\\.org$\n^(.*\\.)?c-est-simple\\.com$\n^(.*\\.)?c100tibet\\.org$\n^(.*\\.)?cablegatesearch\\.net$\n^(.*\\.)?cachinese\\.com$\n^(.*\\.)?cacnw\\.com$\n^(.*\\.)?cafepress\\.com$\n^(.*\\.)?calameo\\.com$\n^(.*\\.)?cn\\.calameo\\.com$\n^(.*\\.)?calgarychinese\\.ca$\n^(.*\\.)?calgarychinese\\.com$\n^(.*\\.)?calgarychinese\\.net$\n^(.*\\.)?blog\\.calibre-ebook\\.com$\n^(.*\\.)?falun\\.caltech\\.edu$\n^(.*\\.)?its\\.caltech\\.edu$\n^(.*\\.)?cam4\\.com$\n^(.*\\.)?cam4\\.sg$\n^(.*\\.)?camfrog\\.com$\n^(.*\\.)?cams\\.com$\n^(.*\\.)?cams\\.org\\.sg$\n^(.*\\.)?canadameet\\.com$\n^(.*\\.)?bbs\\.cantonese\\.asia$\n^(.*\\.)?canyu\\.org$\n^(.*\\.)?cao\\.im$\n^(.*\\.)?caobian\\.info$\n^(.*\\.)?caochangqing\\.com$\n^(.*\\.)?carabinasypistolas\\.com$\n^(.*\\.)?cardinalkungfoundation\\.org$\n^(.*\\.)?carmotorshow\\.com$\n^(.*\\.)?cartoonmovement\\.com$\n^(.*\\.)?casadeltibetbcn\\.org$\n^(.*\\.)?casatibet\\.org\\.mx$\n^(.*\\.)?cari\\.com\\.my$\n^(.*\\.)?caribbeancom\\.com$\n^(.*\\.)?casinoking\\.com$\n^(.*\\.)?casinoriva\\.com$\n^(.*\\.)?catch22\\.net$\n^(.*\\.)?catfightpayperview\\.xxx$\n^(.*\\.)?cattt\\.com$\n^(.*\\.)?cbc\\.ca$\n^(.*\\.)?cbsnews\\.com$\n^(.*\\.)?ccdtr\\.org$\n^(.*\\.)?cchere\\.com$\n^(.*\\.)?ccim\\.org$\n^(.*\\.)?cclife\\.ca$\n^(.*\\.)?cclife\\.org$\n^(.*\\.)?cclifefl\\.org$\n^(.*\\.)?ccthere\\.com$\n^(.*\\.)?cctongbao\\.com$\n^(.*\\.)?ccue\\.ca$\n^(.*\\.)?ccue\\.com$\n^(.*\\.)?ccvoice\\.ca$\n^(.*\\.)?cgdepot\\.org$\n^(.*\\.)?cdbook\\.org$\n^(.*\\.)?cdd\\.me$\n^(.*\\.)?cdef\\.org$\n^(.*\\.)?cdig\\.info$\n^(.*\\.)?cdjp\\.org$\n^(.*\\.)?cdninstagram\\.com$\n^(.*\\.)?cdp1989\\.org$\n^(.*\\.)?cdp1998\\.org$\n^(.*\\.)?cdp2006\\.org$\n^(.*\\.)?cdpeu\\.org$\n^(.*\\.)?cdpusa\\.org$\n^(.*\\.)?cdpweb\\.org$\n^(.*\\.)?cdpwu\\.org$\n^(.*\\.)?cdw\\.com$\n^(.*\\.)?cecc\\.gov$\n^(.*\\.)?cellulo\\.info$\n^(.*\\.)?centerforhumanreprod\\.com$\n^(.*\\.)?centralnation\\.com$\n^(.*\\.)?centurys\\.net$\n^(.*\\.)?cftfc\\.com$\n^(.*\\.)?cgst\\.edu$\n^(.*\\.)?change\\.org$\n^(.*\\.)?changp\\.com$\n^(.*\\.)?changsa\\.net$\n^(.*\\.)?chapm25\\.com$\n^(.*\\.)?chaturbate\\.com$\n^(.*\\.)?chuang-yen\\.org$\n^(.*\\.)?chengmingmag\\.com$\n^(.*\\.)?chenguangcheng\\.com$\n^(.*\\.)?chenpokong\\.com$\n^(.*\\.)?chenpokong\\.net$\n^(.*\\.)?cherrysave\\.com$\n^(.*\\.)?chhongbi\\.org$\n^(.*\\.)?chicagoncmtv\\.com$\n^(.*\\.)?china-week\\.com$\n^(.*\\.)?china101\\.com$\n^(.*\\.)?china18\\.org$\n^(.*\\.)?china21\\.com$\n^(.*\\.)?china21\\.org$\n^(.*\\.)?china5000\\.us$\n^(.*\\.)?chinaaffairs\\.org$\n^(.*\\.)?chinaaid\\.me$\n^(.*\\.)?chinaaid\\.us$\n^(.*\\.)?chinaaid\\.org$\n^(.*\\.)?chinaaid\\.net$\n^(.*\\.)?chinacomments\\.org$\n^(.*\\.)?chinachange\\.org$\n^(.*\\.)?chinacitynews\\.be$\n^(.*\\.)?chinadialogue\\.net$\n^(.*\\.)?chinadigitaltimes\\.net$\n^(.*\\.)?chinaelections\\.org$\n^(.*\\.)?chinaeweekly\\.com$\n^(.*\\.)?chinafreepress\\.org$\n^(.*\\.)?chinagate\\.com$\n^(.*\\.)?chinageeks\\.org$\n^(.*\\.)?chinagfw\\.org$\n^(.*\\.)?chinagreenparty\\.org$\n^(.*\\.)?chinahorizon\\.org$\n^(.*\\.)?chinahush\\.com$\n^(.*\\.)?chinalaborwatch\\.org$\n^(.*\\.)?chinalawtranslate\\.com$\n^(.*\\.)?chinaxchina\\.com$\n^(.*\\.)?chinainperspective\\.com$\n^(.*\\.)?chinainperspective\\.net$\n^(.*\\.)?chinainperspective\\.org$\n^(.*\\.)?chinainterimgov\\.org$\n^(.*\\.)?chinalawandpolicy\\.com$\n^(.*\\.)?chinamule\\.com$\n^(.*\\.)?chinamz\\.org$\n^(.*\\.)?chinapress\\.com\\.my$\n^(.*\\.)?chinarightsia\\.org$\n^(.*\\.)?chinasmile\\.net$\n^(.*\\.)?chinasocialdemocraticparty\\.com$\n^(.*\\.)?chinasoul\\.org$\n^(.*\\.)?chinasucks\\.net$\n^(.*\\.)?chinatimes\\.com$\n^(.*\\.)?chinatweeps\\.com$\n^(.*\\.)?chinaway\\.org$\n^(.*\\.)?chinaworker\\.info$\n^(.*\\.)?chinayuanmin\\.org$\n^(.*\\.)?chinese-hermit\\.net$\n^(.*\\.)?chinese-leaders\\.org$\n^(.*\\.)?chinese-memorial\\.org$\n^(.*\\.)?chinesedaily\\.com$\n^(.*\\.)?chinesedailynews\\.com$\n^(.*\\.)?chinesedemocracy\\.com$\n^(.*\\.)?chinesegay\\.org$\n^(.*\\.)?chinesepen\\.org$\n^(.*\\.)?chinesetalks\\.net$\n^(.*\\.)?chingcheong\\.com$\n^(.*\\.)?chinman\\.net$\n^(.*\\.)?chithu\\.org$\n^(.*\\.)?chn\\.chosun\\.com$\n^(.*\\.)?chrdnet\\.com$\n^(.*\\.)?christianfreedom\\.org$\n^(.*\\.)?christianstudy\\.com$\n^(.*\\.)?christusrex\\.org$\n^(.*\\.)?chromeadblock\\.com$\n^(.*\\.)?chubun\\.com$\n^(.*\\.)?chuizi\\.net$\n^(.*\\.)?churchinhongkong\\.org$\n^(.*\\.)?cipfg\\.org$\n^(.*\\.)?circlethebayfortibet\\.org$\n^(.*\\.)?citizenlab\\.org$\n^(.*\\.)?www\\.citizenlab\\.org$\n^(.*\\.)?citizensradio\\.org$\n^(.*\\.)?city365\\.ca$\n^(.*\\.)?city9x\\.com$\n^(.*\\.)?civilhrfront\\.org$\n^(.*\\.)?civiliangunner\\.com$\n^(.*\\.)?psiphon\\.civisec\\.org$\n^(.*\\.)?ck101\\.com$\n^(.*\\.)?clarionproject\\.org$\n^(.*\\.)?classicalguitarblog\\.net$\n^(.*\\.)?clearharmony\\.net$\n^(.*\\.)?clearwisdom\\.net$\n^(.*\\.)?cloakpoint\\.com$\n^(.*\\.)?www\\.cmoinc\\.org$\n^(.*\\.)?cmule\\.com$\n^(.*\\.)?cmule\\.org$\n^(.*\\.)?cms\\.gov$\n^(.*\\.)?cnabc\\.com$\n^(.*\\.)?cnd\\.org$\n^(.*\\.)?download\\.cnet\\.com$\n^(.*\\.)?cnineu\\.com$\n^(.*\\.)?wiki\\.cnitter\\.com$\n^(.*\\.)?cnn\\.com$\n^(.*\\.)?cnpolitics\\.org$\n^(.*\\.)?blog\\.cnyes\\.com$\n^(.*\\.)?news\\.cnyes\\.com$\n^(.*\\.)?cochina\\.co$\n^(.*\\.)?cochina\\.org$\n^(.*\\.)?code1984\\.com$\n^(.*\\.)?goagent\\.codeplex\\.com$\n^(.*\\.)?codeshare\\.io$\n^(.*\\.)?codeskulptor\\.org$\n^(.*\\.)?tosh\\.comedycentral\\.com$\n^(.*\\.)?comefromchina\\.com$\n^(.*\\.)?comic-mega\\.me$\n^(.*\\.)?commandarms\\.com$\n^(.*\\.)?commentshk\\.com$\n^(.*\\.)?communistcrimes\\.org$\n^(.*\\.)?communitychoicecu\\.com$\n^(.*\\.)?compileheart\\.com$\n^(.*\\.)?contactmagazine\\.net$\n^(.*\\.)?convio\\.net$\n^(.*\\.)?coobay\\.com$\n^(.*\\.)?www\\.cool18\\.com$\n^(.*\\.)?coolaler\\.com$\n^(.*\\.)?coolder\\.com$\n^(.*\\.)?coolncute\\.com$\n^(.*\\.)?corumcollege\\.com$\n^(.*\\.)?cos-moe\\.com$\n^(.*\\.)?couchdbwiki\\.com$\n^(.*\\.)?cotweet\\.com$\n^(.*\\.)?cpj\\.org$\n^(.*\\.)?crackle\\.com$\n^(.*\\.)?crchina\\.org$\n^(.*\\.)?crd-net\\.org$\n^(.*\\.)?creaders\\.net$\n^(.*\\.)?creadersnet\\.com$\n^(.*\\.)?cristyli\\.com$\n^(.*\\.)?crocotube\\.com$\n^(.*\\.)?crossthewall\\.net$\n^(.*\\.)?csdparty\\.com$\n^(.*\\.)?ctao\\.org$\n^(.*\\.)?ctfriend\\.net$\n^(.*\\.)?cuhkacs\\.org$\n^(.*\\.)?cuihua\\.org$\n^(.*\\.)?cuiweiping\\.net$\n^(.*\\.)?cumlouder\\.com$\n^(.*\\.)?curvefish\\.com$\n^(.*\\.)?forum\\.cyberctm\\.com$\n^(.*\\.)?cynscribe\\.com$\n^(.*\\.)?cytode\\.us$\n^(.*\\.)?ifan\\.cz\\.cc$\n^(.*\\.)?mike\\.cz\\.cc$\n^(.*\\.)?nic\\.cz\\.cc$\n^(.*\\.)?cl\\.d0z\\.net$\n^(.*\\.)?d100\\.net$\n^(.*\\.)?d2bay\\.com$\n^(.*\\.)?dabr\\.mobi$\n^(.*\\.)?dabr\\.me$\n^(.*\\.)?dadazim\\.com$\n^(.*\\.)?dadi360\\.com$\n^(.*\\.)?dafagood\\.com$\n^(.*\\.)?dafahao\\.com$\n^(.*\\.)?dailidaili\\.com$\n^(.*\\.)?dailymotion\\.com$\n^(.*\\.)?daiphapinfo\\.net$\n^(.*\\.)?dajiyuan\\.com$\n^(.*\\.)?dalailama\\.com$\n^(.*\\.)?dalailama\\.mn$\n^(.*\\.)?dalailama80\\.org$\n^(.*\\.)?dalailama-archives\\.org$\n^(.*\\.)?dalailamacenter\\.org$\n^(.*\\.)?dalailamafellows\\.org$\n^(.*\\.)?dalailamafilm\\.com$\n^(.*\\.)?dalailamafoundation\\.org$\n^(.*\\.)?dalailamahindi\\.com$\n^(.*\\.)?dalailamainaustralia\\.org$\n^(.*\\.)?dalailamajapanese\\.com$\n^(.*\\.)?dalailamaprotesters\\.info$\n^(.*\\.)?dalailamaquotes\\.org$\n^(.*\\.)?dalailamatrust\\.org$\n^(.*\\.)?dalailamavisit\\.org\\.nz$\n^(.*\\.)?dalailamaworld\\.com$\n^(.*\\.)?dalianmeng\\.org$\n^(.*\\.)?daliulian\\.org$\n^(.*\\.)?danke4china\\.net$\n^(.*\\.)?danwei\\.org$\n^(.*\\.)?daolan\\.net$\n^(.*\\.)?darktoy\\.net$\n^(.*\\.)?dastrassi\\.org$\n^(.*\\.)?david-kilgour\\.com$\n^(.*\\.)?cn\\.dayabook\\.com$\n^(.*\\.)?daylife\\.com$\n^(.*\\.)?db\\.tt$\n^(.*\\.)?dcmilitary\\.com$\n^(.*\\.)?ddhw\\.info$\n^(.*\\.)?ddns\\.net$\n^(.*\\.)?de-sci\\.org$\n^(.*\\.)?packages\\.debian\\.org$\n^(.*\\.)?decodet\\.co$\n^(.*\\.)?definebabe\\.com$\n^(.*\\.)?delcamp\\.net$\n^(.*\\.)?delicious\\.com$\n^(.*\\.)?democrats\\.org$\n^(.*\\.)?desc\\.se$\n^(.*\\.)?dessci\\.com$\n^(.*\\.)?devio\\.us$\n^(.*\\.)?dfas\\.mil$\n^(.*\\.)?dfn\\.org$\n^(.*\\.)?dharmakara\\.net$\n^(.*\\.)?dharamsalanet\\.com$\n^(.*\\.)?diaoyuislands\\.org$\n^(.*\\.)?digitalnomadsproject\\.org$\n^(.*\\.)?diigo\\.com$\n^(.*\\.)?dilber\\.se$\n^(.*\\.)?furl\\.net$\n^(.*\\.)?dipity\\.com$\n^(.*\\.)?directcreative\\.com$\n^(.*\\.)?search\\.disconnect\\.me$\n^(.*\\.)?discuss4u\\.com$\n^(.*\\.)?disp\\.cc$\n^(.*\\.)?disqus\\.com$\n^(.*\\.)?dit-inc\\.us$\n^(.*\\.)?dizhidizhi\\.com$\n^(.*\\.)?dizhuzhishang\\.com$\n^(.*\\.)?djangosnippets\\.org$\n^(.*\\.)?djorz\\.com$\n^(.*\\.)?dlsite\\.com$\n^(.*\\.)?dmcdn\\.net$\n^(.*\\.)?dnscrypt\\.org$\n^(.*\\.)?dns2go\\.com$\n^(.*\\.)?dnssec\\.net$\n^(.*\\.)?doctorvoice\\.org$\n^(.*\\.)?dogfartnetwork\\.com$\n^(.*\\.)?gloryhole\\.com$\n^(.*\\.)?dojin\\.com$\n^(.*\\.)?dok-forum\\.net$\n^(.*\\.)?dollf\\.com$\n^(.*\\.)?dongtaiwang\\.com$\n^(.*\\.)?dongtaiwang\\.net$\n^(.*\\.)?dongyangjing\\.com$\n^(.*\\.)?dontfilter\\.us$\n^(.*\\.)?dontmovetochina\\.com$\n^(.*\\.)?dorjeshugden\\.com$\n^(.*\\.)?dotplane\\.com$\n^(.*\\.)?dotsub\\.com$\n^(.*\\.)?dougscripts\\.com$\n^(.*\\.)?doujincafe\\.com$\n^(.*\\.)?dowei\\.org$\n^(.*\\.)?dphk\\.org$\n^(.*\\.)?dpr\\.info$\n^(.*\\.)?dragonsprings\\.org$\n^(.*\\.)?draw\\.io$\n^(.*\\.)?dreammask\\.org$\n^(.*\\.)?drepung\\.org$\n^(.*\\.)?drgan\\.net$\n^(.*\\.)?drmingxia\\.org$\n^(.*\\.)?dropbox\\.com$\n^(.*\\.)?dropboxusercontent\\.com$\n^(.*\\.)?drsunacademy\\.com$\n^(.*\\.)?drtuber\\.com$\n^(.*\\.)?dscn\\.info$\n^(.*\\.)?dstk\\.dk$\n^(.*\\.)?dtiblog\\.com$\n^(.*\\.)?dtic\\.mil$\n^(.*\\.)?dtiserv2\\.com$\n^(.*\\.)?dtwang\\.org$\n^(.*\\.)?duckdns\\.org$\n^(.*\\.)?duckduckgo\\.com$\n^(.*\\.)?duckload\\.com$\n^(.*\\.)?duckmylife\\.com$\n^(.*\\.)?duihua\\.org$\n^(.*\\.)?duihuahrjournal\\.org$\n^(.*\\.)?duoweitimes\\.com$\n^(.*\\.)?duping\\.net$\n^(.*\\.)?duplicati\\.com$\n^(.*\\.)?dupola\\.com$\n^(.*\\.)?dupola\\.net$\n^(.*\\.)?dushi\\.ca$\n^(.*\\.)?dvorak\\.org$\n^(.*\\.)?dw\\.com$\n^(.*\\.)?www\\.dw\\.com$\n^(.*\\.)?dw-world\\.com$\n^(.*\\.)?www\\.dwheeler\\.com$\n^(.*\\.)?dwnews\\.com$\n^(.*\\.)?dwnews\\.net$\n^(.*\\.)?xys\\.dxiong\\.com$\n^(.*\\.)?dynawebinc\\.com$\n^(.*\\.)?dyndns\\.org$\n^(.*\\.)?dzze\\.com$\n^(.*\\.)?e-gold\\.com$\n^(.*\\.)?g\\.e-hentai\\.org$\n^(.*\\.)?lofi\\.e-hentai\\.org$\n^(.*\\.)?e-traderland\\.net$\n^(.*\\.)?earlytibet\\.com$\n^(.*\\.)?earthcam\\.com$\n^(.*\\.)?eastern-ark\\.com$\n^(.*\\.)?easternlightning\\.org$\n^(.*\\.)?eastturkestan\\.com$\n^(.*\\.)?www\\.eastturkistan\\.net$\n^(.*\\.)?eastturkistan-gov\\.org$\n^(.*\\.)?eastturkistancc\\.org$\n^(.*\\.)?eastturkistangovernmentinexile\\.us$\n^(.*\\.)?easyca\\.ca$\n^(.*\\.)?easypic\\.com$\n^(.*\\.)?ebony-beauty\\.com$\n^(.*\\.)?ebookbrowse\\.com$\n^(.*\\.)?ebookee\\.com$\n^(.*\\.)?ecministry\\.net$\n^(.*\\.)?economist\\.com$\n^(.*\\.)?bbs\\.ecstart\\.com$\n^(.*\\.)?edgecastcdn\\.net$\n^(.*\\.)?edicypages\\.com$\n^(.*\\.)?edmontonservice\\.com$\n^(.*\\.)?edoors\\.com$\n^(.*\\.)?edubridge\\.com$\n^(.*\\.)?edupro\\.org$\n^(.*\\.)?efukt\\.com$\n^(.*\\.)?eic-av\\.com$\n^(.*\\.)?eisbb\\.com$\n^(.*\\.)?eksisozluk\\.com$\n^(.*\\.)?electionsmeter\\.com$\n^(.*\\.)?elgoog\\.im$\n^(.*\\.)?elpais\\.com$\n^(.*\\.)?eltondisney\\.com$\n^(.*\\.)?emaga\\.com$\n^(.*\\.)?empfil\\.com$\n^(.*\\.)?emule-ed2k\\.com$\n^(.*\\.)?emulefans\\.com$\n^(.*\\.)?emuparadise\\.me$\n^(.*\\.)?enewstree\\.com$\n^(.*\\.)?chinese\\.engadget\\.com$\n^(.*\\.)?englishforeveryone\\.org$\n^(.*\\.)?entermap\\.com$\n^(.*\\.)?entnt\\.com$\n^(.*\\.)?episcopalchurch\\.org$\n^(.*\\.)?epochhk\\.com$\n^(.*\\.)?epochtimes-bg\\.com$\n^(.*\\.)?epochtimes-romania\\.com$\n^(.*\\.)?epochtimes\\.co\\.il$\n^(.*\\.)?epochtimes\\.co\\.kr$\n^(.*\\.)?epochtimes\\.com$\n^(.*\\.)?epochtimes\\.cz$\n^(.*\\.)?epochtimes\\.ie$\n^(.*\\.)?epochtimes\\.it$\n^(.*\\.)?epochtimes\\.se$\n^(.*\\.)?epochtimestr\\.com$\n^(.*\\.)?epochweek\\.com$\n^(.*\\.)?epochweekly\\.com$\n^(.*\\.)?eporner\\.com$\n^(.*\\.)?equinenow\\.com$\n^(.*\\.)?erabaru\\.net$\n^(.*\\.)?eraysoft\\.com\\.tr$\n^(.*\\.)?erepublik\\.com$\n^(.*\\.)?erights\\.net$\n^(.*\\.)?erktv\\.com$\n^(.*\\.)?ernestmandel\\.org$\n^(.*\\.)?erodaizensyu\\.com$\n^(.*\\.)?erodoujinworld\\.com$\n^(.*\\.)?eromanga-kingdom\\.com$\n^(.*\\.)?eromangadouzin\\.com$\n^(.*\\.)?eromon\\.net$\n^(.*\\.)?eroprofile\\.com$\n^(.*\\.)?eroticsaloon\\.net$\n^(.*\\.)?eslite\\.com$\n^(.*\\.)?wiki\\.esu\\.im$\n^(.*\\.)?etaiwannews\\.com$\n^(.*\\.)?etizer\\.org$\n^(.*\\.)?etokki\\.com$\n^(.*\\.)?ettoday\\.net$\n^(.*\\.)?eu\\.org$\n^(.*\\.)?eucasino\\.com$\n^(.*\\.)?eulam\\.com$\n^(.*\\.)?evschool\\.net$\n^(.*\\.)?exmormon\\.org$\n^(.*\\.)?expatshield\\.com$\n^(.*\\.)?experts-univers\\.com$\n^(.*\\.)?exploader\\.net$\n^(.*\\.)?extremetube\\.com$\n^(.*\\.)?eyny\\.com$\n^(.*\\.)?ezpc\\.tk$\n^(.*\\.)?ezpeer\\.com$\n^(.*\\.)?facebookquotes4u\\.com$\n^(.*\\.)?faceless\\.me$\n^(.*\\.)?facesoftibetanselfimmolators\\.info$\n^(.*\\.)?facesofnyfw\\.com$\n^(.*\\.)?faith100\\.org$\n^(.*\\.)?faithfuleye\\.com$\n^(.*\\.)?faiththedog\\.info$\n^(.*\\.)?falsefire\\.com$\n^(.*\\.)?falun-co\\.org$\n^(.*\\.)?falunart\\.org$\n^(.*\\.)?falunasia\\.info$\n^(.*\\.)?falundafa\\.org$\n^(.*\\.)?falundafa-dc\\.org$\n^(.*\\.)?falundafa-florida\\.org$\n^(.*\\.)?falundafa-nc\\.org$\n^(.*\\.)?falundafa-pa\\.net$\n^(.*\\.)?falun-ny\\.net$\n^(.*\\.)?falundafaindia\\.org$\n^(.*\\.)?falundafamuseum\\.org$\n^(.*\\.)?falunhr\\.org$\n^(.*\\.)?faluninfo\\.net$\n^(.*\\.)?falunpilipinas\\.net$\n^(.*\\.)?falunworld\\.net$\n^(.*\\.)?familyfed\\.org$\n^(.*\\.)?fanglizhi\\.info$\n^(.*\\.)?fangong\\.org$\n^(.*\\.)?fangongheike\\.com$\n^(.*\\.)?fanqiang\\.tk$\n^(.*\\.)?fanqianghou\\.com$\n^(.*\\.)?fapdu\\.com$\n^(.*\\.)?fawanghuihui\\.org$\n^(.*\\.)?fbcdn\\.net$\n^(.*\\.)?fanqiangyakexi\\.net$\n^(.*\\.)?famunion\\.com$\n^(.*\\.)?fan-qiang\\.com$\n^(.*\\.)?fangbinxing\\.com$\n^(.*\\.)?fangeming\\.com$\n^(.*\\.)?fangmincn\\.org$\n^(.*\\.)?fanswong\\.com$\n^(.*\\.)?fanyue\\.info$\n^(.*\\.)?farwestchina\\.com$\n^(.*\\.)?en\\.favotter\\.net$\n^(.*\\.)?fast\\.wistia\\.com$\n^(.*\\.)?fastssh\\.com$\n^(.*\\.)?faststone\\.org$\n^(.*\\.)?favstar\\.fm$\n^(.*\\.)?faydao\\.com$\n^(.*\\.)?fbsbx\\.com$\n^(.*\\.)?fc2\\.com$\n^(.*\\.)?fc2china\\.com$\n^(.*\\.)?fc2cn\\.com$\n^(.*\\.)?fc2blog\\.net$\n^(.*\\.)?uygur\\.fc2web\\.com$\n^(.*\\.)?video\\.fdbox\\.com$\n^(.*\\.)?fourface\\.nodesnoop\\.com$\n^(.*\\.)?feelssh\\.com$\n^(.*\\.)?feer\\.com$\n^(.*\\.)?feifeiss\\.com$\n^(.*\\.)?feitianacademy\\.org$\n^(.*\\.)?feitian-california\\.org$\n^(.*\\.)?feministteacher\\.com$\n^(.*\\.)?fengzhenghu\\.com$\n^(.*\\.)?fengzhenghu\\.net$\n^(.*\\.)?fevernet\\.com$\n^(.*\\.)?ff\\.im$\n^(.*\\.)?fffff\\.at$\n^(.*\\.)?fflick\\.com$\n^(.*\\.)?fgmtv\\.net$\n^(.*\\.)?fgmtv\\.org$\n^(.*\\.)?fhreports\\.net$\n^(.*\\.)?fileflyer\\.com$\n^(.*\\.)?feeds\\.fileforum\\.com$\n^(.*\\.)?files2me\\.com$\n^(.*\\.)?fileserve\\.com$\n^(.*\\.)?fillthesquare\\.org$\n^(.*\\.)?filmingfortibet\\.org$\n^(.*\\.)?filthdump\\.com$\n^(.*\\.)?findmespot\\.com$\n^(.*\\.)?fingerdaily\\.com$\n^(.*\\.)?finler\\.net$\n^(.*\\.)?firefoxfan\\.cc$\n^(.*\\.)?fireofliberty\\.org$\n^(.*\\.)?firetweet\\.io$\n^(.*\\.)?flagsonline\\.it$\n^(.*\\.)?fleshbot\\.com$\n^(.*\\.)?fleursdeslettres\\.com$\n^(.*\\.)?flgg\\.us$\n^(.*\\.)?flickr\\.com$\n^(.*\\.)?staticflickr\\.com$\n^(.*\\.)?flickrhivemind\\.net$\n^(.*\\.)?fling\\.com$\n^(.*\\.)?flipkart\\.com$\n^(.*\\.)?cn\\.fmnnow\\.com$\n^(.*\\.)?fofldfradio\\.org$\n^(.*\\.)?blog\\.foolsmountain\\.com$\n^(.*\\.)?forum4hk\\.com$\n^(.*\\.)?fangong\\.forums-free\\.com$\n^(.*\\.)?pioneer-worker\\.forums-free\\.com$\n^(.*\\.)?4sqi\\.net$\n^(.*\\.)?fotop\\.net$\n^(.*\\.)?video\\.foxbusiness\\.com$\n^(.*\\.)?foxgay\\.com$\n^(.*\\.)?fringenetwork\\.com$\n^(.*\\.)?fochk\\.org$\n^(.*\\.)?fofg\\.org$\n^(.*\\.)?fofg-europe\\.net$\n^(.*\\.)?fooooo\\.com$\n^(.*\\.)?footwiball\\.com$\n^(.*\\.)?fourthinternational\\.org$\n^(.*\\.)?foxdie\\.us$\n^(.*\\.)?foxsub\\.com$\n^(.*\\.)?foxtang\\.com$\n^(.*\\.)?fpmt\\.org$\n^(.*\\.)?fpmt-osel\\.org$\n^(.*\\.)?fpmtmexico\\.org$\n^(.*\\.)?fqok\\.org$\n^(.*\\.)?fqrouter\\.com$\n^(.*\\.)?franklc\\.com$\n^(.*\\.)?freakshare\\.com$\n^(.*\\.)?free4u\\.com\\.ar$\n^(.*\\.)?free-gate\\.org$\n^(.*\\.)?freealim\\.com$\n^(.*\\.)?whitebear\\.freebearblog\\.org$\n^(.*\\.)?freebrowser\\.org$\n^(.*\\.)?freechal\\.com$\n^(.*\\.)?freecn\\.top$\n^(.*\\.)?freedomchina\\.info$\n^(.*\\.)?freedomhouse\\.org$\n^(.*\\.)?freedomsherald\\.org$\n^(.*\\.)?freefq\\.com$\n^(.*\\.)?freefuckvids\\.com$\n^(.*\\.)?freegao\\.com$\n^(.*\\.)?free-hada-now\\.org$\n^(.*\\.)?freeilhamtohti\\.org$\n^(.*\\.)?freelotto\\.com$\n^(.*\\.)?freeman2\\.com$\n^(.*\\.)?freemoren\\.com$\n^(.*\\.)?freemorenews\\.com$\n^(.*\\.)?freemuse\\.org$\n^(.*\\.)?freenet-china\\.org$\n^(.*\\.)?freenewscn\\.com$\n^(.*\\.)?cn\\.freeones\\.com$\n^(.*\\.)?freeoz\\.org$\n^(.*\\.)?freessh\\.us$\n^(.*\\.)?free-ssh\\.com$\n^(.*\\.)?freedomcollection\\.org$\n^(.*\\.)?freeforums\\.org$\n^(.*\\.)?freenetproject\\.org$\n^(.*\\.)?freetibet\\.net$\n^(.*\\.)?freetibet\\.org$\n^(.*\\.)?freetibetanheroes\\.org$\n^(.*\\.)?freeviewmovies\\.com$\n^(.*\\.)?freewallpaper4\\.me$\n^(.*\\.)?freewebs\\.com$\n^(.*\\.)?freeweibo\\.com$\n^(.*\\.)?freexinwen\\.com$\n^(.*\\.)?friendfeed\\.com$\n^(.*\\.)?friendfeed-media\\.com$\n^(.*\\.)?friends-of-tibet\\.org$\n^(.*\\.)?friendsoftibet\\.org$\n^(.*\\.)?freechina\\.net$\n^(.*\\.)?www\\.zensur\\.freerk\\.com$\n^(.*\\.)?freeyellow\\.com$\n^(.*\\.)?hk\\.frienddy\\.com$\n^(.*\\.)?adult\\.friendfinder\\.com$\n^(.*\\.)?fring\\.com$\n^(.*\\.)?fromchinatousa\\.net$\n^(.*\\.)?frommel\\.net$\n^(.*\\.)?frontlinedefenders\\.org$\n^(.*\\.)?fscked\\.org$\n^(.*\\.)?fsurf\\.com$\n^(.*\\.)?ftchinese\\.com$\n^(.*\\.)?www\\.ftchinese\\.com$\n^(.*\\.)?fucd\\.com$\n^(.*\\.)?fuckcnnic\\.net$\n^(.*\\.)?fuckgfw\\.org$\n^(.*\\.)?fullerconsideration\\.com$\n^(.*\\.)?fulue\\.com$\n^(.*\\.)?funp\\.com$\n^(.*\\.)?fuq\\.com$\n^(.*\\.)?furhhdl\\.org$\n^(.*\\.)?furinkan\\.com$\n^(.*\\.)?futurechinaforum\\.org$\n^(.*\\.)?futuremessage\\.org$\n^(.*\\.)?fux\\.com$\n^(.*\\.)?fuyin\\.net$\n^(.*\\.)?fuyindiantai\\.org$\n^(.*\\.)?fw\\.cm$\n^(.*\\.)?fzh999\\.com$\n^(.*\\.)?fzh999\\.net$\n^(.*\\.)?fzlm\\.com$\n^(.*\\.)?g6hentai\\.com$\n^(.*\\.)?g-queen\\.com$\n^(.*\\.)?gabocorp\\.com$\n^(.*\\.)?gaforum\\.org$\n^(.*\\.)?galaxymacau\\.com$\n^(.*\\.)?galenwu\\.com$\n^(.*\\.)?galstars\\.net$\n^(.*\\.)?game735\\.com$\n^(.*\\.)?gamejolt\\.com$\n^(.*\\.)?gamousa\\.com$\n^(.*\\.)?gaoming\\.net$\n^(.*\\.)?ganges\\.com$\n^(.*\\.)?gaopi\\.net$\n^(.*\\.)?gaozhisheng\\.org$\n^(.*\\.)?gaozhisheng\\.net$\n^(.*\\.)?gardennetworks\\.com$\n^(.*\\.)?gardennetworks\\.org$\n^(.*\\.)?gartlive\\.com$\n^(.*\\.)?gather\\.com$\n^(.*\\.)?gaybubble\\.com$\n^(.*\\.)?gaycn\\.net$\n^(.*\\.)?gaymap\\.cc$\n^(.*\\.)?gaytube\\.com$\n^(.*\\.)?gazotube\\.com$\n^(.*\\.)?gclooney\\.com$\n^(.*\\.)?gcpnews\\.com$\n^(.*\\.)?gdbt\\.net$\n^(.*\\.)?gdzf\\.org$\n^(.*\\.)?geek-art\\.net$\n^(.*\\.)?geekerhome\\.com$\n^(.*\\.)?geekheart\\.info$\n^(.*\\.)?geekmanuals\\.com$\n^(.*\\.)?gelbooru\\.com$\n^(.*\\.)?geocities\\.com$\n^(.*\\.)?hk\\.geocities\\.com$\n^(.*\\.)?geohot\\.com$\n^(.*\\.)?geometrictools\\.com$\n^(.*\\.)?gerefoundation\\.org$\n^(.*\\.)?getchu\\.com$\n^(.*\\.)?getcloak\\.com$\n^(.*\\.)?getfreedur\\.com$\n^(.*\\.)?getgom\\.com$\n^(.*\\.)?getlantern\\.org$\n^(.*\\.)?getjetso\\.com$\n^(.*\\.)?getiton\\.com$\n^(.*\\.)?getsocialscope\\.com$\n^(.*\\.)?gfsale\\.com$\n^(.*\\.)?gfw\\.org\\.ua$\n^(.*\\.)?gfw\\.press$\n^(.*\\.)?ggssl\\.com$\n^(.*\\.)?ghost\\.org$\n^(.*\\.)?ghostpath\\.com$\n^(.*\\.)?ghut\\.org$\n^(.*\\.)?tw\\.gigacircle\\.com$\n^(.*\\.)?cn\\.giganews\\.com$\n^(.*\\.)?girlbanker\\.com$\n^(.*\\.)?git\\.io$\n^(.*\\.)?softwaredownload\\.gitbooks\\.io$\n^(.*\\.)?gist\\.github\\.com$\n^(.*\\.)?github\\.io$\n^(.*\\.)?gizlen\\.net$\n^(.*\\.)?gjczz\\.com$\n^(.*\\.)?glennhilton\\.com$\n^(.*\\.)?globaljihad\\.net$\n^(.*\\.)?globalmediaoutreach\\.com$\n^(.*\\.)?globalmuseumoncommunism\\.org$\n^(.*\\.)?globalrescue\\.net$\n^(.*\\.)?globaltm\\.org$\n^(.*\\.)?globalvoicesonline\\.org$\n^(.*\\.)?glock\\.com$\n^(.*\\.)?gluckman\\.com$\n^(.*\\.)?gmhz\\.org$\n^(.*\\.)?www\\.gmiddle\\.com$\n^(.*\\.)?www\\.gmiddle\\.net$\n^(.*\\.)?gmll\\.org$\n^(.*\\.)?go-pki\\.com$\n^(.*\\.)?goagent\\.biz$\n^(.*\\.)?goagentplus\\.com$\n^(.*\\.)?gobet\\.cc$\n^(.*\\.)?godfootsteps\\.org$\n^(.*\\.)?godns\\.work$\n^(.*\\.)?godsdirectcontact\\.org$\n^(.*\\.)?godsimmediatecontact\\.com$\n^(.*\\.)?gokbayrak\\.com$\n^(.*\\.)?goldbet\\.com$\n^(.*\\.)?goldbetsports\\.com$\n^(.*\\.)?goldenfrog\\.com$\n^(.*\\.)?goldstep\\.net$\n^(.*\\.)?goldwave\\.com$\n^(.*\\.)?gongmeng\\.info$\n^(.*\\.)?gongminliliang\\.com$\n^(.*\\.)?gongwt\\.com$\n^(.*\\.)?goodreads\\.com$\n^(.*\\.)?goodreaders\\.com$\n^(.*\\.)?goofind\\.com$\n^(.*\\.)?googlesile\\.com$\n^(.*\\.)?gopetition\\.com$\n^(.*\\.)?goproxing\\.net$\n^(.*\\.)?gotrusted\\.com$\n^(.*\\.)?gotw\\.ca$\n^(.*\\.)?grammaly\\.com$\n^(.*\\.)?grandtrial\\.org$\n^(.*\\.)?greatfirewall\\.biz$\n^(.*\\.)?greatfirewallofchina\\.net$\n^(.*\\.)?greatfirewallofchina\\.org$\n^(.*\\.)?greenpeace\\.org$\n^(.*\\.)?greenreadings\\.com$\n^(.*\\.)?great-firewall\\.com$\n^(.*\\.)?great-roc\\.org$\n^(.*\\.)?greatroc\\.org$\n^(.*\\.)?greatzhonghua\\.org$\n^(.*\\.)?gs-discuss\\.com$\n^(.*\\.)?gtricks\\.com$\n^(.*\\.)?guancha\\.org$\n^(.*\\.)?guardster\\.com$\n^(.*\\.)?gun-world\\.net$\n^(.*\\.)?gunsandammo\\.com$\n^(.*\\.)?gutteruncensored\\.com$\n^(.*\\.)?gzone-anime\\.info$\n^(.*\\.)?clementine-player\\.org$\n^(.*\\.)?echofon\\.com$\n^(.*\\.)?golang\\.org$\n^(.*\\.)?greasespot\\.net$\n^(.*\\.)?www\\.klip\\.me$\n^(.*\\.)?stephaniered\\.com$\n^(.*\\.)?ub0\\.cc$\n^(.*\\.)?gospelherald\\.com$\n^(.*\\.)?hk\\.gradconnection\\.com$\n^(.*\\.)?grangorz\\.org$\n^(.*\\.)?graylog2\\.org$\n^(.*\\.)?greatfire\\.org$\n^(.*\\.)?gstatic\\.com$\n^(.*\\.)?gu-chu-sum\\.org$\n^(.*\\.)?guishan\\.org$\n^(.*\\.)?gunsamerica\\.com$\n^(.*\\.)?gvlib\\.com$\n^(.*\\.)?gyalwarinpoche\\.com$\n^(.*\\.)?gyatsostudio\\.com$\n^(.*\\.)?h-china\\.org$\n^(.*\\.)?h-moe\\.com$\n^(.*\\.)?h1n1china\\.org$\n^(.*\\.)?hacg\\.club$\n^(.*\\.)?hacg\\.li$\n^(.*\\.)?hacg\\.red$\n^(.*\\.)?hacken\\.cc$\n^(.*\\.)?hackthatphone\\.net$\n^(.*\\.)?hahlo\\.com$\n^(.*\\.)?bbs\\.hanminzu\\.org$\n^(.*\\.)?hanunyi\\.com$\n^(.*\\.)?ae\\.hao123\\.com$\n^(.*\\.)?ar\\.hao123\\.com$\n^(.*\\.)?br\\.hao123\\.com$\n^(.*\\.)?en\\.hao123\\.com$\n^(.*\\.)?id\\.hao123\\.com$\n^(.*\\.)?jp\\.hao123\\.com$\n^(.*\\.)?ma\\.hao123\\.com$\n^(.*\\.)?mx\\.hao123\\.com$\n^(.*\\.)?sa\\.hao123\\.com$\n^(.*\\.)?th\\.hao123\\.com$\n^(.*\\.)?tw\\.hao123\\.com$\n^(.*\\.)?vn\\.hao123\\.com$\n^(.*\\.)?hk\\.hao123img\\.com$\n^(.*\\.)?ld\\.hao123img\\.com$\n^(.*\\.)?harunyahya\\.com$\n^(.*\\.)?hasaowall\\.com$\n^(.*\\.)?bbs\\.hasi\\.wang$\n^(.*\\.)?have8\\.com$\n^(.*\\.)?hdtvb\\.net$\n^(.*\\.)?hdzog\\.com$\n^(.*\\.)?heartyit\\.com$\n^(.*\\.)?hec\\.su$\n^(.*\\.)?hecaitou\\.net$\n^(.*\\.)?hechaji\\.com$\n^(.*\\.)?hegre-art\\.com$\n^(.*\\.)?cdn\\.helixstudios\\.net$\n^(.*\\.)?helplinfen\\.com$\n^(.*\\.)?helloandroid\\.com$\n^(.*\\.)?helloqueer\\.com$\n^(.*\\.)?hellotxt\\.com$\n^(.*\\.)?hentai\\.to$\n^(.*\\.)?hellouk\\.org$\n^(.*\\.)?helpeachpeople\\.com$\n^(.*\\.)?helpzhuling\\.org$\n^(.*\\.)?hentaivideoworld\\.com$\n^(.*\\.)?getcloudapp\\.com$\n^(.*\\.)?cl\\.ly$\n^(.*\\.)?getsmartlinks\\.com$\n^(.*\\.)?git-scm\\.com$\n^(.*\\.)?heqinglian\\.net$\n^(.*\\.)?heungkongdiscuss\\.com$\n^(.*\\.)?hexxeh\\.net$\n^(.*\\.)?app\\.heywire\\.com$\n^(.*\\.)?heyzo\\.com$\n^(.*\\.)?hgseav\\.com$\n^(.*\\.)?hhdcb3office\\.org$\n^(.*\\.)?hidden-advent\\.org$\n^(.*\\.)?hidecloud\\.com$\n^(.*\\.)?hide\\.me$\n^(.*\\.)?hideman\\.net$\n^(.*\\.)?hideme\\.nl$\n^(.*\\.)?hidemyass\\.com$\n^(.*\\.)?hidemycomp\\.com$\n^(.*\\.)?hihiforum\\.com$\n^(.*\\.)?hihistory\\.net$\n^(.*\\.)?higfw\\.com$\n^(.*\\.)?highpeakspureearth\\.com$\n^(.*\\.)?highrockmedia\\.com$\n^(.*\\.)?hiitch\\.com$\n^(.*\\.)?hikinggfw\\.org$\n^(.*\\.)?himalayan-foundation\\.org$\n^(.*\\.)?himalayanglacier\\.com$\n^(.*\\.)?himemix\\.com$\n^(.*\\.)?himemix\\.net$\n^(.*\\.)?times\\.hinet\\.net$\n^(.*\\.)?hizbuttahrir\\.org$\n^(.*\\.)?hizb-ut-tahrir\\.info$\n^(.*\\.)?hizb-ut-tahrir\\.org$\n^(.*\\.)?hjclub\\.info$\n^(.*\\.)?hk-pub\\.com$\n^(.*\\.)?hk01\\.com$\n^(.*\\.)?hk32168\\.com$\n^(.*\\.)?hkatvnews\\.com$\n^(.*\\.)?hkbc\\.net$\n^(.*\\.)?hkbf\\.org$\n^(.*\\.)?hkbookcity\\.com$\n^(.*\\.)?hkchurch\\.org$\n^(.*\\.)?hkcmi\\.edu$\n^(.*\\.)?hkcoc\\.com$\n^(.*\\.)?hkday\\.net$\n^(.*\\.)?hkdf\\.org$\n^(.*\\.)?hkej\\.com$\n^(.*\\.)?hkepc\\.com$\n^(.*\\.)?china\\.hket\\.com$\n^(.*\\.)?hkfaa\\.com$\n^(.*\\.)?hkfreezone\\.com$\n^(.*\\.)?hkfront\\.org$\n^(.*\\.)?m\\.hkgalden\\.com$\n^(.*\\.)?hkgolden\\.com$\n^(.*\\.)?hkgreenradio\\.org$\n^(.*\\.)?hkheadline\\.com$\n^(.*\\.)?hkhkhk\\.com$\n^(.*\\.)?hkjc\\.com$\n^(.*\\.)?hkjp\\.org$\n^(.*\\.)?hklft\\.com$\n^(.*\\.)?news\\.hkpeanut\\.com$\n^(.*\\.)?hkptu\\.org$\n^(.*\\.)?hkreporter\\.com$\n^(.*\\.)?hkusu\\.net$\n^(.*\\.)?hkvwet\\.com$\n^(.*\\.)?hkzone\\.org$\n^(.*\\.)?hnjhj\\.com$\n^(.*\\.)?hnntube\\.com$\n^(.*\\.)?hola\\.com$\n^(.*\\.)?hola\\.org$\n^(.*\\.)?holymountaincn\\.com$\n^(.*\\.)?holyspiritspeaks\\.org$\n^(.*\\.)?derekhsu\\.homeip\\.net$\n^(.*\\.)?homeperversion\\.com$\n^(.*\\.)?homeservershow\\.com$\n^(.*\\.)?old\\.honeynet\\.org$\n^(.*\\.)?hongkongfp\\.com$\n^(.*\\.)?hongmeimei\\.com$\n^(.*\\.)?hongzhi\\.li$\n^(.*\\.)?hootsuite\\.com$\n^(.*\\.)?hopto\\.org$\n^(.*\\.)?hornygamer\\.com$\n^(.*\\.)?hotgoo\\.com$\n^(.*\\.)?hotpornshow\\.com$\n^(.*\\.)?hotshame\\.com$\n^(.*\\.)?hotspotshield\\.com$\n^(.*\\.)?hougaige\\.com$\n^(.*\\.)?howtoforge\\.com$\n^(.*\\.)?hqcdp\\.org$\n^(.*\\.)?hqmovies\\.com$\n^(.*\\.)?hrcir\\.com$\n^(.*\\.)?hrcchina\\.org$\n^(.*\\.)?hrea\\.org$\n^(.*\\.)?hrichina\\.org$\n^(.*\\.)?hrw\\.org$\n^(.*\\.)?hrweb\\.org$\n^(.*\\.)?hsjp\\.net$\n^(.*\\.)?hsselite\\.com$\n^(.*\\.)?hstern\\.net$\n^(.*\\.)?hstt\\.net$\n^(.*\\.)?htkou\\.net$\n^(.*\\.)?htmldog\\.com$\n^(.*\\.)?hua-yue\\.net$\n^(.*\\.)?huaglad\\.com$\n^(.*\\.)?huanghuagang\\.org$\n^(.*\\.)?huangyiyu\\.com$\n^(.*\\.)?huaren\\.us$\n^(.*\\.)?huaxia-news\\.com$\n^(.*\\.)?huaxiabao\\.org$\n^(.*\\.)?huaxin\\.ph$\n^(.*\\.)?huayuworld\\.org$\n^(.*\\.)?huffingtonpost\\.com$\n^(.*\\.)?huhaitai\\.com$\n^(.*\\.)?huhamhire\\.com$\n^(.*\\.)?hulkshare\\.com$\n^(.*\\.)?humanrightsbriefing\\.org$\n^(.*\\.)?hung-ya\\.com$\n^(.*\\.)?hungerstrikeforaids\\.org$\n^(.*\\.)?huping\\.net$\n^(.*\\.)?hurgokbayrak\\.com$\n^(.*\\.)?hurriyet\\.com\\.tr$\n^(.*\\.)?hutianyi\\.net$\n^(.*\\.)?hutong9\\.net$\n^(.*\\.)?huyandex\\.com$\n^(.*\\.)?hwinfo\\.com$\n^(.*\\.)?fang-lizhi\\.hxwk\\.org$\n^(.*\\.)?hxwq\\.org$\n^(.*\\.)?hyperrate\\.com$\n^(.*\\.)?i2runner\\.com$\n^(.*\\.)?i818hk\\.com$\n^(.*\\.)?i-cable\\.com$\n^(.*\\.)?iask\\.ca$\n^(.*\\.)?iask\\.bz$\n^(.*\\.)?iav19\\.com$\n^(.*\\.)?ibiblio\\.org$\n^(.*\\.)?iblist\\.com$\n^(.*\\.)?iblogserv-f\\.net$\n^(.*\\.)?ibros\\.org$\n^(.*\\.)?cn\\.ibtimes\\.com$\n^(.*\\.)?icams\\.com$\n^(.*\\.)?blogs\\.icerocket\\.com$\n^(.*\\.)?icij\\.org$\n^(.*\\.)?icl-fi\\.org$\n^(.*\\.)?icoco\\.com$\n^(.*\\.)?furbo\\.org$\n^(.*\\.)?warbler\\.iconfactory\\.net$\n^(.*\\.)?iconpaper\\.org$\n^(.*\\.)?icu-project\\.org$\n^(.*\\.)?w\\.idaiwan\\.com$\n^(.*\\.)?idemocracy\\.asia$\n^(.*\\.)?identi\\.ca$\n^(.*\\.)?idiomconnection\\.com$\n^(.*\\.)?www\\.idlcoyote\\.com$\n^(.*\\.)?idouga\\.com$\n^(.*\\.)?idreamx\\.com$\n^(.*\\.)?forum\\.idsam\\.com$\n^(.*\\.)?ieasynews\\.net$\n^(.*\\.)?ied2k\\.net$\n^(.*\\.)?ienergy1\\.com$\n^(.*\\.)?if\\.ttt$\n^(.*\\.)?ifanqiang\\.com$\n^(.*\\.)?ifanr\\.com$\n^(.*\\.)?ifcss\\.org$\n^(.*\\.)?ifjc\\.org$\n^(.*\\.)?ift\\.tt$\n^(.*\\.)?ifreewares\\.com$\n^(.*\\.)?igcd\\.net$\n^(.*\\.)?igfw\\.net$\n^(.*\\.)?ignitedetroit\\.net$\n^(.*\\.)?igvita\\.com$\n^(.*\\.)?ihakka\\.net$\n^(.*\\.)?ihao\\.org$\n^(.*\\.)?iicns\\.com$\n^(.*\\.)?illusionfactory\\.com$\n^(.*\\.)?ilove80\\.be$\n^(.*\\.)?imagefap\\.com$\n^(.*\\.)?imageflea\\.com$\n^(.*\\.)?imageshack\\.us$\n^(.*\\.)?imagevenue\\.com$\n^(.*\\.)?imagezilla\\.net$\n^(.*\\.)?imb\\.org$\n^(.*\\.)?www\\.imdb\\.com$\n^(.*\\.)?imdb\\.com$\n^(.*\\.)?img\\.ly$\n^(.*\\.)?imkev\\.com$\n^(.*\\.)?imlive\\.com$\n^(.*\\.)?impp\\.mn$\n^(.*\\.)?tech2\\.in\\.com$\n^(.*\\.)?in99\\.org$\n^(.*\\.)?in-disguise\\.com$\n^(.*\\.)?incapdns\\.net$\n^(.*\\.)?incloak\\.com$\n^(.*\\.)?timesofindia\\.indiatimes\\.com$\n^(.*\\.)?indiemerch\\.com$\n^(.*\\.)?website\\.informer\\.com$\n^(.*\\.)?initiativesforchina\\.org$\n^(.*\\.)?inkui\\.com$\n^(.*\\.)?inmediahk\\.net$\n^(.*\\.)?innermongolia\\.org$\n^(.*\\.)?blog\\.inoreader\\.com$\n^(.*\\.)?insecam\\.org$\n^(.*\\.)?instagram\\.com$\n^(.*\\.)?institut-tibetain\\.org$\n^(.*\\.)?interfaceaddiction\\.com$\n^(.*\\.)?internationalrivers\\.org$\n^(.*\\.)?internet\\.org$\n^(.*\\.)?internetdefenseleague\\.org$\n^(.*\\.)?internetfreedom\\.org$\n^(.*\\.)?internetpopculture\\.com$\n^(.*\\.)?inxian\\.com$\n^(.*\\.)?ipalter\\.com$\n^(.*\\.)?iphone4hongkong\\.com$\n^(.*\\.)?iphonehacks\\.com$\n^(.*\\.)?iphonetaiwan\\.org$\n^(.*\\.)?ipjetable\\.net$\n^(.*\\.)?ipobar\\.com$\n^(.*\\.)?iportal\\.me$\n^(.*\\.)?ippotv\\.com$\n^(.*\\.)?ipredator\\.se$\n^(.*\\.)?ipvanish\\.com$\n^(.*\\.)?iredmail\\.org$\n^(.*\\.)?chinese\\.irib\\.ir$\n^(.*\\.)?ironicsoftware\\.com$\n^(.*\\.)?ironbigfools\\.compython\\.net$\n^(.*\\.)?ironpython\\.net$\n^(.*\\.)?is\\.gd$\n^(.*\\.)?islamawareness\\.net$\n^(.*\\.)?islamhouse\\.com$\n^(.*\\.)?islamicity\\.com$\n^(.*\\.)?islamicpluralism\\.org$\n^(.*\\.)?islamtoday\\.net$\n^(.*\\.)?isaacmao\\.com$\n^(.*\\.)?isgreat\\.org$\n^(.*\\.)?ismaelan\\.com$\n^(.*\\.)?ismalltits\\.com$\n^(.*\\.)?ismprofessional\\.net$\n^(.*\\.)?isohunt\\.com$\n^(.*\\.)?israbox\\.com$\n^(.*\\.)?istars\\.co\\.nz$\n^(.*\\.)?oversea\\.istarshine\\.com$\n^(.*\\.)?blog\\.istef\\.info$\n^(.*\\.)?istiqlalhewer\\.com$\n^(.*\\.)?istockphoto\\.com$\n^(.*\\.)?isunaffairs\\.com$\n^(.*\\.)?isuntv\\.com$\n^(.*\\.)?itaboo\\.info$\n^(.*\\.)?italiatibet\\.org$\n^(.*\\.)?itshidden\\.com$\n^(.*\\.)?itsky\\.it$\n^(.*\\.)?itweet\\.net$\n^(.*\\.)?iu45\\.com$\n^(.*\\.)?iuhrdf\\.org$\n^(.*\\.)?iuksky\\.com$\n^(.*\\.)?ivacy\\.com$\n^(.*\\.)?iverycd\\.com$\n^(.*\\.)?ixquick\\.com$\n^(.*\\.)?ixxx\\.com$\n^(.*\\.)?iyouport\\.com$\n^(.*\\.)?izaobao\\.us$\n^(.*\\.)?gmozomg\\.izihost\\.org$\n^(.*\\.)?izles\\.net$\n^(.*\\.)?izlesem\\.org$\n^(.*\\.)?j\\.mp$\n^(.*\\.)?blog\\.jackjia\\.com$\n^(.*\\.)?jamaat\\.org$\n^(.*\\.)?jamyangnorbu\\.com$\n^(.*\\.)?janwongphoto\\.com$\n^(.*\\.)?japan-whores\\.com$\n^(.*\\.)?javhip\\.com$\n^(.*\\.)?javakiba\\.org$\n^(.*\\.)?javbus\\.com$\n^(.*\\.)?javfor\\.me$\n^(.*\\.)?javmoo\\.com$\n^(.*\\.)?javseen\\.com$\n^(.*\\.)?jbtalks\\.cc$\n^(.*\\.)?jbtalks\\.com$\n^(.*\\.)?jbtalks\\.my$\n^(.*\\.)?jdwsy\\.com$\n^(.*\\.)?jeanyim\\.com$\n^(.*\\.)?jgoodies\\.com$\n^(.*\\.)?jiangweiping\\.com$\n^(.*\\.)?jiaoyou8\\.com$\n^(.*\\.)?jiehua\\.cz$\n^(.*\\.)?hk\\.jiepang\\.com$\n^(.*\\.)?tw\\.jiepang\\.com$\n^(.*\\.)?jieshibaobao\\.com$\n^(.*\\.)?56cun04\\.jigsy\\.com$\n^(.*\\.)?jigong1024\\.com$\n^(.*\\.)?daodu14\\.jigsy\\.com$\n^(.*\\.)?specxinzl\\.jigsy\\.com$\n^(.*\\.)?wlcnew\\.jigsy\\.com$\n^(.*\\.)?jinbushe\\.org$\n^(.*\\.)?jingsim\\.org$\n^(.*\\.)?jingpin\\.org$\n^(.*\\.)?jinpianwang\\.com$\n^(.*\\.)?ac\\.jiruan\\.net$\n^(.*\\.)?jitouch\\.com$\n^(.*\\.)?jizzthis\\.com$\n^(.*\\.)?jjgirls\\.com$\n^(.*\\.)?jkb\\.cc$\n^(.*\\.)?jkforum\\.net$\n^(.*\\.)?joachims\\.org$\n^(.*\\.)?joeedelman\\.com$\n^(.*\\.)?journalchretien\\.net$\n^(.*\\.)?journalofdemocracy\\.org$\n^(.*\\.)?jpopforum\\.net$\n^(.*\\.)?juhuaren\\.com$\n^(.*\\.)?juliereyc\\.com$\n^(.*\\.)?junauza\\.com$\n^(.*\\.)?june4commemoration\\.org$\n^(.*\\.)?junefourth-20\\.net$\n^(.*\\.)?justicefortenzin\\.org$\n^(.*\\.)?justpaste\\.it$\n^(.*\\.)?justtristan\\.com$\n^(.*\\.)?juyuange\\.org$\n^(.*\\.)?juziyue\\.com$\n^(.*\\.)?jwmusic\\.org$\n^(.*\\.)?jyxf\\.net$\n^(.*\\.)?ka-wai\\.com$\n^(.*\\.)?kagyuoffice\\.org$\n^(.*\\.)?kakao\\.com$\n^(.*\\.)?kankan\\.today$\n^(.*\\.)?kannewyork\\.com$\n^(.*\\.)?kanshifang\\.com$\n^(.*\\.)?kanzhongguo\\.com$\n^(.*\\.)?kaotic\\.com$\n^(.*\\.)?karayou\\.com$\n^(.*\\.)?karkhung\\.com$\n^(.*\\.)?karmapa\\.org$\n^(.*\\.)?karmapa-teachings\\.org$\n^(.*\\.)?kba-tx\\.org$\n^(.*\\.)?kcoolonline\\.com$\n^(.*\\.)?kcsoftwares\\.com$\n^(.*\\.)?kebrum\\.com$\n^(.*\\.)?kechara\\.com$\n^(.*\\.)?keepandshare\\.com$\n^(.*\\.)?kendincos\\.net$\n^(.*\\.)?kenengba\\.com$\n^(.*\\.)?keontech\\.net$\n^(.*\\.)?kepard\\.com$\n^(.*\\.)?keycdn\\.com$\n^(.*\\.)?khabdha\\.org$\n^(.*\\.)?kichiku-doujinko\\.com$\n^(.*\\.)?kindleren\\.com$\n^(.*\\.)?www\\.kindleren\\.com$\n^(.*\\.)?kingdomsalvation\\.org$\n^(.*\\.)?kinghost\\.com$\n^(.*\\.)?kink\\.com$\n^(.*\\.)?killwall\\.com$\n^(.*\\.)?kiwi\\.kz$\n^(.*\\.)?knowledgerush\\.com$\n^(.*\\.)?kodingen\\.com$\n^(.*\\.)?kompozer\\.net$\n^(.*\\.)?konachan\\.com$\n^(.*\\.)?koolsolutions\\.com$\n^(.*\\.)?koornk\\.com$\n^(.*\\.)?koranmandarin\\.com$\n^(.*\\.)?ktzhk\\.com$\n^(.*\\.)?kui\\.name$\n^(.*\\.)?kun\\.im$\n^(.*\\.)?kurashsultan\\.com$\n^(.*\\.)?kurtmunger\\.com$\n^(.*\\.)?kusocity\\.com$\n^(.*\\.)?kusos\\.com$\n^(.*\\.)?kwcg\\.ca$\n^(.*\\.)?kwongwah\\.com\\.my$\n^(.*\\.)?kyohk\\.net$\n^(.*\\.)?kzeng\\.info$\n^(.*\\.)?la-forum\\.org$\n^(.*\\.)?ladbrokes\\.com$\n^(.*\\.)?labiennale\\.org$\n^(.*\\.)?lagranepoca\\.com$\n^(.*\\.)?lalulalu\\.com$\n^(.*\\.)?lamayeshe\\.com$\n^(.*\\.)?www\\.lamenhu\\.com$\n^(.*\\.)?lamrim\\.com$\n^(.*\\.)?lantosfoundation\\.org$\n^(.*\\.)?laogai\\.org$\n^(.*\\.)?laomiu\\.com$\n^(.*\\.)?laoyang\\.info$\n^(.*\\.)?laptoplockdown\\.com$\n^(.*\\.)?laqingdan\\.net$\n^(.*\\.)?larsgeorge\\.com$\n^(.*\\.)?lastcombat\\.com$\n^(.*\\.)?lastfm\\.es$\n^(.*\\.)?latelinenews\\.com$\n^(.*\\.)?latibet\\.org$\n^(.*\\.)?lefora\\.com$\n^(.*\\.)?legalporno\\.com$\n^(.*\\.)?leirentv\\.ca$\n^(.*\\.)?leisurecafe\\.ca$\n^(.*\\.)?lematin\\.ch$\n^(.*\\.)?lenwhite\\.com$\n^(.*\\.)?lerosua\\.org$\n^(.*\\.)?blog\\.lester850\\.info$\n^(.*\\.)?lesoir\\.be$\n^(.*\\.)?letscorp\\.net$\n^(.*\\.)?lhakar\\.org$\n^(.*\\.)?lhasocialwork\\.org$\n^(.*\\.)?liangyou\\.net$\n^(.*\\.)?lianyue\\.net$\n^(.*\\.)?liaowangxizang\\.net$\n^(.*\\.)?blogs\\.libraryinformationtechnology\\.com$\n^(.*\\.)?lidecheng\\.com$\n^(.*\\.)?limiao\\.net$\n^(.*\\.)?linkuswell\\.com$\n^(.*\\.)?abitno\\.linpie\\.com$\n^(.*\\.)?line\\.me$\n^(.*\\.)?linglingfa\\.com$\n^(.*\\.)?lingvodics\\.com$\n^(.*\\.)?linkideo\\.com$\n^(.*\\.)?api\\.linksalpha\\.com$\n^(.*\\.)?apidocs\\.linksalpha\\.com$\n^(.*\\.)?www\\.linksalpha\\.com$\n^(.*\\.)?help\\.linksalpha\\.com$\n^(.*\\.)?linuxtoy\\.org$\n^(.*\\.)?lionsroar\\.com$\n^(.*\\.)?lipuman\\.com$\n^(.*\\.)?greatfire\\.us7\\.list-manage\\.com$\n^(.*\\.)?listentoyoutube\\.com$\n^(.*\\.)?listorious\\.com$\n^(.*\\.)?liudejun\\.com$\n^(.*\\.)?liuhanyu\\.com$\n^(.*\\.)?liujianshu\\.com$\n^(.*\\.)?liuxiaotong\\.com$\n^(.*\\.)?liveleak\\.com$\n^(.*\\.)?livestation\\.com$\n^(.*\\.)?livestream\\.com$\n^(.*\\.)?livingonline\\.us$\n^(.*\\.)?livingstream\\.com$\n^(.*\\.)?livevideo\\.com$\n^(.*\\.)?liwangyang\\.com$\n^(.*\\.)?lizhizhuangbi\\.com$\n^(.*\\.)?lkcn\\.net$\n^(.*\\.)?load\\.to$\n^(.*\\.)?lobsangwangyal\\.com$\n^(.*\\.)?localdomain\\.ws$\n^(.*\\.)?localpresshk\\.com$\n^(.*\\.)?lockdown\\.com$\n^(.*\\.)?lockestek\\.com$\n^(.*\\.)?logbot\\.net$\n^(.*\\.)?logiqx\\.com$\n^(.*\\.)?secure\\.logmein\\.com$\n^(.*\\.)?logmike\\.com$\n^(.*\\.)?londonchinese\\.ca$\n^(.*\\.)?longtermly\\.net$\n^(.*\\.)?lookingglasstheatre\\.org$\n^(.*\\.)?lookpic\\.com$\n^(.*\\.)?looktoronto\\.com$\n^(.*\\.)?lotsawahouse\\.org$\n^(.*\\.)?lpsg\\.com$\n^(.*\\.)?lrfz\\.com$\n^(.*\\.)?lrip\\.org$\n^(.*\\.)?lsforum\\.net$\n^(.*\\.)?lsm\\.org$\n^(.*\\.)?lsmchinese\\.org$\n^(.*\\.)?lsmkorean\\.org$\n^(.*\\.)?lsmradio\\.com$\n^(.*\\.)?lsmwebcast\\.com$\n^(.*\\.)?luke54\\.com$\n^(.*\\.)?luke54\\.org$\n^(.*\\.)?lupm\\.org$\n^(.*\\.)?lushstories\\.com$\n^(.*\\.)?luxebc\\.com$\n^(.*\\.)?lvhai\\.org$\n^(.*\\.)?lvv2\\.com$\n^(.*\\.)?lyfhk\\.net$\n^(.*\\.)?m-team\\.cc$\n^(.*\\.)?mad-ar\\.ch$\n^(.*\\.)?madthumbs\\.com$\n^(.*\\.)?magic-net\\.info$\n^(.*\\.)?mahabodhi\\.org$\n^(.*\\.)?maiplus\\.com$\n^(.*\\.)?maplew\\.com$\n^(.*\\.)?marc\\.info$\n^(.*\\.)?marguerite\\.su$\n^(.*\\.)?martincartoons\\.com$\n^(.*\\.)?maskedip\\.com$\n^(.*\\.)?maiio\\.net$\n^(.*\\.)?mail-archive\\.com$\n^(.*\\.)?malaysiakini\\.com$\n^(.*\\.)?makemymood\\.com$\n^(.*\\.)?maniash\\.com$\n^(.*\\.)?mansion\\.com$\n^(.*\\.)?mansionpoker\\.com$\n^(.*\\.)?martau\\.com$\n^(.*\\.)?blog\\.martinoei\\.com$\n^(.*\\.)?martsangkagyuofficial\\.org$\n^(.*\\.)?maruta\\.be$\n^(.*\\.)?marxist\\.com$\n^(.*\\.)?marxist\\.net$\n^(.*\\.)?marxists\\.org$\n^(.*\\.)?matainja\\.com$\n^(.*\\.)?mathable\\.io$\n^(.*\\.)?mathiew-badimon\\.com$\n^(.*\\.)?matsushimakaede\\.com$\n^(.*\\.)?maturejp\\.com$\n^(.*\\.)?mayimayi\\.com$\n^(.*\\.)?mcaf\\.ee$\n^(.*\\.)?mcadforums\\.com$\n^(.*\\.)?mcfog\\.com$\n^(.*\\.)?mcreasite\\.com$\n^(.*\\.)?md-t\\.org$\n^(.*\\.)?mediachinese\\.com$\n^(.*\\.)?mediafire\\.com$\n^(.*\\.)?mediafreakcity\\.com$\n^(.*\\.)?medium\\.com$\n^(.*\\.)?meetup\\.com$\n^(.*\\.)?mefeedia\\.com$\n^(.*\\.)?megaporn\\.com$\n^(.*\\.)?megarotic\\.com$\n^(.*\\.)?megavideo\\.com$\n^(.*\\.)?megurineluka\\.com$\n^(.*\\.)?meirixiaochao\\.com$\n^(.*\\.)?melon-peach\\.com$\n^(.*\\.)?meltoday\\.com$\n^(.*\\.)?memehk\\.com$\n^(.*\\.)?memorybbs\\.com$\n^(.*\\.)?memri\\.org$\n^(.*\\.)?memrijttm\\.org$\n^(.*\\.)?mercyprophet\\.org$\n^(.*\\.)?meridian-trust\\.org$\n^(.*\\.)?meripet\\.biz$\n^(.*\\.)?meripet\\.com$\n^(.*\\.)?meshrep\\.com$\n^(.*\\.)?mesotw\\.com$\n^(.*\\.)?metacafe\\.com$\n^(.*\\.)?meteorshowersonline\\.com$\n^(.*\\.)?www\\.metro\\.taipei$\n^(.*\\.)?metrolife\\.ca$\n^(.*\\.)?meyul\\.com$\n^(.*\\.)?mgoon\\.com$\n^(.*\\.)?mgstage\\.com$\n^(.*\\.)?mh4u\\.org$\n^(.*\\.)?mhradio\\.org$\n^(.*\\.)?michaelanti\\.com$\n^(.*\\.)?michaelmarketl\\.com$\n^(.*\\.)?middle-way\\.net$\n^(.*\\.)?mihr\\.com$\n^(.*\\.)?mihua\\.org$\n^(.*\\.)?mikesoltys\\.com$\n^(.*\\.)?milph\\.net$\n^(.*\\.)?milsurps\\.com$\n^(.*\\.)?mimiai\\.net$\n^(.*\\.)?mimivip\\.com$\n^(.*\\.)?mimivv\\.com$\n^(.*\\.)?mindrolling\\.org$\n^(.*\\.)?minghui\\.or\\.kr$\n^(.*\\.)?minghui\\.org$\n^(.*\\.)?minghui-a\\.org$\n^(.*\\.)?minghui-b\\.org$\n^(.*\\.)?minghui-school\\.org$\n^(.*\\.)?mingjinglishi\\.com$\n^(.*\\.)?mingjingnews\\.com$\n^(.*\\.)?mingjingtimes\\.com$\n^(.*\\.)?mingpao\\.com$\n^(.*\\.)?mingpaocanada\\.com$\n^(.*\\.)?mingpaomonthly\\.com$\n^(.*\\.)?mingpaonews\\.com$\n^(.*\\.)?mingpaony\\.com$\n^(.*\\.)?mingpaosf\\.com$\n^(.*\\.)?mingpaotor\\.com$\n^(.*\\.)?mingpaovan\\.com$\n^(.*\\.)?mingshengbao\\.com$\n^(.*\\.)?minhhue\\.net$\n^(.*\\.)?miniforum\\.org$\n^(.*\\.)?ministrybooks\\.org$\n^(.*\\.)?minzhuhua\\.net$\n^(.*\\.)?minzhuzhanxian\\.com$\n^(.*\\.)?minzhuzhongguo\\.org$\n^(.*\\.)?miroguide\\.com$\n^(.*\\.)?mirrorbooks\\.com$\n^(.*\\.)?thecenter\\.mit\\.edu$\n^(.*\\.)?mitbbs\\.com$\n^(.*\\.)?mixero\\.com$\n^(.*\\.)?mixpod\\.com$\n^(.*\\.)?mixx\\.com$\n^(.*\\.)?mizzmona\\.com$\n^(.*\\.)?mk5000\\.com$\n^(.*\\.)?mlcool\\.com$\n^(.*\\.)?mmaaxx\\.com$\n^(.*\\.)?plurktop\\.mmdays\\.com$\n^(.*\\.)?mmmca\\.com$\n^(.*\\.)?mobatek\\.net$\n^(.*\\.)?mobile01\\.com$\n^(.*\\.)?mobypicture\\.com$\n^(.*\\.)?moby\\.to$\n^(.*\\.)?moeerolibrary\\.com$\n^(.*\\.)?wiki\\.moegirl\\.org$\n^(.*\\.)?mofos\\.com$\n^(.*\\.)?mog\\.com$\n^(.*\\.)?molihua\\.org$\n^(.*\\.)?mondex\\.org$\n^(.*\\.)?www\\.monlamit\\.org$\n^(.*\\.)?moonbbs\\.com$\n^(.*\\.)?c1522\\.mooo\\.com$\n^(.*\\.)?monitorchina\\.org$\n^(.*\\.)?bbs\\.morbell\\.com$\n^(.*\\.)?morningsun\\.org$\n^(.*\\.)?moroneta\\.com$\n^(.*\\.)?motherless\\.com$\n^(.*\\.)?mousebreaker\\.com$\n^(.*\\.)?movements\\.org$\n^(.*\\.)?moviefap\\.com$\n^(.*\\.)?www\\.moztw\\.org$\n^(.*\\.)?mp3buscador\\.com$\n^(.*\\.)?mpettis\\.com$\n^(.*\\.)?mpfinance\\.com$\n^(.*\\.)?mpinews\\.com$\n^(.*\\.)?mrtweet\\.com$\n^(.*\\.)?news\\.hk\\.msn\\.com$\n^(.*\\.)?msguancha\\.com$\n^(.*\\.)?mswe1\\.org$\n^(.*\\.)?mthruf\\.com$\n^(.*\\.)?muchosucko\\.com$\n^(.*\\.)?multiply\\.com$\n^(.*\\.)?multiupload\\.com$\n^(.*\\.)?mullvad\\.net$\n^(.*\\.)?mummysgold\\.com$\n^(.*\\.)?musicade\\.net$\n^(.*\\.)?muslimvideo\\.com$\n^(.*\\.)?muzi\\.com$\n^(.*\\.)?muzi\\.net$\n^(.*\\.)?mx981\\.com$\n^(.*\\.)?my-formosa\\.com$\n^(.*\\.)?forum\\.my903\\.com$\n^(.*\\.)?myactimes\\.com$\n^(.*\\.)?myaudiocast\\.com$\n^(.*\\.)?mybbs\\.us$\n^(.*\\.)?myca168\\.com$\n^(.*\\.)?bbs\\.mychat\\.to$\n^(.*\\.)?mychinamyhome\\.com$\n^(.*\\.)?mychinanet\\.com$\n^(.*\\.)?mychinanews\\.com$\n^(.*\\.)?mycnnews\\.com$\n^(.*\\.)?mykomica\\.org$\n^(.*\\.)?mycould\\.com$\n^(.*\\.)?myeasytv\\.com$\n^(.*\\.)?myeclipseide\\.com$\n^(.*\\.)?myfreepaysite\\.com$\n^(.*\\.)?myfreshnet\\.com$\n^(.*\\.)?forum\\.mymaji\\.com$\n^(.*\\.)?mymediarom\\.com$\n^(.*\\.)?myparagliding\\.com$\n^(.*\\.)?mypopescu\\.com$\n^(.*\\.)?mysinablog\\.com$\n^(.*\\.)?myspace\\.com$\n^(.*\\.)?mytalkbox\\.com$\n^(.*\\.)?mytizi\\.com$\n^(.*\\.)?naacoalition\\.org$\n^(.*\\.)?old\\.nabble\\.com$\n^(.*\\.)?naitik\\.net$\n^(.*\\.)?nakuz\\.com$\n^(.*\\.)?nalandabodhi\\.org$\n^(.*\\.)?nalandawest\\.org$\n^(.*\\.)?namgyal\\.org$\n^(.*\\.)?namgyalmonastery\\.org$\n^(.*\\.)?namsisi\\.com$\n^(.*\\.)?nanyang\\.com$\n^(.*\\.)?nanyangpost\\.com$\n^(.*\\.)?nanzao\\.com$\n^(.*\\.)?jpl\\.nasa\\.gov$\n^(.*\\.)?pds\\.nasa\\.gov$\n^(.*\\.)?solarsystem\\.nasa\\.gov$\n^(.*\\.)?nakido\\.com$\n^(.*\\.)?naol\\.ca$\n^(.*\\.)?cyberghost\\.natado\\.com$\n^(.*\\.)?news\\.nationalgeographic\\.com$\n^(.*\\.)?nationsonline\\.org$\n^(.*\\.)?navyfamily\\.navy\\.mil$\n^(.*\\.)?navyreserve\\.navy\\.mil$\n^(.*\\.)?nko\\.navy\\.mil$\n^(.*\\.)?usno\\.navy\\.mil$\n^(.*\\.)?ncn\\.org$\n^(.*\\.)?etools\\.ncol\\.com$\n^(.*\\.)?ned\\.org$\n^(.*\\.)?nekoslovakia\\.net$\n^(.*\\.)?bbs\\.netbig\\.com$\n^(.*\\.)?netbirds\\.com$\n^(.*\\.)?netcolony\\.com$\n^(.*\\.)?bolin\\.netfirms\\.com$\n^(.*\\.)?netme\\.cc$\n^(.*\\.)?netsneak\\.com$\n^(.*\\.)?network54\\.com$\n^(.*\\.)?networkedblogs\\.com$\n^(.*\\.)?new-3lunch\\.net$\n^(.*\\.)?new-akiba\\.com$\n^(.*\\.)?new96\\.ca$\n^(.*\\.)?newcenturymc\\.com$\n^(.*\\.)?newcenturynews\\.com$\n^(.*\\.)?newchen\\.com$\n^(.*\\.)?newgrounds\\.com$\n^(.*\\.)?newipnow\\.com$\n^(.*\\.)?newnews\\.ca$\n^(.*\\.)?newscn\\.org$\n^(.*\\.)?newsminer\\.com$\n^(.*\\.)?newspeak\\.cc$\n^(.*\\.)?newsancai\\.com$\n^(.*\\.)?newsdh\\.com$\n^(.*\\.)?newstamago\\.com$\n^(.*\\.)?newstapa\\.org$\n^(.*\\.)?newstarnet\\.com$\n^(.*\\.)?newyorktimes\\.com$\n^(.*\\.)?nexon\\.com$\n^(.*\\.)?nextmedia\\.com$\n^(.*\\.)?co\\.ng\\.mil$\n^(.*\\.)?nga\\.mil$\n^(.*\\.)?ngensis\\.com$\n^(.*\\.)?nhentai\\.net$\n^(.*\\.)?nighost\\.org$\n^(.*\\.)?av\\.nightlife141\\.com$\n^(.*\\.)?ninecommentaries\\.com$\n^(.*\\.)?ninjacloak\\.com$\n^(.*\\.)?nintendium\\.com$\n^(.*\\.)?taiwanyes\\.ning\\.com$\n^(.*\\.)?usmgtcg\\.ning\\.com$\n^(.*\\.)?niusnews\\.com$\n^(.*\\.)?njactb\\.org$\n^(.*\\.)?njuice\\.com$\n^(.*\\.)?no-ip\\.org$\n^(.*\\.)?nobel\\.se$\n^(.*\\.)?nobelprize\\.org$\n^(.*\\.)?nobodycanstop\\.us$\n^(.*\\.)?nokogiri\\.org$\n^(.*\\.)?nokola\\.com$\n^(.*\\.)?norbulingka\\.org$\n^(.*\\.)?novelasia\\.com$\n^(.*\\.)?news\\.now\\.com$\n^(.*\\.)?nownews\\.com$\n^(.*\\.)?nowtorrents\\.com$\n^(.*\\.)?noypf\\.com$\n^(.*\\.)?npnt\\.me$\n^(.*\\.)?nps\\.gov$\n^(.*\\.)?nrk\\.no$\n^(.*\\.)?ntdtv\\.com$\n^(.*\\.)?ntdtv\\.co\\.kr$\n^(.*\\.)?ntdtv\\.ca$\n^(.*\\.)?ntdtv\\.org$\n^(.*\\.)?ntdtvla\\.com$\n^(.*\\.)?ntrfun\\.com$\n^(.*\\.)?nubiles\\.net$\n^(.*\\.)?nuexpo\\.com$\n^(.*\\.)?nukistream\\.com$\n^(.*\\.)?nurgo-software\\.com$\n^(.*\\.)?nuvid\\.com$\n^(.*\\.)?nuzcom\\.com$\n^(.*\\.)?nvquan\\.org$\n^(.*\\.)?nwtca\\.org$\n^(.*\\.)?nyaa\\.se$\n^(.*\\.)?nydus\\.ca$\n^(.*\\.)?nylon-angel\\.com$\n^(.*\\.)?nylonstockingsonline\\.com$\n^(.*\\.)?nytco\\.com$\n^(.*\\.)?nyti\\.ms$\n^(.*\\.)?nytimes\\.com$\n^(.*\\.)?nytimg\\.com$\n^(.*\\.)?userapi\\.nytlog\\.com$\n^(.*\\.)?nysingtao\\.com$\n^(.*\\.)?nzchinese\\.com$\n^(.*\\.)?nzchinese\\.net\\.nz$\n^(.*\\.)?observechina\\.net$\n^(.*\\.)?obutu\\.com$\n^(.*\\.)?ocaspro\\.com$\n^(.*\\.)?occupytiananmen\\.com$\n^(.*\\.)?ocreampies\\.com$\n^(.*\\.)?october-review\\.org$\n^(.*\\.)?offbeatchina\\.com$\n^(.*\\.)?officeoftibet\\.com$\n^(.*\\.)?ogaoga\\.org$\n^(.*\\.)?twtr2src\\.ogaoga\\.org$\n^(.*\\.)?www2\\.ohchr\\.org$\n^(.*\\.)?oiktv\\.com$\n^(.*\\.)?oizoblog\\.com$\n^(.*\\.)?okayfreedom\\.com$\n^(.*\\.)?filmy\\.olabloga\\.pl$\n^(.*\\.)?old-cat\\.net$\n^(.*\\.)?olumpo\\.com$\n^(.*\\.)?olympicwatch\\.org$\n^(.*\\.)?omgili\\.com$\n^(.*\\.)?omnitalk\\.com$\n^(.*\\.)?omnitalk\\.org$\n^(.*\\.)?cling\\.omy\\.sg$\n^(.*\\.)?forum\\.omy\\.sg$\n^(.*\\.)?news\\.omy\\.sg$\n^(.*\\.)?showbiz\\.omy\\.sg$\n^(.*\\.)?on\\.cc$\n^(.*\\.)?onedrive\\.live\\.com$\n^(.*\\.)?www\\.onion\\.city$\n^(.*\\.)?onlinecha\\.com$\n^(.*\\.)?onlineyoutube\\.com$\n^(.*\\.)?onmoon\\.net$\n^(.*\\.)?onmoon\\.com$\n^(.*\\.)?onthehunt\\.com$\n^(.*\\.)?oopsforum\\.com$\n^(.*\\.)?openallweb\\.com$\n^(.*\\.)?opendemocracy\\.net$\n^(.*\\.)?openid\\.net$\n^(.*\\.)?openleaks\\.org$\n^(.*\\.)?openwebster\\.com$\n^(.*\\.)?help\\.opera\\.com$\n^(.*\\.)?my\\.opera\\.com$\n^(.*\\.)?demo\\.opera-mini\\.net$\n^(.*\\.)?www\\.orchidbbs\\.com$\n^(.*\\.)?organharvestinvestigation\\.net$\n^(.*\\.)?orgfree\\.com$\n^(.*\\.)?orient-doll\\.com$\n^(.*\\.)?orientaldaily\\.com\\.my$\n^(.*\\.)?t\\.orzdream\\.com$\n^(.*\\.)?tui\\.orzdream\\.com$\n^(.*\\.)?orzistic\\.org$\n^(.*\\.)?osfoora\\.com$\n^(.*\\.)?otnd\\.org$\n^(.*\\.)?ourdearamy\\.com$\n^(.*\\.)?oursogo\\.com$\n^(.*\\.)?oursweb\\.net$\n^(.*\\.)?xinqimeng\\.over-blog\\.com$\n^(.*\\.)?overplay\\.net$\n^(.*\\.)?share\\.ovi\\.com$\n^(.*\\.)?owl\\.li$\n^(.*\\.)?ht\\.ly$\n^(.*\\.)?htl\\.li$\n^(.*\\.)?mash\\.to$\n^(.*\\.)?www\\.owind\\.com$\n^(.*\\.)?www\\.oxid\\.it$\n^(.*\\.)?oyax\\.com$\n^(.*\\.)?oyghan\\.com$\n^(.*\\.)?ozchinese\\.com$\n^(.*\\.)?ow\\.ly$\n^(.*\\.)?bbs\\.ozchinese\\.com$\n^(.*\\.)?ozxw\\.com$\n^(.*\\.)?ozyoyo\\.com$\n^(.*\\.)?pachosting\\.com$\n^(.*\\.)?pacificpoker\\.com$\n^(.*\\.)?packetix\\.net$\n^(.*\\.)?pacopacomama\\.com$\n^(.*\\.)?padmanet\\.com$\n^(.*\\.)?page2rss\\.com$\n^(.*\\.)?pagodabox\\.com$\n^(.*\\.)?palacemoon\\.com$\n^(.*\\.)?forum\\.palmislife\\.com$\n^(.*\\.)?eriversoft\\.com$\n^(.*\\.)?paldengyal\\.com$\n^(.*\\.)?paljorpublications\\.com$\n^(.*\\.)?paltalk\\.com$\n^(.*\\.)?pandapow\\.net$\n^(.*\\.)?panluan\\.net$\n^(.*\\.)?pao-pao\\.net$\n^(.*\\.)?paper\\.li$\n^(.*\\.)?paperb\\.us$\n^(.*\\.)?paradisepoker\\.com$\n^(.*\\.)?partycasino\\.com$\n^(.*\\.)?partypoker\\.com$\n^(.*\\.)?passion\\.com$\n^(.*\\.)?pastebin\\.com$\n^(.*\\.)?pastie\\.org$\n^(.*\\.)?blog\\.pathtosharepoint\\.com$\n^(.*\\.)?pbs\\.org$\n^(.*\\.)?pbwiki\\.com$\n^(.*\\.)?pbworks\\.com$\n^(.*\\.)?developers\\.box\\.net$\n^(.*\\.)?wiki\\.oauth\\.net$\n^(.*\\.)?wiki\\.phonegap\\.com$\n^(.*\\.)?wiki\\.jqueryui\\.com$\n^(.*\\.)?pbxes\\.com$\n^(.*\\.)?pbxes\\.org$\n^(.*\\.)?pcij\\.org$\n^(.*\\.)?pdetails\\.com$\n^(.*\\.)?peace\\.ca$\n^(.*\\.)?peacefire\\.org$\n^(.*\\.)?peacehall\\.com$\n^(.*\\.)?pearlher\\.org$\n^(.*\\.)?peeasian\\.com$\n^(.*\\.)?pekingduck\\.org$\n^(.*\\.)?pemulihan\\.or\\.id$\n^(.*\\.)?pen\\.io$\n^(.*\\.)?penchinese\\.com$\n^(.*\\.)?penchinese\\.net$\n^(.*\\.)?pengyulong\\.com$\n^(.*\\.)?penisbot\\.com$\n^(.*\\.)?blog\\.pentalogic\\.net$\n^(.*\\.)?penthouse\\.com$\n^(.*\\.)?peoplebookcafe\\.com$\n^(.*\\.)?peopo\\.org$\n^(.*\\.)?perfectgirls\\.net$\n^(.*\\.)?persecutionblog\\.com$\n^(.*\\.)?phapluan\\.org$\n^(.*\\.)?phayul\\.com$\n^(.*\\.)?philborges\\.com$\n^(.*\\.)?philly\\.com$\n^(.*\\.)?phncdn\\.com$\n^(.*\\.)?photodharma\\.net$\n^(.*\\.)?photofocus\\.com$\n^(.*\\.)?phuquocservices\\.com$\n^(.*\\.)?picidae\\.net$\n^(.*\\.)?picturedip\\.com$\n^(.*\\.)?picturesocial\\.com$\n^(.*\\.)?pin6\\.com$\n^(.*\\.)?ping\\.fm$\n^(.*\\.)?pinoy-n\\.com$\n^(.*\\.)?piposay\\.com$\n^(.*\\.)?piraattilahti\\.org$\n^(.*\\.)?piring\\.com$\n^(.*\\.)?pixelqi\\.com$\n^(.*\\.)?pixnet\\.net$\n^(.*\\.)?pk\\.com$\n^(.*\\.)?placemix\\.com$\n^(.*\\.)?pictures\\.playboy\\.com$\n^(.*\\.)?playboy\\.com$\n^(.*\\.)?playboyplus\\.com$\n^(.*\\.)?playno1\\.com$\n^(.*\\.)?playpcesor\\.com$\n^(.*\\.)?m\\.plixi\\.com$\n^(.*\\.)?plunder\\.com$\n^(.*\\.)?plus28\\.com$\n^(.*\\.)?plusbb\\.com$\n^(.*\\.)?pmates\\.com$\n^(.*\\.)?po2b\\.com$\n^(.*\\.)?podictionary\\.com$\n^(.*\\.)?pokerstars\\.net$\n^(.*\\.)?zh\\.pokerstrategy\\.com$\n^(.*\\.)?politicalchina\\.org$\n^(.*\\.)?politicalconsultation\\.org$\n^(.*\\.)?polymerhk\\.com$\n^(.*\\.)?popyard\\.com$\n^(.*\\.)?popyard\\.org$\n^(.*\\.)?porn\\.com$\n^(.*\\.)?porn2\\.com$\n^(.*\\.)?porn5\\.com$\n^(.*\\.)?pornbase\\.org$\n^(.*\\.)?pornerbros\\.com$\n^(.*\\.)?pornhd\\.com$\n^(.*\\.)?pornhost\\.com$\n^(.*\\.)?pornhub\\.com$\n^(.*\\.)?pornmm\\.net$\n^(.*\\.)?pornoxo\\.com$\n^(.*\\.)?pornrapidshare\\.com$\n^(.*\\.)?pornsharing\\.com$\n^(.*\\.)?pornstarclub\\.com$\n^(.*\\.)?porntube\\.com$\n^(.*\\.)?porntubenews\\.com$\n^(.*\\.)?porntvblog\\.com$\n^(.*\\.)?pornvisit\\.com$\n^(.*\\.)?poskotanews\\.com$\n^(.*\\.)?post852\\.com$\n^(.*\\.)?postadult\\.com$\n^(.*\\.)?postimg\\.org$\n^(.*\\.)?powercx\\.com$\n^(.*\\.)?powerphoto\\.org$\n^(.*\\.)?www\\.powerpointninja\\.com$\n^(.*\\.)?cdn\\.printfriendly\\.com$\n^(.*\\.)?pritunl\\.com$\n^(.*\\.)?proxfree\\.com$\n^(.*\\.)?pttvan\\.org$\n^(.*\\.)?puffinbrowser\\.com$\n^(.*\\.)?pureinsight\\.org$\n^(.*\\.)?putty\\.org$\n^(.*\\.)?calebelston\\.com$\n^(.*\\.)?blog\\.fizzik\\.com$\n^(.*\\.)?sogrady\\.me$\n^(.*\\.)?vatn\\.org$\n^(.*\\.)?ventureswell\\.com$\n^(.*\\.)?whereiswerner\\.com$\n^(.*\\.)?power\\.com$\n^(.*\\.)?powerapple\\.com$\n^(.*\\.)?prayforchina\\.net$\n^(.*\\.)?premeforwindows7\\.com$\n^(.*\\.)?presentationzen\\.com$\n^(.*\\.)?prestige-av\\.com$\n^(.*\\.)?prisoneralert\\.com$\n^(.*\\.)?private\\.com$\n^(.*\\.)?privateinternetaccess\\.com$\n^(.*\\.)?privatepaste\\.com$\n^(.*\\.)?privatetunnel\\.com$\n^(.*\\.)?procopytips\\.com$\n^(.*\\.)?provideocoalition\\.com$\n^(.*\\.)?proxifier\\.com$\n^(.*\\.)?api\\.proxlet\\.com$\n^(.*\\.)?proxomitron\\.info$\n^(.*\\.)?proxpn\\.com$\n^(.*\\.)?proyectoclubes\\.com$\n^(.*\\.)?prozz\\.net$\n^(.*\\.)?psblog\\.name$\n^(.*\\.)?psiphon\\.ca$\n^(.*\\.)?psiphon3\\.com$\n^(.*\\.)?ptt\\.cc$\n^(.*\\.)?puffstore\\.com$\n^(.*\\.)?puuko\\.com$\n^(.*\\.)?pullfolio\\.com$\n^(.*\\.)?punyu\\.com$\n^(.*\\.)?pureconcepts\\.net$\n^(.*\\.)?purepdf\\.com$\n^(.*\\.)?purplelotus\\.org$\n^(.*\\.)?pussyspace\\.com$\n^(.*\\.)?putihome\\.org$\n^(.*\\.)?putlocker\\.com$\n^(.*\\.)?pwned\\.com$\n^(.*\\.)?python\\.com$\n^(.*\\.)?qanote\\.com$\n^(.*\\.)?qi-gong\\.me$\n^(.*\\.)?qidian\\.ca$\n^(.*\\.)?qienkuen\\.org$\n^(.*\\.)?qiwen\\.lu$\n^(.*\\.)?bbs\\.qmzdd\\.com$\n^(.*\\.)?qkshare\\.com$\n^(.*\\.)?qoos\\.com$\n^(.*\\.)?efksoft\\.com$\n^(.*\\.)?qstatus\\.com$\n^(.*\\.)?qtweeter\\.com$\n^(.*\\.)?quitccp\\.net$\n^(.*\\.)?quitccp\\.org$\n^(.*\\.)?quran\\.com$\n^(.*\\.)?quranexplorer\\.com$\n^(.*\\.)?qusi8\\.net$\n^(.*\\.)?qvodzy\\.org$\n^(.*\\.)?nemesis2\\.qx\\.net$\n^(.*\\.)?qxbbs\\.org$\n^(.*\\.)?ra\\.gg$\n^(.*\\.)?radicalparty\\.org$\n^(.*\\.)?rael\\.org$\n^(.*\\.)?radiohilight\\.net$\n^(.*\\.)?opml\\.radiotime\\.com$\n^(.*\\.)?radiovaticana\\.org$\n^(.*\\.)?radiovncr\\.com$\n^(.*\\.)?raggedbanner\\.com$\n^(.*\\.)?rainbowplan\\.org$\n^(.*\\.)?rangwang\\.biz$\n^(.*\\.)?rangzen\\.com$\n^(.*\\.)?rangzen\\.net$\n^(.*\\.)?rangzen\\.org$\n^(.*\\.)?blog\\.ranxiang\\.com$\n^(.*\\.)?ranyunfei\\.com$\n^(.*\\.)?rapbull\\.net$\n^(.*\\.)?rapidgator\\.net$\n^(.*\\.)?rapidmoviez\\.com$\n^(.*\\.)?raremovie\\.cc$\n^(.*\\.)?raremovie\\.net$\n^(.*\\.)?razyboard\\.com$\n^(.*\\.)?rcinet\\.ca$\n^(.*\\.)?read100\\.com$\n^(.*\\.)?readmoo\\.com$\n^(.*\\.)?readydown\\.com$\n^(.*\\.)?realcourage\\.org$\n^(.*\\.)?realraptalk\\.com$\n^(.*\\.)?recordhistory\\.org$\n^(.*\\.)?online\\.recoveryversion\\.org$\n^(.*\\.)?redchinacn\\.net$\n^(.*\\.)?redchinacn\\.org$\n^(.*\\.)?redtube\\.com$\n^(.*\\.)?referer\\.us$\n^(.*\\.)?reflectivecode\\.com$\n^(.*\\.)?relaxbbs\\.com$\n^(.*\\.)?releaseinternational\\.org$\n^(.*\\.)?religioustolerance\\.org$\n^(.*\\.)?renminbao\\.com$\n^(.*\\.)?renyurenquan\\.org$\n^(.*\\.)?certificate\\.revocationcheck\\.com$\n^(.*\\.)?subacme\\.rerouted\\.org$\n^(.*\\.)?reuters\\.com$\n^(.*\\.)?revleft\\.com$\n^(.*\\.)?retweetist\\.com$\n^(.*\\.)?retweetrank\\.com$\n^(.*\\.)?revver\\.com$\n^(.*\\.)?rfa\\.org$\n^(.*\\.)?rfachina\\.com$\n^(.*\\.)?rfamobile\\.org$\n^(.*\\.)?rfaweb\\.org$\n^(.*\\.)?rferl\\.org$\n^(.*\\.)?rfi\\.my$\n^(.*\\.)?rhcloud\\.com$\n^(.*\\.)?vds\\.rightster\\.com$\n^(.*\\.)?rigpa\\.org$\n^(.*\\.)?rileyguide\\.com$\n^(.*\\.)?riku\\.me$\n^(.*\\.)?rlwlw\\.com$\n^(.*\\.)?rmjdw\\.com$\n^(.*\\.)?rmjdw132\\.info$\n^(.*\\.)?robtex\\.com$\n^(.*\\.)?robustnessiskey\\.com$\n^(.*\\.)?roc-taiwan\\.org$\n^(.*\\.)?rocket-inc\\.net$\n^(.*\\.)?www2\\.rocketbbs\\.com$\n^(.*\\.)?rocmp\\.org$\n^(.*\\.)?rojo\\.com$\n^(.*\\.)?ronjoneswriter\\.com$\n^(.*\\.)?rolia\\.net$\n^(.*\\.)?roodo\\.com$\n^(.*\\.)?rosechina\\.net$\n^(.*\\.)?rotten\\.com$\n^(.*\\.)?rsf\\.org$\n^(.*\\.)?rsf-chinese\\.org$\n^(.*\\.)?rsgamen\\.org$\n^(.*\\.)?phosphation13\\.rssing\\.com$\n^(.*\\.)?rssmeme\\.com$\n^(.*\\.)?rtalabel\\.org$\n^(.*\\.)?rtycminnesota\\.org$\n^(.*\\.)?ruanyifeng\\.com$\n^(.*\\.)?rukor\\.org$\n^(.*\\.)?rushbee\\.com$\n^(.*\\.)?ruyiseek\\.com$\n^(.*\\.)?rxhj\\.net$\n^(.*\\.)?s1s1s1\\.com$\n^(.*\\.)?s-cute\\.com$\n^(.*\\.)?s-dragon\\.org$\n^(.*\\.)?s1heng\\.com$\n^(.*\\.)?www\\.s4miniarchive\\.com$\n^(.*\\.)?s8forum\\.com$\n^(.*\\.)?cdn1\\.lp\\.saboom\\.com$\n^(.*\\.)?sadpanda\\.us$\n^(.*\\.)?saiq\\.me$\n^(.*\\.)?sakuralive\\.com$\n^(.*\\.)?sakya\\.org$\n^(.*\\.)?sambhota\\.org$\n^(.*\\.)?cn\\.sandscotaicentral\\.com$\n^(.*\\.)?sapikachu\\.net$\n^(.*\\.)?savemedia\\.com$\n^(.*\\.)?savetibet\\.nl$\n^(.*\\.)?savetibet\\.org$\n^(.*\\.)?savevid\\.com$\n^(.*\\.)?say2\\.info$\n^(.*\\.)?sbme\\.me$\n^(.*\\.)?scasino\\.com$\n^(.*\\.)?www\\.sciencemag\\.org$\n^(.*\\.)?sciencenets\\.com$\n^(.*\\.)?scihub\\.org$\n^(.*\\.)?scmp\\.com$\n^(.*\\.)?scmpchinese\\.com$\n^(.*\\.)?scramble\\.io$\n^(.*\\.)?scribd\\.com$\n^(.*\\.)?scriptspot\\.com$\n^(.*\\.)?seapuff\\.com$\n^(.*\\.)?domainhelp\\.search\\.com$\n^(.*\\.)?searchtruth\\.com$\n^(.*\\.)?secretchina\\.com$\n^(.*\\.)?secretgarden\\.no$\n^(.*\\.)?default\\.secureserver\\.net$\n^(.*\\.)?secretsline\\.biz$\n^(.*\\.)?securetunnel\\.com$\n^(.*\\.)?securitykiss\\.com$\n^(.*\\.)?seesmic\\.com$\n^(.*\\.)?seezone\\.net$\n^(.*\\.)?sejie\\.com$\n^(.*\\.)?sendspace\\.com$\n^(.*\\.)?tweets\\.seraph\\.me$\n^(.*\\.)?sesawe\\.net$\n^(.*\\.)?sesawe\\.org$\n^(.*\\.)?sethwklein\\.net$\n^(.*\\.)?sevenload\\.com$\n^(.*\\.)?sf\\.net$\n^(.*\\.)?sfileydy\\.com$\n^(.*\\.)?sfshibao\\.com$\n^(.*\\.)?sftindia\\.org$\n^(.*\\.)?sftuk\\.org$\n^(.*\\.)?shadow\\.ma$\n^(.*\\.)?shadowsky\\.xyz$\n^(.*\\.)?shadowsocks\\.com$\n^(.*\\.)?shadowsocks\\.org$\n^(.*\\.)?cn\\.shafaqna\\.com$\n^(.*\\.)?shahamat-english\\.com$\n^(.*\\.)?shambhalasun\\.com$\n^(.*\\.)?shangfang\\.org$\n^(.*\\.)?shapeservices\\.com$\n^(.*\\.)?sharebee\\.com$\n^(.*\\.)?sharecool\\.org$\n^(.*\\.)?shat-tibet\\.com$\n^(.*\\.)?sheikyermami\\.com$\n^(.*\\.)?shenshou\\.org$\n^(.*\\.)?shenyun\\.com$\n^(.*\\.)?shenyunperformingarts\\.org$\n^(.*\\.)?shenzhoufilm\\.com$\n^(.*\\.)?sherabgyaltsen\\.com$\n^(.*\\.)?shiatv\\.net$\n^(.*\\.)?shicheng\\.org$\n^(.*\\.)?shinychan\\.com$\n^(.*\\.)?shipcamouflage\\.com$\n^(.*\\.)?shitaotv\\.org$\n^(.*\\.)?shixiao\\.org$\n^(.*\\.)?shizhao\\.org$\n^(.*\\.)?shkspr\\.mobi$\n^(.*\\.)?shodanhq\\.com$\n^(.*\\.)?shopping\\.com$\n^(.*\\.)?showhaotu\\.com$\n^(.*\\.)?ch\\.shvoong\\.com$\n^(.*\\.)?shwchurch\\.org$\n^(.*\\.)?shwchurch3\\.com$\n^(.*\\.)?sidelinesnews\\.com$\n^(.*\\.)?sidelinessportseatery\\.com$\n^(.*\\.)?sijihuisuo\\.club$\n^(.*\\.)?sijihuisuo\\.com$\n^(.*\\.)?simplecd\\.org$\n^(.*\\.)?simpleproductivityblog\\.com$\n^(.*\\.)?bbs\\.sina\\.com$\n^(.*\\.)?dailynews\\.sina\\.com$\n^(.*\\.)?home\\.sina\\.com$\n^(.*\\.)?news\\.sinchew\\.com\\.my$\n^(.*\\.)?sinchew\\.com\\.my$\n^(.*\\.)?singaporepools\\.com\\.sg$\n^(.*\\.)?singfortibet\\.com$\n^(.*\\.)?singtao\\.com$\n^(.*\\.)?news\\.singtao\\.ca$\n^(.*\\.)?sino-monthly\\.com$\n^(.*\\.)?sinocast\\.com$\n^(.*\\.)?sinocism\\.com$\n^(.*\\.)?sinomontreal\\.ca$\n^(.*\\.)?sinonet\\.ca$\n^(.*\\.)?sinopitt\\.info$\n^(.*\\.)?sinoants\\.com$\n^(.*\\.)?sinoquebec\\.com$\n^(.*\\.)?site90\\.net$\n^(.*\\.)?sitekreator\\.com$\n^(.*\\.)?siteks\\.uk\\.to$\n^(.*\\.)?sitemaps\\.org$\n^(.*\\.)?sitetag\\.us$\n^(.*\\.)?sis\\.xxx$\n^(.*\\.)?sis001\\.com$\n^(.*\\.)?sis001\\.us$\n^(.*\\.)?sjrt\\.org$\n^(.*\\.)?sketchappsources\\.com$\n^(.*\\.)?skimtube\\.com$\n^(.*\\.)?skybet\\.com$\n^(.*\\.)?users\\.skynet\\.be$\n^(.*\\.)?skyhighpremium\\.com$\n^(.*\\.)?bbs\\.skykiwi\\.com$\n^(.*\\.)?www\\.skype\\.com$\n^(.*\\.)?skyvegas\\.com$\n^(.*\\.)?xskywalker\\.com$\n^(.*\\.)?m\\.slandr\\.net$\n^(.*\\.)?slavasoft\\.com$\n^(.*\\.)?slaytizle\\.com$\n^(.*\\.)?slheng\\.com$\n^(.*\\.)?slideshare\\.net$\n^(.*\\.)?slinkset\\.com$\n^(.*\\.)?slutload\\.com$\n^(.*\\.)?smchbooks\\.com$\n^(.*\\.)?smhric\\.org$\n^(.*\\.)?smith\\.edu$\n^(.*\\.)?smyxy\\.org$\n^(.*\\.)?snapchat\\.com$\n^(.*\\.)?snaptu\\.com$\n^(.*\\.)?sndcdn\\.com$\n^(.*\\.)?sneakme\\.net$\n^(.*\\.)?snowlionpub\\.com$\n^(.*\\.)?so-ga\\.net$\n^(.*\\.)?so-news\\.com$\n^(.*\\.)?soc\\.mil$\n^(.*\\.)?sockslist\\.net$\n^(.*\\.)?socrec\\.org$\n^(.*\\.)?softether\\.org$\n^(.*\\.)?softether-download\\.com$\n^(.*\\.)?cdn\\.softlayer\\.net$\n^(.*\\.)?sogclub\\.com$\n^(.*\\.)?sohcradio\\.com$\n^(.*\\.)?sorting-algorithms\\.com$\n^(.*\\.)?sostibet\\.org$\n^(.*\\.)?soumo\\.info$\n^(.*\\.)?soup\\.io$\n^(.*\\.)?sobees\\.com$\n^(.*\\.)?socialwhale\\.com$\n^(.*\\.)?softwarebychuck\\.com$\n^(.*\\.)?blog\\.sogoo\\.org$\n^(.*\\.)?sohfrance\\.org$\n^(.*\\.)?chinese\\.soifind\\.com$\n^(.*\\.)?sokamonline\\.com$\n^(.*\\.)?somee\\.com$\n^(.*\\.)?songjianjun\\.com$\n^(.*\\.)?sonicbbs\\.cc$\n^(.*\\.)?sonidodelaesperanza\\.org$\n^(.*\\.)?sopcast\\.com$\n^(.*\\.)?sopcast\\.org$\n^(.*\\.)?sorazone\\.net$\n^(.*\\.)?sos\\.org$\n^(.*\\.)?bbs\\.sou-tong\\.org$\n^(.*\\.)?soubory\\.com$\n^(.*\\.)?soul-plus\\.net$\n^(.*\\.)?soulcaliburhentai\\.net$\n^(.*\\.)?soundcloud\\.com$\n^(.*\\.)?soundofhope\\.kr$\n^(.*\\.)?soundofhope\\.org$\n^(.*\\.)?soupofmedia\\.com$\n^(.*\\.)?sourceforge\\.net$\n^(.*\\.)?sourcewadio\\.com$\n^(.*\\.)?wlx\\.sowiki\\.net$\n^(.*\\.)?space-scape\\.com$\n^(.*\\.)?spankbang\\.com$\n^(.*\\.)?spankwire\\.com$\n^(.*\\.)?spb\\.com$\n^(.*\\.)?speakerdeck\\.com$\n^(.*\\.)?spem\\.at$\n^(.*\\.)?spencertipping\\.com$\n^(.*\\.)?spike\\.com$\n^(.*\\.)?spinejs\\.com$\n^(.*\\.)?spotflux\\.com$\n^(.*\\.)?spring4u\\.info$\n^(.*\\.)?sproutcore\\.com$\n^(.*\\.)?squarespace\\.com$\n^(.*\\.)?ssh91\\.com$\n^(.*\\.)?sspro\\.ml$\n^(.*\\.)?sss\\.camp$\n^(.*\\.)?sstmlt\\.net$\n^(.*\\.)?stackoverflow\\.com$\n^(.*\\.)?standupfortibet\\.org$\n^(.*\\.)?stanford\\.edu$\n^(.*\\.)?usinfo\\.state\\.gov$\n^(.*\\.)?statueofdemocracy\\.org$\n^(.*\\.)?starfishfx\\.com$\n^(.*\\.)?starp2p\\.com$\n^(.*\\.)?startpage\\.com$\n^(.*\\.)?state168\\.com$\n^(.*\\.)?static-economist\\.com$\n^(.*\\.)?stc\\.com\\.sa$\n^(.*\\.)?steamcommunity\\.com$\n^(.*\\.)?steel-storm\\.com$\n^(.*\\.)?stepchina\\.com$\n^(.*\\.)?ny\\.stgloballink\\.com$\n^(.*\\.)?hd\\.stheadline\\.com$\n^(.*\\.)?sthoo\\.com$\n^(.*\\.)?stickam\\.com$\n^(.*\\.)?stickeraction\\.com$\n^(.*\\.)?stileproject\\.com$\n^(.*\\.)?sto\\.cc$\n^(.*\\.)?stoneip\\.info$\n^(.*\\.)?storagenewsletter\\.com$\n^(.*\\.)?storm\\.mg$\n^(.*\\.)?stoptibetcrisis\\.net$\n^(.*\\.)?storify\\.com$\n^(.*\\.)?stormmediagroup\\.com$\n^(.*\\.)?stoweboyd\\.com$\n^(.*\\.)?stranabg\\.com$\n^(.*\\.)?streamingthe\\.net$\n^(.*\\.)?streema\\.com$\n^(.*\\.)?cn\\.streetvoice\\.com$\n^(.*\\.)?cn2\\.streetvoice\\.com$\n^(.*\\.)?tw\\.streetvoice\\.com$\n^(.*\\.)?strongwindpress\\.com$\n^(.*\\.)?studentsforafreetibet\\.org$\n^(.*\\.)?stumbleupon\\.com$\n^(.*\\.)?stupidvideos\\.com$\n^(.*\\.)?sugarsync\\.com$\n^(.*\\.)?sugobbs\\.com$\n^(.*\\.)?suissl\\.com$\n^(.*\\.)?summify\\.com$\n^(.*\\.)?sumrando\\.com$\n^(.*\\.)?sun1911\\.com$\n^(.*\\.)?sunporno\\.com$\n^(.*\\.)?sunmedia\\.ca$\n^(.*\\.)?sunskyforum\\.com$\n^(.*\\.)?suoluo\\.org$\n^(.*\\.)?suprememastertv\\.com$\n^(.*\\.)?surfeasy\\.com$\n^(.*\\.)?surrenderat20\\.net$\n^(.*\\.)?suyangg\\.com$\n^(.*\\.)?svwind\\.com$\n^(.*\\.)?sweux\\.com$\n^(.*\\.)?swift-tools\\.net$\n^(.*\\.)?sydneytoday\\.com$\n^(.*\\.)?sylfoundation\\.org$\n^(.*\\.)?syncback\\.com$\n^(.*\\.)?sysadmin1138\\.net$\n^(.*\\.)?sysresccd\\.org$\n^(.*\\.)?sytes\\.net$\n^(.*\\.)?blog\\.syx86\\.com$\n^(.*\\.)?szbbs\\.net$\n^(.*\\.)?t35\\.com$\n^(.*\\.)?t66y\\.com$\n^(.*\\.)?t88\\.ca$\n^(.*\\.)?taa-usa\\.org$\n^(.*\\.)?www\\.tablesgenerator\\.com$\n^(.*\\.)?tacem\\.org$\n^(.*\\.)?tafaward\\.com$\n^(.*\\.)?tafm\\.org$\n^(.*\\.)?tagwalk\\.com$\n^(.*\\.)?taipeisociety\\.org$\n^(.*\\.)?taiwanbible\\.com$\n^(.*\\.)?taiwancon\\.com$\n^(.*\\.)?taiwandaily\\.net$\n^(.*\\.)?taiwandc\\.org$\n^(.*\\.)?taiwanembassy\\.org$\n^(.*\\.)?taiwanjustice\\.com$\n^(.*\\.)?taiwankiss\\.com$\n^(.*\\.)?taiwannation\\.com$\n^(.*\\.)?www\\.taiwanonline\\.cc$\n^(.*\\.)?taiwantp\\.net$\n^(.*\\.)?taiwanus\\.net$\n^(.*\\.)?taiwanyes\\.com$\n^(.*\\.)?talk853\\.com$\n^(.*\\.)?talkboxapp\\.com$\n^(.*\\.)?talkonly\\.net$\n^(.*\\.)?tamiaode\\.tk$\n^(.*\\.)?tanc\\.org$\n^(.*\\.)?tangben\\.com$\n^(.*\\.)?tangren\\.us$\n^(.*\\.)?taoism\\.net$\n^(.*\\.)?taolun\\.info$\n^(.*\\.)?blog\\.taragana\\.com$\n^(.*\\.)?taup\\.net$\n^(.*\\.)?taweet\\.com$\n^(.*\\.)?tbcollege\\.org$\n^(.*\\.)?tbicn\\.org$\n^(.*\\.)?tbjyt\\.org$\n^(.*\\.)?tbpic\\.info$\n^(.*\\.)?tbs-rainbow\\.org$\n^(.*\\.)?tbsec\\.org$\n^(.*\\.)?tbskkinabalu\\.page\\.tl$\n^(.*\\.)?tbsmalaysia\\.org$\n^(.*\\.)?tbsn\\.org$\n^(.*\\.)?tbsseattle\\.org$\n^(.*\\.)?tbssqh\\.org$\n^(.*\\.)?tbswd\\.org$\n^(.*\\.)?tbthouston\\.org$\n^(.*\\.)?tccwonline\\.org$\n^(.*\\.)?tcewf\\.org$\n^(.*\\.)?tchrd\\.org$\n^(.*\\.)?tcnynj\\.org$\n^(.*\\.)?teamamericany\\.com$\n^(.*\\.)?techlifeweb\\.com$\n^(.*\\.)?teeniefuck\\.net$\n^(.*\\.)?teensinasia\\.com$\n^(.*\\.)?telecomspace\\.com$\n^(.*\\.)?telegram\\.org$\n^(.*\\.)?telegramdownload\\.com$\n^(.*\\.)?tenacy\\.com$\n^(.*\\.)?tew\\.org$\n^(.*\\.)?thaicn\\.com$\n^(.*\\.)?theatrum-belli\\.com$\n^(.*\\.)?thebodyshop-usa\\.com$\n^(.*\\.)?theblemish\\.com$\n^(.*\\.)?thebcomplex\\.com$\n^(.*\\.)?thebobs\\.com$\n^(.*\\.)?thechinabeat\\.org$\n^(.*\\.)?www\\.thechinastory\\.org$\n^(.*\\.)?thedalailamamovie\\.com$\n^(.*\\.)?thedw\\.us$\n^(.*\\.)?thegioitinhoc\\.vn$\n^(.*\\.)?thegly\\.com$\n^(.*\\.)?thehots\\.info$\n^(.*\\.)?thehousenews\\.com$\n^(.*\\.)?thehun\\.net$\n^(.*\\.)?theinitium\\.com$\n^(.*\\.)?thelifeyoucansave\\.com$\n^(.*\\.)?thenewslens\\.com$\n^(.*\\.)?thepiratebay\\.org$\n^(.*\\.)?thereallove\\.kr$\n^(.*\\.)?therock\\.net\\.nz$\n^(.*\\.)?thespeeder\\.com$\n^(.*\\.)?thestandnews\\.com$\n^(.*\\.)?thetibetcenter\\.org$\n^(.*\\.)?thetibetconnection\\.org$\n^(.*\\.)?thetibetmuseum\\.org$\n^(.*\\.)?thetibetpost\\.com$\n^(.*\\.)?thetrotskymovie\\.com$\n^(.*\\.)?thevivekspot\\.com$\n^(.*\\.)?thewgo\\.org$\n^(.*\\.)?thinkingtaiwan\\.com$\n^(.*\\.)?thisav\\.com$\n^(.*\\.)?thlib\\.org$\n^(.*\\.)?thomasbernhard\\.org$\n^(.*\\.)?threatchaos\\.com$\n^(.*\\.)?throughnightsfire\\.com$\n^(.*\\.)?thumbzilla\\.com$\n^(.*\\.)?thywords\\.com$\n^(.*\\.)?tiananmenmother\\.org$\n^(.*\\.)?tiananmenduizhi\\.com$\n^(.*\\.)?tiananmenuniv\\.com$\n^(.*\\.)?tiananmenuniv\\.net$\n^(.*\\.)?tiandixing\\.org$\n^(.*\\.)?tianhuayuan\\.com$\n^(.*\\.)?tianlawoffice\\.com$\n^(.*\\.)?tianti\\.io$\n^(.*\\.)?tiantibooks\\.org$\n^(.*\\.)?tianzhu\\.org$\n^(.*\\.)?tibet\\.at$\n^(.*\\.)?tibet\\.ca$\n^(.*\\.)?tibet\\.com$\n^(.*\\.)?tibet\\.net$\n^(.*\\.)?tibet\\.nu$\n^(.*\\.)?tibet\\.org$\n^(.*\\.)?tibet\\.to$\n^(.*\\.)?tibet-foundation\\.org$\n^(.*\\.)?tibet-info\\.net$\n^(.*\\.)?tibet3rdpole\\.org$\n^(.*\\.)?tibetaction\\.net$\n^(.*\\.)?tibetaid\\.org$\n^(.*\\.)?tibetalk\\.com$\n^(.*\\.)?tibetan-alliance\\.org$\n^(.*\\.)?tibetanarts\\.org$\n^(.*\\.)?tibetanbuddhistinstitute\\.org$\n^(.*\\.)?tibetanlanguage\\.org$\n^(.*\\.)?tibetanliberation\\.org$\n^(.*\\.)?tibetcollection\\.com$\n^(.*\\.)?tibetanaidproject\\.org$\n^(.*\\.)?tibetancommunityuk\\.net$\n^(.*\\.)?tibetanculture\\.org$\n^(.*\\.)?tibetanfeministcollective\\.org$\n^(.*\\.)?tibetanpaintings\\.com$\n^(.*\\.)?tibetanphotoproject\\.com$\n^(.*\\.)?tibetanpoliticalreview\\.org$\n^(.*\\.)?tibetanreview\\.net$\n^(.*\\.)?tibetanwomen\\.org$\n^(.*\\.)?tibetanyouth\\.org$\n^(.*\\.)?tibetanyouthcongress\\.org$\n^(.*\\.)?tibetcharity\\.dk$\n^(.*\\.)?tibetchild\\.org$\n^(.*\\.)?tibetcity\\.com$\n^(.*\\.)?tibetcorps\\.org$\n^(.*\\.)?tibetexpress\\.net$\n^(.*\\.)?tibetfocus\\.com$\n^(.*\\.)?tibetfund\\.org$\n^(.*\\.)?tibetgermany\\.com$\n^(.*\\.)?tibethaus\\.com$\n^(.*\\.)?tibetheritagefund\\.org$\n^(.*\\.)?tibethouse\\.org$\n^(.*\\.)?tibethouse\\.us$\n^(.*\\.)?tibetinfonet\\.net$\n^(.*\\.)?tibetjustice\\.org$\n^(.*\\.)?tibetkomite\\.dk$\n^(.*\\.)?tibetmuseum\\.org$\n^(.*\\.)?tibetnetwork\\.org$\n^(.*\\.)?tibetoffice\\.ch$\n^(.*\\.)?tibetoffice\\.org$\n^(.*\\.)?tibetonline\\.com$\n^(.*\\.)?tibetoralhistory\\.org$\n^(.*\\.)?tibetsites\\.com$\n^(.*\\.)?tibetsociety\\.com$\n^(.*\\.)?tibetsun\\.com$\n^(.*\\.)?tibetsupportgroup\\.org$\n^(.*\\.)?tibetswiss\\.ch$\n^(.*\\.)?tibettelegraph\\.com$\n^(.*\\.)?tibettimes\\.net$\n^(.*\\.)?tibetwrites\\.org$\n^(.*\\.)?timdir\\.com$\n^(.*\\.)?time\\.com$\n^(.*\\.)?timsah\\.com$\n^(.*\\.)?blog\\.tiney\\.com$\n^(.*\\.)?tintuc101\\.com$\n^(.*\\.)?tiny\\.cc$\n^(.*\\.)?tinychat\\.com$\n^(.*\\.)?tinypaste\\.com$\n^(.*\\.)?tistory\\.com$\n^(.*\\.)?tkcs-collins\\.com$\n^(.*\\.)?tmagazine\\.com$\n^(.*\\.)?tmdfish\\.com$\n^(.*\\.)?tmi\\.me$\n^(.*\\.)?tmpp\\.org$\n^(.*\\.)?tnaflix\\.com$\n^(.*\\.)?tngrnow\\.com$\n^(.*\\.)?tngrnow\\.net$\n^(.*\\.)?tnp\\.org$\n^(.*\\.)?to-porno\\.com$\n^(.*\\.)?togetter\\.com$\n^(.*\\.)?tokyo-247\\.com$\n^(.*\\.)?tokyo-hot\\.com$\n^(.*\\.)?tokyo-porn-tube\\.com$\n^(.*\\.)?tokyocn\\.com$\n^(.*\\.)?tw\\.tomonews\\.net$\n^(.*\\.)?tongil\\.or\\.kr$\n^(.*\\.)?tonyyan\\.net$\n^(.*\\.)?toodoc\\.com$\n^(.*\\.)?toonel\\.net$\n^(.*\\.)?top81\\.ws$\n^(.*\\.)?topshare\\.us$\n^(.*\\.)?torguard\\.net$\n^(.*\\.)?topshareware\\.com$\n^(.*\\.)?topsy\\.com$\n^(.*\\.)?toptip\\.ca$\n^(.*\\.)?tora\\.to$\n^(.*\\.)?torcn\\.com$\n^(.*\\.)?torproject\\.org$\n^(.*\\.)?torrentcrazy\\.com$\n^(.*\\.)?torrentprivacy\\.com$\n^(.*\\.)?torrentproject\\.se$\n^(.*\\.)?torrenty\\.org$\n^(.*\\.)?toutfr\\.com$\n^(.*\\.)?towngain\\.com$\n^(.*\\.)?toytractorshow\\.com$\n^(.*\\.)?tparents\\.org$\n^(.*\\.)?traffichaus\\.com$\n^(.*\\.)?transgressionism\\.org$\n^(.*\\.)?transparency\\.org$\n^(.*\\.)?travelinlocal\\.com$\n^(.*\\.)?trendsmap\\.com$\n^(.*\\.)?trialofccp\\.org$\n^(.*\\.)?tripod\\.com$\n^(.*\\.)?trouw\\.nl$\n^(.*\\.)?trt\\.net\\.tr$\n^(.*\\.)?truebuddha-md\\.org$\n^(.*\\.)?trulyergonomic\\.com$\n^(.*\\.)?trustedbi\\.com$\n^(.*\\.)?truthcn\\.com$\n^(.*\\.)?truthontour\\.org$\n^(.*\\.)?truveo\\.com$\n^(.*\\.)?tsctv\\.net$\n^(.*\\.)?tsemtulku\\.com$\n^(.*\\.)?tsunagarumon\\.com$\n^(.*\\.)?tt-rss\\.org$\n^(.*\\.)?tttan\\.com$\n^(.*\\.)?tuanzt\\.com$\n^(.*\\.)?tubaholic\\.com$\n^(.*\\.)?tube\\.com$\n^(.*\\.)?tube8\\.com$\n^(.*\\.)?tube911\\.com$\n^(.*\\.)?tubecao\\.com$\n^(.*\\.)?tubecup\\.com$\n^(.*\\.)?tubegals\\.com$\n^(.*\\.)?tubeislam\\.com$\n^(.*\\.)?tubewolf\\.com$\n^(.*\\.)?tuidang\\.net$\n^(.*\\.)?tuidang\\.org$\n^(.*\\.)?tuidang\\.se$\n^(.*\\.)?bbs\\.tuitui\\.info$\n^(.*\\.)?tumutanzi\\.com$\n^(.*\\.)?tunein\\.com$\n^(.*\\.)?tunnelbear\\.com$\n^(.*\\.)?tuo8\\.cc$\n^(.*\\.)?tuo8\\.club$\n^(.*\\.)?tuo8\\.ninja$\n^(.*\\.)?tuo8\\.org$\n^(.*\\.)?tuo8\\.pw$\n^(.*\\.)?tuitwit\\.com$\n^(.*\\.)?turansam\\.org$\n^(.*\\.)?turbobit\\.net$\n^(.*\\.)?turbohide\\.com$\n^(.*\\.)?turningtorso\\.com$\n^(.*\\.)?tushycash\\.com$\n^(.*\\.)?tuxtraining\\.com$\n^(.*\\.)?tuzaijidi\\.com$\n^(.*\\.)?tw01\\.org$\n^(.*\\.)?tumblr\\.com$\n^(.*\\.)?tv\\.com$\n^(.*\\.)?tv-intros\\.com$\n^(.*\\.)?tvants\\.com$\n^(.*\\.)?forum\\.tvb\\.com$\n^(.*\\.)?news\\.tvb\\.com$\n^(.*\\.)?tvboxnow\\.com$\n^(.*\\.)?tvider\\.com$\n^(.*\\.)?tvplayvideos\\.com$\n^(.*\\.)?tvunetworks\\.com$\n^(.*\\.)?tw-npo\\.org$\n^(.*\\.)?twaitter\\.com$\n^(.*\\.)?twapperkeeper\\.com$\n^(.*\\.)?twaud\\.io$\n^(.*\\.)?twbbs\\.org$\n^(.*\\.)?twblogger\\.com$\n^(.*\\.)?tweepmag\\.com$\n^(.*\\.)?tweepml\\.org$\n^(.*\\.)?tweetbackup\\.com$\n^(.*\\.)?tweetboard\\.com$\n^(.*\\.)?tweetboner\\.biz$\n^(.*\\.)?tweetdeck\\.com$\n^(.*\\.)?deck\\.ly$\n^(.*\\.)?mtw\\.tl$\n^(.*\\.)?tweetedtimes\\.com$\n^(.*\\.)?tweetmylast\\.fm$\n^(.*\\.)?tweetphoto\\.com$\n^(.*\\.)?tweetrans\\.com$\n^(.*\\.)?tweetree\\.com$\n^(.*\\.)?tweettunnel\\.com$\n^(.*\\.)?tweetwally\\.com$\n^(.*\\.)?tweetymail\\.com$\n^(.*\\.)?twftp\\.org$\n^(.*\\.)?twibase\\.com$\n^(.*\\.)?twibbon\\.com$\n^(.*\\.)?twibs\\.com$\n^(.*\\.)?twicsy\\.com$\n^(.*\\.)?twiends\\.com$\n^(.*\\.)?twifan\\.com$\n^(.*\\.)?twiffo\\.com$\n^(.*\\.)?twilog\\.org$\n^(.*\\.)?twimbow\\.com$\n^(.*\\.)?twindexx\\.com$\n^(.*\\.)?twip\\.me$\n^(.*\\.)?twishort\\.com$\n^(.*\\.)?twistar\\.cc$\n^(.*\\.)?twister\\.net\\.co$\n^(.*\\.)?twisterio\\.com$\n^(.*\\.)?twisternow\\.com$\n^(.*\\.)?twistory\\.net$\n^(.*\\.)?twitbrowser\\.net$\n^(.*\\.)?twitcause\\.com$\n^(.*\\.)?twitgether\\.com$\n^(.*\\.)?twiggit\\.org$\n^(.*\\.)?twitgoo\\.com$\n^(.*\\.)?twitiq\\.com$\n^(.*\\.)?twitlonger\\.com$\n^(.*\\.)?tl\\.gd$\n^(.*\\.)?twitmania\\.com$\n^(.*\\.)?twitoaster\\.com$\n^(.*\\.)?twitonmsn\\.com$\n^(.*\\.)?twitpic\\.com$\n^(.*\\.)?twit2d\\.com$\n^(.*\\.)?twitstat\\.com$\n^(.*\\.)?firstfivefollowers\\.com$\n^(.*\\.)?retweeteffect\\.com$\n^(.*\\.)?tweeplike\\.me$\n^(.*\\.)?tweepguide\\.com$\n^(.*\\.)?turbotwitter\\.com$\n^(.*\\.)?twitvid\\.com$\n^(.*\\.)?t\\.co$\n^(.*\\.)?twt\\.tl$\n^(.*\\.)?twittbot\\.net$\n^(.*\\.)?twitter\\.com$\n^(.*\\.)?twttr\\.com$\n^(.*\\.)?twitter4j\\.org$\n^(.*\\.)?twittercounter\\.com$\n^(.*\\.)?twitterfeed\\.com$\n^(.*\\.)?twittergadget\\.com$\n^(.*\\.)?twitterkr\\.com$\n^(.*\\.)?twittermail\\.com$\n^(.*\\.)?twitterrific\\.com$\n^(.*\\.)?twittertim\\.es$\n^(.*\\.)?twitthat\\.com$\n^(.*\\.)?twitturk\\.com$\n^(.*\\.)?twitturly\\.com$\n^(.*\\.)?twitzap\\.com$\n^(.*\\.)?twiyia\\.com$\n^(.*\\.)?twstar\\.net$\n^(.*\\.)?twtkr\\.com$\n^(.*\\.)?twimg\\.com$\n^(.*\\.)?twtrland\\.com$\n^(.*\\.)?twurl\\.nl$\n^(.*\\.)?twyac\\.org$\n^(.*\\.)?txxx\\.com$\n^(.*\\.)?tycool\\.com$\n^(.*\\.)?tzangms\\.com$\n^(.*\\.)?typepad\\.com$\n^(.*\\.)?blog\\.expofutures\\.com$\n^(.*\\.)?legaltech\\.law\\.com$\n^(.*\\.)?blogs\\.tampabay\\.com$\n^(.*\\.)?contests\\.twilio\\.com$\n^(.*\\.)?ubddns\\.org$\n^(.*\\.)?uc-japan\\.org$\n^(.*\\.)?srcf\\.ucam\\.org$\n^(.*\\.)?china\\.ucanews\\.com$\n^(.*\\.)?ucdc1998\\.org$\n^(.*\\.)?uchicago\\.edu$\n^(.*\\.)?uderzo\\.it$\n^(.*\\.)?udn\\.com$\n^(.*\\.)?udnbkk\\.com$\n^(.*\\.)?ugo\\.com$\n^(.*\\.)?uhdwallpapers\\.org$\n^(.*\\.)?uhrp\\.org$\n^(.*\\.)?uighur\\.nl$\n^(.*\\.)?uighurbiz\\.net$\n^(.*\\.)?ulike\\.net$\n^(.*\\.)?ultraxs\\.com$\n^(.*\\.)?umich\\.edu$\n^(.*\\.)?unblock\\.cn\\.com$\n^(.*\\.)?unblock-us\\.com$\n^(.*\\.)?unblockdmm\\.com$\n^(.*\\.)?unblocksit\\.es$\n^(.*\\.)?uncyclomedia\\.org$\n^(.*\\.)?underwoodammo\\.com$\n^(.*\\.)?unholyknight\\.com$\n^(.*\\.)?uni\\.cc$\n^(.*\\.)?cldr\\.unicode\\.org$\n^(.*\\.)?unification\\.net$\n^(.*\\.)?unitedsocialpress\\.com$\n^(.*\\.)?unix100\\.com$\n^(.*\\.)?unknownspace\\.org$\n^(.*\\.)?unodedos\\.com$\n^(.*\\.)?unpo\\.org$\n^(.*\\.)?untraceable\\.us$\n^(.*\\.)?uocn\\.org$\n^(.*\\.)?tor\\.updatestar\\.com$\n^(.*\\.)?upholdjustice\\.org$\n^(.*\\.)?upload4u\\.info$\n^(.*\\.)?uploaded\\.net$\n^(.*\\.)?uploaded\\.to$\n^(.*\\.)?uploadstation\\.com$\n^(.*\\.)?upornia\\.com$\n^(.*\\.)?tor\\.cn\\.uptodown\\.com$\n^(.*\\.)?upwill\\.org$\n^(.*\\.)?ur7s\\.com$\n^(.*\\.)?urbansurvival\\.com$\n^(.*\\.)?urlborg\\.com$\n^(.*\\.)?urlparser\\.com$\n^(.*\\.)?us\\.to$\n^(.*\\.)?usacn\\.com$\n^(.*\\.)?dalailama\\.usc\\.edu$\n^(.*\\.)?beta\\.usejump\\.com$\n^(.*\\.)?usfk\\.mil$\n^(.*\\.)?usma\\.edu$\n^(.*\\.)?usmc\\.mil$\n^(.*\\.)?tarr\\.uspto\\.gov$\n^(.*\\.)?tsdr\\.uspto\\.gov$\n^(.*\\.)?usus\\.cc$\n^(.*\\.)?utopianpal\\.com$\n^(.*\\.)?uu-gg\\.com$\n^(.*\\.)?uvwxyz\\.xyz$\n^(.*\\.)?uwants\\.com$\n^(.*\\.)?uwants\\.net$\n^(.*\\.)?uyghur-j\\.org$\n^(.*\\.)?uyghuramerican\\.org$\n^(.*\\.)?uyghurcanadiansociety\\.org$\n^(.*\\.)?uyghurcongress\\.org$\n^(.*\\.)?uyghurpen\\.org$\n^(.*\\.)?uyghurpress\\.com$\n^(.*\\.)?uyghurstudies\\.org$\n^(.*\\.)?uygur\\.org$\n^(.*\\.)?uymaarip\\.com$\n^(.*\\.)?v2ray\\.com$\n^(.*\\.)?van001\\.com$\n^(.*\\.)?vanilla-jp\\.com$\n^(.*\\.)?vanpeople\\.com$\n^(.*\\.)?vansky\\.com$\n^(.*\\.)?vcf-online\\.org$\n^(.*\\.)?vcfbuilder\\.org$\n^(.*\\.)?velkaepocha\\.sk$\n^(.*\\.)?venbbs\\.com$\n^(.*\\.)?venchina\\.com$\n^(.*\\.)?veoh\\.com$\n^(.*\\.)?mysite\\.verizon\\.net$\n^(.*\\.)?vermonttibet\\.org$\n^(.*\\.)?verybs\\.com$\n^(.*\\.)?viber\\.com$\n^(.*\\.)?vica\\.info$\n^(.*\\.)?victimsofcommunism\\.org$\n^(.*\\.)?vid\\.me$\n^(.*\\.)?vidble\\.com$\n^(.*\\.)?videobam\\.com$\n^(.*\\.)?videodetective\\.com$\n^(.*\\.)?videomo\\.com$\n^(.*\\.)?videopediaworld\\.com$\n^(.*\\.)?vidinfo\\.org$\n^(.*\\.)?vietdaikynguyen\\.com$\n^(.*\\.)?vijayatemple\\.org$\n^(.*\\.)?viki\\.com$\n^(.*\\.)?vimeo\\.com$\n^(.*\\.)?vimperator\\.org$\n^(.*\\.)?vincnd\\.com$\n^(.*\\.)?vinniev\\.com$\n^(.*\\.)?www\\.lib\\.virginia\\.edu$\n^(.*\\.)?visibletweets\\.com$\n^(.*\\.)?ny\\.visiontimes\\.com$\n^(.*\\.)?vital247\\.org$\n^(.*\\.)?viu\\.com$\n^(.*\\.)?vivahentai4u\\.net$\n^(.*\\.)?vivatube\\.com$\n^(.*\\.)?vivthomas\\.com$\n^(.*\\.)?vllcs\\.org$\n^(.*\\.)?vmixcore\\.com$\n^(.*\\.)?cn\\.voa\\.mobi$\n^(.*\\.)?tw\\.voa\\.mobi$\n^(.*\\.)?voachineseblog\\.com$\n^(.*\\.)?voagd\\.com$\n^(.*\\.)?voacantonese\\.com$\n^(.*\\.)?voachinese\\.com$\n^(.*\\.)?voanews\\.com$\n^(.*\\.)?voatibetan\\.com$\n^(.*\\.)?voatibetanenglish\\.com$\n^(.*\\.)?vocativ\\.com$\n^(.*\\.)?vot\\.org$\n^(.*\\.)?vovo2000\\.com$\n^(.*\\.)?voxer\\.com$\n^(.*\\.)?voy\\.com$\n^(.*\\.)?vporn\\.com$\n^(.*\\.)?vraiesagesse\\.net$\n^(.*\\.)?vtunnel\\.com$\n^(.*\\.)?vuku\\.cc$\n^(.*\\.)?w\\.org$\n^(.*\\.)?lists\\.w3\\.org$\n^(.*\\.)?waffle1999\\.com$\n^(.*\\.)?wahas\\.com$\n^(.*\\.)?waigaobu\\.com$\n^(.*\\.)?waikeung\\.org$\n^(.*\\.)?waiwaier\\.com$\n^(.*\\.)?wallornot\\.org$\n^(.*\\.)?wallpapercasa\\.com$\n^(.*\\.)?waltermartin\\.com$\n^(.*\\.)?waltermartin\\.org$\n^(.*\\.)?www\\.wan-press\\.org$\n^(.*\\.)?wanderinghorse\\.net$\n^(.*\\.)?wangafu\\.net$\n^(.*\\.)?wangjinbo\\.org$\n^(.*\\.)?wanglixiong\\.com$\n^(.*\\.)?wango\\.org$\n^(.*\\.)?wangruoshui\\.net$\n^(.*\\.)?www\\.wangruowang\\.org$\n^(.*\\.)?want-daily\\.com$\n^(.*\\.)?wapedia\\.mobi$\n^(.*\\.)?waselpro\\.com$\n^(.*\\.)?watchinese\\.com$\n^(.*\\.)?wattpad\\.com$\n^(.*\\.)?makzhou\\.warehouse333\\.com$\n^(.*\\.)?washeng\\.net$\n^(.*\\.)?watchmygf\\.net$\n^(.*\\.)?wdf5\\.com$\n^(.*\\.)?wearehairy\\.com$\n^(.*\\.)?wearn\\.com$\n^(.*\\.)?hudatoriq\\.web\\.id$\n^(.*\\.)?web2project\\.net$\n^(.*\\.)?webbang\\.net$\n^(.*\\.)?webevader\\.org$\n^(.*\\.)?webfreer\\.com$\n^(.*\\.)?weblagu\\.com$\n^(.*\\.)?webjb\\.org$\n^(.*\\.)?webrush\\.net$\n^(.*\\.)?webs-tv\\.net$\n^(.*\\.)?websitepulse\\.com$\n^(.*\\.)?www\\.websnapr\\.com$\n^(.*\\.)?webwarper\\.net$\n^(.*\\.)?webworkerdaily\\.com$\n^(.*\\.)?weekmag\\.info$\n^(.*\\.)?wefightcensorship\\.org$\n^(.*\\.)?wefong\\.com$\n^(.*\\.)?weiboleak\\.com$\n^(.*\\.)?weijingsheng\\.org$\n^(.*\\.)?weiming\\.info$\n^(.*\\.)?weiquanwang\\.org$\n^(.*\\.)?weisuo\\.ws$\n^(.*\\.)?welovecock\\.com$\n^(.*\\.)?wemigrate\\.org$\n^(.*\\.)?wengewang\\.com$\n^(.*\\.)?wengewang\\.org$\n^(.*\\.)?wenhui\\.ch$\n^(.*\\.)?trans\\.wenweipo\\.com$\n^(.*\\.)?wenxuecity\\.com$\n^(.*\\.)?wenyunchao\\.com$\n^(.*\\.)?westca\\.com$\n^(.*\\.)?westernwolves\\.com$\n^(.*\\.)?westkit\\.net$\n^(.*\\.)?westpoint\\.edu$\n^(.*\\.)?westernshugdensociety\\.org$\n^(.*\\.)?wetpussygames\\.com$\n^(.*\\.)?wetplace\\.com$\n^(.*\\.)?wexiaobo\\.org$\n^(.*\\.)?wezhiyong\\.org$\n^(.*\\.)?wezone\\.net$\n^(.*\\.)?wforum\\.com$\n^(.*\\.)?whatblocked\\.com$\n^(.*\\.)?wheelockslatin\\.com$\n^(.*\\.)?whippedass\\.com$\n^(.*\\.)?whotalking\\.com$\n^(.*\\.)?whylover\\.com$\n^(.*\\.)?whyx\\.org$\n^(.*\\.)?evchk\\.wikia\\.com$\n^(.*\\.)?cn\\.uncyclopedia\\.wikia\\.com$\n^(.*\\.)?zh\\.uncyclopedia\\.wikia\\.com$\n^(.*\\.)?wikileaks\\.ch$\n^(.*\\.)?wikileaks\\.lu$\n^(.*\\.)?wikileaks\\.org$\n^(.*\\.)?wikileaks\\.pl$\n^(.*\\.)?wikileaks-forum\\.com$\n^(.*\\.)?wildammo\\.com$\n^(.*\\.)?collateralmurder\\.com$\n^(.*\\.)?collateralmurder\\.org$\n^(.*\\.)?wikilivres\\.info$\n^(.*\\.)?wikimapia\\.org$\n^(.*\\.)?zh\\.wikisource\\.org$\n^(.*\\.)?zh\\.wikinews\\.org$\n^(.*\\.)?zh\\.wikivoyage\\.org$\n^(.*\\.)?zh\\.wiktionary\\.org$\n^(.*\\.)?zh\\.wikipedia\\.org$\n^(.*\\.)?zh\\.m\\.wikipedia\\.org$\n^(.*\\.)?casino\\.williamhill\\.com$\n^(.*\\.)?sports\\.williamhill\\.com$\n^(.*\\.)?vegas\\.williamhill\\.com$\n^(.*\\.)?willw\\.net$\n^(.*\\.)?windowsphoneme\\.com$\n^(.*\\.)?winning11\\.com$\n^(.*\\.)?winwhispers\\.info$\n^(.*\\.)?wiredbytes\\.com$\n^(.*\\.)?wiredpen\\.com$\n^(.*\\.)?wireshark\\.org$\n^(.*\\.)?wisdompubs\\.org$\n^(.*\\.)?wisevid\\.com$\n^(.*\\.)?witnessleeteaching\\.com$\n^(.*\\.)?witopia\\.net$\n^(.*\\.)?wjbk\\.org$\n^(.*\\.)?wn\\.com$\n^(.*\\.)?wnacg\\.com$\n^(.*\\.)?wo\\.tc$\n^(.*\\.)?woeser\\.com$\n^(.*\\.)?woesermiddle-way\\.net$\n^(.*\\.)?wokar\\.org$\n^(.*\\.)?wolfax\\.com$\n^(.*\\.)?workatruna\\.com$\n^(.*\\.)?workersthebig\\.net$\n^(.*\\.)?worldcat\\.org$\n^(.*\\.)?worldjournal\\.com$\n^(.*\\.)?wordpress\\.com$\n^(.*\\.)?chenshan20042005\\.wordpress\\.com$\n^(.*\\.)?wp\\.com$\n^(.*\\.)?wow\\.com$\n^(.*\\.)?wow-life\\.net$\n^(.*\\.)?wowlegacy\\.ml$\n^(.*\\.)?woxinghuiguo\\.com$\n^(.*\\.)?woyaolian\\.org$\n^(.*\\.)?wpoforum\\.com$\n^(.*\\.)?wqyd\\.org$\n^(.*\\.)?wrchina\\.org$\n^(.*\\.)?wretch\\.cc$\n^(.*\\.)?wsj\\.com$\n^(.*\\.)?wsj\\.net$\n^(.*\\.)?wsjhk\\.com$\n^(.*\\.)?wtbn\\.org$\n^(.*\\.)?wtfpeople\\.com$\n^(.*\\.)?wuerkaixi\\.com$\n^(.*\\.)?wufafangwen\\.com$\n^(.*\\.)?wuguoguang\\.com$\n^(.*\\.)?wujie\\.net$\n^(.*\\.)?wujieliulan\\.com$\n^(.*\\.)?wukangrui\\.net$\n^(.*\\.)?wwitv\\.com$\n^(.*\\.)?wzyboy\\.im$\n^(.*\\.)?x-berry\\.com$\n^(.*\\.)?x-art\\.com$\n^(.*\\.)?x-wall\\.org$\n^(.*\\.)?x1949x\\.com$\n^(.*\\.)?x365x\\.com$\n^(.*\\.)?xanga\\.com$\n^(.*\\.)?xbabe\\.com$\n^(.*\\.)?xbookcn\\.com$\n^(.*\\.)?xcritic\\.com$\n^(.*\\.)?xda-developers\\.com$\n^(.*\\.)?destiny\\.xfiles\\.to$\n^(.*\\.)?xgmyd\\.com$\n^(.*\\.)?xhamster\\.com$\n^(.*\\.)?xianchawang\\.net$\n^(.*\\.)?xianqiao\\.net$\n^(.*\\.)?xiaochuncnjp\\.com$\n^(.*\\.)?xiaohexie\\.com$\n^(.*\\.)?xiaolan\\.me$\n^(.*\\.)?xiaoma\\.org$\n^(.*\\.)?xiezhua\\.com$\n^(.*\\.)?xihua\\.es$\n^(.*\\.)?xing\\.com$\n^(.*\\.)?xinsheng\\.net$\n^(.*\\.)?xinshijue\\.com$\n^(.*\\.)?xinhuanet\\.org$\n^(.*\\.)?xinyubbs\\.net$\n^(.*\\.)?xiongpian\\.com$\n^(.*\\.)?xiuren\\.org$\n^(.*\\.)?xizang-zhiye\\.org$\n^(.*\\.)?xjp\\.cc$\n^(.*\\.)?xjtravelguide\\.com$\n^(.*\\.)?xlfmtalk\\.com$\n^(.*\\.)?xlfmwz\\.info$\n^(.*\\.)?xml-training-guide\\.com$\n^(.*\\.)?xmovies\\.com$\n^(.*\\.)?xnxx\\.com$\n^(.*\\.)?xpdo\\.net$\n^(.*\\.)?xpud\\.org$\n^(.*\\.)?xrentdvd\\.com$\n^(.*\\.)?xtube\\.com$\n^(.*\\.)?blog\\.xuite\\.net$\n^(.*\\.)?vlog\\.xuite\\.net$\n^(.*\\.)?xuzhiyong\\.net$\n^(.*\\.)?xuchao\\.org$\n^(.*\\.)?xuchao\\.net$\n^(.*\\.)?xvideos\\.com$\n^(.*\\.)?xvideos\\.es$\n^(.*\\.)?xxbbx\\.com$\n^(.*\\.)?xxlmovies\\.com$\n^(.*\\.)?xxx\\.com$\n^(.*\\.)?xxxymovies\\.com$\n^(.*\\.)?xys\\.org$\n^(.*\\.)?xysblogs\\.org$\n^(.*\\.)?page\\.bid\\.yahoo\\.com$\n^(.*\\.)?hk\\.yahoo\\.com$\n^(.*\\.)?hk\\.knowledge\\.yahoo\\.com$\n^(.*\\.)?hk\\.myblog\\.yahoo\\.com$\n^(.*\\.)?hk\\.news\\.yahoo\\.com$\n^(.*\\.)?hk\\.rd\\.yahoo\\.com$\n^(.*\\.)?hk\\.search\\.yahoo\\.com$\n^(.*\\.)?hk\\.video\\.news\\.yahoo\\.com$\n^(.*\\.)?meme\\.yahoo\\.com$\n^(.*\\.)?tw\\.knowledge\\.yahoo\\.com$\n^(.*\\.)?tw\\.mall\\.yahoo\\.com$\n^(.*\\.)?tw\\.yahoo\\.com$\n^(.*\\.)?tw\\.mobi\\.yahoo\\.com$\n^(.*\\.)?tw\\.myblog\\.yahoo\\.com$\n^(.*\\.)?tw\\.news\\.yahoo\\.com$\n^(.*\\.)?pulse\\.yahoo\\.com$\n^(.*\\.)?upcoming\\.yahoo\\.com$\n^(.*\\.)?video\\.yahoo\\.com$\n^(.*\\.)?yakbutterblues\\.com$\n^(.*\\.)?yam\\.com$\n^(.*\\.)?yanghengjun\\.com$\n^(.*\\.)?yangjianli\\.com$\n^(.*\\.)?ydy\\.com$\n^(.*\\.)?yeahteentube\\.com$\n^(.*\\.)?yeelou\\.com$\n^(.*\\.)?yeeyi\\.com$\n^(.*\\.)?yegle\\.net$\n^(.*\\.)?yesasia\\.com$\n^(.*\\.)?yes-news\\.com$\n^(.*\\.)?yecl\\.net$\n^(.*\\.)?yhcw\\.net$\n^(.*\\.)?yibada\\.com$\n^(.*\\.)?yibaochina\\.com$\n^(.*\\.)?yidio\\.com$\n^(.*\\.)?yilubbs\\.com$\n^(.*\\.)?xa\\.yimg\\.com$\n^(.*\\.)?yingsuoss\\.com$\n^(.*\\.)?yipub\\.com$\n^(.*\\.)?yinlei\\.org$\n^(.*\\.)?yobt\\.com$\n^(.*\\.)?yogichen\\.org$\n^(.*\\.)?yong\\.hu$\n^(.*\\.)?yorkbbs\\.ca$\n^(.*\\.)?youxu\\.info$\n^(.*\\.)?youjizz\\.com$\n^(.*\\.)?youmaker\\.com$\n^(.*\\.)?youpai\\.org$\n^(.*\\.)?your-freedom\\.net$\n^(.*\\.)?yourepeat\\.com$\n^(.*\\.)?yousendit\\.com$\n^(.*\\.)?youthnetradio\\.org$\n^(.*\\.)?youporn\\.com$\n^(.*\\.)?youporngay\\.com$\n^(.*\\.)?yourlisten\\.com$\n^(.*\\.)?yourlust\\.com$\n^(.*\\.)?youshun12\\.com$\n^(.*\\.)?youtubecn\\.com$\n^(.*\\.)?youversion\\.com$\n^(.*\\.)?blog\\.youxu\\.info$\n^(.*\\.)?ytht\\.net$\n^(.*\\.)?yuanming\\.net$\n^(.*\\.)?yuanzhengtang\\.org$\n^(.*\\.)?yulghun\\.com$\n^(.*\\.)?yunchao\\.net$\n^(.*\\.)?yuvutu\\.com$\n^(.*\\.)?yvesgeleyn\\.com$\n^(.*\\.)?ywpw\\.com$\n^(.*\\.)?yx51\\.net$\n^(.*\\.)?yyii\\.org$\n^(.*\\.)?yzzk\\.com$\n^(.*\\.)?zacebook\\.com$\n^(.*\\.)?zalmos\\.com$\n^(.*\\.)?zannel\\.com$\n^(.*\\.)?zaobao\\.com$\n^(.*\\.)?zaobao\\.com\\.sg$\n^(.*\\.)?zaozon\\.com$\n^(.*\\.)?zello\\.com$\n^(.*\\.)?zengjinyan\\.org$\n^(.*\\.)?zeutch\\.com$\n^(.*\\.)?zfreet\\.com$\n^(.*\\.)?zgsddh\\.com$\n^(.*\\.)?zgzcjj\\.net$\n^(.*\\.)?zhanbin\\.net$\n^(.*\\.)?zhangboli\\.net$\n^(.*\\.)?zhangtianliang\\.com$\n^(.*\\.)?zhenghui\\.org$\n^(.*\\.)?zhengwunet\\.org$\n^(.*\\.)?zhenlibu\\.info$\n^(.*\\.)?zhenlibu1984\\.com$\n^(.*\\.)?zhenxiang\\.biz$\n^(.*\\.)?zhinengluyou\\.com$\n^(.*\\.)?zhongguo\\.ca$\n^(.*\\.)?zhongguorenquan\\.org$\n^(.*\\.)?zhongguotese\\.net$\n^(.*\\.)?zhongmeng\\.org$\n^(.*\\.)?zhreader\\.com$\n^(.*\\.)?zhuangbi\\.me$\n^(.*\\.)?zhuatieba\\.com$\n^(.*\\.)?zhuichaguoji\\.org$\n^(.*\\.)?book\\.zi5\\.me$\n^(.*\\.)?ziddu\\.com$\n^(.*\\.)?zillionk\\.com$\n^(.*\\.)?zinio\\.com$\n^(.*\\.)?ziplib\\.com$\n^(.*\\.)?ziporn\\.com$\n^(.*\\.)?zkaip\\.com$\n^(.*\\.)?realforum\\.zkiz\\.com$\n^(.*\\.)?zomobo\\.net$\n^(.*\\.)?zonaeuropa\\.com$\n^(.*\\.)?zonghexinwen\\.com$\n^(.*\\.)?zonghexinwen\\.net$\n^(.*\\.)?zootool\\.com$\n^(.*\\.)?zoozle\\.net$\n^(.*\\.)?writer\\.zoho\\.com$\n^(.*\\.)?zshare\\.net$\n^(.*\\.)?zsrhao\\.com$\n^(.*\\.)?zuo\\.la$\n^(.*\\.)?zuobiao\\.me$\n^(.*\\.)?zuola\\.com$\n^(.*\\.)?zvereff\\.com$\n^(.*\\.)?zynaima\\.com$\n^(.*\\.)?zyzc9\\.com$\n^(.*\\.)?zzcartoon\\.com$\n^(.*\\.)?phobos\\.apple\\.com$\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/acl/local.acl",
    "content": "[reject_all]\n\n[white_list]\n127.0.0.1\n::1\n10.0.0.0/8\n172.16.0.0/12\n192.168.0.0/16\nfc00::/7\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/acl/server_block_chn.acl",
    "content": "# All IPs listed here will be blocked while the ss-server try to outbound.\n# Only IP is allowed, *NOT* domain name.\n#\n# The IPs bellow are all IPs in CHN. It'll block ss-server to access all\n# CHN hosts by command\n# `ss-server -s:: -p 8388 -k 123456 --acl acl/server_block_chn.acl`\n\n[outbound_block_list]\n103.235.44.0/22\n1.0.1.0/24\n1.0.2.0/23\n1.0.8.0/21\n1.0.32.0/19\n1.1.0.0/24\n1.1.2.0/23\n1.1.4.0/22\n1.1.8.0/21\n1.1.16.0/20\n1.1.32.0/19\n1.2.0.0/23\n1.2.2.0/24\n1.2.4.0/24\n1.2.5.0/24\n1.2.6.0/23\n1.2.8.0/24\n1.2.9.0/24\n1.2.10.0/23\n1.2.12.0/22\n1.2.16.0/20\n1.2.32.0/19\n1.2.64.0/18\n1.3.0.0/16\n1.4.1.0/24\n1.4.2.0/23\n1.4.4.0/24\n1.4.5.0/24\n1.4.6.0/23\n1.4.8.0/21\n1.4.16.0/20\n1.4.32.0/19\n1.4.64.0/18\n1.8.0.0/16\n1.10.0.0/21\n1.10.8.0/23\n1.10.11.0/24\n1.10.12.0/22\n1.10.16.0/20\n1.10.32.0/19\n1.10.64.0/18\n1.12.0.0/14\n1.24.0.0/13\n1.45.0.0/16\n1.48.0.0/15\n1.50.0.0/16\n1.51.0.0/16\n1.56.0.0/13\n1.68.0.0/14\n1.80.0.0/13\n1.88.0.0/14\n1.92.0.0/15\n1.94.0.0/15\n1.116.0.0/14\n1.180.0.0/14\n1.184.0.0/15\n1.188.0.0/14\n1.192.0.0/13\n1.202.0.0/15\n1.204.0.0/14\n14.0.0.0/21\n14.0.12.0/22\n14.1.0.0/22\n14.16.0.0/12\n14.102.128.0/22\n14.102.156.0/22\n14.103.0.0/16\n14.104.0.0/13\n14.112.0.0/12\n14.130.0.0/15\n14.134.0.0/15\n14.144.0.0/12\n14.192.60.0/22\n14.192.76.0/22\n14.196.0.0/15\n14.204.0.0/15\n14.208.0.0/12\n27.8.0.0/13\n27.16.0.0/12\n27.34.232.0/21\n27.36.0.0/14\n27.40.0.0/13\n27.50.40.0/21\n27.50.128.0/17\n27.54.72.0/21\n27.54.152.0/21\n27.54.192.0/18\n27.98.208.0/20\n27.98.224.0/19\n27.99.128.0/17\n27.103.0.0/16\n27.106.128.0/18\n27.106.204.0/22\n27.109.32.0/19\n27.112.0.0/18\n27.112.80.0/20\n27.113.128.0/18\n27.115.0.0/17\n27.116.44.0/22\n27.121.72.0/21\n27.121.120.0/21\n27.128.0.0/15\n27.131.220.0/22\n27.144.0.0/16\n27.148.0.0/14\n27.152.0.0/13\n27.184.0.0/13\n27.192.0.0/11\n27.224.0.0/14\n36.0.0.0/22\n36.0.8.0/21\n36.0.16.0/20\n36.0.32.0/19\n36.0.64.0/18\n36.0.128.0/17\n36.1.0.0/16\n36.4.0.0/14\n36.16.0.0/12\n36.32.0.0/14\n36.36.0.0/16\n36.37.0.0/19\n36.37.36.0/23\n36.37.39.0/24\n36.37.40.0/21\n36.37.48.0/20\n36.40.0.0/13\n36.48.0.0/15\n36.51.0.0/16\n36.56.0.0/13\n36.96.0.0/11\n36.128.0.0/10\n36.192.0.0/11\n36.248.0.0/14\n36.254.0.0/16\n39.0.0.0/24\n39.0.2.0/23\n39.0.4.0/22\n39.0.8.0/21\n39.0.16.0/20\n39.0.32.0/19\n39.0.64.0/18\n39.0.128.0/17\n39.64.0.0/11\n39.128.0.0/10\n42.0.0.0/22\n42.0.8.0/21\n42.0.16.0/21\n42.0.24.0/22\n42.0.32.0/19\n42.0.128.0/17\n42.1.0.0/19\n42.1.32.0/20\n42.1.48.0/21\n42.1.56.0/22\n42.1.128.0/17\n42.4.0.0/14\n42.48.0.0/15\n42.50.0.0/16\n42.51.0.0/16\n42.52.0.0/14\n42.56.0.0/14\n42.62.0.0/17\n42.62.128.0/19\n42.62.160.0/20\n42.62.180.0/22\n42.62.184.0/21\n42.63.0.0/16\n42.80.0.0/15\n42.83.64.0/20\n42.83.80.0/22\n42.83.88.0/21\n42.83.96.0/19\n42.83.128.0/17\n42.84.0.0/14\n42.88.0.0/13\n42.96.64.0/19\n42.96.96.0/21\n42.96.108.0/22\n42.96.112.0/20\n42.96.128.0/17\n42.97.0.0/16\n42.99.0.0/18\n42.99.64.0/19\n42.99.96.0/20\n42.99.112.0/22\n42.99.120.0/21\n42.100.0.0/14\n42.120.0.0/15\n42.122.0.0/16\n42.123.0.0/19\n42.123.36.0/22\n42.123.40.0/21\n42.123.48.0/20\n42.123.64.0/18\n42.123.128.0/17\n42.128.0.0/12\n42.156.0.0/19\n42.156.36.0/22\n42.156.40.0/21\n42.156.48.0/20\n42.156.64.0/18\n42.156.128.0/17\n42.157.0.0/16\n42.158.0.0/15\n42.160.0.0/12\n42.176.0.0/13\n42.184.0.0/15\n42.186.0.0/16\n42.187.0.0/18\n42.187.64.0/19\n42.187.96.0/20\n42.187.112.0/21\n42.187.120.0/22\n42.187.128.0/17\n42.192.0.0/15\n42.194.0.0/21\n42.194.8.0/22\n42.194.12.0/22\n42.194.16.0/20\n42.194.32.0/19\n42.194.64.0/18\n42.194.128.0/17\n42.195.0.0/16\n42.196.0.0/14\n42.201.0.0/17\n42.202.0.0/15\n42.204.0.0/14\n42.208.0.0/12\n42.224.0.0/12\n42.240.0.0/17\n42.240.128.0/17\n42.242.0.0/15\n42.244.0.0/14\n42.248.0.0/13\n49.4.0.0/14\n49.51.0.0/16\n49.52.0.0/14\n49.64.0.0/11\n49.112.0.0/13\n49.120.0.0/14\n49.128.0.0/24\n49.128.2.0/23\n49.140.0.0/15\n49.152.0.0/14\n49.208.0.0/15\n49.210.0.0/15\n49.220.0.0/14\n49.232.0.0/14\n49.239.0.0/18\n49.239.192.0/18\n49.246.224.0/19\n54.222.0.0/15\n58.14.0.0/15\n58.16.0.0/16\n58.17.0.0/17\n58.17.128.0/17\n58.18.0.0/16\n58.19.0.0/16\n58.20.0.0/16\n58.21.0.0/16\n58.22.0.0/15\n58.24.0.0/15\n58.30.0.0/15\n58.32.0.0/13\n58.40.0.0/15\n58.42.0.0/16\n58.43.0.0/16\n58.44.0.0/14\n58.48.0.0/13\n58.56.0.0/15\n58.58.0.0/16\n58.59.0.0/17\n58.59.128.0/17\n58.60.0.0/14\n58.65.232.0/21\n58.66.0.0/15\n58.68.128.0/17\n58.82.0.0/17\n58.83.0.0/17\n58.83.128.0/17\n58.87.64.0/18\n58.99.128.0/17\n58.100.0.0/15\n58.116.0.0/14\n58.128.0.0/13\n58.144.0.0/16\n58.154.0.0/15\n58.192.0.0/15\n58.194.0.0/15\n58.196.0.0/15\n58.198.0.0/15\n58.200.0.0/13\n58.208.0.0/12\n58.240.0.0/15\n58.242.0.0/15\n58.244.0.0/15\n58.246.0.0/15\n58.248.0.0/13\n59.32.0.0/13\n59.40.0.0/15\n59.42.0.0/16\n59.43.0.0/16\n59.44.0.0/14\n59.48.0.0/16\n59.49.0.0/17\n59.49.128.0/17\n59.50.0.0/16\n59.51.0.0/17\n59.51.128.0/17\n59.52.0.0/14\n59.56.0.0/14\n59.60.0.0/15\n59.62.0.0/15\n59.64.0.0/14\n59.68.0.0/14\n59.72.0.0/15\n59.74.0.0/15\n59.76.0.0/16\n59.77.0.0/16\n59.78.0.0/15\n59.80.0.0/14\n59.107.0.0/17\n59.107.128.0/17\n59.108.0.0/15\n59.110.0.0/15\n59.151.0.0/17\n59.155.0.0/16\n59.172.0.0/15\n59.174.0.0/15\n59.191.0.0/17\n59.191.240.0/20\n59.192.0.0/10\n60.0.0.0/13\n60.8.0.0/15\n60.10.0.0/16\n60.11.0.0/16\n60.12.0.0/16\n60.13.0.0/18\n60.13.64.0/18\n60.13.128.0/17\n60.14.0.0/15\n60.16.0.0/13\n60.24.0.0/14\n60.28.0.0/15\n60.30.0.0/16\n60.31.0.0/16\n60.55.0.0/16\n60.63.0.0/16\n60.160.0.0/15\n60.162.0.0/15\n60.164.0.0/15\n60.166.0.0/15\n60.168.0.0/13\n60.176.0.0/12\n60.194.0.0/15\n60.200.0.0/14\n60.204.0.0/16\n60.205.0.0/16\n60.206.0.0/15\n60.208.0.0/13\n60.216.0.0/15\n60.218.0.0/15\n60.220.0.0/14\n60.232.0.0/15\n60.235.0.0/16\n60.245.128.0/17\n60.247.0.0/16\n60.252.0.0/16\n60.253.128.0/17\n60.255.0.0/16\n61.4.80.0/22\n61.4.84.0/22\n61.4.88.0/21\n61.4.176.0/20\n61.8.160.0/20\n61.28.0.0/20\n61.28.16.0/20\n61.28.32.0/19\n61.28.64.0/18\n61.29.128.0/18\n61.29.192.0/19\n61.29.224.0/20\n61.29.240.0/20\n61.45.128.0/18\n61.45.224.0/20\n61.47.128.0/18\n61.48.0.0/14\n61.52.0.0/15\n61.54.0.0/16\n61.55.0.0/16\n61.87.192.0/18\n61.128.0.0/15\n61.130.0.0/15\n61.132.0.0/16\n61.133.0.0/17\n61.133.128.0/17\n61.134.0.0/18\n61.134.64.0/19\n61.134.96.0/19\n61.134.128.0/18\n61.134.192.0/18\n61.135.0.0/16\n61.136.0.0/18\n61.136.64.0/18\n61.136.128.0/17\n61.137.0.0/17\n61.137.128.0/17\n61.138.0.0/18\n61.138.64.0/18\n61.138.128.0/18\n61.138.192.0/18\n61.139.0.0/17\n61.139.128.0/18\n61.139.192.0/18\n61.140.0.0/14\n61.144.0.0/14\n61.148.0.0/15\n61.150.0.0/15\n61.152.0.0/16\n61.153.0.0/16\n61.154.0.0/15\n61.156.0.0/16\n61.157.0.0/16\n61.158.0.0/17\n61.158.128.0/17\n61.159.0.0/18\n61.159.64.0/18\n61.159.128.0/17\n61.160.0.0/16\n61.161.0.0/18\n61.161.64.0/18\n61.161.128.0/17\n61.162.0.0/16\n61.163.0.0/16\n61.164.0.0/16\n61.165.0.0/16\n61.166.0.0/16\n61.167.0.0/16\n61.168.0.0/16\n61.169.0.0/16\n61.170.0.0/15\n61.172.0.0/14\n61.176.0.0/16\n61.177.0.0/16\n61.178.0.0/16\n61.179.0.0/16\n61.180.0.0/17\n61.180.128.0/17\n61.181.0.0/16\n61.182.0.0/16\n61.183.0.0/16\n61.184.0.0/14\n61.188.0.0/16\n61.189.0.0/17\n61.189.128.0/17\n61.190.0.0/15\n61.232.0.0/14\n61.236.0.0/15\n61.240.0.0/14\n101.0.0.0/22\n101.1.0.0/22\n101.2.172.0/22\n101.4.0.0/14\n101.16.0.0/12\n101.32.0.0/12\n101.48.0.0/15\n101.50.56.0/22\n101.52.0.0/16\n101.53.100.0/22\n101.54.0.0/16\n101.55.224.0/21\n101.64.0.0/13\n101.72.0.0/14\n101.76.0.0/15\n101.78.0.0/22\n101.78.32.0/19\n101.80.0.0/12\n101.96.0.0/21\n101.96.8.0/22\n101.96.16.0/20\n101.96.128.0/17\n101.99.96.0/19\n101.101.64.0/19\n101.101.100.0/24\n101.101.102.0/23\n101.101.104.0/21\n101.101.112.0/20\n101.102.64.0/19\n101.102.100.0/23\n101.102.102.0/24\n101.102.104.0/21\n101.102.112.0/20\n101.104.0.0/14\n101.110.64.0/19\n101.110.96.0/20\n101.110.116.0/22\n101.110.120.0/21\n101.120.0.0/14\n101.124.0.0/15\n101.126.0.0/16\n101.128.0.0/22\n101.128.8.0/21\n101.128.16.0/20\n101.128.32.0/19\n101.129.0.0/16\n101.130.0.0/15\n101.132.0.0/14\n101.144.0.0/12\n101.192.0.0/14\n101.196.0.0/14\n101.200.0.0/15\n101.203.128.0/19\n101.203.160.0/21\n101.203.172.0/22\n101.203.176.0/20\n101.204.0.0/14\n101.224.0.0/13\n101.232.0.0/15\n101.234.64.0/21\n101.234.76.0/22\n101.234.80.0/20\n101.234.96.0/19\n101.236.0.0/14\n101.240.0.0/14\n101.244.0.0/14\n101.248.0.0/15\n101.251.0.0/22\n101.251.8.0/21\n101.251.16.0/20\n101.251.32.0/19\n101.251.64.0/18\n101.251.128.0/17\n101.252.0.0/15\n101.254.0.0/16\n103.1.8.0/22\n103.1.20.0/22\n103.1.24.0/22\n103.1.72.0/22\n103.1.88.0/22\n103.1.168.0/22\n103.2.108.0/22\n103.2.156.0/22\n103.2.164.0/22\n103.2.200.0/22\n103.2.204.0/22\n103.2.208.0/22\n103.2.212.0/22\n103.3.84.0/22\n103.3.88.0/22\n103.3.92.0/22\n103.3.96.0/22\n103.3.100.0/22\n103.3.104.0/22\n103.3.108.0/22\n103.3.112.0/22\n103.3.116.0/22\n103.3.120.0/22\n103.3.124.0/22\n103.3.128.0/22\n103.3.132.0/22\n103.3.136.0/22\n103.3.140.0/22\n103.3.148.0/22\n103.3.152.0/22\n103.3.156.0/22\n103.4.56.0/22\n103.4.168.0/22\n103.4.184.0/22\n103.5.36.0/22\n103.5.52.0/22\n103.5.56.0/22\n103.5.252.0/22\n103.6.76.0/22\n103.6.220.0/22\n103.7.4.0/22\n103.7.28.0/22\n103.7.212.0/22\n103.7.216.0/22\n103.7.220.0/22\n103.8.4.0/22\n103.8.8.0/22\n103.8.32.0/22\n103.8.52.0/22\n103.8.108.0/22\n103.8.156.0/22\n103.8.200.0/22\n103.8.204.0/22\n103.8.220.0/22\n103.9.152.0/22\n103.9.248.0/22\n103.9.252.0/22\n103.10.0.0/22\n103.10.16.0/22\n103.10.84.0/22\n103.10.111.0/24\n103.10.140.0/22\n103.11.180.0/22\n103.12.32.0/22\n103.12.68.0/22\n103.12.136.0/22\n103.12.184.0/22\n103.12.232.0/22\n103.13.124.0/22\n103.13.144.0/22\n103.13.196.0/22\n103.13.244.0/22\n103.14.84.0/22\n103.14.112.0/22\n103.14.132.0/22\n103.14.136.0/22\n103.14.156.0/22\n103.14.240.0/22\n103.15.4.0/22\n103.15.8.0/22\n103.15.16.0/22\n103.15.96.0/22\n103.15.200.0/22\n103.16.52.0/22\n103.16.80.0/22\n103.16.84.0/22\n103.16.88.0/22\n103.16.108.0/22\n103.16.124.0/22\n103.17.40.0/22\n103.17.120.0/22\n103.17.160.0/22\n103.17.204.0/22\n103.17.228.0/22\n103.18.192.0/22\n103.18.208.0/22\n103.18.212.0/22\n103.18.224.0/22\n103.19.12.0/22\n103.19.40.0/22\n103.19.44.0/22\n103.19.64.0/22\n103.19.68.0/22\n103.19.72.0/22\n103.19.232.0/22\n103.20.12.0/22\n103.20.32.0/22\n103.20.112.0/22\n103.20.128.0/22\n103.20.160.0/22\n103.20.248.0/22\n103.21.112.0/22\n103.21.116.0/22\n103.21.136.0/22\n103.21.140.0/22\n103.21.176.0/22\n103.21.208.0/22\n103.21.240.0/22\n103.22.0.0/22\n103.22.4.0/22\n103.22.8.0/22\n103.22.12.0/22\n103.22.16.0/22\n103.22.20.0/22\n103.22.24.0/22\n103.22.28.0/22\n103.22.32.0/22\n103.22.36.0/22\n103.22.40.0/22\n103.22.44.0/22\n103.22.48.0/22\n103.22.52.0/22\n103.22.56.0/22\n103.22.60.0/22\n103.22.64.0/22\n103.22.68.0/22\n103.22.72.0/22\n103.22.76.0/22\n103.22.80.0/22\n103.22.84.0/22\n103.22.88.0/22\n103.22.92.0/22\n103.22.100.0/22\n103.22.104.0/22\n103.22.108.0/22\n103.22.112.0/22\n103.22.116.0/22\n103.22.120.0/22\n103.22.124.0/22\n103.22.188.0/22\n103.22.228.0/22\n103.22.252.0/22\n103.23.8.0/22\n103.23.56.0/22\n103.23.160.0/22\n103.23.164.0/22\n103.23.176.0/22\n103.23.228.0/22\n103.24.116.0/22\n103.24.128.0/22\n103.24.144.0/22\n103.24.176.0/22\n103.24.184.0/22\n103.24.220.0/22\n103.24.228.0/22\n103.24.248.0/22\n103.24.252.0/22\n103.25.8.0/23\n103.25.20.0/22\n103.25.24.0/22\n103.25.28.0/22\n103.25.32.0/22\n103.25.36.0/22\n103.25.40.0/22\n103.25.48.0/22\n103.25.64.0/22\n103.25.68.0/22\n103.25.148.0/22\n103.25.156.0/22\n103.25.216.0/22\n103.26.0.0/22\n103.26.64.0/22\n103.26.156.0/22\n103.26.160.0/22\n103.26.228.0/22\n103.26.240.0/22\n103.27.4.0/22\n103.27.12.0/22\n103.27.24.0/22\n103.27.56.0/22\n103.27.96.0/22\n103.27.208.0/22\n103.27.240.0/22\n103.28.4.0/22\n103.28.8.0/22\n103.28.204.0/22\n103.29.16.0/22\n103.29.128.0/22\n103.29.132.0/22\n103.29.136.0/22\n103.30.20.0/22\n103.30.96.0/22\n103.30.148.0/22\n103.30.200.0/22\n103.30.216.0/22\n103.30.228.0/22\n103.30.232.0/22\n103.30.236.0/22\n103.31.0.0/22\n103.31.48.0/22\n103.31.52.0/22\n103.31.56.0/22\n103.31.60.0/22\n103.31.64.0/22\n103.31.68.0/22\n103.31.72.0/22\n103.31.148.0/22\n103.31.160.0/22\n103.31.168.0/22\n103.31.200.0/22\n103.224.40.0/22\n103.224.44.0/22\n103.224.60.0/22\n103.224.80.0/22\n103.224.220.0/22\n103.224.224.0/22\n103.224.228.0/22\n103.224.232.0/22\n103.225.84.0/22\n103.226.16.0/22\n103.226.40.0/22\n103.226.56.0/22\n103.226.60.0/22\n103.226.80.0/22\n103.226.116.0/22\n103.226.132.0/22\n103.226.156.0/22\n103.226.180.0/22\n103.226.196.0/22\n103.227.48.0/22\n103.227.72.0/22\n103.227.76.0/22\n103.227.80.0/22\n103.227.100.0/22\n103.227.120.0/22\n103.227.132.0/22\n103.227.136.0/22\n103.227.196.0/22\n103.227.204.0/22\n103.227.212.0/22\n103.227.228.0/22\n103.228.12.0/22\n103.228.28.0/22\n103.228.68.0/22\n103.228.88.0/22\n103.228.128.0/22\n103.228.160.0/22\n103.228.176.0/22\n103.228.204.0/22\n103.228.208.0/22\n103.228.228.0/22\n103.228.232.0/22\n103.229.20.0/22\n103.229.136.0/22\n103.229.148.0/22\n103.229.172.0/22\n103.229.212.0/22\n103.229.216.0/22\n103.229.220.0/22\n103.229.228.0/22\n103.229.236.0/22\n103.229.240.0/22\n103.230.0.0/22\n103.230.28.0/22\n103.230.40.0/22\n103.230.44.0/22\n103.230.96.0/22\n103.230.196.0/22\n103.230.200.0/22\n103.230.204.0/22\n103.230.212.0/22\n103.230.236.0/22\n103.231.16.0/22\n103.231.20.0/22\n103.231.64.0/22\n103.231.68.0/22\n103.240.16.0/22\n103.240.36.0/22\n103.240.72.0/22\n103.240.84.0/22\n103.240.124.0/22\n103.240.156.0/22\n103.240.172.0/22\n103.240.244.0/22\n103.241.12.0/22\n103.241.72.0/22\n103.241.92.0/22\n103.241.96.0/22\n103.241.160.0/22\n103.241.184.0/22\n103.241.188.0/22\n103.241.220.0/22\n103.242.8.0/22\n103.242.64.0/22\n103.242.128.0/22\n103.242.132.0/22\n103.242.160.0/22\n103.242.168.0/22\n103.242.172.0/22\n103.242.176.0/22\n103.242.200.0/22\n103.242.212.0/22\n103.242.220.0/22\n103.242.240.0/22\n103.243.24.0/22\n103.243.136.0/22\n103.243.252.0/22\n103.244.16.0/22\n103.244.56.0/22\n103.244.60.0/22\n103.244.64.0/22\n103.244.68.0/22\n103.244.72.0/22\n103.244.76.0/22\n103.244.80.0/22\n103.244.84.0/22\n103.244.164.0/22\n103.244.232.0/22\n103.244.252.0/22\n103.245.23.0/24\n103.245.52.0/22\n103.245.60.0/22\n103.245.80.0/22\n103.245.124.0/22\n103.245.128.0/22\n103.246.8.0/22\n103.246.12.0/22\n103.246.120.0/22\n103.246.124.0/22\n103.246.132.0/22\n103.246.152.0/22\n103.246.156.0/22\n103.247.168.0/22\n103.247.172.0/22\n103.247.176.0/22\n103.247.200.0/22\n103.247.212.0/22\n103.248.0.0/23\n103.248.64.0/22\n103.248.100.0/22\n103.248.124.0/22\n103.248.152.0/22\n103.248.168.0/22\n103.248.192.0/22\n103.248.212.0/22\n103.248.224.0/22\n103.248.228.0/22\n103.249.12.0/22\n103.249.52.0/22\n103.249.128.0/22\n103.249.136.0/22\n103.249.144.0/22\n103.249.164.0/22\n103.249.168.0/22\n103.249.172.0/22\n103.249.176.0/22\n103.249.188.0/22\n103.249.192.0/22\n103.249.244.0/22\n103.249.252.0/22\n103.250.32.0/22\n103.250.104.0/22\n103.250.124.0/22\n103.250.180.0/22\n103.250.192.0/22\n103.250.216.0/22\n103.250.224.0/22\n103.250.236.0/22\n103.250.248.0/22\n103.250.252.0/22\n103.251.32.0/22\n103.251.84.0/22\n103.251.96.0/22\n103.251.124.0/22\n103.251.128.0/22\n103.251.160.0/22\n103.251.204.0/22\n103.251.236.0/22\n103.251.240.0/22\n103.252.28.0/22\n103.252.36.0/22\n103.252.64.0/22\n103.252.104.0/22\n103.252.172.0/22\n103.252.204.0/22\n103.252.208.0/22\n103.252.232.0/22\n103.252.248.0/22\n103.253.4.0/22\n103.253.60.0/22\n103.253.204.0/22\n103.253.220.0/22\n103.253.224.0/22\n103.253.232.0/22\n103.254.8.0/22\n103.254.20.0/22\n103.254.64.0/22\n103.254.68.0/22\n103.254.72.0/22\n103.254.76.0/22\n103.254.112.0/22\n103.254.148.0/22\n103.254.176.0/22\n103.254.188.0/22\n103.254.196.0/24\n103.254.220.0/22\n103.255.68.0/22\n103.255.88.0/22\n103.255.92.0/22\n103.255.136.0/22\n103.255.140.0/22\n103.255.184.0/22\n103.255.200.0/22\n103.255.208.0/22\n103.255.212.0/22\n103.255.228.0/22\n106.0.0.0/24\n106.0.2.0/23\n106.0.4.0/22\n106.0.8.0/21\n106.0.16.0/20\n106.0.64.0/18\n106.2.0.0/15\n106.4.0.0/14\n106.8.0.0/15\n106.11.0.0/16\n106.12.0.0/14\n106.16.0.0/12\n106.32.0.0/12\n106.48.0.0/15\n106.50.0.0/16\n106.52.0.0/14\n106.56.0.0/13\n106.74.0.0/15\n106.80.0.0/12\n106.108.0.0/14\n106.112.0.0/13\n106.120.0.0/13\n106.224.0.0/12\n110.6.0.0/15\n110.16.0.0/14\n110.40.0.0/14\n110.44.144.0/20\n110.48.0.0/16\n110.51.0.0/16\n110.52.0.0/15\n110.56.0.0/13\n110.64.0.0/15\n110.72.0.0/15\n110.75.0.0/17\n110.75.128.0/19\n110.75.160.0/19\n110.75.192.0/18\n110.76.0.0/19\n110.76.32.0/19\n110.76.156.0/22\n110.76.184.0/22\n110.76.192.0/18\n110.77.0.0/17\n110.80.0.0/13\n110.88.0.0/14\n110.93.32.0/19\n110.94.0.0/15\n110.96.0.0/11\n110.152.0.0/14\n110.156.0.0/15\n110.165.32.0/19\n110.166.0.0/15\n110.172.192.0/18\n110.173.0.0/19\n110.173.32.0/20\n110.173.64.0/19\n110.173.96.0/19\n110.173.192.0/19\n110.176.0.0/13\n110.184.0.0/13\n110.192.0.0/11\n110.228.0.0/14\n110.232.32.0/19\n110.236.0.0/15\n110.240.0.0/12\n111.0.0.0/10\n111.66.0.0/16\n111.67.192.0/20\n111.68.64.0/19\n111.72.0.0/13\n111.85.0.0/16\n111.91.192.0/19\n111.112.0.0/15\n111.114.0.0/15\n111.116.0.0/15\n111.118.200.0/21\n111.119.64.0/18\n111.119.128.0/19\n111.120.0.0/14\n111.124.0.0/16\n111.126.0.0/15\n111.128.0.0/11\n111.160.0.0/13\n111.170.0.0/16\n111.172.0.0/14\n111.176.0.0/13\n111.186.0.0/15\n111.192.0.0/12\n111.208.0.0/14\n111.212.0.0/14\n111.221.128.0/17\n111.222.0.0/16\n111.223.240.0/22\n111.223.248.0/22\n111.224.0.0/14\n111.228.0.0/14\n111.235.96.0/19\n111.235.156.0/22\n111.235.160.0/19\n112.0.0.0/10\n112.64.0.0/15\n112.66.0.0/15\n112.73.0.0/16\n112.74.0.0/15\n112.80.0.0/13\n112.88.0.0/13\n112.96.0.0/15\n112.98.0.0/15\n112.100.0.0/14\n112.109.128.0/17\n112.111.0.0/16\n112.112.0.0/14\n112.116.0.0/15\n112.122.0.0/15\n112.124.0.0/14\n112.128.0.0/14\n112.132.0.0/16\n112.137.48.0/21\n112.192.0.0/14\n112.224.0.0/11\n113.0.0.0/13\n113.8.0.0/15\n113.11.192.0/19\n113.12.0.0/14\n113.16.0.0/15\n113.18.0.0/16\n113.24.0.0/14\n113.31.0.0/16\n113.44.0.0/14\n113.48.0.0/14\n113.52.160.0/19\n113.54.0.0/15\n113.56.0.0/15\n113.58.0.0/16\n113.59.0.0/17\n113.59.224.0/22\n113.62.0.0/15\n113.64.0.0/11\n113.96.0.0/12\n113.112.0.0/13\n113.120.0.0/13\n113.128.0.0/15\n113.130.96.0/20\n113.130.112.0/21\n113.132.0.0/14\n113.136.0.0/13\n113.194.0.0/15\n113.197.100.0/22\n113.200.0.0/15\n113.202.0.0/16\n113.204.0.0/14\n113.208.96.0/19\n113.208.128.0/17\n113.209.0.0/16\n113.212.0.0/18\n113.212.100.0/22\n113.212.184.0/21\n113.213.0.0/17\n113.214.0.0/15\n113.218.0.0/15\n113.220.0.0/14\n113.224.0.0/12\n113.240.0.0/13\n113.248.0.0/14\n114.28.0.0/16\n114.54.0.0/15\n114.60.0.0/14\n114.64.0.0/14\n114.68.0.0/16\n114.79.64.0/18\n114.80.0.0/12\n114.96.0.0/13\n114.104.0.0/14\n114.110.0.0/20\n114.110.64.0/18\n114.111.0.0/19\n114.111.160.0/19\n114.112.0.0/14\n114.116.0.0/15\n114.118.0.0/15\n114.132.0.0/16\n114.135.0.0/16\n114.138.0.0/15\n114.141.64.0/21\n114.141.128.0/18\n114.196.0.0/15\n114.198.248.0/21\n114.208.0.0/14\n114.212.0.0/15\n114.214.0.0/16\n114.215.0.0/16\n114.216.0.0/13\n114.224.0.0/12\n114.240.0.0/12\n115.24.0.0/14\n115.28.0.0/15\n115.32.0.0/14\n115.44.0.0/15\n115.46.0.0/16\n115.47.0.0/16\n115.48.0.0/12\n115.69.64.0/20\n115.84.0.0/18\n115.84.192.0/19\n115.85.192.0/18\n115.100.0.0/14\n115.104.0.0/14\n115.120.0.0/14\n115.124.16.0/20\n115.148.0.0/14\n115.152.0.0/15\n115.154.0.0/15\n115.156.0.0/15\n115.158.0.0/16\n115.159.0.0/16\n115.166.64.0/19\n115.168.0.0/14\n115.172.0.0/14\n115.180.0.0/14\n115.190.0.0/15\n115.192.0.0/11\n115.224.0.0/12\n116.0.8.0/21\n116.0.24.0/21\n116.1.0.0/16\n116.2.0.0/15\n116.4.0.0/14\n116.8.0.0/14\n116.13.0.0/16\n116.16.0.0/12\n116.50.0.0/20\n116.52.0.0/14\n116.56.0.0/15\n116.58.128.0/20\n116.58.208.0/20\n116.60.0.0/14\n116.66.0.0/17\n116.69.0.0/16\n116.70.0.0/17\n116.76.0.0/15\n116.78.0.0/15\n116.85.0.0/16\n116.89.144.0/20\n116.90.80.0/20\n116.90.184.0/21\n116.95.0.0/16\n116.112.0.0/14\n116.116.0.0/15\n116.128.0.0/10\n116.192.0.0/16\n116.193.16.0/20\n116.193.32.0/19\n116.193.176.0/21\n116.194.0.0/15\n116.196.0.0/16\n116.198.0.0/16\n116.199.0.0/17\n116.199.128.0/19\n116.204.0.0/15\n116.207.0.0/16\n116.208.0.0/14\n116.212.160.0/20\n116.213.64.0/18\n116.213.128.0/17\n116.214.32.0/19\n116.214.64.0/20\n116.214.128.0/17\n116.215.0.0/16\n116.216.0.0/14\n116.224.0.0/12\n116.242.0.0/15\n116.244.0.0/15\n116.246.0.0/15\n116.248.0.0/15\n116.251.64.0/18\n116.252.0.0/15\n116.254.128.0/17\n116.255.128.0/17\n117.8.0.0/13\n117.21.0.0/16\n117.22.0.0/15\n117.24.0.0/13\n117.32.0.0/13\n117.40.0.0/14\n117.44.0.0/15\n117.48.0.0/14\n117.53.48.0/20\n117.53.176.0/20\n117.57.0.0/16\n117.58.0.0/17\n117.59.0.0/16\n117.60.0.0/14\n117.64.0.0/13\n117.72.0.0/15\n117.74.64.0/20\n117.74.80.0/20\n117.74.128.0/17\n117.75.0.0/16\n117.76.0.0/14\n117.80.0.0/12\n117.100.0.0/15\n117.103.16.0/20\n117.103.40.0/21\n117.103.72.0/21\n117.103.128.0/20\n117.104.168.0/21\n117.106.0.0/15\n117.112.0.0/13\n117.120.64.0/18\n117.120.128.0/17\n117.121.0.0/17\n117.121.128.0/18\n117.121.192.0/21\n117.122.128.0/17\n117.124.0.0/14\n117.128.0.0/10\n118.24.0.0/15\n118.26.0.0/16\n118.28.0.0/15\n118.30.0.0/16\n118.31.0.0/16\n118.64.0.0/15\n118.66.0.0/16\n118.67.112.0/20\n118.72.0.0/13\n118.80.0.0/15\n118.84.0.0/15\n118.88.32.0/19\n118.88.64.0/18\n118.88.128.0/17\n118.89.0.0/16\n118.91.240.0/20\n118.102.16.0/20\n118.102.32.0/21\n118.112.0.0/13\n118.120.0.0/14\n118.124.0.0/15\n118.126.0.0/16\n118.127.128.0/19\n118.132.0.0/14\n118.144.0.0/14\n118.178.0.0/16\n118.180.0.0/14\n118.184.0.0/16\n118.186.0.0/15\n118.188.0.0/16\n118.190.0.0/15\n118.192.0.0/15\n118.194.0.0/17\n118.194.128.0/17\n118.195.0.0/17\n118.195.128.0/17\n118.196.0.0/14\n118.202.0.0/15\n118.204.0.0/14\n118.212.0.0/16\n118.213.0.0/16\n118.224.0.0/14\n118.228.0.0/15\n118.230.0.0/16\n118.239.0.0/16\n118.242.0.0/16\n118.244.0.0/14\n118.248.0.0/13\n119.0.0.0/15\n119.2.0.0/19\n119.2.128.0/17\n119.3.0.0/16\n119.4.0.0/14\n119.8.0.0/16\n119.10.0.0/17\n119.15.136.0/21\n119.16.0.0/16\n119.18.192.0/20\n119.18.208.0/21\n119.18.224.0/20\n119.18.240.0/20\n119.19.0.0/16\n119.20.0.0/14\n119.27.64.0/18\n119.27.128.0/19\n119.27.160.0/19\n119.27.192.0/18\n119.28.0.0/15\n119.30.48.0/20\n119.31.192.0/19\n119.32.0.0/14\n119.36.0.0/16\n119.37.0.0/17\n119.37.128.0/18\n119.37.192.0/18\n119.38.0.0/17\n119.38.128.0/18\n119.38.192.0/20\n119.38.208.0/20\n119.38.224.0/19\n119.39.0.0/16\n119.40.0.0/18\n119.40.64.0/20\n119.40.128.0/17\n119.41.0.0/16\n119.42.0.0/19\n119.42.128.0/21\n119.42.136.0/21\n119.42.224.0/19\n119.44.0.0/15\n119.48.0.0/13\n119.57.0.0/16\n119.58.0.0/16\n119.59.128.0/17\n119.60.0.0/16\n119.61.0.0/16\n119.62.0.0/16\n119.63.32.0/19\n119.75.208.0/20\n119.78.0.0/15\n119.80.0.0/16\n119.82.208.0/20\n119.84.0.0/14\n119.88.0.0/14\n119.96.0.0/13\n119.108.0.0/15\n119.112.0.0/13\n119.120.0.0/13\n119.128.0.0/12\n119.144.0.0/14\n119.148.160.0/20\n119.148.176.0/20\n119.151.192.0/18\n119.160.200.0/21\n119.161.128.0/17\n119.162.0.0/15\n119.164.0.0/14\n119.176.0.0/12\n119.232.0.0/15\n119.235.128.0/18\n119.248.0.0/14\n119.252.96.0/21\n119.252.240.0/20\n119.253.0.0/16\n119.254.0.0/15\n120.0.0.0/12\n120.24.0.0/14\n120.30.0.0/16\n120.31.0.0/16\n120.32.0.0/13\n120.40.0.0/14\n120.44.0.0/14\n120.48.0.0/15\n120.52.0.0/14\n120.64.0.0/14\n120.68.0.0/14\n120.72.32.0/19\n120.72.128.0/17\n120.76.0.0/14\n120.80.0.0/13\n120.88.8.0/21\n120.90.0.0/15\n120.92.0.0/16\n120.94.0.0/16\n120.95.0.0/16\n120.128.0.0/14\n120.132.0.0/17\n120.132.128.0/17\n120.133.0.0/16\n120.134.0.0/15\n120.136.128.0/18\n120.137.0.0/17\n120.143.128.0/19\n120.192.0.0/10\n121.0.8.0/21\n121.0.16.0/20\n121.4.0.0/15\n121.8.0.0/13\n121.16.0.0/13\n121.24.0.0/14\n121.28.0.0/15\n121.30.0.0/16\n121.31.0.0/16\n121.32.0.0/14\n121.36.0.0/16\n121.37.0.0/16\n121.38.0.0/15\n121.40.0.0/14\n121.46.0.0/18\n121.46.128.0/17\n121.47.0.0/16\n121.48.0.0/15\n121.50.8.0/21\n121.51.0.0/16\n121.52.160.0/19\n121.52.208.0/20\n121.52.224.0/19\n121.54.176.0/21\n121.55.0.0/18\n121.56.0.0/15\n121.58.0.0/17\n121.58.136.0/21\n121.58.144.0/20\n121.58.160.0/21\n121.59.0.0/16\n121.60.0.0/14\n121.68.0.0/14\n121.76.0.0/15\n121.79.128.0/18\n121.89.0.0/16\n121.100.128.0/17\n121.101.0.0/18\n121.101.208.0/20\n121.192.0.0/16\n121.193.0.0/16\n121.194.0.0/15\n121.196.0.0/14\n121.200.192.0/21\n121.201.0.0/16\n121.204.0.0/14\n121.224.0.0/12\n121.248.0.0/14\n121.255.0.0/16\n122.0.64.0/18\n122.0.128.0/17\n122.4.0.0/14\n122.8.0.0/16\n122.9.0.0/16\n122.10.0.0/17\n122.10.128.0/17\n122.11.0.0/17\n122.12.0.0/16\n122.13.0.0/16\n122.14.0.0/16\n122.48.0.0/16\n122.49.0.0/18\n122.51.0.0/16\n122.64.0.0/11\n122.96.0.0/15\n122.102.0.0/20\n122.102.64.0/20\n122.102.80.0/20\n122.112.0.0/14\n122.119.0.0/16\n122.128.120.0/21\n122.136.0.0/13\n122.144.128.0/17\n122.152.192.0/18\n122.156.0.0/14\n122.188.0.0/14\n122.192.0.0/14\n122.198.0.0/16\n122.200.64.0/18\n122.201.48.0/20\n122.204.0.0/14\n122.224.0.0/12\n122.240.0.0/13\n122.248.24.0/21\n122.248.48.0/20\n122.255.64.0/21\n123.0.128.0/18\n123.4.0.0/14\n123.8.0.0/13\n123.49.128.0/17\n123.50.160.0/19\n123.52.0.0/14\n123.56.0.0/15\n123.58.0.0/16\n123.59.0.0/16\n123.60.0.0/16\n123.61.0.0/16\n123.62.0.0/16\n123.64.0.0/11\n123.96.0.0/15\n123.98.0.0/17\n123.99.128.0/17\n123.100.0.0/19\n123.101.0.0/16\n123.103.0.0/17\n123.108.128.0/20\n123.108.208.0/20\n123.112.0.0/12\n123.128.0.0/13\n123.136.80.0/20\n123.137.0.0/16\n123.138.0.0/15\n123.144.0.0/14\n123.148.0.0/16\n123.149.0.0/16\n123.150.0.0/15\n123.152.0.0/13\n123.160.0.0/14\n123.164.0.0/14\n123.168.0.0/14\n123.172.0.0/15\n123.174.0.0/15\n123.176.60.0/22\n123.176.80.0/20\n123.177.0.0/16\n123.178.0.0/15\n123.180.0.0/14\n123.184.0.0/14\n123.188.0.0/14\n123.196.0.0/15\n123.199.128.0/17\n123.206.0.0/15\n123.232.0.0/14\n123.242.0.0/17\n123.244.0.0/14\n123.249.0.0/16\n123.253.0.0/16\n124.6.64.0/18\n124.14.0.0/15\n124.16.0.0/15\n124.20.0.0/16\n124.21.0.0/20\n124.21.16.0/20\n124.21.32.0/19\n124.21.64.0/18\n124.21.128.0/17\n124.22.0.0/15\n124.28.192.0/18\n124.29.0.0/17\n124.31.0.0/16\n124.40.112.0/20\n124.40.128.0/18\n124.40.192.0/19\n124.42.0.0/17\n124.42.128.0/17\n124.47.0.0/18\n124.64.0.0/15\n124.66.0.0/17\n124.67.0.0/16\n124.68.0.0/14\n124.72.0.0/16\n124.73.0.0/16\n124.74.0.0/15\n124.76.0.0/14\n124.88.0.0/16\n124.89.0.0/17\n124.89.128.0/17\n124.90.0.0/15\n124.92.0.0/14\n124.108.8.0/21\n124.108.40.0/21\n124.109.96.0/21\n124.112.0.0/15\n124.114.0.0/15\n124.116.0.0/16\n124.117.0.0/16\n124.118.0.0/15\n124.126.0.0/15\n124.128.0.0/13\n124.147.128.0/17\n124.151.0.0/16\n124.152.0.0/16\n124.156.0.0/16\n124.160.0.0/16\n124.161.0.0/16\n124.162.0.0/16\n124.163.0.0/16\n124.164.0.0/14\n124.172.0.0/15\n124.174.0.0/15\n124.192.0.0/15\n124.196.0.0/16\n124.200.0.0/13\n124.220.0.0/14\n124.224.0.0/16\n124.225.0.0/16\n124.226.0.0/15\n124.228.0.0/14\n124.232.0.0/15\n124.234.0.0/15\n124.236.0.0/14\n124.240.0.0/17\n124.240.128.0/18\n124.242.0.0/16\n124.243.192.0/18\n124.248.0.0/17\n124.249.0.0/16\n124.250.0.0/15\n124.254.0.0/18\n125.31.192.0/18\n125.32.0.0/16\n125.33.0.0/16\n125.34.0.0/16\n125.35.0.0/17\n125.35.128.0/17\n125.36.0.0/14\n125.40.0.0/13\n125.58.128.0/17\n125.61.128.0/17\n125.62.0.0/18\n125.64.0.0/13\n125.72.0.0/16\n125.73.0.0/16\n125.74.0.0/15\n125.76.0.0/17\n125.76.128.0/17\n125.77.0.0/16\n125.78.0.0/15\n125.80.0.0/13\n125.88.0.0/13\n125.96.0.0/15\n125.98.0.0/16\n125.104.0.0/13\n125.112.0.0/12\n125.169.0.0/16\n125.171.0.0/16\n125.208.0.0/18\n125.210.0.0/16\n125.211.0.0/16\n125.213.0.0/17\n125.214.96.0/19\n125.215.0.0/18\n125.216.0.0/15\n125.218.0.0/16\n125.219.0.0/16\n125.220.0.0/15\n125.222.0.0/15\n125.254.128.0/18\n125.254.192.0/18\n134.196.0.0/16\n139.9.0.0/16\n139.129.0.0/16\n139.148.0.0/16\n139.155.0.0/16\n139.159.0.0/16\n139.170.0.0/16\n139.176.0.0/16\n139.183.0.0/16\n139.186.0.0/16\n139.189.0.0/16\n139.196.0.0/14\n139.200.0.0/13\n139.208.0.0/13\n139.220.0.0/15\n139.224.0.0/16\n139.226.0.0/15\n140.75.0.0/16\n140.143.0.0/16\n140.205.0.0/16\n140.206.0.0/15\n140.210.0.0/16\n140.224.0.0/16\n140.237.0.0/16\n140.240.0.0/16\n140.243.0.0/16\n140.246.0.0/16\n140.249.0.0/16\n140.250.0.0/16\n140.255.0.0/16\n144.0.0.0/16\n144.7.0.0/16\n144.12.0.0/16\n144.52.0.0/16\n144.123.0.0/16\n144.255.0.0/16\n150.0.0.0/16\n150.115.0.0/16\n150.121.0.0/16\n150.122.0.0/16\n150.138.0.0/15\n150.223.0.0/16\n150.255.0.0/16\n153.0.0.0/16\n153.3.0.0/16\n153.34.0.0/15\n153.36.0.0/15\n153.99.0.0/16\n153.101.0.0/16\n153.118.0.0/15\n157.0.0.0/16\n157.18.0.0/16\n157.61.0.0/16\n157.122.0.0/16\n157.148.0.0/16\n157.156.0.0/16\n157.255.0.0/16\n159.226.0.0/16\n161.207.0.0/16\n162.105.0.0/16\n163.0.0.0/16\n163.125.0.0/16\n163.142.0.0/16\n163.177.0.0/16\n163.179.0.0/16\n163.204.0.0/16\n166.111.0.0/16\n167.139.0.0/16\n167.189.0.0/16\n168.160.0.0/16\n171.8.0.0/13\n171.34.0.0/15\n171.36.0.0/14\n171.40.0.0/13\n171.80.0.0/14\n171.84.0.0/14\n171.88.0.0/13\n171.104.0.0/13\n171.112.0.0/14\n171.116.0.0/14\n171.120.0.0/13\n171.208.0.0/12\n175.0.0.0/12\n175.16.0.0/13\n175.24.0.0/14\n175.30.0.0/15\n175.42.0.0/15\n175.44.0.0/16\n175.46.0.0/15\n175.48.0.0/12\n175.64.0.0/11\n175.102.0.0/16\n175.106.128.0/17\n175.146.0.0/15\n175.148.0.0/14\n175.152.0.0/14\n175.160.0.0/12\n175.178.0.0/16\n175.184.128.0/18\n175.185.0.0/16\n175.186.0.0/15\n175.188.0.0/14\n180.76.0.0/16\n180.77.0.0/16\n180.78.0.0/15\n180.84.0.0/15\n180.86.0.0/16\n180.88.0.0/14\n180.94.56.0/21\n180.94.96.0/20\n180.95.128.0/17\n180.96.0.0/11\n180.129.128.0/17\n180.130.0.0/16\n180.136.0.0/13\n180.148.16.0/21\n180.148.152.0/21\n180.148.216.0/21\n180.148.224.0/19\n180.149.128.0/19\n180.150.160.0/19\n180.152.0.0/13\n180.160.0.0/12\n180.178.192.0/18\n180.184.0.0/14\n180.188.0.0/17\n180.189.148.0/22\n180.200.252.0/22\n180.201.0.0/16\n180.202.0.0/15\n180.208.0.0/15\n180.210.224.0/19\n180.212.0.0/15\n180.222.224.0/19\n180.223.0.0/16\n180.233.0.0/18\n180.233.64.0/19\n180.235.64.0/19\n182.16.192.0/19\n182.18.0.0/17\n182.23.184.0/21\n182.23.200.0/21\n182.32.0.0/12\n182.48.96.0/19\n182.49.0.0/16\n182.50.0.0/20\n182.50.112.0/20\n182.51.0.0/16\n182.54.0.0/17\n182.61.0.0/16\n182.80.0.0/14\n182.84.0.0/14\n182.88.0.0/14\n182.92.0.0/16\n182.96.0.0/12\n182.112.0.0/12\n182.128.0.0/12\n182.144.0.0/13\n182.157.0.0/16\n182.160.64.0/19\n182.174.0.0/15\n182.200.0.0/13\n182.236.128.0/17\n182.238.0.0/16\n182.239.0.0/19\n182.240.0.0/13\n182.254.0.0/16\n183.0.0.0/10\n183.64.0.0/13\n183.78.180.0/22\n183.81.180.0/22\n183.84.0.0/15\n183.91.128.0/22\n183.91.136.0/21\n183.91.144.0/20\n183.92.0.0/14\n183.128.0.0/11\n183.160.0.0/13\n183.168.0.0/15\n183.170.0.0/16\n183.172.0.0/14\n183.182.0.0/19\n183.184.0.0/13\n183.192.0.0/10\n192.124.154.0/24\n192.188.170.0/24\n202.0.100.0/23\n202.0.122.0/23\n202.0.176.0/22\n202.3.128.0/23\n202.4.128.0/19\n202.4.252.0/22\n202.6.6.0/23\n202.6.66.0/23\n202.6.72.0/23\n202.6.87.0/24\n202.6.88.0/23\n202.6.92.0/23\n202.6.103.0/24\n202.6.108.0/24\n202.6.110.0/23\n202.6.114.0/24\n202.6.176.0/20\n202.8.0.0/24\n202.8.2.0/23\n202.8.4.0/23\n202.8.12.0/24\n202.8.24.0/24\n202.8.77.0/24\n202.8.128.0/19\n202.8.192.0/20\n202.9.32.0/24\n202.9.34.0/23\n202.9.48.0/23\n202.9.51.0/24\n202.9.52.0/23\n202.9.54.0/24\n202.9.57.0/24\n202.9.58.0/23\n202.10.64.0/20\n202.12.1.0/24\n202.12.2.0/24\n202.12.17.0/24\n202.12.18.0/24\n202.12.19.0/24\n202.12.72.0/24\n202.12.84.0/23\n202.12.96.0/24\n202.12.98.0/23\n202.12.106.0/24\n202.12.111.0/24\n202.12.116.0/24\n202.14.64.0/23\n202.14.69.0/24\n202.14.73.0/24\n202.14.74.0/23\n202.14.76.0/24\n202.14.78.0/23\n202.14.88.0/24\n202.14.97.0/24\n202.14.104.0/23\n202.14.108.0/23\n202.14.111.0/24\n202.14.114.0/23\n202.14.118.0/23\n202.14.124.0/23\n202.14.127.0/24\n202.14.129.0/24\n202.14.135.0/24\n202.14.136.0/24\n202.14.149.0/24\n202.14.151.0/24\n202.14.157.0/24\n202.14.158.0/23\n202.14.169.0/24\n202.14.170.0/23\n202.14.176.0/24\n202.14.184.0/23\n202.14.208.0/23\n202.14.213.0/24\n202.14.219.0/24\n202.14.220.0/24\n202.14.222.0/23\n202.14.225.0/24\n202.14.226.0/23\n202.14.231.0/24\n202.14.235.0/24\n202.14.236.0/23\n202.14.238.0/24\n202.14.239.0/24\n202.14.246.0/24\n202.14.251.0/24\n202.20.66.0/24\n202.20.79.0/24\n202.20.87.0/24\n202.20.88.0/23\n202.20.90.0/24\n202.20.94.0/23\n202.20.114.0/24\n202.20.117.0/24\n202.20.120.0/24\n202.20.125.0/24\n202.20.127.0/24\n202.21.131.0/24\n202.21.132.0/24\n202.21.141.0/24\n202.21.142.0/24\n202.21.147.0/24\n202.21.148.0/24\n202.21.150.0/23\n202.21.152.0/23\n202.21.154.0/24\n202.21.156.0/24\n202.22.248.0/22\n202.22.252.0/22\n202.27.136.0/23\n202.38.0.0/23\n202.38.2.0/23\n202.38.8.0/21\n202.38.48.0/20\n202.38.64.0/19\n202.38.96.0/19\n202.38.128.0/23\n202.38.130.0/23\n202.38.132.0/23\n202.38.134.0/24\n202.38.135.0/24\n202.38.136.0/23\n202.38.138.0/24\n202.38.140.0/23\n202.38.142.0/23\n202.38.146.0/23\n202.38.149.0/24\n202.38.150.0/23\n202.38.152.0/23\n202.38.154.0/23\n202.38.156.0/24\n202.38.158.0/23\n202.38.160.0/23\n202.38.164.0/22\n202.38.168.0/23\n202.38.170.0/24\n202.38.171.0/24\n202.38.176.0/23\n202.38.184.0/21\n202.38.192.0/18\n202.40.4.0/23\n202.40.7.0/24\n202.40.15.0/24\n202.40.135.0/24\n202.40.136.0/24\n202.40.140.0/24\n202.40.143.0/24\n202.40.144.0/23\n202.40.150.0/24\n202.40.155.0/24\n202.40.156.0/24\n202.40.158.0/23\n202.40.162.0/24\n202.41.8.0/23\n202.41.11.0/24\n202.41.12.0/23\n202.41.128.0/24\n202.41.130.0/23\n202.41.152.0/21\n202.41.192.0/24\n202.41.240.0/20\n202.43.76.0/22\n202.43.144.0/20\n202.44.16.0/20\n202.44.67.0/24\n202.44.74.0/24\n202.44.129.0/24\n202.44.132.0/23\n202.44.146.0/23\n202.45.0.0/23\n202.45.2.0/24\n202.45.15.0/24\n202.45.16.0/20\n202.46.16.0/23\n202.46.18.0/24\n202.46.20.0/23\n202.46.32.0/19\n202.46.128.0/24\n202.46.224.0/20\n202.47.82.0/23\n202.47.126.0/24\n202.47.128.0/24\n202.47.130.0/23\n202.57.240.0/20\n202.58.0.0/24\n202.59.0.0/24\n202.59.212.0/22\n202.59.232.0/23\n202.59.236.0/24\n202.60.48.0/21\n202.60.96.0/21\n202.60.112.0/20\n202.60.132.0/22\n202.60.136.0/21\n202.60.144.0/20\n202.62.112.0/22\n202.62.248.0/22\n202.62.252.0/24\n202.62.255.0/24\n202.63.81.0/24\n202.63.82.0/23\n202.63.84.0/22\n202.63.88.0/21\n202.63.160.0/19\n202.63.248.0/22\n202.65.0.0/21\n202.65.8.0/23\n202.67.0.0/22\n202.69.4.0/22\n202.69.16.0/20\n202.70.0.0/19\n202.70.96.0/20\n202.70.192.0/20\n202.72.40.0/21\n202.72.80.0/20\n202.73.128.0/22\n202.74.8.0/21\n202.74.80.0/20\n202.74.254.0/23\n202.75.208.0/20\n202.75.252.0/22\n202.76.252.0/22\n202.77.80.0/21\n202.77.92.0/22\n202.78.8.0/21\n202.79.224.0/21\n202.79.248.0/22\n202.80.192.0/21\n202.80.200.0/21\n202.81.0.0/22\n202.83.252.0/22\n202.84.4.0/22\n202.84.8.0/21\n202.84.24.0/21\n202.85.208.0/20\n202.86.249.0/24\n202.86.252.0/22\n202.87.80.0/20\n202.89.8.0/21\n202.90.0.0/22\n202.90.112.0/20\n202.90.196.0/24\n202.90.224.0/20\n202.91.0.0/22\n202.91.96.0/20\n202.91.128.0/22\n202.91.176.0/20\n202.91.224.0/19\n202.92.0.0/22\n202.92.8.0/21\n202.92.48.0/20\n202.92.252.0/22\n202.93.0.0/22\n202.93.252.0/22\n202.94.92.0/22\n202.95.0.0/22\n202.95.4.0/22\n202.95.8.0/21\n202.95.16.0/20\n202.95.240.0/21\n202.95.252.0/22\n202.96.0.0/18\n202.96.64.0/21\n202.96.72.0/21\n202.96.80.0/20\n202.96.96.0/21\n202.96.104.0/21\n202.96.112.0/20\n202.96.128.0/21\n202.96.136.0/21\n202.96.144.0/20\n202.96.160.0/21\n202.96.168.0/21\n202.96.176.0/20\n202.96.192.0/21\n202.96.200.0/21\n202.96.208.0/20\n202.96.224.0/21\n202.96.232.0/21\n202.96.240.0/20\n202.97.0.0/21\n202.97.8.0/21\n202.97.16.0/20\n202.97.32.0/19\n202.97.64.0/19\n202.97.96.0/20\n202.97.112.0/20\n202.97.128.0/18\n202.97.192.0/19\n202.97.224.0/21\n202.97.232.0/21\n202.97.240.0/20\n202.98.0.0/21\n202.98.8.0/21\n202.98.16.0/20\n202.98.32.0/21\n202.98.40.0/21\n202.98.48.0/20\n202.98.64.0/19\n202.98.96.0/21\n202.98.104.0/21\n202.98.112.0/20\n202.98.128.0/19\n202.98.160.0/21\n202.98.168.0/21\n202.98.176.0/20\n202.98.192.0/21\n202.98.200.0/21\n202.98.208.0/20\n202.98.224.0/21\n202.98.232.0/21\n202.98.240.0/20\n202.99.0.0/18\n202.99.64.0/19\n202.99.96.0/21\n202.99.104.0/21\n202.99.112.0/20\n202.99.128.0/19\n202.99.160.0/21\n202.99.168.0/21\n202.99.176.0/20\n202.99.192.0/21\n202.99.200.0/21\n202.99.208.0/20\n202.99.224.0/21\n202.99.232.0/21\n202.99.240.0/20\n202.100.0.0/21\n202.100.8.0/21\n202.100.16.0/20\n202.100.32.0/19\n202.100.64.0/21\n202.100.72.0/21\n202.100.80.0/20\n202.100.96.0/21\n202.100.104.0/21\n202.100.112.0/20\n202.100.128.0/21\n202.100.136.0/21\n202.100.144.0/20\n202.100.160.0/21\n202.100.168.0/21\n202.100.176.0/20\n202.100.192.0/21\n202.100.200.0/21\n202.100.208.0/20\n202.100.224.0/19\n202.101.0.0/18\n202.101.64.0/19\n202.101.96.0/19\n202.101.128.0/18\n202.101.192.0/19\n202.101.224.0/21\n202.101.232.0/21\n202.101.240.0/20\n202.102.0.0/19\n202.102.32.0/19\n202.102.64.0/18\n202.102.128.0/21\n202.102.136.0/21\n202.102.144.0/20\n202.102.160.0/19\n202.102.192.0/21\n202.102.200.0/21\n202.102.208.0/20\n202.102.224.0/21\n202.102.232.0/21\n202.102.240.0/20\n202.103.0.0/21\n202.103.8.0/21\n202.103.16.0/20\n202.103.32.0/19\n202.103.64.0/19\n202.103.96.0/21\n202.103.104.0/21\n202.103.112.0/20\n202.103.128.0/18\n202.103.192.0/19\n202.103.224.0/21\n202.103.232.0/21\n202.103.240.0/20\n202.104.0.0/15\n202.106.0.0/16\n202.107.0.0/17\n202.107.128.0/17\n202.108.0.0/16\n202.109.0.0/16\n202.110.0.0/18\n202.110.64.0/18\n202.110.128.0/18\n202.110.192.0/18\n202.111.0.0/17\n202.111.128.0/19\n202.111.160.0/19\n202.111.192.0/18\n202.112.0.0/16\n202.113.0.0/20\n202.113.16.0/20\n202.113.32.0/19\n202.113.64.0/18\n202.113.128.0/18\n202.113.192.0/19\n202.113.224.0/20\n202.113.240.0/20\n202.114.0.0/19\n202.114.32.0/19\n202.114.64.0/18\n202.114.128.0/17\n202.115.0.0/19\n202.115.32.0/19\n202.115.64.0/18\n202.115.128.0/17\n202.116.0.0/19\n202.116.32.0/20\n202.116.48.0/20\n202.116.64.0/19\n202.116.96.0/19\n202.116.128.0/17\n202.117.0.0/18\n202.117.64.0/18\n202.117.128.0/17\n202.118.0.0/19\n202.118.32.0/19\n202.118.64.0/18\n202.118.128.0/17\n202.119.0.0/19\n202.119.32.0/19\n202.119.64.0/20\n202.119.80.0/20\n202.119.96.0/19\n202.119.128.0/17\n202.120.0.0/18\n202.120.64.0/18\n202.120.128.0/17\n202.121.0.0/16\n202.122.0.0/21\n202.122.32.0/21\n202.122.64.0/19\n202.122.112.0/21\n202.122.120.0/21\n202.122.128.0/24\n202.122.132.0/24\n202.123.96.0/20\n202.124.16.0/21\n202.124.24.0/22\n202.125.112.0/20\n202.125.176.0/20\n202.127.0.0/23\n202.127.2.0/24\n202.127.3.0/24\n202.127.4.0/24\n202.127.5.0/24\n202.127.6.0/23\n202.127.12.0/22\n202.127.16.0/20\n202.127.40.0/21\n202.127.48.0/20\n202.127.112.0/20\n202.127.128.0/20\n202.127.144.0/20\n202.127.160.0/21\n202.127.192.0/23\n202.127.194.0/23\n202.127.196.0/22\n202.127.200.0/21\n202.127.208.0/24\n202.127.209.0/24\n202.127.212.0/22\n202.127.216.0/21\n202.127.224.0/19\n202.130.0.0/19\n202.130.224.0/19\n202.131.16.0/21\n202.131.48.0/20\n202.131.208.0/20\n202.133.32.0/20\n202.134.58.0/24\n202.134.128.0/20\n202.136.48.0/20\n202.136.208.0/20\n202.136.224.0/20\n202.137.231.0/24\n202.141.160.0/19\n202.142.16.0/20\n202.143.4.0/22\n202.143.16.0/20\n202.143.32.0/20\n202.143.56.0/21\n202.146.160.0/20\n202.146.188.0/22\n202.146.196.0/22\n202.146.200.0/21\n202.147.144.0/20\n202.148.32.0/20\n202.148.64.0/19\n202.148.96.0/19\n202.149.32.0/19\n202.149.160.0/19\n202.149.224.0/19\n202.150.16.0/20\n202.150.32.0/20\n202.150.56.0/22\n202.150.192.0/20\n202.150.224.0/19\n202.151.0.0/22\n202.151.128.0/19\n202.152.176.0/20\n202.153.0.0/22\n202.153.48.0/20\n202.157.192.0/19\n202.158.160.0/19\n202.160.176.0/20\n202.162.67.0/24\n202.162.75.0/24\n202.164.0.0/20\n202.164.96.0/19\n202.165.96.0/20\n202.165.176.0/20\n202.165.208.0/20\n202.165.239.0/24\n202.165.240.0/23\n202.165.243.0/24\n202.165.245.0/24\n202.165.251.0/24\n202.165.252.0/22\n202.166.224.0/19\n202.168.160.0/20\n202.168.176.0/20\n202.170.128.0/19\n202.170.216.0/21\n202.170.224.0/19\n202.171.216.0/21\n202.171.235.0/24\n202.172.0.0/22\n202.173.0.0/22\n202.173.8.0/21\n202.173.224.0/19\n202.174.64.0/20\n202.176.224.0/19\n202.179.240.0/20\n202.180.128.0/19\n202.180.208.0/21\n202.181.112.0/20\n202.182.32.0/20\n202.182.192.0/19\n202.189.0.0/18\n202.189.80.0/20\n202.189.184.0/21\n202.191.0.0/24\n202.191.68.0/22\n202.191.72.0/21\n202.191.80.0/20\n202.192.0.0/13\n202.200.0.0/14\n202.204.0.0/14\n203.0.4.0/22\n203.0.10.0/23\n203.0.18.0/24\n203.0.24.0/24\n203.0.42.0/23\n203.0.45.0/24\n203.0.46.0/23\n203.0.81.0/24\n203.0.82.0/23\n203.0.90.0/23\n203.0.96.0/23\n203.0.104.0/21\n203.0.114.0/23\n203.0.122.0/24\n203.0.128.0/24\n203.0.130.0/23\n203.0.132.0/22\n203.0.137.0/24\n203.0.142.0/24\n203.0.144.0/24\n203.0.146.0/24\n203.0.148.0/24\n203.0.150.0/23\n203.0.152.0/24\n203.0.177.0/24\n203.0.224.0/24\n203.1.4.0/22\n203.1.18.0/24\n203.1.26.0/23\n203.1.65.0/24\n203.1.66.0/23\n203.1.70.0/23\n203.1.76.0/23\n203.1.90.0/24\n203.1.97.0/24\n203.1.98.0/23\n203.1.100.0/22\n203.1.108.0/24\n203.1.253.0/24\n203.1.254.0/24\n203.2.64.0/21\n203.2.73.0/24\n203.2.112.0/21\n203.2.126.0/23\n203.2.140.0/24\n203.2.150.0/24\n203.2.152.0/22\n203.2.156.0/23\n203.2.160.0/21\n203.2.180.0/23\n203.2.196.0/23\n203.2.209.0/24\n203.2.214.0/23\n203.2.226.0/23\n203.2.229.0/24\n203.2.236.0/23\n203.3.68.0/24\n203.3.72.0/23\n203.3.75.0/24\n203.3.80.0/21\n203.3.96.0/22\n203.3.105.0/24\n203.3.112.0/21\n203.3.120.0/24\n203.3.123.0/24\n203.3.135.0/24\n203.3.139.0/24\n203.3.143.0/24\n203.4.132.0/23\n203.4.134.0/24\n203.4.151.0/24\n203.4.152.0/22\n203.4.174.0/23\n203.4.180.0/24\n203.4.186.0/24\n203.4.205.0/24\n203.4.208.0/22\n203.4.227.0/24\n203.4.230.0/23\n203.5.4.0/23\n203.5.7.0/24\n203.5.8.0/23\n203.5.11.0/24\n203.5.21.0/24\n203.5.22.0/24\n203.5.44.0/24\n203.5.46.0/23\n203.5.52.0/22\n203.5.56.0/23\n203.5.60.0/23\n203.5.114.0/23\n203.5.118.0/24\n203.5.120.0/24\n203.5.172.0/24\n203.5.180.0/23\n203.5.182.0/24\n203.5.185.0/24\n203.5.186.0/24\n203.5.188.0/23\n203.5.190.0/24\n203.5.195.0/24\n203.5.214.0/23\n203.5.218.0/23\n203.6.131.0/24\n203.6.136.0/24\n203.6.138.0/23\n203.6.142.0/24\n203.6.150.0/23\n203.6.157.0/24\n203.6.159.0/24\n203.6.224.0/20\n203.6.248.0/23\n203.7.129.0/24\n203.7.138.0/23\n203.7.147.0/24\n203.7.150.0/23\n203.7.158.0/24\n203.7.192.0/23\n203.7.200.0/24\n203.8.0.0/24\n203.8.8.0/24\n203.8.23.0/24\n203.8.24.0/21\n203.8.70.0/24\n203.8.82.0/24\n203.8.86.0/23\n203.8.91.0/24\n203.8.110.0/23\n203.8.115.0/24\n203.8.166.0/23\n203.8.169.0/24\n203.8.173.0/24\n203.8.184.0/24\n203.8.186.0/23\n203.8.190.0/23\n203.8.192.0/24\n203.8.197.0/24\n203.8.198.0/23\n203.8.203.0/24\n203.8.209.0/24\n203.8.210.0/23\n203.8.212.0/22\n203.8.217.0/24\n203.8.220.0/24\n203.9.32.0/24\n203.9.36.0/23\n203.9.57.0/24\n203.9.63.0/24\n203.9.65.0/24\n203.9.70.0/23\n203.9.72.0/24\n203.9.75.0/24\n203.9.76.0/23\n203.9.96.0/22\n203.9.100.0/23\n203.9.108.0/24\n203.9.158.0/24\n203.10.34.0/24\n203.10.56.0/24\n203.10.74.0/23\n203.10.84.0/22\n203.10.88.0/24\n203.10.95.0/24\n203.10.125.0/24\n203.11.70.0/24\n203.11.76.0/22\n203.11.82.0/24\n203.11.84.0/22\n203.11.100.0/22\n203.11.109.0/24\n203.11.117.0/24\n203.11.122.0/24\n203.11.126.0/24\n203.11.136.0/22\n203.11.141.0/24\n203.11.142.0/23\n203.11.180.0/22\n203.11.208.0/22\n203.12.16.0/24\n203.12.19.0/24\n203.12.24.0/24\n203.12.57.0/24\n203.12.65.0/24\n203.12.66.0/24\n203.12.70.0/23\n203.12.87.0/24\n203.12.88.0/21\n203.12.100.0/23\n203.12.103.0/24\n203.12.114.0/24\n203.12.118.0/24\n203.12.130.0/24\n203.12.137.0/24\n203.12.196.0/22\n203.12.200.0/21\n203.12.211.0/24\n203.12.219.0/24\n203.12.226.0/24\n203.12.240.0/22\n203.13.18.0/24\n203.13.24.0/24\n203.13.44.0/23\n203.13.80.0/21\n203.13.88.0/23\n203.13.92.0/22\n203.13.173.0/24\n203.13.224.0/23\n203.13.227.0/24\n203.13.233.0/24\n203.14.24.0/22\n203.14.33.0/24\n203.14.56.0/24\n203.14.61.0/24\n203.14.62.0/24\n203.14.104.0/24\n203.14.114.0/23\n203.14.118.0/24\n203.14.162.0/24\n203.14.184.0/21\n203.14.192.0/24\n203.14.194.0/23\n203.14.214.0/24\n203.14.231.0/24\n203.14.246.0/24\n203.15.0.0/20\n203.15.20.0/23\n203.15.22.0/24\n203.15.87.0/24\n203.15.88.0/23\n203.15.105.0/24\n203.15.112.0/21\n203.15.130.0/23\n203.15.149.0/24\n203.15.151.0/24\n203.15.156.0/22\n203.15.174.0/24\n203.15.227.0/24\n203.15.232.0/21\n203.15.240.0/23\n203.15.246.0/24\n203.16.10.0/24\n203.16.12.0/23\n203.16.16.0/21\n203.16.27.0/24\n203.16.38.0/24\n203.16.49.0/24\n203.16.50.0/23\n203.16.58.0/24\n203.16.133.0/24\n203.16.161.0/24\n203.16.162.0/24\n203.16.186.0/23\n203.16.228.0/24\n203.16.238.0/24\n203.16.240.0/24\n203.16.245.0/24\n203.17.2.0/24\n203.17.18.0/24\n203.17.28.0/24\n203.17.39.0/24\n203.17.56.0/24\n203.17.74.0/23\n203.17.88.0/23\n203.17.136.0/24\n203.17.164.0/24\n203.17.187.0/24\n203.17.190.0/23\n203.17.231.0/24\n203.17.233.0/24\n203.17.248.0/24\n203.17.255.0/24\n203.18.2.0/23\n203.18.4.0/24\n203.18.7.0/24\n203.18.31.0/24\n203.18.37.0/24\n203.18.48.0/23\n203.18.50.0/24\n203.18.52.0/24\n203.18.72.0/22\n203.18.80.0/23\n203.18.87.0/24\n203.18.100.0/23\n203.18.105.0/24\n203.18.107.0/24\n203.18.110.0/24\n203.18.129.0/24\n203.18.131.0/24\n203.18.132.0/23\n203.18.144.0/24\n203.18.153.0/24\n203.18.199.0/24\n203.18.208.0/24\n203.18.211.0/24\n203.18.215.0/24\n203.19.18.0/24\n203.19.24.0/24\n203.19.30.0/24\n203.19.32.0/21\n203.19.41.0/24\n203.19.44.0/23\n203.19.46.0/24\n203.19.58.0/24\n203.19.60.0/23\n203.19.64.0/24\n203.19.68.0/24\n203.19.72.0/24\n203.19.101.0/24\n203.19.111.0/24\n203.19.131.0/24\n203.19.133.0/24\n203.19.144.0/24\n203.19.149.0/24\n203.19.156.0/24\n203.19.176.0/24\n203.19.178.0/23\n203.19.208.0/24\n203.19.228.0/22\n203.19.233.0/24\n203.19.242.0/24\n203.19.248.0/23\n203.19.255.0/24\n203.20.17.0/24\n203.20.40.0/23\n203.20.48.0/24\n203.20.61.0/24\n203.20.65.0/24\n203.20.84.0/23\n203.20.89.0/24\n203.20.106.0/23\n203.20.115.0/24\n203.20.117.0/24\n203.20.118.0/23\n203.20.122.0/24\n203.20.126.0/23\n203.20.135.0/24\n203.20.136.0/21\n203.20.150.0/24\n203.20.230.0/24\n203.20.232.0/24\n203.20.236.0/24\n203.21.0.0/23\n203.21.2.0/24\n203.21.8.0/24\n203.21.10.0/24\n203.21.18.0/24\n203.21.33.0/24\n203.21.34.0/24\n203.21.41.0/24\n203.21.44.0/24\n203.21.68.0/24\n203.21.82.0/24\n203.21.96.0/22\n203.21.124.0/24\n203.21.136.0/23\n203.21.145.0/24\n203.21.206.0/24\n203.22.24.0/24\n203.22.28.0/23\n203.22.31.0/24\n203.22.68.0/24\n203.22.76.0/24\n203.22.78.0/24\n203.22.84.0/24\n203.22.87.0/24\n203.22.92.0/22\n203.22.99.0/24\n203.22.106.0/24\n203.22.122.0/23\n203.22.131.0/24\n203.22.163.0/24\n203.22.166.0/24\n203.22.170.0/24\n203.22.176.0/21\n203.22.194.0/24\n203.22.242.0/23\n203.22.245.0/24\n203.22.246.0/24\n203.22.252.0/23\n203.23.0.0/24\n203.23.47.0/24\n203.23.61.0/24\n203.23.62.0/23\n203.23.73.0/24\n203.23.85.0/24\n203.23.92.0/22\n203.23.98.0/24\n203.23.107.0/24\n203.23.112.0/24\n203.23.130.0/24\n203.23.140.0/23\n203.23.172.0/24\n203.23.182.0/24\n203.23.186.0/23\n203.23.192.0/24\n203.23.197.0/24\n203.23.198.0/24\n203.23.204.0/22\n203.23.224.0/24\n203.23.226.0/23\n203.23.228.0/22\n203.23.249.0/24\n203.23.251.0/24\n203.24.13.0/24\n203.24.18.0/24\n203.24.27.0/24\n203.24.43.0/24\n203.24.56.0/24\n203.24.58.0/24\n203.24.67.0/24\n203.24.74.0/24\n203.24.79.0/24\n203.24.80.0/23\n203.24.84.0/23\n203.24.86.0/24\n203.24.90.0/24\n203.24.111.0/24\n203.24.112.0/24\n203.24.116.0/24\n203.24.122.0/23\n203.24.145.0/24\n203.24.152.0/23\n203.24.157.0/24\n203.24.161.0/24\n203.24.167.0/24\n203.24.186.0/23\n203.24.199.0/24\n203.24.202.0/24\n203.24.212.0/23\n203.24.217.0/24\n203.24.219.0/24\n203.24.244.0/24\n203.25.19.0/24\n203.25.20.0/23\n203.25.46.0/24\n203.25.48.0/21\n203.25.64.0/23\n203.25.91.0/24\n203.25.99.0/24\n203.25.100.0/24\n203.25.106.0/24\n203.25.131.0/24\n203.25.135.0/24\n203.25.138.0/24\n203.25.147.0/24\n203.25.153.0/24\n203.25.154.0/23\n203.25.164.0/24\n203.25.166.0/24\n203.25.174.0/23\n203.25.180.0/24\n203.25.182.0/24\n203.25.191.0/24\n203.25.199.0/24\n203.25.200.0/24\n203.25.202.0/23\n203.25.208.0/20\n203.25.229.0/24\n203.25.235.0/24\n203.25.236.0/24\n203.25.242.0/24\n203.26.12.0/24\n203.26.34.0/24\n203.26.49.0/24\n203.26.50.0/24\n203.26.55.0/24\n203.26.56.0/23\n203.26.60.0/24\n203.26.65.0/24\n203.26.68.0/24\n203.26.76.0/24\n203.26.80.0/24\n203.26.84.0/24\n203.26.97.0/24\n203.26.102.0/23\n203.26.115.0/24\n203.26.116.0/24\n203.26.129.0/24\n203.26.143.0/24\n203.26.144.0/24\n203.26.148.0/23\n203.26.154.0/24\n203.26.158.0/23\n203.26.170.0/24\n203.26.173.0/24\n203.26.176.0/24\n203.26.185.0/24\n203.26.202.0/23\n203.26.210.0/24\n203.26.214.0/24\n203.26.222.0/24\n203.26.224.0/24\n203.26.228.0/24\n203.26.232.0/24\n203.27.0.0/24\n203.27.10.0/24\n203.27.15.0/24\n203.27.16.0/24\n203.27.20.0/24\n203.27.22.0/23\n203.27.40.0/24\n203.27.45.0/24\n203.27.53.0/24\n203.27.65.0/24\n203.27.66.0/24\n203.27.81.0/24\n203.27.88.0/24\n203.27.102.0/24\n203.27.109.0/24\n203.27.117.0/24\n203.27.121.0/24\n203.27.122.0/23\n203.27.125.0/24\n203.27.200.0/24\n203.27.202.0/24\n203.27.233.0/24\n203.27.241.0/24\n203.27.250.0/24\n203.28.10.0/24\n203.28.12.0/24\n203.28.33.0/24\n203.28.34.0/23\n203.28.43.0/24\n203.28.44.0/24\n203.28.54.0/24\n203.28.56.0/24\n203.28.73.0/24\n203.28.74.0/24\n203.28.76.0/24\n203.28.86.0/24\n203.28.88.0/24\n203.28.112.0/24\n203.28.131.0/24\n203.28.136.0/24\n203.28.140.0/24\n203.28.145.0/24\n203.28.165.0/24\n203.28.169.0/24\n203.28.170.0/24\n203.28.178.0/23\n203.28.185.0/24\n203.28.187.0/24\n203.28.196.0/24\n203.28.226.0/23\n203.28.239.0/24\n203.29.2.0/24\n203.29.8.0/23\n203.29.13.0/24\n203.29.14.0/24\n203.29.28.0/24\n203.29.46.0/24\n203.29.57.0/24\n203.29.61.0/24\n203.29.63.0/24\n203.29.69.0/24\n203.29.73.0/24\n203.29.81.0/24\n203.29.90.0/24\n203.29.95.0/24\n203.29.100.0/24\n203.29.103.0/24\n203.29.112.0/24\n203.29.120.0/22\n203.29.182.0/23\n203.29.187.0/24\n203.29.189.0/24\n203.29.190.0/24\n203.29.205.0/24\n203.29.210.0/24\n203.29.217.0/24\n203.29.227.0/24\n203.29.231.0/24\n203.29.233.0/24\n203.29.234.0/24\n203.29.248.0/24\n203.29.254.0/23\n203.30.16.0/23\n203.30.25.0/24\n203.30.27.0/24\n203.30.29.0/24\n203.30.66.0/24\n203.30.81.0/24\n203.30.87.0/24\n203.30.111.0/24\n203.30.121.0/24\n203.30.123.0/24\n203.30.152.0/24\n203.30.156.0/24\n203.30.162.0/24\n203.30.173.0/24\n203.30.175.0/24\n203.30.187.0/24\n203.30.194.0/24\n203.30.217.0/24\n203.30.220.0/24\n203.30.222.0/24\n203.30.232.0/23\n203.30.235.0/24\n203.30.240.0/23\n203.30.246.0/24\n203.30.250.0/23\n203.31.45.0/24\n203.31.46.0/24\n203.31.49.0/24\n203.31.51.0/24\n203.31.54.0/23\n203.31.69.0/24\n203.31.72.0/24\n203.31.80.0/24\n203.31.85.0/24\n203.31.97.0/24\n203.31.105.0/24\n203.31.106.0/24\n203.31.108.0/23\n203.31.124.0/24\n203.31.162.0/24\n203.31.174.0/24\n203.31.177.0/24\n203.31.181.0/24\n203.31.187.0/24\n203.31.189.0/24\n203.31.204.0/24\n203.31.220.0/24\n203.31.222.0/23\n203.31.225.0/24\n203.31.229.0/24\n203.31.248.0/23\n203.31.253.0/24\n203.32.20.0/24\n203.32.48.0/23\n203.32.56.0/24\n203.32.60.0/24\n203.32.62.0/24\n203.32.68.0/23\n203.32.76.0/24\n203.32.81.0/24\n203.32.84.0/23\n203.32.95.0/24\n203.32.102.0/24\n203.32.105.0/24\n203.32.130.0/24\n203.32.133.0/24\n203.32.140.0/24\n203.32.152.0/24\n203.32.186.0/23\n203.32.192.0/24\n203.32.196.0/24\n203.32.203.0/24\n203.32.204.0/23\n203.32.212.0/24\n203.33.4.0/24\n203.33.7.0/24\n203.33.8.0/21\n203.33.21.0/24\n203.33.26.0/24\n203.33.32.0/24\n203.33.63.0/24\n203.33.64.0/24\n203.33.67.0/24\n203.33.68.0/24\n203.33.73.0/24\n203.33.79.0/24\n203.33.100.0/24\n203.33.122.0/24\n203.33.129.0/24\n203.33.131.0/24\n203.33.145.0/24\n203.33.156.0/24\n203.33.158.0/23\n203.33.174.0/24\n203.33.185.0/24\n203.33.200.0/24\n203.33.202.0/23\n203.33.204.0/24\n203.33.206.0/23\n203.33.214.0/23\n203.33.224.0/23\n203.33.226.0/24\n203.33.233.0/24\n203.33.243.0/24\n203.33.250.0/24\n203.34.4.0/24\n203.34.21.0/24\n203.34.27.0/24\n203.34.39.0/24\n203.34.48.0/23\n203.34.54.0/24\n203.34.56.0/23\n203.34.67.0/24\n203.34.69.0/24\n203.34.76.0/24\n203.34.92.0/24\n203.34.106.0/24\n203.34.113.0/24\n203.34.147.0/24\n203.34.150.0/24\n203.34.152.0/23\n203.34.161.0/24\n203.34.162.0/24\n203.34.187.0/24\n203.34.192.0/21\n203.34.204.0/22\n203.34.232.0/24\n203.34.240.0/24\n203.34.242.0/24\n203.34.245.0/24\n203.34.251.0/24\n203.55.2.0/23\n203.55.4.0/24\n203.55.10.0/24\n203.55.13.0/24\n203.55.22.0/24\n203.55.30.0/24\n203.55.93.0/24\n203.55.101.0/24\n203.55.109.0/24\n203.55.110.0/24\n203.55.116.0/23\n203.55.119.0/24\n203.55.128.0/23\n203.55.146.0/23\n203.55.192.0/24\n203.55.196.0/24\n203.55.218.0/23\n203.55.221.0/24\n203.55.224.0/24\n203.56.1.0/24\n203.56.4.0/24\n203.56.12.0/24\n203.56.24.0/24\n203.56.38.0/24\n203.56.40.0/24\n203.56.46.0/24\n203.56.48.0/21\n203.56.68.0/23\n203.56.82.0/23\n203.56.84.0/23\n203.56.95.0/24\n203.56.110.0/24\n203.56.121.0/24\n203.56.161.0/24\n203.56.169.0/24\n203.56.172.0/23\n203.56.175.0/24\n203.56.183.0/24\n203.56.185.0/24\n203.56.187.0/24\n203.56.192.0/24\n203.56.198.0/24\n203.56.201.0/24\n203.56.208.0/23\n203.56.210.0/24\n203.56.214.0/24\n203.56.216.0/24\n203.56.227.0/24\n203.56.228.0/24\n203.56.232.0/24\n203.56.240.0/24\n203.56.252.0/24\n203.56.254.0/24\n203.57.5.0/24\n203.57.6.0/24\n203.57.12.0/23\n203.57.28.0/24\n203.57.39.0/24\n203.57.46.0/24\n203.57.58.0/24\n203.57.61.0/24\n203.57.66.0/24\n203.57.69.0/24\n203.57.70.0/23\n203.57.73.0/24\n203.57.90.0/24\n203.57.101.0/24\n203.57.109.0/24\n203.57.123.0/24\n203.57.157.0/24\n203.57.200.0/24\n203.57.202.0/24\n203.57.206.0/24\n203.57.222.0/24\n203.57.224.0/20\n203.57.246.0/23\n203.57.249.0/24\n203.57.253.0/24\n203.57.254.0/23\n203.62.2.0/24\n203.62.131.0/24\n203.62.139.0/24\n203.62.161.0/24\n203.62.197.0/24\n203.62.228.0/22\n203.62.234.0/24\n203.62.246.0/24\n203.76.160.0/22\n203.76.168.0/22\n203.77.180.0/22\n203.78.48.0/20\n203.79.0.0/20\n203.79.32.0/20\n203.80.4.0/23\n203.80.32.0/20\n203.80.57.0/24\n203.80.132.0/22\n203.80.136.0/21\n203.80.144.0/20\n203.81.0.0/21\n203.81.16.0/20\n203.82.0.0/23\n203.82.16.0/21\n203.83.0.0/22\n203.83.56.0/21\n203.83.224.0/20\n203.86.0.0/19\n203.86.32.0/19\n203.86.64.0/20\n203.86.80.0/20\n203.86.96.0/19\n203.86.254.0/23\n203.88.32.0/19\n203.88.192.0/19\n203.89.0.0/22\n203.89.8.0/21\n203.89.136.0/22\n203.90.0.0/22\n203.90.8.0/22\n203.90.128.0/19\n203.90.160.0/19\n203.90.192.0/19\n203.91.32.0/19\n203.91.96.0/20\n203.91.120.0/21\n203.92.0.0/22\n203.92.160.0/19\n203.93.0.0/22\n203.93.4.0/22\n203.93.8.0/24\n203.93.9.0/24\n203.93.10.0/23\n203.93.12.0/22\n203.93.16.0/20\n203.93.32.0/19\n203.93.64.0/18\n203.93.128.0/21\n203.93.136.0/22\n203.93.140.0/24\n203.93.141.0/24\n203.93.142.0/23\n203.93.144.0/20\n203.93.160.0/19\n203.93.192.0/18\n203.94.0.0/22\n203.94.4.0/22\n203.94.8.0/21\n203.94.16.0/20\n203.95.0.0/21\n203.95.96.0/20\n203.95.112.0/20\n203.95.128.0/18\n203.95.224.0/19\n203.99.8.0/21\n203.99.16.0/20\n203.99.80.0/20\n203.100.32.0/20\n203.100.48.0/21\n203.100.63.0/24\n203.100.80.0/20\n203.100.96.0/19\n203.100.192.0/20\n203.104.32.0/20\n203.105.96.0/19\n203.105.128.0/19\n203.107.0.0/17\n203.110.160.0/19\n203.110.208.0/20\n203.110.232.0/23\n203.110.234.0/24\n203.114.244.0/22\n203.118.192.0/19\n203.118.241.0/24\n203.118.248.0/22\n203.119.24.0/21\n203.119.32.0/22\n203.119.80.0/22\n203.119.85.0/24\n203.119.113.0/24\n203.119.114.0/23\n203.119.116.0/22\n203.119.120.0/21\n203.119.128.0/17\n203.128.32.0/19\n203.128.96.0/19\n203.128.224.0/21\n203.129.8.0/21\n203.130.32.0/19\n203.132.32.0/19\n203.134.240.0/21\n203.135.96.0/20\n203.135.112.0/20\n203.135.160.0/20\n203.142.224.0/19\n203.144.96.0/19\n203.145.0.0/19\n203.148.0.0/18\n203.148.64.0/20\n203.148.80.0/22\n203.148.86.0/23\n203.149.92.0/22\n203.152.64.0/19\n203.152.128.0/19\n203.153.0.0/22\n203.156.192.0/18\n203.158.16.0/21\n203.160.104.0/21\n203.160.129.0/24\n203.160.192.0/19\n203.161.0.0/22\n203.161.180.0/24\n203.161.192.0/19\n203.166.160.0/19\n203.168.0.0/19\n203.170.58.0/23\n203.171.0.0/22\n203.171.224.0/20\n203.174.4.0/24\n203.174.7.0/24\n203.174.96.0/19\n203.175.128.0/19\n203.175.192.0/18\n203.176.0.0/18\n203.176.64.0/19\n203.176.168.0/21\n203.184.80.0/20\n203.187.160.0/19\n203.189.0.0/23\n203.189.6.0/23\n203.189.112.0/22\n203.189.192.0/19\n203.190.96.0/20\n203.190.249.0/24\n203.191.0.0/23\n203.191.16.0/20\n203.191.64.0/18\n203.191.144.0/21\n203.191.152.0/21\n203.192.0.0/19\n203.193.224.0/19\n203.194.120.0/21\n203.195.64.0/19\n203.195.112.0/21\n203.195.128.0/17\n203.196.0.0/21\n203.196.8.0/21\n203.202.236.0/22\n203.205.64.0/19\n203.205.128.0/17\n203.207.64.0/18\n203.207.128.0/17\n203.208.0.0/20\n203.208.16.0/22\n203.208.32.0/19\n203.209.224.0/19\n203.212.0.0/20\n203.212.80.0/20\n203.215.232.0/21\n203.222.192.0/20\n203.223.0.0/20\n203.223.16.0/21\n210.2.0.0/20\n210.2.16.0/20\n210.5.0.0/19\n210.5.56.0/21\n210.5.128.0/20\n210.5.144.0/20\n210.12.0.0/18\n210.12.64.0/18\n210.12.128.0/18\n210.12.192.0/18\n210.13.0.0/18\n210.13.64.0/18\n210.13.128.0/17\n210.14.64.0/19\n210.14.112.0/20\n210.14.128.0/19\n210.14.160.0/19\n210.14.192.0/19\n210.14.224.0/19\n210.15.0.0/19\n210.15.32.0/19\n210.15.64.0/19\n210.15.96.0/19\n210.15.128.0/18\n210.16.128.0/18\n210.21.0.0/17\n210.21.128.0/17\n210.22.0.0/16\n210.23.32.0/19\n210.25.0.0/16\n210.26.0.0/15\n210.28.0.0/14\n210.32.0.0/14\n210.36.0.0/14\n210.40.0.0/13\n210.48.136.0/21\n210.51.0.0/16\n210.52.0.0/18\n210.52.64.0/18\n210.52.128.0/17\n210.53.0.0/17\n210.53.128.0/17\n210.56.192.0/19\n210.72.0.0/17\n210.72.128.0/19\n210.72.160.0/19\n210.72.192.0/18\n210.73.0.0/19\n210.73.32.0/19\n210.73.64.0/18\n210.73.128.0/17\n210.74.0.0/19\n210.74.32.0/19\n210.74.64.0/19\n210.74.96.0/19\n210.74.128.0/19\n210.74.160.0/19\n210.74.192.0/18\n210.75.0.0/16\n210.76.0.0/19\n210.76.32.0/19\n210.76.64.0/18\n210.76.128.0/17\n210.77.0.0/16\n210.78.0.0/19\n210.78.32.0/19\n210.78.64.0/18\n210.78.128.0/19\n210.78.160.0/19\n210.78.192.0/18\n210.79.64.0/18\n210.79.224.0/19\n210.82.0.0/15\n210.87.128.0/20\n210.87.144.0/20\n210.87.160.0/19\n210.185.192.0/18\n210.192.96.0/19\n211.64.0.0/14\n211.68.0.0/15\n211.70.0.0/15\n211.80.0.0/16\n211.81.0.0/16\n211.82.0.0/16\n211.83.0.0/16\n211.84.0.0/15\n211.86.0.0/15\n211.88.0.0/16\n211.89.0.0/16\n211.90.0.0/15\n211.92.0.0/15\n211.94.0.0/15\n211.96.0.0/15\n211.98.0.0/16\n211.99.0.0/18\n211.99.64.0/19\n211.99.96.0/19\n211.99.128.0/17\n211.100.0.0/16\n211.101.0.0/18\n211.101.64.0/18\n211.101.128.0/17\n211.102.0.0/16\n211.103.0.0/17\n211.103.128.0/17\n211.136.0.0/14\n211.140.0.0/15\n211.142.0.0/17\n211.142.128.0/17\n211.143.0.0/16\n211.144.0.0/15\n211.146.0.0/16\n211.147.0.0/16\n211.148.0.0/14\n211.152.0.0/15\n211.154.0.0/16\n211.155.0.0/18\n211.155.64.0/19\n211.155.96.0/19\n211.155.128.0/17\n211.156.0.0/14\n211.160.0.0/14\n211.164.0.0/14\n218.0.0.0/16\n218.1.0.0/16\n218.2.0.0/15\n218.4.0.0/15\n218.6.0.0/16\n218.7.0.0/16\n218.8.0.0/15\n218.10.0.0/16\n218.11.0.0/16\n218.12.0.0/16\n218.13.0.0/16\n218.14.0.0/15\n218.16.0.0/14\n218.20.0.0/16\n218.21.0.0/17\n218.21.128.0/17\n218.22.0.0/15\n218.24.0.0/15\n218.26.0.0/16\n218.27.0.0/16\n218.28.0.0/15\n218.30.0.0/15\n218.56.0.0/14\n218.60.0.0/15\n218.62.0.0/17\n218.62.128.0/17\n218.63.0.0/16\n218.64.0.0/15\n218.66.0.0/16\n218.67.0.0/17\n218.67.128.0/17\n218.68.0.0/15\n218.70.0.0/15\n218.72.0.0/14\n218.76.0.0/15\n218.78.0.0/15\n218.80.0.0/14\n218.84.0.0/14\n218.88.0.0/13\n218.96.0.0/15\n218.98.0.0/17\n218.98.128.0/18\n218.98.192.0/19\n218.98.224.0/19\n218.99.0.0/16\n218.100.88.0/21\n218.100.96.0/19\n218.100.128.0/17\n218.104.0.0/17\n218.104.128.0/19\n218.104.160.0/19\n218.104.192.0/21\n218.104.200.0/21\n218.104.208.0/20\n218.104.224.0/19\n218.105.0.0/16\n218.106.0.0/15\n218.108.0.0/16\n218.109.0.0/16\n218.185.192.0/19\n218.185.240.0/21\n218.192.0.0/16\n218.193.0.0/16\n218.194.0.0/16\n218.195.0.0/16\n218.196.0.0/14\n218.200.0.0/14\n218.204.0.0/15\n218.206.0.0/15\n218.240.0.0/14\n218.244.0.0/15\n218.246.0.0/15\n218.249.0.0/16\n219.72.0.0/16\n219.82.0.0/16\n219.83.128.0/17\n219.128.0.0/12\n219.144.0.0/14\n219.148.0.0/16\n219.149.0.0/17\n219.149.128.0/18\n219.149.192.0/18\n219.150.0.0/19\n219.150.32.0/19\n219.150.64.0/19\n219.150.96.0/20\n219.150.112.0/20\n219.150.128.0/17\n219.151.0.0/19\n219.151.32.0/19\n219.151.64.0/18\n219.151.128.0/17\n219.152.0.0/15\n219.154.0.0/15\n219.156.0.0/15\n219.158.0.0/17\n219.158.128.0/17\n219.159.0.0/18\n219.159.64.0/18\n219.159.128.0/17\n219.216.0.0/15\n219.218.0.0/15\n219.220.0.0/16\n219.221.0.0/16\n219.222.0.0/15\n219.224.0.0/15\n219.226.0.0/16\n219.227.0.0/16\n219.228.0.0/15\n219.230.0.0/15\n219.232.0.0/14\n219.236.0.0/15\n219.238.0.0/15\n219.242.0.0/15\n219.244.0.0/14\n220.101.192.0/18\n220.112.0.0/14\n220.152.128.0/17\n220.154.0.0/15\n220.160.0.0/11\n220.192.0.0/15\n220.194.0.0/15\n220.196.0.0/14\n220.200.0.0/13\n220.231.0.0/18\n220.231.128.0/17\n220.232.64.0/18\n220.234.0.0/16\n220.242.0.0/15\n220.247.136.0/21\n220.248.0.0/14\n220.252.0.0/16\n221.0.0.0/15\n221.2.0.0/16\n221.3.0.0/17\n221.3.128.0/17\n221.4.0.0/16\n221.5.0.0/17\n221.5.128.0/17\n221.6.0.0/16\n221.7.0.0/19\n221.7.32.0/19\n221.7.64.0/19\n221.7.96.0/19\n221.7.128.0/17\n221.8.0.0/15\n221.10.0.0/16\n221.11.0.0/17\n221.11.128.0/18\n221.11.192.0/19\n221.11.224.0/19\n221.12.0.0/17\n221.12.128.0/18\n221.13.0.0/18\n221.13.64.0/19\n221.13.96.0/19\n221.13.128.0/17\n221.14.0.0/15\n221.122.0.0/15\n221.128.128.0/17\n221.129.0.0/16\n221.130.0.0/15\n221.133.224.0/19\n221.136.0.0/16\n221.137.0.0/16\n221.172.0.0/14\n221.176.0.0/13\n221.192.0.0/15\n221.194.0.0/16\n221.195.0.0/16\n221.196.0.0/15\n221.198.0.0/16\n221.199.0.0/19\n221.199.32.0/20\n221.199.48.0/20\n221.199.64.0/18\n221.199.128.0/18\n221.199.192.0/20\n221.199.224.0/19\n221.200.0.0/14\n221.204.0.0/15\n221.206.0.0/16\n221.207.0.0/18\n221.207.64.0/18\n221.207.128.0/17\n221.208.0.0/14\n221.212.0.0/16\n221.213.0.0/16\n221.214.0.0/15\n221.216.0.0/13\n221.224.0.0/13\n221.232.0.0/14\n221.236.0.0/15\n221.238.0.0/16\n221.239.0.0/17\n221.239.128.0/17\n222.16.0.0/15\n222.18.0.0/15\n222.20.0.0/15\n222.22.0.0/16\n222.23.0.0/16\n222.24.0.0/15\n222.26.0.0/15\n222.28.0.0/14\n222.32.0.0/11\n222.64.0.0/13\n222.72.0.0/15\n222.74.0.0/16\n222.75.0.0/16\n222.76.0.0/14\n222.80.0.0/15\n222.82.0.0/16\n222.83.0.0/17\n222.83.128.0/17\n222.84.0.0/16\n222.85.0.0/17\n222.85.128.0/17\n222.86.0.0/15\n222.88.0.0/15\n222.90.0.0/15\n222.92.0.0/14\n222.125.0.0/16\n222.126.128.0/17\n222.128.0.0/14\n222.132.0.0/14\n222.136.0.0/13\n222.160.0.0/15\n222.162.0.0/16\n222.163.0.0/19\n222.163.32.0/19\n222.163.64.0/18\n222.163.128.0/17\n222.168.0.0/15\n222.170.0.0/15\n222.172.0.0/17\n222.172.128.0/17\n222.173.0.0/16\n222.174.0.0/15\n222.176.0.0/13\n222.184.0.0/13\n222.192.0.0/14\n222.196.0.0/15\n222.198.0.0/16\n222.199.0.0/16\n222.200.0.0/14\n222.204.0.0/15\n222.206.0.0/15\n222.208.0.0/13\n222.216.0.0/15\n222.218.0.0/16\n222.219.0.0/16\n222.220.0.0/15\n222.222.0.0/15\n222.240.0.0/13\n222.248.0.0/16\n222.249.0.0/17\n222.249.128.0/19\n222.249.160.0/20\n222.249.176.0/20\n222.249.192.0/18\n223.0.0.0/15\n223.2.0.0/15\n223.4.0.0/14\n223.8.0.0/13\n223.20.0.0/15\n223.27.184.0/22\n223.64.0.0/11\n223.96.0.0/12\n223.112.0.0/14\n223.116.0.0/15\n223.120.0.0/13\n223.128.0.0/15\n223.144.0.0/12\n223.160.0.0/14\n223.166.0.0/15\n223.192.0.0/15\n223.198.0.0/15\n223.201.0.0/16\n223.202.0.0/15\n223.208.0.0/14\n223.212.0.0/15\n223.214.0.0/15\n223.220.0.0/15\n223.223.176.0/20\n223.223.192.0/20\n223.240.0.0/13\n223.248.0.0/14\n223.252.128.0/17\n223.254.0.0/16\n223.255.0.0/17\n223.255.236.0/22\n223.255.252.0/23\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/aclocal.m4",
    "content": "# generated automatically by aclocal 1.15 -*- Autoconf -*-\n\n# Copyright (C) 1996-2014 Free Software Foundation, Inc.\n\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\nm4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])\nm4_ifndef([AC_AUTOCONF_VERSION],\n  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl\nm4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,\n[m4_warning([this file was generated for autoconf 2.69.\nYou have another version of autoconf.  It may work, but is not guaranteed to.\nIf you have problems, you may need to regenerate the build system entirely.\nTo do so, use the procedure documented by the package, typically 'autoreconf'.])])\n\n# Copyright (C) 2002-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_AUTOMAKE_VERSION(VERSION)\n# ----------------------------\n# Automake X.Y traces this macro to ensure aclocal.m4 has been\n# generated from the m4 files accompanying Automake X.Y.\n# (This private macro should not be called outside this file.)\nAC_DEFUN([AM_AUTOMAKE_VERSION],\n[am__api_version='1.15'\ndnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to\ndnl require some minimum version.  Point them to the right macro.\nm4_if([$1], [1.15], [],\n      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl\n])\n\n# _AM_AUTOCONF_VERSION(VERSION)\n# -----------------------------\n# aclocal traces this macro to find the Autoconf version.\n# This is a private macro too.  Using m4_define simplifies\n# the logic in aclocal, which can simply ignore this definition.\nm4_define([_AM_AUTOCONF_VERSION], [])\n\n# AM_SET_CURRENT_AUTOMAKE_VERSION\n# -------------------------------\n# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.\n# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.\nAC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],\n[AM_AUTOMAKE_VERSION([1.15])dnl\nm4_ifndef([AC_AUTOCONF_VERSION],\n  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl\n_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])\n\n# Copyright (C) 2011-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_PROG_AR([ACT-IF-FAIL])\n# -------------------------\n# Try to determine the archiver interface, and trigger the ar-lib wrapper\n# if it is needed.  If the detection of archiver interface fails, run\n# ACT-IF-FAIL (default is to abort configure with a proper error message).\nAC_DEFUN([AM_PROG_AR],\n[AC_BEFORE([$0], [LT_INIT])dnl\nAC_BEFORE([$0], [AC_PROG_LIBTOOL])dnl\nAC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nAC_REQUIRE_AUX_FILE([ar-lib])dnl\nAC_CHECK_TOOLS([AR], [ar lib \"link -lib\"], [false])\n: ${AR=ar}\n\nAC_CACHE_CHECK([the archiver ($AR) interface], [am_cv_ar_interface],\n  [AC_LANG_PUSH([C])\n   am_cv_ar_interface=ar\n   AC_COMPILE_IFELSE([AC_LANG_SOURCE([[int some_variable = 0;]])],\n     [am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&AS_MESSAGE_LOG_FD'\n      AC_TRY_EVAL([am_ar_try])\n      if test \"$ac_status\" -eq 0; then\n        am_cv_ar_interface=ar\n      else\n        am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&AS_MESSAGE_LOG_FD'\n        AC_TRY_EVAL([am_ar_try])\n        if test \"$ac_status\" -eq 0; then\n          am_cv_ar_interface=lib\n        else\n          am_cv_ar_interface=unknown\n        fi\n      fi\n      rm -f conftest.lib libconftest.a\n     ])\n   AC_LANG_POP([C])])\n\ncase $am_cv_ar_interface in\nar)\n  ;;\nlib)\n  # Microsoft lib, so override with the ar-lib wrapper script.\n  # FIXME: It is wrong to rewrite AR.\n  # But if we don't then we get into trouble of one sort or another.\n  # A longer-term fix would be to have automake use am__AR in this case,\n  # and then we could set am__AR=\"$am_aux_dir/ar-lib \\$(AR)\" or something\n  # similar.\n  AR=\"$am_aux_dir/ar-lib $AR\"\n  ;;\nunknown)\n  m4_default([$1],\n             [AC_MSG_ERROR([could not determine $AR interface])])\n  ;;\nesac\nAC_SUBST([AR])dnl\n])\n\n# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-\n\n# Copyright (C) 2001-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets\n# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to\n# '$srcdir', '$srcdir/..', or '$srcdir/../..'.\n#\n# Of course, Automake must honor this variable whenever it calls a\n# tool from the auxiliary directory.  The problem is that $srcdir (and\n# therefore $ac_aux_dir as well) can be either absolute or relative,\n# depending on how configure is run.  This is pretty annoying, since\n# it makes $ac_aux_dir quite unusable in subdirectories: in the top\n# source directory, any form will work fine, but in subdirectories a\n# relative path needs to be adjusted first.\n#\n# $ac_aux_dir/missing\n#    fails when called from a subdirectory if $ac_aux_dir is relative\n# $top_srcdir/$ac_aux_dir/missing\n#    fails if $ac_aux_dir is absolute,\n#    fails when called from a subdirectory in a VPATH build with\n#          a relative $ac_aux_dir\n#\n# The reason of the latter failure is that $top_srcdir and $ac_aux_dir\n# are both prefixed by $srcdir.  In an in-source build this is usually\n# harmless because $srcdir is '.', but things will broke when you\n# start a VPATH build or use an absolute $srcdir.\n#\n# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,\n# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:\n#   am_aux_dir='\\$(top_srcdir)/'`expr \"$ac_aux_dir\" : \"$srcdir//*\\(.*\\)\"`\n# and then we would define $MISSING as\n#   MISSING=\"\\${SHELL} $am_aux_dir/missing\"\n# This will work as long as MISSING is not called from configure, because\n# unfortunately $(top_srcdir) has no meaning in configure.\n# However there are other variables, like CC, which are often used in\n# configure, and could therefore not use this \"fixed\" $ac_aux_dir.\n#\n# Another solution, used here, is to always expand $ac_aux_dir to an\n# absolute PATH.  The drawback is that using absolute paths prevent a\n# configured tree to be moved without reconfiguration.\n\nAC_DEFUN([AM_AUX_DIR_EXPAND],\n[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl\n# Expand $ac_aux_dir to an absolute path.\nam_aux_dir=`cd \"$ac_aux_dir\" && pwd`\n])\n\n# AM_COND_IF                                            -*- Autoconf -*-\n\n# Copyright (C) 2008-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# _AM_COND_IF\n# _AM_COND_ELSE\n# _AM_COND_ENDIF\n# --------------\n# These macros are only used for tracing.\nm4_define([_AM_COND_IF])\nm4_define([_AM_COND_ELSE])\nm4_define([_AM_COND_ENDIF])\n\n# AM_COND_IF(COND, [IF-TRUE], [IF-FALSE])\n# ---------------------------------------\n# If the shell condition COND is true, execute IF-TRUE, otherwise execute\n# IF-FALSE.  Allow automake to learn about conditional instantiating macros\n# (the AC_CONFIG_FOOS).\nAC_DEFUN([AM_COND_IF],\n[m4_ifndef([_AM_COND_VALUE_$1],\n\t   [m4_fatal([$0: no such condition \"$1\"])])dnl\n_AM_COND_IF([$1])dnl\nif test -z \"$$1_TRUE\"; then :\n  m4_n([$2])[]dnl\nm4_ifval([$3],\n[_AM_COND_ELSE([$1])dnl\nelse\n  $3\n])dnl\n_AM_COND_ENDIF([$1])dnl\nfi[]dnl\n])\n\n# AM_CONDITIONAL                                            -*- Autoconf -*-\n\n# Copyright (C) 1997-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_CONDITIONAL(NAME, SHELL-CONDITION)\n# -------------------------------------\n# Define a conditional.\nAC_DEFUN([AM_CONDITIONAL],\n[AC_PREREQ([2.52])dnl\n m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],\n       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl\nAC_SUBST([$1_TRUE])dnl\nAC_SUBST([$1_FALSE])dnl\n_AM_SUBST_NOTMAKE([$1_TRUE])dnl\n_AM_SUBST_NOTMAKE([$1_FALSE])dnl\nm4_define([_AM_COND_VALUE_$1], [$2])dnl\nif $2; then\n  $1_TRUE=\n  $1_FALSE='#'\nelse\n  $1_TRUE='#'\n  $1_FALSE=\nfi\nAC_CONFIG_COMMANDS_PRE(\n[if test -z \"${$1_TRUE}\" && test -z \"${$1_FALSE}\"; then\n  AC_MSG_ERROR([[conditional \"$1\" was never defined.\nUsually this means the macro was only invoked conditionally.]])\nfi])])\n\n# Copyright (C) 1999-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n\n# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be\n# written in clear, in which case automake, when reading aclocal.m4,\n# will think it sees a *use*, and therefore will trigger all it's\n# C support machinery.  Also note that it means that autoscan, seeing\n# CC etc. in the Makefile, will ask for an AC_PROG_CC use...\n\n\n# _AM_DEPENDENCIES(NAME)\n# ----------------------\n# See how the compiler implements dependency checking.\n# NAME is \"CC\", \"CXX\", \"OBJC\", \"OBJCXX\", \"UPC\", or \"GJC\".\n# We try a few techniques and use that to set a single cache variable.\n#\n# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was\n# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular\n# dependency, and given that the user is not expected to run this macro,\n# just rely on AC_PROG_CC.\nAC_DEFUN([_AM_DEPENDENCIES],\n[AC_REQUIRE([AM_SET_DEPDIR])dnl\nAC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl\nAC_REQUIRE([AM_MAKE_INCLUDE])dnl\nAC_REQUIRE([AM_DEP_TRACK])dnl\n\nm4_if([$1], [CC],   [depcc=\"$CC\"   am_compiler_list=],\n      [$1], [CXX],  [depcc=\"$CXX\"  am_compiler_list=],\n      [$1], [OBJC], [depcc=\"$OBJC\" am_compiler_list='gcc3 gcc'],\n      [$1], [OBJCXX], [depcc=\"$OBJCXX\" am_compiler_list='gcc3 gcc'],\n      [$1], [UPC],  [depcc=\"$UPC\"  am_compiler_list=],\n      [$1], [GCJ],  [depcc=\"$GCJ\"  am_compiler_list='gcc3 gcc'],\n                    [depcc=\"$$1\"   am_compiler_list=])\n\nAC_CACHE_CHECK([dependency style of $depcc],\n               [am_cv_$1_dependencies_compiler_type],\n[if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named 'D' -- because '-MD' means \"put the output\n  # in D\".\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_$1_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n ['s/^#*\\([a-zA-Z0-9]*\\))$/\\1/p'] < ./depcomp`\n  fi\n  am__universal=false\n  m4_case([$1], [CC],\n    [case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac],\n    [CXX],\n    [case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac])\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using \": > sub/conftst$i.h\" creates only sub/conftst1.h with\n      # Solaris 10 /bin/sh.\n      echo '/* dummy */' > sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with '-c' and '-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle '-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs.\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # After this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested.\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvc7 | msvc7msys | msvisualcpp | msvcmsys)\n      # This compiler won't grok '-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_$1_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_$1_dependencies_compiler_type=none\nfi\n])\nAC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])\nAM_CONDITIONAL([am__fastdep$1], [\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_$1_dependencies_compiler_type\" = gcc3])\n])\n\n\n# AM_SET_DEPDIR\n# -------------\n# Choose a directory name for dependency files.\n# This macro is AC_REQUIREd in _AM_DEPENDENCIES.\nAC_DEFUN([AM_SET_DEPDIR],\n[AC_REQUIRE([AM_SET_LEADING_DOT])dnl\nAC_SUBST([DEPDIR], [\"${am__leading_dot}deps\"])dnl\n])\n\n\n# AM_DEP_TRACK\n# ------------\nAC_DEFUN([AM_DEP_TRACK],\n[AC_ARG_ENABLE([dependency-tracking], [dnl\nAS_HELP_STRING(\n  [--enable-dependency-tracking],\n  [do not reject slow dependency extractors])\nAS_HELP_STRING(\n  [--disable-dependency-tracking],\n  [speeds up one-time build])])\nif test \"x$enable_dependency_tracking\" != xno; then\n  am_depcomp=\"$ac_aux_dir/depcomp\"\n  AMDEPBACKSLASH='\\'\n  am__nodep='_no'\nfi\nAM_CONDITIONAL([AMDEP], [test \"x$enable_dependency_tracking\" != xno])\nAC_SUBST([AMDEPBACKSLASH])dnl\n_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl\nAC_SUBST([am__nodep])dnl\n_AM_SUBST_NOTMAKE([am__nodep])dnl\n])\n\n# Generate code to set up dependency tracking.              -*- Autoconf -*-\n\n# Copyright (C) 1999-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n\n# _AM_OUTPUT_DEPENDENCY_COMMANDS\n# ------------------------------\nAC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],\n[{\n  # Older Autoconf quotes --file arguments for eval, but not when files\n  # are listed without --file.  Let's play safe and only enable the eval\n  # if we detect the quoting.\n  case $CONFIG_FILES in\n  *\\'*) eval set x \"$CONFIG_FILES\" ;;\n  *)   set x $CONFIG_FILES ;;\n  esac\n  shift\n  for mf\n  do\n    # Strip MF so we end up with the name of the file.\n    mf=`echo \"$mf\" | sed -e 's/:.*$//'`\n    # Check whether this is an Automake generated Makefile or not.\n    # We used to match only the files named 'Makefile.in', but\n    # some people rename them; so instead we look at the file content.\n    # Grep'ing the first line is not enough: some people post-process\n    # each Makefile.in and add a new line on top of each file to say so.\n    # Grep'ing the whole file is not good either: AIX grep has a line\n    # limit of 2048, but all sed's we know have understand at least 4000.\n    if sed -n 's,^#.*generated by automake.*,X,p' \"$mf\" | grep X >/dev/null 2>&1; then\n      dirpart=`AS_DIRNAME(\"$mf\")`\n    else\n      continue\n    fi\n    # Extract the definition of DEPDIR, am__include, and am__quote\n    # from the Makefile without running 'make'.\n    DEPDIR=`sed -n 's/^DEPDIR = //p' < \"$mf\"`\n    test -z \"$DEPDIR\" && continue\n    am__include=`sed -n 's/^am__include = //p' < \"$mf\"`\n    test -z \"$am__include\" && continue\n    am__quote=`sed -n 's/^am__quote = //p' < \"$mf\"`\n    # Find all dependency output files, they are included files with\n    # $(DEPDIR) in their names.  We invoke sed twice because it is the\n    # simplest approach to changing $(DEPDIR) to its actual value in the\n    # expansion.\n    for file in `sed -n \"\n      s/^$am__include $am__quote\\(.*(DEPDIR).*\\)$am__quote\"'$/\\1/p' <\"$mf\" | \\\n\t sed -e 's/\\$(DEPDIR)/'\"$DEPDIR\"'/g'`; do\n      # Make sure the directory exists.\n      test -f \"$dirpart/$file\" && continue\n      fdir=`AS_DIRNAME([\"$file\"])`\n      AS_MKDIR_P([$dirpart/$fdir])\n      # echo \"creating $dirpart/$file\"\n      echo '# dummy' > \"$dirpart/$file\"\n    done\n  done\n}\n])# _AM_OUTPUT_DEPENDENCY_COMMANDS\n\n\n# AM_OUTPUT_DEPENDENCY_COMMANDS\n# -----------------------------\n# This macro should only be invoked once -- use via AC_REQUIRE.\n#\n# This code is only required when automatic dependency tracking\n# is enabled.  FIXME.  This creates each '.P' file that we will\n# need in order to bootstrap the dependency handling code.\nAC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],\n[AC_CONFIG_COMMANDS([depfiles],\n     [test x\"$AMDEP_TRUE\" != x\"\" || _AM_OUTPUT_DEPENDENCY_COMMANDS],\n     [AMDEP_TRUE=\"$AMDEP_TRUE\" ac_aux_dir=\"$ac_aux_dir\"])\n])\n\n# Do all the work for Automake.                             -*- Autoconf -*-\n\n# Copyright (C) 1996-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This macro actually does too much.  Some checks are only needed if\n# your package does certain things.  But this isn't really a big deal.\n\ndnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.\nm4_define([AC_PROG_CC],\nm4_defn([AC_PROG_CC])\n[_AM_PROG_CC_C_O\n])\n\n# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])\n# AM_INIT_AUTOMAKE([OPTIONS])\n# -----------------------------------------------\n# The call with PACKAGE and VERSION arguments is the old style\n# call (pre autoconf-2.50), which is being phased out.  PACKAGE\n# and VERSION should now be passed to AC_INIT and removed from\n# the call to AM_INIT_AUTOMAKE.\n# We support both call styles for the transition.  After\n# the next Automake release, Autoconf can make the AC_INIT\n# arguments mandatory, and then we can depend on a new Autoconf\n# release and drop the old call support.\nAC_DEFUN([AM_INIT_AUTOMAKE],\n[AC_PREREQ([2.65])dnl\ndnl Autoconf wants to disallow AM_ names.  We explicitly allow\ndnl the ones we care about.\nm4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl\nAC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl\nAC_REQUIRE([AC_PROG_INSTALL])dnl\nif test \"`cd $srcdir && pwd`\" != \"`pwd`\"; then\n  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output\n  # is not polluted with repeated \"-I.\"\n  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl\n  # test to see if srcdir already configured\n  if test -f $srcdir/config.status; then\n    AC_MSG_ERROR([source directory already configured; run \"make distclean\" there first])\n  fi\nfi\n\n# test whether we have cygpath\nif test -z \"$CYGPATH_W\"; then\n  if (cygpath --version) >/dev/null 2>/dev/null; then\n    CYGPATH_W='cygpath -w'\n  else\n    CYGPATH_W=echo\n  fi\nfi\nAC_SUBST([CYGPATH_W])\n\n# Define the identity of the package.\ndnl Distinguish between old-style and new-style calls.\nm4_ifval([$2],\n[AC_DIAGNOSE([obsolete],\n             [$0: two- and three-arguments forms are deprecated.])\nm4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl\n AC_SUBST([PACKAGE], [$1])dnl\n AC_SUBST([VERSION], [$2])],\n[_AM_SET_OPTIONS([$1])dnl\ndnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.\nm4_if(\n  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),\n  [ok:ok],,\n  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl\n AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl\n AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl\n\n_AM_IF_OPTION([no-define],,\n[AC_DEFINE_UNQUOTED([PACKAGE], [\"$PACKAGE\"], [Name of package])\n AC_DEFINE_UNQUOTED([VERSION], [\"$VERSION\"], [Version number of package])])dnl\n\n# Some tools Automake needs.\nAC_REQUIRE([AM_SANITY_CHECK])dnl\nAC_REQUIRE([AC_ARG_PROGRAM])dnl\nAM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])\nAM_MISSING_PROG([AUTOCONF], [autoconf])\nAM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])\nAM_MISSING_PROG([AUTOHEADER], [autoheader])\nAM_MISSING_PROG([MAKEINFO], [makeinfo])\nAC_REQUIRE([AM_PROG_INSTALL_SH])dnl\nAC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl\nAC_REQUIRE([AC_PROG_MKDIR_P])dnl\n# For better backward compatibility.  To be removed once Automake 1.9.x\n# dies out for good.  For more background, see:\n# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>\n# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>\nAC_SUBST([mkdir_p], ['$(MKDIR_P)'])\n# We need awk for the \"check\" target (and possibly the TAP driver).  The\n# system \"awk\" is bad on some platforms.\nAC_REQUIRE([AC_PROG_AWK])dnl\nAC_REQUIRE([AC_PROG_MAKE_SET])dnl\nAC_REQUIRE([AM_SET_LEADING_DOT])dnl\n_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],\n\t      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],\n\t\t\t     [_AM_PROG_TAR([v7])])])\n_AM_IF_OPTION([no-dependencies],,\n[AC_PROVIDE_IFELSE([AC_PROG_CC],\n\t\t  [_AM_DEPENDENCIES([CC])],\n\t\t  [m4_define([AC_PROG_CC],\n\t\t\t     m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl\nAC_PROVIDE_IFELSE([AC_PROG_CXX],\n\t\t  [_AM_DEPENDENCIES([CXX])],\n\t\t  [m4_define([AC_PROG_CXX],\n\t\t\t     m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl\nAC_PROVIDE_IFELSE([AC_PROG_OBJC],\n\t\t  [_AM_DEPENDENCIES([OBJC])],\n\t\t  [m4_define([AC_PROG_OBJC],\n\t\t\t     m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl\nAC_PROVIDE_IFELSE([AC_PROG_OBJCXX],\n\t\t  [_AM_DEPENDENCIES([OBJCXX])],\n\t\t  [m4_define([AC_PROG_OBJCXX],\n\t\t\t     m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl\n])\nAC_REQUIRE([AM_SILENT_RULES])dnl\ndnl The testsuite driver may need to know about EXEEXT, so add the\ndnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This\ndnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.\nAC_CONFIG_COMMANDS_PRE(dnl\n[m4_provide_if([_AM_COMPILER_EXEEXT],\n  [AM_CONDITIONAL([am__EXEEXT], [test -n \"$EXEEXT\"])])])dnl\n\n# POSIX will say in a future version that running \"rm -f\" with no argument\n# is OK; and we want to be able to make that assumption in our Makefile\n# recipes.  So use an aggressive probe to check that the usage we want is\n# actually supported \"in the wild\" to an acceptable degree.\n# See automake bug#10828.\n# To make any issue more visible, cause the running configure to be aborted\n# by default if the 'rm' program in use doesn't match our expectations; the\n# user can still override this though.\nif rm -f && rm -fr && rm -rf; then : OK; else\n  cat >&2 <<'END'\nOops!\n\nYour 'rm' program seems unable to run without file operands specified\non the command line, even when the '-f' option is present.  This is contrary\nto the behaviour of most rm programs out there, and not conforming with\nthe upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>\n\nPlease tell bug-automake@gnu.org about your system, including the value\nof your $PATH and any error possibly output before this message.  This\ncan help us improve future automake versions.\n\nEND\n  if test x\"$ACCEPT_INFERIOR_RM_PROGRAM\" = x\"yes\"; then\n    echo 'Configuration will proceed anyway, since you have set the' >&2\n    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to \"yes\"' >&2\n    echo >&2\n  else\n    cat >&2 <<'END'\nAborting the configuration process, to ensure you take notice of the issue.\n\nYou can download and install GNU coreutils to get an 'rm' implementation\nthat behaves properly: <http://www.gnu.org/software/coreutils/>.\n\nIf you want to complete the configuration process using your problematic\n'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM\nto \"yes\", and re-run configure.\n\nEND\n    AC_MSG_ERROR([Your 'rm' program is bad, sorry.])\n  fi\nfi\ndnl The trailing newline in this macro's definition is deliberate, for\ndnl backward compatibility and to allow trailing 'dnl'-style comments\ndnl after the AM_INIT_AUTOMAKE invocation. See automake bug#16841.\n])\n\ndnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not\ndnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further\ndnl mangled by Autoconf and run in a shell conditional statement.\nm4_define([_AC_COMPILER_EXEEXT],\nm4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])\n\n# When config.status generates a header, we must update the stamp-h file.\n# This file resides in the same directory as the config header\n# that is generated.  The stamp files are numbered to have different names.\n\n# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the\n# loop where config.status creates the headers, so we can generate\n# our stamp files there.\nAC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],\n[# Compute $1's index in $config_headers.\n_am_arg=$1\n_am_stamp_count=1\nfor _am_header in $config_headers :; do\n  case $_am_header in\n    $_am_arg | $_am_arg:* )\n      break ;;\n    * )\n      _am_stamp_count=`expr $_am_stamp_count + 1` ;;\n  esac\ndone\necho \"timestamp for $_am_arg\" >`AS_DIRNAME([\"$_am_arg\"])`/stamp-h[]$_am_stamp_count])\n\n# Copyright (C) 2001-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_PROG_INSTALL_SH\n# ------------------\n# Define $install_sh.\nAC_DEFUN([AM_PROG_INSTALL_SH],\n[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nif test x\"${install_sh+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    install_sh=\"\\${SHELL} '$am_aux_dir/install-sh'\" ;;\n  *)\n    install_sh=\"\\${SHELL} $am_aux_dir/install-sh\"\n  esac\nfi\nAC_SUBST([install_sh])])\n\n# Copyright (C) 2003-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# Check whether the underlying file-system supports filenames\n# with a leading dot.  For instance MS-DOS doesn't.\nAC_DEFUN([AM_SET_LEADING_DOT],\n[rm -rf .tst 2>/dev/null\nmkdir .tst 2>/dev/null\nif test -d .tst; then\n  am__leading_dot=.\nelse\n  am__leading_dot=_\nfi\nrmdir .tst 2>/dev/null\nAC_SUBST([am__leading_dot])])\n\n# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-\n# From Jim Meyering\n\n# Copyright (C) 1996-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_MAINTAINER_MODE([DEFAULT-MODE])\n# ----------------------------------\n# Control maintainer-specific portions of Makefiles.\n# Default is to disable them, unless 'enable' is passed literally.\n# For symmetry, 'disable' may be passed as well.  Anyway, the user\n# can override the default with the --enable/--disable switch.\nAC_DEFUN([AM_MAINTAINER_MODE],\n[m4_case(m4_default([$1], [disable]),\n       [enable], [m4_define([am_maintainer_other], [disable])],\n       [disable], [m4_define([am_maintainer_other], [enable])],\n       [m4_define([am_maintainer_other], [enable])\n        m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])\nAC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])\n  dnl maintainer-mode's default is 'disable' unless 'enable' is passed\n  AC_ARG_ENABLE([maintainer-mode],\n    [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],\n      am_maintainer_other[ make rules and dependencies not useful\n      (and sometimes confusing) to the casual installer])],\n    [USE_MAINTAINER_MODE=$enableval],\n    [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))\n  AC_MSG_RESULT([$USE_MAINTAINER_MODE])\n  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])\n  MAINT=$MAINTAINER_MODE_TRUE\n  AC_SUBST([MAINT])dnl\n]\n)\n\n# Check to see how 'make' treats includes.\t            -*- Autoconf -*-\n\n# Copyright (C) 2001-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_MAKE_INCLUDE()\n# -----------------\n# Check to see how make treats includes.\nAC_DEFUN([AM_MAKE_INCLUDE],\n[am_make=${MAKE-make}\ncat > confinc << 'END'\nam__doit:\n\t@echo this is the am__doit target\n.PHONY: am__doit\nEND\n# If we don't find an include directive, just comment out the code.\nAC_MSG_CHECKING([for style of include used by $am_make])\nam__include=\"#\"\nam__quote=\n_am_result=none\n# First try GNU make style include.\necho \"include confinc\" > confmf\n# Ignore all kinds of additional output from 'make'.\ncase `$am_make -s -f confmf 2> /dev/null` in #(\n*the\\ am__doit\\ target*)\n  am__include=include\n  am__quote=\n  _am_result=GNU\n  ;;\nesac\n# Now try BSD make style include.\nif test \"$am__include\" = \"#\"; then\n   echo '.include \"confinc\"' > confmf\n   case `$am_make -s -f confmf 2> /dev/null` in #(\n   *the\\ am__doit\\ target*)\n     am__include=.include\n     am__quote=\"\\\"\"\n     _am_result=BSD\n     ;;\n   esac\nfi\nAC_SUBST([am__include])\nAC_SUBST([am__quote])\nAC_MSG_RESULT([$_am_result])\nrm -f confinc confmf\n])\n\n# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-\n\n# Copyright (C) 1997-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_MISSING_PROG(NAME, PROGRAM)\n# ------------------------------\nAC_DEFUN([AM_MISSING_PROG],\n[AC_REQUIRE([AM_MISSING_HAS_RUN])\n$1=${$1-\"${am_missing_run}$2\"}\nAC_SUBST($1)])\n\n# AM_MISSING_HAS_RUN\n# ------------------\n# Define MISSING if not defined so far and test if it is modern enough.\n# If it is, set am_missing_run to use it, otherwise, to nothing.\nAC_DEFUN([AM_MISSING_HAS_RUN],\n[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nAC_REQUIRE_AUX_FILE([missing])dnl\nif test x\"${MISSING+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    MISSING=\"\\${SHELL} \\\"$am_aux_dir/missing\\\"\" ;;\n  *)\n    MISSING=\"\\${SHELL} $am_aux_dir/missing\" ;;\n  esac\nfi\n# Use eval to expand $SHELL\nif eval \"$MISSING --is-lightweight\"; then\n  am_missing_run=\"$MISSING \"\nelse\n  am_missing_run=\n  AC_MSG_WARN(['missing' script is too old or missing])\nfi\n])\n\n# Helper functions for option handling.                     -*- Autoconf -*-\n\n# Copyright (C) 2001-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# _AM_MANGLE_OPTION(NAME)\n# -----------------------\nAC_DEFUN([_AM_MANGLE_OPTION],\n[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])\n\n# _AM_SET_OPTION(NAME)\n# --------------------\n# Set option NAME.  Presently that only means defining a flag for this option.\nAC_DEFUN([_AM_SET_OPTION],\n[m4_define(_AM_MANGLE_OPTION([$1]), [1])])\n\n# _AM_SET_OPTIONS(OPTIONS)\n# ------------------------\n# OPTIONS is a space-separated list of Automake options.\nAC_DEFUN([_AM_SET_OPTIONS],\n[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])\n\n# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])\n# -------------------------------------------\n# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.\nAC_DEFUN([_AM_IF_OPTION],\n[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])\n\n# Copyright (C) 1999-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# _AM_PROG_CC_C_O\n# ---------------\n# Like AC_PROG_CC_C_O, but changed for automake.  We rewrite AC_PROG_CC\n# to automatically call this.\nAC_DEFUN([_AM_PROG_CC_C_O],\n[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nAC_REQUIRE_AUX_FILE([compile])dnl\nAC_LANG_PUSH([C])dnl\nAC_CACHE_CHECK(\n  [whether $CC understands -c and -o together],\n  [am_cv_prog_cc_c_o],\n  [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])\n  # Make sure it works both with $CC and with simple cc.\n  # Following AC_PROG_CC_C_O, we do the test twice because some\n  # compilers refuse to overwrite an existing .o file with -o,\n  # though they will create one.\n  am_cv_prog_cc_c_o=yes\n  for am_i in 1 2; do\n    if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \\\n         && test -f conftest2.$ac_objext; then\n      : OK\n    else\n      am_cv_prog_cc_c_o=no\n      break\n    fi\n  done\n  rm -f core conftest*\n  unset am_i])\nif test \"$am_cv_prog_cc_c_o\" != yes; then\n   # Losing compiler, so override with the script.\n   # FIXME: It is wrong to rewrite CC.\n   # But if we don't then we get into trouble of one sort or another.\n   # A longer-term fix would be to have automake use am__CC in this case,\n   # and then we could set am__CC=\"\\$(top_srcdir)/compile \\$(CC)\"\n   CC=\"$am_aux_dir/compile $CC\"\nfi\nAC_LANG_POP([C])])\n\n# For backward compatibility.\nAC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])\n\n# Copyright (C) 2001-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_RUN_LOG(COMMAND)\n# -------------------\n# Run COMMAND, save the exit status in ac_status, and log it.\n# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)\nAC_DEFUN([AM_RUN_LOG],\n[{ echo \"$as_me:$LINENO: $1\" >&AS_MESSAGE_LOG_FD\n   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD\n   ac_status=$?\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&AS_MESSAGE_LOG_FD\n   (exit $ac_status); }])\n\n# Check to make sure that the build environment is sane.    -*- Autoconf -*-\n\n# Copyright (C) 1996-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_SANITY_CHECK\n# ---------------\nAC_DEFUN([AM_SANITY_CHECK],\n[AC_MSG_CHECKING([whether build environment is sane])\n# Reject unsafe characters in $srcdir or the absolute working directory\n# name.  Accept space and tab only in the latter.\nam_lf='\n'\ncase `pwd` in\n  *[[\\\\\\\"\\#\\$\\&\\'\\`$am_lf]]*)\n    AC_MSG_ERROR([unsafe absolute working directory name]);;\nesac\ncase $srcdir in\n  *[[\\\\\\\"\\#\\$\\&\\'\\`$am_lf\\ \\\t]]*)\n    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;\nesac\n\n# Do 'set' in a subshell so we don't clobber the current shell's\n# arguments.  Must try -L first in case configure is actually a\n# symlink; some systems play weird games with the mod time of symlinks\n# (eg FreeBSD returns the mod time of the symlink's containing\n# directory).\nif (\n   am_has_slept=no\n   for am_try in 1 2; do\n     echo \"timestamp, slept: $am_has_slept\" > conftest.file\n     set X `ls -Lt \"$srcdir/configure\" conftest.file 2> /dev/null`\n     if test \"$[*]\" = \"X\"; then\n\t# -L didn't work.\n\tset X `ls -t \"$srcdir/configure\" conftest.file`\n     fi\n     if test \"$[*]\" != \"X $srcdir/configure conftest.file\" \\\n\t&& test \"$[*]\" != \"X conftest.file $srcdir/configure\"; then\n\n\t# If neither matched, then we have a broken ls.  This can happen\n\t# if, for instance, CONFIG_SHELL is bash and it inherits a\n\t# broken ls alias from the environment.  This has actually\n\t# happened.  Such a system could not be considered \"sane\".\n\tAC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken\n  alias in your environment])\n     fi\n     if test \"$[2]\" = conftest.file || test $am_try -eq 2; then\n       break\n     fi\n     # Just in case.\n     sleep 1\n     am_has_slept=yes\n   done\n   test \"$[2]\" = conftest.file\n   )\nthen\n   # Ok.\n   :\nelse\n   AC_MSG_ERROR([newly created file is older than distributed files!\nCheck your system clock])\nfi\nAC_MSG_RESULT([yes])\n# If we didn't sleep, we still need to ensure time stamps of config.status and\n# generated files are strictly newer.\nam_sleep_pid=\nif grep 'slept: no' conftest.file >/dev/null 2>&1; then\n  ( sleep 1 ) &\n  am_sleep_pid=$!\nfi\nAC_CONFIG_COMMANDS_PRE(\n  [AC_MSG_CHECKING([that generated files are newer than configure])\n   if test -n \"$am_sleep_pid\"; then\n     # Hide warnings about reused PIDs.\n     wait $am_sleep_pid 2>/dev/null\n   fi\n   AC_MSG_RESULT([done])])\nrm -f conftest.file\n])\n\n# Copyright (C) 2009-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_SILENT_RULES([DEFAULT])\n# --------------------------\n# Enable less verbose build rules; with the default set to DEFAULT\n# (\"yes\" being less verbose, \"no\" or empty being verbose).\nAC_DEFUN([AM_SILENT_RULES],\n[AC_ARG_ENABLE([silent-rules], [dnl\nAS_HELP_STRING(\n  [--enable-silent-rules],\n  [less verbose build output (undo: \"make V=1\")])\nAS_HELP_STRING(\n  [--disable-silent-rules],\n  [verbose build output (undo: \"make V=0\")])dnl\n])\ncase $enable_silent_rules in @%:@ (((\n  yes) AM_DEFAULT_VERBOSITY=0;;\n   no) AM_DEFAULT_VERBOSITY=1;;\n    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;\nesac\ndnl\ndnl A few 'make' implementations (e.g., NonStop OS and NextStep)\ndnl do not support nested variable expansions.\ndnl See automake bug#9928 and bug#10237.\nam_make=${MAKE-make}\nAC_CACHE_CHECK([whether $am_make supports nested variables],\n   [am_cv_make_support_nested_variables],\n   [if AS_ECHO([['TRUE=$(BAR$(V))\nBAR0=false\nBAR1=true\nV=1\nam__doit:\n\t@$(TRUE)\n.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then\n  am_cv_make_support_nested_variables=yes\nelse\n  am_cv_make_support_nested_variables=no\nfi])\nif test $am_cv_make_support_nested_variables = yes; then\n  dnl Using '$V' instead of '$(V)' breaks IRIX make.\n  AM_V='$(V)'\n  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'\nelse\n  AM_V=$AM_DEFAULT_VERBOSITY\n  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY\nfi\nAC_SUBST([AM_V])dnl\nAM_SUBST_NOTMAKE([AM_V])dnl\nAC_SUBST([AM_DEFAULT_V])dnl\nAM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl\nAC_SUBST([AM_DEFAULT_VERBOSITY])dnl\nAM_BACKSLASH='\\'\nAC_SUBST([AM_BACKSLASH])dnl\n_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl\n])\n\n# Copyright (C) 2001-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_PROG_INSTALL_STRIP\n# ---------------------\n# One issue with vendor 'install' (even GNU) is that you can't\n# specify the program used to strip binaries.  This is especially\n# annoying in cross-compiling environments, where the build's strip\n# is unlikely to handle the host's binaries.\n# Fortunately install-sh will honor a STRIPPROG variable, so we\n# always use install-sh in \"make install-strip\", and initialize\n# STRIPPROG with the value of the STRIP variable (set by the user).\nAC_DEFUN([AM_PROG_INSTALL_STRIP],\n[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl\n# Installed binaries are usually stripped using 'strip' when the user\n# run \"make install-strip\".  However 'strip' might not be the right\n# tool to use in cross-compilation environments, therefore Automake\n# will honor the 'STRIP' environment variable to overrule this program.\ndnl Don't test for $cross_compiling = yes, because it might be 'maybe'.\nif test \"$cross_compiling\" != no; then\n  AC_CHECK_TOOL([STRIP], [strip], :)\nfi\nINSTALL_STRIP_PROGRAM=\"\\$(install_sh) -c -s\"\nAC_SUBST([INSTALL_STRIP_PROGRAM])])\n\n# Copyright (C) 2006-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# _AM_SUBST_NOTMAKE(VARIABLE)\n# ---------------------------\n# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.\n# This macro is traced by Automake.\nAC_DEFUN([_AM_SUBST_NOTMAKE])\n\n# AM_SUBST_NOTMAKE(VARIABLE)\n# --------------------------\n# Public sister of _AM_SUBST_NOTMAKE.\nAC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])\n\n# Check how to create a tarball.                            -*- Autoconf -*-\n\n# Copyright (C) 2004-2014 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# _AM_PROG_TAR(FORMAT)\n# --------------------\n# Check how to create a tarball in format FORMAT.\n# FORMAT should be one of 'v7', 'ustar', or 'pax'.\n#\n# Substitute a variable $(am__tar) that is a command\n# writing to stdout a FORMAT-tarball containing the directory\n# $tardir.\n#     tardir=directory && $(am__tar) > result.tar\n#\n# Substitute a variable $(am__untar) that extract such\n# a tarball read from stdin.\n#     $(am__untar) < result.tar\n#\nAC_DEFUN([_AM_PROG_TAR],\n[# Always define AMTAR for backward compatibility.  Yes, it's still used\n# in the wild :-(  We should find a proper way to deprecate it ...\nAC_SUBST([AMTAR], ['$${TAR-tar}'])\n\n# We'll loop over all known methods to create a tar archive until one works.\n_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'\n\nm4_if([$1], [v7],\n  [am__tar='$${TAR-tar} chof - \"$$tardir\"' am__untar='$${TAR-tar} xf -'],\n\n  [m4_case([$1],\n    [ustar],\n     [# The POSIX 1988 'ustar' format is defined with fixed-size fields.\n      # There is notably a 21 bits limit for the UID and the GID.  In fact,\n      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343\n      # and bug#13588).\n      am_max_uid=2097151 # 2^21 - 1\n      am_max_gid=$am_max_uid\n      # The $UID and $GID variables are not portable, so we need to resort\n      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls\n      # below are definitely unexpected, so allow the users to see them\n      # (that is, avoid stderr redirection).\n      am_uid=`id -u || echo unknown`\n      am_gid=`id -g || echo unknown`\n      AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])\n      if test $am_uid -le $am_max_uid; then\n         AC_MSG_RESULT([yes])\n      else\n         AC_MSG_RESULT([no])\n         _am_tools=none\n      fi\n      AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])\n      if test $am_gid -le $am_max_gid; then\n         AC_MSG_RESULT([yes])\n      else\n        AC_MSG_RESULT([no])\n        _am_tools=none\n      fi],\n\n  [pax],\n    [],\n\n  [m4_fatal([Unknown tar format])])\n\n  AC_MSG_CHECKING([how to create a $1 tar archive])\n\n  # Go ahead even if we have the value already cached.  We do so because we\n  # need to set the values for the 'am__tar' and 'am__untar' variables.\n  _am_tools=${am_cv_prog_tar_$1-$_am_tools}\n\n  for _am_tool in $_am_tools; do\n    case $_am_tool in\n    gnutar)\n      for _am_tar in tar gnutar gtar; do\n        AM_RUN_LOG([$_am_tar --version]) && break\n      done\n      am__tar=\"$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - \"'\"$$tardir\"'\n      am__tar_=\"$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - \"'\"$tardir\"'\n      am__untar=\"$_am_tar -xf -\"\n      ;;\n    plaintar)\n      # Must skip GNU tar: if it does not support --format= it doesn't create\n      # ustar tarball either.\n      (tar --version) >/dev/null 2>&1 && continue\n      am__tar='tar chf - \"$$tardir\"'\n      am__tar_='tar chf - \"$tardir\"'\n      am__untar='tar xf -'\n      ;;\n    pax)\n      am__tar='pax -L -x $1 -w \"$$tardir\"'\n      am__tar_='pax -L -x $1 -w \"$tardir\"'\n      am__untar='pax -r'\n      ;;\n    cpio)\n      am__tar='find \"$$tardir\" -print | cpio -o -H $1 -L'\n      am__tar_='find \"$tardir\" -print | cpio -o -H $1 -L'\n      am__untar='cpio -i -H $1 -d'\n      ;;\n    none)\n      am__tar=false\n      am__tar_=false\n      am__untar=false\n      ;;\n    esac\n\n    # If the value was cached, stop now.  We just wanted to have am__tar\n    # and am__untar set.\n    test -n \"${am_cv_prog_tar_$1}\" && break\n\n    # tar/untar a dummy directory, and stop if the command works.\n    rm -rf conftest.dir\n    mkdir conftest.dir\n    echo GrepMe > conftest.dir/file\n    AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])\n    rm -rf conftest.dir\n    if test -s conftest.tar; then\n      AM_RUN_LOG([$am__untar <conftest.tar])\n      AM_RUN_LOG([cat conftest.dir/file])\n      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break\n    fi\n  done\n  rm -rf conftest.dir\n\n  AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])\n  AC_MSG_RESULT([$am_cv_prog_tar_$1])])\n\nAC_SUBST([am__tar])\nAC_SUBST([am__untar])\n]) # _AM_PROG_TAR\n\nm4_include([m4/ax_pthread.m4])\nm4_include([m4/ax_tls.m4])\nm4_include([m4/inet_ntop.m4])\nm4_include([m4/libtool.m4])\nm4_include([m4/ltoptions.m4])\nm4_include([m4/ltsugar.m4])\nm4_include([m4/ltversion.m4])\nm4_include([m4/lt~obsolete.m4])\nm4_include([m4/mbedtls.m4])\nm4_include([m4/openssl.m4])\nm4_include([m4/pcre.m4])\nm4_include([m4/polarssl.m4])\nm4_include([m4/stack-protector.m4])\nm4_include([m4/zlib.m4])\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/auto/ar-lib",
    "content": "#! /bin/sh\n# Wrapper for Microsoft lib.exe\n\nme=ar-lib\nscriptversion=2012-03-01.08; # UTC\n\n# Copyright (C) 2010-2013 Free Software Foundation, Inc.\n# Written by Peter Rosin <peda@lysator.liu.se>.\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# This file is maintained in Automake, please report\n# bugs to <bug-automake@gnu.org> or send patches to\n# <automake-patches@gnu.org>.\n\n\n# func_error message\nfunc_error ()\n{\n  echo \"$me: $1\" 1>&2\n  exit 1\n}\n\nfile_conv=\n\n# func_file_conv build_file\n# Convert a $build file to $host form and store it in $file\n# Currently only supports Windows hosts.\nfunc_file_conv ()\n{\n  file=$1\n  case $file in\n    / | /[!/]*) # absolute file, and not a UNC file\n      if test -z \"$file_conv\"; then\n\t# lazily determine how to convert abs files\n\tcase `uname -s` in\n\t  MINGW*)\n\t    file_conv=mingw\n\t    ;;\n\t  CYGWIN*)\n\t    file_conv=cygwin\n\t    ;;\n\t  *)\n\t    file_conv=wine\n\t    ;;\n\tesac\n      fi\n      case $file_conv in\n\tmingw)\n\t  file=`cmd //C echo \"$file \" | sed -e 's/\"\\(.*\\) \" *$/\\1/'`\n\t  ;;\n\tcygwin)\n\t  file=`cygpath -m \"$file\" || echo \"$file\"`\n\t  ;;\n\twine)\n\t  file=`winepath -w \"$file\" || echo \"$file\"`\n\t  ;;\n      esac\n      ;;\n  esac\n}\n\n# func_at_file at_file operation archive\n# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE\n# for each of them.\n# When interpreting the content of the @FILE, do NOT use func_file_conv,\n# since the user would need to supply preconverted file names to\n# binutils ar, at least for MinGW.\nfunc_at_file ()\n{\n  operation=$2\n  archive=$3\n  at_file_contents=`cat \"$1\"`\n  eval set x \"$at_file_contents\"\n  shift\n\n  for member\n  do\n    $AR -NOLOGO $operation:\"$member\" \"$archive\" || exit $?\n  done\n}\n\ncase $1 in\n  '')\n     func_error \"no command.  Try '$0 --help' for more information.\"\n     ;;\n  -h | --h*)\n    cat <<EOF\nUsage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...]\n\nMembers may be specified in a file named with @FILE.\nEOF\n    exit $?\n    ;;\n  -v | --v*)\n    echo \"$me, version $scriptversion\"\n    exit $?\n    ;;\nesac\n\nif test $# -lt 3; then\n  func_error \"you must specify a program, an action and an archive\"\nfi\n\nAR=$1\nshift\nwhile :\ndo\n  if test $# -lt 2; then\n    func_error \"you must specify a program, an action and an archive\"\n  fi\n  case $1 in\n    -lib | -LIB \\\n    | -ltcg | -LTCG \\\n    | -machine* | -MACHINE* \\\n    | -subsystem* | -SUBSYSTEM* \\\n    | -verbose | -VERBOSE \\\n    | -wx* | -WX* )\n      AR=\"$AR $1\"\n      shift\n      ;;\n    *)\n      action=$1\n      shift\n      break\n      ;;\n  esac\ndone\norig_archive=$1\nshift\nfunc_file_conv \"$orig_archive\"\narchive=$file\n\n# strip leading dash in $action\naction=${action#-}\n\ndelete=\nextract=\nlist=\nquick=\nreplace=\nindex=\ncreate=\n\nwhile test -n \"$action\"\ndo\n  case $action in\n    d*) delete=yes  ;;\n    x*) extract=yes ;;\n    t*) list=yes    ;;\n    q*) quick=yes   ;;\n    r*) replace=yes ;;\n    s*) index=yes   ;;\n    S*)             ;; # the index is always updated implicitly\n    c*) create=yes  ;;\n    u*)             ;; # TODO: don't ignore the update modifier\n    v*)             ;; # TODO: don't ignore the verbose modifier\n    *)\n      func_error \"unknown action specified\"\n      ;;\n  esac\n  action=${action#?}\ndone\n\ncase $delete$extract$list$quick$replace,$index in\n  yes,* | ,yes)\n    ;;\n  yesyes*)\n    func_error \"more than one action specified\"\n    ;;\n  *)\n    func_error \"no action specified\"\n    ;;\nesac\n\nif test -n \"$delete\"; then\n  if test ! -f \"$orig_archive\"; then\n    func_error \"archive not found\"\n  fi\n  for member\n  do\n    case $1 in\n      @*)\n        func_at_file \"${1#@}\" -REMOVE \"$archive\"\n        ;;\n      *)\n        func_file_conv \"$1\"\n        $AR -NOLOGO -REMOVE:\"$file\" \"$archive\" || exit $?\n        ;;\n    esac\n  done\n\nelif test -n \"$extract\"; then\n  if test ! -f \"$orig_archive\"; then\n    func_error \"archive not found\"\n  fi\n  if test $# -gt 0; then\n    for member\n    do\n      case $1 in\n        @*)\n          func_at_file \"${1#@}\" -EXTRACT \"$archive\"\n          ;;\n        *)\n          func_file_conv \"$1\"\n          $AR -NOLOGO -EXTRACT:\"$file\" \"$archive\" || exit $?\n          ;;\n      esac\n    done\n  else\n    $AR -NOLOGO -LIST \"$archive\" | sed -e 's/\\\\/\\\\\\\\/g' | while read member\n    do\n      $AR -NOLOGO -EXTRACT:\"$member\" \"$archive\" || exit $?\n    done\n  fi\n\nelif test -n \"$quick$replace\"; then\n  if test ! -f \"$orig_archive\"; then\n    if test -z \"$create\"; then\n      echo \"$me: creating $orig_archive\"\n    fi\n    orig_archive=\n  else\n    orig_archive=$archive\n  fi\n\n  for member\n  do\n    case $1 in\n    @*)\n      func_file_conv \"${1#@}\"\n      set x \"$@\" \"@$file\"\n      ;;\n    *)\n      func_file_conv \"$1\"\n      set x \"$@\" \"$file\"\n      ;;\n    esac\n    shift\n    shift\n  done\n\n  if test -n \"$orig_archive\"; then\n    $AR -NOLOGO -OUT:\"$archive\" \"$orig_archive\" \"$@\" || exit $?\n  else\n    $AR -NOLOGO -OUT:\"$archive\" \"$@\" || exit $?\n  fi\n\nelif test -n \"$list\"; then\n  if test ! -f \"$orig_archive\"; then\n    func_error \"archive not found\"\n  fi\n  $AR -NOLOGO -LIST \"$archive\" || exit $?\nfi\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/auto/compile",
    "content": "#! /bin/sh\n# Wrapper for compilers which do not understand '-c -o'.\n\nscriptversion=2012-10-14.11; # UTC\n\n# Copyright (C) 1999-2013 Free Software Foundation, Inc.\n# Written by Tom Tromey <tromey@cygnus.com>.\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n#\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# This file is maintained in Automake, please report\n# bugs to <bug-automake@gnu.org> or send patches to\n# <automake-patches@gnu.org>.\n\nnl='\n'\n\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent tools from complaining about whitespace usage.\nIFS=\" \"\"\t$nl\"\n\nfile_conv=\n\n# func_file_conv build_file lazy\n# Convert a $build file to $host form and store it in $file\n# Currently only supports Windows hosts. If the determined conversion\n# type is listed in (the comma separated) LAZY, no conversion will\n# take place.\nfunc_file_conv ()\n{\n  file=$1\n  case $file in\n    / | /[!/]*) # absolute file, and not a UNC file\n      if test -z \"$file_conv\"; then\n\t# lazily determine how to convert abs files\n\tcase `uname -s` in\n\t  MINGW*)\n\t    file_conv=mingw\n\t    ;;\n\t  CYGWIN*)\n\t    file_conv=cygwin\n\t    ;;\n\t  *)\n\t    file_conv=wine\n\t    ;;\n\tesac\n      fi\n      case $file_conv/,$2, in\n\t*,$file_conv,*)\n\t  ;;\n\tmingw/*)\n\t  file=`cmd //C echo \"$file \" | sed -e 's/\"\\(.*\\) \" *$/\\1/'`\n\t  ;;\n\tcygwin/*)\n\t  file=`cygpath -m \"$file\" || echo \"$file\"`\n\t  ;;\n\twine/*)\n\t  file=`winepath -w \"$file\" || echo \"$file\"`\n\t  ;;\n      esac\n      ;;\n  esac\n}\n\n# func_cl_dashL linkdir\n# Make cl look for libraries in LINKDIR\nfunc_cl_dashL ()\n{\n  func_file_conv \"$1\"\n  if test -z \"$lib_path\"; then\n    lib_path=$file\n  else\n    lib_path=\"$lib_path;$file\"\n  fi\n  linker_opts=\"$linker_opts -LIBPATH:$file\"\n}\n\n# func_cl_dashl library\n# Do a library search-path lookup for cl\nfunc_cl_dashl ()\n{\n  lib=$1\n  found=no\n  save_IFS=$IFS\n  IFS=';'\n  for dir in $lib_path $LIB\n  do\n    IFS=$save_IFS\n    if $shared && test -f \"$dir/$lib.dll.lib\"; then\n      found=yes\n      lib=$dir/$lib.dll.lib\n      break\n    fi\n    if test -f \"$dir/$lib.lib\"; then\n      found=yes\n      lib=$dir/$lib.lib\n      break\n    fi\n    if test -f \"$dir/lib$lib.a\"; then\n      found=yes\n      lib=$dir/lib$lib.a\n      break\n    fi\n  done\n  IFS=$save_IFS\n\n  if test \"$found\" != yes; then\n    lib=$lib.lib\n  fi\n}\n\n# func_cl_wrapper cl arg...\n# Adjust compile command to suit cl\nfunc_cl_wrapper ()\n{\n  # Assume a capable shell\n  lib_path=\n  shared=:\n  linker_opts=\n  for arg\n  do\n    if test -n \"$eat\"; then\n      eat=\n    else\n      case $1 in\n\t-o)\n\t  # configure might choose to run compile as 'compile cc -o foo foo.c'.\n\t  eat=1\n\t  case $2 in\n\t    *.o | *.[oO][bB][jJ])\n\t      func_file_conv \"$2\"\n\t      set x \"$@\" -Fo\"$file\"\n\t      shift\n\t      ;;\n\t    *)\n\t      func_file_conv \"$2\"\n\t      set x \"$@\" -Fe\"$file\"\n\t      shift\n\t      ;;\n\t  esac\n\t  ;;\n\t-I)\n\t  eat=1\n\t  func_file_conv \"$2\" mingw\n\t  set x \"$@\" -I\"$file\"\n\t  shift\n\t  ;;\n\t-I*)\n\t  func_file_conv \"${1#-I}\" mingw\n\t  set x \"$@\" -I\"$file\"\n\t  shift\n\t  ;;\n\t-l)\n\t  eat=1\n\t  func_cl_dashl \"$2\"\n\t  set x \"$@\" \"$lib\"\n\t  shift\n\t  ;;\n\t-l*)\n\t  func_cl_dashl \"${1#-l}\"\n\t  set x \"$@\" \"$lib\"\n\t  shift\n\t  ;;\n\t-L)\n\t  eat=1\n\t  func_cl_dashL \"$2\"\n\t  ;;\n\t-L*)\n\t  func_cl_dashL \"${1#-L}\"\n\t  ;;\n\t-static)\n\t  shared=false\n\t  ;;\n\t-Wl,*)\n\t  arg=${1#-Wl,}\n\t  save_ifs=\"$IFS\"; IFS=','\n\t  for flag in $arg; do\n\t    IFS=\"$save_ifs\"\n\t    linker_opts=\"$linker_opts $flag\"\n\t  done\n\t  IFS=\"$save_ifs\"\n\t  ;;\n\t-Xlinker)\n\t  eat=1\n\t  linker_opts=\"$linker_opts $2\"\n\t  ;;\n\t-*)\n\t  set x \"$@\" \"$1\"\n\t  shift\n\t  ;;\n\t*.cc | *.CC | *.cxx | *.CXX | *.[cC]++)\n\t  func_file_conv \"$1\"\n\t  set x \"$@\" -Tp\"$file\"\n\t  shift\n\t  ;;\n\t*.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO])\n\t  func_file_conv \"$1\" mingw\n\t  set x \"$@\" \"$file\"\n\t  shift\n\t  ;;\n\t*)\n\t  set x \"$@\" \"$1\"\n\t  shift\n\t  ;;\n      esac\n    fi\n    shift\n  done\n  if test -n \"$linker_opts\"; then\n    linker_opts=\"-link$linker_opts\"\n  fi\n  exec \"$@\" $linker_opts\n  exit 1\n}\n\neat=\n\ncase $1 in\n  '')\n     echo \"$0: No command.  Try '$0 --help' for more information.\" 1>&2\n     exit 1;\n     ;;\n  -h | --h*)\n    cat <<\\EOF\nUsage: compile [--help] [--version] PROGRAM [ARGS]\n\nWrapper for compilers which do not understand '-c -o'.\nRemove '-o dest.o' from ARGS, run PROGRAM with the remaining\narguments, and rename the output as expected.\n\nIf you are trying to build a whole package this is not the\nright script to run: please start by reading the file 'INSTALL'.\n\nReport bugs to <bug-automake@gnu.org>.\nEOF\n    exit $?\n    ;;\n  -v | --v*)\n    echo \"compile $scriptversion\"\n    exit $?\n    ;;\n  cl | *[/\\\\]cl | cl.exe | *[/\\\\]cl.exe )\n    func_cl_wrapper \"$@\"      # Doesn't return...\n    ;;\nesac\n\nofile=\ncfile=\n\nfor arg\ndo\n  if test -n \"$eat\"; then\n    eat=\n  else\n    case $1 in\n      -o)\n\t# configure might choose to run compile as 'compile cc -o foo foo.c'.\n\t# So we strip '-o arg' only if arg is an object.\n\teat=1\n\tcase $2 in\n\t  *.o | *.obj)\n\t    ofile=$2\n\t    ;;\n\t  *)\n\t    set x \"$@\" -o \"$2\"\n\t    shift\n\t    ;;\n\tesac\n\t;;\n      *.c)\n\tcfile=$1\n\tset x \"$@\" \"$1\"\n\tshift\n\t;;\n      *)\n\tset x \"$@\" \"$1\"\n\tshift\n\t;;\n    esac\n  fi\n  shift\ndone\n\nif test -z \"$ofile\" || test -z \"$cfile\"; then\n  # If no '-o' option was seen then we might have been invoked from a\n  # pattern rule where we don't need one.  That is ok -- this is a\n  # normal compilation that the losing compiler can handle.  If no\n  # '.c' file was seen then we are probably linking.  That is also\n  # ok.\n  exec \"$@\"\nfi\n\n# Name of file we expect compiler to create.\ncofile=`echo \"$cfile\" | sed 's|^.*[\\\\/]||; s|^[a-zA-Z]:||; s/\\.c$/.o/'`\n\n# Create the lock directory.\n# Note: use '[/\\\\:.-]' here to ensure that we don't use the same name\n# that we are using for the .o file.  Also, base the name on the expected\n# object file name, since that is what matters with a parallel build.\nlockdir=`echo \"$cofile\" | sed -e 's|[/\\\\:.-]|_|g'`.d\nwhile true; do\n  if mkdir \"$lockdir\" >/dev/null 2>&1; then\n    break\n  fi\n  sleep 1\ndone\n# FIXME: race condition here if user kills between mkdir and trap.\ntrap \"rmdir '$lockdir'; exit 1\" 1 2 15\n\n# Run the compile.\n\"$@\"\nret=$?\n\nif test -f \"$cofile\"; then\n  test \"$cofile\" = \"$ofile\" || mv \"$cofile\" \"$ofile\"\nelif test -f \"${cofile}bj\"; then\n  test \"${cofile}bj\" = \"$ofile\" || mv \"${cofile}bj\" \"$ofile\"\nfi\n\nrmdir \"$lockdir\"\nexit $ret\n\n# Local Variables:\n# mode: shell-script\n# sh-indentation: 2\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/auto/config.guess",
    "content": "#! /bin/sh\n# Attempt to guess a canonical system name.\n#   Copyright 1992-2013 Free Software Foundation, Inc.\n\ntimestamp='2013-06-10'\n\n# This file is free software; you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, see <http://www.gnu.org/licenses/>.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that\n# program.  This Exception is an additional permission under section 7\n# of the GNU General Public License, version 3 (\"GPLv3\").\n#\n# Originally written by Per Bothner.\n#\n# You can get the latest version of this script from:\n# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD\n#\n# Please send patches with a ChangeLog entry to config-patches@gnu.org.\n\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION]\n\nOutput the configuration name of the system \\`$me' is run on.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.guess ($timestamp)\n\nOriginally written by Per Bothner.\nCopyright 1992-2013 Free Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit ;;\n    --version | -v )\n       echo \"$version\" ; exit ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\" >&2\n       exit 1 ;;\n    * )\n       break ;;\n  esac\ndone\n\nif test $# != 0; then\n  echo \"$me: too many arguments$help\" >&2\n  exit 1\nfi\n\ntrap 'exit 1' 1 2 15\n\n# CC_FOR_BUILD -- compiler used by this script. Note that the use of a\n# compiler to aid in system detection is discouraged as it requires\n# temporary files to be created and, as you can see below, it is a\n# headache to deal with in a portable fashion.\n\n# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still\n# use `HOST_CC' if defined, but it is deprecated.\n\n# Portable tmp directory creation inspired by the Autoconf team.\n\nset_cc_for_build='\ntrap \"exitcode=\\$?; (rm -f \\$tmpfiles 2>/dev/null; rmdir \\$tmp 2>/dev/null) && exit \\$exitcode\" 0 ;\ntrap \"rm -f \\$tmpfiles 2>/dev/null; rmdir \\$tmp 2>/dev/null; exit 1\" 1 2 13 15 ;\n: ${TMPDIR=/tmp} ;\n { tmp=`(umask 077 && mktemp -d \"$TMPDIR/cgXXXXXX\") 2>/dev/null` && test -n \"$tmp\" && test -d \"$tmp\" ; } ||\n { test -n \"$RANDOM\" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||\n { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo \"Warning: creating insecure temp directory\" >&2 ; } ||\n { echo \"$me: cannot create a temporary directory in $TMPDIR\" >&2 ; exit 1 ; } ;\ndummy=$tmp/dummy ;\ntmpfiles=\"$dummy.c $dummy.o $dummy.rel $dummy\" ;\ncase $CC_FOR_BUILD,$HOST_CC,$CC in\n ,,)    echo \"int x;\" > $dummy.c ;\n\tfor c in cc gcc c89 c99 ; do\n\t  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then\n\t     CC_FOR_BUILD=\"$c\"; break ;\n\t  fi ;\n\tdone ;\n\tif test x\"$CC_FOR_BUILD\" = x ; then\n\t  CC_FOR_BUILD=no_compiler_found ;\n\tfi\n\t;;\n ,,*)   CC_FOR_BUILD=$CC ;;\n ,*,*)  CC_FOR_BUILD=$HOST_CC ;;\nesac ; set_cc_for_build= ;'\n\n# This is needed to find uname on a Pyramid OSx when run in the BSD universe.\n# (ghazi@noc.rutgers.edu 1994-08-24)\nif (test -f /.attbin/uname) >/dev/null 2>&1 ; then\n\tPATH=$PATH:/.attbin ; export PATH\nfi\n\nUNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown\nUNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown\nUNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown\nUNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown\n\ncase \"${UNAME_SYSTEM}\" in\nLinux|GNU|GNU/*)\n\t# If the system lacks a compiler, then just pick glibc.\n\t# We could probably try harder.\n\tLIBC=gnu\n\n\teval $set_cc_for_build\n\tcat <<-EOF > $dummy.c\n\t#include <features.h>\n\t#if defined(__UCLIBC__)\n\tLIBC=uclibc\n\t#elif defined(__dietlibc__)\n\tLIBC=dietlibc\n\t#else\n\tLIBC=gnu\n\t#endif\n\tEOF\n\teval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`\n\t;;\nesac\n\n# Note: order is significant - the case branches are not exclusive.\n\ncase \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" in\n    *:NetBSD:*:*)\n\t# NetBSD (nbsd) targets should (where applicable) match one or\n\t# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,\n\t# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently\n\t# switched to ELF, *-*-netbsd* would select the old\n\t# object file format.  This provides both forward\n\t# compatibility and a consistent mechanism for selecting the\n\t# object file format.\n\t#\n\t# Note: NetBSD doesn't particularly care about the vendor\n\t# portion of the name.  We always set it to \"unknown\".\n\tsysctl=\"sysctl -n hw.machine_arch\"\n\tUNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \\\n\t    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    armeb) machine=armeb-unknown ;;\n\t    arm*) machine=arm-unknown ;;\n\t    sh3el) machine=shl-unknown ;;\n\t    sh3eb) machine=sh-unknown ;;\n\t    sh5el) machine=sh5le-unknown ;;\n\t    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;\n\tesac\n\t# The Operating System including object format, if it has switched\n\t# to ELF recently, or will in the future.\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    arm*|i386|m68k|ns32k|sh3*|sparc|vax)\n\t\teval $set_cc_for_build\n\t\tif echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t\t\t| grep -q __ELF__\n\t\tthen\n\t\t    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).\n\t\t    # Return netbsd for either.  FIX?\n\t\t    os=netbsd\n\t\telse\n\t\t    os=netbsdelf\n\t\tfi\n\t\t;;\n\t    *)\n\t\tos=netbsd\n\t\t;;\n\tesac\n\t# The OS release\n\t# Debian GNU/NetBSD machines have a different userland, and\n\t# thus, need a distinct triplet. However, they do not need\n\t# kernel version information, so it can be replaced with a\n\t# suitable tag, in the style of linux-gnu.\n\tcase \"${UNAME_VERSION}\" in\n\t    Debian*)\n\t\trelease='-gnu'\n\t\t;;\n\t    *)\n\t\trelease=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\\./'`\n\t\t;;\n\tesac\n\t# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:\n\t# contains redundant information, the shorter form:\n\t# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.\n\techo \"${machine}-${os}${release}\"\n\texit ;;\n    *:Bitrig:*:*)\n\tUNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`\n\techo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}\n\texit ;;\n    *:OpenBSD:*:*)\n\tUNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`\n\techo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}\n\texit ;;\n    *:ekkoBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}\n\texit ;;\n    *:SolidBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}\n\texit ;;\n    macppc:MirBSD:*:*)\n\techo powerpc-unknown-mirbsd${UNAME_RELEASE}\n\texit ;;\n    *:MirBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}\n\texit ;;\n    alpha:OSF1:*:*)\n\tcase $UNAME_RELEASE in\n\t*4.0)\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`\n\t\t;;\n\t*5.*)\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`\n\t\t;;\n\tesac\n\t# According to Compaq, /usr/sbin/psrinfo has been available on\n\t# OSF/1 and Tru64 systems produced since 1995.  I hope that\n\t# covers most systems running today.  This code pipes the CPU\n\t# types through head -n 1, so we only detect the type of CPU 0.\n\tALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \\(.*\\) processor.*$/\\1/p' | head -n 1`\n\tcase \"$ALPHA_CPU_TYPE\" in\n\t    \"EV4 (21064)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"EV4.5 (21064)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"LCA4 (21066/21068)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"EV5 (21164)\")\n\t\tUNAME_MACHINE=\"alphaev5\" ;;\n\t    \"EV5.6 (21164A)\")\n\t\tUNAME_MACHINE=\"alphaev56\" ;;\n\t    \"EV5.6 (21164PC)\")\n\t\tUNAME_MACHINE=\"alphapca56\" ;;\n\t    \"EV5.7 (21164PC)\")\n\t\tUNAME_MACHINE=\"alphapca57\" ;;\n\t    \"EV6 (21264)\")\n\t\tUNAME_MACHINE=\"alphaev6\" ;;\n\t    \"EV6.7 (21264A)\")\n\t\tUNAME_MACHINE=\"alphaev67\" ;;\n\t    \"EV6.8CB (21264C)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.8AL (21264B)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.8CX (21264D)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.9A (21264/EV69A)\")\n\t\tUNAME_MACHINE=\"alphaev69\" ;;\n\t    \"EV7 (21364)\")\n\t\tUNAME_MACHINE=\"alphaev7\" ;;\n\t    \"EV7.9 (21364A)\")\n\t\tUNAME_MACHINE=\"alphaev79\" ;;\n\tesac\n\t# A Pn.n version is a patched version.\n\t# A Vn.n version is a released version.\n\t# A Tn.n version is a released field test version.\n\t# A Xn.n version is an unreleased experimental baselevel.\n\t# 1.2 uses \"1.2\" for uname -r.\n\techo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n\t# Reset EXIT trap before exiting to avoid spurious non-zero exit code.\n\texitcode=$?\n\ttrap '' 0\n\texit $exitcode ;;\n    Alpha\\ *:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# Should we change UNAME_MACHINE based on the output of uname instead\n\t# of the specific Alpha model?\n\techo alpha-pc-interix\n\texit ;;\n    21064:Windows_NT:50:3)\n\techo alpha-dec-winnt3.5\n\texit ;;\n    Amiga*:UNIX_System_V:4.0:*)\n\techo m68k-unknown-sysv4\n\texit ;;\n    *:[Aa]miga[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-amigaos\n\texit ;;\n    *:[Mm]orph[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-morphos\n\texit ;;\n    *:OS/390:*:*)\n\techo i370-ibm-openedition\n\texit ;;\n    *:z/VM:*:*)\n\techo s390-ibm-zvmoe\n\texit ;;\n    *:OS400:*:*)\n\techo powerpc-ibm-os400\n\texit ;;\n    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)\n\techo arm-acorn-riscix${UNAME_RELEASE}\n\texit ;;\n    arm*:riscos:*:*|arm*:RISCOS:*:*)\n\techo arm-unknown-riscos\n\texit ;;\n    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)\n\techo hppa1.1-hitachi-hiuxmpp\n\texit ;;\n    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)\n\t# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.\n\tif test \"`(/bin/universe) 2>/dev/null`\" = att ; then\n\t\techo pyramid-pyramid-sysv3\n\telse\n\t\techo pyramid-pyramid-bsd\n\tfi\n\texit ;;\n    NILE*:*:*:dcosx)\n\techo pyramid-pyramid-svr4\n\texit ;;\n    DRS?6000:unix:4.0:6*)\n\techo sparc-icl-nx6\n\texit ;;\n    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)\n\tcase `/usr/bin/uname -p` in\n\t    sparc) echo sparc-icl-nx7; exit ;;\n\tesac ;;\n    s390x:SunOS:*:*)\n\techo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4H:SunOS:5.*:*)\n\techo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)\n\techo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)\n\techo i386-pc-auroraux${UNAME_RELEASE}\n\texit ;;\n    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)\n\teval $set_cc_for_build\n\tSUN_ARCH=\"i386\"\n\t# If there is a compiler, see if it is configured for 64-bit objects.\n\t# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.\n\t# This test works for both compilers.\n\tif [ \"$CC_FOR_BUILD\" != 'no_compiler_found' ]; then\n\t    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \\\n\t\t(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \\\n\t\tgrep IS_64BIT_ARCH >/dev/null\n\t    then\n\t\tSUN_ARCH=\"x86_64\"\n\t    fi\n\tfi\n\techo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:6*:*)\n\t# According to config.sub, this is the proper way to canonicalize\n\t# SunOS6.  Hard to guess exactly what SunOS6 will be like, but\n\t# it's likely to be more like Solaris than SunOS4.\n\techo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:*:*)\n\tcase \"`/usr/bin/arch -k`\" in\n\t    Series*|S4*)\n\t\tUNAME_RELEASE=`uname -v`\n\t\t;;\n\tesac\n\t# Japanese Language versions have a version number like `4.1.3-JL'.\n\techo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`\n\texit ;;\n    sun3*:SunOS:*:*)\n\techo m68k-sun-sunos${UNAME_RELEASE}\n\texit ;;\n    sun*:*:4.2BSD:*)\n\tUNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`\n\ttest \"x${UNAME_RELEASE}\" = \"x\" && UNAME_RELEASE=3\n\tcase \"`/bin/arch`\" in\n\t    sun3)\n\t\techo m68k-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\t    sun4)\n\t\techo sparc-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\tesac\n\texit ;;\n    aushp:SunOS:*:*)\n\techo sparc-auspex-sunos${UNAME_RELEASE}\n\texit ;;\n    # The situation for MiNT is a little confusing.  The machine name\n    # can be virtually everything (everything which is not\n    # \"atarist\" or \"atariste\" at least should have a processor\n    # > m68000).  The system name ranges from \"MiNT\" over \"FreeMiNT\"\n    # to the lowercase version \"mint\" (or \"freemint\").  Finally\n    # the system name \"TOS\" denotes a system which is actually not\n    # MiNT.  But MiNT is downward compatible to TOS, so this should\n    # be no problem.\n    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)\n\techo m68k-atari-mint${UNAME_RELEASE}\n\texit ;;\n    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)\n\techo m68k-atari-mint${UNAME_RELEASE}\n\texit ;;\n    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)\n\techo m68k-atari-mint${UNAME_RELEASE}\n\texit ;;\n    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)\n\techo m68k-milan-mint${UNAME_RELEASE}\n\texit ;;\n    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)\n\techo m68k-hades-mint${UNAME_RELEASE}\n\texit ;;\n    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)\n\techo m68k-unknown-mint${UNAME_RELEASE}\n\texit ;;\n    m68k:machten:*:*)\n\techo m68k-apple-machten${UNAME_RELEASE}\n\texit ;;\n    powerpc:machten:*:*)\n\techo powerpc-apple-machten${UNAME_RELEASE}\n\texit ;;\n    RISC*:Mach:*:*)\n\techo mips-dec-mach_bsd4.3\n\texit ;;\n    RISC*:ULTRIX:*:*)\n\techo mips-dec-ultrix${UNAME_RELEASE}\n\texit ;;\n    VAX*:ULTRIX*:*:*)\n\techo vax-dec-ultrix${UNAME_RELEASE}\n\texit ;;\n    2020:CLIX:*:* | 2430:CLIX:*:*)\n\techo clipper-intergraph-clix${UNAME_RELEASE}\n\texit ;;\n    mips:*:*:UMIPS | mips:*:*:RISCos)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n#ifdef __cplusplus\n#include <stdio.h>  /* for printf() prototype */\n\tint main (int argc, char *argv[]) {\n#else\n\tint main (argc, argv) int argc; char *argv[]; {\n#endif\n\t#if defined (host_mips) && defined (MIPSEB)\n\t#if defined (SYSTYPE_SYSV)\n\t  printf (\"mips-mips-riscos%ssysv\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_SVR4)\n\t  printf (\"mips-mips-riscos%ssvr4\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)\n\t  printf (\"mips-mips-riscos%sbsd\\n\", argv[1]); exit (0);\n\t#endif\n\t#endif\n\t  exit (-1);\n\t}\nEOF\n\t$CC_FOR_BUILD -o $dummy $dummy.c &&\n\t  dummyarg=`echo \"${UNAME_RELEASE}\" | sed -n 's/\\([0-9]*\\).*/\\1/p'` &&\n\t  SYSTEM_NAME=`$dummy $dummyarg` &&\n\t    { echo \"$SYSTEM_NAME\"; exit; }\n\techo mips-mips-riscos${UNAME_RELEASE}\n\texit ;;\n    Motorola:PowerMAX_OS:*:*)\n\techo powerpc-motorola-powermax\n\texit ;;\n    Motorola:*:4.3:PL8-*)\n\techo powerpc-harris-powermax\n\texit ;;\n    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)\n\techo powerpc-harris-powermax\n\texit ;;\n    Night_Hawk:Power_UNIX:*:*)\n\techo powerpc-harris-powerunix\n\texit ;;\n    m88k:CX/UX:7*:*)\n\techo m88k-harris-cxux7\n\texit ;;\n    m88k:*:4*:R4*)\n\techo m88k-motorola-sysv4\n\texit ;;\n    m88k:*:3*:R3*)\n\techo m88k-motorola-sysv3\n\texit ;;\n    AViiON:dgux:*:*)\n\t# DG/UX returns AViiON for all architectures\n\tUNAME_PROCESSOR=`/usr/bin/uname -p`\n\tif [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]\n\tthen\n\t    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \\\n\t       [ ${TARGET_BINARY_INTERFACE}x = x ]\n\t    then\n\t\techo m88k-dg-dgux${UNAME_RELEASE}\n\t    else\n\t\techo m88k-dg-dguxbcs${UNAME_RELEASE}\n\t    fi\n\telse\n\t    echo i586-dg-dgux${UNAME_RELEASE}\n\tfi\n\texit ;;\n    M88*:DolphinOS:*:*)\t# DolphinOS (SVR3)\n\techo m88k-dolphin-sysv3\n\texit ;;\n    M88*:*:R3*:*)\n\t# Delta 88k system running SVR3\n\techo m88k-motorola-sysv3\n\texit ;;\n    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)\n\techo m88k-tektronix-sysv3\n\texit ;;\n    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)\n\techo m68k-tektronix-bsd\n\texit ;;\n    *:IRIX*:*:*)\n\techo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`\n\texit ;;\n    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.\n\techo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id\n\texit ;;               # Note that: echo \"'`uname -s`'\" gives 'AIX '\n    i*86:AIX:*:*)\n\techo i386-ibm-aix\n\texit ;;\n    ia64:AIX:*:*)\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${UNAME_MACHINE}-ibm-aix${IBM_REV}\n\texit ;;\n    *:AIX:2:3)\n\tif grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\teval $set_cc_for_build\n\t\tsed 's/^\t\t//' << EOF >$dummy.c\n\t\t#include <sys/systemcfg.h>\n\n\t\tmain()\n\t\t\t{\n\t\t\tif (!__power_pc())\n\t\t\t\texit(1);\n\t\t\tputs(\"powerpc-ibm-aix3.2.5\");\n\t\t\texit(0);\n\t\t\t}\nEOF\n\t\tif $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`\n\t\tthen\n\t\t\techo \"$SYSTEM_NAME\"\n\t\telse\n\t\t\techo rs6000-ibm-aix3.2.5\n\t\tfi\n\telif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\techo rs6000-ibm-aix3.2.4\n\telse\n\t\techo rs6000-ibm-aix3.2\n\tfi\n\texit ;;\n    *:AIX:*:[4567])\n\tIBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`\n\tif /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then\n\t\tIBM_ARCH=rs6000\n\telse\n\t\tIBM_ARCH=powerpc\n\tfi\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${IBM_ARCH}-ibm-aix${IBM_REV}\n\texit ;;\n    *:AIX:*:*)\n\techo rs6000-ibm-aix\n\texit ;;\n    ibmrt:4.4BSD:*|romp-ibm:BSD:*)\n\techo romp-ibm-bsd4.4\n\texit ;;\n    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and\n\techo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to\n\texit ;;                             # report: romp-ibm BSD 4.3\n    *:BOSX:*:*)\n\techo rs6000-bull-bosx\n\texit ;;\n    DPX/2?00:B.O.S.:*:*)\n\techo m68k-bull-sysv3\n\texit ;;\n    9000/[34]??:4.3bsd:1.*:*)\n\techo m68k-hp-bsd\n\texit ;;\n    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)\n\techo m68k-hp-bsd4.4\n\texit ;;\n    9000/[34678]??:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\tcase \"${UNAME_MACHINE}\" in\n\t    9000/31? )            HP_ARCH=m68000 ;;\n\t    9000/[34]?? )         HP_ARCH=m68k ;;\n\t    9000/[678][0-9][0-9])\n\t\tif [ -x /usr/bin/getconf ]; then\n\t\t    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`\n\t\t    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`\n\t\t    case \"${sc_cpu_version}\" in\n\t\t      523) HP_ARCH=\"hppa1.0\" ;; # CPU_PA_RISC1_0\n\t\t      528) HP_ARCH=\"hppa1.1\" ;; # CPU_PA_RISC1_1\n\t\t      532)                      # CPU_PA_RISC2_0\n\t\t\tcase \"${sc_kernel_bits}\" in\n\t\t\t  32) HP_ARCH=\"hppa2.0n\" ;;\n\t\t\t  64) HP_ARCH=\"hppa2.0w\" ;;\n\t\t\t  '') HP_ARCH=\"hppa2.0\" ;;   # HP-UX 10.20\n\t\t\tesac ;;\n\t\t    esac\n\t\tfi\n\t\tif [ \"${HP_ARCH}\" = \"\" ]; then\n\t\t    eval $set_cc_for_build\n\t\t    sed 's/^\t\t//' << EOF >$dummy.c\n\n\t\t#define _HPUX_SOURCE\n\t\t#include <stdlib.h>\n\t\t#include <unistd.h>\n\n\t\tint main ()\n\t\t{\n\t\t#if defined(_SC_KERNEL_BITS)\n\t\t    long bits = sysconf(_SC_KERNEL_BITS);\n\t\t#endif\n\t\t    long cpu  = sysconf (_SC_CPU_VERSION);\n\n\t\t    switch (cpu)\n\t\t\t{\n\t\t\tcase CPU_PA_RISC1_0: puts (\"hppa1.0\"); break;\n\t\t\tcase CPU_PA_RISC1_1: puts (\"hppa1.1\"); break;\n\t\t\tcase CPU_PA_RISC2_0:\n\t\t#if defined(_SC_KERNEL_BITS)\n\t\t\t    switch (bits)\n\t\t\t\t{\n\t\t\t\tcase 64: puts (\"hppa2.0w\"); break;\n\t\t\t\tcase 32: puts (\"hppa2.0n\"); break;\n\t\t\t\tdefault: puts (\"hppa2.0\"); break;\n\t\t\t\t} break;\n\t\t#else  /* !defined(_SC_KERNEL_BITS) */\n\t\t\t    puts (\"hppa2.0\"); break;\n\t\t#endif\n\t\t\tdefault: puts (\"hppa1.0\"); break;\n\t\t\t}\n\t\t    exit (0);\n\t\t}\nEOF\n\t\t    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`\n\t\t    test -z \"$HP_ARCH\" && HP_ARCH=hppa\n\t\tfi ;;\n\tesac\n\tif [ ${HP_ARCH} = \"hppa2.0w\" ]\n\tthen\n\t    eval $set_cc_for_build\n\n\t    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating\n\t    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler\n\t    # generating 64-bit code.  GNU and HP use different nomenclature:\n\t    #\n\t    # $ CC_FOR_BUILD=cc ./config.guess\n\t    # => hppa2.0w-hp-hpux11.23\n\t    # $ CC_FOR_BUILD=\"cc +DA2.0w\" ./config.guess\n\t    # => hppa64-hp-hpux11.23\n\n\t    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |\n\t\tgrep -q __LP64__\n\t    then\n\t\tHP_ARCH=\"hppa2.0w\"\n\t    else\n\t\tHP_ARCH=\"hppa64\"\n\t    fi\n\tfi\n\techo ${HP_ARCH}-hp-hpux${HPUX_REV}\n\texit ;;\n    ia64:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\techo ia64-hp-hpux${HPUX_REV}\n\texit ;;\n    3050*:HI-UX:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#include <unistd.h>\n\tint\n\tmain ()\n\t{\n\t  long cpu = sysconf (_SC_CPU_VERSION);\n\t  /* The order matters, because CPU_IS_HP_MC68K erroneously returns\n\t     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct\n\t     results, however.  */\n\t  if (CPU_IS_PA_RISC (cpu))\n\t    {\n\t      switch (cpu)\n\t\t{\n\t\t  case CPU_PA_RISC1_0: puts (\"hppa1.0-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC1_1: puts (\"hppa1.1-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC2_0: puts (\"hppa2.0-hitachi-hiuxwe2\"); break;\n\t\t  default: puts (\"hppa-hitachi-hiuxwe2\"); break;\n\t\t}\n\t    }\n\t  else if (CPU_IS_HP_MC68K (cpu))\n\t    puts (\"m68k-hitachi-hiuxwe2\");\n\t  else puts (\"unknown-hitachi-hiuxwe2\");\n\t  exit (0);\n\t}\nEOF\n\t$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&\n\t\t{ echo \"$SYSTEM_NAME\"; exit; }\n\techo unknown-hitachi-hiuxwe2\n\texit ;;\n    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )\n\techo hppa1.1-hp-bsd\n\texit ;;\n    9000/8??:4.3bsd:*:*)\n\techo hppa1.0-hp-bsd\n\texit ;;\n    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)\n\techo hppa1.0-hp-mpeix\n\texit ;;\n    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )\n\techo hppa1.1-hp-osf\n\texit ;;\n    hp8??:OSF1:*:*)\n\techo hppa1.0-hp-osf\n\texit ;;\n    i*86:OSF1:*:*)\n\tif [ -x /usr/sbin/sysversion ] ; then\n\t    echo ${UNAME_MACHINE}-unknown-osf1mk\n\telse\n\t    echo ${UNAME_MACHINE}-unknown-osf1\n\tfi\n\texit ;;\n    parisc*:Lites*:*:*)\n\techo hppa1.1-hp-lites\n\texit ;;\n    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)\n\techo c1-convex-bsd\n\texit ;;\n    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n\texit ;;\n    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)\n\techo c34-convex-bsd\n\texit ;;\n    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)\n\techo c38-convex-bsd\n\texit ;;\n    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)\n\techo c4-convex-bsd\n\texit ;;\n    CRAY*Y-MP:*:*:*)\n\techo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*[A-Z]90:*:*:*)\n\techo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \\\n\t| sed -e 's/CRAY.*\\([A-Z]90\\)/\\1/' \\\n\t      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \\\n\t      -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*TS:*:*:*)\n\techo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*T3E:*:*:*)\n\techo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*SV1:*:*:*)\n\techo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    *:UNICOS/mp:*:*)\n\techo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)\n\tFUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n\tFUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\\///'`\n\tFUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`\n\techo \"${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\n\texit ;;\n    5000:UNIX_System_V:4.*:*)\n\tFUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\\///'`\n\tFUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`\n\techo \"sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\n\texit ;;\n    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\\ Embedded/OS:*:*)\n\techo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}\n\texit ;;\n    sparc*:BSD/OS:*:*)\n\techo sparc-unknown-bsdi${UNAME_RELEASE}\n\texit ;;\n    *:BSD/OS:*:*)\n\techo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}\n\texit ;;\n    *:FreeBSD:*:*)\n\tUNAME_PROCESSOR=`/usr/bin/uname -p`\n\tcase ${UNAME_PROCESSOR} in\n\t    amd64)\n\t\techo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;\n\t    *)\n\t\techo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;\n\tesac\n\texit ;;\n    i*:CYGWIN*:*)\n\techo ${UNAME_MACHINE}-pc-cygwin\n\texit ;;\n    *:MINGW64*:*)\n\techo ${UNAME_MACHINE}-pc-mingw64\n\texit ;;\n    *:MINGW*:*)\n\techo ${UNAME_MACHINE}-pc-mingw32\n\texit ;;\n    i*:MSYS*:*)\n\techo ${UNAME_MACHINE}-pc-msys\n\texit ;;\n    i*:windows32*:*)\n\t# uname -m includes \"-pc\" on this system.\n\techo ${UNAME_MACHINE}-mingw32\n\texit ;;\n    i*:PW*:*)\n\techo ${UNAME_MACHINE}-pc-pw32\n\texit ;;\n    *:Interix*:*)\n\tcase ${UNAME_MACHINE} in\n\t    x86)\n\t\techo i586-pc-interix${UNAME_RELEASE}\n\t\texit ;;\n\t    authenticamd | genuineintel | EM64T)\n\t\techo x86_64-unknown-interix${UNAME_RELEASE}\n\t\texit ;;\n\t    IA64)\n\t\techo ia64-unknown-interix${UNAME_RELEASE}\n\t\texit ;;\n\tesac ;;\n    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)\n\techo i${UNAME_MACHINE}-pc-mks\n\texit ;;\n    8664:Windows_NT:*)\n\techo x86_64-pc-mks\n\texit ;;\n    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we\n\t# UNAME_MACHINE based on the output of uname instead of i386?\n\techo i586-pc-interix\n\texit ;;\n    i*:UWIN*:*)\n\techo ${UNAME_MACHINE}-pc-uwin\n\texit ;;\n    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)\n\techo x86_64-unknown-cygwin\n\texit ;;\n    p*:CYGWIN*:*)\n\techo powerpcle-unknown-cygwin\n\texit ;;\n    prep*:SunOS:5.*:*)\n\techo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    *:GNU:*:*)\n\t# the GNU system\n\techo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`\n\texit ;;\n    *:GNU/*:*:*)\n\t# other systems with GNU libc and userland\n\techo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}\n\texit ;;\n    i*86:Minix:*:*)\n\techo ${UNAME_MACHINE}-pc-minix\n\texit ;;\n    aarch64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    aarch64_be:Linux:*:*)\n\tUNAME_MACHINE=aarch64_be\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    alpha:Linux:*:*)\n\tcase `sed -n '/^cpu model/s/^.*: \\(.*\\)/\\1/p' < /proc/cpuinfo` in\n\t  EV5)   UNAME_MACHINE=alphaev5 ;;\n\t  EV56)  UNAME_MACHINE=alphaev56 ;;\n\t  PCA56) UNAME_MACHINE=alphapca56 ;;\n\t  PCA57) UNAME_MACHINE=alphapca56 ;;\n\t  EV6)   UNAME_MACHINE=alphaev6 ;;\n\t  EV67)  UNAME_MACHINE=alphaev67 ;;\n\t  EV68*) UNAME_MACHINE=alphaev68 ;;\n\tesac\n\tobjdump --private-headers /bin/sh | grep -q ld.so.1\n\tif test \"$?\" = 0 ; then LIBC=\"gnulibc1\" ; fi\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    arc:Linux:*:* | arceb:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    arm*:Linux:*:*)\n\teval $set_cc_for_build\n\tif echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t    | grep -q __ARM_EABI__\n\tthen\n\t    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\telse\n\t    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t\t| grep -q __ARM_PCS_VFP\n\t    then\n\t\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi\n\t    else\n\t\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf\n\t    fi\n\tfi\n\texit ;;\n    avr32*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    cris:Linux:*:*)\n\techo ${UNAME_MACHINE}-axis-linux-${LIBC}\n\texit ;;\n    crisv32:Linux:*:*)\n\techo ${UNAME_MACHINE}-axis-linux-${LIBC}\n\texit ;;\n    frv:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    hexagon:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    i*86:Linux:*:*)\n\techo ${UNAME_MACHINE}-pc-linux-${LIBC}\n\texit ;;\n    ia64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    m32r*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    m68*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    mips:Linux:*:* | mips64:Linux:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#undef CPU\n\t#undef ${UNAME_MACHINE}\n\t#undef ${UNAME_MACHINE}el\n\t#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)\n\tCPU=${UNAME_MACHINE}el\n\t#else\n\t#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)\n\tCPU=${UNAME_MACHINE}\n\t#else\n\tCPU=\n\t#endif\n\t#endif\nEOF\n\teval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`\n\ttest x\"${CPU}\" != x && { echo \"${CPU}-unknown-linux-${LIBC}\"; exit; }\n\t;;\n    or1k:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    or32:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    padre:Linux:*:*)\n\techo sparc-unknown-linux-${LIBC}\n\texit ;;\n    parisc64:Linux:*:* | hppa64:Linux:*:*)\n\techo hppa64-unknown-linux-${LIBC}\n\texit ;;\n    parisc:Linux:*:* | hppa:Linux:*:*)\n\t# Look for CPU level\n\tcase `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in\n\t  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;\n\t  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;\n\t  *)    echo hppa-unknown-linux-${LIBC} ;;\n\tesac\n\texit ;;\n    ppc64:Linux:*:*)\n\techo powerpc64-unknown-linux-${LIBC}\n\texit ;;\n    ppc:Linux:*:*)\n\techo powerpc-unknown-linux-${LIBC}\n\texit ;;\n    ppc64le:Linux:*:*)\n\techo powerpc64le-unknown-linux-${LIBC}\n\texit ;;\n    ppcle:Linux:*:*)\n\techo powerpcle-unknown-linux-${LIBC}\n\texit ;;\n    s390:Linux:*:* | s390x:Linux:*:*)\n\techo ${UNAME_MACHINE}-ibm-linux-${LIBC}\n\texit ;;\n    sh64*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    sh*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    sparc:Linux:*:* | sparc64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    tile*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    vax:Linux:*:*)\n\techo ${UNAME_MACHINE}-dec-linux-${LIBC}\n\texit ;;\n    x86_64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    xtensa*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    i*86:DYNIX/ptx:4*:*)\n\t# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.\n\t# earlier versions are messed up and put the nodename in both\n\t# sysname and nodename.\n\techo i386-sequent-sysv4\n\texit ;;\n    i*86:UNIX_SV:4.2MP:2.*)\n\t# Unixware is an offshoot of SVR4, but it has its own version\n\t# number series starting with 2...\n\t# I am not positive that other SVR4 systems won't match this,\n\t# I just have to hope.  -- rms.\n\t# Use sysv4.2uw... so that sysv4* matches it.\n\techo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}\n\texit ;;\n    i*86:OS/2:*:*)\n\t# If we were able to find `uname', then EMX Unix compatibility\n\t# is probably installed.\n\techo ${UNAME_MACHINE}-pc-os2-emx\n\texit ;;\n    i*86:XTS-300:*:STOP)\n\techo ${UNAME_MACHINE}-unknown-stop\n\texit ;;\n    i*86:atheos:*:*)\n\techo ${UNAME_MACHINE}-unknown-atheos\n\texit ;;\n    i*86:syllable:*:*)\n\techo ${UNAME_MACHINE}-pc-syllable\n\texit ;;\n    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)\n\techo i386-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    i*86:*DOS:*:*)\n\techo ${UNAME_MACHINE}-pc-msdosdjgpp\n\texit ;;\n    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)\n\tUNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\\/MP$//'`\n\tif grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then\n\t\techo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}\n\tfi\n\texit ;;\n    i*86:*:5:[678]*)\n\t# UnixWare 7.x, OpenUNIX and OpenServer 6.\n\tcase `/bin/uname -X | grep \"^Machine\"` in\n\t    *486*)\t     UNAME_MACHINE=i486 ;;\n\t    *Pentium)\t     UNAME_MACHINE=i586 ;;\n\t    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;\n\tesac\n\techo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}\n\texit ;;\n    i*86:*:3.2:*)\n\tif test -f /usr/options/cb.name; then\n\t\tUNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`\n\t\techo ${UNAME_MACHINE}-pc-isc$UNAME_REL\n\telif /bin/uname -X 2>/dev/null >/dev/null ; then\n\t\tUNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`\n\t\t(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486\n\t\t(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i586\n\t\t(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\t(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\techo ${UNAME_MACHINE}-pc-sco$UNAME_REL\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv32\n\tfi\n\texit ;;\n    pc:*:*:*)\n\t# Left here for compatibility:\n\t# uname -m prints for DJGPP always 'pc', but it prints nothing about\n\t# the processor, so we play safe by assuming i586.\n\t# Note: whatever this is, it MUST be the same as what config.sub\n\t# prints for the \"djgpp\" host, or else GDB configury will decide that\n\t# this is a cross-build.\n\techo i586-pc-msdosdjgpp\n\texit ;;\n    Intel:Mach:3*:*)\n\techo i386-pc-mach3\n\texit ;;\n    paragon:*:*:*)\n\techo i860-intel-osf1\n\texit ;;\n    i860:*:4.*:*) # i860-SVR4\n\tif grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then\n\t  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4\n\telse # Add other i860-SVR4 vendors below as they are discovered.\n\t  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4\n\tfi\n\texit ;;\n    mini*:CTIX:SYS*5:*)\n\t# \"miniframe\"\n\techo m68010-convergent-sysv\n\texit ;;\n    mc68k:UNIX:SYSTEM5:3.51m)\n\techo m68k-convergent-sysv\n\texit ;;\n    M680?0:D-NIX:5.3:*)\n\techo m68k-diab-dnix\n\texit ;;\n    M68*:*:R3V[5678]*:*)\n\ttest -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;\n    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)\n\tOS_REL=''\n\ttest -r /etc/.relid \\\n\t&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;\n    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t  && { echo i486-ncr-sysv4; exit; } ;;\n    NCR*:*:4.2:* | MPRAS*:*:4.2:*)\n\tOS_REL='.3'\n\ttest -r /etc/.relid \\\n\t    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \\\n\t    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;\n    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)\n\techo m68k-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    mc68030:UNIX_System_V:4.*:*)\n\techo m68k-atari-sysv4\n\texit ;;\n    TSUNAMI:LynxOS:2.*:*)\n\techo sparc-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    rs6000:LynxOS:2.*:*)\n\techo rs6000-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)\n\techo powerpc-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    SM[BE]S:UNIX_SV:*:*)\n\techo mips-dde-sysv${UNAME_RELEASE}\n\texit ;;\n    RM*:ReliantUNIX-*:*:*)\n\techo mips-sni-sysv4\n\texit ;;\n    RM*:SINIX-*:*:*)\n\techo mips-sni-sysv4\n\texit ;;\n    *:SINIX-*:*:*)\n\tif uname -p 2>/dev/null >/dev/null ; then\n\t\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\t\techo ${UNAME_MACHINE}-sni-sysv4\n\telse\n\t\techo ns32k-sni-sysv\n\tfi\n\texit ;;\n    PENTIUM:*:4.0*:*)\t# Unisys `ClearPath HMP IX 4000' SVR4/MP effort\n\t\t\t# says <Richard.M.Bartel@ccMail.Census.GOV>\n\techo i586-unisys-sysv4\n\texit ;;\n    *:UNIX_System_V:4*:FTX*)\n\t# From Gerald Hewes <hewes@openmarket.com>.\n\t# How about differentiating between stratus architectures? -djm\n\techo hppa1.1-stratus-sysv4\n\texit ;;\n    *:*:*:FTX*)\n\t# From seanf@swdc.stratus.com.\n\techo i860-stratus-sysv4\n\texit ;;\n    i*86:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\techo ${UNAME_MACHINE}-stratus-vos\n\texit ;;\n    *:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\techo hppa1.1-stratus-vos\n\texit ;;\n    mc68*:A/UX:*:*)\n\techo m68k-apple-aux${UNAME_RELEASE}\n\texit ;;\n    news*:NEWS-OS:6*:*)\n\techo mips-sony-newsos6\n\texit ;;\n    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)\n\tif [ -d /usr/nec ]; then\n\t\techo mips-nec-sysv${UNAME_RELEASE}\n\telse\n\t\techo mips-unknown-sysv${UNAME_RELEASE}\n\tfi\n\texit ;;\n    BeBox:BeOS:*:*)\t# BeOS running on hardware made by Be, PPC only.\n\techo powerpc-be-beos\n\texit ;;\n    BeMac:BeOS:*:*)\t# BeOS running on Mac or Mac clone, PPC only.\n\techo powerpc-apple-beos\n\texit ;;\n    BePC:BeOS:*:*)\t# BeOS running on Intel PC compatible.\n\techo i586-pc-beos\n\texit ;;\n    BePC:Haiku:*:*)\t# Haiku running on Intel PC compatible.\n\techo i586-pc-haiku\n\texit ;;\n    x86_64:Haiku:*:*)\n\techo x86_64-unknown-haiku\n\texit ;;\n    SX-4:SUPER-UX:*:*)\n\techo sx4-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-5:SUPER-UX:*:*)\n\techo sx5-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-6:SUPER-UX:*:*)\n\techo sx6-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-7:SUPER-UX:*:*)\n\techo sx7-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-8:SUPER-UX:*:*)\n\techo sx8-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-8R:SUPER-UX:*:*)\n\techo sx8r-nec-superux${UNAME_RELEASE}\n\texit ;;\n    Power*:Rhapsody:*:*)\n\techo powerpc-apple-rhapsody${UNAME_RELEASE}\n\texit ;;\n    *:Rhapsody:*:*)\n\techo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}\n\texit ;;\n    *:Darwin:*:*)\n\tUNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown\n\teval $set_cc_for_build\n\tif test \"$UNAME_PROCESSOR\" = unknown ; then\n\t    UNAME_PROCESSOR=powerpc\n\tfi\n\tif [ \"$CC_FOR_BUILD\" != 'no_compiler_found' ]; then\n\t    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \\\n\t\t(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \\\n\t\tgrep IS_64BIT_ARCH >/dev/null\n\t    then\n\t\tcase $UNAME_PROCESSOR in\n\t\t    i386) UNAME_PROCESSOR=x86_64 ;;\n\t\t    powerpc) UNAME_PROCESSOR=powerpc64 ;;\n\t\tesac\n\t    fi\n\tfi\n\techo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}\n\texit ;;\n    *:procnto*:*:* | *:QNX:[0123456789]*:*)\n\tUNAME_PROCESSOR=`uname -p`\n\tif test \"$UNAME_PROCESSOR\" = \"x86\"; then\n\t\tUNAME_PROCESSOR=i386\n\t\tUNAME_MACHINE=pc\n\tfi\n\techo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}\n\texit ;;\n    *:QNX:*:4*)\n\techo i386-pc-qnx\n\texit ;;\n    NEO-?:NONSTOP_KERNEL:*:*)\n\techo neo-tandem-nsk${UNAME_RELEASE}\n\texit ;;\n    NSE-*:NONSTOP_KERNEL:*:*)\n\techo nse-tandem-nsk${UNAME_RELEASE}\n\texit ;;\n    NSR-?:NONSTOP_KERNEL:*:*)\n\techo nsr-tandem-nsk${UNAME_RELEASE}\n\texit ;;\n    *:NonStop-UX:*:*)\n\techo mips-compaq-nonstopux\n\texit ;;\n    BS2000:POSIX*:*:*)\n\techo bs2000-siemens-sysv\n\texit ;;\n    DS/*:UNIX_System_V:*:*)\n\techo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}\n\texit ;;\n    *:Plan9:*:*)\n\t# \"uname -m\" is not consistent, so use $cputype instead. 386\n\t# is converted to i386 for consistency with other x86\n\t# operating systems.\n\tif test \"$cputype\" = \"386\"; then\n\t    UNAME_MACHINE=i386\n\telse\n\t    UNAME_MACHINE=\"$cputype\"\n\tfi\n\techo ${UNAME_MACHINE}-unknown-plan9\n\texit ;;\n    *:TOPS-10:*:*)\n\techo pdp10-unknown-tops10\n\texit ;;\n    *:TENEX:*:*)\n\techo pdp10-unknown-tenex\n\texit ;;\n    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)\n\techo pdp10-dec-tops20\n\texit ;;\n    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)\n\techo pdp10-xkl-tops20\n\texit ;;\n    *:TOPS-20:*:*)\n\techo pdp10-unknown-tops20\n\texit ;;\n    *:ITS:*:*)\n\techo pdp10-unknown-its\n\texit ;;\n    SEI:*:*:SEIUX)\n\techo mips-sei-seiux${UNAME_RELEASE}\n\texit ;;\n    *:DragonFly:*:*)\n\techo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`\n\texit ;;\n    *:*VMS:*:*)\n\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\tcase \"${UNAME_MACHINE}\" in\n\t    A*) echo alpha-dec-vms ; exit ;;\n\t    I*) echo ia64-dec-vms ; exit ;;\n\t    V*) echo vax-dec-vms ; exit ;;\n\tesac ;;\n    *:XENIX:*:SysV)\n\techo i386-pc-xenix\n\texit ;;\n    i*86:skyos:*:*)\n\techo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'\n\texit ;;\n    i*86:rdos:*:*)\n\techo ${UNAME_MACHINE}-pc-rdos\n\texit ;;\n    i*86:AROS:*:*)\n\techo ${UNAME_MACHINE}-pc-aros\n\texit ;;\n    x86_64:VMkernel:*:*)\n\techo ${UNAME_MACHINE}-unknown-esx\n\texit ;;\nesac\n\neval $set_cc_for_build\ncat >$dummy.c <<EOF\n#ifdef _SEQUENT_\n# include <sys/types.h>\n# include <sys/utsname.h>\n#endif\nmain ()\n{\n#if defined (sony)\n#if defined (MIPSEB)\n  /* BFD wants \"bsd\" instead of \"newsos\".  Perhaps BFD should be changed,\n     I don't know....  */\n  printf (\"mips-sony-bsd\\n\"); exit (0);\n#else\n#include <sys/param.h>\n  printf (\"m68k-sony-newsos%s\\n\",\n#ifdef NEWSOS4\n\t\"4\"\n#else\n\t\"\"\n#endif\n\t); exit (0);\n#endif\n#endif\n\n#if defined (__arm) && defined (__acorn) && defined (__unix)\n  printf (\"arm-acorn-riscix\\n\"); exit (0);\n#endif\n\n#if defined (hp300) && !defined (hpux)\n  printf (\"m68k-hp-bsd\\n\"); exit (0);\n#endif\n\n#if defined (NeXT)\n#if !defined (__ARCHITECTURE__)\n#define __ARCHITECTURE__ \"m68k\"\n#endif\n  int version;\n  version=`(hostinfo | sed -n 's/.*NeXT Mach \\([0-9]*\\).*/\\1/p') 2>/dev/null`;\n  if (version < 4)\n    printf (\"%s-next-nextstep%d\\n\", __ARCHITECTURE__, version);\n  else\n    printf (\"%s-next-openstep%d\\n\", __ARCHITECTURE__, version);\n  exit (0);\n#endif\n\n#if defined (MULTIMAX) || defined (n16)\n#if defined (UMAXV)\n  printf (\"ns32k-encore-sysv\\n\"); exit (0);\n#else\n#if defined (CMU)\n  printf (\"ns32k-encore-mach\\n\"); exit (0);\n#else\n  printf (\"ns32k-encore-bsd\\n\"); exit (0);\n#endif\n#endif\n#endif\n\n#if defined (__386BSD__)\n  printf (\"i386-pc-bsd\\n\"); exit (0);\n#endif\n\n#if defined (sequent)\n#if defined (i386)\n  printf (\"i386-sequent-dynix\\n\"); exit (0);\n#endif\n#if defined (ns32000)\n  printf (\"ns32k-sequent-dynix\\n\"); exit (0);\n#endif\n#endif\n\n#if defined (_SEQUENT_)\n    struct utsname un;\n\n    uname(&un);\n\n    if (strncmp(un.version, \"V2\", 2) == 0) {\n\tprintf (\"i386-sequent-ptx2\\n\"); exit (0);\n    }\n    if (strncmp(un.version, \"V1\", 2) == 0) { /* XXX is V1 correct? */\n\tprintf (\"i386-sequent-ptx1\\n\"); exit (0);\n    }\n    printf (\"i386-sequent-ptx\\n\"); exit (0);\n\n#endif\n\n#if defined (vax)\n# if !defined (ultrix)\n#  include <sys/param.h>\n#  if defined (BSD)\n#   if BSD == 43\n      printf (\"vax-dec-bsd4.3\\n\"); exit (0);\n#   else\n#    if BSD == 199006\n      printf (\"vax-dec-bsd4.3reno\\n\"); exit (0);\n#    else\n      printf (\"vax-dec-bsd\\n\"); exit (0);\n#    endif\n#   endif\n#  else\n    printf (\"vax-dec-bsd\\n\"); exit (0);\n#  endif\n# else\n    printf (\"vax-dec-ultrix\\n\"); exit (0);\n# endif\n#endif\n\n#if defined (alliant) && defined (i860)\n  printf (\"i860-alliant-bsd\\n\"); exit (0);\n#endif\n\n  exit (1);\n}\nEOF\n\n$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&\n\t{ echo \"$SYSTEM_NAME\"; exit; }\n\n# Apollos put the system type in the environment.\n\ntest -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }\n\n# Convex versions that predate uname can use getsysinfo(1)\n\nif [ -x /usr/convex/getsysinfo ]\nthen\n    case `getsysinfo -f cpu_type` in\n    c1*)\n\techo c1-convex-bsd\n\texit ;;\n    c2*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n\texit ;;\n    c34*)\n\techo c34-convex-bsd\n\texit ;;\n    c38*)\n\techo c38-convex-bsd\n\texit ;;\n    c4*)\n\techo c4-convex-bsd\n\texit ;;\n    esac\nfi\n\ncat >&2 <<EOF\n$0: unable to guess system type\n\nThis script, last modified $timestamp, has failed to recognize\nthe operating system you are using. It is advised that you\ndownload the most up to date version of the config scripts from\n\n  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD\nand\n  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD\n\nIf the version you run ($0) is already up to date, please\nsend the following data and any information you think might be\npertinent to <config-patches@gnu.org> in order to provide the needed\ninformation to handle your system.\n\nconfig.guess timestamp = $timestamp\n\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`\n\nhostinfo               = `(hostinfo) 2>/dev/null`\n/bin/universe          = `(/bin/universe) 2>/dev/null`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`\n/bin/arch              = `(/bin/arch) 2>/dev/null`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`\n\nUNAME_MACHINE = ${UNAME_MACHINE}\nUNAME_RELEASE = ${UNAME_RELEASE}\nUNAME_SYSTEM  = ${UNAME_SYSTEM}\nUNAME_VERSION = ${UNAME_VERSION}\nEOF\n\nexit 1\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/auto/config.rpath",
    "content": ""
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/auto/config.sub",
    "content": "#! /bin/sh\n# Configuration validation subroutine script.\n#   Copyright 1992-2013 Free Software Foundation, Inc.\n\ntimestamp='2013-08-10'\n\n# This file is free software; you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, see <http://www.gnu.org/licenses/>.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that\n# program.  This Exception is an additional permission under section 7\n# of the GNU General Public License, version 3 (\"GPLv3\").\n\n\n# Please send patches with a ChangeLog entry to config-patches@gnu.org.\n#\n# Configuration subroutine to validate and canonicalize a configuration type.\n# Supply the specified configuration type as an argument.\n# If it is invalid, we print an error message on stderr and exit with code 1.\n# Otherwise, we print the canonical config type on stdout and succeed.\n\n# You can get the latest version of this script from:\n# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD\n\n# This file is supposed to be the same for all GNU packages\n# and recognize all the CPU types, system types and aliases\n# that are meaningful with *any* GNU software.\n# Each package is responsible for reporting which valid configurations\n# it does not support.  The user should be able to distinguish\n# a failure to support a valid configuration from a meaningless\n# configuration.\n\n# The goal of this file is to map all the various variations of a given\n# machine specification into a single specification in the form:\n#\tCPU_TYPE-MANUFACTURER-OPERATING_SYSTEM\n# or in some cases, the newer four-part form:\n#\tCPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM\n# It is wrong to echo any other type of specification.\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION] CPU-MFR-OPSYS\n       $0 [OPTION] ALIAS\n\nCanonicalize a configuration name.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.sub ($timestamp)\n\nCopyright 1992-2013 Free Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit ;;\n    --version | -v )\n       echo \"$version\" ; exit ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\"\n       exit 1 ;;\n\n    *local*)\n       # First pass through any local machine types.\n       echo $1\n       exit ;;\n\n    * )\n       break ;;\n  esac\ndone\n\ncase $# in\n 0) echo \"$me: missing argument$help\" >&2\n    exit 1;;\n 1) ;;\n *) echo \"$me: too many arguments$help\" >&2\n    exit 1;;\nesac\n\n# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).\n# Here we must recognize all the valid KERNEL-OS combinations.\nmaybe_os=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\2/'`\ncase $maybe_os in\n  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \\\n  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \\\n  knetbsd*-gnu* | netbsd*-gnu* | \\\n  kopensolaris*-gnu* | \\\n  storm-chaos* | os2-emx* | rtmk-nova*)\n    os=-$maybe_os\n    basic_machine=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\1/'`\n    ;;\n  android-linux)\n    os=-linux-android\n    basic_machine=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\1/'`-unknown\n    ;;\n  *)\n    basic_machine=`echo $1 | sed 's/-[^-]*$//'`\n    if [ $basic_machine != $1 ]\n    then os=`echo $1 | sed 's/.*-/-/'`\n    else os=; fi\n    ;;\nesac\n\n### Let's recognize common machines as not being operating systems so\n### that things like config.sub decstation-3100 work.  We also\n### recognize some manufacturers as not being operating systems, so we\n### can provide default operating systems below.\ncase $os in\n\t-sun*os*)\n\t\t# Prevent following clause from handling this invalid input.\n\t\t;;\n\t-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \\\n\t-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \\\n\t-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \\\n\t-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\\\n\t-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \\\n\t-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \\\n\t-apple | -axis | -knuth | -cray | -microblaze*)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-bluegene*)\n\t\tos=-cnk\n\t\t;;\n\t-sim | -cisco | -oki | -wec | -winbond)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-scout)\n\t\t;;\n\t-wrs)\n\t\tos=-vxworks\n\t\tbasic_machine=$1\n\t\t;;\n\t-chorusos*)\n\t\tos=-chorusos\n\t\tbasic_machine=$1\n\t\t;;\n\t-chorusrdb)\n\t\tos=-chorusrdb\n\t\tbasic_machine=$1\n\t\t;;\n\t-hiux*)\n\t\tos=-hiuxwe2\n\t\t;;\n\t-sco6)\n\t\tos=-sco5v6\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco5)\n\t\tos=-sco3.2v5\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco4)\n\t\tos=-sco3.2v4\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2.[4-9]*)\n\t\tos=`echo $os | sed -e 's/sco3.2./sco3.2v/'`\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2v[4-9]*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco5v6*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco*)\n\t\tos=-sco3.2v2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-udk*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-isc)\n\t\tos=-isc2.2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-clix*)\n\t\tbasic_machine=clipper-intergraph\n\t\t;;\n\t-isc*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-lynx*178)\n\t\tos=-lynxos178\n\t\t;;\n\t-lynx*5)\n\t\tos=-lynxos5\n\t\t;;\n\t-lynx*)\n\t\tos=-lynxos\n\t\t;;\n\t-ptx*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`\n\t\t;;\n\t-windowsnt*)\n\t\tos=`echo $os | sed -e 's/windowsnt/winnt/'`\n\t\t;;\n\t-psos*)\n\t\tos=-psos\n\t\t;;\n\t-mint | -mint[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\nesac\n\n# Decode aliases for certain CPU-COMPANY combinations.\ncase $basic_machine in\n\t# Recognize the basic CPU types without company name.\n\t# Some are omitted here because they have special meanings below.\n\t1750a | 580 \\\n\t| a29k \\\n\t| aarch64 | aarch64_be \\\n\t| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \\\n\t| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \\\n\t| am33_2.0 \\\n\t| arc | arceb \\\n\t| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \\\n\t| avr | avr32 \\\n\t| be32 | be64 \\\n\t| bfin \\\n\t| c4x | c8051 | clipper \\\n\t| d10v | d30v | dlx | dsp16xx \\\n\t| epiphany \\\n\t| fido | fr30 | frv \\\n\t| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \\\n\t| hexagon \\\n\t| i370 | i860 | i960 | ia64 \\\n\t| ip2k | iq2000 \\\n\t| le32 | le64 \\\n\t| lm32 \\\n\t| m32c | m32r | m32rle | m68000 | m68k | m88k \\\n\t| maxq | mb | microblaze | microblazeel | mcore | mep | metag \\\n\t| mips | mipsbe | mipseb | mipsel | mipsle \\\n\t| mips16 \\\n\t| mips64 | mips64el \\\n\t| mips64octeon | mips64octeonel \\\n\t| mips64orion | mips64orionel \\\n\t| mips64r5900 | mips64r5900el \\\n\t| mips64vr | mips64vrel \\\n\t| mips64vr4100 | mips64vr4100el \\\n\t| mips64vr4300 | mips64vr4300el \\\n\t| mips64vr5000 | mips64vr5000el \\\n\t| mips64vr5900 | mips64vr5900el \\\n\t| mipsisa32 | mipsisa32el \\\n\t| mipsisa32r2 | mipsisa32r2el \\\n\t| mipsisa64 | mipsisa64el \\\n\t| mipsisa64r2 | mipsisa64r2el \\\n\t| mipsisa64sb1 | mipsisa64sb1el \\\n\t| mipsisa64sr71k | mipsisa64sr71kel \\\n\t| mipsr5900 | mipsr5900el \\\n\t| mipstx39 | mipstx39el \\\n\t| mn10200 | mn10300 \\\n\t| moxie \\\n\t| mt \\\n\t| msp430 \\\n\t| nds32 | nds32le | nds32be \\\n\t| nios | nios2 | nios2eb | nios2el \\\n\t| ns16k | ns32k \\\n\t| open8 \\\n\t| or1k | or32 \\\n\t| pdp10 | pdp11 | pj | pjl \\\n\t| powerpc | powerpc64 | powerpc64le | powerpcle \\\n\t| pyramid \\\n\t| rl78 | rx \\\n\t| score \\\n\t| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \\\n\t| sh64 | sh64le \\\n\t| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \\\n\t| sparcv8 | sparcv9 | sparcv9b | sparcv9v \\\n\t| spu \\\n\t| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \\\n\t| ubicom32 \\\n\t| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \\\n\t| we32k \\\n\t| x86 | xc16x | xstormy16 | xtensa \\\n\t| z8k | z80)\n\t\tbasic_machine=$basic_machine-unknown\n\t\t;;\n\tc54x)\n\t\tbasic_machine=tic54x-unknown\n\t\t;;\n\tc55x)\n\t\tbasic_machine=tic55x-unknown\n\t\t;;\n\tc6x)\n\t\tbasic_machine=tic6x-unknown\n\t\t;;\n\tm6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-none\n\t\t;;\n\tm88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)\n\t\t;;\n\tms1)\n\t\tbasic_machine=mt-unknown\n\t\t;;\n\n\tstrongarm | thumb | xscale)\n\t\tbasic_machine=arm-unknown\n\t\t;;\n\txgate)\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-none\n\t\t;;\n\txscaleeb)\n\t\tbasic_machine=armeb-unknown\n\t\t;;\n\n\txscaleel)\n\t\tbasic_machine=armel-unknown\n\t\t;;\n\n\t# We use `pc' rather than `unknown'\n\t# because (1) that's what they normally are, and\n\t# (2) the word \"unknown\" tends to confuse beginning users.\n\ti*86 | x86_64)\n\t  basic_machine=$basic_machine-pc\n\t  ;;\n\t# Object if more than one company name word.\n\t*-*-*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\n\t# Recognize the basic CPU types with company name.\n\t580-* \\\n\t| a29k-* \\\n\t| aarch64-* | aarch64_be-* \\\n\t| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \\\n\t| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \\\n\t| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \\\n\t| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \\\n\t| avr-* | avr32-* \\\n\t| be32-* | be64-* \\\n\t| bfin-* | bs2000-* \\\n\t| c[123]* | c30-* | [cjt]90-* | c4x-* \\\n\t| c8051-* | clipper-* | craynv-* | cydra-* \\\n\t| d10v-* | d30v-* | dlx-* \\\n\t| elxsi-* \\\n\t| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \\\n\t| h8300-* | h8500-* \\\n\t| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \\\n\t| hexagon-* \\\n\t| i*86-* | i860-* | i960-* | ia64-* \\\n\t| ip2k-* | iq2000-* \\\n\t| le32-* | le64-* \\\n\t| lm32-* \\\n\t| m32c-* | m32r-* | m32rle-* \\\n\t| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \\\n\t| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \\\n\t| microblaze-* | microblazeel-* \\\n\t| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \\\n\t| mips16-* \\\n\t| mips64-* | mips64el-* \\\n\t| mips64octeon-* | mips64octeonel-* \\\n\t| mips64orion-* | mips64orionel-* \\\n\t| mips64r5900-* | mips64r5900el-* \\\n\t| mips64vr-* | mips64vrel-* \\\n\t| mips64vr4100-* | mips64vr4100el-* \\\n\t| mips64vr4300-* | mips64vr4300el-* \\\n\t| mips64vr5000-* | mips64vr5000el-* \\\n\t| mips64vr5900-* | mips64vr5900el-* \\\n\t| mipsisa32-* | mipsisa32el-* \\\n\t| mipsisa32r2-* | mipsisa32r2el-* \\\n\t| mipsisa64-* | mipsisa64el-* \\\n\t| mipsisa64r2-* | mipsisa64r2el-* \\\n\t| mipsisa64sb1-* | mipsisa64sb1el-* \\\n\t| mipsisa64sr71k-* | mipsisa64sr71kel-* \\\n\t| mipsr5900-* | mipsr5900el-* \\\n\t| mipstx39-* | mipstx39el-* \\\n\t| mmix-* \\\n\t| mt-* \\\n\t| msp430-* \\\n\t| nds32-* | nds32le-* | nds32be-* \\\n\t| nios-* | nios2-* | nios2eb-* | nios2el-* \\\n\t| none-* | np1-* | ns16k-* | ns32k-* \\\n\t| open8-* \\\n\t| orion-* \\\n\t| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \\\n\t| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \\\n\t| pyramid-* \\\n\t| rl78-* | romp-* | rs6000-* | rx-* \\\n\t| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \\\n\t| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \\\n\t| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \\\n\t| sparclite-* \\\n\t| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \\\n\t| tahoe-* \\\n\t| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \\\n\t| tile*-* \\\n\t| tron-* \\\n\t| ubicom32-* \\\n\t| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \\\n\t| vax-* \\\n\t| we32k-* \\\n\t| x86-* | x86_64-* | xc16x-* | xps100-* \\\n\t| xstormy16-* | xtensa*-* \\\n\t| ymp-* \\\n\t| z8k-* | z80-*)\n\t\t;;\n\t# Recognize the basic CPU types without company name, with glob match.\n\txtensa*)\n\t\tbasic_machine=$basic_machine-unknown\n\t\t;;\n\t# Recognize the various machine names and aliases which stand\n\t# for a CPU type and a company and sometimes even an OS.\n\t386bsd)\n\t\tbasic_machine=i386-unknown\n\t\tos=-bsd\n\t\t;;\n\t3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)\n\t\tbasic_machine=m68000-att\n\t\t;;\n\t3b*)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\ta29khif)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tabacus)\n\t\tbasic_machine=abacus-unknown\n\t\t;;\n\tadobe68k)\n\t\tbasic_machine=m68010-adobe\n\t\tos=-scout\n\t\t;;\n\talliant | fx80)\n\t\tbasic_machine=fx80-alliant\n\t\t;;\n\taltos | altos3068)\n\t\tbasic_machine=m68k-altos\n\t\t;;\n\tam29k)\n\t\tbasic_machine=a29k-none\n\t\tos=-bsd\n\t\t;;\n\tamd64)\n\t\tbasic_machine=x86_64-pc\n\t\t;;\n\tamd64-*)\n\t\tbasic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tamdahl)\n\t\tbasic_machine=580-amdahl\n\t\tos=-sysv\n\t\t;;\n\tamiga | amiga-*)\n\t\tbasic_machine=m68k-unknown\n\t\t;;\n\tamigaos | amigados)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-amigaos\n\t\t;;\n\tamigaunix | amix)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-sysv4\n\t\t;;\n\tapollo68)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-sysv\n\t\t;;\n\tapollo68bsd)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-bsd\n\t\t;;\n\taros)\n\t\tbasic_machine=i386-pc\n\t\tos=-aros\n\t\t;;\n\taux)\n\t\tbasic_machine=m68k-apple\n\t\tos=-aux\n\t\t;;\n\tbalance)\n\t\tbasic_machine=ns32k-sequent\n\t\tos=-dynix\n\t\t;;\n\tblackfin)\n\t\tbasic_machine=bfin-unknown\n\t\tos=-linux\n\t\t;;\n\tblackfin-*)\n\t\tbasic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tbluegene*)\n\t\tbasic_machine=powerpc-ibm\n\t\tos=-cnk\n\t\t;;\n\tc54x-*)\n\t\tbasic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tc55x-*)\n\t\tbasic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tc6x-*)\n\t\tbasic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tc90)\n\t\tbasic_machine=c90-cray\n\t\tos=-unicos\n\t\t;;\n\tcegcc)\n\t\tbasic_machine=arm-unknown\n\t\tos=-cegcc\n\t\t;;\n\tconvex-c1)\n\t\tbasic_machine=c1-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c2)\n\t\tbasic_machine=c2-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c32)\n\t\tbasic_machine=c32-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c34)\n\t\tbasic_machine=c34-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c38)\n\t\tbasic_machine=c38-convex\n\t\tos=-bsd\n\t\t;;\n\tcray | j90)\n\t\tbasic_machine=j90-cray\n\t\tos=-unicos\n\t\t;;\n\tcraynv)\n\t\tbasic_machine=craynv-cray\n\t\tos=-unicosmp\n\t\t;;\n\tcr16 | cr16-*)\n\t\tbasic_machine=cr16-unknown\n\t\tos=-elf\n\t\t;;\n\tcrds | unos)\n\t\tbasic_machine=m68k-crds\n\t\t;;\n\tcrisv32 | crisv32-* | etraxfs*)\n\t\tbasic_machine=crisv32-axis\n\t\t;;\n\tcris | cris-* | etrax*)\n\t\tbasic_machine=cris-axis\n\t\t;;\n\tcrx)\n\t\tbasic_machine=crx-unknown\n\t\tos=-elf\n\t\t;;\n\tda30 | da30-*)\n\t\tbasic_machine=m68k-da30\n\t\t;;\n\tdecstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)\n\t\tbasic_machine=mips-dec\n\t\t;;\n\tdecsystem10* | dec10*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops10\n\t\t;;\n\tdecsystem20* | dec20*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops20\n\t\t;;\n\tdelta | 3300 | motorola-3300 | motorola-delta \\\n\t      | 3300-motorola | delta-motorola)\n\t\tbasic_machine=m68k-motorola\n\t\t;;\n\tdelta88)\n\t\tbasic_machine=m88k-motorola\n\t\tos=-sysv3\n\t\t;;\n\tdicos)\n\t\tbasic_machine=i686-pc\n\t\tos=-dicos\n\t\t;;\n\tdjgpp)\n\t\tbasic_machine=i586-pc\n\t\tos=-msdosdjgpp\n\t\t;;\n\tdpx20 | dpx20-*)\n\t\tbasic_machine=rs6000-bull\n\t\tos=-bosx\n\t\t;;\n\tdpx2* | dpx2*-bull)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv3\n\t\t;;\n\tebmon29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-ebmon\n\t\t;;\n\telxsi)\n\t\tbasic_machine=elxsi-elxsi\n\t\tos=-bsd\n\t\t;;\n\tencore | umax | mmax)\n\t\tbasic_machine=ns32k-encore\n\t\t;;\n\tes1800 | OSE68k | ose68k | ose | OSE)\n\t\tbasic_machine=m68k-ericsson\n\t\tos=-ose\n\t\t;;\n\tfx2800)\n\t\tbasic_machine=i860-alliant\n\t\t;;\n\tgenix)\n\t\tbasic_machine=ns32k-ns\n\t\t;;\n\tgmicro)\n\t\tbasic_machine=tron-gmicro\n\t\tos=-sysv\n\t\t;;\n\tgo32)\n\t\tbasic_machine=i386-pc\n\t\tos=-go32\n\t\t;;\n\th3050r* | hiux*)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\th8300hms)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-hms\n\t\t;;\n\th8300xray)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-xray\n\t\t;;\n\th8500hms)\n\t\tbasic_machine=h8500-hitachi\n\t\tos=-hms\n\t\t;;\n\tharris)\n\t\tbasic_machine=m88k-harris\n\t\tos=-sysv3\n\t\t;;\n\thp300-*)\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp300bsd)\n\t\tbasic_machine=m68k-hp\n\t\tos=-bsd\n\t\t;;\n\thp300hpux)\n\t\tbasic_machine=m68k-hp\n\t\tos=-hpux\n\t\t;;\n\thp3k9[0-9][0-9] | hp9[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k2[0-9][0-9] | hp9k31[0-9])\n\t\tbasic_machine=m68000-hp\n\t\t;;\n\thp9k3[2-9][0-9])\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp9k6[0-9][0-9] | hp6[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k7[0-79][0-9] | hp7[0-79][0-9])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k78[0-9] | hp78[0-9])\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][13679] | hp8[0-9][13679])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][0-9] | hp8[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thppa-next)\n\t\tos=-nextstep3\n\t\t;;\n\thppaosf)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-osf\n\t\t;;\n\thppro)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-proelf\n\t\t;;\n\ti370-ibm* | ibm*)\n\t\tbasic_machine=i370-ibm\n\t\t;;\n\ti*86v32)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv32\n\t\t;;\n\ti*86v4*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv4\n\t\t;;\n\ti*86v)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv\n\t\t;;\n\ti*86sol2)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-solaris2\n\t\t;;\n\ti386mach)\n\t\tbasic_machine=i386-mach\n\t\tos=-mach\n\t\t;;\n\ti386-vsta | vsta)\n\t\tbasic_machine=i386-unknown\n\t\tos=-vsta\n\t\t;;\n\tiris | iris4d)\n\t\tbasic_machine=mips-sgi\n\t\tcase $os in\n\t\t    -irix*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-irix4\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tisi68 | isi)\n\t\tbasic_machine=m68k-isi\n\t\tos=-sysv\n\t\t;;\n\tm68knommu)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-linux\n\t\t;;\n\tm68knommu-*)\n\t\tbasic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tm88k-omron*)\n\t\tbasic_machine=m88k-omron\n\t\t;;\n\tmagnum | m3230)\n\t\tbasic_machine=mips-mips\n\t\tos=-sysv\n\t\t;;\n\tmerlin)\n\t\tbasic_machine=ns32k-utek\n\t\tos=-sysv\n\t\t;;\n\tmicroblaze*)\n\t\tbasic_machine=microblaze-xilinx\n\t\t;;\n\tmingw64)\n\t\tbasic_machine=x86_64-pc\n\t\tos=-mingw64\n\t\t;;\n\tmingw32)\n\t\tbasic_machine=i686-pc\n\t\tos=-mingw32\n\t\t;;\n\tmingw32ce)\n\t\tbasic_machine=arm-unknown\n\t\tos=-mingw32ce\n\t\t;;\n\tminiframe)\n\t\tbasic_machine=m68000-convergent\n\t\t;;\n\t*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\n\tmips3*-*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`\n\t\t;;\n\tmips3*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown\n\t\t;;\n\tmonitor)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\tmorphos)\n\t\tbasic_machine=powerpc-unknown\n\t\tos=-morphos\n\t\t;;\n\tmsdos)\n\t\tbasic_machine=i386-pc\n\t\tos=-msdos\n\t\t;;\n\tms1-*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`\n\t\t;;\n\tmsys)\n\t\tbasic_machine=i686-pc\n\t\tos=-msys\n\t\t;;\n\tmvs)\n\t\tbasic_machine=i370-ibm\n\t\tos=-mvs\n\t\t;;\n\tnacl)\n\t\tbasic_machine=le32-unknown\n\t\tos=-nacl\n\t\t;;\n\tncr3000)\n\t\tbasic_machine=i486-ncr\n\t\tos=-sysv4\n\t\t;;\n\tnetbsd386)\n\t\tbasic_machine=i386-unknown\n\t\tos=-netbsd\n\t\t;;\n\tnetwinder)\n\t\tbasic_machine=armv4l-rebel\n\t\tos=-linux\n\t\t;;\n\tnews | news700 | news800 | news900)\n\t\tbasic_machine=m68k-sony\n\t\tos=-newsos\n\t\t;;\n\tnews1000)\n\t\tbasic_machine=m68030-sony\n\t\tos=-newsos\n\t\t;;\n\tnews-3600 | risc-news)\n\t\tbasic_machine=mips-sony\n\t\tos=-newsos\n\t\t;;\n\tnecv70)\n\t\tbasic_machine=v70-nec\n\t\tos=-sysv\n\t\t;;\n\tnext | m*-next )\n\t\tbasic_machine=m68k-next\n\t\tcase $os in\n\t\t    -nextstep* )\n\t\t\t;;\n\t\t    -ns2*)\n\t\t      os=-nextstep2\n\t\t\t;;\n\t\t    *)\n\t\t      os=-nextstep3\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tnh3000)\n\t\tbasic_machine=m68k-harris\n\t\tos=-cxux\n\t\t;;\n\tnh[45]000)\n\t\tbasic_machine=m88k-harris\n\t\tos=-cxux\n\t\t;;\n\tnindy960)\n\t\tbasic_machine=i960-intel\n\t\tos=-nindy\n\t\t;;\n\tmon960)\n\t\tbasic_machine=i960-intel\n\t\tos=-mon960\n\t\t;;\n\tnonstopux)\n\t\tbasic_machine=mips-compaq\n\t\tos=-nonstopux\n\t\t;;\n\tnp1)\n\t\tbasic_machine=np1-gould\n\t\t;;\n\tneo-tandem)\n\t\tbasic_machine=neo-tandem\n\t\t;;\n\tnse-tandem)\n\t\tbasic_machine=nse-tandem\n\t\t;;\n\tnsr-tandem)\n\t\tbasic_machine=nsr-tandem\n\t\t;;\n\top50n-* | op60c-*)\n\t\tbasic_machine=hppa1.1-oki\n\t\tos=-proelf\n\t\t;;\n\topenrisc | openrisc-*)\n\t\tbasic_machine=or32-unknown\n\t\t;;\n\tos400)\n\t\tbasic_machine=powerpc-ibm\n\t\tos=-os400\n\t\t;;\n\tOSE68000 | ose68000)\n\t\tbasic_machine=m68000-ericsson\n\t\tos=-ose\n\t\t;;\n\tos68k)\n\t\tbasic_machine=m68k-none\n\t\tos=-os68k\n\t\t;;\n\tpa-hitachi)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\tparagon)\n\t\tbasic_machine=i860-intel\n\t\tos=-osf\n\t\t;;\n\tparisc)\n\t\tbasic_machine=hppa-unknown\n\t\tos=-linux\n\t\t;;\n\tparisc-*)\n\t\tbasic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tpbd)\n\t\tbasic_machine=sparc-tti\n\t\t;;\n\tpbb)\n\t\tbasic_machine=m68k-tti\n\t\t;;\n\tpc532 | pc532-*)\n\t\tbasic_machine=ns32k-pc532\n\t\t;;\n\tpc98)\n\t\tbasic_machine=i386-pc\n\t\t;;\n\tpc98-*)\n\t\tbasic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentium | p5 | k5 | k6 | nexgen | viac3)\n\t\tbasic_machine=i586-pc\n\t\t;;\n\tpentiumpro | p6 | 6x86 | athlon | athlon_*)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentiumii | pentium2 | pentiumiii | pentium3)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentium4)\n\t\tbasic_machine=i786-pc\n\t\t;;\n\tpentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)\n\t\tbasic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumpro-* | p6-* | 6x86-* | athlon-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentium4-*)\n\t\tbasic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpn)\n\t\tbasic_machine=pn-gould\n\t\t;;\n\tpower)\tbasic_machine=power-ibm\n\t\t;;\n\tppc | ppcbe)\tbasic_machine=powerpc-unknown\n\t\t;;\n\tppc-* | ppcbe-*)\n\t\tbasic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppcle | powerpclittle | ppc-le | powerpc-little)\n\t\tbasic_machine=powerpcle-unknown\n\t\t;;\n\tppcle-* | powerpclittle-*)\n\t\tbasic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64)\tbasic_machine=powerpc64-unknown\n\t\t;;\n\tppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64le | powerpc64little | ppc64-le | powerpc64-little)\n\t\tbasic_machine=powerpc64le-unknown\n\t\t;;\n\tppc64le-* | powerpc64little-*)\n\t\tbasic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tps2)\n\t\tbasic_machine=i386-ibm\n\t\t;;\n\tpw32)\n\t\tbasic_machine=i586-unknown\n\t\tos=-pw32\n\t\t;;\n\trdos | rdos64)\n\t\tbasic_machine=x86_64-pc\n\t\tos=-rdos\n\t\t;;\n\trdos32)\n\t\tbasic_machine=i386-pc\n\t\tos=-rdos\n\t\t;;\n\trom68k)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\trm[46]00)\n\t\tbasic_machine=mips-siemens\n\t\t;;\n\trtpc | rtpc-*)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\ts390 | s390-*)\n\t\tbasic_machine=s390-ibm\n\t\t;;\n\ts390x | s390x-*)\n\t\tbasic_machine=s390x-ibm\n\t\t;;\n\tsa29200)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tsb1)\n\t\tbasic_machine=mipsisa64sb1-unknown\n\t\t;;\n\tsb1el)\n\t\tbasic_machine=mipsisa64sb1el-unknown\n\t\t;;\n\tsde)\n\t\tbasic_machine=mipsisa32-sde\n\t\tos=-elf\n\t\t;;\n\tsei)\n\t\tbasic_machine=mips-sei\n\t\tos=-seiux\n\t\t;;\n\tsequent)\n\t\tbasic_machine=i386-sequent\n\t\t;;\n\tsh)\n\t\tbasic_machine=sh-hitachi\n\t\tos=-hms\n\t\t;;\n\tsh5el)\n\t\tbasic_machine=sh5le-unknown\n\t\t;;\n\tsh64)\n\t\tbasic_machine=sh64-unknown\n\t\t;;\n\tsparclite-wrs | simso-wrs)\n\t\tbasic_machine=sparclite-wrs\n\t\tos=-vxworks\n\t\t;;\n\tsps7)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv2\n\t\t;;\n\tspur)\n\t\tbasic_machine=spur-unknown\n\t\t;;\n\tst2000)\n\t\tbasic_machine=m68k-tandem\n\t\t;;\n\tstratus)\n\t\tbasic_machine=i860-stratus\n\t\tos=-sysv4\n\t\t;;\n\tstrongarm-* | thumb-*)\n\t\tbasic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tsun2)\n\t\tbasic_machine=m68000-sun\n\t\t;;\n\tsun2os3)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun2os4)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun3os3)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun3os4)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4os3)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun4os4)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4sol2)\n\t\tbasic_machine=sparc-sun\n\t\tos=-solaris2\n\t\t;;\n\tsun3 | sun3-*)\n\t\tbasic_machine=m68k-sun\n\t\t;;\n\tsun4)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n\tsun386 | sun386i | roadrunner)\n\t\tbasic_machine=i386-sun\n\t\t;;\n\tsv1)\n\t\tbasic_machine=sv1-cray\n\t\tos=-unicos\n\t\t;;\n\tsymmetry)\n\t\tbasic_machine=i386-sequent\n\t\tos=-dynix\n\t\t;;\n\tt3e)\n\t\tbasic_machine=alphaev5-cray\n\t\tos=-unicos\n\t\t;;\n\tt90)\n\t\tbasic_machine=t90-cray\n\t\tos=-unicos\n\t\t;;\n\ttile*)\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-linux-gnu\n\t\t;;\n\ttx39)\n\t\tbasic_machine=mipstx39-unknown\n\t\t;;\n\ttx39el)\n\t\tbasic_machine=mipstx39el-unknown\n\t\t;;\n\ttoad1)\n\t\tbasic_machine=pdp10-xkl\n\t\tos=-tops20\n\t\t;;\n\ttower | tower-32)\n\t\tbasic_machine=m68k-ncr\n\t\t;;\n\ttpf)\n\t\tbasic_machine=s390x-ibm\n\t\tos=-tpf\n\t\t;;\n\tudi29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tultra3)\n\t\tbasic_machine=a29k-nyu\n\t\tos=-sym1\n\t\t;;\n\tv810 | necv810)\n\t\tbasic_machine=v810-nec\n\t\tos=-none\n\t\t;;\n\tvaxv)\n\t\tbasic_machine=vax-dec\n\t\tos=-sysv\n\t\t;;\n\tvms)\n\t\tbasic_machine=vax-dec\n\t\tos=-vms\n\t\t;;\n\tvpp*|vx|vx-*)\n\t\tbasic_machine=f301-fujitsu\n\t\t;;\n\tvxworks960)\n\t\tbasic_machine=i960-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks68)\n\t\tbasic_machine=m68k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks29k)\n\t\tbasic_machine=a29k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tw65*)\n\t\tbasic_machine=w65-wdc\n\t\tos=-none\n\t\t;;\n\tw89k-*)\n\t\tbasic_machine=hppa1.1-winbond\n\t\tos=-proelf\n\t\t;;\n\txbox)\n\t\tbasic_machine=i686-pc\n\t\tos=-mingw32\n\t\t;;\n\txps | xps100)\n\t\tbasic_machine=xps100-honeywell\n\t\t;;\n\txscale-* | xscalee[bl]-*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`\n\t\t;;\n\tymp)\n\t\tbasic_machine=ymp-cray\n\t\tos=-unicos\n\t\t;;\n\tz8k-*-coff)\n\t\tbasic_machine=z8k-unknown\n\t\tos=-sim\n\t\t;;\n\tz80-*-coff)\n\t\tbasic_machine=z80-unknown\n\t\tos=-sim\n\t\t;;\n\tnone)\n\t\tbasic_machine=none-none\n\t\tos=-none\n\t\t;;\n\n# Here we handle the default manufacturer of certain CPU types.  It is in\n# some cases the only manufacturer, in others, it is the most popular.\n\tw89k)\n\t\tbasic_machine=hppa1.1-winbond\n\t\t;;\n\top50n)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\top60c)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\tromp)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\tmmix)\n\t\tbasic_machine=mmix-knuth\n\t\t;;\n\trs6000)\n\t\tbasic_machine=rs6000-ibm\n\t\t;;\n\tvax)\n\t\tbasic_machine=vax-dec\n\t\t;;\n\tpdp10)\n\t\t# there are many clones, so DEC is not a safe bet\n\t\tbasic_machine=pdp10-unknown\n\t\t;;\n\tpdp11)\n\t\tbasic_machine=pdp11-dec\n\t\t;;\n\twe32k)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\tsh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)\n\t\tbasic_machine=sh-unknown\n\t\t;;\n\tsparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n\tcydra)\n\t\tbasic_machine=cydra-cydrome\n\t\t;;\n\torion)\n\t\tbasic_machine=orion-highlevel\n\t\t;;\n\torion105)\n\t\tbasic_machine=clipper-highlevel\n\t\t;;\n\tmac | mpw | mac-mpw)\n\t\tbasic_machine=m68k-apple\n\t\t;;\n\tpmac | pmac-mpw)\n\t\tbasic_machine=powerpc-apple\n\t\t;;\n\t*-unknown)\n\t\t# Make sure to match an already-canonicalized machine name.\n\t\t;;\n\t*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\n\n# Here we canonicalize certain aliases for manufacturers.\ncase $basic_machine in\n\t*-digital*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`\n\t\t;;\n\t*-commodore*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`\n\t\t;;\n\t*)\n\t\t;;\nesac\n\n# Decode manufacturer-specific aliases for certain operating systems.\n\nif [ x\"$os\" != x\"\" ]\nthen\ncase $os in\n\t# First match some system type aliases\n\t# that might get confused with valid system types.\n\t# -solaris* is a basic system type, with this one exception.\n\t-auroraux)\n\t\tos=-auroraux\n\t\t;;\n\t-solaris1 | -solaris1.*)\n\t\tos=`echo $os | sed -e 's|solaris1|sunos4|'`\n\t\t;;\n\t-solaris)\n\t\tos=-solaris2\n\t\t;;\n\t-svr4*)\n\t\tos=-sysv4\n\t\t;;\n\t-unixware*)\n\t\tos=-sysv4.2uw\n\t\t;;\n\t-gnu/linux*)\n\t\tos=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`\n\t\t;;\n\t# First accept the basic system types.\n\t# The portable systems comes first.\n\t# Each alternative MUST END IN A *, to match a version number.\n\t# -sysv* is not here because it comes later, after sysvr4.\n\t-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \\\n\t      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\\\n\t      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \\\n\t      | -sym* | -kopensolaris* | -plan9* \\\n\t      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \\\n\t      | -aos* | -aros* \\\n\t      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \\\n\t      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \\\n\t      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \\\n\t      | -bitrig* | -openbsd* | -solidbsd* \\\n\t      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \\\n\t      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \\\n\t      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \\\n\t      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \\\n\t      | -chorusos* | -chorusrdb* | -cegcc* \\\n\t      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \\\n\t      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \\\n\t      | -linux-newlib* | -linux-musl* | -linux-uclibc* \\\n\t      | -uxpv* | -beos* | -mpeix* | -udk* \\\n\t      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \\\n\t      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \\\n\t      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \\\n\t      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \\\n\t      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \\\n\t      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \\\n\t      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)\n\t# Remember, each alternative MUST END IN *, to match a version number.\n\t\t;;\n\t-qnx*)\n\t\tcase $basic_machine in\n\t\t    x86-* | i*86-*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-nto$os\n\t\t\t;;\n\t\tesac\n\t\t;;\n\t-nto-qnx*)\n\t\t;;\n\t-nto*)\n\t\tos=`echo $os | sed -e 's|nto|nto-qnx|'`\n\t\t;;\n\t-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \\\n\t      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \\\n\t      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)\n\t\t;;\n\t-mac*)\n\t\tos=`echo $os | sed -e 's|mac|macos|'`\n\t\t;;\n\t-linux-dietlibc)\n\t\tos=-linux-dietlibc\n\t\t;;\n\t-linux*)\n\t\tos=`echo $os | sed -e 's|linux|linux-gnu|'`\n\t\t;;\n\t-sunos5*)\n\t\tos=`echo $os | sed -e 's|sunos5|solaris2|'`\n\t\t;;\n\t-sunos6*)\n\t\tos=`echo $os | sed -e 's|sunos6|solaris3|'`\n\t\t;;\n\t-opened*)\n\t\tos=-openedition\n\t\t;;\n\t-os400*)\n\t\tos=-os400\n\t\t;;\n\t-wince*)\n\t\tos=-wince\n\t\t;;\n\t-osfrose*)\n\t\tos=-osfrose\n\t\t;;\n\t-osf*)\n\t\tos=-osf\n\t\t;;\n\t-utek*)\n\t\tos=-bsd\n\t\t;;\n\t-dynix*)\n\t\tos=-bsd\n\t\t;;\n\t-acis*)\n\t\tos=-aos\n\t\t;;\n\t-atheos*)\n\t\tos=-atheos\n\t\t;;\n\t-syllable*)\n\t\tos=-syllable\n\t\t;;\n\t-386bsd)\n\t\tos=-bsd\n\t\t;;\n\t-ctix* | -uts*)\n\t\tos=-sysv\n\t\t;;\n\t-nova*)\n\t\tos=-rtmk-nova\n\t\t;;\n\t-ns2 )\n\t\tos=-nextstep2\n\t\t;;\n\t-nsk*)\n\t\tos=-nsk\n\t\t;;\n\t# Preserve the version number of sinix5.\n\t-sinix5.*)\n\t\tos=`echo $os | sed -e 's|sinix|sysv|'`\n\t\t;;\n\t-sinix*)\n\t\tos=-sysv4\n\t\t;;\n\t-tpf*)\n\t\tos=-tpf\n\t\t;;\n\t-triton*)\n\t\tos=-sysv3\n\t\t;;\n\t-oss*)\n\t\tos=-sysv3\n\t\t;;\n\t-svr4)\n\t\tos=-sysv4\n\t\t;;\n\t-svr3)\n\t\tos=-sysv3\n\t\t;;\n\t-sysvr4)\n\t\tos=-sysv4\n\t\t;;\n\t# This must come after -sysvr4.\n\t-sysv*)\n\t\t;;\n\t-ose*)\n\t\tos=-ose\n\t\t;;\n\t-es1800*)\n\t\tos=-ose\n\t\t;;\n\t-xenix)\n\t\tos=-xenix\n\t\t;;\n\t-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t\tos=-mint\n\t\t;;\n\t-aros*)\n\t\tos=-aros\n\t\t;;\n\t-zvmoe)\n\t\tos=-zvmoe\n\t\t;;\n\t-dicos*)\n\t\tos=-dicos\n\t\t;;\n\t-nacl*)\n\t\t;;\n\t-none)\n\t\t;;\n\t*)\n\t\t# Get rid of the `-' at the beginning of $os.\n\t\tos=`echo $os | sed 's/[^-]*-//'`\n\t\techo Invalid configuration \\`$1\\': system \\`$os\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\nelse\n\n# Here we handle the default operating systems that come with various machines.\n# The value should be what the vendor currently ships out the door with their\n# machine or put another way, the most popular os provided with the machine.\n\n# Note that if you're going to try to match \"-MANUFACTURER\" here (say,\n# \"-sun\"), then you have to tell the case statement up towards the top\n# that MANUFACTURER isn't an operating system.  Otherwise, code above\n# will signal an error saying that MANUFACTURER isn't an operating\n# system, and we'll never get to this point.\n\ncase $basic_machine in\n\tscore-*)\n\t\tos=-elf\n\t\t;;\n\tspu-*)\n\t\tos=-elf\n\t\t;;\n\t*-acorn)\n\t\tos=-riscix1.2\n\t\t;;\n\tarm*-rebel)\n\t\tos=-linux\n\t\t;;\n\tarm*-semi)\n\t\tos=-aout\n\t\t;;\n\tc4x-* | tic4x-*)\n\t\tos=-coff\n\t\t;;\n\tc8051-*)\n\t\tos=-elf\n\t\t;;\n\thexagon-*)\n\t\tos=-elf\n\t\t;;\n\ttic54x-*)\n\t\tos=-coff\n\t\t;;\n\ttic55x-*)\n\t\tos=-coff\n\t\t;;\n\ttic6x-*)\n\t\tos=-coff\n\t\t;;\n\t# This must come before the *-dec entry.\n\tpdp10-*)\n\t\tos=-tops20\n\t\t;;\n\tpdp11-*)\n\t\tos=-none\n\t\t;;\n\t*-dec | vax-*)\n\t\tos=-ultrix4.2\n\t\t;;\n\tm68*-apollo)\n\t\tos=-domain\n\t\t;;\n\ti386-sun)\n\t\tos=-sunos4.0.2\n\t\t;;\n\tm68000-sun)\n\t\tos=-sunos3\n\t\t;;\n\tm68*-cisco)\n\t\tos=-aout\n\t\t;;\n\tmep-*)\n\t\tos=-elf\n\t\t;;\n\tmips*-cisco)\n\t\tos=-elf\n\t\t;;\n\tmips*-*)\n\t\tos=-elf\n\t\t;;\n\tor1k-*)\n\t\tos=-elf\n\t\t;;\n\tor32-*)\n\t\tos=-coff\n\t\t;;\n\t*-tti)\t# must be before sparc entry or we get the wrong os.\n\t\tos=-sysv3\n\t\t;;\n\tsparc-* | *-sun)\n\t\tos=-sunos4.1.1\n\t\t;;\n\t*-be)\n\t\tos=-beos\n\t\t;;\n\t*-haiku)\n\t\tos=-haiku\n\t\t;;\n\t*-ibm)\n\t\tos=-aix\n\t\t;;\n\t*-knuth)\n\t\tos=-mmixware\n\t\t;;\n\t*-wec)\n\t\tos=-proelf\n\t\t;;\n\t*-winbond)\n\t\tos=-proelf\n\t\t;;\n\t*-oki)\n\t\tos=-proelf\n\t\t;;\n\t*-hp)\n\t\tos=-hpux\n\t\t;;\n\t*-hitachi)\n\t\tos=-hiux\n\t\t;;\n\ti860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)\n\t\tos=-sysv\n\t\t;;\n\t*-cbm)\n\t\tos=-amigaos\n\t\t;;\n\t*-dg)\n\t\tos=-dgux\n\t\t;;\n\t*-dolphin)\n\t\tos=-sysv3\n\t\t;;\n\tm68k-ccur)\n\t\tos=-rtu\n\t\t;;\n\tm88k-omron*)\n\t\tos=-luna\n\t\t;;\n\t*-next )\n\t\tos=-nextstep\n\t\t;;\n\t*-sequent)\n\t\tos=-ptx\n\t\t;;\n\t*-crds)\n\t\tos=-unos\n\t\t;;\n\t*-ns)\n\t\tos=-genix\n\t\t;;\n\ti370-*)\n\t\tos=-mvs\n\t\t;;\n\t*-next)\n\t\tos=-nextstep3\n\t\t;;\n\t*-gould)\n\t\tos=-sysv\n\t\t;;\n\t*-highlevel)\n\t\tos=-bsd\n\t\t;;\n\t*-encore)\n\t\tos=-bsd\n\t\t;;\n\t*-sgi)\n\t\tos=-irix\n\t\t;;\n\t*-siemens)\n\t\tos=-sysv4\n\t\t;;\n\t*-masscomp)\n\t\tos=-rtu\n\t\t;;\n\tf30[01]-fujitsu | f700-fujitsu)\n\t\tos=-uxpv\n\t\t;;\n\t*-rom68k)\n\t\tos=-coff\n\t\t;;\n\t*-*bug)\n\t\tos=-coff\n\t\t;;\n\t*-apple)\n\t\tos=-macos\n\t\t;;\n\t*-atari*)\n\t\tos=-mint\n\t\t;;\n\t*)\n\t\tos=-none\n\t\t;;\nesac\nfi\n\n# Here we handle the case where we know the os, and the CPU type, but not the\n# manufacturer.  We pick the logical manufacturer.\nvendor=unknown\ncase $basic_machine in\n\t*-unknown)\n\t\tcase $os in\n\t\t\t-riscix*)\n\t\t\t\tvendor=acorn\n\t\t\t\t;;\n\t\t\t-sunos*)\n\t\t\t\tvendor=sun\n\t\t\t\t;;\n\t\t\t-cnk*|-aix*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-beos*)\n\t\t\t\tvendor=be\n\t\t\t\t;;\n\t\t\t-hpux*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-mpeix*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-hiux*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-unos*)\n\t\t\t\tvendor=crds\n\t\t\t\t;;\n\t\t\t-dgux*)\n\t\t\t\tvendor=dg\n\t\t\t\t;;\n\t\t\t-luna*)\n\t\t\t\tvendor=omron\n\t\t\t\t;;\n\t\t\t-genix*)\n\t\t\t\tvendor=ns\n\t\t\t\t;;\n\t\t\t-mvs* | -opened*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-os400*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-ptx*)\n\t\t\t\tvendor=sequent\n\t\t\t\t;;\n\t\t\t-tpf*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-vxsim* | -vxworks* | -windiss*)\n\t\t\t\tvendor=wrs\n\t\t\t\t;;\n\t\t\t-aux*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-hms*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-mpw* | -macos*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t\t\t\tvendor=atari\n\t\t\t\t;;\n\t\t\t-vos*)\n\t\t\t\tvendor=stratus\n\t\t\t\t;;\n\t\tesac\n\t\tbasic_machine=`echo $basic_machine | sed \"s/unknown/$vendor/\"`\n\t\t;;\nesac\n\necho $basic_machine$os\nexit\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/auto/depcomp",
    "content": "#! /bin/sh\n# depcomp - compile a program generating dependencies as side-effects\n\nscriptversion=2013-05-30.07; # UTC\n\n# Copyright (C) 1999-2013 Free Software Foundation, Inc.\n\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.\n\ncase $1 in\n  '')\n    echo \"$0: No command.  Try '$0 --help' for more information.\" 1>&2\n    exit 1;\n    ;;\n  -h | --h*)\n    cat <<\\EOF\nUsage: depcomp [--help] [--version] PROGRAM [ARGS]\n\nRun PROGRAMS ARGS to compile a file, generating dependencies\nas side-effects.\n\nEnvironment variables:\n  depmode     Dependency tracking mode.\n  source      Source file read by 'PROGRAMS ARGS'.\n  object      Object file output by 'PROGRAMS ARGS'.\n  DEPDIR      directory where to store dependencies.\n  depfile     Dependency file to output.\n  tmpdepfile  Temporary file to use when outputting dependencies.\n  libtool     Whether libtool is used (yes/no).\n\nReport bugs to <bug-automake@gnu.org>.\nEOF\n    exit $?\n    ;;\n  -v | --v*)\n    echo \"depcomp $scriptversion\"\n    exit $?\n    ;;\nesac\n\n# Get the directory component of the given path, and save it in the\n# global variables '$dir'.  Note that this directory component will\n# be either empty or ending with a '/' character.  This is deliberate.\nset_dir_from ()\n{\n  case $1 in\n    */*) dir=`echo \"$1\" | sed -e 's|/[^/]*$|/|'`;;\n      *) dir=;;\n  esac\n}\n\n# Get the suffix-stripped basename of the given path, and save it the\n# global variable '$base'.\nset_base_from ()\n{\n  base=`echo \"$1\" | sed -e 's|^.*/||' -e 's/\\.[^.]*$//'`\n}\n\n# If no dependency file was actually created by the compiler invocation,\n# we still have to create a dummy depfile, to avoid errors with the\n# Makefile \"include basename.Plo\" scheme.\nmake_dummy_depfile ()\n{\n  echo \"#dummy\" > \"$depfile\"\n}\n\n# Factor out some common post-processing of the generated depfile.\n# Requires the auxiliary global variable '$tmpdepfile' to be set.\naix_post_process_depfile ()\n{\n  # If the compiler actually managed to produce a dependency file,\n  # post-process it.\n  if test -f \"$tmpdepfile\"; then\n    # Each line is of the form 'foo.o: dependency.h'.\n    # Do two passes, one to just change these to\n    #   $object: dependency.h\n    # and one to simply output\n    #   dependency.h:\n    # which is needed to avoid the deleted-header problem.\n    { sed -e \"s,^.*\\.[$lower]*:,$object:,\" < \"$tmpdepfile\"\n      sed -e \"s,^.*\\.[$lower]*:[$tab ]*,,\" -e 's,$,:,' < \"$tmpdepfile\"\n    } > \"$depfile\"\n    rm -f \"$tmpdepfile\"\n  else\n    make_dummy_depfile\n  fi\n}\n\n# A tabulation character.\ntab='\t'\n# A newline character.\nnl='\n'\n# Character ranges might be problematic outside the C locale.\n# These definitions help.\nupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ\nlower=abcdefghijklmnopqrstuvwxyz\ndigits=0123456789\nalpha=${upper}${lower}\n\nif test -z \"$depmode\" || test -z \"$source\" || test -z \"$object\"; then\n  echo \"depcomp: Variables source, object and depmode must be set\" 1>&2\n  exit 1\nfi\n\n# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.\ndepfile=${depfile-`echo \"$object\" |\n  sed 's|[^\\\\/]*$|'${DEPDIR-.deps}'/&|;s|\\.\\([^.]*\\)$|.P\\1|;s|Pobj$|Po|'`}\ntmpdepfile=${tmpdepfile-`echo \"$depfile\" | sed 's/\\.\\([^.]*\\)$/.T\\1/'`}\n\nrm -f \"$tmpdepfile\"\n\n# Avoid interferences from the environment.\ngccflag= dashmflag=\n\n# Some modes work just like other modes, but use different flags.  We\n# parameterize here, but still list the modes in the big case below,\n# to make depend.m4 easier to write.  Note that we *cannot* use a case\n# here, because this file can only contain one case statement.\nif test \"$depmode\" = hp; then\n  # HP compiler uses -M and no extra arg.\n  gccflag=-M\n  depmode=gcc\nfi\n\nif test \"$depmode\" = dashXmstdout; then\n  # This is just like dashmstdout with a different argument.\n  dashmflag=-xM\n  depmode=dashmstdout\nfi\n\ncygpath_u=\"cygpath -u -f -\"\nif test \"$depmode\" = msvcmsys; then\n  # This is just like msvisualcpp but w/o cygpath translation.\n  # Just convert the backslash-escaped backslashes to single forward\n  # slashes to satisfy depend.m4\n  cygpath_u='sed s,\\\\\\\\,/,g'\n  depmode=msvisualcpp\nfi\n\nif test \"$depmode\" = msvc7msys; then\n  # This is just like msvc7 but w/o cygpath translation.\n  # Just convert the backslash-escaped backslashes to single forward\n  # slashes to satisfy depend.m4\n  cygpath_u='sed s,\\\\\\\\,/,g'\n  depmode=msvc7\nfi\n\nif test \"$depmode\" = xlc; then\n  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.\n  gccflag=-qmakedep=gcc,-MF\n  depmode=gcc\nfi\n\ncase \"$depmode\" in\ngcc3)\n## gcc 3 implements dependency tracking that does exactly what\n## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like\n## it if -MD -MP comes after the -MF stuff.  Hmm.\n## Unfortunately, FreeBSD c89 acceptance of flags depends upon\n## the command line argument order; so add the flags where they\n## appear in depend2.am.  Note that the slowdown incurred here\n## affects only configure: in makefiles, %FASTDEP% shortcuts this.\n  for arg\n  do\n    case $arg in\n    -c) set fnord \"$@\" -MT \"$object\" -MD -MP -MF \"$tmpdepfile\" \"$arg\" ;;\n    *)  set fnord \"$@\" \"$arg\" ;;\n    esac\n    shift # fnord\n    shift # $arg\n  done\n  \"$@\"\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  mv \"$tmpdepfile\" \"$depfile\"\n  ;;\n\ngcc)\n## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.\n## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.\n## (see the conditional assignment to $gccflag above).\n## There are various ways to get dependency output from gcc.  Here's\n## why we pick this rather obscure method:\n## - Don't want to use -MD because we'd like the dependencies to end\n##   up in a subdir.  Having to rename by hand is ugly.\n##   (We might end up doing this anyway to support other compilers.)\n## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like\n##   -MM, not -M (despite what the docs say).  Also, it might not be\n##   supported by the other compilers which use the 'gcc' depmode.\n## - Using -M directly means running the compiler twice (even worse\n##   than renaming).\n  if test -z \"$gccflag\"; then\n    gccflag=-MD,\n  fi\n  \"$@\" -Wp,\"$gccflag$tmpdepfile\"\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  # The second -e expression handles DOS-style file names with drive\n  # letters.\n  sed -e 's/^[^:]*: / /' \\\n      -e 's/^['$alpha']:\\/[^:]*: / /' < \"$tmpdepfile\" >> \"$depfile\"\n## This next piece of magic avoids the \"deleted header file\" problem.\n## The problem is that when a header file which appears in a .P file\n## is deleted, the dependency causes make to die (because there is\n## typically no way to rebuild the header).  We avoid this by adding\n## dummy dependencies for each header file.  Too bad gcc doesn't do\n## this for us directly.\n## Some versions of gcc put a space before the ':'.  On the theory\n## that the space means something, we add a space to the output as\n## well.  hp depmode also adds that space, but also prefixes the VPATH\n## to the object.  Take care to not repeat it in the output.\n## Some versions of the HPUX 10.20 sed can't process this invocation\n## correctly.  Breaking it into two sed invocations is a workaround.\n  tr ' ' \"$nl\" < \"$tmpdepfile\" \\\n    | sed -e 's/^\\\\$//' -e '/^$/d' -e \"s|.*$object$||\" -e '/:$/d' \\\n    | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nhp)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\nsgi)\n  if test \"$libtool\" = yes; then\n    \"$@\" \"-Wp,-MDupdate,$tmpdepfile\"\n  else\n    \"$@\" -MDupdate \"$tmpdepfile\"\n  fi\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n\n  if test -f \"$tmpdepfile\"; then  # yes, the sourcefile depend on other files\n    echo \"$object : \\\\\" > \"$depfile\"\n    # Clip off the initial element (the dependent).  Don't try to be\n    # clever and replace this with sed code, as IRIX sed won't handle\n    # lines with more than a fixed number of characters (4096 in\n    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;\n    # the IRIX cc adds comments like '#:fec' to the end of the\n    # dependency line.\n    tr ' ' \"$nl\" < \"$tmpdepfile\" \\\n      | sed -e 's/^.*\\.o://' -e 's/#.*$//' -e '/^$/ d' \\\n      | tr \"$nl\" ' ' >> \"$depfile\"\n    echo >> \"$depfile\"\n    # The second pass generates a dummy entry for each header file.\n    tr ' ' \"$nl\" < \"$tmpdepfile\" \\\n      | sed -e 's/^.*\\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \\\n      >> \"$depfile\"\n  else\n    make_dummy_depfile\n  fi\n  rm -f \"$tmpdepfile\"\n  ;;\n\nxlc)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\naix)\n  # The C for AIX Compiler uses -M and outputs the dependencies\n  # in a .u file.  In older versions, this file always lives in the\n  # current directory.  Also, the AIX compiler puts '$object:' at the\n  # start of each line; $object doesn't have directory information.\n  # Version 6 uses the directory in both cases.\n  set_dir_from \"$object\"\n  set_base_from \"$object\"\n  if test \"$libtool\" = yes; then\n    tmpdepfile1=$dir$base.u\n    tmpdepfile2=$base.u\n    tmpdepfile3=$dir.libs/$base.u\n    \"$@\" -Wc,-M\n  else\n    tmpdepfile1=$dir$base.u\n    tmpdepfile2=$dir$base.u\n    tmpdepfile3=$dir$base.u\n    \"$@\" -M\n  fi\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n    exit $stat\n  fi\n\n  for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n  do\n    test -f \"$tmpdepfile\" && break\n  done\n  aix_post_process_depfile\n  ;;\n\ntcc)\n  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26\n  # FIXME: That version still under development at the moment of writing.\n  #        Make that this statement remains true also for stable, released\n  #        versions.\n  # It will wrap lines (doesn't matter whether long or short) with a\n  # trailing '\\', as in:\n  #\n  #   foo.o : \\\n  #    foo.c \\\n  #    foo.h \\\n  #\n  # It will put a trailing '\\' even on the last line, and will use leading\n  # spaces rather than leading tabs (at least since its commit 0394caf7\n  # \"Emit spaces for -MD\").\n  \"$@\" -MD -MF \"$tmpdepfile\"\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  # Each non-empty line is of the form 'foo.o : \\' or ' dep.h \\'.\n  # We have to change lines of the first kind to '$object: \\'.\n  sed -e \"s|.*:|$object :|\" < \"$tmpdepfile\" > \"$depfile\"\n  # And for each line of the second kind, we have to emit a 'dep.h:'\n  # dummy dependency, to avoid the deleted-header problem.\n  sed -n -e 's|^  *\\(.*\\) *\\\\$|\\1:|p' < \"$tmpdepfile\" >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\n## The order of this option in the case statement is important, since the\n## shell code in configure will try each of these formats in the order\n## listed in this file.  A plain '-MD' option would be understood by many\n## compilers, so we must ensure this comes after the gcc and icc options.\npgcc)\n  # Portland's C compiler understands '-MD'.\n  # Will always output deps to 'file.d' where file is the root name of the\n  # source file under compilation, even if file resides in a subdirectory.\n  # The object file name does not affect the name of the '.d' file.\n  # pgcc 10.2 will output\n  #    foo.o: sub/foo.c sub/foo.h\n  # and will wrap long lines using '\\' :\n  #    foo.o: sub/foo.c ... \\\n  #     sub/foo.h ... \\\n  #     ...\n  set_dir_from \"$object\"\n  # Use the source, not the object, to determine the base name, since\n  # that's sadly what pgcc will do too.\n  set_base_from \"$source\"\n  tmpdepfile=$base.d\n\n  # For projects that build the same source file twice into different object\n  # files, the pgcc approach of using the *source* file root name can cause\n  # problems in parallel builds.  Use a locking strategy to avoid stomping on\n  # the same $tmpdepfile.\n  lockdir=$base.d-lock\n  trap \"\n    echo '$0: caught signal, cleaning up...' >&2\n    rmdir '$lockdir'\n    exit 1\n  \" 1 2 13 15\n  numtries=100\n  i=$numtries\n  while test $i -gt 0; do\n    # mkdir is a portable test-and-set.\n    if mkdir \"$lockdir\" 2>/dev/null; then\n      # This process acquired the lock.\n      \"$@\" -MD\n      stat=$?\n      # Release the lock.\n      rmdir \"$lockdir\"\n      break\n    else\n      # If the lock is being held by a different process, wait\n      # until the winning process is done or we timeout.\n      while test -d \"$lockdir\" && test $i -gt 0; do\n        sleep 1\n        i=`expr $i - 1`\n      done\n    fi\n    i=`expr $i - 1`\n  done\n  trap - 1 2 13 15\n  if test $i -le 0; then\n    echo \"$0: failed to acquire lock after $numtries attempts\" >&2\n    echo \"$0: check lockdir '$lockdir'\" >&2\n    exit 1\n  fi\n\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  # Each line is of the form `foo.o: dependent.h',\n  # or `foo.o: dep1.h dep2.h \\', or ` dep3.h dep4.h \\'.\n  # Do two passes, one to just change these to\n  # `$object: dependent.h' and one to simply `dependent.h:'.\n  sed \"s,^[^:]*:,$object :,\" < \"$tmpdepfile\" > \"$depfile\"\n  # Some versions of the HPUX 10.20 sed can't process this invocation\n  # correctly.  Breaking it into two sed invocations is a workaround.\n  sed 's,^[^:]*: \\(.*\\)$,\\1,;s/^\\\\$//;/^$/d;/:$/d' < \"$tmpdepfile\" \\\n    | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nhp2)\n  # The \"hp\" stanza above does not work with aCC (C++) and HP's ia64\n  # compilers, which have integrated preprocessors.  The correct option\n  # to use with these is +Maked; it writes dependencies to a file named\n  # 'foo.d', which lands next to the object file, wherever that\n  # happens to be.\n  # Much of this is similar to the tru64 case; see comments there.\n  set_dir_from  \"$object\"\n  set_base_from \"$object\"\n  if test \"$libtool\" = yes; then\n    tmpdepfile1=$dir$base.d\n    tmpdepfile2=$dir.libs/$base.d\n    \"$@\" -Wc,+Maked\n  else\n    tmpdepfile1=$dir$base.d\n    tmpdepfile2=$dir$base.d\n    \"$@\" +Maked\n  fi\n  stat=$?\n  if test $stat -ne 0; then\n     rm -f \"$tmpdepfile1\" \"$tmpdepfile2\"\n     exit $stat\n  fi\n\n  for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\"\n  do\n    test -f \"$tmpdepfile\" && break\n  done\n  if test -f \"$tmpdepfile\"; then\n    sed -e \"s,^.*\\.[$lower]*:,$object:,\" \"$tmpdepfile\" > \"$depfile\"\n    # Add 'dependent.h:' lines.\n    sed -ne '2,${\n               s/^ *//\n               s/ \\\\*$//\n               s/$/:/\n               p\n             }' \"$tmpdepfile\" >> \"$depfile\"\n  else\n    make_dummy_depfile\n  fi\n  rm -f \"$tmpdepfile\" \"$tmpdepfile2\"\n  ;;\n\ntru64)\n  # The Tru64 compiler uses -MD to generate dependencies as a side\n  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.\n  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put\n  # dependencies in 'foo.d' instead, so we check for that too.\n  # Subdirectories are respected.\n  set_dir_from  \"$object\"\n  set_base_from \"$object\"\n\n  if test \"$libtool\" = yes; then\n    # Libtool generates 2 separate objects for the 2 libraries.  These\n    # two compilations output dependencies in $dir.libs/$base.o.d and\n    # in $dir$base.o.d.  We have to check for both files, because\n    # one of the two compilations can be disabled.  We should prefer\n    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is\n    # automatically cleaned when .libs/ is deleted, while ignoring\n    # the former would cause a distcleancheck panic.\n    tmpdepfile1=$dir$base.o.d          # libtool 1.5\n    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.\n    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504\n    \"$@\" -Wc,-MD\n  else\n    tmpdepfile1=$dir$base.d\n    tmpdepfile2=$dir$base.d\n    tmpdepfile3=$dir$base.d\n    \"$@\" -MD\n  fi\n\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n    exit $stat\n  fi\n\n  for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n  do\n    test -f \"$tmpdepfile\" && break\n  done\n  # Same post-processing that is required for AIX mode.\n  aix_post_process_depfile\n  ;;\n\nmsvc7)\n  if test \"$libtool\" = yes; then\n    showIncludes=-Wc,-showIncludes\n  else\n    showIncludes=-showIncludes\n  fi\n  \"$@\" $showIncludes > \"$tmpdepfile\"\n  stat=$?\n  grep -v '^Note: including file: ' \"$tmpdepfile\"\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  # The first sed program below extracts the file names and escapes\n  # backslashes for cygpath.  The second sed program outputs the file\n  # name when reading, but also accumulates all include files in the\n  # hold buffer in order to output them again at the end.  This only\n  # works with sed implementations that can handle large buffers.\n  sed < \"$tmpdepfile\" -n '\n/^Note: including file:  *\\(.*\\)/ {\n  s//\\1/\n  s/\\\\/\\\\\\\\/g\n  p\n}' | $cygpath_u | sort -u | sed -n '\ns/ /\\\\ /g\ns/\\(.*\\)/'\"$tab\"'\\1 \\\\/p\ns/.\\(.*\\) \\\\/\\1:/\nH\n$ {\n  s/.*/'\"$tab\"'/\n  G\n  p\n}' >> \"$depfile\"\n  echo >> \"$depfile\" # make sure the fragment doesn't end with a backslash\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvc7msys)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\n#nosideeffect)\n  # This comment above is used by automake to tell side-effect\n  # dependency tracking mechanisms from slower ones.\n\ndashmstdout)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout, regardless of -o.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  # Remove '-o $object'.\n  IFS=\" \"\n  for arg\n  do\n    case $arg in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"\n      shift # fnord\n      shift # $arg\n      ;;\n    esac\n  done\n\n  test -z \"$dashmflag\" && dashmflag=-M\n  # Require at least two characters before searching for ':'\n  # in the target name.  This is to cope with DOS-style filenames:\n  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.\n  \"$@\" $dashmflag |\n    sed \"s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |\" > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  cat < \"$tmpdepfile\" > \"$depfile\"\n  # Some versions of the HPUX 10.20 sed can't process this sed invocation\n  # correctly.  Breaking it into two sed invocations is a workaround.\n  tr ' ' \"$nl\" < \"$tmpdepfile\" \\\n    | sed -e 's/^\\\\$//' -e '/^$/d' -e '/:$/d' \\\n    | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\ndashXmstdout)\n  # This case only exists to satisfy depend.m4.  It is never actually\n  # run, as this mode is specially recognized in the preamble.\n  exit 1\n  ;;\n\nmakedepend)\n  \"$@\" || exit $?\n  # Remove any Libtool call\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n  # X makedepend\n  shift\n  cleared=no eat=no\n  for arg\n  do\n    case $cleared in\n    no)\n      set \"\"; shift\n      cleared=yes ;;\n    esac\n    if test $eat = yes; then\n      eat=no\n      continue\n    fi\n    case \"$arg\" in\n    -D*|-I*)\n      set fnord \"$@\" \"$arg\"; shift ;;\n    # Strip any option that makedepend may not understand.  Remove\n    # the object too, otherwise makedepend will parse it as a source file.\n    -arch)\n      eat=yes ;;\n    -*|$object)\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"; shift ;;\n    esac\n  done\n  obj_suffix=`echo \"$object\" | sed 's/^.*\\././'`\n  touch \"$tmpdepfile\"\n  ${MAKEDEPEND-makedepend} -o\"$obj_suffix\" -f\"$tmpdepfile\" \"$@\"\n  rm -f \"$depfile\"\n  # makedepend may prepend the VPATH from the source file name to the object.\n  # No need to regex-escape $object, excess matching of '.' is harmless.\n  sed \"s|^.*\\($object *:\\)|\\1|\" \"$tmpdepfile\" > \"$depfile\"\n  # Some versions of the HPUX 10.20 sed can't process the last invocation\n  # correctly.  Breaking it into two sed invocations is a workaround.\n  sed '1,2d' \"$tmpdepfile\" \\\n    | tr ' ' \"$nl\" \\\n    | sed -e 's/^\\\\$//' -e '/^$/d' -e '/:$/d' \\\n    | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\" \"$tmpdepfile\".bak\n  ;;\n\ncpp)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  # Remove '-o $object'.\n  IFS=\" \"\n  for arg\n  do\n    case $arg in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"\n      shift # fnord\n      shift # $arg\n      ;;\n    esac\n  done\n\n  \"$@\" -E \\\n    | sed -n -e '/^# [0-9][0-9]* \"\\([^\"]*\\)\".*/ s:: \\1 \\\\:p' \\\n             -e '/^#line [0-9][0-9]* \"\\([^\"]*\\)\".*/ s:: \\1 \\\\:p' \\\n    | sed '$ s: \\\\$::' > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  cat < \"$tmpdepfile\" >> \"$depfile\"\n  sed < \"$tmpdepfile\" '/^$/d;s/^ //;s/ \\\\$//;s/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvisualcpp)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  IFS=\" \"\n  for arg\n  do\n    case \"$arg\" in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    \"-Gm\"|\"/Gm\"|\"-Gi\"|\"/Gi\"|\"-ZI\"|\"/ZI\")\n        set fnord \"$@\"\n        shift\n        shift\n        ;;\n    *)\n        set fnord \"$@\" \"$arg\"\n        shift\n        shift\n        ;;\n    esac\n  done\n  \"$@\" -E 2>/dev/null |\n  sed -n '/^#line [0-9][0-9]* \"\\([^\"]*\\)\"/ s::\\1:p' | $cygpath_u | sort -u > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  sed < \"$tmpdepfile\" -n -e 's% %\\\\ %g' -e '/^\\(.*\\)$/ s::'\"$tab\"'\\1 \\\\:p' >> \"$depfile\"\n  echo \"$tab\" >> \"$depfile\"\n  sed < \"$tmpdepfile\" -n -e 's% %\\\\ %g' -e '/^\\(.*\\)$/ s::\\1\\::p' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvcmsys)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\nnone)\n  exec \"$@\"\n  ;;\n\n*)\n  echo \"Unknown depmode $depmode\" 1>&2\n  exit 1\n  ;;\nesac\n\nexit 0\n\n# Local Variables:\n# mode: shell-script\n# sh-indentation: 2\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/auto/install-sh",
    "content": "#!/bin/sh\n# install - install a program, script, or datafile\n\nscriptversion=2011-11-20.07; # UTC\n\n# This originates from X11R5 (mit/util/scripts/install.sh), which was\n# later released in X11R6 (xc/config/util/install.sh) with the\n# following copyright and license.\n#\n# Copyright (C) 1994 X Consortium\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to\n# deal in the Software without restriction, including without limitation the\n# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n# sell copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\n# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-\n# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n#\n# Except as contained in this notice, the name of the X Consortium shall not\n# be used in advertising or otherwise to promote the sale, use or other deal-\n# ings in this Software without prior written authorization from the X Consor-\n# tium.\n#\n#\n# FSF changes to this file are in the public domain.\n#\n# Calling this script install-sh is preferred over install.sh, to prevent\n# 'make' implicit rules from creating a file called install from it\n# when there is no Makefile.\n#\n# This script is compatible with the BSD install script, but was written\n# from scratch.\n\nnl='\n'\nIFS=\" \"\"\t$nl\"\n\n# set DOITPROG to echo to test this script\n\n# Don't use :- since 4.3BSD and earlier shells don't like it.\ndoit=${DOITPROG-}\nif test -z \"$doit\"; then\n  doit_exec=exec\nelse\n  doit_exec=$doit\nfi\n\n# Put in absolute file names if you don't have them in your path;\n# or use environment vars.\n\nchgrpprog=${CHGRPPROG-chgrp}\nchmodprog=${CHMODPROG-chmod}\nchownprog=${CHOWNPROG-chown}\ncmpprog=${CMPPROG-cmp}\ncpprog=${CPPROG-cp}\nmkdirprog=${MKDIRPROG-mkdir}\nmvprog=${MVPROG-mv}\nrmprog=${RMPROG-rm}\nstripprog=${STRIPPROG-strip}\n\nposix_glob='?'\ninitialize_posix_glob='\n  test \"$posix_glob\" != \"?\" || {\n    if (set -f) 2>/dev/null; then\n      posix_glob=\n    else\n      posix_glob=:\n    fi\n  }\n'\n\nposix_mkdir=\n\n# Desired mode of installed file.\nmode=0755\n\nchgrpcmd=\nchmodcmd=$chmodprog\nchowncmd=\nmvcmd=$mvprog\nrmcmd=\"$rmprog -f\"\nstripcmd=\n\nsrc=\ndst=\ndir_arg=\ndst_arg=\n\ncopy_on_change=false\nno_target_directory=\n\nusage=\"\\\nUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE\n   or: $0 [OPTION]... SRCFILES... DIRECTORY\n   or: $0 [OPTION]... -t DIRECTORY SRCFILES...\n   or: $0 [OPTION]... -d DIRECTORIES...\n\nIn the 1st form, copy SRCFILE to DSTFILE.\nIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.\nIn the 4th, create DIRECTORIES.\n\nOptions:\n     --help     display this help and exit.\n     --version  display version info and exit.\n\n  -c            (ignored)\n  -C            install only if different (preserve the last data modification time)\n  -d            create directories instead of installing files.\n  -g GROUP      $chgrpprog installed files to GROUP.\n  -m MODE       $chmodprog installed files to MODE.\n  -o USER       $chownprog installed files to USER.\n  -s            $stripprog installed files.\n  -t DIRECTORY  install into DIRECTORY.\n  -T            report an error if DSTFILE is a directory.\n\nEnvironment variables override the default commands:\n  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG\n  RMPROG STRIPPROG\n\"\n\nwhile test $# -ne 0; do\n  case $1 in\n    -c) ;;\n\n    -C) copy_on_change=true;;\n\n    -d) dir_arg=true;;\n\n    -g) chgrpcmd=\"$chgrpprog $2\"\n\tshift;;\n\n    --help) echo \"$usage\"; exit $?;;\n\n    -m) mode=$2\n\tcase $mode in\n\t  *' '* | *'\t'* | *'\n'*\t  | *'*'* | *'?'* | *'['*)\n\t    echo \"$0: invalid mode: $mode\" >&2\n\t    exit 1;;\n\tesac\n\tshift;;\n\n    -o) chowncmd=\"$chownprog $2\"\n\tshift;;\n\n    -s) stripcmd=$stripprog;;\n\n    -t) dst_arg=$2\n\t# Protect names problematic for 'test' and other utilities.\n\tcase $dst_arg in\n\t  -* | [=\\(\\)!]) dst_arg=./$dst_arg;;\n\tesac\n\tshift;;\n\n    -T) no_target_directory=true;;\n\n    --version) echo \"$0 $scriptversion\"; exit $?;;\n\n    --)\tshift\n\tbreak;;\n\n    -*)\techo \"$0: invalid option: $1\" >&2\n\texit 1;;\n\n    *)  break;;\n  esac\n  shift\ndone\n\nif test $# -ne 0 && test -z \"$dir_arg$dst_arg\"; then\n  # When -d is used, all remaining arguments are directories to create.\n  # When -t is used, the destination is already specified.\n  # Otherwise, the last argument is the destination.  Remove it from $@.\n  for arg\n  do\n    if test -n \"$dst_arg\"; then\n      # $@ is not empty: it contains at least $arg.\n      set fnord \"$@\" \"$dst_arg\"\n      shift # fnord\n    fi\n    shift # arg\n    dst_arg=$arg\n    # Protect names problematic for 'test' and other utilities.\n    case $dst_arg in\n      -* | [=\\(\\)!]) dst_arg=./$dst_arg;;\n    esac\n  done\nfi\n\nif test $# -eq 0; then\n  if test -z \"$dir_arg\"; then\n    echo \"$0: no input file specified.\" >&2\n    exit 1\n  fi\n  # It's OK to call 'install-sh -d' without argument.\n  # This can happen when creating conditional directories.\n  exit 0\nfi\n\nif test -z \"$dir_arg\"; then\n  do_exit='(exit $ret); exit $ret'\n  trap \"ret=129; $do_exit\" 1\n  trap \"ret=130; $do_exit\" 2\n  trap \"ret=141; $do_exit\" 13\n  trap \"ret=143; $do_exit\" 15\n\n  # Set umask so as not to create temps with too-generous modes.\n  # However, 'strip' requires both read and write access to temps.\n  case $mode in\n    # Optimize common cases.\n    *644) cp_umask=133;;\n    *755) cp_umask=22;;\n\n    *[0-7])\n      if test -z \"$stripcmd\"; then\n\tu_plus_rw=\n      else\n\tu_plus_rw='% 200'\n      fi\n      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;\n    *)\n      if test -z \"$stripcmd\"; then\n\tu_plus_rw=\n      else\n\tu_plus_rw=,u+rw\n      fi\n      cp_umask=$mode$u_plus_rw;;\n  esac\nfi\n\nfor src\ndo\n  # Protect names problematic for 'test' and other utilities.\n  case $src in\n    -* | [=\\(\\)!]) src=./$src;;\n  esac\n\n  if test -n \"$dir_arg\"; then\n    dst=$src\n    dstdir=$dst\n    test -d \"$dstdir\"\n    dstdir_status=$?\n  else\n\n    # Waiting for this to be detected by the \"$cpprog $src $dsttmp\" command\n    # might cause directories to be created, which would be especially bad\n    # if $src (and thus $dsttmp) contains '*'.\n    if test ! -f \"$src\" && test ! -d \"$src\"; then\n      echo \"$0: $src does not exist.\" >&2\n      exit 1\n    fi\n\n    if test -z \"$dst_arg\"; then\n      echo \"$0: no destination specified.\" >&2\n      exit 1\n    fi\n    dst=$dst_arg\n\n    # If destination is a directory, append the input filename; won't work\n    # if double slashes aren't ignored.\n    if test -d \"$dst\"; then\n      if test -n \"$no_target_directory\"; then\n\techo \"$0: $dst_arg: Is a directory\" >&2\n\texit 1\n      fi\n      dstdir=$dst\n      dst=$dstdir/`basename \"$src\"`\n      dstdir_status=0\n    else\n      # Prefer dirname, but fall back on a substitute if dirname fails.\n      dstdir=`\n\t(dirname \"$dst\") 2>/dev/null ||\n\texpr X\"$dst\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t     X\"$dst\" : 'X\\(//\\)[^/]' \\| \\\n\t     X\"$dst\" : 'X\\(//\\)$' \\| \\\n\t     X\"$dst\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n\techo X\"$dst\" |\n\t    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\/\\)[^/].*/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\/\\)$/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\).*/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t s/.*/./; q'\n      `\n\n      test -d \"$dstdir\"\n      dstdir_status=$?\n    fi\n  fi\n\n  obsolete_mkdir_used=false\n\n  if test $dstdir_status != 0; then\n    case $posix_mkdir in\n      '')\n\t# Create intermediate dirs using mode 755 as modified by the umask.\n\t# This is like FreeBSD 'install' as of 1997-10-28.\n\tumask=`umask`\n\tcase $stripcmd.$umask in\n\t  # Optimize common cases.\n\t  *[2367][2367]) mkdir_umask=$umask;;\n\t  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;\n\n\t  *[0-7])\n\t    mkdir_umask=`expr $umask + 22 \\\n\t      - $umask % 100 % 40 + $umask % 20 \\\n\t      - $umask % 10 % 4 + $umask % 2\n\t    `;;\n\t  *) mkdir_umask=$umask,go-w;;\n\tesac\n\n\t# With -d, create the new directory with the user-specified mode.\n\t# Otherwise, rely on $mkdir_umask.\n\tif test -n \"$dir_arg\"; then\n\t  mkdir_mode=-m$mode\n\telse\n\t  mkdir_mode=\n\tfi\n\n\tposix_mkdir=false\n\tcase $umask in\n\t  *[123567][0-7][0-7])\n\t    # POSIX mkdir -p sets u+wx bits regardless of umask, which\n\t    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.\n\t    ;;\n\t  *)\n\t    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$\n\t    trap 'ret=$?; rmdir \"$tmpdir/d\" \"$tmpdir\" 2>/dev/null; exit $ret' 0\n\n\t    if (umask $mkdir_umask &&\n\t\texec $mkdirprog $mkdir_mode -p -- \"$tmpdir/d\") >/dev/null 2>&1\n\t    then\n\t      if test -z \"$dir_arg\" || {\n\t\t   # Check for POSIX incompatibilities with -m.\n\t\t   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or\n\t\t   # other-writable bit of parent directory when it shouldn't.\n\t\t   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.\n\t\t   ls_ld_tmpdir=`ls -ld \"$tmpdir\"`\n\t\t   case $ls_ld_tmpdir in\n\t\t     d????-?r-*) different_mode=700;;\n\t\t     d????-?--*) different_mode=755;;\n\t\t     *) false;;\n\t\t   esac &&\n\t\t   $mkdirprog -m$different_mode -p -- \"$tmpdir\" && {\n\t\t     ls_ld_tmpdir_1=`ls -ld \"$tmpdir\"`\n\t\t     test \"$ls_ld_tmpdir\" = \"$ls_ld_tmpdir_1\"\n\t\t   }\n\t\t }\n\t      then posix_mkdir=:\n\t      fi\n\t      rmdir \"$tmpdir/d\" \"$tmpdir\"\n\t    else\n\t      # Remove any dirs left behind by ancient mkdir implementations.\n\t      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null\n\t    fi\n\t    trap '' 0;;\n\tesac;;\n    esac\n\n    if\n      $posix_mkdir && (\n\tumask $mkdir_umask &&\n\t$doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\"\n      )\n    then :\n    else\n\n      # The umask is ridiculous, or mkdir does not conform to POSIX,\n      # or it failed possibly due to a race condition.  Create the\n      # directory the slow way, step by step, checking for races as we go.\n\n      case $dstdir in\n\t/*) prefix='/';;\n\t[-=\\(\\)!]*) prefix='./';;\n\t*)  prefix='';;\n      esac\n\n      eval \"$initialize_posix_glob\"\n\n      oIFS=$IFS\n      IFS=/\n      $posix_glob set -f\n      set fnord $dstdir\n      shift\n      $posix_glob set +f\n      IFS=$oIFS\n\n      prefixes=\n\n      for d\n      do\n\ttest X\"$d\" = X && continue\n\n\tprefix=$prefix$d\n\tif test -d \"$prefix\"; then\n\t  prefixes=\n\telse\n\t  if $posix_mkdir; then\n\t    (umask=$mkdir_umask &&\n\t     $doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\") && break\n\t    # Don't fail if two instances are running concurrently.\n\t    test -d \"$prefix\" || exit 1\n\t  else\n\t    case $prefix in\n\t      *\\'*) qprefix=`echo \"$prefix\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;;\n\t      *) qprefix=$prefix;;\n\t    esac\n\t    prefixes=\"$prefixes '$qprefix'\"\n\t  fi\n\tfi\n\tprefix=$prefix/\n      done\n\n      if test -n \"$prefixes\"; then\n\t# Don't fail if two instances are running concurrently.\n\t(umask $mkdir_umask &&\n\t eval \"\\$doit_exec \\$mkdirprog $prefixes\") ||\n\t  test -d \"$dstdir\" || exit 1\n\tobsolete_mkdir_used=true\n      fi\n    fi\n  fi\n\n  if test -n \"$dir_arg\"; then\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dst\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dst\"; } &&\n    { test \"$obsolete_mkdir_used$chowncmd$chgrpcmd\" = false ||\n      test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dst\"; } || exit 1\n  else\n\n    # Make a couple of temp file names in the proper directory.\n    dsttmp=$dstdir/_inst.$$_\n    rmtmp=$dstdir/_rm.$$_\n\n    # Trap to clean up those temp files at exit.\n    trap 'ret=$?; rm -f \"$dsttmp\" \"$rmtmp\" && exit $ret' 0\n\n    # Copy the file name to the temp name.\n    (umask $cp_umask && $doit_exec $cpprog \"$src\" \"$dsttmp\") &&\n\n    # and set any options; do chmod last to preserve setuid bits.\n    #\n    # If any of these fail, we abort the whole thing.  If we want to\n    # ignore errors from any of these, just make sure not to ignore\n    # errors from the above \"$doit $cpprog $src $dsttmp\" command.\n    #\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dsttmp\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dsttmp\"; } &&\n    { test -z \"$stripcmd\" || $doit $stripcmd \"$dsttmp\"; } &&\n    { test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dsttmp\"; } &&\n\n    # If -C, don't bother to copy if it wouldn't change the file.\n    if $copy_on_change &&\n       old=`LC_ALL=C ls -dlL \"$dst\"\t2>/dev/null` &&\n       new=`LC_ALL=C ls -dlL \"$dsttmp\"\t2>/dev/null` &&\n\n       eval \"$initialize_posix_glob\" &&\n       $posix_glob set -f &&\n       set X $old && old=:$2:$4:$5:$6 &&\n       set X $new && new=:$2:$4:$5:$6 &&\n       $posix_glob set +f &&\n\n       test \"$old\" = \"$new\" &&\n       $cmpprog \"$dst\" \"$dsttmp\" >/dev/null 2>&1\n    then\n      rm -f \"$dsttmp\"\n    else\n      # Rename the file to the real destination.\n      $doit $mvcmd -f \"$dsttmp\" \"$dst\" 2>/dev/null ||\n\n      # The rename failed, perhaps because mv can't rename something else\n      # to itself, or perhaps because mv is so ancient that it does not\n      # support -f.\n      {\n\t# Now remove or move aside any old file at destination location.\n\t# We try this two ways since rm can't unlink itself on some\n\t# systems and the destination file might be busy for other\n\t# reasons.  In this case, the final cleanup might fail but the new\n\t# file should still install successfully.\n\t{\n\t  test ! -f \"$dst\" ||\n\t  $doit $rmcmd -f \"$dst\" 2>/dev/null ||\n\t  { $doit $mvcmd -f \"$dst\" \"$rmtmp\" 2>/dev/null &&\n\t    { $doit $rmcmd -f \"$rmtmp\" 2>/dev/null; :; }\n\t  } ||\n\t  { echo \"$0: cannot unlink or rename $dst\" >&2\n\t    (exit 1); exit 1\n\t  }\n\t} &&\n\n\t# Now rename the file to the real destination.\n\t$doit $mvcmd \"$dsttmp\" \"$dst\"\n      }\n    fi || exit 1\n\n    trap '' 0\n  fi\ndone\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/auto/ltmain.sh",
    "content": "\n# libtool (GNU libtool) 2.4.2\n# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996\n\n# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,\n# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.\n# This is free software; see the source for copying conditions.  There is NO\n# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n# GNU Libtool is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# As a special exception to the GNU General Public License,\n# if you distribute this file as part of a program or library that\n# is built using GNU Libtool, you may include this file under the\n# same distribution terms that you use for the rest of that program.\n#\n# GNU Libtool is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with GNU Libtool; see the file COPYING.  If not, a copy\n# can be downloaded from http://www.gnu.org/licenses/gpl.html,\n# or obtained by writing to the Free Software Foundation, Inc.,\n# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\n# Usage: $progname [OPTION]... [MODE-ARG]...\n#\n# Provide generalized library-building support services.\n#\n#       --config             show all configuration variables\n#       --debug              enable verbose shell tracing\n#   -n, --dry-run            display commands without modifying any files\n#       --features           display basic configuration information and exit\n#       --mode=MODE          use operation mode MODE\n#       --preserve-dup-deps  don't remove duplicate dependency libraries\n#       --quiet, --silent    don't print informational messages\n#       --no-quiet, --no-silent\n#                            print informational messages (default)\n#       --no-warn            don't display warning messages\n#       --tag=TAG            use configuration variables from tag TAG\n#   -v, --verbose            print more informational messages than default\n#       --no-verbose         don't print the extra informational messages\n#       --version            print version information\n#   -h, --help, --help-all   print short, long, or detailed help message\n#\n# MODE must be one of the following:\n#\n#         clean              remove files from the build directory\n#         compile            compile a source file into a libtool object\n#         execute            automatically set library path, then run a program\n#         finish             complete the installation of libtool libraries\n#         install            install libraries or executables\n#         link               create a library or an executable\n#         uninstall          remove libraries from an installed directory\n#\n# MODE-ARGS vary depending on the MODE.  When passed as first option,\n# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.\n# Try `$progname --help --mode=MODE' for a more detailed description of MODE.\n#\n# When reporting a bug, please describe a test case to reproduce it and\n# include the following information:\n#\n#         host-triplet:\t$host\n#         shell:\t\t$SHELL\n#         compiler:\t\t$LTCC\n#         compiler flags:\t\t$LTCFLAGS\n#         linker:\t\t$LD (gnu? $with_gnu_ld)\n#         $progname:\t(GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1\n#         automake:\t$automake_version\n#         autoconf:\t$autoconf_version\n#\n# Report bugs to <bug-libtool@gnu.org>.\n# GNU libtool home page: <http://www.gnu.org/software/libtool/>.\n# General help using GNU software: <http://www.gnu.org/gethelp/>.\n\nPROGRAM=libtool\nPACKAGE=libtool\nVERSION=\"2.4.2 Debian-2.4.2-1.7ubuntu1\"\nTIMESTAMP=\"\"\npackage_revision=1.3337\n\n# Be Bourne compatible\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Zsh 3.x and 4.x performs word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac\nfi\nBIN_SH=xpg4; export BIN_SH # for Tru64\nDUALCASE=1; export DUALCASE # for MKS sh\n\n# A function that is used when there is no print builtin or printf.\nfunc_fallback_echo ()\n{\n  eval 'cat <<_LTECHO_EOF\n$1\n_LTECHO_EOF'\n}\n\n# NLS nuisances: We save the old values to restore during execute mode.\nlt_user_locale=\nlt_safe_locale=\nfor lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES\ndo\n  eval \"if test \\\"\\${$lt_var+set}\\\" = set; then\n          save_$lt_var=\\$$lt_var\n          $lt_var=C\n\t  export $lt_var\n\t  lt_user_locale=\\\"$lt_var=\\\\\\$save_\\$lt_var; \\$lt_user_locale\\\"\n\t  lt_safe_locale=\\\"$lt_var=C; \\$lt_safe_locale\\\"\n\tfi\"\ndone\nLC_ALL=C\nLANGUAGE=C\nexport LANGUAGE LC_ALL\n\n$lt_unset CDPATH\n\n\n# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh\n# is ksh but when the shell is invoked as \"sh\" and the current value of\n# the _XPG environment variable is not equal to 1 (one), the special\n# positional parameter $0, within a function call, is the name of the\n# function.\nprogpath=\"$0\"\n\n\n\n: ${CP=\"cp -f\"}\ntest \"${ECHO+set}\" = set || ECHO=${as_echo-'printf %s\\n'}\n: ${MAKE=\"make\"}\n: ${MKDIR=\"mkdir\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n: ${SHELL=\"${CONFIG_SHELL-/bin/sh}\"}\n: ${Xsed=\"$SED -e 1s/^X//\"}\n\n# Global variables:\nEXIT_SUCCESS=0\nEXIT_FAILURE=1\nEXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.\nEXIT_SKIP=77\t  # $? = 77 is used to indicate a skipped test to automake.\n\nexit_status=$EXIT_SUCCESS\n\n# Make sure IFS has a sensible default\nlt_nl='\n'\nIFS=\" \t$lt_nl\"\n\ndirname=\"s,/[^/]*$,,\"\nbasename=\"s,^.*/,,\"\n\n# func_dirname file append nondir_replacement\n# Compute the dirname of FILE.  If nonempty, add APPEND to the result,\n# otherwise set result to NONDIR_REPLACEMENT.\nfunc_dirname ()\n{\n    func_dirname_result=`$ECHO \"${1}\" | $SED \"$dirname\"`\n    if test \"X$func_dirname_result\" = \"X${1}\"; then\n      func_dirname_result=\"${3}\"\n    else\n      func_dirname_result=\"$func_dirname_result${2}\"\n    fi\n} # func_dirname may be replaced by extended shell implementation\n\n\n# func_basename file\nfunc_basename ()\n{\n    func_basename_result=`$ECHO \"${1}\" | $SED \"$basename\"`\n} # func_basename may be replaced by extended shell implementation\n\n\n# func_dirname_and_basename file append nondir_replacement\n# perform func_basename and func_dirname in a single function\n# call:\n#   dirname:  Compute the dirname of FILE.  If nonempty,\n#             add APPEND to the result, otherwise set result\n#             to NONDIR_REPLACEMENT.\n#             value returned in \"$func_dirname_result\"\n#   basename: Compute filename of FILE.\n#             value retuned in \"$func_basename_result\"\n# Implementation must be kept synchronized with func_dirname\n# and func_basename. For efficiency, we do not delegate to\n# those functions but instead duplicate the functionality here.\nfunc_dirname_and_basename ()\n{\n    # Extract subdirectory from the argument.\n    func_dirname_result=`$ECHO \"${1}\" | $SED -e \"$dirname\"`\n    if test \"X$func_dirname_result\" = \"X${1}\"; then\n      func_dirname_result=\"${3}\"\n    else\n      func_dirname_result=\"$func_dirname_result${2}\"\n    fi\n    func_basename_result=`$ECHO \"${1}\" | $SED -e \"$basename\"`\n} # func_dirname_and_basename may be replaced by extended shell implementation\n\n\n# func_stripname prefix suffix name\n# strip PREFIX and SUFFIX off of NAME.\n# PREFIX and SUFFIX must not contain globbing or regex special\n# characters, hashes, percent signs, but SUFFIX may contain a leading\n# dot (in which case that matches only a dot).\n# func_strip_suffix prefix name\nfunc_stripname ()\n{\n    case ${2} in\n      .*) func_stripname_result=`$ECHO \"${3}\" | $SED \"s%^${1}%%; s%\\\\\\\\${2}\\$%%\"`;;\n      *)  func_stripname_result=`$ECHO \"${3}\" | $SED \"s%^${1}%%; s%${2}\\$%%\"`;;\n    esac\n} # func_stripname may be replaced by extended shell implementation\n\n\n# These SED scripts presuppose an absolute path with a trailing slash.\npathcar='s,^/\\([^/]*\\).*$,\\1,'\npathcdr='s,^/[^/]*,,'\nremovedotparts=':dotsl\n\t\ts@/\\./@/@g\n\t\tt dotsl\n\t\ts,/\\.$,/,'\ncollapseslashes='s@/\\{1,\\}@/@g'\nfinalslash='s,/*$,/,'\n\n# func_normal_abspath PATH\n# Remove doubled-up and trailing slashes, \".\" path components,\n# and cancel out any \"..\" path components in PATH after making\n# it an absolute path.\n#             value returned in \"$func_normal_abspath_result\"\nfunc_normal_abspath ()\n{\n  # Start from root dir and reassemble the path.\n  func_normal_abspath_result=\n  func_normal_abspath_tpath=$1\n  func_normal_abspath_altnamespace=\n  case $func_normal_abspath_tpath in\n    \"\")\n      # Empty path, that just means $cwd.\n      func_stripname '' '/' \"`pwd`\"\n      func_normal_abspath_result=$func_stripname_result\n      return\n    ;;\n    # The next three entries are used to spot a run of precisely\n    # two leading slashes without using negated character classes;\n    # we take advantage of case's first-match behaviour.\n    ///*)\n      # Unusual form of absolute path, do nothing.\n    ;;\n    //*)\n      # Not necessarily an ordinary path; POSIX reserves leading '//'\n      # and for example Cygwin uses it to access remote file shares\n      # over CIFS/SMB, so we conserve a leading double slash if found.\n      func_normal_abspath_altnamespace=/\n    ;;\n    /*)\n      # Absolute path, do nothing.\n    ;;\n    *)\n      # Relative path, prepend $cwd.\n      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath\n    ;;\n  esac\n  # Cancel out all the simple stuff to save iterations.  We also want\n  # the path to end with a slash for ease of parsing, so make sure\n  # there is one (and only one) here.\n  func_normal_abspath_tpath=`$ECHO \"$func_normal_abspath_tpath\" | $SED \\\n        -e \"$removedotparts\" -e \"$collapseslashes\" -e \"$finalslash\"`\n  while :; do\n    # Processed it all yet?\n    if test \"$func_normal_abspath_tpath\" = / ; then\n      # If we ascended to the root using \"..\" the result may be empty now.\n      if test -z \"$func_normal_abspath_result\" ; then\n        func_normal_abspath_result=/\n      fi\n      break\n    fi\n    func_normal_abspath_tcomponent=`$ECHO \"$func_normal_abspath_tpath\" | $SED \\\n        -e \"$pathcar\"`\n    func_normal_abspath_tpath=`$ECHO \"$func_normal_abspath_tpath\" | $SED \\\n        -e \"$pathcdr\"`\n    # Figure out what to do with it\n    case $func_normal_abspath_tcomponent in\n      \"\")\n        # Trailing empty path component, ignore it.\n      ;;\n      ..)\n        # Parent dir; strip last assembled component from result.\n        func_dirname \"$func_normal_abspath_result\"\n        func_normal_abspath_result=$func_dirname_result\n      ;;\n      *)\n        # Actual path component, append it.\n        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent\n      ;;\n    esac\n  done\n  # Restore leading double-slash if one was found on entry.\n  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result\n}\n\n# func_relative_path SRCDIR DSTDIR\n# generates a relative path from SRCDIR to DSTDIR, with a trailing\n# slash if non-empty, suitable for immediately appending a filename\n# without needing to append a separator.\n#             value returned in \"$func_relative_path_result\"\nfunc_relative_path ()\n{\n  func_relative_path_result=\n  func_normal_abspath \"$1\"\n  func_relative_path_tlibdir=$func_normal_abspath_result\n  func_normal_abspath \"$2\"\n  func_relative_path_tbindir=$func_normal_abspath_result\n\n  # Ascend the tree starting from libdir\n  while :; do\n    # check if we have found a prefix of bindir\n    case $func_relative_path_tbindir in\n      $func_relative_path_tlibdir)\n        # found an exact match\n        func_relative_path_tcancelled=\n        break\n        ;;\n      $func_relative_path_tlibdir*)\n        # found a matching prefix\n        func_stripname \"$func_relative_path_tlibdir\" '' \"$func_relative_path_tbindir\"\n        func_relative_path_tcancelled=$func_stripname_result\n        if test -z \"$func_relative_path_result\"; then\n          func_relative_path_result=.\n        fi\n        break\n        ;;\n      *)\n        func_dirname $func_relative_path_tlibdir\n        func_relative_path_tlibdir=${func_dirname_result}\n        if test \"x$func_relative_path_tlibdir\" = x ; then\n          # Have to descend all the way to the root!\n          func_relative_path_result=../$func_relative_path_result\n          func_relative_path_tcancelled=$func_relative_path_tbindir\n          break\n        fi\n        func_relative_path_result=../$func_relative_path_result\n        ;;\n    esac\n  done\n\n  # Now calculate path; take care to avoid doubling-up slashes.\n  func_stripname '' '/' \"$func_relative_path_result\"\n  func_relative_path_result=$func_stripname_result\n  func_stripname '/' '/' \"$func_relative_path_tcancelled\"\n  if test \"x$func_stripname_result\" != x ; then\n    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}\n  fi\n\n  # Normalisation. If bindir is libdir, return empty string,\n  # else relative path ending with a slash; either way, target\n  # file name can be directly appended.\n  if test ! -z \"$func_relative_path_result\"; then\n    func_stripname './' '' \"$func_relative_path_result/\"\n    func_relative_path_result=$func_stripname_result\n  fi\n}\n\n# The name of this program:\nfunc_dirname_and_basename \"$progpath\"\nprogname=$func_basename_result\n\n# Make sure we have an absolute path for reexecution:\ncase $progpath in\n  [\\\\/]*|[A-Za-z]:\\\\*) ;;\n  *[\\\\/]*)\n     progdir=$func_dirname_result\n     progdir=`cd \"$progdir\" && pwd`\n     progpath=\"$progdir/$progname\"\n     ;;\n  *)\n     save_IFS=\"$IFS\"\n     IFS=${PATH_SEPARATOR-:}\n     for progdir in $PATH; do\n       IFS=\"$save_IFS\"\n       test -x \"$progdir/$progname\" && break\n     done\n     IFS=\"$save_IFS\"\n     test -n \"$progdir\" || progdir=`pwd`\n     progpath=\"$progdir/$progname\"\n     ;;\nesac\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nXsed=\"${SED}\"' -e 1s/^X//'\nsed_quote_subst='s/\\([`\"$\\\\]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([\"`\\\\]\\)/\\\\\\1/g'\n\n# Sed substitution that turns a string into a regex matching for the\n# string literally.\nsed_make_literal_regex='s,[].[^$\\\\*\\/],\\\\&,g'\n\n# Sed substitution that converts a w32 file name or path\n# which contains forward slashes, into one that contains\n# (escaped) backslashes.  A very naive implementation.\nlt_sed_naive_backslashify='s|\\\\\\\\*|\\\\|g;s|/|\\\\|g;s|\\\\|\\\\\\\\|g'\n\n# Re-`\\' parameter expansions in output of double_quote_subst that were\n# `\\'-ed in input to the same.  If an odd number of `\\' preceded a '$'\n# in input to double_quote_subst, that '$' was protected from expansion.\n# Since each input `\\' is now two `\\'s, look for any number of runs of\n# four `\\'s followed by two `\\'s and then a '$'.  `\\' that '$'.\nbs='\\\\'\nbs2='\\\\\\\\'\nbs4='\\\\\\\\\\\\\\\\'\ndollar='\\$'\nsed_double_backslash=\"\\\n  s/$bs4/&\\\\\n/g\n  s/^$bs2$dollar/$bs&/\n  s/\\\\([^$bs]\\\\)$bs2$dollar/\\\\1$bs2$bs$dollar/g\n  s/\\n//g\"\n\n# Standard options:\nopt_dry_run=false\nopt_help=false\nopt_quiet=false\nopt_verbose=false\nopt_warning=:\n\n# func_echo arg...\n# Echo program name prefixed message, along with the current mode\n# name if it has been set yet.\nfunc_echo ()\n{\n    $ECHO \"$progname: ${opt_mode+$opt_mode: }$*\"\n}\n\n# func_verbose arg...\n# Echo program name prefixed message in verbose mode only.\nfunc_verbose ()\n{\n    $opt_verbose && func_echo ${1+\"$@\"}\n\n    # A bug in bash halts the script if the last line of a function\n    # fails when set -e is in force, so we need another command to\n    # work around that:\n    :\n}\n\n# func_echo_all arg...\n# Invoke $ECHO with all args, space-separated.\nfunc_echo_all ()\n{\n    $ECHO \"$*\"\n}\n\n# func_error arg...\n# Echo program name prefixed message to standard error.\nfunc_error ()\n{\n    $ECHO \"$progname: ${opt_mode+$opt_mode: }\"${1+\"$@\"} 1>&2\n}\n\n# func_warning arg...\n# Echo program name prefixed warning message to standard error.\nfunc_warning ()\n{\n    $opt_warning && $ECHO \"$progname: ${opt_mode+$opt_mode: }warning: \"${1+\"$@\"} 1>&2\n\n    # bash bug again:\n    :\n}\n\n# func_fatal_error arg...\n# Echo program name prefixed message to standard error, and exit.\nfunc_fatal_error ()\n{\n    func_error ${1+\"$@\"}\n    exit $EXIT_FAILURE\n}\n\n# func_fatal_help arg...\n# Echo program name prefixed message to standard error, followed by\n# a help hint, and exit.\nfunc_fatal_help ()\n{\n    func_error ${1+\"$@\"}\n    func_fatal_error \"$help\"\n}\nhelp=\"Try \\`$progname --help' for more information.\"  ## default\n\n\n# func_grep expression filename\n# Check whether EXPRESSION matches any line of FILENAME, without output.\nfunc_grep ()\n{\n    $GREP \"$1\" \"$2\" >/dev/null 2>&1\n}\n\n\n# func_mkdir_p directory-path\n# Make sure the entire path to DIRECTORY-PATH is available.\nfunc_mkdir_p ()\n{\n    my_directory_path=\"$1\"\n    my_dir_list=\n\n    if test -n \"$my_directory_path\" && test \"$opt_dry_run\" != \":\"; then\n\n      # Protect directory names starting with `-'\n      case $my_directory_path in\n        -*) my_directory_path=\"./$my_directory_path\" ;;\n      esac\n\n      # While some portion of DIR does not yet exist...\n      while test ! -d \"$my_directory_path\"; do\n        # ...make a list in topmost first order.  Use a colon delimited\n\t# list incase some portion of path contains whitespace.\n        my_dir_list=\"$my_directory_path:$my_dir_list\"\n\n        # If the last portion added has no slash in it, the list is done\n        case $my_directory_path in */*) ;; *) break ;; esac\n\n        # ...otherwise throw away the child directory and loop\n        my_directory_path=`$ECHO \"$my_directory_path\" | $SED -e \"$dirname\"`\n      done\n      my_dir_list=`$ECHO \"$my_dir_list\" | $SED 's,:*$,,'`\n\n      save_mkdir_p_IFS=\"$IFS\"; IFS=':'\n      for my_dir in $my_dir_list; do\n\tIFS=\"$save_mkdir_p_IFS\"\n        # mkdir can fail with a `File exist' error if two processes\n        # try to create one of the directories concurrently.  Don't\n        # stop in that case!\n        $MKDIR \"$my_dir\" 2>/dev/null || :\n      done\n      IFS=\"$save_mkdir_p_IFS\"\n\n      # Bail out if we (or some other process) failed to create a directory.\n      test -d \"$my_directory_path\" || \\\n        func_fatal_error \"Failed to create \\`$1'\"\n    fi\n}\n\n\n# func_mktempdir [string]\n# Make a temporary directory that won't clash with other running\n# libtool processes, and avoids race conditions if possible.  If\n# given, STRING is the basename for that directory.\nfunc_mktempdir ()\n{\n    my_template=\"${TMPDIR-/tmp}/${1-$progname}\"\n\n    if test \"$opt_dry_run\" = \":\"; then\n      # Return a directory name, but don't create it in dry-run mode\n      my_tmpdir=\"${my_template}-$$\"\n    else\n\n      # If mktemp works, use that first and foremost\n      my_tmpdir=`mktemp -d \"${my_template}-XXXXXXXX\" 2>/dev/null`\n\n      if test ! -d \"$my_tmpdir\"; then\n        # Failing that, at least try and use $RANDOM to avoid a race\n        my_tmpdir=\"${my_template}-${RANDOM-0}$$\"\n\n        save_mktempdir_umask=`umask`\n        umask 0077\n        $MKDIR \"$my_tmpdir\"\n        umask $save_mktempdir_umask\n      fi\n\n      # If we're not in dry-run mode, bomb out on failure\n      test -d \"$my_tmpdir\" || \\\n        func_fatal_error \"cannot create temporary directory \\`$my_tmpdir'\"\n    fi\n\n    $ECHO \"$my_tmpdir\"\n}\n\n\n# func_quote_for_eval arg\n# Aesthetically quote ARG to be evaled later.\n# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT\n# is double-quoted, suitable for a subsequent eval, whereas\n# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters\n# which are still active within double quotes backslashified.\nfunc_quote_for_eval ()\n{\n    case $1 in\n      *[\\\\\\`\\\"\\$]*)\n\tfunc_quote_for_eval_unquoted_result=`$ECHO \"$1\" | $SED \"$sed_quote_subst\"` ;;\n      *)\n        func_quote_for_eval_unquoted_result=\"$1\" ;;\n    esac\n\n    case $func_quote_for_eval_unquoted_result in\n      # Double-quote args containing shell metacharacters to delay\n      # word splitting, command substitution and and variable\n      # expansion for a subsequent eval.\n      # Many Bourne shells cannot handle close brackets correctly\n      # in scan sets, so we specify it separately.\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n        func_quote_for_eval_result=\"\\\"$func_quote_for_eval_unquoted_result\\\"\"\n        ;;\n      *)\n        func_quote_for_eval_result=\"$func_quote_for_eval_unquoted_result\"\n    esac\n}\n\n\n# func_quote_for_expand arg\n# Aesthetically quote ARG to be evaled later; same as above,\n# but do not quote variable references.\nfunc_quote_for_expand ()\n{\n    case $1 in\n      *[\\\\\\`\\\"]*)\n\tmy_arg=`$ECHO \"$1\" | $SED \\\n\t    -e \"$double_quote_subst\" -e \"$sed_double_backslash\"` ;;\n      *)\n        my_arg=\"$1\" ;;\n    esac\n\n    case $my_arg in\n      # Double-quote args containing shell metacharacters to delay\n      # word splitting and command substitution for a subsequent eval.\n      # Many Bourne shells cannot handle close brackets correctly\n      # in scan sets, so we specify it separately.\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n        my_arg=\"\\\"$my_arg\\\"\"\n        ;;\n    esac\n\n    func_quote_for_expand_result=\"$my_arg\"\n}\n\n\n# func_show_eval cmd [fail_exp]\n# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is\n# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP\n# is given, then evaluate it.\nfunc_show_eval ()\n{\n    my_cmd=\"$1\"\n    my_fail_exp=\"${2-:}\"\n\n    ${opt_silent-false} || {\n      func_quote_for_expand \"$my_cmd\"\n      eval \"func_echo $func_quote_for_expand_result\"\n    }\n\n    if ${opt_dry_run-false}; then :; else\n      eval \"$my_cmd\"\n      my_status=$?\n      if test \"$my_status\" -eq 0; then :; else\n\teval \"(exit $my_status); $my_fail_exp\"\n      fi\n    fi\n}\n\n\n# func_show_eval_locale cmd [fail_exp]\n# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is\n# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP\n# is given, then evaluate it.  Use the saved locale for evaluation.\nfunc_show_eval_locale ()\n{\n    my_cmd=\"$1\"\n    my_fail_exp=\"${2-:}\"\n\n    ${opt_silent-false} || {\n      func_quote_for_expand \"$my_cmd\"\n      eval \"func_echo $func_quote_for_expand_result\"\n    }\n\n    if ${opt_dry_run-false}; then :; else\n      eval \"$lt_user_locale\n\t    $my_cmd\"\n      my_status=$?\n      eval \"$lt_safe_locale\"\n      if test \"$my_status\" -eq 0; then :; else\n\teval \"(exit $my_status); $my_fail_exp\"\n      fi\n    fi\n}\n\n# func_tr_sh\n# Turn $1 into a string suitable for a shell variable name.\n# Result is stored in $func_tr_sh_result.  All characters\n# not in the set a-zA-Z0-9_ are replaced with '_'. Further,\n# if $1 begins with a digit, a '_' is prepended as well.\nfunc_tr_sh ()\n{\n  case $1 in\n  [0-9]* | *[!a-zA-Z0-9_]*)\n    func_tr_sh_result=`$ECHO \"$1\" | $SED 's/^\\([0-9]\\)/_\\1/; s/[^a-zA-Z0-9_]/_/g'`\n    ;;\n  * )\n    func_tr_sh_result=$1\n    ;;\n  esac\n}\n\n\n# func_version\n# Echo version message to standard output and exit.\nfunc_version ()\n{\n    $opt_debug\n\n    $SED -n '/(C)/!b go\n\t:more\n\t/\\./!{\n\t  N\n\t  s/\\n# / /\n\t  b more\n\t}\n\t:go\n\t/^# '$PROGRAM' (GNU /,/# warranty; / {\n        s/^# //\n\ts/^# *$//\n        s/\\((C)\\)[ 0-9,-]*\\( [1-9][0-9]*\\)/\\1\\2/\n        p\n     }' < \"$progpath\"\n     exit $?\n}\n\n# func_usage\n# Echo short help message to standard output and exit.\nfunc_usage ()\n{\n    $opt_debug\n\n    $SED -n '/^# Usage:/,/^#  *.*--help/ {\n        s/^# //\n\ts/^# *$//\n\ts/\\$progname/'$progname'/\n\tp\n    }' < \"$progpath\"\n    echo\n    $ECHO \"run \\`$progname --help | more' for full usage\"\n    exit $?\n}\n\n# func_help [NOEXIT]\n# Echo long help message to standard output and exit,\n# unless 'noexit' is passed as argument.\nfunc_help ()\n{\n    $opt_debug\n\n    $SED -n '/^# Usage:/,/# Report bugs to/ {\n\t:print\n        s/^# //\n\ts/^# *$//\n\ts*\\$progname*'$progname'*\n\ts*\\$host*'\"$host\"'*\n\ts*\\$SHELL*'\"$SHELL\"'*\n\ts*\\$LTCC*'\"$LTCC\"'*\n\ts*\\$LTCFLAGS*'\"$LTCFLAGS\"'*\n\ts*\\$LD*'\"$LD\"'*\n\ts/\\$with_gnu_ld/'\"$with_gnu_ld\"'/\n\ts/\\$automake_version/'\"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`\"'/\n\ts/\\$autoconf_version/'\"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`\"'/\n\tp\n\td\n     }\n     /^# .* home page:/b print\n     /^# General help using/b print\n     ' < \"$progpath\"\n    ret=$?\n    if test -z \"$1\"; then\n      exit $ret\n    fi\n}\n\n# func_missing_arg argname\n# Echo program name prefixed message to standard error and set global\n# exit_cmd.\nfunc_missing_arg ()\n{\n    $opt_debug\n\n    func_error \"missing argument for $1.\"\n    exit_cmd=exit\n}\n\n\n# func_split_short_opt shortopt\n# Set func_split_short_opt_name and func_split_short_opt_arg shell\n# variables after splitting SHORTOPT after the 2nd character.\nfunc_split_short_opt ()\n{\n    my_sed_short_opt='1s/^\\(..\\).*$/\\1/;q'\n    my_sed_short_rest='1s/^..\\(.*\\)$/\\1/;q'\n\n    func_split_short_opt_name=`$ECHO \"$1\" | $SED \"$my_sed_short_opt\"`\n    func_split_short_opt_arg=`$ECHO \"$1\" | $SED \"$my_sed_short_rest\"`\n} # func_split_short_opt may be replaced by extended shell implementation\n\n\n# func_split_long_opt longopt\n# Set func_split_long_opt_name and func_split_long_opt_arg shell\n# variables after splitting LONGOPT at the `=' sign.\nfunc_split_long_opt ()\n{\n    my_sed_long_opt='1s/^\\(--[^=]*\\)=.*/\\1/;q'\n    my_sed_long_arg='1s/^--[^=]*=//'\n\n    func_split_long_opt_name=`$ECHO \"$1\" | $SED \"$my_sed_long_opt\"`\n    func_split_long_opt_arg=`$ECHO \"$1\" | $SED \"$my_sed_long_arg\"`\n} # func_split_long_opt may be replaced by extended shell implementation\n\nexit_cmd=:\n\n\n\n\n\nmagic=\"%%%MAGIC variable%%%\"\nmagic_exe=\"%%%MAGIC EXE variable%%%\"\n\n# Global variables.\nnonopt=\npreserve_args=\nlo2o=\"s/\\\\.lo\\$/.${objext}/\"\no2lo=\"s/\\\\.${objext}\\$/.lo/\"\nextracted_archives=\nextracted_serial=0\n\n# If this variable is set in any of the actions, the command in it\n# will be execed at the end.  This prevents here-documents from being\n# left over by shells.\nexec_cmd=\n\n# func_append var value\n# Append VALUE to the end of shell variable VAR.\nfunc_append ()\n{\n    eval \"${1}=\\$${1}\\${2}\"\n} # func_append may be replaced by extended shell implementation\n\n# func_append_quoted var value\n# Quote VALUE and append to the end of shell variable VAR, separated\n# by a space.\nfunc_append_quoted ()\n{\n    func_quote_for_eval \"${2}\"\n    eval \"${1}=\\$${1}\\\\ \\$func_quote_for_eval_result\"\n} # func_append_quoted may be replaced by extended shell implementation\n\n\n# func_arith arithmetic-term...\nfunc_arith ()\n{\n    func_arith_result=`expr \"${@}\"`\n} # func_arith may be replaced by extended shell implementation\n\n\n# func_len string\n# STRING may not start with a hyphen.\nfunc_len ()\n{\n    func_len_result=`expr \"${1}\" : \".*\" 2>/dev/null || echo $max_cmd_len`\n} # func_len may be replaced by extended shell implementation\n\n\n# func_lo2o object\nfunc_lo2o ()\n{\n    func_lo2o_result=`$ECHO \"${1}\" | $SED \"$lo2o\"`\n} # func_lo2o may be replaced by extended shell implementation\n\n\n# func_xform libobj-or-source\nfunc_xform ()\n{\n    func_xform_result=`$ECHO \"${1}\" | $SED 's/\\.[^.]*$/.lo/'`\n} # func_xform may be replaced by extended shell implementation\n\n\n# func_fatal_configuration arg...\n# Echo program name prefixed message to standard error, followed by\n# a configuration failure hint, and exit.\nfunc_fatal_configuration ()\n{\n    func_error ${1+\"$@\"}\n    func_error \"See the $PACKAGE documentation for more information.\"\n    func_fatal_error \"Fatal configuration error.\"\n}\n\n\n# func_config\n# Display the configuration for all the tags in this script.\nfunc_config ()\n{\n    re_begincf='^# ### BEGIN LIBTOOL'\n    re_endcf='^# ### END LIBTOOL'\n\n    # Default configuration.\n    $SED \"1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\\$d\" < \"$progpath\"\n\n    # Now print the configurations for the tags.\n    for tagname in $taglist; do\n      $SED -n \"/$re_begincf TAG CONFIG: $tagname\\$/,/$re_endcf TAG CONFIG: $tagname\\$/p\" < \"$progpath\"\n    done\n\n    exit $?\n}\n\n# func_features\n# Display the features supported by this script.\nfunc_features ()\n{\n    echo \"host: $host\"\n    if test \"$build_libtool_libs\" = yes; then\n      echo \"enable shared libraries\"\n    else\n      echo \"disable shared libraries\"\n    fi\n    if test \"$build_old_libs\" = yes; then\n      echo \"enable static libraries\"\n    else\n      echo \"disable static libraries\"\n    fi\n\n    exit $?\n}\n\n# func_enable_tag tagname\n# Verify that TAGNAME is valid, and either flag an error and exit, or\n# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist\n# variable here.\nfunc_enable_tag ()\n{\n  # Global variable:\n  tagname=\"$1\"\n\n  re_begincf=\"^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\\$\"\n  re_endcf=\"^# ### END LIBTOOL TAG CONFIG: $tagname\\$\"\n  sed_extractcf=\"/$re_begincf/,/$re_endcf/p\"\n\n  # Validate tagname.\n  case $tagname in\n    *[!-_A-Za-z0-9,/]*)\n      func_fatal_error \"invalid tag name: $tagname\"\n      ;;\n  esac\n\n  # Don't test for the \"default\" C tag, as we know it's\n  # there but not specially marked.\n  case $tagname in\n    CC) ;;\n    *)\n      if $GREP \"$re_begincf\" \"$progpath\" >/dev/null 2>&1; then\n\ttaglist=\"$taglist $tagname\"\n\n\t# Evaluate the configuration.  Be careful to quote the path\n\t# and the sed script, to avoid splitting on whitespace, but\n\t# also don't use non-portable quotes within backquotes within\n\t# quotes we have to do it in 2 steps:\n\textractedcf=`$SED -n -e \"$sed_extractcf\" < \"$progpath\"`\n\teval \"$extractedcf\"\n      else\n\tfunc_error \"ignoring unknown tag $tagname\"\n      fi\n      ;;\n  esac\n}\n\n# func_check_version_match\n# Ensure that we are using m4 macros, and libtool script from the same\n# release of libtool.\nfunc_check_version_match ()\n{\n  if test \"$package_revision\" != \"$macro_revision\"; then\n    if test \"$VERSION\" != \"$macro_version\"; then\n      if test -z \"$macro_version\"; then\n        cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the\n$progname: definition of this LT_INIT comes from an older release.\n$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION\n$progname: and run autoconf again.\n_LT_EOF\n      else\n        cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the\n$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.\n$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION\n$progname: and run autoconf again.\n_LT_EOF\n      fi\n    else\n      cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,\n$progname: but the definition of this LT_INIT comes from revision $macro_revision.\n$progname: You should recreate aclocal.m4 with macros from revision $package_revision\n$progname: of $PACKAGE $VERSION and run autoconf again.\n_LT_EOF\n    fi\n\n    exit $EXIT_MISMATCH\n  fi\n}\n\n\n# Shorthand for --mode=foo, only valid as the first argument\ncase $1 in\nclean|clea|cle|cl)\n  shift; set dummy --mode clean ${1+\"$@\"}; shift\n  ;;\ncompile|compil|compi|comp|com|co|c)\n  shift; set dummy --mode compile ${1+\"$@\"}; shift\n  ;;\nexecute|execut|execu|exec|exe|ex|e)\n  shift; set dummy --mode execute ${1+\"$@\"}; shift\n  ;;\nfinish|finis|fini|fin|fi|f)\n  shift; set dummy --mode finish ${1+\"$@\"}; shift\n  ;;\ninstall|instal|insta|inst|ins|in|i)\n  shift; set dummy --mode install ${1+\"$@\"}; shift\n  ;;\nlink|lin|li|l)\n  shift; set dummy --mode link ${1+\"$@\"}; shift\n  ;;\nuninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)\n  shift; set dummy --mode uninstall ${1+\"$@\"}; shift\n  ;;\nesac\n\n\n\n# Option defaults:\nopt_debug=:\nopt_dry_run=false\nopt_config=false\nopt_preserve_dup_deps=false\nopt_features=false\nopt_finish=false\nopt_help=false\nopt_help_all=false\nopt_silent=:\nopt_warning=:\nopt_verbose=:\nopt_silent=false\nopt_verbose=false\n\n\n# Parse options once, thoroughly.  This comes as soon as possible in the\n# script to make things like `--version' happen as quickly as we can.\n{\n  # this just eases exit handling\n  while test $# -gt 0; do\n    opt=\"$1\"\n    shift\n    case $opt in\n      --debug|-x)\topt_debug='set -x'\n\t\t\tfunc_echo \"enabling shell trace mode\"\n\t\t\t$opt_debug\n\t\t\t;;\n      --dry-run|--dryrun|-n)\n\t\t\topt_dry_run=:\n\t\t\t;;\n      --config)\n\t\t\topt_config=:\nfunc_config\n\t\t\t;;\n      --dlopen|-dlopen)\n\t\t\toptarg=\"$1\"\n\t\t\topt_dlopen=\"${opt_dlopen+$opt_dlopen\n}$optarg\"\n\t\t\tshift\n\t\t\t;;\n      --preserve-dup-deps)\n\t\t\topt_preserve_dup_deps=:\n\t\t\t;;\n      --features)\n\t\t\topt_features=:\nfunc_features\n\t\t\t;;\n      --finish)\n\t\t\topt_finish=:\nset dummy --mode finish ${1+\"$@\"}; shift\n\t\t\t;;\n      --help)\n\t\t\topt_help=:\n\t\t\t;;\n      --help-all)\n\t\t\topt_help_all=:\nopt_help=': help-all'\n\t\t\t;;\n      --mode)\n\t\t\ttest $# = 0 && func_missing_arg $opt && break\n\t\t\toptarg=\"$1\"\n\t\t\topt_mode=\"$optarg\"\ncase $optarg in\n  # Valid mode arguments:\n  clean|compile|execute|finish|install|link|relink|uninstall) ;;\n\n  # Catch anything else as an error\n  *) func_error \"invalid argument for $opt\"\n     exit_cmd=exit\n     break\n     ;;\nesac\n\t\t\tshift\n\t\t\t;;\n      --no-silent|--no-quiet)\n\t\t\topt_silent=false\nfunc_append preserve_args \" $opt\"\n\t\t\t;;\n      --no-warning|--no-warn)\n\t\t\topt_warning=false\nfunc_append preserve_args \" $opt\"\n\t\t\t;;\n      --no-verbose)\n\t\t\topt_verbose=false\nfunc_append preserve_args \" $opt\"\n\t\t\t;;\n      --silent|--quiet)\n\t\t\topt_silent=:\nfunc_append preserve_args \" $opt\"\n        opt_verbose=false\n\t\t\t;;\n      --verbose|-v)\n\t\t\topt_verbose=:\nfunc_append preserve_args \" $opt\"\nopt_silent=false\n\t\t\t;;\n      --tag)\n\t\t\ttest $# = 0 && func_missing_arg $opt && break\n\t\t\toptarg=\"$1\"\n\t\t\topt_tag=\"$optarg\"\nfunc_append preserve_args \" $opt $optarg\"\nfunc_enable_tag \"$optarg\"\n\t\t\tshift\n\t\t\t;;\n\n      -\\?|-h)\t\tfunc_usage\t\t\t\t;;\n      --help)\t\tfunc_help\t\t\t\t;;\n      --version)\tfunc_version\t\t\t\t;;\n\n      # Separate optargs to long options:\n      --*=*)\n\t\t\tfunc_split_long_opt \"$opt\"\n\t\t\tset dummy \"$func_split_long_opt_name\" \"$func_split_long_opt_arg\" ${1+\"$@\"}\n\t\t\tshift\n\t\t\t;;\n\n      # Separate non-argument short options:\n      -\\?*|-h*|-n*|-v*)\n\t\t\tfunc_split_short_opt \"$opt\"\n\t\t\tset dummy \"$func_split_short_opt_name\" \"-$func_split_short_opt_arg\" ${1+\"$@\"}\n\t\t\tshift\n\t\t\t;;\n\n      --)\t\tbreak\t\t\t\t\t;;\n      -*)\t\tfunc_fatal_help \"unrecognized option \\`$opt'\" ;;\n      *)\t\tset dummy \"$opt\" ${1+\"$@\"};\tshift; break  ;;\n    esac\n  done\n\n  # Validate options:\n\n  # save first non-option argument\n  if test \"$#\" -gt 0; then\n    nonopt=\"$opt\"\n    shift\n  fi\n\n  # preserve --debug\n  test \"$opt_debug\" = : || func_append preserve_args \" --debug\"\n\n  case $host in\n    *cygwin* | *mingw* | *pw32* | *cegcc*)\n      # don't eliminate duplications in $postdeps and $predeps\n      opt_duplicate_compiler_generated_deps=:\n      ;;\n    *)\n      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps\n      ;;\n  esac\n\n  $opt_help || {\n    # Sanity checks first:\n    func_check_version_match\n\n    if test \"$build_libtool_libs\" != yes && test \"$build_old_libs\" != yes; then\n      func_fatal_configuration \"not configured to build any kind of library\"\n    fi\n\n    # Darwin sucks\n    eval std_shrext=\\\"$shrext_cmds\\\"\n\n    # Only execute mode is allowed to have -dlopen flags.\n    if test -n \"$opt_dlopen\" && test \"$opt_mode\" != execute; then\n      func_error \"unrecognized option \\`-dlopen'\"\n      $ECHO \"$help\" 1>&2\n      exit $EXIT_FAILURE\n    fi\n\n    # Change the help message to a mode-specific one.\n    generic_help=\"$help\"\n    help=\"Try \\`$progname --help --mode=$opt_mode' for more information.\"\n  }\n\n\n  # Bail if the options were screwed\n  $exit_cmd $EXIT_FAILURE\n}\n\n\n\n\n## ----------- ##\n##    Main.    ##\n## ----------- ##\n\n# func_lalib_p file\n# True iff FILE is a libtool `.la' library or `.lo' object file.\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_lalib_p ()\n{\n    test -f \"$1\" &&\n      $SED -e 4q \"$1\" 2>/dev/null \\\n        | $GREP \"^# Generated by .*$PACKAGE\" > /dev/null 2>&1\n}\n\n# func_lalib_unsafe_p file\n# True iff FILE is a libtool `.la' library or `.lo' object file.\n# This function implements the same check as func_lalib_p without\n# resorting to external programs.  To this end, it redirects stdin and\n# closes it afterwards, without saving the original file descriptor.\n# As a safety measure, use it only where a negative result would be\n# fatal anyway.  Works if `file' does not exist.\nfunc_lalib_unsafe_p ()\n{\n    lalib_p=no\n    if test -f \"$1\" && test -r \"$1\" && exec 5<&0 <\"$1\"; then\n\tfor lalib_p_l in 1 2 3 4\n\tdo\n\t    read lalib_p_line\n\t    case \"$lalib_p_line\" in\n\t\t\\#\\ Generated\\ by\\ *$PACKAGE* ) lalib_p=yes; break;;\n\t    esac\n\tdone\n\texec 0<&5 5<&-\n    fi\n    test \"$lalib_p\" = yes\n}\n\n# func_ltwrapper_script_p file\n# True iff FILE is a libtool wrapper script\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_script_p ()\n{\n    func_lalib_p \"$1\"\n}\n\n# func_ltwrapper_executable_p file\n# True iff FILE is a libtool wrapper executable\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_executable_p ()\n{\n    func_ltwrapper_exec_suffix=\n    case $1 in\n    *.exe) ;;\n    *) func_ltwrapper_exec_suffix=.exe ;;\n    esac\n    $GREP \"$magic_exe\" \"$1$func_ltwrapper_exec_suffix\" >/dev/null 2>&1\n}\n\n# func_ltwrapper_scriptname file\n# Assumes file is an ltwrapper_executable\n# uses $file to determine the appropriate filename for a\n# temporary ltwrapper_script.\nfunc_ltwrapper_scriptname ()\n{\n    func_dirname_and_basename \"$1\" \"\" \".\"\n    func_stripname '' '.exe' \"$func_basename_result\"\n    func_ltwrapper_scriptname_result=\"$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper\"\n}\n\n# func_ltwrapper_p file\n# True iff FILE is a libtool wrapper script or wrapper executable\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_p ()\n{\n    func_ltwrapper_script_p \"$1\" || func_ltwrapper_executable_p \"$1\"\n}\n\n\n# func_execute_cmds commands fail_cmd\n# Execute tilde-delimited COMMANDS.\n# If FAIL_CMD is given, eval that upon failure.\n# FAIL_CMD may read-access the current command in variable CMD!\nfunc_execute_cmds ()\n{\n    $opt_debug\n    save_ifs=$IFS; IFS='~'\n    for cmd in $1; do\n      IFS=$save_ifs\n      eval cmd=\\\"$cmd\\\"\n      func_show_eval \"$cmd\" \"${2-:}\"\n    done\n    IFS=$save_ifs\n}\n\n\n# func_source file\n# Source FILE, adding directory component if necessary.\n# Note that it is not necessary on cygwin/mingw to append a dot to\n# FILE even if both FILE and FILE.exe exist: automatic-append-.exe\n# behavior happens only for exec(3), not for open(2)!  Also, sourcing\n# `FILE.' does not work on cygwin managed mounts.\nfunc_source ()\n{\n    $opt_debug\n    case $1 in\n    */* | *\\\\*)\t. \"$1\" ;;\n    *)\t\t. \"./$1\" ;;\n    esac\n}\n\n\n# func_resolve_sysroot PATH\n# Replace a leading = in PATH with a sysroot.  Store the result into\n# func_resolve_sysroot_result\nfunc_resolve_sysroot ()\n{\n  func_resolve_sysroot_result=$1\n  case $func_resolve_sysroot_result in\n  =*)\n    func_stripname '=' '' \"$func_resolve_sysroot_result\"\n    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result\n    ;;\n  esac\n}\n\n# func_replace_sysroot PATH\n# If PATH begins with the sysroot, replace it with = and\n# store the result into func_replace_sysroot_result.\nfunc_replace_sysroot ()\n{\n  case \"$lt_sysroot:$1\" in\n  ?*:\"$lt_sysroot\"*)\n    func_stripname \"$lt_sysroot\" '' \"$1\"\n    func_replace_sysroot_result=\"=$func_stripname_result\"\n    ;;\n  *)\n    # Including no sysroot.\n    func_replace_sysroot_result=$1\n    ;;\n  esac\n}\n\n# func_infer_tag arg\n# Infer tagged configuration to use if any are available and\n# if one wasn't chosen via the \"--tag\" command line option.\n# Only attempt this if the compiler in the base compile\n# command doesn't match the default compiler.\n# arg is usually of the form 'gcc ...'\nfunc_infer_tag ()\n{\n    $opt_debug\n    if test -n \"$available_tags\" && test -z \"$tagname\"; then\n      CC_quoted=\n      for arg in $CC; do\n\tfunc_append_quoted CC_quoted \"$arg\"\n      done\n      CC_expanded=`func_echo_all $CC`\n      CC_quoted_expanded=`func_echo_all $CC_quoted`\n      case $@ in\n      # Blanks in the command may have been stripped by the calling shell,\n      # but not from the CC environment variable when configure was run.\n      \" $CC \"* | \"$CC \"* | \" $CC_expanded \"* | \"$CC_expanded \"* | \\\n      \" $CC_quoted\"* | \"$CC_quoted \"* | \" $CC_quoted_expanded \"* | \"$CC_quoted_expanded \"*) ;;\n      # Blanks at the start of $base_compile will cause this to fail\n      # if we don't check for them as well.\n      *)\n\tfor z in $available_tags; do\n\t  if $GREP \"^# ### BEGIN LIBTOOL TAG CONFIG: $z$\" < \"$progpath\" > /dev/null; then\n\t    # Evaluate the configuration.\n\t    eval \"`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`\"\n\t    CC_quoted=\n\t    for arg in $CC; do\n\t      # Double-quote args containing other shell metacharacters.\n\t      func_append_quoted CC_quoted \"$arg\"\n\t    done\n\t    CC_expanded=`func_echo_all $CC`\n\t    CC_quoted_expanded=`func_echo_all $CC_quoted`\n\t    case \"$@ \" in\n\t    \" $CC \"* | \"$CC \"* | \" $CC_expanded \"* | \"$CC_expanded \"* | \\\n\t    \" $CC_quoted\"* | \"$CC_quoted \"* | \" $CC_quoted_expanded \"* | \"$CC_quoted_expanded \"*)\n\t      # The compiler in the base compile command matches\n\t      # the one in the tagged configuration.\n\t      # Assume this is the tagged configuration we want.\n\t      tagname=$z\n\t      break\n\t      ;;\n\t    esac\n\t  fi\n\tdone\n\t# If $tagname still isn't set, then no tagged configuration\n\t# was found and let the user know that the \"--tag\" command\n\t# line option must be used.\n\tif test -z \"$tagname\"; then\n\t  func_echo \"unable to infer tagged configuration\"\n\t  func_fatal_error \"specify a tag with \\`--tag'\"\n#\telse\n#\t  func_verbose \"using $tagname tagged configuration\"\n\tfi\n\t;;\n      esac\n    fi\n}\n\n\n\n# func_write_libtool_object output_name pic_name nonpic_name\n# Create a libtool object file (analogous to a \".la\" file),\n# but don't create it if we're doing a dry run.\nfunc_write_libtool_object ()\n{\n    write_libobj=${1}\n    if test \"$build_libtool_libs\" = yes; then\n      write_lobj=\\'${2}\\'\n    else\n      write_lobj=none\n    fi\n\n    if test \"$build_old_libs\" = yes; then\n      write_oldobj=\\'${3}\\'\n    else\n      write_oldobj=none\n    fi\n\n    $opt_dry_run || {\n      cat >${write_libobj}T <<EOF\n# $write_libobj - a libtool object file\n# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n#\n# Please DO NOT delete this file!\n# It is necessary for linking the library.\n\n# Name of the PIC object.\npic_object=$write_lobj\n\n# Name of the non-PIC object\nnon_pic_object=$write_oldobj\n\nEOF\n      $MV \"${write_libobj}T\" \"${write_libobj}\"\n    }\n}\n\n\n##################################################\n# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #\n##################################################\n\n# func_convert_core_file_wine_to_w32 ARG\n# Helper function used by file name conversion functions when $build is *nix,\n# and $host is mingw, cygwin, or some other w32 environment. Relies on a\n# correctly configured wine environment available, with the winepath program\n# in $build's $PATH.\n#\n# ARG is the $build file name to be converted to w32 format.\n# Result is available in $func_convert_core_file_wine_to_w32_result, and will\n# be empty on error (or when ARG is empty)\nfunc_convert_core_file_wine_to_w32 ()\n{\n  $opt_debug\n  func_convert_core_file_wine_to_w32_result=\"$1\"\n  if test -n \"$1\"; then\n    # Unfortunately, winepath does not exit with a non-zero error code, so we\n    # are forced to check the contents of stdout. On the other hand, if the\n    # command is not found, the shell will set an exit code of 127 and print\n    # *an error message* to stdout. So we must check for both error code of\n    # zero AND non-empty stdout, which explains the odd construction:\n    func_convert_core_file_wine_to_w32_tmp=`winepath -w \"$1\" 2>/dev/null`\n    if test \"$?\" -eq 0 && test -n \"${func_convert_core_file_wine_to_w32_tmp}\"; then\n      func_convert_core_file_wine_to_w32_result=`$ECHO \"$func_convert_core_file_wine_to_w32_tmp\" |\n        $SED -e \"$lt_sed_naive_backslashify\"`\n    else\n      func_convert_core_file_wine_to_w32_result=\n    fi\n  fi\n}\n# end: func_convert_core_file_wine_to_w32\n\n\n# func_convert_core_path_wine_to_w32 ARG\n# Helper function used by path conversion functions when $build is *nix, and\n# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly\n# configured wine environment available, with the winepath program in $build's\n# $PATH. Assumes ARG has no leading or trailing path separator characters.\n#\n# ARG is path to be converted from $build format to win32.\n# Result is available in $func_convert_core_path_wine_to_w32_result.\n# Unconvertible file (directory) names in ARG are skipped; if no directory names\n# are convertible, then the result may be empty.\nfunc_convert_core_path_wine_to_w32 ()\n{\n  $opt_debug\n  # unfortunately, winepath doesn't convert paths, only file names\n  func_convert_core_path_wine_to_w32_result=\"\"\n  if test -n \"$1\"; then\n    oldIFS=$IFS\n    IFS=:\n    for func_convert_core_path_wine_to_w32_f in $1; do\n      IFS=$oldIFS\n      func_convert_core_file_wine_to_w32 \"$func_convert_core_path_wine_to_w32_f\"\n      if test -n \"$func_convert_core_file_wine_to_w32_result\" ; then\n        if test -z \"$func_convert_core_path_wine_to_w32_result\"; then\n          func_convert_core_path_wine_to_w32_result=\"$func_convert_core_file_wine_to_w32_result\"\n        else\n          func_append func_convert_core_path_wine_to_w32_result \";$func_convert_core_file_wine_to_w32_result\"\n        fi\n      fi\n    done\n    IFS=$oldIFS\n  fi\n}\n# end: func_convert_core_path_wine_to_w32\n\n\n# func_cygpath ARGS...\n# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when\n# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)\n# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or\n# (2), returns the Cygwin file name or path in func_cygpath_result (input\n# file name or path is assumed to be in w32 format, as previously converted\n# from $build's *nix or MSYS format). In case (3), returns the w32 file name\n# or path in func_cygpath_result (input file name or path is assumed to be in\n# Cygwin format). Returns an empty string on error.\n#\n# ARGS are passed to cygpath, with the last one being the file name or path to\n# be converted.\n#\n# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH\n# environment variable; do not put it in $PATH.\nfunc_cygpath ()\n{\n  $opt_debug\n  if test -n \"$LT_CYGPATH\" && test -f \"$LT_CYGPATH\"; then\n    func_cygpath_result=`$LT_CYGPATH \"$@\" 2>/dev/null`\n    if test \"$?\" -ne 0; then\n      # on failure, ensure result is empty\n      func_cygpath_result=\n    fi\n  else\n    func_cygpath_result=\n    func_error \"LT_CYGPATH is empty or specifies non-existent file: \\`$LT_CYGPATH'\"\n  fi\n}\n#end: func_cygpath\n\n\n# func_convert_core_msys_to_w32 ARG\n# Convert file name or path ARG from MSYS format to w32 format.  Return\n# result in func_convert_core_msys_to_w32_result.\nfunc_convert_core_msys_to_w32 ()\n{\n  $opt_debug\n  # awkward: cmd appends spaces to result\n  func_convert_core_msys_to_w32_result=`( cmd //c echo \"$1\" ) 2>/dev/null |\n    $SED -e 's/[ ]*$//' -e \"$lt_sed_naive_backslashify\"`\n}\n#end: func_convert_core_msys_to_w32\n\n\n# func_convert_file_check ARG1 ARG2\n# Verify that ARG1 (a file name in $build format) was converted to $host\n# format in ARG2. Otherwise, emit an error message, but continue (resetting\n# func_to_host_file_result to ARG1).\nfunc_convert_file_check ()\n{\n  $opt_debug\n  if test -z \"$2\" && test -n \"$1\" ; then\n    func_error \"Could not determine host file name corresponding to\"\n    func_error \"  \\`$1'\"\n    func_error \"Continuing, but uninstalled executables may not work.\"\n    # Fallback:\n    func_to_host_file_result=\"$1\"\n  fi\n}\n# end func_convert_file_check\n\n\n# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH\n# Verify that FROM_PATH (a path in $build format) was converted to $host\n# format in TO_PATH. Otherwise, emit an error message, but continue, resetting\n# func_to_host_file_result to a simplistic fallback value (see below).\nfunc_convert_path_check ()\n{\n  $opt_debug\n  if test -z \"$4\" && test -n \"$3\"; then\n    func_error \"Could not determine the host path corresponding to\"\n    func_error \"  \\`$3'\"\n    func_error \"Continuing, but uninstalled executables may not work.\"\n    # Fallback.  This is a deliberately simplistic \"conversion\" and\n    # should not be \"improved\".  See libtool.info.\n    if test \"x$1\" != \"x$2\"; then\n      lt_replace_pathsep_chars=\"s|$1|$2|g\"\n      func_to_host_path_result=`echo \"$3\" |\n        $SED -e \"$lt_replace_pathsep_chars\"`\n    else\n      func_to_host_path_result=\"$3\"\n    fi\n  fi\n}\n# end func_convert_path_check\n\n\n# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG\n# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT\n# and appending REPL if ORIG matches BACKPAT.\nfunc_convert_path_front_back_pathsep ()\n{\n  $opt_debug\n  case $4 in\n  $1 ) func_to_host_path_result=\"$3$func_to_host_path_result\"\n    ;;\n  esac\n  case $4 in\n  $2 ) func_append func_to_host_path_result \"$3\"\n    ;;\n  esac\n}\n# end func_convert_path_front_back_pathsep\n\n\n##################################################\n# $build to $host FILE NAME CONVERSION FUNCTIONS #\n##################################################\n# invoked via `$to_host_file_cmd ARG'\n#\n# In each case, ARG is the path to be converted from $build to $host format.\n# Result will be available in $func_to_host_file_result.\n\n\n# func_to_host_file ARG\n# Converts the file name ARG from $build format to $host format. Return result\n# in func_to_host_file_result.\nfunc_to_host_file ()\n{\n  $opt_debug\n  $to_host_file_cmd \"$1\"\n}\n# end func_to_host_file\n\n\n# func_to_tool_file ARG LAZY\n# converts the file name ARG from $build format to toolchain format. Return\n# result in func_to_tool_file_result.  If the conversion in use is listed\n# in (the comma separated) LAZY, no conversion takes place.\nfunc_to_tool_file ()\n{\n  $opt_debug\n  case ,$2, in\n    *,\"$to_tool_file_cmd\",*)\n      func_to_tool_file_result=$1\n      ;;\n    *)\n      $to_tool_file_cmd \"$1\"\n      func_to_tool_file_result=$func_to_host_file_result\n      ;;\n  esac\n}\n# end func_to_tool_file\n\n\n# func_convert_file_noop ARG\n# Copy ARG to func_to_host_file_result.\nfunc_convert_file_noop ()\n{\n  func_to_host_file_result=\"$1\"\n}\n# end func_convert_file_noop\n\n\n# func_convert_file_msys_to_w32 ARG\n# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic\n# conversion to w32 is not available inside the cwrapper.  Returns result in\n# func_to_host_file_result.\nfunc_convert_file_msys_to_w32 ()\n{\n  $opt_debug\n  func_to_host_file_result=\"$1\"\n  if test -n \"$1\"; then\n    func_convert_core_msys_to_w32 \"$1\"\n    func_to_host_file_result=\"$func_convert_core_msys_to_w32_result\"\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_msys_to_w32\n\n\n# func_convert_file_cygwin_to_w32 ARG\n# Convert file name ARG from Cygwin to w32 format.  Returns result in\n# func_to_host_file_result.\nfunc_convert_file_cygwin_to_w32 ()\n{\n  $opt_debug\n  func_to_host_file_result=\"$1\"\n  if test -n \"$1\"; then\n    # because $build is cygwin, we call \"the\" cygpath in $PATH; no need to use\n    # LT_CYGPATH in this case.\n    func_to_host_file_result=`cygpath -m \"$1\"`\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_cygwin_to_w32\n\n\n# func_convert_file_nix_to_w32 ARG\n# Convert file name ARG from *nix to w32 format.  Requires a wine environment\n# and a working winepath. Returns result in func_to_host_file_result.\nfunc_convert_file_nix_to_w32 ()\n{\n  $opt_debug\n  func_to_host_file_result=\"$1\"\n  if test -n \"$1\"; then\n    func_convert_core_file_wine_to_w32 \"$1\"\n    func_to_host_file_result=\"$func_convert_core_file_wine_to_w32_result\"\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_nix_to_w32\n\n\n# func_convert_file_msys_to_cygwin ARG\n# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.\n# Returns result in func_to_host_file_result.\nfunc_convert_file_msys_to_cygwin ()\n{\n  $opt_debug\n  func_to_host_file_result=\"$1\"\n  if test -n \"$1\"; then\n    func_convert_core_msys_to_w32 \"$1\"\n    func_cygpath -u \"$func_convert_core_msys_to_w32_result\"\n    func_to_host_file_result=\"$func_cygpath_result\"\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_msys_to_cygwin\n\n\n# func_convert_file_nix_to_cygwin ARG\n# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed\n# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result\n# in func_to_host_file_result.\nfunc_convert_file_nix_to_cygwin ()\n{\n  $opt_debug\n  func_to_host_file_result=\"$1\"\n  if test -n \"$1\"; then\n    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.\n    func_convert_core_file_wine_to_w32 \"$1\"\n    func_cygpath -u \"$func_convert_core_file_wine_to_w32_result\"\n    func_to_host_file_result=\"$func_cygpath_result\"\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_nix_to_cygwin\n\n\n#############################################\n# $build to $host PATH CONVERSION FUNCTIONS #\n#############################################\n# invoked via `$to_host_path_cmd ARG'\n#\n# In each case, ARG is the path to be converted from $build to $host format.\n# The result will be available in $func_to_host_path_result.\n#\n# Path separators are also converted from $build format to $host format.  If\n# ARG begins or ends with a path separator character, it is preserved (but\n# converted to $host format) on output.\n#\n# All path conversion functions are named using the following convention:\n#   file name conversion function    : func_convert_file_X_to_Y ()\n#   path conversion function         : func_convert_path_X_to_Y ()\n# where, for any given $build/$host combination the 'X_to_Y' value is the\n# same.  If conversion functions are added for new $build/$host combinations,\n# the two new functions must follow this pattern, or func_init_to_host_path_cmd\n# will break.\n\n\n# func_init_to_host_path_cmd\n# Ensures that function \"pointer\" variable $to_host_path_cmd is set to the\n# appropriate value, based on the value of $to_host_file_cmd.\nto_host_path_cmd=\nfunc_init_to_host_path_cmd ()\n{\n  $opt_debug\n  if test -z \"$to_host_path_cmd\"; then\n    func_stripname 'func_convert_file_' '' \"$to_host_file_cmd\"\n    to_host_path_cmd=\"func_convert_path_${func_stripname_result}\"\n  fi\n}\n\n\n# func_to_host_path ARG\n# Converts the path ARG from $build format to $host format. Return result\n# in func_to_host_path_result.\nfunc_to_host_path ()\n{\n  $opt_debug\n  func_init_to_host_path_cmd\n  $to_host_path_cmd \"$1\"\n}\n# end func_to_host_path\n\n\n# func_convert_path_noop ARG\n# Copy ARG to func_to_host_path_result.\nfunc_convert_path_noop ()\n{\n  func_to_host_path_result=\"$1\"\n}\n# end func_convert_path_noop\n\n\n# func_convert_path_msys_to_w32 ARG\n# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic\n# conversion to w32 is not available inside the cwrapper.  Returns result in\n# func_to_host_path_result.\nfunc_convert_path_msys_to_w32 ()\n{\n  $opt_debug\n  func_to_host_path_result=\"$1\"\n  if test -n \"$1\"; then\n    # Remove leading and trailing path separator characters from ARG.  MSYS\n    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';\n    # and winepath ignores them completely.\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_convert_core_msys_to_w32 \"$func_to_host_path_tmp1\"\n    func_to_host_path_result=\"$func_convert_core_msys_to_w32_result\"\n    func_convert_path_check : \";\" \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" \";\" \"$1\"\n  fi\n}\n# end func_convert_path_msys_to_w32\n\n\n# func_convert_path_cygwin_to_w32 ARG\n# Convert path ARG from Cygwin to w32 format.  Returns result in\n# func_to_host_file_result.\nfunc_convert_path_cygwin_to_w32 ()\n{\n  $opt_debug\n  func_to_host_path_result=\"$1\"\n  if test -n \"$1\"; then\n    # See func_convert_path_msys_to_w32:\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_to_host_path_result=`cygpath -m -p \"$func_to_host_path_tmp1\"`\n    func_convert_path_check : \";\" \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" \";\" \"$1\"\n  fi\n}\n# end func_convert_path_cygwin_to_w32\n\n\n# func_convert_path_nix_to_w32 ARG\n# Convert path ARG from *nix to w32 format.  Requires a wine environment and\n# a working winepath.  Returns result in func_to_host_file_result.\nfunc_convert_path_nix_to_w32 ()\n{\n  $opt_debug\n  func_to_host_path_result=\"$1\"\n  if test -n \"$1\"; then\n    # See func_convert_path_msys_to_w32:\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_convert_core_path_wine_to_w32 \"$func_to_host_path_tmp1\"\n    func_to_host_path_result=\"$func_convert_core_path_wine_to_w32_result\"\n    func_convert_path_check : \";\" \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" \";\" \"$1\"\n  fi\n}\n# end func_convert_path_nix_to_w32\n\n\n# func_convert_path_msys_to_cygwin ARG\n# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.\n# Returns result in func_to_host_file_result.\nfunc_convert_path_msys_to_cygwin ()\n{\n  $opt_debug\n  func_to_host_path_result=\"$1\"\n  if test -n \"$1\"; then\n    # See func_convert_path_msys_to_w32:\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_convert_core_msys_to_w32 \"$func_to_host_path_tmp1\"\n    func_cygpath -u -p \"$func_convert_core_msys_to_w32_result\"\n    func_to_host_path_result=\"$func_cygpath_result\"\n    func_convert_path_check : : \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" : \"$1\"\n  fi\n}\n# end func_convert_path_msys_to_cygwin\n\n\n# func_convert_path_nix_to_cygwin ARG\n# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a\n# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in\n# func_to_host_file_result.\nfunc_convert_path_nix_to_cygwin ()\n{\n  $opt_debug\n  func_to_host_path_result=\"$1\"\n  if test -n \"$1\"; then\n    # Remove leading and trailing path separator characters from\n    # ARG. msys behavior is inconsistent here, cygpath turns them\n    # into '.;' and ';.', and winepath ignores them completely.\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_convert_core_path_wine_to_w32 \"$func_to_host_path_tmp1\"\n    func_cygpath -u -p \"$func_convert_core_path_wine_to_w32_result\"\n    func_to_host_path_result=\"$func_cygpath_result\"\n    func_convert_path_check : : \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" : \"$1\"\n  fi\n}\n# end func_convert_path_nix_to_cygwin\n\n\n# func_mode_compile arg...\nfunc_mode_compile ()\n{\n    $opt_debug\n    # Get the compilation command and the source file.\n    base_compile=\n    srcfile=\"$nonopt\"  #  always keep a non-empty value in \"srcfile\"\n    suppress_opt=yes\n    suppress_output=\n    arg_mode=normal\n    libobj=\n    later=\n    pie_flag=\n\n    for arg\n    do\n      case $arg_mode in\n      arg  )\n\t# do not \"continue\".  Instead, add this to base_compile\n\tlastarg=\"$arg\"\n\targ_mode=normal\n\t;;\n\n      target )\n\tlibobj=\"$arg\"\n\targ_mode=normal\n\tcontinue\n\t;;\n\n      normal )\n\t# Accept any command-line options.\n\tcase $arg in\n\t-o)\n\t  test -n \"$libobj\" && \\\n\t    func_fatal_error \"you cannot specify \\`-o' more than once\"\n\t  arg_mode=target\n\t  continue\n\t  ;;\n\n\t-pie | -fpie | -fPIE)\n          func_append pie_flag \" $arg\"\n\t  continue\n\t  ;;\n\n\t-shared | -static | -prefer-pic | -prefer-non-pic)\n\t  func_append later \" $arg\"\n\t  continue\n\t  ;;\n\n\t-no-suppress)\n\t  suppress_opt=no\n\t  continue\n\t  ;;\n\n\t-Xcompiler)\n\t  arg_mode=arg  #  the next one goes into the \"base_compile\" arg list\n\t  continue      #  The current \"srcfile\" will either be retained or\n\t  ;;            #  replaced later.  I would guess that would be a bug.\n\n\t-Wc,*)\n\t  func_stripname '-Wc,' '' \"$arg\"\n\t  args=$func_stripname_result\n\t  lastarg=\n\t  save_ifs=\"$IFS\"; IFS=','\n\t  for arg in $args; do\n\t    IFS=\"$save_ifs\"\n\t    func_append_quoted lastarg \"$arg\"\n\t  done\n\t  IFS=\"$save_ifs\"\n\t  func_stripname ' ' '' \"$lastarg\"\n\t  lastarg=$func_stripname_result\n\n\t  # Add the arguments to base_compile.\n\t  func_append base_compile \" $lastarg\"\n\t  continue\n\t  ;;\n\n\t*)\n\t  # Accept the current argument as the source file.\n\t  # The previous \"srcfile\" becomes the current argument.\n\t  #\n\t  lastarg=\"$srcfile\"\n\t  srcfile=\"$arg\"\n\t  ;;\n\tesac  #  case $arg\n\t;;\n      esac    #  case $arg_mode\n\n      # Aesthetically quote the previous argument.\n      func_append_quoted base_compile \"$lastarg\"\n    done # for arg\n\n    case $arg_mode in\n    arg)\n      func_fatal_error \"you must specify an argument for -Xcompile\"\n      ;;\n    target)\n      func_fatal_error \"you must specify a target with \\`-o'\"\n      ;;\n    *)\n      # Get the name of the library object.\n      test -z \"$libobj\" && {\n\tfunc_basename \"$srcfile\"\n\tlibobj=\"$func_basename_result\"\n      }\n      ;;\n    esac\n\n    # Recognize several different file suffixes.\n    # If the user specifies -o file.o, it is replaced with file.lo\n    case $libobj in\n    *.[cCFSifmso] | \\\n    *.ada | *.adb | *.ads | *.asm | \\\n    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \\\n    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)\n      func_xform \"$libobj\"\n      libobj=$func_xform_result\n      ;;\n    esac\n\n    case $libobj in\n    *.lo) func_lo2o \"$libobj\"; obj=$func_lo2o_result ;;\n    *)\n      func_fatal_error \"cannot determine name of library object from \\`$libobj'\"\n      ;;\n    esac\n\n    func_infer_tag $base_compile\n\n    for arg in $later; do\n      case $arg in\n      -shared)\n\ttest \"$build_libtool_libs\" != yes && \\\n\t  func_fatal_configuration \"can not build a shared library\"\n\tbuild_old_libs=no\n\tcontinue\n\t;;\n\n      -static)\n\tbuild_libtool_libs=no\n\tbuild_old_libs=yes\n\tcontinue\n\t;;\n\n      -prefer-pic)\n\tpic_mode=yes\n\tcontinue\n\t;;\n\n      -prefer-non-pic)\n\tpic_mode=no\n\tcontinue\n\t;;\n      esac\n    done\n\n    func_quote_for_eval \"$libobj\"\n    test \"X$libobj\" != \"X$func_quote_for_eval_result\" \\\n      && $ECHO \"X$libobj\" | $GREP '[]~#^*{};<>?\"'\"'\"'\t &()|`$[]' \\\n      && func_warning \"libobj name \\`$libobj' may not contain shell special characters.\"\n    func_dirname_and_basename \"$obj\" \"/\" \"\"\n    objname=\"$func_basename_result\"\n    xdir=\"$func_dirname_result\"\n    lobj=${xdir}$objdir/$objname\n\n    test -z \"$base_compile\" && \\\n      func_fatal_help \"you must specify a compilation command\"\n\n    # Delete any leftover library objects.\n    if test \"$build_old_libs\" = yes; then\n      removelist=\"$obj $lobj $libobj ${libobj}T\"\n    else\n      removelist=\"$lobj $libobj ${libobj}T\"\n    fi\n\n    # On Cygwin there's no \"real\" PIC flag so we must build both object types\n    case $host_os in\n    cygwin* | mingw* | pw32* | os2* | cegcc*)\n      pic_mode=default\n      ;;\n    esac\n    if test \"$pic_mode\" = no && test \"$deplibs_check_method\" != pass_all; then\n      # non-PIC code in shared libraries is not supported\n      pic_mode=default\n    fi\n\n    # Calculate the filename of the output object if compiler does\n    # not support -o with -c\n    if test \"$compiler_c_o\" = no; then\n      output_obj=`$ECHO \"$srcfile\" | $SED 's%^.*/%%; s%\\.[^.]*$%%'`.${objext}\n      lockfile=\"$output_obj.lock\"\n    else\n      output_obj=\n      need_locks=no\n      lockfile=\n    fi\n\n    # Lock this critical section if it is needed\n    # We use this script file to make the link, it avoids creating a new file\n    if test \"$need_locks\" = yes; then\n      until $opt_dry_run || ln \"$progpath\" \"$lockfile\" 2>/dev/null; do\n\tfunc_echo \"Waiting for $lockfile to be removed\"\n\tsleep 2\n      done\n    elif test \"$need_locks\" = warn; then\n      if test -f \"$lockfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile exists and contains:\n`cat $lockfile 2>/dev/null`\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n      func_append removelist \" $output_obj\"\n      $ECHO \"$srcfile\" > \"$lockfile\"\n    fi\n\n    $opt_dry_run || $RM $removelist\n    func_append removelist \" $lockfile\"\n    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15\n\n    func_to_tool_file \"$srcfile\" func_convert_file_msys_to_w32\n    srcfile=$func_to_tool_file_result\n    func_quote_for_eval \"$srcfile\"\n    qsrcfile=$func_quote_for_eval_result\n\n    # Only build a PIC object if we are building libtool libraries.\n    if test \"$build_libtool_libs\" = yes; then\n      # Without this assignment, base_compile gets emptied.\n      fbsd_hideous_sh_bug=$base_compile\n\n      if test \"$pic_mode\" != no; then\n\tcommand=\"$base_compile $qsrcfile $pic_flag\"\n      else\n\t# Don't build PIC code\n\tcommand=\"$base_compile $qsrcfile\"\n      fi\n\n      func_mkdir_p \"$xdir$objdir\"\n\n      if test -z \"$output_obj\"; then\n\t# Place PIC objects in $objdir\n\tfunc_append command \" -o $lobj\"\n      fi\n\n      func_show_eval_locale \"$command\"\t\\\n          'test -n \"$output_obj\" && $RM $removelist; exit $EXIT_FAILURE'\n\n      if test \"$need_locks\" = warn &&\n\t test \"X`cat $lockfile 2>/dev/null`\" != \"X$srcfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile contains:\n`cat $lockfile 2>/dev/null`\n\nbut it should contain:\n$srcfile\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n\n      # Just move the object if needed, then go on to compile the next one\n      if test -n \"$output_obj\" && test \"X$output_obj\" != \"X$lobj\"; then\n\tfunc_show_eval '$MV \"$output_obj\" \"$lobj\"' \\\n\t  'error=$?; $opt_dry_run || $RM $removelist; exit $error'\n      fi\n\n      # Allow error messages only from the first compilation.\n      if test \"$suppress_opt\" = yes; then\n\tsuppress_output=' >/dev/null 2>&1'\n      fi\n    fi\n\n    # Only build a position-dependent object if we build old libraries.\n    if test \"$build_old_libs\" = yes; then\n      if test \"$pic_mode\" != yes; then\n\t# Don't build PIC code\n\tcommand=\"$base_compile $qsrcfile$pie_flag\"\n      else\n\tcommand=\"$base_compile $qsrcfile $pic_flag\"\n      fi\n      if test \"$compiler_c_o\" = yes; then\n\tfunc_append command \" -o $obj\"\n      fi\n\n      # Suppress compiler output if we already did a PIC compilation.\n      func_append command \"$suppress_output\"\n      func_show_eval_locale \"$command\" \\\n        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'\n\n      if test \"$need_locks\" = warn &&\n\t test \"X`cat $lockfile 2>/dev/null`\" != \"X$srcfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile contains:\n`cat $lockfile 2>/dev/null`\n\nbut it should contain:\n$srcfile\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n\n      # Just move the object if needed\n      if test -n \"$output_obj\" && test \"X$output_obj\" != \"X$obj\"; then\n\tfunc_show_eval '$MV \"$output_obj\" \"$obj\"' \\\n\t  'error=$?; $opt_dry_run || $RM $removelist; exit $error'\n      fi\n    fi\n\n    $opt_dry_run || {\n      func_write_libtool_object \"$libobj\" \"$objdir/$objname\" \"$objname\"\n\n      # Unlock the critical section if it was locked\n      if test \"$need_locks\" != no; then\n\tremovelist=$lockfile\n        $RM \"$lockfile\"\n      fi\n    }\n\n    exit $EXIT_SUCCESS\n}\n\n$opt_help || {\n  test \"$opt_mode\" = compile && func_mode_compile ${1+\"$@\"}\n}\n\nfunc_mode_help ()\n{\n    # We need to display help for each of the modes.\n    case $opt_mode in\n      \"\")\n        # Generic help is extracted from the usage comments\n        # at the start of this file.\n        func_help\n        ;;\n\n      clean)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...\n\nRemove files from the build directory.\n\nRM is the name of the program to use to delete files associated with each FILE\n(typically \\`/bin/rm').  RM-OPTIONS are options (such as \\`-f') to be passed\nto RM.\n\nIf FILE is a libtool library, object or program, all the files associated\nwith it are deleted. Otherwise, only FILE itself is deleted using RM.\"\n        ;;\n\n      compile)\n      $ECHO \\\n\"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE\n\nCompile a source file into a libtool library object.\n\nThis mode accepts the following additional options:\n\n  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE\n  -no-suppress      do not suppress compiler output for multiple passes\n  -prefer-pic       try to build PIC objects only\n  -prefer-non-pic   try to build non-PIC objects only\n  -shared           do not build a \\`.o' file suitable for static linking\n  -static           only build a \\`.o' file suitable for static linking\n  -Wc,FLAG          pass FLAG directly to the compiler\n\nCOMPILE-COMMAND is a command to be used in creating a \\`standard' object file\nfrom the given SOURCEFILE.\n\nThe output file name is determined by removing the directory component from\nSOURCEFILE, then substituting the C source code suffix \\`.c' with the\nlibrary object suffix, \\`.lo'.\"\n        ;;\n\n      execute)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...\n\nAutomatically set library path, then run a program.\n\nThis mode accepts the following additional options:\n\n  -dlopen FILE      add the directory containing FILE to the library path\n\nThis mode sets the library path environment variable according to \\`-dlopen'\nflags.\n\nIf any of the ARGS are libtool executable wrappers, then they are translated\ninto their corresponding uninstalled binary, and any of their required library\ndirectories are added to the library path.\n\nThen, COMMAND is executed, with ARGS as arguments.\"\n        ;;\n\n      finish)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...\n\nComplete the installation of libtool libraries.\n\nEach LIBDIR is a directory that contains libtool libraries.\n\nThe commands that this mode executes may require superuser privileges.  Use\nthe \\`--dry-run' option if you just want to see what would be executed.\"\n        ;;\n\n      install)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...\n\nInstall executables or libraries.\n\nINSTALL-COMMAND is the installation command.  The first component should be\neither the \\`install' or \\`cp' program.\n\nThe following components of INSTALL-COMMAND are treated specially:\n\n  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation\n\nThe rest of the components are interpreted as arguments to that command (only\nBSD-compatible install options are recognized).\"\n        ;;\n\n      link)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...\n\nLink object files or libraries together to form another library, or to\ncreate an executable program.\n\nLINK-COMMAND is a command using the C compiler that you would use to create\na program from several object files.\n\nThe following components of LINK-COMMAND are treated specially:\n\n  -all-static       do not do any dynamic linking at all\n  -avoid-version    do not add a version suffix if possible\n  -bindir BINDIR    specify path to binaries directory (for systems where\n                    libraries must be found in the PATH setting at runtime)\n  -dlopen FILE      \\`-dlpreopen' FILE if it cannot be dlopened at runtime\n  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols\n  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)\n  -export-symbols SYMFILE\n                    try to export only the symbols listed in SYMFILE\n  -export-symbols-regex REGEX\n                    try to export only the symbols matching REGEX\n  -LLIBDIR          search LIBDIR for required installed libraries\n  -lNAME            OUTPUT-FILE requires the installed library libNAME\n  -module           build a library that can dlopened\n  -no-fast-install  disable the fast-install mode\n  -no-install       link a not-installable executable\n  -no-undefined     declare that a library does not refer to external symbols\n  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects\n  -objectlist FILE  Use a list of object files found in FILE to specify objects\n  -precious-files-regex REGEX\n                    don't remove output files matching REGEX\n  -release RELEASE  specify package release information\n  -rpath LIBDIR     the created library will eventually be installed in LIBDIR\n  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries\n  -shared           only do dynamic linking of libtool libraries\n  -shrext SUFFIX    override the standard shared library file extension\n  -static           do not do any dynamic linking of uninstalled libtool libraries\n  -static-libtool-libs\n                    do not do any dynamic linking of libtool libraries\n  -version-info CURRENT[:REVISION[:AGE]]\n                    specify library version info [each variable defaults to 0]\n  -weak LIBNAME     declare that the target provides the LIBNAME interface\n  -Wc,FLAG\n  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler\n  -Wl,FLAG\n  -Xlinker FLAG     pass linker-specific FLAG directly to the linker\n  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)\n\nAll other options (arguments beginning with \\`-') are ignored.\n\nEvery other argument is treated as a filename.  Files ending in \\`.la' are\ntreated as uninstalled libtool libraries, other files are standard or library\nobject files.\n\nIf the OUTPUT-FILE ends in \\`.la', then a libtool library is created,\nonly library objects (\\`.lo' files) may be specified, and \\`-rpath' is\nrequired, except when creating a convenience library.\n\nIf OUTPUT-FILE ends in \\`.a' or \\`.lib', then a standard library is created\nusing \\`ar' and \\`ranlib', or on Windows using \\`lib'.\n\nIf OUTPUT-FILE ends in \\`.lo' or \\`.${objext}', then a reloadable object file\nis created, otherwise an executable program is created.\"\n        ;;\n\n      uninstall)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...\n\nRemove libraries from an installation directory.\n\nRM is the name of the program to use to delete files associated with each FILE\n(typically \\`/bin/rm').  RM-OPTIONS are options (such as \\`-f') to be passed\nto RM.\n\nIf FILE is a libtool library, all the files associated with it are deleted.\nOtherwise, only FILE itself is deleted using RM.\"\n        ;;\n\n      *)\n        func_fatal_help \"invalid operation mode \\`$opt_mode'\"\n        ;;\n    esac\n\n    echo\n    $ECHO \"Try \\`$progname --help' for more information about other modes.\"\n}\n\n# Now that we've collected a possible --mode arg, show help if necessary\nif $opt_help; then\n  if test \"$opt_help\" = :; then\n    func_mode_help\n  else\n    {\n      func_help noexit\n      for opt_mode in compile link execute install finish uninstall clean; do\n\tfunc_mode_help\n      done\n    } | sed -n '1p; 2,$s/^Usage:/  or: /p'\n    {\n      func_help noexit\n      for opt_mode in compile link execute install finish uninstall clean; do\n\techo\n\tfunc_mode_help\n      done\n    } |\n    sed '1d\n      /^When reporting/,/^Report/{\n\tH\n\td\n      }\n      $x\n      /information about other modes/d\n      /more detailed .*MODE/d\n      s/^Usage:.*--mode=\\([^ ]*\\) .*/Description of \\1 mode:/'\n  fi\n  exit $?\nfi\n\n\n# func_mode_execute arg...\nfunc_mode_execute ()\n{\n    $opt_debug\n    # The first argument is the command name.\n    cmd=\"$nonopt\"\n    test -z \"$cmd\" && \\\n      func_fatal_help \"you must specify a COMMAND\"\n\n    # Handle -dlopen flags immediately.\n    for file in $opt_dlopen; do\n      test -f \"$file\" \\\n\t|| func_fatal_help \"\\`$file' is not a file\"\n\n      dir=\n      case $file in\n      *.la)\n\tfunc_resolve_sysroot \"$file\"\n\tfile=$func_resolve_sysroot_result\n\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$file\" \\\n\t  || func_fatal_help \"\\`$lib' is not a valid libtool archive\"\n\n\t# Read the libtool library.\n\tdlname=\n\tlibrary_names=\n\tfunc_source \"$file\"\n\n\t# Skip this library if it cannot be dlopened.\n\tif test -z \"$dlname\"; then\n\t  # Warn if it was a shared library.\n\t  test -n \"$library_names\" && \\\n\t    func_warning \"\\`$file' was not linked with \\`-export-dynamic'\"\n\t  continue\n\tfi\n\n\tfunc_dirname \"$file\" \"\" \".\"\n\tdir=\"$func_dirname_result\"\n\n\tif test -f \"$dir/$objdir/$dlname\"; then\n\t  func_append dir \"/$objdir\"\n\telse\n\t  if test ! -f \"$dir/$dlname\"; then\n\t    func_fatal_error \"cannot find \\`$dlname' in \\`$dir' or \\`$dir/$objdir'\"\n\t  fi\n\tfi\n\t;;\n\n      *.lo)\n\t# Just add the directory containing the .lo file.\n\tfunc_dirname \"$file\" \"\" \".\"\n\tdir=\"$func_dirname_result\"\n\t;;\n\n      *)\n\tfunc_warning \"\\`-dlopen' is ignored for non-libtool libraries and objects\"\n\tcontinue\n\t;;\n      esac\n\n      # Get the absolute pathname.\n      absdir=`cd \"$dir\" && pwd`\n      test -n \"$absdir\" && dir=\"$absdir\"\n\n      # Now add the directory to shlibpath_var.\n      if eval \"test -z \\\"\\$$shlibpath_var\\\"\"; then\n\teval \"$shlibpath_var=\\\"\\$dir\\\"\"\n      else\n\teval \"$shlibpath_var=\\\"\\$dir:\\$$shlibpath_var\\\"\"\n      fi\n    done\n\n    # This variable tells wrapper scripts just to set shlibpath_var\n    # rather than running their programs.\n    libtool_execute_magic=\"$magic\"\n\n    # Check if any of the arguments is a wrapper script.\n    args=\n    for file\n    do\n      case $file in\n      -* | *.la | *.lo ) ;;\n      *)\n\t# Do a test to see if this is really a libtool program.\n\tif func_ltwrapper_script_p \"$file\"; then\n\t  func_source \"$file\"\n\t  # Transform arg to wrapped name.\n\t  file=\"$progdir/$program\"\n\telif func_ltwrapper_executable_p \"$file\"; then\n\t  func_ltwrapper_scriptname \"$file\"\n\t  func_source \"$func_ltwrapper_scriptname_result\"\n\t  # Transform arg to wrapped name.\n\t  file=\"$progdir/$program\"\n\tfi\n\t;;\n      esac\n      # Quote arguments (to preserve shell metacharacters).\n      func_append_quoted args \"$file\"\n    done\n\n    if test \"X$opt_dry_run\" = Xfalse; then\n      if test -n \"$shlibpath_var\"; then\n\t# Export the shlibpath_var.\n\teval \"export $shlibpath_var\"\n      fi\n\n      # Restore saved environment variables\n      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES\n      do\n\teval \"if test \\\"\\${save_$lt_var+set}\\\" = set; then\n                $lt_var=\\$save_$lt_var; export $lt_var\n\t      else\n\t\t$lt_unset $lt_var\n\t      fi\"\n      done\n\n      # Now prepare to actually exec the command.\n      exec_cmd=\"\\$cmd$args\"\n    else\n      # Display what would be done.\n      if test -n \"$shlibpath_var\"; then\n\teval \"\\$ECHO \\\"\\$shlibpath_var=\\$$shlibpath_var\\\"\"\n\techo \"export $shlibpath_var\"\n      fi\n      $ECHO \"$cmd$args\"\n      exit $EXIT_SUCCESS\n    fi\n}\n\ntest \"$opt_mode\" = execute && func_mode_execute ${1+\"$@\"}\n\n\n# func_mode_finish arg...\nfunc_mode_finish ()\n{\n    $opt_debug\n    libs=\n    libdirs=\n    admincmds=\n\n    for opt in \"$nonopt\" ${1+\"$@\"}\n    do\n      if test -d \"$opt\"; then\n\tfunc_append libdirs \" $opt\"\n\n      elif test -f \"$opt\"; then\n\tif func_lalib_unsafe_p \"$opt\"; then\n\t  func_append libs \" $opt\"\n\telse\n\t  func_warning \"\\`$opt' is not a valid libtool archive\"\n\tfi\n\n      else\n\tfunc_fatal_error \"invalid argument \\`$opt'\"\n      fi\n    done\n\n    if test -n \"$libs\"; then\n      if test -n \"$lt_sysroot\"; then\n        sysroot_regex=`$ECHO \"$lt_sysroot\" | $SED \"$sed_make_literal_regex\"`\n        sysroot_cmd=\"s/\\([ ']\\)$sysroot_regex/\\1/g;\"\n      else\n        sysroot_cmd=\n      fi\n\n      # Remove sysroot references\n      if $opt_dry_run; then\n        for lib in $libs; do\n          echo \"removing references to $lt_sysroot and \\`=' prefixes from $lib\"\n        done\n      else\n        tmpdir=`func_mktempdir`\n        for lib in $libs; do\n\t  sed -e \"${sysroot_cmd} s/\\([ ']-[LR]\\)=/\\1/g; s/\\([ ']\\)=/\\1/g\" $lib \\\n\t    > $tmpdir/tmp-la\n\t  mv -f $tmpdir/tmp-la $lib\n\tdone\n        ${RM}r \"$tmpdir\"\n      fi\n    fi\n\n    if test -n \"$finish_cmds$finish_eval\" && test -n \"$libdirs\"; then\n      for libdir in $libdirs; do\n\tif test -n \"$finish_cmds\"; then\n\t  # Do each command in the finish commands.\n\t  func_execute_cmds \"$finish_cmds\" 'admincmds=\"$admincmds\n'\"$cmd\"'\"'\n\tfi\n\tif test -n \"$finish_eval\"; then\n\t  # Do the single finish_eval.\n\t  eval cmds=\\\"$finish_eval\\\"\n\t  $opt_dry_run || eval \"$cmds\" || func_append admincmds \"\n       $cmds\"\n\tfi\n      done\n    fi\n\n    # Exit here if they wanted silent mode.\n    $opt_silent && exit $EXIT_SUCCESS\n\n    if test -n \"$finish_cmds$finish_eval\" && test -n \"$libdirs\"; then\n      echo \"----------------------------------------------------------------------\"\n      echo \"Libraries have been installed in:\"\n      for libdir in $libdirs; do\n\t$ECHO \"   $libdir\"\n      done\n      echo\n      echo \"If you ever happen to want to link against installed libraries\"\n      echo \"in a given directory, LIBDIR, you must either use libtool, and\"\n      echo \"specify the full pathname of the library, or use the \\`-LLIBDIR'\"\n      echo \"flag during linking and do at least one of the following:\"\n      if test -n \"$shlibpath_var\"; then\n\techo \"   - add LIBDIR to the \\`$shlibpath_var' environment variable\"\n\techo \"     during execution\"\n      fi\n      if test -n \"$runpath_var\"; then\n\techo \"   - add LIBDIR to the \\`$runpath_var' environment variable\"\n\techo \"     during linking\"\n      fi\n      if test -n \"$hardcode_libdir_flag_spec\"; then\n\tlibdir=LIBDIR\n\teval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\n\t$ECHO \"   - use the \\`$flag' linker flag\"\n      fi\n      if test -n \"$admincmds\"; then\n\t$ECHO \"   - have your system administrator run these commands:$admincmds\"\n      fi\n      if test -f /etc/ld.so.conf; then\n\techo \"   - have your system administrator add LIBDIR to \\`/etc/ld.so.conf'\"\n      fi\n      echo\n\n      echo \"See any operating system documentation about shared libraries for\"\n      case $host in\n\tsolaris2.[6789]|solaris2.1[0-9])\n\t  echo \"more information, such as the ld(1), crle(1) and ld.so(8) manual\"\n\t  echo \"pages.\"\n\t  ;;\n\t*)\n\t  echo \"more information, such as the ld(1) and ld.so(8) manual pages.\"\n\t  ;;\n      esac\n      echo \"----------------------------------------------------------------------\"\n    fi\n    exit $EXIT_SUCCESS\n}\n\ntest \"$opt_mode\" = finish && func_mode_finish ${1+\"$@\"}\n\n\n# func_mode_install arg...\nfunc_mode_install ()\n{\n    $opt_debug\n    # There may be an optional sh(1) argument at the beginning of\n    # install_prog (especially on Windows NT).\n    if test \"$nonopt\" = \"$SHELL\" || test \"$nonopt\" = /bin/sh ||\n       # Allow the use of GNU shtool's install command.\n       case $nonopt in *shtool*) :;; *) false;; esac; then\n      # Aesthetically quote it.\n      func_quote_for_eval \"$nonopt\"\n      install_prog=\"$func_quote_for_eval_result \"\n      arg=$1\n      shift\n    else\n      install_prog=\n      arg=$nonopt\n    fi\n\n    # The real first argument should be the name of the installation program.\n    # Aesthetically quote it.\n    func_quote_for_eval \"$arg\"\n    func_append install_prog \"$func_quote_for_eval_result\"\n    install_shared_prog=$install_prog\n    case \" $install_prog \" in\n      *[\\\\\\ /]cp\\ *) install_cp=: ;;\n      *) install_cp=false ;;\n    esac\n\n    # We need to accept at least all the BSD install flags.\n    dest=\n    files=\n    opts=\n    prev=\n    install_type=\n    isdir=no\n    stripme=\n    no_mode=:\n    for arg\n    do\n      arg2=\n      if test -n \"$dest\"; then\n\tfunc_append files \" $dest\"\n\tdest=$arg\n\tcontinue\n      fi\n\n      case $arg in\n      -d) isdir=yes ;;\n      -f)\n\tif $install_cp; then :; else\n\t  prev=$arg\n\tfi\n\t;;\n      -g | -m | -o)\n\tprev=$arg\n\t;;\n      -s)\n\tstripme=\" -s\"\n\tcontinue\n\t;;\n      -*)\n\t;;\n      *)\n\t# If the previous option needed an argument, then skip it.\n\tif test -n \"$prev\"; then\n\t  if test \"x$prev\" = x-m && test -n \"$install_override_mode\"; then\n\t    arg2=$install_override_mode\n\t    no_mode=false\n\t  fi\n\t  prev=\n\telse\n\t  dest=$arg\n\t  continue\n\tfi\n\t;;\n      esac\n\n      # Aesthetically quote the argument.\n      func_quote_for_eval \"$arg\"\n      func_append install_prog \" $func_quote_for_eval_result\"\n      if test -n \"$arg2\"; then\n\tfunc_quote_for_eval \"$arg2\"\n      fi\n      func_append install_shared_prog \" $func_quote_for_eval_result\"\n    done\n\n    test -z \"$install_prog\" && \\\n      func_fatal_help \"you must specify an install program\"\n\n    test -n \"$prev\" && \\\n      func_fatal_help \"the \\`$prev' option requires an argument\"\n\n    if test -n \"$install_override_mode\" && $no_mode; then\n      if $install_cp; then :; else\n\tfunc_quote_for_eval \"$install_override_mode\"\n\tfunc_append install_shared_prog \" -m $func_quote_for_eval_result\"\n      fi\n    fi\n\n    if test -z \"$files\"; then\n      if test -z \"$dest\"; then\n\tfunc_fatal_help \"no file or destination specified\"\n      else\n\tfunc_fatal_help \"you must specify a destination\"\n      fi\n    fi\n\n    # Strip any trailing slash from the destination.\n    func_stripname '' '/' \"$dest\"\n    dest=$func_stripname_result\n\n    # Check to see that the destination is a directory.\n    test -d \"$dest\" && isdir=yes\n    if test \"$isdir\" = yes; then\n      destdir=\"$dest\"\n      destname=\n    else\n      func_dirname_and_basename \"$dest\" \"\" \".\"\n      destdir=\"$func_dirname_result\"\n      destname=\"$func_basename_result\"\n\n      # Not a directory, so check to see that there is only one file specified.\n      set dummy $files; shift\n      test \"$#\" -gt 1 && \\\n\tfunc_fatal_help \"\\`$dest' is not a directory\"\n    fi\n    case $destdir in\n    [\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n    *)\n      for file in $files; do\n\tcase $file in\n\t*.lo) ;;\n\t*)\n\t  func_fatal_help \"\\`$destdir' must be an absolute directory name\"\n\t  ;;\n\tesac\n      done\n      ;;\n    esac\n\n    # This variable tells wrapper scripts just to set variables rather\n    # than running their programs.\n    libtool_install_magic=\"$magic\"\n\n    staticlibs=\n    future_libdirs=\n    current_libdirs=\n    for file in $files; do\n\n      # Do each installation.\n      case $file in\n      *.$libext)\n\t# Do the static libraries later.\n\tfunc_append staticlibs \" $file\"\n\t;;\n\n      *.la)\n\tfunc_resolve_sysroot \"$file\"\n\tfile=$func_resolve_sysroot_result\n\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$file\" \\\n\t  || func_fatal_help \"\\`$file' is not a valid libtool archive\"\n\n\tlibrary_names=\n\told_library=\n\trelink_command=\n\tfunc_source \"$file\"\n\n\t# Add the libdir to current_libdirs if it is the destination.\n\tif test \"X$destdir\" = \"X$libdir\"; then\n\t  case \"$current_libdirs \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append current_libdirs \" $libdir\" ;;\n\t  esac\n\telse\n\t  # Note the libdir as a future libdir.\n\t  case \"$future_libdirs \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append future_libdirs \" $libdir\" ;;\n\t  esac\n\tfi\n\n\tfunc_dirname \"$file\" \"/\" \"\"\n\tdir=\"$func_dirname_result\"\n\tfunc_append dir \"$objdir\"\n\n\tif test -n \"$relink_command\"; then\n\t  # Determine the prefix the user has applied to our future dir.\n\t  inst_prefix_dir=`$ECHO \"$destdir\" | $SED -e \"s%$libdir\\$%%\"`\n\n\t  # Don't allow the user to place us outside of our expected\n\t  # location b/c this prevents finding dependent libraries that\n\t  # are installed to the same prefix.\n\t  # At present, this check doesn't affect windows .dll's that\n\t  # are installed into $libdir/../bin (currently, that works fine)\n\t  # but it's something to keep an eye on.\n\t  test \"$inst_prefix_dir\" = \"$destdir\" && \\\n\t    func_fatal_error \"error: cannot install \\`$file' to a directory not ending in $libdir\"\n\n\t  if test -n \"$inst_prefix_dir\"; then\n\t    # Stick the inst_prefix_dir data into the link command.\n\t    relink_command=`$ECHO \"$relink_command\" | $SED \"s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%\"`\n\t  else\n\t    relink_command=`$ECHO \"$relink_command\" | $SED \"s%@inst_prefix_dir@%%\"`\n\t  fi\n\n\t  func_warning \"relinking \\`$file'\"\n\t  func_show_eval \"$relink_command\" \\\n\t    'func_fatal_error \"error: relink \\`$file'\\'' with the above command before installing it\"'\n\tfi\n\n\t# See the names of the shared library.\n\tset dummy $library_names; shift\n\tif test -n \"$1\"; then\n\t  realname=\"$1\"\n\t  shift\n\n\t  srcname=\"$realname\"\n\t  test -n \"$relink_command\" && srcname=\"$realname\"T\n\n\t  # Install the shared library and build the symlinks.\n\t  func_show_eval \"$install_shared_prog $dir/$srcname $destdir/$realname\" \\\n\t      'exit $?'\n\t  tstripme=\"$stripme\"\n\t  case $host_os in\n\t  cygwin* | mingw* | pw32* | cegcc*)\n\t    case $realname in\n\t    *.dll.a)\n\t      tstripme=\"\"\n\t      ;;\n\t    esac\n\t    ;;\n\t  esac\n\t  if test -n \"$tstripme\" && test -n \"$striplib\"; then\n\t    func_show_eval \"$striplib $destdir/$realname\" 'exit $?'\n\t  fi\n\n\t  if test \"$#\" -gt 0; then\n\t    # Delete the old symlinks, and create new ones.\n\t    # Try `ln -sf' first, because the `ln' binary might depend on\n\t    # the symlink we replace!  Solaris /bin/ln does not understand -f,\n\t    # so we also need to try rm && ln -s.\n\t    for linkname\n\t    do\n\t      test \"$linkname\" != \"$realname\" \\\n\t\t&& func_show_eval \"(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })\"\n\t    done\n\t  fi\n\n\t  # Do each command in the postinstall commands.\n\t  lib=\"$destdir/$realname\"\n\t  func_execute_cmds \"$postinstall_cmds\" 'exit $?'\n\tfi\n\n\t# Install the pseudo-library for information purposes.\n\tfunc_basename \"$file\"\n\tname=\"$func_basename_result\"\n\tinstname=\"$dir/$name\"i\n\tfunc_show_eval \"$install_prog $instname $destdir/$name\" 'exit $?'\n\n\t# Maybe install the static library, too.\n\ttest -n \"$old_library\" && func_append staticlibs \" $dir/$old_library\"\n\t;;\n\n      *.lo)\n\t# Install (i.e. copy) a libtool object.\n\n\t# Figure out destination file name, if it wasn't already specified.\n\tif test -n \"$destname\"; then\n\t  destfile=\"$destdir/$destname\"\n\telse\n\t  func_basename \"$file\"\n\t  destfile=\"$func_basename_result\"\n\t  destfile=\"$destdir/$destfile\"\n\tfi\n\n\t# Deduce the name of the destination old-style object file.\n\tcase $destfile in\n\t*.lo)\n\t  func_lo2o \"$destfile\"\n\t  staticdest=$func_lo2o_result\n\t  ;;\n\t*.$objext)\n\t  staticdest=\"$destfile\"\n\t  destfile=\n\t  ;;\n\t*)\n\t  func_fatal_help \"cannot copy a libtool object to \\`$destfile'\"\n\t  ;;\n\tesac\n\n\t# Install the libtool object if requested.\n\ttest -n \"$destfile\" && \\\n\t  func_show_eval \"$install_prog $file $destfile\" 'exit $?'\n\n\t# Install the old object if enabled.\n\tif test \"$build_old_libs\" = yes; then\n\t  # Deduce the name of the old-style object file.\n\t  func_lo2o \"$file\"\n\t  staticobj=$func_lo2o_result\n\t  func_show_eval \"$install_prog \\$staticobj \\$staticdest\" 'exit $?'\n\tfi\n\texit $EXIT_SUCCESS\n\t;;\n\n      *)\n\t# Figure out destination file name, if it wasn't already specified.\n\tif test -n \"$destname\"; then\n\t  destfile=\"$destdir/$destname\"\n\telse\n\t  func_basename \"$file\"\n\t  destfile=\"$func_basename_result\"\n\t  destfile=\"$destdir/$destfile\"\n\tfi\n\n\t# If the file is missing, and there is a .exe on the end, strip it\n\t# because it is most likely a libtool script we actually want to\n\t# install\n\tstripped_ext=\"\"\n\tcase $file in\n\t  *.exe)\n\t    if test ! -f \"$file\"; then\n\t      func_stripname '' '.exe' \"$file\"\n\t      file=$func_stripname_result\n\t      stripped_ext=\".exe\"\n\t    fi\n\t    ;;\n\tesac\n\n\t# Do a test to see if this is really a libtool program.\n\tcase $host in\n\t*cygwin* | *mingw*)\n\t    if func_ltwrapper_executable_p \"$file\"; then\n\t      func_ltwrapper_scriptname \"$file\"\n\t      wrapper=$func_ltwrapper_scriptname_result\n\t    else\n\t      func_stripname '' '.exe' \"$file\"\n\t      wrapper=$func_stripname_result\n\t    fi\n\t    ;;\n\t*)\n\t    wrapper=$file\n\t    ;;\n\tesac\n\tif func_ltwrapper_script_p \"$wrapper\"; then\n\t  notinst_deplibs=\n\t  relink_command=\n\n\t  func_source \"$wrapper\"\n\n\t  # Check the variables that should have been set.\n\t  test -z \"$generated_by_libtool_version\" && \\\n\t    func_fatal_error \"invalid libtool wrapper script \\`$wrapper'\"\n\n\t  finalize=yes\n\t  for lib in $notinst_deplibs; do\n\t    # Check to see that each library is installed.\n\t    libdir=\n\t    if test -f \"$lib\"; then\n\t      func_source \"$lib\"\n\t    fi\n\t    libfile=\"$libdir/\"`$ECHO \"$lib\" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test\n\t    if test -n \"$libdir\" && test ! -f \"$libfile\"; then\n\t      func_warning \"\\`$lib' has not been installed in \\`$libdir'\"\n\t      finalize=no\n\t    fi\n\t  done\n\n\t  relink_command=\n\t  func_source \"$wrapper\"\n\n\t  outputname=\n\t  if test \"$fast_install\" = no && test -n \"$relink_command\"; then\n\t    $opt_dry_run || {\n\t      if test \"$finalize\" = yes; then\n\t        tmpdir=`func_mktempdir`\n\t\tfunc_basename \"$file$stripped_ext\"\n\t\tfile=\"$func_basename_result\"\n\t        outputname=\"$tmpdir/$file\"\n\t        # Replace the output file specification.\n\t        relink_command=`$ECHO \"$relink_command\" | $SED 's%@OUTPUT@%'\"$outputname\"'%g'`\n\n\t        $opt_silent || {\n\t          func_quote_for_expand \"$relink_command\"\n\t\t  eval \"func_echo $func_quote_for_expand_result\"\n\t        }\n\t        if eval \"$relink_command\"; then :\n\t          else\n\t\t  func_error \"error: relink \\`$file' with the above command before installing it\"\n\t\t  $opt_dry_run || ${RM}r \"$tmpdir\"\n\t\t  continue\n\t        fi\n\t        file=\"$outputname\"\n\t      else\n\t        func_warning \"cannot relink \\`$file'\"\n\t      fi\n\t    }\n\t  else\n\t    # Install the binary that we compiled earlier.\n\t    file=`$ECHO \"$file$stripped_ext\" | $SED \"s%\\([^/]*\\)$%$objdir/\\1%\"`\n\t  fi\n\tfi\n\n\t# remove .exe since cygwin /usr/bin/install will append another\n\t# one anyway\n\tcase $install_prog,$host in\n\t*/usr/bin/install*,*cygwin*)\n\t  case $file:$destfile in\n\t  *.exe:*.exe)\n\t    # this is ok\n\t    ;;\n\t  *.exe:*)\n\t    destfile=$destfile.exe\n\t    ;;\n\t  *:*.exe)\n\t    func_stripname '' '.exe' \"$destfile\"\n\t    destfile=$func_stripname_result\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\tfunc_show_eval \"$install_prog\\$stripme \\$file \\$destfile\" 'exit $?'\n\t$opt_dry_run || if test -n \"$outputname\"; then\n\t  ${RM}r \"$tmpdir\"\n\tfi\n\t;;\n      esac\n    done\n\n    for file in $staticlibs; do\n      func_basename \"$file\"\n      name=\"$func_basename_result\"\n\n      # Set up the ranlib parameters.\n      oldlib=\"$destdir/$name\"\n      func_to_tool_file \"$oldlib\" func_convert_file_msys_to_w32\n      tool_oldlib=$func_to_tool_file_result\n\n      func_show_eval \"$install_prog \\$file \\$oldlib\" 'exit $?'\n\n      if test -n \"$stripme\" && test -n \"$old_striplib\"; then\n\tfunc_show_eval \"$old_striplib $tool_oldlib\" 'exit $?'\n      fi\n\n      # Do each command in the postinstall commands.\n      func_execute_cmds \"$old_postinstall_cmds\" 'exit $?'\n    done\n\n    test -n \"$future_libdirs\" && \\\n      func_warning \"remember to run \\`$progname --finish$future_libdirs'\"\n\n    if test -n \"$current_libdirs\"; then\n      # Maybe just do a dry run.\n      $opt_dry_run && current_libdirs=\" -n$current_libdirs\"\n      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'\n    else\n      exit $EXIT_SUCCESS\n    fi\n}\n\ntest \"$opt_mode\" = install && func_mode_install ${1+\"$@\"}\n\n\n# func_generate_dlsyms outputname originator pic_p\n# Extract symbols from dlprefiles and create ${outputname}S.o with\n# a dlpreopen symbol table.\nfunc_generate_dlsyms ()\n{\n    $opt_debug\n    my_outputname=\"$1\"\n    my_originator=\"$2\"\n    my_pic_p=\"${3-no}\"\n    my_prefix=`$ECHO \"$my_originator\" | sed 's%[^a-zA-Z0-9]%_%g'`\n    my_dlsyms=\n\n    if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n      if test -n \"$NM\" && test -n \"$global_symbol_pipe\"; then\n\tmy_dlsyms=\"${my_outputname}S.c\"\n      else\n\tfunc_error \"not configured to extract global symbols from dlpreopened files\"\n      fi\n    fi\n\n    if test -n \"$my_dlsyms\"; then\n      case $my_dlsyms in\n      \"\") ;;\n      *.c)\n\t# Discover the nlist of each of the dlfiles.\n\tnlist=\"$output_objdir/${my_outputname}.nm\"\n\n\tfunc_show_eval \"$RM $nlist ${nlist}S ${nlist}T\"\n\n\t# Parse the name list into a source file.\n\tfunc_verbose \"creating $output_objdir/$my_dlsyms\"\n\n\t$opt_dry_run || $ECHO > \"$output_objdir/$my_dlsyms\" \"\\\n/* $my_dlsyms - symbol resolution table for \\`$my_outputname' dlsym emulation. */\n/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */\n\n#ifdef __cplusplus\nextern \\\"C\\\" {\n#endif\n\n#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))\n#pragma GCC diagnostic ignored \\\"-Wstrict-prototypes\\\"\n#endif\n\n/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */\n#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)\n/* DATA imports from DLLs on WIN32 con't be const, because runtime\n   relocations are performed -- see ld's documentation on pseudo-relocs.  */\n# define LT_DLSYM_CONST\n#elif defined(__osf__)\n/* This system does not cope well with relocations in const data.  */\n# define LT_DLSYM_CONST\n#else\n# define LT_DLSYM_CONST const\n#endif\n\n/* External symbol declarations for the compiler. */\\\n\"\n\n\tif test \"$dlself\" = yes; then\n\t  func_verbose \"generating symbol list for \\`$output'\"\n\n\t  $opt_dry_run || echo ': @PROGRAM@ ' > \"$nlist\"\n\n\t  # Add our own program objects to the symbol list.\n\t  progfiles=`$ECHO \"$objs$old_deplibs\" | $SP2NL | $SED \"$lo2o\" | $NL2SP`\n\t  for progfile in $progfiles; do\n\t    func_to_tool_file \"$progfile\" func_convert_file_msys_to_w32\n\t    func_verbose \"extracting global C symbols from \\`$func_to_tool_file_result'\"\n\t    $opt_dry_run || eval \"$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'\"\n\t  done\n\n\t  if test -n \"$exclude_expsyms\"; then\n\t    $opt_dry_run || {\n\t      eval '$EGREP -v \" ($exclude_expsyms)$\" \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t    }\n\t  fi\n\n\t  if test -n \"$export_symbols_regex\"; then\n\t    $opt_dry_run || {\n\t      eval '$EGREP -e \"$export_symbols_regex\" \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t    }\n\t  fi\n\n\t  # Prepare the list of exported symbols\n\t  if test -z \"$export_symbols\"; then\n\t    export_symbols=\"$output_objdir/$outputname.exp\"\n\t    $opt_dry_run || {\n\t      $RM $export_symbols\n\t      eval \"${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \\(.*\\)$/\\1/p' \"'< \"$nlist\" > \"$export_symbols\"'\n\t      case $host in\n\t      *cygwin* | *mingw* | *cegcc* )\n                eval \"echo EXPORTS \"'> \"$output_objdir/$outputname.def\"'\n                eval 'cat \"$export_symbols\" >> \"$output_objdir/$outputname.def\"'\n\t        ;;\n\t      esac\n\t    }\n\t  else\n\t    $opt_dry_run || {\n\t      eval \"${SED} -e 's/\\([].[*^$]\\)/\\\\\\\\\\1/g' -e 's/^/ /' -e 's/$/$/'\"' < \"$export_symbols\" > \"$output_objdir/$outputname.exp\"'\n\t      eval '$GREP -f \"$output_objdir/$outputname.exp\" < \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t      case $host in\n\t        *cygwin* | *mingw* | *cegcc* )\n\t          eval \"echo EXPORTS \"'> \"$output_objdir/$outputname.def\"'\n\t          eval 'cat \"$nlist\" >> \"$output_objdir/$outputname.def\"'\n\t          ;;\n\t      esac\n\t    }\n\t  fi\n\tfi\n\n\tfor dlprefile in $dlprefiles; do\n\t  func_verbose \"extracting global C symbols from \\`$dlprefile'\"\n\t  func_basename \"$dlprefile\"\n\t  name=\"$func_basename_result\"\n          case $host in\n\t    *cygwin* | *mingw* | *cegcc* )\n\t      # if an import library, we need to obtain dlname\n\t      if func_win32_import_lib_p \"$dlprefile\"; then\n\t        func_tr_sh \"$dlprefile\"\n\t        eval \"curr_lafile=\\$libfile_$func_tr_sh_result\"\n\t        dlprefile_dlbasename=\"\"\n\t        if test -n \"$curr_lafile\" && func_lalib_p \"$curr_lafile\"; then\n\t          # Use subshell, to avoid clobbering current variable values\n\t          dlprefile_dlname=`source \"$curr_lafile\" && echo \"$dlname\"`\n\t          if test -n \"$dlprefile_dlname\" ; then\n\t            func_basename \"$dlprefile_dlname\"\n\t            dlprefile_dlbasename=\"$func_basename_result\"\n\t          else\n\t            # no lafile. user explicitly requested -dlpreopen <import library>.\n\t            $sharedlib_from_linklib_cmd \"$dlprefile\"\n\t            dlprefile_dlbasename=$sharedlib_from_linklib_result\n\t          fi\n\t        fi\n\t        $opt_dry_run || {\n\t          if test -n \"$dlprefile_dlbasename\" ; then\n\t            eval '$ECHO \": $dlprefile_dlbasename\" >> \"$nlist\"'\n\t          else\n\t            func_warning \"Could not compute DLL name from $name\"\n\t            eval '$ECHO \": $name \" >> \"$nlist\"'\n\t          fi\n\t          func_to_tool_file \"$dlprefile\" func_convert_file_msys_to_w32\n\t          eval \"$NM \\\"$func_to_tool_file_result\\\" 2>/dev/null | $global_symbol_pipe |\n\t            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'\"\n\t        }\n\t      else # not an import lib\n\t        $opt_dry_run || {\n\t          eval '$ECHO \": $name \" >> \"$nlist\"'\n\t          func_to_tool_file \"$dlprefile\" func_convert_file_msys_to_w32\n\t          eval \"$NM \\\"$func_to_tool_file_result\\\" 2>/dev/null | $global_symbol_pipe >> '$nlist'\"\n\t        }\n\t      fi\n\t    ;;\n\t    *)\n\t      $opt_dry_run || {\n\t        eval '$ECHO \": $name \" >> \"$nlist\"'\n\t        func_to_tool_file \"$dlprefile\" func_convert_file_msys_to_w32\n\t        eval \"$NM \\\"$func_to_tool_file_result\\\" 2>/dev/null | $global_symbol_pipe >> '$nlist'\"\n\t      }\n\t    ;;\n          esac\n\tdone\n\n\t$opt_dry_run || {\n\t  # Make sure we have at least an empty file.\n\t  test -f \"$nlist\" || : > \"$nlist\"\n\n\t  if test -n \"$exclude_expsyms\"; then\n\t    $EGREP -v \" ($exclude_expsyms)$\" \"$nlist\" > \"$nlist\"T\n\t    $MV \"$nlist\"T \"$nlist\"\n\t  fi\n\n\t  # Try sorting and uniquifying the output.\n\t  if $GREP -v \"^: \" < \"$nlist\" |\n\t      if sort -k 3 </dev/null >/dev/null 2>&1; then\n\t\tsort -k 3\n\t      else\n\t\tsort +2\n\t      fi |\n\t      uniq > \"$nlist\"S; then\n\t    :\n\t  else\n\t    $GREP -v \"^: \" < \"$nlist\" > \"$nlist\"S\n\t  fi\n\n\t  if test -f \"$nlist\"S; then\n\t    eval \"$global_symbol_to_cdecl\"' < \"$nlist\"S >> \"$output_objdir/$my_dlsyms\"'\n\t  else\n\t    echo '/* NONE */' >> \"$output_objdir/$my_dlsyms\"\n\t  fi\n\n\t  echo >> \"$output_objdir/$my_dlsyms\" \"\\\n\n/* The mapping between symbol names and symbols.  */\ntypedef struct {\n  const char *name;\n  void *address;\n} lt_dlsymlist;\nextern LT_DLSYM_CONST lt_dlsymlist\nlt_${my_prefix}_LTX_preloaded_symbols[];\nLT_DLSYM_CONST lt_dlsymlist\nlt_${my_prefix}_LTX_preloaded_symbols[] =\n{\\\n  { \\\"$my_originator\\\", (void *) 0 },\"\n\n\t  case $need_lib_prefix in\n\t  no)\n\t    eval \"$global_symbol_to_c_name_address\" < \"$nlist\" >> \"$output_objdir/$my_dlsyms\"\n\t    ;;\n\t  *)\n\t    eval \"$global_symbol_to_c_name_address_lib_prefix\" < \"$nlist\" >> \"$output_objdir/$my_dlsyms\"\n\t    ;;\n\t  esac\n\t  echo >> \"$output_objdir/$my_dlsyms\" \"\\\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt_${my_prefix}_LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\\\n\"\n\t} # !$opt_dry_run\n\n\tpic_flag_for_symtable=\n\tcase \"$compile_command \" in\n\t*\" -static \"*) ;;\n\t*)\n\t  case $host in\n\t  # compiling the symbol table file with pic_flag works around\n\t  # a FreeBSD bug that causes programs to crash when -lm is\n\t  # linked before any other PIC object.  But we must not use\n\t  # pic_flag when linking with -static.  The problem exists in\n\t  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.\n\t  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)\n\t    pic_flag_for_symtable=\" $pic_flag -DFREEBSD_WORKAROUND\" ;;\n\t  *-*-hpux*)\n\t    pic_flag_for_symtable=\" $pic_flag\"  ;;\n\t  *)\n\t    if test \"X$my_pic_p\" != Xno; then\n\t      pic_flag_for_symtable=\" $pic_flag\"\n\t    fi\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\tsymtab_cflags=\n\tfor arg in $LTCFLAGS; do\n\t  case $arg in\n\t  -pie | -fpie | -fPIE) ;;\n\t  *) func_append symtab_cflags \" $arg\" ;;\n\t  esac\n\tdone\n\n\t# Now compile the dynamic symbol file.\n\tfunc_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable \"$my_dlsyms\")' 'exit $?'\n\n\t# Clean up the generated files.\n\tfunc_show_eval '$RM \"$output_objdir/$my_dlsyms\" \"$nlist\" \"${nlist}S\" \"${nlist}T\"'\n\n\t# Transform the symbol file into the correct name.\n\tsymfileobj=\"$output_objdir/${my_outputname}S.$objext\"\n\tcase $host in\n\t*cygwin* | *mingw* | *cegcc* )\n\t  if test -f \"$output_objdir/$my_outputname.def\"; then\n\t    compile_command=`$ECHO \"$compile_command\" | $SED \"s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%\"`\n\t    finalize_command=`$ECHO \"$finalize_command\" | $SED \"s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%\"`\n\t  else\n\t    compile_command=`$ECHO \"$compile_command\" | $SED \"s%@SYMFILE@%$symfileobj%\"`\n\t    finalize_command=`$ECHO \"$finalize_command\" | $SED \"s%@SYMFILE@%$symfileobj%\"`\n\t  fi\n\t  ;;\n\t*)\n\t  compile_command=`$ECHO \"$compile_command\" | $SED \"s%@SYMFILE@%$symfileobj%\"`\n\t  finalize_command=`$ECHO \"$finalize_command\" | $SED \"s%@SYMFILE@%$symfileobj%\"`\n\t  ;;\n\tesac\n\t;;\n      *)\n\tfunc_fatal_error \"unknown suffix for \\`$my_dlsyms'\"\n\t;;\n      esac\n    else\n      # We keep going just in case the user didn't refer to\n      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe\n      # really was required.\n\n      # Nullify the symbol file.\n      compile_command=`$ECHO \"$compile_command\" | $SED \"s% @SYMFILE@%%\"`\n      finalize_command=`$ECHO \"$finalize_command\" | $SED \"s% @SYMFILE@%%\"`\n    fi\n}\n\n# func_win32_libid arg\n# return the library type of file 'arg'\n#\n# Need a lot of goo to handle *both* DLLs and import libs\n# Has to be a shell function in order to 'eat' the argument\n# that is supplied when $file_magic_command is called.\n# Despite the name, also deal with 64 bit binaries.\nfunc_win32_libid ()\n{\n  $opt_debug\n  win32_libid_type=\"unknown\"\n  win32_fileres=`file -L $1 2>/dev/null`\n  case $win32_fileres in\n  *ar\\ archive\\ import\\ library*) # definitely import\n    win32_libid_type=\"x86 archive import\"\n    ;;\n  *ar\\ archive*) # could be an import, or static\n    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.\n    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |\n       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then\n      func_to_tool_file \"$1\" func_convert_file_msys_to_w32\n      win32_nmres=`eval $NM -f posix -A \\\"$func_to_tool_file_result\\\" |\n\t$SED -n -e '\n\t    1,100{\n\t\t/ I /{\n\t\t    s,.*,import,\n\t\t    p\n\t\t    q\n\t\t}\n\t    }'`\n      case $win32_nmres in\n      import*)  win32_libid_type=\"x86 archive import\";;\n      *)        win32_libid_type=\"x86 archive static\";;\n      esac\n    fi\n    ;;\n  *DLL*)\n    win32_libid_type=\"x86 DLL\"\n    ;;\n  *executable*) # but shell scripts are \"executable\" too...\n    case $win32_fileres in\n    *MS\\ Windows\\ PE\\ Intel*)\n      win32_libid_type=\"x86 DLL\"\n      ;;\n    esac\n    ;;\n  esac\n  $ECHO \"$win32_libid_type\"\n}\n\n# func_cygming_dll_for_implib ARG\n#\n# Platform-specific function to extract the\n# name of the DLL associated with the specified\n# import library ARG.\n# Invoked by eval'ing the libtool variable\n#    $sharedlib_from_linklib_cmd\n# Result is available in the variable\n#    $sharedlib_from_linklib_result\nfunc_cygming_dll_for_implib ()\n{\n  $opt_debug\n  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify \"$1\"`\n}\n\n# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs\n#\n# The is the core of a fallback implementation of a\n# platform-specific function to extract the name of the\n# DLL associated with the specified import library LIBNAME.\n#\n# SECTION_NAME is either .idata$6 or .idata$7, depending\n# on the platform and compiler that created the implib.\n#\n# Echos the name of the DLL associated with the\n# specified import library.\nfunc_cygming_dll_for_implib_fallback_core ()\n{\n  $opt_debug\n  match_literal=`$ECHO \"$1\" | $SED \"$sed_make_literal_regex\"`\n  $OBJDUMP -s --section \"$1\" \"$2\" 2>/dev/null |\n    $SED '/^Contents of section '\"$match_literal\"':/{\n      # Place marker at beginning of archive member dllname section\n      s/.*/====MARK====/\n      p\n      d\n    }\n    # These lines can sometimes be longer than 43 characters, but\n    # are always uninteresting\n    /:[\t ]*file format pe[i]\\{,1\\}-/d\n    /^In archive [^:]*:/d\n    # Ensure marker is printed\n    /^====MARK====/p\n    # Remove all lines with less than 43 characters\n    /^.\\{43\\}/!d\n    # From remaining lines, remove first 43 characters\n    s/^.\\{43\\}//' |\n    $SED -n '\n      # Join marker and all lines until next marker into a single line\n      /^====MARK====/ b para\n      H\n      $ b para\n      b\n      :para\n      x\n      s/\\n//g\n      # Remove the marker\n      s/^====MARK====//\n      # Remove trailing dots and whitespace\n      s/[\\. \\t]*$//\n      # Print\n      /./p' |\n    # we now have a list, one entry per line, of the stringified\n    # contents of the appropriate section of all members of the\n    # archive which possess that section. Heuristic: eliminate\n    # all those which have a first or second character that is\n    # a '.' (that is, objdump's representation of an unprintable\n    # character.) This should work for all archives with less than\n    # 0x302f exports -- but will fail for DLLs whose name actually\n    # begins with a literal '.' or a single character followed by\n    # a '.'.\n    #\n    # Of those that remain, print the first one.\n    $SED -e '/^\\./d;/^.\\./d;q'\n}\n\n# func_cygming_gnu_implib_p ARG\n# This predicate returns with zero status (TRUE) if\n# ARG is a GNU/binutils-style import library. Returns\n# with nonzero status (FALSE) otherwise.\nfunc_cygming_gnu_implib_p ()\n{\n  $opt_debug\n  func_to_tool_file \"$1\" func_convert_file_msys_to_w32\n  func_cygming_gnu_implib_tmp=`$NM \"$func_to_tool_file_result\" | eval \"$global_symbol_pipe\" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`\n  test -n \"$func_cygming_gnu_implib_tmp\"\n}\n\n# func_cygming_ms_implib_p ARG\n# This predicate returns with zero status (TRUE) if\n# ARG is an MS-style import library. Returns\n# with nonzero status (FALSE) otherwise.\nfunc_cygming_ms_implib_p ()\n{\n  $opt_debug\n  func_to_tool_file \"$1\" func_convert_file_msys_to_w32\n  func_cygming_ms_implib_tmp=`$NM \"$func_to_tool_file_result\" | eval \"$global_symbol_pipe\" | $GREP '_NULL_IMPORT_DESCRIPTOR'`\n  test -n \"$func_cygming_ms_implib_tmp\"\n}\n\n# func_cygming_dll_for_implib_fallback ARG\n# Platform-specific function to extract the\n# name of the DLL associated with the specified\n# import library ARG.\n#\n# This fallback implementation is for use when $DLLTOOL\n# does not support the --identify-strict option.\n# Invoked by eval'ing the libtool variable\n#    $sharedlib_from_linklib_cmd\n# Result is available in the variable\n#    $sharedlib_from_linklib_result\nfunc_cygming_dll_for_implib_fallback ()\n{\n  $opt_debug\n  if func_cygming_gnu_implib_p \"$1\" ; then\n    # binutils import library\n    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' \"$1\"`\n  elif func_cygming_ms_implib_p \"$1\" ; then\n    # ms-generated import library\n    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' \"$1\"`\n  else\n    # unknown\n    sharedlib_from_linklib_result=\"\"\n  fi\n}\n\n\n# func_extract_an_archive dir oldlib\nfunc_extract_an_archive ()\n{\n    $opt_debug\n    f_ex_an_ar_dir=\"$1\"; shift\n    f_ex_an_ar_oldlib=\"$1\"\n    if test \"$lock_old_archive_extraction\" = yes; then\n      lockfile=$f_ex_an_ar_oldlib.lock\n      until $opt_dry_run || ln \"$progpath\" \"$lockfile\" 2>/dev/null; do\n\tfunc_echo \"Waiting for $lockfile to be removed\"\n\tsleep 2\n      done\n    fi\n    func_show_eval \"(cd \\$f_ex_an_ar_dir && $AR x \\\"\\$f_ex_an_ar_oldlib\\\")\" \\\n\t\t   'stat=$?; rm -f \"$lockfile\"; exit $stat'\n    if test \"$lock_old_archive_extraction\" = yes; then\n      $opt_dry_run || rm -f \"$lockfile\"\n    fi\n    if ($AR t \"$f_ex_an_ar_oldlib\" | sort | sort -uc >/dev/null 2>&1); then\n     :\n    else\n      func_fatal_error \"object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib\"\n    fi\n}\n\n\n# func_extract_archives gentop oldlib ...\nfunc_extract_archives ()\n{\n    $opt_debug\n    my_gentop=\"$1\"; shift\n    my_oldlibs=${1+\"$@\"}\n    my_oldobjs=\"\"\n    my_xlib=\"\"\n    my_xabs=\"\"\n    my_xdir=\"\"\n\n    for my_xlib in $my_oldlibs; do\n      # Extract the objects.\n      case $my_xlib in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) my_xabs=\"$my_xlib\" ;;\n\t*) my_xabs=`pwd`\"/$my_xlib\" ;;\n      esac\n      func_basename \"$my_xlib\"\n      my_xlib=\"$func_basename_result\"\n      my_xlib_u=$my_xlib\n      while :; do\n        case \" $extracted_archives \" in\n\t*\" $my_xlib_u \"*)\n\t  func_arith $extracted_serial + 1\n\t  extracted_serial=$func_arith_result\n\t  my_xlib_u=lt$extracted_serial-$my_xlib ;;\n\t*) break ;;\n\tesac\n      done\n      extracted_archives=\"$extracted_archives $my_xlib_u\"\n      my_xdir=\"$my_gentop/$my_xlib_u\"\n\n      func_mkdir_p \"$my_xdir\"\n\n      case $host in\n      *-darwin*)\n\tfunc_verbose \"Extracting $my_xabs\"\n\t# Do not bother doing anything if just a dry run\n\t$opt_dry_run || {\n\t  darwin_orig_dir=`pwd`\n\t  cd $my_xdir || exit $?\n\t  darwin_archive=$my_xabs\n\t  darwin_curdir=`pwd`\n\t  darwin_base_archive=`basename \"$darwin_archive\"`\n\t  darwin_arches=`$LIPO -info \"$darwin_archive\" 2>/dev/null | $GREP Architectures 2>/dev/null || true`\n\t  if test -n \"$darwin_arches\"; then\n\t    darwin_arches=`$ECHO \"$darwin_arches\" | $SED -e 's/.*are://'`\n\t    darwin_arch=\n\t    func_verbose \"$darwin_base_archive has multiple architectures $darwin_arches\"\n\t    for darwin_arch in  $darwin_arches ; do\n\t      func_mkdir_p \"unfat-$$/${darwin_base_archive}-${darwin_arch}\"\n\t      $LIPO -thin $darwin_arch -output \"unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}\" \"${darwin_archive}\"\n\t      cd \"unfat-$$/${darwin_base_archive}-${darwin_arch}\"\n\t      func_extract_an_archive \"`pwd`\" \"${darwin_base_archive}\"\n\t      cd \"$darwin_curdir\"\n\t      $RM \"unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}\"\n\t    done # $darwin_arches\n            ## Okay now we've a bunch of thin objects, gotta fatten them up :)\n\t    darwin_filelist=`find unfat-$$ -type f -name \\*.o -print -o -name \\*.lo -print | $SED -e \"$basename\" | sort -u`\n\t    darwin_file=\n\t    darwin_files=\n\t    for darwin_file in $darwin_filelist; do\n\t      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`\n\t      $LIPO -create -output \"$darwin_file\" $darwin_files\n\t    done # $darwin_filelist\n\t    $RM -rf unfat-$$\n\t    cd \"$darwin_orig_dir\"\n\t  else\n\t    cd $darwin_orig_dir\n\t    func_extract_an_archive \"$my_xdir\" \"$my_xabs\"\n\t  fi # $darwin_arches\n\t} # !$opt_dry_run\n\t;;\n      *)\n        func_extract_an_archive \"$my_xdir\" \"$my_xabs\"\n\t;;\n      esac\n      my_oldobjs=\"$my_oldobjs \"`find $my_xdir -name \\*.$objext -print -o -name \\*.lo -print | sort | $NL2SP`\n    done\n\n    func_extract_archives_result=\"$my_oldobjs\"\n}\n\n\n# func_emit_wrapper [arg=no]\n#\n# Emit a libtool wrapper script on stdout.\n# Don't directly open a file because we may want to\n# incorporate the script contents within a cygwin/mingw\n# wrapper executable.  Must ONLY be called from within\n# func_mode_link because it depends on a number of variables\n# set therein.\n#\n# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\n# variable will take.  If 'yes', then the emitted script\n# will assume that the directory in which it is stored is\n# the $objdir directory.  This is a cygwin/mingw-specific\n# behavior.\nfunc_emit_wrapper ()\n{\n\tfunc_emit_wrapper_arg1=${1-no}\n\n\t$ECHO \"\\\n#! $SHELL\n\n# $output - temporary wrapper script for $objdir/$outputname\n# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n#\n# The $output program cannot be directly executed until all the libtool\n# libraries that it depends on are installed.\n#\n# This wrapper script should never be moved out of the build directory.\n# If it is, it will not operate correctly.\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nsed_quote_subst='$sed_quote_subst'\n\n# Be Bourne compatible\nif test -n \\\"\\${ZSH_VERSION+set}\\\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Zsh 3.x and 4.x performs word splitting on \\${1+\\\"\\$@\\\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '\\${1+\\\"\\$@\\\"}'='\\\"\\$@\\\"'\n  setopt NO_GLOB_SUBST\nelse\n  case \\`(set -o) 2>/dev/null\\` in *posix*) set -o posix;; esac\nfi\nBIN_SH=xpg4; export BIN_SH # for Tru64\nDUALCASE=1; export DUALCASE # for MKS sh\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nrelink_command=\\\"$relink_command\\\"\n\n# This environment variable determines our operation mode.\nif test \\\"\\$libtool_install_magic\\\" = \\\"$magic\\\"; then\n  # install mode needs the following variables:\n  generated_by_libtool_version='$macro_version'\n  notinst_deplibs='$notinst_deplibs'\nelse\n  # When we are sourced in execute mode, \\$file and \\$ECHO are already set.\n  if test \\\"\\$libtool_execute_magic\\\" != \\\"$magic\\\"; then\n    file=\\\"\\$0\\\"\"\n\n    qECHO=`$ECHO \"$ECHO\" | $SED \"$sed_quote_subst\"`\n    $ECHO \"\\\n\n# A function that is used when there is no print builtin or printf.\nfunc_fallback_echo ()\n{\n  eval 'cat <<_LTECHO_EOF\n\\$1\n_LTECHO_EOF'\n}\n    ECHO=\\\"$qECHO\\\"\n  fi\n\n# Very basic option parsing. These options are (a) specific to\n# the libtool wrapper, (b) are identical between the wrapper\n# /script/ and the wrapper /executable/ which is used only on\n# windows platforms, and (c) all begin with the string \"--lt-\"\n# (application programs are unlikely to have options which match\n# this pattern).\n#\n# There are only two supported options: --lt-debug and\n# --lt-dump-script. There is, deliberately, no --lt-help.\n#\n# The first argument to this parsing function should be the\n# script's $0 value, followed by \"$@\".\nlt_option_debug=\nfunc_parse_lt_options ()\n{\n  lt_script_arg0=\\$0\n  shift\n  for lt_opt\n  do\n    case \\\"\\$lt_opt\\\" in\n    --lt-debug) lt_option_debug=1 ;;\n    --lt-dump-script)\n        lt_dump_D=\\`\\$ECHO \\\"X\\$lt_script_arg0\\\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\\`\n        test \\\"X\\$lt_dump_D\\\" = \\\"X\\$lt_script_arg0\\\" && lt_dump_D=.\n        lt_dump_F=\\`\\$ECHO \\\"X\\$lt_script_arg0\\\" | $SED -e 's/^X//' -e 's%^.*/%%'\\`\n        cat \\\"\\$lt_dump_D/\\$lt_dump_F\\\"\n        exit 0\n      ;;\n    --lt-*)\n        \\$ECHO \\\"Unrecognized --lt- option: '\\$lt_opt'\\\" 1>&2\n        exit 1\n      ;;\n    esac\n  done\n\n  # Print the debug banner immediately:\n  if test -n \\\"\\$lt_option_debug\\\"; then\n    echo \\\"${outputname}:${output}:\\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\\\" 1>&2\n  fi\n}\n\n# Used when --lt-debug. Prints its arguments to stdout\n# (redirection is the responsibility of the caller)\nfunc_lt_dump_args ()\n{\n  lt_dump_args_N=1;\n  for lt_arg\n  do\n    \\$ECHO \\\"${outputname}:${output}:\\${LINENO}: newargv[\\$lt_dump_args_N]: \\$lt_arg\\\"\n    lt_dump_args_N=\\`expr \\$lt_dump_args_N + 1\\`\n  done\n}\n\n# Core function for launching the target application\nfunc_exec_program_core ()\n{\n\"\n  case $host in\n  # Backslashes separate directories on plain windows\n  *-*-mingw | *-*-os2* | *-cegcc*)\n    $ECHO \"\\\n      if test -n \\\"\\$lt_option_debug\\\"; then\n        \\$ECHO \\\"${outputname}:${output}:\\${LINENO}: newargv[0]: \\$progdir\\\\\\\\\\$program\\\" 1>&2\n        func_lt_dump_args \\${1+\\\"\\$@\\\"} 1>&2\n      fi\n      exec \\\"\\$progdir\\\\\\\\\\$program\\\" \\${1+\\\"\\$@\\\"}\n\"\n    ;;\n\n  *)\n    $ECHO \"\\\n      if test -n \\\"\\$lt_option_debug\\\"; then\n        \\$ECHO \\\"${outputname}:${output}:\\${LINENO}: newargv[0]: \\$progdir/\\$program\\\" 1>&2\n        func_lt_dump_args \\${1+\\\"\\$@\\\"} 1>&2\n      fi\n      exec \\\"\\$progdir/\\$program\\\" \\${1+\\\"\\$@\\\"}\n\"\n    ;;\n  esac\n  $ECHO \"\\\n      \\$ECHO \\\"\\$0: cannot exec \\$program \\$*\\\" 1>&2\n      exit 1\n}\n\n# A function to encapsulate launching the target application\n# Strips options in the --lt-* namespace from \\$@ and\n# launches target application with the remaining arguments.\nfunc_exec_program ()\n{\n  case \\\" \\$* \\\" in\n  *\\\\ --lt-*)\n    for lt_wr_arg\n    do\n      case \\$lt_wr_arg in\n      --lt-*) ;;\n      *) set x \\\"\\$@\\\" \\\"\\$lt_wr_arg\\\"; shift;;\n      esac\n      shift\n    done ;;\n  esac\n  func_exec_program_core \\${1+\\\"\\$@\\\"}\n}\n\n  # Parse options\n  func_parse_lt_options \\\"\\$0\\\" \\${1+\\\"\\$@\\\"}\n\n  # Find the directory that this script lives in.\n  thisdir=\\`\\$ECHO \\\"\\$file\\\" | $SED 's%/[^/]*$%%'\\`\n  test \\\"x\\$thisdir\\\" = \\\"x\\$file\\\" && thisdir=.\n\n  # Follow symbolic links until we get to the real thisdir.\n  file=\\`ls -ld \\\"\\$file\\\" | $SED -n 's/.*-> //p'\\`\n  while test -n \\\"\\$file\\\"; do\n    destdir=\\`\\$ECHO \\\"\\$file\\\" | $SED 's%/[^/]*\\$%%'\\`\n\n    # If there was a directory component, then change thisdir.\n    if test \\\"x\\$destdir\\\" != \\\"x\\$file\\\"; then\n      case \\\"\\$destdir\\\" in\n      [\\\\\\\\/]* | [A-Za-z]:[\\\\\\\\/]*) thisdir=\\\"\\$destdir\\\" ;;\n      *) thisdir=\\\"\\$thisdir/\\$destdir\\\" ;;\n      esac\n    fi\n\n    file=\\`\\$ECHO \\\"\\$file\\\" | $SED 's%^.*/%%'\\`\n    file=\\`ls -ld \\\"\\$thisdir/\\$file\\\" | $SED -n 's/.*-> //p'\\`\n  done\n\n  # Usually 'no', except on cygwin/mingw when embedded into\n  # the cwrapper.\n  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1\n  if test \\\"\\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\\\" = \\\"yes\\\"; then\n    # special case for '.'\n    if test \\\"\\$thisdir\\\" = \\\".\\\"; then\n      thisdir=\\`pwd\\`\n    fi\n    # remove .libs from thisdir\n    case \\\"\\$thisdir\\\" in\n    *[\\\\\\\\/]$objdir ) thisdir=\\`\\$ECHO \\\"\\$thisdir\\\" | $SED 's%[\\\\\\\\/][^\\\\\\\\/]*$%%'\\` ;;\n    $objdir )   thisdir=. ;;\n    esac\n  fi\n\n  # Try to get the absolute directory name.\n  absdir=\\`cd \\\"\\$thisdir\\\" && pwd\\`\n  test -n \\\"\\$absdir\\\" && thisdir=\\\"\\$absdir\\\"\n\"\n\n\tif test \"$fast_install\" = yes; then\n\t  $ECHO \"\\\n  program=lt-'$outputname'$exeext\n  progdir=\\\"\\$thisdir/$objdir\\\"\n\n  if test ! -f \\\"\\$progdir/\\$program\\\" ||\n     { file=\\`ls -1dt \\\"\\$progdir/\\$program\\\" \\\"\\$progdir/../\\$program\\\" 2>/dev/null | ${SED} 1q\\`; \\\\\n       test \\\"X\\$file\\\" != \\\"X\\$progdir/\\$program\\\"; }; then\n\n    file=\\\"\\$\\$-\\$program\\\"\n\n    if test ! -d \\\"\\$progdir\\\"; then\n      $MKDIR \\\"\\$progdir\\\"\n    else\n      $RM \\\"\\$progdir/\\$file\\\"\n    fi\"\n\n\t  $ECHO \"\\\n\n    # relink executable if necessary\n    if test -n \\\"\\$relink_command\\\"; then\n      if relink_command_output=\\`eval \\$relink_command 2>&1\\`; then :\n      else\n\t$ECHO \\\"\\$relink_command_output\\\" >&2\n\t$RM \\\"\\$progdir/\\$file\\\"\n\texit 1\n      fi\n    fi\n\n    $MV \\\"\\$progdir/\\$file\\\" \\\"\\$progdir/\\$program\\\" 2>/dev/null ||\n    { $RM \\\"\\$progdir/\\$program\\\";\n      $MV \\\"\\$progdir/\\$file\\\" \\\"\\$progdir/\\$program\\\"; }\n    $RM \\\"\\$progdir/\\$file\\\"\n  fi\"\n\telse\n\t  $ECHO \"\\\n  program='$outputname'\n  progdir=\\\"\\$thisdir/$objdir\\\"\n\"\n\tfi\n\n\t$ECHO \"\\\n\n  if test -f \\\"\\$progdir/\\$program\\\"; then\"\n\n\t# fixup the dll searchpath if we need to.\n\t#\n\t# Fix the DLL searchpath if we need to.  Do this before prepending\n\t# to shlibpath, because on Windows, both are PATH and uninstalled\n\t# libraries must come first.\n\tif test -n \"$dllsearchpath\"; then\n\t  $ECHO \"\\\n    # Add the dll search path components to the executable PATH\n    PATH=$dllsearchpath:\\$PATH\n\"\n\tfi\n\n\t# Export our shlibpath_var if we have one.\n\tif test \"$shlibpath_overrides_runpath\" = yes && test -n \"$shlibpath_var\" && test -n \"$temp_rpath\"; then\n\t  $ECHO \"\\\n    # Add our own library path to $shlibpath_var\n    $shlibpath_var=\\\"$temp_rpath\\$$shlibpath_var\\\"\n\n    # Some systems cannot cope with colon-terminated $shlibpath_var\n    # The second colon is a workaround for a bug in BeOS R4 sed\n    $shlibpath_var=\\`\\$ECHO \\\"\\$$shlibpath_var\\\" | $SED 's/::*\\$//'\\`\n\n    export $shlibpath_var\n\"\n\tfi\n\n\t$ECHO \"\\\n    if test \\\"\\$libtool_execute_magic\\\" != \\\"$magic\\\"; then\n      # Run the actual program with our arguments.\n      func_exec_program \\${1+\\\"\\$@\\\"}\n    fi\n  else\n    # The program doesn't exist.\n    \\$ECHO \\\"\\$0: error: \\\\\\`\\$progdir/\\$program' does not exist\\\" 1>&2\n    \\$ECHO \\\"This script is just a wrapper for \\$program.\\\" 1>&2\n    \\$ECHO \\\"See the $PACKAGE documentation for more information.\\\" 1>&2\n    exit 1\n  fi\nfi\\\n\"\n}\n\n\n# func_emit_cwrapperexe_src\n# emit the source code for a wrapper executable on stdout\n# Must ONLY be called from within func_mode_link because\n# it depends on a number of variable set therein.\nfunc_emit_cwrapperexe_src ()\n{\n\tcat <<EOF\n\n/* $cwrappersource - temporary wrapper executable for $objdir/$outputname\n   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n\n   The $output program cannot be directly executed until all the libtool\n   libraries that it depends on are installed.\n\n   This wrapper executable should never be moved out of the build directory.\n   If it is, it will not operate correctly.\n*/\nEOF\n\t    cat <<\"EOF\"\n#ifdef _MSC_VER\n# define _CRT_SECURE_NO_DEPRECATE 1\n#endif\n#include <stdio.h>\n#include <stdlib.h>\n#ifdef _MSC_VER\n# include <direct.h>\n# include <process.h>\n# include <io.h>\n#else\n# include <unistd.h>\n# include <stdint.h>\n# ifdef __CYGWIN__\n#  include <io.h>\n# endif\n#endif\n#include <malloc.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <string.h>\n#include <ctype.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <sys/stat.h>\n\n/* declarations of non-ANSI functions */\n#if defined(__MINGW32__)\n# ifdef __STRICT_ANSI__\nint _putenv (const char *);\n# endif\n#elif defined(__CYGWIN__)\n# ifdef __STRICT_ANSI__\nchar *realpath (const char *, char *);\nint putenv (char *);\nint setenv (const char *, const char *, int);\n# endif\n/* #elif defined (other platforms) ... */\n#endif\n\n/* portability defines, excluding path handling macros */\n#if defined(_MSC_VER)\n# define setmode _setmode\n# define stat    _stat\n# define chmod   _chmod\n# define getcwd  _getcwd\n# define putenv  _putenv\n# define S_IXUSR _S_IEXEC\n# ifndef _INTPTR_T_DEFINED\n#  define _INTPTR_T_DEFINED\n#  define intptr_t int\n# endif\n#elif defined(__MINGW32__)\n# define setmode _setmode\n# define stat    _stat\n# define chmod   _chmod\n# define getcwd  _getcwd\n# define putenv  _putenv\n#elif defined(__CYGWIN__)\n# define HAVE_SETENV\n# define FOPEN_WB \"wb\"\n/* #elif defined (other platforms) ... */\n#endif\n\n#if defined(PATH_MAX)\n# define LT_PATHMAX PATH_MAX\n#elif defined(MAXPATHLEN)\n# define LT_PATHMAX MAXPATHLEN\n#else\n# define LT_PATHMAX 1024\n#endif\n\n#ifndef S_IXOTH\n# define S_IXOTH 0\n#endif\n#ifndef S_IXGRP\n# define S_IXGRP 0\n#endif\n\n/* path handling portability macros */\n#ifndef DIR_SEPARATOR\n# define DIR_SEPARATOR '/'\n# define PATH_SEPARATOR ':'\n#endif\n\n#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \\\n  defined (__OS2__)\n# define HAVE_DOS_BASED_FILE_SYSTEM\n# define FOPEN_WB \"wb\"\n# ifndef DIR_SEPARATOR_2\n#  define DIR_SEPARATOR_2 '\\\\'\n# endif\n# ifndef PATH_SEPARATOR_2\n#  define PATH_SEPARATOR_2 ';'\n# endif\n#endif\n\n#ifndef DIR_SEPARATOR_2\n# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)\n#else /* DIR_SEPARATOR_2 */\n# define IS_DIR_SEPARATOR(ch) \\\n\t(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))\n#endif /* DIR_SEPARATOR_2 */\n\n#ifndef PATH_SEPARATOR_2\n# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)\n#else /* PATH_SEPARATOR_2 */\n# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)\n#endif /* PATH_SEPARATOR_2 */\n\n#ifndef FOPEN_WB\n# define FOPEN_WB \"w\"\n#endif\n#ifndef _O_BINARY\n# define _O_BINARY 0\n#endif\n\n#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))\n#define XFREE(stale) do { \\\n  if (stale) { free ((void *) stale); stale = 0; } \\\n} while (0)\n\n#if defined(LT_DEBUGWRAPPER)\nstatic int lt_debug = 1;\n#else\nstatic int lt_debug = 0;\n#endif\n\nconst char *program_name = \"libtool-wrapper\"; /* in case xstrdup fails */\n\nvoid *xmalloc (size_t num);\nchar *xstrdup (const char *string);\nconst char *base_name (const char *name);\nchar *find_executable (const char *wrapper);\nchar *chase_symlinks (const char *pathspec);\nint make_executable (const char *path);\nint check_executable (const char *path);\nchar *strendzap (char *str, const char *pat);\nvoid lt_debugprintf (const char *file, int line, const char *fmt, ...);\nvoid lt_fatal (const char *file, int line, const char *message, ...);\nstatic const char *nonnull (const char *s);\nstatic const char *nonempty (const char *s);\nvoid lt_setenv (const char *name, const char *value);\nchar *lt_extend_str (const char *orig_value, const char *add, int to_end);\nvoid lt_update_exe_path (const char *name, const char *value);\nvoid lt_update_lib_path (const char *name, const char *value);\nchar **prepare_spawn (char **argv);\nvoid lt_dump_script (FILE *f);\nEOF\n\n\t    cat <<EOF\nvolatile const char * MAGIC_EXE = \"$magic_exe\";\nconst char * LIB_PATH_VARNAME = \"$shlibpath_var\";\nEOF\n\n\t    if test \"$shlibpath_overrides_runpath\" = yes && test -n \"$shlibpath_var\" && test -n \"$temp_rpath\"; then\n              func_to_host_path \"$temp_rpath\"\n\t      cat <<EOF\nconst char * LIB_PATH_VALUE   = \"$func_to_host_path_result\";\nEOF\n\t    else\n\t      cat <<\"EOF\"\nconst char * LIB_PATH_VALUE   = \"\";\nEOF\n\t    fi\n\n\t    if test -n \"$dllsearchpath\"; then\n              func_to_host_path \"$dllsearchpath:\"\n\t      cat <<EOF\nconst char * EXE_PATH_VARNAME = \"PATH\";\nconst char * EXE_PATH_VALUE   = \"$func_to_host_path_result\";\nEOF\n\t    else\n\t      cat <<\"EOF\"\nconst char * EXE_PATH_VARNAME = \"\";\nconst char * EXE_PATH_VALUE   = \"\";\nEOF\n\t    fi\n\n\t    if test \"$fast_install\" = yes; then\n\t      cat <<EOF\nconst char * TARGET_PROGRAM_NAME = \"lt-$outputname\"; /* hopefully, no .exe */\nEOF\n\t    else\n\t      cat <<EOF\nconst char * TARGET_PROGRAM_NAME = \"$outputname\"; /* hopefully, no .exe */\nEOF\n\t    fi\n\n\n\t    cat <<\"EOF\"\n\n#define LTWRAPPER_OPTION_PREFIX         \"--lt-\"\n\nstatic const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;\nstatic const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX \"dump-script\";\nstatic const char *debug_opt            = LTWRAPPER_OPTION_PREFIX \"debug\";\n\nint\nmain (int argc, char *argv[])\n{\n  char **newargz;\n  int  newargc;\n  char *tmp_pathspec;\n  char *actual_cwrapper_path;\n  char *actual_cwrapper_name;\n  char *target_name;\n  char *lt_argv_zero;\n  intptr_t rval = 127;\n\n  int i;\n\n  program_name = (char *) xstrdup (base_name (argv[0]));\n  newargz = XMALLOC (char *, argc + 1);\n\n  /* very simple arg parsing; don't want to rely on getopt\n   * also, copy all non cwrapper options to newargz, except\n   * argz[0], which is handled differently\n   */\n  newargc=0;\n  for (i = 1; i < argc; i++)\n    {\n      if (strcmp (argv[i], dumpscript_opt) == 0)\n\t{\nEOF\n\t    case \"$host\" in\n\t      *mingw* | *cygwin* )\n\t\t# make stdout use \"unix\" line endings\n\t\techo \"          setmode(1,_O_BINARY);\"\n\t\t;;\n\t      esac\n\n\t    cat <<\"EOF\"\n\t  lt_dump_script (stdout);\n\t  return 0;\n\t}\n      if (strcmp (argv[i], debug_opt) == 0)\n\t{\n          lt_debug = 1;\n          continue;\n\t}\n      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)\n        {\n          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX\n             namespace, but it is not one of the ones we know about and\n             have already dealt with, above (inluding dump-script), then\n             report an error. Otherwise, targets might begin to believe\n             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX\n             namespace. The first time any user complains about this, we'll\n             need to make LTWRAPPER_OPTION_PREFIX a configure-time option\n             or a configure.ac-settable value.\n           */\n          lt_fatal (__FILE__, __LINE__,\n\t\t    \"unrecognized %s option: '%s'\",\n                    ltwrapper_option_prefix, argv[i]);\n        }\n      /* otherwise ... */\n      newargz[++newargc] = xstrdup (argv[i]);\n    }\n  newargz[++newargc] = NULL;\n\nEOF\n\t    cat <<EOF\n  /* The GNU banner must be the first non-error debug message */\n  lt_debugprintf (__FILE__, __LINE__, \"libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\\n\");\nEOF\n\t    cat <<\"EOF\"\n  lt_debugprintf (__FILE__, __LINE__, \"(main) argv[0]: %s\\n\", argv[0]);\n  lt_debugprintf (__FILE__, __LINE__, \"(main) program_name: %s\\n\", program_name);\n\n  tmp_pathspec = find_executable (argv[0]);\n  if (tmp_pathspec == NULL)\n    lt_fatal (__FILE__, __LINE__, \"couldn't find %s\", argv[0]);\n  lt_debugprintf (__FILE__, __LINE__,\n                  \"(main) found exe (before symlink chase) at: %s\\n\",\n\t\t  tmp_pathspec);\n\n  actual_cwrapper_path = chase_symlinks (tmp_pathspec);\n  lt_debugprintf (__FILE__, __LINE__,\n                  \"(main) found exe (after symlink chase) at: %s\\n\",\n\t\t  actual_cwrapper_path);\n  XFREE (tmp_pathspec);\n\n  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));\n  strendzap (actual_cwrapper_path, actual_cwrapper_name);\n\n  /* wrapper name transforms */\n  strendzap (actual_cwrapper_name, \".exe\");\n  tmp_pathspec = lt_extend_str (actual_cwrapper_name, \".exe\", 1);\n  XFREE (actual_cwrapper_name);\n  actual_cwrapper_name = tmp_pathspec;\n  tmp_pathspec = 0;\n\n  /* target_name transforms -- use actual target program name; might have lt- prefix */\n  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));\n  strendzap (target_name, \".exe\");\n  tmp_pathspec = lt_extend_str (target_name, \".exe\", 1);\n  XFREE (target_name);\n  target_name = tmp_pathspec;\n  tmp_pathspec = 0;\n\n  lt_debugprintf (__FILE__, __LINE__,\n\t\t  \"(main) libtool target name: %s\\n\",\n\t\t  target_name);\nEOF\n\n\t    cat <<EOF\n  newargz[0] =\n    XMALLOC (char, (strlen (actual_cwrapper_path) +\n\t\t    strlen (\"$objdir\") + 1 + strlen (actual_cwrapper_name) + 1));\n  strcpy (newargz[0], actual_cwrapper_path);\n  strcat (newargz[0], \"$objdir\");\n  strcat (newargz[0], \"/\");\nEOF\n\n\t    cat <<\"EOF\"\n  /* stop here, and copy so we don't have to do this twice */\n  tmp_pathspec = xstrdup (newargz[0]);\n\n  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */\n  strcat (newargz[0], actual_cwrapper_name);\n\n  /* DO want the lt- prefix here if it exists, so use target_name */\n  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);\n  XFREE (tmp_pathspec);\n  tmp_pathspec = NULL;\nEOF\n\n\t    case $host_os in\n\t      mingw*)\n\t    cat <<\"EOF\"\n  {\n    char* p;\n    while ((p = strchr (newargz[0], '\\\\')) != NULL)\n      {\n\t*p = '/';\n      }\n    while ((p = strchr (lt_argv_zero, '\\\\')) != NULL)\n      {\n\t*p = '/';\n      }\n  }\nEOF\n\t    ;;\n\t    esac\n\n\t    cat <<\"EOF\"\n  XFREE (target_name);\n  XFREE (actual_cwrapper_path);\n  XFREE (actual_cwrapper_name);\n\n  lt_setenv (\"BIN_SH\", \"xpg4\"); /* for Tru64 */\n  lt_setenv (\"DUALCASE\", \"1\");  /* for MSK sh */\n  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must\n     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)\n     because on Windows, both *_VARNAMEs are PATH but uninstalled\n     libraries must come first. */\n  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);\n  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);\n\n  lt_debugprintf (__FILE__, __LINE__, \"(main) lt_argv_zero: %s\\n\",\n\t\t  nonnull (lt_argv_zero));\n  for (i = 0; i < newargc; i++)\n    {\n      lt_debugprintf (__FILE__, __LINE__, \"(main) newargz[%d]: %s\\n\",\n\t\t      i, nonnull (newargz[i]));\n    }\n\nEOF\n\n\t    case $host_os in\n\t      mingw*)\n\t\tcat <<\"EOF\"\n  /* execv doesn't actually work on mingw as expected on unix */\n  newargz = prepare_spawn (newargz);\n  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);\n  if (rval == -1)\n    {\n      /* failed to start process */\n      lt_debugprintf (__FILE__, __LINE__,\n\t\t      \"(main) failed to launch target \\\"%s\\\": %s\\n\",\n\t\t      lt_argv_zero, nonnull (strerror (errno)));\n      return 127;\n    }\n  return rval;\nEOF\n\t\t;;\n\t      *)\n\t\tcat <<\"EOF\"\n  execv (lt_argv_zero, newargz);\n  return rval; /* =127, but avoids unused variable warning */\nEOF\n\t\t;;\n\t    esac\n\n\t    cat <<\"EOF\"\n}\n\nvoid *\nxmalloc (size_t num)\n{\n  void *p = (void *) malloc (num);\n  if (!p)\n    lt_fatal (__FILE__, __LINE__, \"memory exhausted\");\n\n  return p;\n}\n\nchar *\nxstrdup (const char *string)\n{\n  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),\n\t\t\t  string) : NULL;\n}\n\nconst char *\nbase_name (const char *name)\n{\n  const char *base;\n\n#if defined (HAVE_DOS_BASED_FILE_SYSTEM)\n  /* Skip over the disk name in MSDOS pathnames. */\n  if (isalpha ((unsigned char) name[0]) && name[1] == ':')\n    name += 2;\n#endif\n\n  for (base = name; *name; name++)\n    if (IS_DIR_SEPARATOR (*name))\n      base = name + 1;\n  return base;\n}\n\nint\ncheck_executable (const char *path)\n{\n  struct stat st;\n\n  lt_debugprintf (__FILE__, __LINE__, \"(check_executable): %s\\n\",\n                  nonempty (path));\n  if ((!path) || (!*path))\n    return 0;\n\n  if ((stat (path, &st) >= 0)\n      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))\n    return 1;\n  else\n    return 0;\n}\n\nint\nmake_executable (const char *path)\n{\n  int rval = 0;\n  struct stat st;\n\n  lt_debugprintf (__FILE__, __LINE__, \"(make_executable): %s\\n\",\n                  nonempty (path));\n  if ((!path) || (!*path))\n    return 0;\n\n  if (stat (path, &st) >= 0)\n    {\n      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);\n    }\n  return rval;\n}\n\n/* Searches for the full path of the wrapper.  Returns\n   newly allocated full path name if found, NULL otherwise\n   Does not chase symlinks, even on platforms that support them.\n*/\nchar *\nfind_executable (const char *wrapper)\n{\n  int has_slash = 0;\n  const char *p;\n  const char *p_next;\n  /* static buffer for getcwd */\n  char tmp[LT_PATHMAX + 1];\n  int tmp_len;\n  char *concat_name;\n\n  lt_debugprintf (__FILE__, __LINE__, \"(find_executable): %s\\n\",\n                  nonempty (wrapper));\n\n  if ((wrapper == NULL) || (*wrapper == '\\0'))\n    return NULL;\n\n  /* Absolute path? */\n#if defined (HAVE_DOS_BASED_FILE_SYSTEM)\n  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')\n    {\n      concat_name = xstrdup (wrapper);\n      if (check_executable (concat_name))\n\treturn concat_name;\n      XFREE (concat_name);\n    }\n  else\n    {\n#endif\n      if (IS_DIR_SEPARATOR (wrapper[0]))\n\t{\n\t  concat_name = xstrdup (wrapper);\n\t  if (check_executable (concat_name))\n\t    return concat_name;\n\t  XFREE (concat_name);\n\t}\n#if defined (HAVE_DOS_BASED_FILE_SYSTEM)\n    }\n#endif\n\n  for (p = wrapper; *p; p++)\n    if (*p == '/')\n      {\n\thas_slash = 1;\n\tbreak;\n      }\n  if (!has_slash)\n    {\n      /* no slashes; search PATH */\n      const char *path = getenv (\"PATH\");\n      if (path != NULL)\n\t{\n\t  for (p = path; *p; p = p_next)\n\t    {\n\t      const char *q;\n\t      size_t p_len;\n\t      for (q = p; *q; q++)\n\t\tif (IS_PATH_SEPARATOR (*q))\n\t\t  break;\n\t      p_len = q - p;\n\t      p_next = (*q == '\\0' ? q : q + 1);\n\t      if (p_len == 0)\n\t\t{\n\t\t  /* empty path: current directory */\n\t\t  if (getcwd (tmp, LT_PATHMAX) == NULL)\n\t\t    lt_fatal (__FILE__, __LINE__, \"getcwd failed: %s\",\n                              nonnull (strerror (errno)));\n\t\t  tmp_len = strlen (tmp);\n\t\t  concat_name =\n\t\t    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);\n\t\t  memcpy (concat_name, tmp, tmp_len);\n\t\t  concat_name[tmp_len] = '/';\n\t\t  strcpy (concat_name + tmp_len + 1, wrapper);\n\t\t}\n\t      else\n\t\t{\n\t\t  concat_name =\n\t\t    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);\n\t\t  memcpy (concat_name, p, p_len);\n\t\t  concat_name[p_len] = '/';\n\t\t  strcpy (concat_name + p_len + 1, wrapper);\n\t\t}\n\t      if (check_executable (concat_name))\n\t\treturn concat_name;\n\t      XFREE (concat_name);\n\t    }\n\t}\n      /* not found in PATH; assume curdir */\n    }\n  /* Relative path | not found in path: prepend cwd */\n  if (getcwd (tmp, LT_PATHMAX) == NULL)\n    lt_fatal (__FILE__, __LINE__, \"getcwd failed: %s\",\n              nonnull (strerror (errno)));\n  tmp_len = strlen (tmp);\n  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);\n  memcpy (concat_name, tmp, tmp_len);\n  concat_name[tmp_len] = '/';\n  strcpy (concat_name + tmp_len + 1, wrapper);\n\n  if (check_executable (concat_name))\n    return concat_name;\n  XFREE (concat_name);\n  return NULL;\n}\n\nchar *\nchase_symlinks (const char *pathspec)\n{\n#ifndef S_ISLNK\n  return xstrdup (pathspec);\n#else\n  char buf[LT_PATHMAX];\n  struct stat s;\n  char *tmp_pathspec = xstrdup (pathspec);\n  char *p;\n  int has_symlinks = 0;\n  while (strlen (tmp_pathspec) && !has_symlinks)\n    {\n      lt_debugprintf (__FILE__, __LINE__,\n\t\t      \"checking path component for symlinks: %s\\n\",\n\t\t      tmp_pathspec);\n      if (lstat (tmp_pathspec, &s) == 0)\n\t{\n\t  if (S_ISLNK (s.st_mode) != 0)\n\t    {\n\t      has_symlinks = 1;\n\t      break;\n\t    }\n\n\t  /* search backwards for last DIR_SEPARATOR */\n\t  p = tmp_pathspec + strlen (tmp_pathspec) - 1;\n\t  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))\n\t    p--;\n\t  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))\n\t    {\n\t      /* no more DIR_SEPARATORS left */\n\t      break;\n\t    }\n\t  *p = '\\0';\n\t}\n      else\n\t{\n\t  lt_fatal (__FILE__, __LINE__,\n\t\t    \"error accessing file \\\"%s\\\": %s\",\n\t\t    tmp_pathspec, nonnull (strerror (errno)));\n\t}\n    }\n  XFREE (tmp_pathspec);\n\n  if (!has_symlinks)\n    {\n      return xstrdup (pathspec);\n    }\n\n  tmp_pathspec = realpath (pathspec, buf);\n  if (tmp_pathspec == 0)\n    {\n      lt_fatal (__FILE__, __LINE__,\n\t\t\"could not follow symlinks for %s\", pathspec);\n    }\n  return xstrdup (tmp_pathspec);\n#endif\n}\n\nchar *\nstrendzap (char *str, const char *pat)\n{\n  size_t len, patlen;\n\n  assert (str != NULL);\n  assert (pat != NULL);\n\n  len = strlen (str);\n  patlen = strlen (pat);\n\n  if (patlen <= len)\n    {\n      str += len - patlen;\n      if (strcmp (str, pat) == 0)\n\t*str = '\\0';\n    }\n  return str;\n}\n\nvoid\nlt_debugprintf (const char *file, int line, const char *fmt, ...)\n{\n  va_list args;\n  if (lt_debug)\n    {\n      (void) fprintf (stderr, \"%s:%s:%d: \", program_name, file, line);\n      va_start (args, fmt);\n      (void) vfprintf (stderr, fmt, args);\n      va_end (args);\n    }\n}\n\nstatic void\nlt_error_core (int exit_status, const char *file,\n\t       int line, const char *mode,\n\t       const char *message, va_list ap)\n{\n  fprintf (stderr, \"%s:%s:%d: %s: \", program_name, file, line, mode);\n  vfprintf (stderr, message, ap);\n  fprintf (stderr, \".\\n\");\n\n  if (exit_status >= 0)\n    exit (exit_status);\n}\n\nvoid\nlt_fatal (const char *file, int line, const char *message, ...)\n{\n  va_list ap;\n  va_start (ap, message);\n  lt_error_core (EXIT_FAILURE, file, line, \"FATAL\", message, ap);\n  va_end (ap);\n}\n\nstatic const char *\nnonnull (const char *s)\n{\n  return s ? s : \"(null)\";\n}\n\nstatic const char *\nnonempty (const char *s)\n{\n  return (s && !*s) ? \"(empty)\" : nonnull (s);\n}\n\nvoid\nlt_setenv (const char *name, const char *value)\n{\n  lt_debugprintf (__FILE__, __LINE__,\n\t\t  \"(lt_setenv) setting '%s' to '%s'\\n\",\n                  nonnull (name), nonnull (value));\n  {\n#ifdef HAVE_SETENV\n    /* always make a copy, for consistency with !HAVE_SETENV */\n    char *str = xstrdup (value);\n    setenv (name, str, 1);\n#else\n    int len = strlen (name) + 1 + strlen (value) + 1;\n    char *str = XMALLOC (char, len);\n    sprintf (str, \"%s=%s\", name, value);\n    if (putenv (str) != EXIT_SUCCESS)\n      {\n        XFREE (str);\n      }\n#endif\n  }\n}\n\nchar *\nlt_extend_str (const char *orig_value, const char *add, int to_end)\n{\n  char *new_value;\n  if (orig_value && *orig_value)\n    {\n      int orig_value_len = strlen (orig_value);\n      int add_len = strlen (add);\n      new_value = XMALLOC (char, add_len + orig_value_len + 1);\n      if (to_end)\n        {\n          strcpy (new_value, orig_value);\n          strcpy (new_value + orig_value_len, add);\n        }\n      else\n        {\n          strcpy (new_value, add);\n          strcpy (new_value + add_len, orig_value);\n        }\n    }\n  else\n    {\n      new_value = xstrdup (add);\n    }\n  return new_value;\n}\n\nvoid\nlt_update_exe_path (const char *name, const char *value)\n{\n  lt_debugprintf (__FILE__, __LINE__,\n\t\t  \"(lt_update_exe_path) modifying '%s' by prepending '%s'\\n\",\n                  nonnull (name), nonnull (value));\n\n  if (name && *name && value && *value)\n    {\n      char *new_value = lt_extend_str (getenv (name), value, 0);\n      /* some systems can't cope with a ':'-terminated path #' */\n      int len = strlen (new_value);\n      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))\n        {\n          new_value[len-1] = '\\0';\n        }\n      lt_setenv (name, new_value);\n      XFREE (new_value);\n    }\n}\n\nvoid\nlt_update_lib_path (const char *name, const char *value)\n{\n  lt_debugprintf (__FILE__, __LINE__,\n\t\t  \"(lt_update_lib_path) modifying '%s' by prepending '%s'\\n\",\n                  nonnull (name), nonnull (value));\n\n  if (name && *name && value && *value)\n    {\n      char *new_value = lt_extend_str (getenv (name), value, 0);\n      lt_setenv (name, new_value);\n      XFREE (new_value);\n    }\n}\n\nEOF\n\t    case $host_os in\n\t      mingw*)\n\t\tcat <<\"EOF\"\n\n/* Prepares an argument vector before calling spawn().\n   Note that spawn() does not by itself call the command interpreter\n     (getenv (\"COMSPEC\") != NULL ? getenv (\"COMSPEC\") :\n      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);\n         GetVersionEx(&v);\n         v.dwPlatformId == VER_PLATFORM_WIN32_NT;\n      }) ? \"cmd.exe\" : \"command.com\").\n   Instead it simply concatenates the arguments, separated by ' ', and calls\n   CreateProcess().  We must quote the arguments since Win32 CreateProcess()\n   interprets characters like ' ', '\\t', '\\\\', '\"' (but not '<' and '>') in a\n   special way:\n   - Space and tab are interpreted as delimiters. They are not treated as\n     delimiters if they are surrounded by double quotes: \"...\".\n   - Unescaped double quotes are removed from the input. Their only effect is\n     that within double quotes, space and tab are treated like normal\n     characters.\n   - Backslashes not followed by double quotes are not special.\n   - But 2*n+1 backslashes followed by a double quote become\n     n backslashes followed by a double quote (n >= 0):\n       \\\" -> \"\n       \\\\\\\" -> \\\"\n       \\\\\\\\\\\" -> \\\\\"\n */\n#define SHELL_SPECIAL_CHARS \"\\\"\\\\ \\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\"\n#define SHELL_SPACE_CHARS \" \\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\"\nchar **\nprepare_spawn (char **argv)\n{\n  size_t argc;\n  char **new_argv;\n  size_t i;\n\n  /* Count number of arguments.  */\n  for (argc = 0; argv[argc] != NULL; argc++)\n    ;\n\n  /* Allocate new argument vector.  */\n  new_argv = XMALLOC (char *, argc + 1);\n\n  /* Put quoted arguments into the new argument vector.  */\n  for (i = 0; i < argc; i++)\n    {\n      const char *string = argv[i];\n\n      if (string[0] == '\\0')\n\tnew_argv[i] = xstrdup (\"\\\"\\\"\");\n      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)\n\t{\n\t  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);\n\t  size_t length;\n\t  unsigned int backslashes;\n\t  const char *s;\n\t  char *quoted_string;\n\t  char *p;\n\n\t  length = 0;\n\t  backslashes = 0;\n\t  if (quote_around)\n\t    length++;\n\t  for (s = string; *s != '\\0'; s++)\n\t    {\n\t      char c = *s;\n\t      if (c == '\"')\n\t\tlength += backslashes + 1;\n\t      length++;\n\t      if (c == '\\\\')\n\t\tbackslashes++;\n\t      else\n\t\tbackslashes = 0;\n\t    }\n\t  if (quote_around)\n\t    length += backslashes + 1;\n\n\t  quoted_string = XMALLOC (char, length + 1);\n\n\t  p = quoted_string;\n\t  backslashes = 0;\n\t  if (quote_around)\n\t    *p++ = '\"';\n\t  for (s = string; *s != '\\0'; s++)\n\t    {\n\t      char c = *s;\n\t      if (c == '\"')\n\t\t{\n\t\t  unsigned int j;\n\t\t  for (j = backslashes + 1; j > 0; j--)\n\t\t    *p++ = '\\\\';\n\t\t}\n\t      *p++ = c;\n\t      if (c == '\\\\')\n\t\tbackslashes++;\n\t      else\n\t\tbackslashes = 0;\n\t    }\n\t  if (quote_around)\n\t    {\n\t      unsigned int j;\n\t      for (j = backslashes; j > 0; j--)\n\t\t*p++ = '\\\\';\n\t      *p++ = '\"';\n\t    }\n\t  *p = '\\0';\n\n\t  new_argv[i] = quoted_string;\n\t}\n      else\n\tnew_argv[i] = (char *) string;\n    }\n  new_argv[argc] = NULL;\n\n  return new_argv;\n}\nEOF\n\t\t;;\n\t    esac\n\n            cat <<\"EOF\"\nvoid lt_dump_script (FILE* f)\n{\nEOF\n\t    func_emit_wrapper yes |\n\t      $SED -n -e '\ns/^\\(.\\{79\\}\\)\\(..*\\)/\\1\\\n\\2/\nh\ns/\\([\\\\\"]\\)/\\\\\\1/g\ns/$/\\\\n/\ns/\\([^\\n]*\\).*/  fputs (\"\\1\", f);/p\ng\nD'\n            cat <<\"EOF\"\n}\nEOF\n}\n# end: func_emit_cwrapperexe_src\n\n# func_win32_import_lib_p ARG\n# True if ARG is an import lib, as indicated by $file_magic_cmd\nfunc_win32_import_lib_p ()\n{\n    $opt_debug\n    case `eval $file_magic_cmd \\\"\\$1\\\" 2>/dev/null | $SED -e 10q` in\n    *import*) : ;;\n    *) false ;;\n    esac\n}\n\n# func_mode_link arg...\nfunc_mode_link ()\n{\n    $opt_debug\n    case $host in\n    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n      # It is impossible to link a dll without this setting, and\n      # we shouldn't force the makefile maintainer to figure out\n      # which system we are compiling for in order to pass an extra\n      # flag for every libtool invocation.\n      # allow_undefined=no\n\n      # FIXME: Unfortunately, there are problems with the above when trying\n      # to make a dll which has undefined symbols, in which case not\n      # even a static library is built.  For now, we need to specify\n      # -no-undefined on the libtool link line when we can be certain\n      # that all symbols are satisfied, otherwise we get a static library.\n      allow_undefined=yes\n      ;;\n    *)\n      allow_undefined=yes\n      ;;\n    esac\n    libtool_args=$nonopt\n    base_compile=\"$nonopt $@\"\n    compile_command=$nonopt\n    finalize_command=$nonopt\n\n    compile_rpath=\n    finalize_rpath=\n    compile_shlibpath=\n    finalize_shlibpath=\n    convenience=\n    old_convenience=\n    deplibs=\n    old_deplibs=\n    compiler_flags=\n    linker_flags=\n    dllsearchpath=\n    lib_search_path=`pwd`\n    inst_prefix_dir=\n    new_inherited_linker_flags=\n\n    avoid_version=no\n    bindir=\n    dlfiles=\n    dlprefiles=\n    dlself=no\n    export_dynamic=no\n    export_symbols=\n    export_symbols_regex=\n    generated=\n    libobjs=\n    ltlibs=\n    module=no\n    no_install=no\n    objs=\n    non_pic_objects=\n    precious_files_regex=\n    prefer_static_libs=no\n    preload=no\n    prev=\n    prevarg=\n    release=\n    rpath=\n    xrpath=\n    perm_rpath=\n    temp_rpath=\n    thread_safe=no\n    vinfo=\n    vinfo_number=no\n    weak_libs=\n    single_module=\"${wl}-single_module\"\n    func_infer_tag $base_compile\n\n    # We need to know -static, to get the right output filenames.\n    for arg\n    do\n      case $arg in\n      -shared)\n\ttest \"$build_libtool_libs\" != yes && \\\n\t  func_fatal_configuration \"can not build a shared library\"\n\tbuild_old_libs=no\n\tbreak\n\t;;\n      -all-static | -static | -static-libtool-libs)\n\tcase $arg in\n\t-all-static)\n\t  if test \"$build_libtool_libs\" = yes && test -z \"$link_static_flag\"; then\n\t    func_warning \"complete static linking is impossible in this configuration\"\n\t  fi\n\t  if test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=yes\n\t  ;;\n\t-static)\n\t  if test -z \"$pic_flag\" && test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=built\n\t  ;;\n\t-static-libtool-libs)\n\t  if test -z \"$pic_flag\" && test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=yes\n\t  ;;\n\tesac\n\tbuild_libtool_libs=no\n\tbuild_old_libs=yes\n\tbreak\n\t;;\n      esac\n    done\n\n    # See if our shared archives depend on static archives.\n    test -n \"$old_archive_from_new_cmds\" && build_old_libs=yes\n\n    # Go through the arguments, transforming them on the way.\n    while test \"$#\" -gt 0; do\n      arg=\"$1\"\n      shift\n      func_quote_for_eval \"$arg\"\n      qarg=$func_quote_for_eval_unquoted_result\n      func_append libtool_args \" $func_quote_for_eval_result\"\n\n      # If the previous option needs an argument, assign it.\n      if test -n \"$prev\"; then\n\tcase $prev in\n\toutput)\n\t  func_append compile_command \" @OUTPUT@\"\n\t  func_append finalize_command \" @OUTPUT@\"\n\t  ;;\n\tesac\n\n\tcase $prev in\n\tbindir)\n\t  bindir=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tdlfiles|dlprefiles)\n\t  if test \"$preload\" = no; then\n\t    # Add the symbol object into the linking commands.\n\t    func_append compile_command \" @SYMFILE@\"\n\t    func_append finalize_command \" @SYMFILE@\"\n\t    preload=yes\n\t  fi\n\t  case $arg in\n\t  *.la | *.lo) ;;  # We handle these cases below.\n\t  force)\n\t    if test \"$dlself\" = no; then\n\t      dlself=needless\n\t      export_dynamic=yes\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  self)\n\t    if test \"$prev\" = dlprefiles; then\n\t      dlself=yes\n\t    elif test \"$prev\" = dlfiles && test \"$dlopen_self\" != yes; then\n\t      dlself=yes\n\t    else\n\t      dlself=needless\n\t      export_dynamic=yes\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  *)\n\t    if test \"$prev\" = dlfiles; then\n\t      func_append dlfiles \" $arg\"\n\t    else\n\t      func_append dlprefiles \" $arg\"\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  esac\n\t  ;;\n\texpsyms)\n\t  export_symbols=\"$arg\"\n\t  test -f \"$arg\" \\\n\t    || func_fatal_error \"symbol file \\`$arg' does not exist\"\n\t  prev=\n\t  continue\n\t  ;;\n\texpsyms_regex)\n\t  export_symbols_regex=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tframework)\n\t  case $host in\n\t    *-*-darwin*)\n\t      case \"$deplibs \" in\n\t\t*\" $qarg.ltframework \"*) ;;\n\t\t*) func_append deplibs \" $qarg.ltframework\" # this is fixed later\n\t\t   ;;\n\t      esac\n\t      ;;\n\t  esac\n\t  prev=\n\t  continue\n\t  ;;\n\tinst_prefix)\n\t  inst_prefix_dir=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tobjectlist)\n\t  if test -f \"$arg\"; then\n\t    save_arg=$arg\n\t    moreargs=\n\t    for fil in `cat \"$save_arg\"`\n\t    do\n#\t      func_append moreargs \" $fil\"\n\t      arg=$fil\n\t      # A libtool-controlled object.\n\n\t      # Check to see that this really is a libtool object.\n\t      if func_lalib_unsafe_p \"$arg\"; then\n\t\tpic_object=\n\t\tnon_pic_object=\n\n\t\t# Read the .lo file\n\t\tfunc_source \"$arg\"\n\n\t\tif test -z \"$pic_object\" ||\n\t\t   test -z \"$non_pic_object\" ||\n\t\t   test \"$pic_object\" = none &&\n\t\t   test \"$non_pic_object\" = none; then\n\t\t  func_fatal_error \"cannot find name of object for \\`$arg'\"\n\t\tfi\n\n\t\t# Extract subdirectory from the argument.\n\t\tfunc_dirname \"$arg\" \"/\" \"\"\n\t\txdir=\"$func_dirname_result\"\n\n\t\tif test \"$pic_object\" != none; then\n\t\t  # Prepend the subdirectory the object is found in.\n\t\t  pic_object=\"$xdir$pic_object\"\n\n\t\t  if test \"$prev\" = dlfiles; then\n\t\t    if test \"$build_libtool_libs\" = yes && test \"$dlopen_support\" = yes; then\n\t\t      func_append dlfiles \" $pic_object\"\n\t\t      prev=\n\t\t      continue\n\t\t    else\n\t\t      # If libtool objects are unsupported, then we need to preload.\n\t\t      prev=dlprefiles\n\t\t    fi\n\t\t  fi\n\n\t\t  # CHECK ME:  I think I busted this.  -Ossama\n\t\t  if test \"$prev\" = dlprefiles; then\n\t\t    # Preload the old-style object.\n\t\t    func_append dlprefiles \" $pic_object\"\n\t\t    prev=\n\t\t  fi\n\n\t\t  # A PIC object.\n\t\t  func_append libobjs \" $pic_object\"\n\t\t  arg=\"$pic_object\"\n\t\tfi\n\n\t\t# Non-PIC object.\n\t\tif test \"$non_pic_object\" != none; then\n\t\t  # Prepend the subdirectory the object is found in.\n\t\t  non_pic_object=\"$xdir$non_pic_object\"\n\n\t\t  # A standard non-PIC object\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t\t  if test -z \"$pic_object\" || test \"$pic_object\" = none ; then\n\t\t    arg=\"$non_pic_object\"\n\t\t  fi\n\t\telse\n\t\t  # If the PIC object exists, use it instead.\n\t\t  # $xdir was prepended to $pic_object above.\n\t\t  non_pic_object=\"$pic_object\"\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t\tfi\n\t      else\n\t\t# Only an error if not doing a dry-run.\n\t\tif $opt_dry_run; then\n\t\t  # Extract subdirectory from the argument.\n\t\t  func_dirname \"$arg\" \"/\" \"\"\n\t\t  xdir=\"$func_dirname_result\"\n\n\t\t  func_lo2o \"$arg\"\n\t\t  pic_object=$xdir$objdir/$func_lo2o_result\n\t\t  non_pic_object=$xdir$func_lo2o_result\n\t\t  func_append libobjs \" $pic_object\"\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t        else\n\t\t  func_fatal_error \"\\`$arg' is not a valid libtool object\"\n\t\tfi\n\t      fi\n\t    done\n\t  else\n\t    func_fatal_error \"link input file \\`$arg' does not exist\"\n\t  fi\n\t  arg=$save_arg\n\t  prev=\n\t  continue\n\t  ;;\n\tprecious_regex)\n\t  precious_files_regex=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\trelease)\n\t  release=\"-$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\trpath | xrpath)\n\t  # We need an absolute path.\n\t  case $arg in\n\t  [\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t  *)\n\t    func_fatal_error \"only absolute run-paths are allowed\"\n\t    ;;\n\t  esac\n\t  if test \"$prev\" = rpath; then\n\t    case \"$rpath \" in\n\t    *\" $arg \"*) ;;\n\t    *) func_append rpath \" $arg\" ;;\n\t    esac\n\t  else\n\t    case \"$xrpath \" in\n\t    *\" $arg \"*) ;;\n\t    *) func_append xrpath \" $arg\" ;;\n\t    esac\n\t  fi\n\t  prev=\n\t  continue\n\t  ;;\n\tshrext)\n\t  shrext_cmds=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tweak)\n\t  func_append weak_libs \" $arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\txcclinker)\n\t  func_append linker_flags \" $qarg\"\n\t  func_append compiler_flags \" $qarg\"\n\t  prev=\n\t  func_append compile_command \" $qarg\"\n\t  func_append finalize_command \" $qarg\"\n\t  continue\n\t  ;;\n\txcompiler)\n\t  func_append compiler_flags \" $qarg\"\n\t  prev=\n\t  func_append compile_command \" $qarg\"\n\t  func_append finalize_command \" $qarg\"\n\t  continue\n\t  ;;\n\txlinker)\n\t  func_append linker_flags \" $qarg\"\n\t  func_append compiler_flags \" $wl$qarg\"\n\t  prev=\n\t  func_append compile_command \" $wl$qarg\"\n\t  func_append finalize_command \" $wl$qarg\"\n\t  continue\n\t  ;;\n\t*)\n\t  eval \"$prev=\\\"\\$arg\\\"\"\n\t  prev=\n\t  continue\n\t  ;;\n\tesac\n      fi # test -n \"$prev\"\n\n      prevarg=\"$arg\"\n\n      case $arg in\n      -all-static)\n\tif test -n \"$link_static_flag\"; then\n\t  # See comment for -static flag below, for more details.\n\t  func_append compile_command \" $link_static_flag\"\n\t  func_append finalize_command \" $link_static_flag\"\n\tfi\n\tcontinue\n\t;;\n\n      -allow-undefined)\n\t# FIXME: remove this flag sometime in the future.\n\tfunc_fatal_error \"\\`-allow-undefined' must not be used because it is the default\"\n\t;;\n\n      -avoid-version)\n\tavoid_version=yes\n\tcontinue\n\t;;\n\n      -bindir)\n\tprev=bindir\n\tcontinue\n\t;;\n\n      -dlopen)\n\tprev=dlfiles\n\tcontinue\n\t;;\n\n      -dlpreopen)\n\tprev=dlprefiles\n\tcontinue\n\t;;\n\n      -export-dynamic)\n\texport_dynamic=yes\n\tcontinue\n\t;;\n\n      -export-symbols | -export-symbols-regex)\n\tif test -n \"$export_symbols\" || test -n \"$export_symbols_regex\"; then\n\t  func_fatal_error \"more than one -exported-symbols argument is not allowed\"\n\tfi\n\tif test \"X$arg\" = \"X-export-symbols\"; then\n\t  prev=expsyms\n\telse\n\t  prev=expsyms_regex\n\tfi\n\tcontinue\n\t;;\n\n      -framework)\n\tprev=framework\n\tcontinue\n\t;;\n\n      -inst-prefix-dir)\n\tprev=inst_prefix\n\tcontinue\n\t;;\n\n      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*\n      # so, if we see these flags be careful not to treat them like -L\n      -L[A-Z][A-Z]*:*)\n\tcase $with_gcc/$host in\n\tno/*-*-irix* | /*-*-irix*)\n\t  func_append compile_command \" $arg\"\n\t  func_append finalize_command \" $arg\"\n\t  ;;\n\tesac\n\tcontinue\n\t;;\n\n      -L*)\n\tfunc_stripname \"-L\" '' \"$arg\"\n\tif test -z \"$func_stripname_result\"; then\n\t  if test \"$#\" -gt 0; then\n\t    func_fatal_error \"require no space between \\`-L' and \\`$1'\"\n\t  else\n\t    func_fatal_error \"need path for \\`-L' option\"\n\t  fi\n\tfi\n\tfunc_resolve_sysroot \"$func_stripname_result\"\n\tdir=$func_resolve_sysroot_result\n\t# We need an absolute path.\n\tcase $dir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t*)\n\t  absdir=`cd \"$dir\" && pwd`\n\t  test -z \"$absdir\" && \\\n\t    func_fatal_error \"cannot determine absolute directory name of \\`$dir'\"\n\t  dir=\"$absdir\"\n\t  ;;\n\tesac\n\tcase \"$deplibs \" in\n\t*\" -L$dir \"* | *\" $arg \"*)\n\t  # Will only happen for absolute or sysroot arguments\n\t  ;;\n\t*)\n\t  # Preserve sysroot, but never include relative directories\n\t  case $dir in\n\t    [\\\\/]* | [A-Za-z]:[\\\\/]* | =*) func_append deplibs \" $arg\" ;;\n\t    *) func_append deplibs \" -L$dir\" ;;\n\t  esac\n\t  func_append lib_search_path \" $dir\"\n\t  ;;\n\tesac\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n\t  testbindir=`$ECHO \"$dir\" | $SED 's*/lib$*/bin*'`\n\t  case :$dllsearchpath: in\n\t  *\":$dir:\"*) ;;\n\t  ::) dllsearchpath=$dir;;\n\t  *) func_append dllsearchpath \":$dir\";;\n\t  esac\n\t  case :$dllsearchpath: in\n\t  *\":$testbindir:\"*) ;;\n\t  ::) dllsearchpath=$testbindir;;\n\t  *) func_append dllsearchpath \":$testbindir\";;\n\t  esac\n\t  ;;\n\tesac\n\tcontinue\n\t;;\n\n      -l*)\n\tif test \"X$arg\" = \"X-lc\" || test \"X$arg\" = \"X-lm\"; then\n\t  case $host in\n\t  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)\n\t    # These systems don't actually have a C or math library (as such)\n\t    continue\n\t    ;;\n\t  *-*-os2*)\n\t    # These systems don't actually have a C library (as such)\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)\n\t    # Do not include libc due to us having libc/libc_r.\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  *-*-rhapsody* | *-*-darwin1.[012])\n\t    # Rhapsody C and math libraries are in the System framework\n\t    func_append deplibs \" System.ltframework\"\n\t    continue\n\t    ;;\n\t  *-*-sco3.2v5* | *-*-sco5v6*)\n\t    # Causes problems with __ctype\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)\n\t    # Compiler inserts libc in the correct place for threads to work\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  esac\n\telif test \"X$arg\" = \"X-lc_r\"; then\n\t case $host in\n\t *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)\n\t   # Do not include libc_r directly, use -pthread flag.\n\t   continue\n\t   ;;\n\t esac\n\tfi\n\tfunc_append deplibs \" $arg\"\n\tcontinue\n\t;;\n\n      -module)\n\tmodule=yes\n\tcontinue\n\t;;\n\n      # Tru64 UNIX uses -model [arg] to determine the layout of C++\n      # classes, name mangling, and exception handling.\n      # Darwin uses the -arch flag to determine output architecture.\n      -model|-arch|-isysroot|--sysroot)\n\tfunc_append compiler_flags \" $arg\"\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n\tprev=xcompiler\n\tcontinue\n\t;;\n\n      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \\\n      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)\n\tfunc_append compiler_flags \" $arg\"\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n\tcase \"$new_inherited_linker_flags \" in\n\t    *\" $arg \"*) ;;\n\t    * ) func_append new_inherited_linker_flags \" $arg\" ;;\n\tesac\n\tcontinue\n\t;;\n\n      -multi_module)\n\tsingle_module=\"${wl}-multi_module\"\n\tcontinue\n\t;;\n\n      -no-fast-install)\n\tfast_install=no\n\tcontinue\n\t;;\n\n      -no-install)\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)\n\t  # The PATH hackery in wrapper scripts is required on Windows\n\t  # and Darwin in order for the loader to find any dlls it needs.\n\t  func_warning \"\\`-no-install' is ignored for $host\"\n\t  func_warning \"assuming \\`-no-fast-install' instead\"\n\t  fast_install=no\n\t  ;;\n\t*) no_install=yes ;;\n\tesac\n\tcontinue\n\t;;\n\n      -no-undefined)\n\tallow_undefined=no\n\tcontinue\n\t;;\n\n      -objectlist)\n\tprev=objectlist\n\tcontinue\n\t;;\n\n      -o) prev=output ;;\n\n      -precious-files-regex)\n\tprev=precious_regex\n\tcontinue\n\t;;\n\n      -release)\n\tprev=release\n\tcontinue\n\t;;\n\n      -rpath)\n\tprev=rpath\n\tcontinue\n\t;;\n\n      -R)\n\tprev=xrpath\n\tcontinue\n\t;;\n\n      -R*)\n\tfunc_stripname '-R' '' \"$arg\"\n\tdir=$func_stripname_result\n\t# We need an absolute path.\n\tcase $dir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t=*)\n\t  func_stripname '=' '' \"$dir\"\n\t  dir=$lt_sysroot$func_stripname_result\n\t  ;;\n\t*)\n\t  func_fatal_error \"only absolute run-paths are allowed\"\n\t  ;;\n\tesac\n\tcase \"$xrpath \" in\n\t*\" $dir \"*) ;;\n\t*) func_append xrpath \" $dir\" ;;\n\tesac\n\tcontinue\n\t;;\n\n      -shared)\n\t# The effects of -shared are defined in a previous loop.\n\tcontinue\n\t;;\n\n      -shrext)\n\tprev=shrext\n\tcontinue\n\t;;\n\n      -static | -static-libtool-libs)\n\t# The effects of -static are defined in a previous loop.\n\t# We used to do the same as -all-static on platforms that\n\t# didn't have a PIC flag, but the assumption that the effects\n\t# would be equivalent was wrong.  It would break on at least\n\t# Digital Unix and AIX.\n\tcontinue\n\t;;\n\n      -thread-safe)\n\tthread_safe=yes\n\tcontinue\n\t;;\n\n      -version-info)\n\tprev=vinfo\n\tcontinue\n\t;;\n\n      -version-number)\n\tprev=vinfo\n\tvinfo_number=yes\n\tcontinue\n\t;;\n\n      -weak)\n        prev=weak\n\tcontinue\n\t;;\n\n      -Wc,*)\n\tfunc_stripname '-Wc,' '' \"$arg\"\n\targs=$func_stripname_result\n\targ=\n\tsave_ifs=\"$IFS\"; IFS=','\n\tfor flag in $args; do\n\t  IFS=\"$save_ifs\"\n          func_quote_for_eval \"$flag\"\n\t  func_append arg \" $func_quote_for_eval_result\"\n\t  func_append compiler_flags \" $func_quote_for_eval_result\"\n\tdone\n\tIFS=\"$save_ifs\"\n\tfunc_stripname ' ' '' \"$arg\"\n\targ=$func_stripname_result\n\t;;\n\n      -Wl,*)\n\tfunc_stripname '-Wl,' '' \"$arg\"\n\targs=$func_stripname_result\n\targ=\n\tsave_ifs=\"$IFS\"; IFS=','\n\tfor flag in $args; do\n\t  IFS=\"$save_ifs\"\n          func_quote_for_eval \"$flag\"\n\t  func_append arg \" $wl$func_quote_for_eval_result\"\n\t  func_append compiler_flags \" $wl$func_quote_for_eval_result\"\n\t  func_append linker_flags \" $func_quote_for_eval_result\"\n\tdone\n\tIFS=\"$save_ifs\"\n\tfunc_stripname ' ' '' \"$arg\"\n\targ=$func_stripname_result\n\t;;\n\n      -Xcompiler)\n\tprev=xcompiler\n\tcontinue\n\t;;\n\n      -Xlinker)\n\tprev=xlinker\n\tcontinue\n\t;;\n\n      -XCClinker)\n\tprev=xcclinker\n\tcontinue\n\t;;\n\n      # -msg_* for osf cc\n      -msg_*)\n\tfunc_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n\t;;\n\n      # Flags to be passed through unchanged, with rationale:\n      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler\n      # -r[0-9][0-9]*        specify processor for the SGI compiler\n      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler\n      # +DA*, +DD*           enable 64-bit mode for the HP compiler\n      # -q*                  compiler args for the IBM compiler\n      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC\n      # -F/path              path to uninstalled frameworks, gcc on darwin\n      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC\n      # @file                GCC response files\n      # -tp=*                Portland pgcc target processor selection\n      # --sysroot=*          for sysroot support\n      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization\n      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \\\n      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \\\n      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)\n        func_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n        func_append compile_command \" $arg\"\n        func_append finalize_command \" $arg\"\n        func_append compiler_flags \" $arg\"\n        continue\n        ;;\n\n      # Some other compiler flag.\n      -* | +*)\n        func_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n\t;;\n\n      *.$objext)\n\t# A standard object.\n\tfunc_append objs \" $arg\"\n\t;;\n\n      *.lo)\n\t# A libtool-controlled object.\n\n\t# Check to see that this really is a libtool object.\n\tif func_lalib_unsafe_p \"$arg\"; then\n\t  pic_object=\n\t  non_pic_object=\n\n\t  # Read the .lo file\n\t  func_source \"$arg\"\n\n\t  if test -z \"$pic_object\" ||\n\t     test -z \"$non_pic_object\" ||\n\t     test \"$pic_object\" = none &&\n\t     test \"$non_pic_object\" = none; then\n\t    func_fatal_error \"cannot find name of object for \\`$arg'\"\n\t  fi\n\n\t  # Extract subdirectory from the argument.\n\t  func_dirname \"$arg\" \"/\" \"\"\n\t  xdir=\"$func_dirname_result\"\n\n\t  if test \"$pic_object\" != none; then\n\t    # Prepend the subdirectory the object is found in.\n\t    pic_object=\"$xdir$pic_object\"\n\n\t    if test \"$prev\" = dlfiles; then\n\t      if test \"$build_libtool_libs\" = yes && test \"$dlopen_support\" = yes; then\n\t\tfunc_append dlfiles \" $pic_object\"\n\t\tprev=\n\t\tcontinue\n\t      else\n\t\t# If libtool objects are unsupported, then we need to preload.\n\t\tprev=dlprefiles\n\t      fi\n\t    fi\n\n\t    # CHECK ME:  I think I busted this.  -Ossama\n\t    if test \"$prev\" = dlprefiles; then\n\t      # Preload the old-style object.\n\t      func_append dlprefiles \" $pic_object\"\n\t      prev=\n\t    fi\n\n\t    # A PIC object.\n\t    func_append libobjs \" $pic_object\"\n\t    arg=\"$pic_object\"\n\t  fi\n\n\t  # Non-PIC object.\n\t  if test \"$non_pic_object\" != none; then\n\t    # Prepend the subdirectory the object is found in.\n\t    non_pic_object=\"$xdir$non_pic_object\"\n\n\t    # A standard non-PIC object\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t    if test -z \"$pic_object\" || test \"$pic_object\" = none ; then\n\t      arg=\"$non_pic_object\"\n\t    fi\n\t  else\n\t    # If the PIC object exists, use it instead.\n\t    # $xdir was prepended to $pic_object above.\n\t    non_pic_object=\"$pic_object\"\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t  fi\n\telse\n\t  # Only an error if not doing a dry-run.\n\t  if $opt_dry_run; then\n\t    # Extract subdirectory from the argument.\n\t    func_dirname \"$arg\" \"/\" \"\"\n\t    xdir=\"$func_dirname_result\"\n\n\t    func_lo2o \"$arg\"\n\t    pic_object=$xdir$objdir/$func_lo2o_result\n\t    non_pic_object=$xdir$func_lo2o_result\n\t    func_append libobjs \" $pic_object\"\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t  else\n\t    func_fatal_error \"\\`$arg' is not a valid libtool object\"\n\t  fi\n\tfi\n\t;;\n\n      *.$libext)\n\t# An archive.\n\tfunc_append deplibs \" $arg\"\n\tfunc_append old_deplibs \" $arg\"\n\tcontinue\n\t;;\n\n      *.la)\n\t# A libtool-controlled library.\n\n\tfunc_resolve_sysroot \"$arg\"\n\tif test \"$prev\" = dlfiles; then\n\t  # This library was specified with -dlopen.\n\t  func_append dlfiles \" $func_resolve_sysroot_result\"\n\t  prev=\n\telif test \"$prev\" = dlprefiles; then\n\t  # The library was specified with -dlpreopen.\n\t  func_append dlprefiles \" $func_resolve_sysroot_result\"\n\t  prev=\n\telse\n\t  func_append deplibs \" $func_resolve_sysroot_result\"\n\tfi\n\tcontinue\n\t;;\n\n      # Some other compiler argument.\n      *)\n\t# Unknown arguments in both finalize_command and compile_command need\n\t# to be aesthetically quoted because they are evaled later.\n\tfunc_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n\t;;\n      esac # arg\n\n      # Now actually substitute the argument into the commands.\n      if test -n \"$arg\"; then\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n      fi\n    done # argument parsing loop\n\n    test -n \"$prev\" && \\\n      func_fatal_help \"the \\`$prevarg' option requires an argument\"\n\n    if test \"$export_dynamic\" = yes && test -n \"$export_dynamic_flag_spec\"; then\n      eval arg=\\\"$export_dynamic_flag_spec\\\"\n      func_append compile_command \" $arg\"\n      func_append finalize_command \" $arg\"\n    fi\n\n    oldlibs=\n    # calculate the name of the file, without its directory\n    func_basename \"$output\"\n    outputname=\"$func_basename_result\"\n    libobjs_save=\"$libobjs\"\n\n    if test -n \"$shlibpath_var\"; then\n      # get the directories listed in $shlibpath_var\n      eval shlib_search_path=\\`\\$ECHO \\\"\\${$shlibpath_var}\\\" \\| \\$SED \\'s/:/ /g\\'\\`\n    else\n      shlib_search_path=\n    fi\n    eval sys_lib_search_path=\\\"$sys_lib_search_path_spec\\\"\n    eval sys_lib_dlsearch_path=\\\"$sys_lib_dlsearch_path_spec\\\"\n\n    func_dirname \"$output\" \"/\" \"\"\n    output_objdir=\"$func_dirname_result$objdir\"\n    func_to_tool_file \"$output_objdir/\"\n    tool_output_objdir=$func_to_tool_file_result\n    # Create the object directory.\n    func_mkdir_p \"$output_objdir\"\n\n    # Determine the type of output\n    case $output in\n    \"\")\n      func_fatal_help \"you must specify an output file\"\n      ;;\n    *.$libext) linkmode=oldlib ;;\n    *.lo | *.$objext) linkmode=obj ;;\n    *.la) linkmode=lib ;;\n    *) linkmode=prog ;; # Anything else should be a program.\n    esac\n\n    specialdeplibs=\n\n    libs=\n    # Find all interdependent deplibs by searching for libraries\n    # that are linked more than once (e.g. -la -lb -la)\n    for deplib in $deplibs; do\n      if $opt_preserve_dup_deps ; then\n\tcase \"$libs \" in\n\t*\" $deplib \"*) func_append specialdeplibs \" $deplib\" ;;\n\tesac\n      fi\n      func_append libs \" $deplib\"\n    done\n\n    if test \"$linkmode\" = lib; then\n      libs=\"$predeps $libs $compiler_lib_search_path $postdeps\"\n\n      # Compute libraries that are listed more than once in $predeps\n      # $postdeps and mark them as special (i.e., whose duplicates are\n      # not to be eliminated).\n      pre_post_deps=\n      if $opt_duplicate_compiler_generated_deps; then\n\tfor pre_post_dep in $predeps $postdeps; do\n\t  case \"$pre_post_deps \" in\n\t  *\" $pre_post_dep \"*) func_append specialdeplibs \" $pre_post_deps\" ;;\n\t  esac\n\t  func_append pre_post_deps \" $pre_post_dep\"\n\tdone\n      fi\n      pre_post_deps=\n    fi\n\n    deplibs=\n    newdependency_libs=\n    newlib_search_path=\n    need_relink=no # whether we're linking any uninstalled libtool libraries\n    notinst_deplibs= # not-installed libtool libraries\n    notinst_path= # paths that contain not-installed libtool libraries\n\n    case $linkmode in\n    lib)\n\tpasses=\"conv dlpreopen link\"\n\tfor file in $dlfiles $dlprefiles; do\n\t  case $file in\n\t  *.la) ;;\n\t  *)\n\t    func_fatal_help \"libraries can \\`-dlopen' only libtool libraries: $file\"\n\t    ;;\n\t  esac\n\tdone\n\t;;\n    prog)\n\tcompile_deplibs=\n\tfinalize_deplibs=\n\talldeplibs=no\n\tnewdlfiles=\n\tnewdlprefiles=\n\tpasses=\"conv scan dlopen dlpreopen link\"\n\t;;\n    *)  passes=\"conv\"\n\t;;\n    esac\n\n    for pass in $passes; do\n      # The preopen pass in lib mode reverses $deplibs; put it back here\n      # so that -L comes before libs that need it for instance...\n      if test \"$linkmode,$pass\" = \"lib,link\"; then\n\t## FIXME: Find the place where the list is rebuilt in the wrong\n\t##        order, and fix it there properly\n        tmp_deplibs=\n\tfor deplib in $deplibs; do\n\t  tmp_deplibs=\"$deplib $tmp_deplibs\"\n\tdone\n\tdeplibs=\"$tmp_deplibs\"\n      fi\n\n      if test \"$linkmode,$pass\" = \"lib,link\" ||\n\t test \"$linkmode,$pass\" = \"prog,scan\"; then\n\tlibs=\"$deplibs\"\n\tdeplibs=\n      fi\n      if test \"$linkmode\" = prog; then\n\tcase $pass in\n\tdlopen) libs=\"$dlfiles\" ;;\n\tdlpreopen) libs=\"$dlprefiles\" ;;\n\tlink)\n\t  libs=\"$deplibs %DEPLIBS%\"\n\t  test \"X$link_all_deplibs\" != Xno && libs=\"$libs $dependency_libs\"\n\t  ;;\n\tesac\n      fi\n      if test \"$linkmode,$pass\" = \"lib,dlpreopen\"; then\n\t# Collect and forward deplibs of preopened libtool libs\n\tfor lib in $dlprefiles; do\n\t  # Ignore non-libtool-libs\n\t  dependency_libs=\n\t  func_resolve_sysroot \"$lib\"\n\t  case $lib in\n\t  *.la)\tfunc_source \"$func_resolve_sysroot_result\" ;;\n\t  esac\n\n\t  # Collect preopened libtool deplibs, except any this library\n\t  # has declared as weak libs\n\t  for deplib in $dependency_libs; do\n\t    func_basename \"$deplib\"\n            deplib_base=$func_basename_result\n\t    case \" $weak_libs \" in\n\t    *\" $deplib_base \"*) ;;\n\t    *) func_append deplibs \" $deplib\" ;;\n\t    esac\n\t  done\n\tdone\n\tlibs=\"$dlprefiles\"\n      fi\n      if test \"$pass\" = dlopen; then\n\t# Collect dlpreopened libraries\n\tsave_deplibs=\"$deplibs\"\n\tdeplibs=\n      fi\n\n      for deplib in $libs; do\n\tlib=\n\tfound=no\n\tcase $deplib in\n\t-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \\\n        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)\n\t  if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t    compile_deplibs=\"$deplib $compile_deplibs\"\n\t    finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t  else\n\t    func_append compiler_flags \" $deplib\"\n\t    if test \"$linkmode\" = lib ; then\n\t\tcase \"$new_inherited_linker_flags \" in\n\t\t    *\" $deplib \"*) ;;\n\t\t    * ) func_append new_inherited_linker_flags \" $deplib\" ;;\n\t\tesac\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t-l*)\n\t  if test \"$linkmode\" != lib && test \"$linkmode\" != prog; then\n\t    func_warning \"\\`-l' is ignored for archives/objects\"\n\t    continue\n\t  fi\n\t  func_stripname '-l' '' \"$deplib\"\n\t  name=$func_stripname_result\n\t  if test \"$linkmode\" = lib; then\n\t    searchdirs=\"$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path\"\n\t  else\n\t    searchdirs=\"$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path\"\n\t  fi\n\t  for searchdir in $searchdirs; do\n\t    for search_ext in .la $std_shrext .so .a; do\n\t      # Search the libtool library\n\t      lib=\"$searchdir/lib${name}${search_ext}\"\n\t      if test -f \"$lib\"; then\n\t\tif test \"$search_ext\" = \".la\"; then\n\t\t  found=yes\n\t\telse\n\t\t  found=no\n\t\tfi\n\t\tbreak 2\n\t      fi\n\t    done\n\t  done\n\t  if test \"$found\" != yes; then\n\t    # deplib doesn't seem to be a libtool library\n\t    if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    else\n\t      deplibs=\"$deplib $deplibs\"\n\t      test \"$linkmode\" = lib && newdependency_libs=\"$deplib $newdependency_libs\"\n\t    fi\n\t    continue\n\t  else # deplib is a libtool library\n\t    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,\n\t    # We need to do some special things here, and not later.\n\t    if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t      case \" $predeps $postdeps \" in\n\t      *\" $deplib \"*)\n\t\tif func_lalib_p \"$lib\"; then\n\t\t  library_names=\n\t\t  old_library=\n\t\t  func_source \"$lib\"\n\t\t  for l in $old_library $library_names; do\n\t\t    ll=\"$l\"\n\t\t  done\n\t\t  if test \"X$ll\" = \"X$old_library\" ; then # only static version available\n\t\t    found=no\n\t\t    func_dirname \"$lib\" \"\" \".\"\n\t\t    ladir=\"$func_dirname_result\"\n\t\t    lib=$ladir/$old_library\n\t\t    if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t\t    else\n\t\t      deplibs=\"$deplib $deplibs\"\n\t\t      test \"$linkmode\" = lib && newdependency_libs=\"$deplib $newdependency_libs\"\n\t\t    fi\n\t\t    continue\n\t\t  fi\n\t\tfi\n\t\t;;\n\t      *) ;;\n\t      esac\n\t    fi\n\t  fi\n\t  ;; # -l\n\t*.ltframework)\n\t  if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t    compile_deplibs=\"$deplib $compile_deplibs\"\n\t    finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t  else\n\t    deplibs=\"$deplib $deplibs\"\n\t    if test \"$linkmode\" = lib ; then\n\t\tcase \"$new_inherited_linker_flags \" in\n\t\t    *\" $deplib \"*) ;;\n\t\t    * ) func_append new_inherited_linker_flags \" $deplib\" ;;\n\t\tesac\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t-L*)\n\t  case $linkmode in\n\t  lib)\n\t    deplibs=\"$deplib $deplibs\"\n\t    test \"$pass\" = conv && continue\n\t    newdependency_libs=\"$deplib $newdependency_libs\"\n\t    func_stripname '-L' '' \"$deplib\"\n\t    func_resolve_sysroot \"$func_stripname_result\"\n\t    func_append newlib_search_path \" $func_resolve_sysroot_result\"\n\t    ;;\n\t  prog)\n\t    if test \"$pass\" = conv; then\n\t      deplibs=\"$deplib $deplibs\"\n\t      continue\n\t    fi\n\t    if test \"$pass\" = scan; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    fi\n\t    func_stripname '-L' '' \"$deplib\"\n\t    func_resolve_sysroot \"$func_stripname_result\"\n\t    func_append newlib_search_path \" $func_resolve_sysroot_result\"\n\t    ;;\n\t  *)\n\t    func_warning \"\\`-L' is ignored for archives/objects\"\n\t    ;;\n\t  esac # linkmode\n\t  continue\n\t  ;; # -L\n\t-R*)\n\t  if test \"$pass\" = link; then\n\t    func_stripname '-R' '' \"$deplib\"\n\t    func_resolve_sysroot \"$func_stripname_result\"\n\t    dir=$func_resolve_sysroot_result\n\t    # Make sure the xrpath contains only unique directories.\n\t    case \"$xrpath \" in\n\t    *\" $dir \"*) ;;\n\t    *) func_append xrpath \" $dir\" ;;\n\t    esac\n\t  fi\n\t  deplibs=\"$deplib $deplibs\"\n\t  continue\n\t  ;;\n\t*.la)\n\t  func_resolve_sysroot \"$deplib\"\n\t  lib=$func_resolve_sysroot_result\n\t  ;;\n\t*.$libext)\n\t  if test \"$pass\" = conv; then\n\t    deplibs=\"$deplib $deplibs\"\n\t    continue\n\t  fi\n\t  case $linkmode in\n\t  lib)\n\t    # Linking convenience modules into shared libraries is allowed,\n\t    # but linking other static libraries is non-portable.\n\t    case \" $dlpreconveniencelibs \" in\n\t    *\" $deplib \"*) ;;\n\t    *)\n\t      valid_a_lib=no\n\t      case $deplibs_check_method in\n\t\tmatch_pattern*)\n\t\t  set dummy $deplibs_check_method; shift\n\t\t  match_pattern_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t\t  if eval \"\\$ECHO \\\"$deplib\\\"\" 2>/dev/null | $SED 10q \\\n\t\t    | $EGREP \"$match_pattern_regex\" > /dev/null; then\n\t\t    valid_a_lib=yes\n\t\t  fi\n\t\t;;\n\t\tpass_all)\n\t\t  valid_a_lib=yes\n\t\t;;\n\t      esac\n\t      if test \"$valid_a_lib\" != yes; then\n\t\techo\n\t\t$ECHO \"*** Warning: Trying to link with static lib archive $deplib.\"\n\t\techo \"*** I have the capability to make that library automatically link in when\"\n\t\techo \"*** you link to this library.  But I can only do this if you have a\"\n\t\techo \"*** shared version of the library, which you do not appear to have\"\n\t\techo \"*** because the file extensions .$libext of this argument makes me believe\"\n\t\techo \"*** that it is just a static archive that I should not use here.\"\n\t      else\n\t\techo\n\t\t$ECHO \"*** Warning: Linking the shared library $output against the\"\n\t\t$ECHO \"*** static library $deplib is not portable!\"\n\t\tdeplibs=\"$deplib $deplibs\"\n\t      fi\n\t      ;;\n\t    esac\n\t    continue\n\t    ;;\n\t  prog)\n\t    if test \"$pass\" != link; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    fi\n\t    continue\n\t    ;;\n\t  esac # linkmode\n\t  ;; # *.$libext\n\t*.lo | *.$objext)\n\t  if test \"$pass\" = conv; then\n\t    deplibs=\"$deplib $deplibs\"\n\t  elif test \"$linkmode\" = prog; then\n\t    if test \"$pass\" = dlpreopen || test \"$dlopen_support\" != yes || test \"$build_libtool_libs\" = no; then\n\t      # If there is no dlopen support or we're linking statically,\n\t      # we need to preload.\n\t      func_append newdlprefiles \" $deplib\"\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    else\n\t      func_append newdlfiles \" $deplib\"\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t%DEPLIBS%)\n\t  alldeplibs=yes\n\t  continue\n\t  ;;\n\tesac # case $deplib\n\n\tif test \"$found\" = yes || test -f \"$lib\"; then :\n\telse\n\t  func_fatal_error \"cannot find the library \\`$lib' or unhandled argument \\`$deplib'\"\n\tfi\n\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$lib\" \\\n\t  || func_fatal_error \"\\`$lib' is not a valid libtool archive\"\n\n\tfunc_dirname \"$lib\" \"\" \".\"\n\tladir=\"$func_dirname_result\"\n\n\tdlname=\n\tdlopen=\n\tdlpreopen=\n\tlibdir=\n\tlibrary_names=\n\told_library=\n\tinherited_linker_flags=\n\t# If the library was installed with an old release of libtool,\n\t# it will not redefine variables installed, or shouldnotlink\n\tinstalled=yes\n\tshouldnotlink=no\n\tavoidtemprpath=\n\n\n\t# Read the .la file\n\tfunc_source \"$lib\"\n\n\t# Convert \"-framework foo\" to \"foo.ltframework\"\n\tif test -n \"$inherited_linker_flags\"; then\n\t  tmp_inherited_linker_flags=`$ECHO \"$inherited_linker_flags\" | $SED 's/-framework \\([^ $]*\\)/\\1.ltframework/g'`\n\t  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do\n\t    case \" $new_inherited_linker_flags \" in\n\t      *\" $tmp_inherited_linker_flag \"*) ;;\n\t      *) func_append new_inherited_linker_flags \" $tmp_inherited_linker_flag\";;\n\t    esac\n\t  done\n\tfi\n\tdependency_libs=`$ECHO \" $dependency_libs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tif test \"$linkmode,$pass\" = \"lib,link\" ||\n\t   test \"$linkmode,$pass\" = \"prog,scan\" ||\n\t   { test \"$linkmode\" != prog && test \"$linkmode\" != lib; }; then\n\t  test -n \"$dlopen\" && func_append dlfiles \" $dlopen\"\n\t  test -n \"$dlpreopen\" && func_append dlprefiles \" $dlpreopen\"\n\tfi\n\n\tif test \"$pass\" = conv; then\n\t  # Only check for convenience libraries\n\t  deplibs=\"$lib $deplibs\"\n\t  if test -z \"$libdir\"; then\n\t    if test -z \"$old_library\"; then\n\t      func_fatal_error \"cannot find name of link library for \\`$lib'\"\n\t    fi\n\t    # It is a libtool convenience library, so add in its objects.\n\t    func_append convenience \" $ladir/$objdir/$old_library\"\n\t    func_append old_convenience \" $ladir/$objdir/$old_library\"\n\t    tmp_libs=\n\t    for deplib in $dependency_libs; do\n\t      deplibs=\"$deplib $deplibs\"\n\t      if $opt_preserve_dup_deps ; then\n\t\tcase \"$tmp_libs \" in\n\t\t*\" $deplib \"*) func_append specialdeplibs \" $deplib\" ;;\n\t\tesac\n\t      fi\n\t      func_append tmp_libs \" $deplib\"\n\t    done\n\t  elif test \"$linkmode\" != prog && test \"$linkmode\" != lib; then\n\t    func_fatal_error \"\\`$lib' is not a convenience library\"\n\t  fi\n\t  continue\n\tfi # $pass = conv\n\n\n\t# Get the name of the library we link against.\n\tlinklib=\n\tif test -n \"$old_library\" &&\n\t   { test \"$prefer_static_libs\" = yes ||\n\t     test \"$prefer_static_libs,$installed\" = \"built,no\"; }; then\n\t  linklib=$old_library\n\telse\n\t  for l in $old_library $library_names; do\n\t    linklib=\"$l\"\n\t  done\n\tfi\n\tif test -z \"$linklib\"; then\n\t  func_fatal_error \"cannot find name of link library for \\`$lib'\"\n\tfi\n\n\t# This library was specified with -dlopen.\n\tif test \"$pass\" = dlopen; then\n\t  if test -z \"$libdir\"; then\n\t    func_fatal_error \"cannot -dlopen a convenience library: \\`$lib'\"\n\t  fi\n\t  if test -z \"$dlname\" ||\n\t     test \"$dlopen_support\" != yes ||\n\t     test \"$build_libtool_libs\" = no; then\n\t    # If there is no dlname, no dlopen support or we're linking\n\t    # statically, we need to preload.  We also need to preload any\n\t    # dependent libraries so libltdl's deplib preloader doesn't\n\t    # bomb out in the load deplibs phase.\n\t    func_append dlprefiles \" $lib $dependency_libs\"\n\t  else\n\t    func_append newdlfiles \" $lib\"\n\t  fi\n\t  continue\n\tfi # $pass = dlopen\n\n\t# We need an absolute path.\n\tcase $ladir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs_ladir=\"$ladir\" ;;\n\t*)\n\t  abs_ladir=`cd \"$ladir\" && pwd`\n\t  if test -z \"$abs_ladir\"; then\n\t    func_warning \"cannot determine absolute directory name of \\`$ladir'\"\n\t    func_warning \"passing it literally to the linker, although it might fail\"\n\t    abs_ladir=\"$ladir\"\n\t  fi\n\t  ;;\n\tesac\n\tfunc_basename \"$lib\"\n\tlaname=\"$func_basename_result\"\n\n\t# Find the relevant object directory and library name.\n\tif test \"X$installed\" = Xyes; then\n\t  if test ! -f \"$lt_sysroot$libdir/$linklib\" && test -f \"$abs_ladir/$linklib\"; then\n\t    func_warning \"library \\`$lib' was moved.\"\n\t    dir=\"$ladir\"\n\t    absdir=\"$abs_ladir\"\n\t    libdir=\"$abs_ladir\"\n\t  else\n\t    dir=\"$lt_sysroot$libdir\"\n\t    absdir=\"$lt_sysroot$libdir\"\n\t  fi\n\t  test \"X$hardcode_automatic\" = Xyes && avoidtemprpath=yes\n\telse\n\t  if test ! -f \"$ladir/$objdir/$linklib\" && test -f \"$abs_ladir/$linklib\"; then\n\t    dir=\"$ladir\"\n\t    absdir=\"$abs_ladir\"\n\t    # Remove this search path later\n\t    func_append notinst_path \" $abs_ladir\"\n\t  else\n\t    dir=\"$ladir/$objdir\"\n\t    absdir=\"$abs_ladir/$objdir\"\n\t    # Remove this search path later\n\t    func_append notinst_path \" $abs_ladir\"\n\t  fi\n\tfi # $installed = yes\n\tfunc_stripname 'lib' '.la' \"$laname\"\n\tname=$func_stripname_result\n\n\t# This library was specified with -dlpreopen.\n\tif test \"$pass\" = dlpreopen; then\n\t  if test -z \"$libdir\" && test \"$linkmode\" = prog; then\n\t    func_fatal_error \"only libraries may -dlpreopen a convenience library: \\`$lib'\"\n\t  fi\n\t  case \"$host\" in\n\t    # special handling for platforms with PE-DLLs.\n\t    *cygwin* | *mingw* | *cegcc* )\n\t      # Linker will automatically link against shared library if both\n\t      # static and shared are present.  Therefore, ensure we extract\n\t      # symbols from the import library if a shared library is present\n\t      # (otherwise, the dlopen module name will be incorrect).  We do\n\t      # this by putting the import library name into $newdlprefiles.\n\t      # We recover the dlopen module name by 'saving' the la file\n\t      # name in a special purpose variable, and (later) extracting the\n\t      # dlname from the la file.\n\t      if test -n \"$dlname\"; then\n\t        func_tr_sh \"$dir/$linklib\"\n\t        eval \"libfile_$func_tr_sh_result=\\$abs_ladir/\\$laname\"\n\t        func_append newdlprefiles \" $dir/$linklib\"\n\t      else\n\t        func_append newdlprefiles \" $dir/$old_library\"\n\t        # Keep a list of preopened convenience libraries to check\n\t        # that they are being used correctly in the link pass.\n\t        test -z \"$libdir\" && \\\n\t          func_append dlpreconveniencelibs \" $dir/$old_library\"\n\t      fi\n\t    ;;\n\t    * )\n\t      # Prefer using a static library (so that no silly _DYNAMIC symbols\n\t      # are required to link).\n\t      if test -n \"$old_library\"; then\n\t        func_append newdlprefiles \" $dir/$old_library\"\n\t        # Keep a list of preopened convenience libraries to check\n\t        # that they are being used correctly in the link pass.\n\t        test -z \"$libdir\" && \\\n\t          func_append dlpreconveniencelibs \" $dir/$old_library\"\n\t      # Otherwise, use the dlname, so that lt_dlopen finds it.\n\t      elif test -n \"$dlname\"; then\n\t        func_append newdlprefiles \" $dir/$dlname\"\n\t      else\n\t        func_append newdlprefiles \" $dir/$linklib\"\n\t      fi\n\t    ;;\n\t  esac\n\tfi # $pass = dlpreopen\n\n\tif test -z \"$libdir\"; then\n\t  # Link the convenience library\n\t  if test \"$linkmode\" = lib; then\n\t    deplibs=\"$dir/$old_library $deplibs\"\n\t  elif test \"$linkmode,$pass\" = \"prog,link\"; then\n\t    compile_deplibs=\"$dir/$old_library $compile_deplibs\"\n\t    finalize_deplibs=\"$dir/$old_library $finalize_deplibs\"\n\t  else\n\t    deplibs=\"$lib $deplibs\" # used for prog,scan pass\n\t  fi\n\t  continue\n\tfi\n\n\n\tif test \"$linkmode\" = prog && test \"$pass\" != link; then\n\t  func_append newlib_search_path \" $ladir\"\n\t  deplibs=\"$lib $deplibs\"\n\n\t  linkalldeplibs=no\n\t  if test \"$link_all_deplibs\" != no || test -z \"$library_names\" ||\n\t     test \"$build_libtool_libs\" = no; then\n\t    linkalldeplibs=yes\n\t  fi\n\n\t  tmp_libs=\n\t  for deplib in $dependency_libs; do\n\t    case $deplib in\n\t    -L*) func_stripname '-L' '' \"$deplib\"\n\t         func_resolve_sysroot \"$func_stripname_result\"\n\t         func_append newlib_search_path \" $func_resolve_sysroot_result\"\n\t\t ;;\n\t    esac\n\t    # Need to link against all dependency_libs?\n\t    if test \"$linkalldeplibs\" = yes; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      # Need to hardcode shared library paths\n\t      # or/and link against static libraries\n\t      newdependency_libs=\"$deplib $newdependency_libs\"\n\t    fi\n\t    if $opt_preserve_dup_deps ; then\n\t      case \"$tmp_libs \" in\n\t      *\" $deplib \"*) func_append specialdeplibs \" $deplib\" ;;\n\t      esac\n\t    fi\n\t    func_append tmp_libs \" $deplib\"\n\t  done # for deplib\n\t  continue\n\tfi # $linkmode = prog...\n\n\tif test \"$linkmode,$pass\" = \"prog,link\"; then\n\t  if test -n \"$library_names\" &&\n\t     { { test \"$prefer_static_libs\" = no ||\n\t         test \"$prefer_static_libs,$installed\" = \"built,yes\"; } ||\n\t       test -z \"$old_library\"; }; then\n\t    # We need to hardcode the library path\n\t    if test -n \"$shlibpath_var\" && test -z \"$avoidtemprpath\" ; then\n\t      # Make sure the rpath contains only unique directories.\n\t      case \"$temp_rpath:\" in\n\t      *\"$absdir:\"*) ;;\n\t      *) func_append temp_rpath \"$absdir:\" ;;\n\t      esac\n\t    fi\n\n\t    # Hardcode the library path.\n\t    # Skip directories that are in the system default run-time\n\t    # search path.\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $absdir \"*) ;;\n\t    *)\n\t      case \"$compile_rpath \" in\n\t      *\" $absdir \"*) ;;\n\t      *) func_append compile_rpath \" $absdir\" ;;\n\t      esac\n\t      ;;\n\t    esac\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $libdir \"*) ;;\n\t    *)\n\t      case \"$finalize_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) func_append finalize_rpath \" $libdir\" ;;\n\t      esac\n\t      ;;\n\t    esac\n\t  fi # $linkmode,$pass = prog,link...\n\n\t  if test \"$alldeplibs\" = yes &&\n\t     { test \"$deplibs_check_method\" = pass_all ||\n\t       { test \"$build_libtool_libs\" = yes &&\n\t\t test -n \"$library_names\"; }; }; then\n\t    # We only need to search for static libraries\n\t    continue\n\t  fi\n\tfi\n\n\tlink_static=no # Whether the deplib will be linked statically\n\tuse_static_libs=$prefer_static_libs\n\tif test \"$use_static_libs\" = built && test \"$installed\" = yes; then\n\t  use_static_libs=no\n\tfi\n\tif test -n \"$library_names\" &&\n\t   { test \"$use_static_libs\" = no || test -z \"$old_library\"; }; then\n\t  case $host in\n\t  *cygwin* | *mingw* | *cegcc*)\n\t      # No point in relinking DLLs because paths are not encoded\n\t      func_append notinst_deplibs \" $lib\"\n\t      need_relink=no\n\t    ;;\n\t  *)\n\t    if test \"$installed\" = no; then\n\t      func_append notinst_deplibs \" $lib\"\n\t      need_relink=yes\n\t    fi\n\t    ;;\n\t  esac\n\t  # This is a shared library\n\n\t  # Warn about portability, can't link against -module's on some\n\t  # systems (darwin).  Don't bleat about dlopened modules though!\n\t  dlopenmodule=\"\"\n\t  for dlpremoduletest in $dlprefiles; do\n\t    if test \"X$dlpremoduletest\" = \"X$lib\"; then\n\t      dlopenmodule=\"$dlpremoduletest\"\n\t      break\n\t    fi\n\t  done\n\t  if test -z \"$dlopenmodule\" && test \"$shouldnotlink\" = yes && test \"$pass\" = link; then\n\t    echo\n\t    if test \"$linkmode\" = prog; then\n\t      $ECHO \"*** Warning: Linking the executable $output against the loadable module\"\n\t    else\n\t      $ECHO \"*** Warning: Linking the shared library $output against the loadable module\"\n\t    fi\n\t    $ECHO \"*** $linklib is not portable!\"\n\t  fi\n\t  if test \"$linkmode\" = lib &&\n\t     test \"$hardcode_into_libs\" = yes; then\n\t    # Hardcode the library path.\n\t    # Skip directories that are in the system default run-time\n\t    # search path.\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $absdir \"*) ;;\n\t    *)\n\t      case \"$compile_rpath \" in\n\t      *\" $absdir \"*) ;;\n\t      *) func_append compile_rpath \" $absdir\" ;;\n\t      esac\n\t      ;;\n\t    esac\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $libdir \"*) ;;\n\t    *)\n\t      case \"$finalize_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) func_append finalize_rpath \" $libdir\" ;;\n\t      esac\n\t      ;;\n\t    esac\n\t  fi\n\n\t  if test -n \"$old_archive_from_expsyms_cmds\"; then\n\t    # figure out the soname\n\t    set dummy $library_names\n\t    shift\n\t    realname=\"$1\"\n\t    shift\n\t    libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t    # use dlname if we got it. it's perfectly good, no?\n\t    if test -n \"$dlname\"; then\n\t      soname=\"$dlname\"\n\t    elif test -n \"$soname_spec\"; then\n\t      # bleh windows\n\t      case $host in\n\t      *cygwin* | mingw* | *cegcc*)\n\t        func_arith $current - $age\n\t\tmajor=$func_arith_result\n\t\tversuffix=\"-$major\"\n\t\t;;\n\t      esac\n\t      eval soname=\\\"$soname_spec\\\"\n\t    else\n\t      soname=\"$realname\"\n\t    fi\n\n\t    # Make a new name for the extract_expsyms_cmds to use\n\t    soroot=\"$soname\"\n\t    func_basename \"$soroot\"\n\t    soname=\"$func_basename_result\"\n\t    func_stripname 'lib' '.dll' \"$soname\"\n\t    newlib=libimp-$func_stripname_result.a\n\n\t    # If the library has no export list, then create one now\n\t    if test -f \"$output_objdir/$soname-def\"; then :\n\t    else\n\t      func_verbose \"extracting exported symbol list from \\`$soname'\"\n\t      func_execute_cmds \"$extract_expsyms_cmds\" 'exit $?'\n\t    fi\n\n\t    # Create $newlib\n\t    if test -f \"$output_objdir/$newlib\"; then :; else\n\t      func_verbose \"generating import library for \\`$soname'\"\n\t      func_execute_cmds \"$old_archive_from_expsyms_cmds\" 'exit $?'\n\t    fi\n\t    # make sure the library variables are pointing to the new library\n\t    dir=$output_objdir\n\t    linklib=$newlib\n\t  fi # test -n \"$old_archive_from_expsyms_cmds\"\n\n\t  if test \"$linkmode\" = prog || test \"$opt_mode\" != relink; then\n\t    add_shlibpath=\n\t    add_dir=\n\t    add=\n\t    lib_linked=yes\n\t    case $hardcode_action in\n\t    immediate | unsupported)\n\t      if test \"$hardcode_direct\" = no; then\n\t\tadd=\"$dir/$linklib\"\n\t\tcase $host in\n\t\t  *-*-sco3.2v5.0.[024]*) add_dir=\"-L$dir\" ;;\n\t\t  *-*-sysv4*uw2*) add_dir=\"-L$dir\" ;;\n\t\t  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \\\n\t\t    *-*-unixware7*) add_dir=\"-L$dir\" ;;\n\t\t  *-*-darwin* )\n\t\t    # if the lib is a (non-dlopened) module then we can not\n\t\t    # link against it, someone is ignoring the earlier warnings\n\t\t    if /usr/bin/file -L $add 2> /dev/null |\n\t\t\t $GREP \": [^:]* bundle\" >/dev/null ; then\n\t\t      if test \"X$dlopenmodule\" != \"X$lib\"; then\n\t\t\t$ECHO \"*** Warning: lib $linklib is a module, not a shared library\"\n\t\t\tif test -z \"$old_library\" ; then\n\t\t\t  echo\n\t\t\t  echo \"*** And there doesn't seem to be a static archive available\"\n\t\t\t  echo \"*** The link will probably fail, sorry\"\n\t\t\telse\n\t\t\t  add=\"$dir/$old_library\"\n\t\t\tfi\n\t\t      elif test -n \"$old_library\"; then\n\t\t\tadd=\"$dir/$old_library\"\n\t\t      fi\n\t\t    fi\n\t\tesac\n\t      elif test \"$hardcode_minus_L\" = no; then\n\t\tcase $host in\n\t\t*-*-sunos*) add_shlibpath=\"$dir\" ;;\n\t\tesac\n\t\tadd_dir=\"-L$dir\"\n\t\tadd=\"-l$name\"\n\t      elif test \"$hardcode_shlibpath_var\" = no; then\n\t\tadd_shlibpath=\"$dir\"\n\t\tadd=\"-l$name\"\n\t      else\n\t\tlib_linked=no\n\t      fi\n\t      ;;\n\t    relink)\n\t      if test \"$hardcode_direct\" = yes &&\n\t         test \"$hardcode_direct_absolute\" = no; then\n\t\tadd=\"$dir/$linklib\"\n\t      elif test \"$hardcode_minus_L\" = yes; then\n\t\tadd_dir=\"-L$absdir\"\n\t\t# Try looking first in the location we're being installed to.\n\t\tif test -n \"$inst_prefix_dir\"; then\n\t\t  case $libdir in\n\t\t    [\\\\/]*)\n\t\t      func_append add_dir \" -L$inst_prefix_dir$libdir\"\n\t\t      ;;\n\t\t  esac\n\t\tfi\n\t\tadd=\"-l$name\"\n\t      elif test \"$hardcode_shlibpath_var\" = yes; then\n\t\tadd_shlibpath=\"$dir\"\n\t\tadd=\"-l$name\"\n\t      else\n\t\tlib_linked=no\n\t      fi\n\t      ;;\n\t    *) lib_linked=no ;;\n\t    esac\n\n\t    if test \"$lib_linked\" != yes; then\n\t      func_fatal_configuration \"unsupported hardcode properties\"\n\t    fi\n\n\t    if test -n \"$add_shlibpath\"; then\n\t      case :$compile_shlibpath: in\n\t      *\":$add_shlibpath:\"*) ;;\n\t      *) func_append compile_shlibpath \"$add_shlibpath:\" ;;\n\t      esac\n\t    fi\n\t    if test \"$linkmode\" = prog; then\n\t      test -n \"$add_dir\" && compile_deplibs=\"$add_dir $compile_deplibs\"\n\t      test -n \"$add\" && compile_deplibs=\"$add $compile_deplibs\"\n\t    else\n\t      test -n \"$add_dir\" && deplibs=\"$add_dir $deplibs\"\n\t      test -n \"$add\" && deplibs=\"$add $deplibs\"\n\t      if test \"$hardcode_direct\" != yes &&\n\t\t test \"$hardcode_minus_L\" != yes &&\n\t\t test \"$hardcode_shlibpath_var\" = yes; then\n\t\tcase :$finalize_shlibpath: in\n\t\t*\":$libdir:\"*) ;;\n\t\t*) func_append finalize_shlibpath \"$libdir:\" ;;\n\t\tesac\n\t      fi\n\t    fi\n\t  fi\n\n\t  if test \"$linkmode\" = prog || test \"$opt_mode\" = relink; then\n\t    add_shlibpath=\n\t    add_dir=\n\t    add=\n\t    # Finalize command for both is simple: just hardcode it.\n\t    if test \"$hardcode_direct\" = yes &&\n\t       test \"$hardcode_direct_absolute\" = no; then\n\t      add=\"$libdir/$linklib\"\n\t    elif test \"$hardcode_minus_L\" = yes; then\n\t      add_dir=\"-L$libdir\"\n\t      add=\"-l$name\"\n\t    elif test \"$hardcode_shlibpath_var\" = yes; then\n\t      case :$finalize_shlibpath: in\n\t      *\":$libdir:\"*) ;;\n\t      *) func_append finalize_shlibpath \"$libdir:\" ;;\n\t      esac\n\t      add=\"-l$name\"\n\t    elif test \"$hardcode_automatic\" = yes; then\n\t      if test -n \"$inst_prefix_dir\" &&\n\t\t test -f \"$inst_prefix_dir$libdir/$linklib\" ; then\n\t\tadd=\"$inst_prefix_dir$libdir/$linklib\"\n\t      else\n\t\tadd=\"$libdir/$linklib\"\n\t      fi\n\t    else\n\t      # We cannot seem to hardcode it, guess we'll fake it.\n\t      add_dir=\"-L$libdir\"\n\t      # Try looking first in the location we're being installed to.\n\t      if test -n \"$inst_prefix_dir\"; then\n\t\tcase $libdir in\n\t\t  [\\\\/]*)\n\t\t    func_append add_dir \" -L$inst_prefix_dir$libdir\"\n\t\t    ;;\n\t\tesac\n\t      fi\n\t      add=\"-l$name\"\n\t    fi\n\n\t    if test \"$linkmode\" = prog; then\n\t      test -n \"$add_dir\" && finalize_deplibs=\"$add_dir $finalize_deplibs\"\n\t      test -n \"$add\" && finalize_deplibs=\"$add $finalize_deplibs\"\n\t    else\n\t      test -n \"$add_dir\" && deplibs=\"$add_dir $deplibs\"\n\t      test -n \"$add\" && deplibs=\"$add $deplibs\"\n\t    fi\n\t  fi\n\telif test \"$linkmode\" = prog; then\n\t  # Here we assume that one of hardcode_direct or hardcode_minus_L\n\t  # is not unsupported.  This is valid on all known static and\n\t  # shared platforms.\n\t  if test \"$hardcode_direct\" != unsupported; then\n\t    test -n \"$old_library\" && linklib=\"$old_library\"\n\t    compile_deplibs=\"$dir/$linklib $compile_deplibs\"\n\t    finalize_deplibs=\"$dir/$linklib $finalize_deplibs\"\n\t  else\n\t    compile_deplibs=\"-l$name -L$dir $compile_deplibs\"\n\t    finalize_deplibs=\"-l$name -L$dir $finalize_deplibs\"\n\t  fi\n\telif test \"$build_libtool_libs\" = yes; then\n\t  # Not a shared library\n\t  if test \"$deplibs_check_method\" != pass_all; then\n\t    # We're trying link a shared library against a static one\n\t    # but the system doesn't support it.\n\n\t    # Just print a warning and add the library to dependency_libs so\n\t    # that the program can be linked against the static library.\n\t    echo\n\t    $ECHO \"*** Warning: This system can not link to static lib archive $lib.\"\n\t    echo \"*** I have the capability to make that library automatically link in when\"\n\t    echo \"*** you link to this library.  But I can only do this if you have a\"\n\t    echo \"*** shared version of the library, which you do not appear to have.\"\n\t    if test \"$module\" = yes; then\n\t      echo \"*** But as you try to build a module library, libtool will still create \"\n\t      echo \"*** a static module, that should work as long as the dlopening application\"\n\t      echo \"*** is linked with the -dlopen flag to resolve symbols at runtime.\"\n\t      if test -z \"$global_symbol_pipe\"; then\n\t\techo\n\t\techo \"*** However, this would only work if libtool was able to extract symbol\"\n\t\techo \"*** lists from a program, using \\`nm' or equivalent, but libtool could\"\n\t\techo \"*** not find such a program.  So, this module is probably useless.\"\n\t\techo \"*** \\`nm' from GNU binutils and a full rebuild may help.\"\n\t      fi\n\t      if test \"$build_old_libs\" = no; then\n\t\tbuild_libtool_libs=module\n\t\tbuild_old_libs=yes\n\t      else\n\t\tbuild_libtool_libs=no\n\t      fi\n\t    fi\n\t  else\n\t    deplibs=\"$dir/$old_library $deplibs\"\n\t    link_static=yes\n\t  fi\n\tfi # link shared/static library?\n\n\tif test \"$linkmode\" = lib; then\n\t  if test -n \"$dependency_libs\" &&\n\t     { test \"$hardcode_into_libs\" != yes ||\n\t       test \"$build_old_libs\" = yes ||\n\t       test \"$link_static\" = yes; }; then\n\t    # Extract -R from dependency_libs\n\t    temp_deplibs=\n\t    for libdir in $dependency_libs; do\n\t      case $libdir in\n\t      -R*) func_stripname '-R' '' \"$libdir\"\n\t           temp_xrpath=$func_stripname_result\n\t\t   case \" $xrpath \" in\n\t\t   *\" $temp_xrpath \"*) ;;\n\t\t   *) func_append xrpath \" $temp_xrpath\";;\n\t\t   esac;;\n\t      *) func_append temp_deplibs \" $libdir\";;\n\t      esac\n\t    done\n\t    dependency_libs=\"$temp_deplibs\"\n\t  fi\n\n\t  func_append newlib_search_path \" $absdir\"\n\t  # Link against this library\n\t  test \"$link_static\" = no && newdependency_libs=\"$abs_ladir/$laname $newdependency_libs\"\n\t  # ... and its dependency_libs\n\t  tmp_libs=\n\t  for deplib in $dependency_libs; do\n\t    newdependency_libs=\"$deplib $newdependency_libs\"\n\t    case $deplib in\n              -L*) func_stripname '-L' '' \"$deplib\"\n                   func_resolve_sysroot \"$func_stripname_result\";;\n              *) func_resolve_sysroot \"$deplib\" ;;\n            esac\n\t    if $opt_preserve_dup_deps ; then\n\t      case \"$tmp_libs \" in\n\t      *\" $func_resolve_sysroot_result \"*)\n                func_append specialdeplibs \" $func_resolve_sysroot_result\" ;;\n\t      esac\n\t    fi\n\t    func_append tmp_libs \" $func_resolve_sysroot_result\"\n\t  done\n\n\t  if test \"$link_all_deplibs\" != no; then\n\t    # Add the search paths of all dependency libraries\n\t    for deplib in $dependency_libs; do\n\t      path=\n\t      case $deplib in\n\t      -L*) path=\"$deplib\" ;;\n\t      *.la)\n\t        func_resolve_sysroot \"$deplib\"\n\t        deplib=$func_resolve_sysroot_result\n\t        func_dirname \"$deplib\" \"\" \".\"\n\t\tdir=$func_dirname_result\n\t\t# We need an absolute path.\n\t\tcase $dir in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) absdir=\"$dir\" ;;\n\t\t*)\n\t\t  absdir=`cd \"$dir\" && pwd`\n\t\t  if test -z \"$absdir\"; then\n\t\t    func_warning \"cannot determine absolute directory name of \\`$dir'\"\n\t\t    absdir=\"$dir\"\n\t\t  fi\n\t\t  ;;\n\t\tesac\n\t\tif $GREP \"^installed=no\" $deplib > /dev/null; then\n\t\tcase $host in\n\t\t*-*-darwin*)\n\t\t  depdepl=\n\t\t  eval deplibrary_names=`${SED} -n -e 's/^library_names=\\(.*\\)$/\\1/p' $deplib`\n\t\t  if test -n \"$deplibrary_names\" ; then\n\t\t    for tmp in $deplibrary_names ; do\n\t\t      depdepl=$tmp\n\t\t    done\n\t\t    if test -f \"$absdir/$objdir/$depdepl\" ; then\n\t\t      depdepl=\"$absdir/$objdir/$depdepl\"\n\t\t      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`\n                      if test -z \"$darwin_install_name\"; then\n                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`\n                      fi\n\t\t      func_append compiler_flags \" ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}\"\n\t\t      func_append linker_flags \" -dylib_file ${darwin_install_name}:${depdepl}\"\n\t\t      path=\n\t\t    fi\n\t\t  fi\n\t\t  ;;\n\t\t*)\n\t\t  path=\"-L$absdir/$objdir\"\n\t\t  ;;\n\t\tesac\n\t\telse\n\t\t  eval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $deplib`\n\t\t  test -z \"$libdir\" && \\\n\t\t    func_fatal_error \"\\`$deplib' is not a valid libtool archive\"\n\t\t  test \"$absdir\" != \"$libdir\" && \\\n\t\t    func_warning \"\\`$deplib' seems to be moved\"\n\n\t\t  path=\"-L$absdir\"\n\t\tfi\n\t\t;;\n\t      esac\n\t      case \" $deplibs \" in\n\t      *\" $path \"*) ;;\n\t      *) deplibs=\"$path $deplibs\" ;;\n\t      esac\n\t    done\n\t  fi # link_all_deplibs != no\n\tfi # linkmode = lib\n      done # for deplib in $libs\n      if test \"$pass\" = link; then\n\tif test \"$linkmode\" = \"prog\"; then\n\t  compile_deplibs=\"$new_inherited_linker_flags $compile_deplibs\"\n\t  finalize_deplibs=\"$new_inherited_linker_flags $finalize_deplibs\"\n\telse\n\t  compiler_flags=\"$compiler_flags \"`$ECHO \" $new_inherited_linker_flags\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tfi\n      fi\n      dependency_libs=\"$newdependency_libs\"\n      if test \"$pass\" = dlpreopen; then\n\t# Link the dlpreopened libraries before other libraries\n\tfor deplib in $save_deplibs; do\n\t  deplibs=\"$deplib $deplibs\"\n\tdone\n      fi\n      if test \"$pass\" != dlopen; then\n\tif test \"$pass\" != conv; then\n\t  # Make sure lib_search_path contains only unique directories.\n\t  lib_search_path=\n\t  for dir in $newlib_search_path; do\n\t    case \"$lib_search_path \" in\n\t    *\" $dir \"*) ;;\n\t    *) func_append lib_search_path \" $dir\" ;;\n\t    esac\n\t  done\n\t  newlib_search_path=\n\tfi\n\n\tif test \"$linkmode,$pass\" != \"prog,link\"; then\n\t  vars=\"deplibs\"\n\telse\n\t  vars=\"compile_deplibs finalize_deplibs\"\n\tfi\n\tfor var in $vars dependency_libs; do\n\t  # Add libraries to $var in reverse order\n\t  eval tmp_libs=\\\"\\$$var\\\"\n\t  new_libs=\n\t  for deplib in $tmp_libs; do\n\t    # FIXME: Pedantically, this is the right thing to do, so\n\t    #        that some nasty dependency loop isn't accidentally\n\t    #        broken:\n\t    #new_libs=\"$deplib $new_libs\"\n\t    # Pragmatically, this seems to cause very few problems in\n\t    # practice:\n\t    case $deplib in\n\t    -L*) new_libs=\"$deplib $new_libs\" ;;\n\t    -R*) ;;\n\t    *)\n\t      # And here is the reason: when a library appears more\n\t      # than once as an explicit dependence of a library, or\n\t      # is implicitly linked in more than once by the\n\t      # compiler, it is considered special, and multiple\n\t      # occurrences thereof are not removed.  Compare this\n\t      # with having the same library being listed as a\n\t      # dependency of multiple other libraries: in this case,\n\t      # we know (pedantically, we assume) the library does not\n\t      # need to be listed more than once, so we keep only the\n\t      # last copy.  This is not always right, but it is rare\n\t      # enough that we require users that really mean to play\n\t      # such unportable linking tricks to link the library\n\t      # using -Wl,-lname, so that libtool does not consider it\n\t      # for duplicate removal.\n\t      case \" $specialdeplibs \" in\n\t      *\" $deplib \"*) new_libs=\"$deplib $new_libs\" ;;\n\t      *)\n\t\tcase \" $new_libs \" in\n\t\t*\" $deplib \"*) ;;\n\t\t*) new_libs=\"$deplib $new_libs\" ;;\n\t\tesac\n\t\t;;\n\t      esac\n\t      ;;\n\t    esac\n\t  done\n\t  tmp_libs=\n\t  for deplib in $new_libs; do\n\t    case $deplib in\n\t    -L*)\n\t      case \" $tmp_libs \" in\n\t      *\" $deplib \"*) ;;\n\t      *) func_append tmp_libs \" $deplib\" ;;\n\t      esac\n\t      ;;\n\t    *) func_append tmp_libs \" $deplib\" ;;\n\t    esac\n\t  done\n\t  eval $var=\\\"$tmp_libs\\\"\n\tdone # for var\n      fi\n      # Last step: remove runtime libs from dependency_libs\n      # (they stay in deplibs)\n      tmp_libs=\n      for i in $dependency_libs ; do\n\tcase \" $predeps $postdeps $compiler_lib_search_path \" in\n\t*\" $i \"*)\n\t  i=\"\"\n\t  ;;\n\tesac\n\tif test -n \"$i\" ; then\n\t  func_append tmp_libs \" $i\"\n\tfi\n      done\n      dependency_libs=$tmp_libs\n    done # for pass\n    if test \"$linkmode\" = prog; then\n      dlfiles=\"$newdlfiles\"\n    fi\n    if test \"$linkmode\" = prog || test \"$linkmode\" = lib; then\n      dlprefiles=\"$newdlprefiles\"\n    fi\n\n    case $linkmode in\n    oldlib)\n      if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n\tfunc_warning \"\\`-dlopen' is ignored for archives\"\n      fi\n\n      case \" $deplibs\" in\n      *\\ -l* | *\\ -L*)\n\tfunc_warning \"\\`-l' and \\`-L' are ignored for archives\" ;;\n      esac\n\n      test -n \"$rpath\" && \\\n\tfunc_warning \"\\`-rpath' is ignored for archives\"\n\n      test -n \"$xrpath\" && \\\n\tfunc_warning \"\\`-R' is ignored for archives\"\n\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"\\`-version-info/-version-number' is ignored for archives\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"\\`-release' is ignored for archives\"\n\n      test -n \"$export_symbols$export_symbols_regex\" && \\\n\tfunc_warning \"\\`-export-symbols' is ignored for archives\"\n\n      # Now set the variables for building old libraries.\n      build_libtool_libs=no\n      oldlibs=\"$output\"\n      func_append objs \"$old_deplibs\"\n      ;;\n\n    lib)\n      # Make sure we only generate libraries of the form `libNAME.la'.\n      case $outputname in\n      lib*)\n\tfunc_stripname 'lib' '.la' \"$outputname\"\n\tname=$func_stripname_result\n\teval shared_ext=\\\"$shrext_cmds\\\"\n\teval libname=\\\"$libname_spec\\\"\n\t;;\n      *)\n\ttest \"$module\" = no && \\\n\t  func_fatal_help \"libtool library \\`$output' must begin with \\`lib'\"\n\n\tif test \"$need_lib_prefix\" != no; then\n\t  # Add the \"lib\" prefix for modules if required\n\t  func_stripname '' '.la' \"$outputname\"\n\t  name=$func_stripname_result\n\t  eval shared_ext=\\\"$shrext_cmds\\\"\n\t  eval libname=\\\"$libname_spec\\\"\n\telse\n\t  func_stripname '' '.la' \"$outputname\"\n\t  libname=$func_stripname_result\n\tfi\n\t;;\n      esac\n\n      if test -n \"$objs\"; then\n\tif test \"$deplibs_check_method\" != pass_all; then\n\t  func_fatal_error \"cannot build libtool library \\`$output' from non-libtool objects on this host:$objs\"\n\telse\n\t  echo\n\t  $ECHO \"*** Warning: Linking the shared library $output against the non-libtool\"\n\t  $ECHO \"*** objects $objs is not portable!\"\n\t  func_append libobjs \" $objs\"\n\tfi\n      fi\n\n      test \"$dlself\" != no && \\\n\tfunc_warning \"\\`-dlopen self' is ignored for libtool libraries\"\n\n      set dummy $rpath\n      shift\n      test \"$#\" -gt 1 && \\\n\tfunc_warning \"ignoring multiple \\`-rpath's for a libtool library\"\n\n      install_libdir=\"$1\"\n\n      oldlibs=\n      if test -z \"$rpath\"; then\n\tif test \"$build_libtool_libs\" = yes; then\n\t  # Building a libtool convenience library.\n\t  # Some compilers have problems with a `.al' extension so\n\t  # convenience libraries should have the same extension an\n\t  # archive normally would.\n\t  oldlibs=\"$output_objdir/$libname.$libext $oldlibs\"\n\t  build_libtool_libs=convenience\n\t  build_old_libs=yes\n\tfi\n\n\ttest -n \"$vinfo\" && \\\n\t  func_warning \"\\`-version-info/-version-number' is ignored for convenience libraries\"\n\n\ttest -n \"$release\" && \\\n\t  func_warning \"\\`-release' is ignored for convenience libraries\"\n      else\n\n\t# Parse the version information argument.\n\tsave_ifs=\"$IFS\"; IFS=':'\n\tset dummy $vinfo 0 0 0\n\tshift\n\tIFS=\"$save_ifs\"\n\n\ttest -n \"$7\" && \\\n\t  func_fatal_help \"too many parameters to \\`-version-info'\"\n\n\t# convert absolute version numbers to libtool ages\n\t# this retains compatibility with .la files and attempts\n\t# to make the code below a bit more comprehensible\n\n\tcase $vinfo_number in\n\tyes)\n\t  number_major=\"$1\"\n\t  number_minor=\"$2\"\n\t  number_revision=\"$3\"\n\t  #\n\t  # There are really only two kinds -- those that\n\t  # use the current revision as the major version\n\t  # and those that subtract age and use age as\n\t  # a minor version.  But, then there is irix\n\t  # which has an extra 1 added just for fun\n\t  #\n\t  case $version_type in\n\t  # correct linux to gnu/linux during the next big refactor\n\t  darwin|linux|osf|windows|none)\n\t    func_arith $number_major + $number_minor\n\t    current=$func_arith_result\n\t    age=\"$number_minor\"\n\t    revision=\"$number_revision\"\n\t    ;;\n\t  freebsd-aout|freebsd-elf|qnx|sunos)\n\t    current=\"$number_major\"\n\t    revision=\"$number_minor\"\n\t    age=\"0\"\n\t    ;;\n\t  irix|nonstopux)\n\t    func_arith $number_major + $number_minor\n\t    current=$func_arith_result\n\t    age=\"$number_minor\"\n\t    revision=\"$number_minor\"\n\t    lt_irix_increment=no\n\t    ;;\n\t  *)\n\t    func_fatal_configuration \"$modename: unknown library version type \\`$version_type'\"\n\t    ;;\n\t  esac\n\t  ;;\n\tno)\n\t  current=\"$1\"\n\t  revision=\"$2\"\n\t  age=\"$3\"\n\t  ;;\n\tesac\n\n\t# Check that each of the things are valid numbers.\n\tcase $current in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"CURRENT \\`$current' must be a nonnegative integer\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tcase $revision in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"REVISION \\`$revision' must be a nonnegative integer\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tcase $age in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"AGE \\`$age' must be a nonnegative integer\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tif test \"$age\" -gt \"$current\"; then\n\t  func_error \"AGE \\`$age' is greater than the current interface number \\`$current'\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\tfi\n\n\t# Calculate the version variables.\n\tmajor=\n\tversuffix=\n\tverstring=\n\tcase $version_type in\n\tnone) ;;\n\n\tdarwin)\n\t  # Like Linux, but with the current version available in\n\t  # verstring for coding it into the library header\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=\"$major.$age.$revision\"\n\t  # Darwin ld doesn't like 0 for these options...\n\t  func_arith $current + 1\n\t  minor_current=$func_arith_result\n\t  xlcverstring=\"${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision\"\n\t  verstring=\"-compatibility_version $minor_current -current_version $minor_current.$revision\"\n\t  ;;\n\n\tfreebsd-aout)\n\t  major=\".$current\"\n\t  versuffix=\".$current.$revision\";\n\t  ;;\n\n\tfreebsd-elf)\n\t  major=\".$current\"\n\t  versuffix=\".$current\"\n\t  ;;\n\n\tirix | nonstopux)\n\t  if test \"X$lt_irix_increment\" = \"Xno\"; then\n\t    func_arith $current - $age\n\t  else\n\t    func_arith $current - $age + 1\n\t  fi\n\t  major=$func_arith_result\n\n\t  case $version_type in\n\t    nonstopux) verstring_prefix=nonstopux ;;\n\t    *)         verstring_prefix=sgi ;;\n\t  esac\n\t  verstring=\"$verstring_prefix$major.$revision\"\n\n\t  # Add in all the interfaces that we are compatible with.\n\t  loop=$revision\n\t  while test \"$loop\" -ne 0; do\n\t    func_arith $revision - $loop\n\t    iface=$func_arith_result\n\t    func_arith $loop - 1\n\t    loop=$func_arith_result\n\t    verstring=\"$verstring_prefix$major.$iface:$verstring\"\n\t  done\n\n\t  # Before this point, $major must not contain `.'.\n\t  major=.$major\n\t  versuffix=\"$major.$revision\"\n\t  ;;\n\n\tlinux) # correct to gnu/linux during the next big refactor\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=\"$major.$age.$revision\"\n\t  ;;\n\n\tosf)\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=\".$current.$age.$revision\"\n\t  verstring=\"$current.$age.$revision\"\n\n\t  # Add in all the interfaces that we are compatible with.\n\t  loop=$age\n\t  while test \"$loop\" -ne 0; do\n\t    func_arith $current - $loop\n\t    iface=$func_arith_result\n\t    func_arith $loop - 1\n\t    loop=$func_arith_result\n\t    verstring=\"$verstring:${iface}.0\"\n\t  done\n\n\t  # Make executables depend on our current version.\n\t  func_append verstring \":${current}.0\"\n\t  ;;\n\n\tqnx)\n\t  major=\".$current\"\n\t  versuffix=\".$current\"\n\t  ;;\n\n\tsunos)\n\t  major=\".$current\"\n\t  versuffix=\".$current.$revision\"\n\t  ;;\n\n\twindows)\n\t  # Use '-' rather than '.', since we only want one\n\t  # extension on DOS 8.3 filesystems.\n\t  func_arith $current - $age\n\t  major=$func_arith_result\n\t  versuffix=\"-$major\"\n\t  ;;\n\n\t*)\n\t  func_fatal_configuration \"unknown library version type \\`$version_type'\"\n\t  ;;\n\tesac\n\n\t# Clear the version info if we defaulted, and they specified a release.\n\tif test -z \"$vinfo\" && test -n \"$release\"; then\n\t  major=\n\t  case $version_type in\n\t  darwin)\n\t    # we can't check for \"0.0\" in archive_cmds due to quoting\n\t    # problems, so we reset it completely\n\t    verstring=\n\t    ;;\n\t  *)\n\t    verstring=\"0.0\"\n\t    ;;\n\t  esac\n\t  if test \"$need_version\" = no; then\n\t    versuffix=\n\t  else\n\t    versuffix=\".0.0\"\n\t  fi\n\tfi\n\n\t# Remove version info from name if versioning should be avoided\n\tif test \"$avoid_version\" = yes && test \"$need_version\" = no; then\n\t  major=\n\t  versuffix=\n\t  verstring=\"\"\n\tfi\n\n\t# Check to see if the archive will have undefined symbols.\n\tif test \"$allow_undefined\" = yes; then\n\t  if test \"$allow_undefined_flag\" = unsupported; then\n\t    func_warning \"undefined symbols not allowed in $host shared libraries\"\n\t    build_libtool_libs=no\n\t    build_old_libs=yes\n\t  fi\n\telse\n\t  # Don't allow undefined symbols.\n\t  allow_undefined_flag=\"$no_undefined_flag\"\n\tfi\n\n      fi\n\n      func_generate_dlsyms \"$libname\" \"$libname\" \"yes\"\n      func_append libobjs \" $symfileobj\"\n      test \"X$libobjs\" = \"X \" && libobjs=\n\n      if test \"$opt_mode\" != relink; then\n\t# Remove our outputs, but don't remove object files since they\n\t# may have been created when compiling PIC objects.\n\tremovelist=\n\ttempremovelist=`$ECHO \"$output_objdir/*\"`\n\tfor p in $tempremovelist; do\n\t  case $p in\n\t    *.$objext | *.gcno)\n\t       ;;\n\t    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)\n\t       if test \"X$precious_files_regex\" != \"X\"; then\n\t\t if $ECHO \"$p\" | $EGREP -e \"$precious_files_regex\" >/dev/null 2>&1\n\t\t then\n\t\t   continue\n\t\t fi\n\t       fi\n\t       func_append removelist \" $p\"\n\t       ;;\n\t    *) ;;\n\t  esac\n\tdone\n\ttest -n \"$removelist\" && \\\n\t  func_show_eval \"${RM}r \\$removelist\"\n      fi\n\n      # Now set the variables for building old libraries.\n      if test \"$build_old_libs\" = yes && test \"$build_libtool_libs\" != convenience ; then\n\tfunc_append oldlibs \" $output_objdir/$libname.$libext\"\n\n\t# Transform .lo files to .o files.\n\toldobjs=\"$objs \"`$ECHO \"$libobjs\" | $SP2NL | $SED \"/\\.${libext}$/d; $lo2o\" | $NL2SP`\n      fi\n\n      # Eliminate all temporary directories.\n      #for path in $notinst_path; do\n      #\tlib_search_path=`$ECHO \"$lib_search_path \" | $SED \"s% $path % %g\"`\n      #\tdeplibs=`$ECHO \"$deplibs \" | $SED \"s% -L$path % %g\"`\n      #\tdependency_libs=`$ECHO \"$dependency_libs \" | $SED \"s% -L$path % %g\"`\n      #done\n\n      if test -n \"$xrpath\"; then\n\t# If the user specified any rpath flags, then add them.\n\ttemp_xrpath=\n\tfor libdir in $xrpath; do\n\t  func_replace_sysroot \"$libdir\"\n\t  func_append temp_xrpath \" -R$func_replace_sysroot_result\"\n\t  case \"$finalize_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append finalize_rpath \" $libdir\" ;;\n\t  esac\n\tdone\n\tif test \"$hardcode_into_libs\" != yes || test \"$build_old_libs\" = yes; then\n\t  dependency_libs=\"$temp_xrpath $dependency_libs\"\n\tfi\n      fi\n\n      # Make sure dlfiles contains only unique files that won't be dlpreopened\n      old_dlfiles=\"$dlfiles\"\n      dlfiles=\n      for lib in $old_dlfiles; do\n\tcase \" $dlprefiles $dlfiles \" in\n\t*\" $lib \"*) ;;\n\t*) func_append dlfiles \" $lib\" ;;\n\tesac\n      done\n\n      # Make sure dlprefiles contains only unique files\n      old_dlprefiles=\"$dlprefiles\"\n      dlprefiles=\n      for lib in $old_dlprefiles; do\n\tcase \"$dlprefiles \" in\n\t*\" $lib \"*) ;;\n\t*) func_append dlprefiles \" $lib\" ;;\n\tesac\n      done\n\n      if test \"$build_libtool_libs\" = yes; then\n\tif test -n \"$rpath\"; then\n\t  case $host in\n\t  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)\n\t    # these systems don't actually have a c library (as such)!\n\t    ;;\n\t  *-*-rhapsody* | *-*-darwin1.[012])\n\t    # Rhapsody C library is in the System framework\n\t    func_append deplibs \" System.ltframework\"\n\t    ;;\n\t  *-*-netbsd*)\n\t    # Don't link with libc until the a.out ld.so is fixed.\n\t    ;;\n\t  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)\n\t    # Do not include libc due to us having libc/libc_r.\n\t    ;;\n\t  *-*-sco3.2v5* | *-*-sco5v6*)\n\t    # Causes problems with __ctype\n\t    ;;\n\t  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)\n\t    # Compiler inserts libc in the correct place for threads to work\n\t    ;;\n\t  *)\n\t    # Add libc to deplibs on all other systems if necessary.\n\t    if test \"$build_libtool_need_lc\" = \"yes\"; then\n\t      func_append deplibs \" -lc\"\n\t    fi\n\t    ;;\n\t  esac\n\tfi\n\n\t# Transform deplibs into only deplibs that can be linked in shared.\n\tname_save=$name\n\tlibname_save=$libname\n\trelease_save=$release\n\tversuffix_save=$versuffix\n\tmajor_save=$major\n\t# I'm not sure if I'm treating the release correctly.  I think\n\t# release should show up in the -l (ie -lgmp5) so we don't want to\n\t# add it in twice.  Is that correct?\n\trelease=\"\"\n\tversuffix=\"\"\n\tmajor=\"\"\n\tnewdeplibs=\n\tdroppeddeps=no\n\tcase $deplibs_check_method in\n\tpass_all)\n\t  # Don't check for shared/static.  Everything works.\n\t  # This might be a little naive.  We might want to check\n\t  # whether the library exists or not.  But this is on\n\t  # osf3 & osf4 and I'm not really sure... Just\n\t  # implementing what was already the behavior.\n\t  newdeplibs=$deplibs\n\t  ;;\n\ttest_compile)\n\t  # This code stresses the \"libraries are programs\" paradigm to its\n\t  # limits. Maybe even breaks it.  We compile a program, linking it\n\t  # against the deplibs as a proxy for the library.  Then we can check\n\t  # whether they linked in statically or dynamically with ldd.\n\t  $opt_dry_run || $RM conftest.c\n\t  cat > conftest.c <<EOF\n\t  int main() { return 0; }\nEOF\n\t  $opt_dry_run || $RM conftest\n\t  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then\n\t    ldd_output=`ldd conftest`\n\t    for i in $deplibs; do\n\t      case $i in\n\t      -l*)\n\t\tfunc_stripname -l '' \"$i\"\n\t\tname=$func_stripname_result\n\t\tif test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\t  case \" $predeps $postdeps \" in\n\t\t  *\" $i \"*)\n\t\t    func_append newdeplibs \" $i\"\n\t\t    i=\"\"\n\t\t    ;;\n\t\t  esac\n\t\tfi\n\t\tif test -n \"$i\" ; then\n\t\t  libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\t  deplib_matches=`eval \"\\\\$ECHO \\\"$library_names_spec\\\"\"`\n\t\t  set dummy $deplib_matches; shift\n\t\t  deplib_match=$1\n\t\t  if test `expr \"$ldd_output\" : \".*$deplib_match\"` -ne 0 ; then\n\t\t    func_append newdeplibs \" $i\"\n\t\t  else\n\t\t    droppeddeps=yes\n\t\t    echo\n\t\t    $ECHO \"*** Warning: dynamic linker does not accept needed library $i.\"\n\t\t    echo \"*** I have the capability to make that library automatically link in when\"\n\t\t    echo \"*** you link to this library.  But I can only do this if you have a\"\n\t\t    echo \"*** shared version of the library, which I believe you do not have\"\n\t\t    echo \"*** because a test_compile did reveal that the linker did not use it for\"\n\t\t    echo \"*** its dynamic dependency list that programs get resolved with at runtime.\"\n\t\t  fi\n\t\tfi\n\t\t;;\n\t      *)\n\t\tfunc_append newdeplibs \" $i\"\n\t\t;;\n\t      esac\n\t    done\n\t  else\n\t    # Error occurred in the first compile.  Let's try to salvage\n\t    # the situation: Compile a separate program for each library.\n\t    for i in $deplibs; do\n\t      case $i in\n\t      -l*)\n\t\tfunc_stripname -l '' \"$i\"\n\t\tname=$func_stripname_result\n\t\t$opt_dry_run || $RM conftest\n\t\tif $LTCC $LTCFLAGS -o conftest conftest.c $i; then\n\t\t  ldd_output=`ldd conftest`\n\t\t  if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\t    case \" $predeps $postdeps \" in\n\t\t    *\" $i \"*)\n\t\t      func_append newdeplibs \" $i\"\n\t\t      i=\"\"\n\t\t      ;;\n\t\t    esac\n\t\t  fi\n\t\t  if test -n \"$i\" ; then\n\t\t    libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\t    deplib_matches=`eval \"\\\\$ECHO \\\"$library_names_spec\\\"\"`\n\t\t    set dummy $deplib_matches; shift\n\t\t    deplib_match=$1\n\t\t    if test `expr \"$ldd_output\" : \".*$deplib_match\"` -ne 0 ; then\n\t\t      func_append newdeplibs \" $i\"\n\t\t    else\n\t\t      droppeddeps=yes\n\t\t      echo\n\t\t      $ECHO \"*** Warning: dynamic linker does not accept needed library $i.\"\n\t\t      echo \"*** I have the capability to make that library automatically link in when\"\n\t\t      echo \"*** you link to this library.  But I can only do this if you have a\"\n\t\t      echo \"*** shared version of the library, which you do not appear to have\"\n\t\t      echo \"*** because a test_compile did reveal that the linker did not use this one\"\n\t\t      echo \"*** as a dynamic dependency that programs can get resolved with at runtime.\"\n\t\t    fi\n\t\t  fi\n\t\telse\n\t\t  droppeddeps=yes\n\t\t  echo\n\t\t  $ECHO \"*** Warning!  Library $i is needed by this library but I was not able to\"\n\t\t  echo \"*** make it link in!  You will probably need to install it or some\"\n\t\t  echo \"*** library that it depends on before this library will be fully\"\n\t\t  echo \"*** functional.  Installing it before continuing would be even better.\"\n\t\tfi\n\t\t;;\n\t      *)\n\t\tfunc_append newdeplibs \" $i\"\n\t\t;;\n\t      esac\n\t    done\n\t  fi\n\t  ;;\n\tfile_magic*)\n\t  set dummy $deplibs_check_method; shift\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t  for a_deplib in $deplibs; do\n\t    case $a_deplib in\n\t    -l*)\n\t      func_stripname -l '' \"$a_deplib\"\n\t      name=$func_stripname_result\n\t      if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\tcase \" $predeps $postdeps \" in\n\t\t*\" $a_deplib \"*)\n\t\t  func_append newdeplibs \" $a_deplib\"\n\t\t  a_deplib=\"\"\n\t\t  ;;\n\t\tesac\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tlibname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\tif test -n \"$file_magic_glob\"; then\n\t\t  libnameglob=`func_echo_all \"$libname\" | $SED -e $file_magic_glob`\n\t\telse\n\t\t  libnameglob=$libname\n\t\tfi\n\t\ttest \"$want_nocaseglob\" = yes && nocaseglob=`shopt -p nocaseglob`\n\t\tfor i in $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t\t  if test \"$want_nocaseglob\" = yes; then\n\t\t    shopt -s nocaseglob\n\t\t    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`\n\t\t    $nocaseglob\n\t\t  else\n\t\t    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`\n\t\t  fi\n\t\t  for potent_lib in $potential_libs; do\n\t\t      # Follow soft links.\n\t\t      if ls -lLd \"$potent_lib\" 2>/dev/null |\n\t\t\t $GREP \" -> \" >/dev/null; then\n\t\t\tcontinue\n\t\t      fi\n\t\t      # The statement above tries to avoid entering an\n\t\t      # endless loop below, in case of cyclic links.\n\t\t      # We might still enter an endless loop, since a link\n\t\t      # loop can be closed while we follow links,\n\t\t      # but so what?\n\t\t      potlib=\"$potent_lib\"\n\t\t      while test -h \"$potlib\" 2>/dev/null; do\n\t\t\tpotliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`\n\t\t\tcase $potliblink in\n\t\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) potlib=\"$potliblink\";;\n\t\t\t*) potlib=`$ECHO \"$potlib\" | $SED 's,[^/]*$,,'`\"$potliblink\";;\n\t\t\tesac\n\t\t      done\n\t\t      if eval $file_magic_cmd \\\"\\$potlib\\\" 2>/dev/null |\n\t\t\t $SED -e 10q |\n\t\t\t $EGREP \"$file_magic_regex\" > /dev/null; then\n\t\t\tfunc_append newdeplibs \" $a_deplib\"\n\t\t\ta_deplib=\"\"\n\t\t\tbreak 2\n\t\t      fi\n\t\t  done\n\t\tdone\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tdroppeddeps=yes\n\t\techo\n\t\t$ECHO \"*** Warning: linker path does not have real file for library $a_deplib.\"\n\t\techo \"*** I have the capability to make that library automatically link in when\"\n\t\techo \"*** you link to this library.  But I can only do this if you have a\"\n\t\techo \"*** shared version of the library, which you do not appear to have\"\n\t\techo \"*** because I did check the linker path looking for a file starting\"\n\t\tif test -z \"$potlib\" ; then\n\t\t  $ECHO \"*** with $libname but no candidates were found. (...for file magic test)\"\n\t\telse\n\t\t  $ECHO \"*** with $libname and none of the candidates passed a file format test\"\n\t\t  $ECHO \"*** using a file magic. Last file checked: $potlib\"\n\t\tfi\n\t      fi\n\t      ;;\n\t    *)\n\t      # Add a -L argument.\n\t      func_append newdeplibs \" $a_deplib\"\n\t      ;;\n\t    esac\n\t  done # Gone through all deplibs.\n\t  ;;\n\tmatch_pattern*)\n\t  set dummy $deplibs_check_method; shift\n\t  match_pattern_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t  for a_deplib in $deplibs; do\n\t    case $a_deplib in\n\t    -l*)\n\t      func_stripname -l '' \"$a_deplib\"\n\t      name=$func_stripname_result\n\t      if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\tcase \" $predeps $postdeps \" in\n\t\t*\" $a_deplib \"*)\n\t\t  func_append newdeplibs \" $a_deplib\"\n\t\t  a_deplib=\"\"\n\t\t  ;;\n\t\tesac\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tlibname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\tfor i in $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t\t  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`\n\t\t  for potent_lib in $potential_libs; do\n\t\t    potlib=\"$potent_lib\" # see symlink-check above in file_magic test\n\t\t    if eval \"\\$ECHO \\\"$potent_lib\\\"\" 2>/dev/null | $SED 10q | \\\n\t\t       $EGREP \"$match_pattern_regex\" > /dev/null; then\n\t\t      func_append newdeplibs \" $a_deplib\"\n\t\t      a_deplib=\"\"\n\t\t      break 2\n\t\t    fi\n\t\t  done\n\t\tdone\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tdroppeddeps=yes\n\t\techo\n\t\t$ECHO \"*** Warning: linker path does not have real file for library $a_deplib.\"\n\t\techo \"*** I have the capability to make that library automatically link in when\"\n\t\techo \"*** you link to this library.  But I can only do this if you have a\"\n\t\techo \"*** shared version of the library, which you do not appear to have\"\n\t\techo \"*** because I did check the linker path looking for a file starting\"\n\t\tif test -z \"$potlib\" ; then\n\t\t  $ECHO \"*** with $libname but no candidates were found. (...for regex pattern test)\"\n\t\telse\n\t\t  $ECHO \"*** with $libname and none of the candidates passed a file format test\"\n\t\t  $ECHO \"*** using a regex pattern. Last file checked: $potlib\"\n\t\tfi\n\t      fi\n\t      ;;\n\t    *)\n\t      # Add a -L argument.\n\t      func_append newdeplibs \" $a_deplib\"\n\t      ;;\n\t    esac\n\t  done # Gone through all deplibs.\n\t  ;;\n\tnone | unknown | *)\n\t  newdeplibs=\"\"\n\t  tmp_deplibs=`$ECHO \" $deplibs\" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`\n\t  if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t    for i in $predeps $postdeps ; do\n\t      # can't use Xsed below, because $i might contain '/'\n\t      tmp_deplibs=`$ECHO \" $tmp_deplibs\" | $SED \"s,$i,,\"`\n\t    done\n\t  fi\n\t  case $tmp_deplibs in\n\t  *[!\\\t\\ ]*)\n\t    echo\n\t    if test \"X$deplibs_check_method\" = \"Xnone\"; then\n\t      echo \"*** Warning: inter-library dependencies are not supported in this platform.\"\n\t    else\n\t      echo \"*** Warning: inter-library dependencies are not known to be supported.\"\n\t    fi\n\t    echo \"*** All declared inter-library dependencies are being dropped.\"\n\t    droppeddeps=yes\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\tversuffix=$versuffix_save\n\tmajor=$major_save\n\trelease=$release_save\n\tlibname=$libname_save\n\tname=$name_save\n\n\tcase $host in\n\t*-*-rhapsody* | *-*-darwin1.[012])\n\t  # On Rhapsody replace the C library with the System framework\n\t  newdeplibs=`$ECHO \" $newdeplibs\" | $SED 's/ -lc / System.ltframework /'`\n\t  ;;\n\tesac\n\n\tif test \"$droppeddeps\" = yes; then\n\t  if test \"$module\" = yes; then\n\t    echo\n\t    echo \"*** Warning: libtool could not satisfy all declared inter-library\"\n\t    $ECHO \"*** dependencies of module $libname.  Therefore, libtool will create\"\n\t    echo \"*** a static module, that should work as long as the dlopening\"\n\t    echo \"*** application is linked with the -dlopen flag.\"\n\t    if test -z \"$global_symbol_pipe\"; then\n\t      echo\n\t      echo \"*** However, this would only work if libtool was able to extract symbol\"\n\t      echo \"*** lists from a program, using \\`nm' or equivalent, but libtool could\"\n\t      echo \"*** not find such a program.  So, this module is probably useless.\"\n\t      echo \"*** \\`nm' from GNU binutils and a full rebuild may help.\"\n\t    fi\n\t    if test \"$build_old_libs\" = no; then\n\t      oldlibs=\"$output_objdir/$libname.$libext\"\n\t      build_libtool_libs=module\n\t      build_old_libs=yes\n\t    else\n\t      build_libtool_libs=no\n\t    fi\n\t  else\n\t    echo \"*** The inter-library dependencies that have been dropped here will be\"\n\t    echo \"*** automatically added whenever a program is linked with this library\"\n\t    echo \"*** or is declared to -dlopen it.\"\n\n\t    if test \"$allow_undefined\" = no; then\n\t      echo\n\t      echo \"*** Since this library must not contain undefined symbols,\"\n\t      echo \"*** because either the platform does not support them or\"\n\t      echo \"*** it was explicitly requested with -no-undefined,\"\n\t      echo \"*** libtool will only create a static version of it.\"\n\t      if test \"$build_old_libs\" = no; then\n\t\toldlibs=\"$output_objdir/$libname.$libext\"\n\t\tbuild_libtool_libs=module\n\t\tbuild_old_libs=yes\n\t      else\n\t\tbuild_libtool_libs=no\n\t      fi\n\t    fi\n\t  fi\n\tfi\n\t# Done checking deplibs!\n\tdeplibs=$newdeplibs\n      fi\n      # Time to change all our \"foo.ltframework\" stuff back to \"-framework foo\"\n      case $host in\n\t*-*-darwin*)\n\t  newdeplibs=`$ECHO \" $newdeplibs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  new_inherited_linker_flags=`$ECHO \" $new_inherited_linker_flags\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  deplibs=`$ECHO \" $deplibs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  ;;\n      esac\n\n      # move library search paths that coincide with paths to not yet\n      # installed libraries to the beginning of the library search list\n      new_libs=\n      for path in $notinst_path; do\n\tcase \" $new_libs \" in\n\t*\" -L$path/$objdir \"*) ;;\n\t*)\n\t  case \" $deplibs \" in\n\t  *\" -L$path/$objdir \"*)\n\t    func_append new_libs \" -L$path/$objdir\" ;;\n\t  esac\n\t  ;;\n\tesac\n      done\n      for deplib in $deplibs; do\n\tcase $deplib in\n\t-L*)\n\t  case \" $new_libs \" in\n\t  *\" $deplib \"*) ;;\n\t  *) func_append new_libs \" $deplib\" ;;\n\t  esac\n\t  ;;\n\t*) func_append new_libs \" $deplib\" ;;\n\tesac\n      done\n      deplibs=\"$new_libs\"\n\n      # All the library-specific variables (install_libdir is set above).\n      library_names=\n      old_library=\n      dlname=\n\n      # Test again, we may have decided not to build it any more\n      if test \"$build_libtool_libs\" = yes; then\n\t# Remove ${wl} instances when linking with ld.\n\t# FIXME: should test the right _cmds variable.\n\tcase $archive_cmds in\n\t  *\\$LD\\ *) wl= ;;\n        esac\n\tif test \"$hardcode_into_libs\" = yes; then\n\t  # Hardcode the library paths\n\t  hardcode_libdirs=\n\t  dep_rpath=\n\t  rpath=\"$finalize_rpath\"\n\t  test \"$opt_mode\" != relink && rpath=\"$compile_rpath$rpath\"\n\t  for libdir in $rpath; do\n\t    if test -n \"$hardcode_libdir_flag_spec\"; then\n\t      if test -n \"$hardcode_libdir_separator\"; then\n\t\tfunc_replace_sysroot \"$libdir\"\n\t\tlibdir=$func_replace_sysroot_result\n\t\tif test -z \"$hardcode_libdirs\"; then\n\t\t  hardcode_libdirs=\"$libdir\"\n\t\telse\n\t\t  # Just accumulate the unique libdirs.\n\t\t  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t\t  *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t    ;;\n\t\t  *)\n\t\t    func_append hardcode_libdirs \"$hardcode_libdir_separator$libdir\"\n\t\t    ;;\n\t\t  esac\n\t\tfi\n\t      else\n\t\teval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t\tfunc_append dep_rpath \" $flag\"\n\t      fi\n\t    elif test -n \"$runpath_var\"; then\n\t      case \"$perm_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) func_append perm_rpath \" $libdir\" ;;\n\t      esac\n\t    fi\n\t  done\n\t  # Substitute the hardcoded libdirs into the rpath.\n\t  if test -n \"$hardcode_libdir_separator\" &&\n\t     test -n \"$hardcode_libdirs\"; then\n\t    libdir=\"$hardcode_libdirs\"\n\t    eval \"dep_rpath=\\\"$hardcode_libdir_flag_spec\\\"\"\n\t  fi\n\t  if test -n \"$runpath_var\" && test -n \"$perm_rpath\"; then\n\t    # We should set the runpath_var.\n\t    rpath=\n\t    for dir in $perm_rpath; do\n\t      func_append rpath \"$dir:\"\n\t    done\n\t    eval \"$runpath_var='$rpath\\$$runpath_var'; export $runpath_var\"\n\t  fi\n\t  test -n \"$dep_rpath\" && deplibs=\"$dep_rpath $deplibs\"\n\tfi\n\n\tshlibpath=\"$finalize_shlibpath\"\n\ttest \"$opt_mode\" != relink && shlibpath=\"$compile_shlibpath$shlibpath\"\n\tif test -n \"$shlibpath\"; then\n\t  eval \"$shlibpath_var='$shlibpath\\$$shlibpath_var'; export $shlibpath_var\"\n\tfi\n\n\t# Get the real and link names of the library.\n\teval shared_ext=\\\"$shrext_cmds\\\"\n\teval library_names=\\\"$library_names_spec\\\"\n\tset dummy $library_names\n\tshift\n\trealname=\"$1\"\n\tshift\n\n\tif test -n \"$soname_spec\"; then\n\t  eval soname=\\\"$soname_spec\\\"\n\telse\n\t  soname=\"$realname\"\n\tfi\n\tif test -z \"$dlname\"; then\n\t  dlname=$soname\n\tfi\n\n\tlib=\"$output_objdir/$realname\"\n\tlinknames=\n\tfor link\n\tdo\n\t  func_append linknames \" $link\"\n\tdone\n\n\t# Use standard objects if they are pic\n\ttest -z \"$pic_flag\" && libobjs=`$ECHO \"$libobjs\" | $SP2NL | $SED \"$lo2o\" | $NL2SP`\n\ttest \"X$libobjs\" = \"X \" && libobjs=\n\n\tdelfiles=\n\tif test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t  $opt_dry_run || cp \"$export_symbols\" \"$output_objdir/$libname.uexp\"\n\t  export_symbols=\"$output_objdir/$libname.uexp\"\n\t  func_append delfiles \" $export_symbols\"\n\tfi\n\n\torig_export_symbols=\n\tcase $host_os in\n\tcygwin* | mingw* | cegcc*)\n\t  if test -n \"$export_symbols\" && test -z \"$export_symbols_regex\"; then\n\t    # exporting using user supplied symfile\n\t    if test \"x`$SED 1q $export_symbols`\" != xEXPORTS; then\n\t      # and it's NOT already a .def file. Must figure out\n\t      # which of the given symbols are data symbols and tag\n\t      # them as such. So, trigger use of export_symbols_cmds.\n\t      # export_symbols gets reassigned inside the \"prepare\n\t      # the list of exported symbols\" if statement, so the\n\t      # include_expsyms logic still works.\n\t      orig_export_symbols=\"$export_symbols\"\n\t      export_symbols=\n\t      always_export_symbols=yes\n\t    fi\n\t  fi\n\t  ;;\n\tesac\n\n\t# Prepare the list of exported symbols\n\tif test -z \"$export_symbols\"; then\n\t  if test \"$always_export_symbols\" = yes || test -n \"$export_symbols_regex\"; then\n\t    func_verbose \"generating symbol list for \\`$libname.la'\"\n\t    export_symbols=\"$output_objdir/$libname.exp\"\n\t    $opt_dry_run || $RM $export_symbols\n\t    cmds=$export_symbols_cmds\n\t    save_ifs=\"$IFS\"; IFS='~'\n\t    for cmd1 in $cmds; do\n\t      IFS=\"$save_ifs\"\n\t      # Take the normal branch if the nm_file_list_spec branch\n\t      # doesn't work or if tool conversion is not needed.\n\t      case $nm_file_list_spec~$to_tool_file_cmd in\n\t\t*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)\n\t\t  try_normal_branch=yes\n\t\t  eval cmd=\\\"$cmd1\\\"\n\t\t  func_len \" $cmd\"\n\t\t  len=$func_len_result\n\t\t  ;;\n\t\t*)\n\t\t  try_normal_branch=no\n\t\t  ;;\n\t      esac\n\t      if test \"$try_normal_branch\" = yes \\\n\t\t && { test \"$len\" -lt \"$max_cmd_len\" \\\n\t\t      || test \"$max_cmd_len\" -le -1; }\n\t      then\n\t\tfunc_show_eval \"$cmd\" 'exit $?'\n\t\tskipped_export=false\n\t      elif test -n \"$nm_file_list_spec\"; then\n\t\tfunc_basename \"$output\"\n\t\toutput_la=$func_basename_result\n\t\tsave_libobjs=$libobjs\n\t\tsave_output=$output\n\t\toutput=${output_objdir}/${output_la}.nm\n\t\tfunc_to_tool_file \"$output\"\n\t\tlibobjs=$nm_file_list_spec$func_to_tool_file_result\n\t\tfunc_append delfiles \" $output\"\n\t\tfunc_verbose \"creating $NM input file list: $output\"\n\t\tfor obj in $save_libobjs; do\n\t\t  func_to_tool_file \"$obj\"\n\t\t  $ECHO \"$func_to_tool_file_result\"\n\t\tdone > \"$output\"\n\t\teval cmd=\\\"$cmd1\\\"\n\t\tfunc_show_eval \"$cmd\" 'exit $?'\n\t\toutput=$save_output\n\t\tlibobjs=$save_libobjs\n\t\tskipped_export=false\n\t      else\n\t\t# The command line is too long to execute in one step.\n\t\tfunc_verbose \"using reloadable object file for export list...\"\n\t\tskipped_export=:\n\t\t# Break out early, otherwise skipped_export may be\n\t\t# set to false by a later but shorter cmd.\n\t\tbreak\n\t      fi\n\t    done\n\t    IFS=\"$save_ifs\"\n\t    if test -n \"$export_symbols_regex\" && test \"X$skipped_export\" != \"X:\"; then\n\t      func_show_eval '$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"'\n\t      func_show_eval '$MV \"${export_symbols}T\" \"$export_symbols\"'\n\t    fi\n\t  fi\n\tfi\n\n\tif test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t  tmp_export_symbols=\"$export_symbols\"\n\t  test -n \"$orig_export_symbols\" && tmp_export_symbols=\"$orig_export_symbols\"\n\t  $opt_dry_run || eval '$ECHO \"$include_expsyms\" | $SP2NL >> \"$tmp_export_symbols\"'\n\tfi\n\n\tif test \"X$skipped_export\" != \"X:\" && test -n \"$orig_export_symbols\"; then\n\t  # The given exports_symbols file has to be filtered, so filter it.\n\t  func_verbose \"filter symbol list for \\`$libname.la' to tag DATA exports\"\n\t  # FIXME: $output_objdir/$libname.filter potentially contains lots of\n\t  # 's' commands which not all seds can handle. GNU sed should be fine\n\t  # though. Also, the filter scales superlinearly with the number of\n\t  # global variables. join(1) would be nice here, but unfortunately\n\t  # isn't a blessed tool.\n\t  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\\(.*\\)\\([ \\,].*\\),s|^\\1$|\\1\\2|,' < $export_symbols > $output_objdir/$libname.filter\n\t  func_append delfiles \" $export_symbols $output_objdir/$libname.filter\"\n\t  export_symbols=$output_objdir/$libname.def\n\t  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols\n\tfi\n\n\ttmp_deplibs=\n\tfor test_deplib in $deplibs; do\n\t  case \" $convenience \" in\n\t  *\" $test_deplib \"*) ;;\n\t  *)\n\t    func_append tmp_deplibs \" $test_deplib\"\n\t    ;;\n\t  esac\n\tdone\n\tdeplibs=\"$tmp_deplibs\"\n\n\tif test -n \"$convenience\"; then\n\t  if test -n \"$whole_archive_flag_spec\" &&\n\t    test \"$compiler_needs_object\" = yes &&\n\t    test -z \"$libobjs\"; then\n\t    # extract the archives, so we have objects to list.\n\t    # TODO: could optimize this to just extract one archive.\n\t    whole_archive_flag_spec=\n\t  fi\n\t  if test -n \"$whole_archive_flag_spec\"; then\n\t    save_libobjs=$libobjs\n\t    eval libobjs=\\\"\\$libobjs $whole_archive_flag_spec\\\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  else\n\t    gentop=\"$output_objdir/${outputname}x\"\n\t    func_append generated \" $gentop\"\n\n\t    func_extract_archives $gentop $convenience\n\t    func_append libobjs \" $func_extract_archives_result\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  fi\n\tfi\n\n\tif test \"$thread_safe\" = yes && test -n \"$thread_safe_flag_spec\"; then\n\t  eval flag=\\\"$thread_safe_flag_spec\\\"\n\t  func_append linker_flags \" $flag\"\n\tfi\n\n\t# Make a backup of the uninstalled library when relinking\n\tif test \"$opt_mode\" = relink; then\n\t  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?\n\tfi\n\n\t# Do each of the archive commands.\n\tif test \"$module\" = yes && test -n \"$module_cmds\" ; then\n\t  if test -n \"$export_symbols\" && test -n \"$module_expsym_cmds\"; then\n\t    eval test_cmds=\\\"$module_expsym_cmds\\\"\n\t    cmds=$module_expsym_cmds\n\t  else\n\t    eval test_cmds=\\\"$module_cmds\\\"\n\t    cmds=$module_cmds\n\t  fi\n\telse\n\t  if test -n \"$export_symbols\" && test -n \"$archive_expsym_cmds\"; then\n\t    eval test_cmds=\\\"$archive_expsym_cmds\\\"\n\t    cmds=$archive_expsym_cmds\n\t  else\n\t    eval test_cmds=\\\"$archive_cmds\\\"\n\t    cmds=$archive_cmds\n\t  fi\n\tfi\n\n\tif test \"X$skipped_export\" != \"X:\" &&\n\t   func_len \" $test_cmds\" &&\n\t   len=$func_len_result &&\n\t   test \"$len\" -lt \"$max_cmd_len\" || test \"$max_cmd_len\" -le -1; then\n\t  :\n\telse\n\t  # The command line is too long to link in one step, link piecewise\n\t  # or, if using GNU ld and skipped_export is not :, use a linker\n\t  # script.\n\n\t  # Save the value of $output and $libobjs because we want to\n\t  # use them later.  If we have whole_archive_flag_spec, we\n\t  # want to use save_libobjs as it was before\n\t  # whole_archive_flag_spec was expanded, because we can't\n\t  # assume the linker understands whole_archive_flag_spec.\n\t  # This may have to be revisited, in case too many\n\t  # convenience libraries get linked in and end up exceeding\n\t  # the spec.\n\t  if test -z \"$convenience\" || test -z \"$whole_archive_flag_spec\"; then\n\t    save_libobjs=$libobjs\n\t  fi\n\t  save_output=$output\n\t  func_basename \"$output\"\n\t  output_la=$func_basename_result\n\n\t  # Clear the reloadable object creation command queue and\n\t  # initialize k to one.\n\t  test_cmds=\n\t  concat_cmds=\n\t  objlist=\n\t  last_robj=\n\t  k=1\n\n\t  if test -n \"$save_libobjs\" && test \"X$skipped_export\" != \"X:\" && test \"$with_gnu_ld\" = yes; then\n\t    output=${output_objdir}/${output_la}.lnkscript\n\t    func_verbose \"creating GNU ld script: $output\"\n\t    echo 'INPUT (' > $output\n\t    for obj in $save_libobjs\n\t    do\n\t      func_to_tool_file \"$obj\"\n\t      $ECHO \"$func_to_tool_file_result\" >> $output\n\t    done\n\t    echo ')' >> $output\n\t    func_append delfiles \" $output\"\n\t    func_to_tool_file \"$output\"\n\t    output=$func_to_tool_file_result\n\t  elif test -n \"$save_libobjs\" && test \"X$skipped_export\" != \"X:\" && test \"X$file_list_spec\" != X; then\n\t    output=${output_objdir}/${output_la}.lnk\n\t    func_verbose \"creating linker input file list: $output\"\n\t    : > $output\n\t    set x $save_libobjs\n\t    shift\n\t    firstobj=\n\t    if test \"$compiler_needs_object\" = yes; then\n\t      firstobj=\"$1 \"\n\t      shift\n\t    fi\n\t    for obj\n\t    do\n\t      func_to_tool_file \"$obj\"\n\t      $ECHO \"$func_to_tool_file_result\" >> $output\n\t    done\n\t    func_append delfiles \" $output\"\n\t    func_to_tool_file \"$output\"\n\t    output=$firstobj\\\"$file_list_spec$func_to_tool_file_result\\\"\n\t  else\n\t    if test -n \"$save_libobjs\"; then\n\t      func_verbose \"creating reloadable object files...\"\n\t      output=$output_objdir/$output_la-${k}.$objext\n\t      eval test_cmds=\\\"$reload_cmds\\\"\n\t      func_len \" $test_cmds\"\n\t      len0=$func_len_result\n\t      len=$len0\n\n\t      # Loop over the list of objects to be linked.\n\t      for obj in $save_libobjs\n\t      do\n\t\tfunc_len \" $obj\"\n\t\tfunc_arith $len + $func_len_result\n\t\tlen=$func_arith_result\n\t\tif test \"X$objlist\" = X ||\n\t\t   test \"$len\" -lt \"$max_cmd_len\"; then\n\t\t  func_append objlist \" $obj\"\n\t\telse\n\t\t  # The command $test_cmds is almost too long, add a\n\t\t  # command to the queue.\n\t\t  if test \"$k\" -eq 1 ; then\n\t\t    # The first file doesn't have a previous command to add.\n\t\t    reload_objs=$objlist\n\t\t    eval concat_cmds=\\\"$reload_cmds\\\"\n\t\t  else\n\t\t    # All subsequent reloadable object files will link in\n\t\t    # the last one created.\n\t\t    reload_objs=\"$objlist $last_robj\"\n\t\t    eval concat_cmds=\\\"\\$concat_cmds~$reload_cmds~\\$RM $last_robj\\\"\n\t\t  fi\n\t\t  last_robj=$output_objdir/$output_la-${k}.$objext\n\t\t  func_arith $k + 1\n\t\t  k=$func_arith_result\n\t\t  output=$output_objdir/$output_la-${k}.$objext\n\t\t  objlist=\" $obj\"\n\t\t  func_len \" $last_robj\"\n\t\t  func_arith $len0 + $func_len_result\n\t\t  len=$func_arith_result\n\t\tfi\n\t      done\n\t      # Handle the remaining objects by creating one last\n\t      # reloadable object file.  All subsequent reloadable object\n\t      # files will link in the last one created.\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      reload_objs=\"$objlist $last_robj\"\n\t      eval concat_cmds=\\\"\\${concat_cmds}$reload_cmds\\\"\n\t      if test -n \"$last_robj\"; then\n\t        eval concat_cmds=\\\"\\${concat_cmds}~\\$RM $last_robj\\\"\n\t      fi\n\t      func_append delfiles \" $output\"\n\n\t    else\n\t      output=\n\t    fi\n\n\t    if ${skipped_export-false}; then\n\t      func_verbose \"generating symbol list for \\`$libname.la'\"\n\t      export_symbols=\"$output_objdir/$libname.exp\"\n\t      $opt_dry_run || $RM $export_symbols\n\t      libobjs=$output\n\t      # Append the command to create the export file.\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      eval concat_cmds=\\\"\\$concat_cmds$export_symbols_cmds\\\"\n\t      if test -n \"$last_robj\"; then\n\t\teval concat_cmds=\\\"\\$concat_cmds~\\$RM $last_robj\\\"\n\t      fi\n\t    fi\n\n\t    test -n \"$save_libobjs\" &&\n\t      func_verbose \"creating a temporary reloadable object file: $output\"\n\n\t    # Loop through the commands generated above and execute them.\n\t    save_ifs=\"$IFS\"; IFS='~'\n\t    for cmd in $concat_cmds; do\n\t      IFS=\"$save_ifs\"\n\t      $opt_silent || {\n\t\t  func_quote_for_expand \"$cmd\"\n\t\t  eval \"func_echo $func_quote_for_expand_result\"\n\t      }\n\t      $opt_dry_run || eval \"$cmd\" || {\n\t\tlt_exit=$?\n\n\t\t# Restore the uninstalled library and exit\n\t\tif test \"$opt_mode\" = relink; then\n\t\t  ( cd \"$output_objdir\" && \\\n\t\t    $RM \"${realname}T\" && \\\n\t\t    $MV \"${realname}U\" \"$realname\" )\n\t\tfi\n\n\t\texit $lt_exit\n\t      }\n\t    done\n\t    IFS=\"$save_ifs\"\n\n\t    if test -n \"$export_symbols_regex\" && ${skipped_export-false}; then\n\t      func_show_eval '$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"'\n\t      func_show_eval '$MV \"${export_symbols}T\" \"$export_symbols\"'\n\t    fi\n\t  fi\n\n          if ${skipped_export-false}; then\n\t    if test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t      tmp_export_symbols=\"$export_symbols\"\n\t      test -n \"$orig_export_symbols\" && tmp_export_symbols=\"$orig_export_symbols\"\n\t      $opt_dry_run || eval '$ECHO \"$include_expsyms\" | $SP2NL >> \"$tmp_export_symbols\"'\n\t    fi\n\n\t    if test -n \"$orig_export_symbols\"; then\n\t      # The given exports_symbols file has to be filtered, so filter it.\n\t      func_verbose \"filter symbol list for \\`$libname.la' to tag DATA exports\"\n\t      # FIXME: $output_objdir/$libname.filter potentially contains lots of\n\t      # 's' commands which not all seds can handle. GNU sed should be fine\n\t      # though. Also, the filter scales superlinearly with the number of\n\t      # global variables. join(1) would be nice here, but unfortunately\n\t      # isn't a blessed tool.\n\t      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\\(.*\\)\\([ \\,].*\\),s|^\\1$|\\1\\2|,' < $export_symbols > $output_objdir/$libname.filter\n\t      func_append delfiles \" $export_symbols $output_objdir/$libname.filter\"\n\t      export_symbols=$output_objdir/$libname.def\n\t      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols\n\t    fi\n\t  fi\n\n\t  libobjs=$output\n\t  # Restore the value of output.\n\t  output=$save_output\n\n\t  if test -n \"$convenience\" && test -n \"$whole_archive_flag_spec\"; then\n\t    eval libobjs=\\\"\\$libobjs $whole_archive_flag_spec\\\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  fi\n\t  # Expand the library linking commands again to reset the\n\t  # value of $libobjs for piecewise linking.\n\n\t  # Do each of the archive commands.\n\t  if test \"$module\" = yes && test -n \"$module_cmds\" ; then\n\t    if test -n \"$export_symbols\" && test -n \"$module_expsym_cmds\"; then\n\t      cmds=$module_expsym_cmds\n\t    else\n\t      cmds=$module_cmds\n\t    fi\n\t  else\n\t    if test -n \"$export_symbols\" && test -n \"$archive_expsym_cmds\"; then\n\t      cmds=$archive_expsym_cmds\n\t    else\n\t      cmds=$archive_cmds\n\t    fi\n\t  fi\n\tfi\n\n\tif test -n \"$delfiles\"; then\n\t  # Append the command to remove temporary files to $cmds.\n\t  eval cmds=\\\"\\$cmds~\\$RM $delfiles\\\"\n\tfi\n\n\t# Add any objects from preloaded convenience libraries\n\tif test -n \"$dlprefiles\"; then\n\t  gentop=\"$output_objdir/${outputname}x\"\n\t  func_append generated \" $gentop\"\n\n\t  func_extract_archives $gentop $dlprefiles\n\t  func_append libobjs \" $func_extract_archives_result\"\n\t  test \"X$libobjs\" = \"X \" && libobjs=\n\tfi\n\n\tsave_ifs=\"$IFS\"; IFS='~'\n\tfor cmd in $cmds; do\n\t  IFS=\"$save_ifs\"\n\t  eval cmd=\\\"$cmd\\\"\n\t  $opt_silent || {\n\t    func_quote_for_expand \"$cmd\"\n\t    eval \"func_echo $func_quote_for_expand_result\"\n\t  }\n\t  $opt_dry_run || eval \"$cmd\" || {\n\t    lt_exit=$?\n\n\t    # Restore the uninstalled library and exit\n\t    if test \"$opt_mode\" = relink; then\n\t      ( cd \"$output_objdir\" && \\\n\t        $RM \"${realname}T\" && \\\n\t\t$MV \"${realname}U\" \"$realname\" )\n\t    fi\n\n\t    exit $lt_exit\n\t  }\n\tdone\n\tIFS=\"$save_ifs\"\n\n\t# Restore the uninstalled library and exit\n\tif test \"$opt_mode\" = relink; then\n\t  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?\n\n\t  if test -n \"$convenience\"; then\n\t    if test -z \"$whole_archive_flag_spec\"; then\n\t      func_show_eval '${RM}r \"$gentop\"'\n\t    fi\n\t  fi\n\n\t  exit $EXIT_SUCCESS\n\tfi\n\n\t# Create links to the real library.\n\tfor linkname in $linknames; do\n\t  if test \"$realname\" != \"$linkname\"; then\n\t    func_show_eval '(cd \"$output_objdir\" && $RM \"$linkname\" && $LN_S \"$realname\" \"$linkname\")' 'exit $?'\n\t  fi\n\tdone\n\n\t# If -module or -export-dynamic was specified, set the dlname.\n\tif test \"$module\" = yes || test \"$export_dynamic\" = yes; then\n\t  # On all known operating systems, these are identical.\n\t  dlname=\"$soname\"\n\tfi\n      fi\n      ;;\n\n    obj)\n      if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n\tfunc_warning \"\\`-dlopen' is ignored for objects\"\n      fi\n\n      case \" $deplibs\" in\n      *\\ -l* | *\\ -L*)\n\tfunc_warning \"\\`-l' and \\`-L' are ignored for objects\" ;;\n      esac\n\n      test -n \"$rpath\" && \\\n\tfunc_warning \"\\`-rpath' is ignored for objects\"\n\n      test -n \"$xrpath\" && \\\n\tfunc_warning \"\\`-R' is ignored for objects\"\n\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"\\`-version-info' is ignored for objects\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"\\`-release' is ignored for objects\"\n\n      case $output in\n      *.lo)\n\ttest -n \"$objs$old_deplibs\" && \\\n\t  func_fatal_error \"cannot build library object \\`$output' from non-libtool objects\"\n\n\tlibobj=$output\n\tfunc_lo2o \"$libobj\"\n\tobj=$func_lo2o_result\n\t;;\n      *)\n\tlibobj=\n\tobj=\"$output\"\n\t;;\n      esac\n\n      # Delete the old objects.\n      $opt_dry_run || $RM $obj $libobj\n\n      # Objects from convenience libraries.  This assumes\n      # single-version convenience libraries.  Whenever we create\n      # different ones for PIC/non-PIC, this we'll have to duplicate\n      # the extraction.\n      reload_conv_objs=\n      gentop=\n      # reload_cmds runs $LD directly, so let us get rid of\n      # -Wl from whole_archive_flag_spec and hope we can get by with\n      # turning comma into space..\n      wl=\n\n      if test -n \"$convenience\"; then\n\tif test -n \"$whole_archive_flag_spec\"; then\n\t  eval tmp_whole_archive_flags=\\\"$whole_archive_flag_spec\\\"\n\t  reload_conv_objs=$reload_objs\\ `$ECHO \"$tmp_whole_archive_flags\" | $SED 's|,| |g'`\n\telse\n\t  gentop=\"$output_objdir/${obj}x\"\n\t  func_append generated \" $gentop\"\n\n\t  func_extract_archives $gentop $convenience\n\t  reload_conv_objs=\"$reload_objs $func_extract_archives_result\"\n\tfi\n      fi\n\n      # If we're not building shared, we need to use non_pic_objs\n      test \"$build_libtool_libs\" != yes && libobjs=\"$non_pic_objects\"\n\n      # Create the old-style object.\n      reload_objs=\"$objs$old_deplibs \"`$ECHO \"$libobjs\" | $SP2NL | $SED \"/\\.${libext}$/d; /\\.lib$/d; $lo2o\" | $NL2SP`\" $reload_conv_objs\" ### testsuite: skip nested quoting test\n\n      output=\"$obj\"\n      func_execute_cmds \"$reload_cmds\" 'exit $?'\n\n      # Exit if we aren't doing a library object file.\n      if test -z \"$libobj\"; then\n\tif test -n \"$gentop\"; then\n\t  func_show_eval '${RM}r \"$gentop\"'\n\tfi\n\n\texit $EXIT_SUCCESS\n      fi\n\n      if test \"$build_libtool_libs\" != yes; then\n\tif test -n \"$gentop\"; then\n\t  func_show_eval '${RM}r \"$gentop\"'\n\tfi\n\n\t# Create an invalid libtool object if no PIC, so that we don't\n\t# accidentally link it into a program.\n\t# $show \"echo timestamp > $libobj\"\n\t# $opt_dry_run || eval \"echo timestamp > $libobj\" || exit $?\n\texit $EXIT_SUCCESS\n      fi\n\n      if test -n \"$pic_flag\" || test \"$pic_mode\" != default; then\n\t# Only do commands if we really have different PIC objects.\n\treload_objs=\"$libobjs $reload_conv_objs\"\n\toutput=\"$libobj\"\n\tfunc_execute_cmds \"$reload_cmds\" 'exit $?'\n      fi\n\n      if test -n \"$gentop\"; then\n\tfunc_show_eval '${RM}r \"$gentop\"'\n      fi\n\n      exit $EXIT_SUCCESS\n      ;;\n\n    prog)\n      case $host in\n\t*cygwin*) func_stripname '' '.exe' \"$output\"\n\t          output=$func_stripname_result.exe;;\n      esac\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"\\`-version-info' is ignored for programs\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"\\`-release' is ignored for programs\"\n\n      test \"$preload\" = yes \\\n        && test \"$dlopen_support\" = unknown \\\n\t&& test \"$dlopen_self\" = unknown \\\n\t&& test \"$dlopen_self_static\" = unknown && \\\n\t  func_warning \"\\`LT_INIT([dlopen])' not used. Assuming no dlopen support.\"\n\n      case $host in\n      *-*-rhapsody* | *-*-darwin1.[012])\n\t# On Rhapsody replace the C library is the System framework\n\tcompile_deplibs=`$ECHO \" $compile_deplibs\" | $SED 's/ -lc / System.ltframework /'`\n\tfinalize_deplibs=`$ECHO \" $finalize_deplibs\" | $SED 's/ -lc / System.ltframework /'`\n\t;;\n      esac\n\n      case $host in\n      *-*-darwin*)\n\t# Don't allow lazy linking, it breaks C++ global constructors\n\t# But is supposedly fixed on 10.4 or later (yay!).\n\tif test \"$tagname\" = CXX ; then\n\t  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in\n\t    10.[0123])\n\t      func_append compile_command \" ${wl}-bind_at_load\"\n\t      func_append finalize_command \" ${wl}-bind_at_load\"\n\t    ;;\n\t  esac\n\tfi\n\t# Time to change all our \"foo.ltframework\" stuff back to \"-framework foo\"\n\tcompile_deplibs=`$ECHO \" $compile_deplibs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tfinalize_deplibs=`$ECHO \" $finalize_deplibs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t;;\n      esac\n\n\n      # move library search paths that coincide with paths to not yet\n      # installed libraries to the beginning of the library search list\n      new_libs=\n      for path in $notinst_path; do\n\tcase \" $new_libs \" in\n\t*\" -L$path/$objdir \"*) ;;\n\t*)\n\t  case \" $compile_deplibs \" in\n\t  *\" -L$path/$objdir \"*)\n\t    func_append new_libs \" -L$path/$objdir\" ;;\n\t  esac\n\t  ;;\n\tesac\n      done\n      for deplib in $compile_deplibs; do\n\tcase $deplib in\n\t-L*)\n\t  case \" $new_libs \" in\n\t  *\" $deplib \"*) ;;\n\t  *) func_append new_libs \" $deplib\" ;;\n\t  esac\n\t  ;;\n\t*) func_append new_libs \" $deplib\" ;;\n\tesac\n      done\n      compile_deplibs=\"$new_libs\"\n\n\n      func_append compile_command \" $compile_deplibs\"\n      func_append finalize_command \" $finalize_deplibs\"\n\n      if test -n \"$rpath$xrpath\"; then\n\t# If the user specified any rpath flags, then add them.\n\tfor libdir in $rpath $xrpath; do\n\t  # This is the magic to use -rpath.\n\t  case \"$finalize_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append finalize_rpath \" $libdir\" ;;\n\t  esac\n\tdone\n      fi\n\n      # Now hardcode the library paths\n      rpath=\n      hardcode_libdirs=\n      for libdir in $compile_rpath $finalize_rpath; do\n\tif test -n \"$hardcode_libdir_flag_spec\"; then\n\t  if test -n \"$hardcode_libdir_separator\"; then\n\t    if test -z \"$hardcode_libdirs\"; then\n\t      hardcode_libdirs=\"$libdir\"\n\t    else\n\t      # Just accumulate the unique libdirs.\n\t      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t      *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t;;\n\t      *)\n\t\tfunc_append hardcode_libdirs \"$hardcode_libdir_separator$libdir\"\n\t\t;;\n\t      esac\n\t    fi\n\t  else\n\t    eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t    func_append rpath \" $flag\"\n\t  fi\n\telif test -n \"$runpath_var\"; then\n\t  case \"$perm_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append perm_rpath \" $libdir\" ;;\n\t  esac\n\tfi\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n\t  testbindir=`${ECHO} \"$libdir\" | ${SED} -e 's*/lib$*/bin*'`\n\t  case :$dllsearchpath: in\n\t  *\":$libdir:\"*) ;;\n\t  ::) dllsearchpath=$libdir;;\n\t  *) func_append dllsearchpath \":$libdir\";;\n\t  esac\n\t  case :$dllsearchpath: in\n\t  *\":$testbindir:\"*) ;;\n\t  ::) dllsearchpath=$testbindir;;\n\t  *) func_append dllsearchpath \":$testbindir\";;\n\t  esac\n\t  ;;\n\tesac\n      done\n      # Substitute the hardcoded libdirs into the rpath.\n      if test -n \"$hardcode_libdir_separator\" &&\n\t test -n \"$hardcode_libdirs\"; then\n\tlibdir=\"$hardcode_libdirs\"\n\teval rpath=\\\" $hardcode_libdir_flag_spec\\\"\n      fi\n      compile_rpath=\"$rpath\"\n\n      rpath=\n      hardcode_libdirs=\n      for libdir in $finalize_rpath; do\n\tif test -n \"$hardcode_libdir_flag_spec\"; then\n\t  if test -n \"$hardcode_libdir_separator\"; then\n\t    if test -z \"$hardcode_libdirs\"; then\n\t      hardcode_libdirs=\"$libdir\"\n\t    else\n\t      # Just accumulate the unique libdirs.\n\t      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t      *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t;;\n\t      *)\n\t\tfunc_append hardcode_libdirs \"$hardcode_libdir_separator$libdir\"\n\t\t;;\n\t      esac\n\t    fi\n\t  else\n\t    eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t    func_append rpath \" $flag\"\n\t  fi\n\telif test -n \"$runpath_var\"; then\n\t  case \"$finalize_perm_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append finalize_perm_rpath \" $libdir\" ;;\n\t  esac\n\tfi\n      done\n      # Substitute the hardcoded libdirs into the rpath.\n      if test -n \"$hardcode_libdir_separator\" &&\n\t test -n \"$hardcode_libdirs\"; then\n\tlibdir=\"$hardcode_libdirs\"\n\teval rpath=\\\" $hardcode_libdir_flag_spec\\\"\n      fi\n      finalize_rpath=\"$rpath\"\n\n      if test -n \"$libobjs\" && test \"$build_old_libs\" = yes; then\n\t# Transform all the library objects into standard objects.\n\tcompile_command=`$ECHO \"$compile_command\" | $SP2NL | $SED \"$lo2o\" | $NL2SP`\n\tfinalize_command=`$ECHO \"$finalize_command\" | $SP2NL | $SED \"$lo2o\" | $NL2SP`\n      fi\n\n      func_generate_dlsyms \"$outputname\" \"@PROGRAM@\" \"no\"\n\n      # template prelinking step\n      if test -n \"$prelink_cmds\"; then\n\tfunc_execute_cmds \"$prelink_cmds\" 'exit $?'\n      fi\n\n      wrappers_required=yes\n      case $host in\n      *cegcc* | *mingw32ce*)\n        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.\n        wrappers_required=no\n        ;;\n      *cygwin* | *mingw* )\n        if test \"$build_libtool_libs\" != yes; then\n          wrappers_required=no\n        fi\n        ;;\n      *)\n        if test \"$need_relink\" = no || test \"$build_libtool_libs\" != yes; then\n          wrappers_required=no\n        fi\n        ;;\n      esac\n      if test \"$wrappers_required\" = no; then\n\t# Replace the output file specification.\n\tcompile_command=`$ECHO \"$compile_command\" | $SED 's%@OUTPUT@%'\"$output\"'%g'`\n\tlink_command=\"$compile_command$compile_rpath\"\n\n\t# We have no uninstalled library dependencies, so finalize right now.\n\texit_status=0\n\tfunc_show_eval \"$link_command\" 'exit_status=$?'\n\n\tif test -n \"$postlink_cmds\"; then\n\t  func_to_tool_file \"$output\"\n\t  postlink_cmds=`func_echo_all \"$postlink_cmds\" | $SED -e 's%@OUTPUT@%'\"$output\"'%g' -e 's%@TOOL_OUTPUT@%'\"$func_to_tool_file_result\"'%g'`\n\t  func_execute_cmds \"$postlink_cmds\" 'exit $?'\n\tfi\n\n\t# Delete the generated files.\n\tif test -f \"$output_objdir/${outputname}S.${objext}\"; then\n\t  func_show_eval '$RM \"$output_objdir/${outputname}S.${objext}\"'\n\tfi\n\n\texit $exit_status\n      fi\n\n      if test -n \"$compile_shlibpath$finalize_shlibpath\"; then\n\tcompile_command=\"$shlibpath_var=\\\"$compile_shlibpath$finalize_shlibpath\\$$shlibpath_var\\\" $compile_command\"\n      fi\n      if test -n \"$finalize_shlibpath\"; then\n\tfinalize_command=\"$shlibpath_var=\\\"$finalize_shlibpath\\$$shlibpath_var\\\" $finalize_command\"\n      fi\n\n      compile_var=\n      finalize_var=\n      if test -n \"$runpath_var\"; then\n\tif test -n \"$perm_rpath\"; then\n\t  # We should set the runpath_var.\n\t  rpath=\n\t  for dir in $perm_rpath; do\n\t    func_append rpath \"$dir:\"\n\t  done\n\t  compile_var=\"$runpath_var=\\\"$rpath\\$$runpath_var\\\" \"\n\tfi\n\tif test -n \"$finalize_perm_rpath\"; then\n\t  # We should set the runpath_var.\n\t  rpath=\n\t  for dir in $finalize_perm_rpath; do\n\t    func_append rpath \"$dir:\"\n\t  done\n\t  finalize_var=\"$runpath_var=\\\"$rpath\\$$runpath_var\\\" \"\n\tfi\n      fi\n\n      if test \"$no_install\" = yes; then\n\t# We don't need to create a wrapper script.\n\tlink_command=\"$compile_var$compile_command$compile_rpath\"\n\t# Replace the output file specification.\n\tlink_command=`$ECHO \"$link_command\" | $SED 's%@OUTPUT@%'\"$output\"'%g'`\n\t# Delete the old output file.\n\t$opt_dry_run || $RM $output\n\t# Link the executable and exit\n\tfunc_show_eval \"$link_command\" 'exit $?'\n\n\tif test -n \"$postlink_cmds\"; then\n\t  func_to_tool_file \"$output\"\n\t  postlink_cmds=`func_echo_all \"$postlink_cmds\" | $SED -e 's%@OUTPUT@%'\"$output\"'%g' -e 's%@TOOL_OUTPUT@%'\"$func_to_tool_file_result\"'%g'`\n\t  func_execute_cmds \"$postlink_cmds\" 'exit $?'\n\tfi\n\n\texit $EXIT_SUCCESS\n      fi\n\n      if test \"$hardcode_action\" = relink; then\n\t# Fast installation is not supported\n\tlink_command=\"$compile_var$compile_command$compile_rpath\"\n\trelink_command=\"$finalize_var$finalize_command$finalize_rpath\"\n\n\tfunc_warning \"this platform does not like uninstalled shared libraries\"\n\tfunc_warning \"\\`$output' will be relinked during installation\"\n      else\n\tif test \"$fast_install\" != no; then\n\t  link_command=\"$finalize_var$compile_command$finalize_rpath\"\n\t  if test \"$fast_install\" = yes; then\n\t    relink_command=`$ECHO \"$compile_var$compile_command$compile_rpath\" | $SED 's%@OUTPUT@%\\$progdir/\\$file%g'`\n\t  else\n\t    # fast_install is set to needless\n\t    relink_command=\n\t  fi\n\telse\n\t  link_command=\"$compile_var$compile_command$compile_rpath\"\n\t  relink_command=\"$finalize_var$finalize_command$finalize_rpath\"\n\tfi\n      fi\n\n      # Replace the output file specification.\n      link_command=`$ECHO \"$link_command\" | $SED 's%@OUTPUT@%'\"$output_objdir/$outputname\"'%g'`\n\n      # Delete the old output files.\n      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname\n\n      func_show_eval \"$link_command\" 'exit $?'\n\n      if test -n \"$postlink_cmds\"; then\n\tfunc_to_tool_file \"$output_objdir/$outputname\"\n\tpostlink_cmds=`func_echo_all \"$postlink_cmds\" | $SED -e 's%@OUTPUT@%'\"$output_objdir/$outputname\"'%g' -e 's%@TOOL_OUTPUT@%'\"$func_to_tool_file_result\"'%g'`\n\tfunc_execute_cmds \"$postlink_cmds\" 'exit $?'\n      fi\n\n      # Now create the wrapper script.\n      func_verbose \"creating $output\"\n\n      # Quote the relink command for shipping.\n      if test -n \"$relink_command\"; then\n\t# Preserve any variables that may affect compiler behavior\n\tfor var in $variables_saved_for_relink; do\n\t  if eval test -z \\\"\\${$var+set}\\\"; then\n\t    relink_command=\"{ test -z \\\"\\${$var+set}\\\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command\"\n\t  elif eval var_value=\\$$var; test -z \"$var_value\"; then\n\t    relink_command=\"$var=; export $var; $relink_command\"\n\t  else\n\t    func_quote_for_eval \"$var_value\"\n\t    relink_command=\"$var=$func_quote_for_eval_result; export $var; $relink_command\"\n\t  fi\n\tdone\n\trelink_command=\"(cd `pwd`; $relink_command)\"\n\trelink_command=`$ECHO \"$relink_command\" | $SED \"$sed_quote_subst\"`\n      fi\n\n      # Only actually do things if not in dry run mode.\n      $opt_dry_run || {\n\t# win32 will think the script is a binary if it has\n\t# a .exe suffix, so we strip it off here.\n\tcase $output in\n\t  *.exe) func_stripname '' '.exe' \"$output\"\n\t         output=$func_stripname_result ;;\n\tesac\n\t# test for cygwin because mv fails w/o .exe extensions\n\tcase $host in\n\t  *cygwin*)\n\t    exeext=.exe\n\t    func_stripname '' '.exe' \"$outputname\"\n\t    outputname=$func_stripname_result ;;\n\t  *) exeext= ;;\n\tesac\n\tcase $host in\n\t  *cygwin* | *mingw* )\n\t    func_dirname_and_basename \"$output\" \"\" \".\"\n\t    output_name=$func_basename_result\n\t    output_path=$func_dirname_result\n\t    cwrappersource=\"$output_path/$objdir/lt-$output_name.c\"\n\t    cwrapper=\"$output_path/$output_name.exe\"\n\t    $RM $cwrappersource $cwrapper\n\t    trap \"$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE\" 1 2 15\n\n\t    func_emit_cwrapperexe_src > $cwrappersource\n\n\t    # The wrapper executable is built using the $host compiler,\n\t    # because it contains $host paths and files. If cross-\n\t    # compiling, it, like the target executable, must be\n\t    # executed on the $host or under an emulation environment.\n\t    $opt_dry_run || {\n\t      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource\n\t      $STRIP $cwrapper\n\t    }\n\n\t    # Now, create the wrapper script for func_source use:\n\t    func_ltwrapper_scriptname $cwrapper\n\t    $RM $func_ltwrapper_scriptname_result\n\t    trap \"$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE\" 1 2 15\n\t    $opt_dry_run || {\n\t      # note: this script will not be executed, so do not chmod.\n\t      if test \"x$build\" = \"x$host\" ; then\n\t\t$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result\n\t      else\n\t\tfunc_emit_wrapper no > $func_ltwrapper_scriptname_result\n\t      fi\n\t    }\n\t  ;;\n\t  * )\n\t    $RM $output\n\t    trap \"$RM $output; exit $EXIT_FAILURE\" 1 2 15\n\n\t    func_emit_wrapper no > $output\n\t    chmod +x $output\n\t  ;;\n\tesac\n      }\n      exit $EXIT_SUCCESS\n      ;;\n    esac\n\n    # See if we need to build an old-fashioned archive.\n    for oldlib in $oldlibs; do\n\n      if test \"$build_libtool_libs\" = convenience; then\n\toldobjs=\"$libobjs_save $symfileobj\"\n\taddlibs=\"$convenience\"\n\tbuild_libtool_libs=no\n      else\n\tif test \"$build_libtool_libs\" = module; then\n\t  oldobjs=\"$libobjs_save\"\n\t  build_libtool_libs=no\n\telse\n\t  oldobjs=\"$old_deplibs $non_pic_objects\"\n\t  if test \"$preload\" = yes && test -f \"$symfileobj\"; then\n\t    func_append oldobjs \" $symfileobj\"\n\t  fi\n\tfi\n\taddlibs=\"$old_convenience\"\n      fi\n\n      if test -n \"$addlibs\"; then\n\tgentop=\"$output_objdir/${outputname}x\"\n\tfunc_append generated \" $gentop\"\n\n\tfunc_extract_archives $gentop $addlibs\n\tfunc_append oldobjs \" $func_extract_archives_result\"\n      fi\n\n      # Do each command in the archive commands.\n      if test -n \"$old_archive_from_new_cmds\" && test \"$build_libtool_libs\" = yes; then\n\tcmds=$old_archive_from_new_cmds\n      else\n\n\t# Add any objects from preloaded convenience libraries\n\tif test -n \"$dlprefiles\"; then\n\t  gentop=\"$output_objdir/${outputname}x\"\n\t  func_append generated \" $gentop\"\n\n\t  func_extract_archives $gentop $dlprefiles\n\t  func_append oldobjs \" $func_extract_archives_result\"\n\tfi\n\n\t# POSIX demands no paths to be encoded in archives.  We have\n\t# to avoid creating archives with duplicate basenames if we\n\t# might have to extract them afterwards, e.g., when creating a\n\t# static archive out of a convenience library, or when linking\n\t# the entirety of a libtool archive into another (currently\n\t# not supported by libtool).\n\tif (for obj in $oldobjs\n\t    do\n\t      func_basename \"$obj\"\n\t      $ECHO \"$func_basename_result\"\n\t    done | sort | sort -uc >/dev/null 2>&1); then\n\t  :\n\telse\n\t  echo \"copying selected object files to avoid basename conflicts...\"\n\t  gentop=\"$output_objdir/${outputname}x\"\n\t  func_append generated \" $gentop\"\n\t  func_mkdir_p \"$gentop\"\n\t  save_oldobjs=$oldobjs\n\t  oldobjs=\n\t  counter=1\n\t  for obj in $save_oldobjs\n\t  do\n\t    func_basename \"$obj\"\n\t    objbase=\"$func_basename_result\"\n\t    case \" $oldobjs \" in\n\t    \" \") oldobjs=$obj ;;\n\t    *[\\ /]\"$objbase \"*)\n\t      while :; do\n\t\t# Make sure we don't pick an alternate name that also\n\t\t# overlaps.\n\t\tnewobj=lt$counter-$objbase\n\t\tfunc_arith $counter + 1\n\t\tcounter=$func_arith_result\n\t\tcase \" $oldobjs \" in\n\t\t*[\\ /]\"$newobj \"*) ;;\n\t\t*) if test ! -f \"$gentop/$newobj\"; then break; fi ;;\n\t\tesac\n\t      done\n\t      func_show_eval \"ln $obj $gentop/$newobj || cp $obj $gentop/$newobj\"\n\t      func_append oldobjs \" $gentop/$newobj\"\n\t      ;;\n\t    *) func_append oldobjs \" $obj\" ;;\n\t    esac\n\t  done\n\tfi\n\tfunc_to_tool_file \"$oldlib\" func_convert_file_msys_to_w32\n\ttool_oldlib=$func_to_tool_file_result\n\teval cmds=\\\"$old_archive_cmds\\\"\n\n\tfunc_len \" $cmds\"\n\tlen=$func_len_result\n\tif test \"$len\" -lt \"$max_cmd_len\" || test \"$max_cmd_len\" -le -1; then\n\t  cmds=$old_archive_cmds\n\telif test -n \"$archiver_list_spec\"; then\n\t  func_verbose \"using command file archive linking...\"\n\t  for obj in $oldobjs\n\t  do\n\t    func_to_tool_file \"$obj\"\n\t    $ECHO \"$func_to_tool_file_result\"\n\t  done > $output_objdir/$libname.libcmd\n\t  func_to_tool_file \"$output_objdir/$libname.libcmd\"\n\t  oldobjs=\" $archiver_list_spec$func_to_tool_file_result\"\n\t  cmds=$old_archive_cmds\n\telse\n\t  # the command line is too long to link in one step, link in parts\n\t  func_verbose \"using piecewise archive linking...\"\n\t  save_RANLIB=$RANLIB\n\t  RANLIB=:\n\t  objlist=\n\t  concat_cmds=\n\t  save_oldobjs=$oldobjs\n\t  oldobjs=\n\t  # Is there a better way of finding the last object in the list?\n\t  for obj in $save_oldobjs\n\t  do\n\t    last_oldobj=$obj\n\t  done\n\t  eval test_cmds=\\\"$old_archive_cmds\\\"\n\t  func_len \" $test_cmds\"\n\t  len0=$func_len_result\n\t  len=$len0\n\t  for obj in $save_oldobjs\n\t  do\n\t    func_len \" $obj\"\n\t    func_arith $len + $func_len_result\n\t    len=$func_arith_result\n\t    func_append objlist \" $obj\"\n\t    if test \"$len\" -lt \"$max_cmd_len\"; then\n\t      :\n\t    else\n\t      # the above command should be used before it gets too long\n\t      oldobjs=$objlist\n\t      if test \"$obj\" = \"$last_oldobj\" ; then\n\t\tRANLIB=$save_RANLIB\n\t      fi\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      eval concat_cmds=\\\"\\${concat_cmds}$old_archive_cmds\\\"\n\t      objlist=\n\t      len=$len0\n\t    fi\n\t  done\n\t  RANLIB=$save_RANLIB\n\t  oldobjs=$objlist\n\t  if test \"X$oldobjs\" = \"X\" ; then\n\t    eval cmds=\\\"\\$concat_cmds\\\"\n\t  else\n\t    eval cmds=\\\"\\$concat_cmds~\\$old_archive_cmds\\\"\n\t  fi\n\tfi\n      fi\n      func_execute_cmds \"$cmds\" 'exit $?'\n    done\n\n    test -n \"$generated\" && \\\n      func_show_eval \"${RM}r$generated\"\n\n    # Now create the libtool archive.\n    case $output in\n    *.la)\n      old_library=\n      test \"$build_old_libs\" = yes && old_library=\"$libname.$libext\"\n      func_verbose \"creating $output\"\n\n      # Preserve any variables that may affect compiler behavior\n      for var in $variables_saved_for_relink; do\n\tif eval test -z \\\"\\${$var+set}\\\"; then\n\t  relink_command=\"{ test -z \\\"\\${$var+set}\\\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command\"\n\telif eval var_value=\\$$var; test -z \"$var_value\"; then\n\t  relink_command=\"$var=; export $var; $relink_command\"\n\telse\n\t  func_quote_for_eval \"$var_value\"\n\t  relink_command=\"$var=$func_quote_for_eval_result; export $var; $relink_command\"\n\tfi\n      done\n      # Quote the link command for shipping.\n      relink_command=\"(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)\"\n      relink_command=`$ECHO \"$relink_command\" | $SED \"$sed_quote_subst\"`\n      if test \"$hardcode_automatic\" = yes ; then\n\trelink_command=\n      fi\n\n      # Only create the output if not a dry run.\n      $opt_dry_run || {\n\tfor installed in no yes; do\n\t  if test \"$installed\" = yes; then\n\t    if test -z \"$install_libdir\"; then\n\t      break\n\t    fi\n\t    output=\"$output_objdir/$outputname\"i\n\t    # Replace all uninstalled libtool libraries with the installed ones\n\t    newdependency_libs=\n\t    for deplib in $dependency_libs; do\n\t      case $deplib in\n\t      *.la)\n\t\tfunc_basename \"$deplib\"\n\t\tname=\"$func_basename_result\"\n\t\tfunc_resolve_sysroot \"$deplib\"\n\t\teval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $func_resolve_sysroot_result`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"\\`$deplib' is not a valid libtool archive\"\n\t\tfunc_append newdependency_libs \" ${lt_sysroot:+=}$libdir/$name\"\n\t\t;;\n\t      -L*)\n\t\tfunc_stripname -L '' \"$deplib\"\n\t\tfunc_replace_sysroot \"$func_stripname_result\"\n\t\tfunc_append newdependency_libs \" -L$func_replace_sysroot_result\"\n\t\t;;\n\t      -R*)\n\t\tfunc_stripname -R '' \"$deplib\"\n\t\tfunc_replace_sysroot \"$func_stripname_result\"\n\t\tfunc_append newdependency_libs \" -R$func_replace_sysroot_result\"\n\t\t;;\n\t      *) func_append newdependency_libs \" $deplib\" ;;\n\t      esac\n\t    done\n\t    dependency_libs=\"$newdependency_libs\"\n\t    newdlfiles=\n\n\t    for lib in $dlfiles; do\n\t      case $lib in\n\t      *.la)\n\t        func_basename \"$lib\"\n\t\tname=\"$func_basename_result\"\n\t\teval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $lib`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"\\`$lib' is not a valid libtool archive\"\n\t\tfunc_append newdlfiles \" ${lt_sysroot:+=}$libdir/$name\"\n\t\t;;\n\t      *) func_append newdlfiles \" $lib\" ;;\n\t      esac\n\t    done\n\t    dlfiles=\"$newdlfiles\"\n\t    newdlprefiles=\n\t    for lib in $dlprefiles; do\n\t      case $lib in\n\t      *.la)\n\t\t# Only pass preopened files to the pseudo-archive (for\n\t\t# eventual linking with the app. that links it) if we\n\t\t# didn't already link the preopened objects directly into\n\t\t# the library:\n\t\tfunc_basename \"$lib\"\n\t\tname=\"$func_basename_result\"\n\t\teval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $lib`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"\\`$lib' is not a valid libtool archive\"\n\t\tfunc_append newdlprefiles \" ${lt_sysroot:+=}$libdir/$name\"\n\t\t;;\n\t      esac\n\t    done\n\t    dlprefiles=\"$newdlprefiles\"\n\t  else\n\t    newdlfiles=\n\t    for lib in $dlfiles; do\n\t      case $lib in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs=\"$lib\" ;;\n\t\t*) abs=`pwd`\"/$lib\" ;;\n\t      esac\n\t      func_append newdlfiles \" $abs\"\n\t    done\n\t    dlfiles=\"$newdlfiles\"\n\t    newdlprefiles=\n\t    for lib in $dlprefiles; do\n\t      case $lib in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs=\"$lib\" ;;\n\t\t*) abs=`pwd`\"/$lib\" ;;\n\t      esac\n\t      func_append newdlprefiles \" $abs\"\n\t    done\n\t    dlprefiles=\"$newdlprefiles\"\n\t  fi\n\t  $RM $output\n\t  # place dlname in correct position for cygwin\n\t  # In fact, it would be nice if we could use this code for all target\n\t  # systems that can't hard-code library paths into their executables\n\t  # and that have no shared library path variable independent of PATH,\n\t  # but it turns out we can't easily determine that from inspecting\n\t  # libtool variables, so we have to hard-code the OSs to which it\n\t  # applies here; at the moment, that means platforms that use the PE\n\t  # object format with DLL files.  See the long comment at the top of\n\t  # tests/bindir.at for full details.\n\t  tdlname=$dlname\n\t  case $host,$output,$installed,$module,$dlname in\n\t    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)\n\t      # If a -bindir argument was supplied, place the dll there.\n\t      if test \"x$bindir\" != x ;\n\t      then\n\t\tfunc_relative_path \"$install_libdir\" \"$bindir\"\n\t\ttdlname=$func_relative_path_result$dlname\n\t      else\n\t\t# Otherwise fall back on heuristic.\n\t\ttdlname=../bin/$dlname\n\t      fi\n\t      ;;\n\t  esac\n\t  $ECHO > $output \"\\\n# $outputname - a libtool library file\n# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n#\n# Please DO NOT delete this file!\n# It is necessary for linking the library.\n\n# The name that we can dlopen(3).\ndlname='$tdlname'\n\n# Names of this library.\nlibrary_names='$library_names'\n\n# The name of the static archive.\nold_library='$old_library'\n\n# Linker flags that can not go in dependency_libs.\ninherited_linker_flags='$new_inherited_linker_flags'\n\n# Libraries that this one depends upon.\ndependency_libs='$dependency_libs'\n\n# Names of additional weak libraries provided by this library\nweak_library_names='$weak_libs'\n\n# Version information for $libname.\ncurrent=$current\nage=$age\nrevision=$revision\n\n# Is this an already installed library?\ninstalled=$installed\n\n# Should we warn about portability when linking against -modules?\nshouldnotlink=$module\n\n# Files to dlopen/dlpreopen\ndlopen='$dlfiles'\ndlpreopen='$dlprefiles'\n\n# Directory that this library needs to be installed in:\nlibdir='$install_libdir'\"\n\t  if test \"$installed\" = no && test \"$need_relink\" = yes; then\n\t    $ECHO >> $output \"\\\nrelink_command=\\\"$relink_command\\\"\"\n\t  fi\n\tdone\n      }\n\n      # Do a symbolic link so that the libtool archive can be found in\n      # LD_LIBRARY_PATH before the program is installed.\n      func_show_eval '( cd \"$output_objdir\" && $RM \"$outputname\" && $LN_S \"../$outputname\" \"$outputname\" )' 'exit $?'\n      ;;\n    esac\n    exit $EXIT_SUCCESS\n}\n\n{ test \"$opt_mode\" = link || test \"$opt_mode\" = relink; } &&\n    func_mode_link ${1+\"$@\"}\n\n\n# func_mode_uninstall arg...\nfunc_mode_uninstall ()\n{\n    $opt_debug\n    RM=\"$nonopt\"\n    files=\n    rmforce=\n    exit_status=0\n\n    # This variable tells wrapper scripts just to set variables rather\n    # than running their programs.\n    libtool_install_magic=\"$magic\"\n\n    for arg\n    do\n      case $arg in\n      -f) func_append RM \" $arg\"; rmforce=yes ;;\n      -*) func_append RM \" $arg\" ;;\n      *) func_append files \" $arg\" ;;\n      esac\n    done\n\n    test -z \"$RM\" && \\\n      func_fatal_help \"you must specify an RM program\"\n\n    rmdirs=\n\n    for file in $files; do\n      func_dirname \"$file\" \"\" \".\"\n      dir=\"$func_dirname_result\"\n      if test \"X$dir\" = X.; then\n\todir=\"$objdir\"\n      else\n\todir=\"$dir/$objdir\"\n      fi\n      func_basename \"$file\"\n      name=\"$func_basename_result\"\n      test \"$opt_mode\" = uninstall && odir=\"$dir\"\n\n      # Remember odir for removal later, being careful to avoid duplicates\n      if test \"$opt_mode\" = clean; then\n\tcase \" $rmdirs \" in\n\t  *\" $odir \"*) ;;\n\t  *) func_append rmdirs \" $odir\" ;;\n\tesac\n      fi\n\n      # Don't error if the file doesn't exist and rm -f was used.\n      if { test -L \"$file\"; } >/dev/null 2>&1 ||\n\t { test -h \"$file\"; } >/dev/null 2>&1 ||\n\t test -f \"$file\"; then\n\t:\n      elif test -d \"$file\"; then\n\texit_status=1\n\tcontinue\n      elif test \"$rmforce\" = yes; then\n\tcontinue\n      fi\n\n      rmfiles=\"$file\"\n\n      case $name in\n      *.la)\n\t# Possibly a libtool archive, so verify it.\n\tif func_lalib_p \"$file\"; then\n\t  func_source $dir/$name\n\n\t  # Delete the libtool libraries and symlinks.\n\t  for n in $library_names; do\n\t    func_append rmfiles \" $odir/$n\"\n\t  done\n\t  test -n \"$old_library\" && func_append rmfiles \" $odir/$old_library\"\n\n\t  case \"$opt_mode\" in\n\t  clean)\n\t    case \" $library_names \" in\n\t    *\" $dlname \"*) ;;\n\t    *) test -n \"$dlname\" && func_append rmfiles \" $odir/$dlname\" ;;\n\t    esac\n\t    test -n \"$libdir\" && func_append rmfiles \" $odir/$name $odir/${name}i\"\n\t    ;;\n\t  uninstall)\n\t    if test -n \"$library_names\"; then\n\t      # Do each command in the postuninstall commands.\n\t      func_execute_cmds \"$postuninstall_cmds\" 'test \"$rmforce\" = yes || exit_status=1'\n\t    fi\n\n\t    if test -n \"$old_library\"; then\n\t      # Do each command in the old_postuninstall commands.\n\t      func_execute_cmds \"$old_postuninstall_cmds\" 'test \"$rmforce\" = yes || exit_status=1'\n\t    fi\n\t    # FIXME: should reinstall the best remaining shared library.\n\t    ;;\n\t  esac\n\tfi\n\t;;\n\n      *.lo)\n\t# Possibly a libtool object, so verify it.\n\tif func_lalib_p \"$file\"; then\n\n\t  # Read the .lo file\n\t  func_source $dir/$name\n\n\t  # Add PIC object to the list of files to remove.\n\t  if test -n \"$pic_object\" &&\n\t     test \"$pic_object\" != none; then\n\t    func_append rmfiles \" $dir/$pic_object\"\n\t  fi\n\n\t  # Add non-PIC object to the list of files to remove.\n\t  if test -n \"$non_pic_object\" &&\n\t     test \"$non_pic_object\" != none; then\n\t    func_append rmfiles \" $dir/$non_pic_object\"\n\t  fi\n\tfi\n\t;;\n\n      *)\n\tif test \"$opt_mode\" = clean ; then\n\t  noexename=$name\n\t  case $file in\n\t  *.exe)\n\t    func_stripname '' '.exe' \"$file\"\n\t    file=$func_stripname_result\n\t    func_stripname '' '.exe' \"$name\"\n\t    noexename=$func_stripname_result\n\t    # $file with .exe has already been added to rmfiles,\n\t    # add $file without .exe\n\t    func_append rmfiles \" $file\"\n\t    ;;\n\t  esac\n\t  # Do a test to see if this is a libtool program.\n\t  if func_ltwrapper_p \"$file\"; then\n\t    if func_ltwrapper_executable_p \"$file\"; then\n\t      func_ltwrapper_scriptname \"$file\"\n\t      relink_command=\n\t      func_source $func_ltwrapper_scriptname_result\n\t      func_append rmfiles \" $func_ltwrapper_scriptname_result\"\n\t    else\n\t      relink_command=\n\t      func_source $dir/$noexename\n\t    fi\n\n\t    # note $name still contains .exe if it was in $file originally\n\t    # as does the version of $file that was added into $rmfiles\n\t    func_append rmfiles \" $odir/$name $odir/${name}S.${objext}\"\n\t    if test \"$fast_install\" = yes && test -n \"$relink_command\"; then\n\t      func_append rmfiles \" $odir/lt-$name\"\n\t    fi\n\t    if test \"X$noexename\" != \"X$name\" ; then\n\t      func_append rmfiles \" $odir/lt-${noexename}.c\"\n\t    fi\n\t  fi\n\tfi\n\t;;\n      esac\n      func_show_eval \"$RM $rmfiles\" 'exit_status=1'\n    done\n\n    # Try to remove the ${objdir}s in the directories where we deleted files\n    for dir in $rmdirs; do\n      if test -d \"$dir\"; then\n\tfunc_show_eval \"rmdir $dir >/dev/null 2>&1\"\n      fi\n    done\n\n    exit $exit_status\n}\n\n{ test \"$opt_mode\" = uninstall || test \"$opt_mode\" = clean; } &&\n    func_mode_uninstall ${1+\"$@\"}\n\ntest -z \"$opt_mode\" && {\n  help=\"$generic_help\"\n  func_fatal_help \"you must specify a MODE\"\n}\n\ntest -z \"$exec_cmd\" && \\\n  func_fatal_help \"invalid operation mode \\`$opt_mode'\"\n\nif test -n \"$exec_cmd\"; then\n  eval exec \"$exec_cmd\"\n  exit $EXIT_FAILURE\nfi\n\nexit $exit_status\n\n\n# The TAGs below are defined such that we never get into a situation\n# in which we disable both kinds of libraries.  Given conflicting\n# choices, we go for a static library, that is the most portable,\n# since we can't tell whether shared libraries were disabled because\n# the user asked for that or because the platform doesn't support\n# them.  This is particularly important on AIX, because we don't\n# support having both static and shared libraries enabled at the same\n# time on that platform, so we default to a shared-only configuration.\n# If a disable-shared tag is given, we'll fallback to a static-only\n# configuration.  But we'll never go from static-only to shared-only.\n\n# ### BEGIN LIBTOOL TAG CONFIG: disable-shared\nbuild_libtool_libs=no\nbuild_old_libs=yes\n# ### END LIBTOOL TAG CONFIG: disable-shared\n\n# ### BEGIN LIBTOOL TAG CONFIG: disable-static\nbuild_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`\n# ### END LIBTOOL TAG CONFIG: disable-static\n\n# Local Variables:\n# mode:shell-script\n# sh-indentation:2\n# End:\n# vi:sw=2\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/auto/missing",
    "content": "#! /bin/sh\n# Common wrapper for a few potentially missing GNU programs.\n\nscriptversion=2013-10-28.13; # UTC\n\n# Copyright (C) 1996-2013 Free Software Foundation, Inc.\n# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.\n\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\nif test $# -eq 0; then\n  echo 1>&2 \"Try '$0 --help' for more information\"\n  exit 1\nfi\n\ncase $1 in\n\n  --is-lightweight)\n    # Used by our autoconf macros to check whether the available missing\n    # script is modern enough.\n    exit 0\n    ;;\n\n  --run)\n    # Back-compat with the calling convention used by older automake.\n    shift\n    ;;\n\n  -h|--h|--he|--hel|--help)\n    echo \"\\\n$0 [OPTION]... PROGRAM [ARGUMENT]...\n\nRun 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due\nto PROGRAM being missing or too old.\n\nOptions:\n  -h, --help      display this help and exit\n  -v, --version   output version information and exit\n\nSupported PROGRAM values:\n  aclocal   autoconf  autoheader   autom4te  automake  makeinfo\n  bison     yacc      flex         lex       help2man\n\nVersion suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and\n'g' are ignored when checking the name.\n\nSend bug reports to <bug-automake@gnu.org>.\"\n    exit $?\n    ;;\n\n  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)\n    echo \"missing $scriptversion (GNU Automake)\"\n    exit $?\n    ;;\n\n  -*)\n    echo 1>&2 \"$0: unknown '$1' option\"\n    echo 1>&2 \"Try '$0 --help' for more information\"\n    exit 1\n    ;;\n\nesac\n\n# Run the given program, remember its exit status.\n\"$@\"; st=$?\n\n# If it succeeded, we are done.\ntest $st -eq 0 && exit 0\n\n# Also exit now if we it failed (or wasn't found), and '--version' was\n# passed; such an option is passed most likely to detect whether the\n# program is present and works.\ncase $2 in --version|--help) exit $st;; esac\n\n# Exit code 63 means version mismatch.  This often happens when the user\n# tries to use an ancient version of a tool on a file that requires a\n# minimum version.\nif test $st -eq 63; then\n  msg=\"probably too old\"\nelif test $st -eq 127; then\n  # Program was missing.\n  msg=\"missing on your system\"\nelse\n  # Program was found and executed, but failed.  Give up.\n  exit $st\nfi\n\nperl_URL=http://www.perl.org/\nflex_URL=http://flex.sourceforge.net/\ngnu_software_URL=http://www.gnu.org/software\n\nprogram_details ()\n{\n  case $1 in\n    aclocal|automake)\n      echo \"The '$1' program is part of the GNU Automake package:\"\n      echo \"<$gnu_software_URL/automake>\"\n      echo \"It also requires GNU Autoconf, GNU m4 and Perl in order to run:\"\n      echo \"<$gnu_software_URL/autoconf>\"\n      echo \"<$gnu_software_URL/m4/>\"\n      echo \"<$perl_URL>\"\n      ;;\n    autoconf|autom4te|autoheader)\n      echo \"The '$1' program is part of the GNU Autoconf package:\"\n      echo \"<$gnu_software_URL/autoconf/>\"\n      echo \"It also requires GNU m4 and Perl in order to run:\"\n      echo \"<$gnu_software_URL/m4/>\"\n      echo \"<$perl_URL>\"\n      ;;\n  esac\n}\n\ngive_advice ()\n{\n  # Normalize program name to check for.\n  normalized_program=`echo \"$1\" | sed '\n    s/^gnu-//; t\n    s/^gnu//; t\n    s/^g//; t'`\n\n  printf '%s\\n' \"'$1' is $msg.\"\n\n  configure_deps=\"'configure.ac' or m4 files included by 'configure.ac'\"\n  case $normalized_program in\n    autoconf*)\n      echo \"You should only need it if you modified 'configure.ac',\"\n      echo \"or m4 files included by it.\"\n      program_details 'autoconf'\n      ;;\n    autoheader*)\n      echo \"You should only need it if you modified 'acconfig.h' or\"\n      echo \"$configure_deps.\"\n      program_details 'autoheader'\n      ;;\n    automake*)\n      echo \"You should only need it if you modified 'Makefile.am' or\"\n      echo \"$configure_deps.\"\n      program_details 'automake'\n      ;;\n    aclocal*)\n      echo \"You should only need it if you modified 'acinclude.m4' or\"\n      echo \"$configure_deps.\"\n      program_details 'aclocal'\n      ;;\n   autom4te*)\n      echo \"You might have modified some maintainer files that require\"\n      echo \"the 'autom4te' program to be rebuilt.\"\n      program_details 'autom4te'\n      ;;\n    bison*|yacc*)\n      echo \"You should only need it if you modified a '.y' file.\"\n      echo \"You may want to install the GNU Bison package:\"\n      echo \"<$gnu_software_URL/bison/>\"\n      ;;\n    lex*|flex*)\n      echo \"You should only need it if you modified a '.l' file.\"\n      echo \"You may want to install the Fast Lexical Analyzer package:\"\n      echo \"<$flex_URL>\"\n      ;;\n    help2man*)\n      echo \"You should only need it if you modified a dependency\" \\\n           \"of a man page.\"\n      echo \"You may want to install the GNU Help2man package:\"\n      echo \"<$gnu_software_URL/help2man/>\"\n    ;;\n    makeinfo*)\n      echo \"You should only need it if you modified a '.texi' file, or\"\n      echo \"any other file indirectly affecting the aspect of the manual.\"\n      echo \"You might want to install the Texinfo package:\"\n      echo \"<$gnu_software_URL/texinfo/>\"\n      echo \"The spurious makeinfo call might also be the consequence of\"\n      echo \"using a buggy 'make' (AIX, DU, IRIX), in which case you might\"\n      echo \"want to install GNU make:\"\n      echo \"<$gnu_software_URL/make/>\"\n      ;;\n    *)\n      echo \"You might have modified some files without having the proper\"\n      echo \"tools for further handling them.  Check the 'README' file, it\"\n      echo \"often tells you about the needed prerequisites for installing\"\n      echo \"this package.  You may also peek at any GNU archive site, in\"\n      echo \"case some other package contains this missing '$1' program.\"\n      ;;\n  esac\n}\n\ngive_advice \"$1\" | sed -e '1s/^/WARNING: /' \\\n                       -e '2,$s/^/         /' >&2\n\n# Propagate the correct exit status (expected to be 127 for a program\n# not found, 63 for a program that failed due to version mismatch).\nexit $st\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/autogen.sh",
    "content": "#!/bin/sh\n\nautoreconf --install --force\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/cmake/CheckDIRSymbolExists.cmake",
    "content": "# - Check if the DIR symbol exists like in AC_HEADER_DIRENT.\n# CHECK_DIRSYMBOL_EXISTS(FILES VARIABLE)\n#\n#  FILES    - include files to check\n#  VARIABLE - variable to return result\n#\n# This module is a small but important variation on CheckSymbolExists.cmake.\n# The symbol always searched for is DIR, and the test programme follows\n# the AC_HEADER_DIRENT test programme rather than the CheckSymbolExists.cmake\n# test programme which always fails since DIR tends to be typedef'd\n# rather than #define'd.\n#\n# The following variables may be set before calling this macro to\n# modify the way the check is run:\n#\n#  CMAKE_REQUIRED_FLAGS = string of compile command line flags\n#  CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)\n#  CMAKE_REQUIRED_INCLUDES = list of include directories\n#  CMAKE_REQUIRED_LIBRARIES = list of libraries to link\n\nMACRO(CHECK_DIRSYMBOL_EXISTS FILES VARIABLE)\n    IF(NOT DEFINED ${VARIABLE})\n        SET(CMAKE_CONFIGURABLE_FILE_CONTENT \"/* */\\n\")\n        SET(MACRO_CHECK_DIRSYMBOL_EXISTS_FLAGS ${CMAKE_REQUIRED_FLAGS})\n        IF(CMAKE_REQUIRED_LIBRARIES)\n            SET(CHECK_DIRSYMBOL_EXISTS_LIBS\n                    \"-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}\")\n        ELSE(CMAKE_REQUIRED_LIBRARIES)\n            SET(CHECK_DIRSYMBOL_EXISTS_LIBS)\n        ENDIF(CMAKE_REQUIRED_LIBRARIES)\n        IF(CMAKE_REQUIRED_INCLUDES)\n            SET(CMAKE_DIRSYMBOL_EXISTS_INCLUDES\n                    \"-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}\")\n        ELSE(CMAKE_REQUIRED_INCLUDES)\n            SET(CMAKE_DIRSYMBOL_EXISTS_INCLUDES)\n        ENDIF(CMAKE_REQUIRED_INCLUDES)\n        FOREACH(FILE ${FILES})\n            SET(CMAKE_CONFIGURABLE_FILE_CONTENT\n                    \"${CMAKE_CONFIGURABLE_FILE_CONTENT}#include <${FILE}>\\n\")\n        ENDFOREACH(FILE)\n        SET(CMAKE_CONFIGURABLE_FILE_CONTENT\n                \"${CMAKE_CONFIGURABLE_FILE_CONTENT}\\nint main()\\n{if ((DIR *) 0) return 0;}\\n\")\n\n        CONFIGURE_FILE(\"${CMAKE_ROOT}/Modules/CMakeConfigurableFile.in\"\n                \"${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/CheckDIRSymbolExists.c\" @ONLY)\n\n        MESSAGE(STATUS \"Looking for DIR in ${FILES}\")\n        TRY_COMPILE(${VARIABLE}\n                ${CMAKE_BINARY_DIR}\n                ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/CheckDIRSymbolExists.c\n                COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS}\n                CMAKE_FLAGS\n                -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_DIRSYMBOL_EXISTS_FLAGS}\n                \"${CHECK_DIRSYMBOL_EXISTS_LIBS}\"\n                \"${CMAKE_DIRSYMBOL_EXISTS_INCLUDES}\"\n                OUTPUT_VARIABLE OUTPUT)\n        IF(${VARIABLE})\n            MESSAGE(STATUS \"Looking for DIR in ${FILES} - found\")\n            SET(${VARIABLE} 1 CACHE INTERNAL \"Have symbol DIR\")\n            FILE(APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeOutput.log\n                    \"Determining if the DIR symbol is defined as in AC_HEADER_DIRENT \"\n                    \"passed with the following output:\\n\"\n                    \"${OUTPUT}\\nFile ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/CheckDIRSymbolExists.c:\\n\"\n                    \"${CMAKE_CONFIGURABLE_FILE_CONTENT}\\n\")\n        ELSE(${VARIABLE})\n            MESSAGE(STATUS \"Looking for DIR in ${FILES} - not found.\")\n            SET(${VARIABLE} \"\" CACHE INTERNAL \"Have symbol DIR\")\n            FILE(APPEND ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeError.log\n                    \"Determining if the DIR symbol is defined as in AC_HEADER_DIRENT \"\n                    \"failed with the following output:\\n\"\n                    \"${OUTPUT}\\nFile ${CMAKE_BINARY_DIR}/CMakeFiles/CMakeTmp/CheckDIRSymbolExists.c:\\n\"\n                    \"${CMAKE_CONFIGURABLE_FILE_CONTENT}\\n\")\n        ENDIF(${VARIABLE})\n    ENDIF(NOT DEFINED ${VARIABLE})\nENDMACRO(CHECK_DIRSYMBOL_EXISTS)\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/cmake/CheckPrototypeExists.cmake",
    "content": "# - Check if the prototype for a function exists.\n# CHECK_PROTOTYPE_EXISTS (FUNCTION HEADER VARIABLE)\n#\n#  FUNCTION - the name of the function you are looking for\n#  HEADER - the header(s) where the prototype should be declared\n#  VARIABLE - variable to store the result\n#\n# The following variables may be set before calling this macro to\n# modify the way the check is run:\n#\n#  CMAKE_REQUIRED_FLAGS = string of compile command line flags\n#  CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar)\n#  CMAKE_REQUIRED_INCLUDES = list of include directories\n\n# Copyright (c) 2006, Alexander Neundorf, <neundorf@kde.org>\n#\n# Redistribution and use is allowed according to the terms of the BSD license.\n# For details see the accompanying COPYING-CMAKE-SCRIPTS file.\n\n\nINCLUDE(CheckCSourceCompiles)\n\nMACRO (CHECK_PROTOTYPE_EXISTS _SYMBOL _HEADER _RESULT)\n    SET(_INCLUDE_FILES)\n    FOREACH (it ${_HEADER})\n        SET(_INCLUDE_FILES \"${_INCLUDE_FILES}#include <${it}>\\n\")\n    ENDFOREACH (it)\n\n    SET(_CHECK_PROTO_EXISTS_SOURCE_CODE \"\n${_INCLUDE_FILES}\nint main()\n{\n#ifndef ${_SYMBOL}\n   int i = sizeof(&${_SYMBOL});\n#endif\n  return 0;\n}\n\")\n\n    CHECK_C_SOURCE_COMPILES(\"${_CHECK_PROTO_EXISTS_SOURCE_CODE}\" ${_RESULT})\nENDMACRO (CHECK_PROTOTYPE_EXISTS _SYMBOL _HEADER _RESULT)\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/cmake/CheckSTDC.cmake",
    "content": "message(STATUS \"Checking whether system has ANSI C header files\")\ninclude(CheckPrototypeExists)\ninclude(CheckIncludeFiles)\n\ncheck_include_files(\"dlfcn.h;stdint.h;stddef.h;inttypes.h;stdlib.h;strings.h;string.h;float.h\" StandardHeadersExist)\nif(StandardHeadersExist)\n    check_prototype_exists(memchr string.h memchrExists)\n    if(memchrExists)\n        check_prototype_exists(free stdlib.h freeExists)\n        if(freeExists)\n            message(STATUS \"ANSI C header files - found\")\n            set(STDC_HEADERS 1 CACHE INTERNAL \"System has ANSI C header files\")\n            set(HAVE_STRINGS_H 1)\n            set(HAVE_STRING_H 1)\n            set(HAVE_FLOAT_H 1)\n            set(HAVE_STDLIB_H 1)\n            set(HAVE_STDDEF_H 1)\n            set(HAVE_STDINT_H 1)\n            set(HAVE_INTTYPES_H 1)\n            set(HAVE_DLFCN_H 1)\n        endif(freeExists)\n    endif(memchrExists)\nendif(StandardHeadersExist)\n\nif(NOT STDC_HEADERS)\n    message(STATUS \"ANSI C header files - not found\")\n    set(STDC_HEADERS 0 CACHE INTERNAL \"System has ANSI C header files\")\nendif(NOT STDC_HEADERS)\n\ncheck_include_files(unistd.h HAVE_UNISTD_H)\n\ninclude(CheckDIRSymbolExists)\ncheck_dirsymbol_exists(\"sys/stat.h;sys/types.h;dirent.h\" HAVE_DIRENT_H)\nif (HAVE_DIRENT_H)\n    set(HAVE_SYS_STAT_H 1)\n    set(HAVE_SYS_TYPES_H 1)\nendif (HAVE_DIRENT_H)\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/cmake/FindPCRE.cmake",
    "content": "#.rst:\n# FindPCRE\n# --------\n#\n# Find the native PCRE includes and library.\n#\n# IMPORTED Targets\n# ^^^^^^^^^^^^^^^^\n#\n# This module defines :prop_tgt:`IMPORTED` target ``PCRE::PCRE``, if\n# PCRE has been found.\n#\n# Result Variables\n# ^^^^^^^^^^^^^^^^\n#\n# This module defines the following variables:\n#\n# ::\n#\n#   PCRE_INCLUDE_DIRS   - where to find pcre.h, etc.\n#   PCRE_LIBRARIES      - List of libraries when using pcre.\n#   PCRE_FOUND          - True if pcre found.\n#\n# ::\n#\n#   PCRE_VERSION_STRING - The version of pcre found (x.y.z)\n#   PCRE_VERSION_MAJOR  - The major version of zlib\n#   PCRE_VERSION_MINOR  - The minor version of zlib\n#   PCRE_VERSION_PATCH  - The patch version of zlib\n#   PCRE_VERSION_TWEAK  - The tweak version of zlib\n#\n# Backward Compatibility\n# ^^^^^^^^^^^^^^^^^^^^^^\n#\n# The following variable are provided for backward compatibility\n#\n# ::\n#\n#   PCRE_MAJOR_VERSION  - The major version of zlib\n#   PCRE_MINOR_VERSION  - The minor version of zlib\n#   PCRE_PATCH_VERSION  - The patch version of zlib\n#\n# Hints\n# ^^^^^\n#\n# A user may set ``PCRE_ROOT`` to a zlib installation root to tell this\n# module where to look.\n\n#=============================================================================\n# Copyright 2001-2011 Kitware, Inc.\n#\n# Distributed under the OSI-approved BSD License (the \"License\");\n# see accompanying file Copyright.txt for details.\n#\n# This software is distributed WITHOUT ANY WARRANTY; without even the\n# implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n# See the License for more information.\n#=============================================================================\n# (To distribute this file outside of CMake, substitute the full\n#  License text for the above reference.)\n\nset(_PCRE_SEARCHES)\n\n# Search PCRE_ROOT first if it is set.\nif(PCRE_ROOT)\n    set(_PCRE_SEARCH_ROOT PATHS ${PCRE_ROOT} NO_DEFAULT_PATH)\n    list(APPEND _PCRE_SEARCHES _PCRE_SEARCH_ROOT)\nendif()\n\n# Normal search.\nset(_PCRE_SEARCH_NORMAL\n        PATHS \"[HKEY_LOCAL_MACHINE\\\\SOFTWARE\\\\GnuWin32\\\\Pcre;InstallPath]\"\n        \"$ENV{PROGRAMFILES}/pcre\"\n        )\nlist(APPEND _PCRE_SEARCHES _PCRE_SEARCH_NORMAL)\n\nset(PCRE_NAMES pcre pcredll)\nset(PCRE_NAMES_DEBUG pcred)\n\n# Try each search configuration.\nforeach(search ${_PCRE_SEARCHES})\n    find_path(PCRE_INCLUDE_DIR NAMES pcre.h ${${search}} PATH_SUFFIXES include)\nendforeach()\n\n# Allow PCRE_LIBRARY to be set manually, as the location of the pcre library\nif(NOT PCRE_LIBRARY)\n    foreach(search ${_PCRE_SEARCHES})\n        find_library(PCRE_LIBRARY_RELEASE NAMES ${PCRE_NAMES} ${${search}} PATH_SUFFIXES lib)\n        find_library(PCRE_LIBRARY_DEBUG NAMES ${PCRE_NAMES_DEBUG} ${${search}} PATH_SUFFIXES lib)\n    endforeach()\n\n    include(SelectLibraryConfigurations)\n    select_library_configurations(PCRE)\nendif()\n\nunset(PCRE_NAMES)\nunset(PCRE_NAMES_DEBUG)\n\nmark_as_advanced(PCRE_LIBRARY PCRE_INCLUDE_DIR)\n\nif(PCRE_INCLUDE_DIR AND EXISTS \"${PCRE_INCLUDE_DIR}/pcre.h\")\n    file(STRINGS \"${PCRE_INCLUDE_DIR}/pcre.h\" PCRE_H REGEX \"^#define PCRE_VERSION \\\"[^\\\"]*\\\"$\")\n\n    string(REGEX REPLACE \"^.*PCRE_VERSION \\\"([0-9]+).*$\" \"\\\\1\" PCRE_VERSION_MAJOR \"${PCRE_H}\")\n    string(REGEX REPLACE \"^.*PCRE_VERSION \\\"[0-9]+\\\\.([0-9]+).*$\" \"\\\\1\" PCRE_VERSION_MINOR  \"${PCRE_H}\")\n    string(REGEX REPLACE \"^.*PCRE_VERSION \\\"[0-9]+\\\\.[0-9]+\\\\.([0-9]+).*$\" \"\\\\1\" PCRE_VERSION_PATCH \"${PCRE_H}\")\n    set(PCRE_VERSION_STRING \"${PCRE_VERSION_MAJOR}.${PCRE_VERSION_MINOR}.${PCRE_VERSION_PATCH}\")\n\n    # only append a TWEAK version if it exists:\n    set(PCRE_VERSION_TWEAK \"\")\n    if( \"${PCRE_H}\" MATCHES \"PCRE_VERSION \\\"[0-9]+\\\\.[0-9]+\\\\.[0-9]+\\\\.([0-9]+)\")\n        set(PCRE_VERSION_TWEAK \"${CMAKE_MATCH_1}\")\n        set(PCRE_VERSION_STRING \"${PCRE_VERSION_STRING}.${PCRE_VERSION_TWEAK}\")\n    endif()\n\n    set(PCRE_MAJOR_VERSION \"${PCRE_VERSION_MAJOR}\")\n    set(PCRE_MINOR_VERSION \"${PCRE_VERSION_MINOR}\")\n    set(PCRE_PATCH_VERSION \"${PCRE_VERSION_PATCH}\")\nendif()\n\n# handle the QUIETLY and REQUIRED arguments and set PCRE_FOUND to TRUE if\n# all listed variables are TRUE\ninclude(FindPackageHandleStandardArgs)\nFIND_PACKAGE_HANDLE_STANDARD_ARGS(PCRE REQUIRED_VARS PCRE_LIBRARY PCRE_INCLUDE_DIR\n        VERSION_VAR PCRE_VERSION_STRING)\n\nif(PCRE_FOUND)\n    set(PCRE_INCLUDE_DIRS ${PCRE_INCLUDE_DIR})\n\n    if(NOT PCRE_LIBRARIES)\n        set(PCRE_LIBRARIES ${PCRE_LIBRARY})\n    endif()\n\n    if(NOT TARGET PCRE::PCRE)\n        add_library(PCRE::PCRE UNKNOWN IMPORTED)\n        set_target_properties(PCRE::PCRE PROPERTIES\n                INTERFACE_INCLUDE_DIRECTORIES \"${PCRE_INCLUDE_DIRS}\")\n\n        if(PCRE_LIBRARY_RELEASE)\n            set_property(TARGET PCRE::PCRE APPEND PROPERTY\n                    IMPORTED_CONFIGURATIONS RELEASE)\n            set_target_properties(PCRE::PCRE PROPERTIES\n                    IMPORTED_LOCATION_RELEASE \"${PCRE_LIBRARY_RELEASE}\")\n        endif()\n\n        if(PCRE_LIBRARY_DEBUG)\n            set_property(TARGET PCRE::PCRE APPEND PROPERTY\n                    IMPORTED_CONFIGURATIONS DEBUG)\n            set_target_properties(PCRE::PCRE PROPERTIES\n                    IMPORTED_LOCATION_DEBUG \"${PCRE_LIBRARY_DEBUG}\")\n        endif()\n\n        if(NOT PCRE_LIBRARY_RELEASE AND NOT PCRE_LIBRARY_DEBUG)\n            set_property(TARGET PCRE::PCRE APPEND PROPERTY\n                    IMPORTED_LOCATION \"${PCRE_LIBRARY}\")\n        endif()\n    endif()\nendif()\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/cmake/configure.cmake",
    "content": "# Build args\n\nif (${with_crypto_library} STREQUAL \"openssl\")\n    find_package(ZLIB REQUIRED)\n    find_package(OpenSSL REQUIRED)\n    set(USE_CRYPTO_OPENSSL 1)\n    set(LIBCRYPTO\n            ${ZLIB_LIBRARIES}\n            ${OPENSSL_CRYPTO_LIBRARY})\n\n    include_directories(${ZLIB_INCLUDE_DIR})\n    include_directories(${OPENSSL_INCLUDE_DIR})\n\n    list ( APPEND CMAKE_REQUIRED_INCLUDES ${ZLIB_INCLUDE_DIR} ${OPENSSL_INCLUDE_DIR})\n\nelseif(${with_crypto_library} STREQUAL \"polarssl\")\n    find_package(polarssl REQUIRED)\n    set(USE_CRYPTO_POLARSSL 1)\nelseif(${with_crypto_library} STREQUAL \"mbedtls\")\n    find_package(mbedtls REQUIRED)\n    set(USE_CRYPTO_MBEDTLS 1)\nendif()\n\nfind_package(PCRE REQUIRED)\ninclude_directories(${PCRE_INCLUDE_DIR})\nlist ( APPEND CMAKE_REQUIRED_INCLUDES ${PCRE_INCLUDE_DIR})\n\n\n# Platform checks\ninclude ( CheckFunctionExists )\ninclude ( CheckIncludeFiles )\ninclude ( CheckSymbolExists )\ninclude ( CheckCSourceCompiles )\ninclude ( CheckTypeSize )\ninclude ( CheckSTDC )\n\ncheck_include_files ( \"arpa/inet.h\" HAVE_ARPA_INET_H )\ncheck_include_files ( \"CommonCrypto/CommonCrypto.h\" HAVE_COMMONCRYPTO_COMMONCRYPTO_H )\ncheck_include_files ( dlfcn.h HAVE_DLFCN_H )\ncheck_include_files ( fcntl.h HAVE_FCNTL_H )\ncheck_include_files ( inttypes.h HAVE_INTTYPES_H )\ncheck_include_files ( langinfo.h HAVE_LANGINFO_H )\ncheck_include_files ( limits.h HAVE_LIMITS_H )\ncheck_include_files ( \"linux/if.h\" HAVE_LINUX_IF_H )\ncheck_include_files ( \"linux/netfilter_ipv4.h\" HAVE_LINUX_NETFILTER_IPV4_H )\ncheck_include_files ( \"linux/netfilter_ipv6/ip6_tables.h\" HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H )\ncheck_include_files ( locale.h HAVE_LOCALE_H )\ncheck_include_files ( memory.h HAVE_MEMORY_H )\ncheck_include_files ( netdb.h HAVE_NETDB_H )\ncheck_include_files ( \"net/if.h\" HAVE_NET_IF_H )\ncheck_include_files ( \"openssl/engine.h\" HAVE_OPENSSL_ENGINE_H )\ncheck_include_files ( \"openssl/err.h\" HAVE_OPENSSL_ERR_H )\ncheck_include_files ( \"openssl/evp.h\" HAVE_OPENSSL_EVP_H )\ncheck_include_files ( \"openssl/pem.h\" HAVE_OPENSSL_PEM_H )\ncheck_include_files ( \"openssl/rand.h\" HAVE_OPENSSL_RAND_H )\ncheck_include_files ( \"openssl/rsa.h\" HAVE_OPENSSL_RSA_H )\ncheck_include_files ( \"openssl/sha.h\" HAVE_OPENSSL_SHA_H )\ncheck_include_files ( pcre.h HAVE_PCRE_H )\ncheck_include_files ( \"pcre/pcre.h\" HAVE_PCRE_PCRE_H )\ncheck_include_files ( poll.h HAVE_POLL_H )\ncheck_include_files ( port.h HAVE_PORT_H )\ncheck_include_files ( stdint.h HAVE_STDINT_H )\ncheck_include_files ( stdlib.h HAVE_STDLIB_H )\ncheck_include_files ( strings.h HAVE_STRINGS_H )\ncheck_include_files ( string.h HAVE_STRING_H )\ncheck_include_files ( \"sys/epoll.h\" HAVE_SYS_EPOLL_H )\ncheck_include_files ( \"sys/eventfd.h\" HAVE_SYS_EVENTFD_H )\ncheck_include_files ( \"sys/event.h\" HAVE_SYS_EVENT_H )\ncheck_include_files ( \"sys/inotify.h\" HAVE_SYS_INOTIFY_H )\ncheck_include_files ( \"sys/ioctl.h\" HAVE_SYS_IOCTL_H )\ncheck_include_files ( \"sys/select.h\" HAVE_SYS_SELECT_H )\ncheck_include_files ( \"sys/signalfd.h\" HAVE_SYS_SIGNALFD_H )\ncheck_include_files ( \"sys/socket.h\" HAVE_SYS_SOCKET_H )\ncheck_include_files ( \"sys/stat.h\" HAVE_SYS_STAT_H )\ncheck_include_files ( \"sys/types.h\" HAVE_SYS_TYPES_H )\ncheck_include_files ( \"sys/wait.h\" HAVE_SYS_WAIT_H )\ncheck_include_files ( unistd.h HAVE_UNISTD_H )\ncheck_include_files ( vfork.h HAVE_VFORK_H )\ncheck_include_files ( windows.h HAVE_WINDOWS_H )\ncheck_include_files ( winsock2.h HAVE_WINSOCK2_H )\ncheck_include_files ( ws2tcpip.h HAVE_WS2TCPIP_H )\ncheck_include_files ( zlib.h HAVE_ZLIB_H )\ncheck_include_files ( \"sys/syscall.h\" HAVE_SYS_CALL_H )\ncheck_include_files ( \"minix/config.h\" _MINIX)\n\ncheck_function_exists ( CCCryptorCreateWithMode HAVE_CCCRYPTORCREATEWITHMODE )\ncheck_function_exists ( clock_gettime HAVE_CLOCK_GETTIME )\ncheck_function_exists ( epoll_ctl HAVE_EPOLL_CTL )\ncheck_function_exists ( eventfd HAVE_EVENTFD )\ncheck_function_exists ( EVP_EncryptInit_ex HAVE_EVP_ENCRYPTINIT_EX )\ncheck_function_exists ( floor HAVE_FLOOR )\ncheck_function_exists ( fork HAVE_FORK )\ncheck_function_exists ( getpwnam_r HAVE_GETPWNAM_R )\ncheck_function_exists ( inet_ntop HAVE_INET_NTOP )\ncheck_function_exists ( inotify_init HAVE_INOTIFY_INIT )\ncheck_function_exists ( kqueue HAVE_KQUEUE )\ncheck_function_exists ( malloc HAVE_MALLOC )\ncheck_function_exists ( memset HAVE_MEMSET )\ncheck_function_exists ( nanosleep HAVE_NANOSLEEP )\ncheck_function_exists ( poll HAVE_POLL )\ncheck_function_exists ( port_create HAVE_PORT_CREATE )\ncheck_function_exists ( RAND_pseudo_bytes HAVE_RAND_PSEUDO_BYTES )\ncheck_function_exists ( select HAVE_SELECT )\ncheck_function_exists ( setresuid HAVE_SETRESUID )\ncheck_function_exists ( setreuid HAVE_SETREUID )\ncheck_function_exists ( setrlimit HAVE_SETRLIMIT )\ncheck_function_exists ( signalfd HAVE_SIGNALFD )\ncheck_function_exists ( socket HAVE_SOCKET )\ncheck_function_exists ( strerror HAVE_STRERROR )\ncheck_function_exists ( vfork HAVE_VFORK )\ncheck_function_exists ( inet_ntop HAVE_DECL_INET_NTOP )\n\ncheck_symbol_exists ( PTHREAD_PRIO_INHERIT \"pthread.h\" HAVE_PTHREAD_PRIO_INHERIT )\ncheck_symbol_exists ( PTHREAD_CREATE_JOINABLE \"pthread.h\" HAVE_PTHREAD_CREATE_JOINABLE )\ncheck_symbol_exists ( EINPROGRESS \"sys/errno.h\" HAVE_EINPROGRESS )\ncheck_symbol_exists ( WSAEWOULDBLOCK \"winerror.h\" HAVE_WSAEWOULDBLOCK )\n\n# winsock2.h and ws2_32 should provide these\nif(HAVE_WINSOCK2_H)\n    set(HAVE_GETHOSTNAME ON)\n    set(HAVE_SELECT ON)\n    set(HAVE_SOCKET ON)\n    set(HAVE_INET_NTOA ON)\n    set(HAVE_RECV ON)\n    set(HAVE_SEND ON)\n    set(HAVE_RECVFROM ON)\n    set(HAVE_SENDTO ON)\n    set(HAVE_GETHOSTBYNAME ON)\n    set(HAVE_GETSERVBYNAME ON)\nelse(HAVE_WINSOCK2_H)\n    check_function_exists(gethostname HAVE_GETHOSTNAME)\n    check_function_exists(select HAVE_SELECT)\n    check_function_exists(socket HAVE_SOCKET)\n    check_function_exists(inet_ntoa HAVE_INET_NTOA)\n    check_function_exists(recv HAVE_RECV)\n    check_function_exists(send HAVE_SEND)\n    check_function_exists(recvfrom HAVE_RECVFROM)\n    check_function_exists(sendto HAVE_SENDTO)\n    check_function_exists(gethostbyname HAVE_GETHOSTBYNAME)\n    check_function_exists(getservbyname HAVE_GETSERVBYNAME)\nendif(HAVE_WINSOCK2_H)\n\nfind_library ( HAVE_LIBPCRE pcre )\nfind_library ( HAVE_LIBRT rt )\nfind_library ( HAVE_LIBSOCKET socket )\n\ncheck_c_source_compiles(\n        \"\n#include <sys/time.h>\n#include <time.h>\nint main(int argc, char** argv) {return 0;}\n\"\n        TIME_WITH_SYS_TIME\n)\n\ncheck_c_source_compiles(\"\n__thread int tls;\n\nint main(void) {\n    return 0;\n}\" TLS)\n\ncheck_type_size(pid_t PID_T)\n\n# Tweaks\nif (${HAVE_SYS_CALL_H})\n    set(HAVE_CLOCK_SYSCALL ${HAVE_CLOCK_GETTIME})\nendif ()\nif (ZLIB_FOUND)\n    set (HAVE_ZLIB 1)\nendif()\n\nif (NOT HAVE_DECL_INET_NTOP)\n    set(HAVE_DECL_INET_NTOP 0)\nendif()\nif (NOT HAVE_PTHREAD_CREATE_JOINABLE)\n    set (PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED)\nendif()\nif (${_MINIX})\n    set (_POSIX_1_SOURCE 2)\n    set (_POSIX_SOURCE 1)\nendif()\n\nif (${HAVE_EINPROGRESS})\n    set (CONNECT_IN_PROGRESS EINPROGRESS)\nelseif(${HAVE_WSAEWOULDBLOCK})\n    set (CONNECT_IN_PROGRESS WSAEWOULDBLOCK)\nendif()\n\n#SET(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} -std=c99\")\n\n\n\nset (HAVE_IPv6 1)\n\nADD_DEFINITIONS(-DHAVE_CONFIG_H)\nADD_DEFINITIONS(-D__USE_MINGW_ANSI_STDIO=1)\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/cmake/dist.cmake",
    "content": "# LuaDist CMake utility library.\n# Provides sane project defaults and macros common to LuaDist CMake builds.\n# \n# Copyright (C) 2007-2012 LuaDist.\n# by David Manura, Peter Drahoš\n# Redistribution and use of this file is allowed according to the terms of the MIT license.\n# For details see the COPYRIGHT file distributed with LuaDist.\n# Please note that the package source code is licensed under its own license.\n\n\n# Tweaks and other defaults\n# Setting CMAKE to use loose block and search for find modules in source directory\nset ( CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true )\nset ( CMAKE_MODULE_PATH \"${CMAKE_CURRENT_SOURCE_DIR}/cmake\" ${CMAKE_MODULE_PATH} )\n\n# In MSVC, prevent warnings that can occur when using standard libraries.\nif ( MSVC )\n  add_definitions ( -D_CRT_SECURE_NO_WARNINGS )\nendif ()\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/completions/bash/ss-local",
    "content": "_ss_local()\n{\n    local cur prev opts ciphers\n    opts='-s -b -p -k -f -t -m -c -a -n -u -U -v -h -A --fast-open --mtu --help --mptcp -i --acl -l'\n    ciphers='rc4-md5 table rc4 aes-128-cfb aes-192-cfb aes-256-cfb aes-128-ctr aes-192-ctr aes-256-ctr bf-cfb camellia-128-cfb camellia-192-cfb camellia-256-cfb cast5-cfb des-cfb idea-cfb rc2-cfb seed-cfb salsa20 chacha20 and chacha20-ietf'\n    cur=${COMP_WORDS[COMP_CWORD]}\n    prev=\"${COMP_WORDS[COMP_CWORD-1]}\"\n    case \"$prev\" in\n        -c|-f|--acl)\n            _filedir || COMPREPLY=( $(compgen -o plusdirs -f ${cur}) )\n            ;;\n        -s|-b)\n            _known_hosts_real -- \"${cur}\" || OMPREPLY=( $(compgen -A hostname -- ${cur}) )\n            ;;\n        -m)\n            COMPREPLY=( $(compgen -W \"$ciphers\" -- ${cur}) )\n            ;;\n        -a)\n            _allowed_users || COMPREPLY=( $(compgen -u -- ${cur}) )\n            ;;\n        -p|-k|-t|-n|--mtu|-l)\n            ;;\n        -i)\n            _available_interfaces -a || true\n            ;;\n        *)\n            COMPREPLY+=( $(compgen -W \"${opts}\" -- ${cur}) )\n            ;;\n    esac\n    return 0\n}\n\ncomplete -F _ss_local ss-local\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/completions/bash/ss-manager",
    "content": "_ss_manager()\n{\n    local cur prev opts ciphers\n    opts='-s -b -p -k -f -t -m -c -a -n -u -U -v -h -A --mtu --help --mptcp -i -l --manager-address --executable'\n    ciphers='rc4-md5 table rc4 aes-128-cfb aes-192-cfb aes-256-cfb aes-128-ctr aes-192-ctr aes-256-ctr bf-cfb camellia-128-cfb camellia-192-cfb camellia-256-cfb cast5-cfb des-cfb idea-cfb rc2-cfb seed-cfb salsa20 chacha20 and chacha20-ietf'\n    cur=${COMP_WORDS[COMP_CWORD]}\n    prev=\"${COMP_WORDS[COMP_CWORD-1]}\"\n    case \"$prev\" in\n        -c|-f|--executable)\n            _filedir || COMPREPLY=( $(compgen -o plusdirs -f ${cur}) )\n            ;;\n        -s|-b)\n            _known_hosts_real -- \"${cur}\" || OMPREPLY=( $(compgen -A hostname -- ${cur}) )\n            ;;\n        -L)\n            compopt -o nospace\n            _known_hosts_real -c -- \"${cur}\" || OMPREPLY=( $(compgen -A hostname -S : -- ${cur}) )\n            ;;\n        -m)\n            COMPREPLY=( $(compgen -W \"$ciphers\" -- ${cur}) )\n            ;;\n        -a)\n            _allowed_users || COMPREPLY=( $(compgen -u -- ${cur}) )\n            ;;\n        -p|-k|-t|-n|--mtu|-l)\n            ;;\n        -i)\n            _available_interfaces -a || true\n            ;;\n        --manager-address)\n            _known_hosts_real -- \"${cur}\" || OMPREPLY=( $(compgen -A hostname -- ${cur}) )\n            _filedir || COMPREPLY+=( $(compgen -o plusdirs -f ${cur}) )\n            ;;\n        *)\n            COMPREPLY+=( $(compgen -W \"${opts}\" -- ${cur}) )\n            ;;\n    esac\n    return 0\n}\n\ncomplete -F _ss_manager ss-manager\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/completions/bash/ss-redir",
    "content": "_ss_redir()\n{\n    local cur prev opts ciphers\n    ciphers='rc4-md5 table rc4 aes-128-cfb aes-192-cfb aes-256-cfb aes-128-ctr aes-192-ctr aes-256-ctr bf-cfb camellia-128-cfb camellia-192-cfb camellia-256-cfb cast5-cfb des-cfb idea-cfb rc2-cfb seed-cfb salsa20 chacha20 and chacha20-ietf'\n    opts='-s -b -p -k -f -t -m -c -a -n -u -U -v -h -A --mtu --help --mptcp -l'\n    cur=${COMP_WORDS[COMP_CWORD]}\n    prev=\"${COMP_WORDS[COMP_CWORD-1]}\"\n    case \"$prev\" in\n        -c|-f)\n            _filedir || COMPREPLY=( $(compgen -o plusdirs -f ${cur}) )\n            ;;\n        -s|-b)\n            _known_hosts_real -- \"${cur}\" || OMPREPLY=( $(compgen -A hostname -- ${cur}) )\n            ;;\n        -m)\n            COMPREPLY=( $(compgen -W \"$ciphers\" -- ${cur}) )\n            ;;\n        -a)\n            _allowed_users || COMPREPLY=( $(compgen -u -- ${cur}) )\n            ;;\n        -p|-k|-t|-n|--mtu|-l)\n            ;;\n        *)\n            COMPREPLY+=( $(compgen -W \"${opts}\" -- ${cur}) )\n            ;;\n    esac\n    return 0\n}\n\ncomplete -F _ss_redir ss-redir\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/completions/bash/ss-server",
    "content": "_ss_server()\n{\n    local cur prev opts ciphers\n    opts='-s -b -p -k -f -t -m -c -a -n -u -U -v -h -A --fast-open --mtu --help --mptcp -i -6 -d --manager-address --firewall --acl'\n    ciphers='rc4-md5 table rc4 aes-128-cfb aes-192-cfb aes-256-cfb aes-128-ctr aes-192-ctr aes-256-ctr bf-cfb camellia-128-cfb camellia-192-cfb camellia-256-cfb cast5-cfb des-cfb idea-cfb rc2-cfb seed-cfb salsa20 chacha20 and chacha20-ietf'\n    COMPREPLY=()\n    cur=${COMP_WORDS[COMP_CWORD]}\n    prev=\"${COMP_WORDS[COMP_CWORD-1]}\"\n    case \"$prev\" in\n        -c|-f|--acl)\n            _filedir || COMPREPLY=( $(compgen -o plusdirs -f ${cur}) )\n            ;;\n        -s|-b)\n            _known_hosts_real -- \"${cur}\" || OMPREPLY=( $(compgen -A hostname -- ${cur}) )\n            ;;\n        -m)\n            COMPREPLY=( $(compgen -W \"$ciphers\" -- ${cur}) )\n            ;;\n        -a)\n            _allowed_users || COMPREPLY=( $(compgen -u -- ${cur}) )\n            ;;\n        -p|-k|-t|-n|--mtu|-d)\n            ;;\n        --manager-address)\n            _known_hosts_real -- \"${cur}\" || OMPREPLY=( $(compgen -A hostname -- ${cur}) )\n            _filedir || COMPREPLY+=( $(compgen -o plusdirs -f ${cur}) )\n            ;;\n        -i)\n            _available_interfaces -a || true\n            ;;\n        *)\n            COMPREPLY=( $(compgen -W \"${opts}\" -- ${cur}) )\n            ;;\n    esac\n}\n\ncomplete -F _ss_server ss-server\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/completions/bash/ss-tunnel",
    "content": "_ss_tunnel()\n{\n    local cur prev opts ciphers\n    ciphers='rc4-md5 table rc4 aes-128-cfb aes-192-cfb aes-256-cfb aes-128-ctr aes-192-ctr aes-256-ctr bf-cfb camellia-128-cfb camellia-192-cfb camellia-256-cfb cast5-cfb des-cfb idea-cfb rc2-cfb seed-cfb salsa20 chacha20 and chacha20-ietf'\n    opts='-s -b -p -k -f -t -m -c -a -n -u -U -v -h -A --mtu --help --mptcp -i -l -L'\n    cur=${COMP_WORDS[COMP_CWORD]}\n    prev=\"${COMP_WORDS[COMP_CWORD-1]}\"\n    compopt +o nospace\n    case \"$prev\" in\n        -c|-f)\n            _filedir || COMPREPLY=( $(compgen -o plusdirs -f ${cur}) )\n            ;;\n        -s|-b)\n            _known_hosts_real -- \"${cur}\" || OMPREPLY=( $(compgen -A hostname -- ${cur}) )\n            ;;\n        -L)\n            compopt -o nospace\n            _known_hosts_real -c -- \"${cur}\" || OMPREPLY=( $(compgen -A hostname -S : -- ${cur}) )\n            ;;\n        -m)\n            COMPREPLY=( $(compgen -W \"$ciphers\" -- ${cur}) )\n            ;;\n        -a)\n            _allowed_users || COMPREPLY=( $(compgen -u -- ${cur}) )\n            ;;\n        -p|-k|-t|-n|--mtu|-l)\n            ;;\n        -i)\n            _available_interfaces -a || true\n            ;;\n        *)\n            COMPREPLY+=( $(compgen -W \"${opts}\" -- ${cur}) )\n            ;;\n    esac\n    return 0\n}\n\ncomplete -F _ss_tunnel ss-tunnel\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/config.h.cmake",
    "content": "/* config.h.in.  Generated from configure.ac by autoheader.  */\n\n/* Define if building universal (internal helper macro) */\n#undef AC_APPLE_UNIVERSAL_BUILD\n\n/* errno for incomplete non-blocking connect(2) */\n#define CONNECT_IN_PROGRESS @CONNECT_IN_PROGRESS@\n\n#ifdef _WIN32\n\n/* Override libev default fd conversion macro. */\n#define EV_FD_TO_WIN32_HANDLE(fd) (fd)\n\n/* Override libev default fd close macro. */\n#define EV_WIN32_CLOSE_FD(fd) closesocket(fd)\n\n/* Override libev default handle conversion macro. */\n#define EV_WIN32_HANDLE_TO_FD(handle) (handle)\n\n/* Reset max file descriptor size. */\n#define FD_SETSIZE 2048\n\n#endif\n\n/* Define to 1 if you have the <arpa/inet.h> header file. */\n#cmakedefine HAVE_ARPA_INET_H 1\n\n/* Define to 1 if you have the `CCCryptorCreateWithMode' function. */\n#cmakedefine HAVE_CCCRYPTORCREATEWITHMODE 1\n\n/* Define to 1 if you have the `clock_gettime' function. */\n#cmakedefine HAVE_CLOCK_GETTIME 1\n\n/* Define to 1 to use the syscall interface for clock_gettime */\n#cmakedefine HAVE_CLOCK_SYSCALL 1\n\n/* Define to 1 if you have the <CommonCrypto/CommonCrypto.h> header file. */\n#cmakedefine HAVE_COMMONCRYPTO_COMMONCRYPTO_H 1\n\n/* Define to 1 if you have the declaration of `inet_ntop', and to 0 if you\n   don't. */\n#define HAVE_DECL_INET_NTOP @HAVE_DECL_INET_NTOP@\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n#cmakedefine HAVE_DLFCN_H 1\n\n/* Define to 1 if you have the `epoll_ctl' function. */\n#cmakedefine HAVE_EPOLL_CTL 1\n\n/* Define to 1 if you have the `eventfd' function. */\n#cmakedefine HAVE_EVENTFD 1\n\n/* Define to 1 if you have the `EVP_EncryptInit_ex' function. */\n#cmakedefine HAVE_EVP_ENCRYPTINIT_EX 1\n\n/* Define to 1 if you have the <fcntl.h> header file. */\n#cmakedefine HAVE_FCNTL_H 1\n\n/* Define to 1 if the floor function is available */\n#cmakedefine HAVE_FLOOR 1\n\n/* Define to 1 if you have the `fork' function. */\n#cmakedefine HAVE_FORK 1\n\n/* Define to 1 if you have the `getpwnam_r' function. */\n#cmakedefine HAVE_GETPWNAM_R 1\n\n/* Define to 1 if you have the `inet_ntop' function. */\n#cmakedefine HAVE_INET_NTOP 1\n\n/* Define to 1 if you have the `inotify_init' function. */\n#cmakedefine HAVE_INOTIFY_INIT 1\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#cmakedefine HAVE_INTTYPES_H 1\n\n/* Enable IPv6 support in libudns */\n#cmakedefine HAVE_IPv6 1\n\n/* Define to 1 if you have the `kqueue' function. */\n#cmakedefine HAVE_KQUEUE 1\n\n/* Define to 1 if you have the <langinfo.h> header file. */\n#cmakedefine HAVE_LANGINFO_H 1\n\n/* Compiling with pcre support */\n#cmakedefine HAVE_LIBPCRE 1\n\n/* Define to 1 if you have the `rt' library (-lrt). */\n#cmakedefine HAVE_LIBRT 1\n\n/* Define to 1 if you have the `socket' library (-lsocket). */\n#cmakedefine HAVE_LIBSOCKET 1\n\n/* Define to 1 if you have the <limits.h> header file. */\n#cmakedefine HAVE_LIMITS_H 1\n\n/* Define to 1 if you have the <linux/if.h> header file. */\n#cmakedefine HAVE_LINUX_IF_H 1\n\n/* Define to 1 if you have the <linux/netfilter_ipv4.h> header file. */\n#cmakedefine HAVE_LINUX_NETFILTER_IPV4_H 1\n\n/* Define to 1 if you have the <linux/netfilter_ipv6/ip6_tables.h> header\n   file. */\n#cmakedefine HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H 1\n\n/* Define to 1 if you have the <locale.h> header file. */\n#cmakedefine HAVE_LOCALE_H 1\n\n/* Define to 1 if you have the `malloc' function. */\n#cmakedefine HAVE_MALLOC 1\n\n/* Define to 1 if you have the <memory.h> header file. */\n#cmakedefine HAVE_MEMORY_H 1\n\n/* Define to 1 if you have the `memset' function. */\n#cmakedefine HAVE_MEMSET 1\n\n/* Define to 1 if you have the `nanosleep' function. */\n#cmakedefine HAVE_NANOSLEEP 1\n\n/* Define to 1 if you have the <netdb.h> header file. */\n#cmakedefine HAVE_NETDB_H 1\n\n/* Define to 1 if you have the <netinet/in.h> header file. */\n#cmakedefine HAVE_NETINET_IN_H 1\n\n/* Define to 1 if you have the <net/if.h> header file. */\n#cmakedefine HAVE_NET_IF_H 1\n\n/* Define to 1 if you have the <openssl/engine.h> header file. */\n#cmakedefine HAVE_OPENSSL_ENGINE_H 1\n\n/* Define to 1 if you have the <openssl/err.h> header file. */\n#cmakedefine HAVE_OPENSSL_ERR_H 1\n\n/* Define to 1 if you have the <openssl/evp.h> header file. */\n#cmakedefine HAVE_OPENSSL_EVP_H 1\n\n/* Define to 1 if you have the <openssl/pem.h> header file. */\n#cmakedefine HAVE_OPENSSL_PEM_H 1\n\n/* Define to 1 if you have the <openssl/rand.h> header file. */\n#cmakedefine HAVE_OPENSSL_RAND_H 1\n\n/* Define to 1 if you have the <openssl/rsa.h> header file. */\n#cmakedefine HAVE_OPENSSL_RSA_H 1\n\n/* Define to 1 if you have the <openssl/sha.h> header file. */\n#cmakedefine HAVE_OPENSSL_SHA_H 1\n\n/* Define to 1 if you have the <pcre.h> header file. */\n#cmakedefine HAVE_PCRE_H 1\n\n/* Define to 1 if you have the <pcre/pcre.h> header file. */\n#cmakedefine HAVE_PCRE_PCRE_H 1\n\n/* Define to 1 if you have the `poll' function. */\n#cmakedefine HAVE_POLL 1\n\n/* Define to 1 if you have the <poll.h> header file. */\n#cmakedefine HAVE_POLL_H 1\n\n/* Define to 1 if you have the `port_create' function. */\n#cmakedefine HAVE_PORT_CREATE 1\n\n/* Define to 1 if you have the <port.h> header file. */\n#cmakedefine HAVE_PORT_H 1\n\n/* Have PTHREAD_PRIO_INHERIT. */\n#cmakedefine HAVE_PTHREAD_PRIO_INHERIT 1\n\n/* Define to 1 if you have the `RAND_pseudo_bytes' function. */\n#cmakedefine HAVE_RAND_PSEUDO_BYTES 1\n\n/* Define to 1 if you have the 'select' function. */\n#cmakedefine HAVE_SELECT 1\n\n/* Define to 1 if you have the `setresuid' function. */\n#cmakedefine HAVE_SETRESUID 1\n\n/* Define to 1 if you have the `setreuid' function. */\n#cmakedefine HAVE_SETREUID 1\n\n/* Define to 1 if you have the `setrlimit' function. */\n#cmakedefine HAVE_SETRLIMIT 1\n\n/* Define to 1 if you have the `signalfd' function. */\n#cmakedefine HAVE_SIGNALFD 1\n\n/* Define to 1 if you have the `socket' function. */\n#cmakedefine HAVE_SOCKET 1\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#cmakedefine HAVE_STDINT_H 1\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#cmakedefine HAVE_STDLIB_H 1\n\n/* Define to 1 if you have the `strerror' function. */\n#cmakedefine HAVE_STRERROR 1\n\n/* Define to 1 if you have the <strings.h> header file. */\n#cmakedefine HAVE_STRINGS_H 1\n\n/* Define to 1 if you have the <string.h> header file. */\n#cmakedefine HAVE_STRING_H 1\n\n/* Define to 1 if you have the <sys/epoll.h> header file. */\n#cmakedefine HAVE_SYS_EPOLL_H 1\n\n/* Define to 1 if you have the <sys/eventfd.h> header file. */\n#cmakedefine HAVE_SYS_EVENTFD_H 1\n\n/* Define to 1 if you have the <sys/event.h> header file. */\n#cmakedefine HAVE_SYS_EVENT_H 1\n\n/* Define to 1 if you have the <sys/inotify.h> header file. */\n#cmakedefine HAVE_SYS_INOTIFY_H 1\n\n/* Define to 1 if you have the <sys/ioctl.h> header file. */\n#cmakedefine HAVE_SYS_IOCTL_H 1\n\n/* Define to 1 if you have the <sys/select.h> header file. */\n#cmakedefine HAVE_SYS_SELECT_H 1\n\n/* Define to 1 if you have the <sys/signalfd.h> header file. */\n#cmakedefine HAVE_SYS_SIGNALFD_H 1\n\n/* Define to 1 if you have the <sys/socket.h> header file. */\n#cmakedefine HAVE_SYS_SOCKET_H 1\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#cmakedefine HAVE_SYS_STAT_H 1\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#cmakedefine HAVE_SYS_TYPES_H 1\n\n/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */\n#cmakedefine HAVE_SYS_WAIT_H 1\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#cmakedefine HAVE_UNISTD_H 1\n\n/* Define to 1 if you have the `vfork' function. */\n#cmakedefine HAVE_VFORK 1\n\n/* Define to 1 if you have the <vfork.h> header file. */\n#cmakedefine HAVE_VFORK_H 1\n\n/* Define to 1 if you have the <windows.h> header file. */\n#cmakedefine HAVE_WINDOWS_H 1\n\n/* Define to 1 if you have the <winsock2.h> header file. */\n#cmakedefine HAVE_WINSOCK2_H 1\n\n/* Define to 1 if `fork' works. */\n#undef HAVE_WORKING_FORK\n\n/* Define to 1 if `vfork' works. */\n#undef HAVE_WORKING_VFORK\n\n/* Define to 1 if you have the <ws2tcpip.h> header file. */\n#cmakedefine HAVE_WS2TCPIP_H 1\n\n/* have zlib compression support */\n#cmakedefine HAVE_ZLIB 1\n\n/* Define to 1 if you have the <zlib.h> header file. */\n#cmakedefine HAVE_ZLIB_H 1\n\n/* Define to the sub-directory in which libtool stores uninstalled libraries.\n   */\n#undef LT_OBJDIR\n\n/* Define to 1 if assertions should be disabled. */\n#undef NDEBUG\n\n/* Name of package */\n#undef PACKAGE\n\n/* Define to the address where bug reports for this package should be sent. */\n#undef PACKAGE_BUGREPORT\n\n/* Define to the full name of this package. */\n#undef PACKAGE_NAME\n\n/* Define to the full name and version of this package. */\n#undef PACKAGE_STRING\n\n/* Define to the one symbol short name of this package. */\n#undef PACKAGE_TARNAME\n\n/* Define to the home page for this package. */\n#undef PACKAGE_URL\n\n/* Define to the version of this package. */\n#define PACKAGE_VERSION @VERSION@\n\n/* Define to necessary symbol if this constant uses a non-standard name on\n   your system. */\n#cmakedefine PTHREAD_CREATE_JOINABLE @PTHREAD_CREATE_JOINABLE@\n\n/* Define as the return type of signal handlers (`int' or `void'). */\n#undef RETSIGTYPE\n\n/* Define to the type of arg 1 for `select'. */\n#undef SELECT_TYPE_ARG1\n\n/* Define to the type of args 2, 3 and 4 for `select'. */\n#undef SELECT_TYPE_ARG234\n\n/* Define to the type of arg 5 for `select'. */\n#undef SELECT_TYPE_ARG5\n\n/* Define to 1 if you have the ANSI C header files. */\n#cmakedefine STDC_HEADERS 1\n\n/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */\n#cmakedefine TIME_WITH_SYS_TIME 1\n\n/* If the compiler supports a TLS storage class define it to that here */\n#cmakedefine TLS 1\n\n/* Use Apple CommonCrypto library */\n#cmakedefine USE_CRYPTO_APPLECC 1\n\n/* Use mbed TLS library */\n#cmakedefine USE_CRYPTO_MBEDTLS 1\n\n/* Use OpenSSL library */\n#cmakedefine USE_CRYPTO_OPENSSL 1\n\n/* Use PolarSSL library */\n#cmakedefine USE_CRYPTO_POLARSSL 1\n\n/* Enable extensions on AIX 3, Interix.  */\n#ifndef _ALL_SOURCE\n# undef _ALL_SOURCE\n#endif\n/* Enable GNU extensions on systems that have them.  */\n#ifndef _GNU_SOURCE\n# undef _GNU_SOURCE\n#endif\n/* Enable threading extensions on Solaris.  */\n#ifndef _POSIX_PTHREAD_SEMANTICS\n# undef _POSIX_PTHREAD_SEMANTICS\n#endif\n/* Enable extensions on HP NonStop.  */\n#ifndef _TANDEM_SOURCE\n# undef _TANDEM_SOURCE\n#endif\n/* Enable general extensions on Solaris.  */\n#ifndef __EXTENSIONS__\n# undef __EXTENSIONS__\n#endif\n\n\n/* Version number of package */\n#define VERSION \"@VERSION@\"\n\n/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most\n   significant byte first (like Motorola and SPARC, unlike Intel). */\n#if defined AC_APPLE_UNIVERSAL_BUILD\n# if defined __BIG_ENDIAN__\n#  define WORDS_BIGENDIAN 1\n# endif\n#else\n# ifndef WORDS_BIGENDIAN\n#  undef WORDS_BIGENDIAN\n# endif\n#endif\n\n/* Define to 1 if on MINIX. */\n#cmakedefine _MINIX 1\n\n/* Define to 2 if the system does not provide POSIX.1 features except with\n   this defined. */\n#cmakedefine _POSIX_1_SOURCE 2\n\n/* Define to 1 if you need to in order for `stat' and other things to work. */\n#cmakedefine _POSIX_SOURCE 1\n\n/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>,\n   <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the\n   #define below would cause a syntax error. */\n#undef _UINT8_T\n\n/* Define to empty if `const' does not conform to ANSI C. */\n#undef const\n\n/* Define to `__inline__' or `__inline' if that's what the C compiler\n   calls it, or to nothing if 'inline' is not supported under any name.  */\n#ifndef __cplusplus\n#undef inline\n#endif\n\n/* Define to `int' if <sys/types.h> does not define. */\n#cmakedefine HAVE_PID_T 1\n#ifndef HAVE_PID_T\n#define pid_t int\n#endif\n\n/* Define to the equivalent of the C99 'restrict' keyword, or to\n   nothing if this is not supported.  Do not define if restrict is\n   supported directly.  */\n#undef restrict\n/* Work around a bug in Sun C++: it does not support _Restrict or\n   __restrict__, even though the corresponding Sun C compiler ends up with\n   \"#define restrict _Restrict\" or \"#define restrict __restrict__\" in the\n   previous line.  Perhaps some future version of Sun C++ will work with\n   restrict; if so, hopefully it defines __RESTRICT like Sun C does.  */\n#if defined __SUNPRO_CC && !defined __RESTRICT\n# define _Restrict\n# define __restrict__\n#endif\n\n/* Define to `unsigned int' if <sys/types.h> does not define. */\n#undef size_t\n\n/* Define to `int' if <sys/types.h> does not define. */\n#undef ssize_t\n\n/* Define to the type of an unsigned integer type of width exactly 16 bits if\n   such a type exists and the standard includes do not define it. */\n#undef uint16_t\n\n/* Define to the type of an unsigned integer type of width exactly 8 bits if\n   such a type exists and the standard includes do not define it. */\n#undef uint8_t\n\n/* Define as `fork' if `vfork' does not work. */\n#undef vfork\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/config.h.in",
    "content": "/* config.h.in.  Generated from configure.ac by autoheader.  */\n\n/* Define if building universal (internal helper macro) */\n#undef AC_APPLE_UNIVERSAL_BUILD\n\n/* errno for incomplete non-blocking connect(2) */\n#undef CONNECT_IN_PROGRESS\n\n/* Override libev default fd conversion macro. */\n#undef EV_FD_TO_WIN32_HANDLE\n\n/* Override libev default fd close macro. */\n#undef EV_WIN32_CLOSE_FD\n\n/* Override libev default handle conversion macro. */\n#undef EV_WIN32_HANDLE_TO_FD\n\n/* Reset max file descriptor size. */\n#undef FD_SETSIZE\n\n/* Define to 1 if you have the <arpa/inet.h> header file. */\n#undef HAVE_ARPA_INET_H\n\n/* Define to 1 if you have the `CCCryptorCreateWithMode' function. */\n#undef HAVE_CCCRYPTORCREATEWITHMODE\n\n/* Define to 1 if you have the `clock_gettime' function. */\n#undef HAVE_CLOCK_GETTIME\n\n/* Define to 1 to use the syscall interface for clock_gettime */\n#undef HAVE_CLOCK_SYSCALL\n\n/* Define to 1 if you have the <CommonCrypto/CommonCrypto.h> header file. */\n#undef HAVE_COMMONCRYPTO_COMMONCRYPTO_H\n\n/* Define to 1 if you have the declaration of `inet_ntop', and to 0 if you\n   don't. */\n#undef HAVE_DECL_INET_NTOP\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n#undef HAVE_DLFCN_H\n\n/* Define to 1 if you have the `epoll_ctl' function. */\n#undef HAVE_EPOLL_CTL\n\n/* Define to 1 if you have the `eventfd' function. */\n#undef HAVE_EVENTFD\n\n/* Define to 1 if you have the `EVP_EncryptInit_ex' function. */\n#undef HAVE_EVP_ENCRYPTINIT_EX\n\n/* Define to 1 if you have the <fcntl.h> header file. */\n#undef HAVE_FCNTL_H\n\n/* Define to 1 if the floor function is available */\n#undef HAVE_FLOOR\n\n/* Define to 1 if you have the `fork' function. */\n#undef HAVE_FORK\n\n/* Define to 1 if you have the `getpwnam_r' function. */\n#undef HAVE_GETPWNAM_R\n\n/* Define to 1 if you have the `inet_ntop' function. */\n#undef HAVE_INET_NTOP\n\n/* Define to 1 if you have the `inotify_init' function. */\n#undef HAVE_INOTIFY_INIT\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#undef HAVE_INTTYPES_H\n\n/* Enable IPv6 support in libudns */\n#undef HAVE_IPv6\n\n/* Define to 1 if you have the `kqueue' function. */\n#undef HAVE_KQUEUE\n\n/* Define to 1 if you have the <langinfo.h> header file. */\n#undef HAVE_LANGINFO_H\n\n/* Compiling with pcre support */\n#undef HAVE_LIBPCRE\n\n/* Define to 1 if you have the `rt' library (-lrt). */\n#undef HAVE_LIBRT\n\n/* Define to 1 if you have the `socket' library (-lsocket). */\n#undef HAVE_LIBSOCKET\n\n/* Define to 1 if you have the <limits.h> header file. */\n#undef HAVE_LIMITS_H\n\n/* Define to 1 if you have the <linux/if.h> header file. */\n#undef HAVE_LINUX_IF_H\n\n/* Define to 1 if you have the <linux/netfilter_ipv4.h> header file. */\n#undef HAVE_LINUX_NETFILTER_IPV4_H\n\n/* Define to 1 if you have the <linux/netfilter_ipv6/ip6_tables.h> header\n   file. */\n#undef HAVE_LINUX_NETFILTER_IPV6_IP6_TABLES_H\n\n/* Define to 1 if you have the <locale.h> header file. */\n#undef HAVE_LOCALE_H\n\n/* Define to 1 if you have the `malloc' function. */\n#undef HAVE_MALLOC\n\n/* Define to 1 if you have the <memory.h> header file. */\n#undef HAVE_MEMORY_H\n\n/* Define to 1 if you have the `memset' function. */\n#undef HAVE_MEMSET\n\n/* Define to 1 if you have the `nanosleep' function. */\n#undef HAVE_NANOSLEEP\n\n/* Define to 1 if you have the <netdb.h> header file. */\n#undef HAVE_NETDB_H\n\n/* Define to 1 if you have the <netinet/in.h> header file. */\n#undef HAVE_NETINET_IN_H\n\n/* Define to 1 if you have the <net/if.h> header file. */\n#undef HAVE_NET_IF_H\n\n/* Define to 1 if you have the <openssl/engine.h> header file. */\n#undef HAVE_OPENSSL_ENGINE_H\n\n/* Define to 1 if you have the <openssl/err.h> header file. */\n#undef HAVE_OPENSSL_ERR_H\n\n/* Define to 1 if you have the <openssl/evp.h> header file. */\n#undef HAVE_OPENSSL_EVP_H\n\n/* Define to 1 if you have the <openssl/pem.h> header file. */\n#undef HAVE_OPENSSL_PEM_H\n\n/* Define to 1 if you have the <openssl/rand.h> header file. */\n#undef HAVE_OPENSSL_RAND_H\n\n/* Define to 1 if you have the <openssl/rsa.h> header file. */\n#undef HAVE_OPENSSL_RSA_H\n\n/* Define to 1 if you have the <openssl/sha.h> header file. */\n#undef HAVE_OPENSSL_SHA_H\n\n/* Define to 1 if you have the <pcre.h> header file. */\n#undef HAVE_PCRE_H\n\n/* Define to 1 if you have the <pcre/pcre.h> header file. */\n#undef HAVE_PCRE_PCRE_H\n\n/* Define to 1 if you have the `poll' function. */\n#undef HAVE_POLL\n\n/* Define to 1 if you have the <poll.h> header file. */\n#undef HAVE_POLL_H\n\n/* Define to 1 if you have the `port_create' function. */\n#undef HAVE_PORT_CREATE\n\n/* Define to 1 if you have the <port.h> header file. */\n#undef HAVE_PORT_H\n\n/* Have PTHREAD_PRIO_INHERIT. */\n#undef HAVE_PTHREAD_PRIO_INHERIT\n\n/* Define to 1 if you have the `RAND_pseudo_bytes' function. */\n#undef HAVE_RAND_PSEUDO_BYTES\n\n/* Define to 1 if you have the 'select' function. */\n#undef HAVE_SELECT\n\n/* Define to 1 if you have the `setresuid' function. */\n#undef HAVE_SETRESUID\n\n/* Define to 1 if you have the `setreuid' function. */\n#undef HAVE_SETREUID\n\n/* Define to 1 if you have the `setrlimit' function. */\n#undef HAVE_SETRLIMIT\n\n/* Define to 1 if you have the `signalfd' function. */\n#undef HAVE_SIGNALFD\n\n/* Define to 1 if you have the `socket' function. */\n#undef HAVE_SOCKET\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#undef HAVE_STDINT_H\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#undef HAVE_STDLIB_H\n\n/* Define to 1 if you have the `strerror' function. */\n#undef HAVE_STRERROR\n\n/* Define to 1 if you have the <strings.h> header file. */\n#undef HAVE_STRINGS_H\n\n/* Define to 1 if you have the <string.h> header file. */\n#undef HAVE_STRING_H\n\n/* Define to 1 if you have the <sys/epoll.h> header file. */\n#undef HAVE_SYS_EPOLL_H\n\n/* Define to 1 if you have the <sys/eventfd.h> header file. */\n#undef HAVE_SYS_EVENTFD_H\n\n/* Define to 1 if you have the <sys/event.h> header file. */\n#undef HAVE_SYS_EVENT_H\n\n/* Define to 1 if you have the <sys/inotify.h> header file. */\n#undef HAVE_SYS_INOTIFY_H\n\n/* Define to 1 if you have the <sys/ioctl.h> header file. */\n#undef HAVE_SYS_IOCTL_H\n\n/* Define to 1 if you have the <sys/select.h> header file. */\n#undef HAVE_SYS_SELECT_H\n\n/* Define to 1 if you have the <sys/signalfd.h> header file. */\n#undef HAVE_SYS_SIGNALFD_H\n\n/* Define to 1 if you have the <sys/socket.h> header file. */\n#undef HAVE_SYS_SOCKET_H\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#undef HAVE_SYS_STAT_H\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#undef HAVE_SYS_TYPES_H\n\n/* Define to 1 if you have <sys/wait.h> that is POSIX.1 compatible. */\n#undef HAVE_SYS_WAIT_H\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#undef HAVE_UNISTD_H\n\n/* Define to 1 if you have the `vfork' function. */\n#undef HAVE_VFORK\n\n/* Define to 1 if you have the <vfork.h> header file. */\n#undef HAVE_VFORK_H\n\n/* Define to 1 if you have the <windows.h> header file. */\n#undef HAVE_WINDOWS_H\n\n/* Define to 1 if you have the <winsock2.h> header file. */\n#undef HAVE_WINSOCK2_H\n\n/* Define to 1 if `fork' works. */\n#undef HAVE_WORKING_FORK\n\n/* Define to 1 if `vfork' works. */\n#undef HAVE_WORKING_VFORK\n\n/* Define to 1 if you have the <ws2tcpip.h> header file. */\n#undef HAVE_WS2TCPIP_H\n\n/* have zlib compression support */\n#undef HAVE_ZLIB\n\n/* Define to 1 if you have the <zlib.h> header file. */\n#undef HAVE_ZLIB_H\n\n/* Define to the sub-directory in which libtool stores uninstalled libraries.\n   */\n#undef LT_OBJDIR\n\n/* Define to 1 if assertions should be disabled. */\n#undef NDEBUG\n\n/* Name of package */\n#undef PACKAGE\n\n/* Define to the address where bug reports for this package should be sent. */\n#undef PACKAGE_BUGREPORT\n\n/* Define to the full name of this package. */\n#undef PACKAGE_NAME\n\n/* Define to the full name and version of this package. */\n#undef PACKAGE_STRING\n\n/* Define to the one symbol short name of this package. */\n#undef PACKAGE_TARNAME\n\n/* Define to the home page for this package. */\n#undef PACKAGE_URL\n\n/* Define to the version of this package. */\n#undef PACKAGE_VERSION\n\n/* Define to necessary symbol if this constant uses a non-standard name on\n   your system. */\n#undef PTHREAD_CREATE_JOINABLE\n\n/* Define as the return type of signal handlers (`int' or `void'). */\n#undef RETSIGTYPE\n\n/* Define to the type of arg 1 for `select'. */\n#undef SELECT_TYPE_ARG1\n\n/* Define to the type of args 2, 3 and 4 for `select'. */\n#undef SELECT_TYPE_ARG234\n\n/* Define to the type of arg 5 for `select'. */\n#undef SELECT_TYPE_ARG5\n\n/* Define to 1 if you have the ANSI C header files. */\n#undef STDC_HEADERS\n\n/* Define to 1 if you can safely include both <sys/time.h> and <time.h>. */\n#undef TIME_WITH_SYS_TIME\n\n/* If the compiler supports a TLS storage class define it to that here */\n#undef TLS\n\n/* Use Apple CommonCrypto library */\n#undef USE_CRYPTO_APPLECC\n\n/* Use mbed TLS library */\n#undef USE_CRYPTO_MBEDTLS\n\n/* Use OpenSSL library */\n#undef USE_CRYPTO_OPENSSL\n\n/* Use PolarSSL library */\n#undef USE_CRYPTO_POLARSSL\n\n/* Enable extensions on AIX 3, Interix.  */\n#ifndef _ALL_SOURCE\n# undef _ALL_SOURCE\n#endif\n/* Enable GNU extensions on systems that have them.  */\n#ifndef _GNU_SOURCE\n# undef _GNU_SOURCE\n#endif\n/* Enable threading extensions on Solaris.  */\n#ifndef _POSIX_PTHREAD_SEMANTICS\n# undef _POSIX_PTHREAD_SEMANTICS\n#endif\n/* Enable extensions on HP NonStop.  */\n#ifndef _TANDEM_SOURCE\n# undef _TANDEM_SOURCE\n#endif\n/* Enable general extensions on Solaris.  */\n#ifndef __EXTENSIONS__\n# undef __EXTENSIONS__\n#endif\n\n\n/* Version number of package */\n#undef VERSION\n\n/* Define WORDS_BIGENDIAN to 1 if your processor stores words with the most\n   significant byte first (like Motorola and SPARC, unlike Intel). */\n#if defined AC_APPLE_UNIVERSAL_BUILD\n# if defined __BIG_ENDIAN__\n#  define WORDS_BIGENDIAN 1\n# endif\n#else\n# ifndef WORDS_BIGENDIAN\n#  undef WORDS_BIGENDIAN\n# endif\n#endif\n\n/* Define to 1 if on MINIX. */\n#undef _MINIX\n\n/* Define to 2 if the system does not provide POSIX.1 features except with\n   this defined. */\n#undef _POSIX_1_SOURCE\n\n/* Define to 1 if you need to in order for `stat' and other things to work. */\n#undef _POSIX_SOURCE\n\n/* Define for Solaris 2.5.1 so the uint8_t typedef from <sys/synch.h>,\n   <pthread.h>, or <semaphore.h> is not used. If the typedef were allowed, the\n   #define below would cause a syntax error. */\n#undef _UINT8_T\n\n/* Define to empty if `const' does not conform to ANSI C. */\n#undef const\n\n/* Define to `__inline__' or `__inline' if that's what the C compiler\n   calls it, or to nothing if 'inline' is not supported under any name.  */\n#ifndef __cplusplus\n#undef inline\n#endif\n\n/* Define to `int' if <sys/types.h> does not define. */\n#undef pid_t\n\n/* Define to the equivalent of the C99 'restrict' keyword, or to\n   nothing if this is not supported.  Do not define if restrict is\n   supported directly.  */\n#undef restrict\n/* Work around a bug in Sun C++: it does not support _Restrict or\n   __restrict__, even though the corresponding Sun C compiler ends up with\n   \"#define restrict _Restrict\" or \"#define restrict __restrict__\" in the\n   previous line.  Perhaps some future version of Sun C++ will work with\n   restrict; if so, hopefully it defines __RESTRICT like Sun C does.  */\n#if defined __SUNPRO_CC && !defined __RESTRICT\n# define _Restrict\n# define __restrict__\n#endif\n\n/* Define to `unsigned int' if <sys/types.h> does not define. */\n#undef size_t\n\n/* Define to `int' if <sys/types.h> does not define. */\n#undef ssize_t\n\n/* Define to the type of an unsigned integer type of width exactly 16 bits if\n   such a type exists and the standard includes do not define it. */\n#undef uint16_t\n\n/* Define to the type of an unsigned integer type of width exactly 8 bits if\n   such a type exists and the standard includes do not define it. */\n#undef uint8_t\n\n/* Define as `fork' if `vfork' does not work. */\n#undef vfork\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/configure",
    "content": "#! /bin/sh\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.69 for shadowsocks-libev 2.5.6.\n#\n# Report bugs to <max.c.lv@gmail.com>.\n#\n#\n# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.\n#\n#\n# This configure script is free software; the Free Software Foundation\n# gives unlimited permission to copy, distribute and modify it.\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\n# Use a proper internal environment variable to ensure we don't fall\n  # into an infinite loop, continuously re-executing ourselves.\n  if test x\"${_as_can_reexec}\" != xno && test \"x$CONFIG_SHELL\" != x; then\n    _as_can_reexec=no; export _as_can_reexec;\n    # We cannot yet assume a decent shell, so we have to provide a\n# neutralization value for shells without unset; and this also\n# works around shells that cannot unset nonexistent variables.\n# Preserve -v and -x to the replacement shell.\nBASH_ENV=/dev/null\nENV=/dev/null\n(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\ncase $- in # ((((\n  *v*x* | *x*v* ) as_opts=-vx ;;\n  *v* ) as_opts=-v ;;\n  *x* ) as_opts=-x ;;\n  * ) as_opts= ;;\nesac\nexec $CONFIG_SHELL $as_opts \"$as_myself\" ${1+\"$@\"}\n# Admittedly, this is quite paranoid, since all the known shells bail\n# out after a failed `exec'.\n$as_echo \"$0: could not re-execute with $CONFIG_SHELL\" >&2\nas_fn_exit 255\n  fi\n  # We don't want this to propagate to other subprocesses.\n          { _as_can_reexec=; unset _as_can_reexec;}\nif test \"x$CONFIG_SHELL\" = x; then\n  as_bourne_compatible=\"if test -n \\\"\\${ZSH_VERSION+set}\\\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on \\${1+\\\"\\$@\\\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '\\${1+\\\"\\$@\\\"}'='\\\"\\$@\\\"'\n  setopt NO_GLOB_SUBST\nelse\n  case \\`(set -o) 2>/dev/null\\` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\"\n  as_required=\"as_fn_return () { (exit \\$1); }\nas_fn_success () { as_fn_return 0; }\nas_fn_failure () { as_fn_return 1; }\nas_fn_ret_success () { return 0; }\nas_fn_ret_failure () { return 1; }\n\nexitcode=0\nas_fn_success || { exitcode=1; echo as_fn_success failed.; }\nas_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }\nas_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }\nas_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }\nif ( set x; as_fn_ret_success y && test x = \\\"\\$1\\\" ); then :\n\nelse\n  exitcode=1; echo positional parameters were not saved.\nfi\ntest x\\$exitcode = x0 || exit 1\ntest -x / || exit 1\"\n  as_suggested=\"  as_lineno_1=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_1a=\\$LINENO\n  as_lineno_2=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_2a=\\$LINENO\n  eval 'test \\\"x\\$as_lineno_1'\\$as_run'\\\" != \\\"x\\$as_lineno_2'\\$as_run'\\\" &&\n  test \\\"x\\`expr \\$as_lineno_1'\\$as_run' + 1\\`\\\" = \\\"x\\$as_lineno_2'\\$as_run'\\\"' || exit 1\ntest \\$(( 1 + 1 )) = 2 || exit 1\n\n  test -n \\\"\\${ZSH_VERSION+set}\\${BASH_VERSION+set}\\\" || (\n    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\n    ECHO=\\$ECHO\\$ECHO\\$ECHO\\$ECHO\\$ECHO\n    ECHO=\\$ECHO\\$ECHO\\$ECHO\\$ECHO\\$ECHO\\$ECHO\n    PATH=/empty FPATH=/empty; export PATH FPATH\n    test \\\"X\\`printf %s \\$ECHO\\`\\\" = \\\"X\\$ECHO\\\" \\\\\n      || test \\\"X\\`print -r -- \\$ECHO\\`\\\" = \\\"X\\$ECHO\\\" ) || exit 1\"\n  if (eval \"$as_required\") 2>/dev/null; then :\n  as_have_required=yes\nelse\n  as_have_required=no\nfi\n  if test x$as_have_required = xyes && (eval \"$as_suggested\") 2>/dev/null; then :\n\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nas_found=false\nfor as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  as_found=:\n  case $as_dir in #(\n\t /*)\n\t   for as_base in sh bash ksh sh5; do\n\t     # Try only shells that exist, to save several forks.\n\t     as_shell=$as_dir/$as_base\n\t     if { test -f \"$as_shell\" || test -f \"$as_shell.exe\"; } &&\n\t\t    { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$as_shell as_have_required=yes\n\t\t   if { $as_echo \"$as_bourne_compatible\"\"$as_suggested\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  break 2\nfi\nfi\n\t   done;;\n       esac\n  as_found=false\ndone\n$as_found || { if { test -f \"$SHELL\" || test -f \"$SHELL.exe\"; } &&\n\t      { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$SHELL\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$SHELL as_have_required=yes\nfi; }\nIFS=$as_save_IFS\n\n\n      if test \"x$CONFIG_SHELL\" != x; then :\n  export CONFIG_SHELL\n             # We cannot yet assume a decent shell, so we have to provide a\n# neutralization value for shells without unset; and this also\n# works around shells that cannot unset nonexistent variables.\n# Preserve -v and -x to the replacement shell.\nBASH_ENV=/dev/null\nENV=/dev/null\n(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\ncase $- in # ((((\n  *v*x* | *x*v* ) as_opts=-vx ;;\n  *v* ) as_opts=-v ;;\n  *x* ) as_opts=-x ;;\n  * ) as_opts= ;;\nesac\nexec $CONFIG_SHELL $as_opts \"$as_myself\" ${1+\"$@\"}\n# Admittedly, this is quite paranoid, since all the known shells bail\n# out after a failed `exec'.\n$as_echo \"$0: could not re-execute with $CONFIG_SHELL\" >&2\nexit 255\nfi\n\n    if test x$as_have_required = xno; then :\n  $as_echo \"$0: This script requires a shell more modern than all\"\n  $as_echo \"$0: the shells that I found on your system.\"\n  if test x${ZSH_VERSION+set} = xset ; then\n    $as_echo \"$0: In particular, zsh $ZSH_VERSION has bugs and should\"\n    $as_echo \"$0: be upgraded to zsh 4.3.4 or later.\"\n  else\n    $as_echo \"$0: Please tell bug-autoconf@gnu.org and max.c.lv@gmail.com\n$0: about your system, including any error possibly output\n$0: before this message. Then install a modern shell, or\n$0: manually run the script under such a shell if you do\n$0: have one.\"\n  fi\n  exit 1\nfi\nfi\nfi\nSHELL=${CONFIG_SHELL-/bin/sh}\nexport SHELL\n# Unset more variables known to interfere with behavior of common tools.\nCLICOLOR_FORCE= GREP_OPTIONS=\nunset CLICOLOR_FORCE GREP_OPTIONS\n\n## --------------------- ##\n## M4sh Shell Functions. ##\n## --------------------- ##\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\n\n# as_fn_executable_p FILE\n# -----------------------\n# Test if FILE is an executable regular file.\nas_fn_executable_p ()\n{\n  test -f \"$1\" && test -x \"$1\"\n} # as_fn_executable_p\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  $as_echo \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\n\n  as_lineno_1=$LINENO as_lineno_1a=$LINENO\n  as_lineno_2=$LINENO as_lineno_2a=$LINENO\n  eval 'test \"x$as_lineno_1'$as_run'\" != \"x$as_lineno_2'$as_run'\" &&\n  test \"x`expr $as_lineno_1'$as_run' + 1`\" = \"x$as_lineno_2'$as_run'\"' || {\n  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)\n  sed -n '\n    p\n    /[$]LINENO/=\n  ' <$as_myself |\n    sed '\n      s/[$]LINENO.*/&-/\n      t lineno\n      b\n      :lineno\n      N\n      :loop\n      s/[$]LINENO\\([^'$as_cr_alnum'_].*\\n\\)\\(.*\\)/\\2\\1\\2/\n      t loop\n      s/-\\n.*//\n    ' >$as_me.lineno &&\n  chmod +x \"$as_me.lineno\" ||\n    { $as_echo \"$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&2; as_fn_exit 1; }\n\n  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have\n  # already done that, so ensure we don't try to do so again and fall\n  # in an infinite loop.  This has already happened in practice.\n  _as_can_reexec=no; export _as_can_reexec\n  # Don't try to exec as it changes $[0], causing all sort of problems\n  # (the dirname of $[0] is not the place where we might find the\n  # original and so on.  Autoconf is especially sensitive to this).\n  . \"./$as_me.lineno\"\n  # Exit status is that of the last command.\n  exit\n}\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -pR'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -pR'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -pR'\n  fi\nelse\n  as_ln_s='cp -pR'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nas_test_x='test -x'\nas_executable_p=as_fn_executable_p\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\nSHELL=${CONFIG_SHELL-/bin/sh}\n\n\ntest -n \"$DJDIR\" || exec 7<&0 </dev/null\nexec 6>&1\n\n# Name of the host.\n# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,\n# so uname gets run too.\nac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`\n\n#\n# Initializations.\n#\nac_default_prefix=/usr/local\nac_clean_files=\nac_config_libobj_dir=.\nLIBOBJS=\ncross_compiling=no\nsubdirs=\nMFLAGS=\nMAKEFLAGS=\n\n# Identity of this package.\nPACKAGE_NAME='shadowsocks-libev'\nPACKAGE_TARNAME='shadowsocks-libev'\nPACKAGE_VERSION='2.5.6'\nPACKAGE_STRING='shadowsocks-libev 2.5.6'\nPACKAGE_BUGREPORT='max.c.lv@gmail.com'\nPACKAGE_URL=''\n\nac_unique_file=\"src/encrypt.c\"\n# Factoring default headers for most tests.\nac_includes_default=\"\\\n#include <stdio.h>\n#ifdef HAVE_SYS_TYPES_H\n# include <sys/types.h>\n#endif\n#ifdef HAVE_SYS_STAT_H\n# include <sys/stat.h>\n#endif\n#ifdef STDC_HEADERS\n# include <stdlib.h>\n# include <stddef.h>\n#else\n# ifdef HAVE_STDLIB_H\n#  include <stdlib.h>\n# endif\n#endif\n#ifdef HAVE_STRING_H\n# if !defined STDC_HEADERS && defined HAVE_MEMORY_H\n#  include <memory.h>\n# endif\n# include <string.h>\n#endif\n#ifdef HAVE_STRINGS_H\n# include <strings.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n# include <inttypes.h>\n#endif\n#ifdef HAVE_STDINT_H\n# include <stdint.h>\n#endif\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\"\n\nac_header_list=\nenable_option_checking=no\nac_subst_vars='am__EXEEXT_FALSE\nam__EXEEXT_TRUE\nLTLIBOBJS\nLIBOBJS\nsubdirs\nBUILD_WINCOMPAT_FALSE\nBUILD_WINCOMPAT_TRUE\nBUILD_REDIRECTOR_FALSE\nBUILD_REDIRECTOR_TRUE\nPTHREAD_CFLAGS\nPTHREAD_LIBS\nPTHREAD_CC\nax_pthread_config\nINET_NTOP_LIB\nMV\nRM\nGZIP\nXMLTO\nASCIIDOC\nENABLE_DOCUMENTATION_FALSE\nENABLE_DOCUMENTATION_TRUE\nUSE_SYSTEM_SHARED_LIB_FALSE\nUSE_SYSTEM_SHARED_LIB_TRUE\npcre_pcreh\npcreh\nLIBPCRE\nPCRE_CONFIG\nOTOOL64\nOTOOL\nLIPO\nNMEDIT\nDSYMUTIL\nMANIFEST_TOOL\nRANLIB\nDLLTOOL\nOBJDUMP\nLN_S\nNM\nac_ct_DUMPBIN\nDUMPBIN\nLD\nFGREP\nSED\nhost_os\nhost_vendor\nhost_cpu\nhost\nbuild_os\nbuild_vendor\nbuild_cpu\nbuild\nLIBTOOL\nMAINT\nMAINTAINER_MODE_FALSE\nMAINTAINER_MODE_TRUE\nac_ct_AR\nAR\nAM_BACKSLASH\nAM_DEFAULT_VERBOSITY\nAM_DEFAULT_V\nAM_V\nam__fastdepCC_FALSE\nam__fastdepCC_TRUE\nCCDEPMODE\nam__nodep\nAMDEPBACKSLASH\nAMDEP_FALSE\nAMDEP_TRUE\nam__quote\nam__include\nDEPDIR\nam__untar\nam__tar\nAMTAR\nam__leading_dot\nSET_MAKE\nAWK\nmkdir_p\nMKDIR_P\nINSTALL_STRIP_PROGRAM\nSTRIP\ninstall_sh\nMAKEINFO\nAUTOHEADER\nAUTOMAKE\nAUTOCONF\nACLOCAL\nVERSION\nPACKAGE\nCYGPATH_W\nam__isrc\nINSTALL_DATA\nINSTALL_SCRIPT\nINSTALL_PROGRAM\nEGREP\nGREP\nCPP\nOBJEXT\nEXEEXT\nac_ct_CC\nCPPFLAGS\nLDFLAGS\nCFLAGS\nCC\ntarget_alias\nhost_alias\nbuild_alias\nLIBS\nECHO_T\nECHO_N\nECHO_C\nDEFS\nmandir\nlocaledir\nlibdir\npsdir\npdfdir\ndvidir\nhtmldir\ninfodir\ndocdir\noldincludedir\nincludedir\nlocalstatedir\nsharedstatedir\nsysconfdir\ndatadir\ndatarootdir\nlibexecdir\nsbindir\nbindir\nprogram_transform_name\nprefix\nexec_prefix\nPACKAGE_URL\nPACKAGE_BUGREPORT\nPACKAGE_STRING\nPACKAGE_VERSION\nPACKAGE_TARNAME\nPACKAGE_NAME\nPATH_SEPARATOR\nSHELL'\nac_subst_files=''\nac_user_opts='\nenable_option_checking\nenable_dependency_tracking\nenable_silent_rules\nenable_maintainer_mode\nenable_static\nenable_shared\nwith_pic\nenable_fast_install\nwith_gnu_ld\nwith_sysroot\nenable_libtool_lock\nwith_pcre\nenable_system_shared_lib\nwith_crypto_library\nenable_documentation\nenable_zlib\nwith_zlib\nwith_zlib_include\nwith_zlib_lib\nwith_openssl\nwith_openssl_include\nwith_openssl_lib\nwith_polarssl\nwith_polarssl_include\nwith_polarssl_lib\nwith_mbedtls\nwith_mbedtls_include\nwith_mbedtls_lib\nenable_applecc\nenable_ssp\nenable_assert\n'\n      ac_precious_vars='build_alias\nhost_alias\ntarget_alias\nCC\nCFLAGS\nLDFLAGS\nLIBS\nCPPFLAGS\nCPP'\nac_subdirs_all='libsodium'\n\n# Initialize some variables set by options.\nac_init_help=\nac_init_version=false\nac_unrecognized_opts=\nac_unrecognized_sep=\n# The variables have the same names as the options, with\n# dashes changed to underlines.\ncache_file=/dev/null\nexec_prefix=NONE\nno_create=\nno_recursion=\nprefix=NONE\nprogram_prefix=NONE\nprogram_suffix=NONE\nprogram_transform_name=s,x,x,\nsilent=\nsite=\nsrcdir=\nverbose=\nx_includes=NONE\nx_libraries=NONE\n\n# Installation directory options.\n# These are left unexpanded so users can \"make install exec_prefix=/foo\"\n# and all the variables that are supposed to be based on exec_prefix\n# by default will actually change.\n# Use braces instead of parens because sh, perl, etc. also accept them.\n# (The list follows the same order as the GNU Coding Standards.)\nbindir='${exec_prefix}/bin'\nsbindir='${exec_prefix}/sbin'\nlibexecdir='${exec_prefix}/libexec'\ndatarootdir='${prefix}/share'\ndatadir='${datarootdir}'\nsysconfdir='${prefix}/etc'\nsharedstatedir='${prefix}/com'\nlocalstatedir='${prefix}/var'\nincludedir='${prefix}/include'\noldincludedir='/usr/include'\ndocdir='${datarootdir}/doc/${PACKAGE_TARNAME}'\ninfodir='${datarootdir}/info'\nhtmldir='${docdir}'\ndvidir='${docdir}'\npdfdir='${docdir}'\npsdir='${docdir}'\nlibdir='${exec_prefix}/lib'\nlocaledir='${datarootdir}/locale'\nmandir='${datarootdir}/man'\n\nac_prev=\nac_dashdash=\nfor ac_option\ndo\n  # If the previous option needs an argument, assign it.\n  if test -n \"$ac_prev\"; then\n    eval $ac_prev=\\$ac_option\n    ac_prev=\n    continue\n  fi\n\n  case $ac_option in\n  *=?*) ac_optarg=`expr \"X$ac_option\" : '[^=]*=\\(.*\\)'` ;;\n  *=)   ac_optarg= ;;\n  *)    ac_optarg=yes ;;\n  esac\n\n  # Accept the important Cygnus configure options, so we can diagnose typos.\n\n  case $ac_dashdash$ac_option in\n  --)\n    ac_dashdash=yes ;;\n\n  -bindir | --bindir | --bindi | --bind | --bin | --bi)\n    ac_prev=bindir ;;\n  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)\n    bindir=$ac_optarg ;;\n\n  -build | --build | --buil | --bui | --bu)\n    ac_prev=build_alias ;;\n  -build=* | --build=* | --buil=* | --bui=* | --bu=*)\n    build_alias=$ac_optarg ;;\n\n  -cache-file | --cache-file | --cache-fil | --cache-fi \\\n  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)\n    ac_prev=cache_file ;;\n  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \\\n  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)\n    cache_file=$ac_optarg ;;\n\n  --config-cache | -C)\n    cache_file=config.cache ;;\n\n  -datadir | --datadir | --datadi | --datad)\n    ac_prev=datadir ;;\n  -datadir=* | --datadir=* | --datadi=* | --datad=*)\n    datadir=$ac_optarg ;;\n\n  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \\\n  | --dataroo | --dataro | --datar)\n    ac_prev=datarootdir ;;\n  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \\\n  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)\n    datarootdir=$ac_optarg ;;\n\n  -disable-* | --disable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*disable-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=no ;;\n\n  -docdir | --docdir | --docdi | --doc | --do)\n    ac_prev=docdir ;;\n  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)\n    docdir=$ac_optarg ;;\n\n  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)\n    ac_prev=dvidir ;;\n  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)\n    dvidir=$ac_optarg ;;\n\n  -enable-* | --enable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*enable-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=\\$ac_optarg ;;\n\n  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \\\n  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \\\n  | --exec | --exe | --ex)\n    ac_prev=exec_prefix ;;\n  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \\\n  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \\\n  | --exec=* | --exe=* | --ex=*)\n    exec_prefix=$ac_optarg ;;\n\n  -gas | --gas | --ga | --g)\n    # Obsolete; use --with-gas.\n    with_gas=yes ;;\n\n  -help | --help | --hel | --he | -h)\n    ac_init_help=long ;;\n  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)\n    ac_init_help=recursive ;;\n  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)\n    ac_init_help=short ;;\n\n  -host | --host | --hos | --ho)\n    ac_prev=host_alias ;;\n  -host=* | --host=* | --hos=* | --ho=*)\n    host_alias=$ac_optarg ;;\n\n  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)\n    ac_prev=htmldir ;;\n  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \\\n  | --ht=*)\n    htmldir=$ac_optarg ;;\n\n  -includedir | --includedir | --includedi | --included | --include \\\n  | --includ | --inclu | --incl | --inc)\n    ac_prev=includedir ;;\n  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \\\n  | --includ=* | --inclu=* | --incl=* | --inc=*)\n    includedir=$ac_optarg ;;\n\n  -infodir | --infodir | --infodi | --infod | --info | --inf)\n    ac_prev=infodir ;;\n  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)\n    infodir=$ac_optarg ;;\n\n  -libdir | --libdir | --libdi | --libd)\n    ac_prev=libdir ;;\n  -libdir=* | --libdir=* | --libdi=* | --libd=*)\n    libdir=$ac_optarg ;;\n\n  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \\\n  | --libexe | --libex | --libe)\n    ac_prev=libexecdir ;;\n  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \\\n  | --libexe=* | --libex=* | --libe=*)\n    libexecdir=$ac_optarg ;;\n\n  -localedir | --localedir | --localedi | --localed | --locale)\n    ac_prev=localedir ;;\n  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)\n    localedir=$ac_optarg ;;\n\n  -localstatedir | --localstatedir | --localstatedi | --localstated \\\n  | --localstate | --localstat | --localsta | --localst | --locals)\n    ac_prev=localstatedir ;;\n  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \\\n  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)\n    localstatedir=$ac_optarg ;;\n\n  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)\n    ac_prev=mandir ;;\n  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)\n    mandir=$ac_optarg ;;\n\n  -nfp | --nfp | --nf)\n    # Obsolete; use --without-fp.\n    with_fp=no ;;\n\n  -no-create | --no-create | --no-creat | --no-crea | --no-cre \\\n  | --no-cr | --no-c | -n)\n    no_create=yes ;;\n\n  -no-recursion | --no-recursion | --no-recursio | --no-recursi \\\n  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)\n    no_recursion=yes ;;\n\n  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \\\n  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \\\n  | --oldin | --oldi | --old | --ol | --o)\n    ac_prev=oldincludedir ;;\n  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \\\n  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \\\n  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)\n    oldincludedir=$ac_optarg ;;\n\n  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)\n    ac_prev=prefix ;;\n  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)\n    prefix=$ac_optarg ;;\n\n  -program-prefix | --program-prefix | --program-prefi | --program-pref \\\n  | --program-pre | --program-pr | --program-p)\n    ac_prev=program_prefix ;;\n  -program-prefix=* | --program-prefix=* | --program-prefi=* \\\n  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)\n    program_prefix=$ac_optarg ;;\n\n  -program-suffix | --program-suffix | --program-suffi | --program-suff \\\n  | --program-suf | --program-su | --program-s)\n    ac_prev=program_suffix ;;\n  -program-suffix=* | --program-suffix=* | --program-suffi=* \\\n  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)\n    program_suffix=$ac_optarg ;;\n\n  -program-transform-name | --program-transform-name \\\n  | --program-transform-nam | --program-transform-na \\\n  | --program-transform-n | --program-transform- \\\n  | --program-transform | --program-transfor \\\n  | --program-transfo | --program-transf \\\n  | --program-trans | --program-tran \\\n  | --progr-tra | --program-tr | --program-t)\n    ac_prev=program_transform_name ;;\n  -program-transform-name=* | --program-transform-name=* \\\n  | --program-transform-nam=* | --program-transform-na=* \\\n  | --program-transform-n=* | --program-transform-=* \\\n  | --program-transform=* | --program-transfor=* \\\n  | --program-transfo=* | --program-transf=* \\\n  | --program-trans=* | --program-tran=* \\\n  | --progr-tra=* | --program-tr=* | --program-t=*)\n    program_transform_name=$ac_optarg ;;\n\n  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)\n    ac_prev=pdfdir ;;\n  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)\n    pdfdir=$ac_optarg ;;\n\n  -psdir | --psdir | --psdi | --psd | --ps)\n    ac_prev=psdir ;;\n  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)\n    psdir=$ac_optarg ;;\n\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil)\n    silent=yes ;;\n\n  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)\n    ac_prev=sbindir ;;\n  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \\\n  | --sbi=* | --sb=*)\n    sbindir=$ac_optarg ;;\n\n  -sharedstatedir | --sharedstatedir | --sharedstatedi \\\n  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \\\n  | --sharedst | --shareds | --shared | --share | --shar \\\n  | --sha | --sh)\n    ac_prev=sharedstatedir ;;\n  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \\\n  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \\\n  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \\\n  | --sha=* | --sh=*)\n    sharedstatedir=$ac_optarg ;;\n\n  -site | --site | --sit)\n    ac_prev=site ;;\n  -site=* | --site=* | --sit=*)\n    site=$ac_optarg ;;\n\n  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)\n    ac_prev=srcdir ;;\n  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)\n    srcdir=$ac_optarg ;;\n\n  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \\\n  | --syscon | --sysco | --sysc | --sys | --sy)\n    ac_prev=sysconfdir ;;\n  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \\\n  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)\n    sysconfdir=$ac_optarg ;;\n\n  -target | --target | --targe | --targ | --tar | --ta | --t)\n    ac_prev=target_alias ;;\n  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)\n    target_alias=$ac_optarg ;;\n\n  -v | -verbose | --verbose | --verbos | --verbo | --verb)\n    verbose=yes ;;\n\n  -version | --version | --versio | --versi | --vers | -V)\n    ac_init_version=: ;;\n\n  -with-* | --with-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*with-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=\\$ac_optarg ;;\n\n  -without-* | --without-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*without-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=no ;;\n\n  --x)\n    # Obsolete; use --with-x.\n    with_x=yes ;;\n\n  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \\\n  | --x-incl | --x-inc | --x-in | --x-i)\n    ac_prev=x_includes ;;\n  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \\\n  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)\n    x_includes=$ac_optarg ;;\n\n  -x-libraries | --x-libraries | --x-librarie | --x-librari \\\n  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)\n    ac_prev=x_libraries ;;\n  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \\\n  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)\n    x_libraries=$ac_optarg ;;\n\n  -*) as_fn_error $? \"unrecognized option: \\`$ac_option'\nTry \\`$0 --help' for more information\"\n    ;;\n\n  *=*)\n    ac_envvar=`expr \"x$ac_option\" : 'x\\([^=]*\\)='`\n    # Reject names that are not valid shell variable names.\n    case $ac_envvar in #(\n      '' | [0-9]* | *[!_$as_cr_alnum]* )\n      as_fn_error $? \"invalid variable name: \\`$ac_envvar'\" ;;\n    esac\n    eval $ac_envvar=\\$ac_optarg\n    export $ac_envvar ;;\n\n  *)\n    # FIXME: should be removed in autoconf 3.0.\n    $as_echo \"$as_me: WARNING: you should use --build, --host, --target\" >&2\n    expr \"x$ac_option\" : \".*[^-._$as_cr_alnum]\" >/dev/null &&\n      $as_echo \"$as_me: WARNING: invalid host type: $ac_option\" >&2\n    : \"${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}\"\n    ;;\n\n  esac\ndone\n\nif test -n \"$ac_prev\"; then\n  ac_option=--`echo $ac_prev | sed 's/_/-/g'`\n  as_fn_error $? \"missing argument to $ac_option\"\nfi\n\nif test -n \"$ac_unrecognized_opts\"; then\n  case $enable_option_checking in\n    no) ;;\n    fatal) as_fn_error $? \"unrecognized options: $ac_unrecognized_opts\" ;;\n    *)     $as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2 ;;\n  esac\nfi\n\n# Check all directory arguments for consistency.\nfor ac_var in\texec_prefix prefix bindir sbindir libexecdir datarootdir \\\n\t\tdatadir sysconfdir sharedstatedir localstatedir includedir \\\n\t\toldincludedir docdir infodir htmldir dvidir pdfdir psdir \\\n\t\tlibdir localedir mandir\ndo\n  eval ac_val=\\$$ac_var\n  # Remove trailing slashes.\n  case $ac_val in\n    */ )\n      ac_val=`expr \"X$ac_val\" : 'X\\(.*[^/]\\)' \\| \"X$ac_val\" : 'X\\(.*\\)'`\n      eval $ac_var=\\$ac_val;;\n  esac\n  # Be sure to have absolute directory names.\n  case $ac_val in\n    [\\\\/$]* | ?:[\\\\/]* )  continue;;\n    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;\n  esac\n  as_fn_error $? \"expected an absolute directory name for --$ac_var: $ac_val\"\ndone\n\n# There might be people who depend on the old broken behavior: `$host'\n# used to hold the argument of --host etc.\n# FIXME: To remove some day.\nbuild=$build_alias\nhost=$host_alias\ntarget=$target_alias\n\n# FIXME: To remove some day.\nif test \"x$host_alias\" != x; then\n  if test \"x$build_alias\" = x; then\n    cross_compiling=maybe\n  elif test \"x$build_alias\" != \"x$host_alias\"; then\n    cross_compiling=yes\n  fi\nfi\n\nac_tool_prefix=\ntest -n \"$host_alias\" && ac_tool_prefix=$host_alias-\n\ntest \"$silent\" = yes && exec 6>/dev/null\n\n\nac_pwd=`pwd` && test -n \"$ac_pwd\" &&\nac_ls_di=`ls -di .` &&\nac_pwd_ls_di=`cd \"$ac_pwd\" && ls -di .` ||\n  as_fn_error $? \"working directory cannot be determined\"\ntest \"X$ac_ls_di\" = \"X$ac_pwd_ls_di\" ||\n  as_fn_error $? \"pwd does not report name of working directory\"\n\n\n# Find the source files, if location was not specified.\nif test -z \"$srcdir\"; then\n  ac_srcdir_defaulted=yes\n  # Try the directory containing this script, then the parent directory.\n  ac_confdir=`$as_dirname -- \"$as_myself\" ||\n$as_expr X\"$as_myself\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_myself\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_myself\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  srcdir=$ac_confdir\n  if test ! -r \"$srcdir/$ac_unique_file\"; then\n    srcdir=..\n  fi\nelse\n  ac_srcdir_defaulted=no\nfi\nif test ! -r \"$srcdir/$ac_unique_file\"; then\n  test \"$ac_srcdir_defaulted\" = yes && srcdir=\"$ac_confdir or ..\"\n  as_fn_error $? \"cannot find sources ($ac_unique_file) in $srcdir\"\nfi\nac_msg=\"sources are in $srcdir, but \\`cd $srcdir' does not work\"\nac_abs_confdir=`(\n\tcd \"$srcdir\" && test -r \"./$ac_unique_file\" || as_fn_error $? \"$ac_msg\"\n\tpwd)`\n# When building in place, set srcdir=.\nif test \"$ac_abs_confdir\" = \"$ac_pwd\"; then\n  srcdir=.\nfi\n# Remove unnecessary trailing slashes from srcdir.\n# Double slashes in file names in object file debugging info\n# mess up M-x gdb in Emacs.\ncase $srcdir in\n*/) srcdir=`expr \"X$srcdir\" : 'X\\(.*[^/]\\)' \\| \"X$srcdir\" : 'X\\(.*\\)'`;;\nesac\nfor ac_var in $ac_precious_vars; do\n  eval ac_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_env_${ac_var}_value=\\$${ac_var}\n  eval ac_cv_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_cv_env_${ac_var}_value=\\$${ac_var}\ndone\n\n#\n# Report the --help message.\n#\nif test \"$ac_init_help\" = \"long\"; then\n  # Omit some internal or obsolete options to make the list less imposing.\n  # This message is too long to be a string in the A/UX 3.1 sh.\n  cat <<_ACEOF\n\\`configure' configures shadowsocks-libev 2.5.6 to adapt to many kinds of systems.\n\nUsage: $0 [OPTION]... [VAR=VALUE]...\n\nTo assign environment variables (e.g., CC, CFLAGS...), specify them as\nVAR=VALUE.  See below for descriptions of some of the useful variables.\n\nDefaults for the options are specified in brackets.\n\nConfiguration:\n  -h, --help              display this help and exit\n      --help=short        display options specific to this package\n      --help=recursive    display the short help of all the included packages\n  -V, --version           display version information and exit\n  -q, --quiet, --silent   do not print \\`checking ...' messages\n      --cache-file=FILE   cache test results in FILE [disabled]\n  -C, --config-cache      alias for \\`--cache-file=config.cache'\n  -n, --no-create         do not create output files\n      --srcdir=DIR        find the sources in DIR [configure dir or \\`..']\n\nInstallation directories:\n  --prefix=PREFIX         install architecture-independent files in PREFIX\n                          [$ac_default_prefix]\n  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX\n                          [PREFIX]\n\nBy default, \\`make install' will install all the files in\n\\`$ac_default_prefix/bin', \\`$ac_default_prefix/lib' etc.  You can specify\nan installation prefix other than \\`$ac_default_prefix' using \\`--prefix',\nfor instance \\`--prefix=\\$HOME'.\n\nFor better control, use the options below.\n\nFine tuning of the installation directories:\n  --bindir=DIR            user executables [EPREFIX/bin]\n  --sbindir=DIR           system admin executables [EPREFIX/sbin]\n  --libexecdir=DIR        program executables [EPREFIX/libexec]\n  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]\n  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]\n  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]\n  --libdir=DIR            object code libraries [EPREFIX/lib]\n  --includedir=DIR        C header files [PREFIX/include]\n  --oldincludedir=DIR     C header files for non-gcc [/usr/include]\n  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]\n  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]\n  --infodir=DIR           info documentation [DATAROOTDIR/info]\n  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]\n  --mandir=DIR            man documentation [DATAROOTDIR/man]\n  --docdir=DIR            documentation root\n                          [DATAROOTDIR/doc/shadowsocks-libev]\n  --htmldir=DIR           html documentation [DOCDIR]\n  --dvidir=DIR            dvi documentation [DOCDIR]\n  --pdfdir=DIR            pdf documentation [DOCDIR]\n  --psdir=DIR             ps documentation [DOCDIR]\n_ACEOF\n\n  cat <<\\_ACEOF\n\nProgram names:\n  --program-prefix=PREFIX            prepend PREFIX to installed program names\n  --program-suffix=SUFFIX            append SUFFIX to installed program names\n  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names\n\nSystem types:\n  --build=BUILD     configure for building on BUILD [guessed]\n  --host=HOST       cross-compile to build programs to run on HOST [BUILD]\n_ACEOF\nfi\n\nif test -n \"$ac_init_help\"; then\n  case $ac_init_help in\n     short | recursive ) echo \"Configuration of shadowsocks-libev 2.5.6:\";;\n   esac\n  cat <<\\_ACEOF\n\nOptional Features:\n  --disable-option-checking  ignore unrecognized --enable/--with options\n  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)\n  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]\n  --enable-dependency-tracking\n                          do not reject slow dependency extractors\n  --disable-dependency-tracking\n                          speeds up one-time build\n  --enable-silent-rules   less verbose build output (undo: \"make V=1\")\n  --disable-silent-rules  verbose build output (undo: \"make V=0\")\n  --enable-maintainer-mode\n                          enable make rules and dependencies not useful (and\n                          sometimes confusing) to the casual installer\n  --enable-static[=PKGS]  build static libraries [default=no]\n  --enable-shared[=PKGS]  build shared libraries [default=no]\n  --enable-fast-install[=PKGS]\n                          optimize for fast installation [default=yes]\n  --disable-libtool-lock  avoid locking (might break parallel builds)\n  --enable-system-shared-lib\n                          build against shared libraries when possible\n  --disable-documentation do not build documentation\n  --disable-zlib          disable zlib compression support\n  --enable-applecc        enable Apple CommonCrypto API support\n  --disable-ssp           Do not compile with -fstack-protector\n  --disable-assert        turn off assertions\n\nOptional Packages:\n  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]\n  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)\n  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use\n                          both]\n  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]\n  --with-sysroot=DIR Search for dependent libraries within DIR\n                        (or the compiler's sysroot if not specified).\n  --with-pcre=DIR         use a specific pcre library\n  --with-crypto-library=library\n                          build with the given crypto library,\n                          TYPE=openssl|polarssl|mbedtls [default=openssl]\n  --with-zlib=DIR         zlib base directory, or:\n  --with-zlib-include=DIR zlib headers directory\n  --with-zlib-lib=DIR     zlib library directory\n  --with-openssl=DIR      OpenSSL base directory, or:\n  --with-openssl-include=DIR\n                          OpenSSL headers directory (without trailing\n                          /openssl)\n  --with-openssl-lib=DIR  OpenSSL library directory\n  --with-polarssl=DIR     PolarSSL base directory, or:\n  --with-polarssl-include=DIR\n                          PolarSSL headers directory (without trailing\n                          /polarssl)\n  --with-polarssl-lib=DIR PolarSSL library directory\n  --with-mbedtls=DIR      mbed TLS base directory, or:\n  --with-mbedtls-include=DIR\n                          mbed TLS headers directory (without trailing\n                          /mbedtls)\n  --with-mbedtls-lib=DIR  mbed TLS library directory\n\nSome influential environment variables:\n  CC          C compiler command\n  CFLAGS      C compiler flags\n  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a\n              nonstandard directory <lib dir>\n  LIBS        libraries to pass to the linker, e.g. -l<library>\n  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if\n              you have headers in a nonstandard directory <include dir>\n  CPP         C preprocessor\n\nUse these variables to override the choices made by `configure' or to help\nit to find libraries and programs with nonstandard names/locations.\n\nReport bugs to <max.c.lv@gmail.com>.\n_ACEOF\nac_status=$?\nfi\n\nif test \"$ac_init_help\" = \"recursive\"; then\n  # If there are subdirs, report their specific --help.\n  for ac_dir in : $ac_subdirs_all; do test \"x$ac_dir\" = x: && continue\n    test -d \"$ac_dir\" ||\n      { cd \"$srcdir\" && ac_pwd=`pwd` && srcdir=. && test -d \"$ac_dir\"; } ||\n      continue\n    ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n    cd \"$ac_dir\" || { ac_status=$?; continue; }\n    # Check for guested configure.\n    if test -f \"$ac_srcdir/configure.gnu\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure.gnu\" --help=recursive\n    elif test -f \"$ac_srcdir/configure\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure\" --help=recursive\n    else\n      $as_echo \"$as_me: WARNING: no configuration information is in $ac_dir\" >&2\n    fi || ac_status=$?\n    cd \"$ac_pwd\" || { ac_status=$?; break; }\n  done\nfi\n\ntest -n \"$ac_init_help\" && exit $ac_status\nif $ac_init_version; then\n  cat <<\\_ACEOF\nshadowsocks-libev configure 2.5.6\ngenerated by GNU Autoconf 2.69\n\nCopyright (C) 2012 Free Software Foundation, Inc.\nThis configure script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\n_ACEOF\n  exit\nfi\n\n## ------------------------ ##\n## Autoconf initialization. ##\n## ------------------------ ##\n\n# ac_fn_c_try_compile LINENO\n# --------------------------\n# Try to compile conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext\n  if { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_compile\n\n# ac_fn_c_try_cpp LINENO\n# ----------------------\n# Try to preprocess conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_cpp ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } > conftest.i && {\n\t test -z \"$ac_c_preproc_warn_flag$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n    ac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_cpp\n\n# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES\n# -------------------------------------------------------\n# Tests whether HEADER exists, giving a warning if it cannot be compiled using\n# the include files in INCLUDES and setting the cache variable VAR\n# accordingly.\nac_fn_c_check_header_mongrel ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if eval \\${$3+:} false; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nelse\n  # Is the header compilable?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 usability\" >&5\n$as_echo_n \"checking $2 usability... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_header_compiler=yes\nelse\n  ac_header_compiler=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler\" >&5\n$as_echo \"$ac_header_compiler\" >&6; }\n\n# Is the header present?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 presence\" >&5\n$as_echo_n \"checking $2 presence... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <$2>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  ac_header_preproc=yes\nelse\n  ac_header_preproc=no\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc\" >&5\n$as_echo \"$ac_header_preproc\" >&6; }\n\n# So?  What about this header?\ncase $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((\n  yes:no: )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&5\n$as_echo \"$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n    ;;\n  no:yes:* )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled\" >&5\n$as_echo \"$as_me: WARNING: $2: present but cannot be compiled\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?\" >&5\n$as_echo \"$as_me: WARNING: $2:     check for missing prerequisite headers?\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation\" >&5\n$as_echo \"$as_me: WARNING: $2: see the Autoconf documentation\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&5\n$as_echo \"$as_me: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n( $as_echo \"## --------------------------------- ##\n## Report this to max.c.lv@gmail.com ##\n## --------------------------------- ##\"\n     ) | sed \"s/^/$as_me: WARNING:     /\" >&2\n    ;;\nesac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$3=\\$ac_header_compiler\"\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_header_mongrel\n\n# ac_fn_c_try_run LINENO\n# ----------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes\n# that executables *can* be run.\nac_fn_c_try_run ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: program exited with status $ac_status\" >&5\n       $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n       ac_retval=$ac_status\nfi\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_run\n\n# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES\n# -------------------------------------------------------\n# Tests whether HEADER exists and can be compiled using the include files in\n# INCLUDES, setting the cache variable VAR accordingly.\nac_fn_c_check_header_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_header_compile\n\n# ac_fn_c_try_link LINENO\n# -----------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_link ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext conftest$ac_exeext\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest$ac_exeext && {\n\t test \"$cross_compiling\" = yes ||\n\t test -x conftest$ac_exeext\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information\n  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would\n  # interfere with the next link command; also delete a directory that is\n  # left behind by Apple's compiler.  We do this before executing the actions.\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_link\n\n# ac_fn_c_check_func LINENO FUNC VAR\n# ----------------------------------\n# Tests whether FUNC exists, setting the cache variable VAR accordingly\nac_fn_c_check_func ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n/* Define $2 to an innocuous variant, in case <limits.h> declares $2.\n   For example, HP-UX 11i <limits.h> declares gettimeofday.  */\n#define $2 innocuous_$2\n\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $2 (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\n#undef $2\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar $2 ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined __stub_$2 || defined __stub___$2\nchoke me\n#endif\n\nint\nmain ()\n{\nreturn $2 ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_func\n\n# ac_fn_c_check_decl LINENO SYMBOL VAR INCLUDES\n# ---------------------------------------------\n# Tests whether SYMBOL is declared in INCLUDES, setting cache variable VAR\n# accordingly.\nac_fn_c_check_decl ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  as_decl_name=`echo $2|sed 's/ *(.*//'`\n  as_decl_use=`echo $2|sed -e 's/(/((/' -e 's/)/) 0&/' -e 's/,/) 0& (/g'`\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $as_decl_name is declared\" >&5\n$as_echo_n \"checking whether $as_decl_name is declared... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\n#ifndef $as_decl_name\n#ifdef __cplusplus\n  (void) $as_decl_use;\n#else\n  (void) $as_decl_name;\n#endif\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_decl\n\n# ac_fn_c_check_type LINENO TYPE VAR INCLUDES\n# -------------------------------------------\n# Tests whether TYPE exists after having included INCLUDES, setting cache\n# variable VAR accordingly.\nac_fn_c_check_type ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$3=no\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nif (sizeof ($2))\n\t return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\nint\nmain ()\n{\nif (sizeof (($2)))\n\t    return 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\nelse\n  eval \"$3=yes\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_type\n\n# ac_fn_c_find_uintX_t LINENO BITS VAR\n# ------------------------------------\n# Finds an unsigned integer type with width BITS, setting cache variable VAR\n# accordingly.\nac_fn_c_find_uintX_t ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for uint$2_t\" >&5\n$as_echo_n \"checking for uint$2_t... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$3=no\"\n     # Order is important - never check a type that is potentially smaller\n     # than half of the expected target width.\n     for ac_type in uint$2_t 'unsigned int' 'unsigned long int' \\\n\t 'unsigned long long int' 'unsigned short int' 'unsigned char'; do\n       cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain ()\n{\nstatic int test_array [1 - 2 * !((($ac_type) -1 >> ($2 / 2 - 1)) >> ($2 / 2 - 1) == 3)];\ntest_array [0] = 0;\nreturn test_array [0];\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  case $ac_type in #(\n  uint$2_t) :\n    eval \"$3=yes\" ;; #(\n  *) :\n    eval \"$3=\\$ac_type\" ;;\nesac\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n       if eval test \\\"x\\$\"$3\"\\\" = x\"no\"; then :\n\nelse\n  break\nfi\n     done\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_find_uintX_t\ncat >config.log <<_ACEOF\nThis file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mistake.\n\nIt was created by shadowsocks-libev $as_me 2.5.6, which was\ngenerated by GNU Autoconf 2.69.  Invocation command line was\n\n  $ $0 $@\n\n_ACEOF\nexec 5>>config.log\n{\ncat <<_ASUNAME\n## --------- ##\n## Platform. ##\n## --------- ##\n\nhostname = `(hostname || uname -n) 2>/dev/null | sed 1q`\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`\n\n/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`\n/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`\n/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`\n/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`\n\n_ASUNAME\n\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    $as_echo \"PATH: $as_dir\"\n  done\nIFS=$as_save_IFS\n\n} >&5\n\ncat >&5 <<_ACEOF\n\n\n## ----------- ##\n## Core tests. ##\n## ----------- ##\n\n_ACEOF\n\n\n# Keep a trace of the command line.\n# Strip out --no-create and --no-recursion so they do not pile up.\n# Strip out --silent because we don't want to record it for future runs.\n# Also quote any args containing shell meta-characters.\n# Make two passes to allow for proper duplicate-argument suppression.\nac_configure_args=\nac_configure_args0=\nac_configure_args1=\nac_must_keep_next=false\nfor ac_pass in 1 2\ndo\n  for ac_arg\n  do\n    case $ac_arg in\n    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;\n    -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n    | -silent | --silent | --silen | --sile | --sil)\n      continue ;;\n    *\\'*)\n      ac_arg=`$as_echo \"$ac_arg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    case $ac_pass in\n    1) as_fn_append ac_configure_args0 \" '$ac_arg'\" ;;\n    2)\n      as_fn_append ac_configure_args1 \" '$ac_arg'\"\n      if test $ac_must_keep_next = true; then\n\tac_must_keep_next=false # Got value, back to normal.\n      else\n\tcase $ac_arg in\n\t  *=* | --config-cache | -C | -disable-* | --disable-* \\\n\t  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \\\n\t  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \\\n\t  | -with-* | --with-* | -without-* | --without-* | --x)\n\t    case \"$ac_configure_args0 \" in\n\t      \"$ac_configure_args1\"*\" '$ac_arg' \"* ) continue ;;\n\t    esac\n\t    ;;\n\t  -* ) ac_must_keep_next=true ;;\n\tesac\n      fi\n      as_fn_append ac_configure_args \" '$ac_arg'\"\n      ;;\n    esac\n  done\ndone\n{ ac_configure_args0=; unset ac_configure_args0;}\n{ ac_configure_args1=; unset ac_configure_args1;}\n\n# When interrupted or exit'd, cleanup temporary files, and complete\n# config.log.  We remove comments because anyway the quotes in there\n# would cause problems or look ugly.\n# WARNING: Use '\\'' to represent an apostrophe within the trap.\n# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.\ntrap 'exit_status=$?\n  # Save into config.log some information that might help in debugging.\n  {\n    echo\n\n    $as_echo \"## ---------------- ##\n## Cache variables. ##\n## ---------------- ##\"\n    echo\n    # The following way of writing the cache mishandles newlines in values,\n(\n  for ac_var in `(set) 2>&1 | sed -n '\\''s/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'\\''`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n  (set) 2>&1 |\n    case $as_nl`(ac_space='\\'' '\\''; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      sed -n \\\n\t\"s/'\\''/'\\''\\\\\\\\'\\'''\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\''\\\\2'\\''/p\"\n      ;; #(\n    *)\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n)\n    echo\n\n    $as_echo \"## ----------------- ##\n## Output variables. ##\n## ----------------- ##\"\n    echo\n    for ac_var in $ac_subst_vars\n    do\n      eval ac_val=\\$$ac_var\n      case $ac_val in\n      *\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n      esac\n      $as_echo \"$ac_var='\\''$ac_val'\\''\"\n    done | sort\n    echo\n\n    if test -n \"$ac_subst_files\"; then\n      $as_echo \"## ------------------- ##\n## File substitutions. ##\n## ------------------- ##\"\n      echo\n      for ac_var in $ac_subst_files\n      do\n\teval ac_val=\\$$ac_var\n\tcase $ac_val in\n\t*\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n\tesac\n\t$as_echo \"$ac_var='\\''$ac_val'\\''\"\n      done | sort\n      echo\n    fi\n\n    if test -s confdefs.h; then\n      $as_echo \"## ----------- ##\n## confdefs.h. ##\n## ----------- ##\"\n      echo\n      cat confdefs.h\n      echo\n    fi\n    test \"$ac_signal\" != 0 &&\n      $as_echo \"$as_me: caught signal $ac_signal\"\n    $as_echo \"$as_me: exit $exit_status\"\n  } >&5\n  rm -f core *.core core.conftest.* &&\n    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&\n    exit $exit_status\n' 0\nfor ac_signal in 1 2 13 15; do\n  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal\ndone\nac_signal=0\n\n# confdefs.h avoids OS command line length limits that DEFS can exceed.\nrm -f -r conftest* confdefs.h\n\n$as_echo \"/* confdefs.h */\" > confdefs.h\n\n# Predefined preprocessor variables.\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_NAME \"$PACKAGE_NAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_VERSION \"$PACKAGE_VERSION\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_STRING \"$PACKAGE_STRING\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_URL \"$PACKAGE_URL\"\n_ACEOF\n\n\n# Let the site file select an alternate cache file if it wants to.\n# Prefer an explicitly selected file to automatically selected ones.\nac_site_file1=NONE\nac_site_file2=NONE\nif test -n \"$CONFIG_SITE\"; then\n  # We do not want a PATH search for config.site.\n  case $CONFIG_SITE in #((\n    -*)  ac_site_file1=./$CONFIG_SITE;;\n    */*) ac_site_file1=$CONFIG_SITE;;\n    *)   ac_site_file1=./$CONFIG_SITE;;\n  esac\nelif test \"x$prefix\" != xNONE; then\n  ac_site_file1=$prefix/share/config.site\n  ac_site_file2=$prefix/etc/config.site\nelse\n  ac_site_file1=$ac_default_prefix/share/config.site\n  ac_site_file2=$ac_default_prefix/etc/config.site\nfi\nfor ac_site_file in \"$ac_site_file1\" \"$ac_site_file2\"\ndo\n  test \"x$ac_site_file\" = xNONE && continue\n  if test /dev/null != \"$ac_site_file\" && test -r \"$ac_site_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file\" >&5\n$as_echo \"$as_me: loading site script $ac_site_file\" >&6;}\n    sed 's/^/| /' \"$ac_site_file\" >&5\n    . \"$ac_site_file\" \\\n      || { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"failed to load site script $ac_site_file\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n  fi\ndone\n\nif test -r \"$cache_file\"; then\n  # Some versions of bash will fail to source /dev/null (special files\n  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.\n  if test /dev/null != \"$cache_file\" && test -f \"$cache_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading cache $cache_file\" >&5\n$as_echo \"$as_me: loading cache $cache_file\" >&6;}\n    case $cache_file in\n      [\\\\/]* | ?:[\\\\/]* ) . \"$cache_file\";;\n      *)                      . \"./$cache_file\";;\n    esac\n  fi\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: creating cache $cache_file\" >&5\n$as_echo \"$as_me: creating cache $cache_file\" >&6;}\n  >$cache_file\nfi\n\nas_fn_append ac_header_list \" netdb.h\"\n# Check that the precious variables saved in the cache have kept the same\n# value.\nac_cache_corrupted=false\nfor ac_var in $ac_precious_vars; do\n  eval ac_old_set=\\$ac_cv_env_${ac_var}_set\n  eval ac_new_set=\\$ac_env_${ac_var}_set\n  eval ac_old_val=\\$ac_cv_env_${ac_var}_value\n  eval ac_new_val=\\$ac_env_${ac_var}_value\n  case $ac_old_set,$ac_new_set in\n    set,)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,set)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was not set in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was not set in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,);;\n    *)\n      if test \"x$ac_old_val\" != \"x$ac_new_val\"; then\n\t# differences in whitespace do not lead to failure.\n\tac_old_val_w=`echo x $ac_old_val`\n\tac_new_val_w=`echo x $ac_new_val`\n\tif test \"$ac_old_val_w\" != \"$ac_new_val_w\"; then\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' has changed since the previous run:\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' has changed since the previous run:\" >&2;}\n\t  ac_cache_corrupted=:\n\telse\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&5\n$as_echo \"$as_me: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&2;}\n\t  eval $ac_var=\\$ac_old_val\n\tfi\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   former value:  \\`$ac_old_val'\" >&5\n$as_echo \"$as_me:   former value:  \\`$ac_old_val'\" >&2;}\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   current value: \\`$ac_new_val'\" >&5\n$as_echo \"$as_me:   current value: \\`$ac_new_val'\" >&2;}\n      fi;;\n  esac\n  # Pass precious variables to config.status.\n  if test \"$ac_new_set\" = set; then\n    case $ac_new_val in\n    *\\'*) ac_arg=$ac_var=`$as_echo \"$ac_new_val\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    *) ac_arg=$ac_var=$ac_new_val ;;\n    esac\n    case \" $ac_configure_args \" in\n      *\" '$ac_arg' \"*) ;; # Avoid dups.  Use of quotes ensures accuracy.\n      *) as_fn_append ac_configure_args \" '$ac_arg'\" ;;\n    esac\n  fi\ndone\nif $ac_cache_corrupted; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build\" >&5\n$as_echo \"$as_me: error: changes in the environment can compromise the build\" >&2;}\n  as_fn_error $? \"run \\`make distclean' and/or \\`rm $cache_file' and start over\" \"$LINENO\" 5\nfi\n## -------------------- ##\n## Main body of script. ##\n## -------------------- ##\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n\nac_config_headers=\"$ac_config_headers config.h\"\n\nac_aux_dir=\nfor ac_dir in auto \"$srcdir\"/auto; do\n  if test -f \"$ac_dir/install-sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install-sh -c\"\n    break\n  elif test -f \"$ac_dir/install.sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install.sh -c\"\n    break\n  elif test -f \"$ac_dir/shtool\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/shtool install -c\"\n    break\n  fi\ndone\nif test -z \"$ac_aux_dir\"; then\n  as_fn_error $? \"cannot find install-sh, install.sh, or shtool in auto \\\"$srcdir\\\"/auto\" \"$LINENO\" 5\nfi\n\n# These three variables are undocumented and unsupported,\n# and are intended to be withdrawn in a future Autoconf release.\n# They can cause serious problems if a builder's source tree is in a directory\n# whose full name contains unusual characters.\nac_config_guess=\"$SHELL $ac_aux_dir/config.guess\"  # Please don't use this var.\nac_config_sub=\"$SHELL $ac_aux_dir/config.sub\"  # Please don't use this var.\nac_configure=\"$SHELL $ac_aux_dir/configure\"  # Please don't use this var.\n\n\n\n# expand $ac_aux_dir to an absolute path\nam_aux_dir=`cd $ac_aux_dir && pwd`\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}gcc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nif test -z \"$CC\"; then\n          if test -n \"$ac_tool_prefix\"; then\n    # Extract the first word of \"${ac_tool_prefix}cc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  fi\nfi\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  ac_prog_rejected=no\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    if test \"$as_dir/$ac_word$ac_exec_ext\" = \"/usr/ucb/cc\"; then\n       ac_prog_rejected=yes\n       continue\n     fi\n    ac_cv_prog_CC=\"cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# != 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    ac_cv_prog_CC=\"$as_dir/$ac_word${1+' '}$@\"\n  fi\nfi\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cl.exe\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CC\" && break\n  done\nfi\nif test -z \"$CC\"; then\n  ac_ct_CC=$CC\n  for ac_prog in cl.exe\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CC\" && break\ndone\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nfi\n\nfi\n\n\ntest -z \"$CC\" && { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files a.out a.out.dSYM a.exe b.out\"\n# Try to create an executable without -o first, disregard a.out.\n# It will help us diagnose broken compilers, and finding out an intuition\n# of exeext.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the C compiler works\" >&5\n$as_echo_n \"checking whether the C compiler works... \" >&6; }\nac_link_default=`$as_echo \"$ac_link\" | sed 's/ -o *conftest[^ ]*//'`\n\n# The possible output files:\nac_files=\"a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*\"\n\nac_rmfiles=\nfor ac_file in $ac_files\ndo\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    * ) ac_rmfiles=\"$ac_rmfiles $ac_file\";;\n  esac\ndone\nrm -f $ac_rmfiles\n\nif { { ac_try=\"$ac_link_default\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link_default\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.\n# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'\n# in a Makefile.  We should not override ac_cv_exeext if it was cached,\n# so that the user can short-circuit this test for compilers unknown to\n# Autoconf.\nfor ac_file in $ac_files ''\ndo\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )\n\t;;\n    [ab].out )\n\t# We found the default executable, but exeext='' is most\n\t# certainly right.\n\tbreak;;\n    *.* )\n\tif test \"${ac_cv_exeext+set}\" = set && test \"$ac_cv_exeext\" != no;\n\tthen :; else\n\t   ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\tfi\n\t# We set ac_cv_exeext here because the later test for it is not\n\t# safe: cross compilers may not add the suffix if given an `-o'\n\t# argument, so we may need to know it at that point already.\n\t# Even if this section looks crufty: it has the advantage of\n\t# actually working.\n\tbreak;;\n    * )\n\tbreak;;\n  esac\ndone\ntest \"$ac_cv_exeext\" = no && ac_cv_exeext=\n\nelse\n  ac_file=''\nfi\nif test -z \"$ac_file\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n$as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error 77 \"C compiler cannot create executables\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name\" >&5\n$as_echo_n \"checking for C compiler default output file name... \" >&6; }\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_file\" >&5\n$as_echo \"$ac_file\" >&6; }\nac_exeext=$ac_cv_exeext\n\nrm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of executables\" >&5\n$as_echo_n \"checking for suffix of executables... \" >&6; }\nif { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # If both `conftest.exe' and `conftest' are `present' (well, observable)\n# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will\n# work properly (i.e., refer to `conftest.exe'), while it won't with\n# `rm'.\nfor ac_file in conftest.exe conftest conftest.*; do\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    *.* ) ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\t  break;;\n    * ) break;;\n  esac\ndone\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of executables: cannot compile and link\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest conftest$ac_cv_exeext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext\" >&5\n$as_echo \"$ac_cv_exeext\" >&6; }\n\nrm -f conftest.$ac_ext\nEXEEXT=$ac_cv_exeext\nac_exeext=$EXEEXT\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nFILE *f = fopen (\"conftest.out\", \"w\");\n return ferror (f) || fclose (f) != 0;\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files=\"$ac_clean_files conftest.out\"\n# Check that the compiler produces executables we can run.  If not, either\n# the compiler is broken, or we cross compile.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling\" >&5\n$as_echo_n \"checking whether we are cross compiling... \" >&6; }\nif test \"$cross_compiling\" != yes; then\n  { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n  if { ac_try='./conftest$ac_cv_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then\n    cross_compiling=no\n  else\n    if test \"$cross_compiling\" = maybe; then\n\tcross_compiling=yes\n    else\n\t{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot run C compiled programs.\nIf you meant to cross compile, use \\`--host'.\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n    fi\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $cross_compiling\" >&5\n$as_echo \"$cross_compiling\" >&6; }\n\nrm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of object files\" >&5\n$as_echo_n \"checking for suffix of object files... \" >&6; }\nif ${ac_cv_objext+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.o conftest.obj\nif { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  for ac_file in conftest.o conftest.obj conftest.*; do\n  test -f \"$ac_file\" || continue;\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;\n    *) ac_cv_objext=`expr \"$ac_file\" : '.*\\.\\(.*\\)'`\n       break;;\n  esac\ndone\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of object files: cannot compile\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest.$ac_cv_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext\" >&5\n$as_echo \"$ac_cv_objext\" >&6; }\nOBJEXT=$ac_cv_objext\nac_objext=$OBJEXT\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C compiler... \" >&6; }\nif ${ac_cv_c_compiler_gnu+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_c_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu\" >&5\n$as_echo \"$ac_cv_c_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GCC=yes\nelse\n  GCC=\nfi\nac_test_CFLAGS=${CFLAGS+set}\nac_save_CFLAGS=$CFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g\" >&5\n$as_echo_n \"checking whether $CC accepts -g... \" >&6; }\nif ${ac_cv_prog_cc_g+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_c_werror_flag=$ac_c_werror_flag\n   ac_c_werror_flag=yes\n   ac_cv_prog_cc_g=no\n   CFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nelse\n  CFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\nelse\n  ac_c_werror_flag=$ac_save_c_werror_flag\n\t CFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_c_werror_flag=$ac_save_c_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g\" >&5\n$as_echo \"$ac_cv_prog_cc_g\" >&6; }\nif test \"$ac_test_CFLAGS\" = set; then\n  CFLAGS=$ac_save_CFLAGS\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89\" >&5\n$as_echo_n \"checking for $CC option to accept ISO C89... \" >&6; }\nif ${ac_cv_prog_cc_c89+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_prog_cc_c89=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdio.h>\nstruct stat;\n/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */\nstruct buf { int x; };\nFILE * (*rcsopen) (struct buf *, struct stat *, int);\nstatic char *e (p, i)\n     char **p;\n     int i;\n{\n  return p[i];\n}\nstatic char *f (char * (*g) (char **, int), char **p, ...)\n{\n  char *s;\n  va_list v;\n  va_start (v,p);\n  s = g (p, va_arg (v,int));\n  va_end (v);\n  return s;\n}\n\n/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has\n   function prototypes and stuff, but not '\\xHH' hex character constants.\n   These don't provoke an error unfortunately, instead are silently treated\n   as 'x'.  The following induces an error, until -std is added to get\n   proper ANSI mode.  Curiously '\\x00'!='x' always comes out true, for an\n   array size at least.  It's necessary to write '\\x00'==0 to get something\n   that's true only with -std.  */\nint osf4_cc_array ['\\x00' == 0 ? 1 : -1];\n\n/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters\n   inside strings and character constants.  */\n#define FOO(x) 'x'\nint xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];\n\nint test (int i, double x);\nstruct s1 {int (*f) (int a);};\nstruct s2 {int (*f) (double a);};\nint pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);\nint argc;\nchar **argv;\nint\nmain ()\n{\nreturn f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \\\n\t-Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_c89=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext\n  test \"x$ac_cv_prog_cc_c89\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\n\nfi\n# AC_CACHE_VAL\ncase \"x$ac_cv_prog_cc_c89\" in\n  x)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\n$as_echo \"none needed\" >&6; } ;;\n  xno)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\n$as_echo \"unsupported\" >&6; } ;;\n  *)\n    CC=\"$CC $ac_cv_prog_cc_c89\"\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89\" >&5\n$as_echo \"$ac_cv_prog_cc_c89\" >&6; } ;;\nesac\nif test \"x$ac_cv_prog_cc_c89\" != xno; then :\n\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together\" >&5\n$as_echo_n \"checking whether $CC understands -c and -o together... \" >&6; }\nif ${am_cv_prog_cc_c_o+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\n  # Make sure it works both with $CC and with simple cc.\n  # Following AC_PROG_CC_C_O, we do the test twice because some\n  # compilers refuse to overwrite an existing .o file with -o,\n  # though they will create one.\n  am_cv_prog_cc_c_o=yes\n  for am_i in 1 2; do\n    if { echo \"$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext\" >&5\n   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5\n   ac_status=$?\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   (exit $ac_status); } \\\n         && test -f conftest2.$ac_objext; then\n      : OK\n    else\n      am_cv_prog_cc_c_o=no\n      break\n    fi\n  done\n  rm -f core conftest*\n  unset am_i\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o\" >&5\n$as_echo \"$am_cv_prog_cc_c_o\" >&6; }\nif test \"$am_cv_prog_cc_c_o\" != yes; then\n   # Losing compiler, so override with the script.\n   # FIXME: It is wrong to rewrite CC.\n   # But if we don't then we get into trouble of one sort or another.\n   # A longer-term fix would be to have automake use am__CC in this case,\n   # and then we could set am__CC=\"\\$(top_srcdir)/compile \\$(CC)\"\n   CC=\"$am_aux_dir/compile $CC\"\nfi\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor\" >&5\n$as_echo_n \"checking how to run the C preprocessor... \" >&6; }\n# On Suns, sometimes $CPP names a directory.\nif test -n \"$CPP\" && test -d \"$CPP\"; then\n  CPP=\nfi\nif test -z \"$CPP\"; then\n  if ${ac_cv_prog_CPP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n      # Double quotes because CPP needs to be expanded\n    for CPP in \"$CC -E\" \"$CC -E -traditional-cpp\" \"/lib/cpp\"\n    do\n      ac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n  break\nfi\n\n    done\n    ac_cv_prog_CPP=$CPP\n\nfi\n  CPP=$ac_cv_prog_CPP\nelse\n  ac_cv_prog_CPP=$CPP\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CPP\" >&5\n$as_echo \"$CPP\" >&6; }\nac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"C preprocessor \\\"$CPP\\\" fails sanity check\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e\" >&5\n$as_echo_n \"checking for grep that handles long lines and -e... \" >&6; }\nif ${ac_cv_path_GREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$GREP\"; then\n  ac_path_GREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in grep ggrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_GREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_GREP\" || continue\n# Check for GNU ac_path_GREP and select it if it is found.\n  # Check for GNU $ac_path_GREP\ncase `\"$ac_path_GREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_GREP=\"$ac_path_GREP\" ac_path_GREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'GREP' >> \"conftest.nl\"\n    \"$ac_path_GREP\" -e 'GREP$' -e '-(cannot match)-' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_GREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_GREP=\"$ac_path_GREP\"\n      ac_path_GREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_GREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_GREP\"; then\n    as_fn_error $? \"no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_GREP=$GREP\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP\" >&5\n$as_echo \"$ac_cv_path_GREP\" >&6; }\n GREP=\"$ac_cv_path_GREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for egrep\" >&5\n$as_echo_n \"checking for egrep... \" >&6; }\nif ${ac_cv_path_EGREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1\n   then ac_cv_path_EGREP=\"$GREP -E\"\n   else\n     if test -z \"$EGREP\"; then\n  ac_path_EGREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in egrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_EGREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_EGREP\" || continue\n# Check for GNU ac_path_EGREP and select it if it is found.\n  # Check for GNU $ac_path_EGREP\ncase `\"$ac_path_EGREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_EGREP=\"$ac_path_EGREP\" ac_path_EGREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'EGREP' >> \"conftest.nl\"\n    \"$ac_path_EGREP\" 'EGREP$' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_EGREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_EGREP=\"$ac_path_EGREP\"\n      ac_path_EGREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_EGREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_EGREP\"; then\n    as_fn_error $? \"no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_EGREP=$EGREP\nfi\n\n   fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP\" >&5\n$as_echo \"$ac_cv_path_EGREP\" >&6; }\n EGREP=\"$ac_cv_path_EGREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ANSI C header files\" >&5\n$as_echo_n \"checking for ANSI C header files... \" >&6; }\nif ${ac_cv_header_stdc+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <float.h>\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_header_stdc=yes\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nif test $ac_cv_header_stdc = yes; then\n  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <string.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"memchr\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"free\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.\n  if test \"$cross_compiling\" = yes; then :\n  :\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ctype.h>\n#include <stdlib.h>\n#if ((' ' & 0x0FF) == 0x020)\n# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')\n# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))\n#else\n# define ISLOWER(c) \\\n\t\t   (('a' <= (c) && (c) <= 'i') \\\n\t\t     || ('j' <= (c) && (c) <= 'r') \\\n\t\t     || ('s' <= (c) && (c) <= 'z'))\n# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))\n#endif\n\n#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))\nint\nmain ()\n{\n  int i;\n  for (i = 0; i < 256; i++)\n    if (XOR (islower (i), ISLOWER (i))\n\t|| toupper (i) != TOUPPER (i))\n      return 2;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc\" >&5\n$as_echo \"$ac_cv_header_stdc\" >&6; }\nif test $ac_cv_header_stdc = yes; then\n\n$as_echo \"#define STDC_HEADERS 1\" >>confdefs.h\n\nfi\n\n# On IRIX 5.3, sys/types and inttypes.h are conflicting.\nfor ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \\\n\t\t  inttypes.h stdint.h unistd.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_compile \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\n\"\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n\n\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"minix/config.h\" \"ac_cv_header_minix_config_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_minix_config_h\" = xyes; then :\n  MINIX=yes\nelse\n  MINIX=\nfi\n\n\n  if test \"$MINIX\" = yes; then\n\n$as_echo \"#define _POSIX_SOURCE 1\" >>confdefs.h\n\n\n$as_echo \"#define _POSIX_1_SOURCE 2\" >>confdefs.h\n\n\n$as_echo \"#define _MINIX 1\" >>confdefs.h\n\n  fi\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__\" >&5\n$as_echo_n \"checking whether it is safe to define __EXTENSIONS__... \" >&6; }\nif ${ac_cv_safe_to_define___extensions__+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#         define __EXTENSIONS__ 1\n          $ac_includes_default\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_safe_to_define___extensions__=yes\nelse\n  ac_cv_safe_to_define___extensions__=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__\" >&5\n$as_echo \"$ac_cv_safe_to_define___extensions__\" >&6; }\n  test $ac_cv_safe_to_define___extensions__ = yes &&\n    $as_echo \"#define __EXTENSIONS__ 1\" >>confdefs.h\n\n  $as_echo \"#define _ALL_SOURCE 1\" >>confdefs.h\n\n  $as_echo \"#define _GNU_SOURCE 1\" >>confdefs.h\n\n  $as_echo \"#define _POSIX_PTHREAD_SEMANTICS 1\" >>confdefs.h\n\n  $as_echo \"#define _TANDEM_SOURCE 1\" >>confdefs.h\n\n\n\nam__api_version='1.14'\n\n# Find a good install program.  We prefer a C program (faster),\n# so one script is as good as another.  But avoid the broken or\n# incompatible versions:\n# SysV /etc/install, /usr/sbin/install\n# SunOS /usr/etc/install\n# IRIX /sbin/install\n# AIX /bin/install\n# AmigaOS /C/install, which installs bootblocks on floppy discs\n# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag\n# AFS /usr/afsws/bin/install, which mishandles nonexistent args\n# SVR4 /usr/ucb/install, which tries to use the nonexistent group \"staff\"\n# OS/2's system install, which has a completely different semantic\n# ./install, which can be erroneously created by make from ./install.sh.\n# Reject install programs that cannot install multiple files.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install\" >&5\n$as_echo_n \"checking for a BSD-compatible install... \" >&6; }\nif test -z \"$INSTALL\"; then\nif ${ac_cv_path_install+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    # Account for people who put trailing slashes in PATH elements.\ncase $as_dir/ in #((\n  ./ | .// | /[cC]/* | \\\n  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \\\n  ?:[\\\\/]os2[\\\\/]install[\\\\/]* | ?:[\\\\/]OS2[\\\\/]INSTALL[\\\\/]* | \\\n  /usr/ucb/* ) ;;\n  *)\n    # OSF1 and SCO ODT 3.0 have their own names for install.\n    # Don't use installbsd from OSF since it installs stuff as root\n    # by default.\n    for ac_prog in ginstall scoinst install; do\n      for ac_exec_ext in '' $ac_executable_extensions; do\n\tif as_fn_executable_p \"$as_dir/$ac_prog$ac_exec_ext\"; then\n\t  if test $ac_prog = install &&\n\t    grep dspmsg \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # AIX install.  It has an incompatible calling convention.\n\t    :\n\t  elif test $ac_prog = install &&\n\t    grep pwplus \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # program-specific install script used by HP pwplus--don't use.\n\t    :\n\t  else\n\t    rm -rf conftest.one conftest.two conftest.dir\n\t    echo one > conftest.one\n\t    echo two > conftest.two\n\t    mkdir conftest.dir\n\t    if \"$as_dir/$ac_prog$ac_exec_ext\" -c conftest.one conftest.two \"`pwd`/conftest.dir\" &&\n\t      test -s conftest.one && test -s conftest.two &&\n\t      test -s conftest.dir/conftest.one &&\n\t      test -s conftest.dir/conftest.two\n\t    then\n\t      ac_cv_path_install=\"$as_dir/$ac_prog$ac_exec_ext -c\"\n\t      break 3\n\t    fi\n\t  fi\n\tfi\n      done\n    done\n    ;;\nesac\n\n  done\nIFS=$as_save_IFS\n\nrm -rf conftest.one conftest.two conftest.dir\n\nfi\n  if test \"${ac_cv_path_install+set}\" = set; then\n    INSTALL=$ac_cv_path_install\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for INSTALL within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    INSTALL=$ac_install_sh\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $INSTALL\" >&5\n$as_echo \"$INSTALL\" >&6; }\n\n# Use test -z because SunOS4 sh mishandles braces in ${var-val}.\n# It thinks the first close brace ends the variable substitution.\ntest -z \"$INSTALL_PROGRAM\" && INSTALL_PROGRAM='${INSTALL}'\n\ntest -z \"$INSTALL_SCRIPT\" && INSTALL_SCRIPT='${INSTALL}'\n\ntest -z \"$INSTALL_DATA\" && INSTALL_DATA='${INSTALL} -m 644'\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether build environment is sane\" >&5\n$as_echo_n \"checking whether build environment is sane... \" >&6; }\n# Reject unsafe characters in $srcdir or the absolute working directory\n# name.  Accept space and tab only in the latter.\nam_lf='\n'\ncase `pwd` in\n  *[\\\\\\\"\\#\\$\\&\\'\\`$am_lf]*)\n    as_fn_error $? \"unsafe absolute working directory name\" \"$LINENO\" 5;;\nesac\ncase $srcdir in\n  *[\\\\\\\"\\#\\$\\&\\'\\`$am_lf\\ \\\t]*)\n    as_fn_error $? \"unsafe srcdir value: '$srcdir'\" \"$LINENO\" 5;;\nesac\n\n# Do 'set' in a subshell so we don't clobber the current shell's\n# arguments.  Must try -L first in case configure is actually a\n# symlink; some systems play weird games with the mod time of symlinks\n# (eg FreeBSD returns the mod time of the symlink's containing\n# directory).\nif (\n   am_has_slept=no\n   for am_try in 1 2; do\n     echo \"timestamp, slept: $am_has_slept\" > conftest.file\n     set X `ls -Lt \"$srcdir/configure\" conftest.file 2> /dev/null`\n     if test \"$*\" = \"X\"; then\n\t# -L didn't work.\n\tset X `ls -t \"$srcdir/configure\" conftest.file`\n     fi\n     if test \"$*\" != \"X $srcdir/configure conftest.file\" \\\n\t&& test \"$*\" != \"X conftest.file $srcdir/configure\"; then\n\n\t# If neither matched, then we have a broken ls.  This can happen\n\t# if, for instance, CONFIG_SHELL is bash and it inherits a\n\t# broken ls alias from the environment.  This has actually\n\t# happened.  Such a system could not be considered \"sane\".\n\tas_fn_error $? \"ls -t appears to fail.  Make sure there is not a broken\n  alias in your environment\" \"$LINENO\" 5\n     fi\n     if test \"$2\" = conftest.file || test $am_try -eq 2; then\n       break\n     fi\n     # Just in case.\n     sleep 1\n     am_has_slept=yes\n   done\n   test \"$2\" = conftest.file\n   )\nthen\n   # Ok.\n   :\nelse\n   as_fn_error $? \"newly created file is older than distributed files!\nCheck your system clock\" \"$LINENO\" 5\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n# If we didn't sleep, we still need to ensure time stamps of config.status and\n# generated files are strictly newer.\nam_sleep_pid=\nif grep 'slept: no' conftest.file >/dev/null 2>&1; then\n  ( sleep 1 ) &\n  am_sleep_pid=$!\nfi\n\nrm -f conftest.file\n\ntest \"$program_prefix\" != NONE &&\n  program_transform_name=\"s&^&$program_prefix&;$program_transform_name\"\n# Use a double $ so make ignores it.\ntest \"$program_suffix\" != NONE &&\n  program_transform_name=\"s&\\$&$program_suffix&;$program_transform_name\"\n# Double any \\ or $.\n# By default was `s,x,x', remove it if useless.\nac_script='s/[\\\\$]/&&/g;s/;s,x,x,$//'\nprogram_transform_name=`$as_echo \"$program_transform_name\" | sed \"$ac_script\"`\n\nif test x\"${MISSING+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    MISSING=\"\\${SHELL} \\\"$am_aux_dir/missing\\\"\" ;;\n  *)\n    MISSING=\"\\${SHELL} $am_aux_dir/missing\" ;;\n  esac\nfi\n# Use eval to expand $SHELL\nif eval \"$MISSING --is-lightweight\"; then\n  am_missing_run=\"$MISSING \"\nelse\n  am_missing_run=\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing\" >&5\n$as_echo \"$as_me: WARNING: 'missing' script is too old or missing\" >&2;}\nfi\n\nif test x\"${install_sh}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    install_sh=\"\\${SHELL} '$am_aux_dir/install-sh'\" ;;\n  *)\n    install_sh=\"\\${SHELL} $am_aux_dir/install-sh\"\n  esac\nfi\n\n# Installed binaries are usually stripped using 'strip' when the user\n# run \"make install-strip\".  However 'strip' might not be the right\n# tool to use in cross-compilation environments, therefore Automake\n# will honor the 'STRIP' environment variable to overrule this program.\nif test \"$cross_compiling\" != no; then\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}strip\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$STRIP\"; then\n  ac_cv_prog_STRIP=\"$STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_STRIP=\"${ac_tool_prefix}strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nSTRIP=$ac_cv_prog_STRIP\nif test -n \"$STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $STRIP\" >&5\n$as_echo \"$STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_STRIP\"; then\n  ac_ct_STRIP=$STRIP\n  # Extract the first word of \"strip\", so it can be a program name with args.\nset dummy strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_STRIP\"; then\n  ac_cv_prog_ac_ct_STRIP=\"$ac_ct_STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_STRIP=\"strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP\nif test -n \"$ac_ct_STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP\" >&5\n$as_echo \"$ac_ct_STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_STRIP\" = x; then\n    STRIP=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    STRIP=$ac_ct_STRIP\n  fi\nelse\n  STRIP=\"$ac_cv_prog_STRIP\"\nfi\n\nfi\nINSTALL_STRIP_PROGRAM=\"\\$(install_sh) -c -s\"\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p\" >&5\n$as_echo_n \"checking for a thread-safe mkdir -p... \" >&6; }\nif test -z \"$MKDIR_P\"; then\n  if ${ac_cv_path_mkdir+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in mkdir gmkdir; do\n\t for ac_exec_ext in '' $ac_executable_extensions; do\n\t   as_fn_executable_p \"$as_dir/$ac_prog$ac_exec_ext\" || continue\n\t   case `\"$as_dir/$ac_prog$ac_exec_ext\" --version 2>&1` in #(\n\t     'mkdir (GNU coreutils) '* | \\\n\t     'mkdir (coreutils) '* | \\\n\t     'mkdir (fileutils) '4.1*)\n\t       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext\n\t       break 3;;\n\t   esac\n\t done\n       done\n  done\nIFS=$as_save_IFS\n\nfi\n\n  test -d ./--version && rmdir ./--version\n  if test \"${ac_cv_path_mkdir+set}\" = set; then\n    MKDIR_P=\"$ac_cv_path_mkdir -p\"\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for MKDIR_P within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    MKDIR_P=\"$ac_install_sh -d\"\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MKDIR_P\" >&5\n$as_echo \"$MKDIR_P\" >&6; }\n\nfor ac_prog in gawk mawk nawk awk\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_AWK+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AWK\"; then\n  ac_cv_prog_AWK=\"$AWK\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_AWK=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAWK=$ac_cv_prog_AWK\nif test -n \"$AWK\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AWK\" >&5\n$as_echo \"$AWK\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$AWK\" && break\ndone\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \\$(MAKE)\" >&5\n$as_echo_n \"checking whether ${MAKE-make} sets \\$(MAKE)... \" >&6; }\nset x ${MAKE-make}\nac_make=`$as_echo \"$2\" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`\nif eval \\${ac_cv_prog_make_${ac_make}_set+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat >conftest.make <<\\_ACEOF\nSHELL = /bin/sh\nall:\n\t@echo '@@@%%%=$(MAKE)=@@@%%%'\n_ACEOF\n# GNU make sometimes prints \"make[1]: Entering ...\", which would confuse us.\ncase `${MAKE-make} -f conftest.make 2>/dev/null` in\n  *@@@%%%=?*=@@@%%%*)\n    eval ac_cv_prog_make_${ac_make}_set=yes;;\n  *)\n    eval ac_cv_prog_make_${ac_make}_set=no;;\nesac\nrm -f conftest.make\nfi\nif eval test \\$ac_cv_prog_make_${ac_make}_set = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n  SET_MAKE=\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n  SET_MAKE=\"MAKE=${MAKE-make}\"\nfi\n\nrm -rf .tst 2>/dev/null\nmkdir .tst 2>/dev/null\nif test -d .tst; then\n  am__leading_dot=.\nelse\n  am__leading_dot=_\nfi\nrmdir .tst 2>/dev/null\n\nDEPDIR=\"${am__leading_dot}deps\"\n\nac_config_commands=\"$ac_config_commands depfiles\"\n\n\nam_make=${MAKE-make}\ncat > confinc << 'END'\nam__doit:\n\t@echo this is the am__doit target\n.PHONY: am__doit\nEND\n# If we don't find an include directive, just comment out the code.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make\" >&5\n$as_echo_n \"checking for style of include used by $am_make... \" >&6; }\nam__include=\"#\"\nam__quote=\n_am_result=none\n# First try GNU make style include.\necho \"include confinc\" > confmf\n# Ignore all kinds of additional output from 'make'.\ncase `$am_make -s -f confmf 2> /dev/null` in #(\n*the\\ am__doit\\ target*)\n  am__include=include\n  am__quote=\n  _am_result=GNU\n  ;;\nesac\n# Now try BSD make style include.\nif test \"$am__include\" = \"#\"; then\n   echo '.include \"confinc\"' > confmf\n   case `$am_make -s -f confmf 2> /dev/null` in #(\n   *the\\ am__doit\\ target*)\n     am__include=.include\n     am__quote=\"\\\"\"\n     _am_result=BSD\n     ;;\n   esac\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $_am_result\" >&5\n$as_echo \"$_am_result\" >&6; }\nrm -f confinc confmf\n\n# Check whether --enable-dependency-tracking was given.\nif test \"${enable_dependency_tracking+set}\" = set; then :\n  enableval=$enable_dependency_tracking;\nfi\n\nif test \"x$enable_dependency_tracking\" != xno; then\n  am_depcomp=\"$ac_aux_dir/depcomp\"\n  AMDEPBACKSLASH='\\'\n  am__nodep='_no'\nfi\n if test \"x$enable_dependency_tracking\" != xno; then\n  AMDEP_TRUE=\n  AMDEP_FALSE='#'\nelse\n  AMDEP_TRUE='#'\n  AMDEP_FALSE=\nfi\n\n\n# Check whether --enable-silent-rules was given.\nif test \"${enable_silent_rules+set}\" = set; then :\n  enableval=$enable_silent_rules;\nfi\n\ncase $enable_silent_rules in # (((\n  yes) AM_DEFAULT_VERBOSITY=0;;\n   no) AM_DEFAULT_VERBOSITY=1;;\n    *) AM_DEFAULT_VERBOSITY=1;;\nesac\nam_make=${MAKE-make}\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables\" >&5\n$as_echo_n \"checking whether $am_make supports nested variables... \" >&6; }\nif ${am_cv_make_support_nested_variables+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if $as_echo 'TRUE=$(BAR$(V))\nBAR0=false\nBAR1=true\nV=1\nam__doit:\n\t@$(TRUE)\n.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then\n  am_cv_make_support_nested_variables=yes\nelse\n  am_cv_make_support_nested_variables=no\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables\" >&5\n$as_echo \"$am_cv_make_support_nested_variables\" >&6; }\nif test $am_cv_make_support_nested_variables = yes; then\n    AM_V='$(V)'\n  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'\nelse\n  AM_V=$AM_DEFAULT_VERBOSITY\n  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY\nfi\nAM_BACKSLASH='\\'\n\nif test \"`cd $srcdir && pwd`\" != \"`pwd`\"; then\n  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output\n  # is not polluted with repeated \"-I.\"\n  am__isrc=' -I$(srcdir)'\n  # test to see if srcdir already configured\n  if test -f $srcdir/config.status; then\n    as_fn_error $? \"source directory already configured; run \\\"make distclean\\\" there first\" \"$LINENO\" 5\n  fi\nfi\n\n# test whether we have cygpath\nif test -z \"$CYGPATH_W\"; then\n  if (cygpath --version) >/dev/null 2>/dev/null; then\n    CYGPATH_W='cygpath -w'\n  else\n    CYGPATH_W=echo\n  fi\nfi\n\n\n# Define the identity of the package.\n PACKAGE='shadowsocks-libev'\n VERSION='2.5.6'\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE \"$PACKAGE\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define VERSION \"$VERSION\"\n_ACEOF\n\n# Some tools Automake needs.\n\nACLOCAL=${ACLOCAL-\"${am_missing_run}aclocal-${am__api_version}\"}\n\n\nAUTOCONF=${AUTOCONF-\"${am_missing_run}autoconf\"}\n\n\nAUTOMAKE=${AUTOMAKE-\"${am_missing_run}automake-${am__api_version}\"}\n\n\nAUTOHEADER=${AUTOHEADER-\"${am_missing_run}autoheader\"}\n\n\nMAKEINFO=${MAKEINFO-\"${am_missing_run}makeinfo\"}\n\n# For better backward compatibility.  To be removed once Automake 1.9.x\n# dies out for good.  For more background, see:\n# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>\n# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>\nmkdir_p='$(MKDIR_P)'\n\n# We need awk for the \"check\" target.  The system \"awk\" is bad on\n# some platforms.\n# Always define AMTAR for backward compatibility.  Yes, it's still used\n# in the wild :-(  We should find a proper way to deprecate it ...\nAMTAR='$${TAR-tar}'\n\n\n# We'll loop over all known methods to create a tar archive until one works.\n_am_tools='gnutar  pax cpio none'\n\nam__tar='$${TAR-tar} chof - \"$$tardir\"' am__untar='$${TAR-tar} xf -'\n\n\n\n\n\ndepcc=\"$CC\"   am_compiler_list=\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc\" >&5\n$as_echo_n \"checking dependency style of $depcc... \" >&6; }\nif ${am_cv_CC_dependencies_compiler_type+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named 'D' -- because '-MD' means \"put the output\n  # in D\".\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_CC_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n 's/^#*\\([a-zA-Z0-9]*\\))$/\\1/p' < ./depcomp`\n  fi\n  am__universal=false\n  case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using \": > sub/conftst$i.h\" creates only sub/conftst1.h with\n      # Solaris 10 /bin/sh.\n      echo '/* dummy */' > sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with '-c' and '-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle '-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs.\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # After this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested.\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvc7 | msvc7msys | msvisualcpp | msvcmsys)\n      # This compiler won't grok '-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_CC_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_CC_dependencies_compiler_type=none\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type\" >&5\n$as_echo \"$am_cv_CC_dependencies_compiler_type\" >&6; }\nCCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type\n\n if\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_CC_dependencies_compiler_type\" = gcc3; then\n  am__fastdepCC_TRUE=\n  am__fastdepCC_FALSE='#'\nelse\n  am__fastdepCC_TRUE='#'\n  am__fastdepCC_FALSE=\nfi\n\n\n\n# POSIX will say in a future version that running \"rm -f\" with no argument\n# is OK; and we want to be able to make that assumption in our Makefile\n# recipes.  So use an aggressive probe to check that the usage we want is\n# actually supported \"in the wild\" to an acceptable degree.\n# See automake bug#10828.\n# To make any issue more visible, cause the running configure to be aborted\n# by default if the 'rm' program in use doesn't match our expectations; the\n# user can still override this though.\nif rm -f && rm -fr && rm -rf; then : OK; else\n  cat >&2 <<'END'\nOops!\n\nYour 'rm' program seems unable to run without file operands specified\non the command line, even when the '-f' option is present.  This is contrary\nto the behaviour of most rm programs out there, and not conforming with\nthe upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>\n\nPlease tell bug-automake@gnu.org about your system, including the value\nof your $PATH and any error possibly output before this message.  This\ncan help us improve future automake versions.\n\nEND\n  if test x\"$ACCEPT_INFERIOR_RM_PROGRAM\" = x\"yes\"; then\n    echo 'Configuration will proceed anyway, since you have set the' >&2\n    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to \"yes\"' >&2\n    echo >&2\n  else\n    cat >&2 <<'END'\nAborting the configuration process, to ensure you take notice of the issue.\n\nYou can download and install GNU coreutils to get an 'rm' implementation\nthat behaves properly: <http://www.gnu.org/software/coreutils/>.\n\nIf you want to complete the configuration process using your problematic\n'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM\nto \"yes\", and re-run configure.\n\nEND\n    as_fn_error $? \"Your 'rm' program is bad, sorry.\" \"$LINENO\" 5\n  fi\nfi\nif test -n \"$ac_tool_prefix\"; then\n  for ac_prog in ar lib \"link -lib\"\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_AR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AR\"; then\n  ac_cv_prog_AR=\"$AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_AR=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAR=$ac_cv_prog_AR\nif test -n \"$AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AR\" >&5\n$as_echo \"$AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$AR\" && break\n  done\nfi\nif test -z \"$AR\"; then\n  ac_ct_AR=$AR\n  for ac_prog in ar lib \"link -lib\"\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_AR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_AR\"; then\n  ac_cv_prog_ac_ct_AR=\"$ac_ct_AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_AR=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_AR=$ac_cv_prog_ac_ct_AR\nif test -n \"$ac_ct_AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR\" >&5\n$as_echo \"$ac_ct_AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_AR\" && break\ndone\n\n  if test \"x$ac_ct_AR\" = x; then\n    AR=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    AR=$ac_ct_AR\n  fi\nfi\n\n: ${AR=ar}\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking the archiver ($AR) interface\" >&5\n$as_echo_n \"checking the archiver ($AR) interface... \" >&6; }\nif ${am_cv_ar_interface+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n   am_cv_ar_interface=ar\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nint some_variable = 0;\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  am_ar_try='$AR cru libconftest.a conftest.$ac_objext >&5'\n      { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$am_ar_try\\\"\"; } >&5\n  (eval $am_ar_try) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n      if test \"$ac_status\" -eq 0; then\n        am_cv_ar_interface=ar\n      else\n        am_ar_try='$AR -NOLOGO -OUT:conftest.lib conftest.$ac_objext >&5'\n        { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$am_ar_try\\\"\"; } >&5\n  (eval $am_ar_try) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n        if test \"$ac_status\" -eq 0; then\n          am_cv_ar_interface=lib\n        else\n          am_cv_ar_interface=unknown\n        fi\n      fi\n      rm -f conftest.lib libconftest.a\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_ar_interface\" >&5\n$as_echo \"$am_cv_ar_interface\" >&6; }\n\ncase $am_cv_ar_interface in\nar)\n  ;;\nlib)\n  # Microsoft lib, so override with the ar-lib wrapper script.\n  # FIXME: It is wrong to rewrite AR.\n  # But if we don't then we get into trouble of one sort or another.\n  # A longer-term fix would be to have automake use am__AR in this case,\n  # and then we could set am__AR=\"$am_aux_dir/ar-lib \\$(AR)\" or something\n  # similar.\n  AR=\"$am_aux_dir/ar-lib $AR\"\n  ;;\nunknown)\n  as_fn_error $? \"could not determine $AR interface\" \"$LINENO\" 5\n  ;;\nesac\n\n# Check whether --enable-silent-rules was given.\nif test \"${enable_silent_rules+set}\" = set; then :\n  enableval=$enable_silent_rules;\nfi\n\ncase $enable_silent_rules in # (((\n  yes) AM_DEFAULT_VERBOSITY=0;;\n   no) AM_DEFAULT_VERBOSITY=1;;\n    *) AM_DEFAULT_VERBOSITY=0;;\nesac\nam_make=${MAKE-make}\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables\" >&5\n$as_echo_n \"checking whether $am_make supports nested variables... \" >&6; }\nif ${am_cv_make_support_nested_variables+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if $as_echo 'TRUE=$(BAR$(V))\nBAR0=false\nBAR1=true\nV=1\nam__doit:\n\t@$(TRUE)\n.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then\n  am_cv_make_support_nested_variables=yes\nelse\n  am_cv_make_support_nested_variables=no\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables\" >&5\n$as_echo \"$am_cv_make_support_nested_variables\" >&6; }\nif test $am_cv_make_support_nested_variables = yes; then\n    AM_V='$(V)'\n  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'\nelse\n  AM_V=$AM_DEFAULT_VERBOSITY\n  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY\nfi\nAM_BACKSLASH='\\'\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles\" >&5\n$as_echo_n \"checking whether to enable maintainer-specific portions of Makefiles... \" >&6; }\n    # Check whether --enable-maintainer-mode was given.\nif test \"${enable_maintainer_mode+set}\" = set; then :\n  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval\nelse\n  USE_MAINTAINER_MODE=no\nfi\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE\" >&5\n$as_echo \"$USE_MAINTAINER_MODE\" >&6; }\n   if test $USE_MAINTAINER_MODE = yes; then\n  MAINTAINER_MODE_TRUE=\n  MAINTAINER_MODE_FALSE='#'\nelse\n  MAINTAINER_MODE_TRUE='#'\n  MAINTAINER_MODE_FALSE=\nfi\n\n  MAINT=$MAINTAINER_MODE_TRUE\n\n\n# Check whether --enable-dependency-tracking was given.\nif test \"${enable_dependency_tracking+set}\" = set; then :\n  enableval=$enable_dependency_tracking;\nfi\n\nif test \"x$enable_dependency_tracking\" != xno; then\n  am_depcomp=\"$ac_aux_dir/depcomp\"\n  AMDEPBACKSLASH='\\'\n  am__nodep='_no'\nfi\n if test \"x$enable_dependency_tracking\" != xno; then\n  AMDEP_TRUE=\n  AMDEP_FALSE='#'\nelse\n  AMDEP_TRUE='#'\n  AMDEP_FALSE=\nfi\n\n\n\n# Check whether --enable-static was given.\nif test \"${enable_static+set}\" = set; then :\n  enableval=$enable_static; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_static=yes ;;\n    no) enable_static=no ;;\n    *)\n     enable_static=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_static=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  enable_static=no\nfi\n\n\n\n\n\n\n\n\n\n# Check whether --enable-shared was given.\nif test \"${enable_shared+set}\" = set; then :\n  enableval=$enable_shared; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_shared=yes ;;\n    no) enable_shared=no ;;\n    *)\n      enable_shared=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_shared=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  enable_shared=no\nfi\n\n\n\n\n\n\n\n\n\ncase `pwd` in\n  *\\ * | *\\\t*)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \\`pwd\\`\" >&5\n$as_echo \"$as_me: WARNING: Libtool does not cope well with whitespace in \\`pwd\\`\" >&2;} ;;\nesac\n\n\n\nmacro_version='2.4.2'\nmacro_revision='1.3337'\n\n\n\n\n\n\n\n\n\n\n\n\n\nltmain=\"$ac_aux_dir/ltmain.sh\"\n\n# Make sure we can run config.sub.\n$SHELL \"$ac_aux_dir/config.sub\" sun4 >/dev/null 2>&1 ||\n  as_fn_error $? \"cannot run $SHELL $ac_aux_dir/config.sub\" \"$LINENO\" 5\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking build system type\" >&5\n$as_echo_n \"checking build system type... \" >&6; }\nif ${ac_cv_build+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_build_alias=$build_alias\ntest \"x$ac_build_alias\" = x &&\n  ac_build_alias=`$SHELL \"$ac_aux_dir/config.guess\"`\ntest \"x$ac_build_alias\" = x &&\n  as_fn_error $? \"cannot guess build type; you must specify one\" \"$LINENO\" 5\nac_cv_build=`$SHELL \"$ac_aux_dir/config.sub\" $ac_build_alias` ||\n  as_fn_error $? \"$SHELL $ac_aux_dir/config.sub $ac_build_alias failed\" \"$LINENO\" 5\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_build\" >&5\n$as_echo \"$ac_cv_build\" >&6; }\ncase $ac_cv_build in\n*-*-*) ;;\n*) as_fn_error $? \"invalid value of canonical build\" \"$LINENO\" 5;;\nesac\nbuild=$ac_cv_build\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_build\nshift\nbuild_cpu=$1\nbuild_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nbuild_os=$*\nIFS=$ac_save_IFS\ncase $build_os in *\\ *) build_os=`echo \"$build_os\" | sed 's/ /-/g'`;; esac\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking host system type\" >&5\n$as_echo_n \"checking host system type... \" >&6; }\nif ${ac_cv_host+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test \"x$host_alias\" = x; then\n  ac_cv_host=$ac_cv_build\nelse\n  ac_cv_host=`$SHELL \"$ac_aux_dir/config.sub\" $host_alias` ||\n    as_fn_error $? \"$SHELL $ac_aux_dir/config.sub $host_alias failed\" \"$LINENO\" 5\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_host\" >&5\n$as_echo \"$ac_cv_host\" >&6; }\ncase $ac_cv_host in\n*-*-*) ;;\n*) as_fn_error $? \"invalid value of canonical host\" \"$LINENO\" 5;;\nesac\nhost=$ac_cv_host\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_host\nshift\nhost_cpu=$1\nhost_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nhost_os=$*\nIFS=$ac_save_IFS\ncase $host_os in *\\ *) host_os=`echo \"$host_os\" | sed 's/ /-/g'`;; esac\n\n\n# Backslashify metacharacters that are still active within\n# double-quoted strings.\nsed_quote_subst='s/\\([\"`$\\\\]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([\"`\\\\]\\)/\\\\\\1/g'\n\n# Sed substitution to delay expansion of an escaped shell variable in a\n# double_quote_subst'ed string.\ndelay_variable_subst='s/\\\\\\\\\\\\\\\\\\\\\\$/\\\\\\\\\\\\$/g'\n\n# Sed substitution to delay expansion of an escaped single quote.\ndelay_single_quote_subst='s/'\\''/'\\'\\\\\\\\\\\\\\'\\''/g'\n\n# Sed substitution to avoid accidental globbing in evaled expressions\nno_glob_subst='s/\\*/\\\\\\*/g'\n\nECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nECHO=$ECHO$ECHO$ECHO$ECHO$ECHO\nECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to print strings\" >&5\n$as_echo_n \"checking how to print strings... \" >&6; }\n# Test print first, because it will be a builtin if present.\nif test \"X`( print -r -- -n ) 2>/dev/null`\" = X-n && \\\n   test \"X`print -r -- $ECHO 2>/dev/null`\" = \"X$ECHO\"; then\n  ECHO='print -r --'\nelif test \"X`printf %s $ECHO 2>/dev/null`\" = \"X$ECHO\"; then\n  ECHO='printf %s\\n'\nelse\n  # Use this function as a fallback that always works.\n  func_fallback_echo ()\n  {\n    eval 'cat <<_LTECHO_EOF\n$1\n_LTECHO_EOF'\n  }\n  ECHO='func_fallback_echo'\nfi\n\n# func_echo_all arg...\n# Invoke $ECHO with all args, space-separated.\nfunc_echo_all ()\n{\n    $ECHO \"\"\n}\n\ncase \"$ECHO\" in\n  printf*) { $as_echo \"$as_me:${as_lineno-$LINENO}: result: printf\" >&5\n$as_echo \"printf\" >&6; } ;;\n  print*) { $as_echo \"$as_me:${as_lineno-$LINENO}: result: print -r\" >&5\n$as_echo \"print -r\" >&6; } ;;\n  *) { $as_echo \"$as_me:${as_lineno-$LINENO}: result: cat\" >&5\n$as_echo \"cat\" >&6; } ;;\nesac\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output\" >&5\n$as_echo_n \"checking for a sed that does not truncate output... \" >&6; }\nif ${ac_cv_path_SED+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/\n     for ac_i in 1 2 3 4 5 6 7; do\n       ac_script=\"$ac_script$as_nl$ac_script\"\n     done\n     echo \"$ac_script\" 2>/dev/null | sed 99q >conftest.sed\n     { ac_script=; unset ac_script;}\n     if test -z \"$SED\"; then\n  ac_path_SED_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in sed gsed; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_SED=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_SED\" || continue\n# Check for GNU ac_path_SED and select it if it is found.\n  # Check for GNU $ac_path_SED\ncase `\"$ac_path_SED\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_SED=\"$ac_path_SED\" ac_path_SED_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo '' >> \"conftest.nl\"\n    \"$ac_path_SED\" -f conftest.sed < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_SED_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_SED=\"$ac_path_SED\"\n      ac_path_SED_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_SED_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_SED\"; then\n    as_fn_error $? \"no acceptable sed could be found in \\$PATH\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_SED=$SED\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED\" >&5\n$as_echo \"$ac_cv_path_SED\" >&6; }\n SED=\"$ac_cv_path_SED\"\n  rm -f conftest.sed\n\ntest -z \"$SED\" && SED=sed\nXsed=\"$SED -e 1s/^X//\"\n\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for fgrep\" >&5\n$as_echo_n \"checking for fgrep... \" >&6; }\nif ${ac_cv_path_FGREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1\n   then ac_cv_path_FGREP=\"$GREP -F\"\n   else\n     if test -z \"$FGREP\"; then\n  ac_path_FGREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in fgrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_FGREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_FGREP\" || continue\n# Check for GNU ac_path_FGREP and select it if it is found.\n  # Check for GNU $ac_path_FGREP\ncase `\"$ac_path_FGREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_FGREP=\"$ac_path_FGREP\" ac_path_FGREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'FGREP' >> \"conftest.nl\"\n    \"$ac_path_FGREP\" FGREP < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_FGREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_FGREP=\"$ac_path_FGREP\"\n      ac_path_FGREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_FGREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_FGREP\"; then\n    as_fn_error $? \"no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_FGREP=$FGREP\nfi\n\n   fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP\" >&5\n$as_echo \"$ac_cv_path_FGREP\" >&6; }\n FGREP=\"$ac_cv_path_FGREP\"\n\n\ntest -z \"$GREP\" && GREP=grep\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n# Check whether --with-gnu-ld was given.\nif test \"${with_gnu_ld+set}\" = set; then :\n  withval=$with_gnu_ld; test \"$withval\" = no || with_gnu_ld=yes\nelse\n  with_gnu_ld=no\nfi\n\nac_prog=ld\nif test \"$GCC\" = yes; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ld used by $CC\" >&5\n$as_echo_n \"checking for ld used by $CC... \" >&6; }\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [\\\\/]* | ?:[\\\\/]*)\n      re_direlt='/[^/][^/]*/\\.\\./'\n      # Canonicalize the pathname of ld\n      ac_prog=`$ECHO \"$ac_prog\"| $SED 's%\\\\\\\\%/%g'`\n      while $ECHO \"$ac_prog\" | $GREP \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`$ECHO $ac_prog| $SED \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=\"$ac_prog\"\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test \"$with_gnu_ld\" = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for GNU ld\" >&5\n$as_echo_n \"checking for GNU ld... \" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for non-GNU ld\" >&5\n$as_echo_n \"checking for non-GNU ld... \" >&6; }\nfi\nif ${lt_cv_path_LD+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$LD\"; then\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      lt_cv_path_LD=\"$ac_dir/$ac_prog\"\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some variants of GNU ld only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      case `\"$lt_cv_path_LD\" -v 2>&1 </dev/null` in\n      *GNU* | *'with BFD'*)\n\ttest \"$with_gnu_ld\" != no && break\n\t;;\n      *)\n\ttest \"$with_gnu_ld\" != yes && break\n\t;;\n      esac\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\nelse\n  lt_cv_path_LD=\"$LD\" # Let the user override the test with a path.\nfi\nfi\n\nLD=\"$lt_cv_path_LD\"\nif test -n \"$LD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LD\" >&5\n$as_echo \"$LD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\ntest -z \"$LD\" && as_fn_error $? \"no acceptable ld found in \\$PATH\" \"$LINENO\" 5\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld\" >&5\n$as_echo_n \"checking if the linker ($LD) is GNU ld... \" >&6; }\nif ${lt_cv_prog_gnu_ld+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  # I'd rather use --version here, but apparently some GNU lds only accept -v.\ncase `$LD -v 2>&1 </dev/null` in\n*GNU* | *'with BFD'*)\n  lt_cv_prog_gnu_ld=yes\n  ;;\n*)\n  lt_cv_prog_gnu_ld=no\n  ;;\nesac\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld\" >&5\n$as_echo \"$lt_cv_prog_gnu_ld\" >&6; }\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)\" >&5\n$as_echo_n \"checking for BSD- or MS-compatible name lister (nm)... \" >&6; }\nif ${lt_cv_path_NM+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$NM\"; then\n  # Let the user override the test.\n  lt_cv_path_NM=\"$NM\"\nelse\n  lt_nm_to_check=\"${ac_tool_prefix}nm\"\n  if test -n \"$ac_tool_prefix\" && test \"$build\" = \"$host\"; then\n    lt_nm_to_check=\"$lt_nm_to_check nm\"\n  fi\n  for lt_tmp_nm in $lt_nm_to_check; do\n    lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do\n      IFS=\"$lt_save_ifs\"\n      test -z \"$ac_dir\" && ac_dir=.\n      tmp_nm=\"$ac_dir/$lt_tmp_nm\"\n      if test -f \"$tmp_nm\" || test -f \"$tmp_nm$ac_exeext\" ; then\n\t# Check to see if the nm accepts a BSD-compat flag.\n\t# Adding the `sed 1q' prevents false positives on HP-UX, which says:\n\t#   nm: unknown option \"B\" ignored\n\t# Tru64's nm complains that /dev/null is an invalid object file\n\tcase `\"$tmp_nm\" -B /dev/null 2>&1 | sed '1q'` in\n\t*/dev/null* | *'Invalid file or object type'*)\n\t  lt_cv_path_NM=\"$tmp_nm -B\"\n\t  break\n\t  ;;\n\t*)\n\t  case `\"$tmp_nm\" -p /dev/null 2>&1 | sed '1q'` in\n\t  */dev/null*)\n\t    lt_cv_path_NM=\"$tmp_nm -p\"\n\t    break\n\t    ;;\n\t  *)\n\t    lt_cv_path_NM=${lt_cv_path_NM=\"$tmp_nm\"} # keep the first match, but\n\t    continue # so that we can try to find one that supports BSD flags\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n      fi\n    done\n    IFS=\"$lt_save_ifs\"\n  done\n  : ${lt_cv_path_NM=no}\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM\" >&5\n$as_echo \"$lt_cv_path_NM\" >&6; }\nif test \"$lt_cv_path_NM\" != \"no\"; then\n  NM=\"$lt_cv_path_NM\"\nelse\n  # Didn't find any BSD compatible name lister, look for dumpbin.\n  if test -n \"$DUMPBIN\"; then :\n    # Let the user override the test.\n  else\n    if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in dumpbin \"link -dump\"\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_DUMPBIN+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DUMPBIN\"; then\n  ac_cv_prog_DUMPBIN=\"$DUMPBIN\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_DUMPBIN=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDUMPBIN=$ac_cv_prog_DUMPBIN\nif test -n \"$DUMPBIN\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DUMPBIN\" >&5\n$as_echo \"$DUMPBIN\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$DUMPBIN\" && break\n  done\nfi\nif test -z \"$DUMPBIN\"; then\n  ac_ct_DUMPBIN=$DUMPBIN\n  for ac_prog in dumpbin \"link -dump\"\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DUMPBIN\"; then\n  ac_cv_prog_ac_ct_DUMPBIN=\"$ac_ct_DUMPBIN\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_DUMPBIN=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN\nif test -n \"$ac_ct_DUMPBIN\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN\" >&5\n$as_echo \"$ac_ct_DUMPBIN\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_DUMPBIN\" && break\ndone\n\n  if test \"x$ac_ct_DUMPBIN\" = x; then\n    DUMPBIN=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DUMPBIN=$ac_ct_DUMPBIN\n  fi\nfi\n\n    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in\n    *COFF*)\n      DUMPBIN=\"$DUMPBIN -symbols\"\n      ;;\n    *)\n      DUMPBIN=:\n      ;;\n    esac\n  fi\n\n  if test \"$DUMPBIN\" != \":\"; then\n    NM=\"$DUMPBIN\"\n  fi\nfi\ntest -z \"$NM\" && NM=nm\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface\" >&5\n$as_echo_n \"checking the name lister ($NM) interface... \" >&6; }\nif ${lt_cv_nm_interface+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_nm_interface=\"BSD nm\"\n  echo \"int some_variable = 0;\" > conftest.$ac_ext\n  (eval echo \"\\\"\\$as_me:$LINENO: $ac_compile\\\"\" >&5)\n  (eval \"$ac_compile\" 2>conftest.err)\n  cat conftest.err >&5\n  (eval echo \"\\\"\\$as_me:$LINENO: $NM \\\\\\\"conftest.$ac_objext\\\\\\\"\\\"\" >&5)\n  (eval \"$NM \\\"conftest.$ac_objext\\\"\" 2>conftest.err > conftest.out)\n  cat conftest.err >&5\n  (eval echo \"\\\"\\$as_me:$LINENO: output\\\"\" >&5)\n  cat conftest.out >&5\n  if $GREP 'External.*some_variable' conftest.out > /dev/null; then\n    lt_cv_nm_interface=\"MS dumpbin\"\n  fi\n  rm -f conftest*\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface\" >&5\n$as_echo \"$lt_cv_nm_interface\" >&6; }\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ln -s works\" >&5\n$as_echo_n \"checking whether ln -s works... \" >&6; }\nLN_S=$as_ln_s\nif test \"$LN_S\" = \"ln -s\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no, using $LN_S\" >&5\n$as_echo \"no, using $LN_S\" >&6; }\nfi\n\n# find the maximum length of command line arguments\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments\" >&5\n$as_echo_n \"checking the maximum length of command line arguments... \" >&6; }\nif ${lt_cv_sys_max_cmd_len+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n    i=0\n  teststring=\"ABCD\"\n\n  case $build_os in\n  msdosdjgpp*)\n    # On DJGPP, this test can blow up pretty badly due to problems in libc\n    # (any single argument exceeding 2000 bytes causes a buffer overrun\n    # during glob expansion).  Even if it were fixed, the result of this\n    # check would be larger than it should be.\n    lt_cv_sys_max_cmd_len=12288;    # 12K is about right\n    ;;\n\n  gnu*)\n    # Under GNU Hurd, this test is not required because there is\n    # no limit to the length of command line arguments.\n    # Libtool will interpret -1 as no limit whatsoever\n    lt_cv_sys_max_cmd_len=-1;\n    ;;\n\n  cygwin* | mingw* | cegcc*)\n    # On Win9x/ME, this test blows up -- it succeeds, but takes\n    # about 5 minutes as the teststring grows exponentially.\n    # Worse, since 9x/ME are not pre-emptively multitasking,\n    # you end up with a \"frozen\" computer, even though with patience\n    # the test eventually succeeds (with a max line length of 256k).\n    # Instead, let's just punt: use the minimum linelength reported by\n    # all of the supported platforms: 8192 (on NT/2K/XP).\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  mint*)\n    # On MiNT this can take a long time and run out of memory.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  amigaos*)\n    # On AmigaOS with pdksh, this test takes hours, literally.\n    # So we just punt and use a minimum line length of 8192.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)\n    # This has been around since 386BSD, at least.  Likely further.\n    if test -x /sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`\n    elif test -x /usr/sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`\n    else\n      lt_cv_sys_max_cmd_len=65536\t# usable default for all BSDs\n    fi\n    # And add a safety zone\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    ;;\n\n  interix*)\n    # We know the value 262144 and hardcode it with a safety zone (like BSD)\n    lt_cv_sys_max_cmd_len=196608\n    ;;\n\n  os2*)\n    # The test takes a long time on OS/2.\n    lt_cv_sys_max_cmd_len=8192\n    ;;\n\n  osf*)\n    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure\n    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not\n    # nice to cause kernel panics so lets avoid the loop below.\n    # First set a reasonable default.\n    lt_cv_sys_max_cmd_len=16384\n    #\n    if test -x /sbin/sysconfig; then\n      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in\n        *1*) lt_cv_sys_max_cmd_len=-1 ;;\n      esac\n    fi\n    ;;\n  sco3.2v5*)\n    lt_cv_sys_max_cmd_len=102400\n    ;;\n  sysv5* | sco5v6* | sysv4.2uw2*)\n    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`\n    if test -n \"$kargmax\"; then\n      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[\t ]//'`\n    else\n      lt_cv_sys_max_cmd_len=32768\n    fi\n    ;;\n  *)\n    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`\n    if test -n \"$lt_cv_sys_max_cmd_len\" && \\\n\ttest undefined != \"$lt_cv_sys_max_cmd_len\"; then\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    else\n      # Make teststring a little bigger before we do anything with it.\n      # a 1K string should be a reasonable start.\n      for i in 1 2 3 4 5 6 7 8 ; do\n        teststring=$teststring$teststring\n      done\n      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}\n      # If test is not a shell built-in, we'll probably end up computing a\n      # maximum length that is only half of the actual maximum length, but\n      # we can't tell.\n      while { test \"X\"`env echo \"$teststring$teststring\" 2>/dev/null` \\\n\t         = \"X$teststring$teststring\"; } >/dev/null 2>&1 &&\n\t      test $i != 17 # 1/2 MB should be enough\n      do\n        i=`expr $i + 1`\n        teststring=$teststring$teststring\n      done\n      # Only check the string length outside the loop.\n      lt_cv_sys_max_cmd_len=`expr \"X$teststring\" : \".*\" 2>&1`\n      teststring=\n      # Add a significant safety factor because C++ compilers can tack on\n      # massive amounts of additional arguments before passing them to the\n      # linker.  It appears as though 1/2 is a usable value.\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 2`\n    fi\n    ;;\n  esac\n\nfi\n\nif test -n $lt_cv_sys_max_cmd_len ; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len\" >&5\n$as_echo \"$lt_cv_sys_max_cmd_len\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none\" >&5\n$as_echo \"none\" >&6; }\nfi\nmax_cmd_len=$lt_cv_sys_max_cmd_len\n\n\n\n\n\n\n: ${CP=\"cp -f\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs\" >&5\n$as_echo_n \"checking whether the shell understands some XSI constructs... \" >&6; }\n# Try some XSI features\nxsi_shell=no\n( _lt_dummy=\"a/b/c\"\n  test \"${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}\"${_lt_dummy%\"$_lt_dummy\"}, \\\n      = c,a/b,b/c, \\\n    && eval 'test $(( 1 + 1 )) -eq 2 \\\n    && test \"${#_lt_dummy}\" -eq 5' ) >/dev/null 2>&1 \\\n  && xsi_shell=yes\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $xsi_shell\" >&5\n$as_echo \"$xsi_shell\" >&6; }\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the shell understands \\\"+=\\\"\" >&5\n$as_echo_n \"checking whether the shell understands \\\"+=\\\"... \" >&6; }\nlt_shell_append=no\n( foo=bar; set foo baz; eval \"$1+=\\$2\" && test \"$foo\" = barbaz ) \\\n    >/dev/null 2>&1 \\\n  && lt_shell_append=yes\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_shell_append\" >&5\n$as_echo \"$lt_shell_append\" >&6; }\n\n\nif ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then\n  lt_unset=unset\nelse\n  lt_unset=false\nfi\n\n\n\n\n\n# test EBCDIC or ASCII\ncase `echo X|tr X '\\101'` in\n A) # ASCII based system\n    # \\n is not interpreted correctly by Solaris 8 /usr/ucb/tr\n  lt_SP2NL='tr \\040 \\012'\n  lt_NL2SP='tr \\015\\012 \\040\\040'\n  ;;\n *) # EBCDIC based system\n  lt_SP2NL='tr \\100 \\n'\n  lt_NL2SP='tr \\r\\n \\100\\100'\n  ;;\nesac\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format\" >&5\n$as_echo_n \"checking how to convert $build file names to $host format... \" >&6; }\nif ${lt_cv_to_host_file_cmd+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $host in\n  *-*-mingw* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32\n        ;;\n      *-*-cygwin* )\n        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32\n        ;;\n      * ) # otherwise, assume *nix\n        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32\n        ;;\n    esac\n    ;;\n  *-*-cygwin* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin\n        ;;\n      *-*-cygwin* )\n        lt_cv_to_host_file_cmd=func_convert_file_noop\n        ;;\n      * ) # otherwise, assume *nix\n        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin\n        ;;\n    esac\n    ;;\n  * ) # unhandled hosts (and \"normal\" native builds)\n    lt_cv_to_host_file_cmd=func_convert_file_noop\n    ;;\nesac\n\nfi\n\nto_host_file_cmd=$lt_cv_to_host_file_cmd\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd\" >&5\n$as_echo \"$lt_cv_to_host_file_cmd\" >&6; }\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format\" >&5\n$as_echo_n \"checking how to convert $build file names to toolchain format... \" >&6; }\nif ${lt_cv_to_tool_file_cmd+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  #assume ordinary cross tools, or native build.\nlt_cv_to_tool_file_cmd=func_convert_file_noop\ncase $host in\n  *-*-mingw* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32\n        ;;\n    esac\n    ;;\nesac\n\nfi\n\nto_tool_file_cmd=$lt_cv_to_tool_file_cmd\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd\" >&5\n$as_echo \"$lt_cv_to_tool_file_cmd\" >&6; }\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files\" >&5\n$as_echo_n \"checking for $LD option to reload object files... \" >&6; }\nif ${lt_cv_ld_reload_flag+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ld_reload_flag='-r'\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag\" >&5\n$as_echo \"$lt_cv_ld_reload_flag\" >&6; }\nreload_flag=$lt_cv_ld_reload_flag\ncase $reload_flag in\n\"\" | \" \"*) ;;\n*) reload_flag=\" $reload_flag\" ;;\nesac\nreload_cmds='$LD$reload_flag -o $output$reload_objs'\ncase $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    if test \"$GCC\" != yes; then\n      reload_cmds=false\n    fi\n    ;;\n  darwin*)\n    if test \"$GCC\" = yes; then\n      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'\n    else\n      reload_cmds='$LD$reload_flag -o $output$reload_objs'\n    fi\n    ;;\nesac\n\n\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}objdump\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}objdump; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_OBJDUMP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OBJDUMP\"; then\n  ac_cv_prog_OBJDUMP=\"$OBJDUMP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_OBJDUMP=\"${ac_tool_prefix}objdump\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOBJDUMP=$ac_cv_prog_OBJDUMP\nif test -n \"$OBJDUMP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OBJDUMP\" >&5\n$as_echo \"$OBJDUMP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OBJDUMP\"; then\n  ac_ct_OBJDUMP=$OBJDUMP\n  # Extract the first word of \"objdump\", so it can be a program name with args.\nset dummy objdump; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OBJDUMP\"; then\n  ac_cv_prog_ac_ct_OBJDUMP=\"$ac_ct_OBJDUMP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_OBJDUMP=\"objdump\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP\nif test -n \"$ac_ct_OBJDUMP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP\" >&5\n$as_echo \"$ac_ct_OBJDUMP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OBJDUMP\" = x; then\n    OBJDUMP=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OBJDUMP=$ac_ct_OBJDUMP\n  fi\nelse\n  OBJDUMP=\"$ac_cv_prog_OBJDUMP\"\nfi\n\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries\" >&5\n$as_echo_n \"checking how to recognize dependent libraries... \" >&6; }\nif ${lt_cv_deplibs_check_method+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_file_magic_cmd='$MAGIC_CMD'\nlt_cv_file_magic_test_file=\nlt_cv_deplibs_check_method='unknown'\n# Need to set the preceding variable on all platforms that support\n# interlibrary dependencies.\n# 'none' -- dependencies not supported.\n# `unknown' -- same as none, but documents that we really don't know.\n# 'pass_all' -- all dependencies passed with no checks.\n# 'test_compile' -- check by making test program.\n# 'file_magic [[regex]]' -- check by looking for files in library path\n# which responds to the $file_magic_cmd with a given extended regex.\n# If you have `file' or equivalent on your system and you're not sure\n# whether `pass_all' will *always* work, you probably want this one.\n\ncase $host_os in\naix[4-9]*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbeos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbsdi[45]*)\n  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'\n  lt_cv_file_magic_cmd='/usr/bin/file -L'\n  lt_cv_file_magic_test_file=/shlib/libc.so\n  ;;\n\ncygwin*)\n  # func_win32_libid is a shell function defined in ltmain.sh\n  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n  lt_cv_file_magic_cmd='func_win32_libid'\n  ;;\n\nmingw* | pw32*)\n  # Base MSYS/MinGW do not provide the 'file' command needed by\n  # func_win32_libid shell function, so use a weaker test based on 'objdump',\n  # unless we find 'file', for example because we are cross-compiling.\n  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.\n  if ( test \"$lt_cv_nm_interface\" = \"BSD nm\" && file / ) >/dev/null 2>&1; then\n    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n    lt_cv_file_magic_cmd='func_win32_libid'\n  else\n    # Keep this pattern in sync with the one in func_win32_libid.\n    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'\n    lt_cv_file_magic_cmd='$OBJDUMP -f'\n  fi\n  ;;\n\ncegcc*)\n  # use the weaker test based on 'objdump'. See mingw*.\n  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'\n  lt_cv_file_magic_cmd='$OBJDUMP -f'\n  ;;\n\ndarwin* | rhapsody*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nfreebsd* | dragonfly*)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    case $host_cpu in\n    i*86 )\n      # Not sure whether the presence of OpenBSD here was a mistake.\n      # Let's accept both of them until this is cleared up.\n      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'\n      lt_cv_file_magic_cmd=/usr/bin/file\n      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`\n      ;;\n    esac\n  else\n    lt_cv_deplibs_check_method=pass_all\n  fi\n  ;;\n\nhaiku*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nhpux10.20* | hpux11*)\n  lt_cv_file_magic_cmd=/usr/bin/file\n  case $host_cpu in\n  ia64*)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'\n    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so\n    ;;\n  hppa*64*)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\\.[0-9]'\n    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl\n    ;;\n  *)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\\.[0-9]) shared library'\n    lt_cv_file_magic_test_file=/usr/lib/libc.sl\n    ;;\n  esac\n  ;;\n\ninterix[3-9]*)\n  # PIC code is broken on Interix 3.x, that's why |\\.a not |_pic\\.a here\n  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so|\\.a)$'\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $LD in\n  *-32|*\"-32 \") libmagic=32-bit;;\n  *-n32|*\"-n32 \") libmagic=N32;;\n  *-64|*\"-64 \") libmagic=64-bit;;\n  *) libmagic=never-match;;\n  esac\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nnetbsd* | netbsdelf*-gnu)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so|_pic\\.a)$'\n  fi\n  ;;\n\nnewos6*)\n  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=/usr/lib/libnls.so\n  ;;\n\n*nto* | *qnx*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nopenbsd*)\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|\\.so|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|_pic\\.a)$'\n  fi\n  ;;\n\nosf3* | osf4* | osf5*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nrdos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsolaris*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv4 | sysv4.3*)\n  case $host_vendor in\n  motorola)\n    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'\n    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`\n    ;;\n  ncr)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  sequent)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'\n    ;;\n  sni)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method=\"file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib\"\n    lt_cv_file_magic_test_file=/lib/libc.so\n    ;;\n  siemens)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  pc)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  esac\n  ;;\n\ntpf*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\nesac\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method\" >&5\n$as_echo \"$lt_cv_deplibs_check_method\" >&6; }\n\nfile_magic_glob=\nwant_nocaseglob=no\nif test \"$build\" = \"$host\"; then\n  case $host_os in\n  mingw* | pw32*)\n    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then\n      want_nocaseglob=yes\n    else\n      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e \"s/\\(..\\)/s\\/[\\1]\\/[\\1]\\/g;/g\"`\n    fi\n    ;;\n  esac\nfi\n\nfile_magic_cmd=$lt_cv_file_magic_cmd\ndeplibs_check_method=$lt_cv_deplibs_check_method\ntest -z \"$deplibs_check_method\" && deplibs_check_method=unknown\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}dlltool\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}dlltool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_DLLTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DLLTOOL\"; then\n  ac_cv_prog_DLLTOOL=\"$DLLTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_DLLTOOL=\"${ac_tool_prefix}dlltool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDLLTOOL=$ac_cv_prog_DLLTOOL\nif test -n \"$DLLTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DLLTOOL\" >&5\n$as_echo \"$DLLTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_DLLTOOL\"; then\n  ac_ct_DLLTOOL=$DLLTOOL\n  # Extract the first word of \"dlltool\", so it can be a program name with args.\nset dummy dlltool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DLLTOOL\"; then\n  ac_cv_prog_ac_ct_DLLTOOL=\"$ac_ct_DLLTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_DLLTOOL=\"dlltool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL\nif test -n \"$ac_ct_DLLTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL\" >&5\n$as_echo \"$ac_ct_DLLTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_DLLTOOL\" = x; then\n    DLLTOOL=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DLLTOOL=$ac_ct_DLLTOOL\n  fi\nelse\n  DLLTOOL=\"$ac_cv_prog_DLLTOOL\"\nfi\n\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries\" >&5\n$as_echo_n \"checking how to associate runtime and link libraries... \" >&6; }\nif ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_sharedlib_from_linklib_cmd='unknown'\n\ncase $host_os in\ncygwin* | mingw* | pw32* | cegcc*)\n  # two different shell functions defined in ltmain.sh\n  # decide which to use based on capabilities of $DLLTOOL\n  case `$DLLTOOL --help 2>&1` in\n  *--identify-strict*)\n    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib\n    ;;\n  *)\n    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback\n    ;;\n  esac\n  ;;\n*)\n  # fallback: assume linklib IS sharedlib\n  lt_cv_sharedlib_from_linklib_cmd=\"$ECHO\"\n  ;;\nesac\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd\" >&5\n$as_echo \"$lt_cv_sharedlib_from_linklib_cmd\" >&6; }\nsharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd\ntest -z \"$sharedlib_from_linklib_cmd\" && sharedlib_from_linklib_cmd=$ECHO\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  for ac_prog in ar\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_AR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AR\"; then\n  ac_cv_prog_AR=\"$AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_AR=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAR=$ac_cv_prog_AR\nif test -n \"$AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AR\" >&5\n$as_echo \"$AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$AR\" && break\n  done\nfi\nif test -z \"$AR\"; then\n  ac_ct_AR=$AR\n  for ac_prog in ar\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_AR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_AR\"; then\n  ac_cv_prog_ac_ct_AR=\"$ac_ct_AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_AR=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_AR=$ac_cv_prog_ac_ct_AR\nif test -n \"$ac_ct_AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR\" >&5\n$as_echo \"$ac_ct_AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_AR\" && break\ndone\n\n  if test \"x$ac_ct_AR\" = x; then\n    AR=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    AR=$ac_ct_AR\n  fi\nfi\n\n: ${AR=ar}\n: ${AR_FLAGS=cru}\n\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support\" >&5\n$as_echo_n \"checking for archiver @FILE support... \" >&6; }\nif ${lt_cv_ar_at_file+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ar_at_file=no\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  echo conftest.$ac_objext > conftest.lst\n      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'\n      { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$lt_ar_try\\\"\"; } >&5\n  (eval $lt_ar_try) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n      if test \"$ac_status\" -eq 0; then\n\t# Ensure the archiver fails upon bogus file names.\n\trm -f conftest.$ac_objext libconftest.a\n\t{ { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$lt_ar_try\\\"\"; } >&5\n  (eval $lt_ar_try) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n\tif test \"$ac_status\" -ne 0; then\n          lt_cv_ar_at_file=@\n        fi\n      fi\n      rm -f conftest.* libconftest.a\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file\" >&5\n$as_echo \"$lt_cv_ar_at_file\" >&6; }\n\nif test \"x$lt_cv_ar_at_file\" = xno; then\n  archiver_list_spec=\nelse\n  archiver_list_spec=$lt_cv_ar_at_file\nfi\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}strip\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$STRIP\"; then\n  ac_cv_prog_STRIP=\"$STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_STRIP=\"${ac_tool_prefix}strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nSTRIP=$ac_cv_prog_STRIP\nif test -n \"$STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $STRIP\" >&5\n$as_echo \"$STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_STRIP\"; then\n  ac_ct_STRIP=$STRIP\n  # Extract the first word of \"strip\", so it can be a program name with args.\nset dummy strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_STRIP\"; then\n  ac_cv_prog_ac_ct_STRIP=\"$ac_ct_STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_STRIP=\"strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP\nif test -n \"$ac_ct_STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP\" >&5\n$as_echo \"$ac_ct_STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_STRIP\" = x; then\n    STRIP=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    STRIP=$ac_ct_STRIP\n  fi\nelse\n  STRIP=\"$ac_cv_prog_STRIP\"\nfi\n\ntest -z \"$STRIP\" && STRIP=:\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}ranlib\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_RANLIB+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$RANLIB\"; then\n  ac_cv_prog_RANLIB=\"$RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_RANLIB=\"${ac_tool_prefix}ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nRANLIB=$ac_cv_prog_RANLIB\nif test -n \"$RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $RANLIB\" >&5\n$as_echo \"$RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_RANLIB\"; then\n  ac_ct_RANLIB=$RANLIB\n  # Extract the first word of \"ranlib\", so it can be a program name with args.\nset dummy ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_RANLIB+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_RANLIB\"; then\n  ac_cv_prog_ac_ct_RANLIB=\"$ac_ct_RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_RANLIB=\"ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB\nif test -n \"$ac_ct_RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB\" >&5\n$as_echo \"$ac_ct_RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_RANLIB\" = x; then\n    RANLIB=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    RANLIB=$ac_ct_RANLIB\n  fi\nelse\n  RANLIB=\"$ac_cv_prog_RANLIB\"\nfi\n\ntest -z \"$RANLIB\" && RANLIB=:\n\n\n\n\n\n\n# Determine commands to create old-style static archives.\nold_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'\nold_postinstall_cmds='chmod 644 $oldlib'\nold_postuninstall_cmds=\n\nif test -n \"$RANLIB\"; then\n  case $host_os in\n  openbsd*)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB -t \\$tool_oldlib\"\n    ;;\n  *)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB \\$tool_oldlib\"\n    ;;\n  esac\n  old_archive_cmds=\"$old_archive_cmds~\\$RANLIB \\$tool_oldlib\"\nfi\n\ncase $host_os in\n  darwin*)\n    lock_old_archive_extraction=yes ;;\n  *)\n    lock_old_archive_extraction=no ;;\nesac\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n\n\n# Check for command to grab the raw symbol name followed by C symbol from nm.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object\" >&5\n$as_echo_n \"checking command to parse $NM output from $compiler object... \" >&6; }\nif ${lt_cv_sys_global_symbol_pipe+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n# These are sane defaults that work on at least a few old systems.\n# [They come from Ultrix.  What could be older than Ultrix?!! ;)]\n\n# Character class describing NM global symbol codes.\nsymcode='[BCDEGRST]'\n\n# Regexp to match symbols that can be accessed directly from C.\nsympat='\\([_A-Za-z][_A-Za-z0-9]*\\)'\n\n# Define system-specific variables.\ncase $host_os in\naix*)\n  symcode='[BCDT]'\n  ;;\ncygwin* | mingw* | pw32* | cegcc*)\n  symcode='[ABCDGISTW]'\n  ;;\nhpux*)\n  if test \"$host_cpu\" = ia64; then\n    symcode='[ABCDEGRST]'\n  fi\n  ;;\nirix* | nonstopux*)\n  symcode='[BCDEGRST]'\n  ;;\nosf*)\n  symcode='[BCDEGQRST]'\n  ;;\nsolaris*)\n  symcode='[BDRT]'\n  ;;\nsco3.2v5*)\n  symcode='[DT]'\n  ;;\nsysv4.2uw2*)\n  symcode='[DT]'\n  ;;\nsysv5* | sco5v6* | unixware* | OpenUNIX*)\n  symcode='[ABDT]'\n  ;;\nsysv4)\n  symcode='[DFNSTU]'\n  ;;\nesac\n\n# If we're using GNU nm, then use its standard symbol codes.\ncase `$NM -V 2>&1` in\n*GNU* | *'with BFD'*)\n  symcode='[ABCDGIRSTW]' ;;\nesac\n\n# Transform an extracted symbol line into a proper C declaration.\n# Some systems (esp. on ia64) link data and code symbols differently,\n# so use this general approach.\nlt_cv_sys_global_symbol_to_cdecl=\"sed -n -e 's/^T .* \\(.*\\)$/extern int \\1();/p' -e 's/^$symcode* .* \\(.*\\)$/extern char \\1;/p'\"\n\n# Transform an extracted symbol line into symbol name and symbol address\nlt_cv_sys_global_symbol_to_c_name_address=\"sed -n -e 's/^: \\([^ ]*\\)[ ]*$/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([^ ]*\\) \\([^ ]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p'\"\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix=\"sed -n -e 's/^: \\([^ ]*\\)[ ]*$/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([^ ]*\\) \\(lib[^ ]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p' -e 's/^$symcode* \\([^ ]*\\) \\([^ ]*\\)$/  {\\\"lib\\2\\\", (void *) \\&\\2},/p'\"\n\n# Handle CRLF in mingw tool chain\nopt_cr=\ncase $build_os in\nmingw*)\n  opt_cr=`$ECHO 'x\\{0,1\\}' | tr x '\\015'` # option cr in regexp\n  ;;\nesac\n\n# Try without a prefix underscore, then with it.\nfor ac_symprfx in \"\" \"_\"; do\n\n  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.\n  symxfrm=\"\\\\1 $ac_symprfx\\\\2 \\\\2\"\n\n  # Write the raw and C identifiers.\n  if test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n    # Fake it for dumpbin and say T for any non-static function\n    # and D for any global variable.\n    # Also find C++ and __fastcall symbols from MSVC++,\n    # which start with @ or ?.\n    lt_cv_sys_global_symbol_pipe=\"$AWK '\"\\\n\"     {last_section=section; section=\\$ 3};\"\\\n\"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};\"\\\n\"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};\"\\\n\"     \\$ 0!~/External *\\|/{next};\"\\\n\"     / 0+ UNDEF /{next}; / UNDEF \\([^|]\\)*()/{next};\"\\\n\"     {if(hide[section]) next};\"\\\n\"     {f=0}; \\$ 0~/\\(\\).*\\|/{f=1}; {printf f ? \\\"T \\\" : \\\"D \\\"};\"\\\n\"     {split(\\$ 0, a, /\\||\\r/); split(a[2], s)};\"\\\n\"     s[1]~/^[@?]/{print s[1], s[1]; next};\"\\\n\"     s[1]~prfx {split(s[1],t,\\\"@\\\"); print t[1], substr(t[1],length(prfx))}\"\\\n\"     ' prfx=^$ac_symprfx\"\n  else\n    lt_cv_sys_global_symbol_pipe=\"sed -n -e 's/^.*[\t ]\\($symcode$symcode*\\)[\t ][\t ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'\"\n  fi\n  lt_cv_sys_global_symbol_pipe=\"$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'\"\n\n  # Check to see that the pipe works correctly.\n  pipe_works=no\n\n  rm -f conftest*\n  cat > conftest.$ac_ext <<_LT_EOF\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nchar nm_test_var;\nvoid nm_test_func(void);\nvoid nm_test_func(void){}\n#ifdef __cplusplus\n}\n#endif\nint main(){nm_test_var='a';nm_test_func();return(0);}\n_LT_EOF\n\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    # Now try to grab the symbols.\n    nlist=conftest.nm\n    if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$NM conftest.$ac_objext \\| \"$lt_cv_sys_global_symbol_pipe\" \\> $nlist\\\"\"; } >&5\n  (eval $NM conftest.$ac_objext \\| \"$lt_cv_sys_global_symbol_pipe\" \\> $nlist) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s \"$nlist\"; then\n      # Try sorting and uniquifying the output.\n      if sort \"$nlist\" | uniq > \"$nlist\"T; then\n\tmv -f \"$nlist\"T \"$nlist\"\n      else\n\trm -f \"$nlist\"T\n      fi\n\n      # Make sure that we snagged all the symbols we need.\n      if $GREP ' nm_test_var$' \"$nlist\" >/dev/null; then\n\tif $GREP ' nm_test_func$' \"$nlist\" >/dev/null; then\n\t  cat <<_LT_EOF > conftest.$ac_ext\n/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */\n#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)\n/* DATA imports from DLLs on WIN32 con't be const, because runtime\n   relocations are performed -- see ld's documentation on pseudo-relocs.  */\n# define LT_DLSYM_CONST\n#elif defined(__osf__)\n/* This system does not cope well with relocations in const data.  */\n# define LT_DLSYM_CONST\n#else\n# define LT_DLSYM_CONST const\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n_LT_EOF\n\t  # Now generate the symbol file.\n\t  eval \"$lt_cv_sys_global_symbol_to_cdecl\"' < \"$nlist\" | $GREP -v main >> conftest.$ac_ext'\n\n\t  cat <<_LT_EOF >> conftest.$ac_ext\n\n/* The mapping between symbol names and symbols.  */\nLT_DLSYM_CONST struct {\n  const char *name;\n  void       *address;\n}\nlt__PROGRAM__LTX_preloaded_symbols[] =\n{\n  { \"@PROGRAM@\", (void *) 0 },\n_LT_EOF\n\t  $SED \"s/^$symcode$symcode* \\(.*\\) \\(.*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/\" < \"$nlist\" | $GREP -v main >> conftest.$ac_ext\n\t  cat <<\\_LT_EOF >> conftest.$ac_ext\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt__PROGRAM__LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n_LT_EOF\n\t  # Now try linking the two files.\n\t  mv conftest.$ac_objext conftstm.$ac_objext\n\t  lt_globsym_save_LIBS=$LIBS\n\t  lt_globsym_save_CFLAGS=$CFLAGS\n\t  LIBS=\"conftstm.$ac_objext\"\n\t  CFLAGS=\"$CFLAGS$lt_prog_compiler_no_builtin_flag\"\n\t  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s conftest${ac_exeext}; then\n\t    pipe_works=yes\n\t  fi\n\t  LIBS=$lt_globsym_save_LIBS\n\t  CFLAGS=$lt_globsym_save_CFLAGS\n\telse\n\t  echo \"cannot find nm_test_func in $nlist\" >&5\n\tfi\n      else\n\techo \"cannot find nm_test_var in $nlist\" >&5\n      fi\n    else\n      echo \"cannot run $lt_cv_sys_global_symbol_pipe\" >&5\n    fi\n  else\n    echo \"$progname: failed program was:\" >&5\n    cat conftest.$ac_ext >&5\n  fi\n  rm -rf conftest* conftst*\n\n  # Do not use the global_symbol_pipe unless it works.\n  if test \"$pipe_works\" = yes; then\n    break\n  else\n    lt_cv_sys_global_symbol_pipe=\n  fi\ndone\n\nfi\n\nif test -z \"$lt_cv_sys_global_symbol_pipe\"; then\n  lt_cv_sys_global_symbol_to_cdecl=\nfi\nif test -z \"$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: failed\" >&5\n$as_echo \"failed\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ok\" >&5\n$as_echo \"ok\" >&6; }\nfi\n\n# Response file support.\nif test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n  nm_file_list_spec='@'\nelif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then\n  nm_file_list_spec='@'\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for sysroot\" >&5\n$as_echo_n \"checking for sysroot... \" >&6; }\n\n# Check whether --with-sysroot was given.\nif test \"${with_sysroot+set}\" = set; then :\n  withval=$with_sysroot;\nelse\n  with_sysroot=no\nfi\n\n\nlt_sysroot=\ncase ${with_sysroot} in #(\n yes)\n   if test \"$GCC\" = yes; then\n     lt_sysroot=`$CC --print-sysroot 2>/dev/null`\n   fi\n   ;; #(\n /*)\n   lt_sysroot=`echo \"$with_sysroot\" | sed -e \"$sed_quote_subst\"`\n   ;; #(\n no|'')\n   ;; #(\n *)\n   { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}\" >&5\n$as_echo \"${with_sysroot}\" >&6; }\n   as_fn_error $? \"The sysroot must be an absolute path.\" \"$LINENO\" 5\n   ;;\nesac\n\n { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}\" >&5\n$as_echo \"${lt_sysroot:-no}\" >&6; }\n\n\n\n\n\n# Check whether --enable-libtool-lock was given.\nif test \"${enable_libtool_lock+set}\" = set; then :\n  enableval=$enable_libtool_lock;\nfi\n\ntest \"x$enable_libtool_lock\" != xno && enable_libtool_lock=yes\n\n# Some flags need to be propagated to the compiler or linker for good\n# libtool support.\ncase $host in\nia64-*-hpux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.$ac_objext` in\n      *ELF-32*)\n\tHPUX_IA64_MODE=\"32\"\n\t;;\n      *ELF-64*)\n\tHPUX_IA64_MODE=\"64\"\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n*-*-irix6*)\n  # Find out which ABI we are using.\n  echo '#line '$LINENO' \"configure\"' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    if test \"$lt_cv_prog_gnu_ld\" = yes; then\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -melf32bsmip\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -melf32bmipn32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -melf64bmip\"\n\t;;\n      esac\n    else\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -32\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -n32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -64\"\n\t  ;;\n      esac\n    fi\n  fi\n  rm -rf conftest*\n  ;;\n\nx86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \\\ns390*-*linux*|s390*-*tpf*|sparc*-*linux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.o` in\n      *32-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_i386_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    case `/usr/bin/file conftest.o` in\n\t      *x86-64*)\n\t\tLD=\"${LD-ld} -m elf32_x86_64\"\n\t\t;;\n\t      *)\n\t\tLD=\"${LD-ld} -m elf_i386\"\n\t\t;;\n\t    esac\n\t    ;;\n\t  powerpc64le-*)\n\t    LD=\"${LD-ld} -m elf32lppclinux\"\n\t    ;;\n\t  powerpc64-*)\n\t    LD=\"${LD-ld} -m elf32ppclinux\"\n\t    ;;\n\t  s390x-*linux*)\n\t    LD=\"${LD-ld} -m elf_s390\"\n\t    ;;\n\t  sparc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32_sparc\"\n\t    ;;\n\tesac\n\t;;\n      *64-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_x86_64_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_x86_64\"\n\t    ;;\n\t  powerpcle-*)\n\t    LD=\"${LD-ld} -m elf64lppc\"\n\t    ;;\n\t  powerpc-*)\n\t    LD=\"${LD-ld} -m elf64ppc\"\n\t    ;;\n\t  s390*-*linux*|s390*-*tpf*)\n\t    LD=\"${LD-ld} -m elf64_s390\"\n\t    ;;\n\t  sparc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64_sparc\"\n\t    ;;\n\tesac\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n\n*-*-sco3.2v5*)\n  # On SCO OpenServer 5, we need -belf to get full-featured binaries.\n  SAVE_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -belf\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf\" >&5\n$as_echo_n \"checking whether the C compiler needs -belf... \" >&6; }\nif ${lt_cv_cc_needs_belf+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n     cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  lt_cv_cc_needs_belf=yes\nelse\n  lt_cv_cc_needs_belf=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n     ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf\" >&5\n$as_echo \"$lt_cv_cc_needs_belf\" >&6; }\n  if test x\"$lt_cv_cc_needs_belf\" != x\"yes\"; then\n    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf\n    CFLAGS=\"$SAVE_CFLAGS\"\n  fi\n  ;;\n*-*solaris*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.o` in\n    *64-bit*)\n      case $lt_cv_prog_gnu_ld in\n      yes*)\n        case $host in\n        i?86-*-solaris*)\n          LD=\"${LD-ld} -m elf_x86_64\"\n          ;;\n        sparc*-*-solaris*)\n          LD=\"${LD-ld} -m elf64_sparc\"\n          ;;\n        esac\n        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.\n        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then\n          LD=\"${LD-ld}_sol2\"\n        fi\n        ;;\n      *)\n\tif ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then\n\t  LD=\"${LD-ld} -64\"\n\tfi\n\t;;\n      esac\n      ;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\nesac\n\nneed_locks=\"$enable_libtool_lock\"\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}mt\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}mt; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_MANIFEST_TOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$MANIFEST_TOOL\"; then\n  ac_cv_prog_MANIFEST_TOOL=\"$MANIFEST_TOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_MANIFEST_TOOL=\"${ac_tool_prefix}mt\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nMANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL\nif test -n \"$MANIFEST_TOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL\" >&5\n$as_echo \"$MANIFEST_TOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_MANIFEST_TOOL\"; then\n  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL\n  # Extract the first word of \"mt\", so it can be a program name with args.\nset dummy mt; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_MANIFEST_TOOL\"; then\n  ac_cv_prog_ac_ct_MANIFEST_TOOL=\"$ac_ct_MANIFEST_TOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_MANIFEST_TOOL=\"mt\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL\nif test -n \"$ac_ct_MANIFEST_TOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL\" >&5\n$as_echo \"$ac_ct_MANIFEST_TOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_MANIFEST_TOOL\" = x; then\n    MANIFEST_TOOL=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL\n  fi\nelse\n  MANIFEST_TOOL=\"$ac_cv_prog_MANIFEST_TOOL\"\nfi\n\ntest -z \"$MANIFEST_TOOL\" && MANIFEST_TOOL=mt\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool\" >&5\n$as_echo_n \"checking if $MANIFEST_TOOL is a manifest tool... \" >&6; }\nif ${lt_cv_path_mainfest_tool+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_path_mainfest_tool=no\n  echo \"$as_me:$LINENO: $MANIFEST_TOOL '-?'\" >&5\n  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out\n  cat conftest.err >&5\n  if $GREP 'Manifest Tool' conftest.out > /dev/null; then\n    lt_cv_path_mainfest_tool=yes\n  fi\n  rm -f conftest*\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool\" >&5\n$as_echo \"$lt_cv_path_mainfest_tool\" >&6; }\nif test \"x$lt_cv_path_mainfest_tool\" != xyes; then\n  MANIFEST_TOOL=:\nfi\n\n\n\n\n\n\n  case $host_os in\n    rhapsody* | darwin*)\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}dsymutil\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}dsymutil; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_DSYMUTIL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DSYMUTIL\"; then\n  ac_cv_prog_DSYMUTIL=\"$DSYMUTIL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_DSYMUTIL=\"${ac_tool_prefix}dsymutil\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDSYMUTIL=$ac_cv_prog_DSYMUTIL\nif test -n \"$DSYMUTIL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL\" >&5\n$as_echo \"$DSYMUTIL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_DSYMUTIL\"; then\n  ac_ct_DSYMUTIL=$DSYMUTIL\n  # Extract the first word of \"dsymutil\", so it can be a program name with args.\nset dummy dsymutil; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DSYMUTIL\"; then\n  ac_cv_prog_ac_ct_DSYMUTIL=\"$ac_ct_DSYMUTIL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_DSYMUTIL=\"dsymutil\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL\nif test -n \"$ac_ct_DSYMUTIL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL\" >&5\n$as_echo \"$ac_ct_DSYMUTIL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_DSYMUTIL\" = x; then\n    DSYMUTIL=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DSYMUTIL=$ac_ct_DSYMUTIL\n  fi\nelse\n  DSYMUTIL=\"$ac_cv_prog_DSYMUTIL\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}nmedit\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}nmedit; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_NMEDIT+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$NMEDIT\"; then\n  ac_cv_prog_NMEDIT=\"$NMEDIT\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_NMEDIT=\"${ac_tool_prefix}nmedit\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nNMEDIT=$ac_cv_prog_NMEDIT\nif test -n \"$NMEDIT\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $NMEDIT\" >&5\n$as_echo \"$NMEDIT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_NMEDIT\"; then\n  ac_ct_NMEDIT=$NMEDIT\n  # Extract the first word of \"nmedit\", so it can be a program name with args.\nset dummy nmedit; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_NMEDIT\"; then\n  ac_cv_prog_ac_ct_NMEDIT=\"$ac_ct_NMEDIT\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_NMEDIT=\"nmedit\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT\nif test -n \"$ac_ct_NMEDIT\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT\" >&5\n$as_echo \"$ac_ct_NMEDIT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_NMEDIT\" = x; then\n    NMEDIT=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    NMEDIT=$ac_ct_NMEDIT\n  fi\nelse\n  NMEDIT=\"$ac_cv_prog_NMEDIT\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}lipo\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}lipo; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_LIPO+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$LIPO\"; then\n  ac_cv_prog_LIPO=\"$LIPO\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_LIPO=\"${ac_tool_prefix}lipo\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nLIPO=$ac_cv_prog_LIPO\nif test -n \"$LIPO\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LIPO\" >&5\n$as_echo \"$LIPO\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_LIPO\"; then\n  ac_ct_LIPO=$LIPO\n  # Extract the first word of \"lipo\", so it can be a program name with args.\nset dummy lipo; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_LIPO+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_LIPO\"; then\n  ac_cv_prog_ac_ct_LIPO=\"$ac_ct_LIPO\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_LIPO=\"lipo\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO\nif test -n \"$ac_ct_LIPO\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO\" >&5\n$as_echo \"$ac_ct_LIPO\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_LIPO\" = x; then\n    LIPO=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    LIPO=$ac_ct_LIPO\n  fi\nelse\n  LIPO=\"$ac_cv_prog_LIPO\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}otool\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}otool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_OTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OTOOL\"; then\n  ac_cv_prog_OTOOL=\"$OTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_OTOOL=\"${ac_tool_prefix}otool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOTOOL=$ac_cv_prog_OTOOL\nif test -n \"$OTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OTOOL\" >&5\n$as_echo \"$OTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OTOOL\"; then\n  ac_ct_OTOOL=$OTOOL\n  # Extract the first word of \"otool\", so it can be a program name with args.\nset dummy otool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_OTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OTOOL\"; then\n  ac_cv_prog_ac_ct_OTOOL=\"$ac_ct_OTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_OTOOL=\"otool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL\nif test -n \"$ac_ct_OTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL\" >&5\n$as_echo \"$ac_ct_OTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OTOOL\" = x; then\n    OTOOL=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OTOOL=$ac_ct_OTOOL\n  fi\nelse\n  OTOOL=\"$ac_cv_prog_OTOOL\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}otool64\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}otool64; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_OTOOL64+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OTOOL64\"; then\n  ac_cv_prog_OTOOL64=\"$OTOOL64\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_OTOOL64=\"${ac_tool_prefix}otool64\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOTOOL64=$ac_cv_prog_OTOOL64\nif test -n \"$OTOOL64\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OTOOL64\" >&5\n$as_echo \"$OTOOL64\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OTOOL64\"; then\n  ac_ct_OTOOL64=$OTOOL64\n  # Extract the first word of \"otool64\", so it can be a program name with args.\nset dummy otool64; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OTOOL64\"; then\n  ac_cv_prog_ac_ct_OTOOL64=\"$ac_ct_OTOOL64\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_OTOOL64=\"otool64\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64\nif test -n \"$ac_ct_OTOOL64\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64\" >&5\n$as_echo \"$ac_ct_OTOOL64\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OTOOL64\" = x; then\n    OTOOL64=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OTOOL64=$ac_ct_OTOOL64\n  fi\nelse\n  OTOOL64=\"$ac_cv_prog_OTOOL64\"\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag\" >&5\n$as_echo_n \"checking for -single_module linker flag... \" >&6; }\nif ${lt_cv_apple_cc_single_mod+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_apple_cc_single_mod=no\n      if test -z \"${LT_MULTI_MODULE}\"; then\n\t# By default we will add the -single_module flag. You can override\n\t# by either setting the environment variable LT_MULTI_MODULE\n\t# non-empty at configure time, or by adding -multi_module to the\n\t# link flags.\n\trm -rf libconftest.dylib*\n\techo \"int foo(void){return 1;}\" > conftest.c\n\techo \"$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n-dynamiclib -Wl,-single_module conftest.c\" >&5\n\t$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n\t  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err\n        _lt_result=$?\n\t# If there is a non-empty error log, and \"single_module\"\n\t# appears in it, assume the flag caused a linker warning\n        if test -s conftest.err && $GREP single_module conftest.err; then\n\t  cat conftest.err >&5\n\t# Otherwise, if the output was created with a 0 exit code from\n\t# the compiler, it worked.\n\telif test -f libconftest.dylib && test $_lt_result -eq 0; then\n\t  lt_cv_apple_cc_single_mod=yes\n\telse\n\t  cat conftest.err >&5\n\tfi\n\trm -rf libconftest.dylib*\n\trm -f conftest.*\n      fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod\" >&5\n$as_echo \"$lt_cv_apple_cc_single_mod\" >&6; }\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag\" >&5\n$as_echo_n \"checking for -exported_symbols_list linker flag... \" >&6; }\nif ${lt_cv_ld_exported_symbols_list+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ld_exported_symbols_list=no\n      save_LDFLAGS=$LDFLAGS\n      echo \"_main\" > conftest.sym\n      LDFLAGS=\"$LDFLAGS -Wl,-exported_symbols_list,conftest.sym\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  lt_cv_ld_exported_symbols_list=yes\nelse\n  lt_cv_ld_exported_symbols_list=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\tLDFLAGS=\"$save_LDFLAGS\"\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list\" >&5\n$as_echo \"$lt_cv_ld_exported_symbols_list\" >&6; }\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag\" >&5\n$as_echo_n \"checking for -force_load linker flag... \" >&6; }\nif ${lt_cv_ld_force_load+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ld_force_load=no\n      cat > conftest.c << _LT_EOF\nint forced_loaded() { return 2;}\n_LT_EOF\n      echo \"$LTCC $LTCFLAGS -c -o conftest.o conftest.c\" >&5\n      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5\n      echo \"$AR cru libconftest.a conftest.o\" >&5\n      $AR cru libconftest.a conftest.o 2>&5\n      echo \"$RANLIB libconftest.a\" >&5\n      $RANLIB libconftest.a 2>&5\n      cat > conftest.c << _LT_EOF\nint main() { return 0;}\n_LT_EOF\n      echo \"$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a\" >&5\n      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err\n      _lt_result=$?\n      if test -s conftest.err && $GREP force_load conftest.err; then\n\tcat conftest.err >&5\n      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then\n\tlt_cv_ld_force_load=yes\n      else\n\tcat conftest.err >&5\n      fi\n        rm -f conftest.err libconftest.a conftest conftest.c\n        rm -rf conftest.dSYM\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load\" >&5\n$as_echo \"$lt_cv_ld_force_load\" >&6; }\n    case $host_os in\n    rhapsody* | darwin1.[012])\n      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;\n    darwin1.*)\n      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n    darwin*) # darwin 5.x on\n      # if running on 10.5 or later, the deployment target defaults\n      # to the OS version, if on x86, and 10.4, the deployment\n      # target defaults to 10.4. Don't you love it?\n      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in\n\t10.0,*86*-darwin8*|10.0,*-darwin[91]*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n\t10.[012]*)\n\t  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n\t10.*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n      esac\n    ;;\n  esac\n    if test \"$lt_cv_apple_cc_single_mod\" = \"yes\"; then\n      _lt_dar_single_mod='$single_module'\n    fi\n    if test \"$lt_cv_ld_exported_symbols_list\" = \"yes\"; then\n      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'\n    else\n      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'\n    fi\n    if test \"$DSYMUTIL\" != \":\" && test \"$lt_cv_ld_force_load\" = \"no\"; then\n      _lt_dsymutil='~$DSYMUTIL $lib || :'\n    else\n      _lt_dsymutil=\n    fi\n    ;;\n  esac\n\nfor ac_header in dlfcn.h\ndo :\n  ac_fn_c_check_header_compile \"$LINENO\" \"dlfcn.h\" \"ac_cv_header_dlfcn_h\" \"$ac_includes_default\n\"\nif test \"x$ac_cv_header_dlfcn_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_DLFCN_H 1\n_ACEOF\n\nfi\n\ndone\n\n\n\n\n\n# Set options\nenable_dlopen=yes\n\n\n\n\n  enable_win32_dll=no\n\n\n\n\n\n# Check whether --with-pic was given.\nif test \"${with_pic+set}\" = set; then :\n  withval=$with_pic; lt_p=${PACKAGE-default}\n    case $withval in\n    yes|no) pic_mode=$withval ;;\n    *)\n      pic_mode=default\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for lt_pkg in $withval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$lt_pkg\" = \"X$lt_p\"; then\n\t  pic_mode=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  pic_mode=default\nfi\n\n\ntest -z \"$pic_mode\" && pic_mode=default\n\n\n\n\n\n\n\n  # Check whether --enable-fast-install was given.\nif test \"${enable_fast_install+set}\" = set; then :\n  enableval=$enable_fast_install; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_fast_install=yes ;;\n    no) enable_fast_install=no ;;\n    *)\n      enable_fast_install=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_fast_install=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  enable_fast_install=yes\nfi\n\n\n\n\n\n\n\n\n\n\n\n# This can be used to rebuild libtool when needed\nLIBTOOL_DEPS=\"$ltmain\"\n\n# Always use our own libtool.\nLIBTOOL='$(SHELL) $(top_builddir)/libtool'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ntest -z \"$LN_S\" && LN_S=\"ln -s\"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nif test -n \"${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for objdir\" >&5\n$as_echo_n \"checking for objdir... \" >&6; }\nif ${lt_cv_objdir+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  rm -f .libs 2>/dev/null\nmkdir .libs 2>/dev/null\nif test -d .libs; then\n  lt_cv_objdir=.libs\nelse\n  # MS-DOS does not allow filenames that begin with a dot.\n  lt_cv_objdir=_libs\nfi\nrmdir .libs 2>/dev/null\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir\" >&5\n$as_echo \"$lt_cv_objdir\" >&6; }\nobjdir=$lt_cv_objdir\n\n\n\n\n\ncat >>confdefs.h <<_ACEOF\n#define LT_OBJDIR \"$lt_cv_objdir/\"\n_ACEOF\n\n\n\n\ncase $host_os in\naix3*)\n  # AIX sometimes has problems with the GCC collect2 program.  For some\n  # reason, if we set the COLLECT_NAMES environment variable, the problems\n  # vanish in a puff of smoke.\n  if test \"X${COLLECT_NAMES+set}\" != Xset; then\n    COLLECT_NAMES=\n    export COLLECT_NAMES\n  fi\n  ;;\nesac\n\n# Global variables:\nofile=libtool\ncan_build_shared=yes\n\n# All known linkers require a `.a' archive for static linking (except MSVC,\n# which needs '.lib').\nlibext=a\n\nwith_gnu_ld=\"$lt_cv_prog_gnu_ld\"\n\nold_CC=\"$CC\"\nold_CFLAGS=\"$CFLAGS\"\n\n# Set sane defaults for various variables\ntest -z \"$CC\" && CC=cc\ntest -z \"$LTCC\" && LTCC=$CC\ntest -z \"$LTCFLAGS\" && LTCFLAGS=$CFLAGS\ntest -z \"$LD\" && LD=ld\ntest -z \"$ac_objext\" && ac_objext=o\n\nfor cc_temp in $compiler\"\"; do\n  case $cc_temp in\n    compile | *[\\\\/]compile | ccache | *[\\\\/]ccache ) ;;\n    distcc | *[\\\\/]distcc | purify | *[\\\\/]purify ) ;;\n    \\-*) ;;\n    *) break;;\n  esac\ndone\ncc_basename=`$ECHO \"$cc_temp\" | $SED \"s%.*/%%; s%^$host_alias-%%\"`\n\n\n# Only perform the check for file, if the check method requires it\ntest -z \"$MAGIC_CMD\" && MAGIC_CMD=file\ncase $deplibs_check_method in\nfile_magic*)\n  if test \"$file_magic_cmd\" = '$MAGIC_CMD'; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file\" >&5\n$as_echo_n \"checking for ${ac_tool_prefix}file... \" >&6; }\nif ${lt_cv_path_MAGIC_CMD+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $MAGIC_CMD in\n[\\\\/*] |  ?:[\\\\/]*)\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  ac_dummy=\"/usr/bin$PATH_SEPARATOR$PATH\"\n  for ac_dir in $ac_dummy; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/${ac_tool_prefix}file; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/${ac_tool_prefix}file\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\n  MAGIC_CMD=\"$lt_save_MAGIC_CMD\"\n  ;;\nesac\nfi\n\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD\" >&5\n$as_echo \"$MAGIC_CMD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n\n\n\nif test -z \"$lt_cv_path_MAGIC_CMD\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for file\" >&5\n$as_echo_n \"checking for file... \" >&6; }\nif ${lt_cv_path_MAGIC_CMD+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $MAGIC_CMD in\n[\\\\/*] |  ?:[\\\\/]*)\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  ac_dummy=\"/usr/bin$PATH_SEPARATOR$PATH\"\n  for ac_dir in $ac_dummy; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/file; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/file\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\n  MAGIC_CMD=\"$lt_save_MAGIC_CMD\"\n  ;;\nesac\nfi\n\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD\" >&5\n$as_echo \"$MAGIC_CMD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  else\n    MAGIC_CMD=:\n  fi\nfi\n\n  fi\n  ;;\nesac\n\n# Use C for the default configuration in the libtool script\n\nlt_save_CC=\"$CC\"\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n# Source file extension for C test sources.\nac_ext=c\n\n# Object file extension for compiled C test sources.\nobjext=o\nobjext=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"int some_variable = 0;\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='int main(){return(0);}'\n\n\n\n\n\n\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n\n# Save the default compiler, since it gets overwritten when the other\n# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.\ncompiler_DEFAULT=$CC\n\n# save warnings/boilerplate of simple test code\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_compile_test_code\" >conftest.$ac_ext\neval \"$ac_compile\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_compiler_boilerplate=`cat conftest.err`\n$RM conftest*\n\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_link_test_code\" >conftest.$ac_ext\neval \"$ac_link\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_linker_boilerplate=`cat conftest.err`\n$RM -r conftest*\n\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n\nlt_prog_compiler_no_builtin_flag=\n\nif test \"$GCC\" = yes; then\n  case $cc_basename in\n  nvcc*)\n    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;\n  *)\n    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;\n  esac\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions\" >&5\n$as_echo_n \"checking if $compiler supports -fno-rtti -fno-exceptions... \" >&6; }\nif ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_rtti_exceptions=no\n   ac_outfile=conftest.$ac_objext\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"-fno-rtti -fno-exceptions\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_rtti_exceptions=yes\n     fi\n   fi\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions\" >&5\n$as_echo \"$lt_cv_prog_compiler_rtti_exceptions\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_rtti_exceptions\" = xyes; then\n    lt_prog_compiler_no_builtin_flag=\"$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions\"\nelse\n    :\nfi\n\nfi\n\n\n\n\n\n\n  lt_prog_compiler_wl=\nlt_prog_compiler_pic=\nlt_prog_compiler_static=\n\n\n  if test \"$GCC\" = yes; then\n    lt_prog_compiler_wl='-Wl,'\n    lt_prog_compiler_static='-static'\n\n    case $host_os in\n      aix*)\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\tlt_prog_compiler_static='-Bstatic'\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            lt_prog_compiler_pic='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the `-m68020' flag to GCC prevents building anything better,\n            # like `-m68040'.\n            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      lt_prog_compiler_pic='-DDLL_EXPORT'\n      ;;\n\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      lt_prog_compiler_pic='-fno-common'\n      ;;\n\n    haiku*)\n      # PIC is the default for Haiku.\n      # The \"-static\" flag exists, but is broken.\n      lt_prog_compiler_static=\n      ;;\n\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t# +Z the default\n\t;;\n      *)\n\tlt_prog_compiler_pic='-fPIC'\n\t;;\n      esac\n      ;;\n\n    interix[3-9]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n\n    msdosdjgpp*)\n      # Just because we use GCC doesn't mean we suddenly get shared libraries\n      # on systems that don't support them.\n      lt_prog_compiler_can_build_shared=no\n      enable_shared=no\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      lt_prog_compiler_pic='-fPIC -shared'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\tlt_prog_compiler_pic=-Kconform_pic\n      fi\n      ;;\n\n    *)\n      lt_prog_compiler_pic='-fPIC'\n      ;;\n    esac\n\n    case $cc_basename in\n    nvcc*) # Cuda Compiler Driver 2.2\n      lt_prog_compiler_wl='-Xlinker '\n      if test -n \"$lt_prog_compiler_pic\"; then\n        lt_prog_compiler_pic=\"-Xcompiler $lt_prog_compiler_pic\"\n      fi\n      ;;\n    esac\n  else\n    # PORTME Check for flag to pass linker flags through the system compiler.\n    case $host_os in\n    aix*)\n      lt_prog_compiler_wl='-Wl,'\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\tlt_prog_compiler_static='-Bstatic'\n      else\n\tlt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'\n      fi\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      lt_prog_compiler_pic='-DDLL_EXPORT'\n      ;;\n\n    hpux9* | hpux10* | hpux11*)\n      lt_prog_compiler_wl='-Wl,'\n      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but\n      # not for PA HP-UX.\n      case $host_cpu in\n      hppa*64*|ia64*)\n\t# +Z the default\n\t;;\n      *)\n\tlt_prog_compiler_pic='+Z'\n\t;;\n      esac\n      # Is there a better lt_prog_compiler_static that works with the bundled CC?\n      lt_prog_compiler_static='${wl}-a ${wl}archive'\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      lt_prog_compiler_wl='-Wl,'\n      # PIC (with -KPIC) is the default.\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n      case $cc_basename in\n      # old Intel for x86_64 which still supported -KPIC.\n      ecc*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-KPIC'\n\tlt_prog_compiler_static='-static'\n        ;;\n      # icc used to be incompatible with GCC.\n      # ICC 10 doesn't accept -KPIC any more.\n      icc* | ifort*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-fPIC'\n\tlt_prog_compiler_static='-static'\n        ;;\n      # Lahey Fortran 8.1.\n      lf95*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='--shared'\n\tlt_prog_compiler_static='--static'\n\t;;\n      nagfor*)\n\t# NAG Fortran compiler\n\tlt_prog_compiler_wl='-Wl,-Wl,,'\n\tlt_prog_compiler_pic='-PIC'\n\tlt_prog_compiler_static='-Bstatic'\n\t;;\n      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)\n        # Portland Group compilers (*not* the Pentium gcc compiler,\n\t# which looks to be a dead project)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-fpic'\n\tlt_prog_compiler_static='-Bstatic'\n        ;;\n      ccc*)\n        lt_prog_compiler_wl='-Wl,'\n        # All Alpha code is PIC.\n        lt_prog_compiler_static='-non_shared'\n        ;;\n      xl* | bgxl* | bgf* | mpixl*)\n\t# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-qpic'\n\tlt_prog_compiler_static='-qstaticlink'\n\t;;\n      *)\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ Ceres\\ Fortran* | *Sun*Fortran*\\ [1-7].* | *Sun*Fortran*\\ 8.[0-3]*)\n\t  # Sun Fortran 8.3 passes all unrecognized flags to the linker\n\t  lt_prog_compiler_pic='-KPIC'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  lt_prog_compiler_wl=''\n\t  ;;\n\t*Sun\\ F* | *Sun*Fortran*)\n\t  lt_prog_compiler_pic='-KPIC'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  lt_prog_compiler_wl='-Qoption ld '\n\t  ;;\n\t*Sun\\ C*)\n\t  # Sun C 5.9\n\t  lt_prog_compiler_pic='-KPIC'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  lt_prog_compiler_wl='-Wl,'\n\t  ;;\n        *Intel*\\ [CF]*Compiler*)\n\t  lt_prog_compiler_wl='-Wl,'\n\t  lt_prog_compiler_pic='-fPIC'\n\t  lt_prog_compiler_static='-static'\n\t  ;;\n\t*Portland\\ Group*)\n\t  lt_prog_compiler_wl='-Wl,'\n\t  lt_prog_compiler_pic='-fpic'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  ;;\n\tesac\n\t;;\n      esac\n      ;;\n\n    newsos6)\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      lt_prog_compiler_pic='-fPIC -shared'\n      ;;\n\n    osf3* | osf4* | osf5*)\n      lt_prog_compiler_wl='-Wl,'\n      # All OSF/1 code is PIC.\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    rdos*)\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    solaris*)\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      case $cc_basename in\n      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)\n\tlt_prog_compiler_wl='-Qoption ld ';;\n      *)\n\tlt_prog_compiler_wl='-Wl,';;\n      esac\n      ;;\n\n    sunos4*)\n      lt_prog_compiler_wl='-Qoption ld '\n      lt_prog_compiler_pic='-PIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    sysv4 | sysv4.2uw2* | sysv4.3*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec ;then\n\tlt_prog_compiler_pic='-Kconform_pic'\n\tlt_prog_compiler_static='-Bstatic'\n      fi\n      ;;\n\n    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    unicos*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_can_build_shared=no\n      ;;\n\n    uts4*)\n      lt_prog_compiler_pic='-pic'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    *)\n      lt_prog_compiler_can_build_shared=no\n      ;;\n    esac\n  fi\n\ncase $host_os in\n  # For platforms which do not support PIC, -DPIC is meaningless:\n  *djgpp*)\n    lt_prog_compiler_pic=\n    ;;\n  *)\n    lt_prog_compiler_pic=\"$lt_prog_compiler_pic -DPIC\"\n    ;;\nesac\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC\" >&5\n$as_echo_n \"checking for $compiler option to produce PIC... \" >&6; }\nif ${lt_cv_prog_compiler_pic+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic\" >&5\n$as_echo \"$lt_cv_prog_compiler_pic\" >&6; }\nlt_prog_compiler_pic=$lt_cv_prog_compiler_pic\n\n#\n# Check to make sure the PIC flag actually works.\n#\nif test -n \"$lt_prog_compiler_pic\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works\" >&5\n$as_echo_n \"checking if $compiler PIC flag $lt_prog_compiler_pic works... \" >&6; }\nif ${lt_cv_prog_compiler_pic_works+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_pic_works=no\n   ac_outfile=conftest.$ac_objext\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"$lt_prog_compiler_pic -DPIC\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_pic_works=yes\n     fi\n   fi\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works\" >&5\n$as_echo \"$lt_cv_prog_compiler_pic_works\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_pic_works\" = xyes; then\n    case $lt_prog_compiler_pic in\n     \"\" | \" \"*) ;;\n     *) lt_prog_compiler_pic=\" $lt_prog_compiler_pic\" ;;\n     esac\nelse\n    lt_prog_compiler_pic=\n     lt_prog_compiler_can_build_shared=no\nfi\n\nfi\n\n\n\n\n\n\n\n\n\n\n\n#\n# Check to make sure the static flag actually works.\n#\nwl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\\\"$lt_prog_compiler_static\\\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works\" >&5\n$as_echo_n \"checking if $compiler static flag $lt_tmp_static_flag works... \" >&6; }\nif ${lt_cv_prog_compiler_static_works+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_static_works=no\n   save_LDFLAGS=\"$LDFLAGS\"\n   LDFLAGS=\"$LDFLAGS $lt_tmp_static_flag\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&5\n       $ECHO \"$_lt_linker_boilerplate\" | $SED '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         lt_cv_prog_compiler_static_works=yes\n       fi\n     else\n       lt_cv_prog_compiler_static_works=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=\"$save_LDFLAGS\"\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works\" >&5\n$as_echo \"$lt_cv_prog_compiler_static_works\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_static_works\" = xyes; then\n    :\nelse\n    lt_prog_compiler_static=\nfi\n\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif ${lt_cv_prog_compiler_c_o+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o\" >&6; }\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif ${lt_cv_prog_compiler_c_o+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o\" >&6; }\n\n\n\n\nhard_links=\"nottested\"\nif test \"$lt_cv_prog_compiler_c_o\" = no && test \"$need_locks\" != no; then\n  # do not overwrite the value of need_locks provided by the user\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links\" >&5\n$as_echo_n \"checking if we can lock with hard links... \" >&6; }\n  hard_links=yes\n  $RM conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hard_links\" >&5\n$as_echo \"$hard_links\" >&6; }\n  if test \"$hard_links\" = no; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: \\`$CC' does not support \\`-c -o', so \\`make -j' may be unsafe\" >&5\n$as_echo \"$as_me: WARNING: \\`$CC' does not support \\`-c -o', so \\`make -j' may be unsafe\" >&2;}\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries\" >&5\n$as_echo_n \"checking whether the $compiler linker ($LD) supports shared libraries... \" >&6; }\n\n  runpath_var=\n  allow_undefined_flag=\n  always_export_symbols=no\n  archive_cmds=\n  archive_expsym_cmds=\n  compiler_needs_object=no\n  enable_shared_with_static_runtimes=no\n  export_dynamic_flag_spec=\n  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  hardcode_automatic=no\n  hardcode_direct=no\n  hardcode_direct_absolute=no\n  hardcode_libdir_flag_spec=\n  hardcode_libdir_separator=\n  hardcode_minus_L=no\n  hardcode_shlibpath_var=unsupported\n  inherit_rpath=no\n  link_all_deplibs=unknown\n  module_cmds=\n  module_expsym_cmds=\n  old_archive_from_new_cmds=\n  old_archive_from_expsyms_cmds=\n  thread_safe_flag_spec=\n  whole_archive_flag_spec=\n  # include_expsyms should be a list of space-separated symbols to be *always*\n  # included in the symbol list\n  include_expsyms=\n  # exclude_expsyms can be an extended regexp of symbols to exclude\n  # it will be wrapped by ` (' and `)$', so one must not match beginning or\n  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',\n  # as well as any symbol that contains `d'.\n  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'\n  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out\n  # platforms (ab)use it in PIC code, but their linkers get confused if\n  # the symbol is explicitly referenced.  Since portable code cannot\n  # rely on this symbol name, it's probably fine to never include it in\n  # preloaded symbol tables.\n  # Exclude shared library initialization/finalization symbols.\n  extract_expsyms_cmds=\n\n  case $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    # FIXME: the MSVC++ port hasn't been tested in a loooong time\n    # When not using gcc, we currently assume that we are using\n    # Microsoft Visual C++.\n    if test \"$GCC\" != yes; then\n      with_gnu_ld=no\n    fi\n    ;;\n  interix*)\n    # we just hope/assume this is gcc and not c89 (= MSVC++)\n    with_gnu_ld=yes\n    ;;\n  openbsd*)\n    with_gnu_ld=no\n    ;;\n  linux* | k*bsd*-gnu | gnu*)\n    link_all_deplibs=no\n    ;;\n  esac\n\n  ld_shlibs=yes\n\n  # On some targets, GNU ld is compatible enough with the native linker\n  # that we're better off using the native interface for both.\n  lt_use_gnu_ld_interface=no\n  if test \"$with_gnu_ld\" = yes; then\n    case $host_os in\n      aix*)\n\t# The AIX port of GNU ld has always aspired to compatibility\n\t# with the native linker.  However, as the warning in the GNU ld\n\t# block says, versions before 2.19.5* couldn't really create working\n\t# shared libraries, regardless of the interface used.\n\tcase `$LD -v 2>&1` in\n\t  *\\ \\(GNU\\ Binutils\\)\\ 2.19.5*) ;;\n\t  *\\ \\(GNU\\ Binutils\\)\\ 2.[2-9]*) ;;\n\t  *\\ \\(GNU\\ Binutils\\)\\ [3-9]*) ;;\n\t  *)\n\t    lt_use_gnu_ld_interface=yes\n\t    ;;\n\tesac\n\t;;\n      *)\n\tlt_use_gnu_ld_interface=yes\n\t;;\n    esac\n  fi\n\n  if test \"$lt_use_gnu_ld_interface\" = yes; then\n    # If archive_cmds runs LD, not CC, wlarc should be empty\n    wlarc='${wl}'\n\n    # Set some defaults for GNU ld with shared library support. These\n    # are reset later if shared libraries are not supported. Putting them\n    # here allows them to be overridden if necessary.\n    runpath_var=LD_RUN_PATH\n    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n    export_dynamic_flag_spec='${wl}--export-dynamic'\n    # ancient GNU ld didn't support --whole-archive et. al.\n    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then\n      whole_archive_flag_spec=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n    else\n      whole_archive_flag_spec=\n    fi\n    supports_anon_versioning=no\n    case `$LD -v 2>&1` in\n      *GNU\\ gold*) supports_anon_versioning=yes ;;\n      *\\ [01].* | *\\ 2.[0-9].* | *\\ 2.10.*) ;; # catch versions < 2.11\n      *\\ 2.11.93.0.2\\ *) supports_anon_versioning=yes ;; # RH7.3 ...\n      *\\ 2.11.92.0.12\\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...\n      *\\ 2.11.*) ;; # other 2.11 versions\n      *) supports_anon_versioning=yes ;;\n    esac\n\n    # See if GNU ld supports shared libraries.\n    case $host_os in\n    aix[3-9]*)\n      # On AIX/PPC, the GNU linker is very broken\n      if test \"$host_cpu\" != ia64; then\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: the GNU linker, at least up to release 2.19, is reported\n*** to be unable to reliably create shared libraries on AIX.\n*** Therefore, libtool is disabling shared libraries support.  If you\n*** really care for shared libraries, you may want to install binutils\n*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.\n*** You will then need to restart the configuration process.\n\n_LT_EOF\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            archive_expsym_cmds=''\n        ;;\n      m68k)\n            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            hardcode_libdir_flag_spec='-L$libdir'\n            hardcode_minus_L=yes\n        ;;\n      esac\n      ;;\n\n    beos*)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tallow_undefined_flag=unsupported\n\t# Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t# support --undefined.  This deserves some investigation.  FIXME\n\tarchive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,\n      # as there is no search path for DLLs.\n      hardcode_libdir_flag_spec='-L$libdir'\n      export_dynamic_flag_spec='${wl}--export-all-symbols'\n      allow_undefined_flag=unsupported\n      always_export_symbols=no\n      enable_shared_with_static_runtimes=yes\n      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[BCDGRS][ ]/s/.*[ ]\\([^ ]*\\)/\\1 DATA/;s/^.*[ ]__nm__\\([^ ]*\\)[ ][^ ]*/\\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\\'' | sort | uniq > $export_symbols'\n      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'\n\n      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t# If the export-symbols file already is a .def file (1st line\n\t# is EXPORTS), use it as is; otherwise, prepend...\n\tarchive_expsym_cmds='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t  cp $export_symbols $output_objdir/$soname.def;\n\telse\n\t  echo EXPORTS > $output_objdir/$soname.def;\n\t  cat $export_symbols >> $output_objdir/$soname.def;\n\tfi~\n\t$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    haiku*)\n      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      link_all_deplibs=yes\n      ;;\n\n    interix[3-9]*)\n      hardcode_direct=no\n      hardcode_shlibpath_var=no\n      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n      export_dynamic_flag_spec='${wl}-E'\n      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n      # Instead, shared libraries are loaded at an image base (0x10000000 by\n      # default) and relocated if they conflict, which is a slow very memory\n      # consuming and fragmenting process.  To avoid this, we pick a random,\n      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      archive_expsym_cmds='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      ;;\n\n    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)\n      tmp_diet=no\n      if test \"$host_os\" = linux-dietlibc; then\n\tcase $cc_basename in\n\t  diet\\ *) tmp_diet=yes;;\t# linux-dietlibc with static linking (!diet-dyn)\n\tesac\n      fi\n      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \\\n\t && test \"$tmp_diet\" = no\n      then\n\ttmp_addflag=' $pic_flag'\n\ttmp_sharedflag='-shared'\n\tcase $cc_basename,$host_cpu in\n        pgcc*)\t\t\t\t# Portland Group C compiler\n\t  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag'\n\t  ;;\n\tpgf77* | pgf90* | pgf95* | pgfortran*)\n\t\t\t\t\t# Portland Group f77 and f90 compilers\n\t  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag -Mnomain' ;;\n\tecc*,ia64* | icc*,ia64*)\t# Intel C compiler on ia64\n\t  tmp_addflag=' -i_dynamic' ;;\n\tefc*,ia64* | ifort*,ia64*)\t# Intel Fortran compiler on ia64\n\t  tmp_addflag=' -i_dynamic -nofor_main' ;;\n\tifc* | ifort*)\t\t\t# Intel Fortran compiler\n\t  tmp_addflag=' -nofor_main' ;;\n\tlf95*)\t\t\t\t# Lahey Fortran 8.1\n\t  whole_archive_flag_spec=\n\t  tmp_sharedflag='--shared' ;;\n\txl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)\n\t  tmp_sharedflag='-qmkshrobj'\n\t  tmp_addflag= ;;\n\tnvcc*)\t# Cuda Compiler Driver 2.2\n\t  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  compiler_needs_object=yes\n\t  ;;\n\tesac\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ C*)\t\t\t# Sun C 5.9\n\t  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  compiler_needs_object=yes\n\t  tmp_sharedflag='-G' ;;\n\t*Sun\\ F*)\t\t\t# Sun Fortran 8.3\n\t  tmp_sharedflag='-G' ;;\n\tesac\n\tarchive_cmds='$CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\n        if test \"x$supports_anon_versioning\" = xyes; then\n          archive_expsym_cmds='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t    cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t    echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t    $CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'\n        fi\n\n\tcase $cc_basename in\n\txlf* | bgf* | bgxlf* | mpixlf*)\n\t  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself\n\t  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'\n\t  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n\t  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'\n\t  if test \"x$supports_anon_versioning\" = xyes; then\n\t    archive_expsym_cmds='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t      cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t      echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'\n\t  fi\n\t  ;;\n\tesac\n      else\n        ld_shlibs=no\n      fi\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\tarchive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'\n\twlarc=\n      else\n\tarchive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      fi\n      ;;\n\n    solaris*)\n      if $LD -v 2>&1 | $GREP 'BFD 2\\.8' > /dev/null; then\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: The releases 2.8.* of the GNU linker cannot reliably\n*** create shared libraries on Solaris systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.9.1 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tarchive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)\n      case `$LD -v 2>&1` in\n        *\\ [01].* | *\\ 2.[0-9].* | *\\ 2.1[0-5].*)\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not\n*** reliably create shared libraries on SCO systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n\t;;\n\t*)\n\t  # For security reasons, it is highly recommended that you always\n\t  # use absolute paths for naming shared libraries, and exclude the\n\t  # DT_RUNPATH tag from executables and libraries.  But doing so\n\t  # requires that you compile everything twice, which is a pain.\n\t  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n\t    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t  else\n\t    ld_shlibs=no\n\t  fi\n\t;;\n      esac\n      ;;\n\n    sunos4*)\n      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      wlarc=\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    *)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tarchive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n    esac\n\n    if test \"$ld_shlibs\" = no; then\n      runpath_var=\n      hardcode_libdir_flag_spec=\n      export_dynamic_flag_spec=\n      whole_archive_flag_spec=\n    fi\n  else\n    # PORTME fill in a description of your system's linker (not GNU ld)\n    case $host_os in\n    aix3*)\n      allow_undefined_flag=unsupported\n      always_export_symbols=yes\n      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'\n      # Note: this linker hardcodes the directories in LIBPATH if there\n      # are no directories specified by -L.\n      hardcode_minus_L=yes\n      if test \"$GCC\" = yes && test -z \"$lt_prog_compiler_static\"; then\n\t# Neither direct hardcoding nor static linking is supported with a\n\t# broken collect2.\n\thardcode_direct=unsupported\n      fi\n      ;;\n\n    aix[4-9]*)\n      if test \"$host_cpu\" = ia64; then\n\t# On IA64, the linker does run time linking by default, so we don't\n\t# have to do anything special.\n\taix_use_runtimelinking=no\n\texp_sym_flag='-Bexport'\n\tno_entry_flag=\"\"\n      else\n\t# If we're using GNU nm, then we don't want the \"-C\" option.\n\t# -C means demangle to AIX nm, but means don't demangle with GNU nm\n\t# Also, AIX nm treats weak defined symbols like other global\n\t# defined symbols, whereas GNU nm marks them as \"W\".\n\tif $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n\t  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"W\")) && (substr(\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\telse\n\t  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && (substr(\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\tfi\n\taix_use_runtimelinking=no\n\n\t# Test if we are trying to use run time linking or normal\n\t# AIX style linking. If -brtl is somewhere in LDFLAGS, we\n\t# need to do runtime linking.\n\tcase $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)\n\t  for ld_flag in $LDFLAGS; do\n\t  if (test $ld_flag = \"-brtl\" || test $ld_flag = \"-Wl,-brtl\"); then\n\t    aix_use_runtimelinking=yes\n\t    break\n\t  fi\n\t  done\n\t  ;;\n\tesac\n\n\texp_sym_flag='-bexport'\n\tno_entry_flag='-bnoentry'\n      fi\n\n      # When large executables or shared objects are built, AIX ld can\n      # have problems creating the table of contents.  If linking a library\n      # or program results in \"error TOC overflow\" add -mminimal-toc to\n      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n      archive_cmds=''\n      hardcode_direct=yes\n      hardcode_direct_absolute=yes\n      hardcode_libdir_separator=':'\n      link_all_deplibs=yes\n      file_list_spec='${wl}-f,'\n\n      if test \"$GCC\" = yes; then\n\tcase $host_os in aix4.[012]|aix4.[012].*)\n\t# We only want to do this on AIX 4.2 and lower, the check\n\t# below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`${CC} -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t   strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t  # We have reworked collect2\n\t  :\n\t  else\n\t  # We have old collect2\n\t  hardcode_direct=unsupported\n\t  # It fails to find uninstalled libraries when the uninstalled\n\t  # path is not listed in the libpath.  Setting hardcode_minus_L\n\t  # to unsupported forces relinking\n\t  hardcode_minus_L=yes\n\t  hardcode_libdir_flag_spec='-L$libdir'\n\t  hardcode_libdir_separator=\n\t  fi\n\t  ;;\n\tesac\n\tshared_flag='-shared'\n\tif test \"$aix_use_runtimelinking\" = yes; then\n\t  shared_flag=\"$shared_flag \"'${wl}-G'\n\tfi\n\tlink_all_deplibs=no\n      else\n\t# not using gcc\n\tif test \"$host_cpu\" = ia64; then\n\t# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t# chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n\telse\n\t  if test \"$aix_use_runtimelinking\" = yes; then\n\t    shared_flag='${wl}-G'\n\t  else\n\t    shared_flag='${wl}-bM:SRE'\n\t  fi\n\tfi\n      fi\n\n      export_dynamic_flag_spec='${wl}-bexpall'\n      # It seems that -bexpall does not export symbols beginning with\n      # underscore (_), so it is better to generate a list of symbols to export.\n      always_export_symbols=yes\n      if test \"$aix_use_runtimelinking\" = yes; then\n\t# Warning - without using the other runtime loading flags (-brtl),\n\t# -berok will link without error, but may produce a broken library.\n\tallow_undefined_flag='-berok'\n        # Determine the default libpath from the value encoded in an\n        # empty executable.\n        if test \"${lt_cv_aix_libpath+set}\" = set; then\n  aix_libpath=$lt_cv_aix_libpath\nelse\n  if ${lt_cv_aix_libpath_+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n\n  lt_aix_libpath_sed='\n      /Import File Strings/,/^$/ {\n\t  /^0/ {\n\t      s/^0  *\\([^ ]*\\) *$/\\1/\n\t      p\n\t  }\n      }'\n  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  # Check for a 64-bit object if we didn't find anything.\n  if test -z \"$lt_cv_aix_libpath_\"; then\n    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  fi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  if test -z \"$lt_cv_aix_libpath_\"; then\n    lt_cv_aix_libpath_=\"/usr/lib:/lib\"\n  fi\n\nfi\n\n  aix_libpath=$lt_cv_aix_libpath_\nfi\n\n        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then func_echo_all \"${wl}${allow_undefined_flag}\"; else :; fi` '\"\\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n      else\n\tif test \"$host_cpu\" = ia64; then\n\t  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'\n\t  allow_undefined_flag=\"-z nodefs\"\n\t  archive_expsym_cmds=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$exp_sym_flag:\\$export_symbols\"\n\telse\n\t # Determine the default libpath from the value encoded in an\n\t # empty executable.\n\t if test \"${lt_cv_aix_libpath+set}\" = set; then\n  aix_libpath=$lt_cv_aix_libpath\nelse\n  if ${lt_cv_aix_libpath_+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n\n  lt_aix_libpath_sed='\n      /Import File Strings/,/^$/ {\n\t  /^0/ {\n\t      s/^0  *\\([^ ]*\\) *$/\\1/\n\t      p\n\t  }\n      }'\n  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  # Check for a 64-bit object if we didn't find anything.\n  if test -z \"$lt_cv_aix_libpath_\"; then\n    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  fi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  if test -z \"$lt_cv_aix_libpath_\"; then\n    lt_cv_aix_libpath_=\"/usr/lib:/lib\"\n  fi\n\nfi\n\n  aix_libpath=$lt_cv_aix_libpath_\nfi\n\n\t hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\t  # Warning - without using the other run time loading flags,\n\t  # -berok will link without error, but may produce a broken library.\n\t  no_undefined_flag=' ${wl}-bernotok'\n\t  allow_undefined_flag=' ${wl}-berok'\n\t  if test \"$with_gnu_ld\" = yes; then\n\t    # We only use this code for GNU lds that support --whole-archive.\n\t    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'\n\t  else\n\t    # Exported symbols can be pulled into shared objects from archives\n\t    whole_archive_flag_spec='$convenience'\n\t  fi\n\t  archive_cmds_need_lc=yes\n\t  # This is similar to how AIX traditionally builds its shared libraries.\n\t  archive_expsym_cmds=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'\n\tfi\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            archive_expsym_cmds=''\n        ;;\n      m68k)\n            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            hardcode_libdir_flag_spec='-L$libdir'\n            hardcode_minus_L=yes\n        ;;\n      esac\n      ;;\n\n    bsdi[45]*)\n      export_dynamic_flag_spec=-rdynamic\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # When not using gcc, we currently assume that we are using\n      # Microsoft Visual C++.\n      # hardcode_libdir_flag_spec is actually meaningless, as there is\n      # no search path for DLLs.\n      case $cc_basename in\n      cl*)\n\t# Native MSVC\n\thardcode_libdir_flag_spec=' '\n\tallow_undefined_flag=unsupported\n\talways_export_symbols=yes\n\tfile_list_spec='@'\n\t# Tell ltmain to make .lib files, not .a files.\n\tlibext=lib\n\t# Tell ltmain to make .dll files, not .so files.\n\tshrext_cmds=\".dll\"\n\t# FIXME: Setting linknames here is a bad hack.\n\tarchive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='\n\tarchive_expsym_cmds='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t    sed -n -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' -e '1\\\\\\!p' < $export_symbols > $output_objdir/$soname.exp;\n\t  else\n\t    sed -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;\n\t  fi~\n\t  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs \"@$tool_output_objdir$soname.exp\" -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~\n\t  linknames='\n\t# The linker will not automatically build a static lib if we build a DLL.\n\t# _LT_TAGVAR(old_archive_from_new_cmds, )='true'\n\tenable_shared_with_static_runtimes=yes\n\texclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'\n\texport_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[BCDGRS][ ]/s/.*[ ]\\([^ ]*\\)/\\1,DATA/'\\'' | $SED -e '\\''/^[AITW][ ]/s/.*[ ]//'\\'' | sort | uniq > $export_symbols'\n\t# Don't use ranlib\n\told_postinstall_cmds='chmod 644 $oldlib'\n\tpostlink_cmds='lt_outputfile=\"@OUTPUT@\"~\n\t  lt_tool_outputfile=\"@TOOL_OUTPUT@\"~\n\t  case $lt_outputfile in\n\t    *.exe|*.EXE) ;;\n\t    *)\n\t      lt_outputfile=\"$lt_outputfile.exe\"\n\t      lt_tool_outputfile=\"$lt_tool_outputfile.exe\"\n\t      ;;\n\t  esac~\n\t  if test \"$MANIFEST_TOOL\" != \":\" && test -f \"$lt_outputfile.manifest\"; then\n\t    $MANIFEST_TOOL -manifest \"$lt_tool_outputfile.manifest\" -outputresource:\"$lt_tool_outputfile\" || exit 1;\n\t    $RM \"$lt_outputfile.manifest\";\n\t  fi'\n\t;;\n      *)\n\t# Assume MSVC wrapper\n\thardcode_libdir_flag_spec=' '\n\tallow_undefined_flag=unsupported\n\t# Tell ltmain to make .lib files, not .a files.\n\tlibext=lib\n\t# Tell ltmain to make .dll files, not .so files.\n\tshrext_cmds=\".dll\"\n\t# FIXME: Setting linknames here is a bad hack.\n\tarchive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all \"$deplibs\" | $SED '\\''s/ -lc$//'\\''` -link -dll~linknames='\n\t# The linker will automatically build a .lib file if we build a DLL.\n\told_archive_from_new_cmds='true'\n\t# FIXME: Should let the user specify the lib program.\n\told_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'\n\tenable_shared_with_static_runtimes=yes\n\t;;\n      esac\n      ;;\n\n    darwin* | rhapsody*)\n\n\n  archive_cmds_need_lc=no\n  hardcode_direct=no\n  hardcode_automatic=yes\n  hardcode_shlibpath_var=unsupported\n  if test \"$lt_cv_ld_force_load\" = \"yes\"; then\n    whole_archive_flag_spec='`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience ${wl}-force_load,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"`'\n\n  else\n    whole_archive_flag_spec=''\n  fi\n  link_all_deplibs=yes\n  allow_undefined_flag=\"$_lt_dar_allow_undefined\"\n  case $cc_basename in\n     ifort*) _lt_dar_can_shared=yes ;;\n     *) _lt_dar_can_shared=$GCC ;;\n  esac\n  if test \"$_lt_dar_can_shared\" = \"yes\"; then\n    output_verbose_link_cmd=func_echo_all\n    archive_cmds=\"\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod${_lt_dsymutil}\"\n    module_cmds=\"\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dsymutil}\"\n    archive_expsym_cmds=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}\"\n    module_expsym_cmds=\"sed -e 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}\"\n\n  else\n  ld_shlibs=no\n  fi\n\n      ;;\n\n    dgux*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_shlibpath_var=no\n      ;;\n\n    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor\n    # support.  Future versions do this automatically, but an explicit c++rt0.o\n    # does not break anything, and helps significantly (at the cost of a little\n    # extra space).\n    freebsd2.2*)\n      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    # Unfortunately, older versions of FreeBSD 2 do not have this feature.\n    freebsd2.*)\n      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_direct=yes\n      hardcode_minus_L=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.\n    freebsd* | dragonfly*)\n      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    hpux9*)\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      else\n\tarchive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      fi\n      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n      hardcode_libdir_separator=:\n      hardcode_direct=yes\n\n      # hardcode_minus_L: Not really in the search PATH,\n      # but as the default location of the library.\n      hardcode_minus_L=yes\n      export_dynamic_flag_spec='${wl}-E'\n      ;;\n\n    hpux10*)\n      if test \"$GCC\" = yes && test \"$with_gnu_ld\" = no; then\n\tarchive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\thardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n\thardcode_libdir_separator=:\n\thardcode_direct=yes\n\thardcode_direct_absolute=yes\n\texport_dynamic_flag_spec='${wl}-E'\n\t# hardcode_minus_L: Not really in the search PATH,\n\t# but as the default location of the library.\n\thardcode_minus_L=yes\n      fi\n      ;;\n\n    hpux11*)\n      if test \"$GCC\" = yes && test \"$with_gnu_ld\" = no; then\n\tcase $host_cpu in\n\thppa*64*)\n\t  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tesac\n      else\n\tcase $host_cpu in\n\thppa*64*)\n\t  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\n\t  # Older versions of the 11.00 compiler do not understand -b yet\n\t  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $CC understands -b\" >&5\n$as_echo_n \"checking if $CC understands -b... \" >&6; }\nif ${lt_cv_prog_compiler__b+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler__b=no\n   save_LDFLAGS=\"$LDFLAGS\"\n   LDFLAGS=\"$LDFLAGS -b\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&5\n       $ECHO \"$_lt_linker_boilerplate\" | $SED '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         lt_cv_prog_compiler__b=yes\n       fi\n     else\n       lt_cv_prog_compiler__b=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=\"$save_LDFLAGS\"\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b\" >&5\n$as_echo \"$lt_cv_prog_compiler__b\" >&6; }\n\nif test x\"$lt_cv_prog_compiler__b\" = xyes; then\n    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\nelse\n    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'\nfi\n\n\t  ;;\n\tesac\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\thardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n\thardcode_libdir_separator=:\n\n\tcase $host_cpu in\n\thppa*64*|ia64*)\n\t  hardcode_direct=no\n\t  hardcode_shlibpath_var=no\n\t  ;;\n\t*)\n\t  hardcode_direct=yes\n\t  hardcode_direct_absolute=yes\n\t  export_dynamic_flag_spec='${wl}-E'\n\n\t  # hardcode_minus_L: Not really in the search PATH,\n\t  # but as the default location of the library.\n\t  hardcode_minus_L=yes\n\t  ;;\n\tesac\n      fi\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t# Try to use the -exported_symbol ld option, if it does not\n\t# work, assume that -exports_file does not work either and\n\t# implicitly export all symbols.\n\t# This should be the same for all languages, so no per-tag cache variable.\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol\" >&5\n$as_echo_n \"checking whether the $host_os linker accepts -exported_symbol... \" >&6; }\nif ${lt_cv_irix_exported_symbol+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  save_LDFLAGS=\"$LDFLAGS\"\n\t   LDFLAGS=\"$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null\"\n\t   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nint foo (void) { return 0; }\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  lt_cv_irix_exported_symbol=yes\nelse\n  lt_cv_irix_exported_symbol=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n           LDFLAGS=\"$save_LDFLAGS\"\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol\" >&5\n$as_echo \"$lt_cv_irix_exported_symbol\" >&6; }\n\tif test \"$lt_cv_irix_exported_symbol\" = yes; then\n          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'\n\tfi\n      else\n\tarchive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\tarchive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      inherit_rpath=yes\n      link_all_deplibs=yes\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\tarchive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out\n      else\n\tarchive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF\n      fi\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    newsos6)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_direct=yes\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      hardcode_shlibpath_var=no\n      ;;\n\n    *nto* | *qnx*)\n      ;;\n\n    openbsd*)\n      if test -f /usr/libexec/ld.so; then\n\thardcode_direct=yes\n\thardcode_shlibpath_var=no\n\thardcode_direct_absolute=yes\n\tif test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n\t  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'\n\t  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n\t  export_dynamic_flag_spec='${wl}-E'\n\telse\n\t  case $host_os in\n\t   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)\n\t     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n\t     hardcode_libdir_flag_spec='-R$libdir'\n\t     ;;\n\t   *)\n\t     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n\t     ;;\n\t  esac\n\tfi\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    os2*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_minus_L=yes\n      allow_undefined_flag=unsupported\n      archive_cmds='$ECHO \"LIBRARY $libname INITINSTANCE\" > $output_objdir/$libname.def~$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo \" SINGLE NONSHARED\" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'\n      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'\n      ;;\n\n    osf3*)\n      if test \"$GCC\" = yes; then\n\tallow_undefined_flag=' ${wl}-expect_unresolved ${wl}\\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n      else\n\tallow_undefined_flag=' -expect_unresolved \\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      ;;\n\n    osf4* | osf5*)\t# as osf3* with the addition of -msym flag\n      if test \"$GCC\" = yes; then\n\tallow_undefined_flag=' ${wl}-expect_unresolved ${wl}\\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\thardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      else\n\tallow_undefined_flag=' -expect_unresolved \\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\tarchive_expsym_cmds='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done; printf \"%s\\\\n\" \"-hidden\">> $lib.exp~\n\t$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n \"$verstring\" && $ECHO \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'\n\n\t# Both c and cxx compiler support -rpath directly\n\thardcode_libdir_flag_spec='-rpath $libdir'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_separator=:\n      ;;\n\n    solaris*)\n      no_undefined_flag=' -z defs'\n      if test \"$GCC\" = yes; then\n\twlarc='${wl}'\n\tarchive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n      else\n\tcase `$CC -V 2>&1` in\n\t*\"Compilers 5.0\"*)\n\t  wlarc=''\n\t  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  archive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'\n\t  ;;\n\t*)\n\t  wlarc='${wl}'\n\t  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n\t  ;;\n\tesac\n      fi\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_shlibpath_var=no\n      case $host_os in\n      solaris2.[0-5] | solaris2.[0-5].*) ;;\n      *)\n\t# The compiler driver will combine and reorder linker options,\n\t# but understands `-z linker_flag'.  GCC discards it without `$wl',\n\t# but is careful enough not to reorder.\n\t# Supported since Solaris 2.6 (maybe 2.5.1?)\n\tif test \"$GCC\" = yes; then\n\t  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'\n\telse\n\t  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'\n\tfi\n\t;;\n      esac\n      link_all_deplibs=yes\n      ;;\n\n    sunos4*)\n      if test \"x$host_vendor\" = xsequent; then\n\t# Use $CC to link under sequent, because it throws in some extra .o\n\t# files that make .init and .fini sections work.\n\tarchive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_direct=yes\n      hardcode_minus_L=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    sysv4)\n      case $host_vendor in\n\tsni)\n\t  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  hardcode_direct=yes # is this really true???\n\t;;\n\tsiemens)\n\t  ## LD is ld it makes a PLAMLIB\n\t  ## CC just makes a GrossModule.\n\t  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'\n\t  reload_cmds='$CC -r -o $output$reload_objs'\n\t  hardcode_direct=no\n        ;;\n\tmotorola)\n\t  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  hardcode_direct=no #Motorola manual says yes, but my tests say they lie\n\t;;\n      esac\n      runpath_var='LD_RUN_PATH'\n      hardcode_shlibpath_var=no\n      ;;\n\n    sysv4.3*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_shlibpath_var=no\n      export_dynamic_flag_spec='-Bexport'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\tarchive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\thardcode_shlibpath_var=no\n\trunpath_var=LD_RUN_PATH\n\thardcode_runpath_var=yes\n\tld_shlibs=yes\n      fi\n      ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)\n      no_undefined_flag='${wl}-z,text'\n      archive_cmds_need_lc=no\n      hardcode_shlibpath_var=no\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6*)\n      # Note: We can NOT use -z defs as we might desire, because we do not\n      # link with -lc, and that would cause any symbols used from libc to\n      # always be unresolved, which means just about no library would\n      # ever link correctly.  If we're not using GNU ld we use -z text\n      # though, which does catch some bad symbols but isn't as heavy-handed\n      # as -z defs.\n      no_undefined_flag='${wl}-z,text'\n      allow_undefined_flag='${wl}-z,nodefs'\n      archive_cmds_need_lc=no\n      hardcode_shlibpath_var=no\n      hardcode_libdir_flag_spec='${wl}-R,$libdir'\n      hardcode_libdir_separator=':'\n      link_all_deplibs=yes\n      export_dynamic_flag_spec='${wl}-Bexport'\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    uts4*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_shlibpath_var=no\n      ;;\n\n    *)\n      ld_shlibs=no\n      ;;\n    esac\n\n    if test x$host_vendor = xsni; then\n      case $host in\n      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n\texport_dynamic_flag_spec='${wl}-Blargedynsym'\n\t;;\n      esac\n    fi\n  fi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ld_shlibs\" >&5\n$as_echo \"$ld_shlibs\" >&6; }\ntest \"$ld_shlibs\" = no && can_build_shared=no\n\nwith_gnu_ld=$with_gnu_ld\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#\n# Do we need to explicitly link libc?\n#\ncase \"x$archive_cmds_need_lc\" in\nx|xyes)\n  # Assume -lc should be added\n  archive_cmds_need_lc=yes\n\n  if test \"$enable_shared\" = yes && test \"$GCC\" = yes; then\n    case $archive_cmds in\n    *'~'*)\n      # FIXME: we may have to deal with multi-command sequences.\n      ;;\n    '$CC '*)\n      # Test whether the compiler implicitly links with -lc since on some\n      # systems, -lgcc has to come before -lc. If gcc already passes -lc\n      # to ld, don't add -lc before -lgcc.\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in\" >&5\n$as_echo_n \"checking whether -lc should be explicitly linked in... \" >&6; }\nif ${lt_cv_archive_cmds_need_lc+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  $RM conftest*\n\techo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n\tif { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } 2>conftest.err; then\n\t  soname=conftest\n\t  lib=conftest\n\t  libobjs=conftest.$ac_objext\n\t  deplibs=\n\t  wl=$lt_prog_compiler_wl\n\t  pic_flag=$lt_prog_compiler_pic\n\t  compiler_flags=-v\n\t  linker_flags=-v\n\t  verstring=\n\t  output_objdir=.\n\t  libname=conftest\n\t  lt_save_allow_undefined_flag=$allow_undefined_flag\n\t  allow_undefined_flag=\n\t  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$archive_cmds 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1\\\"\"; } >&5\n  (eval $archive_cmds 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n\t  then\n\t    lt_cv_archive_cmds_need_lc=no\n\t  else\n\t    lt_cv_archive_cmds_need_lc=yes\n\t  fi\n\t  allow_undefined_flag=$lt_save_allow_undefined_flag\n\telse\n\t  cat conftest.err 1>&5\n\tfi\n\t$RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc\" >&5\n$as_echo \"$lt_cv_archive_cmds_need_lc\" >&6; }\n      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc\n      ;;\n    esac\n  fi\n  ;;\nesac\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics\" >&5\n$as_echo_n \"checking dynamic linker characteristics... \" >&6; }\n\nif test \"$GCC\" = yes; then\n  case $host_os in\n    darwin*) lt_awk_arg=\"/^libraries:/,/LR/\" ;;\n    *) lt_awk_arg=\"/^libraries:/\" ;;\n  esac\n  case $host_os in\n    mingw* | cegcc*) lt_sed_strip_eq=\"s,=\\([A-Za-z]:\\),\\1,g\" ;;\n    *) lt_sed_strip_eq=\"s,=/,/,g\" ;;\n  esac\n  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e \"s/^libraries://\" -e $lt_sed_strip_eq`\n  case $lt_search_path_spec in\n  *\\;*)\n    # if the path contains \";\" then we assume it to be the separator\n    # otherwise default to the standard path separator (i.e. \":\") - it is\n    # assumed that no part of a normal pathname contains \";\" but that should\n    # okay in the real world where \";\" in dirpaths is itself problematic.\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED 's/;/ /g'`\n    ;;\n  *)\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED \"s/$PATH_SEPARATOR/ /g\"`\n    ;;\n  esac\n  # Ok, now we have the path, separated by spaces, we can step through it\n  # and add multilib dir if necessary.\n  lt_tmp_lt_search_path_spec=\n  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`\n  for lt_sys_path in $lt_search_path_spec; do\n    if test -d \"$lt_sys_path/$lt_multi_os_dir\"; then\n      lt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir\"\n    else\n      test -d \"$lt_sys_path\" && \\\n\tlt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path\"\n    fi\n  done\n  lt_search_path_spec=`$ECHO \"$lt_tmp_lt_search_path_spec\" | awk '\nBEGIN {RS=\" \"; FS=\"/|\\n\";} {\n  lt_foo=\"\";\n  lt_count=0;\n  for (lt_i = NF; lt_i > 0; lt_i--) {\n    if ($lt_i != \"\" && $lt_i != \".\") {\n      if ($lt_i == \"..\") {\n        lt_count++;\n      } else {\n        if (lt_count == 0) {\n          lt_foo=\"/\" $lt_i lt_foo;\n        } else {\n          lt_count--;\n        }\n      }\n    }\n  }\n  if (lt_foo != \"\") { lt_freq[lt_foo]++; }\n  if (lt_freq[lt_foo] == 1) { print lt_foo; }\n}'`\n  # AWK program above erroneously prepends '/' to C:/dos/paths\n  # for these hosts.\n  case $host_os in\n    mingw* | cegcc*) lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" |\\\n      $SED 's,/\\([A-Za-z]:\\),\\1,g'` ;;\n  esac\n  sys_lib_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $lt_NL2SP`\nelse\n  sys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\nfi\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\nshrext_cmds=\".so\"\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nneed_lib_prefix=unknown\nhardcode_into_libs=no\n\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\nneed_version=unknown\n\ncase $host_os in\naix3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX 3 has no versioning support, so we append a major version to the name.\n  soname_spec='${libname}${release}${shared_ext}$major'\n  ;;\n\naix[4-9]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  hardcode_into_libs=yes\n  if test \"$host_cpu\" = ia64; then\n    # AIX 5 supports IA64\n    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'\n    shlibpath_var=LD_LIBRARY_PATH\n  else\n    # With GCC up to 2.95.x, collect2 would create an import file\n    # for dependence libraries.  The import file would start with\n    # the line `#! .'.  This would cause the generated library to\n    # depend on `.', always an invalid library.  This was fixed in\n    # development snapshots of GCC prior to 3.0.\n    case $host_os in\n      aix4 | aix4.[01] | aix4.[01].*)\n      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'\n\t   echo ' yes '\n\t   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then\n\t:\n      else\n\tcan_build_shared=no\n      fi\n      ;;\n    esac\n    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct\n    # soname into executable. Probably we can add versioning support to\n    # collect2, so additional links can be useful in future.\n    if test \"$aix_use_runtimelinking\" = yes; then\n      # If using run time linking (on AIX 4.2 or later) use lib<name>.so\n      # instead of lib<name>.a to let people know that these are not\n      # typical AIX shared libraries.\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    else\n      # We preserve .a as extension for shared libraries through AIX4.2\n      # and later when we are not doing run time linking.\n      library_names_spec='${libname}${release}.a $libname.a'\n      soname_spec='${libname}${release}${shared_ext}$major'\n    fi\n    shlibpath_var=LIBPATH\n  fi\n  ;;\n\namigaos*)\n  case $host_cpu in\n  powerpc)\n    # Since July 2007 AmigaOS4 officially supports .so libraries.\n    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    ;;\n  m68k)\n    library_names_spec='$libname.ixlibrary $libname.a'\n    # Create ${libname}_ixlibrary.a entries in /sys/libs.\n    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all \"$lib\" | $SED '\\''s%^.*/\\([^/]*\\)\\.ixlibrary$%\\1%'\\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show \"cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a\"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'\n    ;;\n  esac\n  ;;\n\nbeos*)\n  library_names_spec='${libname}${shared_ext}'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  ;;\n\nbsdi[45]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw* | pw32* | cegcc*)\n  version_type=windows\n  shrext_cmds=\".dll\"\n  need_version=no\n  need_lib_prefix=no\n\n  case $GCC,$cc_basename in\n  yes,*)\n    # gcc\n    library_names_spec='$libname.dll.a'\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname~\n      chmod a+x \\$dldir/$dlname~\n      if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n        eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n      fi'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n\n    case $host_os in\n    cygwin*)\n      # Cygwin DLLs use 'cyg' prefix rather than 'lib'\n      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n\n      sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/lib/w32api\"\n      ;;\n    mingw* | cegcc*)\n      # MinGW DLLs use traditional 'lib' prefix\n      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    pw32*)\n      # pw32 DLLs use 'pw' prefix rather than 'lib'\n      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    esac\n    dynamic_linker='Win32 ld.exe'\n    ;;\n\n  *,cl*)\n    # Native MSVC\n    libname_spec='$name'\n    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n    library_names_spec='${libname}.dll.lib'\n\n    case $build_os in\n    mingw*)\n      sys_lib_search_path_spec=\n      lt_save_ifs=$IFS\n      IFS=';'\n      for lt_path in $LIB\n      do\n        IFS=$lt_save_ifs\n        # Let DOS variable expansion print the short 8.3 style file name.\n        lt_path=`cd \"$lt_path\" 2>/dev/null && cmd //C \"for %i in (\".\") do @echo %~si\"`\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec $lt_path\"\n      done\n      IFS=$lt_save_ifs\n      # Convert to MSYS style.\n      sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | sed -e 's|\\\\\\\\|/|g' -e 's| \\\\([a-zA-Z]\\\\):| /\\\\1|g' -e 's|^ ||'`\n      ;;\n    cygwin*)\n      # Convert to unix form, then to dos form, then back to unix form\n      # but this time dos style (no spaces!) so that the unix form looks\n      # like /cygdrive/c/PROGRA~1:/cygdr...\n      sys_lib_search_path_spec=`cygpath --path --unix \"$LIB\"`\n      sys_lib_search_path_spec=`cygpath --path --dos \"$sys_lib_search_path_spec\" 2>/dev/null`\n      sys_lib_search_path_spec=`cygpath --path --unix \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      ;;\n    *)\n      sys_lib_search_path_spec=\"$LIB\"\n      if $ECHO \"$sys_lib_search_path_spec\" | $GREP ';[c-zC-Z]:/' >/dev/null; then\n        # It is most probably a Windows format PATH.\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e 's/;/ /g'`\n      else\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      fi\n      # FIXME: find the short name or the path components, as spaces are\n      # common. (e.g. \"Program Files\" -> \"PROGRA~1\")\n      ;;\n    esac\n\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n    dynamic_linker='Win32 link.exe'\n    ;;\n\n  *)\n    # Assume MSVC wrapper\n    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'\n    dynamic_linker='Win32 ld.exe'\n    ;;\n  esac\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  ;;\n\ndarwin* | rhapsody*)\n  dynamic_linker=\"$host_os dyld\"\n  version_type=darwin\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'\n  soname_spec='${libname}${release}${major}$shared_ext'\n  shlibpath_overrides_runpath=yes\n  shlibpath_var=DYLD_LIBRARY_PATH\n  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'\n\n  sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/local/lib\"\n  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'\n  ;;\n\ndgux*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nfreebsd* | dragonfly*)\n  # DragonFly does not have aout.  When/if they implement a new\n  # versioning mechanism, adjust this.\n  if test -x /usr/bin/objformat; then\n    objformat=`/usr/bin/objformat`\n  else\n    case $host_os in\n    freebsd[23].*) objformat=aout ;;\n    *) objformat=elf ;;\n    esac\n  fi\n  version_type=freebsd-$objformat\n  case $version_type in\n    freebsd-elf*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_os in\n  freebsd2.*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  freebsd3.[01]* | freebsdelf3.[01]*)\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \\\n  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)\n    shlibpath_overrides_runpath=no\n    hardcode_into_libs=yes\n    ;;\n  *) # from 4.6 on, and DragonFly\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  esac\n  ;;\n\nhaiku*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  dynamic_linker=\"$host_os runtime_loader\"\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'\n  hardcode_into_libs=yes\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  case $host_cpu in\n  ia64*)\n    shrext_cmds='.so'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.so\"\n    shlibpath_var=LD_LIBRARY_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    if test \"X$HPUX_IA64_MODE\" = X32; then\n      sys_lib_search_path_spec=\"/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib\"\n    else\n      sys_lib_search_path_spec=\"/usr/lib/hpux64 /usr/local/lib/hpux64\"\n    fi\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  hppa*64*)\n    shrext_cmds='.sl'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    sys_lib_search_path_spec=\"/usr/lib/pa20_64 /usr/ccs/lib/pa20_64\"\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  *)\n    shrext_cmds='.sl'\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=SHLIB_PATH\n    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    ;;\n  esac\n  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...\n  postinstall_cmds='chmod 555 $lib'\n  # or fails outright, so override atomically:\n  install_override_mode=555\n  ;;\n\ninterix[3-9]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n    nonstopux*) version_type=nonstopux ;;\n    *)\n\tif test \"$lt_cv_prog_gnu_ld\" = yes; then\n\t\tversion_type=linux # correct to gnu/linux during the next big refactor\n\telse\n\t\tversion_type=irix\n\tfi ;;\n  esac\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'\n  case $host_os in\n  irix5* | nonstopux*)\n    libsuff= shlibsuff=\n    ;;\n  *)\n    case $LD in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \"|*-melf32bsmip|*\"-melf32bsmip \")\n      libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \"|*-melf32bmipn32|*\"-melf32bmipn32 \")\n      libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \"|*-melf64bmip|*\"-melf64bmip \")\n      libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib${libsuff} /lib${libsuff}\"\n  hardcode_into_libs=yes\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux*oldld* | linux*aout* | linux*coff*)\n  dynamic_linker=no\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n\n  # Some binutils ld are patched to set DT_RUNPATH\n  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_shlibpath_overrides_runpath=no\n    save_LDFLAGS=$LDFLAGS\n    save_libdir=$libdir\n    eval \"libdir=/foo; wl=\\\"$lt_prog_compiler_wl\\\"; \\\n\t LDFLAGS=\\\"\\$LDFLAGS $hardcode_libdir_flag_spec\\\"\"\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep \"RUNPATH.*$libdir\" >/dev/null; then :\n  lt_cv_shlibpath_overrides_runpath=yes\nfi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n    LDFLAGS=$save_LDFLAGS\n    libdir=$save_libdir\n\nfi\n\n  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  # Append ld.so.conf contents to the search path\n  if test -f /etc/ld.so.conf; then\n    lt_ld_extra=`awk '/^include / { system(sprintf(\"cd /etc; cat %s 2>/dev/null\", \\$2)); skip = 1; } { if (!skip) print \\$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[\t ]*hwcap[\t ]/d;s/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/\"//g;/^$/d' | tr '\\n' ' '`\n    sys_lib_dlsearch_path_spec=\"/lib /usr/lib $lt_ld_extra\"\n  fi\n\n  # We used to test for /lib/ld.so.1 and disable shared libraries on\n  # powerpc, because MkLinux only supported shared libraries with the\n  # GNU dynamic linker.  Since this was broken with cross compilers,\n  # most powerpc-linux boxes support dynamic linking these days and\n  # people can always --disable-shared, the test was removed, and we\n  # assume the GNU/Linux dynamic linker is in use.\n  dynamic_linker='GNU/Linux ld.so'\n  ;;\n\nnetbsdelf*-gnu)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='NetBSD ld.elf_so'\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  ;;\n\nnewsos6)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\n*nto* | *qnx*)\n  version_type=qnx\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='ldqnx.so'\n  ;;\n\nopenbsd*)\n  version_type=sunos\n  sys_lib_dlsearch_path_spec=\"/usr/lib\"\n  need_lib_prefix=no\n  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.\n  case $host_os in\n    openbsd3.3 | openbsd3.3.*)\tneed_version=yes ;;\n    *)\t\t\t\tneed_version=no  ;;\n  esac\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    case $host_os in\n      openbsd2.[89] | openbsd2.[89].*)\n\tshlibpath_overrides_runpath=no\n\t;;\n      *)\n\tshlibpath_overrides_runpath=yes\n\t;;\n      esac\n  else\n    shlibpath_overrides_runpath=yes\n  fi\n  ;;\n\nos2*)\n  libname_spec='$name'\n  shrext_cmds=\".dll\"\n  need_lib_prefix=no\n  library_names_spec='$libname${shared_ext} $libname.a'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=LIBPATH\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=\"$sys_lib_search_path_spec\"\n  ;;\n\nrdos*)\n  dynamic_linker=no\n  ;;\n\nsolaris*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test \"$with_gnu_ld\" = yes; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_vendor in\n    sni)\n      shlibpath_overrides_runpath=no\n      need_lib_prefix=no\n      runpath_var=LD_RUN_PATH\n      ;;\n    siemens)\n      need_lib_prefix=no\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      ;;\n  esac\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec ;then\n    version_type=linux # correct to gnu/linux during the next big refactor\n    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'\n    soname_spec='$libname${shared_ext}.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  version_type=freebsd-elf\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  if test \"$with_gnu_ld\" = yes; then\n    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'\n  else\n    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'\n    case $host_os in\n      sco3.2v5*)\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec /lib\"\n\t;;\n    esac\n  fi\n  sys_lib_dlsearch_path_spec='/usr/lib'\n  ;;\n\ntpf*)\n  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nuts4*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $dynamic_linker\" >&5\n$as_echo \"$dynamic_linker\" >&6; }\ntest \"$dynamic_linker\" = no && can_build_shared=no\n\nvariables_saved_for_relink=\"PATH $shlibpath_var $runpath_var\"\nif test \"$GCC\" = yes; then\n  variables_saved_for_relink=\"$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH\"\nfi\n\nif test \"${lt_cv_sys_lib_search_path_spec+set}\" = set; then\n  sys_lib_search_path_spec=\"$lt_cv_sys_lib_search_path_spec\"\nfi\nif test \"${lt_cv_sys_lib_dlsearch_path_spec+set}\" = set; then\n  sys_lib_dlsearch_path_spec=\"$lt_cv_sys_lib_dlsearch_path_spec\"\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs\" >&5\n$as_echo_n \"checking how to hardcode library paths into programs... \" >&6; }\nhardcode_action=\nif test -n \"$hardcode_libdir_flag_spec\" ||\n   test -n \"$runpath_var\" ||\n   test \"X$hardcode_automatic\" = \"Xyes\" ; then\n\n  # We can hardcode non-existent directories.\n  if test \"$hardcode_direct\" != no &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test \"$_LT_TAGVAR(hardcode_shlibpath_var, )\" != no &&\n     test \"$hardcode_minus_L\" != no; then\n    # Linking always hardcodes the temporary library directory.\n    hardcode_action=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    hardcode_action=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  hardcode_action=unsupported\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hardcode_action\" >&5\n$as_echo \"$hardcode_action\" >&6; }\n\nif test \"$hardcode_action\" = relink ||\n   test \"$inherit_rpath\" = yes; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test \"$shlibpath_overrides_runpath\" = yes ||\n     test \"$enable_shared\" = no; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n\n\n\n\n\n\n  if test \"x$enable_dlopen\" != xyes; then\n  enable_dlopen=unknown\n  enable_dlopen_self=unknown\n  enable_dlopen_self_static=unknown\nelse\n  lt_cv_dlopen=no\n  lt_cv_dlopen_libs=\n\n  case $host_os in\n  beos*)\n    lt_cv_dlopen=\"load_add_on\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ;;\n\n  mingw* | pw32* | cegcc*)\n    lt_cv_dlopen=\"LoadLibrary\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  cygwin*)\n    lt_cv_dlopen=\"dlopen\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  darwin*)\n  # if libdl is installed we need to link against it\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl\" >&5\n$as_echo_n \"checking for dlopen in -ldl... \" >&6; }\nif ${ac_cv_lib_dl_dlopen+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dl_dlopen=yes\nelse\n  ac_cv_lib_dl_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen\" >&5\n$as_echo \"$ac_cv_lib_dl_dlopen\" >&6; }\nif test \"x$ac_cv_lib_dl_dlopen\" = xyes; then :\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"\nelse\n\n    lt_cv_dlopen=\"dyld\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n\nfi\n\n    ;;\n\n  *)\n    ac_fn_c_check_func \"$LINENO\" \"shl_load\" \"ac_cv_func_shl_load\"\nif test \"x$ac_cv_func_shl_load\" = xyes; then :\n  lt_cv_dlopen=\"shl_load\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld\" >&5\n$as_echo_n \"checking for shl_load in -ldld... \" >&6; }\nif ${ac_cv_lib_dld_shl_load+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar shl_load ();\nint\nmain ()\n{\nreturn shl_load ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dld_shl_load=yes\nelse\n  ac_cv_lib_dld_shl_load=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load\" >&5\n$as_echo \"$ac_cv_lib_dld_shl_load\" >&6; }\nif test \"x$ac_cv_lib_dld_shl_load\" = xyes; then :\n  lt_cv_dlopen=\"shl_load\" lt_cv_dlopen_libs=\"-ldld\"\nelse\n  ac_fn_c_check_func \"$LINENO\" \"dlopen\" \"ac_cv_func_dlopen\"\nif test \"x$ac_cv_func_dlopen\" = xyes; then :\n  lt_cv_dlopen=\"dlopen\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl\" >&5\n$as_echo_n \"checking for dlopen in -ldl... \" >&6; }\nif ${ac_cv_lib_dl_dlopen+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dl_dlopen=yes\nelse\n  ac_cv_lib_dl_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen\" >&5\n$as_echo \"$ac_cv_lib_dl_dlopen\" >&6; }\nif test \"x$ac_cv_lib_dl_dlopen\" = xyes; then :\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld\" >&5\n$as_echo_n \"checking for dlopen in -lsvld... \" >&6; }\nif ${ac_cv_lib_svld_dlopen+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lsvld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_svld_dlopen=yes\nelse\n  ac_cv_lib_svld_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen\" >&5\n$as_echo \"$ac_cv_lib_svld_dlopen\" >&6; }\nif test \"x$ac_cv_lib_svld_dlopen\" = xyes; then :\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-lsvld\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld\" >&5\n$as_echo_n \"checking for dld_link in -ldld... \" >&6; }\nif ${ac_cv_lib_dld_dld_link+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dld_link ();\nint\nmain ()\n{\nreturn dld_link ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dld_dld_link=yes\nelse\n  ac_cv_lib_dld_dld_link=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link\" >&5\n$as_echo \"$ac_cv_lib_dld_dld_link\" >&6; }\nif test \"x$ac_cv_lib_dld_dld_link\" = xyes; then :\n  lt_cv_dlopen=\"dld_link\" lt_cv_dlopen_libs=\"-ldld\"\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n    ;;\n  esac\n\n  if test \"x$lt_cv_dlopen\" != xno; then\n    enable_dlopen=yes\n  else\n    enable_dlopen=no\n  fi\n\n  case $lt_cv_dlopen in\n  dlopen)\n    save_CPPFLAGS=\"$CPPFLAGS\"\n    test \"x$ac_cv_header_dlfcn_h\" = xyes && CPPFLAGS=\"$CPPFLAGS -DHAVE_DLFCN_H\"\n\n    save_LDFLAGS=\"$LDFLAGS\"\n    wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $export_dynamic_flag_spec\\\"\n\n    save_LIBS=\"$LIBS\"\n    LIBS=\"$lt_cv_dlopen_libs $LIBS\"\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself\" >&5\n$as_echo_n \"checking whether a program can dlopen itself... \" >&6; }\nif ${lt_cv_dlopen_self+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  \t  if test \"$cross_compiling\" = yes; then :\n  lt_cv_dlopen_self=cross\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n#line $LINENO \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\n/* When -fvisbility=hidden is used, assume the code has been annotated\n   correspondingly for the symbols needed.  */\n#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))\nint fnord () __attribute__((visibility(\"default\")));\n#endif\n\nint fnord () { return 42; }\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else\n        {\n\t  if (dlsym( self,\"_fnord\"))  status = $lt_dlneed_uscore;\n          else puts (dlerror ());\n\t}\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}\n_LT_EOF\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) >&5 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;\n      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;\n      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;\n    esac\n  else :\n    # compilation failed\n    lt_cv_dlopen_self=no\n  fi\nfi\nrm -fr conftest*\n\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self\" >&5\n$as_echo \"$lt_cv_dlopen_self\" >&6; }\n\n    if test \"x$lt_cv_dlopen_self\" = xyes; then\n      wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $lt_prog_compiler_static\\\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself\" >&5\n$as_echo_n \"checking whether a statically linked program can dlopen itself... \" >&6; }\nif ${lt_cv_dlopen_self_static+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  \t  if test \"$cross_compiling\" = yes; then :\n  lt_cv_dlopen_self_static=cross\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n#line $LINENO \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\n/* When -fvisbility=hidden is used, assume the code has been annotated\n   correspondingly for the symbols needed.  */\n#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))\nint fnord () __attribute__((visibility(\"default\")));\n#endif\n\nint fnord () { return 42; }\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else\n        {\n\t  if (dlsym( self,\"_fnord\"))  status = $lt_dlneed_uscore;\n          else puts (dlerror ());\n\t}\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}\n_LT_EOF\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) >&5 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;\n      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;\n      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;\n    esac\n  else :\n    # compilation failed\n    lt_cv_dlopen_self_static=no\n  fi\nfi\nrm -fr conftest*\n\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static\" >&5\n$as_echo \"$lt_cv_dlopen_self_static\" >&6; }\n    fi\n\n    CPPFLAGS=\"$save_CPPFLAGS\"\n    LDFLAGS=\"$save_LDFLAGS\"\n    LIBS=\"$save_LIBS\"\n    ;;\n  esac\n\n  case $lt_cv_dlopen_self in\n  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;\n  *) enable_dlopen_self=unknown ;;\n  esac\n\n  case $lt_cv_dlopen_self_static in\n  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;\n  *) enable_dlopen_self_static=unknown ;;\n  esac\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nstriplib=\nold_striplib=\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible\" >&5\n$as_echo_n \"checking whether stripping libraries is possible... \" >&6; }\nif test -n \"$STRIP\" && $STRIP -V 2>&1 | $GREP \"GNU strip\" >/dev/null; then\n  test -z \"$old_striplib\" && old_striplib=\"$STRIP --strip-debug\"\n  test -z \"$striplib\" && striplib=\"$STRIP --strip-unneeded\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n# FIXME - insert some real tests, host_os isn't really good enough\n  case $host_os in\n  darwin*)\n    if test -n \"$STRIP\" ; then\n      striplib=\"$STRIP -x\"\n      old_striplib=\"$STRIP -S\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n    else\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n    fi\n    ;;\n  *)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n    ;;\n  esac\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n  # Report which library types will actually be built\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries\" >&5\n$as_echo_n \"checking if libtool supports shared libraries... \" >&6; }\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $can_build_shared\" >&5\n$as_echo \"$can_build_shared\" >&6; }\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries\" >&5\n$as_echo_n \"checking whether to build shared libraries... \" >&6; }\n  test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n  # On AIX, shared libraries and static libraries use the same namespace, and\n  # are all built from PIC.\n  case $host_os in\n  aix3*)\n    test \"$enable_shared\" = yes && enable_static=no\n    if test -n \"$RANLIB\"; then\n      archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n      postinstall_cmds='$RANLIB $lib'\n    fi\n    ;;\n\n  aix[4-9]*)\n    if test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n      test \"$enable_shared\" = yes && enable_static=no\n    fi\n    ;;\n  esac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $enable_shared\" >&5\n$as_echo \"$enable_shared\" >&6; }\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to build static libraries\" >&5\n$as_echo_n \"checking whether to build static libraries... \" >&6; }\n  # Make sure either enable_shared or enable_static is yes.\n  test \"$enable_shared\" = yes || enable_static=yes\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $enable_static\" >&5\n$as_echo \"$enable_static\" >&6; }\n\n\n\n\nfi\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nCC=\"$lt_save_CC\"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        ac_config_commands=\"$ac_config_commands libtool\"\n\n\n\n\n# Only expand once:\n\n\n\n\nenable_pcre=no\n\n# Check whether --with-pcre was given.\nif test \"${with_pcre+set}\" = set; then :\n  withval=$with_pcre;\n  if test \"x$withval\" != \"xyes\" && test \"x$withval\" != \"x\"; then\n    pcre_base_dir=\"$withval\"\n    if test \"$withval\" != \"no\"; then\n      enable_pcre=yes\n      case \"$withval\" in\n      *\":\"*)\n        pcre_include=\"`echo $withval |sed -e 's/:.*$//'`\"\n        pcre_ldflags=\"`echo $withval |sed -e 's/^.*://'`\"\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking checking for pcre includes in $pcre_include libs in $pcre_ldflags \" >&5\n$as_echo_n \"checking checking for pcre includes in $pcre_include libs in $pcre_ldflags ... \" >&6; }\n        ;;\n      *)\n        pcre_include=\"$withval/include\"\n        pcre_ldflags=\"$withval/lib\"\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking checking for pcre includes in $withval\" >&5\n$as_echo_n \"checking checking for pcre includes in $withval... \" >&6; }\n        ;;\n      esac\n    fi\n  fi\n\nelse\n\n  # Extract the first word of \"pcre-config\", so it can be a program name with args.\nset dummy pcre-config; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_PCRE_CONFIG+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$PCRE_CONFIG\"; then\n  ac_cv_prog_PCRE_CONFIG=\"$PCRE_CONFIG\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_PCRE_CONFIG=\"pcre-config\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nPCRE_CONFIG=$ac_cv_prog_PCRE_CONFIG\nif test -n \"$PCRE_CONFIG\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $PCRE_CONFIG\" >&5\n$as_echo \"$PCRE_CONFIG\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  if test \"x$PCRE_CONFIG\" != \"x\"; then\n    enable_pcre=yes\n    pcre_base_dir=\"`$PCRE_CONFIG --prefix`\"\n    pcre_include=\"`$PCRE_CONFIG --cflags | sed -es/-I//`\"\n    pcre_ldflags=\"`$PCRE_CONFIG --libs | sed -es/-lpcre// -es/-L//`\"\n  fi\n\nfi\n\n\nif test \"x$pcre_base_dir\" = \"x\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for pcre location\" >&5\n$as_echo_n \"checking for pcre location... \" >&6; }\n  if ${ats_cv_pcre_dir+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  for dir in /usr/local /usr ; do\n    if test -d $dir && ( test -f $dir/include/pcre.h || test -f $dir/include/pcre/pcre.h ); then\n      ats_cv_pcre_dir=$dir\n      break\n    fi\n  done\n\nfi\n\n  pcre_base_dir=$ats_cv_pcre_dir\n  if test \"x$pcre_base_dir\" = \"x\"; then\n    enable_pcre=no\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: not found\" >&5\n$as_echo \"not found\" >&6; }\n  else\n    enable_pcre=yes\n    pcre_include=\"$pcre_base_dir/include\"\n    pcre_ldflags=\"$pcre_base_dir/lib\"\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $pcre_base_dir\" >&5\n$as_echo \"$pcre_base_dir\" >&6; }\n  fi\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for pcre headers in $pcre_include\" >&5\n$as_echo_n \"checking for pcre headers in $pcre_include... \" >&6; }\n  if test -d $pcre_include && test -d $pcre_ldflags && ( test -f $pcre_include/pcre.h || test -f $pcre_include/pcre/pcre.h ); then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ok\" >&5\n$as_echo \"ok\" >&6; }\n  else\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: not found\" >&5\n$as_echo \"not found\" >&6; }\n  fi\nfi\n\npcreh=0\npcre_pcreh=0\nif test \"$enable_pcre\" != \"no\"; then\n  saved_ldflags=$LDFLAGS\n  saved_cppflags=$CFLAGS\n  pcre_have_headers=0\n  pcre_have_libs=0\n  if test \"$pcre_base_dir\" != \"/usr\"; then\n\n  if test \"x$CFLAGS\" = \"x\"; then\n    test \"x$verbose\" = \"xyes\" && echo \"  setting CFLAGS to \\\"-I${pcre_include}\\\"\"\n    CFLAGS=\"-I${pcre_include}\"\n  else\n    ats_addto_bugger=\"-I${pcre_include}\"\n    for i in $ats_addto_bugger; do\n      ats_addto_duplicate=\"0\"\n      for j in $CFLAGS; do\n        if test \"x$i\" = \"x$j\"; then\n          ats_addto_duplicate=\"1\"\n          break\n        fi\n      done\n      if test $ats_addto_duplicate = \"0\"; then\n        test \"x$verbose\" = \"xyes\" && echo \"  adding \\\"$i\\\" to CFLAGS\"\n        CFLAGS=\"$CFLAGS $i\"\n      fi\n    done\n  fi\n\n\n  if test \"x$CFLAGS\" = \"x\"; then\n    test \"x$verbose\" = \"xyes\" && echo \"  setting CFLAGS to \\\"-DPCRE_STATIC\\\"\"\n    CFLAGS=\"-DPCRE_STATIC\"\n  else\n    ats_addto_bugger=\"-DPCRE_STATIC\"\n    for i in $ats_addto_bugger; do\n      ats_addto_duplicate=\"0\"\n      for j in $CFLAGS; do\n        if test \"x$i\" = \"x$j\"; then\n          ats_addto_duplicate=\"1\"\n          break\n        fi\n      done\n      if test $ats_addto_duplicate = \"0\"; then\n        test \"x$verbose\" = \"xyes\" && echo \"  adding \\\"$i\\\" to CFLAGS\"\n        CFLAGS=\"$CFLAGS $i\"\n      fi\n    done\n  fi\n\n\n  if test \"x$LDFLAGS\" = \"x\"; then\n    test \"x$verbose\" = \"xyes\" && echo \"  setting LDFLAGS to \\\"-L${pcre_ldflags}\\\"\"\n    LDFLAGS=\"-L${pcre_ldflags}\"\n  else\n    ats_addto_bugger=\"-L${pcre_ldflags}\"\n    for i in $ats_addto_bugger; do\n      ats_addto_duplicate=\"0\"\n      for j in $LDFLAGS; do\n        if test \"x$i\" = \"x$j\"; then\n          ats_addto_duplicate=\"1\"\n          break\n        fi\n      done\n      if test $ats_addto_duplicate = \"0\"; then\n        test \"x$verbose\" = \"xyes\" && echo \"  adding \\\"$i\\\" to LDFLAGS\"\n        LDFLAGS=\"$LDFLAGS $i\"\n      fi\n    done\n  fi\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: adding ${pcre_ldflags} to RPATH\" >&5\n$as_echo \"$as_me: adding ${pcre_ldflags} to RPATH\" >&6;}\n\n  if test \"x$LIBTOOL_LINK_FLAGS\" = \"x\"; then\n    test \"x$verbose\" = \"xyes\" && echo \"  setting LIBTOOL_LINK_FLAGS to \\\"-R${pcre_ldflags}\\\"\"\n    LIBTOOL_LINK_FLAGS=\"-R${pcre_ldflags}\"\n  else\n    ats_addto_bugger=\"-R${pcre_ldflags}\"\n    for i in $ats_addto_bugger; do\n      ats_addto_duplicate=\"0\"\n      for j in $LIBTOOL_LINK_FLAGS; do\n        if test \"x$i\" = \"x$j\"; then\n          ats_addto_duplicate=\"1\"\n          break\n        fi\n      done\n      if test $ats_addto_duplicate = \"0\"; then\n        test \"x$verbose\" = \"xyes\" && echo \"  adding \\\"$i\\\" to LIBTOOL_LINK_FLAGS\"\n        LIBTOOL_LINK_FLAGS=\"$LIBTOOL_LINK_FLAGS $i\"\n      fi\n    done\n  fi\n\n\n  fi\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for library containing pcre_exec\" >&5\n$as_echo_n \"checking for library containing pcre_exec... \" >&6; }\nif ${ac_cv_search_pcre_exec+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_func_search_save_LIBS=$LIBS\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar pcre_exec ();\nint\nmain ()\n{\nreturn pcre_exec ();\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_lib in '' pcre; do\n  if test -z \"$ac_lib\"; then\n    ac_res=\"none required\"\n  else\n    ac_res=-l$ac_lib\n    LIBS=\"-l$ac_lib  $ac_func_search_save_LIBS\"\n  fi\n  if ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_search_pcre_exec=$ac_res\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext\n  if ${ac_cv_search_pcre_exec+:} false; then :\n  break\nfi\ndone\nif ${ac_cv_search_pcre_exec+:} false; then :\n\nelse\n  ac_cv_search_pcre_exec=no\nfi\nrm conftest.$ac_ext\nLIBS=$ac_func_search_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_pcre_exec\" >&5\n$as_echo \"$ac_cv_search_pcre_exec\" >&6; }\nac_res=$ac_cv_search_pcre_exec\nif test \"$ac_res\" != no; then :\n  test \"$ac_res\" = \"none required\" || LIBS=\"$ac_res $LIBS\"\n  pcre_have_libs=1\nfi\n\n  if test \"$pcre_have_libs\" != \"0\"; then\n    for ac_header in pcre.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"pcre.h\" \"ac_cv_header_pcre_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_pcre_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_PCRE_H 1\n_ACEOF\n pcre_have_headers=1\nfi\n\ndone\n\n    for ac_header in pcre/pcre.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"pcre/pcre.h\" \"ac_cv_header_pcre_pcre_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_pcre_pcre_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_PCRE_PCRE_H 1\n_ACEOF\n pcre_have_headers=1\nfi\n\ndone\n\n  fi\n  if test \"$pcre_have_headers\" != \"0\"; then\n\n$as_echo \"#define HAVE_LIBPCRE 1\" >>confdefs.h\n\n    LIBPCRE=-lpcre\n\n  else\n    enable_pcre=no\n    CFLAGS=$saved_cppflags\n    LDFLAGS=$saved_ldflags\n  fi\nfi\n\n\n\nif test \"x${enable_pcre}\" != \"xyes\"; then\n  as_fn_error $? \"Cannot find pcre library. Configure --with-pcre=DIR\" \"$LINENO\" 5\nfi\n\n# Check whether --enable-system-shared-lib was given.\nif test \"${enable_system_shared_lib+set}\" = set; then :\n  enableval=$enable_system_shared_lib;\n    case \"${enableval}\" in\n      yes) enable_system_shared_lib=true ;;\n      no) enable_system_shared_lib=false ;;\n      *) as_fn_error $? \"bad value ${enableval} for --enable-system-shared-lib\" \"$LINENO\" 5 ;;\n    esac\nelse\n  enable_system_shared_lib=false\nfi\n\n if test x$enable_system_shared_lib = xtrue; then\n  USE_SYSTEM_SHARED_LIB_TRUE=\n  USE_SYSTEM_SHARED_LIB_FALSE='#'\nelse\n  USE_SYSTEM_SHARED_LIB_TRUE='#'\n  USE_SYSTEM_SHARED_LIB_FALSE=\nfi\n\n\n\n# Check whether --with-crypto-library was given.\nif test \"${with_crypto_library+set}\" = set; then :\n  withval=$with_crypto_library;\n    case \"${withval}\" in\n      openssl|polarssl|mbedtls) ;;\n      *) as_fn_error $? \"bad value ${withval} for --with-crypto-library\" \"$LINENO\" 5 ;;\n    esac\n\nelse\n  with_crypto_library=\"openssl\"\n\nfi\n\n\n# Check whether --enable-documentation was given.\nif test \"${enable_documentation+set}\" = set; then :\n  enableval=$enable_documentation; disable_documentation=true\nelse\n  disable_documentation=false\nfi\n\n if test x$disable_documentation = xfalse; then\n  ENABLE_DOCUMENTATION_TRUE=\n  ENABLE_DOCUMENTATION_FALSE='#'\nelse\n  ENABLE_DOCUMENTATION_TRUE='#'\n  ENABLE_DOCUMENTATION_FALSE=\nfi\n\n\nif test -z \"$ENABLE_DOCUMENTATION_TRUE\"; then :\n\n  # Extract the first word of \"asciidoc\", so it can be a program name with args.\nset dummy asciidoc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_ASCIIDOC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $ASCIIDOC in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_ASCIIDOC=\"$ASCIIDOC\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_path_ASCIIDOC=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  ;;\nesac\nfi\nASCIIDOC=$ac_cv_path_ASCIIDOC\nif test -n \"$ASCIIDOC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ASCIIDOC\" >&5\n$as_echo \"$ASCIIDOC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test x\"${ASCIIDOC}\" != x || as_fn_error $? \"Cannot find \\`asciidoc\\` in PATH.\" \"$LINENO\" 5\n  # Extract the first word of \"xmlto\", so it can be a program name with args.\nset dummy xmlto; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_XMLTO+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $XMLTO in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_XMLTO=\"$XMLTO\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_path_XMLTO=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  ;;\nesac\nfi\nXMLTO=$ac_cv_path_XMLTO\nif test -n \"$XMLTO\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $XMLTO\" >&5\n$as_echo \"$XMLTO\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test x\"$XMLTO\" != x || as_fn_error $? \"Cannot find \\`xmlto\\` in PATH.\" \"$LINENO\" 5\n  # Extract the first word of \"gzip\", so it can be a program name with args.\nset dummy gzip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_GZIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $GZIP in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_GZIP=\"$GZIP\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_path_GZIP=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  test -z \"$ac_cv_path_GZIP\" && ac_cv_path_GZIP=\"gzip\"\n  ;;\nesac\nfi\nGZIP=$ac_cv_path_GZIP\nif test -n \"$GZIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $GZIP\" >&5\n$as_echo \"$GZIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  # Extract the first word of \"rm\", so it can be a program name with args.\nset dummy rm; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_RM+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $RM in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_RM=\"$RM\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_path_RM=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  test -z \"$ac_cv_path_RM\" && ac_cv_path_RM=\"rm\"\n  ;;\nesac\nfi\nRM=$ac_cv_path_RM\nif test -n \"$RM\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $RM\" >&5\n$as_echo \"$RM\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  # Extract the first word of \"mv\", so it can be a program name with args.\nset dummy mv; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_path_MV+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $MV in\n  [\\\\/]* | ?:[\\\\/]*)\n  ac_cv_path_MV=\"$MV\" # Let the user override the test with a path.\n  ;;\n  *)\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_path_MV=\"$as_dir/$ac_word$ac_exec_ext\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  test -z \"$ac_cv_path_MV\" && ac_cv_path_MV=\"mv\"\n  ;;\nesac\nfi\nMV=$ac_cv_path_MV\nif test -n \"$MV\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MV\" >&5\n$as_echo \"$MV\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output\" >&5\n$as_echo_n \"checking for a sed that does not truncate output... \" >&6; }\nif ${ac_cv_path_SED+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/\n     for ac_i in 1 2 3 4 5 6 7; do\n       ac_script=\"$ac_script$as_nl$ac_script\"\n     done\n     echo \"$ac_script\" 2>/dev/null | sed 99q >conftest.sed\n     { ac_script=; unset ac_script;}\n     if test -z \"$SED\"; then\n  ac_path_SED_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in sed gsed; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_SED=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_SED\" || continue\n# Check for GNU ac_path_SED and select it if it is found.\n  # Check for GNU $ac_path_SED\ncase `\"$ac_path_SED\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_SED=\"$ac_path_SED\" ac_path_SED_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo '' >> \"conftest.nl\"\n    \"$ac_path_SED\" -f conftest.sed < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_SED_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_SED=\"$ac_path_SED\"\n      ac_path_SED_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_SED_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_SED\"; then\n    as_fn_error $? \"no acceptable sed could be found in \\$PATH\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_SED=$SED\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED\" >&5\n$as_echo \"$ac_cv_path_SED\" >&6; }\n SED=\"$ac_cv_path_SED\"\n  rm -f conftest.sed\n\n\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}gcc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nif test -z \"$CC\"; then\n          if test -n \"$ac_tool_prefix\"; then\n    # Extract the first word of \"${ac_tool_prefix}cc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  fi\nfi\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  ac_prog_rejected=no\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    if test \"$as_dir/$ac_word$ac_exec_ext\" = \"/usr/ucb/cc\"; then\n       ac_prog_rejected=yes\n       continue\n     fi\n    ac_cv_prog_CC=\"cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# != 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    ac_cv_prog_CC=\"$as_dir/$ac_word${1+' '}$@\"\n  fi\nfi\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cl.exe\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CC\" && break\n  done\nfi\nif test -z \"$CC\"; then\n  ac_ct_CC=$CC\n  for ac_prog in cl.exe\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CC\" && break\ndone\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nfi\n\nfi\n\n\ntest -z \"$CC\" && { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C compiler... \" >&6; }\nif ${ac_cv_c_compiler_gnu+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_c_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu\" >&5\n$as_echo \"$ac_cv_c_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GCC=yes\nelse\n  GCC=\nfi\nac_test_CFLAGS=${CFLAGS+set}\nac_save_CFLAGS=$CFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g\" >&5\n$as_echo_n \"checking whether $CC accepts -g... \" >&6; }\nif ${ac_cv_prog_cc_g+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_c_werror_flag=$ac_c_werror_flag\n   ac_c_werror_flag=yes\n   ac_cv_prog_cc_g=no\n   CFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nelse\n  CFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\nelse\n  ac_c_werror_flag=$ac_save_c_werror_flag\n\t CFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_c_werror_flag=$ac_save_c_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g\" >&5\n$as_echo \"$ac_cv_prog_cc_g\" >&6; }\nif test \"$ac_test_CFLAGS\" = set; then\n  CFLAGS=$ac_save_CFLAGS\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89\" >&5\n$as_echo_n \"checking for $CC option to accept ISO C89... \" >&6; }\nif ${ac_cv_prog_cc_c89+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_prog_cc_c89=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdio.h>\nstruct stat;\n/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */\nstruct buf { int x; };\nFILE * (*rcsopen) (struct buf *, struct stat *, int);\nstatic char *e (p, i)\n     char **p;\n     int i;\n{\n  return p[i];\n}\nstatic char *f (char * (*g) (char **, int), char **p, ...)\n{\n  char *s;\n  va_list v;\n  va_start (v,p);\n  s = g (p, va_arg (v,int));\n  va_end (v);\n  return s;\n}\n\n/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has\n   function prototypes and stuff, but not '\\xHH' hex character constants.\n   These don't provoke an error unfortunately, instead are silently treated\n   as 'x'.  The following induces an error, until -std is added to get\n   proper ANSI mode.  Curiously '\\x00'!='x' always comes out true, for an\n   array size at least.  It's necessary to write '\\x00'==0 to get something\n   that's true only with -std.  */\nint osf4_cc_array ['\\x00' == 0 ? 1 : -1];\n\n/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters\n   inside strings and character constants.  */\n#define FOO(x) 'x'\nint xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];\n\nint test (int i, double x);\nstruct s1 {int (*f) (int a);};\nstruct s2 {int (*f) (double a);};\nint pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);\nint argc;\nchar **argv;\nint\nmain ()\n{\nreturn f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \\\n\t-Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_c89=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext\n  test \"x$ac_cv_prog_cc_c89\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\n\nfi\n# AC_CACHE_VAL\ncase \"x$ac_cv_prog_cc_c89\" in\n  x)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\n$as_echo \"none needed\" >&6; } ;;\n  xno)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\n$as_echo \"unsupported\" >&6; } ;;\n  *)\n    CC=\"$CC $ac_cv_prog_cc_c89\"\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89\" >&5\n$as_echo \"$ac_cv_prog_cc_c89\" >&6; } ;;\nesac\nif test \"x$ac_cv_prog_cc_c89\" != xno; then :\n\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together\" >&5\n$as_echo_n \"checking whether $CC understands -c and -o together... \" >&6; }\nif ${am_cv_prog_cc_c_o+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\n  # Make sure it works both with $CC and with simple cc.\n  # Following AC_PROG_CC_C_O, we do the test twice because some\n  # compilers refuse to overwrite an existing .o file with -o,\n  # though they will create one.\n  am_cv_prog_cc_c_o=yes\n  for am_i in 1 2; do\n    if { echo \"$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext\" >&5\n   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5\n   ac_status=$?\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   (exit $ac_status); } \\\n         && test -f conftest2.$ac_objext; then\n      : OK\n    else\n      am_cv_prog_cc_c_o=no\n      break\n    fi\n  done\n  rm -f core conftest*\n  unset am_i\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o\" >&5\n$as_echo \"$am_cv_prog_cc_c_o\" >&6; }\nif test \"$am_cv_prog_cc_c_o\" != yes; then\n   # Losing compiler, so override with the script.\n   # FIXME: It is wrong to rewrite CC.\n   # But if we don't then we get into trouble of one sort or another.\n   # A longer-term fix would be to have automake use am__CC in this case,\n   # and then we could set am__CC=\"\\$(top_srcdir)/compile \\$(CC)\"\n   CC=\"$am_aux_dir/compile $CC\"\nfi\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ln -s works\" >&5\n$as_echo_n \"checking whether ln -s works... \" >&6; }\nLN_S=$as_ln_s\nif test \"$LN_S\" = \"ln -s\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no, using $LN_S\" >&5\n$as_echo \"no, using $LN_S\" >&6; }\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \\$(MAKE)\" >&5\n$as_echo_n \"checking whether ${MAKE-make} sets \\$(MAKE)... \" >&6; }\nset x ${MAKE-make}\nac_make=`$as_echo \"$2\" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`\nif eval \\${ac_cv_prog_make_${ac_make}_set+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat >conftest.make <<\\_ACEOF\nSHELL = /bin/sh\nall:\n\t@echo '@@@%%%=$(MAKE)=@@@%%%'\n_ACEOF\n# GNU make sometimes prints \"make[1]: Entering ...\", which would confuse us.\ncase `${MAKE-make} -f conftest.make 2>/dev/null` in\n  *@@@%%%=?*=@@@%%%*)\n    eval ac_cv_prog_make_${ac_make}_set=yes;;\n  *)\n    eval ac_cv_prog_make_${ac_make}_set=no;;\nesac\nrm -f conftest.make\nfi\nif eval test \\$ac_cv_prog_make_${ac_make}_set = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n  SET_MAKE=\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n  SET_MAKE=\"MAKE=${MAKE-make}\"\nfi\n\n\n\nif test -z \"$USE_SYSTEM_SHARED_LIB_TRUE\"; then :\n  else\n\nfor ac_header in sys/inotify.h sys/epoll.h sys/event.h port.h poll.h sys/select.h sys/eventfd.h sys/signalfd.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_mongrel \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\"\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n\nfor ac_func in inotify_init epoll_ctl kqueue port_create poll select eventfd signalfd\ndo :\n  as_ac_var=`$as_echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\nac_fn_c_check_func \"$LINENO\" \"$ac_func\" \"$as_ac_var\"\nif eval test \\\"x\\$\"$as_ac_var\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfor ac_func in clock_gettime\ndo :\n  ac_fn_c_check_func \"$LINENO\" \"clock_gettime\" \"ac_cv_func_clock_gettime\"\nif test \"x$ac_cv_func_clock_gettime\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_CLOCK_GETTIME 1\n_ACEOF\n\nelse\n\n      if test $(uname) = Linux; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for clock_gettime syscall\" >&5\n$as_echo_n \"checking for clock_gettime syscall... \" >&6; }\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <unistd.h>\n                       #include <sys/syscall.h>\n                       #include <time.h>\nint\nmain ()\n{\nstruct timespec ts; int status = syscall (SYS_clock_gettime, CLOCK_REALTIME, &ts)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_have_clock_syscall=1\n\n$as_echo \"#define HAVE_CLOCK_SYSCALL 1\" >>confdefs.h\n\n                      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n   fi\n   if test -z \"$LIBEV_M4_AVOID_LIBRT\" && test -z \"$ac_have_clock_syscall\"; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt\" >&5\n$as_echo_n \"checking for clock_gettime in -lrt... \" >&6; }\nif ${ac_cv_lib_rt_clock_gettime+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lrt  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar clock_gettime ();\nint\nmain ()\n{\nreturn clock_gettime ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_rt_clock_gettime=yes\nelse\n  ac_cv_lib_rt_clock_gettime=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime\" >&5\n$as_echo \"$ac_cv_lib_rt_clock_gettime\" >&6; }\nif test \"x$ac_cv_lib_rt_clock_gettime\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_LIBRT 1\n_ACEOF\n\n  LIBS=\"-lrt $LIBS\"\n\nfi\n\n      unset ac_cv_func_clock_gettime\n      for ac_func in clock_gettime\ndo :\n  ac_fn_c_check_func \"$LINENO\" \"clock_gettime\" \"ac_cv_func_clock_gettime\"\nif test \"x$ac_cv_func_clock_gettime\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_CLOCK_GETTIME 1\n_ACEOF\n\nfi\ndone\n\n   fi\n\nfi\ndone\n\n\nfor ac_func in nanosleep\ndo :\n  ac_fn_c_check_func \"$LINENO\" \"nanosleep\" \"ac_cv_func_nanosleep\"\nif test \"x$ac_cv_func_nanosleep\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_NANOSLEEP 1\n_ACEOF\n\nelse\n\n   if test -z \"$LIBEV_M4_AVOID_LIBRT\"; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for nanosleep in -lrt\" >&5\n$as_echo_n \"checking for nanosleep in -lrt... \" >&6; }\nif ${ac_cv_lib_rt_nanosleep+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lrt  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar nanosleep ();\nint\nmain ()\n{\nreturn nanosleep ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_rt_nanosleep=yes\nelse\n  ac_cv_lib_rt_nanosleep=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_nanosleep\" >&5\n$as_echo \"$ac_cv_lib_rt_nanosleep\" >&6; }\nif test \"x$ac_cv_lib_rt_nanosleep\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_LIBRT 1\n_ACEOF\n\n  LIBS=\"-lrt $LIBS\"\n\nfi\n\n      unset ac_cv_func_nanosleep\n      for ac_func in nanosleep\ndo :\n  ac_fn_c_check_func \"$LINENO\" \"nanosleep\" \"ac_cv_func_nanosleep\"\nif test \"x$ac_cv_func_nanosleep\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_NANOSLEEP 1\n_ACEOF\n\nfi\ndone\n\n   fi\n\nfi\ndone\n\n\nif test -z \"$LIBEV_M4_AVOID_LIBM\"; then\n   LIBM=m\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for library containing floor\" >&5\n$as_echo_n \"checking for library containing floor... \" >&6; }\nif ${ac_cv_search_floor+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_func_search_save_LIBS=$LIBS\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar floor ();\nint\nmain ()\n{\nreturn floor ();\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_lib in '' $LIBM; do\n  if test -z \"$ac_lib\"; then\n    ac_res=\"none required\"\n  else\n    ac_res=-l$ac_lib\n    LIBS=\"-l$ac_lib  $ac_func_search_save_LIBS\"\n  fi\n  if ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_search_floor=$ac_res\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext\n  if ${ac_cv_search_floor+:} false; then :\n  break\nfi\ndone\nif ${ac_cv_search_floor+:} false; then :\n\nelse\n  ac_cv_search_floor=no\nfi\nrm conftest.$ac_ext\nLIBS=$ac_func_search_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_floor\" >&5\n$as_echo \"$ac_cv_search_floor\" >&6; }\nac_res=$ac_cv_search_floor\nif test \"$ac_res\" != no; then :\n  test \"$ac_res\" = \"none required\" || LIBS=\"$ac_res $LIBS\"\n\n$as_echo \"#define HAVE_FLOOR 1\" >>confdefs.h\n\nfi\n\n\n\nfi\n\ncase $host in\n  *-mingw*)\n    LIBS=\"$LIBS -ladvapi32 -lgdi32 -lws2_32 -lcrypt32\"\n    ;;\n  *)\n    ;;\nesac\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for thread local storage (TLS) class\" >&5\n$as_echo_n \"checking for thread local storage (TLS) class... \" >&6; }\n  if ${ac_cv_tls+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  for ax_tls_keyword in __thread '__declspec(thread)' none; do\n       case $ax_tls_keyword in #(\n  none) :\n    ac_cv_tls=none ; break ;; #(\n  *) :\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n               static void\n               foo(void) {\n               static  $ax_tls_keyword  int bar;\n               exit(1);\n               }\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_tls=$ax_tls_keyword ; break\nelse\n  ac_cv_tls=none\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext ;;\nesac\n    done\n\nfi\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_tls\" >&5\n$as_echo \"$ac_cv_tls\" >&6; }\n\n  if test \"$ac_cv_tls\" != \"none\"; then :\n\ncat >>confdefs.h <<_ACEOF\n#define TLS $ac_cv_tls\n_ACEOF\n\n     :\nelse\n  :\nfi\n\n\ncase \"${with_crypto_library}\" in\n  openssl)\n\n  # Check whether --enable-zlib was given.\nif test \"${enable_zlib+set}\" = set; then :\n  enableval=$enable_zlib;\nfi\n\n  if test \"x$enable_zlib\" != \"xno\"; then :\n\n\n$as_echo \"#define HAVE_ZLIB 1\" >>confdefs.h\n\n\n# Check whether --with-zlib was given.\nif test \"${with_zlib+set}\" = set; then :\n  withval=$with_zlib; zlib=\"$withval\"\n       CPPFLAGS=\"$CPPFLAGS -I$withval/include\"\n       LDFLAGS=\"$LDFLAGS -L$withval/lib\"\n\nfi\n\n\n\n# Check whether --with-zlib-include was given.\nif test \"${with_zlib_include+set}\" = set; then :\n  withval=$with_zlib_include; zlib_include=\"$withval\"\n       CPPFLAGS=\"$CPPFLAGS -I$withval\"\n\nfi\n\n\n\n# Check whether --with-zlib-lib was given.\nif test \"${with_zlib_lib+set}\" = set; then :\n  withval=$with_zlib_lib; zlib_lib=\"$withval\"\n       LDFLAGS=\"$LDFLAGS -L$withval\"\n\nfi\n\n\n    for ac_header in zlib.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"zlib.h\" \"ac_cv_header_zlib_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_zlib_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_ZLIB_H 1\n_ACEOF\n\nelse\n  as_fn_error $? \"\\\"zlib header files not found.\\\"\" \"$LINENO\" 5; break\n\nfi\n\ndone\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for compress2 in -lz\" >&5\n$as_echo_n \"checking for compress2 in -lz... \" >&6; }\nif ${ac_cv_lib_z_compress2+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lz  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar compress2 ();\nint\nmain ()\n{\nreturn compress2 ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_z_compress2=yes\nelse\n  ac_cv_lib_z_compress2=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_z_compress2\" >&5\n$as_echo \"$ac_cv_lib_z_compress2\" >&6; }\nif test \"x$ac_cv_lib_z_compress2\" = xyes; then :\n  LIBS=\"$LIBS -lz\"\nelse\n  as_fn_error $? \"\\\"zlib libraries not found.\\\"\" \"$LINENO\" 5\n\nfi\n\n\nfi\n\n\n  case $host_os in\n    *mingw*)\n    ;;\n    *)\n      ac_fn_c_check_func \"$LINENO\" \"dlopen\" \"ac_cv_func_dlopen\"\nif test \"x$ac_cv_func_dlopen\" = xyes; then :\n\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl\" >&5\n$as_echo_n \"checking for dlopen in -ldl... \" >&6; }\nif ${ac_cv_lib_dl_dlopen+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dl_dlopen=yes\nelse\n  ac_cv_lib_dl_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen\" >&5\n$as_echo \"$ac_cv_lib_dl_dlopen\" >&6; }\nif test \"x$ac_cv_lib_dl_dlopen\" = xyes; then :\n  LIBS=\"$LIBS -ldl\"\nelse\n  as_fn_error $? \"OpenSSL depends on libdl.\" \"$LINENO\" 5; break\n\nfi\n\n\nfi\n\n    ;;\n  esac\n\n\n# Check whether --with-openssl was given.\nif test \"${with_openssl+set}\" = set; then :\n  withval=$with_openssl; openssl=\"$withval\"\n     CFLAGS=\"$CFLAGS -I$withval/include\"\n     LDFLAGS=\"$LDFLAGS -L$withval/lib\"\n\nfi\n\n\n\n# Check whether --with-openssl-include was given.\nif test \"${with_openssl_include+set}\" = set; then :\n  withval=$with_openssl_include; openssl_include=\"$withval\"\n     CFLAGS=\"$CFLAGS -I$withval\"\n\nfi\n\n\n\n# Check whether --with-openssl-lib was given.\nif test \"${with_openssl_lib+set}\" = set; then :\n  withval=$with_openssl_lib; openssl_lib=\"$withval\"\n     LDFLAGS=\"$LDFLAGS -L$withval\"\n\nfi\n\n\n  for ac_header in openssl/evp.h openssl/rsa.h openssl/rand.h openssl/err.h openssl/sha.h openssl/pem.h openssl/engine.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_mongrel \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\"\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nelse\n  as_fn_error $? \"OpenSSL header files not found.\" \"$LINENO\" 5; break\n\nfi\n\ndone\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for EVP_EncryptInit_ex in -lcrypto\" >&5\n$as_echo_n \"checking for EVP_EncryptInit_ex in -lcrypto... \" >&6; }\nif ${ac_cv_lib_crypto_EVP_EncryptInit_ex+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lcrypto  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar EVP_EncryptInit_ex ();\nint\nmain ()\n{\nreturn EVP_EncryptInit_ex ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_crypto_EVP_EncryptInit_ex=yes\nelse\n  ac_cv_lib_crypto_EVP_EncryptInit_ex=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_crypto_EVP_EncryptInit_ex\" >&5\n$as_echo \"$ac_cv_lib_crypto_EVP_EncryptInit_ex\" >&6; }\nif test \"x$ac_cv_lib_crypto_EVP_EncryptInit_ex\" = xyes; then :\n  LIBS=\"-lcrypto $LIBS\"\nelse\n  as_fn_error $? \"OpenSSL libraries not found.\" \"$LINENO\" 5\n\nfi\n\n\n  for ac_func in RAND_pseudo_bytes EVP_EncryptInit_ex\ndo :\n  as_ac_var=`$as_echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\nac_fn_c_check_func \"$LINENO\" \"$ac_func\" \"$as_ac_var\"\nif eval test \\\"x\\$\"$as_ac_var\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nelse\n  as_fn_error $? \"Missing OpenSSL functionality, make sure you have installed the latest version.\" \"$LINENO\" 5; break\nfi\ndone\n\n\n  ac_fn_c_check_decl \"$LINENO\" \"OpenSSL_add_all_algorithms\" \"ac_cv_have_decl_OpenSSL_add_all_algorithms\" \"#include <openssl/evp.h>\n\n\"\nif test \"x$ac_cv_have_decl_OpenSSL_add_all_algorithms\" = xyes; then :\n\nelse\n  as_fn_error $? \"Missing OpenSSL functionality, make sure you have installed the latest version.\" \"$LINENO\" 5; break\nfi\n\n\n\n$as_echo \"#define USE_CRYPTO_OPENSSL 1\" >>confdefs.h\n\n    ;;\n  polarssl)\n\n\n\n# Check whether --with-polarssl was given.\nif test \"${with_polarssl+set}\" = set; then :\n  withval=$with_polarssl; polarssl=\"$withval\"\n     CFLAGS=\"$CFLAGS -I$withval/include\"\n     LDFLAGS=\"$LDFLAGS -L$withval/lib\"\n\nfi\n\n\n\n# Check whether --with-polarssl-include was given.\nif test \"${with_polarssl_include+set}\" = set; then :\n  withval=$with_polarssl_include; polarssl_include=\"$withval\"\n     CFLAGS=\"$CFLAGS -I$withval\"\n\nfi\n\n\n\n# Check whether --with-polarssl-lib was given.\nif test \"${with_polarssl_lib+set}\" = set; then :\n  withval=$with_polarssl_lib; polarssl_lib=\"$withval\"\n     LDFLAGS=\"$LDFLAGS -L$withval\"\n\nfi\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for cipher_init_ctx in -lpolarssl\" >&5\n$as_echo_n \"checking for cipher_init_ctx in -lpolarssl... \" >&6; }\nif ${ac_cv_lib_polarssl_cipher_init_ctx+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lpolarssl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar cipher_init_ctx ();\nint\nmain ()\n{\nreturn cipher_init_ctx ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_polarssl_cipher_init_ctx=yes\nelse\n  ac_cv_lib_polarssl_cipher_init_ctx=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_polarssl_cipher_init_ctx\" >&5\n$as_echo \"$ac_cv_lib_polarssl_cipher_init_ctx\" >&6; }\nif test \"x$ac_cv_lib_polarssl_cipher_init_ctx\" = xyes; then :\n  LIBS=\"-lpolarssl $LIBS\"\nelse\n  as_fn_error $? \"PolarSSL libraries not found.\" \"$LINENO\" 5\n\nfi\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking polarssl version\" >&5\n$as_echo_n \"checking polarssl version... \" >&6; }\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#include <polarssl/version.h>\n\nint\nmain ()\n{\n\n#if POLARSSL_VERSION_NUMBER < 0x01020500\n#error invalid version\n#endif\n\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ok\" >&5\n$as_echo \"ok\" >&6; }\nelse\n  as_fn_error $? \"PolarSSL 1.2.5 or newer required\" \"$LINENO\" 5\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\n\n$as_echo \"#define USE_CRYPTO_POLARSSL 1\" >>confdefs.h\n\n    ;;\n  mbedtls)\n\n\n\n# Check whether --with-mbedtls was given.\nif test \"${with_mbedtls+set}\" = set; then :\n  withval=$with_mbedtls; mbedtls=\"$withval\"\n     CFLAGS=\"$CFLAGS -I$withval/include\"\n     LDFLAGS=\"$LDFLAGS -L$withval/lib\"\n\nfi\n\n\n\n# Check whether --with-mbedtls-include was given.\nif test \"${with_mbedtls_include+set}\" = set; then :\n  withval=$with_mbedtls_include; mbedtls_include=\"$withval\"\n     CFLAGS=\"$CFLAGS -I$withval\"\n\nfi\n\n\n\n# Check whether --with-mbedtls-lib was given.\nif test \"${with_mbedtls_lib+set}\" = set; then :\n  withval=$with_mbedtls_lib; mbedtls_lib=\"$withval\"\n     LDFLAGS=\"$LDFLAGS -L$withval\"\n\nfi\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for mbedtls_cipher_setup in -lmbedcrypto\" >&5\n$as_echo_n \"checking for mbedtls_cipher_setup in -lmbedcrypto... \" >&6; }\nif ${ac_cv_lib_mbedcrypto_mbedtls_cipher_setup+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lmbedcrypto  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar mbedtls_cipher_setup ();\nint\nmain ()\n{\nreturn mbedtls_cipher_setup ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_mbedcrypto_mbedtls_cipher_setup=yes\nelse\n  ac_cv_lib_mbedcrypto_mbedtls_cipher_setup=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_mbedcrypto_mbedtls_cipher_setup\" >&5\n$as_echo \"$ac_cv_lib_mbedcrypto_mbedtls_cipher_setup\" >&6; }\nif test \"x$ac_cv_lib_mbedcrypto_mbedtls_cipher_setup\" = xyes; then :\n  LIBS=\"-lmbedcrypto $LIBS\"\nelse\n  as_fn_error $? \"mbed TLS libraries not found.\" \"$LINENO\" 5\n\nfi\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether mbedtls supports Cipher Feedback mode or not\" >&5\n$as_echo_n \"checking whether mbedtls supports Cipher Feedback mode or not... \" >&6; }\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#include <mbedtls/config.h>\n\nint\nmain ()\n{\n\n#ifndef MBEDTLS_CIPHER_MODE_CFB\n#error Cipher Feedback mode a.k.a CFB not supported by your mbed TLS.\n#endif\n\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ok\" >&5\n$as_echo \"ok\" >&6; }\nelse\n  as_fn_error $? \"MBEDTLS_CIPHER_MODE_CFB required\" \"$LINENO\" 5\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether mbedtls supports the ARC4 stream cipher or not\" >&5\n$as_echo_n \"checking whether mbedtls supports the ARC4 stream cipher or not... \" >&6; }\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#include <mbedtls/config.h>\n\nint\nmain ()\n{\n\n#ifndef MBEDTLS_ARC4_C\n#error the ARC4 stream cipher not supported by your mbed TLS.\n#endif\n\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ok\" >&5\n$as_echo \"ok\" >&6; }\nelse\n  as_fn_error $? \"MBEDTLS_ARC4_C required\" \"$LINENO\" 5\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether mbedtls supports the Blowfish block cipher or not\" >&5\n$as_echo_n \"checking whether mbedtls supports the Blowfish block cipher or not... \" >&6; }\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#include <mbedtls/config.h>\n\nint\nmain ()\n{\n\n#ifndef MBEDTLS_BLOWFISH_C\n#error the Blowfish block cipher not supported by your mbed TLS.\n#endif\n\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ok\" >&5\n$as_echo \"ok\" >&6; }\nelse\n  as_fn_error $? \"MBEDTLS_BLOWFISH_C required\" \"$LINENO\" 5\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether mbedtls supports the Camellia block cipher or not\" >&5\n$as_echo_n \"checking whether mbedtls supports the Camellia block cipher or not... \" >&6; }\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#include <mbedtls/config.h>\n\nint\nmain ()\n{\n\n#ifndef MBEDTLS_CAMELLIA_C\n#error the Camellia block cipher not supported by your mbed TLS.\n#endif\n\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ok\" >&5\n$as_echo \"ok\" >&6; }\nelse\n  as_fn_error $? \"MBEDTLS_CAMELLIA_C required\" \"$LINENO\" 5\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\n\n$as_echo \"#define USE_CRYPTO_MBEDTLS 1\" >>confdefs.h\n\n    ;;\nesac\n\n# Check whether --enable-applecc was given.\nif test \"${enable_applecc+set}\" = set; then :\n  enableval=$enable_applecc;\n    for ac_header in CommonCrypto/CommonCrypto.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"CommonCrypto/CommonCrypto.h\" \"ac_cv_header_CommonCrypto_CommonCrypto_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_CommonCrypto_CommonCrypto_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_COMMONCRYPTO_COMMONCRYPTO_H 1\n_ACEOF\n\nelse\n  as_fn_error $? \"CommonCrypto header files not found.\" \"$LINENO\" 5; break\n\nfi\n\ndone\n\n    for ac_func in CCCryptorCreateWithMode\ndo :\n  ac_fn_c_check_func \"$LINENO\" \"CCCryptorCreateWithMode\" \"ac_cv_func_CCCryptorCreateWithMode\"\nif test \"x$ac_cv_func_CCCryptorCreateWithMode\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_CCCRYPTORCREATEWITHMODE 1\n_ACEOF\n\nelse\n  as_fn_error $? \"CommonCrypto API needs OS X (>= 10.7) and iOS (>= 5.0).\" \"$LINENO\" 5; break\n\nfi\ndone\n\n\n$as_echo \"#define USE_CRYPTO_APPLECC 1\" >>confdefs.h\n\n\n\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for C/C++ restrict keyword\" >&5\n$as_echo_n \"checking for C/C++ restrict keyword... \" >&6; }\nif ${ac_cv_c_restrict+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_c_restrict=no\n   # The order here caters to the fact that C++ does not require restrict.\n   for ac_kw in __restrict __restrict__ _Restrict restrict; do\n     cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\ntypedef int * int_ptr;\n\tint foo (int_ptr $ac_kw ip) {\n\treturn ip[0];\n       }\nint\nmain ()\n{\nint s[1];\n\tint * $ac_kw t = s;\n\tt[0] = 0;\n\treturn foo(t)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_c_restrict=$ac_kw\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n     test \"$ac_cv_c_restrict\" != no && break\n   done\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_restrict\" >&5\n$as_echo \"$ac_cv_c_restrict\" >&6; }\n\n case $ac_cv_c_restrict in\n   restrict) ;;\n   no) $as_echo \"#define restrict /**/\" >>confdefs.h\n ;;\n   *)  cat >>confdefs.h <<_ACEOF\n#define restrict $ac_cv_c_restrict\n_ACEOF\n ;;\n esac\n\n\n\n\n  for ac_header in $ac_header_list\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_compile \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\n\"\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n\n\n\n\n\n        HAVE_INET_NTOP=1\n  INET_NTOP_LIB=\n  ss_save_LIBS=$LIBS\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for library containing inet_ntop\" >&5\n$as_echo_n \"checking for library containing inet_ntop... \" >&6; }\nif ${ac_cv_search_inet_ntop+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_func_search_save_LIBS=$LIBS\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar inet_ntop ();\nint\nmain ()\n{\nreturn inet_ntop ();\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_lib in '' nsl resolv; do\n  if test -z \"$ac_lib\"; then\n    ac_res=\"none required\"\n  else\n    ac_res=-l$ac_lib\n    LIBS=\"-l$ac_lib  $ac_func_search_save_LIBS\"\n  fi\n  if ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_search_inet_ntop=$ac_res\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext\n  if ${ac_cv_search_inet_ntop+:} false; then :\n  break\nfi\ndone\nif ${ac_cv_search_inet_ntop+:} false; then :\n\nelse\n  ac_cv_search_inet_ntop=no\nfi\nrm conftest.$ac_ext\nLIBS=$ac_func_search_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_ntop\" >&5\n$as_echo \"$ac_cv_search_inet_ntop\" >&6; }\nac_res=$ac_cv_search_inet_ntop\nif test \"$ac_res\" != no; then :\n  test \"$ac_res\" = \"none required\" || LIBS=\"$ac_res $LIBS\"\n\nelse\n  for ac_func in inet_ntop\ndo :\n  ac_fn_c_check_func \"$LINENO\" \"inet_ntop\" \"ac_cv_func_inet_ntop\"\nif test \"x$ac_cv_func_inet_ntop\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_INET_NTOP 1\n_ACEOF\n\nfi\ndone\n\n     if test $ac_cv_func_inet_ntop = no; then\n       HAVE_INET_NTOP=0\n     fi\n\nfi\n\n  LIBS=$ss_save_LIBS\n\n  if test \"$ac_cv_search_inet_ntop\" != \"no\" \\\n     && test \"$ac_cv_search_inet_ntop\" != \"none required\"; then\n    INET_NTOP_LIB=\"$ac_cv_search_inet_ntop\"\n  fi\n\n\n  ac_fn_c_check_decl \"$LINENO\" \"inet_ntop\" \"ac_cv_have_decl_inet_ntop\" \"#include <arpa/inet.h>\n      #if HAVE_NETDB_H\n      # include <netdb.h>\n      #endif\n\n\"\nif test \"x$ac_cv_have_decl_inet_ntop\" = xyes; then :\n  ac_have_decl=1\nelse\n  ac_have_decl=0\nfi\n\ncat >>confdefs.h <<_ACEOF\n#define HAVE_DECL_INET_NTOP $ac_have_decl\n_ACEOF\n\n  if test $ac_cv_have_decl_inet_ntop = no; then\n    HAVE_DECL_INET_NTOP=0\n  fi\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for what kind of host\" >&5\n$as_echo_n \"checking for what kind of host... \" >&6; }\ncase $host in\n  *-linux*)\n    os_support=linux\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: Linux\" >&5\n$as_echo \"Linux\" >&6; }\n    ;;\n  *-mingw*)\n\n$as_echo \"#define FD_SETSIZE 2048\" >>confdefs.h\n\n\n$as_echo \"#define EV_FD_TO_WIN32_HANDLE(fd) (fd)\" >>confdefs.h\n\n\n$as_echo \"#define EV_WIN32_HANDLE_TO_FD(handle) (handle)\" >>confdefs.h\n\n\n$as_echo \"#define EV_WIN32_CLOSE_FD(fd) closesocket(fd)\" >>confdefs.h\n\n\n    os_support=mingw\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: MinGW\" >&5\n$as_echo \"MinGW\" >&6; }\n    ;;\n  *)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: transparent proxy does not support for $host\" >&5\n$as_echo \"transparent proxy does not support for $host\" >&6; }\n    ;;\nesac\n\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nax_pthread_ok=no\n\n# We used to check for pthread.h first, but this fails if pthread.h\n# requires special compiler flags (e.g. on True64 or Sequent).\n# It gets checked for in the link test anyway.\n\n# First of all, check if the user has set any of the PTHREAD_LIBS,\n# etcetera environment variables, and if threads linking works using\n# them:\nif test x\"$PTHREAD_LIBS$PTHREAD_CFLAGS\" != x; then\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS\" >&5\n$as_echo_n \"checking for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS... \" >&6; }\n        cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar pthread_join ();\nint\nmain ()\n{\nreturn pthread_join ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ax_pthread_ok=yes\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok\" >&5\n$as_echo \"$ax_pthread_ok\" >&6; }\n        if test x\"$ax_pthread_ok\" = xno; then\n                PTHREAD_LIBS=\"\"\n                PTHREAD_CFLAGS=\"\"\n        fi\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\nfi\n\n# We must check for the threads library under a number of different\n# names; the ordering is very important because some systems\n# (e.g. DEC) have both -lpthread and -lpthreads, where one of the\n# libraries is broken (non-POSIX).\n\n# Create a list of thread flags to try.  Items starting with a \"-\" are\n# C compiler flags, and other items are library names, except for \"none\"\n# which indicates that we try without any flags at all, and \"pthread-config\"\n# which is a program returning the flags for the Pth emulation library.\n\nax_pthread_flags=\"pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config\"\n\n# The ordering *is* (sometimes) important.  Some notes on the\n# individual items follow:\n\n# pthreads: AIX (must check this before -lpthread)\n# none: in case threads are in libc; should be tried before -Kthread and\n#       other compiler flags to prevent continual compiler warnings\n# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)\n# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)\n# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)\n# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)\n# -pthreads: Solaris/gcc\n# -mthreads: Mingw32/gcc, Lynx/gcc\n# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it\n#      doesn't hurt to check since this sometimes defines pthreads too;\n#      also defines -D_REENTRANT)\n#      ... -mt is also the pthreads flag for HP/aCC\n# pthread: Linux, etcetera\n# --thread-safe: KAI C++\n# pthread-config: use pthread-config program (for GNU Pth library)\n\ncase ${host_os} in\n        solaris*)\n\n        # On Solaris (at least, for some versions), libc contains stubbed\n        # (non-functional) versions of the pthreads routines, so link-based\n        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/\n        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather\n        # a function called by this macro, so we could check for that, but\n        # who knows whether they'll stub that too in a future libc.)  So,\n        # we'll just look for -pthreads and -lpthread first:\n\n        ax_pthread_flags=\"-pthreads pthread -mt -pthread $ax_pthread_flags\"\n        ;;\nesac\n\n# Clang doesn't consider unrecognized options an error unless we specify\n# -Werror. We throw in some extra Clang-specific options to ensure that\n# this doesn't happen for GCC, which also accepts -Werror.\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if compiler needs -Werror to reject unknown flags\" >&5\n$as_echo_n \"checking if compiler needs -Werror to reject unknown flags... \" >&6; }\nsave_CFLAGS=\"$CFLAGS\"\nax_pthread_extra_flags=\"-Werror\"\nCFLAGS=\"$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nint foo(void);\nint\nmain ()\n{\nfoo()\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  ax_pthread_extra_flags=\n                   { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nCFLAGS=\"$save_CFLAGS\"\n\nif test x\"$ax_pthread_ok\" = xno; then\nfor flag in $ax_pthread_flags; do\n\n        case $flag in\n                none)\n                { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether pthreads work without any flags\" >&5\n$as_echo_n \"checking whether pthreads work without any flags... \" >&6; }\n                ;;\n\n                -*)\n                { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether pthreads work with $flag\" >&5\n$as_echo_n \"checking whether pthreads work with $flag... \" >&6; }\n                PTHREAD_CFLAGS=\"$flag\"\n                ;;\n\n                pthread-config)\n                # Extract the first word of \"pthread-config\", so it can be a program name with args.\nset dummy pthread-config; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ax_pthread_config+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ax_pthread_config\"; then\n  ac_cv_prog_ax_pthread_config=\"$ax_pthread_config\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ax_pthread_config=\"yes\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\n  test -z \"$ac_cv_prog_ax_pthread_config\" && ac_cv_prog_ax_pthread_config=\"no\"\nfi\nfi\nax_pthread_config=$ac_cv_prog_ax_pthread_config\nif test -n \"$ax_pthread_config\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_pthread_config\" >&5\n$as_echo \"$ax_pthread_config\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n                if test x\"$ax_pthread_config\" = xno; then continue; fi\n                PTHREAD_CFLAGS=\"`pthread-config --cflags`\"\n                PTHREAD_LIBS=\"`pthread-config --ldflags` `pthread-config --libs`\"\n                ;;\n\n                *)\n                { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for the pthreads library -l$flag\" >&5\n$as_echo_n \"checking for the pthreads library -l$flag... \" >&6; }\n                PTHREAD_LIBS=\"-l$flag\"\n                ;;\n        esac\n\n        save_LIBS=\"$LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags\"\n\n        # Check for various functions.  We must include pthread.h,\n        # since some functions may be macros.  (On the Sequent, we\n        # need a special flag -Kthread to make this header compile.)\n        # We check for pthread_join because it is in -lpthread on IRIX\n        # while pthread_create is in libc.  We check for pthread_attr_init\n        # due to DEC craziness with -lpthreads.  We check for\n        # pthread_cleanup_push because it is one of the few pthread\n        # functions on Solaris that doesn't have a non-functional libc stub.\n        # We try pthread_create on general principles.\n        cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <pthread.h>\n                        static void routine(void *a) { a = 0; }\n                        static void *start_routine(void *a) { return a; }\nint\nmain ()\n{\npthread_t th; pthread_attr_t attr;\n                        pthread_create(&th, 0, start_routine, 0);\n                        pthread_join(th, 0);\n                        pthread_attr_init(&attr);\n                        pthread_cleanup_push(routine, 0);\n                        pthread_cleanup_pop(0) /* ; */\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ax_pthread_ok=yes\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_pthread_ok\" >&5\n$as_echo \"$ax_pthread_ok\" >&6; }\n        if test \"x$ax_pthread_ok\" = xyes; then\n                break;\n        fi\n\n        PTHREAD_LIBS=\"\"\n        PTHREAD_CFLAGS=\"\"\ndone\nfi\n\n# Various other checks:\nif test \"x$ax_pthread_ok\" = xyes; then\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n\n        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for joinable pthread attribute\" >&5\n$as_echo_n \"checking for joinable pthread attribute... \" >&6; }\n        attr_name=unknown\n        for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do\n            cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <pthread.h>\nint\nmain ()\n{\nint attr = $attr; return attr /* ; */\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  attr_name=$attr; break\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n        done\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $attr_name\" >&5\n$as_echo \"$attr_name\" >&6; }\n        if test \"$attr_name\" != PTHREAD_CREATE_JOINABLE; then\n\ncat >>confdefs.h <<_ACEOF\n#define PTHREAD_CREATE_JOINABLE $attr_name\n_ACEOF\n\n        fi\n\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if more special flags are required for pthreads\" >&5\n$as_echo_n \"checking if more special flags are required for pthreads... \" >&6; }\n        flag=no\n        case ${host_os} in\n            aix* | freebsd* | darwin*) flag=\"-D_THREAD_SAFE\";;\n            osf* | hpux*) flag=\"-D_REENTRANT\";;\n            solaris*)\n            if test \"$GCC\" = \"yes\"; then\n                flag=\"-D_REENTRANT\"\n            else\n                # TODO: What about Clang on Solaris?\n                flag=\"-mt -D_REENTRANT\"\n            fi\n            ;;\n        esac\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $flag\" >&5\n$as_echo \"$flag\" >&6; }\n        if test \"x$flag\" != xno; then\n            PTHREAD_CFLAGS=\"$flag $PTHREAD_CFLAGS\"\n        fi\n\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for PTHREAD_PRIO_INHERIT\" >&5\n$as_echo_n \"checking for PTHREAD_PRIO_INHERIT... \" >&6; }\nif ${ax_cv_PTHREAD_PRIO_INHERIT+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n                cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <pthread.h>\nint\nmain ()\n{\nint i = PTHREAD_PRIO_INHERIT;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ax_cv_PTHREAD_PRIO_INHERIT=yes\nelse\n  ax_cv_PTHREAD_PRIO_INHERIT=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_PRIO_INHERIT\" >&5\n$as_echo \"$ax_cv_PTHREAD_PRIO_INHERIT\" >&6; }\n        if test \"x$ax_cv_PTHREAD_PRIO_INHERIT\" = \"xyes\"; then :\n\n$as_echo \"#define HAVE_PTHREAD_PRIO_INHERIT 1\" >>confdefs.h\n\nfi\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n\n        # More AIX lossage: compile with *_r variant\n        if test \"x$GCC\" != xyes; then\n            case $host_os in\n                aix*)\n                case \"x/$CC\" in #(\n  x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6) :\n    #handle absolute path differently from PATH based program lookup\n                   case \"x$CC\" in #(\n  x/*) :\n    if as_fn_executable_p ${CC}_r; then :\n  PTHREAD_CC=\"${CC}_r\"\nfi ;; #(\n  *) :\n    for ac_prog in ${CC}_r\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_PTHREAD_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$PTHREAD_CC\"; then\n  ac_cv_prog_PTHREAD_CC=\"$PTHREAD_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_PTHREAD_CC=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nPTHREAD_CC=$ac_cv_prog_PTHREAD_CC\nif test -n \"$PTHREAD_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $PTHREAD_CC\" >&5\n$as_echo \"$PTHREAD_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$PTHREAD_CC\" && break\ndone\ntest -n \"$PTHREAD_CC\" || PTHREAD_CC=\"$CC\"\n ;;\nesac ;; #(\n  *) :\n     ;;\nesac\n                ;;\n            esac\n        fi\nfi\n\ntest -n \"$PTHREAD_CC\" || PTHREAD_CC=\"$CC\"\n\n\n\n\n\n# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:\nif test x\"$ax_pthread_ok\" = xyes; then\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n            CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n            CC=\"$PTHREAD_CC\"\n        :\nelse\n        ax_pthread_ok=no\n        as_fn_error $? \"Can not find pthreads.  This is required.\" \"$LINENO\" 5\nfi\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n\n\nggl_check_stack_protector_save_CXXFLAGS=\"$CXXFLAGS\"\nggl_check_stack_protector_save_CFLAGS=\"$CFLAGS\"\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if -fstack-protector and -fstack-protector-all are supported.\" >&5\n$as_echo_n \"checking if -fstack-protector and -fstack-protector-all are supported.... \" >&6; }\n\nCXXFLAGS=\"$CXXFLAGS -fstack-protector\"\nCFLAGS=\"$CFLAGS -fstack-protector\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint main() {\n  return 0;\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ggl_check_stack_protector_ok=yes\nelse\n  ggl_check_stack_protector_ok=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nCXXFLAGS=\"$ggl_check_stack_protector_save_CXXFLAGS -fstack-protector-all\"\nCFLAGS=\"$ggl_check_stack_protector_save_CFLAGS -fstack-protector-all\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint main() {\n  return 0;\n}\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ggl_check_stack_protector_all_ok=yes\nelse\n  ggl_check_stack_protector_all_ok=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nif test \"x$ggl_check_stack_protector_ok\" = \"xyes\" -a \\\n        \"x$ggl_check_stack_protector_all_ok\" = \"xyes\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n  has_stack_protector=yes\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n  has_stack_protector=no\nfi\n\nCXXFLAGS=\"$ggl_check_stack_protector_save_CXXFLAGS\"\nCFLAGS=\"$ggl_check_stack_protector_save_CFLAGS\"\n\n\n# XXX - disable -fstack-protector due to missing libssp_nonshared\ncase \"$host_os\" in\n     *aix*)\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: -fstack-protector disabled on AIX\" >&5\n$as_echo \"$as_me: -fstack-protector disabled on AIX\" >&6;}\n\thas_stack_protector=no\n\t;;\n     *sunos*)\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: -fstack-protector disabled on SunOS\" >&5\n$as_echo \"$as_me: -fstack-protector disabled on SunOS\" >&6;}\n\thas_stack_protector=no\n\t;;\n     *solaris*)\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: -fstack-protector disabled on Solaris\" >&5\n$as_echo \"$as_me: -fstack-protector disabled on Solaris\" >&6;}\n\thas_stack_protector=no\n\t;;\nesac\n\n# Check whether --enable-ssp was given.\nif test \"${enable_ssp+set}\" = set; then :\n  enableval=$enable_ssp;\n  enable_ssp=\"no\"\n\nelse\n\n  enable_ssp=\"yes\"\n\nfi\n\n\nif test x$has_stack_protector = xyes && test x$enable_ssp = xyes; then\n   CFLAGS=\"$CFLAGS -fstack-protector\"\n   { $as_echo \"$as_me:${as_lineno-$LINENO}: -fstack-protector enabled in CFLAGS\" >&5\n$as_echo \"$as_me: -fstack-protector enabled in CFLAGS\" >&6;}\nfi\n\n if test \"$os_support\" = \"linux\"; then\n  BUILD_REDIRECTOR_TRUE=\n  BUILD_REDIRECTOR_FALSE='#'\nelse\n  BUILD_REDIRECTOR_TRUE='#'\n  BUILD_REDIRECTOR_FALSE=\nfi\n\n if test \"$os_support\" = \"mingw\"; then\n  BUILD_WINCOMPAT_TRUE=\n  BUILD_WINCOMPAT_FALSE='#'\nelse\n  BUILD_WINCOMPAT_TRUE='#'\n  BUILD_WINCOMPAT_FALSE=\nfi\n\n\nfor ac_header in limits.h stdint.h inttypes.h arpa/inet.h fcntl.h langinfo.h locale.h netdb.h netinet/in.h stdlib.h string.h strings.h unistd.h sys/ioctl.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_mongrel \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\"\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n\nfor ac_header in sys/socket.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"sys/socket.h\" \"ac_cv_header_sys_socket_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_sys_socket_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_SYS_SOCKET_H 1\n_ACEOF\n\nfi\n\ndone\n\nfor ac_header in net/if.h\ndo :\n  ac_fn_c_check_header_compile \"$LINENO\" \"net/if.h\" \"ac_cv_header_net_if_h\" \"\n#include <stdio.h>\n#ifdef STDC_HEADERS\n# include <stdlib.h>\n# include <stddef.h>\n#else\n# ifdef HAVE_STDLIB_H\n#  include <stdlib.h>\n# endif\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n\n\"\nif test \"x$ac_cv_header_net_if_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_NET_IF_H 1\n_ACEOF\n\nfi\n\ndone\n\n\ncase $host in\n  *-mingw*)\n\n$as_echo \"#define CONNECT_IN_PROGRESS WSAEWOULDBLOCK\" >>confdefs.h\n\n    for ac_header in windows.h winsock2.h ws2tcpip.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_mongrel \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\"\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nelse\n  as_fn_error $? \"Missing MinGW headers\" \"$LINENO\" 5\nfi\n\ndone\n\n    ;;\n  *-linux*)\n\n$as_echo \"#define CONNECT_IN_PROGRESS EINPROGRESS\" >>confdefs.h\n\n        for ac_header in linux/if.h linux/netfilter_ipv4.h linux/netfilter_ipv6/ip6_tables.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_compile \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"\n    #if HAVE_LIMITS_H\n    #include <limits.h>\n    #endif\n    /* Netfilter ip(6)tables v1.4.0 has broken headers */\n    #if HAVE_NETINET_IN_H\n    #include <netinet/in.h>\n    #endif\n    #if HAVE_LINUX_IF_H\n    #include <linux/if.h>\n    #endif\n    #if HAVE_SYS_SOCKET_H\n    #include <sys/socket.h>\n    #endif\n\n\"\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nelse\n  as_fn_error $? \"Missing netfilter headers\" \"$LINENO\" 5\nfi\n\ndone\n\n    ;;\n  *)\n    # These are POSIX-like systems using BSD-like sockets API.\n\n$as_echo \"#define CONNECT_IN_PROGRESS EINPROGRESS\" >>confdefs.h\n\n    ;;\nesac\n\n { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian\" >&5\n$as_echo_n \"checking whether byte ordering is bigendian... \" >&6; }\nif ${ac_cv_c_bigendian+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_c_bigendian=unknown\n    # See if we're dealing with a universal compiler.\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifndef __APPLE_CC__\n\t       not a universal capable compiler\n\t     #endif\n\t     typedef int dummy;\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\n\t# Check for potential -arch flags.  It is not universal unless\n\t# there are at least two -arch flags with different values.\n\tac_arch=\n\tac_prev=\n\tfor ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do\n\t if test -n \"$ac_prev\"; then\n\t   case $ac_word in\n\t     i?86 | x86_64 | ppc | ppc64)\n\t       if test -z \"$ac_arch\" || test \"$ac_arch\" = \"$ac_word\"; then\n\t\t ac_arch=$ac_word\n\t       else\n\t\t ac_cv_c_bigendian=universal\n\t\t break\n\t       fi\n\t       ;;\n\t   esac\n\t   ac_prev=\n\t elif test \"x$ac_word\" = \"x-arch\"; then\n\t   ac_prev=arch\n\t fi\n       done\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n    if test $ac_cv_c_bigendian = unknown; then\n      # See if sys/param.h defines the BYTE_ORDER macro.\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <sys/types.h>\n\t     #include <sys/param.h>\n\nint\nmain ()\n{\n#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \\\n\t\t     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \\\n\t\t     && LITTLE_ENDIAN)\n\t      bogus endian macros\n\t     #endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  # It does; now see whether it defined to BIG_ENDIAN or not.\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <sys/types.h>\n\t\t#include <sys/param.h>\n\nint\nmain ()\n{\n#if BYTE_ORDER != BIG_ENDIAN\n\t\t not big endian\n\t\t#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_c_bigendian=yes\nelse\n  ac_cv_c_bigendian=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n    fi\n    if test $ac_cv_c_bigendian = unknown; then\n      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <limits.h>\n\nint\nmain ()\n{\n#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)\n\t      bogus endian macros\n\t     #endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  # It does; now see whether it defined to _BIG_ENDIAN or not.\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <limits.h>\n\nint\nmain ()\n{\n#ifndef _BIG_ENDIAN\n\t\t not big endian\n\t\t#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_c_bigendian=yes\nelse\n  ac_cv_c_bigendian=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n    fi\n    if test $ac_cv_c_bigendian = unknown; then\n      # Compile a test program.\n      if test \"$cross_compiling\" = yes; then :\n  # Try to guess by grepping values from an object file.\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nshort int ascii_mm[] =\n\t\t  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };\n\t\tshort int ascii_ii[] =\n\t\t  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };\n\t\tint use_ascii (int i) {\n\t\t  return ascii_mm[i] + ascii_ii[i];\n\t\t}\n\t\tshort int ebcdic_ii[] =\n\t\t  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };\n\t\tshort int ebcdic_mm[] =\n\t\t  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };\n\t\tint use_ebcdic (int i) {\n\t\t  return ebcdic_mm[i] + ebcdic_ii[i];\n\t\t}\n\t\textern int foo;\n\nint\nmain ()\n{\nreturn use_ascii (foo) == use_ebcdic (foo);\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then\n\t      ac_cv_c_bigendian=yes\n\t    fi\n\t    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then\n\t      if test \"$ac_cv_c_bigendian\" = unknown; then\n\t\tac_cv_c_bigendian=no\n\t      else\n\t\t# finding both strings is unlikely to happen, but who knows?\n\t\tac_cv_c_bigendian=unknown\n\t      fi\n\t    fi\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain ()\n{\n\n\t     /* Are we little or big endian?  From Harbison&Steele.  */\n\t     union\n\t     {\n\t       long int l;\n\t       char c[sizeof (long int)];\n\t     } u;\n\t     u.l = 1;\n\t     return u.c[sizeof (long int) - 1] == 1;\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n  ac_cv_c_bigendian=no\nelse\n  ac_cv_c_bigendian=yes\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\n    fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian\" >&5\n$as_echo \"$ac_cv_c_bigendian\" >&6; }\n case $ac_cv_c_bigendian in #(\n   yes)\n     $as_echo \"#define WORDS_BIGENDIAN 1\" >>confdefs.h\n;; #(\n   no)\n      ;; #(\n   universal)\n\n$as_echo \"#define AC_APPLE_UNIVERSAL_BUILD 1\" >>confdefs.h\n\n     ;; #(\n   *)\n     as_fn_error $? \"unknown endianness\n presetting ac_cv_c_bigendian=no (or yes) will help\" \"$LINENO\" 5 ;;\n esac\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for inline\" >&5\n$as_echo_n \"checking for inline... \" >&6; }\nif ${ac_cv_c_inline+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_c_inline=no\nfor ac_kw in inline __inline__ __inline; do\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifndef __cplusplus\ntypedef int foo_t;\nstatic $ac_kw foo_t static_foo () {return 0; }\n$ac_kw foo_t foo () {return 0; }\n#endif\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_c_inline=$ac_kw\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  test \"$ac_cv_c_inline\" != no && break\ndone\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline\" >&5\n$as_echo \"$ac_cv_c_inline\" >&6; }\n\ncase $ac_cv_c_inline in\n  inline | yes) ;;\n  *)\n    case $ac_cv_c_inline in\n      no) ac_val=;;\n      *) ac_val=$ac_cv_c_inline;;\n    esac\n    cat >>confdefs.h <<_ACEOF\n#ifndef __cplusplus\n#define inline $ac_val\n#endif\n_ACEOF\n    ;;\nesac\n\nac_fn_c_check_type \"$LINENO\" \"ssize_t\" \"ac_cv_type_ssize_t\" \"$ac_includes_default\"\nif test \"x$ac_cv_type_ssize_t\" = xyes; then :\n\nelse\n\ncat >>confdefs.h <<_ACEOF\n#define ssize_t int\n_ACEOF\n\nfi\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to enable assertions\" >&5\n$as_echo_n \"checking whether to enable assertions... \" >&6; }\n  # Check whether --enable-assert was given.\nif test \"${enable_assert+set}\" = set; then :\n  enableval=$enable_assert; ac_enable_assert=$enableval\n     if       test \"x$enableval\" = xno; then :\n\n$as_echo \"#define NDEBUG 1\" >>confdefs.h\n\nelif test \"x$enableval\" != xyes; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: invalid argument supplied to --enable-assert\" >&5\n$as_echo \"$as_me: WARNING: invalid argument supplied to --enable-assert\" >&2;}\n\tac_enable_assert=yes\nfi\nelse\n  ac_enable_assert=yes\nfi\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_enable_assert\" >&5\n$as_echo \"$ac_enable_assert\" >&6; }\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ANSI C header files\" >&5\n$as_echo_n \"checking for ANSI C header files... \" >&6; }\nif ${ac_cv_header_stdc+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <float.h>\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_header_stdc=yes\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nif test $ac_cv_header_stdc = yes; then\n  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <string.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"memchr\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"free\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.\n  if test \"$cross_compiling\" = yes; then :\n  :\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ctype.h>\n#include <stdlib.h>\n#if ((' ' & 0x0FF) == 0x020)\n# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')\n# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))\n#else\n# define ISLOWER(c) \\\n\t\t   (('a' <= (c) && (c) <= 'i') \\\n\t\t     || ('j' <= (c) && (c) <= 'r') \\\n\t\t     || ('s' <= (c) && (c) <= 'z'))\n# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))\n#endif\n\n#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))\nint\nmain ()\n{\n  int i;\n  for (i = 0; i < 256; i++)\n    if (XOR (islower (i), ISLOWER (i))\n\t|| toupper (i) != TOUPPER (i))\n      return 2;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc\" >&5\n$as_echo \"$ac_cv_header_stdc\" >&6; }\nif test $ac_cv_header_stdc = yes; then\n\n$as_echo \"#define STDC_HEADERS 1\" >>confdefs.h\n\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for sys/wait.h that is POSIX.1 compatible\" >&5\n$as_echo_n \"checking for sys/wait.h that is POSIX.1 compatible... \" >&6; }\nif ${ac_cv_header_sys_wait_h+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <sys/types.h>\n#include <sys/wait.h>\n#ifndef WEXITSTATUS\n# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8)\n#endif\n#ifndef WIFEXITED\n# define WIFEXITED(stat_val) (((stat_val) & 255) == 0)\n#endif\n\nint\nmain ()\n{\n  int s;\n  wait (&s);\n  s = WIFEXITED (s) ? WEXITSTATUS (s) : 1;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_header_sys_wait_h=yes\nelse\n  ac_cv_header_sys_wait_h=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_sys_wait_h\" >&5\n$as_echo \"$ac_cv_header_sys_wait_h\" >&6; }\nif test $ac_cv_header_sys_wait_h = yes; then\n\n$as_echo \"#define HAVE_SYS_WAIT_H 1\" >>confdefs.h\n\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for an ANSI C-conforming const\" >&5\n$as_echo_n \"checking for an ANSI C-conforming const... \" >&6; }\nif ${ac_cv_c_const+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n#ifndef __cplusplus\n  /* Ultrix mips cc rejects this sort of thing.  */\n  typedef int charset[2];\n  const charset cs = { 0, 0 };\n  /* SunOS 4.1.1 cc rejects this.  */\n  char const *const *pcpcc;\n  char **ppc;\n  /* NEC SVR4.0.2 mips cc rejects this.  */\n  struct point {int x, y;};\n  static struct point const zero = {0,0};\n  /* AIX XL C 1.02.0.0 rejects this.\n     It does not let you subtract one const X* pointer from another in\n     an arm of an if-expression whose if-part is not a constant\n     expression */\n  const char *g = \"string\";\n  pcpcc = &g + (g ? g-g : 0);\n  /* HPUX 7.0 cc rejects these. */\n  ++pcpcc;\n  ppc = (char**) pcpcc;\n  pcpcc = (char const *const *) ppc;\n  { /* SCO 3.2v4 cc rejects this sort of thing.  */\n    char tx;\n    char *t = &tx;\n    char const *s = 0 ? (char *) 0 : (char const *) 0;\n\n    *t++ = 0;\n    if (s) return 0;\n  }\n  { /* Someone thinks the Sun supposedly-ANSI compiler will reject this.  */\n    int x[] = {25, 17};\n    const int *foo = &x[0];\n    ++foo;\n  }\n  { /* Sun SC1.0 ANSI compiler rejects this -- but not the above. */\n    typedef const int *iptr;\n    iptr p = 0;\n    ++p;\n  }\n  { /* AIX XL C 1.02.0.0 rejects this sort of thing, saying\n       \"k.c\", line 2.27: 1506-025 (S) Operand must be a modifiable lvalue. */\n    struct s { int j; const int *ap[3]; } bx;\n    struct s *b = &bx; b->j = 5;\n  }\n  { /* ULTRIX-32 V3.1 (Rev 9) vcc rejects this */\n    const int foo = 10;\n    if (!foo) return 0;\n  }\n  return !cs[0] && !zero.x;\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_c_const=yes\nelse\n  ac_cv_c_const=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_const\" >&5\n$as_echo \"$ac_cv_c_const\" >&6; }\nif test $ac_cv_c_const = no; then\n\n$as_echo \"#define const /**/\" >>confdefs.h\n\nfi\n\nac_fn_c_check_type \"$LINENO\" \"pid_t\" \"ac_cv_type_pid_t\" \"$ac_includes_default\"\nif test \"x$ac_cv_type_pid_t\" = xyes; then :\n\nelse\n\ncat >>confdefs.h <<_ACEOF\n#define pid_t int\n_ACEOF\n\nfi\n\nac_fn_c_check_type \"$LINENO\" \"size_t\" \"ac_cv_type_size_t\" \"$ac_includes_default\"\nif test \"x$ac_cv_type_size_t\" = xyes; then :\n\nelse\n\ncat >>confdefs.h <<_ACEOF\n#define size_t unsigned int\n_ACEOF\n\nfi\n\nac_fn_c_check_type \"$LINENO\" \"ssize_t\" \"ac_cv_type_ssize_t\" \"$ac_includes_default\"\nif test \"x$ac_cv_type_ssize_t\" = xyes; then :\n\nelse\n\ncat >>confdefs.h <<_ACEOF\n#define ssize_t int\n_ACEOF\n\nfi\n\nac_fn_c_find_uintX_t \"$LINENO\" \"16\" \"ac_cv_c_uint16_t\"\ncase $ac_cv_c_uint16_t in #(\n  no|yes) ;; #(\n  *)\n\n\ncat >>confdefs.h <<_ACEOF\n#define uint16_t $ac_cv_c_uint16_t\n_ACEOF\n;;\n  esac\n\nac_fn_c_find_uintX_t \"$LINENO\" \"8\" \"ac_cv_c_uint8_t\"\ncase $ac_cv_c_uint8_t in #(\n  no|yes) ;; #(\n  *)\n\n$as_echo \"#define _UINT8_T 1\" >>confdefs.h\n\n\ncat >>confdefs.h <<_ACEOF\n#define uint8_t $ac_cv_c_uint8_t\n_ACEOF\n;;\n  esac\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether time.h and sys/time.h may both be included\" >&5\n$as_echo_n \"checking whether time.h and sys/time.h may both be included... \" >&6; }\nif ${ac_cv_header_time+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <sys/types.h>\n#include <sys/time.h>\n#include <time.h>\n\nint\nmain ()\n{\nif ((struct tm *) 0)\nreturn 0;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_header_time=yes\nelse\n  ac_cv_header_time=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_time\" >&5\n$as_echo \"$ac_cv_header_time\" >&6; }\nif test $ac_cv_header_time = yes; then\n\n$as_echo \"#define TIME_WITH_SYS_TIME 1\" >>confdefs.h\n\nfi\n\n\nfor ac_header in vfork.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"vfork.h\" \"ac_cv_header_vfork_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_vfork_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_VFORK_H 1\n_ACEOF\n\nfi\n\ndone\n\nfor ac_func in fork vfork\ndo :\n  as_ac_var=`$as_echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\nac_fn_c_check_func \"$LINENO\" \"$ac_func\" \"$as_ac_var\"\nif eval test \\\"x\\$\"$as_ac_var\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\nif test \"x$ac_cv_func_fork\" = xyes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for working fork\" >&5\n$as_echo_n \"checking for working fork... \" >&6; }\nif ${ac_cv_func_fork_works+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test \"$cross_compiling\" = yes; then :\n  ac_cv_func_fork_works=cross\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain ()\n{\n\n\t  /* By Ruediger Kuhlmann. */\n\t  return fork () < 0;\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n  ac_cv_func_fork_works=yes\nelse\n  ac_cv_func_fork_works=no\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_fork_works\" >&5\n$as_echo \"$ac_cv_func_fork_works\" >&6; }\n\nelse\n  ac_cv_func_fork_works=$ac_cv_func_fork\nfi\nif test \"x$ac_cv_func_fork_works\" = xcross; then\n  case $host in\n    *-*-amigaos* | *-*-msdosdjgpp*)\n      # Override, as these systems have only a dummy fork() stub\n      ac_cv_func_fork_works=no\n      ;;\n    *)\n      ac_cv_func_fork_works=yes\n      ;;\n  esac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation\" >&5\n$as_echo \"$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation\" >&2;}\nfi\nac_cv_func_vfork_works=$ac_cv_func_vfork\nif test \"x$ac_cv_func_vfork\" = xyes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for working vfork\" >&5\n$as_echo_n \"checking for working vfork... \" >&6; }\nif ${ac_cv_func_vfork_works+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test \"$cross_compiling\" = yes; then :\n  ac_cv_func_vfork_works=cross\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n/* Thanks to Paul Eggert for this test.  */\n$ac_includes_default\n#include <sys/wait.h>\n#ifdef HAVE_VFORK_H\n# include <vfork.h>\n#endif\n/* On some sparc systems, changes by the child to local and incoming\n   argument registers are propagated back to the parent.  The compiler\n   is told about this with #include <vfork.h>, but some compilers\n   (e.g. gcc -O) don't grok <vfork.h>.  Test for this by using a\n   static variable whose address is put into a register that is\n   clobbered by the vfork.  */\nstatic void\n#ifdef __cplusplus\nsparc_address_test (int arg)\n# else\nsparc_address_test (arg) int arg;\n#endif\n{\n  static pid_t child;\n  if (!child) {\n    child = vfork ();\n    if (child < 0) {\n      perror (\"vfork\");\n      _exit(2);\n    }\n    if (!child) {\n      arg = getpid();\n      write(-1, \"\", 0);\n      _exit (arg);\n    }\n  }\n}\n\nint\nmain ()\n{\n  pid_t parent = getpid ();\n  pid_t child;\n\n  sparc_address_test (0);\n\n  child = vfork ();\n\n  if (child == 0) {\n    /* Here is another test for sparc vfork register problems.  This\n       test uses lots of local variables, at least as many local\n       variables as main has allocated so far including compiler\n       temporaries.  4 locals are enough for gcc 1.40.3 on a Solaris\n       4.1.3 sparc, but we use 8 to be safe.  A buggy compiler should\n       reuse the register of parent for one of the local variables,\n       since it will think that parent can't possibly be used any more\n       in this routine.  Assigning to the local variable will thus\n       munge parent in the parent process.  */\n    pid_t\n      p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(),\n      p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid();\n    /* Convince the compiler that p..p7 are live; otherwise, it might\n       use the same hardware register for all 8 local variables.  */\n    if (p != p1 || p != p2 || p != p3 || p != p4\n\t|| p != p5 || p != p6 || p != p7)\n      _exit(1);\n\n    /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent\n       from child file descriptors.  If the child closes a descriptor\n       before it execs or exits, this munges the parent's descriptor\n       as well.  Test for this by closing stdout in the child.  */\n    _exit(close(fileno(stdout)) != 0);\n  } else {\n    int status;\n    struct stat st;\n\n    while (wait(&status) != child)\n      ;\n    return (\n\t /* Was there some problem with vforking?  */\n\t child < 0\n\n\t /* Did the child fail?  (This shouldn't happen.)  */\n\t || status\n\n\t /* Did the vfork/compiler bug occur?  */\n\t || parent != getpid()\n\n\t /* Did the file descriptor bug occur?  */\n\t || fstat(fileno(stdout), &st) != 0\n\t );\n  }\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n  ac_cv_func_vfork_works=yes\nelse\n  ac_cv_func_vfork_works=no\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_vfork_works\" >&5\n$as_echo \"$ac_cv_func_vfork_works\" >&6; }\n\nfi;\nif test \"x$ac_cv_func_fork_works\" = xcross; then\n  ac_cv_func_vfork_works=$ac_cv_func_vfork\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation\" >&5\n$as_echo \"$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation\" >&2;}\nfi\n\nif test \"x$ac_cv_func_vfork_works\" = xyes; then\n\n$as_echo \"#define HAVE_WORKING_VFORK 1\" >>confdefs.h\n\nelse\n\n$as_echo \"#define vfork fork\" >>confdefs.h\n\nfi\nif test \"x$ac_cv_func_fork_works\" = xyes; then\n\n$as_echo \"#define HAVE_WORKING_FORK 1\" >>confdefs.h\n\nfi\n\nfor ac_header in sys/select.h sys/socket.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_mongrel \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\"\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking types of arguments for select\" >&5\n$as_echo_n \"checking types of arguments for select... \" >&6; }\nif ${ac_cv_func_select_args+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  for ac_arg234 in 'fd_set *' 'int *' 'void *'; do\n for ac_arg1 in 'int' 'size_t' 'unsigned long int' 'unsigned int'; do\n  for ac_arg5 in 'struct timeval *' 'const struct timeval *'; do\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\n#ifdef HAVE_SYS_SELECT_H\n# include <sys/select.h>\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n\nint\nmain ()\n{\nextern int select ($ac_arg1,\n\t\t\t\t\t    $ac_arg234, $ac_arg234, $ac_arg234,\n\t\t\t\t\t    $ac_arg5);\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_func_select_args=\"$ac_arg1,$ac_arg234,$ac_arg5\"; break 3\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  done\n done\ndone\n# Provide a safe default value.\n: \"${ac_cv_func_select_args=int,int *,struct timeval *}\"\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_func_select_args\" >&5\n$as_echo \"$ac_cv_func_select_args\" >&6; }\nac_save_IFS=$IFS; IFS=','\nset dummy `echo \"$ac_cv_func_select_args\" | sed 's/\\*/\\*/g'`\nIFS=$ac_save_IFS\nshift\n\ncat >>confdefs.h <<_ACEOF\n#define SELECT_TYPE_ARG1 $1\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define SELECT_TYPE_ARG234 ($2)\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define SELECT_TYPE_ARG5 ($3)\n_ACEOF\n\nrm -f conftest*\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking return type of signal handlers\" >&5\n$as_echo_n \"checking return type of signal handlers... \" >&6; }\nif ${ac_cv_type_signal+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <sys/types.h>\n#include <signal.h>\n\nint\nmain ()\n{\nreturn *(signal (0, 0)) (0) == 1;\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_type_signal=int\nelse\n  ac_cv_type_signal=void\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_type_signal\" >&5\n$as_echo \"$ac_cv_type_signal\" >&6; }\n\ncat >>confdefs.h <<_ACEOF\n#define RETSIGTYPE $ac_cv_type_signal\n_ACEOF\n\n\nfor ac_func in memset select setresuid setreuid strerror getpwnam_r setrlimit\ndo :\n  as_ac_var=`$as_echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\nac_fn_c_check_func \"$LINENO\" \"$ac_func\" \"$as_ac_var\"\nif eval test \\\"x\\$\"$as_ac_var\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nif test \"$ac_cv_func_select\" != \"yes\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for select in ws2_32\" >&5\n$as_echo_n \"checking for select in ws2_32... \" >&6; }\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#ifdef HAVE_WINSOCK2_H\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n#include <winsock2.h>\n#endif\n\nint\nmain ()\n{\n\n      select(0,(fd_set *)NULL,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL);\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n      HAVE_SELECT=\"1\"\n\ncat >>confdefs.h <<_ACEOF\n#define HAVE_SELECT 1\n_ACEOF\n\n      HAVE_SYS_SELECT_H=\"1\"\n\ncat >>confdefs.h <<_ACEOF\n#define HAVE_SYS_SELECT_H 1\n_ACEOF\n\n\nelse\n\n      as_fn_error $? \"no\" \"$LINENO\" 5\n\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for connect in -lsocket\" >&5\n$as_echo_n \"checking for connect in -lsocket... \" >&6; }\nif ${ac_cv_lib_socket_connect+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lsocket  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar connect ();\nint\nmain ()\n{\nreturn connect ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_socket_connect=yes\nelse\n  ac_cv_lib_socket_connect=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_socket_connect\" >&5\n$as_echo \"$ac_cv_lib_socket_connect\" >&6; }\nif test \"x$ac_cv_lib_socket_connect\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_LIBSOCKET 1\n_ACEOF\n\n  LIBS=\"-lsocket $LIBS\"\n\nfi\n\n\nfor ac_func in malloc memset socket\ndo :\n  as_ac_var=`$as_echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\nac_fn_c_check_func \"$LINENO\" \"$ac_func\" \"$as_ac_var\"\nif eval test \\\"x\\$\"$as_ac_var\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\n\n$as_echo \"#define HAVE_IPv6 1\" >>confdefs.h\n\n\n\n\nif test -z \"$USE_SYSTEM_SHARED_LIB_TRUE\"; then :\n  else\n  subdirs=\"$subdirs libsodium\"\n\nfi\n\nac_config_files=\"$ac_config_files shadowsocks-libev.pc Makefile libcork/Makefile libipset/Makefile src/Makefile\"\n\nif test -z \"$USE_SYSTEM_SHARED_LIB_TRUE\"; then :\n  else\n  ac_config_files=\"$ac_config_files libudns/Makefile libev/Makefile\"\n\nfi\n\nif test -z \"$ENABLE_DOCUMENTATION_TRUE\"; then :\n  ac_config_files=\"$ac_config_files doc/Makefile\"\n\n\nfi\n\ncat >confcache <<\\_ACEOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs, see configure's option --config-cache.\n# It is not useful on other systems.  If it contains results you don't\n# want to keep, you may remove or edit it.\n#\n# config.status only pays attention to the cache file if you give it\n# the --recheck option to rerun configure.\n#\n# `ac_cv_env_foo' variables (set or unset) will be overridden when\n# loading this file, other *unset* `ac_cv_foo' will be assigned the\n# following values.\n\n_ACEOF\n\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, we kill variables containing newlines.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n(\n  for ac_var in `(set) 2>&1 | sed -n 's/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n\n  (set) 2>&1 |\n    case $as_nl`(ac_space=' '; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      # `set' does not quote correctly, so add quotes: double-quote\n      # substitution turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\.\n      sed -n \\\n\t\"s/'/'\\\\\\\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\\\2'/p\"\n      ;; #(\n    *)\n      # `set' quotes correctly as required by POSIX, so do not add quotes.\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n) |\n  sed '\n     /^ac_cv_env_/b end\n     t clear\n     :clear\n     s/^\\([^=]*\\)=\\(.*[{}].*\\)$/test \"${\\1+set}\" = set || &/\n     t end\n     s/^\\([^=]*\\)=\\(.*\\)$/\\1=${\\1=\\2}/\n     :end' >>confcache\nif diff \"$cache_file\" confcache >/dev/null 2>&1; then :; else\n  if test -w \"$cache_file\"; then\n    if test \"x$cache_file\" != \"x/dev/null\"; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: updating cache $cache_file\" >&5\n$as_echo \"$as_me: updating cache $cache_file\" >&6;}\n      if test ! -f \"$cache_file\" || test -h \"$cache_file\"; then\n\tcat confcache >\"$cache_file\"\n      else\n        case $cache_file in #(\n        */* | ?:*)\n\t  mv -f confcache \"$cache_file\"$$ &&\n\t  mv -f \"$cache_file\"$$ \"$cache_file\" ;; #(\n        *)\n\t  mv -f confcache \"$cache_file\" ;;\n\tesac\n      fi\n    fi\n  else\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file\" >&5\n$as_echo \"$as_me: not updating unwritable cache $cache_file\" >&6;}\n  fi\nfi\nrm -f confcache\n\ntest \"x$prefix\" = xNONE && prefix=$ac_default_prefix\n# Let make expand exec_prefix.\ntest \"x$exec_prefix\" = xNONE && exec_prefix='${prefix}'\n\nDEFS=-DHAVE_CONFIG_H\n\nac_libobjs=\nac_ltlibobjs=\nU=\nfor ac_i in : $LIBOBJS; do test \"x$ac_i\" = x: && continue\n  # 1. Remove the extension, and $U if already installed.\n  ac_script='s/\\$U\\././;s/\\.o$//;s/\\.obj$//'\n  ac_i=`$as_echo \"$ac_i\" | sed \"$ac_script\"`\n  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR\n  #    will be set to the directory where LIBOBJS objects are built.\n  as_fn_append ac_libobjs \" \\${LIBOBJDIR}$ac_i\\$U.$ac_objext\"\n  as_fn_append ac_ltlibobjs \" \\${LIBOBJDIR}$ac_i\"'$U.lo'\ndone\nLIBOBJS=$ac_libobjs\n\nLTLIBOBJS=$ac_ltlibobjs\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure\" >&5\n$as_echo_n \"checking that generated files are newer than configure... \" >&6; }\n   if test -n \"$am_sleep_pid\"; then\n     # Hide warnings about reused PIDs.\n     wait $am_sleep_pid 2>/dev/null\n   fi\n   { $as_echo \"$as_me:${as_lineno-$LINENO}: result: done\" >&5\n$as_echo \"done\" >&6; }\nif test -z \"${AMDEP_TRUE}\" && test -z \"${AMDEP_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"AMDEP\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${am__fastdepCC_TRUE}\" && test -z \"${am__fastdepCC_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"am__fastdepCC\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\n if test -n \"$EXEEXT\"; then\n  am__EXEEXT_TRUE=\n  am__EXEEXT_FALSE='#'\nelse\n  am__EXEEXT_TRUE='#'\n  am__EXEEXT_FALSE=\nfi\n\nif test -z \"${MAINTAINER_MODE_TRUE}\" && test -z \"${MAINTAINER_MODE_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"MAINTAINER_MODE\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${AMDEP_TRUE}\" && test -z \"${AMDEP_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"AMDEP\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${USE_SYSTEM_SHARED_LIB_TRUE}\" && test -z \"${USE_SYSTEM_SHARED_LIB_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"USE_SYSTEM_SHARED_LIB\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${ENABLE_DOCUMENTATION_TRUE}\" && test -z \"${ENABLE_DOCUMENTATION_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"ENABLE_DOCUMENTATION\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${BUILD_REDIRECTOR_TRUE}\" && test -z \"${BUILD_REDIRECTOR_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"BUILD_REDIRECTOR\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${BUILD_WINCOMPAT_TRUE}\" && test -z \"${BUILD_WINCOMPAT_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"BUILD_WINCOMPAT\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\n\n\n: \"${CONFIG_STATUS=./config.status}\"\nac_write_fail=0\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files $CONFIG_STATUS\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS\" >&5\n$as_echo \"$as_me: creating $CONFIG_STATUS\" >&6;}\nas_write_fail=0\ncat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1\n#! $SHELL\n# Generated by $as_me.\n# Run this file to recreate the current configuration.\n# Compiler output produced by configure, useful for debugging\n# configure, is in config.log if it exists.\n\ndebug=false\nac_cs_recheck=false\nac_cs_silent=false\n\nSHELL=\\${CONFIG_SHELL-$SHELL}\nexport SHELL\n_ASEOF\ncat >>$CONFIG_STATUS <<\\_ASEOF || as_write_fail=1\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  $as_echo \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -pR'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -pR'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -pR'\n  fi\nelse\n  as_ln_s='cp -pR'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\n\n# as_fn_executable_p FILE\n# -----------------------\n# Test if FILE is an executable regular file.\nas_fn_executable_p ()\n{\n  test -f \"$1\" && test -x \"$1\"\n} # as_fn_executable_p\nas_test_x='test -x'\nas_executable_p=as_fn_executable_p\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\nexec 6>&1\n## ----------------------------------- ##\n## Main body of $CONFIG_STATUS script. ##\n## ----------------------------------- ##\n_ASEOF\ntest $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# Save the log message, to keep $0 and so on meaningful, and to\n# report actual input values of CONFIG_FILES etc. instead of their\n# values after options handling.\nac_log=\"\nThis file was extended by shadowsocks-libev $as_me 2.5.6, which was\ngenerated by GNU Autoconf 2.69.  Invocation command line was\n\n  CONFIG_FILES    = $CONFIG_FILES\n  CONFIG_HEADERS  = $CONFIG_HEADERS\n  CONFIG_LINKS    = $CONFIG_LINKS\n  CONFIG_COMMANDS = $CONFIG_COMMANDS\n  $ $0 $@\n\non `(hostname || uname -n) 2>/dev/null | sed 1q`\n\"\n\n_ACEOF\n\ncase $ac_config_files in *\"\n\"*) set x $ac_config_files; shift; ac_config_files=$*;;\nesac\n\ncase $ac_config_headers in *\"\n\"*) set x $ac_config_headers; shift; ac_config_headers=$*;;\nesac\n\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n# Files that config.status was made for.\nconfig_files=\"$ac_config_files\"\nconfig_headers=\"$ac_config_headers\"\nconfig_commands=\"$ac_config_commands\"\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nac_cs_usage=\"\\\n\\`$as_me' instantiates files and other configuration actions\nfrom templates according to the current configuration.  Unless the files\nand actions are specified as TAGs, all are instantiated by default.\n\nUsage: $0 [OPTION]... [TAG]...\n\n  -h, --help       print this help, then exit\n  -V, --version    print version number and configuration settings, then exit\n      --config     print configuration, then exit\n  -q, --quiet, --silent\n                   do not print progress messages\n  -d, --debug      don't remove temporary files\n      --recheck    update $as_me by reconfiguring in the same conditions\n      --file=FILE[:TEMPLATE]\n                   instantiate the configuration file FILE\n      --header=FILE[:TEMPLATE]\n                   instantiate the configuration header FILE\n\nConfiguration files:\n$config_files\n\nConfiguration headers:\n$config_headers\n\nConfiguration commands:\n$config_commands\n\nReport bugs to <max.c.lv@gmail.com>.\"\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_cs_config=\"`$as_echo \"$ac_configure_args\" | sed 's/^ //; s/[\\\\\"\"\\`\\$]/\\\\\\\\&/g'`\"\nac_cs_version=\"\\\\\nshadowsocks-libev config.status 2.5.6\nconfigured by $0, generated by GNU Autoconf 2.69,\n  with options \\\\\"\\$ac_cs_config\\\\\"\n\nCopyright (C) 2012 Free Software Foundation, Inc.\nThis config.status script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\"\n\nac_pwd='$ac_pwd'\nsrcdir='$srcdir'\nINSTALL='$INSTALL'\nMKDIR_P='$MKDIR_P'\nAWK='$AWK'\ntest -n \"\\$AWK\" || AWK=awk\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# The default lists apply if the user does not specify any file.\nac_need_defaults=:\nwhile test $# != 0\ndo\n  case $1 in\n  --*=?*)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=`expr \"X$1\" : 'X[^=]*=\\(.*\\)'`\n    ac_shift=:\n    ;;\n  --*=)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=\n    ac_shift=:\n    ;;\n  *)\n    ac_option=$1\n    ac_optarg=$2\n    ac_shift=shift\n    ;;\n  esac\n\n  case $ac_option in\n  # Handling of the options.\n  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)\n    ac_cs_recheck=: ;;\n  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )\n    $as_echo \"$ac_cs_version\"; exit ;;\n  --config | --confi | --conf | --con | --co | --c )\n    $as_echo \"$ac_cs_config\"; exit ;;\n  --debug | --debu | --deb | --de | --d | -d )\n    debug=: ;;\n  --file | --fil | --fi | --f )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    '') as_fn_error $? \"missing file argument\" ;;\n    esac\n    as_fn_append CONFIG_FILES \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --header | --heade | --head | --hea )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    as_fn_append CONFIG_HEADERS \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --he | --h)\n    # Conflict between --help and --header\n    as_fn_error $? \"ambiguous option: \\`$1'\nTry \\`$0 --help' for more information.\";;\n  --help | --hel | -h )\n    $as_echo \"$ac_cs_usage\"; exit ;;\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil | --si | --s)\n    ac_cs_silent=: ;;\n\n  # This is an error.\n  -*) as_fn_error $? \"unrecognized option: \\`$1'\nTry \\`$0 --help' for more information.\" ;;\n\n  *) as_fn_append ac_config_targets \" $1\"\n     ac_need_defaults=false ;;\n\n  esac\n  shift\ndone\n\nac_configure_extra_args=\n\nif $ac_cs_silent; then\n  exec 6>/dev/null\n  ac_configure_extra_args=\"$ac_configure_extra_args --silent\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nif \\$ac_cs_recheck; then\n  set X $SHELL '$0' $ac_configure_args \\$ac_configure_extra_args --no-create --no-recursion\n  shift\n  \\$as_echo \"running CONFIG_SHELL=$SHELL \\$*\" >&6\n  CONFIG_SHELL='$SHELL'\n  export CONFIG_SHELL\n  exec \"\\$@\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nexec 5>>config.log\n{\n  echo\n  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX\n## Running $as_me. ##\n_ASBOX\n  $as_echo \"$ac_log\"\n} >&5\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n#\n# INIT-COMMANDS\n#\nAMDEP_TRUE=\"$AMDEP_TRUE\" ac_aux_dir=\"$ac_aux_dir\"\n\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nsed_quote_subst='$sed_quote_subst'\ndouble_quote_subst='$double_quote_subst'\ndelay_variable_subst='$delay_variable_subst'\nenable_static='`$ECHO \"$enable_static\" | $SED \"$delay_single_quote_subst\"`'\nenable_shared='`$ECHO \"$enable_shared\" | $SED \"$delay_single_quote_subst\"`'\nmacro_version='`$ECHO \"$macro_version\" | $SED \"$delay_single_quote_subst\"`'\nmacro_revision='`$ECHO \"$macro_revision\" | $SED \"$delay_single_quote_subst\"`'\npic_mode='`$ECHO \"$pic_mode\" | $SED \"$delay_single_quote_subst\"`'\nenable_fast_install='`$ECHO \"$enable_fast_install\" | $SED \"$delay_single_quote_subst\"`'\nSHELL='`$ECHO \"$SHELL\" | $SED \"$delay_single_quote_subst\"`'\nECHO='`$ECHO \"$ECHO\" | $SED \"$delay_single_quote_subst\"`'\nPATH_SEPARATOR='`$ECHO \"$PATH_SEPARATOR\" | $SED \"$delay_single_quote_subst\"`'\nhost_alias='`$ECHO \"$host_alias\" | $SED \"$delay_single_quote_subst\"`'\nhost='`$ECHO \"$host\" | $SED \"$delay_single_quote_subst\"`'\nhost_os='`$ECHO \"$host_os\" | $SED \"$delay_single_quote_subst\"`'\nbuild_alias='`$ECHO \"$build_alias\" | $SED \"$delay_single_quote_subst\"`'\nbuild='`$ECHO \"$build\" | $SED \"$delay_single_quote_subst\"`'\nbuild_os='`$ECHO \"$build_os\" | $SED \"$delay_single_quote_subst\"`'\nSED='`$ECHO \"$SED\" | $SED \"$delay_single_quote_subst\"`'\nXsed='`$ECHO \"$Xsed\" | $SED \"$delay_single_quote_subst\"`'\nGREP='`$ECHO \"$GREP\" | $SED \"$delay_single_quote_subst\"`'\nEGREP='`$ECHO \"$EGREP\" | $SED \"$delay_single_quote_subst\"`'\nFGREP='`$ECHO \"$FGREP\" | $SED \"$delay_single_quote_subst\"`'\nLD='`$ECHO \"$LD\" | $SED \"$delay_single_quote_subst\"`'\nNM='`$ECHO \"$NM\" | $SED \"$delay_single_quote_subst\"`'\nLN_S='`$ECHO \"$LN_S\" | $SED \"$delay_single_quote_subst\"`'\nmax_cmd_len='`$ECHO \"$max_cmd_len\" | $SED \"$delay_single_quote_subst\"`'\nac_objext='`$ECHO \"$ac_objext\" | $SED \"$delay_single_quote_subst\"`'\nexeext='`$ECHO \"$exeext\" | $SED \"$delay_single_quote_subst\"`'\nlt_unset='`$ECHO \"$lt_unset\" | $SED \"$delay_single_quote_subst\"`'\nlt_SP2NL='`$ECHO \"$lt_SP2NL\" | $SED \"$delay_single_quote_subst\"`'\nlt_NL2SP='`$ECHO \"$lt_NL2SP\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_to_host_file_cmd='`$ECHO \"$lt_cv_to_host_file_cmd\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_to_tool_file_cmd='`$ECHO \"$lt_cv_to_tool_file_cmd\" | $SED \"$delay_single_quote_subst\"`'\nreload_flag='`$ECHO \"$reload_flag\" | $SED \"$delay_single_quote_subst\"`'\nreload_cmds='`$ECHO \"$reload_cmds\" | $SED \"$delay_single_quote_subst\"`'\nOBJDUMP='`$ECHO \"$OBJDUMP\" | $SED \"$delay_single_quote_subst\"`'\ndeplibs_check_method='`$ECHO \"$deplibs_check_method\" | $SED \"$delay_single_quote_subst\"`'\nfile_magic_cmd='`$ECHO \"$file_magic_cmd\" | $SED \"$delay_single_quote_subst\"`'\nfile_magic_glob='`$ECHO \"$file_magic_glob\" | $SED \"$delay_single_quote_subst\"`'\nwant_nocaseglob='`$ECHO \"$want_nocaseglob\" | $SED \"$delay_single_quote_subst\"`'\nDLLTOOL='`$ECHO \"$DLLTOOL\" | $SED \"$delay_single_quote_subst\"`'\nsharedlib_from_linklib_cmd='`$ECHO \"$sharedlib_from_linklib_cmd\" | $SED \"$delay_single_quote_subst\"`'\nAR='`$ECHO \"$AR\" | $SED \"$delay_single_quote_subst\"`'\nAR_FLAGS='`$ECHO \"$AR_FLAGS\" | $SED \"$delay_single_quote_subst\"`'\narchiver_list_spec='`$ECHO \"$archiver_list_spec\" | $SED \"$delay_single_quote_subst\"`'\nSTRIP='`$ECHO \"$STRIP\" | $SED \"$delay_single_quote_subst\"`'\nRANLIB='`$ECHO \"$RANLIB\" | $SED \"$delay_single_quote_subst\"`'\nold_postinstall_cmds='`$ECHO \"$old_postinstall_cmds\" | $SED \"$delay_single_quote_subst\"`'\nold_postuninstall_cmds='`$ECHO \"$old_postuninstall_cmds\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_cmds='`$ECHO \"$old_archive_cmds\" | $SED \"$delay_single_quote_subst\"`'\nlock_old_archive_extraction='`$ECHO \"$lock_old_archive_extraction\" | $SED \"$delay_single_quote_subst\"`'\nCC='`$ECHO \"$CC\" | $SED \"$delay_single_quote_subst\"`'\nCFLAGS='`$ECHO \"$CFLAGS\" | $SED \"$delay_single_quote_subst\"`'\ncompiler='`$ECHO \"$compiler\" | $SED \"$delay_single_quote_subst\"`'\nGCC='`$ECHO \"$GCC\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_pipe='`$ECHO \"$lt_cv_sys_global_symbol_pipe\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_cdecl='`$ECHO \"$lt_cv_sys_global_symbol_to_cdecl\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_c_name_address='`$ECHO \"$lt_cv_sys_global_symbol_to_c_name_address\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO \"$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix\" | $SED \"$delay_single_quote_subst\"`'\nnm_file_list_spec='`$ECHO \"$nm_file_list_spec\" | $SED \"$delay_single_quote_subst\"`'\nlt_sysroot='`$ECHO \"$lt_sysroot\" | $SED \"$delay_single_quote_subst\"`'\nobjdir='`$ECHO \"$objdir\" | $SED \"$delay_single_quote_subst\"`'\nMAGIC_CMD='`$ECHO \"$MAGIC_CMD\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_no_builtin_flag='`$ECHO \"$lt_prog_compiler_no_builtin_flag\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_pic='`$ECHO \"$lt_prog_compiler_pic\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_wl='`$ECHO \"$lt_prog_compiler_wl\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_static='`$ECHO \"$lt_prog_compiler_static\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_prog_compiler_c_o='`$ECHO \"$lt_cv_prog_compiler_c_o\" | $SED \"$delay_single_quote_subst\"`'\nneed_locks='`$ECHO \"$need_locks\" | $SED \"$delay_single_quote_subst\"`'\nMANIFEST_TOOL='`$ECHO \"$MANIFEST_TOOL\" | $SED \"$delay_single_quote_subst\"`'\nDSYMUTIL='`$ECHO \"$DSYMUTIL\" | $SED \"$delay_single_quote_subst\"`'\nNMEDIT='`$ECHO \"$NMEDIT\" | $SED \"$delay_single_quote_subst\"`'\nLIPO='`$ECHO \"$LIPO\" | $SED \"$delay_single_quote_subst\"`'\nOTOOL='`$ECHO \"$OTOOL\" | $SED \"$delay_single_quote_subst\"`'\nOTOOL64='`$ECHO \"$OTOOL64\" | $SED \"$delay_single_quote_subst\"`'\nlibext='`$ECHO \"$libext\" | $SED \"$delay_single_quote_subst\"`'\nshrext_cmds='`$ECHO \"$shrext_cmds\" | $SED \"$delay_single_quote_subst\"`'\nextract_expsyms_cmds='`$ECHO \"$extract_expsyms_cmds\" | $SED \"$delay_single_quote_subst\"`'\narchive_cmds_need_lc='`$ECHO \"$archive_cmds_need_lc\" | $SED \"$delay_single_quote_subst\"`'\nenable_shared_with_static_runtimes='`$ECHO \"$enable_shared_with_static_runtimes\" | $SED \"$delay_single_quote_subst\"`'\nexport_dynamic_flag_spec='`$ECHO \"$export_dynamic_flag_spec\" | $SED \"$delay_single_quote_subst\"`'\nwhole_archive_flag_spec='`$ECHO \"$whole_archive_flag_spec\" | $SED \"$delay_single_quote_subst\"`'\ncompiler_needs_object='`$ECHO \"$compiler_needs_object\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_from_new_cmds='`$ECHO \"$old_archive_from_new_cmds\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_from_expsyms_cmds='`$ECHO \"$old_archive_from_expsyms_cmds\" | $SED \"$delay_single_quote_subst\"`'\narchive_cmds='`$ECHO \"$archive_cmds\" | $SED \"$delay_single_quote_subst\"`'\narchive_expsym_cmds='`$ECHO \"$archive_expsym_cmds\" | $SED \"$delay_single_quote_subst\"`'\nmodule_cmds='`$ECHO \"$module_cmds\" | $SED \"$delay_single_quote_subst\"`'\nmodule_expsym_cmds='`$ECHO \"$module_expsym_cmds\" | $SED \"$delay_single_quote_subst\"`'\nwith_gnu_ld='`$ECHO \"$with_gnu_ld\" | $SED \"$delay_single_quote_subst\"`'\nallow_undefined_flag='`$ECHO \"$allow_undefined_flag\" | $SED \"$delay_single_quote_subst\"`'\nno_undefined_flag='`$ECHO \"$no_undefined_flag\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_libdir_flag_spec='`$ECHO \"$hardcode_libdir_flag_spec\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_libdir_separator='`$ECHO \"$hardcode_libdir_separator\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_direct='`$ECHO \"$hardcode_direct\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_direct_absolute='`$ECHO \"$hardcode_direct_absolute\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_minus_L='`$ECHO \"$hardcode_minus_L\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_shlibpath_var='`$ECHO \"$hardcode_shlibpath_var\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_automatic='`$ECHO \"$hardcode_automatic\" | $SED \"$delay_single_quote_subst\"`'\ninherit_rpath='`$ECHO \"$inherit_rpath\" | $SED \"$delay_single_quote_subst\"`'\nlink_all_deplibs='`$ECHO \"$link_all_deplibs\" | $SED \"$delay_single_quote_subst\"`'\nalways_export_symbols='`$ECHO \"$always_export_symbols\" | $SED \"$delay_single_quote_subst\"`'\nexport_symbols_cmds='`$ECHO \"$export_symbols_cmds\" | $SED \"$delay_single_quote_subst\"`'\nexclude_expsyms='`$ECHO \"$exclude_expsyms\" | $SED \"$delay_single_quote_subst\"`'\ninclude_expsyms='`$ECHO \"$include_expsyms\" | $SED \"$delay_single_quote_subst\"`'\nprelink_cmds='`$ECHO \"$prelink_cmds\" | $SED \"$delay_single_quote_subst\"`'\npostlink_cmds='`$ECHO \"$postlink_cmds\" | $SED \"$delay_single_quote_subst\"`'\nfile_list_spec='`$ECHO \"$file_list_spec\" | $SED \"$delay_single_quote_subst\"`'\nvariables_saved_for_relink='`$ECHO \"$variables_saved_for_relink\" | $SED \"$delay_single_quote_subst\"`'\nneed_lib_prefix='`$ECHO \"$need_lib_prefix\" | $SED \"$delay_single_quote_subst\"`'\nneed_version='`$ECHO \"$need_version\" | $SED \"$delay_single_quote_subst\"`'\nversion_type='`$ECHO \"$version_type\" | $SED \"$delay_single_quote_subst\"`'\nrunpath_var='`$ECHO \"$runpath_var\" | $SED \"$delay_single_quote_subst\"`'\nshlibpath_var='`$ECHO \"$shlibpath_var\" | $SED \"$delay_single_quote_subst\"`'\nshlibpath_overrides_runpath='`$ECHO \"$shlibpath_overrides_runpath\" | $SED \"$delay_single_quote_subst\"`'\nlibname_spec='`$ECHO \"$libname_spec\" | $SED \"$delay_single_quote_subst\"`'\nlibrary_names_spec='`$ECHO \"$library_names_spec\" | $SED \"$delay_single_quote_subst\"`'\nsoname_spec='`$ECHO \"$soname_spec\" | $SED \"$delay_single_quote_subst\"`'\ninstall_override_mode='`$ECHO \"$install_override_mode\" | $SED \"$delay_single_quote_subst\"`'\npostinstall_cmds='`$ECHO \"$postinstall_cmds\" | $SED \"$delay_single_quote_subst\"`'\npostuninstall_cmds='`$ECHO \"$postuninstall_cmds\" | $SED \"$delay_single_quote_subst\"`'\nfinish_cmds='`$ECHO \"$finish_cmds\" | $SED \"$delay_single_quote_subst\"`'\nfinish_eval='`$ECHO \"$finish_eval\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_into_libs='`$ECHO \"$hardcode_into_libs\" | $SED \"$delay_single_quote_subst\"`'\nsys_lib_search_path_spec='`$ECHO \"$sys_lib_search_path_spec\" | $SED \"$delay_single_quote_subst\"`'\nsys_lib_dlsearch_path_spec='`$ECHO \"$sys_lib_dlsearch_path_spec\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_action='`$ECHO \"$hardcode_action\" | $SED \"$delay_single_quote_subst\"`'\nenable_dlopen='`$ECHO \"$enable_dlopen\" | $SED \"$delay_single_quote_subst\"`'\nenable_dlopen_self='`$ECHO \"$enable_dlopen_self\" | $SED \"$delay_single_quote_subst\"`'\nenable_dlopen_self_static='`$ECHO \"$enable_dlopen_self_static\" | $SED \"$delay_single_quote_subst\"`'\nold_striplib='`$ECHO \"$old_striplib\" | $SED \"$delay_single_quote_subst\"`'\nstriplib='`$ECHO \"$striplib\" | $SED \"$delay_single_quote_subst\"`'\n\nLTCC='$LTCC'\nLTCFLAGS='$LTCFLAGS'\ncompiler='$compiler_DEFAULT'\n\n# A function that is used when there is no print builtin or printf.\nfunc_fallback_echo ()\n{\n  eval 'cat <<_LTECHO_EOF\n\\$1\n_LTECHO_EOF'\n}\n\n# Quote evaled strings.\nfor var in SHELL \\\nECHO \\\nPATH_SEPARATOR \\\nSED \\\nGREP \\\nEGREP \\\nFGREP \\\nLD \\\nNM \\\nLN_S \\\nlt_SP2NL \\\nlt_NL2SP \\\nreload_flag \\\nOBJDUMP \\\ndeplibs_check_method \\\nfile_magic_cmd \\\nfile_magic_glob \\\nwant_nocaseglob \\\nDLLTOOL \\\nsharedlib_from_linklib_cmd \\\nAR \\\nAR_FLAGS \\\narchiver_list_spec \\\nSTRIP \\\nRANLIB \\\nCC \\\nCFLAGS \\\ncompiler \\\nlt_cv_sys_global_symbol_pipe \\\nlt_cv_sys_global_symbol_to_cdecl \\\nlt_cv_sys_global_symbol_to_c_name_address \\\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix \\\nnm_file_list_spec \\\nlt_prog_compiler_no_builtin_flag \\\nlt_prog_compiler_pic \\\nlt_prog_compiler_wl \\\nlt_prog_compiler_static \\\nlt_cv_prog_compiler_c_o \\\nneed_locks \\\nMANIFEST_TOOL \\\nDSYMUTIL \\\nNMEDIT \\\nLIPO \\\nOTOOL \\\nOTOOL64 \\\nshrext_cmds \\\nexport_dynamic_flag_spec \\\nwhole_archive_flag_spec \\\ncompiler_needs_object \\\nwith_gnu_ld \\\nallow_undefined_flag \\\nno_undefined_flag \\\nhardcode_libdir_flag_spec \\\nhardcode_libdir_separator \\\nexclude_expsyms \\\ninclude_expsyms \\\nfile_list_spec \\\nvariables_saved_for_relink \\\nlibname_spec \\\nlibrary_names_spec \\\nsoname_spec \\\ninstall_override_mode \\\nfinish_eval \\\nold_striplib \\\nstriplib; do\n    case \\`eval \\\\\\\\\\$ECHO \\\\\\\\\"\"\\\\\\\\\\$\\$var\"\\\\\\\\\"\\` in\n    *[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"\\\\\\$\\$var\\\\\" | \\\\\\$SED \\\\\"\\\\\\$sed_quote_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n# Double-quote double-evaled strings.\nfor var in reload_cmds \\\nold_postinstall_cmds \\\nold_postuninstall_cmds \\\nold_archive_cmds \\\nextract_expsyms_cmds \\\nold_archive_from_new_cmds \\\nold_archive_from_expsyms_cmds \\\narchive_cmds \\\narchive_expsym_cmds \\\nmodule_cmds \\\nmodule_expsym_cmds \\\nexport_symbols_cmds \\\nprelink_cmds \\\npostlink_cmds \\\npostinstall_cmds \\\npostuninstall_cmds \\\nfinish_cmds \\\nsys_lib_search_path_spec \\\nsys_lib_dlsearch_path_spec; do\n    case \\`eval \\\\\\\\\\$ECHO \\\\\\\\\"\"\\\\\\\\\\$\\$var\"\\\\\\\\\"\\` in\n    *[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"\\\\\\$\\$var\\\\\" | \\\\\\$SED -e \\\\\"\\\\\\$double_quote_subst\\\\\" -e \\\\\"\\\\\\$sed_quote_subst\\\\\" -e \\\\\"\\\\\\$delay_variable_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\nac_aux_dir='$ac_aux_dir'\nxsi_shell='$xsi_shell'\nlt_shell_append='$lt_shell_append'\n\n# See if we are running on zsh, and set the options which allow our\n# commands through without removal of \\ escapes INIT.\nif test -n \"\\${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n\n\n    PACKAGE='$PACKAGE'\n    VERSION='$VERSION'\n    TIMESTAMP='$TIMESTAMP'\n    RM='$RM'\n    ofile='$ofile'\n\n\n\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n\n# Handling of arguments.\nfor ac_config_target in $ac_config_targets\ndo\n  case $ac_config_target in\n    \"config.h\") CONFIG_HEADERS=\"$CONFIG_HEADERS config.h\" ;;\n    \"depfiles\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS depfiles\" ;;\n    \"libtool\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS libtool\" ;;\n    \"shadowsocks-libev.pc\") CONFIG_FILES=\"$CONFIG_FILES shadowsocks-libev.pc\" ;;\n    \"Makefile\") CONFIG_FILES=\"$CONFIG_FILES Makefile\" ;;\n    \"libcork/Makefile\") CONFIG_FILES=\"$CONFIG_FILES libcork/Makefile\" ;;\n    \"libipset/Makefile\") CONFIG_FILES=\"$CONFIG_FILES libipset/Makefile\" ;;\n    \"src/Makefile\") CONFIG_FILES=\"$CONFIG_FILES src/Makefile\" ;;\n    \"libudns/Makefile\") CONFIG_FILES=\"$CONFIG_FILES libudns/Makefile\" ;;\n    \"libev/Makefile\") CONFIG_FILES=\"$CONFIG_FILES libev/Makefile\" ;;\n    \"doc/Makefile\") CONFIG_FILES=\"$CONFIG_FILES doc/Makefile\" ;;\n\n  *) as_fn_error $? \"invalid argument: \\`$ac_config_target'\" \"$LINENO\" 5;;\n  esac\ndone\n\n\n# If the user did not use the arguments to specify the items to instantiate,\n# then the envvar interface is used.  Set only those that are not.\n# We use the long form for the default assignment because of an extremely\n# bizarre bug on SunOS 4.1.3.\nif $ac_need_defaults; then\n  test \"${CONFIG_FILES+set}\" = set || CONFIG_FILES=$config_files\n  test \"${CONFIG_HEADERS+set}\" = set || CONFIG_HEADERS=$config_headers\n  test \"${CONFIG_COMMANDS+set}\" = set || CONFIG_COMMANDS=$config_commands\nfi\n\n# Have a temporary directory for convenience.  Make it in the build tree\n# simply because there is no reason against having it here, and in addition,\n# creating and moving files from /tmp can sometimes cause problems.\n# Hook for its removal unless debugging.\n# Note that there is a small window in which the directory will not be cleaned:\n# after its creation but before its name has been assigned to `$tmp'.\n$debug ||\n{\n  tmp= ac_tmp=\n  trap 'exit_status=$?\n  : \"${ac_tmp:=$tmp}\"\n  { test ! -d \"$ac_tmp\" || rm -fr \"$ac_tmp\"; } && exit $exit_status\n' 0\n  trap 'as_fn_exit 1' 1 2 13 15\n}\n# Create a (secure) tmp directory for tmp files.\n\n{\n  tmp=`(umask 077 && mktemp -d \"./confXXXXXX\") 2>/dev/null` &&\n  test -d \"$tmp\"\n}  ||\n{\n  tmp=./conf$$-$RANDOM\n  (umask 077 && mkdir \"$tmp\")\n} || as_fn_error $? \"cannot create a temporary directory in .\" \"$LINENO\" 5\nac_tmp=$tmp\n\n# Set up the scripts for CONFIG_FILES section.\n# No need to generate them if there are no CONFIG_FILES.\n# This happens for instance with `./config.status config.h'.\nif test -n \"$CONFIG_FILES\"; then\n\n\nac_cr=`echo X | tr X '\\015'`\n# On cygwin, bash can eat \\r inside `` if the user requested igncr.\n# But we know of no other shell where ac_cr would be empty at this\n# point, so we can use a bashism as a fallback.\nif test \"x$ac_cr\" = x; then\n  eval ac_cr=\\$\\'\\\\r\\'\nfi\nac_cs_awk_cr=`$AWK 'BEGIN { print \"a\\rb\" }' </dev/null 2>/dev/null`\nif test \"$ac_cs_awk_cr\" = \"a${ac_cr}b\"; then\n  ac_cs_awk_cr='\\\\r'\nelse\n  ac_cs_awk_cr=$ac_cr\nfi\n\necho 'BEGIN {' >\"$ac_tmp/subs1.awk\" &&\n_ACEOF\n\n\n{\n  echo \"cat >conf$$subs.awk <<_ACEOF\" &&\n  echo \"$ac_subst_vars\" | sed 's/.*/&!$&$ac_delim/' &&\n  echo \"_ACEOF\"\n} >conf$$subs.sh ||\n  as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\nac_delim_num=`echo \"$ac_subst_vars\" | grep -c '^'`\nac_delim='%!_!# '\nfor ac_last_try in false false false false false :; do\n  . ./conf$$subs.sh ||\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n\n  ac_delim_n=`sed -n \"s/.*$ac_delim\\$/X/p\" conf$$subs.awk | grep -c X`\n  if test $ac_delim_n = $ac_delim_num; then\n    break\n  elif $ac_last_try; then\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\nrm -f conf$$subs.sh\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\ncat >>\"\\$ac_tmp/subs1.awk\" <<\\\\_ACAWK &&\n_ACEOF\nsed -n '\nh\ns/^/S[\"/; s/!.*/\"]=/\np\ng\ns/^[^!]*!//\n:repl\nt repl\ns/'\"$ac_delim\"'$//\nt delim\n:nl\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\n\"\\\\/\np\nn\nb repl\n:more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt nl\n:delim\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/\np\nb\n:more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt delim\n' <conf$$subs.awk | sed '\n/^[^\"\"]/{\n  N\n  s/\\n//\n}\n' >>$CONFIG_STATUS || ac_write_fail=1\nrm -f conf$$subs.awk\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n_ACAWK\ncat >>\"\\$ac_tmp/subs1.awk\" <<_ACAWK &&\n  for (key in S) S_is_set[key] = 1\n  FS = \"\u0007\"\n\n}\n{\n  line = $ 0\n  nfields = split(line, field, \"@\")\n  substed = 0\n  len = length(field[1])\n  for (i = 2; i < nfields; i++) {\n    key = field[i]\n    keylen = length(key)\n    if (S_is_set[key]) {\n      value = S[key]\n      line = substr(line, 1, len) \"\" value \"\" substr(line, len + keylen + 3)\n      len += length(value) + length(field[++i])\n      substed = 1\n    } else\n      len += 1 + keylen\n  }\n\n  print line\n}\n\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nif sed \"s/$ac_cr//\" < /dev/null > /dev/null 2>&1; then\n  sed \"s/$ac_cr\\$//; s/$ac_cr/$ac_cs_awk_cr/g\"\nelse\n  cat\nfi < \"$ac_tmp/subs1.awk\" > \"$ac_tmp/subs.awk\" \\\n  || as_fn_error $? \"could not setup config files machinery\" \"$LINENO\" 5\n_ACEOF\n\n# VPATH may cause trouble with some makes, so we remove sole $(srcdir),\n# ${srcdir} and @srcdir@ entries from VPATH if srcdir is \".\", strip leading and\n# trailing colons and then remove the whole line if VPATH becomes empty\n# (actually we leave an empty line to preserve line numbers).\nif test \"x$srcdir\" = x.; then\n  ac_vpsub='/^[\t ]*VPATH[\t ]*=[\t ]*/{\nh\ns///\ns/^/:/\ns/[\t ]*$/:/\ns/:\\$(srcdir):/:/g\ns/:\\${srcdir}:/:/g\ns/:@srcdir@:/:/g\ns/^:*//\ns/:*$//\nx\ns/\\(=[\t ]*\\).*/\\1/\nG\ns/\\n//\ns/^[^=]*=[\t ]*$//\n}'\nfi\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nfi # test -n \"$CONFIG_FILES\"\n\n# Set up the scripts for CONFIG_HEADERS section.\n# No need to generate them if there are no CONFIG_HEADERS.\n# This happens for instance with `./config.status Makefile'.\nif test -n \"$CONFIG_HEADERS\"; then\ncat >\"$ac_tmp/defines.awk\" <<\\_ACAWK ||\nBEGIN {\n_ACEOF\n\n# Transform confdefs.h into an awk script `defines.awk', embedded as\n# here-document in config.status, that substitutes the proper values into\n# config.h.in to produce config.h.\n\n# Create a delimiter string that does not exist in confdefs.h, to ease\n# handling of long lines.\nac_delim='%!_!# '\nfor ac_last_try in false false :; do\n  ac_tt=`sed -n \"/$ac_delim/p\" confdefs.h`\n  if test -z \"$ac_tt\"; then\n    break\n  elif $ac_last_try; then\n    as_fn_error $? \"could not make $CONFIG_HEADERS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\n\n# For the awk script, D is an array of macro values keyed by name,\n# likewise P contains macro parameters if any.  Preserve backslash\n# newline sequences.\n\nac_word_re=[_$as_cr_Letters][_$as_cr_alnum]*\nsed -n '\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt rset\n:rset\ns/^[\t ]*#[\t ]*define[\t ][\t ]*/ /\nt def\nd\n:def\ns/\\\\$//\nt bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\"/p\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\"/p\nd\n:bsnl\ns/[\"\\\\]/\\\\&/g\ns/^ \\('\"$ac_word_re\"'\\)\\(([^()]*)\\)[\t ]*\\(.*\\)/P[\"\\1\"]=\"\\2\"\\\nD[\"\\1\"]=\" \\3\\\\\\\\\\\\n\"\\\\/p\nt cont\ns/^ \\('\"$ac_word_re\"'\\)[\t ]*\\(.*\\)/D[\"\\1\"]=\" \\2\\\\\\\\\\\\n\"\\\\/p\nt cont\nd\n:cont\nn\ns/.\\{148\\}/&'\"$ac_delim\"'/g\nt clear\n:clear\ns/\\\\$//\nt bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/p\nd\n:bsnlc\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\\\\\\\\\n\"\\\\/p\nb cont\n' <confdefs.h | sed '\ns/'\"$ac_delim\"'/\"\\\\\\\n\"/g' >>$CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  for (key in D) D_is_set[key] = 1\n  FS = \"\u0007\"\n}\n/^[\\t ]*#[\\t ]*(define|undef)[\\t ]+$ac_word_re([\\t (]|\\$)/ {\n  line = \\$ 0\n  split(line, arg, \" \")\n  if (arg[1] == \"#\") {\n    defundef = arg[2]\n    mac1 = arg[3]\n  } else {\n    defundef = substr(arg[1], 2)\n    mac1 = arg[2]\n  }\n  split(mac1, mac2, \"(\") #)\n  macro = mac2[1]\n  prefix = substr(line, 1, index(line, defundef) - 1)\n  if (D_is_set[macro]) {\n    # Preserve the white space surrounding the \"#\".\n    print prefix \"define\", macro P[macro] D[macro]\n    next\n  } else {\n    # Replace #undef with comments.  This is necessary, for example,\n    # in the case of _POSIX_SOURCE, which is predefined and required\n    # on some systems where configure will not decide to define it.\n    if (defundef == \"undef\") {\n      print \"/*\", prefix defundef, macro, \"*/\"\n      next\n    }\n  }\n}\n{ print }\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n  as_fn_error $? \"could not setup config headers machinery\" \"$LINENO\" 5\nfi # test -n \"$CONFIG_HEADERS\"\n\n\neval set X \"  :F $CONFIG_FILES  :H $CONFIG_HEADERS    :C $CONFIG_COMMANDS\"\nshift\nfor ac_tag\ndo\n  case $ac_tag in\n  :[FHLC]) ac_mode=$ac_tag; continue;;\n  esac\n  case $ac_mode$ac_tag in\n  :[FHL]*:*);;\n  :L* | :C*:*) as_fn_error $? \"invalid tag \\`$ac_tag'\" \"$LINENO\" 5;;\n  :[FH]-) ac_tag=-:-;;\n  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;\n  esac\n  ac_save_IFS=$IFS\n  IFS=:\n  set x $ac_tag\n  IFS=$ac_save_IFS\n  shift\n  ac_file=$1\n  shift\n\n  case $ac_mode in\n  :L) ac_source=$1;;\n  :[FH])\n    ac_file_inputs=\n    for ac_f\n    do\n      case $ac_f in\n      -) ac_f=\"$ac_tmp/stdin\";;\n      *) # Look for the file first in the build tree, then in the source tree\n\t # (if the path is not absolute).  The absolute path cannot be DOS-style,\n\t # because $ac_f cannot contain `:'.\n\t test -f \"$ac_f\" ||\n\t   case $ac_f in\n\t   [\\\\/$]*) false;;\n\t   *) test -f \"$srcdir/$ac_f\" && ac_f=\"$srcdir/$ac_f\";;\n\t   esac ||\n\t   as_fn_error 1 \"cannot find input file: \\`$ac_f'\" \"$LINENO\" 5;;\n      esac\n      case $ac_f in *\\'*) ac_f=`$as_echo \"$ac_f\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; esac\n      as_fn_append ac_file_inputs \" '$ac_f'\"\n    done\n\n    # Let's still pretend it is `configure' which instantiates (i.e., don't\n    # use $as_me), people would be surprised to read:\n    #    /* config.h.  Generated by config.status.  */\n    configure_input='Generated from '`\n\t  $as_echo \"$*\" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'\n\t`' by configure.'\n    if test x\"$ac_file\" != x-; then\n      configure_input=\"$ac_file.  $configure_input\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: creating $ac_file\" >&5\n$as_echo \"$as_me: creating $ac_file\" >&6;}\n    fi\n    # Neutralize special characters interpreted by sed in replacement strings.\n    case $configure_input in #(\n    *\\&* | *\\|* | *\\\\* )\n       ac_sed_conf_input=`$as_echo \"$configure_input\" |\n       sed 's/[\\\\\\\\&|]/\\\\\\\\&/g'`;; #(\n    *) ac_sed_conf_input=$configure_input;;\n    esac\n\n    case $ac_tag in\n    *:-:* | *:-) cat >\"$ac_tmp/stdin\" \\\n      || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5 ;;\n    esac\n    ;;\n  esac\n\n  ac_dir=`$as_dirname -- \"$ac_file\" ||\n$as_expr X\"$ac_file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)$' \\| \\\n\t X\"$ac_file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$ac_file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  as_dir=\"$ac_dir\"; as_fn_mkdir_p\n  ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n\n  case $ac_mode in\n  :F)\n  #\n  # CONFIG_FILE\n  #\n\n  case $INSTALL in\n  [\\\\/$]* | ?:[\\\\/]* ) ac_INSTALL=$INSTALL ;;\n  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;\n  esac\n  ac_MKDIR_P=$MKDIR_P\n  case $MKDIR_P in\n  [\\\\/$]* | ?:[\\\\/]* ) ;;\n  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;\n  esac\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# If the template does not know about datarootdir, expand it.\n# FIXME: This hack should be removed a few years after 2.60.\nac_datarootdir_hack=; ac_datarootdir_seen=\nac_sed_dataroot='\n/datarootdir/ {\n  p\n  q\n}\n/@datadir@/p\n/@docdir@/p\n/@infodir@/p\n/@localedir@/p\n/@mandir@/p'\ncase `eval \"sed -n \\\"\\$ac_sed_dataroot\\\" $ac_file_inputs\"` in\n*datarootdir*) ac_datarootdir_seen=yes;;\n*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&5\n$as_echo \"$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&2;}\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  ac_datarootdir_hack='\n  s&@datadir@&$datadir&g\n  s&@docdir@&$docdir&g\n  s&@infodir@&$infodir&g\n  s&@localedir@&$localedir&g\n  s&@mandir@&$mandir&g\n  s&\\\\\\${datarootdir}&$datarootdir&g' ;;\nesac\n_ACEOF\n\n# Neutralize VPATH when `$srcdir' = `.'.\n# Shell code in configure.ac might set extrasub.\n# FIXME: do we really want to maintain this feature?\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_sed_extra=\"$ac_vpsub\n$extrasub\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n:t\n/@[a-zA-Z_][a-zA-Z_0-9]*@/!b\ns|@configure_input@|$ac_sed_conf_input|;t t\ns&@top_builddir@&$ac_top_builddir_sub&;t t\ns&@top_build_prefix@&$ac_top_build_prefix&;t t\ns&@srcdir@&$ac_srcdir&;t t\ns&@abs_srcdir@&$ac_abs_srcdir&;t t\ns&@top_srcdir@&$ac_top_srcdir&;t t\ns&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t\ns&@builddir@&$ac_builddir&;t t\ns&@abs_builddir@&$ac_abs_builddir&;t t\ns&@abs_top_builddir@&$ac_abs_top_builddir&;t t\ns&@INSTALL@&$ac_INSTALL&;t t\ns&@MKDIR_P@&$ac_MKDIR_P&;t t\n$ac_datarootdir_hack\n\"\neval sed \\\"\\$ac_sed_extra\\\" \"$ac_file_inputs\" | $AWK -f \"$ac_tmp/subs.awk\" \\\n  >$ac_tmp/out || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n\ntest -z \"$ac_datarootdir_hack$ac_datarootdir_seen\" &&\n  { ac_out=`sed -n '/\\${datarootdir}/p' \"$ac_tmp/out\"`; test -n \"$ac_out\"; } &&\n  { ac_out=`sed -n '/^[\t ]*datarootdir[\t ]*:*=/p' \\\n      \"$ac_tmp/out\"`; test -z \"$ac_out\"; } &&\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&5\n$as_echo \"$as_me: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&2;}\n\n  rm -f \"$ac_tmp/stdin\"\n  case $ac_file in\n  -) cat \"$ac_tmp/out\" && rm -f \"$ac_tmp/out\";;\n  *) rm -f \"$ac_file\" && mv \"$ac_tmp/out\" \"$ac_file\";;\n  esac \\\n  || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n ;;\n  :H)\n  #\n  # CONFIG_HEADER\n  #\n  if test x\"$ac_file\" != x-; then\n    {\n      $as_echo \"/* $configure_input  */\" \\\n      && eval '$AWK -f \"$ac_tmp/defines.awk\"' \"$ac_file_inputs\"\n    } >\"$ac_tmp/config.h\" \\\n      || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n    if diff \"$ac_file\" \"$ac_tmp/config.h\" >/dev/null 2>&1; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: $ac_file is unchanged\" >&5\n$as_echo \"$as_me: $ac_file is unchanged\" >&6;}\n    else\n      rm -f \"$ac_file\"\n      mv \"$ac_tmp/config.h\" \"$ac_file\" \\\n\t|| as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n    fi\n  else\n    $as_echo \"/* $configure_input  */\" \\\n      && eval '$AWK -f \"$ac_tmp/defines.awk\"' \"$ac_file_inputs\" \\\n      || as_fn_error $? \"could not create -\" \"$LINENO\" 5\n  fi\n# Compute \"$ac_file\"'s index in $config_headers.\n_am_arg=\"$ac_file\"\n_am_stamp_count=1\nfor _am_header in $config_headers :; do\n  case $_am_header in\n    $_am_arg | $_am_arg:* )\n      break ;;\n    * )\n      _am_stamp_count=`expr $_am_stamp_count + 1` ;;\n  esac\ndone\necho \"timestamp for $_am_arg\" >`$as_dirname -- \"$_am_arg\" ||\n$as_expr X\"$_am_arg\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$_am_arg\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$_am_arg\" : 'X\\(//\\)$' \\| \\\n\t X\"$_am_arg\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$_am_arg\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`/stamp-h$_am_stamp_count\n ;;\n\n  :C)  { $as_echo \"$as_me:${as_lineno-$LINENO}: executing $ac_file commands\" >&5\n$as_echo \"$as_me: executing $ac_file commands\" >&6;}\n ;;\n  esac\n\n\n  case $ac_file$ac_mode in\n    \"depfiles\":C) test x\"$AMDEP_TRUE\" != x\"\" || {\n  # Older Autoconf quotes --file arguments for eval, but not when files\n  # are listed without --file.  Let's play safe and only enable the eval\n  # if we detect the quoting.\n  case $CONFIG_FILES in\n  *\\'*) eval set x \"$CONFIG_FILES\" ;;\n  *)   set x $CONFIG_FILES ;;\n  esac\n  shift\n  for mf\n  do\n    # Strip MF so we end up with the name of the file.\n    mf=`echo \"$mf\" | sed -e 's/:.*$//'`\n    # Check whether this is an Automake generated Makefile or not.\n    # We used to match only the files named 'Makefile.in', but\n    # some people rename them; so instead we look at the file content.\n    # Grep'ing the first line is not enough: some people post-process\n    # each Makefile.in and add a new line on top of each file to say so.\n    # Grep'ing the whole file is not good either: AIX grep has a line\n    # limit of 2048, but all sed's we know have understand at least 4000.\n    if sed -n 's,^#.*generated by automake.*,X,p' \"$mf\" | grep X >/dev/null 2>&1; then\n      dirpart=`$as_dirname -- \"$mf\" ||\n$as_expr X\"$mf\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$mf\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$mf\" : 'X\\(//\\)$' \\| \\\n\t X\"$mf\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$mf\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n    else\n      continue\n    fi\n    # Extract the definition of DEPDIR, am__include, and am__quote\n    # from the Makefile without running 'make'.\n    DEPDIR=`sed -n 's/^DEPDIR = //p' < \"$mf\"`\n    test -z \"$DEPDIR\" && continue\n    am__include=`sed -n 's/^am__include = //p' < \"$mf\"`\n    test -z \"$am__include\" && continue\n    am__quote=`sed -n 's/^am__quote = //p' < \"$mf\"`\n    # Find all dependency output files, they are included files with\n    # $(DEPDIR) in their names.  We invoke sed twice because it is the\n    # simplest approach to changing $(DEPDIR) to its actual value in the\n    # expansion.\n    for file in `sed -n \"\n      s/^$am__include $am__quote\\(.*(DEPDIR).*\\)$am__quote\"'$/\\1/p' <\"$mf\" | \\\n\t sed -e 's/\\$(DEPDIR)/'\"$DEPDIR\"'/g'`; do\n      # Make sure the directory exists.\n      test -f \"$dirpart/$file\" && continue\n      fdir=`$as_dirname -- \"$file\" ||\n$as_expr X\"$file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$file\" : 'X\\(//\\)$' \\| \\\n\t X\"$file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      as_dir=$dirpart/$fdir; as_fn_mkdir_p\n      # echo \"creating $dirpart/$file\"\n      echo '# dummy' > \"$dirpart/$file\"\n    done\n  done\n}\n ;;\n    \"libtool\":C)\n\n    # See if we are running on zsh, and set the options which allow our\n    # commands through without removal of \\ escapes.\n    if test -n \"${ZSH_VERSION+set}\" ; then\n      setopt NO_GLOB_SUBST\n    fi\n\n    cfgfile=\"${ofile}T\"\n    trap \"$RM -f \\\"$cfgfile\\\"; exit 1\" 1 2 15\n    $RM -f \"$cfgfile\"\n\n    cat <<_LT_EOF >> \"$cfgfile\"\n#! $SHELL\n\n# `$ECHO \"$ofile\" | sed 's%^.*/%%'` - Provide generalized library-building support services.\n# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION\n# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:\n# NOTE: Changes made to this file will be lost: look at ltmain.sh.\n#\n#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,\n#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software\n#                 Foundation, Inc.\n#   Written by Gordon Matzigkeit, 1996\n#\n#   This file is part of GNU Libtool.\n#\n# GNU Libtool is free software; you can redistribute it and/or\n# modify it under the terms of the GNU General Public License as\n# published by the Free Software Foundation; either version 2 of\n# the License, or (at your option) any later version.\n#\n# As a special exception to the GNU General Public License,\n# if you distribute this file as part of a program or library that\n# is built using GNU Libtool, you may include this file under the\n# same distribution terms that you use for the rest of that program.\n#\n# GNU Libtool is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with GNU Libtool; see the file COPYING.  If not, a copy\n# can be downloaded from http://www.gnu.org/licenses/gpl.html, or\n# obtained by writing to the Free Software Foundation, Inc.,\n# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\n\n# The names of the tagged configurations supported by this script.\navailable_tags=\"\"\n\n# ### BEGIN LIBTOOL CONFIG\n\n# Whether or not to build static libraries.\nbuild_old_libs=$enable_static\n\n# Whether or not to build shared libraries.\nbuild_libtool_libs=$enable_shared\n\n# Which release of libtool.m4 was used?\nmacro_version=$macro_version\nmacro_revision=$macro_revision\n\n# What type of objects to build.\npic_mode=$pic_mode\n\n# Whether or not to optimize for fast installation.\nfast_install=$enable_fast_install\n\n# Shell to use when invoking shell scripts.\nSHELL=$lt_SHELL\n\n# An echo program that protects backslashes.\nECHO=$lt_ECHO\n\n# The PATH separator for the build system.\nPATH_SEPARATOR=$lt_PATH_SEPARATOR\n\n# The host system.\nhost_alias=$host_alias\nhost=$host\nhost_os=$host_os\n\n# The build system.\nbuild_alias=$build_alias\nbuild=$build\nbuild_os=$build_os\n\n# A sed program that does not truncate output.\nSED=$lt_SED\n\n# Sed that helps us avoid accidentally triggering echo(1) options like -n.\nXsed=\"\\$SED -e 1s/^X//\"\n\n# A grep program that handles long lines.\nGREP=$lt_GREP\n\n# An ERE matcher.\nEGREP=$lt_EGREP\n\n# A literal string matcher.\nFGREP=$lt_FGREP\n\n# A BSD- or MS-compatible name lister.\nNM=$lt_NM\n\n# Whether we need soft or hard links.\nLN_S=$lt_LN_S\n\n# What is the maximum length of a command?\nmax_cmd_len=$max_cmd_len\n\n# Object file suffix (normally \"o\").\nobjext=$ac_objext\n\n# Executable file suffix (normally \"\").\nexeext=$exeext\n\n# whether the shell understands \"unset\".\nlt_unset=$lt_unset\n\n# turn spaces into newlines.\nSP2NL=$lt_lt_SP2NL\n\n# turn newlines into spaces.\nNL2SP=$lt_lt_NL2SP\n\n# convert \\$build file names to \\$host format.\nto_host_file_cmd=$lt_cv_to_host_file_cmd\n\n# convert \\$build files to toolchain format.\nto_tool_file_cmd=$lt_cv_to_tool_file_cmd\n\n# An object symbol dumper.\nOBJDUMP=$lt_OBJDUMP\n\n# Method to check whether dependent libraries are shared objects.\ndeplibs_check_method=$lt_deplibs_check_method\n\n# Command to use when deplibs_check_method = \"file_magic\".\nfile_magic_cmd=$lt_file_magic_cmd\n\n# How to find potential files when deplibs_check_method = \"file_magic\".\nfile_magic_glob=$lt_file_magic_glob\n\n# Find potential files using nocaseglob when deplibs_check_method = \"file_magic\".\nwant_nocaseglob=$lt_want_nocaseglob\n\n# DLL creation program.\nDLLTOOL=$lt_DLLTOOL\n\n# Command to associate shared and link libraries.\nsharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd\n\n# The archiver.\nAR=$lt_AR\n\n# Flags to create an archive.\nAR_FLAGS=$lt_AR_FLAGS\n\n# How to feed a file listing to the archiver.\narchiver_list_spec=$lt_archiver_list_spec\n\n# A symbol stripping program.\nSTRIP=$lt_STRIP\n\n# Commands used to install an old-style archive.\nRANLIB=$lt_RANLIB\nold_postinstall_cmds=$lt_old_postinstall_cmds\nold_postuninstall_cmds=$lt_old_postuninstall_cmds\n\n# Whether to use a lock for old archive extraction.\nlock_old_archive_extraction=$lock_old_archive_extraction\n\n# A C compiler.\nLTCC=$lt_CC\n\n# LTCC compiler flags.\nLTCFLAGS=$lt_CFLAGS\n\n# Take the output of nm and produce a listing of raw symbols and C names.\nglobal_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe\n\n# Transform the output of nm in a proper C declaration.\nglobal_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl\n\n# Transform the output of nm in a C name address pair.\nglobal_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address\n\n# Transform the output of nm in a C name address pair when lib prefix is needed.\nglobal_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix\n\n# Specify filename containing input files for \\$NM.\nnm_file_list_spec=$lt_nm_file_list_spec\n\n# The root where to search for dependent libraries,and in which our libraries should be installed.\nlt_sysroot=$lt_sysroot\n\n# The name of the directory that contains temporary libtool files.\nobjdir=$objdir\n\n# Used to examine libraries when file_magic_cmd begins with \"file\".\nMAGIC_CMD=$MAGIC_CMD\n\n# Must we lock files when doing compilation?\nneed_locks=$lt_need_locks\n\n# Manifest tool.\nMANIFEST_TOOL=$lt_MANIFEST_TOOL\n\n# Tool to manipulate archived DWARF debug symbol files on Mac OS X.\nDSYMUTIL=$lt_DSYMUTIL\n\n# Tool to change global to local symbols on Mac OS X.\nNMEDIT=$lt_NMEDIT\n\n# Tool to manipulate fat objects and archives on Mac OS X.\nLIPO=$lt_LIPO\n\n# ldd/readelf like tool for Mach-O binaries on Mac OS X.\nOTOOL=$lt_OTOOL\n\n# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.\nOTOOL64=$lt_OTOOL64\n\n# Old archive suffix (normally \"a\").\nlibext=$libext\n\n# Shared library suffix (normally \".so\").\nshrext_cmds=$lt_shrext_cmds\n\n# The commands to extract the exported symbol list from a shared archive.\nextract_expsyms_cmds=$lt_extract_expsyms_cmds\n\n# Variables whose values should be saved in libtool wrapper scripts and\n# restored at link time.\nvariables_saved_for_relink=$lt_variables_saved_for_relink\n\n# Do we need the \"lib\" prefix for modules?\nneed_lib_prefix=$need_lib_prefix\n\n# Do we need a version for libraries?\nneed_version=$need_version\n\n# Library versioning type.\nversion_type=$version_type\n\n# Shared library runtime path variable.\nrunpath_var=$runpath_var\n\n# Shared library path variable.\nshlibpath_var=$shlibpath_var\n\n# Is shlibpath searched before the hard-coded library search path?\nshlibpath_overrides_runpath=$shlibpath_overrides_runpath\n\n# Format of library name prefix.\nlibname_spec=$lt_libname_spec\n\n# List of archive names.  First name is the real one, the rest are links.\n# The last name is the one that the linker finds with -lNAME\nlibrary_names_spec=$lt_library_names_spec\n\n# The coded name of the library, if different from the real name.\nsoname_spec=$lt_soname_spec\n\n# Permission mode override for installation of shared libraries.\ninstall_override_mode=$lt_install_override_mode\n\n# Command to use after installation of a shared archive.\npostinstall_cmds=$lt_postinstall_cmds\n\n# Command to use after uninstallation of a shared archive.\npostuninstall_cmds=$lt_postuninstall_cmds\n\n# Commands used to finish a libtool library installation in a directory.\nfinish_cmds=$lt_finish_cmds\n\n# As \"finish_cmds\", except a single script fragment to be evaled but\n# not shown.\nfinish_eval=$lt_finish_eval\n\n# Whether we should hardcode library paths into libraries.\nhardcode_into_libs=$hardcode_into_libs\n\n# Compile-time system search path for libraries.\nsys_lib_search_path_spec=$lt_sys_lib_search_path_spec\n\n# Run-time system search path for libraries.\nsys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec\n\n# Whether dlopen is supported.\ndlopen_support=$enable_dlopen\n\n# Whether dlopen of programs is supported.\ndlopen_self=$enable_dlopen_self\n\n# Whether dlopen of statically linked programs is supported.\ndlopen_self_static=$enable_dlopen_self_static\n\n# Commands to strip libraries.\nold_striplib=$lt_old_striplib\nstriplib=$lt_striplib\n\n\n# The linker used to build libraries.\nLD=$lt_LD\n\n# How to create reloadable object files.\nreload_flag=$lt_reload_flag\nreload_cmds=$lt_reload_cmds\n\n# Commands used to build an old-style archive.\nold_archive_cmds=$lt_old_archive_cmds\n\n# A language specific compiler.\nCC=$lt_compiler\n\n# Is the compiler the GNU compiler?\nwith_gcc=$GCC\n\n# Compiler flag to turn off builtin functions.\nno_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag\n\n# Additional compiler flags for building library objects.\npic_flag=$lt_lt_prog_compiler_pic\n\n# How to pass a linker flag through the compiler.\nwl=$lt_lt_prog_compiler_wl\n\n# Compiler flag to prevent dynamic linking.\nlink_static_flag=$lt_lt_prog_compiler_static\n\n# Does compiler simultaneously support -c and -o options?\ncompiler_c_o=$lt_lt_cv_prog_compiler_c_o\n\n# Whether or not to add -lc for building shared libraries.\nbuild_libtool_need_lc=$archive_cmds_need_lc\n\n# Whether or not to disallow shared libs when runtime libs are static.\nallow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes\n\n# Compiler flag to allow reflexive dlopens.\nexport_dynamic_flag_spec=$lt_export_dynamic_flag_spec\n\n# Compiler flag to generate shared objects directly from archives.\nwhole_archive_flag_spec=$lt_whole_archive_flag_spec\n\n# Whether the compiler copes with passing no objects directly.\ncompiler_needs_object=$lt_compiler_needs_object\n\n# Create an old-style archive from a shared archive.\nold_archive_from_new_cmds=$lt_old_archive_from_new_cmds\n\n# Create a temporary old-style archive to link instead of a shared archive.\nold_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds\n\n# Commands used to build a shared archive.\narchive_cmds=$lt_archive_cmds\narchive_expsym_cmds=$lt_archive_expsym_cmds\n\n# Commands used to build a loadable module if different from building\n# a shared archive.\nmodule_cmds=$lt_module_cmds\nmodule_expsym_cmds=$lt_module_expsym_cmds\n\n# Whether we are building with GNU ld or not.\nwith_gnu_ld=$lt_with_gnu_ld\n\n# Flag that allows shared libraries with undefined symbols to be built.\nallow_undefined_flag=$lt_allow_undefined_flag\n\n# Flag that enforces no undefined symbols.\nno_undefined_flag=$lt_no_undefined_flag\n\n# Flag to hardcode \\$libdir into a binary during linking.\n# This must work even if \\$libdir does not exist\nhardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec\n\n# Whether we need a single \"-rpath\" flag with a separated argument.\nhardcode_libdir_separator=$lt_hardcode_libdir_separator\n\n# Set to \"yes\" if using DIR/libNAME\\${shared_ext} during linking hardcodes\n# DIR into the resulting binary.\nhardcode_direct=$hardcode_direct\n\n# Set to \"yes\" if using DIR/libNAME\\${shared_ext} during linking hardcodes\n# DIR into the resulting binary and the resulting library dependency is\n# \"absolute\",i.e impossible to change by setting \\${shlibpath_var} if the\n# library is relocated.\nhardcode_direct_absolute=$hardcode_direct_absolute\n\n# Set to \"yes\" if using the -LDIR flag during linking hardcodes DIR\n# into the resulting binary.\nhardcode_minus_L=$hardcode_minus_L\n\n# Set to \"yes\" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR\n# into the resulting binary.\nhardcode_shlibpath_var=$hardcode_shlibpath_var\n\n# Set to \"yes\" if building a shared library automatically hardcodes DIR\n# into the library and all subsequent libraries and executables linked\n# against it.\nhardcode_automatic=$hardcode_automatic\n\n# Set to yes if linker adds runtime paths of dependent libraries\n# to runtime path list.\ninherit_rpath=$inherit_rpath\n\n# Whether libtool must link a program against all its dependency libraries.\nlink_all_deplibs=$link_all_deplibs\n\n# Set to \"yes\" if exported symbols are required.\nalways_export_symbols=$always_export_symbols\n\n# The commands to list exported symbols.\nexport_symbols_cmds=$lt_export_symbols_cmds\n\n# Symbols that should not be listed in the preloaded symbols.\nexclude_expsyms=$lt_exclude_expsyms\n\n# Symbols that must always be exported.\ninclude_expsyms=$lt_include_expsyms\n\n# Commands necessary for linking programs (against libraries) with templates.\nprelink_cmds=$lt_prelink_cmds\n\n# Commands necessary for finishing linking programs.\npostlink_cmds=$lt_postlink_cmds\n\n# Specify filename containing input files.\nfile_list_spec=$lt_file_list_spec\n\n# How to hardcode a shared library path into an executable.\nhardcode_action=$hardcode_action\n\n# ### END LIBTOOL CONFIG\n\n_LT_EOF\n\n  case $host_os in\n  aix3*)\n    cat <<\\_LT_EOF >> \"$cfgfile\"\n# AIX sometimes has problems with the GCC collect2 program.  For some\n# reason, if we set the COLLECT_NAMES environment variable, the problems\n# vanish in a puff of smoke.\nif test \"X${COLLECT_NAMES+set}\" != Xset; then\n  COLLECT_NAMES=\n  export COLLECT_NAMES\nfi\n_LT_EOF\n    ;;\n  esac\n\n\nltmain=\"$ac_aux_dir/ltmain.sh\"\n\n\n  # We use sed instead of cat because bash on DJGPP gets confused if\n  # if finds mixed CR/LF and LF-only lines.  Since sed operates in\n  # text mode, it properly converts lines to CR/LF.  This bash problem\n  # is reportedly fixed, but why not run on old versions too?\n  sed '$q' \"$ltmain\" >> \"$cfgfile\" \\\n     || (rm -f \"$cfgfile\"; exit 1)\n\n  if test x\"$xsi_shell\" = xyes; then\n  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\\\nfunc_dirname ()\\\n{\\\n\\    case ${1} in\\\n\\      */*) func_dirname_result=\"${1%/*}${2}\" ;;\\\n\\      *  ) func_dirname_result=\"${3}\" ;;\\\n\\    esac\\\n} # Extended-shell func_dirname implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_basename ()$/,/^} # func_basename /c\\\nfunc_basename ()\\\n{\\\n\\    func_basename_result=\"${1##*/}\"\\\n} # Extended-shell func_basename implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\\\nfunc_dirname_and_basename ()\\\n{\\\n\\    case ${1} in\\\n\\      */*) func_dirname_result=\"${1%/*}${2}\" ;;\\\n\\      *  ) func_dirname_result=\"${3}\" ;;\\\n\\    esac\\\n\\    func_basename_result=\"${1##*/}\"\\\n} # Extended-shell func_dirname_and_basename implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\\\nfunc_stripname ()\\\n{\\\n\\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\\\n\\    # positional parameters, so assign one to ordinary parameter first.\\\n\\    func_stripname_result=${3}\\\n\\    func_stripname_result=${func_stripname_result#\"${1}\"}\\\n\\    func_stripname_result=${func_stripname_result%\"${2}\"}\\\n} # Extended-shell func_stripname implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\\\nfunc_split_long_opt ()\\\n{\\\n\\    func_split_long_opt_name=${1%%=*}\\\n\\    func_split_long_opt_arg=${1#*=}\\\n} # Extended-shell func_split_long_opt implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\\\nfunc_split_short_opt ()\\\n{\\\n\\    func_split_short_opt_arg=${1#??}\\\n\\    func_split_short_opt_name=${1%\"$func_split_short_opt_arg\"}\\\n} # Extended-shell func_split_short_opt implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\\\nfunc_lo2o ()\\\n{\\\n\\    case ${1} in\\\n\\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\\\n\\      *)    func_lo2o_result=${1} ;;\\\n\\    esac\\\n} # Extended-shell func_lo2o implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_xform ()$/,/^} # func_xform /c\\\nfunc_xform ()\\\n{\\\n    func_xform_result=${1%.*}.lo\\\n} # Extended-shell func_xform implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_arith ()$/,/^} # func_arith /c\\\nfunc_arith ()\\\n{\\\n    func_arith_result=$(( $* ))\\\n} # Extended-shell func_arith implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_len ()$/,/^} # func_len /c\\\nfunc_len ()\\\n{\\\n    func_len_result=${#1}\\\n} # Extended-shell func_len implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\nfi\n\nif test x\"$lt_shell_append\" = xyes; then\n  sed -e '/^func_append ()$/,/^} # func_append /c\\\nfunc_append ()\\\n{\\\n    eval \"${1}+=\\\\${2}\"\\\n} # Extended-shell func_append implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\\\nfunc_append_quoted ()\\\n{\\\n\\    func_quote_for_eval \"${2}\"\\\n\\    eval \"${1}+=\\\\\\\\ \\\\$func_quote_for_eval_result\"\\\n} # Extended-shell func_append_quoted implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  # Save a `func_append' function call where possible by direct use of '+='\n  sed -e 's%func_append \\([a-zA-Z_]\\{1,\\}\\) \"%\\1+=\"%g' $cfgfile > $cfgfile.tmp \\\n    && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n      || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\n  test 0 -eq $? || _lt_function_replace_fail=:\nelse\n  # Save a `func_append' function call even when '+=' is not available\n  sed -e 's%func_append \\([a-zA-Z_]\\{1,\\}\\) \"%\\1=\"$\\1%g' $cfgfile > $cfgfile.tmp \\\n    && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n      || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\n  test 0 -eq $? || _lt_function_replace_fail=:\nfi\n\nif test x\"$_lt_function_replace_fail\" = x\":\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile\" >&5\n$as_echo \"$as_me: WARNING: Unable to substitute extended shell functions in $ofile\" >&2;}\nfi\n\n\n   mv -f \"$cfgfile\" \"$ofile\" ||\n    (rm -f \"$ofile\" && cp \"$cfgfile\" \"$ofile\" && rm -f \"$cfgfile\")\n  chmod +x \"$ofile\"\n\n ;;\n\n  esac\ndone # for ac_tag\n\n\nas_fn_exit 0\n_ACEOF\nac_clean_files=$ac_clean_files_save\n\ntest $ac_write_fail = 0 ||\n  as_fn_error $? \"write failure creating $CONFIG_STATUS\" \"$LINENO\" 5\n\n\n# configure is writing to config.log, and then calls config.status.\n# config.status does its own redirection, appending to config.log.\n# Unfortunately, on DOS this fails, as config.log is still kept open\n# by configure, so config.status won't be able to write to it; its\n# output is simply discarded.  So we exec the FD to /dev/null,\n# effectively closing config.log, so it can be properly (re)opened and\n# appended to by config.status.  When coming back to configure, we\n# need to make the FD available again.\nif test \"$no_create\" != yes; then\n  ac_cs_success=:\n  ac_config_status_args=\n  test \"$silent\" = yes &&\n    ac_config_status_args=\"$ac_config_status_args --quiet\"\n  exec 5>/dev/null\n  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false\n  exec 5>>config.log\n  # Use ||, not &&, to avoid exiting from the if with $? = 1, which\n  # would make configure fail if this is the last instruction.\n  $ac_cs_success || as_fn_exit 1\nfi\n\n#\n# CONFIG_SUBDIRS section.\n#\nif test \"$no_recursion\" != yes; then\n\n  # Remove --cache-file, --srcdir, and --disable-option-checking arguments\n  # so they do not pile up.\n  ac_sub_configure_args=\n  ac_prev=\n  eval \"set x $ac_configure_args\"\n  shift\n  for ac_arg\n  do\n    if test -n \"$ac_prev\"; then\n      ac_prev=\n      continue\n    fi\n    case $ac_arg in\n    -cache-file | --cache-file | --cache-fil | --cache-fi \\\n    | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)\n      ac_prev=cache_file ;;\n    -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \\\n    | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* \\\n    | --c=*)\n      ;;\n    --config-cache | -C)\n      ;;\n    -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)\n      ac_prev=srcdir ;;\n    -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)\n      ;;\n    -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)\n      ac_prev=prefix ;;\n    -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)\n      ;;\n    --disable-option-checking)\n      ;;\n    *)\n      case $ac_arg in\n      *\\'*) ac_arg=`$as_echo \"$ac_arg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n      esac\n      as_fn_append ac_sub_configure_args \" '$ac_arg'\" ;;\n    esac\n  done\n\n  # Always prepend --prefix to ensure using the same prefix\n  # in subdir configurations.\n  ac_arg=\"--prefix=$prefix\"\n  case $ac_arg in\n  *\\'*) ac_arg=`$as_echo \"$ac_arg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n  esac\n  ac_sub_configure_args=\"'$ac_arg' $ac_sub_configure_args\"\n\n  # Pass --silent\n  if test \"$silent\" = yes; then\n    ac_sub_configure_args=\"--silent $ac_sub_configure_args\"\n  fi\n\n  # Always prepend --disable-option-checking to silence warnings, since\n  # different subdirs can have different --enable and --with options.\n  ac_sub_configure_args=\"--disable-option-checking $ac_sub_configure_args\"\n\n  ac_popdir=`pwd`\n  for ac_dir in : $subdirs; do test \"x$ac_dir\" = x: && continue\n\n    # Do not complain, so a configure script can configure whichever\n    # parts of a large source tree are present.\n    test -d \"$srcdir/$ac_dir\" || continue\n\n    ac_msg=\"=== configuring in $ac_dir (`pwd`/$ac_dir)\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: $ac_msg\" >&5\n    $as_echo \"$ac_msg\" >&6\n    as_dir=\"$ac_dir\"; as_fn_mkdir_p\n    ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n\n    cd \"$ac_dir\"\n\n    # Check for guested configure; otherwise get Cygnus style configure.\n    if test -f \"$ac_srcdir/configure.gnu\"; then\n      ac_sub_configure=$ac_srcdir/configure.gnu\n    elif test -f \"$ac_srcdir/configure\"; then\n      ac_sub_configure=$ac_srcdir/configure\n    elif test -f \"$ac_srcdir/configure.in\"; then\n      # This should be Cygnus configure.\n      ac_sub_configure=$ac_aux_dir/configure\n    else\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: no configuration information is in $ac_dir\" >&5\n$as_echo \"$as_me: WARNING: no configuration information is in $ac_dir\" >&2;}\n      ac_sub_configure=\n    fi\n\n    # The recursion is here.\n    if test -n \"$ac_sub_configure\"; then\n      # Make the cache file name correct relative to the subdirectory.\n      case $cache_file in\n      [\\\\/]* | ?:[\\\\/]* ) ac_sub_cache_file=$cache_file ;;\n      *) # Relative name.\n\tac_sub_cache_file=$ac_top_build_prefix$cache_file ;;\n      esac\n\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir\" >&5\n$as_echo \"$as_me: running $SHELL $ac_sub_configure $ac_sub_configure_args --cache-file=$ac_sub_cache_file --srcdir=$ac_srcdir\" >&6;}\n      # The eval makes quoting arguments work.\n      eval \"\\$SHELL \\\"\\$ac_sub_configure\\\" $ac_sub_configure_args \\\n\t   --cache-file=\\\"\\$ac_sub_cache_file\\\" --srcdir=\\\"\\$ac_srcdir\\\"\" ||\n\tas_fn_error $? \"$ac_sub_configure failed for $ac_dir\" \"$LINENO\" 5\n    fi\n\n    cd \"$ac_popdir\"\n  done\nfi\nif test -n \"$ac_unrecognized_opts\" && test \"$enable_option_checking\" != no; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts\" >&5\n$as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2;}\nfi\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/configure.ac",
    "content": "dnl                                               -*- Autoconf -*-\ndnl Process this file with autoconf to produce a configure script.\n\nAC_PREREQ([2.67])\nAC_INIT([shadowsocks-libev], [2.5.6], [max.c.lv@gmail.com])\nAC_CONFIG_SRCDIR([src/encrypt.c])\nAC_CONFIG_HEADERS([config.h])\nAC_CONFIG_AUX_DIR(auto)\nAC_CONFIG_MACRO_DIR([m4])\nAC_USE_SYSTEM_EXTENSIONS\n\nAM_INIT_AUTOMAKE([subdir-objects foreign -Wno-gnu -Werror])\nm4_ifdef([AM_PROG_AR], [AM_PROG_AR])\nm4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])\nAM_MAINTAINER_MODE\nAM_DEP_TRACK\n\ndnl Checks for lib\nAC_DISABLE_STATIC\nAC_DISABLE_SHARED\nLT_INIT([dlopen])\n\ndnl Check for pcre library\nTS_CHECK_PCRE\nif test \"x${enable_pcre}\" != \"xyes\"; then\n  AC_MSG_ERROR([Cannot find pcre library. Configure --with-pcre=DIR])\nfi\n\ndnl Checks for using shared libraries from system\nAC_ARG_ENABLE(\n  [system-shared-lib],\n  AS_HELP_STRING([--enable-system-shared-lib], [build against shared libraries when possible]),\n  [\n    case \"${enableval}\" in\n      yes) enable_system_shared_lib=true ;;\n      no) enable_system_shared_lib=false ;;\n      *) AC_MSG_ERROR([bad value ${enableval} for --enable-system-shared-lib]) ;;\n    esac], [enable_system_shared_lib=false])\nAM_CONDITIONAL([USE_SYSTEM_SHARED_LIB], [test x$enable_system_shared_lib = xtrue])\n\ndnl Checks for crypto library\nAC_ARG_WITH(\n  [crypto-library],\n  [AS_HELP_STRING([--with-crypto-library=library], [build with the given crypto library, TYPE=openssl|polarssl|mbedtls @<:@default=openssl@:>@])],\n  [\n    case \"${withval}\" in\n      openssl|polarssl|mbedtls) ;;\n      *) AC_MSG_ERROR([bad value ${withval} for --with-crypto-library]) ;;\n    esac\n  ],\n  [with_crypto_library=\"openssl\"]\n)\n\nAC_ARG_ENABLE([documentation],\n  AS_HELP_STRING([--disable-documentation], [do not build documentation]),\n  [disable_documentation=true],\n  [disable_documentation=false])\nAM_CONDITIONAL([ENABLE_DOCUMENTATION], [test x$disable_documentation = xfalse])\n\nAM_COND_IF([ENABLE_DOCUMENTATION], [\n  AC_PATH_PROG([ASCIIDOC], [asciidoc])\n  test x\"${ASCIIDOC}\" != x || AC_MSG_ERROR([Cannot find `asciidoc` in PATH.]) \n  AC_PATH_PROG([XMLTO], [xmlto])\n  test x\"$XMLTO\" != x || AC_MSG_ERROR([Cannot find `xmlto` in PATH.]) \n  AC_PATH_PROG([GZIP], [gzip], [gzip])\n  AC_PATH_PROG([MV], [mv], [mv])\n  AC_PROG_SED\n])\n\ndnl Checks for programs.\nAC_PROG_CC\nAM_PROG_CC_C_O\nAC_PROG_INSTALL\nAC_PROG_LN_S\nAC_PROG_LIBTOOL\nAC_PROG_MAKE_SET\nAC_LANG_SOURCE\n\ndnl Checks for libev\nAM_COND_IF([USE_SYSTEM_SHARED_LIB],\n  [],\n  [m4_include([libev/libev.m4])])\n\ndnl Add library for mingw\ncase $host in\n  *-mingw*)\n    LIBS=\"$LIBS -ladvapi32 -lgdi32 -lws2_32 -lcrypt32\"\n    ;;\n  *)\n    ;;\nesac\n\ndnl Checks for TLS\nAX_TLS([:], [:])\n\ndnl Checks for crypto library\ncase \"${with_crypto_library}\" in\n  openssl)\n    ss_ZLIB\n    ss_OPENSSL\n    AC_DEFINE([USE_CRYPTO_OPENSSL], [1], [Use OpenSSL library])\n    ;;\n  polarssl)\n    ss_POLARSSL\n    AC_DEFINE([USE_CRYPTO_POLARSSL], [1], [Use PolarSSL library])\n    ;;\n  mbedtls)\n    ss_MBEDTLS\n    AC_DEFINE([USE_CRYPTO_MBEDTLS], [1], [Use mbed TLS library])\n    ;;\nesac\n\ndnl Checks for Apple CommonCrypto API\nAC_ARG_ENABLE(applecc,\n  AS_HELP_STRING([--enable-applecc], [enable Apple CommonCrypto API support]),\n  [\n    AC_CHECK_HEADERS(CommonCrypto/CommonCrypto.h,\n      [],\n      [AC_MSG_ERROR([CommonCrypto header files not found.]); break]\n    )\n    AC_CHECK_FUNCS([CCCryptorCreateWithMode], ,\n      [AC_MSG_ERROR([CommonCrypto API needs OS X (>= 10.7) and iOS (>= 5.0).]); break]\n    )\n    AC_DEFINE([USE_CRYPTO_APPLECC], [1], [Use Apple CommonCrypto library])\n  ]\n)\n\ndnl Checks for inet_ntop\nss_FUNC_INET_NTOP\n\ndnl Checks for host.\nAC_MSG_CHECKING(for what kind of host)\ncase $host in\n  *-linux*)\n    os_support=linux\n    AC_MSG_RESULT(Linux)\n    ;;\n  *-mingw*)\n    dnl Add custom macros for libev\n    AC_DEFINE([FD_SETSIZE], [2048], [Reset max file descriptor size.])\n    AC_DEFINE([EV_FD_TO_WIN32_HANDLE(fd)], [(fd)], [Override libev default fd conversion macro.])\n    AC_DEFINE([EV_WIN32_HANDLE_TO_FD(handle)], [(handle)], [Override libev default handle conversion macro.])\n    AC_DEFINE([EV_WIN32_CLOSE_FD(fd)], [closesocket(fd)], [Override libev default fd close macro.])\n\n    os_support=mingw\n    AC_MSG_RESULT(MinGW)\n    ;;\n  *)\n    AC_MSG_RESULT(transparent proxy does not support for $host)\n    ;;\nesac\n\ndnl Checks for pthread\nAX_PTHREAD([LIBS=\"$PTHREAD_LIBS $LIBS\"\n            CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n            CC=\"$PTHREAD_CC\"], AC_MSG_ERROR(Can not find pthreads.  This is required.))\n\ndnl Checks for stack protector\nGGL_CHECK_STACK_PROTECTOR([has_stack_protector=yes], [has_stack_protector=no])\n# XXX - disable -fstack-protector due to missing libssp_nonshared\ncase \"$host_os\" in\n     *aix*)\n\tAC_MSG_NOTICE([-fstack-protector disabled on AIX])\n\thas_stack_protector=no\n\t;;\n     *sunos*)\n\tAC_MSG_NOTICE([-fstack-protector disabled on SunOS])\n\thas_stack_protector=no\n\t;;\n     *solaris*)\n\tAC_MSG_NOTICE([-fstack-protector disabled on Solaris])\n\thas_stack_protector=no\n\t;;\nesac\n\nAC_ARG_ENABLE(ssp,\n[AS_HELP_STRING(--disable-ssp,Do not compile with -fstack-protector)],\n[\n  enable_ssp=\"no\"\n],\n[\n  enable_ssp=\"yes\"\n])\n\nif test x$has_stack_protector = xyes && test x$enable_ssp = xyes; then\n   CFLAGS=\"$CFLAGS -fstack-protector\"\n   AC_MSG_NOTICE([-fstack-protector enabled in CFLAGS])\nfi\n\nAM_CONDITIONAL(BUILD_REDIRECTOR, test \"$os_support\" = \"linux\")\nAM_CONDITIONAL(BUILD_WINCOMPAT, test \"$os_support\" = \"mingw\")\n\ndnl Checks for header files.\nAC_CHECK_HEADERS([limits.h stdint.h inttypes.h arpa/inet.h fcntl.h langinfo.h locale.h netdb.h netinet/in.h stdlib.h string.h strings.h unistd.h sys/ioctl.h])\n\ndnl A special check required for <net/if.h> on Darwin. See\ndnl http://www.gnu.org/software/autoconf/manual/html_node/Header-Portability.html.\nAC_CHECK_HEADERS([sys/socket.h])\nAC_CHECK_HEADERS([net/if.h], [], [],\n[\n#include <stdio.h>\n#ifdef STDC_HEADERS\n# include <stdlib.h>\n# include <stddef.h>\n#else\n# ifdef HAVE_STDLIB_H\n#  include <stdlib.h>\n# endif\n#endif\n#ifdef HAVE_SYS_SOCKET_H\n# include <sys/socket.h>\n#endif\n])\n\ncase $host in\n  *-mingw*)\n    AC_DEFINE([CONNECT_IN_PROGRESS], [WSAEWOULDBLOCK], [errno for incomplete non-blocking connect(2)])\n    AC_CHECK_HEADERS([windows.h winsock2.h ws2tcpip.h], [], [AC_MSG_ERROR([Missing MinGW headers])], [])\n    ;;\n  *-linux*)\n    AC_DEFINE([CONNECT_IN_PROGRESS], [EINPROGRESS], [errno for incomplete non-blocking connect(2)])\n    dnl Checks for netfilter headers\n    AC_CHECK_HEADERS([linux/if.h linux/netfilter_ipv4.h linux/netfilter_ipv6/ip6_tables.h],\n                     [], [AC_MSG_ERROR([Missing netfilter headers])],\n    [[\n    #if HAVE_LIMITS_H\n    #include <limits.h>\n    #endif\n    /* Netfilter ip(6)tables v1.4.0 has broken headers */\n    #if HAVE_NETINET_IN_H\n    #include <netinet/in.h>\n    #endif\n    #if HAVE_LINUX_IF_H\n    #include <linux/if.h>\n    #endif\n    #if HAVE_SYS_SOCKET_H\n    #include <sys/socket.h>\n    #endif\n    ]])\n    ;;\n  *)\n    # These are POSIX-like systems using BSD-like sockets API.\n    AC_DEFINE([CONNECT_IN_PROGRESS], [EINPROGRESS], [errno for incomplete non-blocking connect(2)])\n    ;;\nesac\n\nAC_C_BIGENDIAN\n\ndnl Checks for typedefs, structures, and compiler characteristics.\nAC_C_INLINE\nAC_TYPE_SSIZE_T\n\ndnl Checks for header files.\nAC_HEADER_ASSERT\nAC_HEADER_STDC\nAC_HEADER_SYS_WAIT\n\ndnl Checks for typedefs, structures, and compiler characteristics.\nAC_C_CONST\nAC_TYPE_PID_T\nAC_TYPE_SIZE_T\nAC_TYPE_SSIZE_T\nAC_TYPE_UINT16_T\nAC_TYPE_UINT8_T\nAC_HEADER_TIME\n\ndnl Checks for library functions.\nAC_FUNC_FORK\nAC_FUNC_SELECT_ARGTYPES\nAC_TYPE_SIGNAL\nAC_CHECK_FUNCS([memset select setresuid setreuid strerror getpwnam_r setrlimit])\n\ndnl Check for select() into ws2_32 for Msys/Mingw\nif test \"$ac_cv_func_select\" != \"yes\"; then\n  AC_MSG_CHECKING([for select in ws2_32])\n  AC_TRY_LINK([\n#ifdef HAVE_WINSOCK2_H\n#ifndef WIN32_LEAN_AND_MEAN\n#define WIN32_LEAN_AND_MEAN\n#endif\n#include <winsock2.h>\n#endif\n    ],[\n      select(0,(fd_set *)NULL,(fd_set *)NULL,(fd_set *)NULL,(struct timeval *)NULL);\n    ],[\n      AC_MSG_RESULT([yes])\n      HAVE_SELECT=\"1\"\n      AC_DEFINE_UNQUOTED(HAVE_SELECT, 1,\n        [Define to 1 if you have the 'select' function.])\n      HAVE_SYS_SELECT_H=\"1\"\n      AC_DEFINE_UNQUOTED(HAVE_SYS_SELECT_H, 1,\n        [Define to 1 if you have the <sys/select.h> header file.])\n    ],[\n      AC_MSG_ERROR([no])\n  ])\nfi\n\nAC_CHECK_LIB(socket, connect)\n\ndnl Checks for library functions.\nAC_CHECK_FUNCS([malloc memset socket])\n\ndnl Add define for libudns to enable IPv6 support\ndnl This is an option defined in the origin configure script\nAC_DEFINE([HAVE_IPv6], [1], [Enable IPv6 support in libudns])\n\nAM_COND_IF([USE_SYSTEM_SHARED_LIB],[\n    AC_CHECK_LIB([sodium], [sodium_init], ,[\n       AC_MSG_ERROR([Couldn't find libsodium. Try installing libsodium-dev@<:@el@:>@.])\n    ])\n  ],\n  [AC_CONFIG_SUBDIRS([libsodium])])\n\nAC_CONFIG_FILES([ shadowsocks-libev.pc\n                 Makefile\n                 libcork/Makefile\n                 libipset/Makefile\n                 src/Makefile])\nAM_COND_IF([USE_SYSTEM_SHARED_LIB],[\n    AC_CHECK_LIB([udns], [dns_dnlen], ,[AC_MSG_ERROR([Couldn't find libudns. Try installing libudns-dev or udns-devel.])])\n    AC_CHECK_LIB([ev], [ev_loop_destroy], ,[AC_MSG_ERROR([Couldn't find libev. Try installing libev-dev@<:@el@:>@.])])\n  ],\n  [AC_CONFIG_FILES([libudns/Makefile\n                 libev/Makefile])])\n\nAM_COND_IF([ENABLE_DOCUMENTATION],\n  [AC_CONFIG_FILES([doc/Makefile])\n])\n\nAC_OUTPUT\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/README.Debian",
    "content": "shadowsocks-libev for Debian\n----------------------\n\nThe Debian package has added systemd support. A default server service which\nreads the default configuration in /etc/default/shadowsocks-libev is installed\nand enabled by default, plus some other service templates placed in\n/lib/systemd/system, which can be used by users later.\n\nAnother problem is that shadowsocks-libev is licensed under GPLv3+. This will\nconflict with OpenSSL License when linked against OpenSSL library. As a\nresult, this package faces licensing problem. Use it at your own risk.\n\n -- Boyuan Yang <073plan@gmail.com>  Wed, 14 Oct 2015 09:18:50 +0800\n\n(No special notes.)\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 06 Apr 2013 16:59:15 +0800\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/changelog",
    "content": "shadowsocks-libev (2.5.6-1) unstable; urgency=medium\n\n  * Add outbound ACL for server.\n  * Refine log format.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 01 Nov 2016 09:51:52 +0800\n\nshadowsocks-libev (2.5.5-1) unstable; urgency=medium\n\n  * Refine attack detection.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 11 Oct 2016 15:45:09 +0800\n\nshadowsocks-libev (2.5.4-1) unstable; urgency=medium\n\n  * Fix a bug of auto blocking mechanism.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 09 Oct 2016 19:36:37 +0800\n\nshadowsocks-libev (2.5.3-1) unstable; urgency=medium\n\n  * Fix TCP Fast Open on macOS.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 21 Sep 2016 19:31:57 +0800\n\nshadowsocks-libev (2.5.2-1) unstable; urgency=medium\n\n  * Fix a bug of UDP relay mode of ss-local.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 12 Sep 2016 12:54:33 +0800\n\nshadowsocks-libev (2.5.1-1) unstable; urgency=medium\n\n  * Refine ACL feature with hostname support.\n  * Add HTTP/SNI parser for ss-local/ss-redir.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 10 Sep 2016 17:06:49 +0800\n\nshadowsocks-libev (2.5.0-1) unstable; urgency=medium\n\n  * Fix several bugs of the command line interface.\n  * Add aes-128/192/256-ctr ciphers.\n  * Add option MTU for UDP relay.\n  * Add MultiPath TCP support.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 29 Aug 2016 13:07:51 +0800\n\nshadowsocks-libev (2.4.8-1) unstable; urgency=low\n\n  * Update manual pages with asciidoc.\n  * Fix issues of bind_address option.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 20 Jul 2016 09:25:50 +0800\n\nshadowsocks-libev (2.4.7-1) unstable; urgency=low\n\n  * Add ss-nat, a helper script to set up NAT rules for ss-redir.\n  * Fix several issues for debian package.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 1 Jun 2016 18:21:45 +0800\n\nshadowsocks-libev (2.4.6-1) unstable; urgency=low\n\n  * Update manual pages.\n\n -- Max Lv <max.c.lv@gmail.com>  Thu, 21 Apr 2016 17:33:34 +0800\n\nshadowsocks-libev (2.4.5-1) unstable; urgency=low\n\n  * Fix build issues on OpenWRT.\n  * Reduce the latency of redir mode.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 01 Feb 2016 13:22:50 +0800\n\nshadowsocks-libev (2.4.4-1) unstable; urgency=low\n\n  * Fix a potential memory leak.\n  * Fix some compiler related issues.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 13 Jan 2016 11:50:12 +0800\n\nshadowsocks-libev (2.4.3-1) unstable; urgency=high\n\n  * Refine the buffer allocation.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 19 Dec 2015 12:30:21 +0900\n\nshadowsocks-libev (2.4.1-1) unstable; urgency=high\n\n  * Fix a security bug.\n\n -- Max Lv <max.c.lv@gmail.com>  Thu, 29 Oct 2015 15:42:47 +0900\n\nshadowsocks-libev (2.4.0-1) unstable; urgency=low\n\n  * Update the one-time authentication\n\n -- Max Lv <max.c.lv@gmail.com>  Thu, 24 Sep 2015 14:11:05 +0900\n\nshadowsocks-libev (2.3.3-1) unstable; urgency=low\n\n  * Refine the onetime authentication of header.\n  * Enforce CRC16 on the payload.\n\n -- Max Lv <max.c.lv@gmail.com>  Fri, 18 Sep 2015 10:38:21 +0900\n\nshadowsocks-libev (2.3.2-1) unstable; urgency=low\n\n  * Fix minor issues of build scripts.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 13 Sep 2015 15:22:28 +0900\n\nshadowsocks-libev (2.3.1-1) unstable; urgency=low\n\n  * Fix an issue of connection cache of UDP relay.\n  * Add support of onetime authentication for header verification.\n\n -- Max Lv <max.c.lv@gmail.com>  Fri, 04 Sep 2015 07:54:02 +0900\n\nshadowsocks-libev (2.3.0-1) unstable; urgency=low\n\n  * Add manager mode to support multi-user and traffic stat.\n  * Fix a build issue on OS X El Capitan.\n\n -- Max Lv <max.c.lv@gmail.com>  Thu, 30 Jul 2015 17:30:43 +0900\n\nshadowsocks-libev (2.2.3-1) unstable; urgency=high\n\n  * Fix the multiple UDP source port issue.\n  * Allow working in UDP only mode.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 11 Jul 2015 08:31:02 +0900\n\nshadowsocks-libev (2.2.2-1) unstable; urgency=low\n\n  * Fix the timer of UDP relay.\n  * Check name_len in the header.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 15 Jun 2015 10:26:40 +0900\n\nshadowsocks-libev (2.2.1-1) unstable; urgency=low\n\n  * Fix an issue of UDP relay.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 10 May 2015 21:23:44 +0900\n\nshadowsocks-libev (2.2.0-1) unstable; urgency=low\n\n  * Add TPROXY support in redir mode.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 04 May 2015 02:44:17 -0300\n\nshadowsocks-libev (2.1.4-1) unstable; urgency=low\n\n  * Fix a bug of server mode ACL.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 08 Feb 2015 20:24:43 +0900\n\nshadowsocks-libev (2.1.3-1) unstable; urgency=low\n\n  * Add ACL support to remote server.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 08 Feb 2015 10:59:44 +0900\n\nshadowsocks-libev (2.1.2-1) unstable; urgency=low\n\n  * Refine multiple port binding.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 31 Jan 2015 18:56:25 +0900\n\nshadowsocks-libev (2.1.1-1) unstable; urgency=low\n\n  * Fix a memory leak.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 21 Jan 2015 21:40:58 +0900\n\nshadowsocks-libev (2.1.0-1) unstable; urgency=low\n\n  * Fix a bug of tunnel mode.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 19 Jan 2015 09:59:52 +0900\n\nshadowsocks-libev (2.0.8-1) unstable; urgency=low\n\n  * Fix a bug of IPv6.\n\n -- Max Lv <max.c.lv@gmail.com>  Fri, 16 Jan 2015 10:58:12 +0900\n\nshadowsocks-libev (2.0.7-1) unstable; urgency=low\n\n  * Fix some performance issue.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 13 Jan 2015 13:17:58 +0900\n\nshadowsocks-libev (2.0.6-1) unstable; urgency=high\n\n  * Fix a critical issue in redir mode.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 12 Jan 2015 21:51:19 +0900\n\nshadowsocks-libev (2.0.5-1) unstable; urgency=low\n\n  * Refine local, tunnel, and redir modes.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 12 Jan 2015 12:39:05 +0800\n\nshadowsocks-libev (2.0.4-1) unstable; urgency=low\n\n  * Fix building issues with MinGW32.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 11 Jan 2015 13:33:31 +0900\n\nshadowsocks-libev (2.0.3-1) unstable; urgency=high\n\n  * Fix some issues.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 10 Jan 2015 16:27:54 +0800\n\nshadowsocks-libev (2.0.2-1) unstable; urgency=low\n\n  * Fix issues with MinGW.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 10 Jan 2015 15:17:10 +0800\n\nshadowsocks-libev (2.0.1-1) unstable; urgency=low\n\n  * Implement a real asynchronous DNS resolver.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 10 Jan 2015 10:04:28 +0800\n\nshadowsocks-libev (1.6.4-1) unstable; urgency=low\n\n  * Update documents.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 07 Jan 2015 21:48:58 +0900\n\nshadowsocks-libev (1.6.3-1) unstable; urgency=low\n\n  * Refine ss-redir.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 04 Jan 2015 19:23:52 +0900\n\nshadowsocks-libev (1.6.2-1) unstable; urgency=low\n\n  * Fix some build issues.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 30 Dec 2014 10:30:28 +0800\n\nshadowsocks-libev (1.6.1-1) unstable; urgency=high\n\n  * Add salsa20 and chacha20 support.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 13 Dec 2014 15:11:34 +0800\n\nshadowsocks-libev (1.6.0-1) unstable; urgency=low\n\n  * Solve conflicts with other shadowsocks portings.\n\n -- Max Lv <max.c.lv@gmail.com>  Mon, 17 Nov 2014 14:10:21 +0800\n\nshadowsocks-libev (1.5.3-2) unstable; urgency=low\n\n  * rename as shadowsocks-libev.\n\n -- Symeon Huang <hzwhuang@gmail.com>  Sat, 15 Nov 2014 14:55:28 +0000\n\nshadowsocks (1.5.3-1) unstable; urgency=low\n\n  * Fix log on Win32.\n\n -- Max Lv <max.c.lv@gmail.com>  Fri, 14 Nov 2014 09:10:06 +0800\n\nshadowsocks (1.5.2-1) unstable; urgency=low\n\n  * Handle SIGTERM and SIGKILL nicely.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 12 Nov 2014 13:11:29 +0800\n\nshadowsocks (1.5.1-1) unstable; urgency=low\n\n  * Fix a bug of tcp fast open.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 08 Nov 2014 19:45:37 +0900\n\nshadowsocks (1.5.0-1) unstable; urgency=low\n\n  * Support to build static or shared library.\n  * Supprot IPv6 NAT in redirect mode.\n  * Refine the cache size of UDPRelay.\n\n -- Max Lv <max.c.lv@gmail.com>  Fri, 07 Nov 2014 09:33:19 +0800\n\nshadowsocks (1.4.8-1) unstable; urgency=low\n\n  * Fix a bug of tcp fast open.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 08 Oct 2014 18:02:02 +0800\n\nshadowsocks (1.4.7-1) unstable; urgency=low\n\n  * Add a new encryptor rc4-md5.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 09 Sep 2014 07:50:10 +0800\n\nshadowsocks (1.4.6-1) unstable; urgency=low\n\n  * Add ACL support.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 03 May 2014 04:37:10 -0400\n\nshadowsocks (1.4.5-1) unstable; urgency=high\n\n  * Fix the compatibility issue of udprelay.\n  * Enhance asyncns to reduce the latency.\n  * Add TCP_FASTOPEN support.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 20 Apr 2014 08:12:45 +0800\n\nshadowsocks (1.4.4-1) unstable; urgency=low\n\n  * Add CommonCrypto support for darwin.\n  * Fix some config related issues.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 26 Mar 2014 13:29:03 +0800\n\nshadowsocks (1.4.3-1) unstable; urgency=low\n\n  * Add tunnel mode with local port forwarding feature.\n\n -- Max Lv <max.c.lv@gmail.com>  Fri, 21 Feb 2014 11:52:13 +0900\n\nshadowsocks (1.4.2-1) unstable; urgency=high\n\n  * Fix the UDP relay issues.\n  * Add syslog support.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 05 Jan 2014 10:05:29 +0900\n\nshadowsocks (1.4.1-1) unstable; urgency=low\n\n  * Add multi-port support.\n  * Add PolarSSL support by @linusyang.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 12 Nov 2013 03:57:21 +0000\n\nshadowsocks (1.4.0-1) unstable; urgency=low\n\n  * Add standard socks5 udp support.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 08 Sep 2013 02:20:40 +0000\n\nshadowsocks (1.3.3-1) unstable; urgency=high\n\n  * Provide more info in verbose mode.\n\n -- Max Lv <max.c.lv@gmail.com>  Fri, 21 Jun 2013 09:59:20 +0800\n\nshadowsocks (1.3.2-1) unstable; urgency=high\n\n  * Fix some ciphers by @linusyang.\n\n -- Max Lv <max.c.lv@gmail.com>  Sun, 09 Jun 2013 09:52:31 +0000\n\nshadowsocks (1.3.1-1) unstable; urgency=low\n\n  * Support more cihpers: camellia, idea, rc2 and seed.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 04 Jun 2013 00:56:17 +0000\n\nshadowsocks (1.3-1) unstable; urgency=low\n\n  * Able to bind connections to specific interface.\n  * Support more ciphers: aes-128-cfb, aes-192-cfb, aes-256-cfb, bf-cfb, cast5-cfb, des-cfb.\n\n -- Max Lv <max.c.lv@gmail.com>  Thu, 16 May 2013 10:51:15 +0800\n\nshadowsocks (1.2-2) unstable; urgency=low\n\n  * Close timeouted TCP connections.\n\n -- Max Lv <max.c.lv@gmail.com>  Tue, 07 May 2013 14:10:33 +0800\n\nshadowsocks (1.2-1) unstable; urgency=low\n\n  * Fix a high load issue.\n\n -- Max Lv <max.c.lv@gmail.com>  Thu, 18 Apr 2013 10:52:34 +0800\n\nshadowsocks (1.1-1) unstable; urgency=low\n\n  * Fix a IPV6 resolve issue.\n\n -- Max Lv <max.c.lv@gmail.com>  Wed, 10 Apr 2013 12:11:36 +0800\n\nshadowsocks (1.0-2) unstable; urgency=low\n\n  * Initial release.\n\n -- Max Lv <max.c.lv@gmail.com>  Sat, 06 Apr 2013 16:59:15 +0800\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/compat",
    "content": "9\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/config.json",
    "content": "{\n    \"server\":\"127.0.0.1\",\n    \"server_port\":8388,\n    \"local_port\":1080,\n    \"password\":\"barfoo!\",\n    \"timeout\":60,\n    \"method\":null\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/control",
    "content": "Source: shadowsocks-libev\nSection: net\nPriority: extra\nMaintainer: Max Lv <max.c.lv@gmail.com>\nBuild-Depends:\n asciidoc,\n autotools-dev,\n debhelper (>= 9),\n dh-systemd (>= 1.5),\n gawk,\n libpcre3-dev,\n libssl-dev (>= 0.9.8),\n mime-support,\n pkg-config,\n xmlto,\nStandards-Version: 3.9.8\nHomepage: https://www.shadowsocks.org\nVcs-Git: https://github.com/shadowsocks/shadowsocks-libev.git\nVcs-Browser: https://github.com/shadowsocks/shadowsocks-libev\n\nPackage: libshadowsocks-libev-dev\nArchitecture: any\nSection: libdevel\nBreaks:\n shadowsocks-libev (<< 2.4.0),\nDepends:\n libshadowsocks-libev2 (= ${binary:Version}),\n ${misc:Depends},\nDescription: lightweight and secure socks5 proxy (development files)\n Shadowsocks-libev is a lightweight and secure socks5 proxy for\n embedded devices and low end boxes.\n .\n Shadowsocks-libev was inspired by Shadowsock (in Python). It's rewritten\n in pure C and only depends on libev, mbedTLS and a few other tiny\n libraries.\n .\n This package provides C header files for the libraries.\n\nPackage: libshadowsocks-libev2\nArchitecture: any\nMulti-Arch: same\nSection: libs\nReplaces: libshadowsocks-libev1\nBreaks:\n libshadowsocks-libev1,\n shadowsocks-libev (<< 2.4.0),\nPre-Depends:\n ${misc:Pre-Depends},\nDepends:\n ${misc:Depends},\n ${shlibs:Depends},\nDescription: lightweight and secure socks5 proxy (shared library)\n Shadowsocks-libev is a lightweight and secure socks5 proxy for\n embedded devices and low end boxes.\n .\n Shadowsocks-libev was inspired by Shadowsock (in Python). It's rewritten\n in pure C and only depends on libev, mbedTLS and a few other tiny\n libraries.\n .\n This package provides shared libraries.\n\nPackage: shadowsocks-libev\nReplaces:\n shadowsocks (<< 1.5.3-2),\nBreaks:\n shadowsocks (<< 1.5.3-2),\nArchitecture: any\nDepends:\n apg,\n ${misc:Depends},\n ${shlibs:Depends},\nDescription: lightweight and secure socks5 proxy\n Shadowsocks-libev is a lightweight and secure socks5 proxy for\n embedded devices and low end boxes.\n .\n Shadowsocks-libev was inspired by Shadowsock (in Python). It's rewritten\n in pure C and only depends on libev, mbedTLS and a few other tiny\n libraries.\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/copyright",
    "content": "Format: http://www.debian.org/doc/packaging-manuals/copyright-format/1.0/\nUpstream-Name: shadowsocks-libev\nUpstream-Contact: Max Lv <max.c.lv@gmail.com>\nSource: https://github.com/shadowsocks/shadowsocks-libev\n\nFiles: *\nCopyright: 2013-2015, Clow Windy <clowwindy42@gmail.com>\n           2013-2016, Max Lv <max.c.lv@gmail.com>\n           2014, Linus Yang <linusyang@gmail.com>\nLicense: GPL-3+\n\nFiles: debian/*\nCopyright: 2013-2015, Max Lv <max.c.lv@gmail.com>\n           2015, Boyuan Yang <073plan@gmail.com>\n           2016, Roger Shimizu <rogershimizu@gmail.com>\nLicense: GPL-3+\n\nFiles: libcork/* libipset/*\nCopyright: 2011-2013, RedJack, LLC.\nLicense: BSD-3-clause\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are\n met:\n .\n Redistributions of source code must retain the above copyright\n notice, this list of conditions and the following disclaimer.\n .\n Redistributions in binary form must reproduce the above copyright\n notice, this list of conditions and the following disclaimer in\n the documentation and/or other materials provided with the\n distribution.\n .\n Neither the name of RedJack Software, LLC nor the names of its\n contributors may be used to endorse or promote products derived\n from this software without specific prior written permission.\n .\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n \"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\n LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\n A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT\n HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\n SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\n LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\n OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nFiles: doc/*\nCopyright: 2012-2016, Max Lv <max.c.lv@gmail.com>\nLicense: GFDL-1.1+\n\nFiles: m4/ax_pthread.m4\nCopyright: 2008 Steven G. Johnson <stevenj@alum.mit.edu>\n           2011 Daniel Richard G. <skunk@iSKUNK.ORG>\nLicense: GPL-3+ with Autoconf exception\n\nFiles: m4/ax_tls.m4\nCopyright: 2008 Alan Woodland <ajw05@aber.ac.uk>\n           2010 Diego Elio Petteno` <flameeyes@gmail.com>\nLicense: GPL-3+ with Autoconf exception\n\nFiles: m4/pcre.m4\nCopyright: 2015 Syrone Wong <wong.syrone@gmail.com>\nLicense: Apache-2.0\n\nFiles: m4/stack-protector.m4\nCopyright: 2007 Google Inc.\nLicense: Apache-2.0\n\nFiles: src/json.c src/json.h\nCopyright: 2012-2014, James McLaughlin et al.\nLicense: BSD-2-clause\n\nFiles: src/http.c src/http.h src/protocol.h src/resolv.c src/resolv.h src/tls.c src/tls.h\nCopyright: 2011-2014, Dustin Lundquist <dustin@null-ptr.net>\nLicense: BSD-2-clause\n\nFiles: src/rule.c src/rule.h\nCopyright: 2011-2012, Dustin Lundquist <dustin@null-ptr.net>\n           2011, Manuel Kasper <mk@neon1.net>\nLicense: BSD-2-clause\n\nFiles: src/ss-nat\nCopyright: 2015, OpenWrt-dist\n           2015, Jian Chang <aa65535@live.com>\nLicense: GPL-3+\n\nFiles: src/uthash.h\nCopyright: 2003-2013, Troy D. Hanson\nLicense: BSD-1-clause\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions are met:\n .\n * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n .\n THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\n IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\n TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\n PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER\n OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\n EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\n PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\n LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\n NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\n SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n\nLicense: Apache-2.0\n Licensed to the Apache Software Foundation (ASF) under one or more\n contributor license agreements.  See the NOTICE file distributed with\n this work for additional information regarding copyright ownership.\n The ASF licenses this file to You under the Apache License, Version 2.0\n (the \"License\"); you may not use this file except in compliance with\n the License.  You may obtain a copy of the License at\n .\n         http://www.apache.org/licenses/LICENSE-2.0\n .\n Unless required by applicable law or agreed to in writing, software\n distributed under the License is distributed on an \"AS IS\" BASIS,\n WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n See the License for the specific language governing permissions and\n limitations under the License.\n .\n On Debian systems, the complete text of the Apache version 2.0 license\n can be found in \"/usr/share/common-licenses/Apache-2.0\".\n\nLicense: BSD-2-clause\n Redistribution and use in source and binary forms, with or without\n modification, are permitted provided that the following conditions\n are met:\n .\n 1. Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer.\n .\n 2. Redistributions in binary form must reproduce the above copyright\n    notice, this list of conditions and the following disclaimer in the\n    documentation and/or other materials provided with the distribution.\n .\n THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n SUCH DAMAGE.\n\nLicense: GFDL-1.1+\n Permission is granted to copy, distribute and/or modify this document\n under the terms of the GNU Free Documentation License, Version 1.1 or\n any later version published by the Free Software Foundation;\n with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.\n .\n A copy of the license is included in the section entitled\n \"GNU Free Documentation License\".\n\nLicense: GPL-3+\n This package is free software; you can redistribute it and/or modify\n it under the terms of the GNU General Public License as published by\n the Free Software Foundation; either version 3 of the License, or\n (at your option) any later version.\n .\n This package is distributed in the hope that it will be useful,\n but WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n GNU General Public License for more details.\n .\n You should have received a copy of the GNU General Public License\n along with this program. If not, see <http://www.gnu.org/licenses/>\n .\n On Debian systems, the complete text of the GNU General\n Public License version 3 can be found in \"/usr/share/common-licenses/GPL-3\".\n\nLicense: GPL-3+ with Autoconf exception\n This program is free software: you can redistribute it and/or modify it\n under the terms of the GNU General Public License as published by the\n Free Software Foundation, either version 3 of the License, or (at your\n option) any later version.\n .\n This program is distributed in the hope that it will be useful, but\n WITHOUT ANY WARRANTY; without even the implied warranty of\n MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n Public License for more details.\n .\n You should have received a copy of the GNU General Public License along\n with this program. If not, see <http://www.gnu.org/licenses/>.\n .\n As a special exception, the respective Autoconf Macro's copyright owner\n gives unlimited permission to copy, distribute and modify the configure\n scripts that are the output of Autoconf when processing the Macro. You\n need not follow the terms of the GNU General Public License when using\n or distributing such scripts, even though portions of the text of the\n Macro appear in them. The GNU General Public License (GPL) does govern\n all other use of the material that constitutes the Autoconf Macro.\n .\n This special exception to the GPL applies to versions of the Autoconf\n Macro released by the Autoconf Archive. When you make and distribute a\n modified version of the Autoconf Macro, you may extend this special\n exception to the GPL to apply to your modified version as well.\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/copyright.original",
    "content": "This work was packaged for Debian by:\n\n    Max Lv <max.c.lv@gmail.com> on Sat, 06 Apr 2013 16:59:15 +0800\n\nIt was downloaded from:\n\n    https://github.com/madeye/shadowsocks-libev\n\nUpstream Author(s):\n\n    clowwindy <clowwindy42@gmail.com>\n\nCopyright:\n\n    Copyright (C) 2013 Max Lv\n\nLicense:\n\n    GPLv3\n\nThe Debian packaging is:\n\n    Copyright (C) 2013 Max Lv <max.c.lv@gmail.com>\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/libshadowsocks-libev-dev.install",
    "content": "usr/include/\nusr/lib/*/libshadowsocks-libev.so\nusr/lib/*/pkgconfig/\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/libshadowsocks-libev2.install",
    "content": "usr/lib/*/libshadowsocks-libev.so.*\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/rules",
    "content": "#!/usr/bin/make -f\n# See debhelper(7) (uncomment to enable)\n# output every command that modifies files on the build system.\n#export DH_VERBOSE = 1\n\n# Security Hardening\nexport DEB_BUILD_MAINT_OPTIONS = hardening=+all\n\nDPKG_EXPORT_BUILDFLAGS = 1\ninclude /usr/share/dpkg/buildflags.mk\n\noverride_dh_auto_install:\n\tfind src/ -name '*.la' -delete\n\tdh_auto_install\n\noverride_dh_auto_configure:\n\tdh_auto_configure -- \\\n        --enable-shared \\\n        --disable-ssp\n\noverride_dh_installchangelogs:\n\tdh_installchangelogs -XChanges\n\n%:\n\tdh $@ --with systemd\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/shadowsocks-libev-local@.service",
    "content": "#  This file is part of shadowsocks-libev.\n#\n#  Shadowsocks-libev is free software; you can redistribute it and/or modify\n#  it under the terms of the GNU General Public License as published by\n#  the Free Software Foundation; either version 3 of the License, or\n#  (at your option) any later version.\n#\n#  This is a template unit file. Users may copy and rename the file into\n#  config directories to make new service instances. See systemd.unit(5)\n#  for details.\n\n[Unit]\nDescription=Shadowsocks-Libev Custom Client Service for %I\nDocumentation=man:ss-local(1)\nAfter=network.target\n\n[Service]\nType=simple\nCapabilityBoundingSet=CAP_NET_BIND_SERVICE\nExecStart=/usr/bin/ss-local -c /etc/shadowsocks-libev/%i.json\n\n[Install]\nWantedBy=multi-user.target\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/shadowsocks-libev-redir@.service",
    "content": "#  This file is part of shadowsocks-libev.\n#\n#  Shadowsocks-libev is free software; you can redistribute it and/or modify\n#  it under the terms of the GNU General Public License as published by\n#  the Free Software Foundation; either version 3 of the License, or\n#  (at your option) any later version.\n#\n#  This is a template unit file. Users may copy and rename the file into\n#  config directories to make new service instances. See systemd.unit(5)\n#  for details.\n\n[Unit]\nDescription=Shadowsocks-Libev Custom Client Service Redir Mode for %I\nDocumentation=man:ss-redir(1)\nAfter=network.target\n\n[Service]\nType=simple\nCapabilityBoundingSet=CAP_NET_ADMIN CAP_NET_BIND_SERVICE\nExecStart=/usr/bin/ss-redir -c /etc/shadowsocks-libev/%i.json\n\n[Install]\nWantedBy=multi-user.target\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/shadowsocks-libev-server@.service",
    "content": "#  This file is part of shadowsocks-libev.\n#\n#  Shadowsocks-libev is free software; you can redistribute it and/or modify\n#  it under the terms of the GNU General Public License as published by\n#  the Free Software Foundation; either version 3 of the License, or\n#  (at your option) any later version.\n#\n#  This is a template unit file. Users may copy and rename the file into\n#  config directories to make new service instances. See systemd.unit(5)\n#  for details.\n\n[Unit]\nDescription=Shadowsocks-Libev Custom Server Service for %I\nDocumentation=man:ss-server(1)\nAfter=network.target\n\n[Service]\nType=simple\nCapabilityBoundingSet=CAP_NET_BIND_SERVICE\nExecStart=/usr/bin/ss-server -c /etc/shadowsocks-libev/%i.json\n\n[Install]\nWantedBy=multi-user.target\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/shadowsocks-libev-tunnel@.service",
    "content": "#  This file is part of shadowsocks-libev.\n#\n#  Shadowsocks-libev is free software; you can redistribute it and/or modify\n#  it under the terms of the GNU General Public License as published by\n#  the Free Software Foundation; either version 3 of the License, or\n#  (at your option) any later version.\n#\n#  This is a template unit file. Users may copy and rename the file into\n#  config directories to make new service instances. See systemd.unit(5)\n#  for details.\n\n[Unit]\nDescription=Shadowsocks-Libev Custom Client Service Tunnel Mode for %I\nDocumentation=man:ss-tunnel(1)\nAfter=network.target\n\n[Service]\nType=simple\nCapabilityBoundingSet=CAP_NET_BIND_SERVICE\nExecStart=/usr/bin/ss-tunnel -c /etc/shadowsocks-libev/%i.json\n\n[Install]\nWantedBy=multi-user.target\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/shadowsocks-libev.default",
    "content": "# Defaults for shadowsocks initscript\n# sourced by /etc/init.d/shadowsocks-libev\n# installed at /etc/default/shadowsocks-libev by the maintainer scripts\n\n#\n# This is a POSIX shell fragment\n#\n# Note: `START', `GROUP' and `MAXFD' options are not recognized by systemd.\n# Please change those settings in the corresponding systemd unit file.\n\n# Enable during startup?\nSTART=yes\n\n# Configuration file\nCONFFILE=\"/etc/shadowsocks-libev/config.json\"\n\n# Extra command line arguments\nDAEMON_ARGS=\"-u\"\n\n# User and group to run the server as\nUSER=root\nGROUP=root\n\n# Number of maximum file descriptors\nMAXFD=32768\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/shadowsocks-libev.docs",
    "content": "AUTHORS\nREADME.md\ndebian/copyright.original\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/shadowsocks-libev.init",
    "content": "#!/bin/sh\n### BEGIN INIT INFO\n# Provides:          shadowsocks-libev\n# Required-Start:    $network $local_fs $remote_fs\n# Required-Stop:     $remote_fs\n# Default-Start:     2 3 4 5\n# Default-Stop:      0 1 6\n# Short-Description: lightweight secured socks5 proxy\n# Description:       Shadowsocks-libev is a lightweight secured\n#                    socks5 proxy for embedded devices and low end boxes.\n### END INIT INFO\n\n# Author: Max Lv <max.c.lv@gmail.com>\n\n# PATH should only include /usr/ if it runs after the mountnfs.sh script\nPATH=/sbin:/usr/sbin:/bin:/usr/bin\nDESC=shadowsocks-libev       # Introduce a short description here\nNAME=shadowsocks-libev       # Introduce the short server's name here\nDAEMON=/usr/bin/ss-server    # Introduce the server's location here\nDAEMON_ARGS=\"\"               # Arguments to run the daemon with\nPIDFILE=/var/run/$NAME/$NAME.pid\nSCRIPTNAME=/etc/init.d/$NAME\n\n# Exit if the package is not installed\n[ -x $DAEMON ] || exit 0\n\n# Read configuration variable file if it is present\n[ -r /etc/default/$NAME ] && . /etc/default/$NAME\n\n[ \"$START\" = \"yes\" ] || exit 0\n\n: ${USER:=\"root\"}\n: ${GROUP:=\"root\"}\n\n# Load the VERBOSE setting and other rcS variables\n. /lib/init/vars.sh\n\n# Define LSB log_* functions.\n# Depend on lsb-base (>= 3.0-6) to ensure that this file is present.\n. /lib/lsb/init-functions\n\n#\n# Function that starts the daemon/service\n#\ndo_start()\n{\n    # Modify the file descriptor limit\n    ulimit -n ${MAXFD}\n\n    # Take care of pidfile permissions\n    mkdir /var/run/$NAME 2>/dev/null || true\n    chown \"$USER:$GROUP\" /var/run/$NAME\n\n    # Return\n    #   0 if daemon has been started\n    #   1 if daemon was already running\n    #   2 if daemon could not be started\n    start-stop-daemon --start --quiet --pidfile $PIDFILE --chuid root:$GROUP --exec $DAEMON --test > /dev/null \\\n        || return 1\n    start-stop-daemon --start --quiet --pidfile $PIDFILE --chuid root:$GROUP --exec $DAEMON -- \\\n        -c \"$CONFFILE\" -a \"$USER\" -u -f $PIDFILE $DAEMON_ARGS \\\n        || return 2\n}\n\n#\n# Function that stops the daemon/service\n#\ndo_stop()\n{\n    # Return\n    #   0 if daemon has been stopped\n    #   1 if daemon was already stopped\n    #   2 if daemon could not be stopped\n    #   other if a failure occurred\n    start-stop-daemon --stop --quiet --retry=KILL/5 --pidfile $PIDFILE --exec $DAEMON\n    RETVAL=\"$?\"\n    [ \"$RETVAL\" = 2 ] && return 2\n    # Wait for children to finish too if this is a daemon that forks\n    # and if the daemon is only ever run from this initscript.\n    # If the above conditions are not satisfied then add some other code\n    # that waits for the process to drop all resources that could be\n    # needed by services started subsequently.  A last resort is to\n    # sleep for some time.\n    start-stop-daemon --stop --quiet --oknodo --retry=KILL/5 --exec $DAEMON\n    [ \"$?\" = 2 ] && return 2\n    # Many daemons don't delete their pidfiles when they exit.\n    rm -f $PIDFILE\n    return \"$RETVAL\"\n}\n\n\ncase \"$1\" in\n    start)\n        [ \"$VERBOSE\" != no ] && log_daemon_msg \"Starting $DESC \" \"$NAME\"\n        do_start\n        case \"$?\" in\n            0|1) [ \"$VERBOSE\" != no ] && log_end_msg 0 ;;\n        2) [ \"$VERBOSE\" != no ] && log_end_msg 1 ;;\n    esac\n    ;;\nstop)\n    [ \"$VERBOSE\" != no ] && log_daemon_msg \"Stopping $DESC\" \"$NAME\"\n    do_stop\n    case \"$?\" in\n        0|1) [ \"$VERBOSE\" != no ] && log_end_msg 0 ;;\n    2) [ \"$VERBOSE\" != no ] && log_end_msg 1 ;;\nesac\n;;\n  status)\n      status_of_proc \"$DAEMON\" \"$NAME\" && exit 0 || exit $?\n      ;;\n  restart|force-reload)\n      log_daemon_msg \"Restarting $DESC\" \"$NAME\"\n      do_stop\n      case \"$?\" in\n          0|1)\n              do_start\n              case \"$?\" in\n                  0) log_end_msg 0 ;;\n              1) log_end_msg 1 ;; # Old process is still running\n          *) log_end_msg 1 ;; # Failed to start\n      esac\n      ;;\n  *)\n      # Failed to stop\n      log_end_msg 1\n      ;;\n    esac\n    ;;\n*)\n    echo \"Usage: $SCRIPTNAME {start|stop|status|restart|force-reload}\" >&2\n    exit 3\n    ;;\nesac\n\n:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/shadowsocks-libev.install",
    "content": "debian/config.json usr/share/shadowsocks-libev\ndebian/shadowsocks-libev-*.service lib/systemd/system\nusr/bin/\nusr/share/man/\ncompletions/bash/* usr/share/bash-completion/completions/\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/shadowsocks-libev.postinst",
    "content": "#!/bin/sh\n\nset -e\n\ncase \"$1\" in\n\tconfigure|reconfigure)\n\t\tif [ ! -f /etc/shadowsocks-libev/config.json ]; then\n\t\t\tpasswd=$(apg -n 1 -M ncl)\n\t\t\tmkdir -p /etc/shadowsocks-libev\n\t\t\tsed \"s/barfoo!/$passwd/\" /usr/share/shadowsocks-libev/config.json \\\n\t\t\t\t> /etc/shadowsocks-libev/config.json\n\t\tfi\n\t\t;;\n\tabort-upgrade|abort-remove|abort-deconfigure)\n\t\texit 0\n\t\t;;\n\t*)\n\t\techo \"postinst called with unknown argument \\`$1'\" >&2\n\t\texit 0\n\t\t;;\nesac\n\n#DEBHELPER#\n\nexit 0\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/shadowsocks-libev.postrm",
    "content": "#!/bin/sh\n\nset -e\n\ncase \"$1\" in\n\tpurge)\n\t\trm -f /etc/shadowsocks-libev/config.json\n\t\ttest -f /etc/shadowsocks-libev/* \\\n\t\t\t|| rm -r /etc/shadowsocks-libev/\n\t\t;;\n\tremove|upgrade|failed-upgrade|abort-install|abort-upgrade|disappear)\n\t\texit 0\n\t\t;;\n\t*)\n\t\techo \"postrm called with unknown argument \\`$1'\" >&2\n\t\texit 0\n\t\t;;\nesac\n\n#DEBHELPER#\n\nexit 0\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/shadowsocks-libev.service",
    "content": "#  This file is part of shadowsocks-libev.\n#\n#  Shadowsocks-libev is free software; you can redistribute it and/or modify\n#  it under the terms of the GNU General Public License as published by\n#  the Free Software Foundation; either version 3 of the License, or\n#  (at your option) any later version.\n#\n#  This file is default for Debian packaging. See also\n#  /etc/default/shadowsocks-libev for environment variables.\n\n[Unit]\nDescription=Shadowsocks-libev Default Server Service\nDocumentation=man:shadowsocks-libev(8)\nAfter=network.target\n\n[Service]\nType=simple\nEnvironmentFile=/etc/default/shadowsocks-libev\nUser=root\nLimitNOFILE=32768\nExecStart=/usr/bin/ss-server -a $USER -c $CONFFILE $DAEMON_ARGS\n\n[Install]\nWantedBy=multi-user.target\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/source/format",
    "content": "3.0 (quilt)\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/source.lintian-overrides",
    "content": "# false positive: #505857\nshadowsocks-libev source: debian-watch-file-should-mangle-version\n# false positive: #765166\nshadowsocks-libev source: license-problem-gfdl-invariants\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/debian/watch",
    "content": "version=4\n\nopts=\" \\\n   filenamemangle=s%(?:.*?)?v?(\\d[\\d.]*)\\.tar\\.gz%shadowsocks-libev-$1.tar.gz%\" \\\n   https://github.com/shadowsocks/shadowsocks-libev/tags \\\n   (?:.*?/)?v?(\\d[\\d.]*)\\.tar\\.gz debian uupdate\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/doc/Makefile.am",
    "content": "ASCIIDOC = @ASCIIDOC@\nASCIIDOC_EXTRA =\nMANPAGE_XSL = manpage-normal.xsl\nXMLTO = @XMLTO@\nXMLTO_EXTRA = -m manpage-bold-literal.xsl\nGZIPCMD = @GZIP@\nINSTALL = @INSTALL@\nRM = @RM@\nMV = @MV@\nSED = @SED@\nVERSION = `$(SED) -n 's/.*PACKAGE_VERSION \"\\(.*\\)\"/\\1/p'\\\n\t\t  ../config.h`\n\n# Guard against environment variables\nif ENABLE_DOCUMENTATION\n  MAN1_DOC =\n  MAN1_DOC += ss-local.1\n  MAN1_DOC += ss-manager.1\n  MAN1_DOC += ss-nat.1\n  MAN1_DOC += ss-redir.1\n  MAN1_DOC += ss-server.1\n  MAN1_DOC += ss-tunnel.1\n\n  MAN8_DOC =\n  MAN8_DOC += shadowsocks-libev.8\nelse\n  MAN1_DOC =\n  MAN8_DOC =\nendif\n\nMAN8_XML = $(MAN8_DOC:%.8=%.xml)\nMAN1_XML = $(MAN1_DOC:%.1=%.xml)\nMAN_XML  = $(MAN8_XML) $(MAN1_XML)\n\nMAN8_HTML = $(MAN8_DOC:%.8=%.html)\nMAN1_HTML = $(MAN1_DOC:%.1=%.html)\nMAN_HTML  = $(MAN8_HTML) $(MAN1_HTML)\n\nMAN8_TXT = $(MAN8_DOC:%.8=%.asciidoc)\nMAN1_TXT = $(MAN1_DOC:%.1=%.asciidoc)\nMAN_TXT  = $(MAN8_TXT) $(MAN1_TXT)\n\nman_MANS = $(MAN8_DOC) $(MAN1_DOC)\n\nhtml-local: $(MAN_HTML)\n\n%.1: %.xml\n\t$(AM_V_GEN)$(XMLTO) -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $<\n\n%.8: %.xml\n\t$(AM_V_GEN)$(XMLTO) -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $<\n\n%.xml: %.asciidoc\n\t$(AM_V_GEN)$(ASCIIDOC) -b docbook -d manpage -f asciidoc.conf \\\n\t    -aversion=$(VERSION) $(ASCIIDOC_EXTRA) -o $@ $<\n\n%.html: %.asciidoc\n\t$(AM_V_GEN)$(ASCIIDOC) -b html4 -d article -f asciidoc.conf \\\n\t\t-aversion=$(VERSION) $(ASCIIDOC_EXTRA) -o $@ $<\n\ndoc_DATA = $(MAN_HTML)\nCLEANFILES = $(MAN_XML) $(man_MANS) $(MAN_HTML)\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/doc/Makefile.in",
    "content": "# Makefile.in generated by automake 1.15 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2014 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\nam__is_gnu_make = { \\\n  if test -z '$(MAKELEVEL)'; then \\\n    false; \\\n  elif test -n '$(MAKE_HOST)'; then \\\n    true; \\\n  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \\\n    true; \\\n  else \\\n    false; \\\n  fi; \\\n}\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\nsubdir = doc\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \\\n\t$(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/inet_ntop.m4 \\\n\t$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \\\n\t$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \\\n\t$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/mbedtls.m4 \\\n\t$(top_srcdir)/m4/openssl.m4 $(top_srcdir)/m4/pcre.m4 \\\n\t$(top_srcdir)/m4/polarssl.m4 \\\n\t$(top_srcdir)/m4/stack-protector.m4 $(top_srcdir)/m4/zlib.m4 \\\n\t$(top_srcdir)/libev/libev.m4 $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nDIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nSOURCES =\nDIST_SOURCES =\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nam__vpath_adj_setup = srcdirstrip=`echo \"$(srcdir)\" | sed 's|.|.|g'`;\nam__vpath_adj = case $$p in \\\n    $(srcdir)/*) f=`echo \"$$p\" | sed \"s|^$$srcdirstrip/||\"`;; \\\n    *) f=$$p;; \\\n  esac;\nam__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;\nam__install_max = 40\nam__nobase_strip_setup = \\\n  srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*|]/\\\\\\\\&/g'`\nam__nobase_strip = \\\n  for p in $$list; do echo \"$$p\"; done | sed -e \"s|$$srcdirstrip/||\"\nam__nobase_list = $(am__nobase_strip_setup); \\\n  for p in $$list; do echo \"$$p $$p\"; done | \\\n  sed \"s| $$srcdirstrip/| |;\"' / .*\\//!s/ .*/ ./; s,\\( .*\\)/[^/]*$$,\\1,' | \\\n  $(AWK) 'BEGIN { files[\".\"] = \"\" } { files[$$2] = files[$$2] \" \" $$1; \\\n    if (++n[$$2] == $(am__install_max)) \\\n      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = \"\" } } \\\n    END { for (dir in files) print dir, files[dir] }'\nam__base_list = \\\n  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\\n/ /g' | \\\n  sed '$$!N;$$!N;$$!N;$$!N;s/\\n/ /g'\nam__uninstall_files_from_dir = { \\\n  test -z \"$$files\" \\\n    || { test ! -d \"$$dir\" && test ! -f \"$$dir\" && test ! -r \"$$dir\"; } \\\n    || { echo \" ( cd '$$dir' && rm -f\" $$files \")\"; \\\n         $(am__cd) \"$$dir\" && rm -f $$files; }; \\\n  }\nman1dir = $(mandir)/man1\nam__installdirs = \"$(DESTDIR)$(man1dir)\" \"$(DESTDIR)$(man8dir)\" \\\n\t\"$(DESTDIR)$(docdir)\"\nman8dir = $(mandir)/man8\nNROFF = nroff\nMANS = $(man_MANS)\nDATA = $(doc_DATA)\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\nam__DIST_COMMON = $(srcdir)/Makefile.in\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAR = @AR@\nASCIIDOC = @ASCIIDOC@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDLLTOOL = @DLLTOOL@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nGZIP = @GZIP@\nINET_NTOP_LIB = @INET_NTOP_LIB@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBPCRE = @LIBPCRE@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMANIFEST_TOOL = @MANIFEST_TOOL@\nMKDIR_P = @MKDIR_P@\nMV = @MV@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nPCRE_CONFIG = @PCRE_CONFIG@\nPTHREAD_CC = @PTHREAD_CC@\nPTHREAD_CFLAGS = @PTHREAD_CFLAGS@\nPTHREAD_LIBS = @PTHREAD_LIBS@\nRANLIB = @RANLIB@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = `$(SED) -n 's/.*PACKAGE_VERSION \"\\(.*\\)\"/\\1/p'\\\n\t\t  ../config.h`\n\nXMLTO = @XMLTO@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_AR = @ac_ct_AR@\nac_ct_CC = @ac_ct_CC@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nax_pthread_config = @ax_pthread_config@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npcre_pcreh = @pcre_pcreh@\npcreh = @pcreh@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nrunstatedir = @runstatedir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsubdirs = @subdirs@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nASCIIDOC_EXTRA = \nMANPAGE_XSL = manpage-normal.xsl\nXMLTO_EXTRA = -m manpage-bold-literal.xsl\nGZIPCMD = @GZIP@\nRM = @RM@\n@ENABLE_DOCUMENTATION_FALSE@MAN1_DOC = \n\n# Guard against environment variables\n@ENABLE_DOCUMENTATION_TRUE@MAN1_DOC = ss-local.1 ss-manager.1 ss-nat.1 \\\n@ENABLE_DOCUMENTATION_TRUE@\tss-redir.1 ss-server.1 ss-tunnel.1\n@ENABLE_DOCUMENTATION_FALSE@MAN8_DOC = \n@ENABLE_DOCUMENTATION_TRUE@MAN8_DOC = shadowsocks-libev.8\nMAN8_XML = $(MAN8_DOC:%.8=%.xml)\nMAN1_XML = $(MAN1_DOC:%.1=%.xml)\nMAN_XML = $(MAN8_XML) $(MAN1_XML)\nMAN8_HTML = $(MAN8_DOC:%.8=%.html)\nMAN1_HTML = $(MAN1_DOC:%.1=%.html)\nMAN_HTML = $(MAN8_HTML) $(MAN1_HTML)\nMAN8_TXT = $(MAN8_DOC:%.8=%.asciidoc)\nMAN1_TXT = $(MAN1_DOC:%.1=%.asciidoc)\nMAN_TXT = $(MAN8_TXT) $(MAN1_TXT)\nman_MANS = $(MAN8_DOC) $(MAN1_DOC)\ndoc_DATA = $(MAN_HTML)\nCLEANFILES = $(MAN_XML) $(man_MANS) $(MAN_HTML)\nall: all-am\n\n.SUFFIXES:\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign doc/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign doc/Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\ninstall-man1: $(man_MANS)\n\t@$(NORMAL_INSTALL)\n\t@list1=''; \\\n\tlist2='$(man_MANS)'; \\\n\ttest -n \"$(man1dir)\" \\\n\t  && test -n \"`echo $$list1$$list2`\" \\\n\t  || exit 0; \\\n\techo \" $(MKDIR_P) '$(DESTDIR)$(man1dir)'\"; \\\n\t$(MKDIR_P) \"$(DESTDIR)$(man1dir)\" || exit 1; \\\n\t{ for i in $$list1; do echo \"$$i\"; done;  \\\n\tif test -n \"$$list2\"; then \\\n\t  for i in $$list2; do echo \"$$i\"; done \\\n\t    | sed -n '/\\.1[a-z]*$$/p'; \\\n\tfi; \\\n\t} | while read p; do \\\n\t  if test -f $$p; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; echo \"$$p\"; \\\n\tdone | \\\n\tsed -e 'n;s,.*/,,;p;h;s,.*\\.,,;s,^[^1][0-9a-z]*$$,1,;x' \\\n\t      -e 's,\\.[0-9a-z]*$$,,;$(transform);G;s,\\n,.,' | \\\n\tsed 'N;N;s,\\n, ,g' | { \\\n\tlist=; while read file base inst; do \\\n\t  if test \"$$base\" = \"$$inst\"; then list=\"$$list $$file\"; else \\\n\t    echo \" $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'\"; \\\n\t    $(INSTALL_DATA) \"$$file\" \"$(DESTDIR)$(man1dir)/$$inst\" || exit $$?; \\\n\t  fi; \\\n\tdone; \\\n\tfor i in $$list; do echo \"$$i\"; done | $(am__base_list) | \\\n\twhile read files; do \\\n\t  test -z \"$$files\" || { \\\n\t    echo \" $(INSTALL_DATA) $$files '$(DESTDIR)$(man1dir)'\"; \\\n\t    $(INSTALL_DATA) $$files \"$(DESTDIR)$(man1dir)\" || exit $$?; }; \\\n\tdone; }\n\nuninstall-man1:\n\t@$(NORMAL_UNINSTALL)\n\t@list=''; test -n \"$(man1dir)\" || exit 0; \\\n\tfiles=`{ for i in $$list; do echo \"$$i\"; done; \\\n\tl2='$(man_MANS)'; for i in $$l2; do echo \"$$i\"; done | \\\n\t  sed -n '/\\.1[a-z]*$$/p'; \\\n\t} | sed -e 's,.*/,,;h;s,.*\\.,,;s,^[^1][0-9a-z]*$$,1,;x' \\\n\t      -e 's,\\.[0-9a-z]*$$,,;$(transform);G;s,\\n,.,'`; \\\n\tdir='$(DESTDIR)$(man1dir)'; $(am__uninstall_files_from_dir)\ninstall-man8: $(man_MANS)\n\t@$(NORMAL_INSTALL)\n\t@list1=''; \\\n\tlist2='$(man_MANS)'; \\\n\ttest -n \"$(man8dir)\" \\\n\t  && test -n \"`echo $$list1$$list2`\" \\\n\t  || exit 0; \\\n\techo \" $(MKDIR_P) '$(DESTDIR)$(man8dir)'\"; \\\n\t$(MKDIR_P) \"$(DESTDIR)$(man8dir)\" || exit 1; \\\n\t{ for i in $$list1; do echo \"$$i\"; done;  \\\n\tif test -n \"$$list2\"; then \\\n\t  for i in $$list2; do echo \"$$i\"; done \\\n\t    | sed -n '/\\.8[a-z]*$$/p'; \\\n\tfi; \\\n\t} | while read p; do \\\n\t  if test -f $$p; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; echo \"$$p\"; \\\n\tdone | \\\n\tsed -e 'n;s,.*/,,;p;h;s,.*\\.,,;s,^[^8][0-9a-z]*$$,8,;x' \\\n\t      -e 's,\\.[0-9a-z]*$$,,;$(transform);G;s,\\n,.,' | \\\n\tsed 'N;N;s,\\n, ,g' | { \\\n\tlist=; while read file base inst; do \\\n\t  if test \"$$base\" = \"$$inst\"; then list=\"$$list $$file\"; else \\\n\t    echo \" $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man8dir)/$$inst'\"; \\\n\t    $(INSTALL_DATA) \"$$file\" \"$(DESTDIR)$(man8dir)/$$inst\" || exit $$?; \\\n\t  fi; \\\n\tdone; \\\n\tfor i in $$list; do echo \"$$i\"; done | $(am__base_list) | \\\n\twhile read files; do \\\n\t  test -z \"$$files\" || { \\\n\t    echo \" $(INSTALL_DATA) $$files '$(DESTDIR)$(man8dir)'\"; \\\n\t    $(INSTALL_DATA) $$files \"$(DESTDIR)$(man8dir)\" || exit $$?; }; \\\n\tdone; }\n\nuninstall-man8:\n\t@$(NORMAL_UNINSTALL)\n\t@list=''; test -n \"$(man8dir)\" || exit 0; \\\n\tfiles=`{ for i in $$list; do echo \"$$i\"; done; \\\n\tl2='$(man_MANS)'; for i in $$l2; do echo \"$$i\"; done | \\\n\t  sed -n '/\\.8[a-z]*$$/p'; \\\n\t} | sed -e 's,.*/,,;h;s,.*\\.,,;s,^[^8][0-9a-z]*$$,8,;x' \\\n\t      -e 's,\\.[0-9a-z]*$$,,;$(transform);G;s,\\n,.,'`; \\\n\tdir='$(DESTDIR)$(man8dir)'; $(am__uninstall_files_from_dir)\ninstall-docDATA: $(doc_DATA)\n\t@$(NORMAL_INSTALL)\n\t@list='$(doc_DATA)'; test -n \"$(docdir)\" || list=; \\\n\tif test -n \"$$list\"; then \\\n\t  echo \" $(MKDIR_P) '$(DESTDIR)$(docdir)'\"; \\\n\t  $(MKDIR_P) \"$(DESTDIR)$(docdir)\" || exit 1; \\\n\tfi; \\\n\tfor p in $$list; do \\\n\t  if test -f \"$$p\"; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; \\\n\tdone | $(am__base_list) | \\\n\twhile read files; do \\\n\t  echo \" $(INSTALL_DATA) $$files '$(DESTDIR)$(docdir)'\"; \\\n\t  $(INSTALL_DATA) $$files \"$(DESTDIR)$(docdir)\" || exit $$?; \\\n\tdone\n\nuninstall-docDATA:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(doc_DATA)'; test -n \"$(docdir)\" || list=; \\\n\tfiles=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \\\n\tdir='$(DESTDIR)$(docdir)'; $(am__uninstall_files_from_dir)\ntags TAGS:\n\nctags CTAGS:\n\ncscope cscopelist:\n\n\ndistdir: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(MANS) $(DATA)\ninstalldirs:\n\tfor dir in \"$(DESTDIR)$(man1dir)\" \"$(DESTDIR)$(man8dir)\" \"$(DESTDIR)$(docdir)\"; do \\\n\t  test -z \"$$dir\" || $(MKDIR_P) \"$$dir\"; \\\n\tdone\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\t-test -z \"$(CLEANFILES)\" || rm -f $(CLEANFILES)\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-generic clean-libtool mostlyclean-am\n\ndistclean: distclean-am\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-generic\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am: html-local\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am: install-docDATA install-man\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man: install-man1 install-man8\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-generic mostlyclean-libtool\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am: uninstall-docDATA uninstall-man\n\nuninstall-man: uninstall-man1 uninstall-man8\n\n.MAKE: install-am install-strip\n\n.PHONY: all all-am check check-am clean clean-generic clean-libtool \\\n\tcscopelist-am ctags-am distclean distclean-generic \\\n\tdistclean-libtool distdir dvi dvi-am html html-am html-local \\\n\tinfo info-am install install-am install-data install-data-am \\\n\tinstall-docDATA install-dvi install-dvi-am install-exec \\\n\tinstall-exec-am install-html install-html-am install-info \\\n\tinstall-info-am install-man install-man1 install-man8 \\\n\tinstall-pdf install-pdf-am install-ps install-ps-am \\\n\tinstall-strip installcheck installcheck-am installdirs \\\n\tmaintainer-clean maintainer-clean-generic mostlyclean \\\n\tmostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \\\n\ttags-am uninstall uninstall-am uninstall-docDATA uninstall-man \\\n\tuninstall-man1 uninstall-man8\n\n.PRECIOUS: Makefile\n\n\nhtml-local: $(MAN_HTML)\n\n%.1: %.xml\n\t$(AM_V_GEN)$(XMLTO) -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $<\n\n%.8: %.xml\n\t$(AM_V_GEN)$(XMLTO) -m $(MANPAGE_XSL) $(XMLTO_EXTRA) man $<\n\n%.xml: %.asciidoc\n\t$(AM_V_GEN)$(ASCIIDOC) -b docbook -d manpage -f asciidoc.conf \\\n\t    -aversion=$(VERSION) $(ASCIIDOC_EXTRA) -o $@ $<\n\n%.html: %.asciidoc\n\t$(AM_V_GEN)$(ASCIIDOC) -b html4 -d article -f asciidoc.conf \\\n\t\t-aversion=$(VERSION) $(ASCIIDOC_EXTRA) -o $@ $<\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/doc/asciidoc.conf",
    "content": "[tags]\nbracket-emphasis={1?[{1}]}<emphasis>&lt;|&gt;</emphasis>\n\n[quotes]\n&lt;|&gt;=#bracket-emphasis\n\n[attributes]\nasterisk=&#42;\nplus=&#43;\ncaret=&#94;\nstartsb=&#91;\nendsb=&#93;\nbackslash=&#92;\ntilde=&#126;\napostrophe=&#39;\nbacktick=&#96;\nlitdd=&#45;&#45;\n\nifdef::doctype-manpage[]\nifdef::backend-docbook[]\n[header]\ntemplate::[header-declarations]\n<refentry>\n<refmeta>\n<refentrytitle>{mantitle}</refentrytitle>\n<manvolnum>{manvolnum}</manvolnum>\n<refmiscinfo class=\"source\">Shadowsocks-libev</refmiscinfo>\n<refmiscinfo class=\"version\">{version}</refmiscinfo>\n<refmiscinfo class=\"manual\">Shadowsocks-libev Manual</refmiscinfo>\n</refmeta>\n<refnamediv>\n  <refname>{manname}</refname>\n  <refpurpose>{manpurpose}</refpurpose>\n</refnamediv>\nendif::backend-docbook[]\nendif::doctype-manpage[]\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/doc/manpage-base.xsl",
    "content": "<!-- manpage-base.xsl:\n     special formatting for manpages rendered from asciidoc+docbook -->\n<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n\t\tversion=\"1.0\">\n\n<!-- these params silence some output from xmlto -->\n<xsl:param name=\"man.output.quietly\" select=\"1\"/>\n<xsl:param name=\"refentry.meta.get.quietly\" select=\"1\"/>\n\n<!-- convert asciidoc callouts to man page format;\n     git.docbook.backslash and git.docbook.dot params\n     must be supplied by another XSL file or other means -->\n<xsl:template match=\"co\">\n\t<xsl:value-of select=\"concat(\n\t\t\t      $git.docbook.backslash,'fB(',\n\t\t\t      substring-after(@id,'-'),')',\n\t\t\t      $git.docbook.backslash,'fR')\"/>\n</xsl:template>\n<xsl:template match=\"calloutlist\">\n\t<xsl:value-of select=\"$git.docbook.dot\"/>\n\t<xsl:text>sp&#10;</xsl:text>\n\t<xsl:apply-templates/>\n\t<xsl:text>&#10;</xsl:text>\n</xsl:template>\n<xsl:template match=\"callout\">\n\t<xsl:value-of select=\"concat(\n\t\t\t      $git.docbook.backslash,'fB',\n\t\t\t      substring-after(@arearefs,'-'),\n\t\t\t      '. ',$git.docbook.backslash,'fR')\"/>\n\t<xsl:apply-templates/>\n\t<xsl:value-of select=\"$git.docbook.dot\"/>\n\t<xsl:text>br&#10;</xsl:text>\n</xsl:template>\n\n</xsl:stylesheet>\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/doc/manpage-bold-literal.xsl",
    "content": "<!-- manpage-bold-literal.xsl:\n     special formatting for manpages rendered from asciidoc+docbook -->\n<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n\t\tversion=\"1.0\">\n\n<!-- render literal text as bold (instead of plain or monospace);\n     this makes literal text easier to distinguish in manpages\n     viewed on a tty -->\n<xsl:template match=\"literal\">\n\t<xsl:value-of select=\"$git.docbook.backslash\"/>\n\t<xsl:text>fB</xsl:text>\n\t<xsl:apply-templates/>\n\t<xsl:value-of select=\"$git.docbook.backslash\"/>\n\t<xsl:text>fR</xsl:text>\n</xsl:template>\n\n</xsl:stylesheet>\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/doc/manpage-normal.xsl",
    "content": "<!-- manpage-normal.xsl:\n     special settings for manpages rendered from asciidoc+docbook\n     handles anything we want to keep away from docbook-xsl 1.72.0 -->\n<xsl:stylesheet xmlns:xsl=\"http://www.w3.org/1999/XSL/Transform\"\n\t\tversion=\"1.0\">\n\n<xsl:import href=\"manpage-base.xsl\"/>\n\n<!-- these are the normal values for the roff control characters -->\n<xsl:param name=\"git.docbook.backslash\">\\</xsl:param>\n<xsl:param name=\"git.docbook.dot\"\t>.</xsl:param>\n\n</xsl:stylesheet>\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/doc/shadowsocks-libev.asciidoc",
    "content": "shadowsocks-libev(8)\n====================\n\nNAME\n----\nshadowsocks-libev - a lightweight and secure socks5 proxy\n\nSYNOPSIS\n--------\n*ss-local*|*ss-redir*|*ss-server*|*ss-tunnel*|*ss-manager*\n [-s <server_host>] [-p <server_port>] [-l <local_port>] [-k <password>]\n [-m <encrypt_method>] [-f <pid_file>] [-t <timeout>] [-c <config_file>]\n\nDESCRIPTION\n-----------\n*Shadowsocks-libev* is a lightweight and secure socks5 proxy.\nIt is a port of the original shadowsocks created by clowwindy.\n*Shadowsocks-libev* is written in pure C and takes advantage of *libev*\nto achieve both high performance and low resource consumption.\n\n*Shadowsocks-libev* consists of five components. One is `ss-server`(1)\nthat runs on a remote server to provide secured tunnel service.\n`ss-local`(1) and `ss-redir`(1) are clients on your local machines to proxy\ntraffic(TCP/UDP or both).\n`ss-tunnel`(1) is a tool for local port forwarding.\n\nWhile `ss-local`(1) works as a standard socks5 proxy, `ss-redir`(1) works\nas a transparent proxy and requires netfilter's NAT module. For more\ninformation, check out the 'EXAMPLE' section.\n\n`ss-manager`(1) is a controller for multi-user management and traffic\nstatistics, using UNIX domain socket to talk with `ss-server`(1).\nAlso, it provides a UNIX domain socket or IP based API for other software.\nAbout the details of this API, please refer to the 'PROTOCOL' section.\n\nOPTIONS\n-------\n\n-s <server_host>::\nSet the server's hostname or IP.\n\n-l <local_port>::\nSet the local port number.\n+\nNot available in server nor manager mode.\n\n-k <password>::\nSet the password. The server and the client should use the same password.\n\n-m <encrypt_method>::\nSet the cipher.\n+\n*Shadowsocks-libev* accepts 21 different ciphers:\n+\ntable, rc4, rc4-md5, aes-128-cfb, aes-192-cfb, aes-256-cfb,\naes-128-ctr, aes-192-ctr, aes-256-ctr, bf-cfb,\ncamellia-128-cfb, camellia-192-cfb, camellia-256-cfb, cast5-cfb, des-cfb,\nidea-cfb, rc2-cfb, seed-cfb, salsa20, chacha20 and chacha20-ietf.\n+\nThe default cipher is 'rc4-md5'.\n+\nIf built with PolarSSL or custom OpenSSL libraries, some of\nthese ciphers may not work.\n\n-a <user_name>::\nRun as a specific user.\n\n-f <pid_file>::\nStart shadowsocks as a daemon with specific pid file.\n\n-t <timeout>::\nSet the socket timeout in seconds. The default value is 60.\n\n-c <config_file>::\nUse a configuration file.\n\n-n <number>::\nSpecify max number of open files.\n+\nNot available in manager mode.\n+\nOnly available on Linux.\n\n-i <interface>::\nSend traffic through specific network interface.\n+\nFor example, there are three interfaces in your device, which is\nlo (127.0.0.1), eth0 (192.168.0.1) and eth1 (192.168.0.2).\nMeanwhile, you configure *shadowsocks-libev* to listen on 0.0.0.0:8388\nand bind to eth1. That results the traffic go out through eth1,\nbut not lo nor eth0. This option is useful to control traffic in\nmulti-interface environment.\n+\nNot available in redir mode.\n\n-b <local_address>::\nSpecify local address to bind.\n+\nNot available in server nor manager mode.\n\n-u::\nEnable UDP relay.\n+\nTPROXY is required in redir mode. You may need root permission.\n\n-U::\nEnable UDP relay and disable TCP relay.\n+\nNot available in local mode.\n\n-A::\nEnable onetime authentication.\n\n-L <addr:port>::\nSpecify destination server address and port for local port forwarding.\n+\nOnly available in tunnel mode.\n\n-d <addr>::\nSetup name servers for internal DNS resolver (libudns).\nThe default server is fetched from /etc/resolv.conf.\n+\nOnly available in server and manager mode.\n\n--fast-open::\nEnable TCP fast open.\n+\nNot available in redir nor tunnel mode, with Linux kernel > 3.7.0.\n\n--acl <acl_config>::\nEnable ACL (Access Control List) and specify config file.\n+\nNot available in redir nor tunnel mode.\n\n--manager-address <path_to_unix_domain>::\nSpecify UNIX domain socket address.\n+\nOnly available in server and manager mode.\n\n--executable <path_to_server_executable>::\nSpecify the executable path of `ss-server`.\n+\nOnly available in manager mode.\n\n-v::\nEnable verbose mode.\n\n-h|--help::\nPrint help message.\n\nCONFIG FILE\n-----------\nThe config file is written in JSON and easy to edit.\n\nThe config file equivalent of command line options is listed as example below.\n[frame=\"topbot\",options=\"header\"]\n|==========================================================================\n| Command line                        | JSON\n| -s some.server.net                  | \"server\": \"some.server.net\"\n| -s some.server.net -p 1234 (client) | \"server\": \"some.server.net:1234\"\n| -p 1234 -k \"PasSworD\" (server)      | \"port_password\": {\"1234\":\"PasSworD\"}\n| -p 1234                             | \"server_port\": \"1234\"\n| -b 0.0.0.0                          | \"local_address\": \"0.0.0.0\"\n| -l 4321                             | \"local_port\": \"4321\"\n| -k \"PasSworD\"                       | \"password\": \"PasSworD\"\n| -m \"aes-256-cfb\"                    | \"method\": \"aes-256-cfb\"\n| -t 60                               | \"timeout\": 60\n| -a nobody                           | \"user\": \"nobody\"\n| --fast-open                         | \"fast_open\": true\n| -6                                  | \"ipv6_first\": true\n| -A                                  | \"auth\": true\n| -n \"/etc/nofile\"                    | \"nofile\": \"/etc/nofile\"\n| -d \"8.8.8.8\"                        | \"nameserver\": \"8.8.8.8\"\n| -L \"somedns.net:53\"                 | \"tunnel_address\": \"somedns.net:53\"\n| -u                                  | \"mode\": \"tcp_and_udp\"\n| -U                                  | \"mode\": \"udp_only\"\n| no \"-u\" nor \"-U\" options (default)  | \"mode\": \"tcp_only\"\n|============================================================================\n\nEXAMPLE\n-------\n`ss-redir` requires netfilter's NAT function. Here is an example:\n\n....\n# Create new chain\nroot@Wrt:~# iptables -t nat -N SHADOWSOCKS\nroot@Wrt:~# iptables -t mangle -N SHADOWSOCKS\n\n# Ignore your shadowsocks server's addresses\n# It's very IMPORTANT, just be careful.\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 123.123.123.123 -j RETURN\n\n# Ignore LANs and any other addresses you'd like to bypass the proxy\n# See Wikipedia and RFC5735 for full list of reserved networks.\n# See ashi009/bestroutetb for a highly optimized CHN route list.\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN\n\n# Anything else should be redirected to shadowsocks's local port\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345\n\n# Add any UDP rules\nroot@Wrt:~# ip rule add fwmark 0x01/0x01 table 100\nroot@Wrt:~# ip route add local 0.0.0.0/0 dev lo table 100\nroot@Wrt:~# iptables -t mangle -A SHADOWSOCKS -p udp --dport 53 -j TPROXY --on-port 12345 --tproxy-mark 0x01/0x01\n\n# Apply the rules\nroot@Wrt:~# iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS\nroot@Wrt:~# iptables -t mangle -A PREROUTING -j SHADOWSOCKS\n\n# Start the shadowsocks-redir\nroot@Wrt:~# ss-redir -u -c /etc/config/shadowsocks.json -f /var/run/shadowsocks.pid\n....\n\nPROTOCOL\n--------\n`ss-manager`(1) provides several APIs through UDP protocol::\n\nSend UDP commands in the following format to the manager-address provided to ss-manager(1): ::::\n command: [JSON data]\n\nTo add a port: ::::\n add: {\"server_port\": 8001, \"password\":\"7cd308cc059\"}\n\nTo remove a port: ::::\n remove: {\"server_port\": 8001}\n\nTo receive a pong: ::::\n ping\n\nThen `ss-manager`(1) will send back the traffic statistics: ::::\n stat: {\"8001\":11370}\n\nSEE ALSO\n--------\n`ss-local`(1),\n`ss-server`(1),\n`ss-tunnel`(1),\n`ss-redir`(1),\n`ss-manager`(1),\n`iptables`(8),\n/etc/shadowsocks-libev/config.json\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/doc/ss-local.asciidoc",
    "content": "ss-local(1)\n===========\n\nNAME\n----\nss-local - shadowsocks client as socks5 proxy, libev port\n\nSYNOPSIS\n--------\n*ss-local*\n [-Auv6] [-h|--help]\n [-s <server_host>] [-p <server_port>] [-l <local_port>]\n [-k <password>] [-m <encrypt_method>] [-f <pid_file>]\n [-t <timeout>] [-c <config_file>] [-i <interface>]\n [-a <user_name>] [-b <local_address] [-n <nofile>]\n [--fast-open] [--acl <acl_config>] [--mtu <MTU>]\n\nDESCRIPTION\n-----------\n*Shadowsocks-libev* is a lightweight and secure socks5 proxy.\nIt is a port of the original shadowsocks created by clowwindy.\n*Shadowsocks-libev* is written in pure C and takes advantage of libev to\nachieve both high performance and low resource consumption.\n\n*Shadowsocks-libev* consists of five components. `ss-local`(1) works as a standard\nsocks5 proxy on local machines to proxy TCP traffic.\nFor more information, check out `shadowsocks-libev`(8).\n\nOPTIONS\n-------\n\n-s <server_host>::\nSet the server's hostname or IP.\n\n-p <server_port>::\nSet the server's port number.\n\n-l <local_port>::\nSet the local port number.\n\n-k <password>::\nSet the password. The server and the client should use the same password.\n\n-m <encrypt_method>::\nSet the cipher.\n+\n*Shadowsocks-libev* accepts 21 different ciphers:\n+\ntable, rc4, rc4-md5, aes-128-cfb, aes-192-cfb, aes-256-cfb,\naes-128-ctr, aes-192-ctr, aes-256-ctr, bf-cfb,\ncamellia-128-cfb, camellia-192-cfb, camellia-256-cfb, cast5-cfb, des-cfb,\nidea-cfb, rc2-cfb, seed-cfb, salsa20, chacha20 and chacha20-ietf.\n+\nThe default cipher is 'rc4-md5'.\n+\nIf built with PolarSSL or custom OpenSSL libraries, some of\nthese ciphers may not work.\n\n-a <user_name>::\nRun as a specific user.\n\n-f <pid_file>::\nStart shadowsocks as a daemon with specific pid file.\n\n-t <timeout>::\nSet the socket timeout in seconds. The default value is 60.\n\n-c <config_file>::\nUse a configuration file.\n+\nRefer to `shadowsocks-libev`(8) 'CONFIG FILE' section for more details.\n\n-n <number>::\nSpecify max number of open files.\n+\nOnly available on Linux.\n\n-i <interface>::\nSend traffic through specific network interface.\n+\nFor example, there are three interfaces in your device,\nwhich is lo (127.0.0.1), eth0 (192.168.0.1) and eth1 (192.168.0.2).\nMeanwhile, you configure `ss-local` to listen on 0.0.0.0:8388 and bind to eth1.\nThat results the traffic go out through eth1, but not lo nor eth0.\nThis option is useful to control traffic in multi-interface environment.\n\n-b <local_address>::\nSpecify local address to bind.\n\n-u::\nEnable UDP relay.\n\n-U::\nEnable UDP relay and disable TCP relay.\n\n-A::\nEnable onetime authentication.\n\n-6::\nResovle hostname to IPv6 address first.\n\n--fast-open::\nEnable TCP fast open.\n+\nOnly available with Linux kernel > 3.7.0.\n\n--acl <acl_config>::\nEnable ACL (Access Control List) and specify config file.\n\n--mtu <MTU>::\nSpecify the MTU of your network interface.\n\n--mptcp::\nEnable Multipath TCP.\n+\nOnly available with MPTCP enabled Linux kernel.\n\n-v::\nEnable verbose mode.\n\n-h|--help::\nPrint help message.\n\nEXAMPLE\n-------\n`ss-local`(1) can be started from command line and run in foreground.\nHere is an example:\n....\n# Start ss-local with given parameters\nss-local -s example.com -p 12345 -l 1080 -k foobar -m aes-256-cfb\n....\n\nSEE ALSO\n--------\n`ss-server`(1),\n`ss-tunnel`(1),\n`ss-redir`(1),\n`ss-manager`(1),\n`shadowsocks-libev`(8),\n`iptables`(8),\n/etc/shadowsocks-libev/config.json\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/doc/ss-manager.asciidoc",
    "content": "ss-manager(1)\n=============\n\nNAME\n----\nss-manager - ss-server controller for multi-user management and traffic statistics\n\nSYNOPSIS\n--------\n*ss-manager*\n [-AuUv] [-h|--help]\n [-s <server_host>] [-p <server_port>] [-l <local_port>]\n [-k <password>] [-m <encrypt_method>] [-f <pid_file>]\n [-t <timeout>] [-c <config_file>] [-i <interface>]\n [-b <local_addr>] [-a <user_name>]\n [--manager-address <path_to_unix_domain>]\n [--executable <path_to_server_executable>]\n\nDESCRIPTION\n-----------\n*Shadowsocks-libev* is a lightweight and secure socks5 proxy.\nIt is a port of the original shadowsocks created by clowwindy.\n*Shadowsocks-libev* is written in pure C and takes advantage of libev to\nachieve both high performance and low resource consumption.\n\n*Shadowsocks-libev* consists of five components.\n`ss-manager`(1) is a controller for multi-user management and\ntraffic statistics, using UNIX domain socket to talk with `ss-server`(1).\nAlso, it provides a UNIX domain socket or IP based API for other software.\nAbout the details of this API, please refer to the following 'PROTOCOL'\nsection.\n\nOPTIONS\n-------\n-s <server_host>::\nSet the server's hostname or IP.\n\n-k <password>::\nSet the password. The server and the client should use the same password.\n\n-m <encrypt_method>::\nSet the cipher.\n+\n*Shadowsocks-libev* accepts 21 different ciphers:\n+\ntable, rc4, rc4-md5, aes-128-cfb, aes-192-cfb, aes-256-cfb,\naes-128-ctr, aes-192-ctr, aes-256-ctr, bf-cfb,\ncamellia-128-cfb, camellia-192-cfb, camellia-256-cfb, cast5-cfb, des-cfb,\nidea-cfb, rc2-cfb, seed-cfb, salsa20, chacha20 and chacha20-ietf.\n+\nThe default cipher is 'rc4-md5'.\n+\nIf built with PolarSSL or custom OpenSSL libraries, some of\nthese ciphers may not work.\n\n-a <user_name>::\nRun as a specific user.\n\n-f <pid_file>::\nStart shadowsocks as a daemon with specific pid file.\n\n-t <timeout>::\nSet the socket timeout in seconds. The default value is 60.\n\n-c <config_file>::\nUse a configuration file.\n\n-i <interface>::\nSend traffic through specific network interface.\n+\nFor example, there are three interfaces in your device,\nwhich is lo (127.0.0.1), eth0 (192.168.0.1) and eth1 (192.168.0.2).\nMeanwhile, you configure `ss-local` to listen on 0.0.0.0:8388 and bind to eth1.\nThat results the traffic go out through eth1, but not lo nor eth0.\nThis option is useful to control traffic in multi-interface environment.\n\n-u::\n Enable UDP relay.\n\n-U::\nEnable UDP relay and disable TCP relay.\n\n-A::\nEnable onetime authentication.\n\n-d <addr>::\nSetup name servers for internal DNS resolver (libudns).\nThe default server is fetched from `/etc/resolv.conf`.\n\n--fast-open::\nEnable TCP fast open.\n+\nOnly available with Linux kernel > 3.7.0.\n\n--acl <acl_config>::\nEnable ACL (Access Control List) and specify config file.\n\n--manager-address <path_to_unix_domain>::\nSpecify UNIX domain socket address for the communication between ss-manager(1) and ss-server(1).\n+\nOnly available in server and manager mode.\n\n--executable <path_to_server_executable>::\nSpecify the executable path of ss-server.\n+\nOnly available in manager mode.\n\n-v::\nEnable verbose mode.\n\n-h|--help::\nPrint help message.\n\nPROTOCOL\n--------\n`ss-manager`(1) provides several APIs through UDP protocol:\n\nSend UDP commands in the following format to the manager-address provided to ss-manager(1): ::::\n command: [JSON data]\n\nTo add a port: ::::\n add: {\"server_port\": 8001, \"password\":\"7cd308cc059\"}\n\nTo remove a port: ::::\n remove: {\"server_port\": 8001}\n\nTo receive a pong: ::::\n ping\n\nThen `ss-manager`(1) will send back the traffic statistics: ::::\n stat: {\"8001\":11370}\n\nEXAMPLE\n-------\nTo use `ss-manager`(1), First start it and specify necessary information.\n\nThen communicate with `ss-manager`(1) through UNIX Domain Socket using UDP\nprotocol:\n\n....\n# Start the manager. Arguments for ss-server will be passed to generated\n# ss-server process(es) respectively.\nss-manager --manager-address /tmp/manager.sock --executable $(which ss-server) -s example.com -m aes-256-cfb -c /path/to/config.json\n\n# Connect to the socket. Using netcat-openbsd as an example.\n# You should use scripts or other programs for further management.\nnc -Uu /tmp/manager.sock\n....\n\nAfter that, you may communicate with `ss-manager`(1) as described above in the\n'PROTOCOL' section.\n\nSEE ALSO\n--------\n`ss-local`(1),\n`ss-server`(1),\n`ss-tunnel`(1),\n`ss-redir`(1),\n`shadowsocks-libev`(8),\n`iptables`(8),\n/etc/shadowsocks-libev/config.json\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/doc/ss-nat.asciidoc",
    "content": "ss-nat(1)\n=========\n\nNAME\n----\nss-nat - helper script to setup NAT rules for transparent proxy\n\nSYNOPSIS\n--------\n*ss-nat*\n [-ouUfh]\n [-s <server_ip>] [-S <server_ip>] [-l <local_port>]\n [-L <local_port>] [-i <ip_list_file>] [-a <lan_ips>]\n [-b <wan_ips>] [-w <wan_ips>] [-e <extra_options>]\n\nDESCRIPTION\n-----------\n*Shadowsocks-libev* is a lightweight and secure socks5 proxy.\nIt is a port of the original shadowsocks created by clowwindy.\n*Shadowsocks-libev* is written in pure C and takes advantage of libev to\nachieve both high performance and low resource consumption.\n\n`ss-nat`(1) sets up NAT rules for `ss-redir`(1) to provide traffic redirection.\nIt requires netfilter's NAT module and `iptables`(8).\nFor more information, check out `shadowsocks-libev`(8) and the following\n'EXAMPLE' section.\n\nOPTIONS\n-------\n-s <server_ip>::\nIP address of shadowsocks remote server\n\n-l <local_port>::\nPort number of shadowsocks local server\n\n-S <server_ip>::\nIP address of shadowsocks remote UDP server\n\n-L <local_port>::\nPort number of shadowsocks local UDP server\n\n-i <ip_list_file>::\na file whose content is bypassed ip list\n\n-a <lan_ips>::\nLAN IP of access control, need a prefix to define access control mode\n\n-b <wan_ips>::\nWAN IP of will be bypassed\n\n-w <wan_ips>::\nWAN IP of will be forwarded\n\n-e <extra_options>::\nExtra options for iptables\n\n-o::\nApply the rules to the OUTPUT chain\n\n-u::\nEnable udprelay mode, TPROXY is required\n\n-U::\nEnable udprelay mode, using different IP and ports for TCP and UDP\n\n-f::\nFlush the rules\n\n-h::\nShow this help message and exit\n\nEXAMPLE\n-------\n`ss-nat` requires `iptables`(8). Here is an example:\n\n....\n# Enable NAT rules for shadowsocks,\n# with both TCP and UDP redirection enabled,\n# and applied for both PREROUTING and OUTPUT chains\nroot@Wrt:~# ss-nat -s 192.168.1.100 -l 1080 -u -o\n\n# Disable and flush all NAT rules for shadowsocks\nroot@Wrt:~# ss-nat -f\n....\n\nSEE ALSO\n--------\n`ss-local`(1),\n`ss-server`(1),\n`ss-tunnel`(1),\n`ss-manager`(1),\n`shadowsocks-libev`(8),\n`iptables`(8),\n/etc/shadowsocks-libev/config.json\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/doc/ss-redir.asciidoc",
    "content": "ss-redir(1)\n===========\n\nNAME\n----\nss-redir - shadowsocks client as transparent proxy, libev port\n\nSYNOPSIS\n--------\n*ss-redir*\n [-AuUv6] [-h|--help]\n [-s <server_host>] [-p <server_port>] [-l <local_port>]\n [-k <password>] [-m <encrypt_method>] [-f <pid_file>]\n [-t <timeout>] [-c <config_file>] [-b <local_address>]\n [-a <user_name>] [-n <nofile>] [--mtu <MTU>]\n\nDESCRIPTION\n-----------\n*Shadowsocks-libev* is a lightweight and secure socks5 proxy.\nIt is a port of the original shadowsocks created by clowwindy.\n*Shadowsocks-libev* is written in pure C and takes advantage of libev to\nachieve both high performance and low resource consumption.\n\n*Shadowsocks-libev* consists of five components.\n`ss-redir`(1) works as a transparent proxy on local machines to proxy TCP\ntraffic and requires netfilter's NAT module.\nFor more information, check out `shadowsocks-libev`(8) and the following\n'EXAMPLE' section.\n\nOPTIONS\n-------\n-s <server_host>::\nSet the server's hostname or IP.\n\n-p <server_port>::\nSet the server's port number.\n\n-l <local_port>::\nSet the local port number.\n\n-k <password>::\nSet the password. The server and the client should use the same\npassword.\n\n-m <encrypt_method>::\nSet the cipher.\n+\n*Shadowsocks-libev* accepts 21 different ciphers:\n+\ntable, rc4, rc4-md5, aes-128-cfb, aes-192-cfb, aes-256-cfb,\naes-128-ctr, aes-192-ctr, aes-256-ctr, bf-cfb,\ncamellia-128-cfb, camellia-192-cfb, camellia-256-cfb, cast5-cfb, des-cfb,\nidea-cfb, rc2-cfb, seed-cfb, salsa20, chacha20 and chacha20-ietf.\n+\nThe default cipher is 'rc4-md5'.\n+\nIf built with PolarSSL or custom OpenSSL libraries, some of\nthese ciphers may not work.\n\n-a <user_name>::\nRun as a specific user.\n\n-f <pid_file>::\nStart shadowsocks as a daemon with specific pid file.\n\n-t <timeout>::\nSet the socket timeout in seconds. The default value is 60.\n\n-c <config_file>::\nUse a configuration file.\n+\nRefer to `shadowsocks-libev`(8) 'CONFIG FILE' section for more details.\n\n-n <number>::\nSpecify max number of open files.\n+\nOnly available on Linux.\n\n-b <local_address>::\nSpecify local address to bind.\n\n-u::\nEnable UDP relay.\n+\nTPROXY is required in redir mode. You may need root permission.\n\n-U::\nEnable UDP relay and disable TCP relay.\n\n-A::\nEnable onetime authentication.\n\n-6::\nResovle hostname to IPv6 address first.\n\n--mtu <MTU>::\nSpecify the MTU of your network interface.\n\n--mptcp::\nEnable Multipath TCP.\n+\nOnly available with MPTCP enabled Linux kernel.\n\n-v::\nEnable verbose mode.\n\n-h|--help::\nPrint help message.\n\nEXAMPLE\n-------\nss-redir requires netfilter's NAT function. Here is an example:\n\n....\n# Create new chain\nroot@Wrt:~# iptables -t nat -N SHADOWSOCKS\n\n# Ignore your shadowsocks server's addresses\n# It's very IMPORTANT, just be careful.\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 123.123.123.123 -j RETURN\n\n# Ignore LANs and any other addresses you'd like to bypass the proxy\n# See Wikipedia and RFC5735 for full list of reserved networks.\n# See ashi009/bestroutetb for a highly optimized CHN route list.\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 0.0.0.0/8 -j RETURN\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 10.0.0.0/8 -j RETURN\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 127.0.0.0/8 -j RETURN\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 169.254.0.0/16 -j RETURN\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 172.16.0.0/12 -j RETURN\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 192.168.0.0/16 -j RETURN\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 224.0.0.0/4 -j RETURN\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -d 240.0.0.0/4 -j RETURN\n\n# Anything else should be redirected to shadowsocks's local port\nroot@Wrt:~# iptables -t nat -A SHADOWSOCKS -p tcp -j REDIRECT --to-ports 12345\n\n# Add any UDP rules\nroot@Wrt:~# ip rule add fwmark 0x01/0x01 table 100\nroot@Wrt:~# ip route add local 0.0.0.0/0 dev lo table 100\nroot@Wrt:~# iptables -t mangle -A SHADOWSOCKS -p udp --dport 53 -j TPROXY --on-port 12345 --tproxy-mark 0x01/0x01\n\n# Apply the rules\nroot@Wrt:~# iptables -t nat -A PREROUTING -p tcp -j SHADOWSOCKS\nroot@Wrt:~# iptables -t mangle -A PREROUTING -j SHADOWSOCKS\n\n# Start the shadowsocks-redir\nroot@Wrt:~# ss-redir -u -c /etc/config/shadowsocks.json -f /var/run/shadowsocks.pid\n....\n\nSEE ALSO\n--------\n`ss-local`(1),\n`ss-server`(1),\n`ss-tunnel`(1),\n`ss-manager`(1),\n`shadowsocks-libev`(8),\n`iptables`(8),\n/etc/shadowsocks-libev/config.json\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/doc/ss-server.asciidoc",
    "content": "ss-server(1)\n============\n\nNAME\n----\nss-server - shadowsocks server, libev port\n\nSYNOPSIS\n--------\n*ss-server*\n [-AuUv] [-h|--help]\n [-s <server_host>] [-p <server_port>] [-l <local_port>]\n [-k <password>] [-m <encrypt_method>] [-f <pid_file>]\n [-t <timeout>] [-c <config_file>] [-i <interface>]\n [-a <user_name>] [-d <addr>] [-n <nofile>]\n [-b <local_address] [--fast-open] [--mptcp]\n [--firewall] [--acl <acl_config>] [--mtu <MTU>]\n [--manager-address <path_to_unix_domain>]\n\nDESCRIPTION\n-----------\n*Shadowsocks-libev* is a lightweight and secure socks5 proxy.\nIt is a port of the original shadowsocks created by clowwindy.\n*Shadowsocks-libev* is written in pure C and takes advantage of libev to\nachieve both high performance and low resource consumption.\n\n*Shadowsocks-libev* consists of five components.\n`ss-server`(1) runs on a remote server to provide secured tunnel service.\nFor more information, check out `shadowsocks-libev`(8).\n\nOPTIONS\n-------\n-s <server_host>::\nSet the server's hostname or IP.\n\n-p <server_port>::\nSet the server's port number.\n\n-k <password>::\nSet the password. The server and the client should use the same password.\n\n-m <encrypt_method>::\nSet the cipher.\n+\n*Shadowsocks-libev* accepts 21 different ciphers:\n+\ntable, rc4, rc4-md5, aes-128-cfb, aes-192-cfb, aes-256-cfb,\naes-128-ctr, aes-192-ctr, aes-256-ctr, bf-cfb,\ncamellia-128-cfb, camellia-192-cfb, camellia-256-cfb, cast5-cfb, des-cfb,\nidea-cfb, rc2-cfb, seed-cfb, salsa20, chacha20 and chacha20-ietf.\n+\nThe default cipher is 'rc4-md5'.\n+\nIf built with PolarSSL or custom OpenSSL libraries, some of\nthese ciphers may not work.\n\n-a <user_name>::\nRun as a specific user.\n\n-f <pid_file>::\nStart shadowsocks as a daemon with specific pid file.\n\n-t <timeout>::\nSet the socket timeout in seconds. The default value is 60.\n\n-c <config_file>::\nUse a configuration file.\n+\nRefer to `shadowsocks-libev`(8) 'CONFIG FILE' section for more details.\n\n-n <number>::\nSpecify max number of open files.\n+\nOnly available on Linux.\n\n-i <interface>::\nSend traffic through specific network interface.\n+\nFor example, there are three interfaces in your device,\nwhich is lo (127.0.0.1), eth0 (192.168.0.1) and eth1 (192.168.0.2).\nMeanwhile, you configure `ss-server` to listen on 0.0.0.0:8388 and bind to eth1.\nThat results the traffic go out through eth1, but not lo nor eth0.\nThis option is useful to control traffic in multi-interface environment.\n\n-b <local_address>::\nSpecify local address to bind.\n\n-u::\nEnable UDP relay.\n\n-U::\nEnable UDP relay and disable TCP relay.\n\n-A::\nEnable onetime authentication.\n\n-6::\nResovle hostname to IPv6 address first.\n\n-d <addr>::\nSetup name servers for internal DNS resolver (libudns).\nThe default server is fetched from '/etc/resolv.conf'.\n\n--fast-open::\nEnable TCP fast open.\n+\nOnly available with Linux kernel > 3.7.0.\n\n--mptcp::\nEnable Multipath TCP.\n+\nOnly available with MPTCP enabled Linux kernel.\n\n--firewall::\nSetup firewall rules for auto blocking.\n\n--acl <acl_config>::\nEnable ACL (Access Control List) and specify config file.\n\n--manager-address <path_to_unix_domain>::\nSpecify UNIX domain socket address for the communication between ss-manager(1) and ss-server(1).\n+\nOnly available in server and manager mode.\n\n--mtu <MTU>::\nSpecify the MTU of your network interface.\n\n--mptcp::\nEnable Multipath TCP.\n+\nOnly available with MPTCP enabled Linux kernel.\n\n-v::\nEnable verbose mode.\n\n-h|--help::\nPrint help message.\n\nEXAMPLE\n-------\nIt is recommended to use a config file when starting `ss-server`(1).\n\nThe config file is written in JSON and is easy to edit.\nCheck out the 'SEE ALSO' section for the default path of config file.\n\n....\n# Start the ss-server\nss-server -c /etc/shadowsocks-libev/config.json\n....\n\nINCOMPATIBILITY\n---------------\nThe config file of `shadowsocks-libev`(8) is slightly different from original\nshadowsocks.\nIn order to listen to both IPv4/IPv6 address, use the following grammar in\nyour config json file:\n....\n{\n\"server\":[\"::0\",\"0.0.0.0\"],\n...\n}\n....\n\nSEE ALSO\n--------\n`ss-local`(1),\n`ss-tunnel`(1),\n`ss-redir`(1),\n`ss-manager`(1),\n`shadowsocks-libev`(8),\n`iptables`(8),\n/etc/shadowsocks-libev/config.json\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/doc/ss-tunnel.asciidoc",
    "content": "ss-tunnel(1)\n============\n\nNAME\n----\nss-tunnel - shadowsocks tools for local port forwarding, libev port\n\nSYNOPSIS\n--------\n*ss-tunnel*\n [-AuUv6] [-h|--help]\n [-s <server_host>] [-p <server_port>] [-l <local_port>]\n [-k <password>] [-m <encrypt_method>] [-f <pid_file>]\n [-t <timeout>] [-c <config_file>] [-i <interface>]\n [-b <local_addr>] [-a <user_name>] [-n <nofile>]\n [-L addr:port] [--mtu <MTU>]\n\nDESCRIPTION\n-----------\n*Shadowsocks-libev* is a lightweight and secure socks5 proxy.\nIt is a port of the original shadowsocks created by clowwindy.\n*Shadowsocks-libev* is written in pure C and takes advantage of libev to\nachieve both high performance and low resource consumption.\n\n*Shadowsocks-libev* consists of five components.\n`ss-tunnel`(1) is a tool for local port forwarding.\nSee 'OPTIONS' section for special option needed by `ss-tunnel`(1).\nFor more information, check out `shadowsocks-libev`(8).\n\nOPTIONS\n-------\n-s <server_host>::\nSet the server's hostname or IP.\n\n-p <server_port>::\nSet the server's port number.\n\n-l <local_port>::\nSet the local port number.\n\n-k <password>::\nSet the password. The server and the client should use the same password.\n\n-m <encrypt_method>::\nSet the cipher.\n+\n*Shadowsocks-libev* accepts 21 different ciphers:\n+\ntable, rc4, rc4-md5, aes-128-cfb, aes-192-cfb, aes-256-cfb,\naes-128-ctr, aes-192-ctr, aes-256-ctr, bf-cfb,\ncamellia-128-cfb, camellia-192-cfb, camellia-256-cfb, cast5-cfb, des-cfb,\nidea-cfb, rc2-cfb, seed-cfb, salsa20, chacha20 and chacha20-ietf.\n+\nThe default cipher is 'rc4-md5'.\n+\nIf built with PolarSSL or custom OpenSSL libraries, some of\nthese ciphers may not work.\n\n-a <user_name>::\nRun as a specific user.\n\n-f <pid_file>::\nStart shadowsocks as a daemon with specific pid file.\n\n-t <timeout>::\nSet the socket timeout in seconds. The default value is 60.\n\n-c <config_file>::\nUse a configuration file.\n+\nRefer to `shadowsocks-libev`(8) 'CONFIG FILE' section for more details.\n\n-n <number>::\nSpecify max number of open files.\n+\nOnly available on Linux.\n\n-i <interface>::\nSend traffic through specific network interface.\n+\nFor example, there are three interfaces in your device,\nwhich is lo (127.0.0.1), eth0 (192.168.0.1) and eth1 (192.168.0.2).\nMeanwhile, you configure `ss-tunnel` to listen on 0.0.0.0:8388 and bind to eth1.\nThat results the traffic go out through eth1, but not lo nor eth0.\nThis option is useful to control traffic in multi-interface environment.\n\n-b <local_address>::\nSpecify local address to bind.\n\n-u::\nEnable UDP relay.\n\n-U::\nEnable UDP relay and disable TCP relay.\n\n-A::\nEnable onetime authentication.\n\n-6::\nResovle hostname to IPv6 address first.\n\n-L <addr:port>::\nSpecify destination server address and port for local port forwarding.\n+\nOnly used and available in tunnel mode.\n\n--mtu <MTU>::\nSpecify the MTU of your network interface.\n\n--mptcp::\nEnable Multipath TCP.\n+\nOnly available with MPTCP enabled Linux kernel.\n\n-v::\nEnable verbose mode.\n\n-h|--help::\nPrint help message.\n\nSEE ALSO\n--------\n`ss-local`(1),\n`ss-server`(1),\n`ss-redir`(1),\n`ss-manager`(1),\n`shadowsocks-libev`(8),\n`iptables`(8),\n/etc/shadowsocks-libev/config.json\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/docker/alpine/Dockerfile",
    "content": "#\n# Dockerfile for shadowsocks-libev\n#\n\nFROM alpine\nMAINTAINER kev <noreply@datageek.info>\n\nARG SS_VER=2.5.6\nARG SS_URL=https://github.com/shadowsocks/shadowsocks-libev/archive/v$SS_VER.tar.gz\n\nENV SERVER_ADDR 0.0.0.0\nENV SERVER_PORT 8388\nENV PASSWORD=\nENV METHOD      aes-256-cfb\nENV TIMEOUT     300\nENV DNS_ADDR    8.8.8.8\nENV DNS_ADDR_2  8.8.4.4\n\nRUN set -ex && \\\n    apk add --no-cache --virtual .build-deps \\\n                                asciidoc \\\n                                autoconf \\\n                                build-base \\\n                                curl \\\n                                libtool \\\n                                linux-headers \\\n                                openssl-dev \\\n                                pcre-dev \\\n                                tar \\\n                                xmlto && \\\n    cd /tmp && \\\n    curl -sSL $SS_URL | tar xz --strip 1 && \\\n    ./configure --prefix=/usr --disable-documentation && \\\n    make install && \\\n    cd .. && \\\n\n    runDeps=\"$( \\\n        scanelf --needed --nobanner /usr/bin/ss-* \\\n            | awk '{ gsub(/,/, \"\\nso:\", $2); print \"so:\" $2 }' \\\n            | xargs -r apk info --installed \\\n            | sort -u \\\n    )\" && \\\n    apk add --no-cache --virtual .run-deps $runDeps && \\\n    apk del .build-deps && \\\n    rm -rf /tmp/*\n\nUSER nobody\n\nEXPOSE $SERVER_PORT/tcp $SERVER_PORT/udp\n\nCMD ss-server -s $SERVER_ADDR \\\n              -p $SERVER_PORT \\\n              -k ${PASSWORD:-$(hostname)} \\\n              -m $METHOD \\\n              -t $TIMEOUT \\\n              --fast-open \\\n              -d $DNS_ADDR \\\n              -d $DNS_ADDR_2 \\\n              -u\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/docker/alpine/docker-compose.yml",
    "content": "shadowsocks:\n  image: shadowsocks-libev\n  ports:\n    - \"8388:8388/tcp\"\n    - \"8388:8388/udp\"\n  environment:\n    - METHOD=aes-256-cfb\n    - PASSWORD=9MLSpPmNt\n  restart: always\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/docker/ubuntu/Dockerfile",
    "content": "FROM ubuntu:latest\n\nMAINTAINER Sah Lee <contact@leesah.name>\n\nENV DEPENDENCIES git-core build-essential autoconf libtool libssl-dev asciidoc xmlto\nENV BASEDIR /tmp/shadowsocks-libev\nENV SERVER_PORT 8338\n\n# Set up building environment\nRUN apt-get update \\\n && apt-get install -y $DEPENDENCIES\n\n# Get the latest code, build and install\nRUN git clone https://github.com/shadowsocks/shadowsocks-libev.git $BASEDIR\nWORKDIR $BASEDIR\nRUN ./configure \\\n && make \\\n && make install\n\n# Tear down building environment and delete git repository\nWORKDIR /\nRUN rm -rf $BASEDIR/shadowsocks-libev\\\n && apt-get --purge autoremove -y $DEPENDENCIES\n\n# Port in the config file won't take affect. Instead we'll use 8388.\nEXPOSE $SERVER_PORT\nEXPOSE $SERVER_PORT/udp\n\n# Override the host and port in the config file.\nADD entrypoint /\nENTRYPOINT [\"/entrypoint\"]\nCMD [\"-h\"]\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/docker/ubuntu/entrypoint",
    "content": "#! /bin/bash\n\nIMAGE_NAME=\"leesah/shadowsocks-libev\"\nPORTNUMBER=\"8338\"\n\nSHADOWSOCKS=\"/usr/local/bin/ss-server\"\nHOST=\"-s 0.0.0.0\"\nPORT=\"-p $PORTNUMBER\"\nJSON=\"\"\n\nfunction print_usage {\n  echo\n  echo \"Usage:\"\n  echo \"  docker run $IMAGE_NAME [OPTIONS]\"\n  echo\n  echo \"OPTIONS\"\n  echo \"  -k <password>            password of your remote server\"\n  echo\n  echo \"  [-m <encrypt_method>]    encrypt method: table, rc4, rc4-md5\"\n  echo \"                           aes-128-cfb, aes-192-cfb, aes-256-cfb,\"\n  echo \"                           bf-cfb, camellia-128-cfb, camellia-192-cfb,\"\n  echo \"                           camellia-256-cfb, cast5-cfb, des-cfb, idea-cfb,\"\n  echo \"                           rc2-cfb, seed-cfb, salsa20 and chacha20\"\n  echo \"  [-t <timeout>]           socket timeout in seconds\"\n  echo \"  [-c <config_file>]       config file in json\"\n  echo \"  [-u]                     enable udprelay mode\"\n  echo \"  [-v]                     verbose mode\"\n  echo\n  echo \"  [--fast-open]            enable TCP fast open\"\n  echo \"  [--acl <acl_file>]       config file of ACL \\(Access Control List\\)\"\n  echo\n  echo \"  [-h]                     print this\"\n  echo\n}\n\nfunction print_usage_configfile {\n  echo \"Config file is currently not supported by this image.\"\n  echo\n  echo \"See https://github.com/leesah/shadowsocks-libev/issues/1 for current progress.\"\n  echo\n}\n\nfunction print_usage_host {\n  echo \"To specify the host on which ss-server should listen, please use\"\n  echo \"  docker run -p $1::$PORTNUMBER ...\"\n  echo \"or\"\n  echo \"  docker run -p $1:<HOST-PORT>:$PORTNUMBER ...\"\n  echo\n  echo \"See manpage of docker-run for more details:\"\n  echo \"  man docker-run\"\n  echo\n}\n\nfunction print_usage_port {\n  echo \"To specify the port on which ss-server should listen, please use\"\n  echo \"  docker run -p $1:$PORTNUMBER ...\"\n  echo\n}\n\nOPTIONS=`getopt -o s:p:k:m:t:c:uvh --long server:,key:,password:,encrypt-method:,timeout:,acl:,server-port:,config-file:,fast-open,help -n \"$IMAGE_NAME\" -- \"$@\"`\nif [ $? -ne 0 ]; then\n  print_usage\n  exit 1\nfi\n\neval set -- \"$OPTIONS\"\nwhile true; do\n  case \"$1\" in\n    -k|--key|--password)      PASSWORD=\"-k $2\";         shift 2;;\n    -m|--encrypt-method)      ENCRYPTION=\"-m $2\";       shift 2;;\n    -t|--timeout)             TIMEOUT=\"-t $2\";          shift 2;;\n    --acl)                    ACL=\"--acl $2\";           shift 2;;\n    --fast-open)              FAST_OPEN=\"--fast-open\";  shift;;\n    -u)                       UDP_RELAY=\"-u\";           shift;;\n    -v)                       VERBOSE=\"-v\";             shift;;\n    --)                                                 shift; break;;\n\n    -c|--config-file)         print_usage_configfile;   exit 128;;\n    -s|--server)              print_usage_host \"$2\";    exit 128;;\n    -p|--server-port)         print_usage_port \"$2\";    exit 128;;\n    -h|--help)                print_usage;              exit 0;;\n\n    *)\n      echo \"$IMAGE_NAME: unexpected argument: $1\"\n      print_usage\n      exit 1;;\n  esac\ndone\n\nif [ -z \"$HOST\" -o -z \"$PORT\" -o -z \"$PASSWORD\" ]; then\n  echo \"$IMAGE_NAME: insufficient arguments.\"\n  print_usage\n  exit 1\nfi\n\necho \"Launching Shadowsocks server...\"\necho \"To watch the output, run\"\necho \"  docker ps -ql | xargs docker logs -f\"\n$SHADOWSOCKS $HOST $PORT $PASSWORD $ENCRYPTION $TIMEOUT $UDP_RELAY $VERBOSE $FAST_OPEN $ACL $JSON\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/.idea/libcork-develop.iml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<module classpath=\"CMake\" type=\"CPP_MODULE\" version=\"4\" />"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/.idea/misc.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CMakeWorkspace\" PROJECT_DIR=\"$PROJECT_DIR$\" />\n  <component name=\"CidrRootsConfiguration\">\n    <excludeRoots>\n      <file path=\"$PROJECT_DIR$/cmake-build-debug/CMakeFiles\" />\n    </excludeRoots>\n  </component>\n</project>"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/.idea/modules.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"ProjectModuleManager\">\n    <modules>\n      <module fileurl=\"file://$PROJECT_DIR$/.idea/libcork-develop.iml\" filepath=\"$PROJECT_DIR$/.idea/libcork-develop.iml\" />\n    </modules>\n  </component>\n</project>"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/.idea/workspace.xml",
    "content": "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n<project version=\"4\">\n  <component name=\"CMakeRunConfigurationManager\" shouldGenerate=\"true\" buildAllGenerated=\"true\">\n    <generated>\n      <config projectName=\"libcork\" targetName=\"cork-test\" />\n      <config projectName=\"libcork\" targetName=\"libcork-static\" />\n      <config projectName=\"libcork\" targetName=\"cork-hash\" />\n      <config projectName=\"libcork\" targetName=\"cork-initializer\" />\n    </generated>\n  </component>\n  <component name=\"CMakeSettings\">\n    <configurations>\n      <configuration CONFIG_NAME=\"Debug\" />\n    </configurations>\n  </component>\n  <component name=\"ChangeListManager\">\n    <list default=\"true\" id=\"5cc43b05-9f40-4e8f-af93-ddec7c2cfadc\" name=\"Default\" comment=\"\" />\n    <option name=\"EXCLUDED_CONVERTED_TO_IGNORED\" value=\"true\" />\n    <option name=\"TRACKING_ENABLED\" value=\"true\" />\n    <option name=\"SHOW_DIALOG\" value=\"false\" />\n    <option name=\"HIGHLIGHT_CONFLICTS\" value=\"true\" />\n    <option name=\"HIGHLIGHT_NON_ACTIVE_CHANGELIST\" value=\"false\" />\n    <option name=\"LAST_RESOLUTION\" value=\"IGNORE\" />\n  </component>\n  <component name=\"CreatePatchCommitExecutor\">\n    <option name=\"PATCH_PATH\" value=\"\" />\n  </component>\n  <component name=\"ExecutionTargetManager\" SELECTED_TARGET=\"default_target\" />\n  <component name=\"FileEditorManager\">\n    <leaf SIDE_TABS_SIZE_LIMIT_KEY=\"300\" />\n  </component>\n  <component name=\"FindInProjectRecents\">\n    <findStrings>\n      <find>ENABLE_SHARED</find>\n      <find>check</find>\n      <find>错误：可见性属性在此配置下不受支持</find>\n      <find>CORK_API</find>\n      <find>API</find>\n      <find>CORK_CONFIG_GCC_VERSION</find>\n      <find>cygwin</find>\n      <find>pthread_yield_np</find>\n      <find>sched_yield</find>\n      <find>environ</find>\n    </findStrings>\n  </component>\n  <component name=\"IdeDocumentHistory\">\n    <option name=\"CHANGED_PATHS\">\n      <list>\n        <option value=\"$PROJECT_DIR$/version.sh\" />\n        <option value=\"$PROJECT_DIR$/RELEASE-VERSION\" />\n        <option value=\"$PROJECT_DIR$/CMakeLists.txt\" />\n        <option value=\"$PROJECT_DIR$/cmake/FindCTargets.cmake\" />\n        <option value=\"$PROJECT_DIR$/include/libcork/cli/commands.h\" />\n        <option value=\"$PROJECT_DIR$/include/libcork/config/gcc.h\" />\n        <option value=\"$PROJECT_DIR$/include/libcork/core/attributes.h\" />\n        <option value=\"$PROJECT_DIR$/src/libcork/posix/env.c\" />\n        <option value=\"$PROJECT_DIR$/src/libcork/posix/subprocess.c\" />\n        <option value=\"$PROJECT_DIR$/src/CMakeLists.txt\" />\n        <option value=\"$PROJECT_DIR$/.gitignore\" />\n      </list>\n    </option>\n  </component>\n  <component name=\"JsBuildToolGruntFileManager\" detection-done=\"true\" sorting=\"DEFINITION_ORDER\" />\n  <component name=\"JsBuildToolPackageJson\" detection-done=\"true\" sorting=\"DEFINITION_ORDER\" />\n  <component name=\"JsGulpfileManager\">\n    <detection-done>true</detection-done>\n    <sorting>DEFINITION_ORDER</sorting>\n  </component>\n  <component name=\"OCFindUsagesOptions\" text=\"true\" ivars=\"false\" properties=\"true\" derivedClasses=\"false\" />\n  <component name=\"ProjectFrameBounds\">\n    <option name=\"x\" value=\"-8\" />\n    <option name=\"y\" value=\"-8\" />\n    <option name=\"width\" value=\"1936\" />\n    <option name=\"height\" value=\"1056\" />\n  </component>\n  <component name=\"ProjectView\">\n    <navigator currentView=\"ProjectPane\" proportions=\"\" version=\"1\">\n      <flattenPackages />\n      <showMembers />\n      <showModules />\n      <showLibraryContents />\n      <hideEmptyPackages />\n      <abbreviatePackageNames />\n      <autoscrollToSource />\n      <autoscrollFromSource />\n      <sortByType />\n      <manualOrder />\n      <foldersAlwaysOnTop value=\"true\" />\n    </navigator>\n    <panes>\n      <pane id=\"ProjectPane\">\n        <subPane>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"libcork-develop\" />\n              <option name=\"myItemType\" value=\"com.jetbrains.cidr.projectView.CidrFilesViewHelper$MyProjectTreeStructure$1\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"External Libraries\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.ExternalLibrariesNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"libcork-develop\" />\n              <option name=\"myItemType\" value=\"com.jetbrains.cidr.projectView.CidrFilesViewHelper$MyProjectTreeStructure$1\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"libcork-develop\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"libcork-develop\" />\n              <option name=\"myItemType\" value=\"com.jetbrains.cidr.projectView.CidrFilesViewHelper$MyProjectTreeStructure$1\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"libcork-develop\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"src\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"libcork-develop\" />\n              <option name=\"myItemType\" value=\"com.jetbrains.cidr.projectView.CidrFilesViewHelper$MyProjectTreeStructure$1\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"libcork-develop\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"include\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n          <PATH>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"libcork-develop\" />\n              <option name=\"myItemType\" value=\"com.jetbrains.cidr.projectView.CidrFilesViewHelper$MyProjectTreeStructure$1\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"libcork-develop\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"include\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n            <PATH_ELEMENT>\n              <option name=\"myItemId\" value=\"libcork\" />\n              <option name=\"myItemType\" value=\"com.intellij.ide.projectView.impl.nodes.PsiDirectoryNode\" />\n            </PATH_ELEMENT>\n          </PATH>\n        </subPane>\n      </pane>\n    </panes>\n  </component>\n  <component name=\"PropertiesComponent\">\n    <property name=\"WebServerToolWindowFactoryState\" value=\"false\" />\n    <property name=\"js.eslint.eslintPackage\" value=\"\" />\n    <property name=\"settings.editor.selected.configurable\" value=\"CPPToolchains\" />\n  </component>\n  <component name=\"RunManager\" selected=\"Application.libcork-static\">\n    <configuration default=\"true\" type=\"BashConfigurationType\" factoryName=\"Bash\">\n      <option name=\"INTERPRETER_OPTIONS\" value=\"\" />\n      <option name=\"INTERPRETER_PATH\" value=\"\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"\" />\n      <option name=\"PARENT_ENVS\" value=\"true\" />\n      <option name=\"SCRIPT_NAME\" value=\"\" />\n      <option name=\"PARAMETERS\" value=\"\" />\n      <module name=\"\" />\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"CMakeGoogleTestRunConfigurationType\" factoryName=\"Google Test\" PASS_PARENT_ENVS_2=\"true\" TEST_MODE=\"SUITE_TEST\">\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"CMakeRunConfiguration\" factoryName=\"Application\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"libcork\" TARGET_NAME=\"cork-hash\" CONFIG_NAME=\"Debug\">\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"JavaScriptTestRunnerProtractor\" factoryName=\"Protractor\">\n      <config-file value=\"\" />\n      <node-interpreter value=\"project\" />\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"JavascriptDebugType\" factoryName=\"JavaScript Debug\">\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"PythonConfigurationType\" factoryName=\"Python\">\n      <option name=\"INTERPRETER_OPTIONS\" value=\"\" />\n      <option name=\"PARENT_ENVS\" value=\"true\" />\n      <envs>\n        <env name=\"PYTHONUNBUFFERED\" value=\"1\" />\n      </envs>\n      <option name=\"SDK_HOME\" value=\"\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"\" />\n      <option name=\"IS_MODULE_SDK\" value=\"false\" />\n      <option name=\"ADD_CONTENT_ROOTS\" value=\"true\" />\n      <option name=\"ADD_SOURCE_ROOTS\" value=\"true\" />\n      <module name=\"libcork-develop\" />\n      <option name=\"SCRIPT_NAME\" value=\"\" />\n      <option name=\"PARAMETERS\" value=\"\" />\n      <option name=\"SHOW_COMMAND_LINE\" value=\"false\" />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"Tox\" factoryName=\"Tox\">\n      <option name=\"INTERPRETER_OPTIONS\" value=\"\" />\n      <option name=\"PARENT_ENVS\" value=\"true\" />\n      <envs />\n      <option name=\"SDK_HOME\" value=\"\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"\" />\n      <option name=\"IS_MODULE_SDK\" value=\"false\" />\n      <option name=\"ADD_CONTENT_ROOTS\" value=\"true\" />\n      <option name=\"ADD_SOURCE_ROOTS\" value=\"true\" />\n      <module name=\"libcork-develop\" />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"js.build_tools.gulp\" factoryName=\"Gulp.js\">\n      <node-interpreter>project</node-interpreter>\n      <node-options />\n      <gulpfile />\n      <tasks />\n      <arguments />\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"js.build_tools.npm\" factoryName=\"npm\">\n      <command value=\"run\" />\n      <scripts />\n      <node-interpreter value=\"project\" />\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"tests\" factoryName=\"Attests\">\n      <option name=\"INTERPRETER_OPTIONS\" value=\"\" />\n      <option name=\"PARENT_ENVS\" value=\"true\" />\n      <envs />\n      <option name=\"SDK_HOME\" value=\"\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"\" />\n      <option name=\"IS_MODULE_SDK\" value=\"false\" />\n      <option name=\"ADD_CONTENT_ROOTS\" value=\"true\" />\n      <option name=\"ADD_SOURCE_ROOTS\" value=\"true\" />\n      <module name=\"libcork-develop\" />\n      <option name=\"SCRIPT_NAME\" value=\"\" />\n      <option name=\"CLASS_NAME\" value=\"\" />\n      <option name=\"METHOD_NAME\" value=\"\" />\n      <option name=\"FOLDER_NAME\" value=\"\" />\n      <option name=\"TEST_TYPE\" value=\"TEST_SCRIPT\" />\n      <option name=\"PATTERN\" value=\"\" />\n      <option name=\"USE_PATTERN\" value=\"false\" />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"tests\" factoryName=\"Doctests\">\n      <option name=\"INTERPRETER_OPTIONS\" value=\"\" />\n      <option name=\"PARENT_ENVS\" value=\"true\" />\n      <envs />\n      <option name=\"SDK_HOME\" value=\"\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"\" />\n      <option name=\"IS_MODULE_SDK\" value=\"false\" />\n      <option name=\"ADD_CONTENT_ROOTS\" value=\"true\" />\n      <option name=\"ADD_SOURCE_ROOTS\" value=\"true\" />\n      <module name=\"libcork-develop\" />\n      <option name=\"SCRIPT_NAME\" value=\"\" />\n      <option name=\"CLASS_NAME\" value=\"\" />\n      <option name=\"METHOD_NAME\" value=\"\" />\n      <option name=\"FOLDER_NAME\" value=\"\" />\n      <option name=\"TEST_TYPE\" value=\"TEST_SCRIPT\" />\n      <option name=\"PATTERN\" value=\"\" />\n      <option name=\"USE_PATTERN\" value=\"false\" />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"tests\" factoryName=\"Nosetests\">\n      <option name=\"INTERPRETER_OPTIONS\" value=\"\" />\n      <option name=\"PARENT_ENVS\" value=\"true\" />\n      <envs />\n      <option name=\"SDK_HOME\" value=\"\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"\" />\n      <option name=\"IS_MODULE_SDK\" value=\"false\" />\n      <option name=\"ADD_CONTENT_ROOTS\" value=\"true\" />\n      <option name=\"ADD_SOURCE_ROOTS\" value=\"true\" />\n      <module name=\"libcork-develop\" />\n      <option name=\"SCRIPT_NAME\" value=\"\" />\n      <option name=\"CLASS_NAME\" value=\"\" />\n      <option name=\"METHOD_NAME\" value=\"\" />\n      <option name=\"FOLDER_NAME\" value=\"\" />\n      <option name=\"TEST_TYPE\" value=\"TEST_SCRIPT\" />\n      <option name=\"PATTERN\" value=\"\" />\n      <option name=\"USE_PATTERN\" value=\"false\" />\n      <option name=\"PARAMS\" value=\"\" />\n      <option name=\"USE_PARAM\" value=\"false\" />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"tests\" factoryName=\"Unittests\">\n      <option name=\"INTERPRETER_OPTIONS\" value=\"\" />\n      <option name=\"PARENT_ENVS\" value=\"true\" />\n      <envs />\n      <option name=\"SDK_HOME\" value=\"\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"\" />\n      <option name=\"IS_MODULE_SDK\" value=\"false\" />\n      <option name=\"ADD_CONTENT_ROOTS\" value=\"true\" />\n      <option name=\"ADD_SOURCE_ROOTS\" value=\"true\" />\n      <module name=\"libcork-develop\" />\n      <option name=\"SCRIPT_NAME\" value=\"\" />\n      <option name=\"CLASS_NAME\" value=\"\" />\n      <option name=\"METHOD_NAME\" value=\"\" />\n      <option name=\"FOLDER_NAME\" value=\"\" />\n      <option name=\"TEST_TYPE\" value=\"TEST_SCRIPT\" />\n      <option name=\"PATTERN\" value=\"\" />\n      <option name=\"USE_PATTERN\" value=\"false\" />\n      <option name=\"PUREUNITTEST\" value=\"true\" />\n      <option name=\"PARAMS\" value=\"\" />\n      <option name=\"USE_PARAM\" value=\"false\" />\n      <method />\n    </configuration>\n    <configuration default=\"true\" type=\"tests\" factoryName=\"py.test\">\n      <option name=\"INTERPRETER_OPTIONS\" value=\"\" />\n      <option name=\"PARENT_ENVS\" value=\"true\" />\n      <envs />\n      <option name=\"SDK_HOME\" value=\"\" />\n      <option name=\"WORKING_DIRECTORY\" value=\"\" />\n      <option name=\"IS_MODULE_SDK\" value=\"false\" />\n      <option name=\"ADD_CONTENT_ROOTS\" value=\"true\" />\n      <option name=\"ADD_SOURCE_ROOTS\" value=\"true\" />\n      <module name=\"libcork-develop\" />\n      <option name=\"SCRIPT_NAME\" value=\"\" />\n      <option name=\"CLASS_NAME\" value=\"\" />\n      <option name=\"METHOD_NAME\" value=\"\" />\n      <option name=\"FOLDER_NAME\" value=\"\" />\n      <option name=\"TEST_TYPE\" value=\"TEST_SCRIPT\" />\n      <option name=\"PATTERN\" value=\"\" />\n      <option name=\"USE_PATTERN\" value=\"false\" />\n      <option name=\"testToRun\" value=\"\" />\n      <option name=\"keywords\" value=\"\" />\n      <option name=\"params\" value=\"\" />\n      <option name=\"USE_PARAM\" value=\"false\" />\n      <option name=\"USE_KEYWORD\" value=\"false\" />\n      <method />\n    </configuration>\n    <configuration default=\"false\" name=\"cork-hash\" type=\"CMakeRunConfiguration\" factoryName=\"Application\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"libcork\" TARGET_NAME=\"cork-hash\" CONFIG_NAME=\"Debug\" RUN_TARGET_PROJECT_NAME=\"libcork\" RUN_TARGET_NAME=\"cork-hash\">\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"false\" name=\"cork-initializer\" type=\"CMakeRunConfiguration\" factoryName=\"Application\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"libcork\" TARGET_NAME=\"cork-initializer\" CONFIG_NAME=\"Debug\" RUN_TARGET_PROJECT_NAME=\"libcork\" RUN_TARGET_NAME=\"cork-initializer\">\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"false\" name=\"cork-test\" type=\"CMakeRunConfiguration\" factoryName=\"Application\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"libcork\" TARGET_NAME=\"cork-test\" CONFIG_NAME=\"Debug\" RUN_TARGET_PROJECT_NAME=\"libcork\" RUN_TARGET_NAME=\"cork-test\">\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"false\" name=\"libcork-static\" type=\"CMakeRunConfiguration\" factoryName=\"Application\" PASS_PARENT_ENVS_2=\"true\" PROJECT_NAME=\"libcork\" TARGET_NAME=\"libcork-static\" CONFIG_NAME=\"Debug\">\n      <envs />\n      <method />\n    </configuration>\n    <configuration default=\"false\" name=\"Build All\" type=\"CMakeRunConfiguration\" factoryName=\"Application\" WORKING_DIR=\"\" PASS_PARENT_ENVS_2=\"true\" CONFIG_NAME=\"Debug\" RUN_TARGET_PROJECT_NAME=\"libcork\" RUN_TARGET_NAME=\"cork-test\" EXPLICIT_BUILD_TARGET_NAME=\"all\">\n      <envs />\n      <method />\n    </configuration>\n    <list size=\"5\">\n      <item index=\"0\" class=\"java.lang.String\" itemvalue=\"Application.cork-hash\" />\n      <item index=\"1\" class=\"java.lang.String\" itemvalue=\"Application.cork-initializer\" />\n      <item index=\"2\" class=\"java.lang.String\" itemvalue=\"Application.cork-test\" />\n      <item index=\"3\" class=\"java.lang.String\" itemvalue=\"Application.libcork-static\" />\n      <item index=\"4\" class=\"java.lang.String\" itemvalue=\"Application.Build All\" />\n    </list>\n  </component>\n  <component name=\"ShelveChangesManager\" show_recycled=\"false\">\n    <option name=\"remove_strategy\" value=\"false\" />\n  </component>\n  <component name=\"TaskManager\">\n    <task active=\"true\" id=\"Default\" summary=\"Default task\">\n      <changelist id=\"5cc43b05-9f40-4e8f-af93-ddec7c2cfadc\" name=\"Default\" comment=\"\" />\n      <created>1483455364838</created>\n      <option name=\"number\" value=\"Default\" />\n      <option name=\"presentableId\" value=\"Default\" />\n      <updated>1483455364838</updated>\n      <workItem from=\"1483455372045\" duration=\"3295000\" />\n      <workItem from=\"1483458687157\" duration=\"183000\" />\n    </task>\n    <servers />\n  </component>\n  <component name=\"TimeTrackingManager\">\n    <option name=\"totallyTimeSpent\" value=\"3478000\" />\n  </component>\n  <component name=\"ToolWindowManager\">\n    <frame x=\"-8\" y=\"-8\" width=\"1936\" height=\"1056\" extended-state=\"6\" />\n    <editor active=\"false\" />\n    <layout>\n      <window_info id=\"Project\" active=\"true\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"true\" show_stripe_button=\"true\" weight=\"0.18229716\" sideWeight=\"0.5\" order=\"0\" side_tool=\"false\" content_ui=\"combo\" />\n      <window_info id=\"TODO\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"6\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Messages\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.32936078\" sideWeight=\"0.5\" order=\"7\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"CMake\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.32936078\" sideWeight=\"0.5\" order=\"7\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Event Log\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"7\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Find\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Version Control\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"false\" weight=\"0.33\" sideWeight=\"0.5\" order=\"7\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Run\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.3347779\" sideWeight=\"0.5\" order=\"2\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Structure\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.25\" sideWeight=\"0.5\" order=\"1\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Terminal\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"7\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Favorites\" active=\"false\" anchor=\"left\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"2\" side_tool=\"true\" content_ui=\"tabs\" />\n      <window_info id=\"Debug\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.4\" sideWeight=\"0.5\" order=\"3\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Cvs\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.25\" sideWeight=\"0.5\" order=\"4\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Message\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.33\" sideWeight=\"0.5\" order=\"0\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Commander\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.4\" sideWeight=\"0.5\" order=\"0\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Inspection\" active=\"false\" anchor=\"bottom\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.4\" sideWeight=\"0.5\" order=\"5\" side_tool=\"false\" content_ui=\"tabs\" />\n      <window_info id=\"Hierarchy\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.25\" sideWeight=\"0.5\" order=\"2\" side_tool=\"false\" content_ui=\"combo\" />\n      <window_info id=\"Ant Build\" active=\"false\" anchor=\"right\" auto_hide=\"false\" internal_type=\"DOCKED\" type=\"DOCKED\" visible=\"false\" show_stripe_button=\"true\" weight=\"0.25\" sideWeight=\"0.5\" order=\"1\" side_tool=\"false\" content_ui=\"tabs\" />\n    </layout>\n  </component>\n  <component name=\"TypeScriptGeneratedFilesManager\">\n    <option name=\"processedProjectFiles\" value=\"true\" />\n  </component>\n  <component name=\"VcsContentAnnotationSettings\">\n    <option name=\"myLimit\" value=\"2678400000\" />\n  </component>\n  <component name=\"XDebuggerManager\">\n    <breakpoint-manager />\n    <watches-manager />\n  </component>\n  <component name=\"editorHistoryManager\">\n    <entry file=\"file://$PROJECT_DIR$/.gitignore\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"0\">\n          <caret line=\"0\" column=\"0\" lean-forward=\"false\" selection-start-line=\"0\" selection-start-column=\"0\" selection-end-line=\"0\" selection-end-column=\"0\" />\n          <folding />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/version.sh\" />\n    <entry file=\"file://$PROJECT_DIR$/RELEASE-VERSION\" />\n    <entry file=\"file://$PROJECT_DIR$/INSTALL\" />\n    <entry file=\"file://$PROJECT_DIR$/src/libcork/core/allocator.c\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"201\">\n          <caret line=\"241\" column=\"0\" lean-forward=\"false\" selection-start-line=\"241\" selection-start-column=\"0\" selection-end-line=\"241\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/include/libcork/core/allocator.h\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"163\">\n          <caret line=\"196\" column=\"7\" lean-forward=\"false\" selection-start-line=\"196\" selection-start-column=\"7\" selection-end-line=\"196\" selection-end-column=\"7\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/include/libcork/core/gc.h\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"263\">\n          <caret line=\"18\" column=\"10\" lean-forward=\"false\" selection-start-line=\"18\" selection-start-column=\"10\" selection-end-line=\"18\" selection-end-column=\"10\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/libcork/core/gc.c\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"627\">\n          <caret line=\"41\" column=\"7\" lean-forward=\"false\" selection-start-line=\"41\" selection-start-column=\"7\" selection-end-line=\"41\" selection-end-column=\"7\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/include/libcork/config/version.h.in\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"0\">\n          <caret line=\"0\" column=\"0\" lean-forward=\"false\" selection-start-line=\"0\" selection-start-column=\"0\" selection-end-line=\"0\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/cmake-build-debug/src/CMakeFiles/libcork-static.dir/flags.make\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"114\">\n          <caret line=\"6\" column=\"14\" lean-forward=\"false\" selection-start-line=\"6\" selection-start-column=\"14\" selection-end-line=\"6\" selection-end-column=\"14\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/include/CMakeLists.txt\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"0\">\n          <caret line=\"0\" column=\"0\" lean-forward=\"false\" selection-start-line=\"0\" selection-start-column=\"0\" selection-end-line=\"0\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/include/libcork/threads.h\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"0\">\n          <caret line=\"0\" column=\"0\" lean-forward=\"false\" selection-start-line=\"0\" selection-start-column=\"0\" selection-end-line=\"0\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/cmake-build-debug/include/libcork/config/version.h\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"0\">\n          <caret line=\"0\" column=\"0\" lean-forward=\"false\" selection-start-line=\"0\" selection-start-column=\"0\" selection-end-line=\"0\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/cmake-build-debug/include/CMakeFiles/progress.marks\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"0\">\n          <caret line=\"0\" column=\"0\" lean-forward=\"false\" selection-start-line=\"0\" selection-start-column=\"0\" selection-end-line=\"0\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/cmake-build-debug/include/CMakeFiles/CMakeDirectoryInformation.cmake\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"0\">\n          <caret line=\"0\" column=\"0\" lean-forward=\"false\" selection-start-line=\"0\" selection-start-column=\"0\" selection-end-line=\"0\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/CMakeLists.txt\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"-839\">\n          <caret line=\"11\" column=\"0\" lean-forward=\"false\" selection-start-line=\"11\" selection-start-column=\"0\" selection-end-line=\"11\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/cmake/FindCTargets.cmake\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"221\">\n          <caret line=\"68\" column=\"11\" lean-forward=\"false\" selection-start-line=\"68\" selection-start-column=\"11\" selection-end-line=\"68\" selection-end-column=\"11\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/cmake/FindParseArguments.cmake\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"221\">\n          <caret line=\"17\" column=\"11\" lean-forward=\"false\" selection-start-line=\"17\" selection-start-column=\"11\" selection-end-line=\"17\" selection-end-column=\"11\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/cmake/FindPrereqs.cmake\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"221\">\n          <caret line=\"40\" column=\"19\" lean-forward=\"false\" selection-start-line=\"40\" selection-start-column=\"19\" selection-end-line=\"40\" selection-end-column=\"19\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/cmake-build-debug/CMakeCache.txt\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"38\">\n          <caret line=\"2\" column=\"82\" lean-forward=\"false\" selection-start-line=\"2\" selection-start-column=\"76\" selection-end-line=\"2\" selection-end-column=\"82\" />\n          <folding />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/include/libcork/cli/commands.h\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"651\">\n          <caret line=\"53\" column=\"0\" lean-forward=\"false\" selection-start-line=\"53\" selection-start-column=\"0\" selection-end-line=\"53\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/libcork/cli/commands.c\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"201\">\n          <caret line=\"14\" column=\"0\" lean-forward=\"false\" selection-start-line=\"14\" selection-start-column=\"0\" selection-end-line=\"14\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/include/libcork/config/mingw32.h\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"-456\">\n          <caret line=\"0\" column=\"0\" lean-forward=\"false\" selection-start-line=\"0\" selection-start-column=\"0\" selection-end-line=\"0\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/include/libcork/config/linux.h\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"225\">\n          <caret line=\"20\" column=\"0\" lean-forward=\"false\" selection-start-line=\"20\" selection-start-column=\"0\" selection-end-line=\"20\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/include/libcork/config/arch.h\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"0\">\n          <caret line=\"0\" column=\"0\" lean-forward=\"false\" selection-start-line=\"0\" selection-start-column=\"0\" selection-end-line=\"0\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/include/libcork/config/gcc.h\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"912\">\n          <caret line=\"49\" column=\"5\" lean-forward=\"false\" selection-start-line=\"49\" selection-start-column=\"5\" selection-end-line=\"49\" selection-end-column=\"5\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/include/libcork/config/config.h\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"480\">\n          <caret line=\"50\" column=\"3\" lean-forward=\"false\" selection-start-line=\"50\" selection-start-column=\"3\" selection-end-line=\"50\" selection-end-column=\"3\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/include/libcork/core/api.h\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"233\">\n          <caret line=\"26\" column=\"0\" lean-forward=\"false\" selection-start-line=\"26\" selection-start-column=\"0\" selection-end-line=\"26\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://E:/cygwin64/usr/include/pthread.h\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"190\">\n          <caret line=\"13\" column=\"17\" lean-forward=\"true\" selection-start-line=\"13\" selection-start-column=\"17\" selection-end-line=\"13\" selection-end-column=\"17\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://E:/cygwin64/usr/include/sched.h\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"305\">\n          <caret line=\"88\" column=\"15\" lean-forward=\"false\" selection-start-line=\"88\" selection-start-column=\"4\" selection-end-line=\"88\" selection-end-column=\"15\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/libcork/posix/subprocess.c\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"291\">\n          <caret line=\"505\" column=\"44\" lean-forward=\"true\" selection-start-line=\"505\" selection-start-column=\"44\" selection-end-line=\"505\" selection-end-column=\"44\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/libcork/posix/env.c\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"332\">\n          <caret line=\"195\" column=\"1\" lean-forward=\"true\" selection-start-line=\"195\" selection-start-column=\"1\" selection-end-line=\"195\" selection-end-column=\"1\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/include/libcork/core/attributes.h\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"244\">\n          <caret line=\"138\" column=\"0\" lean-forward=\"false\" selection-start-line=\"138\" selection-start-column=\"0\" selection-end-line=\"138\" selection-end-column=\"0\" />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/APPNAME.pc.in\" />\n    <entry file=\"file://$PROJECT_DIR$/make-dist.sh\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"0\">\n          <caret line=\"0\" column=\"0\" lean-forward=\"false\" selection-start-line=\"0\" selection-start-column=\"0\" selection-end-line=\"0\" selection-end-column=\"0\" />\n          <folding />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/CMakeLists.txt\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"571\">\n          <caret line=\"68\" column=\"15\" lean-forward=\"false\" selection-start-line=\"68\" selection-start-column=\"15\" selection-end-line=\"68\" selection-end-column=\"15\" />\n          <folding />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/src/libcork.pc.in\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"0\">\n          <caret line=\"0\" column=\"0\" lean-forward=\"false\" selection-start-line=\"0\" selection-start-column=\"0\" selection-end-line=\"0\" selection-end-column=\"0\" />\n          <folding />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://$PROJECT_DIR$/.gitignore\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"323\">\n          <caret line=\"17\" column=\"0\" lean-forward=\"true\" selection-start-line=\"17\" selection-start-column=\"0\" selection-end-line=\"17\" selection-end-column=\"0\" />\n          <folding />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://E:/cygwin64/usr/include/_newlib_version.h\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"0\">\n          <caret line=\"0\" column=\"0\" lean-forward=\"false\" selection-start-line=\"0\" selection-start-column=\"0\" selection-end-line=\"0\" selection-end-column=\"0\" />\n          <folding />\n        </state>\n      </provider>\n    </entry>\n    <entry file=\"file://E:/cygwin64/lib/gcc/x86_64-pc-cygwin/5.4.0/include/avx512cdintrin.h\">\n      <provider selected=\"true\" editor-type-id=\"text-editor\">\n        <state relative-caret-position=\"0\">\n          <caret line=\"0\" column=\"0\" lean-forward=\"false\" selection-start-line=\"0\" selection-start-column=\"0\" selection-end-line=\"0\" selection-end-column=\"0\" />\n          <folding />\n        </state>\n      </provider>\n    </entry>\n  </component>\n</project>"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/CMakeLists.txt",
    "content": "# -*- coding: utf-8 -*-\n# ----------------------------------------------------------------------\n# Copyright © 2011-2015, RedJack, LLC.\n# All rights reserved.\n#\n# Please see the COPYING file in this distribution for license details.\n# ----------------------------------------------------------------------\n\ncmake_minimum_required(VERSION 2.6)\nset(PROJECT_NAME libcork)\nset(RELEASE_DATE 2015-09-03)\nproject(${PROJECT_NAME})\n\nset(CMAKE_MODULE_PATH \"${CMAKE_CURRENT_SOURCE_DIR}/cmake\")\nfind_package(CTargets)\n\n#-----------------------------------------------------------------------\n# Retrieve the current version number\n\nset(VERSION_MAJOR \"0\")\nset(VERSION_MINOR \"15\")\nset(VERSION_PATCH \"0\")\nset(VERSION \"0.15.0\")\nset(GIT_SHA1 \"d6ecc2cfbcdf5013038a72b4544f7d9e6eb8f92d\")\n\n#-----------------------------------------------------------------------\n# Check for building on Tilera\n# If the Tilera environment is installed, then $TILERA_ROOT is defined\n# as the path to the active MDE.\n\nif(DEFINED ENV{TILERA_ROOT})\n    set(TILERA TRUE)\n    set(TILERA_ROOT $ENV{TILERA_ROOT})\n    message(\"-- Configuring for Tilera MDE ${TILERA_ROOT}\")\n    set(ENV{PKG_CONFIG_PATH}\n        \"${TILERA_ROOT}/tile/usr/lib/pkgconfig:${TILERA_ROOT}/tile/usr/local/lib/pkgconfig:$ENV{PKG_CONFIG_PATH}\"\n    )\n    set(CMAKE_SYSTEM_NAME \"Tilera\")\n    set(CMAKE_SYSTEM_PROCESSOR \"tilegx\")\n    set(CMAKE_C_COMPILER \"${TILERA_ROOT}/bin/tile-gcc\")\n    set(CMAKE_LINKER \"${TILERA_ROOT}/bin/tile-ld\")\n    set(TILERA_MONITOR \"${TILERA_ROOT}/bin/tile-monitor\")\n    #add_definitions(-std=gnu99)\n    set(CMAKE_FIND_ROOT_PATH \"${TILERA_ROOT}/tile\")\n    set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)\n    set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\n    set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\nendif()\n\n#-----------------------------------------------------------------------\n# Set some options\n\nif(APPLE)\n    if (NOT CMAKE_INSTALL_NAME_DIR)\n        set(CMAKE_INSTALL_NAME_DIR \"${CMAKE_INSTALL_PREFIX}/lib\")\n    endif (NOT CMAKE_INSTALL_NAME_DIR)\nendif(APPLE)\n\nif(NOT CMAKE_BUILD_TYPE)\n    set(CMAKE_BUILD_TYPE Release CACHE STRING\n        \"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel.\"\n        FORCE)\nendif(NOT CMAKE_BUILD_TYPE)\n\nif(CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    add_definitions(-Wall -Werror)\nelseif(CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    add_definitions(-Wall -Werror)\nelseif(CMAKE_C_COMPILER_ID STREQUAL \"Intel\")\n    add_definitions(-Wall -Werror)\nendif(CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n\ninclude(GNUInstallDirs)\n\n#-----------------------------------------------------------------------\n# Check for prerequisite libraries\n\nfind_package(Threads)\nset(THREADS_LDFLAGS \"${CMAKE_THREAD_LIBS_INIT}\")\nif(WIN32)\n    if(CMAKE_THREAD_LIBS_INIT)\n        set(THREADS_STATIC_LDFLAGS \"-static ${CMAKE_THREAD_LIBS_INIT}\")\n    else()\n        set(THREADS_STATIC_LDFLAGS \"-static\")\n    endif()\nelse()\n    set(THREADS_STATIC_LDFLAGS \"${CMAKE_THREAD_LIBS_INIT}\")\nendif()\n\n\n\n#-----------------------------------------------------------------------\n# Include our subdirectories\n\n#add_subdirectory(include)\n#add_subdirectory(src)\n\nadd_c_library(\n        libcork\n        OUTPUT_NAME cork\n        PKGCONFIG_NAME libcork\n        VERSION 16.0.1\n        SOURCES\n        cli/commands.c\n        core/allocator.c\n        core/error.c\n        core/gc.c\n        core/hash.c\n        core/ip-address.c\n        core/mempool.c\n        core/timestamp.c\n        core/u128.c\n        core/version.c\n        ds/array.c\n        ds/bitset.c\n        ds/buffer.c\n        ds/dllist.c\n        ds/file-stream.c\n        ds/hash-table.c\n        ds/managed-buffer.c\n        ds/ring-buffer.c\n        ds/slice.c\n#        posix/directory-walker.c\n#        posix/env.c\n#        posix/exec.c\n#        posix/files.c\n        posix/process.c\n#        posix/subprocess.c\n        pthreads/thread.c\n        LIBRARIES\n        threads\n)\n\nset_target_properties(libcork PROPERTIES\n        COMPILE_DEFINITIONS CORK_API=CORK_LOCAL\n        )\n\nset(libcork_include_dirs\n        ${PROJECT_SOURCE_DIR}/include\n        ${PROJECT_BINARY_DIR}/include\n        CACHE INTERNAL \"libcork library\" FORCE\n        )"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/COPYING",
    "content": "Copyright © 2011-2012, RedJack, LLC.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n  • Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer.\n\n  • Redistributions in binary form must reproduce the above copyright\n    notice, this list of conditions and the following disclaimer in\n    the documentation and/or other materials provided with the\n    distribution.\n\n  • Neither the name of RedJack Software, LLC nor the names of its\n    contributors may be used to endorse or promote products derived\n    from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/Makefile.am",
    "content": "noinst_LTLIBRARIES = libcork.la\n\ncli_src = cli/commands.c\ncore_src = core/allocator.c core/error.c core/gc.c \\\n\t\t   core/hash.c core/ip-address.c core/mempool.c \\\n\t\t   core/timestamp.c core/u128.c\nds_src = ds/array.c ds/bitset.c ds/buffer.c ds/dllist.c \\\n\t\t ds/file-stream.c ds/hash-table.c ds/managed-buffer.c \\\n\t\t ds/ring-buffer.c ds/slice.c\nposix_src = posix/directory-walker.c posix/env.c posix/exec.c \\\n\t\t\tposix/files.c posix/process.c posix/subprocess.c\npthreads_src = pthreads/thread.c\n\nlibcork_la_SOURCES = $(cli_src) $(core_src) $(ds_src) \\\n\t\t\t\t\t $(posix_src) $(pthreads_src)\nlibcork_la_CFLAGS = -I$(top_srcdir)/libcork/include -DCORK_API=CORK_LOCAL\n\t\t\t\t\t \nlibcork_la_LDFLAGS = -static\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/Makefile.in",
    "content": "# Makefile.in generated by automake 1.15 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2014 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\nam__is_gnu_make = { \\\n  if test -z '$(MAKELEVEL)'; then \\\n    false; \\\n  elif test -n '$(MAKE_HOST)'; then \\\n    true; \\\n  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \\\n    true; \\\n  else \\\n    false; \\\n  fi; \\\n}\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\nsubdir = libcork\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \\\n\t$(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/inet_ntop.m4 \\\n\t$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \\\n\t$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \\\n\t$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/mbedtls.m4 \\\n\t$(top_srcdir)/m4/openssl.m4 $(top_srcdir)/m4/pcre.m4 \\\n\t$(top_srcdir)/m4/polarssl.m4 \\\n\t$(top_srcdir)/m4/stack-protector.m4 $(top_srcdir)/m4/zlib.m4 \\\n\t$(top_srcdir)/libev/libev.m4 $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nDIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nLTLIBRARIES = $(noinst_LTLIBRARIES)\nlibcork_la_LIBADD =\nam__dirstamp = $(am__leading_dot)dirstamp\nam__objects_1 = cli/libcork_la-commands.lo\nam__objects_2 = core/libcork_la-allocator.lo core/libcork_la-error.lo \\\n\tcore/libcork_la-gc.lo core/libcork_la-hash.lo \\\n\tcore/libcork_la-ip-address.lo core/libcork_la-mempool.lo \\\n\tcore/libcork_la-timestamp.lo core/libcork_la-u128.lo\nam__objects_3 = ds/libcork_la-array.lo ds/libcork_la-bitset.lo \\\n\tds/libcork_la-buffer.lo ds/libcork_la-dllist.lo \\\n\tds/libcork_la-file-stream.lo ds/libcork_la-hash-table.lo \\\n\tds/libcork_la-managed-buffer.lo ds/libcork_la-ring-buffer.lo \\\n\tds/libcork_la-slice.lo\nam__objects_4 = posix/libcork_la-directory-walker.lo \\\n\tposix/libcork_la-env.lo posix/libcork_la-exec.lo \\\n\tposix/libcork_la-files.lo posix/libcork_la-process.lo \\\n\tposix/libcork_la-subprocess.lo\nam__objects_5 = pthreads/libcork_la-thread.lo\nam_libcork_la_OBJECTS = $(am__objects_1) $(am__objects_2) \\\n\t$(am__objects_3) $(am__objects_4) $(am__objects_5)\nlibcork_la_OBJECTS = $(am_libcork_la_OBJECTS)\nAM_V_lt = $(am__v_lt_@AM_V@)\nam__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)\nam__v_lt_0 = --silent\nam__v_lt_1 = \nlibcork_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libcork_la_CFLAGS) \\\n\t$(CFLAGS) $(libcork_la_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nDEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)\ndepcomp = $(SHELL) $(top_srcdir)/auto/depcomp\nam__depfiles_maybe = depfiles\nam__mv = mv -f\nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nLTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \\\n\t$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \\\n\t$(AM_CFLAGS) $(CFLAGS)\nAM_V_CC = $(am__v_CC_@AM_V@)\nam__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)\nam__v_CC_0 = @echo \"  CC      \" $@;\nam__v_CC_1 = \nCCLD = $(CC)\nLINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \\\n\t$(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_CCLD = $(am__v_CCLD_@AM_V@)\nam__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)\nam__v_CCLD_0 = @echo \"  CCLD    \" $@;\nam__v_CCLD_1 = \nSOURCES = $(libcork_la_SOURCES)\nDIST_SOURCES = $(libcork_la_SOURCES)\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nam__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/auto/depcomp \\\n\tCOPYING\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAR = @AR@\nASCIIDOC = @ASCIIDOC@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDLLTOOL = @DLLTOOL@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nGZIP = @GZIP@\nINET_NTOP_LIB = @INET_NTOP_LIB@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBPCRE = @LIBPCRE@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMANIFEST_TOOL = @MANIFEST_TOOL@\nMKDIR_P = @MKDIR_P@\nMV = @MV@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nPCRE_CONFIG = @PCRE_CONFIG@\nPTHREAD_CC = @PTHREAD_CC@\nPTHREAD_CFLAGS = @PTHREAD_CFLAGS@\nPTHREAD_LIBS = @PTHREAD_LIBS@\nRANLIB = @RANLIB@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nXMLTO = @XMLTO@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_AR = @ac_ct_AR@\nac_ct_CC = @ac_ct_CC@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nax_pthread_config = @ax_pthread_config@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npcre_pcreh = @pcre_pcreh@\npcreh = @pcreh@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nrunstatedir = @runstatedir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsubdirs = @subdirs@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nnoinst_LTLIBRARIES = libcork.la\ncli_src = cli/commands.c\ncore_src = core/allocator.c core/error.c core/gc.c \\\n\t\t   core/hash.c core/ip-address.c core/mempool.c \\\n\t\t   core/timestamp.c core/u128.c\n\nds_src = ds/array.c ds/bitset.c ds/buffer.c ds/dllist.c \\\n\t\t ds/file-stream.c ds/hash-table.c ds/managed-buffer.c \\\n\t\t ds/ring-buffer.c ds/slice.c\n\nposix_src = posix/directory-walker.c posix/env.c posix/exec.c \\\n\t\t\tposix/files.c posix/process.c posix/subprocess.c\n\npthreads_src = pthreads/thread.c\nlibcork_la_SOURCES = $(cli_src) $(core_src) $(ds_src) \\\n\t\t\t\t\t $(posix_src) $(pthreads_src)\n\nlibcork_la_CFLAGS = -I$(top_srcdir)/libcork/include -DCORK_API=CORK_LOCAL\nlibcork_la_LDFLAGS = -static\nall: all-am\n\n.SUFFIXES:\n.SUFFIXES: .c .lo .o .obj\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libcork/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign libcork/Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nclean-noinstLTLIBRARIES:\n\t-test -z \"$(noinst_LTLIBRARIES)\" || rm -f $(noinst_LTLIBRARIES)\n\t@list='$(noinst_LTLIBRARIES)'; \\\n\tlocs=`for p in $$list; do echo $$p; done | \\\n\t      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \\\n\t      sort -u`; \\\n\ttest -z \"$$locs\" || { \\\n\t  echo rm -f $${locs}; \\\n\t  rm -f $${locs}; \\\n\t}\ncli/$(am__dirstamp):\n\t@$(MKDIR_P) cli\n\t@: > cli/$(am__dirstamp)\ncli/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) cli/$(DEPDIR)\n\t@: > cli/$(DEPDIR)/$(am__dirstamp)\ncli/libcork_la-commands.lo: cli/$(am__dirstamp) \\\n\tcli/$(DEPDIR)/$(am__dirstamp)\ncore/$(am__dirstamp):\n\t@$(MKDIR_P) core\n\t@: > core/$(am__dirstamp)\ncore/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) core/$(DEPDIR)\n\t@: > core/$(DEPDIR)/$(am__dirstamp)\ncore/libcork_la-allocator.lo: core/$(am__dirstamp) \\\n\tcore/$(DEPDIR)/$(am__dirstamp)\ncore/libcork_la-error.lo: core/$(am__dirstamp) \\\n\tcore/$(DEPDIR)/$(am__dirstamp)\ncore/libcork_la-gc.lo: core/$(am__dirstamp) \\\n\tcore/$(DEPDIR)/$(am__dirstamp)\ncore/libcork_la-hash.lo: core/$(am__dirstamp) \\\n\tcore/$(DEPDIR)/$(am__dirstamp)\ncore/libcork_la-ip-address.lo: core/$(am__dirstamp) \\\n\tcore/$(DEPDIR)/$(am__dirstamp)\ncore/libcork_la-mempool.lo: core/$(am__dirstamp) \\\n\tcore/$(DEPDIR)/$(am__dirstamp)\ncore/libcork_la-timestamp.lo: core/$(am__dirstamp) \\\n\tcore/$(DEPDIR)/$(am__dirstamp)\ncore/libcork_la-u128.lo: core/$(am__dirstamp) \\\n\tcore/$(DEPDIR)/$(am__dirstamp)\nds/$(am__dirstamp):\n\t@$(MKDIR_P) ds\n\t@: > ds/$(am__dirstamp)\nds/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) ds/$(DEPDIR)\n\t@: > ds/$(DEPDIR)/$(am__dirstamp)\nds/libcork_la-array.lo: ds/$(am__dirstamp) \\\n\tds/$(DEPDIR)/$(am__dirstamp)\nds/libcork_la-bitset.lo: ds/$(am__dirstamp) \\\n\tds/$(DEPDIR)/$(am__dirstamp)\nds/libcork_la-buffer.lo: ds/$(am__dirstamp) \\\n\tds/$(DEPDIR)/$(am__dirstamp)\nds/libcork_la-dllist.lo: ds/$(am__dirstamp) \\\n\tds/$(DEPDIR)/$(am__dirstamp)\nds/libcork_la-file-stream.lo: ds/$(am__dirstamp) \\\n\tds/$(DEPDIR)/$(am__dirstamp)\nds/libcork_la-hash-table.lo: ds/$(am__dirstamp) \\\n\tds/$(DEPDIR)/$(am__dirstamp)\nds/libcork_la-managed-buffer.lo: ds/$(am__dirstamp) \\\n\tds/$(DEPDIR)/$(am__dirstamp)\nds/libcork_la-ring-buffer.lo: ds/$(am__dirstamp) \\\n\tds/$(DEPDIR)/$(am__dirstamp)\nds/libcork_la-slice.lo: ds/$(am__dirstamp) \\\n\tds/$(DEPDIR)/$(am__dirstamp)\nposix/$(am__dirstamp):\n\t@$(MKDIR_P) posix\n\t@: > posix/$(am__dirstamp)\nposix/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) posix/$(DEPDIR)\n\t@: > posix/$(DEPDIR)/$(am__dirstamp)\nposix/libcork_la-directory-walker.lo: posix/$(am__dirstamp) \\\n\tposix/$(DEPDIR)/$(am__dirstamp)\nposix/libcork_la-env.lo: posix/$(am__dirstamp) \\\n\tposix/$(DEPDIR)/$(am__dirstamp)\nposix/libcork_la-exec.lo: posix/$(am__dirstamp) \\\n\tposix/$(DEPDIR)/$(am__dirstamp)\nposix/libcork_la-files.lo: posix/$(am__dirstamp) \\\n\tposix/$(DEPDIR)/$(am__dirstamp)\nposix/libcork_la-process.lo: posix/$(am__dirstamp) \\\n\tposix/$(DEPDIR)/$(am__dirstamp)\nposix/libcork_la-subprocess.lo: posix/$(am__dirstamp) \\\n\tposix/$(DEPDIR)/$(am__dirstamp)\npthreads/$(am__dirstamp):\n\t@$(MKDIR_P) pthreads\n\t@: > pthreads/$(am__dirstamp)\npthreads/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) pthreads/$(DEPDIR)\n\t@: > pthreads/$(DEPDIR)/$(am__dirstamp)\npthreads/libcork_la-thread.lo: pthreads/$(am__dirstamp) \\\n\tpthreads/$(DEPDIR)/$(am__dirstamp)\n\nlibcork.la: $(libcork_la_OBJECTS) $(libcork_la_DEPENDENCIES) $(EXTRA_libcork_la_DEPENDENCIES) \n\t$(AM_V_CCLD)$(libcork_la_LINK)  $(libcork_la_OBJECTS) $(libcork_la_LIBADD) $(LIBS)\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\t-rm -f cli/*.$(OBJEXT)\n\t-rm -f cli/*.lo\n\t-rm -f core/*.$(OBJEXT)\n\t-rm -f core/*.lo\n\t-rm -f ds/*.$(OBJEXT)\n\t-rm -f ds/*.lo\n\t-rm -f posix/*.$(OBJEXT)\n\t-rm -f posix/*.lo\n\t-rm -f pthreads/*.$(OBJEXT)\n\t-rm -f pthreads/*.lo\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@cli/$(DEPDIR)/libcork_la-commands.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/libcork_la-allocator.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/libcork_la-error.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/libcork_la-gc.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/libcork_la-hash.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/libcork_la-ip-address.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/libcork_la-mempool.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/libcork_la-timestamp.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@core/$(DEPDIR)/libcork_la-u128.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@ds/$(DEPDIR)/libcork_la-array.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@ds/$(DEPDIR)/libcork_la-bitset.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@ds/$(DEPDIR)/libcork_la-buffer.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@ds/$(DEPDIR)/libcork_la-dllist.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@ds/$(DEPDIR)/libcork_la-file-stream.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@ds/$(DEPDIR)/libcork_la-hash-table.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@ds/$(DEPDIR)/libcork_la-managed-buffer.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@ds/$(DEPDIR)/libcork_la-ring-buffer.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@ds/$(DEPDIR)/libcork_la-slice.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@posix/$(DEPDIR)/libcork_la-directory-walker.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@posix/$(DEPDIR)/libcork_la-env.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@posix/$(DEPDIR)/libcork_la-exec.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@posix/$(DEPDIR)/libcork_la-files.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@posix/$(DEPDIR)/libcork_la-process.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@posix/$(DEPDIR)/libcork_la-subprocess.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@pthreads/$(DEPDIR)/libcork_la-thread.Plo@am__quote@\n\n.c.o:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.o$$||'`;\\\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<\n\n.c.obj:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.obj$$||'`;\\\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\n.c.lo:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.lo$$||'`;\\\n@am__fastdepCC_TRUE@\t$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<\n\ncli/libcork_la-commands.lo: cli/commands.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT cli/libcork_la-commands.lo -MD -MP -MF cli/$(DEPDIR)/libcork_la-commands.Tpo -c -o cli/libcork_la-commands.lo `test -f 'cli/commands.c' || echo '$(srcdir)/'`cli/commands.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) cli/$(DEPDIR)/libcork_la-commands.Tpo cli/$(DEPDIR)/libcork_la-commands.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='cli/commands.c' object='cli/libcork_la-commands.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o cli/libcork_la-commands.lo `test -f 'cli/commands.c' || echo '$(srcdir)/'`cli/commands.c\n\ncore/libcork_la-allocator.lo: core/allocator.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT core/libcork_la-allocator.lo -MD -MP -MF core/$(DEPDIR)/libcork_la-allocator.Tpo -c -o core/libcork_la-allocator.lo `test -f 'core/allocator.c' || echo '$(srcdir)/'`core/allocator.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) core/$(DEPDIR)/libcork_la-allocator.Tpo core/$(DEPDIR)/libcork_la-allocator.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='core/allocator.c' object='core/libcork_la-allocator.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o core/libcork_la-allocator.lo `test -f 'core/allocator.c' || echo '$(srcdir)/'`core/allocator.c\n\ncore/libcork_la-error.lo: core/error.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT core/libcork_la-error.lo -MD -MP -MF core/$(DEPDIR)/libcork_la-error.Tpo -c -o core/libcork_la-error.lo `test -f 'core/error.c' || echo '$(srcdir)/'`core/error.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) core/$(DEPDIR)/libcork_la-error.Tpo core/$(DEPDIR)/libcork_la-error.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='core/error.c' object='core/libcork_la-error.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o core/libcork_la-error.lo `test -f 'core/error.c' || echo '$(srcdir)/'`core/error.c\n\ncore/libcork_la-gc.lo: core/gc.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT core/libcork_la-gc.lo -MD -MP -MF core/$(DEPDIR)/libcork_la-gc.Tpo -c -o core/libcork_la-gc.lo `test -f 'core/gc.c' || echo '$(srcdir)/'`core/gc.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) core/$(DEPDIR)/libcork_la-gc.Tpo core/$(DEPDIR)/libcork_la-gc.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='core/gc.c' object='core/libcork_la-gc.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o core/libcork_la-gc.lo `test -f 'core/gc.c' || echo '$(srcdir)/'`core/gc.c\n\ncore/libcork_la-hash.lo: core/hash.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT core/libcork_la-hash.lo -MD -MP -MF core/$(DEPDIR)/libcork_la-hash.Tpo -c -o core/libcork_la-hash.lo `test -f 'core/hash.c' || echo '$(srcdir)/'`core/hash.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) core/$(DEPDIR)/libcork_la-hash.Tpo core/$(DEPDIR)/libcork_la-hash.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='core/hash.c' object='core/libcork_la-hash.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o core/libcork_la-hash.lo `test -f 'core/hash.c' || echo '$(srcdir)/'`core/hash.c\n\ncore/libcork_la-ip-address.lo: core/ip-address.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT core/libcork_la-ip-address.lo -MD -MP -MF core/$(DEPDIR)/libcork_la-ip-address.Tpo -c -o core/libcork_la-ip-address.lo `test -f 'core/ip-address.c' || echo '$(srcdir)/'`core/ip-address.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) core/$(DEPDIR)/libcork_la-ip-address.Tpo core/$(DEPDIR)/libcork_la-ip-address.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='core/ip-address.c' object='core/libcork_la-ip-address.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o core/libcork_la-ip-address.lo `test -f 'core/ip-address.c' || echo '$(srcdir)/'`core/ip-address.c\n\ncore/libcork_la-mempool.lo: core/mempool.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT core/libcork_la-mempool.lo -MD -MP -MF core/$(DEPDIR)/libcork_la-mempool.Tpo -c -o core/libcork_la-mempool.lo `test -f 'core/mempool.c' || echo '$(srcdir)/'`core/mempool.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) core/$(DEPDIR)/libcork_la-mempool.Tpo core/$(DEPDIR)/libcork_la-mempool.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='core/mempool.c' object='core/libcork_la-mempool.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o core/libcork_la-mempool.lo `test -f 'core/mempool.c' || echo '$(srcdir)/'`core/mempool.c\n\ncore/libcork_la-timestamp.lo: core/timestamp.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT core/libcork_la-timestamp.lo -MD -MP -MF core/$(DEPDIR)/libcork_la-timestamp.Tpo -c -o core/libcork_la-timestamp.lo `test -f 'core/timestamp.c' || echo '$(srcdir)/'`core/timestamp.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) core/$(DEPDIR)/libcork_la-timestamp.Tpo core/$(DEPDIR)/libcork_la-timestamp.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='core/timestamp.c' object='core/libcork_la-timestamp.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o core/libcork_la-timestamp.lo `test -f 'core/timestamp.c' || echo '$(srcdir)/'`core/timestamp.c\n\ncore/libcork_la-u128.lo: core/u128.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT core/libcork_la-u128.lo -MD -MP -MF core/$(DEPDIR)/libcork_la-u128.Tpo -c -o core/libcork_la-u128.lo `test -f 'core/u128.c' || echo '$(srcdir)/'`core/u128.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) core/$(DEPDIR)/libcork_la-u128.Tpo core/$(DEPDIR)/libcork_la-u128.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='core/u128.c' object='core/libcork_la-u128.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o core/libcork_la-u128.lo `test -f 'core/u128.c' || echo '$(srcdir)/'`core/u128.c\n\nds/libcork_la-array.lo: ds/array.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT ds/libcork_la-array.lo -MD -MP -MF ds/$(DEPDIR)/libcork_la-array.Tpo -c -o ds/libcork_la-array.lo `test -f 'ds/array.c' || echo '$(srcdir)/'`ds/array.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) ds/$(DEPDIR)/libcork_la-array.Tpo ds/$(DEPDIR)/libcork_la-array.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='ds/array.c' object='ds/libcork_la-array.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o ds/libcork_la-array.lo `test -f 'ds/array.c' || echo '$(srcdir)/'`ds/array.c\n\nds/libcork_la-bitset.lo: ds/bitset.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT ds/libcork_la-bitset.lo -MD -MP -MF ds/$(DEPDIR)/libcork_la-bitset.Tpo -c -o ds/libcork_la-bitset.lo `test -f 'ds/bitset.c' || echo '$(srcdir)/'`ds/bitset.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) ds/$(DEPDIR)/libcork_la-bitset.Tpo ds/$(DEPDIR)/libcork_la-bitset.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='ds/bitset.c' object='ds/libcork_la-bitset.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o ds/libcork_la-bitset.lo `test -f 'ds/bitset.c' || echo '$(srcdir)/'`ds/bitset.c\n\nds/libcork_la-buffer.lo: ds/buffer.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT ds/libcork_la-buffer.lo -MD -MP -MF ds/$(DEPDIR)/libcork_la-buffer.Tpo -c -o ds/libcork_la-buffer.lo `test -f 'ds/buffer.c' || echo '$(srcdir)/'`ds/buffer.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) ds/$(DEPDIR)/libcork_la-buffer.Tpo ds/$(DEPDIR)/libcork_la-buffer.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='ds/buffer.c' object='ds/libcork_la-buffer.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o ds/libcork_la-buffer.lo `test -f 'ds/buffer.c' || echo '$(srcdir)/'`ds/buffer.c\n\nds/libcork_la-dllist.lo: ds/dllist.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT ds/libcork_la-dllist.lo -MD -MP -MF ds/$(DEPDIR)/libcork_la-dllist.Tpo -c -o ds/libcork_la-dllist.lo `test -f 'ds/dllist.c' || echo '$(srcdir)/'`ds/dllist.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) ds/$(DEPDIR)/libcork_la-dllist.Tpo ds/$(DEPDIR)/libcork_la-dllist.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='ds/dllist.c' object='ds/libcork_la-dllist.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o ds/libcork_la-dllist.lo `test -f 'ds/dllist.c' || echo '$(srcdir)/'`ds/dllist.c\n\nds/libcork_la-file-stream.lo: ds/file-stream.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT ds/libcork_la-file-stream.lo -MD -MP -MF ds/$(DEPDIR)/libcork_la-file-stream.Tpo -c -o ds/libcork_la-file-stream.lo `test -f 'ds/file-stream.c' || echo '$(srcdir)/'`ds/file-stream.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) ds/$(DEPDIR)/libcork_la-file-stream.Tpo ds/$(DEPDIR)/libcork_la-file-stream.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='ds/file-stream.c' object='ds/libcork_la-file-stream.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o ds/libcork_la-file-stream.lo `test -f 'ds/file-stream.c' || echo '$(srcdir)/'`ds/file-stream.c\n\nds/libcork_la-hash-table.lo: ds/hash-table.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT ds/libcork_la-hash-table.lo -MD -MP -MF ds/$(DEPDIR)/libcork_la-hash-table.Tpo -c -o ds/libcork_la-hash-table.lo `test -f 'ds/hash-table.c' || echo '$(srcdir)/'`ds/hash-table.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) ds/$(DEPDIR)/libcork_la-hash-table.Tpo ds/$(DEPDIR)/libcork_la-hash-table.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='ds/hash-table.c' object='ds/libcork_la-hash-table.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o ds/libcork_la-hash-table.lo `test -f 'ds/hash-table.c' || echo '$(srcdir)/'`ds/hash-table.c\n\nds/libcork_la-managed-buffer.lo: ds/managed-buffer.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT ds/libcork_la-managed-buffer.lo -MD -MP -MF ds/$(DEPDIR)/libcork_la-managed-buffer.Tpo -c -o ds/libcork_la-managed-buffer.lo `test -f 'ds/managed-buffer.c' || echo '$(srcdir)/'`ds/managed-buffer.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) ds/$(DEPDIR)/libcork_la-managed-buffer.Tpo ds/$(DEPDIR)/libcork_la-managed-buffer.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='ds/managed-buffer.c' object='ds/libcork_la-managed-buffer.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o ds/libcork_la-managed-buffer.lo `test -f 'ds/managed-buffer.c' || echo '$(srcdir)/'`ds/managed-buffer.c\n\nds/libcork_la-ring-buffer.lo: ds/ring-buffer.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT ds/libcork_la-ring-buffer.lo -MD -MP -MF ds/$(DEPDIR)/libcork_la-ring-buffer.Tpo -c -o ds/libcork_la-ring-buffer.lo `test -f 'ds/ring-buffer.c' || echo '$(srcdir)/'`ds/ring-buffer.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) ds/$(DEPDIR)/libcork_la-ring-buffer.Tpo ds/$(DEPDIR)/libcork_la-ring-buffer.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='ds/ring-buffer.c' object='ds/libcork_la-ring-buffer.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o ds/libcork_la-ring-buffer.lo `test -f 'ds/ring-buffer.c' || echo '$(srcdir)/'`ds/ring-buffer.c\n\nds/libcork_la-slice.lo: ds/slice.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT ds/libcork_la-slice.lo -MD -MP -MF ds/$(DEPDIR)/libcork_la-slice.Tpo -c -o ds/libcork_la-slice.lo `test -f 'ds/slice.c' || echo '$(srcdir)/'`ds/slice.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) ds/$(DEPDIR)/libcork_la-slice.Tpo ds/$(DEPDIR)/libcork_la-slice.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='ds/slice.c' object='ds/libcork_la-slice.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o ds/libcork_la-slice.lo `test -f 'ds/slice.c' || echo '$(srcdir)/'`ds/slice.c\n\nposix/libcork_la-directory-walker.lo: posix/directory-walker.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT posix/libcork_la-directory-walker.lo -MD -MP -MF posix/$(DEPDIR)/libcork_la-directory-walker.Tpo -c -o posix/libcork_la-directory-walker.lo `test -f 'posix/directory-walker.c' || echo '$(srcdir)/'`posix/directory-walker.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) posix/$(DEPDIR)/libcork_la-directory-walker.Tpo posix/$(DEPDIR)/libcork_la-directory-walker.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='posix/directory-walker.c' object='posix/libcork_la-directory-walker.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o posix/libcork_la-directory-walker.lo `test -f 'posix/directory-walker.c' || echo '$(srcdir)/'`posix/directory-walker.c\n\nposix/libcork_la-env.lo: posix/env.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT posix/libcork_la-env.lo -MD -MP -MF posix/$(DEPDIR)/libcork_la-env.Tpo -c -o posix/libcork_la-env.lo `test -f 'posix/env.c' || echo '$(srcdir)/'`posix/env.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) posix/$(DEPDIR)/libcork_la-env.Tpo posix/$(DEPDIR)/libcork_la-env.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='posix/env.c' object='posix/libcork_la-env.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o posix/libcork_la-env.lo `test -f 'posix/env.c' || echo '$(srcdir)/'`posix/env.c\n\nposix/libcork_la-exec.lo: posix/exec.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT posix/libcork_la-exec.lo -MD -MP -MF posix/$(DEPDIR)/libcork_la-exec.Tpo -c -o posix/libcork_la-exec.lo `test -f 'posix/exec.c' || echo '$(srcdir)/'`posix/exec.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) posix/$(DEPDIR)/libcork_la-exec.Tpo posix/$(DEPDIR)/libcork_la-exec.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='posix/exec.c' object='posix/libcork_la-exec.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o posix/libcork_la-exec.lo `test -f 'posix/exec.c' || echo '$(srcdir)/'`posix/exec.c\n\nposix/libcork_la-files.lo: posix/files.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT posix/libcork_la-files.lo -MD -MP -MF posix/$(DEPDIR)/libcork_la-files.Tpo -c -o posix/libcork_la-files.lo `test -f 'posix/files.c' || echo '$(srcdir)/'`posix/files.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) posix/$(DEPDIR)/libcork_la-files.Tpo posix/$(DEPDIR)/libcork_la-files.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='posix/files.c' object='posix/libcork_la-files.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o posix/libcork_la-files.lo `test -f 'posix/files.c' || echo '$(srcdir)/'`posix/files.c\n\nposix/libcork_la-process.lo: posix/process.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT posix/libcork_la-process.lo -MD -MP -MF posix/$(DEPDIR)/libcork_la-process.Tpo -c -o posix/libcork_la-process.lo `test -f 'posix/process.c' || echo '$(srcdir)/'`posix/process.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) posix/$(DEPDIR)/libcork_la-process.Tpo posix/$(DEPDIR)/libcork_la-process.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='posix/process.c' object='posix/libcork_la-process.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o posix/libcork_la-process.lo `test -f 'posix/process.c' || echo '$(srcdir)/'`posix/process.c\n\nposix/libcork_la-subprocess.lo: posix/subprocess.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT posix/libcork_la-subprocess.lo -MD -MP -MF posix/$(DEPDIR)/libcork_la-subprocess.Tpo -c -o posix/libcork_la-subprocess.lo `test -f 'posix/subprocess.c' || echo '$(srcdir)/'`posix/subprocess.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) posix/$(DEPDIR)/libcork_la-subprocess.Tpo posix/$(DEPDIR)/libcork_la-subprocess.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='posix/subprocess.c' object='posix/libcork_la-subprocess.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o posix/libcork_la-subprocess.lo `test -f 'posix/subprocess.c' || echo '$(srcdir)/'`posix/subprocess.c\n\npthreads/libcork_la-thread.lo: pthreads/thread.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -MT pthreads/libcork_la-thread.lo -MD -MP -MF pthreads/$(DEPDIR)/libcork_la-thread.Tpo -c -o pthreads/libcork_la-thread.lo `test -f 'pthreads/thread.c' || echo '$(srcdir)/'`pthreads/thread.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) pthreads/$(DEPDIR)/libcork_la-thread.Tpo pthreads/$(DEPDIR)/libcork_la-thread.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='pthreads/thread.c' object='pthreads/libcork_la-thread.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libcork_la_CFLAGS) $(CFLAGS) -c -o pthreads/libcork_la-thread.lo `test -f 'pthreads/thread.c' || echo '$(srcdir)/'`pthreads/thread.c\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\n\t-rm -rf cli/.libs cli/_libs\n\t-rm -rf core/.libs core/_libs\n\t-rm -rf ds/.libs ds/_libs\n\t-rm -rf posix/.libs posix/_libs\n\t-rm -rf pthreads/.libs pthreads/_libs\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-am\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-am\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscopelist: cscopelist-am\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(LTLIBRARIES)\ninstalldirs:\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\t-rm -f cli/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f cli/$(am__dirstamp)\n\t-rm -f core/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f core/$(am__dirstamp)\n\t-rm -f ds/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f ds/$(am__dirstamp)\n\t-rm -f posix/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f posix/$(am__dirstamp)\n\t-rm -f pthreads/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f pthreads/$(am__dirstamp)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \\\n\tmostlyclean-am\n\ndistclean: distclean-am\n\t-rm -rf cli/$(DEPDIR) core/$(DEPDIR) ds/$(DEPDIR) posix/$(DEPDIR) pthreads/$(DEPDIR)\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t-rm -rf cli/$(DEPDIR) core/$(DEPDIR) ds/$(DEPDIR) posix/$(DEPDIR) pthreads/$(DEPDIR)\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic \\\n\tmostlyclean-libtool\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am:\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \\\n\tclean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \\\n\tctags-am distclean distclean-compile distclean-generic \\\n\tdistclean-libtool distclean-tags distdir dvi dvi-am html \\\n\thtml-am info info-am install install-am install-data \\\n\tinstall-data-am install-dvi install-dvi-am install-exec \\\n\tinstall-exec-am install-html install-html-am install-info \\\n\tinstall-info-am install-man install-pdf install-pdf-am \\\n\tinstall-ps install-ps-am install-strip installcheck \\\n\tinstallcheck-am installdirs maintainer-clean \\\n\tmaintainer-clean-generic mostlyclean mostlyclean-compile \\\n\tmostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \\\n\ttags tags-am uninstall uninstall-am\n\n.PRECIOUS: Makefile\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/README.markdown",
    "content": "# libcork\n\nSo what is libcork, exactly?  It's a “simple, easily embeddable,\ncross-platform C library”.  It falls roughly into the same category as\n[glib](http://library.gnome.org/devel/glib/) or\n[APR](http://apr.apache.org/) in the C world; the STL,\n[POCO](http://pocoproject.org/), or [QtCore](http://qt.nokia.com/)\nin the C++ world; or the standard libraries of any decent dynamic\nlanguage.\n\nSo if libcork has all of these comparables, why a new library?  Well,\nnone of the C++ options are really applicable here.  And none of the C\noptions work, because one of the main goals is to have the library be\nhighly modular, and useful in resource-constrained systems.  Once we\ndescribe some of the design decisions that we've made in libcork, you'll\nhopefully see how this fits into an interesting niche of its own.\n\n## Using libcork\n\nThere are two primary ways to use libcork in your own software project:\nas a _shared library_, or _embedded_.\n\nWhen you use libcork as a shared library, you install it just like you\nwould any other C library.  We happen to use CMake as our build system,\nso you follow the usual CMake recipe to install the library.  (See the\n[INSTALL](INSTALL) file for details.)  All of the libcork code is\ncontained within a single shared library (called libcork.so,\nlibcork.dylib, or cork.dll, depending on the system).  We also install a\npkg-config file that makes it easy to add the appropriate compiler flags\nin your own build scripts.  So, you use pkg-config to find libcork's\ninclude and library files, link with libcork, and you're good to go.\n\nThe alternative is to embed libcork into your own software project's\ndirectory structure.  In this case, your build scripts compile the\nlibcork source along with the rest of your code.  This has some\nadvantages for resource-constrained systems, since (assuming your\ncompiler and linker are any good), you only include the libcork routines\nthat you actually use.  And if your toolchain supports link-time\noptimization, the libcork routines can be optimized into the rest of\nyour code.\n\nWhich should you use?  That's really up to you.  Linking against the\nshared library adds a runtime dependency, but gives you the usual\nbenefits of shared libraries: the library in memory is shared across\neach program that uses it; you can install a single bug-fix update and\nall libcork programs automatically take advantage of the new release;\netc.  The embedding option is great if you really need to make your\nlibrary as small as possible, or if you don't want to add that runtime\ndependency.\n\n## Design decisions\n\nNote that having libcork be **easily** embeddable has some ramifications\non the library's design.  In particular, we don't want to make any\nassumptions about which build system you're embedding libcork into.  We\nhappen to use CMake, but you might be using autotools, waf, scons, or\nany number of others.  Most cross-platform libraries follow the\nautotools model of performing some checks at compile time (maybe during\na separate “configure” phase, maybe not) to choose the right API\nimplementation for the current platform.  Since we can't assume a build\nsystem, we have to take a different approach, and do as many checks as\nwe can using the C preprocessor.  Any check that we can't make in the\npreprocessor has to be driven by a C preprocessor macro definition,\nwhich you (the libcork user) are responsible for checking for and\ndefining.  So we need to have as few of those as possible.\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/cli/commands.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"libcork/cli.h\"\n#include \"libcork/core.h\"\n#include \"libcork/ds.h\"\n\n\n#define streq(a,b) (strcmp((a), (b)) == 0)\n\nstatic struct cork_buffer  breadcrumbs_buf = CORK_BUFFER_INIT();\n\nstatic void\ncork_command_add_breadcrumb(struct cork_command *command)\n{\n    cork_buffer_append_printf(&breadcrumbs_buf, \" %s\", command->name);\n}\n\n#define cork_command_breadcrumbs() ((char *) breadcrumbs_buf.buf)\n\nstatic void\ncork_command_run(struct cork_command *command, int argc, char **argv);\n\nstatic struct cork_command *\ncork_command_set_get_subcommand(struct cork_command *command,\n                                const char *command_name)\n{\n    struct cork_command  **curr;\n    for (curr = command->set; *curr != NULL; curr++) {\n        if (streq(command_name, (*curr)->name)) {\n            return *curr;\n        }\n    }\n    return NULL;\n}\n\nstatic void\ncork_command_set_show_help(struct cork_command *command)\n{\n    size_t  max_length = 0;\n    struct cork_command  **curr;\n\n    /* Calculate the length of the longest command name. */\n    for (curr = command->set; *curr != NULL; curr++) {\n        size_t  len = strlen((*curr)->name);\n        if (len > max_length) {\n            max_length = len;\n        }\n    }\n\n    /* Then print out the available commands. */\n    printf(\"Usage:%s <command> [<options>]\\n\"\n           \"\\nAvailable commands:\\n\",\n           cork_command_breadcrumbs());\n\n    for (curr = command->set; *curr != NULL; curr++) {\n        printf(\"  %*s\", (int) -max_length, (*curr)->name);\n        if ((*curr)->short_desc != NULL) {\n            printf(\"  %s\\n\", (*curr)->short_desc);\n        } else {\n            printf(\"\\n\");\n        }\n    }\n}\n\nstatic void\ncork_command_leaf_show_help(struct cork_command *command)\n{\n    printf(\"Usage:%s\", cork_command_breadcrumbs());\n    if (command->usage_suffix != NULL) {\n        printf(\" %s\", command->usage_suffix);\n    }\n    if (command->full_help != NULL) {\n        printf(\"\\n\\n%s\", command->full_help);\n    } else {\n        printf(\"\\n\");\n    }\n}\n\nvoid\ncork_command_show_help(struct cork_command *command, const char *message)\n{\n    if (message != NULL) {\n        printf(\"%s\\n\", message);\n    }\n\n    if (command->type == CORK_COMMAND_SET) {\n        cork_command_set_show_help(command);\n    } else if (command->type == CORK_LEAF_COMMAND) {\n        cork_command_leaf_show_help(command);\n    }\n}\n\nstatic void\ncork_command_set_run_help(struct cork_command *command, int argc, char **argv)\n{\n    /* When we see the help command when processing a command set, we use any\n     * remaining arguments to identifity which subcommand the user wants help\n     * with. */\n\n    /* Skip over the name of the command set */\n    argc--;\n    argv++;\n\n    while (argc > 0 && command->type == CORK_COMMAND_SET) {\n        struct cork_command  *subcommand =\n            cork_command_set_get_subcommand(command, argv[0]);\n        if (subcommand == NULL) {\n            printf(\"Unknown command \\\"%s\\\".\\n\"\n                   \"Usage:%s <command> [<options>]\\n\",\n                   argv[0], cork_command_breadcrumbs());\n            exit(EXIT_FAILURE);\n        }\n\n        cork_command_add_breadcrumb(subcommand);\n        command = subcommand;\n        argc--;\n        argv++;\n    }\n\n    cork_command_show_help(command, NULL);\n}\n\nstatic void\ncork_command_set_run(struct cork_command *command, int argc, char **argv)\n{\n    const char  *command_name;\n    struct cork_command  *subcommand;\n\n    if (argc == 0) {\n        printf(\"No command given.\\n\");\n        cork_command_set_show_help(command);\n        exit(EXIT_FAILURE);\n    }\n\n    command_name = argv[0];\n\n    /* The \"help\" command is special. */\n    if (streq(command_name, \"help\")) {\n        cork_command_set_run_help(command, argc, argv);\n        return;\n    }\n\n    /* Otherwise look for a real subcommand with this name. */\n    subcommand = cork_command_set_get_subcommand(command, command_name);\n    if (subcommand == NULL) {\n        printf(\"Unknown command \\\"%s\\\".\\n\"\n               \"Usage:%s <command> [<options>]\\n\",\n               command_name, cork_command_breadcrumbs());\n        exit(EXIT_FAILURE);\n    } else {\n        cork_command_run(subcommand, argc, argv);\n    }\n}\n\nstatic void\ncork_command_leaf_run(struct cork_command *command, int argc, char **argv)\n{\n    command->run(argc, argv);\n}\n\nstatic void\ncork_command_cleanup(void)\n{\n    cork_buffer_done(&breadcrumbs_buf);\n}\n\nstatic void\ncork_command_run(struct cork_command *command, int argc, char **argv)\n{\n    cork_command_add_breadcrumb(command);\n\n    /* If the gives the --help option at this point, describe the current\n     * command. */\n    if (argc >= 2 && (streq(argv[1], \"--help\") || streq(argv[1], \"-h\"))) {\n        cork_command_show_help(command, NULL);\n        return;\n    }\n\n    /* Otherwise let the command parse any options that occur here. */\n    if (command->parse_options != NULL) {\n        int  option_count = command->parse_options(argc, argv);\n        argc -= option_count;\n        argv += option_count;\n    } else {\n        argc--;\n        argv++;\n    }\n\n    switch (command->type) {\n        case CORK_COMMAND_SET:\n            cork_command_set_run(command, argc, argv);\n            return;\n\n        case CORK_LEAF_COMMAND:\n            cork_command_leaf_run(command, argc, argv);\n            return;\n\n        default:\n            cork_unreachable();\n    }\n}\n\n\nint\ncork_command_main(struct cork_command *root, int argc, char **argv)\n{\n    /* Clean up after ourselves when the command finishes. */\n    atexit(cork_command_cleanup);\n\n    /* Run the root command. */\n    cork_command_run(root, argc, argv);\n    return EXIT_SUCCESS;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/cmake/FindCTargets.cmake",
    "content": "# -*- coding: utf-8 -*-\n# ----------------------------------------------------------------------\n# Copyright © 2015, RedJack, LLC.\n# All rights reserved.\n#\n# Please see the COPYING file in this distribution for license details.\n# ----------------------------------------------------------------------\n\n\n#-----------------------------------------------------------------------\n# Library, with options to build both shared and static versions\n\nfunction(target_add_static_libraries TARGET_NAME LIBRARIES LOCAL_LIBRARIES)\n    foreach(lib ${LIBRARIES})\n        string(REPLACE \"-\" \"_\" lib ${lib})\n        string(TOUPPER ${lib} upperlib)\n        target_link_libraries(\n            ${TARGET_NAME}\n            ${${upperlib}_STATIC_LDFLAGS}\n        )\n    endforeach(lib)\n    foreach(lib ${LOCAL_LIBRARIES})\n        target_link_libraries(${TARGET_NAME} ${lib})\n    endforeach(lib)\nendfunction(target_add_static_libraries)\n\nset_property(GLOBAL PROPERTY ALL_LOCAL_LIBRARIES \"\")\n\nfunction(add_c_library __TARGET_NAME)\n    set(options)\n    set(one_args OUTPUT_NAME PKGCONFIG_NAME VERSION)\n    set(multi_args LIBRARIES LOCAL_LIBRARIES SOURCES)\n    cmake_parse_arguments(_ \"${options}\" \"${one_args}\" \"${multi_args}\" ${ARGN})\n\n    if (__VERSION MATCHES \"^([0-9]+)\\\\.([0-9]+)\\\\.([0-9]+)(-dev)?$\")\n        set(__VERSION_CURRENT  \"${CMAKE_MATCH_1}\")\n        set(__VERSION_REVISION \"${CMAKE_MATCH_2}\")\n        set(__VERSION_AGE      \"${CMAKE_MATCH_3}\")\n    else (__VERSION MATCHES \"^([0-9]+)\\\\.([0-9]+)\\\\.([0-9]+)(-dev)?$\")\n        message(FATAL_ERROR \"Invalid library version number: ${__VERSION}\")\n    endif (__VERSION MATCHES \"^([0-9]+)\\\\.([0-9]+)\\\\.([0-9]+)(-dev)?$\")\n\n    math(EXPR __SOVERSION \"${__VERSION_CURRENT} - ${__VERSION_AGE}\")\n\n    get_property(ALL_LOCAL_LIBRARIES GLOBAL PROPERTY ALL_LOCAL_LIBRARIES)\n    list(APPEND ALL_LOCAL_LIBRARIES ${__TARGET_NAME})\n    set_property(GLOBAL PROPERTY ALL_LOCAL_LIBRARIES \"${ALL_LOCAL_LIBRARIES}\")\n\n    include_directories(\n            ${PROJECT_SOURCE_DIR}/include\n            ${PROJECT_BINARY_DIR}/include\n    )\n    add_library(${__TARGET_NAME} STATIC ${__SOURCES})\n\n    set_target_properties(\n        ${__TARGET_NAME} PROPERTIES\n        OUTPUT_NAME ${__OUTPUT_NAME}\n        CLEAN_DIRECT_OUTPUT 1\n    )\n\n    target_include_directories(\n        ${__TARGET_NAME} PUBLIC\n        ${CMAKE_SOURCE_DIR}/include\n        ${CMAKE_BINARY_DIR}/include\n    )\n\n    target_add_static_libraries(\n        ${__TARGET_NAME}\n        \"${__LIBRARIES}\"\n        \"${__LOCAL_LIBRARIES}\"\n    )\nendfunction(add_c_library)\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/core/allocator.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <assert.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"libcork/core/allocator.h\"\n#include \"libcork/core/attributes.h\"\n#include \"libcork/core/error.h\"\n#include \"libcork/core/types.h\"\n#include \"libcork/os/process.h\"\n\n\n/*-----------------------------------------------------------------------\n * Allocator interface\n */\n\nstruct cork_alloc_priv {\n    struct cork_alloc  public;\n    struct cork_alloc_priv  *next;\n};\n\nstatic void *\ncork_alloc__default_calloc(const struct cork_alloc *alloc,\n                           size_t count, size_t size)\n{\n    void  *result = cork_alloc_xcalloc(alloc, count, size);\n    if (CORK_UNLIKELY(result == NULL)) {\n        abort();\n    }\n    return result;\n}\n\nstatic void *\ncork_alloc__default_malloc(const struct cork_alloc *alloc, size_t size)\n{\n    void  *result = cork_alloc_xmalloc(alloc, size);\n    if (CORK_UNLIKELY(result == NULL)) {\n        abort();\n    }\n    return result;\n}\n\nstatic void *\ncork_alloc__default_realloc(const struct cork_alloc *alloc, void *ptr,\n                            size_t old_size, size_t new_size)\n{\n    void  *result = cork_alloc_xrealloc(alloc, ptr, old_size, new_size);\n    if (CORK_UNLIKELY(result == NULL)) {\n        abort();\n    }\n    return result;\n}\n\nstatic void *\ncork_alloc__default_xcalloc(const struct cork_alloc *alloc,\n                            size_t count, size_t size)\n{\n    void  *result;\n    assert(count < (SIZE_MAX / size));\n    result = cork_alloc_xmalloc(alloc, count * size);\n    if (result != NULL) {\n        memset(result, 0, count * size);\n    }\n    return result;\n}\n\nstatic void *\ncork_alloc__default_xmalloc(const struct cork_alloc *alloc, size_t size)\n{\n    cork_abort(\"%s isn't defined\", \"cork_alloc:xmalloc\");\n}\n\nstatic void *\ncork_alloc__default_xrealloc(const struct cork_alloc *alloc, void *ptr,\n                             size_t old_size, size_t new_size)\n{\n    void  *result = cork_alloc_xmalloc(alloc, new_size);\n    if (CORK_LIKELY(result != NULL) && ptr != NULL) {\n        size_t  min_size = (new_size < old_size)? new_size: old_size;\n        memcpy(result, ptr, min_size);\n        cork_alloc_free(alloc, ptr, old_size);\n    }\n    return result;\n}\n\nstatic void\ncork_alloc__default_free(const struct cork_alloc *alloc, void *ptr, size_t size)\n{\n    cork_abort(\"%s isn't defined\", \"cork_alloc:free\");\n}\n\nstatic bool  cleanup_registered = false;\nstatic struct cork_alloc_priv  *all_allocs = NULL;\n\nstatic void\ncork_alloc_free_alloc(struct cork_alloc_priv *alloc)\n{\n    cork_free_user_data(&alloc->public);\n    cork_alloc_delete(alloc->public.parent, struct cork_alloc_priv, alloc);\n}\n\nstatic void\ncork_alloc_free_all(void)\n{\n    struct cork_alloc_priv  *curr;\n    struct cork_alloc_priv  *next;\n    for (curr = all_allocs; curr != NULL; curr = next) {\n        next = curr->next;\n        cork_alloc_free_alloc(curr);\n    }\n}\n\nstatic void\ncork_alloc_register_cleanup(void)\n{\n    if (CORK_UNLIKELY(!cleanup_registered)) {\n        /* We don't use cork_cleanup because that requires the allocators to\n         * have already been set up!  (atexit calls its functions in reverse\n         * order, and this one will be registered before cork_cleanup's, which\n         * makes it safe for cork_cleanup functions to still use the allocator,\n         * since the allocator atexit function will be called last.) */\n        atexit(cork_alloc_free_all);\n        cleanup_registered = true;\n    }\n}\n\nstruct cork_alloc *\ncork_alloc_new_alloc(const struct cork_alloc *parent)\n{\n    struct cork_alloc_priv  *alloc =\n        cork_alloc_new(parent, struct cork_alloc_priv);\n    alloc->public.parent = parent;\n    alloc->public.user_data = NULL;\n    alloc->public.free_user_data = NULL;\n    alloc->public.calloc = cork_alloc__default_calloc;\n    alloc->public.malloc = cork_alloc__default_malloc;\n    alloc->public.realloc = cork_alloc__default_realloc;\n    alloc->public.xcalloc = cork_alloc__default_xcalloc;\n    alloc->public.xmalloc = cork_alloc__default_xmalloc;\n    alloc->public.xrealloc = cork_alloc__default_xrealloc;\n    alloc->public.free = cork_alloc__default_free;\n\n    cork_alloc_register_cleanup();\n    alloc->next = all_allocs;\n    all_allocs = alloc;\n\n    return &alloc->public;\n}\n\n\nvoid\ncork_alloc_set_user_data(struct cork_alloc *alloc,\n                         void *user_data, cork_free_f free_user_data)\n{\n    cork_free_user_data(alloc);\n    alloc->user_data = user_data;\n    alloc->free_user_data = free_user_data;\n}\n\nvoid\ncork_alloc_set_calloc(struct cork_alloc *alloc, cork_alloc_calloc_f calloc)\n{\n    alloc->calloc = calloc;\n}\n\nvoid\ncork_alloc_set_malloc(struct cork_alloc *alloc, cork_alloc_malloc_f malloc)\n{\n    alloc->malloc = malloc;\n}\n\nvoid\ncork_alloc_set_realloc(struct cork_alloc *alloc, cork_alloc_realloc_f realloc)\n{\n    alloc->realloc = realloc;\n}\n\nvoid\ncork_alloc_set_xcalloc(struct cork_alloc *alloc, cork_alloc_calloc_f xcalloc)\n{\n    alloc->xcalloc = xcalloc;\n}\n\nvoid\ncork_alloc_set_xmalloc(struct cork_alloc *alloc, cork_alloc_malloc_f xmalloc)\n{\n    alloc->xmalloc = xmalloc;\n}\n\nvoid\ncork_alloc_set_xrealloc(struct cork_alloc *alloc,\n                        cork_alloc_realloc_f xrealloc)\n{\n    alloc->xrealloc = xrealloc;\n}\n\nvoid\ncork_alloc_set_free(struct cork_alloc *alloc, cork_alloc_free_f free)\n{\n    alloc->free = free;\n}\n\n\n/*-----------------------------------------------------------------------\n * Allocating strings\n */\n\nstatic inline const char *\nstrndup_internal(const struct cork_alloc *alloc,\n                 const char *str, size_t len)\n{\n    char  *dest;\n    size_t  allocated_size = len + sizeof(size_t) + 1;\n    size_t  *new_str = cork_alloc_malloc(alloc, allocated_size);\n    *new_str = allocated_size;\n    dest = (char *) (void *) (new_str + 1);\n    memcpy(dest, str, len);\n    dest[len] = '\\0';\n    return dest;\n}\n\nconst char *\ncork_alloc_strdup(const struct cork_alloc *alloc, const char *str)\n{\n    return strndup_internal(alloc, str, strlen(str));\n}\n\nconst char *\ncork_alloc_strndup(const struct cork_alloc *alloc,\n                   const char *str, size_t size)\n{\n    return strndup_internal(alloc, str, size);\n}\n\nstatic inline const char *\nxstrndup_internal(const struct cork_alloc *alloc,\n                  const char *str, size_t len)\n{\n    size_t  allocated_size = len + sizeof(size_t) + 1;\n    size_t  *new_str = cork_alloc_xmalloc(alloc, allocated_size);\n    if (CORK_UNLIKELY(new_str == NULL)) {\n        return NULL;\n    } else {\n        char  *dest;\n        *new_str = allocated_size;\n        dest = (char *) (void *) (new_str + 1);\n        memcpy(dest, str, len);\n        dest[len] = '\\0';\n        return dest;\n    }\n}\n\nconst char *\ncork_alloc_xstrdup(const struct cork_alloc *alloc, const char *str)\n{\n    return xstrndup_internal(alloc, str, strlen(str));\n}\n\nconst char *\ncork_alloc_xstrndup(const struct cork_alloc *alloc,\n                    const char *str, size_t size)\n{\n    return xstrndup_internal(alloc, str, size);\n}\n\nvoid\ncork_alloc_strfree(const struct cork_alloc *alloc, const char *str)\n{\n    size_t  *base = ((size_t *) str) - 1;\n    cork_alloc_free(alloc, base, *base);\n}\n\n\n/*-----------------------------------------------------------------------\n * stdlib allocator\n */\n\nstatic void *\ncork_stdlib_alloc__calloc(const struct cork_alloc *alloc,\n                          size_t count, size_t size)\n{\n    void  *result = calloc(count, size);\n    if (CORK_UNLIKELY(result == NULL)) {\n        abort();\n    }\n    return result;\n}\n\nstatic void *\ncork_stdlib_alloc__malloc(const struct cork_alloc *alloc, size_t size)\n{\n    void  *result = malloc(size);\n    if (CORK_UNLIKELY(result == NULL)) {\n        abort();\n    }\n    return result;\n}\n\nstatic void *\ncork_stdlib_alloc__realloc(const struct cork_alloc *alloc, void *ptr,\n                           size_t old_size, size_t new_size)\n{\n    /* Technically we don't really need to free `ptr` if the reallocation fails,\n     * since we'll abort the process immediately after.  But my sense of\n     * cleanliness makes me do it anyway. */\n\n#if CORK_HAVE_REALLOCF\n    void  *result = reallocf(ptr, new_size);\n    if (result == NULL) {\n        abort();\n    }\n    return result;\n#else\n    void  *result = realloc(ptr, new_size);\n    if (result == NULL) {\n        free(ptr);\n        abort();\n    }\n    return result;\n#endif\n}\n\nstatic void *\ncork_stdlib_alloc__xcalloc(const struct cork_alloc *alloc,\n                           size_t count, size_t size)\n{\n    return calloc(count, size);\n}\n\nstatic void *\ncork_stdlib_alloc__xmalloc(const struct cork_alloc *alloc, size_t size)\n{\n    return malloc(size);\n}\n\nstatic void *\ncork_stdlib_alloc__xrealloc(const struct cork_alloc *alloc, void *ptr,\n                            size_t old_size, size_t new_size)\n{\n    return realloc(ptr, new_size);\n}\n\nstatic void\ncork_stdlib_alloc__free(const struct cork_alloc *alloc, void *ptr, size_t size)\n{\n    free(ptr);\n}\n\n\nstatic const struct cork_alloc  default_allocator = {\n    NULL,\n    NULL,\n    NULL,\n    cork_stdlib_alloc__calloc,\n    cork_stdlib_alloc__malloc,\n    cork_stdlib_alloc__realloc,\n    cork_stdlib_alloc__xcalloc,\n    cork_stdlib_alloc__xmalloc,\n    cork_stdlib_alloc__xrealloc,\n    cork_stdlib_alloc__free\n};\n\n\n/*-----------------------------------------------------------------------\n * Customizing libcork's allocator\n */\n\nconst struct cork_alloc  *cork_allocator = &default_allocator;\n\nvoid\ncork_set_allocator(const struct cork_alloc *alloc)\n{\n    cork_allocator = alloc;\n}\n\n\n/*-----------------------------------------------------------------------\n * Debugging allocator\n */\n\nstatic void *\ncork_debug_alloc__xmalloc(const struct cork_alloc *alloc, size_t size)\n{\n    size_t  real_size = size + sizeof(size_t);\n    size_t  *base = cork_alloc_xmalloc(alloc->parent, real_size);\n    *base = size;\n    return base + 1;\n}\n\nstatic void\ncork_debug_alloc__free(const struct cork_alloc *alloc, void *ptr,\n                       size_t expected_size)\n{\n    size_t  *base = ((size_t *) ptr) - 1;\n    size_t  actual_size = *base;\n    size_t  real_size = actual_size + sizeof(size_t);\n    if (CORK_UNLIKELY(actual_size != expected_size)) {\n        cork_abort\n            (\"Incorrect size when freeing pointer (got %zu, expected %zu)\",\n             expected_size, actual_size);\n    }\n    cork_alloc_free(alloc->parent, base, real_size);\n}\n\nstruct cork_alloc *\ncork_debug_alloc_new(const struct cork_alloc *parent)\n{\n    struct cork_alloc  *debug = cork_alloc_new_alloc(parent);\n    cork_alloc_set_xmalloc(debug, cork_debug_alloc__xmalloc);\n    cork_alloc_set_free(debug, cork_debug_alloc__free);\n    return debug;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/core/error.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <assert.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <string.h>\n\n#include \"libcork/config.h\"\n#include \"libcork/core/allocator.h\"\n#include \"libcork/core/error.h\"\n#include \"libcork/ds/buffer.h\"\n#include \"libcork/os/process.h\"\n#include \"libcork/threads/basics.h\"\n\n\n/*-----------------------------------------------------------------------\n * Life cycle\n */\n\nstruct cork_error {\n    cork_error  code;\n    struct cork_buffer  *message;\n    struct cork_buffer  *other;\n    struct cork_buffer  buf1;\n    struct cork_buffer  buf2;\n    struct cork_error  *next;\n};\n\nstatic struct cork_error *\ncork_error_new(void)\n{\n    struct cork_error  *error = cork_new(struct cork_error);\n    error->code = CORK_ERROR_NONE;\n    cork_buffer_init(&error->buf1);\n    cork_buffer_init(&error->buf2);\n    error->message = &error->buf1;\n    error->other = &error->buf2;\n    return error;\n}\n\nstatic void\ncork_error_free(struct cork_error *error)\n{\n    cork_buffer_done(&error->buf1);\n    cork_buffer_done(&error->buf2);\n    cork_delete(struct cork_error, error);\n}\n\n\nstatic struct cork_error * volatile  errors;\n\ncork_once_barrier(cork_error_list);\n\nstatic void\ncork_error_list_done(void)\n{\n    struct cork_error  *curr;\n    struct cork_error  *next;\n    for (curr = errors; curr != NULL; curr = next) {\n        next = curr->next;\n        cork_error_free(curr);\n    }\n}\n\nstatic void\ncork_error_list_init(void)\n{\n    cork_cleanup_at_exit(0, cork_error_list_done);\n}\n\n\ncork_tls(struct cork_error *, cork_error_);\n\nstatic struct cork_error *\ncork_error_get(void)\n{\n    struct cork_error  **error_ptr = cork_error__get();\n    if (CORK_UNLIKELY(*error_ptr == NULL)) {\n        struct cork_error  *old_head;\n        struct cork_error  *error = cork_error_new();\n        cork_once(cork_error_list, cork_error_list_init());\n        do {\n            old_head = errors;\n            error->next = old_head;\n        } while (cork_ptr_cas(&errors, old_head, error) != old_head);\n        *error_ptr = error;\n        return error;\n    } else {\n        return *error_ptr;\n    }\n}\n\n\n/*-----------------------------------------------------------------------\n * Public error API\n */\n\nbool\ncork_error_occurred(void)\n{\n    struct cork_error  *error = cork_error_get();\n    return error->code != CORK_ERROR_NONE;\n}\n\ncork_error\ncork_error_code(void)\n{\n    struct cork_error  *error = cork_error_get();\n    return error->code;\n}\n\nconst char *\ncork_error_message(void)\n{\n    struct cork_error  *error = cork_error_get();\n    return error->message->buf;\n}\n\nvoid\ncork_error_clear(void)\n{\n    struct cork_error  *error = cork_error_get();\n    error->code = CORK_ERROR_NONE;\n    cork_buffer_clear(error->message);\n}\n\nvoid\ncork_error_set_printf(cork_error code, const char *format, ...)\n{\n    va_list  args;\n    struct cork_error  *error = cork_error_get();\n    error->code = code;\n    va_start(args, format);\n    cork_buffer_vprintf(error->message, format, args);\n    va_end(args);\n}\n\nvoid\ncork_error_set_string(cork_error code, const char *str)\n{\n    struct cork_error  *error = cork_error_get();\n    error->code = code;\n    cork_buffer_set_string(error->message, str);\n}\n\nvoid\ncork_error_set_vprintf(cork_error code, const char *format, va_list args)\n{\n    struct cork_error  *error = cork_error_get();\n    error->code = code;\n    cork_buffer_vprintf(error->message, format, args);\n}\n\nvoid\ncork_error_prefix_printf(const char *format, ...)\n{\n    va_list  args;\n    struct cork_error  *error = cork_error_get();\n    struct cork_buffer  *temp;\n    va_start(args, format);\n    cork_buffer_vprintf(error->other, format, args);\n    va_end(args);\n    cork_buffer_append_copy(error->other, error->message);\n    temp = error->other;\n    error->other = error->message;\n    error->message = temp;\n}\n\nvoid\ncork_error_prefix_string(const char *str)\n{\n    struct cork_error  *error = cork_error_get();\n    struct cork_buffer  *temp;\n    cork_buffer_set_string(error->other, str);\n    cork_buffer_append_copy(error->other, error->message);\n    temp = error->other;\n    error->other = error->message;\n    error->message = temp;\n}\n\nvoid\ncork_error_prefix_vprintf(const char *format, va_list args)\n{\n    struct cork_error  *error = cork_error_get();\n    struct cork_buffer  *temp;\n    cork_buffer_vprintf(error->other, format, args);\n    cork_buffer_append_copy(error->other, error->message);\n    temp = error->other;\n    error->other = error->message;\n    error->message = temp;\n}\n\n\n/*-----------------------------------------------------------------------\n * Deprecated\n */\n\nvoid\ncork_error_set(uint32_t error_class, unsigned int error_code,\n               const char *format, ...)\n{\n    /* Create a fallback error code that's most likely not very useful. */\n    va_list  args;\n    va_start(args, format);\n    cork_error_set_vprintf(error_class + error_code, format, args);\n    va_end(args);\n}\n\nvoid\ncork_error_prefix(const char *format, ...)\n{\n    va_list  args;\n    va_start(args, format);\n    cork_error_prefix_vprintf(format, args);\n    va_end(args);\n}\n\n\n/*-----------------------------------------------------------------------\n * Built-in errors\n */\n\nvoid\ncork_system_error_set_explicit(int err)\n{\n    cork_error_set_string(err, strerror(err));\n}\n\nvoid\ncork_system_error_set(void)\n{\n    cork_error_set_string(errno, strerror(errno));\n}\n\nvoid\ncork_unknown_error_set_(const char *location)\n{\n    cork_error_set_printf(CORK_UNKNOWN_ERROR, \"Unknown error in %s\", location);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/core/gc.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <stdlib.h>\n\n#include \"libcork/config/config.h\"\n#include \"libcork/core/allocator.h\"\n#include \"libcork/core/gc.h\"\n#include \"libcork/core/types.h\"\n#include \"libcork/ds/dllist.h\"\n#include \"libcork/threads/basics.h\"\n\n\n#if !defined(CORK_DEBUG_GC)\n#define CORK_DEBUG_GC  0\n#endif\n\n#if CORK_DEBUG_GC\n#include <stdio.h>\n#define DEBUG(...) fprintf(stderr, __VA_ARGS__)\n#else\n#define DEBUG(...) /* no debug messages */\n#endif\n\n\n/*-----------------------------------------------------------------------\n * GC context life cycle\n */\n\n#define ROOTS_SIZE  1024\n\n/* An internal structure allocated with every garbage-collected object. */\nstruct cork_gc_header;\n\n/* A garbage collector context. */\nstruct cork_gc {\n    /* The number of used entries in roots. */\n    size_t  root_count;\n    /* The possible roots of garbage cycles */\n    struct cork_gc_header  *roots[ROOTS_SIZE];\n};\n\ncork_tls(struct cork_gc, cork_gc);\n\nstatic void\ncork_gc_collect_cycles(struct cork_gc *gc);\n\n\n/*-----------------------------------------------------------------------\n * Garbage collection functions\n */\n\nstruct cork_gc_header {\n    /* The current reference count for this object, along with its color\n     * during the mark/sweep process. */\n    volatile int  ref_count_color;\n\n    /* The allocated size of this garbage-collected object (including\n     * the header). */\n    size_t  allocated_size;\n\n    /* The garbage collection interface for this object. */\n    struct cork_gc_obj_iface  *iface;\n};\n\n/*\n * Structure of ref_count_color:\n *\n *   +-----+---+---+---+---+---+\n *   | ... | 4 | 3 | 2 | 1 | 0 |\n *   +-----+---+---+---+---+---+\n *      ref_count    |   color\n *                   |\n *        buffered --/\n */\n\n#define cork_gc_ref_count_color(count, buffered, color) \\\n    (((count) << 3) | ((buffered) << 2) | (color))\n\n#define cork_gc_get_ref_count(hdr) \\\n    ((hdr)->ref_count_color >> 3)\n\n#define cork_gc_inc_ref_count(hdr) \\\n    do { \\\n        (hdr)->ref_count_color += (1 << 3); \\\n    } while (0)\n\n#define cork_gc_dec_ref_count(hdr) \\\n    do { \\\n        (hdr)->ref_count_color -= (1 << 3); \\\n    } while (0)\n\n#define cork_gc_get_color(hdr) \\\n    ((hdr)->ref_count_color & 0x3)\n\n#define cork_gc_set_color(hdr, color) \\\n    do { \\\n        (hdr)->ref_count_color = \\\n            ((hdr)->ref_count_color & ~0x3) | (color & 0x3); \\\n    } while (0)\n\n#define cork_gc_get_buffered(hdr) \\\n    (((hdr)->ref_count_color & 0x4) != 0)\n\n#define cork_gc_set_buffered(hdr, buffered) \\\n    do { \\\n        (hdr)->ref_count_color = \\\n            ((hdr)->ref_count_color & ~0x4) | (((buffered) & 1) << 2); \\\n    } while (0)\n\n#define cork_gc_free(hdr) \\\n    do { \\\n        if ((hdr)->iface->free != NULL) { \\\n            (hdr)->iface->free(cork_gc_get_object((hdr))); \\\n        } \\\n        cork_free((hdr), (hdr)->allocated_size); \\\n    } while (0)\n\n#define cork_gc_recurse(gc, hdr, recurser) \\\n    do { \\\n        if ((hdr)->iface->recurse != NULL) { \\\n            (hdr)->iface->recurse \\\n                ((gc), cork_gc_get_object((hdr)), (recurser), NULL); \\\n        } \\\n    } while (0)\n\nenum cork_gc_color {\n    /* In use or free */\n    GC_BLACK = 0,\n    /* Possible member of garbage cycle */\n    GC_GRAY = 1,\n    /* Member of garbage cycle */\n    GC_WHITE = 2,\n    /* Possible root of garbage cycle */\n    GC_PURPLE = 3\n};\n\n#define cork_gc_get_header(obj) \\\n    (((struct cork_gc_header *) (obj)) - 1)\n\n#define cork_gc_get_object(hdr) \\\n    ((void *) (((struct cork_gc_header *) (hdr)) + 1))\n\n\nvoid\ncork_gc_init(void)\n{\n    cork_gc_get();\n}\n\nvoid\ncork_gc_done(void)\n{\n    cork_gc_collect_cycles(cork_gc_get());\n}\n\nvoid *\ncork_gc_alloc(size_t instance_size, struct cork_gc_obj_iface *iface)\n{\n    size_t  full_size = instance_size + sizeof(struct cork_gc_header);\n    DEBUG(\"Allocating %zu (%zu) bytes\\n\", instance_size, full_size);\n    struct cork_gc_header  *header = cork_malloc(full_size);\n    DEBUG(\"  Result is %p[%p]\\n\", cork_gc_get_object(header), header);\n    header->ref_count_color = cork_gc_ref_count_color(1, false, GC_BLACK);\n    header->allocated_size = full_size;\n    header->iface = iface;\n    return cork_gc_get_object(header);\n}\n\nvoid *\ncork_gc_incref(void *obj)\n{\n    if (obj != NULL) {\n        struct cork_gc_header  *header = cork_gc_get_header(obj);\n        cork_gc_inc_ref_count(header);\n        DEBUG(\"Incrementing %p -> %d\\n\",\n              obj, cork_gc_get_ref_count(header));\n        cork_gc_set_color(header, GC_BLACK);\n    }\n    return obj;\n}\n\nstatic void\ncork_gc_decref_step(struct cork_gc *gc, void *obj, void *ud);\n\nstatic void\ncork_gc_release(struct cork_gc *gc, struct cork_gc_header *header)\n{\n    cork_gc_recurse(gc, header, cork_gc_decref_step);\n    cork_gc_set_color(header, GC_BLACK);\n    if (!cork_gc_get_buffered(header)) {\n        cork_gc_free(header);\n    }\n}\n\nstatic void\ncork_gc_possible_root(struct cork_gc *gc, struct cork_gc_header *header)\n{\n    if (cork_gc_get_color(header) != GC_PURPLE) {\n        DEBUG(\"  Possible garbage cycle root\\n\");\n        cork_gc_set_color(header, GC_PURPLE);\n        if (!cork_gc_get_buffered(header)) {\n            cork_gc_set_buffered(header, true);\n            if (gc->root_count >= ROOTS_SIZE) {\n                cork_gc_collect_cycles(gc);\n            }\n            gc->roots[gc->root_count++] = header;\n        }\n    } else {\n        DEBUG(\"  Already marked as possible garbage cycle root\\n\");\n    }\n}\n\nstatic void\ncork_gc_decref_step(struct cork_gc *gc, void *obj, void *ud)\n{\n    if (obj != NULL) {\n        struct cork_gc_header  *header = cork_gc_get_header(obj);\n        cork_gc_dec_ref_count(header);\n        DEBUG(\"Decrementing %p -> %d\\n\",\n              obj, cork_gc_get_ref_count(header));\n        if (cork_gc_get_ref_count(header) == 0) {\n            DEBUG(\"  Releasing %p\\n\", header);\n            cork_gc_release(gc, header);\n        } else {\n            cork_gc_possible_root(gc, header);\n        }\n    }\n}\n\nvoid\ncork_gc_decref(void *obj)\n{\n    if (obj != NULL) {\n        struct cork_gc  *gc = cork_gc_get();\n        struct cork_gc_header  *header = cork_gc_get_header(obj);\n        cork_gc_dec_ref_count(header);\n        DEBUG(\"Decrementing %p -> %d\\n\",\n              obj, cork_gc_get_ref_count(header));\n        if (cork_gc_get_ref_count(header) == 0) {\n            DEBUG(\"  Releasing %p\\n\", header);\n            cork_gc_release(gc, header);\n        } else {\n            cork_gc_possible_root(gc, header);\n        }\n    }\n}\n\n\nstatic void\ncork_gc_mark_gray_step(struct cork_gc *gc, void *obj, void *ud);\n\nstatic void\ncork_gc_mark_gray(struct cork_gc *gc, struct cork_gc_header *header)\n{\n    if (cork_gc_get_color(header) != GC_GRAY) {\n        DEBUG(\"      Setting color to gray\\n\");\n        cork_gc_set_color(header, GC_GRAY);\n        cork_gc_recurse(gc, header, cork_gc_mark_gray_step);\n    }\n}\n\nstatic void\ncork_gc_mark_gray_step(struct cork_gc *gc, void *obj, void *ud)\n{\n    if (obj != NULL) {\n        DEBUG(\"    cork_gc_mark_gray(%p)\\n\", obj);\n        struct cork_gc_header  *header = cork_gc_get_header(obj);\n        cork_gc_dec_ref_count(header);\n        DEBUG(\"      Reference count now %d\\n\", cork_gc_get_ref_count(header));\n        cork_gc_mark_gray(gc, header);\n    }\n}\n\nstatic void\ncork_gc_mark_roots(struct cork_gc *gc)\n{\n    size_t  i;\n    for (i = 0; i < gc->root_count; i++) {\n        struct cork_gc_header  *header = gc->roots[i];\n        if (cork_gc_get_color(header) == GC_PURPLE) {\n            DEBUG(\"  Checking possible garbage cycle root %p\\n\",\n                  cork_gc_get_object(header));\n            DEBUG(\"    cork_gc_mark_gray(%p)\\n\",\n                  cork_gc_get_object(header));\n            cork_gc_mark_gray(gc, header);\n        } else {\n            DEBUG(\"  Possible garbage cycle root %p already checked\\n\",\n                  cork_gc_get_object(header));\n            cork_gc_set_buffered(header, false);\n            gc->roots[i] = NULL;\n            if (cork_gc_get_color(header) == GC_BLACK &&\n                cork_gc_get_ref_count(header) == 0) {\n                DEBUG(\"  Freeing %p\\n\", header);\n                cork_gc_free(header);\n            }\n        }\n    }\n}\n\nstatic void\ncork_gc_scan_black_step(struct cork_gc *gc, void *obj, void *ud);\n\nstatic void\ncork_gc_scan_black(struct cork_gc *gc, struct cork_gc_header *header)\n{\n    DEBUG(\"      Setting color of %p to BLACK\\n\",\n          cork_gc_get_object(header));\n    cork_gc_set_color(header, GC_BLACK);\n    cork_gc_recurse(gc, header, cork_gc_scan_black_step);\n}\n\nstatic void\ncork_gc_scan_black_step(struct cork_gc *gc, void *obj, void *ud)\n{\n    if (obj != NULL) {\n        struct cork_gc_header  *header = cork_gc_get_header(obj);\n        cork_gc_inc_ref_count(header);\n        DEBUG(\"      Increasing reference count %p -> %d\\n\",\n              obj, cork_gc_get_ref_count(header));\n        if (cork_gc_get_color(header) != GC_BLACK) {\n            cork_gc_scan_black(gc, header);\n        }\n    }\n}\n\nstatic void\ncork_gc_scan(struct cork_gc *gc, void *obj, void *ud)\n{\n    if (obj != NULL) {\n        DEBUG(\"  Scanning possible garbage cycle entry %p\\n\", obj);\n        struct cork_gc_header  *header = cork_gc_get_header(obj);\n        if (cork_gc_get_color(header) == GC_GRAY) {\n            if (cork_gc_get_ref_count(header) > 0) {\n                DEBUG(\"    Remaining references; can't be a cycle\\n\");\n                cork_gc_scan_black(gc, header);\n            } else {\n                DEBUG(\"    Definitely a garbage cycle\\n\");\n                cork_gc_set_color(header, GC_WHITE);\n                cork_gc_recurse(gc, header, cork_gc_scan);\n            }\n        } else {\n            DEBUG(\"    Already checked\\n\");\n        }\n    }\n}\n\nstatic void\ncork_gc_scan_roots(struct cork_gc *gc)\n{\n    size_t  i;\n    for (i = 0; i < gc->root_count; i++) {\n        if (gc->roots[i] != NULL) {\n            void  *obj = cork_gc_get_object(gc->roots[i]);\n            cork_gc_scan(gc, obj, NULL);\n        }\n    }\n}\n\nstatic void\ncork_gc_collect_white(struct cork_gc *gc, void *obj, void *ud)\n{\n    if (obj != NULL) {\n        struct cork_gc_header  *header = cork_gc_get_header(obj);\n        if (cork_gc_get_color(header) == GC_WHITE &&\n            !cork_gc_get_buffered(header)) {\n            DEBUG(\"  Releasing %p\\n\", obj);\n            cork_gc_set_color(header, GC_BLACK);\n            cork_gc_recurse(gc, header, cork_gc_collect_white);\n            DEBUG(\"  Freeing %p\\n\", header);\n            cork_gc_free(header);\n        }\n    }\n}\n\nstatic void\ncork_gc_collect_roots(struct cork_gc *gc)\n{\n    size_t  i;\n    for (i = 0; i < gc->root_count; i++) {\n        if (gc->roots[i] != NULL) {\n            struct cork_gc_header  *header = gc->roots[i];\n            void  *obj = cork_gc_get_object(header);\n            cork_gc_set_buffered(header, false);\n            DEBUG(\"Collecting cycles from garbage root %p\\n\", obj);\n            cork_gc_collect_white(gc, obj, NULL);\n            gc->roots[i] = NULL;\n        }\n    }\n    gc->root_count = 0;\n}\n\nstatic void\ncork_gc_collect_cycles(struct cork_gc *gc)\n{\n    DEBUG(\"Collecting garbage cycles\\n\");\n    cork_gc_mark_roots(gc);\n    cork_gc_scan_roots(gc);\n    cork_gc_collect_roots(gc);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/core/hash.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#define CORK_HASH_ATTRIBUTES  CORK_API\n\n#include \"libcork/core/hash.h\"\n#include \"libcork/core/types.h\"\n\n/* All of the following functions will be defined for us by libcork/core/hash.h:\n *   cork_hash_buffer\n *   cork_big_hash_buffer\n *   cork_stable_hash_buffer\n */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/core/ip-address.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <stdio.h>\n#include <string.h>\n\n#include \"libcork/core/byte-order.h\"\n#include \"libcork/core/error.h\"\n#include \"libcork/core/net-addresses.h\"\n#include \"libcork/core/types.h\"\n\n#ifndef CORK_IP_ADDRESS_DEBUG\n#define CORK_IP_ADDRESS_DEBUG 0\n#endif\n\n#if CORK_IP_ADDRESS_DEBUG\n#include <stdio.h>\n#define DEBUG(...) \\\n    do { \\\n        fprintf(stderr, __VA_ARGS__); \\\n    } while (0)\n#else\n#define DEBUG(...) /* nothing */\n#endif\n\n\n/*-----------------------------------------------------------------------\n * IP addresses\n */\n\n/*** IPv4 ***/\n\nstatic inline const char *\ncork_ipv4_parse(struct cork_ipv4 *addr, const char *str)\n{\n    const char  *ch;\n    bool  seen_digit_in_octet = false;\n    unsigned int  octets = 0;\n    unsigned int  digit = 0;\n    uint8_t  result[4];\n\n    for (ch = str; *ch != '\\0'; ch++) {\n        DEBUG(\"%2u: %c\\t\", (unsigned int) (ch-str), *ch);\n        switch (*ch) {\n            case '0': case '1': case '2': case '3': case '4':\n            case '5': case '6': case '7': case '8': case '9':\n                seen_digit_in_octet = true;\n                digit *= 10;\n                digit += (*ch - '0');\n                DEBUG(\"digit = %u\\n\", digit);\n                if (CORK_UNLIKELY(digit > 255)) {\n                    DEBUG(\"\\t\");\n                    goto parse_error;\n                }\n                break;\n\n            case '.':\n                /* If this would be the fourth octet, it can't have a trailing\n                 * period. */\n                if (CORK_UNLIKELY(octets == 3)) {\n                    goto parse_error;\n                }\n                DEBUG(\"octet %u = %u\\n\", octets, digit);\n                result[octets] = digit;\n                digit = 0;\n                octets++;\n                seen_digit_in_octet = false;\n                break;\n\n            default:\n                /* Any other character is a parse error. */\n                goto parse_error;\n        }\n    }\n\n    /* If we have a valid octet at the end, and that would be the fourth octet,\n     * then we've got a valid final parse. */\n    DEBUG(\"%2u:\\t\", (unsigned int) (ch-str));\n    if (CORK_LIKELY(seen_digit_in_octet && octets == 3)) {\n#if CORK_IP_ADDRESS_DEBUG\n        char  parsed_ipv4[CORK_IPV4_STRING_LENGTH];\n#endif\n        DEBUG(\"octet %u = %u\\n\", octets, digit);\n        result[octets] = digit;\n        cork_ipv4_copy(addr, result);\n#if CORK_IP_ADDRESS_DEBUG\n        cork_ipv4_to_raw_string(addr, parsed_ipv4);\n        DEBUG(\"\\tParsed address: %s\\n\", parsed_ipv4);\n#endif\n        return ch;\n    }\n\nparse_error:\n    DEBUG(\"parse error\\n\");\n    cork_parse_error(\"Invalid IPv4 address: \\\"%s\\\"\", str);\n    return NULL;\n}\n\nint\ncork_ipv4_init(struct cork_ipv4 *addr, const char *str)\n{\n    return cork_ipv4_parse(addr, str) == NULL? -1: 0;\n}\n\nbool\ncork_ipv4_equal_(const struct cork_ipv4 *addr1, const struct cork_ipv4 *addr2)\n{\n    return cork_ipv4_equal(addr1, addr2);\n}\n\nvoid\ncork_ipv4_to_raw_string(const struct cork_ipv4 *addr, char *dest)\n{\n    snprintf(dest, CORK_IPV4_STRING_LENGTH, \"%u.%u.%u.%u\",\n             addr->_.u8[0], addr->_.u8[1], addr->_.u8[2], addr->_.u8[3]);\n}\n\nbool\ncork_ipv4_is_valid_network(const struct cork_ipv4 *addr,\n                           unsigned int cidr_prefix)\n{\n    uint32_t  cidr_mask;\n\n    if (cidr_prefix > 32) {\n        return false;\n    } else if (cidr_prefix == 32) {\n        /* This handles undefined behavior for overflow bit shifts. */\n        cidr_mask = 0;\n    } else {\n        cidr_mask = 0xffffffff >> cidr_prefix;\n    }\n\n    return (CORK_UINT32_BIG_TO_HOST(addr->_.u32) & cidr_mask) == 0;\n}\n\n/*** IPv6 ***/\n\nint\ncork_ipv6_init(struct cork_ipv6 *addr, const char *str)\n{\n    const char  *ch;\n\n    uint16_t  digit = 0;\n    unsigned int  before_count = 0;\n    uint16_t  before_double_colon[8];\n    uint16_t  after_double_colon[8];\n    uint16_t  *dest = before_double_colon;\n\n    unsigned int  digits_seen = 0;\n    unsigned int  hextets_seen = 0;\n    bool  another_required = true;\n    bool  digit_allowed = true;\n    bool  colon_allowed = true;\n    bool  double_colon_allowed = true;\n    bool  just_saw_colon = false;\n\n    for (ch = str; *ch != '\\0'; ch++) {\n        DEBUG(\"%2u: %c\\t\", (unsigned int) (ch-str), *ch);\n        switch (*ch) {\n#define process_digit(base) \\\n                /* Make sure a digit is allowed here. */ \\\n                if (CORK_UNLIKELY(!digit_allowed)) { \\\n                    goto parse_error; \\\n                } \\\n                /* If we've already seen 4 digits, it's a parse error. */ \\\n                if (CORK_UNLIKELY(digits_seen == 4)) { \\\n                    goto parse_error; \\\n                } \\\n                \\\n                digits_seen++; \\\n                colon_allowed = true; \\\n                just_saw_colon = false; \\\n                digit <<= 4; \\\n                digit |= (*ch - (base)); \\\n                DEBUG(\"digit = %04x\\n\", digit);\n\n            case '0': case '1': case '2': case '3': case '4':\n            case '5': case '6': case '7': case '8': case '9':\n                process_digit('0');\n                break;\n\n            case 'a': case 'b': case 'c': case 'd': case 'e': case 'f':\n                process_digit('a'-10);\n                break;\n\n            case 'A': case 'B': case 'C': case 'D': case 'E': case 'F':\n                process_digit('A'-10);\n                break;\n\n#undef process_digit\n\n            case ':':\n                /* We can only see a colon immediately after a hextet or as part\n                 * of a double-colon. */\n                if (CORK_UNLIKELY(!colon_allowed)) {\n                    goto parse_error;\n                }\n\n                /* If this is a double-colon, start parsing hextets into our\n                 * second array. */\n                if (just_saw_colon) {\n                    DEBUG(\"double-colon\\n\");\n                    colon_allowed = false;\n                    digit_allowed = true;\n                    another_required = false;\n                    double_colon_allowed = false;\n                    before_count = hextets_seen;\n                    dest = after_double_colon;\n                    continue;\n                }\n\n                /* If this would end the eighth hextet (regardless of the\n                 * placement of a double-colon), then there can't be a trailing\n                 * colon. */\n                if (CORK_UNLIKELY(hextets_seen == 8)) {\n                    goto parse_error;\n                }\n\n                /* If this is the very beginning of the string, then we can only\n                 * have a double-colon, not a single colon. */\n                if (digits_seen == 0 && hextets_seen == 0) {\n                    DEBUG(\"initial colon\\n\");\n                    colon_allowed = true;\n                    digit_allowed = false;\n                    just_saw_colon = true;\n                    another_required = true;\n                    continue;\n                }\n\n                /* Otherwise this ends the current hextet. */\n                DEBUG(\"hextet %u = %04x\\n\", hextets_seen, digit);\n                *(dest++) = CORK_UINT16_HOST_TO_BIG(digit);\n                digit = 0;\n                hextets_seen++;\n                digits_seen = 0;\n                colon_allowed = double_colon_allowed;\n                just_saw_colon = true;\n                another_required = true;\n                break;\n\n            case '.':\n            {\n                /* If we see a period, then we must be in the middle of an IPv4\n                 * address at the end of the IPv6 address. */\n                struct cork_ipv4  *ipv4 = (struct cork_ipv4 *) dest;\n                DEBUG(\"Detected IPv4 address %s\\n\", ch-digits_seen);\n\n                /* Ensure that we have space for the two hextets that the IPv4\n                 * address will take up. */\n                if (CORK_UNLIKELY(hextets_seen >= 7)) {\n                    goto parse_error;\n                }\n\n                /* Parse the IPv4 address directly into our current hextet\n                 * buffer. */\n                ch = cork_ipv4_parse(ipv4, ch - digits_seen);\n                if (CORK_LIKELY(ch != NULL)) {\n                    hextets_seen += 2;\n                    digits_seen = 0;\n                    another_required = false;\n\n                    /* ch now points at the NUL terminator, but we're about to\n                     * increment ch. */\n                    ch--;\n                    break;\n                }\n\n                /* The IPv4 parse failed, so we have an IPv6 parse error. */\n                goto parse_error;\n            }\n\n            default:\n                /* Any other character is a parse error. */\n                goto parse_error;\n        }\n    }\n\n    /* If we have a valid hextet at the end, and we've either seen a\n     * double-colon, or we have eight hextets in total, then we've got a valid\n     * final parse. */\n    DEBUG(\"%2u:\\t\", (unsigned int) (ch-str));\n    if (CORK_LIKELY(digits_seen > 0)) {\n        /* If there are trailing digits that would form a ninth hextet\n         * (regardless of the placement of a double-colon), then we have a parse\n         * error. */\n        if (CORK_UNLIKELY(hextets_seen == 8)) {\n            goto parse_error;\n        }\n\n        DEBUG(\"hextet %u = %04x\\n\\t\", hextets_seen, digit);\n        *(dest++) = CORK_UINT16_HOST_TO_BIG(digit);\n        hextets_seen++;\n    } else if (CORK_UNLIKELY(another_required)) {\n        goto parse_error;\n    }\n\n    if (!double_colon_allowed) {\n        /* We've seen a double-colon, so use 0000 for any hextets that weren't\n         * present. */\n#if CORK_IP_ADDRESS_DEBUG\n        char  parsed_result[CORK_IPV6_STRING_LENGTH];\n#endif\n        unsigned int  after_count = hextets_seen - before_count;\n        DEBUG(\"Saw double-colon; %u hextets before, %u after\\n\",\n              before_count, after_count);\n        memset(addr, 0, sizeof(struct cork_ipv6));\n        memcpy(addr, before_double_colon,\n               sizeof(uint16_t) * before_count);\n        memcpy(&addr->_.u16[8-after_count], after_double_colon,\n               sizeof(uint16_t) * after_count);\n#if CORK_IP_ADDRESS_DEBUG\n        cork_ipv6_to_raw_string(addr, parsed_result);\n        DEBUG(\"\\tParsed address: %s\\n\", parsed_result);\n#endif\n        return 0;\n    } else if (hextets_seen == 8) {\n        /* No double-colon, so we must have exactly eight hextets. */\n#if CORK_IP_ADDRESS_DEBUG\n        char  parsed_result[CORK_IPV6_STRING_LENGTH];\n#endif\n        DEBUG(\"No double-colon\\n\");\n        cork_ipv6_copy(addr, before_double_colon);\n#if CORK_IP_ADDRESS_DEBUG\n        cork_ipv6_to_raw_string(addr, parsed_result);\n        DEBUG(\"\\tParsed address: %s\\n\", parsed_result);\n#endif\n        return 0;\n    }\n\nparse_error:\n    DEBUG(\"parse error\\n\");\n    cork_parse_error(\"Invalid IPv6 address: \\\"%s\\\"\", str);\n    return -1;\n}\n\nbool\ncork_ipv6_equal_(const struct cork_ipv6 *addr1, const struct cork_ipv6 *addr2)\n{\n    return cork_ipv6_equal(addr1, addr2);\n}\n\n#define NS_IN6ADDRSZ 16\n#define NS_INT16SZ 2\n\nvoid\ncork_ipv6_to_raw_string(const struct cork_ipv6 *addr, char *dest)\n{\n    const uint8_t  *src = addr->_.u8;\n\n    /*\n     * Note that int32_t and int16_t need only be \"at least\" large enough\n     * to contain a value of the specified size.  On some systems, like\n     * Crays, there is no such thing as an integer variable with 16 bits.\n     * Keep this in mind if you think this function should have been coded\n     * to use pointer overlays.  All the world's not a VAX.\n     */\n    char *tp;\n    struct { int base, len; } best, cur;\n    unsigned int words[NS_IN6ADDRSZ / NS_INT16SZ];\n    int i;\n\n    /*\n     * Preprocess:\n     *      Copy the input (bytewise) array into a wordwise array.\n     *      Find the longest run of 0x00's in src[] for :: shorthanding.\n     */\n    memset(words, '\\0', sizeof words);\n    for (i = 0; i < NS_IN6ADDRSZ; i++)\n        words[i / 2] |= (src[i] << ((1 - (i % 2)) << 3));\n    best.base = -1;\n    best.len = 0;\n    cur.base = -1;\n    cur.len = 0;\n    for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) {\n        if (words[i] == 0) {\n            if (cur.base == -1)\n                cur.base = i, cur.len = 1;\n            else\n                cur.len++;\n        } else {\n            if (cur.base != -1) {\n                if (best.base == -1 || cur.len > best.len)\n                    best = cur;\n                cur.base = -1;\n            }\n        }\n    }\n    if (cur.base != -1) {\n        if (best.base == -1 || cur.len > best.len)\n            best = cur;\n    }\n    if (best.base != -1 && best.len < 2)\n        best.base = -1;\n\n    /*\n     * Format the result.\n     */\n    tp = dest;\n    for (i = 0; i < (NS_IN6ADDRSZ / NS_INT16SZ); i++) {\n        /* Are we inside the best run of 0x00's? */\n        if (best.base != -1 && i >= best.base &&\n            i < (best.base + best.len)) {\n            if (i == best.base)\n                *tp++ = ':';\n            continue;\n        }\n        /* Are we following an initial run of 0x00s or any real hex? */\n        if (i != 0)\n            *tp++ = ':';\n        /* Is this address an encapsulated IPv4? */\n        if (i == 6 && best.base == 0 &&\n            (best.len == 6 || (best.len == 5 && words[5] == 0xffff))) {\n            tp += sprintf(tp, \"%u.%u.%u.%u\",\n                          src[12], src[13], src[14], src[15]);\n            break;\n        }\n        tp += sprintf(tp, \"%x\", words[i]);\n    }\n    /* Was it a trailing run of 0x00's? */\n    if (best.base != -1 && (best.base + best.len) ==\n        (NS_IN6ADDRSZ / NS_INT16SZ))\n        *tp++ = ':';\n    *tp++ = '\\0';\n}\n\nbool\ncork_ipv6_is_valid_network(const struct cork_ipv6 *addr,\n                           unsigned int cidr_prefix)\n{\n    uint64_t  cidr_mask[2];\n\n    if (cidr_prefix > 128) {\n        return false;\n    } else if (cidr_prefix == 128) {\n        /* This handles undefined behavior for overflow bit shifts. */\n        cidr_mask[0] = cidr_mask[1] = 0;\n    } else if (cidr_prefix == 64) {\n        /* This handles undefined behavior for overflow bit shifts. */\n        cidr_mask[0] = 0;\n        cidr_mask[1] = UINT64_C(0xffffffffffffffff);\n    } else if (cidr_prefix > 64) {\n        cidr_mask[0] = 0;\n        cidr_mask[1] = UINT64_C(0xffffffffffffffff) >> (cidr_prefix-64);\n    } else {\n        cidr_mask[0] = UINT64_C(0xffffffffffffffff) >> cidr_prefix;\n        cidr_mask[1] = UINT64_C(0xffffffffffffffff);\n    }\n\n    return (CORK_UINT64_BIG_TO_HOST(addr->_.u64[0] & cidr_mask[0]) == 0) &&\n           (CORK_UINT64_BIG_TO_HOST(addr->_.u64[1] & cidr_mask[1]) == 0);\n}\n\n\n/*** IP ***/\n\nvoid\ncork_ip_from_ipv4_(struct cork_ip *addr, const void *src)\n{\n    cork_ip_from_ipv4(addr, src);\n}\n\nvoid\ncork_ip_from_ipv6_(struct cork_ip *addr, const void *src)\n{\n    cork_ip_from_ipv6(addr, src);\n}\n\nint\ncork_ip_init(struct cork_ip *addr, const char *str)\n{\n    int  rc;\n\n    /* Try IPv4 first */\n    rc = cork_ipv4_init(&addr->ip.v4, str);\n    if (rc == 0) {\n        /* successful parse */\n        addr->version = 4;\n        return 0;\n    }\n\n    /* Then try IPv6 */\n    cork_error_clear();\n    rc = cork_ipv6_init(&addr->ip.v6, str);\n    if (rc == 0) {\n        /* successful parse */\n        addr->version = 6;\n        return 0;\n    }\n\n    /* Parse error for both address types */\n    cork_parse_error(\"Invalid IP address: \\\"%s\\\"\", str);\n    return -1;\n}\n\nbool\ncork_ip_equal_(const struct cork_ip *addr1, const struct cork_ip *addr2)\n{\n    return cork_ip_equal(addr1, addr2);\n}\n\nvoid\ncork_ip_to_raw_string(const struct cork_ip *addr, char *dest)\n{\n    switch (addr->version) {\n        case 4:\n            cork_ipv4_to_raw_string(&addr->ip.v4, dest);\n            return;\n\n        case 6:\n            cork_ipv6_to_raw_string(&addr->ip.v6, dest);\n            return;\n\n        default:\n            strncpy(dest, \"<INVALID>\", CORK_IP_STRING_LENGTH);\n            return;\n    }\n}\n\nbool\ncork_ip_is_valid_network(const struct cork_ip *addr, unsigned int cidr_prefix)\n{\n    switch (addr->version) {\n        case 4:\n            return cork_ipv4_is_valid_network(&addr->ip.v4, cidr_prefix);\n        case 6:\n            return cork_ipv6_is_valid_network(&addr->ip.v6, cidr_prefix);\n        default:\n            return false;\n    }\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/core/mempool.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012-2015, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <assert.h>\n#include <stdlib.h>\n\n#include \"libcork/core/callbacks.h\"\n#include \"libcork/core/mempool.h\"\n#include \"libcork/core/types.h\"\n#include \"libcork/helpers/errors.h\"\n\n\n#if !defined(CORK_DEBUG_MEMPOOL)\n#define CORK_DEBUG_MEMPOOL  0\n#endif\n\n#if CORK_DEBUG_MEMPOOL\n#include <stdio.h>\n#define DEBUG(...) fprintf(stderr, __VA_ARGS__)\n#else\n#define DEBUG(...) /* no debug messages */\n#endif\n\n\n\nstruct cork_mempool {\n    size_t  element_size;\n    size_t  block_size;\n    struct cork_mempool_object  *free_list;\n    /* The number of objects that have been given out by\n     * cork_mempool_new but not returned via cork_mempool_free. */\n    size_t  allocated_count;\n    struct cork_mempool_block  *blocks;\n\n    void  *user_data;\n    cork_free_f  free_user_data;\n    cork_init_f  init_object;\n    cork_done_f  done_object;\n};\n\nstruct cork_mempool_object {\n    /* When this object is unclaimed, it will be in the cork_mempool\n     * object's free_list using this pointer. */\n    struct cork_mempool_object  *next_free;\n};\n\nstruct cork_mempool_block {\n    struct cork_mempool_block  *next_block;\n};\n\n#define cork_mempool_object_size(mp) \\\n    (sizeof(struct cork_mempool_object) + (mp)->element_size)\n\n#define cork_mempool_get_header(obj) \\\n    (((struct cork_mempool_object *) (obj)) - 1)\n\n#define cork_mempool_get_object(hdr) \\\n    ((void *) (((struct cork_mempool_object *) (hdr)) + 1))\n\n\nstruct cork_mempool *\ncork_mempool_new_size_ex(size_t element_size, size_t block_size)\n{\n    struct cork_mempool  *mp = cork_new(struct cork_mempool);\n    mp->element_size = element_size;\n    mp->block_size = block_size;\n    mp->free_list = NULL;\n    mp->allocated_count = 0;\n    mp->blocks = NULL;\n    mp->user_data = NULL;\n    mp->free_user_data = NULL;\n    mp->init_object = NULL;\n    mp->done_object = NULL;\n    return mp;\n}\n\nvoid\ncork_mempool_free(struct cork_mempool *mp)\n{\n    struct cork_mempool_block  *curr;\n    assert(mp->allocated_count == 0);\n\n    if (mp->done_object != NULL) {\n        struct cork_mempool_object  *obj;\n        for (obj = mp->free_list; obj != NULL; obj = obj->next_free) {\n            mp->done_object\n                (mp->user_data, cork_mempool_get_object(obj));\n        }\n    }\n\n    for (curr = mp->blocks; curr != NULL; ) {\n        struct cork_mempool_block  *next = curr->next_block;\n        cork_free(curr, mp->block_size);\n        /* Do this here instead of in the for statement to avoid\n         * accessing the just-freed block. */\n        curr = next;\n    }\n\n    cork_free_user_data(mp);\n    cork_delete(struct cork_mempool, mp);\n}\n\n\nvoid\ncork_mempool_set_user_data(struct cork_mempool *mp,\n                           void *user_data, cork_free_f free_user_data)\n{\n    cork_free_user_data(mp);\n    mp->user_data = user_data;\n    mp->free_user_data = free_user_data;\n}\n\nvoid\ncork_mempool_set_init_object(struct cork_mempool *mp, cork_init_f init_object)\n{\n    mp->init_object = init_object;\n}\n\nvoid\ncork_mempool_set_done_object(struct cork_mempool *mp, cork_done_f done_object)\n{\n    mp->done_object = done_object;\n}\n\nvoid\ncork_mempool_set_callbacks(struct cork_mempool *mp,\n                           void *user_data, cork_free_f free_user_data,\n                           cork_init_f init_object,\n                           cork_done_f done_object)\n{\n    cork_mempool_set_user_data(mp, user_data, free_user_data);\n    cork_mempool_set_init_object(mp, init_object);\n    cork_mempool_set_done_object(mp, done_object);\n}\n\n\n/* If this function succeeds, then we guarantee that there will be at\n * least one object in mp->free_list. */\nstatic void\ncork_mempool_new_block(struct cork_mempool *mp)\n{\n    /* Allocate the new block and add it to mp's block list. */\n    struct cork_mempool_block  *block;\n    void  *vblock;\n    DEBUG(\"Allocating new %zu-byte block\\n\", mp->block_size);\n    block = cork_malloc(mp->block_size);\n    block->next_block = mp->blocks;\n    mp->blocks = block;\n    vblock = block;\n\n    /* Divide the block's memory region into a bunch of objects. */\n    size_t  index = sizeof(struct cork_mempool_block);\n    for (index = sizeof(struct cork_mempool_block);\n         (index + cork_mempool_object_size(mp)) <= mp->block_size;\n         index += cork_mempool_object_size(mp)) {\n        struct cork_mempool_object  *obj = vblock + index;\n        DEBUG(\"  New object at %p[%p]\\n\", cork_mempool_get_object(obj), obj);\n        if (mp->init_object != NULL) {\n            mp->init_object\n                (mp->user_data, cork_mempool_get_object(obj));\n        }\n        obj->next_free = mp->free_list;\n        mp->free_list = obj;\n    }\n}\n\nvoid *\ncork_mempool_new_object(struct cork_mempool *mp)\n{\n    struct cork_mempool_object  *obj;\n    void  *ptr;\n\n    if (CORK_UNLIKELY(mp->free_list == NULL)) {\n        cork_mempool_new_block(mp);\n    }\n\n    obj = mp->free_list;\n    mp->free_list = obj->next_free;\n    mp->allocated_count++;\n    ptr = cork_mempool_get_object(obj);\n    return ptr;\n}\n\nvoid\ncork_mempool_free_object(struct cork_mempool *mp, void *ptr)\n{\n    struct cork_mempool_object  *obj = cork_mempool_get_header(ptr);\n    DEBUG(\"Returning %p[%p] to memory pool\\n\", ptr, obj);\n    obj->next_free = mp->free_list;\n    mp->free_list = obj;\n    mp->allocated_count--;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/core/timestamp.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <string.h>\n#include <time.h>\n#include <sys/time.h>\n\n#include \"libcork/core/timestamp.h\"\n#include \"libcork/core/types.h\"\n#include \"libcork/helpers/errors.h\"\n\nvoid\ncork_timestamp_init_now(cork_timestamp *ts)\n{\n    struct timeval  tp;\n    gettimeofday(&tp, NULL);\n    cork_timestamp_init_usec(ts, tp.tv_sec, tp.tv_usec);\n}\n\n\n#define is_digit(ch)  ((ch) >= '0' && (ch) <= '9')\n\nstatic uint64_t\npower_of_10(unsigned int width)\n{\n    uint64_t  accumulator = 10;\n    uint64_t  result = 1;\n    while (width != 0) {\n        if ((width % 2) == 1) {\n            result *= accumulator;\n            width--;\n        }\n        accumulator *= accumulator;\n        width /= 2;\n    }\n    return result;\n}\n\nstatic int\nappend_fractional(const cork_timestamp ts, unsigned int width,\n                  struct cork_buffer *dest)\n{\n    if (CORK_UNLIKELY(width == 0 || width > 9)) {\n        cork_error_set_printf\n            (EINVAL,\n             \"Invalid width %u for fractional cork_timestamp\", width);\n        return -1;\n    } else {\n        uint64_t  denom = power_of_10(width);\n        uint64_t  frac = cork_timestamp_gsec_to_units(ts, denom);\n        cork_buffer_append_printf(dest, \"%0*\" PRIu64, width, frac);\n        return 0;\n    }\n}\n\nstatic int\ncork_timestamp_format_parts(const cork_timestamp ts, struct tm *tm,\n                            const char *format, struct cork_buffer *dest)\n{\n    const char  *next_percent;\n\n    while ((next_percent = strchr(format, '%')) != NULL) {\n        const char  *spec = next_percent + 1;\n        unsigned int  width = 0;\n\n        /* First append any text in between the previous format specifier and\n         * this one. */\n        cork_buffer_append(dest, format, next_percent - format);\n\n        /* Then parse the format specifier */\n        while (is_digit(*spec)) {\n            width *= 10;\n            width += (*spec++ - '0');\n        }\n\n        switch (*spec) {\n            case '\\0':\n                cork_error_set_string\n                    (EINVAL,\n                     \"Trailing %% at end of cork_timestamp format string\");\n                return -1;\n\n            case '%':\n                cork_buffer_append(dest, \"%\", 1);\n                break;\n\n            case 'Y':\n                cork_buffer_append_printf(dest, \"%04d\", tm->tm_year + 1900);\n                break;\n\n            case 'm':\n                cork_buffer_append_printf(dest, \"%02d\", tm->tm_mon + 1);\n                break;\n\n            case 'd':\n                cork_buffer_append_printf(dest, \"%02d\", tm->tm_mday);\n                break;\n\n            case 'H':\n                cork_buffer_append_printf(dest, \"%02d\", tm->tm_hour);\n                break;\n\n            case 'M':\n                cork_buffer_append_printf(dest, \"%02d\", tm->tm_min);\n                break;\n\n            case 'S':\n                cork_buffer_append_printf(dest, \"%02d\", tm->tm_sec);\n                break;\n\n            case 's':\n                cork_buffer_append_printf\n                    (dest, \"%\" PRIu32, cork_timestamp_sec(ts));\n                break;\n\n            case 'f':\n                rii_check(append_fractional(ts, width, dest));\n                break;\n\n            default:\n                cork_error_set_printf\n                    (EINVAL,\n                     \"Unknown cork_timestamp format specifier %%%c\", *spec);\n                return -1;\n        }\n\n        format = spec + 1;\n    }\n\n    /* When we fall through, there is some additional content after the final\n     * format specifier. */\n    cork_buffer_append_string(dest, format);\n    return 0;\n}\n\n#ifdef __MINGW32__\nstatic struct tm *__cdecl gmtime_r(const time_t *_Time, struct tm *_Tm)\n{\n    struct tm *p = gmtime(_Time);\n    if (!p)\n        return NULL;\n    if (_Tm) {\n        memcpy(_Tm, p, sizeof(struct tm));\n        return _Tm;\n    } else\n        return p;\n}\n\nstatic struct tm *__cdecl localtime_r(const time_t *_Time, struct tm *_Tm)\n{\n    struct tm *p = localtime(_Time);\n    if (!p)\n        return NULL;\n    if (_Tm) {\n        memcpy(_Tm, p, sizeof(struct tm));\n        return _Tm;\n    } else\n        return p;\n}\n\n#endif\n\n\nint\ncork_timestamp_format_utc(const cork_timestamp ts, const char *format,\n                          struct cork_buffer *dest)\n{\n    time_t  clock;\n    struct tm  tm;\n    clock = cork_timestamp_sec(ts);\n    gmtime_r(&clock, &tm);\n    return cork_timestamp_format_parts(ts, &tm, format, dest);\n}\n\nint\ncork_timestamp_format_local(const cork_timestamp ts, const char *format,\n                            struct cork_buffer *dest)\n{\n    time_t  clock;\n    struct tm  tm;\n    clock = cork_timestamp_sec(ts);\n    localtime_r(&clock, &tm);\n    return cork_timestamp_format_parts(ts, &tm, format, dest);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/core/u128.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <string.h>\n#include <stdio.h>\n\n#include \"libcork/core/types.h\"\n#include \"libcork/core/u128.h\"\n\n\n/* From http://stackoverflow.com/questions/8023414/how-to-convert-a-128-bit-integer-to-a-decimal-ascii-string-in-c */\n\nconst char *\ncork_u128_to_decimal(char *dest, cork_u128 val)\n{\n    uint32_t  n[4];\n    char  *s = dest;\n    char  *p = dest;\n    unsigned int  i;\n\n    /* This algorithm assumes that n[3] is the MSW. */\n    n[3] = cork_u128_be32(val, 0);\n    n[2] = cork_u128_be32(val, 1);\n    n[1] = cork_u128_be32(val, 2);\n    n[0] = cork_u128_be32(val, 3);\n\n    memset(s, '0', CORK_U128_DECIMAL_LENGTH - 1);\n    s[CORK_U128_DECIMAL_LENGTH - 1] = '\\0';\n\n    for (i = 0; i < 128; i++) {\n        unsigned int  j;\n        unsigned int carry;\n\n        carry = (n[3] >= 0x80000000);\n        /* Shift n[] left, doubling it */\n        n[3] = ((n[3] << 1) & 0xFFFFFFFF) + (n[2] >= 0x80000000);\n        n[2] = ((n[2] << 1) & 0xFFFFFFFF) + (n[1] >= 0x80000000);\n        n[1] = ((n[1] << 1) & 0xFFFFFFFF) + (n[0] >= 0x80000000);\n        n[0] = ((n[0] << 1) & 0xFFFFFFFF);\n\n        /* Add s[] to itself in decimal, doubling it */\n        for (j = CORK_U128_DECIMAL_LENGTH - 1; j-- > 0; ) {\n            s[j] += s[j] - '0' + carry;\n            carry = (s[j] > '9');\n            if (carry) {\n                s[j] -= 10;\n            }\n        }\n    }\n\n    while ((p[0] == '0') && (p < &s[CORK_U128_DECIMAL_LENGTH - 2])) {\n        p++;\n    }\n\n    return p;\n}\n\n\nconst char *\ncork_u128_to_hex(char *buf, cork_u128 val)\n{\n    uint64_t  hi = val._.be64.hi;\n    uint64_t  lo = val._.be64.lo;\n    if (hi == 0) {\n        snprintf(buf, CORK_U128_HEX_LENGTH, \"%\" PRIx64, lo);\n    } else {\n        snprintf(buf, CORK_U128_HEX_LENGTH, \"%\" PRIx64 \"%016\" PRIx64, hi, lo);\n    }\n    return buf;\n}\n\nconst char *\ncork_u128_to_padded_hex(char *buf, cork_u128 val)\n{\n    uint64_t  hi = val._.be64.hi;\n    uint64_t  lo = val._.be64.lo;\n    snprintf(buf, CORK_U128_HEX_LENGTH, \"%016\" PRIx64 \"%016\" PRIx64, hi, lo);\n    return buf;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/core/version.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2015, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include \"libcork/config.h\"\n#include \"libcork/core/api.h\"\n\n\n/*-----------------------------------------------------------------------\n * Library version\n */\n\nconst char *\ncork_version_string(void)\n{\n    return CORK_CONFIG_VERSION_STRING;\n}\n\nconst char *\ncork_revision_string(void)\n{\n    return CORK_CONFIG_REVISION;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/ds/array.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <assert.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"libcork/core/types.h\"\n#include \"libcork/ds/array.h\"\n#include \"libcork/helpers/errors.h\"\n\n#ifndef CORK_ARRAY_DEBUG\n#define CORK_ARRAY_DEBUG 0\n#endif\n\n#if CORK_ARRAY_DEBUG\n#include <stdio.h>\n#define DEBUG(...) \\\n    do { \\\n        fprintf(stderr, __VA_ARGS__); \\\n        fprintf(stderr, \"\\n\"); \\\n    } while (0)\n#else\n#define DEBUG(...) /* nothing */\n#endif\n\n\n/*-----------------------------------------------------------------------\n * Resizable arrays\n */\n\nstruct cork_array_priv {\n    size_t  allocated_count;\n    size_t  allocated_size;\n    size_t  element_size;\n    size_t  initialized_count;\n    void  *user_data;\n    cork_free_f  free_user_data;\n    cork_init_f  init;\n    cork_done_f  done;\n    cork_init_f  reuse;\n    cork_done_f  remove;\n};\n\nvoid\ncork_raw_array_init(struct cork_raw_array *array, size_t element_size)\n{\n    array->items = NULL;\n    array->size = 0;\n    array->priv = cork_new(struct cork_array_priv);\n    array->priv->allocated_count = 0;\n    array->priv->allocated_size = 0;\n    array->priv->element_size = element_size;\n    array->priv->initialized_count = 0;\n    array->priv->user_data = NULL;\n    array->priv->free_user_data = NULL;\n    array->priv->init = NULL;\n    array->priv->done = NULL;\n    array->priv->reuse = NULL;\n    array->priv->remove = NULL;\n}\n\nvoid\ncork_raw_array_done(struct cork_raw_array *array)\n{\n    if (array->priv->done != NULL) {\n        size_t  i;\n        char  *element = array->items;\n        for (i = 0; i < array->priv->initialized_count; i++) {\n            array->priv->done(array->priv->user_data, element);\n            element += array->priv->element_size;\n        }\n    }\n    if (array->items != NULL) {\n        cork_free(array->items, array->priv->allocated_size);\n    }\n    cork_free_user_data(array->priv);\n    cork_delete(struct cork_array_priv, array->priv);\n}\n\nvoid\ncork_raw_array_set_callback_data(struct cork_raw_array *array,\n                                 void *user_data, cork_free_f free_user_data)\n{\n    array->priv->user_data = user_data;\n    array->priv->free_user_data = free_user_data;\n}\n\nvoid\ncork_raw_array_set_init(struct cork_raw_array *array, cork_init_f init)\n{\n    array->priv->init = init;\n}\n\nvoid\ncork_raw_array_set_done(struct cork_raw_array *array, cork_done_f done)\n{\n    array->priv->done = done;\n}\n\nvoid\ncork_raw_array_set_reuse(struct cork_raw_array *array, cork_init_f reuse)\n{\n    array->priv->reuse = reuse;\n}\n\nvoid\ncork_raw_array_set_remove(struct cork_raw_array *array, cork_done_f remove)\n{\n    array->priv->remove = remove;\n}\n\nsize_t\ncork_raw_array_element_size(const struct cork_raw_array *array)\n{\n    return array->priv->element_size;\n}\n\nvoid\ncork_raw_array_clear(struct cork_raw_array *array)\n{\n    if (array->priv->remove != NULL) {\n        size_t  i;\n        char  *element = array->items;\n        for (i = 0; i < array->priv->initialized_count; i++) {\n            array->priv->remove(array->priv->user_data, element);\n            element += array->priv->element_size;\n        }\n    }\n    array->size = 0;\n}\n\nvoid *\ncork_raw_array_elements(const struct cork_raw_array *array)\n{\n    return array->items;\n}\n\nvoid *\ncork_raw_array_at(const struct cork_raw_array *array, size_t index)\n{\n    return ((char *) array->items) + (array->priv->element_size * index);\n}\n\nsize_t\ncork_raw_array_size(const struct cork_raw_array *array)\n{\n    return array->size;\n}\n\nbool\ncork_raw_array_is_empty(const struct cork_raw_array *array)\n{\n    return (array->size == 0);\n}\n\nvoid\ncork_raw_array_ensure_size(struct cork_raw_array *array, size_t desired_count)\n{\n    size_t  desired_size;\n\n    DEBUG(\"--- Array %p: Ensure %zu %zu-byte elements\",\n          array, desired_count, array->priv->element_size);\n    desired_size = desired_count * array->priv->element_size;\n\n    if (desired_size > array->priv->allocated_size) {\n        size_t  new_count = array->priv->allocated_count * 2;\n        size_t  new_size = array->priv->allocated_size * 2;\n        if (desired_size > new_size) {\n            new_count = desired_count;\n            new_size = desired_size;\n        }\n\n        DEBUG(\"--- Array %p: Reallocating %zu->%zu bytes\",\n              array, array->priv->allocated_size, new_size);\n        array->items =\n            cork_realloc(array->items, array->priv->allocated_size, new_size);\n\n        array->priv->allocated_count = new_count;\n        array->priv->allocated_size = new_size;\n    }\n}\n\nvoid *\ncork_raw_array_append(struct cork_raw_array *array)\n{\n    size_t  index;\n    void  *element;\n    index = array->size++;\n    cork_raw_array_ensure_size(array, array->size);\n    element = cork_raw_array_at(array, index);\n\n    /* Call the init or reset callback, depending on whether this entry has been\n     * initialized before. */\n\n    /* Since we can currently only add elements by appending them one at a time,\n     * then this entry is either already initialized, or is the first\n     * uninitialized entry. */\n    assert(index <= array->priv->initialized_count);\n\n    if (index == array->priv->initialized_count) {\n        /* This element has not been initialized yet. */\n        array->priv->initialized_count++;\n        if (array->priv->init != NULL) {\n            array->priv->init(array->priv->user_data, element);\n        }\n    } else {\n        /* This element has already been initialized. */\n        if (array->priv->reuse != NULL) {\n            array->priv->reuse(array->priv->user_data, element);\n        }\n    }\n\n    return element;\n}\n\nint\ncork_raw_array_copy(struct cork_raw_array *dest,\n                    const struct cork_raw_array *src,\n                    cork_copy_f copy, void *user_data)\n{\n    size_t  i;\n    size_t  reuse_count;\n    char  *dest_element;\n\n    DEBUG(\"--- Copying %zu elements (%zu bytes) from %p to %p\",\n          src->size, src->size * dest->priv->element_size, src, dest);\n    assert(dest->priv->element_size == src->priv->element_size);\n    cork_array_clear(dest);\n    cork_array_ensure_size(dest, src->size);\n\n    /* Initialize enough elements to hold the contents of src */\n    reuse_count = dest->priv->initialized_count;\n    if (src->size < reuse_count) {\n        reuse_count = src->size;\n    }\n\n    dest_element = dest->items;\n    if (dest->priv->reuse != NULL) {\n        DEBUG(\"    Calling reuse on elements 0-%zu\", reuse_count);\n        for (i = 0; i < reuse_count; i++) {\n            dest->priv->reuse(dest->priv->user_data, dest_element);\n            dest_element += dest->priv->element_size;\n        }\n    } else {\n        dest_element += reuse_count * dest->priv->element_size;\n    }\n\n    if (dest->priv->init != NULL) {\n        DEBUG(\"    Calling init on elements %zu-%zu\", reuse_count, src->size);\n        for (i = reuse_count; i < src->size; i++) {\n            dest->priv->init(dest->priv->user_data, dest_element);\n            dest_element += dest->priv->element_size;\n        }\n    }\n\n    if (src->size > dest->priv->initialized_count) {\n        dest->priv->initialized_count = src->size;\n    }\n\n    /* If the caller provided a copy function, let it copy each element in turn.\n     * Otherwise, bulk copy everything using memcpy. */\n    if (copy == NULL) {\n        memcpy(dest->items, src->items, src->size * dest->priv->element_size);\n    } else {\n        const char  *src_element = src->items;\n        dest_element = dest->items;\n        for (i = 0; i < src->size; i++) {\n            rii_check(copy(user_data, dest_element, src_element));\n            dest_element += dest->priv->element_size;\n            src_element += dest->priv->element_size;\n        }\n    }\n\n    dest->size = src->size;\n    return 0;\n}\n\n\n/*-----------------------------------------------------------------------\n * Pointer arrays\n */\n\nstruct cork_pointer_array {\n    cork_free_f  free;\n};\n\nstatic void\npointer__init(void *user_data, void *vvalue)\n{\n    void **value = vvalue;\n    *value = NULL;\n}\n\nstatic void\npointer__done(void *user_data, void *vvalue)\n{\n    struct cork_pointer_array  *ptr_array = user_data;\n    void **value = vvalue;\n    if (*value != NULL) {\n        ptr_array->free(*value);\n    }\n}\n\nstatic void\npointer__remove(void *user_data, void *vvalue)\n{\n    struct cork_pointer_array  *ptr_array = user_data;\n    void **value = vvalue;\n    if (*value != NULL) {\n        ptr_array->free(*value);\n    }\n    *value = NULL;\n}\n\nstatic void\npointer__free(void *user_data)\n{\n    struct cork_pointer_array  *ptr_array = user_data;\n    cork_delete(struct cork_pointer_array, ptr_array);\n}\n\nvoid\ncork_raw_pointer_array_init(struct cork_raw_array *array, cork_free_f free_ptr)\n{\n    struct cork_pointer_array  *ptr_array = cork_new(struct cork_pointer_array);\n    ptr_array->free = free_ptr;\n    cork_raw_array_init(array, sizeof(void *));\n    cork_array_set_callback_data(array, ptr_array, pointer__free);\n    cork_array_set_init(array, pointer__init);\n    cork_array_set_done(array, pointer__done);\n    cork_array_set_remove(array, pointer__remove);\n}\n\n\n/*-----------------------------------------------------------------------\n * String arrays\n */\n\nvoid\ncork_string_array_init(struct cork_string_array *array)\n{\n    cork_raw_pointer_array_init\n        ((struct cork_raw_array *) array, (cork_free_f) cork_strfree);\n}\n\nvoid\ncork_string_array_append(struct cork_string_array *array, const char *str)\n{\n    const char  *copy = cork_strdup(str);\n    cork_array_append(array, copy);\n}\n\nstatic int\nstring__copy(void *user_data, void *vdest, const void *vsrc)\n{\n    const char  **dest = vdest;\n    const char  **src = (const char **) vsrc;\n    *dest = cork_strdup(*src);\n    return 0;\n}\n\nvoid\ncork_string_array_copy(struct cork_string_array *dest,\n                       const struct cork_string_array *src)\n{\n    CORK_ATTR_UNUSED int  rc;\n    rc = cork_array_copy(dest, src, string__copy, NULL);\n    /* cork_array_copy can only fail if the copy callback fails, and ours\n     * doesn't! */\n    assert(rc == 0);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/ds/bitset.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2013-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <string.h>\n\n#include \"libcork/core/allocator.h\"\n#include \"libcork/core/api.h\"\n#include \"libcork/core/types.h\"\n#include \"libcork/ds/bitset.h\"\n\n\nstatic size_t\nbytes_needed(size_t bit_count)\n{\n    /* We need one byte for every bit... */\n    size_t  bytes_needed = bit_count / 8;\n    /* Plus one extra for the leftovers that don't fit into a whole byte. */\n    bytes_needed += ((bit_count % 8) > 0);\n    return bytes_needed;\n}\n\nvoid\ncork_bitset_init(struct cork_bitset *set, size_t bit_count)\n{\n    set->bit_count = bit_count;\n    set->byte_count = bytes_needed(bit_count);\n    set->bits = cork_malloc(set->byte_count);\n    memset(set->bits, 0, set->byte_count);\n}\n\nstruct cork_bitset *\ncork_bitset_new(size_t bit_count)\n{\n    struct cork_bitset  *set = cork_new(struct cork_bitset);\n    cork_bitset_init(set, bit_count);\n    return set;\n}\n\nvoid\ncork_bitset_done(struct cork_bitset *set)\n{\n    cork_free(set->bits, set->byte_count);\n}\n\nvoid\ncork_bitset_free(struct cork_bitset *set)\n{\n    cork_bitset_done(set);\n    cork_delete(struct cork_bitset, set);\n}\n\nvoid\ncork_bitset_clear(struct cork_bitset *set)\n{\n    memset(set->bits, 0, set->byte_count);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/ds/buffer.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <stdarg.h>\n#include <stdio.h>\n#include <string.h>\n\n#include \"libcork/core/allocator.h\"\n#include \"libcork/core/types.h\"\n#include \"libcork/ds/buffer.h\"\n#include \"libcork/ds/managed-buffer.h\"\n#include \"libcork/ds/stream.h\"\n#include \"libcork/helpers/errors.h\"\n\n\nvoid\ncork_buffer_init(struct cork_buffer *buffer)\n{\n    buffer->buf = NULL;\n    buffer->size = 0;\n    buffer->allocated_size = 0;\n}\n\n\nstruct cork_buffer *\ncork_buffer_new(void)\n{\n    struct cork_buffer  *buffer = cork_new(struct cork_buffer);\n    cork_buffer_init(buffer);\n    return buffer;\n}\n\n\nvoid\ncork_buffer_done(struct cork_buffer *buffer)\n{\n    if (buffer->buf != NULL) {\n        cork_free(buffer->buf, buffer->allocated_size);\n        buffer->buf = NULL;\n    }\n    buffer->size = 0;\n    buffer->allocated_size = 0;\n}\n\n\nvoid\ncork_buffer_free(struct cork_buffer *buffer)\n{\n    cork_buffer_done(buffer);\n    cork_delete(struct cork_buffer, buffer);\n}\n\n\nbool\ncork_buffer_equal(const struct cork_buffer *buffer1,\n                  const struct cork_buffer *buffer2)\n{\n    if (buffer1 == buffer2) {\n        return true;\n    }\n\n    if (buffer1->size != buffer2->size) {\n        return false;\n    }\n\n    return (memcmp(buffer1->buf, buffer2->buf, buffer1->size) == 0);\n}\n\n\nstatic void\ncork_buffer_ensure_size_int(struct cork_buffer *buffer, size_t desired_size)\n{\n    size_t  new_size;\n\n    if (CORK_LIKELY(buffer->allocated_size >= desired_size)) {\n        return;\n    }\n\n    /* Make sure we at least double the old size when reallocating. */\n    new_size = buffer->allocated_size * 2;\n    if (desired_size > new_size) {\n        new_size = desired_size;\n    }\n\n    buffer->buf = cork_realloc(buffer->buf, buffer->allocated_size, new_size);\n    buffer->allocated_size = new_size;\n}\n\nvoid\ncork_buffer_ensure_size(struct cork_buffer *buffer, size_t desired_size)\n{\n    cork_buffer_ensure_size_int(buffer, desired_size);\n}\n\n\nvoid\ncork_buffer_clear(struct cork_buffer *buffer)\n{\n    buffer->size = 0;\n    if (buffer->buf != NULL) {\n        ((char *) buffer->buf)[0] = '\\0';\n    }\n}\n\nvoid\ncork_buffer_truncate(struct cork_buffer *buffer, size_t length)\n{\n    if (buffer->size > length) {\n        buffer->size = length;\n        if (length == 0) {\n            if (buffer->buf != NULL) {\n                ((char *) buffer->buf)[0] = '\\0';\n            }\n        } else {\n            ((char *) buffer->buf)[length] = '\\0';\n        }\n    }\n}\n\n\nvoid\ncork_buffer_set(struct cork_buffer *buffer, const void *src, size_t length)\n{\n    cork_buffer_ensure_size_int(buffer, length+1);\n    memcpy(buffer->buf, src, length);\n    ((char *) buffer->buf)[length] = '\\0';\n    buffer->size = length;\n}\n\n\nvoid\ncork_buffer_append(struct cork_buffer *buffer, const void *src, size_t length)\n{\n    cork_buffer_ensure_size_int(buffer, buffer->size + length + 1);\n    memcpy(buffer->buf + buffer->size, src, length);\n    buffer->size += length;\n    ((char *) buffer->buf)[buffer->size] = '\\0';\n}\n\n\nvoid\ncork_buffer_set_string(struct cork_buffer *buffer, const char *str)\n{\n    cork_buffer_set(buffer, str, strlen(str));\n}\n\n\nvoid\ncork_buffer_append_string(struct cork_buffer *buffer, const char *str)\n{\n    cork_buffer_append(buffer, str, strlen(str));\n}\n\n\nvoid\ncork_buffer_append_vprintf(struct cork_buffer *buffer, const char *format,\n                           va_list args)\n{\n    size_t  format_size;\n    va_list  args1;\n\n    va_copy(args1, args);\n    format_size = vsnprintf(buffer->buf + buffer->size,\n                            buffer->allocated_size - buffer->size,\n                            format, args1);\n    va_end(args1);\n\n    /* If the first call works, then set buffer->size and return. */\n    if (format_size < (buffer->allocated_size - buffer->size)) {\n        buffer->size += format_size;\n        return;\n    }\n\n    /* If the first call fails, resize buffer and try again. */\n    cork_buffer_ensure_size_int\n        (buffer, buffer->allocated_size + format_size + 1);\n    format_size = vsnprintf(buffer->buf + buffer->size,\n                            buffer->allocated_size - buffer->size,\n                            format, args);\n    buffer->size += format_size;\n}\n\n\nvoid\ncork_buffer_vprintf(struct cork_buffer *buffer, const char *format,\n                    va_list args)\n{\n    cork_buffer_clear(buffer);\n    cork_buffer_append_vprintf(buffer, format, args);\n}\n\n\nvoid\ncork_buffer_append_printf(struct cork_buffer *buffer, const char *format, ...)\n{\n    va_list  args;\n    va_start(args, format);\n    cork_buffer_append_vprintf(buffer, format, args);\n    va_end(args);\n}\n\n\nvoid\ncork_buffer_printf(struct cork_buffer *buffer, const char *format, ...)\n{\n    va_list  args;\n    va_start(args, format);\n    cork_buffer_vprintf(buffer, format, args);\n    va_end(args);\n}\n\n\nvoid\ncork_buffer_append_indent(struct cork_buffer *buffer, size_t indent)\n{\n    cork_buffer_ensure_size_int(buffer, buffer->size + indent + 1);\n    memset(buffer->buf + buffer->size, ' ', indent);\n    buffer->size += indent;\n    ((char *) buffer->buf)[buffer->size] = '\\0';\n}\n\n/* including space */\n#define is_sprint(ch)  ((ch) >= 0x20 && (ch) <= 0x7e)\n\n/* not including space */\n#define is_print(ch)  ((ch) > 0x20 && (ch) <= 0x7e)\n\n#define is_space(ch) \\\n    ((ch) == ' ' || \\\n     (ch) == '\\f' || \\\n     (ch) == '\\n' || \\\n     (ch) == '\\r' || \\\n     (ch) == '\\t' || \\\n     (ch) == '\\v')\n\n#define to_hex(nybble) \\\n    ((nybble) < 10? '0' + (nybble): 'a' - 10 + (nybble))\n\nvoid\ncork_buffer_append_c_string(struct cork_buffer *dest,\n                            const char *chars, size_t length)\n{\n    size_t  i;\n    cork_buffer_append(dest, \"\\\"\", 1);\n    for (i = 0; i < length; i++) {\n        char  ch = chars[i];\n        switch (ch) {\n            case '\\\"':\n                cork_buffer_append_literal(dest, \"\\\\\\\"\");\n                break;\n            case '\\\\':\n                cork_buffer_append_literal(dest, \"\\\\\\\\\");\n                break;\n            case '\\f':\n                cork_buffer_append_literal(dest, \"\\\\f\");\n                break;\n            case '\\n':\n                cork_buffer_append_literal(dest, \"\\\\n\");\n                break;\n            case '\\r':\n                cork_buffer_append_literal(dest, \"\\\\r\");\n                break;\n            case '\\t':\n                cork_buffer_append_literal(dest, \"\\\\t\");\n                break;\n            case '\\v':\n                cork_buffer_append_literal(dest, \"\\\\v\");\n                break;\n            default:\n                if (is_sprint(ch)) {\n                    cork_buffer_append(dest, &chars[i], 1);\n                } else {\n                    uint8_t  byte = ch;\n                    cork_buffer_append_printf(dest, \"\\\\x%02\" PRIx8, byte);\n                }\n                break;\n        }\n    }\n    cork_buffer_append(dest, \"\\\"\", 1);\n}\n\nvoid\ncork_buffer_append_hex_dump(struct cork_buffer *dest, size_t indent,\n                            const char *chars, size_t length)\n{\n    char  hex[3 * 16];\n    char  print[16];\n    char  *curr_hex = hex;\n    char  *curr_print = print;\n    size_t  i;\n    size_t  column = 0;\n    for (i = 0; i < length; i++) {\n        char  ch = chars[i];\n        uint8_t  u8 = ch;\n        *curr_hex++ = to_hex(u8 >> 4);\n        *curr_hex++ = to_hex(u8 & 0x0f);\n        *curr_hex++ = ' ';\n        *curr_print++ = is_sprint(ch)? ch: '.';\n        if (column == 0 && i != 0) {\n            cork_buffer_append_literal(dest, \"\\n\");\n            cork_buffer_append_indent(dest, indent);\n            column++;\n        } else if (column == 15) {\n            cork_buffer_append_printf\n                (dest, \"%-48.*s\", (int) (curr_hex - hex), hex);\n            cork_buffer_append_literal(dest, \" |\");\n            cork_buffer_append(dest, print, curr_print - print);\n            cork_buffer_append_literal(dest, \"|\");\n            curr_hex = hex;\n            curr_print = print;\n            column = 0;\n        } else {\n            column++;\n        }\n    }\n\n    if (column > 0) {\n        cork_buffer_append_printf(dest, \"%-48.*s\", (int) (curr_hex - hex), hex);\n        cork_buffer_append_literal(dest, \" |\");\n        cork_buffer_append(dest, print, curr_print - print);\n        cork_buffer_append_literal(dest, \"|\");\n    }\n}\n\nvoid\ncork_buffer_append_multiline(struct cork_buffer *dest, size_t indent,\n                             const char *chars, size_t length)\n{\n    size_t  i;\n    for (i = 0; i < length; i++) {\n        char  ch = chars[i];\n        if (ch == '\\n') {\n            cork_buffer_append_literal(dest, \"\\n\");\n            cork_buffer_append_indent(dest, indent);\n        } else {\n            cork_buffer_append(dest, &chars[i], 1);\n        }\n    }\n}\n\nvoid\ncork_buffer_append_binary(struct cork_buffer *dest, size_t indent,\n                          const char *chars, size_t length)\n{\n    size_t  i;\n    bool  newline = false;\n\n    /* If there are any non-printable characters, print out a hex dump */\n    for (i = 0; i < length; i++) {\n        if (!is_print(chars[i]) && !is_space(chars[i])) {\n            cork_buffer_append_literal(dest, \"(hex)\\n\");\n            cork_buffer_append_indent(dest, indent);\n            cork_buffer_append_hex_dump(dest, indent, chars, length);\n            return;\n        } else if (chars[i] == '\\n') {\n            newline = true;\n            /* Don't immediately use the multiline format, since there might be\n             * a non-printable character later on that kicks us over to the hex\n             * dump format. */\n        }\n    }\n\n    if (newline) {\n        cork_buffer_append_literal(dest, \"(multiline)\\n\");\n        cork_buffer_append_indent(dest, indent);\n        cork_buffer_append_multiline(dest, indent, chars, length);\n    } else {\n        cork_buffer_append(dest, chars, length);\n    }\n}\n\n\nstruct cork_buffer__managed_buffer {\n    struct cork_managed_buffer  parent;\n    struct cork_buffer  *buffer;\n};\n\nstatic void\ncork_buffer__managed_free(struct cork_managed_buffer *vself)\n{\n    struct cork_buffer__managed_buffer  *self =\n        cork_container_of(vself, struct cork_buffer__managed_buffer, parent);\n    cork_buffer_free(self->buffer);\n    cork_delete(struct cork_buffer__managed_buffer, self);\n}\n\nstatic struct cork_managed_buffer_iface  CORK_BUFFER__MANAGED_BUFFER = {\n    cork_buffer__managed_free\n};\n\nstruct cork_managed_buffer *\ncork_buffer_to_managed_buffer(struct cork_buffer *buffer)\n{\n    struct cork_buffer__managed_buffer  *self =\n        cork_new(struct cork_buffer__managed_buffer);\n    self->parent.buf = buffer->buf;\n    self->parent.size = buffer->size;\n    self->parent.ref_count = 1;\n    self->parent.iface = &CORK_BUFFER__MANAGED_BUFFER;\n    self->buffer = buffer;\n    return &self->parent;\n}\n\n\nint\ncork_buffer_to_slice(struct cork_buffer *buffer, struct cork_slice *slice)\n{\n    struct cork_managed_buffer  *managed =\n        cork_buffer_to_managed_buffer(buffer);\n\n    /* We don't have to check for NULL; cork_managed_buffer_slice_offset\n     * will do that for us. */\n    int  rc = cork_managed_buffer_slice_offset(slice, managed, 0);\n\n    /* Before returning, drop our reference to the managed buffer.  If\n     * the slicing succeeded, then there will be one remaining reference\n     * in the slice.  If it didn't succeed, this will free the managed\n     * buffer for us. */\n    cork_managed_buffer_unref(managed);\n    return rc;\n}\n\n\nstruct cork_buffer__stream_consumer {\n    struct cork_stream_consumer  consumer;\n    struct cork_buffer  *buffer;\n};\n\nstatic int\ncork_buffer_stream_consumer_data(struct cork_stream_consumer *consumer,\n                                 const void *buf, size_t size,\n                                 bool is_first_chunk)\n{\n    struct cork_buffer__stream_consumer  *bconsumer = cork_container_of\n        (consumer, struct cork_buffer__stream_consumer, consumer);\n    cork_buffer_append(bconsumer->buffer, buf, size);\n    return 0;\n}\n\nstatic int\ncork_buffer_stream_consumer_eof(struct cork_stream_consumer *consumer)\n{\n    return 0;\n}\n\nstatic void\ncork_buffer_stream_consumer_free(struct cork_stream_consumer *consumer)\n{\n    struct cork_buffer__stream_consumer  *bconsumer =\n        cork_container_of\n        (consumer, struct cork_buffer__stream_consumer, consumer);\n    cork_delete(struct cork_buffer__stream_consumer, bconsumer);\n}\n\nstruct cork_stream_consumer *\ncork_buffer_to_stream_consumer(struct cork_buffer *buffer)\n{\n    struct cork_buffer__stream_consumer  *bconsumer =\n        cork_new(struct cork_buffer__stream_consumer);\n    bconsumer->consumer.data = cork_buffer_stream_consumer_data;\n    bconsumer->consumer.eof = cork_buffer_stream_consumer_eof;\n    bconsumer->consumer.free = cork_buffer_stream_consumer_free;\n    bconsumer->buffer = buffer;\n    return &bconsumer->consumer;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/ds/dllist.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include \"libcork/core/api.h\"\n#include \"libcork/core/types.h\"\n#include \"libcork/ds/dllist.h\"\n\n\n/* Include a linkable (but deprecated) version of this to maintain ABI\n * compatibility. */\n#undef cork_dllist_init\nCORK_API void\ncork_dllist_init(struct cork_dllist *list)\n{\n    list->head.next = &list->head;\n    list->head.prev = &list->head;\n}\n\n\nvoid\ncork_dllist_map(struct cork_dllist *list,\n                cork_dllist_map_func func, void *user_data)\n{\n    struct cork_dllist_item  *curr;\n    struct cork_dllist_item  *next;\n    cork_dllist_foreach_void(list, curr, next) {\n        func(curr, user_data);\n    }\n}\n\nint\ncork_dllist_visit(struct cork_dllist *list, void *ud,\n                  cork_dllist_visit_f *visit)\n{\n    struct cork_dllist_item  *curr;\n    struct cork_dllist_item  *next;\n    cork_dllist_foreach_void(list, curr, next) {\n        int  rc = visit(ud, curr);\n        if (rc != 0) {\n            return rc;\n        }\n    }\n    return 0;\n}\n\n\nsize_t\ncork_dllist_size(const struct cork_dllist *list)\n{\n    size_t  size = 0;\n    struct cork_dllist_item  *curr;\n    struct cork_dllist_item  *next;\n    cork_dllist_foreach_void(list, curr, next) {\n        size++;\n    }\n    return size;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/ds/file-stream.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <errno.h>\n#include <fcntl.h>\n#include <stdio.h>\n#include <unistd.h>\n#include <sys/types.h>\n\n#include \"libcork/ds/stream.h\"\n#include \"libcork/helpers/errors.h\"\n#include \"libcork/helpers/posix.h\"\n\n#define BUFFER_SIZE  4096\n\n\n/*-----------------------------------------------------------------------\n * Producers\n */\n\nint\ncork_consume_fd(struct cork_stream_consumer *consumer, int fd)\n{\n    char  buf[BUFFER_SIZE];\n    ssize_t  bytes_read;\n    bool  first = true;\n\n    while (true) {\n        while ((bytes_read = read(fd, buf, BUFFER_SIZE)) > 0) {\n            rii_check(cork_stream_consumer_data\n                      (consumer, buf, bytes_read, first));\n            first = false;\n        }\n\n        if (bytes_read == 0) {\n            return cork_stream_consumer_eof(consumer);\n        } else if (errno != EINTR) {\n            cork_system_error_set();\n            return -1;\n        }\n    }\n}\n\nint\ncork_consume_file(struct cork_stream_consumer *consumer, FILE *fp)\n{\n    char  buf[BUFFER_SIZE];\n    size_t  bytes_read;\n    bool  first = true;\n\n    while (true) {\n        while ((bytes_read = fread(buf, 1, BUFFER_SIZE, fp)) > 0) {\n            rii_check(cork_stream_consumer_data\n                      (consumer, buf, bytes_read, first));\n            first = false;\n        }\n\n        if (feof(fp)) {\n            return cork_stream_consumer_eof(consumer);\n        } else if (errno != EINTR) {\n            cork_system_error_set();\n            return -1;\n        }\n    }\n}\n\nint\ncork_consume_file_from_path(struct cork_stream_consumer *consumer,\n                            const char *path, int flags)\n{\n    int  fd;\n    rii_check_posix(fd = open(path, flags));\n    ei_check(cork_consume_fd(consumer, fd));\n    rii_check_posix(close(fd));\n    return 0;\n\nerror:\n    rii_check_posix(close(fd));\n    return -1;\n}\n\n\n/*-----------------------------------------------------------------------\n * Consumers\n */\n\nstruct cork_file_consumer {\n    struct cork_stream_consumer  parent;\n    FILE  *fp;\n};\n\nstatic int\ncork_file_consumer__data(struct cork_stream_consumer *vself,\n                         const void *buf, size_t size, bool is_first)\n{\n    struct cork_file_consumer  *self =\n        cork_container_of(vself, struct cork_file_consumer, parent);\n    size_t  bytes_written = fwrite(buf, 1, size, self->fp);\n    /* If there was an error writing to the file, then signal this to\n     * the producer */\n    if (bytes_written == size) {\n        return 0;\n    } else {\n        cork_system_error_set();\n        return -1;\n    }\n}\n\nstatic int\ncork_file_consumer__eof(struct cork_stream_consumer *vself)\n{\n    /* We never close the file with this version of the consumer, so there's\n     * nothing special to do at end-of-stream. */\n    return 0;\n}\n\nstatic void\ncork_file_consumer__free(struct cork_stream_consumer *vself)\n{\n    struct cork_file_consumer  *self =\n        cork_container_of(vself, struct cork_file_consumer, parent);\n    cork_delete(struct cork_file_consumer, self);\n}\n\nstruct cork_stream_consumer *\ncork_file_consumer_new(FILE *fp)\n{\n    struct cork_file_consumer  *self = cork_new(struct cork_file_consumer);\n    self->parent.data = cork_file_consumer__data;\n    self->parent.eof = cork_file_consumer__eof;\n    self->parent.free = cork_file_consumer__free;\n    self->fp = fp;\n    return &self->parent;\n}\n\n\nstruct cork_fd_consumer {\n    struct cork_stream_consumer  parent;\n    int  fd;\n};\n\nstatic int\ncork_fd_consumer__data(struct cork_stream_consumer *vself,\n                       const void *buf, size_t size, bool is_first)\n{\n    struct cork_fd_consumer  *self =\n        cork_container_of(vself, struct cork_fd_consumer, parent);\n    size_t  bytes_left = size;\n\n    while (bytes_left > 0) {\n        ssize_t  rc = write(self->fd, buf, bytes_left);\n        if (rc == -1 && errno != EINTR) {\n            cork_system_error_set();\n            return -1;\n        } else {\n            bytes_left -= rc;\n            buf += rc;\n        }\n    }\n\n    return 0;\n}\n\nstatic int\ncork_fd_consumer__eof_close(struct cork_stream_consumer *vself)\n{\n    int  rc;\n    struct cork_fd_consumer  *self =\n        cork_container_of(vself, struct cork_fd_consumer, parent);\n    rii_check_posix(rc = close(self->fd));\n    return 0;\n}\n\nstatic void\ncork_fd_consumer__free(struct cork_stream_consumer *vself)\n{\n    struct cork_fd_consumer  *self =\n        cork_container_of(vself, struct cork_fd_consumer, parent);\n    cork_delete(struct cork_fd_consumer, self);\n}\n\nstruct cork_stream_consumer *\ncork_fd_consumer_new(int fd)\n{\n    struct cork_fd_consumer  *self = cork_new(struct cork_fd_consumer);\n    self->parent.data = cork_fd_consumer__data;\n    /* We don't want to close fd, so we reuse file_consumer's eof method */\n    self->parent.eof = cork_file_consumer__eof;\n    self->parent.free = cork_fd_consumer__free;\n    self->fd = fd;\n    return &self->parent;\n}\n\nstruct cork_stream_consumer *\ncork_file_from_path_consumer_new(const char *path, int flags)\n{\n\n    int  fd;\n    struct cork_fd_consumer  *self;\n\n    rpi_check_posix(fd = open(path, flags));\n    self = cork_new(struct cork_fd_consumer);\n    self->parent.data = cork_fd_consumer__data;\n    self->parent.eof = cork_fd_consumer__eof_close;\n    self->parent.free = cork_fd_consumer__free;\n    self->fd = fd;\n    return &self->parent;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/ds/hash-table.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <stdlib.h>\n#include <string.h>\n\n#include \"libcork/core/callbacks.h\"\n#include \"libcork/core/hash.h\"\n#include \"libcork/core/types.h\"\n#include \"libcork/ds/dllist.h\"\n#include \"libcork/ds/hash-table.h\"\n#include \"libcork/helpers/errors.h\"\n\n#ifndef CORK_HASH_TABLE_DEBUG\n#define CORK_HASH_TABLE_DEBUG 0\n#endif\n\n#if CORK_HASH_TABLE_DEBUG\n#include <stdio.h>\n#define DEBUG(...) \\\n    do { \\\n        fprintf(stderr, __VA_ARGS__); \\\n        fprintf(stderr, \"\\n\"); \\\n    } while (0)\n#else\n#define DEBUG(...) /* nothing */\n#endif\n\n\n/*-----------------------------------------------------------------------\n * Hash tables\n */\n\nstruct cork_hash_table_entry_priv {\n    struct cork_hash_table_entry  public;\n    struct cork_dllist_item  in_bucket;\n    struct cork_dllist_item  insertion_order;\n};\n\nstruct cork_hash_table {\n    struct cork_dllist  *bins;\n    struct cork_dllist  insertion_order;\n    size_t  bin_count;\n    size_t  bin_mask;\n    size_t  entry_count;\n    void  *user_data;\n    cork_free_f  free_user_data;\n    cork_hash_f  hash;\n    cork_equals_f  equals;\n    cork_free_f  free_key;\n    cork_free_f  free_value;\n};\n\nstatic cork_hash\ncork_hash_table__default_hash(void *user_data, const void *key)\n{\n    return (cork_hash) (uintptr_t) key;\n}\n\nstatic bool\ncork_hash_table__default_equals(void *user_data,\n                                const void *key1, const void *key2)\n{\n    return key1 == key2;\n}\n\n\n/* The default initial number of bins to allocate in a new table. */\n#define CORK_HASH_TABLE_DEFAULT_INITIAL_SIZE  8\n\n/* The default number of entries per bin to allow before increasing the\n * number of bins. */\n#define CORK_HASH_TABLE_MAX_DENSITY  5\n\n/* Return a power-of-2 bin count that's at least as big as the given requested\n * size. */\nstatic inline size_t\ncork_hash_table_new_size(size_t desired_count)\n{\n    size_t  v = desired_count;\n    size_t  r = 1;\n    while (v >>= 1) {\n        r <<= 1;\n    }\n    if (r != desired_count) {\n        r <<= 1;\n    }\n    return r;\n}\n\n#define bin_index(table, hash)  ((hash) & (table)->bin_mask)\n\n/* Allocates a new bins array in a hash table.  We overwrite the old\n * array, so make sure to stash it away somewhere safe first. */\nstatic void\ncork_hash_table_allocate_bins(struct cork_hash_table *table,\n                              size_t desired_count)\n{\n    size_t  i;\n\n    table->bin_count = cork_hash_table_new_size(desired_count);\n    table->bin_mask = table->bin_count - 1;\n    DEBUG(\"Allocate %zu bins\", table->bin_count);\n    table->bins = cork_calloc(table->bin_count, sizeof(struct cork_dllist));\n    for (i = 0; i < table->bin_count; i++) {\n        cork_dllist_init(&table->bins[i]);\n    }\n}\n\n\nstatic struct cork_hash_table_entry_priv *\ncork_hash_table_new_entry(struct cork_hash_table *table,\n                          cork_hash hash, void *key, void *value)\n{\n    struct cork_hash_table_entry_priv  *entry =\n        cork_new(struct cork_hash_table_entry_priv);\n    cork_dllist_add(&table->insertion_order, &entry->insertion_order);\n    entry->public.hash = hash;\n    entry->public.key = key;\n    entry->public.value = value;\n    return entry;\n}\n\nstatic void\ncork_hash_table_free_entry(struct cork_hash_table *table,\n                           struct cork_hash_table_entry_priv *entry)\n{\n    if (table->free_key != NULL) {\n        table->free_key(entry->public.key);\n    }\n    if (table->free_value != NULL) {\n        table->free_value(entry->public.value);\n    }\n    cork_dllist_remove(&entry->insertion_order);\n    cork_delete(struct cork_hash_table_entry_priv, entry);\n}\n\n\nstruct cork_hash_table *\ncork_hash_table_new(size_t initial_size, unsigned int flags)\n{\n    struct cork_hash_table  *table = cork_new(struct cork_hash_table);\n    table->entry_count = 0;\n    table->user_data = NULL;\n    table->free_user_data = NULL;\n    table->hash = cork_hash_table__default_hash;\n    table->equals = cork_hash_table__default_equals;\n    table->free_key = NULL;\n    table->free_value = NULL;\n    cork_dllist_init(&table->insertion_order);\n    if (initial_size < CORK_HASH_TABLE_DEFAULT_INITIAL_SIZE) {\n        initial_size = CORK_HASH_TABLE_DEFAULT_INITIAL_SIZE;\n    }\n    cork_hash_table_allocate_bins(table, initial_size);\n    return table;\n}\n\nvoid\ncork_hash_table_clear(struct cork_hash_table *table)\n{\n    size_t  i;\n    struct cork_dllist_item  *curr;\n    struct cork_dllist_item  *next;\n\n    DEBUG(\"(clear) Remove all entries\");\n    for (curr = cork_dllist_start(&table->insertion_order);\n         !cork_dllist_is_end(&table->insertion_order, curr);\n         curr = next) {\n        struct cork_hash_table_entry_priv  *entry =\n            cork_container_of\n            (curr, struct cork_hash_table_entry_priv, insertion_order);\n        next = curr->next;\n        cork_hash_table_free_entry(table, entry);\n    }\n    cork_dllist_init(&table->insertion_order);\n\n    DEBUG(\"(clear) Clear bins\");\n    for (i = 0; i < table->bin_count; i++) {\n        DEBUG(\"  Bin %zu\", i);\n        cork_dllist_init(&table->bins[i]);\n    }\n\n    table->entry_count = 0;\n}\n\nvoid\ncork_hash_table_free(struct cork_hash_table *table)\n{\n    cork_hash_table_clear(table);\n    cork_cfree(table->bins, table->bin_count, sizeof(struct cork_dllist));\n    cork_delete(struct cork_hash_table, table);\n}\n\nsize_t\ncork_hash_table_size(const struct cork_hash_table *table)\n{\n    return table->entry_count;\n}\n\nvoid\ncork_hash_table_set_user_data(struct cork_hash_table *table,\n                              void *user_data, cork_free_f free_user_data)\n{\n    table->user_data = user_data;\n    table->free_user_data = free_user_data;\n}\n\nvoid\ncork_hash_table_set_hash(struct cork_hash_table *table, cork_hash_f hash)\n{\n    table->hash = hash;\n}\n\nvoid\ncork_hash_table_set_equals(struct cork_hash_table *table, cork_equals_f equals)\n{\n    table->equals = equals;\n}\n\nvoid\ncork_hash_table_set_free_key(struct cork_hash_table *table, cork_free_f free)\n{\n    table->free_key = free;\n}\n\nvoid\ncork_hash_table_set_free_value(struct cork_hash_table *table, cork_free_f free)\n{\n    table->free_value = free;\n}\n\n\nvoid\ncork_hash_table_ensure_size(struct cork_hash_table *table, size_t desired_count)\n{\n    if (desired_count > table->bin_count) {\n        struct cork_dllist  *old_bins = table->bins;\n        size_t  old_bin_count = table->bin_count;\n\n        cork_hash_table_allocate_bins(table, desired_count);\n\n        if (old_bins != NULL) {\n            size_t  i;\n            for (i = 0; i < old_bin_count; i++) {\n                struct cork_dllist  *bin = &old_bins[i];\n                struct cork_dllist_item  *curr = cork_dllist_start(bin);\n                while (!cork_dllist_is_end(bin, curr)) {\n                    struct cork_hash_table_entry_priv  *entry =\n                        cork_container_of\n                        (curr, struct cork_hash_table_entry_priv, in_bucket);\n                    struct cork_dllist_item  *next = curr->next;\n\n                    size_t  bin_index = bin_index(table, entry->public.hash);\n                    DEBUG(\"      Rehash %p from bin %zu to bin %zu\",\n                          entry, i, bin_index);\n                    cork_dllist_add(&table->bins[bin_index], curr);\n\n                    curr = next;\n                }\n            }\n\n            cork_cfree(old_bins, old_bin_count, sizeof(struct cork_dllist));\n        }\n    }\n}\n\n\nstatic void\ncork_hash_table_rehash(struct cork_hash_table *table)\n{\n    DEBUG(\"    Reached maximum density; rehash\");\n    cork_hash_table_ensure_size(table, table->bin_count + 1);\n}\n\n\nstruct cork_hash_table_entry *\ncork_hash_table_get_entry_hash(const struct cork_hash_table *table,\n                               cork_hash hash, const void *key)\n{\n    size_t  bin_index;\n    struct cork_dllist  *bin;\n    struct cork_dllist_item  *curr;\n\n    if (table->bin_count == 0) {\n        DEBUG(\"(get) Empty table when searching for key %p \"\n              \"(hash 0x%08\" PRIx32 \")\",\n              key, hash);\n        return NULL;\n    }\n\n    bin_index = bin_index(table, hash);\n    DEBUG(\"(get) Search for key %p (hash 0x%08\" PRIx32 \", bin %zu)\",\n          key, hash, bin_index);\n\n    bin = &table->bins[bin_index];\n    curr = cork_dllist_start(bin);\n    while (!cork_dllist_is_end(bin, curr)) {\n        struct cork_hash_table_entry_priv  *entry =\n            cork_container_of\n            (curr, struct cork_hash_table_entry_priv, in_bucket);\n\n        DEBUG(\"  Check entry %p\", entry);\n        if (table->equals(table->user_data, key, entry->public.key)) {\n            DEBUG(\"  Match\");\n            return &entry->public;\n        }\n\n        curr = curr->next;\n    }\n\n    DEBUG(\"  Entry not found\");\n    return NULL;\n}\n\nstruct cork_hash_table_entry *\ncork_hash_table_get_entry(const struct cork_hash_table *table, const void *key)\n{\n    cork_hash  hash = table->hash(table->user_data, key);\n    return cork_hash_table_get_entry_hash(table, hash, key);\n}\n\nvoid *\ncork_hash_table_get_hash(const struct cork_hash_table *table,\n                         cork_hash hash, const void *key)\n{\n    struct cork_hash_table_entry  *entry =\n        cork_hash_table_get_entry_hash(table, hash, key);\n    if (entry == NULL) {\n        return NULL;\n    } else {\n        DEBUG(\"  Extract value pointer %p\", entry->value);\n        return entry->value;\n    }\n}\n\nvoid *\ncork_hash_table_get(const struct cork_hash_table *table, const void *key)\n{\n    struct cork_hash_table_entry  *entry =\n        cork_hash_table_get_entry(table, key);\n    if (entry == NULL) {\n        return NULL;\n    } else {\n        DEBUG(\"  Extract value pointer %p\", entry->value);\n        return entry->value;\n    }\n}\n\n\nstruct cork_hash_table_entry *\ncork_hash_table_get_or_create_hash(struct cork_hash_table *table,\n                                   cork_hash hash, void *key, bool *is_new)\n{\n    struct cork_hash_table_entry_priv  *entry;\n    size_t  bin_index;\n\n    if (table->bin_count > 0) {\n        struct cork_dllist  *bin;\n        struct cork_dllist_item  *curr;\n\n        bin_index = bin_index(table, hash);\n        DEBUG(\"(get_or_create) Search for key %p \"\n              \"(hash 0x%08\" PRIx32 \", bin %zu)\",\n              key, hash, bin_index);\n\n        bin = &table->bins[bin_index];\n        curr = cork_dllist_start(bin);\n        while (!cork_dllist_is_end(bin, curr)) {\n            struct cork_hash_table_entry_priv  *entry =\n                cork_container_of\n                (curr, struct cork_hash_table_entry_priv, in_bucket);\n\n            DEBUG(\"  Check entry %p\", entry);\n            if (table->equals(table->user_data, key, entry->public.key)) {\n                DEBUG(\"    Match\");\n                DEBUG(\"    Return value pointer %p\", entry->public.value);\n                *is_new = false;\n                return &entry->public;\n            }\n\n            curr = curr->next;\n        }\n\n        /* create a new entry */\n        DEBUG(\"  Entry not found\");\n\n        if ((table->entry_count / table->bin_count) >\n            CORK_HASH_TABLE_MAX_DENSITY) {\n            cork_hash_table_rehash(table);\n            bin_index = bin_index(table, hash);\n        }\n    } else {\n        DEBUG(\"(get_or_create) Search for key %p (hash 0x%08\" PRIx32 \")\",\n              key, hash);\n        DEBUG(\"  Empty table\");\n        cork_hash_table_rehash(table);\n        bin_index = bin_index(table, hash);\n    }\n\n    DEBUG(\"    Allocate new entry\");\n    entry = cork_hash_table_new_entry(table, hash, key, NULL);\n    DEBUG(\"    Created new entry %p\", entry);\n\n    DEBUG(\"    Add entry into bin %zu\", bin_index);\n    cork_dllist_add(&table->bins[bin_index], &entry->in_bucket);\n\n    table->entry_count++;\n    *is_new = true;\n    return &entry->public;\n}\n\nstruct cork_hash_table_entry *\ncork_hash_table_get_or_create(struct cork_hash_table *table,\n                              void *key, bool *is_new)\n{\n    cork_hash  hash = table->hash(table->user_data, key);\n    return cork_hash_table_get_or_create_hash(table, hash, key, is_new);\n}\n\n\nvoid\ncork_hash_table_put_hash(struct cork_hash_table *table,\n                         cork_hash hash, void *key, void *value,\n                         bool *is_new, void **old_key, void **old_value)\n{\n    struct cork_hash_table_entry_priv  *entry;\n    size_t  bin_index;\n\n    if (table->bin_count > 0) {\n        struct cork_dllist  *bin;\n        struct cork_dllist_item  *curr;\n\n        bin_index = bin_index(table, hash);\n        DEBUG(\"(put) Search for key %p (hash 0x%08\" PRIx32 \", bin %zu)\",\n              key, hash, bin_index);\n\n        bin = &table->bins[bin_index];\n        curr = cork_dllist_start(bin);\n        while (!cork_dllist_is_end(bin, curr)) {\n            struct cork_hash_table_entry_priv  *entry =\n                cork_container_of\n                (curr, struct cork_hash_table_entry_priv, in_bucket);\n\n            DEBUG(\"  Check entry %p\", entry);\n            if (table->equals(table->user_data, key, entry->public.key)) {\n                DEBUG(\"    Found existing entry; overwriting\");\n                DEBUG(\"    Return old key %p\", entry->public.key);\n                if (old_key != NULL) {\n                    *old_key = entry->public.key;\n                }\n                DEBUG(\"    Return old value %p\", entry->public.value);\n                if (old_value != NULL) {\n                    *old_value = entry->public.value;\n                }\n                DEBUG(\"    Copy key %p into entry\", key);\n                entry->public.key = key;\n                DEBUG(\"    Copy value %p into entry\", value);\n                entry->public.value = value;\n                if (is_new != NULL) {\n                    *is_new = false;\n                }\n                return;\n            }\n\n            curr = curr->next;\n        }\n\n        /* create a new entry */\n        DEBUG(\"  Entry not found\");\n        if ((table->entry_count / table->bin_count) >\n            CORK_HASH_TABLE_MAX_DENSITY) {\n            cork_hash_table_rehash(table);\n            bin_index = bin_index(table, hash);\n        }\n    } else {\n        DEBUG(\"(put) Search for key %p (hash 0x%08\" PRIx32 \")\",\n              key, hash);\n        DEBUG(\"  Empty table\");\n        cork_hash_table_rehash(table);\n        bin_index = bin_index(table, hash);\n    }\n\n    DEBUG(\"    Allocate new entry\");\n    entry = cork_hash_table_new_entry(table, hash, key, value);\n    DEBUG(\"    Created new entry %p\", entry);\n\n    DEBUG(\"    Add entry into bin %zu\", bin_index);\n    cork_dllist_add(&table->bins[bin_index], &entry->in_bucket);\n\n    table->entry_count++;\n    if (old_key != NULL) {\n        *old_key = NULL;\n    }\n    if (old_value != NULL) {\n        *old_value = NULL;\n    }\n    if (is_new != NULL) {\n        *is_new = true;\n    }\n}\n\nvoid\ncork_hash_table_put(struct cork_hash_table *table,\n                    void *key, void *value,\n                    bool *is_new, void **old_key, void **old_value)\n{\n    cork_hash  hash = table->hash(table->user_data, key);\n    cork_hash_table_put_hash\n        (table, hash, key, value, is_new, old_key, old_value);\n}\n\n\nvoid\ncork_hash_table_delete_entry(struct cork_hash_table *table,\n                             struct cork_hash_table_entry *ventry)\n{\n    struct cork_hash_table_entry_priv  *entry =\n        cork_container_of(ventry, struct cork_hash_table_entry_priv, public);\n    cork_dllist_remove(&entry->in_bucket);\n    table->entry_count--;\n    cork_hash_table_free_entry(table, entry);\n}\n\n\nbool\ncork_hash_table_delete_hash(struct cork_hash_table *table,\n                            cork_hash hash, const void *key,\n                            void **deleted_key, void **deleted_value)\n{\n    size_t  bin_index;\n    struct cork_dllist  *bin;\n    struct cork_dllist_item  *curr;\n\n    if (table->bin_count == 0) {\n        DEBUG(\"(delete) Empty table when searching for key %p \"\n              \"(hash 0x%08\" PRIx32 \")\",\n              key, hash);\n        return false;\n    }\n\n    bin_index = bin_index(table, hash);\n    DEBUG(\"(delete) Search for key %p (hash 0x%08\" PRIx32 \", bin %zu)\",\n          key, hash, bin_index);\n\n    bin = &table->bins[bin_index];\n    curr = cork_dllist_start(bin);\n    while (!cork_dllist_is_end(bin, curr)) {\n        struct cork_hash_table_entry_priv  *entry =\n            cork_container_of\n            (curr, struct cork_hash_table_entry_priv, in_bucket);\n\n        DEBUG(\"  Check entry %p\", entry);\n        if (table->equals(table->user_data, key, entry->public.key)) {\n            DEBUG(\"    Match\");\n            if (deleted_key != NULL) {\n                *deleted_key = entry->public.key;\n            }\n            if (deleted_value != NULL) {\n                *deleted_value = entry->public.value;\n            }\n\n            DEBUG(\"    Remove entry from hash bin %zu\", bin_index);\n            cork_dllist_remove(curr);\n            table->entry_count--;\n\n            DEBUG(\"    Free entry %p\", entry);\n            cork_hash_table_free_entry(table, entry);\n            return true;\n        }\n\n        curr = curr->next;\n    }\n\n    DEBUG(\"  Entry not found\");\n    return false;\n}\n\nbool\ncork_hash_table_delete(struct cork_hash_table *table, const void *key,\n                       void **deleted_key, void **deleted_value)\n{\n    cork_hash  hash = table->hash(table->user_data, key);\n    return cork_hash_table_delete_hash\n        (table, hash, key, deleted_key, deleted_value);\n}\n\n\nvoid\ncork_hash_table_map(struct cork_hash_table *table, void *user_data,\n                    cork_hash_table_map_f map)\n{\n    struct cork_dllist_item  *curr;\n    DEBUG(\"Map across hash table\");\n\n    curr = cork_dllist_start(&table->insertion_order);\n    while (!cork_dllist_is_end(&table->insertion_order, curr)) {\n        struct cork_hash_table_entry_priv  *entry =\n            cork_container_of\n            (curr, struct cork_hash_table_entry_priv, insertion_order);\n        struct cork_dllist_item  *next = curr->next;\n        enum cork_hash_table_map_result  result;\n\n        DEBUG(\"    Apply function to entry %p\", entry);\n        result = map(user_data, &entry->public);\n\n        if (result == CORK_HASH_TABLE_MAP_ABORT) {\n            return;\n        } else if (result == CORK_HASH_TABLE_MAP_DELETE) {\n            DEBUG(\"      Delete requested\");\n            cork_dllist_remove(curr);\n            cork_dllist_remove(&entry->in_bucket);\n            table->entry_count--;\n            cork_hash_table_free_entry(table, entry);\n        }\n\n        curr = next;\n    }\n}\n\n\nvoid\ncork_hash_table_iterator_init(struct cork_hash_table *table,\n                              struct cork_hash_table_iterator *iterator)\n{\n    DEBUG(\"Iterate through hash table\");\n    iterator->table = table;\n    iterator->priv = cork_dllist_start(&table->insertion_order);\n}\n\n\nstruct cork_hash_table_entry *\ncork_hash_table_iterator_next(struct cork_hash_table_iterator *iterator)\n{\n    struct cork_hash_table  *table = iterator->table;\n    struct cork_dllist_item  *curr = iterator->priv;\n    struct cork_hash_table_entry_priv  *entry;\n\n    if (cork_dllist_is_end(&table->insertion_order, curr)) {\n        return NULL;\n    }\n\n    entry = cork_container_of\n        (curr, struct cork_hash_table_entry_priv, insertion_order);\n    DEBUG(\"    Return entry %p\", entry);\n    iterator->priv = curr->next;\n    return &entry->public;\n}\n\n\n/*-----------------------------------------------------------------------\n * Built-in key types\n */\n\nstatic cork_hash\nstring_hash(void *user_data, const void *vk)\n{\n    const char  *k = vk;\n    size_t  len = strlen(k);\n    return cork_hash_buffer(0, k, len);\n}\n\nstatic bool\nstring_equals(void *user_data, const void *vk1, const void *vk2)\n{\n    const char  *k1 = vk1;\n    const char  *k2 = vk2;\n    return strcmp(k1, k2) == 0;\n}\n\nstruct cork_hash_table *\ncork_string_hash_table_new(size_t initial_size, unsigned int flags)\n{\n    struct cork_hash_table  *table = cork_hash_table_new(initial_size, flags);\n    cork_hash_table_set_hash(table, string_hash);\n    cork_hash_table_set_equals(table, string_equals);\n    return table;\n}\n\nstruct cork_hash_table *\ncork_pointer_hash_table_new(size_t initial_size, unsigned int flags)\n{\n    return cork_hash_table_new(initial_size, flags);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/ds/managed-buffer.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <stdlib.h>\n#include <string.h>\n\n#include \"libcork/core/error.h\"\n#include \"libcork/core/types.h\"\n#include \"libcork/ds/managed-buffer.h\"\n#include \"libcork/ds/slice.h\"\n#include \"libcork/helpers/errors.h\"\n\n\n/*-----------------------------------------------------------------------\n * Error handling\n */\n\nstatic void\ncork_slice_invalid_slice_set(size_t buf_size, size_t requested_offset,\n                             size_t requested_length)\n{\n    cork_error_set\n        (CORK_SLICE_ERROR, CORK_SLICE_INVALID_SLICE,\n         \"Cannot slice %zu-byte buffer at %zu:%zu\",\n         buf_size, requested_offset, requested_length);\n}\n\n\n/*-----------------------------------------------------------------------\n * Managed buffers\n */\n\nstruct cork_managed_buffer_wrapped {\n    struct cork_managed_buffer  parent;\n    void  *buf;\n    size_t  size;\n    cork_managed_buffer_freer  free;\n};\n\nstatic void\ncork_managed_buffer_wrapped__free(struct cork_managed_buffer *vself)\n{\n    struct cork_managed_buffer_wrapped  *self =\n        cork_container_of(vself, struct cork_managed_buffer_wrapped, parent);\n    self->free(self->buf, self->size);\n    cork_delete(struct cork_managed_buffer_wrapped, self);\n}\n\nstatic struct cork_managed_buffer_iface  CORK_MANAGED_BUFFER_WRAPPED = {\n    cork_managed_buffer_wrapped__free\n};\n\nstruct cork_managed_buffer *\ncork_managed_buffer_new(const void *buf, size_t size,\n                        cork_managed_buffer_freer free)\n{\n    /*\n    DEBUG(\"Creating new struct cork_managed_buffer [%p:%zu], refcount now 1\",\n          buf, size);\n    */\n\n    struct cork_managed_buffer_wrapped  *self =\n        cork_new(struct cork_managed_buffer_wrapped);\n    self->parent.buf = buf;\n    self->parent.size = size;\n    self->parent.ref_count = 1;\n    self->parent.iface = &CORK_MANAGED_BUFFER_WRAPPED;\n    self->buf = (void *) buf;\n    self->size = size;\n    self->free = free;\n    return &self->parent;\n}\n\n\nstruct cork_managed_buffer_copied {\n    struct cork_managed_buffer  parent;\n};\n\n#define cork_managed_buffer_copied_data(self) \\\n    (((void *) (self)) + sizeof(struct cork_managed_buffer_copied))\n\n#define cork_managed_buffer_copied_sizeof(sz) \\\n    ((sz) + sizeof(struct cork_managed_buffer_copied))\n\nstatic void\ncork_managed_buffer_copied__free(struct cork_managed_buffer *vself)\n{\n    struct cork_managed_buffer_copied  *self =\n        cork_container_of(vself, struct cork_managed_buffer_copied, parent);\n    size_t  allocated_size =\n        cork_managed_buffer_copied_sizeof(self->parent.size);\n    cork_free(self, allocated_size);\n}\n\nstatic struct cork_managed_buffer_iface  CORK_MANAGED_BUFFER_COPIED = {\n    cork_managed_buffer_copied__free\n};\n\nstruct cork_managed_buffer *\ncork_managed_buffer_new_copy(const void *buf, size_t size)\n{\n    size_t  allocated_size = cork_managed_buffer_copied_sizeof(size);\n    struct cork_managed_buffer_copied  *self = cork_malloc(allocated_size);\n    if (self == NULL) {\n        return NULL;\n    }\n\n    self->parent.buf = cork_managed_buffer_copied_data(self);\n    self->parent.size = size;\n    self->parent.ref_count = 1;\n    self->parent.iface = &CORK_MANAGED_BUFFER_COPIED;\n    memcpy((void *) self->parent.buf, buf, size);\n    return &self->parent;\n}\n\n\nstatic void\ncork_managed_buffer_free(struct cork_managed_buffer *self)\n{\n    /*\n    DEBUG(\"Freeing struct cork_managed_buffer [%p:%zu]\", self->buf, self->size);\n    */\n\n    self->iface->free(self);\n}\n\n\nstruct cork_managed_buffer *\ncork_managed_buffer_ref(struct cork_managed_buffer *self)\n{\n    /*\n    int  old_count = self->ref_count++;\n    DEBUG(\"Referencing struct cork_managed_buffer [%p:%zu], refcount now %d\",\n          self->buf, self->size, old_count + 1);\n    */\n\n    self->ref_count++;\n    return self;\n}\n\n\nvoid\ncork_managed_buffer_unref(struct cork_managed_buffer *self)\n{\n    /*\n    int  old_count = self->ref_count--;\n    DEBUG(\"Dereferencing struct cork_managed_buffer [%p:%zu], refcount now %d\",\n          self->buf, self->size, old_count - 1);\n    */\n\n    if (--self->ref_count == 0) {\n        cork_managed_buffer_free(self);\n    }\n}\n\n\nstatic struct cork_slice_iface  CORK_MANAGED_BUFFER__SLICE;\n\nstatic void\ncork_managed_buffer__slice_free(struct cork_slice *self)\n{\n    struct cork_managed_buffer  *mbuf = self->user_data;\n    cork_managed_buffer_unref(mbuf);\n}\n\nstatic int\ncork_managed_buffer__slice_copy(struct cork_slice *dest,\n                                const struct cork_slice *src,\n                                size_t offset, size_t length)\n{\n    struct cork_managed_buffer  *mbuf = src->user_data;\n    dest->buf = src->buf + offset;\n    dest->size = length;\n    dest->iface = &CORK_MANAGED_BUFFER__SLICE;\n    dest->user_data = cork_managed_buffer_ref(mbuf);\n    return 0;\n}\n\nstatic struct cork_slice_iface  CORK_MANAGED_BUFFER__SLICE = {\n    cork_managed_buffer__slice_free,\n    cork_managed_buffer__slice_copy,\n    cork_managed_buffer__slice_copy,\n    NULL\n};\n\n\nint\ncork_managed_buffer_slice(struct cork_slice *dest,\n                          struct cork_managed_buffer *buffer,\n                          size_t offset, size_t length)\n{\n    if ((buffer != NULL) &&\n        (offset <= buffer->size) &&\n        ((offset + length) <= buffer->size)) {\n        /*\n        DEBUG(\"Slicing [%p:%zu] at %zu:%zu, gives <%p:%zu>\",\n              buffer->buf, buffer->size,\n              offset, length,\n              buffer->buf + offset, length);\n        */\n        dest->buf = buffer->buf + offset;\n        dest->size = length;\n        dest->iface = &CORK_MANAGED_BUFFER__SLICE;\n        dest->user_data = cork_managed_buffer_ref(buffer);\n        return 0;\n    }\n\n    else {\n        /*\n        DEBUG(\"Cannot slice [%p:%zu] at %zu:%zu\",\n              buffer->buf, buffer->size,\n              offset, length);\n        */\n        cork_slice_clear(dest);\n        cork_slice_invalid_slice_set(0, offset, 0);\n        return -1;\n    }\n}\n\n\nint\ncork_managed_buffer_slice_offset(struct cork_slice *dest,\n                                 struct cork_managed_buffer *buffer,\n                                 size_t offset)\n{\n    if (buffer == NULL) {\n        cork_slice_clear(dest);\n        cork_slice_invalid_slice_set(0, offset, 0);\n        return -1;\n    } else {\n        return cork_managed_buffer_slice\n            (dest, buffer, offset, buffer->size - offset);\n    }\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/ds/ring-buffer.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <stdlib.h>\n\n#include \"libcork/core/allocator.h\"\n#include \"libcork/core/types.h\"\n#include \"libcork/ds/ring-buffer.h\"\n\n\nint\ncork_ring_buffer_init(struct cork_ring_buffer *self, size_t size)\n{\n    self->elements = cork_calloc(size, sizeof(void *));\n    self->allocated_size = size;\n    self->size = 0;\n    self->read_index = 0;\n    self->write_index = 0;\n    return 0;\n}\n\nstruct cork_ring_buffer *\ncork_ring_buffer_new(size_t size)\n{\n    struct cork_ring_buffer  *buf = cork_new(struct cork_ring_buffer);\n    cork_ring_buffer_init(buf, size);\n    return buf;\n}\n\nvoid\ncork_ring_buffer_done(struct cork_ring_buffer *self)\n{\n    cork_cfree(self->elements, self->allocated_size, sizeof(void *));\n}\n\nvoid\ncork_ring_buffer_free(struct cork_ring_buffer *buf)\n{\n    cork_ring_buffer_done(buf);\n    cork_delete(struct cork_ring_buffer, buf);\n}\n\nint\ncork_ring_buffer_add(struct cork_ring_buffer *self, void *element)\n{\n    if (cork_ring_buffer_is_full(self)) {\n        return -1;\n    }\n\n    self->elements[self->write_index++] = element;\n    self->size++;\n    if (self->write_index == self->allocated_size) {\n        self->write_index = 0;\n    }\n    return 0;\n}\n\nvoid *\ncork_ring_buffer_pop(struct cork_ring_buffer *self)\n{\n    if (cork_ring_buffer_is_empty(self)) {\n        return NULL;\n    } else {\n        void  *result = self->elements[self->read_index++];\n        self->size--;\n        if (self->read_index == self->allocated_size) {\n            self->read_index = 0;\n        }\n        return result;\n    }\n}\n\nvoid *\ncork_ring_buffer_peek(struct cork_ring_buffer *self)\n{\n    if (cork_ring_buffer_is_empty(self)) {\n        return NULL;\n    } else {\n        return self->elements[self->read_index];\n    }\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/ds/slice.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <string.h>\n\n#include \"libcork/core/error.h\"\n#include \"libcork/core/types.h\"\n#include \"libcork/ds/managed-buffer.h\"\n#include \"libcork/ds/slice.h\"\n#include \"libcork/helpers/errors.h\"\n\n\n/*-----------------------------------------------------------------------\n * Error handling\n */\n\nstatic void\ncork_slice_invalid_slice_set(size_t buf_size, size_t requested_offset,\n                             size_t requested_length)\n{\n    cork_error_set\n        (CORK_SLICE_ERROR, CORK_SLICE_INVALID_SLICE,\n         \"Cannot slice %zu-byte buffer at %zu:%zu\",\n         buf_size, requested_offset, requested_length);\n}\n\n\n/*-----------------------------------------------------------------------\n * Slices\n */\n\nvoid\ncork_slice_clear(struct cork_slice *slice)\n{\n    slice->buf = NULL;\n    slice->size = 0;\n    slice->iface = NULL;\n    slice->user_data = NULL;\n}\n\n\nint\ncork_slice_copy(struct cork_slice *dest, const struct cork_slice *slice,\n                size_t offset, size_t length)\n{\n    if ((slice != NULL) &&\n        (offset <= slice->size) &&\n        ((offset + length) <= slice->size)) {\n        /*\n        DEBUG(\"Slicing <%p:%zu> at %zu:%zu, gives <%p:%zu>\",\n              slice->buf, slice->size,\n              offset, length,\n              slice->buf + offset, length);\n        */\n        return slice->iface->copy(dest, slice, offset, length);\n    }\n\n    else {\n        /*\n        DEBUG(\"Cannot slice <%p:%zu> at %zu:%zu\",\n              slice->buf, slice->size,\n              offset, length);\n        */\n        cork_slice_clear(dest);\n        cork_slice_invalid_slice_set\n            ((slice == NULL)? 0: slice->size, offset, length);\n        return -1;\n    }\n}\n\n\nint\ncork_slice_copy_offset(struct cork_slice *dest, const struct cork_slice *slice,\n                       size_t offset)\n{\n    if (slice == NULL) {\n        cork_slice_clear(dest);\n        cork_slice_invalid_slice_set(0, offset, 0);\n        return -1;\n    } else {\n        return cork_slice_copy\n            (dest, slice, offset, slice->size - offset);\n    }\n}\n\n\nint\ncork_slice_light_copy(struct cork_slice *dest, const struct cork_slice *slice,\n                      size_t offset, size_t length)\n{\n    if ((slice != NULL) &&\n        (offset <= slice->size) &&\n        ((offset + length) <= slice->size)) {\n        /*\n        DEBUG(\"Slicing <%p:%zu> at %zu:%zu, gives <%p:%zu>\",\n              slice->buf, slice->size,\n              offset, length,\n              slice->buf + offset, length);\n        */\n        return slice->iface->light_copy(dest, slice, offset, length);\n    }\n\n    else {\n        /*\n        DEBUG(\"Cannot slice <%p:%zu> at %zu:%zu\",\n              slice->buf, slice->size,\n              offset, length);\n        */\n        cork_slice_clear(dest);\n        cork_slice_invalid_slice_set\n            ((slice == NULL)? 0: slice->size, offset, length);\n        return -1;\n    }\n}\n\n\nint\ncork_slice_light_copy_offset(struct cork_slice *dest,\n                             const struct cork_slice *slice, size_t offset)\n{\n    if (slice == NULL) {\n        cork_slice_clear(dest);\n        cork_slice_invalid_slice_set(0, offset, 0);\n        return -1;\n    } else {\n        return cork_slice_light_copy\n            (dest, slice, offset, slice->size - offset);\n    }\n}\n\n\nint\ncork_slice_slice(struct cork_slice *slice, size_t offset, size_t length)\n{\n    if ((slice != NULL) &&\n        (offset <= slice->size) &&\n        ((offset + length) <= slice->size)) {\n        /*\n        DEBUG(\"Slicing <%p:%zu> at %zu:%zu, gives <%p:%zu>\",\n              slice->buf, slice->size,\n              offset, length,\n              slice->buf + offset, length);\n        */\n        if (slice->iface->slice == NULL) {\n            slice->buf += offset;\n            slice->size = length;\n            return 0;\n        } else {\n            return slice->iface->slice(slice, offset, length);\n        }\n    }\n\n    else {\n        /*\n        DEBUG(\"Cannot slice <%p:%zu> at %zu:%zu\",\n              slice->buf, slice->size,\n              offset, length);\n        */\n        if (slice != NULL)\n            cork_slice_invalid_slice_set(slice->size, offset, length);\n        return -1;\n    }\n}\n\n\nint\ncork_slice_slice_offset(struct cork_slice *slice, size_t offset)\n{\n    if (slice == NULL) {\n        cork_slice_invalid_slice_set(0, offset, 0);\n        return -1;\n    } else {\n        return cork_slice_slice\n            (slice, offset, slice->size - offset);\n    }\n}\n\n\nvoid\ncork_slice_finish(struct cork_slice *slice)\n{\n    /*\n    DEBUG(\"Finalizing <%p:%zu>\", dest->buf, dest->size);\n    */\n\n    if (slice->iface != NULL && slice->iface->free != NULL) {\n        slice->iface->free(slice);\n    }\n\n    cork_slice_clear(slice);\n}\n\n\nbool\ncork_slice_equal(const struct cork_slice *slice1,\n                 const struct cork_slice *slice2)\n{\n    if (slice1 == slice2) {\n        return true;\n    }\n\n    if (slice1->size != slice2->size) {\n        return false;\n    }\n\n    return (memcmp(slice1->buf, slice2->buf, slice1->size) == 0);\n}\n\n\n/*-----------------------------------------------------------------------\n * Slices of static content\n */\n\nstatic struct cork_slice_iface  cork_static_slice;\n\nstatic int\ncork_static_slice_copy(struct cork_slice *dest, const struct cork_slice *src,\n                       size_t offset, size_t length)\n{\n    dest->buf = src->buf + offset;\n    dest->size = length;\n    dest->iface = &cork_static_slice;\n    dest->user_data = NULL;\n    return 0;\n}\n\nstatic struct cork_slice_iface  cork_static_slice = {\n    NULL,\n    cork_static_slice_copy,\n    cork_static_slice_copy,\n    NULL\n};\n\nvoid\ncork_slice_init_static(struct cork_slice *dest, const void *buf, size_t size)\n{\n    dest->buf = buf;\n    dest->size = size;\n    dest->iface = &cork_static_slice;\n    dest->user_data = NULL;\n}\n\n\n/*-----------------------------------------------------------------------\n * Copy-once slices\n */\n\nstatic struct cork_slice_iface  cork_copy_once_slice;\n\nstatic int\ncork_copy_once_slice__copy(struct cork_slice *dest,\n                           const struct cork_slice *src,\n                           size_t offset, size_t length)\n{\n    struct cork_managed_buffer  *mbuf =\n        cork_managed_buffer_new_copy(src->buf, src->size);\n    rii_check(cork_managed_buffer_slice(dest, mbuf, offset, length));\n    rii_check(cork_managed_buffer_slice\n              ((struct cork_slice *) src, mbuf, 0, src->size));\n    cork_managed_buffer_unref(mbuf);\n    return 0;\n}\n\nstatic int\ncork_copy_once_slice__light_copy(struct cork_slice *dest,\n                                 const struct cork_slice *src,\n                                 size_t offset, size_t length)\n{\n    dest->buf = src->buf + offset;\n    dest->size = length;\n    dest->iface = &cork_copy_once_slice;\n    dest->user_data = NULL;\n    return 0;\n}\n\nstatic struct cork_slice_iface  cork_copy_once_slice = {\n    NULL,\n    cork_copy_once_slice__copy,\n    cork_copy_once_slice__light_copy,\n    NULL\n};\n\nvoid\ncork_slice_init_copy_once(struct cork_slice *dest, const void *buf, size_t size)\n{\n    dest->buf = buf;\n    dest->size = size;\n    dest->iface = &cork_copy_once_slice;\n    dest->user_data = NULL;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/cli/commands.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_COMMANDS_H\n#define LIBCORK_COMMANDS_H\n\n#include <libcork/core/api.h>\n\n\ntypedef void\n(*cork_leaf_command_run)(int argc, char **argv);\n\ntypedef int\n(*cork_option_parser)(int argc, char **argv);\n\nenum cork_command_type {\n    CORK_COMMAND_SET,\n    CORK_LEAF_COMMAND\n};\n\nstruct cork_command {\n    enum cork_command_type  type;\n    const char  *name;\n    const char  *short_desc;\n    const char  *usage_suffix;\n    const char  *full_help;\n\n    int\n    (*parse_options)(int argc, char **argv);\n\n    struct cork_command  **set;\n    cork_leaf_command_run  run;\n};\n\n#define cork_command_set(name, sd, parse_options, set) \\\n{ \\\n    CORK_COMMAND_SET, name, sd, NULL, NULL, \\\n    parse_options, set, NULL \\\n}\n\n#define cork_leaf_command(name, sd, us, fh, parse_options, run) \\\n{ \\\n    CORK_LEAF_COMMAND, name, sd, us, fh, \\\n    parse_options, NULL, run \\\n}\n\nCORK_API void\ncork_command_show_help(struct cork_command *command, const char *message);\n\nCORK_API int\ncork_command_main(struct cork_command *root, int argc, char **argv);\n\n\n#endif /* LIBCORK_COMMANDS_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/cli.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CLI_H\n#define LIBCORK_CLI_H\n\n/*** include all of the parts ***/\n\n#include <libcork/cli/commands.h>\n\n#endif /* LIBCORK_CLI_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/config/arch.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012-2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CONFIG_ARCH_H\n#define LIBCORK_CONFIG_ARCH_H\n\n\n/*-----------------------------------------------------------------------\n * Platform\n */\n\n#if defined(__i386__) || defined(_M_IX86)\n#define CORK_CONFIG_ARCH_X86  1\n#else\n#define CORK_CONFIG_ARCH_X86  0\n#endif\n\n#if defined(__x86_64__) || defined(_M_X64)\n#define CORK_CONFIG_ARCH_X64  1\n#else\n#define CORK_CONFIG_ARCH_X64  0\n#endif\n\n#if defined(__powerpc__) || defined(__ppc__)\n/* GCC-ish compiler */\n#define CORK_CONFIG_ARCH_PPC  1\n#elif defined(_M_PPC)\n/* VS-ish compiler */\n#define CORK_CONFIG_ARCH_PPC  1\n#elif defined(_ARCH_PPC)\n/* Something called XL C/C++? */\n#define CORK_CONFIG_ARCH_PPC  1\n#else\n#define CORK_CONFIG_ARCH_PPC  0\n#endif\n\n\n#endif /* LIBCORK_CONFIG_ARCH_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/config/bsd.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CONFIG_BSD_H\n#define LIBCORK_CONFIG_BSD_H\n\n/*-----------------------------------------------------------------------\n * Endianness\n */\n\n#include <sys/endian.h>\n\n#if BYTE_ORDER == BIG_ENDIAN\n#define CORK_CONFIG_IS_BIG_ENDIAN      1\n#define CORK_CONFIG_IS_LITTLE_ENDIAN   0\n#elif BYTE_ORDER == LITTLE_ENDIAN\n#define CORK_CONFIG_IS_BIG_ENDIAN      0\n#define CORK_CONFIG_IS_LITTLE_ENDIAN   1\n#else\n#error \"Cannot determine system endianness\"\n#endif\n\n#define CORK_HAVE_REALLOCF  1\n#define CORK_HAVE_PTHREADS  1\n\n\n#endif /* LIBCORK_CONFIG_BSD_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/config/config.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2015, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CONFIG_CONFIG_H\n#define LIBCORK_CONFIG_CONFIG_H\n\n\n/* If you want to skip autodetection, define this to 1, and provide a\n * libcork/config/custom.h header file. */\n\n#if !defined(CORK_CONFIG_SKIP_AUTODETECT)\n#define CORK_CONFIG_SKIP_AUTODETECT  0\n#endif\n\n\n#if CORK_CONFIG_SKIP_AUTODETECT\n/* The user has promised that they'll define everything themselves. */\n#include <libcork/config/custom.h>\n\n#else\n/* Otherwise autodetect! */\n\n\n/**** VERSION ****/\n\n#include <libcork/config/version.h>\n\n\n/**** ARCHITECTURES ****/\n\n#include <libcork/config/arch.h>\n\n\n/**** PLATFORMS ****/\n#if (defined(__unix__) || defined(unix)) && !defined(USG)\n/* We need this to test for BSD, but it's a good idea to have for\n * any brand of Unix.*/\n#include <sys/param.h>\n#endif\n\n#if defined(__linux) || defined(__CYGWIN__) || defined(__FreeBSD_kernel__) || defined(__GNU__)\n/* Do some Linux, kFreeBSD or GNU/Hurd specific autodetection. */\n#include <libcork/config/linux.h>\n\n#elif defined(__APPLE__) && defined(__MACH__)\n/* Do some Mac OS X-specific autodetection. */\n#include <libcork/config/macosx.h>\n\n#elif defined(BSD) && (BSD >= 199103)\n/* Do some BSD (4.3 code base or newer)specific autodetection. */\n#include <libcork/config/bsd.h>\n\n#elif defined(__MINGW32__)\n/* Do some mingw32 autodetection. */\n#include <libcork/config/mingw32.h>\n\n#elif defined(__sun)\n/* Do some Solaris autodetection. */\n#include <libcork/config/solaris.h>\n\n#endif  /* platforms */\n\n\n/**** COMPILERS ****/\n\n#if defined(__GNUC__)\n/* Do some GCC-specific autodetection. */\n#include <libcork/config/gcc.h>\n\n#endif  /* compilers */\n\n\n#endif  /* autodetect or not */\n\n\n#endif /* LIBCORK_CONFIG_CONFIG_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/config/gcc.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CONFIG_GCC_H\n#define LIBCORK_CONFIG_GCC_H\n\n/* Figure out the GCC version */\n\n#if defined(__GNUC_PATCHLEVEL__)\n#define CORK_CONFIG_GCC_VERSION (__GNUC__ * 10000 \\\n                               + __GNUC_MINOR__ * 100 \\\n                               + __GNUC_PATCHLEVEL__)\n#else\n#define CORK_CONFIG_GCC_VERSION (__GNUC__ * 10000 \\\n                               + __GNUC_MINOR__ * 100)\n#endif\n\n\n/*-----------------------------------------------------------------------\n * Compiler attributes\n */\n\n/* The GCC assembly syntax has been available basically forever. */\n\n#if defined(CORK_CONFIG_GCC_VERSION)\n#define CORK_CONFIG_HAVE_GCC_ASM  1\n#else\n#define CORK_CONFIG_HAVE_GCC_ASM  0\n#endif\n\n/* The GCC atomic instrinsics are available as of GCC 4.1.0. */\n\n#if CORK_CONFIG_GCC_VERSION >= 40100\n#define CORK_CONFIG_HAVE_GCC_ATOMICS  1\n#else\n#define CORK_CONFIG_HAVE_GCC_ATOMICS  0\n#endif\n\n/* The attributes we want to use are available as of GCC 2.96. */\n\n#if CORK_CONFIG_GCC_VERSION >= 29600\n#define CORK_CONFIG_HAVE_GCC_ATTRIBUTES  1\n#else\n#define CORK_CONFIG_HAVE_GCC_ATTRIBUTES  0\n#endif\n\n/* __int128 seems to be available on 64-bit platforms as of GCC 4.6.  The\n * attribute((mode(TI))) syntax seems to be available as of 4.1. */\n\n#if CORK_CONFIG_ARCH_X64 && CORK_CONFIG_GCC_VERSION >= 40600\n#define CORK_CONFIG_HAVE_GCC_INT128  1\n#else\n#define CORK_CONFIG_HAVE_GCC_INT128  0\n#endif\n\n#if CORK_CONFIG_ARCH_X64 && CORK_CONFIG_GCC_VERSION >= 40100\n#define CORK_CONFIG_HAVE_GCC_MODE_ATTRIBUTE  1\n#else\n#define CORK_CONFIG_HAVE_GCC_MODE_ATTRIBUTE  0\n#endif\n\n/* Statement expressions have been available since GCC 3.1. */\n\n#if CORK_CONFIG_GCC_VERSION >= 30100\n#define CORK_CONFIG_HAVE_GCC_STATEMENT_EXPRS  1\n#else\n#define CORK_CONFIG_HAVE_GCC_STATEMENT_EXPRS  0\n#endif\n\n/* Thread-local storage has been available since GCC 3.3, but not on Mac\n * OS X. Also disable TLS for uClibc*/\n\n#if !(defined(__APPLE__) && defined(__MACH__))\n#if CORK_CONFIG_GCC_VERSION >= 30300 && defined(TLS)\n#define CORK_CONFIG_HAVE_THREAD_STORAGE_CLASS  1\n#else\n#define CORK_CONFIG_HAVE_THREAD_STORAGE_CLASS  0\n#endif\n#else\n#define CORK_CONFIG_HAVE_THREAD_STORAGE_CLASS  0\n#endif\n\n\n#endif /* LIBCORK_CONFIG_GCC_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/config/linux.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CONFIG_LINUX_H\n#define LIBCORK_CONFIG_LINUX_H\n\n/*-----------------------------------------------------------------------\n * Endianness\n */\n\n#include <endian.h>\n\n#if __BYTE_ORDER == __BIG_ENDIAN\n#define CORK_CONFIG_IS_BIG_ENDIAN      1\n#define CORK_CONFIG_IS_LITTLE_ENDIAN   0\n#elif __BYTE_ORDER == __LITTLE_ENDIAN\n#define CORK_CONFIG_IS_BIG_ENDIAN      0\n#define CORK_CONFIG_IS_LITTLE_ENDIAN   1\n#else\n#error \"Cannot determine system endianness\"\n#endif\n\n#define CORK_HAVE_REALLOCF  0\n#define CORK_HAVE_PTHREADS  1\n\n\n#endif /* LIBCORK_CONFIG_LINUX_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/config/macosx.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CONFIG_MACOSX_H\n#define LIBCORK_CONFIG_MACOSX_H\n\n/*-----------------------------------------------------------------------\n * Endianness\n */\n\n#include <machine/endian.h>\n\n#if BYTE_ORDER == BIG_ENDIAN\n#define CORK_CONFIG_IS_BIG_ENDIAN      1\n#define CORK_CONFIG_IS_LITTLE_ENDIAN   0\n#elif BYTE_ORDER == LITTLE_ENDIAN\n#define CORK_CONFIG_IS_BIG_ENDIAN      0\n#define CORK_CONFIG_IS_LITTLE_ENDIAN   1\n#else\n#error \"Cannot determine system endianness\"\n#endif\n\n#define CORK_HAVE_REALLOCF  1\n#define CORK_HAVE_PTHREADS  1\n\n\n#endif /* LIBCORK_CONFIG_MACOSX_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/config/mingw32.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CONFIG_MINGW32_H\n#define LIBCORK_CONFIG_MINGW32_H\n\n#include <io.h>\n\n/*-----------------------------------------------------------------------\n * Endianness\n */\n\n/* Assume MinGW32 only works on x86 platform */ \n\n#define CORK_CONFIG_IS_BIG_ENDIAN      0\n#define CORK_CONFIG_IS_LITTLE_ENDIAN   1\n\n#define CORK_HAVE_REALLOCF  0\n#define CORK_HAVE_PTHREADS  1\n\n/*\n * File io stuff. Odd that this is not defined by MinGW.\n * Maybe there is an M$ish way to do it.\n */\n#define F_SETFL    4\n#define O_NONBLOCK 0x4000  /* non blocking I/O (POSIX style) */\n\n#define F_GETFD 1\n#define F_SETFD 2\n#define FD_CLOEXEC 0x1\n\n#define WNOHANG 1\n\n/*\n * simple adaptors\n */\n\nstatic inline int mingw_mkdir(const char *path, int mode)\n{\n        return mkdir(path);\n}\n#define mkdir mingw_mkdir\n\n#define S_ISLNK(x) 0\n\n\n#endif /* LIBCORK_CONFIG_MINGW32_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/config/solaris.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CONFIG_SOLARIS_H\n#define LIBCORK_CONFIG_SOLARIS_H\n\n/*-----------------------------------------------------------------------\n * Endianness\n */\n\n#include <sys/isa_defs.h>\n\n#if defined(_BIG_ENDIAN)\n#define CORK_CONFIG_IS_BIG_ENDIAN      1\n#define CORK_CONFIG_IS_LITTLE_ENDIAN   0\n#elif defined(_LITTLE_ENDIAN)\n#define CORK_CONFIG_IS_BIG_ENDIAN      0\n#define CORK_CONFIG_IS_LITTLE_ENDIAN   1\n#else\n#error \"Cannot determine system endianness\"\n#endif\n\n#define CORK_HAVE_REALLOCF  0\n#define CORK_HAVE_PTHREADS  1\n\n\n#endif /* LIBCORK_CONFIG_SOLARIS_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/config/version.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2015, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CONFIG_VERSION_H\n#define LIBCORK_CONFIG_VERSION_H\n\n\n/*-----------------------------------------------------------------------\n * Library version\n */\n\n#define CORK_CONFIG_VERSION_MAJOR   0\n#define CORK_CONFIG_VERSION_MINOR   15\n#define CORK_CONFIG_VERSION_PATCH   0\n#define CORK_CONFIG_VERSION_STRING  \"0.15.0\"\n#define CORK_CONFIG_REVISION        \"d6ecc2cfbcdf5013038a72b4544f7d9e6eb8f92d\"\n\n\n#endif /* LIBCORK_CONFIG_VERSION_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/config.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CONFIG_H\n#define LIBCORK_CONFIG_H\n\n/*** include all of the parts ***/\n\n#include <libcork/config/config.h>\n\n#endif /* LIBCORK_CONFIG_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/core/allocator.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CORE_ALLOCATOR_H\n#define LIBCORK_CORE_ALLOCATOR_H\n\n#include <assert.h>\n#include <stdlib.h>\n\n#include <libcork/core/api.h>\n#include <libcork/core/attributes.h>\n#include <libcork/core/callbacks.h>\n#include <libcork/core/error.h>\n#include <libcork/core/types.h>\n\n\n/*-----------------------------------------------------------------------\n * Allocator interface\n */\n\nstruct cork_alloc;\n\ntypedef void *\n(*cork_alloc_calloc_f)(const struct cork_alloc *alloc,\n                       size_t count, size_t size);\n\ntypedef void *\n(*cork_alloc_malloc_f)(const struct cork_alloc *alloc, size_t size);\n\n/* Must not free `ptr` if allocation fails. */\ntypedef void *\n(*cork_alloc_realloc_f)(const struct cork_alloc *alloc, void *ptr,\n                        size_t old_size, size_t new_size);\n\ntypedef void\n(*cork_alloc_free_f)(const struct cork_alloc *alloc, void *ptr, size_t size);\n\nstruct cork_alloc {\n    const struct cork_alloc  *parent;\n    void  *user_data;\n    cork_free_f  free_user_data;\n    cork_alloc_calloc_f  calloc;\n    cork_alloc_malloc_f  malloc;\n    cork_alloc_realloc_f  realloc;\n    cork_alloc_calloc_f  xcalloc;\n    cork_alloc_malloc_f  xmalloc;\n    cork_alloc_realloc_f  xrealloc;\n    cork_alloc_free_f  free;\n};\n\n/* NOT thread-safe; must be called before most other libcork functions.\n * Allocator will automatically be freed at process exit. */\nCORK_API struct cork_alloc *\ncork_alloc_new_alloc(const struct cork_alloc *parent);\n\n\nCORK_API void\ncork_alloc_set_user_data(struct cork_alloc *alloc,\n                         void *user_data, cork_free_f free_user_data);\n\n/* These variants must always return a valid pointer.  If allocation fails, they\n * should abort the process or transfer control in some other way to an error\n * handler or cleanup routine.\n *\n * If you only provide implementations of the `x` variants, we'll provide\n * default implementations of these that abort the process if a memory\n * allocation fails. */\n\nCORK_API void\ncork_alloc_set_calloc(struct cork_alloc *alloc, cork_alloc_calloc_f calloc);\n\nCORK_API void\ncork_alloc_set_malloc(struct cork_alloc *alloc, cork_alloc_malloc_f malloc);\n\nCORK_API void\ncork_alloc_set_realloc(struct cork_alloc *alloc, cork_alloc_realloc_f realloc);\n\n/* These variants can return a NULL pointer if allocation fails. */\n\nCORK_API void\ncork_alloc_set_xcalloc(struct cork_alloc *alloc, cork_alloc_calloc_f xcalloc);\n\nCORK_API void\ncork_alloc_set_xmalloc(struct cork_alloc *alloc, cork_alloc_malloc_f xmalloc);\n\nCORK_API void\ncork_alloc_set_xrealloc(struct cork_alloc *alloc,\n                        cork_alloc_realloc_f xrealloc);\n\n\nCORK_API void\ncork_alloc_set_free(struct cork_alloc *alloc, cork_alloc_free_f free);\n\n\n/* Low-level use of an allocator. */\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic void *\ncork_alloc_calloc(const struct cork_alloc *alloc, size_t count, size_t size)\n{\n    return alloc->calloc(alloc, count, size);\n}\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic void *\ncork_alloc_malloc(const struct cork_alloc *alloc, size_t size)\n{\n    return alloc->malloc(alloc, size);\n}\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic void *\ncork_alloc_realloc(const struct cork_alloc *alloc, void *ptr,\n                   size_t old_size, size_t new_size)\n{\n    return alloc->realloc(alloc, ptr, old_size, new_size);\n}\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic void *\ncork_alloc_xcalloc(const struct cork_alloc *alloc, size_t count, size_t size)\n{\n    return alloc->xcalloc(alloc, count, size);\n}\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic void *\ncork_alloc_xmalloc(const struct cork_alloc *alloc, size_t size)\n{\n    return alloc->xmalloc(alloc, size);\n}\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic void *\ncork_alloc_xrealloc(const struct cork_alloc *alloc, void *ptr,\n                    size_t old_size, size_t new_size)\n{\n    return alloc->xrealloc(alloc, ptr, old_size, new_size);\n}\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic void *\ncork_alloc_xreallocf(const struct cork_alloc *alloc, void *ptr,\n                     size_t old_size, size_t new_size)\n{\n    void  *result = alloc->xrealloc(alloc, ptr, old_size, new_size);\n    if (result == NULL) {\n        alloc->free(alloc, ptr, old_size);\n        return NULL;\n    } else {\n        return result;\n    }\n}\n\nCORK_ATTR_UNUSED\nstatic void\ncork_alloc_free(const struct cork_alloc *alloc, void *ptr, size_t size)\n{\n    return alloc->free(alloc, ptr, size);\n}\n\nCORK_ATTR_UNUSED\nstatic void\ncork_alloc_cfree(const struct cork_alloc *alloc, void *ptr,\n                 size_t count, size_t size)\n{\n    assert(count < (SIZE_MAX / size));\n    return alloc->free(alloc, ptr, count * size);\n}\n\n#define cork_alloc_new(alloc, type) \\\n    cork_alloc_malloc((alloc), sizeof(type))\n#define cork_alloc_xnew(alloc, type) \\\n    cork_alloc_xmalloc((alloc), sizeof(type))\n#define cork_alloc_delete(alloc, type, ptr) \\\n    cork_alloc_free((alloc), (ptr), sizeof(type))\n\n/* string-related helper functions */\n\nCORK_ATTR_MALLOC\nCORK_API const char *\ncork_alloc_strdup(const struct cork_alloc *alloc, const char *str);\n\nCORK_ATTR_MALLOC\nCORK_API const char *\ncork_alloc_strndup(const struct cork_alloc *alloc,\n                   const char *str, size_t size);\n\nCORK_ATTR_MALLOC\nCORK_API const char *\ncork_alloc_xstrdup(const struct cork_alloc *alloc, const char *str);\n\nCORK_ATTR_MALLOC\nCORK_API const char *\ncork_alloc_xstrndup(const struct cork_alloc *alloc,\n                    const char *str, size_t size);\n\nCORK_API void\ncork_alloc_strfree(const struct cork_alloc *alloc, const char *str);\n\n\n/*-----------------------------------------------------------------------\n * Using the allocator interface\n */\n\n/* All of the functions that you use to actually allocate memory assume that\n * cork_current_allocator() returns the allocator instance that should be used.\n * Your easiest approach is to do nothing special; in that case, all of the\n * libcork memory allocation functions will transparently use the standard\n * malloc/free family of functions.\n *\n * If you're writing a library, and want to allow your library clients to\n * provide a separate custom memory allocator then the one they can already\n * override for libcork itself, you should declare a pair of functions for\n * getting and setting your library's current allocator (like libcork itself\n * does), and (only when compiling the source of your library) define\n * `cork_current_allocator` as a macro that aliases the getter function.  That\n * will cause the libcork memory allocation functions to use whichever allocator\n * your library user has provided.\n *\n * If you're writing an application, and want to provide a single allocator that\n * all libcork-using libraries will pick up, just call cork_set_allocator before\n * calling any other library functions.  Other libraries will use this as a\n * default and everything that uses libcork's memory allocation functions will\n * use your custom allocator. */\n\n\n/* libcork's current allocator */\n\nextern const struct cork_alloc  *cork_allocator;\n\n/* We take control and will free when the process exits.  This is *NOT*\n * thread-safe; it's only safe to call before you've called *ANY* other libcork\n * function (or any function from any other library that uses libcork).  You can\n * only call this at most once. */\nCORK_API void\ncork_set_allocator(const struct cork_alloc *alloc);\n\n\n/* The current allocator of whichever library is being compiled. */\n\n#if !defined(cork_current_allocator)\n#define cork_current_allocator()  (cork_allocator)\n#endif\n\n\n/* using an allocator */\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic void *\ncork_calloc(size_t count, size_t size)\n{\n    const struct cork_alloc  *alloc = cork_current_allocator();\n    return cork_alloc_calloc(alloc, count, size);\n}\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic void *\ncork_malloc(size_t size)\n{\n    const struct cork_alloc  *alloc = cork_current_allocator();\n    return cork_alloc_malloc(alloc, size);\n}\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic void *\ncork_realloc(void *ptr, size_t old_size, size_t new_size)\n{\n    const struct cork_alloc  *alloc = cork_current_allocator();\n    return cork_alloc_realloc(alloc, ptr, old_size, new_size);\n}\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic void *\ncork_xcalloc(size_t count, size_t size)\n{\n    const struct cork_alloc  *alloc = cork_current_allocator();\n    return cork_alloc_xcalloc(alloc, count, size);\n}\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic void *\ncork_xmalloc(size_t size)\n{\n    const struct cork_alloc  *alloc = cork_current_allocator();\n    return cork_alloc_xmalloc(alloc, size);\n}\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic void *\ncork_xrealloc(void *ptr, size_t old_size, size_t new_size)\n{\n    const struct cork_alloc  *alloc = cork_current_allocator();\n    return cork_alloc_xrealloc(alloc, ptr, old_size, new_size);\n}\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic void *\ncork_xreallocf(void *ptr, size_t old_size, size_t new_size)\n{\n    const struct cork_alloc  *alloc = cork_current_allocator();\n    return cork_alloc_xreallocf(alloc, ptr, old_size, new_size);\n}\n\nCORK_ATTR_UNUSED\nstatic void\ncork_free(void *ptr, size_t size)\n{\n    const struct cork_alloc  *alloc = cork_current_allocator();\n    cork_alloc_free(alloc, ptr, size);\n}\n\nCORK_ATTR_UNUSED\nstatic void\ncork_cfree(void *ptr, size_t count, size_t size)\n{\n    const struct cork_alloc  *alloc = cork_current_allocator();\n    cork_alloc_cfree(alloc, ptr, count, size);\n}\n\n#define cork_new(type)          cork_malloc(sizeof(type))\n#define cork_xnew(type)         cork_xmalloc(sizeof(type))\n#define cork_delete(type, ptr)  cork_free((ptr), sizeof(type))\n\n\n/* string-related helper functions */\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic const char *\ncork_strdup(const char *str)\n{\n    const struct cork_alloc  *alloc = cork_current_allocator();\n    return cork_alloc_strdup(alloc, str);\n}\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic const char *\ncork_strndup(const char *str, size_t size)\n{\n    const struct cork_alloc  *alloc = cork_current_allocator();\n    return cork_alloc_strndup(alloc, str, size);\n}\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic const char *\ncork_xstrdup(const char *str)\n{\n    const struct cork_alloc  *alloc = cork_current_allocator();\n    return cork_alloc_xstrdup(alloc, str);\n}\n\nCORK_ATTR_MALLOC\nCORK_ATTR_UNUSED\nstatic const char *\ncork_xstrndup(const char *str, size_t size)\n{\n    const struct cork_alloc  *alloc = cork_current_allocator();\n    return cork_alloc_xstrndup(alloc, str, size);\n}\n\nCORK_ATTR_UNUSED\nstatic void\ncork_strfree(const char *str)\n{\n    const struct cork_alloc  *alloc = cork_current_allocator();\n    return cork_alloc_strfree(alloc, str);\n}\n\n\n/*-----------------------------------------------------------------------\n * Debugging allocator\n */\n\n/* An allocator that adds some additional debugging checks:\n *\n * - We verify that every \"free\" call (cork_free, cork_cfree, cork_delete,\n *   cork_realloc) is passed the \"correct\" size — i.e., the same size that was\n *   passed in to the correspond \"new\" call (cork_malloc, cork_calloc,\n *   cork_realloc, cork_new).\n */\n\nstruct cork_alloc *\ncork_debug_alloc_new(const struct cork_alloc *parent);\n\n\n#endif /* LIBCORK_CORE_ALLOCATOR_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/core/api.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012-2015, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CORE_API_H\n#define LIBCORK_CORE_API_H\n\n#include <libcork/config.h>\n#include <libcork/core/attributes.h>\n\n\n/*-----------------------------------------------------------------------\n * Calling conventions\n */\n\n/* If you're using libcork as a shared library, you don't need to do anything\n * special; the following will automatically set things up so that libcork's\n * public symbols are imported from the library.  When we build the shared\n * library, we define this ourselves to export the symbols. */\n\n#if !defined(CORK_API)\n#define CORK_API  CORK_IMPORT\n#endif\n\n\n/*-----------------------------------------------------------------------\n * Library version\n */\n\n#define CORK_VERSION_MAJOR  CORK_CONFIG_VERSION_MAJOR\n#define CORK_VERSION_MINOR  CORK_CONFIG_VERSION_MINOR\n#define CORK_VERSION_PATCH  CORK_CONFIG_VERSION_PATCH\n\n#define CORK_MAKE_VERSION(major, minor, patch) \\\n    ((major * 1000000) + (minor * 1000) + patch)\n\n#define CORK_VERSION  \\\n    CORK_MAKE_VERSION(CORK_VERSION_MAJOR, \\\n                      CORK_VERSION_MINOR, \\\n                      CORK_VERSION_PATCH)\n\nCORK_API const char *\ncork_version_string(void)\n    CORK_ATTR_CONST;\n\nCORK_API const char *\ncork_revision_string(void)\n    CORK_ATTR_CONST;\n\n\n#endif /* LIBCORK_CORE_API_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/core/attributes.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CORE_ATTRIBUTES_H\n#define LIBCORK_CORE_ATTRIBUTES_H\n\n#include <libcork/config.h>\n\n\n/*\n * Declare a “const” function.\n *\n * A const function is one whose return value depends only on its\n * parameters.  This is slightly more strict than a “pure” function; a\n * const function is not allowed to read from global variables, whereas\n * a pure function is.\n *\n *   int square(int x) CORK_ATTR_CONST;\n */\n\n#if CORK_CONFIG_HAVE_GCC_ATTRIBUTES\n#define CORK_ATTR_CONST  __attribute__((const))\n#else\n#define CORK_ATTR_CONST\n#endif\n\n\n/*\n * Declare a “pure” function.\n *\n * A pure function is one whose return value depends only on its\n * parameters, and global variables.\n *\n *   int square(int x) CORK_ATTR_PURE;\n */\n\n#if CORK_CONFIG_HAVE_GCC_ATTRIBUTES\n#define CORK_ATTR_PURE  __attribute__((pure))\n#else\n#define CORK_ATTR_PURE\n#endif\n\n\n/*\n * Declare that a function returns a newly allocated pointer.\n *\n * The compiler can use this information to generate more accurate\n * aliasing information, since it can infer that the result of the\n * function cannot alias any other existing pointer.\n */\n\n#if CORK_CONFIG_HAVE_GCC_ATTRIBUTES\n#define CORK_ATTR_MALLOC  __attribute__((malloc))\n#else\n#define CORK_ATTR_MALLOC\n#endif\n\n\n/*\n * Declare that a function shouldn't be inlined.\n */\n\n#if CORK_CONFIG_HAVE_GCC_ATTRIBUTES\n#define CORK_ATTR_NOINLINE  __attribute__((noinline))\n#else\n#define CORK_ATTR_NOINLINE\n#endif\n\n\n/*\n * Declare an entity that isn't used.\n *\n * This lets you keep -Wall activated in several cases where you're\n * obligated to define something that you don't intend to use.\n */\n\n#if CORK_CONFIG_HAVE_GCC_ATTRIBUTES\n#define CORK_ATTR_UNUSED  __attribute__((unused))\n#else\n#define CORK_ATTR_UNUSED\n#endif\n\n\n/*\n * Declare a function that takes in printf-like parameters.\n *\n * When the compiler supports this attribute, it will check the format\n * string, and the following arguments, to make sure that they match.\n * format_index and args_index are 1-based.\n */\n\n#if CORK_CONFIG_HAVE_GCC_ATTRIBUTES  && !(defined(__CYGWIN__)||defined(__MINGW32__))\n#define CORK_ATTR_PRINTF(format_index, args_index) \\\n    __attribute__((format(printf, format_index, args_index)))\n#else\n#define CORK_ATTR_PRINTF(format_index, args_index)\n#endif\n\n\n/*\n * Declare a var-arg function whose last parameter must be a NULL\n * sentinel value.\n *\n * When the compiler supports this attribute, it will check the actual\n * parameters whenever this function is called, and ensure that the last\n * parameter is a @c NULL.\n */\n\n#if CORK_CONFIG_HAVE_GCC_ATTRIBUTES\n#define CORK_ATTR_SENTINEL  __attribute__((sentinel))\n#else\n#define CORK_ATTR_SENTINEL\n#endif\n\n\n/*\n * Declare that a boolean expression is likely to be true or false.\n */\n\n#if CORK_CONFIG_HAVE_GCC_ATTRIBUTES\n#define CORK_LIKELY(expr)  __builtin_expect((expr), 1)\n#define CORK_UNLIKELY(expr)  __builtin_expect((expr), 0)\n#else\n#define CORK_LIKELY(expr)  (expr)\n#define CORK_UNLIKELY(expr)  (expr)\n#endif\n\n/*\n * Declare that a function is part of the current library's public API, or that\n * it's internal to the current library.\n */\n\n#if CORK_CONFIG_HAVE_GCC_ATTRIBUTES && !(defined(__CYGWIN__)||defined(__MINGW32__))\n#define CORK_EXPORT  __attribute__((visibility(\"default\")))\n#define CORK_IMPORT  __attribute__((visibility(\"default\")))\n#define CORK_LOCAL   __attribute__((visibility(\"hidden\")))\n#else\n#define CORK_EXPORT\n#define CORK_IMPORT\n#define CORK_LOCAL\n#endif\n\n\n/*\n * Declare a static function that should automatically be called at program\n * startup.\n */\n\n/* TODO: When we implement a full Windows port, [1] describes how best to\n * implement an initialization function under Visual Studio.\n *\n * [1] http://stackoverflow.com/questions/1113409/attribute-constructor-equivalent-in-vc\n */\n\n#if CORK_CONFIG_HAVE_GCC_ATTRIBUTES\n#define CORK_INITIALIZER(name) \\\n__attribute__((constructor)) \\\nstatic void \\\nname(void)\n#else\n#error \"Don't know how to implement initialization functions of this platform\"\n#endif\n\n\n#endif /* LIBCORK_CORE_ATTRIBUTES_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/core/byte-order.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CORE_BYTE_ORDER_H\n#define LIBCORK_CORE_BYTE_ORDER_H\n\n\n#include <libcork/config.h>\n#include <libcork/core/types.h>\n\n\n/* Constants to represent big endianness and little endianness */\n#define CORK_BIG_ENDIAN  4321\n#define CORK_LITTLE_ENDIAN  1234\n\n/* Whether the current host is big- or little-endian.  HOST gives us the\n * current system's endianness; OTHER gives the opposite endianness.\n * The _NAME macros can be used in debugging messages and other\n * human-readable output.\n *\n * Note that we actually detect the endianness in the various header\n * files in the libcork/config directory, since we want to keep\n * everything detection-related separated out from what we define based\n * on that detection. */\n\n#if CORK_CONFIG_IS_BIG_ENDIAN\n#define CORK_HOST_ENDIANNESS  CORK_BIG_ENDIAN\n#define CORK_OTHER_ENDIANNESS  CORK_LITTLE_ENDIAN\n#define CORK_HOST_ENDIANNESS_NAME   \"big\"\n#define CORK_OTHER_ENDIANNESS_NAME  \"little\"\n\n#elif CORK_CONFIG_IS_LITTLE_ENDIAN\n#define CORK_HOST_ENDIANNESS  CORK_LITTLE_ENDIAN\n#define CORK_OTHER_ENDIANNESS  CORK_BIG_ENDIAN\n#define CORK_HOST_ENDIANNESS_NAME   \"little\"\n#define CORK_OTHER_ENDIANNESS_NAME  \"big\"\n\n#else\n#error \"Unknown endianness\"\n#endif\n\n\n/* Returns the byte-swapped version an integer, regardless of the\n * underlying endianness.\n *\n * These macros only require an rvalue as their parameter (which can\n * therefore be any arbitrary expression), and they don't modify the\n * original contents if it happens to be a variable.  */\n\n#define CORK_SWAP_UINT16(__u16) \\\n    (((((uint16_t) __u16) & 0xff00u) >> 8) | \\\n     ((((uint16_t) __u16) & 0x00ffu) << 8))\n\n#define CORK_SWAP_UINT32(__u32) \\\n    (((((uint32_t) __u32) & 0xff000000u) >> 24) | \\\n     ((((uint32_t) __u32) & 0x00ff0000u) >>  8) | \\\n     ((((uint32_t) __u32) & 0x0000ff00u) <<  8) | \\\n     ((((uint32_t) __u32) & 0x000000ffu) << 24))\n\n#define CORK_SWAP_UINT64(__u64) \\\n    (((((uint64_t) __u64) & UINT64_C(0xff00000000000000)) >> 56) | \\\n     ((((uint64_t) __u64) & UINT64_C(0x00ff000000000000)) >> 40) | \\\n     ((((uint64_t) __u64) & UINT64_C(0x0000ff0000000000)) >> 24) | \\\n     ((((uint64_t) __u64) & UINT64_C(0x000000ff00000000)) >>  8) | \\\n     ((((uint64_t) __u64) & UINT64_C(0x00000000ff000000)) <<  8) | \\\n     ((((uint64_t) __u64) & UINT64_C(0x0000000000ff0000)) << 24) | \\\n     ((((uint64_t) __u64) & UINT64_C(0x000000000000ff00)) << 40) | \\\n     ((((uint64_t) __u64) & UINT64_C(0x00000000000000ff)) << 56))\n\n/* Bytes-swaps an integer variable in place.\n *\n * These macros require an lvalue as their parameter; the contents of\n * this variable will be modified by the macro. */\n\n#define CORK_SWAP_IN_PLACE_UINT16(__u16) \\\n    do { \\\n        (__u16) = CORK_SWAP_UINT16(__u16); \\\n    } while (0)\n\n#define CORK_SWAP_IN_PLACE_UINT32(__u32) \\\n    do { \\\n        (__u32) = CORK_SWAP_UINT32(__u32); \\\n    } while (0)\n\n#define CORK_SWAP_IN_PLACE_UINT64(__u64) \\\n    do { \\\n        (__u64) = CORK_SWAP_UINT64(__u64); \\\n    } while (0)\n\n\n/*\n * A slew of swapping macros whose operation depends on the endianness\n * of the current system:\n *\n * uint16_t CORK_UINT16_BIG_TO_HOST(u16)\n * uint32_t CORK_UINT32_BIG_TO_HOST(u32)\n * uint64_t CORK_UINT64_BIG_TO_HOST(u64)\n * uint16_t CORK_UINT16_LITTLE_TO_HOST(u16)\n * uint32_t CORK_UINT32_LITTLE_TO_HOST(u32)\n * uint64_t CORK_UINT64_LITTLE_TO_HOST(u64)\n * void CORK_UINT16_BIG_TO_HOST_IN_PLACE(&u16)\n * void CORK_UINT32_BIG_TO_HOST_IN_PLACE(&u32)\n * void CORK_UINT64_BIG_TO_HOST_IN_PLACE(&u64)\n * void CORK_UINT16_LITTLE_TO_HOST_IN_PLACE(&u16)\n * void CORK_UINT32_LITTLE_TO_HOST_IN_PLACE(&u32)\n * void CORK_UINT64_LITTLE_TO_HOST_IN_PLACE(&u64)\n *\n * uint16_t CORK_UINT16_HOST_TO_BIG(u16)\n * uint32_t CORK_UINT32_HOST_TO_BIG(u32)\n * uint64_t CORK_UINT64_HOST_TO_BIG(u64)\n * uint16_t CORK_UINT16_HOST_TO_LITTLE(u16)\n * uint32_t CORK_UINT32_HOST_TO_LITTLE(u32)\n * uint64_t CORK_UINT64_HOST_TO_LITTLE(u64)\n * void CORK_UINT16_HOST_TO_BIG_IN_PLACE(&u16)\n * void CORK_UINT32_HOST_TO_BIG_IN_PLACE(&u32)\n * void CORK_UINT64_HOST_TO_BIG_IN_PLACE(&u64)\n * void CORK_UINT16_HOST_TO_LITTLE_IN_PLACE(&u16)\n * void CORK_UINT32_HOST_TO_LITTLE_IN_PLACE(&u32)\n * void CORK_UINT64_HOST_TO_LITTLE_IN_PLACE(&u64)\n */\n\n#if CORK_HOST_ENDIANNESS == CORK_BIG_ENDIAN\n\n#define CORK_UINT16_BIG_TO_HOST(__u16) (__u16) /* nothing to do */\n#define CORK_UINT16_LITTLE_TO_HOST(__u16)  CORK_SWAP_UINT16(__u16)\n\n#define CORK_UINT32_BIG_TO_HOST(__u32) (__u32) /* nothing to do */\n#define CORK_UINT32_LITTLE_TO_HOST(__u32)  CORK_SWAP_UINT32(__u32)\n\n#define CORK_UINT64_BIG_TO_HOST(__u64) (__u64) /* nothing to do */\n#define CORK_UINT64_LITTLE_TO_HOST(__u64)  CORK_SWAP_UINT64(__u64)\n\n#define CORK_UINT16_BIG_TO_HOST_IN_PLACE(__u16) /* nothing to do */\n#define CORK_UINT16_LITTLE_TO_HOST_IN_PLACE(__u16)  CORK_SWAP_IN_PLACE_UINT16(__u16)\n\n#define CORK_UINT32_BIG_TO_HOST_IN_PLACE(__u32) /* nothing to do */\n#define CORK_UINT32_LITTLE_TO_HOST_IN_PLACE(__u32)  CORK_SWAP_IN_PLACE_UINT32(__u32)\n\n#define CORK_UINT64_BIG_TO_HOST_IN_PLACE(__u64) /* nothing to do */\n#define CORK_UINT64_LITTLE_TO_HOST_IN_PLACE(__u64)  CORK_SWAP_IN_PLACE_UINT64(__u64)\n\n#elif CORK_HOST_ENDIANNESS == CORK_LITTLE_ENDIAN\n\n#define CORK_UINT16_BIG_TO_HOST(__u16)  CORK_SWAP_UINT16(__u16)\n#define CORK_UINT16_LITTLE_TO_HOST(__u16) (__u16) /* nothing to do */\n\n#define CORK_UINT32_BIG_TO_HOST(__u32)  CORK_SWAP_UINT32(__u32)\n#define CORK_UINT32_LITTLE_TO_HOST(__u32) (__u32) /* nothing to do */\n\n#define CORK_UINT64_BIG_TO_HOST(__u64)  CORK_SWAP_UINT64(__u64)\n#define CORK_UINT64_LITTLE_TO_HOST(__u64) (__u64) /* nothing to do */\n\n#define CORK_UINT16_BIG_TO_HOST_IN_PLACE(__u16)  CORK_SWAP_IN_PLACE_UINT16(__u16)\n#define CORK_UINT16_LITTLE_TO_HOST_IN_PLACE(__u16) /* nothing to do */\n\n#define CORK_UINT32_BIG_TO_HOST_IN_PLACE(__u32)  CORK_SWAP_IN_PLACE_UINT32(__u32)\n#define CORK_UINT32_LITTLE_TO_HOST_IN_PLACE(__u32) /* nothing to do */\n\n#define CORK_UINT64_BIG_TO_HOST_IN_PLACE(__u64)  CORK_SWAP_IN_PLACE_UINT64(__u64)\n#define CORK_UINT64_LITTLE_TO_HOST_IN_PLACE(__u64) /* nothing to do */\n\n#endif\n\n\n#define CORK_UINT16_HOST_TO_BIG(__u16)  CORK_UINT16_BIG_TO_HOST(__u16)\n#define CORK_UINT32_HOST_TO_BIG(__u32)  CORK_UINT32_BIG_TO_HOST(__u32)\n#define CORK_UINT64_HOST_TO_BIG(__u64)  CORK_UINT64_BIG_TO_HOST(__u64)\n#define CORK_UINT16_HOST_TO_LITTLE(__u16)  CORK_UINT16_LITTLE_TO_HOST(__u16)\n#define CORK_UINT32_HOST_TO_LITTLE(__u32)  CORK_UINT32_LITTLE_TO_HOST(__u32)\n#define CORK_UINT64_HOST_TO_LITTLE(__u64)  CORK_UINT64_LITTLE_TO_HOST(__u64)\n#define CORK_UINT16_HOST_TO_BIG_IN_PLACE(__u16)  CORK_UINT16_BIG_TO_HOST_IN_PLACE(__u16)\n#define CORK_UINT32_HOST_TO_BIG_IN_PLACE(__u32)  CORK_UINT32_BIG_TO_HOST_IN_PLACE(__u32)\n#define CORK_UINT64_HOST_TO_BIG_IN_PLACE(__u64)  CORK_UINT64_BIG_TO_HOST_IN_PLACE(__u64)\n#define CORK_UINT16_HOST_TO_LITTLE_IN_PLACE(__u16)  CORK_UINT16_LITTLE_TO_HOST_IN_PLACE(__u16)\n#define CORK_UINT32_HOST_TO_LITTLE_IN_PLACE(__u32)  CORK_UINT32_LITTLE_TO_HOST_IN_PLACE(__u32)\n#define CORK_UINT64_HOST_TO_LITTLE_IN_PLACE(__u64)  CORK_UINT64_LITTLE_TO_HOST_IN_PLACE(__u64)\n\n\n#endif /* LIBCORK_CORE_BYTE_ORDER_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/core/callbacks.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2013-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CORE_CALLBACKS_H\n#define LIBCORK_CORE_CALLBACKS_H\n\n\n#include <libcork/core/hash.h>\n\n\ntypedef int\n(*cork_copy_f)(void *user_data, void *dest, const void *src);\n\ntypedef void\n(*cork_done_f)(void *user_data, void *value);\n\ntypedef void\n(*cork_free_f)(void *value);\n\ntypedef cork_hash\n(*cork_hash_f)(void *user_data, const void *value);\n\ntypedef bool\n(*cork_equals_f)(void *user_data, const void *value1, const void *value2);\n\ntypedef void\n(*cork_init_f)(void *user_data, void *value);\n\n#define cork_free_user_data(parent) \\\n    ((parent)->free_user_data == NULL? (void) 0: \\\n     (parent)->free_user_data((parent)->user_data))\n\ntypedef void *\n(*cork_new_f)(void *user_data);\n\ntypedef int\n(*cork_run_f)(void *user_data);\n\n\n#endif /* LIBCORK_CORE_CALLBACKS_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/core/error.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CORE_ERROR_H\n#define LIBCORK_CORE_ERROR_H\n\n#include <errno.h>\n#include <stdarg.h>\n#include <stdio.h>\n#include <stdlib.h>\n\n#include <libcork/core/api.h>\n#include <libcork/core/attributes.h>\n#include <libcork/core/types.h>\n\n\n/* Should be a hash of a string representing the error code. */\ntypedef uint32_t  cork_error;\n\n/* An error code that represents “no error”. */\n#define CORK_ERROR_NONE  ((cork_error) 0)\n\nCORK_API bool\ncork_error_occurred(void);\n\nCORK_API cork_error\ncork_error_code(void);\n\nCORK_API const char *\ncork_error_message(void);\n\n\nCORK_API void\ncork_error_clear(void);\n\nCORK_API void\ncork_error_set_printf(cork_error code, const char *format, ...)\n    CORK_ATTR_PRINTF(2,3);\n\nCORK_API void\ncork_error_set_string(cork_error code, const char *str);\n\nCORK_API void\ncork_error_set_vprintf(cork_error code, const char *format, va_list args)\n    CORK_ATTR_PRINTF(2,0);\n\nCORK_API void\ncork_error_prefix_printf(const char *format, ...)\n    CORK_ATTR_PRINTF(1,2);\n\nCORK_API void\ncork_error_prefix_string(const char *str);\n\nCORK_API void\ncork_error_prefix_vprintf(const char *format, va_list arg)\n    CORK_ATTR_PRINTF(1,0);\n\n\n/* deprecated */\nCORK_API void\ncork_error_set(uint32_t error_class, unsigned int error_code,\n               const char *format, ...)\n    CORK_ATTR_PRINTF(3,4);\n\n/* deprecated */\nCORK_API void\ncork_error_prefix(const char *format, ...)\n    CORK_ATTR_PRINTF(1,2);\n\n\n/*-----------------------------------------------------------------------\n * Built-in errors\n */\n\n#define CORK_PARSE_ERROR               0x95dfd3c8\n#define CORK_REDEFINED                 0x171629cb\n#define CORK_UNDEFINED                 0xedc3d7d9\n#define CORK_UNKNOWN_ERROR             0x8cb0880d\n\n#define cork_parse_error(...) \\\n    cork_error_set_printf(CORK_PARSE_ERROR, __VA_ARGS__)\n#define cork_redefined(...) \\\n    cork_error_set_printf(CORK_REDEFINED, __VA_ARGS__)\n#define cork_undefined(...) \\\n    cork_error_set_printf(CORK_UNDEFINED, __VA_ARGS__)\n\nCORK_API void\ncork_system_error_set(void);\n\nCORK_API void\ncork_system_error_set_explicit(int err);\n\nCORK_API void\ncork_unknown_error_set_(const char *location);\n\n#define cork_unknown_error() \\\n    cork_unknown_error_set_(__func__)\n\n\n/*-----------------------------------------------------------------------\n * Abort on failure\n */\n\n#define cork_abort_(func, file, line, fmt, ...) \\\n    do { \\\n        fprintf(stderr, fmt \"\\n  in %s (%s:%u)\\n\", \\\n                __VA_ARGS__, (func), (file), (unsigned int) (line)); \\\n        abort(); \\\n    } while (0)\n\n#define cork_abort(fmt, ...) \\\n    cork_abort_(__func__, __FILE__, __LINE__, fmt, __VA_ARGS__)\n\nCORK_ATTR_UNUSED\nstatic void *\ncork_abort_if_null_(void *ptr, const char *msg, const char *func,\n                    const char *file, unsigned int line)\n{\n    if (CORK_UNLIKELY(ptr == NULL)) {\n        cork_abort_(func, file, line, \"%s\", msg);\n    } else {\n        return ptr;\n    }\n}\n\n#define cork_abort_if_null(ptr, msg) \\\n    (cork_abort_if_null_(ptr, msg, __func__, __FILE__, __LINE__))\n\n#define cork_unreachable() \\\n    cork_abort(\"%s\", \"Code should not be reachable\")\n\n\n#endif /* LIBCORK_CORE_ERROR_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/core/gc.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_GC_REFCOUNT_H\n#define LIBCORK_GC_REFCOUNT_H\n\n\n#include <libcork/core/api.h>\n#include <libcork/core/types.h>\n\n\nstruct cork_gc;\n\n/* A callback for recursing through the children of a garbage-collected\n * object. */\ntypedef void\n(*cork_gc_recurser)(struct cork_gc *gc, void *obj, void *ud);\n\ntypedef void\n(*cork_gc_free_func)(void *obj);\n\ntypedef void\n(*cork_gc_recurse_func)(struct cork_gc *gc, void *self,\n                        cork_gc_recurser recurser, void *ud);\n\n/* An interface that each garbage-collected object must implement. */\nstruct cork_gc_obj_iface {\n    /* Perform additional cleanup; does *NOT* need to deallocate the\n     * object itself, or release any child references */\n    cork_gc_free_func  free;\n    cork_gc_recurse_func  recurse;\n};\n\n\nCORK_API void\ncork_gc_init(void);\n\nCORK_API void\ncork_gc_done(void);\n\n\nCORK_API void *\ncork_gc_alloc(size_t instance_size, struct cork_gc_obj_iface *iface);\n\n#define cork_gc_new_iface(obj_type, iface) \\\n    ((obj_type *) \\\n     (cork_gc_alloc(sizeof(obj_type), (iface))))\n\n#define cork_gc_new(struct_name) \\\n    (cork_gc_new_iface(struct struct_name, &struct_name##__gc))\n\n\nCORK_API void *\ncork_gc_incref(void *obj);\n\nCORK_API void\ncork_gc_decref(void *obj);\n\n\n#endif /* LIBCORK_GC_REFCOUNT_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/core/hash.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CORE_HASH_H\n#define LIBCORK_CORE_HASH_H\n\n\n#include <libcork/core/api.h>\n#include <libcork/core/attributes.h>\n#include <libcork/core/byte-order.h>\n#include <libcork/core/types.h>\n#include <libcork/core/u128.h>\n\n\n#ifndef CORK_HASH_ATTRIBUTES\n#define CORK_HASH_ATTRIBUTES  CORK_ATTR_UNUSED static inline\n#endif\n\n\ntypedef uint32_t  cork_hash;\n\ntypedef struct {\n    cork_u128  u128;\n} cork_big_hash;\n\n#define cork_big_hash_equal(h1, h2)  (cork_u128_eq((h1).u128, (h2).u128))\n\n#define CORK_BIG_HASH_INIT()  {{{{0}}}}\n\n/* We currently use MurmurHash3 [1], which is public domain, as our hash\n * implementation.\n *\n * [1] http://code.google.com/p/smhasher/\n */\n\n#define CORK_ROTL32(a,b) (((a) << ((b) & 0x1f)) | ((a) >> (32 - ((b) & 0x1f))))\n#define CORK_ROTL64(a,b) (((a) << ((b) & 0x3f)) | ((a) >> (64 - ((b) & 0x3f))))\n\nCORK_ATTR_UNUSED\nstatic inline\nuint32_t cork_fmix32(uint32_t h)\n{\n    h ^= h >> 16;\n    h *= 0x85ebca6b;\n    h ^= h >> 13;\n    h *= 0xc2b2ae35;\n    h ^= h >> 16;\n    return h;\n}\n\nCORK_ATTR_UNUSED\nstatic inline\nuint64_t cork_fmix64(uint64_t k)\n{\n    k ^= k >> 33;\n    k *= UINT64_C(0xff51afd7ed558ccd);\n    k ^= k >> 33;\n    k *= UINT64_C(0xc4ceb9fe1a85ec53);\n    k ^= k >> 33;\n    return k;\n}\n\nCORK_HASH_ATTRIBUTES\ncork_hash\ncork_stable_hash_buffer(cork_hash seed, const void *src, size_t len)\n{\n    typedef uint32_t __attribute__((__may_alias__))  cork_aliased_uint32_t;\n\n    /* This is exactly the same as cork_murmur_hash_x86_32, but with a byte swap\n     * to make sure that we always process the uint32s little-endian. */\n    const unsigned int  nblocks = len / 4;\n    const cork_aliased_uint32_t  *blocks = (const cork_aliased_uint32_t *) src;\n    const cork_aliased_uint32_t  *end = blocks + nblocks;\n    const cork_aliased_uint32_t  *curr;\n    const uint8_t  *tail = (const uint8_t *) end;\n\n    uint32_t  h1 = seed;\n    uint32_t  c1 = 0xcc9e2d51;\n    uint32_t  c2 = 0x1b873593;\n    uint32_t  k1 = 0;\n\n    /* body */\n    for (curr = blocks; curr != end; curr++) {\n        uint32_t  k1 = CORK_UINT32_HOST_TO_LITTLE(*curr);\n\n        k1 *= c1;\n        k1 = CORK_ROTL32(k1,15);\n        k1 *= c2;\n\n        h1 ^= k1;\n        h1 = CORK_ROTL32(h1,13);\n        h1 = h1*5+0xe6546b64;\n    }\n\n    /* tail */\n    switch (len & 3) {\n        case 3: k1 ^= tail[2] << 16;\n        case 2: k1 ^= tail[1] << 8;\n        case 1: k1 ^= tail[0];\n                k1 *= c1; k1 = CORK_ROTL32(k1,15); k1 *= c2; h1 ^= k1;\n    };\n\n    /* finalization */\n    h1 ^= len;\n    h1 = cork_fmix32(h1);\n    return h1;\n}\n\n#define cork_murmur_hash_x86_32(seed, src, len, dest) \\\ndo { \\\n    typedef uint32_t __attribute__((__may_alias__))  cork_aliased_uint32_t; \\\n    \\\n    const unsigned int  nblocks = len / 4; \\\n    const cork_aliased_uint32_t  *blocks = (const cork_aliased_uint32_t *) src; \\\n    const cork_aliased_uint32_t  *end = blocks + nblocks; \\\n    const cork_aliased_uint32_t  *curr; \\\n    const uint8_t  *tail = (const uint8_t *) end; \\\n    \\\n    uint32_t  h1 = seed; \\\n    uint32_t  c1 = 0xcc9e2d51; \\\n    uint32_t  c2 = 0x1b873593; \\\n    uint32_t  k1 = 0; \\\n    \\\n    /* body */ \\\n    for (curr = blocks; curr != end; curr++) { \\\n        uint32_t  k1 = *curr; \\\n        \\\n        k1 *= c1; \\\n        k1 = CORK_ROTL32(k1,15); \\\n        k1 *= c2; \\\n        \\\n        h1 ^= k1; \\\n        h1 = CORK_ROTL32(h1,13); \\\n        h1 = h1*5+0xe6546b64; \\\n    } \\\n    \\\n    /* tail */ \\\n    switch (len & 3) { \\\n        case 3: k1 ^= tail[2] << 16; \\\n        case 2: k1 ^= tail[1] << 8; \\\n        case 1: k1 ^= tail[0]; \\\n                k1 *= c1; k1 = CORK_ROTL32(k1,15); k1 *= c2; h1 ^= k1; \\\n    }; \\\n    \\\n    /* finalization */ \\\n    h1 ^= len; \\\n    h1 = cork_fmix32(h1); \\\n    *(dest) = h1; \\\n} while (0)\n\n#define cork_murmur_hash_x86_128(seed, src, len, dest) \\\ndo { \\\n    typedef uint32_t __attribute__((__may_alias__))  cork_aliased_uint32_t; \\\n    \\\n    const unsigned int  nblocks = len / 16; \\\n    const cork_aliased_uint32_t  *blocks = (const cork_aliased_uint32_t *) src; \\\n    const cork_aliased_uint32_t  *end = blocks + (nblocks * 4); \\\n    const cork_aliased_uint32_t  *curr; \\\n    const uint8_t  *tail = (const uint8_t *) end; \\\n    \\\n    uint32_t  h1 = cork_u128_be32(seed.u128, 0); \\\n    uint32_t  h2 = cork_u128_be32(seed.u128, 1); \\\n    uint32_t  h3 = cork_u128_be32(seed.u128, 2); \\\n    uint32_t  h4 = cork_u128_be32(seed.u128, 3); \\\n    \\\n    uint32_t  c1 = 0x239b961b; \\\n    uint32_t  c2 = 0xab0e9789; \\\n    uint32_t  c3 = 0x38b34ae5; \\\n    uint32_t  c4 = 0xa1e38b93; \\\n    \\\n    uint32_t  k1 = 0; \\\n    uint32_t  k2 = 0; \\\n    uint32_t  k3 = 0; \\\n    uint32_t  k4 = 0; \\\n    \\\n    /* body */ \\\n    for (curr = blocks; curr != end; curr += 4) { \\\n        uint32_t  k1 = curr[0]; \\\n        uint32_t  k2 = curr[1]; \\\n        uint32_t  k3 = curr[2]; \\\n        uint32_t  k4 = curr[3]; \\\n        \\\n        k1 *= c1; k1  = CORK_ROTL32(k1,15); k1 *= c2; h1 ^= k1; \\\n        h1 = CORK_ROTL32(h1,19); h1 += h2; h1 = h1*5+0x561ccd1b; \\\n        \\\n        k2 *= c2; k2  = CORK_ROTL32(k2,16); k2 *= c3; h2 ^= k2; \\\n        h2 = CORK_ROTL32(h2,17); h2 += h3; h2 = h2*5+0x0bcaa747; \\\n        \\\n        k3 *= c3; k3  = CORK_ROTL32(k3,17); k3 *= c4; h3 ^= k3; \\\n        h3 = CORK_ROTL32(h3,15); h3 += h4; h3 = h3*5+0x96cd1c35; \\\n        \\\n        k4 *= c4; k4  = CORK_ROTL32(k4,18); k4 *= c1; h4 ^= k4; \\\n        h4 = CORK_ROTL32(h4,13); h4 += h1; h4 = h4*5+0x32ac3b17; \\\n    } \\\n    \\\n    /* tail */ \\\n    switch (len & 15) { \\\n        case 15: k4 ^= tail[14] << 16; \\\n        case 14: k4 ^= tail[13] << 8; \\\n        case 13: k4 ^= tail[12] << 0; \\\n                 k4 *= c4; k4 = CORK_ROTL32(k4,18); k4 *= c1; h4 ^= k4; \\\n        \\\n        case 12: k3 ^= tail[11] << 24; \\\n        case 11: k3 ^= tail[10] << 16; \\\n        case 10: k3 ^= tail[ 9] << 8; \\\n        case  9: k3 ^= tail[ 8] << 0; \\\n                 k3 *= c3; k3 = CORK_ROTL32(k3,17); k3 *= c4; h3 ^= k3; \\\n        \\\n        case  8: k2 ^= tail[ 7] << 24; \\\n        case  7: k2 ^= tail[ 6] << 16; \\\n        case  6: k2 ^= tail[ 5] << 8; \\\n        case  5: k2 ^= tail[ 4] << 0; \\\n                 k2 *= c2; k2 = CORK_ROTL32(k2,16); k2 *= c3; h2 ^= k2; \\\n        \\\n        case  4: k1 ^= tail[ 3] << 24; \\\n        case  3: k1 ^= tail[ 2] << 16; \\\n        case  2: k1 ^= tail[ 1] << 8; \\\n        case  1: k1 ^= tail[ 0] << 0; \\\n                 k1 *= c1; k1 = CORK_ROTL32(k1,15); k1 *= c2; h1 ^= k1; \\\n    }; \\\n    \\\n    /* finalization */ \\\n    \\\n    h1 ^= len; h2 ^= len; h3 ^= len; h4 ^= len; \\\n    \\\n    h1 += h2; h1 += h3; h1 += h4; \\\n    h2 += h1; h3 += h1; h4 += h1; \\\n    \\\n    h1 = cork_fmix32(h1); \\\n    h2 = cork_fmix32(h2); \\\n    h3 = cork_fmix32(h3); \\\n    h4 = cork_fmix32(h4); \\\n    \\\n    h1 += h2; h1 += h3; h1 += h4; \\\n    h2 += h1; h3 += h1; h4 += h1; \\\n    \\\n    (dest)->u128 = cork_u128_from_32(h1, h2, h3, h4); \\\n} while (0)\n\n#define cork_murmur_hash_x64_128(seed, src, len, dest) \\\ndo { \\\n    typedef uint64_t __attribute__((__may_alias__))  cork_aliased_uint64_t; \\\n    \\\n    const unsigned int  nblocks = len / 16; \\\n    const cork_aliased_uint64_t  *blocks = (const cork_aliased_uint64_t *) src; \\\n    const cork_aliased_uint64_t  *end = blocks + (nblocks * 2); \\\n    const cork_aliased_uint64_t  *curr; \\\n    const uint8_t  *tail = (const uint8_t *) end; \\\n    \\\n    uint64_t  h1 = cork_u128_be64(seed.u128, 0); \\\n    uint64_t  h2 = cork_u128_be64(seed.u128, 1); \\\n    \\\n    uint64_t  c1 = UINT64_C(0x87c37b91114253d5); \\\n    uint64_t  c2 = UINT64_C(0x4cf5ad432745937f); \\\n    \\\n    uint64_t k1 = 0; \\\n    uint64_t k2 = 0; \\\n    \\\n    /* body */ \\\n    for (curr = blocks; curr != end; curr += 2) { \\\n        uint64_t  k1 = curr[0]; \\\n        uint64_t  k2 = curr[1]; \\\n    \\\n        k1 *= c1; k1  = CORK_ROTL64(k1,31); k1 *= c2; h1 ^= k1; \\\n        h1 = CORK_ROTL64(h1,27); h1 += h2; h1 = h1*5+0x52dce729; \\\n    \\\n        k2 *= c2; k2  = CORK_ROTL64(k2,33); k2 *= c1; h2 ^= k2; \\\n        h2 = CORK_ROTL64(h2,31); h2 += h1; h2 = h2*5+0x38495ab5; \\\n    } \\\n    \\\n    /* tail */ \\\n    switch (len & 15) { \\\n        case 15: k2 ^= (uint64_t) (tail[14]) << 48; \\\n        case 14: k2 ^= (uint64_t) (tail[13]) << 40; \\\n        case 13: k2 ^= (uint64_t) (tail[12]) << 32; \\\n        case 12: k2 ^= (uint64_t) (tail[11]) << 24; \\\n        case 11: k2 ^= (uint64_t) (tail[10]) << 16; \\\n        case 10: k2 ^= (uint64_t) (tail[ 9]) << 8; \\\n        case  9: k2 ^= (uint64_t) (tail[ 8]) << 0; \\\n                 k2 *= c2; k2 = CORK_ROTL64(k2,33); k2 *= c1; h2 ^= k2; \\\n        \\\n        case  8: k1 ^= (uint64_t) (tail[ 7]) << 56; \\\n        case  7: k1 ^= (uint64_t) (tail[ 6]) << 48; \\\n        case  6: k1 ^= (uint64_t) (tail[ 5]) << 40; \\\n        case  5: k1 ^= (uint64_t) (tail[ 4]) << 32; \\\n        case  4: k1 ^= (uint64_t) (tail[ 3]) << 24; \\\n        case  3: k1 ^= (uint64_t) (tail[ 2]) << 16; \\\n        case  2: k1 ^= (uint64_t) (tail[ 1]) << 8; \\\n        case  1: k1 ^= (uint64_t) (tail[ 0]) << 0; \\\n                 k1 *= c1; k1 = CORK_ROTL64(k1,31); k1 *= c2; h1 ^= k1; \\\n    }; \\\n    \\\n    /* finalization */ \\\n    \\\n    h1 ^= len; h2 ^= len; \\\n    \\\n    h1 += h2; \\\n    h2 += h1; \\\n    \\\n    h1 = cork_fmix64(h1); \\\n    h2 = cork_fmix64(h2); \\\n    \\\n    h1 += h2; \\\n    h2 += h1; \\\n    \\\n    (dest)->u128 = cork_u128_from_64(h1, h2); \\\n} while (0)\n\n\n#include <stdio.h>\nCORK_HASH_ATTRIBUTES\ncork_hash\ncork_hash_buffer(cork_hash seed, const void *src, size_t len)\n{\n#if CORK_SIZEOF_POINTER == 8\n    cork_big_hash  big_seed = {cork_u128_from_32(seed, seed, seed, seed)};\n    cork_big_hash  hash;\n    cork_murmur_hash_x64_128(big_seed, src, len, &hash);\n    return cork_u128_be32(hash.u128, 0);\n#else\n    cork_hash  hash = 0;\n    cork_murmur_hash_x86_32(seed, src, len, &hash);\n    return hash;\n#endif\n}\n\n\nCORK_HASH_ATTRIBUTES\ncork_big_hash\ncork_big_hash_buffer(cork_big_hash seed, const void *src, size_t len)\n{\n    cork_big_hash  result;\n#if CORK_SIZEOF_POINTER == 8\n    cork_murmur_hash_x64_128(seed, src, len, &result);\n#else\n    cork_murmur_hash_x86_128(seed, src, len, &result);\n#endif\n    return result;\n}\n\n\n#define cork_hash_variable(seed, val) \\\n    (cork_hash_buffer((seed), &(val), sizeof((val))))\n#define cork_stable_hash_variable(seed, val) \\\n    (cork_stable_hash_buffer((seed), &(val), sizeof((val))))\n#define cork_big_hash_variable(seed, val) \\\n    (cork_big_hash_buffer((seed), &(val), sizeof((val))))\n\n\n#endif /* LIBCORK_CORE_HASH_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/core/id.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CORE_ID_H\n#define LIBCORK_CORE_ID_H\n\n#include <libcork/core/hash.h>\n\n\nstruct cork_uid {\n    const char  *name;\n};\n\ntypedef const struct cork_uid  *cork_uid;\n\n#define CORK_UID_NONE  ((cork_uid) NULL)\n\n#define cork_uid_define_named(c_name, name) \\\n    static const struct cork_uid  c_name##__id = { name }; \\\n    static cork_uid  c_name = &c_name##__id;\n#define cork_uid_define(c_name) \\\n    cork_uid_define_named(c_name, #c_name)\n\n#define cork_uid_equal(id1, id2)  ((id1) == (id2))\n#define cork_uid_hash(id)         ((cork_hash) (uintptr_t) (id))\n#define cork_uid_name(id)         ((id)->name)\n\n\n#endif /* LIBCORK_CORE_ID_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/core/mempool.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012-2015, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CORK_MEMPOOL_H\n#define LIBCORK_CORK_MEMPOOL_H\n\n\n#include <libcork/config.h>\n#include <libcork/core/api.h>\n#include <libcork/core/attributes.h>\n#include <libcork/core/callbacks.h>\n#include <libcork/core/types.h>\n\n\n#define CORK_MEMPOOL_DEFAULT_BLOCK_SIZE  4096\n\n\nstruct cork_mempool;\n\n\nCORK_API struct cork_mempool *\ncork_mempool_new_size_ex(size_t element_size, size_t block_size);\n\n#define cork_mempool_new_size(element_size) \\\n    (cork_mempool_new_size_ex \\\n     ((element_size), CORK_MEMPOOL_DEFAULT_BLOCK_SIZE))\n\n#define cork_mempool_new_ex(type, block_size) \\\n    (cork_mempool_new_size_ex(sizeof(type), (block_size)))\n\n#define cork_mempool_new(type) \\\n    (cork_mempool_new_size(sizeof(type)))\n\nCORK_API void\ncork_mempool_free(struct cork_mempool *mp);\n\n\nCORK_API void\ncork_mempool_set_user_data(struct cork_mempool *mp,\n                           void *user_data, cork_free_f free_user_data);\n\nCORK_API void\ncork_mempool_set_init_object(struct cork_mempool *mp, cork_init_f init_object);\n\nCORK_API void\ncork_mempool_set_done_object(struct cork_mempool *mp, cork_done_f done_object);\n\n/* Deprecated; you should now use separate calls to cork_mempool_set_user_data,\n * cork_mempool_set_init_object, and cork_mempool_set_done_object. */\nCORK_API void\ncork_mempool_set_callbacks(struct cork_mempool *mp,\n                           void *user_data, cork_free_f free_user_data,\n                           cork_init_f init_object,\n                           cork_done_f done_object);\n\n\nCORK_API void *\ncork_mempool_new_object(struct cork_mempool *mp);\n\n\nCORK_API void\ncork_mempool_free_object(struct cork_mempool *mp, void *ptr);\n\n\n#endif /* LIBCORK_CORK_MEMPOOL_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/core/net-addresses.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CORE_NET_ADDRESSES_H\n#define LIBCORK_CORE_NET_ADDRESSES_H\n\n\n#include <string.h>\n\n#include <libcork/core/api.h>\n#include <libcork/core/error.h>\n#include <libcork/core/types.h>\n\n\n/*-----------------------------------------------------------------------\n * IP addresses\n */\n\nstruct cork_ipv4 {\n    union {\n        uint8_t  u8[4];\n        uint16_t  u16[2];\n        uint32_t  u32;\n    } _;\n};\n\nstruct cork_ipv6 {\n    union {\n        uint8_t  u8[16];\n        uint16_t  u16[8];\n        uint32_t  u32[4];\n        uint64_t  u64[2];\n    } _;\n};\n\nstruct cork_ip {\n    /* Which version of IP address this is. */\n    unsigned int  version;\n    union {\n        struct cork_ipv4  v4;\n        struct cork_ipv6  v6;\n    } ip;\n};\n\n\n#define CORK_IPV4_STRING_LENGTH  (sizeof \"xxx.xxx.xxx.xxx\")\n#define CORK_IPV6_STRING_LENGTH \\\n    (sizeof \"ffff:ffff:ffff:ffff:ffff:ffff:255.255.255.255\")\n#define CORK_IP_STRING_LENGTH  CORK_IPV6_STRING_LENGTH\n\n\n/*** IPv4 ***/\n\n/* src must be well-formed: 4 bytes, big-endian */\n#define cork_ipv4_copy(addr, src) \\\n    (memcpy((addr), (src), sizeof(struct cork_ipv4)))\n\n#define cork_ipv4_equal(a1, a2) \\\n    ((a1)->_.u32 == (a2)->_.u32)\n\nCORK_API int\ncork_ipv4_init(struct cork_ipv4 *addr, const char *str);\n\nCORK_API bool\ncork_ipv4_equal_(const struct cork_ipv4 *addr1, const struct cork_ipv4 *addr2);\n\nCORK_API void\ncork_ipv4_to_raw_string(const struct cork_ipv4 *addr, char *dest);\n\nCORK_API bool\ncork_ipv4_is_valid_network(const struct cork_ipv4 *addr,\n                           unsigned int cidr_prefix);\n\n\n/*** IPv6 ***/\n\n/* src must be well-formed: 16 bytes, big-endian */\n#define cork_ipv6_copy(addr, src) \\\n    (memcpy((addr), (src), sizeof(struct cork_ipv6)))\n\n#define cork_ipv6_equal(a1, a2) \\\n    ((a1)->_.u64[0] == (a2)->_.u64[0] && \\\n     (a1)->_.u64[1] == (a2)->_.u64[1])\n\nCORK_API int\ncork_ipv6_init(struct cork_ipv6 *addr, const char *str);\n\nCORK_API bool\ncork_ipv6_equal_(const struct cork_ipv6 *addr1, const struct cork_ipv6 *addr2);\n\nCORK_API void\ncork_ipv6_to_raw_string(const struct cork_ipv6 *addr, char *dest);\n\nCORK_API bool\ncork_ipv6_is_valid_network(const struct cork_ipv6 *addr,\n                           unsigned int cidr_prefix);\n\n\n/*** Generic IP ***/\n\n#define cork_ip_equal(a1, a2) \\\n    ((a1)->version == 4? \\\n     ((a2)->version == 4 && cork_ipv4_equal(&(a1)->ip.v4, &(a2)->ip.v4)): \\\n     ((a2)->version == 6 && cork_ipv6_equal(&(a1)->ip.v6, &(a2)->ip.v6)))\n\n/* src must be well-formed: 4 bytes, big-endian */\n#define cork_ip_from_ipv4(addr, src) \\\n    do { \\\n        (addr)->version = 4; \\\n        cork_ipv4_copy(&(addr)->ip.v4, (src)); \\\n    } while (0)\n\n/* src must be well-formed: 16 bytes, big-endian */\n#define cork_ip_from_ipv6(addr, src) \\\n    do { \\\n        (addr)->version = 6; \\\n        cork_ipv6_copy(&(addr)->ip.v6, (src)); \\\n    } while (0)\n\n/* src must be well-formed: 4 bytes, big-endian */\nCORK_API void\ncork_ip_from_ipv4_(struct cork_ip *addr, const void *src);\n\n/* src must be well-formed: 16 bytes, big-endian */\nCORK_API void\ncork_ip_from_ipv6_(struct cork_ip *addr, const void *src);\n\nCORK_API int\ncork_ip_init(struct cork_ip *addr, const char *str);\n\nCORK_API bool\ncork_ip_equal_(const struct cork_ip *addr1, const struct cork_ip *addr2);\n\nCORK_API void\ncork_ip_to_raw_string(const struct cork_ip *addr, char *dest);\n\nCORK_API bool\ncork_ip_is_valid_network(const struct cork_ip *addr, unsigned int cidr_prefix);\n\n\n#endif /* LIBCORK_CORE_NET_ADDRESSES_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/core/timestamp.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CORE_TIMESTAMP_H\n#define LIBCORK_CORE_TIMESTAMP_H\n\n\n#include <libcork/core/api.h>\n#include <libcork/core/error.h>\n#include <libcork/core/types.h>\n#include <libcork/ds/buffer.h>\n\n\ntypedef uint64_t  cork_timestamp;\n\n\n#define cork_timestamp_init_sec(ts, sec) \\\n    do { \\\n        *(ts) = (((uint64_t) (sec)) << 32); \\\n    } while (0)\n\n#define cork_timestamp_init_gsec(ts, sec, gsec) \\\n    do { \\\n        *(ts) = (((uint64_t) (sec)) << 32) | \\\n                (((uint64_t) (gsec)) & 0xffffffff); \\\n    } while (0)\n\n#define cork_timestamp_init_msec(ts, sec, msec) \\\n    do { \\\n        *(ts) = (((uint64_t) (sec)) << 32) | \\\n                ((((uint64_t) (msec)) << 32) / 1000); \\\n    } while (0)\n\n#define cork_timestamp_init_usec(ts, sec, usec) \\\n    do { \\\n        *(ts) = (((uint64_t) (sec)) << 32) | \\\n                ((((uint64_t) (usec)) << 32) / 1000000); \\\n    } while (0)\n\n#define cork_timestamp_init_nsec(ts, sec, nsec) \\\n    do { \\\n        *(ts) = (((uint64_t) (sec)) << 32) | \\\n                ((((uint64_t) (nsec)) << 32) / 1000000000); \\\n    } while (0)\n\n\nCORK_API void\ncork_timestamp_init_now(cork_timestamp *ts);\n\n\n#define cork_timestamp_sec(ts)  ((uint32_t) ((ts) >> 32))\n#define cork_timestamp_gsec(ts)  ((uint32_t) ((ts) & 0xffffffff))\n\nCORK_ATTR_UNUSED\nstatic inline uint64_t\ncork_timestamp_gsec_to_units(const cork_timestamp ts, uint64_t denom)\n{\n    uint64_t  half = ((uint64_t) 1 << 31) / denom;\n    uint64_t  gsec = cork_timestamp_gsec(ts);\n    gsec += half;\n    gsec *= denom;\n    gsec >>= 32;\n    return gsec;\n}\n\n#define cork_timestamp_msec(ts)  cork_timestamp_gsec_to_units(ts, 1000)\n#define cork_timestamp_usec(ts)  cork_timestamp_gsec_to_units(ts, 1000000)\n#define cork_timestamp_nsec(ts)  cork_timestamp_gsec_to_units(ts, 1000000000)\n\n\nCORK_API int\ncork_timestamp_format_utc(const cork_timestamp ts, const char *format,\n                          struct cork_buffer *dest);\n\nCORK_API int\ncork_timestamp_format_local(const cork_timestamp ts, const char *format,\n                            struct cork_buffer *dest);\n\n\n#endif /* LIBCORK_CORE_TIMESTAMP_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/core/types.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CORE_TYPES_H\n#define LIBCORK_CORE_TYPES_H\n\n/* For now, we assume that the C99 integer types are available using the\n * standard headers. */\n\n#include <limits.h>\n#include <inttypes.h>\n#include <stdbool.h>\n#include <stddef.h>\n#include <stdint.h>\n\n\n/* Define preprocessor macros that contain the size of several built-in\n * types.  Again, we assume that we have the C99 definitions available. */\n\n#if SHRT_MAX == INT8_MAX\n#define CORK_SIZEOF_SHORT  1\n#elif SHRT_MAX == INT16_MAX\n#define CORK_SIZEOF_SHORT  2\n#elif SHRT_MAX == INT32_MAX\n#define CORK_SIZEOF_SHORT  4\n#elif SHRT_MAX == INT64_MAX\n#define CORK_SIZEOF_SHORT  8\n#else\n#error \"Cannot determine size of short\"\n#endif\n\n#if INT_MAX == INT8_MAX\n#define CORK_SIZEOF_INT  1\n#elif INT_MAX == INT16_MAX\n#define CORK_SIZEOF_INT  2\n#elif INT_MAX == INT32_MAX\n#define CORK_SIZEOF_INT  4\n#elif INT_MAX == INT64_MAX\n#define CORK_SIZEOF_INT  8\n#else\n#error \"Cannot determine size of int\"\n#endif\n\n#if LONG_MAX == INT8_MAX\n#define CORK_SIZEOF_LONG  1\n#elif LONG_MAX == INT16_MAX\n#define CORK_SIZEOF_LONG  2\n#elif LONG_MAX == INT32_MAX\n#define CORK_SIZEOF_LONG  4\n#elif LONG_MAX == INT64_MAX\n#define CORK_SIZEOF_LONG  8\n#else\n#error \"Cannot determine size of long\"\n#endif\n\n#if INTPTR_MAX == INT8_MAX\n#define CORK_SIZEOF_POINTER  1\n#elif INTPTR_MAX == INT16_MAX\n#define CORK_SIZEOF_POINTER  2\n#elif INTPTR_MAX == INT32_MAX\n#define CORK_SIZEOF_POINTER  4\n#elif INTPTR_MAX == INT64_MAX\n#define CORK_SIZEOF_POINTER  8\n#else\n#error \"Cannot determine size of void *\"\n#endif\n\n\n/* Return a pointer to a @c struct, given a pointer to one of its\n * fields. */\n#define cork_container_of(field, struct_type, field_name) \\\n    ((struct_type *) (- offsetof(struct_type, field_name) + \\\n                      (void *) (field)))\n\n#endif /* LIBCORK_CORE_TYPES_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/core/u128.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CORE_U128_H\n#define LIBCORK_CORE_U128_H\n\n\n#include <libcork/config.h>\n#include <libcork/core/attributes.h>\n#include <libcork/core/byte-order.h>\n#include <libcork/core/types.h>\n\ntypedef struct {\n    union {\n        uint8_t  u8[16];\n        uint16_t  u16[8];\n        uint32_t  u32[4];\n        uint64_t  u64[2];\n#if CORK_HOST_ENDIANNESS == CORK_BIG_ENDIAN\n        struct { uint64_t hi; uint64_t lo; } be64;\n#else\n        struct { uint64_t lo; uint64_t hi; } be64;\n#endif\n#if CORK_CONFIG_HAVE_GCC_INT128\n#define CORK_U128_HAVE_U128  1\n        unsigned __int128  u128;\n#elif CORK_CONFIG_HAVE_GCC_MODE_ATTRIBUTE\n#define CORK_U128_HAVE_U128  1\n        unsigned int  u128 __attribute__((mode(TI)));\n#else\n#define CORK_U128_HAVE_U128  0\n#endif\n    } _;\n} cork_u128;\n\n\n/* i0-3 are given in big-endian order, regardless of host endianness */\nCORK_ATTR_UNUSED\nstatic cork_u128\ncork_u128_from_32(uint32_t i0, uint32_t i1, uint32_t i2, uint32_t i3)\n{\n    cork_u128  value;\n#if CORK_HOST_ENDIANNESS == CORK_BIG_ENDIAN\n    value._.u32[0] = i0;\n    value._.u32[1] = i1;\n    value._.u32[2] = i2;\n    value._.u32[3] = i3;\n#else\n    value._.u32[3] = i0;\n    value._.u32[2] = i1;\n    value._.u32[1] = i2;\n    value._.u32[0] = i3;\n#endif\n    return value;\n}\n\n/* i0-1 are given in big-endian order, regardless of host endianness */\nCORK_ATTR_UNUSED\nstatic cork_u128\ncork_u128_from_64(uint64_t i0, uint64_t i1)\n{\n    cork_u128  value;\n#if CORK_HOST_ENDIANNESS == CORK_BIG_ENDIAN\n    value._.u64[0] = i0;\n    value._.u64[1] = i1;\n#else\n    value._.u64[1] = i0;\n    value._.u64[0] = i1;\n#endif\n    return value;\n}\n\n\n#if CORK_HOST_ENDIANNESS == CORK_BIG_ENDIAN\n#define cork_u128_be8(val, idx)   ((val)._.u8[(idx)])\n#define cork_u128_be16(val, idx)  ((val)._.u16[(idx)])\n#define cork_u128_be32(val, idx)  ((val)._.u32[(idx)])\n#define cork_u128_be64(val, idx)  ((val)._.u64[(idx)])\n#else\n#define cork_u128_be8(val, idx)   ((val)._.u8[15 - (idx)])\n#define cork_u128_be16(val, idx)  ((val)._.u16[7 - (idx)])\n#define cork_u128_be32(val, idx)  ((val)._.u32[3 - (idx)])\n#define cork_u128_be64(val, idx)  ((val)._.u64[1 - (idx)])\n#endif\n\n\nCORK_ATTR_UNUSED\nstatic cork_u128\ncork_u128_add(cork_u128 a, cork_u128 b)\n{\n    cork_u128  result;\n#if CORK_U128_HAVE_U128\n    result._.u128 = a._.u128 + b._.u128;\n#else\n    result._.be64.lo = a._.be64.lo + b._.be64.lo;\n    result._.be64.hi =\n        a._.be64.hi + b._.be64.hi + (result._.be64.lo < a._.be64.lo);\n#endif\n    return result;\n}\n\nCORK_ATTR_UNUSED\nstatic cork_u128\ncork_u128_sub(cork_u128 a, cork_u128 b)\n{\n    cork_u128  result;\n#if CORK_U128_HAVE_U128\n    result._.u128 = a._.u128 - b._.u128;\n#else\n    result._.be64.lo = a._.be64.lo - b._.be64.lo;\n    result._.be64.hi =\n        a._.be64.hi - b._.be64.hi - (result._.be64.lo > a._.be64.lo);\n#endif\n    return result;\n}\n\n\nCORK_ATTR_UNUSED\nstatic bool\ncork_u128_eq(cork_u128 a, cork_u128 b)\n{\n#if CORK_U128_HAVE_U128\n    return (a._.u128 == b._.u128);\n#else\n    return (a._.be64.hi == b._.be64.hi) && (a._.be64.lo == b._.be64.lo);\n#endif\n}\n\nCORK_ATTR_UNUSED\nstatic bool\ncork_u128_ne(cork_u128 a, cork_u128 b)\n{\n#if CORK_U128_HAVE_U128\n    return (a._.u128 != b._.u128);\n#else\n    return (a._.be64.hi != b._.be64.hi) || (a._.be64.lo != b._.be64.lo);\n#endif\n}\n\nCORK_ATTR_UNUSED\nstatic bool\ncork_u128_lt(cork_u128 a, cork_u128 b)\n{\n#if CORK_U128_HAVE_U128\n    return (a._.u128 < b._.u128);\n#else\n    if (a._.be64.hi == b._.be64.hi) {\n        return a._.be64.lo < b._.be64.lo;\n    } else {\n        return a._.be64.hi < b._.be64.hi;\n    }\n#endif\n}\n\nCORK_ATTR_UNUSED\nstatic bool\ncork_u128_le(cork_u128 a, cork_u128 b)\n{\n#if CORK_U128_HAVE_U128\n    return (a._.u128 <= b._.u128);\n#else\n    if (a._.be64.hi == b._.be64.hi) {\n        return a._.be64.lo <= b._.be64.lo;\n    } else {\n        return a._.be64.hi <= b._.be64.hi;\n    }\n#endif\n}\n\nCORK_ATTR_UNUSED\nstatic bool\ncork_u128_gt(cork_u128 a, cork_u128 b)\n{\n#if CORK_U128_HAVE_U128\n    return (a._.u128 > b._.u128);\n#else\n    if (a._.be64.hi == b._.be64.hi) {\n        return a._.be64.lo > b._.be64.lo;\n    } else {\n        return a._.be64.hi > b._.be64.hi;\n    }\n#endif\n}\n\nCORK_ATTR_UNUSED\nstatic bool\ncork_u128_ge(cork_u128 a, cork_u128 b)\n{\n#if CORK_U128_HAVE_U128\n    return (a._.u128 >= b._.u128);\n#else\n    if (a._.be64.hi == b._.be64.hi) {\n        return a._.be64.lo >= b._.be64.lo;\n    } else {\n        return a._.be64.hi >= b._.be64.hi;\n    }\n#endif\n}\n\n\n/* log10(x) = log2(x) / log2(10) ~= log2(x) / 3.322 */\n#define CORK_U128_DECIMAL_LENGTH  44  /* ~= 128 / 3 + 1 + 1 */\n\nCORK_API const char *\ncork_u128_to_decimal(char *buf, cork_u128 val);\n\n\n#define CORK_U128_HEX_LENGTH  33\n\nCORK_API const char *\ncork_u128_to_hex(char *buf, cork_u128 val);\n\nCORK_API const char *\ncork_u128_to_padded_hex(char *buf, cork_u128 val);\n\n\n#endif /* LIBCORK_CORE_U128_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/core.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CORE_H\n#define LIBCORK_CORE_H\n\n/*** include all of the parts ***/\n\n#include <libcork/core/allocator.h>\n#include <libcork/core/attributes.h>\n#include <libcork/core/byte-order.h>\n#include <libcork/core/callbacks.h>\n#include <libcork/core/error.h>\n#include <libcork/core/gc.h>\n#include <libcork/core/hash.h>\n#include <libcork/core/id.h>\n#include <libcork/core/mempool.h>\n#include <libcork/core/net-addresses.h>\n#include <libcork/core/timestamp.h>\n#include <libcork/core/types.h>\n#include <libcork/core/u128.h>\n\n#endif /* LIBCORK_CORE_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/ds/array.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_DS_ARRAY_H\n#define LIBCORK_DS_ARRAY_H\n\n\n#include <libcork/core/api.h>\n#include <libcork/core/callbacks.h>\n#include <libcork/core/types.h>\n\n\n/*-----------------------------------------------------------------------\n * Resizable arrays\n */\n\nstruct cork_array_priv;\n\nstruct cork_raw_array {\n    void  *items;\n    size_t  size;\n    struct cork_array_priv  *priv;\n};\n\nCORK_API void\ncork_raw_array_init(struct cork_raw_array *array, size_t element_size);\n\nCORK_API void\ncork_raw_array_done(struct cork_raw_array *array);\n\nCORK_API void\ncork_raw_array_set_callback_data(struct cork_raw_array *array,\n                                 void *user_data, cork_free_f free_user_data);\n\nCORK_API void\ncork_raw_array_set_init(struct cork_raw_array *array, cork_init_f init);\n\nCORK_API void\ncork_raw_array_set_done(struct cork_raw_array *array, cork_done_f done);\n\nCORK_API void\ncork_raw_array_set_reuse(struct cork_raw_array *array, cork_init_f reuse);\n\nCORK_API void\ncork_raw_array_set_remove(struct cork_raw_array *array, cork_done_f remove);\n\nCORK_API size_t\ncork_raw_array_element_size(const struct cork_raw_array *array);\n\nCORK_API void\ncork_raw_array_clear(struct cork_raw_array *array);\n\nCORK_API void *\ncork_raw_array_elements(const struct cork_raw_array *array);\n\nCORK_API void *\ncork_raw_array_at(const struct cork_raw_array *array, size_t index);\n\nCORK_API size_t\ncork_raw_array_size(const struct cork_raw_array *array);\n\nCORK_API bool\ncork_raw_array_is_empty(const struct cork_raw_array *array);\n\nCORK_API void\ncork_raw_array_ensure_size(struct cork_raw_array *array, size_t count);\n\nCORK_API void *\ncork_raw_array_append(struct cork_raw_array *array);\n\nCORK_API int\ncork_raw_array_copy(struct cork_raw_array *dest,\n                    const struct cork_raw_array *src,\n                    cork_copy_f copy, void *user_data);\n\n\n/*-----------------------------------------------------------------------\n * Type-checked resizable arrays\n */\n\n#define cork_array(T) \\\n    struct { \\\n        T  *items; \\\n        size_t  size; \\\n        struct cork_array_priv  *priv; \\\n    }\n\n#define cork_array_element_size(arr)  (sizeof((arr)->items[0]))\n#define cork_array_elements(arr)  ((arr)->items)\n#define cork_array_at(arr, i)     ((arr)->items[(i)])\n#define cork_array_size(arr)      ((arr)->size)\n#define cork_array_is_empty(arr)  ((arr)->size == 0)\n#define cork_array_to_raw(arr)    ((struct cork_raw_array *) (void *) (arr))\n\n#define cork_array_init(arr) \\\n    (cork_raw_array_init(cork_array_to_raw(arr), cork_array_element_size(arr)))\n#define cork_array_done(arr) \\\n    (cork_raw_array_done(cork_array_to_raw(arr)))\n\n#define cork_array_set_callback_data(arr, ud, fud) \\\n    (cork_raw_array_set_callback_data(cork_array_to_raw(arr), (ud), (fud)))\n#define cork_array_set_init(arr, i) \\\n    (cork_raw_array_set_init(cork_array_to_raw(arr), (i)))\n#define cork_array_set_done(arr, d) \\\n    (cork_raw_array_set_done(cork_array_to_raw(arr), (d)))\n#define cork_array_set_reuse(arr, r) \\\n    (cork_raw_array_set_reuse(cork_array_to_raw(arr), (r)))\n#define cork_array_set_remove(arr, r) \\\n    (cork_raw_array_set_remove(cork_array_to_raw(arr), (r)))\n\n#define cork_array_clear(arr) \\\n    (cork_raw_array_clear(cork_array_to_raw(arr)))\n#define cork_array_copy(d, s, c, ud) \\\n    (cork_raw_array_copy(cork_array_to_raw(d), cork_array_to_raw(s), (c), (ud)))\n\n#define cork_array_ensure_size(arr, count) \\\n    (cork_raw_array_ensure_size(cork_array_to_raw(arr), (count)))\n\n#define cork_array_append(arr, element) \\\n    (cork_raw_array_append(cork_array_to_raw(arr)), \\\n     ((arr)->items[(arr)->size - 1] = (element), (void) 0))\n\n#define cork_array_append_get(arr) \\\n    (cork_raw_array_append(cork_array_to_raw(arr)), \\\n     &(arr)->items[(arr)->size - 1])\n\n\n/*-----------------------------------------------------------------------\n * Builtin array types\n */\n\nCORK_API void\ncork_raw_pointer_array_init(struct cork_raw_array *array, cork_free_f free);\n\n#define cork_pointer_array_init(arr, f) \\\n    (cork_raw_pointer_array_init(cork_array_to_raw(arr), (f)))\n\nstruct cork_string_array {\n    const char  **items;\n    size_t  size;\n    struct cork_array_priv  *priv;\n};\n\nCORK_API void\ncork_string_array_init(struct cork_string_array *array);\n\nCORK_API void\ncork_string_array_append(struct cork_string_array *array, const char *str);\n\nCORK_API void\ncork_string_array_copy(struct cork_string_array *dest,\n                       const struct cork_string_array *src);\n\n\n#endif /* LIBCORK_DS_ARRAY_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/ds/bitset.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_DS_BITS_H\n#define LIBCORK_DS_BITS_H\n\n\n#include <libcork/core/api.h>\n#include <libcork/core/types.h>\n\n\n/*-----------------------------------------------------------------------\n * Bit sets\n */\n\nstruct cork_bitset {\n    uint8_t  *bits;\n    size_t  bit_count;\n    size_t  byte_count;\n};\n\nCORK_API struct cork_bitset *\ncork_bitset_new(size_t bit_count);\n\nCORK_API void\ncork_bitset_init(struct cork_bitset *set, size_t bit_count);\n\nCORK_API void\ncork_bitset_free(struct cork_bitset *set);\n\nCORK_API void\ncork_bitset_done(struct cork_bitset *set);\n\nCORK_API void\ncork_bitset_clear(struct cork_bitset *set);\n\n/* Extract the byte that contains a particular bit in an array. */\n#define cork_bitset_byte_for_bit(set, i) \\\n    ((set)->bits[(i) / 8])\n\n/* Create a bit mask that extracts a particular bit from the byte that it lives\n * in. */\n#define cork_bitset_pos_mask_for_bit(i) \\\n    (0x80 >> ((i) % 8))\n\n/* Create a bit mask that extracts everything except for a particular bit from\n * the byte that it lives in. */\n#define cork_bitset_neg_mask_for_bit(i) \\\n    (~cork_bitset_pos_mask_for_bit(i))\n\n/* Return whether a particular bit is set in a byte array.  Bits are numbered\n * from 0, in a big-endian order. */\n#define cork_bitset_get(set, i) \\\n    ((cork_bitset_byte_for_bit(set, i) & cork_bitset_pos_mask_for_bit(i)) != 0)\n\n/* Set (or unset) a particular bit is set in a byte array.  Bits are numbered\n * from 0, in a big-endian order. */\n#define cork_bitset_set(set, i, val) \\\n    (cork_bitset_byte_for_bit(set, i) = \\\n     (cork_bitset_byte_for_bit(set, i) & cork_bitset_neg_mask_for_bit(i)) \\\n     | ((val)? cork_bitset_pos_mask_for_bit(i): 0))\n\n\n#endif /* LIBCORK_DS_BITS_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/ds/buffer.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_DS_BUFFER_H\n#define LIBCORK_DS_BUFFER_H\n\n\n#include <stdarg.h>\n\n#include <libcork/core/api.h>\n#include <libcork/core/attributes.h>\n#include <libcork/core/types.h>\n\n\nstruct cork_buffer {\n    /* The current contents of the buffer. */\n    void  *buf;\n    /* The current size of the buffer. */\n    size_t  size;\n    /* The amount of space allocated for buf. */\n    size_t  allocated_size;\n};\n\n\nCORK_API void\ncork_buffer_init(struct cork_buffer *buffer);\n\n#define CORK_BUFFER_INIT()  { NULL, 0, 0 }\n\nCORK_API struct cork_buffer *\ncork_buffer_new(void);\n\nCORK_API void\ncork_buffer_done(struct cork_buffer *buffer);\n\nCORK_API void\ncork_buffer_free(struct cork_buffer *buffer);\n\n\nCORK_API bool\ncork_buffer_equal(const struct cork_buffer *buffer1,\n                  const struct cork_buffer *buffer2);\n\n\nCORK_API void\ncork_buffer_ensure_size(struct cork_buffer *buffer, size_t desired_size);\n\n\nCORK_API void\ncork_buffer_clear(struct cork_buffer *buffer);\n\nCORK_API void\ncork_buffer_truncate(struct cork_buffer *buffer, size_t length);\n\n#define cork_buffer_byte(buffer, i)  (((const uint8_t *) (buffer)->buf)[(i)])\n#define cork_buffer_char(buffer, i)  (((const char *) (buffer)->buf)[(i)])\n\n\n/*-----------------------------------------------------------------------\n * A whole bunch of methods for adding data\n */\n\n#define cork_buffer_copy(dest, src) \\\n    (cork_buffer_set((dest), (src)->buf, (src)->size))\n\nCORK_API void\ncork_buffer_set(struct cork_buffer *buffer, const void *src, size_t length);\n\n#define cork_buffer_append_copy(dest, src) \\\n    (cork_buffer_append((dest), (src)->buf, (src)->size))\n\nCORK_API void\ncork_buffer_append(struct cork_buffer *buffer, const void *src, size_t length);\n\n\nCORK_API void\ncork_buffer_set_string(struct cork_buffer *buffer, const char *str);\n\nCORK_API void\ncork_buffer_append_string(struct cork_buffer *buffer, const char *str);\n\n#define cork_buffer_set_literal(buffer, str) \\\n    (cork_buffer_set((buffer), (str), sizeof((str)) - 1))\n\n#define cork_buffer_append_literal(buffer, str) \\\n    (cork_buffer_append((buffer), (str), sizeof((str)) - 1))\n\n\nCORK_API void\ncork_buffer_printf(struct cork_buffer *buffer, const char *format, ...)\n    CORK_ATTR_PRINTF(2,3);\n\nCORK_API void\ncork_buffer_append_printf(struct cork_buffer *buffer, const char *format, ...)\n    CORK_ATTR_PRINTF(2,3);\n\nCORK_API void\ncork_buffer_vprintf(struct cork_buffer *buffer, const char *format,\n                    va_list args)\n    CORK_ATTR_PRINTF(2,0);\n\nCORK_API void\ncork_buffer_append_vprintf(struct cork_buffer *buffer, const char *format,\n                           va_list args)\n    CORK_ATTR_PRINTF(2,0);\n\n\n/*-----------------------------------------------------------------------\n * Some helpers for pretty-printing data\n */\n\nCORK_API void\ncork_buffer_append_indent(struct cork_buffer *buffer, size_t indent);\n\nCORK_API void\ncork_buffer_append_c_string(struct cork_buffer *buffer,\n                            const char *src, size_t length);\n\nCORK_API void\ncork_buffer_append_hex_dump(struct cork_buffer *buffer, size_t indent,\n                            const char *src, size_t length);\n\nCORK_API void\ncork_buffer_append_multiline(struct cork_buffer *buffer, size_t indent,\n                             const char *src, size_t length);\n\nCORK_API void\ncork_buffer_append_binary(struct cork_buffer *buffer, size_t indent,\n                          const char *src, size_t length);\n\n\n/*-----------------------------------------------------------------------\n * Buffer's managed buffer/slice implementation\n */\n\n#include <libcork/ds/managed-buffer.h>\n#include <libcork/ds/slice.h>\n\nCORK_API struct cork_managed_buffer *\ncork_buffer_to_managed_buffer(struct cork_buffer *buffer);\n\nCORK_API int\ncork_buffer_to_slice(struct cork_buffer *buffer, struct cork_slice *slice);\n\n\n/*-----------------------------------------------------------------------\n * Buffer's stream consumer implementation\n */\n\n#include <libcork/ds/stream.h>\n\nCORK_API struct cork_stream_consumer *\ncork_buffer_to_stream_consumer(struct cork_buffer *buffer);\n\n\n#endif /* LIBCORK_DS_BUFFER_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/ds/dllist.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_DS_DLLIST_H\n#define LIBCORK_DS_DLLIST_H\n\n#include <libcork/core/api.h>\n#include <libcork/core/types.h>\n\n\nstruct cork_dllist_item {\n    /* A pointer to the next element in the list. */\n    struct cork_dllist_item  *next;\n    /* A pointer to the previous element in the list. */\n    struct cork_dllist_item  *prev;\n};\n\n\nstruct cork_dllist {\n    /* The sentinel element for this list. */\n    struct cork_dllist_item  head;\n};\n\n#define CORK_DLLIST_INIT(list)  { { &(list).head, &(list).head } }\n\n#define cork_dllist_init(list) \\\n    do { \\\n        (list)->head.next = &(list)->head; \\\n        (list)->head.prev = &(list)->head; \\\n    } while (0)\n\n\n\n/* DEPRECATED!  Use cork_dllist_foreach or cork_dllist_visit instead. */\ntypedef void\n(*cork_dllist_map_func)(struct cork_dllist_item *element, void *user_data);\n\nCORK_API void\ncork_dllist_map(struct cork_dllist *list,\n                cork_dllist_map_func func, void *user_data);\n\n\ntypedef int\ncork_dllist_visit_f(void *ud, struct cork_dllist_item *element);\n\nCORK_API int\ncork_dllist_visit(struct cork_dllist *list, void *ud,\n                  cork_dllist_visit_f *visit);\n\n\n#define cork_dllist_foreach_void(list, curr, _next) \\\n    for ((curr) = cork_dllist_start((list)), (_next) = (curr)->next; \\\n         !cork_dllist_is_end((list), (curr)); \\\n         (curr) = (_next), (_next) = (curr)->next)\n\n#define cork_dllist_foreach(list, curr, _next, etype, element, item_field) \\\n    for ((curr) = cork_dllist_start((list)), (_next) = (curr)->next, \\\n         (element) = cork_container_of((curr), etype, item_field); \\\n         !cork_dllist_is_end((list), (curr)); \\\n         (curr) = (_next), (_next) = (curr)->next, \\\n         (element) = cork_container_of((curr), etype, item_field))\n\n\nCORK_API size_t\ncork_dllist_size(const struct cork_dllist *list);\n\n\n#define cork_dllist_add_after(pred, element) \\\n    do { \\\n        (element)->prev = (pred); \\\n        (element)->next = (pred)->next; \\\n        (pred)->next->prev = (element); \\\n        (pred)->next = (element); \\\n    } while (0)\n\n#define cork_dllist_add_before(succ, element) \\\n    do { \\\n        (element)->next = (succ); \\\n        (element)->prev = (succ)->prev; \\\n        (succ)->prev->next = (element); \\\n        (succ)->prev = (element); \\\n    } while (0)\n\n#define cork_dllist_add_to_head(list, element) \\\n    cork_dllist_add_after(&(list)->head, (element))\n\n#define cork_dllist_add_to_tail(list, element) \\\n    cork_dllist_add_before(&(list)->head, (element))\n\n#define cork_dllist_add  cork_dllist_add_to_tail\n\n\n#define cork_dllist_add_list_to_head(dest, src) \\\n    do { \\\n        struct cork_dllist_item  *dest_start = cork_dllist_start(dest); \\\n        struct cork_dllist_item  *src_start = cork_dllist_start(src); \\\n        dest_start->prev = &(src)->head; \\\n        src_start->prev = &(dest)->head; \\\n        (src)->head.next = dest_start; \\\n        (dest)->head.next = src_start; \\\n        cork_dllist_remove(&(src)->head); \\\n        cork_dllist_init(src); \\\n    } while (0)\n\n#define cork_dllist_add_list_to_tail(dest, src) \\\n    do { \\\n        struct cork_dllist_item  *dest_end = cork_dllist_end(dest); \\\n        struct cork_dllist_item  *src_end = cork_dllist_end(src); \\\n        dest_end->next = &(src)->head; \\\n        src_end->next = &(dest)->head; \\\n        (src)->head.prev = dest_end; \\\n        (dest)->head.prev = src_end; \\\n        cork_dllist_remove(&(src)->head); \\\n        cork_dllist_init(src); \\\n    } while (0)\n\n\n#define cork_dllist_remove(element) \\\n    do { \\\n        (element)->prev->next = (element)->next; \\\n        (element)->next->prev = (element)->prev; \\\n    } while (0)\n\n\n#define cork_dllist_is_empty(list) \\\n    (cork_dllist_is_end((list), cork_dllist_start((list))))\n\n\n#define cork_dllist_head(list) \\\n    (((list)->head.next == &(list)->head)? NULL: (list)->head.next)\n#define cork_dllist_tail(list) \\\n    (((list)->head.prev == &(list)->head)? NULL: (list)->head.prev)\n\n#define cork_dllist_start(list) \\\n    ((list)->head.next)\n#define cork_dllist_end(list) \\\n    ((list)->head.prev)\n\n#define cork_dllist_is_start(list, element) \\\n    ((element) == &(list)->head)\n#define cork_dllist_is_end(list, element) \\\n    ((element) == &(list)->head)\n\n\n#endif /* LIBCORK_DS_DLLIST_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/ds/hash-table.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_DS_HASH_TABLE_H\n#define LIBCORK_DS_HASH_TABLE_H\n\n#include <libcork/core/api.h>\n#include <libcork/core/callbacks.h>\n#include <libcork/core/hash.h>\n#include <libcork/core/mempool.h>\n#include <libcork/core/types.h>\n#include <libcork/ds/dllist.h>\n\n\n/*-----------------------------------------------------------------------\n * Hash tables\n */\n\nstruct cork_hash_table_entry {\n    cork_hash  hash;\n    void  *key;\n    void  *value;\n};\n\n\nstruct cork_hash_table;\n\nCORK_API struct cork_hash_table *\ncork_hash_table_new(size_t initial_size, unsigned int flags);\n\nCORK_API void\ncork_hash_table_free(struct cork_hash_table *table);\n\n\nCORK_API void\ncork_hash_table_set_user_data(struct cork_hash_table *table,\n                              void *user_data, cork_free_f free_user_data);\n\nCORK_API void\ncork_hash_table_set_equals(struct cork_hash_table *table, cork_equals_f equals);\n\nCORK_API void\ncork_hash_table_set_free_key(struct cork_hash_table *table, cork_free_f free);\n\nCORK_API void\ncork_hash_table_set_free_value(struct cork_hash_table *table, cork_free_f free);\n\nCORK_API void\ncork_hash_table_set_hash(struct cork_hash_table *table, cork_hash_f hash);\n\n\nCORK_API void\ncork_hash_table_clear(struct cork_hash_table *table);\n\n\nCORK_API void\ncork_hash_table_ensure_size(struct cork_hash_table *table,\n                            size_t desired_count);\n\nCORK_API size_t\ncork_hash_table_size(const struct cork_hash_table *table);\n\n\nCORK_API void *\ncork_hash_table_get(const struct cork_hash_table *table, const void *key);\n\nCORK_API void *\ncork_hash_table_get_hash(const struct cork_hash_table *table,\n                         cork_hash hash, const void *key);\n\nCORK_API struct cork_hash_table_entry *\ncork_hash_table_get_entry(const struct cork_hash_table *table,\n                          const void *key);\n\nCORK_API struct cork_hash_table_entry *\ncork_hash_table_get_entry_hash(const struct cork_hash_table *table,\n                               cork_hash hash, const void *key);\n\nCORK_API struct cork_hash_table_entry *\ncork_hash_table_get_or_create(struct cork_hash_table *table,\n                              void *key, bool *is_new);\n\nCORK_API struct cork_hash_table_entry *\ncork_hash_table_get_or_create_hash(struct cork_hash_table *table,\n                                   cork_hash hash, void *key, bool *is_new);\n\nCORK_API void\ncork_hash_table_put(struct cork_hash_table *table,\n                    void *key, void *value,\n                    bool *is_new, void **old_key, void **old_value);\n\nCORK_API void\ncork_hash_table_put_hash(struct cork_hash_table *table,\n                         cork_hash hash, void *key, void *value,\n                         bool *is_new, void **old_key, void **old_value);\n\nCORK_API void\ncork_hash_table_delete_entry(struct cork_hash_table *table,\n                             struct cork_hash_table_entry *entry);\n\nCORK_API bool\ncork_hash_table_delete(struct cork_hash_table *table, const void *key,\n                       void **deleted_key, void **deleted_value);\n\nCORK_API bool\ncork_hash_table_delete_hash(struct cork_hash_table *table,\n                            cork_hash hash, const void *key,\n                            void **deleted_key, void **deleted_value);\n\n\nenum cork_hash_table_map_result {\n    /* Abort the current @ref cork_hash_table_map operation. */\n    CORK_HASH_TABLE_MAP_ABORT = 0,\n    /* Continue on to the next entry in the hash table. */\n    CORK_HASH_TABLE_MAP_CONTINUE = 1,\n    /* Delete the entry that was just processed, and then continue on to\n     * the next entry in the hash table. */\n    CORK_HASH_TABLE_MAP_DELETE = 2\n};\n\ntypedef enum cork_hash_table_map_result\n(*cork_hash_table_map_f)(void *user_data, struct cork_hash_table_entry *entry);\n\nCORK_API void\ncork_hash_table_map(struct cork_hash_table *table, void *user_data,\n                    cork_hash_table_map_f mapper);\n\n\nstruct cork_hash_table_iterator {\n    struct cork_hash_table  *table;\n    void  *priv;\n};\n\nCORK_API void\ncork_hash_table_iterator_init(struct cork_hash_table *table,\n                              struct cork_hash_table_iterator *iterator);\n\nCORK_API struct cork_hash_table_entry *\ncork_hash_table_iterator_next(struct cork_hash_table_iterator *iterator);\n\n\n/*-----------------------------------------------------------------------\n * Built-in key types\n */\n\nCORK_API struct cork_hash_table *\ncork_string_hash_table_new(size_t initial_size, unsigned int flags);\n\nCORK_API struct cork_hash_table *\ncork_pointer_hash_table_new(size_t initial_size, unsigned int flags);\n\n\n#endif /* LIBCORK_DS_HASH_TABLE_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/ds/managed-buffer.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_DS_MANAGED_BUFFER_H\n#define LIBCORK_DS_MANAGED_BUFFER_H\n\n#include <libcork/core/api.h>\n#include <libcork/core/types.h>\n#include <libcork/ds/slice.h>\n\n\n/*-----------------------------------------------------------------------\n * Managed buffers\n */\n\nstruct cork_managed_buffer;\n\nstruct cork_managed_buffer_iface {\n    /* Free the contents of a managed buffer, and the managed buffer\n     * object itself. */\n    void\n    (*free)(struct cork_managed_buffer *buf);\n};\n\n\nstruct cork_managed_buffer {\n    /* The buffer that this instance manages */\n    const void  *buf;\n    /* The size of buf */\n    size_t  size;\n    /* A reference count for the buffer.  If this drops to 0, the buffer\n     * will be finalized. */\n    volatile int  ref_count;\n    /* The managed buffer implementation for this instance. */\n    struct cork_managed_buffer_iface  *iface;\n};\n\n\nCORK_API struct cork_managed_buffer *\ncork_managed_buffer_new_copy(const void *buf, size_t size);\n\n\ntypedef void\n(*cork_managed_buffer_freer)(void *buf, size_t size);\n\nCORK_API struct cork_managed_buffer *\ncork_managed_buffer_new(const void *buf, size_t size,\n                        cork_managed_buffer_freer free);\n\n\nCORK_API struct cork_managed_buffer *\ncork_managed_buffer_ref(struct cork_managed_buffer *buf);\n\nCORK_API void\ncork_managed_buffer_unref(struct cork_managed_buffer *buf);\n\n\nCORK_API int\ncork_managed_buffer_slice(struct cork_slice *dest,\n                          struct cork_managed_buffer *buffer,\n                          size_t offset, size_t length);\n\nCORK_API int\ncork_managed_buffer_slice_offset(struct cork_slice *dest,\n                                 struct cork_managed_buffer *buffer,\n                                 size_t offset);\n\n\n#endif /* LIBCORK_DS_MANAGED_BUFFER_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/ds/ring-buffer.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_DS_RING_BUFFER_H\n#define LIBCORK_DS_RING_BUFFER_H\n\n#include <libcork/core/api.h>\n#include <libcork/core/types.h>\n\n\nstruct cork_ring_buffer {\n    /* The elements of the ring buffer */\n    void  **elements;\n    /* The number of elements that can be stored in this ring\n     * buffer. */\n    size_t  allocated_size;\n    /* The actual number of elements currently in the ring buffer. */\n    size_t  size;\n    /* The index of the next element to read from the buffer */\n    size_t  read_index;\n    /* The index of the next element to write into the buffer */\n    size_t  write_index;\n};\n\n\nCORK_API int\ncork_ring_buffer_init(struct cork_ring_buffer *buf, size_t size);\n\nCORK_API struct cork_ring_buffer *\ncork_ring_buffer_new(size_t size);\n\nCORK_API void\ncork_ring_buffer_done(struct cork_ring_buffer *buf);\n\nCORK_API void\ncork_ring_buffer_free(struct cork_ring_buffer *buf);\n\n\n#define cork_ring_buffer_is_empty(buf) ((buf)->size == 0)\n#define cork_ring_buffer_is_full(buf) ((buf)->size == (buf)->allocated_size)\n\n\nCORK_API int\ncork_ring_buffer_add(struct cork_ring_buffer *buf, void *element);\n\nCORK_API void *\ncork_ring_buffer_pop(struct cork_ring_buffer *buf);\n\nCORK_API void *\ncork_ring_buffer_peek(struct cork_ring_buffer *buf);\n\n\n#endif /* LIBCORK_DS_RING_BUFFER_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/ds/slice.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_DS_SLICE_H\n#define LIBCORK_DS_SLICE_H\n\n#include <libcork/core/api.h>\n#include <libcork/core/types.h>\n\n\n/*-----------------------------------------------------------------------\n * Error handling\n */\n\n/* hash of \"libcork/ds/slice.h\" */\n#define CORK_SLICE_ERROR  0x960ca750\n\nenum cork_slice_error {\n    /* Trying to slice a nonexistent subset of a buffer */\n    CORK_SLICE_INVALID_SLICE\n};\n\n\n/*-----------------------------------------------------------------------\n * Slices\n */\n\nstruct cork_slice;\n\nstruct cork_slice_iface {\n    /* Free the slice.  Can be NULL if you don't need to free any\n     * underlying buffer. */\n    void\n    (*free)(struct cork_slice *self);\n\n    /* Create a copy of a slice.  You can assume that offset and length\n     * refer to a valid subset of the buffer. */\n    int\n    (*copy)(struct cork_slice *dest, const struct cork_slice *self,\n            size_t offset, size_t length);\n\n    /* Create a “light” copy of a slice.  A light copy is not allowed to exist\n     * longer than the slice that it was copied from, which can sometimes let\n     * you perform less work to produce the copy.  You can assume that offset\n     * and length refer to a valid subset of the buffer. */\n    int\n    (*light_copy)(struct cork_slice *dest, const struct cork_slice *self,\n                  size_t offset, size_t length);\n\n    /* Update the current slice to point at a different subset.  You can\n     * assume that offset and length refer to a valid subset of the\n     * buffer.  Can be NULL if you don't need to do anything special to\n     * the underlying buffer; in this case, we'll update the slice's buf\n     * and size fields for you. */\n    int\n    (*slice)(struct cork_slice *self, size_t offset, size_t length);\n};\n\n\nstruct cork_slice {\n    /* The beginning of the sliced portion of the buffer. */\n    const void  *buf;\n    /* The length of the sliced portion of the buffer. */\n    size_t  size;\n    /* The slice implementation of the underlying buffer. */\n    struct cork_slice_iface  *iface;\n    /* An opaque pointer used by the slice implementation to refer to\n     * the underlying buffer. */\n    void  *user_data;\n};\n\n\nCORK_API void\ncork_slice_clear(struct cork_slice *slice);\n\n#define cork_slice_is_empty(slice)  ((slice)->buf == NULL)\n\n\nCORK_API int\ncork_slice_copy(struct cork_slice *dest, const struct cork_slice *slice,\n                size_t offset, size_t length);\n\n#define cork_slice_copy_fast(dest, slice, offset, length) \\\n    ((slice)->iface->copy((dest), (slice), (offset), (length)))\n\nCORK_API int\ncork_slice_copy_offset(struct cork_slice *dest, const struct cork_slice *slice,\n                       size_t offset);\n\n#define cork_slice_copy_offset_fast(dest, slice, offset) \\\n    ((slice)->iface->copy \\\n     ((dest), (slice), (offset), (slice)->size - (offset)))\n\n\nCORK_API int\ncork_slice_light_copy(struct cork_slice *dest, const struct cork_slice *slice,\n                      size_t offset, size_t length);\n\n#define cork_slice_light_copy_fast(dest, slice, offset, length) \\\n    ((slice)->iface->light_copy((dest), (slice), (offset), (length)))\n\nCORK_API int\ncork_slice_light_copy_offset(struct cork_slice *dest,\n                             const struct cork_slice *slice, size_t offset);\n\n#define cork_slice_light_copy_offset_fast(dest, slice, offset) \\\n    ((slice)->iface->light_copy \\\n     ((dest), (slice), (offset), (slice)->size - (offset)))\n\n\nCORK_API int\ncork_slice_slice(struct cork_slice *slice, size_t offset, size_t length);\n\n#define cork_slice_slice_fast(_slice, offset, length) \\\n    ((_slice)->iface->slice == NULL? \\\n     ((_slice)->buf += (offset), (_slice)->size = (length), 0): \\\n     ((_slice)->iface->slice((_slice), (offset), (length))))\n\nCORK_API int\ncork_slice_slice_offset(struct cork_slice *slice, size_t offset);\n\n#define cork_slice_slice_offset_fast(_slice, offset) \\\n    ((_slice)->iface->slice == NULL? \\\n     ((_slice)->buf += (offset), (_slice)->size -= (offset), 0): \\\n     ((_slice)->iface->slice \\\n      ((_slice), (offset), (_slice)->size - (offset))))\n\n\nCORK_API void\ncork_slice_finish(struct cork_slice *slice);\n\nCORK_API bool\ncork_slice_equal(const struct cork_slice *slice1,\n                 const struct cork_slice *slice2);\n\nCORK_API void\ncork_slice_init_static(struct cork_slice *dest, const void *buf, size_t size);\n\nCORK_API void\ncork_slice_init_copy_once(struct cork_slice *dest, const void *buf,\n                          size_t size);\n\n\n#endif /* LIBCORK_DS_SLICE_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/ds/stream.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_DS_STREAM_H\n#define LIBCORK_DS_STREAM_H\n\n#include <stdio.h>\n\n#include <libcork/core/api.h>\n#include <libcork/core/types.h>\n\n\nstruct cork_stream_consumer {\n    int\n    (*data)(struct cork_stream_consumer *consumer,\n            const void *buf, size_t size, bool is_first_chunk);\n\n    int\n    (*eof)(struct cork_stream_consumer *consumer);\n\n    void\n    (*free)(struct cork_stream_consumer *consumer);\n};\n\n\n#define cork_stream_consumer_data(consumer, buf, size, is_first) \\\n    ((consumer)->data((consumer), (buf), (size), (is_first)))\n\n#define cork_stream_consumer_eof(consumer) \\\n    ((consumer)->eof((consumer)))\n\n#define cork_stream_consumer_free(consumer) \\\n    ((consumer)->free((consumer)))\n\n\nCORK_API int\ncork_consume_fd(struct cork_stream_consumer *consumer, int fd);\n\nCORK_API int\ncork_consume_file(struct cork_stream_consumer *consumer, FILE *fp);\n\nCORK_API int\ncork_consume_file_from_path(struct cork_stream_consumer *consumer,\n                            const char *path, int flags);\n\n\nCORK_API struct cork_stream_consumer *\ncork_fd_consumer_new(int fd);\n\nCORK_API struct cork_stream_consumer *\ncork_file_consumer_new(FILE *fp);\n\nCORK_API struct cork_stream_consumer *\ncork_file_from_path_consumer_new(const char *path, int flags);\n\n\n#endif /* LIBCORK_DS_STREAM_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/ds.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_DS_H\n#define LIBCORK_DS_H\n\n/*** include all of the parts ***/\n\n#include <libcork/ds/array.h>\n#include <libcork/ds/bitset.h>\n#include <libcork/ds/buffer.h>\n#include <libcork/ds/dllist.h>\n#include <libcork/ds/hash-table.h>\n#include <libcork/ds/managed-buffer.h>\n#include <libcork/ds/ring-buffer.h>\n#include <libcork/ds/slice.h>\n#include <libcork/ds/stream.h>\n\n#endif /* LIBCORK_DS_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/helpers/errors.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_HELPERS_ERRORS_H\n#define LIBCORK_HELPERS_ERRORS_H\n\n\n/* This header is *not* automatically included when you include\n * libcork/core.h, since we define some macros that don't include a\n * cork_ or CORK_ prefix.  Don't want to pollute your namespace unless\n * you ask for it! */\n\n\n#include <libcork/core/allocator.h>\n#include <libcork/core/attributes.h>\n#include <libcork/core/error.h>\n\n\n#if !defined(CORK_PRINT_ERRORS)\n#define CORK_PRINT_ERRORS 0\n#endif\n\n#if !defined(CORK_PRINT_ERROR)\n#if CORK_PRINT_ERRORS\n#include <stdio.h>\n#define CORK_PRINT_ERROR_(func, file, line) \\\n    fprintf(stderr, \"---\\nError in %s (%s:%u)\\n  %s\\n\", \\\n            (func), (file), (unsigned int) (line), \\\n            cork_error_message());\n#define CORK_PRINT_ERROR()  CORK_PRINT_ERROR_(__func__, __FILE__, __LINE__)\n#else\n#define CORK_PRINT_ERROR()  /* do nothing */\n#endif\n#endif\n\n\n/* A bunch of macros for calling a function that returns an error.  If\n * an error occurs, it will automatically be propagated out as the\n * result of your own function.  With these macros, you won't have a\n * check to check or modify the error condition; it's returned as-is.\n *\n *   XZ_check\n *\n * where:\n *\n *   X = what happens if an error occurs\n *       \"e\" = jump to the \"error\" label\n *       \"rY\" = return a default error result (Y defined below)\n *       \"x\" = return an error result that you specify\n *\n *   Y = your return type\n *       \"i\" = int\n *       \"p\" = some pointer type\n *\n *   Z = the return type of the function you're calling\n *       \"e\" = use cork_error_occurred() to check\n *       \"i\" = int\n *       \"p\" = some pointer type\n *\n * In all cases, we assume that your function has a cork_error parameter\n * called \"err\".\n */\n\n\n/* jump to \"error\" label */\n\n#define ee_check(call) \\\n    do { \\\n        (call); \\\n        if (CORK_UNLIKELY(cork_error_occurred())) { \\\n            CORK_PRINT_ERROR(); \\\n            goto error; \\\n        } \\\n    } while (0)\n\n#define ei_check(call) \\\n    do { \\\n        int  __rc = (call); \\\n        if (CORK_UNLIKELY(__rc != 0)) { \\\n            CORK_PRINT_ERROR(); \\\n            goto error; \\\n        } \\\n    } while (0)\n\n#define ep_check(call) \\\n    do { \\\n        const void  *__result = (call); \\\n        if (CORK_UNLIKELY(__result == NULL)) { \\\n            CORK_PRINT_ERROR(); \\\n            goto error; \\\n        } \\\n    } while (0)\n\n\n/* return specific error code */\n\n#define xe_check(result, call) \\\n    do { \\\n        (call); \\\n        if (CORK_UNLIKELY(cork_error_occurred())) { \\\n            CORK_PRINT_ERROR(); \\\n            return result; \\\n        } \\\n    } while (0)\n\n#define xi_check(result, call) \\\n    do { \\\n        int  __rc = (call); \\\n        if (CORK_UNLIKELY(__rc != 0)) { \\\n            CORK_PRINT_ERROR(); \\\n            return result; \\\n        } \\\n    } while (0)\n\n#define xp_check(result, call) \\\n    do { \\\n        const void  *__result = (call); \\\n        if (CORK_UNLIKELY(__result == NULL)) { \\\n            CORK_PRINT_ERROR(); \\\n            return result; \\\n        } \\\n    } while (0)\n\n\n/* return default error code */\n\n#define rie_check(call)  xe_check(-1, call)\n#define rii_check(call)  xi_check(__rc, call)\n#define rip_check(call)  xp_check(-1, call)\n#define rpe_check(call)  xe_check(NULL, call)\n#define rpi_check(call)  xi_check(NULL, call)\n#define rpp_check(call)  xp_check(NULL, call)\n\n\n#endif /* LIBCORK_HELPERS_ERRORS_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/helpers/gc.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2011-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_HELPERS_REFCOUNT_H\n#define LIBCORK_HELPERS_REFCOUNT_H\n\n\n#include <libcork/core/gc.h>\n#include <libcork/core/types.h>\n\n\n#define _free_(name) \\\nstatic void \\\nname##__free(void *obj)\n\n\n#define _recurse_(name) \\\nstatic void \\\nname##__recurse(struct cork_gc *gc, void *obj, \\\n                cork_gc_recurser recurse, void *ud)\n\n\n#define _gc_(name) \\\nstatic struct cork_gc_obj_iface  name##__gc = { \\\n    name##__free, name##__recurse \\\n};\n\n#define _gc_no_free_(name) \\\nstatic struct cork_gc_obj_iface  name##__gc = { \\\n    NULL, name##__recurse \\\n};\n\n#define _gc_no_recurse_(name) \\\nstatic struct cork_gc_obj_iface  name##__gc = { \\\n    name##__free, NULL \\\n};\n\n#define _gc_leaf_(name) \\\nstatic struct cork_gc_obj_iface  name##__gc = { \\\n    NULL, NULL \\\n};\n\n\n#endif /* LIBCORK_HELPERS_REFCOUNT_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/helpers/posix.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_HELPERS_POSIX_H\n#define LIBCORK_HELPERS_POSIX_H\n\n/* This header is *not* automatically included when you include\n * libcork/core.h, since we define some macros that don't include a\n * cork_ or CORK_ prefix.  Don't want to pollute your namespace unless\n * you ask for it! */\n\n#include <errno.h>\n\n#include <libcork/core/allocator.h>\n#include <libcork/core/attributes.h>\n#include <libcork/core/error.h>\n\n\n#if !defined(CORK_PRINT_ERRORS)\n#define CORK_PRINT_ERRORS 0\n#endif\n\n#if !defined(CORK_PRINT_ERROR)\n#if CORK_PRINT_ERRORS\n#include <stdio.h>\n#define CORK_PRINT_ERROR_(func, file, line) \\\n    fprintf(stderr, \"---\\nError in %s (%s:%u)\\n  %s\\n\", \\\n            (func), (file), (unsigned int) (line), \\\n            cork_error_message());\n#define CORK_PRINT_ERROR()  CORK_PRINT_ERROR_(__func__, __FILE__, __LINE__)\n#else\n#define CORK_PRINT_ERROR()  /* do nothing */\n#endif\n#endif\n\n\n#define xi_check_posix(call, on_error) \\\n    do { \\\n        while (true) { \\\n            if ((call) == -1) { \\\n                if (errno == EINTR) { \\\n                    continue; \\\n                } else { \\\n                    cork_system_error_set(); \\\n                    CORK_PRINT_ERROR(); \\\n                    on_error; \\\n                } \\\n            } else { \\\n                break; \\\n            } \\\n        } \\\n    } while (0)\n\n#define xp_check_posix(call, on_error) \\\n    do { \\\n        while (true) { \\\n            if ((call) == NULL) { \\\n                if (errno == EINTR) { \\\n                    continue; \\\n                } else { \\\n                    cork_system_error_set(); \\\n                    CORK_PRINT_ERROR(); \\\n                    on_error; \\\n                } \\\n            } else { \\\n                break; \\\n            } \\\n        } \\\n    } while (0)\n\n\n#define ei_check_posix(call)  xi_check_posix(call, goto error)\n#define rii_check_posix(call) xi_check_posix(call, return -1)\n#define rpi_check_posix(call) xi_check_posix(call, return NULL)\n\n#define ep_check_posix(call)  xp_check_posix(call, goto error)\n#define rip_check_posix(call) xp_check_posix(call, return -1)\n#define rpp_check_posix(call) xp_check_posix(call, return NULL)\n\n\n#endif /* LIBCORK_HELPERS_POSIX_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/os/files.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012-2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CORE_FILES_H\n#define LIBCORK_CORE_FILES_H\n\n#include <libcork/core/api.h>\n#include <libcork/core/types.h>\n\n\n/*-----------------------------------------------------------------------\n * Paths\n */\n\nstruct cork_path;\n\n/* path can be relative or absolute */\nCORK_API struct cork_path *\ncork_path_new(const char *path);\n\nCORK_API struct cork_path *\ncork_path_clone(const struct cork_path *other);\n\nCORK_API void\ncork_path_free(struct cork_path *path);\n\n\nCORK_API void\ncork_path_set(struct cork_path *path, const char *content);\n\nCORK_API const char *\ncork_path_get(const struct cork_path *path);\n\n\nCORK_API int\ncork_path_set_cwd(struct cork_path *path);\n\nCORK_API struct cork_path *\ncork_path_cwd(void);\n\n\nCORK_API int\ncork_path_set_absolute(struct cork_path *path);\n\nCORK_API struct cork_path *\ncork_path_absolute(const struct cork_path *other);\n\n\nCORK_API void\ncork_path_append(struct cork_path *path, const char *more);\n\nCORK_API void\ncork_path_append_path(struct cork_path *path, const struct cork_path *more);\n\nCORK_API struct cork_path *\ncork_path_join(const struct cork_path *other, const char *more);\n\nCORK_API struct cork_path *\ncork_path_join_path(const struct cork_path *other,\n                    const struct cork_path *more);\n\n\nCORK_API void\ncork_path_set_basename(struct cork_path *path);\n\nCORK_API struct cork_path *\ncork_path_basename(const struct cork_path *other);\n\n\nCORK_API void\ncork_path_set_dirname(struct cork_path *path);\n\nCORK_API struct cork_path *\ncork_path_dirname(const struct cork_path *other);\n\n\n/*-----------------------------------------------------------------------\n * Lists of paths\n */\n\nstruct cork_path_list;\n\nCORK_API struct cork_path_list *\ncork_path_list_new_empty(void);\n\n/* list must be a colon-separated list of paths */\nCORK_API struct cork_path_list *\ncork_path_list_new(const char *list);\n\nCORK_API void\ncork_path_list_free(struct cork_path_list *list);\n\nCORK_API const char *\ncork_path_list_to_string(const struct cork_path_list *list);\n\n/* Takes control of path.  path must not already be in the list. */\nCORK_API void\ncork_path_list_add(struct cork_path_list *list, struct cork_path *path);\n\nCORK_API size_t\ncork_path_list_size(const struct cork_path_list *list);\n\n/* The list still owns path; you must not free it or modify it. */\nCORK_API const struct cork_path *\ncork_path_list_get(const struct cork_path_list *list, size_t index);\n\n\n/*-----------------------------------------------------------------------\n * Files\n */\n\n#define CORK_FILE_RECURSIVE   0x0001\n#define CORK_FILE_PERMISSIVE  0x0002\n\ntypedef unsigned int  cork_file_mode;\n\nenum cork_file_type {\n    CORK_FILE_MISSING = 0,\n    CORK_FILE_REGULAR = 1,\n    CORK_FILE_DIRECTORY = 2,\n    CORK_FILE_SYMLINK = 3,\n    CORK_FILE_UNKNOWN = 4\n};\n\nstruct cork_file;\n\nCORK_API struct cork_file *\ncork_file_new(const char *path);\n\n/* Takes control of path */\nCORK_API struct cork_file *\ncork_file_new_from_path(struct cork_path *path);\n\nCORK_API void\ncork_file_free(struct cork_file *file);\n\n/* File owns the result; you should not free it */\nCORK_API const struct cork_path *\ncork_file_path(struct cork_file *file);\n\nCORK_API int\ncork_file_exists(struct cork_file *file, bool *exists);\n\nCORK_API int\ncork_file_type(struct cork_file *file, enum cork_file_type *type);\n\n\ntypedef int\n(*cork_file_directory_iterator)(struct cork_file *child, const char *rel_name,\n                                void *user_data);\n\nCORK_API int\ncork_file_iterate_directory(struct cork_file *file,\n                            cork_file_directory_iterator iterator,\n                            void *user_data);\n\n/* If flags includes CORK_FILE_RECURSIVE, this creates parent directories,\n * if needed.  If flags doesn't include CORK_FILE_PERMISSIVE, then it's an error\n * if the directory already exists. */\nCORK_API int\ncork_file_mkdir(struct cork_file *file, cork_file_mode mode,\n                unsigned int flags);\n\n/* Removes a file or directory.  If file is a directory, and flags contains\n * CORK_FILE_RECURSIVE, then all of the directory's contents are removed, too.\n * Otherwise, the directory must already be empty. */\nCORK_API int\ncork_file_remove(struct cork_file *file, unsigned int flags);\n\n\nCORK_API struct cork_file *\ncork_path_list_find_file(const struct cork_path_list *list,\n                         const char *rel_path);\n\n\n/*-----------------------------------------------------------------------\n * Lists of files\n */\n\nstruct cork_file_list;\n\nCORK_API struct cork_file_list *\ncork_file_list_new_empty(void);\n\nCORK_API struct cork_file_list *\ncork_file_list_new(struct cork_path_list *path_list);\n\nCORK_API void\ncork_file_list_free(struct cork_file_list *list);\n\n/* Takes control of file.  file must not already be in the list. */\nCORK_API void\ncork_file_list_add(struct cork_file_list *list, struct cork_file *file);\n\nCORK_API size_t\ncork_file_list_size(struct cork_file_list *list);\n\n/* The list still owns file; you must not free it.  Editing the file updates the\n * entry in the list. */\nCORK_API struct cork_file *\ncork_file_list_get(struct cork_file_list *list, size_t index);\n\n\nCORK_API struct cork_file_list *\ncork_path_list_find_files(const struct cork_path_list *list,\n                          const char *rel_path);\n\n\n/*-----------------------------------------------------------------------\n * Walking a directory tree\n */\n\n#define CORK_SKIP_DIRECTORY  1\n\nstruct cork_dir_walker {\n    int\n    (*enter_directory)(struct cork_dir_walker *walker, const char *full_path,\n                       const char *rel_path, const char *base_name);\n\n    int\n    (*file)(struct cork_dir_walker *walker, const char *full_path,\n            const char *rel_path, const char *base_name);\n\n    int\n    (*leave_directory)(struct cork_dir_walker *walker, const char *full_path,\n                       const char *rel_path, const char *base_name);\n};\n\n#define cork_dir_walker_enter_directory(w, fp, rp, bn) \\\n    ((w)->enter_directory((w), (fp), (rp), (bn)))\n\n#define cork_dir_walker_file(w, fp, rp, bn) \\\n    ((w)->file((w), (fp), (rp), (bn)))\n\n#define cork_dir_walker_leave_directory(w, fp, rp, bn) \\\n    ((w)->leave_directory((w), (fp), (rp), (bn)))\n\n\nCORK_API int\ncork_walk_directory(const char *path, struct cork_dir_walker *walker);\n\n\n/*-----------------------------------------------------------------------\n * Standard paths and path lists\n */\n\nCORK_API struct cork_path *\ncork_path_home(void);\n\n\nCORK_API struct cork_path_list *\ncork_path_config_paths(void);\n\nCORK_API struct cork_path_list *\ncork_path_data_paths(void);\n\nCORK_API struct cork_path *\ncork_path_user_cache_path(void);\n\nCORK_API struct cork_path *\ncork_path_user_runtime_path(void);\n\n\n#endif /* LIBCORK_CORE_FILES_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/os/process.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_CORE_PROCESS_H\n#define LIBCORK_CORE_PROCESS_H\n\n#include <libcork/core/api.h>\n\n\ntypedef void\n(*cork_cleanup_function)(void);\n\nCORK_API void\ncork_cleanup_at_exit_named(const char *name, int priority,\n                           cork_cleanup_function function);\n\n#define cork_cleanup_at_exit(priority, function) \\\n    cork_cleanup_at_exit_named(#function, priority, function)\n\n\n#endif /* LIBCORK_CORE_PROCESS_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/os/subprocess.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_OS_SUBPROCESS_H\n#define LIBCORK_OS_SUBPROCESS_H\n\n#include <stdarg.h>\n\n#include <libcork/core/api.h>\n#include <libcork/core/callbacks.h>\n#include <libcork/core/types.h>\n#include <libcork/ds/stream.h>\n#include <libcork/threads/basics.h>\n\n\n/*-----------------------------------------------------------------------\n * Environments\n */\n\nstruct cork_env;\n\nCORK_API struct cork_env *\ncork_env_new(void);\n\nCORK_API struct cork_env *\ncork_env_clone_current(void);\n\nCORK_API void\ncork_env_free(struct cork_env *env);\n\n\nCORK_API void\ncork_env_replace_current(struct cork_env *env);\n\n\n/* For all of the following, if env is NULL, these functions access or update\n * the actual environment of the current process.  Otherwise, they act on the\n * given environment instance. */\n\nCORK_API const char *\ncork_env_get(struct cork_env *env, const char *name);\n\nCORK_API void\ncork_env_add(struct cork_env *env, const char *name, const char *value);\n\nCORK_API void\ncork_env_add_printf(struct cork_env *env, const char *name,\n                    const char *format, ...)\n    CORK_ATTR_PRINTF(3,4);\n\nCORK_API void\ncork_env_add_vprintf(struct cork_env *env, const char *name,\n                     const char *format, va_list args)\n    CORK_ATTR_PRINTF(3,0);\n\nCORK_API void\ncork_env_remove(struct cork_env *env, const char *name);\n\n\n/*-----------------------------------------------------------------------\n * Executing another process\n */\n\nstruct cork_exec;\n\nCORK_API struct cork_exec *\ncork_exec_new(const char *program);\n\nCORK_ATTR_SENTINEL\nCORK_API struct cork_exec *\ncork_exec_new_with_params(const char *program, ...);\n\nCORK_API struct cork_exec *\ncork_exec_new_with_param_array(const char *program, char * const *params);\n\nCORK_API void\ncork_exec_free(struct cork_exec *exec);\n\nCORK_API const char *\ncork_exec_description(struct cork_exec *exec);\n\nCORK_API const char *\ncork_exec_program(struct cork_exec *exec);\n\nCORK_API size_t\ncork_exec_param_count(struct cork_exec *exec);\n\nCORK_API const char *\ncork_exec_param(struct cork_exec *exec, size_t index);\n\nCORK_API void\ncork_exec_add_param(struct cork_exec *exec, const char *param);\n\n/* Can return NULL */\nCORK_API struct cork_env *\ncork_exec_env(struct cork_exec *exec);\n\n/* Takes control of env */\nCORK_API void\ncork_exec_set_env(struct cork_exec *exec, struct cork_env *env);\n\n/* Can return NULL */\nCORK_API const char *\ncork_exec_cwd(struct cork_exec *exec);\n\nCORK_API void\ncork_exec_set_cwd(struct cork_exec *exec, const char *directory);\n\nCORK_API int\ncork_exec_run(struct cork_exec *exec);\n\n\n/*-----------------------------------------------------------------------\n * Subprocesses\n */\n\nstruct cork_subprocess;\n\n/* If env is NULL, we use the environment variables of the calling process. */\n\n/* Takes control of body */\nCORK_API struct cork_subprocess *\ncork_subprocess_new(void *user_data, cork_free_f free_user_data,\n                    cork_run_f run,\n                    struct cork_stream_consumer *stdout_consumer,\n                    struct cork_stream_consumer *stderr_consumer,\n                    int *exit_code);\n\n/* Takes control of exec */\nCORK_API struct cork_subprocess *\ncork_subprocess_new_exec(struct cork_exec *exec,\n                         struct cork_stream_consumer *stdout_consumer,\n                         struct cork_stream_consumer *stderr_consumer,\n                         int *exit_code);\n\nCORK_API void\ncork_subprocess_free(struct cork_subprocess *sub);\n\nCORK_API struct cork_stream_consumer *\ncork_subprocess_stdin(struct cork_subprocess *sub);\n\nCORK_API int\ncork_subprocess_start(struct cork_subprocess *sub);\n\nCORK_API bool\ncork_subprocess_is_finished(struct cork_subprocess *sub);\n\nCORK_API int\ncork_subprocess_abort(struct cork_subprocess *sub);\n\nCORK_API bool\ncork_subprocess_drain(struct cork_subprocess *sub);\n\nCORK_API int\ncork_subprocess_wait(struct cork_subprocess *sub);\n\n\n/*-----------------------------------------------------------------------\n * Groups of subprocesses\n */\n\nstruct cork_subprocess_group;\n\nCORK_API struct cork_subprocess_group *\ncork_subprocess_group_new(void);\n\nCORK_API void\ncork_subprocess_group_free(struct cork_subprocess_group *group);\n\n/* Takes control of sub */\nCORK_API void\ncork_subprocess_group_add(struct cork_subprocess_group *group,\n                          struct cork_subprocess *sub);\n\nCORK_API int\ncork_subprocess_group_start(struct cork_subprocess_group *group);\n\nCORK_API bool\ncork_subprocess_group_is_finished(struct cork_subprocess_group *group);\n\nCORK_API int\ncork_subprocess_group_abort(struct cork_subprocess_group *group);\n\nCORK_API bool\ncork_subprocess_group_drain(struct cork_subprocess_group *group);\n\nCORK_API int\ncork_subprocess_group_wait(struct cork_subprocess_group *group);\n\n\n#endif /* LIBCORK_OS_SUBPROCESS_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/os.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012-2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_OS_H\n#define LIBCORK_OS_H\n\n/*** include all of the parts ***/\n\n#include <libcork/os/files.h>\n#include <libcork/os/process.h>\n#include <libcork/os/subprocess.h>\n\n#endif /* LIBCORK_OS_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/threads/atomics.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_THREADS_ATOMICS_H\n#define LIBCORK_THREADS_ATOMICS_H\n\n#include <libcork/config.h>\n#include <libcork/core/types.h>\n\n/*-----------------------------------------------------------------------\n * GCC intrinsics\n */\n\n/* Ideally we can use GCC's intrinsics to define everything */\n#if defined(CORK_CONFIG_HAVE_GCC_ATOMICS)\n\n#define cork_int_atomic_add        __sync_add_and_fetch\n#define cork_uint_atomic_add       __sync_add_and_fetch\n#define cork_size_atomic_add       __sync_add_and_fetch\n#define cork_int_atomic_pre_add    __sync_fetch_and_add\n#define cork_uint_atomic_pre_add   __sync_fetch_and_add\n#define cork_size_atomic_pre_add   __sync_fetch_and_add\n#define cork_int_atomic_sub        __sync_sub_and_fetch\n#define cork_uint_atomic_sub       __sync_sub_and_fetch\n#define cork_size_atomic_sub       __sync_sub_and_fetch\n#define cork_int_atomic_pre_sub    __sync_fetch_and_sub\n#define cork_uint_atomic_pre_sub   __sync_fetch_and_sub\n#define cork_size_atomic_pre_sub   __sync_fetch_and_sub\n#define cork_int_cas               __sync_val_compare_and_swap\n#define cork_uint_cas              __sync_val_compare_and_swap\n#define cork_size_cas              __sync_val_compare_and_swap\n#define cork_ptr_cas               __sync_val_compare_and_swap\n\n\n/*-----------------------------------------------------------------------\n * End of atomic implementations\n */\n#else\n#error \"No atomics implementation!\"\n#endif\n\n\n#endif /* LIBCORK_THREADS_ATOMICS_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/threads/basics.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_THREADS_BASICS_H\n#define LIBCORK_THREADS_BASICS_H\n\n#include <assert.h>\n\n#include <libcork/core/api.h>\n#include <libcork/core/attributes.h>\n#include <libcork/core/callbacks.h>\n#include <libcork/threads/atomics.h>\n\n\n/*-----------------------------------------------------------------------\n * Thread IDs\n */\n\ntypedef unsigned int  cork_thread_id;\n\n#define CORK_THREAD_NONE  ((cork_thread_id) 0)\n\n/* Returns a valid ID for any thread — even the main thread and threads that\n * aren't created by libcork. */\nCORK_API cork_thread_id\ncork_current_thread_get_id(void);\n\n\n/*-----------------------------------------------------------------------\n * Threads\n */\n\nstruct cork_thread;\n\n/* Returns NULL for the main thread, and for any thread not created via\n * cork_thread_new/cork_thread_start. */\nCORK_API struct cork_thread *\ncork_current_thread_get(void);\n\nCORK_API struct cork_thread *\ncork_thread_new(const char *name,\n                void *user_data, cork_free_f free_user_data,\n                cork_run_f run);\n\n/* Thread must not have been started yet. */\nCORK_API void\ncork_thread_free(struct cork_thread *thread);\n\nCORK_API const char *\ncork_thread_get_name(struct cork_thread *thread);\n\nCORK_API cork_thread_id\ncork_thread_get_id(struct cork_thread *thread);\n\n/* Can only be called once per thread.  Thread will automatically be freed when\n * its done. */\nCORK_API int\ncork_thread_start(struct cork_thread *thread);\n\n/* Can only be called once per thread; must be called after cork_thread_start. */\nCORK_API int\ncork_thread_join(struct cork_thread *thread);\n\n\n/*-----------------------------------------------------------------------\n * Executing something once\n */\n\n#if CORK_CONFIG_HAVE_GCC_ASM && (CORK_CONFIG_ARCH_X86 || CORK_CONFIG_ARCH_X64)\n#define cork_pause() \\\n    do { \\\n        __asm__ __volatile__ (\"pause\"); \\\n    } while (0)\n#else\n#define cork_pause()  do { /* do nothing */ } while (0)\n#endif\n\n\n#define cork_once_barrier(name) \\\n    static struct { \\\n        volatile int  barrier; \\\n        cork_thread_id  initializing_thread; \\\n    } name##__once;\n\n#define cork_once(name, call) \\\n    do { \\\n        if (CORK_LIKELY(name##__once.barrier == 2)) { \\\n            /* already initialized */ \\\n        } else { \\\n            /* Try to claim the ability to perform the initialization */ \\\n            int  prior_state = cork_int_cas(&name##__once.barrier, 0, 1); \\\n            if (CORK_LIKELY(prior_state == 0)) { \\\n                CORK_ATTR_UNUSED int  result; \\\n                /* we get to initialize */ \\\n                call; \\\n                result = cork_int_cas(&name##__once.barrier, 1, 2); \\\n                assert(result == 1); \\\n            } else { \\\n                /* someone else is initializing, spin/wait until done */ \\\n                while (name##__once.barrier != 2) { cork_pause(); } \\\n            } \\\n        } \\\n    } while (0)\n\n#define cork_once_recursive(name, call) \\\n    do { \\\n        if (CORK_LIKELY(name##__once.barrier == 2)) { \\\n            /* already initialized */ \\\n        } else { \\\n            /* Try to claim the ability to perform the initialization */ \\\n            int  prior_state = cork_int_cas(&name##__once.barrier, 0, 1); \\\n            if (CORK_LIKELY(prior_state == 0)) { \\\n                CORK_ATTR_UNUSED int  result; \\\n                /* we get to initialize */ \\\n                name##__once.initializing_thread = \\\n                    cork_current_thread_get_id(); \\\n                call; \\\n                result = cork_int_cas(&name##__once.barrier, 1, 2); \\\n                assert(result == 1); \\\n            } else { \\\n                /* someone else is initializing, is it us? */ \\\n                if (name##__once.initializing_thread == \\\n                    cork_current_thread_get_id()) { \\\n                    /* yep, fall through to let our recursion continue */ \\\n                } else { \\\n                    /* nope; wait for the initialization to finish */ \\\n                    while (name##__once.barrier != 2) { cork_pause(); } \\\n                } \\\n            } \\\n        } \\\n    } while (0)\n\n\n/*-----------------------------------------------------------------------\n * Thread-local storage\n */\n\n/* Prefer, in order:\n *\n * 1) __thread storage class\n * 2) pthread_key_t\n */\n\n#if CORK_CONFIG_HAVE_THREAD_STORAGE_CLASS\n#define cork_tls(TYPE, NAME) \\\nstatic __thread TYPE  NAME##__tls; \\\n\\\nstatic TYPE * \\\nNAME##_get(void) \\\n{ \\\n    return &NAME##__tls; \\\n}\n\n#define cork_tls_with_alloc(TYPE, NAME, allocate, deallocate) \\\n    cork_tls(TYPE, NAME)\n\n#elif CORK_HAVE_PTHREADS\n#include <stdlib.h>\n#include <pthread.h>\n\n#include <libcork/core/allocator.h>\n\n#define cork_tls_with_alloc(TYPE, NAME, allocate, deallocate) \\\nstatic pthread_key_t  NAME##__tls_key; \\\ncork_once_barrier(NAME##__tls_barrier); \\\n\\\nstatic void \\\nNAME##__tls_destroy(void *self) \\\n{ \\\n    deallocate(self); \\\n} \\\n\\\nstatic void \\\nNAME##__create_key(void) \\\n{ \\\n    CORK_ATTR_UNUSED int  rc; \\\n    rc = pthread_key_create(&NAME##__tls_key, &NAME##__tls_destroy); \\\n    assert(rc == 0); \\\n} \\\n\\\nstatic TYPE * \\\nNAME##_get(void) \\\n{ \\\n    TYPE  *self; \\\n    cork_once(NAME##__tls_barrier, NAME##__create_key()); \\\n    self = pthread_getspecific(NAME##__tls_key); \\\n    if (CORK_UNLIKELY(self == NULL)) { \\\n        self = allocate(); \\\n        pthread_setspecific(NAME##__tls_key, self); \\\n    } \\\n    return self; \\\n}\n\n#define cork_tls(TYPE, NAME) \\\n\\\nstatic TYPE * \\\nNAME##__tls_allocate(void) \\\n{ \\\n    return cork_calloc(1, sizeof(TYPE)); \\\n} \\\n\\\nstatic void \\\nNAME##__tls_deallocate(void *vself) \\\n{ \\\n    cork_cfree(vself, 1, sizeof(TYPE)); \\\n} \\\n\\\ncork_tls_with_alloc(TYPE, NAME, NAME##__tls_allocate, NAME##__tls_deallocate);\n\n#else\n#error \"No thread-local storage implementation!\"\n#endif\n\n\n#endif /* LIBCORK_THREADS_BASICS_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/include/libcork/threads.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef LIBCORK_THREADS_H\n#define LIBCORK_THREADS_H\n\n/*** include all of the parts ***/\n\n#include <libcork/threads/atomics.h>\n#include <libcork/threads/basics.h>\n\n#endif /* LIBCORK_THREADS_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/posix/directory-walker.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <dirent.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <unistd.h>\n\n#include \"libcork/core/attributes.h\"\n#include \"libcork/core/error.h\"\n#include \"libcork/core/types.h\"\n#include \"libcork/ds/buffer.h\"\n#include \"libcork/helpers/errors.h\"\n#include \"libcork/helpers/posix.h\"\n#include \"libcork/os/files.h\"\n\n\nstatic int\ncork_walk_one_directory(struct cork_dir_walker *w, struct cork_buffer *path,\n                        size_t root_path_size)\n{\n    DIR  *dir = NULL;\n    struct dirent  *entry;\n    size_t  dir_path_size;\n\n    rip_check_posix(dir = opendir(path->buf));\n\n    cork_buffer_append(path, \"/\", 1);\n    dir_path_size = path->size;\n    errno = 0;\n    while ((entry = readdir(dir)) != NULL) {\n        struct stat  info;\n\n        /* Skip the \".\" and \"..\" entries */\n        if (strcmp(entry->d_name, \".\") == 0 ||\n            strcmp(entry->d_name, \"..\") == 0) {\n            continue;\n        }\n\n        /* Stat the directory entry */\n        cork_buffer_append_string(path, entry->d_name);\n        ei_check_posix(stat(path->buf, &info));\n\n        /* If the entry is a subdirectory, recurse into it. */\n        if (S_ISDIR(info.st_mode)) {\n            int  rc = cork_dir_walker_enter_directory\n                (w, path->buf, path->buf + root_path_size,\n                 path->buf + dir_path_size);\n            if (rc != CORK_SKIP_DIRECTORY) {\n                ei_check(cork_walk_one_directory(w, path, root_path_size));\n                ei_check(cork_dir_walker_leave_directory\n                         (w, path->buf, path->buf + root_path_size,\n                          path->buf + dir_path_size));\n            }\n        } else if (S_ISREG(info.st_mode)) {\n            ei_check(cork_dir_walker_file\n                     (w, path->buf, path->buf + root_path_size,\n                      path->buf + dir_path_size));\n        }\n\n        /* Remove this entry name from the path buffer. */\n        cork_buffer_truncate(path, dir_path_size);\n\n        /* We have to reset errno to 0 because of the ambiguous way\n         * readdir uses a return value of NULL.  Other functions may\n         * return normally yet set errno to a non-zero value.  dlopen\n         * on Mac OS X is an ogreish example.  Since an error readdir\n         * is indicated by returning NULL and setting errno to indicate\n         * the error, then we need to reset it to zero before each call.\n         * We shall assume, perhaps to our great misery, that functions\n         * within this loop do proper error checking and act accordingly.\n         */\n        errno = 0;\n    }\n\n    /* Check errno immediately after the while loop terminates */\n    if (CORK_UNLIKELY(errno != 0)) {\n        cork_system_error_set();\n        goto error;\n    }\n\n    /* Remove the trailing '/' from the path buffer. */\n    cork_buffer_truncate(path, dir_path_size - 1);\n    rii_check_posix(closedir(dir));\n    return 0;\n\nerror:\n    if (dir != NULL) {\n        rii_check_posix(closedir(dir));\n    }\n    return -1;\n}\n\nint\ncork_walk_directory(const char *path, struct cork_dir_walker *w)\n{\n    int  rc;\n    char  *p;\n    struct cork_buffer  buf = CORK_BUFFER_INIT();\n\n    /* Seed the buffer with the directory's path, ensuring that there's no\n     * trailing '/' */\n    cork_buffer_append_string(&buf, path);\n    p = buf.buf;\n    while (p[buf.size-1] == '/') {\n        buf.size--;\n        p[buf.size] = '\\0';\n    }\n    rc = cork_walk_one_directory(w, &buf, buf.size + 1);\n    cork_buffer_done(&buf);\n    return rc;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/posix/env.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2013-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n\n#include \"libcork/core.h\"\n#include \"libcork/ds.h\"\n#include \"libcork/os/subprocess.h\"\n#include \"libcork/helpers/errors.h\"\n\n#if defined(__APPLE__)\n/* Apple doesn't provide access to the \"environ\" variable from a shared library.\n * There's a workaround function to grab the environ pointer described at [1].\n *\n * [1] http://developer.apple.com/library/mac/#documentation/Darwin/Reference/ManPages/man7/environ.7.html\n */\n#include <crt_externs.h>\n#define environ  (*_NSGetEnviron())\n\n#elif !defined(__MINGW32__)\n/* On all other POSIX platforms, we assume that environ is available in shared\n * libraries. */\nextern char  **environ;\n\n#endif\n\n\n#ifdef __MINGW32__\n\nint setenv(const char *name, const char *value, int replace)\n{\n    int out;\n    size_t namelen, valuelen;\n    char *envstr;\n\n    if (!name || !value) return -1;\n    if (!replace) {\n        char *oldval = NULL;\n        oldval = getenv(name);\n        if (oldval) return 0;\n    }\n\n    namelen = strlen(name);\n    valuelen = strlen(value);\n    envstr = malloc((namelen + valuelen + 2));\n    if (!envstr) return -1;\n\n    memcpy(envstr, name, namelen);\n    envstr[namelen] = '=';\n    memcpy(envstr + namelen + 1, value, valuelen);\n    envstr[namelen + valuelen + 1] = 0;\n\n    out = putenv(envstr);\n    /* putenv(3) makes the argument string part of the environment,\n     * and changing that string modifies the environment --- which\n     * means we do not own that storage anymore.  Do not free\n     * envstr.\n     */\n\n    return out;\n}\n\nint unsetenv(const char *env)\n{\n    char *name;\n    int ret;\n\n    name = malloc(strlen(env)+2);\n    strcat(strcpy(name, env), \"=\");\n    ret = putenv(name);\n    free(name);\n\n    return ret;\n}\n\nint clearenv(void)\n{\n    char **env = environ;\n    if (!env)\n        return 0;\n    while (*env) {\n        free(*env);\n        env++;\n    }\n    free(env);\n    environ = NULL;\n    return 0;\n}\n\n#endif\n\n\nstruct cork_env_var {\n    const char  *name;\n    const char  *value;\n};\n\nstatic struct cork_env_var *\ncork_env_var_new(const char *name, const char *value)\n{\n    struct cork_env_var  *var = cork_new(struct cork_env_var);\n    var->name = cork_strdup(name);\n    var->value = cork_strdup(value);\n    return var;\n}\n\nstatic void\ncork_env_var_free(void *vvar)\n{\n    struct cork_env_var  *var = vvar;\n    cork_strfree(var->name);\n    cork_strfree(var->value);\n    cork_delete(struct cork_env_var, var);\n}\n\n\nstruct cork_env {\n    struct cork_hash_table  *variables;\n    struct cork_buffer  buffer;\n};\n\nstruct cork_env *\ncork_env_new(void)\n{\n    struct cork_env  *env = cork_new(struct cork_env);\n    env->variables = cork_string_hash_table_new(0, 0);\n    cork_hash_table_set_free_value(env->variables, cork_env_var_free);\n    cork_buffer_init(&env->buffer);\n    return env;\n}\n\nstatic void\ncork_env_add_internal(struct cork_env *env, const char *name, const char *value)\n{\n    if (env == NULL) {\n        setenv(name, value, true);\n    } else {\n        struct cork_env_var  *var = cork_env_var_new(name, value);\n        void  *old_var;\n\n        cork_hash_table_put\n            (env->variables, (void *) var->name, var, NULL, NULL, &old_var);\n\n        if (old_var != NULL) {\n            cork_env_var_free(old_var);\n        }\n    }\n}\n\nstruct cork_env *\ncork_env_clone_current(void)\n{\n    char  **curr;\n    struct cork_env  *env = cork_env_new();\n\n    for (curr = environ; *curr != NULL; curr++) {\n        const char  *entry = *curr;\n        const char  *equal;\n\n        equal = strchr(entry, '=');\n        if (CORK_UNLIKELY(equal == NULL)) {\n            /* This environment entry is malformed; skip it. */\n            continue;\n        }\n\n        /* Make a copy of the name so that it's NUL-terminated rather than\n         * equal-terminated. */\n        cork_buffer_set(&env->buffer, entry, equal - entry);\n        cork_env_add_internal(env, env->buffer.buf, equal + 1);\n    }\n\n    return env;\n}\n\n\nvoid\ncork_env_free(struct cork_env *env)\n{\n    cork_hash_table_free(env->variables);\n    cork_buffer_done(&env->buffer);\n    cork_delete(struct cork_env, env);\n}\n\nconst char *\ncork_env_get(struct cork_env *env, const char *name)\n{\n    if (env == NULL) {\n        return getenv(name);\n    } else {\n        struct cork_env_var  *var =\n            cork_hash_table_get(env->variables, (void *) name);\n        return (var == NULL)? NULL: var->value;\n    }\n}\n\nvoid\ncork_env_add(struct cork_env *env, const char *name, const char *value)\n{\n    cork_env_add_internal(env, name, value);\n}\n\nvoid\ncork_env_add_vprintf(struct cork_env *env, const char *name,\n                     const char *format, va_list args)\n{\n    cork_buffer_vprintf(&env->buffer, format, args);\n    cork_env_add_internal(env, name, env->buffer.buf);\n}\n\nvoid\ncork_env_add_printf(struct cork_env *env, const char *name,\n                    const char *format, ...)\n{\n    va_list  args;\n    va_start(args, format);\n    cork_env_add_vprintf(env, name, format, args);\n    va_end(args);\n}\n\nvoid\ncork_env_remove(struct cork_env *env, const char *name)\n{\n    if (env == NULL) {\n        unsetenv(name);\n    } else {\n        void  *old_var;\n        cork_hash_table_delete(env->variables, (void *) name, NULL, &old_var);\n        if (old_var != NULL) {\n            cork_env_var_free(old_var);\n        }\n    }\n}\n\nstatic enum cork_hash_table_map_result\ncork_env_set_vars(void *user_data, struct cork_hash_table_entry *entry)\n{\n    struct cork_env_var  *var = entry->value;\n    setenv(var->name, var->value, false);\n    return CORK_HASH_TABLE_MAP_CONTINUE;\n}\n\n#if ((defined(__APPLE__) || (defined(BSD) && (BSD >= 199103))) && !defined(__GNU__)) || defined (__CYGWIN__)\n/* A handful of platforms [1] don't provide clearenv(), so we must implement our\n * own version that clears the environ array directly.\n *\n * [1] http://www.gnu.org/software/gnulib/manual/html_node/clearenv.html\n */\nstatic void\nclearenv(void)\n{\n    *environ = NULL;\n}\n\n#else\n/* Otherwise assume that we have clearenv available. */\n#endif\n\nvoid\ncork_env_replace_current(struct cork_env *env)\n{\n    clearenv();\n    cork_hash_table_map(env->variables, NULL, cork_env_set_vars);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/posix/exec.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2013-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <errno.h>\n#include <unistd.h>\n\n#include \"libcork/core.h\"\n#include \"libcork/ds.h\"\n#include \"libcork/os/subprocess.h\"\n#include \"libcork/helpers/errors.h\"\n\n#define ri_check_posix(call) \\\n    do { \\\n        while (true) { \\\n            if ((call) == -1) { \\\n                if (errno == EINTR) { \\\n                    continue; \\\n                } else { \\\n                    cork_system_error_set(); \\\n                    CORK_PRINT_ERROR(); \\\n                    return -1; \\\n                } \\\n            } else { \\\n                break; \\\n            } \\\n        } \\\n    } while (0)\n\n\nstruct cork_exec {\n    const char  *program;\n    struct cork_string_array  params;\n    struct cork_env  *env;\n    const char  *cwd;\n    struct cork_buffer  description;\n};\n\nstruct cork_exec *\ncork_exec_new(const char *program)\n{\n    struct cork_exec  *exec = cork_new(struct cork_exec);\n    exec->program = cork_strdup(program);\n    cork_string_array_init(&exec->params);\n    exec->env = NULL;\n    exec->cwd = NULL;\n    cork_buffer_init(&exec->description);\n    cork_buffer_set_string(&exec->description, program);\n    return exec;\n}\n\nstruct cork_exec *\ncork_exec_new_with_params(const char *program, ...)\n{\n    struct cork_exec  *exec;\n    va_list  args;\n    const char  *param;\n\n    exec = cork_exec_new(program);\n    cork_exec_add_param(exec, program);\n    va_start(args, program);\n    while ((param = va_arg(args, const char *)) != NULL) {\n        cork_exec_add_param(exec, param);\n    }\n    return exec;\n}\n\nstruct cork_exec *\ncork_exec_new_with_param_array(const char *program, char * const *params)\n{\n    char * const  *curr;\n    struct cork_exec  *exec = cork_exec_new(program);\n    for (curr = params; *curr != NULL; curr++) {\n        cork_exec_add_param(exec, *curr);\n    }\n    return exec;\n}\n\nvoid\ncork_exec_free(struct cork_exec *exec)\n{\n    cork_strfree(exec->program);\n    cork_array_done(&exec->params);\n    if (exec->env != NULL) {\n        cork_env_free(exec->env);\n    }\n    if (exec->cwd != NULL) {\n        cork_strfree(exec->cwd);\n    }\n    cork_buffer_done(&exec->description);\n    cork_delete(struct cork_exec, exec);\n}\n\nconst char *\ncork_exec_description(struct cork_exec *exec)\n{\n    return exec->description.buf;\n}\n\nconst char *\ncork_exec_program(struct cork_exec *exec)\n{\n    return exec->program;\n}\n\nsize_t\ncork_exec_param_count(struct cork_exec *exec)\n{\n    return cork_array_size(&exec->params);\n}\n\nconst char *\ncork_exec_param(struct cork_exec *exec, size_t index)\n{\n    return cork_array_at(&exec->params, index);\n}\n\nvoid\ncork_exec_add_param(struct cork_exec *exec, const char *param)\n{\n    /* Don't add the first parameter to the description; that's a copy of the\n     * program name, which we've already added. */\n    if (!cork_array_is_empty(&exec->params)) {\n        cork_buffer_append(&exec->description, \" \", 1);\n        cork_buffer_append_string(&exec->description, param);\n    }\n    cork_array_append(&exec->params, cork_strdup(param));\n}\n\nstruct cork_env *\ncork_exec_env(struct cork_exec *exec)\n{\n    return exec->env;\n}\n\nvoid\ncork_exec_set_env(struct cork_exec *exec, struct cork_env *env)\n{\n    if (exec->env != NULL) {\n        cork_env_free(exec->env);\n    }\n    exec->env = env;\n}\n\nconst char *\ncork_exec_cwd(struct cork_exec *exec)\n{\n    return exec->cwd;\n}\n\nvoid\ncork_exec_set_cwd(struct cork_exec *exec, const char *directory)\n{\n    if (exec->cwd != NULL) {\n        cork_strfree(exec->cwd);\n    }\n    exec->cwd = cork_strdup(directory);\n}\n\nint\ncork_exec_run(struct cork_exec *exec)\n{\n    const char  **params;\n\n    /* Make sure the parameter array is NULL-terminated. */\n    cork_array_append(&exec->params, NULL);\n    params = cork_array_elements(&exec->params);\n\n    /* Fill in the requested environment */\n    if (exec->env != NULL) {\n        cork_env_replace_current(exec->env);\n    }\n\n    /* Change the working directory, if requested */\n    if (exec->cwd != NULL) {\n        ri_check_posix(chdir(exec->cwd));\n    }\n\n    /* Execute the new program */\n    ri_check_posix(execvp(exec->program, (char * const *) params));\n\n    /* This is unreachable */\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/posix/files.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2013-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#ifdef __GNU__\n#define _GNU_SOURCE\n#endif\n#include <assert.h>\n#include <dirent.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <string.h>\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <unistd.h>\n\n#include \"libcork/core/attributes.h\"\n#include \"libcork/core/error.h\"\n#include \"libcork/core/types.h\"\n#include \"libcork/ds/array.h\"\n#include \"libcork/ds/buffer.h\"\n#include \"libcork/helpers/errors.h\"\n#include \"libcork/helpers/posix.h\"\n#include \"libcork/os/files.h\"\n#include \"libcork/os/subprocess.h\"\n\n\n#if !defined(CORK_DEBUG_FILES)\n#define CORK_DEBUG_FILES  0\n#endif\n\n#if CORK_DEBUG_FILES\n#include <stdio.h>\n#define DEBUG(...) fprintf(stderr, __VA_ARGS__)\n#else\n#define DEBUG(...) /* no debug messages */\n#endif\n\n\n/*-----------------------------------------------------------------------\n * Paths\n */\n\nstruct cork_path {\n    struct cork_buffer  given;\n};\n\nstatic struct cork_path *\ncork_path_new_internal(const char *str, size_t length)\n{\n    struct cork_path  *path = cork_new(struct cork_path);\n    cork_buffer_init(&path->given);\n    if (length == 0) {\n        cork_buffer_ensure_size(&path->given, 16);\n        cork_buffer_set(&path->given, \"\", 0);\n    } else {\n        cork_buffer_set(&path->given, str, length);\n    }\n    return path;\n}\n\nstruct cork_path *\ncork_path_new(const char *source)\n{\n    return cork_path_new_internal(source, source == NULL? 0: strlen(source));\n}\n\nstruct cork_path *\ncork_path_clone(const struct cork_path *other)\n{\n    return cork_path_new_internal(other->given.buf, other->given.size);\n}\n\nvoid\ncork_path_free(struct cork_path *path)\n{\n    cork_buffer_done(&path->given);\n    cork_delete(struct cork_path, path);\n}\n\n\nvoid\ncork_path_set(struct cork_path *path, const char *content)\n{\n    if (content == NULL) {\n        cork_buffer_clear(&path->given);\n    } else {\n        cork_buffer_set_string(&path->given, content);\n    }\n}\n\nconst char *\ncork_path_get(const struct cork_path *path)\n{\n    return path->given.buf;\n}\n\n#define cork_path_get(path) ((const char *) (path)->given.buf)\n#define cork_path_size(path)  ((path)->given.size)\n#define cork_path_truncate(path, size) \\\n    (cork_buffer_truncate(&(path)->given, (size)))\n\n\nint\ncork_path_set_cwd(struct cork_path *path)\n{\n#ifdef __GNU__\n    char *dirname = get_current_dir_name();\n    rip_check_posix(dirname);\n    cork_buffer_set(&path->given, dirname, strlen(dirname));\n    free(dirname);\n#else\n    cork_buffer_ensure_size(&path->given, PATH_MAX);\n    rip_check_posix(getcwd(path->given.buf, PATH_MAX));\n    path->given.size = strlen(path->given.buf);\n#endif\n    return 0;\n}\n\nstruct cork_path *\ncork_path_cwd(void)\n{\n    struct cork_path  *path = cork_path_new(NULL);\n    ei_check(cork_path_set_cwd(path));\n    return path;\n\nerror:\n    cork_path_free(path);\n    return NULL;\n}\n\n\nint\ncork_path_set_absolute(struct cork_path *path)\n{\n    struct cork_buffer  buf;\n\n    if (path->given.size > 0 &&\n        cork_buffer_char(&path->given, 0) == '/') {\n        /* The path is already absolute. */\n        return 0;\n    }\n\n#ifdef __GNU__\n    char *dirname;\n    dirname = get_current_dir_name();\n    ep_check_posix(dirname);\n    cork_buffer_init(&buf);\n    cork_buffer_set(&buf, dirname, strlen(dirname));\n    free(dirname);\n#else\n    cork_buffer_init(&buf);\n    cork_buffer_ensure_size(&buf, PATH_MAX);\n    ep_check_posix(getcwd(buf.buf, PATH_MAX));\n    buf.size = strlen(buf.buf);\n#endif\n    cork_buffer_append(&buf, \"/\", 1);\n    cork_buffer_append_copy(&buf, &path->given);\n    cork_buffer_done(&path->given);\n    path->given = buf;\n    return 0;\n\nerror:\n    cork_buffer_done(&buf);\n    return -1;\n}\n\nstruct cork_path *\ncork_path_absolute(const struct cork_path *other)\n{\n    struct cork_path  *path = cork_path_clone(other);\n    ei_check(cork_path_set_absolute(path));\n    return path;\n\nerror:\n    cork_path_free(path);\n    return NULL;\n}\n\n\nvoid\ncork_path_append(struct cork_path *path, const char *more)\n{\n    if (more == NULL || more[0] == '\\0') {\n        return;\n    }\n\n    if (more[0] == '/') {\n        /* If more starts with a \"/\", then it's absolute, and should replace\n         * the contents of the current path. */\n        cork_buffer_set_string(&path->given, more);\n    } else {\n        /* Otherwise, more is relative, and should be appended to the current\n         * path.  If the current given path doesn't end in a \"/\", then we need\n         * to add one to keep the path well-formed. */\n\n        if (path->given.size > 0 &&\n            cork_buffer_char(&path->given, path->given.size - 1) != '/') {\n            cork_buffer_append(&path->given, \"/\", 1);\n        }\n\n        cork_buffer_append_string(&path->given, more);\n    }\n}\n\nstruct cork_path *\ncork_path_join(const struct cork_path *other, const char *more)\n{\n    struct cork_path  *path = cork_path_clone(other);\n    cork_path_append(path, more);\n    return path;\n}\n\nvoid\ncork_path_append_path(struct cork_path *path, const struct cork_path *more)\n{\n    cork_path_append(path, more->given.buf);\n}\n\nstruct cork_path *\ncork_path_join_path(const struct cork_path *other, const struct cork_path *more)\n{\n    struct cork_path  *path = cork_path_clone(other);\n    cork_path_append_path(path, more);\n    return path;\n}\n\n\nvoid\ncork_path_set_basename(struct cork_path *path)\n{\n    char  *given = path->given.buf;\n    const char  *last_slash = strrchr(given, '/');\n    if (last_slash != NULL) {\n        size_t  offset = last_slash - given;\n        size_t  basename_length = path->given.size - offset - 1;\n        memmove(given, last_slash + 1, basename_length);\n        given[basename_length] = '\\0';\n        path->given.size = basename_length;\n    }\n}\n\nstruct cork_path *\ncork_path_basename(const struct cork_path *other)\n{\n    struct cork_path  *path = cork_path_clone(other);\n    cork_path_set_basename(path);\n    return path;\n}\n\n\nvoid\ncork_path_set_dirname(struct cork_path *path)\n{\n    const char  *given = path->given.buf;\n    const char  *last_slash = strrchr(given, '/');\n    if (last_slash == NULL) {\n        cork_buffer_clear(&path->given);\n    } else {\n        size_t  offset = last_slash - given;\n        if (offset == 0) {\n            /* A special case for the immediate subdirectories of \"/\" */\n            cork_buffer_truncate(&path->given, 1);\n        } else {\n            cork_buffer_truncate(&path->given, offset);\n        }\n    }\n}\n\nstruct cork_path *\ncork_path_dirname(const struct cork_path *other)\n{\n    struct cork_path  *path = cork_path_clone(other);\n    cork_path_set_dirname(path);\n    return path;\n}\n\n\n/*-----------------------------------------------------------------------\n * Lists of paths\n */\n\nstruct cork_path_list {\n    cork_array(struct cork_path *)  array;\n    struct cork_buffer  string;\n};\n\nstruct cork_path_list *\ncork_path_list_new_empty(void)\n{\n    struct cork_path_list  *list = cork_new(struct cork_path_list);\n    cork_array_init(&list->array);\n    cork_buffer_init(&list->string);\n    return list;\n}\n\nvoid\ncork_path_list_free(struct cork_path_list *list)\n{\n    size_t  i;\n    for (i = 0; i < cork_array_size(&list->array); i++) {\n        struct cork_path  *path = cork_array_at(&list->array, i);\n        cork_path_free(path);\n    }\n    cork_array_done(&list->array);\n    cork_buffer_done(&list->string);\n    cork_delete(struct cork_path_list, list);\n}\n\nconst char *\ncork_path_list_to_string(const struct cork_path_list *list)\n{\n    return list->string.buf;\n}\n\nvoid\ncork_path_list_add(struct cork_path_list *list, struct cork_path *path)\n{\n    cork_array_append(&list->array, path);\n    if (cork_array_size(&list->array) > 1) {\n        cork_buffer_append(&list->string, \":\", 1);\n    }\n    cork_buffer_append_string(&list->string, cork_path_get(path));\n}\n\nsize_t\ncork_path_list_size(const struct cork_path_list *list)\n{\n    return cork_array_size(&list->array);\n}\n\nconst struct cork_path *\ncork_path_list_get(const struct cork_path_list *list, size_t index)\n{\n    return cork_array_at(&list->array, index);\n}\n\nstatic void\ncork_path_list_append_string(struct cork_path_list *list, const char *str)\n{\n    struct cork_path  *path;\n    const char  *curr = str;\n    const char  *next;\n\n    while ((next = strchr(curr, ':')) != NULL) {\n        size_t  size = next - curr;\n        path = cork_path_new_internal(curr, size);\n        cork_path_list_add(list, path);\n        curr = next + 1;\n    }\n\n    path = cork_path_new(curr);\n    cork_path_list_add(list, path);\n}\n\nstruct cork_path_list *\ncork_path_list_new(const char *str)\n{\n    struct cork_path_list  *list = cork_path_list_new_empty();\n    cork_path_list_append_string(list, str);\n    return list;\n}\n\n\n/*-----------------------------------------------------------------------\n * Files\n */\n\nstruct cork_file {\n    struct cork_path  *path;\n    struct stat  stat;\n    enum cork_file_type  type;\n    bool  has_stat;\n};\n\nstatic void\ncork_file_init(struct cork_file *file, struct cork_path *path)\n{\n    file->path = path;\n    file->has_stat = false;\n}\n\nstruct cork_file *\ncork_file_new(const char *path)\n{\n    return cork_file_new_from_path(cork_path_new(path));\n}\n\nstruct cork_file *\ncork_file_new_from_path(struct cork_path *path)\n{\n    struct cork_file  *file = cork_new(struct cork_file);\n    cork_file_init(file, path);\n    return file;\n}\n\nstatic void\ncork_file_reset(struct cork_file *file)\n{\n    file->has_stat = false;\n}\n\nstatic void\ncork_file_done(struct cork_file *file)\n{\n    cork_path_free(file->path);\n}\n\nvoid\ncork_file_free(struct cork_file *file)\n{\n    cork_file_done(file);\n    cork_delete(struct cork_file, file);\n}\n\nconst struct cork_path *\ncork_file_path(struct cork_file *file)\n{\n    return file->path;\n}\n\nstatic int\ncork_file_stat(struct cork_file *file)\n{\n    if (file->has_stat) {\n        return 0;\n    } else {\n        int  rc;\n        rc = stat(cork_path_get(file->path), &file->stat);\n\n        if (rc == -1) {\n            if (errno == ENOENT || errno == ENOTDIR) {\n                file->type = CORK_FILE_MISSING;\n                file->has_stat = true;\n                return 0;\n            } else {\n                cork_system_error_set();\n                return -1;\n            }\n        }\n\n        if (S_ISREG(file->stat.st_mode)) {\n            file->type = CORK_FILE_REGULAR;\n        } else if (S_ISDIR(file->stat.st_mode)) {\n            file->type = CORK_FILE_DIRECTORY;\n        } else if (S_ISLNK(file->stat.st_mode)) {\n            file->type = CORK_FILE_SYMLINK;\n        } else {\n            file->type = CORK_FILE_UNKNOWN;\n        }\n\n        file->has_stat = true;\n        return 0;\n    }\n}\n\nint\ncork_file_exists(struct cork_file *file, bool *exists)\n{\n    rii_check(cork_file_stat(file));\n    *exists = (file->type != CORK_FILE_MISSING);\n    return 0;\n}\n\nint\ncork_file_type(struct cork_file *file, enum cork_file_type *type)\n{\n    rii_check(cork_file_stat(file));\n    *type = file->type;\n    return 0;\n}\n\n\nstruct cork_file *\ncork_path_list_find_file(const struct cork_path_list *list,\n                         const char *rel_path)\n{\n    size_t  i;\n    size_t  count = cork_path_list_size(list);\n    struct cork_file  *file;\n\n    for (i = 0; i < count; i++) {\n        const struct cork_path  *path = cork_path_list_get(list, i);\n        struct cork_path  *joined = cork_path_join(path, rel_path);\n        bool  exists;\n        file = cork_file_new_from_path(joined);\n        ei_check(cork_file_exists(file, &exists));\n        if (exists) {\n            return file;\n        } else {\n            cork_file_free(file);\n        }\n    }\n\n    cork_error_set_printf\n        (ENOENT, \"%s not found in %s\",\n         rel_path, cork_path_list_to_string(list));\n    return NULL;\n\nerror:\n    cork_file_free(file);\n    return NULL;\n}\n\n\n/*-----------------------------------------------------------------------\n * Directories\n */\n\nint\ncork_file_iterate_directory(struct cork_file *file,\n                            cork_file_directory_iterator iterator,\n                            void *user_data)\n{\n    DIR  *dir = NULL;\n    struct dirent  *entry;\n    size_t  dir_path_size;\n    struct cork_path  *child_path;\n    struct cork_file  child_file;\n\n    rip_check_posix(dir = opendir(cork_path_get(file->path)));\n    child_path = cork_path_clone(file->path);\n    cork_file_init(&child_file, child_path);\n    dir_path_size = cork_path_size(child_path);\n\n    errno = 0;\n    while ((entry = readdir(dir)) != NULL) {\n        /* Skip the \".\" and \"..\" entries */\n        if (strcmp(entry->d_name, \".\") == 0 ||\n            strcmp(entry->d_name, \"..\") == 0) {\n            continue;\n        }\n\n        cork_path_append(child_path, entry->d_name);\n        ei_check(cork_file_stat(&child_file));\n\n        /* If the entry is a subdirectory, recurse into it. */\n        ei_check(iterator(&child_file, entry->d_name, user_data));\n\n        /* Remove this entry name from the path buffer. */\n        cork_path_truncate(child_path, dir_path_size);\n        cork_file_reset(&child_file);\n\n        /* We have to reset errno to 0 because of the ambiguous way readdir uses\n         * a return value of NULL.  Other functions may return normally yet set\n         * errno to a non-zero value.  dlopen on Mac OS X is an ogreish example.\n         * Since an error readdir is indicated by returning NULL and setting\n         * errno to indicate the error, then we need to reset it to zero before\n         * each call.  We shall assume, perhaps to our great misery, that\n         * functions within this loop do proper error checking and act\n         * accordingly. */\n        errno = 0;\n    }\n\n    /* Check errno immediately after the while loop terminates */\n    if (CORK_UNLIKELY(errno != 0)) {\n        cork_system_error_set();\n        goto error;\n    }\n\n    cork_file_done(&child_file);\n    rii_check_posix(closedir(dir));\n    return 0;\n\nerror:\n    cork_file_done(&child_file);\n    rii_check_posix(closedir(dir));\n    return -1;\n}\n\nstatic int\ncork_file_mkdir_one(struct cork_file *file, cork_file_mode mode,\n                    unsigned int flags)\n{\n    DEBUG(\"mkdir %s\\n\", cork_path_get(file->path));\n\n    /* First check if the directory already exists. */\n    rii_check(cork_file_stat(file));\n    if (file->type == CORK_FILE_DIRECTORY) {\n        DEBUG(\"  Already exists!\\n\");\n        if (!(flags & CORK_FILE_PERMISSIVE)) {\n            cork_system_error_set_explicit(EEXIST);\n            return -1;\n        } else {\n            return 0;\n        }\n    } else if (file->type != CORK_FILE_MISSING) {\n        DEBUG(\"  Exists and not a directory!\\n\");\n        cork_system_error_set_explicit(EEXIST);\n        return -1;\n    }\n\n    /* If the caller asked for a recursive mkdir, then make sure the parent\n     * directory exists. */\n    if (flags & CORK_FILE_RECURSIVE) {\n        struct cork_path  *parent = cork_path_dirname(file->path);\n        DEBUG(\"  Checking parent %s\\n\", cork_path_get(parent));\n        if (parent->given.size == 0) {\n            /* There is no parent; we're either at the filesystem root (for an\n             * absolute path) or the current directory (for a relative one).\n             * Either way, we can assume it already exists. */\n            cork_path_free(parent);\n        } else {\n            int  rc;\n            struct cork_file  parent_file;\n            cork_file_init(&parent_file, parent);\n            rc = cork_file_mkdir_one\n                (&parent_file, mode, flags | CORK_FILE_PERMISSIVE);\n            cork_file_done(&parent_file);\n            rii_check(rc);\n        }\n    }\n\n    /* Create the directory already! */\n    DEBUG(\"  Creating %s\\n\", cork_path_get(file->path));\n    rii_check_posix(mkdir(cork_path_get(file->path), mode));\n    return 0;\n}\n\nint\ncork_file_mkdir(struct cork_file *file, cork_file_mode mode,\n                unsigned int flags)\n{\n    return cork_file_mkdir_one(file, mode, flags);\n}\n\nstatic int\ncork_file_remove_iterator(struct cork_file *file, const char *rel_name,\n                          void *user_data)\n{\n    unsigned int  *flags = user_data;\n    return cork_file_remove(file, *flags);\n}\n\nint\ncork_file_remove(struct cork_file *file, unsigned int flags)\n{\n    DEBUG(\"rm %s\\n\", cork_path_get(file->path));\n    rii_check(cork_file_stat(file));\n\n    if (file->type == CORK_FILE_MISSING) {\n        if (flags & CORK_FILE_PERMISSIVE) {\n            return 0;\n        } else {\n            cork_system_error_set_explicit(ENOENT);\n            return -1;\n        }\n    } else if (file->type == CORK_FILE_DIRECTORY) {\n        if (flags & CORK_FILE_RECURSIVE) {\n            /* The user asked that we delete the contents of the directory\n             * first. */\n            rii_check(cork_file_iterate_directory\n                      (file, cork_file_remove_iterator, &flags));\n        }\n\n        rii_check_posix(rmdir(cork_path_get(file->path)));\n        return 0;\n    } else {\n        rii_check(unlink(cork_path_get(file->path)));\n        return 0;\n    }\n}\n\n\n/*-----------------------------------------------------------------------\n * Lists of files\n */\n\nstruct cork_file_list {\n    cork_array(struct cork_file *)  array;\n};\n\nstruct cork_file_list *\ncork_file_list_new_empty(void)\n{\n    struct cork_file_list  *list = cork_new(struct cork_file_list);\n    cork_array_init(&list->array);\n    return list;\n}\n\nvoid\ncork_file_list_free(struct cork_file_list *list)\n{\n    size_t  i;\n    for (i = 0; i < cork_array_size(&list->array); i++) {\n        struct cork_file  *file = cork_array_at(&list->array, i);\n        cork_file_free(file);\n    }\n    cork_array_done(&list->array);\n    cork_delete(struct cork_file_list, list);\n}\n\nvoid\ncork_file_list_add(struct cork_file_list *list, struct cork_file *file)\n{\n    cork_array_append(&list->array, file);\n}\n\nsize_t\ncork_file_list_size(struct cork_file_list *list)\n{\n    return cork_array_size(&list->array);\n}\n\nstruct cork_file *\ncork_file_list_get(struct cork_file_list *list, size_t index)\n{\n    return cork_array_at(&list->array, index);\n}\n\nstruct cork_file_list *\ncork_file_list_new(struct cork_path_list *path_list)\n{\n    struct cork_file_list  *list = cork_file_list_new_empty();\n    size_t  count = cork_path_list_size(path_list);\n    size_t  i;\n\n    for (i = 0; i < count; i++) {\n        const struct cork_path  *path = cork_path_list_get(path_list, i);\n        struct cork_file  *file = cork_file_new(cork_path_get(path));\n        cork_array_append(&list->array, file);\n    }\n\n    return list;\n}\n\n\nstruct cork_file_list *\ncork_path_list_find_files(const struct cork_path_list *path_list,\n                          const char *rel_path)\n{\n    size_t  i;\n    size_t  count = cork_path_list_size(path_list);\n    struct cork_file_list  *list = cork_file_list_new_empty();\n    struct cork_file  *file;\n\n    for (i = 0; i < count; i++) {\n        const struct cork_path  *path = cork_path_list_get(path_list, i);\n        struct cork_path  *joined = cork_path_join(path, rel_path);\n        bool  exists;\n        file = cork_file_new_from_path(joined);\n        ei_check(cork_file_exists(file, &exists));\n        if (exists) {\n            cork_file_list_add(list, file);\n        } else {\n            cork_file_free(file);\n        }\n    }\n\n    return list;\n\nerror:\n    cork_file_list_free(list);\n    cork_file_free(file);\n    return NULL;\n}\n\n\n/*-----------------------------------------------------------------------\n * Standard paths and path lists\n */\n\n#define empty_string(str)  ((str) == NULL || (str)[0] == '\\0')\n\nstruct cork_path *\ncork_path_home(void)\n{\n    const char  *path = cork_env_get(NULL, \"HOME\");\n    if (empty_string(path)) {\n        cork_undefined(\"Cannot determine home directory\");\n        return NULL;\n    } else {\n        return cork_path_new(path);\n    }\n}\n\n\nstruct cork_path_list *\ncork_path_config_paths(void)\n{\n    struct cork_path_list  *list = cork_path_list_new_empty();\n    const char  *var;\n    struct cork_path  *path;\n\n    /* The first entry should be the user's configuration directory.  This is\n     * specified by $XDG_CONFIG_HOME, with $HOME/.config as the default. */\n    var = cork_env_get(NULL, \"XDG_CONFIG_HOME\");\n    if (empty_string(var)) {\n        ep_check(path = cork_path_home());\n        cork_path_append(path, \".config\");\n        cork_path_list_add(list, path);\n    } else {\n        path = cork_path_new(var);\n        cork_path_list_add(list, path);\n    }\n\n    /* The remaining entries should be the system-wide configuration\n     * directories.  These are specified by $XDG_CONFIG_DIRS, with /etc/xdg as\n     * the default. */\n    var = cork_env_get(NULL, \"XDG_CONFIG_DIRS\");\n    if (empty_string(var)) {\n        path = cork_path_new(\"/etc/xdg\");\n        cork_path_list_add(list, path);\n    } else {\n        cork_path_list_append_string(list, var);\n    }\n\n    return list;\n\nerror:\n    cork_path_list_free(list);\n    return NULL;\n}\n\nstruct cork_path_list *\ncork_path_data_paths(void)\n{\n    struct cork_path_list  *list = cork_path_list_new_empty();\n    const char  *var;\n    struct cork_path  *path;\n\n    /* The first entry should be the user's data directory.  This is specified\n     * by $XDG_DATA_HOME, with $HOME/.local/share as the default. */\n    var = cork_env_get(NULL, \"XDG_DATA_HOME\");\n    if (empty_string(var)) {\n        ep_check(path = cork_path_home());\n        cork_path_append(path, \".local/share\");\n        cork_path_list_add(list, path);\n    } else {\n        path = cork_path_new(var);\n        cork_path_list_add(list, path);\n    }\n\n    /* The remaining entries should be the system-wide configuration\n     * directories.  These are specified by $XDG_DATA_DIRS, with\n     * /usr/local/share:/usr/share as the the default. */\n    var = cork_env_get(NULL, \"XDG_DATA_DIRS\");\n    if (empty_string(var)) {\n        path = cork_path_new(\"/usr/local/share\");\n        cork_path_list_add(list, path);\n        path = cork_path_new(\"/usr/share\");\n        cork_path_list_add(list, path);\n    } else {\n        cork_path_list_append_string(list, var);\n    }\n\n    return list;\n\nerror:\n    cork_path_list_free(list);\n    return NULL;\n}\n\nstruct cork_path *\ncork_path_user_cache_path(void)\n{\n    const char  *var;\n    struct cork_path  *path;\n\n    /* The user's cache directory is specified by $XDG_CACHE_HOME, with\n     * $HOME/.cache as the default. */\n    var = cork_env_get(NULL, \"XDG_CACHE_HOME\");\n    if (empty_string(var)) {\n        rpp_check(path = cork_path_home());\n        cork_path_append(path, \".cache\");\n        return path;\n    } else {\n        return cork_path_new(var);\n    }\n}\n\nstruct cork_path *\ncork_path_user_runtime_path(void)\n{\n    const char  *var;\n\n    /* The user's cache directory is specified by $XDG_RUNTIME_DIR, with\n     * no default given by the spec. */\n    var = cork_env_get(NULL, \"XDG_RUNTIME_DIR\");\n    if (empty_string(var)) {\n        cork_undefined(\"Cannot determine user-specific runtime directory\");\n        return NULL;\n    } else {\n        return cork_path_new(var);\n    }\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/posix/process.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2013-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <stdlib.h>\n\n#include \"libcork/core.h\"\n#include \"libcork/ds.h\"\n#include \"libcork/os/process.h\"\n#include \"libcork/helpers/errors.h\"\n\n\n#if !defined(CORK_DEBUG_PROCESS)\n#define CORK_DEBUG_PROCESS  0\n#endif\n\n#if CORK_DEBUG_PROCESS\n#include <stdio.h>\n#define DEBUG(...) fprintf(stderr, __VA_ARGS__)\n#else\n#define DEBUG(...) /* no debug messages */\n#endif\n\n\nstruct cork_cleanup_entry {\n    struct cork_dllist_item  item;\n    int  priority;\n    const char  *name;\n    cork_cleanup_function  function;\n};\n\nstatic struct cork_cleanup_entry *\ncork_cleanup_entry_new(const char *name, int priority,\n                       cork_cleanup_function function)\n{\n    struct cork_cleanup_entry  *self = cork_new(struct cork_cleanup_entry);\n    self->priority = priority;\n    self->name = cork_strdup(name);\n    self->function = function;\n    return self;\n}\n\nstatic void\ncork_cleanup_entry_free(struct cork_cleanup_entry *self)\n{\n    cork_strfree(self->name);\n    cork_delete(struct cork_cleanup_entry, self);\n}\n\nstatic struct cork_dllist  cleanup_entries = CORK_DLLIST_INIT(cleanup_entries);\nstatic bool  cleanup_registered = false;\n\nstatic void\ncork_cleanup_call_one(struct cork_dllist_item *item, void *user_data)\n{\n    struct cork_cleanup_entry  *entry =\n        cork_container_of(item, struct cork_cleanup_entry, item);\n    cork_cleanup_function  function = entry->function;\n    DEBUG(\"Call cleanup function [%d] %s\\n\", entry->priority, entry->name);\n    /* We need to free the entry before calling the entry's function, since one\n     * of the functions that libcork registers frees the allocator instance that\n     * we'd use to free the entry.  If we called the function first, the\n     * allocator would be freed before we could use it to free the entry. */\n    cork_cleanup_entry_free(entry);\n    function();\n}\n\nstatic void\ncork_cleanup_call_all(void)\n{\n    cork_dllist_map(&cleanup_entries, cork_cleanup_call_one, NULL);\n}\n\nstatic void\ncork_cleanup_entry_add(struct cork_cleanup_entry *entry)\n{\n    struct cork_dllist_item  *curr;\n\n    if (CORK_UNLIKELY(!cleanup_registered)) {\n        atexit(cork_cleanup_call_all);\n        cleanup_registered = true;\n    }\n\n    /* Linear search through the list of existing cleanup functions.  When we\n     * find the first existing function with a higher priority, we've found\n     * where to insert the new function. */\n    for (curr = cork_dllist_start(&cleanup_entries);\n         !cork_dllist_is_end(&cleanup_entries, curr); curr = curr->next) {\n        struct cork_cleanup_entry  *existing =\n            cork_container_of(curr, struct cork_cleanup_entry, item);\n        if (existing->priority > entry->priority) {\n            cork_dllist_add_before(&existing->item, &entry->item);\n            return;\n        }\n    }\n\n    /* If we fall through the loop, then the new function should be appended to\n     * the end of the list. */\n    cork_dllist_add(&cleanup_entries, &entry->item);\n}\n\n\nCORK_API void\ncork_cleanup_at_exit_named(const char *name, int priority,\n                           cork_cleanup_function function)\n{\n    struct cork_cleanup_entry  *entry =\n        cork_cleanup_entry_new(name, priority, function);\n    DEBUG(\"Register cleanup function [%d] %s\\n\", priority, name);\n    cork_cleanup_entry_add(entry);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/posix/subprocess.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012-2014, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#include <assert.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <signal.h>\n#ifndef __MINGW32__\n//#include <sys/select.h>\n#include <sys/wait.h>\n#endif\n#include <unistd.h>\n\n#include \"libcork/core.h\"\n#include \"libcork/ds.h\"\n#include \"libcork/os/subprocess.h\"\n#include \"libcork/threads/basics.h\"\n#include \"libcork/helpers/errors.h\"\n#include \"libcork/helpers/posix.h\"\n\n\n#if !defined(CORK_DEBUG_SUBPROCESS)\n#define CORK_DEBUG_SUBPROCESS  0\n#endif\n\n#if CORK_DEBUG_SUBPROCESS\n#include <stdio.h>\n#define DEBUG(...) fprintf(stderr, __VA_ARGS__)\n#else\n#define DEBUG(...) /* no debug messages */\n#endif\n\n\n/*-----------------------------------------------------------------------\n * Subprocess groups\n */\n\n#define BUF_SIZE  4096\n\nstruct cork_subprocess_group {\n    cork_array(struct cork_subprocess *)  subprocesses;\n};\n\nstruct cork_subprocess_group *\ncork_subprocess_group_new(void)\n{\n    struct cork_subprocess_group  *group =\n        cork_new(struct cork_subprocess_group);\n    cork_pointer_array_init\n        (&group->subprocesses, (cork_free_f) cork_subprocess_free);\n    return group;\n}\n\nvoid\ncork_subprocess_group_free(struct cork_subprocess_group *group)\n{\n    cork_array_done(&group->subprocesses);\n    cork_delete(struct cork_subprocess_group, group);\n}\n\nvoid\ncork_subprocess_group_add(struct cork_subprocess_group *group,\n                          struct cork_subprocess *sub)\n{\n    cork_array_append(&group->subprocesses, sub);\n}\n\n\n/*-----------------------------------------------------------------------\n * Pipes (parent reads)\n */\n\nstruct cork_read_pipe {\n    struct cork_stream_consumer  *consumer;\n    int  fds[2];\n    bool  first;\n};\n\nstatic void\ncork_read_pipe_init(struct cork_read_pipe *p, struct cork_stream_consumer *consumer)\n{\n    p->consumer = consumer;\n    p->fds[0] = -1;\n    p->fds[1] = -1;\n}\n\nstatic int\ncork_read_pipe_close_read(struct cork_read_pipe *p)\n{\n    if (p->fds[0] != -1) {\n        DEBUG(\"Closing read pipe %d\\n\", p->fds[0]);\n        rii_check_posix(close(p->fds[0]));\n        p->fds[0] = -1;\n    }\n    return 0;\n}\n\nstatic int\ncork_read_pipe_close_write(struct cork_read_pipe *p)\n{\n    if (p->fds[1] != -1) {\n        DEBUG(\"Closing write pipe %d\\n\", p->fds[1]);\n        rii_check_posix(close(p->fds[1]));\n        p->fds[1] = -1;\n    }\n    return 0;\n}\n\nstatic void\ncork_read_pipe_close(struct cork_read_pipe *p)\n{\n    cork_read_pipe_close_read(p);\n    cork_read_pipe_close_write(p);\n}\n\nstatic void\ncork_read_pipe_done(struct cork_read_pipe *p)\n{\n    cork_read_pipe_close(p);\n}\n\nstatic int\ncork_read_pipe_open(struct cork_read_pipe *p)\n{\n    if (p->consumer != NULL) {\n        int  flags;\n\n        /* We want the read end of the pipe to be non-blocking. */\n        DEBUG(\"[read] Opening pipe\\n\");\n        rii_check_posix(pipe(p->fds));\n        DEBUG(\"[read]   Got read=%d write=%d\\n\", p->fds[0], p->fds[1]);\n        DEBUG(\"[read]   Setting non-blocking flag on read pipe\\n\");\n        ei_check_posix(flags = fcntl(p->fds[0], F_GETFD));\n        flags |= O_NONBLOCK;\n        ei_check_posix(fcntl(p->fds[0], F_SETFD, flags));\n    }\n\n    p->first = true;\n    return 0;\n\nerror:\n    cork_read_pipe_close(p);\n    return -1;\n}\n\nstatic int\ncork_read_pipe_dup(struct cork_read_pipe *p, int fd)\n{\n    if (p->fds[1] != -1) {\n        rii_check_posix(dup2(p->fds[1], fd));\n    }\n    return 0;\n}\n\nstatic int\ncork_read_pipe_read(struct cork_read_pipe *p, char *buf, bool *progress)\n{\n    if (p->fds[0] == -1) {\n        return 0;\n    }\n\n    do {\n        DEBUG(\"[read] Reading from pipe %d\\n\", p->fds[0]);\n        ssize_t  bytes_read = read(p->fds[0], buf, BUF_SIZE);\n        if (bytes_read == -1) {\n            if (errno == EAGAIN) {\n                /* We've exhausted all of the data currently available. */\n                DEBUG(\"[read]   No more bytes without blocking\\n\");\n                return 0;\n            } else if (errno == EINTR) {\n                /* Interrupted by a signal; return so that our wait loop can\n                 * catch that. */\n                DEBUG(\"[read]   Interrupted by signal\\n\");\n                return 0;\n            } else {\n                /* An actual error */\n                cork_system_error_set();\n                DEBUG(\"[read]   Error: %s\\n\", cork_error_message());\n                return -1;\n            }\n        } else if (bytes_read == 0) {\n            DEBUG(\"[read]   End of stream\\n\");\n            *progress = true;\n            rii_check(cork_stream_consumer_eof(p->consumer));\n            rii_check_posix(close(p->fds[0]));\n            p->fds[0] = -1;\n            return 0;\n        } else {\n            DEBUG(\"[read]   Got %zd bytes\\n\", bytes_read);\n            *progress = true;\n            rii_check(cork_stream_consumer_data\n                      (p->consumer, buf, bytes_read, p->first));\n            p->first = false;\n        }\n    } while (true);\n}\n\nstatic bool\ncork_read_pipe_is_finished(struct cork_read_pipe *p)\n{\n    return p->fds[0] == -1;\n}\n\n\n/*-----------------------------------------------------------------------\n * Pipes (parent writes)\n */\n\nstruct cork_write_pipe {\n    struct cork_stream_consumer  consumer;\n    int  fds[2];\n};\n\nstatic int\ncork_write_pipe_close_read(struct cork_write_pipe *p)\n{\n    if (p->fds[0] != -1) {\n        DEBUG(\"[write] Closing read pipe %d\\n\", p->fds[0]);\n        rii_check_posix(close(p->fds[0]));\n        p->fds[0] = -1;\n    }\n    return 0;\n}\n\nstatic int\ncork_write_pipe_close_write(struct cork_write_pipe *p)\n{\n    if (p->fds[1] != -1) {\n        DEBUG(\"[write] Closing write pipe %d\\n\", p->fds[1]);\n        rii_check_posix(close(p->fds[1]));\n        p->fds[1] = -1;\n    }\n    return 0;\n}\n\nstatic int\ncork_write_pipe__data(struct cork_stream_consumer *consumer,\n                      const void *buf, size_t size, bool is_first_chunk)\n{\n    struct cork_write_pipe  *p =\n        cork_container_of(consumer, struct cork_write_pipe, consumer);\n    rii_check_posix(write(p->fds[1], buf, size));\n    return 0;\n}\n\nstatic int\ncork_write_pipe__eof(struct cork_stream_consumer *consumer)\n{\n    struct cork_write_pipe  *p =\n        cork_container_of(consumer, struct cork_write_pipe, consumer);\n    return cork_write_pipe_close_write(p);\n}\n\nstatic void\ncork_write_pipe__free(struct cork_stream_consumer *consumer)\n{\n}\n\nstatic void\ncork_write_pipe_init(struct cork_write_pipe *p)\n{\n    p->consumer.data = cork_write_pipe__data;\n    p->consumer.eof = cork_write_pipe__eof;\n    p->consumer.free = cork_write_pipe__free;\n    p->fds[0] = -1;\n    p->fds[1] = -1;\n}\n\nstatic void\ncork_write_pipe_close(struct cork_write_pipe *p)\n{\n    cork_write_pipe_close_read(p);\n    cork_write_pipe_close_write(p);\n}\n\nstatic void\ncork_write_pipe_done(struct cork_write_pipe *p)\n{\n    cork_write_pipe_close(p);\n}\n\nstatic int\ncork_write_pipe_open(struct cork_write_pipe *p)\n{\n    DEBUG(\"[write] Opening writer pipe\\n\");\n    rii_check_posix(pipe(p->fds));\n    DEBUG(\"[write]   Got read=%d write=%d\\n\", p->fds[0], p->fds[1]);\n    return 0;\n}\n\nstatic int\ncork_write_pipe_dup(struct cork_write_pipe *p, int fd)\n{\n    if (p->fds[0] != -1) {\n        rii_check_posix(dup2(p->fds[0], fd));\n    }\n    return 0;\n}\n\n\n/*-----------------------------------------------------------------------\n * Subprocesses\n */\n\nstruct cork_subprocess {\n    pid_t  pid;\n    struct cork_write_pipe  stdin_pipe;\n    struct cork_read_pipe  stdout_pipe;\n    struct cork_read_pipe  stderr_pipe;\n    void  *user_data;\n    cork_free_f  free_user_data;\n    cork_run_f  run;\n    int  *exit_code;\n    char  buf[BUF_SIZE];\n};\n\nstruct cork_subprocess *\ncork_subprocess_new(void *user_data, cork_free_f free_user_data,\n                    cork_run_f run,\n                    struct cork_stream_consumer *stdout_consumer,\n                    struct cork_stream_consumer *stderr_consumer,\n                    int *exit_code)\n{\n    struct cork_subprocess  *self = cork_new(struct cork_subprocess);\n    cork_write_pipe_init(&self->stdin_pipe);\n    cork_read_pipe_init(&self->stdout_pipe, stdout_consumer);\n    cork_read_pipe_init(&self->stderr_pipe, stderr_consumer);\n    self->pid = 0;\n    self->user_data = user_data;\n    self->free_user_data = free_user_data;\n    self->run = run;\n    self->exit_code = exit_code;\n    return self;\n}\n\nvoid\ncork_subprocess_free(struct cork_subprocess *self)\n{\n    cork_free_user_data(self);\n    cork_write_pipe_done(&self->stdin_pipe);\n    cork_read_pipe_done(&self->stdout_pipe);\n    cork_read_pipe_done(&self->stderr_pipe);\n    cork_delete(struct cork_subprocess, self);\n}\n\nstruct cork_stream_consumer *\ncork_subprocess_stdin(struct cork_subprocess *self)\n{\n    return &self->stdin_pipe.consumer;\n}\n\n\n/*-----------------------------------------------------------------------\n * Executing another program\n */\n\nstatic int\ncork_exec__run(void *vself)\n{\n    struct cork_exec  *exec = vself;\n    return cork_exec_run(exec);\n}\n\nstatic void\ncork_exec__free(void *vself)\n{\n    struct cork_exec  *exec = vself;\n    cork_exec_free(exec);\n}\n\nstruct cork_subprocess *\ncork_subprocess_new_exec(struct cork_exec *exec,\n                         struct cork_stream_consumer *out,\n                         struct cork_stream_consumer *err,\n                         int *exit_code)\n{\n    return cork_subprocess_new\n        (exec, cork_exec__free,\n         cork_exec__run,\n         out, err, exit_code);\n}\n\n\n/*-----------------------------------------------------------------------\n * Running subprocesses\n */\n\nint\ncork_subprocess_start(struct cork_subprocess *self)\n{\n    pid_t  pid;\n\n    /* Create the stdout and stderr pipes. */\n    if (cork_write_pipe_open(&self->stdin_pipe) == -1) {\n        return -1;\n    }\n    if (cork_read_pipe_open(&self->stdout_pipe) == -1) {\n        cork_write_pipe_close(&self->stdin_pipe);\n        return -1;\n    }\n    if (cork_read_pipe_open(&self->stderr_pipe) == -1) {\n        cork_write_pipe_close(&self->stdin_pipe);\n        cork_read_pipe_close(&self->stdout_pipe);\n        return -1;\n    }\n\n    /* Fork the child process. */\n    DEBUG(\"Forking child process\\n\");\n    pid = fork();\n    if (pid == 0) {\n        /* Child process */\n        int  rc;\n\n        /* Close the parent's end of the pipes */\n        DEBUG(\"[child] \");\n        cork_write_pipe_close_write(&self->stdin_pipe);\n        DEBUG(\"[child] \");\n        cork_read_pipe_close_read(&self->stdout_pipe);\n        DEBUG(\"[child] \");\n        cork_read_pipe_close_read(&self->stderr_pipe);\n\n        /* Bind the stdout and stderr pipes */\n        if (cork_write_pipe_dup(&self->stdin_pipe, STDIN_FILENO) == -1) {\n            _exit(EXIT_FAILURE);\n        }\n        if (cork_read_pipe_dup(&self->stdout_pipe, STDOUT_FILENO) == -1) {\n            _exit(EXIT_FAILURE);\n        }\n        if (cork_read_pipe_dup(&self->stderr_pipe, STDERR_FILENO) == -1) {\n            _exit(EXIT_FAILURE);\n        }\n\n        /* Run the subprocess */\n        rc = self->run(self->user_data);\n        if (CORK_LIKELY(rc == 0)) {\n            _exit(EXIT_SUCCESS);\n        } else {\n            fprintf(stderr, \"%s\\n\", cork_error_message());\n            _exit(EXIT_FAILURE);\n        }\n    } else if (pid < 0) {\n        /* Error forking */\n        cork_system_error_set();\n        return -1;\n    } else {\n        /* Parent process */\n        DEBUG(\"  Child PID=%d\\n\", (int) pid);\n        self->pid = pid;\n        cork_write_pipe_close_read(&self->stdin_pipe);\n        cork_read_pipe_close_write(&self->stdout_pipe);\n        cork_read_pipe_close_write(&self->stderr_pipe);\n        return 0;\n    }\n}\n\nstatic int\ncork_subprocess_reap(struct cork_subprocess *self, int flags, bool *progress)\n{\n    int  pid;\n    int  status;\n    rii_check_posix(pid = waitpid(self->pid, &status, flags));\n    if (pid == self->pid) {\n        *progress = true;\n        self->pid = 0;\n        if (self->exit_code != NULL) {\n            *self->exit_code = WEXITSTATUS(status);\n        }\n    }\n    return 0;\n}\n\nint\ncork_subprocess_abort(struct cork_subprocess *self)\n{\n    if (self->pid > 0) {\n        CORK_ATTR_UNUSED bool  progress;\n        DEBUG(\"Terminating child process %d\\n\", (int) self->pid);\n        kill(self->pid, SIGTERM);\n        return cork_subprocess_reap(self, 0, &progress);\n    } else {\n        return 0;\n    }\n}\n\nbool\ncork_subprocess_is_finished(struct cork_subprocess *self)\n{\n    return (self->pid == 0)\n        && cork_read_pipe_is_finished(&self->stdout_pipe)\n        && cork_read_pipe_is_finished(&self->stderr_pipe);\n}\n\n#if defined(__APPLE__) || defined(__MINGW32__)\n#include <pthread.h>\n#define THREAD_YIELD   pthread_yield_np\n#elif defined(__linux__) || defined(BSD) || defined(__sun) || defined(__FreeBSD_kernel__) || defined(__GNU__) || defined(__CYGWIN__)\n#include <sched.h>\n#define THREAD_YIELD   sched_yield\n#else\n#error \"Unknown thread yield implementation\"\n#endif\n\nstatic void\ncork_subprocess_yield(unsigned int *spin_count)\n{\n    /* Adapted from\n     * http://www.1024cores.net/home/lock-free-algorithms/tricks/spinning */\n\n    if (*spin_count < 10) {\n        /* Spin-wait */\n        cork_pause();\n    } else if (*spin_count < 20) {\n        /* A more intense spin-wait */\n        int  i;\n        for (i = 0; i < 50; i++) {\n            cork_pause();\n        }\n    } else if (*spin_count < 22) {\n        THREAD_YIELD();\n    } else if (*spin_count < 24) {\n        usleep(0);\n    } else if (*spin_count < 50) {\n        usleep(1);\n    } else if (*spin_count < 75) {\n        usleep((*spin_count - 49) * 1000);\n    } else {\n        usleep(25000);\n    }\n\n    (*spin_count)++;\n}\n\nstatic int\ncork_subprocess_drain_(struct cork_subprocess *self, bool *progress)\n{\n    rii_check(cork_read_pipe_read(&self->stdout_pipe, self->buf, progress));\n    rii_check(cork_read_pipe_read(&self->stderr_pipe, self->buf, progress));\n    if (self->pid > 0) {\n        return cork_subprocess_reap(self, WNOHANG, progress);\n    } else {\n        return 0;\n    }\n}\n\nbool\ncork_subprocess_drain(struct cork_subprocess *self)\n{\n    bool  progress;\n    cork_subprocess_drain_(self, &progress);\n    return progress;\n}\n\nint\ncork_subprocess_wait(struct cork_subprocess *self)\n{\n    unsigned int  spin_count = 0;\n    bool  progress;\n    while (!cork_subprocess_is_finished(self)) {\n        progress = false;\n        rii_check(cork_subprocess_drain_(self, &progress));\n        if (!progress) {\n            cork_subprocess_yield(&spin_count);\n        }\n    }\n    return 0;\n}\n\n\n/*-----------------------------------------------------------------------\n * Running subprocess groups\n */\n\nstatic int\ncork_subprocess_group_terminate(struct cork_subprocess_group *group)\n{\n    size_t  i;\n    for (i = 0; i < cork_array_size(&group->subprocesses); i++) {\n        struct cork_subprocess  *sub = cork_array_at(&group->subprocesses, i);\n        rii_check(cork_subprocess_abort(sub));\n    }\n    return 0;\n}\n\nint\ncork_subprocess_group_start(struct cork_subprocess_group *group)\n{\n    size_t  i;\n    DEBUG(\"Starting subprocess group\\n\");\n    /* Start each subprocess. */\n    for (i = 0; i < cork_array_size(&group->subprocesses); i++) {\n        struct cork_subprocess  *sub = cork_array_at(&group->subprocesses, i);\n        ei_check(cork_subprocess_start(sub));\n    }\n    return 0;\n\nerror:\n    cork_subprocess_group_terminate(group);\n    return -1;\n}\n\n\nint\ncork_subprocess_group_abort(struct cork_subprocess_group *group)\n{\n    DEBUG(\"Aborting subprocess group\\n\");\n    return cork_subprocess_group_terminate(group);\n}\n\n\nbool\ncork_subprocess_group_is_finished(struct cork_subprocess_group *group)\n{\n    size_t  i;\n    for (i = 0; i < cork_array_size(&group->subprocesses); i++) {\n        struct cork_subprocess  *sub = cork_array_at(&group->subprocesses, i);\n        bool  sub_finished = cork_subprocess_is_finished(sub);\n        if (!sub_finished) {\n            return false;\n        }\n    }\n    return true;\n}\n\nstatic int\ncork_subprocess_group_drain_(struct cork_subprocess_group *group,\n                             bool *progress)\n{\n    size_t  i;\n    for (i = 0; i < cork_array_size(&group->subprocesses); i++) {\n        struct cork_subprocess  *sub = cork_array_at(&group->subprocesses, i);\n        rii_check(cork_subprocess_drain_(sub, progress));\n    }\n    return 0;\n}\n\nbool\ncork_subprocess_group_drain(struct cork_subprocess_group *group)\n{\n    bool  progress = false;\n    cork_subprocess_group_drain_(group, &progress);\n    return progress;\n}\n\nint\ncork_subprocess_group_wait(struct cork_subprocess_group *group)\n{\n    unsigned int  spin_count = 0;\n    bool  progress;\n    DEBUG(\"Waiting for subprocess group to finish\\n\");\n    while (!cork_subprocess_group_is_finished(group)) {\n        progress = false;\n        rii_check(cork_subprocess_group_drain_(group, &progress));\n        if (!progress) {\n            cork_subprocess_yield(&spin_count);\n        }\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libcork/pthreads/thread.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2013-2015, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the COPYING file in this distribution for license details.\n * ----------------------------------------------------------------------\n */\n\n#if defined(__linux)\n/* This is needed on Linux to get the pthread_setname_np function. */\n#if !defined(_GNU_SOURCE)\n#define _GNU_SOURCE 1\n#endif\n#endif\n\n#include <assert.h>\n#include <string.h>\n\n#include <pthread.h>\n\n#include \"libcork/core/allocator.h\"\n#include \"libcork/core/error.h\"\n#include \"libcork/core/types.h\"\n#include \"libcork/ds/buffer.h\"\n#include \"libcork/threads/basics.h\"\n\n\n/*-----------------------------------------------------------------------\n * Current thread\n */\n\nstatic volatile cork_thread_id  last_thread_descriptor = 0;\n\nstruct cork_thread {\n    const char  *name;\n    cork_thread_id  id;\n    pthread_t  thread_id;\n    void  *user_data;\n    cork_free_f  free_user_data;\n    cork_run_f  run;\n    cork_error  error_code;\n    struct cork_buffer  error_message;\n    bool  started;\n    bool  joined;\n};\n\nstruct cork_thread_descriptor {\n    struct cork_thread  *current_thread;\n    cork_thread_id  id;\n};\n\ncork_tls(struct cork_thread_descriptor, cork_thread_descriptor);\n\nstruct cork_thread *\ncork_current_thread_get(void)\n{\n    struct cork_thread_descriptor  *desc = cork_thread_descriptor_get();\n    return desc->current_thread;\n}\n\ncork_thread_id\ncork_current_thread_get_id(void)\n{\n    struct cork_thread_descriptor  *desc = cork_thread_descriptor_get();\n    if (CORK_UNLIKELY(desc->id == 0)) {\n        if (desc->current_thread == NULL) {\n            desc->id = cork_uint_atomic_add(&last_thread_descriptor, 1);\n        } else {\n            desc->id = desc->current_thread->id;\n        }\n    }\n    return desc->id;\n}\n\n\n/*-----------------------------------------------------------------------\n * Threads\n */\n\nstruct cork_thread *\ncork_thread_new(const char *name,\n                void *user_data, cork_free_f free_user_data,\n                cork_run_f run)\n{\n    struct cork_thread  *self = cork_new(struct cork_thread);\n    self->name = cork_strdup(name);\n    self->id = cork_uint_atomic_add(&last_thread_descriptor, 1);\n    self->user_data = user_data;\n    self->free_user_data = free_user_data;\n    self->run = run;\n    self->error_code = CORK_ERROR_NONE;\n    cork_buffer_init(&self->error_message);\n    self->started = false;\n    self->joined = false;\n    return self;\n}\n\nstatic void\ncork_thread_free_private(struct cork_thread *self)\n{\n    cork_strfree(self->name);\n    cork_free_user_data(self);\n    cork_buffer_done(&self->error_message);\n    cork_delete(struct cork_thread, self);\n}\n\nvoid\ncork_thread_free(struct cork_thread *self)\n{\n    assert(!self->started);\n    cork_thread_free_private(self);\n}\n\nconst char *\ncork_thread_get_name(struct cork_thread *self)\n{\n    return self->name;\n}\n\ncork_thread_id\ncork_thread_get_id(struct cork_thread *self)\n{\n    return self->id;\n}\n\n#define PTHREADS_MAX_THREAD_NAME_LENGTH  16\n\nstatic void *\ncork_thread_pthread_run(void *vself)\n{\n    int  rc;\n    struct cork_thread  *self = vself;\n    struct cork_thread_descriptor  *desc = cork_thread_descriptor_get();\n#if defined(__APPLE__) && defined(__MACH__)\n    char  thread_name[PTHREADS_MAX_THREAD_NAME_LENGTH];\n#endif\n\n    desc->current_thread = self;\n    desc->id = self->id;\n    rc = self->run(self->user_data);\n\n#if defined(__APPLE__) && defined(__MACH__)\n    /* On Mac OS X, we set the name of the current thread, not of an arbitrary\n     * thread of our choosing. */\n    strncpy(thread_name, self->name, PTHREADS_MAX_THREAD_NAME_LENGTH);\n    thread_name[PTHREADS_MAX_THREAD_NAME_LENGTH - 1] = '\\0';\n    pthread_setname_np(thread_name);\n#endif\n\n    /* If an error occurred in the body of the thread, save the error into the\n     * cork_thread object so that we can propagate that error when some calls\n     * cork_thread_join. */\n    if (CORK_UNLIKELY(rc != 0)) {\n        if (CORK_LIKELY(cork_error_occurred())) {\n            self->error_code = cork_error_code();\n            cork_buffer_set_string(&self->error_message, cork_error_message());\n        } else {\n            self->error_code = CORK_UNKNOWN_ERROR;\n            cork_buffer_set_string(&self->error_message, \"Unknown error\");\n        }\n    }\n\n    return NULL;\n}\n\nint\ncork_thread_start(struct cork_thread *self)\n{\n    int  rc;\n    pthread_t  thread_id;\n#if defined(__linux) && ((__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 12))\n    char  thread_name[PTHREADS_MAX_THREAD_NAME_LENGTH];\n#endif\n\n    assert(!self->started);\n\n    rc = pthread_create(&thread_id, NULL, cork_thread_pthread_run, self);\n    if (CORK_UNLIKELY(rc != 0)) {\n        cork_system_error_set_explicit(rc);\n        return -1;\n    }\n\n#if defined(__linux) && ((__GLIBC__ >= 2) && (__GLIBC_MINOR__ >= 12))\n    /* On Linux we choose which thread to name via an explicit thread ID.\n     * However, pthread_setname_np() isn't supported on versions of glibc\n     * earlier than 2.12. So we need to check for a MINOR version of 12 or\n     * higher. */\n    strncpy(thread_name, self->name, PTHREADS_MAX_THREAD_NAME_LENGTH);\n    thread_name[PTHREADS_MAX_THREAD_NAME_LENGTH - 1] = '\\0';\n    pthread_setname_np(thread_id, thread_name);\n#endif\n\n    self->thread_id = thread_id;\n    self->started = true;\n    return 0;\n}\n\nint\ncork_thread_join(struct cork_thread *self)\n{\n    int  rc;\n\n    assert(self->started && !self->joined);\n\n    rc = pthread_join(self->thread_id, NULL);\n    if (CORK_UNLIKELY(rc != 0)) {\n        cork_system_error_set_explicit(rc);\n        cork_thread_free_private(self);\n        return -1;\n    }\n\n    if (CORK_UNLIKELY(self->error_code != CORK_ERROR_NONE)) {\n        cork_error_set_printf\n            (self->error_code, \"Error from thread %s: %s\",\n             self->name, (char *) self->error_message.buf);\n        cork_thread_free_private(self);\n        return -1;\n    }\n\n    cork_thread_free_private(self);\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/CMakeLists.txt",
    "content": "# Copyright (C) 2007-2013 LuaDist.\n# Created by Peter Drahoš, Peter Kapec\n# Redistribution and use of this file is allowed according to the terms of the MIT license.\n# For details see the COPYRIGHT file distributed with LuaDist.\n# Please note that the package source code is licensed under its own license.\n\nproject ( libev C )\ncmake_minimum_required ( VERSION 2.8 )\ninclude ( cmake/dist.cmake )\n#include ( configure )\n\n#configure_file ( ${CMAKE_CURRENT_SOURCE_DIR}/config.h.cmake ${CMAKE_CURRENT_BINARY_DIR}/config.h )\ninclude_directories( ${CMAKE_BINARY_DIR} )\n\nset ( EV_SRC \n  ev.c\n  event.c\n)\n\nif (CYGWIN)\n  list ( APPEND EV_LIBS Ws2_32 )\nendif ()\n\nadd_library ( ev STATIC ${EV_SRC} )\ntarget_link_libraries ( ev ${EV_LIBS} )\n\nset(libev_include_dirs\n        ${PROJECT_SOURCE_DIR}\n        CACHE INTERNAL \"libev library\" FORCE\n        )\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/Changes",
    "content": "Revision history for libev, a high-performance and full-featured event loop.\n\nTODO: ev_loop_wakeup\nTODO: EV_STANDALONE == NO_HASSEL (do not use clock_gettime in ev_standalone)\nTODO: faq, process a thing in each iteration\nTODO: dbeugging tips, ev_verify, ev_init twice\nTODO: ev_break for immediate exit (EVBREAK_NOW?)\nTODO: ev_feed_child_event\nTODO: document the special problem of signals around fork.\nTODO: store pid for each signal\nTODO: document file descriptor usage per loop\nTODO: store loop pid_t and compare isndie signal handler,store 1 for same, 2 for differign pid, clean up in loop_fork\nTODO: embed watchers need updating when fd changes\nTODO: document portability requirements for atomic pointer access\nTODO: document requirements for function pointers and calling conventions.\n\n4.22 Sun Dec 20 22:11:50 CET 2015\n\t- when epoll detects unremovable fds in the fd set, rebuild\n          only the epoll descriptor, not the signal pipe, to avoid\n          SIGPIPE in ev_async_send. This doesn't solve it on fork,\n          so document what needs to be done in ev_loop_fork\n          (analyzed by Benjamin Mahler).\n\t- remove superfluous sys/timeb.h include on win32\n          (analyzed by Jason Madden).\n        - updated libecb.\n\n4.20 Sat Jun 20 13:01:43 CEST 2015\n\t- prefer noexcept over throw () with C++ 11.\n        - update ecb.h due to incompatibilities with c11.\n        - fix a potential aliasing issue when reading and writing\n          watcher callbacks.\n\n4.19 Thu Sep 25 08:18:25 CEST 2014\n\t- ev.h wasn't valid C++ anymore, which tripped compilers other than\n          clang, msvc or gcc (analyzed by Raphael 'kena' Poss). Unfortunately,\n          C++ doesn't support typedefs for function pointers fully, so the affected\n          declarations have to spell out the types each time.\n\t- when not using autoconf, tighten the check for clock_gettime and related\n          functionality.\n\n4.18 Fri Sep  5 17:55:26 CEST 2014\n\t- events on files were not always generated properly with the\n          epoll backend (testcase by Assaf Inbal).\n\t- mark event pipe fd as cloexec after a fork (analyzed by Sami Farin).\n        - (ecb) support m68k, m88k and sh (patch by Miod Vallat).\n        - use a reasonable fallback for EV_NSIG instead of erroring out\n          when we can't detect the signal set size.\n        - in the absence of autoconf, do not use the clock syscall\n          on glibc >= 2.17 (avoids the syscall AND -lrt on systems\n          doing clock_gettime in userspace).\n        - ensure extern \"C\" function pointers are used for externally-visible\n          loop callbacks (not watcher callbacks yet).\n        - (ecb) work around memory barriers and volatile apparently both being\n          broken in visual studio 2008 and later (analysed and patch by Nicolas Noble).\n\n4.15 Fri Mar  1 12:04:50 CET 2013\n        - destroying a non-default loop would stop the global waitpid\n          watcher (Denis Bilenko).\n\t- queueing pending watchers of higher priority from a watcher now invokes\n          them in a timely fashion (reported by Denis Bilenko).\n\t- add throw() to all libev functions that cannot throw exceptions, for\n          further code size decrease when compiling for C++.\n        - add throw () to callbacks that must not throw exceptions (allocator,\n          syserr, loop acquire/release, periodic reschedule cbs).\n\t- fix event_base_loop return code, add event_get_callback, event_base_new,\n          event_base_get_method calls to improve libevent 1.x emulation and add\n          some libevent 2.x functionality (based on a patch by Jeff Davey).\n        - add more memory fences to fix a bug reported by Jeff Davey. Better\n          be overfenced than underprotected.\n\t- ev_run now returns a boolean status (true meaning watchers are\n          still active).\n\t- ev_once: undef EV_ERROR in ev_kqueue.c, to avoid clashing with\n          libev's EV_ERROR (reported by 191919).\n\t- (ecb) add memory fence support for xlC (Darin McBride).\n\t- (ecb) add memory fence support for gcc-mips (Anton Kirilov).\n\t- (ecb) add memory fence support for gcc-alpha (Christian Weisgerber).\n        - work around some kernels losing file descriptors by leaking\n          the kqueue descriptor in the child.\n        - work around linux inotify not reporting IN_ATTRIB changes for directories\n          in many cases.\n        - include sys/syscall.h instead of plain syscall.h.\n        - check for io watcher loops in ev_verify, check for the most\n          common reported usage bug in ev_io_start.\n        - choose socket vs. WSASocket at compiletime using EV_USE_WSASOCKET.\n        - always use WSASend/WSARecv directly on windows, hoping that this\n          works in all cases (unlike read/write/send/recv...).\n        - try to detect signals around a fork faster (test program by\n          Denis Bilenko).\n        - work around recent glibc versions that leak memory in realloc.\n        - rename ev::embed::set to ev::embed::set_embed to avoid clashing\n          the watcher base set (loop) method.\n        - rewrite the async/signal pipe logic to always keep a valid fd, which\n          simplifies (and hopefully correctifies :) the race checking\n          on fork, at the cost of one extra fd.\n        - add fat, msdos, jffs2, ramfs, ntfs and btrfs to the list of\n          inotify-supporting filesystems.\n        - move orig_CFLAGS assignment to after AC_INIT, as newer autoconf\n          versions ignore it before\n          (https://bugzilla.redhat.com/show_bug.cgi?id=908096).\n        - add some untested android support.\n        - enum expressions must be of type int (reported by Juan Pablo L).\n\n4.11 Sat Feb  4 19:52:39 CET 2012\n\t- INCOMPATIBLE CHANGE: ev_timer_again now clears the pending status, as\n          was documented already, but not implemented in the repeating case.\n        - new compiletime symbols: EV_NO_SMP and EV_NO_THREADS.\n\t- fix a race where the workaround against the epoll fork bugs\n          caused signals to not be handled anymore.\n\t- correct backend_fudge for most backends, and implement a windows\n          specific workaround to avoid looping because we call both\n          select and Sleep, both with different time resolutions.\n        - document range and guarantees of ev_sleep.\n        - document reasonable ranges for periodics interval and offset.\n        - rename backend_fudge to backend_mintime to avoid future confusion :)\n\t- change the default periodic reschedule function to hopefully be more\n          exact and correct even in corner cases or in the far future.\n        - do not rely on -lm anymore: use it when available but use our\n          own floor () if it is missing. This should make it easier to embed,\n          as no external libraries are required.\n        - strategically import macros from libecb and mark rarely-used functions\n          as cache-cold (saving almost 2k code size on typical amd64 setups).\n        - add Symbols.ev and Symbols.event files, that were missing.\n        - fix backend_mintime value for epoll (was 1/1024, is 1/1000 now).\n        - fix #3 \"be smart about timeouts\" to not \"deadlock\" when\n          timeout == now, also improve the section overall.\n        - avoid \"AVOIDING FINISHING BEFORE RETURNING\" idiom.\n        - support new EV_API_STATIC mode to make all libev symbols\n          static.\n        - supply default CFLAGS of -g -O3 with gcc when original CFLAGS\n          were empty.\n\n4.04 Wed Feb 16 09:01:51 CET 2011\n\t- fix two problems in the native win32 backend, where reuse of fd's\n          with different underlying handles caused handles not to be removed\n          or added to the select set (analyzed and tested by Bert Belder).\n\t- do no rely on ceil() in ev_e?poll.c.\n        - backport libev to HP-UX versions before 11 v3.\n        - configure did not detect nanosleep and clock_gettime properly when\n          they are available in the libc (as opposed to -lrt).\n\n4.03 Tue Jan 11 14:37:25 CET 2011\n\t- officially support polling files with all backends.\n\t- support files, /dev/zero etc. the same way as select in the epoll\n          backend, by generating events on our own.\n        - ports backend: work around solaris bug 6874410 and many related ones\n          (EINTR, maybe more), with no performance loss (note that the solaris\n          bug report is actually wrong, reality is far more bizarre and broken\n          than that).\n\t- define EV_READ/EV_WRITE as macros in event.h, as some programs use\n          #ifdef to test for them.\n        - new (experimental) function: ev_feed_signal.\n        - new (to become default) EVFLAG_NOSIGMASK flag.\n        - new EVBACKEND_MASK symbol.\n        - updated COMMON IDIOMS SECTION.\n\n4.01 Fri Nov  5 21:51:29 CET 2010\n        - automake fucked it up, apparently, --add-missing -f is not quite enough\n          to make it update its files, so 4.00 didn't install ev++.h and\n          event.h on make install. grrr.\n        - ev_loop(count|depth) didn't return anything (Robin Haberkorn).\n        - change EV_UNDEF to 0xffffffff to silence some overzealous compilers.\n        - use \"(libev) \" prefix for all libev error messages now.\n\n4.00 Mon Oct 25 12:32:12 CEST 2010\n\t- \"PORTING FROM LIBEV 3.X TO 4.X\" (in ev.pod) is recommended reading.\n\t- ev_embed_stop did not correctly stop the watcher (very good\n          testcase by Vladimir Timofeev).\n        - ev_run will now always update the current loop time - it erroneously\n          didn't when idle watchers were active, causing timers not to fire.\n        - fix a bug where a timeout of zero caused the timer not to fire\n          in the libevent emulation (testcase by Péter Szabó).\n\t- applied win32 fixes by Michael Lenaghan (also James Mansion).\n\t- replace EV_MINIMAL by EV_FEATURES.\n        - prefer EPOLL_CTL_ADD over EPOLL_CTL_MOD in some more cases, as it\n          seems the former is *much* faster than the latter.\n        - linux kernel version detection (for inotify bug workarounds)\n          did not work properly.\n        - reduce the number of spurious wake-ups with the ports backend.\n        - remove dependency on sys/queue.h on freebsd (patch by Vanilla Hsu).\n        - do async init within ev_async_start, not ev_async_set, which avoids\n          an API quirk where the set function must be called in the C++ API\n          even when there is nothing to set.\n        - add (undocumented) EV_ENABLE when adding events with kqueue,\n          this might help with OS X, which seems to need it despite documenting\n          not to need it (helpfully pointed out by Tilghman Lesher).\n        - do not use poll by default on freebsd, it's broken (what isn't\n          on freebsd...).\n        - allow to embed epoll on kernels >= 2.6.32.\n        - configure now prepends -O3, not appends it, so one can still\n          override it.\n        - ev.pod: greatly expanded the portability section, added a porting\n          section, a description of watcher states and made lots of minor fixes.\n        - disable poll backend on AIX, the poll header spams the namespace\n          and it's not worth working around dead platforms (reported\n          and analyzed by Aivars Kalvans).\n        - improve header file compatibility of the standalone eventfd code\n          in an obscure case.\n        - implement EV_AVOID_STDIO option.\n        - do not use sscanf to parse linux version number (smaller, faster,\n          no sscanf dependency).\n        - new EV_CHILD_ENABLE and EV_SIGNAL_ENABLE configurable settings.\n        - update libev.m4 HAVE_CLOCK_SYSCALL test for newer glibcs.\n        - add section on accept() problems to the manpage.\n        - rename EV_TIMEOUT to EV_TIMER.\n        - rename ev_loop_count/depth/verify/loop/unloop.\n        - remove ev_default_destroy and ev_default_fork.\n        - switch to two-digit minor version.\n        - work around an apparent gentoo compiler bug.\n        - define _DARWIN_UNLIMITED_SELECT. just so.\n        - use enum instead of #define for most constants.\n        - improve compatibility to older C++ compilers.\n        - (experimental) ev_run/ev_default_loop/ev_break/ev_loop_new have now\n          default arguments when compiled as C++.\n        - enable automake dependency tracking.\n        - ev_loop_new no longer leaks memory when loop creation failed.\n        - new ev_cleanup watcher type.\n\n3.9  Thu Dec 31 07:59:59 CET 2009\n\t- signalfd is no longer used by default and has to be requested\n          explicitly - this means that easy to catch bugs become hard to\n          catch race conditions, but the users have spoken.\n        - point out the unspecified signal mask in the documentation, and\n          that this is a race condition regardless of EV_SIGNALFD.\n\t- backport inotify code to C89.\n        - inotify file descriptors could leak into child processes.\n        - ev_stat watchers could keep an erroneous extra ref on the loop,\n          preventing exit when unregistering all watchers (testcases\n          provided by ry@tinyclouds.org).\n        - implement EV_WIN32_HANDLE_TO_FD and EV_WIN32_CLOSE_FD configuration\n          symbols to make it easier for apps to do their own fd management.\n        - support EV_IDLE_ENABLE being disabled in ev++.h\n          (patch by Didier Spezia).\n        - take advantage of inotify_init1, if available, to set cloexec/nonblock\n          on fd creation, to avoid races.\n        - the signal handling pipe wasn't always initialised under windows\n          (analysed by lekma).\n        - changed minimum glibc requirement from glibc 2.9 to 2.7, for\n          signalfd.\n        - add missing string.h include (Denis F. Latypoff).\n        - only replace ev_stat.prev when we detect an actual difference,\n          so prev is (almost) always different to attr. this might\n          have caused the problems with 04_stat.t.\n        - add ev::timer->remaining () method to C++ API.\n\n3.8  Sun Aug  9 14:30:45 CEST 2009\n\t- incompatible change: do not necessarily reset signal handler\n          to SIG_DFL when a sighandler is stopped.\n        - ev_default_destroy did not properly free or zero some members,\n          potentially causing crashes and memory corruption on repeated\n          ev_default_destroy/ev_default_loop calls.\n\t- take advantage of signalfd on GNU/Linux systems.\n\t- document that the signal mask might be in an unspecified\n          state when using libev's signal handling.\n        - take advantage of some GNU/Linux calls to set cloexec/nonblock\n          on fd creation, to avoid race conditions.\n\n3.7  Fri Jul 17 16:36:32 CEST 2009\n\t- ev_unloop and ev_loop wrongly used a global variable to exit loops,\n          instead of using a per-loop variable (bug caught by accident...).\n\t- the ev_set_io_collect_interval interpretation has changed.\n        - add new functionality: ev_set_userdata, ev_userdata,\n          ev_set_invoke_pending_cb, ev_set_loop_release_cb,\n          ev_invoke_pending, ev_pending_count, together with a long example\n          about thread locking.\n        - add ev_timer_remaining (as requested by Denis F. Latypoff).\n        - add ev_loop_depth.\n        - calling ev_unloop in fork/prepare watchers will no longer poll\n          for new events.\n\t- Denis F. Latypoff corrected many typos in example code snippets.\n        - honor autoconf detection of EV_USE_CLOCK_SYSCALL, also double-\n          check that the syscall number is available before trying to\n          use it (reported by ry@tinyclouds).\n        - use GetSystemTimeAsFileTime instead of _timeb on windows, for\n          slightly higher accuracy.\n        - properly declare ev_loop_verify and ev_now_update even when\n          !EV_MULTIPLICITY.\n        - do not compile in any priority code when EV_MAXPRI == EV_MINPRI.\n        - support EV_MINIMAL==2 for a reduced API.\n        - actually 0-initialise struct sigaction when installing signals.\n        - add section on hibernate and stopped processes to ev_timer docs.\n\n3.6  Tue Apr 28 02:49:30 CEST 2009\n\t- multiple timers becoming ready within an event loop iteration\n          will be invoked in the \"correct\" order now.\n\t- do not leave the event loop early just because we have no active\n          watchers, fixing a problem when embedding a kqueue loop\n          that has active kernel events but no registered watchers\n          (reported by blacksand blacksand).\n\t- correctly zero the idx values for arrays, so destroying and\n          reinitialising the default loop actually works (patch by\n          Malek Hadj-Ali).\n        - implement ev_suspend and ev_resume.\n        - new EV_CUSTOM revents flag for use by applications.\n        - add documentation section about priorities.\n        - add a glossary to the documentation.\n        - extend the ev_fork description slightly.\n        - optimize a jump out of call_pending.\n\n3.53 Sun Feb 15 02:38:20 CET 2009\n\t- fix a bug in event pipe creation on win32 that would cause a\n          failed assertion on event loop creation (patch by Malek Hadj-Ali).\n\t- probe for CLOCK_REALTIME support at runtime as well and fall\n          back to gettimeofday if there is an error, to support older\n          operating systems with newer header files/libraries.\n        - prefer gettimeofday over clock_gettime with USE_CLOCK_SYSCALL\n          (default most everywhere), otherwise not.\n\n3.52 Wed Jan  7 21:43:02 CET 2009\n\t- fix compilation of select backend in fd_set mode when NFDBITS is\n          missing (to get it to compile on QNX, reported by Rodrigo Campos).\n        - better select-nfds handling when select backend is in fd_set mode.\n        - diagnose fd_set overruns when select backend is in fd_set mode.\n        - due to a thinko, instead of disabling everything but\n          select on the borked OS X platform, everything but select was\n          allowed (reported by Emanuele Giaquinta).\n        - actually verify that local and remote port are matching in\n          libev's socketpair emulation, which makes denial-of-service\n          attacks harder (but not impossible - it's windows). Make sure\n          it even works under vista, which thinks that getpeer/sockname\n          should return fantasy port numbers.\n        - include \"libev\" in all assertion messages for potentially\n          clearer diagnostics.\n        - event_get_version (libevent compatibility) returned\n          a useless string instead of the expected version string\n          (patch by W.C.A. Wijngaards).\n\n3.51 Wed Dec 24 23:00:11 CET 2008\n        - fix a bug where an inotify watcher was added twice, causing\n          freezes on hash collisions (reported and analysed by Graham Leggett).\n\t- new config symbol, EV_USE_CLOCK_SYSCALL, to make libev use\n          a direct syscall - slower, but no dependency on librt et al.\n        - assume negative return values != -1 signals success of port_getn\n          (http://cvs.epicsol.org/cgi/viewcvs.cgi/epic5/source/newio.c?rev=1.52)\n          (no known failure reports, but it doesn't hurt).\n        - fork detection in ev_embed now stops and restarts the watcher\n          automatically.\n        - EXPERIMENTAL: default the method to operator () in ev++.h,\n          to make it nicer to use functors (requested by Benedek László).\n        - fixed const object callbacks in ev++.h.\n        - replaced loop_ref argument of watcher.set (loop) by a direct\n          ev_loop * in ev++.h, to avoid clashes with functor patch.\n        - do not try to watch the empty string via inotify.\n        - inotify watchers could be leaked under certain circumstances.\n        - OS X 10.5 is actually even more broken than earlier versions,\n          so fall back to select on that piece of garbage.\n        - fixed some weirdness in the ev_embed documentation.\n\n3.49 Wed Nov 19 11:26:53 CET 2008\n\t- ev_stat watchers will now use inotify as a mere hint on\n          kernels <2.6.25, or if the filesystem is not in the\n          \"known to be good\" list.\n        - better mingw32 compatibility (it's not as borked as native win32)\n          (analysed by Roger Pack).\n        - include stdio.h in the example program, as too many people are\n          confused by the weird C language otherwise. I guess the next thing\n          I get told is that the \"...\" ellipses in the examples don't compile\n          with their C compiler.\n\n3.48 Thu Oct 30 09:02:37 CET 2008\n\t- further optimise away the EPOLL_CTL_ADD/MOD combo in the epoll\n          backend by assuming the kernel event mask hasn't changed if\n          ADD fails with EEXIST.\n        - work around spurious event notification bugs in epoll by using\n          a 32-bit generation counter. recreate kernel state if we receive\n          spurious notifications or unwanted events. this is very costly,\n          but I didn't come up with this horrible design.\n        - use memset to initialise most arrays now and do away with the\n          init functions.\n        - expand time-out strategies into a \"Be smart about timeouts\" section.\n        - drop the \"struct\" from all ev_watcher declarations in the\n          documentation and did other clarifications (yeah, it was a mistake\n          to have a struct AND a function called ev_loop).\n\t- fix a bug where ev_default would not initialise the default\n          loop again after it was destroyed with ev_default_destroy.\n        - rename syserr to ev_syserr to avoid name clashes when embedding,\n          do similar changes for event.c.\n\n3.45 Tue Oct 21 21:59:26 CEST 2008\n\t- disable inotify usage on linux <2.6.25, as it is broken\n          (reported by Yoann Vandoorselaere).\n        - ev_stat erroneously would try to add inotify watchers\n          even when inotify wasn't available (this should only\n          have a performance impact).\n\t- ev_once now passes both timeout and io to the callback if both\n          occur concurrently, instead of giving timeouts precedence.\n\t- disable EV_USE_INOTIFY when sys/inotify.h is too old.\n\n3.44 Mon Sep 29 05:18:39 CEST 2008\n\t- embed watchers now automatically invoke ev_loop_fork on the\n          embedded loop when the parent loop forks.\n\t- new function: ev_now_update (loop).\n\t- verify_watcher was not marked static.\n        - improve the \"associating...\" manpage section.\n        - documentation tweaks here and there.\n\n3.43 Sun Jul  6 05:34:41 CEST 2008\n\t- include more include files on windows to get struct _stati64\n          (reported by Chris Hulbert, but doesn't quite fix his issue).\n\t- add missing #include <io.h> in ev.c on windows (reported by\n          Matt Tolton).\n\n3.42 Tue Jun 17 12:12:07 CEST 2008\n\t- work around yet another windows bug: FD_SET actually adds fd's\n          multiple times to the fd_*SET*, despite official MSN docs claiming\n          otherwise. Reported and well-analysed by Matt Tolton.\n\t- define NFDBITS to 0 when EV_SELECT_IS_WINSOCKET to make it compile\n          (reported any analysed by Chris Hulbert).\n        - fix a bug in ev_ebadf (this function is only used to catch\n          programming errors in the libev user). reported by Matt Tolton.\n        - fix a bug in fd_intern on win32 (could lead to compile errors\n          under some circumstances, but would work correctly if it compiles).\n          reported by Matt Tolton.\n        - (try to) work around missing lstat on windows.\n\t- pass in the write fd set as except fd set under windows. windows\n          is so uncontrollably lame that it requires this. this means that\n          switching off oobinline is not supported (but tcp/ip doesn't\n          have oob, so that would be stupid anyways.\n        - use posix module symbol to auto-detect monotonic clock presence\n          and some other default values.\n\n3.41 Fri May 23 18:42:54 CEST 2008\n\t- work around an obscure bug in winsocket select: if you\n          provide only empty fd sets then select returns WSAEINVAL. how sucky.\n        - improve timer scheduling stability and reduce use of time_epsilon.\n        - use 1-based 2-heap for EV_MINIMAL, simplifies code, reduces\n          codesize and makes for better cache-efficiency.\n        - use 3-based 4-heap for !EV_MINIMAL. this makes better use\n          of cpu cache lines and gives better growth behaviour than\n          2-based heaps.\n        - cache timestamp within heap for !EV_MINIMAL, to avoid random\n          memory accesses.\n        - document/add EV_USE_4HEAP and EV_HEAP_CACHE_AT.\n        - fix a potential aliasing issue in ev_timer_again.\n        - add/document ev_periodic_at, retract direct access to ->at.\n        - improve ev_stat docs.\n        - add portability requirements section.\n\t- fix manpage headers etc.\n        - normalise WSA error codes to lower range on windows.\n        - add consistency check code that can be called automatically\n          or on demand to check for internal structures (ev_loop_verify).\n\n3.31 Wed Apr 16 20:45:04 CEST 2008\n\t- added last minute fix for ev_poll.c by Brandon Black.\n\n3.3  Wed Apr 16 19:04:10 CEST 2008\n        - event_base_loopexit should return 0 on success\n          (W.C.A. Wijngaards).\n\t- added linux eventfd support.\n        - try to autodetect epoll and inotify support\n          by libc header version if not using autoconf.\n        - new symbols: EV_DEFAULT_UC and EV_DEFAULT_UC_.\n        - declare functions defined in ev.h as inline if\n          C99 or gcc are available.\n        - enable inlining with gcc versions 2 and 3.\n        - work around broken poll implementations potentially\n          not clearing revents field in ev_poll (Brandon Black)\n          (no such systems are known at this time).\n        - work around a bug in realloc on openbsd and darwin,\n          also makes the erroneous valgrind complaints\n          go away (noted by various people).\n        - fix ev_async_pending, add c++ wrapper for ev_async\n          (based on patch sent by Johannes Deisenhofer).\n        - add sensible set method to ev::embed.\n        - made integer constants type int in ev.h.\n\n3.2  Wed Apr  2 17:11:19 CEST 2008\n\t- fix a 64 bit overflow issue in the select backend,\n          by using fd_mask instead of int for the mask.\n        - rename internal sighandler to avoid clash with very old perls.\n        - entering ev_loop will not clear the ONESHOT or NONBLOCKING\n          flags of any outer loops anymore.\n        - add ev_async_pending.\n\n3.1  Thu Mar 13 13:45:22 CET 2008\n\t- implement ev_async watchers.\n        - only initialise signal pipe on demand.\n\t- make use of sig_atomic_t configurable.\n        - improved documentation.\n\n3.0  Mon Jan 28 13:14:47 CET 2008\n\t- API/ABI bump to version 3.0.\n\t- ev++.h includes \"ev.h\" by default now, not <ev.h>.\n\t- slightly improved documentation.\n\t- speed up signal detection after a fork.\n        - only optionally return trace status changed in ev_child\n          watchers.\n        - experimental (and undocumented) loop wrappers for ev++.h.\n\n2.01 Tue Dec 25 08:04:41 CET 2007\n\t- separate Changes file.\n\t- fix ev_path_set => ev_stat_set typo.\n        - remove event_compat.h from the libev tarball.\n        - change how include files are found.\n        - doc updates.\n        - update licenses, explicitly allow for GPL relicensing.\n\n2.0  Sat Dec 22 17:47:03 CET 2007\n        - new ev_sleep, ev_set_(io|timeout)_collect_interval.\n        - removed epoll from embeddable fd set.\n        - fix embed watchers.\n\t- renamed ev_embed.loop to other.\n\t- added exported Symbol tables.\n        - undefine member wrapper macros at the end of ev.c.\n        - respect EV_H in ev++.h.\n\n1.86 Tue Dec 18 02:36:57 CET 2007\n\t- fix memleak on loop destroy (not relevant for perl).\n\n1.85 Fri Dec 14 20:32:40 CET 2007\n        - fix some aliasing issues w.r.t. timers and periodics\n          (not relevant for perl).\n\n(for historic versions refer to EV/Changes, found in the Perl interface)\n\n0.1  Wed Oct 31 21:31:48 CET 2007\n\t- original version; hacked together in <24h.\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/Makefile.am",
    "content": "AUTOMAKE_OPTIONS = foreign\n\nVERSION_INFO = 4:0:0\n\nEXTRA_DIST = LICENSE Changes libev.m4 autogen.sh \\\n\t     ev_vars.h ev_wrap.h \\\n\t     ev_epoll.c ev_select.c ev_poll.c ev_kqueue.c ev_port.c ev_win32.c \\\n\t     ev.3 ev.pod Symbols.ev Symbols.event\n\nnoinst_MANS = ev.3\n\nnoinst_HEADERS = ev.h ev++.h event.h\n\nnoinst_LTLIBRARIES = libev.la\n\nlibev_la_SOURCES = ev.c event.c\nlibev_la_LDFLAGS = -version-info $(VERSION_INFO)\n\nev.3: ev.pod\n\tpod2man -n LIBEV -r \"libev-$(VERSION)\" -c \"libev - high performance full featured event loop\" -s3 <$< >$@\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/Makefile.in",
    "content": "# Makefile.in generated by automake 1.15 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2014 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\n\nVPATH = @srcdir@\nam__is_gnu_make = { \\\n  if test -z '$(MAKELEVEL)'; then \\\n    false; \\\n  elif test -n '$(MAKE_HOST)'; then \\\n    true; \\\n  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \\\n    true; \\\n  else \\\n    false; \\\n  fi; \\\n}\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\nsubdir = libev\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \\\n\t$(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/inet_ntop.m4 \\\n\t$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \\\n\t$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \\\n\t$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/mbedtls.m4 \\\n\t$(top_srcdir)/m4/openssl.m4 $(top_srcdir)/m4/pcre.m4 \\\n\t$(top_srcdir)/m4/polarssl.m4 \\\n\t$(top_srcdir)/m4/stack-protector.m4 $(top_srcdir)/m4/zlib.m4 \\\n\t$(top_srcdir)/libev/libev.m4 $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nDIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \\\n\t$(am__DIST_COMMON)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nLTLIBRARIES = $(noinst_LTLIBRARIES)\nlibev_la_LIBADD =\nam_libev_la_OBJECTS = ev.lo event.lo\nlibev_la_OBJECTS = $(am_libev_la_OBJECTS)\nAM_V_lt = $(am__v_lt_@AM_V@)\nam__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)\nam__v_lt_0 = --silent\nam__v_lt_1 = \nlibev_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \\\n\t$(libev_la_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nDEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)\ndepcomp = $(SHELL) $(top_srcdir)/auto/depcomp\nam__depfiles_maybe = depfiles\nam__mv = mv -f\nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nLTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \\\n\t$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \\\n\t$(AM_CFLAGS) $(CFLAGS)\nAM_V_CC = $(am__v_CC_@AM_V@)\nam__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)\nam__v_CC_0 = @echo \"  CC      \" $@;\nam__v_CC_1 = \nCCLD = $(CC)\nLINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \\\n\t$(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_CCLD = $(am__v_CCLD_@AM_V@)\nam__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)\nam__v_CCLD_0 = @echo \"  CCLD    \" $@;\nam__v_CCLD_1 = \nSOURCES = $(libev_la_SOURCES)\nDIST_SOURCES = $(libev_la_SOURCES)\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nHEADERS = $(noinst_HEADERS)\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nam__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/auto/depcomp \\\n\tREADME\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAR = @AR@\nASCIIDOC = @ASCIIDOC@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDLLTOOL = @DLLTOOL@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nGZIP = @GZIP@\nINET_NTOP_LIB = @INET_NTOP_LIB@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBPCRE = @LIBPCRE@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMANIFEST_TOOL = @MANIFEST_TOOL@\nMKDIR_P = @MKDIR_P@\nMV = @MV@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nPCRE_CONFIG = @PCRE_CONFIG@\nPTHREAD_CC = @PTHREAD_CC@\nPTHREAD_CFLAGS = @PTHREAD_CFLAGS@\nPTHREAD_LIBS = @PTHREAD_LIBS@\nRANLIB = @RANLIB@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nXMLTO = @XMLTO@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_AR = @ac_ct_AR@\nac_ct_CC = @ac_ct_CC@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nax_pthread_config = @ax_pthread_config@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npcre_pcreh = @pcre_pcreh@\npcreh = @pcreh@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nrunstatedir = @runstatedir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsubdirs = @subdirs@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nAUTOMAKE_OPTIONS = foreign\nVERSION_INFO = 4:0:0\nEXTRA_DIST = LICENSE Changes libev.m4 autogen.sh \\\n\t     ev_vars.h ev_wrap.h \\\n\t     ev_epoll.c ev_select.c ev_poll.c ev_kqueue.c ev_port.c ev_win32.c \\\n\t     ev.3 ev.pod Symbols.ev Symbols.event\n\nnoinst_MANS = ev.3\nnoinst_HEADERS = ev.h ev++.h event.h\nnoinst_LTLIBRARIES = libev.la\nlibev_la_SOURCES = ev.c event.c\nlibev_la_LDFLAGS = -version-info $(VERSION_INFO)\nall: all-am\n\n.SUFFIXES:\n.SUFFIXES: .c .lo .o .obj\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libev/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign libev/Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nclean-noinstLTLIBRARIES:\n\t-test -z \"$(noinst_LTLIBRARIES)\" || rm -f $(noinst_LTLIBRARIES)\n\t@list='$(noinst_LTLIBRARIES)'; \\\n\tlocs=`for p in $$list; do echo $$p; done | \\\n\t      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \\\n\t      sort -u`; \\\n\ttest -z \"$$locs\" || { \\\n\t  echo rm -f $${locs}; \\\n\t  rm -f $${locs}; \\\n\t}\n\nlibev.la: $(libev_la_OBJECTS) $(libev_la_DEPENDENCIES) $(EXTRA_libev_la_DEPENDENCIES) \n\t$(AM_V_CCLD)$(libev_la_LINK)  $(libev_la_OBJECTS) $(libev_la_LIBADD) $(LIBS)\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ev.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/event.Plo@am__quote@\n\n.c.o:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.o$$||'`;\\\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<\n\n.c.obj:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.obj$$||'`;\\\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\n.c.lo:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.lo$$||'`;\\\n@am__fastdepCC_TRUE@\t$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-am\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-am\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscopelist: cscopelist-am\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(LTLIBRARIES) $(HEADERS)\ninstalldirs:\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \\\n\tmostlyclean-am\n\ndistclean: distclean-am\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic \\\n\tmostlyclean-libtool\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am:\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \\\n\tclean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \\\n\tctags-am distclean distclean-compile distclean-generic \\\n\tdistclean-libtool distclean-tags distdir dvi dvi-am html \\\n\thtml-am info info-am install install-am install-data \\\n\tinstall-data-am install-dvi install-dvi-am install-exec \\\n\tinstall-exec-am install-html install-html-am install-info \\\n\tinstall-info-am install-man install-pdf install-pdf-am \\\n\tinstall-ps install-ps-am install-strip installcheck \\\n\tinstallcheck-am installdirs maintainer-clean \\\n\tmaintainer-clean-generic mostlyclean mostlyclean-compile \\\n\tmostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \\\n\ttags tags-am uninstall uninstall-am\n\n.PRECIOUS: Makefile\n\n\nev.3: ev.pod\n\tpod2man -n LIBEV -r \"libev-$(VERSION)\" -c \"libev - high performance full featured event loop\" -s3 <$< >$@\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/README",
    "content": "libev is a high-performance event loop/event model with lots of features.\n(see benchmark at http://libev.schmorp.de/bench.html)\n\n\nABOUT\n\n   Homepage: http://software.schmorp.de/pkg/libev\n   Mailinglist: libev@lists.schmorp.de\n                http://lists.schmorp.de/cgi-bin/mailman/listinfo/libev\n   Library Documentation: http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod\n\n   Libev is modelled (very losely) after libevent and the Event perl\n   module, but is faster, scales better and is more correct, and also more\n   featureful. And also smaller. Yay.\n\n   Some of the specialties of libev not commonly found elsewhere are:\n   \n   - extensive and detailed, readable documentation (not doxygen garbage).\n   - fully supports fork, can detect fork in various ways and automatically\n     re-arms kernel mechanisms that do not support fork.\n   - highly optimised select, poll, epoll, kqueue and event ports backends.\n   - filesystem object (path) watching (with optional linux inotify support).\n   - wallclock-based times (using absolute time, cron-like).\n   - relative timers/timeouts (handle time jumps).\n   - fast intra-thread communication between multiple\n     event loops (with optional fast linux eventfd backend).\n   - extremely easy to embed (fully documented, no dependencies,\n     autoconf supported but optional).\n   - very small codebase, no bloated library, simple code.\n   - fully extensible by being able to plug into the event loop,\n     integrate other event loops, integrate other event loop users.\n   - very little memory use (small watchers, small event loop data).\n   - optional C++ interface allowing method and function callbacks\n     at no extra memory or runtime overhead.\n   - optional Perl interface with similar characteristics (capable\n     of running Glib/Gtk2 on libev).\n   - support for other languages (multiple C++ interfaces, D, Ruby,\n     Python) available from third-parties.\n\n   Examples of programs that embed libev: the EV perl module, node.js,\n   auditd, rxvt-unicode, gvpe (GNU Virtual Private Ethernet), the\n   Deliantra MMORPG server (http://www.deliantra.net/), Rubinius (a\n   next-generation Ruby VM), the Ebb web server, the Rev event toolkit.\n\n\nCONTRIBUTORS\n\n   libev was written and designed by Marc Lehmann and Emanuele Giaquinta.\n\n   The following people sent in patches or made other noteworthy\n   contributions to the design (for minor patches, see the Changes\n   file. If I forgot to include you, please shout at me, it was an\n   accident):\n\n   W.C.A. Wijngaards\n   Christopher Layne\n   Chris Brody\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/Symbols.ev",
    "content": "ev_async_send\nev_async_start\nev_async_stop\nev_backend\nev_break\nev_check_start\nev_check_stop\nev_child_start\nev_child_stop\nev_cleanup_start\nev_cleanup_stop\nev_clear_pending\nev_default_loop\nev_default_loop_ptr\nev_depth\nev_embed_start\nev_embed_stop\nev_embed_sweep\nev_embeddable_backends\nev_feed_event\nev_feed_fd_event\nev_feed_signal\nev_feed_signal_event\nev_fork_start\nev_fork_stop\nev_idle_start\nev_idle_stop\nev_invoke\nev_invoke_pending\nev_io_start\nev_io_stop\nev_iteration\nev_loop_destroy\nev_loop_fork\nev_loop_new\nev_now\nev_now_update\nev_once\nev_pending_count\nev_periodic_again\nev_periodic_start\nev_periodic_stop\nev_prepare_start\nev_prepare_stop\nev_recommended_backends\nev_ref\nev_resume\nev_run\nev_set_allocator\nev_set_invoke_pending_cb\nev_set_io_collect_interval\nev_set_loop_release_cb\nev_set_syserr_cb\nev_set_timeout_collect_interval\nev_set_userdata\nev_signal_start\nev_signal_stop\nev_sleep\nev_stat_start\nev_stat_stat\nev_stat_stop\nev_supported_backends\nev_suspend\nev_time\nev_timer_again\nev_timer_remaining\nev_timer_start\nev_timer_stop\nev_unref\nev_userdata\nev_verify\nev_version_major\nev_version_minor\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/Symbols.event",
    "content": "event_active\nevent_add\nevent_base_dispatch\nevent_base_free\nevent_base_get_method\nevent_base_loop\nevent_base_loopexit\nevent_base_new\nevent_base_once\nevent_base_priority_init\nevent_base_set\nevent_del\nevent_dispatch\nevent_get_callback\nevent_get_method\nevent_get_version\nevent_init\nevent_loop\nevent_loopexit\nevent_once\nevent_pending\nevent_priority_init\nevent_priority_set\nevent_set\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/aclocal.m4",
    "content": "# generated automatically by aclocal 1.14.1 -*- Autoconf -*-\n\n# Copyright (C) 1996-2013 Free Software Foundation, Inc.\n\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\nm4_ifndef([AC_CONFIG_MACRO_DIRS], [m4_defun([_AM_CONFIG_MACRO_DIRS], [])m4_defun([AC_CONFIG_MACRO_DIRS], [_AM_CONFIG_MACRO_DIRS($@)])])\nm4_ifndef([AC_AUTOCONF_VERSION],\n  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl\nm4_if(m4_defn([AC_AUTOCONF_VERSION]), [2.69],,\n[m4_warning([this file was generated for autoconf 2.69.\nYou have another version of autoconf.  It may work, but is not guaranteed to.\nIf you have problems, you may need to regenerate the build system entirely.\nTo do so, use the procedure documented by the package, typically 'autoreconf'.])])\n\n# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-\n#\n#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,\n#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software\n#                 Foundation, Inc.\n#   Written by Gordon Matzigkeit, 1996\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\nm4_define([_LT_COPYING], [dnl\n#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,\n#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software\n#                 Foundation, Inc.\n#   Written by Gordon Matzigkeit, 1996\n#\n#   This file is part of GNU Libtool.\n#\n# GNU Libtool is free software; you can redistribute it and/or\n# modify it under the terms of the GNU General Public License as\n# published by the Free Software Foundation; either version 2 of\n# the License, or (at your option) any later version.\n#\n# As a special exception to the GNU General Public License,\n# if you distribute this file as part of a program or library that\n# is built using GNU Libtool, you may include this file under the\n# same distribution terms that you use for the rest of that program.\n#\n# GNU Libtool is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with GNU Libtool; see the file COPYING.  If not, a copy\n# can be downloaded from http://www.gnu.org/licenses/gpl.html, or\n# obtained by writing to the Free Software Foundation, Inc.,\n# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n])\n\n# serial 57 LT_INIT\n\n\n# LT_PREREQ(VERSION)\n# ------------------\n# Complain and exit if this libtool version is less that VERSION.\nm4_defun([LT_PREREQ],\n[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,\n       [m4_default([$3],\n\t\t   [m4_fatal([Libtool version $1 or higher is required],\n\t\t             63)])],\n       [$2])])\n\n\n# _LT_CHECK_BUILDDIR\n# ------------------\n# Complain if the absolute build directory name contains unusual characters\nm4_defun([_LT_CHECK_BUILDDIR],\n[case `pwd` in\n  *\\ * | *\\\t*)\n    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;\nesac\n])\n\n\n# LT_INIT([OPTIONS])\n# ------------------\nAC_DEFUN([LT_INIT],\n[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT\nAC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl\nAC_BEFORE([$0], [LT_LANG])dnl\nAC_BEFORE([$0], [LT_OUTPUT])dnl\nAC_BEFORE([$0], [LTDL_INIT])dnl\nm4_require([_LT_CHECK_BUILDDIR])dnl\n\ndnl Autoconf doesn't catch unexpanded LT_ macros by default:\nm4_pattern_forbid([^_?LT_[A-Z_]+$])dnl\nm4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl\ndnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4\ndnl unless we require an AC_DEFUNed macro:\nAC_REQUIRE([LTOPTIONS_VERSION])dnl\nAC_REQUIRE([LTSUGAR_VERSION])dnl\nAC_REQUIRE([LTVERSION_VERSION])dnl\nAC_REQUIRE([LTOBSOLETE_VERSION])dnl\nm4_require([_LT_PROG_LTMAIN])dnl\n\n_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])\n\ndnl Parse OPTIONS\n_LT_SET_OPTIONS([$0], [$1])\n\n# This can be used to rebuild libtool when needed\nLIBTOOL_DEPS=\"$ltmain\"\n\n# Always use our own libtool.\nLIBTOOL='$(SHELL) $(top_builddir)/libtool'\nAC_SUBST(LIBTOOL)dnl\n\n_LT_SETUP\n\n# Only expand once:\nm4_define([LT_INIT])\n])# LT_INIT\n\n# Old names:\nAU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])\nAU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_PROG_LIBTOOL], [])\ndnl AC_DEFUN([AM_PROG_LIBTOOL], [])\n\n\n# _LT_CC_BASENAME(CC)\n# -------------------\n# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.\nm4_defun([_LT_CC_BASENAME],\n[for cc_temp in $1\"\"; do\n  case $cc_temp in\n    compile | *[[\\\\/]]compile | ccache | *[[\\\\/]]ccache ) ;;\n    distcc | *[[\\\\/]]distcc | purify | *[[\\\\/]]purify ) ;;\n    \\-*) ;;\n    *) break;;\n  esac\ndone\ncc_basename=`$ECHO \"$cc_temp\" | $SED \"s%.*/%%; s%^$host_alias-%%\"`\n])\n\n\n# _LT_FILEUTILS_DEFAULTS\n# ----------------------\n# It is okay to use these file commands and assume they have been set\n# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.\nm4_defun([_LT_FILEUTILS_DEFAULTS],\n[: ${CP=\"cp -f\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n])# _LT_FILEUTILS_DEFAULTS\n\n\n# _LT_SETUP\n# ---------\nm4_defun([_LT_SETUP],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\nAC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl\nAC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl\n\n_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl\ndnl\n_LT_DECL([], [host_alias], [0], [The host system])dnl\n_LT_DECL([], [host], [0])dnl\n_LT_DECL([], [host_os], [0])dnl\ndnl\n_LT_DECL([], [build_alias], [0], [The build system])dnl\n_LT_DECL([], [build], [0])dnl\n_LT_DECL([], [build_os], [0])dnl\ndnl\nAC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([LT_PATH_LD])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\ndnl\nAC_REQUIRE([AC_PROG_LN_S])dnl\ntest -z \"$LN_S\" && LN_S=\"ln -s\"\n_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl\ndnl\nAC_REQUIRE([LT_CMD_MAX_LEN])dnl\n_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally \"o\")])dnl\n_LT_DECL([], [exeext], [0], [Executable file suffix (normally \"\")])dnl\ndnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_CHECK_SHELL_FEATURES])dnl\nm4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl\nm4_require([_LT_CMD_RELOAD])dnl\nm4_require([_LT_CHECK_MAGIC_METHOD])dnl\nm4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl\nm4_require([_LT_CMD_OLD_ARCHIVE])dnl\nm4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl\nm4_require([_LT_WITH_SYSROOT])dnl\n\n_LT_CONFIG_LIBTOOL_INIT([\n# See if we are running on zsh, and set the options which allow our\n# commands through without removal of \\ escapes INIT.\nif test -n \"\\${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n])\nif test -n \"${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n\n_LT_CHECK_OBJDIR\n\nm4_require([_LT_TAG_COMPILER])dnl\n\ncase $host_os in\naix3*)\n  # AIX sometimes has problems with the GCC collect2 program.  For some\n  # reason, if we set the COLLECT_NAMES environment variable, the problems\n  # vanish in a puff of smoke.\n  if test \"X${COLLECT_NAMES+set}\" != Xset; then\n    COLLECT_NAMES=\n    export COLLECT_NAMES\n  fi\n  ;;\nesac\n\n# Global variables:\nofile=libtool\ncan_build_shared=yes\n\n# All known linkers require a `.a' archive for static linking (except MSVC,\n# which needs '.lib').\nlibext=a\n\nwith_gnu_ld=\"$lt_cv_prog_gnu_ld\"\n\nold_CC=\"$CC\"\nold_CFLAGS=\"$CFLAGS\"\n\n# Set sane defaults for various variables\ntest -z \"$CC\" && CC=cc\ntest -z \"$LTCC\" && LTCC=$CC\ntest -z \"$LTCFLAGS\" && LTCFLAGS=$CFLAGS\ntest -z \"$LD\" && LD=ld\ntest -z \"$ac_objext\" && ac_objext=o\n\n_LT_CC_BASENAME([$compiler])\n\n# Only perform the check for file, if the check method requires it\ntest -z \"$MAGIC_CMD\" && MAGIC_CMD=file\ncase $deplibs_check_method in\nfile_magic*)\n  if test \"$file_magic_cmd\" = '$MAGIC_CMD'; then\n    _LT_PATH_MAGIC\n  fi\n  ;;\nesac\n\n# Use C for the default configuration in the libtool script\nLT_SUPPORTED_TAG([CC])\n_LT_LANG_C_CONFIG\n_LT_LANG_DEFAULT_CONFIG\n_LT_CONFIG_COMMANDS\n])# _LT_SETUP\n\n\n# _LT_PREPARE_SED_QUOTE_VARS\n# --------------------------\n# Define a few sed substitution that help us do robust quoting.\nm4_defun([_LT_PREPARE_SED_QUOTE_VARS],\n[# Backslashify metacharacters that are still active within\n# double-quoted strings.\nsed_quote_subst='s/\\([[\"`$\\\\]]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([[\"`\\\\]]\\)/\\\\\\1/g'\n\n# Sed substitution to delay expansion of an escaped shell variable in a\n# double_quote_subst'ed string.\ndelay_variable_subst='s/\\\\\\\\\\\\\\\\\\\\\\$/\\\\\\\\\\\\$/g'\n\n# Sed substitution to delay expansion of an escaped single quote.\ndelay_single_quote_subst='s/'\\''/'\\'\\\\\\\\\\\\\\'\\''/g'\n\n# Sed substitution to avoid accidental globbing in evaled expressions\nno_glob_subst='s/\\*/\\\\\\*/g'\n])\n\n# _LT_PROG_LTMAIN\n# ---------------\n# Note that this code is called both from `configure', and `config.status'\n# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,\n# `config.status' has no value for ac_aux_dir unless we are using Automake,\n# so we pass a copy along to make sure it has a sensible value anyway.\nm4_defun([_LT_PROG_LTMAIN],\n[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl\n_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])\nltmain=\"$ac_aux_dir/ltmain.sh\"\n])# _LT_PROG_LTMAIN\n\n\n\n# So that we can recreate a full libtool script including additional\n# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS\n# in macros and then make a single call at the end using the `libtool'\n# label.\n\n\n# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])\n# ----------------------------------------\n# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.\nm4_define([_LT_CONFIG_LIBTOOL_INIT],\n[m4_ifval([$1],\n          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],\n                     [$1\n])])])\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_INIT])\n\n\n# _LT_CONFIG_LIBTOOL([COMMANDS])\n# ------------------------------\n# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.\nm4_define([_LT_CONFIG_LIBTOOL],\n[m4_ifval([$1],\n          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],\n                     [$1\n])])])\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])\n\n\n# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])\n# -----------------------------------------------------\nm4_defun([_LT_CONFIG_SAVE_COMMANDS],\n[_LT_CONFIG_LIBTOOL([$1])\n_LT_CONFIG_LIBTOOL_INIT([$2])\n])\n\n\n# _LT_FORMAT_COMMENT([COMMENT])\n# -----------------------------\n# Add leading comment marks to the start of each line, and a trailing\n# full-stop to the whole comment if one is not present already.\nm4_define([_LT_FORMAT_COMMENT],\n[m4_ifval([$1], [\nm4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],\n              [['`$\\]], [\\\\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])\n)])\n\n\n\n\n\n# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])\n# -------------------------------------------------------------------\n# CONFIGNAME is the name given to the value in the libtool script.\n# VARNAME is the (base) name used in the configure script.\n# VALUE may be 0, 1 or 2 for a computed quote escaped value based on\n# VARNAME.  Any other value will be used directly.\nm4_define([_LT_DECL],\n[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],\n    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],\n\t[m4_ifval([$1], [$1], [$2])])\n    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])\n    m4_ifval([$4],\n\t[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])\n    lt_dict_add_subkey([lt_decl_dict], [$2],\n\t[tagged?], [m4_ifval([$5], [yes], [no])])])\n])\n\n\n# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])\n# --------------------------------------------------------\nm4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])\n\n\n# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])\n# ------------------------------------------------\nm4_define([lt_decl_tag_varnames],\n[_lt_decl_filter([tagged?], [yes], $@)])\n\n\n# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])\n# ---------------------------------------------------------\nm4_define([_lt_decl_filter],\n[m4_case([$#],\n  [0], [m4_fatal([$0: too few arguments: $#])],\n  [1], [m4_fatal([$0: too few arguments: $#: $1])],\n  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],\n  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],\n  [lt_dict_filter([lt_decl_dict], $@)])[]dnl\n])\n\n\n# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])\n# --------------------------------------------------\nm4_define([lt_decl_quote_varnames],\n[_lt_decl_filter([value], [1], $@)])\n\n\n# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])\n# ---------------------------------------------------\nm4_define([lt_decl_dquote_varnames],\n[_lt_decl_filter([value], [2], $@)])\n\n\n# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])\n# ---------------------------------------------------\nm4_define([lt_decl_varnames_tagged],\n[m4_assert([$# <= 2])dnl\n_$0(m4_quote(m4_default([$1], [[, ]])),\n    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),\n    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])\nm4_define([_lt_decl_varnames_tagged],\n[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])\n\n\n# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])\n# ------------------------------------------------\nm4_define([lt_decl_all_varnames],\n[_$0(m4_quote(m4_default([$1], [[, ]])),\n     m4_if([$2], [],\n\t   m4_quote(lt_decl_varnames),\n\tm4_quote(m4_shift($@))))[]dnl\n])\nm4_define([_lt_decl_all_varnames],\n[lt_join($@, lt_decl_varnames_tagged([$1],\n\t\t\tlt_decl_tag_varnames([[, ]], m4_shift($@))))dnl\n])\n\n\n# _LT_CONFIG_STATUS_DECLARE([VARNAME])\n# ------------------------------------\n# Quote a variable value, and forward it to `config.status' so that its\n# declaration there will have the same value as in `configure'.  VARNAME\n# must have a single quote delimited value for this to work.\nm4_define([_LT_CONFIG_STATUS_DECLARE],\n[$1='`$ECHO \"$][$1\" | $SED \"$delay_single_quote_subst\"`'])\n\n\n# _LT_CONFIG_STATUS_DECLARATIONS\n# ------------------------------\n# We delimit libtool config variables with single quotes, so when\n# we write them to config.status, we have to be sure to quote all\n# embedded single quotes properly.  In configure, this macro expands\n# each variable declared with _LT_DECL (and _LT_TAGDECL) into:\n#\n#    <var>='`$ECHO \"$<var>\" | $SED \"$delay_single_quote_subst\"`'\nm4_defun([_LT_CONFIG_STATUS_DECLARATIONS],\n[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),\n    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])\n\n\n# _LT_LIBTOOL_TAGS\n# ----------------\n# Output comment and list of tags supported by the script\nm4_defun([_LT_LIBTOOL_TAGS],\n[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl\navailable_tags=\"_LT_TAGS\"dnl\n])\n\n\n# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])\n# -----------------------------------\n# Extract the dictionary values for VARNAME (optionally with TAG) and\n# expand to a commented shell variable setting:\n#\n#    # Some comment about what VAR is for.\n#    visible_name=$lt_internal_name\nm4_define([_LT_LIBTOOL_DECLARE],\n[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],\n\t\t\t\t\t   [description])))[]dnl\nm4_pushdef([_libtool_name],\n    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl\nm4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),\n    [0], [_libtool_name=[$]$1],\n    [1], [_libtool_name=$lt_[]$1],\n    [2], [_libtool_name=$lt_[]$1],\n    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl\nm4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl\n])\n\n\n# _LT_LIBTOOL_CONFIG_VARS\n# -----------------------\n# Produce commented declarations of non-tagged libtool config variables\n# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'\n# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG\n# section) are produced by _LT_LIBTOOL_TAG_VARS.\nm4_defun([_LT_LIBTOOL_CONFIG_VARS],\n[m4_foreach([_lt_var],\n    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),\n    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])\n\n\n# _LT_LIBTOOL_TAG_VARS(TAG)\n# -------------------------\nm4_define([_LT_LIBTOOL_TAG_VARS],\n[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),\n    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])\n\n\n# _LT_TAGVAR(VARNAME, [TAGNAME])\n# ------------------------------\nm4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])\n\n\n# _LT_CONFIG_COMMANDS\n# -------------------\n# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of\n# variables for single and double quote escaping we saved from calls\n# to _LT_DECL, we can put quote escaped variables declarations\n# into `config.status', and then the shell code to quote escape them in\n# for loops in `config.status'.  Finally, any additional code accumulated\n# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.\nm4_defun([_LT_CONFIG_COMMANDS],\n[AC_PROVIDE_IFELSE([LT_OUTPUT],\n\tdnl If the libtool generation code has been placed in $CONFIG_LT,\n\tdnl instead of duplicating it all over again into config.status,\n\tdnl then we will have config.status run $CONFIG_LT later, so it\n\tdnl needs to know what name is stored there:\n        [AC_CONFIG_COMMANDS([libtool],\n            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],\n    dnl If the libtool generation code is destined for config.status,\n    dnl expand the accumulated commands and init code now:\n    [AC_CONFIG_COMMANDS([libtool],\n        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])\n])#_LT_CONFIG_COMMANDS\n\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],\n[\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nsed_quote_subst='$sed_quote_subst'\ndouble_quote_subst='$double_quote_subst'\ndelay_variable_subst='$delay_variable_subst'\n_LT_CONFIG_STATUS_DECLARATIONS\nLTCC='$LTCC'\nLTCFLAGS='$LTCFLAGS'\ncompiler='$compiler_DEFAULT'\n\n# A function that is used when there is no print builtin or printf.\nfunc_fallback_echo ()\n{\n  eval 'cat <<_LTECHO_EOF\n\\$[]1\n_LTECHO_EOF'\n}\n\n# Quote evaled strings.\nfor var in lt_decl_all_varnames([[ \\\n]], lt_decl_quote_varnames); do\n    case \\`eval \\\\\\\\\\$ECHO \\\\\\\\\"\"\\\\\\\\\\$\\$var\"\\\\\\\\\"\\` in\n    *[[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"\\\\\\$\\$var\\\\\" | \\\\\\$SED \\\\\"\\\\\\$sed_quote_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n# Double-quote double-evaled strings.\nfor var in lt_decl_all_varnames([[ \\\n]], lt_decl_dquote_varnames); do\n    case \\`eval \\\\\\\\\\$ECHO \\\\\\\\\"\"\\\\\\\\\\$\\$var\"\\\\\\\\\"\\` in\n    *[[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"\\\\\\$\\$var\\\\\" | \\\\\\$SED -e \\\\\"\\\\\\$double_quote_subst\\\\\" -e \\\\\"\\\\\\$sed_quote_subst\\\\\" -e \\\\\"\\\\\\$delay_variable_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n_LT_OUTPUT_LIBTOOL_INIT\n])\n\n# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])\n# ------------------------------------\n# Generate a child script FILE with all initialization necessary to\n# reuse the environment learned by the parent script, and make the\n# file executable.  If COMMENT is supplied, it is inserted after the\n# `#!' sequence but before initialization text begins.  After this\n# macro, additional text can be appended to FILE to form the body of\n# the child script.  The macro ends with non-zero status if the\n# file could not be fully written (such as if the disk is full).\nm4_ifdef([AS_INIT_GENERATED],\n[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],\n[m4_defun([_LT_GENERATED_FILE_INIT],\n[m4_require([AS_PREPARE])]dnl\n[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl\n[lt_write_fail=0\ncat >$1 <<_ASEOF || lt_write_fail=1\n#! $SHELL\n# Generated by $as_me.\n$2\nSHELL=\\${CONFIG_SHELL-$SHELL}\nexport SHELL\n_ASEOF\ncat >>$1 <<\\_ASEOF || lt_write_fail=1\nAS_SHELL_SANITIZE\n_AS_PREPARE\nexec AS_MESSAGE_FD>&1\n_ASEOF\ntest $lt_write_fail = 0 && chmod +x $1[]dnl\nm4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT\n\n# LT_OUTPUT\n# ---------\n# This macro allows early generation of the libtool script (before\n# AC_OUTPUT is called), incase it is used in configure for compilation\n# tests.\nAC_DEFUN([LT_OUTPUT],\n[: ${CONFIG_LT=./config.lt}\nAC_MSG_NOTICE([creating $CONFIG_LT])\n_LT_GENERATED_FILE_INIT([\"$CONFIG_LT\"],\n[# Run this file to recreate a libtool stub with the current configuration.])\n\ncat >>\"$CONFIG_LT\" <<\\_LTEOF\nlt_cl_silent=false\nexec AS_MESSAGE_LOG_FD>>config.log\n{\n  echo\n  AS_BOX([Running $as_me.])\n} >&AS_MESSAGE_LOG_FD\n\nlt_cl_help=\"\\\n\\`$as_me' creates a local libtool stub from the current configuration,\nfor use in further configure time tests before the real libtool is\ngenerated.\n\nUsage: $[0] [[OPTIONS]]\n\n  -h, --help      print this help, then exit\n  -V, --version   print version number, then exit\n  -q, --quiet     do not print progress messages\n  -d, --debug     don't remove temporary files\n\nReport bugs to <bug-libtool@gnu.org>.\"\n\nlt_cl_version=\"\\\nm4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl\nm4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])\nconfigured by $[0], generated by m4_PACKAGE_STRING.\n\nCopyright (C) 2011 Free Software Foundation, Inc.\nThis config.lt script is free software; the Free Software Foundation\ngives unlimited permision to copy, distribute and modify it.\"\n\nwhile test $[#] != 0\ndo\n  case $[1] in\n    --version | --v* | -V )\n      echo \"$lt_cl_version\"; exit 0 ;;\n    --help | --h* | -h )\n      echo \"$lt_cl_help\"; exit 0 ;;\n    --debug | --d* | -d )\n      debug=: ;;\n    --quiet | --q* | --silent | --s* | -q )\n      lt_cl_silent=: ;;\n\n    -*) AC_MSG_ERROR([unrecognized option: $[1]\nTry \\`$[0] --help' for more information.]) ;;\n\n    *) AC_MSG_ERROR([unrecognized argument: $[1]\nTry \\`$[0] --help' for more information.]) ;;\n  esac\n  shift\ndone\n\nif $lt_cl_silent; then\n  exec AS_MESSAGE_FD>/dev/null\nfi\n_LTEOF\n\ncat >>\"$CONFIG_LT\" <<_LTEOF\n_LT_OUTPUT_LIBTOOL_COMMANDS_INIT\n_LTEOF\n\ncat >>\"$CONFIG_LT\" <<\\_LTEOF\nAC_MSG_NOTICE([creating $ofile])\n_LT_OUTPUT_LIBTOOL_COMMANDS\nAS_EXIT(0)\n_LTEOF\nchmod +x \"$CONFIG_LT\"\n\n# configure is writing to config.log, but config.lt does its own redirection,\n# appending to config.log, which fails on DOS, as config.log is still kept\n# open by configure.  Here we exec the FD to /dev/null, effectively closing\n# config.log, so it can be properly (re)opened and appended to by config.lt.\nlt_cl_success=:\ntest \"$silent\" = yes &&\n  lt_config_lt_args=\"$lt_config_lt_args --quiet\"\nexec AS_MESSAGE_LOG_FD>/dev/null\n$SHELL \"$CONFIG_LT\" $lt_config_lt_args || lt_cl_success=false\nexec AS_MESSAGE_LOG_FD>>config.log\n$lt_cl_success || AS_EXIT(1)\n])# LT_OUTPUT\n\n\n# _LT_CONFIG(TAG)\n# ---------------\n# If TAG is the built-in tag, create an initial libtool script with a\n# default configuration from the untagged config vars.  Otherwise add code\n# to config.status for appending the configuration named by TAG from the\n# matching tagged config vars.\nm4_defun([_LT_CONFIG],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\n_LT_CONFIG_SAVE_COMMANDS([\n  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl\n  m4_if(_LT_TAG, [C], [\n    # See if we are running on zsh, and set the options which allow our\n    # commands through without removal of \\ escapes.\n    if test -n \"${ZSH_VERSION+set}\" ; then\n      setopt NO_GLOB_SUBST\n    fi\n\n    cfgfile=\"${ofile}T\"\n    trap \"$RM \\\"$cfgfile\\\"; exit 1\" 1 2 15\n    $RM \"$cfgfile\"\n\n    cat <<_LT_EOF >> \"$cfgfile\"\n#! $SHELL\n\n# `$ECHO \"$ofile\" | sed 's%^.*/%%'` - Provide generalized library-building support services.\n# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION\n# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:\n# NOTE: Changes made to this file will be lost: look at ltmain.sh.\n#\n_LT_COPYING\n_LT_LIBTOOL_TAGS\n\n# ### BEGIN LIBTOOL CONFIG\n_LT_LIBTOOL_CONFIG_VARS\n_LT_LIBTOOL_TAG_VARS\n# ### END LIBTOOL CONFIG\n\n_LT_EOF\n\n  case $host_os in\n  aix3*)\n    cat <<\\_LT_EOF >> \"$cfgfile\"\n# AIX sometimes has problems with the GCC collect2 program.  For some\n# reason, if we set the COLLECT_NAMES environment variable, the problems\n# vanish in a puff of smoke.\nif test \"X${COLLECT_NAMES+set}\" != Xset; then\n  COLLECT_NAMES=\n  export COLLECT_NAMES\nfi\n_LT_EOF\n    ;;\n  esac\n\n  _LT_PROG_LTMAIN\n\n  # We use sed instead of cat because bash on DJGPP gets confused if\n  # if finds mixed CR/LF and LF-only lines.  Since sed operates in\n  # text mode, it properly converts lines to CR/LF.  This bash problem\n  # is reportedly fixed, but why not run on old versions too?\n  sed '$q' \"$ltmain\" >> \"$cfgfile\" \\\n     || (rm -f \"$cfgfile\"; exit 1)\n\n  _LT_PROG_REPLACE_SHELLFNS\n\n   mv -f \"$cfgfile\" \"$ofile\" ||\n    (rm -f \"$ofile\" && cp \"$cfgfile\" \"$ofile\" && rm -f \"$cfgfile\")\n  chmod +x \"$ofile\"\n],\n[cat <<_LT_EOF >> \"$ofile\"\n\ndnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded\ndnl in a comment (ie after a #).\n# ### BEGIN LIBTOOL TAG CONFIG: $1\n_LT_LIBTOOL_TAG_VARS(_LT_TAG)\n# ### END LIBTOOL TAG CONFIG: $1\n_LT_EOF\n])dnl /m4_if\n],\n[m4_if([$1], [], [\n    PACKAGE='$PACKAGE'\n    VERSION='$VERSION'\n    TIMESTAMP='$TIMESTAMP'\n    RM='$RM'\n    ofile='$ofile'], [])\n])dnl /_LT_CONFIG_SAVE_COMMANDS\n])# _LT_CONFIG\n\n\n# LT_SUPPORTED_TAG(TAG)\n# ---------------------\n# Trace this macro to discover what tags are supported by the libtool\n# --tag option, using:\n#    autoconf --trace 'LT_SUPPORTED_TAG:$1'\nAC_DEFUN([LT_SUPPORTED_TAG], [])\n\n\n# C support is built-in for now\nm4_define([_LT_LANG_C_enabled], [])\nm4_define([_LT_TAGS], [])\n\n\n# LT_LANG(LANG)\n# -------------\n# Enable libtool support for the given language if not already enabled.\nAC_DEFUN([LT_LANG],\n[AC_BEFORE([$0], [LT_OUTPUT])dnl\nm4_case([$1],\n  [C],\t\t\t[_LT_LANG(C)],\n  [C++],\t\t[_LT_LANG(CXX)],\n  [Go],\t\t\t[_LT_LANG(GO)],\n  [Java],\t\t[_LT_LANG(GCJ)],\n  [Fortran 77],\t\t[_LT_LANG(F77)],\n  [Fortran],\t\t[_LT_LANG(FC)],\n  [Windows Resource],\t[_LT_LANG(RC)],\n  [m4_ifdef([_LT_LANG_]$1[_CONFIG],\n    [_LT_LANG($1)],\n    [m4_fatal([$0: unsupported language: \"$1\"])])])dnl\n])# LT_LANG\n\n\n# _LT_LANG(LANGNAME)\n# ------------------\nm4_defun([_LT_LANG],\n[m4_ifdef([_LT_LANG_]$1[_enabled], [],\n  [LT_SUPPORTED_TAG([$1])dnl\n  m4_append([_LT_TAGS], [$1 ])dnl\n  m4_define([_LT_LANG_]$1[_enabled], [])dnl\n  _LT_LANG_$1_CONFIG($1)])dnl\n])# _LT_LANG\n\n\nm4_ifndef([AC_PROG_GO], [\n# NOTE: This macro has been submitted for inclusion into   #\n#  GNU Autoconf as AC_PROG_GO.  When it is available in    #\n#  a released version of Autoconf we should remove this    #\n#  macro and use it instead.                               #\nm4_defun([AC_PROG_GO],\n[AC_LANG_PUSH(Go)dnl\nAC_ARG_VAR([GOC],     [Go compiler command])dnl\nAC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl\n_AC_ARG_VAR_LDFLAGS()dnl\nAC_CHECK_TOOL(GOC, gccgo)\nif test -z \"$GOC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])\n  fi\nfi\nif test -z \"$GOC\"; then\n  AC_CHECK_PROG(GOC, gccgo, gccgo, false)\nfi\n])#m4_defun\n])#m4_ifndef\n\n\n# _LT_LANG_DEFAULT_CONFIG\n# -----------------------\nm4_defun([_LT_LANG_DEFAULT_CONFIG],\n[AC_PROVIDE_IFELSE([AC_PROG_CXX],\n  [LT_LANG(CXX)],\n  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])\n\nAC_PROVIDE_IFELSE([AC_PROG_F77],\n  [LT_LANG(F77)],\n  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])\n\nAC_PROVIDE_IFELSE([AC_PROG_FC],\n  [LT_LANG(FC)],\n  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])\n\ndnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal\ndnl pulling things in needlessly.\nAC_PROVIDE_IFELSE([AC_PROG_GCJ],\n  [LT_LANG(GCJ)],\n  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],\n    [LT_LANG(GCJ)],\n    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],\n      [LT_LANG(GCJ)],\n      [m4_ifdef([AC_PROG_GCJ],\n\t[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])\n       m4_ifdef([A][M_PROG_GCJ],\n\t[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])\n       m4_ifdef([LT_PROG_GCJ],\n\t[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])\n\nAC_PROVIDE_IFELSE([AC_PROG_GO],\n  [LT_LANG(GO)],\n  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])\n\nAC_PROVIDE_IFELSE([LT_PROG_RC],\n  [LT_LANG(RC)],\n  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])\n])# _LT_LANG_DEFAULT_CONFIG\n\n# Obsolete macros:\nAU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])\nAU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])\nAU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])\nAU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])\nAU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_CXX], [])\ndnl AC_DEFUN([AC_LIBTOOL_F77], [])\ndnl AC_DEFUN([AC_LIBTOOL_FC], [])\ndnl AC_DEFUN([AC_LIBTOOL_GCJ], [])\ndnl AC_DEFUN([AC_LIBTOOL_RC], [])\n\n\n# _LT_TAG_COMPILER\n# ----------------\nm4_defun([_LT_TAG_COMPILER],\n[AC_REQUIRE([AC_PROG_CC])dnl\n\n_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl\n_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl\n_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl\n_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n])# _LT_TAG_COMPILER\n\n\n# _LT_COMPILER_BOILERPLATE\n# ------------------------\n# Check for compiler boilerplate output or warnings with\n# the simple compiler test code.\nm4_defun([_LT_COMPILER_BOILERPLATE],\n[m4_require([_LT_DECL_SED])dnl\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_compile_test_code\" >conftest.$ac_ext\neval \"$ac_compile\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_compiler_boilerplate=`cat conftest.err`\n$RM conftest*\n])# _LT_COMPILER_BOILERPLATE\n\n\n# _LT_LINKER_BOILERPLATE\n# ----------------------\n# Check for linker boilerplate output or warnings with\n# the simple link test code.\nm4_defun([_LT_LINKER_BOILERPLATE],\n[m4_require([_LT_DECL_SED])dnl\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_link_test_code\" >conftest.$ac_ext\neval \"$ac_link\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_linker_boilerplate=`cat conftest.err`\n$RM -r conftest*\n])# _LT_LINKER_BOILERPLATE\n\n# _LT_REQUIRED_DARWIN_CHECKS\n# -------------------------\nm4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[\n  case $host_os in\n    rhapsody* | darwin*)\n    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])\n    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])\n    AC_CHECK_TOOL([LIPO], [lipo], [:])\n    AC_CHECK_TOOL([OTOOL], [otool], [:])\n    AC_CHECK_TOOL([OTOOL64], [otool64], [:])\n    _LT_DECL([], [DSYMUTIL], [1],\n      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])\n    _LT_DECL([], [NMEDIT], [1],\n      [Tool to change global to local symbols on Mac OS X])\n    _LT_DECL([], [LIPO], [1],\n      [Tool to manipulate fat objects and archives on Mac OS X])\n    _LT_DECL([], [OTOOL], [1],\n      [ldd/readelf like tool for Mach-O binaries on Mac OS X])\n    _LT_DECL([], [OTOOL64], [1],\n      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])\n\n    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],\n      [lt_cv_apple_cc_single_mod=no\n      if test -z \"${LT_MULTI_MODULE}\"; then\n\t# By default we will add the -single_module flag. You can override\n\t# by either setting the environment variable LT_MULTI_MODULE\n\t# non-empty at configure time, or by adding -multi_module to the\n\t# link flags.\n\trm -rf libconftest.dylib*\n\techo \"int foo(void){return 1;}\" > conftest.c\n\techo \"$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n-dynamiclib -Wl,-single_module conftest.c\" >&AS_MESSAGE_LOG_FD\n\t$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n\t  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err\n        _lt_result=$?\n\t# If there is a non-empty error log, and \"single_module\"\n\t# appears in it, assume the flag caused a linker warning\n        if test -s conftest.err && $GREP single_module conftest.err; then\n\t  cat conftest.err >&AS_MESSAGE_LOG_FD\n\t# Otherwise, if the output was created with a 0 exit code from\n\t# the compiler, it worked.\n\telif test -f libconftest.dylib && test $_lt_result -eq 0; then\n\t  lt_cv_apple_cc_single_mod=yes\n\telse\n\t  cat conftest.err >&AS_MESSAGE_LOG_FD\n\tfi\n\trm -rf libconftest.dylib*\n\trm -f conftest.*\n      fi])\n\n    AC_CACHE_CHECK([for -exported_symbols_list linker flag],\n      [lt_cv_ld_exported_symbols_list],\n      [lt_cv_ld_exported_symbols_list=no\n      save_LDFLAGS=$LDFLAGS\n      echo \"_main\" > conftest.sym\n      LDFLAGS=\"$LDFLAGS -Wl,-exported_symbols_list,conftest.sym\"\n      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],\n\t[lt_cv_ld_exported_symbols_list=yes],\n\t[lt_cv_ld_exported_symbols_list=no])\n\tLDFLAGS=\"$save_LDFLAGS\"\n    ])\n\n    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],\n      [lt_cv_ld_force_load=no\n      cat > conftest.c << _LT_EOF\nint forced_loaded() { return 2;}\n_LT_EOF\n      echo \"$LTCC $LTCFLAGS -c -o conftest.o conftest.c\" >&AS_MESSAGE_LOG_FD\n      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD\n      echo \"$AR cru libconftest.a conftest.o\" >&AS_MESSAGE_LOG_FD\n      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD\n      echo \"$RANLIB libconftest.a\" >&AS_MESSAGE_LOG_FD\n      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD\n      cat > conftest.c << _LT_EOF\nint main() { return 0;}\n_LT_EOF\n      echo \"$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a\" >&AS_MESSAGE_LOG_FD\n      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err\n      _lt_result=$?\n      if test -s conftest.err && $GREP force_load conftest.err; then\n\tcat conftest.err >&AS_MESSAGE_LOG_FD\n      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then\n\tlt_cv_ld_force_load=yes\n      else\n\tcat conftest.err >&AS_MESSAGE_LOG_FD\n      fi\n        rm -f conftest.err libconftest.a conftest conftest.c\n        rm -rf conftest.dSYM\n    ])\n    case $host_os in\n    rhapsody* | darwin1.[[012]])\n      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;\n    darwin1.*)\n      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n    darwin*) # darwin 5.x on\n      # if running on 10.5 or later, the deployment target defaults\n      # to the OS version, if on x86, and 10.4, the deployment\n      # target defaults to 10.4. Don't you love it?\n      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in\n\t10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n\t10.[[012]]*)\n\t  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n\t10.*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n      esac\n    ;;\n  esac\n    if test \"$lt_cv_apple_cc_single_mod\" = \"yes\"; then\n      _lt_dar_single_mod='$single_module'\n    fi\n    if test \"$lt_cv_ld_exported_symbols_list\" = \"yes\"; then\n      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'\n    else\n      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'\n    fi\n    if test \"$DSYMUTIL\" != \":\" && test \"$lt_cv_ld_force_load\" = \"no\"; then\n      _lt_dsymutil='~$DSYMUTIL $lib || :'\n    else\n      _lt_dsymutil=\n    fi\n    ;;\n  esac\n])\n\n\n# _LT_DARWIN_LINKER_FEATURES([TAG])\n# ---------------------------------\n# Checks for linker and compiler features on darwin\nm4_defun([_LT_DARWIN_LINKER_FEATURES],\n[\n  m4_require([_LT_REQUIRED_DARWIN_CHECKS])\n  _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n  _LT_TAGVAR(hardcode_direct, $1)=no\n  _LT_TAGVAR(hardcode_automatic, $1)=yes\n  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n  if test \"$lt_cv_ld_force_load\" = \"yes\"; then\n    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience ${wl}-force_load,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"`'\n    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],\n                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])\n  else\n    _LT_TAGVAR(whole_archive_flag_spec, $1)=''\n  fi\n  _LT_TAGVAR(link_all_deplibs, $1)=yes\n  _LT_TAGVAR(allow_undefined_flag, $1)=\"$_lt_dar_allow_undefined\"\n  case $cc_basename in\n     ifort*) _lt_dar_can_shared=yes ;;\n     *) _lt_dar_can_shared=$GCC ;;\n  esac\n  if test \"$_lt_dar_can_shared\" = \"yes\"; then\n    output_verbose_link_cmd=func_echo_all\n    _LT_TAGVAR(archive_cmds, $1)=\"\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod${_lt_dsymutil}\"\n    _LT_TAGVAR(module_cmds, $1)=\"\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dsymutil}\"\n    _LT_TAGVAR(archive_expsym_cmds, $1)=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}\"\n    _LT_TAGVAR(module_expsym_cmds, $1)=\"sed -e 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}\"\n    m4_if([$1], [CXX],\n[   if test \"$lt_cv_apple_cc_single_mod\" != \"yes\"; then\n      _LT_TAGVAR(archive_cmds, $1)=\"\\$CC -r -keep_private_externs -nostdlib -o \\${lib}-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\${lib}-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring${_lt_dsymutil}\"\n      _LT_TAGVAR(archive_expsym_cmds, $1)=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -r -keep_private_externs -nostdlib -o \\${lib}-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\${lib}-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring${_lt_dar_export_syms}${_lt_dsymutil}\"\n    fi\n],[])\n  else\n  _LT_TAGVAR(ld_shlibs, $1)=no\n  fi\n])\n\n# _LT_SYS_MODULE_PATH_AIX([TAGNAME])\n# ----------------------------------\n# Links a minimal program and checks the executable\n# for the system default hardcoded library path. In most cases,\n# this is /usr/lib:/lib, but when the MPI compilers are used\n# the location of the communication and MPI libs are included too.\n# If we don't find anything, use the default library path according\n# to the aix ld manual.\n# Store the results from the different compilers for each TAGNAME.\n# Allow to override them for all tags through lt_cv_aix_libpath.\nm4_defun([_LT_SYS_MODULE_PATH_AIX],\n[m4_require([_LT_DECL_SED])dnl\nif test \"${lt_cv_aix_libpath+set}\" = set; then\n  aix_libpath=$lt_cv_aix_libpath\nelse\n  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],\n  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[\n  lt_aix_libpath_sed='[\n      /Import File Strings/,/^$/ {\n\t  /^0/ {\n\t      s/^0  *\\([^ ]*\\) *$/\\1/\n\t      p\n\t  }\n      }]'\n  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  # Check for a 64-bit object if we didn't find anything.\n  if test -z \"$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])\"; then\n    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  fi],[])\n  if test -z \"$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])\"; then\n    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=\"/usr/lib:/lib\"\n  fi\n  ])\n  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])\nfi\n])# _LT_SYS_MODULE_PATH_AIX\n\n\n# _LT_SHELL_INIT(ARG)\n# -------------------\nm4_define([_LT_SHELL_INIT],\n[m4_divert_text([M4SH-INIT], [$1\n])])# _LT_SHELL_INIT\n\n\n\n# _LT_PROG_ECHO_BACKSLASH\n# -----------------------\n# Find how we can fake an echo command that does not interpret backslash.\n# In particular, with Autoconf 2.60 or later we add some code to the start\n# of the generated configure script which will find a shell with a builtin\n# printf (which we can use as an echo command).\nm4_defun([_LT_PROG_ECHO_BACKSLASH],\n[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nECHO=$ECHO$ECHO$ECHO$ECHO$ECHO\nECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO\n\nAC_MSG_CHECKING([how to print strings])\n# Test print first, because it will be a builtin if present.\nif test \"X`( print -r -- -n ) 2>/dev/null`\" = X-n && \\\n   test \"X`print -r -- $ECHO 2>/dev/null`\" = \"X$ECHO\"; then\n  ECHO='print -r --'\nelif test \"X`printf %s $ECHO 2>/dev/null`\" = \"X$ECHO\"; then\n  ECHO='printf %s\\n'\nelse\n  # Use this function as a fallback that always works.\n  func_fallback_echo ()\n  {\n    eval 'cat <<_LTECHO_EOF\n$[]1\n_LTECHO_EOF'\n  }\n  ECHO='func_fallback_echo'\nfi\n\n# func_echo_all arg...\n# Invoke $ECHO with all args, space-separated.\nfunc_echo_all ()\n{\n    $ECHO \"$*\" \n}\n\ncase \"$ECHO\" in\n  printf*) AC_MSG_RESULT([printf]) ;;\n  print*) AC_MSG_RESULT([print -r]) ;;\n  *) AC_MSG_RESULT([cat]) ;;\nesac\n\nm4_ifdef([_AS_DETECT_SUGGESTED],\n[_AS_DETECT_SUGGESTED([\n  test -n \"${ZSH_VERSION+set}${BASH_VERSION+set}\" || (\n    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\n    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO\n    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO\n    PATH=/empty FPATH=/empty; export PATH FPATH\n    test \"X`printf %s $ECHO`\" = \"X$ECHO\" \\\n      || test \"X`print -r -- $ECHO`\" = \"X$ECHO\" )])])\n\n_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])\n_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])\n])# _LT_PROG_ECHO_BACKSLASH\n\n\n# _LT_WITH_SYSROOT\n# ----------------\nAC_DEFUN([_LT_WITH_SYSROOT],\n[AC_MSG_CHECKING([for sysroot])\nAC_ARG_WITH([sysroot],\n[  --with-sysroot[=DIR] Search for dependent libraries within DIR\n                        (or the compiler's sysroot if not specified).],\n[], [with_sysroot=no])\n\ndnl lt_sysroot will always be passed unquoted.  We quote it here\ndnl in case the user passed a directory name.\nlt_sysroot=\ncase ${with_sysroot} in #(\n yes)\n   if test \"$GCC\" = yes; then\n     lt_sysroot=`$CC --print-sysroot 2>/dev/null`\n   fi\n   ;; #(\n /*)\n   lt_sysroot=`echo \"$with_sysroot\" | sed -e \"$sed_quote_subst\"`\n   ;; #(\n no|'')\n   ;; #(\n *)\n   AC_MSG_RESULT([${with_sysroot}])\n   AC_MSG_ERROR([The sysroot must be an absolute path.])\n   ;;\nesac\n\n AC_MSG_RESULT([${lt_sysroot:-no}])\n_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl\n[dependent libraries, and in which our libraries should be installed.])])\n\n# _LT_ENABLE_LOCK\n# ---------------\nm4_defun([_LT_ENABLE_LOCK],\n[AC_ARG_ENABLE([libtool-lock],\n  [AS_HELP_STRING([--disable-libtool-lock],\n    [avoid locking (might break parallel builds)])])\ntest \"x$enable_libtool_lock\" != xno && enable_libtool_lock=yes\n\n# Some flags need to be propagated to the compiler or linker for good\n# libtool support.\ncase $host in\nia64-*-hpux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.$ac_objext` in\n      *ELF-32*)\n\tHPUX_IA64_MODE=\"32\"\n\t;;\n      *ELF-64*)\n\tHPUX_IA64_MODE=\"64\"\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n*-*-irix6*)\n  # Find out which ABI we are using.\n  echo '[#]line '$LINENO' \"configure\"' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    if test \"$lt_cv_prog_gnu_ld\" = yes; then\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -melf32bsmip\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -melf32bmipn32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -melf64bmip\"\n\t;;\n      esac\n    else\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -32\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -n32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -64\"\n\t  ;;\n      esac\n    fi\n  fi\n  rm -rf conftest*\n  ;;\n\nx86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \\\ns390*-*linux*|s390*-*tpf*|sparc*-*linux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.o` in\n      *32-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_i386_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    case `/usr/bin/file conftest.o` in\n\t      *x86-64*)\n\t\tLD=\"${LD-ld} -m elf32_x86_64\"\n\t\t;;\n\t      *)\n\t\tLD=\"${LD-ld} -m elf_i386\"\n\t\t;;\n\t    esac\n\t    ;;\n\t  powerpc64le-*)\n\t    LD=\"${LD-ld} -m elf32lppclinux\"\n\t    ;;\n\t  powerpc64-*)\n\t    LD=\"${LD-ld} -m elf32ppclinux\"\n\t    ;;\n\t  s390x-*linux*)\n\t    LD=\"${LD-ld} -m elf_s390\"\n\t    ;;\n\t  sparc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32_sparc\"\n\t    ;;\n\tesac\n\t;;\n      *64-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_x86_64_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_x86_64\"\n\t    ;;\n\t  powerpcle-*)\n\t    LD=\"${LD-ld} -m elf64lppc\"\n\t    ;;\n\t  powerpc-*)\n\t    LD=\"${LD-ld} -m elf64ppc\"\n\t    ;;\n\t  s390*-*linux*|s390*-*tpf*)\n\t    LD=\"${LD-ld} -m elf64_s390\"\n\t    ;;\n\t  sparc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64_sparc\"\n\t    ;;\n\tesac\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n\n*-*-sco3.2v5*)\n  # On SCO OpenServer 5, we need -belf to get full-featured binaries.\n  SAVE_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -belf\"\n  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,\n    [AC_LANG_PUSH(C)\n     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])\n     AC_LANG_POP])\n  if test x\"$lt_cv_cc_needs_belf\" != x\"yes\"; then\n    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf\n    CFLAGS=\"$SAVE_CFLAGS\"\n  fi\n  ;;\n*-*solaris*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.o` in\n    *64-bit*)\n      case $lt_cv_prog_gnu_ld in\n      yes*)\n        case $host in\n        i?86-*-solaris*)\n          LD=\"${LD-ld} -m elf_x86_64\"\n          ;;\n        sparc*-*-solaris*)\n          LD=\"${LD-ld} -m elf64_sparc\"\n          ;;\n        esac\n        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.\n        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then\n          LD=\"${LD-ld}_sol2\"\n        fi\n        ;;\n      *)\n\tif ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then\n\t  LD=\"${LD-ld} -64\"\n\tfi\n\t;;\n      esac\n      ;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\nesac\n\nneed_locks=\"$enable_libtool_lock\"\n])# _LT_ENABLE_LOCK\n\n\n# _LT_PROG_AR\n# -----------\nm4_defun([_LT_PROG_AR],\n[AC_CHECK_TOOLS(AR, [ar], false)\n: ${AR=ar}\n: ${AR_FLAGS=cru}\n_LT_DECL([], [AR], [1], [The archiver])\n_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])\n\nAC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],\n  [lt_cv_ar_at_file=no\n   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],\n     [echo conftest.$ac_objext > conftest.lst\n      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'\n      AC_TRY_EVAL([lt_ar_try])\n      if test \"$ac_status\" -eq 0; then\n\t# Ensure the archiver fails upon bogus file names.\n\trm -f conftest.$ac_objext libconftest.a\n\tAC_TRY_EVAL([lt_ar_try])\n\tif test \"$ac_status\" -ne 0; then\n          lt_cv_ar_at_file=@\n        fi\n      fi\n      rm -f conftest.* libconftest.a\n     ])\n  ])\n\nif test \"x$lt_cv_ar_at_file\" = xno; then\n  archiver_list_spec=\nelse\n  archiver_list_spec=$lt_cv_ar_at_file\nfi\n_LT_DECL([], [archiver_list_spec], [1],\n  [How to feed a file listing to the archiver])\n])# _LT_PROG_AR\n\n\n# _LT_CMD_OLD_ARCHIVE\n# -------------------\nm4_defun([_LT_CMD_OLD_ARCHIVE],\n[_LT_PROG_AR\n\nAC_CHECK_TOOL(STRIP, strip, :)\ntest -z \"$STRIP\" && STRIP=:\n_LT_DECL([], [STRIP], [1], [A symbol stripping program])\n\nAC_CHECK_TOOL(RANLIB, ranlib, :)\ntest -z \"$RANLIB\" && RANLIB=:\n_LT_DECL([], [RANLIB], [1],\n    [Commands used to install an old-style archive])\n\n# Determine commands to create old-style static archives.\nold_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'\nold_postinstall_cmds='chmod 644 $oldlib'\nold_postuninstall_cmds=\n\nif test -n \"$RANLIB\"; then\n  case $host_os in\n  openbsd*)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB -t \\$tool_oldlib\"\n    ;;\n  *)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB \\$tool_oldlib\"\n    ;;\n  esac\n  old_archive_cmds=\"$old_archive_cmds~\\$RANLIB \\$tool_oldlib\"\nfi\n\ncase $host_os in\n  darwin*)\n    lock_old_archive_extraction=yes ;;\n  *)\n    lock_old_archive_extraction=no ;;\nesac\n_LT_DECL([], [old_postinstall_cmds], [2])\n_LT_DECL([], [old_postuninstall_cmds], [2])\n_LT_TAGDECL([], [old_archive_cmds], [2],\n    [Commands used to build an old-style archive])\n_LT_DECL([], [lock_old_archive_extraction], [0],\n    [Whether to use a lock for old archive extraction])\n])# _LT_CMD_OLD_ARCHIVE\n\n\n# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,\n#\t\t[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])\n# ----------------------------------------------------------------\n# Check whether the given compiler option works\nAC_DEFUN([_LT_COMPILER_OPTION],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_SED])dnl\nAC_CACHE_CHECK([$1], [$2],\n  [$2=no\n   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"$3\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [[^ ]]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&AS_MESSAGE_LOG_FD\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&AS_MESSAGE_LOG_FD\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       $2=yes\n     fi\n   fi\n   $RM conftest*\n])\n\nif test x\"[$]$2\" = xyes; then\n    m4_if([$5], , :, [$5])\nelse\n    m4_if([$6], , :, [$6])\nfi\n])# _LT_COMPILER_OPTION\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])\n\n\n# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,\n#                  [ACTION-SUCCESS], [ACTION-FAILURE])\n# ----------------------------------------------------\n# Check whether the given linker option works\nAC_DEFUN([_LT_LINKER_OPTION],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_SED])dnl\nAC_CACHE_CHECK([$1], [$2],\n  [$2=no\n   save_LDFLAGS=\"$LDFLAGS\"\n   LDFLAGS=\"$LDFLAGS $3\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&AS_MESSAGE_LOG_FD\n       $ECHO \"$_lt_linker_boilerplate\" | $SED '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         $2=yes\n       fi\n     else\n       $2=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=\"$save_LDFLAGS\"\n])\n\nif test x\"[$]$2\" = xyes; then\n    m4_if([$4], , :, [$4])\nelse\n    m4_if([$5], , :, [$5])\nfi\n])# _LT_LINKER_OPTION\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])\n\n\n# LT_CMD_MAX_LEN\n#---------------\nAC_DEFUN([LT_CMD_MAX_LEN],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\n# find the maximum length of command line arguments\nAC_MSG_CHECKING([the maximum length of command line arguments])\nAC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl\n  i=0\n  teststring=\"ABCD\"\n\n  case $build_os in\n  msdosdjgpp*)\n    # On DJGPP, this test can blow up pretty badly due to problems in libc\n    # (any single argument exceeding 2000 bytes causes a buffer overrun\n    # during glob expansion).  Even if it were fixed, the result of this\n    # check would be larger than it should be.\n    lt_cv_sys_max_cmd_len=12288;    # 12K is about right\n    ;;\n\n  gnu*)\n    # Under GNU Hurd, this test is not required because there is\n    # no limit to the length of command line arguments.\n    # Libtool will interpret -1 as no limit whatsoever\n    lt_cv_sys_max_cmd_len=-1;\n    ;;\n\n  cygwin* | mingw* | cegcc*)\n    # On Win9x/ME, this test blows up -- it succeeds, but takes\n    # about 5 minutes as the teststring grows exponentially.\n    # Worse, since 9x/ME are not pre-emptively multitasking,\n    # you end up with a \"frozen\" computer, even though with patience\n    # the test eventually succeeds (with a max line length of 256k).\n    # Instead, let's just punt: use the minimum linelength reported by\n    # all of the supported platforms: 8192 (on NT/2K/XP).\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  mint*)\n    # On MiNT this can take a long time and run out of memory.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  amigaos*)\n    # On AmigaOS with pdksh, this test takes hours, literally.\n    # So we just punt and use a minimum line length of 8192.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)\n    # This has been around since 386BSD, at least.  Likely further.\n    if test -x /sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`\n    elif test -x /usr/sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`\n    else\n      lt_cv_sys_max_cmd_len=65536\t# usable default for all BSDs\n    fi\n    # And add a safety zone\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    ;;\n\n  interix*)\n    # We know the value 262144 and hardcode it with a safety zone (like BSD)\n    lt_cv_sys_max_cmd_len=196608\n    ;;\n\n  os2*)\n    # The test takes a long time on OS/2.\n    lt_cv_sys_max_cmd_len=8192\n    ;;\n\n  osf*)\n    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure\n    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not\n    # nice to cause kernel panics so lets avoid the loop below.\n    # First set a reasonable default.\n    lt_cv_sys_max_cmd_len=16384\n    #\n    if test -x /sbin/sysconfig; then\n      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in\n        *1*) lt_cv_sys_max_cmd_len=-1 ;;\n      esac\n    fi\n    ;;\n  sco3.2v5*)\n    lt_cv_sys_max_cmd_len=102400\n    ;;\n  sysv5* | sco5v6* | sysv4.2uw2*)\n    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`\n    if test -n \"$kargmax\"; then\n      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[\t ]]//'`\n    else\n      lt_cv_sys_max_cmd_len=32768\n    fi\n    ;;\n  *)\n    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`\n    if test -n \"$lt_cv_sys_max_cmd_len\" && \\\n\ttest undefined != \"$lt_cv_sys_max_cmd_len\"; then\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    else\n      # Make teststring a little bigger before we do anything with it.\n      # a 1K string should be a reasonable start.\n      for i in 1 2 3 4 5 6 7 8 ; do\n        teststring=$teststring$teststring\n      done\n      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}\n      # If test is not a shell built-in, we'll probably end up computing a\n      # maximum length that is only half of the actual maximum length, but\n      # we can't tell.\n      while { test \"X\"`env echo \"$teststring$teststring\" 2>/dev/null` \\\n\t         = \"X$teststring$teststring\"; } >/dev/null 2>&1 &&\n\t      test $i != 17 # 1/2 MB should be enough\n      do\n        i=`expr $i + 1`\n        teststring=$teststring$teststring\n      done\n      # Only check the string length outside the loop.\n      lt_cv_sys_max_cmd_len=`expr \"X$teststring\" : \".*\" 2>&1`\n      teststring=\n      # Add a significant safety factor because C++ compilers can tack on\n      # massive amounts of additional arguments before passing them to the\n      # linker.  It appears as though 1/2 is a usable value.\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 2`\n    fi\n    ;;\n  esac\n])\nif test -n $lt_cv_sys_max_cmd_len ; then\n  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)\nelse\n  AC_MSG_RESULT(none)\nfi\nmax_cmd_len=$lt_cv_sys_max_cmd_len\n_LT_DECL([], [max_cmd_len], [0],\n    [What is the maximum length of a command?])\n])# LT_CMD_MAX_LEN\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])\n\n\n# _LT_HEADER_DLFCN\n# ----------------\nm4_defun([_LT_HEADER_DLFCN],\n[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl\n])# _LT_HEADER_DLFCN\n\n\n# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,\n#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)\n# ----------------------------------------------------------------\nm4_defun([_LT_TRY_DLOPEN_SELF],\n[m4_require([_LT_HEADER_DLFCN])dnl\nif test \"$cross_compiling\" = yes; then :\n  [$4]\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n[#line $LINENO \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\n/* When -fvisbility=hidden is used, assume the code has been annotated\n   correspondingly for the symbols needed.  */\n#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))\nint fnord () __attribute__((visibility(\"default\")));\n#endif\n\nint fnord () { return 42; }\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else\n        {\n\t  if (dlsym( self,\"_fnord\"))  status = $lt_dlneed_uscore;\n          else puts (dlerror ());\n\t}\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}]\n_LT_EOF\n  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) $1 ;;\n      x$lt_dlneed_uscore) $2 ;;\n      x$lt_dlunknown|x*) $3 ;;\n    esac\n  else :\n    # compilation failed\n    $3\n  fi\nfi\nrm -fr conftest*\n])# _LT_TRY_DLOPEN_SELF\n\n\n# LT_SYS_DLOPEN_SELF\n# ------------------\nAC_DEFUN([LT_SYS_DLOPEN_SELF],\n[m4_require([_LT_HEADER_DLFCN])dnl\nif test \"x$enable_dlopen\" != xyes; then\n  enable_dlopen=unknown\n  enable_dlopen_self=unknown\n  enable_dlopen_self_static=unknown\nelse\n  lt_cv_dlopen=no\n  lt_cv_dlopen_libs=\n\n  case $host_os in\n  beos*)\n    lt_cv_dlopen=\"load_add_on\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ;;\n\n  mingw* | pw32* | cegcc*)\n    lt_cv_dlopen=\"LoadLibrary\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  cygwin*)\n    lt_cv_dlopen=\"dlopen\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  darwin*)\n  # if libdl is installed we need to link against it\n    AC_CHECK_LIB([dl], [dlopen],\n\t\t[lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"],[\n    lt_cv_dlopen=\"dyld\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ])\n    ;;\n\n  *)\n    AC_CHECK_FUNC([shl_load],\n\t  [lt_cv_dlopen=\"shl_load\"],\n      [AC_CHECK_LIB([dld], [shl_load],\n\t    [lt_cv_dlopen=\"shl_load\" lt_cv_dlopen_libs=\"-ldld\"],\n\t[AC_CHECK_FUNC([dlopen],\n\t      [lt_cv_dlopen=\"dlopen\"],\n\t  [AC_CHECK_LIB([dl], [dlopen],\n\t\t[lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"],\n\t    [AC_CHECK_LIB([svld], [dlopen],\n\t\t  [lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-lsvld\"],\n\t      [AC_CHECK_LIB([dld], [dld_link],\n\t\t    [lt_cv_dlopen=\"dld_link\" lt_cv_dlopen_libs=\"-ldld\"])\n\t      ])\n\t    ])\n\t  ])\n\t])\n      ])\n    ;;\n  esac\n\n  if test \"x$lt_cv_dlopen\" != xno; then\n    enable_dlopen=yes\n  else\n    enable_dlopen=no\n  fi\n\n  case $lt_cv_dlopen in\n  dlopen)\n    save_CPPFLAGS=\"$CPPFLAGS\"\n    test \"x$ac_cv_header_dlfcn_h\" = xyes && CPPFLAGS=\"$CPPFLAGS -DHAVE_DLFCN_H\"\n\n    save_LDFLAGS=\"$LDFLAGS\"\n    wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $export_dynamic_flag_spec\\\"\n\n    save_LIBS=\"$LIBS\"\n    LIBS=\"$lt_cv_dlopen_libs $LIBS\"\n\n    AC_CACHE_CHECK([whether a program can dlopen itself],\n\t  lt_cv_dlopen_self, [dnl\n\t  _LT_TRY_DLOPEN_SELF(\n\t    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,\n\t    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)\n    ])\n\n    if test \"x$lt_cv_dlopen_self\" = xyes; then\n      wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $lt_prog_compiler_static\\\"\n      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],\n\t  lt_cv_dlopen_self_static, [dnl\n\t  _LT_TRY_DLOPEN_SELF(\n\t    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,\n\t    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)\n      ])\n    fi\n\n    CPPFLAGS=\"$save_CPPFLAGS\"\n    LDFLAGS=\"$save_LDFLAGS\"\n    LIBS=\"$save_LIBS\"\n    ;;\n  esac\n\n  case $lt_cv_dlopen_self in\n  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;\n  *) enable_dlopen_self=unknown ;;\n  esac\n\n  case $lt_cv_dlopen_self_static in\n  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;\n  *) enable_dlopen_self_static=unknown ;;\n  esac\nfi\n_LT_DECL([dlopen_support], [enable_dlopen], [0],\n\t [Whether dlopen is supported])\n_LT_DECL([dlopen_self], [enable_dlopen_self], [0],\n\t [Whether dlopen of programs is supported])\n_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],\n\t [Whether dlopen of statically linked programs is supported])\n])# LT_SYS_DLOPEN_SELF\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])\n\n\n# _LT_COMPILER_C_O([TAGNAME])\n# ---------------------------\n# Check to see if options -c and -o are simultaneously supported by compiler.\n# This macro does not hard code the compiler like AC_PROG_CC_C_O.\nm4_defun([_LT_COMPILER_C_O],\n[m4_require([_LT_DECL_SED])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_TAG_COMPILER])dnl\nAC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],\n  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],\n  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [[^ ]]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&AS_MESSAGE_LOG_FD\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&AS_MESSAGE_LOG_FD\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes\n     fi\n   fi\n   chmod u+w . 2>&AS_MESSAGE_LOG_FD\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n])\n_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],\n\t[Does compiler simultaneously support -c and -o options?])\n])# _LT_COMPILER_C_O\n\n\n# _LT_COMPILER_FILE_LOCKS([TAGNAME])\n# ----------------------------------\n# Check to see if we can do hard links to lock some files if needed\nm4_defun([_LT_COMPILER_FILE_LOCKS],\n[m4_require([_LT_ENABLE_LOCK])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\n_LT_COMPILER_C_O([$1])\n\nhard_links=\"nottested\"\nif test \"$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)\" = no && test \"$need_locks\" != no; then\n  # do not overwrite the value of need_locks provided by the user\n  AC_MSG_CHECKING([if we can lock with hard links])\n  hard_links=yes\n  $RM conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  AC_MSG_RESULT([$hard_links])\n  if test \"$hard_links\" = no; then\n    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])\n])# _LT_COMPILER_FILE_LOCKS\n\n\n# _LT_CHECK_OBJDIR\n# ----------------\nm4_defun([_LT_CHECK_OBJDIR],\n[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],\n[rm -f .libs 2>/dev/null\nmkdir .libs 2>/dev/null\nif test -d .libs; then\n  lt_cv_objdir=.libs\nelse\n  # MS-DOS does not allow filenames that begin with a dot.\n  lt_cv_objdir=_libs\nfi\nrmdir .libs 2>/dev/null])\nobjdir=$lt_cv_objdir\n_LT_DECL([], [objdir], [0],\n         [The name of the directory that contains temporary libtool files])dnl\nm4_pattern_allow([LT_OBJDIR])dnl\nAC_DEFINE_UNQUOTED(LT_OBJDIR, \"$lt_cv_objdir/\",\n  [Define to the sub-directory in which libtool stores uninstalled libraries.])\n])# _LT_CHECK_OBJDIR\n\n\n# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])\n# --------------------------------------\n# Check hardcoding attributes.\nm4_defun([_LT_LINKER_HARDCODE_LIBPATH],\n[AC_MSG_CHECKING([how to hardcode library paths into programs])\n_LT_TAGVAR(hardcode_action, $1)=\nif test -n \"$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\" ||\n   test -n \"$_LT_TAGVAR(runpath_var, $1)\" ||\n   test \"X$_LT_TAGVAR(hardcode_automatic, $1)\" = \"Xyes\" ; then\n\n  # We can hardcode non-existent directories.\n  if test \"$_LT_TAGVAR(hardcode_direct, $1)\" != no &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test \"$_LT_TAGVAR(hardcode_shlibpath_var, $1)\" != no &&\n     test \"$_LT_TAGVAR(hardcode_minus_L, $1)\" != no; then\n    # Linking always hardcodes the temporary library directory.\n    _LT_TAGVAR(hardcode_action, $1)=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    _LT_TAGVAR(hardcode_action, $1)=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  _LT_TAGVAR(hardcode_action, $1)=unsupported\nfi\nAC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])\n\nif test \"$_LT_TAGVAR(hardcode_action, $1)\" = relink ||\n   test \"$_LT_TAGVAR(inherit_rpath, $1)\" = yes; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test \"$shlibpath_overrides_runpath\" = yes ||\n     test \"$enable_shared\" = no; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n_LT_TAGDECL([], [hardcode_action], [0],\n    [How to hardcode a shared library path into an executable])\n])# _LT_LINKER_HARDCODE_LIBPATH\n\n\n# _LT_CMD_STRIPLIB\n# ----------------\nm4_defun([_LT_CMD_STRIPLIB],\n[m4_require([_LT_DECL_EGREP])\nstriplib=\nold_striplib=\nAC_MSG_CHECKING([whether stripping libraries is possible])\nif test -n \"$STRIP\" && $STRIP -V 2>&1 | $GREP \"GNU strip\" >/dev/null; then\n  test -z \"$old_striplib\" && old_striplib=\"$STRIP --strip-debug\"\n  test -z \"$striplib\" && striplib=\"$STRIP --strip-unneeded\"\n  AC_MSG_RESULT([yes])\nelse\n# FIXME - insert some real tests, host_os isn't really good enough\n  case $host_os in\n  darwin*)\n    if test -n \"$STRIP\" ; then\n      striplib=\"$STRIP -x\"\n      old_striplib=\"$STRIP -S\"\n      AC_MSG_RESULT([yes])\n    else\n      AC_MSG_RESULT([no])\n    fi\n    ;;\n  *)\n    AC_MSG_RESULT([no])\n    ;;\n  esac\nfi\n_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])\n_LT_DECL([], [striplib], [1])\n])# _LT_CMD_STRIPLIB\n\n\n# _LT_SYS_DYNAMIC_LINKER([TAG])\n# -----------------------------\n# PORTME Fill in your ld.so characteristics\nm4_defun([_LT_SYS_DYNAMIC_LINKER],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_OBJDUMP])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_CHECK_SHELL_FEATURES])dnl\nAC_MSG_CHECKING([dynamic linker characteristics])\nm4_if([$1],\n\t[], [\nif test \"$GCC\" = yes; then\n  case $host_os in\n    darwin*) lt_awk_arg=\"/^libraries:/,/LR/\" ;;\n    *) lt_awk_arg=\"/^libraries:/\" ;;\n  esac\n  case $host_os in\n    mingw* | cegcc*) lt_sed_strip_eq=\"s,=\\([[A-Za-z]]:\\),\\1,g\" ;;\n    *) lt_sed_strip_eq=\"s,=/,/,g\" ;;\n  esac\n  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e \"s/^libraries://\" -e $lt_sed_strip_eq`\n  case $lt_search_path_spec in\n  *\\;*)\n    # if the path contains \";\" then we assume it to be the separator\n    # otherwise default to the standard path separator (i.e. \":\") - it is\n    # assumed that no part of a normal pathname contains \";\" but that should\n    # okay in the real world where \";\" in dirpaths is itself problematic.\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED 's/;/ /g'`\n    ;;\n  *)\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED \"s/$PATH_SEPARATOR/ /g\"`\n    ;;\n  esac\n  # Ok, now we have the path, separated by spaces, we can step through it\n  # and add multilib dir if necessary.\n  lt_tmp_lt_search_path_spec=\n  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`\n  for lt_sys_path in $lt_search_path_spec; do\n    if test -d \"$lt_sys_path/$lt_multi_os_dir\"; then\n      lt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir\"\n    else\n      test -d \"$lt_sys_path\" && \\\n\tlt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path\"\n    fi\n  done\n  lt_search_path_spec=`$ECHO \"$lt_tmp_lt_search_path_spec\" | awk '\nBEGIN {RS=\" \"; FS=\"/|\\n\";} {\n  lt_foo=\"\";\n  lt_count=0;\n  for (lt_i = NF; lt_i > 0; lt_i--) {\n    if ($lt_i != \"\" && $lt_i != \".\") {\n      if ($lt_i == \"..\") {\n        lt_count++;\n      } else {\n        if (lt_count == 0) {\n          lt_foo=\"/\" $lt_i lt_foo;\n        } else {\n          lt_count--;\n        }\n      }\n    }\n  }\n  if (lt_foo != \"\") { lt_freq[[lt_foo]]++; }\n  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }\n}'`\n  # AWK program above erroneously prepends '/' to C:/dos/paths\n  # for these hosts.\n  case $host_os in\n    mingw* | cegcc*) lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" |\\\n      $SED 's,/\\([[A-Za-z]]:\\),\\1,g'` ;;\n  esac\n  sys_lib_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $lt_NL2SP`\nelse\n  sys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\nfi])\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\nshrext_cmds=\".so\"\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nneed_lib_prefix=unknown\nhardcode_into_libs=no\n\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\nneed_version=unknown\n\ncase $host_os in\naix3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX 3 has no versioning support, so we append a major version to the name.\n  soname_spec='${libname}${release}${shared_ext}$major'\n  ;;\n\naix[[4-9]]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  hardcode_into_libs=yes\n  if test \"$host_cpu\" = ia64; then\n    # AIX 5 supports IA64\n    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'\n    shlibpath_var=LD_LIBRARY_PATH\n  else\n    # With GCC up to 2.95.x, collect2 would create an import file\n    # for dependence libraries.  The import file would start with\n    # the line `#! .'.  This would cause the generated library to\n    # depend on `.', always an invalid library.  This was fixed in\n    # development snapshots of GCC prior to 3.0.\n    case $host_os in\n      aix4 | aix4.[[01]] | aix4.[[01]].*)\n      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'\n\t   echo ' yes '\n\t   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then\n\t:\n      else\n\tcan_build_shared=no\n      fi\n      ;;\n    esac\n    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct\n    # soname into executable. Probably we can add versioning support to\n    # collect2, so additional links can be useful in future.\n    if test \"$aix_use_runtimelinking\" = yes; then\n      # If using run time linking (on AIX 4.2 or later) use lib<name>.so\n      # instead of lib<name>.a to let people know that these are not\n      # typical AIX shared libraries.\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    else\n      # We preserve .a as extension for shared libraries through AIX4.2\n      # and later when we are not doing run time linking.\n      library_names_spec='${libname}${release}.a $libname.a'\n      soname_spec='${libname}${release}${shared_ext}$major'\n    fi\n    shlibpath_var=LIBPATH\n  fi\n  ;;\n\namigaos*)\n  case $host_cpu in\n  powerpc)\n    # Since July 2007 AmigaOS4 officially supports .so libraries.\n    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    ;;\n  m68k)\n    library_names_spec='$libname.ixlibrary $libname.a'\n    # Create ${libname}_ixlibrary.a entries in /sys/libs.\n    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all \"$lib\" | $SED '\\''s%^.*/\\([[^/]]*\\)\\.ixlibrary$%\\1%'\\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show \"cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a\"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'\n    ;;\n  esac\n  ;;\n\nbeos*)\n  library_names_spec='${libname}${shared_ext}'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  ;;\n\nbsdi[[45]]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw* | pw32* | cegcc*)\n  version_type=windows\n  shrext_cmds=\".dll\"\n  need_version=no\n  need_lib_prefix=no\n\n  case $GCC,$cc_basename in\n  yes,*)\n    # gcc\n    library_names_spec='$libname.dll.a'\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname~\n      chmod a+x \\$dldir/$dlname~\n      if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n        eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n      fi'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n\n    case $host_os in\n    cygwin*)\n      # Cygwin DLLs use 'cyg' prefix rather than 'lib'\n      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\nm4_if([$1], [],[\n      sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/lib/w32api\"])\n      ;;\n    mingw* | cegcc*)\n      # MinGW DLLs use traditional 'lib' prefix\n      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    pw32*)\n      # pw32 DLLs use 'pw' prefix rather than 'lib'\n      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    esac\n    dynamic_linker='Win32 ld.exe'\n    ;;\n\n  *,cl*)\n    # Native MSVC\n    libname_spec='$name'\n    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\n    library_names_spec='${libname}.dll.lib'\n\n    case $build_os in\n    mingw*)\n      sys_lib_search_path_spec=\n      lt_save_ifs=$IFS\n      IFS=';'\n      for lt_path in $LIB\n      do\n        IFS=$lt_save_ifs\n        # Let DOS variable expansion print the short 8.3 style file name.\n        lt_path=`cd \"$lt_path\" 2>/dev/null && cmd //C \"for %i in (\".\") do @echo %~si\"`\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec $lt_path\"\n      done\n      IFS=$lt_save_ifs\n      # Convert to MSYS style.\n      sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | sed -e 's|\\\\\\\\|/|g' -e 's| \\\\([[a-zA-Z]]\\\\):| /\\\\1|g' -e 's|^ ||'`\n      ;;\n    cygwin*)\n      # Convert to unix form, then to dos form, then back to unix form\n      # but this time dos style (no spaces!) so that the unix form looks\n      # like /cygdrive/c/PROGRA~1:/cygdr...\n      sys_lib_search_path_spec=`cygpath --path --unix \"$LIB\"`\n      sys_lib_search_path_spec=`cygpath --path --dos \"$sys_lib_search_path_spec\" 2>/dev/null`\n      sys_lib_search_path_spec=`cygpath --path --unix \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      ;;\n    *)\n      sys_lib_search_path_spec=\"$LIB\"\n      if $ECHO \"$sys_lib_search_path_spec\" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then\n        # It is most probably a Windows format PATH.\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e 's/;/ /g'`\n      else\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      fi\n      # FIXME: find the short name or the path components, as spaces are\n      # common. (e.g. \"Program Files\" -> \"PROGRA~1\")\n      ;;\n    esac\n\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n    dynamic_linker='Win32 link.exe'\n    ;;\n\n  *)\n    # Assume MSVC wrapper\n    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'\n    dynamic_linker='Win32 ld.exe'\n    ;;\n  esac\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  ;;\n\ndarwin* | rhapsody*)\n  dynamic_linker=\"$host_os dyld\"\n  version_type=darwin\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'\n  soname_spec='${libname}${release}${major}$shared_ext'\n  shlibpath_overrides_runpath=yes\n  shlibpath_var=DYLD_LIBRARY_PATH\n  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'\nm4_if([$1], [],[\n  sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/local/lib\"])\n  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'\n  ;;\n\ndgux*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nfreebsd* | dragonfly*)\n  # DragonFly does not have aout.  When/if they implement a new\n  # versioning mechanism, adjust this.\n  if test -x /usr/bin/objformat; then\n    objformat=`/usr/bin/objformat`\n  else\n    case $host_os in\n    freebsd[[23]].*) objformat=aout ;;\n    *) objformat=elf ;;\n    esac\n  fi\n  version_type=freebsd-$objformat\n  case $version_type in\n    freebsd-elf*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_os in\n  freebsd2.*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  freebsd3.[[01]]* | freebsdelf3.[[01]]*)\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \\\n  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)\n    shlibpath_overrides_runpath=no\n    hardcode_into_libs=yes\n    ;;\n  *) # from 4.6 on, and DragonFly\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  esac\n  ;;\n\nhaiku*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  dynamic_linker=\"$host_os runtime_loader\"\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'\n  hardcode_into_libs=yes\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  case $host_cpu in\n  ia64*)\n    shrext_cmds='.so'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.so\"\n    shlibpath_var=LD_LIBRARY_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    if test \"X$HPUX_IA64_MODE\" = X32; then\n      sys_lib_search_path_spec=\"/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib\"\n    else\n      sys_lib_search_path_spec=\"/usr/lib/hpux64 /usr/local/lib/hpux64\"\n    fi\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  hppa*64*)\n    shrext_cmds='.sl'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    sys_lib_search_path_spec=\"/usr/lib/pa20_64 /usr/ccs/lib/pa20_64\"\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  *)\n    shrext_cmds='.sl'\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=SHLIB_PATH\n    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    ;;\n  esac\n  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...\n  postinstall_cmds='chmod 555 $lib'\n  # or fails outright, so override atomically:\n  install_override_mode=555\n  ;;\n\ninterix[[3-9]]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n    nonstopux*) version_type=nonstopux ;;\n    *)\n\tif test \"$lt_cv_prog_gnu_ld\" = yes; then\n\t\tversion_type=linux # correct to gnu/linux during the next big refactor\n\telse\n\t\tversion_type=irix\n\tfi ;;\n  esac\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'\n  case $host_os in\n  irix5* | nonstopux*)\n    libsuff= shlibsuff=\n    ;;\n  *)\n    case $LD in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \"|*-melf32bsmip|*\"-melf32bsmip \")\n      libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \"|*-melf32bmipn32|*\"-melf32bmipn32 \")\n      libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \"|*-melf64bmip|*\"-melf64bmip \")\n      libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib${libsuff} /lib${libsuff}\"\n  hardcode_into_libs=yes\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux*oldld* | linux*aout* | linux*coff*)\n  dynamic_linker=no\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n\n  # Some binutils ld are patched to set DT_RUNPATH\n  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],\n    [lt_cv_shlibpath_overrides_runpath=no\n    save_LDFLAGS=$LDFLAGS\n    save_libdir=$libdir\n    eval \"libdir=/foo; wl=\\\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\\\"; \\\n\t LDFLAGS=\\\"\\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\\\"\"\n    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],\n      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep \"RUNPATH.*$libdir\" >/dev/null],\n\t [lt_cv_shlibpath_overrides_runpath=yes])])\n    LDFLAGS=$save_LDFLAGS\n    libdir=$save_libdir\n    ])\n  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  # Append ld.so.conf contents to the search path\n  if test -f /etc/ld.so.conf; then\n    lt_ld_extra=`awk '/^include / { system(sprintf(\"cd /etc; cat %s 2>/dev/null\", \\[$]2)); skip = 1; } { if (!skip) print \\[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[\t ]*hwcap[\t ]/d;s/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/\"//g;/^$/d' | tr '\\n' ' '`\n    sys_lib_dlsearch_path_spec=\"/lib /usr/lib $lt_ld_extra\"\n  fi\n\n  # We used to test for /lib/ld.so.1 and disable shared libraries on\n  # powerpc, because MkLinux only supported shared libraries with the\n  # GNU dynamic linker.  Since this was broken with cross compilers,\n  # most powerpc-linux boxes support dynamic linking these days and\n  # people can always --disable-shared, the test was removed, and we\n  # assume the GNU/Linux dynamic linker is in use.\n  dynamic_linker='GNU/Linux ld.so'\n  ;;\n\nnetbsdelf*-gnu)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='NetBSD ld.elf_so'\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  ;;\n\nnewsos6)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\n*nto* | *qnx*)\n  version_type=qnx\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='ldqnx.so'\n  ;;\n\nopenbsd*)\n  version_type=sunos\n  sys_lib_dlsearch_path_spec=\"/usr/lib\"\n  need_lib_prefix=no\n  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.\n  case $host_os in\n    openbsd3.3 | openbsd3.3.*)\tneed_version=yes ;;\n    *)\t\t\t\tneed_version=no  ;;\n  esac\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    case $host_os in\n      openbsd2.[[89]] | openbsd2.[[89]].*)\n\tshlibpath_overrides_runpath=no\n\t;;\n      *)\n\tshlibpath_overrides_runpath=yes\n\t;;\n      esac\n  else\n    shlibpath_overrides_runpath=yes\n  fi\n  ;;\n\nos2*)\n  libname_spec='$name'\n  shrext_cmds=\".dll\"\n  need_lib_prefix=no\n  library_names_spec='$libname${shared_ext} $libname.a'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=LIBPATH\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=\"$sys_lib_search_path_spec\"\n  ;;\n\nrdos*)\n  dynamic_linker=no\n  ;;\n\nsolaris*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test \"$with_gnu_ld\" = yes; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_vendor in\n    sni)\n      shlibpath_overrides_runpath=no\n      need_lib_prefix=no\n      runpath_var=LD_RUN_PATH\n      ;;\n    siemens)\n      need_lib_prefix=no\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      ;;\n  esac\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec ;then\n    version_type=linux # correct to gnu/linux during the next big refactor\n    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'\n    soname_spec='$libname${shared_ext}.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  version_type=freebsd-elf\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  if test \"$with_gnu_ld\" = yes; then\n    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'\n  else\n    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'\n    case $host_os in\n      sco3.2v5*)\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec /lib\"\n\t;;\n    esac\n  fi\n  sys_lib_dlsearch_path_spec='/usr/lib'\n  ;;\n\ntpf*)\n  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nuts4*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\nAC_MSG_RESULT([$dynamic_linker])\ntest \"$dynamic_linker\" = no && can_build_shared=no\n\nvariables_saved_for_relink=\"PATH $shlibpath_var $runpath_var\"\nif test \"$GCC\" = yes; then\n  variables_saved_for_relink=\"$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH\"\nfi\n\nif test \"${lt_cv_sys_lib_search_path_spec+set}\" = set; then\n  sys_lib_search_path_spec=\"$lt_cv_sys_lib_search_path_spec\"\nfi\nif test \"${lt_cv_sys_lib_dlsearch_path_spec+set}\" = set; then\n  sys_lib_dlsearch_path_spec=\"$lt_cv_sys_lib_dlsearch_path_spec\"\nfi\n\n_LT_DECL([], [variables_saved_for_relink], [1],\n    [Variables whose values should be saved in libtool wrapper scripts and\n    restored at link time])\n_LT_DECL([], [need_lib_prefix], [0],\n    [Do we need the \"lib\" prefix for modules?])\n_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])\n_LT_DECL([], [version_type], [0], [Library versioning type])\n_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])\n_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])\n_LT_DECL([], [shlibpath_overrides_runpath], [0],\n    [Is shlibpath searched before the hard-coded library search path?])\n_LT_DECL([], [libname_spec], [1], [Format of library name prefix])\n_LT_DECL([], [library_names_spec], [1],\n    [[List of archive names.  First name is the real one, the rest are links.\n    The last name is the one that the linker finds with -lNAME]])\n_LT_DECL([], [soname_spec], [1],\n    [[The coded name of the library, if different from the real name]])\n_LT_DECL([], [install_override_mode], [1],\n    [Permission mode override for installation of shared libraries])\n_LT_DECL([], [postinstall_cmds], [2],\n    [Command to use after installation of a shared archive])\n_LT_DECL([], [postuninstall_cmds], [2],\n    [Command to use after uninstallation of a shared archive])\n_LT_DECL([], [finish_cmds], [2],\n    [Commands used to finish a libtool library installation in a directory])\n_LT_DECL([], [finish_eval], [1],\n    [[As \"finish_cmds\", except a single script fragment to be evaled but\n    not shown]])\n_LT_DECL([], [hardcode_into_libs], [0],\n    [Whether we should hardcode library paths into libraries])\n_LT_DECL([], [sys_lib_search_path_spec], [2],\n    [Compile-time system search path for libraries])\n_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],\n    [Run-time system search path for libraries])\n])# _LT_SYS_DYNAMIC_LINKER\n\n\n# _LT_PATH_TOOL_PREFIX(TOOL)\n# --------------------------\n# find a file program which can recognize shared library\nAC_DEFUN([_LT_PATH_TOOL_PREFIX],\n[m4_require([_LT_DECL_EGREP])dnl\nAC_MSG_CHECKING([for $1])\nAC_CACHE_VAL(lt_cv_path_MAGIC_CMD,\n[case $MAGIC_CMD in\n[[\\\\/*] |  ?:[\\\\/]*])\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\ndnl $ac_dummy forces splitting on constant user-supplied paths.\ndnl POSIX.2 word splitting is done only on the output of word expansions,\ndnl not every word.  This closes a longstanding sh security hole.\n  ac_dummy=\"m4_if([$2], , $PATH, [$2])\"\n  for ac_dir in $ac_dummy; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/$1; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/$1\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\n  MAGIC_CMD=\"$lt_save_MAGIC_CMD\"\n  ;;\nesac])\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  AC_MSG_RESULT($MAGIC_CMD)\nelse\n  AC_MSG_RESULT(no)\nfi\n_LT_DECL([], [MAGIC_CMD], [0],\n\t [Used to examine libraries when file_magic_cmd begins with \"file\"])dnl\n])# _LT_PATH_TOOL_PREFIX\n\n# Old name:\nAU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])\n\n\n# _LT_PATH_MAGIC\n# --------------\n# find a file program which can recognize a shared library\nm4_defun([_LT_PATH_MAGIC],\n[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)\nif test -z \"$lt_cv_path_MAGIC_CMD\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)\n  else\n    MAGIC_CMD=:\n  fi\nfi\n])# _LT_PATH_MAGIC\n\n\n# LT_PATH_LD\n# ----------\n# find the pathname to the GNU or non-GNU linker\nAC_DEFUN([LT_PATH_LD],\n[AC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_PROG_ECHO_BACKSLASH])dnl\n\nAC_ARG_WITH([gnu-ld],\n    [AS_HELP_STRING([--with-gnu-ld],\n\t[assume the C compiler uses GNU ld @<:@default=no@:>@])],\n    [test \"$withval\" = no || with_gnu_ld=yes],\n    [with_gnu_ld=no])dnl\n\nac_prog=ld\nif test \"$GCC\" = yes; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  AC_MSG_CHECKING([for ld used by $CC])\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [[\\\\/]]* | ?:[[\\\\/]]*)\n      re_direlt='/[[^/]][[^/]]*/\\.\\./'\n      # Canonicalize the pathname of ld\n      ac_prog=`$ECHO \"$ac_prog\"| $SED 's%\\\\\\\\%/%g'`\n      while $ECHO \"$ac_prog\" | $GREP \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`$ECHO $ac_prog| $SED \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=\"$ac_prog\"\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test \"$with_gnu_ld\" = yes; then\n  AC_MSG_CHECKING([for GNU ld])\nelse\n  AC_MSG_CHECKING([for non-GNU ld])\nfi\nAC_CACHE_VAL(lt_cv_path_LD,\n[if test -z \"$LD\"; then\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      lt_cv_path_LD=\"$ac_dir/$ac_prog\"\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some variants of GNU ld only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      case `\"$lt_cv_path_LD\" -v 2>&1 </dev/null` in\n      *GNU* | *'with BFD'*)\n\ttest \"$with_gnu_ld\" != no && break\n\t;;\n      *)\n\ttest \"$with_gnu_ld\" != yes && break\n\t;;\n      esac\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\nelse\n  lt_cv_path_LD=\"$LD\" # Let the user override the test with a path.\nfi])\nLD=\"$lt_cv_path_LD\"\nif test -n \"$LD\"; then\n  AC_MSG_RESULT($LD)\nelse\n  AC_MSG_RESULT(no)\nfi\ntest -z \"$LD\" && AC_MSG_ERROR([no acceptable ld found in \\$PATH])\n_LT_PATH_LD_GNU\nAC_SUBST([LD])\n\n_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])\n])# LT_PATH_LD\n\n# Old names:\nAU_ALIAS([AM_PROG_LD], [LT_PATH_LD])\nAU_ALIAS([AC_PROG_LD], [LT_PATH_LD])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_PROG_LD], [])\ndnl AC_DEFUN([AC_PROG_LD], [])\n\n\n# _LT_PATH_LD_GNU\n#- --------------\nm4_defun([_LT_PATH_LD_GNU],\n[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,\n[# I'd rather use --version here, but apparently some GNU lds only accept -v.\ncase `$LD -v 2>&1 </dev/null` in\n*GNU* | *'with BFD'*)\n  lt_cv_prog_gnu_ld=yes\n  ;;\n*)\n  lt_cv_prog_gnu_ld=no\n  ;;\nesac])\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n])# _LT_PATH_LD_GNU\n\n\n# _LT_CMD_RELOAD\n# --------------\n# find reload flag for linker\n#   -- PORTME Some linkers may need a different reload flag.\nm4_defun([_LT_CMD_RELOAD],\n[AC_CACHE_CHECK([for $LD option to reload object files],\n  lt_cv_ld_reload_flag,\n  [lt_cv_ld_reload_flag='-r'])\nreload_flag=$lt_cv_ld_reload_flag\ncase $reload_flag in\n\"\" | \" \"*) ;;\n*) reload_flag=\" $reload_flag\" ;;\nesac\nreload_cmds='$LD$reload_flag -o $output$reload_objs'\ncase $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    if test \"$GCC\" != yes; then\n      reload_cmds=false\n    fi\n    ;;\n  darwin*)\n    if test \"$GCC\" = yes; then\n      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'\n    else\n      reload_cmds='$LD$reload_flag -o $output$reload_objs'\n    fi\n    ;;\nesac\n_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl\n_LT_TAGDECL([], [reload_cmds], [2])dnl\n])# _LT_CMD_RELOAD\n\n\n# _LT_CHECK_MAGIC_METHOD\n# ----------------------\n# how to check for library dependencies\n#  -- PORTME fill in with the dynamic library characteristics\nm4_defun([_LT_CHECK_MAGIC_METHOD],\n[m4_require([_LT_DECL_EGREP])\nm4_require([_LT_DECL_OBJDUMP])\nAC_CACHE_CHECK([how to recognize dependent libraries],\nlt_cv_deplibs_check_method,\n[lt_cv_file_magic_cmd='$MAGIC_CMD'\nlt_cv_file_magic_test_file=\nlt_cv_deplibs_check_method='unknown'\n# Need to set the preceding variable on all platforms that support\n# interlibrary dependencies.\n# 'none' -- dependencies not supported.\n# `unknown' -- same as none, but documents that we really don't know.\n# 'pass_all' -- all dependencies passed with no checks.\n# 'test_compile' -- check by making test program.\n# 'file_magic [[regex]]' -- check by looking for files in library path\n# which responds to the $file_magic_cmd with a given extended regex.\n# If you have `file' or equivalent on your system and you're not sure\n# whether `pass_all' will *always* work, you probably want this one.\n\ncase $host_os in\naix[[4-9]]*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbeos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbsdi[[45]]*)\n  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'\n  lt_cv_file_magic_cmd='/usr/bin/file -L'\n  lt_cv_file_magic_test_file=/shlib/libc.so\n  ;;\n\ncygwin*)\n  # func_win32_libid is a shell function defined in ltmain.sh\n  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n  lt_cv_file_magic_cmd='func_win32_libid'\n  ;;\n\nmingw* | pw32*)\n  # Base MSYS/MinGW do not provide the 'file' command needed by\n  # func_win32_libid shell function, so use a weaker test based on 'objdump',\n  # unless we find 'file', for example because we are cross-compiling.\n  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.\n  if ( test \"$lt_cv_nm_interface\" = \"BSD nm\" && file / ) >/dev/null 2>&1; then\n    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n    lt_cv_file_magic_cmd='func_win32_libid'\n  else\n    # Keep this pattern in sync with the one in func_win32_libid.\n    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'\n    lt_cv_file_magic_cmd='$OBJDUMP -f'\n  fi\n  ;;\n\ncegcc*)\n  # use the weaker test based on 'objdump'. See mingw*.\n  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'\n  lt_cv_file_magic_cmd='$OBJDUMP -f'\n  ;;\n\ndarwin* | rhapsody*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nfreebsd* | dragonfly*)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    case $host_cpu in\n    i*86 )\n      # Not sure whether the presence of OpenBSD here was a mistake.\n      # Let's accept both of them until this is cleared up.\n      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'\n      lt_cv_file_magic_cmd=/usr/bin/file\n      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`\n      ;;\n    esac\n  else\n    lt_cv_deplibs_check_method=pass_all\n  fi\n  ;;\n\nhaiku*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nhpux10.20* | hpux11*)\n  lt_cv_file_magic_cmd=/usr/bin/file\n  case $host_cpu in\n  ia64*)\n    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'\n    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so\n    ;;\n  hppa*64*)\n    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\\.[0-9]']\n    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl\n    ;;\n  *)\n    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\\.[[0-9]]) shared library'\n    lt_cv_file_magic_test_file=/usr/lib/libc.sl\n    ;;\n  esac\n  ;;\n\ninterix[[3-9]]*)\n  # PIC code is broken on Interix 3.x, that's why |\\.a not |_pic\\.a here\n  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so|\\.a)$'\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $LD in\n  *-32|*\"-32 \") libmagic=32-bit;;\n  *-n32|*\"-n32 \") libmagic=N32;;\n  *-64|*\"-64 \") libmagic=64-bit;;\n  *) libmagic=never-match;;\n  esac\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nnetbsd* | netbsdelf*-gnu)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so|_pic\\.a)$'\n  fi\n  ;;\n\nnewos6*)\n  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=/usr/lib/libnls.so\n  ;;\n\n*nto* | *qnx*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nopenbsd*)\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|\\.so|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|_pic\\.a)$'\n  fi\n  ;;\n\nosf3* | osf4* | osf5*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nrdos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsolaris*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv4 | sysv4.3*)\n  case $host_vendor in\n  motorola)\n    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'\n    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`\n    ;;\n  ncr)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  sequent)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'\n    ;;\n  sni)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method=\"file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib\"\n    lt_cv_file_magic_test_file=/lib/libc.so\n    ;;\n  siemens)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  pc)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  esac\n  ;;\n\ntpf*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\nesac\n])\n\nfile_magic_glob=\nwant_nocaseglob=no\nif test \"$build\" = \"$host\"; then\n  case $host_os in\n  mingw* | pw32*)\n    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then\n      want_nocaseglob=yes\n    else\n      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e \"s/\\(..\\)/s\\/[[\\1]]\\/[[\\1]]\\/g;/g\"`\n    fi\n    ;;\n  esac\nfi\n\nfile_magic_cmd=$lt_cv_file_magic_cmd\ndeplibs_check_method=$lt_cv_deplibs_check_method\ntest -z \"$deplibs_check_method\" && deplibs_check_method=unknown\n\n_LT_DECL([], [deplibs_check_method], [1],\n    [Method to check whether dependent libraries are shared objects])\n_LT_DECL([], [file_magic_cmd], [1],\n    [Command to use when deplibs_check_method = \"file_magic\"])\n_LT_DECL([], [file_magic_glob], [1],\n    [How to find potential files when deplibs_check_method = \"file_magic\"])\n_LT_DECL([], [want_nocaseglob], [1],\n    [Find potential files using nocaseglob when deplibs_check_method = \"file_magic\"])\n])# _LT_CHECK_MAGIC_METHOD\n\n\n# LT_PATH_NM\n# ----------\n# find the pathname to a BSD- or MS-compatible name lister\nAC_DEFUN([LT_PATH_NM],\n[AC_REQUIRE([AC_PROG_CC])dnl\nAC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,\n[if test -n \"$NM\"; then\n  # Let the user override the test.\n  lt_cv_path_NM=\"$NM\"\nelse\n  lt_nm_to_check=\"${ac_tool_prefix}nm\"\n  if test -n \"$ac_tool_prefix\" && test \"$build\" = \"$host\"; then\n    lt_nm_to_check=\"$lt_nm_to_check nm\"\n  fi\n  for lt_tmp_nm in $lt_nm_to_check; do\n    lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do\n      IFS=\"$lt_save_ifs\"\n      test -z \"$ac_dir\" && ac_dir=.\n      tmp_nm=\"$ac_dir/$lt_tmp_nm\"\n      if test -f \"$tmp_nm\" || test -f \"$tmp_nm$ac_exeext\" ; then\n\t# Check to see if the nm accepts a BSD-compat flag.\n\t# Adding the `sed 1q' prevents false positives on HP-UX, which says:\n\t#   nm: unknown option \"B\" ignored\n\t# Tru64's nm complains that /dev/null is an invalid object file\n\tcase `\"$tmp_nm\" -B /dev/null 2>&1 | sed '1q'` in\n\t*/dev/null* | *'Invalid file or object type'*)\n\t  lt_cv_path_NM=\"$tmp_nm -B\"\n\t  break\n\t  ;;\n\t*)\n\t  case `\"$tmp_nm\" -p /dev/null 2>&1 | sed '1q'` in\n\t  */dev/null*)\n\t    lt_cv_path_NM=\"$tmp_nm -p\"\n\t    break\n\t    ;;\n\t  *)\n\t    lt_cv_path_NM=${lt_cv_path_NM=\"$tmp_nm\"} # keep the first match, but\n\t    continue # so that we can try to find one that supports BSD flags\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n      fi\n    done\n    IFS=\"$lt_save_ifs\"\n  done\n  : ${lt_cv_path_NM=no}\nfi])\nif test \"$lt_cv_path_NM\" != \"no\"; then\n  NM=\"$lt_cv_path_NM\"\nelse\n  # Didn't find any BSD compatible name lister, look for dumpbin.\n  if test -n \"$DUMPBIN\"; then :\n    # Let the user override the test.\n  else\n    AC_CHECK_TOOLS(DUMPBIN, [dumpbin \"link -dump\"], :)\n    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in\n    *COFF*)\n      DUMPBIN=\"$DUMPBIN -symbols\"\n      ;;\n    *)\n      DUMPBIN=:\n      ;;\n    esac\n  fi\n  AC_SUBST([DUMPBIN])\n  if test \"$DUMPBIN\" != \":\"; then\n    NM=\"$DUMPBIN\"\n  fi\nfi\ntest -z \"$NM\" && NM=nm\nAC_SUBST([NM])\n_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl\n\nAC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],\n  [lt_cv_nm_interface=\"BSD nm\"\n  echo \"int some_variable = 0;\" > conftest.$ac_ext\n  (eval echo \"\\\"\\$as_me:$LINENO: $ac_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n  (eval \"$ac_compile\" 2>conftest.err)\n  cat conftest.err >&AS_MESSAGE_LOG_FD\n  (eval echo \"\\\"\\$as_me:$LINENO: $NM \\\\\\\"conftest.$ac_objext\\\\\\\"\\\"\" >&AS_MESSAGE_LOG_FD)\n  (eval \"$NM \\\"conftest.$ac_objext\\\"\" 2>conftest.err > conftest.out)\n  cat conftest.err >&AS_MESSAGE_LOG_FD\n  (eval echo \"\\\"\\$as_me:$LINENO: output\\\"\" >&AS_MESSAGE_LOG_FD)\n  cat conftest.out >&AS_MESSAGE_LOG_FD\n  if $GREP 'External.*some_variable' conftest.out > /dev/null; then\n    lt_cv_nm_interface=\"MS dumpbin\"\n  fi\n  rm -f conftest*])\n])# LT_PATH_NM\n\n# Old names:\nAU_ALIAS([AM_PROG_NM], [LT_PATH_NM])\nAU_ALIAS([AC_PROG_NM], [LT_PATH_NM])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_PROG_NM], [])\ndnl AC_DEFUN([AC_PROG_NM], [])\n\n# _LT_CHECK_SHAREDLIB_FROM_LINKLIB\n# --------------------------------\n# how to determine the name of the shared library\n# associated with a specific link library.\n#  -- PORTME fill in with the dynamic library characteristics\nm4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],\n[m4_require([_LT_DECL_EGREP])\nm4_require([_LT_DECL_OBJDUMP])\nm4_require([_LT_DECL_DLLTOOL])\nAC_CACHE_CHECK([how to associate runtime and link libraries],\nlt_cv_sharedlib_from_linklib_cmd,\n[lt_cv_sharedlib_from_linklib_cmd='unknown'\n\ncase $host_os in\ncygwin* | mingw* | pw32* | cegcc*)\n  # two different shell functions defined in ltmain.sh\n  # decide which to use based on capabilities of $DLLTOOL\n  case `$DLLTOOL --help 2>&1` in\n  *--identify-strict*)\n    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib\n    ;;\n  *)\n    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback\n    ;;\n  esac\n  ;;\n*)\n  # fallback: assume linklib IS sharedlib\n  lt_cv_sharedlib_from_linklib_cmd=\"$ECHO\"\n  ;;\nesac\n])\nsharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd\ntest -z \"$sharedlib_from_linklib_cmd\" && sharedlib_from_linklib_cmd=$ECHO\n\n_LT_DECL([], [sharedlib_from_linklib_cmd], [1],\n    [Command to associate shared and link libraries])\n])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB\n\n\n# _LT_PATH_MANIFEST_TOOL\n# ----------------------\n# locate the manifest tool\nm4_defun([_LT_PATH_MANIFEST_TOOL],\n[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)\ntest -z \"$MANIFEST_TOOL\" && MANIFEST_TOOL=mt\nAC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],\n  [lt_cv_path_mainfest_tool=no\n  echo \"$as_me:$LINENO: $MANIFEST_TOOL '-?'\" >&AS_MESSAGE_LOG_FD\n  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out\n  cat conftest.err >&AS_MESSAGE_LOG_FD\n  if $GREP 'Manifest Tool' conftest.out > /dev/null; then\n    lt_cv_path_mainfest_tool=yes\n  fi\n  rm -f conftest*])\nif test \"x$lt_cv_path_mainfest_tool\" != xyes; then\n  MANIFEST_TOOL=:\nfi\n_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl\n])# _LT_PATH_MANIFEST_TOOL\n\n\n# LT_LIB_M\n# --------\n# check for math library\nAC_DEFUN([LT_LIB_M],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nLIBM=\ncase $host in\n*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)\n  # These system don't have libm, or don't need it\n  ;;\n*-ncr-sysv4.3*)\n  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=\"-lmw\")\n  AC_CHECK_LIB(m, cos, LIBM=\"$LIBM -lm\")\n  ;;\n*)\n  AC_CHECK_LIB(m, cos, LIBM=\"-lm\")\n  ;;\nesac\nAC_SUBST([LIBM])\n])# LT_LIB_M\n\n# Old name:\nAU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_CHECK_LIBM], [])\n\n\n# _LT_COMPILER_NO_RTTI([TAGNAME])\n# -------------------------------\nm4_defun([_LT_COMPILER_NO_RTTI],\n[m4_require([_LT_TAG_COMPILER])dnl\n\n_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\n\nif test \"$GCC\" = yes; then\n  case $cc_basename in\n  nvcc*)\n    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;\n  *)\n    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;\n  esac\n\n  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],\n    lt_cv_prog_compiler_rtti_exceptions,\n    [-fno-rtti -fno-exceptions], [],\n    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\"$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions\"])\nfi\n_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],\n\t[Compiler flag to turn off builtin functions])\n])# _LT_COMPILER_NO_RTTI\n\n\n# _LT_CMD_GLOBAL_SYMBOLS\n# ----------------------\nm4_defun([_LT_CMD_GLOBAL_SYMBOLS],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([AC_PROG_AWK])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\nAC_REQUIRE([LT_PATH_LD])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_TAG_COMPILER])dnl\n\n# Check for command to grab the raw symbol name followed by C symbol from nm.\nAC_MSG_CHECKING([command to parse $NM output from $compiler object])\nAC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],\n[\n# These are sane defaults that work on at least a few old systems.\n# [They come from Ultrix.  What could be older than Ultrix?!! ;)]\n\n# Character class describing NM global symbol codes.\nsymcode='[[BCDEGRST]]'\n\n# Regexp to match symbols that can be accessed directly from C.\nsympat='\\([[_A-Za-z]][[_A-Za-z0-9]]*\\)'\n\n# Define system-specific variables.\ncase $host_os in\naix*)\n  symcode='[[BCDT]]'\n  ;;\ncygwin* | mingw* | pw32* | cegcc*)\n  symcode='[[ABCDGISTW]]'\n  ;;\nhpux*)\n  if test \"$host_cpu\" = ia64; then\n    symcode='[[ABCDEGRST]]'\n  fi\n  ;;\nirix* | nonstopux*)\n  symcode='[[BCDEGRST]]'\n  ;;\nosf*)\n  symcode='[[BCDEGQRST]]'\n  ;;\nsolaris*)\n  symcode='[[BDRT]]'\n  ;;\nsco3.2v5*)\n  symcode='[[DT]]'\n  ;;\nsysv4.2uw2*)\n  symcode='[[DT]]'\n  ;;\nsysv5* | sco5v6* | unixware* | OpenUNIX*)\n  symcode='[[ABDT]]'\n  ;;\nsysv4)\n  symcode='[[DFNSTU]]'\n  ;;\nesac\n\n# If we're using GNU nm, then use its standard symbol codes.\ncase `$NM -V 2>&1` in\n*GNU* | *'with BFD'*)\n  symcode='[[ABCDGIRSTW]]' ;;\nesac\n\n# Transform an extracted symbol line into a proper C declaration.\n# Some systems (esp. on ia64) link data and code symbols differently,\n# so use this general approach.\nlt_cv_sys_global_symbol_to_cdecl=\"sed -n -e 's/^T .* \\(.*\\)$/extern int \\1();/p' -e 's/^$symcode* .* \\(.*\\)$/extern char \\1;/p'\"\n\n# Transform an extracted symbol line into symbol name and symbol address\nlt_cv_sys_global_symbol_to_c_name_address=\"sed -n -e 's/^: \\([[^ ]]*\\)[[ ]]*$/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([[^ ]]*\\) \\([[^ ]]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p'\"\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix=\"sed -n -e 's/^: \\([[^ ]]*\\)[[ ]]*$/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([[^ ]]*\\) \\(lib[[^ ]]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p' -e 's/^$symcode* \\([[^ ]]*\\) \\([[^ ]]*\\)$/  {\\\"lib\\2\\\", (void *) \\&\\2},/p'\"\n\n# Handle CRLF in mingw tool chain\nopt_cr=\ncase $build_os in\nmingw*)\n  opt_cr=`$ECHO 'x\\{0,1\\}' | tr x '\\015'` # option cr in regexp\n  ;;\nesac\n\n# Try without a prefix underscore, then with it.\nfor ac_symprfx in \"\" \"_\"; do\n\n  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.\n  symxfrm=\"\\\\1 $ac_symprfx\\\\2 \\\\2\"\n\n  # Write the raw and C identifiers.\n  if test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n    # Fake it for dumpbin and say T for any non-static function\n    # and D for any global variable.\n    # Also find C++ and __fastcall symbols from MSVC++,\n    # which start with @ or ?.\n    lt_cv_sys_global_symbol_pipe=\"$AWK ['\"\\\n\"     {last_section=section; section=\\$ 3};\"\\\n\"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};\"\\\n\"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};\"\\\n\"     \\$ 0!~/External *\\|/{next};\"\\\n\"     / 0+ UNDEF /{next}; / UNDEF \\([^|]\\)*()/{next};\"\\\n\"     {if(hide[section]) next};\"\\\n\"     {f=0}; \\$ 0~/\\(\\).*\\|/{f=1}; {printf f ? \\\"T \\\" : \\\"D \\\"};\"\\\n\"     {split(\\$ 0, a, /\\||\\r/); split(a[2], s)};\"\\\n\"     s[1]~/^[@?]/{print s[1], s[1]; next};\"\\\n\"     s[1]~prfx {split(s[1],t,\\\"@\\\"); print t[1], substr(t[1],length(prfx))}\"\\\n\"     ' prfx=^$ac_symprfx]\"\n  else\n    lt_cv_sys_global_symbol_pipe=\"sed -n -e 's/^.*[[\t ]]\\($symcode$symcode*\\)[[\t ]][[\t ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'\"\n  fi\n  lt_cv_sys_global_symbol_pipe=\"$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'\"\n\n  # Check to see that the pipe works correctly.\n  pipe_works=no\n\n  rm -f conftest*\n  cat > conftest.$ac_ext <<_LT_EOF\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nchar nm_test_var;\nvoid nm_test_func(void);\nvoid nm_test_func(void){}\n#ifdef __cplusplus\n}\n#endif\nint main(){nm_test_var='a';nm_test_func();return(0);}\n_LT_EOF\n\n  if AC_TRY_EVAL(ac_compile); then\n    # Now try to grab the symbols.\n    nlist=conftest.nm\n    if AC_TRY_EVAL(NM conftest.$ac_objext \\| \"$lt_cv_sys_global_symbol_pipe\" \\> $nlist) && test -s \"$nlist\"; then\n      # Try sorting and uniquifying the output.\n      if sort \"$nlist\" | uniq > \"$nlist\"T; then\n\tmv -f \"$nlist\"T \"$nlist\"\n      else\n\trm -f \"$nlist\"T\n      fi\n\n      # Make sure that we snagged all the symbols we need.\n      if $GREP ' nm_test_var$' \"$nlist\" >/dev/null; then\n\tif $GREP ' nm_test_func$' \"$nlist\" >/dev/null; then\n\t  cat <<_LT_EOF > conftest.$ac_ext\n/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */\n#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)\n/* DATA imports from DLLs on WIN32 con't be const, because runtime\n   relocations are performed -- see ld's documentation on pseudo-relocs.  */\n# define LT@&t@_DLSYM_CONST\n#elif defined(__osf__)\n/* This system does not cope well with relocations in const data.  */\n# define LT@&t@_DLSYM_CONST\n#else\n# define LT@&t@_DLSYM_CONST const\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n_LT_EOF\n\t  # Now generate the symbol file.\n\t  eval \"$lt_cv_sys_global_symbol_to_cdecl\"' < \"$nlist\" | $GREP -v main >> conftest.$ac_ext'\n\n\t  cat <<_LT_EOF >> conftest.$ac_ext\n\n/* The mapping between symbol names and symbols.  */\nLT@&t@_DLSYM_CONST struct {\n  const char *name;\n  void       *address;\n}\nlt__PROGRAM__LTX_preloaded_symbols[[]] =\n{\n  { \"@PROGRAM@\", (void *) 0 },\n_LT_EOF\n\t  $SED \"s/^$symcode$symcode* \\(.*\\) \\(.*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/\" < \"$nlist\" | $GREP -v main >> conftest.$ac_ext\n\t  cat <<\\_LT_EOF >> conftest.$ac_ext\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt__PROGRAM__LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n_LT_EOF\n\t  # Now try linking the two files.\n\t  mv conftest.$ac_objext conftstm.$ac_objext\n\t  lt_globsym_save_LIBS=$LIBS\n\t  lt_globsym_save_CFLAGS=$CFLAGS\n\t  LIBS=\"conftstm.$ac_objext\"\n\t  CFLAGS=\"$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)\"\n\t  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then\n\t    pipe_works=yes\n\t  fi\n\t  LIBS=$lt_globsym_save_LIBS\n\t  CFLAGS=$lt_globsym_save_CFLAGS\n\telse\n\t  echo \"cannot find nm_test_func in $nlist\" >&AS_MESSAGE_LOG_FD\n\tfi\n      else\n\techo \"cannot find nm_test_var in $nlist\" >&AS_MESSAGE_LOG_FD\n      fi\n    else\n      echo \"cannot run $lt_cv_sys_global_symbol_pipe\" >&AS_MESSAGE_LOG_FD\n    fi\n  else\n    echo \"$progname: failed program was:\" >&AS_MESSAGE_LOG_FD\n    cat conftest.$ac_ext >&5\n  fi\n  rm -rf conftest* conftst*\n\n  # Do not use the global_symbol_pipe unless it works.\n  if test \"$pipe_works\" = yes; then\n    break\n  else\n    lt_cv_sys_global_symbol_pipe=\n  fi\ndone\n])\nif test -z \"$lt_cv_sys_global_symbol_pipe\"; then\n  lt_cv_sys_global_symbol_to_cdecl=\nfi\nif test -z \"$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl\"; then\n  AC_MSG_RESULT(failed)\nelse\n  AC_MSG_RESULT(ok)\nfi\n\n# Response file support.\nif test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n  nm_file_list_spec='@'\nelif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then\n  nm_file_list_spec='@'\nfi\n\n_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],\n    [Take the output of nm and produce a listing of raw symbols and C names])\n_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],\n    [Transform the output of nm in a proper C declaration])\n_LT_DECL([global_symbol_to_c_name_address],\n    [lt_cv_sys_global_symbol_to_c_name_address], [1],\n    [Transform the output of nm in a C name address pair])\n_LT_DECL([global_symbol_to_c_name_address_lib_prefix],\n    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],\n    [Transform the output of nm in a C name address pair when lib prefix is needed])\n_LT_DECL([], [nm_file_list_spec], [1],\n    [Specify filename containing input files for $NM])\n]) # _LT_CMD_GLOBAL_SYMBOLS\n\n\n# _LT_COMPILER_PIC([TAGNAME])\n# ---------------------------\nm4_defun([_LT_COMPILER_PIC],\n[m4_require([_LT_TAG_COMPILER])dnl\n_LT_TAGVAR(lt_prog_compiler_wl, $1)=\n_LT_TAGVAR(lt_prog_compiler_pic, $1)=\n_LT_TAGVAR(lt_prog_compiler_static, $1)=\n\nm4_if([$1], [CXX], [\n  # C++ specific cases for pic, static, wl, etc.\n  if test \"$GXX\" = yes; then\n    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\n    case $host_os in\n    aix*)\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the `-m68020' flag to GCC prevents building anything better,\n            # like `-m68040'.\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n    mingw* | cygwin* | os2* | pw32* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      ;;\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'\n      ;;\n    *djgpp*)\n      # DJGPP does not support shared libraries at all\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n      ;;\n    haiku*)\n      # PIC is the default for Haiku.\n      # The \"-static\" flag exists, but is broken.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)=\n      ;;\n    interix[[3-9]]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic\n      fi\n      ;;\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t;;\n      esac\n      ;;\n    *qnx* | *nto*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n    *)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n      ;;\n    esac\n  else\n    case $host_os in\n      aix[[4-9]]*)\n\t# All AIX code is PIC.\n\tif test \"$host_cpu\" = ia64; then\n\t  # AIX 5 now supports IA64 processor\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\telse\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'\n\tfi\n\t;;\n      chorus*)\n\tcase $cc_basename in\n\tcxch68*)\n\t  # Green Hills C++ Compiler\n\t  # _LT_TAGVAR(lt_prog_compiler_static, $1)=\"--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a\"\n\t  ;;\n\tesac\n\t;;\n      mingw* | cygwin* | os2* | pw32* | cegcc*)\n\t# This hack is so that the source file can tell whether it is being\n\t# built for inclusion in a dll (and should export symbols for example).\n\tm4_if([$1], [GCJ], [],\n\t  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n\t;;\n      dgux*)\n\tcase $cc_basename in\n\t  ec++*)\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    ;;\n\t  ghcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      freebsd* | dragonfly*)\n\t# FreeBSD uses GNU C++\n\t;;\n      hpux9* | hpux10* | hpux11*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'\n\t    if test \"$host_cpu\" != ia64; then\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t    fi\n\t    ;;\n\t  aCC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'\n\t    case $host_cpu in\n\t    hppa*64*|ia64*)\n\t      # +Z the default\n\t      ;;\n\t    *)\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t      ;;\n\t    esac\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      interix*)\n\t# This is c89, which is MS Visual C++ (no shared libs)\n\t# Anyone wants to do a port?\n\t;;\n      irix5* | irix6* | nonstopux*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    # CC pic flag -KPIC is the default.\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n\tcase $cc_basename in\n\t  KCC*)\n\t    # KAI C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t    ;;\n\t  ecpc* )\n\t    # old Intel C++ for x86_64 which still supported -KPIC.\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\t    ;;\n\t  icpc* )\n\t    # Intel C++, used to be incompatible with GCC.\n\t    # ICC 10 doesn't accept -KPIC any more.\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\t    ;;\n\t  pgCC* | pgcpp*)\n\t    # Portland Group C++ compiler\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    ;;\n\t  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)\n\t    # IBM XL 8.0, 9.0 on PPC and BlueGene\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n      lynxos*)\n\t;;\n      m88k*)\n\t;;\n      mvs*)\n\tcase $cc_basename in\n\t  cxx*)\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      netbsd* | netbsdelf*-gnu)\n\t;;\n      *qnx* | *nto*)\n        # QNX uses GNU C++, but need to define -shared option too, otherwise\n        # it will coredump.\n        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n        ;;\n      osf3* | osf4* | osf5*)\n\tcase $cc_basename in\n\t  KCC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'\n\t    ;;\n\t  RCC*)\n\t    # Rational C++ 2.4.1\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  cxx*)\n\t    # Digital/Compaq C++\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      psos*)\n\t;;\n      solaris*)\n\tcase $cc_basename in\n\t  CC* | sunCC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n\t    ;;\n\t  gcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sunos4*)\n\tcase $cc_basename in\n\t  CC*)\n\t    # Sun C++ 4.x\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\t  lcc*)\n\t    # Lucid\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\tesac\n\t;;\n      tandem*)\n\tcase $cc_basename in\n\t  NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      vxworks*)\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n\t;;\n    esac\n  fi\n],\n[\n  if test \"$GCC\" = yes; then\n    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\n    case $host_os in\n      aix*)\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the `-m68020' flag to GCC prevents building anything better,\n            # like `-m68040'.\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      ;;\n\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'\n      ;;\n\n    haiku*)\n      # PIC is the default for Haiku.\n      # The \"-static\" flag exists, but is broken.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)=\n      ;;\n\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t# +Z the default\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t;;\n      esac\n      ;;\n\n    interix[[3-9]]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n\n    msdosdjgpp*)\n      # Just because we use GCC doesn't mean we suddenly get shared libraries\n      # on systems that don't support them.\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      enable_shared=no\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic\n      fi\n      ;;\n\n    *)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n      ;;\n    esac\n\n    case $cc_basename in\n    nvcc*) # Cuda Compiler Driver 2.2\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '\n      if test -n \"$_LT_TAGVAR(lt_prog_compiler_pic, $1)\"; then\n        _LT_TAGVAR(lt_prog_compiler_pic, $1)=\"-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)\"\n      fi\n      ;;\n    esac\n  else\n    # PORTME Check for flag to pass linker flags through the system compiler.\n    case $host_os in\n    aix*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      else\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'\n      fi\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      ;;\n\n    hpux9* | hpux10* | hpux11*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but\n      # not for PA HP-UX.\n      case $host_cpu in\n      hppa*64*|ia64*)\n\t# +Z the default\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t;;\n      esac\n      # Is there a better lt_prog_compiler_static that works with the bundled CC?\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # PIC (with -KPIC) is the default.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n      case $cc_basename in\n      # old Intel for x86_64 which still supported -KPIC.\n      ecc*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n        ;;\n      # icc used to be incompatible with GCC.\n      # ICC 10 doesn't accept -KPIC any more.\n      icc* | ifort*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n        ;;\n      # Lahey Fortran 8.1.\n      lf95*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'\n\t;;\n      nagfor*)\n\t# NAG Fortran compiler\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t;;\n      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)\n        # Portland Group compilers (*not* the Pentium gcc compiler,\n\t# which looks to be a dead project)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n        ;;\n      ccc*)\n        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n        # All Alpha code is PIC.\n        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n        ;;\n      xl* | bgxl* | bgf* | mpixl*)\n\t# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'\n\t;;\n      *)\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ Ceres\\ Fortran* | *Sun*Fortran*\\ [[1-7]].* | *Sun*Fortran*\\ 8.[[0-3]]*)\n\t  # Sun Fortran 8.3 passes all unrecognized flags to the linker\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''\n\t  ;;\n\t*Sun\\ F* | *Sun*Fortran*)\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n\t  ;;\n\t*Sun\\ C*)\n\t  # Sun C 5.9\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t  ;;\n        *Intel*\\ [[CF]]*Compiler*)\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\t  ;;\n\t*Portland\\ Group*)\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  ;;\n\tesac\n\t;;\n      esac\n      ;;\n\n    newsos6)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n\n    osf3* | osf4* | osf5*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # All OSF/1 code is PIC.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    rdos*)\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    solaris*)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      case $cc_basename in\n      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;\n      esac\n      ;;\n\n    sunos4*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    sysv4 | sysv4.2uw2* | sysv4.3*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec ;then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      ;;\n\n    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    unicos*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      ;;\n\n    uts4*)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    *)\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      ;;\n    esac\n  fi\n])\ncase $host_os in\n  # For platforms which do not support PIC, -DPIC is meaningless:\n  *djgpp*)\n    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n    ;;\n  *)\n    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\"$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])\"\n    ;;\nesac\n\nAC_CACHE_CHECK([for $compiler option to produce PIC],\n  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],\n  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])\n_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)\n\n#\n# Check to make sure the PIC flag actually works.\n#\nif test -n \"$_LT_TAGVAR(lt_prog_compiler_pic, $1)\"; then\n  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],\n    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],\n    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],\n    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in\n     \"\" | \" \"*) ;;\n     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=\" $_LT_TAGVAR(lt_prog_compiler_pic, $1)\" ;;\n     esac],\n    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=\n     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])\nfi\n_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],\n\t[Additional compiler flags for building library objects])\n\n_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],\n\t[How to pass a linker flag through the compiler])\n#\n# Check to make sure the static flag actually works.\n#\nwl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\\\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\\\"\n_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],\n  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),\n  $lt_tmp_static_flag,\n  [],\n  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])\n_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],\n\t[Compiler flag to prevent dynamic linking])\n])# _LT_COMPILER_PIC\n\n\n# _LT_LINKER_SHLIBS([TAGNAME])\n# ----------------------------\n# See if the linker supports building shared libraries.\nm4_defun([_LT_LINKER_SHLIBS],\n[AC_REQUIRE([LT_PATH_LD])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\nm4_require([_LT_PATH_MANIFEST_TOOL])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl\nm4_require([_LT_TAG_COMPILER])dnl\nAC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])\nm4_if([$1], [CXX], [\n  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']\n  case $host_os in\n  aix[[4-9]]*)\n    # If we're using GNU nm, then we don't want the \"-C\" option.\n    # -C means demangle to AIX nm, but means don't demangle with GNU nm\n    # Also, AIX nm treats weak defined symbols like other global defined\n    # symbols, whereas GNU nm marks them as \"W\".\n    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"W\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n    else\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n    fi\n    ;;\n  pw32*)\n    _LT_TAGVAR(export_symbols_cmds, $1)=\"$ltdll_cmds\"\n    ;;\n  cygwin* | mingw* | cegcc*)\n    case $cc_basename in\n    cl*)\n      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'\n      ;;\n    *)\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\\([[^ ]]*\\)/\\1 DATA/;s/^.*[[ ]]__nm__\\([[^ ]]*\\)[[ ]][[^ ]]*/\\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\\'' | sort | uniq > $export_symbols'\n      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']\n      ;;\n    esac\n    ;;\n  linux* | k*bsd*-gnu | gnu*)\n    _LT_TAGVAR(link_all_deplibs, $1)=no\n    ;;\n  *)\n    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n    ;;\n  esac\n], [\n  runpath_var=\n  _LT_TAGVAR(allow_undefined_flag, $1)=\n  _LT_TAGVAR(always_export_symbols, $1)=no\n  _LT_TAGVAR(archive_cmds, $1)=\n  _LT_TAGVAR(archive_expsym_cmds, $1)=\n  _LT_TAGVAR(compiler_needs_object, $1)=no\n  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n  _LT_TAGVAR(export_dynamic_flag_spec, $1)=\n  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  _LT_TAGVAR(hardcode_automatic, $1)=no\n  _LT_TAGVAR(hardcode_direct, $1)=no\n  _LT_TAGVAR(hardcode_direct_absolute, $1)=no\n  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n  _LT_TAGVAR(hardcode_libdir_separator, $1)=\n  _LT_TAGVAR(hardcode_minus_L, $1)=no\n  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n  _LT_TAGVAR(inherit_rpath, $1)=no\n  _LT_TAGVAR(link_all_deplibs, $1)=unknown\n  _LT_TAGVAR(module_cmds, $1)=\n  _LT_TAGVAR(module_expsym_cmds, $1)=\n  _LT_TAGVAR(old_archive_from_new_cmds, $1)=\n  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=\n  _LT_TAGVAR(thread_safe_flag_spec, $1)=\n  _LT_TAGVAR(whole_archive_flag_spec, $1)=\n  # include_expsyms should be a list of space-separated symbols to be *always*\n  # included in the symbol list\n  _LT_TAGVAR(include_expsyms, $1)=\n  # exclude_expsyms can be an extended regexp of symbols to exclude\n  # it will be wrapped by ` (' and `)$', so one must not match beginning or\n  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',\n  # as well as any symbol that contains `d'.\n  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']\n  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out\n  # platforms (ab)use it in PIC code, but their linkers get confused if\n  # the symbol is explicitly referenced.  Since portable code cannot\n  # rely on this symbol name, it's probably fine to never include it in\n  # preloaded symbol tables.\n  # Exclude shared library initialization/finalization symbols.\ndnl Note also adjust exclude_expsyms for C++ above.\n  extract_expsyms_cmds=\n\n  case $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    # FIXME: the MSVC++ port hasn't been tested in a loooong time\n    # When not using gcc, we currently assume that we are using\n    # Microsoft Visual C++.\n    if test \"$GCC\" != yes; then\n      with_gnu_ld=no\n    fi\n    ;;\n  interix*)\n    # we just hope/assume this is gcc and not c89 (= MSVC++)\n    with_gnu_ld=yes\n    ;;\n  openbsd*)\n    with_gnu_ld=no\n    ;;\n  linux* | k*bsd*-gnu | gnu*)\n    _LT_TAGVAR(link_all_deplibs, $1)=no\n    ;;\n  esac\n\n  _LT_TAGVAR(ld_shlibs, $1)=yes\n\n  # On some targets, GNU ld is compatible enough with the native linker\n  # that we're better off using the native interface for both.\n  lt_use_gnu_ld_interface=no\n  if test \"$with_gnu_ld\" = yes; then\n    case $host_os in\n      aix*)\n\t# The AIX port of GNU ld has always aspired to compatibility\n\t# with the native linker.  However, as the warning in the GNU ld\n\t# block says, versions before 2.19.5* couldn't really create working\n\t# shared libraries, regardless of the interface used.\n\tcase `$LD -v 2>&1` in\n\t  *\\ \\(GNU\\ Binutils\\)\\ 2.19.5*) ;;\n\t  *\\ \\(GNU\\ Binutils\\)\\ 2.[[2-9]]*) ;;\n\t  *\\ \\(GNU\\ Binutils\\)\\ [[3-9]]*) ;;\n\t  *)\n\t    lt_use_gnu_ld_interface=yes\n\t    ;;\n\tesac\n\t;;\n      *)\n\tlt_use_gnu_ld_interface=yes\n\t;;\n    esac\n  fi\n\n  if test \"$lt_use_gnu_ld_interface\" = yes; then\n    # If archive_cmds runs LD, not CC, wlarc should be empty\n    wlarc='${wl}'\n\n    # Set some defaults for GNU ld with shared library support. These\n    # are reset later if shared libraries are not supported. Putting them\n    # here allows them to be overridden if necessary.\n    runpath_var=LD_RUN_PATH\n    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n    # ancient GNU ld didn't support --whole-archive et. al.\n    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n    else\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=\n    fi\n    supports_anon_versioning=no\n    case `$LD -v 2>&1` in\n      *GNU\\ gold*) supports_anon_versioning=yes ;;\n      *\\ [[01]].* | *\\ 2.[[0-9]].* | *\\ 2.10.*) ;; # catch versions < 2.11\n      *\\ 2.11.93.0.2\\ *) supports_anon_versioning=yes ;; # RH7.3 ...\n      *\\ 2.11.92.0.12\\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...\n      *\\ 2.11.*) ;; # other 2.11 versions\n      *) supports_anon_versioning=yes ;;\n    esac\n\n    # See if GNU ld supports shared libraries.\n    case $host_os in\n    aix[[3-9]]*)\n      # On AIX/PPC, the GNU linker is very broken\n      if test \"$host_cpu\" != ia64; then\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: the GNU linker, at least up to release 2.19, is reported\n*** to be unable to reliably create shared libraries on AIX.\n*** Therefore, libtool is disabling shared libraries support.  If you\n*** really care for shared libraries, you may want to install binutils\n*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.\n*** You will then need to restart the configuration process.\n\n_LT_EOF\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            _LT_TAGVAR(archive_expsym_cmds, $1)=''\n        ;;\n      m68k)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes\n        ;;\n      esac\n      ;;\n\n    beos*)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t# Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t# support --undefined.  This deserves some investigation.  FIXME\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,\n      # as there is no search path for DLLs.\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      _LT_TAGVAR(always_export_symbols, $1)=no\n      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\\([[^ ]]*\\)/\\1 DATA/;s/^.*[[ ]]__nm__\\([[^ ]]*\\)[[ ]][[^ ]]*/\\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\\'' | sort | uniq > $export_symbols'\n      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']\n\n      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t# If the export-symbols file already is a .def file (1st line\n\t# is EXPORTS), use it as is; otherwise, prepend...\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t  cp $export_symbols $output_objdir/$soname.def;\n\telse\n\t  echo EXPORTS > $output_objdir/$soname.def;\n\t  cat $export_symbols >> $output_objdir/$soname.def;\n\tfi~\n\t$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    haiku*)\n      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      ;;\n\n    interix[[3-9]]*)\n      _LT_TAGVAR(hardcode_direct, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n      # Instead, shared libraries are loaded at an image base (0x10000000 by\n      # default) and relocated if they conflict, which is a slow very memory\n      # consuming and fragmenting process.  To avoid this, we pick a random,\n      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      _LT_TAGVAR(archive_expsym_cmds, $1)='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      ;;\n\n    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)\n      tmp_diet=no\n      if test \"$host_os\" = linux-dietlibc; then\n\tcase $cc_basename in\n\t  diet\\ *) tmp_diet=yes;;\t# linux-dietlibc with static linking (!diet-dyn)\n\tesac\n      fi\n      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \\\n\t && test \"$tmp_diet\" = no\n      then\n\ttmp_addflag=' $pic_flag'\n\ttmp_sharedflag='-shared'\n\tcase $cc_basename,$host_cpu in\n        pgcc*)\t\t\t\t# Portland Group C compiler\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag'\n\t  ;;\n\tpgf77* | pgf90* | pgf95* | pgfortran*)\n\t\t\t\t\t# Portland Group f77 and f90 compilers\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag -Mnomain' ;;\n\tecc*,ia64* | icc*,ia64*)\t# Intel C compiler on ia64\n\t  tmp_addflag=' -i_dynamic' ;;\n\tefc*,ia64* | ifort*,ia64*)\t# Intel Fortran compiler on ia64\n\t  tmp_addflag=' -i_dynamic -nofor_main' ;;\n\tifc* | ifort*)\t\t\t# Intel Fortran compiler\n\t  tmp_addflag=' -nofor_main' ;;\n\tlf95*)\t\t\t\t# Lahey Fortran 8.1\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)=\n\t  tmp_sharedflag='--shared' ;;\n\txl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)\n\t  tmp_sharedflag='-qmkshrobj'\n\t  tmp_addflag= ;;\n\tnvcc*)\t# Cuda Compiler Driver 2.2\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  _LT_TAGVAR(compiler_needs_object, $1)=yes\n\t  ;;\n\tesac\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ C*)\t\t\t# Sun C 5.9\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  _LT_TAGVAR(compiler_needs_object, $1)=yes\n\t  tmp_sharedflag='-G' ;;\n\t*Sun\\ F*)\t\t\t# Sun Fortran 8.3\n\t  tmp_sharedflag='-G' ;;\n\tesac\n\t_LT_TAGVAR(archive_cmds, $1)='$CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\n        if test \"x$supports_anon_versioning\" = xyes; then\n          _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t    cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t    echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t    $CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'\n        fi\n\n\tcase $cc_basename in\n\txlf* | bgf* | bgxlf* | mpixlf*)\n\t  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'\n\t  if test \"x$supports_anon_versioning\" = xyes; then\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t      cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t      echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'\n\t  fi\n\t  ;;\n\tesac\n      else\n        _LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'\n\twlarc=\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      fi\n      ;;\n\n    solaris*)\n      if $LD -v 2>&1 | $GREP 'BFD 2\\.8' > /dev/null; then\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: The releases 2.8.* of the GNU linker cannot reliably\n*** create shared libraries on Solaris systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.9.1 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)\n      case `$LD -v 2>&1` in\n        *\\ [[01]].* | *\\ 2.[[0-9]].* | *\\ 2.1[[0-5]].*)\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not\n*** reliably create shared libraries on SCO systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n\t;;\n\t*)\n\t  # For security reasons, it is highly recommended that you always\n\t  # use absolute paths for naming shared libraries, and exclude the\n\t  # DT_RUNPATH tag from executables and libraries.  But doing so\n\t  # requires that you compile everything twice, which is a pain.\n\t  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t  else\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t  fi\n\t;;\n      esac\n      ;;\n\n    sunos4*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      wlarc=\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n    esac\n\n    if test \"$_LT_TAGVAR(ld_shlibs, $1)\" = no; then\n      runpath_var=\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)=\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=\n    fi\n  else\n    # PORTME fill in a description of your system's linker (not GNU ld)\n    case $host_os in\n    aix3*)\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      _LT_TAGVAR(always_export_symbols, $1)=yes\n      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'\n      # Note: this linker hardcodes the directories in LIBPATH if there\n      # are no directories specified by -L.\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      if test \"$GCC\" = yes && test -z \"$lt_prog_compiler_static\"; then\n\t# Neither direct hardcoding nor static linking is supported with a\n\t# broken collect2.\n\t_LT_TAGVAR(hardcode_direct, $1)=unsupported\n      fi\n      ;;\n\n    aix[[4-9]]*)\n      if test \"$host_cpu\" = ia64; then\n\t# On IA64, the linker does run time linking by default, so we don't\n\t# have to do anything special.\n\taix_use_runtimelinking=no\n\texp_sym_flag='-Bexport'\n\tno_entry_flag=\"\"\n      else\n\t# If we're using GNU nm, then we don't want the \"-C\" option.\n\t# -C means demangle to AIX nm, but means don't demangle with GNU nm\n\t# Also, AIX nm treats weak defined symbols like other global\n\t# defined symbols, whereas GNU nm marks them as \"W\".\n\tif $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n\t  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"W\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\telse\n\t  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\tfi\n\taix_use_runtimelinking=no\n\n\t# Test if we are trying to use run time linking or normal\n\t# AIX style linking. If -brtl is somewhere in LDFLAGS, we\n\t# need to do runtime linking.\n\tcase $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)\n\t  for ld_flag in $LDFLAGS; do\n\t  if (test $ld_flag = \"-brtl\" || test $ld_flag = \"-Wl,-brtl\"); then\n\t    aix_use_runtimelinking=yes\n\t    break\n\t  fi\n\t  done\n\t  ;;\n\tesac\n\n\texp_sym_flag='-bexport'\n\tno_entry_flag='-bnoentry'\n      fi\n\n      # When large executables or shared objects are built, AIX ld can\n      # have problems creating the table of contents.  If linking a library\n      # or program results in \"error TOC overflow\" add -mminimal-toc to\n      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n      _LT_TAGVAR(archive_cmds, $1)=''\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'\n\n      if test \"$GCC\" = yes; then\n\tcase $host_os in aix4.[[012]]|aix4.[[012]].*)\n\t# We only want to do this on AIX 4.2 and lower, the check\n\t# below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`${CC} -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t   strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t  # We have reworked collect2\n\t  :\n\t  else\n\t  # We have old collect2\n\t  _LT_TAGVAR(hardcode_direct, $1)=unsupported\n\t  # It fails to find uninstalled libraries when the uninstalled\n\t  # path is not listed in the libpath.  Setting hardcode_minus_L\n\t  # to unsupported forces relinking\n\t  _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n\t  _LT_TAGVAR(hardcode_libdir_separator, $1)=\n\t  fi\n\t  ;;\n\tesac\n\tshared_flag='-shared'\n\tif test \"$aix_use_runtimelinking\" = yes; then\n\t  shared_flag=\"$shared_flag \"'${wl}-G'\n\tfi\n\t_LT_TAGVAR(link_all_deplibs, $1)=no\n      else\n\t# not using gcc\n\tif test \"$host_cpu\" = ia64; then\n\t# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t# chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n\telse\n\t  if test \"$aix_use_runtimelinking\" = yes; then\n\t    shared_flag='${wl}-G'\n\t  else\n\t    shared_flag='${wl}-bM:SRE'\n\t  fi\n\tfi\n      fi\n\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'\n      # It seems that -bexpall does not export symbols beginning with\n      # underscore (_), so it is better to generate a list of symbols to export.\n      _LT_TAGVAR(always_export_symbols, $1)=yes\n      if test \"$aix_use_runtimelinking\" = yes; then\n\t# Warning - without using the other runtime loading flags (-brtl),\n\t# -berok will link without error, but may produce a broken library.\n\t_LT_TAGVAR(allow_undefined_flag, $1)='-berok'\n        # Determine the default libpath from the value encoded in an\n        # empty executable.\n        _LT_SYS_MODULE_PATH_AIX([$1])\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then func_echo_all \"${wl}${allow_undefined_flag}\"; else :; fi` '\"\\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n      else\n\tif test \"$host_cpu\" = ia64; then\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=\"-z nodefs\"\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$exp_sym_flag:\\$export_symbols\"\n\telse\n\t # Determine the default libpath from the value encoded in an\n\t # empty executable.\n\t _LT_SYS_MODULE_PATH_AIX([$1])\n\t _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\t  # Warning - without using the other run time loading flags,\n\t  # -berok will link without error, but may produce a broken library.\n\t  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'\n\t  if test \"$with_gnu_ld\" = yes; then\n\t    # We only use this code for GNU lds that support --whole-archive.\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'\n\t  else\n\t    # Exported symbols can be pulled into shared objects from archives\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'\n\t  fi\n\t  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\t  # This is similar to how AIX traditionally builds its shared libraries.\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'\n\tfi\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            _LT_TAGVAR(archive_expsym_cmds, $1)=''\n        ;;\n      m68k)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes\n        ;;\n      esac\n      ;;\n\n    bsdi[[45]]*)\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # When not using gcc, we currently assume that we are using\n      # Microsoft Visual C++.\n      # hardcode_libdir_flag_spec is actually meaningless, as there is\n      # no search path for DLLs.\n      case $cc_basename in\n      cl*)\n\t# Native MSVC\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '\n\t_LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t_LT_TAGVAR(always_export_symbols, $1)=yes\n\t_LT_TAGVAR(file_list_spec, $1)='@'\n\t# Tell ltmain to make .lib files, not .a files.\n\tlibext=lib\n\t# Tell ltmain to make .dll files, not .so files.\n\tshrext_cmds=\".dll\"\n\t# FIXME: Setting linknames here is a bad hack.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t    sed -n -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' -e '1\\\\\\!p' < $export_symbols > $output_objdir/$soname.exp;\n\t  else\n\t    sed -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;\n\t  fi~\n\t  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs \"@$tool_output_objdir$soname.exp\" -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~\n\t  linknames='\n\t# The linker will not automatically build a static lib if we build a DLL.\n\t# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'\n\t_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\t_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'\n\t_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\\([[^ ]]*\\)/\\1,DATA/'\\'' | $SED -e '\\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\\'' | sort | uniq > $export_symbols'\n\t# Don't use ranlib\n\t_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'\n\t_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile=\"@OUTPUT@\"~\n\t  lt_tool_outputfile=\"@TOOL_OUTPUT@\"~\n\t  case $lt_outputfile in\n\t    *.exe|*.EXE) ;;\n\t    *)\n\t      lt_outputfile=\"$lt_outputfile.exe\"\n\t      lt_tool_outputfile=\"$lt_tool_outputfile.exe\"\n\t      ;;\n\t  esac~\n\t  if test \"$MANIFEST_TOOL\" != \":\" && test -f \"$lt_outputfile.manifest\"; then\n\t    $MANIFEST_TOOL -manifest \"$lt_tool_outputfile.manifest\" -outputresource:\"$lt_tool_outputfile\" || exit 1;\n\t    $RM \"$lt_outputfile.manifest\";\n\t  fi'\n\t;;\n      *)\n\t# Assume MSVC wrapper\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '\n\t_LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t# Tell ltmain to make .lib files, not .a files.\n\tlibext=lib\n\t# Tell ltmain to make .dll files, not .so files.\n\tshrext_cmds=\".dll\"\n\t# FIXME: Setting linknames here is a bad hack.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all \"$deplibs\" | $SED '\\''s/ -lc$//'\\''` -link -dll~linknames='\n\t# The linker will automatically build a .lib file if we build a DLL.\n\t_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'\n\t# FIXME: Should let the user specify the lib program.\n\t_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'\n\t_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\t;;\n      esac\n      ;;\n\n    darwin* | rhapsody*)\n      _LT_DARWIN_LINKER_FEATURES($1)\n      ;;\n\n    dgux*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor\n    # support.  Future versions do this automatically, but an explicit c++rt0.o\n    # does not break anything, and helps significantly (at the cost of a little\n    # extra space).\n    freebsd2.2*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    # Unfortunately, older versions of FreeBSD 2 do not have this feature.\n    freebsd2.*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.\n    freebsd* | dragonfly*)\n      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    hpux9*)\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n\n      # hardcode_minus_L: Not really in the search PATH,\n      # but as the default location of the library.\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n      ;;\n\n    hpux10*)\n      if test \"$GCC\" = yes && test \"$with_gnu_ld\" = no; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\t_LT_TAGVAR(hardcode_direct, $1)=yes\n\t_LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\t# hardcode_minus_L: Not really in the search PATH,\n\t# but as the default location of the library.\n\t_LT_TAGVAR(hardcode_minus_L, $1)=yes\n      fi\n      ;;\n\n    hpux11*)\n      if test \"$GCC\" = yes && test \"$with_gnu_ld\" = no; then\n\tcase $host_cpu in\n\thppa*64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tesac\n      else\n\tcase $host_cpu in\n\thppa*64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\tm4_if($1, [], [\n\t  # Older versions of the 11.00 compiler do not understand -b yet\n\t  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)\n\t  _LT_LINKER_OPTION([if $CC understands -b],\n\t    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],\n\t    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],\n\t    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],\n\t  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])\n\t  ;;\n\tesac\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\tcase $host_cpu in\n\thppa*64*|ia64*)\n\t  _LT_TAGVAR(hardcode_direct, $1)=no\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\n\t  # hardcode_minus_L: Not really in the search PATH,\n\t  # but as the default location of the library.\n\t  _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t  ;;\n\tesac\n      fi\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t# Try to use the -exported_symbol ld option, if it does not\n\t# work, assume that -exports_file does not work either and\n\t# implicitly export all symbols.\n\t# This should be the same for all languages, so no per-tag cache variable.\n\tAC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],\n\t  [lt_cv_irix_exported_symbol],\n\t  [save_LDFLAGS=\"$LDFLAGS\"\n\t   LDFLAGS=\"$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null\"\n\t   AC_LINK_IFELSE(\n\t     [AC_LANG_SOURCE(\n\t        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],\n\t\t\t      [C++], [[int foo (void) { return 0; }]],\n\t\t\t      [Fortran 77], [[\n      subroutine foo\n      end]],\n\t\t\t      [Fortran], [[\n      subroutine foo\n      end]])])],\n\t      [lt_cv_irix_exported_symbol=yes],\n\t      [lt_cv_irix_exported_symbol=no])\n           LDFLAGS=\"$save_LDFLAGS\"])\n\tif test \"$lt_cv_irix_exported_symbol\" = yes; then\n          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'\n\tfi\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(inherit_rpath, $1)=yes\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    newsos6)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *nto* | *qnx*)\n      ;;\n\n    openbsd*)\n      if test -f /usr/libexec/ld.so; then\n\t_LT_TAGVAR(hardcode_direct, $1)=yes\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\tif test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\telse\n\t  case $host_os in\n\t   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)\n\t     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n\t     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t     ;;\n\t   *)\n\t     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t     ;;\n\t  esac\n\tfi\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    os2*)\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      _LT_TAGVAR(archive_cmds, $1)='$ECHO \"LIBRARY $libname INITINSTANCE\" > $output_objdir/$libname.def~$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo \" SINGLE NONSHARED\" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'\n      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'\n      ;;\n\n    osf3*)\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n      else\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      ;;\n\n    osf4* | osf5*)\t# as osf3* with the addition of -msym flag\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      else\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done; printf \"%s\\\\n\" \"-hidden\">> $lib.exp~\n\t$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n \"$verstring\" && $ECHO \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'\n\n\t# Both c and cxx compiler support -rpath directly\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      ;;\n\n    solaris*)\n      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'\n      if test \"$GCC\" = yes; then\n\twlarc='${wl}'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n      else\n\tcase `$CC -V 2>&1` in\n\t*\"Compilers 5.0\"*)\n\t  wlarc=''\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'\n\t  ;;\n\t*)\n\t  wlarc='${wl}'\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n\t  ;;\n\tesac\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      case $host_os in\n      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n      *)\n\t# The compiler driver will combine and reorder linker options,\n\t# but understands `-z linker_flag'.  GCC discards it without `$wl',\n\t# but is careful enough not to reorder.\n\t# Supported since Solaris 2.6 (maybe 2.5.1?)\n\tif test \"$GCC\" = yes; then\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'\n\telse\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'\n\tfi\n\t;;\n      esac\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      ;;\n\n    sunos4*)\n      if test \"x$host_vendor\" = xsequent; then\n\t# Use $CC to link under sequent, because it throws in some extra .o\n\t# files that make .init and .fini sections work.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    sysv4)\n      case $host_vendor in\n\tsni)\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???\n\t;;\n\tsiemens)\n\t  ## LD is ld it makes a PLAMLIB\n\t  ## CC just makes a GrossModule.\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'\n\t  _LT_TAGVAR(hardcode_direct, $1)=no\n        ;;\n\tmotorola)\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie\n\t;;\n      esac\n      runpath_var='LD_RUN_PATH'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    sysv4.3*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\trunpath_var=LD_RUN_PATH\n\thardcode_runpath_var=yes\n\t_LT_TAGVAR(ld_shlibs, $1)=yes\n      fi\n      ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)\n      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6*)\n      # Note: We can NOT use -z defs as we might desire, because we do not\n      # link with -lc, and that would cause any symbols used from libc to\n      # always be unresolved, which means just about no library would\n      # ever link correctly.  If we're not using GNU ld we use -z text\n      # though, which does catch some bad symbols but isn't as heavy-handed\n      # as -z defs.\n      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    uts4*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *)\n      _LT_TAGVAR(ld_shlibs, $1)=no\n      ;;\n    esac\n\n    if test x$host_vendor = xsni; then\n      case $host in\n      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'\n\t;;\n      esac\n    fi\n  fi\n])\nAC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])\ntest \"$_LT_TAGVAR(ld_shlibs, $1)\" = no && can_build_shared=no\n\n_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld\n\n_LT_DECL([], [libext], [0], [Old archive suffix (normally \"a\")])dnl\n_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally \".so\")])dnl\n_LT_DECL([], [extract_expsyms_cmds], [2],\n    [The commands to extract the exported symbol list from a shared archive])\n\n#\n# Do we need to explicitly link libc?\n#\ncase \"x$_LT_TAGVAR(archive_cmds_need_lc, $1)\" in\nx|xyes)\n  # Assume -lc should be added\n  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\n  if test \"$enable_shared\" = yes && test \"$GCC\" = yes; then\n    case $_LT_TAGVAR(archive_cmds, $1) in\n    *'~'*)\n      # FIXME: we may have to deal with multi-command sequences.\n      ;;\n    '$CC '*)\n      # Test whether the compiler implicitly links with -lc since on some\n      # systems, -lgcc has to come before -lc. If gcc already passes -lc\n      # to ld, don't add -lc before -lgcc.\n      AC_CACHE_CHECK([whether -lc should be explicitly linked in],\n\t[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),\n\t[$RM conftest*\n\techo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n\tif AC_TRY_EVAL(ac_compile) 2>conftest.err; then\n\t  soname=conftest\n\t  lib=conftest\n\t  libobjs=conftest.$ac_objext\n\t  deplibs=\n\t  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)\n\t  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)\n\t  compiler_flags=-v\n\t  linker_flags=-v\n\t  verstring=\n\t  output_objdir=.\n\t  libname=conftest\n\t  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=\n\t  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1)\n\t  then\n\t    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\t  else\n\t    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\t  fi\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag\n\telse\n\t  cat conftest.err 1>&5\n\tfi\n\t$RM conftest*\n\t])\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)\n      ;;\n    esac\n  fi\n  ;;\nesac\n\n_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],\n    [Whether or not to add -lc for building shared libraries])\n_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],\n    [enable_shared_with_static_runtimes], [0],\n    [Whether or not to disallow shared libs when runtime libs are static])\n_LT_TAGDECL([], [export_dynamic_flag_spec], [1],\n    [Compiler flag to allow reflexive dlopens])\n_LT_TAGDECL([], [whole_archive_flag_spec], [1],\n    [Compiler flag to generate shared objects directly from archives])\n_LT_TAGDECL([], [compiler_needs_object], [1],\n    [Whether the compiler copes with passing no objects directly])\n_LT_TAGDECL([], [old_archive_from_new_cmds], [2],\n    [Create an old-style archive from a shared archive])\n_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],\n    [Create a temporary old-style archive to link instead of a shared archive])\n_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])\n_LT_TAGDECL([], [archive_expsym_cmds], [2])\n_LT_TAGDECL([], [module_cmds], [2],\n    [Commands used to build a loadable module if different from building\n    a shared archive.])\n_LT_TAGDECL([], [module_expsym_cmds], [2])\n_LT_TAGDECL([], [with_gnu_ld], [1],\n    [Whether we are building with GNU ld or not])\n_LT_TAGDECL([], [allow_undefined_flag], [1],\n    [Flag that allows shared libraries with undefined symbols to be built])\n_LT_TAGDECL([], [no_undefined_flag], [1],\n    [Flag that enforces no undefined symbols])\n_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],\n    [Flag to hardcode $libdir into a binary during linking.\n    This must work even if $libdir does not exist])\n_LT_TAGDECL([], [hardcode_libdir_separator], [1],\n    [Whether we need a single \"-rpath\" flag with a separated argument])\n_LT_TAGDECL([], [hardcode_direct], [0],\n    [Set to \"yes\" if using DIR/libNAME${shared_ext} during linking hardcodes\n    DIR into the resulting binary])\n_LT_TAGDECL([], [hardcode_direct_absolute], [0],\n    [Set to \"yes\" if using DIR/libNAME${shared_ext} during linking hardcodes\n    DIR into the resulting binary and the resulting library dependency is\n    \"absolute\", i.e impossible to change by setting ${shlibpath_var} if the\n    library is relocated])\n_LT_TAGDECL([], [hardcode_minus_L], [0],\n    [Set to \"yes\" if using the -LDIR flag during linking hardcodes DIR\n    into the resulting binary])\n_LT_TAGDECL([], [hardcode_shlibpath_var], [0],\n    [Set to \"yes\" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR\n    into the resulting binary])\n_LT_TAGDECL([], [hardcode_automatic], [0],\n    [Set to \"yes\" if building a shared library automatically hardcodes DIR\n    into the library and all subsequent libraries and executables linked\n    against it])\n_LT_TAGDECL([], [inherit_rpath], [0],\n    [Set to yes if linker adds runtime paths of dependent libraries\n    to runtime path list])\n_LT_TAGDECL([], [link_all_deplibs], [0],\n    [Whether libtool must link a program against all its dependency libraries])\n_LT_TAGDECL([], [always_export_symbols], [0],\n    [Set to \"yes\" if exported symbols are required])\n_LT_TAGDECL([], [export_symbols_cmds], [2],\n    [The commands to list exported symbols])\n_LT_TAGDECL([], [exclude_expsyms], [1],\n    [Symbols that should not be listed in the preloaded symbols])\n_LT_TAGDECL([], [include_expsyms], [1],\n    [Symbols that must always be exported])\n_LT_TAGDECL([], [prelink_cmds], [2],\n    [Commands necessary for linking programs (against libraries) with templates])\n_LT_TAGDECL([], [postlink_cmds], [2],\n    [Commands necessary for finishing linking programs])\n_LT_TAGDECL([], [file_list_spec], [1],\n    [Specify filename containing input files])\ndnl FIXME: Not yet implemented\ndnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],\ndnl    [Compiler flag to generate thread safe objects])\n])# _LT_LINKER_SHLIBS\n\n\n# _LT_LANG_C_CONFIG([TAG])\n# ------------------------\n# Ensure that the configuration variables for a C compiler are suitably\n# defined.  These variables are subsequently used by _LT_CONFIG to write\n# the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_C_CONFIG],\n[m4_require([_LT_DECL_EGREP])dnl\nlt_save_CC=\"$CC\"\nAC_LANG_PUSH(C)\n\n# Source file extension for C test sources.\nac_ext=c\n\n# Object file extension for compiled C test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"int some_variable = 0;\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='int main(){return(0);}'\n\n_LT_TAG_COMPILER\n# Save the default compiler, since it gets overwritten when the other\n# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.\ncompiler_DEFAULT=$CC\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\nif test -n \"$compiler\"; then\n  _LT_COMPILER_NO_RTTI($1)\n  _LT_COMPILER_PIC($1)\n  _LT_COMPILER_C_O($1)\n  _LT_COMPILER_FILE_LOCKS($1)\n  _LT_LINKER_SHLIBS($1)\n  _LT_SYS_DYNAMIC_LINKER($1)\n  _LT_LINKER_HARDCODE_LIBPATH($1)\n  LT_SYS_DLOPEN_SELF\n  _LT_CMD_STRIPLIB\n\n  # Report which library types will actually be built\n  AC_MSG_CHECKING([if libtool supports shared libraries])\n  AC_MSG_RESULT([$can_build_shared])\n\n  AC_MSG_CHECKING([whether to build shared libraries])\n  test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n  # On AIX, shared libraries and static libraries use the same namespace, and\n  # are all built from PIC.\n  case $host_os in\n  aix3*)\n    test \"$enable_shared\" = yes && enable_static=no\n    if test -n \"$RANLIB\"; then\n      archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n      postinstall_cmds='$RANLIB $lib'\n    fi\n    ;;\n\n  aix[[4-9]]*)\n    if test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n      test \"$enable_shared\" = yes && enable_static=no\n    fi\n    ;;\n  esac\n  AC_MSG_RESULT([$enable_shared])\n\n  AC_MSG_CHECKING([whether to build static libraries])\n  # Make sure either enable_shared or enable_static is yes.\n  test \"$enable_shared\" = yes || enable_static=yes\n  AC_MSG_RESULT([$enable_static])\n\n  _LT_CONFIG($1)\nfi\nAC_LANG_POP\nCC=\"$lt_save_CC\"\n])# _LT_LANG_C_CONFIG\n\n\n# _LT_LANG_CXX_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for a C++ compiler are suitably\n# defined.  These variables are subsequently used by _LT_CONFIG to write\n# the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_CXX_CONFIG],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_PATH_MANIFEST_TOOL])dnl\nif test -n \"$CXX\" && ( test \"X$CXX\" != \"Xno\" &&\n    ( (test \"X$CXX\" = \"Xg++\" && `g++ -v >/dev/null 2>&1` ) ||\n    (test \"X$CXX\" != \"Xg++\"))) ; then\n  AC_PROG_CXXCPP\nelse\n  _lt_caught_CXX_error=yes\nfi\n\nAC_LANG_PUSH(C++)\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(compiler_needs_object, $1)=no\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for C++ test sources.\nac_ext=cpp\n\n# Object file extension for compiled C++ test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the CXX compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test \"$_lt_caught_CXX_error\" != yes; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"int some_variable = 0;\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=$CC\n  lt_save_CFLAGS=$CFLAGS\n  lt_save_LD=$LD\n  lt_save_GCC=$GCC\n  GCC=$GXX\n  lt_save_with_gnu_ld=$with_gnu_ld\n  lt_save_path_LD=$lt_cv_path_LD\n  if test -n \"${lt_cv_prog_gnu_ldcxx+set}\"; then\n    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx\n  else\n    $as_unset lt_cv_prog_gnu_ld\n  fi\n  if test -n \"${lt_cv_path_LDCXX+set}\"; then\n    lt_cv_path_LD=$lt_cv_path_LDCXX\n  else\n    $as_unset lt_cv_path_LD\n  fi\n  test -z \"${LDCXX+set}\" || LD=$LDCXX\n  CC=${CXX-\"c++\"}\n  CFLAGS=$CXXFLAGS\n  compiler=$CC\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n\n  if test -n \"$compiler\"; then\n    # We don't want -fno-exception when compiling C++ code, so set the\n    # no_builtin_flag separately\n    if test \"$GXX\" = yes; then\n      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'\n    else\n      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\n    fi\n\n    if test \"$GXX\" = yes; then\n      # Set up default GNU C++ configuration\n\n      LT_PATH_LD\n\n      # Check if GNU C++ uses GNU ld as the underlying linker, since the\n      # archiving commands below assume that GNU ld is being used.\n      if test \"$with_gnu_ld\" = yes; then\n        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\n        # If archive_cmds runs LD, not CC, wlarc should be empty\n        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to\n        #     investigate it a little bit more. (MM)\n        wlarc='${wl}'\n\n        # ancient GNU ld didn't support --whole-archive et. al.\n        if eval \"`$CC -print-prog-name=ld` --help 2>&1\" |\n\t  $GREP 'no-whole-archive' > /dev/null; then\n          _LT_TAGVAR(whole_archive_flag_spec, $1)=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n        else\n          _LT_TAGVAR(whole_archive_flag_spec, $1)=\n        fi\n      else\n        with_gnu_ld=no\n        wlarc=\n\n        # A generic and very simple default shared library creation\n        # command for GNU C++ for the case where it uses the native\n        # linker, instead of GNU ld.  If possible, this setting should\n        # overridden to take advantage of the native linker features on\n        # the platform it is being used on.\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n      fi\n\n      # Commands to make compiler produce verbose output that lists\n      # what \"hidden\" libraries, object files and flags are used when\n      # linking a shared library.\n      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\n    else\n      GXX=no\n      with_gnu_ld=no\n      wlarc=\n    fi\n\n    # PORTME: fill in a description of your system's C++ link characteristics\n    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])\n    _LT_TAGVAR(ld_shlibs, $1)=yes\n    case $host_os in\n      aix3*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n      aix[[4-9]]*)\n        if test \"$host_cpu\" = ia64; then\n          # On IA64, the linker does run time linking by default, so we don't\n          # have to do anything special.\n          aix_use_runtimelinking=no\n          exp_sym_flag='-Bexport'\n          no_entry_flag=\"\"\n        else\n          aix_use_runtimelinking=no\n\n          # Test if we are trying to use run time linking or normal\n          # AIX style linking. If -brtl is somewhere in LDFLAGS, we\n          # need to do runtime linking.\n          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)\n\t    for ld_flag in $LDFLAGS; do\n\t      case $ld_flag in\n\t      *-brtl*)\n\t        aix_use_runtimelinking=yes\n\t        break\n\t        ;;\n\t      esac\n\t    done\n\t    ;;\n          esac\n\n          exp_sym_flag='-bexport'\n          no_entry_flag='-bnoentry'\n        fi\n\n        # When large executables or shared objects are built, AIX ld can\n        # have problems creating the table of contents.  If linking a library\n        # or program results in \"error TOC overflow\" add -mminimal-toc to\n        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n        _LT_TAGVAR(archive_cmds, $1)=''\n        _LT_TAGVAR(hardcode_direct, $1)=yes\n        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n        _LT_TAGVAR(link_all_deplibs, $1)=yes\n        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'\n\n        if test \"$GXX\" = yes; then\n          case $host_os in aix4.[[012]]|aix4.[[012]].*)\n          # We only want to do this on AIX 4.2 and lower, the check\n          # below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`${CC} -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t     strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t    # We have reworked collect2\n\t    :\n\t  else\n\t    # We have old collect2\n\t    _LT_TAGVAR(hardcode_direct, $1)=unsupported\n\t    # It fails to find uninstalled libraries when the uninstalled\n\t    # path is not listed in the libpath.  Setting hardcode_minus_L\n\t    # to unsupported forces relinking\n\t    _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=\n\t  fi\n          esac\n          shared_flag='-shared'\n\t  if test \"$aix_use_runtimelinking\" = yes; then\n\t    shared_flag=\"$shared_flag \"'${wl}-G'\n\t  fi\n        else\n          # not using gcc\n          if test \"$host_cpu\" = ia64; then\n\t  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t  # chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n          else\n\t    if test \"$aix_use_runtimelinking\" = yes; then\n\t      shared_flag='${wl}-G'\n\t    else\n\t      shared_flag='${wl}-bM:SRE'\n\t    fi\n          fi\n        fi\n\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'\n        # It seems that -bexpall does not export symbols beginning with\n        # underscore (_), so it is better to generate a list of symbols to\n\t# export.\n        _LT_TAGVAR(always_export_symbols, $1)=yes\n        if test \"$aix_use_runtimelinking\" = yes; then\n          # Warning - without using the other runtime loading flags (-brtl),\n          # -berok will link without error, but may produce a broken library.\n          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'\n          # Determine the default libpath from the value encoded in an empty\n          # executable.\n          _LT_SYS_MODULE_PATH_AIX([$1])\n          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\n          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then func_echo_all \"${wl}${allow_undefined_flag}\"; else :; fi` '\"\\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n        else\n          if test \"$host_cpu\" = ia64; then\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'\n\t    _LT_TAGVAR(allow_undefined_flag, $1)=\"-z nodefs\"\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$exp_sym_flag:\\$export_symbols\"\n          else\n\t    # Determine the default libpath from the value encoded in an\n\t    # empty executable.\n\t    _LT_SYS_MODULE_PATH_AIX([$1])\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\t    # Warning - without using the other run time loading flags,\n\t    # -berok will link without error, but may produce a broken library.\n\t    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'\n\t    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'\n\t    if test \"$with_gnu_ld\" = yes; then\n\t      # We only use this code for GNU lds that support --whole-archive.\n\t      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'\n\t    else\n\t      # Exported symbols can be pulled into shared objects from archives\n\t      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'\n\t    fi\n\t    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\t    # This is similar to how AIX traditionally builds its shared\n\t    # libraries.\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'\n          fi\n        fi\n        ;;\n\n      beos*)\n\tif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t  # support --undefined.  This deserves some investigation.  FIXME\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\telse\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\tfi\n\t;;\n\n      chorus*)\n        case $cc_basename in\n          *)\n\t  # FIXME: insert proper C++ library support\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\t  ;;\n        esac\n        ;;\n\n      cygwin* | mingw* | pw32* | cegcc*)\n\tcase $GXX,$cc_basename in\n\t,cl* | no,cl*)\n\t  # Native MSVC\n\t  # hardcode_libdir_flag_spec is actually meaningless, as there is\n\t  # no search path for DLLs.\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t  _LT_TAGVAR(always_export_symbols, $1)=yes\n\t  _LT_TAGVAR(file_list_spec, $1)='@'\n\t  # Tell ltmain to make .lib files, not .a files.\n\t  libext=lib\n\t  # Tell ltmain to make .dll files, not .so files.\n\t  shrext_cmds=\".dll\"\n\t  # FIXME: Setting linknames here is a bad hack.\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t      $SED -n -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' -e '1\\\\\\!p' < $export_symbols > $output_objdir/$soname.exp;\n\t    else\n\t      $SED -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;\n\t    fi~\n\t    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs \"@$tool_output_objdir$soname.exp\" -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~\n\t    linknames='\n\t  # The linker will not automatically build a static lib if we build a DLL.\n\t  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'\n\t  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\t  # Don't use ranlib\n\t  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'\n\t  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile=\"@OUTPUT@\"~\n\t    lt_tool_outputfile=\"@TOOL_OUTPUT@\"~\n\t    case $lt_outputfile in\n\t      *.exe|*.EXE) ;;\n\t      *)\n\t\tlt_outputfile=\"$lt_outputfile.exe\"\n\t\tlt_tool_outputfile=\"$lt_tool_outputfile.exe\"\n\t\t;;\n\t    esac~\n\t    func_to_tool_file \"$lt_outputfile\"~\n\t    if test \"$MANIFEST_TOOL\" != \":\" && test -f \"$lt_outputfile.manifest\"; then\n\t      $MANIFEST_TOOL -manifest \"$lt_tool_outputfile.manifest\" -outputresource:\"$lt_tool_outputfile\" || exit 1;\n\t      $RM \"$lt_outputfile.manifest\";\n\t    fi'\n\t  ;;\n\t*)\n\t  # g++\n\t  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,\n\t  # as there is no search path for DLLs.\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n\t  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t  _LT_TAGVAR(always_export_symbols, $1)=no\n\t  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\n\t  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t    # If the export-symbols file already is a .def file (1st line\n\t    # is EXPORTS), use it as is; otherwise, prepend...\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t      cp $export_symbols $output_objdir/$soname.def;\n\t    else\n\t      echo EXPORTS > $output_objdir/$soname.def;\n\t      cat $export_symbols >> $output_objdir/$soname.def;\n\t    fi~\n\t    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t  else\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t  fi\n\t  ;;\n\tesac\n\t;;\n      darwin* | rhapsody*)\n        _LT_DARWIN_LINKER_FEATURES($1)\n\t;;\n\n      dgux*)\n        case $cc_basename in\n          ec++*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          ghcx*)\n\t    # Green Hills C++ Compiler\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      freebsd2.*)\n        # C++ shared libraries reported to be fairly broken before\n\t# switch to ELF\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      freebsd-elf*)\n        _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n        ;;\n\n      freebsd* | dragonfly*)\n        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF\n        # conventions\n        _LT_TAGVAR(ld_shlibs, $1)=yes\n        ;;\n\n      haiku*)\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n        _LT_TAGVAR(link_all_deplibs, $1)=yes\n        ;;\n\n      hpux9*)\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n        _LT_TAGVAR(hardcode_direct, $1)=yes\n        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,\n\t\t\t\t             # but as the default\n\t\t\t\t             # location of the library.\n\n        case $cc_basename in\n          CC*)\n            # FIXME: insert proper C++ library support\n            _LT_TAGVAR(ld_shlibs, $1)=no\n            ;;\n          aCC*)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n            # Commands to make compiler produce verbose output that lists\n            # what \"hidden\" libraries, object files and flags are used when\n            # linking a shared library.\n            #\n            # There doesn't appear to be a way to prevent this compiler from\n            # explicitly linking system object files so we need to strip them\n            # from the output so that they don't get included in the library\n            # dependencies.\n            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP \"\\-L\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n            ;;\n          *)\n            if test \"$GXX\" = yes; then\n              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n            else\n              # FIXME: insert proper C++ library support\n              _LT_TAGVAR(ld_shlibs, $1)=no\n            fi\n            ;;\n        esac\n        ;;\n\n      hpux10*|hpux11*)\n        if test $with_gnu_ld = no; then\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n\t  _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n          case $host_cpu in\n            hppa*64*|ia64*)\n              ;;\n            *)\n\t      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n              ;;\n          esac\n        fi\n        case $host_cpu in\n          hppa*64*|ia64*)\n            _LT_TAGVAR(hardcode_direct, $1)=no\n            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n            ;;\n          *)\n            _LT_TAGVAR(hardcode_direct, $1)=yes\n            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,\n\t\t\t\t\t         # but as the default\n\t\t\t\t\t         # location of the library.\n            ;;\n        esac\n\n        case $cc_basename in\n          CC*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          aCC*)\n\t    case $host_cpu in\n\t      hppa*64*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      ia64*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      *)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t    esac\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP \"\\-L\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\t    ;;\n          *)\n\t    if test \"$GXX\" = yes; then\n\t      if test $with_gnu_ld = no; then\n\t        case $host_cpu in\n\t          hppa*64*)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          ia64*)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          *)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t        esac\n\t      fi\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      _LT_TAGVAR(ld_shlibs, $1)=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      interix[[3-9]]*)\n\t_LT_TAGVAR(hardcode_direct, $1)=no\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\t# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n\t# Instead, shared libraries are loaded at an image base (0x10000000 by\n\t# default) and relocated if they conflict, which is a slow very memory\n\t# consuming and fragmenting process.  To avoid this, we pick a random,\n\t# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n\t# time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\t;;\n      irix5* | irix6*)\n        case $cc_basename in\n          CC*)\n\t    # SGI C++\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -ar\", where \"CC\" is the IRIX C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    if test \"$GXX\" = yes; then\n\t      if test \"$with_gnu_ld\" = no; then\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t      else\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` -o $lib'\n\t      fi\n\t    fi\n\t    _LT_TAGVAR(link_all_deplibs, $1)=yes\n\t    ;;\n        esac\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n        _LT_TAGVAR(inherit_rpath, $1)=yes\n        ;;\n\n      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib ${wl}-retain-symbols-file,$export_symbols; mv \\$templib $lib'\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP \"ld\"`; rm -f libconftest$shared_ext; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -Bstatic\", where \"CC\" is the KAI C++ compiler.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'\n\t    ;;\n\t  icpc* | ecpc* )\n\t    # Intel C++\n\t    with_gnu_ld=yes\n\t    # version 8.0 and above of icpc choke on multiply defined symbols\n\t    # if we add $predep_objects and $postdep_objects, however 7.1 and\n\t    # earlier do not add the objects themselves.\n\t    case `$CC -V 2>&1` in\n\t      *\"Version 7.\"*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t      *)  # Version 8.0 or newer\n\t        tmp_idyn=\n\t        case $host_cpu in\n\t\t  ia64*) tmp_idyn=' -i_dynamic';;\n\t\tesac\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t    esac\n\t    _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'\n\t    ;;\n          pgCC* | pgcpp*)\n            # Portland Group C++ compiler\n\t    case `$CC -V` in\n\t    *pgCC\\ [[1-5]].* | *pgcpp\\ [[1-5]].*)\n\t      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~\n\t\tcompile_command=\"$compile_command `find $tpldir -name \\*.o | sort | $NL2SP`\"'\n\t      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~\n\t\t$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \\*.o | sort | $NL2SP`~\n\t\t$RANLIB $oldlib'\n\t      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n\t\t$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n\t\t$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'\n\t      ;;\n\t    *) # Version 6 and above use weak symbols\n\t      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'\n\t      ;;\n\t    esac\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n            ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'\n\n\t    runpath_var=LD_RUN_PATH\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\"`; templist=`func_echo_all \"$templist\" | $SED \"s/\\(^.*ld.*\\)\\( .*ld .*$\\)/\\1/\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"X$list\" | $Xsed'\n\t    ;;\n\t  xl* | mpixl* | bgxl*)\n\t    # IBM XL 8.0 on PPC, with GNU ld\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    if test \"x$supports_anon_versioning\" = xyes; then\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t\tcat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t\techo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t\t$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'\n\t    fi\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'\n\t      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t      _LT_TAGVAR(compiler_needs_object, $1)=yes\n\n\t      # Not sure whether something based on\n\t      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1\n\t      # would be better.\n\t      output_verbose_link_cmd='func_echo_all'\n\n\t      # Archives containing C++ object files must be created using\n\t      # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t      # necessary to make sure instantiated templates are included\n\t      # in the archive.\n\t      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n\n      lynxos*)\n        # FIXME: insert proper C++ library support\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\t;;\n\n      m88k*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n\t;;\n\n      mvs*)\n        case $cc_basename in\n          cxx*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n\t  *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n\tesac\n\t;;\n\n      netbsd*)\n        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'\n\t  wlarc=\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\tfi\n\t# Workaround some broken pre-1.5 toolchains\n\toutput_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e \"s:-lgcc -lc -lgcc::\"'\n\t;;\n\n      *nto* | *qnx*)\n        _LT_TAGVAR(ld_shlibs, $1)=yes\n\t;;\n\n      openbsd2*)\n        # C++ shared libraries are fairly broken\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\t;;\n\n      openbsd*)\n\tif test -f /usr/libexec/ld.so; then\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t  if test -z \"`echo __ELF__ | $CC -E - | grep __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n\t  fi\n\t  output_verbose_link_cmd=func_echo_all\n\telse\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\tfi\n\t;;\n\n      osf3* | osf4* | osf5*)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo \"$lib\" | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Archives containing C++ object files must be created using\n\t    # the KAI C++ compiler.\n\t    case $host in\n\t      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;\n\t      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;\n\t    esac\n\t    ;;\n          RCC*)\n\t    # Rational C++ 2.4.1\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          cxx*)\n\t    case $host in\n\t      osf3*)\n\t        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\t        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t\t;;\n\t      *)\n\t        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done~\n\t          echo \"-hidden\">> $lib.exp~\n\t          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n \"$verstring\" && $ECHO \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib~\n\t          $RM $lib.exp'\n\t        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n\t\t;;\n\t    esac\n\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\" | $GREP -v \"ld:\"`; templist=`func_echo_all \"$templist\" | $SED \"s/\\(^.*ld.*\\)\\( .*ld.*$\\)/\\1/\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\t    ;;\n\t  *)\n\t    if test \"$GXX\" = yes && test \"$with_gnu_ld\" = no; then\n\t      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t      case $host in\n\t        osf3*)\n\t          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t\t  ;;\n\t        *)\n\t          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t\t  ;;\n\t      esac\n\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t      # Commands to make compiler produce verbose output that lists\n\t      # what \"hidden\" libraries, object files and flags are used when\n\t      # linking a shared library.\n\t      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      _LT_TAGVAR(ld_shlibs, $1)=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      psos*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      sunos4*)\n        case $cc_basename in\n          CC*)\n\t    # Sun C++ 4.x\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          lcc*)\n\t    # Lucid\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      solaris*)\n        case $cc_basename in\n          CC* | sunCC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes\n\t    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t    case $host_os in\n\t      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n\t      *)\n\t\t# The compiler driver will combine and reorder linker options,\n\t\t# but understands `-z linker_flag'.\n\t        # Supported since Solaris 2.6 (maybe 2.5.1?)\n\t\t_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'\n\t        ;;\n\t    esac\n\t    _LT_TAGVAR(link_all_deplibs, $1)=yes\n\n\t    output_verbose_link_cmd='func_echo_all'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'\n\t    ;;\n          gcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\n\t    # The C++ compiler must be used to create the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    # GNU C++ compiler with Solaris linker\n\t    if test \"$GXX\" = yes && test \"$with_gnu_ld\" = no; then\n\t      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'\n\t      if $CC --version | $GREP -v '^2\\.7' > /dev/null; then\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t\t  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\t      else\n\t        # g++ 2.7 appears to require `-G' NOT `-shared' on this\n\t        # platform.\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t\t  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\t      fi\n\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'\n\t      case $host_os in\n\t\tsolaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n\t\t*)\n\t\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'\n\t\t  ;;\n\t      esac\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)\n      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      runpath_var='LD_RUN_PATH'\n\n      case $cc_basename in\n        CC*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n      esac\n      ;;\n\n      sysv5* | sco3.2v5* | sco5v6*)\n\t# Note: We can NOT use -z defs as we might desire, because we do not\n\t# link with -lc, and that would cause any symbols used from libc to\n\t# always be unresolved, which means just about no library would\n\t# ever link correctly.  If we're not using GNU ld we use -z text\n\t# though, which does catch some bad symbols but isn't as heavy-handed\n\t# as -z defs.\n\t_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n\t_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'\n\t_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n\t_LT_TAGVAR(link_all_deplibs, $1)=yes\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'\n\trunpath_var='LD_RUN_PATH'\n\n\tcase $cc_basename in\n          CC*)\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~\n\t      '\"$_LT_TAGVAR(old_archive_cmds, $1)\"\n\t    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~\n\t      '\"$_LT_TAGVAR(reload_cmds, $1)\"\n\t    ;;\n\t  *)\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    ;;\n\tesac\n      ;;\n\n      tandem*)\n        case $cc_basename in\n          NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      vxworks*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      *)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n    esac\n\n    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])\n    test \"$_LT_TAGVAR(ld_shlibs, $1)\" = no && can_build_shared=no\n\n    _LT_TAGVAR(GCC, $1)=\"$GXX\"\n    _LT_TAGVAR(LD, $1)=\"$LD\"\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_SYS_HIDDEN_LIBDEPS($1)\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  CC=$lt_save_CC\n  CFLAGS=$lt_save_CFLAGS\n  LDCXX=$LD\n  LD=$lt_save_LD\n  GCC=$lt_save_GCC\n  with_gnu_ld=$lt_save_with_gnu_ld\n  lt_cv_path_LDCXX=$lt_cv_path_LD\n  lt_cv_path_LD=$lt_save_path_LD\n  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld\n  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld\nfi # test \"$_lt_caught_CXX_error\" != yes\n\nAC_LANG_POP\n])# _LT_LANG_CXX_CONFIG\n\n\n# _LT_FUNC_STRIPNAME_CNF\n# ----------------------\n# func_stripname_cnf prefix suffix name\n# strip PREFIX and SUFFIX off of NAME.\n# PREFIX and SUFFIX must not contain globbing or regex special\n# characters, hashes, percent signs, but SUFFIX may contain a leading\n# dot (in which case that matches only a dot).\n#\n# This function is identical to the (non-XSI) version of func_stripname,\n# except this one can be used by m4 code that may be executed by configure,\n# rather than the libtool script.\nm4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl\nAC_REQUIRE([_LT_DECL_SED])\nAC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])\nfunc_stripname_cnf ()\n{\n  case ${2} in\n  .*) func_stripname_result=`$ECHO \"${3}\" | $SED \"s%^${1}%%; s%\\\\\\\\${2}\\$%%\"`;;\n  *)  func_stripname_result=`$ECHO \"${3}\" | $SED \"s%^${1}%%; s%${2}\\$%%\"`;;\n  esac\n} # func_stripname_cnf\n])# _LT_FUNC_STRIPNAME_CNF\n\n# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])\n# ---------------------------------\n# Figure out \"hidden\" library dependencies from verbose\n# compiler output when linking a shared library.\n# Parse the compiler output and extract the necessary\n# objects, libraries and library flags.\nm4_defun([_LT_SYS_HIDDEN_LIBDEPS],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nAC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl\n# Dependencies to place before and after the object being linked:\n_LT_TAGVAR(predep_objects, $1)=\n_LT_TAGVAR(postdep_objects, $1)=\n_LT_TAGVAR(predeps, $1)=\n_LT_TAGVAR(postdeps, $1)=\n_LT_TAGVAR(compiler_lib_search_path, $1)=\n\ndnl we can't use the lt_simple_compile_test_code here,\ndnl because it contains code intended for an executable,\ndnl not a library.  It's possible we should let each\ndnl tag define a new lt_????_link_test_code variable,\ndnl but it's only used here...\nm4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF\nint a;\nvoid foo (void) { a = 0; }\n_LT_EOF\n], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF\nclass Foo\n{\npublic:\n  Foo (void) { a = 0; }\nprivate:\n  int a;\n};\n_LT_EOF\n], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF\n      subroutine foo\n      implicit none\n      integer*4 a\n      a=0\n      return\n      end\n_LT_EOF\n], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF\n      subroutine foo\n      implicit none\n      integer a\n      a=0\n      return\n      end\n_LT_EOF\n], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF\npublic class foo {\n  private int a;\n  public void bar (void) {\n    a = 0;\n  }\n};\n_LT_EOF\n], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF\npackage foo\nfunc foo() {\n}\n_LT_EOF\n])\n\n_lt_libdeps_save_CFLAGS=$CFLAGS\ncase \"$CC $CFLAGS \" in #(\n*\\ -flto*\\ *) CFLAGS=\"$CFLAGS -fno-lto\" ;;\n*\\ -fwhopr*\\ *) CFLAGS=\"$CFLAGS -fno-whopr\" ;;\n*\\ -fuse-linker-plugin*\\ *) CFLAGS=\"$CFLAGS -fno-use-linker-plugin\" ;;\nesac\n\ndnl Parse the compiler output and extract the necessary\ndnl objects, libraries and library flags.\nif AC_TRY_EVAL(ac_compile); then\n  # Parse the compiler output and extract the necessary\n  # objects, libraries and library flags.\n\n  # Sentinel used to keep track of whether or not we are before\n  # the conftest object file.\n  pre_test_object_deps_done=no\n\n  for p in `eval \"$output_verbose_link_cmd\"`; do\n    case ${prev}${p} in\n\n    -L* | -R* | -l*)\n       # Some compilers place space between \"-{L,R}\" and the path.\n       # Remove the space.\n       if test $p = \"-L\" ||\n          test $p = \"-R\"; then\n\t prev=$p\n\t continue\n       fi\n\n       # Expand the sysroot to ease extracting the directories later.\n       if test -z \"$prev\"; then\n         case $p in\n         -L*) func_stripname_cnf '-L' '' \"$p\"; prev=-L; p=$func_stripname_result ;;\n         -R*) func_stripname_cnf '-R' '' \"$p\"; prev=-R; p=$func_stripname_result ;;\n         -l*) func_stripname_cnf '-l' '' \"$p\"; prev=-l; p=$func_stripname_result ;;\n         esac\n       fi\n       case $p in\n       =*) func_stripname_cnf '=' '' \"$p\"; p=$lt_sysroot$func_stripname_result ;;\n       esac\n       if test \"$pre_test_object_deps_done\" = no; then\n\t case ${prev} in\n\t -L | -R)\n\t   # Internal compiler library paths should come after those\n\t   # provided the user.  The postdeps already come after the\n\t   # user supplied libs so there is no need to process them.\n\t   if test -z \"$_LT_TAGVAR(compiler_lib_search_path, $1)\"; then\n\t     _LT_TAGVAR(compiler_lib_search_path, $1)=\"${prev}${p}\"\n\t   else\n\t     _LT_TAGVAR(compiler_lib_search_path, $1)=\"${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}\"\n\t   fi\n\t   ;;\n\t # The \"-l\" case would never come before the object being\n\t # linked, so don't bother handling this case.\n\t esac\n       else\n\t if test -z \"$_LT_TAGVAR(postdeps, $1)\"; then\n\t   _LT_TAGVAR(postdeps, $1)=\"${prev}${p}\"\n\t else\n\t   _LT_TAGVAR(postdeps, $1)=\"${_LT_TAGVAR(postdeps, $1)} ${prev}${p}\"\n\t fi\n       fi\n       prev=\n       ;;\n\n    *.lto.$objext) ;; # Ignore GCC LTO objects\n    *.$objext)\n       # This assumes that the test object file only shows up\n       # once in the compiler output.\n       if test \"$p\" = \"conftest.$objext\"; then\n\t pre_test_object_deps_done=yes\n\t continue\n       fi\n\n       if test \"$pre_test_object_deps_done\" = no; then\n\t if test -z \"$_LT_TAGVAR(predep_objects, $1)\"; then\n\t   _LT_TAGVAR(predep_objects, $1)=\"$p\"\n\t else\n\t   _LT_TAGVAR(predep_objects, $1)=\"$_LT_TAGVAR(predep_objects, $1) $p\"\n\t fi\n       else\n\t if test -z \"$_LT_TAGVAR(postdep_objects, $1)\"; then\n\t   _LT_TAGVAR(postdep_objects, $1)=\"$p\"\n\t else\n\t   _LT_TAGVAR(postdep_objects, $1)=\"$_LT_TAGVAR(postdep_objects, $1) $p\"\n\t fi\n       fi\n       ;;\n\n    *) ;; # Ignore the rest.\n\n    esac\n  done\n\n  # Clean up.\n  rm -f a.out a.exe\nelse\n  echo \"libtool.m4: error: problem compiling $1 test program\"\nfi\n\n$RM -f confest.$objext\nCFLAGS=$_lt_libdeps_save_CFLAGS\n\n# PORTME: override above test on systems where it is broken\nm4_if([$1], [CXX],\n[case $host_os in\ninterix[[3-9]]*)\n  # Interix 3.5 installs completely hosed .la files for C++, so rather than\n  # hack all around it, let's just trust \"g++\" to DTRT.\n  _LT_TAGVAR(predep_objects,$1)=\n  _LT_TAGVAR(postdep_objects,$1)=\n  _LT_TAGVAR(postdeps,$1)=\n  ;;\n\nlinux*)\n  case `$CC -V 2>&1 | sed 5q` in\n  *Sun\\ C*)\n    # Sun C++ 5.9\n\n    # The more standards-conforming stlport4 library is\n    # incompatible with the Cstd library. Avoid specifying\n    # it if it's in CXXFLAGS. Ignore libCrun as\n    # -library=stlport4 depends on it.\n    case \" $CXX $CXXFLAGS \" in\n    *\" -library=stlport4 \"*)\n      solaris_use_stlport4=yes\n      ;;\n    esac\n\n    if test \"$solaris_use_stlport4\" != yes; then\n      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'\n    fi\n    ;;\n  esac\n  ;;\n\nsolaris*)\n  case $cc_basename in\n  CC* | sunCC*)\n    # The more standards-conforming stlport4 library is\n    # incompatible with the Cstd library. Avoid specifying\n    # it if it's in CXXFLAGS. Ignore libCrun as\n    # -library=stlport4 depends on it.\n    case \" $CXX $CXXFLAGS \" in\n    *\" -library=stlport4 \"*)\n      solaris_use_stlport4=yes\n      ;;\n    esac\n\n    # Adding this requires a known-good setup of shared libraries for\n    # Sun compiler versions before 5.6, else PIC objects from an old\n    # archive will be linked into the output, leading to subtle bugs.\n    if test \"$solaris_use_stlport4\" != yes; then\n      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'\n    fi\n    ;;\n  esac\n  ;;\nesac\n])\n\ncase \" $_LT_TAGVAR(postdeps, $1) \" in\n*\" -lc \"*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;\nesac\n _LT_TAGVAR(compiler_lib_search_dirs, $1)=\nif test -n \"${_LT_TAGVAR(compiler_lib_search_path, $1)}\"; then\n _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo \" ${_LT_TAGVAR(compiler_lib_search_path, $1)}\" | ${SED} -e 's! -L! !g' -e 's!^ !!'`\nfi\n_LT_TAGDECL([], [compiler_lib_search_dirs], [1],\n    [The directories searched by this compiler when creating a shared library])\n_LT_TAGDECL([], [predep_objects], [1],\n    [Dependencies to place before and after the objects being linked to\n    create a shared library])\n_LT_TAGDECL([], [postdep_objects], [1])\n_LT_TAGDECL([], [predeps], [1])\n_LT_TAGDECL([], [postdeps], [1])\n_LT_TAGDECL([], [compiler_lib_search_path], [1],\n    [The library search path used internally by the compiler when linking\n    a shared library])\n])# _LT_SYS_HIDDEN_LIBDEPS\n\n\n# _LT_LANG_F77_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for a Fortran 77 compiler are\n# suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_F77_CONFIG],\n[AC_LANG_PUSH(Fortran 77)\nif test -z \"$F77\" || test \"X$F77\" = \"Xno\"; then\n  _lt_disable_F77=yes\nfi\n\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for f77 test sources.\nac_ext=f\n\n# Object file extension for compiled f77 test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the F77 compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test \"$_lt_disable_F77\" != yes; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"\\\n      subroutine t\n      return\n      end\n\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code=\"\\\n      program t\n      end\n\"\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=\"$CC\"\n  lt_save_GCC=$GCC\n  lt_save_CFLAGS=$CFLAGS\n  CC=${F77-\"f77\"}\n  CFLAGS=$FFLAGS\n  compiler=$CC\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n  GCC=$G77\n  if test -n \"$compiler\"; then\n    AC_MSG_CHECKING([if libtool supports shared libraries])\n    AC_MSG_RESULT([$can_build_shared])\n\n    AC_MSG_CHECKING([whether to build shared libraries])\n    test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n    # On AIX, shared libraries and static libraries use the same namespace, and\n    # are all built from PIC.\n    case $host_os in\n      aix3*)\n        test \"$enable_shared\" = yes && enable_static=no\n        if test -n \"$RANLIB\"; then\n          archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n          postinstall_cmds='$RANLIB $lib'\n        fi\n        ;;\n      aix[[4-9]]*)\n\tif test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n\t  test \"$enable_shared\" = yes && enable_static=no\n\tfi\n        ;;\n    esac\n    AC_MSG_RESULT([$enable_shared])\n\n    AC_MSG_CHECKING([whether to build static libraries])\n    # Make sure either enable_shared or enable_static is yes.\n    test \"$enable_shared\" = yes || enable_static=yes\n    AC_MSG_RESULT([$enable_static])\n\n    _LT_TAGVAR(GCC, $1)=\"$G77\"\n    _LT_TAGVAR(LD, $1)=\"$LD\"\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  GCC=$lt_save_GCC\n  CC=\"$lt_save_CC\"\n  CFLAGS=\"$lt_save_CFLAGS\"\nfi # test \"$_lt_disable_F77\" != yes\n\nAC_LANG_POP\n])# _LT_LANG_F77_CONFIG\n\n\n# _LT_LANG_FC_CONFIG([TAG])\n# -------------------------\n# Ensure that the configuration variables for a Fortran compiler are\n# suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_FC_CONFIG],\n[AC_LANG_PUSH(Fortran)\n\nif test -z \"$FC\" || test \"X$FC\" = \"Xno\"; then\n  _lt_disable_FC=yes\nfi\n\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for fc test sources.\nac_ext=${ac_fc_srcext-f}\n\n# Object file extension for compiled fc test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the FC compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test \"$_lt_disable_FC\" != yes; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"\\\n      subroutine t\n      return\n      end\n\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code=\"\\\n      program t\n      end\n\"\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=\"$CC\"\n  lt_save_GCC=$GCC\n  lt_save_CFLAGS=$CFLAGS\n  CC=${FC-\"f95\"}\n  CFLAGS=$FCFLAGS\n  compiler=$CC\n  GCC=$ac_cv_fc_compiler_gnu\n\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n\n  if test -n \"$compiler\"; then\n    AC_MSG_CHECKING([if libtool supports shared libraries])\n    AC_MSG_RESULT([$can_build_shared])\n\n    AC_MSG_CHECKING([whether to build shared libraries])\n    test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n    # On AIX, shared libraries and static libraries use the same namespace, and\n    # are all built from PIC.\n    case $host_os in\n      aix3*)\n        test \"$enable_shared\" = yes && enable_static=no\n        if test -n \"$RANLIB\"; then\n          archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n          postinstall_cmds='$RANLIB $lib'\n        fi\n        ;;\n      aix[[4-9]]*)\n\tif test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n\t  test \"$enable_shared\" = yes && enable_static=no\n\tfi\n        ;;\n    esac\n    AC_MSG_RESULT([$enable_shared])\n\n    AC_MSG_CHECKING([whether to build static libraries])\n    # Make sure either enable_shared or enable_static is yes.\n    test \"$enable_shared\" = yes || enable_static=yes\n    AC_MSG_RESULT([$enable_static])\n\n    _LT_TAGVAR(GCC, $1)=\"$ac_cv_fc_compiler_gnu\"\n    _LT_TAGVAR(LD, $1)=\"$LD\"\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_SYS_HIDDEN_LIBDEPS($1)\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  GCC=$lt_save_GCC\n  CC=$lt_save_CC\n  CFLAGS=$lt_save_CFLAGS\nfi # test \"$_lt_disable_FC\" != yes\n\nAC_LANG_POP\n])# _LT_LANG_FC_CONFIG\n\n\n# _LT_LANG_GCJ_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for the GNU Java Compiler compiler\n# are suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_GCJ_CONFIG],\n[AC_REQUIRE([LT_PROG_GCJ])dnl\nAC_LANG_SAVE\n\n# Source file extension for Java test sources.\nac_ext=java\n\n# Object file extension for compiled Java test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"class foo {}\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'\n\n# ltmain only uses $CC for tagged configurations so make sure $CC is set.\n_LT_TAG_COMPILER\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n# Allow CC to be a program name with arguments.\nlt_save_CC=$CC\nlt_save_CFLAGS=$CFLAGS\nlt_save_GCC=$GCC\nGCC=yes\nCC=${GCJ-\"gcj\"}\nCFLAGS=$GCJFLAGS\ncompiler=$CC\n_LT_TAGVAR(compiler, $1)=$CC\n_LT_TAGVAR(LD, $1)=\"$LD\"\n_LT_CC_BASENAME([$compiler])\n\n# GCJ did not exist at the time GCC didn't implicitly link libc in.\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n\nif test -n \"$compiler\"; then\n  _LT_COMPILER_NO_RTTI($1)\n  _LT_COMPILER_PIC($1)\n  _LT_COMPILER_C_O($1)\n  _LT_COMPILER_FILE_LOCKS($1)\n  _LT_LINKER_SHLIBS($1)\n  _LT_LINKER_HARDCODE_LIBPATH($1)\n\n  _LT_CONFIG($1)\nfi\n\nAC_LANG_RESTORE\n\nGCC=$lt_save_GCC\nCC=$lt_save_CC\nCFLAGS=$lt_save_CFLAGS\n])# _LT_LANG_GCJ_CONFIG\n\n\n# _LT_LANG_GO_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for the GNU Go compiler\n# are suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_GO_CONFIG],\n[AC_REQUIRE([LT_PROG_GO])dnl\nAC_LANG_SAVE\n\n# Source file extension for Go test sources.\nac_ext=go\n\n# Object file extension for compiled Go test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"package main; func main() { }\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='package main; func main() { }'\n\n# ltmain only uses $CC for tagged configurations so make sure $CC is set.\n_LT_TAG_COMPILER\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n# Allow CC to be a program name with arguments.\nlt_save_CC=$CC\nlt_save_CFLAGS=$CFLAGS\nlt_save_GCC=$GCC\nGCC=yes\nCC=${GOC-\"gccgo\"}\nCFLAGS=$GOFLAGS\ncompiler=$CC\n_LT_TAGVAR(compiler, $1)=$CC\n_LT_TAGVAR(LD, $1)=\"$LD\"\n_LT_CC_BASENAME([$compiler])\n\n# Go did not exist at the time GCC didn't implicitly link libc in.\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n\nif test -n \"$compiler\"; then\n  _LT_COMPILER_NO_RTTI($1)\n  _LT_COMPILER_PIC($1)\n  _LT_COMPILER_C_O($1)\n  _LT_COMPILER_FILE_LOCKS($1)\n  _LT_LINKER_SHLIBS($1)\n  _LT_LINKER_HARDCODE_LIBPATH($1)\n\n  _LT_CONFIG($1)\nfi\n\nAC_LANG_RESTORE\n\nGCC=$lt_save_GCC\nCC=$lt_save_CC\nCFLAGS=$lt_save_CFLAGS\n])# _LT_LANG_GO_CONFIG\n\n\n# _LT_LANG_RC_CONFIG([TAG])\n# -------------------------\n# Ensure that the configuration variables for the Windows resource compiler\n# are suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_RC_CONFIG],\n[AC_REQUIRE([LT_PROG_RC])dnl\nAC_LANG_SAVE\n\n# Source file extension for RC test sources.\nac_ext=rc\n\n# Object file extension for compiled RC test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code='sample MENU { MENUITEM \"&Soup\", 100, CHECKED }'\n\n# Code to be used in simple link tests\nlt_simple_link_test_code=\"$lt_simple_compile_test_code\"\n\n# ltmain only uses $CC for tagged configurations so make sure $CC is set.\n_LT_TAG_COMPILER\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n# Allow CC to be a program name with arguments.\nlt_save_CC=\"$CC\"\nlt_save_CFLAGS=$CFLAGS\nlt_save_GCC=$GCC\nGCC=\nCC=${RC-\"windres\"}\nCFLAGS=\ncompiler=$CC\n_LT_TAGVAR(compiler, $1)=$CC\n_LT_CC_BASENAME([$compiler])\n_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes\n\nif test -n \"$compiler\"; then\n  :\n  _LT_CONFIG($1)\nfi\n\nGCC=$lt_save_GCC\nAC_LANG_RESTORE\nCC=$lt_save_CC\nCFLAGS=$lt_save_CFLAGS\n])# _LT_LANG_RC_CONFIG\n\n\n# LT_PROG_GCJ\n# -----------\nAC_DEFUN([LT_PROG_GCJ],\n[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],\n  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],\n    [AC_CHECK_TOOL(GCJ, gcj,)\n      test \"x${GCJFLAGS+set}\" = xset || GCJFLAGS=\"-g -O2\"\n      AC_SUBST(GCJFLAGS)])])[]dnl\n])\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_GCJ], [])\n\n\n# LT_PROG_GO\n# ----------\nAC_DEFUN([LT_PROG_GO],\n[AC_CHECK_TOOL(GOC, gccgo,)\n])\n\n\n# LT_PROG_RC\n# ----------\nAC_DEFUN([LT_PROG_RC],\n[AC_CHECK_TOOL(RC, windres,)\n])\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_RC], [])\n\n\n# _LT_DECL_EGREP\n# --------------\n# If we don't have a new enough Autoconf to choose the best grep\n# available, choose the one first in the user's PATH.\nm4_defun([_LT_DECL_EGREP],\n[AC_REQUIRE([AC_PROG_EGREP])dnl\nAC_REQUIRE([AC_PROG_FGREP])dnl\ntest -z \"$GREP\" && GREP=grep\n_LT_DECL([], [GREP], [1], [A grep program that handles long lines])\n_LT_DECL([], [EGREP], [1], [An ERE matcher])\n_LT_DECL([], [FGREP], [1], [A literal string matcher])\ndnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too\nAC_SUBST([GREP])\n])\n\n\n# _LT_DECL_OBJDUMP\n# --------------\n# If we don't have a new enough Autoconf to choose the best objdump\n# available, choose the one first in the user's PATH.\nm4_defun([_LT_DECL_OBJDUMP],\n[AC_CHECK_TOOL(OBJDUMP, objdump, false)\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])\nAC_SUBST([OBJDUMP])\n])\n\n# _LT_DECL_DLLTOOL\n# ----------------\n# Ensure DLLTOOL variable is set.\nm4_defun([_LT_DECL_DLLTOOL],\n[AC_CHECK_TOOL(DLLTOOL, dlltool, false)\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\n_LT_DECL([], [DLLTOOL], [1], [DLL creation program])\nAC_SUBST([DLLTOOL])\n])\n\n# _LT_DECL_SED\n# ------------\n# Check for a fully-functional sed program, that truncates\n# as few characters as possible.  Prefer GNU sed if found.\nm4_defun([_LT_DECL_SED],\n[AC_PROG_SED\ntest -z \"$SED\" && SED=sed\nXsed=\"$SED -e 1s/^X//\"\n_LT_DECL([], [SED], [1], [A sed program that does not truncate output])\n_LT_DECL([], [Xsed], [\"\\$SED -e 1s/^X//\"],\n    [Sed that helps us avoid accidentally triggering echo(1) options like -n])\n])# _LT_DECL_SED\n\nm4_ifndef([AC_PROG_SED], [\n# NOTE: This macro has been submitted for inclusion into   #\n#  GNU Autoconf as AC_PROG_SED.  When it is available in   #\n#  a released version of Autoconf we should remove this    #\n#  macro and use it instead.                               #\n\nm4_defun([AC_PROG_SED],\n[AC_MSG_CHECKING([for a sed that does not truncate output])\nAC_CACHE_VAL(lt_cv_path_SED,\n[# Loop through the user's path and test for sed and gsed.\n# Then use that list of sed's as ones to test for truncation.\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for lt_ac_prog in sed gsed; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      if $as_executable_p \"$as_dir/$lt_ac_prog$ac_exec_ext\"; then\n        lt_ac_sed_list=\"$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext\"\n      fi\n    done\n  done\ndone\nIFS=$as_save_IFS\nlt_ac_max=0\nlt_ac_count=0\n# Add /usr/xpg4/bin/sed as it is typically found on Solaris\n# along with /bin/sed that truncates output.\nfor lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do\n  test ! -f $lt_ac_sed && continue\n  cat /dev/null > conftest.in\n  lt_ac_count=0\n  echo $ECHO_N \"0123456789$ECHO_C\" >conftest.in\n  # Check for GNU sed and select it if it is found.\n  if \"$lt_ac_sed\" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then\n    lt_cv_path_SED=$lt_ac_sed\n    break\n  fi\n  while true; do\n    cat conftest.in conftest.in >conftest.tmp\n    mv conftest.tmp conftest.in\n    cp conftest.in conftest.nl\n    echo >>conftest.nl\n    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break\n    cmp -s conftest.out conftest.nl || break\n    # 10000 chars as input seems more than enough\n    test $lt_ac_count -gt 10 && break\n    lt_ac_count=`expr $lt_ac_count + 1`\n    if test $lt_ac_count -gt $lt_ac_max; then\n      lt_ac_max=$lt_ac_count\n      lt_cv_path_SED=$lt_ac_sed\n    fi\n  done\ndone\n])\nSED=$lt_cv_path_SED\nAC_SUBST([SED])\nAC_MSG_RESULT([$SED])\n])#AC_PROG_SED\n])#m4_ifndef\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_SED], [])\n\n\n# _LT_CHECK_SHELL_FEATURES\n# ------------------------\n# Find out whether the shell is Bourne or XSI compatible,\n# or has some other useful features.\nm4_defun([_LT_CHECK_SHELL_FEATURES],\n[AC_MSG_CHECKING([whether the shell understands some XSI constructs])\n# Try some XSI features\nxsi_shell=no\n( _lt_dummy=\"a/b/c\"\n  test \"${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}\"${_lt_dummy%\"$_lt_dummy\"}, \\\n      = c,a/b,b/c, \\\n    && eval 'test $(( 1 + 1 )) -eq 2 \\\n    && test \"${#_lt_dummy}\" -eq 5' ) >/dev/null 2>&1 \\\n  && xsi_shell=yes\nAC_MSG_RESULT([$xsi_shell])\n_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])\n\nAC_MSG_CHECKING([whether the shell understands \"+=\"])\nlt_shell_append=no\n( foo=bar; set foo baz; eval \"$[1]+=\\$[2]\" && test \"$foo\" = barbaz ) \\\n    >/dev/null 2>&1 \\\n  && lt_shell_append=yes\nAC_MSG_RESULT([$lt_shell_append])\n_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])\n\nif ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then\n  lt_unset=unset\nelse\n  lt_unset=false\nfi\n_LT_DECL([], [lt_unset], [0], [whether the shell understands \"unset\"])dnl\n\n# test EBCDIC or ASCII\ncase `echo X|tr X '\\101'` in\n A) # ASCII based system\n    # \\n is not interpreted correctly by Solaris 8 /usr/ucb/tr\n  lt_SP2NL='tr \\040 \\012'\n  lt_NL2SP='tr \\015\\012 \\040\\040'\n  ;;\n *) # EBCDIC based system\n  lt_SP2NL='tr \\100 \\n'\n  lt_NL2SP='tr \\r\\n \\100\\100'\n  ;;\nesac\n_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl\n_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl\n])# _LT_CHECK_SHELL_FEATURES\n\n\n# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)\n# ------------------------------------------------------\n# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and\n# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.\nm4_defun([_LT_PROG_FUNCTION_REPLACE],\n[dnl {\nsed -e '/^$1 ()$/,/^} # $1 /c\\\n$1 ()\\\n{\\\nm4_bpatsubsts([$2], [$], [\\\\], [^\\([\t ]\\)], [\\\\\\1])\n} # Extended-shell $1 implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n])\n\n\n# _LT_PROG_REPLACE_SHELLFNS\n# -------------------------\n# Replace existing portable implementations of several shell functions with\n# equivalent extended shell implementations where those features are available..\nm4_defun([_LT_PROG_REPLACE_SHELLFNS],\n[if test x\"$xsi_shell\" = xyes; then\n  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl\n    case ${1} in\n      */*) func_dirname_result=\"${1%/*}${2}\" ;;\n      *  ) func_dirname_result=\"${3}\" ;;\n    esac])\n\n  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl\n    func_basename_result=\"${1##*/}\"])\n\n  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl\n    case ${1} in\n      */*) func_dirname_result=\"${1%/*}${2}\" ;;\n      *  ) func_dirname_result=\"${3}\" ;;\n    esac\n    func_basename_result=\"${1##*/}\"])\n\n  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl\n    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\n    # positional parameters, so assign one to ordinary parameter first.\n    func_stripname_result=${3}\n    func_stripname_result=${func_stripname_result#\"${1}\"}\n    func_stripname_result=${func_stripname_result%\"${2}\"}])\n\n  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl\n    func_split_long_opt_name=${1%%=*}\n    func_split_long_opt_arg=${1#*=}])\n\n  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl\n    func_split_short_opt_arg=${1#??}\n    func_split_short_opt_name=${1%\"$func_split_short_opt_arg\"}])\n\n  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl\n    case ${1} in\n      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\n      *)    func_lo2o_result=${1} ;;\n    esac])\n\n  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])\n\n  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])\n\n  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])\nfi\n\nif test x\"$lt_shell_append\" = xyes; then\n  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval \"${1}+=\\\\${2}\"])\n\n  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl\n    func_quote_for_eval \"${2}\"\ndnl m4 expansion turns \\\\\\\\ into \\\\, and then the shell eval turns that into \\\n    eval \"${1}+=\\\\\\\\ \\\\$func_quote_for_eval_result\"])\n\n  # Save a `func_append' function call where possible by direct use of '+='\n  sed -e 's%func_append \\([[a-zA-Z_]]\\{1,\\}\\) \"%\\1+=\"%g' $cfgfile > $cfgfile.tmp \\\n    && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n      || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\n  test 0 -eq $? || _lt_function_replace_fail=:\nelse\n  # Save a `func_append' function call even when '+=' is not available\n  sed -e 's%func_append \\([[a-zA-Z_]]\\{1,\\}\\) \"%\\1=\"$\\1%g' $cfgfile > $cfgfile.tmp \\\n    && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n      || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\n  test 0 -eq $? || _lt_function_replace_fail=:\nfi\n\nif test x\"$_lt_function_replace_fail\" = x\":\"; then\n  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])\nfi\n])\n\n# _LT_PATH_CONVERSION_FUNCTIONS\n# -----------------------------\n# Determine which file name conversion functions should be used by\n# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed\n# for certain cross-compile configurations and native mingw.\nm4_defun([_LT_PATH_CONVERSION_FUNCTIONS],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\nAC_MSG_CHECKING([how to convert $build file names to $host format])\nAC_CACHE_VAL(lt_cv_to_host_file_cmd,\n[case $host in\n  *-*-mingw* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32\n        ;;\n      *-*-cygwin* )\n        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32\n        ;;\n      * ) # otherwise, assume *nix\n        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32\n        ;;\n    esac\n    ;;\n  *-*-cygwin* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin\n        ;;\n      *-*-cygwin* )\n        lt_cv_to_host_file_cmd=func_convert_file_noop\n        ;;\n      * ) # otherwise, assume *nix\n        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin\n        ;;\n    esac\n    ;;\n  * ) # unhandled hosts (and \"normal\" native builds)\n    lt_cv_to_host_file_cmd=func_convert_file_noop\n    ;;\nesac\n])\nto_host_file_cmd=$lt_cv_to_host_file_cmd\nAC_MSG_RESULT([$lt_cv_to_host_file_cmd])\n_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],\n         [0], [convert $build file names to $host format])dnl\n\nAC_MSG_CHECKING([how to convert $build file names to toolchain format])\nAC_CACHE_VAL(lt_cv_to_tool_file_cmd,\n[#assume ordinary cross tools, or native build.\nlt_cv_to_tool_file_cmd=func_convert_file_noop\ncase $host in\n  *-*-mingw* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32\n        ;;\n    esac\n    ;;\nesac\n])\nto_tool_file_cmd=$lt_cv_to_tool_file_cmd\nAC_MSG_RESULT([$lt_cv_to_tool_file_cmd])\n_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],\n         [0], [convert $build files to toolchain format])dnl\n])# _LT_PATH_CONVERSION_FUNCTIONS\n\n# Helper functions for option handling.                    -*- Autoconf -*-\n#\n#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,\n#   Inc.\n#   Written by Gary V. Vaughan, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 7 ltoptions.m4\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])\n\n\n# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)\n# ------------------------------------------\nm4_define([_LT_MANGLE_OPTION],\n[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])\n\n\n# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)\n# ---------------------------------------\n# Set option OPTION-NAME for macro MACRO-NAME, and if there is a\n# matching handler defined, dispatch to it.  Other OPTION-NAMEs are\n# saved as a flag.\nm4_define([_LT_SET_OPTION],\n[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl\nm4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),\n        _LT_MANGLE_DEFUN([$1], [$2]),\n    [m4_warning([Unknown $1 option `$2'])])[]dnl\n])\n\n\n# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])\n# ------------------------------------------------------------\n# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.\nm4_define([_LT_IF_OPTION],\n[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])\n\n\n# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)\n# -------------------------------------------------------\n# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME\n# are set.\nm4_define([_LT_UNLESS_OPTIONS],\n[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),\n\t    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),\n\t\t      [m4_define([$0_found])])])[]dnl\nm4_ifdef([$0_found], [m4_undefine([$0_found])], [$3\n])[]dnl\n])\n\n\n# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)\n# ----------------------------------------\n# OPTION-LIST is a space-separated list of Libtool options associated\n# with MACRO-NAME.  If any OPTION has a matching handler declared with\n# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about\n# the unknown option and exit.\nm4_defun([_LT_SET_OPTIONS],\n[# Set options\nm4_foreach([_LT_Option], m4_split(m4_normalize([$2])),\n    [_LT_SET_OPTION([$1], _LT_Option)])\n\nm4_if([$1],[LT_INIT],[\n  dnl\n  dnl Simply set some default values (i.e off) if boolean options were not\n  dnl specified:\n  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no\n  ])\n  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no\n  ])\n  dnl\n  dnl If no reference was made to various pairs of opposing options, then\n  dnl we run the default mode handler for the pair.  For example, if neither\n  dnl `shared' nor `disable-shared' was passed, we enable building of shared\n  dnl archives by default:\n  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])\n  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])\n  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])\n  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],\n  \t\t   [_LT_ENABLE_FAST_INSTALL])\n  ])\n])# _LT_SET_OPTIONS\n\n\n\n# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)\n# -----------------------------------------\nm4_define([_LT_MANGLE_DEFUN],\n[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])\n\n\n# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)\n# -----------------------------------------------\nm4_define([LT_OPTION_DEFINE],\n[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl\n])# LT_OPTION_DEFINE\n\n\n# dlopen\n# ------\nLT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes\n])\n\nAU_DEFUN([AC_LIBTOOL_DLOPEN],\n[_LT_SET_OPTION([LT_INIT], [dlopen])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the `dlopen' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])\n\n\n# win32-dll\n# ---------\n# Declare package support for building win32 dll's.\nLT_OPTION_DEFINE([LT_INIT], [win32-dll],\n[enable_win32_dll=yes\n\ncase $host in\n*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)\n  AC_CHECK_TOOL(AS, as, false)\n  AC_CHECK_TOOL(DLLTOOL, dlltool, false)\n  AC_CHECK_TOOL(OBJDUMP, objdump, false)\n  ;;\nesac\n\ntest -z \"$AS\" && AS=as\n_LT_DECL([], [AS],      [1], [Assembler program])dnl\n\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\n_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl\n\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl\n])# win32-dll\n\nAU_DEFUN([AC_LIBTOOL_WIN32_DLL],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\n_LT_SET_OPTION([LT_INIT], [win32-dll])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the `win32-dll' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])\n\n\n# _LT_ENABLE_SHARED([DEFAULT])\n# ----------------------------\n# implement the --enable-shared flag, and supports the `shared' and\n# `disable-shared' LT_INIT options.\n# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.\nm4_define([_LT_ENABLE_SHARED],\n[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([shared],\n    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],\n\t[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_shared=yes ;;\n    no) enable_shared=no ;;\n    *)\n      enable_shared=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_shared=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)\n\n    _LT_DECL([build_libtool_libs], [enable_shared], [0],\n\t[Whether or not to build shared libraries])\n])# _LT_ENABLE_SHARED\n\nLT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])\n\n# Old names:\nAC_DEFUN([AC_ENABLE_SHARED],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])\n])\n\nAC_DEFUN([AC_DISABLE_SHARED],\n[_LT_SET_OPTION([LT_INIT], [disable-shared])\n])\n\nAU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])\nAU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_ENABLE_SHARED], [])\ndnl AC_DEFUN([AM_DISABLE_SHARED], [])\n\n\n\n# _LT_ENABLE_STATIC([DEFAULT])\n# ----------------------------\n# implement the --enable-static flag, and support the `static' and\n# `disable-static' LT_INIT options.\n# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.\nm4_define([_LT_ENABLE_STATIC],\n[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([static],\n    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],\n\t[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_static=yes ;;\n    no) enable_static=no ;;\n    *)\n     enable_static=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_static=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)\n\n    _LT_DECL([build_old_libs], [enable_static], [0],\n\t[Whether or not to build static libraries])\n])# _LT_ENABLE_STATIC\n\nLT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])\n\n# Old names:\nAC_DEFUN([AC_ENABLE_STATIC],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])\n])\n\nAC_DEFUN([AC_DISABLE_STATIC],\n[_LT_SET_OPTION([LT_INIT], [disable-static])\n])\n\nAU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])\nAU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_ENABLE_STATIC], [])\ndnl AC_DEFUN([AM_DISABLE_STATIC], [])\n\n\n\n# _LT_ENABLE_FAST_INSTALL([DEFAULT])\n# ----------------------------------\n# implement the --enable-fast-install flag, and support the `fast-install'\n# and `disable-fast-install' LT_INIT options.\n# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.\nm4_define([_LT_ENABLE_FAST_INSTALL],\n[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([fast-install],\n    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],\n    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_fast_install=yes ;;\n    no) enable_fast_install=no ;;\n    *)\n      enable_fast_install=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_fast_install=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)\n\n_LT_DECL([fast_install], [enable_fast_install], [0],\n\t [Whether or not to optimize for fast installation])dnl\n])# _LT_ENABLE_FAST_INSTALL\n\nLT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])\n\n# Old names:\nAU_DEFUN([AC_ENABLE_FAST_INSTALL],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you put\nthe `fast-install' option into LT_INIT's first parameter.])\n])\n\nAU_DEFUN([AC_DISABLE_FAST_INSTALL],\n[_LT_SET_OPTION([LT_INIT], [disable-fast-install])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you put\nthe `disable-fast-install' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])\ndnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])\n\n\n# _LT_WITH_PIC([MODE])\n# --------------------\n# implement the --with-pic flag, and support the `pic-only' and `no-pic'\n# LT_INIT options.\n# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.\nm4_define([_LT_WITH_PIC],\n[AC_ARG_WITH([pic],\n    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],\n\t[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],\n    [lt_p=${PACKAGE-default}\n    case $withval in\n    yes|no) pic_mode=$withval ;;\n    *)\n      pic_mode=default\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for lt_pkg in $withval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$lt_pkg\" = \"X$lt_p\"; then\n\t  pic_mode=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [pic_mode=default])\n\ntest -z \"$pic_mode\" && pic_mode=m4_default([$1], [default])\n\n_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl\n])# _LT_WITH_PIC\n\nLT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])\nLT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])\n\n# Old name:\nAU_DEFUN([AC_LIBTOOL_PICMODE],\n[_LT_SET_OPTION([LT_INIT], [pic-only])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the `pic-only' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])\n\n\nm4_define([_LTDL_MODE], [])\nLT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],\n\t\t [m4_define([_LTDL_MODE], [nonrecursive])])\nLT_OPTION_DEFINE([LTDL_INIT], [recursive],\n\t\t [m4_define([_LTDL_MODE], [recursive])])\nLT_OPTION_DEFINE([LTDL_INIT], [subproject],\n\t\t [m4_define([_LTDL_MODE], [subproject])])\n\nm4_define([_LTDL_TYPE], [])\nLT_OPTION_DEFINE([LTDL_INIT], [installable],\n\t\t [m4_define([_LTDL_TYPE], [installable])])\nLT_OPTION_DEFINE([LTDL_INIT], [convenience],\n\t\t [m4_define([_LTDL_TYPE], [convenience])])\n\n# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-\n#\n# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.\n# Written by Gary V. Vaughan, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 6 ltsugar.m4\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])\n\n\n# lt_join(SEP, ARG1, [ARG2...])\n# -----------------------------\n# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their\n# associated separator.\n# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier\n# versions in m4sugar had bugs.\nm4_define([lt_join],\n[m4_if([$#], [1], [],\n       [$#], [2], [[$2]],\n       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])\nm4_define([_lt_join],\n[m4_if([$#$2], [2], [],\n       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])\n\n\n# lt_car(LIST)\n# lt_cdr(LIST)\n# ------------\n# Manipulate m4 lists.\n# These macros are necessary as long as will still need to support\n# Autoconf-2.59 which quotes differently.\nm4_define([lt_car], [[$1]])\nm4_define([lt_cdr],\n[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],\n       [$#], 1, [],\n       [m4_dquote(m4_shift($@))])])\nm4_define([lt_unquote], $1)\n\n\n# lt_append(MACRO-NAME, STRING, [SEPARATOR])\n# ------------------------------------------\n# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.\n# Note that neither SEPARATOR nor STRING are expanded; they are appended\n# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).\n# No SEPARATOR is output if MACRO-NAME was previously undefined (different\n# than defined and empty).\n#\n# This macro is needed until we can rely on Autoconf 2.62, since earlier\n# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.\nm4_define([lt_append],\n[m4_define([$1],\n\t   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])\n\n\n\n# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])\n# ----------------------------------------------------------\n# Produce a SEP delimited list of all paired combinations of elements of\n# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list\n# has the form PREFIXmINFIXSUFFIXn.\n# Needed until we can rely on m4_combine added in Autoconf 2.62.\nm4_define([lt_combine],\n[m4_if(m4_eval([$# > 3]), [1],\n       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl\n[[m4_foreach([_Lt_prefix], [$2],\n\t     [m4_foreach([_Lt_suffix],\n\t\t]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,\n\t[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])\n\n\n# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])\n# -----------------------------------------------------------------------\n# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited\n# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.\nm4_define([lt_if_append_uniq],\n[m4_ifdef([$1],\n\t  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],\n\t\t [lt_append([$1], [$2], [$3])$4],\n\t\t [$5])],\n\t  [lt_append([$1], [$2], [$3])$4])])\n\n\n# lt_dict_add(DICT, KEY, VALUE)\n# -----------------------------\nm4_define([lt_dict_add],\n[m4_define([$1($2)], [$3])])\n\n\n# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)\n# --------------------------------------------\nm4_define([lt_dict_add_subkey],\n[m4_define([$1($2:$3)], [$4])])\n\n\n# lt_dict_fetch(DICT, KEY, [SUBKEY])\n# ----------------------------------\nm4_define([lt_dict_fetch],\n[m4_ifval([$3],\n\tm4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),\n    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])\n\n\n# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])\n# -----------------------------------------------------------------\nm4_define([lt_if_dict_fetch],\n[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],\n\t[$5],\n    [$6])])\n\n\n# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])\n# --------------------------------------------------------------\nm4_define([lt_dict_filter],\n[m4_if([$5], [], [],\n  [lt_join(m4_quote(m4_default([$4], [[, ]])),\n           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),\n\t\t      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl\n])\n\n# ltversion.m4 -- version numbers\t\t\t-*- Autoconf -*-\n#\n#   Copyright (C) 2004 Free Software Foundation, Inc.\n#   Written by Scott James Remnant, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# @configure_input@\n\n# serial 3337 ltversion.m4\n# This file is part of GNU Libtool\n\nm4_define([LT_PACKAGE_VERSION], [2.4.2])\nm4_define([LT_PACKAGE_REVISION], [1.3337])\n\nAC_DEFUN([LTVERSION_VERSION],\n[macro_version='2.4.2'\nmacro_revision='1.3337'\n_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])\n_LT_DECL(, macro_revision, 0)\n])\n\n# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-\n#\n#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.\n#   Written by Scott James Remnant, 2004.\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 5 lt~obsolete.m4\n\n# These exist entirely to fool aclocal when bootstrapping libtool.\n#\n# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)\n# which have later been changed to m4_define as they aren't part of the\n# exported API, or moved to Autoconf or Automake where they belong.\n#\n# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN\n# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us\n# using a macro with the same name in our local m4/libtool.m4 it'll\n# pull the old libtool.m4 in (it doesn't see our shiny new m4_define\n# and doesn't know about Autoconf macros at all.)\n#\n# So we provide this file, which has a silly filename so it's always\n# included after everything else.  This provides aclocal with the\n# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything\n# because those macros already exist, or will be overwritten later.\n# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. \n#\n# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.\n# Yes, that means every name once taken will need to remain here until\n# we give up compatibility with versions before 1.7, at which point\n# we need to keep only those names which we still refer to.\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])\n\nm4_ifndef([AC_LIBTOOL_LINKER_OPTION],\t[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])\nm4_ifndef([AC_PROG_EGREP],\t\t[AC_DEFUN([AC_PROG_EGREP])])\nm4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],\t[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])\nm4_ifndef([_LT_AC_SHELL_INIT],\t\t[AC_DEFUN([_LT_AC_SHELL_INIT])])\nm4_ifndef([_LT_AC_SYS_LIBPATH_AIX],\t[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])\nm4_ifndef([_LT_PROG_LTMAIN],\t\t[AC_DEFUN([_LT_PROG_LTMAIN])])\nm4_ifndef([_LT_AC_TAGVAR],\t\t[AC_DEFUN([_LT_AC_TAGVAR])])\nm4_ifndef([AC_LTDL_ENABLE_INSTALL],\t[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])\nm4_ifndef([AC_LTDL_PREOPEN],\t\t[AC_DEFUN([AC_LTDL_PREOPEN])])\nm4_ifndef([_LT_AC_SYS_COMPILER],\t[AC_DEFUN([_LT_AC_SYS_COMPILER])])\nm4_ifndef([_LT_AC_LOCK],\t\t[AC_DEFUN([_LT_AC_LOCK])])\nm4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],\t[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])\nm4_ifndef([_LT_AC_TRY_DLOPEN_SELF],\t[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])\nm4_ifndef([AC_LIBTOOL_PROG_CC_C_O],\t[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])\nm4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])\nm4_ifndef([AC_LIBTOOL_OBJDIR],\t\t[AC_DEFUN([AC_LIBTOOL_OBJDIR])])\nm4_ifndef([AC_LTDL_OBJDIR],\t\t[AC_DEFUN([AC_LTDL_OBJDIR])])\nm4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])\nm4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],\t[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])\nm4_ifndef([AC_PATH_MAGIC],\t\t[AC_DEFUN([AC_PATH_MAGIC])])\nm4_ifndef([AC_PROG_LD_GNU],\t\t[AC_DEFUN([AC_PROG_LD_GNU])])\nm4_ifndef([AC_PROG_LD_RELOAD_FLAG],\t[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])\nm4_ifndef([AC_DEPLIBS_CHECK_METHOD],\t[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])\nm4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])\nm4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])\nm4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])\nm4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],\t[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])\nm4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],\t[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])\nm4_ifndef([LT_AC_PROG_EGREP],\t\t[AC_DEFUN([LT_AC_PROG_EGREP])])\nm4_ifndef([LT_AC_PROG_SED],\t\t[AC_DEFUN([LT_AC_PROG_SED])])\nm4_ifndef([_LT_CC_BASENAME],\t\t[AC_DEFUN([_LT_CC_BASENAME])])\nm4_ifndef([_LT_COMPILER_BOILERPLATE],\t[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])\nm4_ifndef([_LT_LINKER_BOILERPLATE],\t[AC_DEFUN([_LT_LINKER_BOILERPLATE])])\nm4_ifndef([_AC_PROG_LIBTOOL],\t\t[AC_DEFUN([_AC_PROG_LIBTOOL])])\nm4_ifndef([AC_LIBTOOL_SETUP],\t\t[AC_DEFUN([AC_LIBTOOL_SETUP])])\nm4_ifndef([_LT_AC_CHECK_DLFCN],\t\t[AC_DEFUN([_LT_AC_CHECK_DLFCN])])\nm4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],\t[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])\nm4_ifndef([_LT_AC_TAGCONFIG],\t\t[AC_DEFUN([_LT_AC_TAGCONFIG])])\nm4_ifndef([AC_DISABLE_FAST_INSTALL],\t[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])\nm4_ifndef([_LT_AC_LANG_CXX],\t\t[AC_DEFUN([_LT_AC_LANG_CXX])])\nm4_ifndef([_LT_AC_LANG_F77],\t\t[AC_DEFUN([_LT_AC_LANG_F77])])\nm4_ifndef([_LT_AC_LANG_GCJ],\t\t[AC_DEFUN([_LT_AC_LANG_GCJ])])\nm4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])\nm4_ifndef([_LT_AC_LANG_C_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])\nm4_ifndef([_LT_AC_LANG_CXX_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])\nm4_ifndef([_LT_AC_LANG_F77_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])\nm4_ifndef([_LT_AC_LANG_GCJ_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])\nm4_ifndef([_LT_AC_LANG_RC_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])\nm4_ifndef([AC_LIBTOOL_CONFIG],\t\t[AC_DEFUN([AC_LIBTOOL_CONFIG])])\nm4_ifndef([_LT_AC_FILE_LTDLL_C],\t[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])\nm4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],\t[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])\nm4_ifndef([_LT_AC_PROG_CXXCPP],\t\t[AC_DEFUN([_LT_AC_PROG_CXXCPP])])\nm4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],\t[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])\nm4_ifndef([_LT_PROG_ECHO_BACKSLASH],\t[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])\nm4_ifndef([_LT_PROG_F77],\t\t[AC_DEFUN([_LT_PROG_F77])])\nm4_ifndef([_LT_PROG_FC],\t\t[AC_DEFUN([_LT_PROG_FC])])\nm4_ifndef([_LT_PROG_CXX],\t\t[AC_DEFUN([_LT_PROG_CXX])])\n\n# Copyright (C) 2002-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_AUTOMAKE_VERSION(VERSION)\n# ----------------------------\n# Automake X.Y traces this macro to ensure aclocal.m4 has been\n# generated from the m4 files accompanying Automake X.Y.\n# (This private macro should not be called outside this file.)\nAC_DEFUN([AM_AUTOMAKE_VERSION],\n[am__api_version='1.14'\ndnl Some users find AM_AUTOMAKE_VERSION and mistake it for a way to\ndnl require some minimum version.  Point them to the right macro.\nm4_if([$1], [1.14.1], [],\n      [AC_FATAL([Do not call $0, use AM_INIT_AUTOMAKE([$1]).])])dnl\n])\n\n# _AM_AUTOCONF_VERSION(VERSION)\n# -----------------------------\n# aclocal traces this macro to find the Autoconf version.\n# This is a private macro too.  Using m4_define simplifies\n# the logic in aclocal, which can simply ignore this definition.\nm4_define([_AM_AUTOCONF_VERSION], [])\n\n# AM_SET_CURRENT_AUTOMAKE_VERSION\n# -------------------------------\n# Call AM_AUTOMAKE_VERSION and AM_AUTOMAKE_VERSION so they can be traced.\n# This function is AC_REQUIREd by AM_INIT_AUTOMAKE.\nAC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION],\n[AM_AUTOMAKE_VERSION([1.14.1])dnl\nm4_ifndef([AC_AUTOCONF_VERSION],\n  [m4_copy([m4_PACKAGE_VERSION], [AC_AUTOCONF_VERSION])])dnl\n_AM_AUTOCONF_VERSION(m4_defn([AC_AUTOCONF_VERSION]))])\n\n# AM_AUX_DIR_EXPAND                                         -*- Autoconf -*-\n\n# Copyright (C) 2001-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets\n# $ac_aux_dir to '$srcdir/foo'.  In other projects, it is set to\n# '$srcdir', '$srcdir/..', or '$srcdir/../..'.\n#\n# Of course, Automake must honor this variable whenever it calls a\n# tool from the auxiliary directory.  The problem is that $srcdir (and\n# therefore $ac_aux_dir as well) can be either absolute or relative,\n# depending on how configure is run.  This is pretty annoying, since\n# it makes $ac_aux_dir quite unusable in subdirectories: in the top\n# source directory, any form will work fine, but in subdirectories a\n# relative path needs to be adjusted first.\n#\n# $ac_aux_dir/missing\n#    fails when called from a subdirectory if $ac_aux_dir is relative\n# $top_srcdir/$ac_aux_dir/missing\n#    fails if $ac_aux_dir is absolute,\n#    fails when called from a subdirectory in a VPATH build with\n#          a relative $ac_aux_dir\n#\n# The reason of the latter failure is that $top_srcdir and $ac_aux_dir\n# are both prefixed by $srcdir.  In an in-source build this is usually\n# harmless because $srcdir is '.', but things will broke when you\n# start a VPATH build or use an absolute $srcdir.\n#\n# So we could use something similar to $top_srcdir/$ac_aux_dir/missing,\n# iff we strip the leading $srcdir from $ac_aux_dir.  That would be:\n#   am_aux_dir='\\$(top_srcdir)/'`expr \"$ac_aux_dir\" : \"$srcdir//*\\(.*\\)\"`\n# and then we would define $MISSING as\n#   MISSING=\"\\${SHELL} $am_aux_dir/missing\"\n# This will work as long as MISSING is not called from configure, because\n# unfortunately $(top_srcdir) has no meaning in configure.\n# However there are other variables, like CC, which are often used in\n# configure, and could therefore not use this \"fixed\" $ac_aux_dir.\n#\n# Another solution, used here, is to always expand $ac_aux_dir to an\n# absolute PATH.  The drawback is that using absolute paths prevent a\n# configured tree to be moved without reconfiguration.\n\nAC_DEFUN([AM_AUX_DIR_EXPAND],\n[AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl\n# Expand $ac_aux_dir to an absolute path.\nam_aux_dir=`cd \"$ac_aux_dir\" && pwd`\n])\n\n# AM_CONDITIONAL                                            -*- Autoconf -*-\n\n# Copyright (C) 1997-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_CONDITIONAL(NAME, SHELL-CONDITION)\n# -------------------------------------\n# Define a conditional.\nAC_DEFUN([AM_CONDITIONAL],\n[AC_PREREQ([2.52])dnl\n m4_if([$1], [TRUE],  [AC_FATAL([$0: invalid condition: $1])],\n       [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl\nAC_SUBST([$1_TRUE])dnl\nAC_SUBST([$1_FALSE])dnl\n_AM_SUBST_NOTMAKE([$1_TRUE])dnl\n_AM_SUBST_NOTMAKE([$1_FALSE])dnl\nm4_define([_AM_COND_VALUE_$1], [$2])dnl\nif $2; then\n  $1_TRUE=\n  $1_FALSE='#'\nelse\n  $1_TRUE='#'\n  $1_FALSE=\nfi\nAC_CONFIG_COMMANDS_PRE(\n[if test -z \"${$1_TRUE}\" && test -z \"${$1_FALSE}\"; then\n  AC_MSG_ERROR([[conditional \"$1\" was never defined.\nUsually this means the macro was only invoked conditionally.]])\nfi])])\n\n# Copyright (C) 1999-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n\n# There are a few dirty hacks below to avoid letting 'AC_PROG_CC' be\n# written in clear, in which case automake, when reading aclocal.m4,\n# will think it sees a *use*, and therefore will trigger all it's\n# C support machinery.  Also note that it means that autoscan, seeing\n# CC etc. in the Makefile, will ask for an AC_PROG_CC use...\n\n\n# _AM_DEPENDENCIES(NAME)\n# ----------------------\n# See how the compiler implements dependency checking.\n# NAME is \"CC\", \"CXX\", \"OBJC\", \"OBJCXX\", \"UPC\", or \"GJC\".\n# We try a few techniques and use that to set a single cache variable.\n#\n# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was\n# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular\n# dependency, and given that the user is not expected to run this macro,\n# just rely on AC_PROG_CC.\nAC_DEFUN([_AM_DEPENDENCIES],\n[AC_REQUIRE([AM_SET_DEPDIR])dnl\nAC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl\nAC_REQUIRE([AM_MAKE_INCLUDE])dnl\nAC_REQUIRE([AM_DEP_TRACK])dnl\n\nm4_if([$1], [CC],   [depcc=\"$CC\"   am_compiler_list=],\n      [$1], [CXX],  [depcc=\"$CXX\"  am_compiler_list=],\n      [$1], [OBJC], [depcc=\"$OBJC\" am_compiler_list='gcc3 gcc'],\n      [$1], [OBJCXX], [depcc=\"$OBJCXX\" am_compiler_list='gcc3 gcc'],\n      [$1], [UPC],  [depcc=\"$UPC\"  am_compiler_list=],\n      [$1], [GCJ],  [depcc=\"$GCJ\"  am_compiler_list='gcc3 gcc'],\n                    [depcc=\"$$1\"   am_compiler_list=])\n\nAC_CACHE_CHECK([dependency style of $depcc],\n               [am_cv_$1_dependencies_compiler_type],\n[if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named 'D' -- because '-MD' means \"put the output\n  # in D\".\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_$1_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n ['s/^#*\\([a-zA-Z0-9]*\\))$/\\1/p'] < ./depcomp`\n  fi\n  am__universal=false\n  m4_case([$1], [CC],\n    [case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac],\n    [CXX],\n    [case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac])\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using \": > sub/conftst$i.h\" creates only sub/conftst1.h with\n      # Solaris 10 /bin/sh.\n      echo '/* dummy */' > sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with '-c' and '-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle '-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs.\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # After this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested.\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvc7 | msvc7msys | msvisualcpp | msvcmsys)\n      # This compiler won't grok '-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_$1_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_$1_dependencies_compiler_type=none\nfi\n])\nAC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type])\nAM_CONDITIONAL([am__fastdep$1], [\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_$1_dependencies_compiler_type\" = gcc3])\n])\n\n\n# AM_SET_DEPDIR\n# -------------\n# Choose a directory name for dependency files.\n# This macro is AC_REQUIREd in _AM_DEPENDENCIES.\nAC_DEFUN([AM_SET_DEPDIR],\n[AC_REQUIRE([AM_SET_LEADING_DOT])dnl\nAC_SUBST([DEPDIR], [\"${am__leading_dot}deps\"])dnl\n])\n\n\n# AM_DEP_TRACK\n# ------------\nAC_DEFUN([AM_DEP_TRACK],\n[AC_ARG_ENABLE([dependency-tracking], [dnl\nAS_HELP_STRING(\n  [--enable-dependency-tracking],\n  [do not reject slow dependency extractors])\nAS_HELP_STRING(\n  [--disable-dependency-tracking],\n  [speeds up one-time build])])\nif test \"x$enable_dependency_tracking\" != xno; then\n  am_depcomp=\"$ac_aux_dir/depcomp\"\n  AMDEPBACKSLASH='\\'\n  am__nodep='_no'\nfi\nAM_CONDITIONAL([AMDEP], [test \"x$enable_dependency_tracking\" != xno])\nAC_SUBST([AMDEPBACKSLASH])dnl\n_AM_SUBST_NOTMAKE([AMDEPBACKSLASH])dnl\nAC_SUBST([am__nodep])dnl\n_AM_SUBST_NOTMAKE([am__nodep])dnl\n])\n\n# Generate code to set up dependency tracking.              -*- Autoconf -*-\n\n# Copyright (C) 1999-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n\n# _AM_OUTPUT_DEPENDENCY_COMMANDS\n# ------------------------------\nAC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS],\n[{\n  # Older Autoconf quotes --file arguments for eval, but not when files\n  # are listed without --file.  Let's play safe and only enable the eval\n  # if we detect the quoting.\n  case $CONFIG_FILES in\n  *\\'*) eval set x \"$CONFIG_FILES\" ;;\n  *)   set x $CONFIG_FILES ;;\n  esac\n  shift\n  for mf\n  do\n    # Strip MF so we end up with the name of the file.\n    mf=`echo \"$mf\" | sed -e 's/:.*$//'`\n    # Check whether this is an Automake generated Makefile or not.\n    # We used to match only the files named 'Makefile.in', but\n    # some people rename them; so instead we look at the file content.\n    # Grep'ing the first line is not enough: some people post-process\n    # each Makefile.in and add a new line on top of each file to say so.\n    # Grep'ing the whole file is not good either: AIX grep has a line\n    # limit of 2048, but all sed's we know have understand at least 4000.\n    if sed -n 's,^#.*generated by automake.*,X,p' \"$mf\" | grep X >/dev/null 2>&1; then\n      dirpart=`AS_DIRNAME(\"$mf\")`\n    else\n      continue\n    fi\n    # Extract the definition of DEPDIR, am__include, and am__quote\n    # from the Makefile without running 'make'.\n    DEPDIR=`sed -n 's/^DEPDIR = //p' < \"$mf\"`\n    test -z \"$DEPDIR\" && continue\n    am__include=`sed -n 's/^am__include = //p' < \"$mf\"`\n    test -z \"$am__include\" && continue\n    am__quote=`sed -n 's/^am__quote = //p' < \"$mf\"`\n    # Find all dependency output files, they are included files with\n    # $(DEPDIR) in their names.  We invoke sed twice because it is the\n    # simplest approach to changing $(DEPDIR) to its actual value in the\n    # expansion.\n    for file in `sed -n \"\n      s/^$am__include $am__quote\\(.*(DEPDIR).*\\)$am__quote\"'$/\\1/p' <\"$mf\" | \\\n\t sed -e 's/\\$(DEPDIR)/'\"$DEPDIR\"'/g'`; do\n      # Make sure the directory exists.\n      test -f \"$dirpart/$file\" && continue\n      fdir=`AS_DIRNAME([\"$file\"])`\n      AS_MKDIR_P([$dirpart/$fdir])\n      # echo \"creating $dirpart/$file\"\n      echo '# dummy' > \"$dirpart/$file\"\n    done\n  done\n}\n])# _AM_OUTPUT_DEPENDENCY_COMMANDS\n\n\n# AM_OUTPUT_DEPENDENCY_COMMANDS\n# -----------------------------\n# This macro should only be invoked once -- use via AC_REQUIRE.\n#\n# This code is only required when automatic dependency tracking\n# is enabled.  FIXME.  This creates each '.P' file that we will\n# need in order to bootstrap the dependency handling code.\nAC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS],\n[AC_CONFIG_COMMANDS([depfiles],\n     [test x\"$AMDEP_TRUE\" != x\"\" || _AM_OUTPUT_DEPENDENCY_COMMANDS],\n     [AMDEP_TRUE=\"$AMDEP_TRUE\" ac_aux_dir=\"$ac_aux_dir\"])\n])\n\n# Do all the work for Automake.                             -*- Autoconf -*-\n\n# Copyright (C) 1996-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This macro actually does too much.  Some checks are only needed if\n# your package does certain things.  But this isn't really a big deal.\n\ndnl Redefine AC_PROG_CC to automatically invoke _AM_PROG_CC_C_O.\nm4_define([AC_PROG_CC],\nm4_defn([AC_PROG_CC])\n[_AM_PROG_CC_C_O\n])\n\n# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE])\n# AM_INIT_AUTOMAKE([OPTIONS])\n# -----------------------------------------------\n# The call with PACKAGE and VERSION arguments is the old style\n# call (pre autoconf-2.50), which is being phased out.  PACKAGE\n# and VERSION should now be passed to AC_INIT and removed from\n# the call to AM_INIT_AUTOMAKE.\n# We support both call styles for the transition.  After\n# the next Automake release, Autoconf can make the AC_INIT\n# arguments mandatory, and then we can depend on a new Autoconf\n# release and drop the old call support.\nAC_DEFUN([AM_INIT_AUTOMAKE],\n[AC_PREREQ([2.65])dnl\ndnl Autoconf wants to disallow AM_ names.  We explicitly allow\ndnl the ones we care about.\nm4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl\nAC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl\nAC_REQUIRE([AC_PROG_INSTALL])dnl\nif test \"`cd $srcdir && pwd`\" != \"`pwd`\"; then\n  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output\n  # is not polluted with repeated \"-I.\"\n  AC_SUBST([am__isrc], [' -I$(srcdir)'])_AM_SUBST_NOTMAKE([am__isrc])dnl\n  # test to see if srcdir already configured\n  if test -f $srcdir/config.status; then\n    AC_MSG_ERROR([source directory already configured; run \"make distclean\" there first])\n  fi\nfi\n\n# test whether we have cygpath\nif test -z \"$CYGPATH_W\"; then\n  if (cygpath --version) >/dev/null 2>/dev/null; then\n    CYGPATH_W='cygpath -w'\n  else\n    CYGPATH_W=echo\n  fi\nfi\nAC_SUBST([CYGPATH_W])\n\n# Define the identity of the package.\ndnl Distinguish between old-style and new-style calls.\nm4_ifval([$2],\n[AC_DIAGNOSE([obsolete],\n             [$0: two- and three-arguments forms are deprecated.])\nm4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl\n AC_SUBST([PACKAGE], [$1])dnl\n AC_SUBST([VERSION], [$2])],\n[_AM_SET_OPTIONS([$1])dnl\ndnl Diagnose old-style AC_INIT with new-style AM_AUTOMAKE_INIT.\nm4_if(\n  m4_ifdef([AC_PACKAGE_NAME], [ok]):m4_ifdef([AC_PACKAGE_VERSION], [ok]),\n  [ok:ok],,\n  [m4_fatal([AC_INIT should be called with package and version arguments])])dnl\n AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl\n AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl\n\n_AM_IF_OPTION([no-define],,\n[AC_DEFINE_UNQUOTED([PACKAGE], [\"$PACKAGE\"], [Name of package])\n AC_DEFINE_UNQUOTED([VERSION], [\"$VERSION\"], [Version number of package])])dnl\n\n# Some tools Automake needs.\nAC_REQUIRE([AM_SANITY_CHECK])dnl\nAC_REQUIRE([AC_ARG_PROGRAM])dnl\nAM_MISSING_PROG([ACLOCAL], [aclocal-${am__api_version}])\nAM_MISSING_PROG([AUTOCONF], [autoconf])\nAM_MISSING_PROG([AUTOMAKE], [automake-${am__api_version}])\nAM_MISSING_PROG([AUTOHEADER], [autoheader])\nAM_MISSING_PROG([MAKEINFO], [makeinfo])\nAC_REQUIRE([AM_PROG_INSTALL_SH])dnl\nAC_REQUIRE([AM_PROG_INSTALL_STRIP])dnl\nAC_REQUIRE([AC_PROG_MKDIR_P])dnl\n# For better backward compatibility.  To be removed once Automake 1.9.x\n# dies out for good.  For more background, see:\n# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>\n# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>\nAC_SUBST([mkdir_p], ['$(MKDIR_P)'])\n# We need awk for the \"check\" target.  The system \"awk\" is bad on\n# some platforms.\nAC_REQUIRE([AC_PROG_AWK])dnl\nAC_REQUIRE([AC_PROG_MAKE_SET])dnl\nAC_REQUIRE([AM_SET_LEADING_DOT])dnl\n_AM_IF_OPTION([tar-ustar], [_AM_PROG_TAR([ustar])],\n\t      [_AM_IF_OPTION([tar-pax], [_AM_PROG_TAR([pax])],\n\t\t\t     [_AM_PROG_TAR([v7])])])\n_AM_IF_OPTION([no-dependencies],,\n[AC_PROVIDE_IFELSE([AC_PROG_CC],\n\t\t  [_AM_DEPENDENCIES([CC])],\n\t\t  [m4_define([AC_PROG_CC],\n\t\t\t     m4_defn([AC_PROG_CC])[_AM_DEPENDENCIES([CC])])])dnl\nAC_PROVIDE_IFELSE([AC_PROG_CXX],\n\t\t  [_AM_DEPENDENCIES([CXX])],\n\t\t  [m4_define([AC_PROG_CXX],\n\t\t\t     m4_defn([AC_PROG_CXX])[_AM_DEPENDENCIES([CXX])])])dnl\nAC_PROVIDE_IFELSE([AC_PROG_OBJC],\n\t\t  [_AM_DEPENDENCIES([OBJC])],\n\t\t  [m4_define([AC_PROG_OBJC],\n\t\t\t     m4_defn([AC_PROG_OBJC])[_AM_DEPENDENCIES([OBJC])])])dnl\nAC_PROVIDE_IFELSE([AC_PROG_OBJCXX],\n\t\t  [_AM_DEPENDENCIES([OBJCXX])],\n\t\t  [m4_define([AC_PROG_OBJCXX],\n\t\t\t     m4_defn([AC_PROG_OBJCXX])[_AM_DEPENDENCIES([OBJCXX])])])dnl\n])\nAC_REQUIRE([AM_SILENT_RULES])dnl\ndnl The testsuite driver may need to know about EXEEXT, so add the\ndnl 'am__EXEEXT' conditional if _AM_COMPILER_EXEEXT was seen.  This\ndnl macro is hooked onto _AC_COMPILER_EXEEXT early, see below.\nAC_CONFIG_COMMANDS_PRE(dnl\n[m4_provide_if([_AM_COMPILER_EXEEXT],\n  [AM_CONDITIONAL([am__EXEEXT], [test -n \"$EXEEXT\"])])])dnl\n\n# POSIX will say in a future version that running \"rm -f\" with no argument\n# is OK; and we want to be able to make that assumption in our Makefile\n# recipes.  So use an aggressive probe to check that the usage we want is\n# actually supported \"in the wild\" to an acceptable degree.\n# See automake bug#10828.\n# To make any issue more visible, cause the running configure to be aborted\n# by default if the 'rm' program in use doesn't match our expectations; the\n# user can still override this though.\nif rm -f && rm -fr && rm -rf; then : OK; else\n  cat >&2 <<'END'\nOops!\n\nYour 'rm' program seems unable to run without file operands specified\non the command line, even when the '-f' option is present.  This is contrary\nto the behaviour of most rm programs out there, and not conforming with\nthe upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>\n\nPlease tell bug-automake@gnu.org about your system, including the value\nof your $PATH and any error possibly output before this message.  This\ncan help us improve future automake versions.\n\nEND\n  if test x\"$ACCEPT_INFERIOR_RM_PROGRAM\" = x\"yes\"; then\n    echo 'Configuration will proceed anyway, since you have set the' >&2\n    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to \"yes\"' >&2\n    echo >&2\n  else\n    cat >&2 <<'END'\nAborting the configuration process, to ensure you take notice of the issue.\n\nYou can download and install GNU coreutils to get an 'rm' implementation\nthat behaves properly: <http://www.gnu.org/software/coreutils/>.\n\nIf you want to complete the configuration process using your problematic\n'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM\nto \"yes\", and re-run configure.\n\nEND\n    AC_MSG_ERROR([Your 'rm' program is bad, sorry.])\n  fi\nfi\n])\n\ndnl Hook into '_AC_COMPILER_EXEEXT' early to learn its expansion.  Do not\ndnl add the conditional right here, as _AC_COMPILER_EXEEXT may be further\ndnl mangled by Autoconf and run in a shell conditional statement.\nm4_define([_AC_COMPILER_EXEEXT],\nm4_defn([_AC_COMPILER_EXEEXT])[m4_provide([_AM_COMPILER_EXEEXT])])\n\n# When config.status generates a header, we must update the stamp-h file.\n# This file resides in the same directory as the config header\n# that is generated.  The stamp files are numbered to have different names.\n\n# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the\n# loop where config.status creates the headers, so we can generate\n# our stamp files there.\nAC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK],\n[# Compute $1's index in $config_headers.\n_am_arg=$1\n_am_stamp_count=1\nfor _am_header in $config_headers :; do\n  case $_am_header in\n    $_am_arg | $_am_arg:* )\n      break ;;\n    * )\n      _am_stamp_count=`expr $_am_stamp_count + 1` ;;\n  esac\ndone\necho \"timestamp for $_am_arg\" >`AS_DIRNAME([\"$_am_arg\"])`/stamp-h[]$_am_stamp_count])\n\n# Copyright (C) 2001-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_PROG_INSTALL_SH\n# ------------------\n# Define $install_sh.\nAC_DEFUN([AM_PROG_INSTALL_SH],\n[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nif test x\"${install_sh}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    install_sh=\"\\${SHELL} '$am_aux_dir/install-sh'\" ;;\n  *)\n    install_sh=\"\\${SHELL} $am_aux_dir/install-sh\"\n  esac\nfi\nAC_SUBST([install_sh])])\n\n# Copyright (C) 2003-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# Check whether the underlying file-system supports filenames\n# with a leading dot.  For instance MS-DOS doesn't.\nAC_DEFUN([AM_SET_LEADING_DOT],\n[rm -rf .tst 2>/dev/null\nmkdir .tst 2>/dev/null\nif test -d .tst; then\n  am__leading_dot=.\nelse\n  am__leading_dot=_\nfi\nrmdir .tst 2>/dev/null\nAC_SUBST([am__leading_dot])])\n\n# Add --enable-maintainer-mode option to configure.         -*- Autoconf -*-\n# From Jim Meyering\n\n# Copyright (C) 1996-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_MAINTAINER_MODE([DEFAULT-MODE])\n# ----------------------------------\n# Control maintainer-specific portions of Makefiles.\n# Default is to disable them, unless 'enable' is passed literally.\n# For symmetry, 'disable' may be passed as well.  Anyway, the user\n# can override the default with the --enable/--disable switch.\nAC_DEFUN([AM_MAINTAINER_MODE],\n[m4_case(m4_default([$1], [disable]),\n       [enable], [m4_define([am_maintainer_other], [disable])],\n       [disable], [m4_define([am_maintainer_other], [enable])],\n       [m4_define([am_maintainer_other], [enable])\n        m4_warn([syntax], [unexpected argument to AM@&t@_MAINTAINER_MODE: $1])])\nAC_MSG_CHECKING([whether to enable maintainer-specific portions of Makefiles])\n  dnl maintainer-mode's default is 'disable' unless 'enable' is passed\n  AC_ARG_ENABLE([maintainer-mode],\n    [AS_HELP_STRING([--]am_maintainer_other[-maintainer-mode],\n      am_maintainer_other[ make rules and dependencies not useful\n      (and sometimes confusing) to the casual installer])],\n    [USE_MAINTAINER_MODE=$enableval],\n    [USE_MAINTAINER_MODE=]m4_if(am_maintainer_other, [enable], [no], [yes]))\n  AC_MSG_RESULT([$USE_MAINTAINER_MODE])\n  AM_CONDITIONAL([MAINTAINER_MODE], [test $USE_MAINTAINER_MODE = yes])\n  MAINT=$MAINTAINER_MODE_TRUE\n  AC_SUBST([MAINT])dnl\n]\n)\n\n# Check to see how 'make' treats includes.\t            -*- Autoconf -*-\n\n# Copyright (C) 2001-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_MAKE_INCLUDE()\n# -----------------\n# Check to see how make treats includes.\nAC_DEFUN([AM_MAKE_INCLUDE],\n[am_make=${MAKE-make}\ncat > confinc << 'END'\nam__doit:\n\t@echo this is the am__doit target\n.PHONY: am__doit\nEND\n# If we don't find an include directive, just comment out the code.\nAC_MSG_CHECKING([for style of include used by $am_make])\nam__include=\"#\"\nam__quote=\n_am_result=none\n# First try GNU make style include.\necho \"include confinc\" > confmf\n# Ignore all kinds of additional output from 'make'.\ncase `$am_make -s -f confmf 2> /dev/null` in #(\n*the\\ am__doit\\ target*)\n  am__include=include\n  am__quote=\n  _am_result=GNU\n  ;;\nesac\n# Now try BSD make style include.\nif test \"$am__include\" = \"#\"; then\n   echo '.include \"confinc\"' > confmf\n   case `$am_make -s -f confmf 2> /dev/null` in #(\n   *the\\ am__doit\\ target*)\n     am__include=.include\n     am__quote=\"\\\"\"\n     _am_result=BSD\n     ;;\n   esac\nfi\nAC_SUBST([am__include])\nAC_SUBST([am__quote])\nAC_MSG_RESULT([$_am_result])\nrm -f confinc confmf\n])\n\n# Fake the existence of programs that GNU maintainers use.  -*- Autoconf -*-\n\n# Copyright (C) 1997-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_MISSING_PROG(NAME, PROGRAM)\n# ------------------------------\nAC_DEFUN([AM_MISSING_PROG],\n[AC_REQUIRE([AM_MISSING_HAS_RUN])\n$1=${$1-\"${am_missing_run}$2\"}\nAC_SUBST($1)])\n\n# AM_MISSING_HAS_RUN\n# ------------------\n# Define MISSING if not defined so far and test if it is modern enough.\n# If it is, set am_missing_run to use it, otherwise, to nothing.\nAC_DEFUN([AM_MISSING_HAS_RUN],\n[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nAC_REQUIRE_AUX_FILE([missing])dnl\nif test x\"${MISSING+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    MISSING=\"\\${SHELL} \\\"$am_aux_dir/missing\\\"\" ;;\n  *)\n    MISSING=\"\\${SHELL} $am_aux_dir/missing\" ;;\n  esac\nfi\n# Use eval to expand $SHELL\nif eval \"$MISSING --is-lightweight\"; then\n  am_missing_run=\"$MISSING \"\nelse\n  am_missing_run=\n  AC_MSG_WARN(['missing' script is too old or missing])\nfi\n])\n\n# Helper functions for option handling.                     -*- Autoconf -*-\n\n# Copyright (C) 2001-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# _AM_MANGLE_OPTION(NAME)\n# -----------------------\nAC_DEFUN([_AM_MANGLE_OPTION],\n[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])])\n\n# _AM_SET_OPTION(NAME)\n# --------------------\n# Set option NAME.  Presently that only means defining a flag for this option.\nAC_DEFUN([_AM_SET_OPTION],\n[m4_define(_AM_MANGLE_OPTION([$1]), [1])])\n\n# _AM_SET_OPTIONS(OPTIONS)\n# ------------------------\n# OPTIONS is a space-separated list of Automake options.\nAC_DEFUN([_AM_SET_OPTIONS],\n[m4_foreach_w([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])])\n\n# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET])\n# -------------------------------------------\n# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.\nAC_DEFUN([_AM_IF_OPTION],\n[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])])\n\n# Copyright (C) 1999-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# _AM_PROG_CC_C_O\n# ---------------\n# Like AC_PROG_CC_C_O, but changed for automake.  We rewrite AC_PROG_CC\n# to automatically call this.\nAC_DEFUN([_AM_PROG_CC_C_O],\n[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl\nAC_REQUIRE_AUX_FILE([compile])dnl\nAC_LANG_PUSH([C])dnl\nAC_CACHE_CHECK(\n  [whether $CC understands -c and -o together],\n  [am_cv_prog_cc_c_o],\n  [AC_LANG_CONFTEST([AC_LANG_PROGRAM([])])\n  # Make sure it works both with $CC and with simple cc.\n  # Following AC_PROG_CC_C_O, we do the test twice because some\n  # compilers refuse to overwrite an existing .o file with -o,\n  # though they will create one.\n  am_cv_prog_cc_c_o=yes\n  for am_i in 1 2; do\n    if AM_RUN_LOG([$CC -c conftest.$ac_ext -o conftest2.$ac_objext]) \\\n         && test -f conftest2.$ac_objext; then\n      : OK\n    else\n      am_cv_prog_cc_c_o=no\n      break\n    fi\n  done\n  rm -f core conftest*\n  unset am_i])\nif test \"$am_cv_prog_cc_c_o\" != yes; then\n   # Losing compiler, so override with the script.\n   # FIXME: It is wrong to rewrite CC.\n   # But if we don't then we get into trouble of one sort or another.\n   # A longer-term fix would be to have automake use am__CC in this case,\n   # and then we could set am__CC=\"\\$(top_srcdir)/compile \\$(CC)\"\n   CC=\"$am_aux_dir/compile $CC\"\nfi\nAC_LANG_POP([C])])\n\n# For backward compatibility.\nAC_DEFUN_ONCE([AM_PROG_CC_C_O], [AC_REQUIRE([AC_PROG_CC])])\n\n# Copyright (C) 2001-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_RUN_LOG(COMMAND)\n# -------------------\n# Run COMMAND, save the exit status in ac_status, and log it.\n# (This has been adapted from Autoconf's _AC_RUN_LOG macro.)\nAC_DEFUN([AM_RUN_LOG],\n[{ echo \"$as_me:$LINENO: $1\" >&AS_MESSAGE_LOG_FD\n   ($1) >&AS_MESSAGE_LOG_FD 2>&AS_MESSAGE_LOG_FD\n   ac_status=$?\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&AS_MESSAGE_LOG_FD\n   (exit $ac_status); }])\n\n# Check to make sure that the build environment is sane.    -*- Autoconf -*-\n\n# Copyright (C) 1996-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_SANITY_CHECK\n# ---------------\nAC_DEFUN([AM_SANITY_CHECK],\n[AC_MSG_CHECKING([whether build environment is sane])\n# Reject unsafe characters in $srcdir or the absolute working directory\n# name.  Accept space and tab only in the latter.\nam_lf='\n'\ncase `pwd` in\n  *[[\\\\\\\"\\#\\$\\&\\'\\`$am_lf]]*)\n    AC_MSG_ERROR([unsafe absolute working directory name]);;\nesac\ncase $srcdir in\n  *[[\\\\\\\"\\#\\$\\&\\'\\`$am_lf\\ \\\t]]*)\n    AC_MSG_ERROR([unsafe srcdir value: '$srcdir']);;\nesac\n\n# Do 'set' in a subshell so we don't clobber the current shell's\n# arguments.  Must try -L first in case configure is actually a\n# symlink; some systems play weird games with the mod time of symlinks\n# (eg FreeBSD returns the mod time of the symlink's containing\n# directory).\nif (\n   am_has_slept=no\n   for am_try in 1 2; do\n     echo \"timestamp, slept: $am_has_slept\" > conftest.file\n     set X `ls -Lt \"$srcdir/configure\" conftest.file 2> /dev/null`\n     if test \"$[*]\" = \"X\"; then\n\t# -L didn't work.\n\tset X `ls -t \"$srcdir/configure\" conftest.file`\n     fi\n     if test \"$[*]\" != \"X $srcdir/configure conftest.file\" \\\n\t&& test \"$[*]\" != \"X conftest.file $srcdir/configure\"; then\n\n\t# If neither matched, then we have a broken ls.  This can happen\n\t# if, for instance, CONFIG_SHELL is bash and it inherits a\n\t# broken ls alias from the environment.  This has actually\n\t# happened.  Such a system could not be considered \"sane\".\n\tAC_MSG_ERROR([ls -t appears to fail.  Make sure there is not a broken\n  alias in your environment])\n     fi\n     if test \"$[2]\" = conftest.file || test $am_try -eq 2; then\n       break\n     fi\n     # Just in case.\n     sleep 1\n     am_has_slept=yes\n   done\n   test \"$[2]\" = conftest.file\n   )\nthen\n   # Ok.\n   :\nelse\n   AC_MSG_ERROR([newly created file is older than distributed files!\nCheck your system clock])\nfi\nAC_MSG_RESULT([yes])\n# If we didn't sleep, we still need to ensure time stamps of config.status and\n# generated files are strictly newer.\nam_sleep_pid=\nif grep 'slept: no' conftest.file >/dev/null 2>&1; then\n  ( sleep 1 ) &\n  am_sleep_pid=$!\nfi\nAC_CONFIG_COMMANDS_PRE(\n  [AC_MSG_CHECKING([that generated files are newer than configure])\n   if test -n \"$am_sleep_pid\"; then\n     # Hide warnings about reused PIDs.\n     wait $am_sleep_pid 2>/dev/null\n   fi\n   AC_MSG_RESULT([done])])\nrm -f conftest.file\n])\n\n# Copyright (C) 2009-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_SILENT_RULES([DEFAULT])\n# --------------------------\n# Enable less verbose build rules; with the default set to DEFAULT\n# (\"yes\" being less verbose, \"no\" or empty being verbose).\nAC_DEFUN([AM_SILENT_RULES],\n[AC_ARG_ENABLE([silent-rules], [dnl\nAS_HELP_STRING(\n  [--enable-silent-rules],\n  [less verbose build output (undo: \"make V=1\")])\nAS_HELP_STRING(\n  [--disable-silent-rules],\n  [verbose build output (undo: \"make V=0\")])dnl\n])\ncase $enable_silent_rules in @%:@ (((\n  yes) AM_DEFAULT_VERBOSITY=0;;\n   no) AM_DEFAULT_VERBOSITY=1;;\n    *) AM_DEFAULT_VERBOSITY=m4_if([$1], [yes], [0], [1]);;\nesac\ndnl\ndnl A few 'make' implementations (e.g., NonStop OS and NextStep)\ndnl do not support nested variable expansions.\ndnl See automake bug#9928 and bug#10237.\nam_make=${MAKE-make}\nAC_CACHE_CHECK([whether $am_make supports nested variables],\n   [am_cv_make_support_nested_variables],\n   [if AS_ECHO([['TRUE=$(BAR$(V))\nBAR0=false\nBAR1=true\nV=1\nam__doit:\n\t@$(TRUE)\n.PHONY: am__doit']]) | $am_make -f - >/dev/null 2>&1; then\n  am_cv_make_support_nested_variables=yes\nelse\n  am_cv_make_support_nested_variables=no\nfi])\nif test $am_cv_make_support_nested_variables = yes; then\n  dnl Using '$V' instead of '$(V)' breaks IRIX make.\n  AM_V='$(V)'\n  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'\nelse\n  AM_V=$AM_DEFAULT_VERBOSITY\n  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY\nfi\nAC_SUBST([AM_V])dnl\nAM_SUBST_NOTMAKE([AM_V])dnl\nAC_SUBST([AM_DEFAULT_V])dnl\nAM_SUBST_NOTMAKE([AM_DEFAULT_V])dnl\nAC_SUBST([AM_DEFAULT_VERBOSITY])dnl\nAM_BACKSLASH='\\'\nAC_SUBST([AM_BACKSLASH])dnl\n_AM_SUBST_NOTMAKE([AM_BACKSLASH])dnl\n])\n\n# Copyright (C) 2001-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# AM_PROG_INSTALL_STRIP\n# ---------------------\n# One issue with vendor 'install' (even GNU) is that you can't\n# specify the program used to strip binaries.  This is especially\n# annoying in cross-compiling environments, where the build's strip\n# is unlikely to handle the host's binaries.\n# Fortunately install-sh will honor a STRIPPROG variable, so we\n# always use install-sh in \"make install-strip\", and initialize\n# STRIPPROG with the value of the STRIP variable (set by the user).\nAC_DEFUN([AM_PROG_INSTALL_STRIP],\n[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl\n# Installed binaries are usually stripped using 'strip' when the user\n# run \"make install-strip\".  However 'strip' might not be the right\n# tool to use in cross-compilation environments, therefore Automake\n# will honor the 'STRIP' environment variable to overrule this program.\ndnl Don't test for $cross_compiling = yes, because it might be 'maybe'.\nif test \"$cross_compiling\" != no; then\n  AC_CHECK_TOOL([STRIP], [strip], :)\nfi\nINSTALL_STRIP_PROGRAM=\"\\$(install_sh) -c -s\"\nAC_SUBST([INSTALL_STRIP_PROGRAM])])\n\n# Copyright (C) 2006-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# _AM_SUBST_NOTMAKE(VARIABLE)\n# ---------------------------\n# Prevent Automake from outputting VARIABLE = @VARIABLE@ in Makefile.in.\n# This macro is traced by Automake.\nAC_DEFUN([_AM_SUBST_NOTMAKE])\n\n# AM_SUBST_NOTMAKE(VARIABLE)\n# --------------------------\n# Public sister of _AM_SUBST_NOTMAKE.\nAC_DEFUN([AM_SUBST_NOTMAKE], [_AM_SUBST_NOTMAKE($@)])\n\n# Check how to create a tarball.                            -*- Autoconf -*-\n\n# Copyright (C) 2004-2013 Free Software Foundation, Inc.\n#\n# This file is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# _AM_PROG_TAR(FORMAT)\n# --------------------\n# Check how to create a tarball in format FORMAT.\n# FORMAT should be one of 'v7', 'ustar', or 'pax'.\n#\n# Substitute a variable $(am__tar) that is a command\n# writing to stdout a FORMAT-tarball containing the directory\n# $tardir.\n#     tardir=directory && $(am__tar) > result.tar\n#\n# Substitute a variable $(am__untar) that extract such\n# a tarball read from stdin.\n#     $(am__untar) < result.tar\n#\nAC_DEFUN([_AM_PROG_TAR],\n[# Always define AMTAR for backward compatibility.  Yes, it's still used\n# in the wild :-(  We should find a proper way to deprecate it ...\nAC_SUBST([AMTAR], ['$${TAR-tar}'])\n\n# We'll loop over all known methods to create a tar archive until one works.\n_am_tools='gnutar m4_if([$1], [ustar], [plaintar]) pax cpio none'\n\nm4_if([$1], [v7],\n  [am__tar='$${TAR-tar} chof - \"$$tardir\"' am__untar='$${TAR-tar} xf -'],\n\n  [m4_case([$1],\n    [ustar],\n     [# The POSIX 1988 'ustar' format is defined with fixed-size fields.\n      # There is notably a 21 bits limit for the UID and the GID.  In fact,\n      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343\n      # and bug#13588).\n      am_max_uid=2097151 # 2^21 - 1\n      am_max_gid=$am_max_uid\n      # The $UID and $GID variables are not portable, so we need to resort\n      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls\n      # below are definitely unexpected, so allow the users to see them\n      # (that is, avoid stderr redirection).\n      am_uid=`id -u || echo unknown`\n      am_gid=`id -g || echo unknown`\n      AC_MSG_CHECKING([whether UID '$am_uid' is supported by ustar format])\n      if test $am_uid -le $am_max_uid; then\n         AC_MSG_RESULT([yes])\n      else\n         AC_MSG_RESULT([no])\n         _am_tools=none\n      fi\n      AC_MSG_CHECKING([whether GID '$am_gid' is supported by ustar format])\n      if test $am_gid -le $am_max_gid; then\n         AC_MSG_RESULT([yes])\n      else\n        AC_MSG_RESULT([no])\n        _am_tools=none\n      fi],\n\n  [pax],\n    [],\n\n  [m4_fatal([Unknown tar format])])\n\n  AC_MSG_CHECKING([how to create a $1 tar archive])\n\n  # Go ahead even if we have the value already cached.  We do so because we\n  # need to set the values for the 'am__tar' and 'am__untar' variables.\n  _am_tools=${am_cv_prog_tar_$1-$_am_tools}\n\n  for _am_tool in $_am_tools; do\n    case $_am_tool in\n    gnutar)\n      for _am_tar in tar gnutar gtar; do\n        AM_RUN_LOG([$_am_tar --version]) && break\n      done\n      am__tar=\"$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - \"'\"$$tardir\"'\n      am__tar_=\"$_am_tar --format=m4_if([$1], [pax], [posix], [$1]) -chf - \"'\"$tardir\"'\n      am__untar=\"$_am_tar -xf -\"\n      ;;\n    plaintar)\n      # Must skip GNU tar: if it does not support --format= it doesn't create\n      # ustar tarball either.\n      (tar --version) >/dev/null 2>&1 && continue\n      am__tar='tar chf - \"$$tardir\"'\n      am__tar_='tar chf - \"$tardir\"'\n      am__untar='tar xf -'\n      ;;\n    pax)\n      am__tar='pax -L -x $1 -w \"$$tardir\"'\n      am__tar_='pax -L -x $1 -w \"$tardir\"'\n      am__untar='pax -r'\n      ;;\n    cpio)\n      am__tar='find \"$$tardir\" -print | cpio -o -H $1 -L'\n      am__tar_='find \"$tardir\" -print | cpio -o -H $1 -L'\n      am__untar='cpio -i -H $1 -d'\n      ;;\n    none)\n      am__tar=false\n      am__tar_=false\n      am__untar=false\n      ;;\n    esac\n\n    # If the value was cached, stop now.  We just wanted to have am__tar\n    # and am__untar set.\n    test -n \"${am_cv_prog_tar_$1}\" && break\n\n    # tar/untar a dummy directory, and stop if the command works.\n    rm -rf conftest.dir\n    mkdir conftest.dir\n    echo GrepMe > conftest.dir/file\n    AM_RUN_LOG([tardir=conftest.dir && eval $am__tar_ >conftest.tar])\n    rm -rf conftest.dir\n    if test -s conftest.tar; then\n      AM_RUN_LOG([$am__untar <conftest.tar])\n      AM_RUN_LOG([cat conftest.dir/file])\n      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break\n    fi\n  done\n  rm -rf conftest.dir\n\n  AC_CACHE_VAL([am_cv_prog_tar_$1], [am_cv_prog_tar_$1=$_am_tool])\n  AC_MSG_RESULT([$am_cv_prog_tar_$1])])\n\nAC_SUBST([am__tar])\nAC_SUBST([am__untar])\n]) # _AM_PROG_TAR\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/autogen.sh",
    "content": "#!/bin/sh\n\nautoreconf --install --symlink --force\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/cmake/configure.cmake",
    "content": "# Platform checks\ninclude ( CheckFunctionExists )\ninclude ( CheckIncludeFiles )\n\ncheck_include_files ( dlfcn.h HAVE_DLFCN_H )\ncheck_include_files ( inttypes.h HAVE_INTTYPES_H )\ncheck_include_files ( memory.h HAVE_MEMORY_H )\ncheck_include_files ( poll.h HAVE_POLL_H )\ncheck_include_files ( port.h HAVE_PORT_H )\ncheck_include_files ( stdint.h HAVE_STDINT_H )\ncheck_include_files ( stdlib.h HAVE_STDLIB_H )\ncheck_include_files ( strings.h HAVE_STRINGS_H )\ncheck_include_files ( string.h HAVE_STRING_H )\ncheck_include_files ( \"sys/epoll.h\" HAVE_SYS_EPOLL_H )\ncheck_include_files ( \"sys/eventfd.h\" HAVE_SYS_EVENTFD_H )\ncheck_include_files ( \"sys/event.h\" HAVE_SYS_EVENT_H )\ncheck_include_files ( \"sys/inotify.h\" HAVE_SYS_INOTIFY_H )\ncheck_include_files ( \"sys/select.h\" HAVE_SYS_SELECT_H )\ncheck_include_files ( \"sys/signalfd.h\" HAVE_SYS_SIGNALFD_H )\ncheck_include_files ( \"sys/stat.h\" HAVE_SYS_STAT_H )\ncheck_include_files ( \"sys/types.h\" HAVE_SYS_TYPES_H )\ncheck_include_files ( \"sys/syscall.h\" HAVE_SYS_CALL_H )\ncheck_include_files ( unistd.h HAVE_UNISTD_H )\n\ncheck_function_exists ( clock_gettime HAVE_CLOCK_GETTIME )\ncheck_function_exists ( epoll_ctl HAVE_EPOLL_CTL )\ncheck_function_exists ( eventfd HAVE_EVENTFD )\ncheck_function_exists ( floor HAVE_FLOOR )\ncheck_function_exists ( inotify_init HAVE_INOTIFY_INIT )\ncheck_function_exists ( kqueue HAVE_KQUEUE )\ncheck_function_exists ( nanosleep HAVE_NANOSLEEP )\ncheck_function_exists ( poll HAVE_POLL )\ncheck_function_exists ( port_create HAVE_PORT_CREATE )\ncheck_function_exists ( select HAVE_SELECT )\ncheck_function_exists ( signalfd HAVE_SIGNALFD )\n\nfind_library ( HAVE_LIBRT rt )\n\n# Tweaks\nif (${HAVE_SYS_CALL_H})\n    set(HAVE_CLOCK_SYSCALL ${HAVE_CLOCK_GETTIME})\nendif ()\n\n\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/cmake/dist.cmake",
    "content": "# LuaDist CMake utility library.\n# Provides sane project defaults and macros common to LuaDist CMake builds.\n# \n# Copyright (C) 2007-2012 LuaDist.\n# by David Manura, Peter Drahoš\n# Redistribution and use of this file is allowed according to the terms of the MIT license.\n# For details see the COPYRIGHT file distributed with LuaDist.\n# Please note that the package source code is licensed under its own license.\n\n\n# Tweaks and other defaults\n# Setting CMAKE to use loose block and search for find modules in source directory\nset ( CMAKE_ALLOW_LOOSE_LOOP_CONSTRUCTS true )\nset ( CMAKE_MODULE_PATH \"${CMAKE_CURRENT_SOURCE_DIR}/cmake\" ${CMAKE_MODULE_PATH} )\n\n# In MSVC, prevent warnings that can occur when using standard libraries.\nif ( MSVC )\n  add_definitions ( -D_CRT_SECURE_NO_WARNINGS )\nendif ()\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/config.h.cmake",
    "content": "/* config.h.in.  Generated from configure.ac by autoheader.  */\n\n/* Define to 1 if you have the `clock_gettime' function. */\n#cmakedefine HAVE_CLOCK_GETTIME 1\n\n/* Define to 1 to use the syscall interface for clock_gettime */\n#cmakedefine HAVE_CLOCK_SYSCALL 1\n\n/* Define to 1 if you have the <dlfcn.h> header file. */\n#cmakedefine HAVE_DLFCN_H 1\n\n/* Define to 1 if you have the `epoll_ctl' function. */\n#cmakedefine HAVE_EPOLL_CTL 1\n\n/* Define to 1 if you have the `eventfd' function. */\n#cmakedefine HAVE_EVENTFD 1\n\n/* Define to 1 if the floor function is available */\n#cmakedefine HAVE_FLOOR 1\n\n/* Define to 1 if you have the `inotify_init' function. */\n#cmakedefine HAVE_INOTIFY_INIT 1\n\n/* Define to 1 if you have the <inttypes.h> header file. */\n#cmakedefine HAVE_INTTYPES_H 1\n\n/* Define to 1 if you have the `kqueue' function. */\n#cmakedefine HAVE_KQUEUE 1\n\n/* Define to 1 if you have the `rt' library (-lrt). */\n#cmakedefine HAVE_LIBRT 1\n\n/* Define to 1 if you have the <memory.h> header file. */\n#cmakedefine HAVE_MEMORY_H 1\n\n/* Define to 1 if you have the `nanosleep' function. */\n#cmakedefine HAVE_NANOSLEEP 1\n\n/* Define to 1 if you have the `poll' function. */\n#cmakedefine HAVE_POLL 1\n\n/* Define to 1 if you have the <poll.h> header file. */\n#cmakedefine HAVE_POLL_H 1\n\n/* Define to 1 if you have the `port_create' function. */\n#cmakedefine HAVE_PORT_CREATE 1\n\n/* Define to 1 if you have the <port.h> header file. */\n#cmakedefine HAVE_PORT_H 1\n\n/* Define to 1 if you have the `select' function. */\n#cmakedefine HAVE_SELECT 1\n\n/* Define to 1 if you have the `signalfd' function. */\n#cmakedefine HAVE_SIGNALFD 1\n\n/* Define to 1 if you have the <stdint.h> header file. */\n#cmakedefine HAVE_STDINT_H 1\n\n/* Define to 1 if you have the <stdlib.h> header file. */\n#cmakedefine HAVE_STDLIB_H 1\n\n/* Define to 1 if you have the <strings.h> header file. */\n#cmakedefine HAVE_STRINGS_H 1\n\n/* Define to 1 if you have the <string.h> header file. */\n#cmakedefine HAVE_STRING_H 1\n\n/* Define to 1 if you have the <sys/epoll.h> header file. */\n#cmakedefine HAVE_SYS_EPOLL_H 1\n\n/* Define to 1 if you have the <sys/eventfd.h> header file. */\n#cmakedefine HAVE_SYS_EVENTFD_H 1\n\n/* Define to 1 if you have the <sys/event.h> header file. */\n#cmakedefine HAVE_SYS_EVENT_H 1\n\n/* Define to 1 if you have the <sys/inotify.h> header file. */\n#cmakedefine HAVE_SYS_INOTIFY_H 1\n\n/* Define to 1 if you have the <sys/select.h> header file. */\n#cmakedefine HAVE_SYS_SELECT_H 1\n\n/* Define to 1 if you have the <sys/signalfd.h> header file. */\n#cmakedefine HAVE_SYS_SIGNALFD_H 1\n\n/* Define to 1 if you have the <sys/stat.h> header file. */\n#cmakedefine HAVE_SYS_STAT_H 1\n\n/* Define to 1 if you have the <sys/types.h> header file. */\n#cmakedefine HAVE_SYS_TYPES_H 1\n\n/* Define to 1 if you have the <unistd.h> header file. */\n#cmakedefine HAVE_UNISTD_H 1\n\n/* Define to the sub-directory in which libtool stores uninstalled libraries.\n   */\n#define LT_OBJDIR \".libs/\"\n\n/* Name of package */\n#define PACKAGE \"libev\"\n\n/* Define to the address where bug reports for this package should be sent. */\n#define PACKAGE_BUGREPORT \"\"\n\n/* Define to the full name of this package. */\n#define PACKAGE_NAME \"\"\n\n/* Define to the full name and version of this package. */\n#define PACKAGE_STRING \"\"\n\n/* Define to the one symbol short name of this package. */\n#define PACKAGE_TARNAME \"\"\n\n/* Define to the home page for this package. */\n#define PACKAGE_URL \"\"\n\n/* Define to the version of this package. */\n#define PACKAGE_VERSION \"\"\n\n/* Define to 1 if you have the ANSI C header files. */\n#define STDC_HEADERS 1\n\n/* Version number of package */\n#cmakedefine VERSION \"@DIST_VERSION@\"\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/configure.ac",
    "content": "AC_INIT\n\norig_CFLAGS=\"$CFLAGS\"\n\nAC_CONFIG_SRCDIR([ev_epoll.c])\n\ndnl also update ev.h!\nAM_INIT_AUTOMAKE(libev,4.22)\nAC_CONFIG_HEADERS([config.h])\nAM_MAINTAINER_MODE\n\nAC_PROG_CC\n\ndnl Supply default CFLAGS, if not specified\nif test -z \"$orig_CFLAGS\"; then\n  if test x$GCC = xyes; then\n    CFLAGS=\"-g -O3\"\n  fi\nfi\n\nAC_PROG_INSTALL\nAC_PROG_LIBTOOL\n\nm4_include([libev.m4])\n\nAC_CONFIG_FILES([Makefile])\nAC_OUTPUT\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/ev++.h",
    "content": "/*\n * libev simple C++ wrapper classes\n *\n * Copyright (c) 2007,2008,2010 Marc Alexander Lehmann <libev@schmorp.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modifica-\n * tion, are permitted provided that the following conditions are met:\n *\n *   1.  Redistributions of source code must retain the above copyright notice,\n *       this list of conditions and the following disclaimer.\n *\n *   2.  Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-\n * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-\n * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-\n * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Alternatively, the contents of this file may be used under the terms of\n * the GNU General Public License (\"GPL\") version 2 or any later version,\n * in which case the provisions of the GPL are applicable instead of\n * the above. If you wish to allow the use of your version of this file\n * only under the terms of the GPL and not to allow others to use your\n * version of this file under the BSD license, indicate your decision\n * by deleting the provisions above and replace them with the notice\n * and other provisions required by the GPL. If you do not delete the\n * provisions above, a recipient may use your version of this file under\n * either the BSD or the GPL.\n */\n\n#ifndef EVPP_H__\n#define EVPP_H__\n\n#ifdef EV_H\n# include EV_H\n#else\n# include \"ev.h\"\n#endif\n\n#ifndef EV_USE_STDEXCEPT\n# define EV_USE_STDEXCEPT 1\n#endif\n\n#if EV_USE_STDEXCEPT\n# include <stdexcept>\n#endif\n\nnamespace ev {\n\n  typedef ev_tstamp tstamp;\n\n  enum {\n    UNDEF    = EV_UNDEF,\n    NONE     = EV_NONE,\n    READ     = EV_READ,\n    WRITE    = EV_WRITE,\n#if EV_COMPAT3\n    TIMEOUT  = EV_TIMEOUT,\n#endif\n    TIMER    = EV_TIMER,\n    PERIODIC = EV_PERIODIC,\n    SIGNAL   = EV_SIGNAL,\n    CHILD    = EV_CHILD,\n    STAT     = EV_STAT,\n    IDLE     = EV_IDLE,\n    CHECK    = EV_CHECK,\n    PREPARE  = EV_PREPARE,\n    FORK     = EV_FORK,\n    ASYNC    = EV_ASYNC,\n    EMBED    = EV_EMBED,\n#   undef ERROR // some systems stupidly #define ERROR\n    ERROR    = EV_ERROR\n  };\n\n  enum\n  {\n    AUTO      = EVFLAG_AUTO,\n    NOENV     = EVFLAG_NOENV,\n    FORKCHECK = EVFLAG_FORKCHECK,\n\n    SELECT    = EVBACKEND_SELECT,\n    POLL      = EVBACKEND_POLL,\n    EPOLL     = EVBACKEND_EPOLL,\n    KQUEUE    = EVBACKEND_KQUEUE,\n    DEVPOLL   = EVBACKEND_DEVPOLL,\n    PORT      = EVBACKEND_PORT\n  };\n\n  enum\n  {\n#if EV_COMPAT3\n    NONBLOCK = EVLOOP_NONBLOCK,\n    ONESHOT  = EVLOOP_ONESHOT,\n#endif\n    NOWAIT   = EVRUN_NOWAIT,\n    ONCE     = EVRUN_ONCE\n  };\n\n  enum how_t\n  {\n    ONE = EVBREAK_ONE,\n    ALL = EVBREAK_ALL\n  };\n\n  struct bad_loop\n#if EV_USE_STDEXCEPT\n  : std::runtime_error\n#endif\n  {\n#if EV_USE_STDEXCEPT\n    bad_loop ()\n    : std::runtime_error (\"libev event loop cannot be initialized, bad value of LIBEV_FLAGS?\")\n    {\n    }\n#endif\n  };\n\n#ifdef EV_AX\n#  undef EV_AX\n#endif\n\n#ifdef EV_AX_\n#  undef EV_AX_\n#endif\n\n#if EV_MULTIPLICITY\n#  define EV_AX  raw_loop\n#  define EV_AX_ raw_loop,\n#else\n#  define EV_AX\n#  define EV_AX_\n#endif\n\n  struct loop_ref\n  {\n    loop_ref (EV_P) throw ()\n#if EV_MULTIPLICITY\n    : EV_AX (EV_A)\n#endif\n    {\n    }\n\n    bool operator == (const loop_ref &other) const throw ()\n    {\n#if EV_MULTIPLICITY\n      return EV_AX == other.EV_AX;\n#else\n      return true;\n#endif\n    }\n\n    bool operator != (const loop_ref &other) const throw ()\n    {\n#if EV_MULTIPLICITY\n      return ! (*this == other);\n#else\n      return false;\n#endif\n    }\n\n#if EV_MULTIPLICITY\n    bool operator == (const EV_P) const throw ()\n    {\n      return this->EV_AX == EV_A;\n    }\n\n    bool operator != (const EV_P) const throw ()\n    {\n      return (*this == EV_A);\n    }\n\n    operator struct ev_loop * () const throw ()\n    {\n      return EV_AX;\n    }\n\n    operator const struct ev_loop * () const throw ()\n    {\n      return EV_AX;\n    }\n\n    bool is_default () const throw ()\n    {\n      return EV_AX == ev_default_loop (0);\n    }\n#endif\n\n#if EV_COMPAT3\n    void loop (int flags = 0)\n    {\n      ev_run (EV_AX_ flags);\n    }\n\n    void unloop (how_t how = ONE) throw ()\n    {\n      ev_break (EV_AX_ how);\n    }\n#endif\n\n    void run (int flags = 0)\n    {\n      ev_run (EV_AX_ flags);\n    }\n\n    void break_loop (how_t how = ONE) throw ()\n    {\n      ev_break (EV_AX_ how);\n    }\n\n    void post_fork () throw ()\n    {\n      ev_loop_fork (EV_AX);\n    }\n\n    unsigned int backend () const throw ()\n    {\n      return ev_backend (EV_AX);\n    }\n\n    tstamp now () const throw ()\n    {\n      return ev_now (EV_AX);\n    }\n\n    void ref () throw ()\n    {\n      ev_ref (EV_AX);\n    }\n\n    void unref () throw ()\n    {\n      ev_unref (EV_AX);\n    }\n\n#if EV_FEATURE_API\n    unsigned int iteration () const throw ()\n    {\n      return ev_iteration (EV_AX);\n    }\n\n    unsigned int depth () const throw ()\n    {\n      return ev_depth (EV_AX);\n    }\n\n    void set_io_collect_interval (tstamp interval) throw ()\n    {\n      ev_set_io_collect_interval (EV_AX_ interval);\n    }\n\n    void set_timeout_collect_interval (tstamp interval) throw ()\n    {\n      ev_set_timeout_collect_interval (EV_AX_ interval);\n    }\n#endif\n\n    // function callback\n    void once (int fd, int events, tstamp timeout, void (*cb)(int, void *), void *arg = 0) throw ()\n    {\n      ev_once (EV_AX_ fd, events, timeout, cb, arg);\n    }\n\n    // method callback\n    template<class K, void (K::*method)(int)>\n    void once (int fd, int events, tstamp timeout, K *object) throw ()\n    {\n      once (fd, events, timeout, method_thunk<K, method>, object);\n    }\n\n    // default method == operator ()\n    template<class K>\n    void once (int fd, int events, tstamp timeout, K *object) throw ()\n    {\n      once (fd, events, timeout, method_thunk<K, &K::operator ()>, object);\n    }\n\n    template<class K, void (K::*method)(int)>\n    static void method_thunk (int revents, void *arg)\n    {\n      (static_cast<K *>(arg)->*method)\n        (revents);\n    }\n\n    // no-argument method callback\n    template<class K, void (K::*method)()>\n    void once (int fd, int events, tstamp timeout, K *object) throw ()\n    {\n      once (fd, events, timeout, method_noargs_thunk<K, method>, object);\n    }\n\n    template<class K, void (K::*method)()>\n    static void method_noargs_thunk (int revents, void *arg)\n    {\n      (static_cast<K *>(arg)->*method)\n        ();\n    }\n\n    // simpler function callback\n    template<void (*cb)(int)>\n    void once (int fd, int events, tstamp timeout) throw ()\n    {\n      once (fd, events, timeout, simpler_func_thunk<cb>);\n    }\n\n    template<void (*cb)(int)>\n    static void simpler_func_thunk (int revents, void *arg)\n    {\n      (*cb)\n        (revents);\n    }\n\n    // simplest function callback\n    template<void (*cb)()>\n    void once (int fd, int events, tstamp timeout) throw ()\n    {\n      once (fd, events, timeout, simplest_func_thunk<cb>);\n    }\n\n    template<void (*cb)()>\n    static void simplest_func_thunk (int revents, void *arg)\n    {\n      (*cb)\n        ();\n    }\n\n    void feed_fd_event (int fd, int revents) throw ()\n    {\n      ev_feed_fd_event (EV_AX_ fd, revents);\n    }\n\n    void feed_signal_event (int signum) throw ()\n    {\n      ev_feed_signal_event (EV_AX_ signum);\n    }\n\n#if EV_MULTIPLICITY\n    struct ev_loop* EV_AX;\n#endif\n\n  };\n\n#if EV_MULTIPLICITY\n  struct dynamic_loop : loop_ref\n  {\n\n    dynamic_loop (unsigned int flags = AUTO) throw (bad_loop)\n    : loop_ref (ev_loop_new (flags))\n    {\n      if (!EV_AX)\n        throw bad_loop ();\n    }\n\n    ~dynamic_loop () throw ()\n    {\n      ev_loop_destroy (EV_AX);\n      EV_AX = 0;\n    }\n\n  private:\n\n    dynamic_loop (const dynamic_loop &);\n\n    dynamic_loop & operator= (const dynamic_loop &);\n\n  };\n#endif\n\n  struct default_loop : loop_ref\n  {\n    default_loop (unsigned int flags = AUTO) throw (bad_loop)\n#if EV_MULTIPLICITY\n    : loop_ref (ev_default_loop (flags))\n#endif\n    {\n      if (\n#if EV_MULTIPLICITY\n          !EV_AX\n#else\n          !ev_default_loop (flags)\n#endif\n      )\n        throw bad_loop ();\n    }\n\n  private:\n    default_loop (const default_loop &);\n    default_loop &operator = (const default_loop &);\n  };\n\n  inline loop_ref get_default_loop () throw ()\n  {\n#if EV_MULTIPLICITY\n    return ev_default_loop (0);\n#else\n    return loop_ref ();\n#endif\n  }\n\n#undef EV_AX\n#undef EV_AX_\n\n#undef EV_PX\n#undef EV_PX_\n#if EV_MULTIPLICITY\n#  define EV_PX  loop_ref EV_A\n#  define EV_PX_ loop_ref EV_A_\n#else\n#  define EV_PX\n#  define EV_PX_\n#endif\n\n  template<class ev_watcher, class watcher>\n  struct base : ev_watcher\n  {\n    #if EV_MULTIPLICITY\n      EV_PX;\n\n      // loop set\n      void set (EV_P) throw ()\n      {\n        this->EV_A = EV_A;\n      }\n    #endif\n\n    base (EV_PX) throw ()\n    #if EV_MULTIPLICITY\n      : EV_A (EV_A)\n    #endif\n    {\n      ev_init (this, 0);\n    }\n\n    void set_ (const void *data, void (*cb)(EV_P_ ev_watcher *w, int revents)) throw ()\n    {\n      this->data = (void *)data;\n      ev_set_cb (static_cast<ev_watcher *>(this), cb);\n    }\n\n    // function callback\n    template<void (*function)(watcher &w, int)>\n    void set (void *data = 0) throw ()\n    {\n      set_ (data, function_thunk<function>);\n    }\n\n    template<void (*function)(watcher &w, int)>\n    static void function_thunk (EV_P_ ev_watcher *w, int revents)\n    {\n      function\n        (*static_cast<watcher *>(w), revents);\n    }\n\n    // method callback\n    template<class K, void (K::*method)(watcher &w, int)>\n    void set (K *object) throw ()\n    {\n      set_ (object, method_thunk<K, method>);\n    }\n\n    // default method == operator ()\n    template<class K>\n    void set (K *object) throw ()\n    {\n      set_ (object, method_thunk<K, &K::operator ()>);\n    }\n\n    template<class K, void (K::*method)(watcher &w, int)>\n    static void method_thunk (EV_P_ ev_watcher *w, int revents)\n    {\n      (static_cast<K *>(w->data)->*method)\n        (*static_cast<watcher *>(w), revents);\n    }\n\n    // no-argument callback\n    template<class K, void (K::*method)()>\n    void set (K *object) throw ()\n    {\n      set_ (object, method_noargs_thunk<K, method>);\n    }\n\n    template<class K, void (K::*method)()>\n    static void method_noargs_thunk (EV_P_ ev_watcher *w, int revents)\n    {\n      (static_cast<K *>(w->data)->*method)\n        ();\n    }\n\n    void operator ()(int events = EV_UNDEF)\n    {\n      return\n        ev_cb (static_cast<ev_watcher *>(this))\n          (static_cast<ev_watcher *>(this), events);\n    }\n\n    bool is_active () const throw ()\n    {\n      return ev_is_active (static_cast<const ev_watcher *>(this));\n    }\n\n    bool is_pending () const throw ()\n    {\n      return ev_is_pending (static_cast<const ev_watcher *>(this));\n    }\n\n    void feed_event (int revents) throw ()\n    {\n      ev_feed_event (EV_A_ static_cast<ev_watcher *>(this), revents);\n    }\n  };\n\n  inline tstamp now (EV_P) throw ()\n  {\n    return ev_now (EV_A);\n  }\n\n  inline void delay (tstamp interval) throw ()\n  {\n    ev_sleep (interval);\n  }\n\n  inline int version_major () throw ()\n  {\n    return ev_version_major ();\n  }\n\n  inline int version_minor () throw ()\n  {\n    return ev_version_minor ();\n  }\n\n  inline unsigned int supported_backends () throw ()\n  {\n    return ev_supported_backends ();\n  }\n\n  inline unsigned int recommended_backends () throw ()\n  {\n    return ev_recommended_backends ();\n  }\n\n  inline unsigned int embeddable_backends () throw ()\n  {\n    return ev_embeddable_backends ();\n  }\n\n  inline void set_allocator (void *(*cb)(void *ptr, long size) throw ()) throw ()\n  {\n    ev_set_allocator (cb);\n  }\n\n  inline void set_syserr_cb (void (*cb)(const char *msg) throw ()) throw ()\n  {\n    ev_set_syserr_cb (cb);\n  }\n\n  #if EV_MULTIPLICITY\n    #define EV_CONSTRUCT(cppstem,cstem)\t                                                \\\n      (EV_PX = get_default_loop ()) throw ()                                            \\\n        : base<ev_ ## cstem, cppstem> (EV_A)                                            \\\n      {                                                                                 \\\n      }\n  #else\n    #define EV_CONSTRUCT(cppstem,cstem)                                                 \\\n      () throw ()                                                                       \\\n      {                                                                                 \\\n      }\n  #endif\n\n  /* using a template here would require quite a few more lines,\n   * so a macro solution was chosen */\n  #define EV_BEGIN_WATCHER(cppstem,cstem)\t                                        \\\n                                                                                        \\\n  struct cppstem : base<ev_ ## cstem, cppstem>                                          \\\n  {                                                                                     \\\n    void start () throw ()                                                              \\\n    {                                                                                   \\\n      ev_ ## cstem ## _start (EV_A_ static_cast<ev_ ## cstem *>(this));                 \\\n    }                                                                                   \\\n                                                                                        \\\n    void stop () throw ()                                                               \\\n    {                                                                                   \\\n      ev_ ## cstem ## _stop (EV_A_ static_cast<ev_ ## cstem *>(this));                  \\\n    }                                                                                   \\\n                                                                                        \\\n    cppstem EV_CONSTRUCT(cppstem,cstem)                                                 \\\n                                                                                        \\\n    ~cppstem () throw ()                                                                \\\n    {                                                                                   \\\n      stop ();                                                                          \\\n    }                                                                                   \\\n                                                                                        \\\n    using base<ev_ ## cstem, cppstem>::set;                                             \\\n                                                                                        \\\n  private:                                                                              \\\n                                                                                        \\\n    cppstem (const cppstem &o);                                                         \\\n                                                                                        \\\n    cppstem &operator =(const cppstem &o);                                              \\\n                                                                                        \\\n  public:\n\n  #define EV_END_WATCHER(cppstem,cstem)\t                                                \\\n  };\n\n  EV_BEGIN_WATCHER (io, io)\n    void set (int fd, int events) throw ()\n    {\n      int active = is_active ();\n      if (active) stop ();\n      ev_io_set (static_cast<ev_io *>(this), fd, events);\n      if (active) start ();\n    }\n\n    void set (int events) throw ()\n    {\n      int active = is_active ();\n      if (active) stop ();\n      ev_io_set (static_cast<ev_io *>(this), fd, events);\n      if (active) start ();\n    }\n\n    void start (int fd, int events) throw ()\n    {\n      set (fd, events);\n      start ();\n    }\n  EV_END_WATCHER (io, io)\n\n  EV_BEGIN_WATCHER (timer, timer)\n    void set (ev_tstamp after, ev_tstamp repeat = 0.) throw ()\n    {\n      int active = is_active ();\n      if (active) stop ();\n      ev_timer_set (static_cast<ev_timer *>(this), after, repeat);\n      if (active) start ();\n    }\n\n    void start (ev_tstamp after, ev_tstamp repeat = 0.) throw ()\n    {\n      set (after, repeat);\n      start ();\n    }\n\n    void again () throw ()\n    {\n      ev_timer_again (EV_A_ static_cast<ev_timer *>(this));\n    }\n\n    ev_tstamp remaining ()\n    {\n      return ev_timer_remaining (EV_A_ static_cast<ev_timer *>(this));\n    }\n  EV_END_WATCHER (timer, timer)\n\n  #if EV_PERIODIC_ENABLE\n  EV_BEGIN_WATCHER (periodic, periodic)\n    void set (ev_tstamp at, ev_tstamp interval = 0.) throw ()\n    {\n      int active = is_active ();\n      if (active) stop ();\n      ev_periodic_set (static_cast<ev_periodic *>(this), at, interval, 0);\n      if (active) start ();\n    }\n\n    void start (ev_tstamp at, ev_tstamp interval = 0.) throw ()\n    {\n      set (at, interval);\n      start ();\n    }\n\n    void again () throw ()\n    {\n      ev_periodic_again (EV_A_ static_cast<ev_periodic *>(this));\n    }\n  EV_END_WATCHER (periodic, periodic)\n  #endif\n\n  #if EV_SIGNAL_ENABLE\n  EV_BEGIN_WATCHER (sig, signal)\n    void set (int signum) throw ()\n    {\n      int active = is_active ();\n      if (active) stop ();\n      ev_signal_set (static_cast<ev_signal *>(this), signum);\n      if (active) start ();\n    }\n\n    void start (int signum) throw ()\n    {\n      set (signum);\n      start ();\n    }\n  EV_END_WATCHER (sig, signal)\n  #endif\n\n  #if EV_CHILD_ENABLE\n  EV_BEGIN_WATCHER (child, child)\n    void set (int pid, int trace = 0) throw ()\n    {\n      int active = is_active ();\n      if (active) stop ();\n      ev_child_set (static_cast<ev_child *>(this), pid, trace);\n      if (active) start ();\n    }\n\n    void start (int pid, int trace = 0) throw ()\n    {\n      set (pid, trace);\n      start ();\n    }\n  EV_END_WATCHER (child, child)\n  #endif\n\n  #if EV_STAT_ENABLE\n  EV_BEGIN_WATCHER (stat, stat)\n    void set (const char *path, ev_tstamp interval = 0.) throw ()\n    {\n      int active = is_active ();\n      if (active) stop ();\n      ev_stat_set (static_cast<ev_stat *>(this), path, interval);\n      if (active) start ();\n    }\n\n    void start (const char *path, ev_tstamp interval = 0.) throw ()\n    {\n      stop ();\n      set (path, interval);\n      start ();\n    }\n\n    void update () throw ()\n    {\n      ev_stat_stat (EV_A_ static_cast<ev_stat *>(this));\n    }\n  EV_END_WATCHER (stat, stat)\n  #endif\n\n  #if EV_IDLE_ENABLE\n  EV_BEGIN_WATCHER (idle, idle)\n    void set () throw () { }\n  EV_END_WATCHER (idle, idle)\n  #endif\n\n  #if EV_PREPARE_ENABLE\n  EV_BEGIN_WATCHER (prepare, prepare)\n    void set () throw () { }\n  EV_END_WATCHER (prepare, prepare)\n  #endif\n\n  #if EV_CHECK_ENABLE\n  EV_BEGIN_WATCHER (check, check)\n    void set () throw () { }\n  EV_END_WATCHER (check, check)\n  #endif\n\n  #if EV_EMBED_ENABLE\n  EV_BEGIN_WATCHER (embed, embed)\n    void set_embed (struct ev_loop *embedded_loop) throw ()\n    {\n      int active = is_active ();\n      if (active) stop ();\n      ev_embed_set (static_cast<ev_embed *>(this), embedded_loop);\n      if (active) start ();\n    }\n\n    void start (struct ev_loop *embedded_loop) throw ()\n    {\n      set (embedded_loop);\n      start ();\n    }\n\n    void sweep ()\n    {\n      ev_embed_sweep (EV_A_ static_cast<ev_embed *>(this));\n    }\n  EV_END_WATCHER (embed, embed)\n  #endif\n\n  #if EV_FORK_ENABLE\n  EV_BEGIN_WATCHER (fork, fork)\n    void set () throw () { }\n  EV_END_WATCHER (fork, fork)\n  #endif\n\n  #if EV_ASYNC_ENABLE\n  EV_BEGIN_WATCHER (async, async)\n    void send () throw ()\n    {\n      ev_async_send (EV_A_ static_cast<ev_async *>(this));\n    }\n\n    bool async_pending () throw ()\n    {\n      return ev_async_pending (static_cast<ev_async *>(this));\n    }\n  EV_END_WATCHER (async, async)\n  #endif\n\n  #undef EV_PX\n  #undef EV_PX_\n  #undef EV_CONSTRUCT\n  #undef EV_BEGIN_WATCHER\n  #undef EV_END_WATCHER\n}\n\n#endif\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/ev.3",
    "content": ".\\\" Automatically generated by Pod::Man 2.28 (Pod::Simple 3.30)\n.\\\"\n.\\\" Standard preamble:\n.\\\" ========================================================================\n.de Sp \\\" Vertical space (when we can't use .PP)\n.if t .sp .5v\n.if n .sp\n..\n.de Vb \\\" Begin verbatim text\n.ft CW\n.nf\n.ne \\\\$1\n..\n.de Ve \\\" End verbatim text\n.ft R\n.fi\n..\n.\\\" Set up some character translations and predefined strings.  \\*(-- will\n.\\\" give an unbreakable dash, \\*(PI will give pi, \\*(L\" will give a left\n.\\\" double quote, and \\*(R\" will give a right double quote.  \\*(C+ will\n.\\\" give a nicer C++.  Capital omega is used to do unbreakable dashes and\n.\\\" therefore won't be available.  \\*(C` and \\*(C' expand to `' in nroff,\n.\\\" nothing in troff, for use with C<>.\n.tr \\(*W-\n.ds C+ C\\v'-.1v'\\h'-1p'\\s-2+\\h'-1p'+\\s0\\v'.1v'\\h'-1p'\n.ie n \\{\\\n.    ds -- \\(*W-\n.    ds PI pi\n.    if (\\n(.H=4u)&(1m=24u) .ds -- \\(*W\\h'-12u'\\(*W\\h'-12u'-\\\" diablo 10 pitch\n.    if (\\n(.H=4u)&(1m=20u) .ds -- \\(*W\\h'-12u'\\(*W\\h'-8u'-\\\"  diablo 12 pitch\n.    ds L\" \"\"\n.    ds R\" \"\"\n.    ds C` \"\"\n.    ds C' \"\"\n'br\\}\n.el\\{\\\n.    ds -- \\|\\(em\\|\n.    ds PI \\(*p\n.    ds L\" ``\n.    ds R\" ''\n.    ds C`\n.    ds C'\n'br\\}\n.\\\"\n.\\\" Escape single quotes in literal strings from groff's Unicode transform.\n.ie \\n(.g .ds Aq \\(aq\n.el       .ds Aq '\n.\\\"\n.\\\" If the F register is turned on, we'll generate index entries on stderr for\n.\\\" titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index\n.\\\" entries marked with X<> in POD.  Of course, you'll have to process the\n.\\\" output yourself in some meaningful fashion.\n.\\\"\n.\\\" Avoid warning from groff about undefined register 'F'.\n.de IX\n..\n.nr rF 0\n.if \\n(.g .if rF .nr rF 1\n.if (\\n(rF:(\\n(.g==0)) \\{\n.    if \\nF \\{\n.        de IX\n.        tm Index:\\\\$1\\t\\\\n%\\t\"\\\\$2\"\n..\n.        if !\\nF==2 \\{\n.            nr % 0\n.            nr F 2\n.        \\}\n.    \\}\n.\\}\n.rr rF\n.\\\"\n.\\\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2).\n.\\\" Fear.  Run.  Save yourself.  No user-serviceable parts.\n.    \\\" fudge factors for nroff and troff\n.if n \\{\\\n.    ds #H 0\n.    ds #V .8m\n.    ds #F .3m\n.    ds #[ \\f1\n.    ds #] \\fP\n.\\}\n.if t \\{\\\n.    ds #H ((1u-(\\\\\\\\n(.fu%2u))*.13m)\n.    ds #V .6m\n.    ds #F 0\n.    ds #[ \\&\n.    ds #] \\&\n.\\}\n.    \\\" simple accents for nroff and troff\n.if n \\{\\\n.    ds ' \\&\n.    ds ` \\&\n.    ds ^ \\&\n.    ds , \\&\n.    ds ~ ~\n.    ds /\n.\\}\n.if t \\{\\\n.    ds ' \\\\k:\\h'-(\\\\n(.wu*8/10-\\*(#H)'\\'\\h\"|\\\\n:u\"\n.    ds ` \\\\k:\\h'-(\\\\n(.wu*8/10-\\*(#H)'\\`\\h'|\\\\n:u'\n.    ds ^ \\\\k:\\h'-(\\\\n(.wu*10/11-\\*(#H)'^\\h'|\\\\n:u'\n.    ds , \\\\k:\\h'-(\\\\n(.wu*8/10)',\\h'|\\\\n:u'\n.    ds ~ \\\\k:\\h'-(\\\\n(.wu-\\*(#H-.1m)'~\\h'|\\\\n:u'\n.    ds / \\\\k:\\h'-(\\\\n(.wu*8/10-\\*(#H)'\\z\\(sl\\h'|\\\\n:u'\n.\\}\n.    \\\" troff and (daisy-wheel) nroff accents\n.ds : \\\\k:\\h'-(\\\\n(.wu*8/10-\\*(#H+.1m+\\*(#F)'\\v'-\\*(#V'\\z.\\h'.2m+\\*(#F'.\\h'|\\\\n:u'\\v'\\*(#V'\n.ds 8 \\h'\\*(#H'\\(*b\\h'-\\*(#H'\n.ds o \\\\k:\\h'-(\\\\n(.wu+\\w'\\(de'u-\\*(#H)/2u'\\v'-.3n'\\*(#[\\z\\(de\\v'.3n'\\h'|\\\\n:u'\\*(#]\n.ds d- \\h'\\*(#H'\\(pd\\h'-\\w'~'u'\\v'-.25m'\\f2\\(hy\\fP\\v'.25m'\\h'-\\*(#H'\n.ds D- D\\\\k:\\h'-\\w'D'u'\\v'-.11m'\\z\\(hy\\v'.11m'\\h'|\\\\n:u'\n.ds th \\*(#[\\v'.3m'\\s+1I\\s-1\\v'-.3m'\\h'-(\\w'I'u*2/3)'\\s-1o\\s+1\\*(#]\n.ds Th \\*(#[\\s+2I\\s-2\\h'-\\w'I'u*3/5'\\v'-.3m'o\\v'.3m'\\*(#]\n.ds ae a\\h'-(\\w'a'u*4/10)'e\n.ds Ae A\\h'-(\\w'A'u*4/10)'E\n.    \\\" corrections for vroff\n.if v .ds ~ \\\\k:\\h'-(\\\\n(.wu*9/10-\\*(#H)'\\s-2\\u~\\d\\s+2\\h'|\\\\n:u'\n.if v .ds ^ \\\\k:\\h'-(\\\\n(.wu*10/11-\\*(#H)'\\v'-.4m'^\\v'.4m'\\h'|\\\\n:u'\n.    \\\" for low resolution devices (crt and lpr)\n.if \\n(.H>23 .if \\n(.V>19 \\\n\\{\\\n.    ds : e\n.    ds 8 ss\n.    ds o a\n.    ds d- d\\h'-1'\\(ga\n.    ds D- D\\h'-1'\\(hy\n.    ds th \\o'bp'\n.    ds Th \\o'LP'\n.    ds ae ae\n.    ds Ae AE\n.\\}\n.rm #[ #] #H #V #F C\n.\\\" ========================================================================\n.\\\"\n.IX Title \"LIBEV 3\"\n.TH LIBEV 3 \"2015-12-20\" \"libev-4.20\" \"libev - high performance full featured event loop\"\n.\\\" For nroff, turn off justification.  Always turn off hyphenation; it makes\n.\\\" way too many mistakes in technical documents.\n.if n .ad l\n.nh\n.SH \"NAME\"\nlibev \\- a high performance full\\-featured event loop written in C\n.SH \"SYNOPSIS\"\n.IX Header \"SYNOPSIS\"\n.Vb 1\n\\&   #include <ev.h>\n.Ve\n.SS \"\\s-1EXAMPLE PROGRAM\\s0\"\n.IX Subsection \"EXAMPLE PROGRAM\"\n.Vb 2\n\\&   // a single header file is required\n\\&   #include <ev.h>\n\\&\n\\&   #include <stdio.h> // for puts\n\\&\n\\&   // every watcher type has its own typedef\\*(Aqd struct\n\\&   // with the name ev_TYPE\n\\&   ev_io stdin_watcher;\n\\&   ev_timer timeout_watcher;\n\\&\n\\&   // all watcher callbacks have a similar signature\n\\&   // this callback is called when data is readable on stdin\n\\&   static void\n\\&   stdin_cb (EV_P_ ev_io *w, int revents)\n\\&   {\n\\&     puts (\"stdin ready\");\n\\&     // for one\\-shot events, one must manually stop the watcher\n\\&     // with its corresponding stop function.\n\\&     ev_io_stop (EV_A_ w);\n\\&\n\\&     // this causes all nested ev_run\\*(Aqs to stop iterating\n\\&     ev_break (EV_A_ EVBREAK_ALL);\n\\&   }\n\\&\n\\&   // another callback, this time for a time\\-out\n\\&   static void\n\\&   timeout_cb (EV_P_ ev_timer *w, int revents)\n\\&   {\n\\&     puts (\"timeout\");\n\\&     // this causes the innermost ev_run to stop iterating\n\\&     ev_break (EV_A_ EVBREAK_ONE);\n\\&   }\n\\&\n\\&   int\n\\&   main (void)\n\\&   {\n\\&     // use the default event loop unless you have special needs\n\\&     struct ev_loop *loop = EV_DEFAULT;\n\\&\n\\&     // initialise an io watcher, then start it\n\\&     // this one will watch for stdin to become readable\n\\&     ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ);\n\\&     ev_io_start (loop, &stdin_watcher);\n\\&\n\\&     // initialise a timer watcher, then start it\n\\&     // simple non\\-repeating 5.5 second timeout\n\\&     ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.);\n\\&     ev_timer_start (loop, &timeout_watcher);\n\\&\n\\&     // now wait for events to arrive\n\\&     ev_run (loop, 0);\n\\&\n\\&     // break was called, so exit\n\\&     return 0;\n\\&   }\n.Ve\n.SH \"ABOUT THIS DOCUMENT\"\n.IX Header \"ABOUT THIS DOCUMENT\"\nThis document documents the libev software package.\n.PP\nThe newest version of this document is also available as an html-formatted\nweb page you might find easier to navigate when reading it for the first\ntime: <http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod>.\n.PP\nWhile this document tries to be as complete as possible in documenting\nlibev, its usage and the rationale behind its design, it is not a tutorial\non event-based programming, nor will it introduce event-based programming\nwith libev.\n.PP\nFamiliarity with event based programming techniques in general is assumed\nthroughout this document.\n.SH \"WHAT TO READ WHEN IN A HURRY\"\n.IX Header \"WHAT TO READ WHEN IN A HURRY\"\nThis manual tries to be very detailed, but unfortunately, this also makes\nit very long. If you just want to know the basics of libev, I suggest\nreading \\*(L\"\\s-1ANATOMY OF A WATCHER\\*(R\"\\s0, then the \\*(L\"\\s-1EXAMPLE PROGRAM\\*(R\"\\s0 above and\nlook up the missing functions in \\*(L\"\\s-1GLOBAL FUNCTIONS\\*(R\"\\s0 and the \\f(CW\\*(C`ev_io\\*(C'\\fR and\n\\&\\f(CW\\*(C`ev_timer\\*(C'\\fR sections in \\*(L\"\\s-1WATCHER TYPES\\*(R\"\\s0.\n.SH \"ABOUT LIBEV\"\n.IX Header \"ABOUT LIBEV\"\nLibev is an event loop: you register interest in certain events (such as a\nfile descriptor being readable or a timeout occurring), and it will manage\nthese event sources and provide your program with events.\n.PP\nTo do this, it must take more or less complete control over your process\n(or thread) by executing the \\fIevent loop\\fR handler, and will then\ncommunicate events via a callback mechanism.\n.PP\nYou register interest in certain events by registering so-called \\fIevent\nwatchers\\fR, which are relatively small C structures you initialise with the\ndetails of the event, and then hand it over to libev by \\fIstarting\\fR the\nwatcher.\n.SS \"\\s-1FEATURES\\s0\"\n.IX Subsection \"FEATURES\"\nLibev supports \\f(CW\\*(C`select\\*(C'\\fR, \\f(CW\\*(C`poll\\*(C'\\fR, the Linux-specific \\f(CW\\*(C`epoll\\*(C'\\fR, the\nBSD-specific \\f(CW\\*(C`kqueue\\*(C'\\fR and the Solaris-specific event port mechanisms\nfor file descriptor events (\\f(CW\\*(C`ev_io\\*(C'\\fR), the Linux \\f(CW\\*(C`inotify\\*(C'\\fR interface\n(for \\f(CW\\*(C`ev_stat\\*(C'\\fR), Linux eventfd/signalfd (for faster and cleaner\ninter-thread wakeup (\\f(CW\\*(C`ev_async\\*(C'\\fR)/signal handling (\\f(CW\\*(C`ev_signal\\*(C'\\fR)) relative\ntimers (\\f(CW\\*(C`ev_timer\\*(C'\\fR), absolute timers with customised rescheduling\n(\\f(CW\\*(C`ev_periodic\\*(C'\\fR), synchronous signals (\\f(CW\\*(C`ev_signal\\*(C'\\fR), process status\nchange events (\\f(CW\\*(C`ev_child\\*(C'\\fR), and event watchers dealing with the event\nloop mechanism itself (\\f(CW\\*(C`ev_idle\\*(C'\\fR, \\f(CW\\*(C`ev_embed\\*(C'\\fR, \\f(CW\\*(C`ev_prepare\\*(C'\\fR and\n\\&\\f(CW\\*(C`ev_check\\*(C'\\fR watchers) as well as file watchers (\\f(CW\\*(C`ev_stat\\*(C'\\fR) and even\nlimited support for fork events (\\f(CW\\*(C`ev_fork\\*(C'\\fR).\n.PP\nIt also is quite fast (see this\nbenchmark <http://libev.schmorp.de/bench.html> comparing it to libevent\nfor example).\n.SS \"\\s-1CONVENTIONS\\s0\"\n.IX Subsection \"CONVENTIONS\"\nLibev is very configurable. In this manual the default (and most common)\nconfiguration will be described, which supports multiple event loops. For\nmore info about various configuration options please have a look at\n\\&\\fB\\s-1EMBED\\s0\\fR section in this manual. If libev was configured without support\nfor multiple event loops, then all functions taking an initial argument of\nname \\f(CW\\*(C`loop\\*(C'\\fR (which is always of type \\f(CW\\*(C`struct ev_loop *\\*(C'\\fR) will not have\nthis argument.\n.SS \"\\s-1TIME REPRESENTATION\\s0\"\n.IX Subsection \"TIME REPRESENTATION\"\nLibev represents time as a single floating point number, representing\nthe (fractional) number of seconds since the (\\s-1POSIX\\s0) epoch (in practice\nsomewhere near the beginning of 1970, details are complicated, don't\nask). This type is called \\f(CW\\*(C`ev_tstamp\\*(C'\\fR, which is what you should use\ntoo. It usually aliases to the \\f(CW\\*(C`double\\*(C'\\fR type in C. When you need to do\nany calculations on it, you should treat it as some floating point value.\n.PP\nUnlike the name component \\f(CW\\*(C`stamp\\*(C'\\fR might indicate, it is also used for\ntime differences (e.g. delays) throughout libev.\n.SH \"ERROR HANDLING\"\n.IX Header \"ERROR HANDLING\"\nLibev knows three classes of errors: operating system errors, usage errors\nand internal errors (bugs).\n.PP\nWhen libev catches an operating system error it cannot handle (for example\na system call indicating a condition libev cannot fix), it calls the callback\nset via \\f(CW\\*(C`ev_set_syserr_cb\\*(C'\\fR, which is supposed to fix the problem or\nabort. The default is to print a diagnostic message and to call \\f(CW\\*(C`abort\n()\\*(C'\\fR.\n.PP\nWhen libev detects a usage error such as a negative timer interval, then\nit will print a diagnostic message and abort (via the \\f(CW\\*(C`assert\\*(C'\\fR mechanism,\nso \\f(CW\\*(C`NDEBUG\\*(C'\\fR will disable this checking): these are programming errors in\nthe libev caller and need to be fixed there.\n.PP\nLibev also has a few internal error-checking \\f(CW\\*(C`assert\\*(C'\\fRions, and also has\nextensive consistency checking code. These do not trigger under normal\ncircumstances, as they indicate either a bug in libev or worse.\n.SH \"GLOBAL FUNCTIONS\"\n.IX Header \"GLOBAL FUNCTIONS\"\nThese functions can be called anytime, even before initialising the\nlibrary in any way.\n.IP \"ev_tstamp ev_time ()\" 4\n.IX Item \"ev_tstamp ev_time ()\"\nReturns the current time as libev would use it. Please note that the\n\\&\\f(CW\\*(C`ev_now\\*(C'\\fR function is usually faster and also often returns the timestamp\nyou actually want to know. Also interesting is the combination of\n\\&\\f(CW\\*(C`ev_now_update\\*(C'\\fR and \\f(CW\\*(C`ev_now\\*(C'\\fR.\n.IP \"ev_sleep (ev_tstamp interval)\" 4\n.IX Item \"ev_sleep (ev_tstamp interval)\"\nSleep for the given interval: The current thread will be blocked\nuntil either it is interrupted or the given time interval has\npassed (approximately \\- it might return a bit earlier even if not\ninterrupted). Returns immediately if \\f(CW\\*(C`interval <= 0\\*(C'\\fR.\n.Sp\nBasically this is a sub-second-resolution \\f(CW\\*(C`sleep ()\\*(C'\\fR.\n.Sp\nThe range of the \\f(CW\\*(C`interval\\*(C'\\fR is limited \\- libev only guarantees to work\nwith sleep times of up to one day (\\f(CW\\*(C`interval <= 86400\\*(C'\\fR).\n.IP \"int ev_version_major ()\" 4\n.IX Item \"int ev_version_major ()\"\n.PD 0\n.IP \"int ev_version_minor ()\" 4\n.IX Item \"int ev_version_minor ()\"\n.PD\nYou can find out the major and minor \\s-1ABI\\s0 version numbers of the library\nyou linked against by calling the functions \\f(CW\\*(C`ev_version_major\\*(C'\\fR and\n\\&\\f(CW\\*(C`ev_version_minor\\*(C'\\fR. If you want, you can compare against the global\nsymbols \\f(CW\\*(C`EV_VERSION_MAJOR\\*(C'\\fR and \\f(CW\\*(C`EV_VERSION_MINOR\\*(C'\\fR, which specify the\nversion of the library your program was compiled against.\n.Sp\nThese version numbers refer to the \\s-1ABI\\s0 version of the library, not the\nrelease version.\n.Sp\nUsually, it's a good idea to terminate if the major versions mismatch,\nas this indicates an incompatible change. Minor versions are usually\ncompatible to older versions, so a larger minor version alone is usually\nnot a problem.\n.Sp\nExample: Make sure we haven't accidentally been linked against the wrong\nversion (note, however, that this will not detect other \\s-1ABI\\s0 mismatches,\nsuch as \\s-1LFS\\s0 or reentrancy).\n.Sp\n.Vb 3\n\\&   assert ((\"libev version mismatch\",\n\\&            ev_version_major () == EV_VERSION_MAJOR\n\\&            && ev_version_minor () >= EV_VERSION_MINOR));\n.Ve\n.IP \"unsigned int ev_supported_backends ()\" 4\n.IX Item \"unsigned int ev_supported_backends ()\"\nReturn the set of all backends (i.e. their corresponding \\f(CW\\*(C`EV_BACKEND_*\\*(C'\\fR\nvalue) compiled into this binary of libev (independent of their\navailability on the system you are running on). See \\f(CW\\*(C`ev_default_loop\\*(C'\\fR for\na description of the set values.\n.Sp\nExample: make sure we have the epoll method, because yeah this is cool and\na must have and can we have a torrent of it please!!!11\n.Sp\n.Vb 2\n\\&   assert ((\"sorry, no epoll, no sex\",\n\\&            ev_supported_backends () & EVBACKEND_EPOLL));\n.Ve\n.IP \"unsigned int ev_recommended_backends ()\" 4\n.IX Item \"unsigned int ev_recommended_backends ()\"\nReturn the set of all backends compiled into this binary of libev and\nalso recommended for this platform, meaning it will work for most file\ndescriptor types. This set is often smaller than the one returned by\n\\&\\f(CW\\*(C`ev_supported_backends\\*(C'\\fR, as for example kqueue is broken on most BSDs\nand will not be auto-detected unless you explicitly request it (assuming\nyou know what you are doing). This is the set of backends that libev will\nprobe for if you specify no backends explicitly.\n.IP \"unsigned int ev_embeddable_backends ()\" 4\n.IX Item \"unsigned int ev_embeddable_backends ()\"\nReturns the set of backends that are embeddable in other event loops. This\nvalue is platform-specific but can include backends not available on the\ncurrent system. To find which embeddable backends might be supported on\nthe current system, you would need to look at \\f(CW\\*(C`ev_embeddable_backends ()\n& ev_supported_backends ()\\*(C'\\fR, likewise for recommended ones.\n.Sp\nSee the description of \\f(CW\\*(C`ev_embed\\*(C'\\fR watchers for more info.\n.IP \"ev_set_allocator (void *(*cb)(void *ptr, long size) throw ())\" 4\n.IX Item \"ev_set_allocator (void *(*cb)(void *ptr, long size) throw ())\"\nSets the allocation function to use (the prototype is similar \\- the\nsemantics are identical to the \\f(CW\\*(C`realloc\\*(C'\\fR C89/SuS/POSIX function). It is\nused to allocate and free memory (no surprises here). If it returns zero\nwhen memory needs to be allocated (\\f(CW\\*(C`size != 0\\*(C'\\fR), the library might abort\nor take some potentially destructive action.\n.Sp\nSince some systems (at least OpenBSD and Darwin) fail to implement\ncorrect \\f(CW\\*(C`realloc\\*(C'\\fR semantics, libev will use a wrapper around the system\n\\&\\f(CW\\*(C`realloc\\*(C'\\fR and \\f(CW\\*(C`free\\*(C'\\fR functions by default.\n.Sp\nYou could override this function in high-availability programs to, say,\nfree some memory if it cannot allocate memory, to use a special allocator,\nor even to sleep a while and retry until some memory is available.\n.Sp\nExample: Replace the libev allocator with one that waits a bit and then\nretries (example requires a standards-compliant \\f(CW\\*(C`realloc\\*(C'\\fR).\n.Sp\n.Vb 6\n\\&   static void *\n\\&   persistent_realloc (void *ptr, size_t size)\n\\&   {\n\\&     for (;;)\n\\&       {\n\\&         void *newptr = realloc (ptr, size);\n\\&\n\\&         if (newptr)\n\\&           return newptr;\n\\&\n\\&         sleep (60);\n\\&       }\n\\&   }\n\\&\n\\&   ...\n\\&   ev_set_allocator (persistent_realloc);\n.Ve\n.IP \"ev_set_syserr_cb (void (*cb)(const char *msg) throw ())\" 4\n.IX Item \"ev_set_syserr_cb (void (*cb)(const char *msg) throw ())\"\nSet the callback function to call on a retryable system call error (such\nas failed select, poll, epoll_wait). The message is a printable string\nindicating the system call or subsystem causing the problem. If this\ncallback is set, then libev will expect it to remedy the situation, no\nmatter what, when it returns. That is, libev will generally retry the\nrequested operation, or, if the condition doesn't go away, do bad stuff\n(such as abort).\n.Sp\nExample: This is basically the same thing that libev does internally, too.\n.Sp\n.Vb 6\n\\&   static void\n\\&   fatal_error (const char *msg)\n\\&   {\n\\&     perror (msg);\n\\&     abort ();\n\\&   }\n\\&\n\\&   ...\n\\&   ev_set_syserr_cb (fatal_error);\n.Ve\n.IP \"ev_feed_signal (int signum)\" 4\n.IX Item \"ev_feed_signal (int signum)\"\nThis function can be used to \\*(L\"simulate\\*(R\" a signal receive. It is completely\nsafe to call this function at any time, from any context, including signal\nhandlers or random threads.\n.Sp\nIts main use is to customise signal handling in your process, especially\nin the presence of threads. For example, you could block signals\nby default in all threads (and specifying \\f(CW\\*(C`EVFLAG_NOSIGMASK\\*(C'\\fR when\ncreating any loops), and in one thread, use \\f(CW\\*(C`sigwait\\*(C'\\fR or any other\nmechanism to wait for signals, then \\*(L\"deliver\\*(R\" them to libev by calling\n\\&\\f(CW\\*(C`ev_feed_signal\\*(C'\\fR.\n.SH \"FUNCTIONS CONTROLLING EVENT LOOPS\"\n.IX Header \"FUNCTIONS CONTROLLING EVENT LOOPS\"\nAn event loop is described by a \\f(CW\\*(C`struct ev_loop *\\*(C'\\fR (the \\f(CW\\*(C`struct\\*(C'\\fR is\n\\&\\fInot\\fR optional in this case unless libev 3 compatibility is disabled, as\nlibev 3 had an \\f(CW\\*(C`ev_loop\\*(C'\\fR function colliding with the struct name).\n.PP\nThe library knows two types of such loops, the \\fIdefault\\fR loop, which\nsupports child process events, and dynamically created event loops which\ndo not.\n.IP \"struct ev_loop *ev_default_loop (unsigned int flags)\" 4\n.IX Item \"struct ev_loop *ev_default_loop (unsigned int flags)\"\nThis returns the \\*(L\"default\\*(R\" event loop object, which is what you should\nnormally use when you just need \\*(L\"the event loop\\*(R\". Event loop objects and\nthe \\f(CW\\*(C`flags\\*(C'\\fR parameter are described in more detail in the entry for\n\\&\\f(CW\\*(C`ev_loop_new\\*(C'\\fR.\n.Sp\nIf the default loop is already initialised then this function simply\nreturns it (and ignores the flags. If that is troubling you, check\n\\&\\f(CW\\*(C`ev_backend ()\\*(C'\\fR afterwards). Otherwise it will create it with the given\nflags, which should almost always be \\f(CW0\\fR, unless the caller is also the\none calling \\f(CW\\*(C`ev_run\\*(C'\\fR or otherwise qualifies as \\*(L\"the main program\\*(R\".\n.Sp\nIf you don't know what event loop to use, use the one returned from this\nfunction (or via the \\f(CW\\*(C`EV_DEFAULT\\*(C'\\fR macro).\n.Sp\nNote that this function is \\fInot\\fR thread-safe, so if you want to use it\nfrom multiple threads, you have to employ some kind of mutex (note also\nthat this case is unlikely, as loops cannot be shared easily between\nthreads anyway).\n.Sp\nThe default loop is the only loop that can handle \\f(CW\\*(C`ev_child\\*(C'\\fR watchers,\nand to do this, it always registers a handler for \\f(CW\\*(C`SIGCHLD\\*(C'\\fR. If this is\na problem for your application you can either create a dynamic loop with\n\\&\\f(CW\\*(C`ev_loop_new\\*(C'\\fR which doesn't do that, or you can simply overwrite the\n\\&\\f(CW\\*(C`SIGCHLD\\*(C'\\fR signal handler \\fIafter\\fR calling \\f(CW\\*(C`ev_default_init\\*(C'\\fR.\n.Sp\nExample: This is the most typical usage.\n.Sp\n.Vb 2\n\\&   if (!ev_default_loop (0))\n\\&     fatal (\"could not initialise libev, bad $LIBEV_FLAGS in environment?\");\n.Ve\n.Sp\nExample: Restrict libev to the select and poll backends, and do not allow\nenvironment settings to be taken into account:\n.Sp\n.Vb 1\n\\&   ev_default_loop (EVBACKEND_POLL | EVBACKEND_SELECT | EVFLAG_NOENV);\n.Ve\n.IP \"struct ev_loop *ev_loop_new (unsigned int flags)\" 4\n.IX Item \"struct ev_loop *ev_loop_new (unsigned int flags)\"\nThis will create and initialise a new event loop object. If the loop\ncould not be initialised, returns false.\n.Sp\nThis function is thread-safe, and one common way to use libev with\nthreads is indeed to create one loop per thread, and using the default\nloop in the \\*(L\"main\\*(R\" or \\*(L\"initial\\*(R\" thread.\n.Sp\nThe flags argument can be used to specify special behaviour or specific\nbackends to use, and is usually specified as \\f(CW0\\fR (or \\f(CW\\*(C`EVFLAG_AUTO\\*(C'\\fR).\n.Sp\nThe following flags are supported:\n.RS 4\n.ie n .IP \"\"\"EVFLAG_AUTO\"\"\" 4\n.el .IP \"\\f(CWEVFLAG_AUTO\\fR\" 4\n.IX Item \"EVFLAG_AUTO\"\nThe default flags value. Use this if you have no clue (it's the right\nthing, believe me).\n.ie n .IP \"\"\"EVFLAG_NOENV\"\"\" 4\n.el .IP \"\\f(CWEVFLAG_NOENV\\fR\" 4\n.IX Item \"EVFLAG_NOENV\"\nIf this flag bit is or'ed into the flag value (or the program runs setuid\nor setgid) then libev will \\fInot\\fR look at the environment variable\n\\&\\f(CW\\*(C`LIBEV_FLAGS\\*(C'\\fR. Otherwise (the default), this environment variable will\noverride the flags completely if it is found in the environment. This is\nuseful to try out specific backends to test their performance, to work\naround bugs, or to make libev threadsafe (accessing environment variables\ncannot be done in a threadsafe way, but usually it works if no other\nthread modifies them).\n.ie n .IP \"\"\"EVFLAG_FORKCHECK\"\"\" 4\n.el .IP \"\\f(CWEVFLAG_FORKCHECK\\fR\" 4\n.IX Item \"EVFLAG_FORKCHECK\"\nInstead of calling \\f(CW\\*(C`ev_loop_fork\\*(C'\\fR manually after a fork, you can also\nmake libev check for a fork in each iteration by enabling this flag.\n.Sp\nThis works by calling \\f(CW\\*(C`getpid ()\\*(C'\\fR on every iteration of the loop,\nand thus this might slow down your event loop if you do a lot of loop\niterations and little real work, but is usually not noticeable (on my\nGNU/Linux system for example, \\f(CW\\*(C`getpid\\*(C'\\fR is actually a simple 5\\-insn sequence\nwithout a system call and thus \\fIvery\\fR fast, but my GNU/Linux system also has\n\\&\\f(CW\\*(C`pthread_atfork\\*(C'\\fR which is even faster).\n.Sp\nThe big advantage of this flag is that you can forget about fork (and\nforget about forgetting to tell libev about forking, although you still\nhave to ignore \\f(CW\\*(C`SIGPIPE\\*(C'\\fR) when you use this flag.\n.Sp\nThis flag setting cannot be overridden or specified in the \\f(CW\\*(C`LIBEV_FLAGS\\*(C'\\fR\nenvironment variable.\n.ie n .IP \"\"\"EVFLAG_NOINOTIFY\"\"\" 4\n.el .IP \"\\f(CWEVFLAG_NOINOTIFY\\fR\" 4\n.IX Item \"EVFLAG_NOINOTIFY\"\nWhen this flag is specified, then libev will not attempt to use the\n\\&\\fIinotify\\fR \\s-1API\\s0 for its \\f(CW\\*(C`ev_stat\\*(C'\\fR watchers. Apart from debugging and\ntesting, this flag can be useful to conserve inotify file descriptors, as\notherwise each loop using \\f(CW\\*(C`ev_stat\\*(C'\\fR watchers consumes one inotify handle.\n.ie n .IP \"\"\"EVFLAG_SIGNALFD\"\"\" 4\n.el .IP \"\\f(CWEVFLAG_SIGNALFD\\fR\" 4\n.IX Item \"EVFLAG_SIGNALFD\"\nWhen this flag is specified, then libev will attempt to use the\n\\&\\fIsignalfd\\fR \\s-1API\\s0 for its \\f(CW\\*(C`ev_signal\\*(C'\\fR (and \\f(CW\\*(C`ev_child\\*(C'\\fR) watchers. This \\s-1API\\s0\ndelivers signals synchronously, which makes it both faster and might make\nit possible to get the queued signal data. It can also simplify signal\nhandling with threads, as long as you properly block signals in your\nthreads that are not interested in handling them.\n.Sp\nSignalfd will not be used by default as this changes your signal mask, and\nthere are a lot of shoddy libraries and programs (glib's threadpool for\nexample) that can't properly initialise their signal masks.\n.ie n .IP \"\"\"EVFLAG_NOSIGMASK\"\"\" 4\n.el .IP \"\\f(CWEVFLAG_NOSIGMASK\\fR\" 4\n.IX Item \"EVFLAG_NOSIGMASK\"\nWhen this flag is specified, then libev will avoid to modify the signal\nmask. Specifically, this means you have to make sure signals are unblocked\nwhen you want to receive them.\n.Sp\nThis behaviour is useful when you want to do your own signal handling, or\nwant to handle signals only in specific threads and want to avoid libev\nunblocking the signals.\n.Sp\nIt's also required by \\s-1POSIX\\s0 in a threaded program, as libev calls\n\\&\\f(CW\\*(C`sigprocmask\\*(C'\\fR, whose behaviour is officially unspecified.\n.Sp\nThis flag's behaviour will become the default in future versions of libev.\n.ie n .IP \"\"\"EVBACKEND_SELECT\"\"  (value 1, portable select backend)\" 4\n.el .IP \"\\f(CWEVBACKEND_SELECT\\fR  (value 1, portable select backend)\" 4\n.IX Item \"EVBACKEND_SELECT (value 1, portable select backend)\"\nThis is your standard \\fIselect\\fR\\|(2) backend. Not \\fIcompletely\\fR standard, as\nlibev tries to roll its own fd_set with no limits on the number of fds,\nbut if that fails, expect a fairly low limit on the number of fds when\nusing this backend. It doesn't scale too well (O(highest_fd)), but its\nusually the fastest backend for a low number of (low-numbered :) fds.\n.Sp\nTo get good performance out of this backend you need a high amount of\nparallelism (most of the file descriptors should be busy). If you are\nwriting a server, you should \\f(CW\\*(C`accept ()\\*(C'\\fR in a loop to accept as many\nconnections as possible during one iteration. You might also want to have\na look at \\f(CW\\*(C`ev_set_io_collect_interval ()\\*(C'\\fR to increase the amount of\nreadiness notifications you get per iteration.\n.Sp\nThis backend maps \\f(CW\\*(C`EV_READ\\*(C'\\fR to the \\f(CW\\*(C`readfds\\*(C'\\fR set and \\f(CW\\*(C`EV_WRITE\\*(C'\\fR to the\n\\&\\f(CW\\*(C`writefds\\*(C'\\fR set (and to work around Microsoft Windows bugs, also onto the\n\\&\\f(CW\\*(C`exceptfds\\*(C'\\fR set on that platform).\n.ie n .IP \"\"\"EVBACKEND_POLL\"\"    (value 2, poll backend, available everywhere except on windows)\" 4\n.el .IP \"\\f(CWEVBACKEND_POLL\\fR    (value 2, poll backend, available everywhere except on windows)\" 4\n.IX Item \"EVBACKEND_POLL (value 2, poll backend, available everywhere except on windows)\"\nAnd this is your standard \\fIpoll\\fR\\|(2) backend. It's more complicated\nthan select, but handles sparse fds better and has no artificial\nlimit on the number of fds you can use (except it will slow down\nconsiderably with a lot of inactive fds). It scales similarly to select,\ni.e. O(total_fds). See the entry for \\f(CW\\*(C`EVBACKEND_SELECT\\*(C'\\fR, above, for\nperformance tips.\n.Sp\nThis backend maps \\f(CW\\*(C`EV_READ\\*(C'\\fR to \\f(CW\\*(C`POLLIN | POLLERR | POLLHUP\\*(C'\\fR, and\n\\&\\f(CW\\*(C`EV_WRITE\\*(C'\\fR to \\f(CW\\*(C`POLLOUT | POLLERR | POLLHUP\\*(C'\\fR.\n.ie n .IP \"\"\"EVBACKEND_EPOLL\"\"   (value 4, Linux)\" 4\n.el .IP \"\\f(CWEVBACKEND_EPOLL\\fR   (value 4, Linux)\" 4\n.IX Item \"EVBACKEND_EPOLL (value 4, Linux)\"\nUse the linux-specific \\fIepoll\\fR\\|(7) interface (for both pre\\- and post\\-2.6.9\nkernels).\n.Sp\nFor few fds, this backend is a bit little slower than poll and select, but\nit scales phenomenally better. While poll and select usually scale like\nO(total_fds) where total_fds is the total number of fds (or the highest\nfd), epoll scales either O(1) or O(active_fds).\n.Sp\nThe epoll mechanism deserves honorable mention as the most misdesigned\nof the more advanced event mechanisms: mere annoyances include silently\ndropping file descriptors, requiring a system call per change per file\ndescriptor (and unnecessary guessing of parameters), problems with dup,\nreturning before the timeout value, resulting in additional iterations\n(and only giving 5ms accuracy while select on the same platform gives\n0.1ms) and so on. The biggest issue is fork races, however \\- if a program\nforks then \\fIboth\\fR parent and child process have to recreate the epoll\nset, which can take considerable time (one syscall per file descriptor)\nand is of course hard to detect.\n.Sp\nEpoll is also notoriously buggy \\- embedding epoll fds \\fIshould\\fR work,\nbut of course \\fIdoesn't\\fR, and epoll just loves to report events for\ntotally \\fIdifferent\\fR file descriptors (even already closed ones, so\none cannot even remove them from the set) than registered in the set\n(especially on \\s-1SMP\\s0 systems). Libev tries to counter these spurious\nnotifications by employing an additional generation counter and comparing\nthat against the events to filter out spurious ones, recreating the set\nwhen required. Epoll also erroneously rounds down timeouts, but gives you\nno way to know when and by how much, so sometimes you have to busy-wait\nbecause epoll returns immediately despite a nonzero timeout. And last\nnot least, it also refuses to work with some file descriptors which work\nperfectly fine with \\f(CW\\*(C`select\\*(C'\\fR (files, many character devices...).\n.Sp\nEpoll is truly the train wreck among event poll mechanisms, a frankenpoll,\ncobbled together in a hurry, no thought to design or interaction with\nothers. Oh, the pain, will it ever stop...\n.Sp\nWhile stopping, setting and starting an I/O watcher in the same iteration\nwill result in some caching, there is still a system call per such\nincident (because the same \\fIfile descriptor\\fR could point to a different\n\\&\\fIfile description\\fR now), so its best to avoid that. Also, \\f(CW\\*(C`dup ()\\*(C'\\fR'ed\nfile descriptors might not work very well if you register events for both\nfile descriptors.\n.Sp\nBest performance from this backend is achieved by not unregistering all\nwatchers for a file descriptor until it has been closed, if possible,\ni.e. keep at least one watcher active per fd at all times. Stopping and\nstarting a watcher (without re-setting it) also usually doesn't cause\nextra overhead. A fork can both result in spurious notifications as well\nas in libev having to destroy and recreate the epoll object, which can\ntake considerable time and thus should be avoided.\n.Sp\nAll this means that, in practice, \\f(CW\\*(C`EVBACKEND_SELECT\\*(C'\\fR can be as fast or\nfaster than epoll for maybe up to a hundred file descriptors, depending on\nthe usage. So sad.\n.Sp\nWhile nominally embeddable in other event loops, this feature is broken in\nall kernel versions tested so far.\n.Sp\nThis backend maps \\f(CW\\*(C`EV_READ\\*(C'\\fR and \\f(CW\\*(C`EV_WRITE\\*(C'\\fR in the same way as\n\\&\\f(CW\\*(C`EVBACKEND_POLL\\*(C'\\fR.\n.ie n .IP \"\"\"EVBACKEND_KQUEUE\"\"  (value 8, most \\s-1BSD\\s0 clones)\" 4\n.el .IP \"\\f(CWEVBACKEND_KQUEUE\\fR  (value 8, most \\s-1BSD\\s0 clones)\" 4\n.IX Item \"EVBACKEND_KQUEUE (value 8, most BSD clones)\"\nKqueue deserves special mention, as at the time of this writing, it\nwas broken on all BSDs except NetBSD (usually it doesn't work reliably\nwith anything but sockets and pipes, except on Darwin, where of course\nit's completely useless). Unlike epoll, however, whose brokenness\nis by design, these kqueue bugs can (and eventually will) be fixed\nwithout \\s-1API\\s0 changes to existing programs. For this reason it's not being\n\\&\\*(L\"auto-detected\\*(R\" unless you explicitly specify it in the flags (i.e. using\n\\&\\f(CW\\*(C`EVBACKEND_KQUEUE\\*(C'\\fR) or libev was compiled on a known-to-be-good (\\-enough)\nsystem like NetBSD.\n.Sp\nYou still can embed kqueue into a normal poll or select backend and use it\nonly for sockets (after having made sure that sockets work with kqueue on\nthe target platform). See \\f(CW\\*(C`ev_embed\\*(C'\\fR watchers for more info.\n.Sp\nIt scales in the same way as the epoll backend, but the interface to the\nkernel is more efficient (which says nothing about its actual speed, of\ncourse). While stopping, setting and starting an I/O watcher does never\ncause an extra system call as with \\f(CW\\*(C`EVBACKEND_EPOLL\\*(C'\\fR, it still adds up to\ntwo event changes per incident. Support for \\f(CW\\*(C`fork ()\\*(C'\\fR is very bad (you\nmight have to leak fd's on fork, but it's more sane than epoll) and it\ndrops fds silently in similarly hard-to-detect cases.\n.Sp\nThis backend usually performs well under most conditions.\n.Sp\nWhile nominally embeddable in other event loops, this doesn't work\neverywhere, so you might need to test for this. And since it is broken\nalmost everywhere, you should only use it when you have a lot of sockets\n(for which it usually works), by embedding it into another event loop\n(e.g. \\f(CW\\*(C`EVBACKEND_SELECT\\*(C'\\fR or \\f(CW\\*(C`EVBACKEND_POLL\\*(C'\\fR (but \\f(CW\\*(C`poll\\*(C'\\fR is of course\nalso broken on \\s-1OS X\\s0)) and, did I mention it, using it only for sockets.\n.Sp\nThis backend maps \\f(CW\\*(C`EV_READ\\*(C'\\fR into an \\f(CW\\*(C`EVFILT_READ\\*(C'\\fR kevent with\n\\&\\f(CW\\*(C`NOTE_EOF\\*(C'\\fR, and \\f(CW\\*(C`EV_WRITE\\*(C'\\fR into an \\f(CW\\*(C`EVFILT_WRITE\\*(C'\\fR kevent with\n\\&\\f(CW\\*(C`NOTE_EOF\\*(C'\\fR.\n.ie n .IP \"\"\"EVBACKEND_DEVPOLL\"\" (value 16, Solaris 8)\" 4\n.el .IP \"\\f(CWEVBACKEND_DEVPOLL\\fR (value 16, Solaris 8)\" 4\n.IX Item \"EVBACKEND_DEVPOLL (value 16, Solaris 8)\"\nThis is not implemented yet (and might never be, unless you send me an\nimplementation). According to reports, \\f(CW\\*(C`/dev/poll\\*(C'\\fR only supports sockets\nand is not embeddable, which would limit the usefulness of this backend\nimmensely.\n.ie n .IP \"\"\"EVBACKEND_PORT\"\"    (value 32, Solaris 10)\" 4\n.el .IP \"\\f(CWEVBACKEND_PORT\\fR    (value 32, Solaris 10)\" 4\n.IX Item \"EVBACKEND_PORT (value 32, Solaris 10)\"\nThis uses the Solaris 10 event port mechanism. As with everything on Solaris,\nit's really slow, but it still scales very well (O(active_fds)).\n.Sp\nWhile this backend scales well, it requires one system call per active\nfile descriptor per loop iteration. For small and medium numbers of file\ndescriptors a \\*(L\"slow\\*(R\" \\f(CW\\*(C`EVBACKEND_SELECT\\*(C'\\fR or \\f(CW\\*(C`EVBACKEND_POLL\\*(C'\\fR backend\nmight perform better.\n.Sp\nOn the positive side, this backend actually performed fully to\nspecification in all tests and is fully embeddable, which is a rare feat\namong the OS-specific backends (I vastly prefer correctness over speed\nhacks).\n.Sp\nOn the negative side, the interface is \\fIbizarre\\fR \\- so bizarre that\neven sun itself gets it wrong in their code examples: The event polling\nfunction sometimes returns events to the caller even though an error\noccurred, but with no indication whether it has done so or not (yes, it's\neven documented that way) \\- deadly for edge-triggered interfaces where you\nabsolutely have to know whether an event occurred or not because you have\nto re-arm the watcher.\n.Sp\nFortunately libev seems to be able to work around these idiocies.\n.Sp\nThis backend maps \\f(CW\\*(C`EV_READ\\*(C'\\fR and \\f(CW\\*(C`EV_WRITE\\*(C'\\fR in the same way as\n\\&\\f(CW\\*(C`EVBACKEND_POLL\\*(C'\\fR.\n.ie n .IP \"\"\"EVBACKEND_ALL\"\"\" 4\n.el .IP \"\\f(CWEVBACKEND_ALL\\fR\" 4\n.IX Item \"EVBACKEND_ALL\"\nTry all backends (even potentially broken ones that wouldn't be tried\nwith \\f(CW\\*(C`EVFLAG_AUTO\\*(C'\\fR). Since this is a mask, you can do stuff such as\n\\&\\f(CW\\*(C`EVBACKEND_ALL & ~EVBACKEND_KQUEUE\\*(C'\\fR.\n.Sp\nIt is definitely not recommended to use this flag, use whatever\n\\&\\f(CW\\*(C`ev_recommended_backends ()\\*(C'\\fR returns, or simply do not specify a backend\nat all.\n.ie n .IP \"\"\"EVBACKEND_MASK\"\"\" 4\n.el .IP \"\\f(CWEVBACKEND_MASK\\fR\" 4\n.IX Item \"EVBACKEND_MASK\"\nNot a backend at all, but a mask to select all backend bits from a\n\\&\\f(CW\\*(C`flags\\*(C'\\fR value, in case you want to mask out any backends from a flags\nvalue (e.g. when modifying the \\f(CW\\*(C`LIBEV_FLAGS\\*(C'\\fR environment variable).\n.RE\n.RS 4\n.Sp\nIf one or more of the backend flags are or'ed into the flags value,\nthen only these backends will be tried (in the reverse order as listed\nhere). If none are specified, all backends in \\f(CW\\*(C`ev_recommended_backends\n()\\*(C'\\fR will be tried.\n.Sp\nExample: Try to create a event loop that uses epoll and nothing else.\n.Sp\n.Vb 3\n\\&   struct ev_loop *epoller = ev_loop_new (EVBACKEND_EPOLL | EVFLAG_NOENV);\n\\&   if (!epoller)\n\\&     fatal (\"no epoll found here, maybe it hides under your chair\");\n.Ve\n.Sp\nExample: Use whatever libev has to offer, but make sure that kqueue is\nused if available.\n.Sp\n.Vb 1\n\\&   struct ev_loop *loop = ev_loop_new (ev_recommended_backends () | EVBACKEND_KQUEUE);\n.Ve\n.RE\n.IP \"ev_loop_destroy (loop)\" 4\n.IX Item \"ev_loop_destroy (loop)\"\nDestroys an event loop object (frees all memory and kernel state\netc.). None of the active event watchers will be stopped in the normal\nsense, so e.g. \\f(CW\\*(C`ev_is_active\\*(C'\\fR might still return true. It is your\nresponsibility to either stop all watchers cleanly yourself \\fIbefore\\fR\ncalling this function, or cope with the fact afterwards (which is usually\nthe easiest thing, you can just ignore the watchers and/or \\f(CW\\*(C`free ()\\*(C'\\fR them\nfor example).\n.Sp\nNote that certain global state, such as signal state (and installed signal\nhandlers), will not be freed by this function, and related watchers (such\nas signal and child watchers) would need to be stopped manually.\n.Sp\nThis function is normally used on loop objects allocated by\n\\&\\f(CW\\*(C`ev_loop_new\\*(C'\\fR, but it can also be used on the default loop returned by\n\\&\\f(CW\\*(C`ev_default_loop\\*(C'\\fR, in which case it is not thread-safe.\n.Sp\nNote that it is not advisable to call this function on the default loop\nexcept in the rare occasion where you really need to free its resources.\nIf you need dynamically allocated loops it is better to use \\f(CW\\*(C`ev_loop_new\\*(C'\\fR\nand \\f(CW\\*(C`ev_loop_destroy\\*(C'\\fR.\n.IP \"ev_loop_fork (loop)\" 4\n.IX Item \"ev_loop_fork (loop)\"\nThis function sets a flag that causes subsequent \\f(CW\\*(C`ev_run\\*(C'\\fR iterations\nto reinitialise the kernel state for backends that have one. Despite\nthe name, you can call it anytime you are allowed to start or stop\nwatchers (except inside an \\f(CW\\*(C`ev_prepare\\*(C'\\fR callback), but it makes most\nsense after forking, in the child process. You \\fImust\\fR call it (or use\n\\&\\f(CW\\*(C`EVFLAG_FORKCHECK\\*(C'\\fR) in the child before resuming or calling \\f(CW\\*(C`ev_run\\*(C'\\fR.\n.Sp\nIn addition, if you want to reuse a loop (via this function or\n\\&\\f(CW\\*(C`EVFLAG_FORKCHECK\\*(C'\\fR), you \\fIalso\\fR have to ignore \\f(CW\\*(C`SIGPIPE\\*(C'\\fR.\n.Sp\nAgain, you \\fIhave\\fR to call it on \\fIany\\fR loop that you want to re-use after\na fork, \\fIeven if you do not plan to use the loop in the parent\\fR. This is\nbecause some kernel interfaces *cough* \\fIkqueue\\fR *cough* do funny things\nduring fork.\n.Sp\nOn the other hand, you only need to call this function in the child\nprocess if and only if you want to use the event loop in the child. If\nyou just fork+exec or create a new loop in the child, you don't have to\ncall it at all (in fact, \\f(CW\\*(C`epoll\\*(C'\\fR is so badly broken that it makes a\ndifference, but libev will usually detect this case on its own and do a\ncostly reset of the backend).\n.Sp\nThe function itself is quite fast and it's usually not a problem to call\nit just in case after a fork.\n.Sp\nExample: Automate calling \\f(CW\\*(C`ev_loop_fork\\*(C'\\fR on the default loop when\nusing pthreads.\n.Sp\n.Vb 5\n\\&   static void\n\\&   post_fork_child (void)\n\\&   {\n\\&     ev_loop_fork (EV_DEFAULT);\n\\&   }\n\\&\n\\&   ...\n\\&   pthread_atfork (0, 0, post_fork_child);\n.Ve\n.IP \"int ev_is_default_loop (loop)\" 4\n.IX Item \"int ev_is_default_loop (loop)\"\nReturns true when the given loop is, in fact, the default loop, and false\notherwise.\n.IP \"unsigned int ev_iteration (loop)\" 4\n.IX Item \"unsigned int ev_iteration (loop)\"\nReturns the current iteration count for the event loop, which is identical\nto the number of times libev did poll for new events. It starts at \\f(CW0\\fR\nand happily wraps around with enough iterations.\n.Sp\nThis value can sometimes be useful as a generation counter of sorts (it\n\\&\\*(L\"ticks\\*(R\" the number of loop iterations), as it roughly corresponds with\n\\&\\f(CW\\*(C`ev_prepare\\*(C'\\fR and \\f(CW\\*(C`ev_check\\*(C'\\fR calls \\- and is incremented between the\nprepare and check phases.\n.IP \"unsigned int ev_depth (loop)\" 4\n.IX Item \"unsigned int ev_depth (loop)\"\nReturns the number of times \\f(CW\\*(C`ev_run\\*(C'\\fR was entered minus the number of\ntimes \\f(CW\\*(C`ev_run\\*(C'\\fR was exited normally, in other words, the recursion depth.\n.Sp\nOutside \\f(CW\\*(C`ev_run\\*(C'\\fR, this number is zero. In a callback, this number is\n\\&\\f(CW1\\fR, unless \\f(CW\\*(C`ev_run\\*(C'\\fR was invoked recursively (or from another thread),\nin which case it is higher.\n.Sp\nLeaving \\f(CW\\*(C`ev_run\\*(C'\\fR abnormally (setjmp/longjmp, cancelling the thread,\nthrowing an exception etc.), doesn't count as \\*(L\"exit\\*(R\" \\- consider this\nas a hint to avoid such ungentleman-like behaviour unless it's really\nconvenient, in which case it is fully supported.\n.IP \"unsigned int ev_backend (loop)\" 4\n.IX Item \"unsigned int ev_backend (loop)\"\nReturns one of the \\f(CW\\*(C`EVBACKEND_*\\*(C'\\fR flags indicating the event backend in\nuse.\n.IP \"ev_tstamp ev_now (loop)\" 4\n.IX Item \"ev_tstamp ev_now (loop)\"\nReturns the current \\*(L\"event loop time\\*(R\", which is the time the event loop\nreceived events and started processing them. This timestamp does not\nchange as long as callbacks are being processed, and this is also the base\ntime used for relative timers. You can treat it as the timestamp of the\nevent occurring (or more correctly, libev finding out about it).\n.IP \"ev_now_update (loop)\" 4\n.IX Item \"ev_now_update (loop)\"\nEstablishes the current time by querying the kernel, updating the time\nreturned by \\f(CW\\*(C`ev_now ()\\*(C'\\fR in the progress. This is a costly operation and\nis usually done automatically within \\f(CW\\*(C`ev_run ()\\*(C'\\fR.\n.Sp\nThis function is rarely useful, but when some event callback runs for a\nvery long time without entering the event loop, updating libev's idea of\nthe current time is a good idea.\n.Sp\nSee also \\*(L\"The special problem of time updates\\*(R\" in the \\f(CW\\*(C`ev_timer\\*(C'\\fR section.\n.IP \"ev_suspend (loop)\" 4\n.IX Item \"ev_suspend (loop)\"\n.PD 0\n.IP \"ev_resume (loop)\" 4\n.IX Item \"ev_resume (loop)\"\n.PD\nThese two functions suspend and resume an event loop, for use when the\nloop is not used for a while and timeouts should not be processed.\n.Sp\nA typical use case would be an interactive program such as a game:  When\nthe user presses \\f(CW\\*(C`^Z\\*(C'\\fR to suspend the game and resumes it an hour later it\nwould be best to handle timeouts as if no time had actually passed while\nthe program was suspended. This can be achieved by calling \\f(CW\\*(C`ev_suspend\\*(C'\\fR\nin your \\f(CW\\*(C`SIGTSTP\\*(C'\\fR handler, sending yourself a \\f(CW\\*(C`SIGSTOP\\*(C'\\fR and calling\n\\&\\f(CW\\*(C`ev_resume\\*(C'\\fR directly afterwards to resume timer processing.\n.Sp\nEffectively, all \\f(CW\\*(C`ev_timer\\*(C'\\fR watchers will be delayed by the time spend\nbetween \\f(CW\\*(C`ev_suspend\\*(C'\\fR and \\f(CW\\*(C`ev_resume\\*(C'\\fR, and all \\f(CW\\*(C`ev_periodic\\*(C'\\fR watchers\nwill be rescheduled (that is, they will lose any events that would have\noccurred while suspended).\n.Sp\nAfter calling \\f(CW\\*(C`ev_suspend\\*(C'\\fR you \\fBmust not\\fR call \\fIany\\fR function on the\ngiven loop other than \\f(CW\\*(C`ev_resume\\*(C'\\fR, and you \\fBmust not\\fR call \\f(CW\\*(C`ev_resume\\*(C'\\fR\nwithout a previous call to \\f(CW\\*(C`ev_suspend\\*(C'\\fR.\n.Sp\nCalling \\f(CW\\*(C`ev_suspend\\*(C'\\fR/\\f(CW\\*(C`ev_resume\\*(C'\\fR has the side effect of updating the\nevent loop time (see \\f(CW\\*(C`ev_now_update\\*(C'\\fR).\n.IP \"bool ev_run (loop, int flags)\" 4\n.IX Item \"bool ev_run (loop, int flags)\"\nFinally, this is it, the event handler. This function usually is called\nafter you have initialised all your watchers and you want to start\nhandling events. It will ask the operating system for any new events, call\nthe watcher callbacks, and then repeat the whole process indefinitely: This\nis why event loops are called \\fIloops\\fR.\n.Sp\nIf the flags argument is specified as \\f(CW0\\fR, it will keep handling events\nuntil either no event watchers are active anymore or \\f(CW\\*(C`ev_break\\*(C'\\fR was\ncalled.\n.Sp\nThe return value is false if there are no more active watchers (which\nusually means \\*(L\"all jobs done\\*(R\" or \\*(L\"deadlock\\*(R\"), and true in all other cases\n(which usually means \" you should call \\f(CW\\*(C`ev_run\\*(C'\\fR again\").\n.Sp\nPlease note that an explicit \\f(CW\\*(C`ev_break\\*(C'\\fR is usually better than\nrelying on all watchers to be stopped when deciding when a program has\nfinished (especially in interactive programs), but having a program\nthat automatically loops as long as it has to and no longer by virtue\nof relying on its watchers stopping correctly, that is truly a thing of\nbeauty.\n.Sp\nThis function is \\fImostly\\fR exception-safe \\- you can break out of a\n\\&\\f(CW\\*(C`ev_run\\*(C'\\fR call by calling \\f(CW\\*(C`longjmp\\*(C'\\fR in a callback, throwing a \\*(C+\nexception and so on. This does not decrement the \\f(CW\\*(C`ev_depth\\*(C'\\fR value, nor\nwill it clear any outstanding \\f(CW\\*(C`EVBREAK_ONE\\*(C'\\fR breaks.\n.Sp\nA flags value of \\f(CW\\*(C`EVRUN_NOWAIT\\*(C'\\fR will look for new events, will handle\nthose events and any already outstanding ones, but will not wait and\nblock your process in case there are no events and will return after one\niteration of the loop. This is sometimes useful to poll and handle new\nevents while doing lengthy calculations, to keep the program responsive.\n.Sp\nA flags value of \\f(CW\\*(C`EVRUN_ONCE\\*(C'\\fR will look for new events (waiting if\nnecessary) and will handle those and any already outstanding ones. It\nwill block your process until at least one new event arrives (which could\nbe an event internal to libev itself, so there is no guarantee that a\nuser-registered callback will be called), and will return after one\niteration of the loop.\n.Sp\nThis is useful if you are waiting for some external event in conjunction\nwith something not expressible using other libev watchers (i.e. \"roll your\nown \\f(CW\\*(C`ev_run\\*(C'\\fR\"). However, a pair of \\f(CW\\*(C`ev_prepare\\*(C'\\fR/\\f(CW\\*(C`ev_check\\*(C'\\fR watchers is\nusually a better approach for this kind of thing.\n.Sp\nHere are the gory details of what \\f(CW\\*(C`ev_run\\*(C'\\fR does (this is for your\nunderstanding, not a guarantee that things will work exactly like this in\nfuture versions):\n.Sp\n.Vb 10\n\\&   \\- Increment loop depth.\n\\&   \\- Reset the ev_break status.\n\\&   \\- Before the first iteration, call any pending watchers.\n\\&   LOOP:\n\\&   \\- If EVFLAG_FORKCHECK was used, check for a fork.\n\\&   \\- If a fork was detected (by any means), queue and call all fork watchers.\n\\&   \\- Queue and call all prepare watchers.\n\\&   \\- If ev_break was called, goto FINISH.\n\\&   \\- If we have been forked, detach and recreate the kernel state\n\\&     as to not disturb the other process.\n\\&   \\- Update the kernel state with all outstanding changes.\n\\&   \\- Update the \"event loop time\" (ev_now ()).\n\\&   \\- Calculate for how long to sleep or block, if at all\n\\&     (active idle watchers, EVRUN_NOWAIT or not having\n\\&     any active watchers at all will result in not sleeping).\n\\&   \\- Sleep if the I/O and timer collect interval say so.\n\\&   \\- Increment loop iteration counter.\n\\&   \\- Block the process, waiting for any events.\n\\&   \\- Queue all outstanding I/O (fd) events.\n\\&   \\- Update the \"event loop time\" (ev_now ()), and do time jump adjustments.\n\\&   \\- Queue all expired timers.\n\\&   \\- Queue all expired periodics.\n\\&   \\- Queue all idle watchers with priority higher than that of pending events.\n\\&   \\- Queue all check watchers.\n\\&   \\- Call all queued watchers in reverse order (i.e. check watchers first).\n\\&     Signals and child watchers are implemented as I/O watchers, and will\n\\&     be handled here by queueing them when their watcher gets executed.\n\\&   \\- If ev_break has been called, or EVRUN_ONCE or EVRUN_NOWAIT\n\\&     were used, or there are no active watchers, goto FINISH, otherwise\n\\&     continue with step LOOP.\n\\&   FINISH:\n\\&   \\- Reset the ev_break status iff it was EVBREAK_ONE.\n\\&   \\- Decrement the loop depth.\n\\&   \\- Return.\n.Ve\n.Sp\nExample: Queue some jobs and then loop until no events are outstanding\nanymore.\n.Sp\n.Vb 4\n\\&   ... queue jobs here, make sure they register event watchers as long\n\\&   ... as they still have work to do (even an idle watcher will do..)\n\\&   ev_run (my_loop, 0);\n\\&   ... jobs done or somebody called break. yeah!\n.Ve\n.IP \"ev_break (loop, how)\" 4\n.IX Item \"ev_break (loop, how)\"\nCan be used to make a call to \\f(CW\\*(C`ev_run\\*(C'\\fR return early (but only after it\nhas processed all outstanding events). The \\f(CW\\*(C`how\\*(C'\\fR argument must be either\n\\&\\f(CW\\*(C`EVBREAK_ONE\\*(C'\\fR, which will make the innermost \\f(CW\\*(C`ev_run\\*(C'\\fR call return, or\n\\&\\f(CW\\*(C`EVBREAK_ALL\\*(C'\\fR, which will make all nested \\f(CW\\*(C`ev_run\\*(C'\\fR calls return.\n.Sp\nThis \\*(L\"break state\\*(R\" will be cleared on the next call to \\f(CW\\*(C`ev_run\\*(C'\\fR.\n.Sp\nIt is safe to call \\f(CW\\*(C`ev_break\\*(C'\\fR from outside any \\f(CW\\*(C`ev_run\\*(C'\\fR calls, too, in\nwhich case it will have no effect.\n.IP \"ev_ref (loop)\" 4\n.IX Item \"ev_ref (loop)\"\n.PD 0\n.IP \"ev_unref (loop)\" 4\n.IX Item \"ev_unref (loop)\"\n.PD\nRef/unref can be used to add or remove a reference count on the event\nloop: Every watcher keeps one reference, and as long as the reference\ncount is nonzero, \\f(CW\\*(C`ev_run\\*(C'\\fR will not return on its own.\n.Sp\nThis is useful when you have a watcher that you never intend to\nunregister, but that nevertheless should not keep \\f(CW\\*(C`ev_run\\*(C'\\fR from\nreturning. In such a case, call \\f(CW\\*(C`ev_unref\\*(C'\\fR after starting, and \\f(CW\\*(C`ev_ref\\*(C'\\fR\nbefore stopping it.\n.Sp\nAs an example, libev itself uses this for its internal signal pipe: It\nis not visible to the libev user and should not keep \\f(CW\\*(C`ev_run\\*(C'\\fR from\nexiting if no event watchers registered by it are active. It is also an\nexcellent way to do this for generic recurring timers or from within\nthird-party libraries. Just remember to \\fIunref after start\\fR and \\fIref\nbefore stop\\fR (but only if the watcher wasn't active before, or was active\nbefore, respectively. Note also that libev might stop watchers itself\n(e.g. non-repeating timers) in which case you have to \\f(CW\\*(C`ev_ref\\*(C'\\fR\nin the callback).\n.Sp\nExample: Create a signal watcher, but keep it from keeping \\f(CW\\*(C`ev_run\\*(C'\\fR\nrunning when nothing else is active.\n.Sp\n.Vb 4\n\\&   ev_signal exitsig;\n\\&   ev_signal_init (&exitsig, sig_cb, SIGINT);\n\\&   ev_signal_start (loop, &exitsig);\n\\&   ev_unref (loop);\n.Ve\n.Sp\nExample: For some weird reason, unregister the above signal handler again.\n.Sp\n.Vb 2\n\\&   ev_ref (loop);\n\\&   ev_signal_stop (loop, &exitsig);\n.Ve\n.IP \"ev_set_io_collect_interval (loop, ev_tstamp interval)\" 4\n.IX Item \"ev_set_io_collect_interval (loop, ev_tstamp interval)\"\n.PD 0\n.IP \"ev_set_timeout_collect_interval (loop, ev_tstamp interval)\" 4\n.IX Item \"ev_set_timeout_collect_interval (loop, ev_tstamp interval)\"\n.PD\nThese advanced functions influence the time that libev will spend waiting\nfor events. Both time intervals are by default \\f(CW0\\fR, meaning that libev\nwill try to invoke timer/periodic callbacks and I/O callbacks with minimum\nlatency.\n.Sp\nSetting these to a higher value (the \\f(CW\\*(C`interval\\*(C'\\fR \\fImust\\fR be >= \\f(CW0\\fR)\nallows libev to delay invocation of I/O and timer/periodic callbacks\nto increase efficiency of loop iterations (or to increase power-saving\nopportunities).\n.Sp\nThe idea is that sometimes your program runs just fast enough to handle\none (or very few) event(s) per loop iteration. While this makes the\nprogram responsive, it also wastes a lot of \\s-1CPU\\s0 time to poll for new\nevents, especially with backends like \\f(CW\\*(C`select ()\\*(C'\\fR which have a high\noverhead for the actual polling but can deliver many events at once.\n.Sp\nBy setting a higher \\fIio collect interval\\fR you allow libev to spend more\ntime collecting I/O events, so you can handle more events per iteration,\nat the cost of increasing latency. Timeouts (both \\f(CW\\*(C`ev_periodic\\*(C'\\fR and\n\\&\\f(CW\\*(C`ev_timer\\*(C'\\fR) will not be affected. Setting this to a non-null value will\nintroduce an additional \\f(CW\\*(C`ev_sleep ()\\*(C'\\fR call into most loop iterations. The\nsleep time ensures that libev will not poll for I/O events more often then\nonce per this interval, on average (as long as the host time resolution is\ngood enough).\n.Sp\nLikewise, by setting a higher \\fItimeout collect interval\\fR you allow libev\nto spend more time collecting timeouts, at the expense of increased\nlatency/jitter/inexactness (the watcher callback will be called\nlater). \\f(CW\\*(C`ev_io\\*(C'\\fR watchers will not be affected. Setting this to a non-null\nvalue will not introduce any overhead in libev.\n.Sp\nMany (busy) programs can usually benefit by setting the I/O collect\ninterval to a value near \\f(CW0.1\\fR or so, which is often enough for\ninteractive servers (of course not for games), likewise for timeouts. It\nusually doesn't make much sense to set it to a lower value than \\f(CW0.01\\fR,\nas this approaches the timing granularity of most systems. Note that if\nyou do transactions with the outside world and you can't increase the\nparallelity, then this setting will limit your transaction rate (if you\nneed to poll once per transaction and the I/O collect interval is 0.01,\nthen you can't do more than 100 transactions per second).\n.Sp\nSetting the \\fItimeout collect interval\\fR can improve the opportunity for\nsaving power, as the program will \\*(L\"bundle\\*(R\" timer callback invocations that\nare \\*(L\"near\\*(R\" in time together, by delaying some, thus reducing the number of\ntimes the process sleeps and wakes up again. Another useful technique to\nreduce iterations/wake\\-ups is to use \\f(CW\\*(C`ev_periodic\\*(C'\\fR watchers and make sure\nthey fire on, say, one-second boundaries only.\n.Sp\nExample: we only need 0.1s timeout granularity, and we wish not to poll\nmore often than 100 times per second:\n.Sp\n.Vb 2\n\\&   ev_set_timeout_collect_interval (EV_DEFAULT_UC_ 0.1);\n\\&   ev_set_io_collect_interval (EV_DEFAULT_UC_ 0.01);\n.Ve\n.IP \"ev_invoke_pending (loop)\" 4\n.IX Item \"ev_invoke_pending (loop)\"\nThis call will simply invoke all pending watchers while resetting their\npending state. Normally, \\f(CW\\*(C`ev_run\\*(C'\\fR does this automatically when required,\nbut when overriding the invoke callback this call comes handy. This\nfunction can be invoked from a watcher \\- this can be useful for example\nwhen you want to do some lengthy calculation and want to pass further\nevent handling to another thread (you still have to make sure only one\nthread executes within \\f(CW\\*(C`ev_invoke_pending\\*(C'\\fR or \\f(CW\\*(C`ev_run\\*(C'\\fR of course).\n.IP \"int ev_pending_count (loop)\" 4\n.IX Item \"int ev_pending_count (loop)\"\nReturns the number of pending watchers \\- zero indicates that no watchers\nare pending.\n.IP \"ev_set_invoke_pending_cb (loop, void (*invoke_pending_cb)(\\s-1EV_P\\s0))\" 4\n.IX Item \"ev_set_invoke_pending_cb (loop, void (*invoke_pending_cb)(EV_P))\"\nThis overrides the invoke pending functionality of the loop: Instead of\ninvoking all pending watchers when there are any, \\f(CW\\*(C`ev_run\\*(C'\\fR will call\nthis callback instead. This is useful, for example, when you want to\ninvoke the actual watchers inside another context (another thread etc.).\n.Sp\nIf you want to reset the callback, use \\f(CW\\*(C`ev_invoke_pending\\*(C'\\fR as new\ncallback.\n.IP \"ev_set_loop_release_cb (loop, void (*release)(\\s-1EV_P\\s0) throw (), void (*acquire)(\\s-1EV_P\\s0) throw ())\" 4\n.IX Item \"ev_set_loop_release_cb (loop, void (*release)(EV_P) throw (), void (*acquire)(EV_P) throw ())\"\nSometimes you want to share the same loop between multiple threads. This\ncan be done relatively simply by putting mutex_lock/unlock calls around\neach call to a libev function.\n.Sp\nHowever, \\f(CW\\*(C`ev_run\\*(C'\\fR can run an indefinite time, so it is not feasible\nto wait for it to return. One way around this is to wake up the event\nloop via \\f(CW\\*(C`ev_break\\*(C'\\fR and \\f(CW\\*(C`ev_async_send\\*(C'\\fR, another way is to set these\n\\&\\fIrelease\\fR and \\fIacquire\\fR callbacks on the loop.\n.Sp\nWhen set, then \\f(CW\\*(C`release\\*(C'\\fR will be called just before the thread is\nsuspended waiting for new events, and \\f(CW\\*(C`acquire\\*(C'\\fR is called just\nafterwards.\n.Sp\nIdeally, \\f(CW\\*(C`release\\*(C'\\fR will just call your mutex_unlock function, and\n\\&\\f(CW\\*(C`acquire\\*(C'\\fR will just call the mutex_lock function again.\n.Sp\nWhile event loop modifications are allowed between invocations of\n\\&\\f(CW\\*(C`release\\*(C'\\fR and \\f(CW\\*(C`acquire\\*(C'\\fR (that's their only purpose after all), no\nmodifications done will affect the event loop, i.e. adding watchers will\nhave no effect on the set of file descriptors being watched, or the time\nwaited. Use an \\f(CW\\*(C`ev_async\\*(C'\\fR watcher to wake up \\f(CW\\*(C`ev_run\\*(C'\\fR when you want it\nto take note of any changes you made.\n.Sp\nIn theory, threads executing \\f(CW\\*(C`ev_run\\*(C'\\fR will be async-cancel safe between\ninvocations of \\f(CW\\*(C`release\\*(C'\\fR and \\f(CW\\*(C`acquire\\*(C'\\fR.\n.Sp\nSee also the locking example in the \\f(CW\\*(C`THREADS\\*(C'\\fR section later in this\ndocument.\n.IP \"ev_set_userdata (loop, void *data)\" 4\n.IX Item \"ev_set_userdata (loop, void *data)\"\n.PD 0\n.IP \"void *ev_userdata (loop)\" 4\n.IX Item \"void *ev_userdata (loop)\"\n.PD\nSet and retrieve a single \\f(CW\\*(C`void *\\*(C'\\fR associated with a loop. When\n\\&\\f(CW\\*(C`ev_set_userdata\\*(C'\\fR has never been called, then \\f(CW\\*(C`ev_userdata\\*(C'\\fR returns\n\\&\\f(CW0\\fR.\n.Sp\nThese two functions can be used to associate arbitrary data with a loop,\nand are intended solely for the \\f(CW\\*(C`invoke_pending_cb\\*(C'\\fR, \\f(CW\\*(C`release\\*(C'\\fR and\n\\&\\f(CW\\*(C`acquire\\*(C'\\fR callbacks described above, but of course can be (ab\\-)used for\nany other purpose as well.\n.IP \"ev_verify (loop)\" 4\n.IX Item \"ev_verify (loop)\"\nThis function only does something when \\f(CW\\*(C`EV_VERIFY\\*(C'\\fR support has been\ncompiled in, which is the default for non-minimal builds. It tries to go\nthrough all internal structures and checks them for validity. If anything\nis found to be inconsistent, it will print an error message to standard\nerror and call \\f(CW\\*(C`abort ()\\*(C'\\fR.\n.Sp\nThis can be used to catch bugs inside libev itself: under normal\ncircumstances, this function will never abort as of course libev keeps its\ndata structures consistent.\n.SH \"ANATOMY OF A WATCHER\"\n.IX Header \"ANATOMY OF A WATCHER\"\nIn the following description, uppercase \\f(CW\\*(C`TYPE\\*(C'\\fR in names stands for the\nwatcher type, e.g. \\f(CW\\*(C`ev_TYPE_start\\*(C'\\fR can mean \\f(CW\\*(C`ev_timer_start\\*(C'\\fR for timer\nwatchers and \\f(CW\\*(C`ev_io_start\\*(C'\\fR for I/O watchers.\n.PP\nA watcher is an opaque structure that you allocate and register to record\nyour interest in some event. To make a concrete example, imagine you want\nto wait for \\s-1STDIN\\s0 to become readable, you would create an \\f(CW\\*(C`ev_io\\*(C'\\fR watcher\nfor that:\n.PP\n.Vb 5\n\\&   static void my_cb (struct ev_loop *loop, ev_io *w, int revents)\n\\&   {\n\\&     ev_io_stop (w);\n\\&     ev_break (loop, EVBREAK_ALL);\n\\&   }\n\\&\n\\&   struct ev_loop *loop = ev_default_loop (0);\n\\&\n\\&   ev_io stdin_watcher;\n\\&\n\\&   ev_init (&stdin_watcher, my_cb);\n\\&   ev_io_set (&stdin_watcher, STDIN_FILENO, EV_READ);\n\\&   ev_io_start (loop, &stdin_watcher);\n\\&\n\\&   ev_run (loop, 0);\n.Ve\n.PP\nAs you can see, you are responsible for allocating the memory for your\nwatcher structures (and it is \\fIusually\\fR a bad idea to do this on the\nstack).\n.PP\nEach watcher has an associated watcher structure (called \\f(CW\\*(C`struct ev_TYPE\\*(C'\\fR\nor simply \\f(CW\\*(C`ev_TYPE\\*(C'\\fR, as typedefs are provided for all watcher structs).\n.PP\nEach watcher structure must be initialised by a call to \\f(CW\\*(C`ev_init (watcher\n*, callback)\\*(C'\\fR, which expects a callback to be provided. This callback is\ninvoked each time the event occurs (or, in the case of I/O watchers, each\ntime the event loop detects that the file descriptor given is readable\nand/or writable).\n.PP\nEach watcher type further has its own \\f(CW\\*(C`ev_TYPE_set (watcher *, ...)\\*(C'\\fR\nmacro to configure it, with arguments specific to the watcher type. There\nis also a macro to combine initialisation and setting in one call: \\f(CW\\*(C`ev_TYPE_init (watcher *, callback, ...)\\*(C'\\fR.\n.PP\nTo make the watcher actually watch out for events, you have to start it\nwith a watcher-specific start function (\\f(CW\\*(C`ev_TYPE_start (loop, watcher\n*)\\*(C'\\fR), and you can stop watching for events at any time by calling the\ncorresponding stop function (\\f(CW\\*(C`ev_TYPE_stop (loop, watcher *)\\*(C'\\fR.\n.PP\nAs long as your watcher is active (has been started but not stopped) you\nmust not touch the values stored in it. Most specifically you must never\nreinitialise it or call its \\f(CW\\*(C`ev_TYPE_set\\*(C'\\fR macro.\n.PP\nEach and every callback receives the event loop pointer as first, the\nregistered watcher structure as second, and a bitset of received events as\nthird argument.\n.PP\nThe received events usually include a single bit per event type received\n(you can receive multiple events at the same time). The possible bit masks\nare:\n.ie n .IP \"\"\"EV_READ\"\"\" 4\n.el .IP \"\\f(CWEV_READ\\fR\" 4\n.IX Item \"EV_READ\"\n.PD 0\n.ie n .IP \"\"\"EV_WRITE\"\"\" 4\n.el .IP \"\\f(CWEV_WRITE\\fR\" 4\n.IX Item \"EV_WRITE\"\n.PD\nThe file descriptor in the \\f(CW\\*(C`ev_io\\*(C'\\fR watcher has become readable and/or\nwritable.\n.ie n .IP \"\"\"EV_TIMER\"\"\" 4\n.el .IP \"\\f(CWEV_TIMER\\fR\" 4\n.IX Item \"EV_TIMER\"\nThe \\f(CW\\*(C`ev_timer\\*(C'\\fR watcher has timed out.\n.ie n .IP \"\"\"EV_PERIODIC\"\"\" 4\n.el .IP \"\\f(CWEV_PERIODIC\\fR\" 4\n.IX Item \"EV_PERIODIC\"\nThe \\f(CW\\*(C`ev_periodic\\*(C'\\fR watcher has timed out.\n.ie n .IP \"\"\"EV_SIGNAL\"\"\" 4\n.el .IP \"\\f(CWEV_SIGNAL\\fR\" 4\n.IX Item \"EV_SIGNAL\"\nThe signal specified in the \\f(CW\\*(C`ev_signal\\*(C'\\fR watcher has been received by a thread.\n.ie n .IP \"\"\"EV_CHILD\"\"\" 4\n.el .IP \"\\f(CWEV_CHILD\\fR\" 4\n.IX Item \"EV_CHILD\"\nThe pid specified in the \\f(CW\\*(C`ev_child\\*(C'\\fR watcher has received a status change.\n.ie n .IP \"\"\"EV_STAT\"\"\" 4\n.el .IP \"\\f(CWEV_STAT\\fR\" 4\n.IX Item \"EV_STAT\"\nThe path specified in the \\f(CW\\*(C`ev_stat\\*(C'\\fR watcher changed its attributes somehow.\n.ie n .IP \"\"\"EV_IDLE\"\"\" 4\n.el .IP \"\\f(CWEV_IDLE\\fR\" 4\n.IX Item \"EV_IDLE\"\nThe \\f(CW\\*(C`ev_idle\\*(C'\\fR watcher has determined that you have nothing better to do.\n.ie n .IP \"\"\"EV_PREPARE\"\"\" 4\n.el .IP \"\\f(CWEV_PREPARE\\fR\" 4\n.IX Item \"EV_PREPARE\"\n.PD 0\n.ie n .IP \"\"\"EV_CHECK\"\"\" 4\n.el .IP \"\\f(CWEV_CHECK\\fR\" 4\n.IX Item \"EV_CHECK\"\n.PD\nAll \\f(CW\\*(C`ev_prepare\\*(C'\\fR watchers are invoked just \\fIbefore\\fR \\f(CW\\*(C`ev_run\\*(C'\\fR starts to\ngather new events, and all \\f(CW\\*(C`ev_check\\*(C'\\fR watchers are queued (not invoked)\njust after \\f(CW\\*(C`ev_run\\*(C'\\fR has gathered them, but before it queues any callbacks\nfor any received events. That means \\f(CW\\*(C`ev_prepare\\*(C'\\fR watchers are the last\nwatchers invoked before the event loop sleeps or polls for new events, and\n\\&\\f(CW\\*(C`ev_check\\*(C'\\fR watchers will be invoked before any other watchers of the same\nor lower priority within an event loop iteration.\n.Sp\nCallbacks of both watcher types can start and stop as many watchers as\nthey want, and all of them will be taken into account (for example, a\n\\&\\f(CW\\*(C`ev_prepare\\*(C'\\fR watcher might start an idle watcher to keep \\f(CW\\*(C`ev_run\\*(C'\\fR from\nblocking).\n.ie n .IP \"\"\"EV_EMBED\"\"\" 4\n.el .IP \"\\f(CWEV_EMBED\\fR\" 4\n.IX Item \"EV_EMBED\"\nThe embedded event loop specified in the \\f(CW\\*(C`ev_embed\\*(C'\\fR watcher needs attention.\n.ie n .IP \"\"\"EV_FORK\"\"\" 4\n.el .IP \"\\f(CWEV_FORK\\fR\" 4\n.IX Item \"EV_FORK\"\nThe event loop has been resumed in the child process after fork (see\n\\&\\f(CW\\*(C`ev_fork\\*(C'\\fR).\n.ie n .IP \"\"\"EV_CLEANUP\"\"\" 4\n.el .IP \"\\f(CWEV_CLEANUP\\fR\" 4\n.IX Item \"EV_CLEANUP\"\nThe event loop is about to be destroyed (see \\f(CW\\*(C`ev_cleanup\\*(C'\\fR).\n.ie n .IP \"\"\"EV_ASYNC\"\"\" 4\n.el .IP \"\\f(CWEV_ASYNC\\fR\" 4\n.IX Item \"EV_ASYNC\"\nThe given async watcher has been asynchronously notified (see \\f(CW\\*(C`ev_async\\*(C'\\fR).\n.ie n .IP \"\"\"EV_CUSTOM\"\"\" 4\n.el .IP \"\\f(CWEV_CUSTOM\\fR\" 4\n.IX Item \"EV_CUSTOM\"\nNot ever sent (or otherwise used) by libev itself, but can be freely used\nby libev users to signal watchers (e.g. via \\f(CW\\*(C`ev_feed_event\\*(C'\\fR).\n.ie n .IP \"\"\"EV_ERROR\"\"\" 4\n.el .IP \"\\f(CWEV_ERROR\\fR\" 4\n.IX Item \"EV_ERROR\"\nAn unspecified error has occurred, the watcher has been stopped. This might\nhappen because the watcher could not be properly started because libev\nran out of memory, a file descriptor was found to be closed or any other\nproblem. Libev considers these application bugs.\n.Sp\nYou best act on it by reporting the problem and somehow coping with the\nwatcher being stopped. Note that well-written programs should not receive\nan error ever, so when your watcher receives it, this usually indicates a\nbug in your program.\n.Sp\nLibev will usually signal a few \\*(L\"dummy\\*(R\" events together with an error, for\nexample it might indicate that a fd is readable or writable, and if your\ncallbacks is well-written it can just attempt the operation and cope with\nthe error from \\fIread()\\fR or \\fIwrite()\\fR. This will not work in multi-threaded\nprograms, though, as the fd could already be closed and reused for another\nthing, so beware.\n.SS \"\\s-1GENERIC WATCHER FUNCTIONS\\s0\"\n.IX Subsection \"GENERIC WATCHER FUNCTIONS\"\n.ie n .IP \"\"\"ev_init\"\" (ev_TYPE *watcher, callback)\" 4\n.el .IP \"\\f(CWev_init\\fR (ev_TYPE *watcher, callback)\" 4\n.IX Item \"ev_init (ev_TYPE *watcher, callback)\"\nThis macro initialises the generic portion of a watcher. The contents\nof the watcher object can be arbitrary (so \\f(CW\\*(C`malloc\\*(C'\\fR will do). Only\nthe generic parts of the watcher are initialised, you \\fIneed\\fR to call\nthe type-specific \\f(CW\\*(C`ev_TYPE_set\\*(C'\\fR macro afterwards to initialise the\ntype-specific parts. For each type there is also a \\f(CW\\*(C`ev_TYPE_init\\*(C'\\fR macro\nwhich rolls both calls into one.\n.Sp\nYou can reinitialise a watcher at any time as long as it has been stopped\n(or never started) and there are no pending events outstanding.\n.Sp\nThe callback is always of type \\f(CW\\*(C`void (*)(struct ev_loop *loop, ev_TYPE *watcher,\nint revents)\\*(C'\\fR.\n.Sp\nExample: Initialise an \\f(CW\\*(C`ev_io\\*(C'\\fR watcher in two steps.\n.Sp\n.Vb 3\n\\&   ev_io w;\n\\&   ev_init (&w, my_cb);\n\\&   ev_io_set (&w, STDIN_FILENO, EV_READ);\n.Ve\n.ie n .IP \"\"\"ev_TYPE_set\"\" (ev_TYPE *watcher, [args])\" 4\n.el .IP \"\\f(CWev_TYPE_set\\fR (ev_TYPE *watcher, [args])\" 4\n.IX Item \"ev_TYPE_set (ev_TYPE *watcher, [args])\"\nThis macro initialises the type-specific parts of a watcher. You need to\ncall \\f(CW\\*(C`ev_init\\*(C'\\fR at least once before you call this macro, but you can\ncall \\f(CW\\*(C`ev_TYPE_set\\*(C'\\fR any number of times. You must not, however, call this\nmacro on a watcher that is active (it can be pending, however, which is a\ndifference to the \\f(CW\\*(C`ev_init\\*(C'\\fR macro).\n.Sp\nAlthough some watcher types do not have type-specific arguments\n(e.g. \\f(CW\\*(C`ev_prepare\\*(C'\\fR) you still need to call its \\f(CW\\*(C`set\\*(C'\\fR macro.\n.Sp\nSee \\f(CW\\*(C`ev_init\\*(C'\\fR, above, for an example.\n.ie n .IP \"\"\"ev_TYPE_init\"\" (ev_TYPE *watcher, callback, [args])\" 4\n.el .IP \"\\f(CWev_TYPE_init\\fR (ev_TYPE *watcher, callback, [args])\" 4\n.IX Item \"ev_TYPE_init (ev_TYPE *watcher, callback, [args])\"\nThis convenience macro rolls both \\f(CW\\*(C`ev_init\\*(C'\\fR and \\f(CW\\*(C`ev_TYPE_set\\*(C'\\fR macro\ncalls into a single call. This is the most convenient method to initialise\na watcher. The same limitations apply, of course.\n.Sp\nExample: Initialise and set an \\f(CW\\*(C`ev_io\\*(C'\\fR watcher in one step.\n.Sp\n.Vb 1\n\\&   ev_io_init (&w, my_cb, STDIN_FILENO, EV_READ);\n.Ve\n.ie n .IP \"\"\"ev_TYPE_start\"\" (loop, ev_TYPE *watcher)\" 4\n.el .IP \"\\f(CWev_TYPE_start\\fR (loop, ev_TYPE *watcher)\" 4\n.IX Item \"ev_TYPE_start (loop, ev_TYPE *watcher)\"\nStarts (activates) the given watcher. Only active watchers will receive\nevents. If the watcher is already active nothing will happen.\n.Sp\nExample: Start the \\f(CW\\*(C`ev_io\\*(C'\\fR watcher that is being abused as example in this\nwhole section.\n.Sp\n.Vb 1\n\\&   ev_io_start (EV_DEFAULT_UC, &w);\n.Ve\n.ie n .IP \"\"\"ev_TYPE_stop\"\" (loop, ev_TYPE *watcher)\" 4\n.el .IP \"\\f(CWev_TYPE_stop\\fR (loop, ev_TYPE *watcher)\" 4\n.IX Item \"ev_TYPE_stop (loop, ev_TYPE *watcher)\"\nStops the given watcher if active, and clears the pending status (whether\nthe watcher was active or not).\n.Sp\nIt is possible that stopped watchers are pending \\- for example,\nnon-repeating timers are being stopped when they become pending \\- but\ncalling \\f(CW\\*(C`ev_TYPE_stop\\*(C'\\fR ensures that the watcher is neither active nor\npending. If you want to free or reuse the memory used by the watcher it is\ntherefore a good idea to always call its \\f(CW\\*(C`ev_TYPE_stop\\*(C'\\fR function.\n.IP \"bool ev_is_active (ev_TYPE *watcher)\" 4\n.IX Item \"bool ev_is_active (ev_TYPE *watcher)\"\nReturns a true value iff the watcher is active (i.e. it has been started\nand not yet been stopped). As long as a watcher is active you must not modify\nit.\n.IP \"bool ev_is_pending (ev_TYPE *watcher)\" 4\n.IX Item \"bool ev_is_pending (ev_TYPE *watcher)\"\nReturns a true value iff the watcher is pending, (i.e. it has outstanding\nevents but its callback has not yet been invoked). As long as a watcher\nis pending (but not active) you must not call an init function on it (but\n\\&\\f(CW\\*(C`ev_TYPE_set\\*(C'\\fR is safe), you must not change its priority, and you must\nmake sure the watcher is available to libev (e.g. you cannot \\f(CW\\*(C`free ()\\*(C'\\fR\nit).\n.IP \"callback ev_cb (ev_TYPE *watcher)\" 4\n.IX Item \"callback ev_cb (ev_TYPE *watcher)\"\nReturns the callback currently set on the watcher.\n.IP \"ev_set_cb (ev_TYPE *watcher, callback)\" 4\n.IX Item \"ev_set_cb (ev_TYPE *watcher, callback)\"\nChange the callback. You can change the callback at virtually any time\n(modulo threads).\n.IP \"ev_set_priority (ev_TYPE *watcher, int priority)\" 4\n.IX Item \"ev_set_priority (ev_TYPE *watcher, int priority)\"\n.PD 0\n.IP \"int ev_priority (ev_TYPE *watcher)\" 4\n.IX Item \"int ev_priority (ev_TYPE *watcher)\"\n.PD\nSet and query the priority of the watcher. The priority is a small\ninteger between \\f(CW\\*(C`EV_MAXPRI\\*(C'\\fR (default: \\f(CW2\\fR) and \\f(CW\\*(C`EV_MINPRI\\*(C'\\fR\n(default: \\f(CW\\*(C`\\-2\\*(C'\\fR). Pending watchers with higher priority will be invoked\nbefore watchers with lower priority, but priority will not keep watchers\nfrom being executed (except for \\f(CW\\*(C`ev_idle\\*(C'\\fR watchers).\n.Sp\nIf you need to suppress invocation when higher priority events are pending\nyou need to look at \\f(CW\\*(C`ev_idle\\*(C'\\fR watchers, which provide this functionality.\n.Sp\nYou \\fImust not\\fR change the priority of a watcher as long as it is active or\npending.\n.Sp\nSetting a priority outside the range of \\f(CW\\*(C`EV_MINPRI\\*(C'\\fR to \\f(CW\\*(C`EV_MAXPRI\\*(C'\\fR is\nfine, as long as you do not mind that the priority value you query might\nor might not have been clamped to the valid range.\n.Sp\nThe default priority used by watchers when no priority has been set is\nalways \\f(CW0\\fR, which is supposed to not be too high and not be too low :).\n.Sp\nSee \\*(L\"\\s-1WATCHER PRIORITY MODELS\\*(R\"\\s0, below, for a more thorough treatment of\npriorities.\n.IP \"ev_invoke (loop, ev_TYPE *watcher, int revents)\" 4\n.IX Item \"ev_invoke (loop, ev_TYPE *watcher, int revents)\"\nInvoke the \\f(CW\\*(C`watcher\\*(C'\\fR with the given \\f(CW\\*(C`loop\\*(C'\\fR and \\f(CW\\*(C`revents\\*(C'\\fR. Neither\n\\&\\f(CW\\*(C`loop\\*(C'\\fR nor \\f(CW\\*(C`revents\\*(C'\\fR need to be valid as long as the watcher callback\ncan deal with that fact, as both are simply passed through to the\ncallback.\n.IP \"int ev_clear_pending (loop, ev_TYPE *watcher)\" 4\n.IX Item \"int ev_clear_pending (loop, ev_TYPE *watcher)\"\nIf the watcher is pending, this function clears its pending status and\nreturns its \\f(CW\\*(C`revents\\*(C'\\fR bitset (as if its callback was invoked). If the\nwatcher isn't pending it does nothing and returns \\f(CW0\\fR.\n.Sp\nSometimes it can be useful to \\*(L\"poll\\*(R\" a watcher instead of waiting for its\ncallback to be invoked, which can be accomplished with this function.\n.IP \"ev_feed_event (loop, ev_TYPE *watcher, int revents)\" 4\n.IX Item \"ev_feed_event (loop, ev_TYPE *watcher, int revents)\"\nFeeds the given event set into the event loop, as if the specified event\nhad happened for the specified watcher (which must be a pointer to an\ninitialised but not necessarily started event watcher). Obviously you must\nnot free the watcher as long as it has pending events.\n.Sp\nStopping the watcher, letting libev invoke it, or calling\n\\&\\f(CW\\*(C`ev_clear_pending\\*(C'\\fR will clear the pending event, even if the watcher was\nnot started in the first place.\n.Sp\nSee also \\f(CW\\*(C`ev_feed_fd_event\\*(C'\\fR and \\f(CW\\*(C`ev_feed_signal_event\\*(C'\\fR for related\nfunctions that do not need a watcher.\n.PP\nSee also the \\*(L\"\\s-1ASSOCIATING CUSTOM DATA WITH A WATCHER\\*(R\"\\s0 and \\*(L\"\\s-1BUILDING YOUR\nOWN COMPOSITE WATCHERS\\*(R\"\\s0 idioms.\n.SS \"\\s-1WATCHER STATES\\s0\"\n.IX Subsection \"WATCHER STATES\"\nThere are various watcher states mentioned throughout this manual \\-\nactive, pending and so on. In this section these states and the rules to\ntransition between them will be described in more detail \\- and while these\nrules might look complicated, they usually do \\*(L\"the right thing\\*(R\".\n.IP \"initialised\" 4\n.IX Item \"initialised\"\nBefore a watcher can be registered with the event loop it has to be\ninitialised. This can be done with a call to \\f(CW\\*(C`ev_TYPE_init\\*(C'\\fR, or calls to\n\\&\\f(CW\\*(C`ev_init\\*(C'\\fR followed by the watcher-specific \\f(CW\\*(C`ev_TYPE_set\\*(C'\\fR function.\n.Sp\nIn this state it is simply some block of memory that is suitable for\nuse in an event loop. It can be moved around, freed, reused etc. at\nwill \\- as long as you either keep the memory contents intact, or call\n\\&\\f(CW\\*(C`ev_TYPE_init\\*(C'\\fR again.\n.IP \"started/running/active\" 4\n.IX Item \"started/running/active\"\nOnce a watcher has been started with a call to \\f(CW\\*(C`ev_TYPE_start\\*(C'\\fR it becomes\nproperty of the event loop, and is actively waiting for events. While in\nthis state it cannot be accessed (except in a few documented ways), moved,\nfreed or anything else \\- the only legal thing is to keep a pointer to it,\nand call libev functions on it that are documented to work on active watchers.\n.IP \"pending\" 4\n.IX Item \"pending\"\nIf a watcher is active and libev determines that an event it is interested\nin has occurred (such as a timer expiring), it will become pending. It will\nstay in this pending state until either it is stopped or its callback is\nabout to be invoked, so it is not normally pending inside the watcher\ncallback.\n.Sp\nThe watcher might or might not be active while it is pending (for example,\nan expired non-repeating timer can be pending but no longer active). If it\nis stopped, it can be freely accessed (e.g. by calling \\f(CW\\*(C`ev_TYPE_set\\*(C'\\fR),\nbut it is still property of the event loop at this time, so cannot be\nmoved, freed or reused. And if it is active the rules described in the\nprevious item still apply.\n.Sp\nIt is also possible to feed an event on a watcher that is not active (e.g.\nvia \\f(CW\\*(C`ev_feed_event\\*(C'\\fR), in which case it becomes pending without being\nactive.\n.IP \"stopped\" 4\n.IX Item \"stopped\"\nA watcher can be stopped implicitly by libev (in which case it might still\nbe pending), or explicitly by calling its \\f(CW\\*(C`ev_TYPE_stop\\*(C'\\fR function. The\nlatter will clear any pending state the watcher might be in, regardless\nof whether it was active or not, so stopping a watcher explicitly before\nfreeing it is often a good idea.\n.Sp\nWhile stopped (and not pending) the watcher is essentially in the\ninitialised state, that is, it can be reused, moved, modified in any way\nyou wish (but when you trash the memory block, you need to \\f(CW\\*(C`ev_TYPE_init\\*(C'\\fR\nit again).\n.SS \"\\s-1WATCHER PRIORITY MODELS\\s0\"\n.IX Subsection \"WATCHER PRIORITY MODELS\"\nMany event loops support \\fIwatcher priorities\\fR, which are usually small\nintegers that influence the ordering of event callback invocation\nbetween watchers in some way, all else being equal.\n.PP\nIn libev, Watcher priorities can be set using \\f(CW\\*(C`ev_set_priority\\*(C'\\fR. See its\ndescription for the more technical details such as the actual priority\nrange.\n.PP\nThere are two common ways how these these priorities are being interpreted\nby event loops:\n.PP\nIn the more common lock-out model, higher priorities \\*(L\"lock out\\*(R\" invocation\nof lower priority watchers, which means as long as higher priority\nwatchers receive events, lower priority watchers are not being invoked.\n.PP\nThe less common only-for-ordering model uses priorities solely to order\ncallback invocation within a single event loop iteration: Higher priority\nwatchers are invoked before lower priority ones, but they all get invoked\nbefore polling for new events.\n.PP\nLibev uses the second (only-for-ordering) model for all its watchers\nexcept for idle watchers (which use the lock-out model).\n.PP\nThe rationale behind this is that implementing the lock-out model for\nwatchers is not well supported by most kernel interfaces, and most event\nlibraries will just poll for the same events again and again as long as\ntheir callbacks have not been executed, which is very inefficient in the\ncommon case of one high-priority watcher locking out a mass of lower\npriority ones.\n.PP\nStatic (ordering) priorities are most useful when you have two or more\nwatchers handling the same resource: a typical usage example is having an\n\\&\\f(CW\\*(C`ev_io\\*(C'\\fR watcher to receive data, and an associated \\f(CW\\*(C`ev_timer\\*(C'\\fR to handle\ntimeouts. Under load, data might be received while the program handles\nother jobs, but since timers normally get invoked first, the timeout\nhandler will be executed before checking for data. In that case, giving\nthe timer a lower priority than the I/O watcher ensures that I/O will be\nhandled first even under adverse conditions (which is usually, but not\nalways, what you want).\n.PP\nSince idle watchers use the \\*(L\"lock-out\\*(R\" model, meaning that idle watchers\nwill only be executed when no same or higher priority watchers have\nreceived events, they can be used to implement the \\*(L\"lock-out\\*(R\" model when\nrequired.\n.PP\nFor example, to emulate how many other event libraries handle priorities,\nyou can associate an \\f(CW\\*(C`ev_idle\\*(C'\\fR watcher to each such watcher, and in\nthe normal watcher callback, you just start the idle watcher. The real\nprocessing is done in the idle watcher callback. This causes libev to\ncontinuously poll and process kernel event data for the watcher, but when\nthe lock-out case is known to be rare (which in turn is rare :), this is\nworkable.\n.PP\nUsually, however, the lock-out model implemented that way will perform\nmiserably under the type of load it was designed to handle. In that case,\nit might be preferable to stop the real watcher before starting the\nidle watcher, so the kernel will not have to process the event in case\nthe actual processing will be delayed for considerable time.\n.PP\nHere is an example of an I/O watcher that should run at a strictly lower\npriority than the default, and which should only process data when no\nother events are pending:\n.PP\n.Vb 2\n\\&   ev_idle idle; // actual processing watcher\n\\&   ev_io io;     // actual event watcher\n\\&\n\\&   static void\n\\&   io_cb (EV_P_ ev_io *w, int revents)\n\\&   {\n\\&     // stop the I/O watcher, we received the event, but\n\\&     // are not yet ready to handle it.\n\\&     ev_io_stop (EV_A_ w);\n\\&\n\\&     // start the idle watcher to handle the actual event.\n\\&     // it will not be executed as long as other watchers\n\\&     // with the default priority are receiving events.\n\\&     ev_idle_start (EV_A_ &idle);\n\\&   }\n\\&\n\\&   static void\n\\&   idle_cb (EV_P_ ev_idle *w, int revents)\n\\&   {\n\\&     // actual processing\n\\&     read (STDIN_FILENO, ...);\n\\&\n\\&     // have to start the I/O watcher again, as\n\\&     // we have handled the event\n\\&     ev_io_start (EV_P_ &io);\n\\&   }\n\\&\n\\&   // initialisation\n\\&   ev_idle_init (&idle, idle_cb);\n\\&   ev_io_init (&io, io_cb, STDIN_FILENO, EV_READ);\n\\&   ev_io_start (EV_DEFAULT_ &io);\n.Ve\n.PP\nIn the \\*(L\"real\\*(R\" world, it might also be beneficial to start a timer, so that\nlow-priority connections can not be locked out forever under load. This\nenables your program to keep a lower latency for important connections\nduring short periods of high load, while not completely locking out less\nimportant ones.\n.SH \"WATCHER TYPES\"\n.IX Header \"WATCHER TYPES\"\nThis section describes each watcher in detail, but will not repeat\ninformation given in the last section. Any initialisation/set macros,\nfunctions and members specific to the watcher type are explained.\n.PP\nMembers are additionally marked with either \\fI[read\\-only]\\fR, meaning that,\nwhile the watcher is active, you can look at the member and expect some\nsensible content, but you must not modify it (you can modify it while the\nwatcher is stopped to your hearts content), or \\fI[read\\-write]\\fR, which\nmeans you can expect it to have some sensible content while the watcher\nis active, but you can also modify it. Modifying it may not do something\nsensible or take immediate effect (or do anything at all), but libev will\nnot crash or malfunction in any way.\n.ie n .SS \"\"\"ev_io\"\" \\- is this file descriptor readable or writable?\"\n.el .SS \"\\f(CWev_io\\fP \\- is this file descriptor readable or writable?\"\n.IX Subsection \"ev_io - is this file descriptor readable or writable?\"\nI/O watchers check whether a file descriptor is readable or writable\nin each iteration of the event loop, or, more precisely, when reading\nwould not block the process and writing would at least be able to write\nsome data. This behaviour is called level-triggering because you keep\nreceiving events as long as the condition persists. Remember you can stop\nthe watcher if you don't want to act on the event and neither want to\nreceive future events.\n.PP\nIn general you can register as many read and/or write event watchers per\nfd as you want (as long as you don't confuse yourself). Setting all file\ndescriptors to non-blocking mode is also usually a good idea (but not\nrequired if you know what you are doing).\n.PP\nAnother thing you have to watch out for is that it is quite easy to\nreceive \\*(L\"spurious\\*(R\" readiness notifications, that is, your callback might\nbe called with \\f(CW\\*(C`EV_READ\\*(C'\\fR but a subsequent \\f(CW\\*(C`read\\*(C'\\fR(2) will actually block\nbecause there is no data. It is very easy to get into this situation even\nwith a relatively standard program structure. Thus it is best to always\nuse non-blocking I/O: An extra \\f(CW\\*(C`read\\*(C'\\fR(2) returning \\f(CW\\*(C`EAGAIN\\*(C'\\fR is far\npreferable to a program hanging until some data arrives.\n.PP\nIf you cannot run the fd in non-blocking mode (for example you should\nnot play around with an Xlib connection), then you have to separately\nre-test whether a file descriptor is really ready with a known-to-be good\ninterface such as poll (fortunately in the case of Xlib, it already does\nthis on its own, so its quite safe to use). Some people additionally\nuse \\f(CW\\*(C`SIGALRM\\*(C'\\fR and an interval timer, just to be sure you won't block\nindefinitely.\n.PP\nBut really, best use non-blocking mode.\n.PP\n\\fIThe special problem of disappearing file descriptors\\fR\n.IX Subsection \"The special problem of disappearing file descriptors\"\n.PP\nSome backends (e.g. kqueue, epoll) need to be told about closing a file\ndescriptor (either due to calling \\f(CW\\*(C`close\\*(C'\\fR explicitly or any other means,\nsuch as \\f(CW\\*(C`dup2\\*(C'\\fR). The reason is that you register interest in some file\ndescriptor, but when it goes away, the operating system will silently drop\nthis interest. If another file descriptor with the same number then is\nregistered with libev, there is no efficient way to see that this is, in\nfact, a different file descriptor.\n.PP\nTo avoid having to explicitly tell libev about such cases, libev follows\nthe following policy:  Each time \\f(CW\\*(C`ev_io_set\\*(C'\\fR is being called, libev\nwill assume that this is potentially a new file descriptor, otherwise\nit is assumed that the file descriptor stays the same. That means that\nyou \\fIhave\\fR to call \\f(CW\\*(C`ev_io_set\\*(C'\\fR (or \\f(CW\\*(C`ev_io_init\\*(C'\\fR) when you change the\ndescriptor even if the file descriptor number itself did not change.\n.PP\nThis is how one would do it normally anyway, the important point is that\nthe libev application should not optimise around libev but should leave\noptimisations to libev.\n.PP\n\\fIThe special problem of dup'ed file descriptors\\fR\n.IX Subsection \"The special problem of dup'ed file descriptors\"\n.PP\nSome backends (e.g. epoll), cannot register events for file descriptors,\nbut only events for the underlying file descriptions. That means when you\nhave \\f(CW\\*(C`dup ()\\*(C'\\fR'ed file descriptors or weirder constellations, and register\nevents for them, only one file descriptor might actually receive events.\n.PP\nThere is no workaround possible except not registering events\nfor potentially \\f(CW\\*(C`dup ()\\*(C'\\fR'ed file descriptors, or to resort to\n\\&\\f(CW\\*(C`EVBACKEND_SELECT\\*(C'\\fR or \\f(CW\\*(C`EVBACKEND_POLL\\*(C'\\fR.\n.PP\n\\fIThe special problem of files\\fR\n.IX Subsection \"The special problem of files\"\n.PP\nMany people try to use \\f(CW\\*(C`select\\*(C'\\fR (or libev) on file descriptors\nrepresenting files, and expect it to become ready when their program\ndoesn't block on disk accesses (which can take a long time on their own).\n.PP\nHowever, this cannot ever work in the \\*(L\"expected\\*(R\" way \\- you get a readiness\nnotification as soon as the kernel knows whether and how much data is\nthere, and in the case of open files, that's always the case, so you\nalways get a readiness notification instantly, and your read (or possibly\nwrite) will still block on the disk I/O.\n.PP\nAnother way to view it is that in the case of sockets, pipes, character\ndevices and so on, there is another party (the sender) that delivers data\non its own, but in the case of files, there is no such thing: the disk\nwill not send data on its own, simply because it doesn't know what you\nwish to read \\- you would first have to request some data.\n.PP\nSince files are typically not-so-well supported by advanced notification\nmechanism, libev tries hard to emulate \\s-1POSIX\\s0 behaviour with respect\nto files, even though you should not use it. The reason for this is\nconvenience: sometimes you want to watch \\s-1STDIN\\s0 or \\s-1STDOUT,\\s0 which is\nusually a tty, often a pipe, but also sometimes files or special devices\n(for example, \\f(CW\\*(C`epoll\\*(C'\\fR on Linux works with \\fI/dev/random\\fR but not with\n\\&\\fI/dev/urandom\\fR), and even though the file might better be served with\nasynchronous I/O instead of with non-blocking I/O, it is still useful when\nit \\*(L\"just works\\*(R\" instead of freezing.\n.PP\nSo avoid file descriptors pointing to files when you know it (e.g. use\nlibeio), but use them when it is convenient, e.g. for \\s-1STDIN/STDOUT,\\s0 or\nwhen you rarely read from a file instead of from a socket, and want to\nreuse the same code path.\n.PP\n\\fIThe special problem of fork\\fR\n.IX Subsection \"The special problem of fork\"\n.PP\nSome backends (epoll, kqueue) do not support \\f(CW\\*(C`fork ()\\*(C'\\fR at all or exhibit\nuseless behaviour. Libev fully supports fork, but needs to be told about\nit in the child if you want to continue to use it in the child.\n.PP\nTo support fork in your child processes, you have to call \\f(CW\\*(C`ev_loop_fork\n()\\*(C'\\fR after a fork in the child, enable \\f(CW\\*(C`EVFLAG_FORKCHECK\\*(C'\\fR, or resort to\n\\&\\f(CW\\*(C`EVBACKEND_SELECT\\*(C'\\fR or \\f(CW\\*(C`EVBACKEND_POLL\\*(C'\\fR.\n.PP\n\\fIThe special problem of \\s-1SIGPIPE\\s0\\fR\n.IX Subsection \"The special problem of SIGPIPE\"\n.PP\nWhile not really specific to libev, it is easy to forget about \\f(CW\\*(C`SIGPIPE\\*(C'\\fR:\nwhen writing to a pipe whose other end has been closed, your program gets\nsent a \\s-1SIGPIPE,\\s0 which, by default, aborts your program. For most programs\nthis is sensible behaviour, for daemons, this is usually undesirable.\n.PP\nSo when you encounter spurious, unexplained daemon exits, make sure you\nignore \\s-1SIGPIPE \\s0(and maybe make sure you log the exit status of your daemon\nsomewhere, as that would have given you a big clue).\n.PP\n\\fIThe special problem of \\fIaccept()\\fIing when you can't\\fR\n.IX Subsection \"The special problem of accept()ing when you can't\"\n.PP\nMany implementations of the \\s-1POSIX \\s0\\f(CW\\*(C`accept\\*(C'\\fR function (for example,\nfound in post\\-2004 Linux) have the peculiar behaviour of not removing a\nconnection from the pending queue in all error cases.\n.PP\nFor example, larger servers often run out of file descriptors (because\nof resource limits), causing \\f(CW\\*(C`accept\\*(C'\\fR to fail with \\f(CW\\*(C`ENFILE\\*(C'\\fR but not\nrejecting the connection, leading to libev signalling readiness on\nthe next iteration again (the connection still exists after all), and\ntypically causing the program to loop at 100% \\s-1CPU\\s0 usage.\n.PP\nUnfortunately, the set of errors that cause this issue differs between\noperating systems, there is usually little the app can do to remedy the\nsituation, and no known thread-safe method of removing the connection to\ncope with overload is known (to me).\n.PP\nOne of the easiest ways to handle this situation is to just ignore it\n\\&\\- when the program encounters an overload, it will just loop until the\nsituation is over. While this is a form of busy waiting, no \\s-1OS\\s0 offers an\nevent-based way to handle this situation, so it's the best one can do.\n.PP\nA better way to handle the situation is to log any errors other than\n\\&\\f(CW\\*(C`EAGAIN\\*(C'\\fR and \\f(CW\\*(C`EWOULDBLOCK\\*(C'\\fR, making sure not to flood the log with such\nmessages, and continue as usual, which at least gives the user an idea of\nwhat could be wrong (\\*(L\"raise the ulimit!\\*(R\"). For extra points one could stop\nthe \\f(CW\\*(C`ev_io\\*(C'\\fR watcher on the listening fd \\*(L\"for a while\\*(R\", which reduces \\s-1CPU\\s0\nusage.\n.PP\nIf your program is single-threaded, then you could also keep a dummy file\ndescriptor for overload situations (e.g. by opening \\fI/dev/null\\fR), and\nwhen you run into \\f(CW\\*(C`ENFILE\\*(C'\\fR or \\f(CW\\*(C`EMFILE\\*(C'\\fR, close it, run \\f(CW\\*(C`accept\\*(C'\\fR,\nclose that fd, and create a new dummy fd. This will gracefully refuse\nclients under typical overload conditions.\n.PP\nThe last way to handle it is to simply log the error and \\f(CW\\*(C`exit\\*(C'\\fR, as\nis often done with \\f(CW\\*(C`malloc\\*(C'\\fR failures, but this results in an easy\nopportunity for a DoS attack.\n.PP\n\\fIWatcher-Specific Functions\\fR\n.IX Subsection \"Watcher-Specific Functions\"\n.IP \"ev_io_init (ev_io *, callback, int fd, int events)\" 4\n.IX Item \"ev_io_init (ev_io *, callback, int fd, int events)\"\n.PD 0\n.IP \"ev_io_set (ev_io *, int fd, int events)\" 4\n.IX Item \"ev_io_set (ev_io *, int fd, int events)\"\n.PD\nConfigures an \\f(CW\\*(C`ev_io\\*(C'\\fR watcher. The \\f(CW\\*(C`fd\\*(C'\\fR is the file descriptor to\nreceive events for and \\f(CW\\*(C`events\\*(C'\\fR is either \\f(CW\\*(C`EV_READ\\*(C'\\fR, \\f(CW\\*(C`EV_WRITE\\*(C'\\fR or\n\\&\\f(CW\\*(C`EV_READ | EV_WRITE\\*(C'\\fR, to express the desire to receive the given events.\n.IP \"int fd [read\\-only]\" 4\n.IX Item \"int fd [read-only]\"\nThe file descriptor being watched.\n.IP \"int events [read\\-only]\" 4\n.IX Item \"int events [read-only]\"\nThe events being watched.\n.PP\n\\fIExamples\\fR\n.IX Subsection \"Examples\"\n.PP\nExample: Call \\f(CW\\*(C`stdin_readable_cb\\*(C'\\fR when \\s-1STDIN_FILENO\\s0 has become, well\nreadable, but only once. Since it is likely line-buffered, you could\nattempt to read a whole line in the callback.\n.PP\n.Vb 6\n\\&   static void\n\\&   stdin_readable_cb (struct ev_loop *loop, ev_io *w, int revents)\n\\&   {\n\\&      ev_io_stop (loop, w);\n\\&     .. read from stdin here (or from w\\->fd) and handle any I/O errors\n\\&   }\n\\&\n\\&   ...\n\\&   struct ev_loop *loop = ev_default_init (0);\n\\&   ev_io stdin_readable;\n\\&   ev_io_init (&stdin_readable, stdin_readable_cb, STDIN_FILENO, EV_READ);\n\\&   ev_io_start (loop, &stdin_readable);\n\\&   ev_run (loop, 0);\n.Ve\n.ie n .SS \"\"\"ev_timer\"\" \\- relative and optionally repeating timeouts\"\n.el .SS \"\\f(CWev_timer\\fP \\- relative and optionally repeating timeouts\"\n.IX Subsection \"ev_timer - relative and optionally repeating timeouts\"\nTimer watchers are simple relative timers that generate an event after a\ngiven time, and optionally repeating in regular intervals after that.\n.PP\nThe timers are based on real time, that is, if you register an event that\ntimes out after an hour and you reset your system clock to January last\nyear, it will still time out after (roughly) one hour. \\*(L\"Roughly\\*(R\" because\ndetecting time jumps is hard, and some inaccuracies are unavoidable (the\nmonotonic clock option helps a lot here).\n.PP\nThe callback is guaranteed to be invoked only \\fIafter\\fR its timeout has\npassed (not \\fIat\\fR, so on systems with very low-resolution clocks this\nmight introduce a small delay, see \\*(L\"the special problem of being too\nearly\\*(R\", below). If multiple timers become ready during the same loop\niteration then the ones with earlier time-out values are invoked before\nones of the same priority with later time-out values (but this is no\nlonger true when a callback calls \\f(CW\\*(C`ev_run\\*(C'\\fR recursively).\n.PP\n\\fIBe smart about timeouts\\fR\n.IX Subsection \"Be smart about timeouts\"\n.PP\nMany real-world problems involve some kind of timeout, usually for error\nrecovery. A typical example is an \\s-1HTTP\\s0 request \\- if the other side hangs,\nyou want to raise some error after a while.\n.PP\nWhat follows are some ways to handle this problem, from obvious and\ninefficient to smart and efficient.\n.PP\nIn the following, a 60 second activity timeout is assumed \\- a timeout that\ngets reset to 60 seconds each time there is activity (e.g. each time some\ndata or other life sign was received).\n.IP \"1. Use a timer and stop, reinitialise and start it on activity.\" 4\n.IX Item \"1. Use a timer and stop, reinitialise and start it on activity.\"\nThis is the most obvious, but not the most simple way: In the beginning,\nstart the watcher:\n.Sp\n.Vb 2\n\\&   ev_timer_init (timer, callback, 60., 0.);\n\\&   ev_timer_start (loop, timer);\n.Ve\n.Sp\nThen, each time there is some activity, \\f(CW\\*(C`ev_timer_stop\\*(C'\\fR it, initialise it\nand start it again:\n.Sp\n.Vb 3\n\\&   ev_timer_stop (loop, timer);\n\\&   ev_timer_set (timer, 60., 0.);\n\\&   ev_timer_start (loop, timer);\n.Ve\n.Sp\nThis is relatively simple to implement, but means that each time there is\nsome activity, libev will first have to remove the timer from its internal\ndata structure and then add it again. Libev tries to be fast, but it's\nstill not a constant-time operation.\n.ie n .IP \"2. Use a timer and re-start it with \"\"ev_timer_again\"\" inactivity.\" 4\n.el .IP \"2. Use a timer and re-start it with \\f(CWev_timer_again\\fR inactivity.\" 4\n.IX Item \"2. Use a timer and re-start it with ev_timer_again inactivity.\"\nThis is the easiest way, and involves using \\f(CW\\*(C`ev_timer_again\\*(C'\\fR instead of\n\\&\\f(CW\\*(C`ev_timer_start\\*(C'\\fR.\n.Sp\nTo implement this, configure an \\f(CW\\*(C`ev_timer\\*(C'\\fR with a \\f(CW\\*(C`repeat\\*(C'\\fR value\nof \\f(CW60\\fR and then call \\f(CW\\*(C`ev_timer_again\\*(C'\\fR at start and each time you\nsuccessfully read or write some data. If you go into an idle state where\nyou do not expect data to travel on the socket, you can \\f(CW\\*(C`ev_timer_stop\\*(C'\\fR\nthe timer, and \\f(CW\\*(C`ev_timer_again\\*(C'\\fR will automatically restart it if need be.\n.Sp\nThat means you can ignore both the \\f(CW\\*(C`ev_timer_start\\*(C'\\fR function and the\n\\&\\f(CW\\*(C`after\\*(C'\\fR argument to \\f(CW\\*(C`ev_timer_set\\*(C'\\fR, and only ever use the \\f(CW\\*(C`repeat\\*(C'\\fR\nmember and \\f(CW\\*(C`ev_timer_again\\*(C'\\fR.\n.Sp\nAt start:\n.Sp\n.Vb 3\n\\&   ev_init (timer, callback);\n\\&   timer\\->repeat = 60.;\n\\&   ev_timer_again (loop, timer);\n.Ve\n.Sp\nEach time there is some activity:\n.Sp\n.Vb 1\n\\&   ev_timer_again (loop, timer);\n.Ve\n.Sp\nIt is even possible to change the time-out on the fly, regardless of\nwhether the watcher is active or not:\n.Sp\n.Vb 2\n\\&   timer\\->repeat = 30.;\n\\&   ev_timer_again (loop, timer);\n.Ve\n.Sp\nThis is slightly more efficient then stopping/starting the timer each time\nyou want to modify its timeout value, as libev does not have to completely\nremove and re-insert the timer from/into its internal data structure.\n.Sp\nIt is, however, even simpler than the \\*(L\"obvious\\*(R\" way to do it.\n.IP \"3. Let the timer time out, but then re-arm it as required.\" 4\n.IX Item \"3. Let the timer time out, but then re-arm it as required.\"\nThis method is more tricky, but usually most efficient: Most timeouts are\nrelatively long compared to the intervals between other activity \\- in\nour example, within 60 seconds, there are usually many I/O events with\nassociated activity resets.\n.Sp\nIn this case, it would be more efficient to leave the \\f(CW\\*(C`ev_timer\\*(C'\\fR alone,\nbut remember the time of last activity, and check for a real timeout only\nwithin the callback:\n.Sp\n.Vb 3\n\\&   ev_tstamp timeout = 60.;\n\\&   ev_tstamp last_activity; // time of last activity\n\\&   ev_timer timer;\n\\&\n\\&   static void\n\\&   callback (EV_P_ ev_timer *w, int revents)\n\\&   {\n\\&     // calculate when the timeout would happen\n\\&     ev_tstamp after = last_activity \\- ev_now (EV_A) + timeout;\n\\&\n\\&     // if negative, it means we the timeout already occurred\n\\&     if (after < 0.)\n\\&       {\n\\&         // timeout occurred, take action\n\\&       }\n\\&     else\n\\&       {\n\\&         // callback was invoked, but there was some recent \n\\&         // activity. simply restart the timer to time out\n\\&         // after \"after\" seconds, which is the earliest time\n\\&         // the timeout can occur.\n\\&         ev_timer_set (w, after, 0.);\n\\&         ev_timer_start (EV_A_ w);\n\\&       }\n\\&   }\n.Ve\n.Sp\nTo summarise the callback: first calculate in how many seconds the\ntimeout will occur (by calculating the absolute time when it would occur,\n\\&\\f(CW\\*(C`last_activity + timeout\\*(C'\\fR, and subtracting the current time, \\f(CW\\*(C`ev_now\n(EV_A)\\*(C'\\fR from that).\n.Sp\nIf this value is negative, then we are already past the timeout, i.e. we\ntimed out, and need to do whatever is needed in this case.\n.Sp\nOtherwise, we now the earliest time at which the timeout would trigger,\nand simply start the timer with this timeout value.\n.Sp\nIn other words, each time the callback is invoked it will check whether\nthe timeout occurred. If not, it will simply reschedule itself to check\nagain at the earliest time it could time out. Rinse. Repeat.\n.Sp\nThis scheme causes more callback invocations (about one every 60 seconds\nminus half the average time between activity), but virtually no calls to\nlibev to change the timeout.\n.Sp\nTo start the machinery, simply initialise the watcher and set\n\\&\\f(CW\\*(C`last_activity\\*(C'\\fR to the current time (meaning there was some activity just\nnow), then call the callback, which will \\*(L\"do the right thing\\*(R\" and start\nthe timer:\n.Sp\n.Vb 3\n\\&   last_activity = ev_now (EV_A);\n\\&   ev_init (&timer, callback);\n\\&   callback (EV_A_ &timer, 0);\n.Ve\n.Sp\nWhen there is some activity, simply store the current time in\n\\&\\f(CW\\*(C`last_activity\\*(C'\\fR, no libev calls at all:\n.Sp\n.Vb 2\n\\&   if (activity detected)\n\\&     last_activity = ev_now (EV_A);\n.Ve\n.Sp\nWhen your timeout value changes, then the timeout can be changed by simply\nproviding a new value, stopping the timer and calling the callback, which\nwill again do the right thing (for example, time out immediately :).\n.Sp\n.Vb 3\n\\&   timeout = new_value;\n\\&   ev_timer_stop (EV_A_ &timer);\n\\&   callback (EV_A_ &timer, 0);\n.Ve\n.Sp\nThis technique is slightly more complex, but in most cases where the\ntime-out is unlikely to be triggered, much more efficient.\n.IP \"4. Wee, just use a double-linked list for your timeouts.\" 4\n.IX Item \"4. Wee, just use a double-linked list for your timeouts.\"\nIf there is not one request, but many thousands (millions...), all\nemploying some kind of timeout with the same timeout value, then one can\ndo even better:\n.Sp\nWhen starting the timeout, calculate the timeout value and put the timeout\nat the \\fIend\\fR of the list.\n.Sp\nThen use an \\f(CW\\*(C`ev_timer\\*(C'\\fR to fire when the timeout at the \\fIbeginning\\fR of\nthe list is expected to fire (for example, using the technique #3).\n.Sp\nWhen there is some activity, remove the timer from the list, recalculate\nthe timeout, append it to the end of the list again, and make sure to\nupdate the \\f(CW\\*(C`ev_timer\\*(C'\\fR if it was taken from the beginning of the list.\n.Sp\nThis way, one can manage an unlimited number of timeouts in O(1) time for\nstarting, stopping and updating the timers, at the expense of a major\ncomplication, and having to use a constant timeout. The constant timeout\nensures that the list stays sorted.\n.PP\nSo which method the best?\n.PP\nMethod #2 is a simple no-brain-required solution that is adequate in most\nsituations. Method #3 requires a bit more thinking, but handles many cases\nbetter, and isn't very complicated either. In most case, choosing either\none is fine, with #3 being better in typical situations.\n.PP\nMethod #1 is almost always a bad idea, and buys you nothing. Method #4 is\nrather complicated, but extremely efficient, something that really pays\noff after the first million or so of active timers, i.e. it's usually\noverkill :)\n.PP\n\\fIThe special problem of being too early\\fR\n.IX Subsection \"The special problem of being too early\"\n.PP\nIf you ask a timer to call your callback after three seconds, then\nyou expect it to be invoked after three seconds \\- but of course, this\ncannot be guaranteed to infinite precision. Less obviously, it cannot be\nguaranteed to any precision by libev \\- imagine somebody suspending the\nprocess with a \\s-1STOP\\s0 signal for a few hours for example.\n.PP\nSo, libev tries to invoke your callback as soon as possible \\fIafter\\fR the\ndelay has occurred, but cannot guarantee this.\n.PP\nA less obvious failure mode is calling your callback too early: many event\nloops compare timestamps with a \\*(L\"elapsed delay >= requested delay\\*(R\", but\nthis can cause your callback to be invoked much earlier than you would\nexpect.\n.PP\nTo see why, imagine a system with a clock that only offers full second\nresolution (think windows if you can't come up with a broken enough \\s-1OS\\s0\nyourself). If you schedule a one-second timer at the time 500.9, then the\nevent loop will schedule your timeout to elapse at a system time of 500\n(500.9 truncated to the resolution) + 1, or 501.\n.PP\nIf an event library looks at the timeout 0.1s later, it will see \\*(L\"501 >=\n501\\*(R\" and invoke the callback 0.1s after it was started, even though a\none-second delay was requested \\- this is being \\*(L\"too early\\*(R\", despite best\nintentions.\n.PP\nThis is the reason why libev will never invoke the callback if the elapsed\ndelay equals the requested delay, but only when the elapsed delay is\nlarger than the requested delay. In the example above, libev would only invoke\nthe callback at system time 502, or 1.1s after the timer was started.\n.PP\nSo, while libev cannot guarantee that your callback will be invoked\nexactly when requested, it \\fIcan\\fR and \\fIdoes\\fR guarantee that the requested\ndelay has actually elapsed, or in other words, it always errs on the \\*(L\"too\nlate\\*(R\" side of things.\n.PP\n\\fIThe special problem of time updates\\fR\n.IX Subsection \"The special problem of time updates\"\n.PP\nEstablishing the current time is a costly operation (it usually takes\nat least one system call): \\s-1EV\\s0 therefore updates its idea of the current\ntime only before and after \\f(CW\\*(C`ev_run\\*(C'\\fR collects new events, which causes a\ngrowing difference between \\f(CW\\*(C`ev_now ()\\*(C'\\fR and \\f(CW\\*(C`ev_time ()\\*(C'\\fR when handling\nlots of events in one iteration.\n.PP\nThe relative timeouts are calculated relative to the \\f(CW\\*(C`ev_now ()\\*(C'\\fR\ntime. This is usually the right thing as this timestamp refers to the time\nof the event triggering whatever timeout you are modifying/starting. If\nyou suspect event processing to be delayed and you \\fIneed\\fR to base the\ntimeout on the current time, use something like the following to adjust\nfor it:\n.PP\n.Vb 1\n\\&   ev_timer_set (&timer, after + (ev_time () \\- ev_now ()), 0.);\n.Ve\n.PP\nIf the event loop is suspended for a long time, you can also force an\nupdate of the time returned by \\f(CW\\*(C`ev_now ()\\*(C'\\fR by calling \\f(CW\\*(C`ev_now_update\n()\\*(C'\\fR, although that will push the event time of all outstanding events\nfurther into the future.\n.PP\n\\fIThe special problem of unsynchronised clocks\\fR\n.IX Subsection \"The special problem of unsynchronised clocks\"\n.PP\nModern systems have a variety of clocks \\- libev itself uses the normal\n\\&\\*(L\"wall clock\\*(R\" clock and, if available, the monotonic clock (to avoid time\njumps).\n.PP\nNeither of these clocks is synchronised with each other or any other clock\non the system, so \\f(CW\\*(C`ev_time ()\\*(C'\\fR might return a considerably different time\nthan \\f(CW\\*(C`gettimeofday ()\\*(C'\\fR or \\f(CW\\*(C`time ()\\*(C'\\fR. On a GNU/Linux system, for example,\na call to \\f(CW\\*(C`gettimeofday\\*(C'\\fR might return a second count that is one higher\nthan a directly following call to \\f(CW\\*(C`time\\*(C'\\fR.\n.PP\nThe moral of this is to only compare libev-related timestamps with\n\\&\\f(CW\\*(C`ev_time ()\\*(C'\\fR and \\f(CW\\*(C`ev_now ()\\*(C'\\fR, at least if you want better precision than\na second or so.\n.PP\nOne more problem arises due to this lack of synchronisation: if libev uses\nthe system monotonic clock and you compare timestamps from \\f(CW\\*(C`ev_time\\*(C'\\fR\nor \\f(CW\\*(C`ev_now\\*(C'\\fR from when you started your timer and when your callback is\ninvoked, you will find that sometimes the callback is a bit \\*(L\"early\\*(R\".\n.PP\nThis is because \\f(CW\\*(C`ev_timer\\*(C'\\fRs work in real time, not wall clock time, so\nlibev makes sure your callback is not invoked before the delay happened,\n\\&\\fImeasured according to the real time\\fR, not the system clock.\n.PP\nIf your timeouts are based on a physical timescale (e.g. \\*(L\"time out this\nconnection after 100 seconds\\*(R\") then this shouldn't bother you as it is\nexactly the right behaviour.\n.PP\nIf you want to compare wall clock/system timestamps to your timers, then\nyou need to use \\f(CW\\*(C`ev_periodic\\*(C'\\fRs, as these are based on the wall clock\ntime, where your comparisons will always generate correct results.\n.PP\n\\fIThe special problems of suspended animation\\fR\n.IX Subsection \"The special problems of suspended animation\"\n.PP\nWhen you leave the server world it is quite customary to hit machines that\ncan suspend/hibernate \\- what happens to the clocks during such a suspend?\n.PP\nSome quick tests made with a Linux 2.6.28 indicate that a suspend freezes\nall processes, while the clocks (\\f(CW\\*(C`times\\*(C'\\fR, \\f(CW\\*(C`CLOCK_MONOTONIC\\*(C'\\fR) continue\nto run until the system is suspended, but they will not advance while the\nsystem is suspended. That means, on resume, it will be as if the program\nwas frozen for a few seconds, but the suspend time will not be counted\ntowards \\f(CW\\*(C`ev_timer\\*(C'\\fR when a monotonic clock source is used. The real time\nclock advanced as expected, but if it is used as sole clocksource, then a\nlong suspend would be detected as a time jump by libev, and timers would\nbe adjusted accordingly.\n.PP\nI would not be surprised to see different behaviour in different between\noperating systems, \\s-1OS\\s0 versions or even different hardware.\n.PP\nThe other form of suspend (job control, or sending a \\s-1SIGSTOP\\s0) will see a\ntime jump in the monotonic clocks and the realtime clock. If the program\nis suspended for a very long time, and monotonic clock sources are in use,\nthen you can expect \\f(CW\\*(C`ev_timer\\*(C'\\fRs to expire as the full suspension time\nwill be counted towards the timers. When no monotonic clock source is in\nuse, then libev will again assume a timejump and adjust accordingly.\n.PP\nIt might be beneficial for this latter case to call \\f(CW\\*(C`ev_suspend\\*(C'\\fR\nand \\f(CW\\*(C`ev_resume\\*(C'\\fR in code that handles \\f(CW\\*(C`SIGTSTP\\*(C'\\fR, to at least get\ndeterministic behaviour in this case (you can do nothing against\n\\&\\f(CW\\*(C`SIGSTOP\\*(C'\\fR).\n.PP\n\\fIWatcher-Specific Functions and Data Members\\fR\n.IX Subsection \"Watcher-Specific Functions and Data Members\"\n.IP \"ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)\" 4\n.IX Item \"ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)\"\n.PD 0\n.IP \"ev_timer_set (ev_timer *, ev_tstamp after, ev_tstamp repeat)\" 4\n.IX Item \"ev_timer_set (ev_timer *, ev_tstamp after, ev_tstamp repeat)\"\n.PD\nConfigure the timer to trigger after \\f(CW\\*(C`after\\*(C'\\fR seconds. If \\f(CW\\*(C`repeat\\*(C'\\fR\nis \\f(CW0.\\fR, then it will automatically be stopped once the timeout is\nreached. If it is positive, then the timer will automatically be\nconfigured to trigger again \\f(CW\\*(C`repeat\\*(C'\\fR seconds later, again, and again,\nuntil stopped manually.\n.Sp\nThe timer itself will do a best-effort at avoiding drift, that is, if\nyou configure a timer to trigger every 10 seconds, then it will normally\ntrigger at exactly 10 second intervals. If, however, your program cannot\nkeep up with the timer (because it takes longer than those 10 seconds to\ndo stuff) the timer will not fire more than once per event loop iteration.\n.IP \"ev_timer_again (loop, ev_timer *)\" 4\n.IX Item \"ev_timer_again (loop, ev_timer *)\"\nThis will act as if the timer timed out, and restarts it again if it is\nrepeating. It basically works like calling \\f(CW\\*(C`ev_timer_stop\\*(C'\\fR, updating the\ntimeout to the \\f(CW\\*(C`repeat\\*(C'\\fR value and calling \\f(CW\\*(C`ev_timer_start\\*(C'\\fR.\n.Sp\nThe exact semantics are as in the following rules, all of which will be\napplied to the watcher:\n.RS 4\n.IP \"If the timer is pending, the pending status is always cleared.\" 4\n.IX Item \"If the timer is pending, the pending status is always cleared.\"\n.PD 0\n.IP \"If the timer is started but non-repeating, stop it (as if it timed out, without invoking it).\" 4\n.IX Item \"If the timer is started but non-repeating, stop it (as if it timed out, without invoking it).\"\n.ie n .IP \"If the timer is repeating, make the \"\"repeat\"\" value the new timeout and start the timer, if necessary.\" 4\n.el .IP \"If the timer is repeating, make the \\f(CWrepeat\\fR value the new timeout and start the timer, if necessary.\" 4\n.IX Item \"If the timer is repeating, make the repeat value the new timeout and start the timer, if necessary.\"\n.RE\n.RS 4\n.PD\n.Sp\nThis sounds a bit complicated, see \\*(L\"Be smart about timeouts\\*(R\", above, for a\nusage example.\n.RE\n.IP \"ev_tstamp ev_timer_remaining (loop, ev_timer *)\" 4\n.IX Item \"ev_tstamp ev_timer_remaining (loop, ev_timer *)\"\nReturns the remaining time until a timer fires. If the timer is active,\nthen this time is relative to the current event loop time, otherwise it's\nthe timeout value currently configured.\n.Sp\nThat is, after an \\f(CW\\*(C`ev_timer_set (w, 5, 7)\\*(C'\\fR, \\f(CW\\*(C`ev_timer_remaining\\*(C'\\fR returns\n\\&\\f(CW5\\fR. When the timer is started and one second passes, \\f(CW\\*(C`ev_timer_remaining\\*(C'\\fR\nwill return \\f(CW4\\fR. When the timer expires and is restarted, it will return\nroughly \\f(CW7\\fR (likely slightly less as callback invocation takes some time,\ntoo), and so on.\n.IP \"ev_tstamp repeat [read\\-write]\" 4\n.IX Item \"ev_tstamp repeat [read-write]\"\nThe current \\f(CW\\*(C`repeat\\*(C'\\fR value. Will be used each time the watcher times out\nor \\f(CW\\*(C`ev_timer_again\\*(C'\\fR is called, and determines the next timeout (if any),\nwhich is also when any modifications are taken into account.\n.PP\n\\fIExamples\\fR\n.IX Subsection \"Examples\"\n.PP\nExample: Create a timer that fires after 60 seconds.\n.PP\n.Vb 5\n\\&   static void\n\\&   one_minute_cb (struct ev_loop *loop, ev_timer *w, int revents)\n\\&   {\n\\&     .. one minute over, w is actually stopped right here\n\\&   }\n\\&\n\\&   ev_timer mytimer;\n\\&   ev_timer_init (&mytimer, one_minute_cb, 60., 0.);\n\\&   ev_timer_start (loop, &mytimer);\n.Ve\n.PP\nExample: Create a timeout timer that times out after 10 seconds of\ninactivity.\n.PP\n.Vb 5\n\\&   static void\n\\&   timeout_cb (struct ev_loop *loop, ev_timer *w, int revents)\n\\&   {\n\\&     .. ten seconds without any activity\n\\&   }\n\\&\n\\&   ev_timer mytimer;\n\\&   ev_timer_init (&mytimer, timeout_cb, 0., 10.); /* note, only repeat used */\n\\&   ev_timer_again (&mytimer); /* start timer */\n\\&   ev_run (loop, 0);\n\\&\n\\&   // and in some piece of code that gets executed on any \"activity\":\n\\&   // reset the timeout to start ticking again at 10 seconds\n\\&   ev_timer_again (&mytimer);\n.Ve\n.ie n .SS \"\"\"ev_periodic\"\" \\- to cron or not to cron?\"\n.el .SS \"\\f(CWev_periodic\\fP \\- to cron or not to cron?\"\n.IX Subsection \"ev_periodic - to cron or not to cron?\"\nPeriodic watchers are also timers of a kind, but they are very versatile\n(and unfortunately a bit complex).\n.PP\nUnlike \\f(CW\\*(C`ev_timer\\*(C'\\fR, periodic watchers are not based on real time (or\nrelative time, the physical time that passes) but on wall clock time\n(absolute time, the thing you can read on your calender or clock). The\ndifference is that wall clock time can run faster or slower than real\ntime, and time jumps are not uncommon (e.g. when you adjust your\nwrist-watch).\n.PP\nYou can tell a periodic watcher to trigger after some specific point\nin time: for example, if you tell a periodic watcher to trigger \\*(L\"in 10\nseconds\\*(R\" (by specifying e.g. \\f(CW\\*(C`ev_now () + 10.\\*(C'\\fR, that is, an absolute time\nnot a delay) and then reset your system clock to January of the previous\nyear, then it will take a year or more to trigger the event (unlike an\n\\&\\f(CW\\*(C`ev_timer\\*(C'\\fR, which would still trigger roughly 10 seconds after starting\nit, as it uses a relative timeout).\n.PP\n\\&\\f(CW\\*(C`ev_periodic\\*(C'\\fR watchers can also be used to implement vastly more complex\ntimers, such as triggering an event on each \\*(L\"midnight, local time\\*(R\", or\nother complicated rules. This cannot be done with \\f(CW\\*(C`ev_timer\\*(C'\\fR watchers, as\nthose cannot react to time jumps.\n.PP\nAs with timers, the callback is guaranteed to be invoked only when the\npoint in time where it is supposed to trigger has passed. If multiple\ntimers become ready during the same loop iteration then the ones with\nearlier time-out values are invoked before ones with later time-out values\n(but this is no longer true when a callback calls \\f(CW\\*(C`ev_run\\*(C'\\fR recursively).\n.PP\n\\fIWatcher-Specific Functions and Data Members\\fR\n.IX Subsection \"Watcher-Specific Functions and Data Members\"\n.IP \"ev_periodic_init (ev_periodic *, callback, ev_tstamp offset, ev_tstamp interval, reschedule_cb)\" 4\n.IX Item \"ev_periodic_init (ev_periodic *, callback, ev_tstamp offset, ev_tstamp interval, reschedule_cb)\"\n.PD 0\n.IP \"ev_periodic_set (ev_periodic *, ev_tstamp offset, ev_tstamp interval, reschedule_cb)\" 4\n.IX Item \"ev_periodic_set (ev_periodic *, ev_tstamp offset, ev_tstamp interval, reschedule_cb)\"\n.PD\nLots of arguments, let's sort it out... There are basically three modes of\noperation, and we will explain them from simplest to most complex:\n.RS 4\n.IP \"\\(bu\" 4\nabsolute timer (offset = absolute time, interval = 0, reschedule_cb = 0)\n.Sp\nIn this configuration the watcher triggers an event after the wall clock\ntime \\f(CW\\*(C`offset\\*(C'\\fR has passed. It will not repeat and will not adjust when a\ntime jump occurs, that is, if it is to be run at January 1st 2011 then it\nwill be stopped and invoked when the system clock reaches or surpasses\nthis point in time.\n.IP \"\\(bu\" 4\nrepeating interval timer (offset = offset within interval, interval > 0, reschedule_cb = 0)\n.Sp\nIn this mode the watcher will always be scheduled to time out at the next\n\\&\\f(CW\\*(C`offset + N * interval\\*(C'\\fR time (for some integer N, which can also be\nnegative) and then repeat, regardless of any time jumps. The \\f(CW\\*(C`offset\\*(C'\\fR\nargument is merely an offset into the \\f(CW\\*(C`interval\\*(C'\\fR periods.\n.Sp\nThis can be used to create timers that do not drift with respect to the\nsystem clock, for example, here is an \\f(CW\\*(C`ev_periodic\\*(C'\\fR that triggers each\nhour, on the hour (with respect to \\s-1UTC\\s0):\n.Sp\n.Vb 1\n\\&   ev_periodic_set (&periodic, 0., 3600., 0);\n.Ve\n.Sp\nThis doesn't mean there will always be 3600 seconds in between triggers,\nbut only that the callback will be called when the system time shows a\nfull hour (\\s-1UTC\\s0), or more correctly, when the system time is evenly divisible\nby 3600.\n.Sp\nAnother way to think about it (for the mathematically inclined) is that\n\\&\\f(CW\\*(C`ev_periodic\\*(C'\\fR will try to run the callback in this mode at the next possible\ntime where \\f(CW\\*(C`time = offset (mod interval)\\*(C'\\fR, regardless of any time jumps.\n.Sp\nThe \\f(CW\\*(C`interval\\*(C'\\fR \\fI\\s-1MUST\\s0\\fR be positive, and for numerical stability, the\ninterval value should be higher than \\f(CW\\*(C`1/8192\\*(C'\\fR (which is around 100\nmicroseconds) and \\f(CW\\*(C`offset\\*(C'\\fR should be higher than \\f(CW0\\fR and should have\nat most a similar magnitude as the current time (say, within a factor of\nten). Typical values for offset are, in fact, \\f(CW0\\fR or something between\n\\&\\f(CW0\\fR and \\f(CW\\*(C`interval\\*(C'\\fR, which is also the recommended range.\n.Sp\nNote also that there is an upper limit to how often a timer can fire (\\s-1CPU\\s0\nspeed for example), so if \\f(CW\\*(C`interval\\*(C'\\fR is very small then timing stability\nwill of course deteriorate. Libev itself tries to be exact to be about one\nmillisecond (if the \\s-1OS\\s0 supports it and the machine is fast enough).\n.IP \"\\(bu\" 4\nmanual reschedule mode (offset ignored, interval ignored, reschedule_cb = callback)\n.Sp\nIn this mode the values for \\f(CW\\*(C`interval\\*(C'\\fR and \\f(CW\\*(C`offset\\*(C'\\fR are both being\nignored. Instead, each time the periodic watcher gets scheduled, the\nreschedule callback will be called with the watcher as first, and the\ncurrent time as second argument.\n.Sp\n\\&\\s-1NOTE: \\s0\\fIThis callback \\s-1MUST NOT\\s0 stop or destroy any periodic watcher, ever,\nor make \\s-1ANY\\s0 other event loop modifications whatsoever, unless explicitly\nallowed by documentation here\\fR.\n.Sp\nIf you need to stop it, return \\f(CW\\*(C`now + 1e30\\*(C'\\fR (or so, fudge fudge) and stop\nit afterwards (e.g. by starting an \\f(CW\\*(C`ev_prepare\\*(C'\\fR watcher, which is the\nonly event loop modification you are allowed to do).\n.Sp\nThe callback prototype is \\f(CW\\*(C`ev_tstamp (*reschedule_cb)(ev_periodic\n*w, ev_tstamp now)\\*(C'\\fR, e.g.:\n.Sp\n.Vb 5\n\\&   static ev_tstamp\n\\&   my_rescheduler (ev_periodic *w, ev_tstamp now)\n\\&   {\n\\&     return now + 60.;\n\\&   }\n.Ve\n.Sp\nIt must return the next time to trigger, based on the passed time value\n(that is, the lowest time value larger than to the second argument). It\nwill usually be called just before the callback will be triggered, but\nmight be called at other times, too.\n.Sp\n\\&\\s-1NOTE: \\s0\\fIThis callback must always return a time that is higher than or\nequal to the passed \\f(CI\\*(C`now\\*(C'\\fI value\\fR.\n.Sp\nThis can be used to create very complex timers, such as a timer that\ntriggers on \\*(L\"next midnight, local time\\*(R\". To do this, you would calculate the\nnext midnight after \\f(CW\\*(C`now\\*(C'\\fR and return the timestamp value for this. How\nyou do this is, again, up to you (but it is not trivial, which is the main\nreason I omitted it as an example).\n.RE\n.RS 4\n.RE\n.IP \"ev_periodic_again (loop, ev_periodic *)\" 4\n.IX Item \"ev_periodic_again (loop, ev_periodic *)\"\nSimply stops and restarts the periodic watcher again. This is only useful\nwhen you changed some parameters or the reschedule callback would return\na different time than the last time it was called (e.g. in a crond like\nprogram when the crontabs have changed).\n.IP \"ev_tstamp ev_periodic_at (ev_periodic *)\" 4\n.IX Item \"ev_tstamp ev_periodic_at (ev_periodic *)\"\nWhen active, returns the absolute time that the watcher is supposed\nto trigger next. This is not the same as the \\f(CW\\*(C`offset\\*(C'\\fR argument to\n\\&\\f(CW\\*(C`ev_periodic_set\\*(C'\\fR, but indeed works even in interval and manual\nrescheduling modes.\n.IP \"ev_tstamp offset [read\\-write]\" 4\n.IX Item \"ev_tstamp offset [read-write]\"\nWhen repeating, this contains the offset value, otherwise this is the\nabsolute point in time (the \\f(CW\\*(C`offset\\*(C'\\fR value passed to \\f(CW\\*(C`ev_periodic_set\\*(C'\\fR,\nalthough libev might modify this value for better numerical stability).\n.Sp\nCan be modified any time, but changes only take effect when the periodic\ntimer fires or \\f(CW\\*(C`ev_periodic_again\\*(C'\\fR is being called.\n.IP \"ev_tstamp interval [read\\-write]\" 4\n.IX Item \"ev_tstamp interval [read-write]\"\nThe current interval value. Can be modified any time, but changes only\ntake effect when the periodic timer fires or \\f(CW\\*(C`ev_periodic_again\\*(C'\\fR is being\ncalled.\n.IP \"ev_tstamp (*reschedule_cb)(ev_periodic *w, ev_tstamp now) [read\\-write]\" 4\n.IX Item \"ev_tstamp (*reschedule_cb)(ev_periodic *w, ev_tstamp now) [read-write]\"\nThe current reschedule callback, or \\f(CW0\\fR, if this functionality is\nswitched off. Can be changed any time, but changes only take effect when\nthe periodic timer fires or \\f(CW\\*(C`ev_periodic_again\\*(C'\\fR is being called.\n.PP\n\\fIExamples\\fR\n.IX Subsection \"Examples\"\n.PP\nExample: Call a callback every hour, or, more precisely, whenever the\nsystem time is divisible by 3600. The callback invocation times have\npotentially a lot of jitter, but good long-term stability.\n.PP\n.Vb 5\n\\&   static void\n\\&   clock_cb (struct ev_loop *loop, ev_periodic *w, int revents)\n\\&   {\n\\&     ... its now a full hour (UTC, or TAI or whatever your clock follows)\n\\&   }\n\\&\n\\&   ev_periodic hourly_tick;\n\\&   ev_periodic_init (&hourly_tick, clock_cb, 0., 3600., 0);\n\\&   ev_periodic_start (loop, &hourly_tick);\n.Ve\n.PP\nExample: The same as above, but use a reschedule callback to do it:\n.PP\n.Vb 1\n\\&   #include <math.h>\n\\&\n\\&   static ev_tstamp\n\\&   my_scheduler_cb (ev_periodic *w, ev_tstamp now)\n\\&   {\n\\&     return now + (3600. \\- fmod (now, 3600.));\n\\&   }\n\\&\n\\&   ev_periodic_init (&hourly_tick, clock_cb, 0., 0., my_scheduler_cb);\n.Ve\n.PP\nExample: Call a callback every hour, starting now:\n.PP\n.Vb 4\n\\&   ev_periodic hourly_tick;\n\\&   ev_periodic_init (&hourly_tick, clock_cb,\n\\&                     fmod (ev_now (loop), 3600.), 3600., 0);\n\\&   ev_periodic_start (loop, &hourly_tick);\n.Ve\n.ie n .SS \"\"\"ev_signal\"\" \\- signal me when a signal gets signalled!\"\n.el .SS \"\\f(CWev_signal\\fP \\- signal me when a signal gets signalled!\"\n.IX Subsection \"ev_signal - signal me when a signal gets signalled!\"\nSignal watchers will trigger an event when the process receives a specific\nsignal one or more times. Even though signals are very asynchronous, libev\nwill try its best to deliver signals synchronously, i.e. as part of the\nnormal event processing, like any other event.\n.PP\nIf you want signals to be delivered truly asynchronously, just use\n\\&\\f(CW\\*(C`sigaction\\*(C'\\fR as you would do without libev and forget about sharing\nthe signal. You can even use \\f(CW\\*(C`ev_async\\*(C'\\fR from a signal handler to\nsynchronously wake up an event loop.\n.PP\nYou can configure as many watchers as you like for the same signal, but\nonly within the same loop, i.e. you can watch for \\f(CW\\*(C`SIGINT\\*(C'\\fR in your\ndefault loop and for \\f(CW\\*(C`SIGIO\\*(C'\\fR in another loop, but you cannot watch for\n\\&\\f(CW\\*(C`SIGINT\\*(C'\\fR in both the default loop and another loop at the same time. At\nthe moment, \\f(CW\\*(C`SIGCHLD\\*(C'\\fR is permanently tied to the default loop.\n.PP\nOnly after the first watcher for a signal is started will libev actually\nregister something with the kernel. It thus coexists with your own signal\nhandlers as long as you don't register any with libev for the same signal.\n.PP\nIf possible and supported, libev will install its handlers with\n\\&\\f(CW\\*(C`SA_RESTART\\*(C'\\fR (or equivalent) behaviour enabled, so system calls should\nnot be unduly interrupted. If you have a problem with system calls getting\ninterrupted by signals you can block all signals in an \\f(CW\\*(C`ev_check\\*(C'\\fR watcher\nand unblock them in an \\f(CW\\*(C`ev_prepare\\*(C'\\fR watcher.\n.PP\n\\fIThe special problem of inheritance over fork/execve/pthread_create\\fR\n.IX Subsection \"The special problem of inheritance over fork/execve/pthread_create\"\n.PP\nBoth the signal mask (\\f(CW\\*(C`sigprocmask\\*(C'\\fR) and the signal disposition\n(\\f(CW\\*(C`sigaction\\*(C'\\fR) are unspecified after starting a signal watcher (and after\nstopping it again), that is, libev might or might not block the signal,\nand might or might not set or restore the installed signal handler (but\nsee \\f(CW\\*(C`EVFLAG_NOSIGMASK\\*(C'\\fR).\n.PP\nWhile this does not matter for the signal disposition (libev never\nsets signals to \\f(CW\\*(C`SIG_IGN\\*(C'\\fR, so handlers will be reset to \\f(CW\\*(C`SIG_DFL\\*(C'\\fR on\n\\&\\f(CW\\*(C`execve\\*(C'\\fR), this matters for the signal mask: many programs do not expect\ncertain signals to be blocked.\n.PP\nThis means that before calling \\f(CW\\*(C`exec\\*(C'\\fR (from the child) you should reset\nthe signal mask to whatever \\*(L\"default\\*(R\" you expect (all clear is a good\nchoice usually).\n.PP\nThe simplest way to ensure that the signal mask is reset in the child is\nto install a fork handler with \\f(CW\\*(C`pthread_atfork\\*(C'\\fR that resets it. That will\ncatch fork calls done by libraries (such as the libc) as well.\n.PP\nIn current versions of libev, the signal will not be blocked indefinitely\nunless you use the \\f(CW\\*(C`signalfd\\*(C'\\fR \\s-1API \\s0(\\f(CW\\*(C`EV_SIGNALFD\\*(C'\\fR). While this reduces\nthe window of opportunity for problems, it will not go away, as libev\n\\&\\fIhas\\fR to modify the signal mask, at least temporarily.\n.PP\nSo I can't stress this enough: \\fIIf you do not reset your signal mask when\nyou expect it to be empty, you have a race condition in your code\\fR. This\nis not a libev-specific thing, this is true for most event libraries.\n.PP\n\\fIThe special problem of threads signal handling\\fR\n.IX Subsection \"The special problem of threads signal handling\"\n.PP\n\\&\\s-1POSIX\\s0 threads has problematic signal handling semantics, specifically,\na lot of functionality (sigfd, sigwait etc.) only really works if all\nthreads in a process block signals, which is hard to achieve.\n.PP\nWhen you want to use sigwait (or mix libev signal handling with your own\nfor the same signals), you can tackle this problem by globally blocking\nall signals before creating any threads (or creating them with a fully set\nsigprocmask) and also specifying the \\f(CW\\*(C`EVFLAG_NOSIGMASK\\*(C'\\fR when creating\nloops. Then designate one thread as \\*(L\"signal receiver thread\\*(R\" which handles\nthese signals. You can pass on any signals that libev might be interested\nin by calling \\f(CW\\*(C`ev_feed_signal\\*(C'\\fR.\n.PP\n\\fIWatcher-Specific Functions and Data Members\\fR\n.IX Subsection \"Watcher-Specific Functions and Data Members\"\n.IP \"ev_signal_init (ev_signal *, callback, int signum)\" 4\n.IX Item \"ev_signal_init (ev_signal *, callback, int signum)\"\n.PD 0\n.IP \"ev_signal_set (ev_signal *, int signum)\" 4\n.IX Item \"ev_signal_set (ev_signal *, int signum)\"\n.PD\nConfigures the watcher to trigger on the given signal number (usually one\nof the \\f(CW\\*(C`SIGxxx\\*(C'\\fR constants).\n.IP \"int signum [read\\-only]\" 4\n.IX Item \"int signum [read-only]\"\nThe signal the watcher watches out for.\n.PP\n\\fIExamples\\fR\n.IX Subsection \"Examples\"\n.PP\nExample: Try to exit cleanly on \\s-1SIGINT.\\s0\n.PP\n.Vb 5\n\\&   static void\n\\&   sigint_cb (struct ev_loop *loop, ev_signal *w, int revents)\n\\&   {\n\\&     ev_break (loop, EVBREAK_ALL);\n\\&   }\n\\&\n\\&   ev_signal signal_watcher;\n\\&   ev_signal_init (&signal_watcher, sigint_cb, SIGINT);\n\\&   ev_signal_start (loop, &signal_watcher);\n.Ve\n.ie n .SS \"\"\"ev_child\"\" \\- watch out for process status changes\"\n.el .SS \"\\f(CWev_child\\fP \\- watch out for process status changes\"\n.IX Subsection \"ev_child - watch out for process status changes\"\nChild watchers trigger when your process receives a \\s-1SIGCHLD\\s0 in response to\nsome child status changes (most typically when a child of yours dies or\nexits). It is permissible to install a child watcher \\fIafter\\fR the child\nhas been forked (which implies it might have already exited), as long\nas the event loop isn't entered (or is continued from a watcher), i.e.,\nforking and then immediately registering a watcher for the child is fine,\nbut forking and registering a watcher a few event loop iterations later or\nin the next callback invocation is not.\n.PP\nOnly the default event loop is capable of handling signals, and therefore\nyou can only register child watchers in the default event loop.\n.PP\nDue to some design glitches inside libev, child watchers will always be\nhandled at maximum priority (their priority is set to \\f(CW\\*(C`EV_MAXPRI\\*(C'\\fR by\nlibev)\n.PP\n\\fIProcess Interaction\\fR\n.IX Subsection \"Process Interaction\"\n.PP\nLibev grabs \\f(CW\\*(C`SIGCHLD\\*(C'\\fR as soon as the default event loop is\ninitialised. This is necessary to guarantee proper behaviour even if the\nfirst child watcher is started after the child exits. The occurrence\nof \\f(CW\\*(C`SIGCHLD\\*(C'\\fR is recorded asynchronously, but child reaping is done\nsynchronously as part of the event loop processing. Libev always reaps all\nchildren, even ones not watched.\n.PP\n\\fIOverriding the Built-In Processing\\fR\n.IX Subsection \"Overriding the Built-In Processing\"\n.PP\nLibev offers no special support for overriding the built-in child\nprocessing, but if your application collides with libev's default child\nhandler, you can override it easily by installing your own handler for\n\\&\\f(CW\\*(C`SIGCHLD\\*(C'\\fR after initialising the default loop, and making sure the\ndefault loop never gets destroyed. You are encouraged, however, to use an\nevent-based approach to child reaping and thus use libev's support for\nthat, so other libev users can use \\f(CW\\*(C`ev_child\\*(C'\\fR watchers freely.\n.PP\n\\fIStopping the Child Watcher\\fR\n.IX Subsection \"Stopping the Child Watcher\"\n.PP\nCurrently, the child watcher never gets stopped, even when the\nchild terminates, so normally one needs to stop the watcher in the\ncallback. Future versions of libev might stop the watcher automatically\nwhen a child exit is detected (calling \\f(CW\\*(C`ev_child_stop\\*(C'\\fR twice is not a\nproblem).\n.PP\n\\fIWatcher-Specific Functions and Data Members\\fR\n.IX Subsection \"Watcher-Specific Functions and Data Members\"\n.IP \"ev_child_init (ev_child *, callback, int pid, int trace)\" 4\n.IX Item \"ev_child_init (ev_child *, callback, int pid, int trace)\"\n.PD 0\n.IP \"ev_child_set (ev_child *, int pid, int trace)\" 4\n.IX Item \"ev_child_set (ev_child *, int pid, int trace)\"\n.PD\nConfigures the watcher to wait for status changes of process \\f(CW\\*(C`pid\\*(C'\\fR (or\n\\&\\fIany\\fR process if \\f(CW\\*(C`pid\\*(C'\\fR is specified as \\f(CW0\\fR). The callback can look\nat the \\f(CW\\*(C`rstatus\\*(C'\\fR member of the \\f(CW\\*(C`ev_child\\*(C'\\fR watcher structure to see\nthe status word (use the macros from \\f(CW\\*(C`sys/wait.h\\*(C'\\fR and see your systems\n\\&\\f(CW\\*(C`waitpid\\*(C'\\fR documentation). The \\f(CW\\*(C`rpid\\*(C'\\fR member contains the pid of the\nprocess causing the status change. \\f(CW\\*(C`trace\\*(C'\\fR must be either \\f(CW0\\fR (only\nactivate the watcher when the process terminates) or \\f(CW1\\fR (additionally\nactivate the watcher when the process is stopped or continued).\n.IP \"int pid [read\\-only]\" 4\n.IX Item \"int pid [read-only]\"\nThe process id this watcher watches out for, or \\f(CW0\\fR, meaning any process id.\n.IP \"int rpid [read\\-write]\" 4\n.IX Item \"int rpid [read-write]\"\nThe process id that detected a status change.\n.IP \"int rstatus [read\\-write]\" 4\n.IX Item \"int rstatus [read-write]\"\nThe process exit/trace status caused by \\f(CW\\*(C`rpid\\*(C'\\fR (see your systems\n\\&\\f(CW\\*(C`waitpid\\*(C'\\fR and \\f(CW\\*(C`sys/wait.h\\*(C'\\fR documentation for details).\n.PP\n\\fIExamples\\fR\n.IX Subsection \"Examples\"\n.PP\nExample: \\f(CW\\*(C`fork()\\*(C'\\fR a new process and install a child handler to wait for\nits completion.\n.PP\n.Vb 1\n\\&   ev_child cw;\n\\&\n\\&   static void\n\\&   child_cb (EV_P_ ev_child *w, int revents)\n\\&   {\n\\&     ev_child_stop (EV_A_ w);\n\\&     printf (\"process %d exited with status %x\\en\", w\\->rpid, w\\->rstatus);\n\\&   }\n\\&\n\\&   pid_t pid = fork ();\n\\&\n\\&   if (pid < 0)\n\\&     // error\n\\&   else if (pid == 0)\n\\&     {\n\\&       // the forked child executes here\n\\&       exit (1);\n\\&     }\n\\&   else\n\\&     {\n\\&       ev_child_init (&cw, child_cb, pid, 0);\n\\&       ev_child_start (EV_DEFAULT_ &cw);\n\\&     }\n.Ve\n.ie n .SS \"\"\"ev_stat\"\" \\- did the file attributes just change?\"\n.el .SS \"\\f(CWev_stat\\fP \\- did the file attributes just change?\"\n.IX Subsection \"ev_stat - did the file attributes just change?\"\nThis watches a file system path for attribute changes. That is, it calls\n\\&\\f(CW\\*(C`stat\\*(C'\\fR on that path in regular intervals (or when the \\s-1OS\\s0 says it changed)\nand sees if it changed compared to the last time, invoking the callback\nif it did. Starting the watcher \\f(CW\\*(C`stat\\*(C'\\fR's the file, so only changes that\nhappen after the watcher has been started will be reported.\n.PP\nThe path does not need to exist: changing from \\*(L\"path exists\\*(R\" to \\*(L\"path does\nnot exist\\*(R\" is a status change like any other. The condition \\*(L\"path does not\nexist\\*(R\" (or more correctly \\*(L\"path cannot be stat'ed\\*(R\") is signified by the\n\\&\\f(CW\\*(C`st_nlink\\*(C'\\fR field being zero (which is otherwise always forced to be at\nleast one) and all the other fields of the stat buffer having unspecified\ncontents.\n.PP\nThe path \\fImust not\\fR end in a slash or contain special components such as\n\\&\\f(CW\\*(C`.\\*(C'\\fR or \\f(CW\\*(C`..\\*(C'\\fR. The path \\fIshould\\fR be absolute: If it is relative and\nyour working directory changes, then the behaviour is undefined.\n.PP\nSince there is no portable change notification interface available, the\nportable implementation simply calls \\f(CWstat(2)\\fR regularly on the path\nto see if it changed somehow. You can specify a recommended polling\ninterval for this case. If you specify a polling interval of \\f(CW0\\fR (highly\nrecommended!) then a \\fIsuitable, unspecified default\\fR value will be used\n(which you can expect to be around five seconds, although this might\nchange dynamically). Libev will also impose a minimum interval which is\ncurrently around \\f(CW0.1\\fR, but that's usually overkill.\n.PP\nThis watcher type is not meant for massive numbers of stat watchers,\nas even with OS-supported change notifications, this can be\nresource-intensive.\n.PP\nAt the time of this writing, the only OS-specific interface implemented\nis the Linux inotify interface (implementing kqueue support is left as an\nexercise for the reader. Note, however, that the author sees no way of\nimplementing \\f(CW\\*(C`ev_stat\\*(C'\\fR semantics with kqueue, except as a hint).\n.PP\n\\fI\\s-1ABI\\s0 Issues (Largefile Support)\\fR\n.IX Subsection \"ABI Issues (Largefile Support)\"\n.PP\nLibev by default (unless the user overrides this) uses the default\ncompilation environment, which means that on systems with large file\nsupport disabled by default, you get the 32 bit version of the stat\nstructure. When using the library from programs that change the \\s-1ABI\\s0 to\nuse 64 bit file offsets the programs will fail. In that case you have to\ncompile libev with the same flags to get binary compatibility. This is\nobviously the case with any flags that change the \\s-1ABI,\\s0 but the problem is\nmost noticeably displayed with ev_stat and large file support.\n.PP\nThe solution for this is to lobby your distribution maker to make large\nfile interfaces available by default (as e.g. FreeBSD does) and not\noptional. Libev cannot simply switch on large file support because it has\nto exchange stat structures with application programs compiled using the\ndefault compilation environment.\n.PP\n\\fIInotify and Kqueue\\fR\n.IX Subsection \"Inotify and Kqueue\"\n.PP\nWhen \\f(CW\\*(C`inotify (7)\\*(C'\\fR support has been compiled into libev and present at\nruntime, it will be used to speed up change detection where possible. The\ninotify descriptor will be created lazily when the first \\f(CW\\*(C`ev_stat\\*(C'\\fR\nwatcher is being started.\n.PP\nInotify presence does not change the semantics of \\f(CW\\*(C`ev_stat\\*(C'\\fR watchers\nexcept that changes might be detected earlier, and in some cases, to avoid\nmaking regular \\f(CW\\*(C`stat\\*(C'\\fR calls. Even in the presence of inotify support\nthere are many cases where libev has to resort to regular \\f(CW\\*(C`stat\\*(C'\\fR polling,\nbut as long as kernel 2.6.25 or newer is used (2.6.24 and older have too\nmany bugs), the path exists (i.e. stat succeeds), and the path resides on\na local filesystem (libev currently assumes only ext2/3, jfs, reiserfs and\nxfs are fully working) libev usually gets away without polling.\n.PP\nThere is no support for kqueue, as apparently it cannot be used to\nimplement this functionality, due to the requirement of having a file\ndescriptor open on the object at all times, and detecting renames, unlinks\netc. is difficult.\n.PP\n\\fI\\f(CI\\*(C`stat ()\\*(C'\\fI is a synchronous operation\\fR\n.IX Subsection \"stat () is a synchronous operation\"\n.PP\nLibev doesn't normally do any kind of I/O itself, and so is not blocking\nthe process. The exception are \\f(CW\\*(C`ev_stat\\*(C'\\fR watchers \\- those call \\f(CW\\*(C`stat\n()\\*(C'\\fR, which is a synchronous operation.\n.PP\nFor local paths, this usually doesn't matter: unless the system is very\nbusy or the intervals between stat's are large, a stat call will be fast,\nas the path data is usually in memory already (except when starting the\nwatcher).\n.PP\nFor networked file systems, calling \\f(CW\\*(C`stat ()\\*(C'\\fR can block an indefinite\ntime due to network issues, and even under good conditions, a stat call\noften takes multiple milliseconds.\n.PP\nTherefore, it is best to avoid using \\f(CW\\*(C`ev_stat\\*(C'\\fR watchers on networked\npaths, although this is fully supported by libev.\n.PP\n\\fIThe special problem of stat time resolution\\fR\n.IX Subsection \"The special problem of stat time resolution\"\n.PP\nThe \\f(CW\\*(C`stat ()\\*(C'\\fR system call only supports full-second resolution portably,\nand even on systems where the resolution is higher, most file systems\nstill only support whole seconds.\n.PP\nThat means that, if the time is the only thing that changes, you can\neasily miss updates: on the first update, \\f(CW\\*(C`ev_stat\\*(C'\\fR detects a change and\ncalls your callback, which does something. When there is another update\nwithin the same second, \\f(CW\\*(C`ev_stat\\*(C'\\fR will be unable to detect unless the\nstat data does change in other ways (e.g. file size).\n.PP\nThe solution to this is to delay acting on a change for slightly more\nthan a second (or till slightly after the next full second boundary), using\na roughly one-second-delay \\f(CW\\*(C`ev_timer\\*(C'\\fR (e.g. \\f(CW\\*(C`ev_timer_set (w, 0., 1.02);\nev_timer_again (loop, w)\\*(C'\\fR).\n.PP\nThe \\f(CW.02\\fR offset is added to work around small timing inconsistencies\nof some operating systems (where the second counter of the current time\nmight be be delayed. One such system is the Linux kernel, where a call to\n\\&\\f(CW\\*(C`gettimeofday\\*(C'\\fR might return a timestamp with a full second later than\na subsequent \\f(CW\\*(C`time\\*(C'\\fR call \\- if the equivalent of \\f(CW\\*(C`time ()\\*(C'\\fR is used to\nupdate file times then there will be a small window where the kernel uses\nthe previous second to update file times but libev might already execute\nthe timer callback).\n.PP\n\\fIWatcher-Specific Functions and Data Members\\fR\n.IX Subsection \"Watcher-Specific Functions and Data Members\"\n.IP \"ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)\" 4\n.IX Item \"ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)\"\n.PD 0\n.IP \"ev_stat_set (ev_stat *, const char *path, ev_tstamp interval)\" 4\n.IX Item \"ev_stat_set (ev_stat *, const char *path, ev_tstamp interval)\"\n.PD\nConfigures the watcher to wait for status changes of the given\n\\&\\f(CW\\*(C`path\\*(C'\\fR. The \\f(CW\\*(C`interval\\*(C'\\fR is a hint on how quickly a change is expected to\nbe detected and should normally be specified as \\f(CW0\\fR to let libev choose\na suitable value. The memory pointed to by \\f(CW\\*(C`path\\*(C'\\fR must point to the same\npath for as long as the watcher is active.\n.Sp\nThe callback will receive an \\f(CW\\*(C`EV_STAT\\*(C'\\fR event when a change was detected,\nrelative to the attributes at the time the watcher was started (or the\nlast change was detected).\n.IP \"ev_stat_stat (loop, ev_stat *)\" 4\n.IX Item \"ev_stat_stat (loop, ev_stat *)\"\nUpdates the stat buffer immediately with new values. If you change the\nwatched path in your callback, you could call this function to avoid\ndetecting this change (while introducing a race condition if you are not\nthe only one changing the path). Can also be useful simply to find out the\nnew values.\n.IP \"ev_statdata attr [read\\-only]\" 4\n.IX Item \"ev_statdata attr [read-only]\"\nThe most-recently detected attributes of the file. Although the type is\n\\&\\f(CW\\*(C`ev_statdata\\*(C'\\fR, this is usually the (or one of the) \\f(CW\\*(C`struct stat\\*(C'\\fR types\nsuitable for your system, but you can only rely on the POSIX-standardised\nmembers to be present. If the \\f(CW\\*(C`st_nlink\\*(C'\\fR member is \\f(CW0\\fR, then there was\nsome error while \\f(CW\\*(C`stat\\*(C'\\fRing the file.\n.IP \"ev_statdata prev [read\\-only]\" 4\n.IX Item \"ev_statdata prev [read-only]\"\nThe previous attributes of the file. The callback gets invoked whenever\n\\&\\f(CW\\*(C`prev\\*(C'\\fR != \\f(CW\\*(C`attr\\*(C'\\fR, or, more precisely, one or more of these members\ndiffer: \\f(CW\\*(C`st_dev\\*(C'\\fR, \\f(CW\\*(C`st_ino\\*(C'\\fR, \\f(CW\\*(C`st_mode\\*(C'\\fR, \\f(CW\\*(C`st_nlink\\*(C'\\fR, \\f(CW\\*(C`st_uid\\*(C'\\fR,\n\\&\\f(CW\\*(C`st_gid\\*(C'\\fR, \\f(CW\\*(C`st_rdev\\*(C'\\fR, \\f(CW\\*(C`st_size\\*(C'\\fR, \\f(CW\\*(C`st_atime\\*(C'\\fR, \\f(CW\\*(C`st_mtime\\*(C'\\fR, \\f(CW\\*(C`st_ctime\\*(C'\\fR.\n.IP \"ev_tstamp interval [read\\-only]\" 4\n.IX Item \"ev_tstamp interval [read-only]\"\nThe specified interval.\n.IP \"const char *path [read\\-only]\" 4\n.IX Item \"const char *path [read-only]\"\nThe file system path that is being watched.\n.PP\n\\fIExamples\\fR\n.IX Subsection \"Examples\"\n.PP\nExample: Watch \\f(CW\\*(C`/etc/passwd\\*(C'\\fR for attribute changes.\n.PP\n.Vb 10\n\\&   static void\n\\&   passwd_cb (struct ev_loop *loop, ev_stat *w, int revents)\n\\&   {\n\\&     /* /etc/passwd changed in some way */\n\\&     if (w\\->attr.st_nlink)\n\\&       {\n\\&         printf (\"passwd current size  %ld\\en\", (long)w\\->attr.st_size);\n\\&         printf (\"passwd current atime %ld\\en\", (long)w\\->attr.st_mtime);\n\\&         printf (\"passwd current mtime %ld\\en\", (long)w\\->attr.st_mtime);\n\\&       }\n\\&     else\n\\&       /* you shalt not abuse printf for puts */\n\\&       puts (\"wow, /etc/passwd is not there, expect problems. \"\n\\&             \"if this is windows, they already arrived\\en\");\n\\&   }\n\\&\n\\&   ...\n\\&   ev_stat passwd;\n\\&\n\\&   ev_stat_init (&passwd, passwd_cb, \"/etc/passwd\", 0.);\n\\&   ev_stat_start (loop, &passwd);\n.Ve\n.PP\nExample: Like above, but additionally use a one-second delay so we do not\nmiss updates (however, frequent updates will delay processing, too, so\none might do the work both on \\f(CW\\*(C`ev_stat\\*(C'\\fR callback invocation \\fIand\\fR on\n\\&\\f(CW\\*(C`ev_timer\\*(C'\\fR callback invocation).\n.PP\n.Vb 2\n\\&   static ev_stat passwd;\n\\&   static ev_timer timer;\n\\&\n\\&   static void\n\\&   timer_cb (EV_P_ ev_timer *w, int revents)\n\\&   {\n\\&     ev_timer_stop (EV_A_ w);\n\\&\n\\&     /* now it\\*(Aqs one second after the most recent passwd change */\n\\&   }\n\\&\n\\&   static void\n\\&   stat_cb (EV_P_ ev_stat *w, int revents)\n\\&   {\n\\&     /* reset the one\\-second timer */\n\\&     ev_timer_again (EV_A_ &timer);\n\\&   }\n\\&\n\\&   ...\n\\&   ev_stat_init (&passwd, stat_cb, \"/etc/passwd\", 0.);\n\\&   ev_stat_start (loop, &passwd);\n\\&   ev_timer_init (&timer, timer_cb, 0., 1.02);\n.Ve\n.ie n .SS \"\"\"ev_idle\"\" \\- when you've got nothing better to do...\"\n.el .SS \"\\f(CWev_idle\\fP \\- when you've got nothing better to do...\"\n.IX Subsection \"ev_idle - when you've got nothing better to do...\"\nIdle watchers trigger events when no other events of the same or higher\npriority are pending (prepare, check and other idle watchers do not count\nas receiving \\*(L\"events\\*(R\").\n.PP\nThat is, as long as your process is busy handling sockets or timeouts\n(or even signals, imagine) of the same or higher priority it will not be\ntriggered. But when your process is idle (or only lower-priority watchers\nare pending), the idle watchers are being called once per event loop\niteration \\- until stopped, that is, or your process receives more events\nand becomes busy again with higher priority stuff.\n.PP\nThe most noteworthy effect is that as long as any idle watchers are\nactive, the process will not block when waiting for new events.\n.PP\nApart from keeping your process non-blocking (which is a useful\neffect on its own sometimes), idle watchers are a good place to do\n\\&\\*(L\"pseudo-background processing\\*(R\", or delay processing stuff to after the\nevent loop has handled all outstanding events.\n.PP\n\\fIAbusing an \\f(CI\\*(C`ev_idle\\*(C'\\fI watcher for its side-effect\\fR\n.IX Subsection \"Abusing an ev_idle watcher for its side-effect\"\n.PP\nAs long as there is at least one active idle watcher, libev will never\nsleep unnecessarily. Or in other words, it will loop as fast as possible.\nFor this to work, the idle watcher doesn't need to be invoked at all \\- the\nlowest priority will do.\n.PP\nThis mode of operation can be useful together with an \\f(CW\\*(C`ev_check\\*(C'\\fR watcher,\nto do something on each event loop iteration \\- for example to balance load\nbetween different connections.\n.PP\nSee \\*(L\"Abusing an ev_check watcher for its side-effect\\*(R\" for a longer\nexample.\n.PP\n\\fIWatcher-Specific Functions and Data Members\\fR\n.IX Subsection \"Watcher-Specific Functions and Data Members\"\n.IP \"ev_idle_init (ev_idle *, callback)\" 4\n.IX Item \"ev_idle_init (ev_idle *, callback)\"\nInitialises and configures the idle watcher \\- it has no parameters of any\nkind. There is a \\f(CW\\*(C`ev_idle_set\\*(C'\\fR macro, but using it is utterly pointless,\nbelieve me.\n.PP\n\\fIExamples\\fR\n.IX Subsection \"Examples\"\n.PP\nExample: Dynamically allocate an \\f(CW\\*(C`ev_idle\\*(C'\\fR watcher, start it, and in the\ncallback, free it. Also, use no error checking, as usual.\n.PP\n.Vb 5\n\\&   static void\n\\&   idle_cb (struct ev_loop *loop, ev_idle *w, int revents)\n\\&   {\n\\&     // stop the watcher\n\\&     ev_idle_stop (loop, w);\n\\&\n\\&     // now we can free it\n\\&     free (w);\n\\&\n\\&     // now do something you wanted to do when the program has\n\\&     // no longer anything immediate to do.\n\\&   }\n\\&\n\\&   ev_idle *idle_watcher = malloc (sizeof (ev_idle));\n\\&   ev_idle_init (idle_watcher, idle_cb);\n\\&   ev_idle_start (loop, idle_watcher);\n.Ve\n.ie n .SS \"\"\"ev_prepare\"\" and \"\"ev_check\"\" \\- customise your event loop!\"\n.el .SS \"\\f(CWev_prepare\\fP and \\f(CWev_check\\fP \\- customise your event loop!\"\n.IX Subsection \"ev_prepare and ev_check - customise your event loop!\"\nPrepare and check watchers are often (but not always) used in pairs:\nprepare watchers get invoked before the process blocks and check watchers\nafterwards.\n.PP\nYou \\fImust not\\fR call \\f(CW\\*(C`ev_run\\*(C'\\fR (or similar functions that enter the\ncurrent event loop) or \\f(CW\\*(C`ev_loop_fork\\*(C'\\fR from either \\f(CW\\*(C`ev_prepare\\*(C'\\fR or\n\\&\\f(CW\\*(C`ev_check\\*(C'\\fR watchers. Other loops than the current one are fine,\nhowever. The rationale behind this is that you do not need to check\nfor recursion in those watchers, i.e. the sequence will always be\n\\&\\f(CW\\*(C`ev_prepare\\*(C'\\fR, blocking, \\f(CW\\*(C`ev_check\\*(C'\\fR so if you have one watcher of each\nkind they will always be called in pairs bracketing the blocking call.\n.PP\nTheir main purpose is to integrate other event mechanisms into libev and\ntheir use is somewhat advanced. They could be used, for example, to track\nvariable changes, implement your own watchers, integrate net-snmp or a\ncoroutine library and lots more. They are also occasionally useful if\nyou cache some data and want to flush it before blocking (for example,\nin X programs you might want to do an \\f(CW\\*(C`XFlush ()\\*(C'\\fR in an \\f(CW\\*(C`ev_prepare\\*(C'\\fR\nwatcher).\n.PP\nThis is done by examining in each prepare call which file descriptors\nneed to be watched by the other library, registering \\f(CW\\*(C`ev_io\\*(C'\\fR watchers\nfor them and starting an \\f(CW\\*(C`ev_timer\\*(C'\\fR watcher for any timeouts (many\nlibraries provide exactly this functionality). Then, in the check watcher,\nyou check for any events that occurred (by checking the pending status\nof all watchers and stopping them) and call back into the library. The\nI/O and timer callbacks will never actually be called (but must be valid\nnevertheless, because you never know, you know?).\n.PP\nAs another example, the Perl Coro module uses these hooks to integrate\ncoroutines into libev programs, by yielding to other active coroutines\nduring each prepare and only letting the process block if no coroutines\nare ready to run (it's actually more complicated: it only runs coroutines\nwith priority higher than or equal to the event loop and one coroutine\nof lower priority, but only once, using idle watchers to keep the event\nloop from blocking if lower-priority coroutines are active, thus mapping\nlow-priority coroutines to idle/background tasks).\n.PP\nWhen used for this purpose, it is recommended to give \\f(CW\\*(C`ev_check\\*(C'\\fR watchers\nhighest (\\f(CW\\*(C`EV_MAXPRI\\*(C'\\fR) priority, to ensure that they are being run before\nany other watchers after the poll (this doesn't matter for \\f(CW\\*(C`ev_prepare\\*(C'\\fR\nwatchers).\n.PP\nAlso, \\f(CW\\*(C`ev_check\\*(C'\\fR watchers (and \\f(CW\\*(C`ev_prepare\\*(C'\\fR watchers, too) should not\nactivate (\\*(L\"feed\\*(R\") events into libev. While libev fully supports this, they\nmight get executed before other \\f(CW\\*(C`ev_check\\*(C'\\fR watchers did their job. As\n\\&\\f(CW\\*(C`ev_check\\*(C'\\fR watchers are often used to embed other (non-libev) event\nloops those other event loops might be in an unusable state until their\n\\&\\f(CW\\*(C`ev_check\\*(C'\\fR watcher ran (always remind yourself to coexist peacefully with\nothers).\n.PP\n\\fIAbusing an \\f(CI\\*(C`ev_check\\*(C'\\fI watcher for its side-effect\\fR\n.IX Subsection \"Abusing an ev_check watcher for its side-effect\"\n.PP\n\\&\\f(CW\\*(C`ev_check\\*(C'\\fR (and less often also \\f(CW\\*(C`ev_prepare\\*(C'\\fR) watchers can also be\nuseful because they are called once per event loop iteration. For\nexample, if you want to handle a large number of connections fairly, you\nnormally only do a bit of work for each active connection, and if there\nis more work to do, you wait for the next event loop iteration, so other\nconnections have a chance of making progress.\n.PP\nUsing an \\f(CW\\*(C`ev_check\\*(C'\\fR watcher is almost enough: it will be called on the\nnext event loop iteration. However, that isn't as soon as possible \\-\nwithout external events, your \\f(CW\\*(C`ev_check\\*(C'\\fR watcher will not be invoked.\n.PP\nThis is where \\f(CW\\*(C`ev_idle\\*(C'\\fR watchers come in handy \\- all you need is a\nsingle global idle watcher that is active as long as you have one active\n\\&\\f(CW\\*(C`ev_check\\*(C'\\fR watcher. The \\f(CW\\*(C`ev_idle\\*(C'\\fR watcher makes sure the event loop\nwill not sleep, and the \\f(CW\\*(C`ev_check\\*(C'\\fR watcher makes sure a callback gets\ninvoked. Neither watcher alone can do that.\n.PP\n\\fIWatcher-Specific Functions and Data Members\\fR\n.IX Subsection \"Watcher-Specific Functions and Data Members\"\n.IP \"ev_prepare_init (ev_prepare *, callback)\" 4\n.IX Item \"ev_prepare_init (ev_prepare *, callback)\"\n.PD 0\n.IP \"ev_check_init (ev_check *, callback)\" 4\n.IX Item \"ev_check_init (ev_check *, callback)\"\n.PD\nInitialises and configures the prepare or check watcher \\- they have no\nparameters of any kind. There are \\f(CW\\*(C`ev_prepare_set\\*(C'\\fR and \\f(CW\\*(C`ev_check_set\\*(C'\\fR\nmacros, but using them is utterly, utterly, utterly and completely\npointless.\n.PP\n\\fIExamples\\fR\n.IX Subsection \"Examples\"\n.PP\nThere are a number of principal ways to embed other event loops or modules\ninto libev. Here are some ideas on how to include libadns into libev\n(there is a Perl module named \\f(CW\\*(C`EV::ADNS\\*(C'\\fR that does this, which you could\nuse as a working example. Another Perl module named \\f(CW\\*(C`EV::Glib\\*(C'\\fR embeds a\nGlib main context into libev, and finally, \\f(CW\\*(C`Glib::EV\\*(C'\\fR embeds \\s-1EV\\s0 into the\nGlib event loop).\n.PP\nMethod 1: Add \\s-1IO\\s0 watchers and a timeout watcher in a prepare handler,\nand in a check watcher, destroy them and call into libadns. What follows\nis pseudo-code only of course. This requires you to either use a low\npriority for the check watcher or use \\f(CW\\*(C`ev_clear_pending\\*(C'\\fR explicitly, as\nthe callbacks for the IO/timeout watchers might not have been called yet.\n.PP\n.Vb 2\n\\&   static ev_io iow [nfd];\n\\&   static ev_timer tw;\n\\&\n\\&   static void\n\\&   io_cb (struct ev_loop *loop, ev_io *w, int revents)\n\\&   {\n\\&   }\n\\&\n\\&   // create io watchers for each fd and a timer before blocking\n\\&   static void\n\\&   adns_prepare_cb (struct ev_loop *loop, ev_prepare *w, int revents)\n\\&   {\n\\&     int timeout = 3600000;\n\\&     struct pollfd fds [nfd];\n\\&     // actual code will need to loop here and realloc etc.\n\\&     adns_beforepoll (ads, fds, &nfd, &timeout, timeval_from (ev_time ()));\n\\&\n\\&     /* the callback is illegal, but won\\*(Aqt be called as we stop during check */\n\\&     ev_timer_init (&tw, 0, timeout * 1e\\-3, 0.);\n\\&     ev_timer_start (loop, &tw);\n\\&\n\\&     // create one ev_io per pollfd\n\\&     for (int i = 0; i < nfd; ++i)\n\\&       {\n\\&         ev_io_init (iow + i, io_cb, fds [i].fd,\n\\&           ((fds [i].events & POLLIN ? EV_READ : 0)\n\\&            | (fds [i].events & POLLOUT ? EV_WRITE : 0)));\n\\&\n\\&         fds [i].revents = 0;\n\\&         ev_io_start (loop, iow + i);\n\\&       }\n\\&   }\n\\&\n\\&   // stop all watchers after blocking\n\\&   static void\n\\&   adns_check_cb (struct ev_loop *loop, ev_check *w, int revents)\n\\&   {\n\\&     ev_timer_stop (loop, &tw);\n\\&\n\\&     for (int i = 0; i < nfd; ++i)\n\\&       {\n\\&         // set the relevant poll flags\n\\&         // could also call adns_processreadable etc. here\n\\&         struct pollfd *fd = fds + i;\n\\&         int revents = ev_clear_pending (iow + i);\n\\&         if (revents & EV_READ ) fd\\->revents |= fd\\->events & POLLIN;\n\\&         if (revents & EV_WRITE) fd\\->revents |= fd\\->events & POLLOUT;\n\\&\n\\&         // now stop the watcher\n\\&         ev_io_stop (loop, iow + i);\n\\&       }\n\\&\n\\&     adns_afterpoll (adns, fds, nfd, timeval_from (ev_now (loop));\n\\&   }\n.Ve\n.PP\nMethod 2: This would be just like method 1, but you run \\f(CW\\*(C`adns_afterpoll\\*(C'\\fR\nin the prepare watcher and would dispose of the check watcher.\n.PP\nMethod 3: If the module to be embedded supports explicit event\nnotification (libadns does), you can also make use of the actual watcher\ncallbacks, and only destroy/create the watchers in the prepare watcher.\n.PP\n.Vb 5\n\\&   static void\n\\&   timer_cb (EV_P_ ev_timer *w, int revents)\n\\&   {\n\\&     adns_state ads = (adns_state)w\\->data;\n\\&     update_now (EV_A);\n\\&\n\\&     adns_processtimeouts (ads, &tv_now);\n\\&   }\n\\&\n\\&   static void\n\\&   io_cb (EV_P_ ev_io *w, int revents)\n\\&   {\n\\&     adns_state ads = (adns_state)w\\->data;\n\\&     update_now (EV_A);\n\\&\n\\&     if (revents & EV_READ ) adns_processreadable  (ads, w\\->fd, &tv_now);\n\\&     if (revents & EV_WRITE) adns_processwriteable (ads, w\\->fd, &tv_now);\n\\&   }\n\\&\n\\&   // do not ever call adns_afterpoll\n.Ve\n.PP\nMethod 4: Do not use a prepare or check watcher because the module you\nwant to embed is not flexible enough to support it. Instead, you can\noverride their poll function. The drawback with this solution is that the\nmain loop is now no longer controllable by \\s-1EV.\\s0 The \\f(CW\\*(C`Glib::EV\\*(C'\\fR module uses\nthis approach, effectively embedding \\s-1EV\\s0 as a client into the horrible\nlibglib event loop.\n.PP\n.Vb 4\n\\&   static gint\n\\&   event_poll_func (GPollFD *fds, guint nfds, gint timeout)\n\\&   {\n\\&     int got_events = 0;\n\\&\n\\&     for (n = 0; n < nfds; ++n)\n\\&       // create/start io watcher that sets the relevant bits in fds[n] and increment got_events\n\\&\n\\&     if (timeout >= 0)\n\\&       // create/start timer\n\\&\n\\&     // poll\n\\&     ev_run (EV_A_ 0);\n\\&\n\\&     // stop timer again\n\\&     if (timeout >= 0)\n\\&       ev_timer_stop (EV_A_ &to);\n\\&\n\\&     // stop io watchers again \\- their callbacks should have set\n\\&     for (n = 0; n < nfds; ++n)\n\\&       ev_io_stop (EV_A_ iow [n]);\n\\&\n\\&     return got_events;\n\\&   }\n.Ve\n.ie n .SS \"\"\"ev_embed\"\" \\- when one backend isn't enough...\"\n.el .SS \"\\f(CWev_embed\\fP \\- when one backend isn't enough...\"\n.IX Subsection \"ev_embed - when one backend isn't enough...\"\nThis is a rather advanced watcher type that lets you embed one event loop\ninto another (currently only \\f(CW\\*(C`ev_io\\*(C'\\fR events are supported in the embedded\nloop, other types of watchers might be handled in a delayed or incorrect\nfashion and must not be used).\n.PP\nThere are primarily two reasons you would want that: work around bugs and\nprioritise I/O.\n.PP\nAs an example for a bug workaround, the kqueue backend might only support\nsockets on some platform, so it is unusable as generic backend, but you\nstill want to make use of it because you have many sockets and it scales\nso nicely. In this case, you would create a kqueue-based loop and embed\nit into your default loop (which might use e.g. poll). Overall operation\nwill be a bit slower because first libev has to call \\f(CW\\*(C`poll\\*(C'\\fR and then\n\\&\\f(CW\\*(C`kevent\\*(C'\\fR, but at least you can use both mechanisms for what they are\nbest: \\f(CW\\*(C`kqueue\\*(C'\\fR for scalable sockets and \\f(CW\\*(C`poll\\*(C'\\fR if you want it to work :)\n.PP\nAs for prioritising I/O: under rare circumstances you have the case where\nsome fds have to be watched and handled very quickly (with low latency),\nand even priorities and idle watchers might have too much overhead. In\nthis case you would put all the high priority stuff in one loop and all\nthe rest in a second one, and embed the second one in the first.\n.PP\nAs long as the watcher is active, the callback will be invoked every\ntime there might be events pending in the embedded loop. The callback\nmust then call \\f(CW\\*(C`ev_embed_sweep (mainloop, watcher)\\*(C'\\fR to make a single\nsweep and invoke their callbacks (the callback doesn't need to invoke the\n\\&\\f(CW\\*(C`ev_embed_sweep\\*(C'\\fR function directly, it could also start an idle watcher\nto give the embedded loop strictly lower priority for example).\n.PP\nYou can also set the callback to \\f(CW0\\fR, in which case the embed watcher\nwill automatically execute the embedded loop sweep whenever necessary.\n.PP\nFork detection will be handled transparently while the \\f(CW\\*(C`ev_embed\\*(C'\\fR watcher\nis active, i.e., the embedded loop will automatically be forked when the\nembedding loop forks. In other cases, the user is responsible for calling\n\\&\\f(CW\\*(C`ev_loop_fork\\*(C'\\fR on the embedded loop.\n.PP\nUnfortunately, not all backends are embeddable: only the ones returned by\n\\&\\f(CW\\*(C`ev_embeddable_backends\\*(C'\\fR are, which, unfortunately, does not include any\nportable one.\n.PP\nSo when you want to use this feature you will always have to be prepared\nthat you cannot get an embeddable loop. The recommended way to get around\nthis is to have a separate variables for your embeddable loop, try to\ncreate it, and if that fails, use the normal loop for everything.\n.PP\n\\fI\\f(CI\\*(C`ev_embed\\*(C'\\fI and fork\\fR\n.IX Subsection \"ev_embed and fork\"\n.PP\nWhile the \\f(CW\\*(C`ev_embed\\*(C'\\fR watcher is running, forks in the embedding loop will\nautomatically be applied to the embedded loop as well, so no special\nfork handling is required in that case. When the watcher is not running,\nhowever, it is still the task of the libev user to call \\f(CW\\*(C`ev_loop_fork ()\\*(C'\\fR\nas applicable.\n.PP\n\\fIWatcher-Specific Functions and Data Members\\fR\n.IX Subsection \"Watcher-Specific Functions and Data Members\"\n.IP \"ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)\" 4\n.IX Item \"ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)\"\n.PD 0\n.IP \"ev_embed_set (ev_embed *, struct ev_loop *embedded_loop)\" 4\n.IX Item \"ev_embed_set (ev_embed *, struct ev_loop *embedded_loop)\"\n.PD\nConfigures the watcher to embed the given loop, which must be\nembeddable. If the callback is \\f(CW0\\fR, then \\f(CW\\*(C`ev_embed_sweep\\*(C'\\fR will be\ninvoked automatically, otherwise it is the responsibility of the callback\nto invoke it (it will continue to be called until the sweep has been done,\nif you do not want that, you need to temporarily stop the embed watcher).\n.IP \"ev_embed_sweep (loop, ev_embed *)\" 4\n.IX Item \"ev_embed_sweep (loop, ev_embed *)\"\nMake a single, non-blocking sweep over the embedded loop. This works\nsimilarly to \\f(CW\\*(C`ev_run (embedded_loop, EVRUN_NOWAIT)\\*(C'\\fR, but in the most\nappropriate way for embedded loops.\n.IP \"struct ev_loop *other [read\\-only]\" 4\n.IX Item \"struct ev_loop *other [read-only]\"\nThe embedded event loop.\n.PP\n\\fIExamples\\fR\n.IX Subsection \"Examples\"\n.PP\nExample: Try to get an embeddable event loop and embed it into the default\nevent loop. If that is not possible, use the default loop. The default\nloop is stored in \\f(CW\\*(C`loop_hi\\*(C'\\fR, while the embeddable loop is stored in\n\\&\\f(CW\\*(C`loop_lo\\*(C'\\fR (which is \\f(CW\\*(C`loop_hi\\*(C'\\fR in the case no embeddable loop can be\nused).\n.PP\n.Vb 3\n\\&   struct ev_loop *loop_hi = ev_default_init (0);\n\\&   struct ev_loop *loop_lo = 0;\n\\&   ev_embed embed;\n\\&\n\\&   // see if there is a chance of getting one that works\n\\&   // (remember that a flags value of 0 means autodetection)\n\\&   loop_lo = ev_embeddable_backends () & ev_recommended_backends ()\n\\&     ? ev_loop_new (ev_embeddable_backends () & ev_recommended_backends ())\n\\&     : 0;\n\\&\n\\&   // if we got one, then embed it, otherwise default to loop_hi\n\\&   if (loop_lo)\n\\&     {\n\\&       ev_embed_init (&embed, 0, loop_lo);\n\\&       ev_embed_start (loop_hi, &embed);\n\\&     }\n\\&   else\n\\&     loop_lo = loop_hi;\n.Ve\n.PP\nExample: Check if kqueue is available but not recommended and create\na kqueue backend for use with sockets (which usually work with any\nkqueue implementation). Store the kqueue/socket\\-only event loop in\n\\&\\f(CW\\*(C`loop_socket\\*(C'\\fR. (One might optionally use \\f(CW\\*(C`EVFLAG_NOENV\\*(C'\\fR, too).\n.PP\n.Vb 3\n\\&   struct ev_loop *loop = ev_default_init (0);\n\\&   struct ev_loop *loop_socket = 0;\n\\&   ev_embed embed;\n\\&\n\\&   if (ev_supported_backends () & ~ev_recommended_backends () & EVBACKEND_KQUEUE)\n\\&     if ((loop_socket = ev_loop_new (EVBACKEND_KQUEUE))\n\\&       {\n\\&         ev_embed_init (&embed, 0, loop_socket);\n\\&         ev_embed_start (loop, &embed);\n\\&       }\n\\&\n\\&   if (!loop_socket)\n\\&     loop_socket = loop;\n\\&\n\\&   // now use loop_socket for all sockets, and loop for everything else\n.Ve\n.ie n .SS \"\"\"ev_fork\"\" \\- the audacity to resume the event loop after a fork\"\n.el .SS \"\\f(CWev_fork\\fP \\- the audacity to resume the event loop after a fork\"\n.IX Subsection \"ev_fork - the audacity to resume the event loop after a fork\"\nFork watchers are called when a \\f(CW\\*(C`fork ()\\*(C'\\fR was detected (usually because\nwhoever is a good citizen cared to tell libev about it by calling\n\\&\\f(CW\\*(C`ev_loop_fork\\*(C'\\fR). The invocation is done before the event loop blocks next\nand before \\f(CW\\*(C`ev_check\\*(C'\\fR watchers are being called, and only in the child\nafter the fork. If whoever good citizen calling \\f(CW\\*(C`ev_default_fork\\*(C'\\fR cheats\nand calls it in the wrong process, the fork handlers will be invoked, too,\nof course.\n.PP\n\\fIThe special problem of life after fork \\- how is it possible?\\fR\n.IX Subsection \"The special problem of life after fork - how is it possible?\"\n.PP\nMost uses of \\f(CW\\*(C`fork ()\\*(C'\\fR consist of forking, then some simple calls to set\nup/change the process environment, followed by a call to \\f(CW\\*(C`exec()\\*(C'\\fR. This\nsequence should be handled by libev without any problems.\n.PP\nThis changes when the application actually wants to do event handling\nin the child, or both parent in child, in effect \\*(L\"continuing\\*(R\" after the\nfork.\n.PP\nThe default mode of operation (for libev, with application help to detect\nforks) is to duplicate all the state in the child, as would be expected\nwhen \\fIeither\\fR the parent \\fIor\\fR the child process continues.\n.PP\nWhen both processes want to continue using libev, then this is usually the\nwrong result. In that case, usually one process (typically the parent) is\nsupposed to continue with all watchers in place as before, while the other\nprocess typically wants to start fresh, i.e. without any active watchers.\n.PP\nThe cleanest and most efficient way to achieve that with libev is to\nsimply create a new event loop, which of course will be \\*(L\"empty\\*(R\", and\nuse that for new watchers. This has the advantage of not touching more\nmemory than necessary, and thus avoiding the copy-on-write, and the\ndisadvantage of having to use multiple event loops (which do not support\nsignal watchers).\n.PP\nWhen this is not possible, or you want to use the default loop for\nother reasons, then in the process that wants to start \\*(L\"fresh\\*(R\", call\n\\&\\f(CW\\*(C`ev_loop_destroy (EV_DEFAULT)\\*(C'\\fR followed by \\f(CW\\*(C`ev_default_loop (...)\\*(C'\\fR.\nDestroying the default loop will \\*(L\"orphan\\*(R\" (not stop) all registered\nwatchers, so you have to be careful not to execute code that modifies\nthose watchers. Note also that in that case, you have to re-register any\nsignal watchers.\n.PP\n\\fIWatcher-Specific Functions and Data Members\\fR\n.IX Subsection \"Watcher-Specific Functions and Data Members\"\n.IP \"ev_fork_init (ev_fork *, callback)\" 4\n.IX Item \"ev_fork_init (ev_fork *, callback)\"\nInitialises and configures the fork watcher \\- it has no parameters of any\nkind. There is a \\f(CW\\*(C`ev_fork_set\\*(C'\\fR macro, but using it is utterly pointless,\nreally.\n.ie n .SS \"\"\"ev_cleanup\"\" \\- even the best things end\"\n.el .SS \"\\f(CWev_cleanup\\fP \\- even the best things end\"\n.IX Subsection \"ev_cleanup - even the best things end\"\nCleanup watchers are called just before the event loop is being destroyed\nby a call to \\f(CW\\*(C`ev_loop_destroy\\*(C'\\fR.\n.PP\nWhile there is no guarantee that the event loop gets destroyed, cleanup\nwatchers provide a convenient method to install cleanup hooks for your\nprogram, worker threads and so on \\- you just to make sure to destroy the\nloop when you want them to be invoked.\n.PP\nCleanup watchers are invoked in the same way as any other watcher. Unlike\nall other watchers, they do not keep a reference to the event loop (which\nmakes a lot of sense if you think about it). Like all other watchers, you\ncan call libev functions in the callback, except \\f(CW\\*(C`ev_cleanup_start\\*(C'\\fR.\n.PP\n\\fIWatcher-Specific Functions and Data Members\\fR\n.IX Subsection \"Watcher-Specific Functions and Data Members\"\n.IP \"ev_cleanup_init (ev_cleanup *, callback)\" 4\n.IX Item \"ev_cleanup_init (ev_cleanup *, callback)\"\nInitialises and configures the cleanup watcher \\- it has no parameters of\nany kind. There is a \\f(CW\\*(C`ev_cleanup_set\\*(C'\\fR macro, but using it is utterly\npointless, I assure you.\n.PP\nExample: Register an atexit handler to destroy the default loop, so any\ncleanup functions are called.\n.PP\n.Vb 5\n\\&   static void\n\\&   program_exits (void)\n\\&   {\n\\&     ev_loop_destroy (EV_DEFAULT_UC);\n\\&   }\n\\&\n\\&   ...\n\\&   atexit (program_exits);\n.Ve\n.ie n .SS \"\"\"ev_async\"\" \\- how to wake up an event loop\"\n.el .SS \"\\f(CWev_async\\fP \\- how to wake up an event loop\"\n.IX Subsection \"ev_async - how to wake up an event loop\"\nIn general, you cannot use an \\f(CW\\*(C`ev_loop\\*(C'\\fR from multiple threads or other\nasynchronous sources such as signal handlers (as opposed to multiple event\nloops \\- those are of course safe to use in different threads).\n.PP\nSometimes, however, you need to wake up an event loop you do not control,\nfor example because it belongs to another thread. This is what \\f(CW\\*(C`ev_async\\*(C'\\fR\nwatchers do: as long as the \\f(CW\\*(C`ev_async\\*(C'\\fR watcher is active, you can signal\nit by calling \\f(CW\\*(C`ev_async_send\\*(C'\\fR, which is thread\\- and signal safe.\n.PP\nThis functionality is very similar to \\f(CW\\*(C`ev_signal\\*(C'\\fR watchers, as signals,\ntoo, are asynchronous in nature, and signals, too, will be compressed\n(i.e. the number of callback invocations may be less than the number of\n\\&\\f(CW\\*(C`ev_async_send\\*(C'\\fR calls). In fact, you could use signal watchers as a kind\nof \\*(L\"global async watchers\\*(R\" by using a watcher on an otherwise unused\nsignal, and \\f(CW\\*(C`ev_feed_signal\\*(C'\\fR to signal this watcher from another thread,\neven without knowing which loop owns the signal.\n.PP\n\\fIQueueing\\fR\n.IX Subsection \"Queueing\"\n.PP\n\\&\\f(CW\\*(C`ev_async\\*(C'\\fR does not support queueing of data in any way. The reason\nis that the author does not know of a simple (or any) algorithm for a\nmultiple-writer-single-reader queue that works in all cases and doesn't\nneed elaborate support such as pthreads or unportable memory access\nsemantics.\n.PP\nThat means that if you want to queue data, you have to provide your own\nqueue. But at least I can tell you how to implement locking around your\nqueue:\n.IP \"queueing from a signal handler context\" 4\n.IX Item \"queueing from a signal handler context\"\nTo implement race-free queueing, you simply add to the queue in the signal\nhandler but you block the signal handler in the watcher callback. Here is\nan example that does that for some fictitious \\s-1SIGUSR1\\s0 handler:\n.Sp\n.Vb 1\n\\&   static ev_async mysig;\n\\&\n\\&   static void\n\\&   sigusr1_handler (void)\n\\&   {\n\\&     sometype data;\n\\&\n\\&     // no locking etc.\n\\&     queue_put (data);\n\\&     ev_async_send (EV_DEFAULT_ &mysig);\n\\&   }\n\\&\n\\&   static void\n\\&   mysig_cb (EV_P_ ev_async *w, int revents)\n\\&   {\n\\&     sometype data;\n\\&     sigset_t block, prev;\n\\&\n\\&     sigemptyset (&block);\n\\&     sigaddset (&block, SIGUSR1);\n\\&     sigprocmask (SIG_BLOCK, &block, &prev);\n\\&\n\\&     while (queue_get (&data))\n\\&       process (data);\n\\&\n\\&     if (sigismember (&prev, SIGUSR1)\n\\&       sigprocmask (SIG_UNBLOCK, &block, 0);\n\\&   }\n.Ve\n.Sp\n(Note: pthreads in theory requires you to use \\f(CW\\*(C`pthread_setmask\\*(C'\\fR\ninstead of \\f(CW\\*(C`sigprocmask\\*(C'\\fR when you use threads, but libev doesn't do it\neither...).\n.IP \"queueing from a thread context\" 4\n.IX Item \"queueing from a thread context\"\nThe strategy for threads is different, as you cannot (easily) block\nthreads but you can easily preempt them, so to queue safely you need to\nemploy a traditional mutex lock, such as in this pthread example:\n.Sp\n.Vb 2\n\\&   static ev_async mysig;\n\\&   static pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;\n\\&\n\\&   static void\n\\&   otherthread (void)\n\\&   {\n\\&     // only need to lock the actual queueing operation\n\\&     pthread_mutex_lock (&mymutex);\n\\&     queue_put (data);\n\\&     pthread_mutex_unlock (&mymutex);\n\\&\n\\&     ev_async_send (EV_DEFAULT_ &mysig);\n\\&   }\n\\&\n\\&   static void\n\\&   mysig_cb (EV_P_ ev_async *w, int revents)\n\\&   {\n\\&     pthread_mutex_lock (&mymutex);\n\\&\n\\&     while (queue_get (&data))\n\\&       process (data);\n\\&\n\\&     pthread_mutex_unlock (&mymutex);\n\\&   }\n.Ve\n.PP\n\\fIWatcher-Specific Functions and Data Members\\fR\n.IX Subsection \"Watcher-Specific Functions and Data Members\"\n.IP \"ev_async_init (ev_async *, callback)\" 4\n.IX Item \"ev_async_init (ev_async *, callback)\"\nInitialises and configures the async watcher \\- it has no parameters of any\nkind. There is a \\f(CW\\*(C`ev_async_set\\*(C'\\fR macro, but using it is utterly pointless,\ntrust me.\n.IP \"ev_async_send (loop, ev_async *)\" 4\n.IX Item \"ev_async_send (loop, ev_async *)\"\nSends/signals/activates the given \\f(CW\\*(C`ev_async\\*(C'\\fR watcher, that is, feeds\nan \\f(CW\\*(C`EV_ASYNC\\*(C'\\fR event on the watcher into the event loop, and instantly\nreturns.\n.Sp\nUnlike \\f(CW\\*(C`ev_feed_event\\*(C'\\fR, this call is safe to do from other threads,\nsignal or similar contexts (see the discussion of \\f(CW\\*(C`EV_ATOMIC_T\\*(C'\\fR in the\nembedding section below on what exactly this means).\n.Sp\nNote that, as with other watchers in libev, multiple events might get\ncompressed into a single callback invocation (another way to look at\nthis is that \\f(CW\\*(C`ev_async\\*(C'\\fR watchers are level-triggered: they are set on\n\\&\\f(CW\\*(C`ev_async_send\\*(C'\\fR, reset when the event loop detects that).\n.Sp\nThis call incurs the overhead of at most one extra system call per event\nloop iteration, if the event loop is blocked, and no syscall at all if\nthe event loop (or your program) is processing events. That means that\nrepeated calls are basically free (there is no need to avoid calls for\nperformance reasons) and that the overhead becomes smaller (typically\nzero) under load.\n.IP \"bool = ev_async_pending (ev_async *)\" 4\n.IX Item \"bool = ev_async_pending (ev_async *)\"\nReturns a non-zero value when \\f(CW\\*(C`ev_async_send\\*(C'\\fR has been called on the\nwatcher but the event has not yet been processed (or even noted) by the\nevent loop.\n.Sp\n\\&\\f(CW\\*(C`ev_async_send\\*(C'\\fR sets a flag in the watcher and wakes up the loop. When\nthe loop iterates next and checks for the watcher to have become active,\nit will reset the flag again. \\f(CW\\*(C`ev_async_pending\\*(C'\\fR can be used to very\nquickly check whether invoking the loop might be a good idea.\n.Sp\nNot that this does \\fInot\\fR check whether the watcher itself is pending,\nonly whether it has been requested to make this watcher pending: there\nis a time window between the event loop checking and resetting the async\nnotification, and the callback being invoked.\n.SH \"OTHER FUNCTIONS\"\n.IX Header \"OTHER FUNCTIONS\"\nThere are some other functions of possible interest. Described. Here. Now.\n.IP \"ev_once (loop, int fd, int events, ev_tstamp timeout, callback)\" 4\n.IX Item \"ev_once (loop, int fd, int events, ev_tstamp timeout, callback)\"\nThis function combines a simple timer and an I/O watcher, calls your\ncallback on whichever event happens first and automatically stops both\nwatchers. This is useful if you want to wait for a single event on an fd\nor timeout without having to allocate/configure/start/stop/free one or\nmore watchers yourself.\n.Sp\nIf \\f(CW\\*(C`fd\\*(C'\\fR is less than 0, then no I/O watcher will be started and the\n\\&\\f(CW\\*(C`events\\*(C'\\fR argument is being ignored. Otherwise, an \\f(CW\\*(C`ev_io\\*(C'\\fR watcher for\nthe given \\f(CW\\*(C`fd\\*(C'\\fR and \\f(CW\\*(C`events\\*(C'\\fR set will be created and started.\n.Sp\nIf \\f(CW\\*(C`timeout\\*(C'\\fR is less than 0, then no timeout watcher will be\nstarted. Otherwise an \\f(CW\\*(C`ev_timer\\*(C'\\fR watcher with after = \\f(CW\\*(C`timeout\\*(C'\\fR (and\nrepeat = 0) will be started. \\f(CW0\\fR is a valid timeout.\n.Sp\nThe callback has the type \\f(CW\\*(C`void (*cb)(int revents, void *arg)\\*(C'\\fR and is\npassed an \\f(CW\\*(C`revents\\*(C'\\fR set like normal event callbacks (a combination of\n\\&\\f(CW\\*(C`EV_ERROR\\*(C'\\fR, \\f(CW\\*(C`EV_READ\\*(C'\\fR, \\f(CW\\*(C`EV_WRITE\\*(C'\\fR or \\f(CW\\*(C`EV_TIMER\\*(C'\\fR) and the \\f(CW\\*(C`arg\\*(C'\\fR\nvalue passed to \\f(CW\\*(C`ev_once\\*(C'\\fR. Note that it is possible to receive \\fIboth\\fR\na timeout and an io event at the same time \\- you probably should give io\nevents precedence.\n.Sp\nExample: wait up to ten seconds for data to appear on \\s-1STDIN_FILENO.\\s0\n.Sp\n.Vb 7\n\\&   static void stdin_ready (int revents, void *arg)\n\\&   {\n\\&     if (revents & EV_READ)\n\\&       /* stdin might have data for us, joy! */;\n\\&     else if (revents & EV_TIMER)\n\\&       /* doh, nothing entered */;\n\\&   }\n\\&\n\\&   ev_once (STDIN_FILENO, EV_READ, 10., stdin_ready, 0);\n.Ve\n.IP \"ev_feed_fd_event (loop, int fd, int revents)\" 4\n.IX Item \"ev_feed_fd_event (loop, int fd, int revents)\"\nFeed an event on the given fd, as if a file descriptor backend detected\nthe given events.\n.IP \"ev_feed_signal_event (loop, int signum)\" 4\n.IX Item \"ev_feed_signal_event (loop, int signum)\"\nFeed an event as if the given signal occurred. See also \\f(CW\\*(C`ev_feed_signal\\*(C'\\fR,\nwhich is async-safe.\n.SH \"COMMON OR USEFUL IDIOMS (OR BOTH)\"\n.IX Header \"COMMON OR USEFUL IDIOMS (OR BOTH)\"\nThis section explains some common idioms that are not immediately\nobvious. Note that examples are sprinkled over the whole manual, and this\nsection only contains stuff that wouldn't fit anywhere else.\n.SS \"\\s-1ASSOCIATING CUSTOM DATA WITH A WATCHER\\s0\"\n.IX Subsection \"ASSOCIATING CUSTOM DATA WITH A WATCHER\"\nEach watcher has, by default, a \\f(CW\\*(C`void *data\\*(C'\\fR member that you can read\nor modify at any time: libev will completely ignore it. This can be used\nto associate arbitrary data with your watcher. If you need more data and\ndon't want to allocate memory separately and store a pointer to it in that\ndata member, you can also \\*(L\"subclass\\*(R\" the watcher type and provide your own\ndata:\n.PP\n.Vb 7\n\\&   struct my_io\n\\&   {\n\\&     ev_io io;\n\\&     int otherfd;\n\\&     void *somedata;\n\\&     struct whatever *mostinteresting;\n\\&   };\n\\&\n\\&   ...\n\\&   struct my_io w;\n\\&   ev_io_init (&w.io, my_cb, fd, EV_READ);\n.Ve\n.PP\nAnd since your callback will be called with a pointer to the watcher, you\ncan cast it back to your own type:\n.PP\n.Vb 5\n\\&   static void my_cb (struct ev_loop *loop, ev_io *w_, int revents)\n\\&   {\n\\&     struct my_io *w = (struct my_io *)w_;\n\\&     ...\n\\&   }\n.Ve\n.PP\nMore interesting and less C\\-conformant ways of casting your callback\nfunction type instead have been omitted.\n.SS \"\\s-1BUILDING YOUR OWN COMPOSITE WATCHERS\\s0\"\n.IX Subsection \"BUILDING YOUR OWN COMPOSITE WATCHERS\"\nAnother common scenario is to use some data structure with multiple\nembedded watchers, in effect creating your own watcher that combines\nmultiple libev event sources into one \\*(L\"super-watcher\\*(R\":\n.PP\n.Vb 6\n\\&   struct my_biggy\n\\&   {\n\\&     int some_data;\n\\&     ev_timer t1;\n\\&     ev_timer t2;\n\\&   }\n.Ve\n.PP\nIn this case getting the pointer to \\f(CW\\*(C`my_biggy\\*(C'\\fR is a bit more\ncomplicated: Either you store the address of your \\f(CW\\*(C`my_biggy\\*(C'\\fR struct in\nthe \\f(CW\\*(C`data\\*(C'\\fR member of the watcher (for woozies or \\*(C+ coders), or you need\nto use some pointer arithmetic using \\f(CW\\*(C`offsetof\\*(C'\\fR inside your watchers (for\nreal programmers):\n.PP\n.Vb 1\n\\&   #include <stddef.h>\n\\&\n\\&   static void\n\\&   t1_cb (EV_P_ ev_timer *w, int revents)\n\\&   {\n\\&     struct my_biggy big = (struct my_biggy *)\n\\&       (((char *)w) \\- offsetof (struct my_biggy, t1));\n\\&   }\n\\&\n\\&   static void\n\\&   t2_cb (EV_P_ ev_timer *w, int revents)\n\\&   {\n\\&     struct my_biggy big = (struct my_biggy *)\n\\&       (((char *)w) \\- offsetof (struct my_biggy, t2));\n\\&   }\n.Ve\n.SS \"\\s-1AVOIDING FINISHING BEFORE RETURNING\\s0\"\n.IX Subsection \"AVOIDING FINISHING BEFORE RETURNING\"\nOften you have structures like this in event-based programs:\n.PP\n.Vb 4\n\\&  callback ()\n\\&  {\n\\&    free (request);\n\\&  }\n\\&\n\\&  request = start_new_request (..., callback);\n.Ve\n.PP\nThe intent is to start some \\*(L\"lengthy\\*(R\" operation. The \\f(CW\\*(C`request\\*(C'\\fR could be\nused to cancel the operation, or do other things with it.\n.PP\nIt's not uncommon to have code paths in \\f(CW\\*(C`start_new_request\\*(C'\\fR that\nimmediately invoke the callback, for example, to report errors. Or you add\nsome caching layer that finds that it can skip the lengthy aspects of the\noperation and simply invoke the callback with the result.\n.PP\nThe problem here is that this will happen \\fIbefore\\fR \\f(CW\\*(C`start_new_request\\*(C'\\fR\nhas returned, so \\f(CW\\*(C`request\\*(C'\\fR is not set.\n.PP\nEven if you pass the request by some safer means to the callback, you\nmight want to do something to the request after starting it, such as\ncanceling it, which probably isn't working so well when the callback has\nalready been invoked.\n.PP\nA common way around all these issues is to make sure that\n\\&\\f(CW\\*(C`start_new_request\\*(C'\\fR \\fIalways\\fR returns before the callback is invoked. If\n\\&\\f(CW\\*(C`start_new_request\\*(C'\\fR immediately knows the result, it can artificially\ndelay invoking the callback by using a \\f(CW\\*(C`prepare\\*(C'\\fR or \\f(CW\\*(C`idle\\*(C'\\fR watcher for\nexample, or more sneakily, by reusing an existing (stopped) watcher and\npushing it into the pending queue:\n.PP\n.Vb 2\n\\&   ev_set_cb (watcher, callback);\n\\&   ev_feed_event (EV_A_ watcher, 0);\n.Ve\n.PP\nThis way, \\f(CW\\*(C`start_new_request\\*(C'\\fR can safely return before the callback is\ninvoked, while not delaying callback invocation too much.\n.SS \"\\s-1MODEL/NESTED EVENT LOOP INVOCATIONS AND EXIT CONDITIONS\\s0\"\n.IX Subsection \"MODEL/NESTED EVENT LOOP INVOCATIONS AND EXIT CONDITIONS\"\nOften (especially in \\s-1GUI\\s0 toolkits) there are places where you have\n\\&\\fImodal\\fR interaction, which is most easily implemented by recursively\ninvoking \\f(CW\\*(C`ev_run\\*(C'\\fR.\n.PP\nThis brings the problem of exiting \\- a callback might want to finish the\nmain \\f(CW\\*(C`ev_run\\*(C'\\fR call, but not the nested one (e.g. user clicked \\*(L\"Quit\\*(R\", but\na modal \\*(L\"Are you sure?\\*(R\" dialog is still waiting), or just the nested one\nand not the main one (e.g. user clocked \\*(L\"Ok\\*(R\" in a modal dialog), or some\nother combination: In these cases, a simple \\f(CW\\*(C`ev_break\\*(C'\\fR will not work.\n.PP\nThe solution is to maintain \\*(L\"break this loop\\*(R\" variable for each \\f(CW\\*(C`ev_run\\*(C'\\fR\ninvocation, and use a loop around \\f(CW\\*(C`ev_run\\*(C'\\fR until the condition is\ntriggered, using \\f(CW\\*(C`EVRUN_ONCE\\*(C'\\fR:\n.PP\n.Vb 2\n\\&   // main loop\n\\&   int exit_main_loop = 0;\n\\&\n\\&   while (!exit_main_loop)\n\\&     ev_run (EV_DEFAULT_ EVRUN_ONCE);\n\\&\n\\&   // in a modal watcher\n\\&   int exit_nested_loop = 0;\n\\&\n\\&   while (!exit_nested_loop)\n\\&     ev_run (EV_A_ EVRUN_ONCE);\n.Ve\n.PP\nTo exit from any of these loops, just set the corresponding exit variable:\n.PP\n.Vb 2\n\\&   // exit modal loop\n\\&   exit_nested_loop = 1;\n\\&\n\\&   // exit main program, after modal loop is finished\n\\&   exit_main_loop = 1;\n\\&\n\\&   // exit both\n\\&   exit_main_loop = exit_nested_loop = 1;\n.Ve\n.SS \"\\s-1THREAD LOCKING EXAMPLE\\s0\"\n.IX Subsection \"THREAD LOCKING EXAMPLE\"\nHere is a fictitious example of how to run an event loop in a different\nthread from where callbacks are being invoked and watchers are\ncreated/added/removed.\n.PP\nFor a real-world example, see the \\f(CW\\*(C`EV::Loop::Async\\*(C'\\fR perl module,\nwhich uses exactly this technique (which is suited for many high-level\nlanguages).\n.PP\nThe example uses a pthread mutex to protect the loop data, a condition\nvariable to wait for callback invocations, an async watcher to notify the\nevent loop thread and an unspecified mechanism to wake up the main thread.\n.PP\nFirst, you need to associate some data with the event loop:\n.PP\n.Vb 6\n\\&   typedef struct {\n\\&     mutex_t lock; /* global loop lock */\n\\&     ev_async async_w;\n\\&     thread_t tid;\n\\&     cond_t invoke_cv;\n\\&   } userdata;\n\\&\n\\&   void prepare_loop (EV_P)\n\\&   {\n\\&      // for simplicity, we use a static userdata struct.\n\\&      static userdata u;\n\\&\n\\&      ev_async_init (&u\\->async_w, async_cb);\n\\&      ev_async_start (EV_A_ &u\\->async_w);\n\\&\n\\&      pthread_mutex_init (&u\\->lock, 0);\n\\&      pthread_cond_init (&u\\->invoke_cv, 0);\n\\&\n\\&      // now associate this with the loop\n\\&      ev_set_userdata (EV_A_ u);\n\\&      ev_set_invoke_pending_cb (EV_A_ l_invoke);\n\\&      ev_set_loop_release_cb (EV_A_ l_release, l_acquire);\n\\&\n\\&      // then create the thread running ev_run\n\\&      pthread_create (&u\\->tid, 0, l_run, EV_A);\n\\&   }\n.Ve\n.PP\nThe callback for the \\f(CW\\*(C`ev_async\\*(C'\\fR watcher does nothing: the watcher is used\nsolely to wake up the event loop so it takes notice of any new watchers\nthat might have been added:\n.PP\n.Vb 5\n\\&   static void\n\\&   async_cb (EV_P_ ev_async *w, int revents)\n\\&   {\n\\&      // just used for the side effects\n\\&   }\n.Ve\n.PP\nThe \\f(CW\\*(C`l_release\\*(C'\\fR and \\f(CW\\*(C`l_acquire\\*(C'\\fR callbacks simply unlock/lock the mutex\nprotecting the loop data, respectively.\n.PP\n.Vb 6\n\\&   static void\n\\&   l_release (EV_P)\n\\&   {\n\\&     userdata *u = ev_userdata (EV_A);\n\\&     pthread_mutex_unlock (&u\\->lock);\n\\&   }\n\\&\n\\&   static void\n\\&   l_acquire (EV_P)\n\\&   {\n\\&     userdata *u = ev_userdata (EV_A);\n\\&     pthread_mutex_lock (&u\\->lock);\n\\&   }\n.Ve\n.PP\nThe event loop thread first acquires the mutex, and then jumps straight\ninto \\f(CW\\*(C`ev_run\\*(C'\\fR:\n.PP\n.Vb 4\n\\&   void *\n\\&   l_run (void *thr_arg)\n\\&   {\n\\&     struct ev_loop *loop = (struct ev_loop *)thr_arg;\n\\&\n\\&     l_acquire (EV_A);\n\\&     pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, 0);\n\\&     ev_run (EV_A_ 0);\n\\&     l_release (EV_A);\n\\&\n\\&     return 0;\n\\&   }\n.Ve\n.PP\nInstead of invoking all pending watchers, the \\f(CW\\*(C`l_invoke\\*(C'\\fR callback will\nsignal the main thread via some unspecified mechanism (signals? pipe\nwrites? \\f(CW\\*(C`Async::Interrupt\\*(C'\\fR?) and then waits until all pending watchers\nhave been called (in a while loop because a) spurious wakeups are possible\nand b) skipping inter-thread-communication when there are no pending\nwatchers is very beneficial):\n.PP\n.Vb 4\n\\&   static void\n\\&   l_invoke (EV_P)\n\\&   {\n\\&     userdata *u = ev_userdata (EV_A);\n\\&\n\\&     while (ev_pending_count (EV_A))\n\\&       {\n\\&         wake_up_other_thread_in_some_magic_or_not_so_magic_way ();\n\\&         pthread_cond_wait (&u\\->invoke_cv, &u\\->lock);\n\\&       }\n\\&   }\n.Ve\n.PP\nNow, whenever the main thread gets told to invoke pending watchers, it\nwill grab the lock, call \\f(CW\\*(C`ev_invoke_pending\\*(C'\\fR and then signal the loop\nthread to continue:\n.PP\n.Vb 4\n\\&   static void\n\\&   real_invoke_pending (EV_P)\n\\&   {\n\\&     userdata *u = ev_userdata (EV_A);\n\\&\n\\&     pthread_mutex_lock (&u\\->lock);\n\\&     ev_invoke_pending (EV_A);\n\\&     pthread_cond_signal (&u\\->invoke_cv);\n\\&     pthread_mutex_unlock (&u\\->lock);\n\\&   }\n.Ve\n.PP\nWhenever you want to start/stop a watcher or do other modifications to an\nevent loop, you will now have to lock:\n.PP\n.Vb 2\n\\&   ev_timer timeout_watcher;\n\\&   userdata *u = ev_userdata (EV_A);\n\\&\n\\&   ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.);\n\\&\n\\&   pthread_mutex_lock (&u\\->lock);\n\\&   ev_timer_start (EV_A_ &timeout_watcher);\n\\&   ev_async_send (EV_A_ &u\\->async_w);\n\\&   pthread_mutex_unlock (&u\\->lock);\n.Ve\n.PP\nNote that sending the \\f(CW\\*(C`ev_async\\*(C'\\fR watcher is required because otherwise\nan event loop currently blocking in the kernel will have no knowledge\nabout the newly added timer. By waking up the loop it will pick up any new\nwatchers in the next event loop iteration.\n.SS \"\\s-1THREADS, COROUTINES, CONTINUATIONS, QUEUES... INSTEAD OF CALLBACKS\\s0\"\n.IX Subsection \"THREADS, COROUTINES, CONTINUATIONS, QUEUES... INSTEAD OF CALLBACKS\"\nWhile the overhead of a callback that e.g. schedules a thread is small, it\nis still an overhead. If you embed libev, and your main usage is with some\nkind of threads or coroutines, you might want to customise libev so that\ndoesn't need callbacks anymore.\n.PP\nImagine you have coroutines that you can switch to using a function\n\\&\\f(CW\\*(C`switch_to (coro)\\*(C'\\fR, that libev runs in a coroutine called \\f(CW\\*(C`libev_coro\\*(C'\\fR\nand that due to some magic, the currently active coroutine is stored in a\nglobal called \\f(CW\\*(C`current_coro\\*(C'\\fR. Then you can build your own \\*(L\"wait for libev\nevent\\*(R\" primitive by changing \\f(CW\\*(C`EV_CB_DECLARE\\*(C'\\fR and \\f(CW\\*(C`EV_CB_INVOKE\\*(C'\\fR (note\nthe differing \\f(CW\\*(C`;\\*(C'\\fR conventions):\n.PP\n.Vb 2\n\\&   #define EV_CB_DECLARE(type)   struct my_coro *cb;\n\\&   #define EV_CB_INVOKE(watcher) switch_to ((watcher)\\->cb)\n.Ve\n.PP\nThat means instead of having a C callback function, you store the\ncoroutine to switch to in each watcher, and instead of having libev call\nyour callback, you instead have it switch to that coroutine.\n.PP\nA coroutine might now wait for an event with a function called\n\\&\\f(CW\\*(C`wait_for_event\\*(C'\\fR. (the watcher needs to be started, as always, but it doesn't\nmatter when, or whether the watcher is active or not when this function is\ncalled):\n.PP\n.Vb 6\n\\&   void\n\\&   wait_for_event (ev_watcher *w)\n\\&   {\n\\&     ev_set_cb (w, current_coro);\n\\&     switch_to (libev_coro);\n\\&   }\n.Ve\n.PP\nThat basically suspends the coroutine inside \\f(CW\\*(C`wait_for_event\\*(C'\\fR and\ncontinues the libev coroutine, which, when appropriate, switches back to\nthis or any other coroutine.\n.PP\nYou can do similar tricks if you have, say, threads with an event queue \\-\ninstead of storing a coroutine, you store the queue object and instead of\nswitching to a coroutine, you push the watcher onto the queue and notify\nany waiters.\n.PP\nTo embed libev, see \\*(L\"\\s-1EMBEDDING\\*(R\"\\s0, but in short, it's easiest to create two\nfiles, \\fImy_ev.h\\fR and \\fImy_ev.c\\fR that include the respective libev files:\n.PP\n.Vb 4\n\\&   // my_ev.h\n\\&   #define EV_CB_DECLARE(type)   struct my_coro *cb;\n\\&   #define EV_CB_INVOKE(watcher) switch_to ((watcher)\\->cb)\n\\&   #include \"../libev/ev.h\"\n\\&\n\\&   // my_ev.c\n\\&   #define EV_H \"my_ev.h\"\n\\&   #include \"../libev/ev.c\"\n.Ve\n.PP\nAnd then use \\fImy_ev.h\\fR when you would normally use \\fIev.h\\fR, and compile\n\\&\\fImy_ev.c\\fR into your project. When properly specifying include paths, you\ncan even use \\fIev.h\\fR as header file name directly.\n.SH \"LIBEVENT EMULATION\"\n.IX Header \"LIBEVENT EMULATION\"\nLibev offers a compatibility emulation layer for libevent. It cannot\nemulate the internals of libevent, so here are some usage hints:\n.IP \"\\(bu\" 4\nOnly the libevent\\-1.4.1\\-beta \\s-1API\\s0 is being emulated.\n.Sp\nThis was the newest libevent version available when libev was implemented,\nand is still mostly unchanged in 2010.\n.IP \"\\(bu\" 4\nUse it by including <event.h>, as usual.\n.IP \"\\(bu\" 4\nThe following members are fully supported: ev_base, ev_callback,\nev_arg, ev_fd, ev_res, ev_events.\n.IP \"\\(bu\" 4\nAvoid using ev_flags and the EVLIST_*\\-macros, while it is\nmaintained by libev, it does not work exactly the same way as in libevent (consider\nit a private \\s-1API\\s0).\n.IP \"\\(bu\" 4\nPriorities are not currently supported. Initialising priorities\nwill fail and all watchers will have the same priority, even though there\nis an ev_pri field.\n.IP \"\\(bu\" 4\nIn libevent, the last base created gets the signals, in libev, the\nbase that registered the signal gets the signals.\n.IP \"\\(bu\" 4\nOther members are not supported.\n.IP \"\\(bu\" 4\nThe libev emulation is \\fInot\\fR \\s-1ABI\\s0 compatible to libevent, you need\nto use the libev header file and library.\n.SH \"\\*(C+ SUPPORT\"\n.IX Header \" SUPPORT\"\n.SS \"C \\s-1API\\s0\"\n.IX Subsection \"C API\"\nThe normal C \\s-1API\\s0 should work fine when used from \\*(C+: both ev.h and the\nlibev sources can be compiled as \\*(C+. Therefore, code that uses the C \\s-1API\\s0\nwill work fine.\n.PP\nProper exception specifications might have to be added to callbacks passed\nto libev: exceptions may be thrown only from watcher callbacks, all\nother callbacks (allocator, syserr, loop acquire/release and periodic\nreschedule callbacks) must not throw exceptions, and might need a \\f(CW\\*(C`throw\n()\\*(C'\\fR specification. If you have code that needs to be compiled as both C\nand \\*(C+ you can use the \\f(CW\\*(C`EV_THROW\\*(C'\\fR macro for this:\n.PP\n.Vb 6\n\\&   static void\n\\&   fatal_error (const char *msg) EV_THROW\n\\&   {\n\\&     perror (msg);\n\\&     abort ();\n\\&   }\n\\&\n\\&   ...\n\\&   ev_set_syserr_cb (fatal_error);\n.Ve\n.PP\nThe only \\s-1API\\s0 functions that can currently throw exceptions are \\f(CW\\*(C`ev_run\\*(C'\\fR,\n\\&\\f(CW\\*(C`ev_invoke\\*(C'\\fR, \\f(CW\\*(C`ev_invoke_pending\\*(C'\\fR and \\f(CW\\*(C`ev_loop_destroy\\*(C'\\fR (the latter\nbecause it runs cleanup watchers).\n.PP\nThrowing exceptions in watcher callbacks is only supported if libev itself\nis compiled with a \\*(C+ compiler or your C and \\*(C+ environments allow\nthrowing exceptions through C libraries (most do).\n.SS \"\\*(C+ \\s-1API\\s0\"\n.IX Subsection \" API\"\nLibev comes with some simplistic wrapper classes for \\*(C+ that mainly allow\nyou to use some convenience methods to start/stop watchers and also change\nthe callback model to a model using method callbacks on objects.\n.PP\nTo use it,\n.PP\n.Vb 1\n\\&   #include <ev++.h>\n.Ve\n.PP\nThis automatically includes \\fIev.h\\fR and puts all of its definitions (many\nof them macros) into the global namespace. All \\*(C+ specific things are\nput into the \\f(CW\\*(C`ev\\*(C'\\fR namespace. It should support all the same embedding\noptions as \\fIev.h\\fR, most notably \\f(CW\\*(C`EV_MULTIPLICITY\\*(C'\\fR.\n.PP\nCare has been taken to keep the overhead low. The only data member the \\*(C+\nclasses add (compared to plain C\\-style watchers) is the event loop pointer\nthat the watcher is associated with (or no additional members at all if\nyou disable \\f(CW\\*(C`EV_MULTIPLICITY\\*(C'\\fR when embedding libev).\n.PP\nCurrently, functions, static and non-static member functions and classes\nwith \\f(CW\\*(C`operator ()\\*(C'\\fR can be used as callbacks. Other types should be easy\nto add as long as they only need one additional pointer for context. If\nyou need support for other types of functors please contact the author\n(preferably after implementing it).\n.PP\nFor all this to work, your \\*(C+ compiler either has to use the same calling\nconventions as your C compiler (for static member functions), or you have\nto embed libev and compile libev itself as \\*(C+.\n.PP\nHere is a list of things available in the \\f(CW\\*(C`ev\\*(C'\\fR namespace:\n.ie n .IP \"\"\"ev::READ\"\", \"\"ev::WRITE\"\" etc.\" 4\n.el .IP \"\\f(CWev::READ\\fR, \\f(CWev::WRITE\\fR etc.\" 4\n.IX Item \"ev::READ, ev::WRITE etc.\"\nThese are just enum values with the same values as the \\f(CW\\*(C`EV_READ\\*(C'\\fR etc.\nmacros from \\fIev.h\\fR.\n.ie n .IP \"\"\"ev::tstamp\"\", \"\"ev::now\"\"\" 4\n.el .IP \"\\f(CWev::tstamp\\fR, \\f(CWev::now\\fR\" 4\n.IX Item \"ev::tstamp, ev::now\"\nAliases to the same types/functions as with the \\f(CW\\*(C`ev_\\*(C'\\fR prefix.\n.ie n .IP \"\"\"ev::io\"\", \"\"ev::timer\"\", \"\"ev::periodic\"\", \"\"ev::idle\"\", \"\"ev::sig\"\" etc.\" 4\n.el .IP \"\\f(CWev::io\\fR, \\f(CWev::timer\\fR, \\f(CWev::periodic\\fR, \\f(CWev::idle\\fR, \\f(CWev::sig\\fR etc.\" 4\n.IX Item \"ev::io, ev::timer, ev::periodic, ev::idle, ev::sig etc.\"\nFor each \\f(CW\\*(C`ev_TYPE\\*(C'\\fR watcher in \\fIev.h\\fR there is a corresponding class of\nthe same name in the \\f(CW\\*(C`ev\\*(C'\\fR namespace, with the exception of \\f(CW\\*(C`ev_signal\\*(C'\\fR\nwhich is called \\f(CW\\*(C`ev::sig\\*(C'\\fR to avoid clashes with the \\f(CW\\*(C`signal\\*(C'\\fR macro\ndefined by many implementations.\n.Sp\nAll of those classes have these methods:\n.RS 4\n.IP \"ev::TYPE::TYPE ()\" 4\n.IX Item \"ev::TYPE::TYPE ()\"\n.PD 0\n.IP \"ev::TYPE::TYPE (loop)\" 4\n.IX Item \"ev::TYPE::TYPE (loop)\"\n.IP \"ev::TYPE::~TYPE\" 4\n.IX Item \"ev::TYPE::~TYPE\"\n.PD\nThe constructor (optionally) takes an event loop to associate the watcher\nwith. If it is omitted, it will use \\f(CW\\*(C`EV_DEFAULT\\*(C'\\fR.\n.Sp\nThe constructor calls \\f(CW\\*(C`ev_init\\*(C'\\fR for you, which means you have to call the\n\\&\\f(CW\\*(C`set\\*(C'\\fR method before starting it.\n.Sp\nIt will not set a callback, however: You have to call the templated \\f(CW\\*(C`set\\*(C'\\fR\nmethod to set a callback before you can start the watcher.\n.Sp\n(The reason why you have to use a method is a limitation in \\*(C+ which does\nnot allow explicit template arguments for constructors).\n.Sp\nThe destructor automatically stops the watcher if it is active.\n.IP \"w\\->set<class, &class::method> (object *)\" 4\n.IX Item \"w->set<class, &class::method> (object *)\"\nThis method sets the callback method to call. The method has to have a\nsignature of \\f(CW\\*(C`void (*)(ev_TYPE &, int)\\*(C'\\fR, it receives the watcher as\nfirst argument and the \\f(CW\\*(C`revents\\*(C'\\fR as second. The object must be given as\nparameter and is stored in the \\f(CW\\*(C`data\\*(C'\\fR member of the watcher.\n.Sp\nThis method synthesizes efficient thunking code to call your method from\nthe C callback that libev requires. If your compiler can inline your\ncallback (i.e. it is visible to it at the place of the \\f(CW\\*(C`set\\*(C'\\fR call and\nyour compiler is good :), then the method will be fully inlined into the\nthunking function, making it as fast as a direct C callback.\n.Sp\nExample: simple class declaration and watcher initialisation\n.Sp\n.Vb 4\n\\&   struct myclass\n\\&   {\n\\&     void io_cb (ev::io &w, int revents) { }\n\\&   }\n\\&\n\\&   myclass obj;\n\\&   ev::io iow;\n\\&   iow.set <myclass, &myclass::io_cb> (&obj);\n.Ve\n.IP \"w\\->set (object *)\" 4\n.IX Item \"w->set (object *)\"\nThis is a variation of a method callback \\- leaving out the method to call\nwill default the method to \\f(CW\\*(C`operator ()\\*(C'\\fR, which makes it possible to use\nfunctor objects without having to manually specify the \\f(CW\\*(C`operator ()\\*(C'\\fR all\nthe time. Incidentally, you can then also leave out the template argument\nlist.\n.Sp\nThe \\f(CW\\*(C`operator ()\\*(C'\\fR method prototype must be \\f(CW\\*(C`void operator ()(watcher &w,\nint revents)\\*(C'\\fR.\n.Sp\nSee the method\\-\\f(CW\\*(C`set\\*(C'\\fR above for more details.\n.Sp\nExample: use a functor object as callback.\n.Sp\n.Vb 7\n\\&   struct myfunctor\n\\&   {\n\\&     void operator() (ev::io &w, int revents)\n\\&     {\n\\&       ...\n\\&     }\n\\&   }\n\\&\n\\&   myfunctor f;\n\\&\n\\&   ev::io w;\n\\&   w.set (&f);\n.Ve\n.IP \"w\\->set<function> (void *data = 0)\" 4\n.IX Item \"w->set<function> (void *data = 0)\"\nAlso sets a callback, but uses a static method or plain function as\ncallback. The optional \\f(CW\\*(C`data\\*(C'\\fR argument will be stored in the watcher's\n\\&\\f(CW\\*(C`data\\*(C'\\fR member and is free for you to use.\n.Sp\nThe prototype of the \\f(CW\\*(C`function\\*(C'\\fR must be \\f(CW\\*(C`void (*)(ev::TYPE &w, int)\\*(C'\\fR.\n.Sp\nSee the method\\-\\f(CW\\*(C`set\\*(C'\\fR above for more details.\n.Sp\nExample: Use a plain function as callback.\n.Sp\n.Vb 2\n\\&   static void io_cb (ev::io &w, int revents) { }\n\\&   iow.set <io_cb> ();\n.Ve\n.IP \"w\\->set (loop)\" 4\n.IX Item \"w->set (loop)\"\nAssociates a different \\f(CW\\*(C`struct ev_loop\\*(C'\\fR with this watcher. You can only\ndo this when the watcher is inactive (and not pending either).\n.IP \"w\\->set ([arguments])\" 4\n.IX Item \"w->set ([arguments])\"\nBasically the same as \\f(CW\\*(C`ev_TYPE_set\\*(C'\\fR (except for \\f(CW\\*(C`ev::embed\\*(C'\\fR watchers>),\nwith the same arguments. Either this method or a suitable start method\nmust be called at least once. Unlike the C counterpart, an active watcher\ngets automatically stopped and restarted when reconfiguring it with this\nmethod.\n.Sp\nFor \\f(CW\\*(C`ev::embed\\*(C'\\fR watchers this method is called \\f(CW\\*(C`set_embed\\*(C'\\fR, to avoid\nclashing with the \\f(CW\\*(C`set (loop)\\*(C'\\fR method.\n.IP \"w\\->start ()\" 4\n.IX Item \"w->start ()\"\nStarts the watcher. Note that there is no \\f(CW\\*(C`loop\\*(C'\\fR argument, as the\nconstructor already stores the event loop.\n.IP \"w\\->start ([arguments])\" 4\n.IX Item \"w->start ([arguments])\"\nInstead of calling \\f(CW\\*(C`set\\*(C'\\fR and \\f(CW\\*(C`start\\*(C'\\fR methods separately, it is often\nconvenient to wrap them in one call. Uses the same type of arguments as\nthe configure \\f(CW\\*(C`set\\*(C'\\fR method of the watcher.\n.IP \"w\\->stop ()\" 4\n.IX Item \"w->stop ()\"\nStops the watcher if it is active. Again, no \\f(CW\\*(C`loop\\*(C'\\fR argument.\n.ie n .IP \"w\\->again () (\"\"ev::timer\"\", \"\"ev::periodic\"\" only)\" 4\n.el .IP \"w\\->again () (\\f(CWev::timer\\fR, \\f(CWev::periodic\\fR only)\" 4\n.IX Item \"w->again () (ev::timer, ev::periodic only)\"\nFor \\f(CW\\*(C`ev::timer\\*(C'\\fR and \\f(CW\\*(C`ev::periodic\\*(C'\\fR, this invokes the corresponding\n\\&\\f(CW\\*(C`ev_TYPE_again\\*(C'\\fR function.\n.ie n .IP \"w\\->sweep () (\"\"ev::embed\"\" only)\" 4\n.el .IP \"w\\->sweep () (\\f(CWev::embed\\fR only)\" 4\n.IX Item \"w->sweep () (ev::embed only)\"\nInvokes \\f(CW\\*(C`ev_embed_sweep\\*(C'\\fR.\n.ie n .IP \"w\\->update () (\"\"ev::stat\"\" only)\" 4\n.el .IP \"w\\->update () (\\f(CWev::stat\\fR only)\" 4\n.IX Item \"w->update () (ev::stat only)\"\nInvokes \\f(CW\\*(C`ev_stat_stat\\*(C'\\fR.\n.RE\n.RS 4\n.RE\n.PP\nExample: Define a class with two I/O and idle watchers, start the I/O\nwatchers in the constructor.\n.PP\n.Vb 5\n\\&   class myclass\n\\&   {\n\\&     ev::io   io  ; void io_cb   (ev::io   &w, int revents);\n\\&     ev::io   io2 ; void io2_cb  (ev::io   &w, int revents);\n\\&     ev::idle idle; void idle_cb (ev::idle &w, int revents);\n\\&\n\\&     myclass (int fd)\n\\&     {\n\\&       io  .set <myclass, &myclass::io_cb  > (this);\n\\&       io2 .set <myclass, &myclass::io2_cb > (this);\n\\&       idle.set <myclass, &myclass::idle_cb> (this);\n\\&\n\\&       io.set (fd, ev::WRITE); // configure the watcher\n\\&       io.start ();            // start it whenever convenient\n\\&\n\\&       io2.start (fd, ev::READ); // set + start in one call\n\\&     }\n\\&   };\n.Ve\n.SH \"OTHER LANGUAGE BINDINGS\"\n.IX Header \"OTHER LANGUAGE BINDINGS\"\nLibev does not offer other language bindings itself, but bindings for a\nnumber of languages exist in the form of third-party packages. If you know\nany interesting language binding in addition to the ones listed here, drop\nme a note.\n.IP \"Perl\" 4\n.IX Item \"Perl\"\nThe \\s-1EV\\s0 module implements the full libev \\s-1API\\s0 and is actually used to test\nlibev. \\s-1EV\\s0 is developed together with libev. Apart from the \\s-1EV\\s0 core module,\nthere are additional modules that implement libev-compatible interfaces\nto \\f(CW\\*(C`libadns\\*(C'\\fR (\\f(CW\\*(C`EV::ADNS\\*(C'\\fR, but \\f(CW\\*(C`AnyEvent::DNS\\*(C'\\fR is preferred nowadays),\n\\&\\f(CW\\*(C`Net::SNMP\\*(C'\\fR (\\f(CW\\*(C`Net::SNMP::EV\\*(C'\\fR) and the \\f(CW\\*(C`libglib\\*(C'\\fR event core (\\f(CW\\*(C`Glib::EV\\*(C'\\fR\nand \\f(CW\\*(C`EV::Glib\\*(C'\\fR).\n.Sp\nIt can be found and installed via \\s-1CPAN,\\s0 its homepage is at\n<http://software.schmorp.de/pkg/EV>.\n.IP \"Python\" 4\n.IX Item \"Python\"\nPython bindings can be found at <http://code.google.com/p/pyev/>. It\nseems to be quite complete and well-documented.\n.IP \"Ruby\" 4\n.IX Item \"Ruby\"\nTony Arcieri has written a ruby extension that offers access to a subset\nof the libev \\s-1API\\s0 and adds file handle abstractions, asynchronous \\s-1DNS\\s0 and\nmore on top of it. It can be found via gem servers. Its homepage is at\n<http://rev.rubyforge.org/>.\n.Sp\nRoger Pack reports that using the link order \\f(CW\\*(C`\\-lws2_32 \\-lmsvcrt\\-ruby\\-190\\*(C'\\fR\nmakes rev work even on mingw.\n.IP \"Haskell\" 4\n.IX Item \"Haskell\"\nA haskell binding to libev is available at\n<http://hackage.haskell.org/cgi\\-bin/hackage\\-scripts/package/hlibev>.\n.IP \"D\" 4\n.IX Item \"D\"\nLeandro Lucarella has written a D language binding (\\fIev.d\\fR) for libev, to\nbe found at <http://www.llucax.com.ar/proj/ev.d/index.html>.\n.IP \"Ocaml\" 4\n.IX Item \"Ocaml\"\nErkki Seppala has written Ocaml bindings for libev, to be found at\n<http://modeemi.cs.tut.fi/~flux/software/ocaml\\-ev/>.\n.IP \"Lua\" 4\n.IX Item \"Lua\"\nBrian Maher has written a partial interface to libev for lua (at the\ntime of this writing, only \\f(CW\\*(C`ev_io\\*(C'\\fR and \\f(CW\\*(C`ev_timer\\*(C'\\fR), to be found at\n<http://github.com/brimworks/lua\\-ev>.\n.IP \"Javascript\" 4\n.IX Item \"Javascript\"\nNode.js (<http://nodejs.org>) uses libev as the underlying event library.\n.IP \"Others\" 4\n.IX Item \"Others\"\nThere are others, and I stopped counting.\n.SH \"MACRO MAGIC\"\n.IX Header \"MACRO MAGIC\"\nLibev can be compiled with a variety of options, the most fundamental\nof which is \\f(CW\\*(C`EV_MULTIPLICITY\\*(C'\\fR. This option determines whether (most)\nfunctions and callbacks have an initial \\f(CW\\*(C`struct ev_loop *\\*(C'\\fR argument.\n.PP\nTo make it easier to write programs that cope with either variant, the\nfollowing macros are defined:\n.ie n .IP \"\"\"EV_A\"\", \"\"EV_A_\"\"\" 4\n.el .IP \"\\f(CWEV_A\\fR, \\f(CWEV_A_\\fR\" 4\n.IX Item \"EV_A, EV_A_\"\nThis provides the loop \\fIargument\\fR for functions, if one is required (\\*(L\"ev\nloop argument\\*(R\"). The \\f(CW\\*(C`EV_A\\*(C'\\fR form is used when this is the sole argument,\n\\&\\f(CW\\*(C`EV_A_\\*(C'\\fR is used when other arguments are following. Example:\n.Sp\n.Vb 3\n\\&   ev_unref (EV_A);\n\\&   ev_timer_add (EV_A_ watcher);\n\\&   ev_run (EV_A_ 0);\n.Ve\n.Sp\nIt assumes the variable \\f(CW\\*(C`loop\\*(C'\\fR of type \\f(CW\\*(C`struct ev_loop *\\*(C'\\fR is in scope,\nwhich is often provided by the following macro.\n.ie n .IP \"\"\"EV_P\"\", \"\"EV_P_\"\"\" 4\n.el .IP \"\\f(CWEV_P\\fR, \\f(CWEV_P_\\fR\" 4\n.IX Item \"EV_P, EV_P_\"\nThis provides the loop \\fIparameter\\fR for functions, if one is required (\\*(L\"ev\nloop parameter\\*(R\"). The \\f(CW\\*(C`EV_P\\*(C'\\fR form is used when this is the sole parameter,\n\\&\\f(CW\\*(C`EV_P_\\*(C'\\fR is used when other parameters are following. Example:\n.Sp\n.Vb 2\n\\&   // this is how ev_unref is being declared\n\\&   static void ev_unref (EV_P);\n\\&\n\\&   // this is how you can declare your typical callback\n\\&   static void cb (EV_P_ ev_timer *w, int revents)\n.Ve\n.Sp\nIt declares a parameter \\f(CW\\*(C`loop\\*(C'\\fR of type \\f(CW\\*(C`struct ev_loop *\\*(C'\\fR, quite\nsuitable for use with \\f(CW\\*(C`EV_A\\*(C'\\fR.\n.ie n .IP \"\"\"EV_DEFAULT\"\", \"\"EV_DEFAULT_\"\"\" 4\n.el .IP \"\\f(CWEV_DEFAULT\\fR, \\f(CWEV_DEFAULT_\\fR\" 4\n.IX Item \"EV_DEFAULT, EV_DEFAULT_\"\nSimilar to the other two macros, this gives you the value of the default\nloop, if multiple loops are supported (\\*(L\"ev loop default\\*(R\"). The default loop\nwill be initialised if it isn't already initialised.\n.Sp\nFor non-multiplicity builds, these macros do nothing, so you always have\nto initialise the loop somewhere.\n.ie n .IP \"\"\"EV_DEFAULT_UC\"\", \"\"EV_DEFAULT_UC_\"\"\" 4\n.el .IP \"\\f(CWEV_DEFAULT_UC\\fR, \\f(CWEV_DEFAULT_UC_\\fR\" 4\n.IX Item \"EV_DEFAULT_UC, EV_DEFAULT_UC_\"\nUsage identical to \\f(CW\\*(C`EV_DEFAULT\\*(C'\\fR and \\f(CW\\*(C`EV_DEFAULT_\\*(C'\\fR, but requires that the\ndefault loop has been initialised (\\f(CW\\*(C`UC\\*(C'\\fR == unchecked). Their behaviour\nis undefined when the default loop has not been initialised by a previous\nexecution of \\f(CW\\*(C`EV_DEFAULT\\*(C'\\fR, \\f(CW\\*(C`EV_DEFAULT_\\*(C'\\fR or \\f(CW\\*(C`ev_default_init (...)\\*(C'\\fR.\n.Sp\nIt is often prudent to use \\f(CW\\*(C`EV_DEFAULT\\*(C'\\fR when initialising the first\nwatcher in a function but use \\f(CW\\*(C`EV_DEFAULT_UC\\*(C'\\fR afterwards.\n.PP\nExample: Declare and initialise a check watcher, utilising the above\nmacros so it will work regardless of whether multiple loops are supported\nor not.\n.PP\n.Vb 5\n\\&   static void\n\\&   check_cb (EV_P_ ev_timer *w, int revents)\n\\&   {\n\\&     ev_check_stop (EV_A_ w);\n\\&   }\n\\&\n\\&   ev_check check;\n\\&   ev_check_init (&check, check_cb);\n\\&   ev_check_start (EV_DEFAULT_ &check);\n\\&   ev_run (EV_DEFAULT_ 0);\n.Ve\n.SH \"EMBEDDING\"\n.IX Header \"EMBEDDING\"\nLibev can (and often is) directly embedded into host\napplications. Examples of applications that embed it include the Deliantra\nGame Server, the \\s-1EV\\s0 perl module, the \\s-1GNU\\s0 Virtual Private Ethernet (gvpe)\nand rxvt-unicode.\n.PP\nThe goal is to enable you to just copy the necessary files into your\nsource directory without having to change even a single line in them, so\nyou can easily upgrade by simply copying (or having a checked-out copy of\nlibev somewhere in your source tree).\n.SS \"\\s-1FILESETS\\s0\"\n.IX Subsection \"FILESETS\"\nDepending on what features you need you need to include one or more sets of files\nin your application.\n.PP\n\\fI\\s-1CORE EVENT LOOP\\s0\\fR\n.IX Subsection \"CORE EVENT LOOP\"\n.PP\nTo include only the libev core (all the \\f(CW\\*(C`ev_*\\*(C'\\fR functions), with manual\nconfiguration (no autoconf):\n.PP\n.Vb 2\n\\&   #define EV_STANDALONE 1\n\\&   #include \"ev.c\"\n.Ve\n.PP\nThis will automatically include \\fIev.h\\fR, too, and should be done in a\nsingle C source file only to provide the function implementations. To use\nit, do the same for \\fIev.h\\fR in all files wishing to use this \\s-1API \\s0(best\ndone by writing a wrapper around \\fIev.h\\fR that you can include instead and\nwhere you can put other configuration options):\n.PP\n.Vb 2\n\\&   #define EV_STANDALONE 1\n\\&   #include \"ev.h\"\n.Ve\n.PP\nBoth header files and implementation files can be compiled with a \\*(C+\ncompiler (at least, that's a stated goal, and breakage will be treated\nas a bug).\n.PP\nYou need the following files in your source tree, or in a directory\nin your include path (e.g. in libev/ when using \\-Ilibev):\n.PP\n.Vb 4\n\\&   ev.h\n\\&   ev.c\n\\&   ev_vars.h\n\\&   ev_wrap.h\n\\&\n\\&   ev_win32.c      required on win32 platforms only\n\\&\n\\&   ev_select.c     only when select backend is enabled (which is enabled by default)\n\\&   ev_poll.c       only when poll backend is enabled (disabled by default)\n\\&   ev_epoll.c      only when the epoll backend is enabled (disabled by default)\n\\&   ev_kqueue.c     only when the kqueue backend is enabled (disabled by default)\n\\&   ev_port.c       only when the solaris port backend is enabled (disabled by default)\n.Ve\n.PP\n\\&\\fIev.c\\fR includes the backend files directly when enabled, so you only need\nto compile this single file.\n.PP\n\\fI\\s-1LIBEVENT COMPATIBILITY API\\s0\\fR\n.IX Subsection \"LIBEVENT COMPATIBILITY API\"\n.PP\nTo include the libevent compatibility \\s-1API,\\s0 also include:\n.PP\n.Vb 1\n\\&   #include \"event.c\"\n.Ve\n.PP\nin the file including \\fIev.c\\fR, and:\n.PP\n.Vb 1\n\\&   #include \"event.h\"\n.Ve\n.PP\nin the files that want to use the libevent \\s-1API.\\s0 This also includes \\fIev.h\\fR.\n.PP\nYou need the following additional files for this:\n.PP\n.Vb 2\n\\&   event.h\n\\&   event.c\n.Ve\n.PP\n\\fI\\s-1AUTOCONF SUPPORT\\s0\\fR\n.IX Subsection \"AUTOCONF SUPPORT\"\n.PP\nInstead of using \\f(CW\\*(C`EV_STANDALONE=1\\*(C'\\fR and providing your configuration in\nwhatever way you want, you can also \\f(CW\\*(C`m4_include([libev.m4])\\*(C'\\fR in your\n\\&\\fIconfigure.ac\\fR and leave \\f(CW\\*(C`EV_STANDALONE\\*(C'\\fR undefined. \\fIev.c\\fR will then\ninclude \\fIconfig.h\\fR and configure itself accordingly.\n.PP\nFor this of course you need the m4 file:\n.PP\n.Vb 1\n\\&   libev.m4\n.Ve\n.SS \"\\s-1PREPROCESSOR SYMBOLS/MACROS\\s0\"\n.IX Subsection \"PREPROCESSOR SYMBOLS/MACROS\"\nLibev can be configured via a variety of preprocessor symbols you have to\ndefine before including (or compiling) any of its files. The default in\nthe absence of autoconf is documented for every option.\n.PP\nSymbols marked with \\*(L\"(h)\\*(R\" do not change the \\s-1ABI,\\s0 and can have different\nvalues when compiling libev vs. including \\fIev.h\\fR, so it is permissible\nto redefine them before including \\fIev.h\\fR without breaking compatibility\nto a compiled library. All other symbols change the \\s-1ABI,\\s0 which means all\nusers of libev and the libev code itself must be compiled with compatible\nsettings.\n.IP \"\\s-1EV_COMPAT3 \\s0(h)\" 4\n.IX Item \"EV_COMPAT3 (h)\"\nBackwards compatibility is a major concern for libev. This is why this\nrelease of libev comes with wrappers for the functions and symbols that\nhave been renamed between libev version 3 and 4.\n.Sp\nYou can disable these wrappers (to test compatibility with future\nversions) by defining \\f(CW\\*(C`EV_COMPAT3\\*(C'\\fR to \\f(CW0\\fR when compiling your\nsources. This has the additional advantage that you can drop the \\f(CW\\*(C`struct\\*(C'\\fR\nfrom \\f(CW\\*(C`struct ev_loop\\*(C'\\fR declarations, as libev will provide an \\f(CW\\*(C`ev_loop\\*(C'\\fR\ntypedef in that case.\n.Sp\nIn some future version, the default for \\f(CW\\*(C`EV_COMPAT3\\*(C'\\fR will become \\f(CW0\\fR,\nand in some even more future version the compatibility code will be\nremoved completely.\n.IP \"\\s-1EV_STANDALONE \\s0(h)\" 4\n.IX Item \"EV_STANDALONE (h)\"\nMust always be \\f(CW1\\fR if you do not use autoconf configuration, which\nkeeps libev from including \\fIconfig.h\\fR, and it also defines dummy\nimplementations for some libevent functions (such as logging, which is not\nsupported). It will also not define any of the structs usually found in\n\\&\\fIevent.h\\fR that are not directly supported by the libev core alone.\n.Sp\nIn standalone mode, libev will still try to automatically deduce the\nconfiguration, but has to be more conservative.\n.IP \"\\s-1EV_USE_FLOOR\\s0\" 4\n.IX Item \"EV_USE_FLOOR\"\nIf defined to be \\f(CW1\\fR, libev will use the \\f(CW\\*(C`floor ()\\*(C'\\fR function for its\nperiodic reschedule calculations, otherwise libev will fall back on a\nportable (slower) implementation. If you enable this, you usually have to\nlink against libm or something equivalent. Enabling this when the \\f(CW\\*(C`floor\\*(C'\\fR\nfunction is not available will fail, so the safe default is to not enable\nthis.\n.IP \"\\s-1EV_USE_MONOTONIC\\s0\" 4\n.IX Item \"EV_USE_MONOTONIC\"\nIf defined to be \\f(CW1\\fR, libev will try to detect the availability of the\nmonotonic clock option at both compile time and runtime. Otherwise no\nuse of the monotonic clock option will be attempted. If you enable this,\nyou usually have to link against librt or something similar. Enabling it\nwhen the functionality isn't available is safe, though, although you have\nto make sure you link against any libraries where the \\f(CW\\*(C`clock_gettime\\*(C'\\fR\nfunction is hiding in (often \\fI\\-lrt\\fR). See also \\f(CW\\*(C`EV_USE_CLOCK_SYSCALL\\*(C'\\fR.\n.IP \"\\s-1EV_USE_REALTIME\\s0\" 4\n.IX Item \"EV_USE_REALTIME\"\nIf defined to be \\f(CW1\\fR, libev will try to detect the availability of the\nreal-time clock option at compile time (and assume its availability\nat runtime if successful). Otherwise no use of the real-time clock\noption will be attempted. This effectively replaces \\f(CW\\*(C`gettimeofday\\*(C'\\fR\nby \\f(CW\\*(C`clock_get (CLOCK_REALTIME, ...)\\*(C'\\fR and will not normally affect\ncorrectness. See the note about libraries in the description of\n\\&\\f(CW\\*(C`EV_USE_MONOTONIC\\*(C'\\fR, though. Defaults to the opposite value of\n\\&\\f(CW\\*(C`EV_USE_CLOCK_SYSCALL\\*(C'\\fR.\n.IP \"\\s-1EV_USE_CLOCK_SYSCALL\\s0\" 4\n.IX Item \"EV_USE_CLOCK_SYSCALL\"\nIf defined to be \\f(CW1\\fR, libev will try to use a direct syscall instead\nof calling the system-provided \\f(CW\\*(C`clock_gettime\\*(C'\\fR function. This option\nexists because on GNU/Linux, \\f(CW\\*(C`clock_gettime\\*(C'\\fR is in \\f(CW\\*(C`librt\\*(C'\\fR, but \\f(CW\\*(C`librt\\*(C'\\fR\nunconditionally pulls in \\f(CW\\*(C`libpthread\\*(C'\\fR, slowing down single-threaded\nprograms needlessly. Using a direct syscall is slightly slower (in\ntheory), because no optimised vdso implementation can be used, but avoids\nthe pthread dependency. Defaults to \\f(CW1\\fR on GNU/Linux with glibc 2.x or\nhigher, as it simplifies linking (no need for \\f(CW\\*(C`\\-lrt\\*(C'\\fR).\n.IP \"\\s-1EV_USE_NANOSLEEP\\s0\" 4\n.IX Item \"EV_USE_NANOSLEEP\"\nIf defined to be \\f(CW1\\fR, libev will assume that \\f(CW\\*(C`nanosleep ()\\*(C'\\fR is available\nand will use it for delays. Otherwise it will use \\f(CW\\*(C`select ()\\*(C'\\fR.\n.IP \"\\s-1EV_USE_EVENTFD\\s0\" 4\n.IX Item \"EV_USE_EVENTFD\"\nIf defined to be \\f(CW1\\fR, then libev will assume that \\f(CW\\*(C`eventfd ()\\*(C'\\fR is\navailable and will probe for kernel support at runtime. This will improve\n\\&\\f(CW\\*(C`ev_signal\\*(C'\\fR and \\f(CW\\*(C`ev_async\\*(C'\\fR performance and reduce resource consumption.\nIf undefined, it will be enabled if the headers indicate GNU/Linux + Glibc\n2.7 or newer, otherwise disabled.\n.IP \"\\s-1EV_USE_SELECT\\s0\" 4\n.IX Item \"EV_USE_SELECT\"\nIf undefined or defined to be \\f(CW1\\fR, libev will compile in support for the\n\\&\\f(CW\\*(C`select\\*(C'\\fR(2) backend. No attempt at auto-detection will be done: if no\nother method takes over, select will be it. Otherwise the select backend\nwill not be compiled in.\n.IP \"\\s-1EV_SELECT_USE_FD_SET\\s0\" 4\n.IX Item \"EV_SELECT_USE_FD_SET\"\nIf defined to \\f(CW1\\fR, then the select backend will use the system \\f(CW\\*(C`fd_set\\*(C'\\fR\nstructure. This is useful if libev doesn't compile due to a missing\n\\&\\f(CW\\*(C`NFDBITS\\*(C'\\fR or \\f(CW\\*(C`fd_mask\\*(C'\\fR definition or it mis-guesses the bitset layout\non exotic systems. This usually limits the range of file descriptors to\nsome low limit such as 1024 or might have other limitations (winsocket\nonly allows 64 sockets). The \\f(CW\\*(C`FD_SETSIZE\\*(C'\\fR macro, set before compilation,\nconfigures the maximum size of the \\f(CW\\*(C`fd_set\\*(C'\\fR.\n.IP \"\\s-1EV_SELECT_IS_WINSOCKET\\s0\" 4\n.IX Item \"EV_SELECT_IS_WINSOCKET\"\nWhen defined to \\f(CW1\\fR, the select backend will assume that\nselect/socket/connect etc. don't understand file descriptors but\nwants osf handles on win32 (this is the case when the select to\nbe used is the winsock select). This means that it will call\n\\&\\f(CW\\*(C`_get_osfhandle\\*(C'\\fR on the fd to convert it to an \\s-1OS\\s0 handle. Otherwise,\nit is assumed that all these functions actually work on fds, even\non win32. Should not be defined on non\\-win32 platforms.\n.IP \"\\s-1EV_FD_TO_WIN32_HANDLE\\s0(fd)\" 4\n.IX Item \"EV_FD_TO_WIN32_HANDLE(fd)\"\nIf \\f(CW\\*(C`EV_SELECT_IS_WINSOCKET\\*(C'\\fR is enabled, then libev needs a way to map\nfile descriptors to socket handles. When not defining this symbol (the\ndefault), then libev will call \\f(CW\\*(C`_get_osfhandle\\*(C'\\fR, which is usually\ncorrect. In some cases, programs use their own file descriptor management,\nin which case they can provide this function to map fds to socket handles.\n.IP \"\\s-1EV_WIN32_HANDLE_TO_FD\\s0(handle)\" 4\n.IX Item \"EV_WIN32_HANDLE_TO_FD(handle)\"\nIf \\f(CW\\*(C`EV_SELECT_IS_WINSOCKET\\*(C'\\fR then libev maps handles to file descriptors\nusing the standard \\f(CW\\*(C`_open_osfhandle\\*(C'\\fR function. For programs implementing\ntheir own fd to handle mapping, overwriting this function makes it easier\nto do so. This can be done by defining this macro to an appropriate value.\n.IP \"\\s-1EV_WIN32_CLOSE_FD\\s0(fd)\" 4\n.IX Item \"EV_WIN32_CLOSE_FD(fd)\"\nIf programs implement their own fd to handle mapping on win32, then this\nmacro can be used to override the \\f(CW\\*(C`close\\*(C'\\fR function, useful to unregister\nfile descriptors again. Note that the replacement function has to close\nthe underlying \\s-1OS\\s0 handle.\n.IP \"\\s-1EV_USE_WSASOCKET\\s0\" 4\n.IX Item \"EV_USE_WSASOCKET\"\nIf defined to be \\f(CW1\\fR, libev will use \\f(CW\\*(C`WSASocket\\*(C'\\fR to create its internal\ncommunication socket, which works better in some environments. Otherwise,\nthe normal \\f(CW\\*(C`socket\\*(C'\\fR function will be used, which works better in other\nenvironments.\n.IP \"\\s-1EV_USE_POLL\\s0\" 4\n.IX Item \"EV_USE_POLL\"\nIf defined to be \\f(CW1\\fR, libev will compile in support for the \\f(CW\\*(C`poll\\*(C'\\fR(2)\nbackend. Otherwise it will be enabled on non\\-win32 platforms. It\ntakes precedence over select.\n.IP \"\\s-1EV_USE_EPOLL\\s0\" 4\n.IX Item \"EV_USE_EPOLL\"\nIf defined to be \\f(CW1\\fR, libev will compile in support for the Linux\n\\&\\f(CW\\*(C`epoll\\*(C'\\fR(7) backend. Its availability will be detected at runtime,\notherwise another method will be used as fallback. This is the preferred\nbackend for GNU/Linux systems. If undefined, it will be enabled if the\nheaders indicate GNU/Linux + Glibc 2.4 or newer, otherwise disabled.\n.IP \"\\s-1EV_USE_KQUEUE\\s0\" 4\n.IX Item \"EV_USE_KQUEUE\"\nIf defined to be \\f(CW1\\fR, libev will compile in support for the \\s-1BSD\\s0 style\n\\&\\f(CW\\*(C`kqueue\\*(C'\\fR(2) backend. Its actual availability will be detected at runtime,\notherwise another method will be used as fallback. This is the preferred\nbackend for \\s-1BSD\\s0 and BSD-like systems, although on most BSDs kqueue only\nsupports some types of fds correctly (the only platform we found that\nsupports ptys for example was NetBSD), so kqueue might be compiled in, but\nnot be used unless explicitly requested. The best way to use it is to find\nout whether kqueue supports your type of fd properly and use an embedded\nkqueue loop.\n.IP \"\\s-1EV_USE_PORT\\s0\" 4\n.IX Item \"EV_USE_PORT\"\nIf defined to be \\f(CW1\\fR, libev will compile in support for the Solaris\n10 port style backend. Its availability will be detected at runtime,\notherwise another method will be used as fallback. This is the preferred\nbackend for Solaris 10 systems.\n.IP \"\\s-1EV_USE_DEVPOLL\\s0\" 4\n.IX Item \"EV_USE_DEVPOLL\"\nReserved for future expansion, works like the \\s-1USE\\s0 symbols above.\n.IP \"\\s-1EV_USE_INOTIFY\\s0\" 4\n.IX Item \"EV_USE_INOTIFY\"\nIf defined to be \\f(CW1\\fR, libev will compile in support for the Linux inotify\ninterface to speed up \\f(CW\\*(C`ev_stat\\*(C'\\fR watchers. Its actual availability will\nbe detected at runtime. If undefined, it will be enabled if the headers\nindicate GNU/Linux + Glibc 2.4 or newer, otherwise disabled.\n.IP \"\\s-1EV_NO_SMP\\s0\" 4\n.IX Item \"EV_NO_SMP\"\nIf defined to be \\f(CW1\\fR, libev will assume that memory is always coherent\nbetween threads, that is, threads can be used, but threads never run on\ndifferent cpus (or different cpu cores). This reduces dependencies\nand makes libev faster.\n.IP \"\\s-1EV_NO_THREADS\\s0\" 4\n.IX Item \"EV_NO_THREADS\"\nIf defined to be \\f(CW1\\fR, libev will assume that it will never be called from\ndifferent threads (that includes signal handlers), which is a stronger\nassumption than \\f(CW\\*(C`EV_NO_SMP\\*(C'\\fR, above. This reduces dependencies and makes\nlibev faster.\n.IP \"\\s-1EV_ATOMIC_T\\s0\" 4\n.IX Item \"EV_ATOMIC_T\"\nLibev requires an integer type (suitable for storing \\f(CW0\\fR or \\f(CW1\\fR) whose\naccess is atomic with respect to other threads or signal contexts. No\nsuch type is easily found in the C language, so you can provide your own\ntype that you know is safe for your purposes. It is used both for signal\nhandler \\*(L\"locking\\*(R\" as well as for signal and thread safety in \\f(CW\\*(C`ev_async\\*(C'\\fR\nwatchers.\n.Sp\nIn the absence of this define, libev will use \\f(CW\\*(C`sig_atomic_t volatile\\*(C'\\fR\n(from \\fIsignal.h\\fR), which is usually good enough on most platforms.\n.IP \"\\s-1EV_H \\s0(h)\" 4\n.IX Item \"EV_H (h)\"\nThe name of the \\fIev.h\\fR header file used to include it. The default if\nundefined is \\f(CW\"ev.h\"\\fR in \\fIevent.h\\fR, \\fIev.c\\fR and \\fIev++.h\\fR. This can be\nused to virtually rename the \\fIev.h\\fR header file in case of conflicts.\n.IP \"\\s-1EV_CONFIG_H \\s0(h)\" 4\n.IX Item \"EV_CONFIG_H (h)\"\nIf \\f(CW\\*(C`EV_STANDALONE\\*(C'\\fR isn't \\f(CW1\\fR, this variable can be used to override\n\\&\\fIev.c\\fR's idea of where to find the \\fIconfig.h\\fR file, similarly to\n\\&\\f(CW\\*(C`EV_H\\*(C'\\fR, above.\n.IP \"\\s-1EV_EVENT_H \\s0(h)\" 4\n.IX Item \"EV_EVENT_H (h)\"\nSimilarly to \\f(CW\\*(C`EV_H\\*(C'\\fR, this macro can be used to override \\fIevent.c\\fR's idea\nof how the \\fIevent.h\\fR header can be found, the default is \\f(CW\"event.h\"\\fR.\n.IP \"\\s-1EV_PROTOTYPES \\s0(h)\" 4\n.IX Item \"EV_PROTOTYPES (h)\"\nIf defined to be \\f(CW0\\fR, then \\fIev.h\\fR will not define any function\nprototypes, but still define all the structs and other symbols. This is\noccasionally useful if you want to provide your own wrapper functions\naround libev functions.\n.IP \"\\s-1EV_MULTIPLICITY\\s0\" 4\n.IX Item \"EV_MULTIPLICITY\"\nIf undefined or defined to \\f(CW1\\fR, then all event-loop-specific functions\nwill have the \\f(CW\\*(C`struct ev_loop *\\*(C'\\fR as first argument, and you can create\nadditional independent event loops. Otherwise there will be no support\nfor multiple event loops and there is no first event loop pointer\nargument. Instead, all functions act on the single default loop.\n.Sp\nNote that \\f(CW\\*(C`EV_DEFAULT\\*(C'\\fR and \\f(CW\\*(C`EV_DEFAULT_\\*(C'\\fR will no longer provide a\ndefault loop when multiplicity is switched off \\- you always have to\ninitialise the loop manually in this case.\n.IP \"\\s-1EV_MINPRI\\s0\" 4\n.IX Item \"EV_MINPRI\"\n.PD 0\n.IP \"\\s-1EV_MAXPRI\\s0\" 4\n.IX Item \"EV_MAXPRI\"\n.PD\nThe range of allowed priorities. \\f(CW\\*(C`EV_MINPRI\\*(C'\\fR must be smaller or equal to\n\\&\\f(CW\\*(C`EV_MAXPRI\\*(C'\\fR, but otherwise there are no non-obvious limitations. You can\nprovide for more priorities by overriding those symbols (usually defined\nto be \\f(CW\\*(C`\\-2\\*(C'\\fR and \\f(CW2\\fR, respectively).\n.Sp\nWhen doing priority-based operations, libev usually has to linearly search\nall the priorities, so having many of them (hundreds) uses a lot of space\nand time, so using the defaults of five priorities (\\-2 .. +2) is usually\nfine.\n.Sp\nIf your embedding application does not need any priorities, defining these\nboth to \\f(CW0\\fR will save some memory and \\s-1CPU.\\s0\n.IP \"\\s-1EV_PERIODIC_ENABLE, EV_IDLE_ENABLE, EV_EMBED_ENABLE, EV_STAT_ENABLE, EV_PREPARE_ENABLE, EV_CHECK_ENABLE, EV_FORK_ENABLE, EV_SIGNAL_ENABLE, EV_ASYNC_ENABLE, EV_CHILD_ENABLE.\\s0\" 4\n.IX Item \"EV_PERIODIC_ENABLE, EV_IDLE_ENABLE, EV_EMBED_ENABLE, EV_STAT_ENABLE, EV_PREPARE_ENABLE, EV_CHECK_ENABLE, EV_FORK_ENABLE, EV_SIGNAL_ENABLE, EV_ASYNC_ENABLE, EV_CHILD_ENABLE.\"\nIf undefined or defined to be \\f(CW1\\fR (and the platform supports it), then\nthe respective watcher type is supported. If defined to be \\f(CW0\\fR, then it\nis not. Disabling watcher types mainly saves code size.\n.IP \"\\s-1EV_FEATURES\\s0\" 4\n.IX Item \"EV_FEATURES\"\nIf you need to shave off some kilobytes of code at the expense of some\nspeed (but with the full \\s-1API\\s0), you can define this symbol to request\ncertain subsets of functionality. The default is to enable all features\nthat can be enabled on the platform.\n.Sp\nA typical way to use this symbol is to define it to \\f(CW0\\fR (or to a bitset\nwith some broad features you want) and then selectively re-enable\nadditional parts you want, for example if you want everything minimal,\nbut multiple event loop support, async and child watchers and the poll\nbackend, use this:\n.Sp\n.Vb 5\n\\&   #define EV_FEATURES 0\n\\&   #define EV_MULTIPLICITY 1\n\\&   #define EV_USE_POLL 1\n\\&   #define EV_CHILD_ENABLE 1\n\\&   #define EV_ASYNC_ENABLE 1\n.Ve\n.Sp\nThe actual value is a bitset, it can be a combination of the following\nvalues (by default, all of these are enabled):\n.RS 4\n.ie n .IP \"1 \\- faster/larger code\" 4\n.el .IP \"\\f(CW1\\fR \\- faster/larger code\" 4\n.IX Item \"1 - faster/larger code\"\nUse larger code to speed up some operations.\n.Sp\nCurrently this is used to override some inlining decisions (enlarging the\ncode size by roughly 30% on amd64).\n.Sp\nWhen optimising for size, use of compiler flags such as \\f(CW\\*(C`\\-Os\\*(C'\\fR with\ngcc is recommended, as well as \\f(CW\\*(C`\\-DNDEBUG\\*(C'\\fR, as libev contains a number of\nassertions.\n.Sp\nThe default is off when \\f(CW\\*(C`_\\|_OPTIMIZE_SIZE_\\|_\\*(C'\\fR is defined by your compiler\n(e.g. gcc with \\f(CW\\*(C`\\-Os\\*(C'\\fR).\n.ie n .IP \"2 \\- faster/larger data structures\" 4\n.el .IP \"\\f(CW2\\fR \\- faster/larger data structures\" 4\n.IX Item \"2 - faster/larger data structures\"\nReplaces the small 2\\-heap for timer management by a faster 4\\-heap, larger\nhash table sizes and so on. This will usually further increase code size\nand can additionally have an effect on the size of data structures at\nruntime.\n.Sp\nThe default is off when \\f(CW\\*(C`_\\|_OPTIMIZE_SIZE_\\|_\\*(C'\\fR is defined by your compiler\n(e.g. gcc with \\f(CW\\*(C`\\-Os\\*(C'\\fR).\n.ie n .IP \"4 \\- full \\s-1API\\s0 configuration\" 4\n.el .IP \"\\f(CW4\\fR \\- full \\s-1API\\s0 configuration\" 4\n.IX Item \"4 - full API configuration\"\nThis enables priorities (sets \\f(CW\\*(C`EV_MAXPRI\\*(C'\\fR=2 and \\f(CW\\*(C`EV_MINPRI\\*(C'\\fR=\\-2), and\nenables multiplicity (\\f(CW\\*(C`EV_MULTIPLICITY\\*(C'\\fR=1).\n.ie n .IP \"8 \\- full \\s-1API\\s0\" 4\n.el .IP \"\\f(CW8\\fR \\- full \\s-1API\\s0\" 4\n.IX Item \"8 - full API\"\nThis enables a lot of the \\*(L\"lesser used\\*(R\" \\s-1API\\s0 functions. See \\f(CW\\*(C`ev.h\\*(C'\\fR for\ndetails on which parts of the \\s-1API\\s0 are still available without this\nfeature, and do not complain if this subset changes over time.\n.ie n .IP \"16 \\- enable all optional watcher types\" 4\n.el .IP \"\\f(CW16\\fR \\- enable all optional watcher types\" 4\n.IX Item \"16 - enable all optional watcher types\"\nEnables all optional watcher types.  If you want to selectively enable\nonly some watcher types other than I/O and timers (e.g. prepare,\nembed, async, child...) you can enable them manually by defining\n\\&\\f(CW\\*(C`EV_watchertype_ENABLE\\*(C'\\fR to \\f(CW1\\fR instead.\n.ie n .IP \"32 \\- enable all backends\" 4\n.el .IP \"\\f(CW32\\fR \\- enable all backends\" 4\n.IX Item \"32 - enable all backends\"\nThis enables all backends \\- without this feature, you need to enable at\nleast one backend manually (\\f(CW\\*(C`EV_USE_SELECT\\*(C'\\fR is a good choice).\n.ie n .IP \"64 \\- enable OS-specific \"\"helper\"\" APIs\" 4\n.el .IP \"\\f(CW64\\fR \\- enable OS-specific ``helper'' APIs\" 4\n.IX Item \"64 - enable OS-specific helper APIs\"\nEnable inotify, eventfd, signalfd and similar OS-specific helper APIs by\ndefault.\n.RE\n.RS 4\n.Sp\nCompiling with \\f(CW\\*(C`gcc \\-Os \\-DEV_STANDALONE \\-DEV_USE_EPOLL=1 \\-DEV_FEATURES=0\\*(C'\\fR\nreduces the compiled size of libev from 24.7Kb code/2.8Kb data to 6.5Kb\ncode/0.3Kb data on my GNU/Linux amd64 system, while still giving you I/O\nwatchers, timers and monotonic clock support.\n.Sp\nWith an intelligent-enough linker (gcc+binutils are intelligent enough\nwhen you use \\f(CW\\*(C`\\-Wl,\\-\\-gc\\-sections \\-ffunction\\-sections\\*(C'\\fR) functions unused by\nyour program might be left out as well \\- a binary starting a timer and an\nI/O watcher then might come out at only 5Kb.\n.RE\n.IP \"\\s-1EV_API_STATIC\\s0\" 4\n.IX Item \"EV_API_STATIC\"\nIf this symbol is defined (by default it is not), then all identifiers\nwill have static linkage. This means that libev will not export any\nidentifiers, and you cannot link against libev anymore. This can be useful\nwhen you embed libev, only want to use libev functions in a single file,\nand do not want its identifiers to be visible.\n.Sp\nTo use this, define \\f(CW\\*(C`EV_API_STATIC\\*(C'\\fR and include \\fIev.c\\fR in the file that\nwants to use libev.\n.Sp\nThis option only works when libev is compiled with a C compiler, as \\*(C+\ndoesn't support the required declaration syntax.\n.IP \"\\s-1EV_AVOID_STDIO\\s0\" 4\n.IX Item \"EV_AVOID_STDIO\"\nIf this is set to \\f(CW1\\fR at compiletime, then libev will avoid using stdio\nfunctions (printf, scanf, perror etc.). This will increase the code size\nsomewhat, but if your program doesn't otherwise depend on stdio and your\nlibc allows it, this avoids linking in the stdio library which is quite\nbig.\n.Sp\nNote that error messages might become less precise when this option is\nenabled.\n.IP \"\\s-1EV_NSIG\\s0\" 4\n.IX Item \"EV_NSIG\"\nThe highest supported signal number, +1 (or, the number of\nsignals): Normally, libev tries to deduce the maximum number of signals\nautomatically, but sometimes this fails, in which case it can be\nspecified. Also, using a lower number than detected (\\f(CW32\\fR should be\ngood for about any system in existence) can save some memory, as libev\nstatically allocates some 12\\-24 bytes per signal number.\n.IP \"\\s-1EV_PID_HASHSIZE\\s0\" 4\n.IX Item \"EV_PID_HASHSIZE\"\n\\&\\f(CW\\*(C`ev_child\\*(C'\\fR watchers use a small hash table to distribute workload by\npid. The default size is \\f(CW16\\fR (or \\f(CW1\\fR with \\f(CW\\*(C`EV_FEATURES\\*(C'\\fR disabled),\nusually more than enough. If you need to manage thousands of children you\nmight want to increase this value (\\fImust\\fR be a power of two).\n.IP \"\\s-1EV_INOTIFY_HASHSIZE\\s0\" 4\n.IX Item \"EV_INOTIFY_HASHSIZE\"\n\\&\\f(CW\\*(C`ev_stat\\*(C'\\fR watchers use a small hash table to distribute workload by\ninotify watch id. The default size is \\f(CW16\\fR (or \\f(CW1\\fR with \\f(CW\\*(C`EV_FEATURES\\*(C'\\fR\ndisabled), usually more than enough. If you need to manage thousands of\n\\&\\f(CW\\*(C`ev_stat\\*(C'\\fR watchers you might want to increase this value (\\fImust\\fR be a\npower of two).\n.IP \"\\s-1EV_USE_4HEAP\\s0\" 4\n.IX Item \"EV_USE_4HEAP\"\nHeaps are not very cache-efficient. To improve the cache-efficiency of the\ntimer and periodics heaps, libev uses a 4\\-heap when this symbol is defined\nto \\f(CW1\\fR. The 4\\-heap uses more complicated (longer) code but has noticeably\nfaster performance with many (thousands) of watchers.\n.Sp\nThe default is \\f(CW1\\fR, unless \\f(CW\\*(C`EV_FEATURES\\*(C'\\fR overrides it, in which case it\nwill be \\f(CW0\\fR.\n.IP \"\\s-1EV_HEAP_CACHE_AT\\s0\" 4\n.IX Item \"EV_HEAP_CACHE_AT\"\nHeaps are not very cache-efficient. To improve the cache-efficiency of the\ntimer and periodics heaps, libev can cache the timestamp (\\fIat\\fR) within\nthe heap structure (selected by defining \\f(CW\\*(C`EV_HEAP_CACHE_AT\\*(C'\\fR to \\f(CW1\\fR),\nwhich uses 8\\-12 bytes more per watcher and a few hundred bytes more code,\nbut avoids random read accesses on heap changes. This improves performance\nnoticeably with many (hundreds) of watchers.\n.Sp\nThe default is \\f(CW1\\fR, unless \\f(CW\\*(C`EV_FEATURES\\*(C'\\fR overrides it, in which case it\nwill be \\f(CW0\\fR.\n.IP \"\\s-1EV_VERIFY\\s0\" 4\n.IX Item \"EV_VERIFY\"\nControls how much internal verification (see \\f(CW\\*(C`ev_verify ()\\*(C'\\fR) will\nbe done: If set to \\f(CW0\\fR, no internal verification code will be compiled\nin. If set to \\f(CW1\\fR, then verification code will be compiled in, but not\ncalled. If set to \\f(CW2\\fR, then the internal verification code will be\ncalled once per loop, which can slow down libev. If set to \\f(CW3\\fR, then the\nverification code will be called very frequently, which will slow down\nlibev considerably.\n.Sp\nThe default is \\f(CW1\\fR, unless \\f(CW\\*(C`EV_FEATURES\\*(C'\\fR overrides it, in which case it\nwill be \\f(CW0\\fR.\n.IP \"\\s-1EV_COMMON\\s0\" 4\n.IX Item \"EV_COMMON\"\nBy default, all watchers have a \\f(CW\\*(C`void *data\\*(C'\\fR member. By redefining\nthis macro to something else you can include more and other types of\nmembers. You have to define it each time you include one of the files,\nthough, and it must be identical each time.\n.Sp\nFor example, the perl \\s-1EV\\s0 module uses something like this:\n.Sp\n.Vb 3\n\\&   #define EV_COMMON                       \\e\n\\&     SV *self; /* contains this struct */  \\e\n\\&     SV *cb_sv, *fh /* note no trailing \";\" */\n.Ve\n.IP \"\\s-1EV_CB_DECLARE \\s0(type)\" 4\n.IX Item \"EV_CB_DECLARE (type)\"\n.PD 0\n.IP \"\\s-1EV_CB_INVOKE \\s0(watcher, revents)\" 4\n.IX Item \"EV_CB_INVOKE (watcher, revents)\"\n.IP \"ev_set_cb (ev, cb)\" 4\n.IX Item \"ev_set_cb (ev, cb)\"\n.PD\nCan be used to change the callback member declaration in each watcher,\nand the way callbacks are invoked and set. Must expand to a struct member\ndefinition and a statement, respectively. See the \\fIev.h\\fR header file for\ntheir default definitions. One possible use for overriding these is to\navoid the \\f(CW\\*(C`struct ev_loop *\\*(C'\\fR as first argument in all cases, or to use\nmethod calls instead of plain function calls in \\*(C+.\n.SS \"\\s-1EXPORTED API SYMBOLS\\s0\"\n.IX Subsection \"EXPORTED API SYMBOLS\"\nIf you need to re-export the \\s-1API \\s0(e.g. via a \\s-1DLL\\s0) and you need a list of\nexported symbols, you can use the provided \\fISymbol.*\\fR files which list\nall public symbols, one per line:\n.PP\n.Vb 2\n\\&   Symbols.ev      for libev proper\n\\&   Symbols.event   for the libevent emulation\n.Ve\n.PP\nThis can also be used to rename all public symbols to avoid clashes with\nmultiple versions of libev linked together (which is obviously bad in\nitself, but sometimes it is inconvenient to avoid this).\n.PP\nA sed command like this will create wrapper \\f(CW\\*(C`#define\\*(C'\\fR's that you need to\ninclude before including \\fIev.h\\fR:\n.PP\n.Vb 1\n\\&   <Symbols.ev sed \\-e \"s/.*/#define & myprefix_&/\" >wrap.h\n.Ve\n.PP\nThis would create a file \\fIwrap.h\\fR which essentially looks like this:\n.PP\n.Vb 4\n\\&   #define ev_backend     myprefix_ev_backend\n\\&   #define ev_check_start myprefix_ev_check_start\n\\&   #define ev_check_stop  myprefix_ev_check_stop\n\\&   ...\n.Ve\n.SS \"\\s-1EXAMPLES\\s0\"\n.IX Subsection \"EXAMPLES\"\nFor a real-world example of a program the includes libev\nverbatim, you can have a look at the \\s-1EV\\s0 perl module\n(<http://software.schmorp.de/pkg/EV.html>). It has the libev files in\nthe \\fIlibev/\\fR subdirectory and includes them in the \\fI\\s-1EV/EVAPI\\s0.h\\fR (public\ninterface) and \\fI\\s-1EV\\s0.xs\\fR (implementation) files. Only the \\fI\\s-1EV\\s0.xs\\fR file\nwill be compiled. It is pretty complex because it provides its own header\nfile.\n.PP\nThe usage in rxvt-unicode is simpler. It has a \\fIev_cpp.h\\fR header file\nthat everybody includes and which overrides some configure choices:\n.PP\n.Vb 8\n\\&   #define EV_FEATURES 8\n\\&   #define EV_USE_SELECT 1\n\\&   #define EV_PREPARE_ENABLE 1\n\\&   #define EV_IDLE_ENABLE 1\n\\&   #define EV_SIGNAL_ENABLE 1\n\\&   #define EV_CHILD_ENABLE 1\n\\&   #define EV_USE_STDEXCEPT 0\n\\&   #define EV_CONFIG_H <config.h>\n\\&\n\\&   #include \"ev++.h\"\n.Ve\n.PP\nAnd a \\fIev_cpp.C\\fR implementation file that contains libev proper and is compiled:\n.PP\n.Vb 2\n\\&   #include \"ev_cpp.h\"\n\\&   #include \"ev.c\"\n.Ve\n.SH \"INTERACTION WITH OTHER PROGRAMS, LIBRARIES OR THE ENVIRONMENT\"\n.IX Header \"INTERACTION WITH OTHER PROGRAMS, LIBRARIES OR THE ENVIRONMENT\"\n.SS \"\\s-1THREADS AND COROUTINES\\s0\"\n.IX Subsection \"THREADS AND COROUTINES\"\n\\fI\\s-1THREADS\\s0\\fR\n.IX Subsection \"THREADS\"\n.PP\nAll libev functions are reentrant and thread-safe unless explicitly\ndocumented otherwise, but libev implements no locking itself. This means\nthat you can use as many loops as you want in parallel, as long as there\nare no concurrent calls into any libev function with the same loop\nparameter (\\f(CW\\*(C`ev_default_*\\*(C'\\fR calls have an implicit default loop parameter,\nof course): libev guarantees that different event loops share no data\nstructures that need any locking.\n.PP\nOr to put it differently: calls with different loop parameters can be done\nconcurrently from multiple threads, calls with the same loop parameter\nmust be done serially (but can be done from different threads, as long as\nonly one thread ever is inside a call at any point in time, e.g. by using\na mutex per loop).\n.PP\nSpecifically to support threads (and signal handlers), libev implements\nso-called \\f(CW\\*(C`ev_async\\*(C'\\fR watchers, which allow some limited form of\nconcurrency on the same event loop, namely waking it up \\*(L\"from the\noutside\\*(R\".\n.PP\nIf you want to know which design (one loop, locking, or multiple loops\nwithout or something else still) is best for your problem, then I cannot\nhelp you, but here is some generic advice:\n.IP \"\\(bu\" 4\nmost applications have a main thread: use the default libev loop\nin that thread, or create a separate thread running only the default loop.\n.Sp\nThis helps integrating other libraries or software modules that use libev\nthemselves and don't care/know about threading.\n.IP \"\\(bu\" 4\none loop per thread is usually a good model.\n.Sp\nDoing this is almost never wrong, sometimes a better-performance model\nexists, but it is always a good start.\n.IP \"\\(bu\" 4\nother models exist, such as the leader/follower pattern, where one\nloop is handed through multiple threads in a kind of round-robin fashion.\n.Sp\nChoosing a model is hard \\- look around, learn, know that usually you can do\nbetter than you currently do :\\-)\n.IP \"\\(bu\" 4\noften you need to talk to some other thread which blocks in the\nevent loop.\n.Sp\n\\&\\f(CW\\*(C`ev_async\\*(C'\\fR watchers can be used to wake them up from other threads safely\n(or from signal contexts...).\n.Sp\nAn example use would be to communicate signals or other events that only\nwork in the default loop by registering the signal watcher with the\ndefault loop and triggering an \\f(CW\\*(C`ev_async\\*(C'\\fR watcher from the default loop\nwatcher callback into the event loop interested in the signal.\n.PP\nSee also \\*(L\"\\s-1THREAD LOCKING EXAMPLE\\*(R\"\\s0.\n.PP\n\\fI\\s-1COROUTINES\\s0\\fR\n.IX Subsection \"COROUTINES\"\n.PP\nLibev is very accommodating to coroutines (\\*(L\"cooperative threads\\*(R\"):\nlibev fully supports nesting calls to its functions from different\ncoroutines (e.g. you can call \\f(CW\\*(C`ev_run\\*(C'\\fR on the same loop from two\ndifferent coroutines, and switch freely between both coroutines running\nthe loop, as long as you don't confuse yourself). The only exception is\nthat you must not do this from \\f(CW\\*(C`ev_periodic\\*(C'\\fR reschedule callbacks.\n.PP\nCare has been taken to ensure that libev does not keep local state inside\n\\&\\f(CW\\*(C`ev_run\\*(C'\\fR, and other calls do not usually allow for coroutine switches as\nthey do not call any callbacks.\n.SS \"\\s-1COMPILER WARNINGS\\s0\"\n.IX Subsection \"COMPILER WARNINGS\"\nDepending on your compiler and compiler settings, you might get no or a\nlot of warnings when compiling libev code. Some people are apparently\nscared by this.\n.PP\nHowever, these are unavoidable for many reasons. For one, each compiler\nhas different warnings, and each user has different tastes regarding\nwarning options. \\*(L\"Warn-free\\*(R\" code therefore cannot be a goal except when\ntargeting a specific compiler and compiler-version.\n.PP\nAnother reason is that some compiler warnings require elaborate\nworkarounds, or other changes to the code that make it less clear and less\nmaintainable.\n.PP\nAnd of course, some compiler warnings are just plain stupid, or simply\nwrong (because they don't actually warn about the condition their message\nseems to warn about). For example, certain older gcc versions had some\nwarnings that resulted in an extreme number of false positives. These have\nbeen fixed, but some people still insist on making code warn-free with\nsuch buggy versions.\n.PP\nWhile libev is written to generate as few warnings as possible,\n\\&\\*(L\"warn-free\\*(R\" code is not a goal, and it is recommended not to build libev\nwith any compiler warnings enabled unless you are prepared to cope with\nthem (e.g. by ignoring them). Remember that warnings are just that:\nwarnings, not errors, or proof of bugs.\n.SS \"\\s-1VALGRIND\\s0\"\n.IX Subsection \"VALGRIND\"\nValgrind has a special section here because it is a popular tool that is\nhighly useful. Unfortunately, valgrind reports are very hard to interpret.\n.PP\nIf you think you found a bug (memory leak, uninitialised data access etc.)\nin libev, then check twice: If valgrind reports something like:\n.PP\n.Vb 3\n\\&   ==2274==    definitely lost: 0 bytes in 0 blocks.\n\\&   ==2274==      possibly lost: 0 bytes in 0 blocks.\n\\&   ==2274==    still reachable: 256 bytes in 1 blocks.\n.Ve\n.PP\nThen there is no memory leak, just as memory accounted to global variables\nis not a memleak \\- the memory is still being referenced, and didn't leak.\n.PP\nSimilarly, under some circumstances, valgrind might report kernel bugs\nas if it were a bug in libev (e.g. in realloc or in the poll backend,\nalthough an acceptable workaround has been found here), or it might be\nconfused.\n.PP\nKeep in mind that valgrind is a very good tool, but only a tool. Don't\nmake it into some kind of religion.\n.PP\nIf you are unsure about something, feel free to contact the mailing list\nwith the full valgrind report and an explanation on why you think this\nis a bug in libev (best check the archives, too :). However, don't be\nannoyed when you get a brisk \\*(L\"this is no bug\\*(R\" answer and take the chance\nof learning how to interpret valgrind properly.\n.PP\nIf you need, for some reason, empty reports from valgrind for your project\nI suggest using suppression lists.\n.SH \"PORTABILITY NOTES\"\n.IX Header \"PORTABILITY NOTES\"\n.SS \"\\s-1GNU/LINUX 32 BIT LIMITATIONS\\s0\"\n.IX Subsection \"GNU/LINUX 32 BIT LIMITATIONS\"\nGNU/Linux is the only common platform that supports 64 bit file/large file\ninterfaces but \\fIdisables\\fR them by default.\n.PP\nThat means that libev compiled in the default environment doesn't support\nfiles larger than 2GiB or so, which mainly affects \\f(CW\\*(C`ev_stat\\*(C'\\fR watchers.\n.PP\nUnfortunately, many programs try to work around this GNU/Linux issue\nby enabling the large file \\s-1API,\\s0 which makes them incompatible with the\nstandard libev compiled for their system.\n.PP\nLikewise, libev cannot enable the large file \\s-1API\\s0 itself as this would\nsuddenly make it incompatible to the default compile time environment,\ni.e. all programs not using special compile switches.\n.SS \"\\s-1OS/X AND DARWIN BUGS\\s0\"\n.IX Subsection \"OS/X AND DARWIN BUGS\"\nThe whole thing is a bug if you ask me \\- basically any system interface\nyou touch is broken, whether it is locales, poll, kqueue or even the\nOpenGL drivers.\n.PP\n\\fI\\f(CI\\*(C`kqueue\\*(C'\\fI is buggy\\fR\n.IX Subsection \"kqueue is buggy\"\n.PP\nThe kqueue syscall is broken in all known versions \\- most versions support\nonly sockets, many support pipes.\n.PP\nLibev tries to work around this by not using \\f(CW\\*(C`kqueue\\*(C'\\fR by default on this\nrotten platform, but of course you can still ask for it when creating a\nloop \\- embedding a socket-only kqueue loop into a select-based one is\nprobably going to work well.\n.PP\n\\fI\\f(CI\\*(C`poll\\*(C'\\fI is buggy\\fR\n.IX Subsection \"poll is buggy\"\n.PP\nInstead of fixing \\f(CW\\*(C`kqueue\\*(C'\\fR, Apple replaced their (working) \\f(CW\\*(C`poll\\*(C'\\fR\nimplementation by something calling \\f(CW\\*(C`kqueue\\*(C'\\fR internally around the 10.5.6\nrelease, so now \\f(CW\\*(C`kqueue\\*(C'\\fR \\fIand\\fR \\f(CW\\*(C`poll\\*(C'\\fR are broken.\n.PP\nLibev tries to work around this by not using \\f(CW\\*(C`poll\\*(C'\\fR by default on\nthis rotten platform, but of course you can still ask for it when creating\na loop.\n.PP\n\\fI\\f(CI\\*(C`select\\*(C'\\fI is buggy\\fR\n.IX Subsection \"select is buggy\"\n.PP\nAll that's left is \\f(CW\\*(C`select\\*(C'\\fR, and of course Apple found a way to fuck this\none up as well: On \\s-1OS/X, \\s0\\f(CW\\*(C`select\\*(C'\\fR actively limits the number of file\ndescriptors you can pass in to 1024 \\- your program suddenly crashes when\nyou use more.\n.PP\nThere is an undocumented \\*(L\"workaround\\*(R\" for this \\- defining\n\\&\\f(CW\\*(C`_DARWIN_UNLIMITED_SELECT\\*(C'\\fR, which libev tries to use, so select \\fIshould\\fR\nwork on \\s-1OS/X.\\s0\n.SS \"\\s-1SOLARIS PROBLEMS AND WORKAROUNDS\\s0\"\n.IX Subsection \"SOLARIS PROBLEMS AND WORKAROUNDS\"\n\\fI\\f(CI\\*(C`errno\\*(C'\\fI reentrancy\\fR\n.IX Subsection \"errno reentrancy\"\n.PP\nThe default compile environment on Solaris is unfortunately so\nthread-unsafe that you can't even use components/libraries compiled\nwithout \\f(CW\\*(C`\\-D_REENTRANT\\*(C'\\fR in a threaded program, which, of course, isn't\ndefined by default. A valid, if stupid, implementation choice.\n.PP\nIf you want to use libev in threaded environments you have to make sure\nit's compiled with \\f(CW\\*(C`_REENTRANT\\*(C'\\fR defined.\n.PP\n\\fIEvent port backend\\fR\n.IX Subsection \"Event port backend\"\n.PP\nThe scalable event interface for Solaris is called \\*(L\"event\nports\\*(R\". Unfortunately, this mechanism is very buggy in all major\nreleases. If you run into high \\s-1CPU\\s0 usage, your program freezes or you get\na large number of spurious wakeups, make sure you have all the relevant\nand latest kernel patches applied. No, I don't know which ones, but there\nare multiple ones to apply, and afterwards, event ports actually work\ngreat.\n.PP\nIf you can't get it to work, you can try running the program by setting\nthe environment variable \\f(CW\\*(C`LIBEV_FLAGS=3\\*(C'\\fR to only allow \\f(CW\\*(C`poll\\*(C'\\fR and\n\\&\\f(CW\\*(C`select\\*(C'\\fR backends.\n.SS \"\\s-1AIX POLL BUG\\s0\"\n.IX Subsection \"AIX POLL BUG\"\n\\&\\s-1AIX\\s0 unfortunately has a broken \\f(CW\\*(C`poll.h\\*(C'\\fR header. Libev works around\nthis by trying to avoid the poll backend altogether (i.e. it's not even\ncompiled in), which normally isn't a big problem as \\f(CW\\*(C`select\\*(C'\\fR works fine\nwith large bitsets on \\s-1AIX,\\s0 and \\s-1AIX\\s0 is dead anyway.\n.SS \"\\s-1WIN32 PLATFORM LIMITATIONS AND WORKAROUNDS\\s0\"\n.IX Subsection \"WIN32 PLATFORM LIMITATIONS AND WORKAROUNDS\"\n\\fIGeneral issues\\fR\n.IX Subsection \"General issues\"\n.PP\nWin32 doesn't support any of the standards (e.g. \\s-1POSIX\\s0) that libev\nrequires, and its I/O model is fundamentally incompatible with the \\s-1POSIX\\s0\nmodel. Libev still offers limited functionality on this platform in\nthe form of the \\f(CW\\*(C`EVBACKEND_SELECT\\*(C'\\fR backend, and only supports socket\ndescriptors. This only applies when using Win32 natively, not when using\ne.g. cygwin. Actually, it only applies to the microsofts own compilers,\nas every compiler comes with a slightly differently broken/incompatible\nenvironment.\n.PP\nLifting these limitations would basically require the full\nre-implementation of the I/O system. If you are into this kind of thing,\nthen note that glib does exactly that for you in a very portable way (note\nalso that glib is the slowest event library known to man).\n.PP\nThere is no supported compilation method available on windows except\nembedding it into other applications.\n.PP\nSensible signal handling is officially unsupported by Microsoft \\- libev\ntries its best, but under most conditions, signals will simply not work.\n.PP\nNot a libev limitation but worth mentioning: windows apparently doesn't\naccept large writes: instead of resulting in a partial write, windows will\neither accept everything or return \\f(CW\\*(C`ENOBUFS\\*(C'\\fR if the buffer is too large,\nso make sure you only write small amounts into your sockets (less than a\nmegabyte seems safe, but this apparently depends on the amount of memory\navailable).\n.PP\nDue to the many, low, and arbitrary limits on the win32 platform and\nthe abysmal performance of winsockets, using a large number of sockets\nis not recommended (and not reasonable). If your program needs to use\nmore than a hundred or so sockets, then likely it needs to use a totally\ndifferent implementation for windows, as libev offers the \\s-1POSIX\\s0 readiness\nnotification model, which cannot be implemented efficiently on windows\n(due to Microsoft monopoly games).\n.PP\nA typical way to use libev under windows is to embed it (see the embedding\nsection for details) and use the following \\fIevwrap.h\\fR header file instead\nof \\fIev.h\\fR:\n.PP\n.Vb 2\n\\&   #define EV_STANDALONE              /* keeps ev from requiring config.h */\n\\&   #define EV_SELECT_IS_WINSOCKET 1   /* configure libev for windows select */\n\\&\n\\&   #include \"ev.h\"\n.Ve\n.PP\nAnd compile the following \\fIevwrap.c\\fR file into your project (make sure\nyou do \\fInot\\fR compile the \\fIev.c\\fR or any other embedded source files!):\n.PP\n.Vb 2\n\\&   #include \"evwrap.h\"\n\\&   #include \"ev.c\"\n.Ve\n.PP\n\\fIThe winsocket \\f(CI\\*(C`select\\*(C'\\fI function\\fR\n.IX Subsection \"The winsocket select function\"\n.PP\nThe winsocket \\f(CW\\*(C`select\\*(C'\\fR function doesn't follow \\s-1POSIX\\s0 in that it\nrequires socket \\fIhandles\\fR and not socket \\fIfile descriptors\\fR (it is\nalso extremely buggy). This makes select very inefficient, and also\nrequires a mapping from file descriptors to socket handles (the Microsoft\nC runtime provides the function \\f(CW\\*(C`_open_osfhandle\\*(C'\\fR for this). See the\ndiscussion of the \\f(CW\\*(C`EV_SELECT_USE_FD_SET\\*(C'\\fR, \\f(CW\\*(C`EV_SELECT_IS_WINSOCKET\\*(C'\\fR and\n\\&\\f(CW\\*(C`EV_FD_TO_WIN32_HANDLE\\*(C'\\fR preprocessor symbols for more info.\n.PP\nThe configuration for a \\*(L\"naked\\*(R\" win32 using the Microsoft runtime\nlibraries and raw winsocket select is:\n.PP\n.Vb 2\n\\&   #define EV_USE_SELECT 1\n\\&   #define EV_SELECT_IS_WINSOCKET 1   /* forces EV_SELECT_USE_FD_SET, too */\n.Ve\n.PP\nNote that winsockets handling of fd sets is O(n), so you can easily get a\ncomplexity in the O(nX) range when using win32.\n.PP\n\\fILimited number of file descriptors\\fR\n.IX Subsection \"Limited number of file descriptors\"\n.PP\nWindows has numerous arbitrary (and low) limits on things.\n.PP\nEarly versions of winsocket's select only supported waiting for a maximum\nof \\f(CW64\\fR handles (probably owning to the fact that all windows kernels\ncan only wait for \\f(CW64\\fR things at the same time internally; Microsoft\nrecommends spawning a chain of threads and wait for 63 handles and the\nprevious thread in each. Sounds great!).\n.PP\nNewer versions support more handles, but you need to define \\f(CW\\*(C`FD_SETSIZE\\*(C'\\fR\nto some high number (e.g. \\f(CW2048\\fR) before compiling the winsocket select\ncall (which might be in libev or elsewhere, for example, perl and many\nother interpreters do their own select emulation on windows).\n.PP\nAnother limit is the number of file descriptors in the Microsoft runtime\nlibraries, which by default is \\f(CW64\\fR (there must be a hidden \\fI64\\fR\nfetish or something like this inside Microsoft). You can increase this\nby calling \\f(CW\\*(C`_setmaxstdio\\*(C'\\fR, which can increase this limit to \\f(CW2048\\fR\n(another arbitrary limit), but is broken in many versions of the Microsoft\nruntime libraries. This might get you to about \\f(CW512\\fR or \\f(CW2048\\fR sockets\n(depending on windows version and/or the phase of the moon). To get more,\nyou need to wrap all I/O functions and provide your own fd management, but\nthe cost of calling select (O(nX)) will likely make this unworkable.\n.SS \"\\s-1PORTABILITY REQUIREMENTS\\s0\"\n.IX Subsection \"PORTABILITY REQUIREMENTS\"\nIn addition to a working ISO-C implementation and of course the\nbackend-specific APIs, libev relies on a few additional extensions:\n.ie n .IP \"\"\"void (*)(ev_watcher_type *, int revents)\"\" must have compatible calling conventions regardless of \"\"ev_watcher_type *\"\".\" 4\n.el .IP \"\\f(CWvoid (*)(ev_watcher_type *, int revents)\\fR must have compatible calling conventions regardless of \\f(CWev_watcher_type *\\fR.\" 4\n.IX Item \"void (*)(ev_watcher_type *, int revents) must have compatible calling conventions regardless of ev_watcher_type *.\"\nLibev assumes not only that all watcher pointers have the same internal\nstructure (guaranteed by \\s-1POSIX\\s0 but not by \\s-1ISO C\\s0 for example), but it also\nassumes that the same (machine) code can be used to call any watcher\ncallback: The watcher callbacks have different type signatures, but libev\ncalls them using an \\f(CW\\*(C`ev_watcher *\\*(C'\\fR internally.\n.IP \"pointer accesses must be thread-atomic\" 4\n.IX Item \"pointer accesses must be thread-atomic\"\nAccessing a pointer value must be atomic, it must both be readable and\nwritable in one piece \\- this is the case on all current architectures.\n.ie n .IP \"\"\"sig_atomic_t volatile\"\" must be thread-atomic as well\" 4\n.el .IP \"\\f(CWsig_atomic_t volatile\\fR must be thread-atomic as well\" 4\n.IX Item \"sig_atomic_t volatile must be thread-atomic as well\"\nThe type \\f(CW\\*(C`sig_atomic_t volatile\\*(C'\\fR (or whatever is defined as\n\\&\\f(CW\\*(C`EV_ATOMIC_T\\*(C'\\fR) must be atomic with respect to accesses from different\nthreads. This is not part of the specification for \\f(CW\\*(C`sig_atomic_t\\*(C'\\fR, but is\nbelieved to be sufficiently portable.\n.ie n .IP \"\"\"sigprocmask\"\" must work in a threaded environment\" 4\n.el .IP \"\\f(CWsigprocmask\\fR must work in a threaded environment\" 4\n.IX Item \"sigprocmask must work in a threaded environment\"\nLibev uses \\f(CW\\*(C`sigprocmask\\*(C'\\fR to temporarily block signals. This is not\nallowed in a threaded program (\\f(CW\\*(C`pthread_sigmask\\*(C'\\fR has to be used). Typical\npthread implementations will either allow \\f(CW\\*(C`sigprocmask\\*(C'\\fR in the \\*(L\"main\nthread\\*(R\" or will block signals process-wide, both behaviours would\nbe compatible with libev. Interaction between \\f(CW\\*(C`sigprocmask\\*(C'\\fR and\n\\&\\f(CW\\*(C`pthread_sigmask\\*(C'\\fR could complicate things, however.\n.Sp\nThe most portable way to handle signals is to block signals in all threads\nexcept the initial one, and run the signal handling loop in the initial\nthread as well.\n.ie n .IP \"\"\"long\"\" must be large enough for common memory allocation sizes\" 4\n.el .IP \"\\f(CWlong\\fR must be large enough for common memory allocation sizes\" 4\n.IX Item \"long must be large enough for common memory allocation sizes\"\nTo improve portability and simplify its \\s-1API,\\s0 libev uses \\f(CW\\*(C`long\\*(C'\\fR internally\ninstead of \\f(CW\\*(C`size_t\\*(C'\\fR when allocating its data structures. On non-POSIX\nsystems (Microsoft...) this might be unexpectedly low, but is still at\nleast 31 bits everywhere, which is enough for hundreds of millions of\nwatchers.\n.ie n .IP \"\"\"double\"\" must hold a time value in seconds with enough accuracy\" 4\n.el .IP \"\\f(CWdouble\\fR must hold a time value in seconds with enough accuracy\" 4\n.IX Item \"double must hold a time value in seconds with enough accuracy\"\nThe type \\f(CW\\*(C`double\\*(C'\\fR is used to represent timestamps. It is required to\nhave at least 51 bits of mantissa (and 9 bits of exponent), which is\ngood enough for at least into the year 4000 with millisecond accuracy\n(the design goal for libev). This requirement is overfulfilled by\nimplementations using \\s-1IEEE 754,\\s0 which is basically all existing ones.\n.Sp\nWith \\s-1IEEE 754\\s0 doubles, you get microsecond accuracy until at least the\nyear 2255 (and millisecond accuracy till the year 287396 \\- by then, libev\nis either obsolete or somebody patched it to use \\f(CW\\*(C`long double\\*(C'\\fR or\nsomething like that, just kidding).\n.PP\nIf you know of other additional requirements drop me a note.\n.SH \"ALGORITHMIC COMPLEXITIES\"\n.IX Header \"ALGORITHMIC COMPLEXITIES\"\nIn this section the complexities of (many of) the algorithms used inside\nlibev will be documented. For complexity discussions about backends see\nthe documentation for \\f(CW\\*(C`ev_default_init\\*(C'\\fR.\n.PP\nAll of the following are about amortised time: If an array needs to be\nextended, libev needs to realloc and move the whole array, but this\nhappens asymptotically rarer with higher number of elements, so O(1) might\nmean that libev does a lengthy realloc operation in rare cases, but on\naverage it is much faster and asymptotically approaches constant time.\n.IP \"Starting and stopping timer/periodic watchers: O(log skipped_other_timers)\" 4\n.IX Item \"Starting and stopping timer/periodic watchers: O(log skipped_other_timers)\"\nThis means that, when you have a watcher that triggers in one hour and\nthere are 100 watchers that would trigger before that, then inserting will\nhave to skip roughly seven (\\f(CW\\*(C`ld 100\\*(C'\\fR) of these watchers.\n.IP \"Changing timer/periodic watchers (by autorepeat or calling again): O(log skipped_other_timers)\" 4\n.IX Item \"Changing timer/periodic watchers (by autorepeat or calling again): O(log skipped_other_timers)\"\nThat means that changing a timer costs less than removing/adding them,\nas only the relative motion in the event queue has to be paid for.\n.IP \"Starting io/check/prepare/idle/signal/child/fork/async watchers: O(1)\" 4\n.IX Item \"Starting io/check/prepare/idle/signal/child/fork/async watchers: O(1)\"\nThese just add the watcher into an array or at the head of a list.\n.IP \"Stopping check/prepare/idle/fork/async watchers: O(1)\" 4\n.IX Item \"Stopping check/prepare/idle/fork/async watchers: O(1)\"\n.PD 0\n.IP \"Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % \\s-1EV_PID_HASHSIZE\\s0))\" 4\n.IX Item \"Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % EV_PID_HASHSIZE))\"\n.PD\nThese watchers are stored in lists, so they need to be walked to find the\ncorrect watcher to remove. The lists are usually short (you don't usually\nhave many watchers waiting for the same fd or signal: one is typical, two\nis rare).\n.IP \"Finding the next timer in each loop iteration: O(1)\" 4\n.IX Item \"Finding the next timer in each loop iteration: O(1)\"\nBy virtue of using a binary or 4\\-heap, the next timer is always found at a\nfixed position in the storage array.\n.IP \"Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)\" 4\n.IX Item \"Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)\"\nA change means an I/O watcher gets started or stopped, which requires\nlibev to recalculate its status (and possibly tell the kernel, depending\non backend and whether \\f(CW\\*(C`ev_io_set\\*(C'\\fR was used).\n.IP \"Activating one watcher (putting it into the pending state): O(1)\" 4\n.IX Item \"Activating one watcher (putting it into the pending state): O(1)\"\n.PD 0\n.IP \"Priority handling: O(number_of_priorities)\" 4\n.IX Item \"Priority handling: O(number_of_priorities)\"\n.PD\nPriorities are implemented by allocating some space for each\npriority. When doing priority-based operations, libev usually has to\nlinearly search all the priorities, but starting/stopping and activating\nwatchers becomes O(1) with respect to priority handling.\n.IP \"Sending an ev_async: O(1)\" 4\n.IX Item \"Sending an ev_async: O(1)\"\n.PD 0\n.IP \"Processing ev_async_send: O(number_of_async_watchers)\" 4\n.IX Item \"Processing ev_async_send: O(number_of_async_watchers)\"\n.IP \"Processing signals: O(max_signal_number)\" 4\n.IX Item \"Processing signals: O(max_signal_number)\"\n.PD\nSending involves a system call \\fIiff\\fR there were no other \\f(CW\\*(C`ev_async_send\\*(C'\\fR\ncalls in the current loop iteration and the loop is currently\nblocked. Checking for async and signal events involves iterating over all\nrunning async watchers or all signal numbers.\n.SH \"PORTING FROM LIBEV 3.X TO 4.X\"\n.IX Header \"PORTING FROM LIBEV 3.X TO 4.X\"\nThe major version 4 introduced some incompatible changes to the \\s-1API.\\s0\n.PP\nAt the moment, the \\f(CW\\*(C`ev.h\\*(C'\\fR header file provides compatibility definitions\nfor all changes, so most programs should still compile. The compatibility\nlayer might be removed in later versions of libev, so better update to the\nnew \\s-1API\\s0 early than late.\n.ie n .IP \"\"\"EV_COMPAT3\"\" backwards compatibility mechanism\" 4\n.el .IP \"\\f(CWEV_COMPAT3\\fR backwards compatibility mechanism\" 4\n.IX Item \"EV_COMPAT3 backwards compatibility mechanism\"\nThe backward compatibility mechanism can be controlled by\n\\&\\f(CW\\*(C`EV_COMPAT3\\*(C'\\fR. See \\*(L\"\\s-1PREPROCESSOR SYMBOLS/MACROS\\*(R\"\\s0 in the \\*(L\"\\s-1EMBEDDING\\*(R\"\\s0\nsection.\n.ie n .IP \"\"\"ev_default_destroy\"\" and \"\"ev_default_fork\"\" have been removed\" 4\n.el .IP \"\\f(CWev_default_destroy\\fR and \\f(CWev_default_fork\\fR have been removed\" 4\n.IX Item \"ev_default_destroy and ev_default_fork have been removed\"\nThese calls can be replaced easily by their \\f(CW\\*(C`ev_loop_xxx\\*(C'\\fR counterparts:\n.Sp\n.Vb 2\n\\&   ev_loop_destroy (EV_DEFAULT_UC);\n\\&   ev_loop_fork (EV_DEFAULT);\n.Ve\n.IP \"function/symbol renames\" 4\n.IX Item \"function/symbol renames\"\nA number of functions and symbols have been renamed:\n.Sp\n.Vb 3\n\\&  ev_loop         => ev_run\n\\&  EVLOOP_NONBLOCK => EVRUN_NOWAIT\n\\&  EVLOOP_ONESHOT  => EVRUN_ONCE\n\\&\n\\&  ev_unloop       => ev_break\n\\&  EVUNLOOP_CANCEL => EVBREAK_CANCEL\n\\&  EVUNLOOP_ONE    => EVBREAK_ONE\n\\&  EVUNLOOP_ALL    => EVBREAK_ALL\n\\&\n\\&  EV_TIMEOUT      => EV_TIMER\n\\&\n\\&  ev_loop_count   => ev_iteration\n\\&  ev_loop_depth   => ev_depth\n\\&  ev_loop_verify  => ev_verify\n.Ve\n.Sp\nMost functions working on \\f(CW\\*(C`struct ev_loop\\*(C'\\fR objects don't have an\n\\&\\f(CW\\*(C`ev_loop_\\*(C'\\fR prefix, so it was removed; \\f(CW\\*(C`ev_loop\\*(C'\\fR, \\f(CW\\*(C`ev_unloop\\*(C'\\fR and\nassociated constants have been renamed to not collide with the \\f(CW\\*(C`struct\nev_loop\\*(C'\\fR anymore and \\f(CW\\*(C`EV_TIMER\\*(C'\\fR now follows the same naming scheme\nas all other watcher types. Note that \\f(CW\\*(C`ev_loop_fork\\*(C'\\fR is still called\n\\&\\f(CW\\*(C`ev_loop_fork\\*(C'\\fR because it would otherwise clash with the \\f(CW\\*(C`ev_fork\\*(C'\\fR\ntypedef.\n.ie n .IP \"\"\"EV_MINIMAL\"\" mechanism replaced by \"\"EV_FEATURES\"\"\" 4\n.el .IP \"\\f(CWEV_MINIMAL\\fR mechanism replaced by \\f(CWEV_FEATURES\\fR\" 4\n.IX Item \"EV_MINIMAL mechanism replaced by EV_FEATURES\"\nThe preprocessor symbol \\f(CW\\*(C`EV_MINIMAL\\*(C'\\fR has been replaced by a different\nmechanism, \\f(CW\\*(C`EV_FEATURES\\*(C'\\fR. Programs using \\f(CW\\*(C`EV_MINIMAL\\*(C'\\fR usually compile\nand work, but the library code will of course be larger.\n.SH \"GLOSSARY\"\n.IX Header \"GLOSSARY\"\n.IP \"active\" 4\n.IX Item \"active\"\nA watcher is active as long as it has been started and not yet stopped.\nSee \\*(L\"\\s-1WATCHER STATES\\*(R\"\\s0 for details.\n.IP \"application\" 4\n.IX Item \"application\"\nIn this document, an application is whatever is using libev.\n.IP \"backend\" 4\n.IX Item \"backend\"\nThe part of the code dealing with the operating system interfaces.\n.IP \"callback\" 4\n.IX Item \"callback\"\nThe address of a function that is called when some event has been\ndetected. Callbacks are being passed the event loop, the watcher that\nreceived the event, and the actual event bitset.\n.IP \"callback/watcher invocation\" 4\n.IX Item \"callback/watcher invocation\"\nThe act of calling the callback associated with a watcher.\n.IP \"event\" 4\n.IX Item \"event\"\nA change of state of some external event, such as data now being available\nfor reading on a file descriptor, time having passed or simply not having\nany other events happening anymore.\n.Sp\nIn libev, events are represented as single bits (such as \\f(CW\\*(C`EV_READ\\*(C'\\fR or\n\\&\\f(CW\\*(C`EV_TIMER\\*(C'\\fR).\n.IP \"event library\" 4\n.IX Item \"event library\"\nA software package implementing an event model and loop.\n.IP \"event loop\" 4\n.IX Item \"event loop\"\nAn entity that handles and processes external events and converts them\ninto callback invocations.\n.IP \"event model\" 4\n.IX Item \"event model\"\nThe model used to describe how an event loop handles and processes\nwatchers and events.\n.IP \"pending\" 4\n.IX Item \"pending\"\nA watcher is pending as soon as the corresponding event has been\ndetected. See \\*(L\"\\s-1WATCHER STATES\\*(R\"\\s0 for details.\n.IP \"real time\" 4\n.IX Item \"real time\"\nThe physical time that is observed. It is apparently strictly monotonic :)\n.IP \"wall-clock time\" 4\n.IX Item \"wall-clock time\"\nThe time and date as shown on clocks. Unlike real time, it can actually\nbe wrong and jump forwards and backwards, e.g. when you adjust your\nclock.\n.IP \"watcher\" 4\n.IX Item \"watcher\"\nA data structure that describes interest in certain events. Watchers need\nto be started (attached to an event loop) before they can receive events.\n.SH \"AUTHOR\"\n.IX Header \"AUTHOR\"\nMarc Lehmann <libev@schmorp.de>, with repeated corrections by Mikael\nMagnusson and Emanuele Giaquinta, and minor corrections by many others.\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/ev.c",
    "content": "/*\n * libev event processing core, watcher management\n *\n * Copyright (c) 2007,2008,2009,2010,2011,2012,2013 Marc Alexander Lehmann <libev@schmorp.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modifica-\n * tion, are permitted provided that the following conditions are met:\n *\n *   1.  Redistributions of source code must retain the above copyright notice,\n *       this list of conditions and the following disclaimer.\n *\n *   2.  Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-\n * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-\n * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-\n * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Alternatively, the contents of this file may be used under the terms of\n * the GNU General Public License (\"GPL\") version 2 or any later version,\n * in which case the provisions of the GPL are applicable instead of\n * the above. If you wish to allow the use of your version of this file\n * only under the terms of the GPL and not to allow others to use your\n * version of this file under the BSD license, indicate your decision\n * by deleting the provisions above and replace them with the notice\n * and other provisions required by the GPL. If you do not delete the\n * provisions above, a recipient may use your version of this file under\n * either the BSD or the GPL.\n */\n\n/* this big block deduces configuration from config.h */\n#ifndef EV_STANDALONE\n# ifdef EV_CONFIG_H\n#  include EV_CONFIG_H\n# else\n#  include \"config.h\"\n# endif\n\n# if HAVE_FLOOR\n#  ifndef EV_USE_FLOOR\n#   define EV_USE_FLOOR 1\n#  endif\n# endif\n\n# if HAVE_CLOCK_SYSCALL\n#  ifndef EV_USE_CLOCK_SYSCALL\n#   define EV_USE_CLOCK_SYSCALL 1\n#   ifndef EV_USE_REALTIME\n#    define EV_USE_REALTIME  0\n#   endif\n#   ifndef EV_USE_MONOTONIC\n#    define EV_USE_MONOTONIC 1\n#   endif\n#  endif\n# elif !defined EV_USE_CLOCK_SYSCALL\n#  define EV_USE_CLOCK_SYSCALL 0\n# endif\n\n# if HAVE_CLOCK_GETTIME\n#  ifndef EV_USE_MONOTONIC\n#   define EV_USE_MONOTONIC 1\n#  endif\n#  ifndef EV_USE_REALTIME\n#   define EV_USE_REALTIME  0\n#  endif\n# else\n#  ifndef EV_USE_MONOTONIC\n#   define EV_USE_MONOTONIC 0\n#  endif\n#  ifndef EV_USE_REALTIME\n#   define EV_USE_REALTIME  0\n#  endif\n# endif\n\n# if HAVE_NANOSLEEP\n#  ifndef EV_USE_NANOSLEEP\n#    define EV_USE_NANOSLEEP EV_FEATURE_OS\n#  endif\n# else\n#   undef EV_USE_NANOSLEEP\n#   define EV_USE_NANOSLEEP 0\n# endif\n\n# if HAVE_SELECT //&& HAVE_SYS_SELECT_H\n#  ifndef EV_USE_SELECT\n#   define EV_USE_SELECT EV_FEATURE_BACKENDS\n#  endif\n# else\n#  undef EV_USE_SELECT\n#  define EV_USE_SELECT 0\n# endif\n\n# if HAVE_POLL && HAVE_POLL_H\n#  ifndef EV_USE_POLL\n#   define EV_USE_POLL EV_FEATURE_BACKENDS\n#  endif\n# else\n#  undef EV_USE_POLL\n#  define EV_USE_POLL 0\n# endif\n   \n# if HAVE_EPOLL_CTL && HAVE_SYS_EPOLL_H\n#  ifndef EV_USE_EPOLL\n#   define EV_USE_EPOLL EV_FEATURE_BACKENDS\n#  endif\n# else\n#  undef EV_USE_EPOLL\n#  define EV_USE_EPOLL 0\n# endif\n   \n# if HAVE_KQUEUE && HAVE_SYS_EVENT_H\n#  ifndef EV_USE_KQUEUE\n#   define EV_USE_KQUEUE EV_FEATURE_BACKENDS\n#  endif\n# else\n#  undef EV_USE_KQUEUE\n#  define EV_USE_KQUEUE 0\n# endif\n   \n# if HAVE_PORT_H && HAVE_PORT_CREATE\n#  ifndef EV_USE_PORT\n#   define EV_USE_PORT EV_FEATURE_BACKENDS\n#  endif\n# else\n#  undef EV_USE_PORT\n#  define EV_USE_PORT 0\n# endif\n\n# if HAVE_INOTIFY_INIT && HAVE_SYS_INOTIFY_H\n#  ifndef EV_USE_INOTIFY\n#   define EV_USE_INOTIFY EV_FEATURE_OS\n#  endif\n# else\n#  undef EV_USE_INOTIFY\n#  define EV_USE_INOTIFY 0\n# endif\n\n# if HAVE_SIGNALFD && HAVE_SYS_SIGNALFD_H\n#  ifndef EV_USE_SIGNALFD\n#   define EV_USE_SIGNALFD EV_FEATURE_OS\n#  endif\n# else\n#  undef EV_USE_SIGNALFD\n#  define EV_USE_SIGNALFD 0\n# endif\n\n# if HAVE_EVENTFD\n#  ifndef EV_USE_EVENTFD\n#   define EV_USE_EVENTFD EV_FEATURE_OS\n#  endif\n# else\n#  undef EV_USE_EVENTFD\n#  define EV_USE_EVENTFD 0\n# endif\n \n#endif\n\n#include <stdlib.h>\n#include <string.h>\n#include <fcntl.h>\n#include <stddef.h>\n\n#include <stdio.h>\n\n#include <assert.h>\n#include <errno.h>\n#include <sys/types.h>\n#include <time.h>\n#include <limits.h>\n\n#include <signal.h>\n\n#ifdef EV_H\n# include EV_H\n#else\n# include \"ev.h\"\n#endif\n\n#if EV_NO_THREADS\n# undef EV_NO_SMP\n# define EV_NO_SMP 1\n# undef ECB_NO_THREADS\n# define ECB_NO_THREADS 1\n#endif\n#if EV_NO_SMP\n# undef EV_NO_SMP\n# define ECB_NO_SMP 1\n#endif\n\n#ifndef _WIN32\n# include <sys/time.h>\n# include <sys/wait.h>\n# include <unistd.h>\n#else\n# include <io.h>\n# define WIN32_LEAN_AND_MEAN\n# include <winsock2.h>\n# include <windows.h>\n# ifndef EV_SELECT_IS_WINSOCKET\n#  define EV_SELECT_IS_WINSOCKET 1\n# endif\n# undef EV_AVOID_STDIO\n#endif\n\n/* OS X, in its infinite idiocy, actually HARDCODES\n * a limit of 1024 into their select. Where people have brains,\n * OS X engineers apparently have a vacuum. Or maybe they were\n * ordered to have a vacuum, or they do anything for money.\n * This might help. Or not.\n */\n#define _DARWIN_UNLIMITED_SELECT 1\n\n/* this block tries to deduce configuration from header-defined symbols and defaults */\n\n/* try to deduce the maximum number of signals on this platform */\n#if defined EV_NSIG\n/* use what's provided */\n#elif defined NSIG\n# define EV_NSIG (NSIG)\n#elif defined _NSIG\n# define EV_NSIG (_NSIG)\n#elif defined SIGMAX\n# define EV_NSIG (SIGMAX+1)\n#elif defined SIG_MAX\n# define EV_NSIG (SIG_MAX+1)\n#elif defined _SIG_MAX\n# define EV_NSIG (_SIG_MAX+1)\n#elif defined MAXSIG\n# define EV_NSIG (MAXSIG+1)\n#elif defined MAX_SIG\n# define EV_NSIG (MAX_SIG+1)\n#elif defined SIGARRAYSIZE\n# define EV_NSIG (SIGARRAYSIZE) /* Assume ary[SIGARRAYSIZE] */\n#elif defined _sys_nsig\n# define EV_NSIG (_sys_nsig) /* Solaris 2.5 */\n#else\n# define EV_NSIG (8 * sizeof (sigset_t) + 1)\n#endif\n\n#ifndef EV_USE_FLOOR\n# define EV_USE_FLOOR 0\n#endif\n\n#ifndef EV_USE_CLOCK_SYSCALL\n# if __linux && __GLIBC__ == 2 && __GLIBC_MINOR__ < 17\n#  define EV_USE_CLOCK_SYSCALL EV_FEATURE_OS\n# else\n#  define EV_USE_CLOCK_SYSCALL 0\n# endif\n#endif\n\n#if !(_POSIX_TIMERS > 0)\n# ifndef EV_USE_MONOTONIC\n#  define EV_USE_MONOTONIC 0\n# endif\n# ifndef EV_USE_REALTIME\n#  define EV_USE_REALTIME 0\n# endif\n#endif\n\n#ifndef EV_USE_MONOTONIC\n# if defined _POSIX_MONOTONIC_CLOCK && _POSIX_MONOTONIC_CLOCK >= 0\n#  define EV_USE_MONOTONIC EV_FEATURE_OS\n# else\n#  define EV_USE_MONOTONIC 0\n# endif\n#endif\n\n#ifndef EV_USE_REALTIME\n# define EV_USE_REALTIME !EV_USE_CLOCK_SYSCALL\n#endif\n\n#ifndef EV_USE_NANOSLEEP\n# if _POSIX_C_SOURCE >= 199309L\n#  define EV_USE_NANOSLEEP EV_FEATURE_OS\n# else\n#  define EV_USE_NANOSLEEP 0\n# endif\n#endif\n\n#ifndef EV_USE_SELECT\n# define EV_USE_SELECT EV_FEATURE_BACKENDS\n#endif\n\n#ifndef EV_USE_POLL\n# ifdef _WIN32\n#  define EV_USE_POLL 0\n# else\n#  define EV_USE_POLL EV_FEATURE_BACKENDS\n# endif\n#endif\n\n#ifndef EV_USE_EPOLL\n# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 4))\n#  define EV_USE_EPOLL EV_FEATURE_BACKENDS\n# else\n#  define EV_USE_EPOLL 0\n# endif\n#endif\n\n#ifndef EV_USE_KQUEUE\n# define EV_USE_KQUEUE 0\n#endif\n\n#ifndef EV_USE_PORT\n# define EV_USE_PORT 0\n#endif\n\n#ifndef EV_USE_INOTIFY\n# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 4))\n#  define EV_USE_INOTIFY EV_FEATURE_OS\n# else\n#  define EV_USE_INOTIFY 0\n# endif\n#endif\n\n#ifndef EV_PID_HASHSIZE\n# define EV_PID_HASHSIZE EV_FEATURE_DATA ? 16 : 1\n#endif\n\n#ifndef EV_INOTIFY_HASHSIZE\n# define EV_INOTIFY_HASHSIZE EV_FEATURE_DATA ? 16 : 1\n#endif\n\n#ifndef EV_USE_EVENTFD\n# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7))\n#  define EV_USE_EVENTFD EV_FEATURE_OS\n# else\n#  define EV_USE_EVENTFD 0\n# endif\n#endif\n\n#ifndef EV_USE_SIGNALFD\n# if __linux && (__GLIBC__ > 2 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 7))\n#  define EV_USE_SIGNALFD EV_FEATURE_OS\n# else\n#  define EV_USE_SIGNALFD 0\n# endif\n#endif\n\n#if 0 /* debugging */\n# define EV_VERIFY 3\n# define EV_USE_4HEAP 1\n# define EV_HEAP_CACHE_AT 1\n#endif\n\n#ifndef EV_VERIFY\n# define EV_VERIFY (EV_FEATURE_API ? 1 : 0)\n#endif\n\n#ifndef EV_USE_4HEAP\n# define EV_USE_4HEAP EV_FEATURE_DATA\n#endif\n\n#ifndef EV_HEAP_CACHE_AT\n# define EV_HEAP_CACHE_AT EV_FEATURE_DATA\n#endif\n\n#ifdef ANDROID\n/* supposedly, android doesn't typedef fd_mask */\n# undef EV_USE_SELECT\n# define EV_USE_SELECT 0\n/* supposedly, we need to include syscall.h, not sys/syscall.h, so just disable */\n# undef EV_USE_CLOCK_SYSCALL\n# define EV_USE_CLOCK_SYSCALL 0\n#endif\n\n/* aix's poll.h seems to cause lots of trouble */\n#ifdef _AIX\n/* AIX has a completely broken poll.h header */\n# undef EV_USE_POLL\n# define EV_USE_POLL 0\n#endif\n\n/* on linux, we can use a (slow) syscall to avoid a dependency on pthread, */\n/* which makes programs even slower. might work on other unices, too. */\n#if EV_USE_CLOCK_SYSCALL\n# include <sys/syscall.h>\n# ifdef SYS_clock_gettime\n#  define clock_gettime(id, ts) syscall (SYS_clock_gettime, (id), (ts))\n#  undef EV_USE_MONOTONIC\n#  define EV_USE_MONOTONIC 1\n# else\n#  undef EV_USE_CLOCK_SYSCALL\n#  define EV_USE_CLOCK_SYSCALL 0\n# endif\n#endif\n\n/* this block fixes any misconfiguration where we know we run into trouble otherwise */\n\n#ifndef CLOCK_MONOTONIC\n# undef EV_USE_MONOTONIC\n# define EV_USE_MONOTONIC 0\n#endif\n\n#ifndef CLOCK_REALTIME\n# undef EV_USE_REALTIME\n# define EV_USE_REALTIME 0\n#endif\n\n#if !EV_STAT_ENABLE\n# undef EV_USE_INOTIFY\n# define EV_USE_INOTIFY 0\n#endif\n\n#if !EV_USE_NANOSLEEP\n/* hp-ux has it in sys/time.h, which we unconditionally include above */\n# if !defined _WIN32 && !defined __hpux\n#  include <sys/select.h>\n# endif\n#endif\n\n#if EV_USE_INOTIFY\n# include <sys/statfs.h>\n# include <sys/inotify.h>\n/* some very old inotify.h headers don't have IN_DONT_FOLLOW */\n# ifndef IN_DONT_FOLLOW\n#  undef EV_USE_INOTIFY\n#  define EV_USE_INOTIFY 0\n# endif\n#endif\n\n#if EV_USE_EVENTFD\n/* our minimum requirement is glibc 2.7 which has the stub, but not the header */\n# include <stdint.h>\n# ifndef EFD_NONBLOCK\n#  define EFD_NONBLOCK O_NONBLOCK\n# endif\n# ifndef EFD_CLOEXEC\n#  ifdef O_CLOEXEC\n#   define EFD_CLOEXEC O_CLOEXEC\n#  else\n#   define EFD_CLOEXEC 02000000\n#  endif\n# endif\nEV_CPP(extern \"C\") int (eventfd) (unsigned int initval, int flags);\n#endif\n\n#if EV_USE_SIGNALFD\n/* our minimum requirement is glibc 2.7 which has the stub, but not the header */\n# include <stdint.h>\n# ifndef SFD_NONBLOCK\n#  define SFD_NONBLOCK O_NONBLOCK\n# endif\n# ifndef SFD_CLOEXEC\n#  ifdef O_CLOEXEC\n#   define SFD_CLOEXEC O_CLOEXEC\n#  else\n#   define SFD_CLOEXEC 02000000\n#  endif\n# endif\nEV_CPP (extern \"C\") int signalfd (int fd, const sigset_t *mask, int flags);\n\nstruct signalfd_siginfo\n{\n  uint32_t ssi_signo;\n  char pad[128 - sizeof (uint32_t)];\n};\n#endif\n\n/**/\n\n#if EV_VERIFY >= 3\n# define EV_FREQUENT_CHECK ev_verify (EV_A)\n#else\n# define EV_FREQUENT_CHECK do { } while (0)\n#endif\n\n/*\n * This is used to work around floating point rounding problems.\n * This value is good at least till the year 4000.\n */\n#define MIN_INTERVAL  0.0001220703125 /* 1/2**13, good till 4000 */\n/*#define MIN_INTERVAL  0.00000095367431640625 /* 1/2**20, good till 2200 */\n\n#define MIN_TIMEJUMP  1. /* minimum timejump that gets detected (if monotonic clock available) */\n#define MAX_BLOCKTIME 59.743 /* never wait longer than this time (to detect time jumps) */\n\n#define EV_TV_SET(tv,t) do { tv.tv_sec = (long)t; tv.tv_usec = (long)((t - tv.tv_sec) * 1e6); } while (0)\n#define EV_TS_SET(ts,t) do { ts.tv_sec = (long)t; ts.tv_nsec = (long)((t - ts.tv_sec) * 1e9); } while (0)\n\n/* the following is ecb.h embedded into libev - use update_ev_c to update from an external copy */\n/* ECB.H BEGIN */\n/*\n * libecb - http://software.schmorp.de/pkg/libecb\n *\n * Copyright (©) 2009-2015 Marc Alexander Lehmann <libecb@schmorp.de>\n * Copyright (©) 2011 Emanuele Giaquinta\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modifica-\n * tion, are permitted provided that the following conditions are met:\n *\n *   1.  Redistributions of source code must retain the above copyright notice,\n *       this list of conditions and the following disclaimer.\n *\n *   2.  Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-\n * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-\n * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-\n * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Alternatively, the contents of this file may be used under the terms of\n * the GNU General Public License (\"GPL\") version 2 or any later version,\n * in which case the provisions of the GPL are applicable instead of\n * the above. If you wish to allow the use of your version of this file\n * only under the terms of the GPL and not to allow others to use your\n * version of this file under the BSD license, indicate your decision\n * by deleting the provisions above and replace them with the notice\n * and other provisions required by the GPL. If you do not delete the\n * provisions above, a recipient may use your version of this file under\n * either the BSD or the GPL.\n */\n\n#ifndef ECB_H\n#define ECB_H\n\n/* 16 bits major, 16 bits minor */\n#define ECB_VERSION 0x00010005\n\n#ifdef _WIN32\n  typedef   signed char   int8_t;\n  typedef unsigned char  uint8_t;\n  typedef   signed short  int16_t;\n  typedef unsigned short uint16_t;\n  typedef   signed int    int32_t;\n  typedef unsigned int   uint32_t;\n  #if __GNUC__\n    typedef   signed long long int64_t;\n    typedef unsigned long long uint64_t;\n  #else /* _MSC_VER || __BORLANDC__ */\n    typedef   signed __int64   int64_t;\n    typedef unsigned __int64   uint64_t;\n  #endif\n  #ifdef _WIN64\n    #define ECB_PTRSIZE 8\n    typedef uint64_t uintptr_t;\n    typedef  int64_t  intptr_t;\n  #else\n    #define ECB_PTRSIZE 4\n    typedef uint32_t uintptr_t;\n    typedef  int32_t  intptr_t;\n  #endif\n#else\n  #include <inttypes.h>\n  #if (defined INTPTR_MAX ? INTPTR_MAX : ULONG_MAX) > 0xffffffffU\n    #define ECB_PTRSIZE 8\n  #else\n    #define ECB_PTRSIZE 4\n  #endif\n#endif\n\n#define ECB_GCC_AMD64 (__amd64 || __amd64__ || __x86_64 || __x86_64__)\n#define ECB_MSVC_AMD64 (_M_AMD64 || _M_X64)\n\n/* work around x32 idiocy by defining proper macros */\n#if ECB_GCC_AMD64 || ECB_MSVC_AMD64\n  #if _ILP32\n    #define ECB_AMD64_X32 1\n  #else\n    #define ECB_AMD64 1\n  #endif\n#endif\n\n/* many compilers define _GNUC_ to some versions but then only implement\n * what their idiot authors think are the \"more important\" extensions,\n * causing enormous grief in return for some better fake benchmark numbers.\n * or so.\n * we try to detect these and simply assume they are not gcc - if they have\n * an issue with that they should have done it right in the first place.\n */\n#if !defined __GNUC_MINOR__ || defined __INTEL_COMPILER || defined __SUNPRO_C || defined __SUNPRO_CC || defined __llvm__ || defined __clang__\n  #define ECB_GCC_VERSION(major,minor) 0\n#else\n  #define ECB_GCC_VERSION(major,minor) (__GNUC__ > (major) || (__GNUC__ == (major) && __GNUC_MINOR__ >= (minor)))\n#endif\n\n#define ECB_CLANG_VERSION(major,minor) (__clang_major__ > (major) || (__clang_major__ == (major) && __clang_minor__ >= (minor)))\n\n#if __clang__ && defined __has_builtin\n  #define ECB_CLANG_BUILTIN(x) __has_builtin (x)\n#else\n  #define ECB_CLANG_BUILTIN(x) 0\n#endif\n\n#if __clang__ && defined __has_extension\n  #define ECB_CLANG_EXTENSION(x) __has_extension (x)\n#else\n  #define ECB_CLANG_EXTENSION(x) 0\n#endif\n\n#define ECB_CPP   (__cplusplus+0)\n#define ECB_CPP11 (__cplusplus >= 201103L)\n\n#if ECB_CPP\n  #define ECB_C            0\n  #define ECB_STDC_VERSION 0\n#else\n  #define ECB_C            1\n  #define ECB_STDC_VERSION __STDC_VERSION__\n#endif\n\n#define ECB_C99   (ECB_STDC_VERSION >= 199901L)\n#define ECB_C11   (ECB_STDC_VERSION >= 201112L)\n\n#if ECB_CPP\n  #define ECB_EXTERN_C extern \"C\"\n  #define ECB_EXTERN_C_BEG ECB_EXTERN_C {\n  #define ECB_EXTERN_C_END }\n#else\n  #define ECB_EXTERN_C extern\n  #define ECB_EXTERN_C_BEG\n  #define ECB_EXTERN_C_END\n#endif\n\n/*****************************************************************************/\n\n/* ECB_NO_THREADS - ecb is not used by multiple threads, ever */\n/* ECB_NO_SMP     - ecb might be used in multiple threads, but only on a single cpu */\n\n#if ECB_NO_THREADS\n  #define ECB_NO_SMP 1\n#endif\n\n#if ECB_NO_SMP\n  #define ECB_MEMORY_FENCE do { } while (0)\n#endif\n\n/* http://www-01.ibm.com/support/knowledgecenter/SSGH3R_13.1.0/com.ibm.xlcpp131.aix.doc/compiler_ref/compiler_builtins.html */\n#if __xlC__ && ECB_CPP\n  #include <builtins.h>\n#endif\n\n#if 1400 <= _MSC_VER\n  #include <intrin.h> /* fence functions _ReadBarrier, also bit search functions _BitScanReverse */\n#endif\n\n#ifndef ECB_MEMORY_FENCE\n  #if ECB_GCC_VERSION(2,5) || defined __INTEL_COMPILER || (__llvm__ && __GNUC__) || __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110\n    #if __i386 || __i386__\n      #define ECB_MEMORY_FENCE         __asm__ __volatile__ (\"lock; orb $0, -1(%%esp)\" : : : \"memory\")\n      #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ (\"\"                        : : : \"memory\")\n      #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ (\"\")\n    #elif ECB_GCC_AMD64\n      #define ECB_MEMORY_FENCE         __asm__ __volatile__ (\"mfence\"   : : : \"memory\")\n      #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ (\"\"         : : : \"memory\")\n      #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ (\"\")\n    #elif __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__\n      #define ECB_MEMORY_FENCE         __asm__ __volatile__ (\"sync\"     : : : \"memory\")\n    #elif defined __ARM_ARCH_2__ \\\n      || defined __ARM_ARCH_3__  || defined __ARM_ARCH_3M__  \\\n      || defined __ARM_ARCH_4__  || defined __ARM_ARCH_4T__  \\\n      || defined __ARM_ARCH_5__  || defined __ARM_ARCH_5E__  \\\n      || defined __ARM_ARCH_5T__ || defined __ARM_ARCH_5TE__ \\\n      || defined __ARM_ARCH_5TEJ__\n      /* should not need any, unless running old code on newer cpu - arm doesn't support that */\n    #elif defined __ARM_ARCH_6__  || defined __ARM_ARCH_6J__  \\\n       || defined __ARM_ARCH_6K__ || defined __ARM_ARCH_6ZK__ \\\n       || defined __ARM_ARCH_6T2__\n      #define ECB_MEMORY_FENCE         __asm__ __volatile__ (\"mcr p15,0,%0,c7,c10,5\" : : \"r\" (0) : \"memory\")\n    #elif defined __ARM_ARCH_7__  || defined __ARM_ARCH_7A__  \\\n       || defined __ARM_ARCH_7R__ || defined __ARM_ARCH_7M__\n      #define ECB_MEMORY_FENCE         __asm__ __volatile__ (\"dmb\"      : : : \"memory\")\n    #elif __aarch64__\n      #define ECB_MEMORY_FENCE         __asm__ __volatile__ (\"dmb ish\"  : : : \"memory\")\n    #elif (__sparc || __sparc__) && !(__sparc_v8__ || defined __sparcv8)\n      #define ECB_MEMORY_FENCE         __asm__ __volatile__ (\"membar #LoadStore | #LoadLoad | #StoreStore | #StoreLoad\" : : : \"memory\")\n      #define ECB_MEMORY_FENCE_ACQUIRE __asm__ __volatile__ (\"membar #LoadStore | #LoadLoad\"                            : : : \"memory\")\n      #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ (\"membar #LoadStore             | #StoreStore\")\n    #elif defined __s390__ || defined __s390x__\n      #define ECB_MEMORY_FENCE         __asm__ __volatile__ (\"bcr 15,0\" : : : \"memory\")\n    #elif defined __mips__\n      /* GNU/Linux emulates sync on mips1 architectures, so we force its use */\n      /* anybody else who still uses mips1 is supposed to send in their version, with detection code. */\n      #define ECB_MEMORY_FENCE         __asm__ __volatile__ (\".set mips2; sync; .set mips0\" : : : \"memory\")\n    #elif defined __alpha__\n      #define ECB_MEMORY_FENCE         __asm__ __volatile__ (\"mb\"       : : : \"memory\")\n    #elif defined __hppa__\n      #define ECB_MEMORY_FENCE         __asm__ __volatile__ (\"\"         : : : \"memory\")\n      #define ECB_MEMORY_FENCE_RELEASE __asm__ __volatile__ (\"\")\n    #elif defined __ia64__\n      #define ECB_MEMORY_FENCE         __asm__ __volatile__ (\"mf\"       : : : \"memory\")\n    #elif defined __m68k__\n      #define ECB_MEMORY_FENCE         __asm__ __volatile__ (\"\"         : : : \"memory\")\n    #elif defined __m88k__\n      #define ECB_MEMORY_FENCE         __asm__ __volatile__ (\"tb1 0,%%r0,128\" : : : \"memory\")\n    #elif defined __sh__\n      #define ECB_MEMORY_FENCE         __asm__ __volatile__ (\"\"         : : : \"memory\")\n    #endif\n  #endif\n#endif\n\n#ifndef ECB_MEMORY_FENCE\n  #if ECB_GCC_VERSION(4,7)\n    /* see comment below (stdatomic.h) about the C11 memory model. */\n    #define ECB_MEMORY_FENCE         __atomic_thread_fence (__ATOMIC_SEQ_CST)\n    #define ECB_MEMORY_FENCE_ACQUIRE __atomic_thread_fence (__ATOMIC_ACQUIRE)\n    #define ECB_MEMORY_FENCE_RELEASE __atomic_thread_fence (__ATOMIC_RELEASE)\n\n  #elif ECB_CLANG_EXTENSION(c_atomic)\n    /* see comment below (stdatomic.h) about the C11 memory model. */\n    #define ECB_MEMORY_FENCE         __c11_atomic_thread_fence (__ATOMIC_SEQ_CST)\n    #define ECB_MEMORY_FENCE_ACQUIRE __c11_atomic_thread_fence (__ATOMIC_ACQUIRE)\n    #define ECB_MEMORY_FENCE_RELEASE __c11_atomic_thread_fence (__ATOMIC_RELEASE)\n\n  #elif ECB_GCC_VERSION(4,4) || defined __INTEL_COMPILER || defined __clang__\n    #define ECB_MEMORY_FENCE         __sync_synchronize ()\n  #elif _MSC_VER >= 1500 /* VC++ 2008 */\n    /* apparently, microsoft broke all the memory barrier stuff in Visual Studio 2008... */\n    #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier)\n    #define ECB_MEMORY_FENCE         _ReadWriteBarrier (); MemoryBarrier()\n    #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier (); MemoryBarrier() /* according to msdn, _ReadBarrier is not a load fence */\n    #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier (); MemoryBarrier()\n  #elif _MSC_VER >= 1400 /* VC++ 2005 */\n    #pragma intrinsic(_ReadBarrier,_WriteBarrier,_ReadWriteBarrier)\n    #define ECB_MEMORY_FENCE         _ReadWriteBarrier ()\n    #define ECB_MEMORY_FENCE_ACQUIRE _ReadWriteBarrier () /* according to msdn, _ReadBarrier is not a load fence */\n    #define ECB_MEMORY_FENCE_RELEASE _WriteBarrier ()\n  #elif defined _WIN32\n    #include <WinNT.h>\n    #define ECB_MEMORY_FENCE         MemoryBarrier () /* actually just xchg on x86... scary */\n  #elif __SUNPRO_C >= 0x5110 || __SUNPRO_CC >= 0x5110\n    #include <mbarrier.h>\n    #define ECB_MEMORY_FENCE         __machine_rw_barrier ()\n    #define ECB_MEMORY_FENCE_ACQUIRE __machine_r_barrier  ()\n    #define ECB_MEMORY_FENCE_RELEASE __machine_w_barrier  ()\n  #elif __xlC__\n    #define ECB_MEMORY_FENCE         __sync ()\n  #endif\n#endif\n\n#ifndef ECB_MEMORY_FENCE\n  #if ECB_C11 && !defined __STDC_NO_ATOMICS__\n    /* we assume that these memory fences work on all variables/all memory accesses, */\n    /* not just C11 atomics and atomic accesses */\n    #include <stdatomic.h>\n    /* Unfortunately, neither gcc 4.7 nor clang 3.1 generate any instructions for */\n    /* any fence other than seq_cst, which isn't very efficient for us. */\n    /* Why that is, we don't know - either the C11 memory model is quite useless */\n    /* for most usages, or gcc and clang have a bug */\n    /* I *currently* lean towards the latter, and inefficiently implement */\n    /* all three of ecb's fences as a seq_cst fence */\n    /* Update, gcc-4.8 generates mfence for all c++ fences, but nothing */\n    /* for all __atomic_thread_fence's except seq_cst */\n    #define ECB_MEMORY_FENCE         atomic_thread_fence (memory_order_seq_cst)\n  #endif\n#endif\n\n#ifndef ECB_MEMORY_FENCE\n  #if !ECB_AVOID_PTHREADS\n    /*\n     * if you get undefined symbol references to pthread_mutex_lock,\n     * or failure to find pthread.h, then you should implement\n     * the ECB_MEMORY_FENCE operations for your cpu/compiler\n     * OR provide pthread.h and link against the posix thread library\n     * of your system.\n     */\n    #include <pthread.h>\n    #define ECB_NEEDS_PTHREADS 1\n    #define ECB_MEMORY_FENCE_NEEDS_PTHREADS 1\n\n    static pthread_mutex_t ecb_mf_lock = PTHREAD_MUTEX_INITIALIZER;\n    #define ECB_MEMORY_FENCE do { pthread_mutex_lock (&ecb_mf_lock); pthread_mutex_unlock (&ecb_mf_lock); } while (0)\n  #endif\n#endif\n\n#if !defined ECB_MEMORY_FENCE_ACQUIRE && defined ECB_MEMORY_FENCE\n  #define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE\n#endif\n\n#if !defined ECB_MEMORY_FENCE_RELEASE && defined ECB_MEMORY_FENCE\n  #define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE\n#endif\n\n/*****************************************************************************/\n\n#if ECB_CPP\n  #define ecb_inline static inline\n#elif ECB_GCC_VERSION(2,5)\n  #define ecb_inline static __inline__\n#elif ECB_C99\n  #define ecb_inline static inline\n#else\n  #define ecb_inline static\n#endif\n\n#if ECB_GCC_VERSION(3,3)\n  #define ecb_restrict __restrict__\n#elif ECB_C99\n  #define ecb_restrict restrict\n#else\n  #define ecb_restrict\n#endif\n\ntypedef int ecb_bool;\n\n#define ECB_CONCAT_(a, b) a ## b\n#define ECB_CONCAT(a, b) ECB_CONCAT_(a, b)\n#define ECB_STRINGIFY_(a) # a\n#define ECB_STRINGIFY(a) ECB_STRINGIFY_(a)\n#define ECB_STRINGIFY_EXPR(expr) ((expr), ECB_STRINGIFY_ (expr))\n\n#define ecb_function_ ecb_inline\n\n#if ECB_GCC_VERSION(3,1) || ECB_CLANG_VERSION(2,8)\n  #define ecb_attribute(attrlist)        __attribute__ (attrlist)\n#else\n  #define ecb_attribute(attrlist)\n#endif\n\n#if ECB_GCC_VERSION(3,1) || ECB_CLANG_BUILTIN(__builtin_constant_p)\n  #define ecb_is_constant(expr)          __builtin_constant_p (expr)\n#else\n  /* possible C11 impl for integral types\n  typedef struct ecb_is_constant_struct ecb_is_constant_struct;\n  #define ecb_is_constant(expr)          _Generic ((1 ? (struct ecb_is_constant_struct *)0 : (void *)((expr) - (expr)), ecb_is_constant_struct *: 0, default: 1)) */\n\n  #define ecb_is_constant(expr)          0\n#endif\n\n#if ECB_GCC_VERSION(3,1) || ECB_CLANG_BUILTIN(__builtin_expect)\n  #define ecb_expect(expr,value)         __builtin_expect ((expr),(value))\n#else\n  #define ecb_expect(expr,value)         (expr)\n#endif\n\n#if ECB_GCC_VERSION(3,1) || ECB_CLANG_BUILTIN(__builtin_prefetch)\n  #define ecb_prefetch(addr,rw,locality) __builtin_prefetch (addr, rw, locality)\n#else\n  #define ecb_prefetch(addr,rw,locality)\n#endif\n\n/* no emulation for ecb_decltype */\n#if ECB_CPP11\n  // older implementations might have problems with decltype(x)::type, work around it\n  template<class T> struct ecb_decltype_t { typedef T type; };\n  #define ecb_decltype(x) ecb_decltype_t<decltype (x)>::type\n#elif ECB_GCC_VERSION(3,0) || ECB_CLANG_VERSION(2,8)\n  #define ecb_decltype(x) __typeof__ (x)\n#endif\n\n#if _MSC_VER >= 1300\n  #define ecb_deprecated __declspec (deprecated)\n#else\n  #define ecb_deprecated ecb_attribute ((__deprecated__))\n#endif\n\n#if _MSC_VER >= 1500\n  #define ecb_deprecated_message(msg) __declspec (deprecated (msg))\n#elif ECB_GCC_VERSION(4,5)\n  #define ecb_deprecated_message(msg) ecb_attribute ((__deprecated__ (msg))\n#else\n  #define ecb_deprecated_message(msg) ecb_deprecated\n#endif\n\n#if _MSC_VER >= 1400\n  #define ecb_noinline __declspec (noinline)\n#else\n  #define ecb_noinline ecb_attribute ((__noinline__))\n#endif\n\n#define ecb_unused     ecb_attribute ((__unused__))\n#define ecb_const      ecb_attribute ((__const__))\n#define ecb_pure       ecb_attribute ((__pure__))\n\n#if ECB_C11 || __IBMC_NORETURN\n  /* http://www-01.ibm.com/support/knowledgecenter/SSGH3R_13.1.0/com.ibm.xlcpp131.aix.doc/language_ref/noreturn.html */\n  #define ecb_noreturn   _Noreturn\n#elif ECB_CPP11\n  #define ecb_noreturn   [[noreturn]]\n#elif _MSC_VER >= 1200\n  /* http://msdn.microsoft.com/en-us/library/k6ktzx3s.aspx */\n  #define ecb_noreturn   __declspec (noreturn)\n#else\n  #define ecb_noreturn   ecb_attribute ((__noreturn__))\n#endif\n\n#if ECB_GCC_VERSION(4,3)\n  #define ecb_artificial ecb_attribute ((__artificial__))\n  #define ecb_hot        ecb_attribute ((__hot__))\n  #define ecb_cold       ecb_attribute ((__cold__))\n#else\n  #define ecb_artificial\n  #define ecb_hot\n  #define ecb_cold\n#endif\n\n/* put around conditional expressions if you are very sure that the  */\n/* expression is mostly true or mostly false. note that these return */\n/* booleans, not the expression.                                     */\n#define ecb_expect_false(expr) ecb_expect (!!(expr), 0)\n#define ecb_expect_true(expr)  ecb_expect (!!(expr), 1)\n/* for compatibility to the rest of the world */\n#define ecb_likely(expr)   ecb_expect_true  (expr)\n#define ecb_unlikely(expr) ecb_expect_false (expr)\n\n/* count trailing zero bits and count # of one bits */\n#if ECB_GCC_VERSION(3,4) \\\n    || (ECB_CLANG_BUILTIN(__builtin_clz) && ECB_CLANG_BUILTIN(__builtin_clzll) \\\n        && ECB_CLANG_BUILTIN(__builtin_ctz) && ECB_CLANG_BUILTIN(__builtin_ctzll) \\\n        && ECB_CLANG_BUILTIN(__builtin_popcount))\n  /* we assume int == 32 bit, long == 32 or 64 bit and long long == 64 bit */\n  #define ecb_ld32(x)      (__builtin_clz      (x) ^ 31)\n  #define ecb_ld64(x)      (__builtin_clzll    (x) ^ 63)\n  #define ecb_ctz32(x)      __builtin_ctz      (x)\n  #define ecb_ctz64(x)      __builtin_ctzll    (x)\n  #define ecb_popcount32(x) __builtin_popcount (x)\n  /* no popcountll */\n#else\n  ecb_function_ ecb_const int ecb_ctz32 (uint32_t x);\n  ecb_function_ ecb_const int\n  ecb_ctz32 (uint32_t x)\n  {\n#if 1400 <= _MSC_VER && (_M_IX86 || _M_X64 || _M_IA64 || _M_ARM)\n    unsigned long r;\n    _BitScanForward (&r, x);\n    return (int)r;\n#else\n    int r = 0;\n\n    x &= ~x + 1; /* this isolates the lowest bit */\n\n#if ECB_branchless_on_i386\n    r += !!(x & 0xaaaaaaaa) << 0;\n    r += !!(x & 0xcccccccc) << 1;\n    r += !!(x & 0xf0f0f0f0) << 2;\n    r += !!(x & 0xff00ff00) << 3;\n    r += !!(x & 0xffff0000) << 4;\n#else\n    if (x & 0xaaaaaaaa) r +=  1;\n    if (x & 0xcccccccc) r +=  2;\n    if (x & 0xf0f0f0f0) r +=  4;\n    if (x & 0xff00ff00) r +=  8;\n    if (x & 0xffff0000) r += 16;\n#endif\n\n    return r;\n#endif\n  }\n\n  ecb_function_ ecb_const int ecb_ctz64 (uint64_t x);\n  ecb_function_ ecb_const int\n  ecb_ctz64 (uint64_t x)\n  {\n#if 1400 <= _MSC_VER && (_M_X64 || _M_IA64 || _M_ARM)\n    unsigned long r;\n    _BitScanForward64 (&r, x);\n    return (int)r;\n#else\n    int shift = x & 0xffffffff ? 0 : 32;\n    return ecb_ctz32 (x >> shift) + shift;\n#endif\n  }\n\n  ecb_function_ ecb_const int ecb_popcount32 (uint32_t x);\n  ecb_function_ ecb_const int\n  ecb_popcount32 (uint32_t x)\n  {\n    x -=  (x >> 1) & 0x55555555;\n    x  = ((x >> 2) & 0x33333333) + (x & 0x33333333);\n    x  = ((x >> 4) + x) & 0x0f0f0f0f;\n    x *= 0x01010101;\n\n    return x >> 24;\n  }\n\n  ecb_function_ ecb_const int ecb_ld32 (uint32_t x);\n  ecb_function_ ecb_const int ecb_ld32 (uint32_t x)\n  {\n#if 1400 <= _MSC_VER && (_M_IX86 || _M_X64 || _M_IA64 || _M_ARM)\n    unsigned long r;\n    _BitScanReverse (&r, x);\n    return (int)r;\n#else\n    int r = 0;\n\n    if (x >> 16) { x >>= 16; r += 16; }\n    if (x >>  8) { x >>=  8; r +=  8; }\n    if (x >>  4) { x >>=  4; r +=  4; }\n    if (x >>  2) { x >>=  2; r +=  2; }\n    if (x >>  1) {           r +=  1; }\n\n    return r;\n#endif\n  }\n\n  ecb_function_ ecb_const int ecb_ld64 (uint64_t x);\n  ecb_function_ ecb_const int ecb_ld64 (uint64_t x)\n  {\n#if 1400 <= _MSC_VER && (_M_X64 || _M_IA64 || _M_ARM)\n    unsigned long r;\n    _BitScanReverse64 (&r, x);\n    return (int)r;\n#else\n    int r = 0;\n\n    if (x >> 32) { x >>= 32; r += 32; }\n\n    return r + ecb_ld32 (x);\n#endif\n  }\n#endif\n\necb_function_ ecb_const ecb_bool ecb_is_pot32 (uint32_t x);\necb_function_ ecb_const ecb_bool ecb_is_pot32 (uint32_t x) { return !(x & (x - 1)); }\necb_function_ ecb_const ecb_bool ecb_is_pot64 (uint64_t x);\necb_function_ ecb_const ecb_bool ecb_is_pot64 (uint64_t x) { return !(x & (x - 1)); }\n\necb_function_ ecb_const uint8_t  ecb_bitrev8  (uint8_t  x);\necb_function_ ecb_const uint8_t  ecb_bitrev8  (uint8_t  x)\n{\n  return (  (x * 0x0802U & 0x22110U)\n          | (x * 0x8020U & 0x88440U)) * 0x10101U >> 16;\n}\n\necb_function_ ecb_const uint16_t ecb_bitrev16 (uint16_t x);\necb_function_ ecb_const uint16_t ecb_bitrev16 (uint16_t x)\n{\n  x = ((x >>  1) &     0x5555) | ((x &     0x5555) <<  1);\n  x = ((x >>  2) &     0x3333) | ((x &     0x3333) <<  2);\n  x = ((x >>  4) &     0x0f0f) | ((x &     0x0f0f) <<  4);\n  x = ( x >>  8              ) | ( x               <<  8);\n\n  return x;\n}\n\necb_function_ ecb_const uint32_t ecb_bitrev32 (uint32_t x);\necb_function_ ecb_const uint32_t ecb_bitrev32 (uint32_t x)\n{\n  x = ((x >>  1) & 0x55555555) | ((x & 0x55555555) <<  1);\n  x = ((x >>  2) & 0x33333333) | ((x & 0x33333333) <<  2);\n  x = ((x >>  4) & 0x0f0f0f0f) | ((x & 0x0f0f0f0f) <<  4);\n  x = ((x >>  8) & 0x00ff00ff) | ((x & 0x00ff00ff) <<  8);\n  x = ( x >> 16              ) | ( x               << 16);\n\n  return x;\n}\n\n/* popcount64 is only available on 64 bit cpus as gcc builtin */\n/* so for this version we are lazy */\necb_function_ ecb_const int ecb_popcount64 (uint64_t x);\necb_function_ ecb_const int\necb_popcount64 (uint64_t x)\n{\n  return ecb_popcount32 (x) + ecb_popcount32 (x >> 32);\n}\n\necb_inline ecb_const uint8_t  ecb_rotl8  (uint8_t  x, unsigned int count);\necb_inline ecb_const uint8_t  ecb_rotr8  (uint8_t  x, unsigned int count);\necb_inline ecb_const uint16_t ecb_rotl16 (uint16_t x, unsigned int count);\necb_inline ecb_const uint16_t ecb_rotr16 (uint16_t x, unsigned int count);\necb_inline ecb_const uint32_t ecb_rotl32 (uint32_t x, unsigned int count);\necb_inline ecb_const uint32_t ecb_rotr32 (uint32_t x, unsigned int count);\necb_inline ecb_const uint64_t ecb_rotl64 (uint64_t x, unsigned int count);\necb_inline ecb_const uint64_t ecb_rotr64 (uint64_t x, unsigned int count);\n\necb_inline ecb_const uint8_t  ecb_rotl8  (uint8_t  x, unsigned int count) { return (x >> ( 8 - count)) | (x << count); }\necb_inline ecb_const uint8_t  ecb_rotr8  (uint8_t  x, unsigned int count) { return (x << ( 8 - count)) | (x >> count); }\necb_inline ecb_const uint16_t ecb_rotl16 (uint16_t x, unsigned int count) { return (x >> (16 - count)) | (x << count); }\necb_inline ecb_const uint16_t ecb_rotr16 (uint16_t x, unsigned int count) { return (x << (16 - count)) | (x >> count); }\necb_inline ecb_const uint32_t ecb_rotl32 (uint32_t x, unsigned int count) { return (x >> (32 - count)) | (x << count); }\necb_inline ecb_const uint32_t ecb_rotr32 (uint32_t x, unsigned int count) { return (x << (32 - count)) | (x >> count); }\necb_inline ecb_const uint64_t ecb_rotl64 (uint64_t x, unsigned int count) { return (x >> (64 - count)) | (x << count); }\necb_inline ecb_const uint64_t ecb_rotr64 (uint64_t x, unsigned int count) { return (x << (64 - count)) | (x >> count); }\n\n#if ECB_GCC_VERSION(4,3) || (ECB_CLANG_BUILTIN(__builtin_bswap32) && ECB_CLANG_BUILTIN(__builtin_bswap64))\n  #if ECB_GCC_VERSION(4,8) || ECB_CLANG_BUILTIN(__builtin_bswap16)\n  #define ecb_bswap16(x)  __builtin_bswap16 (x)\n  #else\n  #define ecb_bswap16(x) (__builtin_bswap32 (x) >> 16)\n  #endif\n  #define ecb_bswap32(x)  __builtin_bswap32 (x)\n  #define ecb_bswap64(x)  __builtin_bswap64 (x)\n#elif _MSC_VER\n  #include <stdlib.h>\n  #define ecb_bswap16(x) ((uint16_t)_byteswap_ushort ((uint16_t)(x)))\n  #define ecb_bswap32(x) ((uint32_t)_byteswap_ulong  ((uint32_t)(x)))\n  #define ecb_bswap64(x) ((uint64_t)_byteswap_uint64 ((uint64_t)(x)))\n#else\n  ecb_function_ ecb_const uint16_t ecb_bswap16 (uint16_t x);\n  ecb_function_ ecb_const uint16_t\n  ecb_bswap16 (uint16_t x)\n  {\n    return ecb_rotl16 (x, 8);\n  }\n\n  ecb_function_ ecb_const uint32_t ecb_bswap32 (uint32_t x);\n  ecb_function_ ecb_const uint32_t\n  ecb_bswap32 (uint32_t x)\n  {\n    return (((uint32_t)ecb_bswap16 (x)) << 16) | ecb_bswap16 (x >> 16);\n  }\n\n  ecb_function_ ecb_const uint64_t ecb_bswap64 (uint64_t x);\n  ecb_function_ ecb_const uint64_t\n  ecb_bswap64 (uint64_t x)\n  {\n    return (((uint64_t)ecb_bswap32 (x)) << 32) | ecb_bswap32 (x >> 32);\n  }\n#endif\n\n#if ECB_GCC_VERSION(4,5) || ECB_CLANG_BUILTIN(__builtin_unreachable)\n  #define ecb_unreachable() __builtin_unreachable ()\n#else\n  /* this seems to work fine, but gcc always emits a warning for it :/ */\n  ecb_inline ecb_noreturn void ecb_unreachable (void);\n  ecb_inline ecb_noreturn void ecb_unreachable (void) { }\n#endif\n\n/* try to tell the compiler that some condition is definitely true */\n#define ecb_assume(cond) if (!(cond)) ecb_unreachable (); else 0\n\necb_inline ecb_const uint32_t ecb_byteorder_helper (void);\necb_inline ecb_const uint32_t\necb_byteorder_helper (void)\n{\n  /* the union code still generates code under pressure in gcc, */\n  /* but less than using pointers, and always seems to */\n  /* successfully return a constant. */\n  /* the reason why we have this horrible preprocessor mess */\n  /* is to avoid it in all cases, at least on common architectures */\n  /* or when using a recent enough gcc version (>= 4.6) */\n#if (defined __BYTE_ORDER__ && __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) \\\n    || ((__i386 || __i386__ || _M_IX86 || ECB_GCC_AMD64 || ECB_MSVC_AMD64) && !__VOS__)\n  #define ECB_LITTLE_ENDIAN 1\n  return 0x44332211;\n#elif (defined __BYTE_ORDER__ && __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) \\\n      || ((__AARCH64EB__ || __MIPSEB__ || __ARMEB__) && !__VOS__)\n  #define ECB_BIG_ENDIAN 1\n  return 0x11223344;\n#else\n  union\n  {\n    uint8_t c[4];\n    uint32_t u;\n  } u = { 0x11, 0x22, 0x33, 0x44 };\n  return u.u;\n#endif\n}\n\necb_inline ecb_const ecb_bool ecb_big_endian    (void);\necb_inline ecb_const ecb_bool ecb_big_endian    (void) { return ecb_byteorder_helper () == 0x11223344; }\necb_inline ecb_const ecb_bool ecb_little_endian (void);\necb_inline ecb_const ecb_bool ecb_little_endian (void) { return ecb_byteorder_helper () == 0x44332211; }\n\n#if ECB_GCC_VERSION(3,0) || ECB_C99\n  #define ecb_mod(m,n) ((m) % (n) + ((m) % (n) < 0 ? (n) : 0))\n#else\n  #define ecb_mod(m,n) ((m) < 0 ? ((n) - 1 - ((-1 - (m)) % (n))) : ((m) % (n)))\n#endif\n\n#if ECB_CPP\n  template<typename T>\n  static inline T ecb_div_rd (T val, T div)\n  {\n    return val < 0 ? - ((-val + div - 1) / div) : (val          ) / div;\n  }\n  template<typename T>\n  static inline T ecb_div_ru (T val, T div)\n  {\n    return val < 0 ? - ((-val          ) / div) : (val + div - 1) / div;\n  }\n#else\n  #define ecb_div_rd(val,div) ((val) < 0 ? - ((-(val) + (div) - 1) / (div)) : ((val)            ) / (div))\n  #define ecb_div_ru(val,div) ((val) < 0 ? - ((-(val)            ) / (div)) : ((val) + (div) - 1) / (div))\n#endif\n\n#if ecb_cplusplus_does_not_suck\n  /* does not work for local types (http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2657.htm) */\n  template<typename T, int N>\n  static inline int ecb_array_length (const T (&arr)[N])\n  {\n    return N;\n  }\n#else\n  #define ecb_array_length(name) (sizeof (name) / sizeof (name [0]))\n#endif\n\necb_function_ ecb_const uint32_t ecb_binary16_to_binary32 (uint32_t x);\necb_function_ ecb_const uint32_t\necb_binary16_to_binary32 (uint32_t x)\n{\n  unsigned int s = (x & 0x8000) << (31 - 15);\n  int          e = (x >> 10) & 0x001f;\n  unsigned int m =  x        & 0x03ff;\n\n  if (ecb_expect_false (e == 31))\n    /* infinity or NaN */\n    e = 255 - (127 - 15);\n  else if (ecb_expect_false (!e))\n    {\n      if (ecb_expect_true (!m))\n        /* zero, handled by code below by forcing e to 0 */\n        e = 0 - (127 - 15);\n      else\n        {\n          /* subnormal, renormalise */\n          unsigned int s = 10 - ecb_ld32 (m);\n\n          m = (m << s) & 0x3ff; /* mask implicit bit */\n          e -= s - 1;\n        }\n    }\n\n  /* e and m now are normalised, or zero, (or inf or nan) */\n  e += 127 - 15;\n\n  return s | (e << 23) | (m << (23 - 10));\n}\n\necb_function_ ecb_const uint16_t ecb_binary32_to_binary16 (uint32_t x);\necb_function_ ecb_const uint16_t\necb_binary32_to_binary16 (uint32_t x)\n{\n  unsigned int s =  (x >> 16) & 0x00008000; /* sign bit, the easy part */\n  unsigned int e = ((x >> 23) & 0x000000ff) - (127 - 15); /* the desired exponent */\n  unsigned int m =   x        & 0x007fffff;\n\n  x &= 0x7fffffff;\n\n  /* if it's within range of binary16 normals, use fast path */\n  if (ecb_expect_true (0x38800000 <= x && x <= 0x477fefff))\n    {\n      /* mantissa round-to-even */\n      m += 0x00000fff + ((m >> (23 - 10)) & 1);\n\n      /* handle overflow */\n      if (ecb_expect_false (m >= 0x00800000))\n        {\n          m >>= 1;\n          e +=  1;\n        }\n\n      return s | (e << 10) | (m >> (23 - 10));\n    }\n\n  /* handle large numbers and infinity */\n  if (ecb_expect_true (0x477fefff < x && x <= 0x7f800000))\n    return s | 0x7c00;\n\n  /* handle zero, subnormals and small numbers */\n  if (ecb_expect_true (x < 0x38800000))\n    {\n      /* zero */\n      if (ecb_expect_true (!x))\n        return s;\n\n      /* handle subnormals */\n\n      /* too small, will be zero */\n      if (e < (14 - 24)) /* might not be sharp, but is good enough */\n        return s;\n\n      m |= 0x00800000; /* make implicit bit explicit */\n\n      /* very tricky - we need to round to the nearest e (+10) bit value */\n      {\n        unsigned int bits = 14 - e;\n        unsigned int half = (1 << (bits - 1)) - 1;\n        unsigned int even = (m >> bits) & 1;\n\n        /* if this overflows, we will end up with a normalised number */\n        m = (m + half + even) >> bits;\n      }\n\n      return s | m;\n    }\n\n  /* handle NaNs, preserve leftmost nan bits, but make sure we don't turn them into infinities */\n  m >>= 13;\n\n  return s | 0x7c00 | m | !m;\n}\n\n/*******************************************************************************/\n/* floating point stuff, can be disabled by defining ECB_NO_LIBM */\n\n/* basically, everything uses \"ieee pure-endian\" floating point numbers */\n/* the only noteworthy exception is ancient armle, which uses order 43218765 */\n#if 0 \\\n    || __i386 || __i386__ \\\n    || ECB_GCC_AMD64 \\\n    || __powerpc__ || __ppc__ || __powerpc64__ || __ppc64__ \\\n    || defined __s390__ || defined __s390x__ \\\n    || defined __mips__ \\\n    || defined __alpha__ \\\n    || defined __hppa__ \\\n    || defined __ia64__ \\\n    || defined __m68k__ \\\n    || defined __m88k__ \\\n    || defined __sh__ \\\n    || defined _M_IX86 || defined ECB_MSVC_AMD64 || defined _M_IA64 \\\n    || (defined __arm__ && (defined __ARM_EABI__ || defined __EABI__ || defined __VFP_FP__ || defined _WIN32_WCE || defined __ANDROID__)) \\\n    || defined __aarch64__\n  #define ECB_STDFP 1\n  #include <string.h> /* for memcpy */\n#else\n  #define ECB_STDFP 0\n#endif\n\n#ifndef ECB_NO_LIBM\n\n  #include <math.h> /* for frexp*, ldexp*, INFINITY, NAN */\n\n  /* only the oldest of old doesn't have this one. solaris. */\n  #ifdef INFINITY\n    #define ECB_INFINITY INFINITY\n  #else\n    #define ECB_INFINITY HUGE_VAL\n  #endif\n\n  #ifdef NAN\n    #define ECB_NAN NAN\n  #else\n    #define ECB_NAN ECB_INFINITY\n  #endif\n\n  #if ECB_C99 || _XOPEN_VERSION >= 600 || _POSIX_VERSION >= 200112L\n    #define ecb_ldexpf(x,e) ldexpf ((x), (e))\n    #define ecb_frexpf(x,e) frexpf ((x), (e))\n  #else\n    #define ecb_ldexpf(x,e) (float) ldexp ((double) (x), (e))\n    #define ecb_frexpf(x,e) (float) frexp ((double) (x), (e))\n  #endif\n\n  /* convert a float to ieee single/binary32 */\n  ecb_function_ ecb_const uint32_t ecb_float_to_binary32 (float x);\n  ecb_function_ ecb_const uint32_t\n  ecb_float_to_binary32 (float x)\n  {\n    uint32_t r;\n\n    #if ECB_STDFP\n      memcpy (&r, &x, 4);\n    #else\n      /* slow emulation, works for anything but -0 */\n      uint32_t m;\n      int e;\n\n      if (x == 0e0f                    ) return 0x00000000U;\n      if (x > +3.40282346638528860e+38f) return 0x7f800000U;\n      if (x < -3.40282346638528860e+38f) return 0xff800000U;\n      if (x != x                       ) return 0x7fbfffffU;\n\n      m = ecb_frexpf (x, &e) * 0x1000000U;\n\n      r = m & 0x80000000U;\n\n      if (r)\n        m = -m;\n\n      if (e <= -126)\n        {\n          m &= 0xffffffU;\n          m >>= (-125 - e);\n          e = -126;\n        }\n\n      r |= (e + 126) << 23;\n      r |= m & 0x7fffffU;\n    #endif\n\n    return r;\n  }\n\n  /* converts an ieee single/binary32 to a float */\n  ecb_function_ ecb_const float ecb_binary32_to_float (uint32_t x);\n  ecb_function_ ecb_const float\n  ecb_binary32_to_float (uint32_t x)\n  {\n    float r;\n\n    #if ECB_STDFP\n      memcpy (&r, &x, 4);\n    #else\n      /* emulation, only works for normals and subnormals and +0 */\n      int neg = x >> 31;\n      int e = (x >> 23) & 0xffU;\n\n      x &= 0x7fffffU;\n\n      if (e)\n        x |= 0x800000U;\n      else\n        e = 1;\n\n      /* we distrust ldexpf a bit and do the 2**-24 scaling by an extra multiply */\n      r = ecb_ldexpf (x * (0.5f / 0x800000U), e - 126);\n\n      r = neg ? -r : r;\n    #endif\n\n    return r;\n  }\n\n  /* convert a double to ieee double/binary64 */\n  ecb_function_ ecb_const uint64_t ecb_double_to_binary64 (double x);\n  ecb_function_ ecb_const uint64_t\n  ecb_double_to_binary64 (double x)\n  {\n    uint64_t r;\n\n    #if ECB_STDFP\n      memcpy (&r, &x, 8);\n    #else\n      /* slow emulation, works for anything but -0 */\n      uint64_t m;\n      int e;\n\n      if (x == 0e0                     ) return 0x0000000000000000U;\n      if (x > +1.79769313486231470e+308) return 0x7ff0000000000000U;\n      if (x < -1.79769313486231470e+308) return 0xfff0000000000000U;\n      if (x != x                       ) return 0X7ff7ffffffffffffU;\n\n      m = frexp (x, &e) * 0x20000000000000U;\n\n      r = m & 0x8000000000000000;;\n\n      if (r)\n        m = -m;\n\n      if (e <= -1022)\n        {\n          m &= 0x1fffffffffffffU;\n          m >>= (-1021 - e);\n          e = -1022;\n        }\n\n      r |= ((uint64_t)(e + 1022)) << 52;\n      r |= m & 0xfffffffffffffU;\n    #endif\n\n    return r;\n  }\n\n  /* converts an ieee double/binary64 to a double */\n  ecb_function_ ecb_const double ecb_binary64_to_double (uint64_t x);\n  ecb_function_ ecb_const double\n  ecb_binary64_to_double (uint64_t x)\n  {\n    double r;\n\n    #if ECB_STDFP\n      memcpy (&r, &x, 8);\n    #else\n      /* emulation, only works for normals and subnormals and +0 */\n      int neg = x >> 63;\n      int e = (x >> 52) & 0x7ffU;\n\n      x &= 0xfffffffffffffU;\n\n      if (e)\n        x |= 0x10000000000000U;\n      else\n        e = 1;\n\n      /* we distrust ldexp a bit and do the 2**-53 scaling by an extra multiply */\n      r = ldexp (x * (0.5 / 0x10000000000000U), e - 1022);\n\n      r = neg ? -r : r;\n    #endif\n\n    return r;\n  }\n\n  /* convert a float to ieee half/binary16 */\n  ecb_function_ ecb_const uint16_t ecb_float_to_binary16 (float x);\n  ecb_function_ ecb_const uint16_t\n  ecb_float_to_binary16 (float x)\n  {\n    return ecb_binary32_to_binary16 (ecb_float_to_binary32 (x));\n  }\n\n  /* convert an ieee half/binary16 to float */\n  ecb_function_ ecb_const float ecb_binary16_to_float (uint16_t x);\n  ecb_function_ ecb_const float\n  ecb_binary16_to_float (uint16_t x)\n  {\n    return ecb_binary32_to_float (ecb_binary16_to_binary32 (x));\n  }\n\n#endif\n\n#endif\n\n/* ECB.H END */\n\n#if ECB_MEMORY_FENCE_NEEDS_PTHREADS\n/* if your architecture doesn't need memory fences, e.g. because it is\n * single-cpu/core, or if you use libev in a project that doesn't use libev\n * from multiple threads, then you can define ECB_AVOID_PTHREADS when compiling\n * libev, in which cases the memory fences become nops.\n * alternatively, you can remove this #error and link against libpthread,\n * which will then provide the memory fences.\n */\n# error \"memory fences not defined for your architecture, please report\"\n#endif\n\n#ifndef ECB_MEMORY_FENCE\n# define ECB_MEMORY_FENCE do { } while (0)\n# define ECB_MEMORY_FENCE_ACQUIRE ECB_MEMORY_FENCE\n# define ECB_MEMORY_FENCE_RELEASE ECB_MEMORY_FENCE\n#endif\n\n#define expect_false(cond) ecb_expect_false (cond)\n#define expect_true(cond)  ecb_expect_true  (cond)\n#define noinline           ecb_noinline\n\n#define inline_size        ecb_inline\n\n#if EV_FEATURE_CODE\n# define inline_speed      ecb_inline\n#else\n# define inline_speed      static noinline\n#endif\n\n#define NUMPRI (EV_MAXPRI - EV_MINPRI + 1)\n\n#if EV_MINPRI == EV_MAXPRI\n# define ABSPRI(w) (((W)w), 0)\n#else\n# define ABSPRI(w) (((W)w)->priority - EV_MINPRI)\n#endif\n\n#define EMPTY       /* required for microsofts broken pseudo-c compiler */\n#define EMPTY2(a,b) /* used to suppress some warnings */\n\ntypedef ev_watcher *W;\ntypedef ev_watcher_list *WL;\ntypedef ev_watcher_time *WT;\n\n#define ev_active(w) ((W)(w))->active\n#define ev_at(w) ((WT)(w))->at\n\n#if EV_USE_REALTIME\n/* sig_atomic_t is used to avoid per-thread variables or locking but still */\n/* giving it a reasonably high chance of working on typical architectures */\nstatic EV_ATOMIC_T have_realtime; /* did clock_gettime (CLOCK_REALTIME) work? */\n#endif\n\n#if EV_USE_MONOTONIC\nstatic EV_ATOMIC_T have_monotonic; /* did clock_gettime (CLOCK_MONOTONIC) work? */\n#endif\n\n#ifndef EV_FD_TO_WIN32_HANDLE\n# define EV_FD_TO_WIN32_HANDLE(fd) _get_osfhandle (fd)\n#endif\n#ifndef EV_WIN32_HANDLE_TO_FD\n# define EV_WIN32_HANDLE_TO_FD(handle) _open_osfhandle (handle, 0)\n#endif\n#ifndef EV_WIN32_CLOSE_FD\n# define EV_WIN32_CLOSE_FD(fd) close (fd)\n#endif\n\n#ifdef _WIN32\n# include \"ev_win32.c\"\n#endif\n\n/*****************************************************************************/\n\n/* define a suitable floor function (only used by periodics atm) */\n\n#if EV_USE_FLOOR\n# include <math.h>\n# define ev_floor(v) floor (v)\n#else\n\n#include <float.h>\n\n/* a floor() replacement function, should be independent of ev_tstamp type */\nstatic ev_tstamp noinline\nev_floor (ev_tstamp v)\n{\n  /* the choice of shift factor is not terribly important */\n#if FLT_RADIX != 2 /* assume FLT_RADIX == 10 */\n  const ev_tstamp shift = sizeof (unsigned long) >= 8 ? 10000000000000000000. : 1000000000.;\n#else\n  const ev_tstamp shift = sizeof (unsigned long) >= 8 ? 18446744073709551616. : 4294967296.;\n#endif\n\n  /* argument too large for an unsigned long? */\n  if (expect_false (v >= shift))\n    {\n      ev_tstamp f;\n\n      if (v == v - 1.)\n        return v; /* very large number */\n\n      f = shift * ev_floor (v * (1. / shift));\n      return f + ev_floor (v - f);\n    }\n\n  /* special treatment for negative args? */\n  if (expect_false (v < 0.))\n    {\n      ev_tstamp f = -ev_floor (-v);\n\n      return f - (f == v ? 0 : 1);\n    }\n\n  /* fits into an unsigned long */\n  return (unsigned long)v;\n}\n\n#endif\n\n/*****************************************************************************/\n\n#ifdef __linux\n# include <sys/utsname.h>\n#endif\n\nstatic unsigned int noinline ecb_cold\nev_linux_version (void)\n{\n#ifdef __linux\n  unsigned int v = 0;\n  struct utsname buf;\n  int i;\n  char *p = buf.release;\n\n  if (uname (&buf))\n    return 0;\n\n  for (i = 3+1; --i; )\n    {\n      unsigned int c = 0;\n\n      for (;;)\n        {\n          if (*p >= '0' && *p <= '9')\n            c = c * 10 + *p++ - '0';\n          else\n            {\n              p += *p == '.';\n              break;\n            }\n        }\n\n      v = (v << 8) | c;\n    }\n\n  return v;\n#else\n  return 0;\n#endif\n}\n\n/*****************************************************************************/\n\n#if EV_AVOID_STDIO\nstatic void noinline ecb_cold\nev_printerr (const char *msg)\n{\n  write (STDERR_FILENO, msg, strlen (msg));\n}\n#endif\n\nstatic void (*syserr_cb)(const char *msg) EV_THROW;\n\nvoid ecb_cold\nev_set_syserr_cb (void (*cb)(const char *msg) EV_THROW) EV_THROW\n{\n  syserr_cb = cb;\n}\n\nstatic void noinline ecb_cold\nev_syserr (const char *msg)\n{\n  if (!msg)\n    msg = \"(libev) system error\";\n\n  if (syserr_cb)\n    syserr_cb (msg);\n  else\n    {\n#if EV_AVOID_STDIO\n      ev_printerr (msg);\n      ev_printerr (\": \");\n      ev_printerr (strerror (errno));\n      ev_printerr (\"\\n\");\n#else\n      perror (msg);\n#endif\n      abort ();\n    }\n}\n\nstatic void *\nev_realloc_emul (void *ptr, long size) EV_THROW\n{\n  /* some systems, notably openbsd and darwin, fail to properly\n   * implement realloc (x, 0) (as required by both ansi c-89 and\n   * the single unix specification, so work around them here.\n   * recently, also (at least) fedora and debian started breaking it,\n   * despite documenting it otherwise.\n   */\n\n  if (size)\n    return realloc (ptr, size);\n\n  free (ptr);\n  return 0;\n}\n\nstatic void *(*alloc)(void *ptr, long size) EV_THROW = ev_realloc_emul;\n\nvoid ecb_cold\nev_set_allocator (void *(*cb)(void *ptr, long size) EV_THROW) EV_THROW\n{\n  alloc = cb;\n}\n\ninline_speed void *\nev_realloc (void *ptr, long size)\n{\n  ptr = alloc (ptr, size);\n\n  if (!ptr && size)\n    {\n#if EV_AVOID_STDIO\n      ev_printerr (\"(libev) memory allocation failed, aborting.\\n\");\n#else\n      fprintf (stderr, \"(libev) cannot allocate %ld bytes, aborting.\", size);\n#endif\n      abort ();\n    }\n\n  return ptr;\n}\n\n#define ev_malloc(size) ev_realloc (0, (size))\n#define ev_free(ptr)    ev_realloc ((ptr), 0)\n\n/*****************************************************************************/\n\n/* set in reify when reification needed */\n#define EV_ANFD_REIFY 1\n\n/* file descriptor info structure */\ntypedef struct\n{\n  WL head;\n  unsigned char events; /* the events watched for */\n  unsigned char reify;  /* flag set when this ANFD needs reification (EV_ANFD_REIFY, EV__IOFDSET) */\n  unsigned char emask;  /* the epoll backend stores the actual kernel mask in here */\n  unsigned char unused;\n#if EV_USE_EPOLL\n  unsigned int egen;    /* generation counter to counter epoll bugs */\n#endif\n#if EV_SELECT_IS_WINSOCKET || EV_USE_IOCP\n  SOCKET handle;\n#endif\n#if EV_USE_IOCP\n  OVERLAPPED or, ow;\n#endif\n} ANFD;\n\n/* stores the pending event set for a given watcher */\ntypedef struct\n{\n  W w;\n  int events; /* the pending event set for the given watcher */\n} ANPENDING;\n\n#if EV_USE_INOTIFY\n/* hash table entry per inotify-id */\ntypedef struct\n{\n  WL head;\n} ANFS;\n#endif\n\n/* Heap Entry */\n#if EV_HEAP_CACHE_AT\n  /* a heap element */\n  typedef struct {\n    ev_tstamp at;\n    WT w;\n  } ANHE;\n\n  #define ANHE_w(he)        (he).w     /* access watcher, read-write */\n  #define ANHE_at(he)       (he).at    /* access cached at, read-only */\n  #define ANHE_at_cache(he) (he).at = (he).w->at /* update at from watcher */\n#else\n  /* a heap element */\n  typedef WT ANHE;\n\n  #define ANHE_w(he)        (he)\n  #define ANHE_at(he)       (he)->at\n  #define ANHE_at_cache(he)\n#endif\n\n#if EV_MULTIPLICITY\n\n  struct ev_loop\n  {\n    ev_tstamp ev_rt_now;\n    #define ev_rt_now ((loop)->ev_rt_now)\n    #define VAR(name,decl) decl;\n      #include \"ev_vars.h\"\n    #undef VAR\n  };\n  #include \"ev_wrap.h\"\n\n  static struct ev_loop default_loop_struct;\n  EV_API_DECL struct ev_loop *ev_default_loop_ptr = 0; /* needs to be initialised to make it a definition despite extern */\n\n#else\n\n  EV_API_DECL ev_tstamp ev_rt_now = 0; /* needs to be initialised to make it a definition despite extern */\n  #define VAR(name,decl) static decl;\n    #include \"ev_vars.h\"\n  #undef VAR\n\n  static int ev_default_loop_ptr;\n\n#endif\n\n#if EV_FEATURE_API\n# define EV_RELEASE_CB if (expect_false (release_cb)) release_cb (EV_A)\n# define EV_ACQUIRE_CB if (expect_false (acquire_cb)) acquire_cb (EV_A)\n# define EV_INVOKE_PENDING invoke_cb (EV_A)\n#else\n# define EV_RELEASE_CB (void)0\n# define EV_ACQUIRE_CB (void)0\n# define EV_INVOKE_PENDING ev_invoke_pending (EV_A)\n#endif\n\n#define EVBREAK_RECURSE 0x80\n\n/*****************************************************************************/\n\n#ifndef EV_HAVE_EV_TIME\nev_tstamp\nev_time (void) EV_THROW\n{\n#if EV_USE_REALTIME\n  if (expect_true (have_realtime))\n    {\n      struct timespec ts;\n      clock_gettime (CLOCK_REALTIME, &ts);\n      return ts.tv_sec + ts.tv_nsec * 1e-9;\n    }\n#endif\n\n  struct timeval tv;\n  gettimeofday (&tv, 0);\n  return tv.tv_sec + tv.tv_usec * 1e-6;\n}\n#endif\n\ninline_size ev_tstamp\nget_clock (void)\n{\n#if EV_USE_MONOTONIC\n  if (expect_true (have_monotonic))\n    {\n      struct timespec ts;\n      clock_gettime (CLOCK_MONOTONIC, &ts);\n      return ts.tv_sec + ts.tv_nsec * 1e-9;\n    }\n#endif\n\n  return ev_time ();\n}\n\n#if EV_MULTIPLICITY\nev_tstamp\nev_now (EV_P) EV_THROW\n{\n  return ev_rt_now;\n}\n#endif\n\nvoid\nev_sleep (ev_tstamp delay) EV_THROW\n{\n  if (delay > 0.)\n    {\n#if EV_USE_NANOSLEEP\n      struct timespec ts;\n\n      EV_TS_SET (ts, delay);\n      nanosleep (&ts, 0);\n#elif defined _WIN32\n      Sleep ((unsigned long)(delay * 1e3));\n#else\n      struct timeval tv;\n\n      /* here we rely on sys/time.h + sys/types.h + unistd.h providing select */\n      /* something not guaranteed by newer posix versions, but guaranteed */\n      /* by older ones */\n      EV_TV_SET (tv, delay);\n      select (0, 0, 0, 0, &tv);\n#endif\n    }\n}\n\n/*****************************************************************************/\n\n#define MALLOC_ROUND 4096 /* prefer to allocate in chunks of this size, must be 2**n and >> 4 longs */\n\n/* find a suitable new size for the given array, */\n/* hopefully by rounding to a nice-to-malloc size */\ninline_size int\narray_nextsize (int elem, int cur, int cnt)\n{\n  int ncur = cur + 1;\n\n  do\n    ncur <<= 1;\n  while (cnt > ncur);\n\n  /* if size is large, round to MALLOC_ROUND - 4 * longs to accommodate malloc overhead */\n  if (elem * ncur > MALLOC_ROUND - sizeof (void *) * 4)\n    {\n      ncur *= elem;\n      ncur = (ncur + elem + (MALLOC_ROUND - 1) + sizeof (void *) * 4) & ~(MALLOC_ROUND - 1);\n      ncur = ncur - sizeof (void *) * 4;\n      ncur /= elem;\n    }\n\n  return ncur;\n}\n\nstatic void * noinline ecb_cold\narray_realloc (int elem, void *base, int *cur, int cnt)\n{\n  *cur = array_nextsize (elem, *cur, cnt);\n  return ev_realloc (base, elem * *cur);\n}\n\n#define array_init_zero(base,count)\t\\\n  memset ((void *)(base), 0, sizeof (*(base)) * (count))\n\n#define array_needsize(type,base,cur,cnt,init)\t\t\t\\\n  if (expect_false ((cnt) > (cur)))\t\t\t\t\\\n    {\t\t\t\t\t\t\t\t\\\n      int ecb_unused ocur_ = (cur);\t\t\t\t\t\\\n      (base) = (type *)array_realloc\t\t\t\t\\\n         (sizeof (type), (base), &(cur), (cnt));\t\t\\\n      init ((base) + (ocur_), (cur) - ocur_);\t\t\t\\\n    }\n\n#if 0\n#define array_slim(type,stem)\t\t\t\t\t\\\n  if (stem ## max < array_roundsize (stem ## cnt >> 2))\t\t\\\n    {\t\t\t\t\t\t\t\t\\\n      stem ## max = array_roundsize (stem ## cnt >> 1);\t\t\\\n      base = (type *)ev_realloc (base, sizeof (type) * (stem ## max));\\\n      fprintf (stderr, \"slimmed down \" # stem \" to %d\\n\", stem ## max);/*D*/\\\n    }\n#endif\n\n#define array_free(stem, idx) \\\n  ev_free (stem ## s idx); stem ## cnt idx = stem ## max idx = 0; stem ## s idx = 0\n\n/*****************************************************************************/\n\n/* dummy callback for pending events */\nstatic void noinline\npendingcb (EV_P_ ev_prepare *w, int revents)\n{\n}\n\nvoid noinline\nev_feed_event (EV_P_ void *w, int revents) EV_THROW\n{\n  W w_ = (W)w;\n  int pri = ABSPRI (w_);\n\n  if (expect_false (w_->pending))\n    pendings [pri][w_->pending - 1].events |= revents;\n  else\n    {\n      w_->pending = ++pendingcnt [pri];\n      array_needsize (ANPENDING, pendings [pri], pendingmax [pri], w_->pending, EMPTY2);\n      pendings [pri][w_->pending - 1].w      = w_;\n      pendings [pri][w_->pending - 1].events = revents;\n    }\n\n  pendingpri = NUMPRI - 1;\n}\n\ninline_speed void\nfeed_reverse (EV_P_ W w)\n{\n  array_needsize (W, rfeeds, rfeedmax, rfeedcnt + 1, EMPTY2);\n  rfeeds [rfeedcnt++] = w;\n}\n\ninline_size void\nfeed_reverse_done (EV_P_ int revents)\n{\n  do\n    ev_feed_event (EV_A_ rfeeds [--rfeedcnt], revents);\n  while (rfeedcnt);\n}\n\ninline_speed void\nqueue_events (EV_P_ W *events, int eventcnt, int type)\n{\n  int i;\n\n  for (i = 0; i < eventcnt; ++i)\n    ev_feed_event (EV_A_ events [i], type);\n}\n\n/*****************************************************************************/\n\ninline_speed void\nfd_event_nocheck (EV_P_ int fd, int revents)\n{\n  ANFD *anfd = anfds + fd;\n  ev_io *w;\n\n  for (w = (ev_io *)anfd->head; w; w = (ev_io *)((WL)w)->next)\n    {\n      int ev = w->events & revents;\n\n      if (ev)\n        ev_feed_event (EV_A_ (W)w, ev);\n    }\n}\n\n/* do not submit kernel events for fds that have reify set */\n/* because that means they changed while we were polling for new events */\ninline_speed void\nfd_event (EV_P_ int fd, int revents)\n{\n  ANFD *anfd = anfds + fd;\n\n  if (expect_true (!anfd->reify))\n    fd_event_nocheck (EV_A_ fd, revents);\n}\n\nvoid\nev_feed_fd_event (EV_P_ int fd, int revents) EV_THROW\n{\n  if (fd >= 0 && fd < anfdmax)\n    fd_event_nocheck (EV_A_ fd, revents);\n}\n\n/* make sure the external fd watch events are in-sync */\n/* with the kernel/libev internal state */\ninline_size void\nfd_reify (EV_P)\n{\n  int i;\n\n#if EV_SELECT_IS_WINSOCKET || EV_USE_IOCP\n  for (i = 0; i < fdchangecnt; ++i)\n    {\n      int fd = fdchanges [i];\n      ANFD *anfd = anfds + fd;\n\n      if (anfd->reify & EV__IOFDSET && anfd->head)\n        {\n          SOCKET handle = EV_FD_TO_WIN32_HANDLE (fd);\n\n          if (handle != anfd->handle)\n            {\n              unsigned long arg;\n\n              assert ((\"libev: only socket fds supported in this configuration\", ioctlsocket (handle, FIONREAD, &arg) == 0));\n\n              /* handle changed, but fd didn't - we need to do it in two steps */\n              backend_modify (EV_A_ fd, anfd->events, 0);\n              anfd->events = 0;\n              anfd->handle = handle;\n            }\n        }\n    }\n#endif\n\n  for (i = 0; i < fdchangecnt; ++i)\n    {\n      int fd = fdchanges [i];\n      ANFD *anfd = anfds + fd;\n      ev_io *w;\n\n      unsigned char o_events = anfd->events;\n      unsigned char o_reify  = anfd->reify;\n\n      anfd->reify  = 0;\n\n      /*if (expect_true (o_reify & EV_ANFD_REIFY)) probably a deoptimisation */\n        {\n          anfd->events = 0;\n\n          for (w = (ev_io *)anfd->head; w; w = (ev_io *)((WL)w)->next)\n            anfd->events |= (unsigned char)w->events;\n\n          if (o_events != anfd->events)\n            o_reify = EV__IOFDSET; /* actually |= */\n        }\n\n      if (o_reify & EV__IOFDSET)\n        backend_modify (EV_A_ fd, o_events, anfd->events);\n    }\n\n  fdchangecnt = 0;\n}\n\n/* something about the given fd changed */\ninline_size void\nfd_change (EV_P_ int fd, int flags)\n{\n  unsigned char reify = anfds [fd].reify;\n  anfds [fd].reify |= flags;\n\n  if (expect_true (!reify))\n    {\n      ++fdchangecnt;\n      array_needsize (int, fdchanges, fdchangemax, fdchangecnt, EMPTY2);\n      fdchanges [fdchangecnt - 1] = fd;\n    }\n}\n\n/* the given fd is invalid/unusable, so make sure it doesn't hurt us anymore */\ninline_speed void ecb_cold\nfd_kill (EV_P_ int fd)\n{\n  ev_io *w;\n\n  while ((w = (ev_io *)anfds [fd].head))\n    {\n      ev_io_stop (EV_A_ w);\n      ev_feed_event (EV_A_ (W)w, EV_ERROR | EV_READ | EV_WRITE);\n    }\n}\n\n/* check whether the given fd is actually valid, for error recovery */\ninline_size int ecb_cold\nfd_valid (int fd)\n{\n#ifdef _WIN32\n  return EV_FD_TO_WIN32_HANDLE (fd) != -1;\n#else\n  return fcntl (fd, F_GETFD) != -1;\n#endif\n}\n\n/* called on EBADF to verify fds */\nstatic void noinline ecb_cold\nfd_ebadf (EV_P)\n{\n  int fd;\n\n  for (fd = 0; fd < anfdmax; ++fd)\n    if (anfds [fd].events)\n      if (!fd_valid (fd) && errno == EBADF)\n        fd_kill (EV_A_ fd);\n}\n\n/* called on ENOMEM in select/poll to kill some fds and retry */\nstatic void noinline ecb_cold\nfd_enomem (EV_P)\n{\n  int fd;\n\n  for (fd = anfdmax; fd--; )\n    if (anfds [fd].events)\n      {\n        fd_kill (EV_A_ fd);\n        break;\n      }\n}\n\n/* usually called after fork if backend needs to re-arm all fds from scratch */\nstatic void noinline\nfd_rearm_all (EV_P)\n{\n  int fd;\n\n  for (fd = 0; fd < anfdmax; ++fd)\n    if (anfds [fd].events)\n      {\n        anfds [fd].events = 0;\n        anfds [fd].emask  = 0;\n        fd_change (EV_A_ fd, EV__IOFDSET | EV_ANFD_REIFY);\n      }\n}\n\n/* used to prepare libev internal fd's */\n/* this is not fork-safe */\ninline_speed void\nfd_intern (int fd)\n{\n#ifdef _WIN32\n  unsigned long arg = 1;\n  ioctlsocket (EV_FD_TO_WIN32_HANDLE (fd), FIONBIO, &arg);\n#else\n  fcntl (fd, F_SETFD, FD_CLOEXEC);\n  fcntl (fd, F_SETFL, O_NONBLOCK);\n#endif\n}\n\n/*****************************************************************************/\n\n/*\n * the heap functions want a real array index. array index 0 is guaranteed to not\n * be in-use at any time. the first heap entry is at array [HEAP0]. DHEAP gives\n * the branching factor of the d-tree.\n */\n\n/*\n * at the moment we allow libev the luxury of two heaps,\n * a small-code-size 2-heap one and a ~1.5kb larger 4-heap\n * which is more cache-efficient.\n * the difference is about 5% with 50000+ watchers.\n */\n#if EV_USE_4HEAP\n\n#define DHEAP 4\n#define HEAP0 (DHEAP - 1) /* index of first element in heap */\n#define HPARENT(k) ((((k) - HEAP0 - 1) / DHEAP) + HEAP0)\n#define UPHEAP_DONE(p,k) ((p) == (k))\n\n/* away from the root */\ninline_speed void\ndownheap (ANHE *heap, int N, int k)\n{\n  ANHE he = heap [k];\n  ANHE *E = heap + N + HEAP0;\n\n  for (;;)\n    {\n      ev_tstamp minat;\n      ANHE *minpos;\n      ANHE *pos = heap + DHEAP * (k - HEAP0) + HEAP0 + 1;\n\n      /* find minimum child */\n      if (expect_true (pos + DHEAP - 1 < E))\n        {\n          /* fast path */                               (minpos = pos + 0), (minat = ANHE_at (*minpos));\n          if (               ANHE_at (pos [1]) < minat) (minpos = pos + 1), (minat = ANHE_at (*minpos));\n          if (               ANHE_at (pos [2]) < minat) (minpos = pos + 2), (minat = ANHE_at (*minpos));\n          if (               ANHE_at (pos [3]) < minat) (minpos = pos + 3), (minat = ANHE_at (*minpos));\n        }\n      else if (pos < E)\n        {\n          /* slow path */                               (minpos = pos + 0), (minat = ANHE_at (*minpos));\n          if (pos + 1 < E && ANHE_at (pos [1]) < minat) (minpos = pos + 1), (minat = ANHE_at (*minpos));\n          if (pos + 2 < E && ANHE_at (pos [2]) < minat) (minpos = pos + 2), (minat = ANHE_at (*minpos));\n          if (pos + 3 < E && ANHE_at (pos [3]) < minat) (minpos = pos + 3), (minat = ANHE_at (*minpos));\n        }\n      else\n        break;\n\n      if (ANHE_at (he) <= minat)\n        break;\n\n      heap [k] = *minpos;\n      ev_active (ANHE_w (*minpos)) = k;\n\n      k = minpos - heap;\n    }\n\n  heap [k] = he;\n  ev_active (ANHE_w (he)) = k;\n}\n\n#else /* 4HEAP */\n\n#define HEAP0 1\n#define HPARENT(k) ((k) >> 1)\n#define UPHEAP_DONE(p,k) (!(p))\n\n/* away from the root */\ninline_speed void\ndownheap (ANHE *heap, int N, int k)\n{\n  ANHE he = heap [k];\n\n  for (;;)\n    {\n      int c = k << 1;\n\n      if (c >= N + HEAP0)\n        break;\n\n      c += c + 1 < N + HEAP0 && ANHE_at (heap [c]) > ANHE_at (heap [c + 1])\n           ? 1 : 0;\n\n      if (ANHE_at (he) <= ANHE_at (heap [c]))\n        break;\n\n      heap [k] = heap [c];\n      ev_active (ANHE_w (heap [k])) = k;\n      \n      k = c;\n    }\n\n  heap [k] = he;\n  ev_active (ANHE_w (he)) = k;\n}\n#endif\n\n/* towards the root */\ninline_speed void\nupheap (ANHE *heap, int k)\n{\n  ANHE he = heap [k];\n\n  for (;;)\n    {\n      int p = HPARENT (k);\n\n      if (UPHEAP_DONE (p, k) || ANHE_at (heap [p]) <= ANHE_at (he))\n        break;\n\n      heap [k] = heap [p];\n      ev_active (ANHE_w (heap [k])) = k;\n      k = p;\n    }\n\n  heap [k] = he;\n  ev_active (ANHE_w (he)) = k;\n}\n\n/* move an element suitably so it is in a correct place */\ninline_size void\nadjustheap (ANHE *heap, int N, int k)\n{\n  if (k > HEAP0 && ANHE_at (heap [k]) <= ANHE_at (heap [HPARENT (k)]))\n    upheap (heap, k);\n  else\n    downheap (heap, N, k);\n}\n\n/* rebuild the heap: this function is used only once and executed rarely */\ninline_size void\nreheap (ANHE *heap, int N)\n{\n  int i;\n\n  /* we don't use floyds algorithm, upheap is simpler and is more cache-efficient */\n  /* also, this is easy to implement and correct for both 2-heaps and 4-heaps */\n  for (i = 0; i < N; ++i)\n    upheap (heap, i + HEAP0);\n}\n\n/*****************************************************************************/\n\n/* associate signal watchers to a signal signal */\ntypedef struct\n{\n  EV_ATOMIC_T pending;\n#if EV_MULTIPLICITY\n  EV_P;\n#endif\n  WL head;\n} ANSIG;\n\nstatic ANSIG signals [EV_NSIG - 1];\n\n/*****************************************************************************/\n\n#if EV_SIGNAL_ENABLE || EV_ASYNC_ENABLE\n\nstatic void noinline ecb_cold\nevpipe_init (EV_P)\n{\n  if (!ev_is_active (&pipe_w))\n    {\n      int fds [2];\n\n# if EV_USE_EVENTFD\n      fds [0] = -1;\n      fds [1] = eventfd (0, EFD_NONBLOCK | EFD_CLOEXEC);\n      if (fds [1] < 0 && errno == EINVAL)\n        fds [1] = eventfd (0, 0);\n\n      if (fds [1] < 0)\n# endif\n        {\n          while (pipe (fds))\n            ev_syserr (\"(libev) error creating signal/async pipe\");\n\n          fd_intern (fds [0]);\n        }\n\n      evpipe [0] = fds [0];\n\n      if (evpipe [1] < 0)\n        evpipe [1] = fds [1]; /* first call, set write fd */\n      else\n        {\n          /* on subsequent calls, do not change evpipe [1] */\n          /* so that evpipe_write can always rely on its value. */\n          /* this branch does not do anything sensible on windows, */\n          /* so must not be executed on windows */\n\n          dup2 (fds [1], evpipe [1]);\n          close (fds [1]);\n        }\n\n      fd_intern (evpipe [1]);\n\n      ev_io_set (&pipe_w, evpipe [0] < 0 ? evpipe [1] : evpipe [0], EV_READ);\n      ev_io_start (EV_A_ &pipe_w);\n      ev_unref (EV_A); /* watcher should not keep loop alive */\n    }\n}\n\ninline_speed void\nevpipe_write (EV_P_ EV_ATOMIC_T *flag)\n{\n  ECB_MEMORY_FENCE; /* push out the write before this function was called, acquire flag */\n\n  if (expect_true (*flag))\n    return;\n\n  *flag = 1;\n  ECB_MEMORY_FENCE_RELEASE; /* make sure flag is visible before the wakeup */\n\n  pipe_write_skipped = 1;\n\n  ECB_MEMORY_FENCE; /* make sure pipe_write_skipped is visible before we check pipe_write_wanted */\n\n  if (pipe_write_wanted)\n    {\n      int old_errno;\n\n      pipe_write_skipped = 0;\n      ECB_MEMORY_FENCE_RELEASE;\n\n      old_errno = errno; /* save errno because write will clobber it */\n\n#if EV_USE_EVENTFD\n      if (evpipe [0] < 0)\n        {\n          uint64_t counter = 1;\n          write (evpipe [1], &counter, sizeof (uint64_t));\n        }\n      else\n#endif\n        {\n#ifdef _WIN32\n          WSABUF buf;\n          DWORD sent;\n          buf.buf = &buf;\n          buf.len = 1;\n          WSASend (EV_FD_TO_WIN32_HANDLE (evpipe [1]), &buf, 1, &sent, 0, 0, 0);\n#else\n          write (evpipe [1], &(evpipe [1]), 1);\n#endif\n        }\n\n      errno = old_errno;\n    }\n}\n\n/* called whenever the libev signal pipe */\n/* got some events (signal, async) */\nstatic void\npipecb (EV_P_ ev_io *iow, int revents)\n{\n  int i;\n\n  if (revents & EV_READ)\n    {\n#if EV_USE_EVENTFD\n      if (evpipe [0] < 0)\n        {\n          uint64_t counter;\n          read (evpipe [1], &counter, sizeof (uint64_t));\n        }\n      else\n#endif\n        {\n          char dummy[4];\n#ifdef _WIN32\n          WSABUF buf;\n          DWORD recvd;\n          DWORD flags = 0;\n          buf.buf = dummy;\n          buf.len = sizeof (dummy);\n          WSARecv (EV_FD_TO_WIN32_HANDLE (evpipe [0]), &buf, 1, &recvd, &flags, 0, 0);\n#else\n          read (evpipe [0], &dummy, sizeof (dummy));\n#endif\n        }\n    }\n\n  pipe_write_skipped = 0;\n\n  ECB_MEMORY_FENCE; /* push out skipped, acquire flags */\n\n#if EV_SIGNAL_ENABLE\n  if (sig_pending)\n    {\n      sig_pending = 0;\n\n      ECB_MEMORY_FENCE;\n\n      for (i = EV_NSIG - 1; i--; )\n        if (expect_false (signals [i].pending))\n          ev_feed_signal_event (EV_A_ i + 1);\n    }\n#endif\n\n#if EV_ASYNC_ENABLE\n  if (async_pending)\n    {\n      async_pending = 0;\n\n      ECB_MEMORY_FENCE;\n\n      for (i = asynccnt; i--; )\n        if (asyncs [i]->sent)\n          {\n            asyncs [i]->sent = 0;\n            ECB_MEMORY_FENCE_RELEASE;\n            ev_feed_event (EV_A_ asyncs [i], EV_ASYNC);\n          }\n    }\n#endif\n}\n\n/*****************************************************************************/\n\nvoid\nev_feed_signal (int signum) EV_THROW\n{\n#if EV_MULTIPLICITY\n  EV_P;\n  ECB_MEMORY_FENCE_ACQUIRE;\n  EV_A = signals [signum - 1].loop;\n\n  if (!EV_A)\n    return;\n#endif\n\n  signals [signum - 1].pending = 1;\n  evpipe_write (EV_A_ &sig_pending);\n}\n\nstatic void\nev_sighandler (int signum)\n{\n#ifdef _WIN32\n  signal (signum, ev_sighandler);\n#endif\n\n  ev_feed_signal (signum);\n}\n\nvoid noinline\nev_feed_signal_event (EV_P_ int signum) EV_THROW\n{\n  WL w;\n\n  if (expect_false (signum <= 0 || signum >= EV_NSIG))\n    return;\n\n  --signum;\n\n#if EV_MULTIPLICITY\n  /* it is permissible to try to feed a signal to the wrong loop */\n  /* or, likely more useful, feeding a signal nobody is waiting for */\n\n  if (expect_false (signals [signum].loop != EV_A))\n    return;\n#endif\n\n  signals [signum].pending = 0;\n  ECB_MEMORY_FENCE_RELEASE;\n\n  for (w = signals [signum].head; w; w = w->next)\n    ev_feed_event (EV_A_ (W)w, EV_SIGNAL);\n}\n\n#if EV_USE_SIGNALFD\nstatic void\nsigfdcb (EV_P_ ev_io *iow, int revents)\n{\n  struct signalfd_siginfo si[2], *sip; /* these structs are big */\n\n  for (;;)\n    {\n      ssize_t res = read (sigfd, si, sizeof (si));\n\n      /* not ISO-C, as res might be -1, but works with SuS */\n      for (sip = si; (char *)sip < (char *)si + res; ++sip)\n        ev_feed_signal_event (EV_A_ sip->ssi_signo);\n\n      if (res < (ssize_t)sizeof (si))\n        break;\n    }\n}\n#endif\n\n#endif\n\n/*****************************************************************************/\n\n#if EV_CHILD_ENABLE\nstatic WL childs [EV_PID_HASHSIZE];\n\nstatic ev_signal childev;\n\n#ifndef WIFCONTINUED\n# define WIFCONTINUED(status) 0\n#endif\n\n/* handle a single child status event */\ninline_speed void\nchild_reap (EV_P_ int chain, int pid, int status)\n{\n  ev_child *w;\n  int traced = WIFSTOPPED (status) || WIFCONTINUED (status);\n\n  for (w = (ev_child *)childs [chain & ((EV_PID_HASHSIZE) - 1)]; w; w = (ev_child *)((WL)w)->next)\n    {\n      if ((w->pid == pid || !w->pid)\n          && (!traced || (w->flags & 1)))\n        {\n          ev_set_priority (w, EV_MAXPRI); /* need to do it *now*, this *must* be the same prio as the signal watcher itself */\n          w->rpid    = pid;\n          w->rstatus = status;\n          ev_feed_event (EV_A_ (W)w, EV_CHILD);\n        }\n    }\n}\n\n#ifndef WCONTINUED\n# define WCONTINUED 0\n#endif\n\n/* called on sigchld etc., calls waitpid */\nstatic void\nchildcb (EV_P_ ev_signal *sw, int revents)\n{\n  int pid, status;\n\n  /* some systems define WCONTINUED but then fail to support it (linux 2.4) */\n  if (0 >= (pid = waitpid (-1, &status, WNOHANG | WUNTRACED | WCONTINUED)))\n    if (!WCONTINUED\n        || errno != EINVAL\n        || 0 >= (pid = waitpid (-1, &status, WNOHANG | WUNTRACED)))\n      return;\n\n  /* make sure we are called again until all children have been reaped */\n  /* we need to do it this way so that the callback gets called before we continue */\n  ev_feed_event (EV_A_ (W)sw, EV_SIGNAL);\n\n  child_reap (EV_A_ pid, pid, status);\n  if ((EV_PID_HASHSIZE) > 1)\n    child_reap (EV_A_ 0, pid, status); /* this might trigger a watcher twice, but feed_event catches that */\n}\n\n#endif\n\n/*****************************************************************************/\n\n#if EV_USE_IOCP\n# include \"ev_iocp.c\"\n#endif\n#if EV_USE_PORT\n# include \"ev_port.c\"\n#endif\n#if EV_USE_KQUEUE\n# include \"ev_kqueue.c\"\n#endif\n#if EV_USE_EPOLL\n# include \"ev_epoll.c\"\n#endif\n#if EV_USE_POLL\n# include \"ev_poll.c\"\n#endif\n#if EV_USE_SELECT\n# include \"ev_select.c\"\n#endif\n\nint ecb_cold\nev_version_major (void) EV_THROW\n{\n  return EV_VERSION_MAJOR;\n}\n\nint ecb_cold\nev_version_minor (void) EV_THROW\n{\n  return EV_VERSION_MINOR;\n}\n\n/* return true if we are running with elevated privileges and should ignore env variables */\nint inline_size ecb_cold\nenable_secure (void)\n{\n#ifdef _WIN32\n  return 0;\n#else\n  return getuid () != geteuid ()\n      || getgid () != getegid ();\n#endif\n}\n\nunsigned int ecb_cold\nev_supported_backends (void) EV_THROW\n{\n  unsigned int flags = 0;\n\n  if (EV_USE_PORT  ) flags |= EVBACKEND_PORT;\n  if (EV_USE_KQUEUE) flags |= EVBACKEND_KQUEUE;\n  if (EV_USE_EPOLL ) flags |= EVBACKEND_EPOLL;\n  if (EV_USE_POLL  ) flags |= EVBACKEND_POLL;\n  if (EV_USE_SELECT) flags |= EVBACKEND_SELECT;\n  \n  return flags;\n}\n\nunsigned int ecb_cold\nev_recommended_backends (void) EV_THROW\n{\n  unsigned int flags = ev_supported_backends ();\n\n#if !defined(__NetBSD__) && !defined(__FreeBSD__)\n  /* kqueue is borked on everything but netbsd apparently */\n  /* it usually doesn't work correctly on anything but sockets and pipes */\n  flags &= ~EVBACKEND_KQUEUE;\n#endif\n#ifdef __APPLE__\n  /* only select works correctly on that \"unix-certified\" platform */\n  flags &= ~EVBACKEND_KQUEUE; /* horribly broken, even for sockets */\n  flags &= ~EVBACKEND_POLL;   /* poll is based on kqueue from 10.5 onwards */\n#endif\n#ifdef __FreeBSD__\n  flags &= ~EVBACKEND_POLL;   /* poll return value is unusable (http://forums.freebsd.org/archive/index.php/t-10270.html) */\n#endif\n\n  return flags;\n}\n\nunsigned int ecb_cold\nev_embeddable_backends (void) EV_THROW\n{\n  int flags = EVBACKEND_EPOLL | EVBACKEND_KQUEUE | EVBACKEND_PORT;\n\n  /* epoll embeddability broken on all linux versions up to at least 2.6.23 */\n  if (ev_linux_version () < 0x020620) /* disable it on linux < 2.6.32 */\n    flags &= ~EVBACKEND_EPOLL;\n\n  return flags;\n}\n\nunsigned int\nev_backend (EV_P) EV_THROW\n{\n  return backend;\n}\n\n#if EV_FEATURE_API\nunsigned int\nev_iteration (EV_P) EV_THROW\n{\n  return loop_count;\n}\n\nunsigned int\nev_depth (EV_P) EV_THROW\n{\n  return loop_depth;\n}\n\nvoid\nev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_THROW\n{\n  io_blocktime = interval;\n}\n\nvoid\nev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_THROW\n{\n  timeout_blocktime = interval;\n}\n\nvoid\nev_set_userdata (EV_P_ void *data) EV_THROW\n{\n  userdata = data;\n}\n\nvoid *\nev_userdata (EV_P) EV_THROW\n{\n  return userdata;\n}\n\nvoid\nev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_THROW\n{\n  invoke_cb = invoke_pending_cb;\n}\n\nvoid\nev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_THROW, void (*acquire)(EV_P) EV_THROW) EV_THROW\n{\n  release_cb = release;\n  acquire_cb = acquire;\n}\n#endif\n\n/* initialise a loop structure, must be zero-initialised */\nstatic void noinline ecb_cold\nloop_init (EV_P_ unsigned int flags) EV_THROW\n{\n  if (!backend)\n    {\n      origflags = flags;\n\n#if EV_USE_REALTIME\n      if (!have_realtime)\n        {\n          struct timespec ts;\n\n          if (!clock_gettime (CLOCK_REALTIME, &ts))\n            have_realtime = 1;\n        }\n#endif\n\n#if EV_USE_MONOTONIC\n      if (!have_monotonic)\n        {\n          struct timespec ts;\n\n          if (!clock_gettime (CLOCK_MONOTONIC, &ts))\n            have_monotonic = 1;\n        }\n#endif\n\n      /* pid check not overridable via env */\n#ifndef _WIN32\n      if (flags & EVFLAG_FORKCHECK)\n        curpid = getpid ();\n#endif\n\n      if (!(flags & EVFLAG_NOENV)\n          && !enable_secure ()\n          && getenv (\"LIBEV_FLAGS\"))\n        flags = atoi (getenv (\"LIBEV_FLAGS\"));\n\n      ev_rt_now          = ev_time ();\n      mn_now             = get_clock ();\n      now_floor          = mn_now;\n      rtmn_diff          = ev_rt_now - mn_now;\n#if EV_FEATURE_API\n      invoke_cb          = ev_invoke_pending;\n#endif\n\n      io_blocktime       = 0.;\n      timeout_blocktime  = 0.;\n      backend            = 0;\n      backend_fd         = -1;\n      sig_pending        = 0;\n#if EV_ASYNC_ENABLE\n      async_pending      = 0;\n#endif\n      pipe_write_skipped = 0;\n      pipe_write_wanted  = 0;\n      evpipe [0]         = -1;\n      evpipe [1]         = -1;\n#if EV_USE_INOTIFY\n      fs_fd              = flags & EVFLAG_NOINOTIFY ? -1 : -2;\n#endif\n#if EV_USE_SIGNALFD\n      sigfd              = flags & EVFLAG_SIGNALFD  ? -2 : -1;\n#endif\n\n      if (!(flags & EVBACKEND_MASK))\n        flags |= ev_recommended_backends ();\n\n#if EV_USE_IOCP\n      if (!backend && (flags & EVBACKEND_IOCP  )) backend = iocp_init   (EV_A_ flags);\n#endif\n#if EV_USE_PORT\n      if (!backend && (flags & EVBACKEND_PORT  )) backend = port_init   (EV_A_ flags);\n#endif\n#if EV_USE_KQUEUE\n      if (!backend && (flags & EVBACKEND_KQUEUE)) backend = kqueue_init (EV_A_ flags);\n#endif\n#if EV_USE_EPOLL\n      if (!backend && (flags & EVBACKEND_EPOLL )) backend = epoll_init  (EV_A_ flags);\n#endif\n#if EV_USE_POLL\n      if (!backend && (flags & EVBACKEND_POLL  )) backend = poll_init   (EV_A_ flags);\n#endif\n#if EV_USE_SELECT\n      if (!backend && (flags & EVBACKEND_SELECT)) backend = select_init (EV_A_ flags);\n#endif\n\n      ev_prepare_init (&pending_w, pendingcb);\n\n#if EV_SIGNAL_ENABLE || EV_ASYNC_ENABLE\n      ev_init (&pipe_w, pipecb);\n      ev_set_priority (&pipe_w, EV_MAXPRI);\n#endif\n    }\n}\n\n/* free up a loop structure */\nvoid ecb_cold\nev_loop_destroy (EV_P)\n{\n  int i;\n\n#if EV_MULTIPLICITY\n  /* mimic free (0) */\n  if (!EV_A)\n    return;\n#endif\n\n#if EV_CLEANUP_ENABLE\n  /* queue cleanup watchers (and execute them) */\n  if (expect_false (cleanupcnt))\n    {\n      queue_events (EV_A_ (W *)cleanups, cleanupcnt, EV_CLEANUP);\n      EV_INVOKE_PENDING;\n    }\n#endif\n\n#if EV_CHILD_ENABLE\n  if (ev_is_default_loop (EV_A) && ev_is_active (&childev))\n    {\n      ev_ref (EV_A); /* child watcher */\n      ev_signal_stop (EV_A_ &childev);\n    }\n#endif\n\n  if (ev_is_active (&pipe_w))\n    {\n      /*ev_ref (EV_A);*/\n      /*ev_io_stop (EV_A_ &pipe_w);*/\n\n      if (evpipe [0] >= 0) EV_WIN32_CLOSE_FD (evpipe [0]);\n      if (evpipe [1] >= 0) EV_WIN32_CLOSE_FD (evpipe [1]);\n    }\n\n#if EV_USE_SIGNALFD\n  if (ev_is_active (&sigfd_w))\n    close (sigfd);\n#endif\n\n#if EV_USE_INOTIFY\n  if (fs_fd >= 0)\n    close (fs_fd);\n#endif\n\n  if (backend_fd >= 0)\n    close (backend_fd);\n\n#if EV_USE_IOCP\n  if (backend == EVBACKEND_IOCP  ) iocp_destroy   (EV_A);\n#endif\n#if EV_USE_PORT\n  if (backend == EVBACKEND_PORT  ) port_destroy   (EV_A);\n#endif\n#if EV_USE_KQUEUE\n  if (backend == EVBACKEND_KQUEUE) kqueue_destroy (EV_A);\n#endif\n#if EV_USE_EPOLL\n  if (backend == EVBACKEND_EPOLL ) epoll_destroy  (EV_A);\n#endif\n#if EV_USE_POLL\n  if (backend == EVBACKEND_POLL  ) poll_destroy   (EV_A);\n#endif\n#if EV_USE_SELECT\n  if (backend == EVBACKEND_SELECT) select_destroy (EV_A);\n#endif\n\n  for (i = NUMPRI; i--; )\n    {\n      array_free (pending, [i]);\n#if EV_IDLE_ENABLE\n      array_free (idle, [i]);\n#endif\n    }\n\n  ev_free (anfds); anfds = 0; anfdmax = 0;\n\n  /* have to use the microsoft-never-gets-it-right macro */\n  array_free (rfeed, EMPTY);\n  array_free (fdchange, EMPTY);\n  array_free (timer, EMPTY);\n#if EV_PERIODIC_ENABLE\n  array_free (periodic, EMPTY);\n#endif\n#if EV_FORK_ENABLE\n  array_free (fork, EMPTY);\n#endif\n#if EV_CLEANUP_ENABLE\n  array_free (cleanup, EMPTY);\n#endif\n  array_free (prepare, EMPTY);\n  array_free (check, EMPTY);\n#if EV_ASYNC_ENABLE\n  array_free (async, EMPTY);\n#endif\n\n  backend = 0;\n\n#if EV_MULTIPLICITY\n  if (ev_is_default_loop (EV_A))\n#endif\n    ev_default_loop_ptr = 0;\n#if EV_MULTIPLICITY\n  else\n    ev_free (EV_A);\n#endif\n}\n\n#if EV_USE_INOTIFY\ninline_size void infy_fork (EV_P);\n#endif\n\ninline_size void\nloop_fork (EV_P)\n{\n#if EV_USE_PORT\n  if (backend == EVBACKEND_PORT  ) port_fork   (EV_A);\n#endif\n#if EV_USE_KQUEUE\n  if (backend == EVBACKEND_KQUEUE) kqueue_fork (EV_A);\n#endif\n#if EV_USE_EPOLL\n  if (backend == EVBACKEND_EPOLL ) epoll_fork  (EV_A);\n#endif\n#if EV_USE_INOTIFY\n  infy_fork (EV_A);\n#endif\n\n#if EV_SIGNAL_ENABLE || EV_ASYNC_ENABLE\n  if (ev_is_active (&pipe_w) && postfork != 2)\n    {\n      /* pipe_write_wanted must be false now, so modifying fd vars should be safe */\n\n      ev_ref (EV_A);\n      ev_io_stop (EV_A_ &pipe_w);\n\n      if (evpipe [0] >= 0)\n        EV_WIN32_CLOSE_FD (evpipe [0]);\n\n      evpipe_init (EV_A);\n      /* iterate over everything, in case we missed something before */\n      ev_feed_event (EV_A_ &pipe_w, EV_CUSTOM);\n    }\n#endif\n\n  postfork = 0;\n}\n\n#if EV_MULTIPLICITY\n\nstruct ev_loop * ecb_cold\nev_loop_new (unsigned int flags) EV_THROW\n{\n  EV_P = (struct ev_loop *)ev_malloc (sizeof (struct ev_loop));\n\n  memset (EV_A, 0, sizeof (struct ev_loop));\n  loop_init (EV_A_ flags);\n\n  if (ev_backend (EV_A))\n    return EV_A;\n\n  ev_free (EV_A);\n  return 0;\n}\n\n#endif /* multiplicity */\n\n#if EV_VERIFY\nstatic void noinline ecb_cold\nverify_watcher (EV_P_ W w)\n{\n  assert ((\"libev: watcher has invalid priority\", ABSPRI (w) >= 0 && ABSPRI (w) < NUMPRI));\n\n  if (w->pending)\n    assert ((\"libev: pending watcher not on pending queue\", pendings [ABSPRI (w)][w->pending - 1].w == w));\n}\n\nstatic void noinline ecb_cold\nverify_heap (EV_P_ ANHE *heap, int N)\n{\n  int i;\n\n  for (i = HEAP0; i < N + HEAP0; ++i)\n    {\n      assert ((\"libev: active index mismatch in heap\", ev_active (ANHE_w (heap [i])) == i));\n      assert ((\"libev: heap condition violated\", i == HEAP0 || ANHE_at (heap [HPARENT (i)]) <= ANHE_at (heap [i])));\n      assert ((\"libev: heap at cache mismatch\", ANHE_at (heap [i]) == ev_at (ANHE_w (heap [i]))));\n\n      verify_watcher (EV_A_ (W)ANHE_w (heap [i]));\n    }\n}\n\nstatic void noinline ecb_cold\narray_verify (EV_P_ W *ws, int cnt)\n{\n  while (cnt--)\n    {\n      assert ((\"libev: active index mismatch\", ev_active (ws [cnt]) == cnt + 1));\n      verify_watcher (EV_A_ ws [cnt]);\n    }\n}\n#endif\n\n#if EV_FEATURE_API\nvoid ecb_cold\nev_verify (EV_P) EV_THROW\n{\n#if EV_VERIFY\n  int i;\n  WL w, w2;\n\n  assert (activecnt >= -1);\n\n  assert (fdchangemax >= fdchangecnt);\n  for (i = 0; i < fdchangecnt; ++i)\n    assert ((\"libev: negative fd in fdchanges\", fdchanges [i] >= 0));\n\n  assert (anfdmax >= 0);\n  for (i = 0; i < anfdmax; ++i)\n    {\n      int j = 0;\n\n      for (w = w2 = anfds [i].head; w; w = w->next)\n        {\n          verify_watcher (EV_A_ (W)w);\n\n          if (j++ & 1)\n            {\n              assert ((\"libev: io watcher list contains a loop\", w != w2));\n              w2 = w2->next;\n            }\n\n          assert ((\"libev: inactive fd watcher on anfd list\", ev_active (w) == 1));\n          assert ((\"libev: fd mismatch between watcher and anfd\", ((ev_io *)w)->fd == i));\n        }\n    }\n\n  assert (timermax >= timercnt);\n  verify_heap (EV_A_ timers, timercnt);\n\n#if EV_PERIODIC_ENABLE\n  assert (periodicmax >= periodiccnt);\n  verify_heap (EV_A_ periodics, periodiccnt);\n#endif\n\n  for (i = NUMPRI; i--; )\n    {\n      assert (pendingmax [i] >= pendingcnt [i]);\n#if EV_IDLE_ENABLE\n      assert (idleall >= 0);\n      assert (idlemax [i] >= idlecnt [i]);\n      array_verify (EV_A_ (W *)idles [i], idlecnt [i]);\n#endif\n    }\n\n#if EV_FORK_ENABLE\n  assert (forkmax >= forkcnt);\n  array_verify (EV_A_ (W *)forks, forkcnt);\n#endif\n\n#if EV_CLEANUP_ENABLE\n  assert (cleanupmax >= cleanupcnt);\n  array_verify (EV_A_ (W *)cleanups, cleanupcnt);\n#endif\n\n#if EV_ASYNC_ENABLE\n  assert (asyncmax >= asynccnt);\n  array_verify (EV_A_ (W *)asyncs, asynccnt);\n#endif\n\n#if EV_PREPARE_ENABLE\n  assert (preparemax >= preparecnt);\n  array_verify (EV_A_ (W *)prepares, preparecnt);\n#endif\n\n#if EV_CHECK_ENABLE\n  assert (checkmax >= checkcnt);\n  array_verify (EV_A_ (W *)checks, checkcnt);\n#endif\n\n# if 0\n#if EV_CHILD_ENABLE\n  for (w = (ev_child *)childs [chain & ((EV_PID_HASHSIZE) - 1)]; w; w = (ev_child *)((WL)w)->next)\n  for (signum = EV_NSIG; signum--; ) if (signals [signum].pending)\n#endif\n# endif\n#endif\n}\n#endif\n\n#if EV_MULTIPLICITY\nstruct ev_loop * ecb_cold\n#else\nint\n#endif\nev_default_loop (unsigned int flags) EV_THROW\n{\n  if (!ev_default_loop_ptr)\n    {\n#if EV_MULTIPLICITY\n      EV_P = ev_default_loop_ptr = &default_loop_struct;\n#else\n      ev_default_loop_ptr = 1;\n#endif\n\n      loop_init (EV_A_ flags);\n\n      if (ev_backend (EV_A))\n        {\n#if EV_CHILD_ENABLE\n          ev_signal_init (&childev, childcb, SIGCHLD);\n          ev_set_priority (&childev, EV_MAXPRI);\n          ev_signal_start (EV_A_ &childev);\n          ev_unref (EV_A); /* child watcher should not keep loop alive */\n#endif\n        }\n      else\n        ev_default_loop_ptr = 0;\n    }\n\n  return ev_default_loop_ptr;\n}\n\nvoid\nev_loop_fork (EV_P) EV_THROW\n{\n  postfork = 1;\n}\n\n/*****************************************************************************/\n\nvoid\nev_invoke (EV_P_ void *w, int revents)\n{\n  EV_CB_INVOKE ((W)w, revents);\n}\n\nunsigned int\nev_pending_count (EV_P) EV_THROW\n{\n  int pri;\n  unsigned int count = 0;\n\n  for (pri = NUMPRI; pri--; )\n    count += pendingcnt [pri];\n\n  return count;\n}\n\nvoid noinline\nev_invoke_pending (EV_P)\n{\n  pendingpri = NUMPRI;\n\n  while (pendingpri) /* pendingpri possibly gets modified in the inner loop */\n    {\n      --pendingpri;\n\n      while (pendingcnt [pendingpri])\n        {\n          ANPENDING *p = pendings [pendingpri] + --pendingcnt [pendingpri];\n\n          p->w->pending = 0;\n          EV_CB_INVOKE (p->w, p->events);\n          EV_FREQUENT_CHECK;\n        }\n    }\n}\n\n#if EV_IDLE_ENABLE\n/* make idle watchers pending. this handles the \"call-idle */\n/* only when higher priorities are idle\" logic */\ninline_size void\nidle_reify (EV_P)\n{\n  if (expect_false (idleall))\n    {\n      int pri;\n\n      for (pri = NUMPRI; pri--; )\n        {\n          if (pendingcnt [pri])\n            break;\n\n          if (idlecnt [pri])\n            {\n              queue_events (EV_A_ (W *)idles [pri], idlecnt [pri], EV_IDLE);\n              break;\n            }\n        }\n    }\n}\n#endif\n\n/* make timers pending */\ninline_size void\ntimers_reify (EV_P)\n{\n  EV_FREQUENT_CHECK;\n\n  if (timercnt && ANHE_at (timers [HEAP0]) < mn_now)\n    {\n      do\n        {\n          ev_timer *w = (ev_timer *)ANHE_w (timers [HEAP0]);\n\n          /*assert ((\"libev: inactive timer on timer heap detected\", ev_is_active (w)));*/\n\n          /* first reschedule or stop timer */\n          if (w->repeat)\n            {\n              ev_at (w) += w->repeat;\n              if (ev_at (w) < mn_now)\n                ev_at (w) = mn_now;\n\n              assert ((\"libev: negative ev_timer repeat value found while processing timers\", w->repeat > 0.));\n\n              ANHE_at_cache (timers [HEAP0]);\n              downheap (timers, timercnt, HEAP0);\n            }\n          else\n            ev_timer_stop (EV_A_ w); /* nonrepeating: stop timer */\n\n          EV_FREQUENT_CHECK;\n          feed_reverse (EV_A_ (W)w);\n        }\n      while (timercnt && ANHE_at (timers [HEAP0]) < mn_now);\n\n      feed_reverse_done (EV_A_ EV_TIMER);\n    }\n}\n\n#if EV_PERIODIC_ENABLE\n\nstatic void noinline\nperiodic_recalc (EV_P_ ev_periodic *w)\n{\n  ev_tstamp interval = w->interval > MIN_INTERVAL ? w->interval : MIN_INTERVAL;\n  ev_tstamp at = w->offset + interval * ev_floor ((ev_rt_now - w->offset) / interval);\n\n  /* the above almost always errs on the low side */\n  while (at <= ev_rt_now)\n    {\n      ev_tstamp nat = at + w->interval;\n\n      /* when resolution fails us, we use ev_rt_now */\n      if (expect_false (nat == at))\n        {\n          at = ev_rt_now;\n          break;\n        }\n\n      at = nat;\n    }\n\n  ev_at (w) = at;\n}\n\n/* make periodics pending */\ninline_size void\nperiodics_reify (EV_P)\n{\n  EV_FREQUENT_CHECK;\n\n  while (periodiccnt && ANHE_at (periodics [HEAP0]) < ev_rt_now)\n    {\n      do\n        {\n          ev_periodic *w = (ev_periodic *)ANHE_w (periodics [HEAP0]);\n\n          /*assert ((\"libev: inactive timer on periodic heap detected\", ev_is_active (w)));*/\n\n          /* first reschedule or stop timer */\n          if (w->reschedule_cb)\n            {\n              ev_at (w) = w->reschedule_cb (w, ev_rt_now);\n\n              assert ((\"libev: ev_periodic reschedule callback returned time in the past\", ev_at (w) >= ev_rt_now));\n\n              ANHE_at_cache (periodics [HEAP0]);\n              downheap (periodics, periodiccnt, HEAP0);\n            }\n          else if (w->interval)\n            {\n              periodic_recalc (EV_A_ w);\n              ANHE_at_cache (periodics [HEAP0]);\n              downheap (periodics, periodiccnt, HEAP0);\n            }\n          else\n            ev_periodic_stop (EV_A_ w); /* nonrepeating: stop timer */\n\n          EV_FREQUENT_CHECK;\n          feed_reverse (EV_A_ (W)w);\n        }\n      while (periodiccnt && ANHE_at (periodics [HEAP0]) < ev_rt_now);\n\n      feed_reverse_done (EV_A_ EV_PERIODIC);\n    }\n}\n\n/* simply recalculate all periodics */\n/* TODO: maybe ensure that at least one event happens when jumping forward? */\nstatic void noinline ecb_cold\nperiodics_reschedule (EV_P)\n{\n  int i;\n\n  /* adjust periodics after time jump */\n  for (i = HEAP0; i < periodiccnt + HEAP0; ++i)\n    {\n      ev_periodic *w = (ev_periodic *)ANHE_w (periodics [i]);\n\n      if (w->reschedule_cb)\n        ev_at (w) = w->reschedule_cb (w, ev_rt_now);\n      else if (w->interval)\n        periodic_recalc (EV_A_ w);\n\n      ANHE_at_cache (periodics [i]);\n    }\n\n  reheap (periodics, periodiccnt);\n}\n#endif\n\n/* adjust all timers by a given offset */\nstatic void noinline ecb_cold\ntimers_reschedule (EV_P_ ev_tstamp adjust)\n{\n  int i;\n\n  for (i = 0; i < timercnt; ++i)\n    {\n      ANHE *he = timers + i + HEAP0;\n      ANHE_w (*he)->at += adjust;\n      ANHE_at_cache (*he);\n    }\n}\n\n/* fetch new monotonic and realtime times from the kernel */\n/* also detect if there was a timejump, and act accordingly */\ninline_speed void\ntime_update (EV_P_ ev_tstamp max_block)\n{\n#if EV_USE_MONOTONIC\n  if (expect_true (have_monotonic))\n    {\n      int i;\n      ev_tstamp odiff = rtmn_diff;\n\n      mn_now = get_clock ();\n\n      /* only fetch the realtime clock every 0.5*MIN_TIMEJUMP seconds */\n      /* interpolate in the meantime */\n      if (expect_true (mn_now - now_floor < MIN_TIMEJUMP * .5))\n        {\n          ev_rt_now = rtmn_diff + mn_now;\n          return;\n        }\n\n      now_floor = mn_now;\n      ev_rt_now = ev_time ();\n\n      /* loop a few times, before making important decisions.\n       * on the choice of \"4\": one iteration isn't enough,\n       * in case we get preempted during the calls to\n       * ev_time and get_clock. a second call is almost guaranteed\n       * to succeed in that case, though. and looping a few more times\n       * doesn't hurt either as we only do this on time-jumps or\n       * in the unlikely event of having been preempted here.\n       */\n      for (i = 4; --i; )\n        {\n          ev_tstamp diff;\n          rtmn_diff = ev_rt_now - mn_now;\n\n          diff = odiff - rtmn_diff;\n\n          if (expect_true ((diff < 0. ? -diff : diff) < MIN_TIMEJUMP))\n            return; /* all is well */\n\n          ev_rt_now = ev_time ();\n          mn_now    = get_clock ();\n          now_floor = mn_now;\n        }\n\n      /* no timer adjustment, as the monotonic clock doesn't jump */\n      /* timers_reschedule (EV_A_ rtmn_diff - odiff) */\n# if EV_PERIODIC_ENABLE\n      periodics_reschedule (EV_A);\n# endif\n    }\n  else\n#endif\n    {\n      ev_rt_now = ev_time ();\n\n      if (expect_false (mn_now > ev_rt_now || ev_rt_now > mn_now + max_block + MIN_TIMEJUMP))\n        {\n          /* adjust timers. this is easy, as the offset is the same for all of them */\n          timers_reschedule (EV_A_ ev_rt_now - mn_now);\n#if EV_PERIODIC_ENABLE\n          periodics_reschedule (EV_A);\n#endif\n        }\n\n      mn_now = ev_rt_now;\n    }\n}\n\nint\nev_run (EV_P_ int flags)\n{\n#if EV_FEATURE_API\n  ++loop_depth;\n#endif\n\n  assert ((\"libev: ev_loop recursion during release detected\", loop_done != EVBREAK_RECURSE));\n\n  loop_done = EVBREAK_CANCEL;\n\n  EV_INVOKE_PENDING; /* in case we recurse, ensure ordering stays nice and clean */\n\n  do\n    {\n#if EV_VERIFY >= 2\n      ev_verify (EV_A);\n#endif\n\n#ifndef _WIN32\n      if (expect_false (curpid)) /* penalise the forking check even more */\n        if (expect_false (getpid () != curpid))\n          {\n            curpid = getpid ();\n            postfork = 1;\n          }\n#endif\n\n#if EV_FORK_ENABLE\n      /* we might have forked, so queue fork handlers */\n      if (expect_false (postfork))\n        if (forkcnt)\n          {\n            queue_events (EV_A_ (W *)forks, forkcnt, EV_FORK);\n            EV_INVOKE_PENDING;\n          }\n#endif\n\n#if EV_PREPARE_ENABLE\n      /* queue prepare watchers (and execute them) */\n      if (expect_false (preparecnt))\n        {\n          queue_events (EV_A_ (W *)prepares, preparecnt, EV_PREPARE);\n          EV_INVOKE_PENDING;\n        }\n#endif\n\n      if (expect_false (loop_done))\n        break;\n\n      /* we might have forked, so reify kernel state if necessary */\n      if (expect_false (postfork))\n        loop_fork (EV_A);\n\n      /* update fd-related kernel structures */\n      fd_reify (EV_A);\n\n      /* calculate blocking time */\n      {\n        ev_tstamp waittime  = 0.;\n        ev_tstamp sleeptime = 0.;\n\n        /* remember old timestamp for io_blocktime calculation */\n        ev_tstamp prev_mn_now = mn_now;\n\n        /* update time to cancel out callback processing overhead */\n        time_update (EV_A_ 1e100);\n\n        /* from now on, we want a pipe-wake-up */\n        pipe_write_wanted = 1;\n\n        ECB_MEMORY_FENCE; /* make sure pipe_write_wanted is visible before we check for potential skips */\n\n        if (expect_true (!(flags & EVRUN_NOWAIT || idleall || !activecnt || pipe_write_skipped)))\n          {\n            waittime = MAX_BLOCKTIME;\n\n            if (timercnt)\n              {\n                ev_tstamp to = ANHE_at (timers [HEAP0]) - mn_now;\n                if (waittime > to) waittime = to;\n              }\n\n#if EV_PERIODIC_ENABLE\n            if (periodiccnt)\n              {\n                ev_tstamp to = ANHE_at (periodics [HEAP0]) - ev_rt_now;\n                if (waittime > to) waittime = to;\n              }\n#endif\n\n            /* don't let timeouts decrease the waittime below timeout_blocktime */\n            if (expect_false (waittime < timeout_blocktime))\n              waittime = timeout_blocktime;\n\n            /* at this point, we NEED to wait, so we have to ensure */\n            /* to pass a minimum nonzero value to the backend */\n            if (expect_false (waittime < backend_mintime))\n              waittime = backend_mintime;\n\n            /* extra check because io_blocktime is commonly 0 */\n            if (expect_false (io_blocktime))\n              {\n                sleeptime = io_blocktime - (mn_now - prev_mn_now);\n\n                if (sleeptime > waittime - backend_mintime)\n                  sleeptime = waittime - backend_mintime;\n\n                if (expect_true (sleeptime > 0.))\n                  {\n                    ev_sleep (sleeptime);\n                    waittime -= sleeptime;\n                  }\n              }\n          }\n\n#if EV_FEATURE_API\n        ++loop_count;\n#endif\n        assert ((loop_done = EVBREAK_RECURSE, 1)); /* assert for side effect */\n        backend_poll (EV_A_ waittime);\n        assert ((loop_done = EVBREAK_CANCEL, 1)); /* assert for side effect */\n\n        pipe_write_wanted = 0; /* just an optimisation, no fence needed */\n\n        ECB_MEMORY_FENCE_ACQUIRE;\n        if (pipe_write_skipped)\n          {\n            assert ((\"libev: pipe_w not active, but pipe not written\", ev_is_active (&pipe_w)));\n            ev_feed_event (EV_A_ &pipe_w, EV_CUSTOM);\n          }\n\n\n        /* update ev_rt_now, do magic */\n        time_update (EV_A_ waittime + sleeptime);\n      }\n\n      /* queue pending timers and reschedule them */\n      timers_reify (EV_A); /* relative timers called last */\n#if EV_PERIODIC_ENABLE\n      periodics_reify (EV_A); /* absolute timers called first */\n#endif\n\n#if EV_IDLE_ENABLE\n      /* queue idle watchers unless other events are pending */\n      idle_reify (EV_A);\n#endif\n\n#if EV_CHECK_ENABLE\n      /* queue check watchers, to be executed first */\n      if (expect_false (checkcnt))\n        queue_events (EV_A_ (W *)checks, checkcnt, EV_CHECK);\n#endif\n\n      EV_INVOKE_PENDING;\n    }\n  while (expect_true (\n    activecnt\n    && !loop_done\n    && !(flags & (EVRUN_ONCE | EVRUN_NOWAIT))\n  ));\n\n  if (loop_done == EVBREAK_ONE)\n    loop_done = EVBREAK_CANCEL;\n\n#if EV_FEATURE_API\n  --loop_depth;\n#endif\n\n  return activecnt;\n}\n\nvoid\nev_break (EV_P_ int how) EV_THROW\n{\n  loop_done = how;\n}\n\nvoid\nev_ref (EV_P) EV_THROW\n{\n  ++activecnt;\n}\n\nvoid\nev_unref (EV_P) EV_THROW\n{\n  --activecnt;\n}\n\nvoid\nev_now_update (EV_P) EV_THROW\n{\n  time_update (EV_A_ 1e100);\n}\n\nvoid\nev_suspend (EV_P) EV_THROW\n{\n  ev_now_update (EV_A);\n}\n\nvoid\nev_resume (EV_P) EV_THROW\n{\n  ev_tstamp mn_prev = mn_now;\n\n  ev_now_update (EV_A);\n  timers_reschedule (EV_A_ mn_now - mn_prev);\n#if EV_PERIODIC_ENABLE\n  /* TODO: really do this? */\n  periodics_reschedule (EV_A);\n#endif\n}\n\n/*****************************************************************************/\n/* singly-linked list management, used when the expected list length is short */\n\ninline_size void\nwlist_add (WL *head, WL elem)\n{\n  elem->next = *head;\n  *head = elem;\n}\n\ninline_size void\nwlist_del (WL *head, WL elem)\n{\n  while (*head)\n    {\n      if (expect_true (*head == elem))\n        {\n          *head = elem->next;\n          break;\n        }\n\n      head = &(*head)->next;\n    }\n}\n\n/* internal, faster, version of ev_clear_pending */\ninline_speed void\nclear_pending (EV_P_ W w)\n{\n  if (w->pending)\n    {\n      pendings [ABSPRI (w)][w->pending - 1].w = (W)&pending_w;\n      w->pending = 0;\n    }\n}\n\nint\nev_clear_pending (EV_P_ void *w) EV_THROW\n{\n  W w_ = (W)w;\n  int pending = w_->pending;\n\n  if (expect_true (pending))\n    {\n      ANPENDING *p = pendings [ABSPRI (w_)] + pending - 1;\n      p->w = (W)&pending_w;\n      w_->pending = 0;\n      return p->events;\n    }\n  else\n    return 0;\n}\n\ninline_size void\npri_adjust (EV_P_ W w)\n{\n  int pri = ev_priority (w);\n  pri = pri < EV_MINPRI ? EV_MINPRI : pri;\n  pri = pri > EV_MAXPRI ? EV_MAXPRI : pri;\n  ev_set_priority (w, pri);\n}\n\ninline_speed void\nev_start (EV_P_ W w, int active)\n{\n  pri_adjust (EV_A_ w);\n  w->active = active;\n  ev_ref (EV_A);\n}\n\ninline_size void\nev_stop (EV_P_ W w)\n{\n  ev_unref (EV_A);\n  w->active = 0;\n}\n\n/*****************************************************************************/\n\nvoid noinline\nev_io_start (EV_P_ ev_io *w) EV_THROW\n{\n  int fd = w->fd;\n\n  if (expect_false (ev_is_active (w)))\n    return;\n\n  assert ((\"libev: ev_io_start called with negative fd\", fd >= 0));\n  assert ((\"libev: ev_io_start called with illegal event mask\", !(w->events & ~(EV__IOFDSET | EV_READ | EV_WRITE))));\n\n  EV_FREQUENT_CHECK;\n\n  ev_start (EV_A_ (W)w, 1);\n  array_needsize (ANFD, anfds, anfdmax, fd + 1, array_init_zero);\n  wlist_add (&anfds[fd].head, (WL)w);\n\n  /* common bug, apparently */\n  assert ((\"libev: ev_io_start called with corrupted watcher\", ((WL)w)->next != (WL)w));\n\n  fd_change (EV_A_ fd, w->events & EV__IOFDSET | EV_ANFD_REIFY);\n  w->events &= ~EV__IOFDSET;\n\n  EV_FREQUENT_CHECK;\n}\n\nvoid noinline\nev_io_stop (EV_P_ ev_io *w) EV_THROW\n{\n  clear_pending (EV_A_ (W)w);\n  if (expect_false (!ev_is_active (w)))\n    return;\n\n  assert ((\"libev: ev_io_stop called with illegal fd (must stay constant after start!)\", w->fd >= 0 && w->fd < anfdmax));\n\n  EV_FREQUENT_CHECK;\n\n  wlist_del (&anfds[w->fd].head, (WL)w);\n  ev_stop (EV_A_ (W)w);\n\n  fd_change (EV_A_ w->fd, EV_ANFD_REIFY);\n\n  EV_FREQUENT_CHECK;\n}\n\nvoid noinline\nev_timer_start (EV_P_ ev_timer *w) EV_THROW\n{\n  if (expect_false (ev_is_active (w)))\n    return;\n\n  ev_at (w) += mn_now;\n\n  assert ((\"libev: ev_timer_start called with negative timer repeat value\", w->repeat >= 0.));\n\n  EV_FREQUENT_CHECK;\n\n  ++timercnt;\n  ev_start (EV_A_ (W)w, timercnt + HEAP0 - 1);\n  array_needsize (ANHE, timers, timermax, ev_active (w) + 1, EMPTY2);\n  ANHE_w (timers [ev_active (w)]) = (WT)w;\n  ANHE_at_cache (timers [ev_active (w)]);\n  upheap (timers, ev_active (w));\n\n  EV_FREQUENT_CHECK;\n\n  /*assert ((\"libev: internal timer heap corruption\", timers [ev_active (w)] == (WT)w));*/\n}\n\nvoid noinline\nev_timer_stop (EV_P_ ev_timer *w) EV_THROW\n{\n  clear_pending (EV_A_ (W)w);\n  if (expect_false (!ev_is_active (w)))\n    return;\n\n  EV_FREQUENT_CHECK;\n\n  {\n    int active = ev_active (w);\n\n    assert ((\"libev: internal timer heap corruption\", ANHE_w (timers [active]) == (WT)w));\n\n    --timercnt;\n\n    if (expect_true (active < timercnt + HEAP0))\n      {\n        timers [active] = timers [timercnt + HEAP0];\n        adjustheap (timers, timercnt, active);\n      }\n  }\n\n  ev_at (w) -= mn_now;\n\n  ev_stop (EV_A_ (W)w);\n\n  EV_FREQUENT_CHECK;\n}\n\nvoid noinline\nev_timer_again (EV_P_ ev_timer *w) EV_THROW\n{\n  EV_FREQUENT_CHECK;\n\n  clear_pending (EV_A_ (W)w);\n\n  if (ev_is_active (w))\n    {\n      if (w->repeat)\n        {\n          ev_at (w) = mn_now + w->repeat;\n          ANHE_at_cache (timers [ev_active (w)]);\n          adjustheap (timers, timercnt, ev_active (w));\n        }\n      else\n        ev_timer_stop (EV_A_ w);\n    }\n  else if (w->repeat)\n    {\n      ev_at (w) = w->repeat;\n      ev_timer_start (EV_A_ w);\n    }\n\n  EV_FREQUENT_CHECK;\n}\n\nev_tstamp\nev_timer_remaining (EV_P_ ev_timer *w) EV_THROW\n{\n  return ev_at (w) - (ev_is_active (w) ? mn_now : 0.);\n}\n\n#if EV_PERIODIC_ENABLE\nvoid noinline\nev_periodic_start (EV_P_ ev_periodic *w) EV_THROW\n{\n  if (expect_false (ev_is_active (w)))\n    return;\n\n  if (w->reschedule_cb)\n    ev_at (w) = w->reschedule_cb (w, ev_rt_now);\n  else if (w->interval)\n    {\n      assert ((\"libev: ev_periodic_start called with negative interval value\", w->interval >= 0.));\n      periodic_recalc (EV_A_ w);\n    }\n  else\n    ev_at (w) = w->offset;\n\n  EV_FREQUENT_CHECK;\n\n  ++periodiccnt;\n  ev_start (EV_A_ (W)w, periodiccnt + HEAP0 - 1);\n  array_needsize (ANHE, periodics, periodicmax, ev_active (w) + 1, EMPTY2);\n  ANHE_w (periodics [ev_active (w)]) = (WT)w;\n  ANHE_at_cache (periodics [ev_active (w)]);\n  upheap (periodics, ev_active (w));\n\n  EV_FREQUENT_CHECK;\n\n  /*assert ((\"libev: internal periodic heap corruption\", ANHE_w (periodics [ev_active (w)]) == (WT)w));*/\n}\n\nvoid noinline\nev_periodic_stop (EV_P_ ev_periodic *w) EV_THROW\n{\n  clear_pending (EV_A_ (W)w);\n  if (expect_false (!ev_is_active (w)))\n    return;\n\n  EV_FREQUENT_CHECK;\n\n  {\n    int active = ev_active (w);\n\n    assert ((\"libev: internal periodic heap corruption\", ANHE_w (periodics [active]) == (WT)w));\n\n    --periodiccnt;\n\n    if (expect_true (active < periodiccnt + HEAP0))\n      {\n        periodics [active] = periodics [periodiccnt + HEAP0];\n        adjustheap (periodics, periodiccnt, active);\n      }\n  }\n\n  ev_stop (EV_A_ (W)w);\n\n  EV_FREQUENT_CHECK;\n}\n\nvoid noinline\nev_periodic_again (EV_P_ ev_periodic *w) EV_THROW\n{\n  /* TODO: use adjustheap and recalculation */\n  ev_periodic_stop (EV_A_ w);\n  ev_periodic_start (EV_A_ w);\n}\n#endif\n\n#ifndef SA_RESTART\n# define SA_RESTART 0\n#endif\n\n#if EV_SIGNAL_ENABLE\n\nvoid noinline\nev_signal_start (EV_P_ ev_signal *w) EV_THROW\n{\n  if (expect_false (ev_is_active (w)))\n    return;\n\n  assert ((\"libev: ev_signal_start called with illegal signal number\", w->signum > 0 && w->signum < EV_NSIG));\n\n#if EV_MULTIPLICITY\n  assert ((\"libev: a signal must not be attached to two different loops\",\n           !signals [w->signum - 1].loop || signals [w->signum - 1].loop == loop));\n\n  signals [w->signum - 1].loop = EV_A;\n  ECB_MEMORY_FENCE_RELEASE;\n#endif\n\n  EV_FREQUENT_CHECK;\n\n#if EV_USE_SIGNALFD\n  if (sigfd == -2)\n    {\n      sigfd = signalfd (-1, &sigfd_set, SFD_NONBLOCK | SFD_CLOEXEC);\n      if (sigfd < 0 && errno == EINVAL)\n        sigfd = signalfd (-1, &sigfd_set, 0); /* retry without flags */\n\n      if (sigfd >= 0)\n        {\n          fd_intern (sigfd); /* doing it twice will not hurt */\n\n          sigemptyset (&sigfd_set);\n\n          ev_io_init (&sigfd_w, sigfdcb, sigfd, EV_READ);\n          ev_set_priority (&sigfd_w, EV_MAXPRI);\n          ev_io_start (EV_A_ &sigfd_w);\n          ev_unref (EV_A); /* signalfd watcher should not keep loop alive */\n        }\n    }\n\n  if (sigfd >= 0)\n    {\n      /* TODO: check .head */\n      sigaddset (&sigfd_set, w->signum);\n      sigprocmask (SIG_BLOCK, &sigfd_set, 0);\n\n      signalfd (sigfd, &sigfd_set, 0);\n    }\n#endif\n\n  ev_start (EV_A_ (W)w, 1);\n  wlist_add (&signals [w->signum - 1].head, (WL)w);\n\n  if (!((WL)w)->next)\n# if EV_USE_SIGNALFD\n    if (sigfd < 0) /*TODO*/\n# endif\n      {\n# ifdef _WIN32\n        evpipe_init (EV_A);\n\n        signal (w->signum, ev_sighandler);\n# else\n        struct sigaction sa;\n\n        evpipe_init (EV_A);\n\n        sa.sa_handler = ev_sighandler;\n        sigfillset (&sa.sa_mask);\n        sa.sa_flags = SA_RESTART; /* if restarting works we save one iteration */\n        sigaction (w->signum, &sa, 0);\n\n        if (origflags & EVFLAG_NOSIGMASK)\n          {\n            sigemptyset (&sa.sa_mask);\n            sigaddset (&sa.sa_mask, w->signum);\n            sigprocmask (SIG_UNBLOCK, &sa.sa_mask, 0);\n          }\n#endif\n      }\n\n  EV_FREQUENT_CHECK;\n}\n\nvoid noinline\nev_signal_stop (EV_P_ ev_signal *w) EV_THROW\n{\n  clear_pending (EV_A_ (W)w);\n  if (expect_false (!ev_is_active (w)))\n    return;\n\n  EV_FREQUENT_CHECK;\n\n  wlist_del (&signals [w->signum - 1].head, (WL)w);\n  ev_stop (EV_A_ (W)w);\n\n  if (!signals [w->signum - 1].head)\n    {\n#if EV_MULTIPLICITY\n      signals [w->signum - 1].loop = 0; /* unattach from signal */\n#endif\n#if EV_USE_SIGNALFD\n      if (sigfd >= 0)\n        {\n          sigset_t ss;\n\n          sigemptyset (&ss);\n          sigaddset (&ss, w->signum);\n          sigdelset (&sigfd_set, w->signum);\n\n          signalfd (sigfd, &sigfd_set, 0);\n          sigprocmask (SIG_UNBLOCK, &ss, 0);\n        }\n      else\n#endif\n        signal (w->signum, SIG_DFL);\n    }\n\n  EV_FREQUENT_CHECK;\n}\n\n#endif\n\n#if EV_CHILD_ENABLE\n\nvoid\nev_child_start (EV_P_ ev_child *w) EV_THROW\n{\n#if EV_MULTIPLICITY\n  assert ((\"libev: child watchers are only supported in the default loop\", loop == ev_default_loop_ptr));\n#endif\n  if (expect_false (ev_is_active (w)))\n    return;\n\n  EV_FREQUENT_CHECK;\n\n  ev_start (EV_A_ (W)w, 1);\n  wlist_add (&childs [w->pid & ((EV_PID_HASHSIZE) - 1)], (WL)w);\n\n  EV_FREQUENT_CHECK;\n}\n\nvoid\nev_child_stop (EV_P_ ev_child *w) EV_THROW\n{\n  clear_pending (EV_A_ (W)w);\n  if (expect_false (!ev_is_active (w)))\n    return;\n\n  EV_FREQUENT_CHECK;\n\n  wlist_del (&childs [w->pid & ((EV_PID_HASHSIZE) - 1)], (WL)w);\n  ev_stop (EV_A_ (W)w);\n\n  EV_FREQUENT_CHECK;\n}\n\n#endif\n\n#if EV_STAT_ENABLE\n\n# ifdef _WIN32\n#  undef lstat\n#  define lstat(a,b) _stati64 (a,b)\n# endif\n\n#define DEF_STAT_INTERVAL  5.0074891\n#define NFS_STAT_INTERVAL 30.1074891 /* for filesystems potentially failing inotify */\n#define MIN_STAT_INTERVAL  0.1074891\n\nstatic void noinline stat_timer_cb (EV_P_ ev_timer *w_, int revents);\n\n#if EV_USE_INOTIFY\n\n/* the * 2 is to allow for alignment padding, which for some reason is >> 8 */\n# define EV_INOTIFY_BUFSIZE (sizeof (struct inotify_event) * 2 + NAME_MAX)\n\nstatic void noinline\ninfy_add (EV_P_ ev_stat *w)\n{\n  w->wd = inotify_add_watch (fs_fd, w->path,\n                             IN_ATTRIB | IN_DELETE_SELF | IN_MOVE_SELF | IN_MODIFY\n                             | IN_CREATE | IN_DELETE | IN_MOVED_FROM | IN_MOVED_TO\n                             | IN_DONT_FOLLOW | IN_MASK_ADD);\n\n  if (w->wd >= 0)\n    {\n      struct statfs sfs;\n\n      /* now local changes will be tracked by inotify, but remote changes won't */\n      /* unless the filesystem is known to be local, we therefore still poll */\n      /* also do poll on <2.6.25, but with normal frequency */\n\n      if (!fs_2625)\n        w->timer.repeat = w->interval ? w->interval : DEF_STAT_INTERVAL;\n      else if (!statfs (w->path, &sfs)\n               && (sfs.f_type == 0x1373 /* devfs */\n                   || sfs.f_type == 0x4006 /* fat */\n                   || sfs.f_type == 0x4d44 /* msdos */\n                   || sfs.f_type == 0xEF53 /* ext2/3 */\n                   || sfs.f_type == 0x72b6 /* jffs2 */\n                   || sfs.f_type == 0x858458f6 /* ramfs */\n                   || sfs.f_type == 0x5346544e /* ntfs */\n                   || sfs.f_type == 0x3153464a /* jfs */\n                   || sfs.f_type == 0x9123683e /* btrfs */\n                   || sfs.f_type == 0x52654973 /* reiser3 */\n                   || sfs.f_type == 0x01021994 /* tmpfs */\n                   || sfs.f_type == 0x58465342 /* xfs */))\n        w->timer.repeat = 0.; /* filesystem is local, kernel new enough */\n      else\n        w->timer.repeat = w->interval ? w->interval : NFS_STAT_INTERVAL; /* remote, use reduced frequency */\n    }\n  else\n    {\n      /* can't use inotify, continue to stat */\n      w->timer.repeat = w->interval ? w->interval : DEF_STAT_INTERVAL;\n\n      /* if path is not there, monitor some parent directory for speedup hints */\n      /* note that exceeding the hardcoded path limit is not a correctness issue, */\n      /* but an efficiency issue only */\n      if ((errno == ENOENT || errno == EACCES) && strlen (w->path) < 4096)\n        {\n          char path [4096];\n          strcpy (path, w->path);\n\n          do\n            {\n              int mask = IN_MASK_ADD | IN_DELETE_SELF | IN_MOVE_SELF\n                       | (errno == EACCES ? IN_ATTRIB : IN_CREATE | IN_MOVED_TO);\n\n              char *pend = strrchr (path, '/');\n\n              if (!pend || pend == path)\n                break;\n\n              *pend = 0;\n              w->wd = inotify_add_watch (fs_fd, path, mask);\n            }\n          while (w->wd < 0 && (errno == ENOENT || errno == EACCES));\n        }\n    }\n\n  if (w->wd >= 0)\n    wlist_add (&fs_hash [w->wd & ((EV_INOTIFY_HASHSIZE) - 1)].head, (WL)w);\n\n  /* now re-arm timer, if required */\n  if (ev_is_active (&w->timer)) ev_ref (EV_A);\n  ev_timer_again (EV_A_ &w->timer);\n  if (ev_is_active (&w->timer)) ev_unref (EV_A);\n}\n\nstatic void noinline\ninfy_del (EV_P_ ev_stat *w)\n{\n  int slot;\n  int wd = w->wd;\n\n  if (wd < 0)\n    return;\n\n  w->wd = -2;\n  slot = wd & ((EV_INOTIFY_HASHSIZE) - 1);\n  wlist_del (&fs_hash [slot].head, (WL)w);\n\n  /* remove this watcher, if others are watching it, they will rearm */\n  inotify_rm_watch (fs_fd, wd);\n}\n\nstatic void noinline\ninfy_wd (EV_P_ int slot, int wd, struct inotify_event *ev)\n{\n  if (slot < 0)\n    /* overflow, need to check for all hash slots */\n    for (slot = 0; slot < (EV_INOTIFY_HASHSIZE); ++slot)\n      infy_wd (EV_A_ slot, wd, ev);\n  else\n    {\n      WL w_;\n\n      for (w_ = fs_hash [slot & ((EV_INOTIFY_HASHSIZE) - 1)].head; w_; )\n        {\n          ev_stat *w = (ev_stat *)w_;\n          w_ = w_->next; /* lets us remove this watcher and all before it */\n\n          if (w->wd == wd || wd == -1)\n            {\n              if (ev->mask & (IN_IGNORED | IN_UNMOUNT | IN_DELETE_SELF))\n                {\n                  wlist_del (&fs_hash [slot & ((EV_INOTIFY_HASHSIZE) - 1)].head, (WL)w);\n                  w->wd = -1;\n                  infy_add (EV_A_ w); /* re-add, no matter what */\n                }\n\n              stat_timer_cb (EV_A_ &w->timer, 0);\n            }\n        }\n    }\n}\n\nstatic void\ninfy_cb (EV_P_ ev_io *w, int revents)\n{\n  char buf [EV_INOTIFY_BUFSIZE];\n  int ofs;\n  int len = read (fs_fd, buf, sizeof (buf));\n\n  for (ofs = 0; ofs < len; )\n    {\n      struct inotify_event *ev = (struct inotify_event *)(buf + ofs);\n      infy_wd (EV_A_ ev->wd, ev->wd, ev);\n      ofs += sizeof (struct inotify_event) + ev->len;\n    }\n}\n\ninline_size void ecb_cold\nev_check_2625 (EV_P)\n{\n  /* kernels < 2.6.25 are borked\n   * http://www.ussg.indiana.edu/hypermail/linux/kernel/0711.3/1208.html\n   */\n  if (ev_linux_version () < 0x020619)\n    return;\n\n  fs_2625 = 1;\n}\n\ninline_size int\ninfy_newfd (void)\n{\n#if defined IN_CLOEXEC && defined IN_NONBLOCK\n  int fd = inotify_init1 (IN_CLOEXEC | IN_NONBLOCK);\n  if (fd >= 0)\n    return fd;\n#endif\n  return inotify_init ();\n}\n\ninline_size void\ninfy_init (EV_P)\n{\n  if (fs_fd != -2)\n    return;\n\n  fs_fd = -1;\n\n  ev_check_2625 (EV_A);\n\n  fs_fd = infy_newfd ();\n\n  if (fs_fd >= 0)\n    {\n      fd_intern (fs_fd);\n      ev_io_init (&fs_w, infy_cb, fs_fd, EV_READ);\n      ev_set_priority (&fs_w, EV_MAXPRI);\n      ev_io_start (EV_A_ &fs_w);\n      ev_unref (EV_A);\n    }\n}\n\ninline_size void\ninfy_fork (EV_P)\n{\n  int slot;\n\n  if (fs_fd < 0)\n    return;\n\n  ev_ref (EV_A);\n  ev_io_stop (EV_A_ &fs_w);\n  close (fs_fd);\n  fs_fd = infy_newfd ();\n\n  if (fs_fd >= 0)\n    {\n      fd_intern (fs_fd);\n      ev_io_set (&fs_w, fs_fd, EV_READ);\n      ev_io_start (EV_A_ &fs_w);\n      ev_unref (EV_A);\n    }\n\n  for (slot = 0; slot < (EV_INOTIFY_HASHSIZE); ++slot)\n    {\n      WL w_ = fs_hash [slot].head;\n      fs_hash [slot].head = 0;\n\n      while (w_)\n        {\n          ev_stat *w = (ev_stat *)w_;\n          w_ = w_->next; /* lets us add this watcher */\n\n          w->wd = -1;\n\n          if (fs_fd >= 0)\n            infy_add (EV_A_ w); /* re-add, no matter what */\n          else\n            {\n              w->timer.repeat = w->interval ? w->interval : DEF_STAT_INTERVAL;\n              if (ev_is_active (&w->timer)) ev_ref (EV_A);\n              ev_timer_again (EV_A_ &w->timer);\n              if (ev_is_active (&w->timer)) ev_unref (EV_A);\n            }\n        }\n    }\n}\n\n#endif\n\n#ifdef _WIN32\n# define EV_LSTAT(p,b) _stati64 (p, b)\n#else\n# define EV_LSTAT(p,b) lstat (p, b)\n#endif\n\nvoid\nev_stat_stat (EV_P_ ev_stat *w) EV_THROW\n{\n  if (lstat (w->path, &w->attr) < 0)\n    w->attr.st_nlink = 0;\n  else if (!w->attr.st_nlink)\n    w->attr.st_nlink = 1;\n}\n\nstatic void noinline\nstat_timer_cb (EV_P_ ev_timer *w_, int revents)\n{\n  ev_stat *w = (ev_stat *)(((char *)w_) - offsetof (ev_stat, timer));\n\n  ev_statdata prev = w->attr;\n  ev_stat_stat (EV_A_ w);\n\n  /* memcmp doesn't work on netbsd, they.... do stuff to their struct stat */\n  if (\n    prev.st_dev      != w->attr.st_dev\n    || prev.st_ino   != w->attr.st_ino\n    || prev.st_mode  != w->attr.st_mode\n    || prev.st_nlink != w->attr.st_nlink\n    || prev.st_uid   != w->attr.st_uid\n    || prev.st_gid   != w->attr.st_gid\n    || prev.st_rdev  != w->attr.st_rdev\n    || prev.st_size  != w->attr.st_size\n    || prev.st_atime != w->attr.st_atime\n    || prev.st_mtime != w->attr.st_mtime\n    || prev.st_ctime != w->attr.st_ctime\n  ) {\n      /* we only update w->prev on actual differences */\n      /* in case we test more often than invoke the callback, */\n      /* to ensure that prev is always different to attr */\n      w->prev = prev;\n\n      #if EV_USE_INOTIFY\n        if (fs_fd >= 0)\n          {\n            infy_del (EV_A_ w);\n            infy_add (EV_A_ w);\n            ev_stat_stat (EV_A_ w); /* avoid race... */\n          }\n      #endif\n\n      ev_feed_event (EV_A_ w, EV_STAT);\n    }\n}\n\nvoid\nev_stat_start (EV_P_ ev_stat *w) EV_THROW\n{\n  if (expect_false (ev_is_active (w)))\n    return;\n\n  ev_stat_stat (EV_A_ w);\n\n  if (w->interval < MIN_STAT_INTERVAL && w->interval)\n    w->interval = MIN_STAT_INTERVAL;\n\n  ev_timer_init (&w->timer, stat_timer_cb, 0., w->interval ? w->interval : DEF_STAT_INTERVAL);\n  ev_set_priority (&w->timer, ev_priority (w));\n\n#if EV_USE_INOTIFY\n  infy_init (EV_A);\n\n  if (fs_fd >= 0)\n    infy_add (EV_A_ w);\n  else\n#endif\n    {\n      ev_timer_again (EV_A_ &w->timer);\n      ev_unref (EV_A);\n    }\n\n  ev_start (EV_A_ (W)w, 1);\n\n  EV_FREQUENT_CHECK;\n}\n\nvoid\nev_stat_stop (EV_P_ ev_stat *w) EV_THROW\n{\n  clear_pending (EV_A_ (W)w);\n  if (expect_false (!ev_is_active (w)))\n    return;\n\n  EV_FREQUENT_CHECK;\n\n#if EV_USE_INOTIFY\n  infy_del (EV_A_ w);\n#endif\n\n  if (ev_is_active (&w->timer))\n    {\n      ev_ref (EV_A);\n      ev_timer_stop (EV_A_ &w->timer);\n    }\n\n  ev_stop (EV_A_ (W)w);\n\n  EV_FREQUENT_CHECK;\n}\n#endif\n\n#if EV_IDLE_ENABLE\nvoid\nev_idle_start (EV_P_ ev_idle *w) EV_THROW\n{\n  if (expect_false (ev_is_active (w)))\n    return;\n\n  pri_adjust (EV_A_ (W)w);\n\n  EV_FREQUENT_CHECK;\n\n  {\n    int active = ++idlecnt [ABSPRI (w)];\n\n    ++idleall;\n    ev_start (EV_A_ (W)w, active);\n\n    array_needsize (ev_idle *, idles [ABSPRI (w)], idlemax [ABSPRI (w)], active, EMPTY2);\n    idles [ABSPRI (w)][active - 1] = w;\n  }\n\n  EV_FREQUENT_CHECK;\n}\n\nvoid\nev_idle_stop (EV_P_ ev_idle *w) EV_THROW\n{\n  clear_pending (EV_A_ (W)w);\n  if (expect_false (!ev_is_active (w)))\n    return;\n\n  EV_FREQUENT_CHECK;\n\n  {\n    int active = ev_active (w);\n\n    idles [ABSPRI (w)][active - 1] = idles [ABSPRI (w)][--idlecnt [ABSPRI (w)]];\n    ev_active (idles [ABSPRI (w)][active - 1]) = active;\n\n    ev_stop (EV_A_ (W)w);\n    --idleall;\n  }\n\n  EV_FREQUENT_CHECK;\n}\n#endif\n\n#if EV_PREPARE_ENABLE\nvoid\nev_prepare_start (EV_P_ ev_prepare *w) EV_THROW\n{\n  if (expect_false (ev_is_active (w)))\n    return;\n\n  EV_FREQUENT_CHECK;\n\n  ev_start (EV_A_ (W)w, ++preparecnt);\n  array_needsize (ev_prepare *, prepares, preparemax, preparecnt, EMPTY2);\n  prepares [preparecnt - 1] = w;\n\n  EV_FREQUENT_CHECK;\n}\n\nvoid\nev_prepare_stop (EV_P_ ev_prepare *w) EV_THROW\n{\n  clear_pending (EV_A_ (W)w);\n  if (expect_false (!ev_is_active (w)))\n    return;\n\n  EV_FREQUENT_CHECK;\n\n  {\n    int active = ev_active (w);\n\n    prepares [active - 1] = prepares [--preparecnt];\n    ev_active (prepares [active - 1]) = active;\n  }\n\n  ev_stop (EV_A_ (W)w);\n\n  EV_FREQUENT_CHECK;\n}\n#endif\n\n#if EV_CHECK_ENABLE\nvoid\nev_check_start (EV_P_ ev_check *w) EV_THROW\n{\n  if (expect_false (ev_is_active (w)))\n    return;\n\n  EV_FREQUENT_CHECK;\n\n  ev_start (EV_A_ (W)w, ++checkcnt);\n  array_needsize (ev_check *, checks, checkmax, checkcnt, EMPTY2);\n  checks [checkcnt - 1] = w;\n\n  EV_FREQUENT_CHECK;\n}\n\nvoid\nev_check_stop (EV_P_ ev_check *w) EV_THROW\n{\n  clear_pending (EV_A_ (W)w);\n  if (expect_false (!ev_is_active (w)))\n    return;\n\n  EV_FREQUENT_CHECK;\n\n  {\n    int active = ev_active (w);\n\n    checks [active - 1] = checks [--checkcnt];\n    ev_active (checks [active - 1]) = active;\n  }\n\n  ev_stop (EV_A_ (W)w);\n\n  EV_FREQUENT_CHECK;\n}\n#endif\n\n#if EV_EMBED_ENABLE\nvoid noinline\nev_embed_sweep (EV_P_ ev_embed *w) EV_THROW\n{\n  ev_run (w->other, EVRUN_NOWAIT);\n}\n\nstatic void\nembed_io_cb (EV_P_ ev_io *io, int revents)\n{\n  ev_embed *w = (ev_embed *)(((char *)io) - offsetof (ev_embed, io));\n\n  if (ev_cb (w))\n    ev_feed_event (EV_A_ (W)w, EV_EMBED);\n  else\n    ev_run (w->other, EVRUN_NOWAIT);\n}\n\nstatic void\nembed_prepare_cb (EV_P_ ev_prepare *prepare, int revents)\n{\n  ev_embed *w = (ev_embed *)(((char *)prepare) - offsetof (ev_embed, prepare));\n\n  {\n    EV_P = w->other;\n\n    while (fdchangecnt)\n      {\n        fd_reify (EV_A);\n        ev_run (EV_A_ EVRUN_NOWAIT);\n      }\n  }\n}\n\nstatic void\nembed_fork_cb (EV_P_ ev_fork *fork_w, int revents)\n{\n  ev_embed *w = (ev_embed *)(((char *)fork_w) - offsetof (ev_embed, fork));\n\n  ev_embed_stop (EV_A_ w);\n\n  {\n    EV_P = w->other;\n\n    ev_loop_fork (EV_A);\n    ev_run (EV_A_ EVRUN_NOWAIT);\n  }\n\n  ev_embed_start (EV_A_ w);\n}\n\n#if 0\nstatic void\nembed_idle_cb (EV_P_ ev_idle *idle, int revents)\n{\n  ev_idle_stop (EV_A_ idle);\n}\n#endif\n\nvoid\nev_embed_start (EV_P_ ev_embed *w) EV_THROW\n{\n  if (expect_false (ev_is_active (w)))\n    return;\n\n  {\n    EV_P = w->other;\n    assert ((\"libev: loop to be embedded is not embeddable\", backend & ev_embeddable_backends ()));\n    ev_io_init (&w->io, embed_io_cb, backend_fd, EV_READ);\n  }\n\n  EV_FREQUENT_CHECK;\n\n  ev_set_priority (&w->io, ev_priority (w));\n  ev_io_start (EV_A_ &w->io);\n\n  ev_prepare_init (&w->prepare, embed_prepare_cb);\n  ev_set_priority (&w->prepare, EV_MINPRI);\n  ev_prepare_start (EV_A_ &w->prepare);\n\n  ev_fork_init (&w->fork, embed_fork_cb);\n  ev_fork_start (EV_A_ &w->fork);\n\n  /*ev_idle_init (&w->idle, e,bed_idle_cb);*/\n\n  ev_start (EV_A_ (W)w, 1);\n\n  EV_FREQUENT_CHECK;\n}\n\nvoid\nev_embed_stop (EV_P_ ev_embed *w) EV_THROW\n{\n  clear_pending (EV_A_ (W)w);\n  if (expect_false (!ev_is_active (w)))\n    return;\n\n  EV_FREQUENT_CHECK;\n\n  ev_io_stop      (EV_A_ &w->io);\n  ev_prepare_stop (EV_A_ &w->prepare);\n  ev_fork_stop    (EV_A_ &w->fork);\n\n  ev_stop (EV_A_ (W)w);\n\n  EV_FREQUENT_CHECK;\n}\n#endif\n\n#if EV_FORK_ENABLE\nvoid\nev_fork_start (EV_P_ ev_fork *w) EV_THROW\n{\n  if (expect_false (ev_is_active (w)))\n    return;\n\n  EV_FREQUENT_CHECK;\n\n  ev_start (EV_A_ (W)w, ++forkcnt);\n  array_needsize (ev_fork *, forks, forkmax, forkcnt, EMPTY2);\n  forks [forkcnt - 1] = w;\n\n  EV_FREQUENT_CHECK;\n}\n\nvoid\nev_fork_stop (EV_P_ ev_fork *w) EV_THROW\n{\n  clear_pending (EV_A_ (W)w);\n  if (expect_false (!ev_is_active (w)))\n    return;\n\n  EV_FREQUENT_CHECK;\n\n  {\n    int active = ev_active (w);\n\n    forks [active - 1] = forks [--forkcnt];\n    ev_active (forks [active - 1]) = active;\n  }\n\n  ev_stop (EV_A_ (W)w);\n\n  EV_FREQUENT_CHECK;\n}\n#endif\n\n#if EV_CLEANUP_ENABLE\nvoid\nev_cleanup_start (EV_P_ ev_cleanup *w) EV_THROW\n{\n  if (expect_false (ev_is_active (w)))\n    return;\n\n  EV_FREQUENT_CHECK;\n\n  ev_start (EV_A_ (W)w, ++cleanupcnt);\n  array_needsize (ev_cleanup *, cleanups, cleanupmax, cleanupcnt, EMPTY2);\n  cleanups [cleanupcnt - 1] = w;\n\n  /* cleanup watchers should never keep a refcount on the loop */\n  ev_unref (EV_A);\n  EV_FREQUENT_CHECK;\n}\n\nvoid\nev_cleanup_stop (EV_P_ ev_cleanup *w) EV_THROW\n{\n  clear_pending (EV_A_ (W)w);\n  if (expect_false (!ev_is_active (w)))\n    return;\n\n  EV_FREQUENT_CHECK;\n  ev_ref (EV_A);\n\n  {\n    int active = ev_active (w);\n\n    cleanups [active - 1] = cleanups [--cleanupcnt];\n    ev_active (cleanups [active - 1]) = active;\n  }\n\n  ev_stop (EV_A_ (W)w);\n\n  EV_FREQUENT_CHECK;\n}\n#endif\n\n#if EV_ASYNC_ENABLE\nvoid\nev_async_start (EV_P_ ev_async *w) EV_THROW\n{\n  if (expect_false (ev_is_active (w)))\n    return;\n\n  w->sent = 0;\n\n  evpipe_init (EV_A);\n\n  EV_FREQUENT_CHECK;\n\n  ev_start (EV_A_ (W)w, ++asynccnt);\n  array_needsize (ev_async *, asyncs, asyncmax, asynccnt, EMPTY2);\n  asyncs [asynccnt - 1] = w;\n\n  EV_FREQUENT_CHECK;\n}\n\nvoid\nev_async_stop (EV_P_ ev_async *w) EV_THROW\n{\n  clear_pending (EV_A_ (W)w);\n  if (expect_false (!ev_is_active (w)))\n    return;\n\n  EV_FREQUENT_CHECK;\n\n  {\n    int active = ev_active (w);\n\n    asyncs [active - 1] = asyncs [--asynccnt];\n    ev_active (asyncs [active - 1]) = active;\n  }\n\n  ev_stop (EV_A_ (W)w);\n\n  EV_FREQUENT_CHECK;\n}\n\nvoid\nev_async_send (EV_P_ ev_async *w) EV_THROW\n{\n  w->sent = 1;\n  evpipe_write (EV_A_ &async_pending);\n}\n#endif\n\n/*****************************************************************************/\n\nstruct ev_once\n{\n  ev_io io;\n  ev_timer to;\n  void (*cb)(int revents, void *arg);\n  void *arg;\n};\n\nstatic void\nonce_cb (EV_P_ struct ev_once *once, int revents)\n{\n  void (*cb)(int revents, void *arg) = once->cb;\n  void *arg = once->arg;\n\n  ev_io_stop    (EV_A_ &once->io);\n  ev_timer_stop (EV_A_ &once->to);\n  ev_free (once);\n\n  cb (revents, arg);\n}\n\nstatic void\nonce_cb_io (EV_P_ ev_io *w, int revents)\n{\n  struct ev_once *once = (struct ev_once *)(((char *)w) - offsetof (struct ev_once, io));\n\n  once_cb (EV_A_ once, revents | ev_clear_pending (EV_A_ &once->to));\n}\n\nstatic void\nonce_cb_to (EV_P_ ev_timer *w, int revents)\n{\n  struct ev_once *once = (struct ev_once *)(((char *)w) - offsetof (struct ev_once, to));\n\n  once_cb (EV_A_ once, revents | ev_clear_pending (EV_A_ &once->io));\n}\n\nvoid\nev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_THROW\n{\n  struct ev_once *once = (struct ev_once *)ev_malloc (sizeof (struct ev_once));\n\n  if (expect_false (!once))\n    {\n      cb (EV_ERROR | EV_READ | EV_WRITE | EV_TIMER, arg);\n      return;\n    }\n\n  once->cb  = cb;\n  once->arg = arg;\n\n  ev_init (&once->io, once_cb_io);\n  if (fd >= 0)\n    {\n      ev_io_set (&once->io, fd, events);\n      ev_io_start (EV_A_ &once->io);\n    }\n\n  ev_init (&once->to, once_cb_to);\n  if (timeout >= 0.)\n    {\n      ev_timer_set (&once->to, timeout, 0.);\n      ev_timer_start (EV_A_ &once->to);\n    }\n}\n\n/*****************************************************************************/\n\n#if EV_WALK_ENABLE\nvoid ecb_cold\nev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_THROW\n{\n  int i, j;\n  ev_watcher_list *wl, *wn;\n\n  if (types & (EV_IO | EV_EMBED))\n    for (i = 0; i < anfdmax; ++i)\n      for (wl = anfds [i].head; wl; )\n        {\n          wn = wl->next;\n\n#if EV_EMBED_ENABLE\n          if (ev_cb ((ev_io *)wl) == embed_io_cb)\n            {\n              if (types & EV_EMBED)\n                cb (EV_A_ EV_EMBED, ((char *)wl) - offsetof (struct ev_embed, io));\n            }\n          else\n#endif\n#if EV_USE_INOTIFY\n          if (ev_cb ((ev_io *)wl) == infy_cb)\n            ;\n          else\n#endif\n          if ((ev_io *)wl != &pipe_w)\n            if (types & EV_IO)\n              cb (EV_A_ EV_IO, wl);\n\n          wl = wn;\n        }\n\n  if (types & (EV_TIMER | EV_STAT))\n    for (i = timercnt + HEAP0; i-- > HEAP0; )\n#if EV_STAT_ENABLE\n      /*TODO: timer is not always active*/\n      if (ev_cb ((ev_timer *)ANHE_w (timers [i])) == stat_timer_cb)\n        {\n          if (types & EV_STAT)\n            cb (EV_A_ EV_STAT, ((char *)ANHE_w (timers [i])) - offsetof (struct ev_stat, timer));\n        }\n      else\n#endif\n      if (types & EV_TIMER)\n        cb (EV_A_ EV_TIMER, ANHE_w (timers [i]));\n\n#if EV_PERIODIC_ENABLE\n  if (types & EV_PERIODIC)\n    for (i = periodiccnt + HEAP0; i-- > HEAP0; )\n      cb (EV_A_ EV_PERIODIC, ANHE_w (periodics [i]));\n#endif\n\n#if EV_IDLE_ENABLE\n  if (types & EV_IDLE)\n    for (j = NUMPRI; j--; )\n      for (i = idlecnt [j]; i--; )\n        cb (EV_A_ EV_IDLE, idles [j][i]);\n#endif\n\n#if EV_FORK_ENABLE\n  if (types & EV_FORK)\n    for (i = forkcnt; i--; )\n      if (ev_cb (forks [i]) != embed_fork_cb)\n        cb (EV_A_ EV_FORK, forks [i]);\n#endif\n\n#if EV_ASYNC_ENABLE\n  if (types & EV_ASYNC)\n    for (i = asynccnt; i--; )\n      cb (EV_A_ EV_ASYNC, asyncs [i]);\n#endif\n\n#if EV_PREPARE_ENABLE\n  if (types & EV_PREPARE)\n    for (i = preparecnt; i--; )\n# if EV_EMBED_ENABLE\n      if (ev_cb (prepares [i]) != embed_prepare_cb)\n# endif\n        cb (EV_A_ EV_PREPARE, prepares [i]);\n#endif\n\n#if EV_CHECK_ENABLE\n  if (types & EV_CHECK)\n    for (i = checkcnt; i--; )\n      cb (EV_A_ EV_CHECK, checks [i]);\n#endif\n\n#if EV_SIGNAL_ENABLE\n  if (types & EV_SIGNAL)\n    for (i = 0; i < EV_NSIG - 1; ++i)\n      for (wl = signals [i].head; wl; )\n        {\n          wn = wl->next;\n          cb (EV_A_ EV_SIGNAL, wl);\n          wl = wn;\n        }\n#endif\n\n#if EV_CHILD_ENABLE\n  if (types & EV_CHILD)\n    for (i = (EV_PID_HASHSIZE); i--; )\n      for (wl = childs [i]; wl; )\n        {\n          wn = wl->next;\n          cb (EV_A_ EV_CHILD, wl);\n          wl = wn;\n        }\n#endif\n/* EV_STAT     0x00001000 /* stat data changed */\n/* EV_EMBED    0x00010000 /* embedded event loop needs sweep */\n}\n#endif\n\n#if EV_MULTIPLICITY\n  #include \"ev_wrap.h\"\n#endif\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/ev.h",
    "content": "/*\n * libev native API header\n *\n * Copyright (c) 2007,2008,2009,2010,2011,2012,2015 Marc Alexander Lehmann <libev@schmorp.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modifica-\n * tion, are permitted provided that the following conditions are met:\n *\n *   1.  Redistributions of source code must retain the above copyright notice,\n *       this list of conditions and the following disclaimer.\n *\n *   2.  Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-\n * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-\n * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-\n * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Alternatively, the contents of this file may be used under the terms of\n * the GNU General Public License (\"GPL\") version 2 or any later version,\n * in which case the provisions of the GPL are applicable instead of\n * the above. If you wish to allow the use of your version of this file\n * only under the terms of the GPL and not to allow others to use your\n * version of this file under the BSD license, indicate your decision\n * by deleting the provisions above and replace them with the notice\n * and other provisions required by the GPL. If you do not delete the\n * provisions above, a recipient may use your version of this file under\n * either the BSD or the GPL.\n */\n\n#ifndef EV_H_\n#define EV_H_\n\n#ifdef __cplusplus\n# define EV_CPP(x) x\n# if __cplusplus >= 201103L\n#  define EV_THROW noexcept\n# else\n#  define EV_THROW throw ()\n# endif\n#else\n# define EV_CPP(x)\n# define EV_THROW\n#endif\n\nEV_CPP(extern \"C\" {)\n\n/*****************************************************************************/\n\n/* pre-4.0 compatibility */\n#ifndef EV_COMPAT3\n# define EV_COMPAT3 1\n#endif\n\n#ifndef EV_FEATURES\n# if defined __OPTIMIZE_SIZE__\n#  define EV_FEATURES 0x7c\n# else\n#  define EV_FEATURES 0x7f\n# endif\n#endif\n\n#define EV_FEATURE_CODE     ((EV_FEATURES) &  1)\n#define EV_FEATURE_DATA     ((EV_FEATURES) &  2)\n#define EV_FEATURE_CONFIG   ((EV_FEATURES) &  4)\n#define EV_FEATURE_API      ((EV_FEATURES) &  8)\n#define EV_FEATURE_WATCHERS ((EV_FEATURES) & 16)\n#define EV_FEATURE_BACKENDS ((EV_FEATURES) & 32)\n#define EV_FEATURE_OS       ((EV_FEATURES) & 64)\n\n/* these priorities are inclusive, higher priorities will be invoked earlier */\n#ifndef EV_MINPRI\n# define EV_MINPRI (EV_FEATURE_CONFIG ? -2 : 0)\n#endif\n#ifndef EV_MAXPRI\n# define EV_MAXPRI (EV_FEATURE_CONFIG ? +2 : 0)\n#endif\n\n#ifndef EV_MULTIPLICITY\n# define EV_MULTIPLICITY EV_FEATURE_CONFIG\n#endif\n\n#ifndef EV_PERIODIC_ENABLE\n# define EV_PERIODIC_ENABLE EV_FEATURE_WATCHERS\n#endif\n\n#ifndef EV_STAT_ENABLE\n# define EV_STAT_ENABLE EV_FEATURE_WATCHERS\n#endif\n\n#ifndef EV_PREPARE_ENABLE\n# define EV_PREPARE_ENABLE EV_FEATURE_WATCHERS\n#endif\n\n#ifndef EV_CHECK_ENABLE\n# define EV_CHECK_ENABLE EV_FEATURE_WATCHERS\n#endif\n\n#ifndef EV_IDLE_ENABLE\n# define EV_IDLE_ENABLE EV_FEATURE_WATCHERS\n#endif\n\n#ifndef EV_FORK_ENABLE\n# define EV_FORK_ENABLE EV_FEATURE_WATCHERS\n#endif\n\n#ifndef EV_CLEANUP_ENABLE\n# define EV_CLEANUP_ENABLE EV_FEATURE_WATCHERS\n#endif\n\n#ifndef EV_SIGNAL_ENABLE\n# define EV_SIGNAL_ENABLE EV_FEATURE_WATCHERS\n#endif\n\n#ifndef EV_CHILD_ENABLE\n# ifdef _WIN32\n#  define EV_CHILD_ENABLE 0\n# else\n#  define EV_CHILD_ENABLE EV_FEATURE_WATCHERS\n#endif\n#endif\n\n#ifndef EV_ASYNC_ENABLE\n# define EV_ASYNC_ENABLE EV_FEATURE_WATCHERS\n#endif\n\n#ifndef EV_EMBED_ENABLE\n# define EV_EMBED_ENABLE EV_FEATURE_WATCHERS\n#endif\n\n#ifndef EV_WALK_ENABLE\n# define EV_WALK_ENABLE 0 /* not yet */\n#endif\n\n/*****************************************************************************/\n\n#if EV_CHILD_ENABLE && !EV_SIGNAL_ENABLE\n# undef EV_SIGNAL_ENABLE\n# define EV_SIGNAL_ENABLE 1\n#endif\n\n/*****************************************************************************/\n\ntypedef double ev_tstamp;\n\n#include <string.h> /* for memmove */\n\n#ifndef EV_ATOMIC_T\n# include <signal.h>\n# define EV_ATOMIC_T sig_atomic_t volatile\n#endif\n\n#if EV_STAT_ENABLE\n# ifdef _WIN32\n#  include <time.h>\n#  include <sys/types.h>\n# endif\n# include <sys/stat.h>\n#endif\n\n/* support multiple event loops? */\n#if EV_MULTIPLICITY\nstruct ev_loop;\n# define EV_P  struct ev_loop *loop               /* a loop as sole parameter in a declaration */\n# define EV_P_ EV_P,                              /* a loop as first of multiple parameters */\n# define EV_A  loop                               /* a loop as sole argument to a function call */\n# define EV_A_ EV_A,                              /* a loop as first of multiple arguments */\n# define EV_DEFAULT_UC  ev_default_loop_uc_ ()    /* the default loop, if initialised, as sole arg */\n# define EV_DEFAULT_UC_ EV_DEFAULT_UC,            /* the default loop as first of multiple arguments */\n# define EV_DEFAULT  ev_default_loop (0)          /* the default loop as sole arg */\n# define EV_DEFAULT_ EV_DEFAULT,                  /* the default loop as first of multiple arguments */\n#else\n# define EV_P void\n# define EV_P_\n# define EV_A\n# define EV_A_\n# define EV_DEFAULT\n# define EV_DEFAULT_\n# define EV_DEFAULT_UC\n# define EV_DEFAULT_UC_\n# undef EV_EMBED_ENABLE\n#endif\n\n/* EV_INLINE is used for functions in header files */\n#if __STDC_VERSION__ >= 199901L || __GNUC__ >= 3\n# define EV_INLINE static inline\n#else\n# define EV_INLINE static\n#endif\n\n#ifdef EV_API_STATIC\n# define EV_API_DECL static\n#else\n# define EV_API_DECL extern\n#endif\n\n/* EV_PROTOTYPES can be used to switch of prototype declarations */\n#ifndef EV_PROTOTYPES\n# define EV_PROTOTYPES 1\n#endif\n\n/*****************************************************************************/\n\n#define EV_VERSION_MAJOR 4\n#define EV_VERSION_MINOR 22\n\n/* eventmask, revents, events... */\nenum {\n  EV_UNDEF    = (int)0xFFFFFFFF, /* guaranteed to be invalid */\n  EV_NONE     =            0x00, /* no events */\n  EV_READ     =            0x01, /* ev_io detected read will not block */\n  EV_WRITE    =            0x02, /* ev_io detected write will not block */\n  EV__IOFDSET =            0x80, /* internal use only */\n  EV_IO       =         EV_READ, /* alias for type-detection */\n  EV_TIMER    =      0x00000100, /* timer timed out */\n#if EV_COMPAT3\n  EV_TIMEOUT  =        EV_TIMER, /* pre 4.0 API compatibility */\n#endif\n  EV_PERIODIC =      0x00000200, /* periodic timer timed out */\n  EV_SIGNAL   =      0x00000400, /* signal was received */\n  EV_CHILD    =      0x00000800, /* child/pid had status change */\n  EV_STAT     =      0x00001000, /* stat data changed */\n  EV_IDLE     =      0x00002000, /* event loop is idling */\n  EV_PREPARE  =      0x00004000, /* event loop about to poll */\n  EV_CHECK    =      0x00008000, /* event loop finished poll */\n  EV_EMBED    =      0x00010000, /* embedded event loop needs sweep */\n  EV_FORK     =      0x00020000, /* event loop resumed in child */\n  EV_CLEANUP  =      0x00040000, /* event loop resumed in child */\n  EV_ASYNC    =      0x00080000, /* async intra-loop signal */\n  EV_CUSTOM   =      0x01000000, /* for use by user code */\n  EV_ERROR    = (int)0x80000000  /* sent when an error occurs */\n};\n\n/* can be used to add custom fields to all watchers, while losing binary compatibility */\n#ifndef EV_COMMON\n# define EV_COMMON void *data;\n#endif\n\n#ifndef EV_CB_DECLARE\n# define EV_CB_DECLARE(type) void (*cb)(EV_P_ struct type *w, int revents);\n#endif\n#ifndef EV_CB_INVOKE\n# define EV_CB_INVOKE(watcher,revents) (watcher)->cb (EV_A_ (watcher), (revents))\n#endif\n\n/* not official, do not use */\n#define EV_CB(type,name) void name (EV_P_ struct ev_ ## type *w, int revents)\n\n/*\n * struct member types:\n * private: you may look at them, but not change them,\n *          and they might not mean anything to you.\n * ro: can be read anytime, but only changed when the watcher isn't active.\n * rw: can be read and modified anytime, even when the watcher is active.\n *\n * some internal details that might be helpful for debugging:\n *\n * active is either 0, which means the watcher is not active,\n *           or the array index of the watcher (periodics, timers)\n *           or the array index + 1 (most other watchers)\n *           or simply 1 for watchers that aren't in some array.\n * pending is either 0, in which case the watcher isn't,\n *           or the array index + 1 in the pendings array.\n */\n\n#if EV_MINPRI == EV_MAXPRI\n# define EV_DECL_PRIORITY\n#elif !defined (EV_DECL_PRIORITY)\n# define EV_DECL_PRIORITY int priority;\n#endif\n\n/* shared by all watchers */\n#define EV_WATCHER(type)\t\t\t\\\n  int active; /* private */\t\t\t\\\n  int pending; /* private */\t\t\t\\\n  EV_DECL_PRIORITY /* private */\t\t\\\n  EV_COMMON /* rw */\t\t\t\t\\\n  EV_CB_DECLARE (type) /* private */\n\n#define EV_WATCHER_LIST(type)\t\t\t\\\n  EV_WATCHER (type)\t\t\t\t\\\n  struct ev_watcher_list *next; /* private */\n\n#define EV_WATCHER_TIME(type)\t\t\t\\\n  EV_WATCHER (type)\t\t\t\t\\\n  ev_tstamp at;     /* private */\n\n/* base class, nothing to see here unless you subclass */\ntypedef struct ev_watcher\n{\n  EV_WATCHER (ev_watcher)\n} ev_watcher;\n\n/* base class, nothing to see here unless you subclass */\ntypedef struct ev_watcher_list\n{\n  EV_WATCHER_LIST (ev_watcher_list)\n} ev_watcher_list;\n\n/* base class, nothing to see here unless you subclass */\ntypedef struct ev_watcher_time\n{\n  EV_WATCHER_TIME (ev_watcher_time)\n} ev_watcher_time;\n\n/* invoked when fd is either EV_READable or EV_WRITEable */\n/* revent EV_READ, EV_WRITE */\ntypedef struct ev_io\n{\n  EV_WATCHER_LIST (ev_io)\n\n  int fd;     /* ro */\n  int events; /* ro */\n} ev_io;\n\n/* invoked after a specific time, repeatable (based on monotonic clock) */\n/* revent EV_TIMEOUT */\ntypedef struct ev_timer\n{\n  EV_WATCHER_TIME (ev_timer)\n\n  ev_tstamp repeat; /* rw */\n} ev_timer;\n\n/* invoked at some specific time, possibly repeating at regular intervals (based on UTC) */\n/* revent EV_PERIODIC */\ntypedef struct ev_periodic\n{\n  EV_WATCHER_TIME (ev_periodic)\n\n  ev_tstamp offset; /* rw */\n  ev_tstamp interval; /* rw */\n  ev_tstamp (*reschedule_cb)(struct ev_periodic *w, ev_tstamp now) EV_THROW; /* rw */\n} ev_periodic;\n\n/* invoked when the given signal has been received */\n/* revent EV_SIGNAL */\ntypedef struct ev_signal\n{\n  EV_WATCHER_LIST (ev_signal)\n\n  int signum; /* ro */\n} ev_signal;\n\n/* invoked when sigchld is received and waitpid indicates the given pid */\n/* revent EV_CHILD */\n/* does not support priorities */\ntypedef struct ev_child\n{\n  EV_WATCHER_LIST (ev_child)\n\n  int flags;   /* private */\n  int pid;     /* ro */\n  int rpid;    /* rw, holds the received pid */\n  int rstatus; /* rw, holds the exit status, use the macros from sys/wait.h */\n} ev_child;\n\n#if EV_STAT_ENABLE\n/* st_nlink = 0 means missing file or other error */\n# ifdef _WIN32\ntypedef struct _stati64 ev_statdata;\n# else\ntypedef struct stat ev_statdata;\n# endif\n\n/* invoked each time the stat data changes for a given path */\n/* revent EV_STAT */\ntypedef struct ev_stat\n{\n  EV_WATCHER_LIST (ev_stat)\n\n  ev_timer timer;     /* private */\n  ev_tstamp interval; /* ro */\n  const char *path;   /* ro */\n  ev_statdata prev;   /* ro */\n  ev_statdata attr;   /* ro */\n\n  int wd; /* wd for inotify, fd for kqueue */\n} ev_stat;\n#endif\n\n#if EV_IDLE_ENABLE\n/* invoked when the nothing else needs to be done, keeps the process from blocking */\n/* revent EV_IDLE */\ntypedef struct ev_idle\n{\n  EV_WATCHER (ev_idle)\n} ev_idle;\n#endif\n\n/* invoked for each run of the mainloop, just before the blocking call */\n/* you can still change events in any way you like */\n/* revent EV_PREPARE */\ntypedef struct ev_prepare\n{\n  EV_WATCHER (ev_prepare)\n} ev_prepare;\n\n/* invoked for each run of the mainloop, just after the blocking call */\n/* revent EV_CHECK */\ntypedef struct ev_check\n{\n  EV_WATCHER (ev_check)\n} ev_check;\n\n#if EV_FORK_ENABLE\n/* the callback gets invoked before check in the child process when a fork was detected */\n/* revent EV_FORK */\ntypedef struct ev_fork\n{\n  EV_WATCHER (ev_fork)\n} ev_fork;\n#endif\n\n#if EV_CLEANUP_ENABLE\n/* is invoked just before the loop gets destroyed */\n/* revent EV_CLEANUP */\ntypedef struct ev_cleanup\n{\n  EV_WATCHER (ev_cleanup)\n} ev_cleanup;\n#endif\n\n#if EV_EMBED_ENABLE\n/* used to embed an event loop inside another */\n/* the callback gets invoked when the event loop has handled events, and can be 0 */\ntypedef struct ev_embed\n{\n  EV_WATCHER (ev_embed)\n\n  struct ev_loop *other; /* ro */\n  ev_io io;              /* private */\n  ev_prepare prepare;    /* private */\n  ev_check check;        /* unused */\n  ev_timer timer;        /* unused */\n  ev_periodic periodic;  /* unused */\n  ev_idle idle;          /* unused */\n  ev_fork fork;          /* private */\n#if EV_CLEANUP_ENABLE\n  ev_cleanup cleanup;    /* unused */\n#endif\n} ev_embed;\n#endif\n\n#if EV_ASYNC_ENABLE\n/* invoked when somebody calls ev_async_send on the watcher */\n/* revent EV_ASYNC */\ntypedef struct ev_async\n{\n  EV_WATCHER (ev_async)\n\n  EV_ATOMIC_T sent; /* private */\n} ev_async;\n\n# define ev_async_pending(w) (+(w)->sent)\n#endif\n\n/* the presence of this union forces similar struct layout */\nunion ev_any_watcher\n{\n  struct ev_watcher w;\n  struct ev_watcher_list wl;\n\n  struct ev_io io;\n  struct ev_timer timer;\n  struct ev_periodic periodic;\n  struct ev_signal signal;\n  struct ev_child child;\n#if EV_STAT_ENABLE\n  struct ev_stat stat;\n#endif\n#if EV_IDLE_ENABLE\n  struct ev_idle idle;\n#endif\n  struct ev_prepare prepare;\n  struct ev_check check;\n#if EV_FORK_ENABLE\n  struct ev_fork fork;\n#endif\n#if EV_CLEANUP_ENABLE\n  struct ev_cleanup cleanup;\n#endif\n#if EV_EMBED_ENABLE\n  struct ev_embed embed;\n#endif\n#if EV_ASYNC_ENABLE\n  struct ev_async async;\n#endif\n};\n\n/* flag bits for ev_default_loop and ev_loop_new */\nenum {\n  /* the default */\n  EVFLAG_AUTO      = 0x00000000U, /* not quite a mask */\n  /* flag bits */\n  EVFLAG_NOENV     = 0x01000000U, /* do NOT consult environment */\n  EVFLAG_FORKCHECK = 0x02000000U, /* check for a fork in each iteration */\n  /* debugging/feature disable */\n  EVFLAG_NOINOTIFY = 0x00100000U, /* do not attempt to use inotify */\n#if EV_COMPAT3\n  EVFLAG_NOSIGFD   = 0, /* compatibility to pre-3.9 */\n#endif\n  EVFLAG_SIGNALFD  = 0x00200000U, /* attempt to use signalfd */\n  EVFLAG_NOSIGMASK = 0x00400000U  /* avoid modifying the signal mask */\n};\n\n/* method bits to be ored together */\nenum {\n  EVBACKEND_SELECT  = 0x00000001U, /* about anywhere */\n  EVBACKEND_POLL    = 0x00000002U, /* !win */\n  EVBACKEND_EPOLL   = 0x00000004U, /* linux */\n  EVBACKEND_KQUEUE  = 0x00000008U, /* bsd */\n  EVBACKEND_DEVPOLL = 0x00000010U, /* solaris 8 */ /* NYI */\n  EVBACKEND_PORT    = 0x00000020U, /* solaris 10 */\n  EVBACKEND_ALL     = 0x0000003FU, /* all known backends */\n  EVBACKEND_MASK    = 0x0000FFFFU  /* all future backends */\n};\n\n#if EV_PROTOTYPES\nEV_API_DECL int ev_version_major (void) EV_THROW;\nEV_API_DECL int ev_version_minor (void) EV_THROW;\n\nEV_API_DECL unsigned int ev_supported_backends (void) EV_THROW;\nEV_API_DECL unsigned int ev_recommended_backends (void) EV_THROW;\nEV_API_DECL unsigned int ev_embeddable_backends (void) EV_THROW;\n\nEV_API_DECL ev_tstamp ev_time (void) EV_THROW;\nEV_API_DECL void ev_sleep (ev_tstamp delay) EV_THROW; /* sleep for a while */\n\n/* Sets the allocation function to use, works like realloc.\n * It is used to allocate and free memory.\n * If it returns zero when memory needs to be allocated, the library might abort\n * or take some potentially destructive action.\n * The default is your system realloc function.\n */\nEV_API_DECL void ev_set_allocator (void *(*cb)(void *ptr, long size) EV_THROW) EV_THROW;\n\n/* set the callback function to call on a\n * retryable syscall error\n * (such as failed select, poll, epoll_wait)\n */\nEV_API_DECL void ev_set_syserr_cb (void (*cb)(const char *msg) EV_THROW) EV_THROW;\n\n#if EV_MULTIPLICITY\n\n/* the default loop is the only one that handles signals and child watchers */\n/* you can call this as often as you like */\nEV_API_DECL struct ev_loop *ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_THROW;\n\n#ifdef EV_API_STATIC\nEV_API_DECL struct ev_loop *ev_default_loop_ptr;\n#endif\n\nEV_INLINE struct ev_loop *\nev_default_loop_uc_ (void) EV_THROW\n{\n  extern struct ev_loop *ev_default_loop_ptr;\n\n  return ev_default_loop_ptr;\n}\n\nEV_INLINE int\nev_is_default_loop (EV_P) EV_THROW\n{\n  return EV_A == EV_DEFAULT_UC;\n}\n\n/* create and destroy alternative loops that don't handle signals */\nEV_API_DECL struct ev_loop *ev_loop_new (unsigned int flags EV_CPP (= 0)) EV_THROW;\n\nEV_API_DECL ev_tstamp ev_now (EV_P) EV_THROW; /* time w.r.t. timers and the eventloop, updated after each poll */\n\n#else\n\nEV_API_DECL int ev_default_loop (unsigned int flags EV_CPP (= 0)) EV_THROW; /* returns true when successful */\n\nEV_API_DECL ev_tstamp ev_rt_now;\n\nEV_INLINE ev_tstamp\nev_now (void) EV_THROW\n{\n  return ev_rt_now;\n}\n\n/* looks weird, but ev_is_default_loop (EV_A) still works if this exists */\nEV_INLINE int\nev_is_default_loop (void) EV_THROW\n{\n  return 1;\n}\n\n#endif /* multiplicity */\n\n/* destroy event loops, also works for the default loop */\nEV_API_DECL void ev_loop_destroy (EV_P);\n\n/* this needs to be called after fork, to duplicate the loop */\n/* when you want to re-use it in the child */\n/* you can call it in either the parent or the child */\n/* you can actually call it at any time, anywhere :) */\nEV_API_DECL void ev_loop_fork (EV_P) EV_THROW;\n\nEV_API_DECL unsigned int ev_backend (EV_P) EV_THROW; /* backend in use by loop */\n\nEV_API_DECL void ev_now_update (EV_P) EV_THROW; /* update event loop time */\n\n#if EV_WALK_ENABLE\n/* walk (almost) all watchers in the loop of a given type, invoking the */\n/* callback on every such watcher. The callback might stop the watcher, */\n/* but do nothing else with the loop */\nEV_API_DECL void ev_walk (EV_P_ int types, void (*cb)(EV_P_ int type, void *w)) EV_THROW;\n#endif\n\n#endif /* prototypes */\n\n/* ev_run flags values */\nenum {\n  EVRUN_NOWAIT = 1, /* do not block/wait */\n  EVRUN_ONCE   = 2  /* block *once* only */\n};\n\n/* ev_break how values */\nenum {\n  EVBREAK_CANCEL = 0, /* undo unloop */\n  EVBREAK_ONE    = 1, /* unloop once */\n  EVBREAK_ALL    = 2  /* unloop all loops */\n};\n\n#if EV_PROTOTYPES\nEV_API_DECL int  ev_run (EV_P_ int flags EV_CPP (= 0));\nEV_API_DECL void ev_break (EV_P_ int how EV_CPP (= EVBREAK_ONE)) EV_THROW; /* break out of the loop */\n\n/*\n * ref/unref can be used to add or remove a refcount on the mainloop. every watcher\n * keeps one reference. if you have a long-running watcher you never unregister that\n * should not keep ev_loop from running, unref() after starting, and ref() before stopping.\n */\nEV_API_DECL void ev_ref   (EV_P) EV_THROW;\nEV_API_DECL void ev_unref (EV_P) EV_THROW;\n\n/*\n * convenience function, wait for a single event, without registering an event watcher\n * if timeout is < 0, do wait indefinitely\n */\nEV_API_DECL void ev_once (EV_P_ int fd, int events, ev_tstamp timeout, void (*cb)(int revents, void *arg), void *arg) EV_THROW;\n\n# if EV_FEATURE_API\nEV_API_DECL unsigned int ev_iteration (EV_P) EV_THROW; /* number of loop iterations */\nEV_API_DECL unsigned int ev_depth     (EV_P) EV_THROW; /* #ev_loop enters - #ev_loop leaves */\nEV_API_DECL void         ev_verify    (EV_P) EV_THROW; /* abort if loop data corrupted */\n\nEV_API_DECL void ev_set_io_collect_interval (EV_P_ ev_tstamp interval) EV_THROW; /* sleep at least this time, default 0 */\nEV_API_DECL void ev_set_timeout_collect_interval (EV_P_ ev_tstamp interval) EV_THROW; /* sleep at least this time, default 0 */\n\n/* advanced stuff for threading etc. support, see docs */\nEV_API_DECL void ev_set_userdata (EV_P_ void *data) EV_THROW;\nEV_API_DECL void *ev_userdata (EV_P) EV_THROW;\ntypedef void (*ev_loop_callback)(EV_P);\nEV_API_DECL void ev_set_invoke_pending_cb (EV_P_ ev_loop_callback invoke_pending_cb) EV_THROW;\n/* C++ doesn't allow the use of the ev_loop_callback typedef here, so we need to spell it out */\nEV_API_DECL void ev_set_loop_release_cb (EV_P_ void (*release)(EV_P) EV_THROW, void (*acquire)(EV_P) EV_THROW) EV_THROW;\n\nEV_API_DECL unsigned int ev_pending_count (EV_P) EV_THROW; /* number of pending events, if any */\nEV_API_DECL void ev_invoke_pending (EV_P); /* invoke all pending watchers */\n\n/*\n * stop/start the timer handling.\n */\nEV_API_DECL void ev_suspend (EV_P) EV_THROW;\nEV_API_DECL void ev_resume  (EV_P) EV_THROW;\n#endif\n\n#endif\n\n/* these may evaluate ev multiple times, and the other arguments at most once */\n/* either use ev_init + ev_TYPE_set, or the ev_TYPE_init macro, below, to first initialise a watcher */\n#define ev_init(ev,cb_) do {\t\t\t\\\n  ((ev_watcher *)(void *)(ev))->active  =\t\\\n  ((ev_watcher *)(void *)(ev))->pending = 0;\t\\\n  ev_set_priority ((ev), 0);\t\t\t\\\n  ev_set_cb ((ev), cb_);\t\t\t\\\n} while (0)\n\n#define ev_io_set(ev,fd_,events_)            do { (ev)->fd = (fd_); (ev)->events = (events_) | EV__IOFDSET; } while (0)\n#define ev_timer_set(ev,after_,repeat_)      do { ((ev_watcher_time *)(ev))->at = (after_); (ev)->repeat = (repeat_); } while (0)\n#define ev_periodic_set(ev,ofs_,ival_,rcb_)  do { (ev)->offset = (ofs_); (ev)->interval = (ival_); (ev)->reschedule_cb = (rcb_); } while (0)\n#define ev_signal_set(ev,signum_)            do { (ev)->signum = (signum_); } while (0)\n#define ev_child_set(ev,pid_,trace_)         do { (ev)->pid = (pid_); (ev)->flags = !!(trace_); } while (0)\n#define ev_stat_set(ev,path_,interval_)      do { (ev)->path = (path_); (ev)->interval = (interval_); (ev)->wd = -2; } while (0)\n#define ev_idle_set(ev)                      /* nop, yes, this is a serious in-joke */\n#define ev_prepare_set(ev)                   /* nop, yes, this is a serious in-joke */\n#define ev_check_set(ev)                     /* nop, yes, this is a serious in-joke */\n#define ev_embed_set(ev,other_)              do { (ev)->other = (other_); } while (0)\n#define ev_fork_set(ev)                      /* nop, yes, this is a serious in-joke */\n#define ev_cleanup_set(ev)                   /* nop, yes, this is a serious in-joke */\n#define ev_async_set(ev)                     /* nop, yes, this is a serious in-joke */\n\n#define ev_io_init(ev,cb,fd,events)          do { ev_init ((ev), (cb)); ev_io_set ((ev),(fd),(events)); } while (0)\n#define ev_timer_init(ev,cb,after,repeat)    do { ev_init ((ev), (cb)); ev_timer_set ((ev),(after),(repeat)); } while (0)\n#define ev_periodic_init(ev,cb,ofs,ival,rcb) do { ev_init ((ev), (cb)); ev_periodic_set ((ev),(ofs),(ival),(rcb)); } while (0)\n#define ev_signal_init(ev,cb,signum)         do { ev_init ((ev), (cb)); ev_signal_set ((ev), (signum)); } while (0)\n#define ev_child_init(ev,cb,pid,trace)       do { ev_init ((ev), (cb)); ev_child_set ((ev),(pid),(trace)); } while (0)\n#define ev_stat_init(ev,cb,path,interval)    do { ev_init ((ev), (cb)); ev_stat_set ((ev),(path),(interval)); } while (0)\n#define ev_idle_init(ev,cb)                  do { ev_init ((ev), (cb)); ev_idle_set ((ev)); } while (0)\n#define ev_prepare_init(ev,cb)               do { ev_init ((ev), (cb)); ev_prepare_set ((ev)); } while (0)\n#define ev_check_init(ev,cb)                 do { ev_init ((ev), (cb)); ev_check_set ((ev)); } while (0)\n#define ev_embed_init(ev,cb,other)           do { ev_init ((ev), (cb)); ev_embed_set ((ev),(other)); } while (0)\n#define ev_fork_init(ev,cb)                  do { ev_init ((ev), (cb)); ev_fork_set ((ev)); } while (0)\n#define ev_cleanup_init(ev,cb)               do { ev_init ((ev), (cb)); ev_cleanup_set ((ev)); } while (0)\n#define ev_async_init(ev,cb)                 do { ev_init ((ev), (cb)); ev_async_set ((ev)); } while (0)\n\n#define ev_is_pending(ev)                    (0 + ((ev_watcher *)(void *)(ev))->pending) /* ro, true when watcher is waiting for callback invocation */\n#define ev_is_active(ev)                     (0 + ((ev_watcher *)(void *)(ev))->active) /* ro, true when the watcher has been started */\n\n#define ev_cb_(ev)                           (ev)->cb /* rw */\n#define ev_cb(ev)                            (memmove (&ev_cb_ (ev), &((ev_watcher *)(ev))->cb, sizeof (ev_cb_ (ev))), (ev)->cb)\n\n#if EV_MINPRI == EV_MAXPRI\n# define ev_priority(ev)                     ((ev), EV_MINPRI)\n# define ev_set_priority(ev,pri)             ((ev), (pri))\n#else\n# define ev_priority(ev)                     (+(((ev_watcher *)(void *)(ev))->priority))\n# define ev_set_priority(ev,pri)             (   (ev_watcher *)(void *)(ev))->priority = (pri)\n#endif\n\n#define ev_periodic_at(ev)                   (+((ev_watcher_time *)(ev))->at)\n\n#ifndef ev_set_cb\n# define ev_set_cb(ev,cb_)                   (ev_cb_ (ev) = (cb_), memmove (&((ev_watcher *)(ev))->cb, &ev_cb_ (ev), sizeof (ev_cb_ (ev))))\n#endif\n\n/* stopping (enabling, adding) a watcher does nothing if it is already running */\n/* stopping (disabling, deleting) a watcher does nothing unless it's already running */\n#if EV_PROTOTYPES\n\n/* feeds an event into a watcher as if the event actually occurred */\n/* accepts any ev_watcher type */\nEV_API_DECL void ev_feed_event     (EV_P_ void *w, int revents) EV_THROW;\nEV_API_DECL void ev_feed_fd_event  (EV_P_ int fd, int revents) EV_THROW;\n#if EV_SIGNAL_ENABLE\nEV_API_DECL void ev_feed_signal    (int signum) EV_THROW;\nEV_API_DECL void ev_feed_signal_event (EV_P_ int signum) EV_THROW;\n#endif\nEV_API_DECL void ev_invoke         (EV_P_ void *w, int revents);\nEV_API_DECL int  ev_clear_pending  (EV_P_ void *w) EV_THROW;\n\nEV_API_DECL void ev_io_start       (EV_P_ ev_io *w) EV_THROW;\nEV_API_DECL void ev_io_stop        (EV_P_ ev_io *w) EV_THROW;\n\nEV_API_DECL void ev_timer_start    (EV_P_ ev_timer *w) EV_THROW;\nEV_API_DECL void ev_timer_stop     (EV_P_ ev_timer *w) EV_THROW;\n/* stops if active and no repeat, restarts if active and repeating, starts if inactive and repeating */\nEV_API_DECL void ev_timer_again    (EV_P_ ev_timer *w) EV_THROW;\n/* return remaining time */\nEV_API_DECL ev_tstamp ev_timer_remaining (EV_P_ ev_timer *w) EV_THROW;\n\n#if EV_PERIODIC_ENABLE\nEV_API_DECL void ev_periodic_start (EV_P_ ev_periodic *w) EV_THROW;\nEV_API_DECL void ev_periodic_stop  (EV_P_ ev_periodic *w) EV_THROW;\nEV_API_DECL void ev_periodic_again (EV_P_ ev_periodic *w) EV_THROW;\n#endif\n\n/* only supported in the default loop */\n#if EV_SIGNAL_ENABLE\nEV_API_DECL void ev_signal_start   (EV_P_ ev_signal *w) EV_THROW;\nEV_API_DECL void ev_signal_stop    (EV_P_ ev_signal *w) EV_THROW;\n#endif\n\n/* only supported in the default loop */\n# if EV_CHILD_ENABLE\nEV_API_DECL void ev_child_start    (EV_P_ ev_child *w) EV_THROW;\nEV_API_DECL void ev_child_stop     (EV_P_ ev_child *w) EV_THROW;\n# endif\n\n# if EV_STAT_ENABLE\nEV_API_DECL void ev_stat_start     (EV_P_ ev_stat *w) EV_THROW;\nEV_API_DECL void ev_stat_stop      (EV_P_ ev_stat *w) EV_THROW;\nEV_API_DECL void ev_stat_stat      (EV_P_ ev_stat *w) EV_THROW;\n# endif\n\n# if EV_IDLE_ENABLE\nEV_API_DECL void ev_idle_start     (EV_P_ ev_idle *w) EV_THROW;\nEV_API_DECL void ev_idle_stop      (EV_P_ ev_idle *w) EV_THROW;\n# endif\n\n#if EV_PREPARE_ENABLE\nEV_API_DECL void ev_prepare_start  (EV_P_ ev_prepare *w) EV_THROW;\nEV_API_DECL void ev_prepare_stop   (EV_P_ ev_prepare *w) EV_THROW;\n#endif\n\n#if EV_CHECK_ENABLE\nEV_API_DECL void ev_check_start    (EV_P_ ev_check *w) EV_THROW;\nEV_API_DECL void ev_check_stop     (EV_P_ ev_check *w) EV_THROW;\n#endif\n\n# if EV_FORK_ENABLE\nEV_API_DECL void ev_fork_start     (EV_P_ ev_fork *w) EV_THROW;\nEV_API_DECL void ev_fork_stop      (EV_P_ ev_fork *w) EV_THROW;\n# endif\n\n# if EV_CLEANUP_ENABLE\nEV_API_DECL void ev_cleanup_start  (EV_P_ ev_cleanup *w) EV_THROW;\nEV_API_DECL void ev_cleanup_stop   (EV_P_ ev_cleanup *w) EV_THROW;\n# endif\n\n# if EV_EMBED_ENABLE\n/* only supported when loop to be embedded is in fact embeddable */\nEV_API_DECL void ev_embed_start    (EV_P_ ev_embed *w) EV_THROW;\nEV_API_DECL void ev_embed_stop     (EV_P_ ev_embed *w) EV_THROW;\nEV_API_DECL void ev_embed_sweep    (EV_P_ ev_embed *w) EV_THROW;\n# endif\n\n# if EV_ASYNC_ENABLE\nEV_API_DECL void ev_async_start    (EV_P_ ev_async *w) EV_THROW;\nEV_API_DECL void ev_async_stop     (EV_P_ ev_async *w) EV_THROW;\nEV_API_DECL void ev_async_send     (EV_P_ ev_async *w) EV_THROW;\n# endif\n\n#if EV_COMPAT3\n  #define EVLOOP_NONBLOCK EVRUN_NOWAIT\n  #define EVLOOP_ONESHOT  EVRUN_ONCE\n  #define EVUNLOOP_CANCEL EVBREAK_CANCEL\n  #define EVUNLOOP_ONE    EVBREAK_ONE\n  #define EVUNLOOP_ALL    EVBREAK_ALL\n  #if EV_PROTOTYPES\n    EV_INLINE void ev_loop   (EV_P_ int flags) { ev_run   (EV_A_ flags); }\n    EV_INLINE void ev_unloop (EV_P_ int how  ) { ev_break (EV_A_ how  ); }\n    EV_INLINE void ev_default_destroy (void) { ev_loop_destroy (EV_DEFAULT); }\n    EV_INLINE void ev_default_fork    (void) { ev_loop_fork    (EV_DEFAULT); }\n    #if EV_FEATURE_API\n      EV_INLINE unsigned int ev_loop_count  (EV_P) { return ev_iteration  (EV_A); }\n      EV_INLINE unsigned int ev_loop_depth  (EV_P) { return ev_depth      (EV_A); }\n      EV_INLINE void         ev_loop_verify (EV_P) {        ev_verify     (EV_A); }\n    #endif\n  #endif\n#else\n  typedef struct ev_loop ev_loop;\n#endif\n\n#endif\n\nEV_CPP(})\n\n#endif\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/ev.pod",
    "content": "=encoding utf-8\n\n=head1 NAME\n\nlibev - a high performance full-featured event loop written in C\n\n=head1 SYNOPSIS\n\n   #include <ev.h>\n\n=head2 EXAMPLE PROGRAM\n\n   // a single header file is required\n   #include <ev.h>\n\n   #include <stdio.h> // for puts\n\n   // every watcher type has its own typedef'd struct\n   // with the name ev_TYPE\n   ev_io stdin_watcher;\n   ev_timer timeout_watcher;\n\n   // all watcher callbacks have a similar signature\n   // this callback is called when data is readable on stdin\n   static void\n   stdin_cb (EV_P_ ev_io *w, int revents)\n   {\n     puts (\"stdin ready\");\n     // for one-shot events, one must manually stop the watcher\n     // with its corresponding stop function.\n     ev_io_stop (EV_A_ w);\n\n     // this causes all nested ev_run's to stop iterating\n     ev_break (EV_A_ EVBREAK_ALL);\n   }\n\n   // another callback, this time for a time-out\n   static void\n   timeout_cb (EV_P_ ev_timer *w, int revents)\n   {\n     puts (\"timeout\");\n     // this causes the innermost ev_run to stop iterating\n     ev_break (EV_A_ EVBREAK_ONE);\n   }\n\n   int\n   main (void)\n   {\n     // use the default event loop unless you have special needs\n     struct ev_loop *loop = EV_DEFAULT;\n\n     // initialise an io watcher, then start it\n     // this one will watch for stdin to become readable\n     ev_io_init (&stdin_watcher, stdin_cb, /*STDIN_FILENO*/ 0, EV_READ);\n     ev_io_start (loop, &stdin_watcher);\n\n     // initialise a timer watcher, then start it\n     // simple non-repeating 5.5 second timeout\n     ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.);\n     ev_timer_start (loop, &timeout_watcher);\n\n     // now wait for events to arrive\n     ev_run (loop, 0);\n\n     // break was called, so exit\n     return 0;\n   }\n\n=head1 ABOUT THIS DOCUMENT\n\nThis document documents the libev software package.\n\nThe newest version of this document is also available as an html-formatted\nweb page you might find easier to navigate when reading it for the first\ntime: L<http://pod.tst.eu/http://cvs.schmorp.de/libev/ev.pod>.\n\nWhile this document tries to be as complete as possible in documenting\nlibev, its usage and the rationale behind its design, it is not a tutorial\non event-based programming, nor will it introduce event-based programming\nwith libev.\n\nFamiliarity with event based programming techniques in general is assumed\nthroughout this document.\n\n=head1 WHAT TO READ WHEN IN A HURRY\n\nThis manual tries to be very detailed, but unfortunately, this also makes\nit very long. If you just want to know the basics of libev, I suggest\nreading L</ANATOMY OF A WATCHER>, then the L</EXAMPLE PROGRAM> above and\nlook up the missing functions in L</GLOBAL FUNCTIONS> and the C<ev_io> and\nC<ev_timer> sections in L</WATCHER TYPES>.\n\n=head1 ABOUT LIBEV\n\nLibev is an event loop: you register interest in certain events (such as a\nfile descriptor being readable or a timeout occurring), and it will manage\nthese event sources and provide your program with events.\n\nTo do this, it must take more or less complete control over your process\n(or thread) by executing the I<event loop> handler, and will then\ncommunicate events via a callback mechanism.\n\nYou register interest in certain events by registering so-called I<event\nwatchers>, which are relatively small C structures you initialise with the\ndetails of the event, and then hand it over to libev by I<starting> the\nwatcher.\n\n=head2 FEATURES\n\nLibev supports C<select>, C<poll>, the Linux-specific C<epoll>, the\nBSD-specific C<kqueue> and the Solaris-specific event port mechanisms\nfor file descriptor events (C<ev_io>), the Linux C<inotify> interface\n(for C<ev_stat>), Linux eventfd/signalfd (for faster and cleaner\ninter-thread wakeup (C<ev_async>)/signal handling (C<ev_signal>)) relative\ntimers (C<ev_timer>), absolute timers with customised rescheduling\n(C<ev_periodic>), synchronous signals (C<ev_signal>), process status\nchange events (C<ev_child>), and event watchers dealing with the event\nloop mechanism itself (C<ev_idle>, C<ev_embed>, C<ev_prepare> and\nC<ev_check> watchers) as well as file watchers (C<ev_stat>) and even\nlimited support for fork events (C<ev_fork>).\n\nIt also is quite fast (see this\nL<benchmark|http://libev.schmorp.de/bench.html> comparing it to libevent\nfor example).\n\n=head2 CONVENTIONS\n\nLibev is very configurable. In this manual the default (and most common)\nconfiguration will be described, which supports multiple event loops. For\nmore info about various configuration options please have a look at\nB<EMBED> section in this manual. If libev was configured without support\nfor multiple event loops, then all functions taking an initial argument of\nname C<loop> (which is always of type C<struct ev_loop *>) will not have\nthis argument.\n\n=head2 TIME REPRESENTATION\n\nLibev represents time as a single floating point number, representing\nthe (fractional) number of seconds since the (POSIX) epoch (in practice\nsomewhere near the beginning of 1970, details are complicated, don't\nask). This type is called C<ev_tstamp>, which is what you should use\ntoo. It usually aliases to the C<double> type in C. When you need to do\nany calculations on it, you should treat it as some floating point value.\n\nUnlike the name component C<stamp> might indicate, it is also used for\ntime differences (e.g. delays) throughout libev.\n\n=head1 ERROR HANDLING\n\nLibev knows three classes of errors: operating system errors, usage errors\nand internal errors (bugs).\n\nWhen libev catches an operating system error it cannot handle (for example\na system call indicating a condition libev cannot fix), it calls the callback\nset via C<ev_set_syserr_cb>, which is supposed to fix the problem or\nabort. The default is to print a diagnostic message and to call C<abort\n()>.\n\nWhen libev detects a usage error such as a negative timer interval, then\nit will print a diagnostic message and abort (via the C<assert> mechanism,\nso C<NDEBUG> will disable this checking): these are programming errors in\nthe libev caller and need to be fixed there.\n\nLibev also has a few internal error-checking C<assert>ions, and also has\nextensive consistency checking code. These do not trigger under normal\ncircumstances, as they indicate either a bug in libev or worse.\n\n\n=head1 GLOBAL FUNCTIONS\n\nThese functions can be called anytime, even before initialising the\nlibrary in any way.\n\n=over 4\n\n=item ev_tstamp ev_time ()\n\nReturns the current time as libev would use it. Please note that the\nC<ev_now> function is usually faster and also often returns the timestamp\nyou actually want to know. Also interesting is the combination of\nC<ev_now_update> and C<ev_now>.\n\n=item ev_sleep (ev_tstamp interval)\n\nSleep for the given interval: The current thread will be blocked\nuntil either it is interrupted or the given time interval has\npassed (approximately - it might return a bit earlier even if not\ninterrupted). Returns immediately if C<< interval <= 0 >>.\n\nBasically this is a sub-second-resolution C<sleep ()>.\n\nThe range of the C<interval> is limited - libev only guarantees to work\nwith sleep times of up to one day (C<< interval <= 86400 >>).\n\n=item int ev_version_major ()\n\n=item int ev_version_minor ()\n\nYou can find out the major and minor ABI version numbers of the library\nyou linked against by calling the functions C<ev_version_major> and\nC<ev_version_minor>. If you want, you can compare against the global\nsymbols C<EV_VERSION_MAJOR> and C<EV_VERSION_MINOR>, which specify the\nversion of the library your program was compiled against.\n\nThese version numbers refer to the ABI version of the library, not the\nrelease version.\n\nUsually, it's a good idea to terminate if the major versions mismatch,\nas this indicates an incompatible change. Minor versions are usually\ncompatible to older versions, so a larger minor version alone is usually\nnot a problem.\n\nExample: Make sure we haven't accidentally been linked against the wrong\nversion (note, however, that this will not detect other ABI mismatches,\nsuch as LFS or reentrancy).\n\n   assert ((\"libev version mismatch\",\n            ev_version_major () == EV_VERSION_MAJOR\n            && ev_version_minor () >= EV_VERSION_MINOR));\n\n=item unsigned int ev_supported_backends ()\n\nReturn the set of all backends (i.e. their corresponding C<EV_BACKEND_*>\nvalue) compiled into this binary of libev (independent of their\navailability on the system you are running on). See C<ev_default_loop> for\na description of the set values.\n\nExample: make sure we have the epoll method, because yeah this is cool and\na must have and can we have a torrent of it please!!!11\n\n   assert ((\"sorry, no epoll, no sex\",\n            ev_supported_backends () & EVBACKEND_EPOLL));\n\n=item unsigned int ev_recommended_backends ()\n\nReturn the set of all backends compiled into this binary of libev and\nalso recommended for this platform, meaning it will work for most file\ndescriptor types. This set is often smaller than the one returned by\nC<ev_supported_backends>, as for example kqueue is broken on most BSDs\nand will not be auto-detected unless you explicitly request it (assuming\nyou know what you are doing). This is the set of backends that libev will\nprobe for if you specify no backends explicitly.\n\n=item unsigned int ev_embeddable_backends ()\n\nReturns the set of backends that are embeddable in other event loops. This\nvalue is platform-specific but can include backends not available on the\ncurrent system. To find which embeddable backends might be supported on\nthe current system, you would need to look at C<ev_embeddable_backends ()\n& ev_supported_backends ()>, likewise for recommended ones.\n\nSee the description of C<ev_embed> watchers for more info.\n\n=item ev_set_allocator (void *(*cb)(void *ptr, long size) throw ())\n\nSets the allocation function to use (the prototype is similar - the\nsemantics are identical to the C<realloc> C89/SuS/POSIX function). It is\nused to allocate and free memory (no surprises here). If it returns zero\nwhen memory needs to be allocated (C<size != 0>), the library might abort\nor take some potentially destructive action.\n\nSince some systems (at least OpenBSD and Darwin) fail to implement\ncorrect C<realloc> semantics, libev will use a wrapper around the system\nC<realloc> and C<free> functions by default.\n\nYou could override this function in high-availability programs to, say,\nfree some memory if it cannot allocate memory, to use a special allocator,\nor even to sleep a while and retry until some memory is available.\n\nExample: Replace the libev allocator with one that waits a bit and then\nretries (example requires a standards-compliant C<realloc>).\n\n   static void *\n   persistent_realloc (void *ptr, size_t size)\n   {\n     for (;;)\n       {\n         void *newptr = realloc (ptr, size);\n\n         if (newptr)\n           return newptr;\n\n         sleep (60);\n       }\n   }\n\n   ...\n   ev_set_allocator (persistent_realloc);\n\n=item ev_set_syserr_cb (void (*cb)(const char *msg) throw ())\n\nSet the callback function to call on a retryable system call error (such\nas failed select, poll, epoll_wait). The message is a printable string\nindicating the system call or subsystem causing the problem. If this\ncallback is set, then libev will expect it to remedy the situation, no\nmatter what, when it returns. That is, libev will generally retry the\nrequested operation, or, if the condition doesn't go away, do bad stuff\n(such as abort).\n\nExample: This is basically the same thing that libev does internally, too.\n\n   static void\n   fatal_error (const char *msg)\n   {\n     perror (msg);\n     abort ();\n   }\n\n   ...\n   ev_set_syserr_cb (fatal_error);\n\n=item ev_feed_signal (int signum)\n\nThis function can be used to \"simulate\" a signal receive. It is completely\nsafe to call this function at any time, from any context, including signal\nhandlers or random threads.\n\nIts main use is to customise signal handling in your process, especially\nin the presence of threads. For example, you could block signals\nby default in all threads (and specifying C<EVFLAG_NOSIGMASK> when\ncreating any loops), and in one thread, use C<sigwait> or any other\nmechanism to wait for signals, then \"deliver\" them to libev by calling\nC<ev_feed_signal>.\n\n=back\n\n=head1 FUNCTIONS CONTROLLING EVENT LOOPS\n\nAn event loop is described by a C<struct ev_loop *> (the C<struct> is\nI<not> optional in this case unless libev 3 compatibility is disabled, as\nlibev 3 had an C<ev_loop> function colliding with the struct name).\n\nThe library knows two types of such loops, the I<default> loop, which\nsupports child process events, and dynamically created event loops which\ndo not.\n\n=over 4\n\n=item struct ev_loop *ev_default_loop (unsigned int flags)\n\nThis returns the \"default\" event loop object, which is what you should\nnormally use when you just need \"the event loop\". Event loop objects and\nthe C<flags> parameter are described in more detail in the entry for\nC<ev_loop_new>.\n\nIf the default loop is already initialised then this function simply\nreturns it (and ignores the flags. If that is troubling you, check\nC<ev_backend ()> afterwards). Otherwise it will create it with the given\nflags, which should almost always be C<0>, unless the caller is also the\none calling C<ev_run> or otherwise qualifies as \"the main program\".\n\nIf you don't know what event loop to use, use the one returned from this\nfunction (or via the C<EV_DEFAULT> macro).\n\nNote that this function is I<not> thread-safe, so if you want to use it\nfrom multiple threads, you have to employ some kind of mutex (note also\nthat this case is unlikely, as loops cannot be shared easily between\nthreads anyway).\n\nThe default loop is the only loop that can handle C<ev_child> watchers,\nand to do this, it always registers a handler for C<SIGCHLD>. If this is\na problem for your application you can either create a dynamic loop with\nC<ev_loop_new> which doesn't do that, or you can simply overwrite the\nC<SIGCHLD> signal handler I<after> calling C<ev_default_init>.\n\nExample: This is the most typical usage.\n\n   if (!ev_default_loop (0))\n     fatal (\"could not initialise libev, bad $LIBEV_FLAGS in environment?\");\n\nExample: Restrict libev to the select and poll backends, and do not allow\nenvironment settings to be taken into account:\n\n   ev_default_loop (EVBACKEND_POLL | EVBACKEND_SELECT | EVFLAG_NOENV);\n\n=item struct ev_loop *ev_loop_new (unsigned int flags)\n\nThis will create and initialise a new event loop object. If the loop\ncould not be initialised, returns false.\n\nThis function is thread-safe, and one common way to use libev with\nthreads is indeed to create one loop per thread, and using the default\nloop in the \"main\" or \"initial\" thread.\n\nThe flags argument can be used to specify special behaviour or specific\nbackends to use, and is usually specified as C<0> (or C<EVFLAG_AUTO>).\n\nThe following flags are supported:\n\n=over 4\n\n=item C<EVFLAG_AUTO>\n\nThe default flags value. Use this if you have no clue (it's the right\nthing, believe me).\n\n=item C<EVFLAG_NOENV>\n\nIf this flag bit is or'ed into the flag value (or the program runs setuid\nor setgid) then libev will I<not> look at the environment variable\nC<LIBEV_FLAGS>. Otherwise (the default), this environment variable will\noverride the flags completely if it is found in the environment. This is\nuseful to try out specific backends to test their performance, to work\naround bugs, or to make libev threadsafe (accessing environment variables\ncannot be done in a threadsafe way, but usually it works if no other\nthread modifies them).\n\n=item C<EVFLAG_FORKCHECK>\n\nInstead of calling C<ev_loop_fork> manually after a fork, you can also\nmake libev check for a fork in each iteration by enabling this flag.\n\nThis works by calling C<getpid ()> on every iteration of the loop,\nand thus this might slow down your event loop if you do a lot of loop\niterations and little real work, but is usually not noticeable (on my\nGNU/Linux system for example, C<getpid> is actually a simple 5-insn sequence\nwithout a system call and thus I<very> fast, but my GNU/Linux system also has\nC<pthread_atfork> which is even faster).\n\nThe big advantage of this flag is that you can forget about fork (and\nforget about forgetting to tell libev about forking, although you still\nhave to ignore C<SIGPIPE>) when you use this flag.\n\nThis flag setting cannot be overridden or specified in the C<LIBEV_FLAGS>\nenvironment variable.\n\n=item C<EVFLAG_NOINOTIFY>\n\nWhen this flag is specified, then libev will not attempt to use the\nI<inotify> API for its C<ev_stat> watchers. Apart from debugging and\ntesting, this flag can be useful to conserve inotify file descriptors, as\notherwise each loop using C<ev_stat> watchers consumes one inotify handle.\n\n=item C<EVFLAG_SIGNALFD>\n\nWhen this flag is specified, then libev will attempt to use the\nI<signalfd> API for its C<ev_signal> (and C<ev_child>) watchers. This API\ndelivers signals synchronously, which makes it both faster and might make\nit possible to get the queued signal data. It can also simplify signal\nhandling with threads, as long as you properly block signals in your\nthreads that are not interested in handling them.\n\nSignalfd will not be used by default as this changes your signal mask, and\nthere are a lot of shoddy libraries and programs (glib's threadpool for\nexample) that can't properly initialise their signal masks.\n\n=item C<EVFLAG_NOSIGMASK>\n\nWhen this flag is specified, then libev will avoid to modify the signal\nmask. Specifically, this means you have to make sure signals are unblocked\nwhen you want to receive them.\n\nThis behaviour is useful when you want to do your own signal handling, or\nwant to handle signals only in specific threads and want to avoid libev\nunblocking the signals.\n\nIt's also required by POSIX in a threaded program, as libev calls\nC<sigprocmask>, whose behaviour is officially unspecified.\n\nThis flag's behaviour will become the default in future versions of libev.\n\n=item C<EVBACKEND_SELECT>  (value 1, portable select backend)\n\nThis is your standard select(2) backend. Not I<completely> standard, as\nlibev tries to roll its own fd_set with no limits on the number of fds,\nbut if that fails, expect a fairly low limit on the number of fds when\nusing this backend. It doesn't scale too well (O(highest_fd)), but its\nusually the fastest backend for a low number of (low-numbered :) fds.\n\nTo get good performance out of this backend you need a high amount of\nparallelism (most of the file descriptors should be busy). If you are\nwriting a server, you should C<accept ()> in a loop to accept as many\nconnections as possible during one iteration. You might also want to have\na look at C<ev_set_io_collect_interval ()> to increase the amount of\nreadiness notifications you get per iteration.\n\nThis backend maps C<EV_READ> to the C<readfds> set and C<EV_WRITE> to the\nC<writefds> set (and to work around Microsoft Windows bugs, also onto the\nC<exceptfds> set on that platform).\n\n=item C<EVBACKEND_POLL>    (value 2, poll backend, available everywhere except on windows)\n\nAnd this is your standard poll(2) backend. It's more complicated\nthan select, but handles sparse fds better and has no artificial\nlimit on the number of fds you can use (except it will slow down\nconsiderably with a lot of inactive fds). It scales similarly to select,\ni.e. O(total_fds). See the entry for C<EVBACKEND_SELECT>, above, for\nperformance tips.\n\nThis backend maps C<EV_READ> to C<POLLIN | POLLERR | POLLHUP>, and\nC<EV_WRITE> to C<POLLOUT | POLLERR | POLLHUP>.\n\n=item C<EVBACKEND_EPOLL>   (value 4, Linux)\n\nUse the linux-specific epoll(7) interface (for both pre- and post-2.6.9\nkernels).\n\nFor few fds, this backend is a bit little slower than poll and select, but\nit scales phenomenally better. While poll and select usually scale like\nO(total_fds) where total_fds is the total number of fds (or the highest\nfd), epoll scales either O(1) or O(active_fds).\n\nThe epoll mechanism deserves honorable mention as the most misdesigned\nof the more advanced event mechanisms: mere annoyances include silently\ndropping file descriptors, requiring a system call per change per file\ndescriptor (and unnecessary guessing of parameters), problems with dup,\nreturning before the timeout value, resulting in additional iterations\n(and only giving 5ms accuracy while select on the same platform gives\n0.1ms) and so on. The biggest issue is fork races, however - if a program\nforks then I<both> parent and child process have to recreate the epoll\nset, which can take considerable time (one syscall per file descriptor)\nand is of course hard to detect.\n\nEpoll is also notoriously buggy - embedding epoll fds I<should> work,\nbut of course I<doesn't>, and epoll just loves to report events for\ntotally I<different> file descriptors (even already closed ones, so\none cannot even remove them from the set) than registered in the set\n(especially on SMP systems). Libev tries to counter these spurious\nnotifications by employing an additional generation counter and comparing\nthat against the events to filter out spurious ones, recreating the set\nwhen required. Epoll also erroneously rounds down timeouts, but gives you\nno way to know when and by how much, so sometimes you have to busy-wait\nbecause epoll returns immediately despite a nonzero timeout. And last\nnot least, it also refuses to work with some file descriptors which work\nperfectly fine with C<select> (files, many character devices...).\n\nEpoll is truly the train wreck among event poll mechanisms, a frankenpoll,\ncobbled together in a hurry, no thought to design or interaction with\nothers. Oh, the pain, will it ever stop...\n\nWhile stopping, setting and starting an I/O watcher in the same iteration\nwill result in some caching, there is still a system call per such\nincident (because the same I<file descriptor> could point to a different\nI<file description> now), so its best to avoid that. Also, C<dup ()>'ed\nfile descriptors might not work very well if you register events for both\nfile descriptors.\n\nBest performance from this backend is achieved by not unregistering all\nwatchers for a file descriptor until it has been closed, if possible,\ni.e. keep at least one watcher active per fd at all times. Stopping and\nstarting a watcher (without re-setting it) also usually doesn't cause\nextra overhead. A fork can both result in spurious notifications as well\nas in libev having to destroy and recreate the epoll object, which can\ntake considerable time and thus should be avoided.\n\nAll this means that, in practice, C<EVBACKEND_SELECT> can be as fast or\nfaster than epoll for maybe up to a hundred file descriptors, depending on\nthe usage. So sad.\n\nWhile nominally embeddable in other event loops, this feature is broken in\nall kernel versions tested so far.\n\nThis backend maps C<EV_READ> and C<EV_WRITE> in the same way as\nC<EVBACKEND_POLL>.\n\n=item C<EVBACKEND_KQUEUE>  (value 8, most BSD clones)\n\nKqueue deserves special mention, as at the time of this writing, it\nwas broken on all BSDs except NetBSD (usually it doesn't work reliably\nwith anything but sockets and pipes, except on Darwin, where of course\nit's completely useless). Unlike epoll, however, whose brokenness\nis by design, these kqueue bugs can (and eventually will) be fixed\nwithout API changes to existing programs. For this reason it's not being\n\"auto-detected\" unless you explicitly specify it in the flags (i.e. using\nC<EVBACKEND_KQUEUE>) or libev was compiled on a known-to-be-good (-enough)\nsystem like NetBSD.\n\nYou still can embed kqueue into a normal poll or select backend and use it\nonly for sockets (after having made sure that sockets work with kqueue on\nthe target platform). See C<ev_embed> watchers for more info.\n\nIt scales in the same way as the epoll backend, but the interface to the\nkernel is more efficient (which says nothing about its actual speed, of\ncourse). While stopping, setting and starting an I/O watcher does never\ncause an extra system call as with C<EVBACKEND_EPOLL>, it still adds up to\ntwo event changes per incident. Support for C<fork ()> is very bad (you\nmight have to leak fd's on fork, but it's more sane than epoll) and it\ndrops fds silently in similarly hard-to-detect cases.\n\nThis backend usually performs well under most conditions.\n\nWhile nominally embeddable in other event loops, this doesn't work\neverywhere, so you might need to test for this. And since it is broken\nalmost everywhere, you should only use it when you have a lot of sockets\n(for which it usually works), by embedding it into another event loop\n(e.g. C<EVBACKEND_SELECT> or C<EVBACKEND_POLL> (but C<poll> is of course\nalso broken on OS X)) and, did I mention it, using it only for sockets.\n\nThis backend maps C<EV_READ> into an C<EVFILT_READ> kevent with\nC<NOTE_EOF>, and C<EV_WRITE> into an C<EVFILT_WRITE> kevent with\nC<NOTE_EOF>.\n\n=item C<EVBACKEND_DEVPOLL> (value 16, Solaris 8)\n\nThis is not implemented yet (and might never be, unless you send me an\nimplementation). According to reports, C</dev/poll> only supports sockets\nand is not embeddable, which would limit the usefulness of this backend\nimmensely.\n\n=item C<EVBACKEND_PORT>    (value 32, Solaris 10)\n\nThis uses the Solaris 10 event port mechanism. As with everything on Solaris,\nit's really slow, but it still scales very well (O(active_fds)).\n\nWhile this backend scales well, it requires one system call per active\nfile descriptor per loop iteration. For small and medium numbers of file\ndescriptors a \"slow\" C<EVBACKEND_SELECT> or C<EVBACKEND_POLL> backend\nmight perform better.\n\nOn the positive side, this backend actually performed fully to\nspecification in all tests and is fully embeddable, which is a rare feat\namong the OS-specific backends (I vastly prefer correctness over speed\nhacks).\n\nOn the negative side, the interface is I<bizarre> - so bizarre that\neven sun itself gets it wrong in their code examples: The event polling\nfunction sometimes returns events to the caller even though an error\noccurred, but with no indication whether it has done so or not (yes, it's\neven documented that way) - deadly for edge-triggered interfaces where you\nabsolutely have to know whether an event occurred or not because you have\nto re-arm the watcher.\n\nFortunately libev seems to be able to work around these idiocies.\n\nThis backend maps C<EV_READ> and C<EV_WRITE> in the same way as\nC<EVBACKEND_POLL>.\n\n=item C<EVBACKEND_ALL>\n\nTry all backends (even potentially broken ones that wouldn't be tried\nwith C<EVFLAG_AUTO>). Since this is a mask, you can do stuff such as\nC<EVBACKEND_ALL & ~EVBACKEND_KQUEUE>.\n\nIt is definitely not recommended to use this flag, use whatever\nC<ev_recommended_backends ()> returns, or simply do not specify a backend\nat all.\n\n=item C<EVBACKEND_MASK>\n\nNot a backend at all, but a mask to select all backend bits from a\nC<flags> value, in case you want to mask out any backends from a flags\nvalue (e.g. when modifying the C<LIBEV_FLAGS> environment variable).\n\n=back\n\nIf one or more of the backend flags are or'ed into the flags value,\nthen only these backends will be tried (in the reverse order as listed\nhere). If none are specified, all backends in C<ev_recommended_backends\n()> will be tried.\n\nExample: Try to create a event loop that uses epoll and nothing else.\n\n   struct ev_loop *epoller = ev_loop_new (EVBACKEND_EPOLL | EVFLAG_NOENV);\n   if (!epoller)\n     fatal (\"no epoll found here, maybe it hides under your chair\");\n\nExample: Use whatever libev has to offer, but make sure that kqueue is\nused if available.\n\n   struct ev_loop *loop = ev_loop_new (ev_recommended_backends () | EVBACKEND_KQUEUE);\n\n=item ev_loop_destroy (loop)\n\nDestroys an event loop object (frees all memory and kernel state\netc.). None of the active event watchers will be stopped in the normal\nsense, so e.g. C<ev_is_active> might still return true. It is your\nresponsibility to either stop all watchers cleanly yourself I<before>\ncalling this function, or cope with the fact afterwards (which is usually\nthe easiest thing, you can just ignore the watchers and/or C<free ()> them\nfor example).\n\nNote that certain global state, such as signal state (and installed signal\nhandlers), will not be freed by this function, and related watchers (such\nas signal and child watchers) would need to be stopped manually.\n\nThis function is normally used on loop objects allocated by\nC<ev_loop_new>, but it can also be used on the default loop returned by\nC<ev_default_loop>, in which case it is not thread-safe.\n\nNote that it is not advisable to call this function on the default loop\nexcept in the rare occasion where you really need to free its resources.\nIf you need dynamically allocated loops it is better to use C<ev_loop_new>\nand C<ev_loop_destroy>.\n\n=item ev_loop_fork (loop)\n\nThis function sets a flag that causes subsequent C<ev_run> iterations\nto reinitialise the kernel state for backends that have one. Despite\nthe name, you can call it anytime you are allowed to start or stop\nwatchers (except inside an C<ev_prepare> callback), but it makes most\nsense after forking, in the child process. You I<must> call it (or use\nC<EVFLAG_FORKCHECK>) in the child before resuming or calling C<ev_run>.\n\nIn addition, if you want to reuse a loop (via this function or\nC<EVFLAG_FORKCHECK>), you I<also> have to ignore C<SIGPIPE>.\n\nAgain, you I<have> to call it on I<any> loop that you want to re-use after\na fork, I<even if you do not plan to use the loop in the parent>. This is\nbecause some kernel interfaces *cough* I<kqueue> *cough* do funny things\nduring fork.\n\nOn the other hand, you only need to call this function in the child\nprocess if and only if you want to use the event loop in the child. If\nyou just fork+exec or create a new loop in the child, you don't have to\ncall it at all (in fact, C<epoll> is so badly broken that it makes a\ndifference, but libev will usually detect this case on its own and do a\ncostly reset of the backend).\n\nThe function itself is quite fast and it's usually not a problem to call\nit just in case after a fork.\n\nExample: Automate calling C<ev_loop_fork> on the default loop when\nusing pthreads.\n\n   static void\n   post_fork_child (void)\n   {\n     ev_loop_fork (EV_DEFAULT);\n   }\n\n   ...\n   pthread_atfork (0, 0, post_fork_child);\n\n=item int ev_is_default_loop (loop)\n\nReturns true when the given loop is, in fact, the default loop, and false\notherwise.\n\n=item unsigned int ev_iteration (loop)\n\nReturns the current iteration count for the event loop, which is identical\nto the number of times libev did poll for new events. It starts at C<0>\nand happily wraps around with enough iterations.\n\nThis value can sometimes be useful as a generation counter of sorts (it\n\"ticks\" the number of loop iterations), as it roughly corresponds with\nC<ev_prepare> and C<ev_check> calls - and is incremented between the\nprepare and check phases.\n\n=item unsigned int ev_depth (loop)\n\nReturns the number of times C<ev_run> was entered minus the number of\ntimes C<ev_run> was exited normally, in other words, the recursion depth.\n\nOutside C<ev_run>, this number is zero. In a callback, this number is\nC<1>, unless C<ev_run> was invoked recursively (or from another thread),\nin which case it is higher.\n\nLeaving C<ev_run> abnormally (setjmp/longjmp, cancelling the thread,\nthrowing an exception etc.), doesn't count as \"exit\" - consider this\nas a hint to avoid such ungentleman-like behaviour unless it's really\nconvenient, in which case it is fully supported.\n\n=item unsigned int ev_backend (loop)\n\nReturns one of the C<EVBACKEND_*> flags indicating the event backend in\nuse.\n\n=item ev_tstamp ev_now (loop)\n\nReturns the current \"event loop time\", which is the time the event loop\nreceived events and started processing them. This timestamp does not\nchange as long as callbacks are being processed, and this is also the base\ntime used for relative timers. You can treat it as the timestamp of the\nevent occurring (or more correctly, libev finding out about it).\n\n=item ev_now_update (loop)\n\nEstablishes the current time by querying the kernel, updating the time\nreturned by C<ev_now ()> in the progress. This is a costly operation and\nis usually done automatically within C<ev_run ()>.\n\nThis function is rarely useful, but when some event callback runs for a\nvery long time without entering the event loop, updating libev's idea of\nthe current time is a good idea.\n\nSee also L</The special problem of time updates> in the C<ev_timer> section.\n\n=item ev_suspend (loop)\n\n=item ev_resume (loop)\n\nThese two functions suspend and resume an event loop, for use when the\nloop is not used for a while and timeouts should not be processed.\n\nA typical use case would be an interactive program such as a game:  When\nthe user presses C<^Z> to suspend the game and resumes it an hour later it\nwould be best to handle timeouts as if no time had actually passed while\nthe program was suspended. This can be achieved by calling C<ev_suspend>\nin your C<SIGTSTP> handler, sending yourself a C<SIGSTOP> and calling\nC<ev_resume> directly afterwards to resume timer processing.\n\nEffectively, all C<ev_timer> watchers will be delayed by the time spend\nbetween C<ev_suspend> and C<ev_resume>, and all C<ev_periodic> watchers\nwill be rescheduled (that is, they will lose any events that would have\noccurred while suspended).\n\nAfter calling C<ev_suspend> you B<must not> call I<any> function on the\ngiven loop other than C<ev_resume>, and you B<must not> call C<ev_resume>\nwithout a previous call to C<ev_suspend>.\n\nCalling C<ev_suspend>/C<ev_resume> has the side effect of updating the\nevent loop time (see C<ev_now_update>).\n\n=item bool ev_run (loop, int flags)\n\nFinally, this is it, the event handler. This function usually is called\nafter you have initialised all your watchers and you want to start\nhandling events. It will ask the operating system for any new events, call\nthe watcher callbacks, and then repeat the whole process indefinitely: This\nis why event loops are called I<loops>.\n\nIf the flags argument is specified as C<0>, it will keep handling events\nuntil either no event watchers are active anymore or C<ev_break> was\ncalled.\n\nThe return value is false if there are no more active watchers (which\nusually means \"all jobs done\" or \"deadlock\"), and true in all other cases\n(which usually means \" you should call C<ev_run> again\").\n\nPlease note that an explicit C<ev_break> is usually better than\nrelying on all watchers to be stopped when deciding when a program has\nfinished (especially in interactive programs), but having a program\nthat automatically loops as long as it has to and no longer by virtue\nof relying on its watchers stopping correctly, that is truly a thing of\nbeauty.\n\nThis function is I<mostly> exception-safe - you can break out of a\nC<ev_run> call by calling C<longjmp> in a callback, throwing a C++\nexception and so on. This does not decrement the C<ev_depth> value, nor\nwill it clear any outstanding C<EVBREAK_ONE> breaks.\n\nA flags value of C<EVRUN_NOWAIT> will look for new events, will handle\nthose events and any already outstanding ones, but will not wait and\nblock your process in case there are no events and will return after one\niteration of the loop. This is sometimes useful to poll and handle new\nevents while doing lengthy calculations, to keep the program responsive.\n\nA flags value of C<EVRUN_ONCE> will look for new events (waiting if\nnecessary) and will handle those and any already outstanding ones. It\nwill block your process until at least one new event arrives (which could\nbe an event internal to libev itself, so there is no guarantee that a\nuser-registered callback will be called), and will return after one\niteration of the loop.\n\nThis is useful if you are waiting for some external event in conjunction\nwith something not expressible using other libev watchers (i.e. \"roll your\nown C<ev_run>\"). However, a pair of C<ev_prepare>/C<ev_check> watchers is\nusually a better approach for this kind of thing.\n\nHere are the gory details of what C<ev_run> does (this is for your\nunderstanding, not a guarantee that things will work exactly like this in\nfuture versions):\n\n   - Increment loop depth.\n   - Reset the ev_break status.\n   - Before the first iteration, call any pending watchers.\n   LOOP:\n   - If EVFLAG_FORKCHECK was used, check for a fork.\n   - If a fork was detected (by any means), queue and call all fork watchers.\n   - Queue and call all prepare watchers.\n   - If ev_break was called, goto FINISH.\n   - If we have been forked, detach and recreate the kernel state\n     as to not disturb the other process.\n   - Update the kernel state with all outstanding changes.\n   - Update the \"event loop time\" (ev_now ()).\n   - Calculate for how long to sleep or block, if at all\n     (active idle watchers, EVRUN_NOWAIT or not having\n     any active watchers at all will result in not sleeping).\n   - Sleep if the I/O and timer collect interval say so.\n   - Increment loop iteration counter.\n   - Block the process, waiting for any events.\n   - Queue all outstanding I/O (fd) events.\n   - Update the \"event loop time\" (ev_now ()), and do time jump adjustments.\n   - Queue all expired timers.\n   - Queue all expired periodics.\n   - Queue all idle watchers with priority higher than that of pending events.\n   - Queue all check watchers.\n   - Call all queued watchers in reverse order (i.e. check watchers first).\n     Signals and child watchers are implemented as I/O watchers, and will\n     be handled here by queueing them when their watcher gets executed.\n   - If ev_break has been called, or EVRUN_ONCE or EVRUN_NOWAIT\n     were used, or there are no active watchers, goto FINISH, otherwise\n     continue with step LOOP.\n   FINISH:\n   - Reset the ev_break status iff it was EVBREAK_ONE.\n   - Decrement the loop depth.\n   - Return.\n\nExample: Queue some jobs and then loop until no events are outstanding\nanymore.\n\n   ... queue jobs here, make sure they register event watchers as long\n   ... as they still have work to do (even an idle watcher will do..)\n   ev_run (my_loop, 0);\n   ... jobs done or somebody called break. yeah!\n\n=item ev_break (loop, how)\n\nCan be used to make a call to C<ev_run> return early (but only after it\nhas processed all outstanding events). The C<how> argument must be either\nC<EVBREAK_ONE>, which will make the innermost C<ev_run> call return, or\nC<EVBREAK_ALL>, which will make all nested C<ev_run> calls return.\n\nThis \"break state\" will be cleared on the next call to C<ev_run>.\n\nIt is safe to call C<ev_break> from outside any C<ev_run> calls, too, in\nwhich case it will have no effect.\n\n=item ev_ref (loop)\n\n=item ev_unref (loop)\n\nRef/unref can be used to add or remove a reference count on the event\nloop: Every watcher keeps one reference, and as long as the reference\ncount is nonzero, C<ev_run> will not return on its own.\n\nThis is useful when you have a watcher that you never intend to\nunregister, but that nevertheless should not keep C<ev_run> from\nreturning. In such a case, call C<ev_unref> after starting, and C<ev_ref>\nbefore stopping it.\n\nAs an example, libev itself uses this for its internal signal pipe: It\nis not visible to the libev user and should not keep C<ev_run> from\nexiting if no event watchers registered by it are active. It is also an\nexcellent way to do this for generic recurring timers or from within\nthird-party libraries. Just remember to I<unref after start> and I<ref\nbefore stop> (but only if the watcher wasn't active before, or was active\nbefore, respectively. Note also that libev might stop watchers itself\n(e.g. non-repeating timers) in which case you have to C<ev_ref>\nin the callback).\n\nExample: Create a signal watcher, but keep it from keeping C<ev_run>\nrunning when nothing else is active.\n\n   ev_signal exitsig;\n   ev_signal_init (&exitsig, sig_cb, SIGINT);\n   ev_signal_start (loop, &exitsig);\n   ev_unref (loop);\n\nExample: For some weird reason, unregister the above signal handler again.\n\n   ev_ref (loop);\n   ev_signal_stop (loop, &exitsig);\n\n=item ev_set_io_collect_interval (loop, ev_tstamp interval)\n\n=item ev_set_timeout_collect_interval (loop, ev_tstamp interval)\n\nThese advanced functions influence the time that libev will spend waiting\nfor events. Both time intervals are by default C<0>, meaning that libev\nwill try to invoke timer/periodic callbacks and I/O callbacks with minimum\nlatency.\n\nSetting these to a higher value (the C<interval> I<must> be >= C<0>)\nallows libev to delay invocation of I/O and timer/periodic callbacks\nto increase efficiency of loop iterations (or to increase power-saving\nopportunities).\n\nThe idea is that sometimes your program runs just fast enough to handle\none (or very few) event(s) per loop iteration. While this makes the\nprogram responsive, it also wastes a lot of CPU time to poll for new\nevents, especially with backends like C<select ()> which have a high\noverhead for the actual polling but can deliver many events at once.\n\nBy setting a higher I<io collect interval> you allow libev to spend more\ntime collecting I/O events, so you can handle more events per iteration,\nat the cost of increasing latency. Timeouts (both C<ev_periodic> and\nC<ev_timer>) will not be affected. Setting this to a non-null value will\nintroduce an additional C<ev_sleep ()> call into most loop iterations. The\nsleep time ensures that libev will not poll for I/O events more often then\nonce per this interval, on average (as long as the host time resolution is\ngood enough).\n\nLikewise, by setting a higher I<timeout collect interval> you allow libev\nto spend more time collecting timeouts, at the expense of increased\nlatency/jitter/inexactness (the watcher callback will be called\nlater). C<ev_io> watchers will not be affected. Setting this to a non-null\nvalue will not introduce any overhead in libev.\n\nMany (busy) programs can usually benefit by setting the I/O collect\ninterval to a value near C<0.1> or so, which is often enough for\ninteractive servers (of course not for games), likewise for timeouts. It\nusually doesn't make much sense to set it to a lower value than C<0.01>,\nas this approaches the timing granularity of most systems. Note that if\nyou do transactions with the outside world and you can't increase the\nparallelity, then this setting will limit your transaction rate (if you\nneed to poll once per transaction and the I/O collect interval is 0.01,\nthen you can't do more than 100 transactions per second).\n\nSetting the I<timeout collect interval> can improve the opportunity for\nsaving power, as the program will \"bundle\" timer callback invocations that\nare \"near\" in time together, by delaying some, thus reducing the number of\ntimes the process sleeps and wakes up again. Another useful technique to\nreduce iterations/wake-ups is to use C<ev_periodic> watchers and make sure\nthey fire on, say, one-second boundaries only.\n\nExample: we only need 0.1s timeout granularity, and we wish not to poll\nmore often than 100 times per second:\n\n   ev_set_timeout_collect_interval (EV_DEFAULT_UC_ 0.1);\n   ev_set_io_collect_interval (EV_DEFAULT_UC_ 0.01);\n\n=item ev_invoke_pending (loop)\n\nThis call will simply invoke all pending watchers while resetting their\npending state. Normally, C<ev_run> does this automatically when required,\nbut when overriding the invoke callback this call comes handy. This\nfunction can be invoked from a watcher - this can be useful for example\nwhen you want to do some lengthy calculation and want to pass further\nevent handling to another thread (you still have to make sure only one\nthread executes within C<ev_invoke_pending> or C<ev_run> of course).\n\n=item int ev_pending_count (loop)\n\nReturns the number of pending watchers - zero indicates that no watchers\nare pending.\n\n=item ev_set_invoke_pending_cb (loop, void (*invoke_pending_cb)(EV_P))\n\nThis overrides the invoke pending functionality of the loop: Instead of\ninvoking all pending watchers when there are any, C<ev_run> will call\nthis callback instead. This is useful, for example, when you want to\ninvoke the actual watchers inside another context (another thread etc.).\n\nIf you want to reset the callback, use C<ev_invoke_pending> as new\ncallback.\n\n=item ev_set_loop_release_cb (loop, void (*release)(EV_P) throw (), void (*acquire)(EV_P) throw ())\n\nSometimes you want to share the same loop between multiple threads. This\ncan be done relatively simply by putting mutex_lock/unlock calls around\neach call to a libev function.\n\nHowever, C<ev_run> can run an indefinite time, so it is not feasible\nto wait for it to return. One way around this is to wake up the event\nloop via C<ev_break> and C<ev_async_send>, another way is to set these\nI<release> and I<acquire> callbacks on the loop.\n\nWhen set, then C<release> will be called just before the thread is\nsuspended waiting for new events, and C<acquire> is called just\nafterwards.\n\nIdeally, C<release> will just call your mutex_unlock function, and\nC<acquire> will just call the mutex_lock function again.\n\nWhile event loop modifications are allowed between invocations of\nC<release> and C<acquire> (that's their only purpose after all), no\nmodifications done will affect the event loop, i.e. adding watchers will\nhave no effect on the set of file descriptors being watched, or the time\nwaited. Use an C<ev_async> watcher to wake up C<ev_run> when you want it\nto take note of any changes you made.\n\nIn theory, threads executing C<ev_run> will be async-cancel safe between\ninvocations of C<release> and C<acquire>.\n\nSee also the locking example in the C<THREADS> section later in this\ndocument.\n\n=item ev_set_userdata (loop, void *data)\n\n=item void *ev_userdata (loop)\n\nSet and retrieve a single C<void *> associated with a loop. When\nC<ev_set_userdata> has never been called, then C<ev_userdata> returns\nC<0>.\n\nThese two functions can be used to associate arbitrary data with a loop,\nand are intended solely for the C<invoke_pending_cb>, C<release> and\nC<acquire> callbacks described above, but of course can be (ab-)used for\nany other purpose as well.\n\n=item ev_verify (loop)\n\nThis function only does something when C<EV_VERIFY> support has been\ncompiled in, which is the default for non-minimal builds. It tries to go\nthrough all internal structures and checks them for validity. If anything\nis found to be inconsistent, it will print an error message to standard\nerror and call C<abort ()>.\n\nThis can be used to catch bugs inside libev itself: under normal\ncircumstances, this function will never abort as of course libev keeps its\ndata structures consistent.\n\n=back\n\n\n=head1 ANATOMY OF A WATCHER\n\nIn the following description, uppercase C<TYPE> in names stands for the\nwatcher type, e.g. C<ev_TYPE_start> can mean C<ev_timer_start> for timer\nwatchers and C<ev_io_start> for I/O watchers.\n\nA watcher is an opaque structure that you allocate and register to record\nyour interest in some event. To make a concrete example, imagine you want\nto wait for STDIN to become readable, you would create an C<ev_io> watcher\nfor that:\n\n   static void my_cb (struct ev_loop *loop, ev_io *w, int revents)\n   {\n     ev_io_stop (w);\n     ev_break (loop, EVBREAK_ALL);\n   }\n\n   struct ev_loop *loop = ev_default_loop (0);\n\n   ev_io stdin_watcher;\n\n   ev_init (&stdin_watcher, my_cb);\n   ev_io_set (&stdin_watcher, STDIN_FILENO, EV_READ);\n   ev_io_start (loop, &stdin_watcher);\n\n   ev_run (loop, 0);\n\nAs you can see, you are responsible for allocating the memory for your\nwatcher structures (and it is I<usually> a bad idea to do this on the\nstack).\n\nEach watcher has an associated watcher structure (called C<struct ev_TYPE>\nor simply C<ev_TYPE>, as typedefs are provided for all watcher structs).\n\nEach watcher structure must be initialised by a call to C<ev_init (watcher\n*, callback)>, which expects a callback to be provided. This callback is\ninvoked each time the event occurs (or, in the case of I/O watchers, each\ntime the event loop detects that the file descriptor given is readable\nand/or writable).\n\nEach watcher type further has its own C<< ev_TYPE_set (watcher *, ...) >>\nmacro to configure it, with arguments specific to the watcher type. There\nis also a macro to combine initialisation and setting in one call: C<<\nev_TYPE_init (watcher *, callback, ...) >>.\n\nTo make the watcher actually watch out for events, you have to start it\nwith a watcher-specific start function (C<< ev_TYPE_start (loop, watcher\n*) >>), and you can stop watching for events at any time by calling the\ncorresponding stop function (C<< ev_TYPE_stop (loop, watcher *) >>.\n\nAs long as your watcher is active (has been started but not stopped) you\nmust not touch the values stored in it. Most specifically you must never\nreinitialise it or call its C<ev_TYPE_set> macro.\n\nEach and every callback receives the event loop pointer as first, the\nregistered watcher structure as second, and a bitset of received events as\nthird argument.\n\nThe received events usually include a single bit per event type received\n(you can receive multiple events at the same time). The possible bit masks\nare:\n\n=over 4\n\n=item C<EV_READ>\n\n=item C<EV_WRITE>\n\nThe file descriptor in the C<ev_io> watcher has become readable and/or\nwritable.\n\n=item C<EV_TIMER>\n\nThe C<ev_timer> watcher has timed out.\n\n=item C<EV_PERIODIC>\n\nThe C<ev_periodic> watcher has timed out.\n\n=item C<EV_SIGNAL>\n\nThe signal specified in the C<ev_signal> watcher has been received by a thread.\n\n=item C<EV_CHILD>\n\nThe pid specified in the C<ev_child> watcher has received a status change.\n\n=item C<EV_STAT>\n\nThe path specified in the C<ev_stat> watcher changed its attributes somehow.\n\n=item C<EV_IDLE>\n\nThe C<ev_idle> watcher has determined that you have nothing better to do.\n\n=item C<EV_PREPARE>\n\n=item C<EV_CHECK>\n\nAll C<ev_prepare> watchers are invoked just I<before> C<ev_run> starts to\ngather new events, and all C<ev_check> watchers are queued (not invoked)\njust after C<ev_run> has gathered them, but before it queues any callbacks\nfor any received events. That means C<ev_prepare> watchers are the last\nwatchers invoked before the event loop sleeps or polls for new events, and\nC<ev_check> watchers will be invoked before any other watchers of the same\nor lower priority within an event loop iteration.\n\nCallbacks of both watcher types can start and stop as many watchers as\nthey want, and all of them will be taken into account (for example, a\nC<ev_prepare> watcher might start an idle watcher to keep C<ev_run> from\nblocking).\n\n=item C<EV_EMBED>\n\nThe embedded event loop specified in the C<ev_embed> watcher needs attention.\n\n=item C<EV_FORK>\n\nThe event loop has been resumed in the child process after fork (see\nC<ev_fork>).\n\n=item C<EV_CLEANUP>\n\nThe event loop is about to be destroyed (see C<ev_cleanup>).\n\n=item C<EV_ASYNC>\n\nThe given async watcher has been asynchronously notified (see C<ev_async>).\n\n=item C<EV_CUSTOM>\n\nNot ever sent (or otherwise used) by libev itself, but can be freely used\nby libev users to signal watchers (e.g. via C<ev_feed_event>).\n\n=item C<EV_ERROR>\n\nAn unspecified error has occurred, the watcher has been stopped. This might\nhappen because the watcher could not be properly started because libev\nran out of memory, a file descriptor was found to be closed or any other\nproblem. Libev considers these application bugs.\n\nYou best act on it by reporting the problem and somehow coping with the\nwatcher being stopped. Note that well-written programs should not receive\nan error ever, so when your watcher receives it, this usually indicates a\nbug in your program.\n\nLibev will usually signal a few \"dummy\" events together with an error, for\nexample it might indicate that a fd is readable or writable, and if your\ncallbacks is well-written it can just attempt the operation and cope with\nthe error from read() or write(). This will not work in multi-threaded\nprograms, though, as the fd could already be closed and reused for another\nthing, so beware.\n\n=back\n\n=head2 GENERIC WATCHER FUNCTIONS\n\n=over 4\n\n=item C<ev_init> (ev_TYPE *watcher, callback)\n\nThis macro initialises the generic portion of a watcher. The contents\nof the watcher object can be arbitrary (so C<malloc> will do). Only\nthe generic parts of the watcher are initialised, you I<need> to call\nthe type-specific C<ev_TYPE_set> macro afterwards to initialise the\ntype-specific parts. For each type there is also a C<ev_TYPE_init> macro\nwhich rolls both calls into one.\n\nYou can reinitialise a watcher at any time as long as it has been stopped\n(or never started) and there are no pending events outstanding.\n\nThe callback is always of type C<void (*)(struct ev_loop *loop, ev_TYPE *watcher,\nint revents)>.\n\nExample: Initialise an C<ev_io> watcher in two steps.\n\n   ev_io w;\n   ev_init (&w, my_cb);\n   ev_io_set (&w, STDIN_FILENO, EV_READ);\n\n=item C<ev_TYPE_set> (ev_TYPE *watcher, [args])\n\nThis macro initialises the type-specific parts of a watcher. You need to\ncall C<ev_init> at least once before you call this macro, but you can\ncall C<ev_TYPE_set> any number of times. You must not, however, call this\nmacro on a watcher that is active (it can be pending, however, which is a\ndifference to the C<ev_init> macro).\n\nAlthough some watcher types do not have type-specific arguments\n(e.g. C<ev_prepare>) you still need to call its C<set> macro.\n\nSee C<ev_init>, above, for an example.\n\n=item C<ev_TYPE_init> (ev_TYPE *watcher, callback, [args])\n\nThis convenience macro rolls both C<ev_init> and C<ev_TYPE_set> macro\ncalls into a single call. This is the most convenient method to initialise\na watcher. The same limitations apply, of course.\n\nExample: Initialise and set an C<ev_io> watcher in one step.\n\n   ev_io_init (&w, my_cb, STDIN_FILENO, EV_READ);\n\n=item C<ev_TYPE_start> (loop, ev_TYPE *watcher)\n\nStarts (activates) the given watcher. Only active watchers will receive\nevents. If the watcher is already active nothing will happen.\n\nExample: Start the C<ev_io> watcher that is being abused as example in this\nwhole section.\n\n   ev_io_start (EV_DEFAULT_UC, &w);\n\n=item C<ev_TYPE_stop> (loop, ev_TYPE *watcher)\n\nStops the given watcher if active, and clears the pending status (whether\nthe watcher was active or not).\n\nIt is possible that stopped watchers are pending - for example,\nnon-repeating timers are being stopped when they become pending - but\ncalling C<ev_TYPE_stop> ensures that the watcher is neither active nor\npending. If you want to free or reuse the memory used by the watcher it is\ntherefore a good idea to always call its C<ev_TYPE_stop> function.\n\n=item bool ev_is_active (ev_TYPE *watcher)\n\nReturns a true value iff the watcher is active (i.e. it has been started\nand not yet been stopped). As long as a watcher is active you must not modify\nit.\n\n=item bool ev_is_pending (ev_TYPE *watcher)\n\nReturns a true value iff the watcher is pending, (i.e. it has outstanding\nevents but its callback has not yet been invoked). As long as a watcher\nis pending (but not active) you must not call an init function on it (but\nC<ev_TYPE_set> is safe), you must not change its priority, and you must\nmake sure the watcher is available to libev (e.g. you cannot C<free ()>\nit).\n\n=item callback ev_cb (ev_TYPE *watcher)\n\nReturns the callback currently set on the watcher.\n\n=item ev_set_cb (ev_TYPE *watcher, callback)\n\nChange the callback. You can change the callback at virtually any time\n(modulo threads).\n\n=item ev_set_priority (ev_TYPE *watcher, int priority)\n\n=item int ev_priority (ev_TYPE *watcher)\n\nSet and query the priority of the watcher. The priority is a small\ninteger between C<EV_MAXPRI> (default: C<2>) and C<EV_MINPRI>\n(default: C<-2>). Pending watchers with higher priority will be invoked\nbefore watchers with lower priority, but priority will not keep watchers\nfrom being executed (except for C<ev_idle> watchers).\n\nIf you need to suppress invocation when higher priority events are pending\nyou need to look at C<ev_idle> watchers, which provide this functionality.\n\nYou I<must not> change the priority of a watcher as long as it is active or\npending.\n\nSetting a priority outside the range of C<EV_MINPRI> to C<EV_MAXPRI> is\nfine, as long as you do not mind that the priority value you query might\nor might not have been clamped to the valid range.\n\nThe default priority used by watchers when no priority has been set is\nalways C<0>, which is supposed to not be too high and not be too low :).\n\nSee L</WATCHER PRIORITY MODELS>, below, for a more thorough treatment of\npriorities.\n\n=item ev_invoke (loop, ev_TYPE *watcher, int revents)\n\nInvoke the C<watcher> with the given C<loop> and C<revents>. Neither\nC<loop> nor C<revents> need to be valid as long as the watcher callback\ncan deal with that fact, as both are simply passed through to the\ncallback.\n\n=item int ev_clear_pending (loop, ev_TYPE *watcher)\n\nIf the watcher is pending, this function clears its pending status and\nreturns its C<revents> bitset (as if its callback was invoked). If the\nwatcher isn't pending it does nothing and returns C<0>.\n\nSometimes it can be useful to \"poll\" a watcher instead of waiting for its\ncallback to be invoked, which can be accomplished with this function.\n\n=item ev_feed_event (loop, ev_TYPE *watcher, int revents)\n\nFeeds the given event set into the event loop, as if the specified event\nhad happened for the specified watcher (which must be a pointer to an\ninitialised but not necessarily started event watcher). Obviously you must\nnot free the watcher as long as it has pending events.\n\nStopping the watcher, letting libev invoke it, or calling\nC<ev_clear_pending> will clear the pending event, even if the watcher was\nnot started in the first place.\n\nSee also C<ev_feed_fd_event> and C<ev_feed_signal_event> for related\nfunctions that do not need a watcher.\n\n=back\n\nSee also the L</ASSOCIATING CUSTOM DATA WITH A WATCHER> and L</BUILDING YOUR\nOWN COMPOSITE WATCHERS> idioms.\n\n=head2 WATCHER STATES\n\nThere are various watcher states mentioned throughout this manual -\nactive, pending and so on. In this section these states and the rules to\ntransition between them will be described in more detail - and while these\nrules might look complicated, they usually do \"the right thing\".\n\n=over 4\n\n=item initialised\n\nBefore a watcher can be registered with the event loop it has to be\ninitialised. This can be done with a call to C<ev_TYPE_init>, or calls to\nC<ev_init> followed by the watcher-specific C<ev_TYPE_set> function.\n\nIn this state it is simply some block of memory that is suitable for\nuse in an event loop. It can be moved around, freed, reused etc. at\nwill - as long as you either keep the memory contents intact, or call\nC<ev_TYPE_init> again.\n\n=item started/running/active\n\nOnce a watcher has been started with a call to C<ev_TYPE_start> it becomes\nproperty of the event loop, and is actively waiting for events. While in\nthis state it cannot be accessed (except in a few documented ways), moved,\nfreed or anything else - the only legal thing is to keep a pointer to it,\nand call libev functions on it that are documented to work on active watchers.\n\n=item pending\n\nIf a watcher is active and libev determines that an event it is interested\nin has occurred (such as a timer expiring), it will become pending. It will\nstay in this pending state until either it is stopped or its callback is\nabout to be invoked, so it is not normally pending inside the watcher\ncallback.\n\nThe watcher might or might not be active while it is pending (for example,\nan expired non-repeating timer can be pending but no longer active). If it\nis stopped, it can be freely accessed (e.g. by calling C<ev_TYPE_set>),\nbut it is still property of the event loop at this time, so cannot be\nmoved, freed or reused. And if it is active the rules described in the\nprevious item still apply.\n\nIt is also possible to feed an event on a watcher that is not active (e.g.\nvia C<ev_feed_event>), in which case it becomes pending without being\nactive.\n\n=item stopped\n\nA watcher can be stopped implicitly by libev (in which case it might still\nbe pending), or explicitly by calling its C<ev_TYPE_stop> function. The\nlatter will clear any pending state the watcher might be in, regardless\nof whether it was active or not, so stopping a watcher explicitly before\nfreeing it is often a good idea.\n\nWhile stopped (and not pending) the watcher is essentially in the\ninitialised state, that is, it can be reused, moved, modified in any way\nyou wish (but when you trash the memory block, you need to C<ev_TYPE_init>\nit again).\n\n=back\n\n=head2 WATCHER PRIORITY MODELS\n\nMany event loops support I<watcher priorities>, which are usually small\nintegers that influence the ordering of event callback invocation\nbetween watchers in some way, all else being equal.\n\nIn libev, Watcher priorities can be set using C<ev_set_priority>. See its\ndescription for the more technical details such as the actual priority\nrange.\n\nThere are two common ways how these these priorities are being interpreted\nby event loops:\n\nIn the more common lock-out model, higher priorities \"lock out\" invocation\nof lower priority watchers, which means as long as higher priority\nwatchers receive events, lower priority watchers are not being invoked.\n\nThe less common only-for-ordering model uses priorities solely to order\ncallback invocation within a single event loop iteration: Higher priority\nwatchers are invoked before lower priority ones, but they all get invoked\nbefore polling for new events.\n\nLibev uses the second (only-for-ordering) model for all its watchers\nexcept for idle watchers (which use the lock-out model).\n\nThe rationale behind this is that implementing the lock-out model for\nwatchers is not well supported by most kernel interfaces, and most event\nlibraries will just poll for the same events again and again as long as\ntheir callbacks have not been executed, which is very inefficient in the\ncommon case of one high-priority watcher locking out a mass of lower\npriority ones.\n\nStatic (ordering) priorities are most useful when you have two or more\nwatchers handling the same resource: a typical usage example is having an\nC<ev_io> watcher to receive data, and an associated C<ev_timer> to handle\ntimeouts. Under load, data might be received while the program handles\nother jobs, but since timers normally get invoked first, the timeout\nhandler will be executed before checking for data. In that case, giving\nthe timer a lower priority than the I/O watcher ensures that I/O will be\nhandled first even under adverse conditions (which is usually, but not\nalways, what you want).\n\nSince idle watchers use the \"lock-out\" model, meaning that idle watchers\nwill only be executed when no same or higher priority watchers have\nreceived events, they can be used to implement the \"lock-out\" model when\nrequired.\n\nFor example, to emulate how many other event libraries handle priorities,\nyou can associate an C<ev_idle> watcher to each such watcher, and in\nthe normal watcher callback, you just start the idle watcher. The real\nprocessing is done in the idle watcher callback. This causes libev to\ncontinuously poll and process kernel event data for the watcher, but when\nthe lock-out case is known to be rare (which in turn is rare :), this is\nworkable.\n\nUsually, however, the lock-out model implemented that way will perform\nmiserably under the type of load it was designed to handle. In that case,\nit might be preferable to stop the real watcher before starting the\nidle watcher, so the kernel will not have to process the event in case\nthe actual processing will be delayed for considerable time.\n\nHere is an example of an I/O watcher that should run at a strictly lower\npriority than the default, and which should only process data when no\nother events are pending:\n\n   ev_idle idle; // actual processing watcher\n   ev_io io;     // actual event watcher\n\n   static void\n   io_cb (EV_P_ ev_io *w, int revents)\n   {\n     // stop the I/O watcher, we received the event, but\n     // are not yet ready to handle it.\n     ev_io_stop (EV_A_ w);\n\n     // start the idle watcher to handle the actual event.\n     // it will not be executed as long as other watchers\n     // with the default priority are receiving events.\n     ev_idle_start (EV_A_ &idle);\n   }\n\n   static void\n   idle_cb (EV_P_ ev_idle *w, int revents)\n   {\n     // actual processing\n     read (STDIN_FILENO, ...);\n\n     // have to start the I/O watcher again, as\n     // we have handled the event\n     ev_io_start (EV_P_ &io);\n   }\n\n   // initialisation\n   ev_idle_init (&idle, idle_cb);\n   ev_io_init (&io, io_cb, STDIN_FILENO, EV_READ);\n   ev_io_start (EV_DEFAULT_ &io);\n\nIn the \"real\" world, it might also be beneficial to start a timer, so that\nlow-priority connections can not be locked out forever under load. This\nenables your program to keep a lower latency for important connections\nduring short periods of high load, while not completely locking out less\nimportant ones.\n\n\n=head1 WATCHER TYPES\n\nThis section describes each watcher in detail, but will not repeat\ninformation given in the last section. Any initialisation/set macros,\nfunctions and members specific to the watcher type are explained.\n\nMembers are additionally marked with either I<[read-only]>, meaning that,\nwhile the watcher is active, you can look at the member and expect some\nsensible content, but you must not modify it (you can modify it while the\nwatcher is stopped to your hearts content), or I<[read-write]>, which\nmeans you can expect it to have some sensible content while the watcher\nis active, but you can also modify it. Modifying it may not do something\nsensible or take immediate effect (or do anything at all), but libev will\nnot crash or malfunction in any way.\n\n\n=head2 C<ev_io> - is this file descriptor readable or writable?\n\nI/O watchers check whether a file descriptor is readable or writable\nin each iteration of the event loop, or, more precisely, when reading\nwould not block the process and writing would at least be able to write\nsome data. This behaviour is called level-triggering because you keep\nreceiving events as long as the condition persists. Remember you can stop\nthe watcher if you don't want to act on the event and neither want to\nreceive future events.\n\nIn general you can register as many read and/or write event watchers per\nfd as you want (as long as you don't confuse yourself). Setting all file\ndescriptors to non-blocking mode is also usually a good idea (but not\nrequired if you know what you are doing).\n\nAnother thing you have to watch out for is that it is quite easy to\nreceive \"spurious\" readiness notifications, that is, your callback might\nbe called with C<EV_READ> but a subsequent C<read>(2) will actually block\nbecause there is no data. It is very easy to get into this situation even\nwith a relatively standard program structure. Thus it is best to always\nuse non-blocking I/O: An extra C<read>(2) returning C<EAGAIN> is far\npreferable to a program hanging until some data arrives.\n\nIf you cannot run the fd in non-blocking mode (for example you should\nnot play around with an Xlib connection), then you have to separately\nre-test whether a file descriptor is really ready with a known-to-be good\ninterface such as poll (fortunately in the case of Xlib, it already does\nthis on its own, so its quite safe to use). Some people additionally\nuse C<SIGALRM> and an interval timer, just to be sure you won't block\nindefinitely.\n\nBut really, best use non-blocking mode.\n\n=head3 The special problem of disappearing file descriptors\n\nSome backends (e.g. kqueue, epoll) need to be told about closing a file\ndescriptor (either due to calling C<close> explicitly or any other means,\nsuch as C<dup2>). The reason is that you register interest in some file\ndescriptor, but when it goes away, the operating system will silently drop\nthis interest. If another file descriptor with the same number then is\nregistered with libev, there is no efficient way to see that this is, in\nfact, a different file descriptor.\n\nTo avoid having to explicitly tell libev about such cases, libev follows\nthe following policy:  Each time C<ev_io_set> is being called, libev\nwill assume that this is potentially a new file descriptor, otherwise\nit is assumed that the file descriptor stays the same. That means that\nyou I<have> to call C<ev_io_set> (or C<ev_io_init>) when you change the\ndescriptor even if the file descriptor number itself did not change.\n\nThis is how one would do it normally anyway, the important point is that\nthe libev application should not optimise around libev but should leave\noptimisations to libev.\n\n=head3 The special problem of dup'ed file descriptors\n\nSome backends (e.g. epoll), cannot register events for file descriptors,\nbut only events for the underlying file descriptions. That means when you\nhave C<dup ()>'ed file descriptors or weirder constellations, and register\nevents for them, only one file descriptor might actually receive events.\n\nThere is no workaround possible except not registering events\nfor potentially C<dup ()>'ed file descriptors, or to resort to\nC<EVBACKEND_SELECT> or C<EVBACKEND_POLL>.\n\n=head3 The special problem of files\n\nMany people try to use C<select> (or libev) on file descriptors\nrepresenting files, and expect it to become ready when their program\ndoesn't block on disk accesses (which can take a long time on their own).\n\nHowever, this cannot ever work in the \"expected\" way - you get a readiness\nnotification as soon as the kernel knows whether and how much data is\nthere, and in the case of open files, that's always the case, so you\nalways get a readiness notification instantly, and your read (or possibly\nwrite) will still block on the disk I/O.\n\nAnother way to view it is that in the case of sockets, pipes, character\ndevices and so on, there is another party (the sender) that delivers data\non its own, but in the case of files, there is no such thing: the disk\nwill not send data on its own, simply because it doesn't know what you\nwish to read - you would first have to request some data.\n\nSince files are typically not-so-well supported by advanced notification\nmechanism, libev tries hard to emulate POSIX behaviour with respect\nto files, even though you should not use it. The reason for this is\nconvenience: sometimes you want to watch STDIN or STDOUT, which is\nusually a tty, often a pipe, but also sometimes files or special devices\n(for example, C<epoll> on Linux works with F</dev/random> but not with\nF</dev/urandom>), and even though the file might better be served with\nasynchronous I/O instead of with non-blocking I/O, it is still useful when\nit \"just works\" instead of freezing.\n\nSo avoid file descriptors pointing to files when you know it (e.g. use\nlibeio), but use them when it is convenient, e.g. for STDIN/STDOUT, or\nwhen you rarely read from a file instead of from a socket, and want to\nreuse the same code path.\n\n=head3 The special problem of fork\n\nSome backends (epoll, kqueue) do not support C<fork ()> at all or exhibit\nuseless behaviour. Libev fully supports fork, but needs to be told about\nit in the child if you want to continue to use it in the child.\n\nTo support fork in your child processes, you have to call C<ev_loop_fork\n()> after a fork in the child, enable C<EVFLAG_FORKCHECK>, or resort to\nC<EVBACKEND_SELECT> or C<EVBACKEND_POLL>.\n\n=head3 The special problem of SIGPIPE\n\nWhile not really specific to libev, it is easy to forget about C<SIGPIPE>:\nwhen writing to a pipe whose other end has been closed, your program gets\nsent a SIGPIPE, which, by default, aborts your program. For most programs\nthis is sensible behaviour, for daemons, this is usually undesirable.\n\nSo when you encounter spurious, unexplained daemon exits, make sure you\nignore SIGPIPE (and maybe make sure you log the exit status of your daemon\nsomewhere, as that would have given you a big clue).\n\n=head3 The special problem of accept()ing when you can't\n\nMany implementations of the POSIX C<accept> function (for example,\nfound in post-2004 Linux) have the peculiar behaviour of not removing a\nconnection from the pending queue in all error cases.\n\nFor example, larger servers often run out of file descriptors (because\nof resource limits), causing C<accept> to fail with C<ENFILE> but not\nrejecting the connection, leading to libev signalling readiness on\nthe next iteration again (the connection still exists after all), and\ntypically causing the program to loop at 100% CPU usage.\n\nUnfortunately, the set of errors that cause this issue differs between\noperating systems, there is usually little the app can do to remedy the\nsituation, and no known thread-safe method of removing the connection to\ncope with overload is known (to me).\n\nOne of the easiest ways to handle this situation is to just ignore it\n- when the program encounters an overload, it will just loop until the\nsituation is over. While this is a form of busy waiting, no OS offers an\nevent-based way to handle this situation, so it's the best one can do.\n\nA better way to handle the situation is to log any errors other than\nC<EAGAIN> and C<EWOULDBLOCK>, making sure not to flood the log with such\nmessages, and continue as usual, which at least gives the user an idea of\nwhat could be wrong (\"raise the ulimit!\"). For extra points one could stop\nthe C<ev_io> watcher on the listening fd \"for a while\", which reduces CPU\nusage.\n\nIf your program is single-threaded, then you could also keep a dummy file\ndescriptor for overload situations (e.g. by opening F</dev/null>), and\nwhen you run into C<ENFILE> or C<EMFILE>, close it, run C<accept>,\nclose that fd, and create a new dummy fd. This will gracefully refuse\nclients under typical overload conditions.\n\nThe last way to handle it is to simply log the error and C<exit>, as\nis often done with C<malloc> failures, but this results in an easy\nopportunity for a DoS attack.\n\n=head3 Watcher-Specific Functions\n\n=over 4\n\n=item ev_io_init (ev_io *, callback, int fd, int events)\n\n=item ev_io_set (ev_io *, int fd, int events)\n\nConfigures an C<ev_io> watcher. The C<fd> is the file descriptor to\nreceive events for and C<events> is either C<EV_READ>, C<EV_WRITE> or\nC<EV_READ | EV_WRITE>, to express the desire to receive the given events.\n\n=item int fd [read-only]\n\nThe file descriptor being watched.\n\n=item int events [read-only]\n\nThe events being watched.\n\n=back\n\n=head3 Examples\n\nExample: Call C<stdin_readable_cb> when STDIN_FILENO has become, well\nreadable, but only once. Since it is likely line-buffered, you could\nattempt to read a whole line in the callback.\n\n   static void\n   stdin_readable_cb (struct ev_loop *loop, ev_io *w, int revents)\n   {\n      ev_io_stop (loop, w);\n     .. read from stdin here (or from w->fd) and handle any I/O errors\n   }\n\n   ...\n   struct ev_loop *loop = ev_default_init (0);\n   ev_io stdin_readable;\n   ev_io_init (&stdin_readable, stdin_readable_cb, STDIN_FILENO, EV_READ);\n   ev_io_start (loop, &stdin_readable);\n   ev_run (loop, 0);\n\n\n=head2 C<ev_timer> - relative and optionally repeating timeouts\n\nTimer watchers are simple relative timers that generate an event after a\ngiven time, and optionally repeating in regular intervals after that.\n\nThe timers are based on real time, that is, if you register an event that\ntimes out after an hour and you reset your system clock to January last\nyear, it will still time out after (roughly) one hour. \"Roughly\" because\ndetecting time jumps is hard, and some inaccuracies are unavoidable (the\nmonotonic clock option helps a lot here).\n\nThe callback is guaranteed to be invoked only I<after> its timeout has\npassed (not I<at>, so on systems with very low-resolution clocks this\nmight introduce a small delay, see \"the special problem of being too\nearly\", below). If multiple timers become ready during the same loop\niteration then the ones with earlier time-out values are invoked before\nones of the same priority with later time-out values (but this is no\nlonger true when a callback calls C<ev_run> recursively).\n\n=head3 Be smart about timeouts\n\nMany real-world problems involve some kind of timeout, usually for error\nrecovery. A typical example is an HTTP request - if the other side hangs,\nyou want to raise some error after a while.\n\nWhat follows are some ways to handle this problem, from obvious and\ninefficient to smart and efficient.\n\nIn the following, a 60 second activity timeout is assumed - a timeout that\ngets reset to 60 seconds each time there is activity (e.g. each time some\ndata or other life sign was received).\n\n=over 4\n\n=item 1. Use a timer and stop, reinitialise and start it on activity.\n\nThis is the most obvious, but not the most simple way: In the beginning,\nstart the watcher:\n\n   ev_timer_init (timer, callback, 60., 0.);\n   ev_timer_start (loop, timer);\n\nThen, each time there is some activity, C<ev_timer_stop> it, initialise it\nand start it again:\n\n   ev_timer_stop (loop, timer);\n   ev_timer_set (timer, 60., 0.);\n   ev_timer_start (loop, timer);\n\nThis is relatively simple to implement, but means that each time there is\nsome activity, libev will first have to remove the timer from its internal\ndata structure and then add it again. Libev tries to be fast, but it's\nstill not a constant-time operation.\n\n=item 2. Use a timer and re-start it with C<ev_timer_again> inactivity.\n\nThis is the easiest way, and involves using C<ev_timer_again> instead of\nC<ev_timer_start>.\n\nTo implement this, configure an C<ev_timer> with a C<repeat> value\nof C<60> and then call C<ev_timer_again> at start and each time you\nsuccessfully read or write some data. If you go into an idle state where\nyou do not expect data to travel on the socket, you can C<ev_timer_stop>\nthe timer, and C<ev_timer_again> will automatically restart it if need be.\n\nThat means you can ignore both the C<ev_timer_start> function and the\nC<after> argument to C<ev_timer_set>, and only ever use the C<repeat>\nmember and C<ev_timer_again>.\n\nAt start:\n\n   ev_init (timer, callback);\n   timer->repeat = 60.;\n   ev_timer_again (loop, timer);\n\nEach time there is some activity:\n\n   ev_timer_again (loop, timer);\n\nIt is even possible to change the time-out on the fly, regardless of\nwhether the watcher is active or not:\n\n   timer->repeat = 30.;\n   ev_timer_again (loop, timer);\n\nThis is slightly more efficient then stopping/starting the timer each time\nyou want to modify its timeout value, as libev does not have to completely\nremove and re-insert the timer from/into its internal data structure.\n\nIt is, however, even simpler than the \"obvious\" way to do it.\n\n=item 3. Let the timer time out, but then re-arm it as required.\n\nThis method is more tricky, but usually most efficient: Most timeouts are\nrelatively long compared to the intervals between other activity - in\nour example, within 60 seconds, there are usually many I/O events with\nassociated activity resets.\n\nIn this case, it would be more efficient to leave the C<ev_timer> alone,\nbut remember the time of last activity, and check for a real timeout only\nwithin the callback:\n\n   ev_tstamp timeout = 60.;\n   ev_tstamp last_activity; // time of last activity\n   ev_timer timer;\n\n   static void\n   callback (EV_P_ ev_timer *w, int revents)\n   {\n     // calculate when the timeout would happen\n     ev_tstamp after = last_activity - ev_now (EV_A) + timeout;\n\n     // if negative, it means we the timeout already occurred\n     if (after < 0.)\n       {\n         // timeout occurred, take action\n       }\n     else\n       {\n         // callback was invoked, but there was some recent \n         // activity. simply restart the timer to time out\n         // after \"after\" seconds, which is the earliest time\n         // the timeout can occur.\n         ev_timer_set (w, after, 0.);\n         ev_timer_start (EV_A_ w);\n       }\n   }\n\nTo summarise the callback: first calculate in how many seconds the\ntimeout will occur (by calculating the absolute time when it would occur,\nC<last_activity + timeout>, and subtracting the current time, C<ev_now\n(EV_A)> from that).\n\nIf this value is negative, then we are already past the timeout, i.e. we\ntimed out, and need to do whatever is needed in this case.\n\nOtherwise, we now the earliest time at which the timeout would trigger,\nand simply start the timer with this timeout value.\n\nIn other words, each time the callback is invoked it will check whether\nthe timeout occurred. If not, it will simply reschedule itself to check\nagain at the earliest time it could time out. Rinse. Repeat.\n\nThis scheme causes more callback invocations (about one every 60 seconds\nminus half the average time between activity), but virtually no calls to\nlibev to change the timeout.\n\nTo start the machinery, simply initialise the watcher and set\nC<last_activity> to the current time (meaning there was some activity just\nnow), then call the callback, which will \"do the right thing\" and start\nthe timer:\n\n   last_activity = ev_now (EV_A);\n   ev_init (&timer, callback);\n   callback (EV_A_ &timer, 0);\n\nWhen there is some activity, simply store the current time in\nC<last_activity>, no libev calls at all:\n\n   if (activity detected)\n     last_activity = ev_now (EV_A);\n\nWhen your timeout value changes, then the timeout can be changed by simply\nproviding a new value, stopping the timer and calling the callback, which\nwill again do the right thing (for example, time out immediately :).\n\n   timeout = new_value;\n   ev_timer_stop (EV_A_ &timer);\n   callback (EV_A_ &timer, 0);\n\nThis technique is slightly more complex, but in most cases where the\ntime-out is unlikely to be triggered, much more efficient.\n\n=item 4. Wee, just use a double-linked list for your timeouts.\n\nIf there is not one request, but many thousands (millions...), all\nemploying some kind of timeout with the same timeout value, then one can\ndo even better:\n\nWhen starting the timeout, calculate the timeout value and put the timeout\nat the I<end> of the list.\n\nThen use an C<ev_timer> to fire when the timeout at the I<beginning> of\nthe list is expected to fire (for example, using the technique #3).\n\nWhen there is some activity, remove the timer from the list, recalculate\nthe timeout, append it to the end of the list again, and make sure to\nupdate the C<ev_timer> if it was taken from the beginning of the list.\n\nThis way, one can manage an unlimited number of timeouts in O(1) time for\nstarting, stopping and updating the timers, at the expense of a major\ncomplication, and having to use a constant timeout. The constant timeout\nensures that the list stays sorted.\n\n=back\n\nSo which method the best?\n\nMethod #2 is a simple no-brain-required solution that is adequate in most\nsituations. Method #3 requires a bit more thinking, but handles many cases\nbetter, and isn't very complicated either. In most case, choosing either\none is fine, with #3 being better in typical situations.\n\nMethod #1 is almost always a bad idea, and buys you nothing. Method #4 is\nrather complicated, but extremely efficient, something that really pays\noff after the first million or so of active timers, i.e. it's usually\noverkill :)\n\n=head3 The special problem of being too early\n\nIf you ask a timer to call your callback after three seconds, then\nyou expect it to be invoked after three seconds - but of course, this\ncannot be guaranteed to infinite precision. Less obviously, it cannot be\nguaranteed to any precision by libev - imagine somebody suspending the\nprocess with a STOP signal for a few hours for example.\n\nSo, libev tries to invoke your callback as soon as possible I<after> the\ndelay has occurred, but cannot guarantee this.\n\nA less obvious failure mode is calling your callback too early: many event\nloops compare timestamps with a \"elapsed delay >= requested delay\", but\nthis can cause your callback to be invoked much earlier than you would\nexpect.\n\nTo see why, imagine a system with a clock that only offers full second\nresolution (think windows if you can't come up with a broken enough OS\nyourself). If you schedule a one-second timer at the time 500.9, then the\nevent loop will schedule your timeout to elapse at a system time of 500\n(500.9 truncated to the resolution) + 1, or 501.\n\nIf an event library looks at the timeout 0.1s later, it will see \"501 >=\n501\" and invoke the callback 0.1s after it was started, even though a\none-second delay was requested - this is being \"too early\", despite best\nintentions.\n\nThis is the reason why libev will never invoke the callback if the elapsed\ndelay equals the requested delay, but only when the elapsed delay is\nlarger than the requested delay. In the example above, libev would only invoke\nthe callback at system time 502, or 1.1s after the timer was started.\n\nSo, while libev cannot guarantee that your callback will be invoked\nexactly when requested, it I<can> and I<does> guarantee that the requested\ndelay has actually elapsed, or in other words, it always errs on the \"too\nlate\" side of things.\n\n=head3 The special problem of time updates\n\nEstablishing the current time is a costly operation (it usually takes\nat least one system call): EV therefore updates its idea of the current\ntime only before and after C<ev_run> collects new events, which causes a\ngrowing difference between C<ev_now ()> and C<ev_time ()> when handling\nlots of events in one iteration.\n\nThe relative timeouts are calculated relative to the C<ev_now ()>\ntime. This is usually the right thing as this timestamp refers to the time\nof the event triggering whatever timeout you are modifying/starting. If\nyou suspect event processing to be delayed and you I<need> to base the\ntimeout on the current time, use something like the following to adjust\nfor it:\n\n   ev_timer_set (&timer, after + (ev_time () - ev_now ()), 0.);\n\nIf the event loop is suspended for a long time, you can also force an\nupdate of the time returned by C<ev_now ()> by calling C<ev_now_update\n()>, although that will push the event time of all outstanding events\nfurther into the future.\n\n=head3 The special problem of unsynchronised clocks\n\nModern systems have a variety of clocks - libev itself uses the normal\n\"wall clock\" clock and, if available, the monotonic clock (to avoid time\njumps).\n\nNeither of these clocks is synchronised with each other or any other clock\non the system, so C<ev_time ()> might return a considerably different time\nthan C<gettimeofday ()> or C<time ()>. On a GNU/Linux system, for example,\na call to C<gettimeofday> might return a second count that is one higher\nthan a directly following call to C<time>.\n\nThe moral of this is to only compare libev-related timestamps with\nC<ev_time ()> and C<ev_now ()>, at least if you want better precision than\na second or so.\n\nOne more problem arises due to this lack of synchronisation: if libev uses\nthe system monotonic clock and you compare timestamps from C<ev_time>\nor C<ev_now> from when you started your timer and when your callback is\ninvoked, you will find that sometimes the callback is a bit \"early\".\n\nThis is because C<ev_timer>s work in real time, not wall clock time, so\nlibev makes sure your callback is not invoked before the delay happened,\nI<measured according to the real time>, not the system clock.\n\nIf your timeouts are based on a physical timescale (e.g. \"time out this\nconnection after 100 seconds\") then this shouldn't bother you as it is\nexactly the right behaviour.\n\nIf you want to compare wall clock/system timestamps to your timers, then\nyou need to use C<ev_periodic>s, as these are based on the wall clock\ntime, where your comparisons will always generate correct results.\n\n=head3 The special problems of suspended animation\n\nWhen you leave the server world it is quite customary to hit machines that\ncan suspend/hibernate - what happens to the clocks during such a suspend?\n\nSome quick tests made with a Linux 2.6.28 indicate that a suspend freezes\nall processes, while the clocks (C<times>, C<CLOCK_MONOTONIC>) continue\nto run until the system is suspended, but they will not advance while the\nsystem is suspended. That means, on resume, it will be as if the program\nwas frozen for a few seconds, but the suspend time will not be counted\ntowards C<ev_timer> when a monotonic clock source is used. The real time\nclock advanced as expected, but if it is used as sole clocksource, then a\nlong suspend would be detected as a time jump by libev, and timers would\nbe adjusted accordingly.\n\nI would not be surprised to see different behaviour in different between\noperating systems, OS versions or even different hardware.\n\nThe other form of suspend (job control, or sending a SIGSTOP) will see a\ntime jump in the monotonic clocks and the realtime clock. If the program\nis suspended for a very long time, and monotonic clock sources are in use,\nthen you can expect C<ev_timer>s to expire as the full suspension time\nwill be counted towards the timers. When no monotonic clock source is in\nuse, then libev will again assume a timejump and adjust accordingly.\n\nIt might be beneficial for this latter case to call C<ev_suspend>\nand C<ev_resume> in code that handles C<SIGTSTP>, to at least get\ndeterministic behaviour in this case (you can do nothing against\nC<SIGSTOP>).\n\n=head3 Watcher-Specific Functions and Data Members\n\n=over 4\n\n=item ev_timer_init (ev_timer *, callback, ev_tstamp after, ev_tstamp repeat)\n\n=item ev_timer_set (ev_timer *, ev_tstamp after, ev_tstamp repeat)\n\nConfigure the timer to trigger after C<after> seconds. If C<repeat>\nis C<0.>, then it will automatically be stopped once the timeout is\nreached. If it is positive, then the timer will automatically be\nconfigured to trigger again C<repeat> seconds later, again, and again,\nuntil stopped manually.\n\nThe timer itself will do a best-effort at avoiding drift, that is, if\nyou configure a timer to trigger every 10 seconds, then it will normally\ntrigger at exactly 10 second intervals. If, however, your program cannot\nkeep up with the timer (because it takes longer than those 10 seconds to\ndo stuff) the timer will not fire more than once per event loop iteration.\n\n=item ev_timer_again (loop, ev_timer *)\n\nThis will act as if the timer timed out, and restarts it again if it is\nrepeating. It basically works like calling C<ev_timer_stop>, updating the\ntimeout to the C<repeat> value and calling C<ev_timer_start>.\n\nThe exact semantics are as in the following rules, all of which will be\napplied to the watcher:\n\n=over 4\n\n=item If the timer is pending, the pending status is always cleared.\n\n=item If the timer is started but non-repeating, stop it (as if it timed\nout, without invoking it).\n\n=item If the timer is repeating, make the C<repeat> value the new timeout\nand start the timer, if necessary.\n\n=back\n\nThis sounds a bit complicated, see L</Be smart about timeouts>, above, for a\nusage example.\n\n=item ev_tstamp ev_timer_remaining (loop, ev_timer *)\n\nReturns the remaining time until a timer fires. If the timer is active,\nthen this time is relative to the current event loop time, otherwise it's\nthe timeout value currently configured.\n\nThat is, after an C<ev_timer_set (w, 5, 7)>, C<ev_timer_remaining> returns\nC<5>. When the timer is started and one second passes, C<ev_timer_remaining>\nwill return C<4>. When the timer expires and is restarted, it will return\nroughly C<7> (likely slightly less as callback invocation takes some time,\ntoo), and so on.\n\n=item ev_tstamp repeat [read-write]\n\nThe current C<repeat> value. Will be used each time the watcher times out\nor C<ev_timer_again> is called, and determines the next timeout (if any),\nwhich is also when any modifications are taken into account.\n\n=back\n\n=head3 Examples\n\nExample: Create a timer that fires after 60 seconds.\n\n   static void\n   one_minute_cb (struct ev_loop *loop, ev_timer *w, int revents)\n   {\n     .. one minute over, w is actually stopped right here\n   }\n\n   ev_timer mytimer;\n   ev_timer_init (&mytimer, one_minute_cb, 60., 0.);\n   ev_timer_start (loop, &mytimer);\n\nExample: Create a timeout timer that times out after 10 seconds of\ninactivity.\n\n   static void\n   timeout_cb (struct ev_loop *loop, ev_timer *w, int revents)\n   {\n     .. ten seconds without any activity\n   }\n\n   ev_timer mytimer;\n   ev_timer_init (&mytimer, timeout_cb, 0., 10.); /* note, only repeat used */\n   ev_timer_again (&mytimer); /* start timer */\n   ev_run (loop, 0);\n\n   // and in some piece of code that gets executed on any \"activity\":\n   // reset the timeout to start ticking again at 10 seconds\n   ev_timer_again (&mytimer);\n\n\n=head2 C<ev_periodic> - to cron or not to cron?\n\nPeriodic watchers are also timers of a kind, but they are very versatile\n(and unfortunately a bit complex).\n\nUnlike C<ev_timer>, periodic watchers are not based on real time (or\nrelative time, the physical time that passes) but on wall clock time\n(absolute time, the thing you can read on your calender or clock). The\ndifference is that wall clock time can run faster or slower than real\ntime, and time jumps are not uncommon (e.g. when you adjust your\nwrist-watch).\n\nYou can tell a periodic watcher to trigger after some specific point\nin time: for example, if you tell a periodic watcher to trigger \"in 10\nseconds\" (by specifying e.g. C<ev_now () + 10.>, that is, an absolute time\nnot a delay) and then reset your system clock to January of the previous\nyear, then it will take a year or more to trigger the event (unlike an\nC<ev_timer>, which would still trigger roughly 10 seconds after starting\nit, as it uses a relative timeout).\n\nC<ev_periodic> watchers can also be used to implement vastly more complex\ntimers, such as triggering an event on each \"midnight, local time\", or\nother complicated rules. This cannot be done with C<ev_timer> watchers, as\nthose cannot react to time jumps.\n\nAs with timers, the callback is guaranteed to be invoked only when the\npoint in time where it is supposed to trigger has passed. If multiple\ntimers become ready during the same loop iteration then the ones with\nearlier time-out values are invoked before ones with later time-out values\n(but this is no longer true when a callback calls C<ev_run> recursively).\n\n=head3 Watcher-Specific Functions and Data Members\n\n=over 4\n\n=item ev_periodic_init (ev_periodic *, callback, ev_tstamp offset, ev_tstamp interval, reschedule_cb)\n\n=item ev_periodic_set (ev_periodic *, ev_tstamp offset, ev_tstamp interval, reschedule_cb)\n\nLots of arguments, let's sort it out... There are basically three modes of\noperation, and we will explain them from simplest to most complex:\n\n=over 4\n\n=item * absolute timer (offset = absolute time, interval = 0, reschedule_cb = 0)\n\nIn this configuration the watcher triggers an event after the wall clock\ntime C<offset> has passed. It will not repeat and will not adjust when a\ntime jump occurs, that is, if it is to be run at January 1st 2011 then it\nwill be stopped and invoked when the system clock reaches or surpasses\nthis point in time.\n\n=item * repeating interval timer (offset = offset within interval, interval > 0, reschedule_cb = 0)\n\nIn this mode the watcher will always be scheduled to time out at the next\nC<offset + N * interval> time (for some integer N, which can also be\nnegative) and then repeat, regardless of any time jumps. The C<offset>\nargument is merely an offset into the C<interval> periods.\n\nThis can be used to create timers that do not drift with respect to the\nsystem clock, for example, here is an C<ev_periodic> that triggers each\nhour, on the hour (with respect to UTC):\n\n   ev_periodic_set (&periodic, 0., 3600., 0);\n\nThis doesn't mean there will always be 3600 seconds in between triggers,\nbut only that the callback will be called when the system time shows a\nfull hour (UTC), or more correctly, when the system time is evenly divisible\nby 3600.\n\nAnother way to think about it (for the mathematically inclined) is that\nC<ev_periodic> will try to run the callback in this mode at the next possible\ntime where C<time = offset (mod interval)>, regardless of any time jumps.\n\nThe C<interval> I<MUST> be positive, and for numerical stability, the\ninterval value should be higher than C<1/8192> (which is around 100\nmicroseconds) and C<offset> should be higher than C<0> and should have\nat most a similar magnitude as the current time (say, within a factor of\nten). Typical values for offset are, in fact, C<0> or something between\nC<0> and C<interval>, which is also the recommended range.\n\nNote also that there is an upper limit to how often a timer can fire (CPU\nspeed for example), so if C<interval> is very small then timing stability\nwill of course deteriorate. Libev itself tries to be exact to be about one\nmillisecond (if the OS supports it and the machine is fast enough).\n\n=item * manual reschedule mode (offset ignored, interval ignored, reschedule_cb = callback)\n\nIn this mode the values for C<interval> and C<offset> are both being\nignored. Instead, each time the periodic watcher gets scheduled, the\nreschedule callback will be called with the watcher as first, and the\ncurrent time as second argument.\n\nNOTE: I<This callback MUST NOT stop or destroy any periodic watcher, ever,\nor make ANY other event loop modifications whatsoever, unless explicitly\nallowed by documentation here>.\n\nIf you need to stop it, return C<now + 1e30> (or so, fudge fudge) and stop\nit afterwards (e.g. by starting an C<ev_prepare> watcher, which is the\nonly event loop modification you are allowed to do).\n\nThe callback prototype is C<ev_tstamp (*reschedule_cb)(ev_periodic\n*w, ev_tstamp now)>, e.g.:\n\n   static ev_tstamp\n   my_rescheduler (ev_periodic *w, ev_tstamp now)\n   {\n     return now + 60.;\n   }\n\nIt must return the next time to trigger, based on the passed time value\n(that is, the lowest time value larger than to the second argument). It\nwill usually be called just before the callback will be triggered, but\nmight be called at other times, too.\n\nNOTE: I<< This callback must always return a time that is higher than or\nequal to the passed C<now> value >>.\n\nThis can be used to create very complex timers, such as a timer that\ntriggers on \"next midnight, local time\". To do this, you would calculate the\nnext midnight after C<now> and return the timestamp value for this. How\nyou do this is, again, up to you (but it is not trivial, which is the main\nreason I omitted it as an example).\n\n=back\n\n=item ev_periodic_again (loop, ev_periodic *)\n\nSimply stops and restarts the periodic watcher again. This is only useful\nwhen you changed some parameters or the reschedule callback would return\na different time than the last time it was called (e.g. in a crond like\nprogram when the crontabs have changed).\n\n=item ev_tstamp ev_periodic_at (ev_periodic *)\n\nWhen active, returns the absolute time that the watcher is supposed\nto trigger next. This is not the same as the C<offset> argument to\nC<ev_periodic_set>, but indeed works even in interval and manual\nrescheduling modes.\n\n=item ev_tstamp offset [read-write]\n\nWhen repeating, this contains the offset value, otherwise this is the\nabsolute point in time (the C<offset> value passed to C<ev_periodic_set>,\nalthough libev might modify this value for better numerical stability).\n\nCan be modified any time, but changes only take effect when the periodic\ntimer fires or C<ev_periodic_again> is being called.\n\n=item ev_tstamp interval [read-write]\n\nThe current interval value. Can be modified any time, but changes only\ntake effect when the periodic timer fires or C<ev_periodic_again> is being\ncalled.\n\n=item ev_tstamp (*reschedule_cb)(ev_periodic *w, ev_tstamp now) [read-write]\n\nThe current reschedule callback, or C<0>, if this functionality is\nswitched off. Can be changed any time, but changes only take effect when\nthe periodic timer fires or C<ev_periodic_again> is being called.\n\n=back\n\n=head3 Examples\n\nExample: Call a callback every hour, or, more precisely, whenever the\nsystem time is divisible by 3600. The callback invocation times have\npotentially a lot of jitter, but good long-term stability.\n\n   static void\n   clock_cb (struct ev_loop *loop, ev_periodic *w, int revents)\n   {\n     ... its now a full hour (UTC, or TAI or whatever your clock follows)\n   }\n\n   ev_periodic hourly_tick;\n   ev_periodic_init (&hourly_tick, clock_cb, 0., 3600., 0);\n   ev_periodic_start (loop, &hourly_tick);\n\nExample: The same as above, but use a reschedule callback to do it:\n\n   #include <math.h>\n\n   static ev_tstamp\n   my_scheduler_cb (ev_periodic *w, ev_tstamp now)\n   {\n     return now + (3600. - fmod (now, 3600.));\n   }\n\n   ev_periodic_init (&hourly_tick, clock_cb, 0., 0., my_scheduler_cb);\n\nExample: Call a callback every hour, starting now:\n\n   ev_periodic hourly_tick;\n   ev_periodic_init (&hourly_tick, clock_cb,\n                     fmod (ev_now (loop), 3600.), 3600., 0);\n   ev_periodic_start (loop, &hourly_tick);\n\n\n=head2 C<ev_signal> - signal me when a signal gets signalled!\n\nSignal watchers will trigger an event when the process receives a specific\nsignal one or more times. Even though signals are very asynchronous, libev\nwill try its best to deliver signals synchronously, i.e. as part of the\nnormal event processing, like any other event.\n\nIf you want signals to be delivered truly asynchronously, just use\nC<sigaction> as you would do without libev and forget about sharing\nthe signal. You can even use C<ev_async> from a signal handler to\nsynchronously wake up an event loop.\n\nYou can configure as many watchers as you like for the same signal, but\nonly within the same loop, i.e. you can watch for C<SIGINT> in your\ndefault loop and for C<SIGIO> in another loop, but you cannot watch for\nC<SIGINT> in both the default loop and another loop at the same time. At\nthe moment, C<SIGCHLD> is permanently tied to the default loop.\n\nOnly after the first watcher for a signal is started will libev actually\nregister something with the kernel. It thus coexists with your own signal\nhandlers as long as you don't register any with libev for the same signal.\n\nIf possible and supported, libev will install its handlers with\nC<SA_RESTART> (or equivalent) behaviour enabled, so system calls should\nnot be unduly interrupted. If you have a problem with system calls getting\ninterrupted by signals you can block all signals in an C<ev_check> watcher\nand unblock them in an C<ev_prepare> watcher.\n\n=head3 The special problem of inheritance over fork/execve/pthread_create\n\nBoth the signal mask (C<sigprocmask>) and the signal disposition\n(C<sigaction>) are unspecified after starting a signal watcher (and after\nstopping it again), that is, libev might or might not block the signal,\nand might or might not set or restore the installed signal handler (but\nsee C<EVFLAG_NOSIGMASK>).\n\nWhile this does not matter for the signal disposition (libev never\nsets signals to C<SIG_IGN>, so handlers will be reset to C<SIG_DFL> on\nC<execve>), this matters for the signal mask: many programs do not expect\ncertain signals to be blocked.\n\nThis means that before calling C<exec> (from the child) you should reset\nthe signal mask to whatever \"default\" you expect (all clear is a good\nchoice usually).\n\nThe simplest way to ensure that the signal mask is reset in the child is\nto install a fork handler with C<pthread_atfork> that resets it. That will\ncatch fork calls done by libraries (such as the libc) as well.\n\nIn current versions of libev, the signal will not be blocked indefinitely\nunless you use the C<signalfd> API (C<EV_SIGNALFD>). While this reduces\nthe window of opportunity for problems, it will not go away, as libev\nI<has> to modify the signal mask, at least temporarily.\n\nSo I can't stress this enough: I<If you do not reset your signal mask when\nyou expect it to be empty, you have a race condition in your code>. This\nis not a libev-specific thing, this is true for most event libraries.\n\n=head3 The special problem of threads signal handling\n\nPOSIX threads has problematic signal handling semantics, specifically,\na lot of functionality (sigfd, sigwait etc.) only really works if all\nthreads in a process block signals, which is hard to achieve.\n\nWhen you want to use sigwait (or mix libev signal handling with your own\nfor the same signals), you can tackle this problem by globally blocking\nall signals before creating any threads (or creating them with a fully set\nsigprocmask) and also specifying the C<EVFLAG_NOSIGMASK> when creating\nloops. Then designate one thread as \"signal receiver thread\" which handles\nthese signals. You can pass on any signals that libev might be interested\nin by calling C<ev_feed_signal>.\n\n=head3 Watcher-Specific Functions and Data Members\n\n=over 4\n\n=item ev_signal_init (ev_signal *, callback, int signum)\n\n=item ev_signal_set (ev_signal *, int signum)\n\nConfigures the watcher to trigger on the given signal number (usually one\nof the C<SIGxxx> constants).\n\n=item int signum [read-only]\n\nThe signal the watcher watches out for.\n\n=back\n\n=head3 Examples\n\nExample: Try to exit cleanly on SIGINT.\n\n   static void\n   sigint_cb (struct ev_loop *loop, ev_signal *w, int revents)\n   {\n     ev_break (loop, EVBREAK_ALL);\n   }\n\n   ev_signal signal_watcher;\n   ev_signal_init (&signal_watcher, sigint_cb, SIGINT);\n   ev_signal_start (loop, &signal_watcher);\n\n\n=head2 C<ev_child> - watch out for process status changes\n\nChild watchers trigger when your process receives a SIGCHLD in response to\nsome child status changes (most typically when a child of yours dies or\nexits). It is permissible to install a child watcher I<after> the child\nhas been forked (which implies it might have already exited), as long\nas the event loop isn't entered (or is continued from a watcher), i.e.,\nforking and then immediately registering a watcher for the child is fine,\nbut forking and registering a watcher a few event loop iterations later or\nin the next callback invocation is not.\n\nOnly the default event loop is capable of handling signals, and therefore\nyou can only register child watchers in the default event loop.\n\nDue to some design glitches inside libev, child watchers will always be\nhandled at maximum priority (their priority is set to C<EV_MAXPRI> by\nlibev)\n\n=head3 Process Interaction\n\nLibev grabs C<SIGCHLD> as soon as the default event loop is\ninitialised. This is necessary to guarantee proper behaviour even if the\nfirst child watcher is started after the child exits. The occurrence\nof C<SIGCHLD> is recorded asynchronously, but child reaping is done\nsynchronously as part of the event loop processing. Libev always reaps all\nchildren, even ones not watched.\n\n=head3 Overriding the Built-In Processing\n\nLibev offers no special support for overriding the built-in child\nprocessing, but if your application collides with libev's default child\nhandler, you can override it easily by installing your own handler for\nC<SIGCHLD> after initialising the default loop, and making sure the\ndefault loop never gets destroyed. You are encouraged, however, to use an\nevent-based approach to child reaping and thus use libev's support for\nthat, so other libev users can use C<ev_child> watchers freely.\n\n=head3 Stopping the Child Watcher\n\nCurrently, the child watcher never gets stopped, even when the\nchild terminates, so normally one needs to stop the watcher in the\ncallback. Future versions of libev might stop the watcher automatically\nwhen a child exit is detected (calling C<ev_child_stop> twice is not a\nproblem).\n\n=head3 Watcher-Specific Functions and Data Members\n\n=over 4\n\n=item ev_child_init (ev_child *, callback, int pid, int trace)\n\n=item ev_child_set (ev_child *, int pid, int trace)\n\nConfigures the watcher to wait for status changes of process C<pid> (or\nI<any> process if C<pid> is specified as C<0>). The callback can look\nat the C<rstatus> member of the C<ev_child> watcher structure to see\nthe status word (use the macros from C<sys/wait.h> and see your systems\nC<waitpid> documentation). The C<rpid> member contains the pid of the\nprocess causing the status change. C<trace> must be either C<0> (only\nactivate the watcher when the process terminates) or C<1> (additionally\nactivate the watcher when the process is stopped or continued).\n\n=item int pid [read-only]\n\nThe process id this watcher watches out for, or C<0>, meaning any process id.\n\n=item int rpid [read-write]\n\nThe process id that detected a status change.\n\n=item int rstatus [read-write]\n\nThe process exit/trace status caused by C<rpid> (see your systems\nC<waitpid> and C<sys/wait.h> documentation for details).\n\n=back\n\n=head3 Examples\n\nExample: C<fork()> a new process and install a child handler to wait for\nits completion.\n\n   ev_child cw;\n\n   static void\n   child_cb (EV_P_ ev_child *w, int revents)\n   {\n     ev_child_stop (EV_A_ w);\n     printf (\"process %d exited with status %x\\n\", w->rpid, w->rstatus);\n   }\n\n   pid_t pid = fork ();\n\n   if (pid < 0)\n     // error\n   else if (pid == 0)\n     {\n       // the forked child executes here\n       exit (1);\n     }\n   else\n     {\n       ev_child_init (&cw, child_cb, pid, 0);\n       ev_child_start (EV_DEFAULT_ &cw);\n     }\n\n\n=head2 C<ev_stat> - did the file attributes just change?\n\nThis watches a file system path for attribute changes. That is, it calls\nC<stat> on that path in regular intervals (or when the OS says it changed)\nand sees if it changed compared to the last time, invoking the callback\nif it did. Starting the watcher C<stat>'s the file, so only changes that\nhappen after the watcher has been started will be reported.\n\nThe path does not need to exist: changing from \"path exists\" to \"path does\nnot exist\" is a status change like any other. The condition \"path does not\nexist\" (or more correctly \"path cannot be stat'ed\") is signified by the\nC<st_nlink> field being zero (which is otherwise always forced to be at\nleast one) and all the other fields of the stat buffer having unspecified\ncontents.\n\nThe path I<must not> end in a slash or contain special components such as\nC<.> or C<..>. The path I<should> be absolute: If it is relative and\nyour working directory changes, then the behaviour is undefined.\n\nSince there is no portable change notification interface available, the\nportable implementation simply calls C<stat(2)> regularly on the path\nto see if it changed somehow. You can specify a recommended polling\ninterval for this case. If you specify a polling interval of C<0> (highly\nrecommended!) then a I<suitable, unspecified default> value will be used\n(which you can expect to be around five seconds, although this might\nchange dynamically). Libev will also impose a minimum interval which is\ncurrently around C<0.1>, but that's usually overkill.\n\nThis watcher type is not meant for massive numbers of stat watchers,\nas even with OS-supported change notifications, this can be\nresource-intensive.\n\nAt the time of this writing, the only OS-specific interface implemented\nis the Linux inotify interface (implementing kqueue support is left as an\nexercise for the reader. Note, however, that the author sees no way of\nimplementing C<ev_stat> semantics with kqueue, except as a hint).\n\n=head3 ABI Issues (Largefile Support)\n\nLibev by default (unless the user overrides this) uses the default\ncompilation environment, which means that on systems with large file\nsupport disabled by default, you get the 32 bit version of the stat\nstructure. When using the library from programs that change the ABI to\nuse 64 bit file offsets the programs will fail. In that case you have to\ncompile libev with the same flags to get binary compatibility. This is\nobviously the case with any flags that change the ABI, but the problem is\nmost noticeably displayed with ev_stat and large file support.\n\nThe solution for this is to lobby your distribution maker to make large\nfile interfaces available by default (as e.g. FreeBSD does) and not\noptional. Libev cannot simply switch on large file support because it has\nto exchange stat structures with application programs compiled using the\ndefault compilation environment.\n\n=head3 Inotify and Kqueue\n\nWhen C<inotify (7)> support has been compiled into libev and present at\nruntime, it will be used to speed up change detection where possible. The\ninotify descriptor will be created lazily when the first C<ev_stat>\nwatcher is being started.\n\nInotify presence does not change the semantics of C<ev_stat> watchers\nexcept that changes might be detected earlier, and in some cases, to avoid\nmaking regular C<stat> calls. Even in the presence of inotify support\nthere are many cases where libev has to resort to regular C<stat> polling,\nbut as long as kernel 2.6.25 or newer is used (2.6.24 and older have too\nmany bugs), the path exists (i.e. stat succeeds), and the path resides on\na local filesystem (libev currently assumes only ext2/3, jfs, reiserfs and\nxfs are fully working) libev usually gets away without polling.\n\nThere is no support for kqueue, as apparently it cannot be used to\nimplement this functionality, due to the requirement of having a file\ndescriptor open on the object at all times, and detecting renames, unlinks\netc. is difficult.\n\n=head3 C<stat ()> is a synchronous operation\n\nLibev doesn't normally do any kind of I/O itself, and so is not blocking\nthe process. The exception are C<ev_stat> watchers - those call C<stat\n()>, which is a synchronous operation.\n\nFor local paths, this usually doesn't matter: unless the system is very\nbusy or the intervals between stat's are large, a stat call will be fast,\nas the path data is usually in memory already (except when starting the\nwatcher).\n\nFor networked file systems, calling C<stat ()> can block an indefinite\ntime due to network issues, and even under good conditions, a stat call\noften takes multiple milliseconds.\n\nTherefore, it is best to avoid using C<ev_stat> watchers on networked\npaths, although this is fully supported by libev.\n\n=head3 The special problem of stat time resolution\n\nThe C<stat ()> system call only supports full-second resolution portably,\nand even on systems where the resolution is higher, most file systems\nstill only support whole seconds.\n\nThat means that, if the time is the only thing that changes, you can\neasily miss updates: on the first update, C<ev_stat> detects a change and\ncalls your callback, which does something. When there is another update\nwithin the same second, C<ev_stat> will be unable to detect unless the\nstat data does change in other ways (e.g. file size).\n\nThe solution to this is to delay acting on a change for slightly more\nthan a second (or till slightly after the next full second boundary), using\na roughly one-second-delay C<ev_timer> (e.g. C<ev_timer_set (w, 0., 1.02);\nev_timer_again (loop, w)>).\n\nThe C<.02> offset is added to work around small timing inconsistencies\nof some operating systems (where the second counter of the current time\nmight be be delayed. One such system is the Linux kernel, where a call to\nC<gettimeofday> might return a timestamp with a full second later than\na subsequent C<time> call - if the equivalent of C<time ()> is used to\nupdate file times then there will be a small window where the kernel uses\nthe previous second to update file times but libev might already execute\nthe timer callback).\n\n=head3 Watcher-Specific Functions and Data Members\n\n=over 4\n\n=item ev_stat_init (ev_stat *, callback, const char *path, ev_tstamp interval)\n\n=item ev_stat_set (ev_stat *, const char *path, ev_tstamp interval)\n\nConfigures the watcher to wait for status changes of the given\nC<path>. The C<interval> is a hint on how quickly a change is expected to\nbe detected and should normally be specified as C<0> to let libev choose\na suitable value. The memory pointed to by C<path> must point to the same\npath for as long as the watcher is active.\n\nThe callback will receive an C<EV_STAT> event when a change was detected,\nrelative to the attributes at the time the watcher was started (or the\nlast change was detected).\n\n=item ev_stat_stat (loop, ev_stat *)\n\nUpdates the stat buffer immediately with new values. If you change the\nwatched path in your callback, you could call this function to avoid\ndetecting this change (while introducing a race condition if you are not\nthe only one changing the path). Can also be useful simply to find out the\nnew values.\n\n=item ev_statdata attr [read-only]\n\nThe most-recently detected attributes of the file. Although the type is\nC<ev_statdata>, this is usually the (or one of the) C<struct stat> types\nsuitable for your system, but you can only rely on the POSIX-standardised\nmembers to be present. If the C<st_nlink> member is C<0>, then there was\nsome error while C<stat>ing the file.\n\n=item ev_statdata prev [read-only]\n\nThe previous attributes of the file. The callback gets invoked whenever\nC<prev> != C<attr>, or, more precisely, one or more of these members\ndiffer: C<st_dev>, C<st_ino>, C<st_mode>, C<st_nlink>, C<st_uid>,\nC<st_gid>, C<st_rdev>, C<st_size>, C<st_atime>, C<st_mtime>, C<st_ctime>.\n\n=item ev_tstamp interval [read-only]\n\nThe specified interval.\n\n=item const char *path [read-only]\n\nThe file system path that is being watched.\n\n=back\n\n=head3 Examples\n\nExample: Watch C</etc/passwd> for attribute changes.\n\n   static void\n   passwd_cb (struct ev_loop *loop, ev_stat *w, int revents)\n   {\n     /* /etc/passwd changed in some way */\n     if (w->attr.st_nlink)\n       {\n         printf (\"passwd current size  %ld\\n\", (long)w->attr.st_size);\n         printf (\"passwd current atime %ld\\n\", (long)w->attr.st_mtime);\n         printf (\"passwd current mtime %ld\\n\", (long)w->attr.st_mtime);\n       }\n     else\n       /* you shalt not abuse printf for puts */\n       puts (\"wow, /etc/passwd is not there, expect problems. \"\n             \"if this is windows, they already arrived\\n\");\n   }\n\n   ...\n   ev_stat passwd;\n\n   ev_stat_init (&passwd, passwd_cb, \"/etc/passwd\", 0.);\n   ev_stat_start (loop, &passwd);\n\nExample: Like above, but additionally use a one-second delay so we do not\nmiss updates (however, frequent updates will delay processing, too, so\none might do the work both on C<ev_stat> callback invocation I<and> on\nC<ev_timer> callback invocation).\n\n   static ev_stat passwd;\n   static ev_timer timer;\n\n   static void\n   timer_cb (EV_P_ ev_timer *w, int revents)\n   {\n     ev_timer_stop (EV_A_ w);\n\n     /* now it's one second after the most recent passwd change */\n   }\n\n   static void\n   stat_cb (EV_P_ ev_stat *w, int revents)\n   {\n     /* reset the one-second timer */\n     ev_timer_again (EV_A_ &timer);\n   }\n\n   ...\n   ev_stat_init (&passwd, stat_cb, \"/etc/passwd\", 0.);\n   ev_stat_start (loop, &passwd);\n   ev_timer_init (&timer, timer_cb, 0., 1.02);\n\n\n=head2 C<ev_idle> - when you've got nothing better to do...\n\nIdle watchers trigger events when no other events of the same or higher\npriority are pending (prepare, check and other idle watchers do not count\nas receiving \"events\").\n\nThat is, as long as your process is busy handling sockets or timeouts\n(or even signals, imagine) of the same or higher priority it will not be\ntriggered. But when your process is idle (or only lower-priority watchers\nare pending), the idle watchers are being called once per event loop\niteration - until stopped, that is, or your process receives more events\nand becomes busy again with higher priority stuff.\n\nThe most noteworthy effect is that as long as any idle watchers are\nactive, the process will not block when waiting for new events.\n\nApart from keeping your process non-blocking (which is a useful\neffect on its own sometimes), idle watchers are a good place to do\n\"pseudo-background processing\", or delay processing stuff to after the\nevent loop has handled all outstanding events.\n\n=head3 Abusing an C<ev_idle> watcher for its side-effect\n\nAs long as there is at least one active idle watcher, libev will never\nsleep unnecessarily. Or in other words, it will loop as fast as possible.\nFor this to work, the idle watcher doesn't need to be invoked at all - the\nlowest priority will do.\n\nThis mode of operation can be useful together with an C<ev_check> watcher,\nto do something on each event loop iteration - for example to balance load\nbetween different connections.\n\nSee L</Abusing an ev_check watcher for its side-effect> for a longer\nexample.\n\n=head3 Watcher-Specific Functions and Data Members\n\n=over 4\n\n=item ev_idle_init (ev_idle *, callback)\n\nInitialises and configures the idle watcher - it has no parameters of any\nkind. There is a C<ev_idle_set> macro, but using it is utterly pointless,\nbelieve me.\n\n=back\n\n=head3 Examples\n\nExample: Dynamically allocate an C<ev_idle> watcher, start it, and in the\ncallback, free it. Also, use no error checking, as usual.\n\n   static void\n   idle_cb (struct ev_loop *loop, ev_idle *w, int revents)\n   {\n     // stop the watcher\n     ev_idle_stop (loop, w);\n\n     // now we can free it\n     free (w);\n\n     // now do something you wanted to do when the program has\n     // no longer anything immediate to do.\n   }\n\n   ev_idle *idle_watcher = malloc (sizeof (ev_idle));\n   ev_idle_init (idle_watcher, idle_cb);\n   ev_idle_start (loop, idle_watcher);\n\n\n=head2 C<ev_prepare> and C<ev_check> - customise your event loop!\n\nPrepare and check watchers are often (but not always) used in pairs:\nprepare watchers get invoked before the process blocks and check watchers\nafterwards.\n\nYou I<must not> call C<ev_run> (or similar functions that enter the\ncurrent event loop) or C<ev_loop_fork> from either C<ev_prepare> or\nC<ev_check> watchers. Other loops than the current one are fine,\nhowever. The rationale behind this is that you do not need to check\nfor recursion in those watchers, i.e. the sequence will always be\nC<ev_prepare>, blocking, C<ev_check> so if you have one watcher of each\nkind they will always be called in pairs bracketing the blocking call.\n\nTheir main purpose is to integrate other event mechanisms into libev and\ntheir use is somewhat advanced. They could be used, for example, to track\nvariable changes, implement your own watchers, integrate net-snmp or a\ncoroutine library and lots more. They are also occasionally useful if\nyou cache some data and want to flush it before blocking (for example,\nin X programs you might want to do an C<XFlush ()> in an C<ev_prepare>\nwatcher).\n\nThis is done by examining in each prepare call which file descriptors\nneed to be watched by the other library, registering C<ev_io> watchers\nfor them and starting an C<ev_timer> watcher for any timeouts (many\nlibraries provide exactly this functionality). Then, in the check watcher,\nyou check for any events that occurred (by checking the pending status\nof all watchers and stopping them) and call back into the library. The\nI/O and timer callbacks will never actually be called (but must be valid\nnevertheless, because you never know, you know?).\n\nAs another example, the Perl Coro module uses these hooks to integrate\ncoroutines into libev programs, by yielding to other active coroutines\nduring each prepare and only letting the process block if no coroutines\nare ready to run (it's actually more complicated: it only runs coroutines\nwith priority higher than or equal to the event loop and one coroutine\nof lower priority, but only once, using idle watchers to keep the event\nloop from blocking if lower-priority coroutines are active, thus mapping\nlow-priority coroutines to idle/background tasks).\n\nWhen used for this purpose, it is recommended to give C<ev_check> watchers\nhighest (C<EV_MAXPRI>) priority, to ensure that they are being run before\nany other watchers after the poll (this doesn't matter for C<ev_prepare>\nwatchers).\n\nAlso, C<ev_check> watchers (and C<ev_prepare> watchers, too) should not\nactivate (\"feed\") events into libev. While libev fully supports this, they\nmight get executed before other C<ev_check> watchers did their job. As\nC<ev_check> watchers are often used to embed other (non-libev) event\nloops those other event loops might be in an unusable state until their\nC<ev_check> watcher ran (always remind yourself to coexist peacefully with\nothers).\n\n=head3 Abusing an C<ev_check> watcher for its side-effect\n\nC<ev_check> (and less often also C<ev_prepare>) watchers can also be\nuseful because they are called once per event loop iteration. For\nexample, if you want to handle a large number of connections fairly, you\nnormally only do a bit of work for each active connection, and if there\nis more work to do, you wait for the next event loop iteration, so other\nconnections have a chance of making progress.\n\nUsing an C<ev_check> watcher is almost enough: it will be called on the\nnext event loop iteration. However, that isn't as soon as possible -\nwithout external events, your C<ev_check> watcher will not be invoked.\n\nThis is where C<ev_idle> watchers come in handy - all you need is a\nsingle global idle watcher that is active as long as you have one active\nC<ev_check> watcher. The C<ev_idle> watcher makes sure the event loop\nwill not sleep, and the C<ev_check> watcher makes sure a callback gets\ninvoked. Neither watcher alone can do that.\n\n=head3 Watcher-Specific Functions and Data Members\n\n=over 4\n\n=item ev_prepare_init (ev_prepare *, callback)\n\n=item ev_check_init (ev_check *, callback)\n\nInitialises and configures the prepare or check watcher - they have no\nparameters of any kind. There are C<ev_prepare_set> and C<ev_check_set>\nmacros, but using them is utterly, utterly, utterly and completely\npointless.\n\n=back\n\n=head3 Examples\n\nThere are a number of principal ways to embed other event loops or modules\ninto libev. Here are some ideas on how to include libadns into libev\n(there is a Perl module named C<EV::ADNS> that does this, which you could\nuse as a working example. Another Perl module named C<EV::Glib> embeds a\nGlib main context into libev, and finally, C<Glib::EV> embeds EV into the\nGlib event loop).\n\nMethod 1: Add IO watchers and a timeout watcher in a prepare handler,\nand in a check watcher, destroy them and call into libadns. What follows\nis pseudo-code only of course. This requires you to either use a low\npriority for the check watcher or use C<ev_clear_pending> explicitly, as\nthe callbacks for the IO/timeout watchers might not have been called yet.\n\n   static ev_io iow [nfd];\n   static ev_timer tw;\n\n   static void\n   io_cb (struct ev_loop *loop, ev_io *w, int revents)\n   {\n   }\n\n   // create io watchers for each fd and a timer before blocking\n   static void\n   adns_prepare_cb (struct ev_loop *loop, ev_prepare *w, int revents)\n   {\n     int timeout = 3600000;\n     struct pollfd fds [nfd];\n     // actual code will need to loop here and realloc etc.\n     adns_beforepoll (ads, fds, &nfd, &timeout, timeval_from (ev_time ()));\n\n     /* the callback is illegal, but won't be called as we stop during check */\n     ev_timer_init (&tw, 0, timeout * 1e-3, 0.);\n     ev_timer_start (loop, &tw);\n\n     // create one ev_io per pollfd\n     for (int i = 0; i < nfd; ++i)\n       {\n         ev_io_init (iow + i, io_cb, fds [i].fd,\n           ((fds [i].events & POLLIN ? EV_READ : 0)\n            | (fds [i].events & POLLOUT ? EV_WRITE : 0)));\n\n         fds [i].revents = 0;\n         ev_io_start (loop, iow + i);\n       }\n   }\n\n   // stop all watchers after blocking\n   static void\n   adns_check_cb (struct ev_loop *loop, ev_check *w, int revents)\n   {\n     ev_timer_stop (loop, &tw);\n\n     for (int i = 0; i < nfd; ++i)\n       {\n         // set the relevant poll flags\n         // could also call adns_processreadable etc. here\n         struct pollfd *fd = fds + i;\n         int revents = ev_clear_pending (iow + i);\n         if (revents & EV_READ ) fd->revents |= fd->events & POLLIN;\n         if (revents & EV_WRITE) fd->revents |= fd->events & POLLOUT;\n\n         // now stop the watcher\n         ev_io_stop (loop, iow + i);\n       }\n\n     adns_afterpoll (adns, fds, nfd, timeval_from (ev_now (loop));\n   }\n\nMethod 2: This would be just like method 1, but you run C<adns_afterpoll>\nin the prepare watcher and would dispose of the check watcher.\n\nMethod 3: If the module to be embedded supports explicit event\nnotification (libadns does), you can also make use of the actual watcher\ncallbacks, and only destroy/create the watchers in the prepare watcher.\n\n   static void\n   timer_cb (EV_P_ ev_timer *w, int revents)\n   {\n     adns_state ads = (adns_state)w->data;\n     update_now (EV_A);\n\n     adns_processtimeouts (ads, &tv_now);\n   }\n\n   static void\n   io_cb (EV_P_ ev_io *w, int revents)\n   {\n     adns_state ads = (adns_state)w->data;\n     update_now (EV_A);\n\n     if (revents & EV_READ ) adns_processreadable  (ads, w->fd, &tv_now);\n     if (revents & EV_WRITE) adns_processwriteable (ads, w->fd, &tv_now);\n   }\n\n   // do not ever call adns_afterpoll\n\nMethod 4: Do not use a prepare or check watcher because the module you\nwant to embed is not flexible enough to support it. Instead, you can\noverride their poll function. The drawback with this solution is that the\nmain loop is now no longer controllable by EV. The C<Glib::EV> module uses\nthis approach, effectively embedding EV as a client into the horrible\nlibglib event loop.\n\n   static gint\n   event_poll_func (GPollFD *fds, guint nfds, gint timeout)\n   {\n     int got_events = 0;\n\n     for (n = 0; n < nfds; ++n)\n       // create/start io watcher that sets the relevant bits in fds[n] and increment got_events\n\n     if (timeout >= 0)\n       // create/start timer\n\n     // poll\n     ev_run (EV_A_ 0);\n\n     // stop timer again\n     if (timeout >= 0)\n       ev_timer_stop (EV_A_ &to);\n\n     // stop io watchers again - their callbacks should have set\n     for (n = 0; n < nfds; ++n)\n       ev_io_stop (EV_A_ iow [n]);\n\n     return got_events;\n   }\n\n\n=head2 C<ev_embed> - when one backend isn't enough...\n\nThis is a rather advanced watcher type that lets you embed one event loop\ninto another (currently only C<ev_io> events are supported in the embedded\nloop, other types of watchers might be handled in a delayed or incorrect\nfashion and must not be used).\n\nThere are primarily two reasons you would want that: work around bugs and\nprioritise I/O.\n\nAs an example for a bug workaround, the kqueue backend might only support\nsockets on some platform, so it is unusable as generic backend, but you\nstill want to make use of it because you have many sockets and it scales\nso nicely. In this case, you would create a kqueue-based loop and embed\nit into your default loop (which might use e.g. poll). Overall operation\nwill be a bit slower because first libev has to call C<poll> and then\nC<kevent>, but at least you can use both mechanisms for what they are\nbest: C<kqueue> for scalable sockets and C<poll> if you want it to work :)\n\nAs for prioritising I/O: under rare circumstances you have the case where\nsome fds have to be watched and handled very quickly (with low latency),\nand even priorities and idle watchers might have too much overhead. In\nthis case you would put all the high priority stuff in one loop and all\nthe rest in a second one, and embed the second one in the first.\n\nAs long as the watcher is active, the callback will be invoked every\ntime there might be events pending in the embedded loop. The callback\nmust then call C<ev_embed_sweep (mainloop, watcher)> to make a single\nsweep and invoke their callbacks (the callback doesn't need to invoke the\nC<ev_embed_sweep> function directly, it could also start an idle watcher\nto give the embedded loop strictly lower priority for example).\n\nYou can also set the callback to C<0>, in which case the embed watcher\nwill automatically execute the embedded loop sweep whenever necessary.\n\nFork detection will be handled transparently while the C<ev_embed> watcher\nis active, i.e., the embedded loop will automatically be forked when the\nembedding loop forks. In other cases, the user is responsible for calling\nC<ev_loop_fork> on the embedded loop.\n\nUnfortunately, not all backends are embeddable: only the ones returned by\nC<ev_embeddable_backends> are, which, unfortunately, does not include any\nportable one.\n\nSo when you want to use this feature you will always have to be prepared\nthat you cannot get an embeddable loop. The recommended way to get around\nthis is to have a separate variables for your embeddable loop, try to\ncreate it, and if that fails, use the normal loop for everything.\n\n=head3 C<ev_embed> and fork\n\nWhile the C<ev_embed> watcher is running, forks in the embedding loop will\nautomatically be applied to the embedded loop as well, so no special\nfork handling is required in that case. When the watcher is not running,\nhowever, it is still the task of the libev user to call C<ev_loop_fork ()>\nas applicable.\n\n=head3 Watcher-Specific Functions and Data Members\n\n=over 4\n\n=item ev_embed_init (ev_embed *, callback, struct ev_loop *embedded_loop)\n\n=item ev_embed_set (ev_embed *, struct ev_loop *embedded_loop)\n\nConfigures the watcher to embed the given loop, which must be\nembeddable. If the callback is C<0>, then C<ev_embed_sweep> will be\ninvoked automatically, otherwise it is the responsibility of the callback\nto invoke it (it will continue to be called until the sweep has been done,\nif you do not want that, you need to temporarily stop the embed watcher).\n\n=item ev_embed_sweep (loop, ev_embed *)\n\nMake a single, non-blocking sweep over the embedded loop. This works\nsimilarly to C<ev_run (embedded_loop, EVRUN_NOWAIT)>, but in the most\nappropriate way for embedded loops.\n\n=item struct ev_loop *other [read-only]\n\nThe embedded event loop.\n\n=back\n\n=head3 Examples\n\nExample: Try to get an embeddable event loop and embed it into the default\nevent loop. If that is not possible, use the default loop. The default\nloop is stored in C<loop_hi>, while the embeddable loop is stored in\nC<loop_lo> (which is C<loop_hi> in the case no embeddable loop can be\nused).\n\n   struct ev_loop *loop_hi = ev_default_init (0);\n   struct ev_loop *loop_lo = 0;\n   ev_embed embed;\n\n   // see if there is a chance of getting one that works\n   // (remember that a flags value of 0 means autodetection)\n   loop_lo = ev_embeddable_backends () & ev_recommended_backends ()\n     ? ev_loop_new (ev_embeddable_backends () & ev_recommended_backends ())\n     : 0;\n\n   // if we got one, then embed it, otherwise default to loop_hi\n   if (loop_lo)\n     {\n       ev_embed_init (&embed, 0, loop_lo);\n       ev_embed_start (loop_hi, &embed);\n     }\n   else\n     loop_lo = loop_hi;\n\nExample: Check if kqueue is available but not recommended and create\na kqueue backend for use with sockets (which usually work with any\nkqueue implementation). Store the kqueue/socket-only event loop in\nC<loop_socket>. (One might optionally use C<EVFLAG_NOENV>, too).\n\n   struct ev_loop *loop = ev_default_init (0);\n   struct ev_loop *loop_socket = 0;\n   ev_embed embed;\n\n   if (ev_supported_backends () & ~ev_recommended_backends () & EVBACKEND_KQUEUE)\n     if ((loop_socket = ev_loop_new (EVBACKEND_KQUEUE))\n       {\n         ev_embed_init (&embed, 0, loop_socket);\n         ev_embed_start (loop, &embed);\n       }\n\n   if (!loop_socket)\n     loop_socket = loop;\n\n   // now use loop_socket for all sockets, and loop for everything else\n\n\n=head2 C<ev_fork> - the audacity to resume the event loop after a fork\n\nFork watchers are called when a C<fork ()> was detected (usually because\nwhoever is a good citizen cared to tell libev about it by calling\nC<ev_loop_fork>). The invocation is done before the event loop blocks next\nand before C<ev_check> watchers are being called, and only in the child\nafter the fork. If whoever good citizen calling C<ev_default_fork> cheats\nand calls it in the wrong process, the fork handlers will be invoked, too,\nof course.\n\n=head3 The special problem of life after fork - how is it possible?\n\nMost uses of C<fork ()> consist of forking, then some simple calls to set\nup/change the process environment, followed by a call to C<exec()>. This\nsequence should be handled by libev without any problems.\n\nThis changes when the application actually wants to do event handling\nin the child, or both parent in child, in effect \"continuing\" after the\nfork.\n\nThe default mode of operation (for libev, with application help to detect\nforks) is to duplicate all the state in the child, as would be expected\nwhen I<either> the parent I<or> the child process continues.\n\nWhen both processes want to continue using libev, then this is usually the\nwrong result. In that case, usually one process (typically the parent) is\nsupposed to continue with all watchers in place as before, while the other\nprocess typically wants to start fresh, i.e. without any active watchers.\n\nThe cleanest and most efficient way to achieve that with libev is to\nsimply create a new event loop, which of course will be \"empty\", and\nuse that for new watchers. This has the advantage of not touching more\nmemory than necessary, and thus avoiding the copy-on-write, and the\ndisadvantage of having to use multiple event loops (which do not support\nsignal watchers).\n\nWhen this is not possible, or you want to use the default loop for\nother reasons, then in the process that wants to start \"fresh\", call\nC<ev_loop_destroy (EV_DEFAULT)> followed by C<ev_default_loop (...)>.\nDestroying the default loop will \"orphan\" (not stop) all registered\nwatchers, so you have to be careful not to execute code that modifies\nthose watchers. Note also that in that case, you have to re-register any\nsignal watchers.\n\n=head3 Watcher-Specific Functions and Data Members\n\n=over 4\n\n=item ev_fork_init (ev_fork *, callback)\n\nInitialises and configures the fork watcher - it has no parameters of any\nkind. There is a C<ev_fork_set> macro, but using it is utterly pointless,\nreally.\n\n=back\n\n\n=head2 C<ev_cleanup> - even the best things end\n\nCleanup watchers are called just before the event loop is being destroyed\nby a call to C<ev_loop_destroy>.\n\nWhile there is no guarantee that the event loop gets destroyed, cleanup\nwatchers provide a convenient method to install cleanup hooks for your\nprogram, worker threads and so on - you just to make sure to destroy the\nloop when you want them to be invoked.\n\nCleanup watchers are invoked in the same way as any other watcher. Unlike\nall other watchers, they do not keep a reference to the event loop (which\nmakes a lot of sense if you think about it). Like all other watchers, you\ncan call libev functions in the callback, except C<ev_cleanup_start>.\n\n=head3 Watcher-Specific Functions and Data Members\n\n=over 4\n\n=item ev_cleanup_init (ev_cleanup *, callback)\n\nInitialises and configures the cleanup watcher - it has no parameters of\nany kind. There is a C<ev_cleanup_set> macro, but using it is utterly\npointless, I assure you.\n\n=back\n\nExample: Register an atexit handler to destroy the default loop, so any\ncleanup functions are called.\n\n   static void\n   program_exits (void)\n   {\n     ev_loop_destroy (EV_DEFAULT_UC);\n   }\n\n   ...\n   atexit (program_exits);\n\n\n=head2 C<ev_async> - how to wake up an event loop\n\nIn general, you cannot use an C<ev_loop> from multiple threads or other\nasynchronous sources such as signal handlers (as opposed to multiple event\nloops - those are of course safe to use in different threads).\n\nSometimes, however, you need to wake up an event loop you do not control,\nfor example because it belongs to another thread. This is what C<ev_async>\nwatchers do: as long as the C<ev_async> watcher is active, you can signal\nit by calling C<ev_async_send>, which is thread- and signal safe.\n\nThis functionality is very similar to C<ev_signal> watchers, as signals,\ntoo, are asynchronous in nature, and signals, too, will be compressed\n(i.e. the number of callback invocations may be less than the number of\nC<ev_async_send> calls). In fact, you could use signal watchers as a kind\nof \"global async watchers\" by using a watcher on an otherwise unused\nsignal, and C<ev_feed_signal> to signal this watcher from another thread,\neven without knowing which loop owns the signal.\n\n=head3 Queueing\n\nC<ev_async> does not support queueing of data in any way. The reason\nis that the author does not know of a simple (or any) algorithm for a\nmultiple-writer-single-reader queue that works in all cases and doesn't\nneed elaborate support such as pthreads or unportable memory access\nsemantics.\n\nThat means that if you want to queue data, you have to provide your own\nqueue. But at least I can tell you how to implement locking around your\nqueue:\n\n=over 4\n\n=item queueing from a signal handler context\n\nTo implement race-free queueing, you simply add to the queue in the signal\nhandler but you block the signal handler in the watcher callback. Here is\nan example that does that for some fictitious SIGUSR1 handler:\n\n   static ev_async mysig;\n\n   static void\n   sigusr1_handler (void)\n   {\n     sometype data;\n\n     // no locking etc.\n     queue_put (data);\n     ev_async_send (EV_DEFAULT_ &mysig);\n   }\n\n   static void\n   mysig_cb (EV_P_ ev_async *w, int revents)\n   {\n     sometype data;\n     sigset_t block, prev;\n\n     sigemptyset (&block);\n     sigaddset (&block, SIGUSR1);\n     sigprocmask (SIG_BLOCK, &block, &prev);\n\n     while (queue_get (&data))\n       process (data);\n\n     if (sigismember (&prev, SIGUSR1)\n       sigprocmask (SIG_UNBLOCK, &block, 0);\n   }\n\n(Note: pthreads in theory requires you to use C<pthread_setmask>\ninstead of C<sigprocmask> when you use threads, but libev doesn't do it\neither...).\n\n=item queueing from a thread context\n\nThe strategy for threads is different, as you cannot (easily) block\nthreads but you can easily preempt them, so to queue safely you need to\nemploy a traditional mutex lock, such as in this pthread example:\n\n   static ev_async mysig;\n   static pthread_mutex_t mymutex = PTHREAD_MUTEX_INITIALIZER;\n\n   static void\n   otherthread (void)\n   {\n     // only need to lock the actual queueing operation\n     pthread_mutex_lock (&mymutex);\n     queue_put (data);\n     pthread_mutex_unlock (&mymutex);\n\n     ev_async_send (EV_DEFAULT_ &mysig);\n   }\n\n   static void\n   mysig_cb (EV_P_ ev_async *w, int revents)\n   {\n     pthread_mutex_lock (&mymutex);\n\n     while (queue_get (&data))\n       process (data);\n\n     pthread_mutex_unlock (&mymutex);\n   }\n\n=back\n\n\n=head3 Watcher-Specific Functions and Data Members\n\n=over 4\n\n=item ev_async_init (ev_async *, callback)\n\nInitialises and configures the async watcher - it has no parameters of any\nkind. There is a C<ev_async_set> macro, but using it is utterly pointless,\ntrust me.\n\n=item ev_async_send (loop, ev_async *)\n\nSends/signals/activates the given C<ev_async> watcher, that is, feeds\nan C<EV_ASYNC> event on the watcher into the event loop, and instantly\nreturns.\n\nUnlike C<ev_feed_event>, this call is safe to do from other threads,\nsignal or similar contexts (see the discussion of C<EV_ATOMIC_T> in the\nembedding section below on what exactly this means).\n\nNote that, as with other watchers in libev, multiple events might get\ncompressed into a single callback invocation (another way to look at\nthis is that C<ev_async> watchers are level-triggered: they are set on\nC<ev_async_send>, reset when the event loop detects that).\n\nThis call incurs the overhead of at most one extra system call per event\nloop iteration, if the event loop is blocked, and no syscall at all if\nthe event loop (or your program) is processing events. That means that\nrepeated calls are basically free (there is no need to avoid calls for\nperformance reasons) and that the overhead becomes smaller (typically\nzero) under load.\n\n=item bool = ev_async_pending (ev_async *)\n\nReturns a non-zero value when C<ev_async_send> has been called on the\nwatcher but the event has not yet been processed (or even noted) by the\nevent loop.\n\nC<ev_async_send> sets a flag in the watcher and wakes up the loop. When\nthe loop iterates next and checks for the watcher to have become active,\nit will reset the flag again. C<ev_async_pending> can be used to very\nquickly check whether invoking the loop might be a good idea.\n\nNot that this does I<not> check whether the watcher itself is pending,\nonly whether it has been requested to make this watcher pending: there\nis a time window between the event loop checking and resetting the async\nnotification, and the callback being invoked.\n\n=back\n\n\n=head1 OTHER FUNCTIONS\n\nThere are some other functions of possible interest. Described. Here. Now.\n\n=over 4\n\n=item ev_once (loop, int fd, int events, ev_tstamp timeout, callback)\n\nThis function combines a simple timer and an I/O watcher, calls your\ncallback on whichever event happens first and automatically stops both\nwatchers. This is useful if you want to wait for a single event on an fd\nor timeout without having to allocate/configure/start/stop/free one or\nmore watchers yourself.\n\nIf C<fd> is less than 0, then no I/O watcher will be started and the\nC<events> argument is being ignored. Otherwise, an C<ev_io> watcher for\nthe given C<fd> and C<events> set will be created and started.\n\nIf C<timeout> is less than 0, then no timeout watcher will be\nstarted. Otherwise an C<ev_timer> watcher with after = C<timeout> (and\nrepeat = 0) will be started. C<0> is a valid timeout.\n\nThe callback has the type C<void (*cb)(int revents, void *arg)> and is\npassed an C<revents> set like normal event callbacks (a combination of\nC<EV_ERROR>, C<EV_READ>, C<EV_WRITE> or C<EV_TIMER>) and the C<arg>\nvalue passed to C<ev_once>. Note that it is possible to receive I<both>\na timeout and an io event at the same time - you probably should give io\nevents precedence.\n\nExample: wait up to ten seconds for data to appear on STDIN_FILENO.\n\n   static void stdin_ready (int revents, void *arg)\n   {\n     if (revents & EV_READ)\n       /* stdin might have data for us, joy! */;\n     else if (revents & EV_TIMER)\n       /* doh, nothing entered */;\n   }\n\n   ev_once (STDIN_FILENO, EV_READ, 10., stdin_ready, 0);\n\n=item ev_feed_fd_event (loop, int fd, int revents)\n\nFeed an event on the given fd, as if a file descriptor backend detected\nthe given events.\n\n=item ev_feed_signal_event (loop, int signum)\n\nFeed an event as if the given signal occurred. See also C<ev_feed_signal>,\nwhich is async-safe.\n\n=back\n\n\n=head1 COMMON OR USEFUL IDIOMS (OR BOTH)\n\nThis section explains some common idioms that are not immediately\nobvious. Note that examples are sprinkled over the whole manual, and this\nsection only contains stuff that wouldn't fit anywhere else.\n\n=head2 ASSOCIATING CUSTOM DATA WITH A WATCHER\n\nEach watcher has, by default, a C<void *data> member that you can read\nor modify at any time: libev will completely ignore it. This can be used\nto associate arbitrary data with your watcher. If you need more data and\ndon't want to allocate memory separately and store a pointer to it in that\ndata member, you can also \"subclass\" the watcher type and provide your own\ndata:\n\n   struct my_io\n   {\n     ev_io io;\n     int otherfd;\n     void *somedata;\n     struct whatever *mostinteresting;\n   };\n\n   ...\n   struct my_io w;\n   ev_io_init (&w.io, my_cb, fd, EV_READ);\n\nAnd since your callback will be called with a pointer to the watcher, you\ncan cast it back to your own type:\n\n   static void my_cb (struct ev_loop *loop, ev_io *w_, int revents)\n   {\n     struct my_io *w = (struct my_io *)w_;\n     ...\n   }\n\nMore interesting and less C-conformant ways of casting your callback\nfunction type instead have been omitted.\n\n=head2 BUILDING YOUR OWN COMPOSITE WATCHERS\n\nAnother common scenario is to use some data structure with multiple\nembedded watchers, in effect creating your own watcher that combines\nmultiple libev event sources into one \"super-watcher\":\n\n   struct my_biggy\n   {\n     int some_data;\n     ev_timer t1;\n     ev_timer t2;\n   }\n\nIn this case getting the pointer to C<my_biggy> is a bit more\ncomplicated: Either you store the address of your C<my_biggy> struct in\nthe C<data> member of the watcher (for woozies or C++ coders), or you need\nto use some pointer arithmetic using C<offsetof> inside your watchers (for\nreal programmers):\n\n   #include <stddef.h>\n\n   static void\n   t1_cb (EV_P_ ev_timer *w, int revents)\n   {\n     struct my_biggy big = (struct my_biggy *)\n       (((char *)w) - offsetof (struct my_biggy, t1));\n   }\n\n   static void\n   t2_cb (EV_P_ ev_timer *w, int revents)\n   {\n     struct my_biggy big = (struct my_biggy *)\n       (((char *)w) - offsetof (struct my_biggy, t2));\n   }\n\n=head2 AVOIDING FINISHING BEFORE RETURNING\n\nOften you have structures like this in event-based programs:\n\n  callback ()\n  {\n    free (request);\n  }\n\n  request = start_new_request (..., callback);\n\nThe intent is to start some \"lengthy\" operation. The C<request> could be\nused to cancel the operation, or do other things with it.\n\nIt's not uncommon to have code paths in C<start_new_request> that\nimmediately invoke the callback, for example, to report errors. Or you add\nsome caching layer that finds that it can skip the lengthy aspects of the\noperation and simply invoke the callback with the result.\n\nThe problem here is that this will happen I<before> C<start_new_request>\nhas returned, so C<request> is not set.\n\nEven if you pass the request by some safer means to the callback, you\nmight want to do something to the request after starting it, such as\ncanceling it, which probably isn't working so well when the callback has\nalready been invoked.\n\nA common way around all these issues is to make sure that\nC<start_new_request> I<always> returns before the callback is invoked. If\nC<start_new_request> immediately knows the result, it can artificially\ndelay invoking the callback by using a C<prepare> or C<idle> watcher for\nexample, or more sneakily, by reusing an existing (stopped) watcher and\npushing it into the pending queue:\n\n   ev_set_cb (watcher, callback);\n   ev_feed_event (EV_A_ watcher, 0);\n\nThis way, C<start_new_request> can safely return before the callback is\ninvoked, while not delaying callback invocation too much.\n\n=head2 MODEL/NESTED EVENT LOOP INVOCATIONS AND EXIT CONDITIONS\n\nOften (especially in GUI toolkits) there are places where you have\nI<modal> interaction, which is most easily implemented by recursively\ninvoking C<ev_run>.\n\nThis brings the problem of exiting - a callback might want to finish the\nmain C<ev_run> call, but not the nested one (e.g. user clicked \"Quit\", but\na modal \"Are you sure?\" dialog is still waiting), or just the nested one\nand not the main one (e.g. user clocked \"Ok\" in a modal dialog), or some\nother combination: In these cases, a simple C<ev_break> will not work.\n\nThe solution is to maintain \"break this loop\" variable for each C<ev_run>\ninvocation, and use a loop around C<ev_run> until the condition is\ntriggered, using C<EVRUN_ONCE>:\n\n   // main loop\n   int exit_main_loop = 0;\n\n   while (!exit_main_loop)\n     ev_run (EV_DEFAULT_ EVRUN_ONCE);\n\n   // in a modal watcher\n   int exit_nested_loop = 0;\n\n   while (!exit_nested_loop)\n     ev_run (EV_A_ EVRUN_ONCE);\n\nTo exit from any of these loops, just set the corresponding exit variable:\n\n   // exit modal loop\n   exit_nested_loop = 1;\n\n   // exit main program, after modal loop is finished\n   exit_main_loop = 1;\n\n   // exit both\n   exit_main_loop = exit_nested_loop = 1;\n\n=head2 THREAD LOCKING EXAMPLE\n\nHere is a fictitious example of how to run an event loop in a different\nthread from where callbacks are being invoked and watchers are\ncreated/added/removed.\n\nFor a real-world example, see the C<EV::Loop::Async> perl module,\nwhich uses exactly this technique (which is suited for many high-level\nlanguages).\n\nThe example uses a pthread mutex to protect the loop data, a condition\nvariable to wait for callback invocations, an async watcher to notify the\nevent loop thread and an unspecified mechanism to wake up the main thread.\n\nFirst, you need to associate some data with the event loop:\n\n   typedef struct {\n     mutex_t lock; /* global loop lock */\n     ev_async async_w;\n     thread_t tid;\n     cond_t invoke_cv;\n   } userdata;\n\n   void prepare_loop (EV_P)\n   {\n      // for simplicity, we use a static userdata struct.\n      static userdata u;\n\n      ev_async_init (&u->async_w, async_cb);\n      ev_async_start (EV_A_ &u->async_w);\n\n      pthread_mutex_init (&u->lock, 0);\n      pthread_cond_init (&u->invoke_cv, 0);\n\n      // now associate this with the loop\n      ev_set_userdata (EV_A_ u);\n      ev_set_invoke_pending_cb (EV_A_ l_invoke);\n      ev_set_loop_release_cb (EV_A_ l_release, l_acquire);\n\n      // then create the thread running ev_run\n      pthread_create (&u->tid, 0, l_run, EV_A);\n   }\n\nThe callback for the C<ev_async> watcher does nothing: the watcher is used\nsolely to wake up the event loop so it takes notice of any new watchers\nthat might have been added:\n\n   static void\n   async_cb (EV_P_ ev_async *w, int revents)\n   {\n      // just used for the side effects\n   }\n\nThe C<l_release> and C<l_acquire> callbacks simply unlock/lock the mutex\nprotecting the loop data, respectively.\n\n   static void\n   l_release (EV_P)\n   {\n     userdata *u = ev_userdata (EV_A);\n     pthread_mutex_unlock (&u->lock);\n   }\n\n   static void\n   l_acquire (EV_P)\n   {\n     userdata *u = ev_userdata (EV_A);\n     pthread_mutex_lock (&u->lock);\n   }\n\nThe event loop thread first acquires the mutex, and then jumps straight\ninto C<ev_run>:\n\n   void *\n   l_run (void *thr_arg)\n   {\n     struct ev_loop *loop = (struct ev_loop *)thr_arg;\n\n     l_acquire (EV_A);\n     pthread_setcanceltype (PTHREAD_CANCEL_ASYNCHRONOUS, 0);\n     ev_run (EV_A_ 0);\n     l_release (EV_A);\n\n     return 0;\n   }\n\nInstead of invoking all pending watchers, the C<l_invoke> callback will\nsignal the main thread via some unspecified mechanism (signals? pipe\nwrites? C<Async::Interrupt>?) and then waits until all pending watchers\nhave been called (in a while loop because a) spurious wakeups are possible\nand b) skipping inter-thread-communication when there are no pending\nwatchers is very beneficial):\n\n   static void\n   l_invoke (EV_P)\n   {\n     userdata *u = ev_userdata (EV_A);\n\n     while (ev_pending_count (EV_A))\n       {\n         wake_up_other_thread_in_some_magic_or_not_so_magic_way ();\n         pthread_cond_wait (&u->invoke_cv, &u->lock);\n       }\n   }\n\nNow, whenever the main thread gets told to invoke pending watchers, it\nwill grab the lock, call C<ev_invoke_pending> and then signal the loop\nthread to continue:\n\n   static void\n   real_invoke_pending (EV_P)\n   {\n     userdata *u = ev_userdata (EV_A);\n\n     pthread_mutex_lock (&u->lock);\n     ev_invoke_pending (EV_A);\n     pthread_cond_signal (&u->invoke_cv);\n     pthread_mutex_unlock (&u->lock);\n   }\n\nWhenever you want to start/stop a watcher or do other modifications to an\nevent loop, you will now have to lock:\n\n   ev_timer timeout_watcher;\n   userdata *u = ev_userdata (EV_A);\n\n   ev_timer_init (&timeout_watcher, timeout_cb, 5.5, 0.);\n\n   pthread_mutex_lock (&u->lock);\n   ev_timer_start (EV_A_ &timeout_watcher);\n   ev_async_send (EV_A_ &u->async_w);\n   pthread_mutex_unlock (&u->lock);\n\nNote that sending the C<ev_async> watcher is required because otherwise\nan event loop currently blocking in the kernel will have no knowledge\nabout the newly added timer. By waking up the loop it will pick up any new\nwatchers in the next event loop iteration.\n\n=head2 THREADS, COROUTINES, CONTINUATIONS, QUEUES... INSTEAD OF CALLBACKS\n\nWhile the overhead of a callback that e.g. schedules a thread is small, it\nis still an overhead. If you embed libev, and your main usage is with some\nkind of threads or coroutines, you might want to customise libev so that\ndoesn't need callbacks anymore.\n\nImagine you have coroutines that you can switch to using a function\nC<switch_to (coro)>, that libev runs in a coroutine called C<libev_coro>\nand that due to some magic, the currently active coroutine is stored in a\nglobal called C<current_coro>. Then you can build your own \"wait for libev\nevent\" primitive by changing C<EV_CB_DECLARE> and C<EV_CB_INVOKE> (note\nthe differing C<;> conventions):\n\n   #define EV_CB_DECLARE(type)   struct my_coro *cb;\n   #define EV_CB_INVOKE(watcher) switch_to ((watcher)->cb)\n\nThat means instead of having a C callback function, you store the\ncoroutine to switch to in each watcher, and instead of having libev call\nyour callback, you instead have it switch to that coroutine.\n\nA coroutine might now wait for an event with a function called\nC<wait_for_event>. (the watcher needs to be started, as always, but it doesn't\nmatter when, or whether the watcher is active or not when this function is\ncalled):\n\n   void\n   wait_for_event (ev_watcher *w)\n   {\n     ev_set_cb (w, current_coro);\n     switch_to (libev_coro);\n   }\n\nThat basically suspends the coroutine inside C<wait_for_event> and\ncontinues the libev coroutine, which, when appropriate, switches back to\nthis or any other coroutine.\n\nYou can do similar tricks if you have, say, threads with an event queue -\ninstead of storing a coroutine, you store the queue object and instead of\nswitching to a coroutine, you push the watcher onto the queue and notify\nany waiters.\n\nTo embed libev, see L</EMBEDDING>, but in short, it's easiest to create two\nfiles, F<my_ev.h> and F<my_ev.c> that include the respective libev files:\n\n   // my_ev.h\n   #define EV_CB_DECLARE(type)   struct my_coro *cb;\n   #define EV_CB_INVOKE(watcher) switch_to ((watcher)->cb)\n   #include \"../libev/ev.h\"\n\n   // my_ev.c\n   #define EV_H \"my_ev.h\"\n   #include \"../libev/ev.c\"\n\nAnd then use F<my_ev.h> when you would normally use F<ev.h>, and compile\nF<my_ev.c> into your project. When properly specifying include paths, you\ncan even use F<ev.h> as header file name directly.\n\n\n=head1 LIBEVENT EMULATION\n\nLibev offers a compatibility emulation layer for libevent. It cannot\nemulate the internals of libevent, so here are some usage hints:\n\n=over 4\n\n=item * Only the libevent-1.4.1-beta API is being emulated.\n\nThis was the newest libevent version available when libev was implemented,\nand is still mostly unchanged in 2010.\n\n=item * Use it by including <event.h>, as usual.\n\n=item * The following members are fully supported: ev_base, ev_callback,\nev_arg, ev_fd, ev_res, ev_events.\n\n=item * Avoid using ev_flags and the EVLIST_*-macros, while it is\nmaintained by libev, it does not work exactly the same way as in libevent (consider\nit a private API).\n\n=item * Priorities are not currently supported. Initialising priorities\nwill fail and all watchers will have the same priority, even though there\nis an ev_pri field.\n\n=item * In libevent, the last base created gets the signals, in libev, the\nbase that registered the signal gets the signals.\n\n=item * Other members are not supported.\n\n=item * The libev emulation is I<not> ABI compatible to libevent, you need\nto use the libev header file and library.\n\n=back\n\n=head1 C++ SUPPORT\n\n=head2 C API\n\nThe normal C API should work fine when used from C++: both ev.h and the\nlibev sources can be compiled as C++. Therefore, code that uses the C API\nwill work fine.\n\nProper exception specifications might have to be added to callbacks passed\nto libev: exceptions may be thrown only from watcher callbacks, all\nother callbacks (allocator, syserr, loop acquire/release and periodic\nreschedule callbacks) must not throw exceptions, and might need a C<throw\n()> specification. If you have code that needs to be compiled as both C\nand C++ you can use the C<EV_THROW> macro for this:\n\n   static void\n   fatal_error (const char *msg) EV_THROW\n   {\n     perror (msg);\n     abort ();\n   }\n\n   ...\n   ev_set_syserr_cb (fatal_error);\n\nThe only API functions that can currently throw exceptions are C<ev_run>,\nC<ev_invoke>, C<ev_invoke_pending> and C<ev_loop_destroy> (the latter\nbecause it runs cleanup watchers).\n\nThrowing exceptions in watcher callbacks is only supported if libev itself\nis compiled with a C++ compiler or your C and C++ environments allow\nthrowing exceptions through C libraries (most do).\n\n=head2 C++ API\n\nLibev comes with some simplistic wrapper classes for C++ that mainly allow\nyou to use some convenience methods to start/stop watchers and also change\nthe callback model to a model using method callbacks on objects.\n\nTo use it,\n\n   #include <ev++.h>\n\nThis automatically includes F<ev.h> and puts all of its definitions (many\nof them macros) into the global namespace. All C++ specific things are\nput into the C<ev> namespace. It should support all the same embedding\noptions as F<ev.h>, most notably C<EV_MULTIPLICITY>.\n\nCare has been taken to keep the overhead low. The only data member the C++\nclasses add (compared to plain C-style watchers) is the event loop pointer\nthat the watcher is associated with (or no additional members at all if\nyou disable C<EV_MULTIPLICITY> when embedding libev).\n\nCurrently, functions, static and non-static member functions and classes\nwith C<operator ()> can be used as callbacks. Other types should be easy\nto add as long as they only need one additional pointer for context. If\nyou need support for other types of functors please contact the author\n(preferably after implementing it).\n\nFor all this to work, your C++ compiler either has to use the same calling\nconventions as your C compiler (for static member functions), or you have\nto embed libev and compile libev itself as C++.\n\nHere is a list of things available in the C<ev> namespace:\n\n=over 4\n\n=item C<ev::READ>, C<ev::WRITE> etc.\n\nThese are just enum values with the same values as the C<EV_READ> etc.\nmacros from F<ev.h>.\n\n=item C<ev::tstamp>, C<ev::now>\n\nAliases to the same types/functions as with the C<ev_> prefix.\n\n=item C<ev::io>, C<ev::timer>, C<ev::periodic>, C<ev::idle>, C<ev::sig> etc.\n\nFor each C<ev_TYPE> watcher in F<ev.h> there is a corresponding class of\nthe same name in the C<ev> namespace, with the exception of C<ev_signal>\nwhich is called C<ev::sig> to avoid clashes with the C<signal> macro\ndefined by many implementations.\n\nAll of those classes have these methods:\n\n=over 4\n\n=item ev::TYPE::TYPE ()\n\n=item ev::TYPE::TYPE (loop)\n\n=item ev::TYPE::~TYPE\n\nThe constructor (optionally) takes an event loop to associate the watcher\nwith. If it is omitted, it will use C<EV_DEFAULT>.\n\nThe constructor calls C<ev_init> for you, which means you have to call the\nC<set> method before starting it.\n\nIt will not set a callback, however: You have to call the templated C<set>\nmethod to set a callback before you can start the watcher.\n\n(The reason why you have to use a method is a limitation in C++ which does\nnot allow explicit template arguments for constructors).\n\nThe destructor automatically stops the watcher if it is active.\n\n=item w->set<class, &class::method> (object *)\n\nThis method sets the callback method to call. The method has to have a\nsignature of C<void (*)(ev_TYPE &, int)>, it receives the watcher as\nfirst argument and the C<revents> as second. The object must be given as\nparameter and is stored in the C<data> member of the watcher.\n\nThis method synthesizes efficient thunking code to call your method from\nthe C callback that libev requires. If your compiler can inline your\ncallback (i.e. it is visible to it at the place of the C<set> call and\nyour compiler is good :), then the method will be fully inlined into the\nthunking function, making it as fast as a direct C callback.\n\nExample: simple class declaration and watcher initialisation\n\n   struct myclass\n   {\n     void io_cb (ev::io &w, int revents) { }\n   }\n\n   myclass obj;\n   ev::io iow;\n   iow.set <myclass, &myclass::io_cb> (&obj);\n\n=item w->set (object *)\n\nThis is a variation of a method callback - leaving out the method to call\nwill default the method to C<operator ()>, which makes it possible to use\nfunctor objects without having to manually specify the C<operator ()> all\nthe time. Incidentally, you can then also leave out the template argument\nlist.\n\nThe C<operator ()> method prototype must be C<void operator ()(watcher &w,\nint revents)>.\n\nSee the method-C<set> above for more details.\n\nExample: use a functor object as callback.\n\n   struct myfunctor\n   {\n     void operator() (ev::io &w, int revents)\n     {\n       ...\n     }\n   }\n\n   myfunctor f;\n\n   ev::io w;\n   w.set (&f);\n\n=item w->set<function> (void *data = 0)\n\nAlso sets a callback, but uses a static method or plain function as\ncallback. The optional C<data> argument will be stored in the watcher's\nC<data> member and is free for you to use.\n\nThe prototype of the C<function> must be C<void (*)(ev::TYPE &w, int)>.\n\nSee the method-C<set> above for more details.\n\nExample: Use a plain function as callback.\n\n   static void io_cb (ev::io &w, int revents) { }\n   iow.set <io_cb> ();\n\n=item w->set (loop)\n\nAssociates a different C<struct ev_loop> with this watcher. You can only\ndo this when the watcher is inactive (and not pending either).\n\n=item w->set ([arguments])\n\nBasically the same as C<ev_TYPE_set> (except for C<ev::embed> watchers>),\nwith the same arguments. Either this method or a suitable start method\nmust be called at least once. Unlike the C counterpart, an active watcher\ngets automatically stopped and restarted when reconfiguring it with this\nmethod.\n\nFor C<ev::embed> watchers this method is called C<set_embed>, to avoid\nclashing with the C<set (loop)> method.\n\n=item w->start ()\n\nStarts the watcher. Note that there is no C<loop> argument, as the\nconstructor already stores the event loop.\n\n=item w->start ([arguments])\n\nInstead of calling C<set> and C<start> methods separately, it is often\nconvenient to wrap them in one call. Uses the same type of arguments as\nthe configure C<set> method of the watcher.\n\n=item w->stop ()\n\nStops the watcher if it is active. Again, no C<loop> argument.\n\n=item w->again () (C<ev::timer>, C<ev::periodic> only)\n\nFor C<ev::timer> and C<ev::periodic>, this invokes the corresponding\nC<ev_TYPE_again> function.\n\n=item w->sweep () (C<ev::embed> only)\n\nInvokes C<ev_embed_sweep>.\n\n=item w->update () (C<ev::stat> only)\n\nInvokes C<ev_stat_stat>.\n\n=back\n\n=back\n\nExample: Define a class with two I/O and idle watchers, start the I/O\nwatchers in the constructor.\n\n   class myclass\n   {\n     ev::io   io  ; void io_cb   (ev::io   &w, int revents);\n     ev::io   io2 ; void io2_cb  (ev::io   &w, int revents);\n     ev::idle idle; void idle_cb (ev::idle &w, int revents);\n\n     myclass (int fd)\n     {\n       io  .set <myclass, &myclass::io_cb  > (this);\n       io2 .set <myclass, &myclass::io2_cb > (this);\n       idle.set <myclass, &myclass::idle_cb> (this);\n\n       io.set (fd, ev::WRITE); // configure the watcher\n       io.start ();            // start it whenever convenient\n\n       io2.start (fd, ev::READ); // set + start in one call\n     }\n   };\n\n\n=head1 OTHER LANGUAGE BINDINGS\n\nLibev does not offer other language bindings itself, but bindings for a\nnumber of languages exist in the form of third-party packages. If you know\nany interesting language binding in addition to the ones listed here, drop\nme a note.\n\n=over 4\n\n=item Perl\n\nThe EV module implements the full libev API and is actually used to test\nlibev. EV is developed together with libev. Apart from the EV core module,\nthere are additional modules that implement libev-compatible interfaces\nto C<libadns> (C<EV::ADNS>, but C<AnyEvent::DNS> is preferred nowadays),\nC<Net::SNMP> (C<Net::SNMP::EV>) and the C<libglib> event core (C<Glib::EV>\nand C<EV::Glib>).\n\nIt can be found and installed via CPAN, its homepage is at\nL<http://software.schmorp.de/pkg/EV>.\n\n=item Python\n\nPython bindings can be found at L<http://code.google.com/p/pyev/>. It\nseems to be quite complete and well-documented.\n\n=item Ruby\n\nTony Arcieri has written a ruby extension that offers access to a subset\nof the libev API and adds file handle abstractions, asynchronous DNS and\nmore on top of it. It can be found via gem servers. Its homepage is at\nL<http://rev.rubyforge.org/>.\n\nRoger Pack reports that using the link order C<-lws2_32 -lmsvcrt-ruby-190>\nmakes rev work even on mingw.\n\n=item Haskell\n\nA haskell binding to libev is available at\nL<http://hackage.haskell.org/cgi-bin/hackage-scripts/package/hlibev>.\n\n=item D\n\nLeandro Lucarella has written a D language binding (F<ev.d>) for libev, to\nbe found at L<http://www.llucax.com.ar/proj/ev.d/index.html>.\n\n=item Ocaml\n\nErkki Seppala has written Ocaml bindings for libev, to be found at\nL<http://modeemi.cs.tut.fi/~flux/software/ocaml-ev/>.\n\n=item Lua\n\nBrian Maher has written a partial interface to libev for lua (at the\ntime of this writing, only C<ev_io> and C<ev_timer>), to be found at\nL<http://github.com/brimworks/lua-ev>.\n\n=item Javascript\n\nNode.js (L<http://nodejs.org>) uses libev as the underlying event library.\n\n=item Others\n\nThere are others, and I stopped counting.\n\n=back\n\n\n=head1 MACRO MAGIC\n\nLibev can be compiled with a variety of options, the most fundamental\nof which is C<EV_MULTIPLICITY>. This option determines whether (most)\nfunctions and callbacks have an initial C<struct ev_loop *> argument.\n\nTo make it easier to write programs that cope with either variant, the\nfollowing macros are defined:\n\n=over 4\n\n=item C<EV_A>, C<EV_A_>\n\nThis provides the loop I<argument> for functions, if one is required (\"ev\nloop argument\"). The C<EV_A> form is used when this is the sole argument,\nC<EV_A_> is used when other arguments are following. Example:\n\n   ev_unref (EV_A);\n   ev_timer_add (EV_A_ watcher);\n   ev_run (EV_A_ 0);\n\nIt assumes the variable C<loop> of type C<struct ev_loop *> is in scope,\nwhich is often provided by the following macro.\n\n=item C<EV_P>, C<EV_P_>\n\nThis provides the loop I<parameter> for functions, if one is required (\"ev\nloop parameter\"). The C<EV_P> form is used when this is the sole parameter,\nC<EV_P_> is used when other parameters are following. Example:\n\n   // this is how ev_unref is being declared\n   static void ev_unref (EV_P);\n\n   // this is how you can declare your typical callback\n   static void cb (EV_P_ ev_timer *w, int revents)\n\nIt declares a parameter C<loop> of type C<struct ev_loop *>, quite\nsuitable for use with C<EV_A>.\n\n=item C<EV_DEFAULT>, C<EV_DEFAULT_>\n\nSimilar to the other two macros, this gives you the value of the default\nloop, if multiple loops are supported (\"ev loop default\"). The default loop\nwill be initialised if it isn't already initialised.\n\nFor non-multiplicity builds, these macros do nothing, so you always have\nto initialise the loop somewhere.\n\n=item C<EV_DEFAULT_UC>, C<EV_DEFAULT_UC_>\n\nUsage identical to C<EV_DEFAULT> and C<EV_DEFAULT_>, but requires that the\ndefault loop has been initialised (C<UC> == unchecked). Their behaviour\nis undefined when the default loop has not been initialised by a previous\nexecution of C<EV_DEFAULT>, C<EV_DEFAULT_> or C<ev_default_init (...)>.\n\nIt is often prudent to use C<EV_DEFAULT> when initialising the first\nwatcher in a function but use C<EV_DEFAULT_UC> afterwards.\n\n=back\n\nExample: Declare and initialise a check watcher, utilising the above\nmacros so it will work regardless of whether multiple loops are supported\nor not.\n\n   static void\n   check_cb (EV_P_ ev_timer *w, int revents)\n   {\n     ev_check_stop (EV_A_ w);\n   }\n\n   ev_check check;\n   ev_check_init (&check, check_cb);\n   ev_check_start (EV_DEFAULT_ &check);\n   ev_run (EV_DEFAULT_ 0);\n\n=head1 EMBEDDING\n\nLibev can (and often is) directly embedded into host\napplications. Examples of applications that embed it include the Deliantra\nGame Server, the EV perl module, the GNU Virtual Private Ethernet (gvpe)\nand rxvt-unicode.\n\nThe goal is to enable you to just copy the necessary files into your\nsource directory without having to change even a single line in them, so\nyou can easily upgrade by simply copying (or having a checked-out copy of\nlibev somewhere in your source tree).\n\n=head2 FILESETS\n\nDepending on what features you need you need to include one or more sets of files\nin your application.\n\n=head3 CORE EVENT LOOP\n\nTo include only the libev core (all the C<ev_*> functions), with manual\nconfiguration (no autoconf):\n\n   #define EV_STANDALONE 1\n   #include \"ev.c\"\n\nThis will automatically include F<ev.h>, too, and should be done in a\nsingle C source file only to provide the function implementations. To use\nit, do the same for F<ev.h> in all files wishing to use this API (best\ndone by writing a wrapper around F<ev.h> that you can include instead and\nwhere you can put other configuration options):\n\n   #define EV_STANDALONE 1\n   #include \"ev.h\"\n\nBoth header files and implementation files can be compiled with a C++\ncompiler (at least, that's a stated goal, and breakage will be treated\nas a bug).\n\nYou need the following files in your source tree, or in a directory\nin your include path (e.g. in libev/ when using -Ilibev):\n\n   ev.h\n   ev.c\n   ev_vars.h\n   ev_wrap.h\n\n   ev_win32.c      required on win32 platforms only\n\n   ev_select.c     only when select backend is enabled (which is enabled by default)\n   ev_poll.c       only when poll backend is enabled (disabled by default)\n   ev_epoll.c      only when the epoll backend is enabled (disabled by default)\n   ev_kqueue.c     only when the kqueue backend is enabled (disabled by default)\n   ev_port.c       only when the solaris port backend is enabled (disabled by default)\n\nF<ev.c> includes the backend files directly when enabled, so you only need\nto compile this single file.\n\n=head3 LIBEVENT COMPATIBILITY API\n\nTo include the libevent compatibility API, also include:\n\n   #include \"event.c\"\n\nin the file including F<ev.c>, and:\n\n   #include \"event.h\"\n\nin the files that want to use the libevent API. This also includes F<ev.h>.\n\nYou need the following additional files for this:\n\n   event.h\n   event.c\n\n=head3 AUTOCONF SUPPORT\n\nInstead of using C<EV_STANDALONE=1> and providing your configuration in\nwhatever way you want, you can also C<m4_include([libev.m4])> in your\nF<configure.ac> and leave C<EV_STANDALONE> undefined. F<ev.c> will then\ninclude F<config.h> and configure itself accordingly.\n\nFor this of course you need the m4 file:\n\n   libev.m4\n\n=head2 PREPROCESSOR SYMBOLS/MACROS\n\nLibev can be configured via a variety of preprocessor symbols you have to\ndefine before including (or compiling) any of its files. The default in\nthe absence of autoconf is documented for every option.\n\nSymbols marked with \"(h)\" do not change the ABI, and can have different\nvalues when compiling libev vs. including F<ev.h>, so it is permissible\nto redefine them before including F<ev.h> without breaking compatibility\nto a compiled library. All other symbols change the ABI, which means all\nusers of libev and the libev code itself must be compiled with compatible\nsettings.\n\n=over 4\n\n=item EV_COMPAT3 (h)\n\nBackwards compatibility is a major concern for libev. This is why this\nrelease of libev comes with wrappers for the functions and symbols that\nhave been renamed between libev version 3 and 4.\n\nYou can disable these wrappers (to test compatibility with future\nversions) by defining C<EV_COMPAT3> to C<0> when compiling your\nsources. This has the additional advantage that you can drop the C<struct>\nfrom C<struct ev_loop> declarations, as libev will provide an C<ev_loop>\ntypedef in that case.\n\nIn some future version, the default for C<EV_COMPAT3> will become C<0>,\nand in some even more future version the compatibility code will be\nremoved completely.\n\n=item EV_STANDALONE (h)\n\nMust always be C<1> if you do not use autoconf configuration, which\nkeeps libev from including F<config.h>, and it also defines dummy\nimplementations for some libevent functions (such as logging, which is not\nsupported). It will also not define any of the structs usually found in\nF<event.h> that are not directly supported by the libev core alone.\n\nIn standalone mode, libev will still try to automatically deduce the\nconfiguration, but has to be more conservative.\n\n=item EV_USE_FLOOR\n\nIf defined to be C<1>, libev will use the C<floor ()> function for its\nperiodic reschedule calculations, otherwise libev will fall back on a\nportable (slower) implementation. If you enable this, you usually have to\nlink against libm or something equivalent. Enabling this when the C<floor>\nfunction is not available will fail, so the safe default is to not enable\nthis.\n\n=item EV_USE_MONOTONIC\n\nIf defined to be C<1>, libev will try to detect the availability of the\nmonotonic clock option at both compile time and runtime. Otherwise no\nuse of the monotonic clock option will be attempted. If you enable this,\nyou usually have to link against librt or something similar. Enabling it\nwhen the functionality isn't available is safe, though, although you have\nto make sure you link against any libraries where the C<clock_gettime>\nfunction is hiding in (often F<-lrt>). See also C<EV_USE_CLOCK_SYSCALL>.\n\n=item EV_USE_REALTIME\n\nIf defined to be C<1>, libev will try to detect the availability of the\nreal-time clock option at compile time (and assume its availability\nat runtime if successful). Otherwise no use of the real-time clock\noption will be attempted. This effectively replaces C<gettimeofday>\nby C<clock_get (CLOCK_REALTIME, ...)> and will not normally affect\ncorrectness. See the note about libraries in the description of\nC<EV_USE_MONOTONIC>, though. Defaults to the opposite value of\nC<EV_USE_CLOCK_SYSCALL>.\n\n=item EV_USE_CLOCK_SYSCALL\n\nIf defined to be C<1>, libev will try to use a direct syscall instead\nof calling the system-provided C<clock_gettime> function. This option\nexists because on GNU/Linux, C<clock_gettime> is in C<librt>, but C<librt>\nunconditionally pulls in C<libpthread>, slowing down single-threaded\nprograms needlessly. Using a direct syscall is slightly slower (in\ntheory), because no optimised vdso implementation can be used, but avoids\nthe pthread dependency. Defaults to C<1> on GNU/Linux with glibc 2.x or\nhigher, as it simplifies linking (no need for C<-lrt>).\n\n=item EV_USE_NANOSLEEP\n\nIf defined to be C<1>, libev will assume that C<nanosleep ()> is available\nand will use it for delays. Otherwise it will use C<select ()>.\n\n=item EV_USE_EVENTFD\n\nIf defined to be C<1>, then libev will assume that C<eventfd ()> is\navailable and will probe for kernel support at runtime. This will improve\nC<ev_signal> and C<ev_async> performance and reduce resource consumption.\nIf undefined, it will be enabled if the headers indicate GNU/Linux + Glibc\n2.7 or newer, otherwise disabled.\n\n=item EV_USE_SELECT\n\nIf undefined or defined to be C<1>, libev will compile in support for the\nC<select>(2) backend. No attempt at auto-detection will be done: if no\nother method takes over, select will be it. Otherwise the select backend\nwill not be compiled in.\n\n=item EV_SELECT_USE_FD_SET\n\nIf defined to C<1>, then the select backend will use the system C<fd_set>\nstructure. This is useful if libev doesn't compile due to a missing\nC<NFDBITS> or C<fd_mask> definition or it mis-guesses the bitset layout\non exotic systems. This usually limits the range of file descriptors to\nsome low limit such as 1024 or might have other limitations (winsocket\nonly allows 64 sockets). The C<FD_SETSIZE> macro, set before compilation,\nconfigures the maximum size of the C<fd_set>.\n\n=item EV_SELECT_IS_WINSOCKET\n\nWhen defined to C<1>, the select backend will assume that\nselect/socket/connect etc. don't understand file descriptors but\nwants osf handles on win32 (this is the case when the select to\nbe used is the winsock select). This means that it will call\nC<_get_osfhandle> on the fd to convert it to an OS handle. Otherwise,\nit is assumed that all these functions actually work on fds, even\non win32. Should not be defined on non-win32 platforms.\n\n=item EV_FD_TO_WIN32_HANDLE(fd)\n\nIf C<EV_SELECT_IS_WINSOCKET> is enabled, then libev needs a way to map\nfile descriptors to socket handles. When not defining this symbol (the\ndefault), then libev will call C<_get_osfhandle>, which is usually\ncorrect. In some cases, programs use their own file descriptor management,\nin which case they can provide this function to map fds to socket handles.\n\n=item EV_WIN32_HANDLE_TO_FD(handle)\n\nIf C<EV_SELECT_IS_WINSOCKET> then libev maps handles to file descriptors\nusing the standard C<_open_osfhandle> function. For programs implementing\ntheir own fd to handle mapping, overwriting this function makes it easier\nto do so. This can be done by defining this macro to an appropriate value.\n\n=item EV_WIN32_CLOSE_FD(fd)\n\nIf programs implement their own fd to handle mapping on win32, then this\nmacro can be used to override the C<close> function, useful to unregister\nfile descriptors again. Note that the replacement function has to close\nthe underlying OS handle.\n\n=item EV_USE_WSASOCKET\n\nIf defined to be C<1>, libev will use C<WSASocket> to create its internal\ncommunication socket, which works better in some environments. Otherwise,\nthe normal C<socket> function will be used, which works better in other\nenvironments.\n\n=item EV_USE_POLL\n\nIf defined to be C<1>, libev will compile in support for the C<poll>(2)\nbackend. Otherwise it will be enabled on non-win32 platforms. It\ntakes precedence over select.\n\n=item EV_USE_EPOLL\n\nIf defined to be C<1>, libev will compile in support for the Linux\nC<epoll>(7) backend. Its availability will be detected at runtime,\notherwise another method will be used as fallback. This is the preferred\nbackend for GNU/Linux systems. If undefined, it will be enabled if the\nheaders indicate GNU/Linux + Glibc 2.4 or newer, otherwise disabled.\n\n=item EV_USE_KQUEUE\n\nIf defined to be C<1>, libev will compile in support for the BSD style\nC<kqueue>(2) backend. Its actual availability will be detected at runtime,\notherwise another method will be used as fallback. This is the preferred\nbackend for BSD and BSD-like systems, although on most BSDs kqueue only\nsupports some types of fds correctly (the only platform we found that\nsupports ptys for example was NetBSD), so kqueue might be compiled in, but\nnot be used unless explicitly requested. The best way to use it is to find\nout whether kqueue supports your type of fd properly and use an embedded\nkqueue loop.\n\n=item EV_USE_PORT\n\nIf defined to be C<1>, libev will compile in support for the Solaris\n10 port style backend. Its availability will be detected at runtime,\notherwise another method will be used as fallback. This is the preferred\nbackend for Solaris 10 systems.\n\n=item EV_USE_DEVPOLL\n\nReserved for future expansion, works like the USE symbols above.\n\n=item EV_USE_INOTIFY\n\nIf defined to be C<1>, libev will compile in support for the Linux inotify\ninterface to speed up C<ev_stat> watchers. Its actual availability will\nbe detected at runtime. If undefined, it will be enabled if the headers\nindicate GNU/Linux + Glibc 2.4 or newer, otherwise disabled.\n\n=item EV_NO_SMP\n\nIf defined to be C<1>, libev will assume that memory is always coherent\nbetween threads, that is, threads can be used, but threads never run on\ndifferent cpus (or different cpu cores). This reduces dependencies\nand makes libev faster.\n\n=item EV_NO_THREADS\n\nIf defined to be C<1>, libev will assume that it will never be called from\ndifferent threads (that includes signal handlers), which is a stronger\nassumption than C<EV_NO_SMP>, above. This reduces dependencies and makes\nlibev faster.\n\n=item EV_ATOMIC_T\n\nLibev requires an integer type (suitable for storing C<0> or C<1>) whose\naccess is atomic with respect to other threads or signal contexts. No\nsuch type is easily found in the C language, so you can provide your own\ntype that you know is safe for your purposes. It is used both for signal\nhandler \"locking\" as well as for signal and thread safety in C<ev_async>\nwatchers.\n\nIn the absence of this define, libev will use C<sig_atomic_t volatile>\n(from F<signal.h>), which is usually good enough on most platforms.\n\n=item EV_H (h)\n\nThe name of the F<ev.h> header file used to include it. The default if\nundefined is C<\"ev.h\"> in F<event.h>, F<ev.c> and F<ev++.h>. This can be\nused to virtually rename the F<ev.h> header file in case of conflicts.\n\n=item EV_CONFIG_H (h)\n\nIf C<EV_STANDALONE> isn't C<1>, this variable can be used to override\nF<ev.c>'s idea of where to find the F<config.h> file, similarly to\nC<EV_H>, above.\n\n=item EV_EVENT_H (h)\n\nSimilarly to C<EV_H>, this macro can be used to override F<event.c>'s idea\nof how the F<event.h> header can be found, the default is C<\"event.h\">.\n\n=item EV_PROTOTYPES (h)\n\nIf defined to be C<0>, then F<ev.h> will not define any function\nprototypes, but still define all the structs and other symbols. This is\noccasionally useful if you want to provide your own wrapper functions\naround libev functions.\n\n=item EV_MULTIPLICITY\n\nIf undefined or defined to C<1>, then all event-loop-specific functions\nwill have the C<struct ev_loop *> as first argument, and you can create\nadditional independent event loops. Otherwise there will be no support\nfor multiple event loops and there is no first event loop pointer\nargument. Instead, all functions act on the single default loop.\n\nNote that C<EV_DEFAULT> and C<EV_DEFAULT_> will no longer provide a\ndefault loop when multiplicity is switched off - you always have to\ninitialise the loop manually in this case.\n\n=item EV_MINPRI\n\n=item EV_MAXPRI\n\nThe range of allowed priorities. C<EV_MINPRI> must be smaller or equal to\nC<EV_MAXPRI>, but otherwise there are no non-obvious limitations. You can\nprovide for more priorities by overriding those symbols (usually defined\nto be C<-2> and C<2>, respectively).\n\nWhen doing priority-based operations, libev usually has to linearly search\nall the priorities, so having many of them (hundreds) uses a lot of space\nand time, so using the defaults of five priorities (-2 .. +2) is usually\nfine.\n\nIf your embedding application does not need any priorities, defining these\nboth to C<0> will save some memory and CPU.\n\n=item EV_PERIODIC_ENABLE, EV_IDLE_ENABLE, EV_EMBED_ENABLE, EV_STAT_ENABLE,\nEV_PREPARE_ENABLE, EV_CHECK_ENABLE, EV_FORK_ENABLE, EV_SIGNAL_ENABLE,\nEV_ASYNC_ENABLE, EV_CHILD_ENABLE.\n\nIf undefined or defined to be C<1> (and the platform supports it), then\nthe respective watcher type is supported. If defined to be C<0>, then it\nis not. Disabling watcher types mainly saves code size.\n\n=item EV_FEATURES\n\nIf you need to shave off some kilobytes of code at the expense of some\nspeed (but with the full API), you can define this symbol to request\ncertain subsets of functionality. The default is to enable all features\nthat can be enabled on the platform.\n\nA typical way to use this symbol is to define it to C<0> (or to a bitset\nwith some broad features you want) and then selectively re-enable\nadditional parts you want, for example if you want everything minimal,\nbut multiple event loop support, async and child watchers and the poll\nbackend, use this:\n\n   #define EV_FEATURES 0\n   #define EV_MULTIPLICITY 1\n   #define EV_USE_POLL 1\n   #define EV_CHILD_ENABLE 1\n   #define EV_ASYNC_ENABLE 1\n\nThe actual value is a bitset, it can be a combination of the following\nvalues (by default, all of these are enabled):\n\n=over 4\n\n=item C<1> - faster/larger code\n\nUse larger code to speed up some operations.\n\nCurrently this is used to override some inlining decisions (enlarging the\ncode size by roughly 30% on amd64).\n\nWhen optimising for size, use of compiler flags such as C<-Os> with\ngcc is recommended, as well as C<-DNDEBUG>, as libev contains a number of\nassertions.\n\nThe default is off when C<__OPTIMIZE_SIZE__> is defined by your compiler\n(e.g. gcc with C<-Os>).\n\n=item C<2> - faster/larger data structures\n\nReplaces the small 2-heap for timer management by a faster 4-heap, larger\nhash table sizes and so on. This will usually further increase code size\nand can additionally have an effect on the size of data structures at\nruntime.\n\nThe default is off when C<__OPTIMIZE_SIZE__> is defined by your compiler\n(e.g. gcc with C<-Os>).\n\n=item C<4> - full API configuration\n\nThis enables priorities (sets C<EV_MAXPRI>=2 and C<EV_MINPRI>=-2), and\nenables multiplicity (C<EV_MULTIPLICITY>=1).\n\n=item C<8> - full API\n\nThis enables a lot of the \"lesser used\" API functions. See C<ev.h> for\ndetails on which parts of the API are still available without this\nfeature, and do not complain if this subset changes over time.\n\n=item C<16> - enable all optional watcher types\n\nEnables all optional watcher types.  If you want to selectively enable\nonly some watcher types other than I/O and timers (e.g. prepare,\nembed, async, child...) you can enable them manually by defining\nC<EV_watchertype_ENABLE> to C<1> instead.\n\n=item C<32> - enable all backends\n\nThis enables all backends - without this feature, you need to enable at\nleast one backend manually (C<EV_USE_SELECT> is a good choice).\n\n=item C<64> - enable OS-specific \"helper\" APIs\n\nEnable inotify, eventfd, signalfd and similar OS-specific helper APIs by\ndefault.\n\n=back\n\nCompiling with C<gcc -Os -DEV_STANDALONE -DEV_USE_EPOLL=1 -DEV_FEATURES=0>\nreduces the compiled size of libev from 24.7Kb code/2.8Kb data to 6.5Kb\ncode/0.3Kb data on my GNU/Linux amd64 system, while still giving you I/O\nwatchers, timers and monotonic clock support.\n\nWith an intelligent-enough linker (gcc+binutils are intelligent enough\nwhen you use C<-Wl,--gc-sections -ffunction-sections>) functions unused by\nyour program might be left out as well - a binary starting a timer and an\nI/O watcher then might come out at only 5Kb.\n\n=item EV_API_STATIC\n\nIf this symbol is defined (by default it is not), then all identifiers\nwill have static linkage. This means that libev will not export any\nidentifiers, and you cannot link against libev anymore. This can be useful\nwhen you embed libev, only want to use libev functions in a single file,\nand do not want its identifiers to be visible.\n\nTo use this, define C<EV_API_STATIC> and include F<ev.c> in the file that\nwants to use libev.\n\nThis option only works when libev is compiled with a C compiler, as C++\ndoesn't support the required declaration syntax.\n\n=item EV_AVOID_STDIO\n\nIf this is set to C<1> at compiletime, then libev will avoid using stdio\nfunctions (printf, scanf, perror etc.). This will increase the code size\nsomewhat, but if your program doesn't otherwise depend on stdio and your\nlibc allows it, this avoids linking in the stdio library which is quite\nbig.\n\nNote that error messages might become less precise when this option is\nenabled.\n\n=item EV_NSIG\n\nThe highest supported signal number, +1 (or, the number of\nsignals): Normally, libev tries to deduce the maximum number of signals\nautomatically, but sometimes this fails, in which case it can be\nspecified. Also, using a lower number than detected (C<32> should be\ngood for about any system in existence) can save some memory, as libev\nstatically allocates some 12-24 bytes per signal number.\n\n=item EV_PID_HASHSIZE\n\nC<ev_child> watchers use a small hash table to distribute workload by\npid. The default size is C<16> (or C<1> with C<EV_FEATURES> disabled),\nusually more than enough. If you need to manage thousands of children you\nmight want to increase this value (I<must> be a power of two).\n\n=item EV_INOTIFY_HASHSIZE\n\nC<ev_stat> watchers use a small hash table to distribute workload by\ninotify watch id. The default size is C<16> (or C<1> with C<EV_FEATURES>\ndisabled), usually more than enough. If you need to manage thousands of\nC<ev_stat> watchers you might want to increase this value (I<must> be a\npower of two).\n\n=item EV_USE_4HEAP\n\nHeaps are not very cache-efficient. To improve the cache-efficiency of the\ntimer and periodics heaps, libev uses a 4-heap when this symbol is defined\nto C<1>. The 4-heap uses more complicated (longer) code but has noticeably\nfaster performance with many (thousands) of watchers.\n\nThe default is C<1>, unless C<EV_FEATURES> overrides it, in which case it\nwill be C<0>.\n\n=item EV_HEAP_CACHE_AT\n\nHeaps are not very cache-efficient. To improve the cache-efficiency of the\ntimer and periodics heaps, libev can cache the timestamp (I<at>) within\nthe heap structure (selected by defining C<EV_HEAP_CACHE_AT> to C<1>),\nwhich uses 8-12 bytes more per watcher and a few hundred bytes more code,\nbut avoids random read accesses on heap changes. This improves performance\nnoticeably with many (hundreds) of watchers.\n\nThe default is C<1>, unless C<EV_FEATURES> overrides it, in which case it\nwill be C<0>.\n\n=item EV_VERIFY\n\nControls how much internal verification (see C<ev_verify ()>) will\nbe done: If set to C<0>, no internal verification code will be compiled\nin. If set to C<1>, then verification code will be compiled in, but not\ncalled. If set to C<2>, then the internal verification code will be\ncalled once per loop, which can slow down libev. If set to C<3>, then the\nverification code will be called very frequently, which will slow down\nlibev considerably.\n\nThe default is C<1>, unless C<EV_FEATURES> overrides it, in which case it\nwill be C<0>.\n\n=item EV_COMMON\n\nBy default, all watchers have a C<void *data> member. By redefining\nthis macro to something else you can include more and other types of\nmembers. You have to define it each time you include one of the files,\nthough, and it must be identical each time.\n\nFor example, the perl EV module uses something like this:\n\n   #define EV_COMMON                       \\\n     SV *self; /* contains this struct */  \\\n     SV *cb_sv, *fh /* note no trailing \";\" */\n\n=item EV_CB_DECLARE (type)\n\n=item EV_CB_INVOKE (watcher, revents)\n\n=item ev_set_cb (ev, cb)\n\nCan be used to change the callback member declaration in each watcher,\nand the way callbacks are invoked and set. Must expand to a struct member\ndefinition and a statement, respectively. See the F<ev.h> header file for\ntheir default definitions. One possible use for overriding these is to\navoid the C<struct ev_loop *> as first argument in all cases, or to use\nmethod calls instead of plain function calls in C++.\n\n=back\n\n=head2 EXPORTED API SYMBOLS\n\nIf you need to re-export the API (e.g. via a DLL) and you need a list of\nexported symbols, you can use the provided F<Symbol.*> files which list\nall public symbols, one per line:\n\n   Symbols.ev      for libev proper\n   Symbols.event   for the libevent emulation\n\nThis can also be used to rename all public symbols to avoid clashes with\nmultiple versions of libev linked together (which is obviously bad in\nitself, but sometimes it is inconvenient to avoid this).\n\nA sed command like this will create wrapper C<#define>'s that you need to\ninclude before including F<ev.h>:\n\n   <Symbols.ev sed -e \"s/.*/#define & myprefix_&/\" >wrap.h\n\nThis would create a file F<wrap.h> which essentially looks like this:\n\n   #define ev_backend     myprefix_ev_backend\n   #define ev_check_start myprefix_ev_check_start\n   #define ev_check_stop  myprefix_ev_check_stop\n   ...\n\n=head2 EXAMPLES\n\nFor a real-world example of a program the includes libev\nverbatim, you can have a look at the EV perl module\n(L<http://software.schmorp.de/pkg/EV.html>). It has the libev files in\nthe F<libev/> subdirectory and includes them in the F<EV/EVAPI.h> (public\ninterface) and F<EV.xs> (implementation) files. Only the F<EV.xs> file\nwill be compiled. It is pretty complex because it provides its own header\nfile.\n\nThe usage in rxvt-unicode is simpler. It has a F<ev_cpp.h> header file\nthat everybody includes and which overrides some configure choices:\n\n   #define EV_FEATURES 8\n   #define EV_USE_SELECT 1\n   #define EV_PREPARE_ENABLE 1\n   #define EV_IDLE_ENABLE 1\n   #define EV_SIGNAL_ENABLE 1\n   #define EV_CHILD_ENABLE 1\n   #define EV_USE_STDEXCEPT 0\n   #define EV_CONFIG_H <config.h>\n\n   #include \"ev++.h\"\n\nAnd a F<ev_cpp.C> implementation file that contains libev proper and is compiled:\n\n   #include \"ev_cpp.h\"\n   #include \"ev.c\"\n\n=head1 INTERACTION WITH OTHER PROGRAMS, LIBRARIES OR THE ENVIRONMENT\n\n=head2 THREADS AND COROUTINES\n\n=head3 THREADS\n\nAll libev functions are reentrant and thread-safe unless explicitly\ndocumented otherwise, but libev implements no locking itself. This means\nthat you can use as many loops as you want in parallel, as long as there\nare no concurrent calls into any libev function with the same loop\nparameter (C<ev_default_*> calls have an implicit default loop parameter,\nof course): libev guarantees that different event loops share no data\nstructures that need any locking.\n\nOr to put it differently: calls with different loop parameters can be done\nconcurrently from multiple threads, calls with the same loop parameter\nmust be done serially (but can be done from different threads, as long as\nonly one thread ever is inside a call at any point in time, e.g. by using\na mutex per loop).\n\nSpecifically to support threads (and signal handlers), libev implements\nso-called C<ev_async> watchers, which allow some limited form of\nconcurrency on the same event loop, namely waking it up \"from the\noutside\".\n\nIf you want to know which design (one loop, locking, or multiple loops\nwithout or something else still) is best for your problem, then I cannot\nhelp you, but here is some generic advice:\n\n=over 4\n\n=item * most applications have a main thread: use the default libev loop\nin that thread, or create a separate thread running only the default loop.\n\nThis helps integrating other libraries or software modules that use libev\nthemselves and don't care/know about threading.\n\n=item * one loop per thread is usually a good model.\n\nDoing this is almost never wrong, sometimes a better-performance model\nexists, but it is always a good start.\n\n=item * other models exist, such as the leader/follower pattern, where one\nloop is handed through multiple threads in a kind of round-robin fashion.\n\nChoosing a model is hard - look around, learn, know that usually you can do\nbetter than you currently do :-)\n\n=item * often you need to talk to some other thread which blocks in the\nevent loop.\n\nC<ev_async> watchers can be used to wake them up from other threads safely\n(or from signal contexts...).\n\nAn example use would be to communicate signals or other events that only\nwork in the default loop by registering the signal watcher with the\ndefault loop and triggering an C<ev_async> watcher from the default loop\nwatcher callback into the event loop interested in the signal.\n\n=back\n\nSee also L</THREAD LOCKING EXAMPLE>.\n\n=head3 COROUTINES\n\nLibev is very accommodating to coroutines (\"cooperative threads\"):\nlibev fully supports nesting calls to its functions from different\ncoroutines (e.g. you can call C<ev_run> on the same loop from two\ndifferent coroutines, and switch freely between both coroutines running\nthe loop, as long as you don't confuse yourself). The only exception is\nthat you must not do this from C<ev_periodic> reschedule callbacks.\n\nCare has been taken to ensure that libev does not keep local state inside\nC<ev_run>, and other calls do not usually allow for coroutine switches as\nthey do not call any callbacks.\n\n=head2 COMPILER WARNINGS\n\nDepending on your compiler and compiler settings, you might get no or a\nlot of warnings when compiling libev code. Some people are apparently\nscared by this.\n\nHowever, these are unavoidable for many reasons. For one, each compiler\nhas different warnings, and each user has different tastes regarding\nwarning options. \"Warn-free\" code therefore cannot be a goal except when\ntargeting a specific compiler and compiler-version.\n\nAnother reason is that some compiler warnings require elaborate\nworkarounds, or other changes to the code that make it less clear and less\nmaintainable.\n\nAnd of course, some compiler warnings are just plain stupid, or simply\nwrong (because they don't actually warn about the condition their message\nseems to warn about). For example, certain older gcc versions had some\nwarnings that resulted in an extreme number of false positives. These have\nbeen fixed, but some people still insist on making code warn-free with\nsuch buggy versions.\n\nWhile libev is written to generate as few warnings as possible,\n\"warn-free\" code is not a goal, and it is recommended not to build libev\nwith any compiler warnings enabled unless you are prepared to cope with\nthem (e.g. by ignoring them). Remember that warnings are just that:\nwarnings, not errors, or proof of bugs.\n\n\n=head2 VALGRIND\n\nValgrind has a special section here because it is a popular tool that is\nhighly useful. Unfortunately, valgrind reports are very hard to interpret.\n\nIf you think you found a bug (memory leak, uninitialised data access etc.)\nin libev, then check twice: If valgrind reports something like:\n\n   ==2274==    definitely lost: 0 bytes in 0 blocks.\n   ==2274==      possibly lost: 0 bytes in 0 blocks.\n   ==2274==    still reachable: 256 bytes in 1 blocks.\n\nThen there is no memory leak, just as memory accounted to global variables\nis not a memleak - the memory is still being referenced, and didn't leak.\n\nSimilarly, under some circumstances, valgrind might report kernel bugs\nas if it were a bug in libev (e.g. in realloc or in the poll backend,\nalthough an acceptable workaround has been found here), or it might be\nconfused.\n\nKeep in mind that valgrind is a very good tool, but only a tool. Don't\nmake it into some kind of religion.\n\nIf you are unsure about something, feel free to contact the mailing list\nwith the full valgrind report and an explanation on why you think this\nis a bug in libev (best check the archives, too :). However, don't be\nannoyed when you get a brisk \"this is no bug\" answer and take the chance\nof learning how to interpret valgrind properly.\n\nIf you need, for some reason, empty reports from valgrind for your project\nI suggest using suppression lists.\n\n\n=head1 PORTABILITY NOTES\n\n=head2 GNU/LINUX 32 BIT LIMITATIONS\n\nGNU/Linux is the only common platform that supports 64 bit file/large file\ninterfaces but I<disables> them by default.\n\nThat means that libev compiled in the default environment doesn't support\nfiles larger than 2GiB or so, which mainly affects C<ev_stat> watchers.\n\nUnfortunately, many programs try to work around this GNU/Linux issue\nby enabling the large file API, which makes them incompatible with the\nstandard libev compiled for their system.\n\nLikewise, libev cannot enable the large file API itself as this would\nsuddenly make it incompatible to the default compile time environment,\ni.e. all programs not using special compile switches.\n\n=head2 OS/X AND DARWIN BUGS\n\nThe whole thing is a bug if you ask me - basically any system interface\nyou touch is broken, whether it is locales, poll, kqueue or even the\nOpenGL drivers.\n\n=head3 C<kqueue> is buggy\n\nThe kqueue syscall is broken in all known versions - most versions support\nonly sockets, many support pipes.\n\nLibev tries to work around this by not using C<kqueue> by default on this\nrotten platform, but of course you can still ask for it when creating a\nloop - embedding a socket-only kqueue loop into a select-based one is\nprobably going to work well.\n\n=head3 C<poll> is buggy\n\nInstead of fixing C<kqueue>, Apple replaced their (working) C<poll>\nimplementation by something calling C<kqueue> internally around the 10.5.6\nrelease, so now C<kqueue> I<and> C<poll> are broken.\n\nLibev tries to work around this by not using C<poll> by default on\nthis rotten platform, but of course you can still ask for it when creating\na loop.\n\n=head3 C<select> is buggy\n\nAll that's left is C<select>, and of course Apple found a way to fuck this\none up as well: On OS/X, C<select> actively limits the number of file\ndescriptors you can pass in to 1024 - your program suddenly crashes when\nyou use more.\n\nThere is an undocumented \"workaround\" for this - defining\nC<_DARWIN_UNLIMITED_SELECT>, which libev tries to use, so select I<should>\nwork on OS/X.\n\n=head2 SOLARIS PROBLEMS AND WORKAROUNDS\n\n=head3 C<errno> reentrancy\n\nThe default compile environment on Solaris is unfortunately so\nthread-unsafe that you can't even use components/libraries compiled\nwithout C<-D_REENTRANT> in a threaded program, which, of course, isn't\ndefined by default. A valid, if stupid, implementation choice.\n\nIf you want to use libev in threaded environments you have to make sure\nit's compiled with C<_REENTRANT> defined.\n\n=head3 Event port backend\n\nThe scalable event interface for Solaris is called \"event\nports\". Unfortunately, this mechanism is very buggy in all major\nreleases. If you run into high CPU usage, your program freezes or you get\na large number of spurious wakeups, make sure you have all the relevant\nand latest kernel patches applied. No, I don't know which ones, but there\nare multiple ones to apply, and afterwards, event ports actually work\ngreat.\n\nIf you can't get it to work, you can try running the program by setting\nthe environment variable C<LIBEV_FLAGS=3> to only allow C<poll> and\nC<select> backends.\n\n=head2 AIX POLL BUG\n\nAIX unfortunately has a broken C<poll.h> header. Libev works around\nthis by trying to avoid the poll backend altogether (i.e. it's not even\ncompiled in), which normally isn't a big problem as C<select> works fine\nwith large bitsets on AIX, and AIX is dead anyway.\n\n=head2 WIN32 PLATFORM LIMITATIONS AND WORKAROUNDS\n\n=head3 General issues\n\nWin32 doesn't support any of the standards (e.g. POSIX) that libev\nrequires, and its I/O model is fundamentally incompatible with the POSIX\nmodel. Libev still offers limited functionality on this platform in\nthe form of the C<EVBACKEND_SELECT> backend, and only supports socket\ndescriptors. This only applies when using Win32 natively, not when using\ne.g. cygwin. Actually, it only applies to the microsofts own compilers,\nas every compiler comes with a slightly differently broken/incompatible\nenvironment.\n\nLifting these limitations would basically require the full\nre-implementation of the I/O system. If you are into this kind of thing,\nthen note that glib does exactly that for you in a very portable way (note\nalso that glib is the slowest event library known to man).\n\nThere is no supported compilation method available on windows except\nembedding it into other applications.\n\nSensible signal handling is officially unsupported by Microsoft - libev\ntries its best, but under most conditions, signals will simply not work.\n\nNot a libev limitation but worth mentioning: windows apparently doesn't\naccept large writes: instead of resulting in a partial write, windows will\neither accept everything or return C<ENOBUFS> if the buffer is too large,\nso make sure you only write small amounts into your sockets (less than a\nmegabyte seems safe, but this apparently depends on the amount of memory\navailable).\n\nDue to the many, low, and arbitrary limits on the win32 platform and\nthe abysmal performance of winsockets, using a large number of sockets\nis not recommended (and not reasonable). If your program needs to use\nmore than a hundred or so sockets, then likely it needs to use a totally\ndifferent implementation for windows, as libev offers the POSIX readiness\nnotification model, which cannot be implemented efficiently on windows\n(due to Microsoft monopoly games).\n\nA typical way to use libev under windows is to embed it (see the embedding\nsection for details) and use the following F<evwrap.h> header file instead\nof F<ev.h>:\n\n   #define EV_STANDALONE              /* keeps ev from requiring config.h */\n   #define EV_SELECT_IS_WINSOCKET 1   /* configure libev for windows select */\n\n   #include \"ev.h\"\n\nAnd compile the following F<evwrap.c> file into your project (make sure\nyou do I<not> compile the F<ev.c> or any other embedded source files!):\n\n   #include \"evwrap.h\"\n   #include \"ev.c\"\n\n=head3 The winsocket C<select> function\n\nThe winsocket C<select> function doesn't follow POSIX in that it\nrequires socket I<handles> and not socket I<file descriptors> (it is\nalso extremely buggy). This makes select very inefficient, and also\nrequires a mapping from file descriptors to socket handles (the Microsoft\nC runtime provides the function C<_open_osfhandle> for this). See the\ndiscussion of the C<EV_SELECT_USE_FD_SET>, C<EV_SELECT_IS_WINSOCKET> and\nC<EV_FD_TO_WIN32_HANDLE> preprocessor symbols for more info.\n\nThe configuration for a \"naked\" win32 using the Microsoft runtime\nlibraries and raw winsocket select is:\n\n   #define EV_USE_SELECT 1\n   #define EV_SELECT_IS_WINSOCKET 1   /* forces EV_SELECT_USE_FD_SET, too */\n\nNote that winsockets handling of fd sets is O(n), so you can easily get a\ncomplexity in the O(n²) range when using win32.\n\n=head3 Limited number of file descriptors\n\nWindows has numerous arbitrary (and low) limits on things.\n\nEarly versions of winsocket's select only supported waiting for a maximum\nof C<64> handles (probably owning to the fact that all windows kernels\ncan only wait for C<64> things at the same time internally; Microsoft\nrecommends spawning a chain of threads and wait for 63 handles and the\nprevious thread in each. Sounds great!).\n\nNewer versions support more handles, but you need to define C<FD_SETSIZE>\nto some high number (e.g. C<2048>) before compiling the winsocket select\ncall (which might be in libev or elsewhere, for example, perl and many\nother interpreters do their own select emulation on windows).\n\nAnother limit is the number of file descriptors in the Microsoft runtime\nlibraries, which by default is C<64> (there must be a hidden I<64>\nfetish or something like this inside Microsoft). You can increase this\nby calling C<_setmaxstdio>, which can increase this limit to C<2048>\n(another arbitrary limit), but is broken in many versions of the Microsoft\nruntime libraries. This might get you to about C<512> or C<2048> sockets\n(depending on windows version and/or the phase of the moon). To get more,\nyou need to wrap all I/O functions and provide your own fd management, but\nthe cost of calling select (O(n²)) will likely make this unworkable.\n\n=head2 PORTABILITY REQUIREMENTS\n\nIn addition to a working ISO-C implementation and of course the\nbackend-specific APIs, libev relies on a few additional extensions:\n\n=over 4\n\n=item C<void (*)(ev_watcher_type *, int revents)> must have compatible\ncalling conventions regardless of C<ev_watcher_type *>.\n\nLibev assumes not only that all watcher pointers have the same internal\nstructure (guaranteed by POSIX but not by ISO C for example), but it also\nassumes that the same (machine) code can be used to call any watcher\ncallback: The watcher callbacks have different type signatures, but libev\ncalls them using an C<ev_watcher *> internally.\n\n=item pointer accesses must be thread-atomic\n\nAccessing a pointer value must be atomic, it must both be readable and\nwritable in one piece - this is the case on all current architectures.\n\n=item C<sig_atomic_t volatile> must be thread-atomic as well\n\nThe type C<sig_atomic_t volatile> (or whatever is defined as\nC<EV_ATOMIC_T>) must be atomic with respect to accesses from different\nthreads. This is not part of the specification for C<sig_atomic_t>, but is\nbelieved to be sufficiently portable.\n\n=item C<sigprocmask> must work in a threaded environment\n\nLibev uses C<sigprocmask> to temporarily block signals. This is not\nallowed in a threaded program (C<pthread_sigmask> has to be used). Typical\npthread implementations will either allow C<sigprocmask> in the \"main\nthread\" or will block signals process-wide, both behaviours would\nbe compatible with libev. Interaction between C<sigprocmask> and\nC<pthread_sigmask> could complicate things, however.\n\nThe most portable way to handle signals is to block signals in all threads\nexcept the initial one, and run the signal handling loop in the initial\nthread as well.\n\n=item C<long> must be large enough for common memory allocation sizes\n\nTo improve portability and simplify its API, libev uses C<long> internally\ninstead of C<size_t> when allocating its data structures. On non-POSIX\nsystems (Microsoft...) this might be unexpectedly low, but is still at\nleast 31 bits everywhere, which is enough for hundreds of millions of\nwatchers.\n\n=item C<double> must hold a time value in seconds with enough accuracy\n\nThe type C<double> is used to represent timestamps. It is required to\nhave at least 51 bits of mantissa (and 9 bits of exponent), which is\ngood enough for at least into the year 4000 with millisecond accuracy\n(the design goal for libev). This requirement is overfulfilled by\nimplementations using IEEE 754, which is basically all existing ones.\n\nWith IEEE 754 doubles, you get microsecond accuracy until at least the\nyear 2255 (and millisecond accuracy till the year 287396 - by then, libev\nis either obsolete or somebody patched it to use C<long double> or\nsomething like that, just kidding).\n\n=back\n\nIf you know of other additional requirements drop me a note.\n\n\n=head1 ALGORITHMIC COMPLEXITIES\n\nIn this section the complexities of (many of) the algorithms used inside\nlibev will be documented. For complexity discussions about backends see\nthe documentation for C<ev_default_init>.\n\nAll of the following are about amortised time: If an array needs to be\nextended, libev needs to realloc and move the whole array, but this\nhappens asymptotically rarer with higher number of elements, so O(1) might\nmean that libev does a lengthy realloc operation in rare cases, but on\naverage it is much faster and asymptotically approaches constant time.\n\n=over 4\n\n=item Starting and stopping timer/periodic watchers: O(log skipped_other_timers)\n\nThis means that, when you have a watcher that triggers in one hour and\nthere are 100 watchers that would trigger before that, then inserting will\nhave to skip roughly seven (C<ld 100>) of these watchers.\n\n=item Changing timer/periodic watchers (by autorepeat or calling again): O(log skipped_other_timers)\n\nThat means that changing a timer costs less than removing/adding them,\nas only the relative motion in the event queue has to be paid for.\n\n=item Starting io/check/prepare/idle/signal/child/fork/async watchers: O(1)\n\nThese just add the watcher into an array or at the head of a list.\n\n=item Stopping check/prepare/idle/fork/async watchers: O(1)\n\n=item Stopping an io/signal/child watcher: O(number_of_watchers_for_this_(fd/signal/pid % EV_PID_HASHSIZE))\n\nThese watchers are stored in lists, so they need to be walked to find the\ncorrect watcher to remove. The lists are usually short (you don't usually\nhave many watchers waiting for the same fd or signal: one is typical, two\nis rare).\n\n=item Finding the next timer in each loop iteration: O(1)\n\nBy virtue of using a binary or 4-heap, the next timer is always found at a\nfixed position in the storage array.\n\n=item Each change on a file descriptor per loop iteration: O(number_of_watchers_for_this_fd)\n\nA change means an I/O watcher gets started or stopped, which requires\nlibev to recalculate its status (and possibly tell the kernel, depending\non backend and whether C<ev_io_set> was used).\n\n=item Activating one watcher (putting it into the pending state): O(1)\n\n=item Priority handling: O(number_of_priorities)\n\nPriorities are implemented by allocating some space for each\npriority. When doing priority-based operations, libev usually has to\nlinearly search all the priorities, but starting/stopping and activating\nwatchers becomes O(1) with respect to priority handling.\n\n=item Sending an ev_async: O(1)\n\n=item Processing ev_async_send: O(number_of_async_watchers)\n\n=item Processing signals: O(max_signal_number)\n\nSending involves a system call I<iff> there were no other C<ev_async_send>\ncalls in the current loop iteration and the loop is currently\nblocked. Checking for async and signal events involves iterating over all\nrunning async watchers or all signal numbers.\n\n=back\n\n\n=head1 PORTING FROM LIBEV 3.X TO 4.X\n\nThe major version 4 introduced some incompatible changes to the API.\n\nAt the moment, the C<ev.h> header file provides compatibility definitions\nfor all changes, so most programs should still compile. The compatibility\nlayer might be removed in later versions of libev, so better update to the\nnew API early than late.\n\n=over 4\n\n=item C<EV_COMPAT3> backwards compatibility mechanism\n\nThe backward compatibility mechanism can be controlled by\nC<EV_COMPAT3>. See L</\"PREPROCESSOR SYMBOLS/MACROS\"> in the L</EMBEDDING>\nsection.\n\n=item C<ev_default_destroy> and C<ev_default_fork> have been removed\n\nThese calls can be replaced easily by their C<ev_loop_xxx> counterparts:\n\n   ev_loop_destroy (EV_DEFAULT_UC);\n   ev_loop_fork (EV_DEFAULT);\n\n=item function/symbol renames\n\nA number of functions and symbols have been renamed:\n\n  ev_loop         => ev_run\n  EVLOOP_NONBLOCK => EVRUN_NOWAIT\n  EVLOOP_ONESHOT  => EVRUN_ONCE\n\n  ev_unloop       => ev_break\n  EVUNLOOP_CANCEL => EVBREAK_CANCEL\n  EVUNLOOP_ONE    => EVBREAK_ONE\n  EVUNLOOP_ALL    => EVBREAK_ALL\n\n  EV_TIMEOUT      => EV_TIMER\n\n  ev_loop_count   => ev_iteration\n  ev_loop_depth   => ev_depth\n  ev_loop_verify  => ev_verify\n\nMost functions working on C<struct ev_loop> objects don't have an\nC<ev_loop_> prefix, so it was removed; C<ev_loop>, C<ev_unloop> and\nassociated constants have been renamed to not collide with the C<struct\nev_loop> anymore and C<EV_TIMER> now follows the same naming scheme\nas all other watcher types. Note that C<ev_loop_fork> is still called\nC<ev_loop_fork> because it would otherwise clash with the C<ev_fork>\ntypedef.\n\n=item C<EV_MINIMAL> mechanism replaced by C<EV_FEATURES>\n\nThe preprocessor symbol C<EV_MINIMAL> has been replaced by a different\nmechanism, C<EV_FEATURES>. Programs using C<EV_MINIMAL> usually compile\nand work, but the library code will of course be larger.\n\n=back\n\n\n=head1 GLOSSARY\n\n=over 4\n\n=item active\n\nA watcher is active as long as it has been started and not yet stopped.\nSee L</WATCHER STATES> for details.\n\n=item application\n\nIn this document, an application is whatever is using libev.\n\n=item backend\n\nThe part of the code dealing with the operating system interfaces.\n\n=item callback\n\nThe address of a function that is called when some event has been\ndetected. Callbacks are being passed the event loop, the watcher that\nreceived the event, and the actual event bitset.\n\n=item callback/watcher invocation\n\nThe act of calling the callback associated with a watcher.\n\n=item event\n\nA change of state of some external event, such as data now being available\nfor reading on a file descriptor, time having passed or simply not having\nany other events happening anymore.\n\nIn libev, events are represented as single bits (such as C<EV_READ> or\nC<EV_TIMER>).\n\n=item event library\n\nA software package implementing an event model and loop.\n\n=item event loop\n\nAn entity that handles and processes external events and converts them\ninto callback invocations.\n\n=item event model\n\nThe model used to describe how an event loop handles and processes\nwatchers and events.\n\n=item pending\n\nA watcher is pending as soon as the corresponding event has been\ndetected. See L</WATCHER STATES> for details.\n\n=item real time\n\nThe physical time that is observed. It is apparently strictly monotonic :)\n\n=item wall-clock time\n\nThe time and date as shown on clocks. Unlike real time, it can actually\nbe wrong and jump forwards and backwards, e.g. when you adjust your\nclock.\n\n=item watcher\n\nA data structure that describes interest in certain events. Watchers need\nto be started (attached to an event loop) before they can receive events.\n\n=back\n\n=head1 AUTHOR\n\nMarc Lehmann <libev@schmorp.de>, with repeated corrections by Mikael\nMagnusson and Emanuele Giaquinta, and minor corrections by many others.\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/ev_epoll.c",
    "content": "/*\n * libev epoll fd activity backend\n *\n * Copyright (c) 2007,2008,2009,2010,2011 Marc Alexander Lehmann <libev@schmorp.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modifica-\n * tion, are permitted provided that the following conditions are met:\n *\n *   1.  Redistributions of source code must retain the above copyright notice,\n *       this list of conditions and the following disclaimer.\n *\n *   2.  Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-\n * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-\n * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-\n * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Alternatively, the contents of this file may be used under the terms of\n * the GNU General Public License (\"GPL\") version 2 or any later version,\n * in which case the provisions of the GPL are applicable instead of\n * the above. If you wish to allow the use of your version of this file\n * only under the terms of the GPL and not to allow others to use your\n * version of this file under the BSD license, indicate your decision\n * by deleting the provisions above and replace them with the notice\n * and other provisions required by the GPL. If you do not delete the\n * provisions above, a recipient may use your version of this file under\n * either the BSD or the GPL.\n */\n\n/*\n * general notes about epoll:\n *\n * a) epoll silently removes fds from the fd set. as nothing tells us\n *    that an fd has been removed otherwise, we have to continually\n *    \"rearm\" fds that we suspect *might* have changed (same\n *    problem with kqueue, but much less costly there).\n * b) the fact that ADD != MOD creates a lot of extra syscalls due to a)\n *    and seems not to have any advantage.\n * c) the inability to handle fork or file descriptors (think dup)\n *    limits the applicability over poll, so this is not a generic\n *    poll replacement.\n * d) epoll doesn't work the same as select with many file descriptors\n *    (such as files). while not critical, no other advanced interface\n *    seems to share this (rather non-unixy) limitation.\n * e) epoll claims to be embeddable, but in practise you never get\n *    a ready event for the epoll fd (broken: <=2.6.26, working: >=2.6.32).\n * f) epoll_ctl returning EPERM means the fd is always ready.\n *\n * lots of \"weird code\" and complication handling in this file is due\n * to these design problems with epoll, as we try very hard to avoid\n * epoll_ctl syscalls for common usage patterns and handle the breakage\n * ensuing from receiving events for closed and otherwise long gone\n * file descriptors.\n */\n\n#include <sys/epoll.h>\n\n#define EV_EMASK_EPERM 0x80\n\nstatic void\nepoll_modify (EV_P_ int fd, int oev, int nev)\n{\n  struct epoll_event ev;\n  unsigned char oldmask;\n\n  /*\n   * we handle EPOLL_CTL_DEL by ignoring it here\n   * on the assumption that the fd is gone anyways\n   * if that is wrong, we have to handle the spurious\n   * event in epoll_poll.\n   * if the fd is added again, we try to ADD it, and, if that\n   * fails, we assume it still has the same eventmask.\n   */\n  if (!nev)\n    return;\n\n  oldmask = anfds [fd].emask;\n  anfds [fd].emask = nev;\n\n  /* store the generation counter in the upper 32 bits, the fd in the lower 32 bits */\n  ev.data.u64 = (uint64_t)(uint32_t)fd\n              | ((uint64_t)(uint32_t)++anfds [fd].egen << 32);\n  ev.events   = (nev & EV_READ  ? EPOLLIN  : 0)\n              | (nev & EV_WRITE ? EPOLLOUT : 0);\n\n  if (expect_true (!epoll_ctl (backend_fd, oev && oldmask != nev ? EPOLL_CTL_MOD : EPOLL_CTL_ADD, fd, &ev)))\n    return;\n\n  if (expect_true (errno == ENOENT))\n    {\n      /* if ENOENT then the fd went away, so try to do the right thing */\n      if (!nev)\n        goto dec_egen;\n\n      if (!epoll_ctl (backend_fd, EPOLL_CTL_ADD, fd, &ev))\n        return;\n    }\n  else if (expect_true (errno == EEXIST))\n    {\n      /* EEXIST means we ignored a previous DEL, but the fd is still active */\n      /* if the kernel mask is the same as the new mask, we assume it hasn't changed */\n      if (oldmask == nev)\n        goto dec_egen;\n\n      if (!epoll_ctl (backend_fd, EPOLL_CTL_MOD, fd, &ev))\n        return;\n    }\n  else if (expect_true (errno == EPERM))\n    {\n      /* EPERM means the fd is always ready, but epoll is too snobbish */\n      /* to handle it, unlike select or poll. */\n      anfds [fd].emask = EV_EMASK_EPERM;\n\n      /* add fd to epoll_eperms, if not already inside */\n      if (!(oldmask & EV_EMASK_EPERM))\n        {\n          array_needsize (int, epoll_eperms, epoll_epermmax, epoll_epermcnt + 1, EMPTY2);\n          epoll_eperms [epoll_epermcnt++] = fd;\n        }\n\n      return;\n    }\n\n  fd_kill (EV_A_ fd);\n\ndec_egen:\n  /* we didn't successfully call epoll_ctl, so decrement the generation counter again */\n  --anfds [fd].egen;\n}\n\nstatic void\nepoll_poll (EV_P_ ev_tstamp timeout)\n{\n  int i;\n  int eventcnt;\n\n  if (expect_false (epoll_epermcnt))\n    timeout = 0.;\n\n  /* epoll wait times cannot be larger than (LONG_MAX - 999UL) / HZ msecs, which is below */\n  /* the default libev max wait time, however. */\n  EV_RELEASE_CB;\n  eventcnt = epoll_wait (backend_fd, epoll_events, epoll_eventmax, timeout * 1e3);\n  EV_ACQUIRE_CB;\n\n  if (expect_false (eventcnt < 0))\n    {\n      if (errno != EINTR)\n        ev_syserr (\"(libev) epoll_wait\");\n\n      return;\n    }\n\n  for (i = 0; i < eventcnt; ++i)\n    {\n      struct epoll_event *ev = epoll_events + i;\n\n      int fd = (uint32_t)ev->data.u64; /* mask out the lower 32 bits */\n      int want = anfds [fd].events;\n      int got  = (ev->events & (EPOLLOUT | EPOLLERR | EPOLLHUP) ? EV_WRITE : 0)\n               | (ev->events & (EPOLLIN  | EPOLLERR | EPOLLHUP) ? EV_READ  : 0);\n\n      /*\n       * check for spurious notification.\n       * this only finds spurious notifications on egen updates\n       * other spurious notifications will be found by epoll_ctl, below\n       * we assume that fd is always in range, as we never shrink the anfds array\n       */\n      if (expect_false ((uint32_t)anfds [fd].egen != (uint32_t)(ev->data.u64 >> 32)))\n        {\n          /* recreate kernel state */\n          postfork |= 2;\n          continue;\n        }\n\n      if (expect_false (got & ~want))\n        {\n          anfds [fd].emask = want;\n\n          /*\n           * we received an event but are not interested in it, try mod or del\n           * this often happens because we optimistically do not unregister fds\n           * when we are no longer interested in them, but also when we get spurious\n           * notifications for fds from another process. this is partially handled\n           * above with the gencounter check (== our fd is not the event fd), and\n           * partially here, when epoll_ctl returns an error (== a child has the fd\n           * but we closed it).\n           */\n          ev->events = (want & EV_READ  ? EPOLLIN  : 0)\n                     | (want & EV_WRITE ? EPOLLOUT : 0);\n\n          /* pre-2.6.9 kernels require a non-null pointer with EPOLL_CTL_DEL, */\n          /* which is fortunately easy to do for us. */\n          if (epoll_ctl (backend_fd, want ? EPOLL_CTL_MOD : EPOLL_CTL_DEL, fd, ev))\n            {\n              postfork |= 2; /* an error occurred, recreate kernel state */\n              continue;\n            }\n        }\n\n      fd_event (EV_A_ fd, got);\n    }\n\n  /* if the receive array was full, increase its size */\n  if (expect_false (eventcnt == epoll_eventmax))\n    {\n      ev_free (epoll_events);\n      epoll_eventmax = array_nextsize (sizeof (struct epoll_event), epoll_eventmax, epoll_eventmax + 1);\n      epoll_events = (struct epoll_event *)ev_malloc (sizeof (struct epoll_event) * epoll_eventmax);\n    }\n\n  /* now synthesize events for all fds where epoll fails, while select works... */\n  for (i = epoll_epermcnt; i--; )\n    {\n      int fd = epoll_eperms [i];\n      unsigned char events = anfds [fd].events & (EV_READ | EV_WRITE);\n\n      if (anfds [fd].emask & EV_EMASK_EPERM && events)\n        fd_event (EV_A_ fd, events);\n      else\n        {\n          epoll_eperms [i] = epoll_eperms [--epoll_epermcnt];\n          anfds [fd].emask = 0;\n        }\n    }\n}\n\nint inline_size\nepoll_init (EV_P_ int flags)\n{\n#ifdef EPOLL_CLOEXEC\n  backend_fd = epoll_create1 (EPOLL_CLOEXEC);\n\n  if (backend_fd < 0 && (errno == EINVAL || errno == ENOSYS))\n#endif\n    backend_fd = epoll_create (256);\n\n  if (backend_fd < 0)\n    return 0;\n\n  fcntl (backend_fd, F_SETFD, FD_CLOEXEC);\n\n  backend_mintime = 1e-3; /* epoll does sometimes return early, this is just to avoid the worst */\n  backend_modify  = epoll_modify;\n  backend_poll    = epoll_poll;\n\n  epoll_eventmax = 64; /* initial number of events receivable per poll */\n  epoll_events = (struct epoll_event *)ev_malloc (sizeof (struct epoll_event) * epoll_eventmax);\n\n  return EVBACKEND_EPOLL;\n}\n\nvoid inline_size\nepoll_destroy (EV_P)\n{\n  ev_free (epoll_events);\n  array_free (epoll_eperm, EMPTY);\n}\n\nvoid inline_size\nepoll_fork (EV_P)\n{\n  close (backend_fd);\n\n  while ((backend_fd = epoll_create (256)) < 0)\n    ev_syserr (\"(libev) epoll_create\");\n\n  fcntl (backend_fd, F_SETFD, FD_CLOEXEC);\n\n  fd_rearm_all (EV_A);\n}\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/ev_kqueue.c",
    "content": "/*\n * libev kqueue backend\n *\n * Copyright (c) 2007,2008,2009,2010,2011,2012,2013 Marc Alexander Lehmann <libev@schmorp.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modifica-\n * tion, are permitted provided that the following conditions are met:\n *\n *   1.  Redistributions of source code must retain the above copyright notice,\n *       this list of conditions and the following disclaimer.\n *\n *   2.  Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-\n * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-\n * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-\n * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Alternatively, the contents of this file may be used under the terms of\n * the GNU General Public License (\"GPL\") version 2 or any later version,\n * in which case the provisions of the GPL are applicable instead of\n * the above. If you wish to allow the use of your version of this file\n * only under the terms of the GPL and not to allow others to use your\n * version of this file under the BSD license, indicate your decision\n * by deleting the provisions above and replace them with the notice\n * and other provisions required by the GPL. If you do not delete the\n * provisions above, a recipient may use your version of this file under\n * either the BSD or the GPL.\n */\n\n#include <sys/types.h>\n#include <sys/time.h>\n#include <sys/event.h>\n#include <string.h>\n#include <errno.h>\n\nvoid inline_speed\nkqueue_change (EV_P_ int fd, int filter, int flags, int fflags)\n{\n  ++kqueue_changecnt;\n  array_needsize (struct kevent, kqueue_changes, kqueue_changemax, kqueue_changecnt, EMPTY2);\n\n  EV_SET (&kqueue_changes [kqueue_changecnt - 1], fd, filter, flags, fflags, 0, 0);\n}\n\n/* OS X at least needs this */\n#ifndef EV_ENABLE\n# define EV_ENABLE 0\n#endif\n#ifndef NOTE_EOF\n# define NOTE_EOF 0\n#endif\n\nstatic void\nkqueue_modify (EV_P_ int fd, int oev, int nev)\n{\n  if (oev != nev)\n    {\n      if (oev & EV_READ)\n        kqueue_change (EV_A_ fd, EVFILT_READ , EV_DELETE, 0);\n\n      if (oev & EV_WRITE)\n        kqueue_change (EV_A_ fd, EVFILT_WRITE, EV_DELETE, 0);\n    }\n\n  /* to detect close/reopen reliably, we have to re-add */\n  /* event requests even when oev == nev */\n\n  if (nev & EV_READ)\n    kqueue_change (EV_A_ fd, EVFILT_READ , EV_ADD | EV_ENABLE, NOTE_EOF);\n\n  if (nev & EV_WRITE)\n    kqueue_change (EV_A_ fd, EVFILT_WRITE, EV_ADD | EV_ENABLE, NOTE_EOF);\n}\n\nstatic void\nkqueue_poll (EV_P_ ev_tstamp timeout)\n{\n  int res, i;\n  struct timespec ts;\n\n  /* need to resize so there is enough space for errors */\n  if (kqueue_changecnt > kqueue_eventmax)\n    {\n      ev_free (kqueue_events);\n      kqueue_eventmax = array_nextsize (sizeof (struct kevent), kqueue_eventmax, kqueue_changecnt);\n      kqueue_events = (struct kevent *)ev_malloc (sizeof (struct kevent) * kqueue_eventmax);\n    }\n\n  EV_RELEASE_CB;\n  EV_TS_SET (ts, timeout);\n  res = kevent (backend_fd, kqueue_changes, kqueue_changecnt, kqueue_events, kqueue_eventmax, &ts);\n  EV_ACQUIRE_CB;\n  kqueue_changecnt = 0;\n\n  if (expect_false (res < 0))\n    {\n      if (errno != EINTR)\n        ev_syserr (\"(libev) kevent\");\n\n      return;\n    }\n\n  for (i = 0; i < res; ++i)\n    {\n      int fd = kqueue_events [i].ident;\n\n      if (expect_false (kqueue_events [i].flags & EV_ERROR))\n        {\n          int err = kqueue_events [i].data;\n\n          /* we are only interested in errors for fds that we are interested in :) */\n          if (anfds [fd].events)\n            {\n              if (err == ENOENT) /* resubmit changes on ENOENT */\n                kqueue_modify (EV_A_ fd, 0, anfds [fd].events);\n              else if (err == EBADF) /* on EBADF, we re-check the fd */\n                {\n                  if (fd_valid (fd))\n                    kqueue_modify (EV_A_ fd, 0, anfds [fd].events);\n                  else\n                    fd_kill (EV_A_ fd);\n                }\n              else /* on all other errors, we error out on the fd */\n                fd_kill (EV_A_ fd);\n            }\n        }\n      else\n        fd_event (\n          EV_A_\n          fd,\n          kqueue_events [i].filter == EVFILT_READ ? EV_READ\n          : kqueue_events [i].filter == EVFILT_WRITE ? EV_WRITE\n          : 0\n        );\n    }\n\n  if (expect_false (res == kqueue_eventmax))\n    {\n      ev_free (kqueue_events);\n      kqueue_eventmax = array_nextsize (sizeof (struct kevent), kqueue_eventmax, kqueue_eventmax + 1);\n      kqueue_events = (struct kevent *)ev_malloc (sizeof (struct kevent) * kqueue_eventmax);\n    }\n}\n\nint inline_size\nkqueue_init (EV_P_ int flags)\n{\n  /* initialize the kernel queue */\n  kqueue_fd_pid = getpid ();\n  if ((backend_fd = kqueue ()) < 0)\n    return 0;\n\n  fcntl (backend_fd, F_SETFD, FD_CLOEXEC); /* not sure if necessary, hopefully doesn't hurt */\n\n  backend_mintime = 1e-9; /* apparently, they did the right thing in freebsd */\n  backend_modify  = kqueue_modify;\n  backend_poll    = kqueue_poll;\n\n  kqueue_eventmax = 64; /* initial number of events receivable per poll */\n  kqueue_events = (struct kevent *)ev_malloc (sizeof (struct kevent) * kqueue_eventmax);\n\n  kqueue_changes   = 0;\n  kqueue_changemax = 0;\n  kqueue_changecnt = 0;\n\n  return EVBACKEND_KQUEUE;\n}\n\nvoid inline_size\nkqueue_destroy (EV_P)\n{\n  ev_free (kqueue_events);\n  ev_free (kqueue_changes);\n}\n\nvoid inline_size\nkqueue_fork (EV_P)\n{\n  /* some BSD kernels don't just destroy the kqueue itself,\n   * but also close the fd, which isn't documented, and\n   * impossible to support properly.\n   * we remember the pid of the kqueue call and only close\n   * the fd if the pid is still the same.\n   * this leaks fds on sane kernels, but BSD interfaces are\n   * notoriously buggy and rarely get fixed.\n   */\n  pid_t newpid = getpid ();\n\n  if (newpid == kqueue_fd_pid)\n    close (backend_fd);\n\n  kqueue_fd_pid = newpid;\n  while ((backend_fd = kqueue ()) < 0)\n    ev_syserr (\"(libev) kqueue\");\n\n  fcntl (backend_fd, F_SETFD, FD_CLOEXEC);\n\n  /* re-register interest in fds */\n  fd_rearm_all (EV_A);\n}\n\n/* sys/event.h defines EV_ERROR */\n#undef EV_ERROR\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/ev_poll.c",
    "content": "/*\n * libev poll fd activity backend\n *\n * Copyright (c) 2007,2008,2009,2010,2011 Marc Alexander Lehmann <libev@schmorp.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modifica-\n * tion, are permitted provided that the following conditions are met:\n *\n *   1.  Redistributions of source code must retain the above copyright notice,\n *       this list of conditions and the following disclaimer.\n *\n *   2.  Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-\n * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-\n * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-\n * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Alternatively, the contents of this file may be used under the terms of\n * the GNU General Public License (\"GPL\") version 2 or any later version,\n * in which case the provisions of the GPL are applicable instead of\n * the above. If you wish to allow the use of your version of this file\n * only under the terms of the GPL and not to allow others to use your\n * version of this file under the BSD license, indicate your decision\n * by deleting the provisions above and replace them with the notice\n * and other provisions required by the GPL. If you do not delete the\n * provisions above, a recipient may use your version of this file under\n * either the BSD or the GPL.\n */\n\n#include <poll.h>\n\nvoid inline_size\npollidx_init (int *base, int count)\n{\n  /* consider using memset (.., -1, ...), which is practically guaranteed\n   * to work on all systems implementing poll */\n  while (count--)\n    *base++ = -1;\n}\n\nstatic void\npoll_modify (EV_P_ int fd, int oev, int nev)\n{\n  int idx;\n\n  if (oev == nev)\n    return;\n\n  array_needsize (int, pollidxs, pollidxmax, fd + 1, pollidx_init);\n\n  idx = pollidxs [fd];\n\n  if (idx < 0) /* need to allocate a new pollfd */\n    {\n      pollidxs [fd] = idx = pollcnt++;\n      array_needsize (struct pollfd, polls, pollmax, pollcnt, EMPTY2);\n      polls [idx].fd = fd;\n    }\n\n  assert (polls [idx].fd == fd);\n\n  if (nev)\n    polls [idx].events =\n        (nev & EV_READ ? POLLIN : 0)\n        | (nev & EV_WRITE ? POLLOUT : 0);\n  else /* remove pollfd */\n    {\n      pollidxs [fd] = -1;\n\n      if (expect_true (idx < --pollcnt))\n        {\n          polls [idx] = polls [pollcnt];\n          pollidxs [polls [idx].fd] = idx;\n        }\n    }\n}\n\nstatic void\npoll_poll (EV_P_ ev_tstamp timeout)\n{\n  struct pollfd *p;\n  int res;\n  \n  EV_RELEASE_CB;\n  res = poll (polls, pollcnt, timeout * 1e3);\n  EV_ACQUIRE_CB;\n\n  if (expect_false (res < 0))\n    {\n      if (errno == EBADF)\n        fd_ebadf (EV_A);\n      else if (errno == ENOMEM && !syserr_cb)\n        fd_enomem (EV_A);\n      else if (errno != EINTR)\n        ev_syserr (\"(libev) poll\");\n    }\n  else\n    for (p = polls; res; ++p)\n      {\n        assert ((\"libev: poll() returned illegal result, broken BSD kernel?\", p < polls + pollcnt));\n\n        if (expect_false (p->revents)) /* this expect is debatable */\n          {\n            --res;\n\n            if (expect_false (p->revents & POLLNVAL))\n              fd_kill (EV_A_ p->fd);\n            else\n              fd_event (\n                EV_A_\n                p->fd,\n                (p->revents & (POLLOUT | POLLERR | POLLHUP) ? EV_WRITE : 0)\n                | (p->revents & (POLLIN | POLLERR | POLLHUP) ? EV_READ : 0)\n              );\n          }\n      }\n}\n\nint inline_size\npoll_init (EV_P_ int flags)\n{\n  backend_mintime = 1e-3;\n  backend_modify  = poll_modify;\n  backend_poll    = poll_poll;\n\n  pollidxs = 0; pollidxmax = 0;\n  polls    = 0; pollmax    = 0; pollcnt = 0;\n\n  return EVBACKEND_POLL;\n}\n\nvoid inline_size\npoll_destroy (EV_P)\n{\n  ev_free (pollidxs);\n  ev_free (polls);\n}\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/ev_port.c",
    "content": "/*\n * libev solaris event port backend\n *\n * Copyright (c) 2007,2008,2009,2010,2011 Marc Alexander Lehmann <libev@schmorp.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modifica-\n * tion, are permitted provided that the following conditions are met:\n *\n *   1.  Redistributions of source code must retain the above copyright notice,\n *       this list of conditions and the following disclaimer.\n *\n *   2.  Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-\n * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-\n * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-\n * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Alternatively, the contents of this file may be used under the terms of\n * the GNU General Public License (\"GPL\") version 2 or any later version,\n * in which case the provisions of the GPL are applicable instead of\n * the above. If you wish to allow the use of your version of this file\n * only under the terms of the GPL and not to allow others to use your\n * version of this file under the BSD license, indicate your decision\n * by deleting the provisions above and replace them with the notice\n * and other provisions required by the GPL. If you do not delete the\n * provisions above, a recipient may use your version of this file under\n * either the BSD or the GPL.\n */\n\n/* useful reading:\n *\n * http://bugs.opensolaris.org/view_bug.do?bug_id=6268715 (random results)\n * http://bugs.opensolaris.org/view_bug.do?bug_id=6455223 (just totally broken)\n * http://bugs.opensolaris.org/view_bug.do?bug_id=6873782 (manpage ETIME)\n * http://bugs.opensolaris.org/view_bug.do?bug_id=6874410 (implementation ETIME)\n * http://www.mail-archive.com/networking-discuss@opensolaris.org/msg11898.html ETIME vs. nget\n * http://src.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/lib/libc/port/gen/event_port.c (libc)\n * http://cvs.opensolaris.org/source/xref/onnv/onnv-gate/usr/src/uts/common/fs/portfs/port.c#1325 (kernel)\n */\n\n#include <sys/types.h>\n#include <sys/time.h>\n#include <poll.h>\n#include <port.h>\n#include <string.h>\n#include <errno.h>\n\nvoid inline_speed\nport_associate_and_check (EV_P_ int fd, int ev)\n{\n  if (0 >\n      port_associate (\n         backend_fd, PORT_SOURCE_FD, fd,\n         (ev & EV_READ ? POLLIN : 0)\n         | (ev & EV_WRITE ? POLLOUT : 0),\n         0\n      )\n  )\n    {\n      if (errno == EBADFD)\n        fd_kill (EV_A_ fd);\n      else\n        ev_syserr (\"(libev) port_associate\");\n    }\n}\n\nstatic void\nport_modify (EV_P_ int fd, int oev, int nev)\n{\n  /* we need to reassociate no matter what, as closes are\n   * once more silently being discarded.\n   */\n  if (!nev)\n    {\n      if (oev)\n        port_dissociate (backend_fd, PORT_SOURCE_FD, fd);\n    }\n  else\n    port_associate_and_check (EV_A_ fd, nev);\n}\n\nstatic void\nport_poll (EV_P_ ev_tstamp timeout)\n{\n  int res, i;\n  struct timespec ts;\n  uint_t nget = 1;\n\n  /* we initialise this to something we will skip in the loop, as */\n  /* port_getn can return with nget unchanged, but no indication */\n  /* whether it was the original value or has been updated :/ */\n  port_events [0].portev_source = 0;\n\n  EV_RELEASE_CB;\n  EV_TS_SET (ts, timeout);\n  res = port_getn (backend_fd, port_events, port_eventmax, &nget, &ts);\n  EV_ACQUIRE_CB;\n\n  /* port_getn may or may not set nget on error */\n  /* so we rely on port_events [0].portev_source not being updated */\n  if (res == -1 && errno != ETIME && errno != EINTR)\n    ev_syserr (\"(libev) port_getn (see http://bugs.opensolaris.org/view_bug.do?bug_id=6268715, try LIBEV_FLAGS=3 env variable)\");\n\n  for (i = 0; i < nget; ++i)\n    {\n      if (port_events [i].portev_source == PORT_SOURCE_FD)\n        {\n          int fd = port_events [i].portev_object;\n\n          fd_event (\n            EV_A_\n            fd,\n            (port_events [i].portev_events & (POLLOUT | POLLERR | POLLHUP) ? EV_WRITE : 0)\n            | (port_events [i].portev_events & (POLLIN | POLLERR | POLLHUP) ? EV_READ : 0)\n          );\n\n          fd_change (EV_A_ fd, EV__IOFDSET);\n        }\n    }\n\n  if (expect_false (nget == port_eventmax))\n    {\n      ev_free (port_events);\n      port_eventmax = array_nextsize (sizeof (port_event_t), port_eventmax, port_eventmax + 1);\n      port_events = (port_event_t *)ev_malloc (sizeof (port_event_t) * port_eventmax);\n    }\n}\n\nint inline_size\nport_init (EV_P_ int flags)\n{\n  /* Initialize the kernel queue */\n  if ((backend_fd = port_create ()) < 0)\n    return 0;\n\n  assert ((\"libev: PORT_SOURCE_FD must not be zero\", PORT_SOURCE_FD));\n\n  fcntl (backend_fd, F_SETFD, FD_CLOEXEC); /* not sure if necessary, hopefully doesn't hurt */\n\n  /* if my reading of the opensolaris kernel sources are correct, then\n   * opensolaris does something very stupid: it checks if the time has already\n   * elapsed and doesn't round up if that is the case,m otherwise it DOES round\n   * up. Since we can't know what the case is, we need to guess by using a\n   * \"large enough\" timeout. Normally, 1e-9 would be correct.\n   */\n  backend_mintime = 1e-3; /* needed to compensate for port_getn returning early */\n  backend_modify  = port_modify;\n  backend_poll    = port_poll;\n\n  port_eventmax = 64; /* initial number of events receivable per poll */\n  port_events = (port_event_t *)ev_malloc (sizeof (port_event_t) * port_eventmax);\n\n  return EVBACKEND_PORT;\n}\n\nvoid inline_size\nport_destroy (EV_P)\n{\n  ev_free (port_events);\n}\n\nvoid inline_size\nport_fork (EV_P)\n{\n  close (backend_fd);\n\n  while ((backend_fd = port_create ()) < 0)\n    ev_syserr (\"(libev) port\");\n\n  fcntl (backend_fd, F_SETFD, FD_CLOEXEC);\n\n  /* re-register interest in fds */\n  fd_rearm_all (EV_A);\n}\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/ev_select.c",
    "content": "/*\n * libev select fd activity backend\n *\n * Copyright (c) 2007,2008,2009,2010,2011 Marc Alexander Lehmann <libev@schmorp.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modifica-\n * tion, are permitted provided that the following conditions are met:\n *\n *   1.  Redistributions of source code must retain the above copyright notice,\n *       this list of conditions and the following disclaimer.\n *\n *   2.  Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-\n * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-\n * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-\n * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Alternatively, the contents of this file may be used under the terms of\n * the GNU General Public License (\"GPL\") version 2 or any later version,\n * in which case the provisions of the GPL are applicable instead of\n * the above. If you wish to allow the use of your version of this file\n * only under the terms of the GPL and not to allow others to use your\n * version of this file under the BSD license, indicate your decision\n * by deleting the provisions above and replace them with the notice\n * and other provisions required by the GPL. If you do not delete the\n * provisions above, a recipient may use your version of this file under\n * either the BSD or the GPL.\n */\n\n#ifndef _WIN32\n/* for unix systems */\n# include <inttypes.h>\n# ifndef __hpux\n/* for REAL unix systems */\n#  include <sys/select.h>\n# endif\n#endif\n\n#ifndef EV_SELECT_USE_FD_SET\n# ifdef NFDBITS\n#  define EV_SELECT_USE_FD_SET 0\n# else\n#  define EV_SELECT_USE_FD_SET 1\n# endif\n#endif\n\n#if EV_SELECT_IS_WINSOCKET\n# undef EV_SELECT_USE_FD_SET\n# define EV_SELECT_USE_FD_SET 1\n# undef NFDBITS\n# define NFDBITS 0\n#endif\n\n#if !EV_SELECT_USE_FD_SET\n# define NFDBYTES (NFDBITS / 8)\n#endif\n\n#include <string.h>\n\nstatic void\nselect_modify (EV_P_ int fd, int oev, int nev)\n{\n  if (oev == nev)\n    return;\n\n  {\n#if EV_SELECT_USE_FD_SET\n\n    #if EV_SELECT_IS_WINSOCKET\n    SOCKET handle = anfds [fd].handle;\n    #else\n    int handle = fd;\n    #endif\n\n    assert ((\"libev: fd >= FD_SETSIZE passed to fd_set-based select backend\", fd < FD_SETSIZE));\n\n    /* FD_SET is broken on windows (it adds the fd to a set twice or more,\n     * which eventually leads to overflows). Need to call it only on changes.\n     */\n    #if EV_SELECT_IS_WINSOCKET\n    if ((oev ^ nev) & EV_READ)\n    #endif\n      if (nev & EV_READ)\n        FD_SET (handle, (fd_set *)vec_ri);\n      else\n        FD_CLR (handle, (fd_set *)vec_ri);\n\n    #if EV_SELECT_IS_WINSOCKET\n    if ((oev ^ nev) & EV_WRITE)\n    #endif\n      if (nev & EV_WRITE)\n        FD_SET (handle, (fd_set *)vec_wi);\n      else\n        FD_CLR (handle, (fd_set *)vec_wi);\n\n#else\n\n    int     word = fd / NFDBITS;\n    fd_mask mask = 1UL << (fd % NFDBITS);\n\n    if (expect_false (vec_max <= word))\n      {\n        int new_max = word + 1;\n\n        vec_ri = ev_realloc (vec_ri, new_max * NFDBYTES);\n        vec_ro = ev_realloc (vec_ro, new_max * NFDBYTES); /* could free/malloc */\n        vec_wi = ev_realloc (vec_wi, new_max * NFDBYTES);\n        vec_wo = ev_realloc (vec_wo, new_max * NFDBYTES); /* could free/malloc */\n        #ifdef _WIN32\n        vec_eo = ev_realloc (vec_eo, new_max * NFDBYTES); /* could free/malloc */\n        #endif\n\n        for (; vec_max < new_max; ++vec_max)\n          ((fd_mask *)vec_ri) [vec_max] =\n          ((fd_mask *)vec_wi) [vec_max] = 0;\n      }\n\n    ((fd_mask *)vec_ri) [word] |= mask;\n    if (!(nev & EV_READ))\n      ((fd_mask *)vec_ri) [word] &= ~mask;\n\n    ((fd_mask *)vec_wi) [word] |= mask;\n    if (!(nev & EV_WRITE))\n      ((fd_mask *)vec_wi) [word] &= ~mask;\n#endif\n  }\n}\n\nstatic void\nselect_poll (EV_P_ ev_tstamp timeout)\n{\n  struct timeval tv;\n  int res;\n  int fd_setsize;\n\n  EV_RELEASE_CB;\n  EV_TV_SET (tv, timeout);\n\n#if EV_SELECT_USE_FD_SET\n  fd_setsize = sizeof (fd_set);\n#else\n  fd_setsize = vec_max * NFDBYTES;\n#endif\n\n  memcpy (vec_ro, vec_ri, fd_setsize);\n  memcpy (vec_wo, vec_wi, fd_setsize);\n\n#ifdef _WIN32\n  /* pass in the write set as except set.\n   * the idea behind this is to work around a windows bug that causes\n   * errors to be reported as an exception and not by setting\n   * the writable bit. this is so uncontrollably lame.\n   */\n  memcpy (vec_eo, vec_wi, fd_setsize);\n  res = select (vec_max * NFDBITS, (fd_set *)vec_ro, (fd_set *)vec_wo, (fd_set *)vec_eo, &tv);\n#elif EV_SELECT_USE_FD_SET\n  fd_setsize = anfdmax < FD_SETSIZE ? anfdmax : FD_SETSIZE;\n  res = select (fd_setsize, (fd_set *)vec_ro, (fd_set *)vec_wo, 0, &tv);\n#else\n  res = select (vec_max * NFDBITS, (fd_set *)vec_ro, (fd_set *)vec_wo, 0, &tv);\n#endif\n  EV_ACQUIRE_CB;\n\n  if (expect_false (res < 0))\n    {\n      #if EV_SELECT_IS_WINSOCKET\n      errno = WSAGetLastError ();\n      #endif\n      #ifdef WSABASEERR\n      /* on windows, select returns incompatible error codes, fix this */\n      if (errno >= WSABASEERR && errno < WSABASEERR + 1000)\n        if (errno == WSAENOTSOCK)\n          errno = EBADF;\n        else\n          errno -= WSABASEERR;\n      #endif\n\n      #ifdef _WIN32\n      /* select on windows erroneously returns EINVAL when no fd sets have been\n       * provided (this is documented). what microsoft doesn't tell you that this bug\n       * exists even when the fd sets _are_ provided, so we have to check for this bug\n       * here and emulate by sleeping manually.\n       * we also get EINVAL when the timeout is invalid, but we ignore this case here\n       * and assume that EINVAL always means: you have to wait manually.\n       */\n      if (errno == EINVAL)\n        {\n          if (timeout)\n            {\n              unsigned long ms = timeout * 1e3;\n              Sleep (ms ? ms : 1);\n            }\n\n          return;\n        }\n      #endif\n\n      if (errno == EBADF)\n        fd_ebadf (EV_A);\n      else if (errno == ENOMEM && !syserr_cb)\n        fd_enomem (EV_A);\n      else if (errno != EINTR)\n        ev_syserr (\"(libev) select\");\n\n      return;\n    }\n\n#if EV_SELECT_USE_FD_SET\n\n  {\n    int fd;\n\n    for (fd = 0; fd < anfdmax; ++fd)\n      if (anfds [fd].events)\n        {\n          int events = 0;\n          #if EV_SELECT_IS_WINSOCKET\n          SOCKET handle = anfds [fd].handle;\n          #else\n          int handle = fd;\n          #endif\n\n          if (FD_ISSET (handle, (fd_set *)vec_ro)) events |= EV_READ;\n          if (FD_ISSET (handle, (fd_set *)vec_wo)) events |= EV_WRITE;\n          #ifdef _WIN32\n          if (FD_ISSET (handle, (fd_set *)vec_eo)) events |= EV_WRITE;\n          #endif\n\n          if (expect_true (events))\n            fd_event (EV_A_ fd, events);\n        }\n  }\n\n#else\n\n  {\n    int word, bit;\n    for (word = vec_max; word--; )\n      {\n        fd_mask word_r = ((fd_mask *)vec_ro) [word];\n        fd_mask word_w = ((fd_mask *)vec_wo) [word];\n        #ifdef _WIN32\n        word_w |= ((fd_mask *)vec_eo) [word];\n        #endif\n\n        if (word_r || word_w)\n          for (bit = NFDBITS; bit--; )\n            {\n              fd_mask mask = 1UL << bit;\n              int events = 0;\n\n              events |= word_r & mask ? EV_READ  : 0;\n              events |= word_w & mask ? EV_WRITE : 0;\n\n              if (expect_true (events))\n                fd_event (EV_A_ word * NFDBITS + bit, events);\n            }\n      }\n  }\n\n#endif\n}\n\nint inline_size\nselect_init (EV_P_ int flags)\n{\n  backend_mintime = 1e-6;\n  backend_modify  = select_modify;\n  backend_poll    = select_poll;\n\n#if EV_SELECT_USE_FD_SET\n  vec_ri  = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_ri);\n  vec_ro  = ev_malloc (sizeof (fd_set));\n  vec_wi  = ev_malloc (sizeof (fd_set)); FD_ZERO ((fd_set *)vec_wi);\n  vec_wo  = ev_malloc (sizeof (fd_set));\n  #ifdef _WIN32\n  vec_eo  = ev_malloc (sizeof (fd_set));\n  #endif\n#else\n  vec_max = 0;\n  vec_ri  = 0;\n  vec_ro  = 0;\n  vec_wi  = 0;\n  vec_wo  = 0;\n  #ifdef _WIN32\n  vec_eo  = 0;\n  #endif\n#endif\n\n  return EVBACKEND_SELECT;\n}\n\nvoid inline_size\nselect_destroy (EV_P)\n{\n  ev_free (vec_ri);\n  ev_free (vec_ro);\n  ev_free (vec_wi);\n  ev_free (vec_wo);\n  #ifdef _WIN32\n  ev_free (vec_eo);\n  #endif\n}\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/ev_vars.h",
    "content": "/*\n * loop member variable declarations\n *\n * Copyright (c) 2007,2008,2009,2010,2011,2012,2013 Marc Alexander Lehmann <libev@schmorp.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modifica-\n * tion, are permitted provided that the following conditions are met:\n *\n *   1.  Redistributions of source code must retain the above copyright notice,\n *       this list of conditions and the following disclaimer.\n *\n *   2.  Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-\n * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-\n * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-\n * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Alternatively, the contents of this file may be used under the terms of\n * the GNU General Public License (\"GPL\") version 2 or any later version,\n * in which case the provisions of the GPL are applicable instead of\n * the above. If you wish to allow the use of your version of this file\n * only under the terms of the GPL and not to allow others to use your\n * version of this file under the BSD license, indicate your decision\n * by deleting the provisions above and replace them with the notice\n * and other provisions required by the GPL. If you do not delete the\n * provisions above, a recipient may use your version of this file under\n * either the BSD or the GPL.\n */\n\n#define VARx(type,name) VAR(name, type name)\n\nVARx(ev_tstamp, now_floor) /* last time we refreshed rt_time */\nVARx(ev_tstamp, mn_now)    /* monotonic clock \"now\" */\nVARx(ev_tstamp, rtmn_diff) /* difference realtime - monotonic time */\n\n/* for reverse feeding of events */\nVARx(W *, rfeeds)\nVARx(int, rfeedmax)\nVARx(int, rfeedcnt)\n\nVAR (pendings, ANPENDING *pendings [NUMPRI])\nVAR (pendingmax, int pendingmax [NUMPRI])\nVAR (pendingcnt, int pendingcnt [NUMPRI])\nVARx(int, pendingpri) /* highest priority currently pending */\nVARx(ev_prepare, pending_w) /* dummy pending watcher */\n\nVARx(ev_tstamp, io_blocktime)\nVARx(ev_tstamp, timeout_blocktime)\n\nVARx(int, backend)\nVARx(int, activecnt) /* total number of active events (\"refcount\") */\nVARx(EV_ATOMIC_T, loop_done)  /* signal by ev_break */\n\nVARx(int, backend_fd)\nVARx(ev_tstamp, backend_mintime) /* assumed typical timer resolution */\nVAR (backend_modify, void (*backend_modify)(EV_P_ int fd, int oev, int nev))\nVAR (backend_poll  , void (*backend_poll)(EV_P_ ev_tstamp timeout))\n\nVARx(ANFD *, anfds)\nVARx(int, anfdmax)\n\nVAR (evpipe, int evpipe [2])\nVARx(ev_io, pipe_w)\nVARx(EV_ATOMIC_T, pipe_write_wanted)\nVARx(EV_ATOMIC_T, pipe_write_skipped)\n\n#if !defined(_WIN32) || EV_GENWRAP\nVARx(pid_t, curpid)\n#endif\n\nVARx(char, postfork)  /* true if we need to recreate kernel state after fork */\n\n#if EV_USE_SELECT || EV_GENWRAP\nVARx(void *, vec_ri)\nVARx(void *, vec_ro)\nVARx(void *, vec_wi)\nVARx(void *, vec_wo)\n#if defined(_WIN32) || EV_GENWRAP\nVARx(void *, vec_eo)\n#endif\nVARx(int, vec_max)\n#endif\n\n#if EV_USE_POLL || EV_GENWRAP\nVARx(struct pollfd *, polls)\nVARx(int, pollmax)\nVARx(int, pollcnt)\nVARx(int *, pollidxs) /* maps fds into structure indices */\nVARx(int, pollidxmax)\n#endif\n\n#if EV_USE_EPOLL || EV_GENWRAP\nVARx(struct epoll_event *, epoll_events)\nVARx(int, epoll_eventmax)\nVARx(int *, epoll_eperms)\nVARx(int, epoll_epermcnt)\nVARx(int, epoll_epermmax)\n#endif\n\n#if EV_USE_KQUEUE || EV_GENWRAP\nVARx(pid_t, kqueue_fd_pid)\nVARx(struct kevent *, kqueue_changes)\nVARx(int, kqueue_changemax)\nVARx(int, kqueue_changecnt)\nVARx(struct kevent *, kqueue_events)\nVARx(int, kqueue_eventmax)\n#endif\n\n#if EV_USE_PORT || EV_GENWRAP\nVARx(struct port_event *, port_events)\nVARx(int, port_eventmax)\n#endif\n\n#if EV_USE_IOCP || EV_GENWRAP\nVARx(HANDLE, iocp)\n#endif\n\nVARx(int *, fdchanges)\nVARx(int, fdchangemax)\nVARx(int, fdchangecnt)\n\nVARx(ANHE *, timers)\nVARx(int, timermax)\nVARx(int, timercnt)\n\n#if EV_PERIODIC_ENABLE || EV_GENWRAP\nVARx(ANHE *, periodics)\nVARx(int, periodicmax)\nVARx(int, periodiccnt)\n#endif\n\n#if EV_IDLE_ENABLE || EV_GENWRAP\nVAR (idles, ev_idle **idles [NUMPRI])\nVAR (idlemax, int idlemax [NUMPRI])\nVAR (idlecnt, int idlecnt [NUMPRI])\n#endif\nVARx(int, idleall) /* total number */\n\nVARx(struct ev_prepare **, prepares)\nVARx(int, preparemax)\nVARx(int, preparecnt)\n\nVARx(struct ev_check **, checks)\nVARx(int, checkmax)\nVARx(int, checkcnt)\n\n#if EV_FORK_ENABLE || EV_GENWRAP\nVARx(struct ev_fork **, forks)\nVARx(int, forkmax)\nVARx(int, forkcnt)\n#endif\n\n#if EV_CLEANUP_ENABLE || EV_GENWRAP\nVARx(struct ev_cleanup **, cleanups)\nVARx(int, cleanupmax)\nVARx(int, cleanupcnt)\n#endif\n\n#if EV_ASYNC_ENABLE || EV_GENWRAP\nVARx(EV_ATOMIC_T, async_pending)\nVARx(struct ev_async **, asyncs)\nVARx(int, asyncmax)\nVARx(int, asynccnt)\n#endif\n\n#if EV_USE_INOTIFY || EV_GENWRAP\nVARx(int, fs_fd)\nVARx(ev_io, fs_w)\nVARx(char, fs_2625) /* whether we are running in linux 2.6.25 or newer */\nVAR (fs_hash, ANFS fs_hash [EV_INOTIFY_HASHSIZE])\n#endif\n\nVARx(EV_ATOMIC_T, sig_pending)\n#if EV_USE_SIGNALFD || EV_GENWRAP\nVARx(int, sigfd)\nVARx(ev_io, sigfd_w)\nVARx(sigset_t, sigfd_set)\n#endif\n\nVARx(unsigned int, origflags) /* original loop flags */\n\n#if EV_FEATURE_API || EV_GENWRAP\nVARx(unsigned int, loop_count) /* total number of loop iterations/blocks */\nVARx(unsigned int, loop_depth) /* #ev_run enters - #ev_run leaves */\n\nVARx(void *, userdata)\n/* C++ doesn't support the ev_loop_callback typedef here. stinks. */\nVAR (release_cb, void (*release_cb)(EV_P) EV_THROW)\nVAR (acquire_cb, void (*acquire_cb)(EV_P) EV_THROW)\nVAR (invoke_cb , ev_loop_callback invoke_cb)\n#endif\n\n#undef VARx\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/ev_win32.c",
    "content": "/*\n * libev win32 compatibility cruft (_not_ a backend)\n *\n * Copyright (c) 2007,2008,2009 Marc Alexander Lehmann <libev@schmorp.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modifica-\n * tion, are permitted provided that the following conditions are met:\n *\n *   1.  Redistributions of source code must retain the above copyright notice,\n *       this list of conditions and the following disclaimer.\n *\n *   2.  Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-\n * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-\n * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-\n * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Alternatively, the contents of this file may be used under the terms of\n * the GNU General Public License (\"GPL\") version 2 or any later version,\n * in which case the provisions of the GPL are applicable instead of\n * the above. If you wish to allow the use of your version of this file\n * only under the terms of the GPL and not to allow others to use your\n * version of this file under the BSD license, indicate your decision\n * by deleting the provisions above and replace them with the notice\n * and other provisions required by the GPL. If you do not delete the\n * provisions above, a recipient may use your version of this file under\n * either the BSD or the GPL.\n */\n\n#ifdef _WIN32\n\n/* note: the comment below could not be substantiated, but what would I care */\n/* MSDN says this is required to handle SIGFPE */\n/* my wild guess would be that using something floating-pointy is required */\n/* for the crt to do something about it */\nvolatile double SIGFPE_REQ = 0.0f;\n\nstatic SOCKET\nev_tcp_socket (void)\n{\n#if EV_USE_WSASOCKET\n  return WSASocket (AF_INET, SOCK_STREAM, 0, 0, 0, 0);\n#else\n  return socket (AF_INET, SOCK_STREAM, 0);\n#endif\n}\n\n/* oh, the humanity! */\nstatic int\nev_pipe (int filedes [2])\n{\n  struct sockaddr_in addr = { 0 };\n  int addr_size = sizeof (addr);\n  struct sockaddr_in adr2;\n  int adr2_size = sizeof (adr2);\n  SOCKET listener;\n  SOCKET sock [2] = { -1, -1 };\n\n  if ((listener = ev_tcp_socket ()) == INVALID_SOCKET)\n    return -1;\n\n  addr.sin_family = AF_INET;\n  addr.sin_addr.s_addr = htonl (INADDR_LOOPBACK);\n  addr.sin_port = 0;\n\n  if (bind (listener, (struct sockaddr *)&addr, addr_size))\n    goto fail;\n\n  if (getsockname (listener, (struct sockaddr *)&addr, &addr_size))\n    goto fail;\n\n  if (listen (listener, 1))\n    goto fail;\n\n  if ((sock [0] = ev_tcp_socket ()) == INVALID_SOCKET)\n    goto fail;\n\n  if (connect (sock [0], (struct sockaddr *)&addr, addr_size))\n    goto fail;\n\n  /* TODO: returns INVALID_SOCKET on winsock accept, not < 0. fix it */\n  /* when convenient, probably by just removing error checking altogether? */\n  if ((sock [1] = accept (listener, 0, 0)) < 0)\n    goto fail;\n\n  /* windows vista returns fantasy port numbers for sockets:\n   * example for two interconnected tcp sockets:\n   *\n   * (Socket::unpack_sockaddr_in getsockname $sock0)[0] == 53364\n   * (Socket::unpack_sockaddr_in getpeername $sock0)[0] == 53363\n   * (Socket::unpack_sockaddr_in getsockname $sock1)[0] == 53363\n   * (Socket::unpack_sockaddr_in getpeername $sock1)[0] == 53365\n   *\n   * wow! tridirectional sockets!\n   *\n   * this way of checking ports seems to work:\n   */\n  if (getpeername (sock [0], (struct sockaddr *)&addr, &addr_size))\n    goto fail;\n\n  if (getsockname (sock [1], (struct sockaddr *)&adr2, &adr2_size))\n    goto fail;\n\n  errno = WSAEINVAL;\n  if (addr_size != adr2_size\n      || addr.sin_addr.s_addr != adr2.sin_addr.s_addr /* just to be sure, I mean, it's windows */\n      || addr.sin_port        != adr2.sin_port)\n    goto fail;\n\n  closesocket (listener);\n\n#if EV_SELECT_IS_WINSOCKET\n  filedes [0] = EV_WIN32_HANDLE_TO_FD (sock [0]);\n  filedes [1] = EV_WIN32_HANDLE_TO_FD (sock [1]);\n#else\n  /* when select isn't winsocket, we also expect socket, connect, accept etc.\n   * to work on fds */\n  filedes [0] = sock [0];\n  filedes [1] = sock [1];\n#endif\n\n  return 0;\n\nfail:\n  closesocket (listener);\n\n  if (sock [0] != INVALID_SOCKET) closesocket (sock [0]);\n  if (sock [1] != INVALID_SOCKET) closesocket (sock [1]);\n\n  return -1;\n}\n\n#undef pipe\n#define pipe(filedes) ev_pipe (filedes)\n\n#define EV_HAVE_EV_TIME 1\nev_tstamp\nev_time (void)\n{\n  FILETIME ft;\n  ULARGE_INTEGER ui;\n\n  GetSystemTimeAsFileTime (&ft);\n  ui.u.LowPart  = ft.dwLowDateTime;\n  ui.u.HighPart = ft.dwHighDateTime;\n\n  /* msvc cannot convert ulonglong to double... yes, it is that sucky */\n  return (LONGLONG)(ui.QuadPart - 116444736000000000) * 1e-7;\n}\n\n#endif\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/ev_wrap.h",
    "content": "/* DO NOT EDIT, automatically generated by update_ev_wrap */\n#ifndef EV_WRAP_H\n#define EV_WRAP_H\n#define acquire_cb ((loop)->acquire_cb)\n#define activecnt ((loop)->activecnt)\n#define anfdmax ((loop)->anfdmax)\n#define anfds ((loop)->anfds)\n#define async_pending ((loop)->async_pending)\n#define asynccnt ((loop)->asynccnt)\n#define asyncmax ((loop)->asyncmax)\n#define asyncs ((loop)->asyncs)\n#define backend ((loop)->backend)\n#define backend_fd ((loop)->backend_fd)\n#define backend_mintime ((loop)->backend_mintime)\n#define backend_modify ((loop)->backend_modify)\n#define backend_poll ((loop)->backend_poll)\n#define checkcnt ((loop)->checkcnt)\n#define checkmax ((loop)->checkmax)\n#define checks ((loop)->checks)\n#define cleanupcnt ((loop)->cleanupcnt)\n#define cleanupmax ((loop)->cleanupmax)\n#define cleanups ((loop)->cleanups)\n#define curpid ((loop)->curpid)\n#define epoll_epermcnt ((loop)->epoll_epermcnt)\n#define epoll_epermmax ((loop)->epoll_epermmax)\n#define epoll_eperms ((loop)->epoll_eperms)\n#define epoll_eventmax ((loop)->epoll_eventmax)\n#define epoll_events ((loop)->epoll_events)\n#define evpipe ((loop)->evpipe)\n#define fdchangecnt ((loop)->fdchangecnt)\n#define fdchangemax ((loop)->fdchangemax)\n#define fdchanges ((loop)->fdchanges)\n#define forkcnt ((loop)->forkcnt)\n#define forkmax ((loop)->forkmax)\n#define forks ((loop)->forks)\n#define fs_2625 ((loop)->fs_2625)\n#define fs_fd ((loop)->fs_fd)\n#define fs_hash ((loop)->fs_hash)\n#define fs_w ((loop)->fs_w)\n#define idleall ((loop)->idleall)\n#define idlecnt ((loop)->idlecnt)\n#define idlemax ((loop)->idlemax)\n#define idles ((loop)->idles)\n#define invoke_cb ((loop)->invoke_cb)\n#define io_blocktime ((loop)->io_blocktime)\n#define iocp ((loop)->iocp)\n#define kqueue_changecnt ((loop)->kqueue_changecnt)\n#define kqueue_changemax ((loop)->kqueue_changemax)\n#define kqueue_changes ((loop)->kqueue_changes)\n#define kqueue_eventmax ((loop)->kqueue_eventmax)\n#define kqueue_events ((loop)->kqueue_events)\n#define kqueue_fd_pid ((loop)->kqueue_fd_pid)\n#define loop_count ((loop)->loop_count)\n#define loop_depth ((loop)->loop_depth)\n#define loop_done ((loop)->loop_done)\n#define mn_now ((loop)->mn_now)\n#define now_floor ((loop)->now_floor)\n#define origflags ((loop)->origflags)\n#define pending_w ((loop)->pending_w)\n#define pendingcnt ((loop)->pendingcnt)\n#define pendingmax ((loop)->pendingmax)\n#define pendingpri ((loop)->pendingpri)\n#define pendings ((loop)->pendings)\n#define periodiccnt ((loop)->periodiccnt)\n#define periodicmax ((loop)->periodicmax)\n#define periodics ((loop)->periodics)\n#define pipe_w ((loop)->pipe_w)\n#define pipe_write_skipped ((loop)->pipe_write_skipped)\n#define pipe_write_wanted ((loop)->pipe_write_wanted)\n#define pollcnt ((loop)->pollcnt)\n#define pollidxmax ((loop)->pollidxmax)\n#define pollidxs ((loop)->pollidxs)\n#define pollmax ((loop)->pollmax)\n#define polls ((loop)->polls)\n#define port_eventmax ((loop)->port_eventmax)\n#define port_events ((loop)->port_events)\n#define postfork ((loop)->postfork)\n#define preparecnt ((loop)->preparecnt)\n#define preparemax ((loop)->preparemax)\n#define prepares ((loop)->prepares)\n#define release_cb ((loop)->release_cb)\n#define rfeedcnt ((loop)->rfeedcnt)\n#define rfeedmax ((loop)->rfeedmax)\n#define rfeeds ((loop)->rfeeds)\n#define rtmn_diff ((loop)->rtmn_diff)\n#define sig_pending ((loop)->sig_pending)\n#define sigfd ((loop)->sigfd)\n#define sigfd_set ((loop)->sigfd_set)\n#define sigfd_w ((loop)->sigfd_w)\n#define timeout_blocktime ((loop)->timeout_blocktime)\n#define timercnt ((loop)->timercnt)\n#define timermax ((loop)->timermax)\n#define timers ((loop)->timers)\n#define userdata ((loop)->userdata)\n#define vec_eo ((loop)->vec_eo)\n#define vec_max ((loop)->vec_max)\n#define vec_ri ((loop)->vec_ri)\n#define vec_ro ((loop)->vec_ro)\n#define vec_wi ((loop)->vec_wi)\n#define vec_wo ((loop)->vec_wo)\n#else\n#undef EV_WRAP_H\n#undef acquire_cb\n#undef activecnt\n#undef anfdmax\n#undef anfds\n#undef async_pending\n#undef asynccnt\n#undef asyncmax\n#undef asyncs\n#undef backend\n#undef backend_fd\n#undef backend_mintime\n#undef backend_modify\n#undef backend_poll\n#undef checkcnt\n#undef checkmax\n#undef checks\n#undef cleanupcnt\n#undef cleanupmax\n#undef cleanups\n#undef curpid\n#undef epoll_epermcnt\n#undef epoll_epermmax\n#undef epoll_eperms\n#undef epoll_eventmax\n#undef epoll_events\n#undef evpipe\n#undef fdchangecnt\n#undef fdchangemax\n#undef fdchanges\n#undef forkcnt\n#undef forkmax\n#undef forks\n#undef fs_2625\n#undef fs_fd\n#undef fs_hash\n#undef fs_w\n#undef idleall\n#undef idlecnt\n#undef idlemax\n#undef idles\n#undef invoke_cb\n#undef io_blocktime\n#undef iocp\n#undef kqueue_changecnt\n#undef kqueue_changemax\n#undef kqueue_changes\n#undef kqueue_eventmax\n#undef kqueue_events\n#undef kqueue_fd_pid\n#undef loop_count\n#undef loop_depth\n#undef loop_done\n#undef mn_now\n#undef now_floor\n#undef origflags\n#undef pending_w\n#undef pendingcnt\n#undef pendingmax\n#undef pendingpri\n#undef pendings\n#undef periodiccnt\n#undef periodicmax\n#undef periodics\n#undef pipe_w\n#undef pipe_write_skipped\n#undef pipe_write_wanted\n#undef pollcnt\n#undef pollidxmax\n#undef pollidxs\n#undef pollmax\n#undef polls\n#undef port_eventmax\n#undef port_events\n#undef postfork\n#undef preparecnt\n#undef preparemax\n#undef prepares\n#undef release_cb\n#undef rfeedcnt\n#undef rfeedmax\n#undef rfeeds\n#undef rtmn_diff\n#undef sig_pending\n#undef sigfd\n#undef sigfd_set\n#undef sigfd_w\n#undef timeout_blocktime\n#undef timercnt\n#undef timermax\n#undef timers\n#undef userdata\n#undef vec_eo\n#undef vec_max\n#undef vec_ri\n#undef vec_ro\n#undef vec_wi\n#undef vec_wo\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/event.c",
    "content": "/*\n * libevent compatibility layer\n *\n * Copyright (c) 2007,2008,2009,2010,2012 Marc Alexander Lehmann <libev@schmorp.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modifica-\n * tion, are permitted provided that the following conditions are met:\n *\n *   1.  Redistributions of source code must retain the above copyright notice,\n *       this list of conditions and the following disclaimer.\n *\n *   2.  Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-\n * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-\n * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-\n * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Alternatively, the contents of this file may be used under the terms of\n * the GNU General Public License (\"GPL\") version 2 or any later version,\n * in which case the provisions of the GPL are applicable instead of\n * the above. If you wish to allow the use of your version of this file\n * only under the terms of the GPL and not to allow others to use your\n * version of this file under the BSD license, indicate your decision\n * by deleting the provisions above and replace them with the notice\n * and other provisions required by the GPL. If you do not delete the\n * provisions above, a recipient may use your version of this file under\n * either the BSD or the GPL.\n */\n\n#include <stddef.h>\n#include <stdlib.h>\n#include <assert.h>\n\n#ifdef EV_EVENT_H\n# include EV_EVENT_H\n#else\n# include \"event.h\"\n#endif\n\n#if EV_MULTIPLICITY\n# define dLOOPev struct ev_loop *loop = (struct ev_loop *)ev->ev_base\n# define dLOOPbase struct ev_loop *loop = (struct ev_loop *)base\n#else\n# define dLOOPev\n# define dLOOPbase\n#endif\n\n/* never accessed, will always be cast from/to ev_loop */\nstruct event_base\n{\n  int dummy;\n};\n\nstatic struct event_base *ev_x_cur;\n\nstatic ev_tstamp\nev_tv_get (struct timeval *tv)\n{\n  if (tv)\n    {\n      ev_tstamp after = tv->tv_sec + tv->tv_usec * 1e-6;\n      return after ? after : 1e-6;\n    }\n  else\n    return -1.;\n}\n\n#define EVENT_STRINGIFY(s) # s\n#define EVENT_VERSION(a,b) EVENT_STRINGIFY (a) \".\" EVENT_STRINGIFY (b)\n\nconst char *\nevent_get_version (void)\n{\n  /* returns ABI, not API or library, version */\n  return EVENT_VERSION (EV_VERSION_MAJOR, EV_VERSION_MINOR);\n}\n\nconst char *\nevent_get_method (void)\n{\n  return \"libev\";\n}\n\nvoid *event_init (void)\n{\n#if EV_MULTIPLICITY\n  if (ev_x_cur)\n    ev_x_cur = (struct event_base *)ev_loop_new (EVFLAG_AUTO);\n  else\n    ev_x_cur = (struct event_base *)ev_default_loop (EVFLAG_AUTO);\n#else\n  assert ((\"libev: multiple event bases not supported when not compiled with EV_MULTIPLICITY\", !ev_x_cur));\n\n  ev_x_cur = (struct event_base *)(long)ev_default_loop (EVFLAG_AUTO);\n#endif\n\n  return ev_x_cur;\n}\n\nconst char *\nevent_base_get_method (const struct event_base *base)\n{\n  return \"libev\";\n}\n\nstruct event_base *\nevent_base_new (void)\n{\n#if EV_MULTIPLICITY\n  return (struct event_base *)ev_loop_new (EVFLAG_AUTO);\n#else\n  assert ((\"libev: multiple event bases not supported when not compiled with EV_MULTIPLICITY\"));\n  return NULL;\n#endif\n}\n\nvoid event_base_free (struct event_base *base)\n{\n  dLOOPbase;\n\n#if EV_MULTIPLICITY\n  if (!ev_is_default_loop (loop))\n    ev_loop_destroy (loop);\n#endif\n}\n\nint event_dispatch (void)\n{\n  return event_base_dispatch (ev_x_cur);\n}\n\n#ifdef EV_STANDALONE\nvoid event_set_log_callback (event_log_cb cb)\n{\n  /* nop */\n}\n#endif\n\nint event_loop (int flags)\n{\n  return event_base_loop (ev_x_cur, flags);\n}\n\nint event_loopexit (struct timeval *tv)\n{\n  return event_base_loopexit (ev_x_cur, tv);\n}\n\nevent_callback_fn event_get_callback\n(const struct event *ev)\n{\n  return ev->ev_callback;\n}\n\nstatic void\nev_x_cb (struct event *ev, int revents)\n{\n  revents &= EV_READ | EV_WRITE | EV_TIMER | EV_SIGNAL;\n\n  ev->ev_res = revents;\n  ev->ev_callback (ev->ev_fd, (short)revents, ev->ev_arg);\n}\n\nstatic void\nev_x_cb_sig (EV_P_ struct ev_signal *w, int revents)\n{\n  struct event *ev = (struct event *)(((char *)w) - offsetof (struct event, iosig.sig));\n\n  if (revents & EV_ERROR)\n    event_del (ev);\n\n  ev_x_cb (ev, revents);\n}\n\nstatic void\nev_x_cb_io (EV_P_ struct ev_io *w, int revents)\n{\n  struct event *ev = (struct event *)(((char *)w) - offsetof (struct event, iosig.io));\n\n  if ((revents & EV_ERROR) || !(ev->ev_events & EV_PERSIST))\n    event_del (ev);\n\n  ev_x_cb (ev, revents);\n}\n\nstatic void\nev_x_cb_to (EV_P_ struct ev_timer *w, int revents)\n{\n  struct event *ev = (struct event *)(((char *)w) - offsetof (struct event, to));\n\n  event_del (ev);\n\n  ev_x_cb (ev, revents);\n}\n\nvoid event_set (struct event *ev, int fd, short events, void (*cb)(int, short, void *), void *arg)\n{\n  if (events & EV_SIGNAL)\n    ev_init (&ev->iosig.sig, ev_x_cb_sig);\n  else\n    ev_init (&ev->iosig.io, ev_x_cb_io);\n\n  ev_init (&ev->to, ev_x_cb_to);\n\n  ev->ev_base     = ev_x_cur; /* not threadsafe, but it's how libevent works */\n  ev->ev_fd       = fd;\n  ev->ev_events   = events;\n  ev->ev_pri      = 0;\n  ev->ev_callback = cb;\n  ev->ev_arg      = arg;\n  ev->ev_res      = 0;\n  ev->ev_flags    = EVLIST_INIT;\n}\n\nint event_once (int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv)\n{\n  return event_base_once (ev_x_cur, fd, events, cb, arg, tv);\n}\n\nint event_add (struct event *ev, struct timeval *tv)\n{\n  dLOOPev;\n\n  if (ev->ev_events & EV_SIGNAL)\n    {\n      if (!ev_is_active (&ev->iosig.sig))\n        {\n          ev_signal_set (&ev->iosig.sig, ev->ev_fd);\n          ev_signal_start (EV_A_ &ev->iosig.sig);\n\n          ev->ev_flags |= EVLIST_SIGNAL;\n        }\n    }\n  else if (ev->ev_events & (EV_READ | EV_WRITE))\n    {\n      if (!ev_is_active (&ev->iosig.io))\n        {\n          ev_io_set (&ev->iosig.io, ev->ev_fd, ev->ev_events & (EV_READ | EV_WRITE));\n          ev_io_start (EV_A_ &ev->iosig.io);\n\n          ev->ev_flags |= EVLIST_INSERTED;\n        }\n    }\n\n  if (tv)\n    {\n      ev->to.repeat = ev_tv_get (tv);\n      ev_timer_again (EV_A_ &ev->to);\n      ev->ev_flags |= EVLIST_TIMEOUT;\n    }\n  else\n    {\n      ev_timer_stop (EV_A_ &ev->to);\n      ev->ev_flags &= ~EVLIST_TIMEOUT;\n    }\n\n  ev->ev_flags |= EVLIST_ACTIVE;\n\n  return 0;\n}\n\nint event_del (struct event *ev)\n{\n  dLOOPev;\n\n  if (ev->ev_events & EV_SIGNAL)\n    ev_signal_stop (EV_A_ &ev->iosig.sig);\n  else if (ev->ev_events & (EV_READ | EV_WRITE))\n    ev_io_stop (EV_A_ &ev->iosig.io);\n\n  if (ev_is_active (&ev->to))\n    ev_timer_stop (EV_A_ &ev->to);\n\n  ev->ev_flags = EVLIST_INIT;\n\n  return 0;\n}\n\nvoid event_active (struct event *ev, int res, short ncalls)\n{\n  dLOOPev;\n\n  if (res & EV_TIMEOUT)\n    ev_feed_event (EV_A_ &ev->to, res & EV_TIMEOUT);\n\n  if (res & EV_SIGNAL)\n    ev_feed_event (EV_A_ &ev->iosig.sig, res & EV_SIGNAL);\n\n  if (res & (EV_READ | EV_WRITE))\n    ev_feed_event (EV_A_ &ev->iosig.io, res & (EV_READ | EV_WRITE));\n}\n\nint event_pending (struct event *ev, short events, struct timeval *tv)\n{\n  short revents = 0;\n  dLOOPev;\n\n  if (ev->ev_events & EV_SIGNAL)\n    {\n      /* sig */\n      if (ev_is_active (&ev->iosig.sig) || ev_is_pending (&ev->iosig.sig))\n        revents |= EV_SIGNAL;\n    }\n  else if (ev->ev_events & (EV_READ | EV_WRITE))\n    {\n      /* io */\n      if (ev_is_active (&ev->iosig.io) || ev_is_pending (&ev->iosig.io))\n        revents |= ev->ev_events & (EV_READ | EV_WRITE);\n    }\n\n  if (ev->ev_events & EV_TIMEOUT || ev_is_active (&ev->to) || ev_is_pending (&ev->to))\n    {\n      revents |= EV_TIMEOUT;\n\n      if (tv)\n        {\n          ev_tstamp at = ev_now (EV_A);\n\n          tv->tv_sec  = (long)at;\n          tv->tv_usec = (long)((at - (ev_tstamp)tv->tv_sec) * 1e6);\n        }\n    }\n\n  return events & revents;\n}\n\nint event_priority_init (int npri)\n{\n  return event_base_priority_init (ev_x_cur, npri);\n}\n\nint event_priority_set (struct event *ev, int pri)\n{\n  ev->ev_pri = pri;\n\n  return 0;\n}\n\nint event_base_set (struct event_base *base, struct event *ev)\n{\n  ev->ev_base = base;\n\n  return 0;\n}\n\nint event_base_loop (struct event_base *base, int flags)\n{\n  dLOOPbase;\n\n  return !ev_run (EV_A_ flags);\n}\n\nint event_base_dispatch (struct event_base *base)\n{\n  return event_base_loop (base, 0);\n}\n\nstatic void\nev_x_loopexit_cb (int revents, void *base)\n{\n  dLOOPbase;\n\n  ev_break (EV_A_ EVBREAK_ONE);\n}\n\nint event_base_loopexit (struct event_base *base, struct timeval *tv)\n{\n  ev_tstamp after = ev_tv_get (tv);\n  dLOOPbase;\n\n  ev_once (EV_A_ -1, 0, after >= 0. ? after : 0., ev_x_loopexit_cb, (void *)base);\n\n  return 0;\n}\n\nstruct ev_x_once\n{\n  int fd;\n  void (*cb)(int, short, void *);\n  void *arg;\n};\n\nstatic void\nev_x_once_cb (int revents, void *arg)\n{\n  struct ev_x_once *once = (struct ev_x_once *)arg;\n\n  once->cb (once->fd, (short)revents, once->arg);\n  free (once);\n}\n\nint event_base_once (struct event_base *base, int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv)\n{\n  struct ev_x_once *once = (struct ev_x_once *)malloc (sizeof (struct ev_x_once));\n  dLOOPbase;\n\n  if (!once)\n    return -1;\n\n  once->fd  = fd;\n  once->cb  = cb;\n  once->arg = arg;\n\n  ev_once (EV_A_ fd, events & (EV_READ | EV_WRITE), ev_tv_get (tv), ev_x_once_cb, (void *)once);\n\n  return 0;\n}\n\nint event_base_priority_init (struct event_base *base, int npri)\n{\n  /*dLOOPbase;*/\n\n  return 0;\n}\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/event.h",
    "content": "/*\n * libevent compatibility header, only core events supported\n *\n * Copyright (c) 2007,2008,2010,2012 Marc Alexander Lehmann <libev@schmorp.de>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without modifica-\n * tion, are permitted provided that the following conditions are met:\n *\n *   1.  Redistributions of source code must retain the above copyright notice,\n *       this list of conditions and the following disclaimer.\n *\n *   2.  Redistributions in binary form must reproduce the above copyright\n *       notice, this list of conditions and the following disclaimer in the\n *       documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED\n * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MER-\n * CHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO\n * EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPE-\n * CIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\n * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;\n * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,\n * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTH-\n * ERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED\n * OF THE POSSIBILITY OF SUCH DAMAGE.\n *\n * Alternatively, the contents of this file may be used under the terms of\n * the GNU General Public License (\"GPL\") version 2 or any later version,\n * in which case the provisions of the GPL are applicable instead of\n * the above. If you wish to allow the use of your version of this file\n * only under the terms of the GPL and not to allow others to use your\n * version of this file under the BSD license, indicate your decision\n * by deleting the provisions above and replace them with the notice\n * and other provisions required by the GPL. If you do not delete the\n * provisions above, a recipient may use your version of this file under\n * either the BSD or the GPL.\n */\n\n#ifndef EVENT_H_\n#define EVENT_H_\n\n#ifdef EV_H\n# include EV_H\n#else\n# include \"ev.h\"\n#endif\n\n#ifndef EVLOOP_NONBLOCK\n# define EVLOOP_NONBLOCK EVRUN_NOWAIT\n#endif\n#ifndef EVLOOP_ONESHOT\n# define EVLOOP_ONESHOT EVRUN_ONCE\n#endif\n#ifndef EV_TIMEOUT\n# define EV_TIMEOUT EV_TIMER\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* we need sys/time.h for struct timeval only */\n#if !defined (WIN32) || defined (__MINGW32__)\n# include <time.h> /* mingw seems to need this, for whatever reason */\n# include <sys/time.h>\n#endif\n\nstruct event_base;\n\n#define EVLIST_TIMEOUT  0x01\n#define EVLIST_INSERTED 0x02\n#define EVLIST_SIGNAL   0x04\n#define EVLIST_ACTIVE   0x08\n#define EVLIST_INTERNAL 0x10\n#define EVLIST_INIT     0x80\n\ntypedef void (*event_callback_fn)(int, short, void *);\n\nstruct event\n{\n  /* libev watchers we map onto */\n  union {\n    struct ev_io io;\n    struct ev_signal sig;\n  } iosig;\n  struct ev_timer to;\n\n  /* compatibility slots */\n  struct event_base *ev_base;\n  event_callback_fn ev_callback;\n  void *ev_arg;\n  int ev_fd;\n  int ev_pri;\n  int ev_res;\n  int ev_flags;\n  short ev_events;\n};\n\nevent_callback_fn event_get_callback (const struct event *ev);\n\n#define EV_READ                    EV_READ\n#define EV_WRITE                   EV_WRITE\n#define EV_PERSIST                 0x10\n#define EV_ET                      0x20 /* nop */\n\n#define EVENT_SIGNAL(ev)           ((int) (ev)->ev_fd)\n#define EVENT_FD(ev)               ((int) (ev)->ev_fd)\n\n#define event_initialized(ev)      ((ev)->ev_flags & EVLIST_INIT)\n\n#define evtimer_add(ev,tv)         event_add (ev, tv)\n#define evtimer_set(ev,cb,data)    event_set (ev, -1, 0, cb, data)\n#define evtimer_del(ev)            event_del (ev)\n#define evtimer_pending(ev,tv)     event_pending (ev, EV_TIMEOUT, tv)\n#define evtimer_initialized(ev)    event_initialized (ev)\n\n#define timeout_add(ev,tv)         evtimer_add (ev, tv)\n#define timeout_set(ev,cb,data)    evtimer_set (ev, cb, data)\n#define timeout_del(ev)            evtimer_del (ev)\n#define timeout_pending(ev,tv)     evtimer_pending (ev, tv)\n#define timeout_initialized(ev)    evtimer_initialized (ev)\n\n#define signal_add(ev,tv)          event_add (ev, tv)\n#define signal_set(ev,sig,cb,data) event_set (ev, sig, EV_SIGNAL | EV_PERSIST, cb, data)\n#define signal_del(ev)             event_del (ev)\n#define signal_pending(ev,tv)      event_pending (ev, EV_SIGNAL, tv)\n#define signal_initialized(ev)     event_initialized (ev)\n\nconst char *event_get_version (void);\nconst char *event_get_method (void);\n\nvoid *event_init (void);\nvoid event_base_free (struct event_base *base);\n\n#define EVLOOP_ONCE      EVLOOP_ONESHOT\nint event_loop (int);\nint event_loopexit (struct timeval *tv);\nint event_dispatch (void);\n\n#define _EVENT_LOG_DEBUG 0\n#define _EVENT_LOG_MSG   1\n#define _EVENT_LOG_WARN  2\n#define _EVENT_LOG_ERR   3\ntypedef void (*event_log_cb)(int severity, const char *msg);\nvoid event_set_log_callback(event_log_cb cb);\n\nvoid event_set (struct event *ev, int fd, short events, void (*cb)(int, short, void *), void *arg);\nint event_once (int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv);\n\nint event_add (struct event *ev, struct timeval *tv);\nint event_del (struct event *ev);\nvoid event_active (struct event *ev, int res, short ncalls); /* ncalls is being ignored */\n\nint event_pending (struct event *ev, short, struct timeval *tv);\n\nint event_priority_init (int npri);\nint event_priority_set (struct event *ev, int pri);\n\nstruct event_base *event_base_new (void);\nconst char *event_base_get_method (const struct event_base *);\nint event_base_set (struct event_base *base, struct event *ev);\nint event_base_loop (struct event_base *base, int);\nint event_base_loopexit (struct event_base *base, struct timeval *tv);\nint event_base_dispatch (struct event_base *base);\nint event_base_once (struct event_base *base, int fd, short events, void (*cb)(int, short, void *), void *arg, struct timeval *tv);\nint event_base_priority_init (struct event_base *base, int fd);\n\n/* next line is different in the libevent+libev version */\n/*libevent-include*/\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libev/libev.m4",
    "content": "dnl this file is part of libev, do not make local modifications\ndnl http://software.schmorp.de/pkg/libev\n\ndnl libev support\nAC_CHECK_HEADERS(sys/inotify.h sys/epoll.h sys/event.h port.h poll.h sys/select.h sys/eventfd.h sys/signalfd.h)\n \nAC_CHECK_FUNCS(inotify_init epoll_ctl kqueue port_create poll select eventfd signalfd)\n \nAC_CHECK_FUNCS(clock_gettime, [], [\n   dnl on linux, try syscall wrapper first\n   if test $(uname) = Linux; then\n      AC_MSG_CHECKING(for clock_gettime syscall)\n      AC_LINK_IFELSE([AC_LANG_PROGRAM(\n                      [#include <unistd.h>\n                       #include <sys/syscall.h>\n                       #include <time.h>],\n                      [struct timespec ts; int status = syscall (SYS_clock_gettime, CLOCK_REALTIME, &ts)])],\n                     [ac_have_clock_syscall=1\n                      AC_DEFINE(HAVE_CLOCK_SYSCALL, 1, Define to 1 to use the syscall interface for clock_gettime)\n                      AC_MSG_RESULT(yes)],\n                     [AC_MSG_RESULT(no)])\n   fi\n   if test -z \"$LIBEV_M4_AVOID_LIBRT\" && test -z \"$ac_have_clock_syscall\"; then\n      AC_CHECK_LIB(rt, clock_gettime)\n      unset ac_cv_func_clock_gettime\n      AC_CHECK_FUNCS(clock_gettime)\n   fi\n])\n\nAC_CHECK_FUNCS(nanosleep, [], [\n   if test -z \"$LIBEV_M4_AVOID_LIBRT\"; then\n      AC_CHECK_LIB(rt, nanosleep)\n      unset ac_cv_func_nanosleep\n      AC_CHECK_FUNCS(nanosleep)\n   fi\n])\n\nif test -z \"$LIBEV_M4_AVOID_LIBM\"; then\n   LIBM=m\nfi\nAC_SEARCH_LIBS(floor, $LIBM, [AC_DEFINE(HAVE_FLOOR, 1, Define to 1 if the floor function is available)])\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/CMakeLists.txt",
    "content": "# -*- coding: utf-8 -*-\n# ----------------------------------------------------------------------\n# Copyright © 2011-2013, RedJack, LLC.\n# All rights reserved.\n#\n# Please see the LICENSE.txt file in this distribution for license\n# details.\n# ----------------------------------------------------------------------\n\ncmake_minimum_required(VERSION 2.6)\nset(PROJECT_NAME ipset)\nset(RELEASE_DATE 2013-12-11)\nproject(${PROJECT_NAME})\n\nset(CMAKE_MODULE_PATH \"${CMAKE_CURRENT_SOURCE_DIR}/cmake\")\nfind_package(CTargets)\n\n#-----------------------------------------------------------------------\n# Retrieve the current version number\n\n#-----------------------------------------------------------------------\n# Check for building on Tilera\n# If the Tilera environment is installed, then $TILERA_ROOT is defined\n# as the path to the active MDE.\n\nif(DEFINED ENV{TILERA_ROOT})\n    set(TILERA TRUE)\n    set(TILERA_ROOT $ENV{TILERA_ROOT})\n    message(\"-- Configuring for Tilera MDE ${TILERA_ROOT}\")\n    set(ENV{PKG_CONFIG_PATH}\n        \"${TILERA_ROOT}/tile/usr/lib/pkgconfig:${TILERA_ROOT}/tile/usr/local/lib/pkgconfig:$ENV{PKG_CONFIG_PATH}\"\n    )\n    set(CMAKE_SYSTEM_NAME \"Tilera\")\n    set(CMAKE_SYSTEM_PROCESSOR \"tilegx\")\n    set(CMAKE_C_COMPILER \"${TILERA_ROOT}/bin/tile-gcc\")\n    set(CMAKE_LINKER \"${TILERA_ROOT}/bin/tile-ld\")\n    set(TILERA_MONITOR \"${TILERA_ROOT}/bin/tile-monitor\")\n    #add_definitions(-std=gnu99)\n    set(CMAKE_FIND_ROOT_PATH \"${TILERA_ROOT}/tile\")\n    set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM ONLY)\n    set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY)\n    set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY)\nendif()\n\n#-----------------------------------------------------------------------\n# Check for prerequisite libraries\n\ninclude_directories(${libcork_include_dirs})\n\n#-----------------------------------------------------------------------\n# Set some options\n\nif(APPLE)\n    if (NOT CMAKE_INSTALL_NAME_DIR)\n        set(CMAKE_INSTALL_NAME_DIR \"${CMAKE_INSTALL_PREFIX}/lib\")\n    endif (NOT CMAKE_INSTALL_NAME_DIR)\nendif(APPLE)\n\nif(NOT CMAKE_BUILD_TYPE)\n    set(CMAKE_BUILD_TYPE Release CACHE STRING\n        \"Choose the type of build, options are: None Debug Release RelWithDebInfo MinSizeRel.\"\n        FORCE)\nendif(NOT CMAKE_BUILD_TYPE)\n\nif(CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n    add_definitions(-Wall -Werror)\nelseif(CMAKE_C_COMPILER_ID STREQUAL \"Clang\")\n    add_definitions(-Wall -Werror)\nelseif(CMAKE_C_COMPILER_ID STREQUAL \"Intel\")\n    add_definitions(-Wall -Werror)\nendif(CMAKE_C_COMPILER_ID STREQUAL \"GNU\")\n\n#-----------------------------------------------------------------------\n# Include our subdirectories\n\n#add_subdirectory(src)\n\nadd_c_library(\n        libipset\n        OUTPUT_NAME ipset\n        PKGCONFIG_NAME libipset\n        VERSION 1.1.0\n        SOURCES\n        general.c\n        bdd/assignments.c\n        bdd/basics.c\n        bdd/bdd-iterator.c\n        bdd/expanded.c\n        bdd/reachable.c\n        bdd/read.c\n        bdd/write.c\n        map/allocation.c\n        map/inspection.c\n        map/ipv4_map.c\n        map/ipv6_map.c\n        map/storage.c\n        set/allocation.c\n        set/inspection.c\n        set/ipv4_set.c\n        set/ipv6_set.c\n        set/iterator.c\n        set/storage.c\n\n        LOCAL_LIBRARIES\n        libcork\n)\n\nset(libipset_include_dirs\n        ${PROJECT_SOURCE_DIR}/include\n        ${PROJECT_BINARY_DIR}/include\n        CACHE INTERNAL \"libipset library\" FORCE\n        )\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/LICENSE.txt",
    "content": "Copyright © 2009-2013, RedJack, LLC.\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are\nmet:\n\n  • Redistributions of source code must retain the above copyright\n    notice, this list of conditions and the following disclaimer.\n\n  • Redistributions in binary form must reproduce the above copyright\n    notice, this list of conditions and the following disclaimer in\n    the documentation and/or other materials provided with the\n    distribution.\n\n  • Neither the name of RedJack Software, LLC nor the names of its\n    contributors may be used to endorse or promote products derived\n    from this software without specific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS\n\"AS IS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT\nLIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR\nA PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT\nHOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,\nSPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT\nLIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\nDATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\nTHEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE\nOF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/Makefile.am",
    "content": "noinst_LTLIBRARIES = libipset.la\n\nbdd_src = bdd/assignments.c bdd/basics.c bdd/bdd-iterator.c bdd/expanded.c \\\n\t\t  bdd/reachable.c bdd/read.c bdd/write.c \nmap_src = map/allocation.c map/inspection.c map/ipv4_map.c map/ipv6_map.c \\\n\t\t  map/storage.c\nset_src = set/allocation.c set/inspection.c set/ipv4_set.c set/ipv6_set.c \\\n\t\t  set/iterator.c set/storage.c\n\nlibipset_la_SOURCES = general.c ${bdd_src} ${map_src} ${set_src}\nlibipset_la_CFLAGS = -I$(top_srcdir)/libipset/include -I$(top_srcdir)/libcork/include\n\nlibipset_la_LDFLAGS = -static\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/Makefile.in",
    "content": "# Makefile.in generated by automake 1.15 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2014 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\nam__is_gnu_make = { \\\n  if test -z '$(MAKELEVEL)'; then \\\n    false; \\\n  elif test -n '$(MAKE_HOST)'; then \\\n    true; \\\n  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \\\n    true; \\\n  else \\\n    false; \\\n  fi; \\\n}\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\nsubdir = libipset\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \\\n\t$(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/inet_ntop.m4 \\\n\t$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \\\n\t$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \\\n\t$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/mbedtls.m4 \\\n\t$(top_srcdir)/m4/openssl.m4 $(top_srcdir)/m4/pcre.m4 \\\n\t$(top_srcdir)/m4/polarssl.m4 \\\n\t$(top_srcdir)/m4/stack-protector.m4 $(top_srcdir)/m4/zlib.m4 \\\n\t$(top_srcdir)/libev/libev.m4 $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nDIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nLTLIBRARIES = $(noinst_LTLIBRARIES)\nlibipset_la_LIBADD =\nam__dirstamp = $(am__leading_dot)dirstamp\nam__objects_1 = bdd/libipset_la-assignments.lo \\\n\tbdd/libipset_la-basics.lo bdd/libipset_la-bdd-iterator.lo \\\n\tbdd/libipset_la-expanded.lo bdd/libipset_la-reachable.lo \\\n\tbdd/libipset_la-read.lo bdd/libipset_la-write.lo\nam__objects_2 = map/libipset_la-allocation.lo \\\n\tmap/libipset_la-inspection.lo map/libipset_la-ipv4_map.lo \\\n\tmap/libipset_la-ipv6_map.lo map/libipset_la-storage.lo\nam__objects_3 = set/libipset_la-allocation.lo \\\n\tset/libipset_la-inspection.lo set/libipset_la-ipv4_set.lo \\\n\tset/libipset_la-ipv6_set.lo set/libipset_la-iterator.lo \\\n\tset/libipset_la-storage.lo\nam_libipset_la_OBJECTS = libipset_la-general.lo $(am__objects_1) \\\n\t$(am__objects_2) $(am__objects_3)\nlibipset_la_OBJECTS = $(am_libipset_la_OBJECTS)\nAM_V_lt = $(am__v_lt_@AM_V@)\nam__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)\nam__v_lt_0 = --silent\nam__v_lt_1 = \nlibipset_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(libipset_la_CFLAGS) \\\n\t$(CFLAGS) $(libipset_la_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nDEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)\ndepcomp = $(SHELL) $(top_srcdir)/auto/depcomp\nam__depfiles_maybe = depfiles\nam__mv = mv -f\nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nLTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \\\n\t$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \\\n\t$(AM_CFLAGS) $(CFLAGS)\nAM_V_CC = $(am__v_CC_@AM_V@)\nam__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)\nam__v_CC_0 = @echo \"  CC      \" $@;\nam__v_CC_1 = \nCCLD = $(CC)\nLINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \\\n\t$(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_CCLD = $(am__v_CCLD_@AM_V@)\nam__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)\nam__v_CCLD_0 = @echo \"  CCLD    \" $@;\nam__v_CCLD_1 = \nSOURCES = $(libipset_la_SOURCES)\nDIST_SOURCES = $(libipset_la_SOURCES)\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nam__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/auto/depcomp\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAR = @AR@\nASCIIDOC = @ASCIIDOC@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDLLTOOL = @DLLTOOL@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nGZIP = @GZIP@\nINET_NTOP_LIB = @INET_NTOP_LIB@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBPCRE = @LIBPCRE@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMANIFEST_TOOL = @MANIFEST_TOOL@\nMKDIR_P = @MKDIR_P@\nMV = @MV@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nPCRE_CONFIG = @PCRE_CONFIG@\nPTHREAD_CC = @PTHREAD_CC@\nPTHREAD_CFLAGS = @PTHREAD_CFLAGS@\nPTHREAD_LIBS = @PTHREAD_LIBS@\nRANLIB = @RANLIB@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nXMLTO = @XMLTO@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_AR = @ac_ct_AR@\nac_ct_CC = @ac_ct_CC@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nax_pthread_config = @ax_pthread_config@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npcre_pcreh = @pcre_pcreh@\npcreh = @pcreh@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nrunstatedir = @runstatedir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsubdirs = @subdirs@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nnoinst_LTLIBRARIES = libipset.la\nbdd_src = bdd/assignments.c bdd/basics.c bdd/bdd-iterator.c bdd/expanded.c \\\n\t\t  bdd/reachable.c bdd/read.c bdd/write.c \n\nmap_src = map/allocation.c map/inspection.c map/ipv4_map.c map/ipv6_map.c \\\n\t\t  map/storage.c\n\nset_src = set/allocation.c set/inspection.c set/ipv4_set.c set/ipv6_set.c \\\n\t\t  set/iterator.c set/storage.c\n\nlibipset_la_SOURCES = general.c ${bdd_src} ${map_src} ${set_src}\nlibipset_la_CFLAGS = -I$(top_srcdir)/libipset/include -I$(top_srcdir)/libcork/include\nlibipset_la_LDFLAGS = -static\nall: all-am\n\n.SUFFIXES:\n.SUFFIXES: .c .lo .o .obj\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libipset/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign libipset/Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nclean-noinstLTLIBRARIES:\n\t-test -z \"$(noinst_LTLIBRARIES)\" || rm -f $(noinst_LTLIBRARIES)\n\t@list='$(noinst_LTLIBRARIES)'; \\\n\tlocs=`for p in $$list; do echo $$p; done | \\\n\t      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \\\n\t      sort -u`; \\\n\ttest -z \"$$locs\" || { \\\n\t  echo rm -f $${locs}; \\\n\t  rm -f $${locs}; \\\n\t}\nbdd/$(am__dirstamp):\n\t@$(MKDIR_P) bdd\n\t@: > bdd/$(am__dirstamp)\nbdd/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) bdd/$(DEPDIR)\n\t@: > bdd/$(DEPDIR)/$(am__dirstamp)\nbdd/libipset_la-assignments.lo: bdd/$(am__dirstamp) \\\n\tbdd/$(DEPDIR)/$(am__dirstamp)\nbdd/libipset_la-basics.lo: bdd/$(am__dirstamp) \\\n\tbdd/$(DEPDIR)/$(am__dirstamp)\nbdd/libipset_la-bdd-iterator.lo: bdd/$(am__dirstamp) \\\n\tbdd/$(DEPDIR)/$(am__dirstamp)\nbdd/libipset_la-expanded.lo: bdd/$(am__dirstamp) \\\n\tbdd/$(DEPDIR)/$(am__dirstamp)\nbdd/libipset_la-reachable.lo: bdd/$(am__dirstamp) \\\n\tbdd/$(DEPDIR)/$(am__dirstamp)\nbdd/libipset_la-read.lo: bdd/$(am__dirstamp) \\\n\tbdd/$(DEPDIR)/$(am__dirstamp)\nbdd/libipset_la-write.lo: bdd/$(am__dirstamp) \\\n\tbdd/$(DEPDIR)/$(am__dirstamp)\nmap/$(am__dirstamp):\n\t@$(MKDIR_P) map\n\t@: > map/$(am__dirstamp)\nmap/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) map/$(DEPDIR)\n\t@: > map/$(DEPDIR)/$(am__dirstamp)\nmap/libipset_la-allocation.lo: map/$(am__dirstamp) \\\n\tmap/$(DEPDIR)/$(am__dirstamp)\nmap/libipset_la-inspection.lo: map/$(am__dirstamp) \\\n\tmap/$(DEPDIR)/$(am__dirstamp)\nmap/libipset_la-ipv4_map.lo: map/$(am__dirstamp) \\\n\tmap/$(DEPDIR)/$(am__dirstamp)\nmap/libipset_la-ipv6_map.lo: map/$(am__dirstamp) \\\n\tmap/$(DEPDIR)/$(am__dirstamp)\nmap/libipset_la-storage.lo: map/$(am__dirstamp) \\\n\tmap/$(DEPDIR)/$(am__dirstamp)\nset/$(am__dirstamp):\n\t@$(MKDIR_P) set\n\t@: > set/$(am__dirstamp)\nset/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) set/$(DEPDIR)\n\t@: > set/$(DEPDIR)/$(am__dirstamp)\nset/libipset_la-allocation.lo: set/$(am__dirstamp) \\\n\tset/$(DEPDIR)/$(am__dirstamp)\nset/libipset_la-inspection.lo: set/$(am__dirstamp) \\\n\tset/$(DEPDIR)/$(am__dirstamp)\nset/libipset_la-ipv4_set.lo: set/$(am__dirstamp) \\\n\tset/$(DEPDIR)/$(am__dirstamp)\nset/libipset_la-ipv6_set.lo: set/$(am__dirstamp) \\\n\tset/$(DEPDIR)/$(am__dirstamp)\nset/libipset_la-iterator.lo: set/$(am__dirstamp) \\\n\tset/$(DEPDIR)/$(am__dirstamp)\nset/libipset_la-storage.lo: set/$(am__dirstamp) \\\n\tset/$(DEPDIR)/$(am__dirstamp)\n\nlibipset.la: $(libipset_la_OBJECTS) $(libipset_la_DEPENDENCIES) $(EXTRA_libipset_la_DEPENDENCIES) \n\t$(AM_V_CCLD)$(libipset_la_LINK)  $(libipset_la_OBJECTS) $(libipset_la_LIBADD) $(LIBS)\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\t-rm -f bdd/*.$(OBJEXT)\n\t-rm -f bdd/*.lo\n\t-rm -f map/*.$(OBJEXT)\n\t-rm -f map/*.lo\n\t-rm -f set/*.$(OBJEXT)\n\t-rm -f set/*.lo\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libipset_la-general.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@bdd/$(DEPDIR)/libipset_la-assignments.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@bdd/$(DEPDIR)/libipset_la-basics.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@bdd/$(DEPDIR)/libipset_la-bdd-iterator.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@bdd/$(DEPDIR)/libipset_la-expanded.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@bdd/$(DEPDIR)/libipset_la-reachable.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@bdd/$(DEPDIR)/libipset_la-read.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@bdd/$(DEPDIR)/libipset_la-write.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@map/$(DEPDIR)/libipset_la-allocation.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@map/$(DEPDIR)/libipset_la-inspection.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@map/$(DEPDIR)/libipset_la-ipv4_map.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@map/$(DEPDIR)/libipset_la-ipv6_map.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@map/$(DEPDIR)/libipset_la-storage.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@set/$(DEPDIR)/libipset_la-allocation.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@set/$(DEPDIR)/libipset_la-inspection.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@set/$(DEPDIR)/libipset_la-ipv4_set.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@set/$(DEPDIR)/libipset_la-ipv6_set.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@set/$(DEPDIR)/libipset_la-iterator.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@set/$(DEPDIR)/libipset_la-storage.Plo@am__quote@\n\n.c.o:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.o$$||'`;\\\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<\n\n.c.obj:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.obj$$||'`;\\\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\n.c.lo:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.lo$$||'`;\\\n@am__fastdepCC_TRUE@\t$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<\n\nlibipset_la-general.lo: general.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT libipset_la-general.lo -MD -MP -MF $(DEPDIR)/libipset_la-general.Tpo -c -o libipset_la-general.lo `test -f 'general.c' || echo '$(srcdir)/'`general.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libipset_la-general.Tpo $(DEPDIR)/libipset_la-general.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='general.c' object='libipset_la-general.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o libipset_la-general.lo `test -f 'general.c' || echo '$(srcdir)/'`general.c\n\nbdd/libipset_la-assignments.lo: bdd/assignments.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT bdd/libipset_la-assignments.lo -MD -MP -MF bdd/$(DEPDIR)/libipset_la-assignments.Tpo -c -o bdd/libipset_la-assignments.lo `test -f 'bdd/assignments.c' || echo '$(srcdir)/'`bdd/assignments.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) bdd/$(DEPDIR)/libipset_la-assignments.Tpo bdd/$(DEPDIR)/libipset_la-assignments.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='bdd/assignments.c' object='bdd/libipset_la-assignments.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o bdd/libipset_la-assignments.lo `test -f 'bdd/assignments.c' || echo '$(srcdir)/'`bdd/assignments.c\n\nbdd/libipset_la-basics.lo: bdd/basics.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT bdd/libipset_la-basics.lo -MD -MP -MF bdd/$(DEPDIR)/libipset_la-basics.Tpo -c -o bdd/libipset_la-basics.lo `test -f 'bdd/basics.c' || echo '$(srcdir)/'`bdd/basics.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) bdd/$(DEPDIR)/libipset_la-basics.Tpo bdd/$(DEPDIR)/libipset_la-basics.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='bdd/basics.c' object='bdd/libipset_la-basics.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o bdd/libipset_la-basics.lo `test -f 'bdd/basics.c' || echo '$(srcdir)/'`bdd/basics.c\n\nbdd/libipset_la-bdd-iterator.lo: bdd/bdd-iterator.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT bdd/libipset_la-bdd-iterator.lo -MD -MP -MF bdd/$(DEPDIR)/libipset_la-bdd-iterator.Tpo -c -o bdd/libipset_la-bdd-iterator.lo `test -f 'bdd/bdd-iterator.c' || echo '$(srcdir)/'`bdd/bdd-iterator.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) bdd/$(DEPDIR)/libipset_la-bdd-iterator.Tpo bdd/$(DEPDIR)/libipset_la-bdd-iterator.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='bdd/bdd-iterator.c' object='bdd/libipset_la-bdd-iterator.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o bdd/libipset_la-bdd-iterator.lo `test -f 'bdd/bdd-iterator.c' || echo '$(srcdir)/'`bdd/bdd-iterator.c\n\nbdd/libipset_la-expanded.lo: bdd/expanded.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT bdd/libipset_la-expanded.lo -MD -MP -MF bdd/$(DEPDIR)/libipset_la-expanded.Tpo -c -o bdd/libipset_la-expanded.lo `test -f 'bdd/expanded.c' || echo '$(srcdir)/'`bdd/expanded.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) bdd/$(DEPDIR)/libipset_la-expanded.Tpo bdd/$(DEPDIR)/libipset_la-expanded.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='bdd/expanded.c' object='bdd/libipset_la-expanded.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o bdd/libipset_la-expanded.lo `test -f 'bdd/expanded.c' || echo '$(srcdir)/'`bdd/expanded.c\n\nbdd/libipset_la-reachable.lo: bdd/reachable.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT bdd/libipset_la-reachable.lo -MD -MP -MF bdd/$(DEPDIR)/libipset_la-reachable.Tpo -c -o bdd/libipset_la-reachable.lo `test -f 'bdd/reachable.c' || echo '$(srcdir)/'`bdd/reachable.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) bdd/$(DEPDIR)/libipset_la-reachable.Tpo bdd/$(DEPDIR)/libipset_la-reachable.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='bdd/reachable.c' object='bdd/libipset_la-reachable.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o bdd/libipset_la-reachable.lo `test -f 'bdd/reachable.c' || echo '$(srcdir)/'`bdd/reachable.c\n\nbdd/libipset_la-read.lo: bdd/read.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT bdd/libipset_la-read.lo -MD -MP -MF bdd/$(DEPDIR)/libipset_la-read.Tpo -c -o bdd/libipset_la-read.lo `test -f 'bdd/read.c' || echo '$(srcdir)/'`bdd/read.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) bdd/$(DEPDIR)/libipset_la-read.Tpo bdd/$(DEPDIR)/libipset_la-read.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='bdd/read.c' object='bdd/libipset_la-read.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o bdd/libipset_la-read.lo `test -f 'bdd/read.c' || echo '$(srcdir)/'`bdd/read.c\n\nbdd/libipset_la-write.lo: bdd/write.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT bdd/libipset_la-write.lo -MD -MP -MF bdd/$(DEPDIR)/libipset_la-write.Tpo -c -o bdd/libipset_la-write.lo `test -f 'bdd/write.c' || echo '$(srcdir)/'`bdd/write.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) bdd/$(DEPDIR)/libipset_la-write.Tpo bdd/$(DEPDIR)/libipset_la-write.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='bdd/write.c' object='bdd/libipset_la-write.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o bdd/libipset_la-write.lo `test -f 'bdd/write.c' || echo '$(srcdir)/'`bdd/write.c\n\nmap/libipset_la-allocation.lo: map/allocation.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT map/libipset_la-allocation.lo -MD -MP -MF map/$(DEPDIR)/libipset_la-allocation.Tpo -c -o map/libipset_la-allocation.lo `test -f 'map/allocation.c' || echo '$(srcdir)/'`map/allocation.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) map/$(DEPDIR)/libipset_la-allocation.Tpo map/$(DEPDIR)/libipset_la-allocation.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='map/allocation.c' object='map/libipset_la-allocation.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o map/libipset_la-allocation.lo `test -f 'map/allocation.c' || echo '$(srcdir)/'`map/allocation.c\n\nmap/libipset_la-inspection.lo: map/inspection.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT map/libipset_la-inspection.lo -MD -MP -MF map/$(DEPDIR)/libipset_la-inspection.Tpo -c -o map/libipset_la-inspection.lo `test -f 'map/inspection.c' || echo '$(srcdir)/'`map/inspection.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) map/$(DEPDIR)/libipset_la-inspection.Tpo map/$(DEPDIR)/libipset_la-inspection.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='map/inspection.c' object='map/libipset_la-inspection.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o map/libipset_la-inspection.lo `test -f 'map/inspection.c' || echo '$(srcdir)/'`map/inspection.c\n\nmap/libipset_la-ipv4_map.lo: map/ipv4_map.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT map/libipset_la-ipv4_map.lo -MD -MP -MF map/$(DEPDIR)/libipset_la-ipv4_map.Tpo -c -o map/libipset_la-ipv4_map.lo `test -f 'map/ipv4_map.c' || echo '$(srcdir)/'`map/ipv4_map.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) map/$(DEPDIR)/libipset_la-ipv4_map.Tpo map/$(DEPDIR)/libipset_la-ipv4_map.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='map/ipv4_map.c' object='map/libipset_la-ipv4_map.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o map/libipset_la-ipv4_map.lo `test -f 'map/ipv4_map.c' || echo '$(srcdir)/'`map/ipv4_map.c\n\nmap/libipset_la-ipv6_map.lo: map/ipv6_map.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT map/libipset_la-ipv6_map.lo -MD -MP -MF map/$(DEPDIR)/libipset_la-ipv6_map.Tpo -c -o map/libipset_la-ipv6_map.lo `test -f 'map/ipv6_map.c' || echo '$(srcdir)/'`map/ipv6_map.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) map/$(DEPDIR)/libipset_la-ipv6_map.Tpo map/$(DEPDIR)/libipset_la-ipv6_map.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='map/ipv6_map.c' object='map/libipset_la-ipv6_map.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o map/libipset_la-ipv6_map.lo `test -f 'map/ipv6_map.c' || echo '$(srcdir)/'`map/ipv6_map.c\n\nmap/libipset_la-storage.lo: map/storage.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT map/libipset_la-storage.lo -MD -MP -MF map/$(DEPDIR)/libipset_la-storage.Tpo -c -o map/libipset_la-storage.lo `test -f 'map/storage.c' || echo '$(srcdir)/'`map/storage.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) map/$(DEPDIR)/libipset_la-storage.Tpo map/$(DEPDIR)/libipset_la-storage.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='map/storage.c' object='map/libipset_la-storage.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o map/libipset_la-storage.lo `test -f 'map/storage.c' || echo '$(srcdir)/'`map/storage.c\n\nset/libipset_la-allocation.lo: set/allocation.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT set/libipset_la-allocation.lo -MD -MP -MF set/$(DEPDIR)/libipset_la-allocation.Tpo -c -o set/libipset_la-allocation.lo `test -f 'set/allocation.c' || echo '$(srcdir)/'`set/allocation.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) set/$(DEPDIR)/libipset_la-allocation.Tpo set/$(DEPDIR)/libipset_la-allocation.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='set/allocation.c' object='set/libipset_la-allocation.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o set/libipset_la-allocation.lo `test -f 'set/allocation.c' || echo '$(srcdir)/'`set/allocation.c\n\nset/libipset_la-inspection.lo: set/inspection.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT set/libipset_la-inspection.lo -MD -MP -MF set/$(DEPDIR)/libipset_la-inspection.Tpo -c -o set/libipset_la-inspection.lo `test -f 'set/inspection.c' || echo '$(srcdir)/'`set/inspection.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) set/$(DEPDIR)/libipset_la-inspection.Tpo set/$(DEPDIR)/libipset_la-inspection.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='set/inspection.c' object='set/libipset_la-inspection.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o set/libipset_la-inspection.lo `test -f 'set/inspection.c' || echo '$(srcdir)/'`set/inspection.c\n\nset/libipset_la-ipv4_set.lo: set/ipv4_set.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT set/libipset_la-ipv4_set.lo -MD -MP -MF set/$(DEPDIR)/libipset_la-ipv4_set.Tpo -c -o set/libipset_la-ipv4_set.lo `test -f 'set/ipv4_set.c' || echo '$(srcdir)/'`set/ipv4_set.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) set/$(DEPDIR)/libipset_la-ipv4_set.Tpo set/$(DEPDIR)/libipset_la-ipv4_set.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='set/ipv4_set.c' object='set/libipset_la-ipv4_set.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o set/libipset_la-ipv4_set.lo `test -f 'set/ipv4_set.c' || echo '$(srcdir)/'`set/ipv4_set.c\n\nset/libipset_la-ipv6_set.lo: set/ipv6_set.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT set/libipset_la-ipv6_set.lo -MD -MP -MF set/$(DEPDIR)/libipset_la-ipv6_set.Tpo -c -o set/libipset_la-ipv6_set.lo `test -f 'set/ipv6_set.c' || echo '$(srcdir)/'`set/ipv6_set.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) set/$(DEPDIR)/libipset_la-ipv6_set.Tpo set/$(DEPDIR)/libipset_la-ipv6_set.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='set/ipv6_set.c' object='set/libipset_la-ipv6_set.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o set/libipset_la-ipv6_set.lo `test -f 'set/ipv6_set.c' || echo '$(srcdir)/'`set/ipv6_set.c\n\nset/libipset_la-iterator.lo: set/iterator.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT set/libipset_la-iterator.lo -MD -MP -MF set/$(DEPDIR)/libipset_la-iterator.Tpo -c -o set/libipset_la-iterator.lo `test -f 'set/iterator.c' || echo '$(srcdir)/'`set/iterator.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) set/$(DEPDIR)/libipset_la-iterator.Tpo set/$(DEPDIR)/libipset_la-iterator.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='set/iterator.c' object='set/libipset_la-iterator.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o set/libipset_la-iterator.lo `test -f 'set/iterator.c' || echo '$(srcdir)/'`set/iterator.c\n\nset/libipset_la-storage.lo: set/storage.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -MT set/libipset_la-storage.lo -MD -MP -MF set/$(DEPDIR)/libipset_la-storage.Tpo -c -o set/libipset_la-storage.lo `test -f 'set/storage.c' || echo '$(srcdir)/'`set/storage.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) set/$(DEPDIR)/libipset_la-storage.Tpo set/$(DEPDIR)/libipset_la-storage.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='set/storage.c' object='set/libipset_la-storage.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libipset_la_CFLAGS) $(CFLAGS) -c -o set/libipset_la-storage.lo `test -f 'set/storage.c' || echo '$(srcdir)/'`set/storage.c\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\n\t-rm -rf bdd/.libs bdd/_libs\n\t-rm -rf map/.libs map/_libs\n\t-rm -rf set/.libs set/_libs\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-am\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-am\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscopelist: cscopelist-am\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(LTLIBRARIES)\ninstalldirs:\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\t-rm -f bdd/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f bdd/$(am__dirstamp)\n\t-rm -f map/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f map/$(am__dirstamp)\n\t-rm -f set/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f set/$(am__dirstamp)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \\\n\tmostlyclean-am\n\ndistclean: distclean-am\n\t-rm -rf ./$(DEPDIR) bdd/$(DEPDIR) map/$(DEPDIR) set/$(DEPDIR)\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t-rm -rf ./$(DEPDIR) bdd/$(DEPDIR) map/$(DEPDIR) set/$(DEPDIR)\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic \\\n\tmostlyclean-libtool\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am:\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \\\n\tclean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \\\n\tctags-am distclean distclean-compile distclean-generic \\\n\tdistclean-libtool distclean-tags distdir dvi dvi-am html \\\n\thtml-am info info-am install install-am install-data \\\n\tinstall-data-am install-dvi install-dvi-am install-exec \\\n\tinstall-exec-am install-html install-html-am install-info \\\n\tinstall-info-am install-man install-pdf install-pdf-am \\\n\tinstall-ps install-ps-am install-strip installcheck \\\n\tinstallcheck-am installdirs maintainer-clean \\\n\tmaintainer-clean-generic mostlyclean mostlyclean-compile \\\n\tmostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \\\n\ttags tags-am uninstall uninstall-am\n\n.PRECIOUS: Makefile\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/README.markdown",
    "content": "# ipset\n\nThe ipset library provides C data types for storing sets of IP\naddresses, and maps of IP addresses to integers.  It supports both\nIPv4 and IPv6 addresses.  It's implemented using [Binary Decision\nDiagrams](http://en.wikipedia.org/wiki/Binary_decision_diagram)\n(BDDs), which (we hypothesize) makes it space efficient for large\nsets.\n\nPlease see the INSTALL file for installation instructions.\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/bdd/Makefile.am",
    "content": "# This file is part of libasyncns.\n#\n# Copyright 2005-2008 Lennart Poettering\n#\n# libasyncns is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as\n# published by the Free Software Foundation, either version 2.1 of the\n# License, or (at your option) any later version.\n#\n# libasyncns is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n# Lesser General Public License for more details.\n#\n# You should have received a copy of the GNU Lesser General Public\n# License along with libasyncns. If not, see\n# <http://www.gnu.org/licenses/>.\n\nnoinst_LTLIBRARIES = libipset.la\n\nbdd_src = bdd/assignments.c bdd/basics.c bdd/bdd-iterator.c bdd/expanded.c \\\n\t\t  bdd/reachable.c bdd/read.c bdd/write.c \nmap_src = map/allocation.c map/inspection.c map/ipv4_map.c map/ipv6_map.c \\\n\t\t  map/storage.c\nset_src = set/allocation.c set/inspection.c set/ipv4_set.c set/ipv6_set.c \\\n\t\t  set/iterator.c set/storage.c\n\nlibipset_la_SOURCES = ${bdd_src} ${map_src} ${set_src}\n\nlibipset_la_LDFLAGS = -static\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/bdd/Makefile.in",
    "content": ""
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/bdd/assignments.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2010-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <libcork/core.h>\n\n#include \"ipset/bdd/nodes.h\"\n\n\nstruct ipset_assignment *\nipset_assignment_new()\n{\n    struct ipset_assignment  *assignment = cork_new(struct ipset_assignment);\n    cork_array_init(&assignment->values);\n    return assignment;\n}\n\n\nvoid\nipset_assignment_free(struct ipset_assignment *assignment)\n{\n    cork_array_done(&assignment->values);\n    free(assignment);\n}\n\n\nbool\nipset_assignment_equal(const struct ipset_assignment *assignment1,\n                       const struct ipset_assignment *assignment2)\n{\n    /* Identical pointers are trivially equal. */\n    if (assignment1 == assignment2) {\n        return true;\n    }\n\n    /* Otherwise we compare the assignments piecewise up through the end\n     * of the smaller vector. */\n    unsigned int  size1 = cork_array_size(&assignment1->values);\n    unsigned int  size2 = cork_array_size(&assignment2->values);\n    unsigned int  smaller_size = (size1 < size2)? size1: size2;\n\n    unsigned int  i;\n    for (i = 0; i < smaller_size; i++) {\n        if (cork_array_at(&assignment1->values, i) !=\n            cork_array_at(&assignment2->values, i)) {\n            return false;\n        }\n    }\n\n    /* If one of the assignment vectors is longer, any remaining\n     * elements must be indeterminate. */\n    if (size1 > smaller_size) {\n        for (i = smaller_size; i < size1; i++) {\n            if (cork_array_at(&assignment1->values, i) != IPSET_EITHER) {\n                return false;\n            }\n        }\n    }\n\n    if (size2 > smaller_size) {\n        for (i = smaller_size; i < size2; i++) {\n            if (cork_array_at(&assignment2->values, i) != IPSET_EITHER) {\n                return false;\n            }\n        }\n    }\n\n    /* If we make it through all of that, the two assignments are equal. */\n    return true;\n}\n\n\nvoid\nipset_assignment_cut(struct ipset_assignment *assignment,\n                     ipset_variable var)\n{\n    if (var < cork_array_size(&assignment->values)) {\n        assignment->values.size = var;\n    }\n}\n\n\nvoid\nipset_assignment_clear(struct ipset_assignment *assignment)\n{\n    ipset_assignment_cut(assignment, 0);\n}\n\n\nenum ipset_tribool\nipset_assignment_get(struct ipset_assignment *assignment, ipset_variable var)\n{\n    if (var < cork_array_size(&assignment->values)) {\n        /* If the requested variable is in the range of the values\n         * array, return whatever is stored there. */\n        return cork_array_at(&assignment->values, var);\n    } else {\n        /* Variables htat aren't in the values array are always EITHER. */\n        return IPSET_EITHER;\n    }\n}\n\n\nvoid\nipset_assignment_set(struct ipset_assignment *assignment,\n                     ipset_variable var, enum ipset_tribool value)\n{\n    /* Ensure that the vector is big enough to hold this variable\n     * assignment, inserting new EITHERs if needed. */\n    if (var >= cork_array_size(&assignment->values)) {\n        unsigned int  old_len = cork_array_size(&assignment->values);\n\n        /* Expand the array. */\n        cork_array_ensure_size(&assignment->values, var+1);\n        assignment->values.size = var+1;\n\n        /* Fill in EITHERs in the newly allocated elements. */\n        if (var != old_len) {\n            unsigned int  i;\n            for (i = old_len; i < var; i++) {\n                cork_array_at(&assignment->values, i) = IPSET_EITHER;\n            }\n        }\n    }\n\n    /* Assign the desired value. */\n    cork_array_at(&assignment->values, var) = value;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/bdd/basics.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2010-2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <stdio.h>\n#include <string.h>\n\n#include <libcork/core.h>\n\n#include \"ipset/bdd/nodes.h\"\n#include \"ipset/bits.h\"\n#include \"ipset/logging.h\"\n\n\nvoid\nipset_node_fprint(FILE *stream, struct ipset_node *node)\n{\n    fprintf(stream,\n            \"nonterminal(x%u? \" IPSET_NODE_ID_FORMAT\n            \": \" IPSET_NODE_ID_FORMAT \")\",\n            node->variable,\n            IPSET_NODE_ID_VALUES(node->high),\n            IPSET_NODE_ID_VALUES(node->low));\n}\n\n\nstatic cork_hash\nipset_node_hash(void *user_data, const void *key)\n{\n    const struct ipset_node  *node = key;\n    /* Hash of \"ipset_node\" */\n    cork_hash  hash = 0xf3b7dc44;\n    hash = cork_hash_variable(hash, node->variable);\n    hash = cork_hash_variable(hash, node->low);\n    hash = cork_hash_variable(hash, node->high);\n    return hash;\n}\n\nstatic bool\nipset_node_equals(void *user_data, const void *key1, const void *key2)\n{\n    const struct ipset_node  *node1 = key1;\n    const struct ipset_node  *node2 = key2;\n\n    if (node1 == node2) {\n        return true;\n    }\n\n    return\n        (node1->variable == node2->variable) &&\n        (node1->low == node2->low) &&\n        (node1->high == node2->high);\n}\n\n\n/* The free list in an ipset_node_cache is represented by a\n * singly-linked list of indices into the chunk array.  Since the\n * ipset_node instance is unused for nodes in the free list, we reuse\n * the refcount field to store the \"next\" index. */\n\n#define IPSET_NULL_INDEX ((ipset_variable) -1)\n\nstruct ipset_node_cache *\nipset_node_cache_new()\n{\n    struct ipset_node_cache  *cache = cork_new(struct ipset_node_cache);\n    cork_array_init(&cache->chunks);\n    cache->largest_index = 0;\n    cache->free_list = IPSET_NULL_INDEX;\n    cache->node_cache = cork_hash_table_new(0, 0);\n    cork_hash_table_set_hash\n        (cache->node_cache, (cork_hash_f) ipset_node_hash);\n    cork_hash_table_set_equals\n        (cache->node_cache, (cork_equals_f) ipset_node_equals);\n    return cache;\n}\n\nvoid\nipset_node_cache_free(struct ipset_node_cache *cache)\n{\n    size_t  i;\n    for (i = 0; i < cork_array_size(&cache->chunks); i++) {\n        free(cork_array_at(&cache->chunks, i));\n    }\n    cork_array_done(&cache->chunks);\n    cork_hash_table_free(cache->node_cache);\n    free(cache);\n}\n\n\n/**\n * Returns the index of a new ipset_node instance.\n */\nstatic ipset_value\nipset_node_cache_alloc_node(struct ipset_node_cache *cache)\n{\n    if (cache->free_list == IPSET_NULL_INDEX) {\n        /* Nothing in the free list; need to allocate a new node. */\n        ipset_value  next_index = cache->largest_index++;\n        ipset_value  chunk_index = next_index >> IPSET_BDD_NODE_CACHE_BIT_SIZE;\n        if (chunk_index >= cork_array_size(&cache->chunks)) {\n            /* We've filled up all of the existing chunks, and need to\n             * create a new one. */\n            DEBUG(\"        (allocating chunk %zu)\",\n                  cork_array_size(&cache->chunks));\n            struct ipset_node  *new_chunk = cork_calloc\n                (IPSET_BDD_NODE_CACHE_SIZE, sizeof(struct ipset_node));\n            cork_array_append(&cache->chunks, new_chunk);\n        }\n        return next_index;\n    } else {\n        /* Reuse a recently freed node. */\n        ipset_value  next_index = cache->free_list;\n        struct ipset_node  *node =\n            ipset_node_cache_get_nonterminal_by_index(cache, next_index);\n        cache->free_list = node->refcount;\n        return next_index;\n    }\n}\n\nipset_node_id\nipset_node_incref(struct ipset_node_cache *cache, ipset_node_id node_id)\n{\n    if (ipset_node_get_type(node_id) == IPSET_NONTERMINAL_NODE) {\n        struct ipset_node  *node =\n            ipset_node_cache_get_nonterminal(cache, node_id);\n        DEBUG(\"        [incref \" IPSET_NODE_ID_FORMAT \"]\",\n              IPSET_NODE_ID_VALUES(node_id));\n        node->refcount++;\n    }\n    return node_id;\n}\n\nvoid\nipset_node_decref(struct ipset_node_cache *cache, ipset_node_id node_id)\n{\n    if (ipset_node_get_type(node_id) == IPSET_NONTERMINAL_NODE) {\n        struct ipset_node  *node =\n            ipset_node_cache_get_nonterminal(cache, node_id);\n        DEBUG(\"        [decref \" IPSET_NODE_ID_FORMAT \"]\",\n              IPSET_NODE_ID_VALUES(node_id));\n        if (--node->refcount == 0) {\n            DEBUG(\"        [free   \" IPSET_NODE_ID_FORMAT \"]\",\n                  IPSET_NODE_ID_VALUES(node_id));\n            ipset_node_decref(cache, node->low);\n            ipset_node_decref(cache, node->high);\n            cork_hash_table_delete(cache->node_cache, node, NULL, NULL);\n\n            /* Add the node to the free list */\n            node->refcount = cache->free_list;\n            cache->free_list = ipset_nonterminal_value(node_id);\n        }\n    }\n}\n\nbool\nipset_node_cache_nodes_equal(const struct ipset_node_cache *cache1,\n                             ipset_node_id node_id1,\n                             const struct ipset_node_cache *cache2,\n                             ipset_node_id node_id2)\n{\n    struct ipset_node  *node1;\n    struct ipset_node  *node2;\n\n    if (ipset_node_get_type(node_id1) != ipset_node_get_type(node_id2)) {\n        return false;\n    }\n\n    if (ipset_node_get_type(node_id1) == IPSET_TERMINAL_NODE) {\n        return node_id1 == node_id2;\n    }\n\n    node1 = ipset_node_cache_get_nonterminal(cache1, node_id1);\n    node2 = ipset_node_cache_get_nonterminal(cache2, node_id2);\n    return\n        (node1->variable == node2->variable) &&\n        ipset_node_cache_nodes_equal(cache1, node1->low, cache2, node2->low) &&\n        ipset_node_cache_nodes_equal(cache1, node1->high, cache2, node2->high);\n}\n\nipset_node_id\nipset_node_cache_nonterminal(struct ipset_node_cache *cache,\n                             ipset_variable variable,\n                             ipset_node_id low, ipset_node_id high)\n{\n    /* Don't allow any nonterminals whose low and high subtrees are the\n     * same, since the nonterminal would be redundant. */\n    if (CORK_UNLIKELY(low == high)) {\n        DEBUG(\"        [ SKIP  nonterminal(x%u? \"\n              IPSET_NODE_ID_FORMAT \": \" IPSET_NODE_ID_FORMAT \")]\",\n              variable, IPSET_NODE_ID_VALUES(high), IPSET_NODE_ID_VALUES(low));\n        ipset_node_decref(cache, high);\n        return low;\n    }\n\n    /* Check to see if there's already a nonterminal with these contents\n     * in the cache. */\n    DEBUG(\"        [search nonterminal(x%u? \"\n          IPSET_NODE_ID_FORMAT \": \" IPSET_NODE_ID_FORMAT \")]\",\n          variable, IPSET_NODE_ID_VALUES(high), IPSET_NODE_ID_VALUES(low));\n\n    struct ipset_node  search_node;\n    search_node.variable = variable;\n    search_node.low = low;\n    search_node.high = high;\n\n    bool  is_new;\n    struct cork_hash_table_entry  *entry =\n        cork_hash_table_get_or_create\n        (cache->node_cache, &search_node, &is_new);\n\n    if (!is_new) {\n        /* There's already a node with these contents, so return its ID. */\n        ipset_node_id  node_id = (uintptr_t) entry->value;\n        DEBUG(\"        [reuse  \" IPSET_NODE_ID_FORMAT \"]\",\n              IPSET_NODE_ID_VALUES(node_id));\n        ipset_node_incref(cache, node_id);\n        ipset_node_decref(cache, low);\n        ipset_node_decref(cache, high);\n        return node_id;\n    } else {\n        /* This node doesn't exist yet.  Allocate a permanent copy of\n         * the node, add it to the cache, and then return its ID. */\n        ipset_value  new_index = ipset_node_cache_alloc_node(cache);\n        ipset_node_id  new_node_id = ipset_nonterminal_node_id(new_index);\n        struct ipset_node  *real_node =\n            ipset_node_cache_get_nonterminal_by_index(cache, new_index);\n        real_node->refcount = 1;\n        real_node->variable = variable;\n        real_node->low = low;\n        real_node->high = high;\n        entry->key = real_node;\n        entry->value = (void *) (uintptr_t) new_node_id;\n        DEBUG(\"        [new    \" IPSET_NODE_ID_FORMAT \"]\",\n              IPSET_NODE_ID_VALUES(new_node_id));\n        return new_node_id;\n    }\n}\n\n\nbool\nipset_bool_array_assignment(const void *user_data, ipset_variable variable)\n{\n    const bool  *bool_array = (const bool *) user_data;\n    return bool_array[variable];\n}\n\n\nbool\nipset_bit_array_assignment(const void *user_data, ipset_variable variable)\n{\n    return IPSET_BIT_GET(user_data, variable);\n}\n\n\nipset_value\nipset_node_evaluate(const struct ipset_node_cache *cache, ipset_node_id node_id,\n                    ipset_assignment_func assignment, const void *user_data)\n{\n    ipset_node_id  curr_node_id = node_id;\n    DEBUG(\"Evaluating BDD node \" IPSET_NODE_ID_FORMAT,\n          IPSET_NODE_ID_VALUES(node_id));\n\n    /* As long as the current node is a nonterminal, we have to check\n     * the value of the current variable. */\n    while (ipset_node_get_type(curr_node_id) == IPSET_NONTERMINAL_NODE) {\n        /* We have to look up this variable in the assignment. */\n        struct ipset_node  *node =\n            ipset_node_cache_get_nonterminal(cache, curr_node_id);\n        bool  this_value = assignment(user_data, node->variable);\n        DEBUG(\"[%3u] Nonterminal \" IPSET_NODE_ID_FORMAT,\n              node->variable, IPSET_NODE_ID_VALUES(curr_node_id));\n        DEBUG(\"[%3u]   x%u = %s\",\n              node->variable, node->variable, this_value? \"TRUE\": \"FALSE\");\n\n        if (this_value) {\n            /* This node's variable is true in the assignment vector, so\n             * trace down the high subtree. */\n            curr_node_id = node->high;\n        } else {\n            /* This node's variable is false in the assignment vector,\n             * so trace down the low subtree. */\n            curr_node_id = node->low;\n        }\n    }\n\n    /* Once we find a terminal node, we've got the final result. */\n    DEBUG(\"Evaluated result is %u\", ipset_terminal_value(curr_node_id));\n    return ipset_terminal_value(curr_node_id);\n}\n\n\n/* A “fake” BDD node given by an assignment. */\nstruct ipset_fake_node {\n    ipset_variable  current_var;\n    ipset_variable  var_count;\n    ipset_assignment_func  assignment;\n    const void  *user_data;\n    ipset_value  value;\n};\n\n/* A fake BDD node representing the terminal 0 value. */\nstatic struct ipset_fake_node  fake_terminal_0 = { 0, 0, NULL, 0, 0 };\n\n/* We set elements in a map using the if-then-else (ITE) operator:\n *\n *   new_set = new_element? new_value: old_set\n *\n * The below is a straight copy of the standard trinary APPLY from the BDD\n * literature, but without the caching of the results.  And also with the\n * wrinkle that the F argument to ITE (i.e., new_element) is given by an\n * assignment, and not by a BDD node.  (This lets us skip constructing the BDD\n * for the assignment, saving us a few cycles.)\n */\n\nstatic ipset_node_id\nipset_apply_ite(struct ipset_node_cache *cache, struct ipset_fake_node *f,\n                ipset_value g, ipset_node_id h)\n{\n    ipset_node_id  h_low;\n    ipset_node_id  h_high;\n    ipset_node_id  result_low;\n    ipset_node_id  result_high;\n\n    /* If F is a terminal, then we're in one of the following two\n     * cases:\n     *\n     *   1? G: H == G\n     *   0? G: H == H\n     */\n    if (f->current_var == f->var_count) {\n        ipset_node_id  result;\n        DEBUG(\"[%3u] F is terminal (value %u)\", f->current_var, f->value);\n\n        if (f->value == 0) {\n            DEBUG(\"[%3u] 0? \" IPSET_NODE_ID_FORMAT \": \" IPSET_NODE_ID_FORMAT\n                  \" = \" IPSET_NODE_ID_FORMAT,\n                  f->current_var,\n                  IPSET_NODE_ID_VALUES(ipset_terminal_node_id(g)),\n                  IPSET_NODE_ID_VALUES(h), IPSET_NODE_ID_VALUES(h));\n            result = ipset_node_incref(cache, h);\n        } else {\n            result = ipset_terminal_node_id(g);\n            DEBUG(\"[%3u] 1? \" IPSET_NODE_ID_FORMAT \": \" IPSET_NODE_ID_FORMAT\n                  \" = \" IPSET_NODE_ID_FORMAT,\n                  f->current_var, IPSET_NODE_ID_VALUES(result),\n                  IPSET_NODE_ID_VALUES(h), IPSET_NODE_ID_VALUES(result));\n        }\n\n        return result;\n    }\n\n    /* F? G: G == G */\n    if (h == ipset_terminal_node_id(g)) {\n        DEBUG(\"[%3u] F? \" IPSET_NODE_ID_FORMAT \": \" IPSET_NODE_ID_FORMAT\n              \" = \" IPSET_NODE_ID_FORMAT,\n              f->current_var, IPSET_NODE_ID_VALUES(h),\n              IPSET_NODE_ID_VALUES(h), IPSET_NODE_ID_VALUES(h));\n        return h;\n    }\n\n    /* From here to the end of the function, we know that F is a\n     * nonterminal. */\n    DEBUG(\"[%3u] F is nonterminal\", f->current_var);\n\n    /* We're going to do two recursive calls, a “low” one and a “high” one.  For\n     * each nonterminal that has the minimum variable number, we use its low and\n     * high pointers in the respective recursive call.  For all other\n     * nonterminals, and for all terminals, we use the operand itself. */\n\n    if (ipset_node_get_type(h) == IPSET_NONTERMINAL_NODE) {\n        struct ipset_node  *h_node =\n            ipset_node_cache_get_nonterminal(cache, h);\n\n        DEBUG(\"[%3u] H is nonterminal (variable %u)\",\n              f->current_var, h_node->variable);\n\n        if (h_node->variable < f->current_var) {\n            /* var(F) > var(H), so we only recurse down the H branches. */\n            DEBUG(\"[%3u] Recursing only down H\", f->current_var);\n            DEBUG(\"[%3u]   Recursing high\", f->current_var);\n            result_high = ipset_apply_ite(cache, f, g, h_node->high);\n            DEBUG(\"[%3u]   Back from high recursion\", f->current_var);\n            DEBUG(\"[%3u]   Recursing low\", f->current_var);\n            result_low = ipset_apply_ite(cache, f, g, h_node->low);\n            DEBUG(\"[%3u]   Back from low recursion\", f->current_var);\n            return ipset_node_cache_nonterminal\n                (cache, h_node->variable, result_low, result_high);\n        } else if (h_node->variable == f->current_var) {\n            /* var(F) == var(H), so we recurse down both branches. */\n            DEBUG(\"[%3u] Recursing down both F and H\", f->current_var);\n            h_low = h_node->low;\n            h_high = h_node->high;\n        } else {\n            /* var(F) < var(H), so we only recurse down the F branches. */\n            DEBUG(\"[%3u] Recursing only down F\", f->current_var);\n            h_low = h;\n            h_high = h;\n        }\n    } else {\n        /* H in nonterminal, so we only recurse down the F branches. */\n        DEBUG(\"[%3u] H is terminal (value %u)\",\n              f->current_var, ipset_terminal_value(h));\n        DEBUG(\"[%3u] Recursing only down F\", f->current_var);\n        h_low = h;\n        h_high = h;\n    }\n\n    /* F is a “fake” nonterminal node, since it comes from our assignment.  One\n     * of its branches will be the 0 terminal, and the other will be the fake\n     * nonterminal for the next variable in the assignment.  (Which one is low\n     * and which one is high depends on the value of the current variable in the\n     * assignment.) */\n\n    if (f->assignment(f->user_data, f->current_var)) {\n        /* The current variable is set in F.  The low branch is terminal 0; the\n         * high branch is the next variable in F. */\n        DEBUG(\"[%3u]   x[%u] is set\", f->current_var, f->current_var);\n        DEBUG(\"[%3u]   Recursing high\", f->current_var);\n        f->current_var++;\n        result_high = ipset_apply_ite(cache, f, g, h_high);\n        f->current_var--;\n        DEBUG(\"[%3u]   Back from high recursion: \" IPSET_NODE_ID_FORMAT,\n              f->current_var, IPSET_NODE_ID_VALUES(result_high));\n        DEBUG(\"[%3u]   Recursing low\", f->current_var);\n        fake_terminal_0.current_var = f->var_count;\n        fake_terminal_0.var_count = f->var_count;\n        result_low = ipset_apply_ite(cache, &fake_terminal_0, g, h_low);\n        DEBUG(\"[%3u]   Back from low recursion: \" IPSET_NODE_ID_FORMAT,\n              f->current_var, IPSET_NODE_ID_VALUES(result_low));\n    } else {\n        /* The current variable is NOT set in F.  The high branch is terminal 0;\n         * the low branch is the next variable in F. */\n        DEBUG(\"[%3u]   x[%u] is NOT set\", f->current_var, f->current_var);\n        DEBUG(\"[%3u]   Recursing high\", f->current_var);\n        fake_terminal_0.current_var = f->var_count;\n        fake_terminal_0.var_count = f->var_count;\n        result_high = ipset_apply_ite(cache, &fake_terminal_0, g, h_high);\n        DEBUG(\"[%3u]   Back from high recursion: \" IPSET_NODE_ID_FORMAT,\n              f->current_var, IPSET_NODE_ID_VALUES(result_high));\n        DEBUG(\"[%3u]   Recursing low\", f->current_var);\n        f->current_var++;\n        result_low = ipset_apply_ite(cache, f, g, h_low);\n        f->current_var--;\n        DEBUG(\"[%3u]   Back from low recursion: \" IPSET_NODE_ID_FORMAT,\n              f->current_var, IPSET_NODE_ID_VALUES(result_low));\n    }\n\n    return ipset_node_cache_nonterminal\n        (cache, f->current_var, result_low, result_high);\n}\n\nipset_node_id\nipset_node_insert(struct ipset_node_cache *cache, ipset_node_id node,\n                  ipset_assignment_func assignment, const void *user_data,\n                  ipset_variable var_count, ipset_value value)\n{\n    struct ipset_fake_node  f = { 0, var_count, assignment, user_data, 1 };\n    DEBUG(\"Inserting new element\");\n    return ipset_apply_ite(cache, &f, value, node);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/bdd/bdd-iterator.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2010-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <libcork/core.h>\n\n#include \"ipset/bdd/nodes.h\"\n#include \"ipset/logging.h\"\n\n\n/**\n * Add the given node ID to the node stack, and trace down from it\n * until we find a terminal node.  Assign values to the variables for\n * each nonterminal that encounter along the way.  We check low edges\n * first, so each new variable we encounter will be assigned FALSE.\n * (The high edges will be checked eventually by a call to the\n * ipset_bdd_iterator_advance() function.)\n */\nstatic void\nadd_node(struct ipset_bdd_iterator *iterator, ipset_node_id node_id)\n{\n    /* Keep tracing down low edges until we reach a terminal. */\n    while (ipset_node_get_type(node_id) == IPSET_NONTERMINAL_NODE) {\n        /* Add this nonterminal node to the stack, and trace down\n         * further into the tree.  We check low edges first, so set the\n         * node's variable to FALSE in the assignment. */\n        struct ipset_node  *node =\n            ipset_node_cache_get_nonterminal(iterator->cache, node_id);\n\n        cork_array_append(&iterator->stack, node_id);\n        ipset_assignment_set(iterator->assignment, node->variable, false);\n\n        node_id = node->low;\n    }\n\n    /* Once we find a terminal node, save it away in the iterator result\n     * and return. */\n    iterator->value = ipset_terminal_value(node_id);\n}\n\n\nstruct ipset_bdd_iterator *\nipset_node_iterate(struct ipset_node_cache *cache, ipset_node_id root)\n{\n    /* First allocate the iterator itself, and all of its contained\n     * fields. */\n\n    struct ipset_bdd_iterator  *iterator =\n        cork_new(struct ipset_bdd_iterator);\n    iterator->finished = false;\n    iterator->cache = cache;\n    cork_array_init(&iterator->stack);\n    iterator->assignment = ipset_assignment_new();\n\n    /* Then add the root node to the iterator, tracing down until we\n     * find the first terminal node. */\n    add_node(iterator, root);\n    return iterator;\n}\n\n\nvoid\nipset_bdd_iterator_free(struct ipset_bdd_iterator *iterator)\n{\n    cork_array_done(&iterator->stack);\n    ipset_assignment_free(iterator->assignment);\n    free(iterator);\n}\n\n\nvoid\nipset_bdd_iterator_advance(struct ipset_bdd_iterator *iterator)\n{\n    /* If we're already at the end of the iterator, don't do anything. */\n    if (CORK_UNLIKELY(iterator->finished)) {\n        return;\n    }\n\n    /* We look at the last node in the stack.  If it's currently\n     * assigned a false value, then we track down its true branch.  If\n     * it's got a true branch, then we pop it off and check the next to\n     * last node. */\n\n    DEBUG(\"Advancing BDD iterator\");\n\n    while (cork_array_size(&iterator->stack) > 0) {\n        ipset_node_id  last_node_id =\n            cork_array_at\n            (&iterator->stack, cork_array_size(&iterator->stack) - 1);\n\n        struct ipset_node  *last_node =\n            ipset_node_cache_get_nonterminal(iterator->cache, last_node_id);\n\n        enum ipset_tribool  current_value =\n            ipset_assignment_get(iterator->assignment, last_node->variable);\n\n        /* The current value can't be EITHER, because we definitely\n         * assign a TRUE or FALSE to the variables of the nodes that we\n         * encounter. */\n        if (current_value == IPSET_TRUE) {\n            /* We've checked both outgoing edges for this node, so pop\n             * it off and look at its parent. */\n            iterator->stack.size--;\n\n            /* Before continuing, reset this node's variable to\n             * indeterminate in the assignment. */\n            ipset_assignment_set\n                (iterator->assignment, last_node->variable, IPSET_EITHER);\n        } else {\n            /* We've checked this node's low edge, but not its high\n             * edge.  Set the variable to TRUE in the assignment, and\n             * add the high edge's node to the node stack. */\n            ipset_assignment_set\n                (iterator->assignment, last_node->variable, IPSET_TRUE);\n            add_node(iterator, last_node->high);\n            return;\n        }\n    }\n\n    /* If we fall through then we ran out of nodes to check.  That means\n     * the iterator is done! */\n    iterator->finished = true;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/bdd/expanded.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2010-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <string.h>\n\n#include <libcork/core.h>\n\n#include \"ipset/bdd/nodes.h\"\n#include \"ipset/bits.h\"\n#include \"ipset/logging.h\"\n\n\nstatic void\ninitialize(struct ipset_expanded_assignment *exp,\n           const struct ipset_assignment *assignment,\n           ipset_variable var_count)\n{\n    /* First loop through all of the variables in the assignment vector,\n     * making sure not to go further than the caller requested. */\n\n    ipset_variable  last_assignment = cork_array_size(&assignment->values);\n    if (var_count < last_assignment) {\n        last_assignment = var_count;\n    }\n\n    ipset_variable  var;\n    for (var = 0; var < last_assignment; var++) {\n        enum ipset_tribool  curr_value =\n            cork_array_at(&assignment->values, var);\n\n        if (curr_value == IPSET_EITHER) {\n            /* If this variable is EITHER, start it off as FALSE, and\n             * add it to the eithers list. */\n            DEBUG(\"Variable %u is EITHER\", var);\n\n            IPSET_BIT_SET(exp->values.buf, var, false);\n            cork_array_append(&exp->eithers, var);\n        } else {\n            /* Otherwise set the variable to the same value in the\n             * expanded assignment as it is in the non-expanded one. */\n\n            DEBUG(\"Variable %u is %s\", var, curr_value? \"true\": \"false\");\n            IPSET_BIT_SET(exp->values.buf, var, curr_value);\n        }\n    }\n\n    /* If the caller requested more variables than there are in the\n     * assignment vector, add them to the eithers list. */\n    for (var = last_assignment; var < var_count; var++) {\n        DEBUG(\"Variable %u is implicitly EITHER\", var);\n        cork_array_append(&exp->eithers, var);\n    }\n}\n\n\nstruct ipset_expanded_assignment *\nipset_assignment_expand(const struct ipset_assignment *assignment,\n                        ipset_variable var_count)\n{\n    /* First allocate the iterator itself, and all of its contained\n     * fields. */\n\n    struct ipset_expanded_assignment  *exp;\n    unsigned int  values_size = (var_count / 8) + ((var_count % 8) != 0);\n\n    exp = cork_new(struct ipset_expanded_assignment);\n    exp->finished = false;\n    cork_buffer_init(&exp->values);\n    cork_buffer_ensure_size(&exp->values, values_size);\n    memset(exp->values.buf, 0, values_size);\n    cork_array_init(&exp->eithers);\n\n    /* Then initialize the values and eithers fields. */\n    initialize(exp, assignment, var_count);\n    return exp;\n}\n\n\nvoid\nipset_expanded_assignment_free(struct ipset_expanded_assignment *exp)\n{\n    if (exp == NULL) {\n        return;\n    }\n\n    cork_buffer_done(&exp->values);\n    cork_array_done(&exp->eithers);\n    free(exp);\n}\n\n\nvoid\nipset_expanded_assignment_advance(struct ipset_expanded_assignment *exp)\n{\n    /* If we're already at the end of the iterator, don't do anything. */\n    if (CORK_UNLIKELY(exp->finished)) {\n        return;\n    }\n\n    DEBUG(\"Advancing iterator\");\n\n    /* Look at the last EITHER bit in the assignment.  If it's 0, then\n     * set it to 1 and return.  Otherwise we set it to 0 and carry up to\n     * the previous indeterminate bit. */\n\n    size_t  i;\n    for (i = cork_array_size(&exp->eithers); i > 0; i--) {\n        size_t  idx = i - 1;\n        ipset_variable  either_var = cork_array_at(&exp->eithers, idx);\n        DEBUG(\"Checking EITHER variable %u\", either_var);\n\n        if (IPSET_BIT_GET(exp->values.buf, either_var)) {\n            /* This variable is currently true, so set it back to false\n             * and carry. */\n            DEBUG(\"  Variable %u is true, changing to false and carrying\",\n                  either_var);\n            IPSET_BIT_SET(exp->values.buf, either_var, false);\n        } else {\n            /* This variable is currently false, so set it to true and\n             * return. */\n            DEBUG(\"  Variable %u is false, changing to true\",\n                  either_var);\n            IPSET_BIT_SET(exp->values.buf, either_var, true);\n            return;\n        }\n    }\n\n    /* If we fall through then we've made it through all of the expanded\n     * assignments. */\n    exp->finished = true;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/bdd/reachable.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2010-2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <libcork/core.h>\n#include <libcork/ds.h>\n\n#include \"ipset/bdd/nodes.h\"\n#include \"ipset/logging.h\"\n\n\nsize_t\nipset_node_reachable_count(const struct ipset_node_cache *cache,\n                           ipset_node_id node)\n{\n    /* Create a set to track when we've visited a given node. */\n    struct cork_hash_table  *visited = cork_pointer_hash_table_new(0, 0);\n\n    /* And a queue of nodes to check. */\n    cork_array(ipset_node_id)  queue;\n    cork_array_init(&queue);\n\n    if (ipset_node_get_type(node) == IPSET_NONTERMINAL_NODE) {\n        DEBUG(\"Adding node %u to queue\", node);\n        cork_array_append(&queue, node);\n    }\n\n    /* And somewhere to store the result. */\n    size_t  node_count = 0;\n\n    /* Check each node in turn. */\n    while (!cork_array_is_empty(&queue)) {\n        ipset_node_id  curr = cork_array_at(&queue, --queue.size);\n\n        /* We don't have to do anything if this node is already in the\n         * visited set. */\n        if (cork_hash_table_get(visited, (void *) (uintptr_t) curr) == NULL) {\n            DEBUG(\"Visiting node %u for the first time\", curr);\n\n            /* Add the node to the visited set. */\n            cork_hash_table_put\n                (visited, (void *) (uintptr_t) curr,\n                 (void *) (uintptr_t) true, NULL, NULL, NULL);\n\n            /* Increase the node count. */\n            node_count++;\n\n            /* And add the node's nonterminal children to the visit\n             * queue. */\n            struct ipset_node  *node =\n                ipset_node_cache_get_nonterminal(cache, curr);\n\n            if (ipset_node_get_type(node->low) == IPSET_NONTERMINAL_NODE) {\n                DEBUG(\"Adding node %u to queue\", node->low);\n                cork_array_append(&queue, node->low);\n            }\n\n            if (ipset_node_get_type(node->high) == IPSET_NONTERMINAL_NODE) {\n                DEBUG(\"Adding node %u to queue\", node->high);\n                cork_array_append(&queue, node->high);\n            }\n        }\n    }\n\n    /* Return the result, freeing everything before we go. */\n    cork_hash_table_free(visited);\n    cork_array_done(&queue);\n    return node_count;\n}\n\n\nsize_t\nipset_node_memory_size(const struct ipset_node_cache *cache,\n                       ipset_node_id node)\n{\n    return ipset_node_reachable_count(cache, node) * sizeof(struct ipset_node);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/bdd/read.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2010-2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <errno.h>\n#include <stdio.h>\n#include <string.h>\n\n#include <libcork/core.h>\n#include <libcork/ds.h>\n#include <libcork/helpers/errors.h>\n\n#include \"ipset/bdd/nodes.h\"\n#include \"ipset/errors.h\"\n#include \"ipset/logging.h\"\n\n\nstatic const char  MAGIC_NUMBER[] = \"IP set\";\nstatic const size_t  MAGIC_NUMBER_LENGTH = sizeof(MAGIC_NUMBER) - 1;\n\n\n/**\n * On disk, we use a different node ID scheme than we do in memory.\n * Terminal node IDs are non-negative, and are equal to the terminal\n * value.  Nonterminal node IDs are negative, starting with -1.\n * Nonterminal -1 appears first on disk, then nonterminal -2, and so on.\n */\n\ntypedef int  serialized_id;\n\n\n/**\n * Sets a libcork error based on the contents of errno.\n */\nstatic void\ncreate_errno_error(FILE *stream)\n{\n    if (ferror(stream)) {\n        cork_error_set(IPSET_ERROR, IPSET_IO_ERROR, \"%s\", strerror(errno));\n    } else {\n        cork_unknown_error();\n    }\n}\n\n\n/**\n * Read in a big-endian uint8 from a stream.  If we can't read the\n * integer for some reason, return an error.\n */\nstatic int\nread_uint8(FILE *stream, uint8_t *dest)\n{\n    size_t  num_read = fread(dest, sizeof(uint8_t), 1, stream);\n    if (num_read != 1) {\n        create_errno_error(stream);\n        return -1;\n    }\n\n    /* for a byte, we don't need to endian-swap */\n    return 0;\n}\n\n\n/**\n * Read in a big-endian uint16 from a stream.  If we can't read the\n * integer for some reason, return an error.\n */\nstatic uint16_t\nread_uint16(FILE *stream, uint16_t *dest)\n{\n    size_t  num_read = fread(dest, sizeof(uint16_t), 1, stream);\n    if (num_read != 1) {\n        create_errno_error(stream);\n        return -1;\n    }\n\n    CORK_UINT16_BIG_TO_HOST_IN_PLACE(*dest);\n    return 0;\n}\n\n\n/**\n * Read in a big-endian uint32 from a stream.  If we can't read the\n * integer for some reason, return an error.\n */\nstatic uint32_t\nread_uint32(FILE *stream, uint32_t *dest)\n{\n    size_t  num_read = fread(dest, sizeof(uint32_t), 1, stream);\n    if (num_read != 1) {\n        create_errno_error(stream);\n        return -1;\n    }\n\n    CORK_UINT32_BIG_TO_HOST_IN_PLACE(*dest);\n    return 0;\n}\n\n\n/**\n * Read in a big-endian uint64 from a stream.  If we can't read the\n * integer for some reason, return an error.\n */\nstatic uint64_t\nread_uint64(FILE *stream, uint64_t *dest)\n{\n    size_t  num_read = fread(dest, sizeof(uint64_t), 1, stream);\n    if (num_read != 1) {\n        create_errno_error(stream);\n        return -1;\n    }\n\n    CORK_UINT64_BIG_TO_HOST_IN_PLACE(*dest);\n    return 0;\n}\n\n\n/**\n * A helper function that verifies that we've read exactly as many bytes\n * as we should, returning an error otherwise.\n */\nstatic int\nverify_cap(size_t bytes_read, size_t cap)\n{\n    if (bytes_read < cap) {\n        /* There's extra data at the end of the stream. */\n        cork_error_set\n            (IPSET_ERROR, IPSET_PARSE_ERROR,\n             \"Malformed set: extra data at end of stream.\");\n        return -1;\n    } else if (bytes_read > cap) {\n        /* We read more data than we were supposed to. */\n        cork_error_set\n            (IPSET_ERROR, IPSET_PARSE_ERROR,\n             \"Malformed set: read too much data.\");\n        return -1;\n    }\n\n    return 0;\n}\n\n/**\n * A helper function for reading a version 1 BDD stream.\n */\nstatic ipset_node_id\nload_v1(FILE *stream, struct ipset_node_cache *cache)\n{\n    DEBUG(\"Stream contains v1 IP set\");\n    ipset_node_id  result;\n    struct cork_hash_table  *cache_ids = cork_pointer_hash_table_new(0, 0);\n\n    /* We've already read in the magic number and version.  Next should\n     * be the length of the encoded set. */\n    uint64_t  length;\n    DEBUG(\"Reading encoded length\");\n    ei_check(read_uint64(stream, &length));\n\n    /* The length includes the magic number, version number, and the\n     * length field itself.  Remove those to get the cap on the\n     * remaining stream. */\n\n    size_t  bytes_read = 0;\n    size_t  cap = length -\n        MAGIC_NUMBER_LENGTH -\n        sizeof(uint16_t) -\n        sizeof(uint64_t);\n\n    DEBUG(\"Length cap is %zu bytes.\", cap);\n\n    /* Read in the number of nonterminals. */\n\n    uint32_t  nonterminal_count;\n    DEBUG(\"Reading number of nonterminals\");\n    ei_check(read_uint32(stream, &nonterminal_count));\n    bytes_read += sizeof(uint32_t);\n\n    /* If there are no nonterminals, then there's only a single terminal\n     * left to read. */\n\n    if (nonterminal_count == 0) {\n        uint32_t  value;\n        DEBUG(\"Reading single terminal value\");\n        ei_check(read_uint32(stream, &value));\n        bytes_read += sizeof(uint32_t);\n\n        /* We should have reached the end of the encoded set. */\n        ei_check(verify_cap(bytes_read, cap));\n\n        /* Create a terminal node for this value and return it. */\n        cork_hash_table_free(cache_ids);\n        return ipset_terminal_node_id(value);\n    }\n\n    /* Otherwise, read in each nonterminal.  We need to keep track of a\n     * mapping between each nonterminal's ID in the stream (which are\n     * number consecutively from -1), and its ID in the node cache\n     * (which could be anything). */\n\n    size_t  i;\n    for (i = 0; i < nonterminal_count; i++) {\n        serialized_id  serialized_id = -(i+1);\n\n        /* Each serialized node consists of a variable index, a low\n         * pointer, and a high pointer. */\n\n        uint8_t  variable;\n        ei_check(read_uint8(stream, &variable));\n        bytes_read += sizeof(uint8_t);\n\n        int32_t  low;\n        ei_check(read_uint32(stream, (uint32_t *) &low));\n        bytes_read += sizeof(int32_t);\n\n        int32_t  high;\n        ei_check(read_uint32(stream, (uint32_t *) &high));\n        bytes_read += sizeof(int32_t);\n\n        DEBUG(\"Read serialized node %d = (x%d? %\" PRId32 \": %\" PRId32 \")\",\n              serialized_id, variable, high, low);\n\n        /* Turn the low pointer into a node ID.  If the pointer is >= 0,\n         * it's a terminal value.  Otherwise, its a nonterminal ID,\n         * indexing into the serialized nonterminal array.*/\n\n        ipset_node_id  low_id;\n\n        if (low >= 0) {\n            low_id = ipset_terminal_node_id(low);\n        } else {\n            /* The file format guarantees that any node reference points\n             * to a node earlier in the serialized array.  That means we\n             * can assume that cache_ids has already been filled in for\n             * this node. */\n\n            low_id = (ipset_node_id) (uintptr_t)\n                cork_hash_table_get(cache_ids, (void *) (intptr_t) low);\n\n            DEBUG(\"  Serialized ID %\" PRId32 \" is internal ID %u\",\n                  low, low_id);\n        }\n\n        /* Do the same for the high pointer. */\n\n        ipset_node_id  high_id;\n\n        if (high >= 0) {\n            high_id = ipset_terminal_node_id(high);\n        } else {\n            /* The file format guarantees that any node reference points\n             * to a node earlier in the serialized array.  That means we\n             * can assume that cache_ids has already been filled in for\n             * this node. */\n\n            high_id = (ipset_node_id) (uintptr_t)\n                cork_hash_table_get(cache_ids, (void *) (intptr_t) high);\n\n            DEBUG(\"  Serialized ID %\" PRId32 \" is internal ID %u\",\n                  high, high_id);\n        }\n\n        /* Create a nonterminal node in the node cache. */\n        result = ipset_node_cache_nonterminal\n            (cache, variable, low_id, high_id);\n\n        DEBUG(\"Internal node %u = nonterminal(x%d? %u: %u)\",\n              result, (int) variable, high_id, low_id);\n\n        /* Remember the internal node ID for this new node, in case any\n         * later serialized nodes point to it. */\n\n        cork_hash_table_put\n            (cache_ids, (void *) (intptr_t) serialized_id,\n             (void *) (uintptr_t) result, NULL, NULL, NULL);\n    }\n\n    /* We should have reached the end of the encoded set. */\n    ei_check(verify_cap(bytes_read, cap));\n\n    /* The last node is the nonterminal for the entire set. */\n    cork_hash_table_free(cache_ids);\n    return result;\n\n  error:\n    /* If there's an error, clean up the objects that we've created\n     * before returning. */\n\n    cork_hash_table_free(cache_ids);\n    return 0;\n}\n\n\nipset_node_id\nipset_node_cache_load(FILE *stream, struct ipset_node_cache *cache)\n{\n    size_t bytes_read;\n\n    /* First, read in the magic number from the stream to ensure that\n     * this is an IP set. */\n\n    uint8_t  magic[MAGIC_NUMBER_LENGTH];\n\n    DEBUG(\"Reading IP set magic number\");\n    bytes_read = fread(magic, 1, MAGIC_NUMBER_LENGTH, stream);\n\n    if (ferror(stream)) {\n        create_errno_error(stream);\n        return 0;\n    }\n\n    if (bytes_read != MAGIC_NUMBER_LENGTH) {\n        /* We reached EOF before reading the entire magic number. */\n        cork_error_set\n            (IPSET_ERROR, IPSET_PARSE_ERROR,\n             \"Unexpected end of file\");\n        return 0;\n    }\n\n    if (memcmp(magic, MAGIC_NUMBER, MAGIC_NUMBER_LENGTH) != 0) {\n        /* The magic number doesn't match, so this isn't a BDD. */\n        cork_error_set\n            (IPSET_ERROR, IPSET_PARSE_ERROR,\n             \"Magic number doesn't match; this isn't an IP set.\");\n        return 0;\n    }\n\n    /* Read in the version number and dispatch to the right reading\n     * function. */\n\n    uint16_t  version;\n    DEBUG(\"Reading IP set version\");\n    xi_check(0, read_uint16(stream, &version));\n\n    switch (version) {\n        case 0x0001:\n            return load_v1(stream, cache);\n\n        default:\n            /* We don't know how to read this version number. */\n            cork_error_set\n                (IPSET_ERROR, IPSET_PARSE_ERROR,\n                 \"Unknown version number %\" PRIu16, version);\n            return 0;\n    }\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/bdd/write.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2010-2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <libcork/core.h>\n#include <libcork/helpers/errors.h>\n\n#include \"ipset/bdd/nodes.h\"\n#include \"ipset/logging.h\"\n\n\n/*-----------------------------------------------------------------------\n * Generic saving logic\n */\n\n/**\n * On disk, we use a different node ID scheme than we do in memory.\n * Terminal node IDs are non-negative, and are equal to the terminal\n * value.  Nonterminal node IDs are negative, starting with -1.\n * Nonterminal -1 appears first on disk, then nonterminal -2, and so\n * on.\n */\n\ntypedef int  serialized_id;\n\n\n/* forward declaration */\nstruct save_data;\n\n\n/**\n * A callback that outputs any necessary header.  Should return an int\n * status code indicating whether the write was successful.\n */\n\ntypedef int\n(*write_header_func)(struct save_data *save_data,\n                     struct ipset_node_cache *cache,\n                     ipset_node_id root);\n\n\n/**\n * A callback that outputs any necessary footer.  Should return an int\n * status code indicating whether the write was successful.\n */\n\ntypedef int\n(*write_footer_func)(struct save_data *save_data,\n                     struct ipset_node_cache *cache,\n                     ipset_node_id root);\n\n\n/**\n * A callback that actually outputs a terminal node to disk.  Should\n * return an int status code indicating whether the write was successful.\n */\n\ntypedef int\n(*write_terminal_func)(struct save_data *save_data,\n                       ipset_value terminal_value);\n\n\n/**\n * A callback that actually outputs a nonterminal node to disk.\n * Should return an int status code indicating whether the write was\n * successful.\n */\n\ntypedef int\n(*write_nonterminal_func)(struct save_data *save_data,\n                          serialized_id serialized_node,\n                          ipset_variable variable,\n                          serialized_id serialized_low,\n                          serialized_id serialized_high);\n\n\n/**\n * A helper struct containing all of the persistent data items needed\n * during the execution of a save.\n */\n\nstruct save_data {\n    /* The node cache that we're saving nodes from. */\n    struct ipset_node_cache  *cache;\n\n    /* The output stream to save the data to. */\n    struct cork_stream_consumer  *stream;\n\n    /* The cache of serialized IDs for any nonterminals that we've\n     * encountered so far. */\n    struct cork_hash_table  *serialized_ids;\n\n    /* The serialized ID to use for the next nonterminal that we\n     * encounter. */\n    serialized_id  next_serialized_id;\n\n    /* The callback used to write the file header to the stream. */\n    write_header_func  write_header;\n\n    /* The callback used to write the file footer to the stream. */\n    write_footer_func  write_footer;\n\n    /* The callback used to write terminals to the stream. */\n    write_terminal_func  write_terminal;\n\n    /* The callback used to write nonterminals to the stream. */\n    write_nonterminal_func  write_nonterminal;\n\n    /* A pointer to any additional data needed by the callbacks. */\n    void  *user_data;\n};\n\n\n/**\n * A helper function for ipset_node_save().  Outputs a nonterminal\n * node in a BDD tree, if we haven't done so already.  Ensures that\n * the children of the nonterminal are output before the nonterminal\n * is.  Returns the serialized ID of this node.\n */\n\nstatic int\nsave_visit_node(struct save_data *save_data,\n                ipset_node_id node_id, serialized_id *dest)\n{\n    /* Check whether we've already serialized this node. */\n\n    struct cork_hash_table_entry  *entry;\n    bool  is_new;\n    entry = cork_hash_table_get_or_create\n        (save_data->serialized_ids, (void *) (uintptr_t) node_id, &is_new);\n\n    if (!is_new) {\n        *dest = (intptr_t) entry->value;\n        return 0;\n    } else {\n        if (ipset_node_get_type(node_id) == IPSET_TERMINAL_NODE) {\n            /* For terminals, there isn't really anything to do — we\n             * just output the terminal node and use its value as the\n             * serialized ID. */\n\n            ipset_value  value = ipset_terminal_value(node_id);\n\n            DEBUG(\"Writing terminal(%d)\", value);\n            rii_check(save_data->write_terminal(save_data, value));\n            entry->value = (void *) (intptr_t) value;\n            *dest = value;\n            return 0;\n        } else {\n            /* For nonterminals, we drill down into the node's children\n             * first, then output the nonterminal node. */\n\n            struct ipset_node  *node =\n                ipset_node_cache_get_nonterminal(save_data->cache, node_id);\n            DEBUG(\"Visiting node %u nonterminal(x%u? %u: %u)\",\n                  node_id, node->variable, node->high, node->low);\n\n            /* Output the node's nonterminal children before we output\n             * the node itself. */\n            serialized_id  serialized_low;\n            serialized_id  serialized_high;\n            rii_check(save_visit_node(save_data, node->low, &serialized_low));\n            rii_check(save_visit_node(save_data, node->high, &serialized_high));\n\n            /* Output the nonterminal */\n            serialized_id  result = save_data->next_serialized_id--;\n            DEBUG(\"Writing node %u as serialized node %d = (x%u? %d: %d)\",\n                  node_id, result,\n                  node->variable, serialized_low, serialized_high);\n\n            entry->value = (void *) (intptr_t) result;\n            *dest = result;\n            return save_data->write_nonterminal\n                (save_data, result, node->variable,\n                 serialized_low, serialized_high);\n        }\n    }\n}\n\n\nstatic int\nsave_bdd(struct save_data *save_data,\n         struct ipset_node_cache *cache, ipset_node_id root)\n{\n    /* First, output the file header. */\n\n    DEBUG(\"Writing file header\");\n    rii_check(save_data->write_header(save_data, cache, root));\n\n    /* The serialized node IDs are different than the in-memory node\n     * IDs.  This means that, for our nonterminal nodes, we need a\n     * mapping from internal node ID to serialized node ID. */\n\n    DEBUG(\"Creating file caches\");\n    save_data->serialized_ids = cork_pointer_hash_table_new(0, 0);\n    save_data->next_serialized_id = -1;\n\n    /* Trace down through the BDD tree, outputting each terminal and\n     * nonterminal node as they're encountered. */\n\n    DEBUG(\"Writing nodes\");\n\n    serialized_id  last_serialized_id;\n    ei_check(save_visit_node(save_data, root, &last_serialized_id));\n\n    /* Finally, output the file footer and cleanup. */\n\n    DEBUG(\"Writing file footer\");\n    ei_check(save_data->write_footer(save_data, cache, root));\n\n    DEBUG(\"Freeing file caches\");\n    cork_hash_table_free(save_data->serialized_ids);\n    return 0;\n\n  error:\n    /* If there's an error, clean up the objects that we've created\n     * before returning. */\n    cork_hash_table_free(save_data->serialized_ids);\n    return -1;\n}\n\n\n/*-----------------------------------------------------------------------\n * Helper functions\n */\n\n/**\n * Write a NUL-terminated string to a stream.  If we can't write the\n * string for some reason, return an error.\n */\nstatic int\nwrite_string(struct cork_stream_consumer *stream, const char *str)\n{\n    size_t  len = strlen(str);\n    return cork_stream_consumer_data(stream, str, len, false);\n}\n\n\n/**\n * Write a big-endian uint8 to a stream.  If we can't write the\n * integer for some reason, return an error.\n */\nstatic int\nwrite_uint8(struct cork_stream_consumer *stream, uint8_t val)\n{\n    /* for a byte, we don't need to endian-swap */\n    return cork_stream_consumer_data(stream, &val, sizeof(uint8_t), false);\n}\n\n\n/**\n * Write a big-endian uint16 to a stream.  If we can't write the\n * integer for some reason, return an error.\n */\nstatic int\nwrite_uint16(struct cork_stream_consumer *stream, uint16_t val)\n{\n    CORK_UINT16_HOST_TO_BIG_IN_PLACE(val);\n    return cork_stream_consumer_data(stream, &val, sizeof(uint16_t), false);\n}\n\n\n/**\n * Write a big-endian uint32 to a stream.  If we can't write the\n * integer for some reason, return an error.\n */\n\nstatic int\nwrite_uint32(struct cork_stream_consumer *stream, uint32_t val)\n{\n    CORK_UINT32_HOST_TO_BIG_IN_PLACE(val);\n    return cork_stream_consumer_data(stream, &val, sizeof(uint32_t), false);\n}\n\n\n/**\n * Write a big-endian uint64 to a stream.  If we can't write the\n * integer for some reason, return an error.\n */\n\nstatic int\nwrite_uint64(struct cork_stream_consumer *stream, uint64_t val)\n{\n    CORK_UINT64_HOST_TO_BIG_IN_PLACE(val);\n    return cork_stream_consumer_data(stream, &val, sizeof(uint64_t), false);\n}\n\n\n/*-----------------------------------------------------------------------\n * V1 BDD file\n */\n\nstatic const char  MAGIC_NUMBER[] = \"IP set\";\nstatic const size_t  MAGIC_NUMBER_LENGTH = sizeof(MAGIC_NUMBER) - 1;\n\n\nstatic int\nwrite_header_v1(struct save_data *save_data,\n                struct ipset_node_cache *cache, ipset_node_id root)\n{\n    /* Output the magic number for an IP set, and the file format\n     * version that we're going to write. */\n    rii_check(cork_stream_consumer_data(save_data->stream, NULL, 0, true));\n    rii_check(write_string(save_data->stream, MAGIC_NUMBER));\n    rii_check(write_uint16(save_data->stream, 0x0001));\n\n    /* Determine how many reachable nodes there are, to calculate the\n     * size of the set. */\n    size_t  nonterminal_count = ipset_node_reachable_count(cache, root);\n    size_t  set_size =\n        MAGIC_NUMBER_LENGTH +    /* magic number */\n        sizeof(uint16_t) +        /* version number  */\n        sizeof(uint64_t) +        /* length of set */\n        sizeof(uint32_t) +        /* number of nonterminals */\n        (nonterminal_count *     /* for each nonterminal: */\n         (sizeof(uint8_t) +       /*   variable number */\n          sizeof(uint32_t) +      /*   low pointer */\n          sizeof(uint32_t)        /*   high pointer */\n         ));\n\n    /* If the root is a terminal, we need to add 4 bytes to the set\n     * size, for storing the terminal value. */\n    if (ipset_node_get_type(root) == IPSET_TERMINAL_NODE) {\n        set_size += sizeof(uint32_t);\n    }\n\n    rii_check(write_uint64(save_data->stream, set_size));\n    rii_check(write_uint32(save_data->stream, nonterminal_count));\n    return 0;\n}\n\n\nstatic int\nwrite_footer_v1(struct save_data *save_data,\n                struct ipset_node_cache *cache, ipset_node_id root)\n{\n    /* If the root is a terminal node, then we output the terminal value\n     * in place of the (nonexistent) list of nonterminal nodes. */\n\n    if (ipset_node_get_type(root) == IPSET_TERMINAL_NODE) {\n        ipset_value  value = ipset_terminal_value(root);\n        return write_uint32(save_data->stream, value);\n    }\n\n    return 0;\n}\n\n\nstatic int\nwrite_terminal_v1(struct save_data *save_data, ipset_value terminal_value)\n{\n    /* We don't have to write anything out for a terminal in a V1 file,\n     * since the terminal's value will be encoded into the node ID\n     * wherever it's used. */\n    return 0;\n}\n\n\nstatic int\nwrite_nonterminal_v1(struct save_data *save_data,\n                     serialized_id serialized_node,\n                     ipset_variable variable,\n                     serialized_id serialized_low,\n                     serialized_id serialized_high)\n{\n    rii_check(write_uint8(save_data->stream, variable));\n    rii_check(write_uint32(save_data->stream, serialized_low));\n    rii_check(write_uint32(save_data->stream, serialized_high));\n    return 0;\n}\n\n\nint\nipset_node_cache_save(struct cork_stream_consumer *stream, struct ipset_node_cache *cache,\n                      ipset_node_id node)\n{\n    struct save_data  save_data;\n    save_data.cache = cache;\n    save_data.stream = stream;\n    save_data.write_header = write_header_v1;\n    save_data.write_footer = write_footer_v1;\n    save_data.write_terminal = write_terminal_v1;\n    save_data.write_nonterminal = write_nonterminal_v1;\n    return save_bdd(&save_data, cache, node);\n}\n\n\n/*-----------------------------------------------------------------------\n * GraphViz dot file\n */\n\nstatic const char  *GRAPHVIZ_HEADER =\n    \"strict digraph bdd {\\n\";\n\nstatic const char  *GRAPHVIZ_FOOTER =\n    \"}\\n\";\n\n\nstruct dot_data {\n    /* The terminal value to leave out of the dot file.  This should be\n     * the default value of the set or map. */\n    ipset_value  default_value;\n\n    /* A scratch buffer */\n    struct cork_buffer  scratch;\n};\n\n\nstatic int\nwrite_header_dot(struct save_data *save_data,\n                 struct ipset_node_cache *cache, ipset_node_id root)\n{\n    /* Output the opening clause of the GraphViz script. */\n    rii_check(cork_stream_consumer_data(save_data->stream, NULL, 0, true));\n    return write_string(save_data->stream, GRAPHVIZ_HEADER);\n}\n\n\nstatic int\nwrite_footer_dot(struct save_data *save_data,\n                 struct ipset_node_cache *cache, ipset_node_id root)\n{\n    /* Output the closing clause of the GraphViz script. */\n    return write_string(save_data->stream, GRAPHVIZ_FOOTER);\n}\n\n\nstatic int\nwrite_terminal_dot(struct save_data *save_data, ipset_value terminal_value)\n{\n    struct dot_data  *dot_data = save_data->user_data;\n\n    /* If this terminal has the default value, skip it. */\n    if (terminal_value == dot_data->default_value) {\n        return 0;\n    }\n\n    /* Output a node for the terminal value. */\n    cork_buffer_printf\n        (&dot_data->scratch,\n         \"    t%d [shape=box, label=%d];\\n\",\n         terminal_value, terminal_value);\n    return write_string(save_data->stream, dot_data->scratch.buf);\n}\n\n\nstatic int\nwrite_nonterminal_dot(struct save_data *save_data,\n                      serialized_id serialized_node,\n                      ipset_variable variable,\n                      serialized_id serialized_low,\n                      serialized_id serialized_high)\n{\n    struct dot_data  *dot_data = save_data->user_data;\n\n    /* Include a node for the nonterminal value. */\n    cork_buffer_printf\n        (&dot_data->scratch,\n         \"    n%d [shape=circle,label=%u];\\n\",\n         (-serialized_node), variable);\n\n    /* Include an edge for the low pointer. */\n    if (serialized_low < 0) {\n        /* The low pointer is a nonterminal. */\n        cork_buffer_append_printf\n            (&dot_data->scratch,\n             \"    n%d -> n%d\",\n             (-serialized_node), (-serialized_low));\n    } else {\n        /* The low pointer is a terminal. */\n        ipset_value  low_value = (ipset_value) serialized_low;\n\n        if (low_value == dot_data->default_value) {\n            /* The terminal is the default value, so instead of a real\n             * terminal, connect this pointer to a dummy circle node. */\n            cork_buffer_append_printf\n                (&dot_data->scratch,\n                 \"    low%d [shape=circle,label=\\\"\\\"]\\n\"\n                 \"    n%d -> low%d\",\n                 (-serialized_node), (-serialized_node), (-serialized_node));\n        } else {\n            /* The terminal isn't a default, so go ahead and output it. */\n            cork_buffer_append_printf\n                (&dot_data->scratch,\n                 \"    n%d -> t%d\",\n                 (-serialized_node), serialized_low);\n        }\n    }\n\n    cork_buffer_append_printf\n        (&dot_data->scratch, \" [style=dashed,color=red]\\n\");\n\n    /* Include an edge for the high pointer. */\n    if (serialized_high < 0) {\n        /* The high pointer is a nonterminal. */\n        cork_buffer_append_printf\n            (&dot_data->scratch,\n             \"    n%d -> n%d\",\n             (-serialized_node), (-serialized_high));\n    } else {\n        /* The high pointer is a terminal. */\n        ipset_value  high_value = (ipset_value) serialized_high;\n\n        if (high_value == dot_data->default_value) {\n            /* The terminal is the default value, so instead of a real\n             * terminal, connect this pointer to a dummy circle node. */\n            cork_buffer_append_printf\n                (&dot_data->scratch,\n                 \"    high%d \"\n                 \"[shape=circle,\"\n                 \"fixedsize=true,\"\n                 \"height=0.25,\"\n                 \"width=0.25,\"\n                 \"label=\\\"\\\"]\\n\"\n                 \"    n%d -> high%d\",\n                 (-serialized_node), (-serialized_node), (-serialized_node));\n        } else {\n            /* The terminal isn't a default, so go ahead and output it. */\n            cork_buffer_append_printf\n                (&dot_data->scratch,\n                 \"    n%d -> t%d\",\n                 (-serialized_node), serialized_high);\n        }\n    }\n\n    cork_buffer_append_printf\n        (&dot_data->scratch, \" [style=solid,color=black]\\n\");\n\n    /* Output the clauses to the stream. */\n    return write_string(save_data->stream, dot_data->scratch.buf);\n}\n\n\nint\nipset_node_cache_save_dot(struct cork_stream_consumer *stream,\n                          struct ipset_node_cache *cache, ipset_node_id node)\n{\n    struct dot_data  dot_data = {\n        0,                       /* default value */\n        {NULL, 0, 0}\n    };\n\n    struct save_data  save_data;\n    save_data.cache = cache;\n    save_data.stream = stream;\n    save_data.write_header = write_header_dot;\n    save_data.write_footer = write_footer_dot;\n    save_data.write_terminal = write_terminal_dot;\n    save_data.write_nonterminal = write_nonterminal_dot;\n    save_data.user_data = &dot_data;\n    return save_bdd(&save_data, cache, node);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/cmake/FindCTargets.cmake",
    "content": "# -*- coding: utf-8 -*-\n# ----------------------------------------------------------------------\n# Copyright © 2015, RedJack, LLC.\n# All rights reserved.\n#\n# Please see the COPYING file in this distribution for license details.\n# ----------------------------------------------------------------------\n\n\n#-----------------------------------------------------------------------\n# Library, with options to build both shared and static versions\n\nfunction(target_add_static_libraries TARGET_NAME LIBRARIES LOCAL_LIBRARIES)\n    foreach(lib ${LIBRARIES})\n        string(REPLACE \"-\" \"_\" lib ${lib})\n        string(TOUPPER ${lib} upperlib)\n        target_link_libraries(\n            ${TARGET_NAME}\n            ${${upperlib}_STATIC_LDFLAGS}\n        )\n    endforeach(lib)\n    foreach(lib ${LOCAL_LIBRARIES})\n        target_link_libraries(${TARGET_NAME} ${lib})\n    endforeach(lib)\nendfunction(target_add_static_libraries)\n\nset_property(GLOBAL PROPERTY ALL_LOCAL_LIBRARIES \"\")\n\nfunction(add_c_library __TARGET_NAME)\n    set(options)\n    set(one_args OUTPUT_NAME PKGCONFIG_NAME VERSION)\n    set(multi_args LIBRARIES LOCAL_LIBRARIES SOURCES)\n    cmake_parse_arguments(_ \"${options}\" \"${one_args}\" \"${multi_args}\" ${ARGN})\n\n    if (__VERSION MATCHES \"^([0-9]+)\\\\.([0-9]+)\\\\.([0-9]+)(-dev)?$\")\n        set(__VERSION_CURRENT  \"${CMAKE_MATCH_1}\")\n        set(__VERSION_REVISION \"${CMAKE_MATCH_2}\")\n        set(__VERSION_AGE      \"${CMAKE_MATCH_3}\")\n    else (__VERSION MATCHES \"^([0-9]+)\\\\.([0-9]+)\\\\.([0-9]+)(-dev)?$\")\n        message(FATAL_ERROR \"Invalid library version number: ${__VERSION}\")\n    endif (__VERSION MATCHES \"^([0-9]+)\\\\.([0-9]+)\\\\.([0-9]+)(-dev)?$\")\n\n    math(EXPR __SOVERSION \"${__VERSION_CURRENT} - ${__VERSION_AGE}\")\n\n    get_property(ALL_LOCAL_LIBRARIES GLOBAL PROPERTY ALL_LOCAL_LIBRARIES)\n    list(APPEND ALL_LOCAL_LIBRARIES ${__TARGET_NAME})\n    set_property(GLOBAL PROPERTY ALL_LOCAL_LIBRARIES \"${ALL_LOCAL_LIBRARIES}\")\n\n    include_directories(\n            ${PROJECT_SOURCE_DIR}/include\n            ${PROJECT_BINARY_DIR}/include\n    )\n    add_library(${__TARGET_NAME} STATIC ${__SOURCES})\n\n    set_target_properties(\n        ${__TARGET_NAME} PROPERTIES\n        OUTPUT_NAME ${__OUTPUT_NAME}\n        CLEAN_DIRECT_OUTPUT 1\n    )\n\n    target_include_directories(\n        ${__TARGET_NAME} PUBLIC\n        ${CMAKE_SOURCE_DIR}/include\n        ${CMAKE_BINARY_DIR}/include\n    )\n\n\n    target_add_static_libraries(\n        ${__TARGET_NAME}\n        \"${__LIBRARIES}\"\n        \"${__LOCAL_LIBRARIES}\"\n    )\nendfunction(add_c_library)\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/general.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2009-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <libcork/core.h>\n\n#include \"ipset/bdd/nodes.h\"\n#include \"ipset/ipset.h\"\n\n\nint\nipset_init_library()\n{\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/include/ipset/bdd/nodes.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2010-2013, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef IPSET_BDD_NODES_H\n#define IPSET_BDD_NODES_H\n\n\n#include <stdio.h>\n\n#include <libcork/core.h>\n#include <libcork/ds.h>\n\n\n/*-----------------------------------------------------------------------\n * Preliminaries\n */\n\n/**\n * Each variable in a BDD is referred to by number.\n */\ntypedef unsigned int  ipset_variable;\n\n\n/**\n * Each BDD terminal represents an integer value.  The integer must be\n * non-negative, but must be within the range of the <i>signed</i>\n * integer type.\n */\ntypedef unsigned int  ipset_value;\n\n\n/**\n * An identifier for each distinct node in a BDD.\n *\n * Internal implementation note.  Since pointers are aligned to at\n * least two bytes, the ID of a terminal node has its LSB set to 1,\n * and has the terminal value stored in the remaining bits.  The ID of\n * a nonterminal node is simply a pointer to the node struct.\n */\ntypedef unsigned int  ipset_node_id;\n\n\n/**\n * Nodes can either be terminal or nonterminal.\n */\nenum ipset_node_type {\n    IPSET_NONTERMINAL_NODE = 0,\n    IPSET_TERMINAL_NODE = 1\n};\n\n\n/**\n * Return the type of node represented by a particular node ID.\n */\n#define ipset_node_get_type(node_id)  ((node_id) & 0x01)\n\n#define IPSET_NODE_ID_FORMAT  \"%s%u\"\n#define IPSET_NODE_ID_VALUES(node_id) \\\n    (ipset_node_get_type((node_id)) == IPSET_NONTERMINAL_NODE? \"s\": \"\"), \\\n    ((node_id) >> 1)\n\n\n/*-----------------------------------------------------------------------\n * Terminal nodes\n */\n\n/**\n * Return the value of a terminal node.  The result is undefined if\n * the node ID represents a nonterminal.\n */\n#define ipset_terminal_value(node_id)  ((node_id) >> 1)\n\n/**\n * Creates a terminal node ID from a terminal value.\n */\n#define ipset_terminal_node_id(value) \\\n    (((value) << 1) | IPSET_TERMINAL_NODE)\n\n\n/*-----------------------------------------------------------------------\n * Nonterminal nodes\n */\n\n/**\n * A nonterminal BDD node.  This is an inner node of the BDD tree.\n * The node represents one variable in an overall variable assignment.\n * The node has two children: a “low” child and a “high” child.  The\n * low child is the subtree that applies when the node's variable is\n * false or 0; the high child is the subtree that applies when it's\n * true or 1.\n *\n * This type does not take care of ensuring that all BDD nodes are\n * reduced; that is handled by the node_cache class.\n */\nstruct ipset_node {\n    /** The reference count for this node. */\n    unsigned int  refcount;\n    /** The variable that this node represents. */\n    ipset_variable  variable;\n    /** The subtree node for when the variable is false. */\n    ipset_node_id  low;\n    /** The subtree node for when the variable is true. */\n    ipset_node_id  high;\n};\n\n/**\n * Return the \"value\" of a nonterminal node.  The value of a nonterminal\n * is the index into the node array of the cache that the node belongs\n * to.\n */\n#define ipset_nonterminal_value(node_id) ((node_id) >> 1)\n\n/**\n * Creates a nonterminal node ID from a nonterminal value.\n */\n#define ipset_nonterminal_node_id(value) \\\n    (((value) << 1) | IPSET_NONTERMINAL_NODE)\n\n/**\n * Print out a node object.\n */\nvoid\nipset_node_fprint(FILE *stream, struct ipset_node *node);\n\n\n/*-----------------------------------------------------------------------\n * Node caches\n */\n\n/**\n * The log2 of the size of each chunk of BDD nodes.\n */\n/* 16K elements per cache */\n#define IPSET_BDD_NODE_CACHE_BIT_SIZE  6\n#define IPSET_BDD_NODE_CACHE_SIZE  (1 << IPSET_BDD_NODE_CACHE_BIT_SIZE)\n#define IPSET_BDD_NODE_CACHE_MASK  (IPSET_BDD_NODE_CACHE_SIZE - 1)\n\n/**\n * A cache for BDD nodes.  By creating and retrieving nodes through\n * the cache, we ensure that a BDD is reduced.\n */\nstruct ipset_node_cache {\n    /** The storage for the nodes managed by this cache. */\n    cork_array(struct ipset_node *)  chunks;\n    /** The largest nonterminal index that has been handed out. */\n    ipset_value  largest_index;\n    /** The index of the first node in the free list. */\n    ipset_value  free_list;\n    /** A cache of the nonterminal nodes, keyed by their contents. */\n    struct cork_hash_table  *node_cache;\n};\n\n/**\n * Returns the index of the chunk that the given nonterminal lives in.\n */\n#define ipset_nonterminal_chunk_index(index) \\\n    ((index) >> IPSET_BDD_NODE_CACHE_BIT_SIZE)\n\n/**\n * Returns the offset of the given nonterminal within its chunk.\n */\n#define ipset_nonterminal_chunk_offset(index) \\\n    ((index) & IPSET_BDD_NODE_CACHE_MASK)\n\n/**\n * Returns a pointer to the ipset_node for a given nonterminal index.\n */\n#define ipset_node_cache_get_nonterminal_by_index(cache, index) \\\n    (&cork_array_at(&(cache)->chunks, ipset_nonterminal_chunk_index((index))) \\\n     [ipset_nonterminal_chunk_offset((index))])\n\n/**\n * Returns the ipset_node for a given nonterminal node ID.\n */\n#define ipset_node_cache_get_nonterminal(cache, node_id) \\\n    (ipset_node_cache_get_nonterminal_by_index \\\n     ((cache), ipset_nonterminal_value((node_id))))\n\n/**\n * Create a new node cache.\n */\nstruct ipset_node_cache *\nipset_node_cache_new(void);\n\n/**\n * Free a node cache.\n */\nvoid\nipset_node_cache_free(struct ipset_node_cache *cache);\n\n/**\n * Create a new nonterminal node with the given contents, returning\n * its ID.  This function ensures that there is only one node with the\n * given contents in this cache.\n *\n * Steals references to low and high.\n */\nipset_node_id\nipset_node_cache_nonterminal(struct ipset_node_cache *cache,\n                             ipset_variable variable,\n                             ipset_node_id low, ipset_node_id high);\n\n\n/**\n * Increment the reference count of a nonterminal node.  (This is a\n * no-op for terminal nodes.)\n */\nipset_node_id\nipset_node_incref(struct ipset_node_cache *cache, ipset_node_id node);\n\n/**\n * Decrement the reference count of a nonterminal node.  If the\n * reference count reaches 0, the storage for the node will be\n * reclaimed.  (This is a no-op for terminal nodes.)\n */\nvoid\nipset_node_decref(struct ipset_node_cache *cache, ipset_node_id node);\n\n\n/**\n * Return the number of nodes that are reachable from the given node.\n * This does not include duplicates if a node is reachable via more\n * than one path.\n */\nsize_t\nipset_node_reachable_count(const struct ipset_node_cache *cache,\n                           ipset_node_id node);\n\n\n/**\n * Return the amount of memory used by the nodes in the given BDD.\n */\nsize_t\nipset_node_memory_size(const struct ipset_node_cache *cache,\n                       ipset_node_id node);\n\n\n/**\n * Load a BDD from an input stream.  The error field is filled in with\n * an error condition is the BDD can't be read for any reason.\n */\nipset_node_id\nipset_node_cache_load(FILE *stream, struct ipset_node_cache *cache);\n\n\n/**\n * Save a BDD to an output stream.  This encodes the set using only\n * those nodes that are reachable from the BDD's root node.\n */\nint\nipset_node_cache_save(struct cork_stream_consumer *stream,\n                      struct ipset_node_cache *cache, ipset_node_id node);\n\n\n/**\n * Compare two BDD nodes, possibly from different caches, for equality.\n */\nbool\nipset_node_cache_nodes_equal(const struct ipset_node_cache *cache1,\n                             ipset_node_id node1,\n                             const struct ipset_node_cache *cache2,\n                             ipset_node_id node2);\n\n\n/**\n * Save a GraphViz dot graph for a BDD.  The graph script is written\n * to the given output stream.  This graph only includes those nodes\n * that are reachable from the BDD's root node.\n */\nint\nipset_node_cache_save_dot(struct cork_stream_consumer *stream,\n                          struct ipset_node_cache *cache, ipset_node_id node);\n\n\n/*-----------------------------------------------------------------------\n * BDD operators\n */\n\n/**\n * A function that provides the value for each variable in a BDD.\n */\ntypedef bool\n(*ipset_assignment_func)(const void *user_data,\n                         ipset_variable variable);\n\n/**\n * An assignment function that gets the variable values from an array\n * of gbooleans.\n */\nbool\nipset_bool_array_assignment(const void *user_data,\n                            ipset_variable variable);\n\n/**\n * An assignment function that gets the variable values from an array\n * of bits.\n */\nbool\nipset_bit_array_assignment(const void *user_data,\n                           ipset_variable variable);\n\n/**\n * Evaluate a BDD given a particular assignment of variables.\n */\nipset_value\nipset_node_evaluate(const struct ipset_node_cache *cache, ipset_node_id node,\n                    ipset_assignment_func assignment,\n                    const void *user_data);\n\n/**\n * Add an assignment to the BDD.\n */\nipset_node_id\nipset_node_insert(struct ipset_node_cache *cache, ipset_node_id node,\n                  ipset_assignment_func assignment,\n                  const void *user_data, ipset_variable variable_count,\n                  ipset_value value);\n\n\n/*-----------------------------------------------------------------------\n * Variable assignments\n */\n\n/**\n * Each variable in the input to a Boolean function can be true or\n * false; it can also be EITHER, which means that the variable can be\n * either true or false in a particular assignment without affecting\n * the result of the function.\n */\nenum ipset_tribool {\n    IPSET_FALSE = 0,\n    IPSET_TRUE = 1,\n    IPSET_EITHER = 2\n};\n\n\n/**\n * An assignment is a mapping of variable numbers to Boolean values.\n * It represents an input to a Boolean function that maps to a\n * particular output value.  Each variable in the input to a Boolean\n * function can be true or false; it can also be EITHER, which means\n * that the variable can be either true or false in a particular\n * assignment without affecting the result of the function.\n */\n\nstruct ipset_assignment {\n    /**\n     * The underlying variable assignments are stored in a vector of\n     * tribools.  Every variable that has a true or false value must\n     * appear in the vector.  Variables that are EITHER only have to\n     * appear to prevent gaps in the vector.  Any variables outside\n     * the range of the vector are assumed to be EITHER.\n     */\n    cork_array(enum ipset_tribool)  values;\n};\n\n\n/**\n * Create a new assignment where all variables are indeterminite.\n */\nstruct ipset_assignment *\nipset_assignment_new();\n\n\n/**\n * Free an assignment.\n */\nvoid\nipset_assignment_free(struct ipset_assignment *assignment);\n\n\n/**\n * Compare two assignments for equality.\n */\nbool\nipset_assignment_equal(const struct ipset_assignment *assignment1,\n                       const struct ipset_assignment *assignment2);\n\n\n/**\n * Set the given variable, and all higher variables, to the EITHER\n * value.\n */\nvoid\nipset_assignment_cut(struct ipset_assignment *assignment, ipset_variable var);\n\n\n/**\n * Clear the assignment, setting all variables to the EITHER value.\n */\nvoid\nipset_assignment_clear(struct ipset_assignment *assignment);\n\n\n/**\n * Return the value assigned to a particular variable.\n */\nenum ipset_tribool\nipset_assignment_get(struct ipset_assignment *assignment, ipset_variable var);\n\n\n/**\n * Set the value assigned to a particular variable.\n */\nvoid\nipset_assignment_set(struct ipset_assignment *assignment,\n                     ipset_variable var, enum ipset_tribool value);\n\n\n/*-----------------------------------------------------------------------\n * Expanded assignments\n */\n\n/**\n * An iterator for expanding a variable assignment.  For each EITHER\n * variable in the assignment, the iterator yields a result with both\n * values.\n */\nstruct ipset_expanded_assignment {\n    /** Whether there are any more assignments in this iterator. */\n    bool finished;\n\n    /**\n     * The variable values in the current expanded assignment.  Since\n     * there won't be any EITHERs in the expanded assignment, we can\n     * use a byte array, and represent each variable by a single bit.\n     */\n    struct cork_buffer  values;\n\n    /**\n     * An array containing all of the variables that are EITHER in the\n     * original assignment.\n     */\n    cork_array(ipset_variable)  eithers;\n};\n\n\n/**\n * Return an iterator that expands a variable assignment.  For each\n * variable that's EITHER in the assignment, the iterator yields a\n * result with both values.  The iterator will ensure that the\n * specified number of variables are given concrete values.\n */\nstruct ipset_expanded_assignment *\nipset_assignment_expand(const struct ipset_assignment *assignment,\n                        ipset_variable var_count);\n\n\n/**\n * Free an expanded assignment iterator.\n */\nvoid\nipset_expanded_assignment_free(struct ipset_expanded_assignment *exp);\n\n\n/**\n * Advance the iterator to the next assignment.\n */\nvoid\nipset_expanded_assignment_advance(struct ipset_expanded_assignment *exp);\n\n\n/*-----------------------------------------------------------------------\n * BDD iterators\n */\n\n/**\n * An iterator for walking through the assignments for a given BDD\n * node.\n *\n * The iterator walks through each path in the BDD tree, stopping at\n * each terminal node.  Each time we reach a terminal node, we yield a\n * new ipset_assignment object representing the assignment of variables\n * along the current path.\n *\n * We maintain a stack of nodes leading to the current terminal, which\n * allows us to backtrack up the path to find the next terminal when\n * we increment the iterator.\n */\nstruct ipset_bdd_iterator {\n    /** Whether there are any more assignments in this iterator. */\n    bool finished;\n\n    /** The node cache that we're iterating through. */\n    struct ipset_node_cache  *cache;\n\n    /**\n     * The sequence of nonterminal nodes leading to the current\n     * terminal.\n     */\n    cork_array(ipset_node_id)  stack;\n\n    /** The current assignment. */\n    struct ipset_assignment  *assignment;\n\n    /**\n     * The value of the BDD's function when applied to the current\n     * assignment.\n     */\n    ipset_value  value;\n};\n\n\n/**\n * Return an iterator that yields all of the assignments in the given\n * BDD.  The iterator contains two items of interest.  The first is an\n * ipset_assignment providing the value that each variable takes, while\n * the second is the terminal value that is the result of the BDD's\n * function when applied to that variable assignment.\n */\nstruct ipset_bdd_iterator *\nipset_node_iterate(struct ipset_node_cache *cache, ipset_node_id root);\n\n\n/**\n * Free a BDD iterator.\n */\nvoid\nipset_bdd_iterator_free(struct ipset_bdd_iterator *iterator);\n\n\n/**\n * Advance the iterator to the next assignment.\n */\nvoid\nipset_bdd_iterator_advance(struct ipset_bdd_iterator *iterator);\n\n\n#endif  /* IPSET_BDD_NODES_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/include/ipset/bits.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef IPSET_BITS_H\n#define IPSET_BITS_H\n\n#include <libcork/core.h>\n\n/*-----------------------------------------------------------------------\n * Bit arrays\n */\n\n/**\n * Extract the byte that contains a particular bit in an array.\n */\n#define IPSET_BIT_GET_BYTE(array, i)            \\\n    (((uint8_t *) (array))[(i) / 8])\n\n/**\n * Create a bit mask that extracts a particular bit from the byte that\n * it lives in.\n */\n#define IPSET_BIT_ON_MASK(i)                    \\\n    (0x80 >> ((i) % 8))\n\n/**\n * Create a bit mask that extracts everything except for a particular\n * bit from the byte that it lives in.\n */\n#define IPSET_BIT_NEG_MASK(i)                   \\\n    (~IPSET_BIT_ON_MASK(i))\n\n/**\n * Return whether a particular bit is set in a byte array.  Bits are\n * numbered from 0, in a big-endian order.\n */\n#define IPSET_BIT_GET(array, i)                 \\\n    ((IPSET_BIT_GET_BYTE(array, i) &            \\\n      IPSET_BIT_ON_MASK(i)) != 0)\n\n/**\n * Set (or unset) a particular bit is set in a byte array.  Bits are\n * numbered from 0, in a big-endian order.\n */\n#define IPSET_BIT_SET(array, i, val)                           \\\n    (IPSET_BIT_GET_BYTE(array, i) =                            \\\n     (IPSET_BIT_GET_BYTE(array, i) & IPSET_BIT_NEG_MASK(i))    \\\n     | ((val)? IPSET_BIT_ON_MASK(i): 0))\n\n\n#endif  /* IPSET_BITS_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/include/ipset/errors.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef IPSET_ERRORS_H\n#define IPSET_ERRORS_H\n\n\n#include <libcork/core.h>\n\n\n/*-----------------------------------------------------------------------\n * Error reporting\n */\n\n/* Hash of \"ipset.h\" */\n#define IPSET_ERROR  0xf2000181\n\nenum ipset_error {\n    IPSET_IO_ERROR,\n    IPSET_PARSE_ERROR\n};\n\n\n#endif  /* IPSET_ERRORS_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/include/ipset/ipset.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2009-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef IPSET_IPSET_H\n#define IPSET_IPSET_H\n\n#include <stdio.h>\n\n#include <libcork/core.h>\n#include <libcork/ds.h>\n\n#include <ipset/bdd/nodes.h>\n\n\nstruct ip_set {\n    struct ipset_node_cache  *cache;\n    ipset_node_id  set_bdd;\n};\n\n\nstruct ip_map {\n    struct ipset_node_cache  *cache;\n    ipset_node_id  map_bdd;\n    ipset_node_id  default_bdd;\n};\n\n\n/*---------------------------------------------------------------------\n * General functions\n */\n\nint\nipset_init_library(void);\n\n\n/*---------------------------------------------------------------------\n * IP set functions\n */\n\nvoid\nipset_init(struct ip_set *set);\n\nvoid\nipset_done(struct ip_set *set);\n\nstruct ip_set *\nipset_new(void);\n\nvoid\nipset_free(struct ip_set *set);\n\nbool\nipset_is_empty(const struct ip_set *set);\n\nbool\nipset_is_equal(const struct ip_set *set1, const struct ip_set *set2);\n\nsize_t\nipset_memory_size(const struct ip_set *set);\n\nint\nipset_save(FILE *stream, const struct ip_set *set);\n\nint\nipset_save_to_stream(struct cork_stream_consumer *stream,\n                     const struct ip_set *set);\n\nint\nipset_save_dot(FILE *stream, const struct ip_set *set);\n\nstruct ip_set *\nipset_load(FILE *stream);\n\nbool\nipset_ipv4_add(struct ip_set *set, struct cork_ipv4 *elem);\n\nbool\nipset_ipv4_add_network(struct ip_set *set, struct cork_ipv4 *elem,\n                       unsigned int cidr_prefix);\n\nbool\nipset_ipv4_remove(struct ip_set *set, struct cork_ipv4 *elem);\n\nbool\nipset_ipv4_remove_network(struct ip_set *set, struct cork_ipv4 *elem,\n                          unsigned int cidr_prefix);\n\nbool\nipset_contains_ipv4(const struct ip_set *set, struct cork_ipv4 *elem);\n\nbool\nipset_ipv6_add(struct ip_set *set, struct cork_ipv6 *elem);\n\nbool\nipset_ipv6_add_network(struct ip_set *set, struct cork_ipv6 *elem,\n                       unsigned int cidr_prefix);\n\nbool\nipset_ipv6_remove(struct ip_set *set, struct cork_ipv6 *elem);\n\nbool\nipset_ipv6_remove_network(struct ip_set *set, struct cork_ipv6 *elem,\n                          unsigned int cidr_prefix);\n\nbool\nipset_contains_ipv6(const struct ip_set *set, struct cork_ipv6 *elem);\n\nbool\nipset_ip_add(struct ip_set *set, struct cork_ip *addr);\n\nbool\nipset_ip_add_network(struct ip_set *set, struct cork_ip *addr,\n                     unsigned int cidr_prefix);\n\nbool\nipset_ip_remove(struct ip_set *set, struct cork_ip *addr);\n\nbool\nipset_ip_remove_network(struct ip_set *set, struct cork_ip *addr,\n                        unsigned int cidr_prefix);\n\nbool\nipset_contains_ip(const struct ip_set *set, struct cork_ip *elem);\n\n\n/* An internal state type used by the ipset_iterator_multiple_expansion_state\n * field. */\nenum ipset_iterator_state {\n    IPSET_ITERATOR_NORMAL = 0,\n    IPSET_ITERATOR_MULTIPLE_IPV4,\n    IPSET_ITERATOR_MULTIPLE_IPV6\n};\n\n\n/* An iterator that returns all of the IP addresses that have a given value in\n * an IP set or map. */\nstruct ipset_iterator {\n    /* The address of the current IP network in the iterator. */\n    struct cork_ip  addr;\n\n    /* The netmask of the current IP network in the iterator, given as a\n     * CIDR prefix.  For a single IP address, this will be 32 or 128. */\n    unsigned int  cidr_prefix;\n\n    /* Whether the current assignment needs to be expanded a second\n     * time.\n     *\n     * We have to expand IPv4 and IPv6 assignments separately, since the\n     * set of variables to turn into address bits is different.\n     * Unfortunately, a BDD assignment can contain both IPv4 and IPv6\n     * addresses, if variable 0 is EITHER.  (This is trivially true for\n     * the empty set, for instance.)  In this case, we have to\n     * explicitly set variable 0 to TRUE, expand it as IPv4, and then\n     * set it to FALSE, and expand it as IPv6.  This variable tells us\n     * whether we're in an assignment that needs to be expanded twice,\n     * and if so, which expansion we're currently in.\n     */\n    enum ipset_iterator_state  multiple_expansion_state;\n\n    /* An iterator for retrieving each assignment in the set's BDD. */\n    struct ipset_bdd_iterator  *bdd_iterator;\n\n    /* An iterator for expanding each assignment into individual IP\n     * addresses. */\n    struct ipset_expanded_assignment  *assignment_iterator;\n\n    /* Whether there are any more IP addresses in this iterator. */\n    bool  finished;\n\n    /* The desired value for each IP address. */\n    bool  desired_value;\n\n    /* Whether to summarize the contents of the IP set as networks,\n     * where possible. */\n    bool  summarize;\n};\n\n\nstruct ipset_iterator *\nipset_iterate(struct ip_set *set, bool desired_value);\n\nstruct ipset_iterator *\nipset_iterate_networks(struct ip_set *set, bool desired_value);\n\nvoid\nipset_iterator_free(struct ipset_iterator *iterator);\n\nvoid\nipset_iterator_advance(struct ipset_iterator *iterator);\n\n\n/*---------------------------------------------------------------------\n * IP map functions\n */\n\nvoid\nipmap_init(struct ip_map *map, int default_value);\n\nvoid\nipmap_done(struct ip_map *map);\n\nstruct ip_map *\nipmap_new(int default_value);\n\nvoid\nipmap_free(struct ip_map *map);\n\nbool\nipmap_is_empty(const struct ip_map *map);\n\nbool\nipmap_is_equal(const struct ip_map *map1, const struct ip_map *map2);\n\nsize_t\nipmap_memory_size(const struct ip_map *map);\n\nint\nipmap_save(FILE *stream, const struct ip_map *map);\n\nint\nipmap_save_to_stream(struct cork_stream_consumer *stream,\n                     const struct ip_map *map);\n\nstruct ip_map *\nipmap_load(FILE *stream);\n\nvoid\nipmap_ipv4_set(struct ip_map *map, struct cork_ipv4 *elem, int value);\n\nvoid\nipmap_ipv4_set_network(struct ip_map *map, struct cork_ipv4 *elem,\n                       unsigned int cidr_prefix, int value);\n\nint\nipmap_ipv4_get(struct ip_map *map, struct cork_ipv4 *elem);\n\nvoid\nipmap_ipv6_set(struct ip_map *map, struct cork_ipv6 *elem, int value);\n\nvoid\nipmap_ipv6_set_network(struct ip_map *map, struct cork_ipv6 *elem,\n                       unsigned int cidr_prefix, int value);\n\nint\nipmap_ipv6_get(struct ip_map *map, struct cork_ipv6 *elem);\n\nvoid\nipmap_ip_set(struct ip_map *map, struct cork_ip *addr, int value);\n\nvoid\nipmap_ip_set_network(struct ip_map *map, struct cork_ip *addr,\n                     unsigned int cidr_prefix, int value);\n\nint\nipmap_ip_get(struct ip_map *map, struct cork_ip *addr);\n\n\n#endif  /* IPSET_IPSET_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/include/ipset/logging.h",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2010-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#ifndef IPSET_LOGGING_H\n#define IPSET_LOGGING_H\n\n\n#if !defined(IPSET_DEBUG)\n#define IPSET_DEBUG 0\n#endif\n\n#if IPSET_DEBUG\n#include <stdio.h>\n#define DEBUG(...) \\\n    do { \\\n        fprintf(stderr, __VA_ARGS__); \\\n        fprintf(stderr, \"\\n\"); \\\n    } while (0)\n#else\n#define DEBUG(...) /* no debug messages */\n#endif\n\n\n#endif  /* IPSET_LOGGING_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/map/Makefile.am",
    "content": "# This file is part of libasyncns.\n#\n# Copyright 2005-2008 Lennart Poettering\n#\n# libasyncns is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as\n# published by the Free Software Foundation, either version 2.1 of the\n# License, or (at your option) any later version.\n#\n# libasyncns is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n# Lesser General Public License for more details.\n#\n# You should have received a copy of the GNU Lesser General Public\n# License along with libasyncns. If not, see\n# <http://www.gnu.org/licenses/>.\n\nnoinst_LTLIBRARIES = libipset.la\n\nbdd_src = bdd/assignments.c bdd/basics.c bdd/bdd-iterator.c bdd/expanded.c \\\n\t\t  bdd/reachable.c bdd/read.c bdd/write.c \nmap_src = map/allocation.c map/inspection.c map/ipv4_map.c map/ipv6_map.c \\\n\t\t  map/storage.c\nset_src = set/allocation.c set/inspection.c set/ipv4_set.c set/ipv6_set.c \\\n\t\t  set/iterator.c set/storage.c\n\nlibipset_la_SOURCES = ${bdd_src} ${map_src} ${set_src}\n\nlibipset_la_LDFLAGS = -static\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/map/Makefile.in",
    "content": ""
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/map/allocation.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2009-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <libcork/core.h>\n\n#include \"ipset/bdd/nodes.h\"\n#include \"ipset/ipset.h\"\n\n\nvoid\nipmap_init(struct ip_map *map, int default_value)\n{\n    /* The map starts empty, so every value assignment should yield the\n     * default. */\n    map->cache = ipset_node_cache_new();\n    map->default_bdd = ipset_terminal_node_id(default_value);\n    map->map_bdd = map->default_bdd;\n}\n\n\nstruct ip_map *\nipmap_new(int default_value)\n{\n    struct ip_map  *result = cork_new(struct ip_map);\n    ipmap_init(result, default_value);\n    return result;\n}\n\n\nvoid\nipmap_done(struct ip_map *map)\n{\n    ipset_node_decref(map->cache, map->map_bdd);\n    ipset_node_cache_free(map->cache);\n}\n\n\nvoid\nipmap_free(struct ip_map *map)\n{\n    ipmap_done(map);\n    free(map);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/map/inspection-template.c.in",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2009-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <libcork/core.h>\n\n#include \"ipset/bdd/nodes.h\"\n#include \"ipset/bits.h\"\n#include \"ipset/errors.h\"\n#include \"ipset/ipset.h\"\n\n\n/**\n * Given a BDD variable number, return the index of the corresponding\n * bit in an IP address.  IPv4 addresses use variables 1-32; IPv6\n * addresses use 1-128.  (Variable 0 is used to identify the kind of\n * address — TRUE for IPv4, FALSE for IPv6.)\n */\n\nstatic unsigned int\nIPMAP_NAME(bit_for_var)(ipset_variable var)\n{\n    return (var - 1);\n}\n\n\n/**\n * An assignment function that can be used to evaluate an IP map BDD.\n */\n\nstatic bool\nIPMAP_NAME(assignment)(const void *addr, ipset_variable var)\n{\n    if (var == 0) {\n        return IP_DISCRIMINATOR_VALUE;\n    } else {\n        unsigned int  bit = IPMAP_NAME(bit_for_var)(var);\n        return IPSET_BIT_GET(addr, bit);\n    }\n}\n\n\nint\nIPMAP_NAME(get)(struct ip_map *map, CORK_IP *elem)\n{\n    return ipset_node_evaluate\n        (map->cache, map->map_bdd, IPMAP_NAME(assignment), elem);\n}\n\n\nvoid\nIPMAP_NAME(set_network)(struct ip_map *map, CORK_IP *elem,\n                        unsigned int cidr_prefix, int value)\n{\n    /* Special case — the BDD for a netmask that's out of range never\n     * evaluates to true. */\n    if (cidr_prefix > IP_BIT_SIZE) {\n        cork_error_set\n            (IPSET_ERROR, IPSET_PARSE_ERROR,\n             \"CIDR block %u out of range [0..%u]\", cidr_prefix, IP_BIT_SIZE);\n        return;\n    }\n\n    ipset_node_id  new_bdd =\n        ipset_node_insert\n        (map->cache, map->map_bdd,\n         IPMAP_NAME(assignment), elem, cidr_prefix + 1, value);\n    ipset_node_decref(map->cache, map->map_bdd);\n    map->map_bdd = new_bdd;\n}\n\n\nvoid\nIPMAP_NAME(set)(struct ip_map *map, CORK_IP *elem, int value)\n{\n    ipset_node_id  new_bdd =\n        ipset_node_insert\n        (map->cache, map->map_bdd,\n         IPMAP_NAME(assignment), elem, IP_BIT_SIZE + 1, value);\n    ipset_node_decref(map->cache, map->map_bdd);\n    map->map_bdd = new_bdd;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/map/inspection.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2009-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <libcork/core.h>\n\n#include \"ipset/bdd/nodes.h\"\n#include \"ipset/ipset.h\"\n\nbool\nipmap_is_empty(const struct ip_map *map)\n{\n    /* Since BDDs are unique, any map that maps all addresses to the\n     * default value is “empty”. */\n    return (map->map_bdd == map->default_bdd);\n}\n\nbool\nipmap_is_equal(const struct ip_map *map1, const struct ip_map *map2)\n{\n    return ipset_node_cache_nodes_equal\n        (map1->cache, map1->map_bdd, map2->cache, map2->map_bdd);\n}\n\nsize_t\nipmap_memory_size(const struct ip_map *map)\n{\n    return ipset_node_memory_size(map->cache, map->map_bdd);\n}\n\n\nvoid\nipmap_ip_set(struct ip_map *map, struct cork_ip *addr, int value)\n{\n    if (addr->version == 4) {\n        ipmap_ipv4_set(map, &addr->ip.v4, value);\n    } else {\n        ipmap_ipv6_set(map, &addr->ip.v6, value);\n    }\n}\n\n\nvoid\nipmap_ip_set_network(struct ip_map *map, struct cork_ip *addr,\n                     unsigned int cidr_prefix, int value)\n{\n    if (addr->version == 4) {\n        ipmap_ipv4_set_network(map, &addr->ip.v4, cidr_prefix, value);\n    } else {\n        ipmap_ipv6_set_network(map, &addr->ip.v6, cidr_prefix, value);\n    }\n}\n\n\nint\nipmap_ip_get(struct ip_map *map, struct cork_ip *addr)\n{\n    if (addr->version == 4) {\n        return ipmap_ipv4_get(map, &addr->ip.v4);\n    } else {\n        return ipmap_ipv6_get(map, &addr->ip.v6);\n    }\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/map/ipv4_map.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2009-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n/*\n * The IPv4 and IPv6 map types are basically identical, except for the\n * names of the functions, and the size of the values that are being\n * stored.  Rather than having two mostly duplicate definitions of each\n * function, we define “template functions” where anything that depends\n * on the size of the IP address is defined using the following macros.\n */\n\n\n/* The name of the cork_ipvX type. */\n#define CORK_IP  struct cork_ipv4\n\n/* The number of bits in an IPvX address. */\n#define IP_BIT_SIZE  32\n\n/* The value of the discriminator variable for an IPvX address. */\n#define IP_DISCRIMINATOR_VALUE  true\n\n/* Creates a identifier of the form “ipset_ipv4_<basename>”. */\n#define IPSET_NAME(basename) ipset_ipv4_##basename\n\n/* Creates a identifier of the form “ipmap_ipv4_<basename>”. */\n#define IPMAP_NAME(basename) ipmap_ipv4_##basename\n\n\n/* Now include all of the templates. */\n#include \"inspection-template.c.in\"\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/map/ipv6_map.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2009-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n/*\n * The IPv4 and IPv6 map types are basically identical, except for the\n * names of the functions, and the size of the values that are being\n * stored.  Rather than having two mostly duplicate definitions of each\n * function, we define “template functions” where anything that depends\n * on the size of the IP address is defined using the following macros.\n */\n\n\n/* The name of the cork_ipvX type. */\n#define CORK_IP  struct cork_ipv6\n\n/* The number of bits in an IPvX address. */\n#define IP_BIT_SIZE  128\n\n/* The value of the discriminator variable for an IPvX address. */\n#define IP_DISCRIMINATOR_VALUE  false\n\n/* Creates a identifier of the form “ipset_ipv6_<basename>”. */\n#define IPSET_NAME(basename) ipset_ipv6_##basename\n\n/* Creates a identifier of the form “ipmap_ipv6_<basename>”. */\n#define IPMAP_NAME(basename) ipmap_ipv6_##basename\n\n\n/* Now include all of the templates. */\n#include \"inspection-template.c.in\"\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/map/storage.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2009-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <libcork/core.h>\n\n#include \"ipset/bdd/nodes.h\"\n#include \"ipset/errors.h\"\n#include \"ipset/ipset.h\"\n\n\nstatic void\ncreate_errno_error(FILE *stream)\n{\n    if (ferror(stream)) {\n        cork_error_set(IPSET_ERROR, IPSET_IO_ERROR, \"%s\", strerror(errno));\n    } else {\n        cork_unknown_error();\n    }\n}\n\nstruct file_consumer {\n    /* file_consumer is a subclass of cork_stream_consumer */\n    struct cork_stream_consumer  parent;\n    /* the file to write the data into */\n    FILE  *fp;\n};\n\nstatic int\nfile_consumer_data(struct cork_stream_consumer *vself,\n                   const void *buf, size_t size, bool is_first)\n{\n    struct file_consumer  *self =\n        cork_container_of(vself, struct file_consumer, parent);\n    size_t  bytes_written = fwrite(buf, 1, size, self->fp);\n    /* If there was an error writing to the file, then signal this to\n     * the producer */\n    if (bytes_written == size) {\n        return 0;\n    } else {\n        create_errno_error(self->fp);\n        return -1;\n    }\n}\n\nstatic int\nfile_consumer_eof(struct cork_stream_consumer *vself)\n{\n    /* We don't close the file, so there's nothing special to do at\n     * end-of-stream. */\n    return 0;\n}\n\n\nint\nipmap_save_to_stream(struct cork_stream_consumer *stream,\n                     const struct ip_map *map)\n{\n    return ipset_node_cache_save(stream, map->cache, map->map_bdd);\n}\n\nint\nipmap_save(FILE *fp, const struct ip_map *map)\n{\n    struct file_consumer  stream = {\n        { file_consumer_data, file_consumer_eof, NULL }, fp\n    };\n    return ipmap_save_to_stream(&stream.parent, map);\n}\n\n\nstruct ip_map *\nipmap_load(FILE *stream)\n{\n    struct ip_map  *map;\n    ipset_node_id  new_bdd;\n\n    /* It doesn't matter what default value we use here, because we're\n     * going to replace it with the default BDD we load in from the\n     * file. */\n    map = ipmap_new(0);\n    new_bdd = ipset_node_cache_load(stream, map->cache);\n    if (cork_error_occurred()) {\n        ipmap_free(map);\n        return NULL;\n    }\n\n    map->map_bdd = new_bdd;\n    return map;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/set/Makefile.am",
    "content": "# This file is part of libasyncns.\n#\n# Copyright 2005-2008 Lennart Poettering\n#\n# libasyncns is free software; you can redistribute it and/or modify\n# it under the terms of the GNU Lesser General Public License as\n# published by the Free Software Foundation, either version 2.1 of the\n# License, or (at your option) any later version.\n#\n# libasyncns is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU\n# Lesser General Public License for more details.\n#\n# You should have received a copy of the GNU Lesser General Public\n# License along with libasyncns. If not, see\n# <http://www.gnu.org/licenses/>.\n\nnoinst_LTLIBRARIES = libipset.la\n\nbdd_src = bdd/assignments.c bdd/basics.c bdd/bdd-iterator.c bdd/expanded.c \\\n\t\t  bdd/reachable.c bdd/read.c bdd/write.c \nmap_src = map/allocation.c map/inspection.c map/ipv4_map.c map/ipv6_map.c \\\n\t\t  map/storage.c\nset_src = set/allocation.c set/inspection.c set/ipv4_set.c set/ipv6_set.c \\\n\t\t  set/iterator.c set/storage.c\n\nlibipset_la_SOURCES = ${bdd_src} ${map_src} ${set_src}\n\nlibipset_la_LDFLAGS = -static\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/set/Makefile.in",
    "content": ""
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/set/allocation.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2009-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <libcork/core.h>\n\n#include \"ipset/bdd/nodes.h\"\n#include \"ipset/ipset.h\"\n\n\nvoid\nipset_init(struct ip_set *set)\n{\n    /* The set starts empty, so every value assignment should yield\n     * false. */\n    set->cache = ipset_node_cache_new();\n    set->set_bdd = ipset_terminal_node_id(false);\n}\n\n\nstruct ip_set *\nipset_new(void)\n{\n    struct ip_set  *result = cork_new(struct ip_set);\n    ipset_init(result);\n    return result;\n}\n\n\nvoid\nipset_done(struct ip_set *set)\n{\n    ipset_node_decref(set->cache, set->set_bdd);\n    ipset_node_cache_free(set->cache);\n}\n\n\nvoid\nipset_free(struct ip_set *set)\n{\n    ipset_done(set);\n    free(set);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/set/inspection-template.c.in",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <libcork/core.h>\n\n#include \"ipset/bdd/nodes.h\"\n#include \"ipset/bits.h\"\n#include \"ipset/errors.h\"\n#include \"ipset/ipset.h\"\n\n\n/**\n * Given a BDD variable number, return the index of the corresponding\n * bit in an IP address.  IPv4 addresses use variables 1-32; IPv6\n * addresses use 1-128.  (Variable 0 is used to identify the kind of\n * address — TRUE for IPv4, FALSE for IPv6.)\n */\n\nstatic unsigned int\nIPSET_NAME(bit_for_var)(ipset_variable var)\n{\n    return (var - 1);\n}\n\n\n/**\n * An assignment function that can be used to evaluate an IP set BDD.\n */\n\nstatic bool\nIPSET_NAME(assignment)(const void *addr, ipset_variable var)\n{\n    if (var == 0) {\n        return IP_DISCRIMINATOR_VALUE;\n    } else {\n        unsigned int  bit = IPSET_NAME(bit_for_var)(var);\n        return IPSET_BIT_GET(addr, bit);\n    }\n}\n\n\nbool\nIPSET_PRENAME(contains)(const struct ip_set *set, CORK_IP *elem)\n{\n    return ipset_node_evaluate\n        (set->cache, set->set_bdd, IPSET_NAME(assignment), elem);\n}\n\n\nbool\nIPSET_NAME(add_network)(struct ip_set *set, CORK_IP *elem,\n                        unsigned int cidr_prefix)\n{\n    /* Special case — the BDD for a netmask that's out of range never\n     * evaluates to true. */\n    if (cidr_prefix > IP_BIT_SIZE) {\n        cork_error_set\n            (IPSET_ERROR, IPSET_PARSE_ERROR,\n             \"CIDR block %u out of range [0..%u]\", cidr_prefix, IP_BIT_SIZE);\n        return false;\n    }\n\n    ipset_node_id  new_bdd =\n        ipset_node_insert\n        (set->cache, set->set_bdd,\n         IPSET_NAME(assignment), elem, cidr_prefix + 1, 1);\n    bool  result = (new_bdd == set->set_bdd);\n    ipset_node_decref(set->cache, set->set_bdd);\n    set->set_bdd = new_bdd;\n    return result;\n}\n\n\nbool\nIPSET_NAME(add)(struct ip_set *set, CORK_IP *elem)\n{\n    ipset_node_id  new_bdd =\n        ipset_node_insert\n        (set->cache, set->set_bdd,\n         IPSET_NAME(assignment), elem, IP_BIT_SIZE + 1, 1);\n    bool  result = (new_bdd == set->set_bdd);\n    ipset_node_decref(set->cache, set->set_bdd);\n    set->set_bdd = new_bdd;\n    return result;\n}\n\n\nbool\nIPSET_NAME(remove)(struct ip_set *set, CORK_IP *elem)\n{\n    ipset_node_id  new_bdd =\n        ipset_node_insert\n        (set->cache, set->set_bdd,\n         IPSET_NAME(assignment), elem, IP_BIT_SIZE + 1, 0);\n    bool  result = (new_bdd == set->set_bdd);\n    ipset_node_decref(set->cache, set->set_bdd);\n    set->set_bdd = new_bdd;\n    return result;\n}\n\n\nbool\nIPSET_NAME(remove_network)(struct ip_set *set, CORK_IP *elem,\n                           unsigned int cidr_prefix)\n{\n    /* Special case — the BDD for a netmask that's out of range never\n     * evaluates to true. */\n    if (cidr_prefix > IP_BIT_SIZE) {\n        cork_error_set\n            (IPSET_ERROR, IPSET_PARSE_ERROR,\n             \"CIDR block %u out of range [0..%u]\", cidr_prefix, IP_BIT_SIZE);\n        return false;\n    }\n\n    ipset_node_id  new_bdd =\n        ipset_node_insert\n        (set->cache, set->set_bdd,\n         IPSET_NAME(assignment), elem, cidr_prefix + 1, 0);\n    bool  result = (new_bdd == set->set_bdd);\n    ipset_node_decref(set->cache, set->set_bdd);\n    set->set_bdd = new_bdd;\n    return result;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/set/inspection.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2009-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <libcork/core.h>\n\n#include \"ipset/bdd/nodes.h\"\n#include \"ipset/ipset.h\"\n\nbool\nipset_is_empty(const struct ip_set *set)\n{\n    /* Since BDDs are unique, the only empty set is the “false” BDD. */\n    return (set->set_bdd == ipset_terminal_node_id(false));\n}\n\nbool\nipset_is_equal(const struct ip_set *set1, const struct ip_set *set2)\n{\n    return ipset_node_cache_nodes_equal\n        (set1->cache, set1->set_bdd, set2->cache, set2->set_bdd);\n}\n\nsize_t\nipset_memory_size(const struct ip_set *set)\n{\n    return ipset_node_memory_size(set->cache, set->set_bdd);\n}\n\n\nbool\nipset_ip_add(struct ip_set *set, struct cork_ip *addr)\n{\n    if (addr->version == 4) {\n        return ipset_ipv4_add(set, &addr->ip.v4);\n    } else {\n        return ipset_ipv6_add(set, &addr->ip.v6);\n    }\n}\n\n\nbool\nipset_ip_add_network(struct ip_set *set, struct cork_ip *addr,\n                     unsigned int cidr_prefix)\n{\n    if (addr->version == 4) {\n        return ipset_ipv4_add_network(set, &addr->ip.v4, cidr_prefix);\n    } else {\n        return ipset_ipv6_add_network(set, &addr->ip.v6, cidr_prefix);\n    }\n}\n\n\nbool\nipset_ip_remove(struct ip_set *set, struct cork_ip *addr)\n{\n    if (addr->version == 4) {\n        return ipset_ipv4_remove(set, &addr->ip.v4);\n    } else {\n        return ipset_ipv6_remove(set, &addr->ip.v6);\n    }\n}\n\n\nbool\nipset_ip_remove_network(struct ip_set *set, struct cork_ip *addr,\n                        unsigned int cidr_prefix)\n{\n    if (addr->version == 4) {\n        return ipset_ipv4_remove_network(set, &addr->ip.v4, cidr_prefix);\n    } else {\n        return ipset_ipv6_remove_network(set, &addr->ip.v6, cidr_prefix);\n    }\n}\n\n\nbool\nipset_contains_ip(const struct ip_set *set, struct cork_ip *addr)\n{\n    if (addr->version == 4) {\n        return ipset_contains_ipv4(set, &addr->ip.v4);\n    } else {\n        return ipset_contains_ipv6(set, &addr->ip.v6);\n    }\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/set/ipv4_set.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2009-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n/*\n * The IPv4 and IPv6 set types are basically identical, except for the\n * names of the functions, and the size of the values that are being\n * stored.  Rather than having two mostly duplicate definitions of each\n * function, we define “template functions” where anything that depends\n * on the size of the IP address is defined using the following macros.\n */\n\n\n/* The name of the cork_ipvX type. */\n#define CORK_IP  struct cork_ipv4\n\n/* The number of bits in an IPvX address. */\n#define IP_BIT_SIZE  32\n\n/* The value of the discriminator variable for an IPvX address. */\n#define IP_DISCRIMINATOR_VALUE  true\n\n/* Creates a identifier of the form “ipset_ipv4_<basename>”. */\n#define IPSET_NAME(basename) ipset_ipv4_##basename\n\n/* Creates a identifier of the form “ipset_<basename>_ipv4”. */\n#define IPSET_PRENAME(basename) ipset_##basename##_ipv4\n\n\n/* Now include all of the templates. */\n#include \"inspection-template.c.in\"\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/set/ipv6_set.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2009-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n/*\n * The IPv4 and IPv6 set types are basically identical, except for the\n * names of the functions, and the size of the values that are being\n * stored.  Rather than having two mostly duplicate definitions of\n * each function, we define “template functions” where anything that\n * depends on the size of the IP address is defined using the\n * following macros.\n */\n\n\n/* The name of the cork_ipvX type. */\n#define CORK_IP  struct cork_ipv6\n\n/* The number of bits in an IPvX address. */\n#define IP_BIT_SIZE  128\n\n/* The value of the discriminator variable for an IPvX address. */\n#define IP_DISCRIMINATOR_VALUE  false\n\n/* Creates a identifier of the form “ipset_ipv6_<basename>”. */\n#define IPSET_NAME(basename) ipset_ipv6_##basename\n\n/* Creates a identifier of the form “ipset_<basename>_ipv6”. */\n#define IPSET_PRENAME(basename) ipset_##basename##_ipv6\n\n\n/* Now include all of the templates. */\n#include \"inspection-template.c.in\"\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/set/iterator.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2010-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <string.h>\n\n#include <libcork/core.h>\n\n#include \"ipset/bdd/nodes.h\"\n#include \"ipset/bits.h\"\n#include \"ipset/ipset.h\"\n#include \"ipset/logging.h\"\n\n\n#define IPV4_BIT_SIZE  32\n#define IPV6_BIT_SIZE  128\n\n\n/* Forward declarations */\n\nstatic void\nprocess_assignment(struct ipset_iterator *iterator);\n\nstatic void\nexpand_ipv6(struct ipset_iterator *iterator);\n\n\n/**\n * Find the highest non-EITHER bit in an assignment, starting from the\n * given bit index.\n */\nstatic unsigned int\nfind_last_non_either_bit(struct ipset_assignment *assignment,\n                         unsigned int starting_bit)\n{\n    unsigned int  i;\n\n    for (i = starting_bit; i >= 1; i--) {\n        enum ipset_tribool  value = ipset_assignment_get(assignment, i);\n        if (value != IPSET_EITHER) {\n            return i;\n        }\n    }\n\n    return 0;\n}\n\n\n/**\n * Create a generic IP address object from the current expanded\n * assignment.\n */\nstatic void\ncreate_ip_address(struct ipset_iterator *iterator)\n{\n    struct cork_ip  *addr = &iterator->addr;\n    struct ipset_expanded_assignment  *exp = iterator->assignment_iterator;\n\n    /* Initialize the address to all 0 bits. */\n    memset(addr, 0, sizeof(struct cork_ip));\n\n    /* Check variable 0 to see if this is an IPv4 or IPv6 address. */\n    addr->version = IPSET_BIT_GET(exp->values.buf, 0)? 4: 6;\n\n    /* Copy bits from the expanded assignment.  The number of bits to\n     * copy is given as the current netmask.  We'll have calculated that\n     * already based on the non-expanded assignment. */\n    unsigned int  i;\n    for (i = 0; i < iterator->cidr_prefix; i++) {\n        IPSET_BIT_SET(&addr->ip, i, IPSET_BIT_GET(exp->values.buf, i+1));\n    }\n\n#if IPSET_DEBUG\n    char  buf[CORK_IP_STRING_LENGTH];\n    cork_ip_to_raw_string(addr, buf);\n    DEBUG(\"Current IP address is %s/%u\", buf, iterator->cidr_prefix);\n#endif\n}\n\n\n/**\n * Advance the BDD iterator, taking into account that some assignments\n * need to be expanded twice.\n */\nstatic void\nadvance_assignment(struct ipset_iterator *iterator)\n{\n    /* Check the current state of the iterator to determine how to\n     * advance. */\n\n    /* In most cases, the assignment we just finished only needed to be\n     * expanded once.  So we move on to the next assignment and process\n     * it. */\n    if (CORK_LIKELY(iterator->multiple_expansion_state ==\n                    IPSET_ITERATOR_NORMAL))\n    {\n        ipset_bdd_iterator_advance(iterator->bdd_iterator);\n        process_assignment(iterator);\n        return;\n    }\n\n    /* If the assignment needs to be expanded twice, we'll do the IPv4\n     * expansion first.  If that's what we've just finished, do the IPv6\n     * expansion next. */\n\n    if (iterator->multiple_expansion_state == IPSET_ITERATOR_MULTIPLE_IPV4) {\n        DEBUG(\"Expanding IPv6 second\");\n\n        iterator->multiple_expansion_state = IPSET_ITERATOR_MULTIPLE_IPV6;\n        ipset_assignment_set\n            (iterator->bdd_iterator->assignment, 0, IPSET_FALSE);\n        expand_ipv6(iterator);\n        return;\n    }\n\n    /* If we've just finished the IPv6 expansion, then we've finished\n     * with this assignment.  Before moving on to the next one, we have\n     * to reset variable 0 to EITHER (which it was before we started\n     * this whole mess). */\n\n    if (iterator->multiple_expansion_state == IPSET_ITERATOR_MULTIPLE_IPV6) {\n        DEBUG(\"Finished both expansions\");\n\n        ipset_assignment_set\n            (iterator->bdd_iterator->assignment, 0, IPSET_EITHER);\n        ipset_bdd_iterator_advance(iterator->bdd_iterator);\n        process_assignment(iterator);\n        return;\n    }\n}\n\n\n/**\n * Process the current expanded assignment in the current BDD\n * assignment.\n */\nstatic void\nprocess_expanded_assignment(struct ipset_iterator *iterator)\n{\n    if (iterator->assignment_iterator->finished) {\n        /* If there isn't anything in the expanded assignment, advance\n         * to the next BDD assignment. */\n\n        DEBUG(\"Expanded assignment is finished\");\n        ipset_expanded_assignment_free(iterator->assignment_iterator);\n        iterator->assignment_iterator = NULL;\n        advance_assignment(iterator);\n    } else {\n        /* Otherwise, we've found a fully expanded assignment, so create\n         * an IP address for it and return. */\n        create_ip_address(iterator);\n    }\n}\n\n\n/**\n * Expand the current assignment as IPv4 addresses.\n */\nstatic void\nexpand_ipv4(struct ipset_iterator *iterator)\n{\n    unsigned int  last_bit;\n\n    if (iterator->summarize) {\n        last_bit = find_last_non_either_bit\n            (iterator->bdd_iterator->assignment, IPV4_BIT_SIZE);\n        DEBUG(\"Last non-either bit is %u\", last_bit);\n    } else {\n        last_bit = IPV4_BIT_SIZE;\n    }\n\n    iterator->assignment_iterator =\n        ipset_assignment_expand\n        (iterator->bdd_iterator->assignment, last_bit + 1);\n    iterator->cidr_prefix = last_bit;\n\n    process_expanded_assignment(iterator);\n}\n\n\n/**\n * Expand the current assignment as IPv4 addresses.\n */\nstatic void\nexpand_ipv6(struct ipset_iterator *iterator)\n{\n    unsigned int  last_bit;\n\n    if (iterator->summarize) {\n        last_bit = find_last_non_either_bit\n            (iterator->bdd_iterator->assignment, IPV6_BIT_SIZE);\n        DEBUG(\"Last non-either bit is %u\", last_bit);\n    } else {\n        last_bit = IPV6_BIT_SIZE;\n    }\n\n    iterator->assignment_iterator =\n        ipset_assignment_expand\n        (iterator->bdd_iterator->assignment, last_bit + 1);\n    iterator->cidr_prefix = last_bit;\n\n    process_expanded_assignment(iterator);\n}\n\n\n/**\n * Process the current assignment in the BDD iterator.\n */\n\nstatic void\nprocess_assignment(struct ipset_iterator *iterator)\n{\n    while (!iterator->bdd_iterator->finished) {\n        if (iterator->bdd_iterator->value == iterator->desired_value) {\n            /* If the BDD iterator hasn't finished, and the result of\n             * the function with this assignment matches what the caller\n             * wants, then we've found an assignment to generate IP\n             * addresses from.\n             *\n             * Try to expand this assignment, and process the first\n             * expanded assignment.  We want 32 + 1 variables if the\n             * current address is IPv4; 128 + 1 if it's IPv6. */\n\n            DEBUG(\"Got a matching BDD assignment\");\n            enum ipset_tribool  address_type = ipset_assignment_get\n                (iterator->bdd_iterator->assignment, 0);\n\n            if (address_type == IPSET_FALSE) {\n                /* FALSE means IPv6*/\n                DEBUG(\"Assignment is IPv6\");\n                iterator->multiple_expansion_state = IPSET_ITERATOR_NORMAL;\n                expand_ipv6(iterator);\n                return;\n            } else if (address_type == IPSET_TRUE) {\n                /* TRUE means IPv4*/\n                DEBUG(\"Assignment is IPv4\");\n                iterator->multiple_expansion_state = IPSET_ITERATOR_NORMAL;\n                expand_ipv4(iterator);\n                return;\n            } else {\n                /* EITHER means that this assignment contains both IPv4\n                 * and IPv6 addresses.  Expand it as IPv4 first. */\n                DEBUG(\"Assignment is both IPv4 and IPv6\");\n                DEBUG(\"Expanding IPv4 first\");\n                iterator->multiple_expansion_state =\n                    IPSET_ITERATOR_MULTIPLE_IPV4;\n                ipset_assignment_set\n                    (iterator->bdd_iterator->assignment, 0, IPSET_TRUE);\n                expand_ipv4(iterator);\n                return;\n            }\n        }\n\n        /* The BDD iterator has a value, but it doesn't match the one we\n         * want.  Advance the BDD iterator and try again. */\n        DEBUG(\"Value is %d, skipping\", iterator->bdd_iterator->value);\n        ipset_bdd_iterator_advance(iterator->bdd_iterator);\n    }\n\n    /* If we fall through, then the BDD iterator has finished.  That\n     * means there's nothing left for the set iterator. */\n\n    DEBUG(\"Set iterator is finished\");\n    ipset_expanded_assignment_free(iterator->assignment_iterator);\n    iterator->assignment_iterator = NULL;\n\n    ipset_bdd_iterator_free(iterator->bdd_iterator);\n    iterator->bdd_iterator = NULL;\n    iterator->finished = true;\n}\n\n\nstatic struct ipset_iterator *\ncreate_iterator(struct ip_set *set, bool desired_value, bool summarize)\n{\n    /* First allocate the iterator itself. */\n    struct ipset_iterator  *iterator = cork_new(struct ipset_iterator);\n    iterator->finished = false;\n    iterator->assignment_iterator = NULL;\n    iterator->desired_value = desired_value;\n    iterator->summarize = summarize;\n\n    /* Then create the iterator that returns each BDD assignment. */\n    DEBUG(\"Iterating set\");\n    iterator->bdd_iterator = ipset_node_iterate(set->cache, set->set_bdd);\n\n    /* Then drill down from the current BDD assignment, creating an\n     * expanded assignment for it. */\n    process_assignment(iterator);\n    return iterator;\n}\n\n\nstruct ipset_iterator *\nipset_iterate(struct ip_set *set, bool desired_value)\n{\n    return create_iterator(set, desired_value, false);\n}\n\n\nstruct ipset_iterator *\nipset_iterate_networks(struct ip_set *set, bool desired_value)\n{\n    return create_iterator(set, desired_value, true);\n}\n\n\nvoid\nipset_iterator_free(struct ipset_iterator *iterator)\n{\n    if (iterator->bdd_iterator != NULL) {\n        ipset_bdd_iterator_free(iterator->bdd_iterator);\n    }\n    if (iterator->assignment_iterator != NULL) {\n        ipset_expanded_assignment_free(iterator->assignment_iterator);\n    }\n    free(iterator);\n}\n\n\nvoid\nipset_iterator_advance(struct ipset_iterator *iterator)\n{\n    /* If we're already at the end of the iterator, don't do anything. */\n\n    if (CORK_UNLIKELY(iterator->finished)) {\n        return;\n    }\n\n    /* Otherwise, advance the expanded assignment iterator to the next\n     * assignment, and then drill down into it. */\n\n    DEBUG(\"Advancing set iterator\");\n    ipset_expanded_assignment_advance(iterator->assignment_iterator);\n    process_expanded_assignment(iterator);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libipset/set/storage.c",
    "content": "/* -*- coding: utf-8 -*-\n * ----------------------------------------------------------------------\n * Copyright © 2010-2012, RedJack, LLC.\n * All rights reserved.\n *\n * Please see the LICENSE.txt file in this distribution for license\n * details.\n * ----------------------------------------------------------------------\n */\n\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include <libcork/core.h>\n\n#include \"ipset/bdd/nodes.h\"\n#include \"ipset/errors.h\"\n#include \"ipset/ipset.h\"\n\n\nstatic void\ncreate_errno_error(FILE *stream)\n{\n    if (ferror(stream)) {\n        cork_error_set(IPSET_ERROR, IPSET_IO_ERROR, \"%s\", strerror(errno));\n    } else {\n        cork_unknown_error();\n    }\n}\n\nstruct file_consumer {\n    /* file_consumer is a subclass of cork_stream_consumer */\n    struct cork_stream_consumer  parent;\n    /* the file to write the data into */\n    FILE  *fp;\n};\n\nstatic int\nfile_consumer_data(struct cork_stream_consumer *vself,\n                   const void *buf, size_t size, bool is_first)\n{\n    struct file_consumer  *self =\n        cork_container_of(vself, struct file_consumer, parent);\n    size_t  bytes_written = fwrite(buf, 1, size, self->fp);\n    /* If there was an error writing to the file, then signal this to\n     * the producer */\n    if (bytes_written == size) {\n        return 0;\n    } else {\n        create_errno_error(self->fp);\n        return -1;\n    }\n}\n\nstatic int\nfile_consumer_eof(struct cork_stream_consumer *vself)\n{\n    /* We don't close the file, so there's nothing special to do at\n     * end-of-stream. */\n    return 0;\n}\n\nint\nipset_save_to_stream(struct cork_stream_consumer *stream,\n                     const struct ip_set *set)\n{\n    return ipset_node_cache_save(stream, set->cache, set->set_bdd);\n}\n\nint\nipset_save(FILE *fp, const struct ip_set *set)\n{\n    struct file_consumer  stream = {\n        { file_consumer_data, file_consumer_eof, NULL }, fp\n    };\n    return ipset_save_to_stream(&stream.parent, set);\n}\n\n\nint\nipset_save_dot(FILE *fp, const struct ip_set *set)\n{\n    struct file_consumer  stream = {\n        { file_consumer_data, file_consumer_eof, NULL }, fp\n    };\n    return ipset_node_cache_save_dot(&stream.parent, set->cache, set->set_bdd);\n}\n\n\nstruct ip_set *\nipset_load(FILE *stream)\n{\n    struct ip_set  *set;\n    ipset_node_id  new_bdd;\n\n    set = ipset_new();\n    new_bdd = ipset_node_cache_load(stream, set->cache);\n    if (cork_error_occurred()) {\n        ipset_free(set);\n        return NULL;\n    }\n\n    set->set_bdd = new_bdd;\n    return set;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/.travis.yml",
    "content": "language: c\n\nos:\n - linux\n - osx\n\ncompiler:\n - clang\n - gcc\n - g++\n\nbefore_script:\n - ./autogen.sh\n\nscript:\n - ./configure --disable-dependency-tracking\n - make distcheck\n - make distclean\n - ./configure --disable-dependency-tracking --enable-minimal\n - make distcheck\n\nenv:\n  global:\n   - secure: \"P4qv8aX+nogLlSy0lTMDIR6I5OLXq+qMijB4s+oCLME5BL2xPAn3v0QG5IoHdnU0ncRc1tEYZxN3F48Rp+Q7+wEVqSBLFS3oXzfNHJGEYoiaAcPNWO0R1kF8rcy8AuoAEomNeYS+5vhzQtaXklNtx/250p6MgGuMsdpMsRUKS/U=\"\n\naddons:\n  coverity_scan:\n    project:\n      name: \"jedisct1/libsodium\"\n      description: \"libsodium\"\n      notification_email: coverityscan@pureftpd.org\n      build_command_prepend: \"./autogen.sh ; ./configure\"\n      build_command: \"make -j4\"\n      branch_pattern: coverity_scan\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/AUTHORS",
    "content": "\nDesigners\n=========\n\nblake2                                 Jean-Philippe Aumasson\n                                       Christian Winnerlein\n                                       Samuel Neves\n                                       Zooko Wilcox-O'Hearn\n\nchacha20                               Daniel J. Bernstein\n\nsalsa20                                Daniel J. Bernstein\n\nchacha20poly1305                       Adam Langley\n\ncurve25519                             Daniel J. Bernstein\n\ncurve25519xsalsa20poly1305             Daniel J. Bernstein\n\ned25519                                Daniel J. Bernstein\n                                       Bo-Yin Yang\n                                       Niels Duif\n                                       Peter Schwabe\n                                       Tanja Lange\n\npoly1305                               Daniel J. Bernstein\n\nsiphash                                Jean-Philippe Aumasson\n                                       Daniel J. Bernstein\n\nscrypt                                 Colin Percival\n\nImplementors\n============\n\ncrypto_aead/aes256gcm/aesni            Romain Dolbeau\n                                       Frank Denis\n\ncrypto_aead/chacha20poly1305           Frank Denis\n\ncrypto_box/curve25519xsalsa20poly1305  Daniel J. Bernstein\n\ncrypto_core/hsalsa20                   Daniel J. Bernstein\ncrypto_core/salsa20\ncrypto_core/salsa2012\ncrypto_core/salsa208\n\ncrypto_hash/sha256                     Colin Percival\ncrypto_hash/sha512\ncrypto_hash/sha512256\n\ncrypto_auth/hmacsha256                 Colin Percival\ncrypto_auth/hmacsha512\ncrypto_auth/hmacsha512256\n\ncrypto_scalarmult/curve25519/ref10     Daniel J. Bernstein\n\ncrypto_scalarmult/curve25519/donna_c64 Adam Langley\n\ncrypto_scalarmult/curve25519/sandy2x   Tung Chou\n\ncrypto_secretbox/xsalsa20poly1305      Daniel J. Bernstein\n\ncrypto_sign/ed25519                    Peter Schwabe\n                                       Daniel J. Bernstein\n                                       Niels Duif\n                                       Tanja Lange\n                                       Bo-Yin Yang\n\ncrypto_stream/aes128ctr                Peter Schwabe\n\ncrypto_stream/chacha20/ref             Daniel J. Bernstein\n\ncrypto_stream/chacha20/vec             Ted Krovetz\n\ncrypto_stream/salsa20                  Daniel J. Bernstein\ncrypto_stream/salsa2012\ncrypto_stream/salsa208\ncrypto_stream/xsalsa20\n\ncrypto_shorthash/siphash24             Jean-Philippe Aumasson\n                                       Daniel J. Bernstein\n\ncrypto_generichash/blake2b             Jean-Philippe Aumasson\n                                       Christian Winnerlein\n                                       Samuel Neves\n                                       Zooko Wilcox-O'Hearn\n\ncrypto_onetimeauth/poly1305/donna      Andrew \"floodyberry\" Moon\n\ncrypto_onetimeauth/poly1305/sse2       Andrew \"floodyberry\" Moon\n\ncrypto_pwhash/scryptsalsa208sha256     Colin Percival\n                                       Alexander Peslyak\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 2.8.4)\nproject(libsodium_Cmake C CXX ASM)\n\n#TODO?: Add mmx, SSE2, SSE3, SSSE3 checks.\n#TODO?: More of the emscripten stuff.\n\nINCLUDE(CheckCCompilerFlag)\n\n\n#----------------------------------------------------------\n######################### OPTIONS #########################\n#----------------------------------------------------------\n# Default values\nset (LIBSODIUM_BUILD_SHARED_LIBRARIES OFF)\nset (ENABLE_BLOCKING_RANDOM ON)\nset (ENABLE_MINIMAL_BUILD OFF)\nset (ENABLE_TESTS OFF)\nset (DISABLE_ASM ON)\nset (DISABLE_PIE OFF)\nset (DISABLE_SSP ON)\n\n#OPTION(LIBSODIUM_BUILD_SHARED_LIBRARIES \"Build the library dynamically (ON/TRUE) or statically (OFF/FALSE).\")\n#OPTION(ENABLE_BLOCKING_RANDOM           \"Enable this switch only if /dev/urandom is totally broken on the target platform.\")\n#OPTION(ENABLE_MINIMAL_BUILD             \"Only compile the minimum set of functions required for the high-level API.\")\n#OPTION(ENABLE_TESTS                     \"Enable testing.\")\n#OPTION(DISABLE_ASM                      \"Disable AMD64 assembly implementations.\")\n#OPTION(DISABLE_PIE                      \"Do not produce position independent executables.\")\n#OPTION(DISABLE_SSP                      \"Do not compile with -fstack-protector.\")\n\n\n#----------------------------------------------------------\n######################### VERSION #########################\n#----------------------------------------------------------\n\nSET(VERSION 1.0.3)\nSET(SODIUM_LIBRARY_VERSION_MAJOR 7)\nSET(SODIUM_LIBRARY_VERSION_MINOR 5)\nSET(DLL_VERSION 6)\n\nSET(SODIUM_LIBRARY_VERSION \"15:0:2\")\n#                            | | |\n#                     +------+ | +---+\n#                     |        |     |\n#                  current:revision:age\n#                     |        |     |\n#                     |        |     +- increment if interfaces have been added\n#                     |        |        set to zero if interfaces have been removed\n#                     |        |        or changed\n#                     |        +- increment if source code has changed\n#                     |           set to zero if current is incremented\n#                     +- increment if interfaces have been added, removed or changed\n\nCONFIGURE_FILE(${CMAKE_CURRENT_SOURCE_DIR}/src/libsodium/include/sodium/version.h.in ${CMAKE_CURRENT_BINARY_DIR}/src/libsodium/include/sodium/version.h)\n\n\n#----------------------------------------------------------\n###################### SYSTEM CHECKS ######################\n#----------------------------------------------------------\n\nMESSAGE(\"---------------- PERFORMING SYSTEM CHECKS. ----------------\")\n\n# MSVC does not provide inline in C (only CXX)\nIF(MSVC)\n    ADD_DEFINITIONS(\"-Dinline=__inline\")\nENDIF(MSVC)\n\n#Endianess check\nINCLUDE(TestBigEndian)\nTEST_BIG_ENDIAN(BIG_ENDIAN)\n\nIF(${BIG_ENDIAN})\n    SET(IS_BIG_ENDIAN ON)\n    ADD_DEFINIIONS(\"-DNATIVE_BIG_ENDIAN=1\")\n    MESSAGE(\"System is in Big Endian.\")\nELSE(${BIG_ENDIAN})\n    SET(IS_BIG_ENDIAN OFF)\n    ADD_DEFINITIONS(\"-DNATIVE_LITTLE_ENDIAN=1\")\n    MESSAGE(\"System is in Little Endian.\")\nENDIF(${BIG_ENDIAN})\n\n\nIF(EMSCRIPTEN)\n    SET(DISABLE_ASM ON)\n    MESSAGE(\"Compiling to javascript, disabling asm implementations.\")\nENDIF()\n\n\nIF(MSYS OR MINGW OR CYGWIN)\n    SET(DISABLE_PIE ON)\nENDIF()\n\n\n#TI mode check\nIF(${IS_BIGENDIAN})\n    TRY_COMPILE(HAVE_TI_MODE_COMPILE ${CMAKE_CURRENT_BINARY_DIR}/build ${CMAKE_CURRENT_SOURCE_DIR}/test/HAVE_TI_MODE.c COMPILE_DEFINITIONS -DNATIVE_BIG_ENDIAN=1)\nELSE(${IS_BIGENDIAN})\n    TRY_COMPILE(HAVE_TI_MODE_COMPILE ${CMAKE_CURRENT_BINARY_DIR}/build ${CMAKE_CURRENT_SOURCE_DIR}/test/HAVE_TI_MODE.c COMPILE_DEFINITIONS -DNATIVE_LITTLE_ENDIAN=1)\nENDIF(${IS_BIGENDIAN})\n\nIF(HAVE_TI_MODE_COMPILE)\n\n    SET(libsodium_HEADERS ${libsodium_HEADERS}\n#        src/libsodium/crypto_scalarmult/curve25519/donna_c64/api.h\n    )\n\n    SET(libsodium_SOURCE ${libsodium_SOURCE}\n        src/libsodium/crypto_scalarmult/curve25519/donna_c64/curve25519_donna_c64.c\n    )\n\n    ADD_DEFINITIONS(-DHAVE_TI_MODE)\n\n    MESSAGE(\"Gcc TI Mode is available.\")\n\nELSE(HAVE_TI_MODE_COMPILE)\n\n    SET(libsodium_HEADERS ${libsodium_HEADERS}\n#        src/libsodium/crypto_scalarmult/curve25519/ref10/api.h\n        src/libsodium/crypto_scalarmult/curve25519/ref10/fe.h\n        src/libsodium/crypto_scalarmult/curve25519/ref10/montgomery.h\n        src/libsodium/crypto_scalarmult/curve25519/ref10/pow225521.h\n\n    )\n\n    SET(libsodium_SOURCE ${libsodium_SOURCE}\n        src/libsodium/crypto_scalarmult/curve25519/ref10/curve25519_ref10.c\n        src/libsodium/crypto_scalarmult/curve25519/ref10/fe_0_curve25519_ref10.c\n        src/libsodium/crypto_scalarmult/curve25519/ref10/fe_1_curve25519_ref10.c\n        src/libsodium/crypto_scalarmult/curve25519/ref10/fe_add_curve25519_ref10.c\n        src/libsodium/crypto_scalarmult/curve25519/ref10/fe_copy_curve25519_ref10.c\n        src/libsodium/crypto_scalarmult/curve25519/ref10/fe_cswap_curve25519_ref10.c\n        src/libsodium/crypto_scalarmult/curve25519/ref10/fe_frombytes_curve25519_ref10.c\n        src/libsodium/crypto_scalarmult/curve25519/ref10/fe_invert_curve25519_ref10.c\n        src/libsodium/crypto_scalarmult/curve25519/ref10/fe_mul_curve25519_ref10.c\n        src/libsodium/crypto_scalarmult/curve25519/ref10/fe_mul121666_curve25519_ref10.c\n        src/libsodium/crypto_scalarmult/curve25519/ref10/fe_sq_curve25519_ref10.c\n        src/libsodium/crypto_scalarmult/curve25519/ref10/fe_sub_curve25519_ref10.c\n        src/libsodium/crypto_scalarmult/curve25519/ref10/fe_tobytes_curve25519_ref10.c\n    )\n\n    MESSAGE(\"Gcc TI Mode is not available.\")\n\nENDIF(HAVE_TI_MODE_COMPILE)\n\n\n#Check if weak symbols are supported.\nTRY_COMPILE(HAVE_WEAK_SYMBOLS_COMPILE ${CMAKE_CURRENT_BINARY_DIR}/build ${CMAKE_CURRENT_SOURCE_DIR}/test/HAVE_WEAK_SYMBOLS.c)\nIF(HAVE_WEAK_SYMBOLS_COMPILE)\n    ADD_DEFINITIONS(\"-DHAVE_WEAK_SYMBOLS\")\n    MESSAGE(\"Weak Symbols are supported.\")\nELSE(HAVE_WEAK_SYMBOLS_COMPILE)\n    MESSAGE(\"Weak Symbols are not supported.\")\n    SET(TEST ON)\nENDIF(HAVE_WEAK_SYMBOLS_COMPILE)\n\n\n#Is __STDC_LIMIT_MACROS needed check.\nTRY_COMPILE(IS_STDC_LIMIT_MACROS_NEEDED_COMPILE ${CMAKE_CURRENT_BINARY_DIR}/build ${CMAKE_CURRENT_SOURCE_DIR}/test/IS_STDC_LIMIT_MACROS_NEEDED.c)\nIF(IS_STDC_LIMIT_MACROS_NEEDED_COMPILE)\n    #If this works then we dont need to define __STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS.\n    MESSAGE(\"__STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS not needed.\")\nELSE(IS_STDC_LIMIT_MACROS_NEEDED_COMPILE)\n    ADD_DEFINITIONS(\"-D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS\")\n    MESSAGE(\"__STDC_LIMIT_MACROS and __STDC_CONSTANT_MACROS is needed and was added to the definitions.\")\nENDIF(IS_STDC_LIMIT_MACROS_NEEDED_COMPILE)\n\n\n#Is there a functionnal ASM compiler\nSET(CMAKE_ASM_SOURCE_FILE_EXTENSIONS \"s;S\")\nENABLE_LANGUAGE(ASM)\n\nIF(CMAKE_ASM_COMPILER_WORKS)\n    SET(ASSEMBLER_AVAILABLE ON)\n    MESSAGE(\"An ASM compiler has been found and is functionnal.\")\nELSE(CMAKE_ASM_COMPILER_WORKS)\n    SET(ASSEMBLER_AVAILABLE OFF)\n    MESSAGE(FATAL \"An ASM compiler has not been found or is not functionnal.\")\nENDIF(CMAKE_ASM_COMPILER_WORKS)\n\n\n#cpuid instruction check\nTRY_COMPILE(IS_CPUID_INSTRUCTION_AVAILABLE_COMPILE ${CMAKE_CURRENT_BINARY_DIR}/build ${CMAKE_CURRENT_SOURCE_DIR}/test/HAVE_CPUID.c)\nIF(IS_CPUID_INSTRUCTION_AVAILABLE_COMPILE)\n    SET(IS_CPUID_INSTRUCTION_AVAILABLE ON)\n    ADD_DEFINITIONS(\"-DHAVE_CPUID\")\n    MESSAGE(\"Cpuid instruction is available.\")\nELSE(IS_CPUID_INSTRUCTION_AVAILABLE_COMPILE)\n    SET(IS_CPUID_INSTRUCTION_AVAILABLE OFF)\n    MESSAGE(\"Cpuid instruction is not available.\")\nENDIF(IS_CPUID_INSTRUCTION_AVAILABLE_COMPILE)\n\n\n#Have AMD64 ASM check\nIF(DISABLE_ASM)\n\n    MESSAGE(\"AMD64 ASM implementations have been disabled.\")\n\n    SET(libsodium_HEADERS ${libsodium_HEADERS}\n#        src/libsodium/crypto_stream/salsa20/ref/api.h\n    )\n\n    SET(libsodium_SOURCE ${libsodium_SOURCE}\n        src/libsodium/crypto_stream/salsa20/ref/stream_salsa20_ref.c\n        src/libsodium/crypto_stream/salsa20/ref/xor_salsa20_ref.c\n    )\n\nELSE(DISABLE_ASM)\n\n    IF(ASSEMBLER_AVAILABLE)\n\n        TRY_COMPILE(HAVE_AMD64_ASM_COMPILE ${CMAKE_CURRENT_BINARY_DIR}/build ${CMAKE_CURRENT_SOURCE_DIR}/test/HAVE_AMD64_ASM.c)\n        IF(HAVE_AMD64_ASM_COMPILE)\n            ADD_DEFINITIONS(-DHAVE_AMD64_ASM=1)\n\n            SET(libsodium_HEADERS ${libsodium_HEADERS}\n#                src/libsodium/crypto_stream/salsa20/amd64_xmm6/api.h\n            )\n\n            SET(libsodium_SOURCE ${libsodium_SOURCE}\n                src/libsodium/crypto_stream/salsa20/amd64_xmm6/stream_salsa20_amd64_xmm6.S\n            )\n\n            MESSAGE(\"AMD64 ASM is available.\")\n\n        ELSE(HAVE_AMD64_ASM_COMPILE)\n\n            SET(libsodium_HEADERS ${libsodium_HEADERS}\n#                src/libsodium/crypto_stream/salsa20/ref/api.h\n            )\n\n            SET(libsodium_SOURCE ${libsodium_SOURCE}\n                src/libsodium/crypto_stream/salsa20/ref/stream_salsa20_ref.c\n                src/libsodium/crypto_stream/salsa20/ref/xor_salsa20_ref.c\n            )\n\n            MESSAGE(\"AMD64 ASM is not available.\")\n\n        ENDIF(HAVE_AMD64_ASM_COMPILE)\n    ENDIF(ASSEMBLER_AVAILABLE)\nENDIF(DISABLE_ASM)\n\n\nMESSAGE(\"---------------- DONE WITH SYSTEM CHECKS. -----------------\")\nMESSAGE(\"                                                           \")\n\n\n#----------------------------------------------------------\n################### COMPILER FLAG CHECKS ##################\n#----------------------------------------------------------\n\n#Compiler flag check macro definition.\nMACRO(CHECK_COMPILER_FLAG)\n\n    SET(FLAG \"-${ARGV0}\")\n    SET(IS_${ARGV0}_AVAILABLE)\n\n    CHECK_C_COMPILER_FLAG(${FLAG} IS_${ARGV0}_AVAILABLE)\n\n    IF(IS_${ARGV0}_AVAILABLE)\n        SET(CMAKE_C_FLAGS \"${CMAKE_C_FLAGS} ${FLAG}\")\n        MESSAGE(\"Checking if ${FLAG} is available... It is available.\")\n    ELSE(IS_${ARGV0}_AVAILABLE)\n        MESSAGE(\"Checking if ${FLAG} is available... It is not available.\")\n    ENDIF(IS_${ARGV0}_AVAILABLE)\n\nENDMACRO(CHECK_COMPILER_FLAG)\n\n\nMESSAGE(\"------------- PERFORMING COMPILER FLAG CHECKS. ------------\")\n\n\n#Check if debug mode is active\nIF(CMAKE_BUILD_TYPE MATCHES Debug)\n    MESSAGE(\"-- Debug build enabled. --\")\n    ADD_DEFINITIONS(\"-DDEBUG=1\")\n    CHECK_COMPILER_FLAG(O)\n    CHECK_COMPILER_FLAG(g3)\nELSE(CMAKE_BUILD_TYPE MATCHES Debug)\n    MESSAGE(\"-- Release build enabled. --\")\n    CHECK_COMPILER_FLAG(O3)\nENDIF(CMAKE_BUILD_TYPE MATCHES Debug)\n\n#Check if -std=c99 is available.\nCHECK_COMPILER_FLAG(std=c99)\n\n#Check if -D_FORTIFY_SOURCE=2 is available.\nCHECK_COMPILER_FLAG(D_FORTIFY_SOURCE=2)\n\n#Check if clang and if -Wno-unknown-warning-option is available.\nIF(\"${CMAKE_C_COMPILER_ID}\" OR \"${CMAKE_CXX_COMPILER_ID}\" STREQUAL \"Clang\")\n    CHECK_COMPILER_FLAG(Wno-unknown-warning-option)\nENDIF()\n\nIF(NOT (MSYS OR MINGW OR CYGWIN))\n    #Check if -fPIC is available.\n    CHECK_COMPILER_FLAG(fPIC)\nELSE(NOT (MSYS OR MINGW OR CYGWIN))\n    CHECK_COMPILER_FLAG(Wl,--dynamicbase)\n    CHECK_COMPILER_FLAG(Wl,--nxcompat)\nENDIF(NOT (MSYS OR MINGW OR CYGWIN))\n\n#Check if -fPIE is available.\nIF(NOT DISABLE_PIE)\n    CHECK_COMPILER_FLAG(fPIE)\nENDIF(NOT DISABLE_PIE)\n\n#Check if -Wall is available.\nCHECK_COMPILER_FLAG(Wall)\n\n#Check if -Wextra is available.\nCHECK_COMPILER_FLAG(Wextra)\n\n#Check if -fvisibility=hidden is available\nCHECK_COMPILER_FLAG(fvisibility=hidden)\n\n#Check if -fno-strict-aliasing is available.\nCHECK_COMPILER_FLAG(fno-strict-aliasing)\n\n#Check if -fno-strict-overflow is available.\nCHECK_COMPILER_FLAG(fno-strict-overflow)\nIF(NOT IS_fno-strict-overflow_AVAILABLE)\n    #If -fno-strict-overflow is not available, try with -fwrapv.\n    CHECK_COMPILER_FLAG(fwrapv)\nENDIF()\n\nIF(NOT DISABLE_SSP)\n    #Check if -fstack-protector is available.\n    CHECK_COMPILER_FLAG(fstack-protector)\nENDIF(NOT DISABLE_SSP)\n\n#Check if -Winit-self is available.\nCHECK_COMPILER_FLAG(Winit-self)\n\n#Check if -Wwrite-strings is available.\nCHECK_COMPILER_FLAG(Wwrite-strings)\n\n#Check if -Wdiv-by-zero is available.\nCHECK_COMPILER_FLAG(Wdiv-by-zero)\n\n#Check if -Wsometimes-uninitialized is available.\nCHECK_COMPILER_FLAG(Wsometimes-uninitialized)\n\n#Check if -Wbad-function-cast is available.\nCHECK_COMPILER_FLAG(Wbad-function-cast)\n\n#Check if -Wcast-align is available.\nCHECK_COMPILER_FLAG(Wcast-align)\n\n#Check if -Wcast-qual is available.\nCHECK_COMPILER_FLAG(Wcast-qual)\n\n#Check if -Wchar-subscripts is available.\nCHECK_COMPILER_FLAG(Wchar-subscripts)\n\n#Check if -Wcomment is available.\nCHECK_COMPILER_FLAG(Wcomment)\n\n#Check if -Wfloat-equal is available.\nCHECK_COMPILER_FLAG(Wfloat-equal)\n\n#Check if -Wformat=2 is available.\nCHECK_COMPILER_FLAG(Wformat=2)\n\n#Check if -Wimplicit is available.\nCHECK_COMPILER_FLAG(Wimplicit)\n\n#Check if -Wmissing-declarations is available.\nCHECK_COMPILER_FLAG(Wmissing-declarations)\n\n#Check if -Wmissing-prototypes is available.\nCHECK_COMPILER_FLAG(Wmissing-prototypes)\n\n#Check if -Wnormalized=id is available.\nCHECK_COMPILER_FLAG(Wnormalized=id)\n\n#Check if -Woverride-init is available.\nCHECK_COMPILER_FLAG(Woverride-init)\n\n#Check if -Wparentheses is available.\nCHECK_COMPILER_FLAG(Wparentheses)\n\n#Check if -Wpointer-arith is available.\nCHECK_COMPILER_FLAG(Wpointer-arith)\n\n#Check if -Wredundant-decls is available.\nCHECK_COMPILER_FLAG(Wredundant-decls)\n\n#Check if -Wstrict-prototypes is available.\nCHECK_COMPILER_FLAG(Wstrict-prototypes)\n\n#Check if -Wswitch-enum is available.\nCHECK_COMPILER_FLAG(Wswitch-enum)\n\n#Check if -Wvariable-dec is available.\nCHECK_COMPILER_FLAG(Wvariable-decl)\n\n##Check if -Wl,-z,relro is available.\n#CHECK_COMPILER_FLAG(Wl,-z,relro)\n#\n##Check if -Wl,-z,now is available.\n#CHECK_COMPILER_FLAG(Wl,-z,now)\n#\n##Check if -Wl,-z,noexecstack is available.\n#CHECK_COMPILER_FLAG(Wl,-z,noexecstack)\n\n#Check if -Wl,--verbose is available and enable it.\n#CHECK_COMPILER_FLAG(Wl,--verbose)\n\n\nMESSAGE(\"------------- DONE WITH COMPILER FLAG CHECKS. -------------\")\nMESSAGE(\"                                                           \")\n\n\n#----------------------------------------------------------\n##################### SOURCE / HEADERS ####################\n#----------------------------------------------------------\n\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src)\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/libsodium)\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/libsodium/include)\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/src/libsodium/include/sodium)\n#For version.h.in to version.h\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/src/libsodium/include/sodium)\n\nSET(libsodium_HEADERS ${libsodium_HEADERS}\n    src/libsodium/include/sodium.h\n    src/libsodium/include/sodium/core.h\n    src/libsodium/include/sodium/crypto_aead_chacha20poly1305.h\n    src/libsodium/include/sodium/crypto_auth.h\n    src/libsodium/include/sodium/crypto_auth_hmacsha256.h\n    src/libsodium/include/sodium/crypto_auth_hmacsha512.h\n    src/libsodium/include/sodium/crypto_auth_hmacsha512256.h\n    src/libsodium/include/sodium/crypto_box.h\n    src/libsodium/include/sodium/crypto_box_curve25519xsalsa20poly1305.h\n    src/libsodium/include/sodium/crypto_core_hsalsa20.h\n    src/libsodium/include/sodium/crypto_core_salsa20.h\n    src/libsodium/include/sodium/crypto_core_salsa2012.h\n    src/libsodium/include/sodium/crypto_core_salsa208.h\n    src/libsodium/include/sodium/crypto_generichash.h\n    src/libsodium/include/sodium/crypto_generichash_blake2b.h\n    src/libsodium/include/sodium/crypto_hash.h\n    src/libsodium/include/sodium/crypto_hash_sha256.h\n    src/libsodium/include/sodium/crypto_hash_sha512.h\n    src/libsodium/include/sodium/crypto_onetimeauth.h\n    src/libsodium/include/sodium/crypto_onetimeauth_poly1305.h\n    src/libsodium/include/sodium/crypto_pwhash_scryptsalsa208sha256.h\n    src/libsodium/include/sodium/crypto_scalarmult.h\n    src/libsodium/include/sodium/crypto_scalarmult_curve25519.h\n    src/libsodium/include/sodium/crypto_secretbox.h\n    src/libsodium/include/sodium/crypto_secretbox_xsalsa20poly1305.h\n    src/libsodium/include/sodium/crypto_shorthash.h\n    src/libsodium/include/sodium/crypto_shorthash_siphash24.h\n    src/libsodium/include/sodium/crypto_sign.h\n    src/libsodium/include/sodium/crypto_sign_ed25519.h\n    src/libsodium/include/sodium/crypto_sign_edwards25519sha512batch.h\n    src/libsodium/include/sodium/crypto_stream.h\n    src/libsodium/include/sodium/crypto_stream_aes128ctr.h\n    src/libsodium/include/sodium/crypto_stream_chacha20.h\n    src/libsodium/include/sodium/crypto_stream_salsa20.h\n    src/libsodium/include/sodium/crypto_stream_salsa2012.h\n    src/libsodium/include/sodium/crypto_stream_salsa208.h\n    src/libsodium/include/sodium/crypto_stream_xsalsa20.h\n    src/libsodium/include/sodium/crypto_int32.h\n    src/libsodium/include/sodium/crypto_int64.h\n    src/libsodium/include/sodium/crypto_uint16.h\n    src/libsodium/include/sodium/crypto_uint32.h\n    src/libsodium/include/sodium/crypto_uint64.h\n    src/libsodium/include/sodium/crypto_uint8.h\n    src/libsodium/include/sodium/crypto_verify_16.h\n    src/libsodium/include/sodium/crypto_verify_32.h\n    src/libsodium/include/sodium/crypto_verify_64.h\n    src/libsodium/include/sodium/export.h\n    src/libsodium/include/sodium/randombytes.h\n    src/libsodium/include/sodium/randombytes_salsa20_random.h\n    src/libsodium/include/sodium/randombytes_sysrandom.h\n    src/libsodium/include/sodium/runtime.h\n    src/libsodium/include/sodium/utils.h\n    ${CMAKE_CURRENT_BINARY_DIR}/src/libsodium/include/sodium/version.h\n#    src/libsodium/crypto_auth/hmacsha256/cp/api.h\n#    src/libsodium/crypto_auth/hmacsha512/cp/api.h\n#    src/libsodium/crypto_auth/hmacsha512256/cp/api.h\n#    src/libsodium/crypto_box/curve25519xsalsa20poly1305/ref/api.h\n#    src/libsodium/crypto_core/hsalsa20/ref2/api.h\n#    src/libsodium/crypto_core/salsa20/ref/api.h\n    src/libsodium/crypto_generichash/blake2/ref/blake2-impl.h\n    src/libsodium/crypto_generichash/blake2/ref/blake2.h\n    src/libsodium/crypto_generichash/blake2/ref/blake2b-round.h\n#    src/libsodium/crypto_hash/sha256/cp/api.h\n#    src/libsodium/crypto_hash/sha512/cp/api.h\n    src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna.h\n    src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna32.h\n    src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna64.h\n    src/libsodium/crypto_pwhash/scryptsalsa208sha256/crypto_scrypt.h\n    src/libsodium/crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.h\n    src/libsodium/crypto_pwhash/scryptsalsa208sha256/sysendian.h\n#    src/libsodium/crypto_secretbox/xsalsa20poly1305/ref/api.h\n#    src/libsodium/crypto_shorthash/siphash24/ref/api.h\n    src/libsodium/crypto_sign/ed25519/ref10/base.h\n    src/libsodium/crypto_sign/ed25519/ref10/base2.h\n#    src/libsodium/crypto_sign/ed25519/ref10/api.h\n    src/libsodium/crypto_sign/ed25519/ref10/d.h\n    src/libsodium/crypto_sign/ed25519/ref10/d2.h\n    src/libsodium/crypto_sign/ed25519/ref10/fe.h\n    src/libsodium/crypto_sign/ed25519/ref10/ge.h\n    src/libsodium/crypto_sign/ed25519/ref10/ge_add.h\n    src/libsodium/crypto_sign/ed25519/ref10/ge_madd.h\n    src/libsodium/crypto_sign/ed25519/ref10/ge_msub.h\n    src/libsodium/crypto_sign/ed25519/ref10/ge_p2_dbl.h\n    src/libsodium/crypto_sign/ed25519/ref10/ge_sub.h\n    src/libsodium/crypto_sign/ed25519/ref10/pow22523.h\n    src/libsodium/crypto_sign/ed25519/ref10/pow225521.h\n    src/libsodium/crypto_sign/ed25519/ref10/sc.h\n    src/libsodium/crypto_sign/ed25519/ref10/sqrtm1.h\n#    src/libsodium/crypto_stream/chacha20/ref/api.h\n#    src/libsodium/crypto_stream/xsalsa20/ref/api.h\n#    src/libsodium/crypto_verify/16/ref/api.h\n#    src/libsodium/crypto_verify/32/ref/api.h\n#    src/libsodium/crypto_verify/64/ref/api.h\n)\n\nSET(libsodium_SOURCE ${libsodium_SOURCE}\n    src/libsodium/crypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c\n    src/libsodium/crypto_auth/crypto_auth.c\n    src/libsodium/crypto_auth/hmacsha256/auth_hmacsha256_api.c\n    src/libsodium/crypto_auth/hmacsha256/cp/hmac_hmacsha256.c\n    src/libsodium/crypto_auth/hmacsha256/cp/verify_hmacsha256.c\n    src/libsodium/crypto_auth/hmacsha512/auth_hmacsha512_api.c\n    src/libsodium/crypto_auth/hmacsha512/cp/hmac_hmacsha512.c\n    src/libsodium/crypto_auth/hmacsha512/cp/verify_hmacsha512.c\n    src/libsodium/crypto_auth/hmacsha512256/auth_hmacsha512256_api.c\n    src/libsodium/crypto_auth/hmacsha512256/cp/hmac_hmacsha512256.c\n    src/libsodium/crypto_auth/hmacsha512256/cp/verify_hmacsha512256.c\n    src/libsodium/crypto_box/crypto_box.c\n    src/libsodium/crypto_box/crypto_box_easy.c\n    src/libsodium/crypto_box/crypto_box_seal.c\n    src/libsodium/crypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305_api.c\n    src/libsodium/crypto_box/curve25519xsalsa20poly1305/ref/after_curve25519xsalsa20poly1305.c\n    src/libsodium/crypto_box/curve25519xsalsa20poly1305/ref/before_curve25519xsalsa20poly1305.c\n    src/libsodium/crypto_box/curve25519xsalsa20poly1305/ref/box_curve25519xsalsa20poly1305.c\n    src/libsodium/crypto_box/curve25519xsalsa20poly1305/ref/keypair_curve25519xsalsa20poly1305.c\n    src/libsodium/crypto_core/hsalsa20/ref2/core_hsalsa20.c\n    src/libsodium/crypto_core/hsalsa20/core_hsalsa20_api.c\n    src/libsodium/crypto_core/salsa20/ref/core_salsa20.c\n    src/libsodium/crypto_core/salsa20/core_salsa20_api.c\n    src/libsodium/crypto_generichash/crypto_generichash.c\n    src/libsodium/crypto_generichash/blake2/generichash_blake2_api.c\n    src/libsodium/crypto_generichash/blake2/ref/blake2b-compress-ref.c\n    src/libsodium/crypto_generichash/blake2/ref/blake2b-ref.c\n    src/libsodium/crypto_generichash/blake2/ref/generichash_blake2b.c\n    src/libsodium/crypto_hash/crypto_hash.c\n    src/libsodium/crypto_hash/sha256/hash_sha256_api.c\n    src/libsodium/crypto_hash/sha256/cp/hash_sha256.c\n    src/libsodium/crypto_hash/sha512/hash_sha512_api.c\n    src/libsodium/crypto_hash/sha512/cp/hash_sha512.c\n    src/libsodium/crypto_onetimeauth/crypto_onetimeauth.c\n    src/libsodium/crypto_onetimeauth/poly1305/onetimeauth_poly1305.c\n#    src/libsodium/crypto_onetimeauth/poly1305/onetimeauth_poly1305_api.c\n#    src/libsodium/crypto_onetimeauth/poly1305/onetimeauth_poly1305_try.c\n#    src/libsodium/crypto_onetimeauth/poly1305/donna/auth_poly1305_donna.c\n    src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna.c\n    src/libsodium/crypto_pwhash/scryptsalsa208sha256/crypto_scrypt-common.c\n    src/libsodium/crypto_pwhash/scryptsalsa208sha256/scrypt_platform.c\n    src/libsodium/crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.c\n    src/libsodium/crypto_pwhash/scryptsalsa208sha256/pwhash_scryptsalsa208sha256.c\n    src/libsodium/crypto_pwhash/scryptsalsa208sha256/nosse/pwhash_scryptsalsa208sha256_nosse.c\n    src/libsodium/crypto_pwhash/scryptsalsa208sha256/sse/pwhash_scryptsalsa208sha256_sse.c\n    src/libsodium/crypto_scalarmult/crypto_scalarmult.c\n    src/libsodium/crypto_scalarmult/curve25519/scalarmult_curve25519.c\n    src/libsodium/crypto_secretbox/crypto_secretbox.c\n    src/libsodium/crypto_secretbox/crypto_secretbox_easy.c\n    src/libsodium/crypto_secretbox/xsalsa20poly1305/secretbox_xsalsa20poly1305_api.c\n    src/libsodium/crypto_secretbox/xsalsa20poly1305/ref/box_xsalsa20poly1305.c\n    src/libsodium/crypto_shorthash/crypto_shorthash.c\n    src/libsodium/crypto_shorthash/siphash24/shorthash_siphash24_api.c\n    src/libsodium/crypto_shorthash/siphash24/ref/shorthash_siphash24.c\n    src/libsodium/crypto_sign/crypto_sign.c\n    src/libsodium/crypto_sign/ed25519/sign_ed25519_api.c\n    src/libsodium/crypto_sign/ed25519/ref10/fe_0.c\n    src/libsodium/crypto_sign/ed25519/ref10/fe_1.c\n    src/libsodium/crypto_sign/ed25519/ref10/fe_add.c\n    src/libsodium/crypto_sign/ed25519/ref10/fe_cmov.c\n    src/libsodium/crypto_sign/ed25519/ref10/fe_copy.c\n    src/libsodium/crypto_sign/ed25519/ref10/fe_frombytes.c\n    src/libsodium/crypto_sign/ed25519/ref10/fe_invert.c\n    src/libsodium/crypto_sign/ed25519/ref10/fe_isnegative.c\n    src/libsodium/crypto_sign/ed25519/ref10/fe_isnonzero.c\n    src/libsodium/crypto_sign/ed25519/ref10/fe_mul.c\n    src/libsodium/crypto_sign/ed25519/ref10/fe_neg.c\n    src/libsodium/crypto_sign/ed25519/ref10/fe_pow22523.c\n    src/libsodium/crypto_sign/ed25519/ref10/fe_sq.c\n    src/libsodium/crypto_sign/ed25519/ref10/fe_sq2.c\n    src/libsodium/crypto_sign/ed25519/ref10/fe_sub.c\n    src/libsodium/crypto_sign/ed25519/ref10/fe_tobytes.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_add.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_double_scalarmult.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_frombytes.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_madd.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_msub.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_p1p1_to_p2.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_p1p1_to_p3.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_p2_0.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_p2_dbl.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_p3_0.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_p3_dbl.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_p3_to_cached.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_p3_to_p2.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_p3_tobytes.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_precomp_0.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_scalarmult_base.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_sub.c\n    src/libsodium/crypto_sign/ed25519/ref10/ge_tobytes.c\n    src/libsodium/crypto_sign/ed25519/ref10/keypair.c\n    src/libsodium/crypto_sign/ed25519/ref10/open.c\n    src/libsodium/crypto_sign/ed25519/ref10/sc_muladd.c\n    src/libsodium/crypto_sign/ed25519/ref10/sc_reduce.c\n    src/libsodium/crypto_sign/ed25519/ref10/sign.c\n    src/libsodium/crypto_stream/crypto_stream.c\n    src/libsodium/crypto_stream/chacha20/stream_chacha20.c\n    src/libsodium/crypto_stream/chacha20/ref/stream_chacha20_ref.c\n    src/libsodium/crypto_stream/salsa20/stream_salsa20_api.c\n    src/libsodium/crypto_stream/xsalsa20/stream_xsalsa20_api.c\n    src/libsodium/crypto_stream/xsalsa20/ref/stream_xsalsa20.c\n    src/libsodium/crypto_stream/xsalsa20/ref/xor_xsalsa20.c\n    src/libsodium/crypto_verify/16/verify_16_api.c\n    src/libsodium/crypto_verify/16/ref/verify_16.c\n    src/libsodium/crypto_verify/32/verify_32_api.c\n    src/libsodium/crypto_verify/32/ref/verify_32.c\n    src/libsodium/crypto_verify/64/verify_64_api.c\n    src/libsodium/crypto_verify/64/ref/verify_64.c\n    src/libsodium/randombytes/randombytes.c\n    src/libsodium/randombytes/salsa20/randombytes_salsa20_random.c\n    src/libsodium/randombytes/sysrandom/randombytes_sysrandom.c\n    src/libsodium/sodium/core.c\n    src/libsodium/sodium/runtime.c\n    src/libsodium/sodium/utils.c\n    src/libsodium/sodium/version.c\n)\n\n\n#----------------------------------------------------------\n################### MINIMAL BUILD CHECK ###################\n#----------------------------------------------------------\n\nIF(NOT ENABLE_MINIMAL_BUILD)\n\n    SET(libsodium_HEADERS ${libsodium_HEADERS}\n#        src/libsodium/crypto_core/salsa2012/ref/api.h\n#        src/libsodium/crypto_core/salsa208/ref/api.h\n#        src/libsodium/crypto_sign/edwards25519sha512batch/ref/api.h\n#        src/libsodium/crypto_sign/edwards25519sha512batch/ref/fe25519.h\n#        src/libsodium/crypto_sign/edwards25519sha512batch/ref/ge25519.h\n#        src/libsodium/crypto_sign/edwards25519sha512batch/ref/sc25519.h\n#        src/libsodium/crypto_stream/aes128ctr/portable/api.h\n        src/libsodium/crypto_stream/aes128ctr/portable/common.h\n        src/libsodium/crypto_stream/aes128ctr/portable/consts.h\n        src/libsodium/crypto_stream/aes128ctr/portable/int128.h\n        src/libsodium/crypto_stream/aes128ctr/portable/types.h\n#        src/libsodium/crypto_stream/salsa2012/ref/api.h\n#        src/libsodium/crypto_stream/salsa208/ref/api.h\n    )\n\n    SET(libsodium_SOURCE ${libsodium_SOURCE}\n        src/libsodium/crypto_core/salsa2012/ref/core_salsa2012.c\n        src/libsodium/crypto_core/salsa2012/core_salsa2012_api.c\n        src/libsodium/crypto_core/salsa208/ref/core_salsa208.c\n        src/libsodium/crypto_core/salsa208/core_salsa208_api.c\n#        src/libsodium/crypto_sign/edwards25519sha512batch/sign_edwards25519sha512batch_api.c\n#        src/libsodium/crypto_sign/edwards25519sha512batch/ref/fe25519_edwards25519sha512batch.c\n#        src/libsodium/crypto_sign/edwards25519sha512batch/ref/ge25519_edwards25519sha512batch.c\n#        src/libsodium/crypto_sign/edwards25519sha512batch/ref/sc25519_edwards25519sha512batch.c\n#        src/libsodium/crypto_sign/edwards25519sha512batch/ref/sign_edwards25519sha512batch.c\n        src/libsodium/crypto_stream/aes128ctr/portable/afternm_aes128ctr.c\n        src/libsodium/crypto_stream/aes128ctr/stream_aes128ctr_api.c\n        src/libsodium/crypto_stream/aes128ctr/portable/beforenm_aes128ctr.c\n        src/libsodium/crypto_stream/aes128ctr/portable/common_aes128ctr.c\n        src/libsodium/crypto_stream/aes128ctr/portable/stream_aes128ctr.c\n        src/libsodium/crypto_stream/aes128ctr/portable/int128_aes128ctr.c\n        src/libsodium/crypto_stream/salsa2012/stream_salsa2012_api.c\n        src/libsodium/crypto_stream/aes128ctr/portable/xor_afternm_aes128ctr.c\n        src/libsodium/crypto_stream/aes128ctr/portable/consts_aes128ctr.c\n        src/libsodium/crypto_stream/salsa2012/ref/stream_salsa2012.c\n        src/libsodium/crypto_stream/salsa2012/ref/xor_salsa2012.c\n        src/libsodium/crypto_stream/salsa208/stream_salsa208_api.c\n        src/libsodium/crypto_stream/salsa208/ref/stream_salsa208.c\n        src/libsodium/crypto_stream/salsa208/ref/xor_salsa208.c\n    )\n\nENDIF(NOT ENABLE_MINIMAL_BUILD)\n\n\n#----------------------------------------------------------\n######################### LIBRARY #########################\n#----------------------------------------------------------\n\nset(CMAKE_RUNTIME_OUTPUT_DIRECTORY \"${CMAKE_CURRENT_BINARY_DIR}/build\")\n\n\nIF(ENABLE_BLOCKING_RANDOM)\n    ADD_DEFINITIONS(\"-DUSE_BLOCKING_RANDOM\")\nENDIF(ENABLE_BLOCKING_RANDOM)\n\nIF(LIBSODIUM_BUILD_SHARED_LIBRARIES)\n    ADD_LIBRARY(sodium SHARED ${libsodium_HEADERS} ${libsodium_SOURCE})\nELSE(LIBSODIUM_BUILD_SHARED_LIBRARIES)\n    ADD_DEFINITIONS(\"-DSODIUM_STATIC\")\n    ADD_LIBRARY(sodium STATIC ${libsodium_HEADERS} ${libsodium_SOURCE})\nENDIF(LIBSODIUM_BUILD_SHARED_LIBRARIES)\n\nSET_TARGET_PROPERTIES(sodium PROPERTIES\n    LIBRARY_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib\n    ARCHIVE_OUTPUT_DIRECTORY ${CMAKE_CURRENT_BINARY_DIR}/lib\n    PROJECT_LABEL \"libsodium\"\n)\n\nset(libsodium_include_dirs\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/libsodium/include\n        ${CMAKE_CURRENT_SOURCE_DIR}/src/libsodium/include/sodium\n        ${CMAKE_CURRENT_BINARY_DIR}/src/libsodium/include\n        CACHE INTERNAL \"libipset library\" FORCE\n        )\n\n#----------------------------------------------------------\n########################## TESTS ##########################\n#----------------------------------------------------------\n\nIF(${ENABLE_TESTS})\n\n    ADD_SUBDIRECTORY(${CMAKE_CURRENT_SOURCE_DIR}/test/default)\n    ENABLE_TESTING()\n\n    ADD_TEST(NAME aead_chacha20poly1305_test COMMAND aead_chacha20poly1305 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME auth_test                  COMMAND auth                  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME auth2_test                 COMMAND auth2                 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME auth3_test                 COMMAND auth3                 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME auth5_test                 COMMAND auth5                 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME auth6_test                 COMMAND auth6                 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME auth7_test                 COMMAND auth7                 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME box_test                   COMMAND box                   WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME box2_test                  COMMAND box2                  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME box7_test                  COMMAND box7                  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME box8_test                  COMMAND box8                  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME box_easy_test              COMMAND box_easy              WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME box_easy2_test             COMMAND box_easy2             WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME box_seal_test              COMMAND box_seal              WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME box_seed_test              COMMAND box_seed              WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME chacha20_test              COMMAND chacha20              WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME core1_test                 COMMAND core1                 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME core2_test                 COMMAND core2                 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME core3_test                 COMMAND core3                 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME core4_test                 COMMAND core4                 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME core5_test                 COMMAND core5                 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME core6_test                 COMMAND core6                 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME ed25519_convert_test       COMMAND ed25519_convert       WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME generichash_test           COMMAND generichash           WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME generichash2_test          COMMAND generichash2          WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME generichash3_test          COMMAND generichash3          WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME hash_test                  COMMAND hash                  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME hash3_test                 COMMAND hash3                 WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME onetimeauth_test           COMMAND onetimeauth           WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME onetimeauth2_test          COMMAND onetimeauth2          WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME onetimeauth7_test          COMMAND onetimeauth7          WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME pwhash_test                COMMAND pwhash                WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME pwhash_scrypt_ll_test      COMMAND pwhash_scrypt_ll      WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME randombytes_test           COMMAND randombytes           WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME scalarmult_test            COMMAND scalarmult            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME scalarmult2_test           COMMAND scalarmult2           WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME scalarmult5_test           COMMAND scalarmult5           WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME scalarmult6_test           COMMAND scalarmult6           WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME scalarmult7_test           COMMAND scalarmult7           WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME secretbox_test             COMMAND secretbox             WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME secretbox2_test            COMMAND secretbox2            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME secretbox7_test            COMMAND secretbox7            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME secretbox8_test            COMMAND secretbox8            WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME secretbox_easy_test        COMMAND secretbox_easy        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME secretbox_easy2_test       COMMAND secretbox_easy2       WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME shorthash_test             COMMAND shorthash             WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME sign_test                  COMMAND sign                  WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME sodium_core_test           COMMAND sodium_core           WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME sodium_utils_test          COMMAND sodium_utils          WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME sodium_utils2_test         COMMAND sodium_utils2         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME sodium_utils3_test         COMMAND sodium_utils3         WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME sodium_version_test        COMMAND sodium_version        WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME stream_test                COMMAND stream                WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME stream2_test               COMMAND stream2               WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME stream3_test               COMMAND stream3               WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME stream4_test               COMMAND stream4               WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n    ADD_TEST(NAME verify1_test               COMMAND verify1               WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/test/default/)\n\n    SET_TESTS_PROPERTIES(aead_chacha20poly1305_test PROPERTIES DEPENDS aead_chacha20poly1305)\n    SET_TESTS_PROPERTIES(auth_test                  PROPERTIES DEPENDS auth)\n    SET_TESTS_PROPERTIES(auth2_test                 PROPERTIES DEPENDS auth2)\n    SET_TESTS_PROPERTIES(auth3_test                 PROPERTIES DEPENDS auth3)\n    SET_TESTS_PROPERTIES(auth5_test                 PROPERTIES DEPENDS auth5)\n    SET_TESTS_PROPERTIES(auth6_test                 PROPERTIES DEPENDS auth6)\n    SET_TESTS_PROPERTIES(auth7_test                 PROPERTIES DEPENDS auth7)\n    SET_TESTS_PROPERTIES(box_test                   PROPERTIES DEPENDS box)\n    SET_TESTS_PROPERTIES(box2_test                  PROPERTIES DEPENDS box2)\n    SET_TESTS_PROPERTIES(box7_test                  PROPERTIES DEPENDS box7)\n    SET_TESTS_PROPERTIES(box8_test                  PROPERTIES DEPENDS box8)\n    SET_TESTS_PROPERTIES(box_easy_test              PROPERTIES DEPENDS box_easy)\n    SET_TESTS_PROPERTIES(box_easy2_test             PROPERTIES DEPENDS box_easy2)\n    SET_TESTS_PROPERTIES(box_seal_test              PROPERTIES DEPENDS box_seal)\n    SET_TESTS_PROPERTIES(box_seed_test              PROPERTIES DEPENDS box_seed)\n    SET_TESTS_PROPERTIES(chacha20_test              PROPERTIES DEPENDS chacha20)\n    SET_TESTS_PROPERTIES(core1_test                 PROPERTIES DEPENDS core1)\n    SET_TESTS_PROPERTIES(core2_test                 PROPERTIES DEPENDS core2)\n    SET_TESTS_PROPERTIES(core3_test                 PROPERTIES DEPENDS core3)\n    SET_TESTS_PROPERTIES(core4_test                 PROPERTIES DEPENDS core4)\n    SET_TESTS_PROPERTIES(core5_test                 PROPERTIES DEPENDS core5)\n    SET_TESTS_PROPERTIES(core6_test                 PROPERTIES DEPENDS core6)\n    SET_TESTS_PROPERTIES(ed25519_convert_test       PROPERTIES DEPENDS ed25519_convert)\n    SET_TESTS_PROPERTIES(generichash_test           PROPERTIES DEPENDS generichash)\n    SET_TESTS_PROPERTIES(generichash2_test          PROPERTIES DEPENDS generichash2)\n    SET_TESTS_PROPERTIES(generichash3_test          PROPERTIES DEPENDS generichash3)\n    SET_TESTS_PROPERTIES(hash_test                  PROPERTIES DEPENDS hash)\n    SET_TESTS_PROPERTIES(hash3_test                 PROPERTIES DEPENDS hash3)\n    SET_TESTS_PROPERTIES(onetimeauth_test           PROPERTIES DEPENDS onetimeauth)\n    SET_TESTS_PROPERTIES(onetimeauth2_test          PROPERTIES DEPENDS onetimeauth2)\n    SET_TESTS_PROPERTIES(onetimeauth7_test          PROPERTIES DEPENDS onetimeauth7)\n    SET_TESTS_PROPERTIES(pwhash_test                PROPERTIES DEPENDS pwhash)\n    SET_TESTS_PROPERTIES(pwhash_scrypt_ll_test      PROPERTIES DEPENDS pwhash_scrypt_ll)\n    SET_TESTS_PROPERTIES(randombytes_test           PROPERTIES DEPENDS randombytes)\n    SET_TESTS_PROPERTIES(scalarmult_test            PROPERTIES DEPENDS scalarmult)\n    SET_TESTS_PROPERTIES(scalarmult2_test           PROPERTIES DEPENDS scalarmult2)\n    SET_TESTS_PROPERTIES(scalarmult5_test           PROPERTIES DEPENDS scalarmult5)\n    SET_TESTS_PROPERTIES(scalarmult6_test           PROPERTIES DEPENDS scalarmult6)\n    SET_TESTS_PROPERTIES(scalarmult7_test           PROPERTIES DEPENDS scalarmult7)\n    SET_TESTS_PROPERTIES(secretbox_test             PROPERTIES DEPENDS secretbox)\n    SET_TESTS_PROPERTIES(secretbox2_test            PROPERTIES DEPENDS secretbox2)\n    SET_TESTS_PROPERTIES(secretbox7_test            PROPERTIES DEPENDS secretbox7)\n    SET_TESTS_PROPERTIES(secretbox8_test            PROPERTIES DEPENDS secretbox8)\n    SET_TESTS_PROPERTIES(secretbox_easy_test        PROPERTIES DEPENDS secretbox_easy)\n    SET_TESTS_PROPERTIES(secretbox_easy2_test       PROPERTIES DEPENDS secretbox_easy2)\n    SET_TESTS_PROPERTIES(shorthash_test             PROPERTIES DEPENDS shorthash)\n    SET_TESTS_PROPERTIES(sign_test                  PROPERTIES DEPENDS sign)\n    SET_TESTS_PROPERTIES(sodium_core_test           PROPERTIES DEPENDS sodium_core)\n    SET_TESTS_PROPERTIES(sodium_utils_test          PROPERTIES DEPENDS sodium_utils)\n    SET_TESTS_PROPERTIES(sodium_utils2_test         PROPERTIES DEPENDS sodium_utils2)\n    SET_TESTS_PROPERTIES(sodium_utils3_test         PROPERTIES DEPENDS sodium_utils3)\n    SET_TESTS_PROPERTIES(sodium_version_test        PROPERTIES DEPENDS sodium_version)\n    SET_TESTS_PROPERTIES(stream_test                PROPERTIES DEPENDS stream)\n    SET_TESTS_PROPERTIES(stream2_test               PROPERTIES DEPENDS stream2)\n    SET_TESTS_PROPERTIES(stream3_test               PROPERTIES DEPENDS stream3)\n    SET_TESTS_PROPERTIES(stream4_test               PROPERTIES DEPENDS stream4)\n    SET_TESTS_PROPERTIES(verify1_test               PROPERTIES DEPENDS verify1)\n\nENDIF(${ENABLE_TESTS})\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/ChangeLog",
    "content": "\n* Version 1.0.7\n - More functions whose return value should be checked have been\ntagged with `__attribute__ ((warn_unused_result))`: `crypto_box_easy()`,\n`crypto_box_detached()`, `crypto_box_beforenm()`, `crypto_box()`, and\n`crypto_scalarmult()`.\n - Sandy2x, the fastest Curve25519 implementation ever, has been\nmerged in, and is automatically used on CPUs supporting the AVX\ninstructions set.\n - An SSE2 optimized implementation of Poly1305 was added, and is\ntwice as fast as the portable one.\n - An SSSE3 optimized implementation of ChaCha20 was added, and is\ntwice as fast as the portable one.\n - Faster `sodium_increment()` for common nonce sizes.\n - New helper functions have been added: `sodium_is_zero()` and\n `sodium_add()`.\n - `sodium_runtime_has_aesni()` now properly detects the CPU flag when\n compiled using Visual Studio.\n\n* Version 1.0.6\n - Optimized implementations of Blake2 have been added for modern\nIntel platforms. `crypto_generichash()` is now faster than MD5 and SHA1\nimplementations while being far more secure.\n - Functions for which the return value should be checked have been\ntagged with `__attribute__ ((warn_unused_result))`. This will\nintentionally break code compiled with `-Werror` that didn't bother\nchecking critical return values.\n - The `crypto_sign_edwards25519sha512batch_*()` functions have been\ntagged as deprecated.\n - Undocumented symbols that were exported, but were only useful for\ninternal purposes have been removed or made private:\n`sodium_runtime_get_cpu_features()`, the implementation-specific\n`crypto_onetimeauth_poly1305_donna()` symbols,\n`crypto_onetimeauth_poly1305_set_implementation()`,\n`crypto_onetimeauth_poly1305_implementation_name()` and\n`crypto_onetimeauth_pick_best_implementation()`.\n - `sodium_compare()` now works as documented, and compares numbers\nin little-endian format instead of behaving like `memcmp()`.\n - The previous changes should not break actual applications, but to be\nsafe, the library version major was incremented.\n - `sodium_runtime_has_ssse3()` and `sodium_runtime_has_sse41()` have\nbeen added.\n - The library can now be compiled with the CompCert compiler.\n\n* Version 1.0.5\n - Compilation issues on some platforms were fixed: missing alignment\ndirectives were added (required at least on RHEL-6/i386), a workaround\nfor a VRP bug on gcc/armv7 was added, and the library can now be compiled\nwith the SunPro compiler.\n - Javascript target: io.js is not supported any more. Use nodejs.\n\n* Version 1.0.4\n - Support for AES256-GCM has been added. This requires\na CPU with the aesni and pclmul extensions, and is accessible via the\ncrypto_aead_aes256gcm_*() functions.\n - The Javascript target doesn't use eval() any more, so that the\nlibrary can be used in Chrome packaged applications.\n - QNX and CloudABI are now supported.\n - Support for NaCl has finally been added.\n - ChaCha20 with an extended (96 bit) nonce and a 32-bit counter has\nbeen implemented as crypto_stream_chacha20_ietf(),\ncrypto_stream_chacha20_ietf_xor() and crypto_stream_chacha20_ietf_xor_ic().\nAn IETF-compatible version of ChaCha20Poly1305 is available as\ncrypto_aead_chacha20poly1305_ietf_npubbytes(),\ncrypto_aead_chacha20poly1305_ietf_encrypt() and\ncrypto_aead_chacha20poly1305_ietf_decrypt().\n - The sodium_increment() helper function has been added, to increment\nan arbitrary large number (such as a nonce).\n - The sodium_compare() helper function has been added, to compare\narbitrary large numbers (such as nonces, in order to prevent replay\nattacks).\n\n* Version 1.0.3\n - In addition to sodium_bin2hex(), sodium_hex2bin() is now a\nconstant-time function.\n - crypto_stream_xsalsa20_ic() has been added.\n - crypto_generichash_statebytes(), crypto_auth_*_statebytes() and\ncrypto_hash_*_statebytes() have been added in order to retrieve the\nsize of structures keeping states from foreign languages.\n - The JavaScript target doesn't require /dev/urandom or an external\nrandombytes() implementation any more. Other minor Emscripten-related\nimprovements have been made in order to support libsodium.js\n - Custom randombytes implementations do not need to provide their own\nimplementation of randombytes_uniform() any more. randombytes_stir()\nand randombytes_close() can also be NULL pointers if they are not\nrequired.\n - On Linux, getrandom(2) is being used instead of directly accessing\n/dev/urandom, if the kernel supports this system call.\n - crypto_box_seal() and crypto_box_seal_open() have been added.\n - A solutions for Visual Studio 2015 was added.\n\n* Version 1.0.2\n - The _easy and _detached APIs now support precalculated keys;\ncrypto_box_easy_afternm(), crypto_box_open_easy_afternm(),\ncrypto_box_detached_afternm() and crypto_box_open_detached_afternm()\nhave been added as an alternative to the NaCl interface.\n - Memory allocation functions can now be used on operating systems with\nno memory protection.\n - crypto_sign_open() and crypto_sign_edwards25519sha512batch_open()\nnow accept a NULL pointer instead of a pointer to the message size, if\nstoring this information is not required.\n - The close-on-exec flag is now set on the descriptor returned when\nopening /dev/urandom.\n - A libsodium-uninstalled.pc file to use pkg-config even when\nlibsodium is not installed, has been added.\n - The iOS target now includes armv7s and arm64 optimized code, as well\nas i386 and x86_64 code for the iOS simulator.\n - sodium_free() can now be called on regions with PROT_NONE protection.\n - The Javascript tests can run on Ubuntu, where the node binary was\nrenamed nodejs. io.js can also be used instead of node.\n\n* Version 1.0.1\n - DLL_EXPORT was renamed SODIUM_DLL_EXPORT in order to avoid\ncollisions with similar macros defined by other libraries.\n - sodium_bin2hex() is now constant-time.\n - crypto_secretbox_detached() now supports overlapping input and output\nregions.\n - NaCl's donna_c64 implementation of curve25519 was reading an extra byte\npast the end of the buffer containing the base point. This has been\nfixed.\n\n* Version 1.0.0\n - The API and ABI are now stable. New features will be added, but\nbackward-compatibility is guaranteed through all the 1.x.y releases.\n - crypto_sign() properly works with overlapping regions again. Thanks\nto @pysiak for reporting this regression introduced in version 0.6.1.\n - The test suite has been extended.\n\n* Version 0.7.1 (1.0 RC2)\n - This is the second release candidate of Sodium 1.0. Minor\ncompilation, readability and portability changes have been made and the\ntest suite was improved, but the API is the same as the previous release\ncandidate.\n\n* Version 0.7.0 (1.0 RC1)\n - Allocating memory to store sensitive data can now be done using\nsodium_malloc() and sodium_allocarray(). These functions add guard\npages around the protected data to make it less likely to be\naccessible in a heartbleed-like scenario. In addition, the protection\nfor memory regions allocated that way can be changed using\nsodium_mprotect_noaccess(), sodium_mprotect_readonly() and\nsodium_mprotect_readwrite().\n - ed25519 keys can be converted to curve25519 keys with\ncrypto_sign_ed25519_pk_to_curve25519() and\ncrypto_sign_ed25519_sk_to_curve25519(). This allows using the same\nkeys for signature and encryption.\n - The seed and the public key can be extracted from an ed25519 key\nusing crypto_sign_ed25519_sk_to_seed() and crypto_sign_ed25519_sk_to_pk().\n - aes256 was removed. A timing-attack resistant implementation might\nbe added later, but not before version 1.0 is tagged.\n - The crypto_pwhash_scryptxsalsa208sha256_* compatibility layer was\nremoved. Use crypto_pwhash_scryptsalsa208sha256_*.\n - The compatibility layer for implementation-specific functions was\nremoved.\n - Compilation issues with Mingw64 on MSYS (not MSYS2) were fixed.\n - crypto_pwhash_scryptsalsa208sha256_STRPREFIX was added: it contains\nthe prefix produced by crypto_pwhash_scryptsalsa208sha256_str()\n\n* Version 0.6.1\n - Important bug fix: when crypto_sign_open() was given a signed\nmessage too short to even contain a signature, it was putting an\nunlimited amount of zeros into the target buffer instead of\nimmediately returning -1. The bug was introduced in version 0.5.0.\n - New API: crypto_sign_detached() and crypto_sign_verify_detached()\nto produce and verify ed25519 signatures without having to duplicate\nthe message.\n - New ./configure switch: --enable-minimal, to create a smaller\nlibrary, with only the functions required for the high-level API.\nMainly useful for the JavaScript target and embedded systems.\n - All the symbols are now exported by the Emscripten build script.\n - The pkg-config .pc file is now always installed even if the\npkg-config tool is not available during the installation.\n\n* Version 0.6.0\n - The ChaCha20 stream cipher has been added, as crypto_stream_chacha20_*\n - The ChaCha20Poly1305 AEAD construction has been implemented, as\ncrypto_aead_chacha20poly1305_*\n - The _easy API does not require any heap allocations any more and\ndoes not have any overhead over the NaCl API. With the password\nhashing function being an obvious exception, the library doesn't\nallocate and will not allocate heap memory ever.\n - crypto_box and crypto_secretbox have a new _detached API to store\nthe authentication tag and the encrypted message separately.\n - crypto_pwhash_scryptxsalsa208sha256*() functions have been renamed\ncrypto_pwhash_scryptsalsa208sha256*().\n - The low-level crypto_pwhash_scryptsalsa208sha256_ll() function\nallows setting individual parameters of the scrypt function.\n - New macros and functions for recommended crypto_pwhash_* parameters\nhave been added.\n - Similarly to crypto_sign_seed_keypair(), crypto_box_seed_keypair()\nhas been introduced to deterministically generate a key pair from a seed.\n - crypto_onetimeauth() now provides a streaming interface.\n - crypto_stream_chacha20_xor_ic() and crypto_stream_salsa20_xor_ic()\nhave been added to use a non-zero initial block counter.\n - On Windows, CryptGenRandom() was replaced by RtlGenRandom(), which\ndoesn't require the Crypt API.\n - The high bit in curve25519 is masked instead of processing the key as\na 256-bit value.\n - The curve25519 ref implementation was replaced by the latest ref10\nimplementation from Supercop.\n - sodium_mlock() now prevents memory from being included in coredumps\non Linux 3.4+\n\n* Version 0.5.0\n - sodium_mlock()/sodium_munlock() have been introduced to lock pages\nin memory before storing sensitive data, and to zero them before\nunlocking them.\n - High-level wrappers for crypto_box and crypto_secretbox\n(crypto_box_easy and crypto_secretbox_easy) can be used to avoid\ndealing with the specific memory layout regular functions depend on.\n - crypto_pwhash_scryptsalsa208sha256* functions have been added\nto derive a key from a password, and for password storage.\n - Salsa20 and ed25519 implementations now support overlapping\ninputs/keys/outputs (changes imported from supercop-20140505).\n - New build scripts for Visual Studio, Emscripten, different Android\narchitectures and msys2 are available.\n - The poly1305-53 implementation has been replaced with Floodyberry's\npoly1305-donna32 and poly1305-donna64 implementations.\n - sodium_hex2bin() has been added to complement sodium_bin2hex().\n - On OpenBSD and Bitrig, arc4random() is used instead of reading\n/dev/urandom.\n - crypto_auth_hmac_sha512() has been implemented.\n - sha256 and sha512 now have a streaming interface.\n - hmacsha256, hmacsha512 and hmacsha512256 now support keys of\narbitrary length, and have a streaming interface.\n - crypto_verify_64() has been implemented.\n - first-class Visual Studio build system, thanks to @evoskuil\n - CPU features are now detected at runtime.\n\n* Version 0.4.5\n - Restore compatibility with OSX <= 10.6\n\n* Version 0.4.4\n - Visual Studio is officially supported (VC 2010 & VC 2013)\n - mingw64 is now supported\n - big-endian architectures are now supported as well\n - The donna_c64 implementation of curve25519_donna_c64 now handles\nnon-canonical points like the ref implementation\n - Missing scalarmult_curve25519 and stream_salsa20 constants are now exported\n - A crypto_onetimeauth_poly1305_ref() wrapper has been added\n\n* Version 0.4.3\n - crypto_sign_seedbytes() and crypto_sign_SEEDBYTES were added.\n - crypto_onetimeauth_poly1305_implementation_name() was added.\n - poly1305-ref has been replaced by a faster implementation,\nFloodyberry's poly1305-donna-unrolled.\n - Stackmarkings have been added to assembly code, for Hardened Gentoo.\n - pkg-config can now be used in order to retrieve compilations flags for\nusing libsodium.\n - crypto_stream_aes256estream_*() can now deal with unaligned input\non platforms that require word alignment.\n - portability improvements.\n\n* Version 0.4.2\n - All NaCl constants are now also exposed as functions.\n - The Android and iOS cross-compilation script have been improved.\n - libsodium can now be cross-compiled to Windows from Linux.\n - libsodium can now be compiled with emscripten.\n - New convenience function (prototyped in utils.h): sodium_bin2hex().\n\n* Version 0.4.1\n - sodium_version_*() functions were not exported in version 0.4. They\nare now visible as intended.\n - sodium_init() now calls randombytes_stir().\n - optimized assembly version of salsa20 is now used on amd64.\n - further cleanups and enhanced compatibility with non-C99 compilers.\n\n* Version 0.4\n - Most constants and operations are now available as actual functions\ninstead of macros, making it easier to use from other languages.\n - New operation: crypto_generichash, featuring a variable key size, a\nvariable output size, and a streaming API. Currently implemented using\nBlake2b.\n - The package can be compiled in a separate directory.\n - aes128ctr functions are exported.\n - Optimized versions of curve25519 (curve25519_donna_c64), poly1305\n(poly1305_53) and ed25519 (ed25519_ref10) are available. Optionally calling\nsodium_init() once before using the library makes it pick the fastest\nimplementation.\n - New convenience function: sodium_memzero() in order to securely\nwipe a memory area.\n - A whole bunch of cleanups and portability enhancements.\n - On Windows, a .REF file is generated along with the shared library,\nfor use with Visual Studio. The installation path for these has become\n$prefix/bin as expected by MingW.\n\n* Version 0.3\n - The crypto_shorthash operation has been added, implemented using\nSipHash-2-4.\n\n* Version 0.2\n - crypto_sign_seed_keypair() has been added\n\n* Version 0.1\n - Initial release.\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/Makefile.am",
    "content": "ACLOCAL_AMFLAGS = -I m4\n\nEXTRA_DIST = \\\n\tautogen.sh \\\n\tlibsodium.sln \\\n\tlibsodium.vcxproj \\\n\tlibsodium.vcxproj.filters \\\n\tLICENSE \\\n\tREADME.markdown \\\n\tTHANKS\n\nSUBDIRS = \\\n\tsrc\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/Makefile.in",
    "content": "# Makefile.in generated by automake 1.14.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2013 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\nVPATH = @srcdir@\nam__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\nsubdir = .\nDIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \\\n\t$(top_srcdir)/configure $(am__configure_deps) \\\n\t$(top_srcdir)/src/libsodium/include/sodium/version.h.in \\\n\tAUTHORS ChangeLog README THANKS build-aux/compile \\\n\tbuild-aux/config.guess build-aux/config.sub build-aux/depcomp \\\n\tbuild-aux/install-sh build-aux/missing build-aux/ltmain.sh \\\n\t$(top_srcdir)/build-aux/compile \\\n\t$(top_srcdir)/build-aux/config.guess \\\n\t$(top_srcdir)/build-aux/config.sub \\\n\t$(top_srcdir)/build-aux/install-sh \\\n\t$(top_srcdir)/build-aux/ltmain.sh \\\n\t$(top_srcdir)/build-aux/missing\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \\\n\t$(top_srcdir)/m4/ax_check_define.m4 \\\n\t$(top_srcdir)/m4/ax_check_link_flag.m4 \\\n\t$(top_srcdir)/m4/ld-output-def.m4 $(top_srcdir)/m4/libtool.m4 \\\n\t$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \\\n\t$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \\\n\t$(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nam__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \\\n configure.lineno config.status.lineno\nmkinstalldirs = $(install_sh) -d\nCONFIG_CLEAN_FILES = src/libsodium/include/sodium/version.h\nCONFIG_CLEAN_VPATH_FILES =\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nSOURCES =\nDIST_SOURCES =\nRECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \\\n\tctags-recursive dvi-recursive html-recursive info-recursive \\\n\tinstall-data-recursive install-dvi-recursive \\\n\tinstall-exec-recursive install-html-recursive \\\n\tinstall-info-recursive install-pdf-recursive \\\n\tinstall-ps-recursive install-recursive installcheck-recursive \\\n\tinstalldirs-recursive pdf-recursive ps-recursive \\\n\ttags-recursive uninstall-recursive\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nRECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive\t\\\n  distclean-recursive maintainer-clean-recursive\nam__recursive_targets = \\\n  $(RECURSIVE_TARGETS) \\\n  $(RECURSIVE_CLEAN_TARGETS) \\\n  $(am__extra_recursive_targets)\nAM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \\\n\tcscope distdir dist dist-all distcheck\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nCSCOPE = cscope\nDIST_SUBDIRS = $(SUBDIRS)\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\ndistdir = $(PACKAGE)-$(VERSION)\ntop_distdir = $(distdir)\nam__remove_distdir = \\\n  if test -d \"$(distdir)\"; then \\\n    find \"$(distdir)\" -type d ! -perm -200 -exec chmod u+w {} ';' \\\n      && rm -rf \"$(distdir)\" \\\n      || { sleep 5 && rm -rf \"$(distdir)\"; }; \\\n  else :; fi\nam__post_remove_distdir = $(am__remove_distdir)\nam__relativize = \\\n  dir0=`pwd`; \\\n  sed_first='s,^\\([^/]*\\)/.*$$,\\1,'; \\\n  sed_rest='s,^[^/]*/*,,'; \\\n  sed_last='s,^.*/\\([^/]*\\)$$,\\1,'; \\\n  sed_butlast='s,/*[^/]*$$,,'; \\\n  while test -n \"$$dir1\"; do \\\n    first=`echo \"$$dir1\" | sed -e \"$$sed_first\"`; \\\n    if test \"$$first\" != \".\"; then \\\n      if test \"$$first\" = \"..\"; then \\\n        dir2=`echo \"$$dir0\" | sed -e \"$$sed_last\"`/\"$$dir2\"; \\\n        dir0=`echo \"$$dir0\" | sed -e \"$$sed_butlast\"`; \\\n      else \\\n        first2=`echo \"$$dir2\" | sed -e \"$$sed_first\"`; \\\n        if test \"$$first2\" = \"$$first\"; then \\\n          dir2=`echo \"$$dir2\" | sed -e \"$$sed_rest\"`; \\\n        else \\\n          dir2=\"../$$dir2\"; \\\n        fi; \\\n        dir0=\"$$dir0\"/\"$$first\"; \\\n      fi; \\\n    fi; \\\n    dir1=`echo \"$$dir1\" | sed -e \"$$sed_rest\"`; \\\n  done; \\\n  reldir=\"$$dir2\"\nDIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2\nGZIP_ENV = --best\nDIST_TARGETS = dist-bzip2 dist-gzip\ndistuninstallcheck_listfiles = find . -type f -print\nam__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \\\n  | sed 's|^\\./|$(prefix)/|' | grep -v '$(infodir)/dir$$'\ndistcleancheck_listfiles = find . -type f -print\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAR = @AR@\nAS = @AS@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCAS = @CCAS@\nCCASDEPMODE = @CCASDEPMODE@\nCCASFLAGS = @CCASFLAGS@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCFLAGS_AESNI = @CFLAGS_AESNI@\nCFLAGS_MMX = @CFLAGS_MMX@\nCFLAGS_PCLMUL = @CFLAGS_PCLMUL@\nCFLAGS_SSE2 = @CFLAGS_SSE2@\nCFLAGS_SSE3 = @CFLAGS_SSE3@\nCFLAGS_SSE41 = @CFLAGS_SSE41@\nCFLAGS_SSSE3 = @CFLAGS_SSSE3@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCWFLAGS = @CWFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDLLTOOL = @DLLTOOL@\nDLL_VERSION = @DLL_VERSION@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nHAVE_AMD64_ASM_V = @HAVE_AMD64_ASM_V@\nHAVE_AVX_ASM_V = @HAVE_AVX_ASM_V@\nHAVE_CPUID_V = @HAVE_CPUID_V@\nHAVE_TI_MODE_V = @HAVE_TI_MODE_V@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nISODATE = @ISODATE@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIBTOOL_DEPS = @LIBTOOL_DEPS@\nLIBTOOL_EXTRA_FLAGS = @LIBTOOL_EXTRA_FLAGS@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMANIFEST_TOOL = @MANIFEST_TOOL@\nMKDIR_P = @MKDIR_P@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nSAFECODE_HOME = @SAFECODE_HOME@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSODIUM_LIBRARY_VERSION = @SODIUM_LIBRARY_VERSION@\nSODIUM_LIBRARY_VERSION_MAJOR = @SODIUM_LIBRARY_VERSION_MAJOR@\nSODIUM_LIBRARY_VERSION_MINOR = @SODIUM_LIBRARY_VERSION_MINOR@\nSTRIP = @STRIP@\nTEST_LDFLAGS = @TEST_LDFLAGS@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_AR = @ac_ct_AR@\nac_ct_CC = @ac_ct_CC@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nACLOCAL_AMFLAGS = -I m4\nEXTRA_DIST = \\\n\tautogen.sh \\\n\tlibsodium.sln \\\n\tlibsodium.vcxproj \\\n\tlibsodium.vcxproj.filters \\\n\tLICENSE \\\n\tREADME.markdown \\\n\tTHANKS\n\nSUBDIRS = \\\n\tsrc\n\nall: all-recursive\n\n.SUFFIXES:\nam--refresh: Makefile\n\t@:\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      echo ' cd $(srcdir) && $(AUTOMAKE) --foreign'; \\\n\t      $(am__cd) $(srcdir) && $(AUTOMAKE) --foreign \\\n\t\t&& exit 0; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign Makefile\n.PRECIOUS: Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    echo ' $(SHELL) ./config.status'; \\\n\t    $(SHELL) ./config.status;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\t$(SHELL) ./config.status --recheck\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\t$(am__cd) $(srcdir) && $(AUTOCONF)\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\t$(am__cd) $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS)\n$(am__aclocal_m4_deps):\nsrc/libsodium/include/sodium/version.h: $(top_builddir)/config.status $(top_srcdir)/src/libsodium/include/sodium/version.h.in\n\tcd $(top_builddir) && $(SHELL) ./config.status $@\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\n\ndistclean-libtool:\n\t-rm -f libtool config.lt\n\n# This directory's subdirectories are mostly independent; you can cd\n# into them and run 'make' without going through this Makefile.\n# To change the values of 'make' variables: instead of editing Makefiles,\n# (1) if the variable is set in 'config.status', edit 'config.status'\n#     (which will cause the Makefiles to be regenerated when you run 'make');\n# (2) otherwise, pass the desired values on the 'make' command line.\n$(am__recursive_targets):\n\t@fail=; \\\n\tif $(am__make_keepgoing); then \\\n\t  failcom='fail=yes'; \\\n\telse \\\n\t  failcom='exit 1'; \\\n\tfi; \\\n\tdot_seen=no; \\\n\ttarget=`echo $@ | sed s/-recursive//`; \\\n\tcase \"$@\" in \\\n\t  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \\\n\t  *) list='$(SUBDIRS)' ;; \\\n\tesac; \\\n\tfor subdir in $$list; do \\\n\t  echo \"Making $$target in $$subdir\"; \\\n\t  if test \"$$subdir\" = \".\"; then \\\n\t    dot_seen=yes; \\\n\t    local_target=\"$$target-am\"; \\\n\t  else \\\n\t    local_target=\"$$target\"; \\\n\t  fi; \\\n\t  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \\\n\t  || eval $$failcom; \\\n\tdone; \\\n\tif test \"$$dot_seen\" = \"no\"; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) \"$$target-am\" || exit 1; \\\n\tfi; test -z \"$$fail\"\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-recursive\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\tif ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \\\n\t  include_option=--etags-include; \\\n\t  empty_fix=.; \\\n\telse \\\n\t  include_option=--include; \\\n\t  empty_fix=; \\\n\tfi; \\\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    test ! -f $$subdir/TAGS || \\\n\t      set \"$$@\" \"$$include_option=$$here/$$subdir/TAGS\"; \\\n\t  fi; \\\n\tdone; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-recursive\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscope: cscope.files\n\ttest ! -s cscope.files \\\n\t  || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS)\nclean-cscope:\n\t-rm -f cscope.files\ncscope.files: clean-cscope cscopelist\ncscopelist: cscopelist-recursive\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\t-rm -f cscope.out cscope.in.out cscope.po.out cscope.files\n\ndistdir: $(DISTFILES)\n\t$(am__remove_distdir)\n\ttest -d \"$(distdir)\" || mkdir \"$(distdir)\"\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\n\t@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    $(am__make_dryrun) \\\n\t      || test -d \"$(distdir)/$$subdir\" \\\n\t      || $(MKDIR_P) \"$(distdir)/$$subdir\" \\\n\t      || exit 1; \\\n\t    dir1=$$subdir; dir2=\"$(distdir)/$$subdir\"; \\\n\t    $(am__relativize); \\\n\t    new_distdir=$$reldir; \\\n\t    dir1=$$subdir; dir2=\"$(top_distdir)\"; \\\n\t    $(am__relativize); \\\n\t    new_top_distdir=$$reldir; \\\n\t    echo \" (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=\"$$new_top_distdir\" distdir=\"$$new_distdir\" \\\\\"; \\\n\t    echo \"     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)\"; \\\n\t    ($(am__cd) $$subdir && \\\n\t      $(MAKE) $(AM_MAKEFLAGS) \\\n\t        top_distdir=\"$$new_top_distdir\" \\\n\t        distdir=\"$$new_distdir\" \\\n\t\tam__remove_distdir=: \\\n\t\tam__skip_length_check=: \\\n\t\tam__skip_mode_fix=: \\\n\t        distdir) \\\n\t      || exit 1; \\\n\t  fi; \\\n\tdone\n\t-test -n \"$(am__skip_mode_fix)\" \\\n\t|| find \"$(distdir)\" -type d ! -perm -755 \\\n\t\t-exec chmod u+rwx,go+rx {} \\; -o \\\n\t  ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \\; -o \\\n\t  ! -type d ! -perm -400 -exec chmod a+r {} \\; -o \\\n\t  ! -type d ! -perm -444 -exec $(install_sh) -c -m a+r {} {} \\; \\\n\t|| chmod -R a+r \"$(distdir)\"\ndist-gzip: distdir\n\ttardir=$(distdir) && $(am__tar) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz\n\t$(am__post_remove_distdir)\ndist-bzip2: distdir\n\ttardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2\n\t$(am__post_remove_distdir)\n\ndist-lzip: distdir\n\ttardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz\n\t$(am__post_remove_distdir)\n\ndist-xz: distdir\n\ttardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz\n\t$(am__post_remove_distdir)\n\ndist-tarZ: distdir\n\t@echo WARNING: \"Support for shar distribution archives is\" \\\n\t               \"deprecated.\" >&2\n\t@echo WARNING: \"It will be removed altogether in Automake 2.0\" >&2\n\ttardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z\n\t$(am__post_remove_distdir)\n\ndist-shar: distdir\n\t@echo WARNING: \"Support for distribution archives compressed with\" \\\n\t\t       \"legacy program 'compress' is deprecated.\" >&2\n\t@echo WARNING: \"It will be removed altogether in Automake 2.0\" >&2\n\tshar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz\n\t$(am__post_remove_distdir)\n\ndist-zip: distdir\n\t-rm -f $(distdir).zip\n\tzip -rq $(distdir).zip $(distdir)\n\t$(am__post_remove_distdir)\n\ndist dist-all:\n\t$(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:'\n\t$(am__post_remove_distdir)\n\n# This target untars the dist file and tries a VPATH configuration.  Then\n# it guarantees that the distribution is self-contained by making another\n# tarfile.\ndistcheck: dist\n\tcase '$(DIST_ARCHIVES)' in \\\n\t*.tar.gz*) \\\n\t  GZIP=$(GZIP_ENV) gzip -dc $(distdir).tar.gz | $(am__untar) ;;\\\n\t*.tar.bz2*) \\\n\t  bzip2 -dc $(distdir).tar.bz2 | $(am__untar) ;;\\\n\t*.tar.lz*) \\\n\t  lzip -dc $(distdir).tar.lz | $(am__untar) ;;\\\n\t*.tar.xz*) \\\n\t  xz -dc $(distdir).tar.xz | $(am__untar) ;;\\\n\t*.tar.Z*) \\\n\t  uncompress -c $(distdir).tar.Z | $(am__untar) ;;\\\n\t*.shar.gz*) \\\n\t  GZIP=$(GZIP_ENV) gzip -dc $(distdir).shar.gz | unshar ;;\\\n\t*.zip*) \\\n\t  unzip $(distdir).zip ;;\\\n\tesac\n\tchmod -R a-w $(distdir)\n\tchmod u+w $(distdir)\n\tmkdir $(distdir)/_build $(distdir)/_inst\n\tchmod a-w $(distdir)\n\ttest -d $(distdir)/_build || exit 0; \\\n\tdc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\\\/]:[\\\\/],/,'` \\\n\t  && dc_destdir=\"$${TMPDIR-/tmp}/am-dc-$$$$/\" \\\n\t  && am__cwd=`pwd` \\\n\t  && $(am__cd) $(distdir)/_build \\\n\t  && ../configure \\\n\t    $(AM_DISTCHECK_CONFIGURE_FLAGS) \\\n\t    $(DISTCHECK_CONFIGURE_FLAGS) \\\n\t    --srcdir=.. --prefix=\"$$dc_install_base\" \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) dvi \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) check \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) install \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) installcheck \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) uninstall \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir=\"$$dc_install_base\" \\\n\t        distuninstallcheck \\\n\t  && chmod -R a-w \"$$dc_install_base\" \\\n\t  && ({ \\\n\t       (cd ../.. && umask 077 && mkdir \"$$dc_destdir\") \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" install \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" uninstall \\\n\t       && $(MAKE) $(AM_MAKEFLAGS) DESTDIR=\"$$dc_destdir\" \\\n\t            distuninstallcheck_dir=\"$$dc_destdir\" distuninstallcheck; \\\n\t      } || { rm -rf \"$$dc_destdir\"; exit 1; }) \\\n\t  && rm -rf \"$$dc_destdir\" \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) dist \\\n\t  && rm -rf $(DIST_ARCHIVES) \\\n\t  && $(MAKE) $(AM_MAKEFLAGS) distcleancheck \\\n\t  && cd \"$$am__cwd\" \\\n\t  || exit 1\n\t$(am__post_remove_distdir)\n\t@(echo \"$(distdir) archives ready for distribution: \"; \\\n\t  list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \\\n\t  sed -e 1h -e 1s/./=/g -e 1p -e 1x -e '$$p' -e '$$x'\ndistuninstallcheck:\n\t@test -n '$(distuninstallcheck_dir)' || { \\\n\t  echo 'ERROR: trying to run $@ with an empty' \\\n\t       '$$(distuninstallcheck_dir)' >&2; \\\n\t  exit 1; \\\n\t}; \\\n\t$(am__cd) '$(distuninstallcheck_dir)' || { \\\n\t  echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \\\n\t  exit 1; \\\n\t}; \\\n\ttest `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \\\n\t   || { echo \"ERROR: files left after uninstall:\" ; \\\n\t        if test -n \"$(DESTDIR)\"; then \\\n\t          echo \"  (check DESTDIR support)\"; \\\n\t        fi ; \\\n\t        $(distuninstallcheck_listfiles) ; \\\n\t        exit 1; } >&2\ndistcleancheck: distclean\n\t@if test '$(srcdir)' = . ; then \\\n\t  echo \"ERROR: distcleancheck can only run from a VPATH build\" ; \\\n\t  exit 1 ; \\\n\tfi\n\t@test `$(distcleancheck_listfiles) | wc -l` -eq 0 \\\n\t  || { echo \"ERROR: files left in build directory after distclean:\" ; \\\n\t       $(distcleancheck_listfiles) ; \\\n\t       exit 1; } >&2\ncheck-am: all-am\ncheck: check-recursive\nall-am: Makefile\ninstalldirs: installdirs-recursive\ninstalldirs-am:\ninstall: install-recursive\ninstall-exec: install-exec-recursive\ninstall-data: install-data-recursive\nuninstall: uninstall-recursive\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-recursive\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-recursive\n\nclean-am: clean-generic clean-libtool mostlyclean-am\n\ndistclean: distclean-recursive\n\t-rm -f $(am__CONFIG_DISTCLEAN_FILES)\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-generic distclean-libtool \\\n\tdistclean-tags\n\ndvi: dvi-recursive\n\ndvi-am:\n\nhtml: html-recursive\n\nhtml-am:\n\ninfo: info-recursive\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-recursive\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-recursive\n\ninstall-html-am:\n\ninstall-info: install-info-recursive\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-recursive\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-recursive\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-recursive\n\t-rm -f $(am__CONFIG_DISTCLEAN_FILES)\n\t-rm -rf $(top_srcdir)/autom4te.cache\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-recursive\n\nmostlyclean-am: mostlyclean-generic mostlyclean-libtool\n\npdf: pdf-recursive\n\npdf-am:\n\nps: ps-recursive\n\nps-am:\n\nuninstall-am:\n\n.MAKE: $(am__recursive_targets) install-am install-strip\n\n.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \\\n\tam--refresh check check-am clean clean-cscope clean-generic \\\n\tclean-libtool cscope cscopelist-am ctags ctags-am dist \\\n\tdist-all dist-bzip2 dist-gzip dist-lzip dist-shar dist-tarZ \\\n\tdist-xz dist-zip distcheck distclean distclean-generic \\\n\tdistclean-libtool distclean-tags distcleancheck distdir \\\n\tdistuninstallcheck dvi dvi-am html html-am info info-am \\\n\tinstall install-am install-data install-data-am install-dvi \\\n\tinstall-dvi-am install-exec install-exec-am install-html \\\n\tinstall-html-am install-info install-info-am install-man \\\n\tinstall-pdf install-pdf-am install-ps install-ps-am \\\n\tinstall-strip installcheck installcheck-am installdirs \\\n\tinstalldirs-am maintainer-clean maintainer-clean-generic \\\n\tmostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \\\n\tps ps-am tags tags-am uninstall uninstall-am\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/README",
    "content": "See README.markdown\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/README.markdown",
    "content": "[![Build Status](https://travis-ci.org/jedisct1/libsodium.svg?branch=master)](https://travis-ci.org/jedisct1/libsodium?branch=master)\n[![Coverity Scan Build Status](https://scan.coverity.com/projects/2397/badge.svg)](https://scan.coverity.com/projects/2397)\n\n![libsodium](https://raw.github.com/jedisct1/libsodium/master/logo.png)\n============\n\nSodium is a new, easy-to-use software library for encryption,\ndecryption, signatures, password hashing and more.\n\nIt is a portable, cross-compilable, installable, packageable\nfork of [NaCl](http://nacl.cr.yp.to/), with a compatible API, and an\nextended API to improve usability even further.\n\nIts goal is to provide all of the core operations needed to build\nhigher-level cryptographic tools.\n\nSodium supports a variety of compilers and operating systems,\nincluding Windows (with MingW or Visual Studio, x86 and x64), iOS and Android.\n\n## Documentation\n\nThe documentation is a work-in-progress, and is being written using\nGitbook:\n\n[libsodium documentation](https://download.libsodium.org/doc/)\n\n## Community\n\nA mailing-list is available to discuss libsodium.\n\nIn order to join, just send a random mail to `sodium-subscribe` {at}\n`pureftpd` {dot} `org`.\n\n## License\n\n[ISC license](https://en.wikipedia.org/wiki/ISC_license).\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/THANKS",
    "content": "@alethia7\n@dnaq\n@harleqin\n@joshjdevl\n@jshahbazi\n@lvh\n@neheb\nAmit Murthy (@amitmurthy)\nBruno Oliveira (@abstractj)\nChristian Wiese (@morfoh)\nChris Rebert (@cvrebert)\nColm MacCárthaigh (@colmmacc)\nDonald Stufft (@dstufft)\nDouglas Campos (@qmx)\nDrew Crawford (@drewcrawford)\nEric Dong (@quantum1423)\nEric Voskuil (@evoskuil)\nFrank Siebenlist (@franks42)\nGabriel Handford (@gabriel)\nJachym Holecek (@freza)\nJan de Muijnck-Hughes (@jfdm)\nJason McCampbell (@jasonmccampbell)\nJeroen Habraken (@VeXocide)\nJesper Louis Andersen (@jlouis)\nJoseph Abrahamson (@tel)\nKenneth Ballenegger (@kballenegger)\nLoic Maury (@loicmaury)\nMichael Gorlick (@mgorlick)\nMichael Gregorowicz (@mgregoro)\nOmar Ayub (@electricFeel)\nPedro Paixao (@paixaop)\nProject ArteMisc (@artemisc)\nRuben De Visscher (@rubendv)\nRudolf Von Krugstein (@rudolfvonkrugstein)\nSamuel Neves (@sneves)\nScott Arciszewski (@paragonie-scott)\nStefan Marsiske\nStephan Touset (@stouset)\nSteve Gibson (@sggrc)\nTony Arcieri (@bascule)\nTony Garnock-Jones (@tonyg)\nY. T. Chung (@zonyitoo)\n\nFSF France\nCoverity, Inc.\nOpenDNS, Inc.\nOVH\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/autogen.sh",
    "content": "#! /bin/sh\n\nif glibtoolize --version > /dev/null 2>&1; then\n  LIBTOOLIZE='glibtoolize'\nelse\n  LIBTOOLIZE='libtoolize'\nfi\n\nif [ ! -x \"`which $LIBTOOLIZE 2>/dev/null`\" ] ; then\n  echo \"libtool is required, but wasn't found on this system\"\n  exit 1\nfi\n\nif [ ! -x \"`which autoconf 2>/dev/null`\" ] ; then\n  echo \"autoconf is required, but wasn't found on this system\"\n  exit 1\nfi\n\nif [ ! -x \"`which automake 2>/dev/null`\" ] ; then\n  echo \"automake is required, but wasn't found on this system\"\n  exit 1\nfi\n\nif [ ! -x \"`which pkg-config 2>/dev/null`\" ] ; then\n  echo \"pkg-config is required, but wasn't found on this system\"\n  exit 1\nfi\n\nif [ -x \"`which autoreconf 2>/dev/null`\" ] ; then\n  exec autoreconf -ivf\nfi\n\n$LIBTOOLIZE && \\\naclocal && \\\nautomake --add-missing --force-missing --include-deps && \\\nautoconf\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/build-aux/config.guess",
    "content": "#! /bin/sh\n# Attempt to guess a canonical system name.\n#   Copyright 1992-2013 Free Software Foundation, Inc.\n\ntimestamp='2013-06-10'\n\n# This file is free software; you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, see <http://www.gnu.org/licenses/>.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that\n# program.  This Exception is an additional permission under section 7\n# of the GNU General Public License, version 3 (\"GPLv3\").\n#\n# Originally written by Per Bothner.\n#\n# You can get the latest version of this script from:\n# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD\n#\n# Please send patches with a ChangeLog entry to config-patches@gnu.org.\n\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION]\n\nOutput the configuration name of the system \\`$me' is run on.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.guess ($timestamp)\n\nOriginally written by Per Bothner.\nCopyright 1992-2013 Free Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit ;;\n    --version | -v )\n       echo \"$version\" ; exit ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\" >&2\n       exit 1 ;;\n    * )\n       break ;;\n  esac\ndone\n\nif test $# != 0; then\n  echo \"$me: too many arguments$help\" >&2\n  exit 1\nfi\n\ntrap 'exit 1' 1 2 15\n\n# CC_FOR_BUILD -- compiler used by this script. Note that the use of a\n# compiler to aid in system detection is discouraged as it requires\n# temporary files to be created and, as you can see below, it is a\n# headache to deal with in a portable fashion.\n\n# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still\n# use `HOST_CC' if defined, but it is deprecated.\n\n# Portable tmp directory creation inspired by the Autoconf team.\n\nset_cc_for_build='\ntrap \"exitcode=\\$?; (rm -f \\$tmpfiles 2>/dev/null; rmdir \\$tmp 2>/dev/null) && exit \\$exitcode\" 0 ;\ntrap \"rm -f \\$tmpfiles 2>/dev/null; rmdir \\$tmp 2>/dev/null; exit 1\" 1 2 13 15 ;\n: ${TMPDIR=/tmp} ;\n { tmp=`(umask 077 && mktemp -d \"$TMPDIR/cgXXXXXX\") 2>/dev/null` && test -n \"$tmp\" && test -d \"$tmp\" ; } ||\n { test -n \"$RANDOM\" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } ||\n { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo \"Warning: creating insecure temp directory\" >&2 ; } ||\n { echo \"$me: cannot create a temporary directory in $TMPDIR\" >&2 ; exit 1 ; } ;\ndummy=$tmp/dummy ;\ntmpfiles=\"$dummy.c $dummy.o $dummy.rel $dummy\" ;\ncase $CC_FOR_BUILD,$HOST_CC,$CC in\n ,,)    echo \"int x;\" > $dummy.c ;\n\tfor c in cc gcc c89 c99 ; do\n\t  if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then\n\t     CC_FOR_BUILD=\"$c\"; break ;\n\t  fi ;\n\tdone ;\n\tif test x\"$CC_FOR_BUILD\" = x ; then\n\t  CC_FOR_BUILD=no_compiler_found ;\n\tfi\n\t;;\n ,,*)   CC_FOR_BUILD=$CC ;;\n ,*,*)  CC_FOR_BUILD=$HOST_CC ;;\nesac ; set_cc_for_build= ;'\n\n# This is needed to find uname on a Pyramid OSx when run in the BSD universe.\n# (ghazi@noc.rutgers.edu 1994-08-24)\nif (test -f /.attbin/uname) >/dev/null 2>&1 ; then\n\tPATH=$PATH:/.attbin ; export PATH\nfi\n\nUNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown\nUNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown\nUNAME_SYSTEM=`(uname -s) 2>/dev/null`  || UNAME_SYSTEM=unknown\nUNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown\n\ncase \"${UNAME_SYSTEM}\" in\nLinux|GNU|GNU/*)\n\t# If the system lacks a compiler, then just pick glibc.\n\t# We could probably try harder.\n\tLIBC=gnu\n\n\teval $set_cc_for_build\n\tcat <<-EOF > $dummy.c\n\t#include <features.h>\n\t#if defined(__UCLIBC__)\n\tLIBC=uclibc\n\t#elif defined(__dietlibc__)\n\tLIBC=dietlibc\n\t#else\n\tLIBC=gnu\n\t#endif\n\tEOF\n\teval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC'`\n\t;;\nesac\n\n# Note: order is significant - the case branches are not exclusive.\n\ncase \"${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}\" in\n    *:NetBSD:*:*)\n\t# NetBSD (nbsd) targets should (where applicable) match one or\n\t# more of the tuples: *-*-netbsdelf*, *-*-netbsdaout*,\n\t# *-*-netbsdecoff* and *-*-netbsd*.  For targets that recently\n\t# switched to ELF, *-*-netbsd* would select the old\n\t# object file format.  This provides both forward\n\t# compatibility and a consistent mechanism for selecting the\n\t# object file format.\n\t#\n\t# Note: NetBSD doesn't particularly care about the vendor\n\t# portion of the name.  We always set it to \"unknown\".\n\tsysctl=\"sysctl -n hw.machine_arch\"\n\tUNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \\\n\t    /usr/sbin/$sysctl 2>/dev/null || echo unknown)`\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    armeb) machine=armeb-unknown ;;\n\t    arm*) machine=arm-unknown ;;\n\t    sh3el) machine=shl-unknown ;;\n\t    sh3eb) machine=sh-unknown ;;\n\t    sh5el) machine=sh5le-unknown ;;\n\t    *) machine=${UNAME_MACHINE_ARCH}-unknown ;;\n\tesac\n\t# The Operating System including object format, if it has switched\n\t# to ELF recently, or will in the future.\n\tcase \"${UNAME_MACHINE_ARCH}\" in\n\t    arm*|i386|m68k|ns32k|sh3*|sparc|vax)\n\t\teval $set_cc_for_build\n\t\tif echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t\t\t| grep -q __ELF__\n\t\tthen\n\t\t    # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout).\n\t\t    # Return netbsd for either.  FIX?\n\t\t    os=netbsd\n\t\telse\n\t\t    os=netbsdelf\n\t\tfi\n\t\t;;\n\t    *)\n\t\tos=netbsd\n\t\t;;\n\tesac\n\t# The OS release\n\t# Debian GNU/NetBSD machines have a different userland, and\n\t# thus, need a distinct triplet. However, they do not need\n\t# kernel version information, so it can be replaced with a\n\t# suitable tag, in the style of linux-gnu.\n\tcase \"${UNAME_VERSION}\" in\n\t    Debian*)\n\t\trelease='-gnu'\n\t\t;;\n\t    *)\n\t\trelease=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\\./'`\n\t\t;;\n\tesac\n\t# Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM:\n\t# contains redundant information, the shorter form:\n\t# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used.\n\techo \"${machine}-${os}${release}\"\n\texit ;;\n    *:Bitrig:*:*)\n\tUNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'`\n\techo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE}\n\texit ;;\n    *:OpenBSD:*:*)\n\tUNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'`\n\techo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE}\n\texit ;;\n    *:ekkoBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE}\n\texit ;;\n    *:SolidBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-solidbsd${UNAME_RELEASE}\n\texit ;;\n    macppc:MirBSD:*:*)\n\techo powerpc-unknown-mirbsd${UNAME_RELEASE}\n\texit ;;\n    *:MirBSD:*:*)\n\techo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE}\n\texit ;;\n    alpha:OSF1:*:*)\n\tcase $UNAME_RELEASE in\n\t*4.0)\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'`\n\t\t;;\n\t*5.*)\n\t\tUNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'`\n\t\t;;\n\tesac\n\t# According to Compaq, /usr/sbin/psrinfo has been available on\n\t# OSF/1 and Tru64 systems produced since 1995.  I hope that\n\t# covers most systems running today.  This code pipes the CPU\n\t# types through head -n 1, so we only detect the type of CPU 0.\n\tALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^  The alpha \\(.*\\) processor.*$/\\1/p' | head -n 1`\n\tcase \"$ALPHA_CPU_TYPE\" in\n\t    \"EV4 (21064)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"EV4.5 (21064)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"LCA4 (21066/21068)\")\n\t\tUNAME_MACHINE=\"alpha\" ;;\n\t    \"EV5 (21164)\")\n\t\tUNAME_MACHINE=\"alphaev5\" ;;\n\t    \"EV5.6 (21164A)\")\n\t\tUNAME_MACHINE=\"alphaev56\" ;;\n\t    \"EV5.6 (21164PC)\")\n\t\tUNAME_MACHINE=\"alphapca56\" ;;\n\t    \"EV5.7 (21164PC)\")\n\t\tUNAME_MACHINE=\"alphapca57\" ;;\n\t    \"EV6 (21264)\")\n\t\tUNAME_MACHINE=\"alphaev6\" ;;\n\t    \"EV6.7 (21264A)\")\n\t\tUNAME_MACHINE=\"alphaev67\" ;;\n\t    \"EV6.8CB (21264C)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.8AL (21264B)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.8CX (21264D)\")\n\t\tUNAME_MACHINE=\"alphaev68\" ;;\n\t    \"EV6.9A (21264/EV69A)\")\n\t\tUNAME_MACHINE=\"alphaev69\" ;;\n\t    \"EV7 (21364)\")\n\t\tUNAME_MACHINE=\"alphaev7\" ;;\n\t    \"EV7.9 (21364A)\")\n\t\tUNAME_MACHINE=\"alphaev79\" ;;\n\tesac\n\t# A Pn.n version is a patched version.\n\t# A Vn.n version is a released version.\n\t# A Tn.n version is a released field test version.\n\t# A Xn.n version is an unreleased experimental baselevel.\n\t# 1.2 uses \"1.2\" for uname -r.\n\techo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n\t# Reset EXIT trap before exiting to avoid spurious non-zero exit code.\n\texitcode=$?\n\ttrap '' 0\n\texit $exitcode ;;\n    Alpha\\ *:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# Should we change UNAME_MACHINE based on the output of uname instead\n\t# of the specific Alpha model?\n\techo alpha-pc-interix\n\texit ;;\n    21064:Windows_NT:50:3)\n\techo alpha-dec-winnt3.5\n\texit ;;\n    Amiga*:UNIX_System_V:4.0:*)\n\techo m68k-unknown-sysv4\n\texit ;;\n    *:[Aa]miga[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-amigaos\n\texit ;;\n    *:[Mm]orph[Oo][Ss]:*:*)\n\techo ${UNAME_MACHINE}-unknown-morphos\n\texit ;;\n    *:OS/390:*:*)\n\techo i370-ibm-openedition\n\texit ;;\n    *:z/VM:*:*)\n\techo s390-ibm-zvmoe\n\texit ;;\n    *:OS400:*:*)\n\techo powerpc-ibm-os400\n\texit ;;\n    arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*)\n\techo arm-acorn-riscix${UNAME_RELEASE}\n\texit ;;\n    arm*:riscos:*:*|arm*:RISCOS:*:*)\n\techo arm-unknown-riscos\n\texit ;;\n    SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*)\n\techo hppa1.1-hitachi-hiuxmpp\n\texit ;;\n    Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*)\n\t# akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE.\n\tif test \"`(/bin/universe) 2>/dev/null`\" = att ; then\n\t\techo pyramid-pyramid-sysv3\n\telse\n\t\techo pyramid-pyramid-bsd\n\tfi\n\texit ;;\n    NILE*:*:*:dcosx)\n\techo pyramid-pyramid-svr4\n\texit ;;\n    DRS?6000:unix:4.0:6*)\n\techo sparc-icl-nx6\n\texit ;;\n    DRS?6000:UNIX_SV:4.2*:7* | DRS?6000:isis:4.2*:7*)\n\tcase `/usr/bin/uname -p` in\n\t    sparc) echo sparc-icl-nx7; exit ;;\n\tesac ;;\n    s390x:SunOS:*:*)\n\techo ${UNAME_MACHINE}-ibm-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4H:SunOS:5.*:*)\n\techo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*)\n\techo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    i86pc:AuroraUX:5.*:* | i86xen:AuroraUX:5.*:*)\n\techo i386-pc-auroraux${UNAME_RELEASE}\n\texit ;;\n    i86pc:SunOS:5.*:* | i86xen:SunOS:5.*:*)\n\teval $set_cc_for_build\n\tSUN_ARCH=\"i386\"\n\t# If there is a compiler, see if it is configured for 64-bit objects.\n\t# Note that the Sun cc does not turn __LP64__ into 1 like gcc does.\n\t# This test works for both compilers.\n\tif [ \"$CC_FOR_BUILD\" != 'no_compiler_found' ]; then\n\t    if (echo '#ifdef __amd64'; echo IS_64BIT_ARCH; echo '#endif') | \\\n\t\t(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \\\n\t\tgrep IS_64BIT_ARCH >/dev/null\n\t    then\n\t\tSUN_ARCH=\"x86_64\"\n\t    fi\n\tfi\n\techo ${SUN_ARCH}-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:6*:*)\n\t# According to config.sub, this is the proper way to canonicalize\n\t# SunOS6.  Hard to guess exactly what SunOS6 will be like, but\n\t# it's likely to be more like Solaris than SunOS4.\n\techo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    sun4*:SunOS:*:*)\n\tcase \"`/usr/bin/arch -k`\" in\n\t    Series*|S4*)\n\t\tUNAME_RELEASE=`uname -v`\n\t\t;;\n\tesac\n\t# Japanese Language versions have a version number like `4.1.3-JL'.\n\techo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'`\n\texit ;;\n    sun3*:SunOS:*:*)\n\techo m68k-sun-sunos${UNAME_RELEASE}\n\texit ;;\n    sun*:*:4.2BSD:*)\n\tUNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null`\n\ttest \"x${UNAME_RELEASE}\" = \"x\" && UNAME_RELEASE=3\n\tcase \"`/bin/arch`\" in\n\t    sun3)\n\t\techo m68k-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\t    sun4)\n\t\techo sparc-sun-sunos${UNAME_RELEASE}\n\t\t;;\n\tesac\n\texit ;;\n    aushp:SunOS:*:*)\n\techo sparc-auspex-sunos${UNAME_RELEASE}\n\texit ;;\n    # The situation for MiNT is a little confusing.  The machine name\n    # can be virtually everything (everything which is not\n    # \"atarist\" or \"atariste\" at least should have a processor\n    # > m68000).  The system name ranges from \"MiNT\" over \"FreeMiNT\"\n    # to the lowercase version \"mint\" (or \"freemint\").  Finally\n    # the system name \"TOS\" denotes a system which is actually not\n    # MiNT.  But MiNT is downward compatible to TOS, so this should\n    # be no problem.\n    atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*)\n\techo m68k-atari-mint${UNAME_RELEASE}\n\texit ;;\n    atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*)\n\techo m68k-atari-mint${UNAME_RELEASE}\n\texit ;;\n    *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*)\n\techo m68k-atari-mint${UNAME_RELEASE}\n\texit ;;\n    milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*)\n\techo m68k-milan-mint${UNAME_RELEASE}\n\texit ;;\n    hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*)\n\techo m68k-hades-mint${UNAME_RELEASE}\n\texit ;;\n    *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*)\n\techo m68k-unknown-mint${UNAME_RELEASE}\n\texit ;;\n    m68k:machten:*:*)\n\techo m68k-apple-machten${UNAME_RELEASE}\n\texit ;;\n    powerpc:machten:*:*)\n\techo powerpc-apple-machten${UNAME_RELEASE}\n\texit ;;\n    RISC*:Mach:*:*)\n\techo mips-dec-mach_bsd4.3\n\texit ;;\n    RISC*:ULTRIX:*:*)\n\techo mips-dec-ultrix${UNAME_RELEASE}\n\texit ;;\n    VAX*:ULTRIX*:*:*)\n\techo vax-dec-ultrix${UNAME_RELEASE}\n\texit ;;\n    2020:CLIX:*:* | 2430:CLIX:*:*)\n\techo clipper-intergraph-clix${UNAME_RELEASE}\n\texit ;;\n    mips:*:*:UMIPS | mips:*:*:RISCos)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n#ifdef __cplusplus\n#include <stdio.h>  /* for printf() prototype */\n\tint main (int argc, char *argv[]) {\n#else\n\tint main (argc, argv) int argc; char *argv[]; {\n#endif\n\t#if defined (host_mips) && defined (MIPSEB)\n\t#if defined (SYSTYPE_SYSV)\n\t  printf (\"mips-mips-riscos%ssysv\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_SVR4)\n\t  printf (\"mips-mips-riscos%ssvr4\\n\", argv[1]); exit (0);\n\t#endif\n\t#if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD)\n\t  printf (\"mips-mips-riscos%sbsd\\n\", argv[1]); exit (0);\n\t#endif\n\t#endif\n\t  exit (-1);\n\t}\nEOF\n\t$CC_FOR_BUILD -o $dummy $dummy.c &&\n\t  dummyarg=`echo \"${UNAME_RELEASE}\" | sed -n 's/\\([0-9]*\\).*/\\1/p'` &&\n\t  SYSTEM_NAME=`$dummy $dummyarg` &&\n\t    { echo \"$SYSTEM_NAME\"; exit; }\n\techo mips-mips-riscos${UNAME_RELEASE}\n\texit ;;\n    Motorola:PowerMAX_OS:*:*)\n\techo powerpc-motorola-powermax\n\texit ;;\n    Motorola:*:4.3:PL8-*)\n\techo powerpc-harris-powermax\n\texit ;;\n    Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*)\n\techo powerpc-harris-powermax\n\texit ;;\n    Night_Hawk:Power_UNIX:*:*)\n\techo powerpc-harris-powerunix\n\texit ;;\n    m88k:CX/UX:7*:*)\n\techo m88k-harris-cxux7\n\texit ;;\n    m88k:*:4*:R4*)\n\techo m88k-motorola-sysv4\n\texit ;;\n    m88k:*:3*:R3*)\n\techo m88k-motorola-sysv3\n\texit ;;\n    AViiON:dgux:*:*)\n\t# DG/UX returns AViiON for all architectures\n\tUNAME_PROCESSOR=`/usr/bin/uname -p`\n\tif [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ]\n\tthen\n\t    if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \\\n\t       [ ${TARGET_BINARY_INTERFACE}x = x ]\n\t    then\n\t\techo m88k-dg-dgux${UNAME_RELEASE}\n\t    else\n\t\techo m88k-dg-dguxbcs${UNAME_RELEASE}\n\t    fi\n\telse\n\t    echo i586-dg-dgux${UNAME_RELEASE}\n\tfi\n\texit ;;\n    M88*:DolphinOS:*:*)\t# DolphinOS (SVR3)\n\techo m88k-dolphin-sysv3\n\texit ;;\n    M88*:*:R3*:*)\n\t# Delta 88k system running SVR3\n\techo m88k-motorola-sysv3\n\texit ;;\n    XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3)\n\techo m88k-tektronix-sysv3\n\texit ;;\n    Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD)\n\techo m68k-tektronix-bsd\n\texit ;;\n    *:IRIX*:*:*)\n\techo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'`\n\texit ;;\n    ????????:AIX?:[12].1:2)   # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX.\n\techo romp-ibm-aix     # uname -m gives an 8 hex-code CPU id\n\texit ;;               # Note that: echo \"'`uname -s`'\" gives 'AIX '\n    i*86:AIX:*:*)\n\techo i386-ibm-aix\n\texit ;;\n    ia64:AIX:*:*)\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${UNAME_MACHINE}-ibm-aix${IBM_REV}\n\texit ;;\n    *:AIX:2:3)\n\tif grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\teval $set_cc_for_build\n\t\tsed 's/^\t\t//' << EOF >$dummy.c\n\t\t#include <sys/systemcfg.h>\n\n\t\tmain()\n\t\t\t{\n\t\t\tif (!__power_pc())\n\t\t\t\texit(1);\n\t\t\tputs(\"powerpc-ibm-aix3.2.5\");\n\t\t\texit(0);\n\t\t\t}\nEOF\n\t\tif $CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy`\n\t\tthen\n\t\t\techo \"$SYSTEM_NAME\"\n\t\telse\n\t\t\techo rs6000-ibm-aix3.2.5\n\t\tfi\n\telif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then\n\t\techo rs6000-ibm-aix3.2.4\n\telse\n\t\techo rs6000-ibm-aix3.2\n\tfi\n\texit ;;\n    *:AIX:*:[4567])\n\tIBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'`\n\tif /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then\n\t\tIBM_ARCH=rs6000\n\telse\n\t\tIBM_ARCH=powerpc\n\tfi\n\tif [ -x /usr/bin/oslevel ] ; then\n\t\tIBM_REV=`/usr/bin/oslevel`\n\telse\n\t\tIBM_REV=${UNAME_VERSION}.${UNAME_RELEASE}\n\tfi\n\techo ${IBM_ARCH}-ibm-aix${IBM_REV}\n\texit ;;\n    *:AIX:*:*)\n\techo rs6000-ibm-aix\n\texit ;;\n    ibmrt:4.4BSD:*|romp-ibm:BSD:*)\n\techo romp-ibm-bsd4.4\n\texit ;;\n    ibmrt:*BSD:*|romp-ibm:BSD:*)            # covers RT/PC BSD and\n\techo romp-ibm-bsd${UNAME_RELEASE}   # 4.3 with uname added to\n\texit ;;                             # report: romp-ibm BSD 4.3\n    *:BOSX:*:*)\n\techo rs6000-bull-bosx\n\texit ;;\n    DPX/2?00:B.O.S.:*:*)\n\techo m68k-bull-sysv3\n\texit ;;\n    9000/[34]??:4.3bsd:1.*:*)\n\techo m68k-hp-bsd\n\texit ;;\n    hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*)\n\techo m68k-hp-bsd4.4\n\texit ;;\n    9000/[34678]??:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\tcase \"${UNAME_MACHINE}\" in\n\t    9000/31? )            HP_ARCH=m68000 ;;\n\t    9000/[34]?? )         HP_ARCH=m68k ;;\n\t    9000/[678][0-9][0-9])\n\t\tif [ -x /usr/bin/getconf ]; then\n\t\t    sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null`\n\t\t    sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null`\n\t\t    case \"${sc_cpu_version}\" in\n\t\t      523) HP_ARCH=\"hppa1.0\" ;; # CPU_PA_RISC1_0\n\t\t      528) HP_ARCH=\"hppa1.1\" ;; # CPU_PA_RISC1_1\n\t\t      532)                      # CPU_PA_RISC2_0\n\t\t\tcase \"${sc_kernel_bits}\" in\n\t\t\t  32) HP_ARCH=\"hppa2.0n\" ;;\n\t\t\t  64) HP_ARCH=\"hppa2.0w\" ;;\n\t\t\t  '') HP_ARCH=\"hppa2.0\" ;;   # HP-UX 10.20\n\t\t\tesac ;;\n\t\t    esac\n\t\tfi\n\t\tif [ \"${HP_ARCH}\" = \"\" ]; then\n\t\t    eval $set_cc_for_build\n\t\t    sed 's/^\t\t//' << EOF >$dummy.c\n\n\t\t#define _HPUX_SOURCE\n\t\t#include <stdlib.h>\n\t\t#include <unistd.h>\n\n\t\tint main ()\n\t\t{\n\t\t#if defined(_SC_KERNEL_BITS)\n\t\t    long bits = sysconf(_SC_KERNEL_BITS);\n\t\t#endif\n\t\t    long cpu  = sysconf (_SC_CPU_VERSION);\n\n\t\t    switch (cpu)\n\t\t\t{\n\t\t\tcase CPU_PA_RISC1_0: puts (\"hppa1.0\"); break;\n\t\t\tcase CPU_PA_RISC1_1: puts (\"hppa1.1\"); break;\n\t\t\tcase CPU_PA_RISC2_0:\n\t\t#if defined(_SC_KERNEL_BITS)\n\t\t\t    switch (bits)\n\t\t\t\t{\n\t\t\t\tcase 64: puts (\"hppa2.0w\"); break;\n\t\t\t\tcase 32: puts (\"hppa2.0n\"); break;\n\t\t\t\tdefault: puts (\"hppa2.0\"); break;\n\t\t\t\t} break;\n\t\t#else  /* !defined(_SC_KERNEL_BITS) */\n\t\t\t    puts (\"hppa2.0\"); break;\n\t\t#endif\n\t\t\tdefault: puts (\"hppa1.0\"); break;\n\t\t\t}\n\t\t    exit (0);\n\t\t}\nEOF\n\t\t    (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy`\n\t\t    test -z \"$HP_ARCH\" && HP_ARCH=hppa\n\t\tfi ;;\n\tesac\n\tif [ ${HP_ARCH} = \"hppa2.0w\" ]\n\tthen\n\t    eval $set_cc_for_build\n\n\t    # hppa2.0w-hp-hpux* has a 64-bit kernel and a compiler generating\n\t    # 32-bit code.  hppa64-hp-hpux* has the same kernel and a compiler\n\t    # generating 64-bit code.  GNU and HP use different nomenclature:\n\t    #\n\t    # $ CC_FOR_BUILD=cc ./config.guess\n\t    # => hppa2.0w-hp-hpux11.23\n\t    # $ CC_FOR_BUILD=\"cc +DA2.0w\" ./config.guess\n\t    # => hppa64-hp-hpux11.23\n\n\t    if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) |\n\t\tgrep -q __LP64__\n\t    then\n\t\tHP_ARCH=\"hppa2.0w\"\n\t    else\n\t\tHP_ARCH=\"hppa64\"\n\t    fi\n\tfi\n\techo ${HP_ARCH}-hp-hpux${HPUX_REV}\n\texit ;;\n    ia64:HP-UX:*:*)\n\tHPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'`\n\techo ia64-hp-hpux${HPUX_REV}\n\texit ;;\n    3050*:HI-UX:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#include <unistd.h>\n\tint\n\tmain ()\n\t{\n\t  long cpu = sysconf (_SC_CPU_VERSION);\n\t  /* The order matters, because CPU_IS_HP_MC68K erroneously returns\n\t     true for CPU_PA_RISC1_0.  CPU_IS_PA_RISC returns correct\n\t     results, however.  */\n\t  if (CPU_IS_PA_RISC (cpu))\n\t    {\n\t      switch (cpu)\n\t\t{\n\t\t  case CPU_PA_RISC1_0: puts (\"hppa1.0-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC1_1: puts (\"hppa1.1-hitachi-hiuxwe2\"); break;\n\t\t  case CPU_PA_RISC2_0: puts (\"hppa2.0-hitachi-hiuxwe2\"); break;\n\t\t  default: puts (\"hppa-hitachi-hiuxwe2\"); break;\n\t\t}\n\t    }\n\t  else if (CPU_IS_HP_MC68K (cpu))\n\t    puts (\"m68k-hitachi-hiuxwe2\");\n\t  else puts (\"unknown-hitachi-hiuxwe2\");\n\t  exit (0);\n\t}\nEOF\n\t$CC_FOR_BUILD -o $dummy $dummy.c && SYSTEM_NAME=`$dummy` &&\n\t\t{ echo \"$SYSTEM_NAME\"; exit; }\n\techo unknown-hitachi-hiuxwe2\n\texit ;;\n    9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* )\n\techo hppa1.1-hp-bsd\n\texit ;;\n    9000/8??:4.3bsd:*:*)\n\techo hppa1.0-hp-bsd\n\texit ;;\n    *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*)\n\techo hppa1.0-hp-mpeix\n\texit ;;\n    hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* )\n\techo hppa1.1-hp-osf\n\texit ;;\n    hp8??:OSF1:*:*)\n\techo hppa1.0-hp-osf\n\texit ;;\n    i*86:OSF1:*:*)\n\tif [ -x /usr/sbin/sysversion ] ; then\n\t    echo ${UNAME_MACHINE}-unknown-osf1mk\n\telse\n\t    echo ${UNAME_MACHINE}-unknown-osf1\n\tfi\n\texit ;;\n    parisc*:Lites*:*:*)\n\techo hppa1.1-hp-lites\n\texit ;;\n    C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*)\n\techo c1-convex-bsd\n\texit ;;\n    C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n\texit ;;\n    C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*)\n\techo c34-convex-bsd\n\texit ;;\n    C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*)\n\techo c38-convex-bsd\n\texit ;;\n    C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*)\n\techo c4-convex-bsd\n\texit ;;\n    CRAY*Y-MP:*:*:*)\n\techo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*[A-Z]90:*:*:*)\n\techo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \\\n\t| sed -e 's/CRAY.*\\([A-Z]90\\)/\\1/' \\\n\t      -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \\\n\t      -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*TS:*:*:*)\n\techo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*T3E:*:*:*)\n\techo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    CRAY*SV1:*:*:*)\n\techo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    *:UNICOS/mp:*:*)\n\techo craynv-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\\.[^.]*$/.X/'\n\texit ;;\n    F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*)\n\tFUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'`\n\tFUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\\///'`\n\tFUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'`\n\techo \"${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\n\texit ;;\n    5000:UNIX_System_V:4.*:*)\n\tFUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\\///'`\n\tFUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'`\n\techo \"sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}\"\n\texit ;;\n    i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\\ Embedded/OS:*:*)\n\techo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE}\n\texit ;;\n    sparc*:BSD/OS:*:*)\n\techo sparc-unknown-bsdi${UNAME_RELEASE}\n\texit ;;\n    *:BSD/OS:*:*)\n\techo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE}\n\texit ;;\n    *:FreeBSD:*:*)\n\tUNAME_PROCESSOR=`/usr/bin/uname -p`\n\tcase ${UNAME_PROCESSOR} in\n\t    amd64)\n\t\techo x86_64-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;\n\t    *)\n\t\techo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` ;;\n\tesac\n\texit ;;\n    i*:CYGWIN*:*)\n\techo ${UNAME_MACHINE}-pc-cygwin\n\texit ;;\n    *:MINGW64*:*)\n\techo ${UNAME_MACHINE}-pc-mingw64\n\texit ;;\n    *:MINGW*:*)\n\techo ${UNAME_MACHINE}-pc-mingw32\n\texit ;;\n    i*:MSYS*:*)\n\techo ${UNAME_MACHINE}-pc-msys\n\texit ;;\n    i*:windows32*:*)\n\t# uname -m includes \"-pc\" on this system.\n\techo ${UNAME_MACHINE}-mingw32\n\texit ;;\n    i*:PW*:*)\n\techo ${UNAME_MACHINE}-pc-pw32\n\texit ;;\n    *:Interix*:*)\n\tcase ${UNAME_MACHINE} in\n\t    x86)\n\t\techo i586-pc-interix${UNAME_RELEASE}\n\t\texit ;;\n\t    authenticamd | genuineintel | EM64T)\n\t\techo x86_64-unknown-interix${UNAME_RELEASE}\n\t\texit ;;\n\t    IA64)\n\t\techo ia64-unknown-interix${UNAME_RELEASE}\n\t\texit ;;\n\tesac ;;\n    [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*)\n\techo i${UNAME_MACHINE}-pc-mks\n\texit ;;\n    8664:Windows_NT:*)\n\techo x86_64-pc-mks\n\texit ;;\n    i*:Windows_NT*:* | Pentium*:Windows_NT*:*)\n\t# How do we know it's Interix rather than the generic POSIX subsystem?\n\t# It also conflicts with pre-2.0 versions of AT&T UWIN. Should we\n\t# UNAME_MACHINE based on the output of uname instead of i386?\n\techo i586-pc-interix\n\texit ;;\n    i*:UWIN*:*)\n\techo ${UNAME_MACHINE}-pc-uwin\n\texit ;;\n    amd64:CYGWIN*:*:* | x86_64:CYGWIN*:*:*)\n\techo x86_64-unknown-cygwin\n\texit ;;\n    p*:CYGWIN*:*)\n\techo powerpcle-unknown-cygwin\n\texit ;;\n    prep*:SunOS:5.*:*)\n\techo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'`\n\texit ;;\n    *:GNU:*:*)\n\t# the GNU system\n\techo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-${LIBC}`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'`\n\texit ;;\n    *:GNU/*:*:*)\n\t# other systems with GNU libc and userland\n\techo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC}\n\texit ;;\n    i*86:Minix:*:*)\n\techo ${UNAME_MACHINE}-pc-minix\n\texit ;;\n    aarch64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    aarch64_be:Linux:*:*)\n\tUNAME_MACHINE=aarch64_be\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    alpha:Linux:*:*)\n\tcase `sed -n '/^cpu model/s/^.*: \\(.*\\)/\\1/p' < /proc/cpuinfo` in\n\t  EV5)   UNAME_MACHINE=alphaev5 ;;\n\t  EV56)  UNAME_MACHINE=alphaev56 ;;\n\t  PCA56) UNAME_MACHINE=alphapca56 ;;\n\t  PCA57) UNAME_MACHINE=alphapca56 ;;\n\t  EV6)   UNAME_MACHINE=alphaev6 ;;\n\t  EV67)  UNAME_MACHINE=alphaev67 ;;\n\t  EV68*) UNAME_MACHINE=alphaev68 ;;\n\tesac\n\tobjdump --private-headers /bin/sh | grep -q ld.so.1\n\tif test \"$?\" = 0 ; then LIBC=\"gnulibc1\" ; fi\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    arc:Linux:*:* | arceb:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    arm*:Linux:*:*)\n\teval $set_cc_for_build\n\tif echo __ARM_EABI__ | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t    | grep -q __ARM_EABI__\n\tthen\n\t    echo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\telse\n\t    if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \\\n\t\t| grep -q __ARM_PCS_VFP\n\t    then\n\t\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi\n\t    else\n\t\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf\n\t    fi\n\tfi\n\texit ;;\n    avr32*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    cris:Linux:*:*)\n\techo ${UNAME_MACHINE}-axis-linux-${LIBC}\n\texit ;;\n    crisv32:Linux:*:*)\n\techo ${UNAME_MACHINE}-axis-linux-${LIBC}\n\texit ;;\n    frv:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    hexagon:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    i*86:Linux:*:*)\n\techo ${UNAME_MACHINE}-pc-linux-${LIBC}\n\texit ;;\n    ia64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    m32r*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    m68*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    mips:Linux:*:* | mips64:Linux:*:*)\n\teval $set_cc_for_build\n\tsed 's/^\t//' << EOF >$dummy.c\n\t#undef CPU\n\t#undef ${UNAME_MACHINE}\n\t#undef ${UNAME_MACHINE}el\n\t#if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL)\n\tCPU=${UNAME_MACHINE}el\n\t#else\n\t#if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB)\n\tCPU=${UNAME_MACHINE}\n\t#else\n\tCPU=\n\t#endif\n\t#endif\nEOF\n\teval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^CPU'`\n\ttest x\"${CPU}\" != x && { echo \"${CPU}-unknown-linux-${LIBC}\"; exit; }\n\t;;\n    or1k:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    or32:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    padre:Linux:*:*)\n\techo sparc-unknown-linux-${LIBC}\n\texit ;;\n    parisc64:Linux:*:* | hppa64:Linux:*:*)\n\techo hppa64-unknown-linux-${LIBC}\n\texit ;;\n    parisc:Linux:*:* | hppa:Linux:*:*)\n\t# Look for CPU level\n\tcase `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in\n\t  PA7*) echo hppa1.1-unknown-linux-${LIBC} ;;\n\t  PA8*) echo hppa2.0-unknown-linux-${LIBC} ;;\n\t  *)    echo hppa-unknown-linux-${LIBC} ;;\n\tesac\n\texit ;;\n    ppc64:Linux:*:*)\n\techo powerpc64-unknown-linux-${LIBC}\n\texit ;;\n    ppc:Linux:*:*)\n\techo powerpc-unknown-linux-${LIBC}\n\texit ;;\n    ppc64le:Linux:*:*)\n\techo powerpc64le-unknown-linux-${LIBC}\n\texit ;;\n    ppcle:Linux:*:*)\n\techo powerpcle-unknown-linux-${LIBC}\n\texit ;;\n    s390:Linux:*:* | s390x:Linux:*:*)\n\techo ${UNAME_MACHINE}-ibm-linux-${LIBC}\n\texit ;;\n    sh64*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    sh*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    sparc:Linux:*:* | sparc64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    tile*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    vax:Linux:*:*)\n\techo ${UNAME_MACHINE}-dec-linux-${LIBC}\n\texit ;;\n    x86_64:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    xtensa*:Linux:*:*)\n\techo ${UNAME_MACHINE}-unknown-linux-${LIBC}\n\texit ;;\n    i*86:DYNIX/ptx:4*:*)\n\t# ptx 4.0 does uname -s correctly, with DYNIX/ptx in there.\n\t# earlier versions are messed up and put the nodename in both\n\t# sysname and nodename.\n\techo i386-sequent-sysv4\n\texit ;;\n    i*86:UNIX_SV:4.2MP:2.*)\n\t# Unixware is an offshoot of SVR4, but it has its own version\n\t# number series starting with 2...\n\t# I am not positive that other SVR4 systems won't match this,\n\t# I just have to hope.  -- rms.\n\t# Use sysv4.2uw... so that sysv4* matches it.\n\techo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION}\n\texit ;;\n    i*86:OS/2:*:*)\n\t# If we were able to find `uname', then EMX Unix compatibility\n\t# is probably installed.\n\techo ${UNAME_MACHINE}-pc-os2-emx\n\texit ;;\n    i*86:XTS-300:*:STOP)\n\techo ${UNAME_MACHINE}-unknown-stop\n\texit ;;\n    i*86:atheos:*:*)\n\techo ${UNAME_MACHINE}-unknown-atheos\n\texit ;;\n    i*86:syllable:*:*)\n\techo ${UNAME_MACHINE}-pc-syllable\n\texit ;;\n    i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.[02]*:*)\n\techo i386-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    i*86:*DOS:*:*)\n\techo ${UNAME_MACHINE}-pc-msdosdjgpp\n\texit ;;\n    i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*)\n\tUNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\\/MP$//'`\n\tif grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then\n\t\techo ${UNAME_MACHINE}-univel-sysv${UNAME_REL}\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv${UNAME_REL}\n\tfi\n\texit ;;\n    i*86:*:5:[678]*)\n\t# UnixWare 7.x, OpenUNIX and OpenServer 6.\n\tcase `/bin/uname -X | grep \"^Machine\"` in\n\t    *486*)\t     UNAME_MACHINE=i486 ;;\n\t    *Pentium)\t     UNAME_MACHINE=i586 ;;\n\t    *Pent*|*Celeron) UNAME_MACHINE=i686 ;;\n\tesac\n\techo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION}\n\texit ;;\n    i*86:*:3.2:*)\n\tif test -f /usr/options/cb.name; then\n\t\tUNAME_REL=`sed -n 's/.*Version //p' </usr/options/cb.name`\n\t\techo ${UNAME_MACHINE}-pc-isc$UNAME_REL\n\telif /bin/uname -X 2>/dev/null >/dev/null ; then\n\t\tUNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')`\n\t\t(/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486\n\t\t(/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i586\n\t\t(/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\t(/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \\\n\t\t\t&& UNAME_MACHINE=i686\n\t\techo ${UNAME_MACHINE}-pc-sco$UNAME_REL\n\telse\n\t\techo ${UNAME_MACHINE}-pc-sysv32\n\tfi\n\texit ;;\n    pc:*:*:*)\n\t# Left here for compatibility:\n\t# uname -m prints for DJGPP always 'pc', but it prints nothing about\n\t# the processor, so we play safe by assuming i586.\n\t# Note: whatever this is, it MUST be the same as what config.sub\n\t# prints for the \"djgpp\" host, or else GDB configury will decide that\n\t# this is a cross-build.\n\techo i586-pc-msdosdjgpp\n\texit ;;\n    Intel:Mach:3*:*)\n\techo i386-pc-mach3\n\texit ;;\n    paragon:*:*:*)\n\techo i860-intel-osf1\n\texit ;;\n    i860:*:4.*:*) # i860-SVR4\n\tif grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then\n\t  echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4\n\telse # Add other i860-SVR4 vendors below as they are discovered.\n\t  echo i860-unknown-sysv${UNAME_RELEASE}  # Unknown i860-SVR4\n\tfi\n\texit ;;\n    mini*:CTIX:SYS*5:*)\n\t# \"miniframe\"\n\techo m68010-convergent-sysv\n\texit ;;\n    mc68k:UNIX:SYSTEM5:3.51m)\n\techo m68k-convergent-sysv\n\texit ;;\n    M680?0:D-NIX:5.3:*)\n\techo m68k-diab-dnix\n\texit ;;\n    M68*:*:R3V[5678]*:*)\n\ttest -r /sysV68 && { echo 'm68k-motorola-sysv'; exit; } ;;\n    3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0 | S7501*:*:4.0:3.0)\n\tOS_REL=''\n\ttest -r /etc/.relid \\\n\t&& OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t  && { echo i486-ncr-sysv4.3${OS_REL}; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t  && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;\n    3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*)\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t  && { echo i486-ncr-sysv4; exit; } ;;\n    NCR*:*:4.2:* | MPRAS*:*:4.2:*)\n\tOS_REL='.3'\n\ttest -r /etc/.relid \\\n\t    && OS_REL=.`sed -n 's/[^ ]* [^ ]* \\([0-9][0-9]\\).*/\\1/p' < /etc/.relid`\n\t/bin/uname -p 2>/dev/null | grep 86 >/dev/null \\\n\t    && { echo i486-ncr-sysv4.3${OS_REL}; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \\\n\t    && { echo i586-ncr-sysv4.3${OS_REL}; exit; }\n\t/bin/uname -p 2>/dev/null | /bin/grep pteron >/dev/null \\\n\t    && { echo i586-ncr-sysv4.3${OS_REL}; exit; } ;;\n    m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*)\n\techo m68k-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    mc68030:UNIX_System_V:4.*:*)\n\techo m68k-atari-sysv4\n\texit ;;\n    TSUNAMI:LynxOS:2.*:*)\n\techo sparc-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    rs6000:LynxOS:2.*:*)\n\techo rs6000-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.[02]*:*)\n\techo powerpc-unknown-lynxos${UNAME_RELEASE}\n\texit ;;\n    SM[BE]S:UNIX_SV:*:*)\n\techo mips-dde-sysv${UNAME_RELEASE}\n\texit ;;\n    RM*:ReliantUNIX-*:*:*)\n\techo mips-sni-sysv4\n\texit ;;\n    RM*:SINIX-*:*:*)\n\techo mips-sni-sysv4\n\texit ;;\n    *:SINIX-*:*:*)\n\tif uname -p 2>/dev/null >/dev/null ; then\n\t\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\t\techo ${UNAME_MACHINE}-sni-sysv4\n\telse\n\t\techo ns32k-sni-sysv\n\tfi\n\texit ;;\n    PENTIUM:*:4.0*:*)\t# Unisys `ClearPath HMP IX 4000' SVR4/MP effort\n\t\t\t# says <Richard.M.Bartel@ccMail.Census.GOV>\n\techo i586-unisys-sysv4\n\texit ;;\n    *:UNIX_System_V:4*:FTX*)\n\t# From Gerald Hewes <hewes@openmarket.com>.\n\t# How about differentiating between stratus architectures? -djm\n\techo hppa1.1-stratus-sysv4\n\texit ;;\n    *:*:*:FTX*)\n\t# From seanf@swdc.stratus.com.\n\techo i860-stratus-sysv4\n\texit ;;\n    i*86:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\techo ${UNAME_MACHINE}-stratus-vos\n\texit ;;\n    *:VOS:*:*)\n\t# From Paul.Green@stratus.com.\n\techo hppa1.1-stratus-vos\n\texit ;;\n    mc68*:A/UX:*:*)\n\techo m68k-apple-aux${UNAME_RELEASE}\n\texit ;;\n    news*:NEWS-OS:6*:*)\n\techo mips-sony-newsos6\n\texit ;;\n    R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*)\n\tif [ -d /usr/nec ]; then\n\t\techo mips-nec-sysv${UNAME_RELEASE}\n\telse\n\t\techo mips-unknown-sysv${UNAME_RELEASE}\n\tfi\n\texit ;;\n    BeBox:BeOS:*:*)\t# BeOS running on hardware made by Be, PPC only.\n\techo powerpc-be-beos\n\texit ;;\n    BeMac:BeOS:*:*)\t# BeOS running on Mac or Mac clone, PPC only.\n\techo powerpc-apple-beos\n\texit ;;\n    BePC:BeOS:*:*)\t# BeOS running on Intel PC compatible.\n\techo i586-pc-beos\n\texit ;;\n    BePC:Haiku:*:*)\t# Haiku running on Intel PC compatible.\n\techo i586-pc-haiku\n\texit ;;\n    x86_64:Haiku:*:*)\n\techo x86_64-unknown-haiku\n\texit ;;\n    SX-4:SUPER-UX:*:*)\n\techo sx4-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-5:SUPER-UX:*:*)\n\techo sx5-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-6:SUPER-UX:*:*)\n\techo sx6-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-7:SUPER-UX:*:*)\n\techo sx7-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-8:SUPER-UX:*:*)\n\techo sx8-nec-superux${UNAME_RELEASE}\n\texit ;;\n    SX-8R:SUPER-UX:*:*)\n\techo sx8r-nec-superux${UNAME_RELEASE}\n\texit ;;\n    Power*:Rhapsody:*:*)\n\techo powerpc-apple-rhapsody${UNAME_RELEASE}\n\texit ;;\n    *:Rhapsody:*:*)\n\techo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE}\n\texit ;;\n    *:Darwin:*:*)\n\tUNAME_PROCESSOR=`uname -p` || UNAME_PROCESSOR=unknown\n\teval $set_cc_for_build\n\tif test \"$UNAME_PROCESSOR\" = unknown ; then\n\t    UNAME_PROCESSOR=powerpc\n\tfi\n\tif [ \"$CC_FOR_BUILD\" != 'no_compiler_found' ]; then\n\t    if (echo '#ifdef __LP64__'; echo IS_64BIT_ARCH; echo '#endif') | \\\n\t\t(CCOPTS= $CC_FOR_BUILD -E - 2>/dev/null) | \\\n\t\tgrep IS_64BIT_ARCH >/dev/null\n\t    then\n\t\tcase $UNAME_PROCESSOR in\n\t\t    i386) UNAME_PROCESSOR=x86_64 ;;\n\t\t    powerpc) UNAME_PROCESSOR=powerpc64 ;;\n\t\tesac\n\t    fi\n\tfi\n\techo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE}\n\texit ;;\n    *:procnto*:*:* | *:QNX:[0123456789]*:*)\n\tUNAME_PROCESSOR=`uname -p`\n\tif test \"$UNAME_PROCESSOR\" = \"x86\"; then\n\t\tUNAME_PROCESSOR=i386\n\t\tUNAME_MACHINE=pc\n\tfi\n\techo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE}\n\texit ;;\n    *:QNX:*:4*)\n\techo i386-pc-qnx\n\texit ;;\n    NEO-?:NONSTOP_KERNEL:*:*)\n\techo neo-tandem-nsk${UNAME_RELEASE}\n\texit ;;\n    NSE-*:NONSTOP_KERNEL:*:*)\n\techo nse-tandem-nsk${UNAME_RELEASE}\n\texit ;;\n    NSR-?:NONSTOP_KERNEL:*:*)\n\techo nsr-tandem-nsk${UNAME_RELEASE}\n\texit ;;\n    *:NonStop-UX:*:*)\n\techo mips-compaq-nonstopux\n\texit ;;\n    BS2000:POSIX*:*:*)\n\techo bs2000-siemens-sysv\n\texit ;;\n    DS/*:UNIX_System_V:*:*)\n\techo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE}\n\texit ;;\n    *:Plan9:*:*)\n\t# \"uname -m\" is not consistent, so use $cputype instead. 386\n\t# is converted to i386 for consistency with other x86\n\t# operating systems.\n\tif test \"$cputype\" = \"386\"; then\n\t    UNAME_MACHINE=i386\n\telse\n\t    UNAME_MACHINE=\"$cputype\"\n\tfi\n\techo ${UNAME_MACHINE}-unknown-plan9\n\texit ;;\n    *:TOPS-10:*:*)\n\techo pdp10-unknown-tops10\n\texit ;;\n    *:TENEX:*:*)\n\techo pdp10-unknown-tenex\n\texit ;;\n    KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*)\n\techo pdp10-dec-tops20\n\texit ;;\n    XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*)\n\techo pdp10-xkl-tops20\n\texit ;;\n    *:TOPS-20:*:*)\n\techo pdp10-unknown-tops20\n\texit ;;\n    *:ITS:*:*)\n\techo pdp10-unknown-its\n\texit ;;\n    SEI:*:*:SEIUX)\n\techo mips-sei-seiux${UNAME_RELEASE}\n\texit ;;\n    *:DragonFly:*:*)\n\techo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`\n\texit ;;\n    *:*VMS:*:*)\n\tUNAME_MACHINE=`(uname -p) 2>/dev/null`\n\tcase \"${UNAME_MACHINE}\" in\n\t    A*) echo alpha-dec-vms ; exit ;;\n\t    I*) echo ia64-dec-vms ; exit ;;\n\t    V*) echo vax-dec-vms ; exit ;;\n\tesac ;;\n    *:XENIX:*:SysV)\n\techo i386-pc-xenix\n\texit ;;\n    i*86:skyos:*:*)\n\techo ${UNAME_MACHINE}-pc-skyos`echo ${UNAME_RELEASE}` | sed -e 's/ .*$//'\n\texit ;;\n    i*86:rdos:*:*)\n\techo ${UNAME_MACHINE}-pc-rdos\n\texit ;;\n    i*86:AROS:*:*)\n\techo ${UNAME_MACHINE}-pc-aros\n\texit ;;\n    x86_64:VMkernel:*:*)\n\techo ${UNAME_MACHINE}-unknown-esx\n\texit ;;\nesac\n\neval $set_cc_for_build\ncat >$dummy.c <<EOF\n#ifdef _SEQUENT_\n# include <sys/types.h>\n# include <sys/utsname.h>\n#endif\nmain ()\n{\n#if defined (sony)\n#if defined (MIPSEB)\n  /* BFD wants \"bsd\" instead of \"newsos\".  Perhaps BFD should be changed,\n     I don't know....  */\n  printf (\"mips-sony-bsd\\n\"); exit (0);\n#else\n#include <sys/param.h>\n  printf (\"m68k-sony-newsos%s\\n\",\n#ifdef NEWSOS4\n\t\"4\"\n#else\n\t\"\"\n#endif\n\t); exit (0);\n#endif\n#endif\n\n#if defined (__arm) && defined (__acorn) && defined (__unix)\n  printf (\"arm-acorn-riscix\\n\"); exit (0);\n#endif\n\n#if defined (hp300) && !defined (hpux)\n  printf (\"m68k-hp-bsd\\n\"); exit (0);\n#endif\n\n#if defined (NeXT)\n#if !defined (__ARCHITECTURE__)\n#define __ARCHITECTURE__ \"m68k\"\n#endif\n  int version;\n  version=`(hostinfo | sed -n 's/.*NeXT Mach \\([0-9]*\\).*/\\1/p') 2>/dev/null`;\n  if (version < 4)\n    printf (\"%s-next-nextstep%d\\n\", __ARCHITECTURE__, version);\n  else\n    printf (\"%s-next-openstep%d\\n\", __ARCHITECTURE__, version);\n  exit (0);\n#endif\n\n#if defined (MULTIMAX) || defined (n16)\n#if defined (UMAXV)\n  printf (\"ns32k-encore-sysv\\n\"); exit (0);\n#else\n#if defined (CMU)\n  printf (\"ns32k-encore-mach\\n\"); exit (0);\n#else\n  printf (\"ns32k-encore-bsd\\n\"); exit (0);\n#endif\n#endif\n#endif\n\n#if defined (__386BSD__)\n  printf (\"i386-pc-bsd\\n\"); exit (0);\n#endif\n\n#if defined (sequent)\n#if defined (i386)\n  printf (\"i386-sequent-dynix\\n\"); exit (0);\n#endif\n#if defined (ns32000)\n  printf (\"ns32k-sequent-dynix\\n\"); exit (0);\n#endif\n#endif\n\n#if defined (_SEQUENT_)\n    struct utsname un;\n\n    uname(&un);\n\n    if (strncmp(un.version, \"V2\", 2) == 0) {\n\tprintf (\"i386-sequent-ptx2\\n\"); exit (0);\n    }\n    if (strncmp(un.version, \"V1\", 2) == 0) { /* XXX is V1 correct? */\n\tprintf (\"i386-sequent-ptx1\\n\"); exit (0);\n    }\n    printf (\"i386-sequent-ptx\\n\"); exit (0);\n\n#endif\n\n#if defined (vax)\n# if !defined (ultrix)\n#  include <sys/param.h>\n#  if defined (BSD)\n#   if BSD == 43\n      printf (\"vax-dec-bsd4.3\\n\"); exit (0);\n#   else\n#    if BSD == 199006\n      printf (\"vax-dec-bsd4.3reno\\n\"); exit (0);\n#    else\n      printf (\"vax-dec-bsd\\n\"); exit (0);\n#    endif\n#   endif\n#  else\n    printf (\"vax-dec-bsd\\n\"); exit (0);\n#  endif\n# else\n    printf (\"vax-dec-ultrix\\n\"); exit (0);\n# endif\n#endif\n\n#if defined (alliant) && defined (i860)\n  printf (\"i860-alliant-bsd\\n\"); exit (0);\n#endif\n\n  exit (1);\n}\nEOF\n\n$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && SYSTEM_NAME=`$dummy` &&\n\t{ echo \"$SYSTEM_NAME\"; exit; }\n\n# Apollos put the system type in the environment.\n\ntest -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit; }\n\n# Convex versions that predate uname can use getsysinfo(1)\n\nif [ -x /usr/convex/getsysinfo ]\nthen\n    case `getsysinfo -f cpu_type` in\n    c1*)\n\techo c1-convex-bsd\n\texit ;;\n    c2*)\n\tif getsysinfo -f scalar_acc\n\tthen echo c32-convex-bsd\n\telse echo c2-convex-bsd\n\tfi\n\texit ;;\n    c34*)\n\techo c34-convex-bsd\n\texit ;;\n    c38*)\n\techo c38-convex-bsd\n\texit ;;\n    c4*)\n\techo c4-convex-bsd\n\texit ;;\n    esac\nfi\n\ncat >&2 <<EOF\n$0: unable to guess system type\n\nThis script, last modified $timestamp, has failed to recognize\nthe operating system you are using. It is advised that you\ndownload the most up to date version of the config scripts from\n\n  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.guess;hb=HEAD\nand\n  http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD\n\nIf the version you run ($0) is already up to date, please\nsend the following data and any information you think might be\npertinent to <config-patches@gnu.org> in order to provide the needed\ninformation to handle your system.\n\nconfig.guess timestamp = $timestamp\n\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null`\n\nhostinfo               = `(hostinfo) 2>/dev/null`\n/bin/universe          = `(/bin/universe) 2>/dev/null`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null`\n/bin/arch              = `(/bin/arch) 2>/dev/null`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null`\n\nUNAME_MACHINE = ${UNAME_MACHINE}\nUNAME_RELEASE = ${UNAME_RELEASE}\nUNAME_SYSTEM  = ${UNAME_SYSTEM}\nUNAME_VERSION = ${UNAME_VERSION}\nEOF\n\nexit 1\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/build-aux/config.sub",
    "content": "#! /bin/sh\n# Configuration validation subroutine script.\n#   Copyright 1992-2013 Free Software Foundation, Inc.\n\ntimestamp='2013-08-10'\n\n# This file is free software; you can redistribute it and/or modify it\n# under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 3 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, see <http://www.gnu.org/licenses/>.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that\n# program.  This Exception is an additional permission under section 7\n# of the GNU General Public License, version 3 (\"GPLv3\").\n\n\n# Please send patches with a ChangeLog entry to config-patches@gnu.org.\n#\n# Configuration subroutine to validate and canonicalize a configuration type.\n# Supply the specified configuration type as an argument.\n# If it is invalid, we print an error message on stderr and exit with code 1.\n# Otherwise, we print the canonical config type on stdout and succeed.\n\n# You can get the latest version of this script from:\n# http://git.savannah.gnu.org/gitweb/?p=config.git;a=blob_plain;f=config.sub;hb=HEAD\n\n# This file is supposed to be the same for all GNU packages\n# and recognize all the CPU types, system types and aliases\n# that are meaningful with *any* GNU software.\n# Each package is responsible for reporting which valid configurations\n# it does not support.  The user should be able to distinguish\n# a failure to support a valid configuration from a meaningless\n# configuration.\n\n# The goal of this file is to map all the various variations of a given\n# machine specification into a single specification in the form:\n#\tCPU_TYPE-MANUFACTURER-OPERATING_SYSTEM\n# or in some cases, the newer four-part form:\n#\tCPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM\n# It is wrong to echo any other type of specification.\n\nme=`echo \"$0\" | sed -e 's,.*/,,'`\n\nusage=\"\\\nUsage: $0 [OPTION] CPU-MFR-OPSYS\n       $0 [OPTION] ALIAS\n\nCanonicalize a configuration name.\n\nOperation modes:\n  -h, --help         print this help, then exit\n  -t, --time-stamp   print date of last modification, then exit\n  -v, --version      print version number, then exit\n\nReport bugs and patches to <config-patches@gnu.org>.\"\n\nversion=\"\\\nGNU config.sub ($timestamp)\n\nCopyright 1992-2013 Free Software Foundation, Inc.\n\nThis is free software; see the source for copying conditions.  There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\"\n\nhelp=\"\nTry \\`$me --help' for more information.\"\n\n# Parse command line\nwhile test $# -gt 0 ; do\n  case $1 in\n    --time-stamp | --time* | -t )\n       echo \"$timestamp\" ; exit ;;\n    --version | -v )\n       echo \"$version\" ; exit ;;\n    --help | --h* | -h )\n       echo \"$usage\"; exit ;;\n    -- )     # Stop option processing\n       shift; break ;;\n    - )\t# Use stdin as input.\n       break ;;\n    -* )\n       echo \"$me: invalid option $1$help\"\n       exit 1 ;;\n\n    *local*)\n       # First pass through any local machine types.\n       echo $1\n       exit ;;\n\n    * )\n       break ;;\n  esac\ndone\n\ncase $# in\n 0) echo \"$me: missing argument$help\" >&2\n    exit 1;;\n 1) ;;\n *) echo \"$me: too many arguments$help\" >&2\n    exit 1;;\nesac\n\n# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any).\n# Here we must recognize all the valid KERNEL-OS combinations.\nmaybe_os=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\2/'`\ncase $maybe_os in\n  nto-qnx* | linux-gnu* | linux-android* | linux-dietlibc | linux-newlib* | \\\n  linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \\\n  knetbsd*-gnu* | netbsd*-gnu* | \\\n  kopensolaris*-gnu* | \\\n  storm-chaos* | os2-emx* | rtmk-nova*)\n    os=-$maybe_os\n    basic_machine=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\1/'`\n    ;;\n  android-linux)\n    os=-linux-android\n    basic_machine=`echo $1 | sed 's/^\\(.*\\)-\\([^-]*-[^-]*\\)$/\\1/'`-unknown\n    ;;\n  *)\n    basic_machine=`echo $1 | sed 's/-[^-]*$//'`\n    if [ $basic_machine != $1 ]\n    then os=`echo $1 | sed 's/.*-/-/'`\n    else os=; fi\n    ;;\nesac\n\n### Let's recognize common machines as not being operating systems so\n### that things like config.sub decstation-3100 work.  We also\n### recognize some manufacturers as not being operating systems, so we\n### can provide default operating systems below.\ncase $os in\n\t-sun*os*)\n\t\t# Prevent following clause from handling this invalid input.\n\t\t;;\n\t-dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \\\n\t-att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \\\n\t-unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \\\n\t-convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\\\n\t-c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \\\n\t-harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \\\n\t-apple | -axis | -knuth | -cray | -microblaze*)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-bluegene*)\n\t\tos=-cnk\n\t\t;;\n\t-sim | -cisco | -oki | -wec | -winbond)\n\t\tos=\n\t\tbasic_machine=$1\n\t\t;;\n\t-scout)\n\t\t;;\n\t-wrs)\n\t\tos=-vxworks\n\t\tbasic_machine=$1\n\t\t;;\n\t-chorusos*)\n\t\tos=-chorusos\n\t\tbasic_machine=$1\n\t\t;;\n\t-chorusrdb)\n\t\tos=-chorusrdb\n\t\tbasic_machine=$1\n\t\t;;\n\t-hiux*)\n\t\tos=-hiuxwe2\n\t\t;;\n\t-sco6)\n\t\tos=-sco5v6\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco5)\n\t\tos=-sco3.2v5\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco4)\n\t\tos=-sco3.2v4\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2.[4-9]*)\n\t\tos=`echo $os | sed -e 's/sco3.2./sco3.2v/'`\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco3.2v[4-9]*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco5v6*)\n\t\t# Don't forget version if it is 3.2v4 or newer.\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-sco*)\n\t\tos=-sco3.2v2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-udk*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-isc)\n\t\tos=-isc2.2\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-clix*)\n\t\tbasic_machine=clipper-intergraph\n\t\t;;\n\t-isc*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'`\n\t\t;;\n\t-lynx*178)\n\t\tos=-lynxos178\n\t\t;;\n\t-lynx*5)\n\t\tos=-lynxos5\n\t\t;;\n\t-lynx*)\n\t\tos=-lynxos\n\t\t;;\n\t-ptx*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'`\n\t\t;;\n\t-windowsnt*)\n\t\tos=`echo $os | sed -e 's/windowsnt/winnt/'`\n\t\t;;\n\t-psos*)\n\t\tos=-psos\n\t\t;;\n\t-mint | -mint[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\nesac\n\n# Decode aliases for certain CPU-COMPANY combinations.\ncase $basic_machine in\n\t# Recognize the basic CPU types without company name.\n\t# Some are omitted here because they have special meanings below.\n\t1750a | 580 \\\n\t| a29k \\\n\t| aarch64 | aarch64_be \\\n\t| alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \\\n\t| alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \\\n\t| am33_2.0 \\\n\t| arc | arceb \\\n\t| arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \\\n\t| avr | avr32 \\\n\t| be32 | be64 \\\n\t| bfin \\\n\t| c4x | c8051 | clipper \\\n\t| d10v | d30v | dlx | dsp16xx \\\n\t| epiphany \\\n\t| fido | fr30 | frv \\\n\t| h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \\\n\t| hexagon \\\n\t| i370 | i860 | i960 | ia64 \\\n\t| ip2k | iq2000 \\\n\t| le32 | le64 \\\n\t| lm32 \\\n\t| m32c | m32r | m32rle | m68000 | m68k | m88k \\\n\t| maxq | mb | microblaze | microblazeel | mcore | mep | metag \\\n\t| mips | mipsbe | mipseb | mipsel | mipsle \\\n\t| mips16 \\\n\t| mips64 | mips64el \\\n\t| mips64octeon | mips64octeonel \\\n\t| mips64orion | mips64orionel \\\n\t| mips64r5900 | mips64r5900el \\\n\t| mips64vr | mips64vrel \\\n\t| mips64vr4100 | mips64vr4100el \\\n\t| mips64vr4300 | mips64vr4300el \\\n\t| mips64vr5000 | mips64vr5000el \\\n\t| mips64vr5900 | mips64vr5900el \\\n\t| mipsisa32 | mipsisa32el \\\n\t| mipsisa32r2 | mipsisa32r2el \\\n\t| mipsisa64 | mipsisa64el \\\n\t| mipsisa64r2 | mipsisa64r2el \\\n\t| mipsisa64sb1 | mipsisa64sb1el \\\n\t| mipsisa64sr71k | mipsisa64sr71kel \\\n\t| mipsr5900 | mipsr5900el \\\n\t| mipstx39 | mipstx39el \\\n\t| mn10200 | mn10300 \\\n\t| moxie \\\n\t| mt \\\n\t| msp430 \\\n\t| nds32 | nds32le | nds32be \\\n\t| nios | nios2 | nios2eb | nios2el \\\n\t| ns16k | ns32k \\\n\t| open8 \\\n\t| or1k | or32 \\\n\t| pdp10 | pdp11 | pj | pjl \\\n\t| powerpc | powerpc64 | powerpc64le | powerpcle \\\n\t| pyramid \\\n\t| rl78 | rx \\\n\t| score \\\n\t| sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[34]eb | sheb | shbe | shle | sh[1234]le | sh3ele \\\n\t| sh64 | sh64le \\\n\t| sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \\\n\t| sparcv8 | sparcv9 | sparcv9b | sparcv9v \\\n\t| spu \\\n\t| tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \\\n\t| ubicom32 \\\n\t| v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \\\n\t| we32k \\\n\t| x86 | xc16x | xstormy16 | xtensa \\\n\t| z8k | z80)\n\t\tbasic_machine=$basic_machine-unknown\n\t\t;;\n\tc54x)\n\t\tbasic_machine=tic54x-unknown\n\t\t;;\n\tc55x)\n\t\tbasic_machine=tic55x-unknown\n\t\t;;\n\tc6x)\n\t\tbasic_machine=tic6x-unknown\n\t\t;;\n\tm6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | picochip)\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-none\n\t\t;;\n\tm88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k)\n\t\t;;\n\tms1)\n\t\tbasic_machine=mt-unknown\n\t\t;;\n\n\tstrongarm | thumb | xscale)\n\t\tbasic_machine=arm-unknown\n\t\t;;\n\txgate)\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-none\n\t\t;;\n\txscaleeb)\n\t\tbasic_machine=armeb-unknown\n\t\t;;\n\n\txscaleel)\n\t\tbasic_machine=armel-unknown\n\t\t;;\n\n\t# We use `pc' rather than `unknown'\n\t# because (1) that's what they normally are, and\n\t# (2) the word \"unknown\" tends to confuse beginning users.\n\ti*86 | x86_64)\n\t  basic_machine=$basic_machine-pc\n\t  ;;\n\t# Object if more than one company name word.\n\t*-*-*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\n\t# Recognize the basic CPU types with company name.\n\t580-* \\\n\t| a29k-* \\\n\t| aarch64-* | aarch64_be-* \\\n\t| alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \\\n\t| alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \\\n\t| alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \\\n\t| arm-*  | armbe-* | armle-* | armeb-* | armv*-* \\\n\t| avr-* | avr32-* \\\n\t| be32-* | be64-* \\\n\t| bfin-* | bs2000-* \\\n\t| c[123]* | c30-* | [cjt]90-* | c4x-* \\\n\t| c8051-* | clipper-* | craynv-* | cydra-* \\\n\t| d10v-* | d30v-* | dlx-* \\\n\t| elxsi-* \\\n\t| f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \\\n\t| h8300-* | h8500-* \\\n\t| hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \\\n\t| hexagon-* \\\n\t| i*86-* | i860-* | i960-* | ia64-* \\\n\t| ip2k-* | iq2000-* \\\n\t| le32-* | le64-* \\\n\t| lm32-* \\\n\t| m32c-* | m32r-* | m32rle-* \\\n\t| m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \\\n\t| m88110-* | m88k-* | maxq-* | mcore-* | metag-* \\\n\t| microblaze-* | microblazeel-* \\\n\t| mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \\\n\t| mips16-* \\\n\t| mips64-* | mips64el-* \\\n\t| mips64octeon-* | mips64octeonel-* \\\n\t| mips64orion-* | mips64orionel-* \\\n\t| mips64r5900-* | mips64r5900el-* \\\n\t| mips64vr-* | mips64vrel-* \\\n\t| mips64vr4100-* | mips64vr4100el-* \\\n\t| mips64vr4300-* | mips64vr4300el-* \\\n\t| mips64vr5000-* | mips64vr5000el-* \\\n\t| mips64vr5900-* | mips64vr5900el-* \\\n\t| mipsisa32-* | mipsisa32el-* \\\n\t| mipsisa32r2-* | mipsisa32r2el-* \\\n\t| mipsisa64-* | mipsisa64el-* \\\n\t| mipsisa64r2-* | mipsisa64r2el-* \\\n\t| mipsisa64sb1-* | mipsisa64sb1el-* \\\n\t| mipsisa64sr71k-* | mipsisa64sr71kel-* \\\n\t| mipsr5900-* | mipsr5900el-* \\\n\t| mipstx39-* | mipstx39el-* \\\n\t| mmix-* \\\n\t| mt-* \\\n\t| msp430-* \\\n\t| nds32-* | nds32le-* | nds32be-* \\\n\t| nios-* | nios2-* | nios2eb-* | nios2el-* \\\n\t| none-* | np1-* | ns16k-* | ns32k-* \\\n\t| open8-* \\\n\t| orion-* \\\n\t| pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \\\n\t| powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \\\n\t| pyramid-* \\\n\t| rl78-* | romp-* | rs6000-* | rx-* \\\n\t| sh-* | sh[1234]-* | sh[24]a-* | sh[24]aeb-* | sh[23]e-* | sh[34]eb-* | sheb-* | shbe-* \\\n\t| shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \\\n\t| sparc-* | sparc64-* | sparc64b-* | sparc64v-* | sparc86x-* | sparclet-* \\\n\t| sparclite-* \\\n\t| sparcv8-* | sparcv9-* | sparcv9b-* | sparcv9v-* | sv1-* | sx?-* \\\n\t| tahoe-* \\\n\t| tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \\\n\t| tile*-* \\\n\t| tron-* \\\n\t| ubicom32-* \\\n\t| v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \\\n\t| vax-* \\\n\t| we32k-* \\\n\t| x86-* | x86_64-* | xc16x-* | xps100-* \\\n\t| xstormy16-* | xtensa*-* \\\n\t| ymp-* \\\n\t| z8k-* | z80-*)\n\t\t;;\n\t# Recognize the basic CPU types without company name, with glob match.\n\txtensa*)\n\t\tbasic_machine=$basic_machine-unknown\n\t\t;;\n\t# Recognize the various machine names and aliases which stand\n\t# for a CPU type and a company and sometimes even an OS.\n\t386bsd)\n\t\tbasic_machine=i386-unknown\n\t\tos=-bsd\n\t\t;;\n\t3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc)\n\t\tbasic_machine=m68000-att\n\t\t;;\n\t3b*)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\ta29khif)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tabacus)\n\t\tbasic_machine=abacus-unknown\n\t\t;;\n\tadobe68k)\n\t\tbasic_machine=m68010-adobe\n\t\tos=-scout\n\t\t;;\n\talliant | fx80)\n\t\tbasic_machine=fx80-alliant\n\t\t;;\n\taltos | altos3068)\n\t\tbasic_machine=m68k-altos\n\t\t;;\n\tam29k)\n\t\tbasic_machine=a29k-none\n\t\tos=-bsd\n\t\t;;\n\tamd64)\n\t\tbasic_machine=x86_64-pc\n\t\t;;\n\tamd64-*)\n\t\tbasic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tamdahl)\n\t\tbasic_machine=580-amdahl\n\t\tos=-sysv\n\t\t;;\n\tamiga | amiga-*)\n\t\tbasic_machine=m68k-unknown\n\t\t;;\n\tamigaos | amigados)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-amigaos\n\t\t;;\n\tamigaunix | amix)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-sysv4\n\t\t;;\n\tapollo68)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-sysv\n\t\t;;\n\tapollo68bsd)\n\t\tbasic_machine=m68k-apollo\n\t\tos=-bsd\n\t\t;;\n\taros)\n\t\tbasic_machine=i386-pc\n\t\tos=-aros\n\t\t;;\n\taux)\n\t\tbasic_machine=m68k-apple\n\t\tos=-aux\n\t\t;;\n\tbalance)\n\t\tbasic_machine=ns32k-sequent\n\t\tos=-dynix\n\t\t;;\n\tblackfin)\n\t\tbasic_machine=bfin-unknown\n\t\tos=-linux\n\t\t;;\n\tblackfin-*)\n\t\tbasic_machine=bfin-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tbluegene*)\n\t\tbasic_machine=powerpc-ibm\n\t\tos=-cnk\n\t\t;;\n\tc54x-*)\n\t\tbasic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tc55x-*)\n\t\tbasic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tc6x-*)\n\t\tbasic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tc90)\n\t\tbasic_machine=c90-cray\n\t\tos=-unicos\n\t\t;;\n\tcegcc)\n\t\tbasic_machine=arm-unknown\n\t\tos=-cegcc\n\t\t;;\n\tconvex-c1)\n\t\tbasic_machine=c1-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c2)\n\t\tbasic_machine=c2-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c32)\n\t\tbasic_machine=c32-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c34)\n\t\tbasic_machine=c34-convex\n\t\tos=-bsd\n\t\t;;\n\tconvex-c38)\n\t\tbasic_machine=c38-convex\n\t\tos=-bsd\n\t\t;;\n\tcray | j90)\n\t\tbasic_machine=j90-cray\n\t\tos=-unicos\n\t\t;;\n\tcraynv)\n\t\tbasic_machine=craynv-cray\n\t\tos=-unicosmp\n\t\t;;\n\tcr16 | cr16-*)\n\t\tbasic_machine=cr16-unknown\n\t\tos=-elf\n\t\t;;\n\tcrds | unos)\n\t\tbasic_machine=m68k-crds\n\t\t;;\n\tcrisv32 | crisv32-* | etraxfs*)\n\t\tbasic_machine=crisv32-axis\n\t\t;;\n\tcris | cris-* | etrax*)\n\t\tbasic_machine=cris-axis\n\t\t;;\n\tcrx)\n\t\tbasic_machine=crx-unknown\n\t\tos=-elf\n\t\t;;\n\tda30 | da30-*)\n\t\tbasic_machine=m68k-da30\n\t\t;;\n\tdecstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn)\n\t\tbasic_machine=mips-dec\n\t\t;;\n\tdecsystem10* | dec10*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops10\n\t\t;;\n\tdecsystem20* | dec20*)\n\t\tbasic_machine=pdp10-dec\n\t\tos=-tops20\n\t\t;;\n\tdelta | 3300 | motorola-3300 | motorola-delta \\\n\t      | 3300-motorola | delta-motorola)\n\t\tbasic_machine=m68k-motorola\n\t\t;;\n\tdelta88)\n\t\tbasic_machine=m88k-motorola\n\t\tos=-sysv3\n\t\t;;\n\tdicos)\n\t\tbasic_machine=i686-pc\n\t\tos=-dicos\n\t\t;;\n\tdjgpp)\n\t\tbasic_machine=i586-pc\n\t\tos=-msdosdjgpp\n\t\t;;\n\tdpx20 | dpx20-*)\n\t\tbasic_machine=rs6000-bull\n\t\tos=-bosx\n\t\t;;\n\tdpx2* | dpx2*-bull)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv3\n\t\t;;\n\tebmon29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-ebmon\n\t\t;;\n\telxsi)\n\t\tbasic_machine=elxsi-elxsi\n\t\tos=-bsd\n\t\t;;\n\tencore | umax | mmax)\n\t\tbasic_machine=ns32k-encore\n\t\t;;\n\tes1800 | OSE68k | ose68k | ose | OSE)\n\t\tbasic_machine=m68k-ericsson\n\t\tos=-ose\n\t\t;;\n\tfx2800)\n\t\tbasic_machine=i860-alliant\n\t\t;;\n\tgenix)\n\t\tbasic_machine=ns32k-ns\n\t\t;;\n\tgmicro)\n\t\tbasic_machine=tron-gmicro\n\t\tos=-sysv\n\t\t;;\n\tgo32)\n\t\tbasic_machine=i386-pc\n\t\tos=-go32\n\t\t;;\n\th3050r* | hiux*)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\th8300hms)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-hms\n\t\t;;\n\th8300xray)\n\t\tbasic_machine=h8300-hitachi\n\t\tos=-xray\n\t\t;;\n\th8500hms)\n\t\tbasic_machine=h8500-hitachi\n\t\tos=-hms\n\t\t;;\n\tharris)\n\t\tbasic_machine=m88k-harris\n\t\tos=-sysv3\n\t\t;;\n\thp300-*)\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp300bsd)\n\t\tbasic_machine=m68k-hp\n\t\tos=-bsd\n\t\t;;\n\thp300hpux)\n\t\tbasic_machine=m68k-hp\n\t\tos=-hpux\n\t\t;;\n\thp3k9[0-9][0-9] | hp9[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k2[0-9][0-9] | hp9k31[0-9])\n\t\tbasic_machine=m68000-hp\n\t\t;;\n\thp9k3[2-9][0-9])\n\t\tbasic_machine=m68k-hp\n\t\t;;\n\thp9k6[0-9][0-9] | hp6[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thp9k7[0-79][0-9] | hp7[0-79][0-9])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k78[0-9] | hp78[0-9])\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893)\n\t\t# FIXME: really hppa2.0-hp\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][13679] | hp8[0-9][13679])\n\t\tbasic_machine=hppa1.1-hp\n\t\t;;\n\thp9k8[0-9][0-9] | hp8[0-9][0-9])\n\t\tbasic_machine=hppa1.0-hp\n\t\t;;\n\thppa-next)\n\t\tos=-nextstep3\n\t\t;;\n\thppaosf)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-osf\n\t\t;;\n\thppro)\n\t\tbasic_machine=hppa1.1-hp\n\t\tos=-proelf\n\t\t;;\n\ti370-ibm* | ibm*)\n\t\tbasic_machine=i370-ibm\n\t\t;;\n\ti*86v32)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv32\n\t\t;;\n\ti*86v4*)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv4\n\t\t;;\n\ti*86v)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-sysv\n\t\t;;\n\ti*86sol2)\n\t\tbasic_machine=`echo $1 | sed -e 's/86.*/86-pc/'`\n\t\tos=-solaris2\n\t\t;;\n\ti386mach)\n\t\tbasic_machine=i386-mach\n\t\tos=-mach\n\t\t;;\n\ti386-vsta | vsta)\n\t\tbasic_machine=i386-unknown\n\t\tos=-vsta\n\t\t;;\n\tiris | iris4d)\n\t\tbasic_machine=mips-sgi\n\t\tcase $os in\n\t\t    -irix*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-irix4\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tisi68 | isi)\n\t\tbasic_machine=m68k-isi\n\t\tos=-sysv\n\t\t;;\n\tm68knommu)\n\t\tbasic_machine=m68k-unknown\n\t\tos=-linux\n\t\t;;\n\tm68knommu-*)\n\t\tbasic_machine=m68k-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tm88k-omron*)\n\t\tbasic_machine=m88k-omron\n\t\t;;\n\tmagnum | m3230)\n\t\tbasic_machine=mips-mips\n\t\tos=-sysv\n\t\t;;\n\tmerlin)\n\t\tbasic_machine=ns32k-utek\n\t\tos=-sysv\n\t\t;;\n\tmicroblaze*)\n\t\tbasic_machine=microblaze-xilinx\n\t\t;;\n\tmingw64)\n\t\tbasic_machine=x86_64-pc\n\t\tos=-mingw64\n\t\t;;\n\tmingw32)\n\t\tbasic_machine=i686-pc\n\t\tos=-mingw32\n\t\t;;\n\tmingw32ce)\n\t\tbasic_machine=arm-unknown\n\t\tos=-mingw32ce\n\t\t;;\n\tminiframe)\n\t\tbasic_machine=m68000-convergent\n\t\t;;\n\t*mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*)\n\t\tbasic_machine=m68k-atari\n\t\tos=-mint\n\t\t;;\n\tmips3*-*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`\n\t\t;;\n\tmips3*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown\n\t\t;;\n\tmonitor)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\tmorphos)\n\t\tbasic_machine=powerpc-unknown\n\t\tos=-morphos\n\t\t;;\n\tmsdos)\n\t\tbasic_machine=i386-pc\n\t\tos=-msdos\n\t\t;;\n\tms1-*)\n\t\tbasic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'`\n\t\t;;\n\tmsys)\n\t\tbasic_machine=i686-pc\n\t\tos=-msys\n\t\t;;\n\tmvs)\n\t\tbasic_machine=i370-ibm\n\t\tos=-mvs\n\t\t;;\n\tnacl)\n\t\tbasic_machine=le32-unknown\n\t\tos=-nacl\n\t\t;;\n\tncr3000)\n\t\tbasic_machine=i486-ncr\n\t\tos=-sysv4\n\t\t;;\n\tnetbsd386)\n\t\tbasic_machine=i386-unknown\n\t\tos=-netbsd\n\t\t;;\n\tnetwinder)\n\t\tbasic_machine=armv4l-rebel\n\t\tos=-linux\n\t\t;;\n\tnews | news700 | news800 | news900)\n\t\tbasic_machine=m68k-sony\n\t\tos=-newsos\n\t\t;;\n\tnews1000)\n\t\tbasic_machine=m68030-sony\n\t\tos=-newsos\n\t\t;;\n\tnews-3600 | risc-news)\n\t\tbasic_machine=mips-sony\n\t\tos=-newsos\n\t\t;;\n\tnecv70)\n\t\tbasic_machine=v70-nec\n\t\tos=-sysv\n\t\t;;\n\tnext | m*-next )\n\t\tbasic_machine=m68k-next\n\t\tcase $os in\n\t\t    -nextstep* )\n\t\t\t;;\n\t\t    -ns2*)\n\t\t      os=-nextstep2\n\t\t\t;;\n\t\t    *)\n\t\t      os=-nextstep3\n\t\t\t;;\n\t\tesac\n\t\t;;\n\tnh3000)\n\t\tbasic_machine=m68k-harris\n\t\tos=-cxux\n\t\t;;\n\tnh[45]000)\n\t\tbasic_machine=m88k-harris\n\t\tos=-cxux\n\t\t;;\n\tnindy960)\n\t\tbasic_machine=i960-intel\n\t\tos=-nindy\n\t\t;;\n\tmon960)\n\t\tbasic_machine=i960-intel\n\t\tos=-mon960\n\t\t;;\n\tnonstopux)\n\t\tbasic_machine=mips-compaq\n\t\tos=-nonstopux\n\t\t;;\n\tnp1)\n\t\tbasic_machine=np1-gould\n\t\t;;\n\tneo-tandem)\n\t\tbasic_machine=neo-tandem\n\t\t;;\n\tnse-tandem)\n\t\tbasic_machine=nse-tandem\n\t\t;;\n\tnsr-tandem)\n\t\tbasic_machine=nsr-tandem\n\t\t;;\n\top50n-* | op60c-*)\n\t\tbasic_machine=hppa1.1-oki\n\t\tos=-proelf\n\t\t;;\n\topenrisc | openrisc-*)\n\t\tbasic_machine=or32-unknown\n\t\t;;\n\tos400)\n\t\tbasic_machine=powerpc-ibm\n\t\tos=-os400\n\t\t;;\n\tOSE68000 | ose68000)\n\t\tbasic_machine=m68000-ericsson\n\t\tos=-ose\n\t\t;;\n\tos68k)\n\t\tbasic_machine=m68k-none\n\t\tos=-os68k\n\t\t;;\n\tpa-hitachi)\n\t\tbasic_machine=hppa1.1-hitachi\n\t\tos=-hiuxwe2\n\t\t;;\n\tparagon)\n\t\tbasic_machine=i860-intel\n\t\tos=-osf\n\t\t;;\n\tparisc)\n\t\tbasic_machine=hppa-unknown\n\t\tos=-linux\n\t\t;;\n\tparisc-*)\n\t\tbasic_machine=hppa-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\tos=-linux\n\t\t;;\n\tpbd)\n\t\tbasic_machine=sparc-tti\n\t\t;;\n\tpbb)\n\t\tbasic_machine=m68k-tti\n\t\t;;\n\tpc532 | pc532-*)\n\t\tbasic_machine=ns32k-pc532\n\t\t;;\n\tpc98)\n\t\tbasic_machine=i386-pc\n\t\t;;\n\tpc98-*)\n\t\tbasic_machine=i386-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentium | p5 | k5 | k6 | nexgen | viac3)\n\t\tbasic_machine=i586-pc\n\t\t;;\n\tpentiumpro | p6 | 6x86 | athlon | athlon_*)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentiumii | pentium2 | pentiumiii | pentium3)\n\t\tbasic_machine=i686-pc\n\t\t;;\n\tpentium4)\n\t\tbasic_machine=i786-pc\n\t\t;;\n\tpentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*)\n\t\tbasic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumpro-* | p6-* | 6x86-* | athlon-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentiumii-* | pentium2-* | pentiumiii-* | pentium3-*)\n\t\tbasic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpentium4-*)\n\t\tbasic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tpn)\n\t\tbasic_machine=pn-gould\n\t\t;;\n\tpower)\tbasic_machine=power-ibm\n\t\t;;\n\tppc | ppcbe)\tbasic_machine=powerpc-unknown\n\t\t;;\n\tppc-* | ppcbe-*)\n\t\tbasic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppcle | powerpclittle | ppc-le | powerpc-little)\n\t\tbasic_machine=powerpcle-unknown\n\t\t;;\n\tppcle-* | powerpclittle-*)\n\t\tbasic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64)\tbasic_machine=powerpc64-unknown\n\t\t;;\n\tppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tppc64le | powerpc64little | ppc64-le | powerpc64-little)\n\t\tbasic_machine=powerpc64le-unknown\n\t\t;;\n\tppc64le-* | powerpc64little-*)\n\t\tbasic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tps2)\n\t\tbasic_machine=i386-ibm\n\t\t;;\n\tpw32)\n\t\tbasic_machine=i586-unknown\n\t\tos=-pw32\n\t\t;;\n\trdos | rdos64)\n\t\tbasic_machine=x86_64-pc\n\t\tos=-rdos\n\t\t;;\n\trdos32)\n\t\tbasic_machine=i386-pc\n\t\tos=-rdos\n\t\t;;\n\trom68k)\n\t\tbasic_machine=m68k-rom68k\n\t\tos=-coff\n\t\t;;\n\trm[46]00)\n\t\tbasic_machine=mips-siemens\n\t\t;;\n\trtpc | rtpc-*)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\ts390 | s390-*)\n\t\tbasic_machine=s390-ibm\n\t\t;;\n\ts390x | s390x-*)\n\t\tbasic_machine=s390x-ibm\n\t\t;;\n\tsa29200)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tsb1)\n\t\tbasic_machine=mipsisa64sb1-unknown\n\t\t;;\n\tsb1el)\n\t\tbasic_machine=mipsisa64sb1el-unknown\n\t\t;;\n\tsde)\n\t\tbasic_machine=mipsisa32-sde\n\t\tos=-elf\n\t\t;;\n\tsei)\n\t\tbasic_machine=mips-sei\n\t\tos=-seiux\n\t\t;;\n\tsequent)\n\t\tbasic_machine=i386-sequent\n\t\t;;\n\tsh)\n\t\tbasic_machine=sh-hitachi\n\t\tos=-hms\n\t\t;;\n\tsh5el)\n\t\tbasic_machine=sh5le-unknown\n\t\t;;\n\tsh64)\n\t\tbasic_machine=sh64-unknown\n\t\t;;\n\tsparclite-wrs | simso-wrs)\n\t\tbasic_machine=sparclite-wrs\n\t\tos=-vxworks\n\t\t;;\n\tsps7)\n\t\tbasic_machine=m68k-bull\n\t\tos=-sysv2\n\t\t;;\n\tspur)\n\t\tbasic_machine=spur-unknown\n\t\t;;\n\tst2000)\n\t\tbasic_machine=m68k-tandem\n\t\t;;\n\tstratus)\n\t\tbasic_machine=i860-stratus\n\t\tos=-sysv4\n\t\t;;\n\tstrongarm-* | thumb-*)\n\t\tbasic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'`\n\t\t;;\n\tsun2)\n\t\tbasic_machine=m68000-sun\n\t\t;;\n\tsun2os3)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun2os4)\n\t\tbasic_machine=m68000-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun3os3)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun3os4)\n\t\tbasic_machine=m68k-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4os3)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos3\n\t\t;;\n\tsun4os4)\n\t\tbasic_machine=sparc-sun\n\t\tos=-sunos4\n\t\t;;\n\tsun4sol2)\n\t\tbasic_machine=sparc-sun\n\t\tos=-solaris2\n\t\t;;\n\tsun3 | sun3-*)\n\t\tbasic_machine=m68k-sun\n\t\t;;\n\tsun4)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n\tsun386 | sun386i | roadrunner)\n\t\tbasic_machine=i386-sun\n\t\t;;\n\tsv1)\n\t\tbasic_machine=sv1-cray\n\t\tos=-unicos\n\t\t;;\n\tsymmetry)\n\t\tbasic_machine=i386-sequent\n\t\tos=-dynix\n\t\t;;\n\tt3e)\n\t\tbasic_machine=alphaev5-cray\n\t\tos=-unicos\n\t\t;;\n\tt90)\n\t\tbasic_machine=t90-cray\n\t\tos=-unicos\n\t\t;;\n\ttile*)\n\t\tbasic_machine=$basic_machine-unknown\n\t\tos=-linux-gnu\n\t\t;;\n\ttx39)\n\t\tbasic_machine=mipstx39-unknown\n\t\t;;\n\ttx39el)\n\t\tbasic_machine=mipstx39el-unknown\n\t\t;;\n\ttoad1)\n\t\tbasic_machine=pdp10-xkl\n\t\tos=-tops20\n\t\t;;\n\ttower | tower-32)\n\t\tbasic_machine=m68k-ncr\n\t\t;;\n\ttpf)\n\t\tbasic_machine=s390x-ibm\n\t\tos=-tpf\n\t\t;;\n\tudi29k)\n\t\tbasic_machine=a29k-amd\n\t\tos=-udi\n\t\t;;\n\tultra3)\n\t\tbasic_machine=a29k-nyu\n\t\tos=-sym1\n\t\t;;\n\tv810 | necv810)\n\t\tbasic_machine=v810-nec\n\t\tos=-none\n\t\t;;\n\tvaxv)\n\t\tbasic_machine=vax-dec\n\t\tos=-sysv\n\t\t;;\n\tvms)\n\t\tbasic_machine=vax-dec\n\t\tos=-vms\n\t\t;;\n\tvpp*|vx|vx-*)\n\t\tbasic_machine=f301-fujitsu\n\t\t;;\n\tvxworks960)\n\t\tbasic_machine=i960-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks68)\n\t\tbasic_machine=m68k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tvxworks29k)\n\t\tbasic_machine=a29k-wrs\n\t\tos=-vxworks\n\t\t;;\n\tw65*)\n\t\tbasic_machine=w65-wdc\n\t\tos=-none\n\t\t;;\n\tw89k-*)\n\t\tbasic_machine=hppa1.1-winbond\n\t\tos=-proelf\n\t\t;;\n\txbox)\n\t\tbasic_machine=i686-pc\n\t\tos=-mingw32\n\t\t;;\n\txps | xps100)\n\t\tbasic_machine=xps100-honeywell\n\t\t;;\n\txscale-* | xscalee[bl]-*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/^xscale/arm/'`\n\t\t;;\n\tymp)\n\t\tbasic_machine=ymp-cray\n\t\tos=-unicos\n\t\t;;\n\tz8k-*-coff)\n\t\tbasic_machine=z8k-unknown\n\t\tos=-sim\n\t\t;;\n\tz80-*-coff)\n\t\tbasic_machine=z80-unknown\n\t\tos=-sim\n\t\t;;\n\tnone)\n\t\tbasic_machine=none-none\n\t\tos=-none\n\t\t;;\n\n# Here we handle the default manufacturer of certain CPU types.  It is in\n# some cases the only manufacturer, in others, it is the most popular.\n\tw89k)\n\t\tbasic_machine=hppa1.1-winbond\n\t\t;;\n\top50n)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\top60c)\n\t\tbasic_machine=hppa1.1-oki\n\t\t;;\n\tromp)\n\t\tbasic_machine=romp-ibm\n\t\t;;\n\tmmix)\n\t\tbasic_machine=mmix-knuth\n\t\t;;\n\trs6000)\n\t\tbasic_machine=rs6000-ibm\n\t\t;;\n\tvax)\n\t\tbasic_machine=vax-dec\n\t\t;;\n\tpdp10)\n\t\t# there are many clones, so DEC is not a safe bet\n\t\tbasic_machine=pdp10-unknown\n\t\t;;\n\tpdp11)\n\t\tbasic_machine=pdp11-dec\n\t\t;;\n\twe32k)\n\t\tbasic_machine=we32k-att\n\t\t;;\n\tsh[1234] | sh[24]a | sh[24]aeb | sh[34]eb | sh[1234]le | sh[23]ele)\n\t\tbasic_machine=sh-unknown\n\t\t;;\n\tsparc | sparcv8 | sparcv9 | sparcv9b | sparcv9v)\n\t\tbasic_machine=sparc-sun\n\t\t;;\n\tcydra)\n\t\tbasic_machine=cydra-cydrome\n\t\t;;\n\torion)\n\t\tbasic_machine=orion-highlevel\n\t\t;;\n\torion105)\n\t\tbasic_machine=clipper-highlevel\n\t\t;;\n\tmac | mpw | mac-mpw)\n\t\tbasic_machine=m68k-apple\n\t\t;;\n\tpmac | pmac-mpw)\n\t\tbasic_machine=powerpc-apple\n\t\t;;\n\t*-unknown)\n\t\t# Make sure to match an already-canonicalized machine name.\n\t\t;;\n\t*)\n\t\techo Invalid configuration \\`$1\\': machine \\`$basic_machine\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\n\n# Here we canonicalize certain aliases for manufacturers.\ncase $basic_machine in\n\t*-digital*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/digital.*/dec/'`\n\t\t;;\n\t*-commodore*)\n\t\tbasic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'`\n\t\t;;\n\t*)\n\t\t;;\nesac\n\n# Decode manufacturer-specific aliases for certain operating systems.\n\nif [ x\"$os\" != x\"\" ]\nthen\ncase $os in\n\t# First match some system type aliases\n\t# that might get confused with valid system types.\n\t# -solaris* is a basic system type, with this one exception.\n\t-auroraux)\n\t\tos=-auroraux\n\t\t;;\n\t-solaris1 | -solaris1.*)\n\t\tos=`echo $os | sed -e 's|solaris1|sunos4|'`\n\t\t;;\n\t-solaris)\n\t\tos=-solaris2\n\t\t;;\n\t-svr4*)\n\t\tos=-sysv4\n\t\t;;\n\t-unixware*)\n\t\tos=-sysv4.2uw\n\t\t;;\n\t-gnu/linux*)\n\t\tos=`echo $os | sed -e 's|gnu/linux|linux-gnu|'`\n\t\t;;\n\t# First accept the basic system types.\n\t# The portable systems comes first.\n\t# Each alternative MUST END IN A *, to match a version number.\n\t# -sysv* is not here because it comes later, after sysvr4.\n\t-gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \\\n\t      | -*vms* | -sco* | -esix* | -isc* | -aix* | -cnk* | -sunos | -sunos[34]*\\\n\t      | -hpux* | -unos* | -osf* | -luna* | -dgux* | -auroraux* | -solaris* \\\n\t      | -sym* | -kopensolaris* | -plan9* \\\n\t      | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \\\n\t      | -aos* | -aros* \\\n\t      | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \\\n\t      | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \\\n\t      | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \\\n\t      | -bitrig* | -openbsd* | -solidbsd* \\\n\t      | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \\\n\t      | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \\\n\t      | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \\\n\t      | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \\\n\t      | -chorusos* | -chorusrdb* | -cegcc* \\\n\t      | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \\\n\t      | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \\\n\t      | -linux-newlib* | -linux-musl* | -linux-uclibc* \\\n\t      | -uxpv* | -beos* | -mpeix* | -udk* \\\n\t      | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \\\n\t      | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \\\n\t      | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \\\n\t      | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \\\n\t      | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \\\n\t      | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly* \\\n\t      | -skyos* | -haiku* | -rdos* | -toppers* | -drops* | -es*)\n\t# Remember, each alternative MUST END IN *, to match a version number.\n\t\t;;\n\t-qnx*)\n\t\tcase $basic_machine in\n\t\t    x86-* | i*86-*)\n\t\t\t;;\n\t\t    *)\n\t\t\tos=-nto$os\n\t\t\t;;\n\t\tesac\n\t\t;;\n\t-nto-qnx*)\n\t\t;;\n\t-nto*)\n\t\tos=`echo $os | sed -e 's|nto|nto-qnx|'`\n\t\t;;\n\t-sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \\\n\t      | -windows* | -osx | -abug | -netware* | -os9* | -beos* | -haiku* \\\n\t      | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*)\n\t\t;;\n\t-mac*)\n\t\tos=`echo $os | sed -e 's|mac|macos|'`\n\t\t;;\n\t-linux-dietlibc)\n\t\tos=-linux-dietlibc\n\t\t;;\n\t-linux*)\n\t\tos=`echo $os | sed -e 's|linux|linux-gnu|'`\n\t\t;;\n\t-sunos5*)\n\t\tos=`echo $os | sed -e 's|sunos5|solaris2|'`\n\t\t;;\n\t-sunos6*)\n\t\tos=`echo $os | sed -e 's|sunos6|solaris3|'`\n\t\t;;\n\t-opened*)\n\t\tos=-openedition\n\t\t;;\n\t-os400*)\n\t\tos=-os400\n\t\t;;\n\t-wince*)\n\t\tos=-wince\n\t\t;;\n\t-osfrose*)\n\t\tos=-osfrose\n\t\t;;\n\t-osf*)\n\t\tos=-osf\n\t\t;;\n\t-utek*)\n\t\tos=-bsd\n\t\t;;\n\t-dynix*)\n\t\tos=-bsd\n\t\t;;\n\t-acis*)\n\t\tos=-aos\n\t\t;;\n\t-atheos*)\n\t\tos=-atheos\n\t\t;;\n\t-syllable*)\n\t\tos=-syllable\n\t\t;;\n\t-386bsd)\n\t\tos=-bsd\n\t\t;;\n\t-ctix* | -uts*)\n\t\tos=-sysv\n\t\t;;\n\t-nova*)\n\t\tos=-rtmk-nova\n\t\t;;\n\t-ns2 )\n\t\tos=-nextstep2\n\t\t;;\n\t-nsk*)\n\t\tos=-nsk\n\t\t;;\n\t# Preserve the version number of sinix5.\n\t-sinix5.*)\n\t\tos=`echo $os | sed -e 's|sinix|sysv|'`\n\t\t;;\n\t-sinix*)\n\t\tos=-sysv4\n\t\t;;\n\t-tpf*)\n\t\tos=-tpf\n\t\t;;\n\t-triton*)\n\t\tos=-sysv3\n\t\t;;\n\t-oss*)\n\t\tos=-sysv3\n\t\t;;\n\t-svr4)\n\t\tos=-sysv4\n\t\t;;\n\t-svr3)\n\t\tos=-sysv3\n\t\t;;\n\t-sysvr4)\n\t\tos=-sysv4\n\t\t;;\n\t# This must come after -sysvr4.\n\t-sysv*)\n\t\t;;\n\t-ose*)\n\t\tos=-ose\n\t\t;;\n\t-es1800*)\n\t\tos=-ose\n\t\t;;\n\t-xenix)\n\t\tos=-xenix\n\t\t;;\n\t-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t\tos=-mint\n\t\t;;\n\t-aros*)\n\t\tos=-aros\n\t\t;;\n\t-zvmoe)\n\t\tos=-zvmoe\n\t\t;;\n\t-dicos*)\n\t\tos=-dicos\n\t\t;;\n\t-nacl*)\n\t\t;;\n\t-none)\n\t\t;;\n\t*)\n\t\t# Get rid of the `-' at the beginning of $os.\n\t\tos=`echo $os | sed 's/[^-]*-//'`\n\t\techo Invalid configuration \\`$1\\': system \\`$os\\' not recognized 1>&2\n\t\texit 1\n\t\t;;\nesac\nelse\n\n# Here we handle the default operating systems that come with various machines.\n# The value should be what the vendor currently ships out the door with their\n# machine or put another way, the most popular os provided with the machine.\n\n# Note that if you're going to try to match \"-MANUFACTURER\" here (say,\n# \"-sun\"), then you have to tell the case statement up towards the top\n# that MANUFACTURER isn't an operating system.  Otherwise, code above\n# will signal an error saying that MANUFACTURER isn't an operating\n# system, and we'll never get to this point.\n\ncase $basic_machine in\n\tscore-*)\n\t\tos=-elf\n\t\t;;\n\tspu-*)\n\t\tos=-elf\n\t\t;;\n\t*-acorn)\n\t\tos=-riscix1.2\n\t\t;;\n\tarm*-rebel)\n\t\tos=-linux\n\t\t;;\n\tarm*-semi)\n\t\tos=-aout\n\t\t;;\n\tc4x-* | tic4x-*)\n\t\tos=-coff\n\t\t;;\n\tc8051-*)\n\t\tos=-elf\n\t\t;;\n\thexagon-*)\n\t\tos=-elf\n\t\t;;\n\ttic54x-*)\n\t\tos=-coff\n\t\t;;\n\ttic55x-*)\n\t\tos=-coff\n\t\t;;\n\ttic6x-*)\n\t\tos=-coff\n\t\t;;\n\t# This must come before the *-dec entry.\n\tpdp10-*)\n\t\tos=-tops20\n\t\t;;\n\tpdp11-*)\n\t\tos=-none\n\t\t;;\n\t*-dec | vax-*)\n\t\tos=-ultrix4.2\n\t\t;;\n\tm68*-apollo)\n\t\tos=-domain\n\t\t;;\n\ti386-sun)\n\t\tos=-sunos4.0.2\n\t\t;;\n\tm68000-sun)\n\t\tos=-sunos3\n\t\t;;\n\tm68*-cisco)\n\t\tos=-aout\n\t\t;;\n\tmep-*)\n\t\tos=-elf\n\t\t;;\n\tmips*-cisco)\n\t\tos=-elf\n\t\t;;\n\tmips*-*)\n\t\tos=-elf\n\t\t;;\n\tor1k-*)\n\t\tos=-elf\n\t\t;;\n\tor32-*)\n\t\tos=-coff\n\t\t;;\n\t*-tti)\t# must be before sparc entry or we get the wrong os.\n\t\tos=-sysv3\n\t\t;;\n\tsparc-* | *-sun)\n\t\tos=-sunos4.1.1\n\t\t;;\n\t*-be)\n\t\tos=-beos\n\t\t;;\n\t*-haiku)\n\t\tos=-haiku\n\t\t;;\n\t*-ibm)\n\t\tos=-aix\n\t\t;;\n\t*-knuth)\n\t\tos=-mmixware\n\t\t;;\n\t*-wec)\n\t\tos=-proelf\n\t\t;;\n\t*-winbond)\n\t\tos=-proelf\n\t\t;;\n\t*-oki)\n\t\tos=-proelf\n\t\t;;\n\t*-hp)\n\t\tos=-hpux\n\t\t;;\n\t*-hitachi)\n\t\tos=-hiux\n\t\t;;\n\ti860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent)\n\t\tos=-sysv\n\t\t;;\n\t*-cbm)\n\t\tos=-amigaos\n\t\t;;\n\t*-dg)\n\t\tos=-dgux\n\t\t;;\n\t*-dolphin)\n\t\tos=-sysv3\n\t\t;;\n\tm68k-ccur)\n\t\tos=-rtu\n\t\t;;\n\tm88k-omron*)\n\t\tos=-luna\n\t\t;;\n\t*-next )\n\t\tos=-nextstep\n\t\t;;\n\t*-sequent)\n\t\tos=-ptx\n\t\t;;\n\t*-crds)\n\t\tos=-unos\n\t\t;;\n\t*-ns)\n\t\tos=-genix\n\t\t;;\n\ti370-*)\n\t\tos=-mvs\n\t\t;;\n\t*-next)\n\t\tos=-nextstep3\n\t\t;;\n\t*-gould)\n\t\tos=-sysv\n\t\t;;\n\t*-highlevel)\n\t\tos=-bsd\n\t\t;;\n\t*-encore)\n\t\tos=-bsd\n\t\t;;\n\t*-sgi)\n\t\tos=-irix\n\t\t;;\n\t*-siemens)\n\t\tos=-sysv4\n\t\t;;\n\t*-masscomp)\n\t\tos=-rtu\n\t\t;;\n\tf30[01]-fujitsu | f700-fujitsu)\n\t\tos=-uxpv\n\t\t;;\n\t*-rom68k)\n\t\tos=-coff\n\t\t;;\n\t*-*bug)\n\t\tos=-coff\n\t\t;;\n\t*-apple)\n\t\tos=-macos\n\t\t;;\n\t*-atari*)\n\t\tos=-mint\n\t\t;;\n\t*)\n\t\tos=-none\n\t\t;;\nesac\nfi\n\n# Here we handle the case where we know the os, and the CPU type, but not the\n# manufacturer.  We pick the logical manufacturer.\nvendor=unknown\ncase $basic_machine in\n\t*-unknown)\n\t\tcase $os in\n\t\t\t-riscix*)\n\t\t\t\tvendor=acorn\n\t\t\t\t;;\n\t\t\t-sunos*)\n\t\t\t\tvendor=sun\n\t\t\t\t;;\n\t\t\t-cnk*|-aix*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-beos*)\n\t\t\t\tvendor=be\n\t\t\t\t;;\n\t\t\t-hpux*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-mpeix*)\n\t\t\t\tvendor=hp\n\t\t\t\t;;\n\t\t\t-hiux*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-unos*)\n\t\t\t\tvendor=crds\n\t\t\t\t;;\n\t\t\t-dgux*)\n\t\t\t\tvendor=dg\n\t\t\t\t;;\n\t\t\t-luna*)\n\t\t\t\tvendor=omron\n\t\t\t\t;;\n\t\t\t-genix*)\n\t\t\t\tvendor=ns\n\t\t\t\t;;\n\t\t\t-mvs* | -opened*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-os400*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-ptx*)\n\t\t\t\tvendor=sequent\n\t\t\t\t;;\n\t\t\t-tpf*)\n\t\t\t\tvendor=ibm\n\t\t\t\t;;\n\t\t\t-vxsim* | -vxworks* | -windiss*)\n\t\t\t\tvendor=wrs\n\t\t\t\t;;\n\t\t\t-aux*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-hms*)\n\t\t\t\tvendor=hitachi\n\t\t\t\t;;\n\t\t\t-mpw* | -macos*)\n\t\t\t\tvendor=apple\n\t\t\t\t;;\n\t\t\t-*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*)\n\t\t\t\tvendor=atari\n\t\t\t\t;;\n\t\t\t-vos*)\n\t\t\t\tvendor=stratus\n\t\t\t\t;;\n\t\tesac\n\t\tbasic_machine=`echo $basic_machine | sed \"s/unknown/$vendor/\"`\n\t\t;;\nesac\n\necho $basic_machine$os\nexit\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"timestamp='\"\n# time-stamp-format: \"%:y-%02m-%02d\"\n# time-stamp-end: \"'\"\n# End:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/build-aux/depcomp",
    "content": "#! /bin/sh\n# depcomp - compile a program generating dependencies as side-effects\n\nscriptversion=2013-05-30.07; # UTC\n\n# Copyright (C) 1999-2013 Free Software Foundation, Inc.\n\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# Originally written by Alexandre Oliva <oliva@dcc.unicamp.br>.\n\ncase $1 in\n  '')\n    echo \"$0: No command.  Try '$0 --help' for more information.\" 1>&2\n    exit 1;\n    ;;\n  -h | --h*)\n    cat <<\\EOF\nUsage: depcomp [--help] [--version] PROGRAM [ARGS]\n\nRun PROGRAMS ARGS to compile a file, generating dependencies\nas side-effects.\n\nEnvironment variables:\n  depmode     Dependency tracking mode.\n  source      Source file read by 'PROGRAMS ARGS'.\n  object      Object file output by 'PROGRAMS ARGS'.\n  DEPDIR      directory where to store dependencies.\n  depfile     Dependency file to output.\n  tmpdepfile  Temporary file to use when outputting dependencies.\n  libtool     Whether libtool is used (yes/no).\n\nReport bugs to <bug-automake@gnu.org>.\nEOF\n    exit $?\n    ;;\n  -v | --v*)\n    echo \"depcomp $scriptversion\"\n    exit $?\n    ;;\nesac\n\n# Get the directory component of the given path, and save it in the\n# global variables '$dir'.  Note that this directory component will\n# be either empty or ending with a '/' character.  This is deliberate.\nset_dir_from ()\n{\n  case $1 in\n    */*) dir=`echo \"$1\" | sed -e 's|/[^/]*$|/|'`;;\n      *) dir=;;\n  esac\n}\n\n# Get the suffix-stripped basename of the given path, and save it the\n# global variable '$base'.\nset_base_from ()\n{\n  base=`echo \"$1\" | sed -e 's|^.*/||' -e 's/\\.[^.]*$//'`\n}\n\n# If no dependency file was actually created by the compiler invocation,\n# we still have to create a dummy depfile, to avoid errors with the\n# Makefile \"include basename.Plo\" scheme.\nmake_dummy_depfile ()\n{\n  echo \"#dummy\" > \"$depfile\"\n}\n\n# Factor out some common post-processing of the generated depfile.\n# Requires the auxiliary global variable '$tmpdepfile' to be set.\naix_post_process_depfile ()\n{\n  # If the compiler actually managed to produce a dependency file,\n  # post-process it.\n  if test -f \"$tmpdepfile\"; then\n    # Each line is of the form 'foo.o: dependency.h'.\n    # Do two passes, one to just change these to\n    #   $object: dependency.h\n    # and one to simply output\n    #   dependency.h:\n    # which is needed to avoid the deleted-header problem.\n    { sed -e \"s,^.*\\.[$lower]*:,$object:,\" < \"$tmpdepfile\"\n      sed -e \"s,^.*\\.[$lower]*:[$tab ]*,,\" -e 's,$,:,' < \"$tmpdepfile\"\n    } > \"$depfile\"\n    rm -f \"$tmpdepfile\"\n  else\n    make_dummy_depfile\n  fi\n}\n\n# A tabulation character.\ntab='\t'\n# A newline character.\nnl='\n'\n# Character ranges might be problematic outside the C locale.\n# These definitions help.\nupper=ABCDEFGHIJKLMNOPQRSTUVWXYZ\nlower=abcdefghijklmnopqrstuvwxyz\ndigits=0123456789\nalpha=${upper}${lower}\n\nif test -z \"$depmode\" || test -z \"$source\" || test -z \"$object\"; then\n  echo \"depcomp: Variables source, object and depmode must be set\" 1>&2\n  exit 1\nfi\n\n# Dependencies for sub/bar.o or sub/bar.obj go into sub/.deps/bar.Po.\ndepfile=${depfile-`echo \"$object\" |\n  sed 's|[^\\\\/]*$|'${DEPDIR-.deps}'/&|;s|\\.\\([^.]*\\)$|.P\\1|;s|Pobj$|Po|'`}\ntmpdepfile=${tmpdepfile-`echo \"$depfile\" | sed 's/\\.\\([^.]*\\)$/.T\\1/'`}\n\nrm -f \"$tmpdepfile\"\n\n# Avoid interferences from the environment.\ngccflag= dashmflag=\n\n# Some modes work just like other modes, but use different flags.  We\n# parameterize here, but still list the modes in the big case below,\n# to make depend.m4 easier to write.  Note that we *cannot* use a case\n# here, because this file can only contain one case statement.\nif test \"$depmode\" = hp; then\n  # HP compiler uses -M and no extra arg.\n  gccflag=-M\n  depmode=gcc\nfi\n\nif test \"$depmode\" = dashXmstdout; then\n  # This is just like dashmstdout with a different argument.\n  dashmflag=-xM\n  depmode=dashmstdout\nfi\n\ncygpath_u=\"cygpath -u -f -\"\nif test \"$depmode\" = msvcmsys; then\n  # This is just like msvisualcpp but w/o cygpath translation.\n  # Just convert the backslash-escaped backslashes to single forward\n  # slashes to satisfy depend.m4\n  cygpath_u='sed s,\\\\\\\\,/,g'\n  depmode=msvisualcpp\nfi\n\nif test \"$depmode\" = msvc7msys; then\n  # This is just like msvc7 but w/o cygpath translation.\n  # Just convert the backslash-escaped backslashes to single forward\n  # slashes to satisfy depend.m4\n  cygpath_u='sed s,\\\\\\\\,/,g'\n  depmode=msvc7\nfi\n\nif test \"$depmode\" = xlc; then\n  # IBM C/C++ Compilers xlc/xlC can output gcc-like dependency information.\n  gccflag=-qmakedep=gcc,-MF\n  depmode=gcc\nfi\n\ncase \"$depmode\" in\ngcc3)\n## gcc 3 implements dependency tracking that does exactly what\n## we want.  Yay!  Note: for some reason libtool 1.4 doesn't like\n## it if -MD -MP comes after the -MF stuff.  Hmm.\n## Unfortunately, FreeBSD c89 acceptance of flags depends upon\n## the command line argument order; so add the flags where they\n## appear in depend2.am.  Note that the slowdown incurred here\n## affects only configure: in makefiles, %FASTDEP% shortcuts this.\n  for arg\n  do\n    case $arg in\n    -c) set fnord \"$@\" -MT \"$object\" -MD -MP -MF \"$tmpdepfile\" \"$arg\" ;;\n    *)  set fnord \"$@\" \"$arg\" ;;\n    esac\n    shift # fnord\n    shift # $arg\n  done\n  \"$@\"\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  mv \"$tmpdepfile\" \"$depfile\"\n  ;;\n\ngcc)\n## Note that this doesn't just cater to obsosete pre-3.x GCC compilers.\n## but also to in-use compilers like IMB xlc/xlC and the HP C compiler.\n## (see the conditional assignment to $gccflag above).\n## There are various ways to get dependency output from gcc.  Here's\n## why we pick this rather obscure method:\n## - Don't want to use -MD because we'd like the dependencies to end\n##   up in a subdir.  Having to rename by hand is ugly.\n##   (We might end up doing this anyway to support other compilers.)\n## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like\n##   -MM, not -M (despite what the docs say).  Also, it might not be\n##   supported by the other compilers which use the 'gcc' depmode.\n## - Using -M directly means running the compiler twice (even worse\n##   than renaming).\n  if test -z \"$gccflag\"; then\n    gccflag=-MD,\n  fi\n  \"$@\" -Wp,\"$gccflag$tmpdepfile\"\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  # The second -e expression handles DOS-style file names with drive\n  # letters.\n  sed -e 's/^[^:]*: / /' \\\n      -e 's/^['$alpha']:\\/[^:]*: / /' < \"$tmpdepfile\" >> \"$depfile\"\n## This next piece of magic avoids the \"deleted header file\" problem.\n## The problem is that when a header file which appears in a .P file\n## is deleted, the dependency causes make to die (because there is\n## typically no way to rebuild the header).  We avoid this by adding\n## dummy dependencies for each header file.  Too bad gcc doesn't do\n## this for us directly.\n## Some versions of gcc put a space before the ':'.  On the theory\n## that the space means something, we add a space to the output as\n## well.  hp depmode also adds that space, but also prefixes the VPATH\n## to the object.  Take care to not repeat it in the output.\n## Some versions of the HPUX 10.20 sed can't process this invocation\n## correctly.  Breaking it into two sed invocations is a workaround.\n  tr ' ' \"$nl\" < \"$tmpdepfile\" \\\n    | sed -e 's/^\\\\$//' -e '/^$/d' -e \"s|.*$object$||\" -e '/:$/d' \\\n    | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nhp)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\nsgi)\n  if test \"$libtool\" = yes; then\n    \"$@\" \"-Wp,-MDupdate,$tmpdepfile\"\n  else\n    \"$@\" -MDupdate \"$tmpdepfile\"\n  fi\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n\n  if test -f \"$tmpdepfile\"; then  # yes, the sourcefile depend on other files\n    echo \"$object : \\\\\" > \"$depfile\"\n    # Clip off the initial element (the dependent).  Don't try to be\n    # clever and replace this with sed code, as IRIX sed won't handle\n    # lines with more than a fixed number of characters (4096 in\n    # IRIX 6.2 sed, 8192 in IRIX 6.5).  We also remove comment lines;\n    # the IRIX cc adds comments like '#:fec' to the end of the\n    # dependency line.\n    tr ' ' \"$nl\" < \"$tmpdepfile\" \\\n      | sed -e 's/^.*\\.o://' -e 's/#.*$//' -e '/^$/ d' \\\n      | tr \"$nl\" ' ' >> \"$depfile\"\n    echo >> \"$depfile\"\n    # The second pass generates a dummy entry for each header file.\n    tr ' ' \"$nl\" < \"$tmpdepfile\" \\\n      | sed -e 's/^.*\\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \\\n      >> \"$depfile\"\n  else\n    make_dummy_depfile\n  fi\n  rm -f \"$tmpdepfile\"\n  ;;\n\nxlc)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\naix)\n  # The C for AIX Compiler uses -M and outputs the dependencies\n  # in a .u file.  In older versions, this file always lives in the\n  # current directory.  Also, the AIX compiler puts '$object:' at the\n  # start of each line; $object doesn't have directory information.\n  # Version 6 uses the directory in both cases.\n  set_dir_from \"$object\"\n  set_base_from \"$object\"\n  if test \"$libtool\" = yes; then\n    tmpdepfile1=$dir$base.u\n    tmpdepfile2=$base.u\n    tmpdepfile3=$dir.libs/$base.u\n    \"$@\" -Wc,-M\n  else\n    tmpdepfile1=$dir$base.u\n    tmpdepfile2=$dir$base.u\n    tmpdepfile3=$dir$base.u\n    \"$@\" -M\n  fi\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n    exit $stat\n  fi\n\n  for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n  do\n    test -f \"$tmpdepfile\" && break\n  done\n  aix_post_process_depfile\n  ;;\n\ntcc)\n  # tcc (Tiny C Compiler) understand '-MD -MF file' since version 0.9.26\n  # FIXME: That version still under development at the moment of writing.\n  #        Make that this statement remains true also for stable, released\n  #        versions.\n  # It will wrap lines (doesn't matter whether long or short) with a\n  # trailing '\\', as in:\n  #\n  #   foo.o : \\\n  #    foo.c \\\n  #    foo.h \\\n  #\n  # It will put a trailing '\\' even on the last line, and will use leading\n  # spaces rather than leading tabs (at least since its commit 0394caf7\n  # \"Emit spaces for -MD\").\n  \"$@\" -MD -MF \"$tmpdepfile\"\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  # Each non-empty line is of the form 'foo.o : \\' or ' dep.h \\'.\n  # We have to change lines of the first kind to '$object: \\'.\n  sed -e \"s|.*:|$object :|\" < \"$tmpdepfile\" > \"$depfile\"\n  # And for each line of the second kind, we have to emit a 'dep.h:'\n  # dummy dependency, to avoid the deleted-header problem.\n  sed -n -e 's|^  *\\(.*\\) *\\\\$|\\1:|p' < \"$tmpdepfile\" >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\n## The order of this option in the case statement is important, since the\n## shell code in configure will try each of these formats in the order\n## listed in this file.  A plain '-MD' option would be understood by many\n## compilers, so we must ensure this comes after the gcc and icc options.\npgcc)\n  # Portland's C compiler understands '-MD'.\n  # Will always output deps to 'file.d' where file is the root name of the\n  # source file under compilation, even if file resides in a subdirectory.\n  # The object file name does not affect the name of the '.d' file.\n  # pgcc 10.2 will output\n  #    foo.o: sub/foo.c sub/foo.h\n  # and will wrap long lines using '\\' :\n  #    foo.o: sub/foo.c ... \\\n  #     sub/foo.h ... \\\n  #     ...\n  set_dir_from \"$object\"\n  # Use the source, not the object, to determine the base name, since\n  # that's sadly what pgcc will do too.\n  set_base_from \"$source\"\n  tmpdepfile=$base.d\n\n  # For projects that build the same source file twice into different object\n  # files, the pgcc approach of using the *source* file root name can cause\n  # problems in parallel builds.  Use a locking strategy to avoid stomping on\n  # the same $tmpdepfile.\n  lockdir=$base.d-lock\n  trap \"\n    echo '$0: caught signal, cleaning up...' >&2\n    rmdir '$lockdir'\n    exit 1\n  \" 1 2 13 15\n  numtries=100\n  i=$numtries\n  while test $i -gt 0; do\n    # mkdir is a portable test-and-set.\n    if mkdir \"$lockdir\" 2>/dev/null; then\n      # This process acquired the lock.\n      \"$@\" -MD\n      stat=$?\n      # Release the lock.\n      rmdir \"$lockdir\"\n      break\n    else\n      # If the lock is being held by a different process, wait\n      # until the winning process is done or we timeout.\n      while test -d \"$lockdir\" && test $i -gt 0; do\n        sleep 1\n        i=`expr $i - 1`\n      done\n    fi\n    i=`expr $i - 1`\n  done\n  trap - 1 2 13 15\n  if test $i -le 0; then\n    echo \"$0: failed to acquire lock after $numtries attempts\" >&2\n    echo \"$0: check lockdir '$lockdir'\" >&2\n    exit 1\n  fi\n\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  # Each line is of the form `foo.o: dependent.h',\n  # or `foo.o: dep1.h dep2.h \\', or ` dep3.h dep4.h \\'.\n  # Do two passes, one to just change these to\n  # `$object: dependent.h' and one to simply `dependent.h:'.\n  sed \"s,^[^:]*:,$object :,\" < \"$tmpdepfile\" > \"$depfile\"\n  # Some versions of the HPUX 10.20 sed can't process this invocation\n  # correctly.  Breaking it into two sed invocations is a workaround.\n  sed 's,^[^:]*: \\(.*\\)$,\\1,;s/^\\\\$//;/^$/d;/:$/d' < \"$tmpdepfile\" \\\n    | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nhp2)\n  # The \"hp\" stanza above does not work with aCC (C++) and HP's ia64\n  # compilers, which have integrated preprocessors.  The correct option\n  # to use with these is +Maked; it writes dependencies to a file named\n  # 'foo.d', which lands next to the object file, wherever that\n  # happens to be.\n  # Much of this is similar to the tru64 case; see comments there.\n  set_dir_from  \"$object\"\n  set_base_from \"$object\"\n  if test \"$libtool\" = yes; then\n    tmpdepfile1=$dir$base.d\n    tmpdepfile2=$dir.libs/$base.d\n    \"$@\" -Wc,+Maked\n  else\n    tmpdepfile1=$dir$base.d\n    tmpdepfile2=$dir$base.d\n    \"$@\" +Maked\n  fi\n  stat=$?\n  if test $stat -ne 0; then\n     rm -f \"$tmpdepfile1\" \"$tmpdepfile2\"\n     exit $stat\n  fi\n\n  for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\"\n  do\n    test -f \"$tmpdepfile\" && break\n  done\n  if test -f \"$tmpdepfile\"; then\n    sed -e \"s,^.*\\.[$lower]*:,$object:,\" \"$tmpdepfile\" > \"$depfile\"\n    # Add 'dependent.h:' lines.\n    sed -ne '2,${\n               s/^ *//\n               s/ \\\\*$//\n               s/$/:/\n               p\n             }' \"$tmpdepfile\" >> \"$depfile\"\n  else\n    make_dummy_depfile\n  fi\n  rm -f \"$tmpdepfile\" \"$tmpdepfile2\"\n  ;;\n\ntru64)\n  # The Tru64 compiler uses -MD to generate dependencies as a side\n  # effect.  'cc -MD -o foo.o ...' puts the dependencies into 'foo.o.d'.\n  # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put\n  # dependencies in 'foo.d' instead, so we check for that too.\n  # Subdirectories are respected.\n  set_dir_from  \"$object\"\n  set_base_from \"$object\"\n\n  if test \"$libtool\" = yes; then\n    # Libtool generates 2 separate objects for the 2 libraries.  These\n    # two compilations output dependencies in $dir.libs/$base.o.d and\n    # in $dir$base.o.d.  We have to check for both files, because\n    # one of the two compilations can be disabled.  We should prefer\n    # $dir$base.o.d over $dir.libs/$base.o.d because the latter is\n    # automatically cleaned when .libs/ is deleted, while ignoring\n    # the former would cause a distcleancheck panic.\n    tmpdepfile1=$dir$base.o.d          # libtool 1.5\n    tmpdepfile2=$dir.libs/$base.o.d    # Likewise.\n    tmpdepfile3=$dir.libs/$base.d      # Compaq CCC V6.2-504\n    \"$@\" -Wc,-MD\n  else\n    tmpdepfile1=$dir$base.d\n    tmpdepfile2=$dir$base.d\n    tmpdepfile3=$dir$base.d\n    \"$@\" -MD\n  fi\n\n  stat=$?\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n    exit $stat\n  fi\n\n  for tmpdepfile in \"$tmpdepfile1\" \"$tmpdepfile2\" \"$tmpdepfile3\"\n  do\n    test -f \"$tmpdepfile\" && break\n  done\n  # Same post-processing that is required for AIX mode.\n  aix_post_process_depfile\n  ;;\n\nmsvc7)\n  if test \"$libtool\" = yes; then\n    showIncludes=-Wc,-showIncludes\n  else\n    showIncludes=-showIncludes\n  fi\n  \"$@\" $showIncludes > \"$tmpdepfile\"\n  stat=$?\n  grep -v '^Note: including file: ' \"$tmpdepfile\"\n  if test $stat -ne 0; then\n    rm -f \"$tmpdepfile\"\n    exit $stat\n  fi\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  # The first sed program below extracts the file names and escapes\n  # backslashes for cygpath.  The second sed program outputs the file\n  # name when reading, but also accumulates all include files in the\n  # hold buffer in order to output them again at the end.  This only\n  # works with sed implementations that can handle large buffers.\n  sed < \"$tmpdepfile\" -n '\n/^Note: including file:  *\\(.*\\)/ {\n  s//\\1/\n  s/\\\\/\\\\\\\\/g\n  p\n}' | $cygpath_u | sort -u | sed -n '\ns/ /\\\\ /g\ns/\\(.*\\)/'\"$tab\"'\\1 \\\\/p\ns/.\\(.*\\) \\\\/\\1:/\nH\n$ {\n  s/.*/'\"$tab\"'/\n  G\n  p\n}' >> \"$depfile\"\n  echo >> \"$depfile\" # make sure the fragment doesn't end with a backslash\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvc7msys)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\n#nosideeffect)\n  # This comment above is used by automake to tell side-effect\n  # dependency tracking mechanisms from slower ones.\n\ndashmstdout)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout, regardless of -o.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  # Remove '-o $object'.\n  IFS=\" \"\n  for arg\n  do\n    case $arg in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"\n      shift # fnord\n      shift # $arg\n      ;;\n    esac\n  done\n\n  test -z \"$dashmflag\" && dashmflag=-M\n  # Require at least two characters before searching for ':'\n  # in the target name.  This is to cope with DOS-style filenames:\n  # a dependency such as 'c:/foo/bar' could be seen as target 'c' otherwise.\n  \"$@\" $dashmflag |\n    sed \"s|^[$tab ]*[^:$tab ][^:][^:]*:[$tab ]*|$object: |\" > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  cat < \"$tmpdepfile\" > \"$depfile\"\n  # Some versions of the HPUX 10.20 sed can't process this sed invocation\n  # correctly.  Breaking it into two sed invocations is a workaround.\n  tr ' ' \"$nl\" < \"$tmpdepfile\" \\\n    | sed -e 's/^\\\\$//' -e '/^$/d' -e '/:$/d' \\\n    | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\ndashXmstdout)\n  # This case only exists to satisfy depend.m4.  It is never actually\n  # run, as this mode is specially recognized in the preamble.\n  exit 1\n  ;;\n\nmakedepend)\n  \"$@\" || exit $?\n  # Remove any Libtool call\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n  # X makedepend\n  shift\n  cleared=no eat=no\n  for arg\n  do\n    case $cleared in\n    no)\n      set \"\"; shift\n      cleared=yes ;;\n    esac\n    if test $eat = yes; then\n      eat=no\n      continue\n    fi\n    case \"$arg\" in\n    -D*|-I*)\n      set fnord \"$@\" \"$arg\"; shift ;;\n    # Strip any option that makedepend may not understand.  Remove\n    # the object too, otherwise makedepend will parse it as a source file.\n    -arch)\n      eat=yes ;;\n    -*|$object)\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"; shift ;;\n    esac\n  done\n  obj_suffix=`echo \"$object\" | sed 's/^.*\\././'`\n  touch \"$tmpdepfile\"\n  ${MAKEDEPEND-makedepend} -o\"$obj_suffix\" -f\"$tmpdepfile\" \"$@\"\n  rm -f \"$depfile\"\n  # makedepend may prepend the VPATH from the source file name to the object.\n  # No need to regex-escape $object, excess matching of '.' is harmless.\n  sed \"s|^.*\\($object *:\\)|\\1|\" \"$tmpdepfile\" > \"$depfile\"\n  # Some versions of the HPUX 10.20 sed can't process the last invocation\n  # correctly.  Breaking it into two sed invocations is a workaround.\n  sed '1,2d' \"$tmpdepfile\" \\\n    | tr ' ' \"$nl\" \\\n    | sed -e 's/^\\\\$//' -e '/^$/d' -e '/:$/d' \\\n    | sed -e 's/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\" \"$tmpdepfile\".bak\n  ;;\n\ncpp)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  # Remove '-o $object'.\n  IFS=\" \"\n  for arg\n  do\n    case $arg in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    *)\n      set fnord \"$@\" \"$arg\"\n      shift # fnord\n      shift # $arg\n      ;;\n    esac\n  done\n\n  \"$@\" -E \\\n    | sed -n -e '/^# [0-9][0-9]* \"\\([^\"]*\\)\".*/ s:: \\1 \\\\:p' \\\n             -e '/^#line [0-9][0-9]* \"\\([^\"]*\\)\".*/ s:: \\1 \\\\:p' \\\n    | sed '$ s: \\\\$::' > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  cat < \"$tmpdepfile\" >> \"$depfile\"\n  sed < \"$tmpdepfile\" '/^$/d;s/^ //;s/ \\\\$//;s/$/ :/' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvisualcpp)\n  # Important note: in order to support this mode, a compiler *must*\n  # always write the preprocessed file to stdout.\n  \"$@\" || exit $?\n\n  # Remove the call to Libtool.\n  if test \"$libtool\" = yes; then\n    while test \"X$1\" != 'X--mode=compile'; do\n      shift\n    done\n    shift\n  fi\n\n  IFS=\" \"\n  for arg\n  do\n    case \"$arg\" in\n    -o)\n      shift\n      ;;\n    $object)\n      shift\n      ;;\n    \"-Gm\"|\"/Gm\"|\"-Gi\"|\"/Gi\"|\"-ZI\"|\"/ZI\")\n        set fnord \"$@\"\n        shift\n        shift\n        ;;\n    *)\n        set fnord \"$@\" \"$arg\"\n        shift\n        shift\n        ;;\n    esac\n  done\n  \"$@\" -E 2>/dev/null |\n  sed -n '/^#line [0-9][0-9]* \"\\([^\"]*\\)\"/ s::\\1:p' | $cygpath_u | sort -u > \"$tmpdepfile\"\n  rm -f \"$depfile\"\n  echo \"$object : \\\\\" > \"$depfile\"\n  sed < \"$tmpdepfile\" -n -e 's% %\\\\ %g' -e '/^\\(.*\\)$/ s::'\"$tab\"'\\1 \\\\:p' >> \"$depfile\"\n  echo \"$tab\" >> \"$depfile\"\n  sed < \"$tmpdepfile\" -n -e 's% %\\\\ %g' -e '/^\\(.*\\)$/ s::\\1\\::p' >> \"$depfile\"\n  rm -f \"$tmpdepfile\"\n  ;;\n\nmsvcmsys)\n  # This case exists only to let depend.m4 do its work.  It works by\n  # looking at the text of this script.  This case will never be run,\n  # since it is checked for above.\n  exit 1\n  ;;\n\nnone)\n  exec \"$@\"\n  ;;\n\n*)\n  echo \"Unknown depmode $depmode\" 1>&2\n  exit 1\n  ;;\nesac\n\nexit 0\n\n# Local Variables:\n# mode: shell-script\n# sh-indentation: 2\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/build-aux/install-sh",
    "content": "#!/bin/sh\n# install - install a program, script, or datafile\n\nscriptversion=2011-11-20.07; # UTC\n\n# This originates from X11R5 (mit/util/scripts/install.sh), which was\n# later released in X11R6 (xc/config/util/install.sh) with the\n# following copyright and license.\n#\n# Copyright (C) 1994 X Consortium\n#\n# Permission is hereby granted, free of charge, to any person obtaining a copy\n# of this software and associated documentation files (the \"Software\"), to\n# deal in the Software without restriction, including without limitation the\n# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n# sell copies of the Software, and to permit persons to whom the Software is\n# furnished to do so, subject to the following conditions:\n#\n# The above copyright notice and this permission notice shall be included in\n# all copies or substantial portions of the Software.\n#\n# THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL THE\n# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN\n# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC-\n# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.\n#\n# Except as contained in this notice, the name of the X Consortium shall not\n# be used in advertising or otherwise to promote the sale, use or other deal-\n# ings in this Software without prior written authorization from the X Consor-\n# tium.\n#\n#\n# FSF changes to this file are in the public domain.\n#\n# Calling this script install-sh is preferred over install.sh, to prevent\n# 'make' implicit rules from creating a file called install from it\n# when there is no Makefile.\n#\n# This script is compatible with the BSD install script, but was written\n# from scratch.\n\nnl='\n'\nIFS=\" \"\"\t$nl\"\n\n# set DOITPROG to echo to test this script\n\n# Don't use :- since 4.3BSD and earlier shells don't like it.\ndoit=${DOITPROG-}\nif test -z \"$doit\"; then\n  doit_exec=exec\nelse\n  doit_exec=$doit\nfi\n\n# Put in absolute file names if you don't have them in your path;\n# or use environment vars.\n\nchgrpprog=${CHGRPPROG-chgrp}\nchmodprog=${CHMODPROG-chmod}\nchownprog=${CHOWNPROG-chown}\ncmpprog=${CMPPROG-cmp}\ncpprog=${CPPROG-cp}\nmkdirprog=${MKDIRPROG-mkdir}\nmvprog=${MVPROG-mv}\nrmprog=${RMPROG-rm}\nstripprog=${STRIPPROG-strip}\n\nposix_glob='?'\ninitialize_posix_glob='\n  test \"$posix_glob\" != \"?\" || {\n    if (set -f) 2>/dev/null; then\n      posix_glob=\n    else\n      posix_glob=:\n    fi\n  }\n'\n\nposix_mkdir=\n\n# Desired mode of installed file.\nmode=0755\n\nchgrpcmd=\nchmodcmd=$chmodprog\nchowncmd=\nmvcmd=$mvprog\nrmcmd=\"$rmprog -f\"\nstripcmd=\n\nsrc=\ndst=\ndir_arg=\ndst_arg=\n\ncopy_on_change=false\nno_target_directory=\n\nusage=\"\\\nUsage: $0 [OPTION]... [-T] SRCFILE DSTFILE\n   or: $0 [OPTION]... SRCFILES... DIRECTORY\n   or: $0 [OPTION]... -t DIRECTORY SRCFILES...\n   or: $0 [OPTION]... -d DIRECTORIES...\n\nIn the 1st form, copy SRCFILE to DSTFILE.\nIn the 2nd and 3rd, copy all SRCFILES to DIRECTORY.\nIn the 4th, create DIRECTORIES.\n\nOptions:\n     --help     display this help and exit.\n     --version  display version info and exit.\n\n  -c            (ignored)\n  -C            install only if different (preserve the last data modification time)\n  -d            create directories instead of installing files.\n  -g GROUP      $chgrpprog installed files to GROUP.\n  -m MODE       $chmodprog installed files to MODE.\n  -o USER       $chownprog installed files to USER.\n  -s            $stripprog installed files.\n  -t DIRECTORY  install into DIRECTORY.\n  -T            report an error if DSTFILE is a directory.\n\nEnvironment variables override the default commands:\n  CHGRPPROG CHMODPROG CHOWNPROG CMPPROG CPPROG MKDIRPROG MVPROG\n  RMPROG STRIPPROG\n\"\n\nwhile test $# -ne 0; do\n  case $1 in\n    -c) ;;\n\n    -C) copy_on_change=true;;\n\n    -d) dir_arg=true;;\n\n    -g) chgrpcmd=\"$chgrpprog $2\"\n\tshift;;\n\n    --help) echo \"$usage\"; exit $?;;\n\n    -m) mode=$2\n\tcase $mode in\n\t  *' '* | *'\t'* | *'\n'*\t  | *'*'* | *'?'* | *'['*)\n\t    echo \"$0: invalid mode: $mode\" >&2\n\t    exit 1;;\n\tesac\n\tshift;;\n\n    -o) chowncmd=\"$chownprog $2\"\n\tshift;;\n\n    -s) stripcmd=$stripprog;;\n\n    -t) dst_arg=$2\n\t# Protect names problematic for 'test' and other utilities.\n\tcase $dst_arg in\n\t  -* | [=\\(\\)!]) dst_arg=./$dst_arg;;\n\tesac\n\tshift;;\n\n    -T) no_target_directory=true;;\n\n    --version) echo \"$0 $scriptversion\"; exit $?;;\n\n    --)\tshift\n\tbreak;;\n\n    -*)\techo \"$0: invalid option: $1\" >&2\n\texit 1;;\n\n    *)  break;;\n  esac\n  shift\ndone\n\nif test $# -ne 0 && test -z \"$dir_arg$dst_arg\"; then\n  # When -d is used, all remaining arguments are directories to create.\n  # When -t is used, the destination is already specified.\n  # Otherwise, the last argument is the destination.  Remove it from $@.\n  for arg\n  do\n    if test -n \"$dst_arg\"; then\n      # $@ is not empty: it contains at least $arg.\n      set fnord \"$@\" \"$dst_arg\"\n      shift # fnord\n    fi\n    shift # arg\n    dst_arg=$arg\n    # Protect names problematic for 'test' and other utilities.\n    case $dst_arg in\n      -* | [=\\(\\)!]) dst_arg=./$dst_arg;;\n    esac\n  done\nfi\n\nif test $# -eq 0; then\n  if test -z \"$dir_arg\"; then\n    echo \"$0: no input file specified.\" >&2\n    exit 1\n  fi\n  # It's OK to call 'install-sh -d' without argument.\n  # This can happen when creating conditional directories.\n  exit 0\nfi\n\nif test -z \"$dir_arg\"; then\n  do_exit='(exit $ret); exit $ret'\n  trap \"ret=129; $do_exit\" 1\n  trap \"ret=130; $do_exit\" 2\n  trap \"ret=141; $do_exit\" 13\n  trap \"ret=143; $do_exit\" 15\n\n  # Set umask so as not to create temps with too-generous modes.\n  # However, 'strip' requires both read and write access to temps.\n  case $mode in\n    # Optimize common cases.\n    *644) cp_umask=133;;\n    *755) cp_umask=22;;\n\n    *[0-7])\n      if test -z \"$stripcmd\"; then\n\tu_plus_rw=\n      else\n\tu_plus_rw='% 200'\n      fi\n      cp_umask=`expr '(' 777 - $mode % 1000 ')' $u_plus_rw`;;\n    *)\n      if test -z \"$stripcmd\"; then\n\tu_plus_rw=\n      else\n\tu_plus_rw=,u+rw\n      fi\n      cp_umask=$mode$u_plus_rw;;\n  esac\nfi\n\nfor src\ndo\n  # Protect names problematic for 'test' and other utilities.\n  case $src in\n    -* | [=\\(\\)!]) src=./$src;;\n  esac\n\n  if test -n \"$dir_arg\"; then\n    dst=$src\n    dstdir=$dst\n    test -d \"$dstdir\"\n    dstdir_status=$?\n  else\n\n    # Waiting for this to be detected by the \"$cpprog $src $dsttmp\" command\n    # might cause directories to be created, which would be especially bad\n    # if $src (and thus $dsttmp) contains '*'.\n    if test ! -f \"$src\" && test ! -d \"$src\"; then\n      echo \"$0: $src does not exist.\" >&2\n      exit 1\n    fi\n\n    if test -z \"$dst_arg\"; then\n      echo \"$0: no destination specified.\" >&2\n      exit 1\n    fi\n    dst=$dst_arg\n\n    # If destination is a directory, append the input filename; won't work\n    # if double slashes aren't ignored.\n    if test -d \"$dst\"; then\n      if test -n \"$no_target_directory\"; then\n\techo \"$0: $dst_arg: Is a directory\" >&2\n\texit 1\n      fi\n      dstdir=$dst\n      dst=$dstdir/`basename \"$src\"`\n      dstdir_status=0\n    else\n      # Prefer dirname, but fall back on a substitute if dirname fails.\n      dstdir=`\n\t(dirname \"$dst\") 2>/dev/null ||\n\texpr X\"$dst\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t     X\"$dst\" : 'X\\(//\\)[^/]' \\| \\\n\t     X\"$dst\" : 'X\\(//\\)$' \\| \\\n\t     X\"$dst\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n\techo X\"$dst\" |\n\t    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\/\\)[^/].*/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\/\\)$/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t /^X\\(\\/\\).*/{\n\t\t   s//\\1/\n\t\t   q\n\t\t }\n\t\t s/.*/./; q'\n      `\n\n      test -d \"$dstdir\"\n      dstdir_status=$?\n    fi\n  fi\n\n  obsolete_mkdir_used=false\n\n  if test $dstdir_status != 0; then\n    case $posix_mkdir in\n      '')\n\t# Create intermediate dirs using mode 755 as modified by the umask.\n\t# This is like FreeBSD 'install' as of 1997-10-28.\n\tumask=`umask`\n\tcase $stripcmd.$umask in\n\t  # Optimize common cases.\n\t  *[2367][2367]) mkdir_umask=$umask;;\n\t  .*0[02][02] | .[02][02] | .[02]) mkdir_umask=22;;\n\n\t  *[0-7])\n\t    mkdir_umask=`expr $umask + 22 \\\n\t      - $umask % 100 % 40 + $umask % 20 \\\n\t      - $umask % 10 % 4 + $umask % 2\n\t    `;;\n\t  *) mkdir_umask=$umask,go-w;;\n\tesac\n\n\t# With -d, create the new directory with the user-specified mode.\n\t# Otherwise, rely on $mkdir_umask.\n\tif test -n \"$dir_arg\"; then\n\t  mkdir_mode=-m$mode\n\telse\n\t  mkdir_mode=\n\tfi\n\n\tposix_mkdir=false\n\tcase $umask in\n\t  *[123567][0-7][0-7])\n\t    # POSIX mkdir -p sets u+wx bits regardless of umask, which\n\t    # is incompatible with FreeBSD 'install' when (umask & 300) != 0.\n\t    ;;\n\t  *)\n\t    tmpdir=${TMPDIR-/tmp}/ins$RANDOM-$$\n\t    trap 'ret=$?; rmdir \"$tmpdir/d\" \"$tmpdir\" 2>/dev/null; exit $ret' 0\n\n\t    if (umask $mkdir_umask &&\n\t\texec $mkdirprog $mkdir_mode -p -- \"$tmpdir/d\") >/dev/null 2>&1\n\t    then\n\t      if test -z \"$dir_arg\" || {\n\t\t   # Check for POSIX incompatibilities with -m.\n\t\t   # HP-UX 11.23 and IRIX 6.5 mkdir -m -p sets group- or\n\t\t   # other-writable bit of parent directory when it shouldn't.\n\t\t   # FreeBSD 6.1 mkdir -m -p sets mode of existing directory.\n\t\t   ls_ld_tmpdir=`ls -ld \"$tmpdir\"`\n\t\t   case $ls_ld_tmpdir in\n\t\t     d????-?r-*) different_mode=700;;\n\t\t     d????-?--*) different_mode=755;;\n\t\t     *) false;;\n\t\t   esac &&\n\t\t   $mkdirprog -m$different_mode -p -- \"$tmpdir\" && {\n\t\t     ls_ld_tmpdir_1=`ls -ld \"$tmpdir\"`\n\t\t     test \"$ls_ld_tmpdir\" = \"$ls_ld_tmpdir_1\"\n\t\t   }\n\t\t }\n\t      then posix_mkdir=:\n\t      fi\n\t      rmdir \"$tmpdir/d\" \"$tmpdir\"\n\t    else\n\t      # Remove any dirs left behind by ancient mkdir implementations.\n\t      rmdir ./$mkdir_mode ./-p ./-- 2>/dev/null\n\t    fi\n\t    trap '' 0;;\n\tesac;;\n    esac\n\n    if\n      $posix_mkdir && (\n\tumask $mkdir_umask &&\n\t$doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\"\n      )\n    then :\n    else\n\n      # The umask is ridiculous, or mkdir does not conform to POSIX,\n      # or it failed possibly due to a race condition.  Create the\n      # directory the slow way, step by step, checking for races as we go.\n\n      case $dstdir in\n\t/*) prefix='/';;\n\t[-=\\(\\)!]*) prefix='./';;\n\t*)  prefix='';;\n      esac\n\n      eval \"$initialize_posix_glob\"\n\n      oIFS=$IFS\n      IFS=/\n      $posix_glob set -f\n      set fnord $dstdir\n      shift\n      $posix_glob set +f\n      IFS=$oIFS\n\n      prefixes=\n\n      for d\n      do\n\ttest X\"$d\" = X && continue\n\n\tprefix=$prefix$d\n\tif test -d \"$prefix\"; then\n\t  prefixes=\n\telse\n\t  if $posix_mkdir; then\n\t    (umask=$mkdir_umask &&\n\t     $doit_exec $mkdirprog $mkdir_mode -p -- \"$dstdir\") && break\n\t    # Don't fail if two instances are running concurrently.\n\t    test -d \"$prefix\" || exit 1\n\t  else\n\t    case $prefix in\n\t      *\\'*) qprefix=`echo \"$prefix\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;;\n\t      *) qprefix=$prefix;;\n\t    esac\n\t    prefixes=\"$prefixes '$qprefix'\"\n\t  fi\n\tfi\n\tprefix=$prefix/\n      done\n\n      if test -n \"$prefixes\"; then\n\t# Don't fail if two instances are running concurrently.\n\t(umask $mkdir_umask &&\n\t eval \"\\$doit_exec \\$mkdirprog $prefixes\") ||\n\t  test -d \"$dstdir\" || exit 1\n\tobsolete_mkdir_used=true\n      fi\n    fi\n  fi\n\n  if test -n \"$dir_arg\"; then\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dst\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dst\"; } &&\n    { test \"$obsolete_mkdir_used$chowncmd$chgrpcmd\" = false ||\n      test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dst\"; } || exit 1\n  else\n\n    # Make a couple of temp file names in the proper directory.\n    dsttmp=$dstdir/_inst.$$_\n    rmtmp=$dstdir/_rm.$$_\n\n    # Trap to clean up those temp files at exit.\n    trap 'ret=$?; rm -f \"$dsttmp\" \"$rmtmp\" && exit $ret' 0\n\n    # Copy the file name to the temp name.\n    (umask $cp_umask && $doit_exec $cpprog \"$src\" \"$dsttmp\") &&\n\n    # and set any options; do chmod last to preserve setuid bits.\n    #\n    # If any of these fail, we abort the whole thing.  If we want to\n    # ignore errors from any of these, just make sure not to ignore\n    # errors from the above \"$doit $cpprog $src $dsttmp\" command.\n    #\n    { test -z \"$chowncmd\" || $doit $chowncmd \"$dsttmp\"; } &&\n    { test -z \"$chgrpcmd\" || $doit $chgrpcmd \"$dsttmp\"; } &&\n    { test -z \"$stripcmd\" || $doit $stripcmd \"$dsttmp\"; } &&\n    { test -z \"$chmodcmd\" || $doit $chmodcmd $mode \"$dsttmp\"; } &&\n\n    # If -C, don't bother to copy if it wouldn't change the file.\n    if $copy_on_change &&\n       old=`LC_ALL=C ls -dlL \"$dst\"\t2>/dev/null` &&\n       new=`LC_ALL=C ls -dlL \"$dsttmp\"\t2>/dev/null` &&\n\n       eval \"$initialize_posix_glob\" &&\n       $posix_glob set -f &&\n       set X $old && old=:$2:$4:$5:$6 &&\n       set X $new && new=:$2:$4:$5:$6 &&\n       $posix_glob set +f &&\n\n       test \"$old\" = \"$new\" &&\n       $cmpprog \"$dst\" \"$dsttmp\" >/dev/null 2>&1\n    then\n      rm -f \"$dsttmp\"\n    else\n      # Rename the file to the real destination.\n      $doit $mvcmd -f \"$dsttmp\" \"$dst\" 2>/dev/null ||\n\n      # The rename failed, perhaps because mv can't rename something else\n      # to itself, or perhaps because mv is so ancient that it does not\n      # support -f.\n      {\n\t# Now remove or move aside any old file at destination location.\n\t# We try this two ways since rm can't unlink itself on some\n\t# systems and the destination file might be busy for other\n\t# reasons.  In this case, the final cleanup might fail but the new\n\t# file should still install successfully.\n\t{\n\t  test ! -f \"$dst\" ||\n\t  $doit $rmcmd -f \"$dst\" 2>/dev/null ||\n\t  { $doit $mvcmd -f \"$dst\" \"$rmtmp\" 2>/dev/null &&\n\t    { $doit $rmcmd -f \"$rmtmp\" 2>/dev/null; :; }\n\t  } ||\n\t  { echo \"$0: cannot unlink or rename $dst\" >&2\n\t    (exit 1); exit 1\n\t  }\n\t} &&\n\n\t# Now rename the file to the real destination.\n\t$doit $mvcmd \"$dsttmp\" \"$dst\"\n      }\n    fi || exit 1\n\n    trap '' 0\n  fi\ndone\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/build-aux/ltmain.sh",
    "content": "\n# libtool (GNU libtool) 2.4.2\n# Written by Gordon Matzigkeit <gord@gnu.ai.mit.edu>, 1996\n\n# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005, 2006,\n# 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.\n# This is free software; see the source for copying conditions.  There is NO\n# warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\n# GNU Libtool is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# As a special exception to the GNU General Public License,\n# if you distribute this file as part of a program or library that\n# is built using GNU Libtool, you may include this file under the\n# same distribution terms that you use for the rest of that program.\n#\n# GNU Libtool is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with GNU Libtool; see the file COPYING.  If not, a copy\n# can be downloaded from http://www.gnu.org/licenses/gpl.html,\n# or obtained by writing to the Free Software Foundation, Inc.,\n# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\n# Usage: $progname [OPTION]... [MODE-ARG]...\n#\n# Provide generalized library-building support services.\n#\n#       --config             show all configuration variables\n#       --debug              enable verbose shell tracing\n#   -n, --dry-run            display commands without modifying any files\n#       --features           display basic configuration information and exit\n#       --mode=MODE          use operation mode MODE\n#       --preserve-dup-deps  don't remove duplicate dependency libraries\n#       --quiet, --silent    don't print informational messages\n#       --no-quiet, --no-silent\n#                            print informational messages (default)\n#       --no-warn            don't display warning messages\n#       --tag=TAG            use configuration variables from tag TAG\n#   -v, --verbose            print more informational messages than default\n#       --no-verbose         don't print the extra informational messages\n#       --version            print version information\n#   -h, --help, --help-all   print short, long, or detailed help message\n#\n# MODE must be one of the following:\n#\n#         clean              remove files from the build directory\n#         compile            compile a source file into a libtool object\n#         execute            automatically set library path, then run a program\n#         finish             complete the installation of libtool libraries\n#         install            install libraries or executables\n#         link               create a library or an executable\n#         uninstall          remove libraries from an installed directory\n#\n# MODE-ARGS vary depending on the MODE.  When passed as first option,\n# `--mode=MODE' may be abbreviated as `MODE' or a unique abbreviation of that.\n# Try `$progname --help --mode=MODE' for a more detailed description of MODE.\n#\n# When reporting a bug, please describe a test case to reproduce it and\n# include the following information:\n#\n#         host-triplet:\t$host\n#         shell:\t\t$SHELL\n#         compiler:\t\t$LTCC\n#         compiler flags:\t\t$LTCFLAGS\n#         linker:\t\t$LD (gnu? $with_gnu_ld)\n#         $progname:\t(GNU libtool) 2.4.2 Debian-2.4.2-1.7ubuntu1\n#         automake:\t$automake_version\n#         autoconf:\t$autoconf_version\n#\n# Report bugs to <bug-libtool@gnu.org>.\n# GNU libtool home page: <http://www.gnu.org/software/libtool/>.\n# General help using GNU software: <http://www.gnu.org/gethelp/>.\n\nPROGRAM=libtool\nPACKAGE=libtool\nVERSION=\"2.4.2 Debian-2.4.2-1.7ubuntu1\"\nTIMESTAMP=\"\"\npackage_revision=1.3337\n\n# Be Bourne compatible\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Zsh 3.x and 4.x performs word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in *posix*) set -o posix;; esac\nfi\nBIN_SH=xpg4; export BIN_SH # for Tru64\nDUALCASE=1; export DUALCASE # for MKS sh\n\n# A function that is used when there is no print builtin or printf.\nfunc_fallback_echo ()\n{\n  eval 'cat <<_LTECHO_EOF\n$1\n_LTECHO_EOF'\n}\n\n# NLS nuisances: We save the old values to restore during execute mode.\nlt_user_locale=\nlt_safe_locale=\nfor lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES\ndo\n  eval \"if test \\\"\\${$lt_var+set}\\\" = set; then\n          save_$lt_var=\\$$lt_var\n          $lt_var=C\n\t  export $lt_var\n\t  lt_user_locale=\\\"$lt_var=\\\\\\$save_\\$lt_var; \\$lt_user_locale\\\"\n\t  lt_safe_locale=\\\"$lt_var=C; \\$lt_safe_locale\\\"\n\tfi\"\ndone\nLC_ALL=C\nLANGUAGE=C\nexport LANGUAGE LC_ALL\n\n$lt_unset CDPATH\n\n\n# Work around backward compatibility issue on IRIX 6.5. On IRIX 6.4+, sh\n# is ksh but when the shell is invoked as \"sh\" and the current value of\n# the _XPG environment variable is not equal to 1 (one), the special\n# positional parameter $0, within a function call, is the name of the\n# function.\nprogpath=\"$0\"\n\n\n\n: ${CP=\"cp -f\"}\ntest \"${ECHO+set}\" = set || ECHO=${as_echo-'printf %s\\n'}\n: ${MAKE=\"make\"}\n: ${MKDIR=\"mkdir\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n: ${SHELL=\"${CONFIG_SHELL-/bin/sh}\"}\n: ${Xsed=\"$SED -e 1s/^X//\"}\n\n# Global variables:\nEXIT_SUCCESS=0\nEXIT_FAILURE=1\nEXIT_MISMATCH=63  # $? = 63 is used to indicate version mismatch to missing.\nEXIT_SKIP=77\t  # $? = 77 is used to indicate a skipped test to automake.\n\nexit_status=$EXIT_SUCCESS\n\n# Make sure IFS has a sensible default\nlt_nl='\n'\nIFS=\" \t$lt_nl\"\n\ndirname=\"s,/[^/]*$,,\"\nbasename=\"s,^.*/,,\"\n\n# func_dirname file append nondir_replacement\n# Compute the dirname of FILE.  If nonempty, add APPEND to the result,\n# otherwise set result to NONDIR_REPLACEMENT.\nfunc_dirname ()\n{\n    func_dirname_result=`$ECHO \"${1}\" | $SED \"$dirname\"`\n    if test \"X$func_dirname_result\" = \"X${1}\"; then\n      func_dirname_result=\"${3}\"\n    else\n      func_dirname_result=\"$func_dirname_result${2}\"\n    fi\n} # func_dirname may be replaced by extended shell implementation\n\n\n# func_basename file\nfunc_basename ()\n{\n    func_basename_result=`$ECHO \"${1}\" | $SED \"$basename\"`\n} # func_basename may be replaced by extended shell implementation\n\n\n# func_dirname_and_basename file append nondir_replacement\n# perform func_basename and func_dirname in a single function\n# call:\n#   dirname:  Compute the dirname of FILE.  If nonempty,\n#             add APPEND to the result, otherwise set result\n#             to NONDIR_REPLACEMENT.\n#             value returned in \"$func_dirname_result\"\n#   basename: Compute filename of FILE.\n#             value retuned in \"$func_basename_result\"\n# Implementation must be kept synchronized with func_dirname\n# and func_basename. For efficiency, we do not delegate to\n# those functions but instead duplicate the functionality here.\nfunc_dirname_and_basename ()\n{\n    # Extract subdirectory from the argument.\n    func_dirname_result=`$ECHO \"${1}\" | $SED -e \"$dirname\"`\n    if test \"X$func_dirname_result\" = \"X${1}\"; then\n      func_dirname_result=\"${3}\"\n    else\n      func_dirname_result=\"$func_dirname_result${2}\"\n    fi\n    func_basename_result=`$ECHO \"${1}\" | $SED -e \"$basename\"`\n} # func_dirname_and_basename may be replaced by extended shell implementation\n\n\n# func_stripname prefix suffix name\n# strip PREFIX and SUFFIX off of NAME.\n# PREFIX and SUFFIX must not contain globbing or regex special\n# characters, hashes, percent signs, but SUFFIX may contain a leading\n# dot (in which case that matches only a dot).\n# func_strip_suffix prefix name\nfunc_stripname ()\n{\n    case ${2} in\n      .*) func_stripname_result=`$ECHO \"${3}\" | $SED \"s%^${1}%%; s%\\\\\\\\${2}\\$%%\"`;;\n      *)  func_stripname_result=`$ECHO \"${3}\" | $SED \"s%^${1}%%; s%${2}\\$%%\"`;;\n    esac\n} # func_stripname may be replaced by extended shell implementation\n\n\n# These SED scripts presuppose an absolute path with a trailing slash.\npathcar='s,^/\\([^/]*\\).*$,\\1,'\npathcdr='s,^/[^/]*,,'\nremovedotparts=':dotsl\n\t\ts@/\\./@/@g\n\t\tt dotsl\n\t\ts,/\\.$,/,'\ncollapseslashes='s@/\\{1,\\}@/@g'\nfinalslash='s,/*$,/,'\n\n# func_normal_abspath PATH\n# Remove doubled-up and trailing slashes, \".\" path components,\n# and cancel out any \"..\" path components in PATH after making\n# it an absolute path.\n#             value returned in \"$func_normal_abspath_result\"\nfunc_normal_abspath ()\n{\n  # Start from root dir and reassemble the path.\n  func_normal_abspath_result=\n  func_normal_abspath_tpath=$1\n  func_normal_abspath_altnamespace=\n  case $func_normal_abspath_tpath in\n    \"\")\n      # Empty path, that just means $cwd.\n      func_stripname '' '/' \"`pwd`\"\n      func_normal_abspath_result=$func_stripname_result\n      return\n    ;;\n    # The next three entries are used to spot a run of precisely\n    # two leading slashes without using negated character classes;\n    # we take advantage of case's first-match behaviour.\n    ///*)\n      # Unusual form of absolute path, do nothing.\n    ;;\n    //*)\n      # Not necessarily an ordinary path; POSIX reserves leading '//'\n      # and for example Cygwin uses it to access remote file shares\n      # over CIFS/SMB, so we conserve a leading double slash if found.\n      func_normal_abspath_altnamespace=/\n    ;;\n    /*)\n      # Absolute path, do nothing.\n    ;;\n    *)\n      # Relative path, prepend $cwd.\n      func_normal_abspath_tpath=`pwd`/$func_normal_abspath_tpath\n    ;;\n  esac\n  # Cancel out all the simple stuff to save iterations.  We also want\n  # the path to end with a slash for ease of parsing, so make sure\n  # there is one (and only one) here.\n  func_normal_abspath_tpath=`$ECHO \"$func_normal_abspath_tpath\" | $SED \\\n        -e \"$removedotparts\" -e \"$collapseslashes\" -e \"$finalslash\"`\n  while :; do\n    # Processed it all yet?\n    if test \"$func_normal_abspath_tpath\" = / ; then\n      # If we ascended to the root using \"..\" the result may be empty now.\n      if test -z \"$func_normal_abspath_result\" ; then\n        func_normal_abspath_result=/\n      fi\n      break\n    fi\n    func_normal_abspath_tcomponent=`$ECHO \"$func_normal_abspath_tpath\" | $SED \\\n        -e \"$pathcar\"`\n    func_normal_abspath_tpath=`$ECHO \"$func_normal_abspath_tpath\" | $SED \\\n        -e \"$pathcdr\"`\n    # Figure out what to do with it\n    case $func_normal_abspath_tcomponent in\n      \"\")\n        # Trailing empty path component, ignore it.\n      ;;\n      ..)\n        # Parent dir; strip last assembled component from result.\n        func_dirname \"$func_normal_abspath_result\"\n        func_normal_abspath_result=$func_dirname_result\n      ;;\n      *)\n        # Actual path component, append it.\n        func_normal_abspath_result=$func_normal_abspath_result/$func_normal_abspath_tcomponent\n      ;;\n    esac\n  done\n  # Restore leading double-slash if one was found on entry.\n  func_normal_abspath_result=$func_normal_abspath_altnamespace$func_normal_abspath_result\n}\n\n# func_relative_path SRCDIR DSTDIR\n# generates a relative path from SRCDIR to DSTDIR, with a trailing\n# slash if non-empty, suitable for immediately appending a filename\n# without needing to append a separator.\n#             value returned in \"$func_relative_path_result\"\nfunc_relative_path ()\n{\n  func_relative_path_result=\n  func_normal_abspath \"$1\"\n  func_relative_path_tlibdir=$func_normal_abspath_result\n  func_normal_abspath \"$2\"\n  func_relative_path_tbindir=$func_normal_abspath_result\n\n  # Ascend the tree starting from libdir\n  while :; do\n    # check if we have found a prefix of bindir\n    case $func_relative_path_tbindir in\n      $func_relative_path_tlibdir)\n        # found an exact match\n        func_relative_path_tcancelled=\n        break\n        ;;\n      $func_relative_path_tlibdir*)\n        # found a matching prefix\n        func_stripname \"$func_relative_path_tlibdir\" '' \"$func_relative_path_tbindir\"\n        func_relative_path_tcancelled=$func_stripname_result\n        if test -z \"$func_relative_path_result\"; then\n          func_relative_path_result=.\n        fi\n        break\n        ;;\n      *)\n        func_dirname $func_relative_path_tlibdir\n        func_relative_path_tlibdir=${func_dirname_result}\n        if test \"x$func_relative_path_tlibdir\" = x ; then\n          # Have to descend all the way to the root!\n          func_relative_path_result=../$func_relative_path_result\n          func_relative_path_tcancelled=$func_relative_path_tbindir\n          break\n        fi\n        func_relative_path_result=../$func_relative_path_result\n        ;;\n    esac\n  done\n\n  # Now calculate path; take care to avoid doubling-up slashes.\n  func_stripname '' '/' \"$func_relative_path_result\"\n  func_relative_path_result=$func_stripname_result\n  func_stripname '/' '/' \"$func_relative_path_tcancelled\"\n  if test \"x$func_stripname_result\" != x ; then\n    func_relative_path_result=${func_relative_path_result}/${func_stripname_result}\n  fi\n\n  # Normalisation. If bindir is libdir, return empty string,\n  # else relative path ending with a slash; either way, target\n  # file name can be directly appended.\n  if test ! -z \"$func_relative_path_result\"; then\n    func_stripname './' '' \"$func_relative_path_result/\"\n    func_relative_path_result=$func_stripname_result\n  fi\n}\n\n# The name of this program:\nfunc_dirname_and_basename \"$progpath\"\nprogname=$func_basename_result\n\n# Make sure we have an absolute path for reexecution:\ncase $progpath in\n  [\\\\/]*|[A-Za-z]:\\\\*) ;;\n  *[\\\\/]*)\n     progdir=$func_dirname_result\n     progdir=`cd \"$progdir\" && pwd`\n     progpath=\"$progdir/$progname\"\n     ;;\n  *)\n     save_IFS=\"$IFS\"\n     IFS=${PATH_SEPARATOR-:}\n     for progdir in $PATH; do\n       IFS=\"$save_IFS\"\n       test -x \"$progdir/$progname\" && break\n     done\n     IFS=\"$save_IFS\"\n     test -n \"$progdir\" || progdir=`pwd`\n     progpath=\"$progdir/$progname\"\n     ;;\nesac\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nXsed=\"${SED}\"' -e 1s/^X//'\nsed_quote_subst='s/\\([`\"$\\\\]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([\"`\\\\]\\)/\\\\\\1/g'\n\n# Sed substitution that turns a string into a regex matching for the\n# string literally.\nsed_make_literal_regex='s,[].[^$\\\\*\\/],\\\\&,g'\n\n# Sed substitution that converts a w32 file name or path\n# which contains forward slashes, into one that contains\n# (escaped) backslashes.  A very naive implementation.\nlt_sed_naive_backslashify='s|\\\\\\\\*|\\\\|g;s|/|\\\\|g;s|\\\\|\\\\\\\\|g'\n\n# Re-`\\' parameter expansions in output of double_quote_subst that were\n# `\\'-ed in input to the same.  If an odd number of `\\' preceded a '$'\n# in input to double_quote_subst, that '$' was protected from expansion.\n# Since each input `\\' is now two `\\'s, look for any number of runs of\n# four `\\'s followed by two `\\'s and then a '$'.  `\\' that '$'.\nbs='\\\\'\nbs2='\\\\\\\\'\nbs4='\\\\\\\\\\\\\\\\'\ndollar='\\$'\nsed_double_backslash=\"\\\n  s/$bs4/&\\\\\n/g\n  s/^$bs2$dollar/$bs&/\n  s/\\\\([^$bs]\\\\)$bs2$dollar/\\\\1$bs2$bs$dollar/g\n  s/\\n//g\"\n\n# Standard options:\nopt_dry_run=false\nopt_help=false\nopt_quiet=false\nopt_verbose=false\nopt_warning=:\n\n# func_echo arg...\n# Echo program name prefixed message, along with the current mode\n# name if it has been set yet.\nfunc_echo ()\n{\n    $ECHO \"$progname: ${opt_mode+$opt_mode: }$*\"\n}\n\n# func_verbose arg...\n# Echo program name prefixed message in verbose mode only.\nfunc_verbose ()\n{\n    $opt_verbose && func_echo ${1+\"$@\"}\n\n    # A bug in bash halts the script if the last line of a function\n    # fails when set -e is in force, so we need another command to\n    # work around that:\n    :\n}\n\n# func_echo_all arg...\n# Invoke $ECHO with all args, space-separated.\nfunc_echo_all ()\n{\n    $ECHO \"$*\"\n}\n\n# func_error arg...\n# Echo program name prefixed message to standard error.\nfunc_error ()\n{\n    $ECHO \"$progname: ${opt_mode+$opt_mode: }\"${1+\"$@\"} 1>&2\n}\n\n# func_warning arg...\n# Echo program name prefixed warning message to standard error.\nfunc_warning ()\n{\n    $opt_warning && $ECHO \"$progname: ${opt_mode+$opt_mode: }warning: \"${1+\"$@\"} 1>&2\n\n    # bash bug again:\n    :\n}\n\n# func_fatal_error arg...\n# Echo program name prefixed message to standard error, and exit.\nfunc_fatal_error ()\n{\n    func_error ${1+\"$@\"}\n    exit $EXIT_FAILURE\n}\n\n# func_fatal_help arg...\n# Echo program name prefixed message to standard error, followed by\n# a help hint, and exit.\nfunc_fatal_help ()\n{\n    func_error ${1+\"$@\"}\n    func_fatal_error \"$help\"\n}\nhelp=\"Try \\`$progname --help' for more information.\"  ## default\n\n\n# func_grep expression filename\n# Check whether EXPRESSION matches any line of FILENAME, without output.\nfunc_grep ()\n{\n    $GREP \"$1\" \"$2\" >/dev/null 2>&1\n}\n\n\n# func_mkdir_p directory-path\n# Make sure the entire path to DIRECTORY-PATH is available.\nfunc_mkdir_p ()\n{\n    my_directory_path=\"$1\"\n    my_dir_list=\n\n    if test -n \"$my_directory_path\" && test \"$opt_dry_run\" != \":\"; then\n\n      # Protect directory names starting with `-'\n      case $my_directory_path in\n        -*) my_directory_path=\"./$my_directory_path\" ;;\n      esac\n\n      # While some portion of DIR does not yet exist...\n      while test ! -d \"$my_directory_path\"; do\n        # ...make a list in topmost first order.  Use a colon delimited\n\t# list incase some portion of path contains whitespace.\n        my_dir_list=\"$my_directory_path:$my_dir_list\"\n\n        # If the last portion added has no slash in it, the list is done\n        case $my_directory_path in */*) ;; *) break ;; esac\n\n        # ...otherwise throw away the child directory and loop\n        my_directory_path=`$ECHO \"$my_directory_path\" | $SED -e \"$dirname\"`\n      done\n      my_dir_list=`$ECHO \"$my_dir_list\" | $SED 's,:*$,,'`\n\n      save_mkdir_p_IFS=\"$IFS\"; IFS=':'\n      for my_dir in $my_dir_list; do\n\tIFS=\"$save_mkdir_p_IFS\"\n        # mkdir can fail with a `File exist' error if two processes\n        # try to create one of the directories concurrently.  Don't\n        # stop in that case!\n        $MKDIR \"$my_dir\" 2>/dev/null || :\n      done\n      IFS=\"$save_mkdir_p_IFS\"\n\n      # Bail out if we (or some other process) failed to create a directory.\n      test -d \"$my_directory_path\" || \\\n        func_fatal_error \"Failed to create \\`$1'\"\n    fi\n}\n\n\n# func_mktempdir [string]\n# Make a temporary directory that won't clash with other running\n# libtool processes, and avoids race conditions if possible.  If\n# given, STRING is the basename for that directory.\nfunc_mktempdir ()\n{\n    my_template=\"${TMPDIR-/tmp}/${1-$progname}\"\n\n    if test \"$opt_dry_run\" = \":\"; then\n      # Return a directory name, but don't create it in dry-run mode\n      my_tmpdir=\"${my_template}-$$\"\n    else\n\n      # If mktemp works, use that first and foremost\n      my_tmpdir=`mktemp -d \"${my_template}-XXXXXXXX\" 2>/dev/null`\n\n      if test ! -d \"$my_tmpdir\"; then\n        # Failing that, at least try and use $RANDOM to avoid a race\n        my_tmpdir=\"${my_template}-${RANDOM-0}$$\"\n\n        save_mktempdir_umask=`umask`\n        umask 0077\n        $MKDIR \"$my_tmpdir\"\n        umask $save_mktempdir_umask\n      fi\n\n      # If we're not in dry-run mode, bomb out on failure\n      test -d \"$my_tmpdir\" || \\\n        func_fatal_error \"cannot create temporary directory \\`$my_tmpdir'\"\n    fi\n\n    $ECHO \"$my_tmpdir\"\n}\n\n\n# func_quote_for_eval arg\n# Aesthetically quote ARG to be evaled later.\n# This function returns two values: FUNC_QUOTE_FOR_EVAL_RESULT\n# is double-quoted, suitable for a subsequent eval, whereas\n# FUNC_QUOTE_FOR_EVAL_UNQUOTED_RESULT has merely all characters\n# which are still active within double quotes backslashified.\nfunc_quote_for_eval ()\n{\n    case $1 in\n      *[\\\\\\`\\\"\\$]*)\n\tfunc_quote_for_eval_unquoted_result=`$ECHO \"$1\" | $SED \"$sed_quote_subst\"` ;;\n      *)\n        func_quote_for_eval_unquoted_result=\"$1\" ;;\n    esac\n\n    case $func_quote_for_eval_unquoted_result in\n      # Double-quote args containing shell metacharacters to delay\n      # word splitting, command substitution and and variable\n      # expansion for a subsequent eval.\n      # Many Bourne shells cannot handle close brackets correctly\n      # in scan sets, so we specify it separately.\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n        func_quote_for_eval_result=\"\\\"$func_quote_for_eval_unquoted_result\\\"\"\n        ;;\n      *)\n        func_quote_for_eval_result=\"$func_quote_for_eval_unquoted_result\"\n    esac\n}\n\n\n# func_quote_for_expand arg\n# Aesthetically quote ARG to be evaled later; same as above,\n# but do not quote variable references.\nfunc_quote_for_expand ()\n{\n    case $1 in\n      *[\\\\\\`\\\"]*)\n\tmy_arg=`$ECHO \"$1\" | $SED \\\n\t    -e \"$double_quote_subst\" -e \"$sed_double_backslash\"` ;;\n      *)\n        my_arg=\"$1\" ;;\n    esac\n\n    case $my_arg in\n      # Double-quote args containing shell metacharacters to delay\n      # word splitting and command substitution for a subsequent eval.\n      # Many Bourne shells cannot handle close brackets correctly\n      # in scan sets, so we specify it separately.\n      *[\\[\\~\\#\\^\\&\\*\\(\\)\\{\\}\\|\\;\\<\\>\\?\\'\\ \\\t]*|*]*|\"\")\n        my_arg=\"\\\"$my_arg\\\"\"\n        ;;\n    esac\n\n    func_quote_for_expand_result=\"$my_arg\"\n}\n\n\n# func_show_eval cmd [fail_exp]\n# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is\n# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP\n# is given, then evaluate it.\nfunc_show_eval ()\n{\n    my_cmd=\"$1\"\n    my_fail_exp=\"${2-:}\"\n\n    ${opt_silent-false} || {\n      func_quote_for_expand \"$my_cmd\"\n      eval \"func_echo $func_quote_for_expand_result\"\n    }\n\n    if ${opt_dry_run-false}; then :; else\n      eval \"$my_cmd\"\n      my_status=$?\n      if test \"$my_status\" -eq 0; then :; else\n\teval \"(exit $my_status); $my_fail_exp\"\n      fi\n    fi\n}\n\n\n# func_show_eval_locale cmd [fail_exp]\n# Unless opt_silent is true, then output CMD.  Then, if opt_dryrun is\n# not true, evaluate CMD.  If the evaluation of CMD fails, and FAIL_EXP\n# is given, then evaluate it.  Use the saved locale for evaluation.\nfunc_show_eval_locale ()\n{\n    my_cmd=\"$1\"\n    my_fail_exp=\"${2-:}\"\n\n    ${opt_silent-false} || {\n      func_quote_for_expand \"$my_cmd\"\n      eval \"func_echo $func_quote_for_expand_result\"\n    }\n\n    if ${opt_dry_run-false}; then :; else\n      eval \"$lt_user_locale\n\t    $my_cmd\"\n      my_status=$?\n      eval \"$lt_safe_locale\"\n      if test \"$my_status\" -eq 0; then :; else\n\teval \"(exit $my_status); $my_fail_exp\"\n      fi\n    fi\n}\n\n# func_tr_sh\n# Turn $1 into a string suitable for a shell variable name.\n# Result is stored in $func_tr_sh_result.  All characters\n# not in the set a-zA-Z0-9_ are replaced with '_'. Further,\n# if $1 begins with a digit, a '_' is prepended as well.\nfunc_tr_sh ()\n{\n  case $1 in\n  [0-9]* | *[!a-zA-Z0-9_]*)\n    func_tr_sh_result=`$ECHO \"$1\" | $SED 's/^\\([0-9]\\)/_\\1/; s/[^a-zA-Z0-9_]/_/g'`\n    ;;\n  * )\n    func_tr_sh_result=$1\n    ;;\n  esac\n}\n\n\n# func_version\n# Echo version message to standard output and exit.\nfunc_version ()\n{\n    $opt_debug\n\n    $SED -n '/(C)/!b go\n\t:more\n\t/\\./!{\n\t  N\n\t  s/\\n# / /\n\t  b more\n\t}\n\t:go\n\t/^# '$PROGRAM' (GNU /,/# warranty; / {\n        s/^# //\n\ts/^# *$//\n        s/\\((C)\\)[ 0-9,-]*\\( [1-9][0-9]*\\)/\\1\\2/\n        p\n     }' < \"$progpath\"\n     exit $?\n}\n\n# func_usage\n# Echo short help message to standard output and exit.\nfunc_usage ()\n{\n    $opt_debug\n\n    $SED -n '/^# Usage:/,/^#  *.*--help/ {\n        s/^# //\n\ts/^# *$//\n\ts/\\$progname/'$progname'/\n\tp\n    }' < \"$progpath\"\n    echo\n    $ECHO \"run \\`$progname --help | more' for full usage\"\n    exit $?\n}\n\n# func_help [NOEXIT]\n# Echo long help message to standard output and exit,\n# unless 'noexit' is passed as argument.\nfunc_help ()\n{\n    $opt_debug\n\n    $SED -n '/^# Usage:/,/# Report bugs to/ {\n\t:print\n        s/^# //\n\ts/^# *$//\n\ts*\\$progname*'$progname'*\n\ts*\\$host*'\"$host\"'*\n\ts*\\$SHELL*'\"$SHELL\"'*\n\ts*\\$LTCC*'\"$LTCC\"'*\n\ts*\\$LTCFLAGS*'\"$LTCFLAGS\"'*\n\ts*\\$LD*'\"$LD\"'*\n\ts/\\$with_gnu_ld/'\"$with_gnu_ld\"'/\n\ts/\\$automake_version/'\"`(${AUTOMAKE-automake} --version) 2>/dev/null |$SED 1q`\"'/\n\ts/\\$autoconf_version/'\"`(${AUTOCONF-autoconf} --version) 2>/dev/null |$SED 1q`\"'/\n\tp\n\td\n     }\n     /^# .* home page:/b print\n     /^# General help using/b print\n     ' < \"$progpath\"\n    ret=$?\n    if test -z \"$1\"; then\n      exit $ret\n    fi\n}\n\n# func_missing_arg argname\n# Echo program name prefixed message to standard error and set global\n# exit_cmd.\nfunc_missing_arg ()\n{\n    $opt_debug\n\n    func_error \"missing argument for $1.\"\n    exit_cmd=exit\n}\n\n\n# func_split_short_opt shortopt\n# Set func_split_short_opt_name and func_split_short_opt_arg shell\n# variables after splitting SHORTOPT after the 2nd character.\nfunc_split_short_opt ()\n{\n    my_sed_short_opt='1s/^\\(..\\).*$/\\1/;q'\n    my_sed_short_rest='1s/^..\\(.*\\)$/\\1/;q'\n\n    func_split_short_opt_name=`$ECHO \"$1\" | $SED \"$my_sed_short_opt\"`\n    func_split_short_opt_arg=`$ECHO \"$1\" | $SED \"$my_sed_short_rest\"`\n} # func_split_short_opt may be replaced by extended shell implementation\n\n\n# func_split_long_opt longopt\n# Set func_split_long_opt_name and func_split_long_opt_arg shell\n# variables after splitting LONGOPT at the `=' sign.\nfunc_split_long_opt ()\n{\n    my_sed_long_opt='1s/^\\(--[^=]*\\)=.*/\\1/;q'\n    my_sed_long_arg='1s/^--[^=]*=//'\n\n    func_split_long_opt_name=`$ECHO \"$1\" | $SED \"$my_sed_long_opt\"`\n    func_split_long_opt_arg=`$ECHO \"$1\" | $SED \"$my_sed_long_arg\"`\n} # func_split_long_opt may be replaced by extended shell implementation\n\nexit_cmd=:\n\n\n\n\n\nmagic=\"%%%MAGIC variable%%%\"\nmagic_exe=\"%%%MAGIC EXE variable%%%\"\n\n# Global variables.\nnonopt=\npreserve_args=\nlo2o=\"s/\\\\.lo\\$/.${objext}/\"\no2lo=\"s/\\\\.${objext}\\$/.lo/\"\nextracted_archives=\nextracted_serial=0\n\n# If this variable is set in any of the actions, the command in it\n# will be execed at the end.  This prevents here-documents from being\n# left over by shells.\nexec_cmd=\n\n# func_append var value\n# Append VALUE to the end of shell variable VAR.\nfunc_append ()\n{\n    eval \"${1}=\\$${1}\\${2}\"\n} # func_append may be replaced by extended shell implementation\n\n# func_append_quoted var value\n# Quote VALUE and append to the end of shell variable VAR, separated\n# by a space.\nfunc_append_quoted ()\n{\n    func_quote_for_eval \"${2}\"\n    eval \"${1}=\\$${1}\\\\ \\$func_quote_for_eval_result\"\n} # func_append_quoted may be replaced by extended shell implementation\n\n\n# func_arith arithmetic-term...\nfunc_arith ()\n{\n    func_arith_result=`expr \"${@}\"`\n} # func_arith may be replaced by extended shell implementation\n\n\n# func_len string\n# STRING may not start with a hyphen.\nfunc_len ()\n{\n    func_len_result=`expr \"${1}\" : \".*\" 2>/dev/null || echo $max_cmd_len`\n} # func_len may be replaced by extended shell implementation\n\n\n# func_lo2o object\nfunc_lo2o ()\n{\n    func_lo2o_result=`$ECHO \"${1}\" | $SED \"$lo2o\"`\n} # func_lo2o may be replaced by extended shell implementation\n\n\n# func_xform libobj-or-source\nfunc_xform ()\n{\n    func_xform_result=`$ECHO \"${1}\" | $SED 's/\\.[^.]*$/.lo/'`\n} # func_xform may be replaced by extended shell implementation\n\n\n# func_fatal_configuration arg...\n# Echo program name prefixed message to standard error, followed by\n# a configuration failure hint, and exit.\nfunc_fatal_configuration ()\n{\n    func_error ${1+\"$@\"}\n    func_error \"See the $PACKAGE documentation for more information.\"\n    func_fatal_error \"Fatal configuration error.\"\n}\n\n\n# func_config\n# Display the configuration for all the tags in this script.\nfunc_config ()\n{\n    re_begincf='^# ### BEGIN LIBTOOL'\n    re_endcf='^# ### END LIBTOOL'\n\n    # Default configuration.\n    $SED \"1,/$re_begincf CONFIG/d;/$re_endcf CONFIG/,\\$d\" < \"$progpath\"\n\n    # Now print the configurations for the tags.\n    for tagname in $taglist; do\n      $SED -n \"/$re_begincf TAG CONFIG: $tagname\\$/,/$re_endcf TAG CONFIG: $tagname\\$/p\" < \"$progpath\"\n    done\n\n    exit $?\n}\n\n# func_features\n# Display the features supported by this script.\nfunc_features ()\n{\n    echo \"host: $host\"\n    if test \"$build_libtool_libs\" = yes; then\n      echo \"enable shared libraries\"\n    else\n      echo \"disable shared libraries\"\n    fi\n    if test \"$build_old_libs\" = yes; then\n      echo \"enable static libraries\"\n    else\n      echo \"disable static libraries\"\n    fi\n\n    exit $?\n}\n\n# func_enable_tag tagname\n# Verify that TAGNAME is valid, and either flag an error and exit, or\n# enable the TAGNAME tag.  We also add TAGNAME to the global $taglist\n# variable here.\nfunc_enable_tag ()\n{\n  # Global variable:\n  tagname=\"$1\"\n\n  re_begincf=\"^# ### BEGIN LIBTOOL TAG CONFIG: $tagname\\$\"\n  re_endcf=\"^# ### END LIBTOOL TAG CONFIG: $tagname\\$\"\n  sed_extractcf=\"/$re_begincf/,/$re_endcf/p\"\n\n  # Validate tagname.\n  case $tagname in\n    *[!-_A-Za-z0-9,/]*)\n      func_fatal_error \"invalid tag name: $tagname\"\n      ;;\n  esac\n\n  # Don't test for the \"default\" C tag, as we know it's\n  # there but not specially marked.\n  case $tagname in\n    CC) ;;\n    *)\n      if $GREP \"$re_begincf\" \"$progpath\" >/dev/null 2>&1; then\n\ttaglist=\"$taglist $tagname\"\n\n\t# Evaluate the configuration.  Be careful to quote the path\n\t# and the sed script, to avoid splitting on whitespace, but\n\t# also don't use non-portable quotes within backquotes within\n\t# quotes we have to do it in 2 steps:\n\textractedcf=`$SED -n -e \"$sed_extractcf\" < \"$progpath\"`\n\teval \"$extractedcf\"\n      else\n\tfunc_error \"ignoring unknown tag $tagname\"\n      fi\n      ;;\n  esac\n}\n\n# func_check_version_match\n# Ensure that we are using m4 macros, and libtool script from the same\n# release of libtool.\nfunc_check_version_match ()\n{\n  if test \"$package_revision\" != \"$macro_revision\"; then\n    if test \"$VERSION\" != \"$macro_version\"; then\n      if test -z \"$macro_version\"; then\n        cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the\n$progname: definition of this LT_INIT comes from an older release.\n$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION\n$progname: and run autoconf again.\n_LT_EOF\n      else\n        cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, but the\n$progname: definition of this LT_INIT comes from $PACKAGE $macro_version.\n$progname: You should recreate aclocal.m4 with macros from $PACKAGE $VERSION\n$progname: and run autoconf again.\n_LT_EOF\n      fi\n    else\n      cat >&2 <<_LT_EOF\n$progname: Version mismatch error.  This is $PACKAGE $VERSION, revision $package_revision,\n$progname: but the definition of this LT_INIT comes from revision $macro_revision.\n$progname: You should recreate aclocal.m4 with macros from revision $package_revision\n$progname: of $PACKAGE $VERSION and run autoconf again.\n_LT_EOF\n    fi\n\n    exit $EXIT_MISMATCH\n  fi\n}\n\n\n# Shorthand for --mode=foo, only valid as the first argument\ncase $1 in\nclean|clea|cle|cl)\n  shift; set dummy --mode clean ${1+\"$@\"}; shift\n  ;;\ncompile|compil|compi|comp|com|co|c)\n  shift; set dummy --mode compile ${1+\"$@\"}; shift\n  ;;\nexecute|execut|execu|exec|exe|ex|e)\n  shift; set dummy --mode execute ${1+\"$@\"}; shift\n  ;;\nfinish|finis|fini|fin|fi|f)\n  shift; set dummy --mode finish ${1+\"$@\"}; shift\n  ;;\ninstall|instal|insta|inst|ins|in|i)\n  shift; set dummy --mode install ${1+\"$@\"}; shift\n  ;;\nlink|lin|li|l)\n  shift; set dummy --mode link ${1+\"$@\"}; shift\n  ;;\nuninstall|uninstal|uninsta|uninst|unins|unin|uni|un|u)\n  shift; set dummy --mode uninstall ${1+\"$@\"}; shift\n  ;;\nesac\n\n\n\n# Option defaults:\nopt_debug=:\nopt_dry_run=false\nopt_config=false\nopt_preserve_dup_deps=false\nopt_features=false\nopt_finish=false\nopt_help=false\nopt_help_all=false\nopt_silent=:\nopt_warning=:\nopt_verbose=:\nopt_silent=false\nopt_verbose=false\n\n\n# Parse options once, thoroughly.  This comes as soon as possible in the\n# script to make things like `--version' happen as quickly as we can.\n{\n  # this just eases exit handling\n  while test $# -gt 0; do\n    opt=\"$1\"\n    shift\n    case $opt in\n      --debug|-x)\topt_debug='set -x'\n\t\t\tfunc_echo \"enabling shell trace mode\"\n\t\t\t$opt_debug\n\t\t\t;;\n      --dry-run|--dryrun|-n)\n\t\t\topt_dry_run=:\n\t\t\t;;\n      --config)\n\t\t\topt_config=:\nfunc_config\n\t\t\t;;\n      --dlopen|-dlopen)\n\t\t\toptarg=\"$1\"\n\t\t\topt_dlopen=\"${opt_dlopen+$opt_dlopen\n}$optarg\"\n\t\t\tshift\n\t\t\t;;\n      --preserve-dup-deps)\n\t\t\topt_preserve_dup_deps=:\n\t\t\t;;\n      --features)\n\t\t\topt_features=:\nfunc_features\n\t\t\t;;\n      --finish)\n\t\t\topt_finish=:\nset dummy --mode finish ${1+\"$@\"}; shift\n\t\t\t;;\n      --help)\n\t\t\topt_help=:\n\t\t\t;;\n      --help-all)\n\t\t\topt_help_all=:\nopt_help=': help-all'\n\t\t\t;;\n      --mode)\n\t\t\ttest $# = 0 && func_missing_arg $opt && break\n\t\t\toptarg=\"$1\"\n\t\t\topt_mode=\"$optarg\"\ncase $optarg in\n  # Valid mode arguments:\n  clean|compile|execute|finish|install|link|relink|uninstall) ;;\n\n  # Catch anything else as an error\n  *) func_error \"invalid argument for $opt\"\n     exit_cmd=exit\n     break\n     ;;\nesac\n\t\t\tshift\n\t\t\t;;\n      --no-silent|--no-quiet)\n\t\t\topt_silent=false\nfunc_append preserve_args \" $opt\"\n\t\t\t;;\n      --no-warning|--no-warn)\n\t\t\topt_warning=false\nfunc_append preserve_args \" $opt\"\n\t\t\t;;\n      --no-verbose)\n\t\t\topt_verbose=false\nfunc_append preserve_args \" $opt\"\n\t\t\t;;\n      --silent|--quiet)\n\t\t\topt_silent=:\nfunc_append preserve_args \" $opt\"\n        opt_verbose=false\n\t\t\t;;\n      --verbose|-v)\n\t\t\topt_verbose=:\nfunc_append preserve_args \" $opt\"\nopt_silent=false\n\t\t\t;;\n      --tag)\n\t\t\ttest $# = 0 && func_missing_arg $opt && break\n\t\t\toptarg=\"$1\"\n\t\t\topt_tag=\"$optarg\"\nfunc_append preserve_args \" $opt $optarg\"\nfunc_enable_tag \"$optarg\"\n\t\t\tshift\n\t\t\t;;\n\n      -\\?|-h)\t\tfunc_usage\t\t\t\t;;\n      --help)\t\tfunc_help\t\t\t\t;;\n      --version)\tfunc_version\t\t\t\t;;\n\n      # Separate optargs to long options:\n      --*=*)\n\t\t\tfunc_split_long_opt \"$opt\"\n\t\t\tset dummy \"$func_split_long_opt_name\" \"$func_split_long_opt_arg\" ${1+\"$@\"}\n\t\t\tshift\n\t\t\t;;\n\n      # Separate non-argument short options:\n      -\\?*|-h*|-n*|-v*)\n\t\t\tfunc_split_short_opt \"$opt\"\n\t\t\tset dummy \"$func_split_short_opt_name\" \"-$func_split_short_opt_arg\" ${1+\"$@\"}\n\t\t\tshift\n\t\t\t;;\n\n      --)\t\tbreak\t\t\t\t\t;;\n      -*)\t\tfunc_fatal_help \"unrecognized option \\`$opt'\" ;;\n      *)\t\tset dummy \"$opt\" ${1+\"$@\"};\tshift; break  ;;\n    esac\n  done\n\n  # Validate options:\n\n  # save first non-option argument\n  if test \"$#\" -gt 0; then\n    nonopt=\"$opt\"\n    shift\n  fi\n\n  # preserve --debug\n  test \"$opt_debug\" = : || func_append preserve_args \" --debug\"\n\n  case $host in\n    *cygwin* | *mingw* | *pw32* | *cegcc*)\n      # don't eliminate duplications in $postdeps and $predeps\n      opt_duplicate_compiler_generated_deps=:\n      ;;\n    *)\n      opt_duplicate_compiler_generated_deps=$opt_preserve_dup_deps\n      ;;\n  esac\n\n  $opt_help || {\n    # Sanity checks first:\n    func_check_version_match\n\n    if test \"$build_libtool_libs\" != yes && test \"$build_old_libs\" != yes; then\n      func_fatal_configuration \"not configured to build any kind of library\"\n    fi\n\n    # Darwin sucks\n    eval std_shrext=\\\"$shrext_cmds\\\"\n\n    # Only execute mode is allowed to have -dlopen flags.\n    if test -n \"$opt_dlopen\" && test \"$opt_mode\" != execute; then\n      func_error \"unrecognized option \\`-dlopen'\"\n      $ECHO \"$help\" 1>&2\n      exit $EXIT_FAILURE\n    fi\n\n    # Change the help message to a mode-specific one.\n    generic_help=\"$help\"\n    help=\"Try \\`$progname --help --mode=$opt_mode' for more information.\"\n  }\n\n\n  # Bail if the options were screwed\n  $exit_cmd $EXIT_FAILURE\n}\n\n\n\n\n## ----------- ##\n##    Main.    ##\n## ----------- ##\n\n# func_lalib_p file\n# True iff FILE is a libtool `.la' library or `.lo' object file.\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_lalib_p ()\n{\n    test -f \"$1\" &&\n      $SED -e 4q \"$1\" 2>/dev/null \\\n        | $GREP \"^# Generated by .*$PACKAGE\" > /dev/null 2>&1\n}\n\n# func_lalib_unsafe_p file\n# True iff FILE is a libtool `.la' library or `.lo' object file.\n# This function implements the same check as func_lalib_p without\n# resorting to external programs.  To this end, it redirects stdin and\n# closes it afterwards, without saving the original file descriptor.\n# As a safety measure, use it only where a negative result would be\n# fatal anyway.  Works if `file' does not exist.\nfunc_lalib_unsafe_p ()\n{\n    lalib_p=no\n    if test -f \"$1\" && test -r \"$1\" && exec 5<&0 <\"$1\"; then\n\tfor lalib_p_l in 1 2 3 4\n\tdo\n\t    read lalib_p_line\n\t    case \"$lalib_p_line\" in\n\t\t\\#\\ Generated\\ by\\ *$PACKAGE* ) lalib_p=yes; break;;\n\t    esac\n\tdone\n\texec 0<&5 5<&-\n    fi\n    test \"$lalib_p\" = yes\n}\n\n# func_ltwrapper_script_p file\n# True iff FILE is a libtool wrapper script\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_script_p ()\n{\n    func_lalib_p \"$1\"\n}\n\n# func_ltwrapper_executable_p file\n# True iff FILE is a libtool wrapper executable\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_executable_p ()\n{\n    func_ltwrapper_exec_suffix=\n    case $1 in\n    *.exe) ;;\n    *) func_ltwrapper_exec_suffix=.exe ;;\n    esac\n    $GREP \"$magic_exe\" \"$1$func_ltwrapper_exec_suffix\" >/dev/null 2>&1\n}\n\n# func_ltwrapper_scriptname file\n# Assumes file is an ltwrapper_executable\n# uses $file to determine the appropriate filename for a\n# temporary ltwrapper_script.\nfunc_ltwrapper_scriptname ()\n{\n    func_dirname_and_basename \"$1\" \"\" \".\"\n    func_stripname '' '.exe' \"$func_basename_result\"\n    func_ltwrapper_scriptname_result=\"$func_dirname_result/$objdir/${func_stripname_result}_ltshwrapper\"\n}\n\n# func_ltwrapper_p file\n# True iff FILE is a libtool wrapper script or wrapper executable\n# This function is only a basic sanity check; it will hardly flush out\n# determined imposters.\nfunc_ltwrapper_p ()\n{\n    func_ltwrapper_script_p \"$1\" || func_ltwrapper_executable_p \"$1\"\n}\n\n\n# func_execute_cmds commands fail_cmd\n# Execute tilde-delimited COMMANDS.\n# If FAIL_CMD is given, eval that upon failure.\n# FAIL_CMD may read-access the current command in variable CMD!\nfunc_execute_cmds ()\n{\n    $opt_debug\n    save_ifs=$IFS; IFS='~'\n    for cmd in $1; do\n      IFS=$save_ifs\n      eval cmd=\\\"$cmd\\\"\n      func_show_eval \"$cmd\" \"${2-:}\"\n    done\n    IFS=$save_ifs\n}\n\n\n# func_source file\n# Source FILE, adding directory component if necessary.\n# Note that it is not necessary on cygwin/mingw to append a dot to\n# FILE even if both FILE and FILE.exe exist: automatic-append-.exe\n# behavior happens only for exec(3), not for open(2)!  Also, sourcing\n# `FILE.' does not work on cygwin managed mounts.\nfunc_source ()\n{\n    $opt_debug\n    case $1 in\n    */* | *\\\\*)\t. \"$1\" ;;\n    *)\t\t. \"./$1\" ;;\n    esac\n}\n\n\n# func_resolve_sysroot PATH\n# Replace a leading = in PATH with a sysroot.  Store the result into\n# func_resolve_sysroot_result\nfunc_resolve_sysroot ()\n{\n  func_resolve_sysroot_result=$1\n  case $func_resolve_sysroot_result in\n  =*)\n    func_stripname '=' '' \"$func_resolve_sysroot_result\"\n    func_resolve_sysroot_result=$lt_sysroot$func_stripname_result\n    ;;\n  esac\n}\n\n# func_replace_sysroot PATH\n# If PATH begins with the sysroot, replace it with = and\n# store the result into func_replace_sysroot_result.\nfunc_replace_sysroot ()\n{\n  case \"$lt_sysroot:$1\" in\n  ?*:\"$lt_sysroot\"*)\n    func_stripname \"$lt_sysroot\" '' \"$1\"\n    func_replace_sysroot_result=\"=$func_stripname_result\"\n    ;;\n  *)\n    # Including no sysroot.\n    func_replace_sysroot_result=$1\n    ;;\n  esac\n}\n\n# func_infer_tag arg\n# Infer tagged configuration to use if any are available and\n# if one wasn't chosen via the \"--tag\" command line option.\n# Only attempt this if the compiler in the base compile\n# command doesn't match the default compiler.\n# arg is usually of the form 'gcc ...'\nfunc_infer_tag ()\n{\n    $opt_debug\n    if test -n \"$available_tags\" && test -z \"$tagname\"; then\n      CC_quoted=\n      for arg in $CC; do\n\tfunc_append_quoted CC_quoted \"$arg\"\n      done\n      CC_expanded=`func_echo_all $CC`\n      CC_quoted_expanded=`func_echo_all $CC_quoted`\n      case $@ in\n      # Blanks in the command may have been stripped by the calling shell,\n      # but not from the CC environment variable when configure was run.\n      \" $CC \"* | \"$CC \"* | \" $CC_expanded \"* | \"$CC_expanded \"* | \\\n      \" $CC_quoted\"* | \"$CC_quoted \"* | \" $CC_quoted_expanded \"* | \"$CC_quoted_expanded \"*) ;;\n      # Blanks at the start of $base_compile will cause this to fail\n      # if we don't check for them as well.\n      *)\n\tfor z in $available_tags; do\n\t  if $GREP \"^# ### BEGIN LIBTOOL TAG CONFIG: $z$\" < \"$progpath\" > /dev/null; then\n\t    # Evaluate the configuration.\n\t    eval \"`${SED} -n -e '/^# ### BEGIN LIBTOOL TAG CONFIG: '$z'$/,/^# ### END LIBTOOL TAG CONFIG: '$z'$/p' < $progpath`\"\n\t    CC_quoted=\n\t    for arg in $CC; do\n\t      # Double-quote args containing other shell metacharacters.\n\t      func_append_quoted CC_quoted \"$arg\"\n\t    done\n\t    CC_expanded=`func_echo_all $CC`\n\t    CC_quoted_expanded=`func_echo_all $CC_quoted`\n\t    case \"$@ \" in\n\t    \" $CC \"* | \"$CC \"* | \" $CC_expanded \"* | \"$CC_expanded \"* | \\\n\t    \" $CC_quoted\"* | \"$CC_quoted \"* | \" $CC_quoted_expanded \"* | \"$CC_quoted_expanded \"*)\n\t      # The compiler in the base compile command matches\n\t      # the one in the tagged configuration.\n\t      # Assume this is the tagged configuration we want.\n\t      tagname=$z\n\t      break\n\t      ;;\n\t    esac\n\t  fi\n\tdone\n\t# If $tagname still isn't set, then no tagged configuration\n\t# was found and let the user know that the \"--tag\" command\n\t# line option must be used.\n\tif test -z \"$tagname\"; then\n\t  func_echo \"unable to infer tagged configuration\"\n\t  func_fatal_error \"specify a tag with \\`--tag'\"\n#\telse\n#\t  func_verbose \"using $tagname tagged configuration\"\n\tfi\n\t;;\n      esac\n    fi\n}\n\n\n\n# func_write_libtool_object output_name pic_name nonpic_name\n# Create a libtool object file (analogous to a \".la\" file),\n# but don't create it if we're doing a dry run.\nfunc_write_libtool_object ()\n{\n    write_libobj=${1}\n    if test \"$build_libtool_libs\" = yes; then\n      write_lobj=\\'${2}\\'\n    else\n      write_lobj=none\n    fi\n\n    if test \"$build_old_libs\" = yes; then\n      write_oldobj=\\'${3}\\'\n    else\n      write_oldobj=none\n    fi\n\n    $opt_dry_run || {\n      cat >${write_libobj}T <<EOF\n# $write_libobj - a libtool object file\n# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n#\n# Please DO NOT delete this file!\n# It is necessary for linking the library.\n\n# Name of the PIC object.\npic_object=$write_lobj\n\n# Name of the non-PIC object\nnon_pic_object=$write_oldobj\n\nEOF\n      $MV \"${write_libobj}T\" \"${write_libobj}\"\n    }\n}\n\n\n##################################################\n# FILE NAME AND PATH CONVERSION HELPER FUNCTIONS #\n##################################################\n\n# func_convert_core_file_wine_to_w32 ARG\n# Helper function used by file name conversion functions when $build is *nix,\n# and $host is mingw, cygwin, or some other w32 environment. Relies on a\n# correctly configured wine environment available, with the winepath program\n# in $build's $PATH.\n#\n# ARG is the $build file name to be converted to w32 format.\n# Result is available in $func_convert_core_file_wine_to_w32_result, and will\n# be empty on error (or when ARG is empty)\nfunc_convert_core_file_wine_to_w32 ()\n{\n  $opt_debug\n  func_convert_core_file_wine_to_w32_result=\"$1\"\n  if test -n \"$1\"; then\n    # Unfortunately, winepath does not exit with a non-zero error code, so we\n    # are forced to check the contents of stdout. On the other hand, if the\n    # command is not found, the shell will set an exit code of 127 and print\n    # *an error message* to stdout. So we must check for both error code of\n    # zero AND non-empty stdout, which explains the odd construction:\n    func_convert_core_file_wine_to_w32_tmp=`winepath -w \"$1\" 2>/dev/null`\n    if test \"$?\" -eq 0 && test -n \"${func_convert_core_file_wine_to_w32_tmp}\"; then\n      func_convert_core_file_wine_to_w32_result=`$ECHO \"$func_convert_core_file_wine_to_w32_tmp\" |\n        $SED -e \"$lt_sed_naive_backslashify\"`\n    else\n      func_convert_core_file_wine_to_w32_result=\n    fi\n  fi\n}\n# end: func_convert_core_file_wine_to_w32\n\n\n# func_convert_core_path_wine_to_w32 ARG\n# Helper function used by path conversion functions when $build is *nix, and\n# $host is mingw, cygwin, or some other w32 environment. Relies on a correctly\n# configured wine environment available, with the winepath program in $build's\n# $PATH. Assumes ARG has no leading or trailing path separator characters.\n#\n# ARG is path to be converted from $build format to win32.\n# Result is available in $func_convert_core_path_wine_to_w32_result.\n# Unconvertible file (directory) names in ARG are skipped; if no directory names\n# are convertible, then the result may be empty.\nfunc_convert_core_path_wine_to_w32 ()\n{\n  $opt_debug\n  # unfortunately, winepath doesn't convert paths, only file names\n  func_convert_core_path_wine_to_w32_result=\"\"\n  if test -n \"$1\"; then\n    oldIFS=$IFS\n    IFS=:\n    for func_convert_core_path_wine_to_w32_f in $1; do\n      IFS=$oldIFS\n      func_convert_core_file_wine_to_w32 \"$func_convert_core_path_wine_to_w32_f\"\n      if test -n \"$func_convert_core_file_wine_to_w32_result\" ; then\n        if test -z \"$func_convert_core_path_wine_to_w32_result\"; then\n          func_convert_core_path_wine_to_w32_result=\"$func_convert_core_file_wine_to_w32_result\"\n        else\n          func_append func_convert_core_path_wine_to_w32_result \";$func_convert_core_file_wine_to_w32_result\"\n        fi\n      fi\n    done\n    IFS=$oldIFS\n  fi\n}\n# end: func_convert_core_path_wine_to_w32\n\n\n# func_cygpath ARGS...\n# Wrapper around calling the cygpath program via LT_CYGPATH. This is used when\n# when (1) $build is *nix and Cygwin is hosted via a wine environment; or (2)\n# $build is MSYS and $host is Cygwin, or (3) $build is Cygwin. In case (1) or\n# (2), returns the Cygwin file name or path in func_cygpath_result (input\n# file name or path is assumed to be in w32 format, as previously converted\n# from $build's *nix or MSYS format). In case (3), returns the w32 file name\n# or path in func_cygpath_result (input file name or path is assumed to be in\n# Cygwin format). Returns an empty string on error.\n#\n# ARGS are passed to cygpath, with the last one being the file name or path to\n# be converted.\n#\n# Specify the absolute *nix (or w32) name to cygpath in the LT_CYGPATH\n# environment variable; do not put it in $PATH.\nfunc_cygpath ()\n{\n  $opt_debug\n  if test -n \"$LT_CYGPATH\" && test -f \"$LT_CYGPATH\"; then\n    func_cygpath_result=`$LT_CYGPATH \"$@\" 2>/dev/null`\n    if test \"$?\" -ne 0; then\n      # on failure, ensure result is empty\n      func_cygpath_result=\n    fi\n  else\n    func_cygpath_result=\n    func_error \"LT_CYGPATH is empty or specifies non-existent file: \\`$LT_CYGPATH'\"\n  fi\n}\n#end: func_cygpath\n\n\n# func_convert_core_msys_to_w32 ARG\n# Convert file name or path ARG from MSYS format to w32 format.  Return\n# result in func_convert_core_msys_to_w32_result.\nfunc_convert_core_msys_to_w32 ()\n{\n  $opt_debug\n  # awkward: cmd appends spaces to result\n  func_convert_core_msys_to_w32_result=`( cmd //c echo \"$1\" ) 2>/dev/null |\n    $SED -e 's/[ ]*$//' -e \"$lt_sed_naive_backslashify\"`\n}\n#end: func_convert_core_msys_to_w32\n\n\n# func_convert_file_check ARG1 ARG2\n# Verify that ARG1 (a file name in $build format) was converted to $host\n# format in ARG2. Otherwise, emit an error message, but continue (resetting\n# func_to_host_file_result to ARG1).\nfunc_convert_file_check ()\n{\n  $opt_debug\n  if test -z \"$2\" && test -n \"$1\" ; then\n    func_error \"Could not determine host file name corresponding to\"\n    func_error \"  \\`$1'\"\n    func_error \"Continuing, but uninstalled executables may not work.\"\n    # Fallback:\n    func_to_host_file_result=\"$1\"\n  fi\n}\n# end func_convert_file_check\n\n\n# func_convert_path_check FROM_PATHSEP TO_PATHSEP FROM_PATH TO_PATH\n# Verify that FROM_PATH (a path in $build format) was converted to $host\n# format in TO_PATH. Otherwise, emit an error message, but continue, resetting\n# func_to_host_file_result to a simplistic fallback value (see below).\nfunc_convert_path_check ()\n{\n  $opt_debug\n  if test -z \"$4\" && test -n \"$3\"; then\n    func_error \"Could not determine the host path corresponding to\"\n    func_error \"  \\`$3'\"\n    func_error \"Continuing, but uninstalled executables may not work.\"\n    # Fallback.  This is a deliberately simplistic \"conversion\" and\n    # should not be \"improved\".  See libtool.info.\n    if test \"x$1\" != \"x$2\"; then\n      lt_replace_pathsep_chars=\"s|$1|$2|g\"\n      func_to_host_path_result=`echo \"$3\" |\n        $SED -e \"$lt_replace_pathsep_chars\"`\n    else\n      func_to_host_path_result=\"$3\"\n    fi\n  fi\n}\n# end func_convert_path_check\n\n\n# func_convert_path_front_back_pathsep FRONTPAT BACKPAT REPL ORIG\n# Modifies func_to_host_path_result by prepending REPL if ORIG matches FRONTPAT\n# and appending REPL if ORIG matches BACKPAT.\nfunc_convert_path_front_back_pathsep ()\n{\n  $opt_debug\n  case $4 in\n  $1 ) func_to_host_path_result=\"$3$func_to_host_path_result\"\n    ;;\n  esac\n  case $4 in\n  $2 ) func_append func_to_host_path_result \"$3\"\n    ;;\n  esac\n}\n# end func_convert_path_front_back_pathsep\n\n\n##################################################\n# $build to $host FILE NAME CONVERSION FUNCTIONS #\n##################################################\n# invoked via `$to_host_file_cmd ARG'\n#\n# In each case, ARG is the path to be converted from $build to $host format.\n# Result will be available in $func_to_host_file_result.\n\n\n# func_to_host_file ARG\n# Converts the file name ARG from $build format to $host format. Return result\n# in func_to_host_file_result.\nfunc_to_host_file ()\n{\n  $opt_debug\n  $to_host_file_cmd \"$1\"\n}\n# end func_to_host_file\n\n\n# func_to_tool_file ARG LAZY\n# converts the file name ARG from $build format to toolchain format. Return\n# result in func_to_tool_file_result.  If the conversion in use is listed\n# in (the comma separated) LAZY, no conversion takes place.\nfunc_to_tool_file ()\n{\n  $opt_debug\n  case ,$2, in\n    *,\"$to_tool_file_cmd\",*)\n      func_to_tool_file_result=$1\n      ;;\n    *)\n      $to_tool_file_cmd \"$1\"\n      func_to_tool_file_result=$func_to_host_file_result\n      ;;\n  esac\n}\n# end func_to_tool_file\n\n\n# func_convert_file_noop ARG\n# Copy ARG to func_to_host_file_result.\nfunc_convert_file_noop ()\n{\n  func_to_host_file_result=\"$1\"\n}\n# end func_convert_file_noop\n\n\n# func_convert_file_msys_to_w32 ARG\n# Convert file name ARG from (mingw) MSYS to (mingw) w32 format; automatic\n# conversion to w32 is not available inside the cwrapper.  Returns result in\n# func_to_host_file_result.\nfunc_convert_file_msys_to_w32 ()\n{\n  $opt_debug\n  func_to_host_file_result=\"$1\"\n  if test -n \"$1\"; then\n    func_convert_core_msys_to_w32 \"$1\"\n    func_to_host_file_result=\"$func_convert_core_msys_to_w32_result\"\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_msys_to_w32\n\n\n# func_convert_file_cygwin_to_w32 ARG\n# Convert file name ARG from Cygwin to w32 format.  Returns result in\n# func_to_host_file_result.\nfunc_convert_file_cygwin_to_w32 ()\n{\n  $opt_debug\n  func_to_host_file_result=\"$1\"\n  if test -n \"$1\"; then\n    # because $build is cygwin, we call \"the\" cygpath in $PATH; no need to use\n    # LT_CYGPATH in this case.\n    func_to_host_file_result=`cygpath -m \"$1\"`\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_cygwin_to_w32\n\n\n# func_convert_file_nix_to_w32 ARG\n# Convert file name ARG from *nix to w32 format.  Requires a wine environment\n# and a working winepath. Returns result in func_to_host_file_result.\nfunc_convert_file_nix_to_w32 ()\n{\n  $opt_debug\n  func_to_host_file_result=\"$1\"\n  if test -n \"$1\"; then\n    func_convert_core_file_wine_to_w32 \"$1\"\n    func_to_host_file_result=\"$func_convert_core_file_wine_to_w32_result\"\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_nix_to_w32\n\n\n# func_convert_file_msys_to_cygwin ARG\n# Convert file name ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.\n# Returns result in func_to_host_file_result.\nfunc_convert_file_msys_to_cygwin ()\n{\n  $opt_debug\n  func_to_host_file_result=\"$1\"\n  if test -n \"$1\"; then\n    func_convert_core_msys_to_w32 \"$1\"\n    func_cygpath -u \"$func_convert_core_msys_to_w32_result\"\n    func_to_host_file_result=\"$func_cygpath_result\"\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_msys_to_cygwin\n\n\n# func_convert_file_nix_to_cygwin ARG\n# Convert file name ARG from *nix to Cygwin format.  Requires Cygwin installed\n# in a wine environment, working winepath, and LT_CYGPATH set.  Returns result\n# in func_to_host_file_result.\nfunc_convert_file_nix_to_cygwin ()\n{\n  $opt_debug\n  func_to_host_file_result=\"$1\"\n  if test -n \"$1\"; then\n    # convert from *nix to w32, then use cygpath to convert from w32 to cygwin.\n    func_convert_core_file_wine_to_w32 \"$1\"\n    func_cygpath -u \"$func_convert_core_file_wine_to_w32_result\"\n    func_to_host_file_result=\"$func_cygpath_result\"\n  fi\n  func_convert_file_check \"$1\" \"$func_to_host_file_result\"\n}\n# end func_convert_file_nix_to_cygwin\n\n\n#############################################\n# $build to $host PATH CONVERSION FUNCTIONS #\n#############################################\n# invoked via `$to_host_path_cmd ARG'\n#\n# In each case, ARG is the path to be converted from $build to $host format.\n# The result will be available in $func_to_host_path_result.\n#\n# Path separators are also converted from $build format to $host format.  If\n# ARG begins or ends with a path separator character, it is preserved (but\n# converted to $host format) on output.\n#\n# All path conversion functions are named using the following convention:\n#   file name conversion function    : func_convert_file_X_to_Y ()\n#   path conversion function         : func_convert_path_X_to_Y ()\n# where, for any given $build/$host combination the 'X_to_Y' value is the\n# same.  If conversion functions are added for new $build/$host combinations,\n# the two new functions must follow this pattern, or func_init_to_host_path_cmd\n# will break.\n\n\n# func_init_to_host_path_cmd\n# Ensures that function \"pointer\" variable $to_host_path_cmd is set to the\n# appropriate value, based on the value of $to_host_file_cmd.\nto_host_path_cmd=\nfunc_init_to_host_path_cmd ()\n{\n  $opt_debug\n  if test -z \"$to_host_path_cmd\"; then\n    func_stripname 'func_convert_file_' '' \"$to_host_file_cmd\"\n    to_host_path_cmd=\"func_convert_path_${func_stripname_result}\"\n  fi\n}\n\n\n# func_to_host_path ARG\n# Converts the path ARG from $build format to $host format. Return result\n# in func_to_host_path_result.\nfunc_to_host_path ()\n{\n  $opt_debug\n  func_init_to_host_path_cmd\n  $to_host_path_cmd \"$1\"\n}\n# end func_to_host_path\n\n\n# func_convert_path_noop ARG\n# Copy ARG to func_to_host_path_result.\nfunc_convert_path_noop ()\n{\n  func_to_host_path_result=\"$1\"\n}\n# end func_convert_path_noop\n\n\n# func_convert_path_msys_to_w32 ARG\n# Convert path ARG from (mingw) MSYS to (mingw) w32 format; automatic\n# conversion to w32 is not available inside the cwrapper.  Returns result in\n# func_to_host_path_result.\nfunc_convert_path_msys_to_w32 ()\n{\n  $opt_debug\n  func_to_host_path_result=\"$1\"\n  if test -n \"$1\"; then\n    # Remove leading and trailing path separator characters from ARG.  MSYS\n    # behavior is inconsistent here; cygpath turns them into '.;' and ';.';\n    # and winepath ignores them completely.\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_convert_core_msys_to_w32 \"$func_to_host_path_tmp1\"\n    func_to_host_path_result=\"$func_convert_core_msys_to_w32_result\"\n    func_convert_path_check : \";\" \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" \";\" \"$1\"\n  fi\n}\n# end func_convert_path_msys_to_w32\n\n\n# func_convert_path_cygwin_to_w32 ARG\n# Convert path ARG from Cygwin to w32 format.  Returns result in\n# func_to_host_file_result.\nfunc_convert_path_cygwin_to_w32 ()\n{\n  $opt_debug\n  func_to_host_path_result=\"$1\"\n  if test -n \"$1\"; then\n    # See func_convert_path_msys_to_w32:\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_to_host_path_result=`cygpath -m -p \"$func_to_host_path_tmp1\"`\n    func_convert_path_check : \";\" \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" \";\" \"$1\"\n  fi\n}\n# end func_convert_path_cygwin_to_w32\n\n\n# func_convert_path_nix_to_w32 ARG\n# Convert path ARG from *nix to w32 format.  Requires a wine environment and\n# a working winepath.  Returns result in func_to_host_file_result.\nfunc_convert_path_nix_to_w32 ()\n{\n  $opt_debug\n  func_to_host_path_result=\"$1\"\n  if test -n \"$1\"; then\n    # See func_convert_path_msys_to_w32:\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_convert_core_path_wine_to_w32 \"$func_to_host_path_tmp1\"\n    func_to_host_path_result=\"$func_convert_core_path_wine_to_w32_result\"\n    func_convert_path_check : \";\" \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" \";\" \"$1\"\n  fi\n}\n# end func_convert_path_nix_to_w32\n\n\n# func_convert_path_msys_to_cygwin ARG\n# Convert path ARG from MSYS to Cygwin format.  Requires LT_CYGPATH set.\n# Returns result in func_to_host_file_result.\nfunc_convert_path_msys_to_cygwin ()\n{\n  $opt_debug\n  func_to_host_path_result=\"$1\"\n  if test -n \"$1\"; then\n    # See func_convert_path_msys_to_w32:\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_convert_core_msys_to_w32 \"$func_to_host_path_tmp1\"\n    func_cygpath -u -p \"$func_convert_core_msys_to_w32_result\"\n    func_to_host_path_result=\"$func_cygpath_result\"\n    func_convert_path_check : : \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" : \"$1\"\n  fi\n}\n# end func_convert_path_msys_to_cygwin\n\n\n# func_convert_path_nix_to_cygwin ARG\n# Convert path ARG from *nix to Cygwin format.  Requires Cygwin installed in a\n# a wine environment, working winepath, and LT_CYGPATH set.  Returns result in\n# func_to_host_file_result.\nfunc_convert_path_nix_to_cygwin ()\n{\n  $opt_debug\n  func_to_host_path_result=\"$1\"\n  if test -n \"$1\"; then\n    # Remove leading and trailing path separator characters from\n    # ARG. msys behavior is inconsistent here, cygpath turns them\n    # into '.;' and ';.', and winepath ignores them completely.\n    func_stripname : : \"$1\"\n    func_to_host_path_tmp1=$func_stripname_result\n    func_convert_core_path_wine_to_w32 \"$func_to_host_path_tmp1\"\n    func_cygpath -u -p \"$func_convert_core_path_wine_to_w32_result\"\n    func_to_host_path_result=\"$func_cygpath_result\"\n    func_convert_path_check : : \\\n      \"$func_to_host_path_tmp1\" \"$func_to_host_path_result\"\n    func_convert_path_front_back_pathsep \":*\" \"*:\" : \"$1\"\n  fi\n}\n# end func_convert_path_nix_to_cygwin\n\n\n# func_mode_compile arg...\nfunc_mode_compile ()\n{\n    $opt_debug\n    # Get the compilation command and the source file.\n    base_compile=\n    srcfile=\"$nonopt\"  #  always keep a non-empty value in \"srcfile\"\n    suppress_opt=yes\n    suppress_output=\n    arg_mode=normal\n    libobj=\n    later=\n    pie_flag=\n\n    for arg\n    do\n      case $arg_mode in\n      arg  )\n\t# do not \"continue\".  Instead, add this to base_compile\n\tlastarg=\"$arg\"\n\targ_mode=normal\n\t;;\n\n      target )\n\tlibobj=\"$arg\"\n\targ_mode=normal\n\tcontinue\n\t;;\n\n      normal )\n\t# Accept any command-line options.\n\tcase $arg in\n\t-o)\n\t  test -n \"$libobj\" && \\\n\t    func_fatal_error \"you cannot specify \\`-o' more than once\"\n\t  arg_mode=target\n\t  continue\n\t  ;;\n\n\t-pie | -fpie | -fPIE)\n          func_append pie_flag \" $arg\"\n\t  continue\n\t  ;;\n\n\t-shared | -static | -prefer-pic | -prefer-non-pic)\n\t  func_append later \" $arg\"\n\t  continue\n\t  ;;\n\n\t-no-suppress)\n\t  suppress_opt=no\n\t  continue\n\t  ;;\n\n\t-Xcompiler)\n\t  arg_mode=arg  #  the next one goes into the \"base_compile\" arg list\n\t  continue      #  The current \"srcfile\" will either be retained or\n\t  ;;            #  replaced later.  I would guess that would be a bug.\n\n\t-Wc,*)\n\t  func_stripname '-Wc,' '' \"$arg\"\n\t  args=$func_stripname_result\n\t  lastarg=\n\t  save_ifs=\"$IFS\"; IFS=','\n\t  for arg in $args; do\n\t    IFS=\"$save_ifs\"\n\t    func_append_quoted lastarg \"$arg\"\n\t  done\n\t  IFS=\"$save_ifs\"\n\t  func_stripname ' ' '' \"$lastarg\"\n\t  lastarg=$func_stripname_result\n\n\t  # Add the arguments to base_compile.\n\t  func_append base_compile \" $lastarg\"\n\t  continue\n\t  ;;\n\n\t*)\n\t  # Accept the current argument as the source file.\n\t  # The previous \"srcfile\" becomes the current argument.\n\t  #\n\t  lastarg=\"$srcfile\"\n\t  srcfile=\"$arg\"\n\t  ;;\n\tesac  #  case $arg\n\t;;\n      esac    #  case $arg_mode\n\n      # Aesthetically quote the previous argument.\n      func_append_quoted base_compile \"$lastarg\"\n    done # for arg\n\n    case $arg_mode in\n    arg)\n      func_fatal_error \"you must specify an argument for -Xcompile\"\n      ;;\n    target)\n      func_fatal_error \"you must specify a target with \\`-o'\"\n      ;;\n    *)\n      # Get the name of the library object.\n      test -z \"$libobj\" && {\n\tfunc_basename \"$srcfile\"\n\tlibobj=\"$func_basename_result\"\n      }\n      ;;\n    esac\n\n    # Recognize several different file suffixes.\n    # If the user specifies -o file.o, it is replaced with file.lo\n    case $libobj in\n    *.[cCFSifmso] | \\\n    *.ada | *.adb | *.ads | *.asm | \\\n    *.c++ | *.cc | *.ii | *.class | *.cpp | *.cxx | \\\n    *.[fF][09]? | *.for | *.java | *.go | *.obj | *.sx | *.cu | *.cup)\n      func_xform \"$libobj\"\n      libobj=$func_xform_result\n      ;;\n    esac\n\n    case $libobj in\n    *.lo) func_lo2o \"$libobj\"; obj=$func_lo2o_result ;;\n    *)\n      func_fatal_error \"cannot determine name of library object from \\`$libobj'\"\n      ;;\n    esac\n\n    func_infer_tag $base_compile\n\n    for arg in $later; do\n      case $arg in\n      -shared)\n\ttest \"$build_libtool_libs\" != yes && \\\n\t  func_fatal_configuration \"can not build a shared library\"\n\tbuild_old_libs=no\n\tcontinue\n\t;;\n\n      -static)\n\tbuild_libtool_libs=no\n\tbuild_old_libs=yes\n\tcontinue\n\t;;\n\n      -prefer-pic)\n\tpic_mode=yes\n\tcontinue\n\t;;\n\n      -prefer-non-pic)\n\tpic_mode=no\n\tcontinue\n\t;;\n      esac\n    done\n\n    func_quote_for_eval \"$libobj\"\n    test \"X$libobj\" != \"X$func_quote_for_eval_result\" \\\n      && $ECHO \"X$libobj\" | $GREP '[]~#^*{};<>?\"'\"'\"'\t &()|`$[]' \\\n      && func_warning \"libobj name \\`$libobj' may not contain shell special characters.\"\n    func_dirname_and_basename \"$obj\" \"/\" \"\"\n    objname=\"$func_basename_result\"\n    xdir=\"$func_dirname_result\"\n    lobj=${xdir}$objdir/$objname\n\n    test -z \"$base_compile\" && \\\n      func_fatal_help \"you must specify a compilation command\"\n\n    # Delete any leftover library objects.\n    if test \"$build_old_libs\" = yes; then\n      removelist=\"$obj $lobj $libobj ${libobj}T\"\n    else\n      removelist=\"$lobj $libobj ${libobj}T\"\n    fi\n\n    # On Cygwin there's no \"real\" PIC flag so we must build both object types\n    case $host_os in\n    cygwin* | mingw* | pw32* | os2* | cegcc*)\n      pic_mode=default\n      ;;\n    esac\n    if test \"$pic_mode\" = no && test \"$deplibs_check_method\" != pass_all; then\n      # non-PIC code in shared libraries is not supported\n      pic_mode=default\n    fi\n\n    # Calculate the filename of the output object if compiler does\n    # not support -o with -c\n    if test \"$compiler_c_o\" = no; then\n      output_obj=`$ECHO \"$srcfile\" | $SED 's%^.*/%%; s%\\.[^.]*$%%'`.${objext}\n      lockfile=\"$output_obj.lock\"\n    else\n      output_obj=\n      need_locks=no\n      lockfile=\n    fi\n\n    # Lock this critical section if it is needed\n    # We use this script file to make the link, it avoids creating a new file\n    if test \"$need_locks\" = yes; then\n      until $opt_dry_run || ln \"$progpath\" \"$lockfile\" 2>/dev/null; do\n\tfunc_echo \"Waiting for $lockfile to be removed\"\n\tsleep 2\n      done\n    elif test \"$need_locks\" = warn; then\n      if test -f \"$lockfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile exists and contains:\n`cat $lockfile 2>/dev/null`\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n      func_append removelist \" $output_obj\"\n      $ECHO \"$srcfile\" > \"$lockfile\"\n    fi\n\n    $opt_dry_run || $RM $removelist\n    func_append removelist \" $lockfile\"\n    trap '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE' 1 2 15\n\n    func_to_tool_file \"$srcfile\" func_convert_file_msys_to_w32\n    srcfile=$func_to_tool_file_result\n    func_quote_for_eval \"$srcfile\"\n    qsrcfile=$func_quote_for_eval_result\n\n    # Only build a PIC object if we are building libtool libraries.\n    if test \"$build_libtool_libs\" = yes; then\n      # Without this assignment, base_compile gets emptied.\n      fbsd_hideous_sh_bug=$base_compile\n\n      if test \"$pic_mode\" != no; then\n\tcommand=\"$base_compile $qsrcfile $pic_flag\"\n      else\n\t# Don't build PIC code\n\tcommand=\"$base_compile $qsrcfile\"\n      fi\n\n      func_mkdir_p \"$xdir$objdir\"\n\n      if test -z \"$output_obj\"; then\n\t# Place PIC objects in $objdir\n\tfunc_append command \" -o $lobj\"\n      fi\n\n      func_show_eval_locale \"$command\"\t\\\n          'test -n \"$output_obj\" && $RM $removelist; exit $EXIT_FAILURE'\n\n      if test \"$need_locks\" = warn &&\n\t test \"X`cat $lockfile 2>/dev/null`\" != \"X$srcfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile contains:\n`cat $lockfile 2>/dev/null`\n\nbut it should contain:\n$srcfile\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n\n      # Just move the object if needed, then go on to compile the next one\n      if test -n \"$output_obj\" && test \"X$output_obj\" != \"X$lobj\"; then\n\tfunc_show_eval '$MV \"$output_obj\" \"$lobj\"' \\\n\t  'error=$?; $opt_dry_run || $RM $removelist; exit $error'\n      fi\n\n      # Allow error messages only from the first compilation.\n      if test \"$suppress_opt\" = yes; then\n\tsuppress_output=' >/dev/null 2>&1'\n      fi\n    fi\n\n    # Only build a position-dependent object if we build old libraries.\n    if test \"$build_old_libs\" = yes; then\n      if test \"$pic_mode\" != yes; then\n\t# Don't build PIC code\n\tcommand=\"$base_compile $qsrcfile$pie_flag\"\n      else\n\tcommand=\"$base_compile $qsrcfile $pic_flag\"\n      fi\n      if test \"$compiler_c_o\" = yes; then\n\tfunc_append command \" -o $obj\"\n      fi\n\n      # Suppress compiler output if we already did a PIC compilation.\n      func_append command \"$suppress_output\"\n      func_show_eval_locale \"$command\" \\\n        '$opt_dry_run || $RM $removelist; exit $EXIT_FAILURE'\n\n      if test \"$need_locks\" = warn &&\n\t test \"X`cat $lockfile 2>/dev/null`\" != \"X$srcfile\"; then\n\t$ECHO \"\\\n*** ERROR, $lockfile contains:\n`cat $lockfile 2>/dev/null`\n\nbut it should contain:\n$srcfile\n\nThis indicates that another process is trying to use the same\ntemporary object file, and libtool could not work around it because\nyour compiler does not support \\`-c' and \\`-o' together.  If you\nrepeat this compilation, it may succeed, by chance, but you had better\navoid parallel builds (make -j) in this platform, or get a better\ncompiler.\"\n\n\t$opt_dry_run || $RM $removelist\n\texit $EXIT_FAILURE\n      fi\n\n      # Just move the object if needed\n      if test -n \"$output_obj\" && test \"X$output_obj\" != \"X$obj\"; then\n\tfunc_show_eval '$MV \"$output_obj\" \"$obj\"' \\\n\t  'error=$?; $opt_dry_run || $RM $removelist; exit $error'\n      fi\n    fi\n\n    $opt_dry_run || {\n      func_write_libtool_object \"$libobj\" \"$objdir/$objname\" \"$objname\"\n\n      # Unlock the critical section if it was locked\n      if test \"$need_locks\" != no; then\n\tremovelist=$lockfile\n        $RM \"$lockfile\"\n      fi\n    }\n\n    exit $EXIT_SUCCESS\n}\n\n$opt_help || {\n  test \"$opt_mode\" = compile && func_mode_compile ${1+\"$@\"}\n}\n\nfunc_mode_help ()\n{\n    # We need to display help for each of the modes.\n    case $opt_mode in\n      \"\")\n        # Generic help is extracted from the usage comments\n        # at the start of this file.\n        func_help\n        ;;\n\n      clean)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=clean RM [RM-OPTION]... FILE...\n\nRemove files from the build directory.\n\nRM is the name of the program to use to delete files associated with each FILE\n(typically \\`/bin/rm').  RM-OPTIONS are options (such as \\`-f') to be passed\nto RM.\n\nIf FILE is a libtool library, object or program, all the files associated\nwith it are deleted. Otherwise, only FILE itself is deleted using RM.\"\n        ;;\n\n      compile)\n      $ECHO \\\n\"Usage: $progname [OPTION]... --mode=compile COMPILE-COMMAND... SOURCEFILE\n\nCompile a source file into a libtool library object.\n\nThis mode accepts the following additional options:\n\n  -o OUTPUT-FILE    set the output file name to OUTPUT-FILE\n  -no-suppress      do not suppress compiler output for multiple passes\n  -prefer-pic       try to build PIC objects only\n  -prefer-non-pic   try to build non-PIC objects only\n  -shared           do not build a \\`.o' file suitable for static linking\n  -static           only build a \\`.o' file suitable for static linking\n  -Wc,FLAG          pass FLAG directly to the compiler\n\nCOMPILE-COMMAND is a command to be used in creating a \\`standard' object file\nfrom the given SOURCEFILE.\n\nThe output file name is determined by removing the directory component from\nSOURCEFILE, then substituting the C source code suffix \\`.c' with the\nlibrary object suffix, \\`.lo'.\"\n        ;;\n\n      execute)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=execute COMMAND [ARGS]...\n\nAutomatically set library path, then run a program.\n\nThis mode accepts the following additional options:\n\n  -dlopen FILE      add the directory containing FILE to the library path\n\nThis mode sets the library path environment variable according to \\`-dlopen'\nflags.\n\nIf any of the ARGS are libtool executable wrappers, then they are translated\ninto their corresponding uninstalled binary, and any of their required library\ndirectories are added to the library path.\n\nThen, COMMAND is executed, with ARGS as arguments.\"\n        ;;\n\n      finish)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=finish [LIBDIR]...\n\nComplete the installation of libtool libraries.\n\nEach LIBDIR is a directory that contains libtool libraries.\n\nThe commands that this mode executes may require superuser privileges.  Use\nthe \\`--dry-run' option if you just want to see what would be executed.\"\n        ;;\n\n      install)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=install INSTALL-COMMAND...\n\nInstall executables or libraries.\n\nINSTALL-COMMAND is the installation command.  The first component should be\neither the \\`install' or \\`cp' program.\n\nThe following components of INSTALL-COMMAND are treated specially:\n\n  -inst-prefix-dir PREFIX-DIR  Use PREFIX-DIR as a staging area for installation\n\nThe rest of the components are interpreted as arguments to that command (only\nBSD-compatible install options are recognized).\"\n        ;;\n\n      link)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=link LINK-COMMAND...\n\nLink object files or libraries together to form another library, or to\ncreate an executable program.\n\nLINK-COMMAND is a command using the C compiler that you would use to create\na program from several object files.\n\nThe following components of LINK-COMMAND are treated specially:\n\n  -all-static       do not do any dynamic linking at all\n  -avoid-version    do not add a version suffix if possible\n  -bindir BINDIR    specify path to binaries directory (for systems where\n                    libraries must be found in the PATH setting at runtime)\n  -dlopen FILE      \\`-dlpreopen' FILE if it cannot be dlopened at runtime\n  -dlpreopen FILE   link in FILE and add its symbols to lt_preloaded_symbols\n  -export-dynamic   allow symbols from OUTPUT-FILE to be resolved with dlsym(3)\n  -export-symbols SYMFILE\n                    try to export only the symbols listed in SYMFILE\n  -export-symbols-regex REGEX\n                    try to export only the symbols matching REGEX\n  -LLIBDIR          search LIBDIR for required installed libraries\n  -lNAME            OUTPUT-FILE requires the installed library libNAME\n  -module           build a library that can dlopened\n  -no-fast-install  disable the fast-install mode\n  -no-install       link a not-installable executable\n  -no-undefined     declare that a library does not refer to external symbols\n  -o OUTPUT-FILE    create OUTPUT-FILE from the specified objects\n  -objectlist FILE  Use a list of object files found in FILE to specify objects\n  -precious-files-regex REGEX\n                    don't remove output files matching REGEX\n  -release RELEASE  specify package release information\n  -rpath LIBDIR     the created library will eventually be installed in LIBDIR\n  -R[ ]LIBDIR       add LIBDIR to the runtime path of programs and libraries\n  -shared           only do dynamic linking of libtool libraries\n  -shrext SUFFIX    override the standard shared library file extension\n  -static           do not do any dynamic linking of uninstalled libtool libraries\n  -static-libtool-libs\n                    do not do any dynamic linking of libtool libraries\n  -version-info CURRENT[:REVISION[:AGE]]\n                    specify library version info [each variable defaults to 0]\n  -weak LIBNAME     declare that the target provides the LIBNAME interface\n  -Wc,FLAG\n  -Xcompiler FLAG   pass linker-specific FLAG directly to the compiler\n  -Wl,FLAG\n  -Xlinker FLAG     pass linker-specific FLAG directly to the linker\n  -XCClinker FLAG   pass link-specific FLAG to the compiler driver (CC)\n\nAll other options (arguments beginning with \\`-') are ignored.\n\nEvery other argument is treated as a filename.  Files ending in \\`.la' are\ntreated as uninstalled libtool libraries, other files are standard or library\nobject files.\n\nIf the OUTPUT-FILE ends in \\`.la', then a libtool library is created,\nonly library objects (\\`.lo' files) may be specified, and \\`-rpath' is\nrequired, except when creating a convenience library.\n\nIf OUTPUT-FILE ends in \\`.a' or \\`.lib', then a standard library is created\nusing \\`ar' and \\`ranlib', or on Windows using \\`lib'.\n\nIf OUTPUT-FILE ends in \\`.lo' or \\`.${objext}', then a reloadable object file\nis created, otherwise an executable program is created.\"\n        ;;\n\n      uninstall)\n        $ECHO \\\n\"Usage: $progname [OPTION]... --mode=uninstall RM [RM-OPTION]... FILE...\n\nRemove libraries from an installation directory.\n\nRM is the name of the program to use to delete files associated with each FILE\n(typically \\`/bin/rm').  RM-OPTIONS are options (such as \\`-f') to be passed\nto RM.\n\nIf FILE is a libtool library, all the files associated with it are deleted.\nOtherwise, only FILE itself is deleted using RM.\"\n        ;;\n\n      *)\n        func_fatal_help \"invalid operation mode \\`$opt_mode'\"\n        ;;\n    esac\n\n    echo\n    $ECHO \"Try \\`$progname --help' for more information about other modes.\"\n}\n\n# Now that we've collected a possible --mode arg, show help if necessary\nif $opt_help; then\n  if test \"$opt_help\" = :; then\n    func_mode_help\n  else\n    {\n      func_help noexit\n      for opt_mode in compile link execute install finish uninstall clean; do\n\tfunc_mode_help\n      done\n    } | sed -n '1p; 2,$s/^Usage:/  or: /p'\n    {\n      func_help noexit\n      for opt_mode in compile link execute install finish uninstall clean; do\n\techo\n\tfunc_mode_help\n      done\n    } |\n    sed '1d\n      /^When reporting/,/^Report/{\n\tH\n\td\n      }\n      $x\n      /information about other modes/d\n      /more detailed .*MODE/d\n      s/^Usage:.*--mode=\\([^ ]*\\) .*/Description of \\1 mode:/'\n  fi\n  exit $?\nfi\n\n\n# func_mode_execute arg...\nfunc_mode_execute ()\n{\n    $opt_debug\n    # The first argument is the command name.\n    cmd=\"$nonopt\"\n    test -z \"$cmd\" && \\\n      func_fatal_help \"you must specify a COMMAND\"\n\n    # Handle -dlopen flags immediately.\n    for file in $opt_dlopen; do\n      test -f \"$file\" \\\n\t|| func_fatal_help \"\\`$file' is not a file\"\n\n      dir=\n      case $file in\n      *.la)\n\tfunc_resolve_sysroot \"$file\"\n\tfile=$func_resolve_sysroot_result\n\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$file\" \\\n\t  || func_fatal_help \"\\`$lib' is not a valid libtool archive\"\n\n\t# Read the libtool library.\n\tdlname=\n\tlibrary_names=\n\tfunc_source \"$file\"\n\n\t# Skip this library if it cannot be dlopened.\n\tif test -z \"$dlname\"; then\n\t  # Warn if it was a shared library.\n\t  test -n \"$library_names\" && \\\n\t    func_warning \"\\`$file' was not linked with \\`-export-dynamic'\"\n\t  continue\n\tfi\n\n\tfunc_dirname \"$file\" \"\" \".\"\n\tdir=\"$func_dirname_result\"\n\n\tif test -f \"$dir/$objdir/$dlname\"; then\n\t  func_append dir \"/$objdir\"\n\telse\n\t  if test ! -f \"$dir/$dlname\"; then\n\t    func_fatal_error \"cannot find \\`$dlname' in \\`$dir' or \\`$dir/$objdir'\"\n\t  fi\n\tfi\n\t;;\n\n      *.lo)\n\t# Just add the directory containing the .lo file.\n\tfunc_dirname \"$file\" \"\" \".\"\n\tdir=\"$func_dirname_result\"\n\t;;\n\n      *)\n\tfunc_warning \"\\`-dlopen' is ignored for non-libtool libraries and objects\"\n\tcontinue\n\t;;\n      esac\n\n      # Get the absolute pathname.\n      absdir=`cd \"$dir\" && pwd`\n      test -n \"$absdir\" && dir=\"$absdir\"\n\n      # Now add the directory to shlibpath_var.\n      if eval \"test -z \\\"\\$$shlibpath_var\\\"\"; then\n\teval \"$shlibpath_var=\\\"\\$dir\\\"\"\n      else\n\teval \"$shlibpath_var=\\\"\\$dir:\\$$shlibpath_var\\\"\"\n      fi\n    done\n\n    # This variable tells wrapper scripts just to set shlibpath_var\n    # rather than running their programs.\n    libtool_execute_magic=\"$magic\"\n\n    # Check if any of the arguments is a wrapper script.\n    args=\n    for file\n    do\n      case $file in\n      -* | *.la | *.lo ) ;;\n      *)\n\t# Do a test to see if this is really a libtool program.\n\tif func_ltwrapper_script_p \"$file\"; then\n\t  func_source \"$file\"\n\t  # Transform arg to wrapped name.\n\t  file=\"$progdir/$program\"\n\telif func_ltwrapper_executable_p \"$file\"; then\n\t  func_ltwrapper_scriptname \"$file\"\n\t  func_source \"$func_ltwrapper_scriptname_result\"\n\t  # Transform arg to wrapped name.\n\t  file=\"$progdir/$program\"\n\tfi\n\t;;\n      esac\n      # Quote arguments (to preserve shell metacharacters).\n      func_append_quoted args \"$file\"\n    done\n\n    if test \"X$opt_dry_run\" = Xfalse; then\n      if test -n \"$shlibpath_var\"; then\n\t# Export the shlibpath_var.\n\teval \"export $shlibpath_var\"\n      fi\n\n      # Restore saved environment variables\n      for lt_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES\n      do\n\teval \"if test \\\"\\${save_$lt_var+set}\\\" = set; then\n                $lt_var=\\$save_$lt_var; export $lt_var\n\t      else\n\t\t$lt_unset $lt_var\n\t      fi\"\n      done\n\n      # Now prepare to actually exec the command.\n      exec_cmd=\"\\$cmd$args\"\n    else\n      # Display what would be done.\n      if test -n \"$shlibpath_var\"; then\n\teval \"\\$ECHO \\\"\\$shlibpath_var=\\$$shlibpath_var\\\"\"\n\techo \"export $shlibpath_var\"\n      fi\n      $ECHO \"$cmd$args\"\n      exit $EXIT_SUCCESS\n    fi\n}\n\ntest \"$opt_mode\" = execute && func_mode_execute ${1+\"$@\"}\n\n\n# func_mode_finish arg...\nfunc_mode_finish ()\n{\n    $opt_debug\n    libs=\n    libdirs=\n    admincmds=\n\n    for opt in \"$nonopt\" ${1+\"$@\"}\n    do\n      if test -d \"$opt\"; then\n\tfunc_append libdirs \" $opt\"\n\n      elif test -f \"$opt\"; then\n\tif func_lalib_unsafe_p \"$opt\"; then\n\t  func_append libs \" $opt\"\n\telse\n\t  func_warning \"\\`$opt' is not a valid libtool archive\"\n\tfi\n\n      else\n\tfunc_fatal_error \"invalid argument \\`$opt'\"\n      fi\n    done\n\n    if test -n \"$libs\"; then\n      if test -n \"$lt_sysroot\"; then\n        sysroot_regex=`$ECHO \"$lt_sysroot\" | $SED \"$sed_make_literal_regex\"`\n        sysroot_cmd=\"s/\\([ ']\\)$sysroot_regex/\\1/g;\"\n      else\n        sysroot_cmd=\n      fi\n\n      # Remove sysroot references\n      if $opt_dry_run; then\n        for lib in $libs; do\n          echo \"removing references to $lt_sysroot and \\`=' prefixes from $lib\"\n        done\n      else\n        tmpdir=`func_mktempdir`\n        for lib in $libs; do\n\t  sed -e \"${sysroot_cmd} s/\\([ ']-[LR]\\)=/\\1/g; s/\\([ ']\\)=/\\1/g\" $lib \\\n\t    > $tmpdir/tmp-la\n\t  mv -f $tmpdir/tmp-la $lib\n\tdone\n        ${RM}r \"$tmpdir\"\n      fi\n    fi\n\n    if test -n \"$finish_cmds$finish_eval\" && test -n \"$libdirs\"; then\n      for libdir in $libdirs; do\n\tif test -n \"$finish_cmds\"; then\n\t  # Do each command in the finish commands.\n\t  func_execute_cmds \"$finish_cmds\" 'admincmds=\"$admincmds\n'\"$cmd\"'\"'\n\tfi\n\tif test -n \"$finish_eval\"; then\n\t  # Do the single finish_eval.\n\t  eval cmds=\\\"$finish_eval\\\"\n\t  $opt_dry_run || eval \"$cmds\" || func_append admincmds \"\n       $cmds\"\n\tfi\n      done\n    fi\n\n    # Exit here if they wanted silent mode.\n    $opt_silent && exit $EXIT_SUCCESS\n\n    if test -n \"$finish_cmds$finish_eval\" && test -n \"$libdirs\"; then\n      echo \"----------------------------------------------------------------------\"\n      echo \"Libraries have been installed in:\"\n      for libdir in $libdirs; do\n\t$ECHO \"   $libdir\"\n      done\n      echo\n      echo \"If you ever happen to want to link against installed libraries\"\n      echo \"in a given directory, LIBDIR, you must either use libtool, and\"\n      echo \"specify the full pathname of the library, or use the \\`-LLIBDIR'\"\n      echo \"flag during linking and do at least one of the following:\"\n      if test -n \"$shlibpath_var\"; then\n\techo \"   - add LIBDIR to the \\`$shlibpath_var' environment variable\"\n\techo \"     during execution\"\n      fi\n      if test -n \"$runpath_var\"; then\n\techo \"   - add LIBDIR to the \\`$runpath_var' environment variable\"\n\techo \"     during linking\"\n      fi\n      if test -n \"$hardcode_libdir_flag_spec\"; then\n\tlibdir=LIBDIR\n\teval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\n\t$ECHO \"   - use the \\`$flag' linker flag\"\n      fi\n      if test -n \"$admincmds\"; then\n\t$ECHO \"   - have your system administrator run these commands:$admincmds\"\n      fi\n      if test -f /etc/ld.so.conf; then\n\techo \"   - have your system administrator add LIBDIR to \\`/etc/ld.so.conf'\"\n      fi\n      echo\n\n      echo \"See any operating system documentation about shared libraries for\"\n      case $host in\n\tsolaris2.[6789]|solaris2.1[0-9])\n\t  echo \"more information, such as the ld(1), crle(1) and ld.so(8) manual\"\n\t  echo \"pages.\"\n\t  ;;\n\t*)\n\t  echo \"more information, such as the ld(1) and ld.so(8) manual pages.\"\n\t  ;;\n      esac\n      echo \"----------------------------------------------------------------------\"\n    fi\n    exit $EXIT_SUCCESS\n}\n\ntest \"$opt_mode\" = finish && func_mode_finish ${1+\"$@\"}\n\n\n# func_mode_install arg...\nfunc_mode_install ()\n{\n    $opt_debug\n    # There may be an optional sh(1) argument at the beginning of\n    # install_prog (especially on Windows NT).\n    if test \"$nonopt\" = \"$SHELL\" || test \"$nonopt\" = /bin/sh ||\n       # Allow the use of GNU shtool's install command.\n       case $nonopt in *shtool*) :;; *) false;; esac; then\n      # Aesthetically quote it.\n      func_quote_for_eval \"$nonopt\"\n      install_prog=\"$func_quote_for_eval_result \"\n      arg=$1\n      shift\n    else\n      install_prog=\n      arg=$nonopt\n    fi\n\n    # The real first argument should be the name of the installation program.\n    # Aesthetically quote it.\n    func_quote_for_eval \"$arg\"\n    func_append install_prog \"$func_quote_for_eval_result\"\n    install_shared_prog=$install_prog\n    case \" $install_prog \" in\n      *[\\\\\\ /]cp\\ *) install_cp=: ;;\n      *) install_cp=false ;;\n    esac\n\n    # We need to accept at least all the BSD install flags.\n    dest=\n    files=\n    opts=\n    prev=\n    install_type=\n    isdir=no\n    stripme=\n    no_mode=:\n    for arg\n    do\n      arg2=\n      if test -n \"$dest\"; then\n\tfunc_append files \" $dest\"\n\tdest=$arg\n\tcontinue\n      fi\n\n      case $arg in\n      -d) isdir=yes ;;\n      -f)\n\tif $install_cp; then :; else\n\t  prev=$arg\n\tfi\n\t;;\n      -g | -m | -o)\n\tprev=$arg\n\t;;\n      -s)\n\tstripme=\" -s\"\n\tcontinue\n\t;;\n      -*)\n\t;;\n      *)\n\t# If the previous option needed an argument, then skip it.\n\tif test -n \"$prev\"; then\n\t  if test \"x$prev\" = x-m && test -n \"$install_override_mode\"; then\n\t    arg2=$install_override_mode\n\t    no_mode=false\n\t  fi\n\t  prev=\n\telse\n\t  dest=$arg\n\t  continue\n\tfi\n\t;;\n      esac\n\n      # Aesthetically quote the argument.\n      func_quote_for_eval \"$arg\"\n      func_append install_prog \" $func_quote_for_eval_result\"\n      if test -n \"$arg2\"; then\n\tfunc_quote_for_eval \"$arg2\"\n      fi\n      func_append install_shared_prog \" $func_quote_for_eval_result\"\n    done\n\n    test -z \"$install_prog\" && \\\n      func_fatal_help \"you must specify an install program\"\n\n    test -n \"$prev\" && \\\n      func_fatal_help \"the \\`$prev' option requires an argument\"\n\n    if test -n \"$install_override_mode\" && $no_mode; then\n      if $install_cp; then :; else\n\tfunc_quote_for_eval \"$install_override_mode\"\n\tfunc_append install_shared_prog \" -m $func_quote_for_eval_result\"\n      fi\n    fi\n\n    if test -z \"$files\"; then\n      if test -z \"$dest\"; then\n\tfunc_fatal_help \"no file or destination specified\"\n      else\n\tfunc_fatal_help \"you must specify a destination\"\n      fi\n    fi\n\n    # Strip any trailing slash from the destination.\n    func_stripname '' '/' \"$dest\"\n    dest=$func_stripname_result\n\n    # Check to see that the destination is a directory.\n    test -d \"$dest\" && isdir=yes\n    if test \"$isdir\" = yes; then\n      destdir=\"$dest\"\n      destname=\n    else\n      func_dirname_and_basename \"$dest\" \"\" \".\"\n      destdir=\"$func_dirname_result\"\n      destname=\"$func_basename_result\"\n\n      # Not a directory, so check to see that there is only one file specified.\n      set dummy $files; shift\n      test \"$#\" -gt 1 && \\\n\tfunc_fatal_help \"\\`$dest' is not a directory\"\n    fi\n    case $destdir in\n    [\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n    *)\n      for file in $files; do\n\tcase $file in\n\t*.lo) ;;\n\t*)\n\t  func_fatal_help \"\\`$destdir' must be an absolute directory name\"\n\t  ;;\n\tesac\n      done\n      ;;\n    esac\n\n    # This variable tells wrapper scripts just to set variables rather\n    # than running their programs.\n    libtool_install_magic=\"$magic\"\n\n    staticlibs=\n    future_libdirs=\n    current_libdirs=\n    for file in $files; do\n\n      # Do each installation.\n      case $file in\n      *.$libext)\n\t# Do the static libraries later.\n\tfunc_append staticlibs \" $file\"\n\t;;\n\n      *.la)\n\tfunc_resolve_sysroot \"$file\"\n\tfile=$func_resolve_sysroot_result\n\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$file\" \\\n\t  || func_fatal_help \"\\`$file' is not a valid libtool archive\"\n\n\tlibrary_names=\n\told_library=\n\trelink_command=\n\tfunc_source \"$file\"\n\n\t# Add the libdir to current_libdirs if it is the destination.\n\tif test \"X$destdir\" = \"X$libdir\"; then\n\t  case \"$current_libdirs \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append current_libdirs \" $libdir\" ;;\n\t  esac\n\telse\n\t  # Note the libdir as a future libdir.\n\t  case \"$future_libdirs \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append future_libdirs \" $libdir\" ;;\n\t  esac\n\tfi\n\n\tfunc_dirname \"$file\" \"/\" \"\"\n\tdir=\"$func_dirname_result\"\n\tfunc_append dir \"$objdir\"\n\n\tif test -n \"$relink_command\"; then\n\t  # Determine the prefix the user has applied to our future dir.\n\t  inst_prefix_dir=`$ECHO \"$destdir\" | $SED -e \"s%$libdir\\$%%\"`\n\n\t  # Don't allow the user to place us outside of our expected\n\t  # location b/c this prevents finding dependent libraries that\n\t  # are installed to the same prefix.\n\t  # At present, this check doesn't affect windows .dll's that\n\t  # are installed into $libdir/../bin (currently, that works fine)\n\t  # but it's something to keep an eye on.\n\t  test \"$inst_prefix_dir\" = \"$destdir\" && \\\n\t    func_fatal_error \"error: cannot install \\`$file' to a directory not ending in $libdir\"\n\n\t  if test -n \"$inst_prefix_dir\"; then\n\t    # Stick the inst_prefix_dir data into the link command.\n\t    relink_command=`$ECHO \"$relink_command\" | $SED \"s%@inst_prefix_dir@%-inst-prefix-dir $inst_prefix_dir%\"`\n\t  else\n\t    relink_command=`$ECHO \"$relink_command\" | $SED \"s%@inst_prefix_dir@%%\"`\n\t  fi\n\n\t  func_warning \"relinking \\`$file'\"\n\t  func_show_eval \"$relink_command\" \\\n\t    'func_fatal_error \"error: relink \\`$file'\\'' with the above command before installing it\"'\n\tfi\n\n\t# See the names of the shared library.\n\tset dummy $library_names; shift\n\tif test -n \"$1\"; then\n\t  realname=\"$1\"\n\t  shift\n\n\t  srcname=\"$realname\"\n\t  test -n \"$relink_command\" && srcname=\"$realname\"T\n\n\t  # Install the shared library and build the symlinks.\n\t  func_show_eval \"$install_shared_prog $dir/$srcname $destdir/$realname\" \\\n\t      'exit $?'\n\t  tstripme=\"$stripme\"\n\t  case $host_os in\n\t  cygwin* | mingw* | pw32* | cegcc*)\n\t    case $realname in\n\t    *.dll.a)\n\t      tstripme=\"\"\n\t      ;;\n\t    esac\n\t    ;;\n\t  esac\n\t  if test -n \"$tstripme\" && test -n \"$striplib\"; then\n\t    func_show_eval \"$striplib $destdir/$realname\" 'exit $?'\n\t  fi\n\n\t  if test \"$#\" -gt 0; then\n\t    # Delete the old symlinks, and create new ones.\n\t    # Try `ln -sf' first, because the `ln' binary might depend on\n\t    # the symlink we replace!  Solaris /bin/ln does not understand -f,\n\t    # so we also need to try rm && ln -s.\n\t    for linkname\n\t    do\n\t      test \"$linkname\" != \"$realname\" \\\n\t\t&& func_show_eval \"(cd $destdir && { $LN_S -f $realname $linkname || { $RM $linkname && $LN_S $realname $linkname; }; })\"\n\t    done\n\t  fi\n\n\t  # Do each command in the postinstall commands.\n\t  lib=\"$destdir/$realname\"\n\t  func_execute_cmds \"$postinstall_cmds\" 'exit $?'\n\tfi\n\n\t# Install the pseudo-library for information purposes.\n\tfunc_basename \"$file\"\n\tname=\"$func_basename_result\"\n\tinstname=\"$dir/$name\"i\n\tfunc_show_eval \"$install_prog $instname $destdir/$name\" 'exit $?'\n\n\t# Maybe install the static library, too.\n\ttest -n \"$old_library\" && func_append staticlibs \" $dir/$old_library\"\n\t;;\n\n      *.lo)\n\t# Install (i.e. copy) a libtool object.\n\n\t# Figure out destination file name, if it wasn't already specified.\n\tif test -n \"$destname\"; then\n\t  destfile=\"$destdir/$destname\"\n\telse\n\t  func_basename \"$file\"\n\t  destfile=\"$func_basename_result\"\n\t  destfile=\"$destdir/$destfile\"\n\tfi\n\n\t# Deduce the name of the destination old-style object file.\n\tcase $destfile in\n\t*.lo)\n\t  func_lo2o \"$destfile\"\n\t  staticdest=$func_lo2o_result\n\t  ;;\n\t*.$objext)\n\t  staticdest=\"$destfile\"\n\t  destfile=\n\t  ;;\n\t*)\n\t  func_fatal_help \"cannot copy a libtool object to \\`$destfile'\"\n\t  ;;\n\tesac\n\n\t# Install the libtool object if requested.\n\ttest -n \"$destfile\" && \\\n\t  func_show_eval \"$install_prog $file $destfile\" 'exit $?'\n\n\t# Install the old object if enabled.\n\tif test \"$build_old_libs\" = yes; then\n\t  # Deduce the name of the old-style object file.\n\t  func_lo2o \"$file\"\n\t  staticobj=$func_lo2o_result\n\t  func_show_eval \"$install_prog \\$staticobj \\$staticdest\" 'exit $?'\n\tfi\n\texit $EXIT_SUCCESS\n\t;;\n\n      *)\n\t# Figure out destination file name, if it wasn't already specified.\n\tif test -n \"$destname\"; then\n\t  destfile=\"$destdir/$destname\"\n\telse\n\t  func_basename \"$file\"\n\t  destfile=\"$func_basename_result\"\n\t  destfile=\"$destdir/$destfile\"\n\tfi\n\n\t# If the file is missing, and there is a .exe on the end, strip it\n\t# because it is most likely a libtool script we actually want to\n\t# install\n\tstripped_ext=\"\"\n\tcase $file in\n\t  *.exe)\n\t    if test ! -f \"$file\"; then\n\t      func_stripname '' '.exe' \"$file\"\n\t      file=$func_stripname_result\n\t      stripped_ext=\".exe\"\n\t    fi\n\t    ;;\n\tesac\n\n\t# Do a test to see if this is really a libtool program.\n\tcase $host in\n\t*cygwin* | *mingw*)\n\t    if func_ltwrapper_executable_p \"$file\"; then\n\t      func_ltwrapper_scriptname \"$file\"\n\t      wrapper=$func_ltwrapper_scriptname_result\n\t    else\n\t      func_stripname '' '.exe' \"$file\"\n\t      wrapper=$func_stripname_result\n\t    fi\n\t    ;;\n\t*)\n\t    wrapper=$file\n\t    ;;\n\tesac\n\tif func_ltwrapper_script_p \"$wrapper\"; then\n\t  notinst_deplibs=\n\t  relink_command=\n\n\t  func_source \"$wrapper\"\n\n\t  # Check the variables that should have been set.\n\t  test -z \"$generated_by_libtool_version\" && \\\n\t    func_fatal_error \"invalid libtool wrapper script \\`$wrapper'\"\n\n\t  finalize=yes\n\t  for lib in $notinst_deplibs; do\n\t    # Check to see that each library is installed.\n\t    libdir=\n\t    if test -f \"$lib\"; then\n\t      func_source \"$lib\"\n\t    fi\n\t    libfile=\"$libdir/\"`$ECHO \"$lib\" | $SED 's%^.*/%%g'` ### testsuite: skip nested quoting test\n\t    if test -n \"$libdir\" && test ! -f \"$libfile\"; then\n\t      func_warning \"\\`$lib' has not been installed in \\`$libdir'\"\n\t      finalize=no\n\t    fi\n\t  done\n\n\t  relink_command=\n\t  func_source \"$wrapper\"\n\n\t  outputname=\n\t  if test \"$fast_install\" = no && test -n \"$relink_command\"; then\n\t    $opt_dry_run || {\n\t      if test \"$finalize\" = yes; then\n\t        tmpdir=`func_mktempdir`\n\t\tfunc_basename \"$file$stripped_ext\"\n\t\tfile=\"$func_basename_result\"\n\t        outputname=\"$tmpdir/$file\"\n\t        # Replace the output file specification.\n\t        relink_command=`$ECHO \"$relink_command\" | $SED 's%@OUTPUT@%'\"$outputname\"'%g'`\n\n\t        $opt_silent || {\n\t          func_quote_for_expand \"$relink_command\"\n\t\t  eval \"func_echo $func_quote_for_expand_result\"\n\t        }\n\t        if eval \"$relink_command\"; then :\n\t          else\n\t\t  func_error \"error: relink \\`$file' with the above command before installing it\"\n\t\t  $opt_dry_run || ${RM}r \"$tmpdir\"\n\t\t  continue\n\t        fi\n\t        file=\"$outputname\"\n\t      else\n\t        func_warning \"cannot relink \\`$file'\"\n\t      fi\n\t    }\n\t  else\n\t    # Install the binary that we compiled earlier.\n\t    file=`$ECHO \"$file$stripped_ext\" | $SED \"s%\\([^/]*\\)$%$objdir/\\1%\"`\n\t  fi\n\tfi\n\n\t# remove .exe since cygwin /usr/bin/install will append another\n\t# one anyway\n\tcase $install_prog,$host in\n\t*/usr/bin/install*,*cygwin*)\n\t  case $file:$destfile in\n\t  *.exe:*.exe)\n\t    # this is ok\n\t    ;;\n\t  *.exe:*)\n\t    destfile=$destfile.exe\n\t    ;;\n\t  *:*.exe)\n\t    func_stripname '' '.exe' \"$destfile\"\n\t    destfile=$func_stripname_result\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\tfunc_show_eval \"$install_prog\\$stripme \\$file \\$destfile\" 'exit $?'\n\t$opt_dry_run || if test -n \"$outputname\"; then\n\t  ${RM}r \"$tmpdir\"\n\tfi\n\t;;\n      esac\n    done\n\n    for file in $staticlibs; do\n      func_basename \"$file\"\n      name=\"$func_basename_result\"\n\n      # Set up the ranlib parameters.\n      oldlib=\"$destdir/$name\"\n      func_to_tool_file \"$oldlib\" func_convert_file_msys_to_w32\n      tool_oldlib=$func_to_tool_file_result\n\n      func_show_eval \"$install_prog \\$file \\$oldlib\" 'exit $?'\n\n      if test -n \"$stripme\" && test -n \"$old_striplib\"; then\n\tfunc_show_eval \"$old_striplib $tool_oldlib\" 'exit $?'\n      fi\n\n      # Do each command in the postinstall commands.\n      func_execute_cmds \"$old_postinstall_cmds\" 'exit $?'\n    done\n\n    test -n \"$future_libdirs\" && \\\n      func_warning \"remember to run \\`$progname --finish$future_libdirs'\"\n\n    if test -n \"$current_libdirs\"; then\n      # Maybe just do a dry run.\n      $opt_dry_run && current_libdirs=\" -n$current_libdirs\"\n      exec_cmd='$SHELL $progpath $preserve_args --finish$current_libdirs'\n    else\n      exit $EXIT_SUCCESS\n    fi\n}\n\ntest \"$opt_mode\" = install && func_mode_install ${1+\"$@\"}\n\n\n# func_generate_dlsyms outputname originator pic_p\n# Extract symbols from dlprefiles and create ${outputname}S.o with\n# a dlpreopen symbol table.\nfunc_generate_dlsyms ()\n{\n    $opt_debug\n    my_outputname=\"$1\"\n    my_originator=\"$2\"\n    my_pic_p=\"${3-no}\"\n    my_prefix=`$ECHO \"$my_originator\" | sed 's%[^a-zA-Z0-9]%_%g'`\n    my_dlsyms=\n\n    if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n      if test -n \"$NM\" && test -n \"$global_symbol_pipe\"; then\n\tmy_dlsyms=\"${my_outputname}S.c\"\n      else\n\tfunc_error \"not configured to extract global symbols from dlpreopened files\"\n      fi\n    fi\n\n    if test -n \"$my_dlsyms\"; then\n      case $my_dlsyms in\n      \"\") ;;\n      *.c)\n\t# Discover the nlist of each of the dlfiles.\n\tnlist=\"$output_objdir/${my_outputname}.nm\"\n\n\tfunc_show_eval \"$RM $nlist ${nlist}S ${nlist}T\"\n\n\t# Parse the name list into a source file.\n\tfunc_verbose \"creating $output_objdir/$my_dlsyms\"\n\n\t$opt_dry_run || $ECHO > \"$output_objdir/$my_dlsyms\" \"\\\n/* $my_dlsyms - symbol resolution table for \\`$my_outputname' dlsym emulation. */\n/* Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION */\n\n#ifdef __cplusplus\nextern \\\"C\\\" {\n#endif\n\n#if defined(__GNUC__) && (((__GNUC__ == 4) && (__GNUC_MINOR__ >= 4)) || (__GNUC__ > 4))\n#pragma GCC diagnostic ignored \\\"-Wstrict-prototypes\\\"\n#endif\n\n/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */\n#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)\n/* DATA imports from DLLs on WIN32 con't be const, because runtime\n   relocations are performed -- see ld's documentation on pseudo-relocs.  */\n# define LT_DLSYM_CONST\n#elif defined(__osf__)\n/* This system does not cope well with relocations in const data.  */\n# define LT_DLSYM_CONST\n#else\n# define LT_DLSYM_CONST const\n#endif\n\n/* External symbol declarations for the compiler. */\\\n\"\n\n\tif test \"$dlself\" = yes; then\n\t  func_verbose \"generating symbol list for \\`$output'\"\n\n\t  $opt_dry_run || echo ': @PROGRAM@ ' > \"$nlist\"\n\n\t  # Add our own program objects to the symbol list.\n\t  progfiles=`$ECHO \"$objs$old_deplibs\" | $SP2NL | $SED \"$lo2o\" | $NL2SP`\n\t  for progfile in $progfiles; do\n\t    func_to_tool_file \"$progfile\" func_convert_file_msys_to_w32\n\t    func_verbose \"extracting global C symbols from \\`$func_to_tool_file_result'\"\n\t    $opt_dry_run || eval \"$NM $func_to_tool_file_result | $global_symbol_pipe >> '$nlist'\"\n\t  done\n\n\t  if test -n \"$exclude_expsyms\"; then\n\t    $opt_dry_run || {\n\t      eval '$EGREP -v \" ($exclude_expsyms)$\" \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t    }\n\t  fi\n\n\t  if test -n \"$export_symbols_regex\"; then\n\t    $opt_dry_run || {\n\t      eval '$EGREP -e \"$export_symbols_regex\" \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t    }\n\t  fi\n\n\t  # Prepare the list of exported symbols\n\t  if test -z \"$export_symbols\"; then\n\t    export_symbols=\"$output_objdir/$outputname.exp\"\n\t    $opt_dry_run || {\n\t      $RM $export_symbols\n\t      eval \"${SED} -n -e '/^: @PROGRAM@ $/d' -e 's/^.* \\(.*\\)$/\\1/p' \"'< \"$nlist\" > \"$export_symbols\"'\n\t      case $host in\n\t      *cygwin* | *mingw* | *cegcc* )\n                eval \"echo EXPORTS \"'> \"$output_objdir/$outputname.def\"'\n                eval 'cat \"$export_symbols\" >> \"$output_objdir/$outputname.def\"'\n\t        ;;\n\t      esac\n\t    }\n\t  else\n\t    $opt_dry_run || {\n\t      eval \"${SED} -e 's/\\([].[*^$]\\)/\\\\\\\\\\1/g' -e 's/^/ /' -e 's/$/$/'\"' < \"$export_symbols\" > \"$output_objdir/$outputname.exp\"'\n\t      eval '$GREP -f \"$output_objdir/$outputname.exp\" < \"$nlist\" > \"$nlist\"T'\n\t      eval '$MV \"$nlist\"T \"$nlist\"'\n\t      case $host in\n\t        *cygwin* | *mingw* | *cegcc* )\n\t          eval \"echo EXPORTS \"'> \"$output_objdir/$outputname.def\"'\n\t          eval 'cat \"$nlist\" >> \"$output_objdir/$outputname.def\"'\n\t          ;;\n\t      esac\n\t    }\n\t  fi\n\tfi\n\n\tfor dlprefile in $dlprefiles; do\n\t  func_verbose \"extracting global C symbols from \\`$dlprefile'\"\n\t  func_basename \"$dlprefile\"\n\t  name=\"$func_basename_result\"\n          case $host in\n\t    *cygwin* | *mingw* | *cegcc* )\n\t      # if an import library, we need to obtain dlname\n\t      if func_win32_import_lib_p \"$dlprefile\"; then\n\t        func_tr_sh \"$dlprefile\"\n\t        eval \"curr_lafile=\\$libfile_$func_tr_sh_result\"\n\t        dlprefile_dlbasename=\"\"\n\t        if test -n \"$curr_lafile\" && func_lalib_p \"$curr_lafile\"; then\n\t          # Use subshell, to avoid clobbering current variable values\n\t          dlprefile_dlname=`source \"$curr_lafile\" && echo \"$dlname\"`\n\t          if test -n \"$dlprefile_dlname\" ; then\n\t            func_basename \"$dlprefile_dlname\"\n\t            dlprefile_dlbasename=\"$func_basename_result\"\n\t          else\n\t            # no lafile. user explicitly requested -dlpreopen <import library>.\n\t            $sharedlib_from_linklib_cmd \"$dlprefile\"\n\t            dlprefile_dlbasename=$sharedlib_from_linklib_result\n\t          fi\n\t        fi\n\t        $opt_dry_run || {\n\t          if test -n \"$dlprefile_dlbasename\" ; then\n\t            eval '$ECHO \": $dlprefile_dlbasename\" >> \"$nlist\"'\n\t          else\n\t            func_warning \"Could not compute DLL name from $name\"\n\t            eval '$ECHO \": $name \" >> \"$nlist\"'\n\t          fi\n\t          func_to_tool_file \"$dlprefile\" func_convert_file_msys_to_w32\n\t          eval \"$NM \\\"$func_to_tool_file_result\\\" 2>/dev/null | $global_symbol_pipe |\n\t            $SED -e '/I __imp/d' -e 's/I __nm_/D /;s/_nm__//' >> '$nlist'\"\n\t        }\n\t      else # not an import lib\n\t        $opt_dry_run || {\n\t          eval '$ECHO \": $name \" >> \"$nlist\"'\n\t          func_to_tool_file \"$dlprefile\" func_convert_file_msys_to_w32\n\t          eval \"$NM \\\"$func_to_tool_file_result\\\" 2>/dev/null | $global_symbol_pipe >> '$nlist'\"\n\t        }\n\t      fi\n\t    ;;\n\t    *)\n\t      $opt_dry_run || {\n\t        eval '$ECHO \": $name \" >> \"$nlist\"'\n\t        func_to_tool_file \"$dlprefile\" func_convert_file_msys_to_w32\n\t        eval \"$NM \\\"$func_to_tool_file_result\\\" 2>/dev/null | $global_symbol_pipe >> '$nlist'\"\n\t      }\n\t    ;;\n          esac\n\tdone\n\n\t$opt_dry_run || {\n\t  # Make sure we have at least an empty file.\n\t  test -f \"$nlist\" || : > \"$nlist\"\n\n\t  if test -n \"$exclude_expsyms\"; then\n\t    $EGREP -v \" ($exclude_expsyms)$\" \"$nlist\" > \"$nlist\"T\n\t    $MV \"$nlist\"T \"$nlist\"\n\t  fi\n\n\t  # Try sorting and uniquifying the output.\n\t  if $GREP -v \"^: \" < \"$nlist\" |\n\t      if sort -k 3 </dev/null >/dev/null 2>&1; then\n\t\tsort -k 3\n\t      else\n\t\tsort +2\n\t      fi |\n\t      uniq > \"$nlist\"S; then\n\t    :\n\t  else\n\t    $GREP -v \"^: \" < \"$nlist\" > \"$nlist\"S\n\t  fi\n\n\t  if test -f \"$nlist\"S; then\n\t    eval \"$global_symbol_to_cdecl\"' < \"$nlist\"S >> \"$output_objdir/$my_dlsyms\"'\n\t  else\n\t    echo '/* NONE */' >> \"$output_objdir/$my_dlsyms\"\n\t  fi\n\n\t  echo >> \"$output_objdir/$my_dlsyms\" \"\\\n\n/* The mapping between symbol names and symbols.  */\ntypedef struct {\n  const char *name;\n  void *address;\n} lt_dlsymlist;\nextern LT_DLSYM_CONST lt_dlsymlist\nlt_${my_prefix}_LTX_preloaded_symbols[];\nLT_DLSYM_CONST lt_dlsymlist\nlt_${my_prefix}_LTX_preloaded_symbols[] =\n{\\\n  { \\\"$my_originator\\\", (void *) 0 },\"\n\n\t  case $need_lib_prefix in\n\t  no)\n\t    eval \"$global_symbol_to_c_name_address\" < \"$nlist\" >> \"$output_objdir/$my_dlsyms\"\n\t    ;;\n\t  *)\n\t    eval \"$global_symbol_to_c_name_address_lib_prefix\" < \"$nlist\" >> \"$output_objdir/$my_dlsyms\"\n\t    ;;\n\t  esac\n\t  echo >> \"$output_objdir/$my_dlsyms\" \"\\\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt_${my_prefix}_LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\\\n\"\n\t} # !$opt_dry_run\n\n\tpic_flag_for_symtable=\n\tcase \"$compile_command \" in\n\t*\" -static \"*) ;;\n\t*)\n\t  case $host in\n\t  # compiling the symbol table file with pic_flag works around\n\t  # a FreeBSD bug that causes programs to crash when -lm is\n\t  # linked before any other PIC object.  But we must not use\n\t  # pic_flag when linking with -static.  The problem exists in\n\t  # FreeBSD 2.2.6 and is fixed in FreeBSD 3.1.\n\t  *-*-freebsd2.*|*-*-freebsd3.0*|*-*-freebsdelf3.0*)\n\t    pic_flag_for_symtable=\" $pic_flag -DFREEBSD_WORKAROUND\" ;;\n\t  *-*-hpux*)\n\t    pic_flag_for_symtable=\" $pic_flag\"  ;;\n\t  *)\n\t    if test \"X$my_pic_p\" != Xno; then\n\t      pic_flag_for_symtable=\" $pic_flag\"\n\t    fi\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\tsymtab_cflags=\n\tfor arg in $LTCFLAGS; do\n\t  case $arg in\n\t  -pie | -fpie | -fPIE) ;;\n\t  *) func_append symtab_cflags \" $arg\" ;;\n\t  esac\n\tdone\n\n\t# Now compile the dynamic symbol file.\n\tfunc_show_eval '(cd $output_objdir && $LTCC$symtab_cflags -c$no_builtin_flag$pic_flag_for_symtable \"$my_dlsyms\")' 'exit $?'\n\n\t# Clean up the generated files.\n\tfunc_show_eval '$RM \"$output_objdir/$my_dlsyms\" \"$nlist\" \"${nlist}S\" \"${nlist}T\"'\n\n\t# Transform the symbol file into the correct name.\n\tsymfileobj=\"$output_objdir/${my_outputname}S.$objext\"\n\tcase $host in\n\t*cygwin* | *mingw* | *cegcc* )\n\t  if test -f \"$output_objdir/$my_outputname.def\"; then\n\t    compile_command=`$ECHO \"$compile_command\" | $SED \"s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%\"`\n\t    finalize_command=`$ECHO \"$finalize_command\" | $SED \"s%@SYMFILE@%$output_objdir/$my_outputname.def $symfileobj%\"`\n\t  else\n\t    compile_command=`$ECHO \"$compile_command\" | $SED \"s%@SYMFILE@%$symfileobj%\"`\n\t    finalize_command=`$ECHO \"$finalize_command\" | $SED \"s%@SYMFILE@%$symfileobj%\"`\n\t  fi\n\t  ;;\n\t*)\n\t  compile_command=`$ECHO \"$compile_command\" | $SED \"s%@SYMFILE@%$symfileobj%\"`\n\t  finalize_command=`$ECHO \"$finalize_command\" | $SED \"s%@SYMFILE@%$symfileobj%\"`\n\t  ;;\n\tesac\n\t;;\n      *)\n\tfunc_fatal_error \"unknown suffix for \\`$my_dlsyms'\"\n\t;;\n      esac\n    else\n      # We keep going just in case the user didn't refer to\n      # lt_preloaded_symbols.  The linker will fail if global_symbol_pipe\n      # really was required.\n\n      # Nullify the symbol file.\n      compile_command=`$ECHO \"$compile_command\" | $SED \"s% @SYMFILE@%%\"`\n      finalize_command=`$ECHO \"$finalize_command\" | $SED \"s% @SYMFILE@%%\"`\n    fi\n}\n\n# func_win32_libid arg\n# return the library type of file 'arg'\n#\n# Need a lot of goo to handle *both* DLLs and import libs\n# Has to be a shell function in order to 'eat' the argument\n# that is supplied when $file_magic_command is called.\n# Despite the name, also deal with 64 bit binaries.\nfunc_win32_libid ()\n{\n  $opt_debug\n  win32_libid_type=\"unknown\"\n  win32_fileres=`file -L $1 2>/dev/null`\n  case $win32_fileres in\n  *ar\\ archive\\ import\\ library*) # definitely import\n    win32_libid_type=\"x86 archive import\"\n    ;;\n  *ar\\ archive*) # could be an import, or static\n    # Keep the egrep pattern in sync with the one in _LT_CHECK_MAGIC_METHOD.\n    if eval $OBJDUMP -f $1 | $SED -e '10q' 2>/dev/null |\n       $EGREP 'file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)' >/dev/null; then\n      func_to_tool_file \"$1\" func_convert_file_msys_to_w32\n      win32_nmres=`eval $NM -f posix -A \\\"$func_to_tool_file_result\\\" |\n\t$SED -n -e '\n\t    1,100{\n\t\t/ I /{\n\t\t    s,.*,import,\n\t\t    p\n\t\t    q\n\t\t}\n\t    }'`\n      case $win32_nmres in\n      import*)  win32_libid_type=\"x86 archive import\";;\n      *)        win32_libid_type=\"x86 archive static\";;\n      esac\n    fi\n    ;;\n  *DLL*)\n    win32_libid_type=\"x86 DLL\"\n    ;;\n  *executable*) # but shell scripts are \"executable\" too...\n    case $win32_fileres in\n    *MS\\ Windows\\ PE\\ Intel*)\n      win32_libid_type=\"x86 DLL\"\n      ;;\n    esac\n    ;;\n  esac\n  $ECHO \"$win32_libid_type\"\n}\n\n# func_cygming_dll_for_implib ARG\n#\n# Platform-specific function to extract the\n# name of the DLL associated with the specified\n# import library ARG.\n# Invoked by eval'ing the libtool variable\n#    $sharedlib_from_linklib_cmd\n# Result is available in the variable\n#    $sharedlib_from_linklib_result\nfunc_cygming_dll_for_implib ()\n{\n  $opt_debug\n  sharedlib_from_linklib_result=`$DLLTOOL --identify-strict --identify \"$1\"`\n}\n\n# func_cygming_dll_for_implib_fallback_core SECTION_NAME LIBNAMEs\n#\n# The is the core of a fallback implementation of a\n# platform-specific function to extract the name of the\n# DLL associated with the specified import library LIBNAME.\n#\n# SECTION_NAME is either .idata$6 or .idata$7, depending\n# on the platform and compiler that created the implib.\n#\n# Echos the name of the DLL associated with the\n# specified import library.\nfunc_cygming_dll_for_implib_fallback_core ()\n{\n  $opt_debug\n  match_literal=`$ECHO \"$1\" | $SED \"$sed_make_literal_regex\"`\n  $OBJDUMP -s --section \"$1\" \"$2\" 2>/dev/null |\n    $SED '/^Contents of section '\"$match_literal\"':/{\n      # Place marker at beginning of archive member dllname section\n      s/.*/====MARK====/\n      p\n      d\n    }\n    # These lines can sometimes be longer than 43 characters, but\n    # are always uninteresting\n    /:[\t ]*file format pe[i]\\{,1\\}-/d\n    /^In archive [^:]*:/d\n    # Ensure marker is printed\n    /^====MARK====/p\n    # Remove all lines with less than 43 characters\n    /^.\\{43\\}/!d\n    # From remaining lines, remove first 43 characters\n    s/^.\\{43\\}//' |\n    $SED -n '\n      # Join marker and all lines until next marker into a single line\n      /^====MARK====/ b para\n      H\n      $ b para\n      b\n      :para\n      x\n      s/\\n//g\n      # Remove the marker\n      s/^====MARK====//\n      # Remove trailing dots and whitespace\n      s/[\\. \\t]*$//\n      # Print\n      /./p' |\n    # we now have a list, one entry per line, of the stringified\n    # contents of the appropriate section of all members of the\n    # archive which possess that section. Heuristic: eliminate\n    # all those which have a first or second character that is\n    # a '.' (that is, objdump's representation of an unprintable\n    # character.) This should work for all archives with less than\n    # 0x302f exports -- but will fail for DLLs whose name actually\n    # begins with a literal '.' or a single character followed by\n    # a '.'.\n    #\n    # Of those that remain, print the first one.\n    $SED -e '/^\\./d;/^.\\./d;q'\n}\n\n# func_cygming_gnu_implib_p ARG\n# This predicate returns with zero status (TRUE) if\n# ARG is a GNU/binutils-style import library. Returns\n# with nonzero status (FALSE) otherwise.\nfunc_cygming_gnu_implib_p ()\n{\n  $opt_debug\n  func_to_tool_file \"$1\" func_convert_file_msys_to_w32\n  func_cygming_gnu_implib_tmp=`$NM \"$func_to_tool_file_result\" | eval \"$global_symbol_pipe\" | $EGREP ' (_head_[A-Za-z0-9_]+_[ad]l*|[A-Za-z0-9_]+_[ad]l*_iname)$'`\n  test -n \"$func_cygming_gnu_implib_tmp\"\n}\n\n# func_cygming_ms_implib_p ARG\n# This predicate returns with zero status (TRUE) if\n# ARG is an MS-style import library. Returns\n# with nonzero status (FALSE) otherwise.\nfunc_cygming_ms_implib_p ()\n{\n  $opt_debug\n  func_to_tool_file \"$1\" func_convert_file_msys_to_w32\n  func_cygming_ms_implib_tmp=`$NM \"$func_to_tool_file_result\" | eval \"$global_symbol_pipe\" | $GREP '_NULL_IMPORT_DESCRIPTOR'`\n  test -n \"$func_cygming_ms_implib_tmp\"\n}\n\n# func_cygming_dll_for_implib_fallback ARG\n# Platform-specific function to extract the\n# name of the DLL associated with the specified\n# import library ARG.\n#\n# This fallback implementation is for use when $DLLTOOL\n# does not support the --identify-strict option.\n# Invoked by eval'ing the libtool variable\n#    $sharedlib_from_linklib_cmd\n# Result is available in the variable\n#    $sharedlib_from_linklib_result\nfunc_cygming_dll_for_implib_fallback ()\n{\n  $opt_debug\n  if func_cygming_gnu_implib_p \"$1\" ; then\n    # binutils import library\n    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$7' \"$1\"`\n  elif func_cygming_ms_implib_p \"$1\" ; then\n    # ms-generated import library\n    sharedlib_from_linklib_result=`func_cygming_dll_for_implib_fallback_core '.idata$6' \"$1\"`\n  else\n    # unknown\n    sharedlib_from_linklib_result=\"\"\n  fi\n}\n\n\n# func_extract_an_archive dir oldlib\nfunc_extract_an_archive ()\n{\n    $opt_debug\n    f_ex_an_ar_dir=\"$1\"; shift\n    f_ex_an_ar_oldlib=\"$1\"\n    if test \"$lock_old_archive_extraction\" = yes; then\n      lockfile=$f_ex_an_ar_oldlib.lock\n      until $opt_dry_run || ln \"$progpath\" \"$lockfile\" 2>/dev/null; do\n\tfunc_echo \"Waiting for $lockfile to be removed\"\n\tsleep 2\n      done\n    fi\n    func_show_eval \"(cd \\$f_ex_an_ar_dir && $AR x \\\"\\$f_ex_an_ar_oldlib\\\")\" \\\n\t\t   'stat=$?; rm -f \"$lockfile\"; exit $stat'\n    if test \"$lock_old_archive_extraction\" = yes; then\n      $opt_dry_run || rm -f \"$lockfile\"\n    fi\n    if ($AR t \"$f_ex_an_ar_oldlib\" | sort | sort -uc >/dev/null 2>&1); then\n     :\n    else\n      func_fatal_error \"object name conflicts in archive: $f_ex_an_ar_dir/$f_ex_an_ar_oldlib\"\n    fi\n}\n\n\n# func_extract_archives gentop oldlib ...\nfunc_extract_archives ()\n{\n    $opt_debug\n    my_gentop=\"$1\"; shift\n    my_oldlibs=${1+\"$@\"}\n    my_oldobjs=\"\"\n    my_xlib=\"\"\n    my_xabs=\"\"\n    my_xdir=\"\"\n\n    for my_xlib in $my_oldlibs; do\n      # Extract the objects.\n      case $my_xlib in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) my_xabs=\"$my_xlib\" ;;\n\t*) my_xabs=`pwd`\"/$my_xlib\" ;;\n      esac\n      func_basename \"$my_xlib\"\n      my_xlib=\"$func_basename_result\"\n      my_xlib_u=$my_xlib\n      while :; do\n        case \" $extracted_archives \" in\n\t*\" $my_xlib_u \"*)\n\t  func_arith $extracted_serial + 1\n\t  extracted_serial=$func_arith_result\n\t  my_xlib_u=lt$extracted_serial-$my_xlib ;;\n\t*) break ;;\n\tesac\n      done\n      extracted_archives=\"$extracted_archives $my_xlib_u\"\n      my_xdir=\"$my_gentop/$my_xlib_u\"\n\n      func_mkdir_p \"$my_xdir\"\n\n      case $host in\n      *-darwin*)\n\tfunc_verbose \"Extracting $my_xabs\"\n\t# Do not bother doing anything if just a dry run\n\t$opt_dry_run || {\n\t  darwin_orig_dir=`pwd`\n\t  cd $my_xdir || exit $?\n\t  darwin_archive=$my_xabs\n\t  darwin_curdir=`pwd`\n\t  darwin_base_archive=`basename \"$darwin_archive\"`\n\t  darwin_arches=`$LIPO -info \"$darwin_archive\" 2>/dev/null | $GREP Architectures 2>/dev/null || true`\n\t  if test -n \"$darwin_arches\"; then\n\t    darwin_arches=`$ECHO \"$darwin_arches\" | $SED -e 's/.*are://'`\n\t    darwin_arch=\n\t    func_verbose \"$darwin_base_archive has multiple architectures $darwin_arches\"\n\t    for darwin_arch in  $darwin_arches ; do\n\t      func_mkdir_p \"unfat-$$/${darwin_base_archive}-${darwin_arch}\"\n\t      $LIPO -thin $darwin_arch -output \"unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}\" \"${darwin_archive}\"\n\t      cd \"unfat-$$/${darwin_base_archive}-${darwin_arch}\"\n\t      func_extract_an_archive \"`pwd`\" \"${darwin_base_archive}\"\n\t      cd \"$darwin_curdir\"\n\t      $RM \"unfat-$$/${darwin_base_archive}-${darwin_arch}/${darwin_base_archive}\"\n\t    done # $darwin_arches\n            ## Okay now we've a bunch of thin objects, gotta fatten them up :)\n\t    darwin_filelist=`find unfat-$$ -type f -name \\*.o -print -o -name \\*.lo -print | $SED -e \"$basename\" | sort -u`\n\t    darwin_file=\n\t    darwin_files=\n\t    for darwin_file in $darwin_filelist; do\n\t      darwin_files=`find unfat-$$ -name $darwin_file -print | sort | $NL2SP`\n\t      $LIPO -create -output \"$darwin_file\" $darwin_files\n\t    done # $darwin_filelist\n\t    $RM -rf unfat-$$\n\t    cd \"$darwin_orig_dir\"\n\t  else\n\t    cd $darwin_orig_dir\n\t    func_extract_an_archive \"$my_xdir\" \"$my_xabs\"\n\t  fi # $darwin_arches\n\t} # !$opt_dry_run\n\t;;\n      *)\n        func_extract_an_archive \"$my_xdir\" \"$my_xabs\"\n\t;;\n      esac\n      my_oldobjs=\"$my_oldobjs \"`find $my_xdir -name \\*.$objext -print -o -name \\*.lo -print | sort | $NL2SP`\n    done\n\n    func_extract_archives_result=\"$my_oldobjs\"\n}\n\n\n# func_emit_wrapper [arg=no]\n#\n# Emit a libtool wrapper script on stdout.\n# Don't directly open a file because we may want to\n# incorporate the script contents within a cygwin/mingw\n# wrapper executable.  Must ONLY be called from within\n# func_mode_link because it depends on a number of variables\n# set therein.\n#\n# ARG is the value that the WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\n# variable will take.  If 'yes', then the emitted script\n# will assume that the directory in which it is stored is\n# the $objdir directory.  This is a cygwin/mingw-specific\n# behavior.\nfunc_emit_wrapper ()\n{\n\tfunc_emit_wrapper_arg1=${1-no}\n\n\t$ECHO \"\\\n#! $SHELL\n\n# $output - temporary wrapper script for $objdir/$outputname\n# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n#\n# The $output program cannot be directly executed until all the libtool\n# libraries that it depends on are installed.\n#\n# This wrapper script should never be moved out of the build directory.\n# If it is, it will not operate correctly.\n\n# Sed substitution that helps us do robust quoting.  It backslashifies\n# metacharacters that are still active within double-quoted strings.\nsed_quote_subst='$sed_quote_subst'\n\n# Be Bourne compatible\nif test -n \\\"\\${ZSH_VERSION+set}\\\" && (emulate sh) >/dev/null 2>&1; then\n  emulate sh\n  NULLCMD=:\n  # Zsh 3.x and 4.x performs word splitting on \\${1+\\\"\\$@\\\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '\\${1+\\\"\\$@\\\"}'='\\\"\\$@\\\"'\n  setopt NO_GLOB_SUBST\nelse\n  case \\`(set -o) 2>/dev/null\\` in *posix*) set -o posix;; esac\nfi\nBIN_SH=xpg4; export BIN_SH # for Tru64\nDUALCASE=1; export DUALCASE # for MKS sh\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nrelink_command=\\\"$relink_command\\\"\n\n# This environment variable determines our operation mode.\nif test \\\"\\$libtool_install_magic\\\" = \\\"$magic\\\"; then\n  # install mode needs the following variables:\n  generated_by_libtool_version='$macro_version'\n  notinst_deplibs='$notinst_deplibs'\nelse\n  # When we are sourced in execute mode, \\$file and \\$ECHO are already set.\n  if test \\\"\\$libtool_execute_magic\\\" != \\\"$magic\\\"; then\n    file=\\\"\\$0\\\"\"\n\n    qECHO=`$ECHO \"$ECHO\" | $SED \"$sed_quote_subst\"`\n    $ECHO \"\\\n\n# A function that is used when there is no print builtin or printf.\nfunc_fallback_echo ()\n{\n  eval 'cat <<_LTECHO_EOF\n\\$1\n_LTECHO_EOF'\n}\n    ECHO=\\\"$qECHO\\\"\n  fi\n\n# Very basic option parsing. These options are (a) specific to\n# the libtool wrapper, (b) are identical between the wrapper\n# /script/ and the wrapper /executable/ which is used only on\n# windows platforms, and (c) all begin with the string \"--lt-\"\n# (application programs are unlikely to have options which match\n# this pattern).\n#\n# There are only two supported options: --lt-debug and\n# --lt-dump-script. There is, deliberately, no --lt-help.\n#\n# The first argument to this parsing function should be the\n# script's $0 value, followed by \"$@\".\nlt_option_debug=\nfunc_parse_lt_options ()\n{\n  lt_script_arg0=\\$0\n  shift\n  for lt_opt\n  do\n    case \\\"\\$lt_opt\\\" in\n    --lt-debug) lt_option_debug=1 ;;\n    --lt-dump-script)\n        lt_dump_D=\\`\\$ECHO \\\"X\\$lt_script_arg0\\\" | $SED -e 's/^X//' -e 's%/[^/]*$%%'\\`\n        test \\\"X\\$lt_dump_D\\\" = \\\"X\\$lt_script_arg0\\\" && lt_dump_D=.\n        lt_dump_F=\\`\\$ECHO \\\"X\\$lt_script_arg0\\\" | $SED -e 's/^X//' -e 's%^.*/%%'\\`\n        cat \\\"\\$lt_dump_D/\\$lt_dump_F\\\"\n        exit 0\n      ;;\n    --lt-*)\n        \\$ECHO \\\"Unrecognized --lt- option: '\\$lt_opt'\\\" 1>&2\n        exit 1\n      ;;\n    esac\n  done\n\n  # Print the debug banner immediately:\n  if test -n \\\"\\$lt_option_debug\\\"; then\n    echo \\\"${outputname}:${output}:\\${LINENO}: libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\\\" 1>&2\n  fi\n}\n\n# Used when --lt-debug. Prints its arguments to stdout\n# (redirection is the responsibility of the caller)\nfunc_lt_dump_args ()\n{\n  lt_dump_args_N=1;\n  for lt_arg\n  do\n    \\$ECHO \\\"${outputname}:${output}:\\${LINENO}: newargv[\\$lt_dump_args_N]: \\$lt_arg\\\"\n    lt_dump_args_N=\\`expr \\$lt_dump_args_N + 1\\`\n  done\n}\n\n# Core function for launching the target application\nfunc_exec_program_core ()\n{\n\"\n  case $host in\n  # Backslashes separate directories on plain windows\n  *-*-mingw | *-*-os2* | *-cegcc*)\n    $ECHO \"\\\n      if test -n \\\"\\$lt_option_debug\\\"; then\n        \\$ECHO \\\"${outputname}:${output}:\\${LINENO}: newargv[0]: \\$progdir\\\\\\\\\\$program\\\" 1>&2\n        func_lt_dump_args \\${1+\\\"\\$@\\\"} 1>&2\n      fi\n      exec \\\"\\$progdir\\\\\\\\\\$program\\\" \\${1+\\\"\\$@\\\"}\n\"\n    ;;\n\n  *)\n    $ECHO \"\\\n      if test -n \\\"\\$lt_option_debug\\\"; then\n        \\$ECHO \\\"${outputname}:${output}:\\${LINENO}: newargv[0]: \\$progdir/\\$program\\\" 1>&2\n        func_lt_dump_args \\${1+\\\"\\$@\\\"} 1>&2\n      fi\n      exec \\\"\\$progdir/\\$program\\\" \\${1+\\\"\\$@\\\"}\n\"\n    ;;\n  esac\n  $ECHO \"\\\n      \\$ECHO \\\"\\$0: cannot exec \\$program \\$*\\\" 1>&2\n      exit 1\n}\n\n# A function to encapsulate launching the target application\n# Strips options in the --lt-* namespace from \\$@ and\n# launches target application with the remaining arguments.\nfunc_exec_program ()\n{\n  case \\\" \\$* \\\" in\n  *\\\\ --lt-*)\n    for lt_wr_arg\n    do\n      case \\$lt_wr_arg in\n      --lt-*) ;;\n      *) set x \\\"\\$@\\\" \\\"\\$lt_wr_arg\\\"; shift;;\n      esac\n      shift\n    done ;;\n  esac\n  func_exec_program_core \\${1+\\\"\\$@\\\"}\n}\n\n  # Parse options\n  func_parse_lt_options \\\"\\$0\\\" \\${1+\\\"\\$@\\\"}\n\n  # Find the directory that this script lives in.\n  thisdir=\\`\\$ECHO \\\"\\$file\\\" | $SED 's%/[^/]*$%%'\\`\n  test \\\"x\\$thisdir\\\" = \\\"x\\$file\\\" && thisdir=.\n\n  # Follow symbolic links until we get to the real thisdir.\n  file=\\`ls -ld \\\"\\$file\\\" | $SED -n 's/.*-> //p'\\`\n  while test -n \\\"\\$file\\\"; do\n    destdir=\\`\\$ECHO \\\"\\$file\\\" | $SED 's%/[^/]*\\$%%'\\`\n\n    # If there was a directory component, then change thisdir.\n    if test \\\"x\\$destdir\\\" != \\\"x\\$file\\\"; then\n      case \\\"\\$destdir\\\" in\n      [\\\\\\\\/]* | [A-Za-z]:[\\\\\\\\/]*) thisdir=\\\"\\$destdir\\\" ;;\n      *) thisdir=\\\"\\$thisdir/\\$destdir\\\" ;;\n      esac\n    fi\n\n    file=\\`\\$ECHO \\\"\\$file\\\" | $SED 's%^.*/%%'\\`\n    file=\\`ls -ld \\\"\\$thisdir/\\$file\\\" | $SED -n 's/.*-> //p'\\`\n  done\n\n  # Usually 'no', except on cygwin/mingw when embedded into\n  # the cwrapper.\n  WRAPPER_SCRIPT_BELONGS_IN_OBJDIR=$func_emit_wrapper_arg1\n  if test \\\"\\$WRAPPER_SCRIPT_BELONGS_IN_OBJDIR\\\" = \\\"yes\\\"; then\n    # special case for '.'\n    if test \\\"\\$thisdir\\\" = \\\".\\\"; then\n      thisdir=\\`pwd\\`\n    fi\n    # remove .libs from thisdir\n    case \\\"\\$thisdir\\\" in\n    *[\\\\\\\\/]$objdir ) thisdir=\\`\\$ECHO \\\"\\$thisdir\\\" | $SED 's%[\\\\\\\\/][^\\\\\\\\/]*$%%'\\` ;;\n    $objdir )   thisdir=. ;;\n    esac\n  fi\n\n  # Try to get the absolute directory name.\n  absdir=\\`cd \\\"\\$thisdir\\\" && pwd\\`\n  test -n \\\"\\$absdir\\\" && thisdir=\\\"\\$absdir\\\"\n\"\n\n\tif test \"$fast_install\" = yes; then\n\t  $ECHO \"\\\n  program=lt-'$outputname'$exeext\n  progdir=\\\"\\$thisdir/$objdir\\\"\n\n  if test ! -f \\\"\\$progdir/\\$program\\\" ||\n     { file=\\`ls -1dt \\\"\\$progdir/\\$program\\\" \\\"\\$progdir/../\\$program\\\" 2>/dev/null | ${SED} 1q\\`; \\\\\n       test \\\"X\\$file\\\" != \\\"X\\$progdir/\\$program\\\"; }; then\n\n    file=\\\"\\$\\$-\\$program\\\"\n\n    if test ! -d \\\"\\$progdir\\\"; then\n      $MKDIR \\\"\\$progdir\\\"\n    else\n      $RM \\\"\\$progdir/\\$file\\\"\n    fi\"\n\n\t  $ECHO \"\\\n\n    # relink executable if necessary\n    if test -n \\\"\\$relink_command\\\"; then\n      if relink_command_output=\\`eval \\$relink_command 2>&1\\`; then :\n      else\n\t$ECHO \\\"\\$relink_command_output\\\" >&2\n\t$RM \\\"\\$progdir/\\$file\\\"\n\texit 1\n      fi\n    fi\n\n    $MV \\\"\\$progdir/\\$file\\\" \\\"\\$progdir/\\$program\\\" 2>/dev/null ||\n    { $RM \\\"\\$progdir/\\$program\\\";\n      $MV \\\"\\$progdir/\\$file\\\" \\\"\\$progdir/\\$program\\\"; }\n    $RM \\\"\\$progdir/\\$file\\\"\n  fi\"\n\telse\n\t  $ECHO \"\\\n  program='$outputname'\n  progdir=\\\"\\$thisdir/$objdir\\\"\n\"\n\tfi\n\n\t$ECHO \"\\\n\n  if test -f \\\"\\$progdir/\\$program\\\"; then\"\n\n\t# fixup the dll searchpath if we need to.\n\t#\n\t# Fix the DLL searchpath if we need to.  Do this before prepending\n\t# to shlibpath, because on Windows, both are PATH and uninstalled\n\t# libraries must come first.\n\tif test -n \"$dllsearchpath\"; then\n\t  $ECHO \"\\\n    # Add the dll search path components to the executable PATH\n    PATH=$dllsearchpath:\\$PATH\n\"\n\tfi\n\n\t# Export our shlibpath_var if we have one.\n\tif test \"$shlibpath_overrides_runpath\" = yes && test -n \"$shlibpath_var\" && test -n \"$temp_rpath\"; then\n\t  $ECHO \"\\\n    # Add our own library path to $shlibpath_var\n    $shlibpath_var=\\\"$temp_rpath\\$$shlibpath_var\\\"\n\n    # Some systems cannot cope with colon-terminated $shlibpath_var\n    # The second colon is a workaround for a bug in BeOS R4 sed\n    $shlibpath_var=\\`\\$ECHO \\\"\\$$shlibpath_var\\\" | $SED 's/::*\\$//'\\`\n\n    export $shlibpath_var\n\"\n\tfi\n\n\t$ECHO \"\\\n    if test \\\"\\$libtool_execute_magic\\\" != \\\"$magic\\\"; then\n      # Run the actual program with our arguments.\n      func_exec_program \\${1+\\\"\\$@\\\"}\n    fi\n  else\n    # The program doesn't exist.\n    \\$ECHO \\\"\\$0: error: \\\\\\`\\$progdir/\\$program' does not exist\\\" 1>&2\n    \\$ECHO \\\"This script is just a wrapper for \\$program.\\\" 1>&2\n    \\$ECHO \\\"See the $PACKAGE documentation for more information.\\\" 1>&2\n    exit 1\n  fi\nfi\\\n\"\n}\n\n\n# func_emit_cwrapperexe_src\n# emit the source code for a wrapper executable on stdout\n# Must ONLY be called from within func_mode_link because\n# it depends on a number of variable set therein.\nfunc_emit_cwrapperexe_src ()\n{\n\tcat <<EOF\n\n/* $cwrappersource - temporary wrapper executable for $objdir/$outputname\n   Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n\n   The $output program cannot be directly executed until all the libtool\n   libraries that it depends on are installed.\n\n   This wrapper executable should never be moved out of the build directory.\n   If it is, it will not operate correctly.\n*/\nEOF\n\t    cat <<\"EOF\"\n#ifdef _MSC_VER\n# define _CRT_SECURE_NO_DEPRECATE 1\n#endif\n#include <stdio.h>\n#include <stdlib.h>\n#ifdef _MSC_VER\n# include <direct.h>\n# include <process.h>\n# include <io.h>\n#else\n# include <unistd.h>\n# include <stdint.h>\n# ifdef __CYGWIN__\n#  include <io.h>\n# endif\n#endif\n#include <malloc.h>\n#include <stdarg.h>\n#include <assert.h>\n#include <string.h>\n#include <ctype.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <sys/stat.h>\n\n/* declarations of non-ANSI functions */\n#if defined(__MINGW32__)\n# ifdef __STRICT_ANSI__\nint _putenv (const char *);\n# endif\n#elif defined(__CYGWIN__)\n# ifdef __STRICT_ANSI__\nchar *realpath (const char *, char *);\nint putenv (char *);\nint setenv (const char *, const char *, int);\n# endif\n/* #elif defined (other platforms) ... */\n#endif\n\n/* portability defines, excluding path handling macros */\n#if defined(_MSC_VER)\n# define setmode _setmode\n# define stat    _stat\n# define chmod   _chmod\n# define getcwd  _getcwd\n# define putenv  _putenv\n# define S_IXUSR _S_IEXEC\n# ifndef _INTPTR_T_DEFINED\n#  define _INTPTR_T_DEFINED\n#  define intptr_t int\n# endif\n#elif defined(__MINGW32__)\n# define setmode _setmode\n# define stat    _stat\n# define chmod   _chmod\n# define getcwd  _getcwd\n# define putenv  _putenv\n#elif defined(__CYGWIN__)\n# define HAVE_SETENV\n# define FOPEN_WB \"wb\"\n/* #elif defined (other platforms) ... */\n#endif\n\n#if defined(PATH_MAX)\n# define LT_PATHMAX PATH_MAX\n#elif defined(MAXPATHLEN)\n# define LT_PATHMAX MAXPATHLEN\n#else\n# define LT_PATHMAX 1024\n#endif\n\n#ifndef S_IXOTH\n# define S_IXOTH 0\n#endif\n#ifndef S_IXGRP\n# define S_IXGRP 0\n#endif\n\n/* path handling portability macros */\n#ifndef DIR_SEPARATOR\n# define DIR_SEPARATOR '/'\n# define PATH_SEPARATOR ':'\n#endif\n\n#if defined (_WIN32) || defined (__MSDOS__) || defined (__DJGPP__) || \\\n  defined (__OS2__)\n# define HAVE_DOS_BASED_FILE_SYSTEM\n# define FOPEN_WB \"wb\"\n# ifndef DIR_SEPARATOR_2\n#  define DIR_SEPARATOR_2 '\\\\'\n# endif\n# ifndef PATH_SEPARATOR_2\n#  define PATH_SEPARATOR_2 ';'\n# endif\n#endif\n\n#ifndef DIR_SEPARATOR_2\n# define IS_DIR_SEPARATOR(ch) ((ch) == DIR_SEPARATOR)\n#else /* DIR_SEPARATOR_2 */\n# define IS_DIR_SEPARATOR(ch) \\\n\t(((ch) == DIR_SEPARATOR) || ((ch) == DIR_SEPARATOR_2))\n#endif /* DIR_SEPARATOR_2 */\n\n#ifndef PATH_SEPARATOR_2\n# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR)\n#else /* PATH_SEPARATOR_2 */\n# define IS_PATH_SEPARATOR(ch) ((ch) == PATH_SEPARATOR_2)\n#endif /* PATH_SEPARATOR_2 */\n\n#ifndef FOPEN_WB\n# define FOPEN_WB \"w\"\n#endif\n#ifndef _O_BINARY\n# define _O_BINARY 0\n#endif\n\n#define XMALLOC(type, num)      ((type *) xmalloc ((num) * sizeof(type)))\n#define XFREE(stale) do { \\\n  if (stale) { free ((void *) stale); stale = 0; } \\\n} while (0)\n\n#if defined(LT_DEBUGWRAPPER)\nstatic int lt_debug = 1;\n#else\nstatic int lt_debug = 0;\n#endif\n\nconst char *program_name = \"libtool-wrapper\"; /* in case xstrdup fails */\n\nvoid *xmalloc (size_t num);\nchar *xstrdup (const char *string);\nconst char *base_name (const char *name);\nchar *find_executable (const char *wrapper);\nchar *chase_symlinks (const char *pathspec);\nint make_executable (const char *path);\nint check_executable (const char *path);\nchar *strendzap (char *str, const char *pat);\nvoid lt_debugprintf (const char *file, int line, const char *fmt, ...);\nvoid lt_fatal (const char *file, int line, const char *message, ...);\nstatic const char *nonnull (const char *s);\nstatic const char *nonempty (const char *s);\nvoid lt_setenv (const char *name, const char *value);\nchar *lt_extend_str (const char *orig_value, const char *add, int to_end);\nvoid lt_update_exe_path (const char *name, const char *value);\nvoid lt_update_lib_path (const char *name, const char *value);\nchar **prepare_spawn (char **argv);\nvoid lt_dump_script (FILE *f);\nEOF\n\n\t    cat <<EOF\nvolatile const char * MAGIC_EXE = \"$magic_exe\";\nconst char * LIB_PATH_VARNAME = \"$shlibpath_var\";\nEOF\n\n\t    if test \"$shlibpath_overrides_runpath\" = yes && test -n \"$shlibpath_var\" && test -n \"$temp_rpath\"; then\n              func_to_host_path \"$temp_rpath\"\n\t      cat <<EOF\nconst char * LIB_PATH_VALUE   = \"$func_to_host_path_result\";\nEOF\n\t    else\n\t      cat <<\"EOF\"\nconst char * LIB_PATH_VALUE   = \"\";\nEOF\n\t    fi\n\n\t    if test -n \"$dllsearchpath\"; then\n              func_to_host_path \"$dllsearchpath:\"\n\t      cat <<EOF\nconst char * EXE_PATH_VARNAME = \"PATH\";\nconst char * EXE_PATH_VALUE   = \"$func_to_host_path_result\";\nEOF\n\t    else\n\t      cat <<\"EOF\"\nconst char * EXE_PATH_VARNAME = \"\";\nconst char * EXE_PATH_VALUE   = \"\";\nEOF\n\t    fi\n\n\t    if test \"$fast_install\" = yes; then\n\t      cat <<EOF\nconst char * TARGET_PROGRAM_NAME = \"lt-$outputname\"; /* hopefully, no .exe */\nEOF\n\t    else\n\t      cat <<EOF\nconst char * TARGET_PROGRAM_NAME = \"$outputname\"; /* hopefully, no .exe */\nEOF\n\t    fi\n\n\n\t    cat <<\"EOF\"\n\n#define LTWRAPPER_OPTION_PREFIX         \"--lt-\"\n\nstatic const char *ltwrapper_option_prefix = LTWRAPPER_OPTION_PREFIX;\nstatic const char *dumpscript_opt       = LTWRAPPER_OPTION_PREFIX \"dump-script\";\nstatic const char *debug_opt            = LTWRAPPER_OPTION_PREFIX \"debug\";\n\nint\nmain (int argc, char *argv[])\n{\n  char **newargz;\n  int  newargc;\n  char *tmp_pathspec;\n  char *actual_cwrapper_path;\n  char *actual_cwrapper_name;\n  char *target_name;\n  char *lt_argv_zero;\n  intptr_t rval = 127;\n\n  int i;\n\n  program_name = (char *) xstrdup (base_name (argv[0]));\n  newargz = XMALLOC (char *, argc + 1);\n\n  /* very simple arg parsing; don't want to rely on getopt\n   * also, copy all non cwrapper options to newargz, except\n   * argz[0], which is handled differently\n   */\n  newargc=0;\n  for (i = 1; i < argc; i++)\n    {\n      if (strcmp (argv[i], dumpscript_opt) == 0)\n\t{\nEOF\n\t    case \"$host\" in\n\t      *mingw* | *cygwin* )\n\t\t# make stdout use \"unix\" line endings\n\t\techo \"          setmode(1,_O_BINARY);\"\n\t\t;;\n\t      esac\n\n\t    cat <<\"EOF\"\n\t  lt_dump_script (stdout);\n\t  return 0;\n\t}\n      if (strcmp (argv[i], debug_opt) == 0)\n\t{\n          lt_debug = 1;\n          continue;\n\t}\n      if (strcmp (argv[i], ltwrapper_option_prefix) == 0)\n        {\n          /* however, if there is an option in the LTWRAPPER_OPTION_PREFIX\n             namespace, but it is not one of the ones we know about and\n             have already dealt with, above (inluding dump-script), then\n             report an error. Otherwise, targets might begin to believe\n             they are allowed to use options in the LTWRAPPER_OPTION_PREFIX\n             namespace. The first time any user complains about this, we'll\n             need to make LTWRAPPER_OPTION_PREFIX a configure-time option\n             or a configure.ac-settable value.\n           */\n          lt_fatal (__FILE__, __LINE__,\n\t\t    \"unrecognized %s option: '%s'\",\n                    ltwrapper_option_prefix, argv[i]);\n        }\n      /* otherwise ... */\n      newargz[++newargc] = xstrdup (argv[i]);\n    }\n  newargz[++newargc] = NULL;\n\nEOF\n\t    cat <<EOF\n  /* The GNU banner must be the first non-error debug message */\n  lt_debugprintf (__FILE__, __LINE__, \"libtool wrapper (GNU $PACKAGE$TIMESTAMP) $VERSION\\n\");\nEOF\n\t    cat <<\"EOF\"\n  lt_debugprintf (__FILE__, __LINE__, \"(main) argv[0]: %s\\n\", argv[0]);\n  lt_debugprintf (__FILE__, __LINE__, \"(main) program_name: %s\\n\", program_name);\n\n  tmp_pathspec = find_executable (argv[0]);\n  if (tmp_pathspec == NULL)\n    lt_fatal (__FILE__, __LINE__, \"couldn't find %s\", argv[0]);\n  lt_debugprintf (__FILE__, __LINE__,\n                  \"(main) found exe (before symlink chase) at: %s\\n\",\n\t\t  tmp_pathspec);\n\n  actual_cwrapper_path = chase_symlinks (tmp_pathspec);\n  lt_debugprintf (__FILE__, __LINE__,\n                  \"(main) found exe (after symlink chase) at: %s\\n\",\n\t\t  actual_cwrapper_path);\n  XFREE (tmp_pathspec);\n\n  actual_cwrapper_name = xstrdup (base_name (actual_cwrapper_path));\n  strendzap (actual_cwrapper_path, actual_cwrapper_name);\n\n  /* wrapper name transforms */\n  strendzap (actual_cwrapper_name, \".exe\");\n  tmp_pathspec = lt_extend_str (actual_cwrapper_name, \".exe\", 1);\n  XFREE (actual_cwrapper_name);\n  actual_cwrapper_name = tmp_pathspec;\n  tmp_pathspec = 0;\n\n  /* target_name transforms -- use actual target program name; might have lt- prefix */\n  target_name = xstrdup (base_name (TARGET_PROGRAM_NAME));\n  strendzap (target_name, \".exe\");\n  tmp_pathspec = lt_extend_str (target_name, \".exe\", 1);\n  XFREE (target_name);\n  target_name = tmp_pathspec;\n  tmp_pathspec = 0;\n\n  lt_debugprintf (__FILE__, __LINE__,\n\t\t  \"(main) libtool target name: %s\\n\",\n\t\t  target_name);\nEOF\n\n\t    cat <<EOF\n  newargz[0] =\n    XMALLOC (char, (strlen (actual_cwrapper_path) +\n\t\t    strlen (\"$objdir\") + 1 + strlen (actual_cwrapper_name) + 1));\n  strcpy (newargz[0], actual_cwrapper_path);\n  strcat (newargz[0], \"$objdir\");\n  strcat (newargz[0], \"/\");\nEOF\n\n\t    cat <<\"EOF\"\n  /* stop here, and copy so we don't have to do this twice */\n  tmp_pathspec = xstrdup (newargz[0]);\n\n  /* do NOT want the lt- prefix here, so use actual_cwrapper_name */\n  strcat (newargz[0], actual_cwrapper_name);\n\n  /* DO want the lt- prefix here if it exists, so use target_name */\n  lt_argv_zero = lt_extend_str (tmp_pathspec, target_name, 1);\n  XFREE (tmp_pathspec);\n  tmp_pathspec = NULL;\nEOF\n\n\t    case $host_os in\n\t      mingw*)\n\t    cat <<\"EOF\"\n  {\n    char* p;\n    while ((p = strchr (newargz[0], '\\\\')) != NULL)\n      {\n\t*p = '/';\n      }\n    while ((p = strchr (lt_argv_zero, '\\\\')) != NULL)\n      {\n\t*p = '/';\n      }\n  }\nEOF\n\t    ;;\n\t    esac\n\n\t    cat <<\"EOF\"\n  XFREE (target_name);\n  XFREE (actual_cwrapper_path);\n  XFREE (actual_cwrapper_name);\n\n  lt_setenv (\"BIN_SH\", \"xpg4\"); /* for Tru64 */\n  lt_setenv (\"DUALCASE\", \"1\");  /* for MSK sh */\n  /* Update the DLL searchpath.  EXE_PATH_VALUE ($dllsearchpath) must\n     be prepended before (that is, appear after) LIB_PATH_VALUE ($temp_rpath)\n     because on Windows, both *_VARNAMEs are PATH but uninstalled\n     libraries must come first. */\n  lt_update_exe_path (EXE_PATH_VARNAME, EXE_PATH_VALUE);\n  lt_update_lib_path (LIB_PATH_VARNAME, LIB_PATH_VALUE);\n\n  lt_debugprintf (__FILE__, __LINE__, \"(main) lt_argv_zero: %s\\n\",\n\t\t  nonnull (lt_argv_zero));\n  for (i = 0; i < newargc; i++)\n    {\n      lt_debugprintf (__FILE__, __LINE__, \"(main) newargz[%d]: %s\\n\",\n\t\t      i, nonnull (newargz[i]));\n    }\n\nEOF\n\n\t    case $host_os in\n\t      mingw*)\n\t\tcat <<\"EOF\"\n  /* execv doesn't actually work on mingw as expected on unix */\n  newargz = prepare_spawn (newargz);\n  rval = _spawnv (_P_WAIT, lt_argv_zero, (const char * const *) newargz);\n  if (rval == -1)\n    {\n      /* failed to start process */\n      lt_debugprintf (__FILE__, __LINE__,\n\t\t      \"(main) failed to launch target \\\"%s\\\": %s\\n\",\n\t\t      lt_argv_zero, nonnull (strerror (errno)));\n      return 127;\n    }\n  return rval;\nEOF\n\t\t;;\n\t      *)\n\t\tcat <<\"EOF\"\n  execv (lt_argv_zero, newargz);\n  return rval; /* =127, but avoids unused variable warning */\nEOF\n\t\t;;\n\t    esac\n\n\t    cat <<\"EOF\"\n}\n\nvoid *\nxmalloc (size_t num)\n{\n  void *p = (void *) malloc (num);\n  if (!p)\n    lt_fatal (__FILE__, __LINE__, \"memory exhausted\");\n\n  return p;\n}\n\nchar *\nxstrdup (const char *string)\n{\n  return string ? strcpy ((char *) xmalloc (strlen (string) + 1),\n\t\t\t  string) : NULL;\n}\n\nconst char *\nbase_name (const char *name)\n{\n  const char *base;\n\n#if defined (HAVE_DOS_BASED_FILE_SYSTEM)\n  /* Skip over the disk name in MSDOS pathnames. */\n  if (isalpha ((unsigned char) name[0]) && name[1] == ':')\n    name += 2;\n#endif\n\n  for (base = name; *name; name++)\n    if (IS_DIR_SEPARATOR (*name))\n      base = name + 1;\n  return base;\n}\n\nint\ncheck_executable (const char *path)\n{\n  struct stat st;\n\n  lt_debugprintf (__FILE__, __LINE__, \"(check_executable): %s\\n\",\n                  nonempty (path));\n  if ((!path) || (!*path))\n    return 0;\n\n  if ((stat (path, &st) >= 0)\n      && (st.st_mode & (S_IXUSR | S_IXGRP | S_IXOTH)))\n    return 1;\n  else\n    return 0;\n}\n\nint\nmake_executable (const char *path)\n{\n  int rval = 0;\n  struct stat st;\n\n  lt_debugprintf (__FILE__, __LINE__, \"(make_executable): %s\\n\",\n                  nonempty (path));\n  if ((!path) || (!*path))\n    return 0;\n\n  if (stat (path, &st) >= 0)\n    {\n      rval = chmod (path, st.st_mode | S_IXOTH | S_IXGRP | S_IXUSR);\n    }\n  return rval;\n}\n\n/* Searches for the full path of the wrapper.  Returns\n   newly allocated full path name if found, NULL otherwise\n   Does not chase symlinks, even on platforms that support them.\n*/\nchar *\nfind_executable (const char *wrapper)\n{\n  int has_slash = 0;\n  const char *p;\n  const char *p_next;\n  /* static buffer for getcwd */\n  char tmp[LT_PATHMAX + 1];\n  int tmp_len;\n  char *concat_name;\n\n  lt_debugprintf (__FILE__, __LINE__, \"(find_executable): %s\\n\",\n                  nonempty (wrapper));\n\n  if ((wrapper == NULL) || (*wrapper == '\\0'))\n    return NULL;\n\n  /* Absolute path? */\n#if defined (HAVE_DOS_BASED_FILE_SYSTEM)\n  if (isalpha ((unsigned char) wrapper[0]) && wrapper[1] == ':')\n    {\n      concat_name = xstrdup (wrapper);\n      if (check_executable (concat_name))\n\treturn concat_name;\n      XFREE (concat_name);\n    }\n  else\n    {\n#endif\n      if (IS_DIR_SEPARATOR (wrapper[0]))\n\t{\n\t  concat_name = xstrdup (wrapper);\n\t  if (check_executable (concat_name))\n\t    return concat_name;\n\t  XFREE (concat_name);\n\t}\n#if defined (HAVE_DOS_BASED_FILE_SYSTEM)\n    }\n#endif\n\n  for (p = wrapper; *p; p++)\n    if (*p == '/')\n      {\n\thas_slash = 1;\n\tbreak;\n      }\n  if (!has_slash)\n    {\n      /* no slashes; search PATH */\n      const char *path = getenv (\"PATH\");\n      if (path != NULL)\n\t{\n\t  for (p = path; *p; p = p_next)\n\t    {\n\t      const char *q;\n\t      size_t p_len;\n\t      for (q = p; *q; q++)\n\t\tif (IS_PATH_SEPARATOR (*q))\n\t\t  break;\n\t      p_len = q - p;\n\t      p_next = (*q == '\\0' ? q : q + 1);\n\t      if (p_len == 0)\n\t\t{\n\t\t  /* empty path: current directory */\n\t\t  if (getcwd (tmp, LT_PATHMAX) == NULL)\n\t\t    lt_fatal (__FILE__, __LINE__, \"getcwd failed: %s\",\n                              nonnull (strerror (errno)));\n\t\t  tmp_len = strlen (tmp);\n\t\t  concat_name =\n\t\t    XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);\n\t\t  memcpy (concat_name, tmp, tmp_len);\n\t\t  concat_name[tmp_len] = '/';\n\t\t  strcpy (concat_name + tmp_len + 1, wrapper);\n\t\t}\n\t      else\n\t\t{\n\t\t  concat_name =\n\t\t    XMALLOC (char, p_len + 1 + strlen (wrapper) + 1);\n\t\t  memcpy (concat_name, p, p_len);\n\t\t  concat_name[p_len] = '/';\n\t\t  strcpy (concat_name + p_len + 1, wrapper);\n\t\t}\n\t      if (check_executable (concat_name))\n\t\treturn concat_name;\n\t      XFREE (concat_name);\n\t    }\n\t}\n      /* not found in PATH; assume curdir */\n    }\n  /* Relative path | not found in path: prepend cwd */\n  if (getcwd (tmp, LT_PATHMAX) == NULL)\n    lt_fatal (__FILE__, __LINE__, \"getcwd failed: %s\",\n              nonnull (strerror (errno)));\n  tmp_len = strlen (tmp);\n  concat_name = XMALLOC (char, tmp_len + 1 + strlen (wrapper) + 1);\n  memcpy (concat_name, tmp, tmp_len);\n  concat_name[tmp_len] = '/';\n  strcpy (concat_name + tmp_len + 1, wrapper);\n\n  if (check_executable (concat_name))\n    return concat_name;\n  XFREE (concat_name);\n  return NULL;\n}\n\nchar *\nchase_symlinks (const char *pathspec)\n{\n#ifndef S_ISLNK\n  return xstrdup (pathspec);\n#else\n  char buf[LT_PATHMAX];\n  struct stat s;\n  char *tmp_pathspec = xstrdup (pathspec);\n  char *p;\n  int has_symlinks = 0;\n  while (strlen (tmp_pathspec) && !has_symlinks)\n    {\n      lt_debugprintf (__FILE__, __LINE__,\n\t\t      \"checking path component for symlinks: %s\\n\",\n\t\t      tmp_pathspec);\n      if (lstat (tmp_pathspec, &s) == 0)\n\t{\n\t  if (S_ISLNK (s.st_mode) != 0)\n\t    {\n\t      has_symlinks = 1;\n\t      break;\n\t    }\n\n\t  /* search backwards for last DIR_SEPARATOR */\n\t  p = tmp_pathspec + strlen (tmp_pathspec) - 1;\n\t  while ((p > tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))\n\t    p--;\n\t  if ((p == tmp_pathspec) && (!IS_DIR_SEPARATOR (*p)))\n\t    {\n\t      /* no more DIR_SEPARATORS left */\n\t      break;\n\t    }\n\t  *p = '\\0';\n\t}\n      else\n\t{\n\t  lt_fatal (__FILE__, __LINE__,\n\t\t    \"error accessing file \\\"%s\\\": %s\",\n\t\t    tmp_pathspec, nonnull (strerror (errno)));\n\t}\n    }\n  XFREE (tmp_pathspec);\n\n  if (!has_symlinks)\n    {\n      return xstrdup (pathspec);\n    }\n\n  tmp_pathspec = realpath (pathspec, buf);\n  if (tmp_pathspec == 0)\n    {\n      lt_fatal (__FILE__, __LINE__,\n\t\t\"could not follow symlinks for %s\", pathspec);\n    }\n  return xstrdup (tmp_pathspec);\n#endif\n}\n\nchar *\nstrendzap (char *str, const char *pat)\n{\n  size_t len, patlen;\n\n  assert (str != NULL);\n  assert (pat != NULL);\n\n  len = strlen (str);\n  patlen = strlen (pat);\n\n  if (patlen <= len)\n    {\n      str += len - patlen;\n      if (strcmp (str, pat) == 0)\n\t*str = '\\0';\n    }\n  return str;\n}\n\nvoid\nlt_debugprintf (const char *file, int line, const char *fmt, ...)\n{\n  va_list args;\n  if (lt_debug)\n    {\n      (void) fprintf (stderr, \"%s:%s:%d: \", program_name, file, line);\n      va_start (args, fmt);\n      (void) vfprintf (stderr, fmt, args);\n      va_end (args);\n    }\n}\n\nstatic void\nlt_error_core (int exit_status, const char *file,\n\t       int line, const char *mode,\n\t       const char *message, va_list ap)\n{\n  fprintf (stderr, \"%s:%s:%d: %s: \", program_name, file, line, mode);\n  vfprintf (stderr, message, ap);\n  fprintf (stderr, \".\\n\");\n\n  if (exit_status >= 0)\n    exit (exit_status);\n}\n\nvoid\nlt_fatal (const char *file, int line, const char *message, ...)\n{\n  va_list ap;\n  va_start (ap, message);\n  lt_error_core (EXIT_FAILURE, file, line, \"FATAL\", message, ap);\n  va_end (ap);\n}\n\nstatic const char *\nnonnull (const char *s)\n{\n  return s ? s : \"(null)\";\n}\n\nstatic const char *\nnonempty (const char *s)\n{\n  return (s && !*s) ? \"(empty)\" : nonnull (s);\n}\n\nvoid\nlt_setenv (const char *name, const char *value)\n{\n  lt_debugprintf (__FILE__, __LINE__,\n\t\t  \"(lt_setenv) setting '%s' to '%s'\\n\",\n                  nonnull (name), nonnull (value));\n  {\n#ifdef HAVE_SETENV\n    /* always make a copy, for consistency with !HAVE_SETENV */\n    char *str = xstrdup (value);\n    setenv (name, str, 1);\n#else\n    int len = strlen (name) + 1 + strlen (value) + 1;\n    char *str = XMALLOC (char, len);\n    sprintf (str, \"%s=%s\", name, value);\n    if (putenv (str) != EXIT_SUCCESS)\n      {\n        XFREE (str);\n      }\n#endif\n  }\n}\n\nchar *\nlt_extend_str (const char *orig_value, const char *add, int to_end)\n{\n  char *new_value;\n  if (orig_value && *orig_value)\n    {\n      int orig_value_len = strlen (orig_value);\n      int add_len = strlen (add);\n      new_value = XMALLOC (char, add_len + orig_value_len + 1);\n      if (to_end)\n        {\n          strcpy (new_value, orig_value);\n          strcpy (new_value + orig_value_len, add);\n        }\n      else\n        {\n          strcpy (new_value, add);\n          strcpy (new_value + add_len, orig_value);\n        }\n    }\n  else\n    {\n      new_value = xstrdup (add);\n    }\n  return new_value;\n}\n\nvoid\nlt_update_exe_path (const char *name, const char *value)\n{\n  lt_debugprintf (__FILE__, __LINE__,\n\t\t  \"(lt_update_exe_path) modifying '%s' by prepending '%s'\\n\",\n                  nonnull (name), nonnull (value));\n\n  if (name && *name && value && *value)\n    {\n      char *new_value = lt_extend_str (getenv (name), value, 0);\n      /* some systems can't cope with a ':'-terminated path #' */\n      int len = strlen (new_value);\n      while (((len = strlen (new_value)) > 0) && IS_PATH_SEPARATOR (new_value[len-1]))\n        {\n          new_value[len-1] = '\\0';\n        }\n      lt_setenv (name, new_value);\n      XFREE (new_value);\n    }\n}\n\nvoid\nlt_update_lib_path (const char *name, const char *value)\n{\n  lt_debugprintf (__FILE__, __LINE__,\n\t\t  \"(lt_update_lib_path) modifying '%s' by prepending '%s'\\n\",\n                  nonnull (name), nonnull (value));\n\n  if (name && *name && value && *value)\n    {\n      char *new_value = lt_extend_str (getenv (name), value, 0);\n      lt_setenv (name, new_value);\n      XFREE (new_value);\n    }\n}\n\nEOF\n\t    case $host_os in\n\t      mingw*)\n\t\tcat <<\"EOF\"\n\n/* Prepares an argument vector before calling spawn().\n   Note that spawn() does not by itself call the command interpreter\n     (getenv (\"COMSPEC\") != NULL ? getenv (\"COMSPEC\") :\n      ({ OSVERSIONINFO v; v.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);\n         GetVersionEx(&v);\n         v.dwPlatformId == VER_PLATFORM_WIN32_NT;\n      }) ? \"cmd.exe\" : \"command.com\").\n   Instead it simply concatenates the arguments, separated by ' ', and calls\n   CreateProcess().  We must quote the arguments since Win32 CreateProcess()\n   interprets characters like ' ', '\\t', '\\\\', '\"' (but not '<' and '>') in a\n   special way:\n   - Space and tab are interpreted as delimiters. They are not treated as\n     delimiters if they are surrounded by double quotes: \"...\".\n   - Unescaped double quotes are removed from the input. Their only effect is\n     that within double quotes, space and tab are treated like normal\n     characters.\n   - Backslashes not followed by double quotes are not special.\n   - But 2*n+1 backslashes followed by a double quote become\n     n backslashes followed by a double quote (n >= 0):\n       \\\" -> \"\n       \\\\\\\" -> \\\"\n       \\\\\\\\\\\" -> \\\\\"\n */\n#define SHELL_SPECIAL_CHARS \"\\\"\\\\ \\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\"\n#define SHELL_SPACE_CHARS \" \\001\\002\\003\\004\\005\\006\\007\\010\\011\\012\\013\\014\\015\\016\\017\\020\\021\\022\\023\\024\\025\\026\\027\\030\\031\\032\\033\\034\\035\\036\\037\"\nchar **\nprepare_spawn (char **argv)\n{\n  size_t argc;\n  char **new_argv;\n  size_t i;\n\n  /* Count number of arguments.  */\n  for (argc = 0; argv[argc] != NULL; argc++)\n    ;\n\n  /* Allocate new argument vector.  */\n  new_argv = XMALLOC (char *, argc + 1);\n\n  /* Put quoted arguments into the new argument vector.  */\n  for (i = 0; i < argc; i++)\n    {\n      const char *string = argv[i];\n\n      if (string[0] == '\\0')\n\tnew_argv[i] = xstrdup (\"\\\"\\\"\");\n      else if (strpbrk (string, SHELL_SPECIAL_CHARS) != NULL)\n\t{\n\t  int quote_around = (strpbrk (string, SHELL_SPACE_CHARS) != NULL);\n\t  size_t length;\n\t  unsigned int backslashes;\n\t  const char *s;\n\t  char *quoted_string;\n\t  char *p;\n\n\t  length = 0;\n\t  backslashes = 0;\n\t  if (quote_around)\n\t    length++;\n\t  for (s = string; *s != '\\0'; s++)\n\t    {\n\t      char c = *s;\n\t      if (c == '\"')\n\t\tlength += backslashes + 1;\n\t      length++;\n\t      if (c == '\\\\')\n\t\tbackslashes++;\n\t      else\n\t\tbackslashes = 0;\n\t    }\n\t  if (quote_around)\n\t    length += backslashes + 1;\n\n\t  quoted_string = XMALLOC (char, length + 1);\n\n\t  p = quoted_string;\n\t  backslashes = 0;\n\t  if (quote_around)\n\t    *p++ = '\"';\n\t  for (s = string; *s != '\\0'; s++)\n\t    {\n\t      char c = *s;\n\t      if (c == '\"')\n\t\t{\n\t\t  unsigned int j;\n\t\t  for (j = backslashes + 1; j > 0; j--)\n\t\t    *p++ = '\\\\';\n\t\t}\n\t      *p++ = c;\n\t      if (c == '\\\\')\n\t\tbackslashes++;\n\t      else\n\t\tbackslashes = 0;\n\t    }\n\t  if (quote_around)\n\t    {\n\t      unsigned int j;\n\t      for (j = backslashes; j > 0; j--)\n\t\t*p++ = '\\\\';\n\t      *p++ = '\"';\n\t    }\n\t  *p = '\\0';\n\n\t  new_argv[i] = quoted_string;\n\t}\n      else\n\tnew_argv[i] = (char *) string;\n    }\n  new_argv[argc] = NULL;\n\n  return new_argv;\n}\nEOF\n\t\t;;\n\t    esac\n\n            cat <<\"EOF\"\nvoid lt_dump_script (FILE* f)\n{\nEOF\n\t    func_emit_wrapper yes |\n\t      $SED -n -e '\ns/^\\(.\\{79\\}\\)\\(..*\\)/\\1\\\n\\2/\nh\ns/\\([\\\\\"]\\)/\\\\\\1/g\ns/$/\\\\n/\ns/\\([^\\n]*\\).*/  fputs (\"\\1\", f);/p\ng\nD'\n            cat <<\"EOF\"\n}\nEOF\n}\n# end: func_emit_cwrapperexe_src\n\n# func_win32_import_lib_p ARG\n# True if ARG is an import lib, as indicated by $file_magic_cmd\nfunc_win32_import_lib_p ()\n{\n    $opt_debug\n    case `eval $file_magic_cmd \\\"\\$1\\\" 2>/dev/null | $SED -e 10q` in\n    *import*) : ;;\n    *) false ;;\n    esac\n}\n\n# func_mode_link arg...\nfunc_mode_link ()\n{\n    $opt_debug\n    case $host in\n    *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n      # It is impossible to link a dll without this setting, and\n      # we shouldn't force the makefile maintainer to figure out\n      # which system we are compiling for in order to pass an extra\n      # flag for every libtool invocation.\n      # allow_undefined=no\n\n      # FIXME: Unfortunately, there are problems with the above when trying\n      # to make a dll which has undefined symbols, in which case not\n      # even a static library is built.  For now, we need to specify\n      # -no-undefined on the libtool link line when we can be certain\n      # that all symbols are satisfied, otherwise we get a static library.\n      allow_undefined=yes\n      ;;\n    *)\n      allow_undefined=yes\n      ;;\n    esac\n    libtool_args=$nonopt\n    base_compile=\"$nonopt $@\"\n    compile_command=$nonopt\n    finalize_command=$nonopt\n\n    compile_rpath=\n    finalize_rpath=\n    compile_shlibpath=\n    finalize_shlibpath=\n    convenience=\n    old_convenience=\n    deplibs=\n    old_deplibs=\n    compiler_flags=\n    linker_flags=\n    dllsearchpath=\n    lib_search_path=`pwd`\n    inst_prefix_dir=\n    new_inherited_linker_flags=\n\n    avoid_version=no\n    bindir=\n    dlfiles=\n    dlprefiles=\n    dlself=no\n    export_dynamic=no\n    export_symbols=\n    export_symbols_regex=\n    generated=\n    libobjs=\n    ltlibs=\n    module=no\n    no_install=no\n    objs=\n    non_pic_objects=\n    precious_files_regex=\n    prefer_static_libs=no\n    preload=no\n    prev=\n    prevarg=\n    release=\n    rpath=\n    xrpath=\n    perm_rpath=\n    temp_rpath=\n    thread_safe=no\n    vinfo=\n    vinfo_number=no\n    weak_libs=\n    single_module=\"${wl}-single_module\"\n    func_infer_tag $base_compile\n\n    # We need to know -static, to get the right output filenames.\n    for arg\n    do\n      case $arg in\n      -shared)\n\ttest \"$build_libtool_libs\" != yes && \\\n\t  func_fatal_configuration \"can not build a shared library\"\n\tbuild_old_libs=no\n\tbreak\n\t;;\n      -all-static | -static | -static-libtool-libs)\n\tcase $arg in\n\t-all-static)\n\t  if test \"$build_libtool_libs\" = yes && test -z \"$link_static_flag\"; then\n\t    func_warning \"complete static linking is impossible in this configuration\"\n\t  fi\n\t  if test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=yes\n\t  ;;\n\t-static)\n\t  if test -z \"$pic_flag\" && test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=built\n\t  ;;\n\t-static-libtool-libs)\n\t  if test -z \"$pic_flag\" && test -n \"$link_static_flag\"; then\n\t    dlopen_self=$dlopen_self_static\n\t  fi\n\t  prefer_static_libs=yes\n\t  ;;\n\tesac\n\tbuild_libtool_libs=no\n\tbuild_old_libs=yes\n\tbreak\n\t;;\n      esac\n    done\n\n    # See if our shared archives depend on static archives.\n    test -n \"$old_archive_from_new_cmds\" && build_old_libs=yes\n\n    # Go through the arguments, transforming them on the way.\n    while test \"$#\" -gt 0; do\n      arg=\"$1\"\n      shift\n      func_quote_for_eval \"$arg\"\n      qarg=$func_quote_for_eval_unquoted_result\n      func_append libtool_args \" $func_quote_for_eval_result\"\n\n      # If the previous option needs an argument, assign it.\n      if test -n \"$prev\"; then\n\tcase $prev in\n\toutput)\n\t  func_append compile_command \" @OUTPUT@\"\n\t  func_append finalize_command \" @OUTPUT@\"\n\t  ;;\n\tesac\n\n\tcase $prev in\n\tbindir)\n\t  bindir=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tdlfiles|dlprefiles)\n\t  if test \"$preload\" = no; then\n\t    # Add the symbol object into the linking commands.\n\t    func_append compile_command \" @SYMFILE@\"\n\t    func_append finalize_command \" @SYMFILE@\"\n\t    preload=yes\n\t  fi\n\t  case $arg in\n\t  *.la | *.lo) ;;  # We handle these cases below.\n\t  force)\n\t    if test \"$dlself\" = no; then\n\t      dlself=needless\n\t      export_dynamic=yes\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  self)\n\t    if test \"$prev\" = dlprefiles; then\n\t      dlself=yes\n\t    elif test \"$prev\" = dlfiles && test \"$dlopen_self\" != yes; then\n\t      dlself=yes\n\t    else\n\t      dlself=needless\n\t      export_dynamic=yes\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  *)\n\t    if test \"$prev\" = dlfiles; then\n\t      func_append dlfiles \" $arg\"\n\t    else\n\t      func_append dlprefiles \" $arg\"\n\t    fi\n\t    prev=\n\t    continue\n\t    ;;\n\t  esac\n\t  ;;\n\texpsyms)\n\t  export_symbols=\"$arg\"\n\t  test -f \"$arg\" \\\n\t    || func_fatal_error \"symbol file \\`$arg' does not exist\"\n\t  prev=\n\t  continue\n\t  ;;\n\texpsyms_regex)\n\t  export_symbols_regex=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tframework)\n\t  case $host in\n\t    *-*-darwin*)\n\t      case \"$deplibs \" in\n\t\t*\" $qarg.ltframework \"*) ;;\n\t\t*) func_append deplibs \" $qarg.ltframework\" # this is fixed later\n\t\t   ;;\n\t      esac\n\t      ;;\n\t  esac\n\t  prev=\n\t  continue\n\t  ;;\n\tinst_prefix)\n\t  inst_prefix_dir=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tobjectlist)\n\t  if test -f \"$arg\"; then\n\t    save_arg=$arg\n\t    moreargs=\n\t    for fil in `cat \"$save_arg\"`\n\t    do\n#\t      func_append moreargs \" $fil\"\n\t      arg=$fil\n\t      # A libtool-controlled object.\n\n\t      # Check to see that this really is a libtool object.\n\t      if func_lalib_unsafe_p \"$arg\"; then\n\t\tpic_object=\n\t\tnon_pic_object=\n\n\t\t# Read the .lo file\n\t\tfunc_source \"$arg\"\n\n\t\tif test -z \"$pic_object\" ||\n\t\t   test -z \"$non_pic_object\" ||\n\t\t   test \"$pic_object\" = none &&\n\t\t   test \"$non_pic_object\" = none; then\n\t\t  func_fatal_error \"cannot find name of object for \\`$arg'\"\n\t\tfi\n\n\t\t# Extract subdirectory from the argument.\n\t\tfunc_dirname \"$arg\" \"/\" \"\"\n\t\txdir=\"$func_dirname_result\"\n\n\t\tif test \"$pic_object\" != none; then\n\t\t  # Prepend the subdirectory the object is found in.\n\t\t  pic_object=\"$xdir$pic_object\"\n\n\t\t  if test \"$prev\" = dlfiles; then\n\t\t    if test \"$build_libtool_libs\" = yes && test \"$dlopen_support\" = yes; then\n\t\t      func_append dlfiles \" $pic_object\"\n\t\t      prev=\n\t\t      continue\n\t\t    else\n\t\t      # If libtool objects are unsupported, then we need to preload.\n\t\t      prev=dlprefiles\n\t\t    fi\n\t\t  fi\n\n\t\t  # CHECK ME:  I think I busted this.  -Ossama\n\t\t  if test \"$prev\" = dlprefiles; then\n\t\t    # Preload the old-style object.\n\t\t    func_append dlprefiles \" $pic_object\"\n\t\t    prev=\n\t\t  fi\n\n\t\t  # A PIC object.\n\t\t  func_append libobjs \" $pic_object\"\n\t\t  arg=\"$pic_object\"\n\t\tfi\n\n\t\t# Non-PIC object.\n\t\tif test \"$non_pic_object\" != none; then\n\t\t  # Prepend the subdirectory the object is found in.\n\t\t  non_pic_object=\"$xdir$non_pic_object\"\n\n\t\t  # A standard non-PIC object\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t\t  if test -z \"$pic_object\" || test \"$pic_object\" = none ; then\n\t\t    arg=\"$non_pic_object\"\n\t\t  fi\n\t\telse\n\t\t  # If the PIC object exists, use it instead.\n\t\t  # $xdir was prepended to $pic_object above.\n\t\t  non_pic_object=\"$pic_object\"\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t\tfi\n\t      else\n\t\t# Only an error if not doing a dry-run.\n\t\tif $opt_dry_run; then\n\t\t  # Extract subdirectory from the argument.\n\t\t  func_dirname \"$arg\" \"/\" \"\"\n\t\t  xdir=\"$func_dirname_result\"\n\n\t\t  func_lo2o \"$arg\"\n\t\t  pic_object=$xdir$objdir/$func_lo2o_result\n\t\t  non_pic_object=$xdir$func_lo2o_result\n\t\t  func_append libobjs \" $pic_object\"\n\t\t  func_append non_pic_objects \" $non_pic_object\"\n\t        else\n\t\t  func_fatal_error \"\\`$arg' is not a valid libtool object\"\n\t\tfi\n\t      fi\n\t    done\n\t  else\n\t    func_fatal_error \"link input file \\`$arg' does not exist\"\n\t  fi\n\t  arg=$save_arg\n\t  prev=\n\t  continue\n\t  ;;\n\tprecious_regex)\n\t  precious_files_regex=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\trelease)\n\t  release=\"-$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\trpath | xrpath)\n\t  # We need an absolute path.\n\t  case $arg in\n\t  [\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t  *)\n\t    func_fatal_error \"only absolute run-paths are allowed\"\n\t    ;;\n\t  esac\n\t  if test \"$prev\" = rpath; then\n\t    case \"$rpath \" in\n\t    *\" $arg \"*) ;;\n\t    *) func_append rpath \" $arg\" ;;\n\t    esac\n\t  else\n\t    case \"$xrpath \" in\n\t    *\" $arg \"*) ;;\n\t    *) func_append xrpath \" $arg\" ;;\n\t    esac\n\t  fi\n\t  prev=\n\t  continue\n\t  ;;\n\tshrext)\n\t  shrext_cmds=\"$arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\tweak)\n\t  func_append weak_libs \" $arg\"\n\t  prev=\n\t  continue\n\t  ;;\n\txcclinker)\n\t  func_append linker_flags \" $qarg\"\n\t  func_append compiler_flags \" $qarg\"\n\t  prev=\n\t  func_append compile_command \" $qarg\"\n\t  func_append finalize_command \" $qarg\"\n\t  continue\n\t  ;;\n\txcompiler)\n\t  func_append compiler_flags \" $qarg\"\n\t  prev=\n\t  func_append compile_command \" $qarg\"\n\t  func_append finalize_command \" $qarg\"\n\t  continue\n\t  ;;\n\txlinker)\n\t  func_append linker_flags \" $qarg\"\n\t  func_append compiler_flags \" $wl$qarg\"\n\t  prev=\n\t  func_append compile_command \" $wl$qarg\"\n\t  func_append finalize_command \" $wl$qarg\"\n\t  continue\n\t  ;;\n\t*)\n\t  eval \"$prev=\\\"\\$arg\\\"\"\n\t  prev=\n\t  continue\n\t  ;;\n\tesac\n      fi # test -n \"$prev\"\n\n      prevarg=\"$arg\"\n\n      case $arg in\n      -all-static)\n\tif test -n \"$link_static_flag\"; then\n\t  # See comment for -static flag below, for more details.\n\t  func_append compile_command \" $link_static_flag\"\n\t  func_append finalize_command \" $link_static_flag\"\n\tfi\n\tcontinue\n\t;;\n\n      -allow-undefined)\n\t# FIXME: remove this flag sometime in the future.\n\tfunc_fatal_error \"\\`-allow-undefined' must not be used because it is the default\"\n\t;;\n\n      -avoid-version)\n\tavoid_version=yes\n\tcontinue\n\t;;\n\n      -bindir)\n\tprev=bindir\n\tcontinue\n\t;;\n\n      -dlopen)\n\tprev=dlfiles\n\tcontinue\n\t;;\n\n      -dlpreopen)\n\tprev=dlprefiles\n\tcontinue\n\t;;\n\n      -export-dynamic)\n\texport_dynamic=yes\n\tcontinue\n\t;;\n\n      -export-symbols | -export-symbols-regex)\n\tif test -n \"$export_symbols\" || test -n \"$export_symbols_regex\"; then\n\t  func_fatal_error \"more than one -exported-symbols argument is not allowed\"\n\tfi\n\tif test \"X$arg\" = \"X-export-symbols\"; then\n\t  prev=expsyms\n\telse\n\t  prev=expsyms_regex\n\tfi\n\tcontinue\n\t;;\n\n      -framework)\n\tprev=framework\n\tcontinue\n\t;;\n\n      -inst-prefix-dir)\n\tprev=inst_prefix\n\tcontinue\n\t;;\n\n      # The native IRIX linker understands -LANG:*, -LIST:* and -LNO:*\n      # so, if we see these flags be careful not to treat them like -L\n      -L[A-Z][A-Z]*:*)\n\tcase $with_gcc/$host in\n\tno/*-*-irix* | /*-*-irix*)\n\t  func_append compile_command \" $arg\"\n\t  func_append finalize_command \" $arg\"\n\t  ;;\n\tesac\n\tcontinue\n\t;;\n\n      -L*)\n\tfunc_stripname \"-L\" '' \"$arg\"\n\tif test -z \"$func_stripname_result\"; then\n\t  if test \"$#\" -gt 0; then\n\t    func_fatal_error \"require no space between \\`-L' and \\`$1'\"\n\t  else\n\t    func_fatal_error \"need path for \\`-L' option\"\n\t  fi\n\tfi\n\tfunc_resolve_sysroot \"$func_stripname_result\"\n\tdir=$func_resolve_sysroot_result\n\t# We need an absolute path.\n\tcase $dir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t*)\n\t  absdir=`cd \"$dir\" && pwd`\n\t  test -z \"$absdir\" && \\\n\t    func_fatal_error \"cannot determine absolute directory name of \\`$dir'\"\n\t  dir=\"$absdir\"\n\t  ;;\n\tesac\n\tcase \"$deplibs \" in\n\t*\" -L$dir \"* | *\" $arg \"*)\n\t  # Will only happen for absolute or sysroot arguments\n\t  ;;\n\t*)\n\t  # Preserve sysroot, but never include relative directories\n\t  case $dir in\n\t    [\\\\/]* | [A-Za-z]:[\\\\/]* | =*) func_append deplibs \" $arg\" ;;\n\t    *) func_append deplibs \" -L$dir\" ;;\n\t  esac\n\t  func_append lib_search_path \" $dir\"\n\t  ;;\n\tesac\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n\t  testbindir=`$ECHO \"$dir\" | $SED 's*/lib$*/bin*'`\n\t  case :$dllsearchpath: in\n\t  *\":$dir:\"*) ;;\n\t  ::) dllsearchpath=$dir;;\n\t  *) func_append dllsearchpath \":$dir\";;\n\t  esac\n\t  case :$dllsearchpath: in\n\t  *\":$testbindir:\"*) ;;\n\t  ::) dllsearchpath=$testbindir;;\n\t  *) func_append dllsearchpath \":$testbindir\";;\n\t  esac\n\t  ;;\n\tesac\n\tcontinue\n\t;;\n\n      -l*)\n\tif test \"X$arg\" = \"X-lc\" || test \"X$arg\" = \"X-lm\"; then\n\t  case $host in\n\t  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-beos* | *-cegcc* | *-*-haiku*)\n\t    # These systems don't actually have a C or math library (as such)\n\t    continue\n\t    ;;\n\t  *-*-os2*)\n\t    # These systems don't actually have a C library (as such)\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)\n\t    # Do not include libc due to us having libc/libc_r.\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  *-*-rhapsody* | *-*-darwin1.[012])\n\t    # Rhapsody C and math libraries are in the System framework\n\t    func_append deplibs \" System.ltframework\"\n\t    continue\n\t    ;;\n\t  *-*-sco3.2v5* | *-*-sco5v6*)\n\t    # Causes problems with __ctype\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)\n\t    # Compiler inserts libc in the correct place for threads to work\n\t    test \"X$arg\" = \"X-lc\" && continue\n\t    ;;\n\t  esac\n\telif test \"X$arg\" = \"X-lc_r\"; then\n\t case $host in\n\t *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)\n\t   # Do not include libc_r directly, use -pthread flag.\n\t   continue\n\t   ;;\n\t esac\n\tfi\n\tfunc_append deplibs \" $arg\"\n\tcontinue\n\t;;\n\n      -module)\n\tmodule=yes\n\tcontinue\n\t;;\n\n      # Tru64 UNIX uses -model [arg] to determine the layout of C++\n      # classes, name mangling, and exception handling.\n      # Darwin uses the -arch flag to determine output architecture.\n      -model|-arch|-isysroot|--sysroot)\n\tfunc_append compiler_flags \" $arg\"\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n\tprev=xcompiler\n\tcontinue\n\t;;\n\n      -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \\\n      |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)\n\tfunc_append compiler_flags \" $arg\"\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n\tcase \"$new_inherited_linker_flags \" in\n\t    *\" $arg \"*) ;;\n\t    * ) func_append new_inherited_linker_flags \" $arg\" ;;\n\tesac\n\tcontinue\n\t;;\n\n      -multi_module)\n\tsingle_module=\"${wl}-multi_module\"\n\tcontinue\n\t;;\n\n      -no-fast-install)\n\tfast_install=no\n\tcontinue\n\t;;\n\n      -no-install)\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-darwin* | *-cegcc*)\n\t  # The PATH hackery in wrapper scripts is required on Windows\n\t  # and Darwin in order for the loader to find any dlls it needs.\n\t  func_warning \"\\`-no-install' is ignored for $host\"\n\t  func_warning \"assuming \\`-no-fast-install' instead\"\n\t  fast_install=no\n\t  ;;\n\t*) no_install=yes ;;\n\tesac\n\tcontinue\n\t;;\n\n      -no-undefined)\n\tallow_undefined=no\n\tcontinue\n\t;;\n\n      -objectlist)\n\tprev=objectlist\n\tcontinue\n\t;;\n\n      -o) prev=output ;;\n\n      -precious-files-regex)\n\tprev=precious_regex\n\tcontinue\n\t;;\n\n      -release)\n\tprev=release\n\tcontinue\n\t;;\n\n      -rpath)\n\tprev=rpath\n\tcontinue\n\t;;\n\n      -R)\n\tprev=xrpath\n\tcontinue\n\t;;\n\n      -R*)\n\tfunc_stripname '-R' '' \"$arg\"\n\tdir=$func_stripname_result\n\t# We need an absolute path.\n\tcase $dir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) ;;\n\t=*)\n\t  func_stripname '=' '' \"$dir\"\n\t  dir=$lt_sysroot$func_stripname_result\n\t  ;;\n\t*)\n\t  func_fatal_error \"only absolute run-paths are allowed\"\n\t  ;;\n\tesac\n\tcase \"$xrpath \" in\n\t*\" $dir \"*) ;;\n\t*) func_append xrpath \" $dir\" ;;\n\tesac\n\tcontinue\n\t;;\n\n      -shared)\n\t# The effects of -shared are defined in a previous loop.\n\tcontinue\n\t;;\n\n      -shrext)\n\tprev=shrext\n\tcontinue\n\t;;\n\n      -static | -static-libtool-libs)\n\t# The effects of -static are defined in a previous loop.\n\t# We used to do the same as -all-static on platforms that\n\t# didn't have a PIC flag, but the assumption that the effects\n\t# would be equivalent was wrong.  It would break on at least\n\t# Digital Unix and AIX.\n\tcontinue\n\t;;\n\n      -thread-safe)\n\tthread_safe=yes\n\tcontinue\n\t;;\n\n      -version-info)\n\tprev=vinfo\n\tcontinue\n\t;;\n\n      -version-number)\n\tprev=vinfo\n\tvinfo_number=yes\n\tcontinue\n\t;;\n\n      -weak)\n        prev=weak\n\tcontinue\n\t;;\n\n      -Wc,*)\n\tfunc_stripname '-Wc,' '' \"$arg\"\n\targs=$func_stripname_result\n\targ=\n\tsave_ifs=\"$IFS\"; IFS=','\n\tfor flag in $args; do\n\t  IFS=\"$save_ifs\"\n          func_quote_for_eval \"$flag\"\n\t  func_append arg \" $func_quote_for_eval_result\"\n\t  func_append compiler_flags \" $func_quote_for_eval_result\"\n\tdone\n\tIFS=\"$save_ifs\"\n\tfunc_stripname ' ' '' \"$arg\"\n\targ=$func_stripname_result\n\t;;\n\n      -Wl,*)\n\tfunc_stripname '-Wl,' '' \"$arg\"\n\targs=$func_stripname_result\n\targ=\n\tsave_ifs=\"$IFS\"; IFS=','\n\tfor flag in $args; do\n\t  IFS=\"$save_ifs\"\n          func_quote_for_eval \"$flag\"\n\t  func_append arg \" $wl$func_quote_for_eval_result\"\n\t  func_append compiler_flags \" $wl$func_quote_for_eval_result\"\n\t  func_append linker_flags \" $func_quote_for_eval_result\"\n\tdone\n\tIFS=\"$save_ifs\"\n\tfunc_stripname ' ' '' \"$arg\"\n\targ=$func_stripname_result\n\t;;\n\n      -Xcompiler)\n\tprev=xcompiler\n\tcontinue\n\t;;\n\n      -Xlinker)\n\tprev=xlinker\n\tcontinue\n\t;;\n\n      -XCClinker)\n\tprev=xcclinker\n\tcontinue\n\t;;\n\n      # -msg_* for osf cc\n      -msg_*)\n\tfunc_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n\t;;\n\n      # Flags to be passed through unchanged, with rationale:\n      # -64, -mips[0-9]      enable 64-bit mode for the SGI compiler\n      # -r[0-9][0-9]*        specify processor for the SGI compiler\n      # -xarch=*, -xtarget=* enable 64-bit mode for the Sun compiler\n      # +DA*, +DD*           enable 64-bit mode for the HP compiler\n      # -q*                  compiler args for the IBM compiler\n      # -m*, -t[45]*, -txscale* architecture-specific flags for GCC\n      # -F/path              path to uninstalled frameworks, gcc on darwin\n      # -p, -pg, --coverage, -fprofile-*  profiling flags for GCC\n      # @file                GCC response files\n      # -tp=*                Portland pgcc target processor selection\n      # --sysroot=*          for sysroot support\n      # -O*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization\n      -64|-mips[0-9]|-r[0-9][0-9]*|-xarch=*|-xtarget=*|+DA*|+DD*|-q*|-m*| \\\n      -t[45]*|-txscale*|-p|-pg|--coverage|-fprofile-*|-F*|@*|-tp=*|--sysroot=*| \\\n      -O*|-flto*|-fwhopr*|-fuse-linker-plugin)\n        func_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n        func_append compile_command \" $arg\"\n        func_append finalize_command \" $arg\"\n        func_append compiler_flags \" $arg\"\n        continue\n        ;;\n\n      # Some other compiler flag.\n      -* | +*)\n        func_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n\t;;\n\n      *.$objext)\n\t# A standard object.\n\tfunc_append objs \" $arg\"\n\t;;\n\n      *.lo)\n\t# A libtool-controlled object.\n\n\t# Check to see that this really is a libtool object.\n\tif func_lalib_unsafe_p \"$arg\"; then\n\t  pic_object=\n\t  non_pic_object=\n\n\t  # Read the .lo file\n\t  func_source \"$arg\"\n\n\t  if test -z \"$pic_object\" ||\n\t     test -z \"$non_pic_object\" ||\n\t     test \"$pic_object\" = none &&\n\t     test \"$non_pic_object\" = none; then\n\t    func_fatal_error \"cannot find name of object for \\`$arg'\"\n\t  fi\n\n\t  # Extract subdirectory from the argument.\n\t  func_dirname \"$arg\" \"/\" \"\"\n\t  xdir=\"$func_dirname_result\"\n\n\t  if test \"$pic_object\" != none; then\n\t    # Prepend the subdirectory the object is found in.\n\t    pic_object=\"$xdir$pic_object\"\n\n\t    if test \"$prev\" = dlfiles; then\n\t      if test \"$build_libtool_libs\" = yes && test \"$dlopen_support\" = yes; then\n\t\tfunc_append dlfiles \" $pic_object\"\n\t\tprev=\n\t\tcontinue\n\t      else\n\t\t# If libtool objects are unsupported, then we need to preload.\n\t\tprev=dlprefiles\n\t      fi\n\t    fi\n\n\t    # CHECK ME:  I think I busted this.  -Ossama\n\t    if test \"$prev\" = dlprefiles; then\n\t      # Preload the old-style object.\n\t      func_append dlprefiles \" $pic_object\"\n\t      prev=\n\t    fi\n\n\t    # A PIC object.\n\t    func_append libobjs \" $pic_object\"\n\t    arg=\"$pic_object\"\n\t  fi\n\n\t  # Non-PIC object.\n\t  if test \"$non_pic_object\" != none; then\n\t    # Prepend the subdirectory the object is found in.\n\t    non_pic_object=\"$xdir$non_pic_object\"\n\n\t    # A standard non-PIC object\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t    if test -z \"$pic_object\" || test \"$pic_object\" = none ; then\n\t      arg=\"$non_pic_object\"\n\t    fi\n\t  else\n\t    # If the PIC object exists, use it instead.\n\t    # $xdir was prepended to $pic_object above.\n\t    non_pic_object=\"$pic_object\"\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t  fi\n\telse\n\t  # Only an error if not doing a dry-run.\n\t  if $opt_dry_run; then\n\t    # Extract subdirectory from the argument.\n\t    func_dirname \"$arg\" \"/\" \"\"\n\t    xdir=\"$func_dirname_result\"\n\n\t    func_lo2o \"$arg\"\n\t    pic_object=$xdir$objdir/$func_lo2o_result\n\t    non_pic_object=$xdir$func_lo2o_result\n\t    func_append libobjs \" $pic_object\"\n\t    func_append non_pic_objects \" $non_pic_object\"\n\t  else\n\t    func_fatal_error \"\\`$arg' is not a valid libtool object\"\n\t  fi\n\tfi\n\t;;\n\n      *.$libext)\n\t# An archive.\n\tfunc_append deplibs \" $arg\"\n\tfunc_append old_deplibs \" $arg\"\n\tcontinue\n\t;;\n\n      *.la)\n\t# A libtool-controlled library.\n\n\tfunc_resolve_sysroot \"$arg\"\n\tif test \"$prev\" = dlfiles; then\n\t  # This library was specified with -dlopen.\n\t  func_append dlfiles \" $func_resolve_sysroot_result\"\n\t  prev=\n\telif test \"$prev\" = dlprefiles; then\n\t  # The library was specified with -dlpreopen.\n\t  func_append dlprefiles \" $func_resolve_sysroot_result\"\n\t  prev=\n\telse\n\t  func_append deplibs \" $func_resolve_sysroot_result\"\n\tfi\n\tcontinue\n\t;;\n\n      # Some other compiler argument.\n      *)\n\t# Unknown arguments in both finalize_command and compile_command need\n\t# to be aesthetically quoted because they are evaled later.\n\tfunc_quote_for_eval \"$arg\"\n\targ=\"$func_quote_for_eval_result\"\n\t;;\n      esac # arg\n\n      # Now actually substitute the argument into the commands.\n      if test -n \"$arg\"; then\n\tfunc_append compile_command \" $arg\"\n\tfunc_append finalize_command \" $arg\"\n      fi\n    done # argument parsing loop\n\n    test -n \"$prev\" && \\\n      func_fatal_help \"the \\`$prevarg' option requires an argument\"\n\n    if test \"$export_dynamic\" = yes && test -n \"$export_dynamic_flag_spec\"; then\n      eval arg=\\\"$export_dynamic_flag_spec\\\"\n      func_append compile_command \" $arg\"\n      func_append finalize_command \" $arg\"\n    fi\n\n    oldlibs=\n    # calculate the name of the file, without its directory\n    func_basename \"$output\"\n    outputname=\"$func_basename_result\"\n    libobjs_save=\"$libobjs\"\n\n    if test -n \"$shlibpath_var\"; then\n      # get the directories listed in $shlibpath_var\n      eval shlib_search_path=\\`\\$ECHO \\\"\\${$shlibpath_var}\\\" \\| \\$SED \\'s/:/ /g\\'\\`\n    else\n      shlib_search_path=\n    fi\n    eval sys_lib_search_path=\\\"$sys_lib_search_path_spec\\\"\n    eval sys_lib_dlsearch_path=\\\"$sys_lib_dlsearch_path_spec\\\"\n\n    func_dirname \"$output\" \"/\" \"\"\n    output_objdir=\"$func_dirname_result$objdir\"\n    func_to_tool_file \"$output_objdir/\"\n    tool_output_objdir=$func_to_tool_file_result\n    # Create the object directory.\n    func_mkdir_p \"$output_objdir\"\n\n    # Determine the type of output\n    case $output in\n    \"\")\n      func_fatal_help \"you must specify an output file\"\n      ;;\n    *.$libext) linkmode=oldlib ;;\n    *.lo | *.$objext) linkmode=obj ;;\n    *.la) linkmode=lib ;;\n    *) linkmode=prog ;; # Anything else should be a program.\n    esac\n\n    specialdeplibs=\n\n    libs=\n    # Find all interdependent deplibs by searching for libraries\n    # that are linked more than once (e.g. -la -lb -la)\n    for deplib in $deplibs; do\n      if $opt_preserve_dup_deps ; then\n\tcase \"$libs \" in\n\t*\" $deplib \"*) func_append specialdeplibs \" $deplib\" ;;\n\tesac\n      fi\n      func_append libs \" $deplib\"\n    done\n\n    if test \"$linkmode\" = lib; then\n      libs=\"$predeps $libs $compiler_lib_search_path $postdeps\"\n\n      # Compute libraries that are listed more than once in $predeps\n      # $postdeps and mark them as special (i.e., whose duplicates are\n      # not to be eliminated).\n      pre_post_deps=\n      if $opt_duplicate_compiler_generated_deps; then\n\tfor pre_post_dep in $predeps $postdeps; do\n\t  case \"$pre_post_deps \" in\n\t  *\" $pre_post_dep \"*) func_append specialdeplibs \" $pre_post_deps\" ;;\n\t  esac\n\t  func_append pre_post_deps \" $pre_post_dep\"\n\tdone\n      fi\n      pre_post_deps=\n    fi\n\n    deplibs=\n    newdependency_libs=\n    newlib_search_path=\n    need_relink=no # whether we're linking any uninstalled libtool libraries\n    notinst_deplibs= # not-installed libtool libraries\n    notinst_path= # paths that contain not-installed libtool libraries\n\n    case $linkmode in\n    lib)\n\tpasses=\"conv dlpreopen link\"\n\tfor file in $dlfiles $dlprefiles; do\n\t  case $file in\n\t  *.la) ;;\n\t  *)\n\t    func_fatal_help \"libraries can \\`-dlopen' only libtool libraries: $file\"\n\t    ;;\n\t  esac\n\tdone\n\t;;\n    prog)\n\tcompile_deplibs=\n\tfinalize_deplibs=\n\talldeplibs=no\n\tnewdlfiles=\n\tnewdlprefiles=\n\tpasses=\"conv scan dlopen dlpreopen link\"\n\t;;\n    *)  passes=\"conv\"\n\t;;\n    esac\n\n    for pass in $passes; do\n      # The preopen pass in lib mode reverses $deplibs; put it back here\n      # so that -L comes before libs that need it for instance...\n      if test \"$linkmode,$pass\" = \"lib,link\"; then\n\t## FIXME: Find the place where the list is rebuilt in the wrong\n\t##        order, and fix it there properly\n        tmp_deplibs=\n\tfor deplib in $deplibs; do\n\t  tmp_deplibs=\"$deplib $tmp_deplibs\"\n\tdone\n\tdeplibs=\"$tmp_deplibs\"\n      fi\n\n      if test \"$linkmode,$pass\" = \"lib,link\" ||\n\t test \"$linkmode,$pass\" = \"prog,scan\"; then\n\tlibs=\"$deplibs\"\n\tdeplibs=\n      fi\n      if test \"$linkmode\" = prog; then\n\tcase $pass in\n\tdlopen) libs=\"$dlfiles\" ;;\n\tdlpreopen) libs=\"$dlprefiles\" ;;\n\tlink)\n\t  libs=\"$deplibs %DEPLIBS%\"\n\t  test \"X$link_all_deplibs\" != Xno && libs=\"$libs $dependency_libs\"\n\t  ;;\n\tesac\n      fi\n      if test \"$linkmode,$pass\" = \"lib,dlpreopen\"; then\n\t# Collect and forward deplibs of preopened libtool libs\n\tfor lib in $dlprefiles; do\n\t  # Ignore non-libtool-libs\n\t  dependency_libs=\n\t  func_resolve_sysroot \"$lib\"\n\t  case $lib in\n\t  *.la)\tfunc_source \"$func_resolve_sysroot_result\" ;;\n\t  esac\n\n\t  # Collect preopened libtool deplibs, except any this library\n\t  # has declared as weak libs\n\t  for deplib in $dependency_libs; do\n\t    func_basename \"$deplib\"\n            deplib_base=$func_basename_result\n\t    case \" $weak_libs \" in\n\t    *\" $deplib_base \"*) ;;\n\t    *) func_append deplibs \" $deplib\" ;;\n\t    esac\n\t  done\n\tdone\n\tlibs=\"$dlprefiles\"\n      fi\n      if test \"$pass\" = dlopen; then\n\t# Collect dlpreopened libraries\n\tsave_deplibs=\"$deplibs\"\n\tdeplibs=\n      fi\n\n      for deplib in $libs; do\n\tlib=\n\tfound=no\n\tcase $deplib in\n\t-mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \\\n        |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*)\n\t  if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t    compile_deplibs=\"$deplib $compile_deplibs\"\n\t    finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t  else\n\t    func_append compiler_flags \" $deplib\"\n\t    if test \"$linkmode\" = lib ; then\n\t\tcase \"$new_inherited_linker_flags \" in\n\t\t    *\" $deplib \"*) ;;\n\t\t    * ) func_append new_inherited_linker_flags \" $deplib\" ;;\n\t\tesac\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t-l*)\n\t  if test \"$linkmode\" != lib && test \"$linkmode\" != prog; then\n\t    func_warning \"\\`-l' is ignored for archives/objects\"\n\t    continue\n\t  fi\n\t  func_stripname '-l' '' \"$deplib\"\n\t  name=$func_stripname_result\n\t  if test \"$linkmode\" = lib; then\n\t    searchdirs=\"$newlib_search_path $lib_search_path $compiler_lib_search_dirs $sys_lib_search_path $shlib_search_path\"\n\t  else\n\t    searchdirs=\"$newlib_search_path $lib_search_path $sys_lib_search_path $shlib_search_path\"\n\t  fi\n\t  for searchdir in $searchdirs; do\n\t    for search_ext in .la $std_shrext .so .a; do\n\t      # Search the libtool library\n\t      lib=\"$searchdir/lib${name}${search_ext}\"\n\t      if test -f \"$lib\"; then\n\t\tif test \"$search_ext\" = \".la\"; then\n\t\t  found=yes\n\t\telse\n\t\t  found=no\n\t\tfi\n\t\tbreak 2\n\t      fi\n\t    done\n\t  done\n\t  if test \"$found\" != yes; then\n\t    # deplib doesn't seem to be a libtool library\n\t    if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    else\n\t      deplibs=\"$deplib $deplibs\"\n\t      test \"$linkmode\" = lib && newdependency_libs=\"$deplib $newdependency_libs\"\n\t    fi\n\t    continue\n\t  else # deplib is a libtool library\n\t    # If $allow_libtool_libs_with_static_runtimes && $deplib is a stdlib,\n\t    # We need to do some special things here, and not later.\n\t    if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t      case \" $predeps $postdeps \" in\n\t      *\" $deplib \"*)\n\t\tif func_lalib_p \"$lib\"; then\n\t\t  library_names=\n\t\t  old_library=\n\t\t  func_source \"$lib\"\n\t\t  for l in $old_library $library_names; do\n\t\t    ll=\"$l\"\n\t\t  done\n\t\t  if test \"X$ll\" = \"X$old_library\" ; then # only static version available\n\t\t    found=no\n\t\t    func_dirname \"$lib\" \"\" \".\"\n\t\t    ladir=\"$func_dirname_result\"\n\t\t    lib=$ladir/$old_library\n\t\t    if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t\t    else\n\t\t      deplibs=\"$deplib $deplibs\"\n\t\t      test \"$linkmode\" = lib && newdependency_libs=\"$deplib $newdependency_libs\"\n\t\t    fi\n\t\t    continue\n\t\t  fi\n\t\tfi\n\t\t;;\n\t      *) ;;\n\t      esac\n\t    fi\n\t  fi\n\t  ;; # -l\n\t*.ltframework)\n\t  if test \"$linkmode,$pass\" = \"prog,link\"; then\n\t    compile_deplibs=\"$deplib $compile_deplibs\"\n\t    finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t  else\n\t    deplibs=\"$deplib $deplibs\"\n\t    if test \"$linkmode\" = lib ; then\n\t\tcase \"$new_inherited_linker_flags \" in\n\t\t    *\" $deplib \"*) ;;\n\t\t    * ) func_append new_inherited_linker_flags \" $deplib\" ;;\n\t\tesac\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t-L*)\n\t  case $linkmode in\n\t  lib)\n\t    deplibs=\"$deplib $deplibs\"\n\t    test \"$pass\" = conv && continue\n\t    newdependency_libs=\"$deplib $newdependency_libs\"\n\t    func_stripname '-L' '' \"$deplib\"\n\t    func_resolve_sysroot \"$func_stripname_result\"\n\t    func_append newlib_search_path \" $func_resolve_sysroot_result\"\n\t    ;;\n\t  prog)\n\t    if test \"$pass\" = conv; then\n\t      deplibs=\"$deplib $deplibs\"\n\t      continue\n\t    fi\n\t    if test \"$pass\" = scan; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    fi\n\t    func_stripname '-L' '' \"$deplib\"\n\t    func_resolve_sysroot \"$func_stripname_result\"\n\t    func_append newlib_search_path \" $func_resolve_sysroot_result\"\n\t    ;;\n\t  *)\n\t    func_warning \"\\`-L' is ignored for archives/objects\"\n\t    ;;\n\t  esac # linkmode\n\t  continue\n\t  ;; # -L\n\t-R*)\n\t  if test \"$pass\" = link; then\n\t    func_stripname '-R' '' \"$deplib\"\n\t    func_resolve_sysroot \"$func_stripname_result\"\n\t    dir=$func_resolve_sysroot_result\n\t    # Make sure the xrpath contains only unique directories.\n\t    case \"$xrpath \" in\n\t    *\" $dir \"*) ;;\n\t    *) func_append xrpath \" $dir\" ;;\n\t    esac\n\t  fi\n\t  deplibs=\"$deplib $deplibs\"\n\t  continue\n\t  ;;\n\t*.la)\n\t  func_resolve_sysroot \"$deplib\"\n\t  lib=$func_resolve_sysroot_result\n\t  ;;\n\t*.$libext)\n\t  if test \"$pass\" = conv; then\n\t    deplibs=\"$deplib $deplibs\"\n\t    continue\n\t  fi\n\t  case $linkmode in\n\t  lib)\n\t    # Linking convenience modules into shared libraries is allowed,\n\t    # but linking other static libraries is non-portable.\n\t    case \" $dlpreconveniencelibs \" in\n\t    *\" $deplib \"*) ;;\n\t    *)\n\t      valid_a_lib=no\n\t      case $deplibs_check_method in\n\t\tmatch_pattern*)\n\t\t  set dummy $deplibs_check_method; shift\n\t\t  match_pattern_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t\t  if eval \"\\$ECHO \\\"$deplib\\\"\" 2>/dev/null | $SED 10q \\\n\t\t    | $EGREP \"$match_pattern_regex\" > /dev/null; then\n\t\t    valid_a_lib=yes\n\t\t  fi\n\t\t;;\n\t\tpass_all)\n\t\t  valid_a_lib=yes\n\t\t;;\n\t      esac\n\t      if test \"$valid_a_lib\" != yes; then\n\t\techo\n\t\t$ECHO \"*** Warning: Trying to link with static lib archive $deplib.\"\n\t\techo \"*** I have the capability to make that library automatically link in when\"\n\t\techo \"*** you link to this library.  But I can only do this if you have a\"\n\t\techo \"*** shared version of the library, which you do not appear to have\"\n\t\techo \"*** because the file extensions .$libext of this argument makes me believe\"\n\t\techo \"*** that it is just a static archive that I should not use here.\"\n\t      else\n\t\techo\n\t\t$ECHO \"*** Warning: Linking the shared library $output against the\"\n\t\t$ECHO \"*** static library $deplib is not portable!\"\n\t\tdeplibs=\"$deplib $deplibs\"\n\t      fi\n\t      ;;\n\t    esac\n\t    continue\n\t    ;;\n\t  prog)\n\t    if test \"$pass\" != link; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    fi\n\t    continue\n\t    ;;\n\t  esac # linkmode\n\t  ;; # *.$libext\n\t*.lo | *.$objext)\n\t  if test \"$pass\" = conv; then\n\t    deplibs=\"$deplib $deplibs\"\n\t  elif test \"$linkmode\" = prog; then\n\t    if test \"$pass\" = dlpreopen || test \"$dlopen_support\" != yes || test \"$build_libtool_libs\" = no; then\n\t      # If there is no dlopen support or we're linking statically,\n\t      # we need to preload.\n\t      func_append newdlprefiles \" $deplib\"\n\t      compile_deplibs=\"$deplib $compile_deplibs\"\n\t      finalize_deplibs=\"$deplib $finalize_deplibs\"\n\t    else\n\t      func_append newdlfiles \" $deplib\"\n\t    fi\n\t  fi\n\t  continue\n\t  ;;\n\t%DEPLIBS%)\n\t  alldeplibs=yes\n\t  continue\n\t  ;;\n\tesac # case $deplib\n\n\tif test \"$found\" = yes || test -f \"$lib\"; then :\n\telse\n\t  func_fatal_error \"cannot find the library \\`$lib' or unhandled argument \\`$deplib'\"\n\tfi\n\n\t# Check to see that this really is a libtool archive.\n\tfunc_lalib_unsafe_p \"$lib\" \\\n\t  || func_fatal_error \"\\`$lib' is not a valid libtool archive\"\n\n\tfunc_dirname \"$lib\" \"\" \".\"\n\tladir=\"$func_dirname_result\"\n\n\tdlname=\n\tdlopen=\n\tdlpreopen=\n\tlibdir=\n\tlibrary_names=\n\told_library=\n\tinherited_linker_flags=\n\t# If the library was installed with an old release of libtool,\n\t# it will not redefine variables installed, or shouldnotlink\n\tinstalled=yes\n\tshouldnotlink=no\n\tavoidtemprpath=\n\n\n\t# Read the .la file\n\tfunc_source \"$lib\"\n\n\t# Convert \"-framework foo\" to \"foo.ltframework\"\n\tif test -n \"$inherited_linker_flags\"; then\n\t  tmp_inherited_linker_flags=`$ECHO \"$inherited_linker_flags\" | $SED 's/-framework \\([^ $]*\\)/\\1.ltframework/g'`\n\t  for tmp_inherited_linker_flag in $tmp_inherited_linker_flags; do\n\t    case \" $new_inherited_linker_flags \" in\n\t      *\" $tmp_inherited_linker_flag \"*) ;;\n\t      *) func_append new_inherited_linker_flags \" $tmp_inherited_linker_flag\";;\n\t    esac\n\t  done\n\tfi\n\tdependency_libs=`$ECHO \" $dependency_libs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tif test \"$linkmode,$pass\" = \"lib,link\" ||\n\t   test \"$linkmode,$pass\" = \"prog,scan\" ||\n\t   { test \"$linkmode\" != prog && test \"$linkmode\" != lib; }; then\n\t  test -n \"$dlopen\" && func_append dlfiles \" $dlopen\"\n\t  test -n \"$dlpreopen\" && func_append dlprefiles \" $dlpreopen\"\n\tfi\n\n\tif test \"$pass\" = conv; then\n\t  # Only check for convenience libraries\n\t  deplibs=\"$lib $deplibs\"\n\t  if test -z \"$libdir\"; then\n\t    if test -z \"$old_library\"; then\n\t      func_fatal_error \"cannot find name of link library for \\`$lib'\"\n\t    fi\n\t    # It is a libtool convenience library, so add in its objects.\n\t    func_append convenience \" $ladir/$objdir/$old_library\"\n\t    func_append old_convenience \" $ladir/$objdir/$old_library\"\n\t    tmp_libs=\n\t    for deplib in $dependency_libs; do\n\t      deplibs=\"$deplib $deplibs\"\n\t      if $opt_preserve_dup_deps ; then\n\t\tcase \"$tmp_libs \" in\n\t\t*\" $deplib \"*) func_append specialdeplibs \" $deplib\" ;;\n\t\tesac\n\t      fi\n\t      func_append tmp_libs \" $deplib\"\n\t    done\n\t  elif test \"$linkmode\" != prog && test \"$linkmode\" != lib; then\n\t    func_fatal_error \"\\`$lib' is not a convenience library\"\n\t  fi\n\t  continue\n\tfi # $pass = conv\n\n\n\t# Get the name of the library we link against.\n\tlinklib=\n\tif test -n \"$old_library\" &&\n\t   { test \"$prefer_static_libs\" = yes ||\n\t     test \"$prefer_static_libs,$installed\" = \"built,no\"; }; then\n\t  linklib=$old_library\n\telse\n\t  for l in $old_library $library_names; do\n\t    linklib=\"$l\"\n\t  done\n\tfi\n\tif test -z \"$linklib\"; then\n\t  func_fatal_error \"cannot find name of link library for \\`$lib'\"\n\tfi\n\n\t# This library was specified with -dlopen.\n\tif test \"$pass\" = dlopen; then\n\t  if test -z \"$libdir\"; then\n\t    func_fatal_error \"cannot -dlopen a convenience library: \\`$lib'\"\n\t  fi\n\t  if test -z \"$dlname\" ||\n\t     test \"$dlopen_support\" != yes ||\n\t     test \"$build_libtool_libs\" = no; then\n\t    # If there is no dlname, no dlopen support or we're linking\n\t    # statically, we need to preload.  We also need to preload any\n\t    # dependent libraries so libltdl's deplib preloader doesn't\n\t    # bomb out in the load deplibs phase.\n\t    func_append dlprefiles \" $lib $dependency_libs\"\n\t  else\n\t    func_append newdlfiles \" $lib\"\n\t  fi\n\t  continue\n\tfi # $pass = dlopen\n\n\t# We need an absolute path.\n\tcase $ladir in\n\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs_ladir=\"$ladir\" ;;\n\t*)\n\t  abs_ladir=`cd \"$ladir\" && pwd`\n\t  if test -z \"$abs_ladir\"; then\n\t    func_warning \"cannot determine absolute directory name of \\`$ladir'\"\n\t    func_warning \"passing it literally to the linker, although it might fail\"\n\t    abs_ladir=\"$ladir\"\n\t  fi\n\t  ;;\n\tesac\n\tfunc_basename \"$lib\"\n\tlaname=\"$func_basename_result\"\n\n\t# Find the relevant object directory and library name.\n\tif test \"X$installed\" = Xyes; then\n\t  if test ! -f \"$lt_sysroot$libdir/$linklib\" && test -f \"$abs_ladir/$linklib\"; then\n\t    func_warning \"library \\`$lib' was moved.\"\n\t    dir=\"$ladir\"\n\t    absdir=\"$abs_ladir\"\n\t    libdir=\"$abs_ladir\"\n\t  else\n\t    dir=\"$lt_sysroot$libdir\"\n\t    absdir=\"$lt_sysroot$libdir\"\n\t  fi\n\t  test \"X$hardcode_automatic\" = Xyes && avoidtemprpath=yes\n\telse\n\t  if test ! -f \"$ladir/$objdir/$linklib\" && test -f \"$abs_ladir/$linklib\"; then\n\t    dir=\"$ladir\"\n\t    absdir=\"$abs_ladir\"\n\t    # Remove this search path later\n\t    func_append notinst_path \" $abs_ladir\"\n\t  else\n\t    dir=\"$ladir/$objdir\"\n\t    absdir=\"$abs_ladir/$objdir\"\n\t    # Remove this search path later\n\t    func_append notinst_path \" $abs_ladir\"\n\t  fi\n\tfi # $installed = yes\n\tfunc_stripname 'lib' '.la' \"$laname\"\n\tname=$func_stripname_result\n\n\t# This library was specified with -dlpreopen.\n\tif test \"$pass\" = dlpreopen; then\n\t  if test -z \"$libdir\" && test \"$linkmode\" = prog; then\n\t    func_fatal_error \"only libraries may -dlpreopen a convenience library: \\`$lib'\"\n\t  fi\n\t  case \"$host\" in\n\t    # special handling for platforms with PE-DLLs.\n\t    *cygwin* | *mingw* | *cegcc* )\n\t      # Linker will automatically link against shared library if both\n\t      # static and shared are present.  Therefore, ensure we extract\n\t      # symbols from the import library if a shared library is present\n\t      # (otherwise, the dlopen module name will be incorrect).  We do\n\t      # this by putting the import library name into $newdlprefiles.\n\t      # We recover the dlopen module name by 'saving' the la file\n\t      # name in a special purpose variable, and (later) extracting the\n\t      # dlname from the la file.\n\t      if test -n \"$dlname\"; then\n\t        func_tr_sh \"$dir/$linklib\"\n\t        eval \"libfile_$func_tr_sh_result=\\$abs_ladir/\\$laname\"\n\t        func_append newdlprefiles \" $dir/$linklib\"\n\t      else\n\t        func_append newdlprefiles \" $dir/$old_library\"\n\t        # Keep a list of preopened convenience libraries to check\n\t        # that they are being used correctly in the link pass.\n\t        test -z \"$libdir\" && \\\n\t          func_append dlpreconveniencelibs \" $dir/$old_library\"\n\t      fi\n\t    ;;\n\t    * )\n\t      # Prefer using a static library (so that no silly _DYNAMIC symbols\n\t      # are required to link).\n\t      if test -n \"$old_library\"; then\n\t        func_append newdlprefiles \" $dir/$old_library\"\n\t        # Keep a list of preopened convenience libraries to check\n\t        # that they are being used correctly in the link pass.\n\t        test -z \"$libdir\" && \\\n\t          func_append dlpreconveniencelibs \" $dir/$old_library\"\n\t      # Otherwise, use the dlname, so that lt_dlopen finds it.\n\t      elif test -n \"$dlname\"; then\n\t        func_append newdlprefiles \" $dir/$dlname\"\n\t      else\n\t        func_append newdlprefiles \" $dir/$linklib\"\n\t      fi\n\t    ;;\n\t  esac\n\tfi # $pass = dlpreopen\n\n\tif test -z \"$libdir\"; then\n\t  # Link the convenience library\n\t  if test \"$linkmode\" = lib; then\n\t    deplibs=\"$dir/$old_library $deplibs\"\n\t  elif test \"$linkmode,$pass\" = \"prog,link\"; then\n\t    compile_deplibs=\"$dir/$old_library $compile_deplibs\"\n\t    finalize_deplibs=\"$dir/$old_library $finalize_deplibs\"\n\t  else\n\t    deplibs=\"$lib $deplibs\" # used for prog,scan pass\n\t  fi\n\t  continue\n\tfi\n\n\n\tif test \"$linkmode\" = prog && test \"$pass\" != link; then\n\t  func_append newlib_search_path \" $ladir\"\n\t  deplibs=\"$lib $deplibs\"\n\n\t  linkalldeplibs=no\n\t  if test \"$link_all_deplibs\" != no || test -z \"$library_names\" ||\n\t     test \"$build_libtool_libs\" = no; then\n\t    linkalldeplibs=yes\n\t  fi\n\n\t  tmp_libs=\n\t  for deplib in $dependency_libs; do\n\t    case $deplib in\n\t    -L*) func_stripname '-L' '' \"$deplib\"\n\t         func_resolve_sysroot \"$func_stripname_result\"\n\t         func_append newlib_search_path \" $func_resolve_sysroot_result\"\n\t\t ;;\n\t    esac\n\t    # Need to link against all dependency_libs?\n\t    if test \"$linkalldeplibs\" = yes; then\n\t      deplibs=\"$deplib $deplibs\"\n\t    else\n\t      # Need to hardcode shared library paths\n\t      # or/and link against static libraries\n\t      newdependency_libs=\"$deplib $newdependency_libs\"\n\t    fi\n\t    if $opt_preserve_dup_deps ; then\n\t      case \"$tmp_libs \" in\n\t      *\" $deplib \"*) func_append specialdeplibs \" $deplib\" ;;\n\t      esac\n\t    fi\n\t    func_append tmp_libs \" $deplib\"\n\t  done # for deplib\n\t  continue\n\tfi # $linkmode = prog...\n\n\tif test \"$linkmode,$pass\" = \"prog,link\"; then\n\t  if test -n \"$library_names\" &&\n\t     { { test \"$prefer_static_libs\" = no ||\n\t         test \"$prefer_static_libs,$installed\" = \"built,yes\"; } ||\n\t       test -z \"$old_library\"; }; then\n\t    # We need to hardcode the library path\n\t    if test -n \"$shlibpath_var\" && test -z \"$avoidtemprpath\" ; then\n\t      # Make sure the rpath contains only unique directories.\n\t      case \"$temp_rpath:\" in\n\t      *\"$absdir:\"*) ;;\n\t      *) func_append temp_rpath \"$absdir:\" ;;\n\t      esac\n\t    fi\n\n\t    # Hardcode the library path.\n\t    # Skip directories that are in the system default run-time\n\t    # search path.\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $absdir \"*) ;;\n\t    *)\n\t      case \"$compile_rpath \" in\n\t      *\" $absdir \"*) ;;\n\t      *) func_append compile_rpath \" $absdir\" ;;\n\t      esac\n\t      ;;\n\t    esac\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $libdir \"*) ;;\n\t    *)\n\t      case \"$finalize_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) func_append finalize_rpath \" $libdir\" ;;\n\t      esac\n\t      ;;\n\t    esac\n\t  fi # $linkmode,$pass = prog,link...\n\n\t  if test \"$alldeplibs\" = yes &&\n\t     { test \"$deplibs_check_method\" = pass_all ||\n\t       { test \"$build_libtool_libs\" = yes &&\n\t\t test -n \"$library_names\"; }; }; then\n\t    # We only need to search for static libraries\n\t    continue\n\t  fi\n\tfi\n\n\tlink_static=no # Whether the deplib will be linked statically\n\tuse_static_libs=$prefer_static_libs\n\tif test \"$use_static_libs\" = built && test \"$installed\" = yes; then\n\t  use_static_libs=no\n\tfi\n\tif test -n \"$library_names\" &&\n\t   { test \"$use_static_libs\" = no || test -z \"$old_library\"; }; then\n\t  case $host in\n\t  *cygwin* | *mingw* | *cegcc*)\n\t      # No point in relinking DLLs because paths are not encoded\n\t      func_append notinst_deplibs \" $lib\"\n\t      need_relink=no\n\t    ;;\n\t  *)\n\t    if test \"$installed\" = no; then\n\t      func_append notinst_deplibs \" $lib\"\n\t      need_relink=yes\n\t    fi\n\t    ;;\n\t  esac\n\t  # This is a shared library\n\n\t  # Warn about portability, can't link against -module's on some\n\t  # systems (darwin).  Don't bleat about dlopened modules though!\n\t  dlopenmodule=\"\"\n\t  for dlpremoduletest in $dlprefiles; do\n\t    if test \"X$dlpremoduletest\" = \"X$lib\"; then\n\t      dlopenmodule=\"$dlpremoduletest\"\n\t      break\n\t    fi\n\t  done\n\t  if test -z \"$dlopenmodule\" && test \"$shouldnotlink\" = yes && test \"$pass\" = link; then\n\t    echo\n\t    if test \"$linkmode\" = prog; then\n\t      $ECHO \"*** Warning: Linking the executable $output against the loadable module\"\n\t    else\n\t      $ECHO \"*** Warning: Linking the shared library $output against the loadable module\"\n\t    fi\n\t    $ECHO \"*** $linklib is not portable!\"\n\t  fi\n\t  if test \"$linkmode\" = lib &&\n\t     test \"$hardcode_into_libs\" = yes; then\n\t    # Hardcode the library path.\n\t    # Skip directories that are in the system default run-time\n\t    # search path.\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $absdir \"*) ;;\n\t    *)\n\t      case \"$compile_rpath \" in\n\t      *\" $absdir \"*) ;;\n\t      *) func_append compile_rpath \" $absdir\" ;;\n\t      esac\n\t      ;;\n\t    esac\n\t    case \" $sys_lib_dlsearch_path \" in\n\t    *\" $libdir \"*) ;;\n\t    *)\n\t      case \"$finalize_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) func_append finalize_rpath \" $libdir\" ;;\n\t      esac\n\t      ;;\n\t    esac\n\t  fi\n\n\t  if test -n \"$old_archive_from_expsyms_cmds\"; then\n\t    # figure out the soname\n\t    set dummy $library_names\n\t    shift\n\t    realname=\"$1\"\n\t    shift\n\t    libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t    # use dlname if we got it. it's perfectly good, no?\n\t    if test -n \"$dlname\"; then\n\t      soname=\"$dlname\"\n\t    elif test -n \"$soname_spec\"; then\n\t      # bleh windows\n\t      case $host in\n\t      *cygwin* | mingw* | *cegcc*)\n\t        func_arith $current - $age\n\t\tmajor=$func_arith_result\n\t\tversuffix=\"-$major\"\n\t\t;;\n\t      esac\n\t      eval soname=\\\"$soname_spec\\\"\n\t    else\n\t      soname=\"$realname\"\n\t    fi\n\n\t    # Make a new name for the extract_expsyms_cmds to use\n\t    soroot=\"$soname\"\n\t    func_basename \"$soroot\"\n\t    soname=\"$func_basename_result\"\n\t    func_stripname 'lib' '.dll' \"$soname\"\n\t    newlib=libimp-$func_stripname_result.a\n\n\t    # If the library has no export list, then create one now\n\t    if test -f \"$output_objdir/$soname-def\"; then :\n\t    else\n\t      func_verbose \"extracting exported symbol list from \\`$soname'\"\n\t      func_execute_cmds \"$extract_expsyms_cmds\" 'exit $?'\n\t    fi\n\n\t    # Create $newlib\n\t    if test -f \"$output_objdir/$newlib\"; then :; else\n\t      func_verbose \"generating import library for \\`$soname'\"\n\t      func_execute_cmds \"$old_archive_from_expsyms_cmds\" 'exit $?'\n\t    fi\n\t    # make sure the library variables are pointing to the new library\n\t    dir=$output_objdir\n\t    linklib=$newlib\n\t  fi # test -n \"$old_archive_from_expsyms_cmds\"\n\n\t  if test \"$linkmode\" = prog || test \"$opt_mode\" != relink; then\n\t    add_shlibpath=\n\t    add_dir=\n\t    add=\n\t    lib_linked=yes\n\t    case $hardcode_action in\n\t    immediate | unsupported)\n\t      if test \"$hardcode_direct\" = no; then\n\t\tadd=\"$dir/$linklib\"\n\t\tcase $host in\n\t\t  *-*-sco3.2v5.0.[024]*) add_dir=\"-L$dir\" ;;\n\t\t  *-*-sysv4*uw2*) add_dir=\"-L$dir\" ;;\n\t\t  *-*-sysv5OpenUNIX* | *-*-sysv5UnixWare7.[01].[10]* | \\\n\t\t    *-*-unixware7*) add_dir=\"-L$dir\" ;;\n\t\t  *-*-darwin* )\n\t\t    # if the lib is a (non-dlopened) module then we can not\n\t\t    # link against it, someone is ignoring the earlier warnings\n\t\t    if /usr/bin/file -L $add 2> /dev/null |\n\t\t\t $GREP \": [^:]* bundle\" >/dev/null ; then\n\t\t      if test \"X$dlopenmodule\" != \"X$lib\"; then\n\t\t\t$ECHO \"*** Warning: lib $linklib is a module, not a shared library\"\n\t\t\tif test -z \"$old_library\" ; then\n\t\t\t  echo\n\t\t\t  echo \"*** And there doesn't seem to be a static archive available\"\n\t\t\t  echo \"*** The link will probably fail, sorry\"\n\t\t\telse\n\t\t\t  add=\"$dir/$old_library\"\n\t\t\tfi\n\t\t      elif test -n \"$old_library\"; then\n\t\t\tadd=\"$dir/$old_library\"\n\t\t      fi\n\t\t    fi\n\t\tesac\n\t      elif test \"$hardcode_minus_L\" = no; then\n\t\tcase $host in\n\t\t*-*-sunos*) add_shlibpath=\"$dir\" ;;\n\t\tesac\n\t\tadd_dir=\"-L$dir\"\n\t\tadd=\"-l$name\"\n\t      elif test \"$hardcode_shlibpath_var\" = no; then\n\t\tadd_shlibpath=\"$dir\"\n\t\tadd=\"-l$name\"\n\t      else\n\t\tlib_linked=no\n\t      fi\n\t      ;;\n\t    relink)\n\t      if test \"$hardcode_direct\" = yes &&\n\t         test \"$hardcode_direct_absolute\" = no; then\n\t\tadd=\"$dir/$linklib\"\n\t      elif test \"$hardcode_minus_L\" = yes; then\n\t\tadd_dir=\"-L$absdir\"\n\t\t# Try looking first in the location we're being installed to.\n\t\tif test -n \"$inst_prefix_dir\"; then\n\t\t  case $libdir in\n\t\t    [\\\\/]*)\n\t\t      func_append add_dir \" -L$inst_prefix_dir$libdir\"\n\t\t      ;;\n\t\t  esac\n\t\tfi\n\t\tadd=\"-l$name\"\n\t      elif test \"$hardcode_shlibpath_var\" = yes; then\n\t\tadd_shlibpath=\"$dir\"\n\t\tadd=\"-l$name\"\n\t      else\n\t\tlib_linked=no\n\t      fi\n\t      ;;\n\t    *) lib_linked=no ;;\n\t    esac\n\n\t    if test \"$lib_linked\" != yes; then\n\t      func_fatal_configuration \"unsupported hardcode properties\"\n\t    fi\n\n\t    if test -n \"$add_shlibpath\"; then\n\t      case :$compile_shlibpath: in\n\t      *\":$add_shlibpath:\"*) ;;\n\t      *) func_append compile_shlibpath \"$add_shlibpath:\" ;;\n\t      esac\n\t    fi\n\t    if test \"$linkmode\" = prog; then\n\t      test -n \"$add_dir\" && compile_deplibs=\"$add_dir $compile_deplibs\"\n\t      test -n \"$add\" && compile_deplibs=\"$add $compile_deplibs\"\n\t    else\n\t      test -n \"$add_dir\" && deplibs=\"$add_dir $deplibs\"\n\t      test -n \"$add\" && deplibs=\"$add $deplibs\"\n\t      if test \"$hardcode_direct\" != yes &&\n\t\t test \"$hardcode_minus_L\" != yes &&\n\t\t test \"$hardcode_shlibpath_var\" = yes; then\n\t\tcase :$finalize_shlibpath: in\n\t\t*\":$libdir:\"*) ;;\n\t\t*) func_append finalize_shlibpath \"$libdir:\" ;;\n\t\tesac\n\t      fi\n\t    fi\n\t  fi\n\n\t  if test \"$linkmode\" = prog || test \"$opt_mode\" = relink; then\n\t    add_shlibpath=\n\t    add_dir=\n\t    add=\n\t    # Finalize command for both is simple: just hardcode it.\n\t    if test \"$hardcode_direct\" = yes &&\n\t       test \"$hardcode_direct_absolute\" = no; then\n\t      add=\"$libdir/$linklib\"\n\t    elif test \"$hardcode_minus_L\" = yes; then\n\t      add_dir=\"-L$libdir\"\n\t      add=\"-l$name\"\n\t    elif test \"$hardcode_shlibpath_var\" = yes; then\n\t      case :$finalize_shlibpath: in\n\t      *\":$libdir:\"*) ;;\n\t      *) func_append finalize_shlibpath \"$libdir:\" ;;\n\t      esac\n\t      add=\"-l$name\"\n\t    elif test \"$hardcode_automatic\" = yes; then\n\t      if test -n \"$inst_prefix_dir\" &&\n\t\t test -f \"$inst_prefix_dir$libdir/$linklib\" ; then\n\t\tadd=\"$inst_prefix_dir$libdir/$linklib\"\n\t      else\n\t\tadd=\"$libdir/$linklib\"\n\t      fi\n\t    else\n\t      # We cannot seem to hardcode it, guess we'll fake it.\n\t      add_dir=\"-L$libdir\"\n\t      # Try looking first in the location we're being installed to.\n\t      if test -n \"$inst_prefix_dir\"; then\n\t\tcase $libdir in\n\t\t  [\\\\/]*)\n\t\t    func_append add_dir \" -L$inst_prefix_dir$libdir\"\n\t\t    ;;\n\t\tesac\n\t      fi\n\t      add=\"-l$name\"\n\t    fi\n\n\t    if test \"$linkmode\" = prog; then\n\t      test -n \"$add_dir\" && finalize_deplibs=\"$add_dir $finalize_deplibs\"\n\t      test -n \"$add\" && finalize_deplibs=\"$add $finalize_deplibs\"\n\t    else\n\t      test -n \"$add_dir\" && deplibs=\"$add_dir $deplibs\"\n\t      test -n \"$add\" && deplibs=\"$add $deplibs\"\n\t    fi\n\t  fi\n\telif test \"$linkmode\" = prog; then\n\t  # Here we assume that one of hardcode_direct or hardcode_minus_L\n\t  # is not unsupported.  This is valid on all known static and\n\t  # shared platforms.\n\t  if test \"$hardcode_direct\" != unsupported; then\n\t    test -n \"$old_library\" && linklib=\"$old_library\"\n\t    compile_deplibs=\"$dir/$linklib $compile_deplibs\"\n\t    finalize_deplibs=\"$dir/$linklib $finalize_deplibs\"\n\t  else\n\t    compile_deplibs=\"-l$name -L$dir $compile_deplibs\"\n\t    finalize_deplibs=\"-l$name -L$dir $finalize_deplibs\"\n\t  fi\n\telif test \"$build_libtool_libs\" = yes; then\n\t  # Not a shared library\n\t  if test \"$deplibs_check_method\" != pass_all; then\n\t    # We're trying link a shared library against a static one\n\t    # but the system doesn't support it.\n\n\t    # Just print a warning and add the library to dependency_libs so\n\t    # that the program can be linked against the static library.\n\t    echo\n\t    $ECHO \"*** Warning: This system can not link to static lib archive $lib.\"\n\t    echo \"*** I have the capability to make that library automatically link in when\"\n\t    echo \"*** you link to this library.  But I can only do this if you have a\"\n\t    echo \"*** shared version of the library, which you do not appear to have.\"\n\t    if test \"$module\" = yes; then\n\t      echo \"*** But as you try to build a module library, libtool will still create \"\n\t      echo \"*** a static module, that should work as long as the dlopening application\"\n\t      echo \"*** is linked with the -dlopen flag to resolve symbols at runtime.\"\n\t      if test -z \"$global_symbol_pipe\"; then\n\t\techo\n\t\techo \"*** However, this would only work if libtool was able to extract symbol\"\n\t\techo \"*** lists from a program, using \\`nm' or equivalent, but libtool could\"\n\t\techo \"*** not find such a program.  So, this module is probably useless.\"\n\t\techo \"*** \\`nm' from GNU binutils and a full rebuild may help.\"\n\t      fi\n\t      if test \"$build_old_libs\" = no; then\n\t\tbuild_libtool_libs=module\n\t\tbuild_old_libs=yes\n\t      else\n\t\tbuild_libtool_libs=no\n\t      fi\n\t    fi\n\t  else\n\t    deplibs=\"$dir/$old_library $deplibs\"\n\t    link_static=yes\n\t  fi\n\tfi # link shared/static library?\n\n\tif test \"$linkmode\" = lib; then\n\t  if test -n \"$dependency_libs\" &&\n\t     { test \"$hardcode_into_libs\" != yes ||\n\t       test \"$build_old_libs\" = yes ||\n\t       test \"$link_static\" = yes; }; then\n\t    # Extract -R from dependency_libs\n\t    temp_deplibs=\n\t    for libdir in $dependency_libs; do\n\t      case $libdir in\n\t      -R*) func_stripname '-R' '' \"$libdir\"\n\t           temp_xrpath=$func_stripname_result\n\t\t   case \" $xrpath \" in\n\t\t   *\" $temp_xrpath \"*) ;;\n\t\t   *) func_append xrpath \" $temp_xrpath\";;\n\t\t   esac;;\n\t      *) func_append temp_deplibs \" $libdir\";;\n\t      esac\n\t    done\n\t    dependency_libs=\"$temp_deplibs\"\n\t  fi\n\n\t  func_append newlib_search_path \" $absdir\"\n\t  # Link against this library\n\t  test \"$link_static\" = no && newdependency_libs=\"$abs_ladir/$laname $newdependency_libs\"\n\t  # ... and its dependency_libs\n\t  tmp_libs=\n\t  for deplib in $dependency_libs; do\n\t    newdependency_libs=\"$deplib $newdependency_libs\"\n\t    case $deplib in\n              -L*) func_stripname '-L' '' \"$deplib\"\n                   func_resolve_sysroot \"$func_stripname_result\";;\n              *) func_resolve_sysroot \"$deplib\" ;;\n            esac\n\t    if $opt_preserve_dup_deps ; then\n\t      case \"$tmp_libs \" in\n\t      *\" $func_resolve_sysroot_result \"*)\n                func_append specialdeplibs \" $func_resolve_sysroot_result\" ;;\n\t      esac\n\t    fi\n\t    func_append tmp_libs \" $func_resolve_sysroot_result\"\n\t  done\n\n\t  if test \"$link_all_deplibs\" != no; then\n\t    # Add the search paths of all dependency libraries\n\t    for deplib in $dependency_libs; do\n\t      path=\n\t      case $deplib in\n\t      -L*) path=\"$deplib\" ;;\n\t      *.la)\n\t        func_resolve_sysroot \"$deplib\"\n\t        deplib=$func_resolve_sysroot_result\n\t        func_dirname \"$deplib\" \"\" \".\"\n\t\tdir=$func_dirname_result\n\t\t# We need an absolute path.\n\t\tcase $dir in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) absdir=\"$dir\" ;;\n\t\t*)\n\t\t  absdir=`cd \"$dir\" && pwd`\n\t\t  if test -z \"$absdir\"; then\n\t\t    func_warning \"cannot determine absolute directory name of \\`$dir'\"\n\t\t    absdir=\"$dir\"\n\t\t  fi\n\t\t  ;;\n\t\tesac\n\t\tif $GREP \"^installed=no\" $deplib > /dev/null; then\n\t\tcase $host in\n\t\t*-*-darwin*)\n\t\t  depdepl=\n\t\t  eval deplibrary_names=`${SED} -n -e 's/^library_names=\\(.*\\)$/\\1/p' $deplib`\n\t\t  if test -n \"$deplibrary_names\" ; then\n\t\t    for tmp in $deplibrary_names ; do\n\t\t      depdepl=$tmp\n\t\t    done\n\t\t    if test -f \"$absdir/$objdir/$depdepl\" ; then\n\t\t      depdepl=\"$absdir/$objdir/$depdepl\"\n\t\t      darwin_install_name=`${OTOOL} -L $depdepl | awk '{if (NR == 2) {print $1;exit}}'`\n                      if test -z \"$darwin_install_name\"; then\n                          darwin_install_name=`${OTOOL64} -L $depdepl  | awk '{if (NR == 2) {print $1;exit}}'`\n                      fi\n\t\t      func_append compiler_flags \" ${wl}-dylib_file ${wl}${darwin_install_name}:${depdepl}\"\n\t\t      func_append linker_flags \" -dylib_file ${darwin_install_name}:${depdepl}\"\n\t\t      path=\n\t\t    fi\n\t\t  fi\n\t\t  ;;\n\t\t*)\n\t\t  path=\"-L$absdir/$objdir\"\n\t\t  ;;\n\t\tesac\n\t\telse\n\t\t  eval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $deplib`\n\t\t  test -z \"$libdir\" && \\\n\t\t    func_fatal_error \"\\`$deplib' is not a valid libtool archive\"\n\t\t  test \"$absdir\" != \"$libdir\" && \\\n\t\t    func_warning \"\\`$deplib' seems to be moved\"\n\n\t\t  path=\"-L$absdir\"\n\t\tfi\n\t\t;;\n\t      esac\n\t      case \" $deplibs \" in\n\t      *\" $path \"*) ;;\n\t      *) deplibs=\"$path $deplibs\" ;;\n\t      esac\n\t    done\n\t  fi # link_all_deplibs != no\n\tfi # linkmode = lib\n      done # for deplib in $libs\n      if test \"$pass\" = link; then\n\tif test \"$linkmode\" = \"prog\"; then\n\t  compile_deplibs=\"$new_inherited_linker_flags $compile_deplibs\"\n\t  finalize_deplibs=\"$new_inherited_linker_flags $finalize_deplibs\"\n\telse\n\t  compiler_flags=\"$compiler_flags \"`$ECHO \" $new_inherited_linker_flags\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tfi\n      fi\n      dependency_libs=\"$newdependency_libs\"\n      if test \"$pass\" = dlpreopen; then\n\t# Link the dlpreopened libraries before other libraries\n\tfor deplib in $save_deplibs; do\n\t  deplibs=\"$deplib $deplibs\"\n\tdone\n      fi\n      if test \"$pass\" != dlopen; then\n\tif test \"$pass\" != conv; then\n\t  # Make sure lib_search_path contains only unique directories.\n\t  lib_search_path=\n\t  for dir in $newlib_search_path; do\n\t    case \"$lib_search_path \" in\n\t    *\" $dir \"*) ;;\n\t    *) func_append lib_search_path \" $dir\" ;;\n\t    esac\n\t  done\n\t  newlib_search_path=\n\tfi\n\n\tif test \"$linkmode,$pass\" != \"prog,link\"; then\n\t  vars=\"deplibs\"\n\telse\n\t  vars=\"compile_deplibs finalize_deplibs\"\n\tfi\n\tfor var in $vars dependency_libs; do\n\t  # Add libraries to $var in reverse order\n\t  eval tmp_libs=\\\"\\$$var\\\"\n\t  new_libs=\n\t  for deplib in $tmp_libs; do\n\t    # FIXME: Pedantically, this is the right thing to do, so\n\t    #        that some nasty dependency loop isn't accidentally\n\t    #        broken:\n\t    #new_libs=\"$deplib $new_libs\"\n\t    # Pragmatically, this seems to cause very few problems in\n\t    # practice:\n\t    case $deplib in\n\t    -L*) new_libs=\"$deplib $new_libs\" ;;\n\t    -R*) ;;\n\t    *)\n\t      # And here is the reason: when a library appears more\n\t      # than once as an explicit dependence of a library, or\n\t      # is implicitly linked in more than once by the\n\t      # compiler, it is considered special, and multiple\n\t      # occurrences thereof are not removed.  Compare this\n\t      # with having the same library being listed as a\n\t      # dependency of multiple other libraries: in this case,\n\t      # we know (pedantically, we assume) the library does not\n\t      # need to be listed more than once, so we keep only the\n\t      # last copy.  This is not always right, but it is rare\n\t      # enough that we require users that really mean to play\n\t      # such unportable linking tricks to link the library\n\t      # using -Wl,-lname, so that libtool does not consider it\n\t      # for duplicate removal.\n\t      case \" $specialdeplibs \" in\n\t      *\" $deplib \"*) new_libs=\"$deplib $new_libs\" ;;\n\t      *)\n\t\tcase \" $new_libs \" in\n\t\t*\" $deplib \"*) ;;\n\t\t*) new_libs=\"$deplib $new_libs\" ;;\n\t\tesac\n\t\t;;\n\t      esac\n\t      ;;\n\t    esac\n\t  done\n\t  tmp_libs=\n\t  for deplib in $new_libs; do\n\t    case $deplib in\n\t    -L*)\n\t      case \" $tmp_libs \" in\n\t      *\" $deplib \"*) ;;\n\t      *) func_append tmp_libs \" $deplib\" ;;\n\t      esac\n\t      ;;\n\t    *) func_append tmp_libs \" $deplib\" ;;\n\t    esac\n\t  done\n\t  eval $var=\\\"$tmp_libs\\\"\n\tdone # for var\n      fi\n      # Last step: remove runtime libs from dependency_libs\n      # (they stay in deplibs)\n      tmp_libs=\n      for i in $dependency_libs ; do\n\tcase \" $predeps $postdeps $compiler_lib_search_path \" in\n\t*\" $i \"*)\n\t  i=\"\"\n\t  ;;\n\tesac\n\tif test -n \"$i\" ; then\n\t  func_append tmp_libs \" $i\"\n\tfi\n      done\n      dependency_libs=$tmp_libs\n    done # for pass\n    if test \"$linkmode\" = prog; then\n      dlfiles=\"$newdlfiles\"\n    fi\n    if test \"$linkmode\" = prog || test \"$linkmode\" = lib; then\n      dlprefiles=\"$newdlprefiles\"\n    fi\n\n    case $linkmode in\n    oldlib)\n      if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n\tfunc_warning \"\\`-dlopen' is ignored for archives\"\n      fi\n\n      case \" $deplibs\" in\n      *\\ -l* | *\\ -L*)\n\tfunc_warning \"\\`-l' and \\`-L' are ignored for archives\" ;;\n      esac\n\n      test -n \"$rpath\" && \\\n\tfunc_warning \"\\`-rpath' is ignored for archives\"\n\n      test -n \"$xrpath\" && \\\n\tfunc_warning \"\\`-R' is ignored for archives\"\n\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"\\`-version-info/-version-number' is ignored for archives\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"\\`-release' is ignored for archives\"\n\n      test -n \"$export_symbols$export_symbols_regex\" && \\\n\tfunc_warning \"\\`-export-symbols' is ignored for archives\"\n\n      # Now set the variables for building old libraries.\n      build_libtool_libs=no\n      oldlibs=\"$output\"\n      func_append objs \"$old_deplibs\"\n      ;;\n\n    lib)\n      # Make sure we only generate libraries of the form `libNAME.la'.\n      case $outputname in\n      lib*)\n\tfunc_stripname 'lib' '.la' \"$outputname\"\n\tname=$func_stripname_result\n\teval shared_ext=\\\"$shrext_cmds\\\"\n\teval libname=\\\"$libname_spec\\\"\n\t;;\n      *)\n\ttest \"$module\" = no && \\\n\t  func_fatal_help \"libtool library \\`$output' must begin with \\`lib'\"\n\n\tif test \"$need_lib_prefix\" != no; then\n\t  # Add the \"lib\" prefix for modules if required\n\t  func_stripname '' '.la' \"$outputname\"\n\t  name=$func_stripname_result\n\t  eval shared_ext=\\\"$shrext_cmds\\\"\n\t  eval libname=\\\"$libname_spec\\\"\n\telse\n\t  func_stripname '' '.la' \"$outputname\"\n\t  libname=$func_stripname_result\n\tfi\n\t;;\n      esac\n\n      if test -n \"$objs\"; then\n\tif test \"$deplibs_check_method\" != pass_all; then\n\t  func_fatal_error \"cannot build libtool library \\`$output' from non-libtool objects on this host:$objs\"\n\telse\n\t  echo\n\t  $ECHO \"*** Warning: Linking the shared library $output against the non-libtool\"\n\t  $ECHO \"*** objects $objs is not portable!\"\n\t  func_append libobjs \" $objs\"\n\tfi\n      fi\n\n      test \"$dlself\" != no && \\\n\tfunc_warning \"\\`-dlopen self' is ignored for libtool libraries\"\n\n      set dummy $rpath\n      shift\n      test \"$#\" -gt 1 && \\\n\tfunc_warning \"ignoring multiple \\`-rpath's for a libtool library\"\n\n      install_libdir=\"$1\"\n\n      oldlibs=\n      if test -z \"$rpath\"; then\n\tif test \"$build_libtool_libs\" = yes; then\n\t  # Building a libtool convenience library.\n\t  # Some compilers have problems with a `.al' extension so\n\t  # convenience libraries should have the same extension an\n\t  # archive normally would.\n\t  oldlibs=\"$output_objdir/$libname.$libext $oldlibs\"\n\t  build_libtool_libs=convenience\n\t  build_old_libs=yes\n\tfi\n\n\ttest -n \"$vinfo\" && \\\n\t  func_warning \"\\`-version-info/-version-number' is ignored for convenience libraries\"\n\n\ttest -n \"$release\" && \\\n\t  func_warning \"\\`-release' is ignored for convenience libraries\"\n      else\n\n\t# Parse the version information argument.\n\tsave_ifs=\"$IFS\"; IFS=':'\n\tset dummy $vinfo 0 0 0\n\tshift\n\tIFS=\"$save_ifs\"\n\n\ttest -n \"$7\" && \\\n\t  func_fatal_help \"too many parameters to \\`-version-info'\"\n\n\t# convert absolute version numbers to libtool ages\n\t# this retains compatibility with .la files and attempts\n\t# to make the code below a bit more comprehensible\n\n\tcase $vinfo_number in\n\tyes)\n\t  number_major=\"$1\"\n\t  number_minor=\"$2\"\n\t  number_revision=\"$3\"\n\t  #\n\t  # There are really only two kinds -- those that\n\t  # use the current revision as the major version\n\t  # and those that subtract age and use age as\n\t  # a minor version.  But, then there is irix\n\t  # which has an extra 1 added just for fun\n\t  #\n\t  case $version_type in\n\t  # correct linux to gnu/linux during the next big refactor\n\t  darwin|linux|osf|windows|none)\n\t    func_arith $number_major + $number_minor\n\t    current=$func_arith_result\n\t    age=\"$number_minor\"\n\t    revision=\"$number_revision\"\n\t    ;;\n\t  freebsd-aout|freebsd-elf|qnx|sunos)\n\t    current=\"$number_major\"\n\t    revision=\"$number_minor\"\n\t    age=\"0\"\n\t    ;;\n\t  irix|nonstopux)\n\t    func_arith $number_major + $number_minor\n\t    current=$func_arith_result\n\t    age=\"$number_minor\"\n\t    revision=\"$number_minor\"\n\t    lt_irix_increment=no\n\t    ;;\n\t  *)\n\t    func_fatal_configuration \"$modename: unknown library version type \\`$version_type'\"\n\t    ;;\n\t  esac\n\t  ;;\n\tno)\n\t  current=\"$1\"\n\t  revision=\"$2\"\n\t  age=\"$3\"\n\t  ;;\n\tesac\n\n\t# Check that each of the things are valid numbers.\n\tcase $current in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"CURRENT \\`$current' must be a nonnegative integer\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tcase $revision in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"REVISION \\`$revision' must be a nonnegative integer\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tcase $age in\n\t0|[1-9]|[1-9][0-9]|[1-9][0-9][0-9]|[1-9][0-9][0-9][0-9]|[1-9][0-9][0-9][0-9][0-9]) ;;\n\t*)\n\t  func_error \"AGE \\`$age' must be a nonnegative integer\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\t  ;;\n\tesac\n\n\tif test \"$age\" -gt \"$current\"; then\n\t  func_error \"AGE \\`$age' is greater than the current interface number \\`$current'\"\n\t  func_fatal_error \"\\`$vinfo' is not valid version information\"\n\tfi\n\n\t# Calculate the version variables.\n\tmajor=\n\tversuffix=\n\tverstring=\n\tcase $version_type in\n\tnone) ;;\n\n\tdarwin)\n\t  # Like Linux, but with the current version available in\n\t  # verstring for coding it into the library header\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=\"$major.$age.$revision\"\n\t  # Darwin ld doesn't like 0 for these options...\n\t  func_arith $current + 1\n\t  minor_current=$func_arith_result\n\t  xlcverstring=\"${wl}-compatibility_version ${wl}$minor_current ${wl}-current_version ${wl}$minor_current.$revision\"\n\t  verstring=\"-compatibility_version $minor_current -current_version $minor_current.$revision\"\n\t  ;;\n\n\tfreebsd-aout)\n\t  major=\".$current\"\n\t  versuffix=\".$current.$revision\";\n\t  ;;\n\n\tfreebsd-elf)\n\t  major=\".$current\"\n\t  versuffix=\".$current\"\n\t  ;;\n\n\tirix | nonstopux)\n\t  if test \"X$lt_irix_increment\" = \"Xno\"; then\n\t    func_arith $current - $age\n\t  else\n\t    func_arith $current - $age + 1\n\t  fi\n\t  major=$func_arith_result\n\n\t  case $version_type in\n\t    nonstopux) verstring_prefix=nonstopux ;;\n\t    *)         verstring_prefix=sgi ;;\n\t  esac\n\t  verstring=\"$verstring_prefix$major.$revision\"\n\n\t  # Add in all the interfaces that we are compatible with.\n\t  loop=$revision\n\t  while test \"$loop\" -ne 0; do\n\t    func_arith $revision - $loop\n\t    iface=$func_arith_result\n\t    func_arith $loop - 1\n\t    loop=$func_arith_result\n\t    verstring=\"$verstring_prefix$major.$iface:$verstring\"\n\t  done\n\n\t  # Before this point, $major must not contain `.'.\n\t  major=.$major\n\t  versuffix=\"$major.$revision\"\n\t  ;;\n\n\tlinux) # correct to gnu/linux during the next big refactor\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=\"$major.$age.$revision\"\n\t  ;;\n\n\tosf)\n\t  func_arith $current - $age\n\t  major=.$func_arith_result\n\t  versuffix=\".$current.$age.$revision\"\n\t  verstring=\"$current.$age.$revision\"\n\n\t  # Add in all the interfaces that we are compatible with.\n\t  loop=$age\n\t  while test \"$loop\" -ne 0; do\n\t    func_arith $current - $loop\n\t    iface=$func_arith_result\n\t    func_arith $loop - 1\n\t    loop=$func_arith_result\n\t    verstring=\"$verstring:${iface}.0\"\n\t  done\n\n\t  # Make executables depend on our current version.\n\t  func_append verstring \":${current}.0\"\n\t  ;;\n\n\tqnx)\n\t  major=\".$current\"\n\t  versuffix=\".$current\"\n\t  ;;\n\n\tsunos)\n\t  major=\".$current\"\n\t  versuffix=\".$current.$revision\"\n\t  ;;\n\n\twindows)\n\t  # Use '-' rather than '.', since we only want one\n\t  # extension on DOS 8.3 filesystems.\n\t  func_arith $current - $age\n\t  major=$func_arith_result\n\t  versuffix=\"-$major\"\n\t  ;;\n\n\t*)\n\t  func_fatal_configuration \"unknown library version type \\`$version_type'\"\n\t  ;;\n\tesac\n\n\t# Clear the version info if we defaulted, and they specified a release.\n\tif test -z \"$vinfo\" && test -n \"$release\"; then\n\t  major=\n\t  case $version_type in\n\t  darwin)\n\t    # we can't check for \"0.0\" in archive_cmds due to quoting\n\t    # problems, so we reset it completely\n\t    verstring=\n\t    ;;\n\t  *)\n\t    verstring=\"0.0\"\n\t    ;;\n\t  esac\n\t  if test \"$need_version\" = no; then\n\t    versuffix=\n\t  else\n\t    versuffix=\".0.0\"\n\t  fi\n\tfi\n\n\t# Remove version info from name if versioning should be avoided\n\tif test \"$avoid_version\" = yes && test \"$need_version\" = no; then\n\t  major=\n\t  versuffix=\n\t  verstring=\"\"\n\tfi\n\n\t# Check to see if the archive will have undefined symbols.\n\tif test \"$allow_undefined\" = yes; then\n\t  if test \"$allow_undefined_flag\" = unsupported; then\n\t    func_warning \"undefined symbols not allowed in $host shared libraries\"\n\t    build_libtool_libs=no\n\t    build_old_libs=yes\n\t  fi\n\telse\n\t  # Don't allow undefined symbols.\n\t  allow_undefined_flag=\"$no_undefined_flag\"\n\tfi\n\n      fi\n\n      func_generate_dlsyms \"$libname\" \"$libname\" \"yes\"\n      func_append libobjs \" $symfileobj\"\n      test \"X$libobjs\" = \"X \" && libobjs=\n\n      if test \"$opt_mode\" != relink; then\n\t# Remove our outputs, but don't remove object files since they\n\t# may have been created when compiling PIC objects.\n\tremovelist=\n\ttempremovelist=`$ECHO \"$output_objdir/*\"`\n\tfor p in $tempremovelist; do\n\t  case $p in\n\t    *.$objext | *.gcno)\n\t       ;;\n\t    $output_objdir/$outputname | $output_objdir/$libname.* | $output_objdir/${libname}${release}.*)\n\t       if test \"X$precious_files_regex\" != \"X\"; then\n\t\t if $ECHO \"$p\" | $EGREP -e \"$precious_files_regex\" >/dev/null 2>&1\n\t\t then\n\t\t   continue\n\t\t fi\n\t       fi\n\t       func_append removelist \" $p\"\n\t       ;;\n\t    *) ;;\n\t  esac\n\tdone\n\ttest -n \"$removelist\" && \\\n\t  func_show_eval \"${RM}r \\$removelist\"\n      fi\n\n      # Now set the variables for building old libraries.\n      if test \"$build_old_libs\" = yes && test \"$build_libtool_libs\" != convenience ; then\n\tfunc_append oldlibs \" $output_objdir/$libname.$libext\"\n\n\t# Transform .lo files to .o files.\n\toldobjs=\"$objs \"`$ECHO \"$libobjs\" | $SP2NL | $SED \"/\\.${libext}$/d; $lo2o\" | $NL2SP`\n      fi\n\n      # Eliminate all temporary directories.\n      #for path in $notinst_path; do\n      #\tlib_search_path=`$ECHO \"$lib_search_path \" | $SED \"s% $path % %g\"`\n      #\tdeplibs=`$ECHO \"$deplibs \" | $SED \"s% -L$path % %g\"`\n      #\tdependency_libs=`$ECHO \"$dependency_libs \" | $SED \"s% -L$path % %g\"`\n      #done\n\n      if test -n \"$xrpath\"; then\n\t# If the user specified any rpath flags, then add them.\n\ttemp_xrpath=\n\tfor libdir in $xrpath; do\n\t  func_replace_sysroot \"$libdir\"\n\t  func_append temp_xrpath \" -R$func_replace_sysroot_result\"\n\t  case \"$finalize_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append finalize_rpath \" $libdir\" ;;\n\t  esac\n\tdone\n\tif test \"$hardcode_into_libs\" != yes || test \"$build_old_libs\" = yes; then\n\t  dependency_libs=\"$temp_xrpath $dependency_libs\"\n\tfi\n      fi\n\n      # Make sure dlfiles contains only unique files that won't be dlpreopened\n      old_dlfiles=\"$dlfiles\"\n      dlfiles=\n      for lib in $old_dlfiles; do\n\tcase \" $dlprefiles $dlfiles \" in\n\t*\" $lib \"*) ;;\n\t*) func_append dlfiles \" $lib\" ;;\n\tesac\n      done\n\n      # Make sure dlprefiles contains only unique files\n      old_dlprefiles=\"$dlprefiles\"\n      dlprefiles=\n      for lib in $old_dlprefiles; do\n\tcase \"$dlprefiles \" in\n\t*\" $lib \"*) ;;\n\t*) func_append dlprefiles \" $lib\" ;;\n\tesac\n      done\n\n      if test \"$build_libtool_libs\" = yes; then\n\tif test -n \"$rpath\"; then\n\t  case $host in\n\t  *-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-*-beos* | *-cegcc* | *-*-haiku*)\n\t    # these systems don't actually have a c library (as such)!\n\t    ;;\n\t  *-*-rhapsody* | *-*-darwin1.[012])\n\t    # Rhapsody C library is in the System framework\n\t    func_append deplibs \" System.ltframework\"\n\t    ;;\n\t  *-*-netbsd*)\n\t    # Don't link with libc until the a.out ld.so is fixed.\n\t    ;;\n\t  *-*-openbsd* | *-*-freebsd* | *-*-dragonfly*)\n\t    # Do not include libc due to us having libc/libc_r.\n\t    ;;\n\t  *-*-sco3.2v5* | *-*-sco5v6*)\n\t    # Causes problems with __ctype\n\t    ;;\n\t  *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*)\n\t    # Compiler inserts libc in the correct place for threads to work\n\t    ;;\n\t  *)\n\t    # Add libc to deplibs on all other systems if necessary.\n\t    if test \"$build_libtool_need_lc\" = \"yes\"; then\n\t      func_append deplibs \" -lc\"\n\t    fi\n\t    ;;\n\t  esac\n\tfi\n\n\t# Transform deplibs into only deplibs that can be linked in shared.\n\tname_save=$name\n\tlibname_save=$libname\n\trelease_save=$release\n\tversuffix_save=$versuffix\n\tmajor_save=$major\n\t# I'm not sure if I'm treating the release correctly.  I think\n\t# release should show up in the -l (ie -lgmp5) so we don't want to\n\t# add it in twice.  Is that correct?\n\trelease=\"\"\n\tversuffix=\"\"\n\tmajor=\"\"\n\tnewdeplibs=\n\tdroppeddeps=no\n\tcase $deplibs_check_method in\n\tpass_all)\n\t  # Don't check for shared/static.  Everything works.\n\t  # This might be a little naive.  We might want to check\n\t  # whether the library exists or not.  But this is on\n\t  # osf3 & osf4 and I'm not really sure... Just\n\t  # implementing what was already the behavior.\n\t  newdeplibs=$deplibs\n\t  ;;\n\ttest_compile)\n\t  # This code stresses the \"libraries are programs\" paradigm to its\n\t  # limits. Maybe even breaks it.  We compile a program, linking it\n\t  # against the deplibs as a proxy for the library.  Then we can check\n\t  # whether they linked in statically or dynamically with ldd.\n\t  $opt_dry_run || $RM conftest.c\n\t  cat > conftest.c <<EOF\n\t  int main() { return 0; }\nEOF\n\t  $opt_dry_run || $RM conftest\n\t  if $LTCC $LTCFLAGS -o conftest conftest.c $deplibs; then\n\t    ldd_output=`ldd conftest`\n\t    for i in $deplibs; do\n\t      case $i in\n\t      -l*)\n\t\tfunc_stripname -l '' \"$i\"\n\t\tname=$func_stripname_result\n\t\tif test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\t  case \" $predeps $postdeps \" in\n\t\t  *\" $i \"*)\n\t\t    func_append newdeplibs \" $i\"\n\t\t    i=\"\"\n\t\t    ;;\n\t\t  esac\n\t\tfi\n\t\tif test -n \"$i\" ; then\n\t\t  libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\t  deplib_matches=`eval \"\\\\$ECHO \\\"$library_names_spec\\\"\"`\n\t\t  set dummy $deplib_matches; shift\n\t\t  deplib_match=$1\n\t\t  if test `expr \"$ldd_output\" : \".*$deplib_match\"` -ne 0 ; then\n\t\t    func_append newdeplibs \" $i\"\n\t\t  else\n\t\t    droppeddeps=yes\n\t\t    echo\n\t\t    $ECHO \"*** Warning: dynamic linker does not accept needed library $i.\"\n\t\t    echo \"*** I have the capability to make that library automatically link in when\"\n\t\t    echo \"*** you link to this library.  But I can only do this if you have a\"\n\t\t    echo \"*** shared version of the library, which I believe you do not have\"\n\t\t    echo \"*** because a test_compile did reveal that the linker did not use it for\"\n\t\t    echo \"*** its dynamic dependency list that programs get resolved with at runtime.\"\n\t\t  fi\n\t\tfi\n\t\t;;\n\t      *)\n\t\tfunc_append newdeplibs \" $i\"\n\t\t;;\n\t      esac\n\t    done\n\t  else\n\t    # Error occurred in the first compile.  Let's try to salvage\n\t    # the situation: Compile a separate program for each library.\n\t    for i in $deplibs; do\n\t      case $i in\n\t      -l*)\n\t\tfunc_stripname -l '' \"$i\"\n\t\tname=$func_stripname_result\n\t\t$opt_dry_run || $RM conftest\n\t\tif $LTCC $LTCFLAGS -o conftest conftest.c $i; then\n\t\t  ldd_output=`ldd conftest`\n\t\t  if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\t    case \" $predeps $postdeps \" in\n\t\t    *\" $i \"*)\n\t\t      func_append newdeplibs \" $i\"\n\t\t      i=\"\"\n\t\t      ;;\n\t\t    esac\n\t\t  fi\n\t\t  if test -n \"$i\" ; then\n\t\t    libname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\t    deplib_matches=`eval \"\\\\$ECHO \\\"$library_names_spec\\\"\"`\n\t\t    set dummy $deplib_matches; shift\n\t\t    deplib_match=$1\n\t\t    if test `expr \"$ldd_output\" : \".*$deplib_match\"` -ne 0 ; then\n\t\t      func_append newdeplibs \" $i\"\n\t\t    else\n\t\t      droppeddeps=yes\n\t\t      echo\n\t\t      $ECHO \"*** Warning: dynamic linker does not accept needed library $i.\"\n\t\t      echo \"*** I have the capability to make that library automatically link in when\"\n\t\t      echo \"*** you link to this library.  But I can only do this if you have a\"\n\t\t      echo \"*** shared version of the library, which you do not appear to have\"\n\t\t      echo \"*** because a test_compile did reveal that the linker did not use this one\"\n\t\t      echo \"*** as a dynamic dependency that programs can get resolved with at runtime.\"\n\t\t    fi\n\t\t  fi\n\t\telse\n\t\t  droppeddeps=yes\n\t\t  echo\n\t\t  $ECHO \"*** Warning!  Library $i is needed by this library but I was not able to\"\n\t\t  echo \"*** make it link in!  You will probably need to install it or some\"\n\t\t  echo \"*** library that it depends on before this library will be fully\"\n\t\t  echo \"*** functional.  Installing it before continuing would be even better.\"\n\t\tfi\n\t\t;;\n\t      *)\n\t\tfunc_append newdeplibs \" $i\"\n\t\t;;\n\t      esac\n\t    done\n\t  fi\n\t  ;;\n\tfile_magic*)\n\t  set dummy $deplibs_check_method; shift\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t  for a_deplib in $deplibs; do\n\t    case $a_deplib in\n\t    -l*)\n\t      func_stripname -l '' \"$a_deplib\"\n\t      name=$func_stripname_result\n\t      if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\tcase \" $predeps $postdeps \" in\n\t\t*\" $a_deplib \"*)\n\t\t  func_append newdeplibs \" $a_deplib\"\n\t\t  a_deplib=\"\"\n\t\t  ;;\n\t\tesac\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tlibname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\tif test -n \"$file_magic_glob\"; then\n\t\t  libnameglob=`func_echo_all \"$libname\" | $SED -e $file_magic_glob`\n\t\telse\n\t\t  libnameglob=$libname\n\t\tfi\n\t\ttest \"$want_nocaseglob\" = yes && nocaseglob=`shopt -p nocaseglob`\n\t\tfor i in $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t\t  if test \"$want_nocaseglob\" = yes; then\n\t\t    shopt -s nocaseglob\n\t\t    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`\n\t\t    $nocaseglob\n\t\t  else\n\t\t    potential_libs=`ls $i/$libnameglob[.-]* 2>/dev/null`\n\t\t  fi\n\t\t  for potent_lib in $potential_libs; do\n\t\t      # Follow soft links.\n\t\t      if ls -lLd \"$potent_lib\" 2>/dev/null |\n\t\t\t $GREP \" -> \" >/dev/null; then\n\t\t\tcontinue\n\t\t      fi\n\t\t      # The statement above tries to avoid entering an\n\t\t      # endless loop below, in case of cyclic links.\n\t\t      # We might still enter an endless loop, since a link\n\t\t      # loop can be closed while we follow links,\n\t\t      # but so what?\n\t\t      potlib=\"$potent_lib\"\n\t\t      while test -h \"$potlib\" 2>/dev/null; do\n\t\t\tpotliblink=`ls -ld $potlib | ${SED} 's/.* -> //'`\n\t\t\tcase $potliblink in\n\t\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) potlib=\"$potliblink\";;\n\t\t\t*) potlib=`$ECHO \"$potlib\" | $SED 's,[^/]*$,,'`\"$potliblink\";;\n\t\t\tesac\n\t\t      done\n\t\t      if eval $file_magic_cmd \\\"\\$potlib\\\" 2>/dev/null |\n\t\t\t $SED -e 10q |\n\t\t\t $EGREP \"$file_magic_regex\" > /dev/null; then\n\t\t\tfunc_append newdeplibs \" $a_deplib\"\n\t\t\ta_deplib=\"\"\n\t\t\tbreak 2\n\t\t      fi\n\t\t  done\n\t\tdone\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tdroppeddeps=yes\n\t\techo\n\t\t$ECHO \"*** Warning: linker path does not have real file for library $a_deplib.\"\n\t\techo \"*** I have the capability to make that library automatically link in when\"\n\t\techo \"*** you link to this library.  But I can only do this if you have a\"\n\t\techo \"*** shared version of the library, which you do not appear to have\"\n\t\techo \"*** because I did check the linker path looking for a file starting\"\n\t\tif test -z \"$potlib\" ; then\n\t\t  $ECHO \"*** with $libname but no candidates were found. (...for file magic test)\"\n\t\telse\n\t\t  $ECHO \"*** with $libname and none of the candidates passed a file format test\"\n\t\t  $ECHO \"*** using a file magic. Last file checked: $potlib\"\n\t\tfi\n\t      fi\n\t      ;;\n\t    *)\n\t      # Add a -L argument.\n\t      func_append newdeplibs \" $a_deplib\"\n\t      ;;\n\t    esac\n\t  done # Gone through all deplibs.\n\t  ;;\n\tmatch_pattern*)\n\t  set dummy $deplibs_check_method; shift\n\t  match_pattern_regex=`expr \"$deplibs_check_method\" : \"$1 \\(.*\\)\"`\n\t  for a_deplib in $deplibs; do\n\t    case $a_deplib in\n\t    -l*)\n\t      func_stripname -l '' \"$a_deplib\"\n\t      name=$func_stripname_result\n\t      if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t\tcase \" $predeps $postdeps \" in\n\t\t*\" $a_deplib \"*)\n\t\t  func_append newdeplibs \" $a_deplib\"\n\t\t  a_deplib=\"\"\n\t\t  ;;\n\t\tesac\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tlibname=`eval \"\\\\$ECHO \\\"$libname_spec\\\"\"`\n\t\tfor i in $lib_search_path $sys_lib_search_path $shlib_search_path; do\n\t\t  potential_libs=`ls $i/$libname[.-]* 2>/dev/null`\n\t\t  for potent_lib in $potential_libs; do\n\t\t    potlib=\"$potent_lib\" # see symlink-check above in file_magic test\n\t\t    if eval \"\\$ECHO \\\"$potent_lib\\\"\" 2>/dev/null | $SED 10q | \\\n\t\t       $EGREP \"$match_pattern_regex\" > /dev/null; then\n\t\t      func_append newdeplibs \" $a_deplib\"\n\t\t      a_deplib=\"\"\n\t\t      break 2\n\t\t    fi\n\t\t  done\n\t\tdone\n\t      fi\n\t      if test -n \"$a_deplib\" ; then\n\t\tdroppeddeps=yes\n\t\techo\n\t\t$ECHO \"*** Warning: linker path does not have real file for library $a_deplib.\"\n\t\techo \"*** I have the capability to make that library automatically link in when\"\n\t\techo \"*** you link to this library.  But I can only do this if you have a\"\n\t\techo \"*** shared version of the library, which you do not appear to have\"\n\t\techo \"*** because I did check the linker path looking for a file starting\"\n\t\tif test -z \"$potlib\" ; then\n\t\t  $ECHO \"*** with $libname but no candidates were found. (...for regex pattern test)\"\n\t\telse\n\t\t  $ECHO \"*** with $libname and none of the candidates passed a file format test\"\n\t\t  $ECHO \"*** using a regex pattern. Last file checked: $potlib\"\n\t\tfi\n\t      fi\n\t      ;;\n\t    *)\n\t      # Add a -L argument.\n\t      func_append newdeplibs \" $a_deplib\"\n\t      ;;\n\t    esac\n\t  done # Gone through all deplibs.\n\t  ;;\n\tnone | unknown | *)\n\t  newdeplibs=\"\"\n\t  tmp_deplibs=`$ECHO \" $deplibs\" | $SED 's/ -lc$//; s/ -[LR][^ ]*//g'`\n\t  if test \"X$allow_libtool_libs_with_static_runtimes\" = \"Xyes\" ; then\n\t    for i in $predeps $postdeps ; do\n\t      # can't use Xsed below, because $i might contain '/'\n\t      tmp_deplibs=`$ECHO \" $tmp_deplibs\" | $SED \"s,$i,,\"`\n\t    done\n\t  fi\n\t  case $tmp_deplibs in\n\t  *[!\\\t\\ ]*)\n\t    echo\n\t    if test \"X$deplibs_check_method\" = \"Xnone\"; then\n\t      echo \"*** Warning: inter-library dependencies are not supported in this platform.\"\n\t    else\n\t      echo \"*** Warning: inter-library dependencies are not known to be supported.\"\n\t    fi\n\t    echo \"*** All declared inter-library dependencies are being dropped.\"\n\t    droppeddeps=yes\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n\tversuffix=$versuffix_save\n\tmajor=$major_save\n\trelease=$release_save\n\tlibname=$libname_save\n\tname=$name_save\n\n\tcase $host in\n\t*-*-rhapsody* | *-*-darwin1.[012])\n\t  # On Rhapsody replace the C library with the System framework\n\t  newdeplibs=`$ECHO \" $newdeplibs\" | $SED 's/ -lc / System.ltframework /'`\n\t  ;;\n\tesac\n\n\tif test \"$droppeddeps\" = yes; then\n\t  if test \"$module\" = yes; then\n\t    echo\n\t    echo \"*** Warning: libtool could not satisfy all declared inter-library\"\n\t    $ECHO \"*** dependencies of module $libname.  Therefore, libtool will create\"\n\t    echo \"*** a static module, that should work as long as the dlopening\"\n\t    echo \"*** application is linked with the -dlopen flag.\"\n\t    if test -z \"$global_symbol_pipe\"; then\n\t      echo\n\t      echo \"*** However, this would only work if libtool was able to extract symbol\"\n\t      echo \"*** lists from a program, using \\`nm' or equivalent, but libtool could\"\n\t      echo \"*** not find such a program.  So, this module is probably useless.\"\n\t      echo \"*** \\`nm' from GNU binutils and a full rebuild may help.\"\n\t    fi\n\t    if test \"$build_old_libs\" = no; then\n\t      oldlibs=\"$output_objdir/$libname.$libext\"\n\t      build_libtool_libs=module\n\t      build_old_libs=yes\n\t    else\n\t      build_libtool_libs=no\n\t    fi\n\t  else\n\t    echo \"*** The inter-library dependencies that have been dropped here will be\"\n\t    echo \"*** automatically added whenever a program is linked with this library\"\n\t    echo \"*** or is declared to -dlopen it.\"\n\n\t    if test \"$allow_undefined\" = no; then\n\t      echo\n\t      echo \"*** Since this library must not contain undefined symbols,\"\n\t      echo \"*** because either the platform does not support them or\"\n\t      echo \"*** it was explicitly requested with -no-undefined,\"\n\t      echo \"*** libtool will only create a static version of it.\"\n\t      if test \"$build_old_libs\" = no; then\n\t\toldlibs=\"$output_objdir/$libname.$libext\"\n\t\tbuild_libtool_libs=module\n\t\tbuild_old_libs=yes\n\t      else\n\t\tbuild_libtool_libs=no\n\t      fi\n\t    fi\n\t  fi\n\tfi\n\t# Done checking deplibs!\n\tdeplibs=$newdeplibs\n      fi\n      # Time to change all our \"foo.ltframework\" stuff back to \"-framework foo\"\n      case $host in\n\t*-*-darwin*)\n\t  newdeplibs=`$ECHO \" $newdeplibs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  new_inherited_linker_flags=`$ECHO \" $new_inherited_linker_flags\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  deplibs=`$ECHO \" $deplibs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t  ;;\n      esac\n\n      # move library search paths that coincide with paths to not yet\n      # installed libraries to the beginning of the library search list\n      new_libs=\n      for path in $notinst_path; do\n\tcase \" $new_libs \" in\n\t*\" -L$path/$objdir \"*) ;;\n\t*)\n\t  case \" $deplibs \" in\n\t  *\" -L$path/$objdir \"*)\n\t    func_append new_libs \" -L$path/$objdir\" ;;\n\t  esac\n\t  ;;\n\tesac\n      done\n      for deplib in $deplibs; do\n\tcase $deplib in\n\t-L*)\n\t  case \" $new_libs \" in\n\t  *\" $deplib \"*) ;;\n\t  *) func_append new_libs \" $deplib\" ;;\n\t  esac\n\t  ;;\n\t*) func_append new_libs \" $deplib\" ;;\n\tesac\n      done\n      deplibs=\"$new_libs\"\n\n      # All the library-specific variables (install_libdir is set above).\n      library_names=\n      old_library=\n      dlname=\n\n      # Test again, we may have decided not to build it any more\n      if test \"$build_libtool_libs\" = yes; then\n\t# Remove ${wl} instances when linking with ld.\n\t# FIXME: should test the right _cmds variable.\n\tcase $archive_cmds in\n\t  *\\$LD\\ *) wl= ;;\n        esac\n\tif test \"$hardcode_into_libs\" = yes; then\n\t  # Hardcode the library paths\n\t  hardcode_libdirs=\n\t  dep_rpath=\n\t  rpath=\"$finalize_rpath\"\n\t  test \"$opt_mode\" != relink && rpath=\"$compile_rpath$rpath\"\n\t  for libdir in $rpath; do\n\t    if test -n \"$hardcode_libdir_flag_spec\"; then\n\t      if test -n \"$hardcode_libdir_separator\"; then\n\t\tfunc_replace_sysroot \"$libdir\"\n\t\tlibdir=$func_replace_sysroot_result\n\t\tif test -z \"$hardcode_libdirs\"; then\n\t\t  hardcode_libdirs=\"$libdir\"\n\t\telse\n\t\t  # Just accumulate the unique libdirs.\n\t\t  case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t\t  *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t    ;;\n\t\t  *)\n\t\t    func_append hardcode_libdirs \"$hardcode_libdir_separator$libdir\"\n\t\t    ;;\n\t\t  esac\n\t\tfi\n\t      else\n\t\teval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t\tfunc_append dep_rpath \" $flag\"\n\t      fi\n\t    elif test -n \"$runpath_var\"; then\n\t      case \"$perm_rpath \" in\n\t      *\" $libdir \"*) ;;\n\t      *) func_append perm_rpath \" $libdir\" ;;\n\t      esac\n\t    fi\n\t  done\n\t  # Substitute the hardcoded libdirs into the rpath.\n\t  if test -n \"$hardcode_libdir_separator\" &&\n\t     test -n \"$hardcode_libdirs\"; then\n\t    libdir=\"$hardcode_libdirs\"\n\t    eval \"dep_rpath=\\\"$hardcode_libdir_flag_spec\\\"\"\n\t  fi\n\t  if test -n \"$runpath_var\" && test -n \"$perm_rpath\"; then\n\t    # We should set the runpath_var.\n\t    rpath=\n\t    for dir in $perm_rpath; do\n\t      func_append rpath \"$dir:\"\n\t    done\n\t    eval \"$runpath_var='$rpath\\$$runpath_var'; export $runpath_var\"\n\t  fi\n\t  test -n \"$dep_rpath\" && deplibs=\"$dep_rpath $deplibs\"\n\tfi\n\n\tshlibpath=\"$finalize_shlibpath\"\n\ttest \"$opt_mode\" != relink && shlibpath=\"$compile_shlibpath$shlibpath\"\n\tif test -n \"$shlibpath\"; then\n\t  eval \"$shlibpath_var='$shlibpath\\$$shlibpath_var'; export $shlibpath_var\"\n\tfi\n\n\t# Get the real and link names of the library.\n\teval shared_ext=\\\"$shrext_cmds\\\"\n\teval library_names=\\\"$library_names_spec\\\"\n\tset dummy $library_names\n\tshift\n\trealname=\"$1\"\n\tshift\n\n\tif test -n \"$soname_spec\"; then\n\t  eval soname=\\\"$soname_spec\\\"\n\telse\n\t  soname=\"$realname\"\n\tfi\n\tif test -z \"$dlname\"; then\n\t  dlname=$soname\n\tfi\n\n\tlib=\"$output_objdir/$realname\"\n\tlinknames=\n\tfor link\n\tdo\n\t  func_append linknames \" $link\"\n\tdone\n\n\t# Use standard objects if they are pic\n\ttest -z \"$pic_flag\" && libobjs=`$ECHO \"$libobjs\" | $SP2NL | $SED \"$lo2o\" | $NL2SP`\n\ttest \"X$libobjs\" = \"X \" && libobjs=\n\n\tdelfiles=\n\tif test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t  $opt_dry_run || cp \"$export_symbols\" \"$output_objdir/$libname.uexp\"\n\t  export_symbols=\"$output_objdir/$libname.uexp\"\n\t  func_append delfiles \" $export_symbols\"\n\tfi\n\n\torig_export_symbols=\n\tcase $host_os in\n\tcygwin* | mingw* | cegcc*)\n\t  if test -n \"$export_symbols\" && test -z \"$export_symbols_regex\"; then\n\t    # exporting using user supplied symfile\n\t    if test \"x`$SED 1q $export_symbols`\" != xEXPORTS; then\n\t      # and it's NOT already a .def file. Must figure out\n\t      # which of the given symbols are data symbols and tag\n\t      # them as such. So, trigger use of export_symbols_cmds.\n\t      # export_symbols gets reassigned inside the \"prepare\n\t      # the list of exported symbols\" if statement, so the\n\t      # include_expsyms logic still works.\n\t      orig_export_symbols=\"$export_symbols\"\n\t      export_symbols=\n\t      always_export_symbols=yes\n\t    fi\n\t  fi\n\t  ;;\n\tesac\n\n\t# Prepare the list of exported symbols\n\tif test -z \"$export_symbols\"; then\n\t  if test \"$always_export_symbols\" = yes || test -n \"$export_symbols_regex\"; then\n\t    func_verbose \"generating symbol list for \\`$libname.la'\"\n\t    export_symbols=\"$output_objdir/$libname.exp\"\n\t    $opt_dry_run || $RM $export_symbols\n\t    cmds=$export_symbols_cmds\n\t    save_ifs=\"$IFS\"; IFS='~'\n\t    for cmd1 in $cmds; do\n\t      IFS=\"$save_ifs\"\n\t      # Take the normal branch if the nm_file_list_spec branch\n\t      # doesn't work or if tool conversion is not needed.\n\t      case $nm_file_list_spec~$to_tool_file_cmd in\n\t\t*~func_convert_file_noop | *~func_convert_file_msys_to_w32 | ~*)\n\t\t  try_normal_branch=yes\n\t\t  eval cmd=\\\"$cmd1\\\"\n\t\t  func_len \" $cmd\"\n\t\t  len=$func_len_result\n\t\t  ;;\n\t\t*)\n\t\t  try_normal_branch=no\n\t\t  ;;\n\t      esac\n\t      if test \"$try_normal_branch\" = yes \\\n\t\t && { test \"$len\" -lt \"$max_cmd_len\" \\\n\t\t      || test \"$max_cmd_len\" -le -1; }\n\t      then\n\t\tfunc_show_eval \"$cmd\" 'exit $?'\n\t\tskipped_export=false\n\t      elif test -n \"$nm_file_list_spec\"; then\n\t\tfunc_basename \"$output\"\n\t\toutput_la=$func_basename_result\n\t\tsave_libobjs=$libobjs\n\t\tsave_output=$output\n\t\toutput=${output_objdir}/${output_la}.nm\n\t\tfunc_to_tool_file \"$output\"\n\t\tlibobjs=$nm_file_list_spec$func_to_tool_file_result\n\t\tfunc_append delfiles \" $output\"\n\t\tfunc_verbose \"creating $NM input file list: $output\"\n\t\tfor obj in $save_libobjs; do\n\t\t  func_to_tool_file \"$obj\"\n\t\t  $ECHO \"$func_to_tool_file_result\"\n\t\tdone > \"$output\"\n\t\teval cmd=\\\"$cmd1\\\"\n\t\tfunc_show_eval \"$cmd\" 'exit $?'\n\t\toutput=$save_output\n\t\tlibobjs=$save_libobjs\n\t\tskipped_export=false\n\t      else\n\t\t# The command line is too long to execute in one step.\n\t\tfunc_verbose \"using reloadable object file for export list...\"\n\t\tskipped_export=:\n\t\t# Break out early, otherwise skipped_export may be\n\t\t# set to false by a later but shorter cmd.\n\t\tbreak\n\t      fi\n\t    done\n\t    IFS=\"$save_ifs\"\n\t    if test -n \"$export_symbols_regex\" && test \"X$skipped_export\" != \"X:\"; then\n\t      func_show_eval '$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"'\n\t      func_show_eval '$MV \"${export_symbols}T\" \"$export_symbols\"'\n\t    fi\n\t  fi\n\tfi\n\n\tif test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t  tmp_export_symbols=\"$export_symbols\"\n\t  test -n \"$orig_export_symbols\" && tmp_export_symbols=\"$orig_export_symbols\"\n\t  $opt_dry_run || eval '$ECHO \"$include_expsyms\" | $SP2NL >> \"$tmp_export_symbols\"'\n\tfi\n\n\tif test \"X$skipped_export\" != \"X:\" && test -n \"$orig_export_symbols\"; then\n\t  # The given exports_symbols file has to be filtered, so filter it.\n\t  func_verbose \"filter symbol list for \\`$libname.la' to tag DATA exports\"\n\t  # FIXME: $output_objdir/$libname.filter potentially contains lots of\n\t  # 's' commands which not all seds can handle. GNU sed should be fine\n\t  # though. Also, the filter scales superlinearly with the number of\n\t  # global variables. join(1) would be nice here, but unfortunately\n\t  # isn't a blessed tool.\n\t  $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\\(.*\\)\\([ \\,].*\\),s|^\\1$|\\1\\2|,' < $export_symbols > $output_objdir/$libname.filter\n\t  func_append delfiles \" $export_symbols $output_objdir/$libname.filter\"\n\t  export_symbols=$output_objdir/$libname.def\n\t  $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols\n\tfi\n\n\ttmp_deplibs=\n\tfor test_deplib in $deplibs; do\n\t  case \" $convenience \" in\n\t  *\" $test_deplib \"*) ;;\n\t  *)\n\t    func_append tmp_deplibs \" $test_deplib\"\n\t    ;;\n\t  esac\n\tdone\n\tdeplibs=\"$tmp_deplibs\"\n\n\tif test -n \"$convenience\"; then\n\t  if test -n \"$whole_archive_flag_spec\" &&\n\t    test \"$compiler_needs_object\" = yes &&\n\t    test -z \"$libobjs\"; then\n\t    # extract the archives, so we have objects to list.\n\t    # TODO: could optimize this to just extract one archive.\n\t    whole_archive_flag_spec=\n\t  fi\n\t  if test -n \"$whole_archive_flag_spec\"; then\n\t    save_libobjs=$libobjs\n\t    eval libobjs=\\\"\\$libobjs $whole_archive_flag_spec\\\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  else\n\t    gentop=\"$output_objdir/${outputname}x\"\n\t    func_append generated \" $gentop\"\n\n\t    func_extract_archives $gentop $convenience\n\t    func_append libobjs \" $func_extract_archives_result\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  fi\n\tfi\n\n\tif test \"$thread_safe\" = yes && test -n \"$thread_safe_flag_spec\"; then\n\t  eval flag=\\\"$thread_safe_flag_spec\\\"\n\t  func_append linker_flags \" $flag\"\n\tfi\n\n\t# Make a backup of the uninstalled library when relinking\n\tif test \"$opt_mode\" = relink; then\n\t  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}U && $MV $realname ${realname}U)' || exit $?\n\tfi\n\n\t# Do each of the archive commands.\n\tif test \"$module\" = yes && test -n \"$module_cmds\" ; then\n\t  if test -n \"$export_symbols\" && test -n \"$module_expsym_cmds\"; then\n\t    eval test_cmds=\\\"$module_expsym_cmds\\\"\n\t    cmds=$module_expsym_cmds\n\t  else\n\t    eval test_cmds=\\\"$module_cmds\\\"\n\t    cmds=$module_cmds\n\t  fi\n\telse\n\t  if test -n \"$export_symbols\" && test -n \"$archive_expsym_cmds\"; then\n\t    eval test_cmds=\\\"$archive_expsym_cmds\\\"\n\t    cmds=$archive_expsym_cmds\n\t  else\n\t    eval test_cmds=\\\"$archive_cmds\\\"\n\t    cmds=$archive_cmds\n\t  fi\n\tfi\n\n\tif test \"X$skipped_export\" != \"X:\" &&\n\t   func_len \" $test_cmds\" &&\n\t   len=$func_len_result &&\n\t   test \"$len\" -lt \"$max_cmd_len\" || test \"$max_cmd_len\" -le -1; then\n\t  :\n\telse\n\t  # The command line is too long to link in one step, link piecewise\n\t  # or, if using GNU ld and skipped_export is not :, use a linker\n\t  # script.\n\n\t  # Save the value of $output and $libobjs because we want to\n\t  # use them later.  If we have whole_archive_flag_spec, we\n\t  # want to use save_libobjs as it was before\n\t  # whole_archive_flag_spec was expanded, because we can't\n\t  # assume the linker understands whole_archive_flag_spec.\n\t  # This may have to be revisited, in case too many\n\t  # convenience libraries get linked in and end up exceeding\n\t  # the spec.\n\t  if test -z \"$convenience\" || test -z \"$whole_archive_flag_spec\"; then\n\t    save_libobjs=$libobjs\n\t  fi\n\t  save_output=$output\n\t  func_basename \"$output\"\n\t  output_la=$func_basename_result\n\n\t  # Clear the reloadable object creation command queue and\n\t  # initialize k to one.\n\t  test_cmds=\n\t  concat_cmds=\n\t  objlist=\n\t  last_robj=\n\t  k=1\n\n\t  if test -n \"$save_libobjs\" && test \"X$skipped_export\" != \"X:\" && test \"$with_gnu_ld\" = yes; then\n\t    output=${output_objdir}/${output_la}.lnkscript\n\t    func_verbose \"creating GNU ld script: $output\"\n\t    echo 'INPUT (' > $output\n\t    for obj in $save_libobjs\n\t    do\n\t      func_to_tool_file \"$obj\"\n\t      $ECHO \"$func_to_tool_file_result\" >> $output\n\t    done\n\t    echo ')' >> $output\n\t    func_append delfiles \" $output\"\n\t    func_to_tool_file \"$output\"\n\t    output=$func_to_tool_file_result\n\t  elif test -n \"$save_libobjs\" && test \"X$skipped_export\" != \"X:\" && test \"X$file_list_spec\" != X; then\n\t    output=${output_objdir}/${output_la}.lnk\n\t    func_verbose \"creating linker input file list: $output\"\n\t    : > $output\n\t    set x $save_libobjs\n\t    shift\n\t    firstobj=\n\t    if test \"$compiler_needs_object\" = yes; then\n\t      firstobj=\"$1 \"\n\t      shift\n\t    fi\n\t    for obj\n\t    do\n\t      func_to_tool_file \"$obj\"\n\t      $ECHO \"$func_to_tool_file_result\" >> $output\n\t    done\n\t    func_append delfiles \" $output\"\n\t    func_to_tool_file \"$output\"\n\t    output=$firstobj\\\"$file_list_spec$func_to_tool_file_result\\\"\n\t  else\n\t    if test -n \"$save_libobjs\"; then\n\t      func_verbose \"creating reloadable object files...\"\n\t      output=$output_objdir/$output_la-${k}.$objext\n\t      eval test_cmds=\\\"$reload_cmds\\\"\n\t      func_len \" $test_cmds\"\n\t      len0=$func_len_result\n\t      len=$len0\n\n\t      # Loop over the list of objects to be linked.\n\t      for obj in $save_libobjs\n\t      do\n\t\tfunc_len \" $obj\"\n\t\tfunc_arith $len + $func_len_result\n\t\tlen=$func_arith_result\n\t\tif test \"X$objlist\" = X ||\n\t\t   test \"$len\" -lt \"$max_cmd_len\"; then\n\t\t  func_append objlist \" $obj\"\n\t\telse\n\t\t  # The command $test_cmds is almost too long, add a\n\t\t  # command to the queue.\n\t\t  if test \"$k\" -eq 1 ; then\n\t\t    # The first file doesn't have a previous command to add.\n\t\t    reload_objs=$objlist\n\t\t    eval concat_cmds=\\\"$reload_cmds\\\"\n\t\t  else\n\t\t    # All subsequent reloadable object files will link in\n\t\t    # the last one created.\n\t\t    reload_objs=\"$objlist $last_robj\"\n\t\t    eval concat_cmds=\\\"\\$concat_cmds~$reload_cmds~\\$RM $last_robj\\\"\n\t\t  fi\n\t\t  last_robj=$output_objdir/$output_la-${k}.$objext\n\t\t  func_arith $k + 1\n\t\t  k=$func_arith_result\n\t\t  output=$output_objdir/$output_la-${k}.$objext\n\t\t  objlist=\" $obj\"\n\t\t  func_len \" $last_robj\"\n\t\t  func_arith $len0 + $func_len_result\n\t\t  len=$func_arith_result\n\t\tfi\n\t      done\n\t      # Handle the remaining objects by creating one last\n\t      # reloadable object file.  All subsequent reloadable object\n\t      # files will link in the last one created.\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      reload_objs=\"$objlist $last_robj\"\n\t      eval concat_cmds=\\\"\\${concat_cmds}$reload_cmds\\\"\n\t      if test -n \"$last_robj\"; then\n\t        eval concat_cmds=\\\"\\${concat_cmds}~\\$RM $last_robj\\\"\n\t      fi\n\t      func_append delfiles \" $output\"\n\n\t    else\n\t      output=\n\t    fi\n\n\t    if ${skipped_export-false}; then\n\t      func_verbose \"generating symbol list for \\`$libname.la'\"\n\t      export_symbols=\"$output_objdir/$libname.exp\"\n\t      $opt_dry_run || $RM $export_symbols\n\t      libobjs=$output\n\t      # Append the command to create the export file.\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      eval concat_cmds=\\\"\\$concat_cmds$export_symbols_cmds\\\"\n\t      if test -n \"$last_robj\"; then\n\t\teval concat_cmds=\\\"\\$concat_cmds~\\$RM $last_robj\\\"\n\t      fi\n\t    fi\n\n\t    test -n \"$save_libobjs\" &&\n\t      func_verbose \"creating a temporary reloadable object file: $output\"\n\n\t    # Loop through the commands generated above and execute them.\n\t    save_ifs=\"$IFS\"; IFS='~'\n\t    for cmd in $concat_cmds; do\n\t      IFS=\"$save_ifs\"\n\t      $opt_silent || {\n\t\t  func_quote_for_expand \"$cmd\"\n\t\t  eval \"func_echo $func_quote_for_expand_result\"\n\t      }\n\t      $opt_dry_run || eval \"$cmd\" || {\n\t\tlt_exit=$?\n\n\t\t# Restore the uninstalled library and exit\n\t\tif test \"$opt_mode\" = relink; then\n\t\t  ( cd \"$output_objdir\" && \\\n\t\t    $RM \"${realname}T\" && \\\n\t\t    $MV \"${realname}U\" \"$realname\" )\n\t\tfi\n\n\t\texit $lt_exit\n\t      }\n\t    done\n\t    IFS=\"$save_ifs\"\n\n\t    if test -n \"$export_symbols_regex\" && ${skipped_export-false}; then\n\t      func_show_eval '$EGREP -e \"$export_symbols_regex\" \"$export_symbols\" > \"${export_symbols}T\"'\n\t      func_show_eval '$MV \"${export_symbols}T\" \"$export_symbols\"'\n\t    fi\n\t  fi\n\n          if ${skipped_export-false}; then\n\t    if test -n \"$export_symbols\" && test -n \"$include_expsyms\"; then\n\t      tmp_export_symbols=\"$export_symbols\"\n\t      test -n \"$orig_export_symbols\" && tmp_export_symbols=\"$orig_export_symbols\"\n\t      $opt_dry_run || eval '$ECHO \"$include_expsyms\" | $SP2NL >> \"$tmp_export_symbols\"'\n\t    fi\n\n\t    if test -n \"$orig_export_symbols\"; then\n\t      # The given exports_symbols file has to be filtered, so filter it.\n\t      func_verbose \"filter symbol list for \\`$libname.la' to tag DATA exports\"\n\t      # FIXME: $output_objdir/$libname.filter potentially contains lots of\n\t      # 's' commands which not all seds can handle. GNU sed should be fine\n\t      # though. Also, the filter scales superlinearly with the number of\n\t      # global variables. join(1) would be nice here, but unfortunately\n\t      # isn't a blessed tool.\n\t      $opt_dry_run || $SED -e '/[ ,]DATA/!d;s,\\(.*\\)\\([ \\,].*\\),s|^\\1$|\\1\\2|,' < $export_symbols > $output_objdir/$libname.filter\n\t      func_append delfiles \" $export_symbols $output_objdir/$libname.filter\"\n\t      export_symbols=$output_objdir/$libname.def\n\t      $opt_dry_run || $SED -f $output_objdir/$libname.filter < $orig_export_symbols > $export_symbols\n\t    fi\n\t  fi\n\n\t  libobjs=$output\n\t  # Restore the value of output.\n\t  output=$save_output\n\n\t  if test -n \"$convenience\" && test -n \"$whole_archive_flag_spec\"; then\n\t    eval libobjs=\\\"\\$libobjs $whole_archive_flag_spec\\\"\n\t    test \"X$libobjs\" = \"X \" && libobjs=\n\t  fi\n\t  # Expand the library linking commands again to reset the\n\t  # value of $libobjs for piecewise linking.\n\n\t  # Do each of the archive commands.\n\t  if test \"$module\" = yes && test -n \"$module_cmds\" ; then\n\t    if test -n \"$export_symbols\" && test -n \"$module_expsym_cmds\"; then\n\t      cmds=$module_expsym_cmds\n\t    else\n\t      cmds=$module_cmds\n\t    fi\n\t  else\n\t    if test -n \"$export_symbols\" && test -n \"$archive_expsym_cmds\"; then\n\t      cmds=$archive_expsym_cmds\n\t    else\n\t      cmds=$archive_cmds\n\t    fi\n\t  fi\n\tfi\n\n\tif test -n \"$delfiles\"; then\n\t  # Append the command to remove temporary files to $cmds.\n\t  eval cmds=\\\"\\$cmds~\\$RM $delfiles\\\"\n\tfi\n\n\t# Add any objects from preloaded convenience libraries\n\tif test -n \"$dlprefiles\"; then\n\t  gentop=\"$output_objdir/${outputname}x\"\n\t  func_append generated \" $gentop\"\n\n\t  func_extract_archives $gentop $dlprefiles\n\t  func_append libobjs \" $func_extract_archives_result\"\n\t  test \"X$libobjs\" = \"X \" && libobjs=\n\tfi\n\n\tsave_ifs=\"$IFS\"; IFS='~'\n\tfor cmd in $cmds; do\n\t  IFS=\"$save_ifs\"\n\t  eval cmd=\\\"$cmd\\\"\n\t  $opt_silent || {\n\t    func_quote_for_expand \"$cmd\"\n\t    eval \"func_echo $func_quote_for_expand_result\"\n\t  }\n\t  $opt_dry_run || eval \"$cmd\" || {\n\t    lt_exit=$?\n\n\t    # Restore the uninstalled library and exit\n\t    if test \"$opt_mode\" = relink; then\n\t      ( cd \"$output_objdir\" && \\\n\t        $RM \"${realname}T\" && \\\n\t\t$MV \"${realname}U\" \"$realname\" )\n\t    fi\n\n\t    exit $lt_exit\n\t  }\n\tdone\n\tIFS=\"$save_ifs\"\n\n\t# Restore the uninstalled library and exit\n\tif test \"$opt_mode\" = relink; then\n\t  $opt_dry_run || eval '(cd $output_objdir && $RM ${realname}T && $MV $realname ${realname}T && $MV ${realname}U $realname)' || exit $?\n\n\t  if test -n \"$convenience\"; then\n\t    if test -z \"$whole_archive_flag_spec\"; then\n\t      func_show_eval '${RM}r \"$gentop\"'\n\t    fi\n\t  fi\n\n\t  exit $EXIT_SUCCESS\n\tfi\n\n\t# Create links to the real library.\n\tfor linkname in $linknames; do\n\t  if test \"$realname\" != \"$linkname\"; then\n\t    func_show_eval '(cd \"$output_objdir\" && $RM \"$linkname\" && $LN_S \"$realname\" \"$linkname\")' 'exit $?'\n\t  fi\n\tdone\n\n\t# If -module or -export-dynamic was specified, set the dlname.\n\tif test \"$module\" = yes || test \"$export_dynamic\" = yes; then\n\t  # On all known operating systems, these are identical.\n\t  dlname=\"$soname\"\n\tfi\n      fi\n      ;;\n\n    obj)\n      if test -n \"$dlfiles$dlprefiles\" || test \"$dlself\" != no; then\n\tfunc_warning \"\\`-dlopen' is ignored for objects\"\n      fi\n\n      case \" $deplibs\" in\n      *\\ -l* | *\\ -L*)\n\tfunc_warning \"\\`-l' and \\`-L' are ignored for objects\" ;;\n      esac\n\n      test -n \"$rpath\" && \\\n\tfunc_warning \"\\`-rpath' is ignored for objects\"\n\n      test -n \"$xrpath\" && \\\n\tfunc_warning \"\\`-R' is ignored for objects\"\n\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"\\`-version-info' is ignored for objects\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"\\`-release' is ignored for objects\"\n\n      case $output in\n      *.lo)\n\ttest -n \"$objs$old_deplibs\" && \\\n\t  func_fatal_error \"cannot build library object \\`$output' from non-libtool objects\"\n\n\tlibobj=$output\n\tfunc_lo2o \"$libobj\"\n\tobj=$func_lo2o_result\n\t;;\n      *)\n\tlibobj=\n\tobj=\"$output\"\n\t;;\n      esac\n\n      # Delete the old objects.\n      $opt_dry_run || $RM $obj $libobj\n\n      # Objects from convenience libraries.  This assumes\n      # single-version convenience libraries.  Whenever we create\n      # different ones for PIC/non-PIC, this we'll have to duplicate\n      # the extraction.\n      reload_conv_objs=\n      gentop=\n      # reload_cmds runs $LD directly, so let us get rid of\n      # -Wl from whole_archive_flag_spec and hope we can get by with\n      # turning comma into space..\n      wl=\n\n      if test -n \"$convenience\"; then\n\tif test -n \"$whole_archive_flag_spec\"; then\n\t  eval tmp_whole_archive_flags=\\\"$whole_archive_flag_spec\\\"\n\t  reload_conv_objs=$reload_objs\\ `$ECHO \"$tmp_whole_archive_flags\" | $SED 's|,| |g'`\n\telse\n\t  gentop=\"$output_objdir/${obj}x\"\n\t  func_append generated \" $gentop\"\n\n\t  func_extract_archives $gentop $convenience\n\t  reload_conv_objs=\"$reload_objs $func_extract_archives_result\"\n\tfi\n      fi\n\n      # If we're not building shared, we need to use non_pic_objs\n      test \"$build_libtool_libs\" != yes && libobjs=\"$non_pic_objects\"\n\n      # Create the old-style object.\n      reload_objs=\"$objs$old_deplibs \"`$ECHO \"$libobjs\" | $SP2NL | $SED \"/\\.${libext}$/d; /\\.lib$/d; $lo2o\" | $NL2SP`\" $reload_conv_objs\" ### testsuite: skip nested quoting test\n\n      output=\"$obj\"\n      func_execute_cmds \"$reload_cmds\" 'exit $?'\n\n      # Exit if we aren't doing a library object file.\n      if test -z \"$libobj\"; then\n\tif test -n \"$gentop\"; then\n\t  func_show_eval '${RM}r \"$gentop\"'\n\tfi\n\n\texit $EXIT_SUCCESS\n      fi\n\n      if test \"$build_libtool_libs\" != yes; then\n\tif test -n \"$gentop\"; then\n\t  func_show_eval '${RM}r \"$gentop\"'\n\tfi\n\n\t# Create an invalid libtool object if no PIC, so that we don't\n\t# accidentally link it into a program.\n\t# $show \"echo timestamp > $libobj\"\n\t# $opt_dry_run || eval \"echo timestamp > $libobj\" || exit $?\n\texit $EXIT_SUCCESS\n      fi\n\n      if test -n \"$pic_flag\" || test \"$pic_mode\" != default; then\n\t# Only do commands if we really have different PIC objects.\n\treload_objs=\"$libobjs $reload_conv_objs\"\n\toutput=\"$libobj\"\n\tfunc_execute_cmds \"$reload_cmds\" 'exit $?'\n      fi\n\n      if test -n \"$gentop\"; then\n\tfunc_show_eval '${RM}r \"$gentop\"'\n      fi\n\n      exit $EXIT_SUCCESS\n      ;;\n\n    prog)\n      case $host in\n\t*cygwin*) func_stripname '' '.exe' \"$output\"\n\t          output=$func_stripname_result.exe;;\n      esac\n      test -n \"$vinfo\" && \\\n\tfunc_warning \"\\`-version-info' is ignored for programs\"\n\n      test -n \"$release\" && \\\n\tfunc_warning \"\\`-release' is ignored for programs\"\n\n      test \"$preload\" = yes \\\n        && test \"$dlopen_support\" = unknown \\\n\t&& test \"$dlopen_self\" = unknown \\\n\t&& test \"$dlopen_self_static\" = unknown && \\\n\t  func_warning \"\\`LT_INIT([dlopen])' not used. Assuming no dlopen support.\"\n\n      case $host in\n      *-*-rhapsody* | *-*-darwin1.[012])\n\t# On Rhapsody replace the C library is the System framework\n\tcompile_deplibs=`$ECHO \" $compile_deplibs\" | $SED 's/ -lc / System.ltframework /'`\n\tfinalize_deplibs=`$ECHO \" $finalize_deplibs\" | $SED 's/ -lc / System.ltframework /'`\n\t;;\n      esac\n\n      case $host in\n      *-*-darwin*)\n\t# Don't allow lazy linking, it breaks C++ global constructors\n\t# But is supposedly fixed on 10.4 or later (yay!).\n\tif test \"$tagname\" = CXX ; then\n\t  case ${MACOSX_DEPLOYMENT_TARGET-10.0} in\n\t    10.[0123])\n\t      func_append compile_command \" ${wl}-bind_at_load\"\n\t      func_append finalize_command \" ${wl}-bind_at_load\"\n\t    ;;\n\t  esac\n\tfi\n\t# Time to change all our \"foo.ltframework\" stuff back to \"-framework foo\"\n\tcompile_deplibs=`$ECHO \" $compile_deplibs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\tfinalize_deplibs=`$ECHO \" $finalize_deplibs\" | $SED 's% \\([^ $]*\\).ltframework% -framework \\1%g'`\n\t;;\n      esac\n\n\n      # move library search paths that coincide with paths to not yet\n      # installed libraries to the beginning of the library search list\n      new_libs=\n      for path in $notinst_path; do\n\tcase \" $new_libs \" in\n\t*\" -L$path/$objdir \"*) ;;\n\t*)\n\t  case \" $compile_deplibs \" in\n\t  *\" -L$path/$objdir \"*)\n\t    func_append new_libs \" -L$path/$objdir\" ;;\n\t  esac\n\t  ;;\n\tesac\n      done\n      for deplib in $compile_deplibs; do\n\tcase $deplib in\n\t-L*)\n\t  case \" $new_libs \" in\n\t  *\" $deplib \"*) ;;\n\t  *) func_append new_libs \" $deplib\" ;;\n\t  esac\n\t  ;;\n\t*) func_append new_libs \" $deplib\" ;;\n\tesac\n      done\n      compile_deplibs=\"$new_libs\"\n\n\n      func_append compile_command \" $compile_deplibs\"\n      func_append finalize_command \" $finalize_deplibs\"\n\n      if test -n \"$rpath$xrpath\"; then\n\t# If the user specified any rpath flags, then add them.\n\tfor libdir in $rpath $xrpath; do\n\t  # This is the magic to use -rpath.\n\t  case \"$finalize_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append finalize_rpath \" $libdir\" ;;\n\t  esac\n\tdone\n      fi\n\n      # Now hardcode the library paths\n      rpath=\n      hardcode_libdirs=\n      for libdir in $compile_rpath $finalize_rpath; do\n\tif test -n \"$hardcode_libdir_flag_spec\"; then\n\t  if test -n \"$hardcode_libdir_separator\"; then\n\t    if test -z \"$hardcode_libdirs\"; then\n\t      hardcode_libdirs=\"$libdir\"\n\t    else\n\t      # Just accumulate the unique libdirs.\n\t      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t      *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t;;\n\t      *)\n\t\tfunc_append hardcode_libdirs \"$hardcode_libdir_separator$libdir\"\n\t\t;;\n\t      esac\n\t    fi\n\t  else\n\t    eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t    func_append rpath \" $flag\"\n\t  fi\n\telif test -n \"$runpath_var\"; then\n\t  case \"$perm_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append perm_rpath \" $libdir\" ;;\n\t  esac\n\tfi\n\tcase $host in\n\t*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-os2* | *-cegcc*)\n\t  testbindir=`${ECHO} \"$libdir\" | ${SED} -e 's*/lib$*/bin*'`\n\t  case :$dllsearchpath: in\n\t  *\":$libdir:\"*) ;;\n\t  ::) dllsearchpath=$libdir;;\n\t  *) func_append dllsearchpath \":$libdir\";;\n\t  esac\n\t  case :$dllsearchpath: in\n\t  *\":$testbindir:\"*) ;;\n\t  ::) dllsearchpath=$testbindir;;\n\t  *) func_append dllsearchpath \":$testbindir\";;\n\t  esac\n\t  ;;\n\tesac\n      done\n      # Substitute the hardcoded libdirs into the rpath.\n      if test -n \"$hardcode_libdir_separator\" &&\n\t test -n \"$hardcode_libdirs\"; then\n\tlibdir=\"$hardcode_libdirs\"\n\teval rpath=\\\" $hardcode_libdir_flag_spec\\\"\n      fi\n      compile_rpath=\"$rpath\"\n\n      rpath=\n      hardcode_libdirs=\n      for libdir in $finalize_rpath; do\n\tif test -n \"$hardcode_libdir_flag_spec\"; then\n\t  if test -n \"$hardcode_libdir_separator\"; then\n\t    if test -z \"$hardcode_libdirs\"; then\n\t      hardcode_libdirs=\"$libdir\"\n\t    else\n\t      # Just accumulate the unique libdirs.\n\t      case $hardcode_libdir_separator$hardcode_libdirs$hardcode_libdir_separator in\n\t      *\"$hardcode_libdir_separator$libdir$hardcode_libdir_separator\"*)\n\t\t;;\n\t      *)\n\t\tfunc_append hardcode_libdirs \"$hardcode_libdir_separator$libdir\"\n\t\t;;\n\t      esac\n\t    fi\n\t  else\n\t    eval flag=\\\"$hardcode_libdir_flag_spec\\\"\n\t    func_append rpath \" $flag\"\n\t  fi\n\telif test -n \"$runpath_var\"; then\n\t  case \"$finalize_perm_rpath \" in\n\t  *\" $libdir \"*) ;;\n\t  *) func_append finalize_perm_rpath \" $libdir\" ;;\n\t  esac\n\tfi\n      done\n      # Substitute the hardcoded libdirs into the rpath.\n      if test -n \"$hardcode_libdir_separator\" &&\n\t test -n \"$hardcode_libdirs\"; then\n\tlibdir=\"$hardcode_libdirs\"\n\teval rpath=\\\" $hardcode_libdir_flag_spec\\\"\n      fi\n      finalize_rpath=\"$rpath\"\n\n      if test -n \"$libobjs\" && test \"$build_old_libs\" = yes; then\n\t# Transform all the library objects into standard objects.\n\tcompile_command=`$ECHO \"$compile_command\" | $SP2NL | $SED \"$lo2o\" | $NL2SP`\n\tfinalize_command=`$ECHO \"$finalize_command\" | $SP2NL | $SED \"$lo2o\" | $NL2SP`\n      fi\n\n      func_generate_dlsyms \"$outputname\" \"@PROGRAM@\" \"no\"\n\n      # template prelinking step\n      if test -n \"$prelink_cmds\"; then\n\tfunc_execute_cmds \"$prelink_cmds\" 'exit $?'\n      fi\n\n      wrappers_required=yes\n      case $host in\n      *cegcc* | *mingw32ce*)\n        # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway.\n        wrappers_required=no\n        ;;\n      *cygwin* | *mingw* )\n        if test \"$build_libtool_libs\" != yes; then\n          wrappers_required=no\n        fi\n        ;;\n      *)\n        if test \"$need_relink\" = no || test \"$build_libtool_libs\" != yes; then\n          wrappers_required=no\n        fi\n        ;;\n      esac\n      if test \"$wrappers_required\" = no; then\n\t# Replace the output file specification.\n\tcompile_command=`$ECHO \"$compile_command\" | $SED 's%@OUTPUT@%'\"$output\"'%g'`\n\tlink_command=\"$compile_command$compile_rpath\"\n\n\t# We have no uninstalled library dependencies, so finalize right now.\n\texit_status=0\n\tfunc_show_eval \"$link_command\" 'exit_status=$?'\n\n\tif test -n \"$postlink_cmds\"; then\n\t  func_to_tool_file \"$output\"\n\t  postlink_cmds=`func_echo_all \"$postlink_cmds\" | $SED -e 's%@OUTPUT@%'\"$output\"'%g' -e 's%@TOOL_OUTPUT@%'\"$func_to_tool_file_result\"'%g'`\n\t  func_execute_cmds \"$postlink_cmds\" 'exit $?'\n\tfi\n\n\t# Delete the generated files.\n\tif test -f \"$output_objdir/${outputname}S.${objext}\"; then\n\t  func_show_eval '$RM \"$output_objdir/${outputname}S.${objext}\"'\n\tfi\n\n\texit $exit_status\n      fi\n\n      if test -n \"$compile_shlibpath$finalize_shlibpath\"; then\n\tcompile_command=\"$shlibpath_var=\\\"$compile_shlibpath$finalize_shlibpath\\$$shlibpath_var\\\" $compile_command\"\n      fi\n      if test -n \"$finalize_shlibpath\"; then\n\tfinalize_command=\"$shlibpath_var=\\\"$finalize_shlibpath\\$$shlibpath_var\\\" $finalize_command\"\n      fi\n\n      compile_var=\n      finalize_var=\n      if test -n \"$runpath_var\"; then\n\tif test -n \"$perm_rpath\"; then\n\t  # We should set the runpath_var.\n\t  rpath=\n\t  for dir in $perm_rpath; do\n\t    func_append rpath \"$dir:\"\n\t  done\n\t  compile_var=\"$runpath_var=\\\"$rpath\\$$runpath_var\\\" \"\n\tfi\n\tif test -n \"$finalize_perm_rpath\"; then\n\t  # We should set the runpath_var.\n\t  rpath=\n\t  for dir in $finalize_perm_rpath; do\n\t    func_append rpath \"$dir:\"\n\t  done\n\t  finalize_var=\"$runpath_var=\\\"$rpath\\$$runpath_var\\\" \"\n\tfi\n      fi\n\n      if test \"$no_install\" = yes; then\n\t# We don't need to create a wrapper script.\n\tlink_command=\"$compile_var$compile_command$compile_rpath\"\n\t# Replace the output file specification.\n\tlink_command=`$ECHO \"$link_command\" | $SED 's%@OUTPUT@%'\"$output\"'%g'`\n\t# Delete the old output file.\n\t$opt_dry_run || $RM $output\n\t# Link the executable and exit\n\tfunc_show_eval \"$link_command\" 'exit $?'\n\n\tif test -n \"$postlink_cmds\"; then\n\t  func_to_tool_file \"$output\"\n\t  postlink_cmds=`func_echo_all \"$postlink_cmds\" | $SED -e 's%@OUTPUT@%'\"$output\"'%g' -e 's%@TOOL_OUTPUT@%'\"$func_to_tool_file_result\"'%g'`\n\t  func_execute_cmds \"$postlink_cmds\" 'exit $?'\n\tfi\n\n\texit $EXIT_SUCCESS\n      fi\n\n      if test \"$hardcode_action\" = relink; then\n\t# Fast installation is not supported\n\tlink_command=\"$compile_var$compile_command$compile_rpath\"\n\trelink_command=\"$finalize_var$finalize_command$finalize_rpath\"\n\n\tfunc_warning \"this platform does not like uninstalled shared libraries\"\n\tfunc_warning \"\\`$output' will be relinked during installation\"\n      else\n\tif test \"$fast_install\" != no; then\n\t  link_command=\"$finalize_var$compile_command$finalize_rpath\"\n\t  if test \"$fast_install\" = yes; then\n\t    relink_command=`$ECHO \"$compile_var$compile_command$compile_rpath\" | $SED 's%@OUTPUT@%\\$progdir/\\$file%g'`\n\t  else\n\t    # fast_install is set to needless\n\t    relink_command=\n\t  fi\n\telse\n\t  link_command=\"$compile_var$compile_command$compile_rpath\"\n\t  relink_command=\"$finalize_var$finalize_command$finalize_rpath\"\n\tfi\n      fi\n\n      # Replace the output file specification.\n      link_command=`$ECHO \"$link_command\" | $SED 's%@OUTPUT@%'\"$output_objdir/$outputname\"'%g'`\n\n      # Delete the old output files.\n      $opt_dry_run || $RM $output $output_objdir/$outputname $output_objdir/lt-$outputname\n\n      func_show_eval \"$link_command\" 'exit $?'\n\n      if test -n \"$postlink_cmds\"; then\n\tfunc_to_tool_file \"$output_objdir/$outputname\"\n\tpostlink_cmds=`func_echo_all \"$postlink_cmds\" | $SED -e 's%@OUTPUT@%'\"$output_objdir/$outputname\"'%g' -e 's%@TOOL_OUTPUT@%'\"$func_to_tool_file_result\"'%g'`\n\tfunc_execute_cmds \"$postlink_cmds\" 'exit $?'\n      fi\n\n      # Now create the wrapper script.\n      func_verbose \"creating $output\"\n\n      # Quote the relink command for shipping.\n      if test -n \"$relink_command\"; then\n\t# Preserve any variables that may affect compiler behavior\n\tfor var in $variables_saved_for_relink; do\n\t  if eval test -z \\\"\\${$var+set}\\\"; then\n\t    relink_command=\"{ test -z \\\"\\${$var+set}\\\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command\"\n\t  elif eval var_value=\\$$var; test -z \"$var_value\"; then\n\t    relink_command=\"$var=; export $var; $relink_command\"\n\t  else\n\t    func_quote_for_eval \"$var_value\"\n\t    relink_command=\"$var=$func_quote_for_eval_result; export $var; $relink_command\"\n\t  fi\n\tdone\n\trelink_command=\"(cd `pwd`; $relink_command)\"\n\trelink_command=`$ECHO \"$relink_command\" | $SED \"$sed_quote_subst\"`\n      fi\n\n      # Only actually do things if not in dry run mode.\n      $opt_dry_run || {\n\t# win32 will think the script is a binary if it has\n\t# a .exe suffix, so we strip it off here.\n\tcase $output in\n\t  *.exe) func_stripname '' '.exe' \"$output\"\n\t         output=$func_stripname_result ;;\n\tesac\n\t# test for cygwin because mv fails w/o .exe extensions\n\tcase $host in\n\t  *cygwin*)\n\t    exeext=.exe\n\t    func_stripname '' '.exe' \"$outputname\"\n\t    outputname=$func_stripname_result ;;\n\t  *) exeext= ;;\n\tesac\n\tcase $host in\n\t  *cygwin* | *mingw* )\n\t    func_dirname_and_basename \"$output\" \"\" \".\"\n\t    output_name=$func_basename_result\n\t    output_path=$func_dirname_result\n\t    cwrappersource=\"$output_path/$objdir/lt-$output_name.c\"\n\t    cwrapper=\"$output_path/$output_name.exe\"\n\t    $RM $cwrappersource $cwrapper\n\t    trap \"$RM $cwrappersource $cwrapper; exit $EXIT_FAILURE\" 1 2 15\n\n\t    func_emit_cwrapperexe_src > $cwrappersource\n\n\t    # The wrapper executable is built using the $host compiler,\n\t    # because it contains $host paths and files. If cross-\n\t    # compiling, it, like the target executable, must be\n\t    # executed on the $host or under an emulation environment.\n\t    $opt_dry_run || {\n\t      $LTCC $LTCFLAGS -o $cwrapper $cwrappersource\n\t      $STRIP $cwrapper\n\t    }\n\n\t    # Now, create the wrapper script for func_source use:\n\t    func_ltwrapper_scriptname $cwrapper\n\t    $RM $func_ltwrapper_scriptname_result\n\t    trap \"$RM $func_ltwrapper_scriptname_result; exit $EXIT_FAILURE\" 1 2 15\n\t    $opt_dry_run || {\n\t      # note: this script will not be executed, so do not chmod.\n\t      if test \"x$build\" = \"x$host\" ; then\n\t\t$cwrapper --lt-dump-script > $func_ltwrapper_scriptname_result\n\t      else\n\t\tfunc_emit_wrapper no > $func_ltwrapper_scriptname_result\n\t      fi\n\t    }\n\t  ;;\n\t  * )\n\t    $RM $output\n\t    trap \"$RM $output; exit $EXIT_FAILURE\" 1 2 15\n\n\t    func_emit_wrapper no > $output\n\t    chmod +x $output\n\t  ;;\n\tesac\n      }\n      exit $EXIT_SUCCESS\n      ;;\n    esac\n\n    # See if we need to build an old-fashioned archive.\n    for oldlib in $oldlibs; do\n\n      if test \"$build_libtool_libs\" = convenience; then\n\toldobjs=\"$libobjs_save $symfileobj\"\n\taddlibs=\"$convenience\"\n\tbuild_libtool_libs=no\n      else\n\tif test \"$build_libtool_libs\" = module; then\n\t  oldobjs=\"$libobjs_save\"\n\t  build_libtool_libs=no\n\telse\n\t  oldobjs=\"$old_deplibs $non_pic_objects\"\n\t  if test \"$preload\" = yes && test -f \"$symfileobj\"; then\n\t    func_append oldobjs \" $symfileobj\"\n\t  fi\n\tfi\n\taddlibs=\"$old_convenience\"\n      fi\n\n      if test -n \"$addlibs\"; then\n\tgentop=\"$output_objdir/${outputname}x\"\n\tfunc_append generated \" $gentop\"\n\n\tfunc_extract_archives $gentop $addlibs\n\tfunc_append oldobjs \" $func_extract_archives_result\"\n      fi\n\n      # Do each command in the archive commands.\n      if test -n \"$old_archive_from_new_cmds\" && test \"$build_libtool_libs\" = yes; then\n\tcmds=$old_archive_from_new_cmds\n      else\n\n\t# Add any objects from preloaded convenience libraries\n\tif test -n \"$dlprefiles\"; then\n\t  gentop=\"$output_objdir/${outputname}x\"\n\t  func_append generated \" $gentop\"\n\n\t  func_extract_archives $gentop $dlprefiles\n\t  func_append oldobjs \" $func_extract_archives_result\"\n\tfi\n\n\t# POSIX demands no paths to be encoded in archives.  We have\n\t# to avoid creating archives with duplicate basenames if we\n\t# might have to extract them afterwards, e.g., when creating a\n\t# static archive out of a convenience library, or when linking\n\t# the entirety of a libtool archive into another (currently\n\t# not supported by libtool).\n\tif (for obj in $oldobjs\n\t    do\n\t      func_basename \"$obj\"\n\t      $ECHO \"$func_basename_result\"\n\t    done | sort | sort -uc >/dev/null 2>&1); then\n\t  :\n\telse\n\t  echo \"copying selected object files to avoid basename conflicts...\"\n\t  gentop=\"$output_objdir/${outputname}x\"\n\t  func_append generated \" $gentop\"\n\t  func_mkdir_p \"$gentop\"\n\t  save_oldobjs=$oldobjs\n\t  oldobjs=\n\t  counter=1\n\t  for obj in $save_oldobjs\n\t  do\n\t    func_basename \"$obj\"\n\t    objbase=\"$func_basename_result\"\n\t    case \" $oldobjs \" in\n\t    \" \") oldobjs=$obj ;;\n\t    *[\\ /]\"$objbase \"*)\n\t      while :; do\n\t\t# Make sure we don't pick an alternate name that also\n\t\t# overlaps.\n\t\tnewobj=lt$counter-$objbase\n\t\tfunc_arith $counter + 1\n\t\tcounter=$func_arith_result\n\t\tcase \" $oldobjs \" in\n\t\t*[\\ /]\"$newobj \"*) ;;\n\t\t*) if test ! -f \"$gentop/$newobj\"; then break; fi ;;\n\t\tesac\n\t      done\n\t      func_show_eval \"ln $obj $gentop/$newobj || cp $obj $gentop/$newobj\"\n\t      func_append oldobjs \" $gentop/$newobj\"\n\t      ;;\n\t    *) func_append oldobjs \" $obj\" ;;\n\t    esac\n\t  done\n\tfi\n\tfunc_to_tool_file \"$oldlib\" func_convert_file_msys_to_w32\n\ttool_oldlib=$func_to_tool_file_result\n\teval cmds=\\\"$old_archive_cmds\\\"\n\n\tfunc_len \" $cmds\"\n\tlen=$func_len_result\n\tif test \"$len\" -lt \"$max_cmd_len\" || test \"$max_cmd_len\" -le -1; then\n\t  cmds=$old_archive_cmds\n\telif test -n \"$archiver_list_spec\"; then\n\t  func_verbose \"using command file archive linking...\"\n\t  for obj in $oldobjs\n\t  do\n\t    func_to_tool_file \"$obj\"\n\t    $ECHO \"$func_to_tool_file_result\"\n\t  done > $output_objdir/$libname.libcmd\n\t  func_to_tool_file \"$output_objdir/$libname.libcmd\"\n\t  oldobjs=\" $archiver_list_spec$func_to_tool_file_result\"\n\t  cmds=$old_archive_cmds\n\telse\n\t  # the command line is too long to link in one step, link in parts\n\t  func_verbose \"using piecewise archive linking...\"\n\t  save_RANLIB=$RANLIB\n\t  RANLIB=:\n\t  objlist=\n\t  concat_cmds=\n\t  save_oldobjs=$oldobjs\n\t  oldobjs=\n\t  # Is there a better way of finding the last object in the list?\n\t  for obj in $save_oldobjs\n\t  do\n\t    last_oldobj=$obj\n\t  done\n\t  eval test_cmds=\\\"$old_archive_cmds\\\"\n\t  func_len \" $test_cmds\"\n\t  len0=$func_len_result\n\t  len=$len0\n\t  for obj in $save_oldobjs\n\t  do\n\t    func_len \" $obj\"\n\t    func_arith $len + $func_len_result\n\t    len=$func_arith_result\n\t    func_append objlist \" $obj\"\n\t    if test \"$len\" -lt \"$max_cmd_len\"; then\n\t      :\n\t    else\n\t      # the above command should be used before it gets too long\n\t      oldobjs=$objlist\n\t      if test \"$obj\" = \"$last_oldobj\" ; then\n\t\tRANLIB=$save_RANLIB\n\t      fi\n\t      test -z \"$concat_cmds\" || concat_cmds=$concat_cmds~\n\t      eval concat_cmds=\\\"\\${concat_cmds}$old_archive_cmds\\\"\n\t      objlist=\n\t      len=$len0\n\t    fi\n\t  done\n\t  RANLIB=$save_RANLIB\n\t  oldobjs=$objlist\n\t  if test \"X$oldobjs\" = \"X\" ; then\n\t    eval cmds=\\\"\\$concat_cmds\\\"\n\t  else\n\t    eval cmds=\\\"\\$concat_cmds~\\$old_archive_cmds\\\"\n\t  fi\n\tfi\n      fi\n      func_execute_cmds \"$cmds\" 'exit $?'\n    done\n\n    test -n \"$generated\" && \\\n      func_show_eval \"${RM}r$generated\"\n\n    # Now create the libtool archive.\n    case $output in\n    *.la)\n      old_library=\n      test \"$build_old_libs\" = yes && old_library=\"$libname.$libext\"\n      func_verbose \"creating $output\"\n\n      # Preserve any variables that may affect compiler behavior\n      for var in $variables_saved_for_relink; do\n\tif eval test -z \\\"\\${$var+set}\\\"; then\n\t  relink_command=\"{ test -z \\\"\\${$var+set}\\\" || $lt_unset $var || { $var=; export $var; }; }; $relink_command\"\n\telif eval var_value=\\$$var; test -z \"$var_value\"; then\n\t  relink_command=\"$var=; export $var; $relink_command\"\n\telse\n\t  func_quote_for_eval \"$var_value\"\n\t  relink_command=\"$var=$func_quote_for_eval_result; export $var; $relink_command\"\n\tfi\n      done\n      # Quote the link command for shipping.\n      relink_command=\"(cd `pwd`; $SHELL $progpath $preserve_args --mode=relink $libtool_args @inst_prefix_dir@)\"\n      relink_command=`$ECHO \"$relink_command\" | $SED \"$sed_quote_subst\"`\n      if test \"$hardcode_automatic\" = yes ; then\n\trelink_command=\n      fi\n\n      # Only create the output if not a dry run.\n      $opt_dry_run || {\n\tfor installed in no yes; do\n\t  if test \"$installed\" = yes; then\n\t    if test -z \"$install_libdir\"; then\n\t      break\n\t    fi\n\t    output=\"$output_objdir/$outputname\"i\n\t    # Replace all uninstalled libtool libraries with the installed ones\n\t    newdependency_libs=\n\t    for deplib in $dependency_libs; do\n\t      case $deplib in\n\t      *.la)\n\t\tfunc_basename \"$deplib\"\n\t\tname=\"$func_basename_result\"\n\t\tfunc_resolve_sysroot \"$deplib\"\n\t\teval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $func_resolve_sysroot_result`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"\\`$deplib' is not a valid libtool archive\"\n\t\tfunc_append newdependency_libs \" ${lt_sysroot:+=}$libdir/$name\"\n\t\t;;\n\t      -L*)\n\t\tfunc_stripname -L '' \"$deplib\"\n\t\tfunc_replace_sysroot \"$func_stripname_result\"\n\t\tfunc_append newdependency_libs \" -L$func_replace_sysroot_result\"\n\t\t;;\n\t      -R*)\n\t\tfunc_stripname -R '' \"$deplib\"\n\t\tfunc_replace_sysroot \"$func_stripname_result\"\n\t\tfunc_append newdependency_libs \" -R$func_replace_sysroot_result\"\n\t\t;;\n\t      *) func_append newdependency_libs \" $deplib\" ;;\n\t      esac\n\t    done\n\t    dependency_libs=\"$newdependency_libs\"\n\t    newdlfiles=\n\n\t    for lib in $dlfiles; do\n\t      case $lib in\n\t      *.la)\n\t        func_basename \"$lib\"\n\t\tname=\"$func_basename_result\"\n\t\teval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $lib`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"\\`$lib' is not a valid libtool archive\"\n\t\tfunc_append newdlfiles \" ${lt_sysroot:+=}$libdir/$name\"\n\t\t;;\n\t      *) func_append newdlfiles \" $lib\" ;;\n\t      esac\n\t    done\n\t    dlfiles=\"$newdlfiles\"\n\t    newdlprefiles=\n\t    for lib in $dlprefiles; do\n\t      case $lib in\n\t      *.la)\n\t\t# Only pass preopened files to the pseudo-archive (for\n\t\t# eventual linking with the app. that links it) if we\n\t\t# didn't already link the preopened objects directly into\n\t\t# the library:\n\t\tfunc_basename \"$lib\"\n\t\tname=\"$func_basename_result\"\n\t\teval libdir=`${SED} -n -e 's/^libdir=\\(.*\\)$/\\1/p' $lib`\n\t\ttest -z \"$libdir\" && \\\n\t\t  func_fatal_error \"\\`$lib' is not a valid libtool archive\"\n\t\tfunc_append newdlprefiles \" ${lt_sysroot:+=}$libdir/$name\"\n\t\t;;\n\t      esac\n\t    done\n\t    dlprefiles=\"$newdlprefiles\"\n\t  else\n\t    newdlfiles=\n\t    for lib in $dlfiles; do\n\t      case $lib in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs=\"$lib\" ;;\n\t\t*) abs=`pwd`\"/$lib\" ;;\n\t      esac\n\t      func_append newdlfiles \" $abs\"\n\t    done\n\t    dlfiles=\"$newdlfiles\"\n\t    newdlprefiles=\n\t    for lib in $dlprefiles; do\n\t      case $lib in\n\t\t[\\\\/]* | [A-Za-z]:[\\\\/]*) abs=\"$lib\" ;;\n\t\t*) abs=`pwd`\"/$lib\" ;;\n\t      esac\n\t      func_append newdlprefiles \" $abs\"\n\t    done\n\t    dlprefiles=\"$newdlprefiles\"\n\t  fi\n\t  $RM $output\n\t  # place dlname in correct position for cygwin\n\t  # In fact, it would be nice if we could use this code for all target\n\t  # systems that can't hard-code library paths into their executables\n\t  # and that have no shared library path variable independent of PATH,\n\t  # but it turns out we can't easily determine that from inspecting\n\t  # libtool variables, so we have to hard-code the OSs to which it\n\t  # applies here; at the moment, that means platforms that use the PE\n\t  # object format with DLL files.  See the long comment at the top of\n\t  # tests/bindir.at for full details.\n\t  tdlname=$dlname\n\t  case $host,$output,$installed,$module,$dlname in\n\t    *cygwin*,*lai,yes,no,*.dll | *mingw*,*lai,yes,no,*.dll | *cegcc*,*lai,yes,no,*.dll)\n\t      # If a -bindir argument was supplied, place the dll there.\n\t      if test \"x$bindir\" != x ;\n\t      then\n\t\tfunc_relative_path \"$install_libdir\" \"$bindir\"\n\t\ttdlname=$func_relative_path_result$dlname\n\t      else\n\t\t# Otherwise fall back on heuristic.\n\t\ttdlname=../bin/$dlname\n\t      fi\n\t      ;;\n\t  esac\n\t  $ECHO > $output \"\\\n# $outputname - a libtool library file\n# Generated by $PROGRAM (GNU $PACKAGE$TIMESTAMP) $VERSION\n#\n# Please DO NOT delete this file!\n# It is necessary for linking the library.\n\n# The name that we can dlopen(3).\ndlname='$tdlname'\n\n# Names of this library.\nlibrary_names='$library_names'\n\n# The name of the static archive.\nold_library='$old_library'\n\n# Linker flags that can not go in dependency_libs.\ninherited_linker_flags='$new_inherited_linker_flags'\n\n# Libraries that this one depends upon.\ndependency_libs='$dependency_libs'\n\n# Names of additional weak libraries provided by this library\nweak_library_names='$weak_libs'\n\n# Version information for $libname.\ncurrent=$current\nage=$age\nrevision=$revision\n\n# Is this an already installed library?\ninstalled=$installed\n\n# Should we warn about portability when linking against -modules?\nshouldnotlink=$module\n\n# Files to dlopen/dlpreopen\ndlopen='$dlfiles'\ndlpreopen='$dlprefiles'\n\n# Directory that this library needs to be installed in:\nlibdir='$install_libdir'\"\n\t  if test \"$installed\" = no && test \"$need_relink\" = yes; then\n\t    $ECHO >> $output \"\\\nrelink_command=\\\"$relink_command\\\"\"\n\t  fi\n\tdone\n      }\n\n      # Do a symbolic link so that the libtool archive can be found in\n      # LD_LIBRARY_PATH before the program is installed.\n      func_show_eval '( cd \"$output_objdir\" && $RM \"$outputname\" && $LN_S \"../$outputname\" \"$outputname\" )' 'exit $?'\n      ;;\n    esac\n    exit $EXIT_SUCCESS\n}\n\n{ test \"$opt_mode\" = link || test \"$opt_mode\" = relink; } &&\n    func_mode_link ${1+\"$@\"}\n\n\n# func_mode_uninstall arg...\nfunc_mode_uninstall ()\n{\n    $opt_debug\n    RM=\"$nonopt\"\n    files=\n    rmforce=\n    exit_status=0\n\n    # This variable tells wrapper scripts just to set variables rather\n    # than running their programs.\n    libtool_install_magic=\"$magic\"\n\n    for arg\n    do\n      case $arg in\n      -f) func_append RM \" $arg\"; rmforce=yes ;;\n      -*) func_append RM \" $arg\" ;;\n      *) func_append files \" $arg\" ;;\n      esac\n    done\n\n    test -z \"$RM\" && \\\n      func_fatal_help \"you must specify an RM program\"\n\n    rmdirs=\n\n    for file in $files; do\n      func_dirname \"$file\" \"\" \".\"\n      dir=\"$func_dirname_result\"\n      if test \"X$dir\" = X.; then\n\todir=\"$objdir\"\n      else\n\todir=\"$dir/$objdir\"\n      fi\n      func_basename \"$file\"\n      name=\"$func_basename_result\"\n      test \"$opt_mode\" = uninstall && odir=\"$dir\"\n\n      # Remember odir for removal later, being careful to avoid duplicates\n      if test \"$opt_mode\" = clean; then\n\tcase \" $rmdirs \" in\n\t  *\" $odir \"*) ;;\n\t  *) func_append rmdirs \" $odir\" ;;\n\tesac\n      fi\n\n      # Don't error if the file doesn't exist and rm -f was used.\n      if { test -L \"$file\"; } >/dev/null 2>&1 ||\n\t { test -h \"$file\"; } >/dev/null 2>&1 ||\n\t test -f \"$file\"; then\n\t:\n      elif test -d \"$file\"; then\n\texit_status=1\n\tcontinue\n      elif test \"$rmforce\" = yes; then\n\tcontinue\n      fi\n\n      rmfiles=\"$file\"\n\n      case $name in\n      *.la)\n\t# Possibly a libtool archive, so verify it.\n\tif func_lalib_p \"$file\"; then\n\t  func_source $dir/$name\n\n\t  # Delete the libtool libraries and symlinks.\n\t  for n in $library_names; do\n\t    func_append rmfiles \" $odir/$n\"\n\t  done\n\t  test -n \"$old_library\" && func_append rmfiles \" $odir/$old_library\"\n\n\t  case \"$opt_mode\" in\n\t  clean)\n\t    case \" $library_names \" in\n\t    *\" $dlname \"*) ;;\n\t    *) test -n \"$dlname\" && func_append rmfiles \" $odir/$dlname\" ;;\n\t    esac\n\t    test -n \"$libdir\" && func_append rmfiles \" $odir/$name $odir/${name}i\"\n\t    ;;\n\t  uninstall)\n\t    if test -n \"$library_names\"; then\n\t      # Do each command in the postuninstall commands.\n\t      func_execute_cmds \"$postuninstall_cmds\" 'test \"$rmforce\" = yes || exit_status=1'\n\t    fi\n\n\t    if test -n \"$old_library\"; then\n\t      # Do each command in the old_postuninstall commands.\n\t      func_execute_cmds \"$old_postuninstall_cmds\" 'test \"$rmforce\" = yes || exit_status=1'\n\t    fi\n\t    # FIXME: should reinstall the best remaining shared library.\n\t    ;;\n\t  esac\n\tfi\n\t;;\n\n      *.lo)\n\t# Possibly a libtool object, so verify it.\n\tif func_lalib_p \"$file\"; then\n\n\t  # Read the .lo file\n\t  func_source $dir/$name\n\n\t  # Add PIC object to the list of files to remove.\n\t  if test -n \"$pic_object\" &&\n\t     test \"$pic_object\" != none; then\n\t    func_append rmfiles \" $dir/$pic_object\"\n\t  fi\n\n\t  # Add non-PIC object to the list of files to remove.\n\t  if test -n \"$non_pic_object\" &&\n\t     test \"$non_pic_object\" != none; then\n\t    func_append rmfiles \" $dir/$non_pic_object\"\n\t  fi\n\tfi\n\t;;\n\n      *)\n\tif test \"$opt_mode\" = clean ; then\n\t  noexename=$name\n\t  case $file in\n\t  *.exe)\n\t    func_stripname '' '.exe' \"$file\"\n\t    file=$func_stripname_result\n\t    func_stripname '' '.exe' \"$name\"\n\t    noexename=$func_stripname_result\n\t    # $file with .exe has already been added to rmfiles,\n\t    # add $file without .exe\n\t    func_append rmfiles \" $file\"\n\t    ;;\n\t  esac\n\t  # Do a test to see if this is a libtool program.\n\t  if func_ltwrapper_p \"$file\"; then\n\t    if func_ltwrapper_executable_p \"$file\"; then\n\t      func_ltwrapper_scriptname \"$file\"\n\t      relink_command=\n\t      func_source $func_ltwrapper_scriptname_result\n\t      func_append rmfiles \" $func_ltwrapper_scriptname_result\"\n\t    else\n\t      relink_command=\n\t      func_source $dir/$noexename\n\t    fi\n\n\t    # note $name still contains .exe if it was in $file originally\n\t    # as does the version of $file that was added into $rmfiles\n\t    func_append rmfiles \" $odir/$name $odir/${name}S.${objext}\"\n\t    if test \"$fast_install\" = yes && test -n \"$relink_command\"; then\n\t      func_append rmfiles \" $odir/lt-$name\"\n\t    fi\n\t    if test \"X$noexename\" != \"X$name\" ; then\n\t      func_append rmfiles \" $odir/lt-${noexename}.c\"\n\t    fi\n\t  fi\n\tfi\n\t;;\n      esac\n      func_show_eval \"$RM $rmfiles\" 'exit_status=1'\n    done\n\n    # Try to remove the ${objdir}s in the directories where we deleted files\n    for dir in $rmdirs; do\n      if test -d \"$dir\"; then\n\tfunc_show_eval \"rmdir $dir >/dev/null 2>&1\"\n      fi\n    done\n\n    exit $exit_status\n}\n\n{ test \"$opt_mode\" = uninstall || test \"$opt_mode\" = clean; } &&\n    func_mode_uninstall ${1+\"$@\"}\n\ntest -z \"$opt_mode\" && {\n  help=\"$generic_help\"\n  func_fatal_help \"you must specify a MODE\"\n}\n\ntest -z \"$exec_cmd\" && \\\n  func_fatal_help \"invalid operation mode \\`$opt_mode'\"\n\nif test -n \"$exec_cmd\"; then\n  eval exec \"$exec_cmd\"\n  exit $EXIT_FAILURE\nfi\n\nexit $exit_status\n\n\n# The TAGs below are defined such that we never get into a situation\n# in which we disable both kinds of libraries.  Given conflicting\n# choices, we go for a static library, that is the most portable,\n# since we can't tell whether shared libraries were disabled because\n# the user asked for that or because the platform doesn't support\n# them.  This is particularly important on AIX, because we don't\n# support having both static and shared libraries enabled at the same\n# time on that platform, so we default to a shared-only configuration.\n# If a disable-shared tag is given, we'll fallback to a static-only\n# configuration.  But we'll never go from static-only to shared-only.\n\n# ### BEGIN LIBTOOL TAG CONFIG: disable-shared\nbuild_libtool_libs=no\nbuild_old_libs=yes\n# ### END LIBTOOL TAG CONFIG: disable-shared\n\n# ### BEGIN LIBTOOL TAG CONFIG: disable-static\nbuild_old_libs=`case $build_libtool_libs in yes) echo no;; *) echo yes;; esac`\n# ### END LIBTOOL TAG CONFIG: disable-static\n\n# Local Variables:\n# mode:shell-script\n# sh-indentation:2\n# End:\n# vi:sw=2\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/build-aux/missing",
    "content": "#! /bin/sh\n# Common wrapper for a few potentially missing GNU programs.\n\nscriptversion=2013-10-28.13; # UTC\n\n# Copyright (C) 1996-2013 Free Software Foundation, Inc.\n# Originally written by Fran,cois Pinard <pinard@iro.umontreal.ca>, 1996.\n\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2, or (at your option)\n# any later version.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n\n# You should have received a copy of the GNU General Public License\n# along with this program.  If not, see <http://www.gnu.org/licenses/>.\n\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\nif test $# -eq 0; then\n  echo 1>&2 \"Try '$0 --help' for more information\"\n  exit 1\nfi\n\ncase $1 in\n\n  --is-lightweight)\n    # Used by our autoconf macros to check whether the available missing\n    # script is modern enough.\n    exit 0\n    ;;\n\n  --run)\n    # Back-compat with the calling convention used by older automake.\n    shift\n    ;;\n\n  -h|--h|--he|--hel|--help)\n    echo \"\\\n$0 [OPTION]... PROGRAM [ARGUMENT]...\n\nRun 'PROGRAM [ARGUMENT]...', returning a proper advice when this fails due\nto PROGRAM being missing or too old.\n\nOptions:\n  -h, --help      display this help and exit\n  -v, --version   output version information and exit\n\nSupported PROGRAM values:\n  aclocal   autoconf  autoheader   autom4te  automake  makeinfo\n  bison     yacc      flex         lex       help2man\n\nVersion suffixes to PROGRAM as well as the prefixes 'gnu-', 'gnu', and\n'g' are ignored when checking the name.\n\nSend bug reports to <bug-automake@gnu.org>.\"\n    exit $?\n    ;;\n\n  -v|--v|--ve|--ver|--vers|--versi|--versio|--version)\n    echo \"missing $scriptversion (GNU Automake)\"\n    exit $?\n    ;;\n\n  -*)\n    echo 1>&2 \"$0: unknown '$1' option\"\n    echo 1>&2 \"Try '$0 --help' for more information\"\n    exit 1\n    ;;\n\nesac\n\n# Run the given program, remember its exit status.\n\"$@\"; st=$?\n\n# If it succeeded, we are done.\ntest $st -eq 0 && exit 0\n\n# Also exit now if we it failed (or wasn't found), and '--version' was\n# passed; such an option is passed most likely to detect whether the\n# program is present and works.\ncase $2 in --version|--help) exit $st;; esac\n\n# Exit code 63 means version mismatch.  This often happens when the user\n# tries to use an ancient version of a tool on a file that requires a\n# minimum version.\nif test $st -eq 63; then\n  msg=\"probably too old\"\nelif test $st -eq 127; then\n  # Program was missing.\n  msg=\"missing on your system\"\nelse\n  # Program was found and executed, but failed.  Give up.\n  exit $st\nfi\n\nperl_URL=http://www.perl.org/\nflex_URL=http://flex.sourceforge.net/\ngnu_software_URL=http://www.gnu.org/software\n\nprogram_details ()\n{\n  case $1 in\n    aclocal|automake)\n      echo \"The '$1' program is part of the GNU Automake package:\"\n      echo \"<$gnu_software_URL/automake>\"\n      echo \"It also requires GNU Autoconf, GNU m4 and Perl in order to run:\"\n      echo \"<$gnu_software_URL/autoconf>\"\n      echo \"<$gnu_software_URL/m4/>\"\n      echo \"<$perl_URL>\"\n      ;;\n    autoconf|autom4te|autoheader)\n      echo \"The '$1' program is part of the GNU Autoconf package:\"\n      echo \"<$gnu_software_URL/autoconf/>\"\n      echo \"It also requires GNU m4 and Perl in order to run:\"\n      echo \"<$gnu_software_URL/m4/>\"\n      echo \"<$perl_URL>\"\n      ;;\n  esac\n}\n\ngive_advice ()\n{\n  # Normalize program name to check for.\n  normalized_program=`echo \"$1\" | sed '\n    s/^gnu-//; t\n    s/^gnu//; t\n    s/^g//; t'`\n\n  printf '%s\\n' \"'$1' is $msg.\"\n\n  configure_deps=\"'configure.ac' or m4 files included by 'configure.ac'\"\n  case $normalized_program in\n    autoconf*)\n      echo \"You should only need it if you modified 'configure.ac',\"\n      echo \"or m4 files included by it.\"\n      program_details 'autoconf'\n      ;;\n    autoheader*)\n      echo \"You should only need it if you modified 'acconfig.h' or\"\n      echo \"$configure_deps.\"\n      program_details 'autoheader'\n      ;;\n    automake*)\n      echo \"You should only need it if you modified 'Makefile.am' or\"\n      echo \"$configure_deps.\"\n      program_details 'automake'\n      ;;\n    aclocal*)\n      echo \"You should only need it if you modified 'acinclude.m4' or\"\n      echo \"$configure_deps.\"\n      program_details 'aclocal'\n      ;;\n   autom4te*)\n      echo \"You might have modified some maintainer files that require\"\n      echo \"the 'autom4te' program to be rebuilt.\"\n      program_details 'autom4te'\n      ;;\n    bison*|yacc*)\n      echo \"You should only need it if you modified a '.y' file.\"\n      echo \"You may want to install the GNU Bison package:\"\n      echo \"<$gnu_software_URL/bison/>\"\n      ;;\n    lex*|flex*)\n      echo \"You should only need it if you modified a '.l' file.\"\n      echo \"You may want to install the Fast Lexical Analyzer package:\"\n      echo \"<$flex_URL>\"\n      ;;\n    help2man*)\n      echo \"You should only need it if you modified a dependency\" \\\n           \"of a man page.\"\n      echo \"You may want to install the GNU Help2man package:\"\n      echo \"<$gnu_software_URL/help2man/>\"\n    ;;\n    makeinfo*)\n      echo \"You should only need it if you modified a '.texi' file, or\"\n      echo \"any other file indirectly affecting the aspect of the manual.\"\n      echo \"You might want to install the Texinfo package:\"\n      echo \"<$gnu_software_URL/texinfo/>\"\n      echo \"The spurious makeinfo call might also be the consequence of\"\n      echo \"using a buggy 'make' (AIX, DU, IRIX), in which case you might\"\n      echo \"want to install GNU make:\"\n      echo \"<$gnu_software_URL/make/>\"\n      ;;\n    *)\n      echo \"You might have modified some files without having the proper\"\n      echo \"tools for further handling them.  Check the 'README' file, it\"\n      echo \"often tells you about the needed prerequisites for installing\"\n      echo \"this package.  You may also peek at any GNU archive site, in\"\n      echo \"case some other package contains this missing '$1' program.\"\n      ;;\n  esac\n}\n\ngive_advice \"$1\" | sed -e '1s/^/WARNING: /' \\\n                       -e '2,$s/^/         /' >&2\n\n# Propagate the correct exit status (expected to be 127 for a program\n# not found, 63 for a program that failed due to version mismatch).\nexit $st\n\n# Local variables:\n# eval: (add-hook 'write-file-hooks 'time-stamp)\n# time-stamp-start: \"scriptversion=\"\n# time-stamp-format: \"%:y-%02m-%02d.%02H\"\n# time-stamp-time-zone: \"UTC\"\n# time-stamp-end: \"; # UTC\"\n# End:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/configure",
    "content": "#! /bin/sh\n# Guess values for system-dependent variables and create Makefiles.\n# Generated by GNU Autoconf 2.69 for libsodium 1.0.7.\n#\n# Report bugs to <https://github.com/jedisct1/libsodium/issues>.\n#\n#\n# Copyright (C) 1992-1996, 1998-2012 Free Software Foundation, Inc.\n#\n#\n# This configure script is free software; the Free Software Foundation\n# gives unlimited permission to copy, distribute and modify it.\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\n# Use a proper internal environment variable to ensure we don't fall\n  # into an infinite loop, continuously re-executing ourselves.\n  if test x\"${_as_can_reexec}\" != xno && test \"x$CONFIG_SHELL\" != x; then\n    _as_can_reexec=no; export _as_can_reexec;\n    # We cannot yet assume a decent shell, so we have to provide a\n# neutralization value for shells without unset; and this also\n# works around shells that cannot unset nonexistent variables.\n# Preserve -v and -x to the replacement shell.\nBASH_ENV=/dev/null\nENV=/dev/null\n(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\ncase $- in # ((((\n  *v*x* | *x*v* ) as_opts=-vx ;;\n  *v* ) as_opts=-v ;;\n  *x* ) as_opts=-x ;;\n  * ) as_opts= ;;\nesac\nexec $CONFIG_SHELL $as_opts \"$as_myself\" ${1+\"$@\"}\n# Admittedly, this is quite paranoid, since all the known shells bail\n# out after a failed `exec'.\n$as_echo \"$0: could not re-execute with $CONFIG_SHELL\" >&2\nas_fn_exit 255\n  fi\n  # We don't want this to propagate to other subprocesses.\n          { _as_can_reexec=; unset _as_can_reexec;}\nif test \"x$CONFIG_SHELL\" = x; then\n  as_bourne_compatible=\"if test -n \\\"\\${ZSH_VERSION+set}\\\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on \\${1+\\\"\\$@\\\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '\\${1+\\\"\\$@\\\"}'='\\\"\\$@\\\"'\n  setopt NO_GLOB_SUBST\nelse\n  case \\`(set -o) 2>/dev/null\\` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\"\n  as_required=\"as_fn_return () { (exit \\$1); }\nas_fn_success () { as_fn_return 0; }\nas_fn_failure () { as_fn_return 1; }\nas_fn_ret_success () { return 0; }\nas_fn_ret_failure () { return 1; }\n\nexitcode=0\nas_fn_success || { exitcode=1; echo as_fn_success failed.; }\nas_fn_failure && { exitcode=1; echo as_fn_failure succeeded.; }\nas_fn_ret_success || { exitcode=1; echo as_fn_ret_success failed.; }\nas_fn_ret_failure && { exitcode=1; echo as_fn_ret_failure succeeded.; }\nif ( set x; as_fn_ret_success y && test x = \\\"\\$1\\\" ); then :\n\nelse\n  exitcode=1; echo positional parameters were not saved.\nfi\ntest x\\$exitcode = x0 || exit 1\ntest -x / || exit 1\"\n  as_suggested=\"  as_lineno_1=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_1a=\\$LINENO\n  as_lineno_2=\";as_suggested=$as_suggested$LINENO;as_suggested=$as_suggested\" as_lineno_2a=\\$LINENO\n  eval 'test \\\"x\\$as_lineno_1'\\$as_run'\\\" != \\\"x\\$as_lineno_2'\\$as_run'\\\" &&\n  test \\\"x\\`expr \\$as_lineno_1'\\$as_run' + 1\\`\\\" = \\\"x\\$as_lineno_2'\\$as_run'\\\"' || exit 1\ntest \\$(( 1 + 1 )) = 2 || exit 1\n\n  test -n \\\"\\${ZSH_VERSION+set}\\${BASH_VERSION+set}\\\" || (\n    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\n    ECHO=\\$ECHO\\$ECHO\\$ECHO\\$ECHO\\$ECHO\n    ECHO=\\$ECHO\\$ECHO\\$ECHO\\$ECHO\\$ECHO\\$ECHO\n    PATH=/empty FPATH=/empty; export PATH FPATH\n    test \\\"X\\`printf %s \\$ECHO\\`\\\" = \\\"X\\$ECHO\\\" \\\\\n      || test \\\"X\\`print -r -- \\$ECHO\\`\\\" = \\\"X\\$ECHO\\\" ) || exit 1\"\n  if (eval \"$as_required\") 2>/dev/null; then :\n  as_have_required=yes\nelse\n  as_have_required=no\nfi\n  if test x$as_have_required = xyes && (eval \"$as_suggested\") 2>/dev/null; then :\n\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nas_found=false\nfor as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  as_found=:\n  case $as_dir in #(\n\t /*)\n\t   for as_base in sh bash ksh sh5; do\n\t     # Try only shells that exist, to save several forks.\n\t     as_shell=$as_dir/$as_base\n\t     if { test -f \"$as_shell\" || test -f \"$as_shell.exe\"; } &&\n\t\t    { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$as_shell as_have_required=yes\n\t\t   if { $as_echo \"$as_bourne_compatible\"\"$as_suggested\" | as_run=a \"$as_shell\"; } 2>/dev/null; then :\n  break 2\nfi\nfi\n\t   done;;\n       esac\n  as_found=false\ndone\n$as_found || { if { test -f \"$SHELL\" || test -f \"$SHELL.exe\"; } &&\n\t      { $as_echo \"$as_bourne_compatible\"\"$as_required\" | as_run=a \"$SHELL\"; } 2>/dev/null; then :\n  CONFIG_SHELL=$SHELL as_have_required=yes\nfi; }\nIFS=$as_save_IFS\n\n\n      if test \"x$CONFIG_SHELL\" != x; then :\n  export CONFIG_SHELL\n             # We cannot yet assume a decent shell, so we have to provide a\n# neutralization value for shells without unset; and this also\n# works around shells that cannot unset nonexistent variables.\n# Preserve -v and -x to the replacement shell.\nBASH_ENV=/dev/null\nENV=/dev/null\n(unset BASH_ENV) >/dev/null 2>&1 && unset BASH_ENV ENV\ncase $- in # ((((\n  *v*x* | *x*v* ) as_opts=-vx ;;\n  *v* ) as_opts=-v ;;\n  *x* ) as_opts=-x ;;\n  * ) as_opts= ;;\nesac\nexec $CONFIG_SHELL $as_opts \"$as_myself\" ${1+\"$@\"}\n# Admittedly, this is quite paranoid, since all the known shells bail\n# out after a failed `exec'.\n$as_echo \"$0: could not re-execute with $CONFIG_SHELL\" >&2\nexit 255\nfi\n\n    if test x$as_have_required = xno; then :\n  $as_echo \"$0: This script requires a shell more modern than all\"\n  $as_echo \"$0: the shells that I found on your system.\"\n  if test x${ZSH_VERSION+set} = xset ; then\n    $as_echo \"$0: In particular, zsh $ZSH_VERSION has bugs and should\"\n    $as_echo \"$0: be upgraded to zsh 4.3.4 or later.\"\n  else\n    $as_echo \"$0: Please tell bug-autoconf@gnu.org and\n$0: https://github.com/jedisct1/libsodium/issues about your\n$0: system, including any error possibly output before this\n$0: message. Then install a modern shell, or manually run\n$0: the script under such a shell if you do have one.\"\n  fi\n  exit 1\nfi\nfi\nfi\nSHELL=${CONFIG_SHELL-/bin/sh}\nexport SHELL\n# Unset more variables known to interfere with behavior of common tools.\nCLICOLOR_FORCE= GREP_OPTIONS=\nunset CLICOLOR_FORCE GREP_OPTIONS\n\n## --------------------- ##\n## M4sh Shell Functions. ##\n## --------------------- ##\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\n\n# as_fn_executable_p FILE\n# -----------------------\n# Test if FILE is an executable regular file.\nas_fn_executable_p ()\n{\n  test -f \"$1\" && test -x \"$1\"\n} # as_fn_executable_p\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  $as_echo \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\n\n  as_lineno_1=$LINENO as_lineno_1a=$LINENO\n  as_lineno_2=$LINENO as_lineno_2a=$LINENO\n  eval 'test \"x$as_lineno_1'$as_run'\" != \"x$as_lineno_2'$as_run'\" &&\n  test \"x`expr $as_lineno_1'$as_run' + 1`\" = \"x$as_lineno_2'$as_run'\"' || {\n  # Blame Lee E. McMahon (1931-1989) for sed's syntax.  :-)\n  sed -n '\n    p\n    /[$]LINENO/=\n  ' <$as_myself |\n    sed '\n      s/[$]LINENO.*/&-/\n      t lineno\n      b\n      :lineno\n      N\n      :loop\n      s/[$]LINENO\\([^'$as_cr_alnum'_].*\\n\\)\\(.*\\)/\\2\\1\\2/\n      t loop\n      s/-\\n.*//\n    ' >$as_me.lineno &&\n  chmod +x \"$as_me.lineno\" ||\n    { $as_echo \"$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell\" >&2; as_fn_exit 1; }\n\n  # If we had to re-execute with $CONFIG_SHELL, we're ensured to have\n  # already done that, so ensure we don't try to do so again and fall\n  # in an infinite loop.  This has already happened in practice.\n  _as_can_reexec=no; export _as_can_reexec\n  # Don't try to exec as it changes $[0], causing all sort of problems\n  # (the dirname of $[0] is not the place where we might find the\n  # original and so on.  Autoconf is especially sensitive to this).\n  . \"./$as_me.lineno\"\n  # Exit status is that of the last command.\n  exit\n}\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -pR'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -pR'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -pR'\n  fi\nelse\n  as_ln_s='cp -pR'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\nas_test_x='test -x'\nas_executable_p=as_fn_executable_p\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\nSHELL=${CONFIG_SHELL-/bin/sh}\n\n\ntest -n \"$DJDIR\" || exec 7<&0 </dev/null\nexec 6>&1\n\n# Name of the host.\n# hostname on some systems (SVR3.2, old GNU/Linux) returns a bogus exit status,\n# so uname gets run too.\nac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q`\n\n#\n# Initializations.\n#\nac_default_prefix=/usr/local\nac_clean_files=\nac_config_libobj_dir=.\nLIBOBJS=\ncross_compiling=no\nsubdirs=\nMFLAGS=\nMAKEFLAGS=\n\n# Identity of this package.\nPACKAGE_NAME='libsodium'\nPACKAGE_TARNAME='libsodium'\nPACKAGE_VERSION='1.0.7'\nPACKAGE_STRING='libsodium 1.0.7'\nPACKAGE_BUGREPORT='https://github.com/jedisct1/libsodium/issues'\nPACKAGE_URL='https://github.com/jedisct1/libsodium'\n\nac_unique_file=\"src/libsodium/sodium/version.c\"\n# Factoring default headers for most tests.\nac_includes_default=\"\\\n#include <stdio.h>\n#ifdef HAVE_SYS_TYPES_H\n# include <sys/types.h>\n#endif\n#ifdef HAVE_SYS_STAT_H\n# include <sys/stat.h>\n#endif\n#ifdef STDC_HEADERS\n# include <stdlib.h>\n# include <stddef.h>\n#else\n# ifdef HAVE_STDLIB_H\n#  include <stdlib.h>\n# endif\n#endif\n#ifdef HAVE_STRING_H\n# if !defined STDC_HEADERS && defined HAVE_MEMORY_H\n#  include <memory.h>\n# endif\n# include <string.h>\n#endif\n#ifdef HAVE_STRINGS_H\n# include <strings.h>\n#endif\n#ifdef HAVE_INTTYPES_H\n# include <inttypes.h>\n#endif\n#ifdef HAVE_STDINT_H\n# include <stdint.h>\n#endif\n#ifdef HAVE_UNISTD_H\n# include <unistd.h>\n#endif\"\n\nac_subst_vars='am__EXEEXT_FALSE\nam__EXEEXT_TRUE\nLTLIBOBJS\nLIBOBJS\nHAVE_LD_OUTPUT_DEF_FALSE\nHAVE_LD_OUTPUT_DEF_TRUE\nAS\nNATIVECLIENT_FALSE\nNATIVECLIENT_TRUE\nEMSCRIPTEN_FALSE\nEMSCRIPTEN_TRUE\nTEST_LDFLAGS\nLIBTOOL_EXTRA_FLAGS\nHAVE_CPUID_V\nHAVE_TI_MODE_V\nHAVE_TI_MODE_FALSE\nHAVE_TI_MODE_TRUE\nHAVE_AVX_ASM_V\nHAVE_AVX_ASM_FALSE\nHAVE_AVX_ASM_TRUE\nHAVE_AMD64_ASM_V\nHAVE_AMD64_ASM_FALSE\nHAVE_AMD64_ASM_TRUE\nCFLAGS_PCLMUL\nCFLAGS_AESNI\nCFLAGS_SSE41\nCFLAGS_SSSE3\nCFLAGS_SSE3\nCFLAGS_SSE2\nCFLAGS_MMX\nLIBTOOL_DEPS\nOTOOL64\nOTOOL\nLIPO\nNMEDIT\nDSYMUTIL\nMANIFEST_TOOL\nRANLIB\nac_ct_AR\nAR\nDLLTOOL\nOBJDUMP\nLN_S\nNM\nac_ct_DUMPBIN\nDUMPBIN\nLD\nFGREP\nSED\nLIBTOOL\nCWFLAGS\nEGREP\nGREP\nCPP\nam__fastdepCCAS_FALSE\nam__fastdepCCAS_TRUE\nCCASDEPMODE\nCCASFLAGS\nCCAS\nam__fastdepCC_FALSE\nam__fastdepCC_TRUE\nCCDEPMODE\nam__quote\nam__include\nDEPDIR\nOBJEXT\nEXEEXT\nac_ct_CC\nCPPFLAGS\nLDFLAGS\nCFLAGS\nCC\nSAFECODE_HOME\nMINIMAL_FALSE\nMINIMAL_TRUE\nDLL_VERSION\nSODIUM_LIBRARY_VERSION\nSODIUM_LIBRARY_VERSION_MINOR\nSODIUM_LIBRARY_VERSION_MAJOR\nISODATE\nam__nodep\nAMDEPBACKSLASH\nAMDEP_FALSE\nAMDEP_TRUE\nMAINT\nMAINTAINER_MODE_FALSE\nMAINTAINER_MODE_TRUE\nAM_BACKSLASH\nAM_DEFAULT_VERBOSITY\nAM_DEFAULT_V\nAM_V\nam__untar\nam__tar\nAMTAR\nam__leading_dot\nSET_MAKE\nAWK\nmkdir_p\nMKDIR_P\nINSTALL_STRIP_PROGRAM\nSTRIP\ninstall_sh\nMAKEINFO\nAUTOHEADER\nAUTOMAKE\nAUTOCONF\nACLOCAL\nVERSION\nPACKAGE\nCYGPATH_W\nam__isrc\nINSTALL_DATA\nINSTALL_SCRIPT\nINSTALL_PROGRAM\nhost_os\nhost_vendor\nhost_cpu\nhost\nbuild_os\nbuild_vendor\nbuild_cpu\nbuild\ntarget_alias\nhost_alias\nbuild_alias\nLIBS\nECHO_T\nECHO_N\nECHO_C\nDEFS\nmandir\nlocaledir\nlibdir\npsdir\npdfdir\ndvidir\nhtmldir\ninfodir\ndocdir\noldincludedir\nincludedir\nlocalstatedir\nsharedstatedir\nsysconfdir\ndatadir\ndatarootdir\nlibexecdir\nsbindir\nbindir\nprogram_transform_name\nprefix\nexec_prefix\nPACKAGE_URL\nPACKAGE_BUGREPORT\nPACKAGE_STRING\nPACKAGE_VERSION\nPACKAGE_TARNAME\nPACKAGE_NAME\nPATH_SEPARATOR\nSHELL'\nac_subst_files=''\nac_user_opts='\nenable_option_checking\nenable_silent_rules\nenable_maintainer_mode\nenable_dependency_tracking\nenable_ssp\nenable_asm\nenable_pie\nenable_blocking_random\nenable_minimal\nwith_safecode\nenable_debug\nenable_opt\nenable_soname_versions\nenable_shared\nenable_static\nwith_pic\nenable_fast_install\nwith_gnu_ld\nwith_sysroot\nenable_libtool_lock\n'\n      ac_precious_vars='build_alias\nhost_alias\ntarget_alias\nSAFECODE_HOME\nCC\nCFLAGS\nLDFLAGS\nLIBS\nCPPFLAGS\nCCAS\nCCASFLAGS\nCPP\nCWFLAGS\nAR'\n\n\n# Initialize some variables set by options.\nac_init_help=\nac_init_version=false\nac_unrecognized_opts=\nac_unrecognized_sep=\n# The variables have the same names as the options, with\n# dashes changed to underlines.\ncache_file=/dev/null\nexec_prefix=NONE\nno_create=\nno_recursion=\nprefix=NONE\nprogram_prefix=NONE\nprogram_suffix=NONE\nprogram_transform_name=s,x,x,\nsilent=\nsite=\nsrcdir=\nverbose=\nx_includes=NONE\nx_libraries=NONE\n\n# Installation directory options.\n# These are left unexpanded so users can \"make install exec_prefix=/foo\"\n# and all the variables that are supposed to be based on exec_prefix\n# by default will actually change.\n# Use braces instead of parens because sh, perl, etc. also accept them.\n# (The list follows the same order as the GNU Coding Standards.)\nbindir='${exec_prefix}/bin'\nsbindir='${exec_prefix}/sbin'\nlibexecdir='${exec_prefix}/libexec'\ndatarootdir='${prefix}/share'\ndatadir='${datarootdir}'\nsysconfdir='${prefix}/etc'\nsharedstatedir='${prefix}/com'\nlocalstatedir='${prefix}/var'\nincludedir='${prefix}/include'\noldincludedir='/usr/include'\ndocdir='${datarootdir}/doc/${PACKAGE_TARNAME}'\ninfodir='${datarootdir}/info'\nhtmldir='${docdir}'\ndvidir='${docdir}'\npdfdir='${docdir}'\npsdir='${docdir}'\nlibdir='${exec_prefix}/lib'\nlocaledir='${datarootdir}/locale'\nmandir='${datarootdir}/man'\n\nac_prev=\nac_dashdash=\nfor ac_option\ndo\n  # If the previous option needs an argument, assign it.\n  if test -n \"$ac_prev\"; then\n    eval $ac_prev=\\$ac_option\n    ac_prev=\n    continue\n  fi\n\n  case $ac_option in\n  *=?*) ac_optarg=`expr \"X$ac_option\" : '[^=]*=\\(.*\\)'` ;;\n  *=)   ac_optarg= ;;\n  *)    ac_optarg=yes ;;\n  esac\n\n  # Accept the important Cygnus configure options, so we can diagnose typos.\n\n  case $ac_dashdash$ac_option in\n  --)\n    ac_dashdash=yes ;;\n\n  -bindir | --bindir | --bindi | --bind | --bin | --bi)\n    ac_prev=bindir ;;\n  -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*)\n    bindir=$ac_optarg ;;\n\n  -build | --build | --buil | --bui | --bu)\n    ac_prev=build_alias ;;\n  -build=* | --build=* | --buil=* | --bui=* | --bu=*)\n    build_alias=$ac_optarg ;;\n\n  -cache-file | --cache-file | --cache-fil | --cache-fi \\\n  | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c)\n    ac_prev=cache_file ;;\n  -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \\\n  | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*)\n    cache_file=$ac_optarg ;;\n\n  --config-cache | -C)\n    cache_file=config.cache ;;\n\n  -datadir | --datadir | --datadi | --datad)\n    ac_prev=datadir ;;\n  -datadir=* | --datadir=* | --datadi=* | --datad=*)\n    datadir=$ac_optarg ;;\n\n  -datarootdir | --datarootdir | --datarootdi | --datarootd | --dataroot \\\n  | --dataroo | --dataro | --datar)\n    ac_prev=datarootdir ;;\n  -datarootdir=* | --datarootdir=* | --datarootdi=* | --datarootd=* \\\n  | --dataroot=* | --dataroo=* | --dataro=* | --datar=*)\n    datarootdir=$ac_optarg ;;\n\n  -disable-* | --disable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*disable-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--disable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=no ;;\n\n  -docdir | --docdir | --docdi | --doc | --do)\n    ac_prev=docdir ;;\n  -docdir=* | --docdir=* | --docdi=* | --doc=* | --do=*)\n    docdir=$ac_optarg ;;\n\n  -dvidir | --dvidir | --dvidi | --dvid | --dvi | --dv)\n    ac_prev=dvidir ;;\n  -dvidir=* | --dvidir=* | --dvidi=* | --dvid=* | --dvi=* | --dv=*)\n    dvidir=$ac_optarg ;;\n\n  -enable-* | --enable-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*enable-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid feature name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"enable_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--enable-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval enable_$ac_useropt=\\$ac_optarg ;;\n\n  -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \\\n  | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \\\n  | --exec | --exe | --ex)\n    ac_prev=exec_prefix ;;\n  -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \\\n  | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \\\n  | --exec=* | --exe=* | --ex=*)\n    exec_prefix=$ac_optarg ;;\n\n  -gas | --gas | --ga | --g)\n    # Obsolete; use --with-gas.\n    with_gas=yes ;;\n\n  -help | --help | --hel | --he | -h)\n    ac_init_help=long ;;\n  -help=r* | --help=r* | --hel=r* | --he=r* | -hr*)\n    ac_init_help=recursive ;;\n  -help=s* | --help=s* | --hel=s* | --he=s* | -hs*)\n    ac_init_help=short ;;\n\n  -host | --host | --hos | --ho)\n    ac_prev=host_alias ;;\n  -host=* | --host=* | --hos=* | --ho=*)\n    host_alias=$ac_optarg ;;\n\n  -htmldir | --htmldir | --htmldi | --htmld | --html | --htm | --ht)\n    ac_prev=htmldir ;;\n  -htmldir=* | --htmldir=* | --htmldi=* | --htmld=* | --html=* | --htm=* \\\n  | --ht=*)\n    htmldir=$ac_optarg ;;\n\n  -includedir | --includedir | --includedi | --included | --include \\\n  | --includ | --inclu | --incl | --inc)\n    ac_prev=includedir ;;\n  -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \\\n  | --includ=* | --inclu=* | --incl=* | --inc=*)\n    includedir=$ac_optarg ;;\n\n  -infodir | --infodir | --infodi | --infod | --info | --inf)\n    ac_prev=infodir ;;\n  -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*)\n    infodir=$ac_optarg ;;\n\n  -libdir | --libdir | --libdi | --libd)\n    ac_prev=libdir ;;\n  -libdir=* | --libdir=* | --libdi=* | --libd=*)\n    libdir=$ac_optarg ;;\n\n  -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \\\n  | --libexe | --libex | --libe)\n    ac_prev=libexecdir ;;\n  -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \\\n  | --libexe=* | --libex=* | --libe=*)\n    libexecdir=$ac_optarg ;;\n\n  -localedir | --localedir | --localedi | --localed | --locale)\n    ac_prev=localedir ;;\n  -localedir=* | --localedir=* | --localedi=* | --localed=* | --locale=*)\n    localedir=$ac_optarg ;;\n\n  -localstatedir | --localstatedir | --localstatedi | --localstated \\\n  | --localstate | --localstat | --localsta | --localst | --locals)\n    ac_prev=localstatedir ;;\n  -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \\\n  | --localstate=* | --localstat=* | --localsta=* | --localst=* | --locals=*)\n    localstatedir=$ac_optarg ;;\n\n  -mandir | --mandir | --mandi | --mand | --man | --ma | --m)\n    ac_prev=mandir ;;\n  -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*)\n    mandir=$ac_optarg ;;\n\n  -nfp | --nfp | --nf)\n    # Obsolete; use --without-fp.\n    with_fp=no ;;\n\n  -no-create | --no-create | --no-creat | --no-crea | --no-cre \\\n  | --no-cr | --no-c | -n)\n    no_create=yes ;;\n\n  -no-recursion | --no-recursion | --no-recursio | --no-recursi \\\n  | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r)\n    no_recursion=yes ;;\n\n  -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \\\n  | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \\\n  | --oldin | --oldi | --old | --ol | --o)\n    ac_prev=oldincludedir ;;\n  -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \\\n  | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \\\n  | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*)\n    oldincludedir=$ac_optarg ;;\n\n  -prefix | --prefix | --prefi | --pref | --pre | --pr | --p)\n    ac_prev=prefix ;;\n  -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*)\n    prefix=$ac_optarg ;;\n\n  -program-prefix | --program-prefix | --program-prefi | --program-pref \\\n  | --program-pre | --program-pr | --program-p)\n    ac_prev=program_prefix ;;\n  -program-prefix=* | --program-prefix=* | --program-prefi=* \\\n  | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*)\n    program_prefix=$ac_optarg ;;\n\n  -program-suffix | --program-suffix | --program-suffi | --program-suff \\\n  | --program-suf | --program-su | --program-s)\n    ac_prev=program_suffix ;;\n  -program-suffix=* | --program-suffix=* | --program-suffi=* \\\n  | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*)\n    program_suffix=$ac_optarg ;;\n\n  -program-transform-name | --program-transform-name \\\n  | --program-transform-nam | --program-transform-na \\\n  | --program-transform-n | --program-transform- \\\n  | --program-transform | --program-transfor \\\n  | --program-transfo | --program-transf \\\n  | --program-trans | --program-tran \\\n  | --progr-tra | --program-tr | --program-t)\n    ac_prev=program_transform_name ;;\n  -program-transform-name=* | --program-transform-name=* \\\n  | --program-transform-nam=* | --program-transform-na=* \\\n  | --program-transform-n=* | --program-transform-=* \\\n  | --program-transform=* | --program-transfor=* \\\n  | --program-transfo=* | --program-transf=* \\\n  | --program-trans=* | --program-tran=* \\\n  | --progr-tra=* | --program-tr=* | --program-t=*)\n    program_transform_name=$ac_optarg ;;\n\n  -pdfdir | --pdfdir | --pdfdi | --pdfd | --pdf | --pd)\n    ac_prev=pdfdir ;;\n  -pdfdir=* | --pdfdir=* | --pdfdi=* | --pdfd=* | --pdf=* | --pd=*)\n    pdfdir=$ac_optarg ;;\n\n  -psdir | --psdir | --psdi | --psd | --ps)\n    ac_prev=psdir ;;\n  -psdir=* | --psdir=* | --psdi=* | --psd=* | --ps=*)\n    psdir=$ac_optarg ;;\n\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil)\n    silent=yes ;;\n\n  -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)\n    ac_prev=sbindir ;;\n  -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \\\n  | --sbi=* | --sb=*)\n    sbindir=$ac_optarg ;;\n\n  -sharedstatedir | --sharedstatedir | --sharedstatedi \\\n  | --sharedstated | --sharedstate | --sharedstat | --sharedsta \\\n  | --sharedst | --shareds | --shared | --share | --shar \\\n  | --sha | --sh)\n    ac_prev=sharedstatedir ;;\n  -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \\\n  | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \\\n  | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \\\n  | --sha=* | --sh=*)\n    sharedstatedir=$ac_optarg ;;\n\n  -site | --site | --sit)\n    ac_prev=site ;;\n  -site=* | --site=* | --sit=*)\n    site=$ac_optarg ;;\n\n  -srcdir | --srcdir | --srcdi | --srcd | --src | --sr)\n    ac_prev=srcdir ;;\n  -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*)\n    srcdir=$ac_optarg ;;\n\n  -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \\\n  | --syscon | --sysco | --sysc | --sys | --sy)\n    ac_prev=sysconfdir ;;\n  -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \\\n  | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*)\n    sysconfdir=$ac_optarg ;;\n\n  -target | --target | --targe | --targ | --tar | --ta | --t)\n    ac_prev=target_alias ;;\n  -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*)\n    target_alias=$ac_optarg ;;\n\n  -v | -verbose | --verbose | --verbos | --verbo | --verb)\n    verbose=yes ;;\n\n  -version | --version | --versio | --versi | --vers | -V)\n    ac_init_version=: ;;\n\n  -with-* | --with-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*with-\\([^=]*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--with-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=\\$ac_optarg ;;\n\n  -without-* | --without-*)\n    ac_useropt=`expr \"x$ac_option\" : 'x-*without-\\(.*\\)'`\n    # Reject names that are not valid shell variable names.\n    expr \"x$ac_useropt\" : \".*[^-+._$as_cr_alnum]\" >/dev/null &&\n      as_fn_error $? \"invalid package name: $ac_useropt\"\n    ac_useropt_orig=$ac_useropt\n    ac_useropt=`$as_echo \"$ac_useropt\" | sed 's/[-+.]/_/g'`\n    case $ac_user_opts in\n      *\"\n\"with_$ac_useropt\"\n\"*) ;;\n      *) ac_unrecognized_opts=\"$ac_unrecognized_opts$ac_unrecognized_sep--without-$ac_useropt_orig\"\n\t ac_unrecognized_sep=', ';;\n    esac\n    eval with_$ac_useropt=no ;;\n\n  --x)\n    # Obsolete; use --with-x.\n    with_x=yes ;;\n\n  -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \\\n  | --x-incl | --x-inc | --x-in | --x-i)\n    ac_prev=x_includes ;;\n  -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \\\n  | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*)\n    x_includes=$ac_optarg ;;\n\n  -x-libraries | --x-libraries | --x-librarie | --x-librari \\\n  | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l)\n    ac_prev=x_libraries ;;\n  -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \\\n  | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*)\n    x_libraries=$ac_optarg ;;\n\n  -*) as_fn_error $? \"unrecognized option: \\`$ac_option'\nTry \\`$0 --help' for more information\"\n    ;;\n\n  *=*)\n    ac_envvar=`expr \"x$ac_option\" : 'x\\([^=]*\\)='`\n    # Reject names that are not valid shell variable names.\n    case $ac_envvar in #(\n      '' | [0-9]* | *[!_$as_cr_alnum]* )\n      as_fn_error $? \"invalid variable name: \\`$ac_envvar'\" ;;\n    esac\n    eval $ac_envvar=\\$ac_optarg\n    export $ac_envvar ;;\n\n  *)\n    # FIXME: should be removed in autoconf 3.0.\n    $as_echo \"$as_me: WARNING: you should use --build, --host, --target\" >&2\n    expr \"x$ac_option\" : \".*[^-._$as_cr_alnum]\" >/dev/null &&\n      $as_echo \"$as_me: WARNING: invalid host type: $ac_option\" >&2\n    : \"${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option}\"\n    ;;\n\n  esac\ndone\n\nif test -n \"$ac_prev\"; then\n  ac_option=--`echo $ac_prev | sed 's/_/-/g'`\n  as_fn_error $? \"missing argument to $ac_option\"\nfi\n\nif test -n \"$ac_unrecognized_opts\"; then\n  case $enable_option_checking in\n    no) ;;\n    fatal) as_fn_error $? \"unrecognized options: $ac_unrecognized_opts\" ;;\n    *)     $as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2 ;;\n  esac\nfi\n\n# Check all directory arguments for consistency.\nfor ac_var in\texec_prefix prefix bindir sbindir libexecdir datarootdir \\\n\t\tdatadir sysconfdir sharedstatedir localstatedir includedir \\\n\t\toldincludedir docdir infodir htmldir dvidir pdfdir psdir \\\n\t\tlibdir localedir mandir\ndo\n  eval ac_val=\\$$ac_var\n  # Remove trailing slashes.\n  case $ac_val in\n    */ )\n      ac_val=`expr \"X$ac_val\" : 'X\\(.*[^/]\\)' \\| \"X$ac_val\" : 'X\\(.*\\)'`\n      eval $ac_var=\\$ac_val;;\n  esac\n  # Be sure to have absolute directory names.\n  case $ac_val in\n    [\\\\/$]* | ?:[\\\\/]* )  continue;;\n    NONE | '' ) case $ac_var in *prefix ) continue;; esac;;\n  esac\n  as_fn_error $? \"expected an absolute directory name for --$ac_var: $ac_val\"\ndone\n\n# There might be people who depend on the old broken behavior: `$host'\n# used to hold the argument of --host etc.\n# FIXME: To remove some day.\nbuild=$build_alias\nhost=$host_alias\ntarget=$target_alias\n\n# FIXME: To remove some day.\nif test \"x$host_alias\" != x; then\n  if test \"x$build_alias\" = x; then\n    cross_compiling=maybe\n  elif test \"x$build_alias\" != \"x$host_alias\"; then\n    cross_compiling=yes\n  fi\nfi\n\nac_tool_prefix=\ntest -n \"$host_alias\" && ac_tool_prefix=$host_alias-\n\ntest \"$silent\" = yes && exec 6>/dev/null\n\n\nac_pwd=`pwd` && test -n \"$ac_pwd\" &&\nac_ls_di=`ls -di .` &&\nac_pwd_ls_di=`cd \"$ac_pwd\" && ls -di .` ||\n  as_fn_error $? \"working directory cannot be determined\"\ntest \"X$ac_ls_di\" = \"X$ac_pwd_ls_di\" ||\n  as_fn_error $? \"pwd does not report name of working directory\"\n\n\n# Find the source files, if location was not specified.\nif test -z \"$srcdir\"; then\n  ac_srcdir_defaulted=yes\n  # Try the directory containing this script, then the parent directory.\n  ac_confdir=`$as_dirname -- \"$as_myself\" ||\n$as_expr X\"$as_myself\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_myself\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_myself\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_myself\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  srcdir=$ac_confdir\n  if test ! -r \"$srcdir/$ac_unique_file\"; then\n    srcdir=..\n  fi\nelse\n  ac_srcdir_defaulted=no\nfi\nif test ! -r \"$srcdir/$ac_unique_file\"; then\n  test \"$ac_srcdir_defaulted\" = yes && srcdir=\"$ac_confdir or ..\"\n  as_fn_error $? \"cannot find sources ($ac_unique_file) in $srcdir\"\nfi\nac_msg=\"sources are in $srcdir, but \\`cd $srcdir' does not work\"\nac_abs_confdir=`(\n\tcd \"$srcdir\" && test -r \"./$ac_unique_file\" || as_fn_error $? \"$ac_msg\"\n\tpwd)`\n# When building in place, set srcdir=.\nif test \"$ac_abs_confdir\" = \"$ac_pwd\"; then\n  srcdir=.\nfi\n# Remove unnecessary trailing slashes from srcdir.\n# Double slashes in file names in object file debugging info\n# mess up M-x gdb in Emacs.\ncase $srcdir in\n*/) srcdir=`expr \"X$srcdir\" : 'X\\(.*[^/]\\)' \\| \"X$srcdir\" : 'X\\(.*\\)'`;;\nesac\nfor ac_var in $ac_precious_vars; do\n  eval ac_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_env_${ac_var}_value=\\$${ac_var}\n  eval ac_cv_env_${ac_var}_set=\\${${ac_var}+set}\n  eval ac_cv_env_${ac_var}_value=\\$${ac_var}\ndone\n\n#\n# Report the --help message.\n#\nif test \"$ac_init_help\" = \"long\"; then\n  # Omit some internal or obsolete options to make the list less imposing.\n  # This message is too long to be a string in the A/UX 3.1 sh.\n  cat <<_ACEOF\n\\`configure' configures libsodium 1.0.7 to adapt to many kinds of systems.\n\nUsage: $0 [OPTION]... [VAR=VALUE]...\n\nTo assign environment variables (e.g., CC, CFLAGS...), specify them as\nVAR=VALUE.  See below for descriptions of some of the useful variables.\n\nDefaults for the options are specified in brackets.\n\nConfiguration:\n  -h, --help              display this help and exit\n      --help=short        display options specific to this package\n      --help=recursive    display the short help of all the included packages\n  -V, --version           display version information and exit\n  -q, --quiet, --silent   do not print \\`checking ...' messages\n      --cache-file=FILE   cache test results in FILE [disabled]\n  -C, --config-cache      alias for \\`--cache-file=config.cache'\n  -n, --no-create         do not create output files\n      --srcdir=DIR        find the sources in DIR [configure dir or \\`..']\n\nInstallation directories:\n  --prefix=PREFIX         install architecture-independent files in PREFIX\n                          [$ac_default_prefix]\n  --exec-prefix=EPREFIX   install architecture-dependent files in EPREFIX\n                          [PREFIX]\n\nBy default, \\`make install' will install all the files in\n\\`$ac_default_prefix/bin', \\`$ac_default_prefix/lib' etc.  You can specify\nan installation prefix other than \\`$ac_default_prefix' using \\`--prefix',\nfor instance \\`--prefix=\\$HOME'.\n\nFor better control, use the options below.\n\nFine tuning of the installation directories:\n  --bindir=DIR            user executables [EPREFIX/bin]\n  --sbindir=DIR           system admin executables [EPREFIX/sbin]\n  --libexecdir=DIR        program executables [EPREFIX/libexec]\n  --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]\n  --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]\n  --localstatedir=DIR     modifiable single-machine data [PREFIX/var]\n  --libdir=DIR            object code libraries [EPREFIX/lib]\n  --includedir=DIR        C header files [PREFIX/include]\n  --oldincludedir=DIR     C header files for non-gcc [/usr/include]\n  --datarootdir=DIR       read-only arch.-independent data root [PREFIX/share]\n  --datadir=DIR           read-only architecture-independent data [DATAROOTDIR]\n  --infodir=DIR           info documentation [DATAROOTDIR/info]\n  --localedir=DIR         locale-dependent data [DATAROOTDIR/locale]\n  --mandir=DIR            man documentation [DATAROOTDIR/man]\n  --docdir=DIR            documentation root [DATAROOTDIR/doc/libsodium]\n  --htmldir=DIR           html documentation [DOCDIR]\n  --dvidir=DIR            dvi documentation [DOCDIR]\n  --pdfdir=DIR            pdf documentation [DOCDIR]\n  --psdir=DIR             ps documentation [DOCDIR]\n_ACEOF\n\n  cat <<\\_ACEOF\n\nProgram names:\n  --program-prefix=PREFIX            prepend PREFIX to installed program names\n  --program-suffix=SUFFIX            append SUFFIX to installed program names\n  --program-transform-name=PROGRAM   run sed PROGRAM on installed program names\n\nSystem types:\n  --build=BUILD     configure for building on BUILD [guessed]\n  --host=HOST       cross-compile to build programs to run on HOST [BUILD]\n_ACEOF\nfi\n\nif test -n \"$ac_init_help\"; then\n  case $ac_init_help in\n     short | recursive ) echo \"Configuration of libsodium 1.0.7:\";;\n   esac\n  cat <<\\_ACEOF\n\nOptional Features:\n  --disable-option-checking  ignore unrecognized --enable/--with options\n  --disable-FEATURE       do not include FEATURE (same as --enable-FEATURE=no)\n  --enable-FEATURE[=ARG]  include FEATURE [ARG=yes]\n  --enable-silent-rules   less verbose build output (undo: \"make V=1\")\n  --disable-silent-rules  verbose build output (undo: \"make V=0\")\n  --enable-maintainer-mode\n                          enable make rules and dependencies not useful (and\n                          sometimes confusing) to the casual installer\n  --enable-dependency-tracking\n                          do not reject slow dependency extractors\n  --disable-dependency-tracking\n                          speeds up one-time build\n  --disable-ssp           Do not compile with -fstack-protector\n  --disable-asm           Disable assembly implementations\n  --disable-pie           Do not produce position independent executables\n  --enable-blocking-random\n                          Enable this switch only if /dev/urandom is totally\n                          broken on the target platform\n  --enable-minimal        Only compile the minimum set of functions required\n                          for the high-level API\n  --enable-debug          For maintainers only - please do not use\n  --enable-opt            Optimize for the native CPU - The resulting library\n                          will be faster but not portable\n  --enable-soname-versions\n                          enable soname versions (must be disabled for\n                          Android) (default: enabled)\n  --enable-shared[=PKGS]  build shared libraries [default=yes]\n  --enable-static[=PKGS]  build static libraries [default=yes]\n  --enable-fast-install[=PKGS]\n                          optimize for fast installation [default=yes]\n  --disable-libtool-lock  avoid locking (might break parallel builds)\n\nOptional Packages:\n  --with-PACKAGE[=ARG]    use PACKAGE [ARG=yes]\n  --without-PACKAGE       do not use PACKAGE (same as --with-PACKAGE=no)\n  --with-safecode         For maintainers only - please do not use\n  --with-pic[=PKGS]       try to use only PIC/non-PIC objects [default=use\n                          both]\n  --with-gnu-ld           assume the C compiler uses GNU ld [default=no]\n  --with-sysroot=DIR Search for dependent libraries within DIR\n                        (or the compiler's sysroot if not specified).\n\nSome influential environment variables:\n  SAFECODE_HOME\n              set to the safecode base directory\n  CC          C compiler command\n  CFLAGS      C compiler flags\n  LDFLAGS     linker flags, e.g. -L<lib dir> if you have libraries in a\n              nonstandard directory <lib dir>\n  LIBS        libraries to pass to the linker, e.g. -l<library>\n  CPPFLAGS    (Objective) C/C++ preprocessor flags, e.g. -I<include dir> if\n              you have headers in a nonstandard directory <include dir>\n  CCAS        assembler compiler command (defaults to CC)\n  CCASFLAGS   assembler compiler flags (defaults to CFLAGS)\n  CPP         C preprocessor\n  CWFLAGS     define to compilation flags for generating extra warnings\n  AR          path to the ar utility\n\nUse these variables to override the choices made by `configure' or to help\nit to find libraries and programs with nonstandard names/locations.\n\nReport bugs to <https://github.com/jedisct1/libsodium/issues>.\nlibsodium home page: <https://github.com/jedisct1/libsodium>.\n_ACEOF\nac_status=$?\nfi\n\nif test \"$ac_init_help\" = \"recursive\"; then\n  # If there are subdirs, report their specific --help.\n  for ac_dir in : $ac_subdirs_all; do test \"x$ac_dir\" = x: && continue\n    test -d \"$ac_dir\" ||\n      { cd \"$srcdir\" && ac_pwd=`pwd` && srcdir=. && test -d \"$ac_dir\"; } ||\n      continue\n    ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n    cd \"$ac_dir\" || { ac_status=$?; continue; }\n    # Check for guested configure.\n    if test -f \"$ac_srcdir/configure.gnu\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure.gnu\" --help=recursive\n    elif test -f \"$ac_srcdir/configure\"; then\n      echo &&\n      $SHELL \"$ac_srcdir/configure\" --help=recursive\n    else\n      $as_echo \"$as_me: WARNING: no configuration information is in $ac_dir\" >&2\n    fi || ac_status=$?\n    cd \"$ac_pwd\" || { ac_status=$?; break; }\n  done\nfi\n\ntest -n \"$ac_init_help\" && exit $ac_status\nif $ac_init_version; then\n  cat <<\\_ACEOF\nlibsodium configure 1.0.7\ngenerated by GNU Autoconf 2.69\n\nCopyright (C) 2012 Free Software Foundation, Inc.\nThis configure script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\n_ACEOF\n  exit\nfi\n\n## ------------------------ ##\n## Autoconf initialization. ##\n## ------------------------ ##\n\n# ac_fn_c_try_compile LINENO\n# --------------------------\n# Try to compile conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext\n  if { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest.$ac_objext; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_compile\n\n# ac_fn_c_try_cpp LINENO\n# ----------------------\n# Try to preprocess conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_cpp ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_cpp conftest.$ac_ext\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_cpp conftest.$ac_ext\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } > conftest.i && {\n\t test -z \"$ac_c_preproc_warn_flag$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n    ac_retval=1\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_cpp\n\n# ac_fn_c_check_header_mongrel LINENO HEADER VAR INCLUDES\n# -------------------------------------------------------\n# Tests whether HEADER exists, giving a warning if it cannot be compiled using\n# the include files in INCLUDES and setting the cache variable VAR\n# accordingly.\nac_fn_c_check_header_mongrel ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if eval \\${$3+:} false; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nelse\n  # Is the header compilable?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 usability\" >&5\n$as_echo_n \"checking $2 usability... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_header_compiler=yes\nelse\n  ac_header_compiler=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_compiler\" >&5\n$as_echo \"$ac_header_compiler\" >&6; }\n\n# Is the header present?\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking $2 presence\" >&5\n$as_echo_n \"checking $2 presence... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <$2>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  ac_header_preproc=yes\nelse\n  ac_header_preproc=no\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_header_preproc\" >&5\n$as_echo \"$ac_header_preproc\" >&6; }\n\n# So?  What about this header?\ncase $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in #((\n  yes:no: )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&5\n$as_echo \"$as_me: WARNING: $2: accepted by the compiler, rejected by the preprocessor!\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n    ;;\n  no:yes:* )\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: present but cannot be compiled\" >&5\n$as_echo \"$as_me: WARNING: $2: present but cannot be compiled\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     check for missing prerequisite headers?\" >&5\n$as_echo \"$as_me: WARNING: $2:     check for missing prerequisite headers?\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: see the Autoconf documentation\" >&5\n$as_echo \"$as_me: WARNING: $2: see the Autoconf documentation\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&5\n$as_echo \"$as_me: WARNING: $2:     section \\\"Present But Cannot Be Compiled\\\"\" >&2;}\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $2: proceeding with the compiler's result\" >&5\n$as_echo \"$as_me: WARNING: $2: proceeding with the compiler's result\" >&2;}\n( $as_echo \"## ----------------------------------------------------------- ##\n## Report this to https://github.com/jedisct1/libsodium/issues ##\n## ----------------------------------------------------------- ##\"\n     ) | sed \"s/^/$as_me: WARNING:     /\" >&2\n    ;;\nesac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  eval \"$3=\\$ac_header_compiler\"\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nfi\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_header_mongrel\n\n# ac_fn_c_try_run LINENO\n# ----------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded. Assumes\n# that executables *can* be run.\nac_fn_c_try_run ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && { ac_try='./conftest$ac_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: program exited with status $ac_status\" >&5\n       $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n       ac_retval=$ac_status\nfi\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_run\n\n# ac_fn_c_check_header_compile LINENO HEADER VAR INCLUDES\n# -------------------------------------------------------\n# Tests whether HEADER exists and can be compiled using the include files in\n# INCLUDES, setting the cache variable VAR accordingly.\nac_fn_c_check_header_compile ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$4\n#include <$2>\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_header_compile\n\n# ac_fn_c_try_link LINENO\n# -----------------------\n# Try to link conftest.$ac_ext, and return whether this succeeded.\nac_fn_c_try_link ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  rm -f conftest.$ac_objext conftest$ac_exeext\n  if { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    grep -v '^ *+' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n    mv -f conftest.er1 conftest.err\n  fi\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && {\n\t test -z \"$ac_c_werror_flag\" ||\n\t test ! -s conftest.err\n       } && test -s conftest$ac_exeext && {\n\t test \"$cross_compiling\" = yes ||\n\t test -x conftest$ac_exeext\n       }; then :\n  ac_retval=0\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n\tac_retval=1\nfi\n  # Delete the IPA/IPO (Inter Procedural Analysis/Optimization) information\n  # created by the PGI compiler (conftest_ipa8_conftest.oo), as it would\n  # interfere with the next link command; also delete a directory that is\n  # left behind by Apple's compiler.  We do this before executing the actions.\n  rm -rf conftest.dSYM conftest_ipa8_conftest.oo\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n  as_fn_set_status $ac_retval\n\n} # ac_fn_c_try_link\n\n# ac_fn_c_check_func LINENO FUNC VAR\n# ----------------------------------\n# Tests whether FUNC exists, setting the cache variable VAR accordingly\nac_fn_c_check_func ()\n{\n  as_lineno=${as_lineno-\"$1\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $2\" >&5\n$as_echo_n \"checking for $2... \" >&6; }\nif eval \\${$3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n/* Define $2 to an innocuous variant, in case <limits.h> declares $2.\n   For example, HP-UX 11i <limits.h> declares gettimeofday.  */\n#define $2 innocuous_$2\n\n/* System header to define __stub macros and hopefully few prototypes,\n    which can conflict with char $2 (); below.\n    Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n    <limits.h> exists even on freestanding compilers.  */\n\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\n#undef $2\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar $2 ();\n/* The GNU C library defines this for functions which it implements\n    to always fail with ENOSYS.  Some functions are actually named\n    something starting with __ and the normal name is an alias.  */\n#if defined __stub_$2 || defined __stub___$2\nchoke me\n#endif\n\nint\nmain ()\n{\nreturn $2 ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  eval \"$3=yes\"\nelse\n  eval \"$3=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nfi\neval ac_res=\\$$3\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\n  eval $as_lineno_stack; ${as_lineno_stack:+:} unset as_lineno\n\n} # ac_fn_c_check_func\ncat >config.log <<_ACEOF\nThis file contains any messages produced by compilers while\nrunning configure, to aid debugging if configure makes a mistake.\n\nIt was created by libsodium $as_me 1.0.7, which was\ngenerated by GNU Autoconf 2.69.  Invocation command line was\n\n  $ $0 $@\n\n_ACEOF\nexec 5>>config.log\n{\ncat <<_ASUNAME\n## --------- ##\n## Platform. ##\n## --------- ##\n\nhostname = `(hostname || uname -n) 2>/dev/null | sed 1q`\nuname -m = `(uname -m) 2>/dev/null || echo unknown`\nuname -r = `(uname -r) 2>/dev/null || echo unknown`\nuname -s = `(uname -s) 2>/dev/null || echo unknown`\nuname -v = `(uname -v) 2>/dev/null || echo unknown`\n\n/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown`\n/bin/uname -X     = `(/bin/uname -X) 2>/dev/null     || echo unknown`\n\n/bin/arch              = `(/bin/arch) 2>/dev/null              || echo unknown`\n/usr/bin/arch -k       = `(/usr/bin/arch -k) 2>/dev/null       || echo unknown`\n/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown`\n/usr/bin/hostinfo      = `(/usr/bin/hostinfo) 2>/dev/null      || echo unknown`\n/bin/machine           = `(/bin/machine) 2>/dev/null           || echo unknown`\n/usr/bin/oslevel       = `(/usr/bin/oslevel) 2>/dev/null       || echo unknown`\n/bin/universe          = `(/bin/universe) 2>/dev/null          || echo unknown`\n\n_ASUNAME\n\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    $as_echo \"PATH: $as_dir\"\n  done\nIFS=$as_save_IFS\n\n} >&5\n\ncat >&5 <<_ACEOF\n\n\n## ----------- ##\n## Core tests. ##\n## ----------- ##\n\n_ACEOF\n\n\n# Keep a trace of the command line.\n# Strip out --no-create and --no-recursion so they do not pile up.\n# Strip out --silent because we don't want to record it for future runs.\n# Also quote any args containing shell meta-characters.\n# Make two passes to allow for proper duplicate-argument suppression.\nac_configure_args=\nac_configure_args0=\nac_configure_args1=\nac_must_keep_next=false\nfor ac_pass in 1 2\ndo\n  for ac_arg\n  do\n    case $ac_arg in\n    -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;;\n    -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n    | -silent | --silent | --silen | --sile | --sil)\n      continue ;;\n    *\\'*)\n      ac_arg=`$as_echo \"$ac_arg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    esac\n    case $ac_pass in\n    1) as_fn_append ac_configure_args0 \" '$ac_arg'\" ;;\n    2)\n      as_fn_append ac_configure_args1 \" '$ac_arg'\"\n      if test $ac_must_keep_next = true; then\n\tac_must_keep_next=false # Got value, back to normal.\n      else\n\tcase $ac_arg in\n\t  *=* | --config-cache | -C | -disable-* | --disable-* \\\n\t  | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \\\n\t  | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \\\n\t  | -with-* | --with-* | -without-* | --without-* | --x)\n\t    case \"$ac_configure_args0 \" in\n\t      \"$ac_configure_args1\"*\" '$ac_arg' \"* ) continue ;;\n\t    esac\n\t    ;;\n\t  -* ) ac_must_keep_next=true ;;\n\tesac\n      fi\n      as_fn_append ac_configure_args \" '$ac_arg'\"\n      ;;\n    esac\n  done\ndone\n{ ac_configure_args0=; unset ac_configure_args0;}\n{ ac_configure_args1=; unset ac_configure_args1;}\n\n# When interrupted or exit'd, cleanup temporary files, and complete\n# config.log.  We remove comments because anyway the quotes in there\n# would cause problems or look ugly.\n# WARNING: Use '\\'' to represent an apostrophe within the trap.\n# WARNING: Do not start the trap code with a newline, due to a FreeBSD 4.0 bug.\ntrap 'exit_status=$?\n  # Save into config.log some information that might help in debugging.\n  {\n    echo\n\n    $as_echo \"## ---------------- ##\n## Cache variables. ##\n## ---------------- ##\"\n    echo\n    # The following way of writing the cache mishandles newlines in values,\n(\n  for ac_var in `(set) 2>&1 | sed -n '\\''s/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'\\''`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n  (set) 2>&1 |\n    case $as_nl`(ac_space='\\'' '\\''; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      sed -n \\\n\t\"s/'\\''/'\\''\\\\\\\\'\\'''\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\''\\\\2'\\''/p\"\n      ;; #(\n    *)\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n)\n    echo\n\n    $as_echo \"## ----------------- ##\n## Output variables. ##\n## ----------------- ##\"\n    echo\n    for ac_var in $ac_subst_vars\n    do\n      eval ac_val=\\$$ac_var\n      case $ac_val in\n      *\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n      esac\n      $as_echo \"$ac_var='\\''$ac_val'\\''\"\n    done | sort\n    echo\n\n    if test -n \"$ac_subst_files\"; then\n      $as_echo \"## ------------------- ##\n## File substitutions. ##\n## ------------------- ##\"\n      echo\n      for ac_var in $ac_subst_files\n      do\n\teval ac_val=\\$$ac_var\n\tcase $ac_val in\n\t*\\'\\''*) ac_val=`$as_echo \"$ac_val\" | sed \"s/'\\''/'\\''\\\\\\\\\\\\\\\\'\\'''\\''/g\"`;;\n\tesac\n\t$as_echo \"$ac_var='\\''$ac_val'\\''\"\n      done | sort\n      echo\n    fi\n\n    if test -s confdefs.h; then\n      $as_echo \"## ----------- ##\n## confdefs.h. ##\n## ----------- ##\"\n      echo\n      cat confdefs.h\n      echo\n    fi\n    test \"$ac_signal\" != 0 &&\n      $as_echo \"$as_me: caught signal $ac_signal\"\n    $as_echo \"$as_me: exit $exit_status\"\n  } >&5\n  rm -f core *.core core.conftest.* &&\n    rm -f -r conftest* confdefs* conf$$* $ac_clean_files &&\n    exit $exit_status\n' 0\nfor ac_signal in 1 2 13 15; do\n  trap 'ac_signal='$ac_signal'; as_fn_exit 1' $ac_signal\ndone\nac_signal=0\n\n# confdefs.h avoids OS command line length limits that DEFS can exceed.\nrm -f -r conftest* confdefs.h\n\n$as_echo \"/* confdefs.h */\" > confdefs.h\n\n# Predefined preprocessor variables.\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_NAME \"$PACKAGE_NAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_TARNAME \"$PACKAGE_TARNAME\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_VERSION \"$PACKAGE_VERSION\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_STRING \"$PACKAGE_STRING\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_BUGREPORT \"$PACKAGE_BUGREPORT\"\n_ACEOF\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE_URL \"$PACKAGE_URL\"\n_ACEOF\n\n\n# Let the site file select an alternate cache file if it wants to.\n# Prefer an explicitly selected file to automatically selected ones.\nac_site_file1=NONE\nac_site_file2=NONE\nif test -n \"$CONFIG_SITE\"; then\n  # We do not want a PATH search for config.site.\n  case $CONFIG_SITE in #((\n    -*)  ac_site_file1=./$CONFIG_SITE;;\n    */*) ac_site_file1=$CONFIG_SITE;;\n    *)   ac_site_file1=./$CONFIG_SITE;;\n  esac\nelif test \"x$prefix\" != xNONE; then\n  ac_site_file1=$prefix/share/config.site\n  ac_site_file2=$prefix/etc/config.site\nelse\n  ac_site_file1=$ac_default_prefix/share/config.site\n  ac_site_file2=$ac_default_prefix/etc/config.site\nfi\nfor ac_site_file in \"$ac_site_file1\" \"$ac_site_file2\"\ndo\n  test \"x$ac_site_file\" = xNONE && continue\n  if test /dev/null != \"$ac_site_file\" && test -r \"$ac_site_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading site script $ac_site_file\" >&5\n$as_echo \"$as_me: loading site script $ac_site_file\" >&6;}\n    sed 's/^/| /' \"$ac_site_file\" >&5\n    . \"$ac_site_file\" \\\n      || { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"failed to load site script $ac_site_file\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n  fi\ndone\n\nif test -r \"$cache_file\"; then\n  # Some versions of bash will fail to source /dev/null (special files\n  # actually), so we avoid doing that.  DJGPP emulates it as a regular file.\n  if test /dev/null != \"$cache_file\" && test -f \"$cache_file\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: loading cache $cache_file\" >&5\n$as_echo \"$as_me: loading cache $cache_file\" >&6;}\n    case $cache_file in\n      [\\\\/]* | ?:[\\\\/]* ) . \"$cache_file\";;\n      *)                      . \"./$cache_file\";;\n    esac\n  fi\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: creating cache $cache_file\" >&5\n$as_echo \"$as_me: creating cache $cache_file\" >&6;}\n  >$cache_file\nfi\n\n# Check that the precious variables saved in the cache have kept the same\n# value.\nac_cache_corrupted=false\nfor ac_var in $ac_precious_vars; do\n  eval ac_old_set=\\$ac_cv_env_${ac_var}_set\n  eval ac_new_set=\\$ac_env_${ac_var}_set\n  eval ac_old_val=\\$ac_cv_env_${ac_var}_value\n  eval ac_new_val=\\$ac_env_${ac_var}_value\n  case $ac_old_set,$ac_new_set in\n    set,)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was set to \\`$ac_old_val' in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,set)\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' was not set in the previous run\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' was not set in the previous run\" >&2;}\n      ac_cache_corrupted=: ;;\n    ,);;\n    *)\n      if test \"x$ac_old_val\" != \"x$ac_new_val\"; then\n\t# differences in whitespace do not lead to failure.\n\tac_old_val_w=`echo x $ac_old_val`\n\tac_new_val_w=`echo x $ac_new_val`\n\tif test \"$ac_old_val_w\" != \"$ac_new_val_w\"; then\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: \\`$ac_var' has changed since the previous run:\" >&5\n$as_echo \"$as_me: error: \\`$ac_var' has changed since the previous run:\" >&2;}\n\t  ac_cache_corrupted=:\n\telse\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&5\n$as_echo \"$as_me: warning: ignoring whitespace changes in \\`$ac_var' since the previous run:\" >&2;}\n\t  eval $ac_var=\\$ac_old_val\n\tfi\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   former value:  \\`$ac_old_val'\" >&5\n$as_echo \"$as_me:   former value:  \\`$ac_old_val'\" >&2;}\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}:   current value: \\`$ac_new_val'\" >&5\n$as_echo \"$as_me:   current value: \\`$ac_new_val'\" >&2;}\n      fi;;\n  esac\n  # Pass precious variables to config.status.\n  if test \"$ac_new_set\" = set; then\n    case $ac_new_val in\n    *\\'*) ac_arg=$ac_var=`$as_echo \"$ac_new_val\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    *) ac_arg=$ac_var=$ac_new_val ;;\n    esac\n    case \" $ac_configure_args \" in\n      *\" '$ac_arg' \"*) ;; # Avoid dups.  Use of quotes ensures accuracy.\n      *) as_fn_append ac_configure_args \" '$ac_arg'\" ;;\n    esac\n  fi\ndone\nif $ac_cache_corrupted; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: error: changes in the environment can compromise the build\" >&5\n$as_echo \"$as_me: error: changes in the environment can compromise the build\" >&2;}\n  as_fn_error $? \"run \\`make distclean' and/or \\`rm $cache_file' and start over\" \"$LINENO\" 5\nfi\n## -------------------- ##\n## Main body of script. ##\n## -------------------- ##\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\nac_aux_dir=\nfor ac_dir in build-aux \"$srcdir\"/build-aux; do\n  if test -f \"$ac_dir/install-sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install-sh -c\"\n    break\n  elif test -f \"$ac_dir/install.sh\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/install.sh -c\"\n    break\n  elif test -f \"$ac_dir/shtool\"; then\n    ac_aux_dir=$ac_dir\n    ac_install_sh=\"$ac_aux_dir/shtool install -c\"\n    break\n  fi\ndone\nif test -z \"$ac_aux_dir\"; then\n  as_fn_error $? \"cannot find install-sh, install.sh, or shtool in build-aux \\\"$srcdir\\\"/build-aux\" \"$LINENO\" 5\nfi\n\n# These three variables are undocumented and unsupported,\n# and are intended to be withdrawn in a future Autoconf release.\n# They can cause serious problems if a builder's source tree is in a directory\n# whose full name contains unusual characters.\nac_config_guess=\"$SHELL $ac_aux_dir/config.guess\"  # Please don't use this var.\nac_config_sub=\"$SHELL $ac_aux_dir/config.sub\"  # Please don't use this var.\nac_configure=\"$SHELL $ac_aux_dir/configure\"  # Please don't use this var.\n\n\n\n\n# Make sure we can run config.sub.\n$SHELL \"$ac_aux_dir/config.sub\" sun4 >/dev/null 2>&1 ||\n  as_fn_error $? \"cannot run $SHELL $ac_aux_dir/config.sub\" \"$LINENO\" 5\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking build system type\" >&5\n$as_echo_n \"checking build system type... \" >&6; }\nif ${ac_cv_build+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_build_alias=$build_alias\ntest \"x$ac_build_alias\" = x &&\n  ac_build_alias=`$SHELL \"$ac_aux_dir/config.guess\"`\ntest \"x$ac_build_alias\" = x &&\n  as_fn_error $? \"cannot guess build type; you must specify one\" \"$LINENO\" 5\nac_cv_build=`$SHELL \"$ac_aux_dir/config.sub\" $ac_build_alias` ||\n  as_fn_error $? \"$SHELL $ac_aux_dir/config.sub $ac_build_alias failed\" \"$LINENO\" 5\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_build\" >&5\n$as_echo \"$ac_cv_build\" >&6; }\ncase $ac_cv_build in\n*-*-*) ;;\n*) as_fn_error $? \"invalid value of canonical build\" \"$LINENO\" 5;;\nesac\nbuild=$ac_cv_build\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_build\nshift\nbuild_cpu=$1\nbuild_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nbuild_os=$*\nIFS=$ac_save_IFS\ncase $build_os in *\\ *) build_os=`echo \"$build_os\" | sed 's/ /-/g'`;; esac\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking host system type\" >&5\n$as_echo_n \"checking host system type... \" >&6; }\nif ${ac_cv_host+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test \"x$host_alias\" = x; then\n  ac_cv_host=$ac_cv_build\nelse\n  ac_cv_host=`$SHELL \"$ac_aux_dir/config.sub\" $host_alias` ||\n    as_fn_error $? \"$SHELL $ac_aux_dir/config.sub $host_alias failed\" \"$LINENO\" 5\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_host\" >&5\n$as_echo \"$ac_cv_host\" >&6; }\ncase $ac_cv_host in\n*-*-*) ;;\n*) as_fn_error $? \"invalid value of canonical host\" \"$LINENO\" 5;;\nesac\nhost=$ac_cv_host\nac_save_IFS=$IFS; IFS='-'\nset x $ac_cv_host\nshift\nhost_cpu=$1\nhost_vendor=$2\nshift; shift\n# Remember, the first character of IFS is used to create $*,\n# except with old shells:\nhost_os=$*\nIFS=$ac_save_IFS\ncase $host_os in *\\ *) host_os=`echo \"$host_os\" | sed 's/ /-/g'`;; esac\n\n\nam__api_version='1.14'\n\n# Find a good install program.  We prefer a C program (faster),\n# so one script is as good as another.  But avoid the broken or\n# incompatible versions:\n# SysV /etc/install, /usr/sbin/install\n# SunOS /usr/etc/install\n# IRIX /sbin/install\n# AIX /bin/install\n# AmigaOS /C/install, which installs bootblocks on floppy discs\n# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag\n# AFS /usr/afsws/bin/install, which mishandles nonexistent args\n# SVR4 /usr/ucb/install, which tries to use the nonexistent group \"staff\"\n# OS/2's system install, which has a completely different semantic\n# ./install, which can be erroneously created by make from ./install.sh.\n# Reject install programs that cannot install multiple files.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install\" >&5\n$as_echo_n \"checking for a BSD-compatible install... \" >&6; }\nif test -z \"$INSTALL\"; then\nif ${ac_cv_path_install+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    # Account for people who put trailing slashes in PATH elements.\ncase $as_dir/ in #((\n  ./ | .// | /[cC]/* | \\\n  /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \\\n  ?:[\\\\/]os2[\\\\/]install[\\\\/]* | ?:[\\\\/]OS2[\\\\/]INSTALL[\\\\/]* | \\\n  /usr/ucb/* ) ;;\n  *)\n    # OSF1 and SCO ODT 3.0 have their own names for install.\n    # Don't use installbsd from OSF since it installs stuff as root\n    # by default.\n    for ac_prog in ginstall scoinst install; do\n      for ac_exec_ext in '' $ac_executable_extensions; do\n\tif as_fn_executable_p \"$as_dir/$ac_prog$ac_exec_ext\"; then\n\t  if test $ac_prog = install &&\n\t    grep dspmsg \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # AIX install.  It has an incompatible calling convention.\n\t    :\n\t  elif test $ac_prog = install &&\n\t    grep pwplus \"$as_dir/$ac_prog$ac_exec_ext\" >/dev/null 2>&1; then\n\t    # program-specific install script used by HP pwplus--don't use.\n\t    :\n\t  else\n\t    rm -rf conftest.one conftest.two conftest.dir\n\t    echo one > conftest.one\n\t    echo two > conftest.two\n\t    mkdir conftest.dir\n\t    if \"$as_dir/$ac_prog$ac_exec_ext\" -c conftest.one conftest.two \"`pwd`/conftest.dir\" &&\n\t      test -s conftest.one && test -s conftest.two &&\n\t      test -s conftest.dir/conftest.one &&\n\t      test -s conftest.dir/conftest.two\n\t    then\n\t      ac_cv_path_install=\"$as_dir/$ac_prog$ac_exec_ext -c\"\n\t      break 3\n\t    fi\n\t  fi\n\tfi\n      done\n    done\n    ;;\nesac\n\n  done\nIFS=$as_save_IFS\n\nrm -rf conftest.one conftest.two conftest.dir\n\nfi\n  if test \"${ac_cv_path_install+set}\" = set; then\n    INSTALL=$ac_cv_path_install\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for INSTALL within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    INSTALL=$ac_install_sh\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $INSTALL\" >&5\n$as_echo \"$INSTALL\" >&6; }\n\n# Use test -z because SunOS4 sh mishandles braces in ${var-val}.\n# It thinks the first close brace ends the variable substitution.\ntest -z \"$INSTALL_PROGRAM\" && INSTALL_PROGRAM='${INSTALL}'\n\ntest -z \"$INSTALL_SCRIPT\" && INSTALL_SCRIPT='${INSTALL}'\n\ntest -z \"$INSTALL_DATA\" && INSTALL_DATA='${INSTALL} -m 644'\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether build environment is sane\" >&5\n$as_echo_n \"checking whether build environment is sane... \" >&6; }\n# Reject unsafe characters in $srcdir or the absolute working directory\n# name.  Accept space and tab only in the latter.\nam_lf='\n'\ncase `pwd` in\n  *[\\\\\\\"\\#\\$\\&\\'\\`$am_lf]*)\n    as_fn_error $? \"unsafe absolute working directory name\" \"$LINENO\" 5;;\nesac\ncase $srcdir in\n  *[\\\\\\\"\\#\\$\\&\\'\\`$am_lf\\ \\\t]*)\n    as_fn_error $? \"unsafe srcdir value: '$srcdir'\" \"$LINENO\" 5;;\nesac\n\n# Do 'set' in a subshell so we don't clobber the current shell's\n# arguments.  Must try -L first in case configure is actually a\n# symlink; some systems play weird games with the mod time of symlinks\n# (eg FreeBSD returns the mod time of the symlink's containing\n# directory).\nif (\n   am_has_slept=no\n   for am_try in 1 2; do\n     echo \"timestamp, slept: $am_has_slept\" > conftest.file\n     set X `ls -Lt \"$srcdir/configure\" conftest.file 2> /dev/null`\n     if test \"$*\" = \"X\"; then\n\t# -L didn't work.\n\tset X `ls -t \"$srcdir/configure\" conftest.file`\n     fi\n     if test \"$*\" != \"X $srcdir/configure conftest.file\" \\\n\t&& test \"$*\" != \"X conftest.file $srcdir/configure\"; then\n\n\t# If neither matched, then we have a broken ls.  This can happen\n\t# if, for instance, CONFIG_SHELL is bash and it inherits a\n\t# broken ls alias from the environment.  This has actually\n\t# happened.  Such a system could not be considered \"sane\".\n\tas_fn_error $? \"ls -t appears to fail.  Make sure there is not a broken\n  alias in your environment\" \"$LINENO\" 5\n     fi\n     if test \"$2\" = conftest.file || test $am_try -eq 2; then\n       break\n     fi\n     # Just in case.\n     sleep 1\n     am_has_slept=yes\n   done\n   test \"$2\" = conftest.file\n   )\nthen\n   # Ok.\n   :\nelse\n   as_fn_error $? \"newly created file is older than distributed files!\nCheck your system clock\" \"$LINENO\" 5\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n# If we didn't sleep, we still need to ensure time stamps of config.status and\n# generated files are strictly newer.\nam_sleep_pid=\nif grep 'slept: no' conftest.file >/dev/null 2>&1; then\n  ( sleep 1 ) &\n  am_sleep_pid=$!\nfi\n\nrm -f conftest.file\n\ntest \"$program_prefix\" != NONE &&\n  program_transform_name=\"s&^&$program_prefix&;$program_transform_name\"\n# Use a double $ so make ignores it.\ntest \"$program_suffix\" != NONE &&\n  program_transform_name=\"s&\\$&$program_suffix&;$program_transform_name\"\n# Double any \\ or $.\n# By default was `s,x,x', remove it if useless.\nac_script='s/[\\\\$]/&&/g;s/;s,x,x,$//'\nprogram_transform_name=`$as_echo \"$program_transform_name\" | sed \"$ac_script\"`\n\n# expand $ac_aux_dir to an absolute path\nam_aux_dir=`cd $ac_aux_dir && pwd`\n\nif test x\"${MISSING+set}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    MISSING=\"\\${SHELL} \\\"$am_aux_dir/missing\\\"\" ;;\n  *)\n    MISSING=\"\\${SHELL} $am_aux_dir/missing\" ;;\n  esac\nfi\n# Use eval to expand $SHELL\nif eval \"$MISSING --is-lightweight\"; then\n  am_missing_run=\"$MISSING \"\nelse\n  am_missing_run=\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: 'missing' script is too old or missing\" >&5\n$as_echo \"$as_me: WARNING: 'missing' script is too old or missing\" >&2;}\nfi\n\nif test x\"${install_sh}\" != xset; then\n  case $am_aux_dir in\n  *\\ * | *\\\t*)\n    install_sh=\"\\${SHELL} '$am_aux_dir/install-sh'\" ;;\n  *)\n    install_sh=\"\\${SHELL} $am_aux_dir/install-sh\"\n  esac\nfi\n\n# Installed binaries are usually stripped using 'strip' when the user\n# run \"make install-strip\".  However 'strip' might not be the right\n# tool to use in cross-compilation environments, therefore Automake\n# will honor the 'STRIP' environment variable to overrule this program.\nif test \"$cross_compiling\" != no; then\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}strip\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$STRIP\"; then\n  ac_cv_prog_STRIP=\"$STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_STRIP=\"${ac_tool_prefix}strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nSTRIP=$ac_cv_prog_STRIP\nif test -n \"$STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $STRIP\" >&5\n$as_echo \"$STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_STRIP\"; then\n  ac_ct_STRIP=$STRIP\n  # Extract the first word of \"strip\", so it can be a program name with args.\nset dummy strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_STRIP\"; then\n  ac_cv_prog_ac_ct_STRIP=\"$ac_ct_STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_STRIP=\"strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP\nif test -n \"$ac_ct_STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP\" >&5\n$as_echo \"$ac_ct_STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_STRIP\" = x; then\n    STRIP=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    STRIP=$ac_ct_STRIP\n  fi\nelse\n  STRIP=\"$ac_cv_prog_STRIP\"\nfi\n\nfi\nINSTALL_STRIP_PROGRAM=\"\\$(install_sh) -c -s\"\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a thread-safe mkdir -p\" >&5\n$as_echo_n \"checking for a thread-safe mkdir -p... \" >&6; }\nif test -z \"$MKDIR_P\"; then\n  if ${ac_cv_path_mkdir+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/opt/sfw/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in mkdir gmkdir; do\n\t for ac_exec_ext in '' $ac_executable_extensions; do\n\t   as_fn_executable_p \"$as_dir/$ac_prog$ac_exec_ext\" || continue\n\t   case `\"$as_dir/$ac_prog$ac_exec_ext\" --version 2>&1` in #(\n\t     'mkdir (GNU coreutils) '* | \\\n\t     'mkdir (coreutils) '* | \\\n\t     'mkdir (fileutils) '4.1*)\n\t       ac_cv_path_mkdir=$as_dir/$ac_prog$ac_exec_ext\n\t       break 3;;\n\t   esac\n\t done\n       done\n  done\nIFS=$as_save_IFS\n\nfi\n\n  test -d ./--version && rmdir ./--version\n  if test \"${ac_cv_path_mkdir+set}\" = set; then\n    MKDIR_P=\"$ac_cv_path_mkdir -p\"\n  else\n    # As a last resort, use the slow shell script.  Don't cache a\n    # value for MKDIR_P within a source directory, because that will\n    # break other packages using the cache if that directory is\n    # removed, or if the value is a relative name.\n    MKDIR_P=\"$ac_install_sh -d\"\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MKDIR_P\" >&5\n$as_echo \"$MKDIR_P\" >&6; }\n\nfor ac_prog in gawk mawk nawk awk\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_AWK+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AWK\"; then\n  ac_cv_prog_AWK=\"$AWK\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_AWK=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAWK=$ac_cv_prog_AWK\nif test -n \"$AWK\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AWK\" >&5\n$as_echo \"$AWK\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$AWK\" && break\ndone\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ${MAKE-make} sets \\$(MAKE)\" >&5\n$as_echo_n \"checking whether ${MAKE-make} sets \\$(MAKE)... \" >&6; }\nset x ${MAKE-make}\nac_make=`$as_echo \"$2\" | sed 's/+/p/g; s/[^a-zA-Z0-9_]/_/g'`\nif eval \\${ac_cv_prog_make_${ac_make}_set+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat >conftest.make <<\\_ACEOF\nSHELL = /bin/sh\nall:\n\t@echo '@@@%%%=$(MAKE)=@@@%%%'\n_ACEOF\n# GNU make sometimes prints \"make[1]: Entering ...\", which would confuse us.\ncase `${MAKE-make} -f conftest.make 2>/dev/null` in\n  *@@@%%%=?*=@@@%%%*)\n    eval ac_cv_prog_make_${ac_make}_set=yes;;\n  *)\n    eval ac_cv_prog_make_${ac_make}_set=no;;\nesac\nrm -f conftest.make\nfi\nif eval test \\$ac_cv_prog_make_${ac_make}_set = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n  SET_MAKE=\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n  SET_MAKE=\"MAKE=${MAKE-make}\"\nfi\n\nrm -rf .tst 2>/dev/null\nmkdir .tst 2>/dev/null\nif test -d .tst; then\n  am__leading_dot=.\nelse\n  am__leading_dot=_\nfi\nrmdir .tst 2>/dev/null\n\n# Check whether --enable-silent-rules was given.\nif test \"${enable_silent_rules+set}\" = set; then :\n  enableval=$enable_silent_rules;\nfi\n\ncase $enable_silent_rules in # (((\n  yes) AM_DEFAULT_VERBOSITY=0;;\n   no) AM_DEFAULT_VERBOSITY=1;;\n    *) AM_DEFAULT_VERBOSITY=1;;\nesac\nam_make=${MAKE-make}\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables\" >&5\n$as_echo_n \"checking whether $am_make supports nested variables... \" >&6; }\nif ${am_cv_make_support_nested_variables+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if $as_echo 'TRUE=$(BAR$(V))\nBAR0=false\nBAR1=true\nV=1\nam__doit:\n\t@$(TRUE)\n.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then\n  am_cv_make_support_nested_variables=yes\nelse\n  am_cv_make_support_nested_variables=no\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables\" >&5\n$as_echo \"$am_cv_make_support_nested_variables\" >&6; }\nif test $am_cv_make_support_nested_variables = yes; then\n    AM_V='$(V)'\n  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'\nelse\n  AM_V=$AM_DEFAULT_VERBOSITY\n  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY\nfi\nAM_BACKSLASH='\\'\n\nif test \"`cd $srcdir && pwd`\" != \"`pwd`\"; then\n  # Use -I$(srcdir) only when $(srcdir) != ., so that make's output\n  # is not polluted with repeated \"-I.\"\n  am__isrc=' -I$(srcdir)'\n  # test to see if srcdir already configured\n  if test -f $srcdir/config.status; then\n    as_fn_error $? \"source directory already configured; run \\\"make distclean\\\" there first\" \"$LINENO\" 5\n  fi\nfi\n\n# test whether we have cygpath\nif test -z \"$CYGPATH_W\"; then\n  if (cygpath --version) >/dev/null 2>/dev/null; then\n    CYGPATH_W='cygpath -w'\n  else\n    CYGPATH_W=echo\n  fi\nfi\n\n\n# Define the identity of the package.\n PACKAGE='libsodium'\n VERSION='1.0.7'\n\n\ncat >>confdefs.h <<_ACEOF\n#define PACKAGE \"$PACKAGE\"\n_ACEOF\n\n\ncat >>confdefs.h <<_ACEOF\n#define VERSION \"$VERSION\"\n_ACEOF\n\n# Some tools Automake needs.\n\nACLOCAL=${ACLOCAL-\"${am_missing_run}aclocal-${am__api_version}\"}\n\n\nAUTOCONF=${AUTOCONF-\"${am_missing_run}autoconf\"}\n\n\nAUTOMAKE=${AUTOMAKE-\"${am_missing_run}automake-${am__api_version}\"}\n\n\nAUTOHEADER=${AUTOHEADER-\"${am_missing_run}autoheader\"}\n\n\nMAKEINFO=${MAKEINFO-\"${am_missing_run}makeinfo\"}\n\n# For better backward compatibility.  To be removed once Automake 1.9.x\n# dies out for good.  For more background, see:\n# <http://lists.gnu.org/archive/html/automake/2012-07/msg00001.html>\n# <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>\nmkdir_p='$(MKDIR_P)'\n\n# We need awk for the \"check\" target.  The system \"awk\" is bad on\n# some platforms.\n# Always define AMTAR for backward compatibility.  Yes, it's still used\n# in the wild :-(  We should find a proper way to deprecate it ...\nAMTAR='$${TAR-tar}'\n\n\n# We'll loop over all known methods to create a tar archive until one works.\n_am_tools='gnutar plaintar pax cpio none'\n\n# The POSIX 1988 'ustar' format is defined with fixed-size fields.\n      # There is notably a 21 bits limit for the UID and the GID.  In fact,\n      # the 'pax' utility can hang on bigger UID/GID (see automake bug#8343\n      # and bug#13588).\n      am_max_uid=2097151 # 2^21 - 1\n      am_max_gid=$am_max_uid\n      # The $UID and $GID variables are not portable, so we need to resort\n      # to the POSIX-mandated id(1) utility.  Errors in the 'id' calls\n      # below are definitely unexpected, so allow the users to see them\n      # (that is, avoid stderr redirection).\n      am_uid=`id -u || echo unknown`\n      am_gid=`id -g || echo unknown`\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether UID '$am_uid' is supported by ustar format\" >&5\n$as_echo_n \"checking whether UID '$am_uid' is supported by ustar format... \" >&6; }\n      if test $am_uid -le $am_max_uid; then\n         { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n      else\n         { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n         _am_tools=none\n      fi\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether GID '$am_gid' is supported by ustar format\" >&5\n$as_echo_n \"checking whether GID '$am_gid' is supported by ustar format... \" >&6; }\n      if test $am_gid -le $am_max_gid; then\n         { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n      else\n        { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n        _am_tools=none\n      fi\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to create a ustar tar archive\" >&5\n$as_echo_n \"checking how to create a ustar tar archive... \" >&6; }\n\n  # Go ahead even if we have the value already cached.  We do so because we\n  # need to set the values for the 'am__tar' and 'am__untar' variables.\n  _am_tools=${am_cv_prog_tar_ustar-$_am_tools}\n\n  for _am_tool in $_am_tools; do\n    case $_am_tool in\n    gnutar)\n      for _am_tar in tar gnutar gtar; do\n        { echo \"$as_me:$LINENO: $_am_tar --version\" >&5\n   ($_am_tar --version) >&5 2>&5\n   ac_status=$?\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   (exit $ac_status); } && break\n      done\n      am__tar=\"$_am_tar --format=ustar -chf - \"'\"$$tardir\"'\n      am__tar_=\"$_am_tar --format=ustar -chf - \"'\"$tardir\"'\n      am__untar=\"$_am_tar -xf -\"\n      ;;\n    plaintar)\n      # Must skip GNU tar: if it does not support --format= it doesn't create\n      # ustar tarball either.\n      (tar --version) >/dev/null 2>&1 && continue\n      am__tar='tar chf - \"$$tardir\"'\n      am__tar_='tar chf - \"$tardir\"'\n      am__untar='tar xf -'\n      ;;\n    pax)\n      am__tar='pax -L -x ustar -w \"$$tardir\"'\n      am__tar_='pax -L -x ustar -w \"$tardir\"'\n      am__untar='pax -r'\n      ;;\n    cpio)\n      am__tar='find \"$$tardir\" -print | cpio -o -H ustar -L'\n      am__tar_='find \"$tardir\" -print | cpio -o -H ustar -L'\n      am__untar='cpio -i -H ustar -d'\n      ;;\n    none)\n      am__tar=false\n      am__tar_=false\n      am__untar=false\n      ;;\n    esac\n\n    # If the value was cached, stop now.  We just wanted to have am__tar\n    # and am__untar set.\n    test -n \"${am_cv_prog_tar_ustar}\" && break\n\n    # tar/untar a dummy directory, and stop if the command works.\n    rm -rf conftest.dir\n    mkdir conftest.dir\n    echo GrepMe > conftest.dir/file\n    { echo \"$as_me:$LINENO: tardir=conftest.dir && eval $am__tar_ >conftest.tar\" >&5\n   (tardir=conftest.dir && eval $am__tar_ >conftest.tar) >&5 2>&5\n   ac_status=$?\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   (exit $ac_status); }\n    rm -rf conftest.dir\n    if test -s conftest.tar; then\n      { echo \"$as_me:$LINENO: $am__untar <conftest.tar\" >&5\n   ($am__untar <conftest.tar) >&5 2>&5\n   ac_status=$?\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   (exit $ac_status); }\n      { echo \"$as_me:$LINENO: cat conftest.dir/file\" >&5\n   (cat conftest.dir/file) >&5 2>&5\n   ac_status=$?\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   (exit $ac_status); }\n      grep GrepMe conftest.dir/file >/dev/null 2>&1 && break\n    fi\n  done\n  rm -rf conftest.dir\n\n  if ${am_cv_prog_tar_ustar+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  am_cv_prog_tar_ustar=$_am_tool\nfi\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_tar_ustar\" >&5\n$as_echo \"$am_cv_prog_tar_ustar\" >&6; }\n\n\n\n\n\n\n# POSIX will say in a future version that running \"rm -f\" with no argument\n# is OK; and we want to be able to make that assumption in our Makefile\n# recipes.  So use an aggressive probe to check that the usage we want is\n# actually supported \"in the wild\" to an acceptable degree.\n# See automake bug#10828.\n# To make any issue more visible, cause the running configure to be aborted\n# by default if the 'rm' program in use doesn't match our expectations; the\n# user can still override this though.\nif rm -f && rm -fr && rm -rf; then : OK; else\n  cat >&2 <<'END'\nOops!\n\nYour 'rm' program seems unable to run without file operands specified\non the command line, even when the '-f' option is present.  This is contrary\nto the behaviour of most rm programs out there, and not conforming with\nthe upcoming POSIX standard: <http://austingroupbugs.net/view.php?id=542>\n\nPlease tell bug-automake@gnu.org about your system, including the value\nof your $PATH and any error possibly output before this message.  This\ncan help us improve future automake versions.\n\nEND\n  if test x\"$ACCEPT_INFERIOR_RM_PROGRAM\" = x\"yes\"; then\n    echo 'Configuration will proceed anyway, since you have set the' >&2\n    echo 'ACCEPT_INFERIOR_RM_PROGRAM variable to \"yes\"' >&2\n    echo >&2\n  else\n    cat >&2 <<'END'\nAborting the configuration process, to ensure you take notice of the issue.\n\nYou can download and install GNU coreutils to get an 'rm' implementation\nthat behaves properly: <http://www.gnu.org/software/coreutils/>.\n\nIf you want to complete the configuration process using your problematic\n'rm' anyway, export the environment variable ACCEPT_INFERIOR_RM_PROGRAM\nto \"yes\", and re-run configure.\n\nEND\n    as_fn_error $? \"Your 'rm' program is bad, sorry.\" \"$LINENO\" 5\n  fi\nfi\n# Check whether --enable-silent-rules was given.\nif test \"${enable_silent_rules+set}\" = set; then :\n  enableval=$enable_silent_rules;\nfi\n\ncase $enable_silent_rules in # (((\n  yes) AM_DEFAULT_VERBOSITY=0;;\n   no) AM_DEFAULT_VERBOSITY=1;;\n    *) AM_DEFAULT_VERBOSITY=0;;\nesac\nam_make=${MAKE-make}\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $am_make supports nested variables\" >&5\n$as_echo_n \"checking whether $am_make supports nested variables... \" >&6; }\nif ${am_cv_make_support_nested_variables+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if $as_echo 'TRUE=$(BAR$(V))\nBAR0=false\nBAR1=true\nV=1\nam__doit:\n\t@$(TRUE)\n.PHONY: am__doit' | $am_make -f - >/dev/null 2>&1; then\n  am_cv_make_support_nested_variables=yes\nelse\n  am_cv_make_support_nested_variables=no\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_make_support_nested_variables\" >&5\n$as_echo \"$am_cv_make_support_nested_variables\" >&6; }\nif test $am_cv_make_support_nested_variables = yes; then\n    AM_V='$(V)'\n  AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)'\nelse\n  AM_V=$AM_DEFAULT_VERBOSITY\n  AM_DEFAULT_V=$AM_DEFAULT_VERBOSITY\nfi\nAM_BACKSLASH='\\'\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to enable maintainer-specific portions of Makefiles\" >&5\n$as_echo_n \"checking whether to enable maintainer-specific portions of Makefiles... \" >&6; }\n    # Check whether --enable-maintainer-mode was given.\nif test \"${enable_maintainer_mode+set}\" = set; then :\n  enableval=$enable_maintainer_mode; USE_MAINTAINER_MODE=$enableval\nelse\n  USE_MAINTAINER_MODE=no\nfi\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $USE_MAINTAINER_MODE\" >&5\n$as_echo \"$USE_MAINTAINER_MODE\" >&6; }\n   if test $USE_MAINTAINER_MODE = yes; then\n  MAINTAINER_MODE_TRUE=\n  MAINTAINER_MODE_FALSE='#'\nelse\n  MAINTAINER_MODE_TRUE='#'\n  MAINTAINER_MODE_FALSE=\nfi\n\n  MAINT=$MAINTAINER_MODE_TRUE\n\n\n# Check whether --enable-dependency-tracking was given.\nif test \"${enable_dependency_tracking+set}\" = set; then :\n  enableval=$enable_dependency_tracking;\nfi\n\nif test \"x$enable_dependency_tracking\" != xno; then\n  am_depcomp=\"$ac_aux_dir/depcomp\"\n  AMDEPBACKSLASH='\\'\n  am__nodep='_no'\nfi\n if test \"x$enable_dependency_tracking\" != xno; then\n  AMDEP_TRUE=\n  AMDEP_FALSE='#'\nelse\n  AMDEP_TRUE='#'\n  AMDEP_FALSE=\nfi\n\n\n\n\nISODATE=`date +%Y-%m-%d`\n\n\nSODIUM_LIBRARY_VERSION_MAJOR=9\nSODIUM_LIBRARY_VERSION_MINOR=0\nDLL_VERSION=8\nSODIUM_LIBRARY_VERSION=18:0:0\n#                       | | |\n#                +------+ | +---+\n#                |        |     |\n#             current:revision:age\n#                |        |     |\n#                |        |     +- increment if interfaces have been added\n#                |        |        set to zero if interfaces have been removed\n#                |        |        or changed\n#                |        +- increment if source code has changed\n#                |           set to zero if current is incremented\n#                +- increment if interfaces have been added, removed or changed\n\n\n\n\n\nLX_CFLAGS=${CFLAGS-NONE}\n\n\nif test pwd | fgrep ' ' > /dev/null 2>&1; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: The build directory contains whitespaces - This can cause tests/installation to fail due to limitations of some libtool versions\" >&5\n$as_echo \"$as_me: WARNING: The build directory contains whitespaces - This can cause tests/installation to fail due to limitations of some libtool versions\" >&2;}\n\nfi\n\n\n# Check whether --enable-ssp was given.\nif test \"${enable_ssp+set}\" = set; then :\n  enableval=$enable_ssp;\n  if test \"x$enableval\" = \"xno\"; then :\n\n    enable_ssp=\"no\"\n\nelse\n\n    enable_ssp=\"yes\"\n\nfi\n\nelse\n\n  enable_ssp=\"yes\"\n\nfi\n\n\n# Check whether --enable-asm was given.\nif test \"${enable_asm+set}\" = set; then :\n  enableval=$enable_asm;\n  if test \"x$enableval\" = \"xno\"; then :\n\n    enable_asm=\"no\"\n\nelse\n\n    enable_asm=\"yes\"\n\nfi\n\nelse\n\n  enable_asm=\"yes\"\n\nfi\n\n\nif test \"x$EMSCRIPTEN\" != \"x\"; then :\n\n  enable_asm=\"no\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: compiling to javascript - asm implementations disabled\" >&5\n$as_echo \"$as_me: WARNING: compiling to javascript - asm implementations disabled\" >&2;}\n\nfi\n\n# Check whether --enable-pie was given.\nif test \"${enable_pie+set}\" = set; then :\n  enableval=$enable_pie; enable_pie=$enableval\nelse\n  enable_pie=\"maybe\"\nfi\n\n\ncase $host_os in #(\n  mingw*|cygwin*|msys) :\n    enable_pie=\"no\" ;; #(\n  *) :\n     ;;\nesac\n\n# Check whether --enable-blocking-random was given.\nif test \"${enable_blocking_random+set}\" = set; then :\n  enableval=$enable_blocking_random;\n  if test \"x$enableval\" = \"xyes\"; then :\n\n\n$as_echo \"#define USE_BLOCKING_RANDOM 1\" >>confdefs.h\n\n\nfi\n\nfi\n\n\n# Check whether --enable-minimal was given.\nif test \"${enable_minimal+set}\" = set; then :\n  enableval=$enable_minimal;\n  if test \"x$enableval\" = \"xyes\"; then :\n\n    enable_minimal=\"yes\"\n\nelse\n\n    enable_minimal=\"no\"\n\nfi\n\nelse\n\n  enable_minimal=\"no\"\n\nfi\n\n if test x$enable_minimal = xyes; then\n  MINIMAL_TRUE=\n  MINIMAL_FALSE='#'\nelse\n  MINIMAL_TRUE='#'\n  MINIMAL_FALSE=\nfi\n\n\n\n# Check whether --with-safecode was given.\nif test \"${with_safecode+set}\" = set; then :\n  withval=$with_safecode; if test \"x$withval\" = \"xyes\"; then :\n\n\n    : ${SAFECODE_HOME:=/opt/safecode}\n    LDFLAGS=\"$LDFLAGS -L${SAFECODE_HOME}/lib\"\n    LIBS=\"$LIBS -lsc_dbg_rt -lpoolalloc_bitmap -lstdc++\"\n    CFLAGS=\"$CFLAGS -fmemsafety\"\n\nfi\n\nfi\n\n\n# Check whether --enable-debug was given.\nif test \"${enable_debug+set}\" = set; then :\n  enableval=$enable_debug;\n  if test \"x$enableval\" = \"xyes\"; then :\n\n    if test \"x$LX_CFLAGS\" = \"xNONE\"; then :\n\n      nxflags=\"\"\n      for flag in `echo $CFLAGS`; do\n        case $flag in #(\n  -O*) :\n      ;; #(\n  -g*) :\n      ;; #(\n  *) :\n    as_fn_append nxflags \" $flag\" ;; #(\n  *) :\n     ;;\nesac\n      done\n      CFLAGS=\"$nxflags -O0 -g3\"\n\nfi\n    CPPFLAGS=\"$CPPFLAGS -DDEBUG=1\"\n\nfi\n\nfi\n\n\n# Check whether --enable-opt was given.\nif test \"${enable_opt+set}\" = set; then :\n  enableval=$enable_opt;\n  if test \"x$enableval\" = \"xyes\"; then :\n\n    CFLAGS=\"$CFLAGS -flto -march=native\"\n    LDFLAGS=\"$LDFLAGS -flto -march=native\"\nfi\n\nfi\n\n\n\n\n\nDEPDIR=\"${am__leading_dot}deps\"\n\nac_config_commands=\"$ac_config_commands depfiles\"\n\n\nam_make=${MAKE-make}\ncat > confinc << 'END'\nam__doit:\n\t@echo this is the am__doit target\n.PHONY: am__doit\nEND\n# If we don't find an include directive, just comment out the code.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for style of include used by $am_make\" >&5\n$as_echo_n \"checking for style of include used by $am_make... \" >&6; }\nam__include=\"#\"\nam__quote=\n_am_result=none\n# First try GNU make style include.\necho \"include confinc\" > confmf\n# Ignore all kinds of additional output from 'make'.\ncase `$am_make -s -f confmf 2> /dev/null` in #(\n*the\\ am__doit\\ target*)\n  am__include=include\n  am__quote=\n  _am_result=GNU\n  ;;\nesac\n# Now try BSD make style include.\nif test \"$am__include\" = \"#\"; then\n   echo '.include \"confinc\"' > confmf\n   case `$am_make -s -f confmf 2> /dev/null` in #(\n   *the\\ am__doit\\ target*)\n     am__include=.include\n     am__quote=\"\\\"\"\n     _am_result=BSD\n     ;;\n   esac\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $_am_result\" >&5\n$as_echo \"$_am_result\" >&6; }\nrm -f confinc confmf\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}gcc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_CC\"; then\n  ac_ct_CC=$CC\n  # Extract the first word of \"gcc\", so it can be a program name with args.\nset dummy gcc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"gcc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nelse\n  CC=\"$ac_cv_prog_CC\"\nfi\n\nif test -z \"$CC\"; then\n          if test -n \"$ac_tool_prefix\"; then\n    # Extract the first word of \"${ac_tool_prefix}cc\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"${ac_tool_prefix}cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  fi\nfi\nif test -z \"$CC\"; then\n  # Extract the first word of \"cc\", so it can be a program name with args.\nset dummy cc; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\n  ac_prog_rejected=no\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    if test \"$as_dir/$ac_word$ac_exec_ext\" = \"/usr/ucb/cc\"; then\n       ac_prog_rejected=yes\n       continue\n     fi\n    ac_cv_prog_CC=\"cc\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nif test $ac_prog_rejected = yes; then\n  # We found a bogon in the path, so make sure we never use it.\n  set dummy $ac_cv_prog_CC\n  shift\n  if test $# != 0; then\n    # We chose a different compiler from the bogus one.\n    # However, it has the same basename, so the bogon will be chosen\n    # first if we set CC to just the basename; use the full file name.\n    shift\n    ac_cv_prog_CC=\"$as_dir/$ac_word${1+' '}$@\"\n  fi\nfi\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$CC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in cl.exe\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$CC\"; then\n  ac_cv_prog_CC=\"$CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_CC=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nCC=$ac_cv_prog_CC\nif test -n \"$CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CC\" >&5\n$as_echo \"$CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$CC\" && break\n  done\nfi\nif test -z \"$CC\"; then\n  ac_ct_CC=$CC\n  for ac_prog in cl.exe\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_CC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_CC\"; then\n  ac_cv_prog_ac_ct_CC=\"$ac_ct_CC\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_CC=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_CC=$ac_cv_prog_ac_ct_CC\nif test -n \"$ac_ct_CC\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_CC\" >&5\n$as_echo \"$ac_ct_CC\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_CC\" && break\ndone\n\n  if test \"x$ac_ct_CC\" = x; then\n    CC=\"\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    CC=$ac_ct_CC\n  fi\nfi\n\nfi\n\n\ntest -z \"$CC\" && { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"no acceptable C compiler found in \\$PATH\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n\n# Provide some information about the compiler.\n$as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler version\" >&5\nset X $ac_compile\nac_compiler=$2\nfor ac_option in --version -v -V -qversion; do\n  { { ac_try=\"$ac_compiler $ac_option >&5\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compiler $ac_option >&5\") 2>conftest.err\n  ac_status=$?\n  if test -s conftest.err; then\n    sed '10a\\\n... rest of stderr output deleted ...\n         10q' conftest.err >conftest.er1\n    cat conftest.er1 >&5\n  fi\n  rm -f conftest.er1 conftest.err\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\ndone\n\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files a.out a.out.dSYM a.exe b.out\"\n# Try to create an executable without -o first, disregard a.out.\n# It will help us diagnose broken compilers, and finding out an intuition\n# of exeext.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the C compiler works\" >&5\n$as_echo_n \"checking whether the C compiler works... \" >&6; }\nac_link_default=`$as_echo \"$ac_link\" | sed 's/ -o *conftest[^ ]*//'`\n\n# The possible output files:\nac_files=\"a.out conftest.exe conftest a.exe a_out.exe b.out conftest.*\"\n\nac_rmfiles=\nfor ac_file in $ac_files\ndo\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    * ) ac_rmfiles=\"$ac_rmfiles $ac_file\";;\n  esac\ndone\nrm -f $ac_rmfiles\n\nif { { ac_try=\"$ac_link_default\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link_default\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # Autoconf-2.13 could set the ac_cv_exeext variable to `no'.\n# So ignore a value of `no', otherwise this would lead to `EXEEXT = no'\n# in a Makefile.  We should not override ac_cv_exeext if it was cached,\n# so that the user can short-circuit this test for compilers unknown to\n# Autoconf.\nfor ac_file in $ac_files ''\ndo\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj )\n\t;;\n    [ab].out )\n\t# We found the default executable, but exeext='' is most\n\t# certainly right.\n\tbreak;;\n    *.* )\n\tif test \"${ac_cv_exeext+set}\" = set && test \"$ac_cv_exeext\" != no;\n\tthen :; else\n\t   ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\tfi\n\t# We set ac_cv_exeext here because the later test for it is not\n\t# safe: cross compilers may not add the suffix if given an `-o'\n\t# argument, so we may need to know it at that point already.\n\t# Even if this section looks crufty: it has the advantage of\n\t# actually working.\n\tbreak;;\n    * )\n\tbreak;;\n  esac\ndone\ntest \"$ac_cv_exeext\" = no && ac_cv_exeext=\n\nelse\n  ac_file=''\nfi\nif test -z \"$ac_file\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n$as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error 77 \"C compiler cannot create executables\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for C compiler default output file name\" >&5\n$as_echo_n \"checking for C compiler default output file name... \" >&6; }\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_file\" >&5\n$as_echo \"$ac_file\" >&6; }\nac_exeext=$ac_cv_exeext\n\nrm -f -r a.out a.out.dSYM a.exe conftest$ac_cv_exeext b.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of executables\" >&5\n$as_echo_n \"checking for suffix of executables... \" >&6; }\nif { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  # If both `conftest.exe' and `conftest' are `present' (well, observable)\n# catch `conftest.exe'.  For instance with Cygwin, `ls conftest' will\n# work properly (i.e., refer to `conftest.exe'), while it won't with\n# `rm'.\nfor ac_file in conftest.exe conftest conftest.*; do\n  test -f \"$ac_file\" || continue\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM | *.o | *.obj ) ;;\n    *.* ) ac_cv_exeext=`expr \"$ac_file\" : '[^.]*\\(\\..*\\)'`\n\t  break;;\n    * ) break;;\n  esac\ndone\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of executables: cannot compile and link\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest conftest$ac_cv_exeext\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_exeext\" >&5\n$as_echo \"$ac_cv_exeext\" >&6; }\n\nrm -f conftest.$ac_ext\nEXEEXT=$ac_cv_exeext\nac_exeext=$EXEEXT\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nFILE *f = fopen (\"conftest.out\", \"w\");\n return ferror (f) || fclose (f) != 0;\n\n  ;\n  return 0;\n}\n_ACEOF\nac_clean_files=\"$ac_clean_files conftest.out\"\n# Check that the compiler produces executables we can run.  If not, either\n# the compiler is broken, or we cross compile.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are cross compiling\" >&5\n$as_echo_n \"checking whether we are cross compiling... \" >&6; }\nif test \"$cross_compiling\" != yes; then\n  { { ac_try=\"$ac_link\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_link\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n  if { ac_try='./conftest$ac_cv_exeext'\n  { { case \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_try\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; }; then\n    cross_compiling=no\n  else\n    if test \"$cross_compiling\" = maybe; then\n\tcross_compiling=yes\n    else\n\t{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot run C compiled programs.\nIf you meant to cross compile, use \\`--host'.\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\n    fi\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $cross_compiling\" >&5\n$as_echo \"$cross_compiling\" >&6; }\n\nrm -f conftest.$ac_ext conftest$ac_cv_exeext conftest.out\nac_clean_files=$ac_clean_files_save\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for suffix of object files\" >&5\n$as_echo_n \"checking for suffix of object files... \" >&6; }\nif ${ac_cv_objext+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nrm -f conftest.o conftest.obj\nif { { ac_try=\"$ac_compile\"\ncase \"(($ac_try\" in\n  *\\\"* | *\\`* | *\\\\*) ac_try_echo=\\$ac_try;;\n  *) ac_try_echo=$ac_try;;\nesac\neval ac_try_echo=\"\\\"\\$as_me:${as_lineno-$LINENO}: $ac_try_echo\\\"\"\n$as_echo \"$ac_try_echo\"; } >&5\n  (eval \"$ac_compile\") 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then :\n  for ac_file in conftest.o conftest.obj conftest.*; do\n  test -f \"$ac_file\" || continue;\n  case $ac_file in\n    *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.map | *.inf | *.dSYM ) ;;\n    *) ac_cv_objext=`expr \"$ac_file\" : '.*\\.\\(.*\\)'`\n       break;;\n  esac\ndone\nelse\n  $as_echo \"$as_me: failed program was:\" >&5\nsed 's/^/| /' conftest.$ac_ext >&5\n\n{ { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"cannot compute suffix of object files: cannot compile\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\nrm -f conftest.$ac_cv_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_objext\" >&5\n$as_echo \"$ac_cv_objext\" >&6; }\nOBJEXT=$ac_cv_objext\nac_objext=$OBJEXT\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we are using the GNU C compiler\" >&5\n$as_echo_n \"checking whether we are using the GNU C compiler... \" >&6; }\nif ${ac_cv_c_compiler_gnu+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n#ifndef __GNUC__\n       choke me\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_compiler_gnu=yes\nelse\n  ac_compiler_gnu=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nac_cv_c_compiler_gnu=$ac_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_compiler_gnu\" >&5\n$as_echo \"$ac_cv_c_compiler_gnu\" >&6; }\nif test $ac_compiler_gnu = yes; then\n  GCC=yes\nelse\n  GCC=\nfi\nac_test_CFLAGS=${CFLAGS+set}\nac_save_CFLAGS=$CFLAGS\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC accepts -g\" >&5\n$as_echo_n \"checking whether $CC accepts -g... \" >&6; }\nif ${ac_cv_prog_cc_g+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_save_c_werror_flag=$ac_c_werror_flag\n   ac_c_werror_flag=yes\n   ac_cv_prog_cc_g=no\n   CFLAGS=\"-g\"\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nelse\n  CFLAGS=\"\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\nelse\n  ac_c_werror_flag=$ac_save_c_werror_flag\n\t CFLAGS=\"-g\"\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_g=yes\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n   ac_c_werror_flag=$ac_save_c_werror_flag\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_g\" >&5\n$as_echo \"$ac_cv_prog_cc_g\" >&6; }\nif test \"$ac_test_CFLAGS\" = set; then\n  CFLAGS=$ac_save_CFLAGS\nelif test $ac_cv_prog_cc_g = yes; then\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-g -O2\"\n  else\n    CFLAGS=\"-g\"\n  fi\nelse\n  if test \"$GCC\" = yes; then\n    CFLAGS=\"-O2\"\n  else\n    CFLAGS=\n  fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C89\" >&5\n$as_echo_n \"checking for $CC option to accept ISO C89... \" >&6; }\nif ${ac_cv_prog_cc_c89+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_prog_cc_c89=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdio.h>\nstruct stat;\n/* Most of the following tests are stolen from RCS 5.7's src/conf.sh.  */\nstruct buf { int x; };\nFILE * (*rcsopen) (struct buf *, struct stat *, int);\nstatic char *e (p, i)\n     char **p;\n     int i;\n{\n  return p[i];\n}\nstatic char *f (char * (*g) (char **, int), char **p, ...)\n{\n  char *s;\n  va_list v;\n  va_start (v,p);\n  s = g (p, va_arg (v,int));\n  va_end (v);\n  return s;\n}\n\n/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default.  It has\n   function prototypes and stuff, but not '\\xHH' hex character constants.\n   These don't provoke an error unfortunately, instead are silently treated\n   as 'x'.  The following induces an error, until -std is added to get\n   proper ANSI mode.  Curiously '\\x00'!='x' always comes out true, for an\n   array size at least.  It's necessary to write '\\x00'==0 to get something\n   that's true only with -std.  */\nint osf4_cc_array ['\\x00' == 0 ? 1 : -1];\n\n/* IBM C 6 for AIX is almost-ANSI by default, but it replaces macro parameters\n   inside strings and character constants.  */\n#define FOO(x) 'x'\nint xlc6_cc_array[FOO(a) == 'x' ? 1 : -1];\n\nint test (int i, double x);\nstruct s1 {int (*f) (int a);};\nstruct s2 {int (*f) (double a);};\nint pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int);\nint argc;\nchar **argv;\nint\nmain ()\n{\nreturn f (e, argv, 0) != argv[0]  ||  f (e, argv, 1) != argv[1];\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_arg in '' -qlanglvl=extc89 -qlanglvl=ansi -std \\\n\t-Ae \"-Aa -D_HPUX_SOURCE\" \"-Xc -D__EXTENSIONS__\"\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_c89=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext\n  test \"x$ac_cv_prog_cc_c89\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\n\nfi\n# AC_CACHE_VAL\ncase \"x$ac_cv_prog_cc_c89\" in\n  x)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\n$as_echo \"none needed\" >&6; } ;;\n  xno)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\n$as_echo \"unsupported\" >&6; } ;;\n  *)\n    CC=\"$CC $ac_cv_prog_cc_c89\"\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c89\" >&5\n$as_echo \"$ac_cv_prog_cc_c89\" >&6; } ;;\nesac\nif test \"x$ac_cv_prog_cc_c89\" != xno; then :\n\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether $CC understands -c and -o together\" >&5\n$as_echo_n \"checking whether $CC understands -c and -o together... \" >&6; }\nif ${am_cv_prog_cc_c_o+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\n  # Make sure it works both with $CC and with simple cc.\n  # Following AC_PROG_CC_C_O, we do the test twice because some\n  # compilers refuse to overwrite an existing .o file with -o,\n  # though they will create one.\n  am_cv_prog_cc_c_o=yes\n  for am_i in 1 2; do\n    if { echo \"$as_me:$LINENO: $CC -c conftest.$ac_ext -o conftest2.$ac_objext\" >&5\n   ($CC -c conftest.$ac_ext -o conftest2.$ac_objext) >&5 2>&5\n   ac_status=$?\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   (exit $ac_status); } \\\n         && test -f conftest2.$ac_objext; then\n      : OK\n    else\n      am_cv_prog_cc_c_o=no\n      break\n    fi\n  done\n  rm -f core conftest*\n  unset am_i\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_prog_cc_c_o\" >&5\n$as_echo \"$am_cv_prog_cc_c_o\" >&6; }\nif test \"$am_cv_prog_cc_c_o\" != yes; then\n   # Losing compiler, so override with the script.\n   # FIXME: It is wrong to rewrite CC.\n   # But if we don't then we get into trouble of one sort or another.\n   # A longer-term fix would be to have automake use am__CC in this case,\n   # and then we could set am__CC=\"\\$(top_srcdir)/compile \\$(CC)\"\n   CC=\"$am_aux_dir/compile $CC\"\nfi\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\ndepcc=\"$CC\"   am_compiler_list=\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc\" >&5\n$as_echo_n \"checking dependency style of $depcc... \" >&6; }\nif ${am_cv_CC_dependencies_compiler_type+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named 'D' -- because '-MD' means \"put the output\n  # in D\".\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_CC_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n 's/^#*\\([a-zA-Z0-9]*\\))$/\\1/p' < ./depcomp`\n  fi\n  am__universal=false\n  case \" $depcc \" in #(\n     *\\ -arch\\ *\\ -arch\\ *) am__universal=true ;;\n     esac\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using \": > sub/conftst$i.h\" creates only sub/conftst1.h with\n      # Solaris 10 /bin/sh.\n      echo '/* dummy */' > sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with '-c' and '-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle '-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs.\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # After this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested.\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvc7 | msvc7msys | msvisualcpp | msvcmsys)\n      # This compiler won't grok '-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_CC_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_CC_dependencies_compiler_type=none\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_CC_dependencies_compiler_type\" >&5\n$as_echo \"$am_cv_CC_dependencies_compiler_type\" >&6; }\nCCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type\n\n if\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_CC_dependencies_compiler_type\" = gcc3; then\n  am__fastdepCC_TRUE=\n  am__fastdepCC_FALSE='#'\nelse\n  am__fastdepCC_TRUE='#'\n  am__fastdepCC_FALSE=\nfi\n\n\n   { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $CC option to accept ISO C99\" >&5\n$as_echo_n \"checking for $CC option to accept ISO C99... \" >&6; }\nif ${ac_cv_prog_cc_c99+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_prog_cc_c99=no\nac_save_CC=$CC\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdarg.h>\n#include <stdbool.h>\n#include <stdlib.h>\n#include <wchar.h>\n#include <stdio.h>\n\n// Check varargs macros.  These examples are taken from C99 6.10.3.5.\n#define debug(...) fprintf (stderr, __VA_ARGS__)\n#define showlist(...) puts (#__VA_ARGS__)\n#define report(test,...) ((test) ? puts (#test) : printf (__VA_ARGS__))\nstatic void\ntest_varargs_macros (void)\n{\n  int x = 1234;\n  int y = 5678;\n  debug (\"Flag\");\n  debug (\"X = %d\\n\", x);\n  showlist (The first, second, and third items.);\n  report (x>y, \"x is %d but y is %d\", x, y);\n}\n\n// Check long long types.\n#define BIG64 18446744073709551615ull\n#define BIG32 4294967295ul\n#define BIG_OK (BIG64 / BIG32 == 4294967297ull && BIG64 % BIG32 == 0)\n#if !BIG_OK\n  your preprocessor is broken;\n#endif\n#if BIG_OK\n#else\n  your preprocessor is broken;\n#endif\nstatic long long int bignum = -9223372036854775807LL;\nstatic unsigned long long int ubignum = BIG64;\n\nstruct incomplete_array\n{\n  int datasize;\n  double data[];\n};\n\nstruct named_init {\n  int number;\n  const wchar_t *name;\n  double average;\n};\n\ntypedef const char *ccp;\n\nstatic inline int\ntest_restrict (ccp restrict text)\n{\n  // See if C++-style comments work.\n  // Iterate through items via the restricted pointer.\n  // Also check for declarations in for loops.\n  for (unsigned int i = 0; *(text+i) != '\\0'; ++i)\n    continue;\n  return 0;\n}\n\n// Check varargs and va_copy.\nstatic void\ntest_varargs (const char *format, ...)\n{\n  va_list args;\n  va_start (args, format);\n  va_list args_copy;\n  va_copy (args_copy, args);\n\n  const char *str;\n  int number;\n  float fnumber;\n\n  while (*format)\n    {\n      switch (*format++)\n\t{\n\tcase 's': // string\n\t  str = va_arg (args_copy, const char *);\n\t  break;\n\tcase 'd': // int\n\t  number = va_arg (args_copy, int);\n\t  break;\n\tcase 'f': // float\n\t  fnumber = va_arg (args_copy, double);\n\t  break;\n\tdefault:\n\t  break;\n\t}\n    }\n  va_end (args_copy);\n  va_end (args);\n}\n\nint\nmain ()\n{\n\n  // Check bool.\n  _Bool success = false;\n\n  // Check restrict.\n  if (test_restrict (\"String literal\") == 0)\n    success = true;\n  char *restrict newvar = \"Another string\";\n\n  // Check varargs.\n  test_varargs (\"s, d' f .\", \"string\", 65, 34.234);\n  test_varargs_macros ();\n\n  // Check flexible array members.\n  struct incomplete_array *ia =\n    malloc (sizeof (struct incomplete_array) + (sizeof (double) * 10));\n  ia->datasize = 10;\n  for (int i = 0; i < ia->datasize; ++i)\n    ia->data[i] = i * 1.234;\n\n  // Check named initializers.\n  struct named_init ni = {\n    .number = 34,\n    .name = L\"Test wide string\",\n    .average = 543.34343,\n  };\n\n  ni.number = 58;\n\n  int dynamic_array[ni.number];\n  dynamic_array[ni.number - 1] = 543;\n\n  // work around unused variable warnings\n  return (!success || bignum == 0LL || ubignum == 0uLL || newvar[0] == 'x'\n\t  || dynamic_array[ni.number - 1] != 543);\n\n  ;\n  return 0;\n}\n_ACEOF\nfor ac_arg in '' -std=gnu99 -std=c99 -c99 -AC99 -D_STDC_C99= -qlanglvl=extc99\ndo\n  CC=\"$ac_save_CC $ac_arg\"\n  if ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_prog_cc_c99=$ac_arg\nfi\nrm -f core conftest.err conftest.$ac_objext\n  test \"x$ac_cv_prog_cc_c99\" != \"xno\" && break\ndone\nrm -f conftest.$ac_ext\nCC=$ac_save_CC\n\nfi\n# AC_CACHE_VAL\ncase \"x$ac_cv_prog_cc_c99\" in\n  x)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none needed\" >&5\n$as_echo \"none needed\" >&6; } ;;\n  xno)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: unsupported\" >&5\n$as_echo \"unsupported\" >&6; } ;;\n  *)\n    CC=\"$CC $ac_cv_prog_cc_c99\"\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_prog_cc_c99\" >&5\n$as_echo \"$ac_cv_prog_cc_c99\" >&6; } ;;\nesac\nif test \"x$ac_cv_prog_cc_c99\" != xno; then :\n\nfi\n\n\n# By default we simply use the C compiler to build assembly code.\n\ntest \"${CCAS+set}\" = set || CCAS=$CC\ntest \"${CCASFLAGS+set}\" = set || CCASFLAGS=$CFLAGS\n\n\n\ndepcc=\"$CCAS\"   am_compiler_list=\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking dependency style of $depcc\" >&5\n$as_echo_n \"checking dependency style of $depcc... \" >&6; }\nif ${am_cv_CCAS_dependencies_compiler_type+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$AMDEP_TRUE\" && test -f \"$am_depcomp\"; then\n  # We make a subdir and do the tests there.  Otherwise we can end up\n  # making bogus files that we don't know about and never remove.  For\n  # instance it was reported that on HP-UX the gcc test will end up\n  # making a dummy file named 'D' -- because '-MD' means \"put the output\n  # in D\".\n  rm -rf conftest.dir\n  mkdir conftest.dir\n  # Copy depcomp to subdir because otherwise we won't find it if we're\n  # using a relative directory.\n  cp \"$am_depcomp\" conftest.dir\n  cd conftest.dir\n  # We will build objects and dependencies in a subdirectory because\n  # it helps to detect inapplicable dependency modes.  For instance\n  # both Tru64's cc and ICC support -MD to output dependencies as a\n  # side effect of compilation, but ICC will put the dependencies in\n  # the current directory while Tru64 will put them in the object\n  # directory.\n  mkdir sub\n\n  am_cv_CCAS_dependencies_compiler_type=none\n  if test \"$am_compiler_list\" = \"\"; then\n     am_compiler_list=`sed -n 's/^#*\\([a-zA-Z0-9]*\\))$/\\1/p' < ./depcomp`\n  fi\n  am__universal=false\n\n\n  for depmode in $am_compiler_list; do\n    # Setup a source with many dependencies, because some compilers\n    # like to wrap large dependency lists on column 80 (with \\), and\n    # we should not choose a depcomp mode which is confused by this.\n    #\n    # We need to recreate these files for each test, as the compiler may\n    # overwrite some of them when testing with obscure command lines.\n    # This happens at least with the AIX C compiler.\n    : > sub/conftest.c\n    for i in 1 2 3 4 5 6; do\n      echo '#include \"conftst'$i'.h\"' >> sub/conftest.c\n      # Using \": > sub/conftst$i.h\" creates only sub/conftst1.h with\n      # Solaris 10 /bin/sh.\n      echo '/* dummy */' > sub/conftst$i.h\n    done\n    echo \"${am__include} ${am__quote}sub/conftest.Po${am__quote}\" > confmf\n\n    # We check with '-c' and '-o' for the sake of the \"dashmstdout\"\n    # mode.  It turns out that the SunPro C++ compiler does not properly\n    # handle '-M -o', and we need to detect this.  Also, some Intel\n    # versions had trouble with output in subdirs.\n    am__obj=sub/conftest.${OBJEXT-o}\n    am__minus_obj=\"-o $am__obj\"\n    case $depmode in\n    gcc)\n      # This depmode causes a compiler race in universal mode.\n      test \"$am__universal\" = false || continue\n      ;;\n    nosideeffect)\n      # After this tag, mechanisms are not by side-effect, so they'll\n      # only be used when explicitly requested.\n      if test \"x$enable_dependency_tracking\" = xyes; then\n\tcontinue\n      else\n\tbreak\n      fi\n      ;;\n    msvc7 | msvc7msys | msvisualcpp | msvcmsys)\n      # This compiler won't grok '-c -o', but also, the minuso test has\n      # not run yet.  These depmodes are late enough in the game, and\n      # so weak that their functioning should not be impacted.\n      am__obj=conftest.${OBJEXT-o}\n      am__minus_obj=\n      ;;\n    none) break ;;\n    esac\n    if depmode=$depmode \\\n       source=sub/conftest.c object=$am__obj \\\n       depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \\\n       $SHELL ./depcomp $depcc -c $am__minus_obj sub/conftest.c \\\n         >/dev/null 2>conftest.err &&\n       grep sub/conftst1.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 &&\n       grep $am__obj sub/conftest.Po > /dev/null 2>&1 &&\n       ${MAKE-make} -s -f confmf > /dev/null 2>&1; then\n      # icc doesn't choke on unknown options, it will just issue warnings\n      # or remarks (even with -Werror).  So we grep stderr for any message\n      # that says an option was ignored or not supported.\n      # When given -MP, icc 7.0 and 7.1 complain thusly:\n      #   icc: Command line warning: ignoring option '-M'; no argument required\n      # The diagnosis changed in icc 8.0:\n      #   icc: Command line remark: option '-MP' not supported\n      if (grep 'ignoring option' conftest.err ||\n          grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else\n        am_cv_CCAS_dependencies_compiler_type=$depmode\n        break\n      fi\n    fi\n  done\n\n  cd ..\n  rm -rf conftest.dir\nelse\n  am_cv_CCAS_dependencies_compiler_type=none\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $am_cv_CCAS_dependencies_compiler_type\" >&5\n$as_echo \"$am_cv_CCAS_dependencies_compiler_type\" >&6; }\nCCASDEPMODE=depmode=$am_cv_CCAS_dependencies_compiler_type\n\n if\n  test \"x$enable_dependency_tracking\" != xno \\\n  && test \"$am_cv_CCAS_dependencies_compiler_type\" = gcc3; then\n  am__fastdepCCAS_TRUE=\n  am__fastdepCCAS_FALSE='#'\nelse\n  am__fastdepCCAS_TRUE='#'\n  am__fastdepCCAS_FALSE=\nfi\n\n\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to run the C preprocessor\" >&5\n$as_echo_n \"checking how to run the C preprocessor... \" >&6; }\n# On Suns, sometimes $CPP names a directory.\nif test -n \"$CPP\" && test -d \"$CPP\"; then\n  CPP=\nfi\nif test -z \"$CPP\"; then\n  if ${ac_cv_prog_CPP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n      # Double quotes because CPP needs to be expanded\n    for CPP in \"$CC -E\" \"$CC -E -traditional-cpp\" \"/lib/cpp\"\n    do\n      ac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n  break\nfi\n\n    done\n    ac_cv_prog_CPP=$CPP\n\nfi\n  CPP=$ac_cv_prog_CPP\nelse\n  ac_cv_prog_CPP=$CPP\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $CPP\" >&5\n$as_echo \"$CPP\" >&6; }\nac_preproc_ok=false\nfor ac_c_preproc_warn_flag in '' yes\ndo\n  # Use a header file that comes with gcc, so configuring glibc\n  # with a fresh cross-compiler works.\n  # Prefer <limits.h> to <assert.h> if __STDC__ is defined, since\n  # <limits.h> exists even on freestanding compilers.\n  # On the NeXT, cc -E runs the code through the compiler's parser,\n  # not just through cpp. \"Syntax error\" is here to catch this case.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifdef __STDC__\n# include <limits.h>\n#else\n# include <assert.h>\n#endif\n\t\t     Syntax error\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n\nelse\n  # Broken: fails on valid input.\ncontinue\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\n  # OK, works on sane cases.  Now check whether nonexistent headers\n  # can be detected and how.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ac_nonexistent.h>\n_ACEOF\nif ac_fn_c_try_cpp \"$LINENO\"; then :\n  # Broken: success on invalid input.\ncontinue\nelse\n  # Passes both tests.\nac_preproc_ok=:\nbreak\nfi\nrm -f conftest.err conftest.i conftest.$ac_ext\n\ndone\n# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped.\nrm -f conftest.i conftest.err conftest.$ac_ext\nif $ac_preproc_ok; then :\n\nelse\n  { { $as_echo \"$as_me:${as_lineno-$LINENO}: error: in \\`$ac_pwd':\" >&5\n$as_echo \"$as_me: error: in \\`$ac_pwd':\" >&2;}\nas_fn_error $? \"C preprocessor \\\"$CPP\\\" fails sanity check\nSee \\`config.log' for more details\" \"$LINENO\" 5; }\nfi\n\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for grep that handles long lines and -e\" >&5\n$as_echo_n \"checking for grep that handles long lines and -e... \" >&6; }\nif ${ac_cv_path_GREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$GREP\"; then\n  ac_path_GREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in grep ggrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_GREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_GREP\" || continue\n# Check for GNU ac_path_GREP and select it if it is found.\n  # Check for GNU $ac_path_GREP\ncase `\"$ac_path_GREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_GREP=\"$ac_path_GREP\" ac_path_GREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'GREP' >> \"conftest.nl\"\n    \"$ac_path_GREP\" -e 'GREP$' -e '-(cannot match)-' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_GREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_GREP=\"$ac_path_GREP\"\n      ac_path_GREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_GREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_GREP\"; then\n    as_fn_error $? \"no acceptable grep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_GREP=$GREP\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_GREP\" >&5\n$as_echo \"$ac_cv_path_GREP\" >&6; }\n GREP=\"$ac_cv_path_GREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for egrep\" >&5\n$as_echo_n \"checking for egrep... \" >&6; }\nif ${ac_cv_path_EGREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if echo a | $GREP -E '(a|b)' >/dev/null 2>&1\n   then ac_cv_path_EGREP=\"$GREP -E\"\n   else\n     if test -z \"$EGREP\"; then\n  ac_path_EGREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in egrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_EGREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_EGREP\" || continue\n# Check for GNU ac_path_EGREP and select it if it is found.\n  # Check for GNU $ac_path_EGREP\ncase `\"$ac_path_EGREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_EGREP=\"$ac_path_EGREP\" ac_path_EGREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'EGREP' >> \"conftest.nl\"\n    \"$ac_path_EGREP\" 'EGREP$' < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_EGREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_EGREP=\"$ac_path_EGREP\"\n      ac_path_EGREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_EGREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_EGREP\"; then\n    as_fn_error $? \"no acceptable egrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_EGREP=$EGREP\nfi\n\n   fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_EGREP\" >&5\n$as_echo \"$ac_cv_path_EGREP\" >&6; }\n EGREP=\"$ac_cv_path_EGREP\"\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ANSI C header files\" >&5\n$as_echo_n \"checking for ANSI C header files... \" >&6; }\nif ${ac_cv_header_stdc+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n#include <stdarg.h>\n#include <string.h>\n#include <float.h>\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_header_stdc=yes\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nif test $ac_cv_header_stdc = yes; then\n  # SunOS 4.x string.h does not declare mem*, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <string.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"memchr\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI.\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdlib.h>\n\n_ACEOF\nif (eval \"$ac_cpp conftest.$ac_ext\") 2>&5 |\n  $EGREP \"free\" >/dev/null 2>&1; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f conftest*\n\nfi\n\nif test $ac_cv_header_stdc = yes; then\n  # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi.\n  if test \"$cross_compiling\" = yes; then :\n  :\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <ctype.h>\n#include <stdlib.h>\n#if ((' ' & 0x0FF) == 0x020)\n# define ISLOWER(c) ('a' <= (c) && (c) <= 'z')\n# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c))\n#else\n# define ISLOWER(c) \\\n\t\t   (('a' <= (c) && (c) <= 'i') \\\n\t\t     || ('j' <= (c) && (c) <= 'r') \\\n\t\t     || ('s' <= (c) && (c) <= 'z'))\n# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c))\n#endif\n\n#define XOR(e, f) (((e) && !(f)) || (!(e) && (f)))\nint\nmain ()\n{\n  int i;\n  for (i = 0; i < 256; i++)\n    if (XOR (islower (i), ISLOWER (i))\n\t|| toupper (i) != TOUPPER (i))\n      return 2;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n\nelse\n  ac_cv_header_stdc=no\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_header_stdc\" >&5\n$as_echo \"$ac_cv_header_stdc\" >&6; }\nif test $ac_cv_header_stdc = yes; then\n\n$as_echo \"#define STDC_HEADERS 1\" >>confdefs.h\n\nfi\n\n# On IRIX 5.3, sys/types and inttypes.h are conflicting.\nfor ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \\\n\t\t  inttypes.h stdint.h unistd.h\ndo :\n  as_ac_Header=`$as_echo \"ac_cv_header_$ac_header\" | $as_tr_sh`\nac_fn_c_check_header_compile \"$LINENO\" \"$ac_header\" \"$as_ac_Header\" \"$ac_includes_default\n\"\nif eval test \\\"x\\$\"$as_ac_Header\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_header\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\n\ndone\n\n\n\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"minix/config.h\" \"ac_cv_header_minix_config_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_minix_config_h\" = xyes; then :\n  MINIX=yes\nelse\n  MINIX=\nfi\n\n\n  if test \"$MINIX\" = yes; then\n\n$as_echo \"#define _POSIX_SOURCE 1\" >>confdefs.h\n\n\n$as_echo \"#define _POSIX_1_SOURCE 2\" >>confdefs.h\n\n\n$as_echo \"#define _MINIX 1\" >>confdefs.h\n\n  fi\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether it is safe to define __EXTENSIONS__\" >&5\n$as_echo_n \"checking whether it is safe to define __EXTENSIONS__... \" >&6; }\nif ${ac_cv_safe_to_define___extensions__+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#         define __EXTENSIONS__ 1\n          $ac_includes_default\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_safe_to_define___extensions__=yes\nelse\n  ac_cv_safe_to_define___extensions__=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_safe_to_define___extensions__\" >&5\n$as_echo \"$ac_cv_safe_to_define___extensions__\" >&6; }\n  test $ac_cv_safe_to_define___extensions__ = yes &&\n    $as_echo \"#define __EXTENSIONS__ 1\" >>confdefs.h\n\n  $as_echo \"#define _ALL_SOURCE 1\" >>confdefs.h\n\n  $as_echo \"#define _GNU_SOURCE 1\" >>confdefs.h\n\n  $as_echo \"#define _POSIX_PTHREAD_SEMANTICS 1\" >>confdefs.h\n\n  $as_echo \"#define _TANDEM_SOURCE 1\" >>confdefs.h\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for __native_client__ defined\" >&5\n$as_echo_n \"checking for __native_client__ defined... \" >&6; }\nif ${ac_cv_defined___native_client__+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  #ifdef __native_client__\n  int ok;\n  #else\n  choke me\n  #endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_defined___native_client__=yes\nelse\n  ac_cv_defined___native_client__=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_defined___native_client__\" >&5\n$as_echo \"$ac_cv_defined___native_client__\" >&6; }\nif test $ac_cv_defined___native_client__ != \"no\"; then :\n  NATIVECLIENT=\"yes\"\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for _FORTIFY_SOURCE defined\" >&5\n$as_echo_n \"checking for _FORTIFY_SOURCE defined... \" >&6; }\nif ${ac_cv_defined__FORTIFY_SOURCE+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  #ifdef _FORTIFY_SOURCE\n  int ok;\n  #else\n  choke me\n  #endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_defined__FORTIFY_SOURCE=yes\nelse\n  ac_cv_defined__FORTIFY_SOURCE=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_defined__FORTIFY_SOURCE\" >&5\n$as_echo \"$ac_cv_defined__FORTIFY_SOURCE\" >&6; }\nif test $ac_cv_defined__FORTIFY_SOURCE != \"no\"; then :\n\nelse\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -D_FORTIFY_SOURCE=2\" >&5\n$as_echo_n \"checking whether C compiler accepts -D_FORTIFY_SOURCE=2... \" >&6; }\nif ${ax_cv_check_cflags___D_FORTIFY_SOURCE_2+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -D_FORTIFY_SOURCE=2\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___D_FORTIFY_SOURCE_2=yes\nelse\n  ax_cv_check_cflags___D_FORTIFY_SOURCE_2=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___D_FORTIFY_SOURCE_2\" >&5\n$as_echo \"$ax_cv_check_cflags___D_FORTIFY_SOURCE_2\" >&6; }\nif test \"x$ax_cv_check_cflags___D_FORTIFY_SOURCE_2\" = xyes; then :\n  CPPFLAGS=\"$CPPFLAGS -D_FORTIFY_SOURCE=2\"\nelse\n  :\nfi\n\n\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fvisibility=hidden\" >&5\n$as_echo_n \"checking whether C compiler accepts -fvisibility=hidden... \" >&6; }\nif ${ax_cv_check_cflags___fvisibility_hidden+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -fvisibility=hidden\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___fvisibility_hidden=yes\nelse\n  ax_cv_check_cflags___fvisibility_hidden=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fvisibility_hidden\" >&5\n$as_echo \"$ax_cv_check_cflags___fvisibility_hidden\" >&6; }\nif test \"x$ax_cv_check_cflags___fvisibility_hidden\" = xyes; then :\n  CFLAGS=\"$CFLAGS -fvisibility=hidden\"\nelse\n  :\nfi\n\n\ncase $host_os in #(\n  cygwin*|mingw*|msys|pw32*|cegcc*) :\n      ;; #(\n  *) :\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fPIC\" >&5\n$as_echo_n \"checking whether C compiler accepts -fPIC... \" >&6; }\nif ${ax_cv_check_cflags___fPIC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -fPIC\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___fPIC=yes\nelse\n  ax_cv_check_cflags___fPIC=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fPIC\" >&5\n$as_echo \"$ax_cv_check_cflags___fPIC\" >&6; }\nif test \"x$ax_cv_check_cflags___fPIC\" = xyes; then :\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the linker accepts -fPIC\" >&5\n$as_echo_n \"checking whether the linker accepts -fPIC... \" >&6; }\nif ${ax_cv_check_ldflags___fPIC+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$LDFLAGS\n  LDFLAGS=\"$LDFLAGS  -fPIC\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U];if (fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ax_cv_check_ldflags___fPIC=yes\nelse\n  ax_cv_check_ldflags___fPIC=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  LDFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_ldflags___fPIC\" >&5\n$as_echo \"$ax_cv_check_ldflags___fPIC\" >&6; }\nif test \"x$ax_cv_check_ldflags___fPIC\" = xyes; then :\n  CFLAGS=\"$CFLAGS -fPIC\"\n\nelse\n  :\nfi\n\n\nelse\n  :\nfi\n\n ;;\nesac\n\nif test \"$enable_pie\" != \"no\"; then :\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fPIE\" >&5\n$as_echo_n \"checking whether C compiler accepts -fPIE... \" >&6; }\nif ${ax_cv_check_cflags___fPIE+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -fPIE\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___fPIE=yes\nelse\n  ax_cv_check_cflags___fPIE=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fPIE\" >&5\n$as_echo \"$ax_cv_check_cflags___fPIE\" >&6; }\nif test \"x$ax_cv_check_cflags___fPIE\" = xyes; then :\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the linker accepts -fPIE\" >&5\n$as_echo_n \"checking whether the linker accepts -fPIE... \" >&6; }\nif ${ax_cv_check_ldflags___fPIE+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$LDFLAGS\n  LDFLAGS=\"$LDFLAGS  -fPIE\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U];if (fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ax_cv_check_ldflags___fPIE=yes\nelse\n  ax_cv_check_ldflags___fPIE=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  LDFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_ldflags___fPIE\" >&5\n$as_echo \"$ax_cv_check_ldflags___fPIE\" >&6; }\nif test \"x$ax_cv_check_ldflags___fPIE\" = xyes; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the linker accepts -pie\" >&5\n$as_echo_n \"checking whether the linker accepts -pie... \" >&6; }\nif ${ax_cv_check_ldflags___pie+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$LDFLAGS\n  LDFLAGS=\"$LDFLAGS  -pie\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U];if (fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ax_cv_check_ldflags___pie=yes\nelse\n  ax_cv_check_ldflags___pie=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  LDFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_ldflags___pie\" >&5\n$as_echo \"$ax_cv_check_ldflags___pie\" >&6; }\nif test \"x$ax_cv_check_ldflags___pie\" = xyes; then :\n  CFLAGS=\"$CFLAGS -fPIE\"\n         LDFLAGS=\"$LDFLAGS -pie\"\nelse\n  :\nfi\n\n\nelse\n  :\nfi\n\n\nelse\n  :\nfi\n\n\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fno-strict-aliasing\" >&5\n$as_echo_n \"checking whether C compiler accepts -fno-strict-aliasing... \" >&6; }\nif ${ax_cv_check_cflags___fno_strict_aliasing+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -fno-strict-aliasing\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___fno_strict_aliasing=yes\nelse\n  ax_cv_check_cflags___fno_strict_aliasing=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fno_strict_aliasing\" >&5\n$as_echo \"$ax_cv_check_cflags___fno_strict_aliasing\" >&6; }\nif test \"x$ax_cv_check_cflags___fno_strict_aliasing\" = xyes; then :\n  CFLAGS=\"$CFLAGS -fno-strict-aliasing\"\nelse\n  :\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fno-strict-overflow\" >&5\n$as_echo_n \"checking whether C compiler accepts -fno-strict-overflow... \" >&6; }\nif ${ax_cv_check_cflags___fno_strict_overflow+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -fno-strict-overflow\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___fno_strict_overflow=yes\nelse\n  ax_cv_check_cflags___fno_strict_overflow=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fno_strict_overflow\" >&5\n$as_echo \"$ax_cv_check_cflags___fno_strict_overflow\" >&6; }\nif test \"x$ax_cv_check_cflags___fno_strict_overflow\" = xyes; then :\n  CFLAGS=\"$CFLAGS -fno-strict-overflow\"\nelse\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fwrapv\" >&5\n$as_echo_n \"checking whether C compiler accepts -fwrapv... \" >&6; }\nif ${ax_cv_check_cflags___fwrapv+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -fwrapv\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___fwrapv=yes\nelse\n  ax_cv_check_cflags___fwrapv=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fwrapv\" >&5\n$as_echo \"$ax_cv_check_cflags___fwrapv\" >&6; }\nif test \"x$ax_cv_check_cflags___fwrapv\" = xyes; then :\n  CFLAGS=\"$CFLAGS -fwrapv\"\nelse\n  :\nfi\n\n\nfi\n\n\nLIBTOOL_OLD_FLAGS=\"$LIBTOOL_EXTRA_FLAGS\"\nLIBTOOL_EXTRA_FLAGS=\"$LIBTOOL_EXTRA_FLAGS -version-info $SODIUM_LIBRARY_VERSION\"\n# Check whether --enable-soname-versions was given.\nif test \"${enable_soname_versions+set}\" = set; then :\n  enableval=$enable_soname_versions;\n        if test \"x$enableval\" = \"xno\"; then :\n\n          LIBTOOL_EXTRA_FLAGS=\"$LIBTOOL_OLD_FLAGS -avoid-version\"\n\nfi\n\n\nfi\n\n\ncase $host_os in #(\n  cygwin*|mingw*|msys|pw32*|cegcc*) :\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the linker accepts -Wl,--dynamicbase\" >&5\n$as_echo_n \"checking whether the linker accepts -Wl,--dynamicbase... \" >&6; }\nif ${ax_cv_check_ldflags___Wl___dynamicbase+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$LDFLAGS\n  LDFLAGS=\"$LDFLAGS  -Wl,--dynamicbase\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U];if (fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ax_cv_check_ldflags___Wl___dynamicbase=yes\nelse\n  ax_cv_check_ldflags___Wl___dynamicbase=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  LDFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_ldflags___Wl___dynamicbase\" >&5\n$as_echo \"$ax_cv_check_ldflags___Wl___dynamicbase\" >&6; }\nif test \"x$ax_cv_check_ldflags___Wl___dynamicbase\" = xyes; then :\n  LDFLAGS=\"$LDFLAGS -Wl,--dynamicbase\"\nelse\n  :\nfi\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the linker accepts -Wl,--nxcompat\" >&5\n$as_echo_n \"checking whether the linker accepts -Wl,--nxcompat... \" >&6; }\nif ${ax_cv_check_ldflags___Wl___nxcompat+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$LDFLAGS\n  LDFLAGS=\"$LDFLAGS  -Wl,--nxcompat\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U];if (fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ax_cv_check_ldflags___Wl___nxcompat=yes\nelse\n  ax_cv_check_ldflags___Wl___nxcompat=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  LDFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_ldflags___Wl___nxcompat\" >&5\n$as_echo \"$ax_cv_check_ldflags___Wl___nxcompat\" >&6; }\nif test \"x$ax_cv_check_ldflags___Wl___nxcompat\" = xyes; then :\n  LDFLAGS=\"$LDFLAGS -Wl,--nxcompat\"\nelse\n  :\nfi\n\n   ;; #(\n  *) :\n     ;;\nesac\n\nif test \"x$enable_ssp\" != \"xno\"; then :\n\n\ncase $host_os in #(\n  cygwin*|mingw*|msys|pw32*|cegcc*|*aix*|*sunos*|*solaris*) :\n      ;; #(\n  *) :\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -fstack-protector\" >&5\n$as_echo_n \"checking whether C compiler accepts -fstack-protector... \" >&6; }\nif ${ax_cv_check_cflags___fstack_protector+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -fstack-protector\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___fstack_protector=yes\nelse\n  ax_cv_check_cflags___fstack_protector=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___fstack_protector\" >&5\n$as_echo \"$ax_cv_check_cflags___fstack_protector\" >&6; }\nif test \"x$ax_cv_check_cflags___fstack_protector\" = xyes; then :\n\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the linker accepts -fstack-protector\" >&5\n$as_echo_n \"checking whether the linker accepts -fstack-protector... \" >&6; }\nif ${ax_cv_check_ldflags___fstack_protector+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$LDFLAGS\n  LDFLAGS=\"$LDFLAGS  -fstack-protector\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U];if (fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ax_cv_check_ldflags___fstack_protector=yes\nelse\n  ax_cv_check_ldflags___fstack_protector=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  LDFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_ldflags___fstack_protector\" >&5\n$as_echo \"$ax_cv_check_ldflags___fstack_protector\" >&6; }\nif test \"x$ax_cv_check_ldflags___fstack_protector\" = xyes; then :\n  CFLAGS=\"$CFLAGS -fstack-protector\"\n\nelse\n  :\nfi\n\n\nelse\n  :\nfi\n\n   ;; #(\n  *) :\n     ;;\nesac\n\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Winit-self\" >&5\n$as_echo_n \"checking whether C compiler accepts -Winit-self... \" >&6; }\nif ${ax_cv_check_cflags___Winit_self+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -Winit-self\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___Winit_self=yes\nelse\n  ax_cv_check_cflags___Winit_self=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___Winit_self\" >&5\n$as_echo \"$ax_cv_check_cflags___Winit_self\" >&6; }\nif test \"x$ax_cv_check_cflags___Winit_self\" = xyes; then :\n  CFLAGS=\"$CFLAGS -Winit-self\"\nelse\n  :\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wwrite-strings\" >&5\n$as_echo_n \"checking whether C compiler accepts -Wwrite-strings... \" >&6; }\nif ${ax_cv_check_cflags___Wwrite_strings+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -Wwrite-strings\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___Wwrite_strings=yes\nelse\n  ax_cv_check_cflags___Wwrite_strings=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___Wwrite_strings\" >&5\n$as_echo \"$ax_cv_check_cflags___Wwrite_strings\" >&6; }\nif test \"x$ax_cv_check_cflags___Wwrite_strings\" = xyes; then :\n  CFLAGS=\"$CFLAGS -Wwrite-strings\"\nelse\n  :\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wdiv-by-zero\" >&5\n$as_echo_n \"checking whether C compiler accepts -Wdiv-by-zero... \" >&6; }\nif ${ax_cv_check_cflags___Wdiv_by_zero+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -Wdiv-by-zero\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___Wdiv_by_zero=yes\nelse\n  ax_cv_check_cflags___Wdiv_by_zero=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___Wdiv_by_zero\" >&5\n$as_echo \"$ax_cv_check_cflags___Wdiv_by_zero\" >&6; }\nif test \"x$ax_cv_check_cflags___Wdiv_by_zero\" = xyes; then :\n  CFLAGS=\"$CFLAGS -Wdiv-by-zero\"\nelse\n  :\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -Wsometimes-uninitialized\" >&5\n$as_echo_n \"checking whether C compiler accepts -Wsometimes-uninitialized... \" >&6; }\nif ${ax_cv_check_cflags___Wsometimes_uninitialized+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -Wsometimes-uninitialized\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___Wsometimes_uninitialized=yes\nelse\n  ax_cv_check_cflags___Wsometimes_uninitialized=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___Wsometimes_uninitialized\" >&5\n$as_echo \"$ax_cv_check_cflags___Wsometimes_uninitialized\" >&6; }\nif test \"x$ax_cv_check_cflags___Wsometimes_uninitialized\" = xyes; then :\n  CFLAGS=\"$CFLAGS -Wsometimes-uninitialized\"\nelse\n  :\nfi\n\n\n\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wall\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wall\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wall... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wall\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wall\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wextra\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wextra\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wextra... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wextra\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wextra\"\nelse\n  :\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for clang\" >&5\n$as_echo_n \"checking for clang... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n#ifndef __clang__\nbe sad\n#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n   as_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wno-unknown-warning-option\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wno-unknown-warning-option\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wno-unknown-warning-option... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wno-unknown-warning-option\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wno-unknown-warning-option\"\nelse\n  :\nfi\n\n\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wbad-function-cast\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wbad-function-cast\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wbad-function-cast... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wbad-function-cast\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wbad-function-cast\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wcast-align\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wcast-align\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wcast-align... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wcast-align\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wcast-align\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wcast-qual\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wcast-qual\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wcast-qual... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wcast-qual\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wcast-qual\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wchar-subscripts\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wchar-subscripts\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wchar-subscripts... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wchar-subscripts\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wchar-subscripts\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wcomment\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wcomment\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wcomment... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wcomment\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wcomment\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wfloat-equal\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wfloat-equal\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wfloat-equal... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wfloat-equal\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wfloat-equal\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wformat=2\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wformat=2\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wformat=2... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wformat=2\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wformat=2\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wimplicit\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wimplicit\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wimplicit... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wimplicit\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wimplicit\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wmissing-declarations\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wmissing-declarations\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wmissing-declarations... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wmissing-declarations\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wmissing-declarations\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wmissing-prototypes\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wmissing-prototypes\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wmissing-prototypes... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wmissing-prototypes\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wmissing-prototypes\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wnormalized=id\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wnormalized=id\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wnormalized=id... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wnormalized=id\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wnormalized=id\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Woverride-init\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Woverride-init\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Woverride-init... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Woverride-init\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Woverride-init\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wparentheses\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wparentheses\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wparentheses... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wparentheses\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wparentheses\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wpointer-arith\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wpointer-arith\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wpointer-arith... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wpointer-arith\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wpointer-arith\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wredundant-decls\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wredundant-decls\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wredundant-decls... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wredundant-decls\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wredundant-decls\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wstrict-prototypes\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wstrict-prototypes\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wstrict-prototypes... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wstrict-prototypes\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wstrict-prototypes\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wswitch-enum\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wswitch-enum\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wswitch-enum... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wswitch-enum\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wswitch-enum\"\nelse\n  :\nfi\n\nas_CACHEVAR=`$as_echo \"ax_cv_check_cflags__$CWFLAGS -Wvariable-decl\" | $as_tr_sh`\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts $CWFLAGS -Wvariable-decl\" >&5\n$as_echo_n \"checking whether C compiler accepts $CWFLAGS -Wvariable-decl... \" >&6; }\nif eval \\${$as_CACHEVAR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  $CWFLAGS -Wvariable-decl\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  eval \"$as_CACHEVAR=yes\"\nelse\n  eval \"$as_CACHEVAR=no\"\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\neval ac_res=\\$$as_CACHEVAR\n\t       { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_res\" >&5\n$as_echo \"$ac_res\" >&6; }\nif eval test \\\"x\\$\"$as_CACHEVAR\"\\\" = x\"yes\"; then :\n  CWFLAGS=\"$CWFLAGS -Wvariable-decl\"\nelse\n  :\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the linker accepts -Wl,-z,relro\" >&5\n$as_echo_n \"checking whether the linker accepts -Wl,-z,relro... \" >&6; }\nif ${ax_cv_check_ldflags___Wl__z_relro+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$LDFLAGS\n  LDFLAGS=\"$LDFLAGS  -Wl,-z,relro\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U];if (fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ax_cv_check_ldflags___Wl__z_relro=yes\nelse\n  ax_cv_check_ldflags___Wl__z_relro=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  LDFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_ldflags___Wl__z_relro\" >&5\n$as_echo \"$ax_cv_check_ldflags___Wl__z_relro\" >&6; }\nif test \"x$ax_cv_check_ldflags___Wl__z_relro\" = xyes; then :\n  LDFLAGS=\"$LDFLAGS -Wl,-z,relro\"\nelse\n  :\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the linker accepts -Wl,-z,now\" >&5\n$as_echo_n \"checking whether the linker accepts -Wl,-z,now... \" >&6; }\nif ${ax_cv_check_ldflags___Wl__z_now+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$LDFLAGS\n  LDFLAGS=\"$LDFLAGS  -Wl,-z,now\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U];if (fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ax_cv_check_ldflags___Wl__z_now=yes\nelse\n  ax_cv_check_ldflags___Wl__z_now=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  LDFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_ldflags___Wl__z_now\" >&5\n$as_echo \"$ax_cv_check_ldflags___Wl__z_now\" >&6; }\nif test \"x$ax_cv_check_ldflags___Wl__z_now\" = xyes; then :\n  LDFLAGS=\"$LDFLAGS -Wl,-z,now\"\nelse\n  :\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the linker accepts -Wl,-z,noexecstack\" >&5\n$as_echo_n \"checking whether the linker accepts -Wl,-z,noexecstack... \" >&6; }\nif ${ax_cv_check_ldflags___Wl__z_noexecstack+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$LDFLAGS\n  LDFLAGS=\"$LDFLAGS  -Wl,-z,noexecstack\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U];if (fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ax_cv_check_ldflags___Wl__z_noexecstack=yes\nelse\n  ax_cv_check_ldflags___Wl__z_noexecstack=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  LDFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_ldflags___Wl__z_noexecstack\" >&5\n$as_echo \"$ax_cv_check_ldflags___Wl__z_noexecstack\" >&6; }\nif test \"x$ax_cv_check_ldflags___Wl__z_noexecstack\" = xyes; then :\n  LDFLAGS=\"$LDFLAGS -Wl,-z,noexecstack\"\nelse\n  :\nfi\n\n\ncase `pwd` in\n  *\\ * | *\\\t*)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: Libtool does not cope well with whitespace in \\`pwd\\`\" >&5\n$as_echo \"$as_me: WARNING: Libtool does not cope well with whitespace in \\`pwd\\`\" >&2;} ;;\nesac\n\n\n\nmacro_version='2.4.2'\nmacro_revision='1.3337'\n\n\n\n\n\n\n\n\n\n\n\n\n\nltmain=\"$ac_aux_dir/ltmain.sh\"\n\n# Backslashify metacharacters that are still active within\n# double-quoted strings.\nsed_quote_subst='s/\\([\"`$\\\\]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([\"`\\\\]\\)/\\\\\\1/g'\n\n# Sed substitution to delay expansion of an escaped shell variable in a\n# double_quote_subst'ed string.\ndelay_variable_subst='s/\\\\\\\\\\\\\\\\\\\\\\$/\\\\\\\\\\\\$/g'\n\n# Sed substitution to delay expansion of an escaped single quote.\ndelay_single_quote_subst='s/'\\''/'\\'\\\\\\\\\\\\\\'\\''/g'\n\n# Sed substitution to avoid accidental globbing in evaled expressions\nno_glob_subst='s/\\*/\\\\\\*/g'\n\nECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nECHO=$ECHO$ECHO$ECHO$ECHO$ECHO\nECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to print strings\" >&5\n$as_echo_n \"checking how to print strings... \" >&6; }\n# Test print first, because it will be a builtin if present.\nif test \"X`( print -r -- -n ) 2>/dev/null`\" = X-n && \\\n   test \"X`print -r -- $ECHO 2>/dev/null`\" = \"X$ECHO\"; then\n  ECHO='print -r --'\nelif test \"X`printf %s $ECHO 2>/dev/null`\" = \"X$ECHO\"; then\n  ECHO='printf %s\\n'\nelse\n  # Use this function as a fallback that always works.\n  func_fallback_echo ()\n  {\n    eval 'cat <<_LTECHO_EOF\n$1\n_LTECHO_EOF'\n  }\n  ECHO='func_fallback_echo'\nfi\n\n# func_echo_all arg...\n# Invoke $ECHO with all args, space-separated.\nfunc_echo_all ()\n{\n    $ECHO \"\"\n}\n\ncase \"$ECHO\" in\n  printf*) { $as_echo \"$as_me:${as_lineno-$LINENO}: result: printf\" >&5\n$as_echo \"printf\" >&6; } ;;\n  print*) { $as_echo \"$as_me:${as_lineno-$LINENO}: result: print -r\" >&5\n$as_echo \"print -r\" >&6; } ;;\n  *) { $as_echo \"$as_me:${as_lineno-$LINENO}: result: cat\" >&5\n$as_echo \"cat\" >&6; } ;;\nesac\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for a sed that does not truncate output\" >&5\n$as_echo_n \"checking for a sed that does not truncate output... \" >&6; }\nif ${ac_cv_path_SED+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n            ac_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/\n     for ac_i in 1 2 3 4 5 6 7; do\n       ac_script=\"$ac_script$as_nl$ac_script\"\n     done\n     echo \"$ac_script\" 2>/dev/null | sed 99q >conftest.sed\n     { ac_script=; unset ac_script;}\n     if test -z \"$SED\"; then\n  ac_path_SED_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in sed gsed; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_SED=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_SED\" || continue\n# Check for GNU ac_path_SED and select it if it is found.\n  # Check for GNU $ac_path_SED\ncase `\"$ac_path_SED\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_SED=\"$ac_path_SED\" ac_path_SED_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo '' >> \"conftest.nl\"\n    \"$ac_path_SED\" -f conftest.sed < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_SED_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_SED=\"$ac_path_SED\"\n      ac_path_SED_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_SED_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_SED\"; then\n    as_fn_error $? \"no acceptable sed could be found in \\$PATH\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_SED=$SED\nfi\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_SED\" >&5\n$as_echo \"$ac_cv_path_SED\" >&6; }\n SED=\"$ac_cv_path_SED\"\n  rm -f conftest.sed\n\ntest -z \"$SED\" && SED=sed\nXsed=\"$SED -e 1s/^X//\"\n\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for fgrep\" >&5\n$as_echo_n \"checking for fgrep... \" >&6; }\nif ${ac_cv_path_FGREP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if echo 'ab*c' | $GREP -F 'ab*c' >/dev/null 2>&1\n   then ac_cv_path_FGREP=\"$GREP -F\"\n   else\n     if test -z \"$FGREP\"; then\n  ac_path_FGREP_found=false\n  # Loop through the user's path and test for each of PROGNAME-LIST\n  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH$PATH_SEPARATOR/usr/xpg4/bin\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_prog in fgrep; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      ac_path_FGREP=\"$as_dir/$ac_prog$ac_exec_ext\"\n      as_fn_executable_p \"$ac_path_FGREP\" || continue\n# Check for GNU ac_path_FGREP and select it if it is found.\n  # Check for GNU $ac_path_FGREP\ncase `\"$ac_path_FGREP\" --version 2>&1` in\n*GNU*)\n  ac_cv_path_FGREP=\"$ac_path_FGREP\" ac_path_FGREP_found=:;;\n*)\n  ac_count=0\n  $as_echo_n 0123456789 >\"conftest.in\"\n  while :\n  do\n    cat \"conftest.in\" \"conftest.in\" >\"conftest.tmp\"\n    mv \"conftest.tmp\" \"conftest.in\"\n    cp \"conftest.in\" \"conftest.nl\"\n    $as_echo 'FGREP' >> \"conftest.nl\"\n    \"$ac_path_FGREP\" FGREP < \"conftest.nl\" >\"conftest.out\" 2>/dev/null || break\n    diff \"conftest.out\" \"conftest.nl\" >/dev/null 2>&1 || break\n    as_fn_arith $ac_count + 1 && ac_count=$as_val\n    if test $ac_count -gt ${ac_path_FGREP_max-0}; then\n      # Best one so far, save it but keep looking for a better one\n      ac_cv_path_FGREP=\"$ac_path_FGREP\"\n      ac_path_FGREP_max=$ac_count\n    fi\n    # 10*(2^10) chars as input seems more than enough\n    test $ac_count -gt 10 && break\n  done\n  rm -f conftest.in conftest.tmp conftest.nl conftest.out;;\nesac\n\n      $ac_path_FGREP_found && break 3\n    done\n  done\n  done\nIFS=$as_save_IFS\n  if test -z \"$ac_cv_path_FGREP\"; then\n    as_fn_error $? \"no acceptable fgrep could be found in $PATH$PATH_SEPARATOR/usr/xpg4/bin\" \"$LINENO\" 5\n  fi\nelse\n  ac_cv_path_FGREP=$FGREP\nfi\n\n   fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_path_FGREP\" >&5\n$as_echo \"$ac_cv_path_FGREP\" >&6; }\n FGREP=\"$ac_cv_path_FGREP\"\n\n\ntest -z \"$GREP\" && GREP=grep\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n# Check whether --with-gnu-ld was given.\nif test \"${with_gnu_ld+set}\" = set; then :\n  withval=$with_gnu_ld; test \"$withval\" = no || with_gnu_ld=yes\nelse\n  with_gnu_ld=no\nfi\n\nac_prog=ld\nif test \"$GCC\" = yes; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ld used by $CC\" >&5\n$as_echo_n \"checking for ld used by $CC... \" >&6; }\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [\\\\/]* | ?:[\\\\/]*)\n      re_direlt='/[^/][^/]*/\\.\\./'\n      # Canonicalize the pathname of ld\n      ac_prog=`$ECHO \"$ac_prog\"| $SED 's%\\\\\\\\%/%g'`\n      while $ECHO \"$ac_prog\" | $GREP \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`$ECHO $ac_prog| $SED \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=\"$ac_prog\"\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test \"$with_gnu_ld\" = yes; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for GNU ld\" >&5\n$as_echo_n \"checking for GNU ld... \" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for non-GNU ld\" >&5\n$as_echo_n \"checking for non-GNU ld... \" >&6; }\nfi\nif ${lt_cv_path_LD+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -z \"$LD\"; then\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      lt_cv_path_LD=\"$ac_dir/$ac_prog\"\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some variants of GNU ld only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      case `\"$lt_cv_path_LD\" -v 2>&1 </dev/null` in\n      *GNU* | *'with BFD'*)\n\ttest \"$with_gnu_ld\" != no && break\n\t;;\n      *)\n\ttest \"$with_gnu_ld\" != yes && break\n\t;;\n      esac\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\nelse\n  lt_cv_path_LD=\"$LD\" # Let the user override the test with a path.\nfi\nfi\n\nLD=\"$lt_cv_path_LD\"\nif test -n \"$LD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LD\" >&5\n$as_echo \"$LD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\ntest -z \"$LD\" && as_fn_error $? \"no acceptable ld found in \\$PATH\" \"$LINENO\" 5\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if the linker ($LD) is GNU ld\" >&5\n$as_echo_n \"checking if the linker ($LD) is GNU ld... \" >&6; }\nif ${lt_cv_prog_gnu_ld+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  # I'd rather use --version here, but apparently some GNU lds only accept -v.\ncase `$LD -v 2>&1 </dev/null` in\n*GNU* | *'with BFD'*)\n  lt_cv_prog_gnu_ld=yes\n  ;;\n*)\n  lt_cv_prog_gnu_ld=no\n  ;;\nesac\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_gnu_ld\" >&5\n$as_echo \"$lt_cv_prog_gnu_ld\" >&6; }\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for BSD- or MS-compatible name lister (nm)\" >&5\n$as_echo_n \"checking for BSD- or MS-compatible name lister (nm)... \" >&6; }\nif ${lt_cv_path_NM+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$NM\"; then\n  # Let the user override the test.\n  lt_cv_path_NM=\"$NM\"\nelse\n  lt_nm_to_check=\"${ac_tool_prefix}nm\"\n  if test -n \"$ac_tool_prefix\" && test \"$build\" = \"$host\"; then\n    lt_nm_to_check=\"$lt_nm_to_check nm\"\n  fi\n  for lt_tmp_nm in $lt_nm_to_check; do\n    lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do\n      IFS=\"$lt_save_ifs\"\n      test -z \"$ac_dir\" && ac_dir=.\n      tmp_nm=\"$ac_dir/$lt_tmp_nm\"\n      if test -f \"$tmp_nm\" || test -f \"$tmp_nm$ac_exeext\" ; then\n\t# Check to see if the nm accepts a BSD-compat flag.\n\t# Adding the `sed 1q' prevents false positives on HP-UX, which says:\n\t#   nm: unknown option \"B\" ignored\n\t# Tru64's nm complains that /dev/null is an invalid object file\n\tcase `\"$tmp_nm\" -B /dev/null 2>&1 | sed '1q'` in\n\t*/dev/null* | *'Invalid file or object type'*)\n\t  lt_cv_path_NM=\"$tmp_nm -B\"\n\t  break\n\t  ;;\n\t*)\n\t  case `\"$tmp_nm\" -p /dev/null 2>&1 | sed '1q'` in\n\t  */dev/null*)\n\t    lt_cv_path_NM=\"$tmp_nm -p\"\n\t    break\n\t    ;;\n\t  *)\n\t    lt_cv_path_NM=${lt_cv_path_NM=\"$tmp_nm\"} # keep the first match, but\n\t    continue # so that we can try to find one that supports BSD flags\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n      fi\n    done\n    IFS=\"$lt_save_ifs\"\n  done\n  : ${lt_cv_path_NM=no}\nfi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_NM\" >&5\n$as_echo \"$lt_cv_path_NM\" >&6; }\nif test \"$lt_cv_path_NM\" != \"no\"; then\n  NM=\"$lt_cv_path_NM\"\nelse\n  # Didn't find any BSD compatible name lister, look for dumpbin.\n  if test -n \"$DUMPBIN\"; then :\n    # Let the user override the test.\n  else\n    if test -n \"$ac_tool_prefix\"; then\n  for ac_prog in dumpbin \"link -dump\"\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_DUMPBIN+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DUMPBIN\"; then\n  ac_cv_prog_DUMPBIN=\"$DUMPBIN\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_DUMPBIN=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDUMPBIN=$ac_cv_prog_DUMPBIN\nif test -n \"$DUMPBIN\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DUMPBIN\" >&5\n$as_echo \"$DUMPBIN\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$DUMPBIN\" && break\n  done\nfi\nif test -z \"$DUMPBIN\"; then\n  ac_ct_DUMPBIN=$DUMPBIN\n  for ac_prog in dumpbin \"link -dump\"\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_DUMPBIN+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DUMPBIN\"; then\n  ac_cv_prog_ac_ct_DUMPBIN=\"$ac_ct_DUMPBIN\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_DUMPBIN=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DUMPBIN=$ac_cv_prog_ac_ct_DUMPBIN\nif test -n \"$ac_ct_DUMPBIN\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DUMPBIN\" >&5\n$as_echo \"$ac_ct_DUMPBIN\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_DUMPBIN\" && break\ndone\n\n  if test \"x$ac_ct_DUMPBIN\" = x; then\n    DUMPBIN=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DUMPBIN=$ac_ct_DUMPBIN\n  fi\nfi\n\n    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in\n    *COFF*)\n      DUMPBIN=\"$DUMPBIN -symbols\"\n      ;;\n    *)\n      DUMPBIN=:\n      ;;\n    esac\n  fi\n\n  if test \"$DUMPBIN\" != \":\"; then\n    NM=\"$DUMPBIN\"\n  fi\nfi\ntest -z \"$NM\" && NM=nm\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking the name lister ($NM) interface\" >&5\n$as_echo_n \"checking the name lister ($NM) interface... \" >&6; }\nif ${lt_cv_nm_interface+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_nm_interface=\"BSD nm\"\n  echo \"int some_variable = 0;\" > conftest.$ac_ext\n  (eval echo \"\\\"\\$as_me:$LINENO: $ac_compile\\\"\" >&5)\n  (eval \"$ac_compile\" 2>conftest.err)\n  cat conftest.err >&5\n  (eval echo \"\\\"\\$as_me:$LINENO: $NM \\\\\\\"conftest.$ac_objext\\\\\\\"\\\"\" >&5)\n  (eval \"$NM \\\"conftest.$ac_objext\\\"\" 2>conftest.err > conftest.out)\n  cat conftest.err >&5\n  (eval echo \"\\\"\\$as_me:$LINENO: output\\\"\" >&5)\n  cat conftest.out >&5\n  if $GREP 'External.*some_variable' conftest.out > /dev/null; then\n    lt_cv_nm_interface=\"MS dumpbin\"\n  fi\n  rm -f conftest*\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_nm_interface\" >&5\n$as_echo \"$lt_cv_nm_interface\" >&6; }\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether ln -s works\" >&5\n$as_echo_n \"checking whether ln -s works... \" >&6; }\nLN_S=$as_ln_s\nif test \"$LN_S\" = \"ln -s\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no, using $LN_S\" >&5\n$as_echo \"no, using $LN_S\" >&6; }\nfi\n\n# find the maximum length of command line arguments\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking the maximum length of command line arguments\" >&5\n$as_echo_n \"checking the maximum length of command line arguments... \" >&6; }\nif ${lt_cv_sys_max_cmd_len+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n    i=0\n  teststring=\"ABCD\"\n\n  case $build_os in\n  msdosdjgpp*)\n    # On DJGPP, this test can blow up pretty badly due to problems in libc\n    # (any single argument exceeding 2000 bytes causes a buffer overrun\n    # during glob expansion).  Even if it were fixed, the result of this\n    # check would be larger than it should be.\n    lt_cv_sys_max_cmd_len=12288;    # 12K is about right\n    ;;\n\n  gnu*)\n    # Under GNU Hurd, this test is not required because there is\n    # no limit to the length of command line arguments.\n    # Libtool will interpret -1 as no limit whatsoever\n    lt_cv_sys_max_cmd_len=-1;\n    ;;\n\n  cygwin* | mingw* | cegcc*)\n    # On Win9x/ME, this test blows up -- it succeeds, but takes\n    # about 5 minutes as the teststring grows exponentially.\n    # Worse, since 9x/ME are not pre-emptively multitasking,\n    # you end up with a \"frozen\" computer, even though with patience\n    # the test eventually succeeds (with a max line length of 256k).\n    # Instead, let's just punt: use the minimum linelength reported by\n    # all of the supported platforms: 8192 (on NT/2K/XP).\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  mint*)\n    # On MiNT this can take a long time and run out of memory.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  amigaos*)\n    # On AmigaOS with pdksh, this test takes hours, literally.\n    # So we just punt and use a minimum line length of 8192.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)\n    # This has been around since 386BSD, at least.  Likely further.\n    if test -x /sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`\n    elif test -x /usr/sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`\n    else\n      lt_cv_sys_max_cmd_len=65536\t# usable default for all BSDs\n    fi\n    # And add a safety zone\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    ;;\n\n  interix*)\n    # We know the value 262144 and hardcode it with a safety zone (like BSD)\n    lt_cv_sys_max_cmd_len=196608\n    ;;\n\n  os2*)\n    # The test takes a long time on OS/2.\n    lt_cv_sys_max_cmd_len=8192\n    ;;\n\n  osf*)\n    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure\n    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not\n    # nice to cause kernel panics so lets avoid the loop below.\n    # First set a reasonable default.\n    lt_cv_sys_max_cmd_len=16384\n    #\n    if test -x /sbin/sysconfig; then\n      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in\n        *1*) lt_cv_sys_max_cmd_len=-1 ;;\n      esac\n    fi\n    ;;\n  sco3.2v5*)\n    lt_cv_sys_max_cmd_len=102400\n    ;;\n  sysv5* | sco5v6* | sysv4.2uw2*)\n    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`\n    if test -n \"$kargmax\"; then\n      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[\t ]//'`\n    else\n      lt_cv_sys_max_cmd_len=32768\n    fi\n    ;;\n  *)\n    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`\n    if test -n \"$lt_cv_sys_max_cmd_len\" && \\\n\ttest undefined != \"$lt_cv_sys_max_cmd_len\"; then\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    else\n      # Make teststring a little bigger before we do anything with it.\n      # a 1K string should be a reasonable start.\n      for i in 1 2 3 4 5 6 7 8 ; do\n        teststring=$teststring$teststring\n      done\n      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}\n      # If test is not a shell built-in, we'll probably end up computing a\n      # maximum length that is only half of the actual maximum length, but\n      # we can't tell.\n      while { test \"X\"`env echo \"$teststring$teststring\" 2>/dev/null` \\\n\t         = \"X$teststring$teststring\"; } >/dev/null 2>&1 &&\n\t      test $i != 17 # 1/2 MB should be enough\n      do\n        i=`expr $i + 1`\n        teststring=$teststring$teststring\n      done\n      # Only check the string length outside the loop.\n      lt_cv_sys_max_cmd_len=`expr \"X$teststring\" : \".*\" 2>&1`\n      teststring=\n      # Add a significant safety factor because C++ compilers can tack on\n      # massive amounts of additional arguments before passing them to the\n      # linker.  It appears as though 1/2 is a usable value.\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 2`\n    fi\n    ;;\n  esac\n\nfi\n\nif test -n $lt_cv_sys_max_cmd_len ; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_sys_max_cmd_len\" >&5\n$as_echo \"$lt_cv_sys_max_cmd_len\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: none\" >&5\n$as_echo \"none\" >&6; }\nfi\nmax_cmd_len=$lt_cv_sys_max_cmd_len\n\n\n\n\n\n\n: ${CP=\"cp -f\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the shell understands some XSI constructs\" >&5\n$as_echo_n \"checking whether the shell understands some XSI constructs... \" >&6; }\n# Try some XSI features\nxsi_shell=no\n( _lt_dummy=\"a/b/c\"\n  test \"${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}\"${_lt_dummy%\"$_lt_dummy\"}, \\\n      = c,a/b,b/c, \\\n    && eval 'test $(( 1 + 1 )) -eq 2 \\\n    && test \"${#_lt_dummy}\" -eq 5' ) >/dev/null 2>&1 \\\n  && xsi_shell=yes\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $xsi_shell\" >&5\n$as_echo \"$xsi_shell\" >&6; }\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the shell understands \\\"+=\\\"\" >&5\n$as_echo_n \"checking whether the shell understands \\\"+=\\\"... \" >&6; }\nlt_shell_append=no\n( foo=bar; set foo baz; eval \"$1+=\\$2\" && test \"$foo\" = barbaz ) \\\n    >/dev/null 2>&1 \\\n  && lt_shell_append=yes\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_shell_append\" >&5\n$as_echo \"$lt_shell_append\" >&6; }\n\n\nif ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then\n  lt_unset=unset\nelse\n  lt_unset=false\nfi\n\n\n\n\n\n# test EBCDIC or ASCII\ncase `echo X|tr X '\\101'` in\n A) # ASCII based system\n    # \\n is not interpreted correctly by Solaris 8 /usr/ucb/tr\n  lt_SP2NL='tr \\040 \\012'\n  lt_NL2SP='tr \\015\\012 \\040\\040'\n  ;;\n *) # EBCDIC based system\n  lt_SP2NL='tr \\100 \\n'\n  lt_NL2SP='tr \\r\\n \\100\\100'\n  ;;\nesac\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to $host format\" >&5\n$as_echo_n \"checking how to convert $build file names to $host format... \" >&6; }\nif ${lt_cv_to_host_file_cmd+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $host in\n  *-*-mingw* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32\n        ;;\n      *-*-cygwin* )\n        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32\n        ;;\n      * ) # otherwise, assume *nix\n        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32\n        ;;\n    esac\n    ;;\n  *-*-cygwin* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin\n        ;;\n      *-*-cygwin* )\n        lt_cv_to_host_file_cmd=func_convert_file_noop\n        ;;\n      * ) # otherwise, assume *nix\n        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin\n        ;;\n    esac\n    ;;\n  * ) # unhandled hosts (and \"normal\" native builds)\n    lt_cv_to_host_file_cmd=func_convert_file_noop\n    ;;\nesac\n\nfi\n\nto_host_file_cmd=$lt_cv_to_host_file_cmd\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_host_file_cmd\" >&5\n$as_echo \"$lt_cv_to_host_file_cmd\" >&6; }\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to convert $build file names to toolchain format\" >&5\n$as_echo_n \"checking how to convert $build file names to toolchain format... \" >&6; }\nif ${lt_cv_to_tool_file_cmd+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  #assume ordinary cross tools, or native build.\nlt_cv_to_tool_file_cmd=func_convert_file_noop\ncase $host in\n  *-*-mingw* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32\n        ;;\n    esac\n    ;;\nesac\n\nfi\n\nto_tool_file_cmd=$lt_cv_to_tool_file_cmd\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_to_tool_file_cmd\" >&5\n$as_echo \"$lt_cv_to_tool_file_cmd\" >&6; }\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $LD option to reload object files\" >&5\n$as_echo_n \"checking for $LD option to reload object files... \" >&6; }\nif ${lt_cv_ld_reload_flag+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ld_reload_flag='-r'\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_reload_flag\" >&5\n$as_echo \"$lt_cv_ld_reload_flag\" >&6; }\nreload_flag=$lt_cv_ld_reload_flag\ncase $reload_flag in\n\"\" | \" \"*) ;;\n*) reload_flag=\" $reload_flag\" ;;\nesac\nreload_cmds='$LD$reload_flag -o $output$reload_objs'\ncase $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    if test \"$GCC\" != yes; then\n      reload_cmds=false\n    fi\n    ;;\n  darwin*)\n    if test \"$GCC\" = yes; then\n      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'\n    else\n      reload_cmds='$LD$reload_flag -o $output$reload_objs'\n    fi\n    ;;\nesac\n\n\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}objdump\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}objdump; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_OBJDUMP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OBJDUMP\"; then\n  ac_cv_prog_OBJDUMP=\"$OBJDUMP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_OBJDUMP=\"${ac_tool_prefix}objdump\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOBJDUMP=$ac_cv_prog_OBJDUMP\nif test -n \"$OBJDUMP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OBJDUMP\" >&5\n$as_echo \"$OBJDUMP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OBJDUMP\"; then\n  ac_ct_OBJDUMP=$OBJDUMP\n  # Extract the first word of \"objdump\", so it can be a program name with args.\nset dummy objdump; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OBJDUMP\"; then\n  ac_cv_prog_ac_ct_OBJDUMP=\"$ac_ct_OBJDUMP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_OBJDUMP=\"objdump\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP\nif test -n \"$ac_ct_OBJDUMP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP\" >&5\n$as_echo \"$ac_ct_OBJDUMP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OBJDUMP\" = x; then\n    OBJDUMP=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OBJDUMP=$ac_ct_OBJDUMP\n  fi\nelse\n  OBJDUMP=\"$ac_cv_prog_OBJDUMP\"\nfi\n\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to recognize dependent libraries\" >&5\n$as_echo_n \"checking how to recognize dependent libraries... \" >&6; }\nif ${lt_cv_deplibs_check_method+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_file_magic_cmd='$MAGIC_CMD'\nlt_cv_file_magic_test_file=\nlt_cv_deplibs_check_method='unknown'\n# Need to set the preceding variable on all platforms that support\n# interlibrary dependencies.\n# 'none' -- dependencies not supported.\n# `unknown' -- same as none, but documents that we really don't know.\n# 'pass_all' -- all dependencies passed with no checks.\n# 'test_compile' -- check by making test program.\n# 'file_magic [[regex]]' -- check by looking for files in library path\n# which responds to the $file_magic_cmd with a given extended regex.\n# If you have `file' or equivalent on your system and you're not sure\n# whether `pass_all' will *always* work, you probably want this one.\n\ncase $host_os in\naix[4-9]*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbeos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbsdi[45]*)\n  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib)'\n  lt_cv_file_magic_cmd='/usr/bin/file -L'\n  lt_cv_file_magic_test_file=/shlib/libc.so\n  ;;\n\ncygwin*)\n  # func_win32_libid is a shell function defined in ltmain.sh\n  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n  lt_cv_file_magic_cmd='func_win32_libid'\n  ;;\n\nmingw* | pw32*)\n  # Base MSYS/MinGW do not provide the 'file' command needed by\n  # func_win32_libid shell function, so use a weaker test based on 'objdump',\n  # unless we find 'file', for example because we are cross-compiling.\n  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.\n  if ( test \"$lt_cv_nm_interface\" = \"BSD nm\" && file / ) >/dev/null 2>&1; then\n    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n    lt_cv_file_magic_cmd='func_win32_libid'\n  else\n    # Keep this pattern in sync with the one in func_win32_libid.\n    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'\n    lt_cv_file_magic_cmd='$OBJDUMP -f'\n  fi\n  ;;\n\ncegcc*)\n  # use the weaker test based on 'objdump'. See mingw*.\n  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'\n  lt_cv_file_magic_cmd='$OBJDUMP -f'\n  ;;\n\ndarwin* | rhapsody*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nfreebsd* | dragonfly*)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    case $host_cpu in\n    i*86 )\n      # Not sure whether the presence of OpenBSD here was a mistake.\n      # Let's accept both of them until this is cleared up.\n      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[3-9]86 (compact )?demand paged shared library'\n      lt_cv_file_magic_cmd=/usr/bin/file\n      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`\n      ;;\n    esac\n  else\n    lt_cv_deplibs_check_method=pass_all\n  fi\n  ;;\n\nhaiku*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nhpux10.20* | hpux11*)\n  lt_cv_file_magic_cmd=/usr/bin/file\n  case $host_cpu in\n  ia64*)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF-[0-9][0-9]) shared object file - IA64'\n    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so\n    ;;\n  hppa*64*)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\\.[0-9]'\n    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl\n    ;;\n  *)\n    lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|PA-RISC[0-9]\\.[0-9]) shared library'\n    lt_cv_file_magic_test_file=/usr/lib/libc.sl\n    ;;\n  esac\n  ;;\n\ninterix[3-9]*)\n  # PIC code is broken on Interix 3.x, that's why |\\.a not |_pic\\.a here\n  lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so|\\.a)$'\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $LD in\n  *-32|*\"-32 \") libmagic=32-bit;;\n  *-n32|*\"-n32 \") libmagic=N32;;\n  *-64|*\"-64 \") libmagic=64-bit;;\n  *) libmagic=never-match;;\n  esac\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nnetbsd* | netbsdelf*-gnu)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so|_pic\\.a)$'\n  fi\n  ;;\n\nnewos6*)\n  lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (executable|dynamic lib)'\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=/usr/lib/libnls.so\n  ;;\n\n*nto* | *qnx*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nopenbsd*)\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|\\.so|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[^/]+(\\.so\\.[0-9]+\\.[0-9]+|_pic\\.a)$'\n  fi\n  ;;\n\nosf3* | osf4* | osf5*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nrdos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsolaris*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv4 | sysv4.3*)\n  case $host_vendor in\n  motorola)\n    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [ML]SB (shared object|dynamic lib) M[0-9][0-9]* Version [0-9]'\n    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`\n    ;;\n  ncr)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  sequent)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method='file_magic ELF [0-9][0-9]*-bit [LM]SB (shared object|dynamic lib )'\n    ;;\n  sni)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method=\"file_magic ELF [0-9][0-9]*-bit [LM]SB dynamic lib\"\n    lt_cv_file_magic_test_file=/lib/libc.so\n    ;;\n  siemens)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  pc)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  esac\n  ;;\n\ntpf*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\nesac\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_deplibs_check_method\" >&5\n$as_echo \"$lt_cv_deplibs_check_method\" >&6; }\n\nfile_magic_glob=\nwant_nocaseglob=no\nif test \"$build\" = \"$host\"; then\n  case $host_os in\n  mingw* | pw32*)\n    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then\n      want_nocaseglob=yes\n    else\n      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e \"s/\\(..\\)/s\\/[\\1]\\/[\\1]\\/g;/g\"`\n    fi\n    ;;\n  esac\nfi\n\nfile_magic_cmd=$lt_cv_file_magic_cmd\ndeplibs_check_method=$lt_cv_deplibs_check_method\ntest -z \"$deplibs_check_method\" && deplibs_check_method=unknown\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}dlltool\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}dlltool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_DLLTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DLLTOOL\"; then\n  ac_cv_prog_DLLTOOL=\"$DLLTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_DLLTOOL=\"${ac_tool_prefix}dlltool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDLLTOOL=$ac_cv_prog_DLLTOOL\nif test -n \"$DLLTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DLLTOOL\" >&5\n$as_echo \"$DLLTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_DLLTOOL\"; then\n  ac_ct_DLLTOOL=$DLLTOOL\n  # Extract the first word of \"dlltool\", so it can be a program name with args.\nset dummy dlltool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DLLTOOL\"; then\n  ac_cv_prog_ac_ct_DLLTOOL=\"$ac_ct_DLLTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_DLLTOOL=\"dlltool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL\nif test -n \"$ac_ct_DLLTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL\" >&5\n$as_echo \"$ac_ct_DLLTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_DLLTOOL\" = x; then\n    DLLTOOL=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DLLTOOL=$ac_ct_DLLTOOL\n  fi\nelse\n  DLLTOOL=\"$ac_cv_prog_DLLTOOL\"\nfi\n\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to associate runtime and link libraries\" >&5\n$as_echo_n \"checking how to associate runtime and link libraries... \" >&6; }\nif ${lt_cv_sharedlib_from_linklib_cmd+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_sharedlib_from_linklib_cmd='unknown'\n\ncase $host_os in\ncygwin* | mingw* | pw32* | cegcc*)\n  # two different shell functions defined in ltmain.sh\n  # decide which to use based on capabilities of $DLLTOOL\n  case `$DLLTOOL --help 2>&1` in\n  *--identify-strict*)\n    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib\n    ;;\n  *)\n    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback\n    ;;\n  esac\n  ;;\n*)\n  # fallback: assume linklib IS sharedlib\n  lt_cv_sharedlib_from_linklib_cmd=\"$ECHO\"\n  ;;\nesac\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_sharedlib_from_linklib_cmd\" >&5\n$as_echo \"$lt_cv_sharedlib_from_linklib_cmd\" >&6; }\nsharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd\ntest -z \"$sharedlib_from_linklib_cmd\" && sharedlib_from_linklib_cmd=$ECHO\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  for ac_prog in ar\n  do\n    # Extract the first word of \"$ac_tool_prefix$ac_prog\", so it can be a program name with args.\nset dummy $ac_tool_prefix$ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_AR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AR\"; then\n  ac_cv_prog_AR=\"$AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_AR=\"$ac_tool_prefix$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAR=$ac_cv_prog_AR\nif test -n \"$AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AR\" >&5\n$as_echo \"$AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n    test -n \"$AR\" && break\n  done\nfi\nif test -z \"$AR\"; then\n  ac_ct_AR=$AR\n  for ac_prog in ar\ndo\n  # Extract the first word of \"$ac_prog\", so it can be a program name with args.\nset dummy $ac_prog; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_AR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_AR\"; then\n  ac_cv_prog_ac_ct_AR=\"$ac_ct_AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_AR=\"$ac_prog\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_AR=$ac_cv_prog_ac_ct_AR\nif test -n \"$ac_ct_AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR\" >&5\n$as_echo \"$ac_ct_AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  test -n \"$ac_ct_AR\" && break\ndone\n\n  if test \"x$ac_ct_AR\" = x; then\n    AR=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    AR=$ac_ct_AR\n  fi\nfi\n\n: ${AR=ar}\n: ${AR_FLAGS=cru}\n\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for archiver @FILE support\" >&5\n$as_echo_n \"checking for archiver @FILE support... \" >&6; }\nif ${lt_cv_ar_at_file+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ar_at_file=no\n   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  echo conftest.$ac_objext > conftest.lst\n      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&5'\n      { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$lt_ar_try\\\"\"; } >&5\n  (eval $lt_ar_try) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n      if test \"$ac_status\" -eq 0; then\n\t# Ensure the archiver fails upon bogus file names.\n\trm -f conftest.$ac_objext libconftest.a\n\t{ { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$lt_ar_try\\\"\"; } >&5\n  (eval $lt_ar_try) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n\tif test \"$ac_status\" -ne 0; then\n          lt_cv_ar_at_file=@\n        fi\n      fi\n      rm -f conftest.* libconftest.a\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ar_at_file\" >&5\n$as_echo \"$lt_cv_ar_at_file\" >&6; }\n\nif test \"x$lt_cv_ar_at_file\" = xno; then\n  archiver_list_spec=\nelse\n  archiver_list_spec=$lt_cv_ar_at_file\nfi\n\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}strip\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$STRIP\"; then\n  ac_cv_prog_STRIP=\"$STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_STRIP=\"${ac_tool_prefix}strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nSTRIP=$ac_cv_prog_STRIP\nif test -n \"$STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $STRIP\" >&5\n$as_echo \"$STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_STRIP\"; then\n  ac_ct_STRIP=$STRIP\n  # Extract the first word of \"strip\", so it can be a program name with args.\nset dummy strip; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_STRIP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_STRIP\"; then\n  ac_cv_prog_ac_ct_STRIP=\"$ac_ct_STRIP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_STRIP=\"strip\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP\nif test -n \"$ac_ct_STRIP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_STRIP\" >&5\n$as_echo \"$ac_ct_STRIP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_STRIP\" = x; then\n    STRIP=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    STRIP=$ac_ct_STRIP\n  fi\nelse\n  STRIP=\"$ac_cv_prog_STRIP\"\nfi\n\ntest -z \"$STRIP\" && STRIP=:\n\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}ranlib\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_RANLIB+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$RANLIB\"; then\n  ac_cv_prog_RANLIB=\"$RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_RANLIB=\"${ac_tool_prefix}ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nRANLIB=$ac_cv_prog_RANLIB\nif test -n \"$RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $RANLIB\" >&5\n$as_echo \"$RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_RANLIB\"; then\n  ac_ct_RANLIB=$RANLIB\n  # Extract the first word of \"ranlib\", so it can be a program name with args.\nset dummy ranlib; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_RANLIB+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_RANLIB\"; then\n  ac_cv_prog_ac_ct_RANLIB=\"$ac_ct_RANLIB\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_RANLIB=\"ranlib\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB\nif test -n \"$ac_ct_RANLIB\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_RANLIB\" >&5\n$as_echo \"$ac_ct_RANLIB\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_RANLIB\" = x; then\n    RANLIB=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    RANLIB=$ac_ct_RANLIB\n  fi\nelse\n  RANLIB=\"$ac_cv_prog_RANLIB\"\nfi\n\ntest -z \"$RANLIB\" && RANLIB=:\n\n\n\n\n\n\n# Determine commands to create old-style static archives.\nold_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'\nold_postinstall_cmds='chmod 644 $oldlib'\nold_postuninstall_cmds=\n\nif test -n \"$RANLIB\"; then\n  case $host_os in\n  openbsd*)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB -t \\$tool_oldlib\"\n    ;;\n  *)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB \\$tool_oldlib\"\n    ;;\n  esac\n  old_archive_cmds=\"$old_archive_cmds~\\$RANLIB \\$tool_oldlib\"\nfi\n\ncase $host_os in\n  darwin*)\n    lock_old_archive_extraction=yes ;;\n  *)\n    lock_old_archive_extraction=no ;;\nesac\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n\n\n# Check for command to grab the raw symbol name followed by C symbol from nm.\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking command to parse $NM output from $compiler object\" >&5\n$as_echo_n \"checking command to parse $NM output from $compiler object... \" >&6; }\nif ${lt_cv_sys_global_symbol_pipe+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n# These are sane defaults that work on at least a few old systems.\n# [They come from Ultrix.  What could be older than Ultrix?!! ;)]\n\n# Character class describing NM global symbol codes.\nsymcode='[BCDEGRST]'\n\n# Regexp to match symbols that can be accessed directly from C.\nsympat='\\([_A-Za-z][_A-Za-z0-9]*\\)'\n\n# Define system-specific variables.\ncase $host_os in\naix*)\n  symcode='[BCDT]'\n  ;;\ncygwin* | mingw* | pw32* | cegcc*)\n  symcode='[ABCDGISTW]'\n  ;;\nhpux*)\n  if test \"$host_cpu\" = ia64; then\n    symcode='[ABCDEGRST]'\n  fi\n  ;;\nirix* | nonstopux*)\n  symcode='[BCDEGRST]'\n  ;;\nosf*)\n  symcode='[BCDEGQRST]'\n  ;;\nsolaris*)\n  symcode='[BDRT]'\n  ;;\nsco3.2v5*)\n  symcode='[DT]'\n  ;;\nsysv4.2uw2*)\n  symcode='[DT]'\n  ;;\nsysv5* | sco5v6* | unixware* | OpenUNIX*)\n  symcode='[ABDT]'\n  ;;\nsysv4)\n  symcode='[DFNSTU]'\n  ;;\nesac\n\n# If we're using GNU nm, then use its standard symbol codes.\ncase `$NM -V 2>&1` in\n*GNU* | *'with BFD'*)\n  symcode='[ABCDGIRSTW]' ;;\nesac\n\n# Transform an extracted symbol line into a proper C declaration.\n# Some systems (esp. on ia64) link data and code symbols differently,\n# so use this general approach.\nlt_cv_sys_global_symbol_to_cdecl=\"sed -n -e 's/^T .* \\(.*\\)$/extern int \\1();/p' -e 's/^$symcode* .* \\(.*\\)$/extern char \\1;/p'\"\n\n# Transform an extracted symbol line into symbol name and symbol address\nlt_cv_sys_global_symbol_to_c_name_address=\"sed -n -e 's/^: \\([^ ]*\\)[ ]*$/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([^ ]*\\) \\([^ ]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p'\"\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix=\"sed -n -e 's/^: \\([^ ]*\\)[ ]*$/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([^ ]*\\) \\(lib[^ ]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p' -e 's/^$symcode* \\([^ ]*\\) \\([^ ]*\\)$/  {\\\"lib\\2\\\", (void *) \\&\\2},/p'\"\n\n# Handle CRLF in mingw tool chain\nopt_cr=\ncase $build_os in\nmingw*)\n  opt_cr=`$ECHO 'x\\{0,1\\}' | tr x '\\015'` # option cr in regexp\n  ;;\nesac\n\n# Try without a prefix underscore, then with it.\nfor ac_symprfx in \"\" \"_\"; do\n\n  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.\n  symxfrm=\"\\\\1 $ac_symprfx\\\\2 \\\\2\"\n\n  # Write the raw and C identifiers.\n  if test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n    # Fake it for dumpbin and say T for any non-static function\n    # and D for any global variable.\n    # Also find C++ and __fastcall symbols from MSVC++,\n    # which start with @ or ?.\n    lt_cv_sys_global_symbol_pipe=\"$AWK '\"\\\n\"     {last_section=section; section=\\$ 3};\"\\\n\"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};\"\\\n\"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};\"\\\n\"     \\$ 0!~/External *\\|/{next};\"\\\n\"     / 0+ UNDEF /{next}; / UNDEF \\([^|]\\)*()/{next};\"\\\n\"     {if(hide[section]) next};\"\\\n\"     {f=0}; \\$ 0~/\\(\\).*\\|/{f=1}; {printf f ? \\\"T \\\" : \\\"D \\\"};\"\\\n\"     {split(\\$ 0, a, /\\||\\r/); split(a[2], s)};\"\\\n\"     s[1]~/^[@?]/{print s[1], s[1]; next};\"\\\n\"     s[1]~prfx {split(s[1],t,\\\"@\\\"); print t[1], substr(t[1],length(prfx))}\"\\\n\"     ' prfx=^$ac_symprfx\"\n  else\n    lt_cv_sys_global_symbol_pipe=\"sed -n -e 's/^.*[\t ]\\($symcode$symcode*\\)[\t ][\t ]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'\"\n  fi\n  lt_cv_sys_global_symbol_pipe=\"$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'\"\n\n  # Check to see that the pipe works correctly.\n  pipe_works=no\n\n  rm -f conftest*\n  cat > conftest.$ac_ext <<_LT_EOF\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nchar nm_test_var;\nvoid nm_test_func(void);\nvoid nm_test_func(void){}\n#ifdef __cplusplus\n}\n#endif\nint main(){nm_test_var='a';nm_test_func();return(0);}\n_LT_EOF\n\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    # Now try to grab the symbols.\n    nlist=conftest.nm\n    if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$NM conftest.$ac_objext \\| \"$lt_cv_sys_global_symbol_pipe\" \\> $nlist\\\"\"; } >&5\n  (eval $NM conftest.$ac_objext \\| \"$lt_cv_sys_global_symbol_pipe\" \\> $nlist) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s \"$nlist\"; then\n      # Try sorting and uniquifying the output.\n      if sort \"$nlist\" | uniq > \"$nlist\"T; then\n\tmv -f \"$nlist\"T \"$nlist\"\n      else\n\trm -f \"$nlist\"T\n      fi\n\n      # Make sure that we snagged all the symbols we need.\n      if $GREP ' nm_test_var$' \"$nlist\" >/dev/null; then\n\tif $GREP ' nm_test_func$' \"$nlist\" >/dev/null; then\n\t  cat <<_LT_EOF > conftest.$ac_ext\n/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */\n#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)\n/* DATA imports from DLLs on WIN32 con't be const, because runtime\n   relocations are performed -- see ld's documentation on pseudo-relocs.  */\n# define LT_DLSYM_CONST\n#elif defined(__osf__)\n/* This system does not cope well with relocations in const data.  */\n# define LT_DLSYM_CONST\n#else\n# define LT_DLSYM_CONST const\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n_LT_EOF\n\t  # Now generate the symbol file.\n\t  eval \"$lt_cv_sys_global_symbol_to_cdecl\"' < \"$nlist\" | $GREP -v main >> conftest.$ac_ext'\n\n\t  cat <<_LT_EOF >> conftest.$ac_ext\n\n/* The mapping between symbol names and symbols.  */\nLT_DLSYM_CONST struct {\n  const char *name;\n  void       *address;\n}\nlt__PROGRAM__LTX_preloaded_symbols[] =\n{\n  { \"@PROGRAM@\", (void *) 0 },\n_LT_EOF\n\t  $SED \"s/^$symcode$symcode* \\(.*\\) \\(.*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/\" < \"$nlist\" | $GREP -v main >> conftest.$ac_ext\n\t  cat <<\\_LT_EOF >> conftest.$ac_ext\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt__PROGRAM__LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n_LT_EOF\n\t  # Now try linking the two files.\n\t  mv conftest.$ac_objext conftstm.$ac_objext\n\t  lt_globsym_save_LIBS=$LIBS\n\t  lt_globsym_save_CFLAGS=$CFLAGS\n\t  LIBS=\"conftstm.$ac_objext\"\n\t  CFLAGS=\"$CFLAGS$lt_prog_compiler_no_builtin_flag\"\n\t  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s conftest${ac_exeext}; then\n\t    pipe_works=yes\n\t  fi\n\t  LIBS=$lt_globsym_save_LIBS\n\t  CFLAGS=$lt_globsym_save_CFLAGS\n\telse\n\t  echo \"cannot find nm_test_func in $nlist\" >&5\n\tfi\n      else\n\techo \"cannot find nm_test_var in $nlist\" >&5\n      fi\n    else\n      echo \"cannot run $lt_cv_sys_global_symbol_pipe\" >&5\n    fi\n  else\n    echo \"$progname: failed program was:\" >&5\n    cat conftest.$ac_ext >&5\n  fi\n  rm -rf conftest* conftst*\n\n  # Do not use the global_symbol_pipe unless it works.\n  if test \"$pipe_works\" = yes; then\n    break\n  else\n    lt_cv_sys_global_symbol_pipe=\n  fi\ndone\n\nfi\n\nif test -z \"$lt_cv_sys_global_symbol_pipe\"; then\n  lt_cv_sys_global_symbol_to_cdecl=\nfi\nif test -z \"$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: failed\" >&5\n$as_echo \"failed\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ok\" >&5\n$as_echo \"ok\" >&6; }\nfi\n\n# Response file support.\nif test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n  nm_file_list_spec='@'\nelif $NM --help 2>/dev/null | grep '[@]FILE' >/dev/null; then\n  nm_file_list_spec='@'\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for sysroot\" >&5\n$as_echo_n \"checking for sysroot... \" >&6; }\n\n# Check whether --with-sysroot was given.\nif test \"${with_sysroot+set}\" = set; then :\n  withval=$with_sysroot;\nelse\n  with_sysroot=no\nfi\n\n\nlt_sysroot=\ncase ${with_sysroot} in #(\n yes)\n   if test \"$GCC\" = yes; then\n     lt_sysroot=`$CC --print-sysroot 2>/dev/null`\n   fi\n   ;; #(\n /*)\n   lt_sysroot=`echo \"$with_sysroot\" | sed -e \"$sed_quote_subst\"`\n   ;; #(\n no|'')\n   ;; #(\n *)\n   { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ${with_sysroot}\" >&5\n$as_echo \"${with_sysroot}\" >&6; }\n   as_fn_error $? \"The sysroot must be an absolute path.\" \"$LINENO\" 5\n   ;;\nesac\n\n { $as_echo \"$as_me:${as_lineno-$LINENO}: result: ${lt_sysroot:-no}\" >&5\n$as_echo \"${lt_sysroot:-no}\" >&6; }\n\n\n\n\n\n# Check whether --enable-libtool-lock was given.\nif test \"${enable_libtool_lock+set}\" = set; then :\n  enableval=$enable_libtool_lock;\nfi\n\ntest \"x$enable_libtool_lock\" != xno && enable_libtool_lock=yes\n\n# Some flags need to be propagated to the compiler or linker for good\n# libtool support.\ncase $host in\nia64-*-hpux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.$ac_objext` in\n      *ELF-32*)\n\tHPUX_IA64_MODE=\"32\"\n\t;;\n      *ELF-64*)\n\tHPUX_IA64_MODE=\"64\"\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n*-*-irix6*)\n  # Find out which ABI we are using.\n  echo '#line '$LINENO' \"configure\"' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    if test \"$lt_cv_prog_gnu_ld\" = yes; then\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -melf32bsmip\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -melf32bmipn32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -melf64bmip\"\n\t;;\n      esac\n    else\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -32\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -n32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -64\"\n\t  ;;\n      esac\n    fi\n  fi\n  rm -rf conftest*\n  ;;\n\nx86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \\\ns390*-*linux*|s390*-*tpf*|sparc*-*linux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.o` in\n      *32-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_i386_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    case `/usr/bin/file conftest.o` in\n\t      *x86-64*)\n\t\tLD=\"${LD-ld} -m elf32_x86_64\"\n\t\t;;\n\t      *)\n\t\tLD=\"${LD-ld} -m elf_i386\"\n\t\t;;\n\t    esac\n\t    ;;\n\t  powerpc64le-*)\n\t    LD=\"${LD-ld} -m elf32lppclinux\"\n\t    ;;\n\t  powerpc64-*)\n\t    LD=\"${LD-ld} -m elf32ppclinux\"\n\t    ;;\n\t  s390x-*linux*)\n\t    LD=\"${LD-ld} -m elf_s390\"\n\t    ;;\n\t  sparc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32_sparc\"\n\t    ;;\n\tesac\n\t;;\n      *64-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_x86_64_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_x86_64\"\n\t    ;;\n\t  powerpcle-*)\n\t    LD=\"${LD-ld} -m elf64lppc\"\n\t    ;;\n\t  powerpc-*)\n\t    LD=\"${LD-ld} -m elf64ppc\"\n\t    ;;\n\t  s390*-*linux*|s390*-*tpf*)\n\t    LD=\"${LD-ld} -m elf64_s390\"\n\t    ;;\n\t  sparc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64_sparc\"\n\t    ;;\n\tesac\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n\n*-*-sco3.2v5*)\n  # On SCO OpenServer 5, we need -belf to get full-featured binaries.\n  SAVE_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -belf\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the C compiler needs -belf\" >&5\n$as_echo_n \"checking whether the C compiler needs -belf... \" >&6; }\nif ${lt_cv_cc_needs_belf+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n     cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  lt_cv_cc_needs_belf=yes\nelse\n  lt_cv_cc_needs_belf=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n     ac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_cc_needs_belf\" >&5\n$as_echo \"$lt_cv_cc_needs_belf\" >&6; }\n  if test x\"$lt_cv_cc_needs_belf\" != x\"yes\"; then\n    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf\n    CFLAGS=\"$SAVE_CFLAGS\"\n  fi\n  ;;\n*-*solaris*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }; then\n    case `/usr/bin/file conftest.o` in\n    *64-bit*)\n      case $lt_cv_prog_gnu_ld in\n      yes*)\n        case $host in\n        i?86-*-solaris*)\n          LD=\"${LD-ld} -m elf_x86_64\"\n          ;;\n        sparc*-*-solaris*)\n          LD=\"${LD-ld} -m elf64_sparc\"\n          ;;\n        esac\n        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.\n        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then\n          LD=\"${LD-ld}_sol2\"\n        fi\n        ;;\n      *)\n\tif ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then\n\t  LD=\"${LD-ld} -64\"\n\tfi\n\t;;\n      esac\n      ;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\nesac\n\nneed_locks=\"$enable_libtool_lock\"\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}mt\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}mt; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_MANIFEST_TOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$MANIFEST_TOOL\"; then\n  ac_cv_prog_MANIFEST_TOOL=\"$MANIFEST_TOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_MANIFEST_TOOL=\"${ac_tool_prefix}mt\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nMANIFEST_TOOL=$ac_cv_prog_MANIFEST_TOOL\nif test -n \"$MANIFEST_TOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MANIFEST_TOOL\" >&5\n$as_echo \"$MANIFEST_TOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_MANIFEST_TOOL\"; then\n  ac_ct_MANIFEST_TOOL=$MANIFEST_TOOL\n  # Extract the first word of \"mt\", so it can be a program name with args.\nset dummy mt; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_MANIFEST_TOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_MANIFEST_TOOL\"; then\n  ac_cv_prog_ac_ct_MANIFEST_TOOL=\"$ac_ct_MANIFEST_TOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_MANIFEST_TOOL=\"mt\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_MANIFEST_TOOL=$ac_cv_prog_ac_ct_MANIFEST_TOOL\nif test -n \"$ac_ct_MANIFEST_TOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_MANIFEST_TOOL\" >&5\n$as_echo \"$ac_ct_MANIFEST_TOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_MANIFEST_TOOL\" = x; then\n    MANIFEST_TOOL=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    MANIFEST_TOOL=$ac_ct_MANIFEST_TOOL\n  fi\nelse\n  MANIFEST_TOOL=\"$ac_cv_prog_MANIFEST_TOOL\"\nfi\n\ntest -z \"$MANIFEST_TOOL\" && MANIFEST_TOOL=mt\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $MANIFEST_TOOL is a manifest tool\" >&5\n$as_echo_n \"checking if $MANIFEST_TOOL is a manifest tool... \" >&6; }\nif ${lt_cv_path_mainfest_tool+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_path_mainfest_tool=no\n  echo \"$as_me:$LINENO: $MANIFEST_TOOL '-?'\" >&5\n  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out\n  cat conftest.err >&5\n  if $GREP 'Manifest Tool' conftest.out > /dev/null; then\n    lt_cv_path_mainfest_tool=yes\n  fi\n  rm -f conftest*\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_path_mainfest_tool\" >&5\n$as_echo \"$lt_cv_path_mainfest_tool\" >&6; }\nif test \"x$lt_cv_path_mainfest_tool\" != xyes; then\n  MANIFEST_TOOL=:\nfi\n\n\n\n\n\n\n  case $host_os in\n    rhapsody* | darwin*)\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}dsymutil\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}dsymutil; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_DSYMUTIL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DSYMUTIL\"; then\n  ac_cv_prog_DSYMUTIL=\"$DSYMUTIL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_DSYMUTIL=\"${ac_tool_prefix}dsymutil\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDSYMUTIL=$ac_cv_prog_DSYMUTIL\nif test -n \"$DSYMUTIL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DSYMUTIL\" >&5\n$as_echo \"$DSYMUTIL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_DSYMUTIL\"; then\n  ac_ct_DSYMUTIL=$DSYMUTIL\n  # Extract the first word of \"dsymutil\", so it can be a program name with args.\nset dummy dsymutil; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_DSYMUTIL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DSYMUTIL\"; then\n  ac_cv_prog_ac_ct_DSYMUTIL=\"$ac_ct_DSYMUTIL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_DSYMUTIL=\"dsymutil\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DSYMUTIL=$ac_cv_prog_ac_ct_DSYMUTIL\nif test -n \"$ac_ct_DSYMUTIL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DSYMUTIL\" >&5\n$as_echo \"$ac_ct_DSYMUTIL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_DSYMUTIL\" = x; then\n    DSYMUTIL=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DSYMUTIL=$ac_ct_DSYMUTIL\n  fi\nelse\n  DSYMUTIL=\"$ac_cv_prog_DSYMUTIL\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}nmedit\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}nmedit; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_NMEDIT+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$NMEDIT\"; then\n  ac_cv_prog_NMEDIT=\"$NMEDIT\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_NMEDIT=\"${ac_tool_prefix}nmedit\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nNMEDIT=$ac_cv_prog_NMEDIT\nif test -n \"$NMEDIT\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $NMEDIT\" >&5\n$as_echo \"$NMEDIT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_NMEDIT\"; then\n  ac_ct_NMEDIT=$NMEDIT\n  # Extract the first word of \"nmedit\", so it can be a program name with args.\nset dummy nmedit; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_NMEDIT+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_NMEDIT\"; then\n  ac_cv_prog_ac_ct_NMEDIT=\"$ac_ct_NMEDIT\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_NMEDIT=\"nmedit\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_NMEDIT=$ac_cv_prog_ac_ct_NMEDIT\nif test -n \"$ac_ct_NMEDIT\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_NMEDIT\" >&5\n$as_echo \"$ac_ct_NMEDIT\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_NMEDIT\" = x; then\n    NMEDIT=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    NMEDIT=$ac_ct_NMEDIT\n  fi\nelse\n  NMEDIT=\"$ac_cv_prog_NMEDIT\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}lipo\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}lipo; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_LIPO+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$LIPO\"; then\n  ac_cv_prog_LIPO=\"$LIPO\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_LIPO=\"${ac_tool_prefix}lipo\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nLIPO=$ac_cv_prog_LIPO\nif test -n \"$LIPO\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $LIPO\" >&5\n$as_echo \"$LIPO\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_LIPO\"; then\n  ac_ct_LIPO=$LIPO\n  # Extract the first word of \"lipo\", so it can be a program name with args.\nset dummy lipo; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_LIPO+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_LIPO\"; then\n  ac_cv_prog_ac_ct_LIPO=\"$ac_ct_LIPO\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_LIPO=\"lipo\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_LIPO=$ac_cv_prog_ac_ct_LIPO\nif test -n \"$ac_ct_LIPO\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_LIPO\" >&5\n$as_echo \"$ac_ct_LIPO\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_LIPO\" = x; then\n    LIPO=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    LIPO=$ac_ct_LIPO\n  fi\nelse\n  LIPO=\"$ac_cv_prog_LIPO\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}otool\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}otool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_OTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OTOOL\"; then\n  ac_cv_prog_OTOOL=\"$OTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_OTOOL=\"${ac_tool_prefix}otool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOTOOL=$ac_cv_prog_OTOOL\nif test -n \"$OTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OTOOL\" >&5\n$as_echo \"$OTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OTOOL\"; then\n  ac_ct_OTOOL=$OTOOL\n  # Extract the first word of \"otool\", so it can be a program name with args.\nset dummy otool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_OTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OTOOL\"; then\n  ac_cv_prog_ac_ct_OTOOL=\"$ac_ct_OTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_OTOOL=\"otool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OTOOL=$ac_cv_prog_ac_ct_OTOOL\nif test -n \"$ac_ct_OTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL\" >&5\n$as_echo \"$ac_ct_OTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OTOOL\" = x; then\n    OTOOL=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OTOOL=$ac_ct_OTOOL\n  fi\nelse\n  OTOOL=\"$ac_cv_prog_OTOOL\"\nfi\n\n    if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}otool64\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}otool64; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_OTOOL64+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OTOOL64\"; then\n  ac_cv_prog_OTOOL64=\"$OTOOL64\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_OTOOL64=\"${ac_tool_prefix}otool64\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOTOOL64=$ac_cv_prog_OTOOL64\nif test -n \"$OTOOL64\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OTOOL64\" >&5\n$as_echo \"$OTOOL64\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OTOOL64\"; then\n  ac_ct_OTOOL64=$OTOOL64\n  # Extract the first word of \"otool64\", so it can be a program name with args.\nset dummy otool64; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_OTOOL64+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OTOOL64\"; then\n  ac_cv_prog_ac_ct_OTOOL64=\"$ac_ct_OTOOL64\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_OTOOL64=\"otool64\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OTOOL64=$ac_cv_prog_ac_ct_OTOOL64\nif test -n \"$ac_ct_OTOOL64\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OTOOL64\" >&5\n$as_echo \"$ac_ct_OTOOL64\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OTOOL64\" = x; then\n    OTOOL64=\":\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OTOOL64=$ac_ct_OTOOL64\n  fi\nelse\n  OTOOL64=\"$ac_cv_prog_OTOOL64\"\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for -single_module linker flag\" >&5\n$as_echo_n \"checking for -single_module linker flag... \" >&6; }\nif ${lt_cv_apple_cc_single_mod+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_apple_cc_single_mod=no\n      if test -z \"${LT_MULTI_MODULE}\"; then\n\t# By default we will add the -single_module flag. You can override\n\t# by either setting the environment variable LT_MULTI_MODULE\n\t# non-empty at configure time, or by adding -multi_module to the\n\t# link flags.\n\trm -rf libconftest.dylib*\n\techo \"int foo(void){return 1;}\" > conftest.c\n\techo \"$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n-dynamiclib -Wl,-single_module conftest.c\" >&5\n\t$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n\t  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err\n        _lt_result=$?\n\t# If there is a non-empty error log, and \"single_module\"\n\t# appears in it, assume the flag caused a linker warning\n        if test -s conftest.err && $GREP single_module conftest.err; then\n\t  cat conftest.err >&5\n\t# Otherwise, if the output was created with a 0 exit code from\n\t# the compiler, it worked.\n\telif test -f libconftest.dylib && test $_lt_result -eq 0; then\n\t  lt_cv_apple_cc_single_mod=yes\n\telse\n\t  cat conftest.err >&5\n\tfi\n\trm -rf libconftest.dylib*\n\trm -f conftest.*\n      fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_apple_cc_single_mod\" >&5\n$as_echo \"$lt_cv_apple_cc_single_mod\" >&6; }\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for -exported_symbols_list linker flag\" >&5\n$as_echo_n \"checking for -exported_symbols_list linker flag... \" >&6; }\nif ${lt_cv_ld_exported_symbols_list+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ld_exported_symbols_list=no\n      save_LDFLAGS=$LDFLAGS\n      echo \"_main\" > conftest.sym\n      LDFLAGS=\"$LDFLAGS -Wl,-exported_symbols_list,conftest.sym\"\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  lt_cv_ld_exported_symbols_list=yes\nelse\n  lt_cv_ld_exported_symbols_list=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\tLDFLAGS=\"$save_LDFLAGS\"\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_exported_symbols_list\" >&5\n$as_echo \"$lt_cv_ld_exported_symbols_list\" >&6; }\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for -force_load linker flag\" >&5\n$as_echo_n \"checking for -force_load linker flag... \" >&6; }\nif ${lt_cv_ld_force_load+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_ld_force_load=no\n      cat > conftest.c << _LT_EOF\nint forced_loaded() { return 2;}\n_LT_EOF\n      echo \"$LTCC $LTCFLAGS -c -o conftest.o conftest.c\" >&5\n      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&5\n      echo \"$AR cru libconftest.a conftest.o\" >&5\n      $AR cru libconftest.a conftest.o 2>&5\n      echo \"$RANLIB libconftest.a\" >&5\n      $RANLIB libconftest.a 2>&5\n      cat > conftest.c << _LT_EOF\nint main() { return 0;}\n_LT_EOF\n      echo \"$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a\" >&5\n      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err\n      _lt_result=$?\n      if test -s conftest.err && $GREP force_load conftest.err; then\n\tcat conftest.err >&5\n      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then\n\tlt_cv_ld_force_load=yes\n      else\n\tcat conftest.err >&5\n      fi\n        rm -f conftest.err libconftest.a conftest conftest.c\n        rm -rf conftest.dSYM\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_ld_force_load\" >&5\n$as_echo \"$lt_cv_ld_force_load\" >&6; }\n    case $host_os in\n    rhapsody* | darwin1.[012])\n      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;\n    darwin1.*)\n      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n    darwin*) # darwin 5.x on\n      # if running on 10.5 or later, the deployment target defaults\n      # to the OS version, if on x86, and 10.4, the deployment\n      # target defaults to 10.4. Don't you love it?\n      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in\n\t10.0,*86*-darwin8*|10.0,*-darwin[91]*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n\t10.[012]*)\n\t  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n\t10.*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n      esac\n    ;;\n  esac\n    if test \"$lt_cv_apple_cc_single_mod\" = \"yes\"; then\n      _lt_dar_single_mod='$single_module'\n    fi\n    if test \"$lt_cv_ld_exported_symbols_list\" = \"yes\"; then\n      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'\n    else\n      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'\n    fi\n    if test \"$DSYMUTIL\" != \":\" && test \"$lt_cv_ld_force_load\" = \"no\"; then\n      _lt_dsymutil='~$DSYMUTIL $lib || :'\n    else\n      _lt_dsymutil=\n    fi\n    ;;\n  esac\n\nfor ac_header in dlfcn.h\ndo :\n  ac_fn_c_check_header_compile \"$LINENO\" \"dlfcn.h\" \"ac_cv_header_dlfcn_h\" \"$ac_includes_default\n\"\nif test \"x$ac_cv_header_dlfcn_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_DLFCN_H 1\n_ACEOF\n\nfi\n\ndone\n\n\n\n\n\n# Set options\n\n\n\n        enable_dlopen=no\n\n\n  enable_win32_dll=no\n\n\n            # Check whether --enable-shared was given.\nif test \"${enable_shared+set}\" = set; then :\n  enableval=$enable_shared; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_shared=yes ;;\n    no) enable_shared=no ;;\n    *)\n      enable_shared=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_shared=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  enable_shared=yes\nfi\n\n\n\n\n\n\n\n\n\n  # Check whether --enable-static was given.\nif test \"${enable_static+set}\" = set; then :\n  enableval=$enable_static; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_static=yes ;;\n    no) enable_static=no ;;\n    *)\n     enable_static=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_static=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  enable_static=yes\nfi\n\n\n\n\n\n\n\n\n\n\n# Check whether --with-pic was given.\nif test \"${with_pic+set}\" = set; then :\n  withval=$with_pic; lt_p=${PACKAGE-default}\n    case $withval in\n    yes|no) pic_mode=$withval ;;\n    *)\n      pic_mode=default\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for lt_pkg in $withval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$lt_pkg\" = \"X$lt_p\"; then\n\t  pic_mode=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  pic_mode=default\nfi\n\n\ntest -z \"$pic_mode\" && pic_mode=default\n\n\n\n\n\n\n\n  # Check whether --enable-fast-install was given.\nif test \"${enable_fast_install+set}\" = set; then :\n  enableval=$enable_fast_install; p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_fast_install=yes ;;\n    no) enable_fast_install=no ;;\n    *)\n      enable_fast_install=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_fast_install=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac\nelse\n  enable_fast_install=yes\nfi\n\n\n\n\n\n\n\n\n\n\n\n# This can be used to rebuild libtool when needed\nLIBTOOL_DEPS=\"$ltmain\"\n\n# Always use our own libtool.\nLIBTOOL='$(SHELL) $(top_builddir)/libtool'\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\ntest -z \"$LN_S\" && LN_S=\"ln -s\"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nif test -n \"${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for objdir\" >&5\n$as_echo_n \"checking for objdir... \" >&6; }\nif ${lt_cv_objdir+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  rm -f .libs 2>/dev/null\nmkdir .libs 2>/dev/null\nif test -d .libs; then\n  lt_cv_objdir=.libs\nelse\n  # MS-DOS does not allow filenames that begin with a dot.\n  lt_cv_objdir=_libs\nfi\nrmdir .libs 2>/dev/null\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_objdir\" >&5\n$as_echo \"$lt_cv_objdir\" >&6; }\nobjdir=$lt_cv_objdir\n\n\n\n\n\ncat >>confdefs.h <<_ACEOF\n#define LT_OBJDIR \"$lt_cv_objdir/\"\n_ACEOF\n\n\n\n\ncase $host_os in\naix3*)\n  # AIX sometimes has problems with the GCC collect2 program.  For some\n  # reason, if we set the COLLECT_NAMES environment variable, the problems\n  # vanish in a puff of smoke.\n  if test \"X${COLLECT_NAMES+set}\" != Xset; then\n    COLLECT_NAMES=\n    export COLLECT_NAMES\n  fi\n  ;;\nesac\n\n# Global variables:\nofile=libtool\ncan_build_shared=yes\n\n# All known linkers require a `.a' archive for static linking (except MSVC,\n# which needs '.lib').\nlibext=a\n\nwith_gnu_ld=\"$lt_cv_prog_gnu_ld\"\n\nold_CC=\"$CC\"\nold_CFLAGS=\"$CFLAGS\"\n\n# Set sane defaults for various variables\ntest -z \"$CC\" && CC=cc\ntest -z \"$LTCC\" && LTCC=$CC\ntest -z \"$LTCFLAGS\" && LTCFLAGS=$CFLAGS\ntest -z \"$LD\" && LD=ld\ntest -z \"$ac_objext\" && ac_objext=o\n\nfor cc_temp in $compiler\"\"; do\n  case $cc_temp in\n    compile | *[\\\\/]compile | ccache | *[\\\\/]ccache ) ;;\n    distcc | *[\\\\/]distcc | purify | *[\\\\/]purify ) ;;\n    \\-*) ;;\n    *) break;;\n  esac\ndone\ncc_basename=`$ECHO \"$cc_temp\" | $SED \"s%.*/%%; s%^$host_alias-%%\"`\n\n\n# Only perform the check for file, if the check method requires it\ntest -z \"$MAGIC_CMD\" && MAGIC_CMD=file\ncase $deplibs_check_method in\nfile_magic*)\n  if test \"$file_magic_cmd\" = '$MAGIC_CMD'; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ${ac_tool_prefix}file\" >&5\n$as_echo_n \"checking for ${ac_tool_prefix}file... \" >&6; }\nif ${lt_cv_path_MAGIC_CMD+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $MAGIC_CMD in\n[\\\\/*] |  ?:[\\\\/]*)\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  ac_dummy=\"/usr/bin$PATH_SEPARATOR$PATH\"\n  for ac_dir in $ac_dummy; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/${ac_tool_prefix}file; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/${ac_tool_prefix}file\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\n  MAGIC_CMD=\"$lt_save_MAGIC_CMD\"\n  ;;\nesac\nfi\n\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD\" >&5\n$as_echo \"$MAGIC_CMD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n\n\n\nif test -z \"$lt_cv_path_MAGIC_CMD\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for file\" >&5\n$as_echo_n \"checking for file... \" >&6; }\nif ${lt_cv_path_MAGIC_CMD+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  case $MAGIC_CMD in\n[\\\\/*] |  ?:[\\\\/]*)\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  ac_dummy=\"/usr/bin$PATH_SEPARATOR$PATH\"\n  for ac_dir in $ac_dummy; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/file; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/file\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\n  MAGIC_CMD=\"$lt_save_MAGIC_CMD\"\n  ;;\nesac\nfi\n\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $MAGIC_CMD\" >&5\n$as_echo \"$MAGIC_CMD\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\n  else\n    MAGIC_CMD=:\n  fi\nfi\n\n  fi\n  ;;\nesac\n\n# Use C for the default configuration in the libtool script\n\nlt_save_CC=\"$CC\"\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\n\n# Source file extension for C test sources.\nac_ext=c\n\n# Object file extension for compiled C test sources.\nobjext=o\nobjext=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"int some_variable = 0;\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='int main(){return(0);}'\n\n\n\n\n\n\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n\n# Save the default compiler, since it gets overwritten when the other\n# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.\ncompiler_DEFAULT=$CC\n\n# save warnings/boilerplate of simple test code\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_compile_test_code\" >conftest.$ac_ext\neval \"$ac_compile\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_compiler_boilerplate=`cat conftest.err`\n$RM conftest*\n\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_link_test_code\" >conftest.$ac_ext\neval \"$ac_link\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_linker_boilerplate=`cat conftest.err`\n$RM -r conftest*\n\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n\nlt_prog_compiler_no_builtin_flag=\n\nif test \"$GCC\" = yes; then\n  case $cc_basename in\n  nvcc*)\n    lt_prog_compiler_no_builtin_flag=' -Xcompiler -fno-builtin' ;;\n  *)\n    lt_prog_compiler_no_builtin_flag=' -fno-builtin' ;;\n  esac\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -fno-rtti -fno-exceptions\" >&5\n$as_echo_n \"checking if $compiler supports -fno-rtti -fno-exceptions... \" >&6; }\nif ${lt_cv_prog_compiler_rtti_exceptions+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_rtti_exceptions=no\n   ac_outfile=conftest.$ac_objext\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"-fno-rtti -fno-exceptions\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_rtti_exceptions=yes\n     fi\n   fi\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_rtti_exceptions\" >&5\n$as_echo \"$lt_cv_prog_compiler_rtti_exceptions\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_rtti_exceptions\" = xyes; then\n    lt_prog_compiler_no_builtin_flag=\"$lt_prog_compiler_no_builtin_flag -fno-rtti -fno-exceptions\"\nelse\n    :\nfi\n\nfi\n\n\n\n\n\n\n  lt_prog_compiler_wl=\nlt_prog_compiler_pic=\nlt_prog_compiler_static=\n\n\n  if test \"$GCC\" = yes; then\n    lt_prog_compiler_wl='-Wl,'\n    lt_prog_compiler_static='-static'\n\n    case $host_os in\n      aix*)\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\tlt_prog_compiler_static='-Bstatic'\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            lt_prog_compiler_pic='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the `-m68020' flag to GCC prevents building anything better,\n            # like `-m68040'.\n            lt_prog_compiler_pic='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      lt_prog_compiler_pic='-DDLL_EXPORT'\n      ;;\n\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      lt_prog_compiler_pic='-fno-common'\n      ;;\n\n    haiku*)\n      # PIC is the default for Haiku.\n      # The \"-static\" flag exists, but is broken.\n      lt_prog_compiler_static=\n      ;;\n\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t# +Z the default\n\t;;\n      *)\n\tlt_prog_compiler_pic='-fPIC'\n\t;;\n      esac\n      ;;\n\n    interix[3-9]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n\n    msdosdjgpp*)\n      # Just because we use GCC doesn't mean we suddenly get shared libraries\n      # on systems that don't support them.\n      lt_prog_compiler_can_build_shared=no\n      enable_shared=no\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      lt_prog_compiler_pic='-fPIC -shared'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\tlt_prog_compiler_pic=-Kconform_pic\n      fi\n      ;;\n\n    *)\n      lt_prog_compiler_pic='-fPIC'\n      ;;\n    esac\n\n    case $cc_basename in\n    nvcc*) # Cuda Compiler Driver 2.2\n      lt_prog_compiler_wl='-Xlinker '\n      if test -n \"$lt_prog_compiler_pic\"; then\n        lt_prog_compiler_pic=\"-Xcompiler $lt_prog_compiler_pic\"\n      fi\n      ;;\n    esac\n  else\n    # PORTME Check for flag to pass linker flags through the system compiler.\n    case $host_os in\n    aix*)\n      lt_prog_compiler_wl='-Wl,'\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\tlt_prog_compiler_static='-Bstatic'\n      else\n\tlt_prog_compiler_static='-bnso -bI:/lib/syscalls.exp'\n      fi\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      lt_prog_compiler_pic='-DDLL_EXPORT'\n      ;;\n\n    hpux9* | hpux10* | hpux11*)\n      lt_prog_compiler_wl='-Wl,'\n      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but\n      # not for PA HP-UX.\n      case $host_cpu in\n      hppa*64*|ia64*)\n\t# +Z the default\n\t;;\n      *)\n\tlt_prog_compiler_pic='+Z'\n\t;;\n      esac\n      # Is there a better lt_prog_compiler_static that works with the bundled CC?\n      lt_prog_compiler_static='${wl}-a ${wl}archive'\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      lt_prog_compiler_wl='-Wl,'\n      # PIC (with -KPIC) is the default.\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n      case $cc_basename in\n      # old Intel for x86_64 which still supported -KPIC.\n      ecc*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-KPIC'\n\tlt_prog_compiler_static='-static'\n        ;;\n      # icc used to be incompatible with GCC.\n      # ICC 10 doesn't accept -KPIC any more.\n      icc* | ifort*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-fPIC'\n\tlt_prog_compiler_static='-static'\n        ;;\n      # Lahey Fortran 8.1.\n      lf95*)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='--shared'\n\tlt_prog_compiler_static='--static'\n\t;;\n      nagfor*)\n\t# NAG Fortran compiler\n\tlt_prog_compiler_wl='-Wl,-Wl,,'\n\tlt_prog_compiler_pic='-PIC'\n\tlt_prog_compiler_static='-Bstatic'\n\t;;\n      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)\n        # Portland Group compilers (*not* the Pentium gcc compiler,\n\t# which looks to be a dead project)\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-fpic'\n\tlt_prog_compiler_static='-Bstatic'\n        ;;\n      ccc*)\n        lt_prog_compiler_wl='-Wl,'\n        # All Alpha code is PIC.\n        lt_prog_compiler_static='-non_shared'\n        ;;\n      xl* | bgxl* | bgf* | mpixl*)\n\t# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene\n\tlt_prog_compiler_wl='-Wl,'\n\tlt_prog_compiler_pic='-qpic'\n\tlt_prog_compiler_static='-qstaticlink'\n\t;;\n      *)\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ Ceres\\ Fortran* | *Sun*Fortran*\\ [1-7].* | *Sun*Fortran*\\ 8.[0-3]*)\n\t  # Sun Fortran 8.3 passes all unrecognized flags to the linker\n\t  lt_prog_compiler_pic='-KPIC'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  lt_prog_compiler_wl=''\n\t  ;;\n\t*Sun\\ F* | *Sun*Fortran*)\n\t  lt_prog_compiler_pic='-KPIC'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  lt_prog_compiler_wl='-Qoption ld '\n\t  ;;\n\t*Sun\\ C*)\n\t  # Sun C 5.9\n\t  lt_prog_compiler_pic='-KPIC'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  lt_prog_compiler_wl='-Wl,'\n\t  ;;\n        *Intel*\\ [CF]*Compiler*)\n\t  lt_prog_compiler_wl='-Wl,'\n\t  lt_prog_compiler_pic='-fPIC'\n\t  lt_prog_compiler_static='-static'\n\t  ;;\n\t*Portland\\ Group*)\n\t  lt_prog_compiler_wl='-Wl,'\n\t  lt_prog_compiler_pic='-fpic'\n\t  lt_prog_compiler_static='-Bstatic'\n\t  ;;\n\tesac\n\t;;\n      esac\n      ;;\n\n    newsos6)\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      lt_prog_compiler_pic='-fPIC -shared'\n      ;;\n\n    osf3* | osf4* | osf5*)\n      lt_prog_compiler_wl='-Wl,'\n      # All OSF/1 code is PIC.\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    rdos*)\n      lt_prog_compiler_static='-non_shared'\n      ;;\n\n    solaris*)\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      case $cc_basename in\n      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)\n\tlt_prog_compiler_wl='-Qoption ld ';;\n      *)\n\tlt_prog_compiler_wl='-Wl,';;\n      esac\n      ;;\n\n    sunos4*)\n      lt_prog_compiler_wl='-Qoption ld '\n      lt_prog_compiler_pic='-PIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    sysv4 | sysv4.2uw2* | sysv4.3*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec ;then\n\tlt_prog_compiler_pic='-Kconform_pic'\n\tlt_prog_compiler_static='-Bstatic'\n      fi\n      ;;\n\n    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_pic='-KPIC'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    unicos*)\n      lt_prog_compiler_wl='-Wl,'\n      lt_prog_compiler_can_build_shared=no\n      ;;\n\n    uts4*)\n      lt_prog_compiler_pic='-pic'\n      lt_prog_compiler_static='-Bstatic'\n      ;;\n\n    *)\n      lt_prog_compiler_can_build_shared=no\n      ;;\n    esac\n  fi\n\ncase $host_os in\n  # For platforms which do not support PIC, -DPIC is meaningless:\n  *djgpp*)\n    lt_prog_compiler_pic=\n    ;;\n  *)\n    lt_prog_compiler_pic=\"$lt_prog_compiler_pic -DPIC\"\n    ;;\nesac\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $compiler option to produce PIC\" >&5\n$as_echo_n \"checking for $compiler option to produce PIC... \" >&6; }\nif ${lt_cv_prog_compiler_pic+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_pic=$lt_prog_compiler_pic\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic\" >&5\n$as_echo \"$lt_cv_prog_compiler_pic\" >&6; }\nlt_prog_compiler_pic=$lt_cv_prog_compiler_pic\n\n#\n# Check to make sure the PIC flag actually works.\n#\nif test -n \"$lt_prog_compiler_pic\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler PIC flag $lt_prog_compiler_pic works\" >&5\n$as_echo_n \"checking if $compiler PIC flag $lt_prog_compiler_pic works... \" >&6; }\nif ${lt_cv_prog_compiler_pic_works+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_pic_works=no\n   ac_outfile=conftest.$ac_objext\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"$lt_prog_compiler_pic -DPIC\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_pic_works=yes\n     fi\n   fi\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_pic_works\" >&5\n$as_echo \"$lt_cv_prog_compiler_pic_works\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_pic_works\" = xyes; then\n    case $lt_prog_compiler_pic in\n     \"\" | \" \"*) ;;\n     *) lt_prog_compiler_pic=\" $lt_prog_compiler_pic\" ;;\n     esac\nelse\n    lt_prog_compiler_pic=\n     lt_prog_compiler_can_build_shared=no\nfi\n\nfi\n\n\n\n\n\n\n\n\n\n\n\n#\n# Check to make sure the static flag actually works.\n#\nwl=$lt_prog_compiler_wl eval lt_tmp_static_flag=\\\"$lt_prog_compiler_static\\\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler static flag $lt_tmp_static_flag works\" >&5\n$as_echo_n \"checking if $compiler static flag $lt_tmp_static_flag works... \" >&6; }\nif ${lt_cv_prog_compiler_static_works+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_static_works=no\n   save_LDFLAGS=\"$LDFLAGS\"\n   LDFLAGS=\"$LDFLAGS $lt_tmp_static_flag\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&5\n       $ECHO \"$_lt_linker_boilerplate\" | $SED '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         lt_cv_prog_compiler_static_works=yes\n       fi\n     else\n       lt_cv_prog_compiler_static_works=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=\"$save_LDFLAGS\"\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_static_works\" >&5\n$as_echo \"$lt_cv_prog_compiler_static_works\" >&6; }\n\nif test x\"$lt_cv_prog_compiler_static_works\" = xyes; then\n    :\nelse\n    lt_prog_compiler_static=\nfi\n\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif ${lt_cv_prog_compiler_c_o+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o\" >&6; }\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $compiler supports -c -o file.$ac_objext\" >&5\n$as_echo_n \"checking if $compiler supports -c -o file.$ac_objext... \" >&6; }\nif ${lt_cv_prog_compiler_c_o+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler_c_o=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [^ ]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&5)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&5\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&5\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       lt_cv_prog_compiler_c_o=yes\n     fi\n   fi\n   chmod u+w . 2>&5\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler_c_o\" >&5\n$as_echo \"$lt_cv_prog_compiler_c_o\" >&6; }\n\n\n\n\nhard_links=\"nottested\"\nif test \"$lt_cv_prog_compiler_c_o\" = no && test \"$need_locks\" != no; then\n  # do not overwrite the value of need_locks provided by the user\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if we can lock with hard links\" >&5\n$as_echo_n \"checking if we can lock with hard links... \" >&6; }\n  hard_links=yes\n  $RM conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hard_links\" >&5\n$as_echo \"$hard_links\" >&6; }\n  if test \"$hard_links\" = no; then\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: \\`$CC' does not support \\`-c -o', so \\`make -j' may be unsafe\" >&5\n$as_echo \"$as_me: WARNING: \\`$CC' does not support \\`-c -o', so \\`make -j' may be unsafe\" >&2;}\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the $compiler linker ($LD) supports shared libraries\" >&5\n$as_echo_n \"checking whether the $compiler linker ($LD) supports shared libraries... \" >&6; }\n\n  runpath_var=\n  allow_undefined_flag=\n  always_export_symbols=no\n  archive_cmds=\n  archive_expsym_cmds=\n  compiler_needs_object=no\n  enable_shared_with_static_runtimes=no\n  export_dynamic_flag_spec=\n  export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  hardcode_automatic=no\n  hardcode_direct=no\n  hardcode_direct_absolute=no\n  hardcode_libdir_flag_spec=\n  hardcode_libdir_separator=\n  hardcode_minus_L=no\n  hardcode_shlibpath_var=unsupported\n  inherit_rpath=no\n  link_all_deplibs=unknown\n  module_cmds=\n  module_expsym_cmds=\n  old_archive_from_new_cmds=\n  old_archive_from_expsyms_cmds=\n  thread_safe_flag_spec=\n  whole_archive_flag_spec=\n  # include_expsyms should be a list of space-separated symbols to be *always*\n  # included in the symbol list\n  include_expsyms=\n  # exclude_expsyms can be an extended regexp of symbols to exclude\n  # it will be wrapped by ` (' and `)$', so one must not match beginning or\n  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',\n  # as well as any symbol that contains `d'.\n  exclude_expsyms='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*'\n  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out\n  # platforms (ab)use it in PIC code, but their linkers get confused if\n  # the symbol is explicitly referenced.  Since portable code cannot\n  # rely on this symbol name, it's probably fine to never include it in\n  # preloaded symbol tables.\n  # Exclude shared library initialization/finalization symbols.\n  extract_expsyms_cmds=\n\n  case $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    # FIXME: the MSVC++ port hasn't been tested in a loooong time\n    # When not using gcc, we currently assume that we are using\n    # Microsoft Visual C++.\n    if test \"$GCC\" != yes; then\n      with_gnu_ld=no\n    fi\n    ;;\n  interix*)\n    # we just hope/assume this is gcc and not c89 (= MSVC++)\n    with_gnu_ld=yes\n    ;;\n  openbsd*)\n    with_gnu_ld=no\n    ;;\n  linux* | k*bsd*-gnu | gnu*)\n    link_all_deplibs=no\n    ;;\n  esac\n\n  ld_shlibs=yes\n\n  # On some targets, GNU ld is compatible enough with the native linker\n  # that we're better off using the native interface for both.\n  lt_use_gnu_ld_interface=no\n  if test \"$with_gnu_ld\" = yes; then\n    case $host_os in\n      aix*)\n\t# The AIX port of GNU ld has always aspired to compatibility\n\t# with the native linker.  However, as the warning in the GNU ld\n\t# block says, versions before 2.19.5* couldn't really create working\n\t# shared libraries, regardless of the interface used.\n\tcase `$LD -v 2>&1` in\n\t  *\\ \\(GNU\\ Binutils\\)\\ 2.19.5*) ;;\n\t  *\\ \\(GNU\\ Binutils\\)\\ 2.[2-9]*) ;;\n\t  *\\ \\(GNU\\ Binutils\\)\\ [3-9]*) ;;\n\t  *)\n\t    lt_use_gnu_ld_interface=yes\n\t    ;;\n\tesac\n\t;;\n      *)\n\tlt_use_gnu_ld_interface=yes\n\t;;\n    esac\n  fi\n\n  if test \"$lt_use_gnu_ld_interface\" = yes; then\n    # If archive_cmds runs LD, not CC, wlarc should be empty\n    wlarc='${wl}'\n\n    # Set some defaults for GNU ld with shared library support. These\n    # are reset later if shared libraries are not supported. Putting them\n    # here allows them to be overridden if necessary.\n    runpath_var=LD_RUN_PATH\n    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n    export_dynamic_flag_spec='${wl}--export-dynamic'\n    # ancient GNU ld didn't support --whole-archive et. al.\n    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then\n      whole_archive_flag_spec=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n    else\n      whole_archive_flag_spec=\n    fi\n    supports_anon_versioning=no\n    case `$LD -v 2>&1` in\n      *GNU\\ gold*) supports_anon_versioning=yes ;;\n      *\\ [01].* | *\\ 2.[0-9].* | *\\ 2.10.*) ;; # catch versions < 2.11\n      *\\ 2.11.93.0.2\\ *) supports_anon_versioning=yes ;; # RH7.3 ...\n      *\\ 2.11.92.0.12\\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...\n      *\\ 2.11.*) ;; # other 2.11 versions\n      *) supports_anon_versioning=yes ;;\n    esac\n\n    # See if GNU ld supports shared libraries.\n    case $host_os in\n    aix[3-9]*)\n      # On AIX/PPC, the GNU linker is very broken\n      if test \"$host_cpu\" != ia64; then\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: the GNU linker, at least up to release 2.19, is reported\n*** to be unable to reliably create shared libraries on AIX.\n*** Therefore, libtool is disabling shared libraries support.  If you\n*** really care for shared libraries, you may want to install binutils\n*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.\n*** You will then need to restart the configuration process.\n\n_LT_EOF\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            archive_expsym_cmds=''\n        ;;\n      m68k)\n            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            hardcode_libdir_flag_spec='-L$libdir'\n            hardcode_minus_L=yes\n        ;;\n      esac\n      ;;\n\n    beos*)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tallow_undefined_flag=unsupported\n\t# Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t# support --undefined.  This deserves some investigation.  FIXME\n\tarchive_cmds='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # _LT_TAGVAR(hardcode_libdir_flag_spec, ) is actually meaningless,\n      # as there is no search path for DLLs.\n      hardcode_libdir_flag_spec='-L$libdir'\n      export_dynamic_flag_spec='${wl}--export-all-symbols'\n      allow_undefined_flag=unsupported\n      always_export_symbols=no\n      enable_shared_with_static_runtimes=yes\n      export_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[BCDGRS][ ]/s/.*[ ]\\([^ ]*\\)/\\1 DATA/;s/^.*[ ]__nm__\\([^ ]*\\)[ ][^ ]*/\\1 DATA/;/^I[ ]/d;/^[AITW][ ]/s/.* //'\\'' | sort | uniq > $export_symbols'\n      exclude_expsyms='[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname'\n\n      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n        archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t# If the export-symbols file already is a .def file (1st line\n\t# is EXPORTS), use it as is; otherwise, prepend...\n\tarchive_expsym_cmds='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t  cp $export_symbols $output_objdir/$soname.def;\n\telse\n\t  echo EXPORTS > $output_objdir/$soname.def;\n\t  cat $export_symbols >> $output_objdir/$soname.def;\n\tfi~\n\t$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    haiku*)\n      archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      link_all_deplibs=yes\n      ;;\n\n    interix[3-9]*)\n      hardcode_direct=no\n      hardcode_shlibpath_var=no\n      hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n      export_dynamic_flag_spec='${wl}-E'\n      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n      # Instead, shared libraries are loaded at an image base (0x10000000 by\n      # default) and relocated if they conflict, which is a slow very memory\n      # consuming and fragmenting process.  To avoid this, we pick a random,\n      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n      archive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      archive_expsym_cmds='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      ;;\n\n    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)\n      tmp_diet=no\n      if test \"$host_os\" = linux-dietlibc; then\n\tcase $cc_basename in\n\t  diet\\ *) tmp_diet=yes;;\t# linux-dietlibc with static linking (!diet-dyn)\n\tesac\n      fi\n      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \\\n\t && test \"$tmp_diet\" = no\n      then\n\ttmp_addflag=' $pic_flag'\n\ttmp_sharedflag='-shared'\n\tcase $cc_basename,$host_cpu in\n        pgcc*)\t\t\t\t# Portland Group C compiler\n\t  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag'\n\t  ;;\n\tpgf77* | pgf90* | pgf95* | pgfortran*)\n\t\t\t\t\t# Portland Group f77 and f90 compilers\n\t  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag -Mnomain' ;;\n\tecc*,ia64* | icc*,ia64*)\t# Intel C compiler on ia64\n\t  tmp_addflag=' -i_dynamic' ;;\n\tefc*,ia64* | ifort*,ia64*)\t# Intel Fortran compiler on ia64\n\t  tmp_addflag=' -i_dynamic -nofor_main' ;;\n\tifc* | ifort*)\t\t\t# Intel Fortran compiler\n\t  tmp_addflag=' -nofor_main' ;;\n\tlf95*)\t\t\t\t# Lahey Fortran 8.1\n\t  whole_archive_flag_spec=\n\t  tmp_sharedflag='--shared' ;;\n\txl[cC]* | bgxl[cC]* | mpixl[cC]*) # IBM XL C 8.0 on PPC (deal with xlf below)\n\t  tmp_sharedflag='-qmkshrobj'\n\t  tmp_addflag= ;;\n\tnvcc*)\t# Cuda Compiler Driver 2.2\n\t  whole_archive_flag_spec='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  compiler_needs_object=yes\n\t  ;;\n\tesac\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ C*)\t\t\t# Sun C 5.9\n\t  whole_archive_flag_spec='${wl}--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  compiler_needs_object=yes\n\t  tmp_sharedflag='-G' ;;\n\t*Sun\\ F*)\t\t\t# Sun Fortran 8.3\n\t  tmp_sharedflag='-G' ;;\n\tesac\n\tarchive_cmds='$CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\n        if test \"x$supports_anon_versioning\" = xyes; then\n          archive_expsym_cmds='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t    cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t    echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t    $CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'\n        fi\n\n\tcase $cc_basename in\n\txlf* | bgf* | bgxlf* | mpixlf*)\n\t  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself\n\t  whole_archive_flag_spec='--whole-archive$convenience --no-whole-archive'\n\t  hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n\t  archive_cmds='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'\n\t  if test \"x$supports_anon_versioning\" = xyes; then\n\t    archive_expsym_cmds='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t      cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t      echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'\n\t  fi\n\t  ;;\n\tesac\n      else\n        ld_shlibs=no\n      fi\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\tarchive_cmds='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'\n\twlarc=\n      else\n\tarchive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      fi\n      ;;\n\n    solaris*)\n      if $LD -v 2>&1 | $GREP 'BFD 2\\.8' > /dev/null; then\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: The releases 2.8.* of the GNU linker cannot reliably\n*** create shared libraries on Solaris systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.9.1 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tarchive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)\n      case `$LD -v 2>&1` in\n        *\\ [01].* | *\\ 2.[0-9].* | *\\ 2.1[0-5].*)\n\tld_shlibs=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not\n*** reliably create shared libraries on SCO systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n\t;;\n\t*)\n\t  # For security reasons, it is highly recommended that you always\n\t  # use absolute paths for naming shared libraries, and exclude the\n\t  # DT_RUNPATH tag from executables and libraries.  But doing so\n\t  # requires that you compile everything twice, which is a pain.\n\t  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t    hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n\t    archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    archive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t  else\n\t    ld_shlibs=no\n\t  fi\n\t;;\n      esac\n      ;;\n\n    sunos4*)\n      archive_cmds='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      wlarc=\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    *)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\tarchive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\tarchive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\tld_shlibs=no\n      fi\n      ;;\n    esac\n\n    if test \"$ld_shlibs\" = no; then\n      runpath_var=\n      hardcode_libdir_flag_spec=\n      export_dynamic_flag_spec=\n      whole_archive_flag_spec=\n    fi\n  else\n    # PORTME fill in a description of your system's linker (not GNU ld)\n    case $host_os in\n    aix3*)\n      allow_undefined_flag=unsupported\n      always_export_symbols=yes\n      archive_expsym_cmds='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'\n      # Note: this linker hardcodes the directories in LIBPATH if there\n      # are no directories specified by -L.\n      hardcode_minus_L=yes\n      if test \"$GCC\" = yes && test -z \"$lt_prog_compiler_static\"; then\n\t# Neither direct hardcoding nor static linking is supported with a\n\t# broken collect2.\n\thardcode_direct=unsupported\n      fi\n      ;;\n\n    aix[4-9]*)\n      if test \"$host_cpu\" = ia64; then\n\t# On IA64, the linker does run time linking by default, so we don't\n\t# have to do anything special.\n\taix_use_runtimelinking=no\n\texp_sym_flag='-Bexport'\n\tno_entry_flag=\"\"\n      else\n\t# If we're using GNU nm, then we don't want the \"-C\" option.\n\t# -C means demangle to AIX nm, but means don't demangle with GNU nm\n\t# Also, AIX nm treats weak defined symbols like other global\n\t# defined symbols, whereas GNU nm marks them as \"W\".\n\tif $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n\t  export_symbols_cmds='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"W\")) && (substr(\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\telse\n\t  export_symbols_cmds='$NM -BCpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && (substr(\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\tfi\n\taix_use_runtimelinking=no\n\n\t# Test if we are trying to use run time linking or normal\n\t# AIX style linking. If -brtl is somewhere in LDFLAGS, we\n\t# need to do runtime linking.\n\tcase $host_os in aix4.[23]|aix4.[23].*|aix[5-9]*)\n\t  for ld_flag in $LDFLAGS; do\n\t  if (test $ld_flag = \"-brtl\" || test $ld_flag = \"-Wl,-brtl\"); then\n\t    aix_use_runtimelinking=yes\n\t    break\n\t  fi\n\t  done\n\t  ;;\n\tesac\n\n\texp_sym_flag='-bexport'\n\tno_entry_flag='-bnoentry'\n      fi\n\n      # When large executables or shared objects are built, AIX ld can\n      # have problems creating the table of contents.  If linking a library\n      # or program results in \"error TOC overflow\" add -mminimal-toc to\n      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n      archive_cmds=''\n      hardcode_direct=yes\n      hardcode_direct_absolute=yes\n      hardcode_libdir_separator=':'\n      link_all_deplibs=yes\n      file_list_spec='${wl}-f,'\n\n      if test \"$GCC\" = yes; then\n\tcase $host_os in aix4.[012]|aix4.[012].*)\n\t# We only want to do this on AIX 4.2 and lower, the check\n\t# below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`${CC} -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t   strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t  # We have reworked collect2\n\t  :\n\t  else\n\t  # We have old collect2\n\t  hardcode_direct=unsupported\n\t  # It fails to find uninstalled libraries when the uninstalled\n\t  # path is not listed in the libpath.  Setting hardcode_minus_L\n\t  # to unsupported forces relinking\n\t  hardcode_minus_L=yes\n\t  hardcode_libdir_flag_spec='-L$libdir'\n\t  hardcode_libdir_separator=\n\t  fi\n\t  ;;\n\tesac\n\tshared_flag='-shared'\n\tif test \"$aix_use_runtimelinking\" = yes; then\n\t  shared_flag=\"$shared_flag \"'${wl}-G'\n\tfi\n\tlink_all_deplibs=no\n      else\n\t# not using gcc\n\tif test \"$host_cpu\" = ia64; then\n\t# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t# chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n\telse\n\t  if test \"$aix_use_runtimelinking\" = yes; then\n\t    shared_flag='${wl}-G'\n\t  else\n\t    shared_flag='${wl}-bM:SRE'\n\t  fi\n\tfi\n      fi\n\n      export_dynamic_flag_spec='${wl}-bexpall'\n      # It seems that -bexpall does not export symbols beginning with\n      # underscore (_), so it is better to generate a list of symbols to export.\n      always_export_symbols=yes\n      if test \"$aix_use_runtimelinking\" = yes; then\n\t# Warning - without using the other runtime loading flags (-brtl),\n\t# -berok will link without error, but may produce a broken library.\n\tallow_undefined_flag='-berok'\n        # Determine the default libpath from the value encoded in an\n        # empty executable.\n        if test \"${lt_cv_aix_libpath+set}\" = set; then\n  aix_libpath=$lt_cv_aix_libpath\nelse\n  if ${lt_cv_aix_libpath_+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n\n  lt_aix_libpath_sed='\n      /Import File Strings/,/^$/ {\n\t  /^0/ {\n\t      s/^0  *\\([^ ]*\\) *$/\\1/\n\t      p\n\t  }\n      }'\n  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  # Check for a 64-bit object if we didn't find anything.\n  if test -z \"$lt_cv_aix_libpath_\"; then\n    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  fi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  if test -z \"$lt_cv_aix_libpath_\"; then\n    lt_cv_aix_libpath_=\"/usr/lib:/lib\"\n  fi\n\nfi\n\n  aix_libpath=$lt_cv_aix_libpath_\nfi\n\n        hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n        archive_expsym_cmds='$CC -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then func_echo_all \"${wl}${allow_undefined_flag}\"; else :; fi` '\"\\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n      else\n\tif test \"$host_cpu\" = ia64; then\n\t  hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib'\n\t  allow_undefined_flag=\"-z nodefs\"\n\t  archive_expsym_cmds=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$exp_sym_flag:\\$export_symbols\"\n\telse\n\t # Determine the default libpath from the value encoded in an\n\t # empty executable.\n\t if test \"${lt_cv_aix_libpath+set}\" = set; then\n  aix_libpath=$lt_cv_aix_libpath\nelse\n  if ${lt_cv_aix_libpath_+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n\n  lt_aix_libpath_sed='\n      /Import File Strings/,/^$/ {\n\t  /^0/ {\n\t      s/^0  *\\([^ ]*\\) *$/\\1/\n\t      p\n\t  }\n      }'\n  lt_cv_aix_libpath_=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  # Check for a 64-bit object if we didn't find anything.\n  if test -z \"$lt_cv_aix_libpath_\"; then\n    lt_cv_aix_libpath_=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  fi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n  if test -z \"$lt_cv_aix_libpath_\"; then\n    lt_cv_aix_libpath_=\"/usr/lib:/lib\"\n  fi\n\nfi\n\n  aix_libpath=$lt_cv_aix_libpath_\nfi\n\n\t hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\t  # Warning - without using the other run time loading flags,\n\t  # -berok will link without error, but may produce a broken library.\n\t  no_undefined_flag=' ${wl}-bernotok'\n\t  allow_undefined_flag=' ${wl}-berok'\n\t  if test \"$with_gnu_ld\" = yes; then\n\t    # We only use this code for GNU lds that support --whole-archive.\n\t    whole_archive_flag_spec='${wl}--whole-archive$convenience ${wl}--no-whole-archive'\n\t  else\n\t    # Exported symbols can be pulled into shared objects from archives\n\t    whole_archive_flag_spec='$convenience'\n\t  fi\n\t  archive_cmds_need_lc=yes\n\t  # This is similar to how AIX traditionally builds its shared libraries.\n\t  archive_expsym_cmds=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'\n\tfi\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            archive_cmds='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            archive_expsym_cmds=''\n        ;;\n      m68k)\n            archive_cmds='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            hardcode_libdir_flag_spec='-L$libdir'\n            hardcode_minus_L=yes\n        ;;\n      esac\n      ;;\n\n    bsdi[45]*)\n      export_dynamic_flag_spec=-rdynamic\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # When not using gcc, we currently assume that we are using\n      # Microsoft Visual C++.\n      # hardcode_libdir_flag_spec is actually meaningless, as there is\n      # no search path for DLLs.\n      case $cc_basename in\n      cl*)\n\t# Native MSVC\n\thardcode_libdir_flag_spec=' '\n\tallow_undefined_flag=unsupported\n\talways_export_symbols=yes\n\tfile_list_spec='@'\n\t# Tell ltmain to make .lib files, not .a files.\n\tlibext=lib\n\t# Tell ltmain to make .dll files, not .so files.\n\tshrext_cmds=\".dll\"\n\t# FIXME: Setting linknames here is a bad hack.\n\tarchive_cmds='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='\n\tarchive_expsym_cmds='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t    sed -n -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' -e '1\\\\\\!p' < $export_symbols > $output_objdir/$soname.exp;\n\t  else\n\t    sed -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;\n\t  fi~\n\t  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs \"@$tool_output_objdir$soname.exp\" -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~\n\t  linknames='\n\t# The linker will not automatically build a static lib if we build a DLL.\n\t# _LT_TAGVAR(old_archive_from_new_cmds, )='true'\n\tenable_shared_with_static_runtimes=yes\n\texclude_expsyms='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'\n\texport_symbols_cmds='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[BCDGRS][ ]/s/.*[ ]\\([^ ]*\\)/\\1,DATA/'\\'' | $SED -e '\\''/^[AITW][ ]/s/.*[ ]//'\\'' | sort | uniq > $export_symbols'\n\t# Don't use ranlib\n\told_postinstall_cmds='chmod 644 $oldlib'\n\tpostlink_cmds='lt_outputfile=\"@OUTPUT@\"~\n\t  lt_tool_outputfile=\"@TOOL_OUTPUT@\"~\n\t  case $lt_outputfile in\n\t    *.exe|*.EXE) ;;\n\t    *)\n\t      lt_outputfile=\"$lt_outputfile.exe\"\n\t      lt_tool_outputfile=\"$lt_tool_outputfile.exe\"\n\t      ;;\n\t  esac~\n\t  if test \"$MANIFEST_TOOL\" != \":\" && test -f \"$lt_outputfile.manifest\"; then\n\t    $MANIFEST_TOOL -manifest \"$lt_tool_outputfile.manifest\" -outputresource:\"$lt_tool_outputfile\" || exit 1;\n\t    $RM \"$lt_outputfile.manifest\";\n\t  fi'\n\t;;\n      *)\n\t# Assume MSVC wrapper\n\thardcode_libdir_flag_spec=' '\n\tallow_undefined_flag=unsupported\n\t# Tell ltmain to make .lib files, not .a files.\n\tlibext=lib\n\t# Tell ltmain to make .dll files, not .so files.\n\tshrext_cmds=\".dll\"\n\t# FIXME: Setting linknames here is a bad hack.\n\tarchive_cmds='$CC -o $lib $libobjs $compiler_flags `func_echo_all \"$deplibs\" | $SED '\\''s/ -lc$//'\\''` -link -dll~linknames='\n\t# The linker will automatically build a .lib file if we build a DLL.\n\told_archive_from_new_cmds='true'\n\t# FIXME: Should let the user specify the lib program.\n\told_archive_cmds='lib -OUT:$oldlib$oldobjs$old_deplibs'\n\tenable_shared_with_static_runtimes=yes\n\t;;\n      esac\n      ;;\n\n    darwin* | rhapsody*)\n\n\n  archive_cmds_need_lc=no\n  hardcode_direct=no\n  hardcode_automatic=yes\n  hardcode_shlibpath_var=unsupported\n  if test \"$lt_cv_ld_force_load\" = \"yes\"; then\n    whole_archive_flag_spec='`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience ${wl}-force_load,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"`'\n\n  else\n    whole_archive_flag_spec=''\n  fi\n  link_all_deplibs=yes\n  allow_undefined_flag=\"$_lt_dar_allow_undefined\"\n  case $cc_basename in\n     ifort*) _lt_dar_can_shared=yes ;;\n     *) _lt_dar_can_shared=$GCC ;;\n  esac\n  if test \"$_lt_dar_can_shared\" = \"yes\"; then\n    output_verbose_link_cmd=func_echo_all\n    archive_cmds=\"\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod${_lt_dsymutil}\"\n    module_cmds=\"\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dsymutil}\"\n    archive_expsym_cmds=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}\"\n    module_expsym_cmds=\"sed -e 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}\"\n\n  else\n  ld_shlibs=no\n  fi\n\n      ;;\n\n    dgux*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_shlibpath_var=no\n      ;;\n\n    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor\n    # support.  Future versions do this automatically, but an explicit c++rt0.o\n    # does not break anything, and helps significantly (at the cost of a little\n    # extra space).\n    freebsd2.2*)\n      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    # Unfortunately, older versions of FreeBSD 2 do not have this feature.\n    freebsd2.*)\n      archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_direct=yes\n      hardcode_minus_L=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.\n    freebsd* | dragonfly*)\n      archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    hpux9*)\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      else\n\tarchive_cmds='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      fi\n      hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n      hardcode_libdir_separator=:\n      hardcode_direct=yes\n\n      # hardcode_minus_L: Not really in the search PATH,\n      # but as the default location of the library.\n      hardcode_minus_L=yes\n      export_dynamic_flag_spec='${wl}-E'\n      ;;\n\n    hpux10*)\n      if test \"$GCC\" = yes && test \"$with_gnu_ld\" = no; then\n\tarchive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\thardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n\thardcode_libdir_separator=:\n\thardcode_direct=yes\n\thardcode_direct_absolute=yes\n\texport_dynamic_flag_spec='${wl}-E'\n\t# hardcode_minus_L: Not really in the search PATH,\n\t# but as the default location of the library.\n\thardcode_minus_L=yes\n      fi\n      ;;\n\n    hpux11*)\n      if test \"$GCC\" = yes && test \"$with_gnu_ld\" = no; then\n\tcase $host_cpu in\n\thppa*64*)\n\t  archive_cmds='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  archive_cmds='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tesac\n      else\n\tcase $host_cpu in\n\thppa*64*)\n\t  archive_cmds='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\n\t  # Older versions of the 11.00 compiler do not understand -b yet\n\t  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)\n\t  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if $CC understands -b\" >&5\n$as_echo_n \"checking if $CC understands -b... \" >&6; }\nif ${lt_cv_prog_compiler__b+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_prog_compiler__b=no\n   save_LDFLAGS=\"$LDFLAGS\"\n   LDFLAGS=\"$LDFLAGS -b\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&5\n       $ECHO \"$_lt_linker_boilerplate\" | $SED '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         lt_cv_prog_compiler__b=yes\n       fi\n     else\n       lt_cv_prog_compiler__b=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=\"$save_LDFLAGS\"\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_prog_compiler__b\" >&5\n$as_echo \"$lt_cv_prog_compiler__b\" >&6; }\n\nif test x\"$lt_cv_prog_compiler__b\" = xyes; then\n    archive_cmds='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\nelse\n    archive_cmds='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'\nfi\n\n\t  ;;\n\tesac\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\thardcode_libdir_flag_spec='${wl}+b ${wl}$libdir'\n\thardcode_libdir_separator=:\n\n\tcase $host_cpu in\n\thppa*64*|ia64*)\n\t  hardcode_direct=no\n\t  hardcode_shlibpath_var=no\n\t  ;;\n\t*)\n\t  hardcode_direct=yes\n\t  hardcode_direct_absolute=yes\n\t  export_dynamic_flag_spec='${wl}-E'\n\n\t  # hardcode_minus_L: Not really in the search PATH,\n\t  # but as the default location of the library.\n\t  hardcode_minus_L=yes\n\t  ;;\n\tesac\n      fi\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t# Try to use the -exported_symbol ld option, if it does not\n\t# work, assume that -exports_file does not work either and\n\t# implicitly export all symbols.\n\t# This should be the same for all languages, so no per-tag cache variable.\n\t{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether the $host_os linker accepts -exported_symbol\" >&5\n$as_echo_n \"checking whether the $host_os linker accepts -exported_symbol... \" >&6; }\nif ${lt_cv_irix_exported_symbol+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  save_LDFLAGS=\"$LDFLAGS\"\n\t   LDFLAGS=\"$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null\"\n\t   cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nint foo (void) { return 0; }\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  lt_cv_irix_exported_symbol=yes\nelse\n  lt_cv_irix_exported_symbol=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n           LDFLAGS=\"$save_LDFLAGS\"\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_irix_exported_symbol\" >&5\n$as_echo \"$lt_cv_irix_exported_symbol\" >&6; }\n\tif test \"$lt_cv_irix_exported_symbol\" = yes; then\n          archive_expsym_cmds='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'\n\tfi\n      else\n\tarchive_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\tarchive_expsym_cmds='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      inherit_rpath=yes\n      link_all_deplibs=yes\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\tarchive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out\n      else\n\tarchive_cmds='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF\n      fi\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_direct=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    newsos6)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_direct=yes\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      hardcode_shlibpath_var=no\n      ;;\n\n    *nto* | *qnx*)\n      ;;\n\n    openbsd*)\n      if test -f /usr/libexec/ld.so; then\n\thardcode_direct=yes\n\thardcode_shlibpath_var=no\n\thardcode_direct_absolute=yes\n\tif test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n\t  archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'\n\t  hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n\t  export_dynamic_flag_spec='${wl}-E'\n\telse\n\t  case $host_os in\n\t   openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*)\n\t     archive_cmds='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n\t     hardcode_libdir_flag_spec='-R$libdir'\n\t     ;;\n\t   *)\n\t     archive_cmds='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t     hardcode_libdir_flag_spec='${wl}-rpath,$libdir'\n\t     ;;\n\t  esac\n\tfi\n      else\n\tld_shlibs=no\n      fi\n      ;;\n\n    os2*)\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_minus_L=yes\n      allow_undefined_flag=unsupported\n      archive_cmds='$ECHO \"LIBRARY $libname INITINSTANCE\" > $output_objdir/$libname.def~$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo \" SINGLE NONSHARED\" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'\n      old_archive_from_new_cmds='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'\n      ;;\n\n    osf3*)\n      if test \"$GCC\" = yes; then\n\tallow_undefined_flag=' ${wl}-expect_unresolved ${wl}\\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n      else\n\tallow_undefined_flag=' -expect_unresolved \\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      hardcode_libdir_separator=:\n      ;;\n\n    osf4* | osf5*)\t# as osf3* with the addition of -msym flag\n      if test \"$GCC\" = yes; then\n\tallow_undefined_flag=' ${wl}-expect_unresolved ${wl}\\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\thardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir'\n      else\n\tallow_undefined_flag=' -expect_unresolved \\*'\n\tarchive_cmds='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\tarchive_expsym_cmds='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done; printf \"%s\\\\n\" \"-hidden\">> $lib.exp~\n\t$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n \"$verstring\" && $ECHO \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'\n\n\t# Both c and cxx compiler support -rpath directly\n\thardcode_libdir_flag_spec='-rpath $libdir'\n      fi\n      archive_cmds_need_lc='no'\n      hardcode_libdir_separator=:\n      ;;\n\n    solaris*)\n      no_undefined_flag=' -z defs'\n      if test \"$GCC\" = yes; then\n\twlarc='${wl}'\n\tarchive_cmds='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n      else\n\tcase `$CC -V 2>&1` in\n\t*\"Compilers 5.0\"*)\n\t  wlarc=''\n\t  archive_cmds='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  archive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'\n\t  ;;\n\t*)\n\t  wlarc='${wl}'\n\t  archive_cmds='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  archive_expsym_cmds='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n\t  ;;\n\tesac\n      fi\n      hardcode_libdir_flag_spec='-R$libdir'\n      hardcode_shlibpath_var=no\n      case $host_os in\n      solaris2.[0-5] | solaris2.[0-5].*) ;;\n      *)\n\t# The compiler driver will combine and reorder linker options,\n\t# but understands `-z linker_flag'.  GCC discards it without `$wl',\n\t# but is careful enough not to reorder.\n\t# Supported since Solaris 2.6 (maybe 2.5.1?)\n\tif test \"$GCC\" = yes; then\n\t  whole_archive_flag_spec='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'\n\telse\n\t  whole_archive_flag_spec='-z allextract$convenience -z defaultextract'\n\tfi\n\t;;\n      esac\n      link_all_deplibs=yes\n      ;;\n\n    sunos4*)\n      if test \"x$host_vendor\" = xsequent; then\n\t# Use $CC to link under sequent, because it throws in some extra .o\n\t# files that make .init and .fini sections work.\n\tarchive_cmds='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_direct=yes\n      hardcode_minus_L=yes\n      hardcode_shlibpath_var=no\n      ;;\n\n    sysv4)\n      case $host_vendor in\n\tsni)\n\t  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  hardcode_direct=yes # is this really true???\n\t;;\n\tsiemens)\n\t  ## LD is ld it makes a PLAMLIB\n\t  ## CC just makes a GrossModule.\n\t  archive_cmds='$LD -G -o $lib $libobjs $deplibs $linker_flags'\n\t  reload_cmds='$CC -r -o $output$reload_objs'\n\t  hardcode_direct=no\n        ;;\n\tmotorola)\n\t  archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  hardcode_direct=no #Motorola manual says yes, but my tests say they lie\n\t;;\n      esac\n      runpath_var='LD_RUN_PATH'\n      hardcode_shlibpath_var=no\n      ;;\n\n    sysv4.3*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_shlibpath_var=no\n      export_dynamic_flag_spec='-Bexport'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\tarchive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\thardcode_shlibpath_var=no\n\trunpath_var=LD_RUN_PATH\n\thardcode_runpath_var=yes\n\tld_shlibs=yes\n      fi\n      ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[01].[10]* | unixware7* | sco3.2v5.0.[024]*)\n      no_undefined_flag='${wl}-z,text'\n      archive_cmds_need_lc=no\n      hardcode_shlibpath_var=no\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6*)\n      # Note: We can NOT use -z defs as we might desire, because we do not\n      # link with -lc, and that would cause any symbols used from libc to\n      # always be unresolved, which means just about no library would\n      # ever link correctly.  If we're not using GNU ld we use -z text\n      # though, which does catch some bad symbols but isn't as heavy-handed\n      # as -z defs.\n      no_undefined_flag='${wl}-z,text'\n      allow_undefined_flag='${wl}-z,nodefs'\n      archive_cmds_need_lc=no\n      hardcode_shlibpath_var=no\n      hardcode_libdir_flag_spec='${wl}-R,$libdir'\n      hardcode_libdir_separator=':'\n      link_all_deplibs=yes\n      export_dynamic_flag_spec='${wl}-Bexport'\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\tarchive_cmds='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\tarchive_cmds='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\tarchive_expsym_cmds='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    uts4*)\n      archive_cmds='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      hardcode_libdir_flag_spec='-L$libdir'\n      hardcode_shlibpath_var=no\n      ;;\n\n    *)\n      ld_shlibs=no\n      ;;\n    esac\n\n    if test x$host_vendor = xsni; then\n      case $host in\n      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n\texport_dynamic_flag_spec='${wl}-Blargedynsym'\n\t;;\n      esac\n    fi\n  fi\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ld_shlibs\" >&5\n$as_echo \"$ld_shlibs\" >&6; }\ntest \"$ld_shlibs\" = no && can_build_shared=no\n\nwith_gnu_ld=$with_gnu_ld\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n#\n# Do we need to explicitly link libc?\n#\ncase \"x$archive_cmds_need_lc\" in\nx|xyes)\n  # Assume -lc should be added\n  archive_cmds_need_lc=yes\n\n  if test \"$enable_shared\" = yes && test \"$GCC\" = yes; then\n    case $archive_cmds in\n    *'~'*)\n      # FIXME: we may have to deal with multi-command sequences.\n      ;;\n    '$CC '*)\n      # Test whether the compiler implicitly links with -lc since on some\n      # systems, -lgcc has to come before -lc. If gcc already passes -lc\n      # to ld, don't add -lc before -lgcc.\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether -lc should be explicitly linked in\" >&5\n$as_echo_n \"checking whether -lc should be explicitly linked in... \" >&6; }\nif ${lt_cv_archive_cmds_need_lc+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  $RM conftest*\n\techo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n\tif { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_compile\\\"\"; } >&5\n  (eval $ac_compile) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } 2>conftest.err; then\n\t  soname=conftest\n\t  lib=conftest\n\t  libobjs=conftest.$ac_objext\n\t  deplibs=\n\t  wl=$lt_prog_compiler_wl\n\t  pic_flag=$lt_prog_compiler_pic\n\t  compiler_flags=-v\n\t  linker_flags=-v\n\t  verstring=\n\t  output_objdir=.\n\t  libname=conftest\n\t  lt_save_allow_undefined_flag=$allow_undefined_flag\n\t  allow_undefined_flag=\n\t  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$archive_cmds 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1\\\"\"; } >&5\n  (eval $archive_cmds 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; }\n\t  then\n\t    lt_cv_archive_cmds_need_lc=no\n\t  else\n\t    lt_cv_archive_cmds_need_lc=yes\n\t  fi\n\t  allow_undefined_flag=$lt_save_allow_undefined_flag\n\telse\n\t  cat conftest.err 1>&5\n\tfi\n\t$RM conftest*\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_archive_cmds_need_lc\" >&5\n$as_echo \"$lt_cv_archive_cmds_need_lc\" >&6; }\n      archive_cmds_need_lc=$lt_cv_archive_cmds_need_lc\n      ;;\n    esac\n  fi\n  ;;\nesac\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking dynamic linker characteristics\" >&5\n$as_echo_n \"checking dynamic linker characteristics... \" >&6; }\n\nif test \"$GCC\" = yes; then\n  case $host_os in\n    darwin*) lt_awk_arg=\"/^libraries:/,/LR/\" ;;\n    *) lt_awk_arg=\"/^libraries:/\" ;;\n  esac\n  case $host_os in\n    mingw* | cegcc*) lt_sed_strip_eq=\"s,=\\([A-Za-z]:\\),\\1,g\" ;;\n    *) lt_sed_strip_eq=\"s,=/,/,g\" ;;\n  esac\n  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e \"s/^libraries://\" -e $lt_sed_strip_eq`\n  case $lt_search_path_spec in\n  *\\;*)\n    # if the path contains \";\" then we assume it to be the separator\n    # otherwise default to the standard path separator (i.e. \":\") - it is\n    # assumed that no part of a normal pathname contains \";\" but that should\n    # okay in the real world where \";\" in dirpaths is itself problematic.\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED 's/;/ /g'`\n    ;;\n  *)\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED \"s/$PATH_SEPARATOR/ /g\"`\n    ;;\n  esac\n  # Ok, now we have the path, separated by spaces, we can step through it\n  # and add multilib dir if necessary.\n  lt_tmp_lt_search_path_spec=\n  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`\n  for lt_sys_path in $lt_search_path_spec; do\n    if test -d \"$lt_sys_path/$lt_multi_os_dir\"; then\n      lt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir\"\n    else\n      test -d \"$lt_sys_path\" && \\\n\tlt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path\"\n    fi\n  done\n  lt_search_path_spec=`$ECHO \"$lt_tmp_lt_search_path_spec\" | awk '\nBEGIN {RS=\" \"; FS=\"/|\\n\";} {\n  lt_foo=\"\";\n  lt_count=0;\n  for (lt_i = NF; lt_i > 0; lt_i--) {\n    if ($lt_i != \"\" && $lt_i != \".\") {\n      if ($lt_i == \"..\") {\n        lt_count++;\n      } else {\n        if (lt_count == 0) {\n          lt_foo=\"/\" $lt_i lt_foo;\n        } else {\n          lt_count--;\n        }\n      }\n    }\n  }\n  if (lt_foo != \"\") { lt_freq[lt_foo]++; }\n  if (lt_freq[lt_foo] == 1) { print lt_foo; }\n}'`\n  # AWK program above erroneously prepends '/' to C:/dos/paths\n  # for these hosts.\n  case $host_os in\n    mingw* | cegcc*) lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" |\\\n      $SED 's,/\\([A-Za-z]:\\),\\1,g'` ;;\n  esac\n  sys_lib_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $lt_NL2SP`\nelse\n  sys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\nfi\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\nshrext_cmds=\".so\"\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nneed_lib_prefix=unknown\nhardcode_into_libs=no\n\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\nneed_version=unknown\n\ncase $host_os in\naix3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX 3 has no versioning support, so we append a major version to the name.\n  soname_spec='${libname}${release}${shared_ext}$major'\n  ;;\n\naix[4-9]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  hardcode_into_libs=yes\n  if test \"$host_cpu\" = ia64; then\n    # AIX 5 supports IA64\n    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'\n    shlibpath_var=LD_LIBRARY_PATH\n  else\n    # With GCC up to 2.95.x, collect2 would create an import file\n    # for dependence libraries.  The import file would start with\n    # the line `#! .'.  This would cause the generated library to\n    # depend on `.', always an invalid library.  This was fixed in\n    # development snapshots of GCC prior to 3.0.\n    case $host_os in\n      aix4 | aix4.[01] | aix4.[01].*)\n      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'\n\t   echo ' yes '\n\t   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then\n\t:\n      else\n\tcan_build_shared=no\n      fi\n      ;;\n    esac\n    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct\n    # soname into executable. Probably we can add versioning support to\n    # collect2, so additional links can be useful in future.\n    if test \"$aix_use_runtimelinking\" = yes; then\n      # If using run time linking (on AIX 4.2 or later) use lib<name>.so\n      # instead of lib<name>.a to let people know that these are not\n      # typical AIX shared libraries.\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    else\n      # We preserve .a as extension for shared libraries through AIX4.2\n      # and later when we are not doing run time linking.\n      library_names_spec='${libname}${release}.a $libname.a'\n      soname_spec='${libname}${release}${shared_ext}$major'\n    fi\n    shlibpath_var=LIBPATH\n  fi\n  ;;\n\namigaos*)\n  case $host_cpu in\n  powerpc)\n    # Since July 2007 AmigaOS4 officially supports .so libraries.\n    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    ;;\n  m68k)\n    library_names_spec='$libname.ixlibrary $libname.a'\n    # Create ${libname}_ixlibrary.a entries in /sys/libs.\n    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all \"$lib\" | $SED '\\''s%^.*/\\([^/]*\\)\\.ixlibrary$%\\1%'\\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show \"cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a\"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'\n    ;;\n  esac\n  ;;\n\nbeos*)\n  library_names_spec='${libname}${shared_ext}'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  ;;\n\nbsdi[45]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw* | pw32* | cegcc*)\n  version_type=windows\n  shrext_cmds=\".dll\"\n  need_version=no\n  need_lib_prefix=no\n\n  case $GCC,$cc_basename in\n  yes,*)\n    # gcc\n    library_names_spec='$libname.dll.a'\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname~\n      chmod a+x \\$dldir/$dlname~\n      if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n        eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n      fi'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n\n    case $host_os in\n    cygwin*)\n      # Cygwin DLLs use 'cyg' prefix rather than 'lib'\n      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n\n      sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/lib/w32api\"\n      ;;\n    mingw* | cegcc*)\n      # MinGW DLLs use traditional 'lib' prefix\n      soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    pw32*)\n      # pw32 DLLs use 'pw' prefix rather than 'lib'\n      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    esac\n    dynamic_linker='Win32 ld.exe'\n    ;;\n\n  *,cl*)\n    # Native MSVC\n    libname_spec='$name'\n    soname_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext}'\n    library_names_spec='${libname}.dll.lib'\n\n    case $build_os in\n    mingw*)\n      sys_lib_search_path_spec=\n      lt_save_ifs=$IFS\n      IFS=';'\n      for lt_path in $LIB\n      do\n        IFS=$lt_save_ifs\n        # Let DOS variable expansion print the short 8.3 style file name.\n        lt_path=`cd \"$lt_path\" 2>/dev/null && cmd //C \"for %i in (\".\") do @echo %~si\"`\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec $lt_path\"\n      done\n      IFS=$lt_save_ifs\n      # Convert to MSYS style.\n      sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | sed -e 's|\\\\\\\\|/|g' -e 's| \\\\([a-zA-Z]\\\\):| /\\\\1|g' -e 's|^ ||'`\n      ;;\n    cygwin*)\n      # Convert to unix form, then to dos form, then back to unix form\n      # but this time dos style (no spaces!) so that the unix form looks\n      # like /cygdrive/c/PROGRA~1:/cygdr...\n      sys_lib_search_path_spec=`cygpath --path --unix \"$LIB\"`\n      sys_lib_search_path_spec=`cygpath --path --dos \"$sys_lib_search_path_spec\" 2>/dev/null`\n      sys_lib_search_path_spec=`cygpath --path --unix \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      ;;\n    *)\n      sys_lib_search_path_spec=\"$LIB\"\n      if $ECHO \"$sys_lib_search_path_spec\" | $GREP ';[c-zC-Z]:/' >/dev/null; then\n        # It is most probably a Windows format PATH.\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e 's/;/ /g'`\n      else\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      fi\n      # FIXME: find the short name or the path components, as spaces are\n      # common. (e.g. \"Program Files\" -> \"PROGRA~1\")\n      ;;\n    esac\n\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n    dynamic_linker='Win32 link.exe'\n    ;;\n\n  *)\n    # Assume MSVC wrapper\n    library_names_spec='${libname}`echo ${release} | $SED -e 's/[.]/-/g'`${versuffix}${shared_ext} $libname.lib'\n    dynamic_linker='Win32 ld.exe'\n    ;;\n  esac\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  ;;\n\ndarwin* | rhapsody*)\n  dynamic_linker=\"$host_os dyld\"\n  version_type=darwin\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'\n  soname_spec='${libname}${release}${major}$shared_ext'\n  shlibpath_overrides_runpath=yes\n  shlibpath_var=DYLD_LIBRARY_PATH\n  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'\n\n  sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/local/lib\"\n  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'\n  ;;\n\ndgux*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nfreebsd* | dragonfly*)\n  # DragonFly does not have aout.  When/if they implement a new\n  # versioning mechanism, adjust this.\n  if test -x /usr/bin/objformat; then\n    objformat=`/usr/bin/objformat`\n  else\n    case $host_os in\n    freebsd[23].*) objformat=aout ;;\n    *) objformat=elf ;;\n    esac\n  fi\n  version_type=freebsd-$objformat\n  case $version_type in\n    freebsd-elf*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_os in\n  freebsd2.*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  freebsd3.[01]* | freebsdelf3.[01]*)\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  freebsd3.[2-9]* | freebsdelf3.[2-9]* | \\\n  freebsd4.[0-5] | freebsdelf4.[0-5] | freebsd4.1.1 | freebsdelf4.1.1)\n    shlibpath_overrides_runpath=no\n    hardcode_into_libs=yes\n    ;;\n  *) # from 4.6 on, and DragonFly\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  esac\n  ;;\n\nhaiku*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  dynamic_linker=\"$host_os runtime_loader\"\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'\n  hardcode_into_libs=yes\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  case $host_cpu in\n  ia64*)\n    shrext_cmds='.so'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.so\"\n    shlibpath_var=LD_LIBRARY_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    if test \"X$HPUX_IA64_MODE\" = X32; then\n      sys_lib_search_path_spec=\"/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib\"\n    else\n      sys_lib_search_path_spec=\"/usr/lib/hpux64 /usr/local/lib/hpux64\"\n    fi\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  hppa*64*)\n    shrext_cmds='.sl'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    sys_lib_search_path_spec=\"/usr/lib/pa20_64 /usr/ccs/lib/pa20_64\"\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  *)\n    shrext_cmds='.sl'\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=SHLIB_PATH\n    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    ;;\n  esac\n  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...\n  postinstall_cmds='chmod 555 $lib'\n  # or fails outright, so override atomically:\n  install_override_mode=555\n  ;;\n\ninterix[3-9]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n    nonstopux*) version_type=nonstopux ;;\n    *)\n\tif test \"$lt_cv_prog_gnu_ld\" = yes; then\n\t\tversion_type=linux # correct to gnu/linux during the next big refactor\n\telse\n\t\tversion_type=irix\n\tfi ;;\n  esac\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'\n  case $host_os in\n  irix5* | nonstopux*)\n    libsuff= shlibsuff=\n    ;;\n  *)\n    case $LD in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \"|*-melf32bsmip|*\"-melf32bsmip \")\n      libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \"|*-melf32bmipn32|*\"-melf32bmipn32 \")\n      libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \"|*-melf64bmip|*\"-melf64bmip \")\n      libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib${libsuff} /lib${libsuff}\"\n  hardcode_into_libs=yes\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux*oldld* | linux*aout* | linux*coff*)\n  dynamic_linker=no\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n\n  # Some binutils ld are patched to set DT_RUNPATH\n  if ${lt_cv_shlibpath_overrides_runpath+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  lt_cv_shlibpath_overrides_runpath=no\n    save_LDFLAGS=$LDFLAGS\n    save_libdir=$libdir\n    eval \"libdir=/foo; wl=\\\"$lt_prog_compiler_wl\\\"; \\\n\t LDFLAGS=\\\"\\$LDFLAGS $hardcode_libdir_flag_spec\\\"\"\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  if  ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep \"RUNPATH.*$libdir\" >/dev/null; then :\n  lt_cv_shlibpath_overrides_runpath=yes\nfi\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n    LDFLAGS=$save_LDFLAGS\n    libdir=$save_libdir\n\nfi\n\n  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  # Append ld.so.conf contents to the search path\n  if test -f /etc/ld.so.conf; then\n    lt_ld_extra=`awk '/^include / { system(sprintf(\"cd /etc; cat %s 2>/dev/null\", \\$2)); skip = 1; } { if (!skip) print \\$0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[\t ]*hwcap[\t ]/d;s/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/\"//g;/^$/d' | tr '\\n' ' '`\n    sys_lib_dlsearch_path_spec=\"/lib /usr/lib $lt_ld_extra\"\n  fi\n\n  # We used to test for /lib/ld.so.1 and disable shared libraries on\n  # powerpc, because MkLinux only supported shared libraries with the\n  # GNU dynamic linker.  Since this was broken with cross compilers,\n  # most powerpc-linux boxes support dynamic linking these days and\n  # people can always --disable-shared, the test was removed, and we\n  # assume the GNU/Linux dynamic linker is in use.\n  dynamic_linker='GNU/Linux ld.so'\n  ;;\n\nnetbsdelf*-gnu)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='NetBSD ld.elf_so'\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  ;;\n\nnewsos6)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\n*nto* | *qnx*)\n  version_type=qnx\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='ldqnx.so'\n  ;;\n\nopenbsd*)\n  version_type=sunos\n  sys_lib_dlsearch_path_spec=\"/usr/lib\"\n  need_lib_prefix=no\n  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.\n  case $host_os in\n    openbsd3.3 | openbsd3.3.*)\tneed_version=yes ;;\n    *)\t\t\t\tneed_version=no  ;;\n  esac\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    case $host_os in\n      openbsd2.[89] | openbsd2.[89].*)\n\tshlibpath_overrides_runpath=no\n\t;;\n      *)\n\tshlibpath_overrides_runpath=yes\n\t;;\n      esac\n  else\n    shlibpath_overrides_runpath=yes\n  fi\n  ;;\n\nos2*)\n  libname_spec='$name'\n  shrext_cmds=\".dll\"\n  need_lib_prefix=no\n  library_names_spec='$libname${shared_ext} $libname.a'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=LIBPATH\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=\"$sys_lib_search_path_spec\"\n  ;;\n\nrdos*)\n  dynamic_linker=no\n  ;;\n\nsolaris*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test \"$with_gnu_ld\" = yes; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_vendor in\n    sni)\n      shlibpath_overrides_runpath=no\n      need_lib_prefix=no\n      runpath_var=LD_RUN_PATH\n      ;;\n    siemens)\n      need_lib_prefix=no\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      ;;\n  esac\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec ;then\n    version_type=linux # correct to gnu/linux during the next big refactor\n    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'\n    soname_spec='$libname${shared_ext}.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  version_type=freebsd-elf\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  if test \"$with_gnu_ld\" = yes; then\n    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'\n  else\n    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'\n    case $host_os in\n      sco3.2v5*)\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec /lib\"\n\t;;\n    esac\n  fi\n  sys_lib_dlsearch_path_spec='/usr/lib'\n  ;;\n\ntpf*)\n  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nuts4*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $dynamic_linker\" >&5\n$as_echo \"$dynamic_linker\" >&6; }\ntest \"$dynamic_linker\" = no && can_build_shared=no\n\nvariables_saved_for_relink=\"PATH $shlibpath_var $runpath_var\"\nif test \"$GCC\" = yes; then\n  variables_saved_for_relink=\"$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH\"\nfi\n\nif test \"${lt_cv_sys_lib_search_path_spec+set}\" = set; then\n  sys_lib_search_path_spec=\"$lt_cv_sys_lib_search_path_spec\"\nfi\nif test \"${lt_cv_sys_lib_dlsearch_path_spec+set}\" = set; then\n  sys_lib_dlsearch_path_spec=\"$lt_cv_sys_lib_dlsearch_path_spec\"\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking how to hardcode library paths into programs\" >&5\n$as_echo_n \"checking how to hardcode library paths into programs... \" >&6; }\nhardcode_action=\nif test -n \"$hardcode_libdir_flag_spec\" ||\n   test -n \"$runpath_var\" ||\n   test \"X$hardcode_automatic\" = \"Xyes\" ; then\n\n  # We can hardcode non-existent directories.\n  if test \"$hardcode_direct\" != no &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test \"$_LT_TAGVAR(hardcode_shlibpath_var, )\" != no &&\n     test \"$hardcode_minus_L\" != no; then\n    # Linking always hardcodes the temporary library directory.\n    hardcode_action=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    hardcode_action=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  hardcode_action=unsupported\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $hardcode_action\" >&5\n$as_echo \"$hardcode_action\" >&6; }\n\nif test \"$hardcode_action\" = relink ||\n   test \"$inherit_rpath\" = yes; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test \"$shlibpath_overrides_runpath\" = yes ||\n     test \"$enable_shared\" = no; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n\n\n\n\n\n\n  if test \"x$enable_dlopen\" != xyes; then\n  enable_dlopen=unknown\n  enable_dlopen_self=unknown\n  enable_dlopen_self_static=unknown\nelse\n  lt_cv_dlopen=no\n  lt_cv_dlopen_libs=\n\n  case $host_os in\n  beos*)\n    lt_cv_dlopen=\"load_add_on\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ;;\n\n  mingw* | pw32* | cegcc*)\n    lt_cv_dlopen=\"LoadLibrary\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  cygwin*)\n    lt_cv_dlopen=\"dlopen\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  darwin*)\n  # if libdl is installed we need to link against it\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl\" >&5\n$as_echo_n \"checking for dlopen in -ldl... \" >&6; }\nif ${ac_cv_lib_dl_dlopen+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dl_dlopen=yes\nelse\n  ac_cv_lib_dl_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen\" >&5\n$as_echo \"$ac_cv_lib_dl_dlopen\" >&6; }\nif test \"x$ac_cv_lib_dl_dlopen\" = xyes; then :\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"\nelse\n\n    lt_cv_dlopen=\"dyld\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n\nfi\n\n    ;;\n\n  *)\n    ac_fn_c_check_func \"$LINENO\" \"shl_load\" \"ac_cv_func_shl_load\"\nif test \"x$ac_cv_func_shl_load\" = xyes; then :\n  lt_cv_dlopen=\"shl_load\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for shl_load in -ldld\" >&5\n$as_echo_n \"checking for shl_load in -ldld... \" >&6; }\nif ${ac_cv_lib_dld_shl_load+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar shl_load ();\nint\nmain ()\n{\nreturn shl_load ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dld_shl_load=yes\nelse\n  ac_cv_lib_dld_shl_load=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_shl_load\" >&5\n$as_echo \"$ac_cv_lib_dld_shl_load\" >&6; }\nif test \"x$ac_cv_lib_dld_shl_load\" = xyes; then :\n  lt_cv_dlopen=\"shl_load\" lt_cv_dlopen_libs=\"-ldld\"\nelse\n  ac_fn_c_check_func \"$LINENO\" \"dlopen\" \"ac_cv_func_dlopen\"\nif test \"x$ac_cv_func_dlopen\" = xyes; then :\n  lt_cv_dlopen=\"dlopen\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -ldl\" >&5\n$as_echo_n \"checking for dlopen in -ldl... \" >&6; }\nif ${ac_cv_lib_dl_dlopen+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldl  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dl_dlopen=yes\nelse\n  ac_cv_lib_dl_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dl_dlopen\" >&5\n$as_echo \"$ac_cv_lib_dl_dlopen\" >&6; }\nif test \"x$ac_cv_lib_dl_dlopen\" = xyes; then :\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dlopen in -lsvld\" >&5\n$as_echo_n \"checking for dlopen in -lsvld... \" >&6; }\nif ${ac_cv_lib_svld_dlopen+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-lsvld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dlopen ();\nint\nmain ()\n{\nreturn dlopen ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_svld_dlopen=yes\nelse\n  ac_cv_lib_svld_dlopen=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_svld_dlopen\" >&5\n$as_echo \"$ac_cv_lib_svld_dlopen\" >&6; }\nif test \"x$ac_cv_lib_svld_dlopen\" = xyes; then :\n  lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-lsvld\"\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dld_link in -ldld\" >&5\n$as_echo_n \"checking for dld_link in -ldld... \" >&6; }\nif ${ac_cv_lib_dld_dld_link+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_check_lib_save_LIBS=$LIBS\nLIBS=\"-ldld  $LIBS\"\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n/* Override any GCC internal prototype to avoid an error.\n   Use char because int might match the return type of a GCC\n   builtin and then its argument prototype would still apply.  */\n#ifdef __cplusplus\nextern \"C\"\n#endif\nchar dld_link ();\nint\nmain ()\n{\nreturn dld_link ();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  ac_cv_lib_dld_dld_link=yes\nelse\n  ac_cv_lib_dld_dld_link=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\nLIBS=$ac_check_lib_save_LIBS\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_dld_dld_link\" >&5\n$as_echo \"$ac_cv_lib_dld_dld_link\" >&6; }\nif test \"x$ac_cv_lib_dld_dld_link\" = xyes; then :\n  lt_cv_dlopen=\"dld_link\" lt_cv_dlopen_libs=\"-ldld\"\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n\nfi\n\n    ;;\n  esac\n\n  if test \"x$lt_cv_dlopen\" != xno; then\n    enable_dlopen=yes\n  else\n    enable_dlopen=no\n  fi\n\n  case $lt_cv_dlopen in\n  dlopen)\n    save_CPPFLAGS=\"$CPPFLAGS\"\n    test \"x$ac_cv_header_dlfcn_h\" = xyes && CPPFLAGS=\"$CPPFLAGS -DHAVE_DLFCN_H\"\n\n    save_LDFLAGS=\"$LDFLAGS\"\n    wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $export_dynamic_flag_spec\\\"\n\n    save_LIBS=\"$LIBS\"\n    LIBS=\"$lt_cv_dlopen_libs $LIBS\"\n\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether a program can dlopen itself\" >&5\n$as_echo_n \"checking whether a program can dlopen itself... \" >&6; }\nif ${lt_cv_dlopen_self+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  \t  if test \"$cross_compiling\" = yes; then :\n  lt_cv_dlopen_self=cross\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n#line $LINENO \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\n/* When -fvisbility=hidden is used, assume the code has been annotated\n   correspondingly for the symbols needed.  */\n#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))\nint fnord () __attribute__((visibility(\"default\")));\n#endif\n\nint fnord () { return 42; }\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else\n        {\n\t  if (dlsym( self,\"_fnord\"))  status = $lt_dlneed_uscore;\n          else puts (dlerror ());\n\t}\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}\n_LT_EOF\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) >&5 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) lt_cv_dlopen_self=yes ;;\n      x$lt_dlneed_uscore) lt_cv_dlopen_self=yes ;;\n      x$lt_dlunknown|x*) lt_cv_dlopen_self=no ;;\n    esac\n  else :\n    # compilation failed\n    lt_cv_dlopen_self=no\n  fi\nfi\nrm -fr conftest*\n\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self\" >&5\n$as_echo \"$lt_cv_dlopen_self\" >&6; }\n\n    if test \"x$lt_cv_dlopen_self\" = xyes; then\n      wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $lt_prog_compiler_static\\\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether a statically linked program can dlopen itself\" >&5\n$as_echo_n \"checking whether a statically linked program can dlopen itself... \" >&6; }\nif ${lt_cv_dlopen_self_static+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  \t  if test \"$cross_compiling\" = yes; then :\n  lt_cv_dlopen_self_static=cross\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n#line $LINENO \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\n/* When -fvisbility=hidden is used, assume the code has been annotated\n   correspondingly for the symbols needed.  */\n#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))\nint fnord () __attribute__((visibility(\"default\")));\n#endif\n\nint fnord () { return 42; }\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else\n        {\n\t  if (dlsym( self,\"_fnord\"))  status = $lt_dlneed_uscore;\n          else puts (dlerror ());\n\t}\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}\n_LT_EOF\n  if { { eval echo \"\\\"\\$as_me\\\":${as_lineno-$LINENO}: \\\"$ac_link\\\"\"; } >&5\n  (eval $ac_link) 2>&5\n  ac_status=$?\n  $as_echo \"$as_me:${as_lineno-$LINENO}: \\$? = $ac_status\" >&5\n  test $ac_status = 0; } && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) >&5 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) lt_cv_dlopen_self_static=yes ;;\n      x$lt_dlneed_uscore) lt_cv_dlopen_self_static=yes ;;\n      x$lt_dlunknown|x*) lt_cv_dlopen_self_static=no ;;\n    esac\n  else :\n    # compilation failed\n    lt_cv_dlopen_self_static=no\n  fi\nfi\nrm -fr conftest*\n\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $lt_cv_dlopen_self_static\" >&5\n$as_echo \"$lt_cv_dlopen_self_static\" >&6; }\n    fi\n\n    CPPFLAGS=\"$save_CPPFLAGS\"\n    LDFLAGS=\"$save_LDFLAGS\"\n    LIBS=\"$save_LIBS\"\n    ;;\n  esac\n\n  case $lt_cv_dlopen_self in\n  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;\n  *) enable_dlopen_self=unknown ;;\n  esac\n\n  case $lt_cv_dlopen_self_static in\n  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;\n  *) enable_dlopen_self_static=unknown ;;\n  esac\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\nstriplib=\nold_striplib=\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether stripping libraries is possible\" >&5\n$as_echo_n \"checking whether stripping libraries is possible... \" >&6; }\nif test -n \"$STRIP\" && $STRIP -V 2>&1 | $GREP \"GNU strip\" >/dev/null; then\n  test -z \"$old_striplib\" && old_striplib=\"$STRIP --strip-debug\"\n  test -z \"$striplib\" && striplib=\"$STRIP --strip-unneeded\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n# FIXME - insert some real tests, host_os isn't really good enough\n  case $host_os in\n  darwin*)\n    if test -n \"$STRIP\" ; then\n      striplib=\"$STRIP -x\"\n      old_striplib=\"$STRIP -S\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n    else\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n    fi\n    ;;\n  *)\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n    ;;\n  esac\nfi\n\n\n\n\n\n\n\n\n\n\n\n\n  # Report which library types will actually be built\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if libtool supports shared libraries\" >&5\n$as_echo_n \"checking if libtool supports shared libraries... \" >&6; }\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $can_build_shared\" >&5\n$as_echo \"$can_build_shared\" >&6; }\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to build shared libraries\" >&5\n$as_echo_n \"checking whether to build shared libraries... \" >&6; }\n  test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n  # On AIX, shared libraries and static libraries use the same namespace, and\n  # are all built from PIC.\n  case $host_os in\n  aix3*)\n    test \"$enable_shared\" = yes && enable_static=no\n    if test -n \"$RANLIB\"; then\n      archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n      postinstall_cmds='$RANLIB $lib'\n    fi\n    ;;\n\n  aix[4-9]*)\n    if test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n      test \"$enable_shared\" = yes && enable_static=no\n    fi\n    ;;\n  esac\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $enable_shared\" >&5\n$as_echo \"$enable_shared\" >&6; }\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether to build static libraries\" >&5\n$as_echo_n \"checking whether to build static libraries... \" >&6; }\n  # Make sure either enable_shared or enable_static is yes.\n  test \"$enable_shared\" = yes || enable_static=yes\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $enable_static\" >&5\n$as_echo \"$enable_static\" >&6; }\n\n\n\n\nfi\nac_ext=c\nac_cpp='$CPP $CPPFLAGS'\nac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5'\nac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5'\nac_compiler_gnu=$ac_cv_c_compiler_gnu\n\nCC=\"$lt_save_CC\"\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n        ac_config_commands=\"$ac_config_commands libtool\"\n\n\n\n\n# Only expand once:\n\n\n\n\n\nif test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}ar\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}ar; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_AR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AR\"; then\n  ac_cv_prog_AR=\"$AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_AR=\"${ac_tool_prefix}ar\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAR=$ac_cv_prog_AR\nif test -n \"$AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AR\" >&5\n$as_echo \"$AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_AR\"; then\n  ac_ct_AR=$AR\n  # Extract the first word of \"ar\", so it can be a program name with args.\nset dummy ar; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_AR+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_AR\"; then\n  ac_cv_prog_ac_ct_AR=\"$ac_ct_AR\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_AR=\"ar\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_AR=$ac_cv_prog_ac_ct_AR\nif test -n \"$ac_ct_AR\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_AR\" >&5\n$as_echo \"$ac_ct_AR\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_AR\" = x; then\n    AR=\"ar\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    AR=$ac_ct_AR\n  fi\nelse\n  AR=\"$ac_cv_prog_AR\"\nfi\n\n\n\nif test \"x$EMSCRIPTEN\" = \"x\"; then :\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for MMX instructions set\" >&5\n$as_echo_n \"checking for MMX instructions set... \" >&6; }\n  oldcflags=\"$CFLAGS\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mmmx\" >&5\n$as_echo_n \"checking whether C compiler accepts -mmmx... \" >&6; }\nif ${ax_cv_check_cflags___mmmx+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -mmmx\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___mmmx=yes\nelse\n  ax_cv_check_cflags___mmmx=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___mmmx\" >&5\n$as_echo \"$ax_cv_check_cflags___mmmx\" >&6; }\nif test \"x$ax_cv_check_cflags___mmmx\" = xyes; then :\n  CFLAGS=\"$CFLAGS -mmmx\"\nelse\n  :\nfi\n\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#pragma GCC target(\"mmx\")\n#include <mmintrin.h>\n\nint\nmain ()\n{\n __m64 x = _mm_setzero_si64();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\n$as_echo \"#define HAVE_MMINTRIN_H 1\" >>confdefs.h\n\n     { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mmmx\" >&5\n$as_echo_n \"checking whether C compiler accepts -mmmx... \" >&6; }\nif ${ax_cv_check_cflags___mmmx+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -mmmx\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___mmmx=yes\nelse\n  ax_cv_check_cflags___mmmx=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___mmmx\" >&5\n$as_echo \"$ax_cv_check_cflags___mmmx\" >&6; }\nif test \"x$ax_cv_check_cflags___mmmx\" = xyes; then :\n  CFLAGS_MMX=\"-mmmx\"\nelse\n  :\nfi\n\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=\"$oldcflags\"\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for SSE2 instructions set\" >&5\n$as_echo_n \"checking for SSE2 instructions set... \" >&6; }\n  oldcflags=\"$CFLAGS\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -msse2\" >&5\n$as_echo_n \"checking whether C compiler accepts -msse2... \" >&6; }\nif ${ax_cv_check_cflags___msse2+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -msse2\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___msse2=yes\nelse\n  ax_cv_check_cflags___msse2=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___msse2\" >&5\n$as_echo \"$ax_cv_check_cflags___msse2\" >&6; }\nif test \"x$ax_cv_check_cflags___msse2\" = xyes; then :\n  CFLAGS=\"$CFLAGS -msse2\"\nelse\n  :\nfi\n\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#pragma GCC target(\"sse2\")\n#ifndef __SSE2__\n# define __SSE2__\n#endif\n#include <emmintrin.h>\n\nint\nmain ()\n{\n __m128d x = _mm_setzero_pd();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\n$as_echo \"#define HAVE_EMMINTRIN_H 1\" >>confdefs.h\n\n     { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -msse2\" >&5\n$as_echo_n \"checking whether C compiler accepts -msse2... \" >&6; }\nif ${ax_cv_check_cflags___msse2+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -msse2\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___msse2=yes\nelse\n  ax_cv_check_cflags___msse2=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___msse2\" >&5\n$as_echo \"$ax_cv_check_cflags___msse2\" >&6; }\nif test \"x$ax_cv_check_cflags___msse2\" = xyes; then :\n  CFLAGS_SSE2=\"-msse2\"\nelse\n  :\nfi\n\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=\"$oldcflags\"\n\n  oldcflags=\"$CFLAGS\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -msse3\" >&5\n$as_echo_n \"checking whether C compiler accepts -msse3... \" >&6; }\nif ${ax_cv_check_cflags___msse3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -msse3\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___msse3=yes\nelse\n  ax_cv_check_cflags___msse3=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___msse3\" >&5\n$as_echo \"$ax_cv_check_cflags___msse3\" >&6; }\nif test \"x$ax_cv_check_cflags___msse3\" = xyes; then :\n  CFLAGS=\"$CFLAGS -msse3\"\nelse\n  :\nfi\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for SSE3 instructions set\" >&5\n$as_echo_n \"checking for SSE3 instructions set... \" >&6; }\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#pragma GCC target(\"sse3\")\n#include <pmmintrin.h>\n\nint\nmain ()\n{\n __m128 x = _mm_addsub_ps(_mm_cvtpd_ps(_mm_setzero_pd()),\n                                _mm_cvtpd_ps(_mm_setzero_pd()));\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\n$as_echo \"#define HAVE_PMMINTRIN_H 1\" >>confdefs.h\n\n     { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -msse3\" >&5\n$as_echo_n \"checking whether C compiler accepts -msse3... \" >&6; }\nif ${ax_cv_check_cflags___msse3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -msse3\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___msse3=yes\nelse\n  ax_cv_check_cflags___msse3=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___msse3\" >&5\n$as_echo \"$ax_cv_check_cflags___msse3\" >&6; }\nif test \"x$ax_cv_check_cflags___msse3\" = xyes; then :\n  CFLAGS_SSE3=\"-msse3\"\nelse\n  :\nfi\n\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=\"$oldcflags\"\n\n  oldcflags=\"$CFLAGS\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mssse3\" >&5\n$as_echo_n \"checking whether C compiler accepts -mssse3... \" >&6; }\nif ${ax_cv_check_cflags___mssse3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -mssse3\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___mssse3=yes\nelse\n  ax_cv_check_cflags___mssse3=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___mssse3\" >&5\n$as_echo \"$ax_cv_check_cflags___mssse3\" >&6; }\nif test \"x$ax_cv_check_cflags___mssse3\" = xyes; then :\n  CFLAGS=\"$CFLAGS -mssse3\"\nelse\n  :\nfi\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for SSSE3 instructions set\" >&5\n$as_echo_n \"checking for SSSE3 instructions set... \" >&6; }\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#pragma GCC target(\"ssse3\")\n#include <tmmintrin.h>\n\nint\nmain ()\n{\n __m64 x = _mm_abs_pi32(_m_from_int(0));\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\n$as_echo \"#define HAVE_TMMINTRIN_H 1\" >>confdefs.h\n\n     { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mssse3\" >&5\n$as_echo_n \"checking whether C compiler accepts -mssse3... \" >&6; }\nif ${ax_cv_check_cflags___mssse3+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -mssse3\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___mssse3=yes\nelse\n  ax_cv_check_cflags___mssse3=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___mssse3\" >&5\n$as_echo \"$ax_cv_check_cflags___mssse3\" >&6; }\nif test \"x$ax_cv_check_cflags___mssse3\" = xyes; then :\n  CFLAGS_SSSE3=\"-mssse3\"\nelse\n  :\nfi\n\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=\"$oldcflags\"\n\n  oldcflags=\"$CFLAGS\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -msse4.1\" >&5\n$as_echo_n \"checking whether C compiler accepts -msse4.1... \" >&6; }\nif ${ax_cv_check_cflags___msse4_1+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -msse4.1\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___msse4_1=yes\nelse\n  ax_cv_check_cflags___msse4_1=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___msse4_1\" >&5\n$as_echo \"$ax_cv_check_cflags___msse4_1\" >&6; }\nif test \"x$ax_cv_check_cflags___msse4_1\" = xyes; then :\n  CFLAGS=\"$CFLAGS -msse4.1\"\nelse\n  :\nfi\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for SSE4.1 instructions set\" >&5\n$as_echo_n \"checking for SSE4.1 instructions set... \" >&6; }\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#pragma GCC target(\"sse4.1\")\n#include <smmintrin.h>\n\nint\nmain ()\n{\n __m128i x = _mm_minpos_epu16(_mm_setzero_si128());\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\n$as_echo \"#define HAVE_SMMINTRIN_H 1\" >>confdefs.h\n\n     { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -msse4.1\" >&5\n$as_echo_n \"checking whether C compiler accepts -msse4.1... \" >&6; }\nif ${ax_cv_check_cflags___msse4_1+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -msse4.1\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___msse4_1=yes\nelse\n  ax_cv_check_cflags___msse4_1=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___msse4_1\" >&5\n$as_echo \"$ax_cv_check_cflags___msse4_1\" >&6; }\nif test \"x$ax_cv_check_cflags___msse4_1\" = xyes; then :\n  CFLAGS_SSE41=\"-msse4.1\"\nelse\n  :\nfi\n\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=\"$oldcflags\"\n\n  oldcflags=\"$CFLAGS\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mavx\" >&5\n$as_echo_n \"checking whether C compiler accepts -mavx... \" >&6; }\nif ${ax_cv_check_cflags___mavx+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -mavx\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___mavx=yes\nelse\n  ax_cv_check_cflags___mavx=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___mavx\" >&5\n$as_echo \"$ax_cv_check_cflags___mavx\" >&6; }\nif test \"x$ax_cv_check_cflags___mavx\" = xyes; then :\n  CFLAGS=\"$CFLAGS -mavx\"\nelse\n  :\nfi\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for AVX instructions set\" >&5\n$as_echo_n \"checking for AVX instructions set... \" >&6; }\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#pragma GCC target(\"avx\")\n#include <immintrin.h>\n\nint\nmain ()\n{\n _mm256_zeroall();\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\n$as_echo \"#define HAVE_AVXINTRIN_H 1\" >>confdefs.h\n\n     { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mavx\" >&5\n$as_echo_n \"checking whether C compiler accepts -mavx... \" >&6; }\nif ${ax_cv_check_cflags___mavx+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -mavx\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___mavx=yes\nelse\n  ax_cv_check_cflags___mavx=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___mavx\" >&5\n$as_echo \"$ax_cv_check_cflags___mavx\" >&6; }\nif test \"x$ax_cv_check_cflags___mavx\" = xyes; then :\n  CFLAGS_AVX=\"-mavx\"\nelse\n  :\nfi\n\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=\"$oldcflags\"\n\n  oldcflags=\"$CFLAGS\"\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -maes\" >&5\n$as_echo_n \"checking whether C compiler accepts -maes... \" >&6; }\nif ${ax_cv_check_cflags___maes+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -maes\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___maes=yes\nelse\n  ax_cv_check_cflags___maes=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___maes\" >&5\n$as_echo \"$ax_cv_check_cflags___maes\" >&6; }\nif test \"x$ax_cv_check_cflags___maes\" = xyes; then :\n  CFLAGS=\"$CFLAGS -maes\"\nelse\n  :\nfi\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mpclmul\" >&5\n$as_echo_n \"checking whether C compiler accepts -mpclmul... \" >&6; }\nif ${ax_cv_check_cflags___mpclmul+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -mpclmul\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___mpclmul=yes\nelse\n  ax_cv_check_cflags___mpclmul=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___mpclmul\" >&5\n$as_echo \"$ax_cv_check_cflags___mpclmul\" >&6; }\nif test \"x$ax_cv_check_cflags___mpclmul\" = xyes; then :\n  CFLAGS=\"$CFLAGS -mpclmul\"\nelse\n  :\nfi\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for AESNI instructions set and PCLMULQDQ\" >&5\n$as_echo_n \"checking for AESNI instructions set and PCLMULQDQ... \" >&6; }\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#pragma GCC target(\"aes\")\n#pragma GCC target(\"pclmul\")\n#include <wmmintrin.h>\n\nint\nmain ()\n{\n __m128i x = _mm_aesimc_si128(_mm_setzero_si128());\n       __m128i y = _mm_clmulepi64_si128(_mm_setzero_si128(), _mm_setzero_si128(), 0);\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\n$as_echo \"#define HAVE_WMMINTRIN_H 1\" >>confdefs.h\n\n     { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -maes\" >&5\n$as_echo_n \"checking whether C compiler accepts -maes... \" >&6; }\nif ${ax_cv_check_cflags___maes+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -maes\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___maes=yes\nelse\n  ax_cv_check_cflags___maes=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___maes\" >&5\n$as_echo \"$ax_cv_check_cflags___maes\" >&6; }\nif test \"x$ax_cv_check_cflags___maes\" = xyes; then :\n  CFLAGS_AESNI=\"-maes\"\nelse\n  :\nfi\n\n     { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether C compiler accepts -mpclmul\" >&5\n$as_echo_n \"checking whether C compiler accepts -mpclmul... \" >&6; }\nif ${ax_cv_check_cflags___mpclmul+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n\n  ax_check_save_flags=$CFLAGS\n  CFLAGS=\"$CFLAGS  -mpclmul\"\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <stdio.h>\nint\nmain ()\n{\nchar x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ax_cv_check_cflags___mpclmul=yes\nelse\n  ax_cv_check_cflags___mpclmul=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=$ax_check_save_flags\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ax_cv_check_cflags___mpclmul\" >&5\n$as_echo \"$ax_cv_check_cflags___mpclmul\" >&6; }\nif test \"x$ax_cv_check_cflags___mpclmul\" = xyes; then :\n  CFLAGS_PCLMUL=\"-mpclmul\"\nelse\n  :\nfi\n\n\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  CFLAGS=\"$oldcflags\"\n\n\nfi\n\n\n\n\n\n\n\n\n\nfor ac_header in sys/mman.h\ndo :\n  ac_fn_c_check_header_mongrel \"$LINENO\" \"sys/mman.h\" \"ac_cv_header_sys_mman_h\" \"$ac_includes_default\"\nif test \"x$ac_cv_header_sys_mman_h\" = xyes; then :\n  cat >>confdefs.h <<_ACEOF\n#define HAVE_SYS_MMAN_H 1\n_ACEOF\n\nfi\n\ndone\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for inline\" >&5\n$as_echo_n \"checking for inline... \" >&6; }\nif ${ac_cv_c_inline+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_c_inline=no\nfor ac_kw in inline __inline__ __inline; do\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifndef __cplusplus\ntypedef int foo_t;\nstatic $ac_kw foo_t static_foo () {return 0; }\n$ac_kw foo_t foo () {return 0; }\n#endif\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_c_inline=$ac_kw\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n  test \"$ac_cv_c_inline\" != no && break\ndone\n\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_inline\" >&5\n$as_echo \"$ac_cv_c_inline\" >&6; }\n\ncase $ac_cv_c_inline in\n  inline | yes) ;;\n  *)\n    case $ac_cv_c_inline in\n      no) ac_val=;;\n      *) ac_val=$ac_cv_c_inline;;\n    esac\n    cat >>confdefs.h <<_ACEOF\n#ifndef __cplusplus\n#define inline $ac_val\n#endif\n_ACEOF\n    ;;\nesac\n\n { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether byte ordering is bigendian\" >&5\n$as_echo_n \"checking whether byte ordering is bigendian... \" >&6; }\nif ${ac_cv_c_bigendian+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  ac_cv_c_bigendian=unknown\n    # See if we're dealing with a universal compiler.\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#ifndef __APPLE_CC__\n\t       not a universal capable compiler\n\t     #endif\n\t     typedef int dummy;\n\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n\n\t# Check for potential -arch flags.  It is not universal unless\n\t# there are at least two -arch flags with different values.\n\tac_arch=\n\tac_prev=\n\tfor ac_word in $CC $CFLAGS $CPPFLAGS $LDFLAGS; do\n\t if test -n \"$ac_prev\"; then\n\t   case $ac_word in\n\t     i?86 | x86_64 | ppc | ppc64)\n\t       if test -z \"$ac_arch\" || test \"$ac_arch\" = \"$ac_word\"; then\n\t\t ac_arch=$ac_word\n\t       else\n\t\t ac_cv_c_bigendian=universal\n\t\t break\n\t       fi\n\t       ;;\n\t   esac\n\t   ac_prev=\n\t elif test \"x$ac_word\" = \"x-arch\"; then\n\t   ac_prev=arch\n\t fi\n       done\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n    if test $ac_cv_c_bigendian = unknown; then\n      # See if sys/param.h defines the BYTE_ORDER macro.\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <sys/types.h>\n\t     #include <sys/param.h>\n\nint\nmain ()\n{\n#if ! (defined BYTE_ORDER && defined BIG_ENDIAN \\\n\t\t     && defined LITTLE_ENDIAN && BYTE_ORDER && BIG_ENDIAN \\\n\t\t     && LITTLE_ENDIAN)\n\t      bogus endian macros\n\t     #endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  # It does; now see whether it defined to BIG_ENDIAN or not.\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <sys/types.h>\n\t\t#include <sys/param.h>\n\nint\nmain ()\n{\n#if BYTE_ORDER != BIG_ENDIAN\n\t\t not big endian\n\t\t#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_c_bigendian=yes\nelse\n  ac_cv_c_bigendian=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n    fi\n    if test $ac_cv_c_bigendian = unknown; then\n      # See if <limits.h> defines _LITTLE_ENDIAN or _BIG_ENDIAN (e.g., Solaris).\n      cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <limits.h>\n\nint\nmain ()\n{\n#if ! (defined _LITTLE_ENDIAN || defined _BIG_ENDIAN)\n\t      bogus endian macros\n\t     #endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  # It does; now see whether it defined to _BIG_ENDIAN or not.\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n#include <limits.h>\n\nint\nmain ()\n{\n#ifndef _BIG_ENDIAN\n\t\t not big endian\n\t\t#endif\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  ac_cv_c_bigendian=yes\nelse\n  ac_cv_c_bigendian=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n    fi\n    if test $ac_cv_c_bigendian = unknown; then\n      # Compile a test program.\n      if test \"$cross_compiling\" = yes; then :\n  # Try to guess by grepping values from an object file.\n\t cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\nshort int ascii_mm[] =\n\t\t  { 0x4249, 0x4765, 0x6E44, 0x6961, 0x6E53, 0x7953, 0 };\n\t\tshort int ascii_ii[] =\n\t\t  { 0x694C, 0x5454, 0x656C, 0x6E45, 0x6944, 0x6E61, 0 };\n\t\tint use_ascii (int i) {\n\t\t  return ascii_mm[i] + ascii_ii[i];\n\t\t}\n\t\tshort int ebcdic_ii[] =\n\t\t  { 0x89D3, 0xE3E3, 0x8593, 0x95C5, 0x89C4, 0x9581, 0 };\n\t\tshort int ebcdic_mm[] =\n\t\t  { 0xC2C9, 0xC785, 0x95C4, 0x8981, 0x95E2, 0xA8E2, 0 };\n\t\tint use_ebcdic (int i) {\n\t\t  return ebcdic_mm[i] + ebcdic_ii[i];\n\t\t}\n\t\textern int foo;\n\nint\nmain ()\n{\nreturn use_ascii (foo) == use_ebcdic (foo);\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  if grep BIGenDianSyS conftest.$ac_objext >/dev/null; then\n\t      ac_cv_c_bigendian=yes\n\t    fi\n\t    if grep LiTTleEnDian conftest.$ac_objext >/dev/null ; then\n\t      if test \"$ac_cv_c_bigendian\" = unknown; then\n\t\tac_cv_c_bigendian=no\n\t      else\n\t\t# finding both strings is unlikely to happen, but who knows?\n\t\tac_cv_c_bigendian=unknown\n\t      fi\n\t    fi\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\nelse\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n$ac_includes_default\nint\nmain ()\n{\n\n\t     /* Are we little or big endian?  From Harbison&Steele.  */\n\t     union\n\t     {\n\t       long int l;\n\t       char c[sizeof (long int)];\n\t     } u;\n\t     u.l = 1;\n\t     return u.c[sizeof (long int) - 1] == 1;\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_run \"$LINENO\"; then :\n  ac_cv_c_bigendian=no\nelse\n  ac_cv_c_bigendian=yes\nfi\nrm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \\\n  conftest.$ac_objext conftest.beam conftest.$ac_ext\nfi\n\n    fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_c_bigendian\" >&5\n$as_echo \"$ac_cv_c_bigendian\" >&6; }\n case $ac_cv_c_bigendian in #(\n   yes)\n\n$as_echo \"#define NATIVE_BIG_ENDIAN 1\" >>confdefs.h\n;; #(\n   no)\n\n$as_echo \"#define NATIVE_LITTLE_ENDIAN 1\" >>confdefs.h\n ;; #(\n   universal)\n     as_fn_error $? \"universal endianess is not supported - compile separately and use lipo(1)\" \"$LINENO\" 5\n\n     ;; #(\n   *)\n     as_fn_error $? \"unknown endianess\" \"$LINENO\" 5 ;;\n esac\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether __STDC_LIMIT_MACROS is required\" >&5\n$as_echo_n \"checking whether __STDC_LIMIT_MACROS is required... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#include <limits.h>\n#include <stdint.h>\n\nint\nmain ()\n{\n\n(void) SIZE_MAX;\n(void) UINT64_MAX;\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n   CPPFLAGS=\"$CPPFLAGS -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS\"\n\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nHAVE_AMD64_ASM_V=0\nif test \"$enable_asm\" != \"no\"; then :\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we can use x86_64 asm code\" >&5\n$as_echo_n \"checking whether we can use x86_64 asm code... \" >&6; }\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n\nint\nmain ()\n{\n\n#if defined(__amd64) || defined(__amd64__) || defined(__x86_64__)\n# if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__) || defined(_WIN32) || defined(_WIN64)\n#  error Windows x86_64 calling conventions are not supported yet\n# endif\n/* neat */\n#else\n# error !x86_64\n#endif\nunsigned char i = 0, o = 0, t;\n__asm__ __volatile__ (\"pxor %%xmm12, %%xmm6 \\n\"\n                      \"movb (%[i]), %[t] \\n\"\n                      \"addb %[t], (%[o]) \\n\"\n                      : [t] \"=&r\"(t)\n                      : [o] \"D\"(&o), [i] \"S\"(&i)\n                      : \"memory\", \"flags\", \"cc\");\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\n$as_echo \"#define HAVE_AMD64_ASM 1\" >>confdefs.h\n\n   HAVE_AMD64_ASM_V=1\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nfi\n if test $HAVE_AMD64_ASM_V = 1; then\n  HAVE_AMD64_ASM_TRUE=\n  HAVE_AMD64_ASM_FALSE='#'\nelse\n  HAVE_AMD64_ASM_TRUE='#'\n  HAVE_AMD64_ASM_FALSE=\nfi\n\n\n\nHAVE_AVX_ASM_V=0\nif test \"$enable_asm\" != \"no\"; then :\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking whether we can assemble AVX opcodes\" >&5\n$as_echo_n \"checking whether we can assemble AVX opcodes... \" >&6; }\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n\nint\nmain ()\n{\n\n#if defined(__amd64) || defined(__amd64__) || defined(__x86_64__)\n# if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__) || defined(_WIN32) || defined(_WIN64)\n#  error Windows x86_64 calling conventions are not supported yet\n# endif\n/* neat */\n#else\n# error !x86_64\n#endif\n__asm__ __volatile__ (\"vpunpcklqdq %xmm0,%xmm13,%xmm0\");\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\n$as_echo \"#define HAVE_AVX_ASM 1\" >>confdefs.h\n\n   HAVE_AVX_ASM_V=1\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nfi\n if test $HAVE_AVX_ASM_V = 1; then\n  HAVE_AVX_ASM_TRUE=\n  HAVE_AVX_ASM_FALSE='#'\nelse\n  HAVE_AVX_ASM_TRUE='#'\n  HAVE_AVX_ASM_FALSE=\nfi\n\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for 128-bit arithmetic\" >&5\n$as_echo_n \"checking for 128-bit arithmetic... \" >&6; }\nHAVE_TI_MODE_V=0\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#if !defined(__GNUC__) && !defined(__SIZEOF_INT128__)\n# error mode(TI) is a gcc extension, and __int128 is not available\n#endif\n#if defined(__clang__) && !defined(__x86_64__)\n# error clang does not properly handle the 128-bit type on 32-bit systems\n#endif\n#ifndef NATIVE_LITTLE_ENDIAN\n# error libsodium currently expects a little endian CPU for the 128-bit type\n#endif\n#ifdef __EMSCRIPTEN__\n# error emscripten currently supports only shift operations on integers \\\n#       larger than 64 bits\n#endif\n#include <stddef.h>\n#include <stdint.h>\n#if defined(__SIZEOF_INT128__)\ntypedef unsigned __int128 uint128_t;\n#else\ntypedef unsigned uint128_t __attribute__((mode(TI)));\n#endif\nvoid fcontract(uint128_t *t) {\n  *t += 0x8000000000000 - 1;\n}\n\nint\nmain ()\n{\n\n(void) fcontract;\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\n$as_echo \"#define HAVE_TI_MODE 1\" >>confdefs.h\n\n HAVE_TI_MODE_V=1\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n if test $HAVE_TI_MODE_V = 1; then\n  HAVE_TI_MODE_TRUE=\n  HAVE_TI_MODE_FALSE='#'\nelse\n  HAVE_TI_MODE_TRUE='#'\n  HAVE_TI_MODE_FALSE=\nfi\n\n\n\nHAVE_CPUID_V=0\nif test \"$enable_asm\" != \"no\"; then :\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for cpuid instruction\" >&5\n$as_echo_n \"checking for cpuid instruction... \" >&6; }\n  cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\nunsigned int cpu_info[4];\n__asm__ __volatile__ (\"xchgl %%ebx, %k1; cpuid; xchgl %%ebx, %k1\" :\n                      \"=a\" (cpu_info[0]), \"=&r\" (cpu_info[1]),\n                      \"=c\" (cpu_info[2]), \"=d\" (cpu_info[3]) :\n                      \"0\" (0U), \"2\" (0U));\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\n$as_echo \"#define HAVE_CPUID 1\" >>confdefs.h\n\n   HAVE_CPUID_V=1\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n\nfi\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if weak symbols are supported\" >&5\n$as_echo_n \"checking if weak symbols are supported... \" >&6; }\ncat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n__attribute__((weak)) void __dummy(void *x) { }\nvoid f(void *x) { __dummy(x); }\n\nint\nmain ()\n{\n\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\n\n$as_echo \"#define HAVE_WEAK_SYMBOLS 1\" >>confdefs.h\n\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking if data alignment is required\" >&5\n$as_echo_n \"checking if data alignment is required... \" >&6; }\naligned_access_required=yes\ncase $host_cpu in #(\n  i*86 | x86_64 | powerpc* | s390*) :\n    aligned_access_required=no ;; #(\n  arm*) :\n    cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\n#ifndef __ARM_FEATURE_UNALIGNED\n# error data alignment is required\n#endif\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_compile \"$LINENO\"; then :\n  aligned_access_required=no\nfi\nrm -f core conftest.err conftest.$ac_objext conftest.$ac_ext\n ;; #(\n  *) :\n     ;;\nesac\nif test \"x$aligned_access_required\" = \"xyes\"; then :\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: yes\" >&5\n$as_echo \"yes\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\n\n$as_echo \"#define CPU_UNALIGNED_ACCESS 1\" >>confdefs.h\n\nfi\n\n\nif test \"x$EMSCRIPTEN\" = \"x\"; then :\n\n  for ac_func in arc4random arc4random_buf\ndo :\n  as_ac_var=`$as_echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\nac_fn_c_check_func \"$LINENO\" \"$ac_func\" \"$as_ac_var\"\nif eval test \\\"x\\$\"$as_ac_var\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n  for ac_func in mmap mlock madvise mprotect explicit_bzero\ndo :\n  as_ac_var=`$as_echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\nac_fn_c_check_func \"$LINENO\" \"$ac_func\" \"$as_ac_var\"\nif eval test \\\"x\\$\"$as_ac_var\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\nfi\nfor ac_func in posix_memalign getpid\ndo :\n  as_ac_var=`$as_echo \"ac_cv_func_$ac_func\" | $as_tr_sh`\nac_fn_c_check_func \"$LINENO\" \"$ac_func\" \"$as_ac_var\"\nif eval test \\\"x\\$\"$as_ac_var\"\\\" = x\"yes\"; then :\n  cat >>confdefs.h <<_ACEOF\n#define `$as_echo \"HAVE_$ac_func\" | $as_tr_cpp` 1\n_ACEOF\n\nfi\ndone\n\n\n\n\nTEST_LDFLAGS=''\nif test \"x$EMSCRIPTEN\" != \"x\"; then :\n\n  EXEEXT=.js\n  TEST_LDFLAGS='--memory-init-file 0 --pre-js pre.js.inc -s NO_BROWSER=1 -s RESERVED_FUNCTION_POINTERS=8'\n\nfi\n\n if test \"x$EMSCRIPTEN\" != \"x\"; then\n  EMSCRIPTEN_TRUE=\n  EMSCRIPTEN_FALSE='#'\nelse\n  EMSCRIPTEN_TRUE='#'\n  EMSCRIPTEN_FALSE=\nfi\n\n\n if test \"x$NATIVECLIENT\" != \"x\"; then\n  NATIVECLIENT_TRUE=\n  NATIVECLIENT_FALSE='#'\nelse\n  NATIVECLIENT_TRUE='#'\n  NATIVECLIENT_FALSE=\nfi\n\n\n\n\nenable_win32_dll=yes\n\ncase $host in\n*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}as\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}as; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_AS+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$AS\"; then\n  ac_cv_prog_AS=\"$AS\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_AS=\"${ac_tool_prefix}as\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nAS=$ac_cv_prog_AS\nif test -n \"$AS\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $AS\" >&5\n$as_echo \"$AS\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_AS\"; then\n  ac_ct_AS=$AS\n  # Extract the first word of \"as\", so it can be a program name with args.\nset dummy as; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_AS+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_AS\"; then\n  ac_cv_prog_ac_ct_AS=\"$ac_ct_AS\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_AS=\"as\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_AS=$ac_cv_prog_ac_ct_AS\nif test -n \"$ac_ct_AS\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_AS\" >&5\n$as_echo \"$ac_ct_AS\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_AS\" = x; then\n    AS=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    AS=$ac_ct_AS\n  fi\nelse\n  AS=\"$ac_cv_prog_AS\"\nfi\n\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}dlltool\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}dlltool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_DLLTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$DLLTOOL\"; then\n  ac_cv_prog_DLLTOOL=\"$DLLTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_DLLTOOL=\"${ac_tool_prefix}dlltool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nDLLTOOL=$ac_cv_prog_DLLTOOL\nif test -n \"$DLLTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $DLLTOOL\" >&5\n$as_echo \"$DLLTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_DLLTOOL\"; then\n  ac_ct_DLLTOOL=$DLLTOOL\n  # Extract the first word of \"dlltool\", so it can be a program name with args.\nset dummy dlltool; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_DLLTOOL+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_DLLTOOL\"; then\n  ac_cv_prog_ac_ct_DLLTOOL=\"$ac_ct_DLLTOOL\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_DLLTOOL=\"dlltool\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_DLLTOOL=$ac_cv_prog_ac_ct_DLLTOOL\nif test -n \"$ac_ct_DLLTOOL\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_DLLTOOL\" >&5\n$as_echo \"$ac_ct_DLLTOOL\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_DLLTOOL\" = x; then\n    DLLTOOL=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    DLLTOOL=$ac_ct_DLLTOOL\n  fi\nelse\n  DLLTOOL=\"$ac_cv_prog_DLLTOOL\"\nfi\n\n  if test -n \"$ac_tool_prefix\"; then\n  # Extract the first word of \"${ac_tool_prefix}objdump\", so it can be a program name with args.\nset dummy ${ac_tool_prefix}objdump; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_OBJDUMP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$OBJDUMP\"; then\n  ac_cv_prog_OBJDUMP=\"$OBJDUMP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_OBJDUMP=\"${ac_tool_prefix}objdump\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nOBJDUMP=$ac_cv_prog_OBJDUMP\nif test -n \"$OBJDUMP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $OBJDUMP\" >&5\n$as_echo \"$OBJDUMP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n\nfi\nif test -z \"$ac_cv_prog_OBJDUMP\"; then\n  ac_ct_OBJDUMP=$OBJDUMP\n  # Extract the first word of \"objdump\", so it can be a program name with args.\nset dummy objdump; ac_word=$2\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n$as_echo_n \"checking for $ac_word... \" >&6; }\nif ${ac_cv_prog_ac_ct_OBJDUMP+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test -n \"$ac_ct_OBJDUMP\"; then\n  ac_cv_prog_ac_ct_OBJDUMP=\"$ac_ct_OBJDUMP\" # Let the user override the test.\nelse\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    for ac_exec_ext in '' $ac_executable_extensions; do\n  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n    ac_cv_prog_ac_ct_OBJDUMP=\"objdump\"\n    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n    break 2\n  fi\ndone\n  done\nIFS=$as_save_IFS\n\nfi\nfi\nac_ct_OBJDUMP=$ac_cv_prog_ac_ct_OBJDUMP\nif test -n \"$ac_ct_OBJDUMP\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_ct_OBJDUMP\" >&5\n$as_echo \"$ac_ct_OBJDUMP\" >&6; }\nelse\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n$as_echo \"no\" >&6; }\nfi\n\n  if test \"x$ac_ct_OBJDUMP\" = x; then\n    OBJDUMP=\"false\"\n  else\n    case $cross_compiling:$ac_tool_warned in\nyes:)\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet\" >&5\n$as_echo \"$as_me: WARNING: using cross tools not prefixed with host triplet\" >&2;}\nac_tool_warned=yes ;;\nesac\n    OBJDUMP=$ac_ct_OBJDUMP\n  fi\nelse\n  OBJDUMP=\"$ac_cv_prog_OBJDUMP\"\nfi\n\n  ;;\nesac\n\ntest -z \"$AS\" && AS=as\n\n\n\n\n\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\n\n\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n\n\n\n\n\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: checking if gcc/ld supports -Wl,--output-def\" >&5\n$as_echo_n \"checking if gcc/ld supports -Wl,--output-def... \" >&6; }\nif ${gl_cv_ld_output_def+:} false; then :\n  $as_echo_n \"(cached) \" >&6\nelse\n  if test \"$enable_shared\" = no; then\n       gl_cv_ld_output_def=\"not needed, shared libraries are disabled\"\n     else\n       gl_ldflags_save=$LDFLAGS\n       LDFLAGS=\"-Wl,--output-def,conftest.def\"\n       cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n/* end confdefs.h.  */\n\nint\nmain ()\n{\n\n  ;\n  return 0;\n}\n_ACEOF\nif ac_fn_c_try_link \"$LINENO\"; then :\n  gl_cv_ld_output_def=yes\nelse\n  gl_cv_ld_output_def=no\nfi\nrm -f core conftest.err conftest.$ac_objext \\\n    conftest$ac_exeext conftest.$ac_ext\n       rm -f conftest.def\n       LDFLAGS=\"$gl_ldflags_save\"\n     fi\nfi\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $gl_cv_ld_output_def\" >&5\n$as_echo \"$gl_cv_ld_output_def\" >&6; }\n   if test \"x$gl_cv_ld_output_def\" = \"xyes\"; then\n  HAVE_LD_OUTPUT_DEF_TRUE=\n  HAVE_LD_OUTPUT_DEF_FALSE='#'\nelse\n  HAVE_LD_OUTPUT_DEF_TRUE='#'\n  HAVE_LD_OUTPUT_DEF_FALSE=\nfi\n\n\n\n\n\n\nac_config_files=\"$ac_config_files Makefile src/Makefile src/libsodium/Makefile src/libsodium/include/Makefile src/libsodium/include/sodium/version.h\"\n\ncat >confcache <<\\_ACEOF\n# This file is a shell script that caches the results of configure\n# tests run on this system so they can be shared between configure\n# scripts and configure runs, see configure's option --config-cache.\n# It is not useful on other systems.  If it contains results you don't\n# want to keep, you may remove or edit it.\n#\n# config.status only pays attention to the cache file if you give it\n# the --recheck option to rerun configure.\n#\n# `ac_cv_env_foo' variables (set or unset) will be overridden when\n# loading this file, other *unset* `ac_cv_foo' will be assigned the\n# following values.\n\n_ACEOF\n\n# The following way of writing the cache mishandles newlines in values,\n# but we know of no workaround that is simple, portable, and efficient.\n# So, we kill variables containing newlines.\n# Ultrix sh set writes to stderr and can't be redirected directly,\n# and sets the high bit in the cache file unless we assign to the vars.\n(\n  for ac_var in `(set) 2>&1 | sed -n 's/^\\([a-zA-Z_][a-zA-Z0-9_]*\\)=.*/\\1/p'`; do\n    eval ac_val=\\$$ac_var\n    case $ac_val in #(\n    *${as_nl}*)\n      case $ac_var in #(\n      *_cv_*) { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: cache variable $ac_var contains a newline\" >&5\n$as_echo \"$as_me: WARNING: cache variable $ac_var contains a newline\" >&2;} ;;\n      esac\n      case $ac_var in #(\n      _ | IFS | as_nl) ;; #(\n      BASH_ARGV | BASH_SOURCE) eval $ac_var= ;; #(\n      *) { eval $ac_var=; unset $ac_var;} ;;\n      esac ;;\n    esac\n  done\n\n  (set) 2>&1 |\n    case $as_nl`(ac_space=' '; set) 2>&1` in #(\n    *${as_nl}ac_space=\\ *)\n      # `set' does not quote correctly, so add quotes: double-quote\n      # substitution turns \\\\\\\\ into \\\\, and sed turns \\\\ into \\.\n      sed -n \\\n\t\"s/'/'\\\\\\\\''/g;\n\t  s/^\\\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\\\)=\\\\(.*\\\\)/\\\\1='\\\\2'/p\"\n      ;; #(\n    *)\n      # `set' quotes correctly as required by POSIX, so do not add quotes.\n      sed -n \"/^[_$as_cr_alnum]*_cv_[_$as_cr_alnum]*=/p\"\n      ;;\n    esac |\n    sort\n) |\n  sed '\n     /^ac_cv_env_/b end\n     t clear\n     :clear\n     s/^\\([^=]*\\)=\\(.*[{}].*\\)$/test \"${\\1+set}\" = set || &/\n     t end\n     s/^\\([^=]*\\)=\\(.*\\)$/\\1=${\\1=\\2}/\n     :end' >>confcache\nif diff \"$cache_file\" confcache >/dev/null 2>&1; then :; else\n  if test -w \"$cache_file\"; then\n    if test \"x$cache_file\" != \"x/dev/null\"; then\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: updating cache $cache_file\" >&5\n$as_echo \"$as_me: updating cache $cache_file\" >&6;}\n      if test ! -f \"$cache_file\" || test -h \"$cache_file\"; then\n\tcat confcache >\"$cache_file\"\n      else\n        case $cache_file in #(\n        */* | ?:*)\n\t  mv -f confcache \"$cache_file\"$$ &&\n\t  mv -f \"$cache_file\"$$ \"$cache_file\" ;; #(\n        *)\n\t  mv -f confcache \"$cache_file\" ;;\n\tesac\n      fi\n    fi\n  else\n    { $as_echo \"$as_me:${as_lineno-$LINENO}: not updating unwritable cache $cache_file\" >&5\n$as_echo \"$as_me: not updating unwritable cache $cache_file\" >&6;}\n  fi\nfi\nrm -f confcache\n\ntest \"x$prefix\" = xNONE && prefix=$ac_default_prefix\n# Let make expand exec_prefix.\ntest \"x$exec_prefix\" = xNONE && exec_prefix='${prefix}'\n\n# Transform confdefs.h into DEFS.\n# Protect against shell expansion while executing Makefile rules.\n# Protect against Makefile macro expansion.\n#\n# If the first sed substitution is executed (which looks for macros that\n# take arguments), then branch to the quote section.  Otherwise,\n# look for a macro that doesn't take arguments.\nac_script='\n:mline\n/\\\\$/{\n N\n s,\\\\\\n,,\n b mline\n}\nt clear\n:clear\ns/^[\t ]*#[\t ]*define[\t ][\t ]*\\([^\t (][^\t (]*([^)]*)\\)[\t ]*\\(.*\\)/-D\\1=\\2/g\nt quote\ns/^[\t ]*#[\t ]*define[\t ][\t ]*\\([^\t ][^\t ]*\\)[\t ]*\\(.*\\)/-D\\1=\\2/g\nt quote\nb any\n:quote\ns/[\t `~#$^&*(){}\\\\|;'\\''\"<>?]/\\\\&/g\ns/\\[/\\\\&/g\ns/\\]/\\\\&/g\ns/\\$/$$/g\nH\n:any\n${\n\tg\n\ts/^\\n//\n\ts/\\n/ /g\n\tp\n}\n'\nDEFS=`sed -n \"$ac_script\" confdefs.h`\n\n\nac_libobjs=\nac_ltlibobjs=\nU=\nfor ac_i in : $LIBOBJS; do test \"x$ac_i\" = x: && continue\n  # 1. Remove the extension, and $U if already installed.\n  ac_script='s/\\$U\\././;s/\\.o$//;s/\\.obj$//'\n  ac_i=`$as_echo \"$ac_i\" | sed \"$ac_script\"`\n  # 2. Prepend LIBOBJDIR.  When used with automake>=1.10 LIBOBJDIR\n  #    will be set to the directory where LIBOBJS objects are built.\n  as_fn_append ac_libobjs \" \\${LIBOBJDIR}$ac_i\\$U.$ac_objext\"\n  as_fn_append ac_ltlibobjs \" \\${LIBOBJDIR}$ac_i\"'$U.lo'\ndone\nLIBOBJS=$ac_libobjs\n\nLTLIBOBJS=$ac_ltlibobjs\n\n\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking that generated files are newer than configure\" >&5\n$as_echo_n \"checking that generated files are newer than configure... \" >&6; }\n   if test -n \"$am_sleep_pid\"; then\n     # Hide warnings about reused PIDs.\n     wait $am_sleep_pid 2>/dev/null\n   fi\n   { $as_echo \"$as_me:${as_lineno-$LINENO}: result: done\" >&5\n$as_echo \"done\" >&6; }\n if test -n \"$EXEEXT\"; then\n  am__EXEEXT_TRUE=\n  am__EXEEXT_FALSE='#'\nelse\n  am__EXEEXT_TRUE='#'\n  am__EXEEXT_FALSE=\nfi\n\nif test -z \"${MAINTAINER_MODE_TRUE}\" && test -z \"${MAINTAINER_MODE_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"MAINTAINER_MODE\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${AMDEP_TRUE}\" && test -z \"${AMDEP_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"AMDEP\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${MINIMAL_TRUE}\" && test -z \"${MINIMAL_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"MINIMAL\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${am__fastdepCC_TRUE}\" && test -z \"${am__fastdepCC_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"am__fastdepCC\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${am__fastdepCCAS_TRUE}\" && test -z \"${am__fastdepCCAS_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"am__fastdepCCAS\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${HAVE_AMD64_ASM_TRUE}\" && test -z \"${HAVE_AMD64_ASM_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"HAVE_AMD64_ASM\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${HAVE_AVX_ASM_TRUE}\" && test -z \"${HAVE_AVX_ASM_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"HAVE_AVX_ASM\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${HAVE_TI_MODE_TRUE}\" && test -z \"${HAVE_TI_MODE_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"HAVE_TI_MODE\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${EMSCRIPTEN_TRUE}\" && test -z \"${EMSCRIPTEN_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"EMSCRIPTEN\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${NATIVECLIENT_TRUE}\" && test -z \"${NATIVECLIENT_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"NATIVECLIENT\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\nif test -z \"${HAVE_LD_OUTPUT_DEF_TRUE}\" && test -z \"${HAVE_LD_OUTPUT_DEF_FALSE}\"; then\n  as_fn_error $? \"conditional \\\"HAVE_LD_OUTPUT_DEF\\\" was never defined.\nUsually this means the macro was only invoked conditionally.\" \"$LINENO\" 5\nfi\n\n: \"${CONFIG_STATUS=./config.status}\"\nac_write_fail=0\nac_clean_files_save=$ac_clean_files\nac_clean_files=\"$ac_clean_files $CONFIG_STATUS\"\n{ $as_echo \"$as_me:${as_lineno-$LINENO}: creating $CONFIG_STATUS\" >&5\n$as_echo \"$as_me: creating $CONFIG_STATUS\" >&6;}\nas_write_fail=0\ncat >$CONFIG_STATUS <<_ASEOF || as_write_fail=1\n#! $SHELL\n# Generated by $as_me.\n# Run this file to recreate the current configuration.\n# Compiler output produced by configure, useful for debugging\n# configure, is in config.log if it exists.\n\ndebug=false\nac_cs_recheck=false\nac_cs_silent=false\n\nSHELL=\\${CONFIG_SHELL-$SHELL}\nexport SHELL\n_ASEOF\ncat >>$CONFIG_STATUS <<\\_ASEOF || as_write_fail=1\n## -------------------- ##\n## M4sh Initialization. ##\n## -------------------- ##\n\n# Be more Bourne compatible\nDUALCASE=1; export DUALCASE # for MKS sh\nif test -n \"${ZSH_VERSION+set}\" && (emulate sh) >/dev/null 2>&1; then :\n  emulate sh\n  NULLCMD=:\n  # Pre-4.2 versions of Zsh do word splitting on ${1+\"$@\"}, which\n  # is contrary to our usage.  Disable this feature.\n  alias -g '${1+\"$@\"}'='\"$@\"'\n  setopt NO_GLOB_SUBST\nelse\n  case `(set -o) 2>/dev/null` in #(\n  *posix*) :\n    set -o posix ;; #(\n  *) :\n     ;;\nesac\nfi\n\n\nas_nl='\n'\nexport as_nl\n# Printing a long string crashes Solaris 7 /usr/bin/printf.\nas_echo='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo\nas_echo=$as_echo$as_echo$as_echo$as_echo$as_echo$as_echo\n# Prefer a ksh shell builtin over an external printf program on Solaris,\n# but without wasting forks for bash or zsh.\nif test -z \"$BASH_VERSION$ZSH_VERSION\" \\\n    && (test \"X`print -r -- $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='print -r --'\n  as_echo_n='print -rn --'\nelif (test \"X`printf %s $as_echo`\" = \"X$as_echo\") 2>/dev/null; then\n  as_echo='printf %s\\n'\n  as_echo_n='printf %s'\nelse\n  if test \"X`(/usr/ucb/echo -n -n $as_echo) 2>/dev/null`\" = \"X-n $as_echo\"; then\n    as_echo_body='eval /usr/ucb/echo -n \"$1$as_nl\"'\n    as_echo_n='/usr/ucb/echo -n'\n  else\n    as_echo_body='eval expr \"X$1\" : \"X\\\\(.*\\\\)\"'\n    as_echo_n_body='eval\n      arg=$1;\n      case $arg in #(\n      *\"$as_nl\"*)\n\texpr \"X$arg\" : \"X\\\\(.*\\\\)$as_nl\";\n\targ=`expr \"X$arg\" : \".*$as_nl\\\\(.*\\\\)\"`;;\n      esac;\n      expr \"X$arg\" : \"X\\\\(.*\\\\)\" | tr -d \"$as_nl\"\n    '\n    export as_echo_n_body\n    as_echo_n='sh -c $as_echo_n_body as_echo'\n  fi\n  export as_echo_body\n  as_echo='sh -c $as_echo_body as_echo'\nfi\n\n# The user is always right.\nif test \"${PATH_SEPARATOR+set}\" != set; then\n  PATH_SEPARATOR=:\n  (PATH='/bin;/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 && {\n    (PATH='/bin:/bin'; FPATH=$PATH; sh -c :) >/dev/null 2>&1 ||\n      PATH_SEPARATOR=';'\n  }\nfi\n\n\n# IFS\n# We need space, tab and new line, in precisely that order.  Quoting is\n# there to prevent editors from complaining about space-tab.\n# (If _AS_PATH_WALK were called with IFS unset, it would disable word\n# splitting by setting IFS to empty value.)\nIFS=\" \"\"\t$as_nl\"\n\n# Find who we are.  Look in the path if we contain no directory separator.\nas_myself=\ncase $0 in #((\n  *[\\\\/]* ) as_myself=$0 ;;\n  *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n    test -r \"$as_dir/$0\" && as_myself=$as_dir/$0 && break\n  done\nIFS=$as_save_IFS\n\n     ;;\nesac\n# We did not find ourselves, most probably we were run as `sh COMMAND'\n# in which case we are not to be found in the path.\nif test \"x$as_myself\" = x; then\n  as_myself=$0\nfi\nif test ! -f \"$as_myself\"; then\n  $as_echo \"$as_myself: error: cannot find myself; rerun with an absolute file name\" >&2\n  exit 1\nfi\n\n# Unset variables that we do not need and which cause bugs (e.g. in\n# pre-3.0 UWIN ksh).  But do not cause bugs in bash 2.01; the \"|| exit 1\"\n# suppresses any \"Segmentation fault\" message there.  '((' could\n# trigger a bug in pdksh 5.2.14.\nfor as_var in BASH_ENV ENV MAIL MAILPATH\ndo eval test x\\${$as_var+set} = xset \\\n  && ( (unset $as_var) || exit 1) >/dev/null 2>&1 && unset $as_var || :\ndone\nPS1='$ '\nPS2='> '\nPS4='+ '\n\n# NLS nuisances.\nLC_ALL=C\nexport LC_ALL\nLANGUAGE=C\nexport LANGUAGE\n\n# CDPATH.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\n\n# as_fn_error STATUS ERROR [LINENO LOG_FD]\n# ----------------------------------------\n# Output \"`basename $0`: error: ERROR\" to stderr. If LINENO and LOG_FD are\n# provided, also output the error to LOG_FD, referencing LINENO. Then exit the\n# script with STATUS, using 1 if that was 0.\nas_fn_error ()\n{\n  as_status=$1; test $as_status -eq 0 && as_status=1\n  if test \"$4\"; then\n    as_lineno=${as_lineno-\"$3\"} as_lineno_stack=as_lineno_stack=$as_lineno_stack\n    $as_echo \"$as_me:${as_lineno-$LINENO}: error: $2\" >&$4\n  fi\n  $as_echo \"$as_me: error: $2\" >&2\n  as_fn_exit $as_status\n} # as_fn_error\n\n\n# as_fn_set_status STATUS\n# -----------------------\n# Set $? to STATUS, without forking.\nas_fn_set_status ()\n{\n  return $1\n} # as_fn_set_status\n\n# as_fn_exit STATUS\n# -----------------\n# Exit the shell with STATUS, even in a \"trap 0\" or \"set -e\" context.\nas_fn_exit ()\n{\n  set +e\n  as_fn_set_status $1\n  exit $1\n} # as_fn_exit\n\n# as_fn_unset VAR\n# ---------------\n# Portably unset VAR.\nas_fn_unset ()\n{\n  { eval $1=; unset $1;}\n}\nas_unset=as_fn_unset\n# as_fn_append VAR VALUE\n# ----------------------\n# Append the text in VALUE to the end of the definition contained in VAR. Take\n# advantage of any shell optimizations that allow amortized linear growth over\n# repeated appends, instead of the typical quadratic growth present in naive\n# implementations.\nif (eval \"as_var=1; as_var+=2; test x\\$as_var = x12\") 2>/dev/null; then :\n  eval 'as_fn_append ()\n  {\n    eval $1+=\\$2\n  }'\nelse\n  as_fn_append ()\n  {\n    eval $1=\\$$1\\$2\n  }\nfi # as_fn_append\n\n# as_fn_arith ARG...\n# ------------------\n# Perform arithmetic evaluation on the ARGs, and store the result in the\n# global $as_val. Take advantage of shells that can avoid forks. The arguments\n# must be portable across $(()) and expr.\nif (eval \"test \\$(( 1 + 1 )) = 2\") 2>/dev/null; then :\n  eval 'as_fn_arith ()\n  {\n    as_val=$(( $* ))\n  }'\nelse\n  as_fn_arith ()\n  {\n    as_val=`expr \"$@\" || test $? -eq 1`\n  }\nfi # as_fn_arith\n\n\nif expr a : '\\(a\\)' >/dev/null 2>&1 &&\n   test \"X`expr 00001 : '.*\\(...\\)'`\" = X001; then\n  as_expr=expr\nelse\n  as_expr=false\nfi\n\nif (basename -- /) >/dev/null 2>&1 && test \"X`basename -- / 2>&1`\" = \"X/\"; then\n  as_basename=basename\nelse\n  as_basename=false\nfi\n\nif (as_dir=`dirname -- /` && test \"X$as_dir\" = X/) >/dev/null 2>&1; then\n  as_dirname=dirname\nelse\n  as_dirname=false\nfi\n\nas_me=`$as_basename -- \"$0\" ||\n$as_expr X/\"$0\" : '.*/\\([^/][^/]*\\)/*$' \\| \\\n\t X\"$0\" : 'X\\(//\\)$' \\| \\\n\t X\"$0\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X/\"$0\" |\n    sed '/^.*\\/\\([^/][^/]*\\)\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\/\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n\n# Avoid depending upon Character Ranges.\nas_cr_letters='abcdefghijklmnopqrstuvwxyz'\nas_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ'\nas_cr_Letters=$as_cr_letters$as_cr_LETTERS\nas_cr_digits='0123456789'\nas_cr_alnum=$as_cr_Letters$as_cr_digits\n\nECHO_C= ECHO_N= ECHO_T=\ncase `echo -n x` in #(((((\n-n*)\n  case `echo 'xy\\c'` in\n  *c*) ECHO_T='\t';;\t# ECHO_T is single tab character.\n  xy)  ECHO_C='\\c';;\n  *)   echo `echo ksh88 bug on AIX 6.1` > /dev/null\n       ECHO_T='\t';;\n  esac;;\n*)\n  ECHO_N='-n';;\nesac\n\nrm -f conf$$ conf$$.exe conf$$.file\nif test -d conf$$.dir; then\n  rm -f conf$$.dir/conf$$.file\nelse\n  rm -f conf$$.dir\n  mkdir conf$$.dir 2>/dev/null\nfi\nif (echo >conf$$.file) 2>/dev/null; then\n  if ln -s conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s='ln -s'\n    # ... but there are two gotchas:\n    # 1) On MSYS, both `ln -s file dir' and `ln file dir' fail.\n    # 2) DJGPP < 2.04 has no symlinks; `ln -s' creates a wrapper executable.\n    # In both cases, we have to default to `cp -pR'.\n    ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe ||\n      as_ln_s='cp -pR'\n  elif ln conf$$.file conf$$ 2>/dev/null; then\n    as_ln_s=ln\n  else\n    as_ln_s='cp -pR'\n  fi\nelse\n  as_ln_s='cp -pR'\nfi\nrm -f conf$$ conf$$.exe conf$$.dir/conf$$.file conf$$.file\nrmdir conf$$.dir 2>/dev/null\n\n\n# as_fn_mkdir_p\n# -------------\n# Create \"$as_dir\" as a directory, including parents if necessary.\nas_fn_mkdir_p ()\n{\n\n  case $as_dir in #(\n  -*) as_dir=./$as_dir;;\n  esac\n  test -d \"$as_dir\" || eval $as_mkdir_p || {\n    as_dirs=\n    while :; do\n      case $as_dir in #(\n      *\\'*) as_qdir=`$as_echo \"$as_dir\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; #'(\n      *) as_qdir=$as_dir;;\n      esac\n      as_dirs=\"'$as_qdir' $as_dirs\"\n      as_dir=`$as_dirname -- \"$as_dir\" ||\n$as_expr X\"$as_dir\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$as_dir\" : 'X\\(//\\)$' \\| \\\n\t X\"$as_dir\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$as_dir\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      test -d \"$as_dir\" && break\n    done\n    test -z \"$as_dirs\" || eval \"mkdir $as_dirs\"\n  } || test -d \"$as_dir\" || as_fn_error $? \"cannot create directory $as_dir\"\n\n\n} # as_fn_mkdir_p\nif mkdir -p . 2>/dev/null; then\n  as_mkdir_p='mkdir -p \"$as_dir\"'\nelse\n  test -d ./-p && rmdir ./-p\n  as_mkdir_p=false\nfi\n\n\n# as_fn_executable_p FILE\n# -----------------------\n# Test if FILE is an executable regular file.\nas_fn_executable_p ()\n{\n  test -f \"$1\" && test -x \"$1\"\n} # as_fn_executable_p\nas_test_x='test -x'\nas_executable_p=as_fn_executable_p\n\n# Sed expression to map a string onto a valid CPP name.\nas_tr_cpp=\"eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'\"\n\n# Sed expression to map a string onto a valid variable name.\nas_tr_sh=\"eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'\"\n\n\nexec 6>&1\n## ----------------------------------- ##\n## Main body of $CONFIG_STATUS script. ##\n## ----------------------------------- ##\n_ASEOF\ntest $as_write_fail = 0 && chmod +x $CONFIG_STATUS || ac_write_fail=1\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# Save the log message, to keep $0 and so on meaningful, and to\n# report actual input values of CONFIG_FILES etc. instead of their\n# values after options handling.\nac_log=\"\nThis file was extended by libsodium $as_me 1.0.7, which was\ngenerated by GNU Autoconf 2.69.  Invocation command line was\n\n  CONFIG_FILES    = $CONFIG_FILES\n  CONFIG_HEADERS  = $CONFIG_HEADERS\n  CONFIG_LINKS    = $CONFIG_LINKS\n  CONFIG_COMMANDS = $CONFIG_COMMANDS\n  $ $0 $@\n\non `(hostname || uname -n) 2>/dev/null | sed 1q`\n\"\n\n_ACEOF\n\ncase $ac_config_files in *\"\n\"*) set x $ac_config_files; shift; ac_config_files=$*;;\nesac\n\n\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n# Files that config.status was made for.\nconfig_files=\"$ac_config_files\"\nconfig_commands=\"$ac_config_commands\"\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nac_cs_usage=\"\\\n\\`$as_me' instantiates files and other configuration actions\nfrom templates according to the current configuration.  Unless the files\nand actions are specified as TAGs, all are instantiated by default.\n\nUsage: $0 [OPTION]... [TAG]...\n\n  -h, --help       print this help, then exit\n  -V, --version    print version number and configuration settings, then exit\n      --config     print configuration, then exit\n  -q, --quiet, --silent\n                   do not print progress messages\n  -d, --debug      don't remove temporary files\n      --recheck    update $as_me by reconfiguring in the same conditions\n      --file=FILE[:TEMPLATE]\n                   instantiate the configuration file FILE\n\nConfiguration files:\n$config_files\n\nConfiguration commands:\n$config_commands\n\nReport bugs to <https://github.com/jedisct1/libsodium/issues>.\nlibsodium home page: <https://github.com/jedisct1/libsodium>.\"\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_cs_config=\"`$as_echo \"$ac_configure_args\" | sed 's/^ //; s/[\\\\\"\"\\`\\$]/\\\\\\\\&/g'`\"\nac_cs_version=\"\\\\\nlibsodium config.status 1.0.7\nconfigured by $0, generated by GNU Autoconf 2.69,\n  with options \\\\\"\\$ac_cs_config\\\\\"\n\nCopyright (C) 2012 Free Software Foundation, Inc.\nThis config.status script is free software; the Free Software Foundation\ngives unlimited permission to copy, distribute and modify it.\"\n\nac_pwd='$ac_pwd'\nsrcdir='$srcdir'\nINSTALL='$INSTALL'\nMKDIR_P='$MKDIR_P'\nAWK='$AWK'\ntest -n \"\\$AWK\" || AWK=awk\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# The default lists apply if the user does not specify any file.\nac_need_defaults=:\nwhile test $# != 0\ndo\n  case $1 in\n  --*=?*)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=`expr \"X$1\" : 'X[^=]*=\\(.*\\)'`\n    ac_shift=:\n    ;;\n  --*=)\n    ac_option=`expr \"X$1\" : 'X\\([^=]*\\)='`\n    ac_optarg=\n    ac_shift=:\n    ;;\n  *)\n    ac_option=$1\n    ac_optarg=$2\n    ac_shift=shift\n    ;;\n  esac\n\n  case $ac_option in\n  # Handling of the options.\n  -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r)\n    ac_cs_recheck=: ;;\n  --version | --versio | --versi | --vers | --ver | --ve | --v | -V )\n    $as_echo \"$ac_cs_version\"; exit ;;\n  --config | --confi | --conf | --con | --co | --c )\n    $as_echo \"$ac_cs_config\"; exit ;;\n  --debug | --debu | --deb | --de | --d | -d )\n    debug=: ;;\n  --file | --fil | --fi | --f )\n    $ac_shift\n    case $ac_optarg in\n    *\\'*) ac_optarg=`$as_echo \"$ac_optarg\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"` ;;\n    '') as_fn_error $? \"missing file argument\" ;;\n    esac\n    as_fn_append CONFIG_FILES \" '$ac_optarg'\"\n    ac_need_defaults=false;;\n  --he | --h |  --help | --hel | -h )\n    $as_echo \"$ac_cs_usage\"; exit ;;\n  -q | -quiet | --quiet | --quie | --qui | --qu | --q \\\n  | -silent | --silent | --silen | --sile | --sil | --si | --s)\n    ac_cs_silent=: ;;\n\n  # This is an error.\n  -*) as_fn_error $? \"unrecognized option: \\`$1'\nTry \\`$0 --help' for more information.\" ;;\n\n  *) as_fn_append ac_config_targets \" $1\"\n     ac_need_defaults=false ;;\n\n  esac\n  shift\ndone\n\nac_configure_extra_args=\n\nif $ac_cs_silent; then\n  exec 6>/dev/null\n  ac_configure_extra_args=\"$ac_configure_extra_args --silent\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nif \\$ac_cs_recheck; then\n  set X $SHELL '$0' $ac_configure_args \\$ac_configure_extra_args --no-create --no-recursion\n  shift\n  \\$as_echo \"running CONFIG_SHELL=$SHELL \\$*\" >&6\n  CONFIG_SHELL='$SHELL'\n  export CONFIG_SHELL\n  exec \"\\$@\"\nfi\n\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nexec 5>>config.log\n{\n  echo\n  sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX\n## Running $as_me. ##\n_ASBOX\n  $as_echo \"$ac_log\"\n} >&5\n\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n#\n# INIT-COMMANDS\n#\nAMDEP_TRUE=\"$AMDEP_TRUE\" ac_aux_dir=\"$ac_aux_dir\"\n\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nsed_quote_subst='$sed_quote_subst'\ndouble_quote_subst='$double_quote_subst'\ndelay_variable_subst='$delay_variable_subst'\nmacro_version='`$ECHO \"$macro_version\" | $SED \"$delay_single_quote_subst\"`'\nmacro_revision='`$ECHO \"$macro_revision\" | $SED \"$delay_single_quote_subst\"`'\nenable_shared='`$ECHO \"$enable_shared\" | $SED \"$delay_single_quote_subst\"`'\nenable_static='`$ECHO \"$enable_static\" | $SED \"$delay_single_quote_subst\"`'\npic_mode='`$ECHO \"$pic_mode\" | $SED \"$delay_single_quote_subst\"`'\nenable_fast_install='`$ECHO \"$enable_fast_install\" | $SED \"$delay_single_quote_subst\"`'\nSHELL='`$ECHO \"$SHELL\" | $SED \"$delay_single_quote_subst\"`'\nECHO='`$ECHO \"$ECHO\" | $SED \"$delay_single_quote_subst\"`'\nPATH_SEPARATOR='`$ECHO \"$PATH_SEPARATOR\" | $SED \"$delay_single_quote_subst\"`'\nhost_alias='`$ECHO \"$host_alias\" | $SED \"$delay_single_quote_subst\"`'\nhost='`$ECHO \"$host\" | $SED \"$delay_single_quote_subst\"`'\nhost_os='`$ECHO \"$host_os\" | $SED \"$delay_single_quote_subst\"`'\nbuild_alias='`$ECHO \"$build_alias\" | $SED \"$delay_single_quote_subst\"`'\nbuild='`$ECHO \"$build\" | $SED \"$delay_single_quote_subst\"`'\nbuild_os='`$ECHO \"$build_os\" | $SED \"$delay_single_quote_subst\"`'\nSED='`$ECHO \"$SED\" | $SED \"$delay_single_quote_subst\"`'\nXsed='`$ECHO \"$Xsed\" | $SED \"$delay_single_quote_subst\"`'\nGREP='`$ECHO \"$GREP\" | $SED \"$delay_single_quote_subst\"`'\nEGREP='`$ECHO \"$EGREP\" | $SED \"$delay_single_quote_subst\"`'\nFGREP='`$ECHO \"$FGREP\" | $SED \"$delay_single_quote_subst\"`'\nLD='`$ECHO \"$LD\" | $SED \"$delay_single_quote_subst\"`'\nNM='`$ECHO \"$NM\" | $SED \"$delay_single_quote_subst\"`'\nLN_S='`$ECHO \"$LN_S\" | $SED \"$delay_single_quote_subst\"`'\nmax_cmd_len='`$ECHO \"$max_cmd_len\" | $SED \"$delay_single_quote_subst\"`'\nac_objext='`$ECHO \"$ac_objext\" | $SED \"$delay_single_quote_subst\"`'\nexeext='`$ECHO \"$exeext\" | $SED \"$delay_single_quote_subst\"`'\nlt_unset='`$ECHO \"$lt_unset\" | $SED \"$delay_single_quote_subst\"`'\nlt_SP2NL='`$ECHO \"$lt_SP2NL\" | $SED \"$delay_single_quote_subst\"`'\nlt_NL2SP='`$ECHO \"$lt_NL2SP\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_to_host_file_cmd='`$ECHO \"$lt_cv_to_host_file_cmd\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_to_tool_file_cmd='`$ECHO \"$lt_cv_to_tool_file_cmd\" | $SED \"$delay_single_quote_subst\"`'\nreload_flag='`$ECHO \"$reload_flag\" | $SED \"$delay_single_quote_subst\"`'\nreload_cmds='`$ECHO \"$reload_cmds\" | $SED \"$delay_single_quote_subst\"`'\nOBJDUMP='`$ECHO \"$OBJDUMP\" | $SED \"$delay_single_quote_subst\"`'\ndeplibs_check_method='`$ECHO \"$deplibs_check_method\" | $SED \"$delay_single_quote_subst\"`'\nfile_magic_cmd='`$ECHO \"$file_magic_cmd\" | $SED \"$delay_single_quote_subst\"`'\nfile_magic_glob='`$ECHO \"$file_magic_glob\" | $SED \"$delay_single_quote_subst\"`'\nwant_nocaseglob='`$ECHO \"$want_nocaseglob\" | $SED \"$delay_single_quote_subst\"`'\nDLLTOOL='`$ECHO \"$DLLTOOL\" | $SED \"$delay_single_quote_subst\"`'\nsharedlib_from_linklib_cmd='`$ECHO \"$sharedlib_from_linklib_cmd\" | $SED \"$delay_single_quote_subst\"`'\nAR='`$ECHO \"$AR\" | $SED \"$delay_single_quote_subst\"`'\nAR_FLAGS='`$ECHO \"$AR_FLAGS\" | $SED \"$delay_single_quote_subst\"`'\narchiver_list_spec='`$ECHO \"$archiver_list_spec\" | $SED \"$delay_single_quote_subst\"`'\nSTRIP='`$ECHO \"$STRIP\" | $SED \"$delay_single_quote_subst\"`'\nRANLIB='`$ECHO \"$RANLIB\" | $SED \"$delay_single_quote_subst\"`'\nold_postinstall_cmds='`$ECHO \"$old_postinstall_cmds\" | $SED \"$delay_single_quote_subst\"`'\nold_postuninstall_cmds='`$ECHO \"$old_postuninstall_cmds\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_cmds='`$ECHO \"$old_archive_cmds\" | $SED \"$delay_single_quote_subst\"`'\nlock_old_archive_extraction='`$ECHO \"$lock_old_archive_extraction\" | $SED \"$delay_single_quote_subst\"`'\nCC='`$ECHO \"$CC\" | $SED \"$delay_single_quote_subst\"`'\nCFLAGS='`$ECHO \"$CFLAGS\" | $SED \"$delay_single_quote_subst\"`'\ncompiler='`$ECHO \"$compiler\" | $SED \"$delay_single_quote_subst\"`'\nGCC='`$ECHO \"$GCC\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_pipe='`$ECHO \"$lt_cv_sys_global_symbol_pipe\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_cdecl='`$ECHO \"$lt_cv_sys_global_symbol_to_cdecl\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_c_name_address='`$ECHO \"$lt_cv_sys_global_symbol_to_c_name_address\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix='`$ECHO \"$lt_cv_sys_global_symbol_to_c_name_address_lib_prefix\" | $SED \"$delay_single_quote_subst\"`'\nnm_file_list_spec='`$ECHO \"$nm_file_list_spec\" | $SED \"$delay_single_quote_subst\"`'\nlt_sysroot='`$ECHO \"$lt_sysroot\" | $SED \"$delay_single_quote_subst\"`'\nobjdir='`$ECHO \"$objdir\" | $SED \"$delay_single_quote_subst\"`'\nMAGIC_CMD='`$ECHO \"$MAGIC_CMD\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_no_builtin_flag='`$ECHO \"$lt_prog_compiler_no_builtin_flag\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_pic='`$ECHO \"$lt_prog_compiler_pic\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_wl='`$ECHO \"$lt_prog_compiler_wl\" | $SED \"$delay_single_quote_subst\"`'\nlt_prog_compiler_static='`$ECHO \"$lt_prog_compiler_static\" | $SED \"$delay_single_quote_subst\"`'\nlt_cv_prog_compiler_c_o='`$ECHO \"$lt_cv_prog_compiler_c_o\" | $SED \"$delay_single_quote_subst\"`'\nneed_locks='`$ECHO \"$need_locks\" | $SED \"$delay_single_quote_subst\"`'\nMANIFEST_TOOL='`$ECHO \"$MANIFEST_TOOL\" | $SED \"$delay_single_quote_subst\"`'\nDSYMUTIL='`$ECHO \"$DSYMUTIL\" | $SED \"$delay_single_quote_subst\"`'\nNMEDIT='`$ECHO \"$NMEDIT\" | $SED \"$delay_single_quote_subst\"`'\nLIPO='`$ECHO \"$LIPO\" | $SED \"$delay_single_quote_subst\"`'\nOTOOL='`$ECHO \"$OTOOL\" | $SED \"$delay_single_quote_subst\"`'\nOTOOL64='`$ECHO \"$OTOOL64\" | $SED \"$delay_single_quote_subst\"`'\nlibext='`$ECHO \"$libext\" | $SED \"$delay_single_quote_subst\"`'\nshrext_cmds='`$ECHO \"$shrext_cmds\" | $SED \"$delay_single_quote_subst\"`'\nextract_expsyms_cmds='`$ECHO \"$extract_expsyms_cmds\" | $SED \"$delay_single_quote_subst\"`'\narchive_cmds_need_lc='`$ECHO \"$archive_cmds_need_lc\" | $SED \"$delay_single_quote_subst\"`'\nenable_shared_with_static_runtimes='`$ECHO \"$enable_shared_with_static_runtimes\" | $SED \"$delay_single_quote_subst\"`'\nexport_dynamic_flag_spec='`$ECHO \"$export_dynamic_flag_spec\" | $SED \"$delay_single_quote_subst\"`'\nwhole_archive_flag_spec='`$ECHO \"$whole_archive_flag_spec\" | $SED \"$delay_single_quote_subst\"`'\ncompiler_needs_object='`$ECHO \"$compiler_needs_object\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_from_new_cmds='`$ECHO \"$old_archive_from_new_cmds\" | $SED \"$delay_single_quote_subst\"`'\nold_archive_from_expsyms_cmds='`$ECHO \"$old_archive_from_expsyms_cmds\" | $SED \"$delay_single_quote_subst\"`'\narchive_cmds='`$ECHO \"$archive_cmds\" | $SED \"$delay_single_quote_subst\"`'\narchive_expsym_cmds='`$ECHO \"$archive_expsym_cmds\" | $SED \"$delay_single_quote_subst\"`'\nmodule_cmds='`$ECHO \"$module_cmds\" | $SED \"$delay_single_quote_subst\"`'\nmodule_expsym_cmds='`$ECHO \"$module_expsym_cmds\" | $SED \"$delay_single_quote_subst\"`'\nwith_gnu_ld='`$ECHO \"$with_gnu_ld\" | $SED \"$delay_single_quote_subst\"`'\nallow_undefined_flag='`$ECHO \"$allow_undefined_flag\" | $SED \"$delay_single_quote_subst\"`'\nno_undefined_flag='`$ECHO \"$no_undefined_flag\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_libdir_flag_spec='`$ECHO \"$hardcode_libdir_flag_spec\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_libdir_separator='`$ECHO \"$hardcode_libdir_separator\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_direct='`$ECHO \"$hardcode_direct\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_direct_absolute='`$ECHO \"$hardcode_direct_absolute\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_minus_L='`$ECHO \"$hardcode_minus_L\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_shlibpath_var='`$ECHO \"$hardcode_shlibpath_var\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_automatic='`$ECHO \"$hardcode_automatic\" | $SED \"$delay_single_quote_subst\"`'\ninherit_rpath='`$ECHO \"$inherit_rpath\" | $SED \"$delay_single_quote_subst\"`'\nlink_all_deplibs='`$ECHO \"$link_all_deplibs\" | $SED \"$delay_single_quote_subst\"`'\nalways_export_symbols='`$ECHO \"$always_export_symbols\" | $SED \"$delay_single_quote_subst\"`'\nexport_symbols_cmds='`$ECHO \"$export_symbols_cmds\" | $SED \"$delay_single_quote_subst\"`'\nexclude_expsyms='`$ECHO \"$exclude_expsyms\" | $SED \"$delay_single_quote_subst\"`'\ninclude_expsyms='`$ECHO \"$include_expsyms\" | $SED \"$delay_single_quote_subst\"`'\nprelink_cmds='`$ECHO \"$prelink_cmds\" | $SED \"$delay_single_quote_subst\"`'\npostlink_cmds='`$ECHO \"$postlink_cmds\" | $SED \"$delay_single_quote_subst\"`'\nfile_list_spec='`$ECHO \"$file_list_spec\" | $SED \"$delay_single_quote_subst\"`'\nvariables_saved_for_relink='`$ECHO \"$variables_saved_for_relink\" | $SED \"$delay_single_quote_subst\"`'\nneed_lib_prefix='`$ECHO \"$need_lib_prefix\" | $SED \"$delay_single_quote_subst\"`'\nneed_version='`$ECHO \"$need_version\" | $SED \"$delay_single_quote_subst\"`'\nversion_type='`$ECHO \"$version_type\" | $SED \"$delay_single_quote_subst\"`'\nrunpath_var='`$ECHO \"$runpath_var\" | $SED \"$delay_single_quote_subst\"`'\nshlibpath_var='`$ECHO \"$shlibpath_var\" | $SED \"$delay_single_quote_subst\"`'\nshlibpath_overrides_runpath='`$ECHO \"$shlibpath_overrides_runpath\" | $SED \"$delay_single_quote_subst\"`'\nlibname_spec='`$ECHO \"$libname_spec\" | $SED \"$delay_single_quote_subst\"`'\nlibrary_names_spec='`$ECHO \"$library_names_spec\" | $SED \"$delay_single_quote_subst\"`'\nsoname_spec='`$ECHO \"$soname_spec\" | $SED \"$delay_single_quote_subst\"`'\ninstall_override_mode='`$ECHO \"$install_override_mode\" | $SED \"$delay_single_quote_subst\"`'\npostinstall_cmds='`$ECHO \"$postinstall_cmds\" | $SED \"$delay_single_quote_subst\"`'\npostuninstall_cmds='`$ECHO \"$postuninstall_cmds\" | $SED \"$delay_single_quote_subst\"`'\nfinish_cmds='`$ECHO \"$finish_cmds\" | $SED \"$delay_single_quote_subst\"`'\nfinish_eval='`$ECHO \"$finish_eval\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_into_libs='`$ECHO \"$hardcode_into_libs\" | $SED \"$delay_single_quote_subst\"`'\nsys_lib_search_path_spec='`$ECHO \"$sys_lib_search_path_spec\" | $SED \"$delay_single_quote_subst\"`'\nsys_lib_dlsearch_path_spec='`$ECHO \"$sys_lib_dlsearch_path_spec\" | $SED \"$delay_single_quote_subst\"`'\nhardcode_action='`$ECHO \"$hardcode_action\" | $SED \"$delay_single_quote_subst\"`'\nenable_dlopen='`$ECHO \"$enable_dlopen\" | $SED \"$delay_single_quote_subst\"`'\nenable_dlopen_self='`$ECHO \"$enable_dlopen_self\" | $SED \"$delay_single_quote_subst\"`'\nenable_dlopen_self_static='`$ECHO \"$enable_dlopen_self_static\" | $SED \"$delay_single_quote_subst\"`'\nold_striplib='`$ECHO \"$old_striplib\" | $SED \"$delay_single_quote_subst\"`'\nstriplib='`$ECHO \"$striplib\" | $SED \"$delay_single_quote_subst\"`'\nAS='`$ECHO \"$AS\" | $SED \"$delay_single_quote_subst\"`'\n\nLTCC='$LTCC'\nLTCFLAGS='$LTCFLAGS'\ncompiler='$compiler_DEFAULT'\n\n# A function that is used when there is no print builtin or printf.\nfunc_fallback_echo ()\n{\n  eval 'cat <<_LTECHO_EOF\n\\$1\n_LTECHO_EOF'\n}\n\n# Quote evaled strings.\nfor var in SHELL \\\nECHO \\\nPATH_SEPARATOR \\\nSED \\\nGREP \\\nEGREP \\\nFGREP \\\nLD \\\nNM \\\nLN_S \\\nlt_SP2NL \\\nlt_NL2SP \\\nreload_flag \\\nOBJDUMP \\\ndeplibs_check_method \\\nfile_magic_cmd \\\nfile_magic_glob \\\nwant_nocaseglob \\\nDLLTOOL \\\nsharedlib_from_linklib_cmd \\\nAR \\\nAR_FLAGS \\\narchiver_list_spec \\\nSTRIP \\\nRANLIB \\\nCC \\\nCFLAGS \\\ncompiler \\\nlt_cv_sys_global_symbol_pipe \\\nlt_cv_sys_global_symbol_to_cdecl \\\nlt_cv_sys_global_symbol_to_c_name_address \\\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix \\\nnm_file_list_spec \\\nlt_prog_compiler_no_builtin_flag \\\nlt_prog_compiler_pic \\\nlt_prog_compiler_wl \\\nlt_prog_compiler_static \\\nlt_cv_prog_compiler_c_o \\\nneed_locks \\\nMANIFEST_TOOL \\\nDSYMUTIL \\\nNMEDIT \\\nLIPO \\\nOTOOL \\\nOTOOL64 \\\nshrext_cmds \\\nexport_dynamic_flag_spec \\\nwhole_archive_flag_spec \\\ncompiler_needs_object \\\nwith_gnu_ld \\\nallow_undefined_flag \\\nno_undefined_flag \\\nhardcode_libdir_flag_spec \\\nhardcode_libdir_separator \\\nexclude_expsyms \\\ninclude_expsyms \\\nfile_list_spec \\\nvariables_saved_for_relink \\\nlibname_spec \\\nlibrary_names_spec \\\nsoname_spec \\\ninstall_override_mode \\\nfinish_eval \\\nold_striplib \\\nstriplib \\\nAS; do\n    case \\`eval \\\\\\\\\\$ECHO \\\\\\\\\"\"\\\\\\\\\\$\\$var\"\\\\\\\\\"\\` in\n    *[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"\\\\\\$\\$var\\\\\" | \\\\\\$SED \\\\\"\\\\\\$sed_quote_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n# Double-quote double-evaled strings.\nfor var in reload_cmds \\\nold_postinstall_cmds \\\nold_postuninstall_cmds \\\nold_archive_cmds \\\nextract_expsyms_cmds \\\nold_archive_from_new_cmds \\\nold_archive_from_expsyms_cmds \\\narchive_cmds \\\narchive_expsym_cmds \\\nmodule_cmds \\\nmodule_expsym_cmds \\\nexport_symbols_cmds \\\nprelink_cmds \\\npostlink_cmds \\\npostinstall_cmds \\\npostuninstall_cmds \\\nfinish_cmds \\\nsys_lib_search_path_spec \\\nsys_lib_dlsearch_path_spec; do\n    case \\`eval \\\\\\\\\\$ECHO \\\\\\\\\"\"\\\\\\\\\\$\\$var\"\\\\\\\\\"\\` in\n    *[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"\\\\\\$\\$var\\\\\" | \\\\\\$SED -e \\\\\"\\\\\\$double_quote_subst\\\\\" -e \\\\\"\\\\\\$sed_quote_subst\\\\\" -e \\\\\"\\\\\\$delay_variable_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\nac_aux_dir='$ac_aux_dir'\nxsi_shell='$xsi_shell'\nlt_shell_append='$lt_shell_append'\n\n# See if we are running on zsh, and set the options which allow our\n# commands through without removal of \\ escapes INIT.\nif test -n \"\\${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n\n\n    PACKAGE='$PACKAGE'\n    VERSION='$VERSION'\n    TIMESTAMP='$TIMESTAMP'\n    RM='$RM'\n    ofile='$ofile'\n\n\n\n\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n\n# Handling of arguments.\nfor ac_config_target in $ac_config_targets\ndo\n  case $ac_config_target in\n    \"depfiles\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS depfiles\" ;;\n    \"libtool\") CONFIG_COMMANDS=\"$CONFIG_COMMANDS libtool\" ;;\n    \"Makefile\") CONFIG_FILES=\"$CONFIG_FILES Makefile\" ;;\n    \"src/Makefile\") CONFIG_FILES=\"$CONFIG_FILES src/Makefile\" ;;\n    \"src/libsodium/Makefile\") CONFIG_FILES=\"$CONFIG_FILES src/libsodium/Makefile\" ;;\n    \"src/libsodium/include/Makefile\") CONFIG_FILES=\"$CONFIG_FILES src/libsodium/include/Makefile\" ;;\n    \"src/libsodium/include/sodium/version.h\") CONFIG_FILES=\"$CONFIG_FILES src/libsodium/include/sodium/version.h\" ;;\n\n  *) as_fn_error $? \"invalid argument: \\`$ac_config_target'\" \"$LINENO\" 5;;\n  esac\ndone\n\n\n# If the user did not use the arguments to specify the items to instantiate,\n# then the envvar interface is used.  Set only those that are not.\n# We use the long form for the default assignment because of an extremely\n# bizarre bug on SunOS 4.1.3.\nif $ac_need_defaults; then\n  test \"${CONFIG_FILES+set}\" = set || CONFIG_FILES=$config_files\n  test \"${CONFIG_COMMANDS+set}\" = set || CONFIG_COMMANDS=$config_commands\nfi\n\n# Have a temporary directory for convenience.  Make it in the build tree\n# simply because there is no reason against having it here, and in addition,\n# creating and moving files from /tmp can sometimes cause problems.\n# Hook for its removal unless debugging.\n# Note that there is a small window in which the directory will not be cleaned:\n# after its creation but before its name has been assigned to `$tmp'.\n$debug ||\n{\n  tmp= ac_tmp=\n  trap 'exit_status=$?\n  : \"${ac_tmp:=$tmp}\"\n  { test ! -d \"$ac_tmp\" || rm -fr \"$ac_tmp\"; } && exit $exit_status\n' 0\n  trap 'as_fn_exit 1' 1 2 13 15\n}\n# Create a (secure) tmp directory for tmp files.\n\n{\n  tmp=`(umask 077 && mktemp -d \"./confXXXXXX\") 2>/dev/null` &&\n  test -d \"$tmp\"\n}  ||\n{\n  tmp=./conf$$-$RANDOM\n  (umask 077 && mkdir \"$tmp\")\n} || as_fn_error $? \"cannot create a temporary directory in .\" \"$LINENO\" 5\nac_tmp=$tmp\n\n# Set up the scripts for CONFIG_FILES section.\n# No need to generate them if there are no CONFIG_FILES.\n# This happens for instance with `./config.status config.h'.\nif test -n \"$CONFIG_FILES\"; then\n\n\nac_cr=`echo X | tr X '\\015'`\n# On cygwin, bash can eat \\r inside `` if the user requested igncr.\n# But we know of no other shell where ac_cr would be empty at this\n# point, so we can use a bashism as a fallback.\nif test \"x$ac_cr\" = x; then\n  eval ac_cr=\\$\\'\\\\r\\'\nfi\nac_cs_awk_cr=`$AWK 'BEGIN { print \"a\\rb\" }' </dev/null 2>/dev/null`\nif test \"$ac_cs_awk_cr\" = \"a${ac_cr}b\"; then\n  ac_cs_awk_cr='\\\\r'\nelse\n  ac_cs_awk_cr=$ac_cr\nfi\n\necho 'BEGIN {' >\"$ac_tmp/subs1.awk\" &&\n_ACEOF\n\n\n{\n  echo \"cat >conf$$subs.awk <<_ACEOF\" &&\n  echo \"$ac_subst_vars\" | sed 's/.*/&!$&$ac_delim/' &&\n  echo \"_ACEOF\"\n} >conf$$subs.sh ||\n  as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\nac_delim_num=`echo \"$ac_subst_vars\" | grep -c '^'`\nac_delim='%!_!# '\nfor ac_last_try in false false false false false :; do\n  . ./conf$$subs.sh ||\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n\n  ac_delim_n=`sed -n \"s/.*$ac_delim\\$/X/p\" conf$$subs.awk | grep -c X`\n  if test $ac_delim_n = $ac_delim_num; then\n    break\n  elif $ac_last_try; then\n    as_fn_error $? \"could not make $CONFIG_STATUS\" \"$LINENO\" 5\n  else\n    ac_delim=\"$ac_delim!$ac_delim _$ac_delim!! \"\n  fi\ndone\nrm -f conf$$subs.sh\n\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\ncat >>\"\\$ac_tmp/subs1.awk\" <<\\\\_ACAWK &&\n_ACEOF\nsed -n '\nh\ns/^/S[\"/; s/!.*/\"]=/\np\ng\ns/^[^!]*!//\n:repl\nt repl\ns/'\"$ac_delim\"'$//\nt delim\n:nl\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\\\\n\"\\\\/\np\nn\nb repl\n:more1\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt nl\n:delim\nh\ns/\\(.\\{148\\}\\)..*/\\1/\nt more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"/\np\nb\n:more2\ns/[\"\\\\]/\\\\&/g; s/^/\"/; s/$/\"\\\\/\np\ng\ns/.\\{148\\}//\nt delim\n' <conf$$subs.awk | sed '\n/^[^\"\"]/{\n  N\n  s/\\n//\n}\n' >>$CONFIG_STATUS || ac_write_fail=1\nrm -f conf$$subs.awk\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n_ACAWK\ncat >>\"\\$ac_tmp/subs1.awk\" <<_ACAWK &&\n  for (key in S) S_is_set[key] = 1\n  FS = \"\u0007\"\n\n}\n{\n  line = $ 0\n  nfields = split(line, field, \"@\")\n  substed = 0\n  len = length(field[1])\n  for (i = 2; i < nfields; i++) {\n    key = field[i]\n    keylen = length(key)\n    if (S_is_set[key]) {\n      value = S[key]\n      line = substr(line, 1, len) \"\" value \"\" substr(line, len + keylen + 3)\n      len += length(value) + length(field[++i])\n      substed = 1\n    } else\n      len += 1 + keylen\n  }\n\n  print line\n}\n\n_ACAWK\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nif sed \"s/$ac_cr//\" < /dev/null > /dev/null 2>&1; then\n  sed \"s/$ac_cr\\$//; s/$ac_cr/$ac_cs_awk_cr/g\"\nelse\n  cat\nfi < \"$ac_tmp/subs1.awk\" > \"$ac_tmp/subs.awk\" \\\n  || as_fn_error $? \"could not setup config files machinery\" \"$LINENO\" 5\n_ACEOF\n\n# VPATH may cause trouble with some makes, so we remove sole $(srcdir),\n# ${srcdir} and @srcdir@ entries from VPATH if srcdir is \".\", strip leading and\n# trailing colons and then remove the whole line if VPATH becomes empty\n# (actually we leave an empty line to preserve line numbers).\nif test \"x$srcdir\" = x.; then\n  ac_vpsub='/^[\t ]*VPATH[\t ]*=[\t ]*/{\nh\ns///\ns/^/:/\ns/[\t ]*$/:/\ns/:\\$(srcdir):/:/g\ns/:\\${srcdir}:/:/g\ns/:@srcdir@:/:/g\ns/^:*//\ns/:*$//\nx\ns/\\(=[\t ]*\\).*/\\1/\nG\ns/\\n//\ns/^[^=]*=[\t ]*$//\n}'\nfi\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\nfi # test -n \"$CONFIG_FILES\"\n\n\neval set X \"  :F $CONFIG_FILES      :C $CONFIG_COMMANDS\"\nshift\nfor ac_tag\ndo\n  case $ac_tag in\n  :[FHLC]) ac_mode=$ac_tag; continue;;\n  esac\n  case $ac_mode$ac_tag in\n  :[FHL]*:*);;\n  :L* | :C*:*) as_fn_error $? \"invalid tag \\`$ac_tag'\" \"$LINENO\" 5;;\n  :[FH]-) ac_tag=-:-;;\n  :[FH]*) ac_tag=$ac_tag:$ac_tag.in;;\n  esac\n  ac_save_IFS=$IFS\n  IFS=:\n  set x $ac_tag\n  IFS=$ac_save_IFS\n  shift\n  ac_file=$1\n  shift\n\n  case $ac_mode in\n  :L) ac_source=$1;;\n  :[FH])\n    ac_file_inputs=\n    for ac_f\n    do\n      case $ac_f in\n      -) ac_f=\"$ac_tmp/stdin\";;\n      *) # Look for the file first in the build tree, then in the source tree\n\t # (if the path is not absolute).  The absolute path cannot be DOS-style,\n\t # because $ac_f cannot contain `:'.\n\t test -f \"$ac_f\" ||\n\t   case $ac_f in\n\t   [\\\\/$]*) false;;\n\t   *) test -f \"$srcdir/$ac_f\" && ac_f=\"$srcdir/$ac_f\";;\n\t   esac ||\n\t   as_fn_error 1 \"cannot find input file: \\`$ac_f'\" \"$LINENO\" 5;;\n      esac\n      case $ac_f in *\\'*) ac_f=`$as_echo \"$ac_f\" | sed \"s/'/'\\\\\\\\\\\\\\\\''/g\"`;; esac\n      as_fn_append ac_file_inputs \" '$ac_f'\"\n    done\n\n    # Let's still pretend it is `configure' which instantiates (i.e., don't\n    # use $as_me), people would be surprised to read:\n    #    /* config.h.  Generated by config.status.  */\n    configure_input='Generated from '`\n\t  $as_echo \"$*\" | sed 's|^[^:]*/||;s|:[^:]*/|, |g'\n\t`' by configure.'\n    if test x\"$ac_file\" != x-; then\n      configure_input=\"$ac_file.  $configure_input\"\n      { $as_echo \"$as_me:${as_lineno-$LINENO}: creating $ac_file\" >&5\n$as_echo \"$as_me: creating $ac_file\" >&6;}\n    fi\n    # Neutralize special characters interpreted by sed in replacement strings.\n    case $configure_input in #(\n    *\\&* | *\\|* | *\\\\* )\n       ac_sed_conf_input=`$as_echo \"$configure_input\" |\n       sed 's/[\\\\\\\\&|]/\\\\\\\\&/g'`;; #(\n    *) ac_sed_conf_input=$configure_input;;\n    esac\n\n    case $ac_tag in\n    *:-:* | *:-) cat >\"$ac_tmp/stdin\" \\\n      || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5 ;;\n    esac\n    ;;\n  esac\n\n  ac_dir=`$as_dirname -- \"$ac_file\" ||\n$as_expr X\"$ac_file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$ac_file\" : 'X\\(//\\)$' \\| \\\n\t X\"$ac_file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$ac_file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n  as_dir=\"$ac_dir\"; as_fn_mkdir_p\n  ac_builddir=.\n\ncase \"$ac_dir\" in\n.) ac_dir_suffix= ac_top_builddir_sub=. ac_top_build_prefix= ;;\n*)\n  ac_dir_suffix=/`$as_echo \"$ac_dir\" | sed 's|^\\.[\\\\/]||'`\n  # A \"..\" for each directory in $ac_dir_suffix.\n  ac_top_builddir_sub=`$as_echo \"$ac_dir_suffix\" | sed 's|/[^\\\\/]*|/..|g;s|/||'`\n  case $ac_top_builddir_sub in\n  \"\") ac_top_builddir_sub=. ac_top_build_prefix= ;;\n  *)  ac_top_build_prefix=$ac_top_builddir_sub/ ;;\n  esac ;;\nesac\nac_abs_top_builddir=$ac_pwd\nac_abs_builddir=$ac_pwd$ac_dir_suffix\n# for backward compatibility:\nac_top_builddir=$ac_top_build_prefix\n\ncase $srcdir in\n  .)  # We are building in place.\n    ac_srcdir=.\n    ac_top_srcdir=$ac_top_builddir_sub\n    ac_abs_top_srcdir=$ac_pwd ;;\n  [\\\\/]* | ?:[\\\\/]* )  # Absolute name.\n    ac_srcdir=$srcdir$ac_dir_suffix;\n    ac_top_srcdir=$srcdir\n    ac_abs_top_srcdir=$srcdir ;;\n  *) # Relative name.\n    ac_srcdir=$ac_top_build_prefix$srcdir$ac_dir_suffix\n    ac_top_srcdir=$ac_top_build_prefix$srcdir\n    ac_abs_top_srcdir=$ac_pwd/$srcdir ;;\nesac\nac_abs_srcdir=$ac_abs_top_srcdir$ac_dir_suffix\n\n\n  case $ac_mode in\n  :F)\n  #\n  # CONFIG_FILE\n  #\n\n  case $INSTALL in\n  [\\\\/$]* | ?:[\\\\/]* ) ac_INSTALL=$INSTALL ;;\n  *) ac_INSTALL=$ac_top_build_prefix$INSTALL ;;\n  esac\n  ac_MKDIR_P=$MKDIR_P\n  case $MKDIR_P in\n  [\\\\/$]* | ?:[\\\\/]* ) ;;\n  */*) ac_MKDIR_P=$ac_top_build_prefix$MKDIR_P ;;\n  esac\n_ACEOF\n\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n# If the template does not know about datarootdir, expand it.\n# FIXME: This hack should be removed a few years after 2.60.\nac_datarootdir_hack=; ac_datarootdir_seen=\nac_sed_dataroot='\n/datarootdir/ {\n  p\n  q\n}\n/@datadir@/p\n/@docdir@/p\n/@infodir@/p\n/@localedir@/p\n/@mandir@/p'\ncase `eval \"sed -n \\\"\\$ac_sed_dataroot\\\" $ac_file_inputs\"` in\n*datarootdir*) ac_datarootdir_seen=yes;;\n*@datadir@*|*@docdir@*|*@infodir@*|*@localedir@*|*@mandir@*)\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&5\n$as_echo \"$as_me: WARNING: $ac_file_inputs seems to ignore the --datarootdir setting\" >&2;}\n_ACEOF\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\n  ac_datarootdir_hack='\n  s&@datadir@&$datadir&g\n  s&@docdir@&$docdir&g\n  s&@infodir@&$infodir&g\n  s&@localedir@&$localedir&g\n  s&@mandir@&$mandir&g\n  s&\\\\\\${datarootdir}&$datarootdir&g' ;;\nesac\n_ACEOF\n\n# Neutralize VPATH when `$srcdir' = `.'.\n# Shell code in configure.ac might set extrasub.\n# FIXME: do we really want to maintain this feature?\ncat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1\nac_sed_extra=\"$ac_vpsub\n$extrasub\n_ACEOF\ncat >>$CONFIG_STATUS <<\\_ACEOF || ac_write_fail=1\n:t\n/@[a-zA-Z_][a-zA-Z_0-9]*@/!b\ns|@configure_input@|$ac_sed_conf_input|;t t\ns&@top_builddir@&$ac_top_builddir_sub&;t t\ns&@top_build_prefix@&$ac_top_build_prefix&;t t\ns&@srcdir@&$ac_srcdir&;t t\ns&@abs_srcdir@&$ac_abs_srcdir&;t t\ns&@top_srcdir@&$ac_top_srcdir&;t t\ns&@abs_top_srcdir@&$ac_abs_top_srcdir&;t t\ns&@builddir@&$ac_builddir&;t t\ns&@abs_builddir@&$ac_abs_builddir&;t t\ns&@abs_top_builddir@&$ac_abs_top_builddir&;t t\ns&@INSTALL@&$ac_INSTALL&;t t\ns&@MKDIR_P@&$ac_MKDIR_P&;t t\n$ac_datarootdir_hack\n\"\neval sed \\\"\\$ac_sed_extra\\\" \"$ac_file_inputs\" | $AWK -f \"$ac_tmp/subs.awk\" \\\n  >$ac_tmp/out || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n\ntest -z \"$ac_datarootdir_hack$ac_datarootdir_seen\" &&\n  { ac_out=`sed -n '/\\${datarootdir}/p' \"$ac_tmp/out\"`; test -n \"$ac_out\"; } &&\n  { ac_out=`sed -n '/^[\t ]*datarootdir[\t ]*:*=/p' \\\n      \"$ac_tmp/out\"`; test -z \"$ac_out\"; } &&\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&5\n$as_echo \"$as_me: WARNING: $ac_file contains a reference to the variable \\`datarootdir'\nwhich seems to be undefined.  Please make sure it is defined\" >&2;}\n\n  rm -f \"$ac_tmp/stdin\"\n  case $ac_file in\n  -) cat \"$ac_tmp/out\" && rm -f \"$ac_tmp/out\";;\n  *) rm -f \"$ac_file\" && mv \"$ac_tmp/out\" \"$ac_file\";;\n  esac \\\n  || as_fn_error $? \"could not create $ac_file\" \"$LINENO\" 5\n ;;\n\n\n  :C)  { $as_echo \"$as_me:${as_lineno-$LINENO}: executing $ac_file commands\" >&5\n$as_echo \"$as_me: executing $ac_file commands\" >&6;}\n ;;\n  esac\n\n\n  case $ac_file$ac_mode in\n    \"depfiles\":C) test x\"$AMDEP_TRUE\" != x\"\" || {\n  # Older Autoconf quotes --file arguments for eval, but not when files\n  # are listed without --file.  Let's play safe and only enable the eval\n  # if we detect the quoting.\n  case $CONFIG_FILES in\n  *\\'*) eval set x \"$CONFIG_FILES\" ;;\n  *)   set x $CONFIG_FILES ;;\n  esac\n  shift\n  for mf\n  do\n    # Strip MF so we end up with the name of the file.\n    mf=`echo \"$mf\" | sed -e 's/:.*$//'`\n    # Check whether this is an Automake generated Makefile or not.\n    # We used to match only the files named 'Makefile.in', but\n    # some people rename them; so instead we look at the file content.\n    # Grep'ing the first line is not enough: some people post-process\n    # each Makefile.in and add a new line on top of each file to say so.\n    # Grep'ing the whole file is not good either: AIX grep has a line\n    # limit of 2048, but all sed's we know have understand at least 4000.\n    if sed -n 's,^#.*generated by automake.*,X,p' \"$mf\" | grep X >/dev/null 2>&1; then\n      dirpart=`$as_dirname -- \"$mf\" ||\n$as_expr X\"$mf\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$mf\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$mf\" : 'X\\(//\\)$' \\| \\\n\t X\"$mf\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$mf\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n    else\n      continue\n    fi\n    # Extract the definition of DEPDIR, am__include, and am__quote\n    # from the Makefile without running 'make'.\n    DEPDIR=`sed -n 's/^DEPDIR = //p' < \"$mf\"`\n    test -z \"$DEPDIR\" && continue\n    am__include=`sed -n 's/^am__include = //p' < \"$mf\"`\n    test -z \"$am__include\" && continue\n    am__quote=`sed -n 's/^am__quote = //p' < \"$mf\"`\n    # Find all dependency output files, they are included files with\n    # $(DEPDIR) in their names.  We invoke sed twice because it is the\n    # simplest approach to changing $(DEPDIR) to its actual value in the\n    # expansion.\n    for file in `sed -n \"\n      s/^$am__include $am__quote\\(.*(DEPDIR).*\\)$am__quote\"'$/\\1/p' <\"$mf\" | \\\n\t sed -e 's/\\$(DEPDIR)/'\"$DEPDIR\"'/g'`; do\n      # Make sure the directory exists.\n      test -f \"$dirpart/$file\" && continue\n      fdir=`$as_dirname -- \"$file\" ||\n$as_expr X\"$file\" : 'X\\(.*[^/]\\)//*[^/][^/]*/*$' \\| \\\n\t X\"$file\" : 'X\\(//\\)[^/]' \\| \\\n\t X\"$file\" : 'X\\(//\\)$' \\| \\\n\t X\"$file\" : 'X\\(/\\)' \\| . 2>/dev/null ||\n$as_echo X\"$file\" |\n    sed '/^X\\(.*[^/]\\)\\/\\/*[^/][^/]*\\/*$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)[^/].*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\/\\)$/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  /^X\\(\\/\\).*/{\n\t    s//\\1/\n\t    q\n\t  }\n\t  s/.*/./; q'`\n      as_dir=$dirpart/$fdir; as_fn_mkdir_p\n      # echo \"creating $dirpart/$file\"\n      echo '# dummy' > \"$dirpart/$file\"\n    done\n  done\n}\n ;;\n    \"libtool\":C)\n\n    # See if we are running on zsh, and set the options which allow our\n    # commands through without removal of \\ escapes.\n    if test -n \"${ZSH_VERSION+set}\" ; then\n      setopt NO_GLOB_SUBST\n    fi\n\n    cfgfile=\"${ofile}T\"\n    trap \"$RM \\\"$cfgfile\\\"; exit 1\" 1 2 15\n    $RM \"$cfgfile\"\n\n    cat <<_LT_EOF >> \"$cfgfile\"\n#! $SHELL\n\n# `$ECHO \"$ofile\" | sed 's%^.*/%%'` - Provide generalized library-building support services.\n# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION\n# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:\n# NOTE: Changes made to this file will be lost: look at ltmain.sh.\n#\n#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,\n#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software\n#                 Foundation, Inc.\n#   Written by Gordon Matzigkeit, 1996\n#\n#   This file is part of GNU Libtool.\n#\n# GNU Libtool is free software; you can redistribute it and/or\n# modify it under the terms of the GNU General Public License as\n# published by the Free Software Foundation; either version 2 of\n# the License, or (at your option) any later version.\n#\n# As a special exception to the GNU General Public License,\n# if you distribute this file as part of a program or library that\n# is built using GNU Libtool, you may include this file under the\n# same distribution terms that you use for the rest of that program.\n#\n# GNU Libtool is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with GNU Libtool; see the file COPYING.  If not, a copy\n# can be downloaded from http://www.gnu.org/licenses/gpl.html, or\n# obtained by writing to the Free Software Foundation, Inc.,\n# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n\n\n# The names of the tagged configurations supported by this script.\navailable_tags=\"\"\n\n# ### BEGIN LIBTOOL CONFIG\n\n# Which release of libtool.m4 was used?\nmacro_version=$macro_version\nmacro_revision=$macro_revision\n\n# Whether or not to build shared libraries.\nbuild_libtool_libs=$enable_shared\n\n# Whether or not to build static libraries.\nbuild_old_libs=$enable_static\n\n# What type of objects to build.\npic_mode=$pic_mode\n\n# Whether or not to optimize for fast installation.\nfast_install=$enable_fast_install\n\n# Shell to use when invoking shell scripts.\nSHELL=$lt_SHELL\n\n# An echo program that protects backslashes.\nECHO=$lt_ECHO\n\n# The PATH separator for the build system.\nPATH_SEPARATOR=$lt_PATH_SEPARATOR\n\n# The host system.\nhost_alias=$host_alias\nhost=$host\nhost_os=$host_os\n\n# The build system.\nbuild_alias=$build_alias\nbuild=$build\nbuild_os=$build_os\n\n# A sed program that does not truncate output.\nSED=$lt_SED\n\n# Sed that helps us avoid accidentally triggering echo(1) options like -n.\nXsed=\"\\$SED -e 1s/^X//\"\n\n# A grep program that handles long lines.\nGREP=$lt_GREP\n\n# An ERE matcher.\nEGREP=$lt_EGREP\n\n# A literal string matcher.\nFGREP=$lt_FGREP\n\n# A BSD- or MS-compatible name lister.\nNM=$lt_NM\n\n# Whether we need soft or hard links.\nLN_S=$lt_LN_S\n\n# What is the maximum length of a command?\nmax_cmd_len=$max_cmd_len\n\n# Object file suffix (normally \"o\").\nobjext=$ac_objext\n\n# Executable file suffix (normally \"\").\nexeext=$exeext\n\n# whether the shell understands \"unset\".\nlt_unset=$lt_unset\n\n# turn spaces into newlines.\nSP2NL=$lt_lt_SP2NL\n\n# turn newlines into spaces.\nNL2SP=$lt_lt_NL2SP\n\n# convert \\$build file names to \\$host format.\nto_host_file_cmd=$lt_cv_to_host_file_cmd\n\n# convert \\$build files to toolchain format.\nto_tool_file_cmd=$lt_cv_to_tool_file_cmd\n\n# An object symbol dumper.\nOBJDUMP=$lt_OBJDUMP\n\n# Method to check whether dependent libraries are shared objects.\ndeplibs_check_method=$lt_deplibs_check_method\n\n# Command to use when deplibs_check_method = \"file_magic\".\nfile_magic_cmd=$lt_file_magic_cmd\n\n# How to find potential files when deplibs_check_method = \"file_magic\".\nfile_magic_glob=$lt_file_magic_glob\n\n# Find potential files using nocaseglob when deplibs_check_method = \"file_magic\".\nwant_nocaseglob=$lt_want_nocaseglob\n\n# DLL creation program.\nDLLTOOL=$lt_DLLTOOL\n\n# Command to associate shared and link libraries.\nsharedlib_from_linklib_cmd=$lt_sharedlib_from_linklib_cmd\n\n# The archiver.\nAR=$lt_AR\n\n# Flags to create an archive.\nAR_FLAGS=$lt_AR_FLAGS\n\n# How to feed a file listing to the archiver.\narchiver_list_spec=$lt_archiver_list_spec\n\n# A symbol stripping program.\nSTRIP=$lt_STRIP\n\n# Commands used to install an old-style archive.\nRANLIB=$lt_RANLIB\nold_postinstall_cmds=$lt_old_postinstall_cmds\nold_postuninstall_cmds=$lt_old_postuninstall_cmds\n\n# Whether to use a lock for old archive extraction.\nlock_old_archive_extraction=$lock_old_archive_extraction\n\n# A C compiler.\nLTCC=$lt_CC\n\n# LTCC compiler flags.\nLTCFLAGS=$lt_CFLAGS\n\n# Take the output of nm and produce a listing of raw symbols and C names.\nglobal_symbol_pipe=$lt_lt_cv_sys_global_symbol_pipe\n\n# Transform the output of nm in a proper C declaration.\nglobal_symbol_to_cdecl=$lt_lt_cv_sys_global_symbol_to_cdecl\n\n# Transform the output of nm in a C name address pair.\nglobal_symbol_to_c_name_address=$lt_lt_cv_sys_global_symbol_to_c_name_address\n\n# Transform the output of nm in a C name address pair when lib prefix is needed.\nglobal_symbol_to_c_name_address_lib_prefix=$lt_lt_cv_sys_global_symbol_to_c_name_address_lib_prefix\n\n# Specify filename containing input files for \\$NM.\nnm_file_list_spec=$lt_nm_file_list_spec\n\n# The root where to search for dependent libraries,and in which our libraries should be installed.\nlt_sysroot=$lt_sysroot\n\n# The name of the directory that contains temporary libtool files.\nobjdir=$objdir\n\n# Used to examine libraries when file_magic_cmd begins with \"file\".\nMAGIC_CMD=$MAGIC_CMD\n\n# Must we lock files when doing compilation?\nneed_locks=$lt_need_locks\n\n# Manifest tool.\nMANIFEST_TOOL=$lt_MANIFEST_TOOL\n\n# Tool to manipulate archived DWARF debug symbol files on Mac OS X.\nDSYMUTIL=$lt_DSYMUTIL\n\n# Tool to change global to local symbols on Mac OS X.\nNMEDIT=$lt_NMEDIT\n\n# Tool to manipulate fat objects and archives on Mac OS X.\nLIPO=$lt_LIPO\n\n# ldd/readelf like tool for Mach-O binaries on Mac OS X.\nOTOOL=$lt_OTOOL\n\n# ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4.\nOTOOL64=$lt_OTOOL64\n\n# Old archive suffix (normally \"a\").\nlibext=$libext\n\n# Shared library suffix (normally \".so\").\nshrext_cmds=$lt_shrext_cmds\n\n# The commands to extract the exported symbol list from a shared archive.\nextract_expsyms_cmds=$lt_extract_expsyms_cmds\n\n# Variables whose values should be saved in libtool wrapper scripts and\n# restored at link time.\nvariables_saved_for_relink=$lt_variables_saved_for_relink\n\n# Do we need the \"lib\" prefix for modules?\nneed_lib_prefix=$need_lib_prefix\n\n# Do we need a version for libraries?\nneed_version=$need_version\n\n# Library versioning type.\nversion_type=$version_type\n\n# Shared library runtime path variable.\nrunpath_var=$runpath_var\n\n# Shared library path variable.\nshlibpath_var=$shlibpath_var\n\n# Is shlibpath searched before the hard-coded library search path?\nshlibpath_overrides_runpath=$shlibpath_overrides_runpath\n\n# Format of library name prefix.\nlibname_spec=$lt_libname_spec\n\n# List of archive names.  First name is the real one, the rest are links.\n# The last name is the one that the linker finds with -lNAME\nlibrary_names_spec=$lt_library_names_spec\n\n# The coded name of the library, if different from the real name.\nsoname_spec=$lt_soname_spec\n\n# Permission mode override for installation of shared libraries.\ninstall_override_mode=$lt_install_override_mode\n\n# Command to use after installation of a shared archive.\npostinstall_cmds=$lt_postinstall_cmds\n\n# Command to use after uninstallation of a shared archive.\npostuninstall_cmds=$lt_postuninstall_cmds\n\n# Commands used to finish a libtool library installation in a directory.\nfinish_cmds=$lt_finish_cmds\n\n# As \"finish_cmds\", except a single script fragment to be evaled but\n# not shown.\nfinish_eval=$lt_finish_eval\n\n# Whether we should hardcode library paths into libraries.\nhardcode_into_libs=$hardcode_into_libs\n\n# Compile-time system search path for libraries.\nsys_lib_search_path_spec=$lt_sys_lib_search_path_spec\n\n# Run-time system search path for libraries.\nsys_lib_dlsearch_path_spec=$lt_sys_lib_dlsearch_path_spec\n\n# Whether dlopen is supported.\ndlopen_support=$enable_dlopen\n\n# Whether dlopen of programs is supported.\ndlopen_self=$enable_dlopen_self\n\n# Whether dlopen of statically linked programs is supported.\ndlopen_self_static=$enable_dlopen_self_static\n\n# Commands to strip libraries.\nold_striplib=$lt_old_striplib\nstriplib=$lt_striplib\n\n# Assembler program.\nAS=$lt_AS\n\n\n# The linker used to build libraries.\nLD=$lt_LD\n\n# How to create reloadable object files.\nreload_flag=$lt_reload_flag\nreload_cmds=$lt_reload_cmds\n\n# Commands used to build an old-style archive.\nold_archive_cmds=$lt_old_archive_cmds\n\n# A language specific compiler.\nCC=$lt_compiler\n\n# Is the compiler the GNU compiler?\nwith_gcc=$GCC\n\n# Compiler flag to turn off builtin functions.\nno_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag\n\n# Additional compiler flags for building library objects.\npic_flag=$lt_lt_prog_compiler_pic\n\n# How to pass a linker flag through the compiler.\nwl=$lt_lt_prog_compiler_wl\n\n# Compiler flag to prevent dynamic linking.\nlink_static_flag=$lt_lt_prog_compiler_static\n\n# Does compiler simultaneously support -c and -o options?\ncompiler_c_o=$lt_lt_cv_prog_compiler_c_o\n\n# Whether or not to add -lc for building shared libraries.\nbuild_libtool_need_lc=$archive_cmds_need_lc\n\n# Whether or not to disallow shared libs when runtime libs are static.\nallow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes\n\n# Compiler flag to allow reflexive dlopens.\nexport_dynamic_flag_spec=$lt_export_dynamic_flag_spec\n\n# Compiler flag to generate shared objects directly from archives.\nwhole_archive_flag_spec=$lt_whole_archive_flag_spec\n\n# Whether the compiler copes with passing no objects directly.\ncompiler_needs_object=$lt_compiler_needs_object\n\n# Create an old-style archive from a shared archive.\nold_archive_from_new_cmds=$lt_old_archive_from_new_cmds\n\n# Create a temporary old-style archive to link instead of a shared archive.\nold_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds\n\n# Commands used to build a shared archive.\narchive_cmds=$lt_archive_cmds\narchive_expsym_cmds=$lt_archive_expsym_cmds\n\n# Commands used to build a loadable module if different from building\n# a shared archive.\nmodule_cmds=$lt_module_cmds\nmodule_expsym_cmds=$lt_module_expsym_cmds\n\n# Whether we are building with GNU ld or not.\nwith_gnu_ld=$lt_with_gnu_ld\n\n# Flag that allows shared libraries with undefined symbols to be built.\nallow_undefined_flag=$lt_allow_undefined_flag\n\n# Flag that enforces no undefined symbols.\nno_undefined_flag=$lt_no_undefined_flag\n\n# Flag to hardcode \\$libdir into a binary during linking.\n# This must work even if \\$libdir does not exist\nhardcode_libdir_flag_spec=$lt_hardcode_libdir_flag_spec\n\n# Whether we need a single \"-rpath\" flag with a separated argument.\nhardcode_libdir_separator=$lt_hardcode_libdir_separator\n\n# Set to \"yes\" if using DIR/libNAME\\${shared_ext} during linking hardcodes\n# DIR into the resulting binary.\nhardcode_direct=$hardcode_direct\n\n# Set to \"yes\" if using DIR/libNAME\\${shared_ext} during linking hardcodes\n# DIR into the resulting binary and the resulting library dependency is\n# \"absolute\",i.e impossible to change by setting \\${shlibpath_var} if the\n# library is relocated.\nhardcode_direct_absolute=$hardcode_direct_absolute\n\n# Set to \"yes\" if using the -LDIR flag during linking hardcodes DIR\n# into the resulting binary.\nhardcode_minus_L=$hardcode_minus_L\n\n# Set to \"yes\" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR\n# into the resulting binary.\nhardcode_shlibpath_var=$hardcode_shlibpath_var\n\n# Set to \"yes\" if building a shared library automatically hardcodes DIR\n# into the library and all subsequent libraries and executables linked\n# against it.\nhardcode_automatic=$hardcode_automatic\n\n# Set to yes if linker adds runtime paths of dependent libraries\n# to runtime path list.\ninherit_rpath=$inherit_rpath\n\n# Whether libtool must link a program against all its dependency libraries.\nlink_all_deplibs=$link_all_deplibs\n\n# Set to \"yes\" if exported symbols are required.\nalways_export_symbols=$always_export_symbols\n\n# The commands to list exported symbols.\nexport_symbols_cmds=$lt_export_symbols_cmds\n\n# Symbols that should not be listed in the preloaded symbols.\nexclude_expsyms=$lt_exclude_expsyms\n\n# Symbols that must always be exported.\ninclude_expsyms=$lt_include_expsyms\n\n# Commands necessary for linking programs (against libraries) with templates.\nprelink_cmds=$lt_prelink_cmds\n\n# Commands necessary for finishing linking programs.\npostlink_cmds=$lt_postlink_cmds\n\n# Specify filename containing input files.\nfile_list_spec=$lt_file_list_spec\n\n# How to hardcode a shared library path into an executable.\nhardcode_action=$hardcode_action\n\n# ### END LIBTOOL CONFIG\n\n_LT_EOF\n\n  case $host_os in\n  aix3*)\n    cat <<\\_LT_EOF >> \"$cfgfile\"\n# AIX sometimes has problems with the GCC collect2 program.  For some\n# reason, if we set the COLLECT_NAMES environment variable, the problems\n# vanish in a puff of smoke.\nif test \"X${COLLECT_NAMES+set}\" != Xset; then\n  COLLECT_NAMES=\n  export COLLECT_NAMES\nfi\n_LT_EOF\n    ;;\n  esac\n\n\nltmain=\"$ac_aux_dir/ltmain.sh\"\n\n\n  # We use sed instead of cat because bash on DJGPP gets confused if\n  # if finds mixed CR/LF and LF-only lines.  Since sed operates in\n  # text mode, it properly converts lines to CR/LF.  This bash problem\n  # is reportedly fixed, but why not run on old versions too?\n  sed '$q' \"$ltmain\" >> \"$cfgfile\" \\\n     || (rm -f \"$cfgfile\"; exit 1)\n\n  if test x\"$xsi_shell\" = xyes; then\n  sed -e '/^func_dirname ()$/,/^} # func_dirname /c\\\nfunc_dirname ()\\\n{\\\n\\    case ${1} in\\\n\\      */*) func_dirname_result=\"${1%/*}${2}\" ;;\\\n\\      *  ) func_dirname_result=\"${3}\" ;;\\\n\\    esac\\\n} # Extended-shell func_dirname implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_basename ()$/,/^} # func_basename /c\\\nfunc_basename ()\\\n{\\\n\\    func_basename_result=\"${1##*/}\"\\\n} # Extended-shell func_basename implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_dirname_and_basename ()$/,/^} # func_dirname_and_basename /c\\\nfunc_dirname_and_basename ()\\\n{\\\n\\    case ${1} in\\\n\\      */*) func_dirname_result=\"${1%/*}${2}\" ;;\\\n\\      *  ) func_dirname_result=\"${3}\" ;;\\\n\\    esac\\\n\\    func_basename_result=\"${1##*/}\"\\\n} # Extended-shell func_dirname_and_basename implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_stripname ()$/,/^} # func_stripname /c\\\nfunc_stripname ()\\\n{\\\n\\    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\\\n\\    # positional parameters, so assign one to ordinary parameter first.\\\n\\    func_stripname_result=${3}\\\n\\    func_stripname_result=${func_stripname_result#\"${1}\"}\\\n\\    func_stripname_result=${func_stripname_result%\"${2}\"}\\\n} # Extended-shell func_stripname implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_split_long_opt ()$/,/^} # func_split_long_opt /c\\\nfunc_split_long_opt ()\\\n{\\\n\\    func_split_long_opt_name=${1%%=*}\\\n\\    func_split_long_opt_arg=${1#*=}\\\n} # Extended-shell func_split_long_opt implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_split_short_opt ()$/,/^} # func_split_short_opt /c\\\nfunc_split_short_opt ()\\\n{\\\n\\    func_split_short_opt_arg=${1#??}\\\n\\    func_split_short_opt_name=${1%\"$func_split_short_opt_arg\"}\\\n} # Extended-shell func_split_short_opt implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_lo2o ()$/,/^} # func_lo2o /c\\\nfunc_lo2o ()\\\n{\\\n\\    case ${1} in\\\n\\      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\\\n\\      *)    func_lo2o_result=${1} ;;\\\n\\    esac\\\n} # Extended-shell func_lo2o implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_xform ()$/,/^} # func_xform /c\\\nfunc_xform ()\\\n{\\\n    func_xform_result=${1%.*}.lo\\\n} # Extended-shell func_xform implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_arith ()$/,/^} # func_arith /c\\\nfunc_arith ()\\\n{\\\n    func_arith_result=$(( $* ))\\\n} # Extended-shell func_arith implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_len ()$/,/^} # func_len /c\\\nfunc_len ()\\\n{\\\n    func_len_result=${#1}\\\n} # Extended-shell func_len implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\nfi\n\nif test x\"$lt_shell_append\" = xyes; then\n  sed -e '/^func_append ()$/,/^} # func_append /c\\\nfunc_append ()\\\n{\\\n    eval \"${1}+=\\\\${2}\"\\\n} # Extended-shell func_append implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  sed -e '/^func_append_quoted ()$/,/^} # func_append_quoted /c\\\nfunc_append_quoted ()\\\n{\\\n\\    func_quote_for_eval \"${2}\"\\\n\\    eval \"${1}+=\\\\\\\\ \\\\$func_quote_for_eval_result\"\\\n} # Extended-shell func_append_quoted implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n\n\n  # Save a `func_append' function call where possible by direct use of '+='\n  sed -e 's%func_append \\([a-zA-Z_]\\{1,\\}\\) \"%\\1+=\"%g' $cfgfile > $cfgfile.tmp \\\n    && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n      || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\n  test 0 -eq $? || _lt_function_replace_fail=:\nelse\n  # Save a `func_append' function call even when '+=' is not available\n  sed -e 's%func_append \\([a-zA-Z_]\\{1,\\}\\) \"%\\1=\"$\\1%g' $cfgfile > $cfgfile.tmp \\\n    && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n      || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\n  test 0 -eq $? || _lt_function_replace_fail=:\nfi\n\nif test x\"$_lt_function_replace_fail\" = x\":\"; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: Unable to substitute extended shell functions in $ofile\" >&5\n$as_echo \"$as_me: WARNING: Unable to substitute extended shell functions in $ofile\" >&2;}\nfi\n\n\n   mv -f \"$cfgfile\" \"$ofile\" ||\n    (rm -f \"$ofile\" && cp \"$cfgfile\" \"$ofile\" && rm -f \"$cfgfile\")\n  chmod +x \"$ofile\"\n\n ;;\n\n  esac\ndone # for ac_tag\n\n\nas_fn_exit 0\n_ACEOF\nac_clean_files=$ac_clean_files_save\n\ntest $ac_write_fail = 0 ||\n  as_fn_error $? \"write failure creating $CONFIG_STATUS\" \"$LINENO\" 5\n\n\n# configure is writing to config.log, and then calls config.status.\n# config.status does its own redirection, appending to config.log.\n# Unfortunately, on DOS this fails, as config.log is still kept open\n# by configure, so config.status won't be able to write to it; its\n# output is simply discarded.  So we exec the FD to /dev/null,\n# effectively closing config.log, so it can be properly (re)opened and\n# appended to by config.status.  When coming back to configure, we\n# need to make the FD available again.\nif test \"$no_create\" != yes; then\n  ac_cs_success=:\n  ac_config_status_args=\n  test \"$silent\" = yes &&\n    ac_config_status_args=\"$ac_config_status_args --quiet\"\n  exec 5>/dev/null\n  $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false\n  exec 5>>config.log\n  # Use ||, not &&, to avoid exiting from the if with $? = 1, which\n  # would make configure fail if this is the last instruction.\n  $ac_cs_success || as_fn_exit 1\nfi\nif test -n \"$ac_unrecognized_opts\" && test \"$enable_option_checking\" != no; then\n  { $as_echo \"$as_me:${as_lineno-$LINENO}: WARNING: unrecognized options: $ac_unrecognized_opts\" >&5\n$as_echo \"$as_me: WARNING: unrecognized options: $ac_unrecognized_opts\" >&2;}\nfi\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/configure.ac",
    "content": "AC_PREREQ([2.65])\nAC_INIT([libsodium],[1.0.7],\n  [https://github.com/jedisct1/libsodium/issues],\n  [libsodium],\n  [https://github.com/jedisct1/libsodium])\nAC_CONFIG_AUX_DIR([build-aux])\nAC_CONFIG_MACRO_DIR([m4])\nAC_CONFIG_SRCDIR([src/libsodium/sodium/version.c])\nAC_CANONICAL_HOST\nAM_INIT_AUTOMAKE([1.11 dist-bzip2 tar-ustar foreign subdir-objects])\nm4_ifdef([AM_SILENT_RULES], [AM_SILENT_RULES([yes])])\nAM_MAINTAINER_MODE\nAM_DEP_TRACK\n\nAC_SUBST(VERSION)\nISODATE=`date +%Y-%m-%d`\nAC_SUBST(ISODATE)\n\nSODIUM_LIBRARY_VERSION_MAJOR=9\nSODIUM_LIBRARY_VERSION_MINOR=0\nDLL_VERSION=8\nSODIUM_LIBRARY_VERSION=18:0:0\n#                       | | |\n#                +------+ | +---+\n#                |        |     |\n#             current:revision:age\n#                |        |     |\n#                |        |     +- increment if interfaces have been added\n#                |        |        set to zero if interfaces have been removed\n#                |        |        or changed\n#                |        +- increment if source code has changed\n#                |           set to zero if current is incremented\n#                +- increment if interfaces have been added, removed or changed\nAC_SUBST(SODIUM_LIBRARY_VERSION_MAJOR)\nAC_SUBST(SODIUM_LIBRARY_VERSION_MINOR)\nAC_SUBST(SODIUM_LIBRARY_VERSION)\nAC_SUBST(DLL_VERSION)\n\nLX_CFLAGS=${CFLAGS-NONE}\n\ndnl Path check\n\nAS_IF([test pwd | fgrep ' ' > /dev/null 2>&1],\n  [AC_MSG_WARN([The build directory contains whitespaces - This can cause tests/installation to fail due to limitations of some libtool versions])]\n)\n\ndnl Switches\n\nAC_ARG_ENABLE(ssp,\n[AS_HELP_STRING(--disable-ssp,Do not compile with -fstack-protector)],\n[\n  AS_IF([test \"x$enableval\" = \"xno\"], [\n    enable_ssp=\"no\"\n  ], [\n    enable_ssp=\"yes\"\n  ])\n],\n[\n  enable_ssp=\"yes\"\n])\n\nAC_ARG_ENABLE(asm,\n[AS_HELP_STRING(--disable-asm,Disable assembly implementations)],\n[\n  AS_IF([test \"x$enableval\" = \"xno\"], [\n    enable_asm=\"no\"\n  ], [\n    enable_asm=\"yes\"\n  ])\n],\n[\n  enable_asm=\"yes\"\n])\n\nAS_IF([test \"x$EMSCRIPTEN\" != \"x\"],[\n  enable_asm=\"no\"\n  AC_MSG_WARN([compiling to javascript - asm implementations disabled])\n])\n\nAC_ARG_ENABLE(pie,\n[AS_HELP_STRING(--disable-pie,Do not produce position independent executables)],\n enable_pie=$enableval, enable_pie=\"maybe\")\n\nAS_CASE([$host_os], [mingw*|cygwin*|msys], [enable_pie=\"no\"])\n\nAC_ARG_ENABLE(blocking-random,\n[AS_HELP_STRING(--enable-blocking-random,Enable this switch only if /dev/urandom is totally broken on the target platform)],\n[\n  AS_IF([test \"x$enableval\" = \"xyes\"], [\n    AC_DEFINE([USE_BLOCKING_RANDOM], [1], [/dev/urandom is insecure on the target platform])\n  ])\n])\n\nAC_ARG_ENABLE(minimal,\n[AS_HELP_STRING(--enable-minimal,\n  [Only compile the minimum set of functions required for the high-level API])],\n[\n  AS_IF([test \"x$enableval\" = \"xyes\"], [\n    enable_minimal=\"yes\"\n  ], [\n    enable_minimal=\"no\"\n  ])\n],\n[\n  enable_minimal=\"no\"\n])\nAM_CONDITIONAL([MINIMAL], [test x$enable_minimal = xyes])\n\nAC_ARG_WITH(safecode,\n[AS_HELP_STRING(--with-safecode,For maintainers only - please do not use)],\n[AS_IF([test \"x$withval\" = \"xyes\"], [\n    AC_ARG_VAR([SAFECODE_HOME], [set to the safecode base directory])\n    : ${SAFECODE_HOME:=/opt/safecode}\n    LDFLAGS=\"$LDFLAGS -L${SAFECODE_HOME}/lib\"\n    LIBS=\"$LIBS -lsc_dbg_rt -lpoolalloc_bitmap -lstdc++\"\n    CFLAGS=\"$CFLAGS -fmemsafety\"\n  ])\n])\n\nAC_ARG_ENABLE(debug,\n[AS_HELP_STRING(--enable-debug,For maintainers only - please do not use)],\n[\n  AS_IF([test \"x$enableval\" = \"xyes\"], [\n    AS_IF([test \"x$LX_CFLAGS\" = \"xNONE\"], [\n      nxflags=\"\"\n      for flag in `echo $CFLAGS`; do\n        AS_CASE([$flag],\n          [-O*], [ ],\n          [-g*], [ ],\n          [*], [AS_VAR_APPEND([nxflags], [\" $flag\"])])\n      done\n      CFLAGS=\"$nxflags -O0 -g3\"\n    ])\n    CPPFLAGS=\"$CPPFLAGS -DDEBUG=1\"\n  ])\n])\n\nAC_ARG_ENABLE(opt,\n[AS_HELP_STRING(--enable-opt,Optimize for the native CPU - The resulting library will be faster but not portable)],\n[\n  AS_IF([test \"x$enableval\" = \"xyes\"], [\n    CFLAGS=\"$CFLAGS -flto -march=native\"\n    LDFLAGS=\"$LDFLAGS -flto -march=native\"])\n])\n\nAC_SUBST([MAINT])\n\ndnl Checks\n\nAC_PROG_CC_C99\nAM_PROG_AS\nAC_USE_SYSTEM_EXTENSIONS\n\nAC_CHECK_DEFINE([__native_client__], [NATIVECLIENT=\"yes\"], [])\n\nAC_CHECK_DEFINE([_FORTIFY_SOURCE], [], [\n  AX_CHECK_COMPILE_FLAG([-D_FORTIFY_SOURCE=2],\n    [CPPFLAGS=\"$CPPFLAGS -D_FORTIFY_SOURCE=2\"])\n])\n\nAX_CHECK_COMPILE_FLAG([-fvisibility=hidden],\n  [CFLAGS=\"$CFLAGS -fvisibility=hidden\"])\n\nAS_CASE([$host_os], [cygwin*|mingw*|msys|pw32*|cegcc*], [ ], [\n  AX_CHECK_COMPILE_FLAG([-fPIC], [\n    AX_CHECK_LINK_FLAG([-fPIC],\n      [CFLAGS=\"$CFLAGS -fPIC\"]\n    )\n  ])\n])\n\nAS_IF([test \"$enable_pie\" != \"no\"],[\n  AX_CHECK_COMPILE_FLAG([-fPIE], [\n    AX_CHECK_LINK_FLAG([-fPIE],\n      [AX_CHECK_LINK_FLAG([-pie],\n        [CFLAGS=\"$CFLAGS -fPIE\"\n         LDFLAGS=\"$LDFLAGS -pie\"])\n    ])\n  ])\n])\n\nAX_CHECK_COMPILE_FLAG([-fno-strict-aliasing], [CFLAGS=\"$CFLAGS -fno-strict-aliasing\"])\nAX_CHECK_COMPILE_FLAG([-fno-strict-overflow], [CFLAGS=\"$CFLAGS -fno-strict-overflow\"], [\n  AX_CHECK_COMPILE_FLAG([-fwrapv], [CFLAGS=\"$CFLAGS -fwrapv\"])\n])\n\nLIBTOOL_OLD_FLAGS=\"$LIBTOOL_EXTRA_FLAGS\"\nLIBTOOL_EXTRA_FLAGS=\"$LIBTOOL_EXTRA_FLAGS -version-info $SODIUM_LIBRARY_VERSION\"\nAC_ARG_ENABLE(soname-versions,\n  [AC_HELP_STRING([--enable-soname-versions], [enable soname versions (must be disabled for Android) (default: enabled)])],\n    [\n        AS_IF([test \"x$enableval\" = \"xno\"], [\n          LIBTOOL_EXTRA_FLAGS=\"$LIBTOOL_OLD_FLAGS -avoid-version\"\n        ])\n    ]\n)\n\nAS_CASE([$host_os],\n  [cygwin*|mingw*|msys|pw32*|cegcc*], [\n    AX_CHECK_LINK_FLAG([-Wl,--dynamicbase], [LDFLAGS=\"$LDFLAGS -Wl,--dynamicbase\"])\n    AX_CHECK_LINK_FLAG([-Wl,--nxcompat], [LDFLAGS=\"$LDFLAGS -Wl,--nxcompat\"])\n  ])\n\nAS_IF([test \"x$enable_ssp\" != \"xno\"],[\n\nAS_CASE([$host_os],\n  [cygwin*|mingw*|msys|pw32*|cegcc*|*aix*|*sunos*|*solaris*], [ ],\n  [*], [\n    AX_CHECK_COMPILE_FLAG([-fstack-protector], [\n      AX_CHECK_LINK_FLAG([-fstack-protector],\n        [CFLAGS=\"$CFLAGS -fstack-protector\"]\n      )\n    ])\n  ])\n])\n\nAX_CHECK_COMPILE_FLAG([-Winit-self], [CFLAGS=\"$CFLAGS -Winit-self\"])\nAX_CHECK_COMPILE_FLAG([-Wwrite-strings], [CFLAGS=\"$CFLAGS -Wwrite-strings\"])\nAX_CHECK_COMPILE_FLAG([-Wdiv-by-zero], [CFLAGS=\"$CFLAGS -Wdiv-by-zero\"])\nAX_CHECK_COMPILE_FLAG([-Wsometimes-uninitialized], [CFLAGS=\"$CFLAGS -Wsometimes-uninitialized\"])\n\nAC_ARG_VAR([CWFLAGS], [define to compilation flags for generating extra warnings])\n\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wall], [CWFLAGS=\"$CWFLAGS -Wall\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wextra], [CWFLAGS=\"$CWFLAGS -Wextra\"])\n\nAC_MSG_CHECKING(for clang)\nAC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[\n#ifndef __clang__\nbe sad\n#endif\n]])],\n  [AC_MSG_RESULT(yes)\n   AX_CHECK_COMPILE_FLAG([$CWFLAGS -Wno-unknown-warning-option],\n     [CWFLAGS=\"$CWFLAGS -Wno-unknown-warning-option\"])\n  ],\n  [AC_MSG_RESULT(no)\n])\n\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wbad-function-cast], [CWFLAGS=\"$CWFLAGS -Wbad-function-cast\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wcast-align], [CWFLAGS=\"$CWFLAGS -Wcast-align\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wcast-qual], [CWFLAGS=\"$CWFLAGS -Wcast-qual\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wchar-subscripts], [CWFLAGS=\"$CWFLAGS -Wchar-subscripts\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wcomment], [CWFLAGS=\"$CWFLAGS -Wcomment\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wfloat-equal], [CWFLAGS=\"$CWFLAGS -Wfloat-equal\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wformat=2], [CWFLAGS=\"$CWFLAGS -Wformat=2\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wimplicit], [CWFLAGS=\"$CWFLAGS -Wimplicit\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wmissing-declarations], [CWFLAGS=\"$CWFLAGS -Wmissing-declarations\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wmissing-prototypes], [CWFLAGS=\"$CWFLAGS -Wmissing-prototypes\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wnormalized=id], [CWFLAGS=\"$CWFLAGS -Wnormalized=id\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Woverride-init], [CWFLAGS=\"$CWFLAGS -Woverride-init\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wparentheses], [CWFLAGS=\"$CWFLAGS -Wparentheses\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wpointer-arith], [CWFLAGS=\"$CWFLAGS -Wpointer-arith\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wredundant-decls], [CWFLAGS=\"$CWFLAGS -Wredundant-decls\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wstrict-prototypes], [CWFLAGS=\"$CWFLAGS -Wstrict-prototypes\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wswitch-enum], [CWFLAGS=\"$CWFLAGS -Wswitch-enum\"])\nAX_CHECK_COMPILE_FLAG([$CWFLAGS -Wvariable-decl], [CWFLAGS=\"$CWFLAGS -Wvariable-decl\"])\n\nAX_CHECK_LINK_FLAG([-Wl,-z,relro], [LDFLAGS=\"$LDFLAGS -Wl,-z,relro\"])\nAX_CHECK_LINK_FLAG([-Wl,-z,now], [LDFLAGS=\"$LDFLAGS -Wl,-z,now\"])\nAX_CHECK_LINK_FLAG([-Wl,-z,noexecstack], [LDFLAGS=\"$LDFLAGS -Wl,-z,noexecstack\"])\n\nLT_INIT\nAC_SUBST(LIBTOOL_DEPS)\n\nAC_ARG_VAR([AR], [path to the ar utility])\nAC_CHECK_TOOL([AR], [ar], [ar])\n\ndnl Checks for headers\n\nAS_IF([test \"x$EMSCRIPTEN\" = \"x\"],[\n\n  AC_MSG_CHECKING(for MMX instructions set)\n  oldcflags=\"$CFLAGS\"\n  AX_CHECK_COMPILE_FLAG([-mmmx], [CFLAGS=\"$CFLAGS -mmmx\"])\n  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[\n#pragma GCC target(\"mmx\")\n#include <mmintrin.h>\n]], [[ __m64 x = _mm_setzero_si64(); ]])],\n    [AC_MSG_RESULT(yes)\n     AC_DEFINE([HAVE_MMINTRIN_H], [1], [mmx is available])\n     AX_CHECK_COMPILE_FLAG([-mmmx], [CFLAGS_MMX=\"-mmmx\"])],\n    [AC_MSG_RESULT(no)])\n  CFLAGS=\"$oldcflags\"\n\n  AC_MSG_CHECKING(for SSE2 instructions set)\n  oldcflags=\"$CFLAGS\"\n  AX_CHECK_COMPILE_FLAG([-msse2], [CFLAGS=\"$CFLAGS -msse2\"])\n  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[\n#pragma GCC target(\"sse2\")\n#ifndef __SSE2__\n# define __SSE2__\n#endif\n#include <emmintrin.h>\n]], [[ __m128d x = _mm_setzero_pd(); ]])],\n    [AC_MSG_RESULT(yes)\n     AC_DEFINE([HAVE_EMMINTRIN_H], [1], [sse2 is available])\n     AX_CHECK_COMPILE_FLAG([-msse2], [CFLAGS_SSE2=\"-msse2\"])],\n    [AC_MSG_RESULT(no)])\n  CFLAGS=\"$oldcflags\"\n\n  oldcflags=\"$CFLAGS\"\n  AX_CHECK_COMPILE_FLAG([-msse3], [CFLAGS=\"$CFLAGS -msse3\"])\n  AC_MSG_CHECKING(for SSE3 instructions set)\n  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[\n#pragma GCC target(\"sse3\")\n#include <pmmintrin.h>\n]], [[ __m128 x = _mm_addsub_ps(_mm_cvtpd_ps(_mm_setzero_pd()),\n                                _mm_cvtpd_ps(_mm_setzero_pd())); ]])],\n    [AC_MSG_RESULT(yes)\n     AC_DEFINE([HAVE_PMMINTRIN_H], [1], [sse3 is available])\n     AX_CHECK_COMPILE_FLAG([-msse3], [CFLAGS_SSE3=\"-msse3\"])],\n    [AC_MSG_RESULT(no)])\n  CFLAGS=\"$oldcflags\"\n\n  oldcflags=\"$CFLAGS\"\n  AX_CHECK_COMPILE_FLAG([-mssse3], [CFLAGS=\"$CFLAGS -mssse3\"])\n  AC_MSG_CHECKING(for SSSE3 instructions set)\n  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[\n#pragma GCC target(\"ssse3\")\n#include <tmmintrin.h>\n]], [[ __m64 x = _mm_abs_pi32(_m_from_int(0)); ]])],\n    [AC_MSG_RESULT(yes)\n     AC_DEFINE([HAVE_TMMINTRIN_H], [1], [ssse3 is available])\n     AX_CHECK_COMPILE_FLAG([-mssse3], [CFLAGS_SSSE3=\"-mssse3\"])],\n    [AC_MSG_RESULT(no)])\n  CFLAGS=\"$oldcflags\"\n\n  oldcflags=\"$CFLAGS\"\n  AX_CHECK_COMPILE_FLAG([-msse4.1], [CFLAGS=\"$CFLAGS -msse4.1\"])\n  AC_MSG_CHECKING(for SSE4.1 instructions set)\n  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[\n#pragma GCC target(\"sse4.1\")\n#include <smmintrin.h>\n]], [[ __m128i x = _mm_minpos_epu16(_mm_setzero_si128()); ]])],\n    [AC_MSG_RESULT(yes)\n     AC_DEFINE([HAVE_SMMINTRIN_H], [1], [sse4.1 is available])\n     AX_CHECK_COMPILE_FLAG([-msse4.1], [CFLAGS_SSE41=\"-msse4.1\"])],\n    [AC_MSG_RESULT(no)])\n  CFLAGS=\"$oldcflags\"\n\n  oldcflags=\"$CFLAGS\"\n  AX_CHECK_COMPILE_FLAG([-mavx], [CFLAGS=\"$CFLAGS -mavx\"])\n  AC_MSG_CHECKING(for AVX instructions set)\n  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[\n#pragma GCC target(\"avx\")\n#include <immintrin.h>\n]], [[ _mm256_zeroall(); ]])],\n    [AC_MSG_RESULT(yes)\n     AC_DEFINE([HAVE_AVXINTRIN_H], [1], [AVX is available])\n     AX_CHECK_COMPILE_FLAG([-mavx], [CFLAGS_AVX=\"-mavx\"])],\n    [AC_MSG_RESULT(no)])\n  CFLAGS=\"$oldcflags\"\n\n  oldcflags=\"$CFLAGS\"\n  AX_CHECK_COMPILE_FLAG([-maes], [CFLAGS=\"$CFLAGS -maes\"])\n  AX_CHECK_COMPILE_FLAG([-mpclmul], [CFLAGS=\"$CFLAGS -mpclmul\"])\n  AC_MSG_CHECKING(for AESNI instructions set and PCLMULQDQ)\n  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[\n#pragma GCC target(\"aes\")\n#pragma GCC target(\"pclmul\")\n#include <wmmintrin.h>\n]], [[ __m128i x = _mm_aesimc_si128(_mm_setzero_si128());\n       __m128i y = _mm_clmulepi64_si128(_mm_setzero_si128(), _mm_setzero_si128(), 0);]])],\n    [AC_MSG_RESULT(yes)\n     AC_DEFINE([HAVE_WMMINTRIN_H], [1], [aesni is available])\n     AX_CHECK_COMPILE_FLAG([-maes], [CFLAGS_AESNI=\"-maes\"])\n     AX_CHECK_COMPILE_FLAG([-mpclmul], [CFLAGS_PCLMUL=\"-mpclmul\"])\n     ],\n    [AC_MSG_RESULT(no)])\n  CFLAGS=\"$oldcflags\"\n\n])\n\nAC_SUBST(CFLAGS_MMX)\nAC_SUBST(CFLAGS_SSE2)\nAC_SUBST(CFLAGS_SSE3)\nAC_SUBST(CFLAGS_SSSE3)\nAC_SUBST(CFLAGS_SSE41)\nAC_SUBST(CFLAGS_AESNI)\nAC_SUBST(CFLAGS_PCLMUL)\n\nAC_CHECK_HEADERS([sys/mman.h])\n\ndnl Checks for typedefs, structures, and compiler characteristics.\n\nAC_C_INLINE\nAC_C_BIGENDIAN(\n  AC_DEFINE(NATIVE_BIG_ENDIAN, 1, [machine is bigendian]),\n  AC_DEFINE(NATIVE_LITTLE_ENDIAN, 1, [machine is littleendian]),\n  AC_MSG_ERROR([unknown endianess]),\n  AC_MSG_ERROR([universal endianess is not supported - compile separately and use lipo(1)])\n)\n\nAC_MSG_CHECKING(whether __STDC_LIMIT_MACROS is required)\nAC_COMPILE_IFELSE([AC_LANG_PROGRAM([[\n#include <limits.h>\n#include <stdint.h>\n]], [[\n(void) SIZE_MAX;\n(void) UINT64_MAX;\n]])],\n  [AC_MSG_RESULT(no)],\n  [AC_MSG_RESULT(yes)\n   CPPFLAGS=\"$CPPFLAGS -D__STDC_LIMIT_MACROS -D__STDC_CONSTANT_MACROS\"\n])\n\nHAVE_AMD64_ASM_V=0\nAS_IF([test \"$enable_asm\" != \"no\"],[\n  AC_MSG_CHECKING(whether we can use x86_64 asm code)\n  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[\n  ]], [[\n#if defined(__amd64) || defined(__amd64__) || defined(__x86_64__)\n# if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__) || defined(_WIN32) || defined(_WIN64)\n#  error Windows x86_64 calling conventions are not supported yet\n# endif\n/* neat */\n#else\n# error !x86_64\n#endif\nunsigned char i = 0, o = 0, t;\n__asm__ __volatile__ (\"pxor %%xmm12, %%xmm6 \\n\"\n                      \"movb (%[i]), %[t] \\n\"\n                      \"addb %[t], (%[o]) \\n\"\n                      : [t] \"=&r\"(t)\n                      : [o] \"D\"(&o), [i] \"S\"(&i)\n                      : \"memory\", \"flags\", \"cc\");\n]])],\n  [AC_MSG_RESULT(yes)\n   AC_DEFINE([HAVE_AMD64_ASM], [1], [x86_64 asm code can be used])\n   HAVE_AMD64_ASM_V=1],\n  [AC_MSG_RESULT(no)])\n])\nAM_CONDITIONAL([HAVE_AMD64_ASM], [test $HAVE_AMD64_ASM_V = 1])\nAC_SUBST(HAVE_AMD64_ASM_V)\n\nHAVE_AVX_ASM_V=0\nAS_IF([test \"$enable_asm\" != \"no\"],[\n  AC_MSG_CHECKING(whether we can assemble AVX opcodes)\n  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[\n  ]], [[\n#if defined(__amd64) || defined(__amd64__) || defined(__x86_64__)\n# if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__) || defined(_WIN32) || defined(_WIN64)\n#  error Windows x86_64 calling conventions are not supported yet\n# endif\n/* neat */\n#else\n# error !x86_64\n#endif\n__asm__ __volatile__ (\"vpunpcklqdq %xmm0,%xmm13,%xmm0\");\n]])],\n  [AC_MSG_RESULT(yes)\n   AC_DEFINE([HAVE_AVX_ASM], [1], [AVX opcodes are supported])\n   HAVE_AVX_ASM_V=1],\n  [AC_MSG_RESULT(no)])\n])\nAM_CONDITIONAL([HAVE_AVX_ASM], [test $HAVE_AVX_ASM_V = 1])\nAC_SUBST(HAVE_AVX_ASM_V)\n\nAC_MSG_CHECKING(for 128-bit arithmetic)\nHAVE_TI_MODE_V=0\nAC_COMPILE_IFELSE([AC_LANG_PROGRAM([[\n#if !defined(__GNUC__) && !defined(__SIZEOF_INT128__)\n# error mode(TI) is a gcc extension, and __int128 is not available\n#endif\n#if defined(__clang__) && !defined(__x86_64__)\n# error clang does not properly handle the 128-bit type on 32-bit systems\n#endif\n#ifndef NATIVE_LITTLE_ENDIAN\n# error libsodium currently expects a little endian CPU for the 128-bit type\n#endif\n#ifdef __EMSCRIPTEN__\n# error emscripten currently supports only shift operations on integers \\\n#       larger than 64 bits\n#endif\n#include <stddef.h>\n#include <stdint.h>\n#if defined(__SIZEOF_INT128__)\ntypedef unsigned __int128 uint128_t;\n#else\ntypedef unsigned uint128_t __attribute__((mode(TI)));\n#endif\nvoid fcontract(uint128_t *t) {\n  *t += 0x8000000000000 - 1;\n}\n]], [[\n(void) fcontract;\n]])],\n[AC_MSG_RESULT(yes)\n AC_DEFINE([HAVE_TI_MODE], [1], [gcc TI mode is available])\n HAVE_TI_MODE_V=1],\n[AC_MSG_RESULT(no)])\nAM_CONDITIONAL([HAVE_TI_MODE], [test $HAVE_TI_MODE_V = 1])\nAC_SUBST(HAVE_TI_MODE_V)\n\nHAVE_CPUID_V=0\nAS_IF([test \"$enable_asm\" != \"no\"],[\n  AC_MSG_CHECKING(for cpuid instruction)\n  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ ]], [[\nunsigned int cpu_info[4];\n__asm__ __volatile__ (\"xchgl %%ebx, %k1; cpuid; xchgl %%ebx, %k1\" :\n                      \"=a\" (cpu_info[0]), \"=&r\" (cpu_info[1]),\n                      \"=c\" (cpu_info[2]), \"=d\" (cpu_info[3]) :\n                      \"0\" (0U), \"2\" (0U));\n  ]])],\n  [AC_MSG_RESULT(yes)\n   AC_DEFINE([HAVE_CPUID], [1], [cpuid instruction is available])\n   HAVE_CPUID_V=1],\n  [AC_MSG_RESULT(no)])\n  ])\nAC_SUBST(HAVE_CPUID_V)\n\nAC_MSG_CHECKING(if weak symbols are supported)\nAC_LINK_IFELSE([AC_LANG_PROGRAM([[\n__attribute__((weak)) void __dummy(void *x) { }\nvoid f(void *x) { __dummy(x); }\n]], [[ ]]\n)],\n[AC_MSG_RESULT(yes)\n AC_DEFINE([HAVE_WEAK_SYMBOLS], [1], [weak symbols are supported])],\n[AC_MSG_RESULT(no)])\n\nAC_MSG_CHECKING(if data alignment is required)\naligned_access_required=yes\nAS_CASE([$host_cpu],\n  [i*86 | x86_64 | powerpc* | s390*],\n    [aligned_access_required=no],\n  [arm*],\n    [AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[\n#ifndef __ARM_FEATURE_UNALIGNED\n# error data alignment is required\n#endif\n      ]], [[]])], [aligned_access_required=no], [])]\n)\nAS_IF([test \"x$aligned_access_required\" = \"xyes\"],\n  [AC_MSG_RESULT(yes)],\n  [AC_MSG_RESULT(no)\n   AC_DEFINE([CPU_UNALIGNED_ACCESS], [1], [unaligned memory access is supported])])\n\ndnl Checks for functions and headers\n\nAS_IF([test \"x$EMSCRIPTEN\" = \"x\"],[\n  AC_CHECK_FUNCS([arc4random arc4random_buf])\n  AC_CHECK_FUNCS([mmap mlock madvise mprotect explicit_bzero])\n])\nAC_CHECK_FUNCS([posix_memalign getpid])\n\nAC_SUBST([LIBTOOL_EXTRA_FLAGS])\n\nTEST_LDFLAGS=''\nAS_IF([test \"x$EMSCRIPTEN\" != \"x\"],[\n  EXEEXT=.js\n  TEST_LDFLAGS='--memory-init-file 0 --pre-js pre.js.inc -s NO_BROWSER=1 -s RESERVED_FUNCTION_POINTERS=8'\n])\nAC_SUBST(TEST_LDFLAGS)\nAM_CONDITIONAL([EMSCRIPTEN], [test \"x$EMSCRIPTEN\" != \"x\"])\n\nAM_CONDITIONAL([NATIVECLIENT], [test \"x$NATIVECLIENT\" != \"x\"])\n\ndnl Libtool.\n\nLT_INIT([dlopen])\nAC_LIBTOOL_WIN32_DLL\ngl_LD_OUTPUT_DEF\n\ndnl Output.\n\nAH_VERBATIM([NDEBUG], [/* Always evaluate assert() calls */\n#ifdef NDEBUG\n#/**/undef/**/ NDEBUG\n#endif])\n\nAC_CONFIG_FILES([Makefile\n                 src/Makefile\n                 src/libsodium/Makefile\n                 src/libsodium/include/Makefile\n                 src/libsodium/include/sodium/version.h\n                 ])\nAC_OUTPUT\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/libsodium.pc.in",
    "content": "prefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\n\nName: @PACKAGE_NAME@\nVersion: @PACKAGE_VERSION@\nDescription: A portable, cross-compilable, installable, packageable fork of NaCl, with a compatible API.\n\nLibs: -L${libdir} -lsodium\nCflags: -I${includedir}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/libsodium.sln",
    "content": "﻿\nMicrosoft Visual Studio Solution File, Format Version 12.00\n# Visual Studio 14\nVisualStudioVersion = 14.0.23107.0\nMinimumVisualStudioVersion = 10.0.40219.1\nProject(\"{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}\") = \"libsodium\", \"libsodium.vcxproj\", \"{A185B162-6CB6-4502-B03F-B56F7699A8D9}\"\nEndProject\nGlobal\n\tGlobalSection(SolutionConfigurationPlatforms) = preSolution\n\t\tDebug|Win32 = Debug|Win32\n\t\tDebug|x64 = Debug|x64\n\t\tDebugDLL|Win32 = DebugDLL|Win32\n\t\tDebugDLL|x64 = DebugDLL|x64\n\t\tRelease|Win32 = Release|Win32\n\t\tRelease|x64 = Release|x64\n\t\tReleaseDLL|Win32 = ReleaseDLL|Win32\n\t\tReleaseDLL|x64 = ReleaseDLL|x64\n\tEndGlobalSection\n\tGlobalSection(ProjectConfigurationPlatforms) = postSolution\n\t\t{A185B162-6CB6-4502-B03F-B56F7699A8D9}.Debug|Win32.ActiveCfg = Debug|Win32\n\t\t{A185B162-6CB6-4502-B03F-B56F7699A8D9}.Debug|Win32.Build.0 = Debug|Win32\n\t\t{A185B162-6CB6-4502-B03F-B56F7699A8D9}.Debug|x64.ActiveCfg = Debug|x64\n\t\t{A185B162-6CB6-4502-B03F-B56F7699A8D9}.Debug|x64.Build.0 = Debug|x64\n\t\t{A185B162-6CB6-4502-B03F-B56F7699A8D9}.DebugDLL|Win32.ActiveCfg = DebugDLL|Win32\n\t\t{A185B162-6CB6-4502-B03F-B56F7699A8D9}.DebugDLL|Win32.Build.0 = DebugDLL|Win32\n\t\t{A185B162-6CB6-4502-B03F-B56F7699A8D9}.DebugDLL|x64.ActiveCfg = DebugDLL|x64\n\t\t{A185B162-6CB6-4502-B03F-B56F7699A8D9}.DebugDLL|x64.Build.0 = DebugDLL|x64\n\t\t{A185B162-6CB6-4502-B03F-B56F7699A8D9}.Release|Win32.ActiveCfg = Release|Win32\n\t\t{A185B162-6CB6-4502-B03F-B56F7699A8D9}.Release|Win32.Build.0 = Release|Win32\n\t\t{A185B162-6CB6-4502-B03F-B56F7699A8D9}.Release|x64.ActiveCfg = Release|x64\n\t\t{A185B162-6CB6-4502-B03F-B56F7699A8D9}.Release|x64.Build.0 = Release|x64\n\t\t{A185B162-6CB6-4502-B03F-B56F7699A8D9}.ReleaseDLL|Win32.ActiveCfg = ReleaseDLL|Win32\n\t\t{A185B162-6CB6-4502-B03F-B56F7699A8D9}.ReleaseDLL|Win32.Build.0 = ReleaseDLL|Win32\n\t\t{A185B162-6CB6-4502-B03F-B56F7699A8D9}.ReleaseDLL|x64.ActiveCfg = ReleaseDLL|x64\n\t\t{A185B162-6CB6-4502-B03F-B56F7699A8D9}.ReleaseDLL|x64.Build.0 = ReleaseDLL|x64\n\tEndGlobalSection\n\tGlobalSection(SolutionProperties) = preSolution\n\t\tHideSolutionNode = FALSE\n\tEndGlobalSection\nEndGlobal\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/libsodium.vcxproj",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project DefaultTargets=\"Build\" ToolsVersion=\"14.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup Label=\"ProjectConfigurations\">\n    <ProjectConfiguration Include=\"DebugDLL|Win32\">\n      <Configuration>DebugDLL</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"DebugDLL|x64\">\n      <Configuration>DebugDLL</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|Win32\">\n      <Configuration>Debug</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Debug|x64\">\n      <Configuration>Debug</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"ReleaseDLL|Win32\">\n      <Configuration>ReleaseDLL</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"ReleaseDLL|x64\">\n      <Configuration>ReleaseDLL</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|Win32\">\n      <Configuration>Release</Configuration>\n      <Platform>Win32</Platform>\n    </ProjectConfiguration>\n    <ProjectConfiguration Include=\"Release|x64\">\n      <Configuration>Release</Configuration>\n      <Platform>x64</Platform>\n    </ProjectConfiguration>\n  </ItemGroup>\n  <PropertyGroup Label=\"Globals\">\n    <ProjectGuid>{A185B162-6CB6-4502-B03F-B56F7699A8D9}</ProjectGuid>\n    <Keyword>Win32Proj</Keyword>\n    <RootNamespace>libsodium</RootNamespace>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.Default.props\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>MultiByte</CharacterSet>\n    <WholeProgramOptimization>false</WholeProgramOptimization>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugDLL|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>MultiByte</CharacterSet>\n    <WholeProgramOptimization>false</WholeProgramOptimization>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>MultiByte</CharacterSet>\n    <WholeProgramOptimization>false</WholeProgramOptimization>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugDLL|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>true</UseDebugLibraries>\n    <CharacterSet>MultiByte</CharacterSet>\n    <WholeProgramOptimization>false</WholeProgramOptimization>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseDLL|Win32'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"Configuration\">\n    <ConfigurationType>StaticLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseDLL|x64'\" Label=\"Configuration\">\n    <ConfigurationType>DynamicLibrary</ConfigurationType>\n    <UseDebugLibraries>false</UseDebugLibraries>\n    <WholeProgramOptimization>true</WholeProgramOptimization>\n    <CharacterSet>MultiByte</CharacterSet>\n    <PlatformToolset>v140</PlatformToolset>\n  </PropertyGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.props\" />\n  <ImportGroup Label=\"ExtensionSettings\">\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"msvc-scripts\\sodium.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugDLL|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"msvc-scripts\\sodium.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"msvc-scripts\\sodium.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugDLL|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"msvc-scripts\\sodium.props\" />\n  </ImportGroup>\n  <ImportGroup Label=\"PropertySheets\" Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"msvc-scripts\\sodium.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseDLL|Win32'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"msvc-scripts\\sodium.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"msvc-scripts\\sodium.props\" />\n  </ImportGroup>\n  <ImportGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseDLL|x64'\" Label=\"PropertySheets\">\n    <Import Project=\"$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props\" Condition=\"exists('$(UserRootDir)\\Microsoft.Cpp.$(Platform).user.props')\" Label=\"LocalAppDataPlatform\" />\n    <Import Project=\"msvc-scripts\\sodium.props\" />\n  </ImportGroup>\n  <PropertyGroup Label=\"UserMacros\" />\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(SolutionDir)Build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>$(SolutionDir)Build\\$(Configuration)\\$(Platform)\\Intermediate\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugDLL|Win32'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(SolutionDir)Build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>$(SolutionDir)Build\\$(Configuration)\\$(Platform)\\Intermediate\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(SolutionDir)Build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>$(SolutionDir)Build\\$(Configuration)\\$(Platform)\\Intermediate\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugDLL|x64'\">\n    <LinkIncremental>true</LinkIncremental>\n    <OutDir>$(SolutionDir)Build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>$(SolutionDir)Build\\$(Configuration)\\$(Platform)\\Intermediate\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)Build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>$(SolutionDir)Build\\$(Configuration)\\$(Platform)\\Intermediate\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseDLL|Win32'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)Build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>$(SolutionDir)Build\\$(Configuration)\\$(Platform)\\Intermediate\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)Build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>$(SolutionDir)Build\\$(Configuration)\\$(Platform)\\Intermediate\\</IntDir>\n  </PropertyGroup>\n  <PropertyGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseDLL|x64'\">\n    <LinkIncremental>false</LinkIncremental>\n    <OutDir>$(SolutionDir)Build\\$(Configuration)\\$(Platform)\\</OutDir>\n    <IntDir>$(SolutionDir)Build\\$(Configuration)\\$(Platform)\\Intermediate\\</IntDir>\n  </PropertyGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>SODIUM_STATIC;SODIUM_EXPORT=;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4244;%(DisableSpecificWarnings)</DisableSpecificWarnings>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n      <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)src\\libsodium\\include\\sodium;$(SolutionDir)src\\libsodium\\include\\sodium;$(SolutionDir)src\\libsodium\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugDLL|Win32'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>SODIUM_EXPORT=__declspec(dllexport);SODIUM_DLL_EXPORT;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4244;%(DisableSpecificWarnings)</DisableSpecificWarnings>\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\n      <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)src\\libsodium\\include\\sodium;$(SolutionDir)src\\libsodium\\include\\sodium;$(SolutionDir)src\\libsodium\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Debug|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>SODIUM_STATIC;SODIUM_EXPORT=;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4244;%(DisableSpecificWarnings)</DisableSpecificWarnings>\n      <RuntimeLibrary>MultiThreadedDebug</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='DebugDLL|x64'\">\n    <ClCompile>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <WarningLevel>Level3</WarningLevel>\n      <Optimization>Disabled</Optimization>\n      <PreprocessorDefinitions>SODIUM_EXPORT=__declspec(dllexport);SODIUM_DLL_EXPORT;WIN32;_DEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4244;%(DisableSpecificWarnings)</DisableSpecificWarnings>\n      <RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>Full</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>SODIUM_STATIC;SODIUM_EXPORT=;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4244;%(DisableSpecificWarnings)</DisableSpecificWarnings>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\n      <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)src\\libsodium\\include\\sodium;$(SolutionDir)src\\libsodium\\include\\sodium;$(SolutionDir)src\\libsodium\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseDLL|Win32'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>Full</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>SODIUM_EXPORT=__declspec(dllexport);SODIUM_DLL_EXPORT;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4244;%(DisableSpecificWarnings)</DisableSpecificWarnings>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n      <FavorSizeOrSpeed>Speed</FavorSizeOrSpeed>\n      <AdditionalIncludeDirectories>$(SolutionDir);$(SolutionDir)src\\libsodium\\include\\sodium;$(SolutionDir)src\\libsodium\\include\\sodium;$(SolutionDir)src\\libsodium\\include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='Release|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>SODIUM_STATIC;SODIUM_EXPORT=;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4244;%(DisableSpecificWarnings)</DisableSpecificWarnings>\n      <RuntimeLibrary>MultiThreaded</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$(Configuration)|$(Platform)'=='ReleaseDLL|x64'\">\n    <ClCompile>\n      <WarningLevel>Level3</WarningLevel>\n      <PrecompiledHeader>\n      </PrecompiledHeader>\n      <Optimization>MaxSpeed</Optimization>\n      <FunctionLevelLinking>true</FunctionLevelLinking>\n      <IntrinsicFunctions>true</IntrinsicFunctions>\n      <PreprocessorDefinitions>SODIUM_EXPORT=__declspec(dllexport);SODIUM_DLL_EXPORT;WIN32;NDEBUG;_CONSOLE;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n      <DisableSpecificWarnings>4244;%(DisableSpecificWarnings)</DisableSpecificWarnings>\n      <RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>\n    </ClCompile>\n    <Link>\n      <SubSystem>Console</SubSystem>\n      <GenerateDebugInformation>true</GenerateDebugInformation>\n      <EnableCOMDATFolding>true</EnableCOMDATFolding>\n      <OptimizeReferences>true</OptimizeReferences>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemGroup>\n    <ClInclude Include=\"src\\libsodium\\crypto_generichash\\blake2\\ref\\blake2b-load-sse2.h\" />\n    <ClInclude Include=\"src\\libsodium\\crypto_generichash\\blake2\\ref\\blake2b-load-sse41.h\" />\n    <ClInclude Include=\"src\\libsodium\\crypto_generichash\\blake2\\ref\\blake2b-round.h\" />\n    <ClInclude Include=\"src\\libsodium\\crypto_onetimeauth\\poly1305\\onetimeauth_poly1305.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\core.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_aead_aes256gcm.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_aead_chacha20poly1305.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_auth.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_auth_hmacsha256.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_auth_hmacsha512.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_auth_hmacsha512256.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_box.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_box_curve25519xsalsa20poly1305.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_core_hsalsa20.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_core_salsa20.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_core_salsa2012.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_core_salsa208.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_generichash.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_generichash_blake2b.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_hash.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_hash_sha256.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_hash_sha512.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_int32.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_int64.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_onetimeauth.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_onetimeauth_poly1305.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_pwhash_scryptsalsa208sha256.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_scalarmult.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_scalarmult_curve25519.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_secretbox.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_secretbox_xsalsa20poly1305.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_shorthash.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_shorthash_siphash24.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_sign.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_sign_ed25519.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_sign_edwards25519sha512batch.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_stream.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_stream_aes128ctr.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_stream_chacha20.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_stream_salsa20.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_stream_salsa2012.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_stream_salsa208.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_stream_xsalsa20.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_uint16.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_uint32.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_uint64.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_uint8.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_verify_16.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_verify_32.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_verify_64.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\export.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\randombytes.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\randombytes_salsa20_random.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\randombytes_sysrandom.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\runtime.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\utils.h\" />\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\version.h\" />\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"src\\libsodium\\crypto_aead\\aes256gcm\\aesni\\aead_aes256gcm_aesni.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_aead\\chacha20poly1305\\sodium\\aead_chacha20poly1305.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\crypto_auth.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha256\\auth_hmacsha256_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha256\\cp\\hmac_hmacsha256.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha256\\cp\\verify_hmacsha256.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha512\\auth_hmacsha512_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha512\\cp\\hmac_hmacsha512.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha512\\cp\\verify_hmacsha512.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha512256\\auth_hmacsha512256_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha512256\\cp\\hmac_hmacsha512256.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha512256\\cp\\verify_hmacsha512256.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_box\\crypto_box.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_box\\crypto_box_easy.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_box\\crypto_box_seal.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_box\\curve25519xsalsa20poly1305\\box_curve25519xsalsa20poly1305_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_box\\curve25519xsalsa20poly1305\\ref\\after_curve25519xsalsa20poly1305.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_box\\curve25519xsalsa20poly1305\\ref\\before_curve25519xsalsa20poly1305.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_box\\curve25519xsalsa20poly1305\\ref\\box_curve25519xsalsa20poly1305.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_box\\curve25519xsalsa20poly1305\\ref\\keypair_curve25519xsalsa20poly1305.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_core\\hsalsa20\\core_hsalsa20_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_core\\hsalsa20\\ref2\\core_hsalsa20.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_core\\salsa2012\\core_salsa2012_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_core\\salsa2012\\ref\\core_salsa2012.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_core\\salsa208\\core_salsa208_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_core\\salsa208\\ref\\core_salsa208.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_core\\salsa20\\core_salsa20_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_core\\salsa20\\ref\\core_salsa20.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_generichash\\blake2\\generichash_blake2_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_generichash\\blake2\\ref\\blake2b-compress-ref.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_generichash\\blake2\\ref\\blake2b-compress-sse41.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_generichash\\blake2\\ref\\blake2b-compress-ssse3.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_generichash\\blake2\\ref\\blake2b-ref.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_generichash\\blake2\\ref\\generichash_blake2b.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_generichash\\crypto_generichash.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_hash\\crypto_hash.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_hash\\sha256\\hash_sha256_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_hash\\sha256\\cp\\hash_sha256.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_hash\\sha512\\hash_sha512_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_hash\\sha512\\cp\\hash_sha512.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_onetimeauth\\crypto_onetimeauth.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_onetimeauth\\poly1305\\donna\\poly1305_donna.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_onetimeauth\\poly1305\\onetimeauth_poly1305.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_pwhash\\scryptsalsa208sha256\\crypto_scrypt-common.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_pwhash\\scryptsalsa208sha256\\nosse\\pwhash_scryptsalsa208sha256_nosse.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_pwhash\\scryptsalsa208sha256\\pbkdf2-sha256.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_pwhash\\scryptsalsa208sha256\\pwhash_scryptsalsa208sha256.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_pwhash\\scryptsalsa208sha256\\scrypt_platform.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_pwhash\\scryptsalsa208sha256\\sse\\pwhash_scryptsalsa208sha256_sse.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\crypto_scalarmult.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\donna_c64\\curve25519_donna_c64.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\curve25519_ref10.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_0_curve25519_ref10.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_1_curve25519_ref10.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_add_curve25519_ref10.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_copy_curve25519_ref10.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_cswap_curve25519_ref10.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_frombytes_curve25519_ref10.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_invert_curve25519_ref10.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_mul121666_curve25519_ref10.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_mul_curve25519_ref10.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_sq_curve25519_ref10.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_sub_curve25519_ref10.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_tobytes_curve25519_ref10.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\sandy2x\\curve25519_sandy2x.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\sandy2x\\fe51_invert.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\sandy2x\\fe_frombytes_sandy2x.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\scalarmult_curve25519.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_secretbox\\crypto_secretbox.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_secretbox\\crypto_secretbox_easy.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_secretbox\\xsalsa20poly1305\\ref\\box_xsalsa20poly1305.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_secretbox\\xsalsa20poly1305\\secretbox_xsalsa20poly1305_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_shorthash\\crypto_shorthash.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_shorthash\\siphash24\\ref\\shorthash_siphash24.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_shorthash\\siphash24\\shorthash_siphash24_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\crypto_sign.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_0.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_1.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_add.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_cmov.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_copy.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_frombytes.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_invert.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_isnegative.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_isnonzero.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_mul.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_neg.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_pow22523.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_sq.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_sq2.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_sub.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_tobytes.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_add.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_double_scalarmult.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_frombytes.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_madd.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_msub.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p1p1_to_p2.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p1p1_to_p3.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p2_0.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p2_dbl.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p3_0.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p3_dbl.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p3_tobytes.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p3_to_cached.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p3_to_p2.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_precomp_0.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_scalarmult_base.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_sub.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_tobytes.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\keypair.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\obsolete.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\open.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\sc_muladd.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\sc_reduce.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\sign.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\sign_ed25519_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\aes128ctr\\portable\\afternm_aes128ctr.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\aes128ctr\\portable\\beforenm_aes128ctr.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\aes128ctr\\portable\\common_aes128ctr.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\aes128ctr\\portable\\consts_aes128ctr.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\aes128ctr\\portable\\int128_aes128ctr.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\aes128ctr\\portable\\stream_aes128ctr.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\aes128ctr\\portable\\xor_afternm_aes128ctr.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\aes128ctr\\stream_aes128ctr_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\chacha20\\ref\\stream_chacha20_ref.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\chacha20\\stream_chacha20.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\crypto_stream.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa2012\\ref\\stream_salsa2012.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa2012\\ref\\xor_salsa2012.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa2012\\stream_salsa2012_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa208\\ref\\stream_salsa208.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa208\\ref\\xor_salsa208.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa208\\stream_salsa208_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa20\\ref\\stream_salsa20_ref.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa20\\ref\\xor_salsa20_ref.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa20\\stream_salsa20_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\xsalsa20\\ref\\stream_xsalsa20.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\xsalsa20\\ref\\xor_xsalsa20.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\xsalsa20\\stream_xsalsa20_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_verify\\16\\ref\\verify_16.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_verify\\16\\verify_16_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_verify\\32\\ref\\verify_32.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_verify\\32\\verify_32_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_verify\\64\\ref\\verify_64.c\" />\n    <ClCompile Include=\"src\\libsodium\\crypto_verify\\64\\verify_64_api.c\" />\n    <ClCompile Include=\"src\\libsodium\\randombytes\\randombytes.c\" />\n    <ClCompile Include=\"src\\libsodium\\randombytes\\salsa20\\randombytes_salsa20_random.c\" />\n    <ClCompile Include=\"src\\libsodium\\randombytes\\sysrandom\\randombytes_sysrandom.c\" />\n    <ClCompile Include=\"src\\libsodium\\sodium\\core.c\" />\n    <ClCompile Include=\"src\\libsodium\\sodium\\runtime.c\" />\n    <ClCompile Include=\"src\\libsodium\\sodium\\utils.c\" />\n    <ClCompile Include=\"src\\libsodium\\sodium\\version.c\" />\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\sandy2x\\sandy2x.S\" />\n  </ItemGroup>\n  <Import Project=\"$(VCTargetsPath)\\Microsoft.Cpp.targets\" />\n  <ImportGroup Label=\"ExtensionTargets\">\n  </ImportGroup>\n</Project>\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/libsodium.vcxproj.filters",
    "content": "﻿<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n  <ItemGroup>\n    <Filter Include=\"Source Files\">\n      <UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>\n      <Extensions>cpp;c;cc;cxx;def;odl;idl;hpj;bat;asm;asmx</Extensions>\n    </Filter>\n    <Filter Include=\"Header Files\">\n      <UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>\n      <Extensions>h;hpp;hxx;hm;inl;inc;xsd</Extensions>\n    </Filter>\n    <Filter Include=\"Resource Files\">\n      <UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>\n      <Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>\n    </Filter>\n  </ItemGroup>\n  <ItemGroup>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\core.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_auth.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_auth_hmacsha256.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_auth_hmacsha512.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_auth_hmacsha512256.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_box.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_box_curve25519xsalsa20poly1305.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_core_hsalsa20.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_core_salsa20.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_core_salsa208.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_core_salsa2012.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_generichash.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_generichash_blake2b.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_hash.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_hash_sha256.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_hash_sha512.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_int32.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_int64.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_onetimeauth.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_scalarmult.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_scalarmult_curve25519.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_secretbox.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_secretbox_xsalsa20poly1305.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_shorthash.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_shorthash_siphash24.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_sign.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_sign_ed25519.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_sign_edwards25519sha512batch.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_stream.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_stream_aes128ctr.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_stream_salsa20.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_stream_salsa208.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_stream_salsa2012.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_stream_xsalsa20.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_uint8.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_uint16.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_uint32.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_uint64.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_verify_16.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_verify_32.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_verify_64.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\export.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\randombytes.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\randombytes_salsa20_random.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\randombytes_sysrandom.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\utils.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\version.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_pwhash_scryptsalsa208sha256.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\runtime.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_stream_chacha20.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_aead_aes256gcm.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_aead_chacha20poly1305.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\include\\sodium\\crypto_onetimeauth_poly1305.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\crypto_generichash\\blake2\\ref\\blake2b-load-sse2.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\crypto_generichash\\blake2\\ref\\blake2b-load-sse41.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\crypto_generichash\\blake2\\ref\\blake2b-round.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n    <ClInclude Include=\"src\\libsodium\\crypto_onetimeauth\\poly1305\\onetimeauth_poly1305.h\">\n      <Filter>Header Files</Filter>\n    </ClInclude>\n  </ItemGroup>\n  <ItemGroup>\n    <ClCompile Include=\"src\\libsodium\\crypto_core\\hsalsa20\\ref2\\core_hsalsa20.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_core\\hsalsa20\\core_hsalsa20_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_core\\salsa20\\ref\\core_salsa20.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_core\\salsa208\\ref\\core_salsa208.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_core\\salsa2012\\ref\\core_salsa2012.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha256\\auth_hmacsha256_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha512\\auth_hmacsha512_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha512256\\auth_hmacsha512256_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\crypto_auth.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha256\\cp\\hmac_hmacsha256.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha512\\cp\\hmac_hmacsha512.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha512256\\cp\\hmac_hmacsha512256.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha512\\cp\\verify_hmacsha512.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha512256\\cp\\verify_hmacsha512256.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_box\\curve25519xsalsa20poly1305\\ref\\after_curve25519xsalsa20poly1305.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_box\\curve25519xsalsa20poly1305\\ref\\box_curve25519xsalsa20poly1305.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_box\\curve25519xsalsa20poly1305\\box_curve25519xsalsa20poly1305_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_box\\crypto_box.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_box\\curve25519xsalsa20poly1305\\ref\\keypair_curve25519xsalsa20poly1305.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_core\\salsa20\\core_salsa20_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_core\\salsa208\\core_salsa208_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_core\\salsa2012\\core_salsa2012_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_generichash\\blake2\\ref\\blake2b-ref.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_generichash\\crypto_generichash.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_generichash\\blake2\\generichash_blake2_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_generichash\\blake2\\ref\\generichash_blake2b.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_hash\\crypto_hash.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_hash\\sha256\\cp\\hash_sha256.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_hash\\sha256\\hash_sha256_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_hash\\sha512\\cp\\hash_sha512.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_hash\\sha512\\hash_sha512_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_onetimeauth\\crypto_onetimeauth.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_onetimeauth\\poly1305\\onetimeauth_poly1305.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\crypto_scalarmult.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_secretbox\\xsalsa20poly1305\\ref\\box_xsalsa20poly1305.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_secretbox\\crypto_secretbox.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_secretbox\\xsalsa20poly1305\\secretbox_xsalsa20poly1305_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_shorthash\\crypto_shorthash.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_shorthash\\siphash24\\ref\\shorthash_siphash24.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_shorthash\\siphash24\\shorthash_siphash24_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\crypto_sign.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_0.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_1.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_add.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_cmov.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_copy.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_frombytes.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_invert.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_isnegative.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_isnonzero.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_mul.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_neg.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_pow22523.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_sq.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_sq2.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_sub.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\fe_tobytes.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_add.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_double_scalarmult.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_frombytes.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_madd.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_msub.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p1p1_to_p2.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p1p1_to_p3.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p2_0.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p2_dbl.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p3_0.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p3_dbl.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p3_to_cached.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p3_to_p2.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_p3_tobytes.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_precomp_0.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_scalarmult_base.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_sub.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\ge_tobytes.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\keypair.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\open.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\sc_muladd.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\sc_reduce.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\sign.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\sign_ed25519_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\aes128ctr\\portable\\afternm_aes128ctr.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\aes128ctr\\portable\\beforenm_aes128ctr.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\aes128ctr\\portable\\common_aes128ctr.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\aes128ctr\\portable\\consts_aes128ctr.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\crypto_stream.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\aes128ctr\\portable\\int128_aes128ctr.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\aes128ctr\\portable\\stream_aes128ctr.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\aes128ctr\\stream_aes128ctr_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa20\\stream_salsa20_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa20\\ref\\stream_salsa20_ref.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa208\\ref\\stream_salsa208.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa208\\stream_salsa208_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa2012\\ref\\stream_salsa2012.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa2012\\stream_salsa2012_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\xsalsa20\\ref\\stream_xsalsa20.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\xsalsa20\\stream_xsalsa20_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\aes128ctr\\portable\\xor_afternm_aes128ctr.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa20\\ref\\xor_salsa20_ref.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa208\\ref\\xor_salsa208.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\salsa2012\\ref\\xor_salsa2012.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\xsalsa20\\ref\\xor_xsalsa20.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_verify\\16\\ref\\verify_16.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_verify\\16\\verify_16_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_verify\\32\\ref\\verify_32.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_verify\\32\\verify_32_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_verify\\64\\ref\\verify_64.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_verify\\64\\verify_64_api.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\sodium\\core.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\sodium\\utils.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\sodium\\version.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\randombytes\\randombytes.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\randombytes\\salsa20\\randombytes_salsa20_random.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\randombytes\\sysrandom\\randombytes_sysrandom.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_auth\\hmacsha256\\cp\\verify_hmacsha256.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_pwhash\\scryptsalsa208sha256\\crypto_scrypt-common.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_pwhash\\scryptsalsa208sha256\\pbkdf2-sha256.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_pwhash\\scryptsalsa208sha256\\pwhash_scryptsalsa208sha256.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_pwhash\\scryptsalsa208sha256\\scrypt_platform.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\sodium\\runtime.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_box\\crypto_box_easy.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_box\\crypto_box_seal.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_secretbox\\crypto_secretbox_easy.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_pwhash\\scryptsalsa208sha256\\nosse\\pwhash_scryptsalsa208sha256_nosse.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_pwhash\\scryptsalsa208sha256\\sse\\pwhash_scryptsalsa208sha256_sse.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\chacha20\\stream_chacha20.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_stream\\chacha20\\ref\\stream_chacha20_ref.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_0_curve25519_ref10.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_1_curve25519_ref10.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_add_curve25519_ref10.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_copy_curve25519_ref10.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_cswap_curve25519_ref10.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_frombytes_curve25519_ref10.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_invert_curve25519_ref10.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_mul_curve25519_ref10.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_mul121666_curve25519_ref10.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_sq_curve25519_ref10.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_sub_curve25519_ref10.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\fe_tobytes_curve25519_ref10.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_box\\curve25519xsalsa20poly1305\\ref\\before_curve25519xsalsa20poly1305.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_aead\\aes256gcm\\aesni\\aead_aes256gcm_aesni.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_aead\\chacha20poly1305\\sodium\\aead_chacha20poly1305.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_generichash\\blake2\\ref\\blake2b-compress-ref.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_generichash\\blake2\\ref\\blake2b-compress-sse41.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_generichash\\blake2\\ref\\blake2b-compress-ssse3.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\scalarmult_curve25519.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\donna_c64\\curve25519_donna_c64.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\ref10\\curve25519_ref10.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\sandy2x\\curve25519_sandy2x.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\sandy2x\\fe_frombytes_sandy2x.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\sandy2x\\fe51_invert.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_onetimeauth\\poly1305\\donna\\poly1305_donna.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n    <ClCompile Include=\"src\\libsodium\\crypto_sign\\ed25519\\ref10\\obsolete.c\">\n      <Filter>Source Files</Filter>\n    </ClCompile>\n  </ItemGroup>\n  <ItemGroup>\n    <None Include=\"src\\libsodium\\crypto_scalarmult\\curve25519\\sandy2x\\sandy2x.S\">\n      <Filter>Source Files</Filter>\n    </None>\n  </ItemGroup>\n</Project>\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/m4/ax_check_compile_flag.m4",
    "content": "# ===========================================================================\n#   http://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])\n#\n# DESCRIPTION\n#\n#   Check whether the given FLAG works with the current language's compiler\n#   or gives an error.  (Warnings, however, are ignored)\n#\n#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on\n#   success/failure.\n#\n#   If EXTRA-FLAGS is defined, it is added to the current language's default\n#   flags (e.g. CFLAGS) when the check is done.  The check is thus made with\n#   the flags: \"CFLAGS EXTRA-FLAGS FLAG\".  This can for example be used to\n#   force the compiler to issue an error when a bad flag is given.\n#\n#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this\n#   macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG.\n#\n# LICENSE\n#\n#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>\n#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>\n#\n#   This program is free software: you can redistribute it and/or modify it\n#   under the terms of the GNU General Public License as published by the\n#   Free Software Foundation, either version 3 of the License, or (at your\n#   option) any later version.\n#\n#   This program is distributed in the hope that it will be useful, but\n#   WITHOUT ANY WARRANTY; without even the implied warranty of\n#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n#   Public License for more details.\n#\n#   You should have received a copy of the GNU General Public License along\n#   with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n#   As a special exception, the respective Autoconf Macro's copyright owner\n#   gives unlimited permission to copy, distribute and modify the configure\n#   scripts that are the output of Autoconf when processing the Macro. You\n#   need not follow the terms of the GNU General Public License when using\n#   or distributing such scripts, even though portions of the text of the\n#   Macro appear in them. The GNU General Public License (GPL) does govern\n#   all other use of the material that constitutes the Autoconf Macro.\n#\n#   This special exception to the GPL applies to versions of the Autoconf\n#   Macro released by the Autoconf Archive. When you make and distribute a\n#   modified version of the Autoconf Macro, you may extend this special\n#   exception to the GPL to apply to your modified version as well.\n\n#serial 2\n\nAC_DEFUN([AX_CHECK_COMPILE_FLAG],\n[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF\nAS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl\nAC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [\n  ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS\n  _AC_LANG_PREFIX[]FLAGS=\"$[]_AC_LANG_PREFIX[]FLAGS $4 $1\"\n  AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>]],\n  [[char x[42U], fodder = 0;if (fodder > -1000 && fgets(x,1000,stdin)) puts(x)]])],\n    [AS_VAR_SET(CACHEVAR,[yes])],\n    [AS_VAR_SET(CACHEVAR,[no])])\n  _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags])\nAS_VAR_IF(CACHEVAR,yes,\n  [m4_default([$2], :)],\n  [m4_default([$3], :)])\nAS_VAR_POPDEF([CACHEVAR])dnl\n])dnl AX_CHECK_COMPILE_FLAGS\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/m4/ax_check_define.m4",
    "content": "# ===========================================================================\n#      http://www.gnu.org/software/autoconf-archive/ax_check_define.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AC_CHECK_DEFINE([symbol], [ACTION-IF-FOUND], [ACTION-IF-NOT])\n#   AX_CHECK_DEFINE([includes],[symbol], [ACTION-IF-FOUND], [ACTION-IF-NOT])\n#\n# DESCRIPTION\n#\n#   Complements AC_CHECK_FUNC but it does not check for a function but for a\n#   define to exist. Consider a usage like:\n#\n#    AC_CHECK_DEFINE(__STRICT_ANSI__, CFLAGS=\"$CFLAGS -D_XOPEN_SOURCE=500\")\n#\n# LICENSE\n#\n#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>\n#\n#   This program is free software; you can redistribute it and/or modify it\n#   under the terms of the GNU General Public License as published by the\n#   Free Software Foundation; either version 3 of the License, or (at your\n#   option) any later version.\n#\n#   This program is distributed in the hope that it will be useful, but\n#   WITHOUT ANY WARRANTY; without even the implied warranty of\n#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n#   Public License for more details.\n#\n#   You should have received a copy of the GNU General Public License along\n#   with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n#   As a special exception, the respective Autoconf Macro's copyright owner\n#   gives unlimited permission to copy, distribute and modify the configure\n#   scripts that are the output of Autoconf when processing the Macro. You\n#   need not follow the terms of the GNU General Public License when using\n#   or distributing such scripts, even though portions of the text of the\n#   Macro appear in them. The GNU General Public License (GPL) does govern\n#   all other use of the material that constitutes the Autoconf Macro.\n#\n#   This special exception to the GPL applies to versions of the Autoconf\n#   Macro released by the Autoconf Archive. When you make and distribute a\n#   modified version of the Autoconf Macro, you may extend this special\n#   exception to the GPL to apply to your modified version as well.\n\n#serial 8\n\nAU_ALIAS([AC_CHECK_DEFINED], [AC_CHECK_DEFINE])\nAC_DEFUN([AC_CHECK_DEFINE],[\nAS_VAR_PUSHDEF([ac_var],[ac_cv_defined_$1])dnl\nAC_CACHE_CHECK([for $1 defined], ac_var,\nAC_COMPILE_IFELSE([AC_LANG_PROGRAM([[]], [[\n  #ifdef $1\n  int ok;\n  #else\n  choke me\n  #endif\n]])],[AS_VAR_SET(ac_var, yes)],[AS_VAR_SET(ac_var, no)]))\nAS_IF([test AS_VAR_GET(ac_var) != \"no\"], [$2], [$3])dnl\nAS_VAR_POPDEF([ac_var])dnl\n])\n\nAU_ALIAS([AX_CHECK_DEFINED], [AX_CHECK_DEFINE])\nAC_DEFUN([AX_CHECK_DEFINE],[\nAS_VAR_PUSHDEF([ac_var],[ac_cv_defined_$2_$1])dnl\nAC_CACHE_CHECK([for $2 defined in $1], ac_var,\nAC_COMPILE_IFELSE([AC_LANG_PROGRAM([[#include <$1>]], [[\n  #ifdef $2\n  int ok;\n  #else\n  choke me\n  #endif\n]])],[AS_VAR_SET(ac_var, yes)],[AS_VAR_SET(ac_var, no)]))\nAS_IF([test AS_VAR_GET(ac_var) != \"no\"], [$3], [$4])dnl\nAS_VAR_POPDEF([ac_var])dnl\n])\n\nAC_DEFUN([AX_CHECK_FUNC],\n[AS_VAR_PUSHDEF([ac_var], [ac_cv_func_$2])dnl\nAC_CACHE_CHECK([for $2], ac_var,\ndnl AC_LANG_FUNC_LINK_TRY\n[AC_LINK_IFELSE([AC_LANG_PROGRAM([$1\n                #undef $2\n                char $2 ();],[\n                char (*f) () = $2;\n                return f != $2; ])],\n                [AS_VAR_SET(ac_var, yes)],\n                [AS_VAR_SET(ac_var, no)])])\nAS_IF([test AS_VAR_GET(ac_var) = yes], [$3], [$4])dnl\nAS_VAR_POPDEF([ac_var])dnl\n])# AC_CHECK_FUNC\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/m4/ax_check_gnu_make.m4",
    "content": "# ===========================================================================\n#     http://www.gnu.org/software/autoconf-archive/ax_check_gnu_make.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_CHECK_GNU_MAKE()\n#\n# DESCRIPTION\n#\n#   This macro searches for a GNU version of make. If a match is found, the\n#   makefile variable `ifGNUmake' is set to the empty string, otherwise it\n#   is set to \"#\". This is useful for including a special features in a\n#   Makefile, which cannot be handled by other versions of make. The\n#   variable _cv_gnu_make_command is set to the command to invoke GNU make\n#   if it exists, the empty string otherwise.\n#\n#   Here is an example of its use:\n#\n#   Makefile.in might contain:\n#\n#     # A failsafe way of putting a dependency rule into a makefile\n#     $(DEPEND):\n#             $(CC) -MM $(srcdir)/*.c > $(DEPEND)\n#\n#     @ifGNUmake@ ifeq ($(DEPEND),$(wildcard $(DEPEND)))\n#     @ifGNUmake@ include $(DEPEND)\n#     @ifGNUmake@ endif\n#\n#   Then configure.in would normally contain:\n#\n#     AX_CHECK_GNU_MAKE()\n#     AC_OUTPUT(Makefile)\n#\n#   Then perhaps to cause gnu make to override any other make, we could do\n#   something like this (note that GNU make always looks for GNUmakefile\n#   first):\n#\n#     if  ! test x$_cv_gnu_make_command = x ; then\n#             mv Makefile GNUmakefile\n#             echo .DEFAULT: > Makefile ;\n#             echo \\  $_cv_gnu_make_command \\$@ >> Makefile;\n#     fi\n#\n#   Then, if any (well almost any) other make is called, and GNU make also\n#   exists, then the other make wraps the GNU make.\n#\n# LICENSE\n#\n#   Copyright (c) 2008 John Darrington <j.darrington@elvis.murdoch.edu.au>\n#\n#   Copying and distribution of this file, with or without modification, are\n#   permitted in any medium without royalty provided the copyright notice\n#   and this notice are preserved. This file is offered as-is, without any\n#   warranty.\n\n#serial 7\n\nAC_DEFUN([AX_CHECK_GNU_MAKE], [ AC_CACHE_CHECK( for GNU make,_cv_gnu_make_command,\n                _cv_gnu_make_command='' ;\ndnl Search all the common names for GNU make\n                for a in \"$MAKE\" make gmake gnumake ; do\n                        if test -z \"$a\" ; then continue ; fi ;\n                        if  ( sh -c \"$a --version\" 2> /dev/null | grep GNU  2>&1 > /dev/null ) ;  then\n                                _cv_gnu_make_command=$a ;\n                                break;\n                        fi\n                done ;\n        ) ;\ndnl If there was a GNU version, then set @ifGNUmake@ to the empty string, '#' otherwise\n        if test  \"x$_cv_gnu_make_command\" != \"x\"  ; then\n                ifGNUmake='' ;\n        else\n                ifGNUmake='#' ;\n                AC_MSG_RESULT(\"Not found\");\n        fi\n        AC_SUBST(ifGNUmake)\n] )\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/m4/ax_check_link_flag.m4",
    "content": "# ===========================================================================\n#    http://www.gnu.org/software/autoconf-archive/ax_check_link_flag.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_CHECK_LINK_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS])\n#\n# DESCRIPTION\n#\n#   Check whether the given FLAG works with the linker or gives an error.\n#   (Warnings, however, are ignored)\n#\n#   ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on\n#   success/failure.\n#\n#   If EXTRA-FLAGS is defined, it is added to the linker's default flags\n#   when the check is done.  The check is thus made with the flags: \"LDFLAGS\n#   EXTRA-FLAGS FLAG\".  This can for example be used to force the linker to\n#   issue an error when a bad flag is given.\n#\n#   NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this\n#   macro in sync with AX_CHECK_{PREPROC,COMPILE}_FLAG.\n#\n# LICENSE\n#\n#   Copyright (c) 2008 Guido U. Draheim <guidod@gmx.de>\n#   Copyright (c) 2011 Maarten Bosmans <mkbosmans@gmail.com>\n#\n#   This program is free software: you can redistribute it and/or modify it\n#   under the terms of the GNU General Public License as published by the\n#   Free Software Foundation, either version 3 of the License, or (at your\n#   option) any later version.\n#\n#   This program is distributed in the hope that it will be useful, but\n#   WITHOUT ANY WARRANTY; without even the implied warranty of\n#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n#   Public License for more details.\n#\n#   You should have received a copy of the GNU General Public License along\n#   with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n#   As a special exception, the respective Autoconf Macro's copyright owner\n#   gives unlimited permission to copy, distribute and modify the configure\n#   scripts that are the output of Autoconf when processing the Macro. You\n#   need not follow the terms of the GNU General Public License when using\n#   or distributing such scripts, even though portions of the text of the\n#   Macro appear in them. The GNU General Public License (GPL) does govern\n#   all other use of the material that constitutes the Autoconf Macro.\n#\n#   This special exception to the GPL applies to versions of the Autoconf\n#   Macro released by the Autoconf Archive. When you make and distribute a\n#   modified version of the Autoconf Macro, you may extend this special\n#   exception to the GPL to apply to your modified version as well.\n\n#serial 2\n\nAC_DEFUN([AX_CHECK_LINK_FLAG],\n[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF\nAS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_ldflags_$4_$1])dnl\nAC_CACHE_CHECK([whether the linker accepts $1], CACHEVAR, [\n  ax_check_save_flags=$LDFLAGS\n  LDFLAGS=\"$LDFLAGS $4 $1\"\n  AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <stdio.h>]],\n  [[char x[42U];if (fgets(x,1000,stdin)) puts(x)]])],\n    [AS_VAR_SET(CACHEVAR,[yes])],\n    [AS_VAR_SET(CACHEVAR,[no])])\n  LDFLAGS=$ax_check_save_flags])\nAS_VAR_IF(CACHEVAR,yes,\n  [m4_default([$2], :)],\n  [m4_default([$3], :)])\nAS_VAR_POPDEF([CACHEVAR])dnl\n])dnl AX_CHECK_LINK_FLAGS\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/m4/ld-output-def.m4",
    "content": "# ld-output-def.m4 serial 2\ndnl Copyright (C) 2008-2013 Free Software Foundation, Inc.\ndnl This file is free software; the Free Software Foundation\ndnl gives unlimited permission to copy and/or distribute it,\ndnl with or without modifications, as long as this notice is preserved.\n\ndnl From Simon Josefsson\n\n# gl_LD_OUTPUT_DEF()\n# -------------\n# Check if linker supports -Wl,--output-def and define automake\n# conditional HAVE_LD_OUTPUT_DEF if it is.\nAC_DEFUN([gl_LD_OUTPUT_DEF],\n[\n  AC_CACHE_CHECK([if gcc/ld supports -Wl,--output-def],\n    [gl_cv_ld_output_def],\n    [if test \"$enable_shared\" = no; then\n       gl_cv_ld_output_def=\"not needed, shared libraries are disabled\"\n     else\n       gl_ldflags_save=$LDFLAGS\n       LDFLAGS=\"-Wl,--output-def,conftest.def\"\n       AC_LINK_IFELSE([AC_LANG_PROGRAM([])],\n                   [gl_cv_ld_output_def=yes],\n                   [gl_cv_ld_output_def=no])\n       rm -f conftest.def\n       LDFLAGS=\"$gl_ldflags_save\"\n     fi])\n  AM_CONDITIONAL([HAVE_LD_OUTPUT_DEF], test \"x$gl_cv_ld_output_def\" = \"xyes\")\n])\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/m4/pkg.m4",
    "content": "# pkg.m4 - Macros to locate and utilise pkg-config.            -*- Autoconf -*-\n# serial 1 (pkg-config-0.24)\n# \n# Copyright © 2004 Scott James Remnant <scott@netsplit.com>.\n#\n# This program is free software; you can redistribute it and/or modify\n# it under the terms of the GNU General Public License as published by\n# the Free Software Foundation; either version 2 of the License, or\n# (at your option) any later version.\n#\n# This program is distributed in the hope that it will be useful, but\n# WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n# General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with this program; if not, write to the Free Software\n# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.\n#\n# As a special exception to the GNU General Public License, if you\n# distribute this file as part of a program that contains a\n# configuration script generated by Autoconf, you may include it under\n# the same distribution terms that you use for the rest of that program.\n\n# PKG_PROG_PKG_CONFIG([MIN-VERSION])\n# ----------------------------------\nAC_DEFUN([PKG_PROG_PKG_CONFIG],\n[m4_pattern_forbid([^_?PKG_[A-Z_]+$])\nm4_pattern_allow([^PKG_CONFIG(_(PATH|LIBDIR|SYSROOT_DIR|ALLOW_SYSTEM_(CFLAGS|LIBS)))?$])\nm4_pattern_allow([^PKG_CONFIG_(DISABLE_UNINSTALLED|TOP_BUILD_DIR|DEBUG_SPEW)$])\nAC_ARG_VAR([PKG_CONFIG], [path to pkg-config utility])\nAC_ARG_VAR([PKG_CONFIG_PATH], [directories to add to pkg-config's search path])\nAC_ARG_VAR([PKG_CONFIG_LIBDIR], [path overriding pkg-config's built-in search path])\n\nif test \"x$ac_cv_env_PKG_CONFIG_set\" != \"xset\"; then\n\tAC_PATH_TOOL([PKG_CONFIG], [pkg-config])\nfi\nif test -n \"$PKG_CONFIG\"; then\n\t_pkg_min_version=m4_default([$1], [0.9.0])\n\tAC_MSG_CHECKING([pkg-config is at least version $_pkg_min_version])\n\tif $PKG_CONFIG --atleast-pkgconfig-version $_pkg_min_version; then\n\t\tAC_MSG_RESULT([yes])\n\telse\n\t\tAC_MSG_RESULT([no])\n\t\tPKG_CONFIG=\"\"\n\tfi\nfi[]dnl\n])# PKG_PROG_PKG_CONFIG\n\n# PKG_CHECK_EXISTS(MODULES, [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])\n#\n# Check to see whether a particular set of modules exists.  Similar\n# to PKG_CHECK_MODULES(), but does not set variables or print errors.\n#\n# Please remember that m4 expands AC_REQUIRE([PKG_PROG_PKG_CONFIG])\n# only at the first occurence in configure.ac, so if the first place\n# it's called might be skipped (such as if it is within an \"if\", you\n# have to call PKG_CHECK_EXISTS manually\n# --------------------------------------------------------------\nAC_DEFUN([PKG_CHECK_EXISTS],\n[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl\nif test -n \"$PKG_CONFIG\" && \\\n    AC_RUN_LOG([$PKG_CONFIG --exists --print-errors \"$1\"]); then\n  m4_default([$2], [:])\nm4_ifvaln([$3], [else\n  $3])dnl\nfi])\n\n# _PKG_CONFIG([VARIABLE], [COMMAND], [MODULES])\n# ---------------------------------------------\nm4_define([_PKG_CONFIG],\n[if test -n \"$$1\"; then\n    pkg_cv_[]$1=\"$$1\"\n elif test -n \"$PKG_CONFIG\"; then\n    PKG_CHECK_EXISTS([$3],\n                     [pkg_cv_[]$1=`$PKG_CONFIG --[]$2 \"$3\" 2>/dev/null`\n\t\t      test \"x$?\" != \"x0\" && pkg_failed=yes ],\n\t\t     [pkg_failed=yes])\n else\n    pkg_failed=untried\nfi[]dnl\n])# _PKG_CONFIG\n\n# _PKG_SHORT_ERRORS_SUPPORTED\n# -----------------------------\nAC_DEFUN([_PKG_SHORT_ERRORS_SUPPORTED],\n[AC_REQUIRE([PKG_PROG_PKG_CONFIG])\nif $PKG_CONFIG --atleast-pkgconfig-version 0.20; then\n        _pkg_short_errors_supported=yes\nelse\n        _pkg_short_errors_supported=no\nfi[]dnl\n])# _PKG_SHORT_ERRORS_SUPPORTED\n\n\n# PKG_CHECK_MODULES(VARIABLE-PREFIX, MODULES, [ACTION-IF-FOUND],\n# [ACTION-IF-NOT-FOUND])\n#\n#\n# Note that if there is a possibility the first call to\n# PKG_CHECK_MODULES might not happen, you should be sure to include an\n# explicit call to PKG_PROG_PKG_CONFIG in your configure.ac\n#\n#\n# --------------------------------------------------------------\nAC_DEFUN([PKG_CHECK_MODULES],\n[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl\nAC_ARG_VAR([$1][_CFLAGS], [C compiler flags for $1, overriding pkg-config])dnl\nAC_ARG_VAR([$1][_LIBS], [linker flags for $1, overriding pkg-config])dnl\n\npkg_failed=no\nAC_MSG_CHECKING([for $1])\n\n_PKG_CONFIG([$1][_CFLAGS], [cflags], [$2])\n_PKG_CONFIG([$1][_LIBS], [libs], [$2])\n\nm4_define([_PKG_TEXT], [Alternatively, you may set the environment variables $1[]_CFLAGS\nand $1[]_LIBS to avoid the need to call pkg-config.\nSee the pkg-config man page for more details.])\n\nif test $pkg_failed = yes; then\n   \tAC_MSG_RESULT([no])\n        _PKG_SHORT_ERRORS_SUPPORTED\n        if test $_pkg_short_errors_supported = yes; then\n\t        $1[]_PKG_ERRORS=`$PKG_CONFIG --short-errors --print-errors --cflags --libs \"$2\" 2>&1`\n        else \n\t        $1[]_PKG_ERRORS=`$PKG_CONFIG --print-errors --cflags --libs \"$2\" 2>&1`\n        fi\n\t# Put the nasty error message in config.log where it belongs\n\techo \"$$1[]_PKG_ERRORS\" >&AS_MESSAGE_LOG_FD\n\n\tm4_default([$4], [AC_MSG_ERROR(\n[Package requirements ($2) were not met:\n\n$$1_PKG_ERRORS\n\nConsider adjusting the PKG_CONFIG_PATH environment variable if you\ninstalled software in a non-standard prefix.\n\n_PKG_TEXT])[]dnl\n        ])\nelif test $pkg_failed = untried; then\n     \tAC_MSG_RESULT([no])\n\tm4_default([$4], [AC_MSG_FAILURE(\n[The pkg-config script could not be found or is too old.  Make sure it\nis in your PATH or set the PKG_CONFIG environment variable to the full\npath to pkg-config.\n\n_PKG_TEXT\n\nTo get pkg-config, see <http://pkg-config.freedesktop.org/>.])[]dnl\n        ])\nelse\n\t$1[]_CFLAGS=$pkg_cv_[]$1[]_CFLAGS\n\t$1[]_LIBS=$pkg_cv_[]$1[]_LIBS\n        AC_MSG_RESULT([yes])\n\t$3\nfi[]dnl\n])# PKG_CHECK_MODULES\n\n\n# PKG_INSTALLDIR(DIRECTORY)\n# -------------------------\n# Substitutes the variable pkgconfigdir as the location where a module\n# should install pkg-config .pc files. By default the directory is\n# $libdir/pkgconfig, but the default can be changed by passing\n# DIRECTORY. The user can override through the --with-pkgconfigdir\n# parameter.\nAC_DEFUN([PKG_INSTALLDIR],\n[m4_pushdef([pkg_default], [m4_default([$1], ['${libdir}/pkgconfig'])])\nm4_pushdef([pkg_description],\n    [pkg-config installation directory @<:@]pkg_default[@:>@])\nAC_ARG_WITH([pkgconfigdir],\n    [AS_HELP_STRING([--with-pkgconfigdir], pkg_description)],,\n    [with_pkgconfigdir=]pkg_default)\nAC_SUBST([pkgconfigdir], [$with_pkgconfigdir])\nm4_popdef([pkg_default])\nm4_popdef([pkg_description])\n]) dnl PKG_INSTALLDIR\n\n\n# PKG_NOARCH_INSTALLDIR(DIRECTORY)\n# -------------------------\n# Substitutes the variable noarch_pkgconfigdir as the location where a\n# module should install arch-independent pkg-config .pc files. By\n# default the directory is $datadir/pkgconfig, but the default can be\n# changed by passing DIRECTORY. The user can override through the\n# --with-noarch-pkgconfigdir parameter.\nAC_DEFUN([PKG_NOARCH_INSTALLDIR],\n[m4_pushdef([pkg_default], [m4_default([$1], ['${datadir}/pkgconfig'])])\nm4_pushdef([pkg_description],\n    [pkg-config arch-independent installation directory @<:@]pkg_default[@:>@])\nAC_ARG_WITH([noarch-pkgconfigdir],\n    [AS_HELP_STRING([--with-noarch-pkgconfigdir], pkg_description)],,\n    [with_noarch_pkgconfigdir=]pkg_default)\nAC_SUBST([noarch_pkgconfigdir], [$with_noarch_pkgconfigdir])\nm4_popdef([pkg_default])\nm4_popdef([pkg_description])\n]) dnl PKG_NOARCH_INSTALLDIR\n\n\n# PKG_CHECK_VAR(VARIABLE, MODULE, CONFIG-VARIABLE,\n# [ACTION-IF-FOUND], [ACTION-IF-NOT-FOUND])\n# -------------------------------------------\n# Retrieves the value of the pkg-config variable for the given module.\nAC_DEFUN([PKG_CHECK_VAR],\n[AC_REQUIRE([PKG_PROG_PKG_CONFIG])dnl\nAC_ARG_VAR([$1], [value of $3 for $2, overriding pkg-config])dnl\n\n_PKG_CONFIG([$1], [variable=\"][$3][\"], [$2])\nAS_VAR_COPY([$1], [pkg_cv_][$1])\n\nAS_VAR_IF([$1], [\"\"], [$5], [$4])dnl\n])# PKG_CHECK_VAR\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/packaging/nuget/package.bat",
    "content": "@ECHO OFF\nECHO Started nuget packaging build.\nECHO.\nREM http://www.nuget.org/packages/gsl\ngsl -q -script:package.gsl package.config\nECHO.\nREM http://nuget.codeplex.com/releases\nnuget pack package.nuspec -verbosity detailed\nECHO.\nECHO NOTE: Ignore warnings not applicable to native code: \"Issue: Assembly outside lib folder.\"\nECHO.\nECHO Completed nuget packaging build. The package is in the following folder:\nCD"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/packaging/nuget/package.config",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!-- These values are populated into the package.gsl templates by package.bat. -->\n<!-- The target attribute controls path and file name only, id controls package naming. -->\n<package id=\"libsodium_vc120\" target=\"libsodium\" version = \"1.0.3.0\" pathversion=\"1_0_3_0\" platformtoolset=\"v120\" />\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/packaging/nuget/package.gsl",
    "content": ".#  Generate NuGet nuspec file (for subsequent packing).\n.#\n.#  This is a code generator built using the iMatix GSL code generation\n.#  language. See https://github.com/imatix/gsl for details. This script\n.#  is licensed under MIT/X11.\n.#\n.echo \"Generating package.nuspec from template.\"\n.output \"package.nuspec\"\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n#################################################################\n#   GENERATED SOURCE CODE, DO NOT EDIT EXCEPT EXPERIMENTALLY    #\n#################################################################\n-->\n<package xmlns=\"http://schemas.microsoft.com/packaging/2013/01/nuspec.xsd\">\n    <metadata minClientVersion=\"2.5\">\n        <id>$(package.id)</id>\n        <version>$(package.version)</version>\n        <title>$(package.id)</title>\n        <authors>libsodium contributors</authors>\n        <owners>Eric Voskuil</owners>\n        <licenseUrl>https://raw.github.com/jedisct1/libsodium/master/LICENSE</licenseUrl>\n        <projectUrl>https://github.com/jedisct1/libsodium</projectUrl>\n        <iconUrl>http://upload.wikimedia.org/wikipedia/commons/thumb/7/78/Salt_shaker_on_white_background.jpg/220px-Salt_shaker_on_white_background.jpg</iconUrl>\n        <requireLicenseAcceptance>true</requireLicenseAcceptance>\n        <developmentDependency>false</developmentDependency>\n        <description>Sodium is a portable, cross-compilable, installable, packageable fork of NaCl (based on the latest released upstream version nacl-20110221), with a compatible API.</description>\n        <summary>Portable fork of NaCl, packaged for Visual Studio 2013 (v120) and CTP_Nov2013 compilers.</summary>\n        <releaseNotes>https://raw.github.com/jedisct1/libsodium/master/ChangeLog</releaseNotes>\n        <copyright>(c) 2013-2014, Frank Denis (attribution required)</copyright>\n        <tags>native, NaCl, salt, sodium, libodium, C++</tags>\n        <dependencies>\n.for dependency\n            <dependency id=\"$(id)\" version=\"$(version)\" />\n.endfor\n        </dependencies>        \n        <!-- Salt shaker icon by Dubravko Soric :\n        http://upload.wikimedia.org/wikipedia/commons/thumb/7/78/Salt_shaker_on_white_background.jpg/220px-Salt_shaker_on_white_background.jpg -->\n    </metadata>\n    <files>\n        <!-- include -->\n                \n        <file src=\"..\\\\..\\\\src\\\\libsodium\\\\include\\\\sodium.h\" target=\"build\\\\native\\\\include\" />\n        <file src=\"..\\\\..\\\\src\\\\libsodium\\\\include\\\\sodium\\\\*.*\" target=\"build\\\\native\\\\include\\\\sodium\" />    \n\n        <!-- targets -->\n      \n        <file src=\"package.targets\" target=\"build\\\\native\\\\$(package.id).targets\" />\n        <file src=\"package.xml\" target=\"build\\\\native\\\\package.xml\" />\n                \n        <!-- libraries -->\n\n        <!-- x86 Dynamic libraries (.dll) -->\n        <file src=\"..\\\\..\\\\bin\\\\Win32\\\\Release\\\\$(package.platformtoolset)\\\\dynamic\\\\$(package.target).dll\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x86-$(package.platformtoolset)-mt-$(package.pathversion).dll\" />\n        <file src=\"..\\\\..\\\\bin\\\\Win32\\\\Debug\\\\$(package.platformtoolset)\\\\dynamic\\\\$(package.target).dll\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x86-$(package.platformtoolset)-mt-gd-$(package.pathversion).dll\" />\n\n        <!-- x86 Debugging symbols (.pdb) -->\n        <!--<file src=\"..\\\\..\\\\bin\\\\Win32\\\\Release\\\\$(package.platformtoolset)\\\\dynamic\\\\$(package.target).pdb\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x86-$(package.platformtoolset)-mt-$(package.pathversion).pdb\" />-->\n        <file src=\"..\\\\..\\\\bin\\\\Win32\\\\Debug\\\\$(package.platformtoolset)\\\\dynamic\\\\$(package.target).pdb\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x86-$(package.platformtoolset)-mt-gd-$(package.pathversion).pdb\" />\n\n        <!-- x86 Import libraries (.imp.lib) -->\n        <file src=\"..\\\\..\\\\bin\\\\Win32\\\\Release\\\\$(package.platformtoolset)\\\\dynamic\\\\$(package.target).lib\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x86-$(package.platformtoolset)-mt-$(package.pathversion).imp.lib\" />\n        <file src=\"..\\\\..\\\\bin\\\\Win32\\\\Debug\\\\$(package.platformtoolset)\\\\dynamic\\\\$(package.target).lib\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x86-$(package.platformtoolset)-mt-gd-$(package.pathversion).imp.lib\" />\n\n        <!-- x86 Export libraries (.exp) -->\n        <file src=\"..\\\\..\\\\bin\\\\Win32\\\\Release\\\\$(package.platformtoolset)\\\\dynamic\\\\$(package.target).exp\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x86-$(package.platformtoolset)-mt-$(package.pathversion).exp\" />\n        <file src=\"..\\\\..\\\\bin\\\\Win32\\\\Debug\\\\$(package.platformtoolset)\\\\dynamic\\\\$(package.target).exp\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x86-$(package.platformtoolset)-mt-gd-$(package.pathversion).exp\" />\n\n        <!-- x86 Static libraries (.lib) -->\n        <file src=\"..\\\\..\\\\bin\\\\Win32\\\\Release\\\\$(package.platformtoolset)\\\\static\\\\$(package.target).lib\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x86-$(package.platformtoolset)-mt-s-$(package.pathversion).lib\" />\n        <file src=\"..\\\\..\\\\bin\\\\Win32\\\\Debug\\\\$(package.platformtoolset)\\\\static\\\\$(package.target).lib\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x86-$(package.platformtoolset)-mt-sgd-$(package.pathversion).lib\" />\n\n        <!-- x86 Static link time code generation libraries (.ltcg.lib) -->\n        <file src=\"..\\\\..\\\\bin\\\\Win32\\\\Release\\\\$(package.platformtoolset)\\\\ltcg\\\\$(package.target).lib\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x86-$(package.platformtoolset)-mt-s-$(package.pathversion).ltcg.lib\" />\n        <file src=\"..\\\\..\\\\bin\\\\Win32\\\\Debug\\\\$(package.platformtoolset)\\\\ltcg\\\\$(package.target).lib\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x86-$(package.platformtoolset)-mt-sgd-$(package.pathversion).ltcg.lib\" />\n\n        <!-- x64 Dynamic libraries (.dll) -->\n        <file src=\"..\\\\..\\\\bin\\\\x64\\\\Release\\\\$(package.platformtoolset)\\\\dynamic\\\\$(package.target).dll\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x64-$(package.platformtoolset)-mt-$(package.pathversion).dll\" />\n        <file src=\"..\\\\..\\\\bin\\\\x64\\\\Debug\\\\$(package.platformtoolset)\\\\dynamic\\\\$(package.target).dll\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x64-$(package.platformtoolset)-mt-gd-$(package.pathversion).dll\" />\n\n        <!-- x64 Debugging symbols (.pdb) -->\n        <!--<file src=\"..\\\\..\\\\bin\\\\x64\\\\Release\\\\$(package.platformtoolset)\\\\dynamic\\\\$(package.target).pdb\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x64-$(package.platformtoolset)-mt-$(package.pathversion).pdb\" />-->\n        <file src=\"..\\\\..\\\\bin\\\\x64\\\\Debug\\\\$(package.platformtoolset)\\\\dynamic\\\\$(package.target).pdb\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x64-$(package.platformtoolset)-mt-gd-$(package.pathversion).pdb\" />\n\n        <!-- x64 Import libraries (.imp.lib) -->\n        <file src=\"..\\\\..\\\\bin\\\\x64\\\\Release\\\\$(package.platformtoolset)\\\\dynamic\\\\$(package.target).lib\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x64-$(package.platformtoolset)-mt-$(package.pathversion).imp.lib\" />\n        <file src=\"..\\\\..\\\\bin\\\\x64\\\\Debug\\\\$(package.platformtoolset)\\\\dynamic\\\\$(package.target).lib\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x64-$(package.platformtoolset)-mt-gd-$(package.pathversion).imp.lib\" />\n\n        <!-- x64 Export libraries (.exp) -->\n        <file src=\"..\\\\..\\\\bin\\\\x64\\\\Release\\\\$(package.platformtoolset)\\\\dynamic\\\\$(package.target).exp\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x64-$(package.platformtoolset)-mt-$(package.pathversion).exp\" />\n        <file src=\"..\\\\..\\\\bin\\\\x64\\\\Debug\\\\$(package.platformtoolset)\\\\dynamic\\\\$(package.target).exp\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x64-$(package.platformtoolset)-mt-gd-$(package.pathversion).exp\" />\n\n        <!-- x64 Static libraries (.lib) -->\n        <file src=\"..\\\\..\\\\bin\\\\x64\\\\Release\\\\$(package.platformtoolset)\\\\static\\\\$(package.target).lib\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x64-$(package.platformtoolset)-mt-s-$(package.pathversion).lib\" />\n        <file src=\"..\\\\..\\\\bin\\\\x64\\\\Debug\\\\$(package.platformtoolset)\\\\static\\\\$(package.target).lib\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x64-$(package.platformtoolset)-mt-sgd-$(package.pathversion).lib\" />\n\n        <!-- x64 Static link time code generation libraries (.ltcg.lib) -->\n        <file src=\"..\\\\..\\\\bin\\\\x64\\\\Release\\\\$(package.platformtoolset)\\\\ltcg\\\\$(package.target).lib\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x64-$(package.platformtoolset)-mt-s-$(package.pathversion).ltcg.lib\" />\n        <file src=\"..\\\\..\\\\bin\\\\x64\\\\Debug\\\\$(package.platformtoolset)\\\\ltcg\\\\$(package.target).lib\" target=\"build\\\\native\\\\bin\\\\$(package.target)-x64-$(package.platformtoolset)-mt-sgd-$(package.pathversion).ltcg.lib\" />\n    </files>\n<!--\n#################################################################\n#   GENERATED SOURCE CODE, DO NOT EDIT EXCEPT EXPERIMENTALLY    #\n#################################################################\n-->\n</package>\n.echo \"Generating package.targets from template.\"\n.output \"package.targets\"\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n#################################################################\n#   GENERATED SOURCE CODE, DO NOT EDIT EXCEPT EXPERIMENTALLY    #\n#################################################################\n-->\n<Project ToolsVersion=\"4.0\" xmlns=\"http://schemas.microsoft.com/developer/msbuild/2003\">\n\n  <!-- user interface -->\n  <ItemGroup>\n    <PropertyPageSchema Include=\"$\\(MSBuildThisFileDirectory)package.xml\" />\n  </ItemGroup>\n\n  <!-- general -->\n  <ItemDefinitionGroup>\n    <ClCompile>\n      <AdditionalIncludeDirectories>$\\(MSBuildThisFileDirectory)include\\\\;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>\n    </ClCompile>\n    <Link>\n      <AdditionalDependencies>advapi32.lib;crypt32.lib;%(AdditionalDependencies)</AdditionalDependencies>\n      <AdditionalLibraryDirectories>$\\(MSBuildThisFileDirectory)bin\\\\;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$\\(Linkage-$(package.target))' == 'static' Or '$\\(Linkage-$(package.target))' == 'ltcg'\">\n    <ClCompile>\n      <PreprocessorDefinitions>SODIUM_STATIC;%(PreprocessorDefinitions)</PreprocessorDefinitions>\n    </ClCompile>\n  </ItemDefinitionGroup>\n\n  <!-- static libraries -->\n  <ItemDefinitionGroup Condition=\"'$\\(Platform)' == 'Win32' And ('$\\(PlatformToolset)' == '$(package.platformtoolset)' Or '$\\(PlatformToolset)' == 'CTP_Nov2013') And '$\\(Linkage-$(package.target))' == 'static' And $\\(Configuration.IndexOf('Release')) != -1\">\n    <Link>\n      <AdditionalDependencies>$(package.target)-x86-$(package.platformtoolset)-mt-s-$(package.pathversion).lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$\\(Platform)' == 'Win32' And ('$\\(PlatformToolset)' == '$(package.platformtoolset)' Or '$\\(PlatformToolset)' == 'CTP_Nov2013') And '$\\(Linkage-$(package.target))' == 'static' And $\\(Configuration.IndexOf('Debug')) != -1\">\n    <Link>\n      <AdditionalDependencies>$(package.target)-x86-$(package.platformtoolset)-mt-sgd-$(package.pathversion).lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$\\(Platform)' == 'x64' And ('$\\(PlatformToolset)' == '$(package.platformtoolset)' Or '$\\(PlatformToolset)' == 'CTP_Nov2013') And '$\\(Linkage-$(package.target))' == 'static' And $\\(Configuration.IndexOf('Release')) != -1\">\n    <Link>\n      <AdditionalDependencies>$(package.target)-x64-$(package.platformtoolset)-mt-s-$(package.pathversion).lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$\\(Platform)' == 'x64' And ('$\\(PlatformToolset)' == '$(package.platformtoolset)' Or '$\\(PlatformToolset)' == 'CTP_Nov2013') And '$\\(Linkage-$(package.target))' == 'static' And $\\(Configuration.IndexOf('Debug')) != -1\">\n    <Link>\n      <AdditionalDependencies>$(package.target)-x64-$(package.platformtoolset)-mt-sgd-$(package.pathversion).lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n\n  <!-- static ltcg libraries -->\n  <ItemDefinitionGroup Condition=\"'$\\(Platform)' == 'Win32' And ('$\\(PlatformToolset)' == '$(package.platformtoolset)' Or '$\\(PlatformToolset)' == 'CTP_Nov2013') And '$\\(Linkage-$(package.target))' == 'ltcg' And $\\(Configuration.IndexOf('Release')) != -1\">\n    <Link>\n      <AdditionalDependencies>$(package.target)-x86-$(package.platformtoolset)-mt-s-$(package.pathversion).ltcg.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$\\(Platform)' == 'Win32' And ('$\\(PlatformToolset)' == '$(package.platformtoolset)' Or '$\\(PlatformToolset)' == 'CTP_Nov2013') And '$\\(Linkage-$(package.target))' == 'ltcg' And $\\(Configuration.IndexOf('Debug')) != -1\">\n    <Link>\n      <AdditionalDependencies>$(package.target)-x86-$(package.platformtoolset)-mt-sgd-$(package.pathversion).ltcg.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$\\(Platform)' == 'x64' And ('$\\(PlatformToolset)' == '$(package.platformtoolset)' Or '$\\(PlatformToolset)' == 'CTP_Nov2013') And '$\\(Linkage-$(package.target))' == 'ltcg' And $\\(Configuration.IndexOf('Release')) != -1\">\n    <Link>\n      <AdditionalDependencies>$(package.target)-x64-$(package.platformtoolset)-mt-s-$(package.pathversion).ltcg.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$\\(Platform)' == 'x64' And ('$\\(PlatformToolset)' == '$(package.platformtoolset)' Or '$\\(PlatformToolset)' == 'CTP_Nov2013') And '$\\(Linkage-$(package.target))' == 'ltcg' And $\\(Configuration.IndexOf('Debug')) != -1\">\n    <Link>\n      <AdditionalDependencies>$(package.target)-x64-$(package.platformtoolset)-mt-sgd-$(package.pathversion).ltcg.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  \n  <!-- dynamic import libraries -->\n  <ItemDefinitionGroup Condition=\"'$\\(Platform)' == 'Win32' And ('$\\(PlatformToolset)' == '$(package.platformtoolset)' Or '$\\(PlatformToolset)' == 'CTP_Nov2013') And '$\\(Linkage-$(package.target))' == 'dynamic' And $\\(Configuration.IndexOf('Release')) != -1\">\n    <Link>\n      <AdditionalDependencies>$(package.target)-x86-$(package.platformtoolset)-mt-$(package.pathversion).imp.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$\\(Platform)' == 'Win32' And ('$\\(PlatformToolset)' == '$(package.platformtoolset)' Or '$\\(PlatformToolset)' == 'CTP_Nov2013') And '$\\(Linkage-$(package.target))' == 'dynamic' And $\\(Configuration.IndexOf('Debug')) != -1\">\n    <Link>\n      <AdditionalDependencies>$(package.target)-x86-$(package.platformtoolset)-mt-gd-$(package.pathversion).imp.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$\\(Platform)' == 'x64' And ('$\\(PlatformToolset)' == '$(package.platformtoolset)' Or '$\\(PlatformToolset)' == 'CTP_Nov2013') And '$\\(Linkage-$(package.target))' == 'dynamic' And $\\(Configuration.IndexOf('Release')) != -1\">\n    <Link>\n      <AdditionalDependencies>$(package.target)-x64-$(package.platformtoolset)-mt-$(package.pathversion).imp.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n  <ItemDefinitionGroup Condition=\"'$\\(Platform)' == 'x64' And ('$\\(PlatformToolset)' == '$(package.platformtoolset)' Or '$\\(PlatformToolset)' == 'CTP_Nov2013') And '$\\(Linkage-$(package.target))' == 'dynamic' And $\\(Configuration.IndexOf('Debug')) != -1\">\n    <Link>\n      <AdditionalDependencies>$(package.target)-x64-$(package.platformtoolset)-mt-gd-$(package.pathversion).imp.lib;%(AdditionalDependencies)</AdditionalDependencies>\n    </Link>\n  </ItemDefinitionGroup>\n\n  <!-- dynamic libraries with debug symbols -->\n  <Target Name=\"$(package.target)_AfterBuild\" AfterTargets=\"AfterBuild\" />\n  <Target Name=\"$(package.target)_AfterBuild_Win32_$(package.platformtoolset)_Dynamic_Release\"\n          Condition=\"'$\\(Platform)' == 'Win32' And ('$\\(PlatformToolset)' == '$(package.platformtoolset)' Or '$\\(PlatformToolset)' == 'CTP_Nov2013') And '$\\(Linkage-$(package.target))' == 'dynamic' And $\\(Configuration.IndexOf('Release')) != -1\"\n          AfterTargets=\"$(package.target)_AfterBuild\">\n    <Copy SourceFiles=\"$\\(MSBuildThisFileDirectory)bin\\\\$(package.target)-x86-$(package.platformtoolset)-mt-$(package.pathversion).dll\" DestinationFiles=\"$\\(TargetDir)$(package.target).dll\" SkipUnchangedFiles=\"true\" />\n    <!--<Copy SourceFiles=\"$\\(MSBuildThisFileDirectory)bin\\\\$(package.target)-x86-$(package.platformtoolset)-mt-$(package.pathversion).pdb\" DestinationFiles=\"$\\(TargetDir)$(package.target).pdb\" SkipUnchangedFiles=\"true\" />-->\n  </Target>\n  <Target Name=\"$(package.target)_AfterBuild_Win32_$(package.platformtoolset)_Dynamic_Debug\"\n          Condition=\"'$\\(Platform)' == 'Win32' And ('$\\(PlatformToolset)' == '$(package.platformtoolset)' Or '$\\(PlatformToolset)' == 'CTP_Nov2013') And '$\\(Linkage-$(package.target))' == 'dynamic' And $\\(Configuration.IndexOf('Debug')) != -1\"\n          AfterTargets=\"$(package.target)_AfterBuild\">\n    <Copy SourceFiles=\"$\\(MSBuildThisFileDirectory)bin\\\\$(package.target)-x86-$(package.platformtoolset)-mt-gd-$(package.pathversion).dll\" DestinationFiles=\"$\\(TargetDir)$(package.target).dll\" SkipUnchangedFiles=\"true\" />\n    <Copy SourceFiles=\"$\\(MSBuildThisFileDirectory)bin\\\\$(package.target)-x86-$(package.platformtoolset)-mt-gd-$(package.pathversion).pdb\" DestinationFiles=\"$\\(TargetDir)$(package.target).pdb\" SkipUnchangedFiles=\"true\" />\n  </Target>\n  <Target Name=\"$(package.target)_AfterBuild_x64_$(package.platformtoolset)_Dynamic_Release\"\n          Condition=\"'$\\(Platform)' == 'x64' And ('$\\(PlatformToolset)' == '$(package.platformtoolset)' Or '$\\(PlatformToolset)' == 'CTP_Nov2013') And '$\\(Linkage-$(package.target))' == 'dynamic' And $\\(Configuration.IndexOf('Release')) != -1\"\n          AfterTargets=\"$(package.target)_AfterBuild\">\n    <Copy SourceFiles=\"$\\(MSBuildThisFileDirectory)bin\\\\$(package.target)-x64-$(package.platformtoolset)-mt-$(package.pathversion).dll\" DestinationFiles=\"$\\(TargetDir)$(package.target).dll\" SkipUnchangedFiles=\"true\" />\n    <!--<Copy SourceFiles=\"$\\(MSBuildThisFileDirectory)bin\\\\$(package.target)-x64-$(package.platformtoolset)-mt-$(package.pathversion).pdb\" DestinationFiles=\"$\\(TargetDir)$(package.target).pdb\" SkipUnchangedFiles=\"true\" />-->\n  </Target>\n  <Target Name=\"$(package.target)_AfterBuild_x64_$(package.platformtoolset)_Dynamic_Debug\"\n          Condition=\"'$\\(Platform)' == 'x64' And ('$\\(PlatformToolset)' == '$(package.platformtoolset)' Or '$\\(PlatformToolset)' == 'CTP_Nov2013') And '$\\(Linkage-$(package.target))' == 'dynamic' And $\\(Configuration.IndexOf('Debug')) != -1\"\n          AfterTargets=\"$(package.target)_AfterBuild\">\n    <Copy SourceFiles=\"$\\(MSBuildThisFileDirectory)bin\\\\$(package.target)-x64-$(package.platformtoolset)-mt-gd-$(package.pathversion).dll\" DestinationFiles=\"$\\(TargetDir)$(package.target).dll\" SkipUnchangedFiles=\"true\" />\n    <Copy SourceFiles=\"$\\(MSBuildThisFileDirectory)bin\\\\$(package.target)-x64-$(package.platformtoolset)-mt-gd-$(package.pathversion).pdb\" DestinationFiles=\"$\\(TargetDir)$(package.target).pdb\" SkipUnchangedFiles=\"true\" />\n  </Target>\n\n<!--\n#################################################################\n#   GENERATED SOURCE CODE, DO NOT EDIT EXCEPT EXPERIMENTALLY    #\n#################################################################\n-->\n</Project>\n.echo \"Generating package.xml (ui extension) from template.\"\n.output \"package.xml\"\n<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n#################################################################\n#   GENERATED SOURCE CODE, DO NOT EDIT EXCEPT EXPERIMENTALLY    #\n#################################################################\n-->\n<ProjectSchemaDefinitions xmlns=\"clr-namespace:Microsoft.Build.Framework.XamlTypes;assembly=Microsoft.Build.Framework\">\n  <Rule Name=\"Linkage-$(package.target)-uiextension\" PageTemplate=\"tool\" DisplayName=\"NuGet Dependencies\" SwitchPrefix=\"/\" Order=\"1\">\n    <Rule.Categories>\n      <Category Name=\"$(package.target)\" DisplayName=\"$(package.target)\" />\n    </Rule.Categories>\n    <Rule.DataSource>\n      <DataSource Persistence=\"ProjectFile\" ItemType=\"\" />\n    </Rule.DataSource>\n    <EnumProperty Name=\"Linkage-$(package.target)\" DisplayName=\"Linkage\" Description=\"How NuGet $(package.target) will be linked into the output of this project\" Category=\"$(package.target)\">\n      <EnumValue Name=\"\" DisplayName=\"Not linked\" />\n      <EnumValue Name=\"dynamic\" DisplayName=\"Dynamic (DLL)\" />\n      <EnumValue Name=\"static\" DisplayName=\"Static (LIB)\" />\n      <EnumValue Name=\"ltcg\" DisplayName=\"Static using link time compile generation (LTCG)\" />\n    </EnumProperty>\n  </Rule>\n</ProjectSchemaDefinitions>"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/Makefile.am",
    "content": "\nSUBDIRS = \\\n\tlibsodium\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/Makefile.in",
    "content": "# Makefile.in generated by automake 1.14.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2013 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\nVPATH = @srcdir@\nam__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\nsubdir = src\nDIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \\\n\t$(top_srcdir)/m4/ax_check_define.m4 \\\n\t$(top_srcdir)/m4/ax_check_link_flag.m4 \\\n\t$(top_srcdir)/m4/ld-output-def.m4 $(top_srcdir)/m4/libtool.m4 \\\n\t$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \\\n\t$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \\\n\t$(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nmkinstalldirs = $(install_sh) -d\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nSOURCES =\nDIST_SOURCES =\nRECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \\\n\tctags-recursive dvi-recursive html-recursive info-recursive \\\n\tinstall-data-recursive install-dvi-recursive \\\n\tinstall-exec-recursive install-html-recursive \\\n\tinstall-info-recursive install-pdf-recursive \\\n\tinstall-ps-recursive install-recursive installcheck-recursive \\\n\tinstalldirs-recursive pdf-recursive ps-recursive \\\n\ttags-recursive uninstall-recursive\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nRECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive\t\\\n  distclean-recursive maintainer-clean-recursive\nam__recursive_targets = \\\n  $(RECURSIVE_TARGETS) \\\n  $(RECURSIVE_CLEAN_TARGETS) \\\n  $(am__extra_recursive_targets)\nAM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \\\n\tdistdir\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nDIST_SUBDIRS = $(SUBDIRS)\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nam__relativize = \\\n  dir0=`pwd`; \\\n  sed_first='s,^\\([^/]*\\)/.*$$,\\1,'; \\\n  sed_rest='s,^[^/]*/*,,'; \\\n  sed_last='s,^.*/\\([^/]*\\)$$,\\1,'; \\\n  sed_butlast='s,/*[^/]*$$,,'; \\\n  while test -n \"$$dir1\"; do \\\n    first=`echo \"$$dir1\" | sed -e \"$$sed_first\"`; \\\n    if test \"$$first\" != \".\"; then \\\n      if test \"$$first\" = \"..\"; then \\\n        dir2=`echo \"$$dir0\" | sed -e \"$$sed_last\"`/\"$$dir2\"; \\\n        dir0=`echo \"$$dir0\" | sed -e \"$$sed_butlast\"`; \\\n      else \\\n        first2=`echo \"$$dir2\" | sed -e \"$$sed_first\"`; \\\n        if test \"$$first2\" = \"$$first\"; then \\\n          dir2=`echo \"$$dir2\" | sed -e \"$$sed_rest\"`; \\\n        else \\\n          dir2=\"../$$dir2\"; \\\n        fi; \\\n        dir0=\"$$dir0\"/\"$$first\"; \\\n      fi; \\\n    fi; \\\n    dir1=`echo \"$$dir1\" | sed -e \"$$sed_rest\"`; \\\n  done; \\\n  reldir=\"$$dir2\"\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAR = @AR@\nAS = @AS@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCAS = @CCAS@\nCCASDEPMODE = @CCASDEPMODE@\nCCASFLAGS = @CCASFLAGS@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCFLAGS_AESNI = @CFLAGS_AESNI@\nCFLAGS_MMX = @CFLAGS_MMX@\nCFLAGS_PCLMUL = @CFLAGS_PCLMUL@\nCFLAGS_SSE2 = @CFLAGS_SSE2@\nCFLAGS_SSE3 = @CFLAGS_SSE3@\nCFLAGS_SSE41 = @CFLAGS_SSE41@\nCFLAGS_SSSE3 = @CFLAGS_SSSE3@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCWFLAGS = @CWFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDLLTOOL = @DLLTOOL@\nDLL_VERSION = @DLL_VERSION@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nHAVE_AMD64_ASM_V = @HAVE_AMD64_ASM_V@\nHAVE_AVX_ASM_V = @HAVE_AVX_ASM_V@\nHAVE_CPUID_V = @HAVE_CPUID_V@\nHAVE_TI_MODE_V = @HAVE_TI_MODE_V@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nISODATE = @ISODATE@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIBTOOL_DEPS = @LIBTOOL_DEPS@\nLIBTOOL_EXTRA_FLAGS = @LIBTOOL_EXTRA_FLAGS@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMANIFEST_TOOL = @MANIFEST_TOOL@\nMKDIR_P = @MKDIR_P@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nSAFECODE_HOME = @SAFECODE_HOME@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSODIUM_LIBRARY_VERSION = @SODIUM_LIBRARY_VERSION@\nSODIUM_LIBRARY_VERSION_MAJOR = @SODIUM_LIBRARY_VERSION_MAJOR@\nSODIUM_LIBRARY_VERSION_MINOR = @SODIUM_LIBRARY_VERSION_MINOR@\nSTRIP = @STRIP@\nTEST_LDFLAGS = @TEST_LDFLAGS@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_AR = @ac_ct_AR@\nac_ct_CC = @ac_ct_CC@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nSUBDIRS = \\\n\tlibsodium\n\nall: all-recursive\n\n.SUFFIXES:\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign src/Makefile\n.PRECIOUS: Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\n\n# This directory's subdirectories are mostly independent; you can cd\n# into them and run 'make' without going through this Makefile.\n# To change the values of 'make' variables: instead of editing Makefiles,\n# (1) if the variable is set in 'config.status', edit 'config.status'\n#     (which will cause the Makefiles to be regenerated when you run 'make');\n# (2) otherwise, pass the desired values on the 'make' command line.\n$(am__recursive_targets):\n\t@fail=; \\\n\tif $(am__make_keepgoing); then \\\n\t  failcom='fail=yes'; \\\n\telse \\\n\t  failcom='exit 1'; \\\n\tfi; \\\n\tdot_seen=no; \\\n\ttarget=`echo $@ | sed s/-recursive//`; \\\n\tcase \"$@\" in \\\n\t  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \\\n\t  *) list='$(SUBDIRS)' ;; \\\n\tesac; \\\n\tfor subdir in $$list; do \\\n\t  echo \"Making $$target in $$subdir\"; \\\n\t  if test \"$$subdir\" = \".\"; then \\\n\t    dot_seen=yes; \\\n\t    local_target=\"$$target-am\"; \\\n\t  else \\\n\t    local_target=\"$$target\"; \\\n\t  fi; \\\n\t  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \\\n\t  || eval $$failcom; \\\n\tdone; \\\n\tif test \"$$dot_seen\" = \"no\"; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) \"$$target-am\" || exit 1; \\\n\tfi; test -z \"$$fail\"\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-recursive\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\tif ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \\\n\t  include_option=--etags-include; \\\n\t  empty_fix=.; \\\n\telse \\\n\t  include_option=--include; \\\n\t  empty_fix=; \\\n\tfi; \\\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    test ! -f $$subdir/TAGS || \\\n\t      set \"$$@\" \"$$include_option=$$here/$$subdir/TAGS\"; \\\n\t  fi; \\\n\tdone; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-recursive\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscopelist: cscopelist-recursive\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\n\t@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    $(am__make_dryrun) \\\n\t      || test -d \"$(distdir)/$$subdir\" \\\n\t      || $(MKDIR_P) \"$(distdir)/$$subdir\" \\\n\t      || exit 1; \\\n\t    dir1=$$subdir; dir2=\"$(distdir)/$$subdir\"; \\\n\t    $(am__relativize); \\\n\t    new_distdir=$$reldir; \\\n\t    dir1=$$subdir; dir2=\"$(top_distdir)\"; \\\n\t    $(am__relativize); \\\n\t    new_top_distdir=$$reldir; \\\n\t    echo \" (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=\"$$new_top_distdir\" distdir=\"$$new_distdir\" \\\\\"; \\\n\t    echo \"     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)\"; \\\n\t    ($(am__cd) $$subdir && \\\n\t      $(MAKE) $(AM_MAKEFLAGS) \\\n\t        top_distdir=\"$$new_top_distdir\" \\\n\t        distdir=\"$$new_distdir\" \\\n\t\tam__remove_distdir=: \\\n\t\tam__skip_length_check=: \\\n\t\tam__skip_mode_fix=: \\\n\t        distdir) \\\n\t      || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-recursive\nall-am: Makefile\ninstalldirs: installdirs-recursive\ninstalldirs-am:\ninstall: install-recursive\ninstall-exec: install-exec-recursive\ninstall-data: install-data-recursive\nuninstall: uninstall-recursive\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-recursive\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-recursive\n\nclean-am: clean-generic clean-libtool mostlyclean-am\n\ndistclean: distclean-recursive\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-generic distclean-tags\n\ndvi: dvi-recursive\n\ndvi-am:\n\nhtml: html-recursive\n\nhtml-am:\n\ninfo: info-recursive\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-recursive\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-recursive\n\ninstall-html-am:\n\ninstall-info: install-info-recursive\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-recursive\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-recursive\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-recursive\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-recursive\n\nmostlyclean-am: mostlyclean-generic mostlyclean-libtool\n\npdf: pdf-recursive\n\npdf-am:\n\nps: ps-recursive\n\nps-am:\n\nuninstall-am:\n\n.MAKE: $(am__recursive_targets) install-am install-strip\n\n.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \\\n\tcheck-am clean clean-generic clean-libtool cscopelist-am ctags \\\n\tctags-am distclean distclean-generic distclean-libtool \\\n\tdistclean-tags distdir dvi dvi-am html html-am info info-am \\\n\tinstall install-am install-data install-data-am install-dvi \\\n\tinstall-dvi-am install-exec install-exec-am install-html \\\n\tinstall-html-am install-info install-info-am install-man \\\n\tinstall-pdf install-pdf-am install-ps install-ps-am \\\n\tinstall-strip installcheck installcheck-am installdirs \\\n\tinstalldirs-am maintainer-clean maintainer-clean-generic \\\n\tmostlyclean mostlyclean-generic mostlyclean-libtool pdf pdf-am \\\n\tps ps-am tags tags-am uninstall uninstall-am\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/Makefile.am",
    "content": "libsodium_la_SOURCES = \\\n\tcrypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c \\\n\tcrypto_auth/crypto_auth.c \\\n\tcrypto_auth/hmacsha256/auth_hmacsha256_api.c \\\n\tcrypto_auth/hmacsha256/cp/hmac_hmacsha256.c \\\n\tcrypto_auth/hmacsha256/cp/verify_hmacsha256.c \\\n\tcrypto_auth/hmacsha512/auth_hmacsha512_api.c \\\n\tcrypto_auth/hmacsha512/cp/hmac_hmacsha512.c \\\n\tcrypto_auth/hmacsha512/cp/verify_hmacsha512.c \\\n\tcrypto_auth/hmacsha512256/auth_hmacsha512256_api.c \\\n\tcrypto_auth/hmacsha512256/cp/hmac_hmacsha512256.c \\\n\tcrypto_auth/hmacsha512256/cp/verify_hmacsha512256.c \\\n\tcrypto_box/crypto_box.c \\\n\tcrypto_box/crypto_box_easy.c \\\n\tcrypto_box/crypto_box_seal.c \\\n\tcrypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305_api.c \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/after_curve25519xsalsa20poly1305.c \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/before_curve25519xsalsa20poly1305.c \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/box_curve25519xsalsa20poly1305.c \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/keypair_curve25519xsalsa20poly1305.c \\\n\tcrypto_core/hsalsa20/ref2/core_hsalsa20.c \\\n\tcrypto_core/hsalsa20/core_hsalsa20_api.c \\\n\tcrypto_core/salsa20/ref/core_salsa20.c \\\n\tcrypto_core/salsa20/core_salsa20_api.c \\\n\tcrypto_generichash/crypto_generichash.c \\\n\tcrypto_generichash/blake2/generichash_blake2_api.c \\\n\tcrypto_generichash/blake2/ref/blake2-impl.h \\\n\tcrypto_generichash/blake2/ref/blake2.h \\\n\tcrypto_generichash/blake2/ref/blake2b-compress-ref.c \\\n\tcrypto_generichash/blake2/ref/blake2b-load-sse2.h \\\n\tcrypto_generichash/blake2/ref/blake2b-load-sse41.h \\\n\tcrypto_generichash/blake2/ref/blake2b-ref.c \\\n\tcrypto_generichash/blake2/ref/blake2b-round.h \\\n\tcrypto_generichash/blake2/ref/generichash_blake2b.c \\\n\tcrypto_hash/crypto_hash.c \\\n\tcrypto_hash/sha256/hash_sha256_api.c \\\n\tcrypto_hash/sha256/cp/hash_sha256.c \\\n\tcrypto_hash/sha512/hash_sha512_api.c \\\n\tcrypto_hash/sha512/cp/hash_sha512.c \\\n\tcrypto_onetimeauth/crypto_onetimeauth.c \\\n\tcrypto_onetimeauth/poly1305/onetimeauth_poly1305.c \\\n\tcrypto_onetimeauth/poly1305/onetimeauth_poly1305.h \\\n\tcrypto_onetimeauth/poly1305/donna/poly1305_donna.h \\\n\tcrypto_onetimeauth/poly1305/donna/poly1305_donna32.h \\\n\tcrypto_onetimeauth/poly1305/donna/poly1305_donna64.h \\\n\tcrypto_onetimeauth/poly1305/donna/poly1305_donna.c \\\n\tcrypto_pwhash/scryptsalsa208sha256/crypto_scrypt-common.c \\\n\tcrypto_pwhash/scryptsalsa208sha256/crypto_scrypt.h \\\n\tcrypto_pwhash/scryptsalsa208sha256/scrypt_platform.c \\\n\tcrypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.c \\\n\tcrypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.h \\\n\tcrypto_pwhash/scryptsalsa208sha256/pwhash_scryptsalsa208sha256.c \\\n\tcrypto_pwhash/scryptsalsa208sha256/sysendian.h \\\n\tcrypto_pwhash/scryptsalsa208sha256/nosse/pwhash_scryptsalsa208sha256_nosse.c \\\n\tcrypto_scalarmult/crypto_scalarmult.c \\\n\tcrypto_scalarmult/curve25519/scalarmult_curve25519.c \\\n\tcrypto_scalarmult/curve25519/scalarmult_curve25519.h \\\n\tcrypto_secretbox/crypto_secretbox.c \\\n\tcrypto_secretbox/crypto_secretbox_easy.c \\\n\tcrypto_secretbox/xsalsa20poly1305/secretbox_xsalsa20poly1305_api.c \\\n\tcrypto_secretbox/xsalsa20poly1305/ref/box_xsalsa20poly1305.c \\\n\tcrypto_shorthash/crypto_shorthash.c \\\n\tcrypto_shorthash/siphash24/shorthash_siphash24_api.c \\\n\tcrypto_shorthash/siphash24/ref/shorthash_siphash24.c \\\n\tcrypto_sign/crypto_sign.c \\\n\tcrypto_sign/ed25519/ref10/base.h \\\n\tcrypto_sign/ed25519/ref10/base2.h \\\n\tcrypto_sign/ed25519/sign_ed25519_api.c \\\n\tcrypto_sign/ed25519/ref10/d.h \\\n\tcrypto_sign/ed25519/ref10/d2.h \\\n\tcrypto_sign/ed25519/ref10/fe.h \\\n\tcrypto_sign/ed25519/ref10/fe_0.c \\\n\tcrypto_sign/ed25519/ref10/fe_1.c \\\n\tcrypto_sign/ed25519/ref10/fe_add.c \\\n\tcrypto_sign/ed25519/ref10/fe_cmov.c \\\n\tcrypto_sign/ed25519/ref10/fe_copy.c \\\n\tcrypto_sign/ed25519/ref10/fe_frombytes.c \\\n\tcrypto_sign/ed25519/ref10/fe_invert.c \\\n\tcrypto_sign/ed25519/ref10/fe_isnegative.c \\\n\tcrypto_sign/ed25519/ref10/fe_isnonzero.c \\\n\tcrypto_sign/ed25519/ref10/fe_mul.c \\\n\tcrypto_sign/ed25519/ref10/fe_neg.c \\\n\tcrypto_sign/ed25519/ref10/fe_pow22523.c \\\n\tcrypto_sign/ed25519/ref10/fe_sq.c \\\n\tcrypto_sign/ed25519/ref10/fe_sq2.c \\\n\tcrypto_sign/ed25519/ref10/fe_sub.c \\\n\tcrypto_sign/ed25519/ref10/fe_tobytes.c \\\n\tcrypto_sign/ed25519/ref10/ge.h \\\n\tcrypto_sign/ed25519/ref10/ge_add.c \\\n\tcrypto_sign/ed25519/ref10/ge_add.h \\\n\tcrypto_sign/ed25519/ref10/ge_double_scalarmult.c \\\n\tcrypto_sign/ed25519/ref10/ge_frombytes.c \\\n\tcrypto_sign/ed25519/ref10/ge_madd.c \\\n\tcrypto_sign/ed25519/ref10/ge_madd.h \\\n\tcrypto_sign/ed25519/ref10/ge_msub.c \\\n\tcrypto_sign/ed25519/ref10/ge_msub.h \\\n\tcrypto_sign/ed25519/ref10/ge_p1p1_to_p2.c \\\n\tcrypto_sign/ed25519/ref10/ge_p1p1_to_p3.c \\\n\tcrypto_sign/ed25519/ref10/ge_p2_0.c \\\n\tcrypto_sign/ed25519/ref10/ge_p2_dbl.c \\\n\tcrypto_sign/ed25519/ref10/ge_p2_dbl.h \\\n\tcrypto_sign/ed25519/ref10/ge_p3_0.c \\\n\tcrypto_sign/ed25519/ref10/ge_p3_dbl.c \\\n\tcrypto_sign/ed25519/ref10/ge_p3_to_cached.c \\\n\tcrypto_sign/ed25519/ref10/ge_p3_to_p2.c \\\n\tcrypto_sign/ed25519/ref10/ge_p3_tobytes.c \\\n\tcrypto_sign/ed25519/ref10/ge_precomp_0.c \\\n\tcrypto_sign/ed25519/ref10/ge_scalarmult_base.c \\\n\tcrypto_sign/ed25519/ref10/ge_sub.c \\\n\tcrypto_sign/ed25519/ref10/ge_sub.h \\\n\tcrypto_sign/ed25519/ref10/ge_tobytes.c \\\n\tcrypto_sign/ed25519/ref10/keypair.c \\\n\tcrypto_sign/ed25519/ref10/open.c \\\n\tcrypto_sign/ed25519/ref10/pow22523.h \\\n\tcrypto_sign/ed25519/ref10/pow225521.h \\\n\tcrypto_sign/ed25519/ref10/sc.h \\\n\tcrypto_sign/ed25519/ref10/sc_muladd.c \\\n\tcrypto_sign/ed25519/ref10/sc_reduce.c \\\n\tcrypto_sign/ed25519/ref10/sign.c \\\n\tcrypto_sign/ed25519/ref10/sqrtm1.h \\\n\tcrypto_stream/crypto_stream.c \\\n\tcrypto_stream/chacha20/stream_chacha20.c \\\n\tcrypto_stream/chacha20/stream_chacha20.h \\\n\tcrypto_stream/chacha20/ref/stream_chacha20_ref.h \\\n\tcrypto_stream/chacha20/ref/stream_chacha20_ref.c \\\n\tcrypto_stream/salsa20/stream_salsa20_api.c \\\n\tcrypto_stream/xsalsa20/stream_xsalsa20_api.c \\\n\tcrypto_stream/xsalsa20/ref/stream_xsalsa20.c \\\n\tcrypto_stream/xsalsa20/ref/xor_xsalsa20.c \\\n\tcrypto_verify/16/verify_16_api.c \\\n\tcrypto_verify/16/ref/verify_16.c \\\n\tcrypto_verify/32/verify_32_api.c \\\n\tcrypto_verify/32/ref/verify_32.c \\\n\tcrypto_verify/64/verify_64_api.c \\\n\tcrypto_verify/64/ref/verify_64.c \\\n\trandombytes/randombytes.c \\\n\tsodium/core.c \\\n\tsodium/runtime.c \\\n\tsodium/utils.c \\\n\tsodium/version.c\n\nif !EMSCRIPTEN\nlibsodium_la_SOURCES += \\\n\trandombytes/salsa20/randombytes_salsa20_random.c\n\nif NATIVECLIENT\nlibsodium_la_SOURCES += \\\n\trandombytes/nativeclient/randombytes_nativeclient.c\nelse\nlibsodium_la_SOURCES += \\\n    randombytes/sysrandom/randombytes_sysrandom.c\nendif\n\nendif\n\nif HAVE_TI_MODE\nlibsodium_la_SOURCES += \\\n\tcrypto_scalarmult/curve25519/donna_c64/curve25519_donna_c64.c \\\n\tcrypto_scalarmult/curve25519/donna_c64/curve25519_donna_c64.h\nelse\nlibsodium_la_SOURCES += \\\n\tcrypto_scalarmult/curve25519/ref10/curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/curve25519_ref10.h \\\n\tcrypto_scalarmult/curve25519/ref10/fe.h \\\n\tcrypto_scalarmult/curve25519/ref10/fe_0_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_1_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_add_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_copy_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_cswap_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_frombytes_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_invert_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_mul_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_mul121666_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_sq_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_sub_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_tobytes_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/montgomery.h \\\n\tcrypto_scalarmult/curve25519/ref10/pow225521.h\nendif\n\nnoinst_HEADERS = \\\n\tcrypto_scalarmult/curve25519/sandy2x/consts.S \\\n\tcrypto_scalarmult/curve25519/sandy2x/fe51_mul.S \\\n\tcrypto_scalarmult/curve25519/sandy2x/fe51_nsquare.S \\\n\tcrypto_scalarmult/curve25519/sandy2x/fe51_pack.S \\\n\tcrypto_scalarmult/curve25519/sandy2x/ladder.S \\\n\tcrypto_scalarmult/curve25519/sandy2x/ladder_base.S\n\nif HAVE_AVX_ASM\nlibsodium_la_SOURCES += \\\n\tcrypto_scalarmult/curve25519/sandy2x/consts_namespace.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.c \\\n\tcrypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/fe.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/fe51.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/fe51_invert.c \\\n\tcrypto_scalarmult/curve25519/sandy2x/fe51_namespace.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/fe_frombytes_sandy2x.c \\\n\tcrypto_scalarmult/curve25519/sandy2x/ladder.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/ladder_base.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/ladder_base_namespace.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/ladder_namespace.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/sandy2x.S\nendif\n\nif HAVE_AMD64_ASM\nlibsodium_la_SOURCES += \\\n\tcrypto_stream/salsa20/amd64_xmm6/stream_salsa20_amd64_xmm6.S\nelse\nlibsodium_la_SOURCES += \\\n\tcrypto_stream/salsa20/ref/stream_salsa20_ref.c \\\n\tcrypto_stream/salsa20/ref/xor_salsa20_ref.c\nendif\n\nif !MINIMAL\nlibsodium_la_SOURCES += \\\n\tcrypto_core/salsa2012/ref/core_salsa2012.c \\\n\tcrypto_core/salsa2012/core_salsa2012_api.c \\\n\tcrypto_core/salsa208/ref/core_salsa208.c \\\n\tcrypto_core/salsa208/core_salsa208_api.c \\\n\tcrypto_sign/ed25519/ref10/obsolete.c \\\n\tcrypto_stream/aes128ctr/portable/afternm_aes128ctr.c \\\n\tcrypto_stream/aes128ctr/stream_aes128ctr_api.c \\\n\tcrypto_stream/aes128ctr/portable/beforenm_aes128ctr.c \\\n\tcrypto_stream/aes128ctr/portable/common.h \\\n\tcrypto_stream/aes128ctr/portable/common_aes128ctr.c \\\n\tcrypto_stream/aes128ctr/portable/consts.h \\\n\tcrypto_stream/aes128ctr/portable/consts_aes128ctr.c \\\n\tcrypto_stream/aes128ctr/portable/int128.h \\\n\tcrypto_stream/aes128ctr/portable/int128_aes128ctr.c \\\n\tcrypto_stream/aes128ctr/portable/stream_aes128ctr.c \\\n\tcrypto_stream/aes128ctr/portable/types.h \\\n\tcrypto_stream/aes128ctr/portable/xor_afternm_aes128ctr.c \\\n\tcrypto_stream/salsa2012/stream_salsa2012_api.c \\\n\tcrypto_stream/salsa2012/ref/stream_salsa2012.c \\\n\tcrypto_stream/salsa2012/ref/xor_salsa2012.c \\\n\tcrypto_stream/salsa208/stream_salsa208_api.c \\\n\tcrypto_stream/salsa208/ref/stream_salsa208.c \\\n\tcrypto_stream/salsa208/ref/xor_salsa208.c\nendif\n\nlibsodium_la_LDFLAGS = \\\n\t$(AM_LDFLAGS) \\\n\t-export-dynamic \\\n\t-no-undefined \\\n\t$(LIBTOOL_EXTRA_FLAGS)\n\nlibsodium_la_CPPFLAGS = \\\n\t$(LTDLINCL) \\\n\t-I$(srcdir)/include/sodium \\\n\t-I$(builddir)/include/sodium\n\nSUBDIRS = \\\n\tinclude\n\nlibsodium_la_LIBADD = libaesni.la libsse2.la libssse3.la libsse41.la\nnoinst_LTLIBRARIES =  libsodium.la libaesni.la libsse2.la libssse3.la libsse41.la\n\nlibaesni_la_LDFLAGS = $(libsodium_la_LDFLAGS)\nlibaesni_la_CPPFLAGS = $(libsodium_la_CPPFLAGS) \\\n\t@CFLAGS_SSSE3@ @CFLAGS_AESNI@ @CFLAGS_PCLMUL@\nlibaesni_la_SOURCES = \\\n\tcrypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c\n\nlibsse2_la_LDFLAGS = $(libsodium_la_LDFLAGS)\nlibsse2_la_CPPFLAGS = $(libsodium_la_CPPFLAGS) \\\n\t@CFLAGS_SSE2@\nlibsse2_la_SOURCES = \\\n\tcrypto_pwhash/scryptsalsa208sha256/sse/pwhash_scryptsalsa208sha256_sse.c \\\n\tcrypto_onetimeauth/poly1305/sse2/poly1305_sse2.c \\\n\tcrypto_onetimeauth/poly1305/sse2/poly1305_sse2.h\n\nlibssse3_la_LDFLAGS = $(libsodium_la_LDFLAGS)\nlibssse3_la_CPPFLAGS = $(libsodium_la_CPPFLAGS) \\\n\t@CFLAGS_SSE2@ @CFLAGS_SSSE3@\nlibssse3_la_SOURCES = \\\n\tcrypto_generichash/blake2/ref/blake2b-compress-ssse3.c \\\n\tcrypto_stream/chacha20/vec/stream_chacha20_vec.h \\\n\tcrypto_stream/chacha20/vec/stream_chacha20_vec.c\n\nlibsse41_la_LDFLAGS = $(libsodium_la_LDFLAGS)\nlibsse41_la_CPPFLAGS = $(libsodium_la_CPPFLAGS) \\\n\t@CFLAGS_SSE2@ @CFLAGS_SSSE3@ @CFLAGS_SSE41@\nlibsse41_la_SOURCES = \\\n\tcrypto_generichash/blake2/ref/blake2b-compress-sse41.c\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/Makefile.in",
    "content": "# Makefile.in generated by automake 1.14.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2013 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\n\nVPATH = @srcdir@\nam__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\n@EMSCRIPTEN_FALSE@am__append_1 = \\\n@EMSCRIPTEN_FALSE@\trandombytes/salsa20/randombytes_salsa20_random.c\n\n@EMSCRIPTEN_FALSE@@NATIVECLIENT_TRUE@am__append_2 = \\\n@EMSCRIPTEN_FALSE@@NATIVECLIENT_TRUE@\trandombytes/nativeclient/randombytes_nativeclient.c\n\n@EMSCRIPTEN_FALSE@@NATIVECLIENT_FALSE@am__append_3 = \\\n@EMSCRIPTEN_FALSE@@NATIVECLIENT_FALSE@    randombytes/sysrandom/randombytes_sysrandom.c\n\n@HAVE_TI_MODE_TRUE@am__append_4 = \\\n@HAVE_TI_MODE_TRUE@\tcrypto_scalarmult/curve25519/donna_c64/curve25519_donna_c64.c \\\n@HAVE_TI_MODE_TRUE@\tcrypto_scalarmult/curve25519/donna_c64/curve25519_donna_c64.h\n\n@HAVE_TI_MODE_FALSE@am__append_5 = \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/curve25519_ref10.c \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/curve25519_ref10.h \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/fe.h \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/fe_0_curve25519_ref10.c \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/fe_1_curve25519_ref10.c \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/fe_add_curve25519_ref10.c \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/fe_copy_curve25519_ref10.c \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/fe_cswap_curve25519_ref10.c \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/fe_frombytes_curve25519_ref10.c \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/fe_invert_curve25519_ref10.c \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/fe_mul_curve25519_ref10.c \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/fe_mul121666_curve25519_ref10.c \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/fe_sq_curve25519_ref10.c \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/fe_sub_curve25519_ref10.c \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/fe_tobytes_curve25519_ref10.c \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/montgomery.h \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/pow225521.h\n\n@HAVE_AVX_ASM_TRUE@am__append_6 = \\\n@HAVE_AVX_ASM_TRUE@\tcrypto_scalarmult/curve25519/sandy2x/consts_namespace.h \\\n@HAVE_AVX_ASM_TRUE@\tcrypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.c \\\n@HAVE_AVX_ASM_TRUE@\tcrypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.h \\\n@HAVE_AVX_ASM_TRUE@\tcrypto_scalarmult/curve25519/sandy2x/fe.h \\\n@HAVE_AVX_ASM_TRUE@\tcrypto_scalarmult/curve25519/sandy2x/fe51.h \\\n@HAVE_AVX_ASM_TRUE@\tcrypto_scalarmult/curve25519/sandy2x/fe51_invert.c \\\n@HAVE_AVX_ASM_TRUE@\tcrypto_scalarmult/curve25519/sandy2x/fe51_namespace.h \\\n@HAVE_AVX_ASM_TRUE@\tcrypto_scalarmult/curve25519/sandy2x/fe_frombytes_sandy2x.c \\\n@HAVE_AVX_ASM_TRUE@\tcrypto_scalarmult/curve25519/sandy2x/ladder.h \\\n@HAVE_AVX_ASM_TRUE@\tcrypto_scalarmult/curve25519/sandy2x/ladder_base.h \\\n@HAVE_AVX_ASM_TRUE@\tcrypto_scalarmult/curve25519/sandy2x/ladder_base_namespace.h \\\n@HAVE_AVX_ASM_TRUE@\tcrypto_scalarmult/curve25519/sandy2x/ladder_namespace.h \\\n@HAVE_AVX_ASM_TRUE@\tcrypto_scalarmult/curve25519/sandy2x/sandy2x.S\n\n@HAVE_AMD64_ASM_TRUE@am__append_7 = \\\n@HAVE_AMD64_ASM_TRUE@\tcrypto_stream/salsa20/amd64_xmm6/stream_salsa20_amd64_xmm6.S\n\n@HAVE_AMD64_ASM_FALSE@am__append_8 = \\\n@HAVE_AMD64_ASM_FALSE@\tcrypto_stream/salsa20/ref/stream_salsa20_ref.c \\\n@HAVE_AMD64_ASM_FALSE@\tcrypto_stream/salsa20/ref/xor_salsa20_ref.c\n\n@MINIMAL_FALSE@am__append_9 = \\\n@MINIMAL_FALSE@\tcrypto_core/salsa2012/ref/core_salsa2012.c \\\n@MINIMAL_FALSE@\tcrypto_core/salsa2012/core_salsa2012_api.c \\\n@MINIMAL_FALSE@\tcrypto_core/salsa208/ref/core_salsa208.c \\\n@MINIMAL_FALSE@\tcrypto_core/salsa208/core_salsa208_api.c \\\n@MINIMAL_FALSE@\tcrypto_sign/ed25519/ref10/obsolete.c \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/afternm_aes128ctr.c \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/stream_aes128ctr_api.c \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/beforenm_aes128ctr.c \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/common.h \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/common_aes128ctr.c \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/consts.h \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/consts_aes128ctr.c \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/int128.h \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/int128_aes128ctr.c \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/stream_aes128ctr.c \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/types.h \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/xor_afternm_aes128ctr.c \\\n@MINIMAL_FALSE@\tcrypto_stream/salsa2012/stream_salsa2012_api.c \\\n@MINIMAL_FALSE@\tcrypto_stream/salsa2012/ref/stream_salsa2012.c \\\n@MINIMAL_FALSE@\tcrypto_stream/salsa2012/ref/xor_salsa2012.c \\\n@MINIMAL_FALSE@\tcrypto_stream/salsa208/stream_salsa208_api.c \\\n@MINIMAL_FALSE@\tcrypto_stream/salsa208/ref/stream_salsa208.c \\\n@MINIMAL_FALSE@\tcrypto_stream/salsa208/ref/xor_salsa208.c\n\nsubdir = src/libsodium\nDIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \\\n\t$(top_srcdir)/build-aux/depcomp $(noinst_HEADERS)\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \\\n\t$(top_srcdir)/m4/ax_check_define.m4 \\\n\t$(top_srcdir)/m4/ax_check_link_flag.m4 \\\n\t$(top_srcdir)/m4/ld-output-def.m4 $(top_srcdir)/m4/libtool.m4 \\\n\t$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \\\n\t$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \\\n\t$(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nmkinstalldirs = $(install_sh) -d\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nLTLIBRARIES = $(noinst_LTLIBRARIES)\nlibaesni_la_LIBADD =\nam__dirstamp = $(am__leading_dot)dirstamp\nam_libaesni_la_OBJECTS = crypto_aead/aes256gcm/aesni/libaesni_la-aead_aes256gcm_aesni.lo\nlibaesni_la_OBJECTS = $(am_libaesni_la_OBJECTS)\nAM_V_lt = $(am__v_lt_@AM_V@)\nam__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)\nam__v_lt_0 = --silent\nam__v_lt_1 = \nlibaesni_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \\\n\t$(libaesni_la_LDFLAGS) $(LDFLAGS) -o $@\nlibsodium_la_DEPENDENCIES = libaesni.la libsse2.la libssse3.la \\\n\tlibsse41.la\nam__libsodium_la_SOURCES_DIST =  \\\n\tcrypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c \\\n\tcrypto_auth/crypto_auth.c \\\n\tcrypto_auth/hmacsha256/auth_hmacsha256_api.c \\\n\tcrypto_auth/hmacsha256/cp/hmac_hmacsha256.c \\\n\tcrypto_auth/hmacsha256/cp/verify_hmacsha256.c \\\n\tcrypto_auth/hmacsha512/auth_hmacsha512_api.c \\\n\tcrypto_auth/hmacsha512/cp/hmac_hmacsha512.c \\\n\tcrypto_auth/hmacsha512/cp/verify_hmacsha512.c \\\n\tcrypto_auth/hmacsha512256/auth_hmacsha512256_api.c \\\n\tcrypto_auth/hmacsha512256/cp/hmac_hmacsha512256.c \\\n\tcrypto_auth/hmacsha512256/cp/verify_hmacsha512256.c \\\n\tcrypto_box/crypto_box.c crypto_box/crypto_box_easy.c \\\n\tcrypto_box/crypto_box_seal.c \\\n\tcrypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305_api.c \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/after_curve25519xsalsa20poly1305.c \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/before_curve25519xsalsa20poly1305.c \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/box_curve25519xsalsa20poly1305.c \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/keypair_curve25519xsalsa20poly1305.c \\\n\tcrypto_core/hsalsa20/ref2/core_hsalsa20.c \\\n\tcrypto_core/hsalsa20/core_hsalsa20_api.c \\\n\tcrypto_core/salsa20/ref/core_salsa20.c \\\n\tcrypto_core/salsa20/core_salsa20_api.c \\\n\tcrypto_generichash/crypto_generichash.c \\\n\tcrypto_generichash/blake2/generichash_blake2_api.c \\\n\tcrypto_generichash/blake2/ref/blake2-impl.h \\\n\tcrypto_generichash/blake2/ref/blake2.h \\\n\tcrypto_generichash/blake2/ref/blake2b-compress-ref.c \\\n\tcrypto_generichash/blake2/ref/blake2b-load-sse2.h \\\n\tcrypto_generichash/blake2/ref/blake2b-load-sse41.h \\\n\tcrypto_generichash/blake2/ref/blake2b-ref.c \\\n\tcrypto_generichash/blake2/ref/blake2b-round.h \\\n\tcrypto_generichash/blake2/ref/generichash_blake2b.c \\\n\tcrypto_hash/crypto_hash.c crypto_hash/sha256/hash_sha256_api.c \\\n\tcrypto_hash/sha256/cp/hash_sha256.c \\\n\tcrypto_hash/sha512/hash_sha512_api.c \\\n\tcrypto_hash/sha512/cp/hash_sha512.c \\\n\tcrypto_onetimeauth/crypto_onetimeauth.c \\\n\tcrypto_onetimeauth/poly1305/onetimeauth_poly1305.c \\\n\tcrypto_onetimeauth/poly1305/onetimeauth_poly1305.h \\\n\tcrypto_onetimeauth/poly1305/donna/poly1305_donna.h \\\n\tcrypto_onetimeauth/poly1305/donna/poly1305_donna32.h \\\n\tcrypto_onetimeauth/poly1305/donna/poly1305_donna64.h \\\n\tcrypto_onetimeauth/poly1305/donna/poly1305_donna.c \\\n\tcrypto_pwhash/scryptsalsa208sha256/crypto_scrypt-common.c \\\n\tcrypto_pwhash/scryptsalsa208sha256/crypto_scrypt.h \\\n\tcrypto_pwhash/scryptsalsa208sha256/scrypt_platform.c \\\n\tcrypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.c \\\n\tcrypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.h \\\n\tcrypto_pwhash/scryptsalsa208sha256/pwhash_scryptsalsa208sha256.c \\\n\tcrypto_pwhash/scryptsalsa208sha256/sysendian.h \\\n\tcrypto_pwhash/scryptsalsa208sha256/nosse/pwhash_scryptsalsa208sha256_nosse.c \\\n\tcrypto_scalarmult/crypto_scalarmult.c \\\n\tcrypto_scalarmult/curve25519/scalarmult_curve25519.c \\\n\tcrypto_scalarmult/curve25519/scalarmult_curve25519.h \\\n\tcrypto_secretbox/crypto_secretbox.c \\\n\tcrypto_secretbox/crypto_secretbox_easy.c \\\n\tcrypto_secretbox/xsalsa20poly1305/secretbox_xsalsa20poly1305_api.c \\\n\tcrypto_secretbox/xsalsa20poly1305/ref/box_xsalsa20poly1305.c \\\n\tcrypto_shorthash/crypto_shorthash.c \\\n\tcrypto_shorthash/siphash24/shorthash_siphash24_api.c \\\n\tcrypto_shorthash/siphash24/ref/shorthash_siphash24.c \\\n\tcrypto_sign/crypto_sign.c crypto_sign/ed25519/ref10/base.h \\\n\tcrypto_sign/ed25519/ref10/base2.h \\\n\tcrypto_sign/ed25519/sign_ed25519_api.c \\\n\tcrypto_sign/ed25519/ref10/d.h crypto_sign/ed25519/ref10/d2.h \\\n\tcrypto_sign/ed25519/ref10/fe.h \\\n\tcrypto_sign/ed25519/ref10/fe_0.c \\\n\tcrypto_sign/ed25519/ref10/fe_1.c \\\n\tcrypto_sign/ed25519/ref10/fe_add.c \\\n\tcrypto_sign/ed25519/ref10/fe_cmov.c \\\n\tcrypto_sign/ed25519/ref10/fe_copy.c \\\n\tcrypto_sign/ed25519/ref10/fe_frombytes.c \\\n\tcrypto_sign/ed25519/ref10/fe_invert.c \\\n\tcrypto_sign/ed25519/ref10/fe_isnegative.c \\\n\tcrypto_sign/ed25519/ref10/fe_isnonzero.c \\\n\tcrypto_sign/ed25519/ref10/fe_mul.c \\\n\tcrypto_sign/ed25519/ref10/fe_neg.c \\\n\tcrypto_sign/ed25519/ref10/fe_pow22523.c \\\n\tcrypto_sign/ed25519/ref10/fe_sq.c \\\n\tcrypto_sign/ed25519/ref10/fe_sq2.c \\\n\tcrypto_sign/ed25519/ref10/fe_sub.c \\\n\tcrypto_sign/ed25519/ref10/fe_tobytes.c \\\n\tcrypto_sign/ed25519/ref10/ge.h \\\n\tcrypto_sign/ed25519/ref10/ge_add.c \\\n\tcrypto_sign/ed25519/ref10/ge_add.h \\\n\tcrypto_sign/ed25519/ref10/ge_double_scalarmult.c \\\n\tcrypto_sign/ed25519/ref10/ge_frombytes.c \\\n\tcrypto_sign/ed25519/ref10/ge_madd.c \\\n\tcrypto_sign/ed25519/ref10/ge_madd.h \\\n\tcrypto_sign/ed25519/ref10/ge_msub.c \\\n\tcrypto_sign/ed25519/ref10/ge_msub.h \\\n\tcrypto_sign/ed25519/ref10/ge_p1p1_to_p2.c \\\n\tcrypto_sign/ed25519/ref10/ge_p1p1_to_p3.c \\\n\tcrypto_sign/ed25519/ref10/ge_p2_0.c \\\n\tcrypto_sign/ed25519/ref10/ge_p2_dbl.c \\\n\tcrypto_sign/ed25519/ref10/ge_p2_dbl.h \\\n\tcrypto_sign/ed25519/ref10/ge_p3_0.c \\\n\tcrypto_sign/ed25519/ref10/ge_p3_dbl.c \\\n\tcrypto_sign/ed25519/ref10/ge_p3_to_cached.c \\\n\tcrypto_sign/ed25519/ref10/ge_p3_to_p2.c \\\n\tcrypto_sign/ed25519/ref10/ge_p3_tobytes.c \\\n\tcrypto_sign/ed25519/ref10/ge_precomp_0.c \\\n\tcrypto_sign/ed25519/ref10/ge_scalarmult_base.c \\\n\tcrypto_sign/ed25519/ref10/ge_sub.c \\\n\tcrypto_sign/ed25519/ref10/ge_sub.h \\\n\tcrypto_sign/ed25519/ref10/ge_tobytes.c \\\n\tcrypto_sign/ed25519/ref10/keypair.c \\\n\tcrypto_sign/ed25519/ref10/open.c \\\n\tcrypto_sign/ed25519/ref10/pow22523.h \\\n\tcrypto_sign/ed25519/ref10/pow225521.h \\\n\tcrypto_sign/ed25519/ref10/sc.h \\\n\tcrypto_sign/ed25519/ref10/sc_muladd.c \\\n\tcrypto_sign/ed25519/ref10/sc_reduce.c \\\n\tcrypto_sign/ed25519/ref10/sign.c \\\n\tcrypto_sign/ed25519/ref10/sqrtm1.h \\\n\tcrypto_stream/crypto_stream.c \\\n\tcrypto_stream/chacha20/stream_chacha20.c \\\n\tcrypto_stream/chacha20/stream_chacha20.h \\\n\tcrypto_stream/chacha20/ref/stream_chacha20_ref.h \\\n\tcrypto_stream/chacha20/ref/stream_chacha20_ref.c \\\n\tcrypto_stream/salsa20/stream_salsa20_api.c \\\n\tcrypto_stream/xsalsa20/stream_xsalsa20_api.c \\\n\tcrypto_stream/xsalsa20/ref/stream_xsalsa20.c \\\n\tcrypto_stream/xsalsa20/ref/xor_xsalsa20.c \\\n\tcrypto_verify/16/verify_16_api.c \\\n\tcrypto_verify/16/ref/verify_16.c \\\n\tcrypto_verify/32/verify_32_api.c \\\n\tcrypto_verify/32/ref/verify_32.c \\\n\tcrypto_verify/64/verify_64_api.c \\\n\tcrypto_verify/64/ref/verify_64.c randombytes/randombytes.c \\\n\tsodium/core.c sodium/runtime.c sodium/utils.c sodium/version.c \\\n\trandombytes/salsa20/randombytes_salsa20_random.c \\\n\trandombytes/nativeclient/randombytes_nativeclient.c \\\n\trandombytes/sysrandom/randombytes_sysrandom.c \\\n\tcrypto_scalarmult/curve25519/donna_c64/curve25519_donna_c64.c \\\n\tcrypto_scalarmult/curve25519/donna_c64/curve25519_donna_c64.h \\\n\tcrypto_scalarmult/curve25519/ref10/curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/curve25519_ref10.h \\\n\tcrypto_scalarmult/curve25519/ref10/fe.h \\\n\tcrypto_scalarmult/curve25519/ref10/fe_0_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_1_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_add_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_copy_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_cswap_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_frombytes_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_invert_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_mul_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_mul121666_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_sq_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_sub_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/fe_tobytes_curve25519_ref10.c \\\n\tcrypto_scalarmult/curve25519/ref10/montgomery.h \\\n\tcrypto_scalarmult/curve25519/ref10/pow225521.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/consts_namespace.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.c \\\n\tcrypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/fe.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/fe51.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/fe51_invert.c \\\n\tcrypto_scalarmult/curve25519/sandy2x/fe51_namespace.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/fe_frombytes_sandy2x.c \\\n\tcrypto_scalarmult/curve25519/sandy2x/ladder.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/ladder_base.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/ladder_base_namespace.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/ladder_namespace.h \\\n\tcrypto_scalarmult/curve25519/sandy2x/sandy2x.S \\\n\tcrypto_stream/salsa20/amd64_xmm6/stream_salsa20_amd64_xmm6.S \\\n\tcrypto_stream/salsa20/ref/stream_salsa20_ref.c \\\n\tcrypto_stream/salsa20/ref/xor_salsa20_ref.c \\\n\tcrypto_core/salsa2012/ref/core_salsa2012.c \\\n\tcrypto_core/salsa2012/core_salsa2012_api.c \\\n\tcrypto_core/salsa208/ref/core_salsa208.c \\\n\tcrypto_core/salsa208/core_salsa208_api.c \\\n\tcrypto_sign/ed25519/ref10/obsolete.c \\\n\tcrypto_stream/aes128ctr/portable/afternm_aes128ctr.c \\\n\tcrypto_stream/aes128ctr/stream_aes128ctr_api.c \\\n\tcrypto_stream/aes128ctr/portable/beforenm_aes128ctr.c \\\n\tcrypto_stream/aes128ctr/portable/common.h \\\n\tcrypto_stream/aes128ctr/portable/common_aes128ctr.c \\\n\tcrypto_stream/aes128ctr/portable/consts.h \\\n\tcrypto_stream/aes128ctr/portable/consts_aes128ctr.c \\\n\tcrypto_stream/aes128ctr/portable/int128.h \\\n\tcrypto_stream/aes128ctr/portable/int128_aes128ctr.c \\\n\tcrypto_stream/aes128ctr/portable/stream_aes128ctr.c \\\n\tcrypto_stream/aes128ctr/portable/types.h \\\n\tcrypto_stream/aes128ctr/portable/xor_afternm_aes128ctr.c \\\n\tcrypto_stream/salsa2012/stream_salsa2012_api.c \\\n\tcrypto_stream/salsa2012/ref/stream_salsa2012.c \\\n\tcrypto_stream/salsa2012/ref/xor_salsa2012.c \\\n\tcrypto_stream/salsa208/stream_salsa208_api.c \\\n\tcrypto_stream/salsa208/ref/stream_salsa208.c \\\n\tcrypto_stream/salsa208/ref/xor_salsa208.c\n@EMSCRIPTEN_FALSE@am__objects_1 = randombytes/salsa20/libsodium_la-randombytes_salsa20_random.lo\n@EMSCRIPTEN_FALSE@@NATIVECLIENT_TRUE@am__objects_2 = randombytes/nativeclient/libsodium_la-randombytes_nativeclient.lo\n@EMSCRIPTEN_FALSE@@NATIVECLIENT_FALSE@am__objects_3 = randombytes/sysrandom/libsodium_la-randombytes_sysrandom.lo\n@HAVE_TI_MODE_TRUE@am__objects_4 = crypto_scalarmult/curve25519/donna_c64/libsodium_la-curve25519_donna_c64.lo\n@HAVE_TI_MODE_FALSE@am__objects_5 = crypto_scalarmult/curve25519/ref10/libsodium_la-curve25519_ref10.lo \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/libsodium_la-fe_0_curve25519_ref10.lo \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/libsodium_la-fe_1_curve25519_ref10.lo \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/libsodium_la-fe_add_curve25519_ref10.lo \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/libsodium_la-fe_copy_curve25519_ref10.lo \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/libsodium_la-fe_cswap_curve25519_ref10.lo \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/libsodium_la-fe_frombytes_curve25519_ref10.lo \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/libsodium_la-fe_invert_curve25519_ref10.lo \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/libsodium_la-fe_mul_curve25519_ref10.lo \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/libsodium_la-fe_mul121666_curve25519_ref10.lo \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/libsodium_la-fe_sq_curve25519_ref10.lo \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/libsodium_la-fe_sub_curve25519_ref10.lo \\\n@HAVE_TI_MODE_FALSE@\tcrypto_scalarmult/curve25519/ref10/libsodium_la-fe_tobytes_curve25519_ref10.lo\n@HAVE_AVX_ASM_TRUE@am__objects_6 = crypto_scalarmult/curve25519/sandy2x/libsodium_la-curve25519_sandy2x.lo \\\n@HAVE_AVX_ASM_TRUE@\tcrypto_scalarmult/curve25519/sandy2x/libsodium_la-fe51_invert.lo \\\n@HAVE_AVX_ASM_TRUE@\tcrypto_scalarmult/curve25519/sandy2x/libsodium_la-fe_frombytes_sandy2x.lo \\\n@HAVE_AVX_ASM_TRUE@\tcrypto_scalarmult/curve25519/sandy2x/libsodium_la-sandy2x.lo\n@HAVE_AMD64_ASM_TRUE@am__objects_7 = crypto_stream/salsa20/amd64_xmm6/libsodium_la-stream_salsa20_amd64_xmm6.lo\n@HAVE_AMD64_ASM_FALSE@am__objects_8 = crypto_stream/salsa20/ref/libsodium_la-stream_salsa20_ref.lo \\\n@HAVE_AMD64_ASM_FALSE@\tcrypto_stream/salsa20/ref/libsodium_la-xor_salsa20_ref.lo\n@MINIMAL_FALSE@am__objects_9 = crypto_core/salsa2012/ref/libsodium_la-core_salsa2012.lo \\\n@MINIMAL_FALSE@\tcrypto_core/salsa2012/libsodium_la-core_salsa2012_api.lo \\\n@MINIMAL_FALSE@\tcrypto_core/salsa208/ref/libsodium_la-core_salsa208.lo \\\n@MINIMAL_FALSE@\tcrypto_core/salsa208/libsodium_la-core_salsa208_api.lo \\\n@MINIMAL_FALSE@\tcrypto_sign/ed25519/ref10/libsodium_la-obsolete.lo \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/libsodium_la-afternm_aes128ctr.lo \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/libsodium_la-stream_aes128ctr_api.lo \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/libsodium_la-beforenm_aes128ctr.lo \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/libsodium_la-common_aes128ctr.lo \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/libsodium_la-consts_aes128ctr.lo \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/libsodium_la-int128_aes128ctr.lo \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/libsodium_la-stream_aes128ctr.lo \\\n@MINIMAL_FALSE@\tcrypto_stream/aes128ctr/portable/libsodium_la-xor_afternm_aes128ctr.lo \\\n@MINIMAL_FALSE@\tcrypto_stream/salsa2012/libsodium_la-stream_salsa2012_api.lo \\\n@MINIMAL_FALSE@\tcrypto_stream/salsa2012/ref/libsodium_la-stream_salsa2012.lo \\\n@MINIMAL_FALSE@\tcrypto_stream/salsa2012/ref/libsodium_la-xor_salsa2012.lo \\\n@MINIMAL_FALSE@\tcrypto_stream/salsa208/libsodium_la-stream_salsa208_api.lo \\\n@MINIMAL_FALSE@\tcrypto_stream/salsa208/ref/libsodium_la-stream_salsa208.lo \\\n@MINIMAL_FALSE@\tcrypto_stream/salsa208/ref/libsodium_la-xor_salsa208.lo\nam_libsodium_la_OBJECTS = crypto_aead/chacha20poly1305/sodium/libsodium_la-aead_chacha20poly1305.lo \\\n\tcrypto_auth/libsodium_la-crypto_auth.lo \\\n\tcrypto_auth/hmacsha256/libsodium_la-auth_hmacsha256_api.lo \\\n\tcrypto_auth/hmacsha256/cp/libsodium_la-hmac_hmacsha256.lo \\\n\tcrypto_auth/hmacsha256/cp/libsodium_la-verify_hmacsha256.lo \\\n\tcrypto_auth/hmacsha512/libsodium_la-auth_hmacsha512_api.lo \\\n\tcrypto_auth/hmacsha512/cp/libsodium_la-hmac_hmacsha512.lo \\\n\tcrypto_auth/hmacsha512/cp/libsodium_la-verify_hmacsha512.lo \\\n\tcrypto_auth/hmacsha512256/libsodium_la-auth_hmacsha512256_api.lo \\\n\tcrypto_auth/hmacsha512256/cp/libsodium_la-hmac_hmacsha512256.lo \\\n\tcrypto_auth/hmacsha512256/cp/libsodium_la-verify_hmacsha512256.lo \\\n\tcrypto_box/libsodium_la-crypto_box.lo \\\n\tcrypto_box/libsodium_la-crypto_box_easy.lo \\\n\tcrypto_box/libsodium_la-crypto_box_seal.lo \\\n\tcrypto_box/curve25519xsalsa20poly1305/libsodium_la-box_curve25519xsalsa20poly1305_api.lo \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-after_curve25519xsalsa20poly1305.lo \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-before_curve25519xsalsa20poly1305.lo \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-box_curve25519xsalsa20poly1305.lo \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-keypair_curve25519xsalsa20poly1305.lo \\\n\tcrypto_core/hsalsa20/ref2/libsodium_la-core_hsalsa20.lo \\\n\tcrypto_core/hsalsa20/libsodium_la-core_hsalsa20_api.lo \\\n\tcrypto_core/salsa20/ref/libsodium_la-core_salsa20.lo \\\n\tcrypto_core/salsa20/libsodium_la-core_salsa20_api.lo \\\n\tcrypto_generichash/libsodium_la-crypto_generichash.lo \\\n\tcrypto_generichash/blake2/libsodium_la-generichash_blake2_api.lo \\\n\tcrypto_generichash/blake2/ref/libsodium_la-blake2b-compress-ref.lo \\\n\tcrypto_generichash/blake2/ref/libsodium_la-blake2b-ref.lo \\\n\tcrypto_generichash/blake2/ref/libsodium_la-generichash_blake2b.lo \\\n\tcrypto_hash/libsodium_la-crypto_hash.lo \\\n\tcrypto_hash/sha256/libsodium_la-hash_sha256_api.lo \\\n\tcrypto_hash/sha256/cp/libsodium_la-hash_sha256.lo \\\n\tcrypto_hash/sha512/libsodium_la-hash_sha512_api.lo \\\n\tcrypto_hash/sha512/cp/libsodium_la-hash_sha512.lo \\\n\tcrypto_onetimeauth/libsodium_la-crypto_onetimeauth.lo \\\n\tcrypto_onetimeauth/poly1305/libsodium_la-onetimeauth_poly1305.lo \\\n\tcrypto_onetimeauth/poly1305/donna/libsodium_la-poly1305_donna.lo \\\n\tcrypto_pwhash/scryptsalsa208sha256/libsodium_la-crypto_scrypt-common.lo \\\n\tcrypto_pwhash/scryptsalsa208sha256/libsodium_la-scrypt_platform.lo \\\n\tcrypto_pwhash/scryptsalsa208sha256/libsodium_la-pbkdf2-sha256.lo \\\n\tcrypto_pwhash/scryptsalsa208sha256/libsodium_la-pwhash_scryptsalsa208sha256.lo \\\n\tcrypto_pwhash/scryptsalsa208sha256/nosse/libsodium_la-pwhash_scryptsalsa208sha256_nosse.lo \\\n\tcrypto_scalarmult/libsodium_la-crypto_scalarmult.lo \\\n\tcrypto_scalarmult/curve25519/libsodium_la-scalarmult_curve25519.lo \\\n\tcrypto_secretbox/libsodium_la-crypto_secretbox.lo \\\n\tcrypto_secretbox/libsodium_la-crypto_secretbox_easy.lo \\\n\tcrypto_secretbox/xsalsa20poly1305/libsodium_la-secretbox_xsalsa20poly1305_api.lo \\\n\tcrypto_secretbox/xsalsa20poly1305/ref/libsodium_la-box_xsalsa20poly1305.lo \\\n\tcrypto_shorthash/libsodium_la-crypto_shorthash.lo \\\n\tcrypto_shorthash/siphash24/libsodium_la-shorthash_siphash24_api.lo \\\n\tcrypto_shorthash/siphash24/ref/libsodium_la-shorthash_siphash24.lo \\\n\tcrypto_sign/libsodium_la-crypto_sign.lo \\\n\tcrypto_sign/ed25519/libsodium_la-sign_ed25519_api.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-fe_0.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-fe_1.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-fe_add.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-fe_cmov.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-fe_copy.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-fe_frombytes.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-fe_invert.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-fe_isnegative.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-fe_isnonzero.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-fe_mul.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-fe_neg.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-fe_pow22523.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-fe_sq.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-fe_sq2.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-fe_sub.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-fe_tobytes.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_add.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_double_scalarmult.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_frombytes.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_madd.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_msub.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_p1p1_to_p2.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_p1p1_to_p3.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_p2_0.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_p2_dbl.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_p3_0.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_p3_dbl.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_p3_to_cached.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_p3_to_p2.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_p3_tobytes.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_precomp_0.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_scalarmult_base.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_sub.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-ge_tobytes.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-keypair.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-open.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-sc_muladd.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-sc_reduce.lo \\\n\tcrypto_sign/ed25519/ref10/libsodium_la-sign.lo \\\n\tcrypto_stream/libsodium_la-crypto_stream.lo \\\n\tcrypto_stream/chacha20/libsodium_la-stream_chacha20.lo \\\n\tcrypto_stream/chacha20/ref/libsodium_la-stream_chacha20_ref.lo \\\n\tcrypto_stream/salsa20/libsodium_la-stream_salsa20_api.lo \\\n\tcrypto_stream/xsalsa20/libsodium_la-stream_xsalsa20_api.lo \\\n\tcrypto_stream/xsalsa20/ref/libsodium_la-stream_xsalsa20.lo \\\n\tcrypto_stream/xsalsa20/ref/libsodium_la-xor_xsalsa20.lo \\\n\tcrypto_verify/16/libsodium_la-verify_16_api.lo \\\n\tcrypto_verify/16/ref/libsodium_la-verify_16.lo \\\n\tcrypto_verify/32/libsodium_la-verify_32_api.lo \\\n\tcrypto_verify/32/ref/libsodium_la-verify_32.lo \\\n\tcrypto_verify/64/libsodium_la-verify_64_api.lo \\\n\tcrypto_verify/64/ref/libsodium_la-verify_64.lo \\\n\trandombytes/libsodium_la-randombytes.lo \\\n\tsodium/libsodium_la-core.lo sodium/libsodium_la-runtime.lo \\\n\tsodium/libsodium_la-utils.lo sodium/libsodium_la-version.lo \\\n\t$(am__objects_1) $(am__objects_2) $(am__objects_3) \\\n\t$(am__objects_4) $(am__objects_5) $(am__objects_6) \\\n\t$(am__objects_7) $(am__objects_8) $(am__objects_9)\nlibsodium_la_OBJECTS = $(am_libsodium_la_OBJECTS)\nlibsodium_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \\\n\t$(libsodium_la_LDFLAGS) $(LDFLAGS) -o $@\nlibsse2_la_LIBADD =\nam_libsse2_la_OBJECTS = crypto_pwhash/scryptsalsa208sha256/sse/libsse2_la-pwhash_scryptsalsa208sha256_sse.lo \\\n\tcrypto_onetimeauth/poly1305/sse2/libsse2_la-poly1305_sse2.lo\nlibsse2_la_OBJECTS = $(am_libsse2_la_OBJECTS)\nlibsse2_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \\\n\t$(libsse2_la_LDFLAGS) $(LDFLAGS) -o $@\nlibsse41_la_LIBADD =\nam_libsse41_la_OBJECTS = crypto_generichash/blake2/ref/libsse41_la-blake2b-compress-sse41.lo\nlibsse41_la_OBJECTS = $(am_libsse41_la_OBJECTS)\nlibsse41_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \\\n\t$(libsse41_la_LDFLAGS) $(LDFLAGS) -o $@\nlibssse3_la_LIBADD =\nam_libssse3_la_OBJECTS = crypto_generichash/blake2/ref/libssse3_la-blake2b-compress-ssse3.lo \\\n\tcrypto_stream/chacha20/vec/libssse3_la-stream_chacha20_vec.lo\nlibssse3_la_OBJECTS = $(am_libssse3_la_OBJECTS)\nlibssse3_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \\\n\t$(libssse3_la_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nDEFAULT_INCLUDES = -I.@am__isrc@\ndepcomp = $(SHELL) $(top_srcdir)/build-aux/depcomp\nam__depfiles_maybe = depfiles\nam__mv = mv -f\nCPPASCOMPILE = $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) \\\n\t$(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS)\nLTCPPASCOMPILE = $(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) \\\n\t$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \\\n\t$(AM_CCASFLAGS) $(CCASFLAGS)\nAM_V_CPPAS = $(am__v_CPPAS_@AM_V@)\nam__v_CPPAS_ = $(am__v_CPPAS_@AM_DEFAULT_V@)\nam__v_CPPAS_0 = @echo \"  CPPAS   \" $@;\nam__v_CPPAS_1 = \nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nLTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \\\n\t$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \\\n\t$(AM_CFLAGS) $(CFLAGS)\nAM_V_CC = $(am__v_CC_@AM_V@)\nam__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)\nam__v_CC_0 = @echo \"  CC      \" $@;\nam__v_CC_1 = \nCCLD = $(CC)\nLINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \\\n\t$(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_CCLD = $(am__v_CCLD_@AM_V@)\nam__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)\nam__v_CCLD_0 = @echo \"  CCLD    \" $@;\nam__v_CCLD_1 = \nSOURCES = $(libaesni_la_SOURCES) $(libsodium_la_SOURCES) \\\n\t$(libsse2_la_SOURCES) $(libsse41_la_SOURCES) \\\n\t$(libssse3_la_SOURCES)\nDIST_SOURCES = $(libaesni_la_SOURCES) $(am__libsodium_la_SOURCES_DIST) \\\n\t$(libsse2_la_SOURCES) $(libsse41_la_SOURCES) \\\n\t$(libssse3_la_SOURCES)\nRECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \\\n\tctags-recursive dvi-recursive html-recursive info-recursive \\\n\tinstall-data-recursive install-dvi-recursive \\\n\tinstall-exec-recursive install-html-recursive \\\n\tinstall-info-recursive install-pdf-recursive \\\n\tinstall-ps-recursive install-recursive installcheck-recursive \\\n\tinstalldirs-recursive pdf-recursive ps-recursive \\\n\ttags-recursive uninstall-recursive\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nHEADERS = $(noinst_HEADERS)\nRECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive\t\\\n  distclean-recursive maintainer-clean-recursive\nam__recursive_targets = \\\n  $(RECURSIVE_TARGETS) \\\n  $(RECURSIVE_CLEAN_TARGETS) \\\n  $(am__extra_recursive_targets)\nAM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \\\n\tdistdir\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nDIST_SUBDIRS = $(SUBDIRS)\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nam__relativize = \\\n  dir0=`pwd`; \\\n  sed_first='s,^\\([^/]*\\)/.*$$,\\1,'; \\\n  sed_rest='s,^[^/]*/*,,'; \\\n  sed_last='s,^.*/\\([^/]*\\)$$,\\1,'; \\\n  sed_butlast='s,/*[^/]*$$,,'; \\\n  while test -n \"$$dir1\"; do \\\n    first=`echo \"$$dir1\" | sed -e \"$$sed_first\"`; \\\n    if test \"$$first\" != \".\"; then \\\n      if test \"$$first\" = \"..\"; then \\\n        dir2=`echo \"$$dir0\" | sed -e \"$$sed_last\"`/\"$$dir2\"; \\\n        dir0=`echo \"$$dir0\" | sed -e \"$$sed_butlast\"`; \\\n      else \\\n        first2=`echo \"$$dir2\" | sed -e \"$$sed_first\"`; \\\n        if test \"$$first2\" = \"$$first\"; then \\\n          dir2=`echo \"$$dir2\" | sed -e \"$$sed_rest\"`; \\\n        else \\\n          dir2=\"../$$dir2\"; \\\n        fi; \\\n        dir0=\"$$dir0\"/\"$$first\"; \\\n      fi; \\\n    fi; \\\n    dir1=`echo \"$$dir1\" | sed -e \"$$sed_rest\"`; \\\n  done; \\\n  reldir=\"$$dir2\"\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAR = @AR@\nAS = @AS@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCAS = @CCAS@\nCCASDEPMODE = @CCASDEPMODE@\nCCASFLAGS = @CCASFLAGS@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCFLAGS_AESNI = @CFLAGS_AESNI@\nCFLAGS_MMX = @CFLAGS_MMX@\nCFLAGS_PCLMUL = @CFLAGS_PCLMUL@\nCFLAGS_SSE2 = @CFLAGS_SSE2@\nCFLAGS_SSE3 = @CFLAGS_SSE3@\nCFLAGS_SSE41 = @CFLAGS_SSE41@\nCFLAGS_SSSE3 = @CFLAGS_SSSE3@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCWFLAGS = @CWFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDLLTOOL = @DLLTOOL@\nDLL_VERSION = @DLL_VERSION@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nHAVE_AMD64_ASM_V = @HAVE_AMD64_ASM_V@\nHAVE_AVX_ASM_V = @HAVE_AVX_ASM_V@\nHAVE_CPUID_V = @HAVE_CPUID_V@\nHAVE_TI_MODE_V = @HAVE_TI_MODE_V@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nISODATE = @ISODATE@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIBTOOL_DEPS = @LIBTOOL_DEPS@\nLIBTOOL_EXTRA_FLAGS = @LIBTOOL_EXTRA_FLAGS@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMANIFEST_TOOL = @MANIFEST_TOOL@\nMKDIR_P = @MKDIR_P@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nSAFECODE_HOME = @SAFECODE_HOME@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSODIUM_LIBRARY_VERSION = @SODIUM_LIBRARY_VERSION@\nSODIUM_LIBRARY_VERSION_MAJOR = @SODIUM_LIBRARY_VERSION_MAJOR@\nSODIUM_LIBRARY_VERSION_MINOR = @SODIUM_LIBRARY_VERSION_MINOR@\nSTRIP = @STRIP@\nTEST_LDFLAGS = @TEST_LDFLAGS@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_AR = @ac_ct_AR@\nac_ct_CC = @ac_ct_CC@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nlibsodium_la_SOURCES =  \\\n\tcrypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c \\\n\tcrypto_auth/crypto_auth.c \\\n\tcrypto_auth/hmacsha256/auth_hmacsha256_api.c \\\n\tcrypto_auth/hmacsha256/cp/hmac_hmacsha256.c \\\n\tcrypto_auth/hmacsha256/cp/verify_hmacsha256.c \\\n\tcrypto_auth/hmacsha512/auth_hmacsha512_api.c \\\n\tcrypto_auth/hmacsha512/cp/hmac_hmacsha512.c \\\n\tcrypto_auth/hmacsha512/cp/verify_hmacsha512.c \\\n\tcrypto_auth/hmacsha512256/auth_hmacsha512256_api.c \\\n\tcrypto_auth/hmacsha512256/cp/hmac_hmacsha512256.c \\\n\tcrypto_auth/hmacsha512256/cp/verify_hmacsha512256.c \\\n\tcrypto_box/crypto_box.c crypto_box/crypto_box_easy.c \\\n\tcrypto_box/crypto_box_seal.c \\\n\tcrypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305_api.c \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/after_curve25519xsalsa20poly1305.c \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/before_curve25519xsalsa20poly1305.c \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/box_curve25519xsalsa20poly1305.c \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/keypair_curve25519xsalsa20poly1305.c \\\n\tcrypto_core/hsalsa20/ref2/core_hsalsa20.c \\\n\tcrypto_core/hsalsa20/core_hsalsa20_api.c \\\n\tcrypto_core/salsa20/ref/core_salsa20.c \\\n\tcrypto_core/salsa20/core_salsa20_api.c \\\n\tcrypto_generichash/crypto_generichash.c \\\n\tcrypto_generichash/blake2/generichash_blake2_api.c \\\n\tcrypto_generichash/blake2/ref/blake2-impl.h \\\n\tcrypto_generichash/blake2/ref/blake2.h \\\n\tcrypto_generichash/blake2/ref/blake2b-compress-ref.c \\\n\tcrypto_generichash/blake2/ref/blake2b-load-sse2.h \\\n\tcrypto_generichash/blake2/ref/blake2b-load-sse41.h \\\n\tcrypto_generichash/blake2/ref/blake2b-ref.c \\\n\tcrypto_generichash/blake2/ref/blake2b-round.h \\\n\tcrypto_generichash/blake2/ref/generichash_blake2b.c \\\n\tcrypto_hash/crypto_hash.c crypto_hash/sha256/hash_sha256_api.c \\\n\tcrypto_hash/sha256/cp/hash_sha256.c \\\n\tcrypto_hash/sha512/hash_sha512_api.c \\\n\tcrypto_hash/sha512/cp/hash_sha512.c \\\n\tcrypto_onetimeauth/crypto_onetimeauth.c \\\n\tcrypto_onetimeauth/poly1305/onetimeauth_poly1305.c \\\n\tcrypto_onetimeauth/poly1305/onetimeauth_poly1305.h \\\n\tcrypto_onetimeauth/poly1305/donna/poly1305_donna.h \\\n\tcrypto_onetimeauth/poly1305/donna/poly1305_donna32.h \\\n\tcrypto_onetimeauth/poly1305/donna/poly1305_donna64.h \\\n\tcrypto_onetimeauth/poly1305/donna/poly1305_donna.c \\\n\tcrypto_pwhash/scryptsalsa208sha256/crypto_scrypt-common.c \\\n\tcrypto_pwhash/scryptsalsa208sha256/crypto_scrypt.h \\\n\tcrypto_pwhash/scryptsalsa208sha256/scrypt_platform.c \\\n\tcrypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.c \\\n\tcrypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.h \\\n\tcrypto_pwhash/scryptsalsa208sha256/pwhash_scryptsalsa208sha256.c \\\n\tcrypto_pwhash/scryptsalsa208sha256/sysendian.h \\\n\tcrypto_pwhash/scryptsalsa208sha256/nosse/pwhash_scryptsalsa208sha256_nosse.c \\\n\tcrypto_scalarmult/crypto_scalarmult.c \\\n\tcrypto_scalarmult/curve25519/scalarmult_curve25519.c \\\n\tcrypto_scalarmult/curve25519/scalarmult_curve25519.h \\\n\tcrypto_secretbox/crypto_secretbox.c \\\n\tcrypto_secretbox/crypto_secretbox_easy.c \\\n\tcrypto_secretbox/xsalsa20poly1305/secretbox_xsalsa20poly1305_api.c \\\n\tcrypto_secretbox/xsalsa20poly1305/ref/box_xsalsa20poly1305.c \\\n\tcrypto_shorthash/crypto_shorthash.c \\\n\tcrypto_shorthash/siphash24/shorthash_siphash24_api.c \\\n\tcrypto_shorthash/siphash24/ref/shorthash_siphash24.c \\\n\tcrypto_sign/crypto_sign.c crypto_sign/ed25519/ref10/base.h \\\n\tcrypto_sign/ed25519/ref10/base2.h \\\n\tcrypto_sign/ed25519/sign_ed25519_api.c \\\n\tcrypto_sign/ed25519/ref10/d.h crypto_sign/ed25519/ref10/d2.h \\\n\tcrypto_sign/ed25519/ref10/fe.h \\\n\tcrypto_sign/ed25519/ref10/fe_0.c \\\n\tcrypto_sign/ed25519/ref10/fe_1.c \\\n\tcrypto_sign/ed25519/ref10/fe_add.c \\\n\tcrypto_sign/ed25519/ref10/fe_cmov.c \\\n\tcrypto_sign/ed25519/ref10/fe_copy.c \\\n\tcrypto_sign/ed25519/ref10/fe_frombytes.c \\\n\tcrypto_sign/ed25519/ref10/fe_invert.c \\\n\tcrypto_sign/ed25519/ref10/fe_isnegative.c \\\n\tcrypto_sign/ed25519/ref10/fe_isnonzero.c \\\n\tcrypto_sign/ed25519/ref10/fe_mul.c \\\n\tcrypto_sign/ed25519/ref10/fe_neg.c \\\n\tcrypto_sign/ed25519/ref10/fe_pow22523.c \\\n\tcrypto_sign/ed25519/ref10/fe_sq.c \\\n\tcrypto_sign/ed25519/ref10/fe_sq2.c \\\n\tcrypto_sign/ed25519/ref10/fe_sub.c \\\n\tcrypto_sign/ed25519/ref10/fe_tobytes.c \\\n\tcrypto_sign/ed25519/ref10/ge.h \\\n\tcrypto_sign/ed25519/ref10/ge_add.c \\\n\tcrypto_sign/ed25519/ref10/ge_add.h \\\n\tcrypto_sign/ed25519/ref10/ge_double_scalarmult.c \\\n\tcrypto_sign/ed25519/ref10/ge_frombytes.c \\\n\tcrypto_sign/ed25519/ref10/ge_madd.c \\\n\tcrypto_sign/ed25519/ref10/ge_madd.h \\\n\tcrypto_sign/ed25519/ref10/ge_msub.c \\\n\tcrypto_sign/ed25519/ref10/ge_msub.h \\\n\tcrypto_sign/ed25519/ref10/ge_p1p1_to_p2.c \\\n\tcrypto_sign/ed25519/ref10/ge_p1p1_to_p3.c \\\n\tcrypto_sign/ed25519/ref10/ge_p2_0.c \\\n\tcrypto_sign/ed25519/ref10/ge_p2_dbl.c \\\n\tcrypto_sign/ed25519/ref10/ge_p2_dbl.h \\\n\tcrypto_sign/ed25519/ref10/ge_p3_0.c \\\n\tcrypto_sign/ed25519/ref10/ge_p3_dbl.c \\\n\tcrypto_sign/ed25519/ref10/ge_p3_to_cached.c \\\n\tcrypto_sign/ed25519/ref10/ge_p3_to_p2.c \\\n\tcrypto_sign/ed25519/ref10/ge_p3_tobytes.c \\\n\tcrypto_sign/ed25519/ref10/ge_precomp_0.c \\\n\tcrypto_sign/ed25519/ref10/ge_scalarmult_base.c \\\n\tcrypto_sign/ed25519/ref10/ge_sub.c \\\n\tcrypto_sign/ed25519/ref10/ge_sub.h \\\n\tcrypto_sign/ed25519/ref10/ge_tobytes.c \\\n\tcrypto_sign/ed25519/ref10/keypair.c \\\n\tcrypto_sign/ed25519/ref10/open.c \\\n\tcrypto_sign/ed25519/ref10/pow22523.h \\\n\tcrypto_sign/ed25519/ref10/pow225521.h \\\n\tcrypto_sign/ed25519/ref10/sc.h \\\n\tcrypto_sign/ed25519/ref10/sc_muladd.c \\\n\tcrypto_sign/ed25519/ref10/sc_reduce.c \\\n\tcrypto_sign/ed25519/ref10/sign.c \\\n\tcrypto_sign/ed25519/ref10/sqrtm1.h \\\n\tcrypto_stream/crypto_stream.c \\\n\tcrypto_stream/chacha20/stream_chacha20.c \\\n\tcrypto_stream/chacha20/stream_chacha20.h \\\n\tcrypto_stream/chacha20/ref/stream_chacha20_ref.h \\\n\tcrypto_stream/chacha20/ref/stream_chacha20_ref.c \\\n\tcrypto_stream/salsa20/stream_salsa20_api.c \\\n\tcrypto_stream/xsalsa20/stream_xsalsa20_api.c \\\n\tcrypto_stream/xsalsa20/ref/stream_xsalsa20.c \\\n\tcrypto_stream/xsalsa20/ref/xor_xsalsa20.c \\\n\tcrypto_verify/16/verify_16_api.c \\\n\tcrypto_verify/16/ref/verify_16.c \\\n\tcrypto_verify/32/verify_32_api.c \\\n\tcrypto_verify/32/ref/verify_32.c \\\n\tcrypto_verify/64/verify_64_api.c \\\n\tcrypto_verify/64/ref/verify_64.c randombytes/randombytes.c \\\n\tsodium/core.c sodium/runtime.c sodium/utils.c sodium/version.c \\\n\t$(am__append_1) $(am__append_2) $(am__append_3) \\\n\t$(am__append_4) $(am__append_5) $(am__append_6) \\\n\t$(am__append_7) $(am__append_8) $(am__append_9)\nnoinst_HEADERS = \\\n\tcrypto_scalarmult/curve25519/sandy2x/consts.S \\\n\tcrypto_scalarmult/curve25519/sandy2x/fe51_mul.S \\\n\tcrypto_scalarmult/curve25519/sandy2x/fe51_nsquare.S \\\n\tcrypto_scalarmult/curve25519/sandy2x/fe51_pack.S \\\n\tcrypto_scalarmult/curve25519/sandy2x/ladder.S \\\n\tcrypto_scalarmult/curve25519/sandy2x/ladder_base.S\n\nlibsodium_la_LDFLAGS = \\\n\t$(AM_LDFLAGS) \\\n\t-export-dynamic \\\n\t-no-undefined \\\n\t$(LIBTOOL_EXTRA_FLAGS)\n\nlibsodium_la_CPPFLAGS = \\\n\t$(LTDLINCL) \\\n\t-I$(srcdir)/include/sodium \\\n\t-I$(builddir)/include/sodium\n\nSUBDIRS = \\\n\tinclude\n\nlibsodium_la_LIBADD = libaesni.la libsse2.la libssse3.la libsse41.la\nnoinst_LTLIBRARIES = libsodium.la libaesni.la libsse2.la libssse3.la libsse41.la\nlibaesni_la_LDFLAGS = $(libsodium_la_LDFLAGS)\nlibaesni_la_CPPFLAGS = $(libsodium_la_CPPFLAGS) \\\n\t@CFLAGS_SSSE3@ @CFLAGS_AESNI@ @CFLAGS_PCLMUL@\n\nlibaesni_la_SOURCES = \\\n\tcrypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c\n\nlibsse2_la_LDFLAGS = $(libsodium_la_LDFLAGS)\nlibsse2_la_CPPFLAGS = $(libsodium_la_CPPFLAGS) \\\n\t@CFLAGS_SSE2@\n\nlibsse2_la_SOURCES = \\\n\tcrypto_pwhash/scryptsalsa208sha256/sse/pwhash_scryptsalsa208sha256_sse.c \\\n\tcrypto_onetimeauth/poly1305/sse2/poly1305_sse2.c \\\n\tcrypto_onetimeauth/poly1305/sse2/poly1305_sse2.h\n\nlibssse3_la_LDFLAGS = $(libsodium_la_LDFLAGS)\nlibssse3_la_CPPFLAGS = $(libsodium_la_CPPFLAGS) \\\n\t@CFLAGS_SSE2@ @CFLAGS_SSSE3@\n\nlibssse3_la_SOURCES = \\\n\tcrypto_generichash/blake2/ref/blake2b-compress-ssse3.c \\\n\tcrypto_stream/chacha20/vec/stream_chacha20_vec.h \\\n\tcrypto_stream/chacha20/vec/stream_chacha20_vec.c\n\nlibsse41_la_LDFLAGS = $(libsodium_la_LDFLAGS)\nlibsse41_la_CPPFLAGS = $(libsodium_la_CPPFLAGS) \\\n\t@CFLAGS_SSE2@ @CFLAGS_SSSE3@ @CFLAGS_SSE41@\n\nlibsse41_la_SOURCES = \\\n\tcrypto_generichash/blake2/ref/blake2b-compress-sse41.c\n\nall: all-recursive\n\n.SUFFIXES:\n.SUFFIXES: .S .c .lo .o .obj\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/libsodium/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign src/libsodium/Makefile\n.PRECIOUS: Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nclean-noinstLTLIBRARIES:\n\t-test -z \"$(noinst_LTLIBRARIES)\" || rm -f $(noinst_LTLIBRARIES)\n\t@list='$(noinst_LTLIBRARIES)'; \\\n\tlocs=`for p in $$list; do echo $$p; done | \\\n\t      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \\\n\t      sort -u`; \\\n\ttest -z \"$$locs\" || { \\\n\t  echo rm -f $${locs}; \\\n\t  rm -f $${locs}; \\\n\t}\ncrypto_aead/aes256gcm/aesni/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_aead/aes256gcm/aesni\n\t@: > crypto_aead/aes256gcm/aesni/$(am__dirstamp)\ncrypto_aead/aes256gcm/aesni/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_aead/aes256gcm/aesni/$(DEPDIR)\n\t@: > crypto_aead/aes256gcm/aesni/$(DEPDIR)/$(am__dirstamp)\ncrypto_aead/aes256gcm/aesni/libaesni_la-aead_aes256gcm_aesni.lo:  \\\n\tcrypto_aead/aes256gcm/aesni/$(am__dirstamp) \\\n\tcrypto_aead/aes256gcm/aesni/$(DEPDIR)/$(am__dirstamp)\n\nlibaesni.la: $(libaesni_la_OBJECTS) $(libaesni_la_DEPENDENCIES) $(EXTRA_libaesni_la_DEPENDENCIES) \n\t$(AM_V_CCLD)$(libaesni_la_LINK)  $(libaesni_la_OBJECTS) $(libaesni_la_LIBADD) $(LIBS)\ncrypto_aead/chacha20poly1305/sodium/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_aead/chacha20poly1305/sodium\n\t@: > crypto_aead/chacha20poly1305/sodium/$(am__dirstamp)\ncrypto_aead/chacha20poly1305/sodium/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_aead/chacha20poly1305/sodium/$(DEPDIR)\n\t@: > crypto_aead/chacha20poly1305/sodium/$(DEPDIR)/$(am__dirstamp)\ncrypto_aead/chacha20poly1305/sodium/libsodium_la-aead_chacha20poly1305.lo:  \\\n\tcrypto_aead/chacha20poly1305/sodium/$(am__dirstamp) \\\n\tcrypto_aead/chacha20poly1305/sodium/$(DEPDIR)/$(am__dirstamp)\ncrypto_auth/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_auth\n\t@: > crypto_auth/$(am__dirstamp)\ncrypto_auth/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_auth/$(DEPDIR)\n\t@: > crypto_auth/$(DEPDIR)/$(am__dirstamp)\ncrypto_auth/libsodium_la-crypto_auth.lo: crypto_auth/$(am__dirstamp) \\\n\tcrypto_auth/$(DEPDIR)/$(am__dirstamp)\ncrypto_auth/hmacsha256/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_auth/hmacsha256\n\t@: > crypto_auth/hmacsha256/$(am__dirstamp)\ncrypto_auth/hmacsha256/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_auth/hmacsha256/$(DEPDIR)\n\t@: > crypto_auth/hmacsha256/$(DEPDIR)/$(am__dirstamp)\ncrypto_auth/hmacsha256/libsodium_la-auth_hmacsha256_api.lo:  \\\n\tcrypto_auth/hmacsha256/$(am__dirstamp) \\\n\tcrypto_auth/hmacsha256/$(DEPDIR)/$(am__dirstamp)\ncrypto_auth/hmacsha256/cp/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_auth/hmacsha256/cp\n\t@: > crypto_auth/hmacsha256/cp/$(am__dirstamp)\ncrypto_auth/hmacsha256/cp/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_auth/hmacsha256/cp/$(DEPDIR)\n\t@: > crypto_auth/hmacsha256/cp/$(DEPDIR)/$(am__dirstamp)\ncrypto_auth/hmacsha256/cp/libsodium_la-hmac_hmacsha256.lo:  \\\n\tcrypto_auth/hmacsha256/cp/$(am__dirstamp) \\\n\tcrypto_auth/hmacsha256/cp/$(DEPDIR)/$(am__dirstamp)\ncrypto_auth/hmacsha256/cp/libsodium_la-verify_hmacsha256.lo:  \\\n\tcrypto_auth/hmacsha256/cp/$(am__dirstamp) \\\n\tcrypto_auth/hmacsha256/cp/$(DEPDIR)/$(am__dirstamp)\ncrypto_auth/hmacsha512/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_auth/hmacsha512\n\t@: > crypto_auth/hmacsha512/$(am__dirstamp)\ncrypto_auth/hmacsha512/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_auth/hmacsha512/$(DEPDIR)\n\t@: > crypto_auth/hmacsha512/$(DEPDIR)/$(am__dirstamp)\ncrypto_auth/hmacsha512/libsodium_la-auth_hmacsha512_api.lo:  \\\n\tcrypto_auth/hmacsha512/$(am__dirstamp) \\\n\tcrypto_auth/hmacsha512/$(DEPDIR)/$(am__dirstamp)\ncrypto_auth/hmacsha512/cp/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_auth/hmacsha512/cp\n\t@: > crypto_auth/hmacsha512/cp/$(am__dirstamp)\ncrypto_auth/hmacsha512/cp/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_auth/hmacsha512/cp/$(DEPDIR)\n\t@: > crypto_auth/hmacsha512/cp/$(DEPDIR)/$(am__dirstamp)\ncrypto_auth/hmacsha512/cp/libsodium_la-hmac_hmacsha512.lo:  \\\n\tcrypto_auth/hmacsha512/cp/$(am__dirstamp) \\\n\tcrypto_auth/hmacsha512/cp/$(DEPDIR)/$(am__dirstamp)\ncrypto_auth/hmacsha512/cp/libsodium_la-verify_hmacsha512.lo:  \\\n\tcrypto_auth/hmacsha512/cp/$(am__dirstamp) \\\n\tcrypto_auth/hmacsha512/cp/$(DEPDIR)/$(am__dirstamp)\ncrypto_auth/hmacsha512256/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_auth/hmacsha512256\n\t@: > crypto_auth/hmacsha512256/$(am__dirstamp)\ncrypto_auth/hmacsha512256/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_auth/hmacsha512256/$(DEPDIR)\n\t@: > crypto_auth/hmacsha512256/$(DEPDIR)/$(am__dirstamp)\ncrypto_auth/hmacsha512256/libsodium_la-auth_hmacsha512256_api.lo:  \\\n\tcrypto_auth/hmacsha512256/$(am__dirstamp) \\\n\tcrypto_auth/hmacsha512256/$(DEPDIR)/$(am__dirstamp)\ncrypto_auth/hmacsha512256/cp/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_auth/hmacsha512256/cp\n\t@: > crypto_auth/hmacsha512256/cp/$(am__dirstamp)\ncrypto_auth/hmacsha512256/cp/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_auth/hmacsha512256/cp/$(DEPDIR)\n\t@: > crypto_auth/hmacsha512256/cp/$(DEPDIR)/$(am__dirstamp)\ncrypto_auth/hmacsha512256/cp/libsodium_la-hmac_hmacsha512256.lo:  \\\n\tcrypto_auth/hmacsha512256/cp/$(am__dirstamp) \\\n\tcrypto_auth/hmacsha512256/cp/$(DEPDIR)/$(am__dirstamp)\ncrypto_auth/hmacsha512256/cp/libsodium_la-verify_hmacsha512256.lo:  \\\n\tcrypto_auth/hmacsha512256/cp/$(am__dirstamp) \\\n\tcrypto_auth/hmacsha512256/cp/$(DEPDIR)/$(am__dirstamp)\ncrypto_box/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_box\n\t@: > crypto_box/$(am__dirstamp)\ncrypto_box/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_box/$(DEPDIR)\n\t@: > crypto_box/$(DEPDIR)/$(am__dirstamp)\ncrypto_box/libsodium_la-crypto_box.lo: crypto_box/$(am__dirstamp) \\\n\tcrypto_box/$(DEPDIR)/$(am__dirstamp)\ncrypto_box/libsodium_la-crypto_box_easy.lo:  \\\n\tcrypto_box/$(am__dirstamp) \\\n\tcrypto_box/$(DEPDIR)/$(am__dirstamp)\ncrypto_box/libsodium_la-crypto_box_seal.lo:  \\\n\tcrypto_box/$(am__dirstamp) \\\n\tcrypto_box/$(DEPDIR)/$(am__dirstamp)\ncrypto_box/curve25519xsalsa20poly1305/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_box/curve25519xsalsa20poly1305\n\t@: > crypto_box/curve25519xsalsa20poly1305/$(am__dirstamp)\ncrypto_box/curve25519xsalsa20poly1305/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_box/curve25519xsalsa20poly1305/$(DEPDIR)\n\t@: > crypto_box/curve25519xsalsa20poly1305/$(DEPDIR)/$(am__dirstamp)\ncrypto_box/curve25519xsalsa20poly1305/libsodium_la-box_curve25519xsalsa20poly1305_api.lo:  \\\n\tcrypto_box/curve25519xsalsa20poly1305/$(am__dirstamp) \\\n\tcrypto_box/curve25519xsalsa20poly1305/$(DEPDIR)/$(am__dirstamp)\ncrypto_box/curve25519xsalsa20poly1305/ref/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_box/curve25519xsalsa20poly1305/ref\n\t@: > crypto_box/curve25519xsalsa20poly1305/ref/$(am__dirstamp)\ncrypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)\n\t@: > crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-after_curve25519xsalsa20poly1305.lo:  \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/$(am__dirstamp) \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-before_curve25519xsalsa20poly1305.lo:  \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/$(am__dirstamp) \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-box_curve25519xsalsa20poly1305.lo:  \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/$(am__dirstamp) \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-keypair_curve25519xsalsa20poly1305.lo:  \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/$(am__dirstamp) \\\n\tcrypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_core/hsalsa20/ref2/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_core/hsalsa20/ref2\n\t@: > crypto_core/hsalsa20/ref2/$(am__dirstamp)\ncrypto_core/hsalsa20/ref2/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_core/hsalsa20/ref2/$(DEPDIR)\n\t@: > crypto_core/hsalsa20/ref2/$(DEPDIR)/$(am__dirstamp)\ncrypto_core/hsalsa20/ref2/libsodium_la-core_hsalsa20.lo:  \\\n\tcrypto_core/hsalsa20/ref2/$(am__dirstamp) \\\n\tcrypto_core/hsalsa20/ref2/$(DEPDIR)/$(am__dirstamp)\ncrypto_core/hsalsa20/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_core/hsalsa20\n\t@: > crypto_core/hsalsa20/$(am__dirstamp)\ncrypto_core/hsalsa20/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_core/hsalsa20/$(DEPDIR)\n\t@: > crypto_core/hsalsa20/$(DEPDIR)/$(am__dirstamp)\ncrypto_core/hsalsa20/libsodium_la-core_hsalsa20_api.lo:  \\\n\tcrypto_core/hsalsa20/$(am__dirstamp) \\\n\tcrypto_core/hsalsa20/$(DEPDIR)/$(am__dirstamp)\ncrypto_core/salsa20/ref/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_core/salsa20/ref\n\t@: > crypto_core/salsa20/ref/$(am__dirstamp)\ncrypto_core/salsa20/ref/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_core/salsa20/ref/$(DEPDIR)\n\t@: > crypto_core/salsa20/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_core/salsa20/ref/libsodium_la-core_salsa20.lo:  \\\n\tcrypto_core/salsa20/ref/$(am__dirstamp) \\\n\tcrypto_core/salsa20/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_core/salsa20/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_core/salsa20\n\t@: > crypto_core/salsa20/$(am__dirstamp)\ncrypto_core/salsa20/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_core/salsa20/$(DEPDIR)\n\t@: > crypto_core/salsa20/$(DEPDIR)/$(am__dirstamp)\ncrypto_core/salsa20/libsodium_la-core_salsa20_api.lo:  \\\n\tcrypto_core/salsa20/$(am__dirstamp) \\\n\tcrypto_core/salsa20/$(DEPDIR)/$(am__dirstamp)\ncrypto_generichash/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_generichash\n\t@: > crypto_generichash/$(am__dirstamp)\ncrypto_generichash/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_generichash/$(DEPDIR)\n\t@: > crypto_generichash/$(DEPDIR)/$(am__dirstamp)\ncrypto_generichash/libsodium_la-crypto_generichash.lo:  \\\n\tcrypto_generichash/$(am__dirstamp) \\\n\tcrypto_generichash/$(DEPDIR)/$(am__dirstamp)\ncrypto_generichash/blake2/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_generichash/blake2\n\t@: > crypto_generichash/blake2/$(am__dirstamp)\ncrypto_generichash/blake2/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_generichash/blake2/$(DEPDIR)\n\t@: > crypto_generichash/blake2/$(DEPDIR)/$(am__dirstamp)\ncrypto_generichash/blake2/libsodium_la-generichash_blake2_api.lo:  \\\n\tcrypto_generichash/blake2/$(am__dirstamp) \\\n\tcrypto_generichash/blake2/$(DEPDIR)/$(am__dirstamp)\ncrypto_generichash/blake2/ref/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_generichash/blake2/ref\n\t@: > crypto_generichash/blake2/ref/$(am__dirstamp)\ncrypto_generichash/blake2/ref/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_generichash/blake2/ref/$(DEPDIR)\n\t@: > crypto_generichash/blake2/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_generichash/blake2/ref/libsodium_la-blake2b-compress-ref.lo:  \\\n\tcrypto_generichash/blake2/ref/$(am__dirstamp) \\\n\tcrypto_generichash/blake2/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_generichash/blake2/ref/libsodium_la-blake2b-ref.lo:  \\\n\tcrypto_generichash/blake2/ref/$(am__dirstamp) \\\n\tcrypto_generichash/blake2/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_generichash/blake2/ref/libsodium_la-generichash_blake2b.lo:  \\\n\tcrypto_generichash/blake2/ref/$(am__dirstamp) \\\n\tcrypto_generichash/blake2/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_hash/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_hash\n\t@: > crypto_hash/$(am__dirstamp)\ncrypto_hash/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_hash/$(DEPDIR)\n\t@: > crypto_hash/$(DEPDIR)/$(am__dirstamp)\ncrypto_hash/libsodium_la-crypto_hash.lo: crypto_hash/$(am__dirstamp) \\\n\tcrypto_hash/$(DEPDIR)/$(am__dirstamp)\ncrypto_hash/sha256/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_hash/sha256\n\t@: > crypto_hash/sha256/$(am__dirstamp)\ncrypto_hash/sha256/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_hash/sha256/$(DEPDIR)\n\t@: > crypto_hash/sha256/$(DEPDIR)/$(am__dirstamp)\ncrypto_hash/sha256/libsodium_la-hash_sha256_api.lo:  \\\n\tcrypto_hash/sha256/$(am__dirstamp) \\\n\tcrypto_hash/sha256/$(DEPDIR)/$(am__dirstamp)\ncrypto_hash/sha256/cp/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_hash/sha256/cp\n\t@: > crypto_hash/sha256/cp/$(am__dirstamp)\ncrypto_hash/sha256/cp/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_hash/sha256/cp/$(DEPDIR)\n\t@: > crypto_hash/sha256/cp/$(DEPDIR)/$(am__dirstamp)\ncrypto_hash/sha256/cp/libsodium_la-hash_sha256.lo:  \\\n\tcrypto_hash/sha256/cp/$(am__dirstamp) \\\n\tcrypto_hash/sha256/cp/$(DEPDIR)/$(am__dirstamp)\ncrypto_hash/sha512/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_hash/sha512\n\t@: > crypto_hash/sha512/$(am__dirstamp)\ncrypto_hash/sha512/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_hash/sha512/$(DEPDIR)\n\t@: > crypto_hash/sha512/$(DEPDIR)/$(am__dirstamp)\ncrypto_hash/sha512/libsodium_la-hash_sha512_api.lo:  \\\n\tcrypto_hash/sha512/$(am__dirstamp) \\\n\tcrypto_hash/sha512/$(DEPDIR)/$(am__dirstamp)\ncrypto_hash/sha512/cp/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_hash/sha512/cp\n\t@: > crypto_hash/sha512/cp/$(am__dirstamp)\ncrypto_hash/sha512/cp/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_hash/sha512/cp/$(DEPDIR)\n\t@: > crypto_hash/sha512/cp/$(DEPDIR)/$(am__dirstamp)\ncrypto_hash/sha512/cp/libsodium_la-hash_sha512.lo:  \\\n\tcrypto_hash/sha512/cp/$(am__dirstamp) \\\n\tcrypto_hash/sha512/cp/$(DEPDIR)/$(am__dirstamp)\ncrypto_onetimeauth/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_onetimeauth\n\t@: > crypto_onetimeauth/$(am__dirstamp)\ncrypto_onetimeauth/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_onetimeauth/$(DEPDIR)\n\t@: > crypto_onetimeauth/$(DEPDIR)/$(am__dirstamp)\ncrypto_onetimeauth/libsodium_la-crypto_onetimeauth.lo:  \\\n\tcrypto_onetimeauth/$(am__dirstamp) \\\n\tcrypto_onetimeauth/$(DEPDIR)/$(am__dirstamp)\ncrypto_onetimeauth/poly1305/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_onetimeauth/poly1305\n\t@: > crypto_onetimeauth/poly1305/$(am__dirstamp)\ncrypto_onetimeauth/poly1305/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_onetimeauth/poly1305/$(DEPDIR)\n\t@: > crypto_onetimeauth/poly1305/$(DEPDIR)/$(am__dirstamp)\ncrypto_onetimeauth/poly1305/libsodium_la-onetimeauth_poly1305.lo:  \\\n\tcrypto_onetimeauth/poly1305/$(am__dirstamp) \\\n\tcrypto_onetimeauth/poly1305/$(DEPDIR)/$(am__dirstamp)\ncrypto_onetimeauth/poly1305/donna/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_onetimeauth/poly1305/donna\n\t@: > crypto_onetimeauth/poly1305/donna/$(am__dirstamp)\ncrypto_onetimeauth/poly1305/donna/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_onetimeauth/poly1305/donna/$(DEPDIR)\n\t@: > crypto_onetimeauth/poly1305/donna/$(DEPDIR)/$(am__dirstamp)\ncrypto_onetimeauth/poly1305/donna/libsodium_la-poly1305_donna.lo:  \\\n\tcrypto_onetimeauth/poly1305/donna/$(am__dirstamp) \\\n\tcrypto_onetimeauth/poly1305/donna/$(DEPDIR)/$(am__dirstamp)\ncrypto_pwhash/scryptsalsa208sha256/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_pwhash/scryptsalsa208sha256\n\t@: > crypto_pwhash/scryptsalsa208sha256/$(am__dirstamp)\ncrypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)\n\t@: > crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/$(am__dirstamp)\ncrypto_pwhash/scryptsalsa208sha256/libsodium_la-crypto_scrypt-common.lo:  \\\n\tcrypto_pwhash/scryptsalsa208sha256/$(am__dirstamp) \\\n\tcrypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/$(am__dirstamp)\ncrypto_pwhash/scryptsalsa208sha256/libsodium_la-scrypt_platform.lo:  \\\n\tcrypto_pwhash/scryptsalsa208sha256/$(am__dirstamp) \\\n\tcrypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/$(am__dirstamp)\ncrypto_pwhash/scryptsalsa208sha256/libsodium_la-pbkdf2-sha256.lo:  \\\n\tcrypto_pwhash/scryptsalsa208sha256/$(am__dirstamp) \\\n\tcrypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/$(am__dirstamp)\ncrypto_pwhash/scryptsalsa208sha256/libsodium_la-pwhash_scryptsalsa208sha256.lo:  \\\n\tcrypto_pwhash/scryptsalsa208sha256/$(am__dirstamp) \\\n\tcrypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/$(am__dirstamp)\ncrypto_pwhash/scryptsalsa208sha256/nosse/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_pwhash/scryptsalsa208sha256/nosse\n\t@: > crypto_pwhash/scryptsalsa208sha256/nosse/$(am__dirstamp)\ncrypto_pwhash/scryptsalsa208sha256/nosse/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_pwhash/scryptsalsa208sha256/nosse/$(DEPDIR)\n\t@: > crypto_pwhash/scryptsalsa208sha256/nosse/$(DEPDIR)/$(am__dirstamp)\ncrypto_pwhash/scryptsalsa208sha256/nosse/libsodium_la-pwhash_scryptsalsa208sha256_nosse.lo:  \\\n\tcrypto_pwhash/scryptsalsa208sha256/nosse/$(am__dirstamp) \\\n\tcrypto_pwhash/scryptsalsa208sha256/nosse/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_scalarmult\n\t@: > crypto_scalarmult/$(am__dirstamp)\ncrypto_scalarmult/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_scalarmult/$(DEPDIR)\n\t@: > crypto_scalarmult/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/libsodium_la-crypto_scalarmult.lo:  \\\n\tcrypto_scalarmult/$(am__dirstamp) \\\n\tcrypto_scalarmult/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_scalarmult/curve25519\n\t@: > crypto_scalarmult/curve25519/$(am__dirstamp)\ncrypto_scalarmult/curve25519/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_scalarmult/curve25519/$(DEPDIR)\n\t@: > crypto_scalarmult/curve25519/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/libsodium_la-scalarmult_curve25519.lo:  \\\n\tcrypto_scalarmult/curve25519/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/$(DEPDIR)/$(am__dirstamp)\ncrypto_secretbox/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_secretbox\n\t@: > crypto_secretbox/$(am__dirstamp)\ncrypto_secretbox/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_secretbox/$(DEPDIR)\n\t@: > crypto_secretbox/$(DEPDIR)/$(am__dirstamp)\ncrypto_secretbox/libsodium_la-crypto_secretbox.lo:  \\\n\tcrypto_secretbox/$(am__dirstamp) \\\n\tcrypto_secretbox/$(DEPDIR)/$(am__dirstamp)\ncrypto_secretbox/libsodium_la-crypto_secretbox_easy.lo:  \\\n\tcrypto_secretbox/$(am__dirstamp) \\\n\tcrypto_secretbox/$(DEPDIR)/$(am__dirstamp)\ncrypto_secretbox/xsalsa20poly1305/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_secretbox/xsalsa20poly1305\n\t@: > crypto_secretbox/xsalsa20poly1305/$(am__dirstamp)\ncrypto_secretbox/xsalsa20poly1305/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_secretbox/xsalsa20poly1305/$(DEPDIR)\n\t@: > crypto_secretbox/xsalsa20poly1305/$(DEPDIR)/$(am__dirstamp)\ncrypto_secretbox/xsalsa20poly1305/libsodium_la-secretbox_xsalsa20poly1305_api.lo:  \\\n\tcrypto_secretbox/xsalsa20poly1305/$(am__dirstamp) \\\n\tcrypto_secretbox/xsalsa20poly1305/$(DEPDIR)/$(am__dirstamp)\ncrypto_secretbox/xsalsa20poly1305/ref/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_secretbox/xsalsa20poly1305/ref\n\t@: > crypto_secretbox/xsalsa20poly1305/ref/$(am__dirstamp)\ncrypto_secretbox/xsalsa20poly1305/ref/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_secretbox/xsalsa20poly1305/ref/$(DEPDIR)\n\t@: > crypto_secretbox/xsalsa20poly1305/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_secretbox/xsalsa20poly1305/ref/libsodium_la-box_xsalsa20poly1305.lo:  \\\n\tcrypto_secretbox/xsalsa20poly1305/ref/$(am__dirstamp) \\\n\tcrypto_secretbox/xsalsa20poly1305/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_shorthash/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_shorthash\n\t@: > crypto_shorthash/$(am__dirstamp)\ncrypto_shorthash/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_shorthash/$(DEPDIR)\n\t@: > crypto_shorthash/$(DEPDIR)/$(am__dirstamp)\ncrypto_shorthash/libsodium_la-crypto_shorthash.lo:  \\\n\tcrypto_shorthash/$(am__dirstamp) \\\n\tcrypto_shorthash/$(DEPDIR)/$(am__dirstamp)\ncrypto_shorthash/siphash24/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_shorthash/siphash24\n\t@: > crypto_shorthash/siphash24/$(am__dirstamp)\ncrypto_shorthash/siphash24/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_shorthash/siphash24/$(DEPDIR)\n\t@: > crypto_shorthash/siphash24/$(DEPDIR)/$(am__dirstamp)\ncrypto_shorthash/siphash24/libsodium_la-shorthash_siphash24_api.lo:  \\\n\tcrypto_shorthash/siphash24/$(am__dirstamp) \\\n\tcrypto_shorthash/siphash24/$(DEPDIR)/$(am__dirstamp)\ncrypto_shorthash/siphash24/ref/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_shorthash/siphash24/ref\n\t@: > crypto_shorthash/siphash24/ref/$(am__dirstamp)\ncrypto_shorthash/siphash24/ref/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_shorthash/siphash24/ref/$(DEPDIR)\n\t@: > crypto_shorthash/siphash24/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_shorthash/siphash24/ref/libsodium_la-shorthash_siphash24.lo:  \\\n\tcrypto_shorthash/siphash24/ref/$(am__dirstamp) \\\n\tcrypto_shorthash/siphash24/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_sign\n\t@: > crypto_sign/$(am__dirstamp)\ncrypto_sign/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_sign/$(DEPDIR)\n\t@: > crypto_sign/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/libsodium_la-crypto_sign.lo: crypto_sign/$(am__dirstamp) \\\n\tcrypto_sign/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_sign/ed25519\n\t@: > crypto_sign/ed25519/$(am__dirstamp)\ncrypto_sign/ed25519/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_sign/ed25519/$(DEPDIR)\n\t@: > crypto_sign/ed25519/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/libsodium_la-sign_ed25519_api.lo:  \\\n\tcrypto_sign/ed25519/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_sign/ed25519/ref10\n\t@: > crypto_sign/ed25519/ref10/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_sign/ed25519/ref10/$(DEPDIR)\n\t@: > crypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-fe_0.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-fe_1.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-fe_add.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-fe_cmov.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-fe_copy.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-fe_frombytes.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-fe_invert.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-fe_isnegative.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-fe_isnonzero.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-fe_mul.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-fe_neg.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-fe_pow22523.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-fe_sq.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-fe_sq2.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-fe_sub.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-fe_tobytes.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_add.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_double_scalarmult.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_frombytes.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_madd.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_msub.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p1p1_to_p2.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p1p1_to_p3.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p2_0.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p2_dbl.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p3_0.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p3_dbl.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p3_to_cached.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p3_to_p2.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p3_tobytes.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_precomp_0.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_scalarmult_base.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_sub.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-ge_tobytes.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-keypair.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-open.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-sc_muladd.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-sc_reduce.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-sign.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream\n\t@: > crypto_stream/$(am__dirstamp)\ncrypto_stream/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/$(DEPDIR)\n\t@: > crypto_stream/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/libsodium_la-crypto_stream.lo:  \\\n\tcrypto_stream/$(am__dirstamp) \\\n\tcrypto_stream/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/chacha20/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/chacha20\n\t@: > crypto_stream/chacha20/$(am__dirstamp)\ncrypto_stream/chacha20/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/chacha20/$(DEPDIR)\n\t@: > crypto_stream/chacha20/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/chacha20/libsodium_la-stream_chacha20.lo:  \\\n\tcrypto_stream/chacha20/$(am__dirstamp) \\\n\tcrypto_stream/chacha20/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/chacha20/ref/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/chacha20/ref\n\t@: > crypto_stream/chacha20/ref/$(am__dirstamp)\ncrypto_stream/chacha20/ref/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/chacha20/ref/$(DEPDIR)\n\t@: > crypto_stream/chacha20/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/chacha20/ref/libsodium_la-stream_chacha20_ref.lo:  \\\n\tcrypto_stream/chacha20/ref/$(am__dirstamp) \\\n\tcrypto_stream/chacha20/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/salsa20/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/salsa20\n\t@: > crypto_stream/salsa20/$(am__dirstamp)\ncrypto_stream/salsa20/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/salsa20/$(DEPDIR)\n\t@: > crypto_stream/salsa20/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/salsa20/libsodium_la-stream_salsa20_api.lo:  \\\n\tcrypto_stream/salsa20/$(am__dirstamp) \\\n\tcrypto_stream/salsa20/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/xsalsa20/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/xsalsa20\n\t@: > crypto_stream/xsalsa20/$(am__dirstamp)\ncrypto_stream/xsalsa20/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/xsalsa20/$(DEPDIR)\n\t@: > crypto_stream/xsalsa20/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/xsalsa20/libsodium_la-stream_xsalsa20_api.lo:  \\\n\tcrypto_stream/xsalsa20/$(am__dirstamp) \\\n\tcrypto_stream/xsalsa20/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/xsalsa20/ref/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/xsalsa20/ref\n\t@: > crypto_stream/xsalsa20/ref/$(am__dirstamp)\ncrypto_stream/xsalsa20/ref/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/xsalsa20/ref/$(DEPDIR)\n\t@: > crypto_stream/xsalsa20/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/xsalsa20/ref/libsodium_la-stream_xsalsa20.lo:  \\\n\tcrypto_stream/xsalsa20/ref/$(am__dirstamp) \\\n\tcrypto_stream/xsalsa20/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/xsalsa20/ref/libsodium_la-xor_xsalsa20.lo:  \\\n\tcrypto_stream/xsalsa20/ref/$(am__dirstamp) \\\n\tcrypto_stream/xsalsa20/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_verify/16/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_verify/16\n\t@: > crypto_verify/16/$(am__dirstamp)\ncrypto_verify/16/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_verify/16/$(DEPDIR)\n\t@: > crypto_verify/16/$(DEPDIR)/$(am__dirstamp)\ncrypto_verify/16/libsodium_la-verify_16_api.lo:  \\\n\tcrypto_verify/16/$(am__dirstamp) \\\n\tcrypto_verify/16/$(DEPDIR)/$(am__dirstamp)\ncrypto_verify/16/ref/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_verify/16/ref\n\t@: > crypto_verify/16/ref/$(am__dirstamp)\ncrypto_verify/16/ref/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_verify/16/ref/$(DEPDIR)\n\t@: > crypto_verify/16/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_verify/16/ref/libsodium_la-verify_16.lo:  \\\n\tcrypto_verify/16/ref/$(am__dirstamp) \\\n\tcrypto_verify/16/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_verify/32/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_verify/32\n\t@: > crypto_verify/32/$(am__dirstamp)\ncrypto_verify/32/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_verify/32/$(DEPDIR)\n\t@: > crypto_verify/32/$(DEPDIR)/$(am__dirstamp)\ncrypto_verify/32/libsodium_la-verify_32_api.lo:  \\\n\tcrypto_verify/32/$(am__dirstamp) \\\n\tcrypto_verify/32/$(DEPDIR)/$(am__dirstamp)\ncrypto_verify/32/ref/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_verify/32/ref\n\t@: > crypto_verify/32/ref/$(am__dirstamp)\ncrypto_verify/32/ref/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_verify/32/ref/$(DEPDIR)\n\t@: > crypto_verify/32/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_verify/32/ref/libsodium_la-verify_32.lo:  \\\n\tcrypto_verify/32/ref/$(am__dirstamp) \\\n\tcrypto_verify/32/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_verify/64/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_verify/64\n\t@: > crypto_verify/64/$(am__dirstamp)\ncrypto_verify/64/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_verify/64/$(DEPDIR)\n\t@: > crypto_verify/64/$(DEPDIR)/$(am__dirstamp)\ncrypto_verify/64/libsodium_la-verify_64_api.lo:  \\\n\tcrypto_verify/64/$(am__dirstamp) \\\n\tcrypto_verify/64/$(DEPDIR)/$(am__dirstamp)\ncrypto_verify/64/ref/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_verify/64/ref\n\t@: > crypto_verify/64/ref/$(am__dirstamp)\ncrypto_verify/64/ref/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_verify/64/ref/$(DEPDIR)\n\t@: > crypto_verify/64/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_verify/64/ref/libsodium_la-verify_64.lo:  \\\n\tcrypto_verify/64/ref/$(am__dirstamp) \\\n\tcrypto_verify/64/ref/$(DEPDIR)/$(am__dirstamp)\nrandombytes/$(am__dirstamp):\n\t@$(MKDIR_P) randombytes\n\t@: > randombytes/$(am__dirstamp)\nrandombytes/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) randombytes/$(DEPDIR)\n\t@: > randombytes/$(DEPDIR)/$(am__dirstamp)\nrandombytes/libsodium_la-randombytes.lo: randombytes/$(am__dirstamp) \\\n\trandombytes/$(DEPDIR)/$(am__dirstamp)\nsodium/$(am__dirstamp):\n\t@$(MKDIR_P) sodium\n\t@: > sodium/$(am__dirstamp)\nsodium/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) sodium/$(DEPDIR)\n\t@: > sodium/$(DEPDIR)/$(am__dirstamp)\nsodium/libsodium_la-core.lo: sodium/$(am__dirstamp) \\\n\tsodium/$(DEPDIR)/$(am__dirstamp)\nsodium/libsodium_la-runtime.lo: sodium/$(am__dirstamp) \\\n\tsodium/$(DEPDIR)/$(am__dirstamp)\nsodium/libsodium_la-utils.lo: sodium/$(am__dirstamp) \\\n\tsodium/$(DEPDIR)/$(am__dirstamp)\nsodium/libsodium_la-version.lo: sodium/$(am__dirstamp) \\\n\tsodium/$(DEPDIR)/$(am__dirstamp)\nrandombytes/salsa20/$(am__dirstamp):\n\t@$(MKDIR_P) randombytes/salsa20\n\t@: > randombytes/salsa20/$(am__dirstamp)\nrandombytes/salsa20/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) randombytes/salsa20/$(DEPDIR)\n\t@: > randombytes/salsa20/$(DEPDIR)/$(am__dirstamp)\nrandombytes/salsa20/libsodium_la-randombytes_salsa20_random.lo:  \\\n\trandombytes/salsa20/$(am__dirstamp) \\\n\trandombytes/salsa20/$(DEPDIR)/$(am__dirstamp)\nrandombytes/nativeclient/$(am__dirstamp):\n\t@$(MKDIR_P) randombytes/nativeclient\n\t@: > randombytes/nativeclient/$(am__dirstamp)\nrandombytes/nativeclient/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) randombytes/nativeclient/$(DEPDIR)\n\t@: > randombytes/nativeclient/$(DEPDIR)/$(am__dirstamp)\nrandombytes/nativeclient/libsodium_la-randombytes_nativeclient.lo:  \\\n\trandombytes/nativeclient/$(am__dirstamp) \\\n\trandombytes/nativeclient/$(DEPDIR)/$(am__dirstamp)\nrandombytes/sysrandom/$(am__dirstamp):\n\t@$(MKDIR_P) randombytes/sysrandom\n\t@: > randombytes/sysrandom/$(am__dirstamp)\nrandombytes/sysrandom/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) randombytes/sysrandom/$(DEPDIR)\n\t@: > randombytes/sysrandom/$(DEPDIR)/$(am__dirstamp)\nrandombytes/sysrandom/libsodium_la-randombytes_sysrandom.lo:  \\\n\trandombytes/sysrandom/$(am__dirstamp) \\\n\trandombytes/sysrandom/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/donna_c64/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_scalarmult/curve25519/donna_c64\n\t@: > crypto_scalarmult/curve25519/donna_c64/$(am__dirstamp)\ncrypto_scalarmult/curve25519/donna_c64/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_scalarmult/curve25519/donna_c64/$(DEPDIR)\n\t@: > crypto_scalarmult/curve25519/donna_c64/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/donna_c64/libsodium_la-curve25519_donna_c64.lo:  \\\n\tcrypto_scalarmult/curve25519/donna_c64/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/donna_c64/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/ref10/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_scalarmult/curve25519/ref10\n\t@: > crypto_scalarmult/curve25519/ref10/$(am__dirstamp)\ncrypto_scalarmult/curve25519/ref10/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_scalarmult/curve25519/ref10/$(DEPDIR)\n\t@: > crypto_scalarmult/curve25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/ref10/libsodium_la-curve25519_ref10.lo:  \\\n\tcrypto_scalarmult/curve25519/ref10/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_0_curve25519_ref10.lo:  \\\n\tcrypto_scalarmult/curve25519/ref10/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_1_curve25519_ref10.lo:  \\\n\tcrypto_scalarmult/curve25519/ref10/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_add_curve25519_ref10.lo:  \\\n\tcrypto_scalarmult/curve25519/ref10/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_copy_curve25519_ref10.lo:  \\\n\tcrypto_scalarmult/curve25519/ref10/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_cswap_curve25519_ref10.lo:  \\\n\tcrypto_scalarmult/curve25519/ref10/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_frombytes_curve25519_ref10.lo:  \\\n\tcrypto_scalarmult/curve25519/ref10/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_invert_curve25519_ref10.lo:  \\\n\tcrypto_scalarmult/curve25519/ref10/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_mul_curve25519_ref10.lo:  \\\n\tcrypto_scalarmult/curve25519/ref10/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_mul121666_curve25519_ref10.lo:  \\\n\tcrypto_scalarmult/curve25519/ref10/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_sq_curve25519_ref10.lo:  \\\n\tcrypto_scalarmult/curve25519/ref10/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_sub_curve25519_ref10.lo:  \\\n\tcrypto_scalarmult/curve25519/ref10/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_tobytes_curve25519_ref10.lo:  \\\n\tcrypto_scalarmult/curve25519/ref10/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/sandy2x/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_scalarmult/curve25519/sandy2x\n\t@: > crypto_scalarmult/curve25519/sandy2x/$(am__dirstamp)\ncrypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)\n\t@: > crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/sandy2x/libsodium_la-curve25519_sandy2x.lo:  \\\n\tcrypto_scalarmult/curve25519/sandy2x/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/sandy2x/libsodium_la-fe51_invert.lo:  \\\n\tcrypto_scalarmult/curve25519/sandy2x/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/sandy2x/libsodium_la-fe_frombytes_sandy2x.lo:  \\\n\tcrypto_scalarmult/curve25519/sandy2x/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/$(am__dirstamp)\ncrypto_scalarmult/curve25519/sandy2x/libsodium_la-sandy2x.lo:  \\\n\tcrypto_scalarmult/curve25519/sandy2x/$(am__dirstamp) \\\n\tcrypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/salsa20/amd64_xmm6/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/salsa20/amd64_xmm6\n\t@: > crypto_stream/salsa20/amd64_xmm6/$(am__dirstamp)\ncrypto_stream/salsa20/amd64_xmm6/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/salsa20/amd64_xmm6/$(DEPDIR)\n\t@: > crypto_stream/salsa20/amd64_xmm6/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/salsa20/amd64_xmm6/libsodium_la-stream_salsa20_amd64_xmm6.lo:  \\\n\tcrypto_stream/salsa20/amd64_xmm6/$(am__dirstamp) \\\n\tcrypto_stream/salsa20/amd64_xmm6/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/salsa20/ref/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/salsa20/ref\n\t@: > crypto_stream/salsa20/ref/$(am__dirstamp)\ncrypto_stream/salsa20/ref/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/salsa20/ref/$(DEPDIR)\n\t@: > crypto_stream/salsa20/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/salsa20/ref/libsodium_la-stream_salsa20_ref.lo:  \\\n\tcrypto_stream/salsa20/ref/$(am__dirstamp) \\\n\tcrypto_stream/salsa20/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/salsa20/ref/libsodium_la-xor_salsa20_ref.lo:  \\\n\tcrypto_stream/salsa20/ref/$(am__dirstamp) \\\n\tcrypto_stream/salsa20/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_core/salsa2012/ref/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_core/salsa2012/ref\n\t@: > crypto_core/salsa2012/ref/$(am__dirstamp)\ncrypto_core/salsa2012/ref/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_core/salsa2012/ref/$(DEPDIR)\n\t@: > crypto_core/salsa2012/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_core/salsa2012/ref/libsodium_la-core_salsa2012.lo:  \\\n\tcrypto_core/salsa2012/ref/$(am__dirstamp) \\\n\tcrypto_core/salsa2012/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_core/salsa2012/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_core/salsa2012\n\t@: > crypto_core/salsa2012/$(am__dirstamp)\ncrypto_core/salsa2012/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_core/salsa2012/$(DEPDIR)\n\t@: > crypto_core/salsa2012/$(DEPDIR)/$(am__dirstamp)\ncrypto_core/salsa2012/libsodium_la-core_salsa2012_api.lo:  \\\n\tcrypto_core/salsa2012/$(am__dirstamp) \\\n\tcrypto_core/salsa2012/$(DEPDIR)/$(am__dirstamp)\ncrypto_core/salsa208/ref/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_core/salsa208/ref\n\t@: > crypto_core/salsa208/ref/$(am__dirstamp)\ncrypto_core/salsa208/ref/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_core/salsa208/ref/$(DEPDIR)\n\t@: > crypto_core/salsa208/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_core/salsa208/ref/libsodium_la-core_salsa208.lo:  \\\n\tcrypto_core/salsa208/ref/$(am__dirstamp) \\\n\tcrypto_core/salsa208/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_core/salsa208/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_core/salsa208\n\t@: > crypto_core/salsa208/$(am__dirstamp)\ncrypto_core/salsa208/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_core/salsa208/$(DEPDIR)\n\t@: > crypto_core/salsa208/$(DEPDIR)/$(am__dirstamp)\ncrypto_core/salsa208/libsodium_la-core_salsa208_api.lo:  \\\n\tcrypto_core/salsa208/$(am__dirstamp) \\\n\tcrypto_core/salsa208/$(DEPDIR)/$(am__dirstamp)\ncrypto_sign/ed25519/ref10/libsodium_la-obsolete.lo:  \\\n\tcrypto_sign/ed25519/ref10/$(am__dirstamp) \\\n\tcrypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/aes128ctr/portable/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/aes128ctr/portable\n\t@: > crypto_stream/aes128ctr/portable/$(am__dirstamp)\ncrypto_stream/aes128ctr/portable/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/aes128ctr/portable/$(DEPDIR)\n\t@: > crypto_stream/aes128ctr/portable/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/aes128ctr/portable/libsodium_la-afternm_aes128ctr.lo:  \\\n\tcrypto_stream/aes128ctr/portable/$(am__dirstamp) \\\n\tcrypto_stream/aes128ctr/portable/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/aes128ctr/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/aes128ctr\n\t@: > crypto_stream/aes128ctr/$(am__dirstamp)\ncrypto_stream/aes128ctr/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/aes128ctr/$(DEPDIR)\n\t@: > crypto_stream/aes128ctr/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/aes128ctr/libsodium_la-stream_aes128ctr_api.lo:  \\\n\tcrypto_stream/aes128ctr/$(am__dirstamp) \\\n\tcrypto_stream/aes128ctr/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/aes128ctr/portable/libsodium_la-beforenm_aes128ctr.lo:  \\\n\tcrypto_stream/aes128ctr/portable/$(am__dirstamp) \\\n\tcrypto_stream/aes128ctr/portable/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/aes128ctr/portable/libsodium_la-common_aes128ctr.lo:  \\\n\tcrypto_stream/aes128ctr/portable/$(am__dirstamp) \\\n\tcrypto_stream/aes128ctr/portable/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/aes128ctr/portable/libsodium_la-consts_aes128ctr.lo:  \\\n\tcrypto_stream/aes128ctr/portable/$(am__dirstamp) \\\n\tcrypto_stream/aes128ctr/portable/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/aes128ctr/portable/libsodium_la-int128_aes128ctr.lo:  \\\n\tcrypto_stream/aes128ctr/portable/$(am__dirstamp) \\\n\tcrypto_stream/aes128ctr/portable/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/aes128ctr/portable/libsodium_la-stream_aes128ctr.lo:  \\\n\tcrypto_stream/aes128ctr/portable/$(am__dirstamp) \\\n\tcrypto_stream/aes128ctr/portable/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/aes128ctr/portable/libsodium_la-xor_afternm_aes128ctr.lo:  \\\n\tcrypto_stream/aes128ctr/portable/$(am__dirstamp) \\\n\tcrypto_stream/aes128ctr/portable/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/salsa2012/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/salsa2012\n\t@: > crypto_stream/salsa2012/$(am__dirstamp)\ncrypto_stream/salsa2012/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/salsa2012/$(DEPDIR)\n\t@: > crypto_stream/salsa2012/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/salsa2012/libsodium_la-stream_salsa2012_api.lo:  \\\n\tcrypto_stream/salsa2012/$(am__dirstamp) \\\n\tcrypto_stream/salsa2012/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/salsa2012/ref/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/salsa2012/ref\n\t@: > crypto_stream/salsa2012/ref/$(am__dirstamp)\ncrypto_stream/salsa2012/ref/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/salsa2012/ref/$(DEPDIR)\n\t@: > crypto_stream/salsa2012/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/salsa2012/ref/libsodium_la-stream_salsa2012.lo:  \\\n\tcrypto_stream/salsa2012/ref/$(am__dirstamp) \\\n\tcrypto_stream/salsa2012/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/salsa2012/ref/libsodium_la-xor_salsa2012.lo:  \\\n\tcrypto_stream/salsa2012/ref/$(am__dirstamp) \\\n\tcrypto_stream/salsa2012/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/salsa208/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/salsa208\n\t@: > crypto_stream/salsa208/$(am__dirstamp)\ncrypto_stream/salsa208/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/salsa208/$(DEPDIR)\n\t@: > crypto_stream/salsa208/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/salsa208/libsodium_la-stream_salsa208_api.lo:  \\\n\tcrypto_stream/salsa208/$(am__dirstamp) \\\n\tcrypto_stream/salsa208/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/salsa208/ref/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/salsa208/ref\n\t@: > crypto_stream/salsa208/ref/$(am__dirstamp)\ncrypto_stream/salsa208/ref/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/salsa208/ref/$(DEPDIR)\n\t@: > crypto_stream/salsa208/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/salsa208/ref/libsodium_la-stream_salsa208.lo:  \\\n\tcrypto_stream/salsa208/ref/$(am__dirstamp) \\\n\tcrypto_stream/salsa208/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/salsa208/ref/libsodium_la-xor_salsa208.lo:  \\\n\tcrypto_stream/salsa208/ref/$(am__dirstamp) \\\n\tcrypto_stream/salsa208/ref/$(DEPDIR)/$(am__dirstamp)\n\nlibsodium.la: $(libsodium_la_OBJECTS) $(libsodium_la_DEPENDENCIES) $(EXTRA_libsodium_la_DEPENDENCIES) \n\t$(AM_V_CCLD)$(libsodium_la_LINK)  $(libsodium_la_OBJECTS) $(libsodium_la_LIBADD) $(LIBS)\ncrypto_pwhash/scryptsalsa208sha256/sse/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_pwhash/scryptsalsa208sha256/sse\n\t@: > crypto_pwhash/scryptsalsa208sha256/sse/$(am__dirstamp)\ncrypto_pwhash/scryptsalsa208sha256/sse/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_pwhash/scryptsalsa208sha256/sse/$(DEPDIR)\n\t@: > crypto_pwhash/scryptsalsa208sha256/sse/$(DEPDIR)/$(am__dirstamp)\ncrypto_pwhash/scryptsalsa208sha256/sse/libsse2_la-pwhash_scryptsalsa208sha256_sse.lo:  \\\n\tcrypto_pwhash/scryptsalsa208sha256/sse/$(am__dirstamp) \\\n\tcrypto_pwhash/scryptsalsa208sha256/sse/$(DEPDIR)/$(am__dirstamp)\ncrypto_onetimeauth/poly1305/sse2/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_onetimeauth/poly1305/sse2\n\t@: > crypto_onetimeauth/poly1305/sse2/$(am__dirstamp)\ncrypto_onetimeauth/poly1305/sse2/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_onetimeauth/poly1305/sse2/$(DEPDIR)\n\t@: > crypto_onetimeauth/poly1305/sse2/$(DEPDIR)/$(am__dirstamp)\ncrypto_onetimeauth/poly1305/sse2/libsse2_la-poly1305_sse2.lo:  \\\n\tcrypto_onetimeauth/poly1305/sse2/$(am__dirstamp) \\\n\tcrypto_onetimeauth/poly1305/sse2/$(DEPDIR)/$(am__dirstamp)\n\nlibsse2.la: $(libsse2_la_OBJECTS) $(libsse2_la_DEPENDENCIES) $(EXTRA_libsse2_la_DEPENDENCIES) \n\t$(AM_V_CCLD)$(libsse2_la_LINK)  $(libsse2_la_OBJECTS) $(libsse2_la_LIBADD) $(LIBS)\ncrypto_generichash/blake2/ref/libsse41_la-blake2b-compress-sse41.lo:  \\\n\tcrypto_generichash/blake2/ref/$(am__dirstamp) \\\n\tcrypto_generichash/blake2/ref/$(DEPDIR)/$(am__dirstamp)\n\nlibsse41.la: $(libsse41_la_OBJECTS) $(libsse41_la_DEPENDENCIES) $(EXTRA_libsse41_la_DEPENDENCIES) \n\t$(AM_V_CCLD)$(libsse41_la_LINK)  $(libsse41_la_OBJECTS) $(libsse41_la_LIBADD) $(LIBS)\ncrypto_generichash/blake2/ref/libssse3_la-blake2b-compress-ssse3.lo:  \\\n\tcrypto_generichash/blake2/ref/$(am__dirstamp) \\\n\tcrypto_generichash/blake2/ref/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/chacha20/vec/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/chacha20/vec\n\t@: > crypto_stream/chacha20/vec/$(am__dirstamp)\ncrypto_stream/chacha20/vec/$(DEPDIR)/$(am__dirstamp):\n\t@$(MKDIR_P) crypto_stream/chacha20/vec/$(DEPDIR)\n\t@: > crypto_stream/chacha20/vec/$(DEPDIR)/$(am__dirstamp)\ncrypto_stream/chacha20/vec/libssse3_la-stream_chacha20_vec.lo:  \\\n\tcrypto_stream/chacha20/vec/$(am__dirstamp) \\\n\tcrypto_stream/chacha20/vec/$(DEPDIR)/$(am__dirstamp)\n\nlibssse3.la: $(libssse3_la_OBJECTS) $(libssse3_la_DEPENDENCIES) $(EXTRA_libssse3_la_DEPENDENCIES) \n\t$(AM_V_CCLD)$(libssse3_la_LINK)  $(libssse3_la_OBJECTS) $(libssse3_la_LIBADD) $(LIBS)\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\t-rm -f crypto_aead/aes256gcm/aesni/*.$(OBJEXT)\n\t-rm -f crypto_aead/aes256gcm/aesni/*.lo\n\t-rm -f crypto_aead/chacha20poly1305/sodium/*.$(OBJEXT)\n\t-rm -f crypto_aead/chacha20poly1305/sodium/*.lo\n\t-rm -f crypto_auth/*.$(OBJEXT)\n\t-rm -f crypto_auth/*.lo\n\t-rm -f crypto_auth/hmacsha256/*.$(OBJEXT)\n\t-rm -f crypto_auth/hmacsha256/*.lo\n\t-rm -f crypto_auth/hmacsha256/cp/*.$(OBJEXT)\n\t-rm -f crypto_auth/hmacsha256/cp/*.lo\n\t-rm -f crypto_auth/hmacsha512/*.$(OBJEXT)\n\t-rm -f crypto_auth/hmacsha512/*.lo\n\t-rm -f crypto_auth/hmacsha512/cp/*.$(OBJEXT)\n\t-rm -f crypto_auth/hmacsha512/cp/*.lo\n\t-rm -f crypto_auth/hmacsha512256/*.$(OBJEXT)\n\t-rm -f crypto_auth/hmacsha512256/*.lo\n\t-rm -f crypto_auth/hmacsha512256/cp/*.$(OBJEXT)\n\t-rm -f crypto_auth/hmacsha512256/cp/*.lo\n\t-rm -f crypto_box/*.$(OBJEXT)\n\t-rm -f crypto_box/*.lo\n\t-rm -f crypto_box/curve25519xsalsa20poly1305/*.$(OBJEXT)\n\t-rm -f crypto_box/curve25519xsalsa20poly1305/*.lo\n\t-rm -f crypto_box/curve25519xsalsa20poly1305/ref/*.$(OBJEXT)\n\t-rm -f crypto_box/curve25519xsalsa20poly1305/ref/*.lo\n\t-rm -f crypto_core/hsalsa20/*.$(OBJEXT)\n\t-rm -f crypto_core/hsalsa20/*.lo\n\t-rm -f crypto_core/hsalsa20/ref2/*.$(OBJEXT)\n\t-rm -f crypto_core/hsalsa20/ref2/*.lo\n\t-rm -f crypto_core/salsa20/*.$(OBJEXT)\n\t-rm -f crypto_core/salsa20/*.lo\n\t-rm -f crypto_core/salsa20/ref/*.$(OBJEXT)\n\t-rm -f crypto_core/salsa20/ref/*.lo\n\t-rm -f crypto_core/salsa2012/*.$(OBJEXT)\n\t-rm -f crypto_core/salsa2012/*.lo\n\t-rm -f crypto_core/salsa2012/ref/*.$(OBJEXT)\n\t-rm -f crypto_core/salsa2012/ref/*.lo\n\t-rm -f crypto_core/salsa208/*.$(OBJEXT)\n\t-rm -f crypto_core/salsa208/*.lo\n\t-rm -f crypto_core/salsa208/ref/*.$(OBJEXT)\n\t-rm -f crypto_core/salsa208/ref/*.lo\n\t-rm -f crypto_generichash/*.$(OBJEXT)\n\t-rm -f crypto_generichash/*.lo\n\t-rm -f crypto_generichash/blake2/*.$(OBJEXT)\n\t-rm -f crypto_generichash/blake2/*.lo\n\t-rm -f crypto_generichash/blake2/ref/*.$(OBJEXT)\n\t-rm -f crypto_generichash/blake2/ref/*.lo\n\t-rm -f crypto_hash/*.$(OBJEXT)\n\t-rm -f crypto_hash/*.lo\n\t-rm -f crypto_hash/sha256/*.$(OBJEXT)\n\t-rm -f crypto_hash/sha256/*.lo\n\t-rm -f crypto_hash/sha256/cp/*.$(OBJEXT)\n\t-rm -f crypto_hash/sha256/cp/*.lo\n\t-rm -f crypto_hash/sha512/*.$(OBJEXT)\n\t-rm -f crypto_hash/sha512/*.lo\n\t-rm -f crypto_hash/sha512/cp/*.$(OBJEXT)\n\t-rm -f crypto_hash/sha512/cp/*.lo\n\t-rm -f crypto_onetimeauth/*.$(OBJEXT)\n\t-rm -f crypto_onetimeauth/*.lo\n\t-rm -f crypto_onetimeauth/poly1305/*.$(OBJEXT)\n\t-rm -f crypto_onetimeauth/poly1305/*.lo\n\t-rm -f crypto_onetimeauth/poly1305/donna/*.$(OBJEXT)\n\t-rm -f crypto_onetimeauth/poly1305/donna/*.lo\n\t-rm -f crypto_onetimeauth/poly1305/sse2/*.$(OBJEXT)\n\t-rm -f crypto_onetimeauth/poly1305/sse2/*.lo\n\t-rm -f crypto_pwhash/scryptsalsa208sha256/*.$(OBJEXT)\n\t-rm -f crypto_pwhash/scryptsalsa208sha256/*.lo\n\t-rm -f crypto_pwhash/scryptsalsa208sha256/nosse/*.$(OBJEXT)\n\t-rm -f crypto_pwhash/scryptsalsa208sha256/nosse/*.lo\n\t-rm -f crypto_pwhash/scryptsalsa208sha256/sse/*.$(OBJEXT)\n\t-rm -f crypto_pwhash/scryptsalsa208sha256/sse/*.lo\n\t-rm -f crypto_scalarmult/*.$(OBJEXT)\n\t-rm -f crypto_scalarmult/*.lo\n\t-rm -f crypto_scalarmult/curve25519/*.$(OBJEXT)\n\t-rm -f crypto_scalarmult/curve25519/*.lo\n\t-rm -f crypto_scalarmult/curve25519/donna_c64/*.$(OBJEXT)\n\t-rm -f crypto_scalarmult/curve25519/donna_c64/*.lo\n\t-rm -f crypto_scalarmult/curve25519/ref10/*.$(OBJEXT)\n\t-rm -f crypto_scalarmult/curve25519/ref10/*.lo\n\t-rm -f crypto_scalarmult/curve25519/sandy2x/*.$(OBJEXT)\n\t-rm -f crypto_scalarmult/curve25519/sandy2x/*.lo\n\t-rm -f crypto_secretbox/*.$(OBJEXT)\n\t-rm -f crypto_secretbox/*.lo\n\t-rm -f crypto_secretbox/xsalsa20poly1305/*.$(OBJEXT)\n\t-rm -f crypto_secretbox/xsalsa20poly1305/*.lo\n\t-rm -f crypto_secretbox/xsalsa20poly1305/ref/*.$(OBJEXT)\n\t-rm -f crypto_secretbox/xsalsa20poly1305/ref/*.lo\n\t-rm -f crypto_shorthash/*.$(OBJEXT)\n\t-rm -f crypto_shorthash/*.lo\n\t-rm -f crypto_shorthash/siphash24/*.$(OBJEXT)\n\t-rm -f crypto_shorthash/siphash24/*.lo\n\t-rm -f crypto_shorthash/siphash24/ref/*.$(OBJEXT)\n\t-rm -f crypto_shorthash/siphash24/ref/*.lo\n\t-rm -f crypto_sign/*.$(OBJEXT)\n\t-rm -f crypto_sign/*.lo\n\t-rm -f crypto_sign/ed25519/*.$(OBJEXT)\n\t-rm -f crypto_sign/ed25519/*.lo\n\t-rm -f crypto_sign/ed25519/ref10/*.$(OBJEXT)\n\t-rm -f crypto_sign/ed25519/ref10/*.lo\n\t-rm -f crypto_stream/*.$(OBJEXT)\n\t-rm -f crypto_stream/*.lo\n\t-rm -f crypto_stream/aes128ctr/*.$(OBJEXT)\n\t-rm -f crypto_stream/aes128ctr/*.lo\n\t-rm -f crypto_stream/aes128ctr/portable/*.$(OBJEXT)\n\t-rm -f crypto_stream/aes128ctr/portable/*.lo\n\t-rm -f crypto_stream/chacha20/*.$(OBJEXT)\n\t-rm -f crypto_stream/chacha20/*.lo\n\t-rm -f crypto_stream/chacha20/ref/*.$(OBJEXT)\n\t-rm -f crypto_stream/chacha20/ref/*.lo\n\t-rm -f crypto_stream/chacha20/vec/*.$(OBJEXT)\n\t-rm -f crypto_stream/chacha20/vec/*.lo\n\t-rm -f crypto_stream/salsa20/*.$(OBJEXT)\n\t-rm -f crypto_stream/salsa20/*.lo\n\t-rm -f crypto_stream/salsa20/amd64_xmm6/*.$(OBJEXT)\n\t-rm -f crypto_stream/salsa20/amd64_xmm6/*.lo\n\t-rm -f crypto_stream/salsa20/ref/*.$(OBJEXT)\n\t-rm -f crypto_stream/salsa20/ref/*.lo\n\t-rm -f crypto_stream/salsa2012/*.$(OBJEXT)\n\t-rm -f crypto_stream/salsa2012/*.lo\n\t-rm -f crypto_stream/salsa2012/ref/*.$(OBJEXT)\n\t-rm -f crypto_stream/salsa2012/ref/*.lo\n\t-rm -f crypto_stream/salsa208/*.$(OBJEXT)\n\t-rm -f crypto_stream/salsa208/*.lo\n\t-rm -f crypto_stream/salsa208/ref/*.$(OBJEXT)\n\t-rm -f crypto_stream/salsa208/ref/*.lo\n\t-rm -f crypto_stream/xsalsa20/*.$(OBJEXT)\n\t-rm -f crypto_stream/xsalsa20/*.lo\n\t-rm -f crypto_stream/xsalsa20/ref/*.$(OBJEXT)\n\t-rm -f crypto_stream/xsalsa20/ref/*.lo\n\t-rm -f crypto_verify/16/*.$(OBJEXT)\n\t-rm -f crypto_verify/16/*.lo\n\t-rm -f crypto_verify/16/ref/*.$(OBJEXT)\n\t-rm -f crypto_verify/16/ref/*.lo\n\t-rm -f crypto_verify/32/*.$(OBJEXT)\n\t-rm -f crypto_verify/32/*.lo\n\t-rm -f crypto_verify/32/ref/*.$(OBJEXT)\n\t-rm -f crypto_verify/32/ref/*.lo\n\t-rm -f crypto_verify/64/*.$(OBJEXT)\n\t-rm -f crypto_verify/64/*.lo\n\t-rm -f crypto_verify/64/ref/*.$(OBJEXT)\n\t-rm -f crypto_verify/64/ref/*.lo\n\t-rm -f randombytes/*.$(OBJEXT)\n\t-rm -f randombytes/*.lo\n\t-rm -f randombytes/nativeclient/*.$(OBJEXT)\n\t-rm -f randombytes/nativeclient/*.lo\n\t-rm -f randombytes/salsa20/*.$(OBJEXT)\n\t-rm -f randombytes/salsa20/*.lo\n\t-rm -f randombytes/sysrandom/*.$(OBJEXT)\n\t-rm -f randombytes/sysrandom/*.lo\n\t-rm -f sodium/*.$(OBJEXT)\n\t-rm -f sodium/*.lo\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_aead/aes256gcm/aesni/$(DEPDIR)/libaesni_la-aead_aes256gcm_aesni.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_aead/chacha20poly1305/sodium/$(DEPDIR)/libsodium_la-aead_chacha20poly1305.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_auth/$(DEPDIR)/libsodium_la-crypto_auth.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_auth/hmacsha256/$(DEPDIR)/libsodium_la-auth_hmacsha256_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_auth/hmacsha256/cp/$(DEPDIR)/libsodium_la-hmac_hmacsha256.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_auth/hmacsha256/cp/$(DEPDIR)/libsodium_la-verify_hmacsha256.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_auth/hmacsha512/$(DEPDIR)/libsodium_la-auth_hmacsha512_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_auth/hmacsha512/cp/$(DEPDIR)/libsodium_la-hmac_hmacsha512.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_auth/hmacsha512/cp/$(DEPDIR)/libsodium_la-verify_hmacsha512.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_auth/hmacsha512256/$(DEPDIR)/libsodium_la-auth_hmacsha512256_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_auth/hmacsha512256/cp/$(DEPDIR)/libsodium_la-hmac_hmacsha512256.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_auth/hmacsha512256/cp/$(DEPDIR)/libsodium_la-verify_hmacsha512256.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_box/$(DEPDIR)/libsodium_la-crypto_box.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_box/$(DEPDIR)/libsodium_la-crypto_box_easy.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_box/$(DEPDIR)/libsodium_la-crypto_box_seal.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_box/curve25519xsalsa20poly1305/$(DEPDIR)/libsodium_la-box_curve25519xsalsa20poly1305_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-after_curve25519xsalsa20poly1305.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-before_curve25519xsalsa20poly1305.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-box_curve25519xsalsa20poly1305.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-keypair_curve25519xsalsa20poly1305.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_core/hsalsa20/$(DEPDIR)/libsodium_la-core_hsalsa20_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_core/hsalsa20/ref2/$(DEPDIR)/libsodium_la-core_hsalsa20.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_core/salsa20/$(DEPDIR)/libsodium_la-core_salsa20_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_core/salsa20/ref/$(DEPDIR)/libsodium_la-core_salsa20.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_core/salsa2012/$(DEPDIR)/libsodium_la-core_salsa2012_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_core/salsa2012/ref/$(DEPDIR)/libsodium_la-core_salsa2012.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_core/salsa208/$(DEPDIR)/libsodium_la-core_salsa208_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_core/salsa208/ref/$(DEPDIR)/libsodium_la-core_salsa208.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_generichash/$(DEPDIR)/libsodium_la-crypto_generichash.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_generichash/blake2/$(DEPDIR)/libsodium_la-generichash_blake2_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_generichash/blake2/ref/$(DEPDIR)/libsodium_la-blake2b-compress-ref.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_generichash/blake2/ref/$(DEPDIR)/libsodium_la-blake2b-ref.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_generichash/blake2/ref/$(DEPDIR)/libsodium_la-generichash_blake2b.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_generichash/blake2/ref/$(DEPDIR)/libsse41_la-blake2b-compress-sse41.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_generichash/blake2/ref/$(DEPDIR)/libssse3_la-blake2b-compress-ssse3.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_hash/$(DEPDIR)/libsodium_la-crypto_hash.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_hash/sha256/$(DEPDIR)/libsodium_la-hash_sha256_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_hash/sha256/cp/$(DEPDIR)/libsodium_la-hash_sha256.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_hash/sha512/$(DEPDIR)/libsodium_la-hash_sha512_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_hash/sha512/cp/$(DEPDIR)/libsodium_la-hash_sha512.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_onetimeauth/$(DEPDIR)/libsodium_la-crypto_onetimeauth.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_onetimeauth/poly1305/$(DEPDIR)/libsodium_la-onetimeauth_poly1305.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_onetimeauth/poly1305/donna/$(DEPDIR)/libsodium_la-poly1305_donna.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_onetimeauth/poly1305/sse2/$(DEPDIR)/libsse2_la-poly1305_sse2.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/libsodium_la-crypto_scrypt-common.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/libsodium_la-pbkdf2-sha256.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/libsodium_la-pwhash_scryptsalsa208sha256.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/libsodium_la-scrypt_platform.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_pwhash/scryptsalsa208sha256/nosse/$(DEPDIR)/libsodium_la-pwhash_scryptsalsa208sha256_nosse.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_pwhash/scryptsalsa208sha256/sse/$(DEPDIR)/libsse2_la-pwhash_scryptsalsa208sha256_sse.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/$(DEPDIR)/libsodium_la-crypto_scalarmult.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/$(DEPDIR)/libsodium_la-scalarmult_curve25519.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/donna_c64/$(DEPDIR)/libsodium_la-curve25519_donna_c64.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-curve25519_ref10.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_0_curve25519_ref10.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_1_curve25519_ref10.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_add_curve25519_ref10.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_copy_curve25519_ref10.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_cswap_curve25519_ref10.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_frombytes_curve25519_ref10.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_invert_curve25519_ref10.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_mul121666_curve25519_ref10.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_mul_curve25519_ref10.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_sq_curve25519_ref10.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_sub_curve25519_ref10.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_tobytes_curve25519_ref10.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/libsodium_la-curve25519_sandy2x.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/libsodium_la-fe51_invert.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/libsodium_la-fe_frombytes_sandy2x.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/libsodium_la-sandy2x.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_secretbox/$(DEPDIR)/libsodium_la-crypto_secretbox.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_secretbox/$(DEPDIR)/libsodium_la-crypto_secretbox_easy.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_secretbox/xsalsa20poly1305/$(DEPDIR)/libsodium_la-secretbox_xsalsa20poly1305_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_secretbox/xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-box_xsalsa20poly1305.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_shorthash/$(DEPDIR)/libsodium_la-crypto_shorthash.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_shorthash/siphash24/$(DEPDIR)/libsodium_la-shorthash_siphash24_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_shorthash/siphash24/ref/$(DEPDIR)/libsodium_la-shorthash_siphash24.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/$(DEPDIR)/libsodium_la-crypto_sign.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/$(DEPDIR)/libsodium_la-sign_ed25519_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_0.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_1.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_add.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_cmov.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_copy.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_frombytes.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_invert.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_isnegative.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_isnonzero.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_mul.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_neg.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_pow22523.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_sq.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_sq2.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_sub.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_tobytes.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_add.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_double_scalarmult.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_frombytes.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_madd.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_msub.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p1p1_to_p2.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p1p1_to_p3.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p2_0.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p2_dbl.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_0.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_dbl.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_to_cached.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_to_p2.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_tobytes.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_precomp_0.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_scalarmult_base.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_sub.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_tobytes.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-keypair.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-obsolete.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-open.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-sc_muladd.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-sc_reduce.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-sign.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/$(DEPDIR)/libsodium_la-crypto_stream.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/aes128ctr/$(DEPDIR)/libsodium_la-stream_aes128ctr_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-afternm_aes128ctr.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-beforenm_aes128ctr.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-common_aes128ctr.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-consts_aes128ctr.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-int128_aes128ctr.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-stream_aes128ctr.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-xor_afternm_aes128ctr.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/chacha20/$(DEPDIR)/libsodium_la-stream_chacha20.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/chacha20/ref/$(DEPDIR)/libsodium_la-stream_chacha20_ref.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/chacha20/vec/$(DEPDIR)/libssse3_la-stream_chacha20_vec.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/salsa20/$(DEPDIR)/libsodium_la-stream_salsa20_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/salsa20/amd64_xmm6/$(DEPDIR)/libsodium_la-stream_salsa20_amd64_xmm6.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/salsa20/ref/$(DEPDIR)/libsodium_la-stream_salsa20_ref.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/salsa20/ref/$(DEPDIR)/libsodium_la-xor_salsa20_ref.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/salsa2012/$(DEPDIR)/libsodium_la-stream_salsa2012_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/salsa2012/ref/$(DEPDIR)/libsodium_la-stream_salsa2012.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/salsa2012/ref/$(DEPDIR)/libsodium_la-xor_salsa2012.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/salsa208/$(DEPDIR)/libsodium_la-stream_salsa208_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/salsa208/ref/$(DEPDIR)/libsodium_la-stream_salsa208.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/salsa208/ref/$(DEPDIR)/libsodium_la-xor_salsa208.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/xsalsa20/$(DEPDIR)/libsodium_la-stream_xsalsa20_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/xsalsa20/ref/$(DEPDIR)/libsodium_la-stream_xsalsa20.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_stream/xsalsa20/ref/$(DEPDIR)/libsodium_la-xor_xsalsa20.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_verify/16/$(DEPDIR)/libsodium_la-verify_16_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_verify/16/ref/$(DEPDIR)/libsodium_la-verify_16.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_verify/32/$(DEPDIR)/libsodium_la-verify_32_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_verify/32/ref/$(DEPDIR)/libsodium_la-verify_32.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_verify/64/$(DEPDIR)/libsodium_la-verify_64_api.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@crypto_verify/64/ref/$(DEPDIR)/libsodium_la-verify_64.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@randombytes/$(DEPDIR)/libsodium_la-randombytes.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@randombytes/nativeclient/$(DEPDIR)/libsodium_la-randombytes_nativeclient.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@randombytes/salsa20/$(DEPDIR)/libsodium_la-randombytes_salsa20_random.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@randombytes/sysrandom/$(DEPDIR)/libsodium_la-randombytes_sysrandom.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@sodium/$(DEPDIR)/libsodium_la-core.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@sodium/$(DEPDIR)/libsodium_la-runtime.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@sodium/$(DEPDIR)/libsodium_la-utils.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@sodium/$(DEPDIR)/libsodium_la-version.Plo@am__quote@\n\n.S.o:\n@am__fastdepCCAS_TRUE@\t$(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.o$$||'`;\\\n@am__fastdepCCAS_TRUE@\t$(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCCAS_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCCAS_FALSE@\t$(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCCAS_FALSE@\tDEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCCAS_FALSE@\t$(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ $<\n\n.S.obj:\n@am__fastdepCCAS_TRUE@\t$(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.obj$$||'`;\\\n@am__fastdepCCAS_TRUE@\t$(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\\\n@am__fastdepCCAS_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCCAS_FALSE@\t$(AM_V_CPPAS)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCCAS_FALSE@\tDEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCCAS_FALSE@\t$(AM_V_CPPAS@am__nodep@)$(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\n.S.lo:\n@am__fastdepCCAS_TRUE@\t$(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.lo$$||'`;\\\n@am__fastdepCCAS_TRUE@\t$(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCCAS_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Plo\n@AMDEP_TRUE@@am__fastdepCCAS_FALSE@\t$(AM_V_CPPAS)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCCAS_FALSE@\tDEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCCAS_FALSE@\t$(AM_V_CPPAS@am__nodep@)$(LTCPPASCOMPILE) -c -o $@ $<\n\ncrypto_scalarmult/curve25519/sandy2x/libsodium_la-sandy2x.lo: crypto_scalarmult/curve25519/sandy2x/sandy2x.S\n@am__fastdepCCAS_TRUE@\t$(AM_V_CPPAS)$(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) -MT crypto_scalarmult/curve25519/sandy2x/libsodium_la-sandy2x.lo -MD -MP -MF crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/libsodium_la-sandy2x.Tpo -c -o crypto_scalarmult/curve25519/sandy2x/libsodium_la-sandy2x.lo `test -f 'crypto_scalarmult/curve25519/sandy2x/sandy2x.S' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/sandy2x/sandy2x.S\n@am__fastdepCCAS_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/libsodium_la-sandy2x.Tpo crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/libsodium_la-sandy2x.Plo\n@AMDEP_TRUE@@am__fastdepCCAS_FALSE@\t$(AM_V_CPPAS)source='crypto_scalarmult/curve25519/sandy2x/sandy2x.S' object='crypto_scalarmult/curve25519/sandy2x/libsodium_la-sandy2x.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCCAS_FALSE@\tDEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCCAS_FALSE@\t$(AM_V_CPPAS@am__nodep@)$(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) -c -o crypto_scalarmult/curve25519/sandy2x/libsodium_la-sandy2x.lo `test -f 'crypto_scalarmult/curve25519/sandy2x/sandy2x.S' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/sandy2x/sandy2x.S\n\ncrypto_stream/salsa20/amd64_xmm6/libsodium_la-stream_salsa20_amd64_xmm6.lo: crypto_stream/salsa20/amd64_xmm6/stream_salsa20_amd64_xmm6.S\n@am__fastdepCCAS_TRUE@\t$(AM_V_CPPAS)$(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) -MT crypto_stream/salsa20/amd64_xmm6/libsodium_la-stream_salsa20_amd64_xmm6.lo -MD -MP -MF crypto_stream/salsa20/amd64_xmm6/$(DEPDIR)/libsodium_la-stream_salsa20_amd64_xmm6.Tpo -c -o crypto_stream/salsa20/amd64_xmm6/libsodium_la-stream_salsa20_amd64_xmm6.lo `test -f 'crypto_stream/salsa20/amd64_xmm6/stream_salsa20_amd64_xmm6.S' || echo '$(srcdir)/'`crypto_stream/salsa20/amd64_xmm6/stream_salsa20_amd64_xmm6.S\n@am__fastdepCCAS_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/salsa20/amd64_xmm6/$(DEPDIR)/libsodium_la-stream_salsa20_amd64_xmm6.Tpo crypto_stream/salsa20/amd64_xmm6/$(DEPDIR)/libsodium_la-stream_salsa20_amd64_xmm6.Plo\n@AMDEP_TRUE@@am__fastdepCCAS_FALSE@\t$(AM_V_CPPAS)source='crypto_stream/salsa20/amd64_xmm6/stream_salsa20_amd64_xmm6.S' object='crypto_stream/salsa20/amd64_xmm6/libsodium_la-stream_salsa20_amd64_xmm6.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCCAS_FALSE@\tDEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCCAS_FALSE@\t$(AM_V_CPPAS@am__nodep@)$(LIBTOOL) $(AM_V_lt) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CCASFLAGS) $(CCASFLAGS) -c -o crypto_stream/salsa20/amd64_xmm6/libsodium_la-stream_salsa20_amd64_xmm6.lo `test -f 'crypto_stream/salsa20/amd64_xmm6/stream_salsa20_amd64_xmm6.S' || echo '$(srcdir)/'`crypto_stream/salsa20/amd64_xmm6/stream_salsa20_amd64_xmm6.S\n\n.c.o:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.o$$||'`;\\\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<\n\n.c.obj:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.obj$$||'`;\\\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\n.c.lo:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.lo$$||'`;\\\n@am__fastdepCC_TRUE@\t$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<\n\ncrypto_aead/aes256gcm/aesni/libaesni_la-aead_aes256gcm_aesni.lo: crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libaesni_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_aead/aes256gcm/aesni/libaesni_la-aead_aes256gcm_aesni.lo -MD -MP -MF crypto_aead/aes256gcm/aesni/$(DEPDIR)/libaesni_la-aead_aes256gcm_aesni.Tpo -c -o crypto_aead/aes256gcm/aesni/libaesni_la-aead_aes256gcm_aesni.lo `test -f 'crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c' || echo '$(srcdir)/'`crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_aead/aes256gcm/aesni/$(DEPDIR)/libaesni_la-aead_aes256gcm_aesni.Tpo crypto_aead/aes256gcm/aesni/$(DEPDIR)/libaesni_la-aead_aes256gcm_aesni.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c' object='crypto_aead/aes256gcm/aesni/libaesni_la-aead_aes256gcm_aesni.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libaesni_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_aead/aes256gcm/aesni/libaesni_la-aead_aes256gcm_aesni.lo `test -f 'crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c' || echo '$(srcdir)/'`crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c\n\ncrypto_aead/chacha20poly1305/sodium/libsodium_la-aead_chacha20poly1305.lo: crypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_aead/chacha20poly1305/sodium/libsodium_la-aead_chacha20poly1305.lo -MD -MP -MF crypto_aead/chacha20poly1305/sodium/$(DEPDIR)/libsodium_la-aead_chacha20poly1305.Tpo -c -o crypto_aead/chacha20poly1305/sodium/libsodium_la-aead_chacha20poly1305.lo `test -f 'crypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c' || echo '$(srcdir)/'`crypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_aead/chacha20poly1305/sodium/$(DEPDIR)/libsodium_la-aead_chacha20poly1305.Tpo crypto_aead/chacha20poly1305/sodium/$(DEPDIR)/libsodium_la-aead_chacha20poly1305.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c' object='crypto_aead/chacha20poly1305/sodium/libsodium_la-aead_chacha20poly1305.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_aead/chacha20poly1305/sodium/libsodium_la-aead_chacha20poly1305.lo `test -f 'crypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c' || echo '$(srcdir)/'`crypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c\n\ncrypto_auth/libsodium_la-crypto_auth.lo: crypto_auth/crypto_auth.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_auth/libsodium_la-crypto_auth.lo -MD -MP -MF crypto_auth/$(DEPDIR)/libsodium_la-crypto_auth.Tpo -c -o crypto_auth/libsodium_la-crypto_auth.lo `test -f 'crypto_auth/crypto_auth.c' || echo '$(srcdir)/'`crypto_auth/crypto_auth.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_auth/$(DEPDIR)/libsodium_la-crypto_auth.Tpo crypto_auth/$(DEPDIR)/libsodium_la-crypto_auth.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_auth/crypto_auth.c' object='crypto_auth/libsodium_la-crypto_auth.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_auth/libsodium_la-crypto_auth.lo `test -f 'crypto_auth/crypto_auth.c' || echo '$(srcdir)/'`crypto_auth/crypto_auth.c\n\ncrypto_auth/hmacsha256/libsodium_la-auth_hmacsha256_api.lo: crypto_auth/hmacsha256/auth_hmacsha256_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_auth/hmacsha256/libsodium_la-auth_hmacsha256_api.lo -MD -MP -MF crypto_auth/hmacsha256/$(DEPDIR)/libsodium_la-auth_hmacsha256_api.Tpo -c -o crypto_auth/hmacsha256/libsodium_la-auth_hmacsha256_api.lo `test -f 'crypto_auth/hmacsha256/auth_hmacsha256_api.c' || echo '$(srcdir)/'`crypto_auth/hmacsha256/auth_hmacsha256_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_auth/hmacsha256/$(DEPDIR)/libsodium_la-auth_hmacsha256_api.Tpo crypto_auth/hmacsha256/$(DEPDIR)/libsodium_la-auth_hmacsha256_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_auth/hmacsha256/auth_hmacsha256_api.c' object='crypto_auth/hmacsha256/libsodium_la-auth_hmacsha256_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_auth/hmacsha256/libsodium_la-auth_hmacsha256_api.lo `test -f 'crypto_auth/hmacsha256/auth_hmacsha256_api.c' || echo '$(srcdir)/'`crypto_auth/hmacsha256/auth_hmacsha256_api.c\n\ncrypto_auth/hmacsha256/cp/libsodium_la-hmac_hmacsha256.lo: crypto_auth/hmacsha256/cp/hmac_hmacsha256.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_auth/hmacsha256/cp/libsodium_la-hmac_hmacsha256.lo -MD -MP -MF crypto_auth/hmacsha256/cp/$(DEPDIR)/libsodium_la-hmac_hmacsha256.Tpo -c -o crypto_auth/hmacsha256/cp/libsodium_la-hmac_hmacsha256.lo `test -f 'crypto_auth/hmacsha256/cp/hmac_hmacsha256.c' || echo '$(srcdir)/'`crypto_auth/hmacsha256/cp/hmac_hmacsha256.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_auth/hmacsha256/cp/$(DEPDIR)/libsodium_la-hmac_hmacsha256.Tpo crypto_auth/hmacsha256/cp/$(DEPDIR)/libsodium_la-hmac_hmacsha256.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_auth/hmacsha256/cp/hmac_hmacsha256.c' object='crypto_auth/hmacsha256/cp/libsodium_la-hmac_hmacsha256.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_auth/hmacsha256/cp/libsodium_la-hmac_hmacsha256.lo `test -f 'crypto_auth/hmacsha256/cp/hmac_hmacsha256.c' || echo '$(srcdir)/'`crypto_auth/hmacsha256/cp/hmac_hmacsha256.c\n\ncrypto_auth/hmacsha256/cp/libsodium_la-verify_hmacsha256.lo: crypto_auth/hmacsha256/cp/verify_hmacsha256.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_auth/hmacsha256/cp/libsodium_la-verify_hmacsha256.lo -MD -MP -MF crypto_auth/hmacsha256/cp/$(DEPDIR)/libsodium_la-verify_hmacsha256.Tpo -c -o crypto_auth/hmacsha256/cp/libsodium_la-verify_hmacsha256.lo `test -f 'crypto_auth/hmacsha256/cp/verify_hmacsha256.c' || echo '$(srcdir)/'`crypto_auth/hmacsha256/cp/verify_hmacsha256.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_auth/hmacsha256/cp/$(DEPDIR)/libsodium_la-verify_hmacsha256.Tpo crypto_auth/hmacsha256/cp/$(DEPDIR)/libsodium_la-verify_hmacsha256.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_auth/hmacsha256/cp/verify_hmacsha256.c' object='crypto_auth/hmacsha256/cp/libsodium_la-verify_hmacsha256.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_auth/hmacsha256/cp/libsodium_la-verify_hmacsha256.lo `test -f 'crypto_auth/hmacsha256/cp/verify_hmacsha256.c' || echo '$(srcdir)/'`crypto_auth/hmacsha256/cp/verify_hmacsha256.c\n\ncrypto_auth/hmacsha512/libsodium_la-auth_hmacsha512_api.lo: crypto_auth/hmacsha512/auth_hmacsha512_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_auth/hmacsha512/libsodium_la-auth_hmacsha512_api.lo -MD -MP -MF crypto_auth/hmacsha512/$(DEPDIR)/libsodium_la-auth_hmacsha512_api.Tpo -c -o crypto_auth/hmacsha512/libsodium_la-auth_hmacsha512_api.lo `test -f 'crypto_auth/hmacsha512/auth_hmacsha512_api.c' || echo '$(srcdir)/'`crypto_auth/hmacsha512/auth_hmacsha512_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_auth/hmacsha512/$(DEPDIR)/libsodium_la-auth_hmacsha512_api.Tpo crypto_auth/hmacsha512/$(DEPDIR)/libsodium_la-auth_hmacsha512_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_auth/hmacsha512/auth_hmacsha512_api.c' object='crypto_auth/hmacsha512/libsodium_la-auth_hmacsha512_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_auth/hmacsha512/libsodium_la-auth_hmacsha512_api.lo `test -f 'crypto_auth/hmacsha512/auth_hmacsha512_api.c' || echo '$(srcdir)/'`crypto_auth/hmacsha512/auth_hmacsha512_api.c\n\ncrypto_auth/hmacsha512/cp/libsodium_la-hmac_hmacsha512.lo: crypto_auth/hmacsha512/cp/hmac_hmacsha512.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_auth/hmacsha512/cp/libsodium_la-hmac_hmacsha512.lo -MD -MP -MF crypto_auth/hmacsha512/cp/$(DEPDIR)/libsodium_la-hmac_hmacsha512.Tpo -c -o crypto_auth/hmacsha512/cp/libsodium_la-hmac_hmacsha512.lo `test -f 'crypto_auth/hmacsha512/cp/hmac_hmacsha512.c' || echo '$(srcdir)/'`crypto_auth/hmacsha512/cp/hmac_hmacsha512.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_auth/hmacsha512/cp/$(DEPDIR)/libsodium_la-hmac_hmacsha512.Tpo crypto_auth/hmacsha512/cp/$(DEPDIR)/libsodium_la-hmac_hmacsha512.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_auth/hmacsha512/cp/hmac_hmacsha512.c' object='crypto_auth/hmacsha512/cp/libsodium_la-hmac_hmacsha512.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_auth/hmacsha512/cp/libsodium_la-hmac_hmacsha512.lo `test -f 'crypto_auth/hmacsha512/cp/hmac_hmacsha512.c' || echo '$(srcdir)/'`crypto_auth/hmacsha512/cp/hmac_hmacsha512.c\n\ncrypto_auth/hmacsha512/cp/libsodium_la-verify_hmacsha512.lo: crypto_auth/hmacsha512/cp/verify_hmacsha512.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_auth/hmacsha512/cp/libsodium_la-verify_hmacsha512.lo -MD -MP -MF crypto_auth/hmacsha512/cp/$(DEPDIR)/libsodium_la-verify_hmacsha512.Tpo -c -o crypto_auth/hmacsha512/cp/libsodium_la-verify_hmacsha512.lo `test -f 'crypto_auth/hmacsha512/cp/verify_hmacsha512.c' || echo '$(srcdir)/'`crypto_auth/hmacsha512/cp/verify_hmacsha512.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_auth/hmacsha512/cp/$(DEPDIR)/libsodium_la-verify_hmacsha512.Tpo crypto_auth/hmacsha512/cp/$(DEPDIR)/libsodium_la-verify_hmacsha512.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_auth/hmacsha512/cp/verify_hmacsha512.c' object='crypto_auth/hmacsha512/cp/libsodium_la-verify_hmacsha512.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_auth/hmacsha512/cp/libsodium_la-verify_hmacsha512.lo `test -f 'crypto_auth/hmacsha512/cp/verify_hmacsha512.c' || echo '$(srcdir)/'`crypto_auth/hmacsha512/cp/verify_hmacsha512.c\n\ncrypto_auth/hmacsha512256/libsodium_la-auth_hmacsha512256_api.lo: crypto_auth/hmacsha512256/auth_hmacsha512256_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_auth/hmacsha512256/libsodium_la-auth_hmacsha512256_api.lo -MD -MP -MF crypto_auth/hmacsha512256/$(DEPDIR)/libsodium_la-auth_hmacsha512256_api.Tpo -c -o crypto_auth/hmacsha512256/libsodium_la-auth_hmacsha512256_api.lo `test -f 'crypto_auth/hmacsha512256/auth_hmacsha512256_api.c' || echo '$(srcdir)/'`crypto_auth/hmacsha512256/auth_hmacsha512256_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_auth/hmacsha512256/$(DEPDIR)/libsodium_la-auth_hmacsha512256_api.Tpo crypto_auth/hmacsha512256/$(DEPDIR)/libsodium_la-auth_hmacsha512256_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_auth/hmacsha512256/auth_hmacsha512256_api.c' object='crypto_auth/hmacsha512256/libsodium_la-auth_hmacsha512256_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_auth/hmacsha512256/libsodium_la-auth_hmacsha512256_api.lo `test -f 'crypto_auth/hmacsha512256/auth_hmacsha512256_api.c' || echo '$(srcdir)/'`crypto_auth/hmacsha512256/auth_hmacsha512256_api.c\n\ncrypto_auth/hmacsha512256/cp/libsodium_la-hmac_hmacsha512256.lo: crypto_auth/hmacsha512256/cp/hmac_hmacsha512256.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_auth/hmacsha512256/cp/libsodium_la-hmac_hmacsha512256.lo -MD -MP -MF crypto_auth/hmacsha512256/cp/$(DEPDIR)/libsodium_la-hmac_hmacsha512256.Tpo -c -o crypto_auth/hmacsha512256/cp/libsodium_la-hmac_hmacsha512256.lo `test -f 'crypto_auth/hmacsha512256/cp/hmac_hmacsha512256.c' || echo '$(srcdir)/'`crypto_auth/hmacsha512256/cp/hmac_hmacsha512256.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_auth/hmacsha512256/cp/$(DEPDIR)/libsodium_la-hmac_hmacsha512256.Tpo crypto_auth/hmacsha512256/cp/$(DEPDIR)/libsodium_la-hmac_hmacsha512256.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_auth/hmacsha512256/cp/hmac_hmacsha512256.c' object='crypto_auth/hmacsha512256/cp/libsodium_la-hmac_hmacsha512256.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_auth/hmacsha512256/cp/libsodium_la-hmac_hmacsha512256.lo `test -f 'crypto_auth/hmacsha512256/cp/hmac_hmacsha512256.c' || echo '$(srcdir)/'`crypto_auth/hmacsha512256/cp/hmac_hmacsha512256.c\n\ncrypto_auth/hmacsha512256/cp/libsodium_la-verify_hmacsha512256.lo: crypto_auth/hmacsha512256/cp/verify_hmacsha512256.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_auth/hmacsha512256/cp/libsodium_la-verify_hmacsha512256.lo -MD -MP -MF crypto_auth/hmacsha512256/cp/$(DEPDIR)/libsodium_la-verify_hmacsha512256.Tpo -c -o crypto_auth/hmacsha512256/cp/libsodium_la-verify_hmacsha512256.lo `test -f 'crypto_auth/hmacsha512256/cp/verify_hmacsha512256.c' || echo '$(srcdir)/'`crypto_auth/hmacsha512256/cp/verify_hmacsha512256.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_auth/hmacsha512256/cp/$(DEPDIR)/libsodium_la-verify_hmacsha512256.Tpo crypto_auth/hmacsha512256/cp/$(DEPDIR)/libsodium_la-verify_hmacsha512256.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_auth/hmacsha512256/cp/verify_hmacsha512256.c' object='crypto_auth/hmacsha512256/cp/libsodium_la-verify_hmacsha512256.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_auth/hmacsha512256/cp/libsodium_la-verify_hmacsha512256.lo `test -f 'crypto_auth/hmacsha512256/cp/verify_hmacsha512256.c' || echo '$(srcdir)/'`crypto_auth/hmacsha512256/cp/verify_hmacsha512256.c\n\ncrypto_box/libsodium_la-crypto_box.lo: crypto_box/crypto_box.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_box/libsodium_la-crypto_box.lo -MD -MP -MF crypto_box/$(DEPDIR)/libsodium_la-crypto_box.Tpo -c -o crypto_box/libsodium_la-crypto_box.lo `test -f 'crypto_box/crypto_box.c' || echo '$(srcdir)/'`crypto_box/crypto_box.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_box/$(DEPDIR)/libsodium_la-crypto_box.Tpo crypto_box/$(DEPDIR)/libsodium_la-crypto_box.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_box/crypto_box.c' object='crypto_box/libsodium_la-crypto_box.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_box/libsodium_la-crypto_box.lo `test -f 'crypto_box/crypto_box.c' || echo '$(srcdir)/'`crypto_box/crypto_box.c\n\ncrypto_box/libsodium_la-crypto_box_easy.lo: crypto_box/crypto_box_easy.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_box/libsodium_la-crypto_box_easy.lo -MD -MP -MF crypto_box/$(DEPDIR)/libsodium_la-crypto_box_easy.Tpo -c -o crypto_box/libsodium_la-crypto_box_easy.lo `test -f 'crypto_box/crypto_box_easy.c' || echo '$(srcdir)/'`crypto_box/crypto_box_easy.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_box/$(DEPDIR)/libsodium_la-crypto_box_easy.Tpo crypto_box/$(DEPDIR)/libsodium_la-crypto_box_easy.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_box/crypto_box_easy.c' object='crypto_box/libsodium_la-crypto_box_easy.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_box/libsodium_la-crypto_box_easy.lo `test -f 'crypto_box/crypto_box_easy.c' || echo '$(srcdir)/'`crypto_box/crypto_box_easy.c\n\ncrypto_box/libsodium_la-crypto_box_seal.lo: crypto_box/crypto_box_seal.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_box/libsodium_la-crypto_box_seal.lo -MD -MP -MF crypto_box/$(DEPDIR)/libsodium_la-crypto_box_seal.Tpo -c -o crypto_box/libsodium_la-crypto_box_seal.lo `test -f 'crypto_box/crypto_box_seal.c' || echo '$(srcdir)/'`crypto_box/crypto_box_seal.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_box/$(DEPDIR)/libsodium_la-crypto_box_seal.Tpo crypto_box/$(DEPDIR)/libsodium_la-crypto_box_seal.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_box/crypto_box_seal.c' object='crypto_box/libsodium_la-crypto_box_seal.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_box/libsodium_la-crypto_box_seal.lo `test -f 'crypto_box/crypto_box_seal.c' || echo '$(srcdir)/'`crypto_box/crypto_box_seal.c\n\ncrypto_box/curve25519xsalsa20poly1305/libsodium_la-box_curve25519xsalsa20poly1305_api.lo: crypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_box/curve25519xsalsa20poly1305/libsodium_la-box_curve25519xsalsa20poly1305_api.lo -MD -MP -MF crypto_box/curve25519xsalsa20poly1305/$(DEPDIR)/libsodium_la-box_curve25519xsalsa20poly1305_api.Tpo -c -o crypto_box/curve25519xsalsa20poly1305/libsodium_la-box_curve25519xsalsa20poly1305_api.lo `test -f 'crypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305_api.c' || echo '$(srcdir)/'`crypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_box/curve25519xsalsa20poly1305/$(DEPDIR)/libsodium_la-box_curve25519xsalsa20poly1305_api.Tpo crypto_box/curve25519xsalsa20poly1305/$(DEPDIR)/libsodium_la-box_curve25519xsalsa20poly1305_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305_api.c' object='crypto_box/curve25519xsalsa20poly1305/libsodium_la-box_curve25519xsalsa20poly1305_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_box/curve25519xsalsa20poly1305/libsodium_la-box_curve25519xsalsa20poly1305_api.lo `test -f 'crypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305_api.c' || echo '$(srcdir)/'`crypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305_api.c\n\ncrypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-after_curve25519xsalsa20poly1305.lo: crypto_box/curve25519xsalsa20poly1305/ref/after_curve25519xsalsa20poly1305.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-after_curve25519xsalsa20poly1305.lo -MD -MP -MF crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-after_curve25519xsalsa20poly1305.Tpo -c -o crypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-after_curve25519xsalsa20poly1305.lo `test -f 'crypto_box/curve25519xsalsa20poly1305/ref/after_curve25519xsalsa20poly1305.c' || echo '$(srcdir)/'`crypto_box/curve25519xsalsa20poly1305/ref/after_curve25519xsalsa20poly1305.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-after_curve25519xsalsa20poly1305.Tpo crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-after_curve25519xsalsa20poly1305.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_box/curve25519xsalsa20poly1305/ref/after_curve25519xsalsa20poly1305.c' object='crypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-after_curve25519xsalsa20poly1305.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-after_curve25519xsalsa20poly1305.lo `test -f 'crypto_box/curve25519xsalsa20poly1305/ref/after_curve25519xsalsa20poly1305.c' || echo '$(srcdir)/'`crypto_box/curve25519xsalsa20poly1305/ref/after_curve25519xsalsa20poly1305.c\n\ncrypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-before_curve25519xsalsa20poly1305.lo: crypto_box/curve25519xsalsa20poly1305/ref/before_curve25519xsalsa20poly1305.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-before_curve25519xsalsa20poly1305.lo -MD -MP -MF crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-before_curve25519xsalsa20poly1305.Tpo -c -o crypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-before_curve25519xsalsa20poly1305.lo `test -f 'crypto_box/curve25519xsalsa20poly1305/ref/before_curve25519xsalsa20poly1305.c' || echo '$(srcdir)/'`crypto_box/curve25519xsalsa20poly1305/ref/before_curve25519xsalsa20poly1305.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-before_curve25519xsalsa20poly1305.Tpo crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-before_curve25519xsalsa20poly1305.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_box/curve25519xsalsa20poly1305/ref/before_curve25519xsalsa20poly1305.c' object='crypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-before_curve25519xsalsa20poly1305.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-before_curve25519xsalsa20poly1305.lo `test -f 'crypto_box/curve25519xsalsa20poly1305/ref/before_curve25519xsalsa20poly1305.c' || echo '$(srcdir)/'`crypto_box/curve25519xsalsa20poly1305/ref/before_curve25519xsalsa20poly1305.c\n\ncrypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-box_curve25519xsalsa20poly1305.lo: crypto_box/curve25519xsalsa20poly1305/ref/box_curve25519xsalsa20poly1305.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-box_curve25519xsalsa20poly1305.lo -MD -MP -MF crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-box_curve25519xsalsa20poly1305.Tpo -c -o crypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-box_curve25519xsalsa20poly1305.lo `test -f 'crypto_box/curve25519xsalsa20poly1305/ref/box_curve25519xsalsa20poly1305.c' || echo '$(srcdir)/'`crypto_box/curve25519xsalsa20poly1305/ref/box_curve25519xsalsa20poly1305.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-box_curve25519xsalsa20poly1305.Tpo crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-box_curve25519xsalsa20poly1305.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_box/curve25519xsalsa20poly1305/ref/box_curve25519xsalsa20poly1305.c' object='crypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-box_curve25519xsalsa20poly1305.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-box_curve25519xsalsa20poly1305.lo `test -f 'crypto_box/curve25519xsalsa20poly1305/ref/box_curve25519xsalsa20poly1305.c' || echo '$(srcdir)/'`crypto_box/curve25519xsalsa20poly1305/ref/box_curve25519xsalsa20poly1305.c\n\ncrypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-keypair_curve25519xsalsa20poly1305.lo: crypto_box/curve25519xsalsa20poly1305/ref/keypair_curve25519xsalsa20poly1305.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-keypair_curve25519xsalsa20poly1305.lo -MD -MP -MF crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-keypair_curve25519xsalsa20poly1305.Tpo -c -o crypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-keypair_curve25519xsalsa20poly1305.lo `test -f 'crypto_box/curve25519xsalsa20poly1305/ref/keypair_curve25519xsalsa20poly1305.c' || echo '$(srcdir)/'`crypto_box/curve25519xsalsa20poly1305/ref/keypair_curve25519xsalsa20poly1305.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-keypair_curve25519xsalsa20poly1305.Tpo crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-keypair_curve25519xsalsa20poly1305.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_box/curve25519xsalsa20poly1305/ref/keypair_curve25519xsalsa20poly1305.c' object='crypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-keypair_curve25519xsalsa20poly1305.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_box/curve25519xsalsa20poly1305/ref/libsodium_la-keypair_curve25519xsalsa20poly1305.lo `test -f 'crypto_box/curve25519xsalsa20poly1305/ref/keypair_curve25519xsalsa20poly1305.c' || echo '$(srcdir)/'`crypto_box/curve25519xsalsa20poly1305/ref/keypair_curve25519xsalsa20poly1305.c\n\ncrypto_core/hsalsa20/ref2/libsodium_la-core_hsalsa20.lo: crypto_core/hsalsa20/ref2/core_hsalsa20.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_core/hsalsa20/ref2/libsodium_la-core_hsalsa20.lo -MD -MP -MF crypto_core/hsalsa20/ref2/$(DEPDIR)/libsodium_la-core_hsalsa20.Tpo -c -o crypto_core/hsalsa20/ref2/libsodium_la-core_hsalsa20.lo `test -f 'crypto_core/hsalsa20/ref2/core_hsalsa20.c' || echo '$(srcdir)/'`crypto_core/hsalsa20/ref2/core_hsalsa20.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_core/hsalsa20/ref2/$(DEPDIR)/libsodium_la-core_hsalsa20.Tpo crypto_core/hsalsa20/ref2/$(DEPDIR)/libsodium_la-core_hsalsa20.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_core/hsalsa20/ref2/core_hsalsa20.c' object='crypto_core/hsalsa20/ref2/libsodium_la-core_hsalsa20.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_core/hsalsa20/ref2/libsodium_la-core_hsalsa20.lo `test -f 'crypto_core/hsalsa20/ref2/core_hsalsa20.c' || echo '$(srcdir)/'`crypto_core/hsalsa20/ref2/core_hsalsa20.c\n\ncrypto_core/hsalsa20/libsodium_la-core_hsalsa20_api.lo: crypto_core/hsalsa20/core_hsalsa20_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_core/hsalsa20/libsodium_la-core_hsalsa20_api.lo -MD -MP -MF crypto_core/hsalsa20/$(DEPDIR)/libsodium_la-core_hsalsa20_api.Tpo -c -o crypto_core/hsalsa20/libsodium_la-core_hsalsa20_api.lo `test -f 'crypto_core/hsalsa20/core_hsalsa20_api.c' || echo '$(srcdir)/'`crypto_core/hsalsa20/core_hsalsa20_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_core/hsalsa20/$(DEPDIR)/libsodium_la-core_hsalsa20_api.Tpo crypto_core/hsalsa20/$(DEPDIR)/libsodium_la-core_hsalsa20_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_core/hsalsa20/core_hsalsa20_api.c' object='crypto_core/hsalsa20/libsodium_la-core_hsalsa20_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_core/hsalsa20/libsodium_la-core_hsalsa20_api.lo `test -f 'crypto_core/hsalsa20/core_hsalsa20_api.c' || echo '$(srcdir)/'`crypto_core/hsalsa20/core_hsalsa20_api.c\n\ncrypto_core/salsa20/ref/libsodium_la-core_salsa20.lo: crypto_core/salsa20/ref/core_salsa20.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_core/salsa20/ref/libsodium_la-core_salsa20.lo -MD -MP -MF crypto_core/salsa20/ref/$(DEPDIR)/libsodium_la-core_salsa20.Tpo -c -o crypto_core/salsa20/ref/libsodium_la-core_salsa20.lo `test -f 'crypto_core/salsa20/ref/core_salsa20.c' || echo '$(srcdir)/'`crypto_core/salsa20/ref/core_salsa20.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_core/salsa20/ref/$(DEPDIR)/libsodium_la-core_salsa20.Tpo crypto_core/salsa20/ref/$(DEPDIR)/libsodium_la-core_salsa20.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_core/salsa20/ref/core_salsa20.c' object='crypto_core/salsa20/ref/libsodium_la-core_salsa20.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_core/salsa20/ref/libsodium_la-core_salsa20.lo `test -f 'crypto_core/salsa20/ref/core_salsa20.c' || echo '$(srcdir)/'`crypto_core/salsa20/ref/core_salsa20.c\n\ncrypto_core/salsa20/libsodium_la-core_salsa20_api.lo: crypto_core/salsa20/core_salsa20_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_core/salsa20/libsodium_la-core_salsa20_api.lo -MD -MP -MF crypto_core/salsa20/$(DEPDIR)/libsodium_la-core_salsa20_api.Tpo -c -o crypto_core/salsa20/libsodium_la-core_salsa20_api.lo `test -f 'crypto_core/salsa20/core_salsa20_api.c' || echo '$(srcdir)/'`crypto_core/salsa20/core_salsa20_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_core/salsa20/$(DEPDIR)/libsodium_la-core_salsa20_api.Tpo crypto_core/salsa20/$(DEPDIR)/libsodium_la-core_salsa20_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_core/salsa20/core_salsa20_api.c' object='crypto_core/salsa20/libsodium_la-core_salsa20_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_core/salsa20/libsodium_la-core_salsa20_api.lo `test -f 'crypto_core/salsa20/core_salsa20_api.c' || echo '$(srcdir)/'`crypto_core/salsa20/core_salsa20_api.c\n\ncrypto_generichash/libsodium_la-crypto_generichash.lo: crypto_generichash/crypto_generichash.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_generichash/libsodium_la-crypto_generichash.lo -MD -MP -MF crypto_generichash/$(DEPDIR)/libsodium_la-crypto_generichash.Tpo -c -o crypto_generichash/libsodium_la-crypto_generichash.lo `test -f 'crypto_generichash/crypto_generichash.c' || echo '$(srcdir)/'`crypto_generichash/crypto_generichash.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_generichash/$(DEPDIR)/libsodium_la-crypto_generichash.Tpo crypto_generichash/$(DEPDIR)/libsodium_la-crypto_generichash.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_generichash/crypto_generichash.c' object='crypto_generichash/libsodium_la-crypto_generichash.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_generichash/libsodium_la-crypto_generichash.lo `test -f 'crypto_generichash/crypto_generichash.c' || echo '$(srcdir)/'`crypto_generichash/crypto_generichash.c\n\ncrypto_generichash/blake2/libsodium_la-generichash_blake2_api.lo: crypto_generichash/blake2/generichash_blake2_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_generichash/blake2/libsodium_la-generichash_blake2_api.lo -MD -MP -MF crypto_generichash/blake2/$(DEPDIR)/libsodium_la-generichash_blake2_api.Tpo -c -o crypto_generichash/blake2/libsodium_la-generichash_blake2_api.lo `test -f 'crypto_generichash/blake2/generichash_blake2_api.c' || echo '$(srcdir)/'`crypto_generichash/blake2/generichash_blake2_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_generichash/blake2/$(DEPDIR)/libsodium_la-generichash_blake2_api.Tpo crypto_generichash/blake2/$(DEPDIR)/libsodium_la-generichash_blake2_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_generichash/blake2/generichash_blake2_api.c' object='crypto_generichash/blake2/libsodium_la-generichash_blake2_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_generichash/blake2/libsodium_la-generichash_blake2_api.lo `test -f 'crypto_generichash/blake2/generichash_blake2_api.c' || echo '$(srcdir)/'`crypto_generichash/blake2/generichash_blake2_api.c\n\ncrypto_generichash/blake2/ref/libsodium_la-blake2b-compress-ref.lo: crypto_generichash/blake2/ref/blake2b-compress-ref.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_generichash/blake2/ref/libsodium_la-blake2b-compress-ref.lo -MD -MP -MF crypto_generichash/blake2/ref/$(DEPDIR)/libsodium_la-blake2b-compress-ref.Tpo -c -o crypto_generichash/blake2/ref/libsodium_la-blake2b-compress-ref.lo `test -f 'crypto_generichash/blake2/ref/blake2b-compress-ref.c' || echo '$(srcdir)/'`crypto_generichash/blake2/ref/blake2b-compress-ref.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_generichash/blake2/ref/$(DEPDIR)/libsodium_la-blake2b-compress-ref.Tpo crypto_generichash/blake2/ref/$(DEPDIR)/libsodium_la-blake2b-compress-ref.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_generichash/blake2/ref/blake2b-compress-ref.c' object='crypto_generichash/blake2/ref/libsodium_la-blake2b-compress-ref.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_generichash/blake2/ref/libsodium_la-blake2b-compress-ref.lo `test -f 'crypto_generichash/blake2/ref/blake2b-compress-ref.c' || echo '$(srcdir)/'`crypto_generichash/blake2/ref/blake2b-compress-ref.c\n\ncrypto_generichash/blake2/ref/libsodium_la-blake2b-ref.lo: crypto_generichash/blake2/ref/blake2b-ref.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_generichash/blake2/ref/libsodium_la-blake2b-ref.lo -MD -MP -MF crypto_generichash/blake2/ref/$(DEPDIR)/libsodium_la-blake2b-ref.Tpo -c -o crypto_generichash/blake2/ref/libsodium_la-blake2b-ref.lo `test -f 'crypto_generichash/blake2/ref/blake2b-ref.c' || echo '$(srcdir)/'`crypto_generichash/blake2/ref/blake2b-ref.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_generichash/blake2/ref/$(DEPDIR)/libsodium_la-blake2b-ref.Tpo crypto_generichash/blake2/ref/$(DEPDIR)/libsodium_la-blake2b-ref.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_generichash/blake2/ref/blake2b-ref.c' object='crypto_generichash/blake2/ref/libsodium_la-blake2b-ref.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_generichash/blake2/ref/libsodium_la-blake2b-ref.lo `test -f 'crypto_generichash/blake2/ref/blake2b-ref.c' || echo '$(srcdir)/'`crypto_generichash/blake2/ref/blake2b-ref.c\n\ncrypto_generichash/blake2/ref/libsodium_la-generichash_blake2b.lo: crypto_generichash/blake2/ref/generichash_blake2b.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_generichash/blake2/ref/libsodium_la-generichash_blake2b.lo -MD -MP -MF crypto_generichash/blake2/ref/$(DEPDIR)/libsodium_la-generichash_blake2b.Tpo -c -o crypto_generichash/blake2/ref/libsodium_la-generichash_blake2b.lo `test -f 'crypto_generichash/blake2/ref/generichash_blake2b.c' || echo '$(srcdir)/'`crypto_generichash/blake2/ref/generichash_blake2b.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_generichash/blake2/ref/$(DEPDIR)/libsodium_la-generichash_blake2b.Tpo crypto_generichash/blake2/ref/$(DEPDIR)/libsodium_la-generichash_blake2b.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_generichash/blake2/ref/generichash_blake2b.c' object='crypto_generichash/blake2/ref/libsodium_la-generichash_blake2b.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_generichash/blake2/ref/libsodium_la-generichash_blake2b.lo `test -f 'crypto_generichash/blake2/ref/generichash_blake2b.c' || echo '$(srcdir)/'`crypto_generichash/blake2/ref/generichash_blake2b.c\n\ncrypto_hash/libsodium_la-crypto_hash.lo: crypto_hash/crypto_hash.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_hash/libsodium_la-crypto_hash.lo -MD -MP -MF crypto_hash/$(DEPDIR)/libsodium_la-crypto_hash.Tpo -c -o crypto_hash/libsodium_la-crypto_hash.lo `test -f 'crypto_hash/crypto_hash.c' || echo '$(srcdir)/'`crypto_hash/crypto_hash.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_hash/$(DEPDIR)/libsodium_la-crypto_hash.Tpo crypto_hash/$(DEPDIR)/libsodium_la-crypto_hash.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_hash/crypto_hash.c' object='crypto_hash/libsodium_la-crypto_hash.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_hash/libsodium_la-crypto_hash.lo `test -f 'crypto_hash/crypto_hash.c' || echo '$(srcdir)/'`crypto_hash/crypto_hash.c\n\ncrypto_hash/sha256/libsodium_la-hash_sha256_api.lo: crypto_hash/sha256/hash_sha256_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_hash/sha256/libsodium_la-hash_sha256_api.lo -MD -MP -MF crypto_hash/sha256/$(DEPDIR)/libsodium_la-hash_sha256_api.Tpo -c -o crypto_hash/sha256/libsodium_la-hash_sha256_api.lo `test -f 'crypto_hash/sha256/hash_sha256_api.c' || echo '$(srcdir)/'`crypto_hash/sha256/hash_sha256_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_hash/sha256/$(DEPDIR)/libsodium_la-hash_sha256_api.Tpo crypto_hash/sha256/$(DEPDIR)/libsodium_la-hash_sha256_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_hash/sha256/hash_sha256_api.c' object='crypto_hash/sha256/libsodium_la-hash_sha256_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_hash/sha256/libsodium_la-hash_sha256_api.lo `test -f 'crypto_hash/sha256/hash_sha256_api.c' || echo '$(srcdir)/'`crypto_hash/sha256/hash_sha256_api.c\n\ncrypto_hash/sha256/cp/libsodium_la-hash_sha256.lo: crypto_hash/sha256/cp/hash_sha256.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_hash/sha256/cp/libsodium_la-hash_sha256.lo -MD -MP -MF crypto_hash/sha256/cp/$(DEPDIR)/libsodium_la-hash_sha256.Tpo -c -o crypto_hash/sha256/cp/libsodium_la-hash_sha256.lo `test -f 'crypto_hash/sha256/cp/hash_sha256.c' || echo '$(srcdir)/'`crypto_hash/sha256/cp/hash_sha256.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_hash/sha256/cp/$(DEPDIR)/libsodium_la-hash_sha256.Tpo crypto_hash/sha256/cp/$(DEPDIR)/libsodium_la-hash_sha256.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_hash/sha256/cp/hash_sha256.c' object='crypto_hash/sha256/cp/libsodium_la-hash_sha256.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_hash/sha256/cp/libsodium_la-hash_sha256.lo `test -f 'crypto_hash/sha256/cp/hash_sha256.c' || echo '$(srcdir)/'`crypto_hash/sha256/cp/hash_sha256.c\n\ncrypto_hash/sha512/libsodium_la-hash_sha512_api.lo: crypto_hash/sha512/hash_sha512_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_hash/sha512/libsodium_la-hash_sha512_api.lo -MD -MP -MF crypto_hash/sha512/$(DEPDIR)/libsodium_la-hash_sha512_api.Tpo -c -o crypto_hash/sha512/libsodium_la-hash_sha512_api.lo `test -f 'crypto_hash/sha512/hash_sha512_api.c' || echo '$(srcdir)/'`crypto_hash/sha512/hash_sha512_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_hash/sha512/$(DEPDIR)/libsodium_la-hash_sha512_api.Tpo crypto_hash/sha512/$(DEPDIR)/libsodium_la-hash_sha512_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_hash/sha512/hash_sha512_api.c' object='crypto_hash/sha512/libsodium_la-hash_sha512_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_hash/sha512/libsodium_la-hash_sha512_api.lo `test -f 'crypto_hash/sha512/hash_sha512_api.c' || echo '$(srcdir)/'`crypto_hash/sha512/hash_sha512_api.c\n\ncrypto_hash/sha512/cp/libsodium_la-hash_sha512.lo: crypto_hash/sha512/cp/hash_sha512.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_hash/sha512/cp/libsodium_la-hash_sha512.lo -MD -MP -MF crypto_hash/sha512/cp/$(DEPDIR)/libsodium_la-hash_sha512.Tpo -c -o crypto_hash/sha512/cp/libsodium_la-hash_sha512.lo `test -f 'crypto_hash/sha512/cp/hash_sha512.c' || echo '$(srcdir)/'`crypto_hash/sha512/cp/hash_sha512.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_hash/sha512/cp/$(DEPDIR)/libsodium_la-hash_sha512.Tpo crypto_hash/sha512/cp/$(DEPDIR)/libsodium_la-hash_sha512.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_hash/sha512/cp/hash_sha512.c' object='crypto_hash/sha512/cp/libsodium_la-hash_sha512.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_hash/sha512/cp/libsodium_la-hash_sha512.lo `test -f 'crypto_hash/sha512/cp/hash_sha512.c' || echo '$(srcdir)/'`crypto_hash/sha512/cp/hash_sha512.c\n\ncrypto_onetimeauth/libsodium_la-crypto_onetimeauth.lo: crypto_onetimeauth/crypto_onetimeauth.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_onetimeauth/libsodium_la-crypto_onetimeauth.lo -MD -MP -MF crypto_onetimeauth/$(DEPDIR)/libsodium_la-crypto_onetimeauth.Tpo -c -o crypto_onetimeauth/libsodium_la-crypto_onetimeauth.lo `test -f 'crypto_onetimeauth/crypto_onetimeauth.c' || echo '$(srcdir)/'`crypto_onetimeauth/crypto_onetimeauth.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_onetimeauth/$(DEPDIR)/libsodium_la-crypto_onetimeauth.Tpo crypto_onetimeauth/$(DEPDIR)/libsodium_la-crypto_onetimeauth.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_onetimeauth/crypto_onetimeauth.c' object='crypto_onetimeauth/libsodium_la-crypto_onetimeauth.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_onetimeauth/libsodium_la-crypto_onetimeauth.lo `test -f 'crypto_onetimeauth/crypto_onetimeauth.c' || echo '$(srcdir)/'`crypto_onetimeauth/crypto_onetimeauth.c\n\ncrypto_onetimeauth/poly1305/libsodium_la-onetimeauth_poly1305.lo: crypto_onetimeauth/poly1305/onetimeauth_poly1305.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_onetimeauth/poly1305/libsodium_la-onetimeauth_poly1305.lo -MD -MP -MF crypto_onetimeauth/poly1305/$(DEPDIR)/libsodium_la-onetimeauth_poly1305.Tpo -c -o crypto_onetimeauth/poly1305/libsodium_la-onetimeauth_poly1305.lo `test -f 'crypto_onetimeauth/poly1305/onetimeauth_poly1305.c' || echo '$(srcdir)/'`crypto_onetimeauth/poly1305/onetimeauth_poly1305.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_onetimeauth/poly1305/$(DEPDIR)/libsodium_la-onetimeauth_poly1305.Tpo crypto_onetimeauth/poly1305/$(DEPDIR)/libsodium_la-onetimeauth_poly1305.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_onetimeauth/poly1305/onetimeauth_poly1305.c' object='crypto_onetimeauth/poly1305/libsodium_la-onetimeauth_poly1305.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_onetimeauth/poly1305/libsodium_la-onetimeauth_poly1305.lo `test -f 'crypto_onetimeauth/poly1305/onetimeauth_poly1305.c' || echo '$(srcdir)/'`crypto_onetimeauth/poly1305/onetimeauth_poly1305.c\n\ncrypto_onetimeauth/poly1305/donna/libsodium_la-poly1305_donna.lo: crypto_onetimeauth/poly1305/donna/poly1305_donna.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_onetimeauth/poly1305/donna/libsodium_la-poly1305_donna.lo -MD -MP -MF crypto_onetimeauth/poly1305/donna/$(DEPDIR)/libsodium_la-poly1305_donna.Tpo -c -o crypto_onetimeauth/poly1305/donna/libsodium_la-poly1305_donna.lo `test -f 'crypto_onetimeauth/poly1305/donna/poly1305_donna.c' || echo '$(srcdir)/'`crypto_onetimeauth/poly1305/donna/poly1305_donna.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_onetimeauth/poly1305/donna/$(DEPDIR)/libsodium_la-poly1305_donna.Tpo crypto_onetimeauth/poly1305/donna/$(DEPDIR)/libsodium_la-poly1305_donna.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_onetimeauth/poly1305/donna/poly1305_donna.c' object='crypto_onetimeauth/poly1305/donna/libsodium_la-poly1305_donna.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_onetimeauth/poly1305/donna/libsodium_la-poly1305_donna.lo `test -f 'crypto_onetimeauth/poly1305/donna/poly1305_donna.c' || echo '$(srcdir)/'`crypto_onetimeauth/poly1305/donna/poly1305_donna.c\n\ncrypto_pwhash/scryptsalsa208sha256/libsodium_la-crypto_scrypt-common.lo: crypto_pwhash/scryptsalsa208sha256/crypto_scrypt-common.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_pwhash/scryptsalsa208sha256/libsodium_la-crypto_scrypt-common.lo -MD -MP -MF crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/libsodium_la-crypto_scrypt-common.Tpo -c -o crypto_pwhash/scryptsalsa208sha256/libsodium_la-crypto_scrypt-common.lo `test -f 'crypto_pwhash/scryptsalsa208sha256/crypto_scrypt-common.c' || echo '$(srcdir)/'`crypto_pwhash/scryptsalsa208sha256/crypto_scrypt-common.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/libsodium_la-crypto_scrypt-common.Tpo crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/libsodium_la-crypto_scrypt-common.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_pwhash/scryptsalsa208sha256/crypto_scrypt-common.c' object='crypto_pwhash/scryptsalsa208sha256/libsodium_la-crypto_scrypt-common.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_pwhash/scryptsalsa208sha256/libsodium_la-crypto_scrypt-common.lo `test -f 'crypto_pwhash/scryptsalsa208sha256/crypto_scrypt-common.c' || echo '$(srcdir)/'`crypto_pwhash/scryptsalsa208sha256/crypto_scrypt-common.c\n\ncrypto_pwhash/scryptsalsa208sha256/libsodium_la-scrypt_platform.lo: crypto_pwhash/scryptsalsa208sha256/scrypt_platform.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_pwhash/scryptsalsa208sha256/libsodium_la-scrypt_platform.lo -MD -MP -MF crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/libsodium_la-scrypt_platform.Tpo -c -o crypto_pwhash/scryptsalsa208sha256/libsodium_la-scrypt_platform.lo `test -f 'crypto_pwhash/scryptsalsa208sha256/scrypt_platform.c' || echo '$(srcdir)/'`crypto_pwhash/scryptsalsa208sha256/scrypt_platform.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/libsodium_la-scrypt_platform.Tpo crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/libsodium_la-scrypt_platform.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_pwhash/scryptsalsa208sha256/scrypt_platform.c' object='crypto_pwhash/scryptsalsa208sha256/libsodium_la-scrypt_platform.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_pwhash/scryptsalsa208sha256/libsodium_la-scrypt_platform.lo `test -f 'crypto_pwhash/scryptsalsa208sha256/scrypt_platform.c' || echo '$(srcdir)/'`crypto_pwhash/scryptsalsa208sha256/scrypt_platform.c\n\ncrypto_pwhash/scryptsalsa208sha256/libsodium_la-pbkdf2-sha256.lo: crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_pwhash/scryptsalsa208sha256/libsodium_la-pbkdf2-sha256.lo -MD -MP -MF crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/libsodium_la-pbkdf2-sha256.Tpo -c -o crypto_pwhash/scryptsalsa208sha256/libsodium_la-pbkdf2-sha256.lo `test -f 'crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.c' || echo '$(srcdir)/'`crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/libsodium_la-pbkdf2-sha256.Tpo crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/libsodium_la-pbkdf2-sha256.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.c' object='crypto_pwhash/scryptsalsa208sha256/libsodium_la-pbkdf2-sha256.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_pwhash/scryptsalsa208sha256/libsodium_la-pbkdf2-sha256.lo `test -f 'crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.c' || echo '$(srcdir)/'`crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.c\n\ncrypto_pwhash/scryptsalsa208sha256/libsodium_la-pwhash_scryptsalsa208sha256.lo: crypto_pwhash/scryptsalsa208sha256/pwhash_scryptsalsa208sha256.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_pwhash/scryptsalsa208sha256/libsodium_la-pwhash_scryptsalsa208sha256.lo -MD -MP -MF crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/libsodium_la-pwhash_scryptsalsa208sha256.Tpo -c -o crypto_pwhash/scryptsalsa208sha256/libsodium_la-pwhash_scryptsalsa208sha256.lo `test -f 'crypto_pwhash/scryptsalsa208sha256/pwhash_scryptsalsa208sha256.c' || echo '$(srcdir)/'`crypto_pwhash/scryptsalsa208sha256/pwhash_scryptsalsa208sha256.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/libsodium_la-pwhash_scryptsalsa208sha256.Tpo crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/libsodium_la-pwhash_scryptsalsa208sha256.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_pwhash/scryptsalsa208sha256/pwhash_scryptsalsa208sha256.c' object='crypto_pwhash/scryptsalsa208sha256/libsodium_la-pwhash_scryptsalsa208sha256.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_pwhash/scryptsalsa208sha256/libsodium_la-pwhash_scryptsalsa208sha256.lo `test -f 'crypto_pwhash/scryptsalsa208sha256/pwhash_scryptsalsa208sha256.c' || echo '$(srcdir)/'`crypto_pwhash/scryptsalsa208sha256/pwhash_scryptsalsa208sha256.c\n\ncrypto_pwhash/scryptsalsa208sha256/nosse/libsodium_la-pwhash_scryptsalsa208sha256_nosse.lo: crypto_pwhash/scryptsalsa208sha256/nosse/pwhash_scryptsalsa208sha256_nosse.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_pwhash/scryptsalsa208sha256/nosse/libsodium_la-pwhash_scryptsalsa208sha256_nosse.lo -MD -MP -MF crypto_pwhash/scryptsalsa208sha256/nosse/$(DEPDIR)/libsodium_la-pwhash_scryptsalsa208sha256_nosse.Tpo -c -o crypto_pwhash/scryptsalsa208sha256/nosse/libsodium_la-pwhash_scryptsalsa208sha256_nosse.lo `test -f 'crypto_pwhash/scryptsalsa208sha256/nosse/pwhash_scryptsalsa208sha256_nosse.c' || echo '$(srcdir)/'`crypto_pwhash/scryptsalsa208sha256/nosse/pwhash_scryptsalsa208sha256_nosse.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_pwhash/scryptsalsa208sha256/nosse/$(DEPDIR)/libsodium_la-pwhash_scryptsalsa208sha256_nosse.Tpo crypto_pwhash/scryptsalsa208sha256/nosse/$(DEPDIR)/libsodium_la-pwhash_scryptsalsa208sha256_nosse.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_pwhash/scryptsalsa208sha256/nosse/pwhash_scryptsalsa208sha256_nosse.c' object='crypto_pwhash/scryptsalsa208sha256/nosse/libsodium_la-pwhash_scryptsalsa208sha256_nosse.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_pwhash/scryptsalsa208sha256/nosse/libsodium_la-pwhash_scryptsalsa208sha256_nosse.lo `test -f 'crypto_pwhash/scryptsalsa208sha256/nosse/pwhash_scryptsalsa208sha256_nosse.c' || echo '$(srcdir)/'`crypto_pwhash/scryptsalsa208sha256/nosse/pwhash_scryptsalsa208sha256_nosse.c\n\ncrypto_scalarmult/libsodium_la-crypto_scalarmult.lo: crypto_scalarmult/crypto_scalarmult.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/libsodium_la-crypto_scalarmult.lo -MD -MP -MF crypto_scalarmult/$(DEPDIR)/libsodium_la-crypto_scalarmult.Tpo -c -o crypto_scalarmult/libsodium_la-crypto_scalarmult.lo `test -f 'crypto_scalarmult/crypto_scalarmult.c' || echo '$(srcdir)/'`crypto_scalarmult/crypto_scalarmult.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/$(DEPDIR)/libsodium_la-crypto_scalarmult.Tpo crypto_scalarmult/$(DEPDIR)/libsodium_la-crypto_scalarmult.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/crypto_scalarmult.c' object='crypto_scalarmult/libsodium_la-crypto_scalarmult.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/libsodium_la-crypto_scalarmult.lo `test -f 'crypto_scalarmult/crypto_scalarmult.c' || echo '$(srcdir)/'`crypto_scalarmult/crypto_scalarmult.c\n\ncrypto_scalarmult/curve25519/libsodium_la-scalarmult_curve25519.lo: crypto_scalarmult/curve25519/scalarmult_curve25519.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/libsodium_la-scalarmult_curve25519.lo -MD -MP -MF crypto_scalarmult/curve25519/$(DEPDIR)/libsodium_la-scalarmult_curve25519.Tpo -c -o crypto_scalarmult/curve25519/libsodium_la-scalarmult_curve25519.lo `test -f 'crypto_scalarmult/curve25519/scalarmult_curve25519.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/scalarmult_curve25519.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/$(DEPDIR)/libsodium_la-scalarmult_curve25519.Tpo crypto_scalarmult/curve25519/$(DEPDIR)/libsodium_la-scalarmult_curve25519.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/scalarmult_curve25519.c' object='crypto_scalarmult/curve25519/libsodium_la-scalarmult_curve25519.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/libsodium_la-scalarmult_curve25519.lo `test -f 'crypto_scalarmult/curve25519/scalarmult_curve25519.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/scalarmult_curve25519.c\n\ncrypto_secretbox/libsodium_la-crypto_secretbox.lo: crypto_secretbox/crypto_secretbox.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_secretbox/libsodium_la-crypto_secretbox.lo -MD -MP -MF crypto_secretbox/$(DEPDIR)/libsodium_la-crypto_secretbox.Tpo -c -o crypto_secretbox/libsodium_la-crypto_secretbox.lo `test -f 'crypto_secretbox/crypto_secretbox.c' || echo '$(srcdir)/'`crypto_secretbox/crypto_secretbox.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_secretbox/$(DEPDIR)/libsodium_la-crypto_secretbox.Tpo crypto_secretbox/$(DEPDIR)/libsodium_la-crypto_secretbox.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_secretbox/crypto_secretbox.c' object='crypto_secretbox/libsodium_la-crypto_secretbox.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_secretbox/libsodium_la-crypto_secretbox.lo `test -f 'crypto_secretbox/crypto_secretbox.c' || echo '$(srcdir)/'`crypto_secretbox/crypto_secretbox.c\n\ncrypto_secretbox/libsodium_la-crypto_secretbox_easy.lo: crypto_secretbox/crypto_secretbox_easy.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_secretbox/libsodium_la-crypto_secretbox_easy.lo -MD -MP -MF crypto_secretbox/$(DEPDIR)/libsodium_la-crypto_secretbox_easy.Tpo -c -o crypto_secretbox/libsodium_la-crypto_secretbox_easy.lo `test -f 'crypto_secretbox/crypto_secretbox_easy.c' || echo '$(srcdir)/'`crypto_secretbox/crypto_secretbox_easy.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_secretbox/$(DEPDIR)/libsodium_la-crypto_secretbox_easy.Tpo crypto_secretbox/$(DEPDIR)/libsodium_la-crypto_secretbox_easy.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_secretbox/crypto_secretbox_easy.c' object='crypto_secretbox/libsodium_la-crypto_secretbox_easy.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_secretbox/libsodium_la-crypto_secretbox_easy.lo `test -f 'crypto_secretbox/crypto_secretbox_easy.c' || echo '$(srcdir)/'`crypto_secretbox/crypto_secretbox_easy.c\n\ncrypto_secretbox/xsalsa20poly1305/libsodium_la-secretbox_xsalsa20poly1305_api.lo: crypto_secretbox/xsalsa20poly1305/secretbox_xsalsa20poly1305_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_secretbox/xsalsa20poly1305/libsodium_la-secretbox_xsalsa20poly1305_api.lo -MD -MP -MF crypto_secretbox/xsalsa20poly1305/$(DEPDIR)/libsodium_la-secretbox_xsalsa20poly1305_api.Tpo -c -o crypto_secretbox/xsalsa20poly1305/libsodium_la-secretbox_xsalsa20poly1305_api.lo `test -f 'crypto_secretbox/xsalsa20poly1305/secretbox_xsalsa20poly1305_api.c' || echo '$(srcdir)/'`crypto_secretbox/xsalsa20poly1305/secretbox_xsalsa20poly1305_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_secretbox/xsalsa20poly1305/$(DEPDIR)/libsodium_la-secretbox_xsalsa20poly1305_api.Tpo crypto_secretbox/xsalsa20poly1305/$(DEPDIR)/libsodium_la-secretbox_xsalsa20poly1305_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_secretbox/xsalsa20poly1305/secretbox_xsalsa20poly1305_api.c' object='crypto_secretbox/xsalsa20poly1305/libsodium_la-secretbox_xsalsa20poly1305_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_secretbox/xsalsa20poly1305/libsodium_la-secretbox_xsalsa20poly1305_api.lo `test -f 'crypto_secretbox/xsalsa20poly1305/secretbox_xsalsa20poly1305_api.c' || echo '$(srcdir)/'`crypto_secretbox/xsalsa20poly1305/secretbox_xsalsa20poly1305_api.c\n\ncrypto_secretbox/xsalsa20poly1305/ref/libsodium_la-box_xsalsa20poly1305.lo: crypto_secretbox/xsalsa20poly1305/ref/box_xsalsa20poly1305.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_secretbox/xsalsa20poly1305/ref/libsodium_la-box_xsalsa20poly1305.lo -MD -MP -MF crypto_secretbox/xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-box_xsalsa20poly1305.Tpo -c -o crypto_secretbox/xsalsa20poly1305/ref/libsodium_la-box_xsalsa20poly1305.lo `test -f 'crypto_secretbox/xsalsa20poly1305/ref/box_xsalsa20poly1305.c' || echo '$(srcdir)/'`crypto_secretbox/xsalsa20poly1305/ref/box_xsalsa20poly1305.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_secretbox/xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-box_xsalsa20poly1305.Tpo crypto_secretbox/xsalsa20poly1305/ref/$(DEPDIR)/libsodium_la-box_xsalsa20poly1305.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_secretbox/xsalsa20poly1305/ref/box_xsalsa20poly1305.c' object='crypto_secretbox/xsalsa20poly1305/ref/libsodium_la-box_xsalsa20poly1305.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_secretbox/xsalsa20poly1305/ref/libsodium_la-box_xsalsa20poly1305.lo `test -f 'crypto_secretbox/xsalsa20poly1305/ref/box_xsalsa20poly1305.c' || echo '$(srcdir)/'`crypto_secretbox/xsalsa20poly1305/ref/box_xsalsa20poly1305.c\n\ncrypto_shorthash/libsodium_la-crypto_shorthash.lo: crypto_shorthash/crypto_shorthash.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_shorthash/libsodium_la-crypto_shorthash.lo -MD -MP -MF crypto_shorthash/$(DEPDIR)/libsodium_la-crypto_shorthash.Tpo -c -o crypto_shorthash/libsodium_la-crypto_shorthash.lo `test -f 'crypto_shorthash/crypto_shorthash.c' || echo '$(srcdir)/'`crypto_shorthash/crypto_shorthash.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_shorthash/$(DEPDIR)/libsodium_la-crypto_shorthash.Tpo crypto_shorthash/$(DEPDIR)/libsodium_la-crypto_shorthash.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_shorthash/crypto_shorthash.c' object='crypto_shorthash/libsodium_la-crypto_shorthash.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_shorthash/libsodium_la-crypto_shorthash.lo `test -f 'crypto_shorthash/crypto_shorthash.c' || echo '$(srcdir)/'`crypto_shorthash/crypto_shorthash.c\n\ncrypto_shorthash/siphash24/libsodium_la-shorthash_siphash24_api.lo: crypto_shorthash/siphash24/shorthash_siphash24_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_shorthash/siphash24/libsodium_la-shorthash_siphash24_api.lo -MD -MP -MF crypto_shorthash/siphash24/$(DEPDIR)/libsodium_la-shorthash_siphash24_api.Tpo -c -o crypto_shorthash/siphash24/libsodium_la-shorthash_siphash24_api.lo `test -f 'crypto_shorthash/siphash24/shorthash_siphash24_api.c' || echo '$(srcdir)/'`crypto_shorthash/siphash24/shorthash_siphash24_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_shorthash/siphash24/$(DEPDIR)/libsodium_la-shorthash_siphash24_api.Tpo crypto_shorthash/siphash24/$(DEPDIR)/libsodium_la-shorthash_siphash24_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_shorthash/siphash24/shorthash_siphash24_api.c' object='crypto_shorthash/siphash24/libsodium_la-shorthash_siphash24_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_shorthash/siphash24/libsodium_la-shorthash_siphash24_api.lo `test -f 'crypto_shorthash/siphash24/shorthash_siphash24_api.c' || echo '$(srcdir)/'`crypto_shorthash/siphash24/shorthash_siphash24_api.c\n\ncrypto_shorthash/siphash24/ref/libsodium_la-shorthash_siphash24.lo: crypto_shorthash/siphash24/ref/shorthash_siphash24.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_shorthash/siphash24/ref/libsodium_la-shorthash_siphash24.lo -MD -MP -MF crypto_shorthash/siphash24/ref/$(DEPDIR)/libsodium_la-shorthash_siphash24.Tpo -c -o crypto_shorthash/siphash24/ref/libsodium_la-shorthash_siphash24.lo `test -f 'crypto_shorthash/siphash24/ref/shorthash_siphash24.c' || echo '$(srcdir)/'`crypto_shorthash/siphash24/ref/shorthash_siphash24.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_shorthash/siphash24/ref/$(DEPDIR)/libsodium_la-shorthash_siphash24.Tpo crypto_shorthash/siphash24/ref/$(DEPDIR)/libsodium_la-shorthash_siphash24.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_shorthash/siphash24/ref/shorthash_siphash24.c' object='crypto_shorthash/siphash24/ref/libsodium_la-shorthash_siphash24.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_shorthash/siphash24/ref/libsodium_la-shorthash_siphash24.lo `test -f 'crypto_shorthash/siphash24/ref/shorthash_siphash24.c' || echo '$(srcdir)/'`crypto_shorthash/siphash24/ref/shorthash_siphash24.c\n\ncrypto_sign/libsodium_la-crypto_sign.lo: crypto_sign/crypto_sign.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/libsodium_la-crypto_sign.lo -MD -MP -MF crypto_sign/$(DEPDIR)/libsodium_la-crypto_sign.Tpo -c -o crypto_sign/libsodium_la-crypto_sign.lo `test -f 'crypto_sign/crypto_sign.c' || echo '$(srcdir)/'`crypto_sign/crypto_sign.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/$(DEPDIR)/libsodium_la-crypto_sign.Tpo crypto_sign/$(DEPDIR)/libsodium_la-crypto_sign.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/crypto_sign.c' object='crypto_sign/libsodium_la-crypto_sign.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/libsodium_la-crypto_sign.lo `test -f 'crypto_sign/crypto_sign.c' || echo '$(srcdir)/'`crypto_sign/crypto_sign.c\n\ncrypto_sign/ed25519/libsodium_la-sign_ed25519_api.lo: crypto_sign/ed25519/sign_ed25519_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/libsodium_la-sign_ed25519_api.lo -MD -MP -MF crypto_sign/ed25519/$(DEPDIR)/libsodium_la-sign_ed25519_api.Tpo -c -o crypto_sign/ed25519/libsodium_la-sign_ed25519_api.lo `test -f 'crypto_sign/ed25519/sign_ed25519_api.c' || echo '$(srcdir)/'`crypto_sign/ed25519/sign_ed25519_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/$(DEPDIR)/libsodium_la-sign_ed25519_api.Tpo crypto_sign/ed25519/$(DEPDIR)/libsodium_la-sign_ed25519_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/sign_ed25519_api.c' object='crypto_sign/ed25519/libsodium_la-sign_ed25519_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/libsodium_la-sign_ed25519_api.lo `test -f 'crypto_sign/ed25519/sign_ed25519_api.c' || echo '$(srcdir)/'`crypto_sign/ed25519/sign_ed25519_api.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-fe_0.lo: crypto_sign/ed25519/ref10/fe_0.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-fe_0.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_0.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_0.lo `test -f 'crypto_sign/ed25519/ref10/fe_0.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_0.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_0.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_0.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/fe_0.c' object='crypto_sign/ed25519/ref10/libsodium_la-fe_0.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_0.lo `test -f 'crypto_sign/ed25519/ref10/fe_0.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_0.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-fe_1.lo: crypto_sign/ed25519/ref10/fe_1.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-fe_1.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_1.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_1.lo `test -f 'crypto_sign/ed25519/ref10/fe_1.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_1.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_1.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_1.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/fe_1.c' object='crypto_sign/ed25519/ref10/libsodium_la-fe_1.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_1.lo `test -f 'crypto_sign/ed25519/ref10/fe_1.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_1.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-fe_add.lo: crypto_sign/ed25519/ref10/fe_add.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-fe_add.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_add.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_add.lo `test -f 'crypto_sign/ed25519/ref10/fe_add.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_add.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_add.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_add.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/fe_add.c' object='crypto_sign/ed25519/ref10/libsodium_la-fe_add.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_add.lo `test -f 'crypto_sign/ed25519/ref10/fe_add.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_add.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-fe_cmov.lo: crypto_sign/ed25519/ref10/fe_cmov.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-fe_cmov.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_cmov.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_cmov.lo `test -f 'crypto_sign/ed25519/ref10/fe_cmov.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_cmov.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_cmov.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_cmov.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/fe_cmov.c' object='crypto_sign/ed25519/ref10/libsodium_la-fe_cmov.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_cmov.lo `test -f 'crypto_sign/ed25519/ref10/fe_cmov.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_cmov.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-fe_copy.lo: crypto_sign/ed25519/ref10/fe_copy.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-fe_copy.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_copy.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_copy.lo `test -f 'crypto_sign/ed25519/ref10/fe_copy.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_copy.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_copy.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_copy.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/fe_copy.c' object='crypto_sign/ed25519/ref10/libsodium_la-fe_copy.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_copy.lo `test -f 'crypto_sign/ed25519/ref10/fe_copy.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_copy.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-fe_frombytes.lo: crypto_sign/ed25519/ref10/fe_frombytes.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-fe_frombytes.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_frombytes.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_frombytes.lo `test -f 'crypto_sign/ed25519/ref10/fe_frombytes.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_frombytes.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_frombytes.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_frombytes.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/fe_frombytes.c' object='crypto_sign/ed25519/ref10/libsodium_la-fe_frombytes.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_frombytes.lo `test -f 'crypto_sign/ed25519/ref10/fe_frombytes.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_frombytes.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-fe_invert.lo: crypto_sign/ed25519/ref10/fe_invert.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-fe_invert.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_invert.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_invert.lo `test -f 'crypto_sign/ed25519/ref10/fe_invert.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_invert.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_invert.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_invert.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/fe_invert.c' object='crypto_sign/ed25519/ref10/libsodium_la-fe_invert.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_invert.lo `test -f 'crypto_sign/ed25519/ref10/fe_invert.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_invert.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-fe_isnegative.lo: crypto_sign/ed25519/ref10/fe_isnegative.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-fe_isnegative.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_isnegative.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_isnegative.lo `test -f 'crypto_sign/ed25519/ref10/fe_isnegative.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_isnegative.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_isnegative.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_isnegative.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/fe_isnegative.c' object='crypto_sign/ed25519/ref10/libsodium_la-fe_isnegative.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_isnegative.lo `test -f 'crypto_sign/ed25519/ref10/fe_isnegative.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_isnegative.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-fe_isnonzero.lo: crypto_sign/ed25519/ref10/fe_isnonzero.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-fe_isnonzero.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_isnonzero.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_isnonzero.lo `test -f 'crypto_sign/ed25519/ref10/fe_isnonzero.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_isnonzero.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_isnonzero.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_isnonzero.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/fe_isnonzero.c' object='crypto_sign/ed25519/ref10/libsodium_la-fe_isnonzero.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_isnonzero.lo `test -f 'crypto_sign/ed25519/ref10/fe_isnonzero.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_isnonzero.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-fe_mul.lo: crypto_sign/ed25519/ref10/fe_mul.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-fe_mul.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_mul.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_mul.lo `test -f 'crypto_sign/ed25519/ref10/fe_mul.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_mul.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_mul.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_mul.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/fe_mul.c' object='crypto_sign/ed25519/ref10/libsodium_la-fe_mul.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_mul.lo `test -f 'crypto_sign/ed25519/ref10/fe_mul.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_mul.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-fe_neg.lo: crypto_sign/ed25519/ref10/fe_neg.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-fe_neg.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_neg.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_neg.lo `test -f 'crypto_sign/ed25519/ref10/fe_neg.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_neg.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_neg.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_neg.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/fe_neg.c' object='crypto_sign/ed25519/ref10/libsodium_la-fe_neg.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_neg.lo `test -f 'crypto_sign/ed25519/ref10/fe_neg.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_neg.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-fe_pow22523.lo: crypto_sign/ed25519/ref10/fe_pow22523.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-fe_pow22523.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_pow22523.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_pow22523.lo `test -f 'crypto_sign/ed25519/ref10/fe_pow22523.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_pow22523.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_pow22523.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_pow22523.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/fe_pow22523.c' object='crypto_sign/ed25519/ref10/libsodium_la-fe_pow22523.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_pow22523.lo `test -f 'crypto_sign/ed25519/ref10/fe_pow22523.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_pow22523.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-fe_sq.lo: crypto_sign/ed25519/ref10/fe_sq.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-fe_sq.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_sq.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_sq.lo `test -f 'crypto_sign/ed25519/ref10/fe_sq.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_sq.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_sq.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_sq.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/fe_sq.c' object='crypto_sign/ed25519/ref10/libsodium_la-fe_sq.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_sq.lo `test -f 'crypto_sign/ed25519/ref10/fe_sq.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_sq.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-fe_sq2.lo: crypto_sign/ed25519/ref10/fe_sq2.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-fe_sq2.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_sq2.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_sq2.lo `test -f 'crypto_sign/ed25519/ref10/fe_sq2.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_sq2.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_sq2.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_sq2.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/fe_sq2.c' object='crypto_sign/ed25519/ref10/libsodium_la-fe_sq2.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_sq2.lo `test -f 'crypto_sign/ed25519/ref10/fe_sq2.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_sq2.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-fe_sub.lo: crypto_sign/ed25519/ref10/fe_sub.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-fe_sub.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_sub.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_sub.lo `test -f 'crypto_sign/ed25519/ref10/fe_sub.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_sub.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_sub.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_sub.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/fe_sub.c' object='crypto_sign/ed25519/ref10/libsodium_la-fe_sub.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_sub.lo `test -f 'crypto_sign/ed25519/ref10/fe_sub.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_sub.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-fe_tobytes.lo: crypto_sign/ed25519/ref10/fe_tobytes.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-fe_tobytes.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_tobytes.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_tobytes.lo `test -f 'crypto_sign/ed25519/ref10/fe_tobytes.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_tobytes.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_tobytes.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-fe_tobytes.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/fe_tobytes.c' object='crypto_sign/ed25519/ref10/libsodium_la-fe_tobytes.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-fe_tobytes.lo `test -f 'crypto_sign/ed25519/ref10/fe_tobytes.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/fe_tobytes.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_add.lo: crypto_sign/ed25519/ref10/ge_add.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_add.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_add.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_add.lo `test -f 'crypto_sign/ed25519/ref10/ge_add.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_add.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_add.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_add.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_add.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_add.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_add.lo `test -f 'crypto_sign/ed25519/ref10/ge_add.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_add.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_double_scalarmult.lo: crypto_sign/ed25519/ref10/ge_double_scalarmult.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_double_scalarmult.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_double_scalarmult.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_double_scalarmult.lo `test -f 'crypto_sign/ed25519/ref10/ge_double_scalarmult.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_double_scalarmult.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_double_scalarmult.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_double_scalarmult.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_double_scalarmult.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_double_scalarmult.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_double_scalarmult.lo `test -f 'crypto_sign/ed25519/ref10/ge_double_scalarmult.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_double_scalarmult.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_frombytes.lo: crypto_sign/ed25519/ref10/ge_frombytes.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_frombytes.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_frombytes.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_frombytes.lo `test -f 'crypto_sign/ed25519/ref10/ge_frombytes.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_frombytes.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_frombytes.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_frombytes.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_frombytes.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_frombytes.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_frombytes.lo `test -f 'crypto_sign/ed25519/ref10/ge_frombytes.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_frombytes.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_madd.lo: crypto_sign/ed25519/ref10/ge_madd.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_madd.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_madd.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_madd.lo `test -f 'crypto_sign/ed25519/ref10/ge_madd.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_madd.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_madd.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_madd.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_madd.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_madd.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_madd.lo `test -f 'crypto_sign/ed25519/ref10/ge_madd.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_madd.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_msub.lo: crypto_sign/ed25519/ref10/ge_msub.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_msub.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_msub.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_msub.lo `test -f 'crypto_sign/ed25519/ref10/ge_msub.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_msub.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_msub.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_msub.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_msub.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_msub.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_msub.lo `test -f 'crypto_sign/ed25519/ref10/ge_msub.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_msub.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p1p1_to_p2.lo: crypto_sign/ed25519/ref10/ge_p1p1_to_p2.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_p1p1_to_p2.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p1p1_to_p2.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p1p1_to_p2.lo `test -f 'crypto_sign/ed25519/ref10/ge_p1p1_to_p2.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p1p1_to_p2.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p1p1_to_p2.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p1p1_to_p2.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_p1p1_to_p2.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_p1p1_to_p2.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p1p1_to_p2.lo `test -f 'crypto_sign/ed25519/ref10/ge_p1p1_to_p2.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p1p1_to_p2.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p1p1_to_p3.lo: crypto_sign/ed25519/ref10/ge_p1p1_to_p3.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_p1p1_to_p3.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p1p1_to_p3.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p1p1_to_p3.lo `test -f 'crypto_sign/ed25519/ref10/ge_p1p1_to_p3.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p1p1_to_p3.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p1p1_to_p3.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p1p1_to_p3.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_p1p1_to_p3.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_p1p1_to_p3.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p1p1_to_p3.lo `test -f 'crypto_sign/ed25519/ref10/ge_p1p1_to_p3.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p1p1_to_p3.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p2_0.lo: crypto_sign/ed25519/ref10/ge_p2_0.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_p2_0.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p2_0.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p2_0.lo `test -f 'crypto_sign/ed25519/ref10/ge_p2_0.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p2_0.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p2_0.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p2_0.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_p2_0.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_p2_0.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p2_0.lo `test -f 'crypto_sign/ed25519/ref10/ge_p2_0.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p2_0.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p2_dbl.lo: crypto_sign/ed25519/ref10/ge_p2_dbl.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_p2_dbl.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p2_dbl.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p2_dbl.lo `test -f 'crypto_sign/ed25519/ref10/ge_p2_dbl.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p2_dbl.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p2_dbl.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p2_dbl.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_p2_dbl.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_p2_dbl.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p2_dbl.lo `test -f 'crypto_sign/ed25519/ref10/ge_p2_dbl.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p2_dbl.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p3_0.lo: crypto_sign/ed25519/ref10/ge_p3_0.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_p3_0.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_0.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p3_0.lo `test -f 'crypto_sign/ed25519/ref10/ge_p3_0.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p3_0.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_0.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_0.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_p3_0.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_p3_0.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p3_0.lo `test -f 'crypto_sign/ed25519/ref10/ge_p3_0.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p3_0.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p3_dbl.lo: crypto_sign/ed25519/ref10/ge_p3_dbl.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_p3_dbl.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_dbl.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p3_dbl.lo `test -f 'crypto_sign/ed25519/ref10/ge_p3_dbl.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p3_dbl.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_dbl.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_dbl.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_p3_dbl.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_p3_dbl.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p3_dbl.lo `test -f 'crypto_sign/ed25519/ref10/ge_p3_dbl.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p3_dbl.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p3_to_cached.lo: crypto_sign/ed25519/ref10/ge_p3_to_cached.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_p3_to_cached.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_to_cached.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p3_to_cached.lo `test -f 'crypto_sign/ed25519/ref10/ge_p3_to_cached.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p3_to_cached.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_to_cached.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_to_cached.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_p3_to_cached.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_p3_to_cached.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p3_to_cached.lo `test -f 'crypto_sign/ed25519/ref10/ge_p3_to_cached.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p3_to_cached.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p3_to_p2.lo: crypto_sign/ed25519/ref10/ge_p3_to_p2.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_p3_to_p2.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_to_p2.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p3_to_p2.lo `test -f 'crypto_sign/ed25519/ref10/ge_p3_to_p2.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p3_to_p2.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_to_p2.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_to_p2.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_p3_to_p2.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_p3_to_p2.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p3_to_p2.lo `test -f 'crypto_sign/ed25519/ref10/ge_p3_to_p2.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p3_to_p2.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_p3_tobytes.lo: crypto_sign/ed25519/ref10/ge_p3_tobytes.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_p3_tobytes.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_tobytes.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p3_tobytes.lo `test -f 'crypto_sign/ed25519/ref10/ge_p3_tobytes.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p3_tobytes.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_tobytes.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_p3_tobytes.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_p3_tobytes.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_p3_tobytes.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_p3_tobytes.lo `test -f 'crypto_sign/ed25519/ref10/ge_p3_tobytes.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_p3_tobytes.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_precomp_0.lo: crypto_sign/ed25519/ref10/ge_precomp_0.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_precomp_0.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_precomp_0.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_precomp_0.lo `test -f 'crypto_sign/ed25519/ref10/ge_precomp_0.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_precomp_0.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_precomp_0.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_precomp_0.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_precomp_0.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_precomp_0.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_precomp_0.lo `test -f 'crypto_sign/ed25519/ref10/ge_precomp_0.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_precomp_0.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_scalarmult_base.lo: crypto_sign/ed25519/ref10/ge_scalarmult_base.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_scalarmult_base.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_scalarmult_base.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_scalarmult_base.lo `test -f 'crypto_sign/ed25519/ref10/ge_scalarmult_base.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_scalarmult_base.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_scalarmult_base.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_scalarmult_base.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_scalarmult_base.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_scalarmult_base.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_scalarmult_base.lo `test -f 'crypto_sign/ed25519/ref10/ge_scalarmult_base.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_scalarmult_base.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_sub.lo: crypto_sign/ed25519/ref10/ge_sub.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_sub.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_sub.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_sub.lo `test -f 'crypto_sign/ed25519/ref10/ge_sub.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_sub.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_sub.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_sub.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_sub.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_sub.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_sub.lo `test -f 'crypto_sign/ed25519/ref10/ge_sub.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_sub.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-ge_tobytes.lo: crypto_sign/ed25519/ref10/ge_tobytes.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-ge_tobytes.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_tobytes.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_tobytes.lo `test -f 'crypto_sign/ed25519/ref10/ge_tobytes.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_tobytes.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_tobytes.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-ge_tobytes.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/ge_tobytes.c' object='crypto_sign/ed25519/ref10/libsodium_la-ge_tobytes.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-ge_tobytes.lo `test -f 'crypto_sign/ed25519/ref10/ge_tobytes.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/ge_tobytes.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-keypair.lo: crypto_sign/ed25519/ref10/keypair.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-keypair.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-keypair.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-keypair.lo `test -f 'crypto_sign/ed25519/ref10/keypair.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/keypair.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-keypair.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-keypair.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/keypair.c' object='crypto_sign/ed25519/ref10/libsodium_la-keypair.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-keypair.lo `test -f 'crypto_sign/ed25519/ref10/keypair.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/keypair.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-open.lo: crypto_sign/ed25519/ref10/open.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-open.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-open.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-open.lo `test -f 'crypto_sign/ed25519/ref10/open.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/open.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-open.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-open.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/open.c' object='crypto_sign/ed25519/ref10/libsodium_la-open.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-open.lo `test -f 'crypto_sign/ed25519/ref10/open.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/open.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-sc_muladd.lo: crypto_sign/ed25519/ref10/sc_muladd.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-sc_muladd.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-sc_muladd.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-sc_muladd.lo `test -f 'crypto_sign/ed25519/ref10/sc_muladd.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/sc_muladd.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-sc_muladd.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-sc_muladd.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/sc_muladd.c' object='crypto_sign/ed25519/ref10/libsodium_la-sc_muladd.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-sc_muladd.lo `test -f 'crypto_sign/ed25519/ref10/sc_muladd.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/sc_muladd.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-sc_reduce.lo: crypto_sign/ed25519/ref10/sc_reduce.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-sc_reduce.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-sc_reduce.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-sc_reduce.lo `test -f 'crypto_sign/ed25519/ref10/sc_reduce.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/sc_reduce.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-sc_reduce.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-sc_reduce.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/sc_reduce.c' object='crypto_sign/ed25519/ref10/libsodium_la-sc_reduce.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-sc_reduce.lo `test -f 'crypto_sign/ed25519/ref10/sc_reduce.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/sc_reduce.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-sign.lo: crypto_sign/ed25519/ref10/sign.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-sign.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-sign.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-sign.lo `test -f 'crypto_sign/ed25519/ref10/sign.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/sign.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-sign.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-sign.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/sign.c' object='crypto_sign/ed25519/ref10/libsodium_la-sign.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-sign.lo `test -f 'crypto_sign/ed25519/ref10/sign.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/sign.c\n\ncrypto_stream/libsodium_la-crypto_stream.lo: crypto_stream/crypto_stream.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/libsodium_la-crypto_stream.lo -MD -MP -MF crypto_stream/$(DEPDIR)/libsodium_la-crypto_stream.Tpo -c -o crypto_stream/libsodium_la-crypto_stream.lo `test -f 'crypto_stream/crypto_stream.c' || echo '$(srcdir)/'`crypto_stream/crypto_stream.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/$(DEPDIR)/libsodium_la-crypto_stream.Tpo crypto_stream/$(DEPDIR)/libsodium_la-crypto_stream.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/crypto_stream.c' object='crypto_stream/libsodium_la-crypto_stream.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/libsodium_la-crypto_stream.lo `test -f 'crypto_stream/crypto_stream.c' || echo '$(srcdir)/'`crypto_stream/crypto_stream.c\n\ncrypto_stream/chacha20/libsodium_la-stream_chacha20.lo: crypto_stream/chacha20/stream_chacha20.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/chacha20/libsodium_la-stream_chacha20.lo -MD -MP -MF crypto_stream/chacha20/$(DEPDIR)/libsodium_la-stream_chacha20.Tpo -c -o crypto_stream/chacha20/libsodium_la-stream_chacha20.lo `test -f 'crypto_stream/chacha20/stream_chacha20.c' || echo '$(srcdir)/'`crypto_stream/chacha20/stream_chacha20.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/chacha20/$(DEPDIR)/libsodium_la-stream_chacha20.Tpo crypto_stream/chacha20/$(DEPDIR)/libsodium_la-stream_chacha20.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/chacha20/stream_chacha20.c' object='crypto_stream/chacha20/libsodium_la-stream_chacha20.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/chacha20/libsodium_la-stream_chacha20.lo `test -f 'crypto_stream/chacha20/stream_chacha20.c' || echo '$(srcdir)/'`crypto_stream/chacha20/stream_chacha20.c\n\ncrypto_stream/chacha20/ref/libsodium_la-stream_chacha20_ref.lo: crypto_stream/chacha20/ref/stream_chacha20_ref.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/chacha20/ref/libsodium_la-stream_chacha20_ref.lo -MD -MP -MF crypto_stream/chacha20/ref/$(DEPDIR)/libsodium_la-stream_chacha20_ref.Tpo -c -o crypto_stream/chacha20/ref/libsodium_la-stream_chacha20_ref.lo `test -f 'crypto_stream/chacha20/ref/stream_chacha20_ref.c' || echo '$(srcdir)/'`crypto_stream/chacha20/ref/stream_chacha20_ref.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/chacha20/ref/$(DEPDIR)/libsodium_la-stream_chacha20_ref.Tpo crypto_stream/chacha20/ref/$(DEPDIR)/libsodium_la-stream_chacha20_ref.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/chacha20/ref/stream_chacha20_ref.c' object='crypto_stream/chacha20/ref/libsodium_la-stream_chacha20_ref.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/chacha20/ref/libsodium_la-stream_chacha20_ref.lo `test -f 'crypto_stream/chacha20/ref/stream_chacha20_ref.c' || echo '$(srcdir)/'`crypto_stream/chacha20/ref/stream_chacha20_ref.c\n\ncrypto_stream/salsa20/libsodium_la-stream_salsa20_api.lo: crypto_stream/salsa20/stream_salsa20_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/salsa20/libsodium_la-stream_salsa20_api.lo -MD -MP -MF crypto_stream/salsa20/$(DEPDIR)/libsodium_la-stream_salsa20_api.Tpo -c -o crypto_stream/salsa20/libsodium_la-stream_salsa20_api.lo `test -f 'crypto_stream/salsa20/stream_salsa20_api.c' || echo '$(srcdir)/'`crypto_stream/salsa20/stream_salsa20_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/salsa20/$(DEPDIR)/libsodium_la-stream_salsa20_api.Tpo crypto_stream/salsa20/$(DEPDIR)/libsodium_la-stream_salsa20_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/salsa20/stream_salsa20_api.c' object='crypto_stream/salsa20/libsodium_la-stream_salsa20_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/salsa20/libsodium_la-stream_salsa20_api.lo `test -f 'crypto_stream/salsa20/stream_salsa20_api.c' || echo '$(srcdir)/'`crypto_stream/salsa20/stream_salsa20_api.c\n\ncrypto_stream/xsalsa20/libsodium_la-stream_xsalsa20_api.lo: crypto_stream/xsalsa20/stream_xsalsa20_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/xsalsa20/libsodium_la-stream_xsalsa20_api.lo -MD -MP -MF crypto_stream/xsalsa20/$(DEPDIR)/libsodium_la-stream_xsalsa20_api.Tpo -c -o crypto_stream/xsalsa20/libsodium_la-stream_xsalsa20_api.lo `test -f 'crypto_stream/xsalsa20/stream_xsalsa20_api.c' || echo '$(srcdir)/'`crypto_stream/xsalsa20/stream_xsalsa20_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/xsalsa20/$(DEPDIR)/libsodium_la-stream_xsalsa20_api.Tpo crypto_stream/xsalsa20/$(DEPDIR)/libsodium_la-stream_xsalsa20_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/xsalsa20/stream_xsalsa20_api.c' object='crypto_stream/xsalsa20/libsodium_la-stream_xsalsa20_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/xsalsa20/libsodium_la-stream_xsalsa20_api.lo `test -f 'crypto_stream/xsalsa20/stream_xsalsa20_api.c' || echo '$(srcdir)/'`crypto_stream/xsalsa20/stream_xsalsa20_api.c\n\ncrypto_stream/xsalsa20/ref/libsodium_la-stream_xsalsa20.lo: crypto_stream/xsalsa20/ref/stream_xsalsa20.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/xsalsa20/ref/libsodium_la-stream_xsalsa20.lo -MD -MP -MF crypto_stream/xsalsa20/ref/$(DEPDIR)/libsodium_la-stream_xsalsa20.Tpo -c -o crypto_stream/xsalsa20/ref/libsodium_la-stream_xsalsa20.lo `test -f 'crypto_stream/xsalsa20/ref/stream_xsalsa20.c' || echo '$(srcdir)/'`crypto_stream/xsalsa20/ref/stream_xsalsa20.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/xsalsa20/ref/$(DEPDIR)/libsodium_la-stream_xsalsa20.Tpo crypto_stream/xsalsa20/ref/$(DEPDIR)/libsodium_la-stream_xsalsa20.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/xsalsa20/ref/stream_xsalsa20.c' object='crypto_stream/xsalsa20/ref/libsodium_la-stream_xsalsa20.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/xsalsa20/ref/libsodium_la-stream_xsalsa20.lo `test -f 'crypto_stream/xsalsa20/ref/stream_xsalsa20.c' || echo '$(srcdir)/'`crypto_stream/xsalsa20/ref/stream_xsalsa20.c\n\ncrypto_stream/xsalsa20/ref/libsodium_la-xor_xsalsa20.lo: crypto_stream/xsalsa20/ref/xor_xsalsa20.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/xsalsa20/ref/libsodium_la-xor_xsalsa20.lo -MD -MP -MF crypto_stream/xsalsa20/ref/$(DEPDIR)/libsodium_la-xor_xsalsa20.Tpo -c -o crypto_stream/xsalsa20/ref/libsodium_la-xor_xsalsa20.lo `test -f 'crypto_stream/xsalsa20/ref/xor_xsalsa20.c' || echo '$(srcdir)/'`crypto_stream/xsalsa20/ref/xor_xsalsa20.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/xsalsa20/ref/$(DEPDIR)/libsodium_la-xor_xsalsa20.Tpo crypto_stream/xsalsa20/ref/$(DEPDIR)/libsodium_la-xor_xsalsa20.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/xsalsa20/ref/xor_xsalsa20.c' object='crypto_stream/xsalsa20/ref/libsodium_la-xor_xsalsa20.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/xsalsa20/ref/libsodium_la-xor_xsalsa20.lo `test -f 'crypto_stream/xsalsa20/ref/xor_xsalsa20.c' || echo '$(srcdir)/'`crypto_stream/xsalsa20/ref/xor_xsalsa20.c\n\ncrypto_verify/16/libsodium_la-verify_16_api.lo: crypto_verify/16/verify_16_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_verify/16/libsodium_la-verify_16_api.lo -MD -MP -MF crypto_verify/16/$(DEPDIR)/libsodium_la-verify_16_api.Tpo -c -o crypto_verify/16/libsodium_la-verify_16_api.lo `test -f 'crypto_verify/16/verify_16_api.c' || echo '$(srcdir)/'`crypto_verify/16/verify_16_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_verify/16/$(DEPDIR)/libsodium_la-verify_16_api.Tpo crypto_verify/16/$(DEPDIR)/libsodium_la-verify_16_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_verify/16/verify_16_api.c' object='crypto_verify/16/libsodium_la-verify_16_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_verify/16/libsodium_la-verify_16_api.lo `test -f 'crypto_verify/16/verify_16_api.c' || echo '$(srcdir)/'`crypto_verify/16/verify_16_api.c\n\ncrypto_verify/16/ref/libsodium_la-verify_16.lo: crypto_verify/16/ref/verify_16.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_verify/16/ref/libsodium_la-verify_16.lo -MD -MP -MF crypto_verify/16/ref/$(DEPDIR)/libsodium_la-verify_16.Tpo -c -o crypto_verify/16/ref/libsodium_la-verify_16.lo `test -f 'crypto_verify/16/ref/verify_16.c' || echo '$(srcdir)/'`crypto_verify/16/ref/verify_16.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_verify/16/ref/$(DEPDIR)/libsodium_la-verify_16.Tpo crypto_verify/16/ref/$(DEPDIR)/libsodium_la-verify_16.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_verify/16/ref/verify_16.c' object='crypto_verify/16/ref/libsodium_la-verify_16.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_verify/16/ref/libsodium_la-verify_16.lo `test -f 'crypto_verify/16/ref/verify_16.c' || echo '$(srcdir)/'`crypto_verify/16/ref/verify_16.c\n\ncrypto_verify/32/libsodium_la-verify_32_api.lo: crypto_verify/32/verify_32_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_verify/32/libsodium_la-verify_32_api.lo -MD -MP -MF crypto_verify/32/$(DEPDIR)/libsodium_la-verify_32_api.Tpo -c -o crypto_verify/32/libsodium_la-verify_32_api.lo `test -f 'crypto_verify/32/verify_32_api.c' || echo '$(srcdir)/'`crypto_verify/32/verify_32_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_verify/32/$(DEPDIR)/libsodium_la-verify_32_api.Tpo crypto_verify/32/$(DEPDIR)/libsodium_la-verify_32_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_verify/32/verify_32_api.c' object='crypto_verify/32/libsodium_la-verify_32_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_verify/32/libsodium_la-verify_32_api.lo `test -f 'crypto_verify/32/verify_32_api.c' || echo '$(srcdir)/'`crypto_verify/32/verify_32_api.c\n\ncrypto_verify/32/ref/libsodium_la-verify_32.lo: crypto_verify/32/ref/verify_32.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_verify/32/ref/libsodium_la-verify_32.lo -MD -MP -MF crypto_verify/32/ref/$(DEPDIR)/libsodium_la-verify_32.Tpo -c -o crypto_verify/32/ref/libsodium_la-verify_32.lo `test -f 'crypto_verify/32/ref/verify_32.c' || echo '$(srcdir)/'`crypto_verify/32/ref/verify_32.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_verify/32/ref/$(DEPDIR)/libsodium_la-verify_32.Tpo crypto_verify/32/ref/$(DEPDIR)/libsodium_la-verify_32.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_verify/32/ref/verify_32.c' object='crypto_verify/32/ref/libsodium_la-verify_32.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_verify/32/ref/libsodium_la-verify_32.lo `test -f 'crypto_verify/32/ref/verify_32.c' || echo '$(srcdir)/'`crypto_verify/32/ref/verify_32.c\n\ncrypto_verify/64/libsodium_la-verify_64_api.lo: crypto_verify/64/verify_64_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_verify/64/libsodium_la-verify_64_api.lo -MD -MP -MF crypto_verify/64/$(DEPDIR)/libsodium_la-verify_64_api.Tpo -c -o crypto_verify/64/libsodium_la-verify_64_api.lo `test -f 'crypto_verify/64/verify_64_api.c' || echo '$(srcdir)/'`crypto_verify/64/verify_64_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_verify/64/$(DEPDIR)/libsodium_la-verify_64_api.Tpo crypto_verify/64/$(DEPDIR)/libsodium_la-verify_64_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_verify/64/verify_64_api.c' object='crypto_verify/64/libsodium_la-verify_64_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_verify/64/libsodium_la-verify_64_api.lo `test -f 'crypto_verify/64/verify_64_api.c' || echo '$(srcdir)/'`crypto_verify/64/verify_64_api.c\n\ncrypto_verify/64/ref/libsodium_la-verify_64.lo: crypto_verify/64/ref/verify_64.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_verify/64/ref/libsodium_la-verify_64.lo -MD -MP -MF crypto_verify/64/ref/$(DEPDIR)/libsodium_la-verify_64.Tpo -c -o crypto_verify/64/ref/libsodium_la-verify_64.lo `test -f 'crypto_verify/64/ref/verify_64.c' || echo '$(srcdir)/'`crypto_verify/64/ref/verify_64.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_verify/64/ref/$(DEPDIR)/libsodium_la-verify_64.Tpo crypto_verify/64/ref/$(DEPDIR)/libsodium_la-verify_64.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_verify/64/ref/verify_64.c' object='crypto_verify/64/ref/libsodium_la-verify_64.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_verify/64/ref/libsodium_la-verify_64.lo `test -f 'crypto_verify/64/ref/verify_64.c' || echo '$(srcdir)/'`crypto_verify/64/ref/verify_64.c\n\nrandombytes/libsodium_la-randombytes.lo: randombytes/randombytes.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT randombytes/libsodium_la-randombytes.lo -MD -MP -MF randombytes/$(DEPDIR)/libsodium_la-randombytes.Tpo -c -o randombytes/libsodium_la-randombytes.lo `test -f 'randombytes/randombytes.c' || echo '$(srcdir)/'`randombytes/randombytes.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) randombytes/$(DEPDIR)/libsodium_la-randombytes.Tpo randombytes/$(DEPDIR)/libsodium_la-randombytes.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='randombytes/randombytes.c' object='randombytes/libsodium_la-randombytes.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o randombytes/libsodium_la-randombytes.lo `test -f 'randombytes/randombytes.c' || echo '$(srcdir)/'`randombytes/randombytes.c\n\nsodium/libsodium_la-core.lo: sodium/core.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sodium/libsodium_la-core.lo -MD -MP -MF sodium/$(DEPDIR)/libsodium_la-core.Tpo -c -o sodium/libsodium_la-core.lo `test -f 'sodium/core.c' || echo '$(srcdir)/'`sodium/core.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) sodium/$(DEPDIR)/libsodium_la-core.Tpo sodium/$(DEPDIR)/libsodium_la-core.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='sodium/core.c' object='sodium/libsodium_la-core.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sodium/libsodium_la-core.lo `test -f 'sodium/core.c' || echo '$(srcdir)/'`sodium/core.c\n\nsodium/libsodium_la-runtime.lo: sodium/runtime.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sodium/libsodium_la-runtime.lo -MD -MP -MF sodium/$(DEPDIR)/libsodium_la-runtime.Tpo -c -o sodium/libsodium_la-runtime.lo `test -f 'sodium/runtime.c' || echo '$(srcdir)/'`sodium/runtime.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) sodium/$(DEPDIR)/libsodium_la-runtime.Tpo sodium/$(DEPDIR)/libsodium_la-runtime.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='sodium/runtime.c' object='sodium/libsodium_la-runtime.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sodium/libsodium_la-runtime.lo `test -f 'sodium/runtime.c' || echo '$(srcdir)/'`sodium/runtime.c\n\nsodium/libsodium_la-utils.lo: sodium/utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sodium/libsodium_la-utils.lo -MD -MP -MF sodium/$(DEPDIR)/libsodium_la-utils.Tpo -c -o sodium/libsodium_la-utils.lo `test -f 'sodium/utils.c' || echo '$(srcdir)/'`sodium/utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) sodium/$(DEPDIR)/libsodium_la-utils.Tpo sodium/$(DEPDIR)/libsodium_la-utils.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='sodium/utils.c' object='sodium/libsodium_la-utils.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sodium/libsodium_la-utils.lo `test -f 'sodium/utils.c' || echo '$(srcdir)/'`sodium/utils.c\n\nsodium/libsodium_la-version.lo: sodium/version.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT sodium/libsodium_la-version.lo -MD -MP -MF sodium/$(DEPDIR)/libsodium_la-version.Tpo -c -o sodium/libsodium_la-version.lo `test -f 'sodium/version.c' || echo '$(srcdir)/'`sodium/version.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) sodium/$(DEPDIR)/libsodium_la-version.Tpo sodium/$(DEPDIR)/libsodium_la-version.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='sodium/version.c' object='sodium/libsodium_la-version.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sodium/libsodium_la-version.lo `test -f 'sodium/version.c' || echo '$(srcdir)/'`sodium/version.c\n\nrandombytes/salsa20/libsodium_la-randombytes_salsa20_random.lo: randombytes/salsa20/randombytes_salsa20_random.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT randombytes/salsa20/libsodium_la-randombytes_salsa20_random.lo -MD -MP -MF randombytes/salsa20/$(DEPDIR)/libsodium_la-randombytes_salsa20_random.Tpo -c -o randombytes/salsa20/libsodium_la-randombytes_salsa20_random.lo `test -f 'randombytes/salsa20/randombytes_salsa20_random.c' || echo '$(srcdir)/'`randombytes/salsa20/randombytes_salsa20_random.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) randombytes/salsa20/$(DEPDIR)/libsodium_la-randombytes_salsa20_random.Tpo randombytes/salsa20/$(DEPDIR)/libsodium_la-randombytes_salsa20_random.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='randombytes/salsa20/randombytes_salsa20_random.c' object='randombytes/salsa20/libsodium_la-randombytes_salsa20_random.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o randombytes/salsa20/libsodium_la-randombytes_salsa20_random.lo `test -f 'randombytes/salsa20/randombytes_salsa20_random.c' || echo '$(srcdir)/'`randombytes/salsa20/randombytes_salsa20_random.c\n\nrandombytes/nativeclient/libsodium_la-randombytes_nativeclient.lo: randombytes/nativeclient/randombytes_nativeclient.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT randombytes/nativeclient/libsodium_la-randombytes_nativeclient.lo -MD -MP -MF randombytes/nativeclient/$(DEPDIR)/libsodium_la-randombytes_nativeclient.Tpo -c -o randombytes/nativeclient/libsodium_la-randombytes_nativeclient.lo `test -f 'randombytes/nativeclient/randombytes_nativeclient.c' || echo '$(srcdir)/'`randombytes/nativeclient/randombytes_nativeclient.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) randombytes/nativeclient/$(DEPDIR)/libsodium_la-randombytes_nativeclient.Tpo randombytes/nativeclient/$(DEPDIR)/libsodium_la-randombytes_nativeclient.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='randombytes/nativeclient/randombytes_nativeclient.c' object='randombytes/nativeclient/libsodium_la-randombytes_nativeclient.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o randombytes/nativeclient/libsodium_la-randombytes_nativeclient.lo `test -f 'randombytes/nativeclient/randombytes_nativeclient.c' || echo '$(srcdir)/'`randombytes/nativeclient/randombytes_nativeclient.c\n\nrandombytes/sysrandom/libsodium_la-randombytes_sysrandom.lo: randombytes/sysrandom/randombytes_sysrandom.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT randombytes/sysrandom/libsodium_la-randombytes_sysrandom.lo -MD -MP -MF randombytes/sysrandom/$(DEPDIR)/libsodium_la-randombytes_sysrandom.Tpo -c -o randombytes/sysrandom/libsodium_la-randombytes_sysrandom.lo `test -f 'randombytes/sysrandom/randombytes_sysrandom.c' || echo '$(srcdir)/'`randombytes/sysrandom/randombytes_sysrandom.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) randombytes/sysrandom/$(DEPDIR)/libsodium_la-randombytes_sysrandom.Tpo randombytes/sysrandom/$(DEPDIR)/libsodium_la-randombytes_sysrandom.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='randombytes/sysrandom/randombytes_sysrandom.c' object='randombytes/sysrandom/libsodium_la-randombytes_sysrandom.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o randombytes/sysrandom/libsodium_la-randombytes_sysrandom.lo `test -f 'randombytes/sysrandom/randombytes_sysrandom.c' || echo '$(srcdir)/'`randombytes/sysrandom/randombytes_sysrandom.c\n\ncrypto_scalarmult/curve25519/donna_c64/libsodium_la-curve25519_donna_c64.lo: crypto_scalarmult/curve25519/donna_c64/curve25519_donna_c64.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/donna_c64/libsodium_la-curve25519_donna_c64.lo -MD -MP -MF crypto_scalarmult/curve25519/donna_c64/$(DEPDIR)/libsodium_la-curve25519_donna_c64.Tpo -c -o crypto_scalarmult/curve25519/donna_c64/libsodium_la-curve25519_donna_c64.lo `test -f 'crypto_scalarmult/curve25519/donna_c64/curve25519_donna_c64.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/donna_c64/curve25519_donna_c64.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/donna_c64/$(DEPDIR)/libsodium_la-curve25519_donna_c64.Tpo crypto_scalarmult/curve25519/donna_c64/$(DEPDIR)/libsodium_la-curve25519_donna_c64.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/donna_c64/curve25519_donna_c64.c' object='crypto_scalarmult/curve25519/donna_c64/libsodium_la-curve25519_donna_c64.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/donna_c64/libsodium_la-curve25519_donna_c64.lo `test -f 'crypto_scalarmult/curve25519/donna_c64/curve25519_donna_c64.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/donna_c64/curve25519_donna_c64.c\n\ncrypto_scalarmult/curve25519/ref10/libsodium_la-curve25519_ref10.lo: crypto_scalarmult/curve25519/ref10/curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/ref10/libsodium_la-curve25519_ref10.lo -MD -MP -MF crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-curve25519_ref10.Tpo -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-curve25519_ref10.Tpo crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-curve25519_ref10.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/ref10/curve25519_ref10.c' object='crypto_scalarmult/curve25519/ref10/libsodium_la-curve25519_ref10.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/curve25519_ref10.c\n\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_0_curve25519_ref10.lo: crypto_scalarmult/curve25519/ref10/fe_0_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/ref10/libsodium_la-fe_0_curve25519_ref10.lo -MD -MP -MF crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_0_curve25519_ref10.Tpo -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_0_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_0_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_0_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_0_curve25519_ref10.Tpo crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_0_curve25519_ref10.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/ref10/fe_0_curve25519_ref10.c' object='crypto_scalarmult/curve25519/ref10/libsodium_la-fe_0_curve25519_ref10.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_0_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_0_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_0_curve25519_ref10.c\n\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_1_curve25519_ref10.lo: crypto_scalarmult/curve25519/ref10/fe_1_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/ref10/libsodium_la-fe_1_curve25519_ref10.lo -MD -MP -MF crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_1_curve25519_ref10.Tpo -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_1_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_1_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_1_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_1_curve25519_ref10.Tpo crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_1_curve25519_ref10.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/ref10/fe_1_curve25519_ref10.c' object='crypto_scalarmult/curve25519/ref10/libsodium_la-fe_1_curve25519_ref10.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_1_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_1_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_1_curve25519_ref10.c\n\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_add_curve25519_ref10.lo: crypto_scalarmult/curve25519/ref10/fe_add_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/ref10/libsodium_la-fe_add_curve25519_ref10.lo -MD -MP -MF crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_add_curve25519_ref10.Tpo -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_add_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_add_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_add_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_add_curve25519_ref10.Tpo crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_add_curve25519_ref10.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/ref10/fe_add_curve25519_ref10.c' object='crypto_scalarmult/curve25519/ref10/libsodium_la-fe_add_curve25519_ref10.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_add_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_add_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_add_curve25519_ref10.c\n\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_copy_curve25519_ref10.lo: crypto_scalarmult/curve25519/ref10/fe_copy_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/ref10/libsodium_la-fe_copy_curve25519_ref10.lo -MD -MP -MF crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_copy_curve25519_ref10.Tpo -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_copy_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_copy_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_copy_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_copy_curve25519_ref10.Tpo crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_copy_curve25519_ref10.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/ref10/fe_copy_curve25519_ref10.c' object='crypto_scalarmult/curve25519/ref10/libsodium_la-fe_copy_curve25519_ref10.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_copy_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_copy_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_copy_curve25519_ref10.c\n\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_cswap_curve25519_ref10.lo: crypto_scalarmult/curve25519/ref10/fe_cswap_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/ref10/libsodium_la-fe_cswap_curve25519_ref10.lo -MD -MP -MF crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_cswap_curve25519_ref10.Tpo -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_cswap_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_cswap_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_cswap_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_cswap_curve25519_ref10.Tpo crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_cswap_curve25519_ref10.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/ref10/fe_cswap_curve25519_ref10.c' object='crypto_scalarmult/curve25519/ref10/libsodium_la-fe_cswap_curve25519_ref10.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_cswap_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_cswap_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_cswap_curve25519_ref10.c\n\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_frombytes_curve25519_ref10.lo: crypto_scalarmult/curve25519/ref10/fe_frombytes_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/ref10/libsodium_la-fe_frombytes_curve25519_ref10.lo -MD -MP -MF crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_frombytes_curve25519_ref10.Tpo -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_frombytes_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_frombytes_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_frombytes_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_frombytes_curve25519_ref10.Tpo crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_frombytes_curve25519_ref10.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/ref10/fe_frombytes_curve25519_ref10.c' object='crypto_scalarmult/curve25519/ref10/libsodium_la-fe_frombytes_curve25519_ref10.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_frombytes_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_frombytes_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_frombytes_curve25519_ref10.c\n\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_invert_curve25519_ref10.lo: crypto_scalarmult/curve25519/ref10/fe_invert_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/ref10/libsodium_la-fe_invert_curve25519_ref10.lo -MD -MP -MF crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_invert_curve25519_ref10.Tpo -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_invert_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_invert_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_invert_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_invert_curve25519_ref10.Tpo crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_invert_curve25519_ref10.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/ref10/fe_invert_curve25519_ref10.c' object='crypto_scalarmult/curve25519/ref10/libsodium_la-fe_invert_curve25519_ref10.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_invert_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_invert_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_invert_curve25519_ref10.c\n\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_mul_curve25519_ref10.lo: crypto_scalarmult/curve25519/ref10/fe_mul_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/ref10/libsodium_la-fe_mul_curve25519_ref10.lo -MD -MP -MF crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_mul_curve25519_ref10.Tpo -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_mul_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_mul_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_mul_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_mul_curve25519_ref10.Tpo crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_mul_curve25519_ref10.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/ref10/fe_mul_curve25519_ref10.c' object='crypto_scalarmult/curve25519/ref10/libsodium_la-fe_mul_curve25519_ref10.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_mul_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_mul_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_mul_curve25519_ref10.c\n\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_mul121666_curve25519_ref10.lo: crypto_scalarmult/curve25519/ref10/fe_mul121666_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/ref10/libsodium_la-fe_mul121666_curve25519_ref10.lo -MD -MP -MF crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_mul121666_curve25519_ref10.Tpo -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_mul121666_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_mul121666_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_mul121666_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_mul121666_curve25519_ref10.Tpo crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_mul121666_curve25519_ref10.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/ref10/fe_mul121666_curve25519_ref10.c' object='crypto_scalarmult/curve25519/ref10/libsodium_la-fe_mul121666_curve25519_ref10.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_mul121666_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_mul121666_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_mul121666_curve25519_ref10.c\n\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_sq_curve25519_ref10.lo: crypto_scalarmult/curve25519/ref10/fe_sq_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/ref10/libsodium_la-fe_sq_curve25519_ref10.lo -MD -MP -MF crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_sq_curve25519_ref10.Tpo -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_sq_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_sq_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_sq_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_sq_curve25519_ref10.Tpo crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_sq_curve25519_ref10.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/ref10/fe_sq_curve25519_ref10.c' object='crypto_scalarmult/curve25519/ref10/libsodium_la-fe_sq_curve25519_ref10.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_sq_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_sq_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_sq_curve25519_ref10.c\n\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_sub_curve25519_ref10.lo: crypto_scalarmult/curve25519/ref10/fe_sub_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/ref10/libsodium_la-fe_sub_curve25519_ref10.lo -MD -MP -MF crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_sub_curve25519_ref10.Tpo -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_sub_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_sub_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_sub_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_sub_curve25519_ref10.Tpo crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_sub_curve25519_ref10.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/ref10/fe_sub_curve25519_ref10.c' object='crypto_scalarmult/curve25519/ref10/libsodium_la-fe_sub_curve25519_ref10.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_sub_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_sub_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_sub_curve25519_ref10.c\n\ncrypto_scalarmult/curve25519/ref10/libsodium_la-fe_tobytes_curve25519_ref10.lo: crypto_scalarmult/curve25519/ref10/fe_tobytes_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/ref10/libsodium_la-fe_tobytes_curve25519_ref10.lo -MD -MP -MF crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_tobytes_curve25519_ref10.Tpo -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_tobytes_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_tobytes_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_tobytes_curve25519_ref10.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_tobytes_curve25519_ref10.Tpo crypto_scalarmult/curve25519/ref10/$(DEPDIR)/libsodium_la-fe_tobytes_curve25519_ref10.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/ref10/fe_tobytes_curve25519_ref10.c' object='crypto_scalarmult/curve25519/ref10/libsodium_la-fe_tobytes_curve25519_ref10.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/ref10/libsodium_la-fe_tobytes_curve25519_ref10.lo `test -f 'crypto_scalarmult/curve25519/ref10/fe_tobytes_curve25519_ref10.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/ref10/fe_tobytes_curve25519_ref10.c\n\ncrypto_scalarmult/curve25519/sandy2x/libsodium_la-curve25519_sandy2x.lo: crypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/sandy2x/libsodium_la-curve25519_sandy2x.lo -MD -MP -MF crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/libsodium_la-curve25519_sandy2x.Tpo -c -o crypto_scalarmult/curve25519/sandy2x/libsodium_la-curve25519_sandy2x.lo `test -f 'crypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/libsodium_la-curve25519_sandy2x.Tpo crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/libsodium_la-curve25519_sandy2x.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.c' object='crypto_scalarmult/curve25519/sandy2x/libsodium_la-curve25519_sandy2x.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/sandy2x/libsodium_la-curve25519_sandy2x.lo `test -f 'crypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.c\n\ncrypto_scalarmult/curve25519/sandy2x/libsodium_la-fe51_invert.lo: crypto_scalarmult/curve25519/sandy2x/fe51_invert.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/sandy2x/libsodium_la-fe51_invert.lo -MD -MP -MF crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/libsodium_la-fe51_invert.Tpo -c -o crypto_scalarmult/curve25519/sandy2x/libsodium_la-fe51_invert.lo `test -f 'crypto_scalarmult/curve25519/sandy2x/fe51_invert.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/sandy2x/fe51_invert.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/libsodium_la-fe51_invert.Tpo crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/libsodium_la-fe51_invert.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/sandy2x/fe51_invert.c' object='crypto_scalarmult/curve25519/sandy2x/libsodium_la-fe51_invert.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/sandy2x/libsodium_la-fe51_invert.lo `test -f 'crypto_scalarmult/curve25519/sandy2x/fe51_invert.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/sandy2x/fe51_invert.c\n\ncrypto_scalarmult/curve25519/sandy2x/libsodium_la-fe_frombytes_sandy2x.lo: crypto_scalarmult/curve25519/sandy2x/fe_frombytes_sandy2x.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_scalarmult/curve25519/sandy2x/libsodium_la-fe_frombytes_sandy2x.lo -MD -MP -MF crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/libsodium_la-fe_frombytes_sandy2x.Tpo -c -o crypto_scalarmult/curve25519/sandy2x/libsodium_la-fe_frombytes_sandy2x.lo `test -f 'crypto_scalarmult/curve25519/sandy2x/fe_frombytes_sandy2x.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/sandy2x/fe_frombytes_sandy2x.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/libsodium_la-fe_frombytes_sandy2x.Tpo crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/libsodium_la-fe_frombytes_sandy2x.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_scalarmult/curve25519/sandy2x/fe_frombytes_sandy2x.c' object='crypto_scalarmult/curve25519/sandy2x/libsodium_la-fe_frombytes_sandy2x.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_scalarmult/curve25519/sandy2x/libsodium_la-fe_frombytes_sandy2x.lo `test -f 'crypto_scalarmult/curve25519/sandy2x/fe_frombytes_sandy2x.c' || echo '$(srcdir)/'`crypto_scalarmult/curve25519/sandy2x/fe_frombytes_sandy2x.c\n\ncrypto_stream/salsa20/ref/libsodium_la-stream_salsa20_ref.lo: crypto_stream/salsa20/ref/stream_salsa20_ref.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/salsa20/ref/libsodium_la-stream_salsa20_ref.lo -MD -MP -MF crypto_stream/salsa20/ref/$(DEPDIR)/libsodium_la-stream_salsa20_ref.Tpo -c -o crypto_stream/salsa20/ref/libsodium_la-stream_salsa20_ref.lo `test -f 'crypto_stream/salsa20/ref/stream_salsa20_ref.c' || echo '$(srcdir)/'`crypto_stream/salsa20/ref/stream_salsa20_ref.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/salsa20/ref/$(DEPDIR)/libsodium_la-stream_salsa20_ref.Tpo crypto_stream/salsa20/ref/$(DEPDIR)/libsodium_la-stream_salsa20_ref.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/salsa20/ref/stream_salsa20_ref.c' object='crypto_stream/salsa20/ref/libsodium_la-stream_salsa20_ref.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/salsa20/ref/libsodium_la-stream_salsa20_ref.lo `test -f 'crypto_stream/salsa20/ref/stream_salsa20_ref.c' || echo '$(srcdir)/'`crypto_stream/salsa20/ref/stream_salsa20_ref.c\n\ncrypto_stream/salsa20/ref/libsodium_la-xor_salsa20_ref.lo: crypto_stream/salsa20/ref/xor_salsa20_ref.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/salsa20/ref/libsodium_la-xor_salsa20_ref.lo -MD -MP -MF crypto_stream/salsa20/ref/$(DEPDIR)/libsodium_la-xor_salsa20_ref.Tpo -c -o crypto_stream/salsa20/ref/libsodium_la-xor_salsa20_ref.lo `test -f 'crypto_stream/salsa20/ref/xor_salsa20_ref.c' || echo '$(srcdir)/'`crypto_stream/salsa20/ref/xor_salsa20_ref.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/salsa20/ref/$(DEPDIR)/libsodium_la-xor_salsa20_ref.Tpo crypto_stream/salsa20/ref/$(DEPDIR)/libsodium_la-xor_salsa20_ref.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/salsa20/ref/xor_salsa20_ref.c' object='crypto_stream/salsa20/ref/libsodium_la-xor_salsa20_ref.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/salsa20/ref/libsodium_la-xor_salsa20_ref.lo `test -f 'crypto_stream/salsa20/ref/xor_salsa20_ref.c' || echo '$(srcdir)/'`crypto_stream/salsa20/ref/xor_salsa20_ref.c\n\ncrypto_core/salsa2012/ref/libsodium_la-core_salsa2012.lo: crypto_core/salsa2012/ref/core_salsa2012.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_core/salsa2012/ref/libsodium_la-core_salsa2012.lo -MD -MP -MF crypto_core/salsa2012/ref/$(DEPDIR)/libsodium_la-core_salsa2012.Tpo -c -o crypto_core/salsa2012/ref/libsodium_la-core_salsa2012.lo `test -f 'crypto_core/salsa2012/ref/core_salsa2012.c' || echo '$(srcdir)/'`crypto_core/salsa2012/ref/core_salsa2012.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_core/salsa2012/ref/$(DEPDIR)/libsodium_la-core_salsa2012.Tpo crypto_core/salsa2012/ref/$(DEPDIR)/libsodium_la-core_salsa2012.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_core/salsa2012/ref/core_salsa2012.c' object='crypto_core/salsa2012/ref/libsodium_la-core_salsa2012.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_core/salsa2012/ref/libsodium_la-core_salsa2012.lo `test -f 'crypto_core/salsa2012/ref/core_salsa2012.c' || echo '$(srcdir)/'`crypto_core/salsa2012/ref/core_salsa2012.c\n\ncrypto_core/salsa2012/libsodium_la-core_salsa2012_api.lo: crypto_core/salsa2012/core_salsa2012_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_core/salsa2012/libsodium_la-core_salsa2012_api.lo -MD -MP -MF crypto_core/salsa2012/$(DEPDIR)/libsodium_la-core_salsa2012_api.Tpo -c -o crypto_core/salsa2012/libsodium_la-core_salsa2012_api.lo `test -f 'crypto_core/salsa2012/core_salsa2012_api.c' || echo '$(srcdir)/'`crypto_core/salsa2012/core_salsa2012_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_core/salsa2012/$(DEPDIR)/libsodium_la-core_salsa2012_api.Tpo crypto_core/salsa2012/$(DEPDIR)/libsodium_la-core_salsa2012_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_core/salsa2012/core_salsa2012_api.c' object='crypto_core/salsa2012/libsodium_la-core_salsa2012_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_core/salsa2012/libsodium_la-core_salsa2012_api.lo `test -f 'crypto_core/salsa2012/core_salsa2012_api.c' || echo '$(srcdir)/'`crypto_core/salsa2012/core_salsa2012_api.c\n\ncrypto_core/salsa208/ref/libsodium_la-core_salsa208.lo: crypto_core/salsa208/ref/core_salsa208.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_core/salsa208/ref/libsodium_la-core_salsa208.lo -MD -MP -MF crypto_core/salsa208/ref/$(DEPDIR)/libsodium_la-core_salsa208.Tpo -c -o crypto_core/salsa208/ref/libsodium_la-core_salsa208.lo `test -f 'crypto_core/salsa208/ref/core_salsa208.c' || echo '$(srcdir)/'`crypto_core/salsa208/ref/core_salsa208.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_core/salsa208/ref/$(DEPDIR)/libsodium_la-core_salsa208.Tpo crypto_core/salsa208/ref/$(DEPDIR)/libsodium_la-core_salsa208.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_core/salsa208/ref/core_salsa208.c' object='crypto_core/salsa208/ref/libsodium_la-core_salsa208.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_core/salsa208/ref/libsodium_la-core_salsa208.lo `test -f 'crypto_core/salsa208/ref/core_salsa208.c' || echo '$(srcdir)/'`crypto_core/salsa208/ref/core_salsa208.c\n\ncrypto_core/salsa208/libsodium_la-core_salsa208_api.lo: crypto_core/salsa208/core_salsa208_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_core/salsa208/libsodium_la-core_salsa208_api.lo -MD -MP -MF crypto_core/salsa208/$(DEPDIR)/libsodium_la-core_salsa208_api.Tpo -c -o crypto_core/salsa208/libsodium_la-core_salsa208_api.lo `test -f 'crypto_core/salsa208/core_salsa208_api.c' || echo '$(srcdir)/'`crypto_core/salsa208/core_salsa208_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_core/salsa208/$(DEPDIR)/libsodium_la-core_salsa208_api.Tpo crypto_core/salsa208/$(DEPDIR)/libsodium_la-core_salsa208_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_core/salsa208/core_salsa208_api.c' object='crypto_core/salsa208/libsodium_la-core_salsa208_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_core/salsa208/libsodium_la-core_salsa208_api.lo `test -f 'crypto_core/salsa208/core_salsa208_api.c' || echo '$(srcdir)/'`crypto_core/salsa208/core_salsa208_api.c\n\ncrypto_sign/ed25519/ref10/libsodium_la-obsolete.lo: crypto_sign/ed25519/ref10/obsolete.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_sign/ed25519/ref10/libsodium_la-obsolete.lo -MD -MP -MF crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-obsolete.Tpo -c -o crypto_sign/ed25519/ref10/libsodium_la-obsolete.lo `test -f 'crypto_sign/ed25519/ref10/obsolete.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/obsolete.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-obsolete.Tpo crypto_sign/ed25519/ref10/$(DEPDIR)/libsodium_la-obsolete.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_sign/ed25519/ref10/obsolete.c' object='crypto_sign/ed25519/ref10/libsodium_la-obsolete.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_sign/ed25519/ref10/libsodium_la-obsolete.lo `test -f 'crypto_sign/ed25519/ref10/obsolete.c' || echo '$(srcdir)/'`crypto_sign/ed25519/ref10/obsolete.c\n\ncrypto_stream/aes128ctr/portable/libsodium_la-afternm_aes128ctr.lo: crypto_stream/aes128ctr/portable/afternm_aes128ctr.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/aes128ctr/portable/libsodium_la-afternm_aes128ctr.lo -MD -MP -MF crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-afternm_aes128ctr.Tpo -c -o crypto_stream/aes128ctr/portable/libsodium_la-afternm_aes128ctr.lo `test -f 'crypto_stream/aes128ctr/portable/afternm_aes128ctr.c' || echo '$(srcdir)/'`crypto_stream/aes128ctr/portable/afternm_aes128ctr.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-afternm_aes128ctr.Tpo crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-afternm_aes128ctr.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/aes128ctr/portable/afternm_aes128ctr.c' object='crypto_stream/aes128ctr/portable/libsodium_la-afternm_aes128ctr.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/aes128ctr/portable/libsodium_la-afternm_aes128ctr.lo `test -f 'crypto_stream/aes128ctr/portable/afternm_aes128ctr.c' || echo '$(srcdir)/'`crypto_stream/aes128ctr/portable/afternm_aes128ctr.c\n\ncrypto_stream/aes128ctr/libsodium_la-stream_aes128ctr_api.lo: crypto_stream/aes128ctr/stream_aes128ctr_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/aes128ctr/libsodium_la-stream_aes128ctr_api.lo -MD -MP -MF crypto_stream/aes128ctr/$(DEPDIR)/libsodium_la-stream_aes128ctr_api.Tpo -c -o crypto_stream/aes128ctr/libsodium_la-stream_aes128ctr_api.lo `test -f 'crypto_stream/aes128ctr/stream_aes128ctr_api.c' || echo '$(srcdir)/'`crypto_stream/aes128ctr/stream_aes128ctr_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/aes128ctr/$(DEPDIR)/libsodium_la-stream_aes128ctr_api.Tpo crypto_stream/aes128ctr/$(DEPDIR)/libsodium_la-stream_aes128ctr_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/aes128ctr/stream_aes128ctr_api.c' object='crypto_stream/aes128ctr/libsodium_la-stream_aes128ctr_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/aes128ctr/libsodium_la-stream_aes128ctr_api.lo `test -f 'crypto_stream/aes128ctr/stream_aes128ctr_api.c' || echo '$(srcdir)/'`crypto_stream/aes128ctr/stream_aes128ctr_api.c\n\ncrypto_stream/aes128ctr/portable/libsodium_la-beforenm_aes128ctr.lo: crypto_stream/aes128ctr/portable/beforenm_aes128ctr.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/aes128ctr/portable/libsodium_la-beforenm_aes128ctr.lo -MD -MP -MF crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-beforenm_aes128ctr.Tpo -c -o crypto_stream/aes128ctr/portable/libsodium_la-beforenm_aes128ctr.lo `test -f 'crypto_stream/aes128ctr/portable/beforenm_aes128ctr.c' || echo '$(srcdir)/'`crypto_stream/aes128ctr/portable/beforenm_aes128ctr.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-beforenm_aes128ctr.Tpo crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-beforenm_aes128ctr.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/aes128ctr/portable/beforenm_aes128ctr.c' object='crypto_stream/aes128ctr/portable/libsodium_la-beforenm_aes128ctr.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/aes128ctr/portable/libsodium_la-beforenm_aes128ctr.lo `test -f 'crypto_stream/aes128ctr/portable/beforenm_aes128ctr.c' || echo '$(srcdir)/'`crypto_stream/aes128ctr/portable/beforenm_aes128ctr.c\n\ncrypto_stream/aes128ctr/portable/libsodium_la-common_aes128ctr.lo: crypto_stream/aes128ctr/portable/common_aes128ctr.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/aes128ctr/portable/libsodium_la-common_aes128ctr.lo -MD -MP -MF crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-common_aes128ctr.Tpo -c -o crypto_stream/aes128ctr/portable/libsodium_la-common_aes128ctr.lo `test -f 'crypto_stream/aes128ctr/portable/common_aes128ctr.c' || echo '$(srcdir)/'`crypto_stream/aes128ctr/portable/common_aes128ctr.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-common_aes128ctr.Tpo crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-common_aes128ctr.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/aes128ctr/portable/common_aes128ctr.c' object='crypto_stream/aes128ctr/portable/libsodium_la-common_aes128ctr.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/aes128ctr/portable/libsodium_la-common_aes128ctr.lo `test -f 'crypto_stream/aes128ctr/portable/common_aes128ctr.c' || echo '$(srcdir)/'`crypto_stream/aes128ctr/portable/common_aes128ctr.c\n\ncrypto_stream/aes128ctr/portable/libsodium_la-consts_aes128ctr.lo: crypto_stream/aes128ctr/portable/consts_aes128ctr.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/aes128ctr/portable/libsodium_la-consts_aes128ctr.lo -MD -MP -MF crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-consts_aes128ctr.Tpo -c -o crypto_stream/aes128ctr/portable/libsodium_la-consts_aes128ctr.lo `test -f 'crypto_stream/aes128ctr/portable/consts_aes128ctr.c' || echo '$(srcdir)/'`crypto_stream/aes128ctr/portable/consts_aes128ctr.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-consts_aes128ctr.Tpo crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-consts_aes128ctr.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/aes128ctr/portable/consts_aes128ctr.c' object='crypto_stream/aes128ctr/portable/libsodium_la-consts_aes128ctr.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/aes128ctr/portable/libsodium_la-consts_aes128ctr.lo `test -f 'crypto_stream/aes128ctr/portable/consts_aes128ctr.c' || echo '$(srcdir)/'`crypto_stream/aes128ctr/portable/consts_aes128ctr.c\n\ncrypto_stream/aes128ctr/portable/libsodium_la-int128_aes128ctr.lo: crypto_stream/aes128ctr/portable/int128_aes128ctr.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/aes128ctr/portable/libsodium_la-int128_aes128ctr.lo -MD -MP -MF crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-int128_aes128ctr.Tpo -c -o crypto_stream/aes128ctr/portable/libsodium_la-int128_aes128ctr.lo `test -f 'crypto_stream/aes128ctr/portable/int128_aes128ctr.c' || echo '$(srcdir)/'`crypto_stream/aes128ctr/portable/int128_aes128ctr.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-int128_aes128ctr.Tpo crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-int128_aes128ctr.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/aes128ctr/portable/int128_aes128ctr.c' object='crypto_stream/aes128ctr/portable/libsodium_la-int128_aes128ctr.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/aes128ctr/portable/libsodium_la-int128_aes128ctr.lo `test -f 'crypto_stream/aes128ctr/portable/int128_aes128ctr.c' || echo '$(srcdir)/'`crypto_stream/aes128ctr/portable/int128_aes128ctr.c\n\ncrypto_stream/aes128ctr/portable/libsodium_la-stream_aes128ctr.lo: crypto_stream/aes128ctr/portable/stream_aes128ctr.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/aes128ctr/portable/libsodium_la-stream_aes128ctr.lo -MD -MP -MF crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-stream_aes128ctr.Tpo -c -o crypto_stream/aes128ctr/portable/libsodium_la-stream_aes128ctr.lo `test -f 'crypto_stream/aes128ctr/portable/stream_aes128ctr.c' || echo '$(srcdir)/'`crypto_stream/aes128ctr/portable/stream_aes128ctr.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-stream_aes128ctr.Tpo crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-stream_aes128ctr.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/aes128ctr/portable/stream_aes128ctr.c' object='crypto_stream/aes128ctr/portable/libsodium_la-stream_aes128ctr.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/aes128ctr/portable/libsodium_la-stream_aes128ctr.lo `test -f 'crypto_stream/aes128ctr/portable/stream_aes128ctr.c' || echo '$(srcdir)/'`crypto_stream/aes128ctr/portable/stream_aes128ctr.c\n\ncrypto_stream/aes128ctr/portable/libsodium_la-xor_afternm_aes128ctr.lo: crypto_stream/aes128ctr/portable/xor_afternm_aes128ctr.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/aes128ctr/portable/libsodium_la-xor_afternm_aes128ctr.lo -MD -MP -MF crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-xor_afternm_aes128ctr.Tpo -c -o crypto_stream/aes128ctr/portable/libsodium_la-xor_afternm_aes128ctr.lo `test -f 'crypto_stream/aes128ctr/portable/xor_afternm_aes128ctr.c' || echo '$(srcdir)/'`crypto_stream/aes128ctr/portable/xor_afternm_aes128ctr.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-xor_afternm_aes128ctr.Tpo crypto_stream/aes128ctr/portable/$(DEPDIR)/libsodium_la-xor_afternm_aes128ctr.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/aes128ctr/portable/xor_afternm_aes128ctr.c' object='crypto_stream/aes128ctr/portable/libsodium_la-xor_afternm_aes128ctr.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/aes128ctr/portable/libsodium_la-xor_afternm_aes128ctr.lo `test -f 'crypto_stream/aes128ctr/portable/xor_afternm_aes128ctr.c' || echo '$(srcdir)/'`crypto_stream/aes128ctr/portable/xor_afternm_aes128ctr.c\n\ncrypto_stream/salsa2012/libsodium_la-stream_salsa2012_api.lo: crypto_stream/salsa2012/stream_salsa2012_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/salsa2012/libsodium_la-stream_salsa2012_api.lo -MD -MP -MF crypto_stream/salsa2012/$(DEPDIR)/libsodium_la-stream_salsa2012_api.Tpo -c -o crypto_stream/salsa2012/libsodium_la-stream_salsa2012_api.lo `test -f 'crypto_stream/salsa2012/stream_salsa2012_api.c' || echo '$(srcdir)/'`crypto_stream/salsa2012/stream_salsa2012_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/salsa2012/$(DEPDIR)/libsodium_la-stream_salsa2012_api.Tpo crypto_stream/salsa2012/$(DEPDIR)/libsodium_la-stream_salsa2012_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/salsa2012/stream_salsa2012_api.c' object='crypto_stream/salsa2012/libsodium_la-stream_salsa2012_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/salsa2012/libsodium_la-stream_salsa2012_api.lo `test -f 'crypto_stream/salsa2012/stream_salsa2012_api.c' || echo '$(srcdir)/'`crypto_stream/salsa2012/stream_salsa2012_api.c\n\ncrypto_stream/salsa2012/ref/libsodium_la-stream_salsa2012.lo: crypto_stream/salsa2012/ref/stream_salsa2012.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/salsa2012/ref/libsodium_la-stream_salsa2012.lo -MD -MP -MF crypto_stream/salsa2012/ref/$(DEPDIR)/libsodium_la-stream_salsa2012.Tpo -c -o crypto_stream/salsa2012/ref/libsodium_la-stream_salsa2012.lo `test -f 'crypto_stream/salsa2012/ref/stream_salsa2012.c' || echo '$(srcdir)/'`crypto_stream/salsa2012/ref/stream_salsa2012.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/salsa2012/ref/$(DEPDIR)/libsodium_la-stream_salsa2012.Tpo crypto_stream/salsa2012/ref/$(DEPDIR)/libsodium_la-stream_salsa2012.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/salsa2012/ref/stream_salsa2012.c' object='crypto_stream/salsa2012/ref/libsodium_la-stream_salsa2012.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/salsa2012/ref/libsodium_la-stream_salsa2012.lo `test -f 'crypto_stream/salsa2012/ref/stream_salsa2012.c' || echo '$(srcdir)/'`crypto_stream/salsa2012/ref/stream_salsa2012.c\n\ncrypto_stream/salsa2012/ref/libsodium_la-xor_salsa2012.lo: crypto_stream/salsa2012/ref/xor_salsa2012.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/salsa2012/ref/libsodium_la-xor_salsa2012.lo -MD -MP -MF crypto_stream/salsa2012/ref/$(DEPDIR)/libsodium_la-xor_salsa2012.Tpo -c -o crypto_stream/salsa2012/ref/libsodium_la-xor_salsa2012.lo `test -f 'crypto_stream/salsa2012/ref/xor_salsa2012.c' || echo '$(srcdir)/'`crypto_stream/salsa2012/ref/xor_salsa2012.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/salsa2012/ref/$(DEPDIR)/libsodium_la-xor_salsa2012.Tpo crypto_stream/salsa2012/ref/$(DEPDIR)/libsodium_la-xor_salsa2012.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/salsa2012/ref/xor_salsa2012.c' object='crypto_stream/salsa2012/ref/libsodium_la-xor_salsa2012.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/salsa2012/ref/libsodium_la-xor_salsa2012.lo `test -f 'crypto_stream/salsa2012/ref/xor_salsa2012.c' || echo '$(srcdir)/'`crypto_stream/salsa2012/ref/xor_salsa2012.c\n\ncrypto_stream/salsa208/libsodium_la-stream_salsa208_api.lo: crypto_stream/salsa208/stream_salsa208_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/salsa208/libsodium_la-stream_salsa208_api.lo -MD -MP -MF crypto_stream/salsa208/$(DEPDIR)/libsodium_la-stream_salsa208_api.Tpo -c -o crypto_stream/salsa208/libsodium_la-stream_salsa208_api.lo `test -f 'crypto_stream/salsa208/stream_salsa208_api.c' || echo '$(srcdir)/'`crypto_stream/salsa208/stream_salsa208_api.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/salsa208/$(DEPDIR)/libsodium_la-stream_salsa208_api.Tpo crypto_stream/salsa208/$(DEPDIR)/libsodium_la-stream_salsa208_api.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/salsa208/stream_salsa208_api.c' object='crypto_stream/salsa208/libsodium_la-stream_salsa208_api.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/salsa208/libsodium_la-stream_salsa208_api.lo `test -f 'crypto_stream/salsa208/stream_salsa208_api.c' || echo '$(srcdir)/'`crypto_stream/salsa208/stream_salsa208_api.c\n\ncrypto_stream/salsa208/ref/libsodium_la-stream_salsa208.lo: crypto_stream/salsa208/ref/stream_salsa208.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/salsa208/ref/libsodium_la-stream_salsa208.lo -MD -MP -MF crypto_stream/salsa208/ref/$(DEPDIR)/libsodium_la-stream_salsa208.Tpo -c -o crypto_stream/salsa208/ref/libsodium_la-stream_salsa208.lo `test -f 'crypto_stream/salsa208/ref/stream_salsa208.c' || echo '$(srcdir)/'`crypto_stream/salsa208/ref/stream_salsa208.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/salsa208/ref/$(DEPDIR)/libsodium_la-stream_salsa208.Tpo crypto_stream/salsa208/ref/$(DEPDIR)/libsodium_la-stream_salsa208.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/salsa208/ref/stream_salsa208.c' object='crypto_stream/salsa208/ref/libsodium_la-stream_salsa208.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/salsa208/ref/libsodium_la-stream_salsa208.lo `test -f 'crypto_stream/salsa208/ref/stream_salsa208.c' || echo '$(srcdir)/'`crypto_stream/salsa208/ref/stream_salsa208.c\n\ncrypto_stream/salsa208/ref/libsodium_la-xor_salsa208.lo: crypto_stream/salsa208/ref/xor_salsa208.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/salsa208/ref/libsodium_la-xor_salsa208.lo -MD -MP -MF crypto_stream/salsa208/ref/$(DEPDIR)/libsodium_la-xor_salsa208.Tpo -c -o crypto_stream/salsa208/ref/libsodium_la-xor_salsa208.lo `test -f 'crypto_stream/salsa208/ref/xor_salsa208.c' || echo '$(srcdir)/'`crypto_stream/salsa208/ref/xor_salsa208.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/salsa208/ref/$(DEPDIR)/libsodium_la-xor_salsa208.Tpo crypto_stream/salsa208/ref/$(DEPDIR)/libsodium_la-xor_salsa208.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/salsa208/ref/xor_salsa208.c' object='crypto_stream/salsa208/ref/libsodium_la-xor_salsa208.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsodium_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/salsa208/ref/libsodium_la-xor_salsa208.lo `test -f 'crypto_stream/salsa208/ref/xor_salsa208.c' || echo '$(srcdir)/'`crypto_stream/salsa208/ref/xor_salsa208.c\n\ncrypto_pwhash/scryptsalsa208sha256/sse/libsse2_la-pwhash_scryptsalsa208sha256_sse.lo: crypto_pwhash/scryptsalsa208sha256/sse/pwhash_scryptsalsa208sha256_sse.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsse2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_pwhash/scryptsalsa208sha256/sse/libsse2_la-pwhash_scryptsalsa208sha256_sse.lo -MD -MP -MF crypto_pwhash/scryptsalsa208sha256/sse/$(DEPDIR)/libsse2_la-pwhash_scryptsalsa208sha256_sse.Tpo -c -o crypto_pwhash/scryptsalsa208sha256/sse/libsse2_la-pwhash_scryptsalsa208sha256_sse.lo `test -f 'crypto_pwhash/scryptsalsa208sha256/sse/pwhash_scryptsalsa208sha256_sse.c' || echo '$(srcdir)/'`crypto_pwhash/scryptsalsa208sha256/sse/pwhash_scryptsalsa208sha256_sse.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_pwhash/scryptsalsa208sha256/sse/$(DEPDIR)/libsse2_la-pwhash_scryptsalsa208sha256_sse.Tpo crypto_pwhash/scryptsalsa208sha256/sse/$(DEPDIR)/libsse2_la-pwhash_scryptsalsa208sha256_sse.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_pwhash/scryptsalsa208sha256/sse/pwhash_scryptsalsa208sha256_sse.c' object='crypto_pwhash/scryptsalsa208sha256/sse/libsse2_la-pwhash_scryptsalsa208sha256_sse.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsse2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_pwhash/scryptsalsa208sha256/sse/libsse2_la-pwhash_scryptsalsa208sha256_sse.lo `test -f 'crypto_pwhash/scryptsalsa208sha256/sse/pwhash_scryptsalsa208sha256_sse.c' || echo '$(srcdir)/'`crypto_pwhash/scryptsalsa208sha256/sse/pwhash_scryptsalsa208sha256_sse.c\n\ncrypto_onetimeauth/poly1305/sse2/libsse2_la-poly1305_sse2.lo: crypto_onetimeauth/poly1305/sse2/poly1305_sse2.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsse2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_onetimeauth/poly1305/sse2/libsse2_la-poly1305_sse2.lo -MD -MP -MF crypto_onetimeauth/poly1305/sse2/$(DEPDIR)/libsse2_la-poly1305_sse2.Tpo -c -o crypto_onetimeauth/poly1305/sse2/libsse2_la-poly1305_sse2.lo `test -f 'crypto_onetimeauth/poly1305/sse2/poly1305_sse2.c' || echo '$(srcdir)/'`crypto_onetimeauth/poly1305/sse2/poly1305_sse2.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_onetimeauth/poly1305/sse2/$(DEPDIR)/libsse2_la-poly1305_sse2.Tpo crypto_onetimeauth/poly1305/sse2/$(DEPDIR)/libsse2_la-poly1305_sse2.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_onetimeauth/poly1305/sse2/poly1305_sse2.c' object='crypto_onetimeauth/poly1305/sse2/libsse2_la-poly1305_sse2.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsse2_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_onetimeauth/poly1305/sse2/libsse2_la-poly1305_sse2.lo `test -f 'crypto_onetimeauth/poly1305/sse2/poly1305_sse2.c' || echo '$(srcdir)/'`crypto_onetimeauth/poly1305/sse2/poly1305_sse2.c\n\ncrypto_generichash/blake2/ref/libsse41_la-blake2b-compress-sse41.lo: crypto_generichash/blake2/ref/blake2b-compress-sse41.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsse41_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_generichash/blake2/ref/libsse41_la-blake2b-compress-sse41.lo -MD -MP -MF crypto_generichash/blake2/ref/$(DEPDIR)/libsse41_la-blake2b-compress-sse41.Tpo -c -o crypto_generichash/blake2/ref/libsse41_la-blake2b-compress-sse41.lo `test -f 'crypto_generichash/blake2/ref/blake2b-compress-sse41.c' || echo '$(srcdir)/'`crypto_generichash/blake2/ref/blake2b-compress-sse41.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_generichash/blake2/ref/$(DEPDIR)/libsse41_la-blake2b-compress-sse41.Tpo crypto_generichash/blake2/ref/$(DEPDIR)/libsse41_la-blake2b-compress-sse41.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_generichash/blake2/ref/blake2b-compress-sse41.c' object='crypto_generichash/blake2/ref/libsse41_la-blake2b-compress-sse41.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libsse41_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_generichash/blake2/ref/libsse41_la-blake2b-compress-sse41.lo `test -f 'crypto_generichash/blake2/ref/blake2b-compress-sse41.c' || echo '$(srcdir)/'`crypto_generichash/blake2/ref/blake2b-compress-sse41.c\n\ncrypto_generichash/blake2/ref/libssse3_la-blake2b-compress-ssse3.lo: crypto_generichash/blake2/ref/blake2b-compress-ssse3.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libssse3_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_generichash/blake2/ref/libssse3_la-blake2b-compress-ssse3.lo -MD -MP -MF crypto_generichash/blake2/ref/$(DEPDIR)/libssse3_la-blake2b-compress-ssse3.Tpo -c -o crypto_generichash/blake2/ref/libssse3_la-blake2b-compress-ssse3.lo `test -f 'crypto_generichash/blake2/ref/blake2b-compress-ssse3.c' || echo '$(srcdir)/'`crypto_generichash/blake2/ref/blake2b-compress-ssse3.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_generichash/blake2/ref/$(DEPDIR)/libssse3_la-blake2b-compress-ssse3.Tpo crypto_generichash/blake2/ref/$(DEPDIR)/libssse3_la-blake2b-compress-ssse3.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_generichash/blake2/ref/blake2b-compress-ssse3.c' object='crypto_generichash/blake2/ref/libssse3_la-blake2b-compress-ssse3.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libssse3_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_generichash/blake2/ref/libssse3_la-blake2b-compress-ssse3.lo `test -f 'crypto_generichash/blake2/ref/blake2b-compress-ssse3.c' || echo '$(srcdir)/'`crypto_generichash/blake2/ref/blake2b-compress-ssse3.c\n\ncrypto_stream/chacha20/vec/libssse3_la-stream_chacha20_vec.lo: crypto_stream/chacha20/vec/stream_chacha20_vec.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libssse3_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT crypto_stream/chacha20/vec/libssse3_la-stream_chacha20_vec.lo -MD -MP -MF crypto_stream/chacha20/vec/$(DEPDIR)/libssse3_la-stream_chacha20_vec.Tpo -c -o crypto_stream/chacha20/vec/libssse3_la-stream_chacha20_vec.lo `test -f 'crypto_stream/chacha20/vec/stream_chacha20_vec.c' || echo '$(srcdir)/'`crypto_stream/chacha20/vec/stream_chacha20_vec.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) crypto_stream/chacha20/vec/$(DEPDIR)/libssse3_la-stream_chacha20_vec.Tpo crypto_stream/chacha20/vec/$(DEPDIR)/libssse3_la-stream_chacha20_vec.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='crypto_stream/chacha20/vec/stream_chacha20_vec.c' object='crypto_stream/chacha20/vec/libssse3_la-stream_chacha20_vec.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(libssse3_la_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o crypto_stream/chacha20/vec/libssse3_la-stream_chacha20_vec.lo `test -f 'crypto_stream/chacha20/vec/stream_chacha20_vec.c' || echo '$(srcdir)/'`crypto_stream/chacha20/vec/stream_chacha20_vec.c\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\n\t-rm -rf crypto_aead/aes256gcm/aesni/.libs crypto_aead/aes256gcm/aesni/_libs\n\t-rm -rf crypto_aead/chacha20poly1305/sodium/.libs crypto_aead/chacha20poly1305/sodium/_libs\n\t-rm -rf crypto_auth/.libs crypto_auth/_libs\n\t-rm -rf crypto_auth/hmacsha256/.libs crypto_auth/hmacsha256/_libs\n\t-rm -rf crypto_auth/hmacsha256/cp/.libs crypto_auth/hmacsha256/cp/_libs\n\t-rm -rf crypto_auth/hmacsha512/.libs crypto_auth/hmacsha512/_libs\n\t-rm -rf crypto_auth/hmacsha512/cp/.libs crypto_auth/hmacsha512/cp/_libs\n\t-rm -rf crypto_auth/hmacsha512256/.libs crypto_auth/hmacsha512256/_libs\n\t-rm -rf crypto_auth/hmacsha512256/cp/.libs crypto_auth/hmacsha512256/cp/_libs\n\t-rm -rf crypto_box/.libs crypto_box/_libs\n\t-rm -rf crypto_box/curve25519xsalsa20poly1305/.libs crypto_box/curve25519xsalsa20poly1305/_libs\n\t-rm -rf crypto_box/curve25519xsalsa20poly1305/ref/.libs crypto_box/curve25519xsalsa20poly1305/ref/_libs\n\t-rm -rf crypto_core/hsalsa20/.libs crypto_core/hsalsa20/_libs\n\t-rm -rf crypto_core/hsalsa20/ref2/.libs crypto_core/hsalsa20/ref2/_libs\n\t-rm -rf crypto_core/salsa20/.libs crypto_core/salsa20/_libs\n\t-rm -rf crypto_core/salsa20/ref/.libs crypto_core/salsa20/ref/_libs\n\t-rm -rf crypto_core/salsa2012/.libs crypto_core/salsa2012/_libs\n\t-rm -rf crypto_core/salsa2012/ref/.libs crypto_core/salsa2012/ref/_libs\n\t-rm -rf crypto_core/salsa208/.libs crypto_core/salsa208/_libs\n\t-rm -rf crypto_core/salsa208/ref/.libs crypto_core/salsa208/ref/_libs\n\t-rm -rf crypto_generichash/.libs crypto_generichash/_libs\n\t-rm -rf crypto_generichash/blake2/.libs crypto_generichash/blake2/_libs\n\t-rm -rf crypto_generichash/blake2/ref/.libs crypto_generichash/blake2/ref/_libs\n\t-rm -rf crypto_hash/.libs crypto_hash/_libs\n\t-rm -rf crypto_hash/sha256/.libs crypto_hash/sha256/_libs\n\t-rm -rf crypto_hash/sha256/cp/.libs crypto_hash/sha256/cp/_libs\n\t-rm -rf crypto_hash/sha512/.libs crypto_hash/sha512/_libs\n\t-rm -rf crypto_hash/sha512/cp/.libs crypto_hash/sha512/cp/_libs\n\t-rm -rf crypto_onetimeauth/.libs crypto_onetimeauth/_libs\n\t-rm -rf crypto_onetimeauth/poly1305/.libs crypto_onetimeauth/poly1305/_libs\n\t-rm -rf crypto_onetimeauth/poly1305/donna/.libs crypto_onetimeauth/poly1305/donna/_libs\n\t-rm -rf crypto_onetimeauth/poly1305/sse2/.libs crypto_onetimeauth/poly1305/sse2/_libs\n\t-rm -rf crypto_pwhash/scryptsalsa208sha256/.libs crypto_pwhash/scryptsalsa208sha256/_libs\n\t-rm -rf crypto_pwhash/scryptsalsa208sha256/nosse/.libs crypto_pwhash/scryptsalsa208sha256/nosse/_libs\n\t-rm -rf crypto_pwhash/scryptsalsa208sha256/sse/.libs crypto_pwhash/scryptsalsa208sha256/sse/_libs\n\t-rm -rf crypto_scalarmult/.libs crypto_scalarmult/_libs\n\t-rm -rf crypto_scalarmult/curve25519/.libs crypto_scalarmult/curve25519/_libs\n\t-rm -rf crypto_scalarmult/curve25519/donna_c64/.libs crypto_scalarmult/curve25519/donna_c64/_libs\n\t-rm -rf crypto_scalarmult/curve25519/ref10/.libs crypto_scalarmult/curve25519/ref10/_libs\n\t-rm -rf crypto_scalarmult/curve25519/sandy2x/.libs crypto_scalarmult/curve25519/sandy2x/_libs\n\t-rm -rf crypto_secretbox/.libs crypto_secretbox/_libs\n\t-rm -rf crypto_secretbox/xsalsa20poly1305/.libs crypto_secretbox/xsalsa20poly1305/_libs\n\t-rm -rf crypto_secretbox/xsalsa20poly1305/ref/.libs crypto_secretbox/xsalsa20poly1305/ref/_libs\n\t-rm -rf crypto_shorthash/.libs crypto_shorthash/_libs\n\t-rm -rf crypto_shorthash/siphash24/.libs crypto_shorthash/siphash24/_libs\n\t-rm -rf crypto_shorthash/siphash24/ref/.libs crypto_shorthash/siphash24/ref/_libs\n\t-rm -rf crypto_sign/.libs crypto_sign/_libs\n\t-rm -rf crypto_sign/ed25519/.libs crypto_sign/ed25519/_libs\n\t-rm -rf crypto_sign/ed25519/ref10/.libs crypto_sign/ed25519/ref10/_libs\n\t-rm -rf crypto_stream/.libs crypto_stream/_libs\n\t-rm -rf crypto_stream/aes128ctr/.libs crypto_stream/aes128ctr/_libs\n\t-rm -rf crypto_stream/aes128ctr/portable/.libs crypto_stream/aes128ctr/portable/_libs\n\t-rm -rf crypto_stream/chacha20/.libs crypto_stream/chacha20/_libs\n\t-rm -rf crypto_stream/chacha20/ref/.libs crypto_stream/chacha20/ref/_libs\n\t-rm -rf crypto_stream/chacha20/vec/.libs crypto_stream/chacha20/vec/_libs\n\t-rm -rf crypto_stream/salsa20/.libs crypto_stream/salsa20/_libs\n\t-rm -rf crypto_stream/salsa20/amd64_xmm6/.libs crypto_stream/salsa20/amd64_xmm6/_libs\n\t-rm -rf crypto_stream/salsa20/ref/.libs crypto_stream/salsa20/ref/_libs\n\t-rm -rf crypto_stream/salsa2012/.libs crypto_stream/salsa2012/_libs\n\t-rm -rf crypto_stream/salsa2012/ref/.libs crypto_stream/salsa2012/ref/_libs\n\t-rm -rf crypto_stream/salsa208/.libs crypto_stream/salsa208/_libs\n\t-rm -rf crypto_stream/salsa208/ref/.libs crypto_stream/salsa208/ref/_libs\n\t-rm -rf crypto_stream/xsalsa20/.libs crypto_stream/xsalsa20/_libs\n\t-rm -rf crypto_stream/xsalsa20/ref/.libs crypto_stream/xsalsa20/ref/_libs\n\t-rm -rf crypto_verify/16/.libs crypto_verify/16/_libs\n\t-rm -rf crypto_verify/16/ref/.libs crypto_verify/16/ref/_libs\n\t-rm -rf crypto_verify/32/.libs crypto_verify/32/_libs\n\t-rm -rf crypto_verify/32/ref/.libs crypto_verify/32/ref/_libs\n\t-rm -rf crypto_verify/64/.libs crypto_verify/64/_libs\n\t-rm -rf crypto_verify/64/ref/.libs crypto_verify/64/ref/_libs\n\t-rm -rf randombytes/.libs randombytes/_libs\n\t-rm -rf randombytes/nativeclient/.libs randombytes/nativeclient/_libs\n\t-rm -rf randombytes/salsa20/.libs randombytes/salsa20/_libs\n\t-rm -rf randombytes/sysrandom/.libs randombytes/sysrandom/_libs\n\t-rm -rf sodium/.libs sodium/_libs\n\n# This directory's subdirectories are mostly independent; you can cd\n# into them and run 'make' without going through this Makefile.\n# To change the values of 'make' variables: instead of editing Makefiles,\n# (1) if the variable is set in 'config.status', edit 'config.status'\n#     (which will cause the Makefiles to be regenerated when you run 'make');\n# (2) otherwise, pass the desired values on the 'make' command line.\n$(am__recursive_targets):\n\t@fail=; \\\n\tif $(am__make_keepgoing); then \\\n\t  failcom='fail=yes'; \\\n\telse \\\n\t  failcom='exit 1'; \\\n\tfi; \\\n\tdot_seen=no; \\\n\ttarget=`echo $@ | sed s/-recursive//`; \\\n\tcase \"$@\" in \\\n\t  distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \\\n\t  *) list='$(SUBDIRS)' ;; \\\n\tesac; \\\n\tfor subdir in $$list; do \\\n\t  echo \"Making $$target in $$subdir\"; \\\n\t  if test \"$$subdir\" = \".\"; then \\\n\t    dot_seen=yes; \\\n\t    local_target=\"$$target-am\"; \\\n\t  else \\\n\t    local_target=\"$$target\"; \\\n\t  fi; \\\n\t  ($(am__cd) $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \\\n\t  || eval $$failcom; \\\n\tdone; \\\n\tif test \"$$dot_seen\" = \"no\"; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) \"$$target-am\" || exit 1; \\\n\tfi; test -z \"$$fail\"\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-recursive\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\tif ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \\\n\t  include_option=--etags-include; \\\n\t  empty_fix=.; \\\n\telse \\\n\t  include_option=--include; \\\n\t  empty_fix=; \\\n\tfi; \\\n\tlist='$(SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    test ! -f $$subdir/TAGS || \\\n\t      set \"$$@\" \"$$include_option=$$here/$$subdir/TAGS\"; \\\n\t  fi; \\\n\tdone; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-recursive\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscopelist: cscopelist-recursive\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\n\t@list='$(DIST_SUBDIRS)'; for subdir in $$list; do \\\n\t  if test \"$$subdir\" = .; then :; else \\\n\t    $(am__make_dryrun) \\\n\t      || test -d \"$(distdir)/$$subdir\" \\\n\t      || $(MKDIR_P) \"$(distdir)/$$subdir\" \\\n\t      || exit 1; \\\n\t    dir1=$$subdir; dir2=\"$(distdir)/$$subdir\"; \\\n\t    $(am__relativize); \\\n\t    new_distdir=$$reldir; \\\n\t    dir1=$$subdir; dir2=\"$(top_distdir)\"; \\\n\t    $(am__relativize); \\\n\t    new_top_distdir=$$reldir; \\\n\t    echo \" (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) top_distdir=\"$$new_top_distdir\" distdir=\"$$new_distdir\" \\\\\"; \\\n\t    echo \"     am__remove_distdir=: am__skip_length_check=: am__skip_mode_fix=: distdir)\"; \\\n\t    ($(am__cd) $$subdir && \\\n\t      $(MAKE) $(AM_MAKEFLAGS) \\\n\t        top_distdir=\"$$new_top_distdir\" \\\n\t        distdir=\"$$new_distdir\" \\\n\t\tam__remove_distdir=: \\\n\t\tam__skip_length_check=: \\\n\t\tam__skip_mode_fix=: \\\n\t        distdir) \\\n\t      || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-recursive\nall-am: Makefile $(LTLIBRARIES) $(HEADERS)\ninstalldirs: installdirs-recursive\ninstalldirs-am:\ninstall: install-recursive\ninstall-exec: install-exec-recursive\ninstall-data: install-data-recursive\nuninstall: uninstall-recursive\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-recursive\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\t-rm -f crypto_aead/aes256gcm/aesni/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_aead/aes256gcm/aesni/$(am__dirstamp)\n\t-rm -f crypto_aead/chacha20poly1305/sodium/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_aead/chacha20poly1305/sodium/$(am__dirstamp)\n\t-rm -f crypto_auth/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_auth/$(am__dirstamp)\n\t-rm -f crypto_auth/hmacsha256/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_auth/hmacsha256/$(am__dirstamp)\n\t-rm -f crypto_auth/hmacsha256/cp/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_auth/hmacsha256/cp/$(am__dirstamp)\n\t-rm -f crypto_auth/hmacsha512/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_auth/hmacsha512/$(am__dirstamp)\n\t-rm -f crypto_auth/hmacsha512/cp/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_auth/hmacsha512/cp/$(am__dirstamp)\n\t-rm -f crypto_auth/hmacsha512256/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_auth/hmacsha512256/$(am__dirstamp)\n\t-rm -f crypto_auth/hmacsha512256/cp/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_auth/hmacsha512256/cp/$(am__dirstamp)\n\t-rm -f crypto_box/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_box/$(am__dirstamp)\n\t-rm -f crypto_box/curve25519xsalsa20poly1305/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_box/curve25519xsalsa20poly1305/$(am__dirstamp)\n\t-rm -f crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_box/curve25519xsalsa20poly1305/ref/$(am__dirstamp)\n\t-rm -f crypto_core/hsalsa20/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_core/hsalsa20/$(am__dirstamp)\n\t-rm -f crypto_core/hsalsa20/ref2/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_core/hsalsa20/ref2/$(am__dirstamp)\n\t-rm -f crypto_core/salsa20/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_core/salsa20/$(am__dirstamp)\n\t-rm -f crypto_core/salsa20/ref/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_core/salsa20/ref/$(am__dirstamp)\n\t-rm -f crypto_core/salsa2012/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_core/salsa2012/$(am__dirstamp)\n\t-rm -f crypto_core/salsa2012/ref/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_core/salsa2012/ref/$(am__dirstamp)\n\t-rm -f crypto_core/salsa208/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_core/salsa208/$(am__dirstamp)\n\t-rm -f crypto_core/salsa208/ref/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_core/salsa208/ref/$(am__dirstamp)\n\t-rm -f crypto_generichash/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_generichash/$(am__dirstamp)\n\t-rm -f crypto_generichash/blake2/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_generichash/blake2/$(am__dirstamp)\n\t-rm -f crypto_generichash/blake2/ref/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_generichash/blake2/ref/$(am__dirstamp)\n\t-rm -f crypto_hash/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_hash/$(am__dirstamp)\n\t-rm -f crypto_hash/sha256/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_hash/sha256/$(am__dirstamp)\n\t-rm -f crypto_hash/sha256/cp/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_hash/sha256/cp/$(am__dirstamp)\n\t-rm -f crypto_hash/sha512/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_hash/sha512/$(am__dirstamp)\n\t-rm -f crypto_hash/sha512/cp/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_hash/sha512/cp/$(am__dirstamp)\n\t-rm -f crypto_onetimeauth/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_onetimeauth/$(am__dirstamp)\n\t-rm -f crypto_onetimeauth/poly1305/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_onetimeauth/poly1305/$(am__dirstamp)\n\t-rm -f crypto_onetimeauth/poly1305/donna/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_onetimeauth/poly1305/donna/$(am__dirstamp)\n\t-rm -f crypto_onetimeauth/poly1305/sse2/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_onetimeauth/poly1305/sse2/$(am__dirstamp)\n\t-rm -f crypto_pwhash/scryptsalsa208sha256/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_pwhash/scryptsalsa208sha256/$(am__dirstamp)\n\t-rm -f crypto_pwhash/scryptsalsa208sha256/nosse/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_pwhash/scryptsalsa208sha256/nosse/$(am__dirstamp)\n\t-rm -f crypto_pwhash/scryptsalsa208sha256/sse/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_pwhash/scryptsalsa208sha256/sse/$(am__dirstamp)\n\t-rm -f crypto_scalarmult/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_scalarmult/$(am__dirstamp)\n\t-rm -f crypto_scalarmult/curve25519/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_scalarmult/curve25519/$(am__dirstamp)\n\t-rm -f crypto_scalarmult/curve25519/donna_c64/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_scalarmult/curve25519/donna_c64/$(am__dirstamp)\n\t-rm -f crypto_scalarmult/curve25519/ref10/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_scalarmult/curve25519/ref10/$(am__dirstamp)\n\t-rm -f crypto_scalarmult/curve25519/sandy2x/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_scalarmult/curve25519/sandy2x/$(am__dirstamp)\n\t-rm -f crypto_secretbox/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_secretbox/$(am__dirstamp)\n\t-rm -f crypto_secretbox/xsalsa20poly1305/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_secretbox/xsalsa20poly1305/$(am__dirstamp)\n\t-rm -f crypto_secretbox/xsalsa20poly1305/ref/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_secretbox/xsalsa20poly1305/ref/$(am__dirstamp)\n\t-rm -f crypto_shorthash/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_shorthash/$(am__dirstamp)\n\t-rm -f crypto_shorthash/siphash24/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_shorthash/siphash24/$(am__dirstamp)\n\t-rm -f crypto_shorthash/siphash24/ref/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_shorthash/siphash24/ref/$(am__dirstamp)\n\t-rm -f crypto_sign/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_sign/$(am__dirstamp)\n\t-rm -f crypto_sign/ed25519/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_sign/ed25519/$(am__dirstamp)\n\t-rm -f crypto_sign/ed25519/ref10/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_sign/ed25519/ref10/$(am__dirstamp)\n\t-rm -f crypto_stream/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_stream/$(am__dirstamp)\n\t-rm -f crypto_stream/aes128ctr/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_stream/aes128ctr/$(am__dirstamp)\n\t-rm -f crypto_stream/aes128ctr/portable/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_stream/aes128ctr/portable/$(am__dirstamp)\n\t-rm -f crypto_stream/chacha20/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_stream/chacha20/$(am__dirstamp)\n\t-rm -f crypto_stream/chacha20/ref/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_stream/chacha20/ref/$(am__dirstamp)\n\t-rm -f crypto_stream/chacha20/vec/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_stream/chacha20/vec/$(am__dirstamp)\n\t-rm -f crypto_stream/salsa20/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_stream/salsa20/$(am__dirstamp)\n\t-rm -f crypto_stream/salsa20/amd64_xmm6/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_stream/salsa20/amd64_xmm6/$(am__dirstamp)\n\t-rm -f crypto_stream/salsa20/ref/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_stream/salsa20/ref/$(am__dirstamp)\n\t-rm -f crypto_stream/salsa2012/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_stream/salsa2012/$(am__dirstamp)\n\t-rm -f crypto_stream/salsa2012/ref/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_stream/salsa2012/ref/$(am__dirstamp)\n\t-rm -f crypto_stream/salsa208/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_stream/salsa208/$(am__dirstamp)\n\t-rm -f crypto_stream/salsa208/ref/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_stream/salsa208/ref/$(am__dirstamp)\n\t-rm -f crypto_stream/xsalsa20/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_stream/xsalsa20/$(am__dirstamp)\n\t-rm -f crypto_stream/xsalsa20/ref/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_stream/xsalsa20/ref/$(am__dirstamp)\n\t-rm -f crypto_verify/16/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_verify/16/$(am__dirstamp)\n\t-rm -f crypto_verify/16/ref/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_verify/16/ref/$(am__dirstamp)\n\t-rm -f crypto_verify/32/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_verify/32/$(am__dirstamp)\n\t-rm -f crypto_verify/32/ref/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_verify/32/ref/$(am__dirstamp)\n\t-rm -f crypto_verify/64/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_verify/64/$(am__dirstamp)\n\t-rm -f crypto_verify/64/ref/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f crypto_verify/64/ref/$(am__dirstamp)\n\t-rm -f randombytes/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f randombytes/$(am__dirstamp)\n\t-rm -f randombytes/nativeclient/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f randombytes/nativeclient/$(am__dirstamp)\n\t-rm -f randombytes/salsa20/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f randombytes/salsa20/$(am__dirstamp)\n\t-rm -f randombytes/sysrandom/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f randombytes/sysrandom/$(am__dirstamp)\n\t-rm -f sodium/$(DEPDIR)/$(am__dirstamp)\n\t-rm -f sodium/$(am__dirstamp)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-recursive\n\nclean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \\\n\tmostlyclean-am\n\ndistclean: distclean-recursive\n\t-rm -rf crypto_aead/aes256gcm/aesni/$(DEPDIR) crypto_aead/chacha20poly1305/sodium/$(DEPDIR) crypto_auth/$(DEPDIR) crypto_auth/hmacsha256/$(DEPDIR) crypto_auth/hmacsha256/cp/$(DEPDIR) crypto_auth/hmacsha512/$(DEPDIR) crypto_auth/hmacsha512/cp/$(DEPDIR) crypto_auth/hmacsha512256/$(DEPDIR) crypto_auth/hmacsha512256/cp/$(DEPDIR) crypto_box/$(DEPDIR) crypto_box/curve25519xsalsa20poly1305/$(DEPDIR) crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR) crypto_core/hsalsa20/$(DEPDIR) crypto_core/hsalsa20/ref2/$(DEPDIR) crypto_core/salsa20/$(DEPDIR) crypto_core/salsa20/ref/$(DEPDIR) crypto_core/salsa2012/$(DEPDIR) crypto_core/salsa2012/ref/$(DEPDIR) crypto_core/salsa208/$(DEPDIR) crypto_core/salsa208/ref/$(DEPDIR) crypto_generichash/$(DEPDIR) crypto_generichash/blake2/$(DEPDIR) crypto_generichash/blake2/ref/$(DEPDIR) crypto_hash/$(DEPDIR) crypto_hash/sha256/$(DEPDIR) crypto_hash/sha256/cp/$(DEPDIR) crypto_hash/sha512/$(DEPDIR) crypto_hash/sha512/cp/$(DEPDIR) crypto_onetimeauth/$(DEPDIR) crypto_onetimeauth/poly1305/$(DEPDIR) crypto_onetimeauth/poly1305/donna/$(DEPDIR) crypto_onetimeauth/poly1305/sse2/$(DEPDIR) crypto_pwhash/scryptsalsa208sha256/$(DEPDIR) crypto_pwhash/scryptsalsa208sha256/nosse/$(DEPDIR) crypto_pwhash/scryptsalsa208sha256/sse/$(DEPDIR) crypto_scalarmult/$(DEPDIR) crypto_scalarmult/curve25519/$(DEPDIR) crypto_scalarmult/curve25519/donna_c64/$(DEPDIR) crypto_scalarmult/curve25519/ref10/$(DEPDIR) crypto_scalarmult/curve25519/sandy2x/$(DEPDIR) crypto_secretbox/$(DEPDIR) crypto_secretbox/xsalsa20poly1305/$(DEPDIR) crypto_secretbox/xsalsa20poly1305/ref/$(DEPDIR) crypto_shorthash/$(DEPDIR) crypto_shorthash/siphash24/$(DEPDIR) crypto_shorthash/siphash24/ref/$(DEPDIR) crypto_sign/$(DEPDIR) crypto_sign/ed25519/$(DEPDIR) crypto_sign/ed25519/ref10/$(DEPDIR) crypto_stream/$(DEPDIR) crypto_stream/aes128ctr/$(DEPDIR) crypto_stream/aes128ctr/portable/$(DEPDIR) crypto_stream/chacha20/$(DEPDIR) crypto_stream/chacha20/ref/$(DEPDIR) crypto_stream/chacha20/vec/$(DEPDIR) crypto_stream/salsa20/$(DEPDIR) crypto_stream/salsa20/amd64_xmm6/$(DEPDIR) crypto_stream/salsa20/ref/$(DEPDIR) crypto_stream/salsa2012/$(DEPDIR) crypto_stream/salsa2012/ref/$(DEPDIR) crypto_stream/salsa208/$(DEPDIR) crypto_stream/salsa208/ref/$(DEPDIR) crypto_stream/xsalsa20/$(DEPDIR) crypto_stream/xsalsa20/ref/$(DEPDIR) crypto_verify/16/$(DEPDIR) crypto_verify/16/ref/$(DEPDIR) crypto_verify/32/$(DEPDIR) crypto_verify/32/ref/$(DEPDIR) crypto_verify/64/$(DEPDIR) crypto_verify/64/ref/$(DEPDIR) randombytes/$(DEPDIR) randombytes/nativeclient/$(DEPDIR) randombytes/salsa20/$(DEPDIR) randombytes/sysrandom/$(DEPDIR) sodium/$(DEPDIR)\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-recursive\n\ndvi-am:\n\nhtml: html-recursive\n\nhtml-am:\n\ninfo: info-recursive\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-recursive\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-recursive\n\ninstall-html-am:\n\ninstall-info: install-info-recursive\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-recursive\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-recursive\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-recursive\n\t-rm -rf crypto_aead/aes256gcm/aesni/$(DEPDIR) crypto_aead/chacha20poly1305/sodium/$(DEPDIR) crypto_auth/$(DEPDIR) crypto_auth/hmacsha256/$(DEPDIR) crypto_auth/hmacsha256/cp/$(DEPDIR) crypto_auth/hmacsha512/$(DEPDIR) crypto_auth/hmacsha512/cp/$(DEPDIR) crypto_auth/hmacsha512256/$(DEPDIR) crypto_auth/hmacsha512256/cp/$(DEPDIR) crypto_box/$(DEPDIR) crypto_box/curve25519xsalsa20poly1305/$(DEPDIR) crypto_box/curve25519xsalsa20poly1305/ref/$(DEPDIR) crypto_core/hsalsa20/$(DEPDIR) crypto_core/hsalsa20/ref2/$(DEPDIR) crypto_core/salsa20/$(DEPDIR) crypto_core/salsa20/ref/$(DEPDIR) crypto_core/salsa2012/$(DEPDIR) crypto_core/salsa2012/ref/$(DEPDIR) crypto_core/salsa208/$(DEPDIR) crypto_core/salsa208/ref/$(DEPDIR) crypto_generichash/$(DEPDIR) crypto_generichash/blake2/$(DEPDIR) crypto_generichash/blake2/ref/$(DEPDIR) crypto_hash/$(DEPDIR) crypto_hash/sha256/$(DEPDIR) crypto_hash/sha256/cp/$(DEPDIR) crypto_hash/sha512/$(DEPDIR) crypto_hash/sha512/cp/$(DEPDIR) crypto_onetimeauth/$(DEPDIR) crypto_onetimeauth/poly1305/$(DEPDIR) crypto_onetimeauth/poly1305/donna/$(DEPDIR) crypto_onetimeauth/poly1305/sse2/$(DEPDIR) crypto_pwhash/scryptsalsa208sha256/$(DEPDIR) crypto_pwhash/scryptsalsa208sha256/nosse/$(DEPDIR) crypto_pwhash/scryptsalsa208sha256/sse/$(DEPDIR) crypto_scalarmult/$(DEPDIR) crypto_scalarmult/curve25519/$(DEPDIR) crypto_scalarmult/curve25519/donna_c64/$(DEPDIR) crypto_scalarmult/curve25519/ref10/$(DEPDIR) crypto_scalarmult/curve25519/sandy2x/$(DEPDIR) crypto_secretbox/$(DEPDIR) crypto_secretbox/xsalsa20poly1305/$(DEPDIR) crypto_secretbox/xsalsa20poly1305/ref/$(DEPDIR) crypto_shorthash/$(DEPDIR) crypto_shorthash/siphash24/$(DEPDIR) crypto_shorthash/siphash24/ref/$(DEPDIR) crypto_sign/$(DEPDIR) crypto_sign/ed25519/$(DEPDIR) crypto_sign/ed25519/ref10/$(DEPDIR) crypto_stream/$(DEPDIR) crypto_stream/aes128ctr/$(DEPDIR) crypto_stream/aes128ctr/portable/$(DEPDIR) crypto_stream/chacha20/$(DEPDIR) crypto_stream/chacha20/ref/$(DEPDIR) crypto_stream/chacha20/vec/$(DEPDIR) crypto_stream/salsa20/$(DEPDIR) crypto_stream/salsa20/amd64_xmm6/$(DEPDIR) crypto_stream/salsa20/ref/$(DEPDIR) crypto_stream/salsa2012/$(DEPDIR) crypto_stream/salsa2012/ref/$(DEPDIR) crypto_stream/salsa208/$(DEPDIR) crypto_stream/salsa208/ref/$(DEPDIR) crypto_stream/xsalsa20/$(DEPDIR) crypto_stream/xsalsa20/ref/$(DEPDIR) crypto_verify/16/$(DEPDIR) crypto_verify/16/ref/$(DEPDIR) crypto_verify/32/$(DEPDIR) crypto_verify/32/ref/$(DEPDIR) crypto_verify/64/$(DEPDIR) crypto_verify/64/ref/$(DEPDIR) randombytes/$(DEPDIR) randombytes/nativeclient/$(DEPDIR) randombytes/salsa20/$(DEPDIR) randombytes/sysrandom/$(DEPDIR) sodium/$(DEPDIR)\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-recursive\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic \\\n\tmostlyclean-libtool\n\npdf: pdf-recursive\n\npdf-am:\n\nps: ps-recursive\n\nps-am:\n\nuninstall-am:\n\n.MAKE: $(am__recursive_targets) install-am install-strip\n\n.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am check \\\n\tcheck-am clean clean-generic clean-libtool \\\n\tclean-noinstLTLIBRARIES cscopelist-am ctags ctags-am distclean \\\n\tdistclean-compile distclean-generic distclean-libtool \\\n\tdistclean-tags distdir dvi dvi-am html html-am info info-am \\\n\tinstall install-am install-data install-data-am install-dvi \\\n\tinstall-dvi-am install-exec install-exec-am install-html \\\n\tinstall-html-am install-info install-info-am install-man \\\n\tinstall-pdf install-pdf-am install-ps install-ps-am \\\n\tinstall-strip installcheck installcheck-am installdirs \\\n\tinstalldirs-am maintainer-clean maintainer-clean-generic \\\n\tmostlyclean mostlyclean-compile mostlyclean-generic \\\n\tmostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \\\n\tuninstall-am\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_aead/aes256gcm/aesni/aead_aes256gcm_aesni.c",
    "content": "\n/*\n * AES256-GCM, based on original code by Romain Dolbeau\n */\n\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"crypto_aead_aes256gcm.h\"\n#include \"export.h\"\n#include \"runtime.h\"\n#include \"utils.h\"\n\n#if defined(HAVE_WMMINTRIN_H) || \\\n    (defined(_MSC_VER) && (defined(_M_X64) || defined(_M_AMD64) || defined(_M_IX86)))\n\n#pragma GCC target(\"ssse3\")\n#pragma GCC target(\"aes\")\n#pragma GCC target(\"pclmul\")\n\n#include <immintrin.h>\n\n#if defined(__INTEL_COMPILER) || defined(_bswap64)\n#elif defined(_MSC_VER)\n# define _bswap64(a) _byteswap_uint64(a)\n#elif defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 2))\n# define _bswap64(a) __builtin_bswap64(a)\n#else\nstatic inline uint64_t\n_bswap64(const uint64_t x)\n{\n    return\n        ((x << 56) & 0xFF00000000000000UL) | ((x << 40) & 0x00FF000000000000UL) |\n        ((x << 24) & 0x0000FF0000000000UL) | ((x <<  8) & 0x000000FF00000000UL) |\n        ((x >>  8) & 0x00000000FF000000UL) | ((x >> 24) & 0x0000000000FF0000UL) |\n        ((x >> 40) & 0x000000000000FF00UL) | ((x >> 56) & 0x00000000000000FFUL);\n}\n#endif\n\ntypedef struct context {\n    CRYPTO_ALIGN(16) unsigned char H[16];\n    __m128i          rkeys[16];\n} context;\n\nstatic inline void\naesni_key256_expand(const unsigned char *key, __m128 *rkeys)\n{\n    __m128 key0 = _mm_loadu_ps((const float *) (key + 0));\n    __m128 key1 = _mm_loadu_ps((const float *) (key + 16));\n    __m128 temp0, temp1, temp2, temp4;\n    int    idx = 0;\n\n    rkeys[idx++] = key0;\n    temp0 = key0;\n    temp2 = key1;\n    temp4 = _mm_setzero_ps();\n\n/* why single precision floating-point rather than integer instructions ?\n     because _mm_shuffle_ps takes two inputs, while _mm_shuffle_epi32 only\n     takes one - it doesn't perform the same computation...\n     _mm_shuffle_ps takes the lower 64 bits of the result from the first\n     operand, and the higher 64 bits of the result from the second operand\n     (in both cases, all four input floats are accessible).\n     I don't like the non-orthogonal naming scheme :-(\n\n     This is all strongly inspired by the openssl assembly code.\n  */\n#define BLOCK1(IMM)                                                 \\\n    temp1 = _mm_castsi128_ps(_mm_aeskeygenassist_si128(_mm_castps_si128(temp2), IMM));\\\n    rkeys[idx++] = temp2;                                           \\\n    temp4 = _mm_shuffle_ps(temp4, temp0, 0x10);                     \\\n    temp0 = _mm_xor_ps(temp0, temp4);                               \\\n    temp4 = _mm_shuffle_ps(temp4, temp0, 0x8c);                     \\\n    temp0 = _mm_xor_ps(temp0, temp4);                               \\\n    temp1 = _mm_shuffle_ps(temp1, temp1, 0xff);                     \\\n    temp0 = _mm_xor_ps(temp0, temp1)\n\n#define BLOCK2(IMM)                                                 \\\n    temp1 = _mm_castsi128_ps(_mm_aeskeygenassist_si128(_mm_castps_si128(temp0), IMM));\\\n    rkeys[idx++] = temp0;                                           \\\n    temp4 = _mm_shuffle_ps(temp4, temp2, 0x10);                     \\\n    temp2 = _mm_xor_ps(temp2, temp4);                               \\\n    temp4 = _mm_shuffle_ps(temp4, temp2, 0x8c);                     \\\n    temp2 = _mm_xor_ps(temp2, temp4);                               \\\n    temp1 = _mm_shuffle_ps(temp1, temp1, 0xaa);                     \\\n    temp2 = _mm_xor_ps(temp2, temp1)\n\n    BLOCK1(0x01);\n    BLOCK2(0x01);\n\n    BLOCK1(0x02);\n    BLOCK2(0x02);\n\n    BLOCK1(0x04);\n    BLOCK2(0x04);\n\n    BLOCK1(0x08);\n    BLOCK2(0x08);\n\n    BLOCK1(0x10);\n    BLOCK2(0x10);\n\n    BLOCK1(0x20);\n    BLOCK2(0x20);\n\n    BLOCK1(0x40);\n    rkeys[idx++] = temp0;\n}\n\n/** single, by-the-book AES encryption with AES-NI */\nstatic inline void\naesni_encrypt1(unsigned char *out, __m128i nv, const __m128i *rkeys)\n{\n    __m128i temp = _mm_xor_si128(nv, rkeys[0]);\n    int     roundctr;\n\n#pragma unroll(13)\n    for (roundctr = 1; roundctr < 14; roundctr++) {\n        temp = _mm_aesenc_si128(temp, rkeys[roundctr]);\n    }\n    temp = _mm_aesenclast_si128(temp, rkeys[14]);\n    _mm_storeu_si128((__m128i *) out, temp);\n}\n\n/** multiple-blocks-at-once AES encryption with AES-NI ;\n    on Haswell, aesenc as a latency of 7 and a througput of 1\n    so the sequence of aesenc should be bubble-free, if you\n    have at least 8 blocks. Let's build an arbitratry-sized\n    function */\n/* Step 1 : loading the nonce */\n/* load & increment the n vector (non-vectorized, unused for now) */\n#define NVDECLx(a)                                                             \\\n    __m128i nv##a\n\n#define NVx(a)                                                                 \\\n    nv##a = _mm_shuffle_epi8(_mm_load_si128((const __m128i *) n), pt);         \\\n    n[3]++\n\n/* Step 2 : define value in round one (xor with subkey #0, aka key) */\n#define TEMPDECLx(a) \\\n    __m128i temp##a\n\n#define TEMPx(a) \\\n    temp##a = _mm_xor_si128(nv##a, rkeys[0])\n\n/* Step 3: one round of AES */\n#define AESENCx(a) \\\n    temp##a = _mm_aesenc_si128(temp##a, rkeys[roundctr])\n\n/* Step 4: last round of AES */\n#define AESENCLASTx(a) \\\n    temp##a = _mm_aesenclast_si128(temp##a, rkeys[14])\n\n/* Step 5: store result */\n#define STOREx(a) \\\n    _mm_storeu_si128((__m128i *) (out + (a * 16)), temp##a)\n\n/* all the MAKE* macros are for automatic explicit unrolling */\n#define MAKE4(X) \\\n    X(0);        \\\n    X(1);        \\\n    X(2);        \\\n    X(3)\n\n#define MAKE8(X) \\\n    X(0);        \\\n    X(1);        \\\n    X(2);        \\\n    X(3);        \\\n    X(4);        \\\n    X(5);        \\\n    X(6);        \\\n    X(7)\n\n#define COUNTER_INC2(N) (N)[3] += 2\n\n/* create a function of unrolling N ; the MAKEN is the unrolling\n   macro, defined above. The N in MAKEN must match N, obviously. */\n#define FUNC(N, MAKEN)                                                                                \\\n    static inline void aesni_encrypt##N(unsigned char *out, uint32_t *n, const __m128i *rkeys)        \\\n    {                                                                                                 \\\n        const __m128i pt = _mm_set_epi8(12, 13, 14, 15, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0);        \\\n        int           roundctr;                                                                       \\\n        MAKEN(NVDECLx);                                                                               \\\n        MAKEN(TEMPDECLx);                                                                             \\\n                                                                                                      \\\n        MAKEN(NVx);                                                                                   \\\n        MAKEN(TEMPx);                                                                                 \\\n        for (roundctr = 1; roundctr < 14; roundctr++) {                                               \\\n            MAKEN(AESENCx);                                                                           \\\n        }                                                                                             \\\n        MAKEN(AESENCLASTx);                                                                           \\\n        MAKEN(STOREx);                                                                                \\\n    }\n\nFUNC(8, MAKE8)\n\n/* all GF(2^128) fnctions are by the book, meaning this one:\n   <https://software.intel.com/sites/default/files/managed/72/cc/clmul-wp-rev-2.02-2014-04-20.pdf>\n*/\n\nstatic inline void\naddmul(unsigned char *c, const unsigned char *a, unsigned int xlen, const unsigned char *b)\n{\n    const __m128i rev = _mm_set_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n    __m128i       A, B, C;\n    __m128i       tmp2, tmp3, tmp4, tmp5, tmp6, tmp7, tmp8, tmp9;\n    __m128i       tmp10, tmp11, tmp12, tmp13, tmp14, tmp15, tmp16, tmp17, tmp18;\n    __m128i       tmp19, tmp20, tmp21, tmp22, tmp23, tmp24, tmp25, tmp26, tmp27;\n    __m128i       tmp28, tmp29, tmp30, tmp31, tmp32, tmp33, tmp34, tmp35, tmp36;\n\n    if (xlen >= 16) {\n        A = _mm_loadu_si128((const __m128i *) a);\n    } else {\n        CRYPTO_ALIGN(16) unsigned char padded[16];\n        unsigned int i;\n\n        memset(padded, 0, 16);\n        for (i = 0; i < xlen; i++) {\n            padded[i] = a[i];\n        }\n        A = _mm_load_si128((const __m128i *) padded);\n    }\n    A = _mm_shuffle_epi8(A, rev);\n    B = _mm_loadu_si128((const __m128i *) b);\n    C = _mm_loadu_si128((const __m128i *) c);\n    A = _mm_xor_si128(A, C);\n    tmp3 = _mm_clmulepi64_si128(A, B, 0x00);\n    tmp4 = _mm_clmulepi64_si128(A, B, 0x10);\n    tmp5 = _mm_clmulepi64_si128(A, B, 0x01);\n    tmp6 = _mm_clmulepi64_si128(A, B, 0x11);\n    tmp10 = _mm_xor_si128(tmp4, tmp5);\n    tmp13 = _mm_slli_si128(tmp10, 8);\n    tmp11 = _mm_srli_si128(tmp10, 8);\n    tmp15 = _mm_xor_si128(tmp3, tmp13);\n    tmp17 = _mm_xor_si128(tmp6, tmp11);\n    tmp7 = _mm_srli_epi32(tmp15, 31);\n    tmp8 = _mm_srli_epi32(tmp17, 31);\n    tmp16 = _mm_slli_epi32(tmp15, 1);\n    tmp18 = _mm_slli_epi32(tmp17, 1);\n    tmp9 = _mm_srli_si128(tmp7, 12);\n    tmp22 = _mm_slli_si128(tmp8, 4);\n    tmp25 = _mm_slli_si128(tmp7, 4);\n    tmp29 = _mm_or_si128(tmp16, tmp25);\n    tmp19 = _mm_or_si128(tmp18, tmp22);\n    tmp20 = _mm_or_si128(tmp19, tmp9);\n    tmp26 = _mm_slli_epi32(tmp29, 31);\n    tmp23 = _mm_slli_epi32(tmp29, 30);\n    tmp32 = _mm_slli_epi32(tmp29, 25);\n    tmp27 = _mm_xor_si128(tmp26, tmp23);\n    tmp28 = _mm_xor_si128(tmp27, tmp32);\n    tmp24 = _mm_srli_si128(tmp28, 4);\n    tmp33 = _mm_slli_si128(tmp28, 12);\n    tmp30 = _mm_xor_si128(tmp29, tmp33);\n    tmp2 = _mm_srli_epi32(tmp30, 1);\n    tmp12 = _mm_srli_epi32(tmp30, 2);\n    tmp14 = _mm_srli_epi32(tmp30, 7);\n    tmp34 = _mm_xor_si128(tmp2, tmp12);\n    tmp35 = _mm_xor_si128(tmp34, tmp14);\n    tmp36 = _mm_xor_si128(tmp35, tmp24);\n    tmp31 = _mm_xor_si128(tmp30, tmp36);\n    tmp21 = _mm_xor_si128(tmp20, tmp31);\n    _mm_storeu_si128((__m128i *) c, tmp21);\n}\n\n/* pure multiplication, for pre-computing  powers of H */\nstatic inline __m128i\nmulv(__m128i A, __m128i B)\n{\n    __m128i tmp3 = _mm_clmulepi64_si128(A, B, 0x00);\n    __m128i tmp4 = _mm_clmulepi64_si128(A, B, 0x10);\n    __m128i tmp5 = _mm_clmulepi64_si128(A, B, 0x01);\n    __m128i tmp6 = _mm_clmulepi64_si128(A, B, 0x11);\n    __m128i tmp10 = _mm_xor_si128(tmp4, tmp5);\n    __m128i tmp13 = _mm_slli_si128(tmp10, 8);\n    __m128i tmp11 = _mm_srli_si128(tmp10, 8);\n    __m128i tmp15 = _mm_xor_si128(tmp3, tmp13);\n    __m128i tmp17 = _mm_xor_si128(tmp6, tmp11);\n    __m128i tmp7 = _mm_srli_epi32(tmp15, 31);\n    __m128i tmp8 = _mm_srli_epi32(tmp17, 31);\n    __m128i tmp16 = _mm_slli_epi32(tmp15, 1);\n    __m128i tmp18 = _mm_slli_epi32(tmp17, 1);\n    __m128i tmp9 = _mm_srli_si128(tmp7, 12);\n    __m128i tmp22 = _mm_slli_si128(tmp8, 4);\n    __m128i tmp25 = _mm_slli_si128(tmp7, 4);\n    __m128i tmp29 = _mm_or_si128(tmp16, tmp25);\n    __m128i tmp19 = _mm_or_si128(tmp18, tmp22);\n    __m128i tmp20 = _mm_or_si128(tmp19, tmp9);\n    __m128i tmp26 = _mm_slli_epi32(tmp29, 31);\n    __m128i tmp23 = _mm_slli_epi32(tmp29, 30);\n    __m128i tmp32 = _mm_slli_epi32(tmp29, 25);\n    __m128i tmp27 = _mm_xor_si128(tmp26, tmp23);\n    __m128i tmp28 = _mm_xor_si128(tmp27, tmp32);\n    __m128i tmp24 = _mm_srli_si128(tmp28, 4);\n    __m128i tmp33 = _mm_slli_si128(tmp28, 12);\n    __m128i tmp30 = _mm_xor_si128(tmp29, tmp33);\n    __m128i tmp2 = _mm_srli_epi32(tmp30, 1);\n    __m128i tmp12 = _mm_srli_epi32(tmp30, 2);\n    __m128i tmp14 = _mm_srli_epi32(tmp30, 7);\n    __m128i tmp34 = _mm_xor_si128(tmp2, tmp12);\n    __m128i tmp35 = _mm_xor_si128(tmp34, tmp14);\n    __m128i tmp36 = _mm_xor_si128(tmp35, tmp24);\n    __m128i tmp31 = _mm_xor_si128(tmp30, tmp36);\n    __m128i C = _mm_xor_si128(tmp20, tmp31);\n\n    return C;\n}\n\n/* 4 multiply-accumulate at once; again\n   <https://software.intel.com/sites/default/files/managed/72/cc/clmul-wp-rev-2.02-2014-04-20.pdf>\n   for the Aggregated Reduction Method & sample code.\n   Algorithm by Krzysztof Jankowski, Pierre Laurent - Intel */\n\n#define RED_DECL(a) __m128i H##a##_X##a##_lo, H##a##_X##a##_hi, tmp##a, tmp##a##B\n#define RED_SHUFFLE(a) X##a = _mm_shuffle_epi8(X##a, rev)\n#define RED_MUL_LOW(a) H##a##_X##a##_lo = _mm_clmulepi64_si128(H##a, X##a, 0x00)\n#define RED_MUL_HIGH(a) H##a##_X##a##_hi = _mm_clmulepi64_si128(H##a, X##a, 0x11)\n#define RED_MUL_MID(a)                          \\\n    tmp##a = _mm_shuffle_epi32(H##a, 0x4e);     \\\n    tmp##a##B = _mm_shuffle_epi32(X##a, 0x4e);  \\\n    tmp##a = _mm_xor_si128(tmp##a, H##a);       \\\n    tmp##a##B = _mm_xor_si128(tmp##a##B, X##a); \\\n    tmp##a = _mm_clmulepi64_si128(tmp##a, tmp##a##B, 0x00)\n\n#define REDUCE4(rev, H0_, H1_, H2_, H3_, X0_, X1_, X2_, X3_, accv) \\\ndo { \\\n    MAKE4(RED_DECL); \\\n    __m128i       lo, hi; \\\n    __m128i       tmp8, tmp9; \\\n    __m128i       H0 = H0_; \\\n    __m128i       H1 = H1_; \\\n    __m128i       H2 = H2_; \\\n    __m128i       H3 = H3_; \\\n    __m128i       X0 = X0_; \\\n    __m128i       X1 = X1_; \\\n    __m128i       X2 = X2_; \\\n    __m128i       X3 = X3_; \\\n\\\n/* byte-revert the inputs & xor the first one into the accumulator */ \\\n\\\n    MAKE4(RED_SHUFFLE); \\\n    X3 = _mm_xor_si128(X3, accv); \\\n\\\n/* 4 low H*X (x0*h0) */ \\\n\\\n    MAKE4(RED_MUL_LOW); \\\n    lo = _mm_xor_si128(H0_X0_lo, H1_X1_lo); \\\n    lo = _mm_xor_si128(lo, H2_X2_lo); \\\n    lo = _mm_xor_si128(lo, H3_X3_lo); \\\n\\\n/* 4 high H*X (x1*h1) */ \\\n\\\n    MAKE4(RED_MUL_HIGH); \\\n    hi = _mm_xor_si128(H0_X0_hi, H1_X1_hi); \\\n    hi = _mm_xor_si128(hi, H2_X2_hi); \\\n    hi = _mm_xor_si128(hi, H3_X3_hi); \\\n\\\n/* 4 middle H*X, using Karatsuba, i.e. \\\n     x1*h0+x0*h1 =(x1+x0)*(h1+h0)-x1*h1-x0*h0 \\\n     we already have all x1y1 & x0y0 (accumulated in hi & lo) \\\n     (0 is low half and 1 is high half) \\\n  */ \\\n/* permute the high and low 64 bits in H1 & X1, \\\n     so create (h0,h1) from (h1,h0) and (x0,x1) from (x1,x0), \\\n     then compute (h0+h1,h1+h0) and (x0+x1,x1+x0), \\\n     and finally multiply \\\n  */ \\\n    MAKE4(RED_MUL_MID); \\\n\\\n/* substracts x1*h1 and x0*h0 */ \\\n    tmp0 = _mm_xor_si128(tmp0, lo); \\\n    tmp0 = _mm_xor_si128(tmp0, hi); \\\n    tmp0 = _mm_xor_si128(tmp1, tmp0); \\\n    tmp0 = _mm_xor_si128(tmp2, tmp0); \\\n    tmp0 = _mm_xor_si128(tmp3, tmp0);\\\n\\\n    /* reduction */ \\\n    tmp0B = _mm_slli_si128(tmp0, 8); \\\n    tmp0 = _mm_srli_si128(tmp0, 8); \\\n    lo = _mm_xor_si128(tmp0B, lo); \\\n    hi = _mm_xor_si128(tmp0, hi); \\\n    tmp3 = lo; \\\n    tmp2B = hi; \\\n    tmp3B = _mm_srli_epi32(tmp3, 31); \\\n    tmp8 = _mm_srli_epi32(tmp2B, 31); \\\n    tmp3 = _mm_slli_epi32(tmp3, 1); \\\n    tmp2B = _mm_slli_epi32(tmp2B, 1); \\\n    tmp9 = _mm_srli_si128(tmp3B, 12); \\\n    tmp8 = _mm_slli_si128(tmp8, 4); \\\n    tmp3B = _mm_slli_si128(tmp3B, 4); \\\n    tmp3 = _mm_or_si128(tmp3, tmp3B); \\\n    tmp2B = _mm_or_si128(tmp2B, tmp8); \\\n    tmp2B = _mm_or_si128(tmp2B, tmp9); \\\n    tmp3B = _mm_slli_epi32(tmp3, 31); \\\n    tmp8 = _mm_slli_epi32(tmp3, 30); \\\n    tmp9 = _mm_slli_epi32(tmp3, 25); \\\n    tmp3B = _mm_xor_si128(tmp3B, tmp8); \\\n    tmp3B = _mm_xor_si128(tmp3B, tmp9); \\\n    tmp8 = _mm_srli_si128(tmp3B, 4); \\\n    tmp3B = _mm_slli_si128(tmp3B, 12); \\\n    tmp3 = _mm_xor_si128(tmp3, tmp3B); \\\n    tmp2 = _mm_srli_epi32(tmp3, 1); \\\n    tmp0B = _mm_srli_epi32(tmp3, 2); \\\n    tmp1B = _mm_srli_epi32(tmp3, 7); \\\n    tmp2 = _mm_xor_si128(tmp2, tmp0B); \\\n    tmp2 = _mm_xor_si128(tmp2, tmp1B); \\\n    tmp2 = _mm_xor_si128(tmp2, tmp8); \\\n    tmp3 = _mm_xor_si128(tmp3, tmp2); \\\n    tmp2B = _mm_xor_si128(tmp2B, tmp3); \\\n\\\n    accv = tmp2B; \\\n} while(0)\n\n#define XORx(a)                                                       \\\n        temp##a = _mm_xor_si128(temp##a,                              \\\n                                _mm_loadu_si128((const __m128i *) (in + a * 16)))\n\n#define LOADx(a)                                                      \\\n    __m128i in##a = _mm_loadu_si128((const __m128i *) (in + a * 16))\n\n/* full encrypt & checksum 8 blocks at once */\n#define aesni_encrypt8full(out_, n_, rkeys, in_, accum, hv_, h2v_, h3v_, h4v_, rev) \\\ndo { \\\n    unsigned char *out = out_; \\\n    uint32_t *n = n_; \\\n    const unsigned char *in = in_; \\\n    const __m128i hv = hv_; \\\n    const __m128i h2v = h2v_; \\\n    const __m128i h3v = h3v_; \\\n    const __m128i h4v = h4v_; \\\n    const __m128i pt = _mm_set_epi8(12, 13, 14, 15, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0); \\\n    __m128i       accv_; \\\n    int           roundctr; \\\n    \\\n    MAKE8(NVDECLx); \\\n    MAKE8(TEMPDECLx); \\\n    MAKE8(NVx); \\\n    MAKE8(TEMPx); \\\n    for (roundctr = 1; roundctr < 14; roundctr++) { \\\n        MAKE8(AESENCx); \\\n    } \\\n    MAKE8(AESENCLASTx); \\\n    MAKE8(XORx); \\\n    MAKE8(STOREx); \\\n    accv_ = _mm_load_si128((const __m128i *) accum); \\\n    REDUCE4(rev, hv, h2v, h3v, h4v, temp3, temp2, temp1, temp0, accv_); \\\n    REDUCE4(rev, hv, h2v, h3v, h4v, temp7, temp6, temp5, temp4, accv_); \\\n    _mm_store_si128((__m128i *) accum, accv_); \\\n} while(0)\n\n/* checksum 8 blocks at once */\n#define aesni_addmul8full(in_, accum, hv_, h2v_, h3v_, h4v_, rev) \\\ndo { \\\n    const unsigned char *in = in_; \\\n    const __m128i hv = hv_; \\\n    const __m128i h2v = h2v_; \\\n    const __m128i h3v = h3v_; \\\n    const __m128i h4v = h4v_; \\\n    __m128i accv_; \\\n    \\\n    MAKE8(LOADx); \\\n    accv_ = _mm_load_si128((const __m128i *) accum); \\\n    REDUCE4(rev, hv, h2v, h3v, h4v, in3, in2, in1, in0, accv_); \\\n    REDUCE4(rev, hv, h2v, h3v, h4v, in7, in6, in5, in4, accv_); \\\n    _mm_store_si128((__m128i *) accum, accv_); \\\n} while(0)\n\n/* decrypt 8 blocks at once */\n#define aesni_decrypt8full(out_, n_, rkeys, in_) \\\ndo { \\\n    unsigned char       *out = out_; \\\n    uint32_t            *n = n_; \\\n    const unsigned char *in = in_; \\\n    const __m128i        pt = _mm_set_epi8(12, 13, 14, 15, 11, 10, 9, 8, 7, 6, 5, 4, 3, 2, 1, 0); \\\n    int                  roundctr; \\\n\\\n    MAKE8(NVDECLx); \\\n    MAKE8(TEMPDECLx); \\\n    MAKE8(NVx); \\\n    MAKE8(TEMPx); \\\n    for (roundctr = 1; roundctr < 14; roundctr++) { \\\n        MAKE8(AESENCx); \\\n    } \\\n    MAKE8(AESENCLASTx); \\\n    MAKE8(XORx); \\\n    MAKE8(STOREx); \\\n} while(0)\n\nint\ncrypto_aead_aes256gcm_beforenm(crypto_aead_aes256gcm_state *ctx_,\n                               const unsigned char *k)\n{\n    context       *ctx = (context *) ctx_;\n    __m128i       *rkeys = ctx->rkeys;\n    __m128i        zero = _mm_setzero_si128();\n    unsigned char *H = ctx->H;\n\n    (void) sizeof(int[(sizeof *ctx_) >= (sizeof *ctx) ? 1 : -1]);\n    aesni_key256_expand(k, (__m128 *) rkeys);\n    aesni_encrypt1(H, zero, rkeys);\n\n    return 0;\n}\n\nint\ncrypto_aead_aes256gcm_encrypt_afternm(unsigned char *c, unsigned long long *clen,\n                                      const unsigned char *m, unsigned long long mlen,\n                                      const unsigned char *ad, unsigned long long adlen,\n                                      const unsigned char *nsec,\n                                      const unsigned char *npub,\n                                      const crypto_aead_aes256gcm_state *ctx_)\n{\n    const __m128i       rev = _mm_set_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n    const context      *ctx = (const context *) ctx_;\n    const __m128i      *rkeys = ctx->rkeys;\n    __m128i             Hv, H2v, H3v, H4v, accv;\n    unsigned long long  i, j;\n    unsigned long long  adlen_rnd64 = adlen & ~63ULL;\n    unsigned long long  mlen_rnd128 = mlen & ~127ULL;\n    CRYPTO_ALIGN(16) uint32_t      n2[4];\n    CRYPTO_ALIGN(16) unsigned char H[16];\n    CRYPTO_ALIGN(16) unsigned char T[16];\n    CRYPTO_ALIGN(16) unsigned char accum[16];\n    CRYPTO_ALIGN(16) unsigned char fb[16];\n\n    (void) nsec;\n    memcpy(H, ctx->H, sizeof H);\n    if (mlen > 16ULL * (1ULL << 32)) {\n        abort();\n    }\n    memcpy(&n2[0], npub, 3 * 4);\n    n2[3] = 0x01000000;\n    aesni_encrypt1(T, _mm_load_si128((const __m128i *) n2), rkeys);\n    {\n        uint64_t x;\n        x = _bswap64((uint64_t) (8 * adlen));\n        memcpy(&fb[0], &x, sizeof x);\n        x = _bswap64((uint64_t) (8 * mlen));\n        memcpy(&fb[8], &x, sizeof x);\n    }\n    /* we store H (and it's power) byte-reverted once and for all */\n    Hv = _mm_shuffle_epi8(_mm_load_si128((const __m128i *) H), rev);\n    _mm_store_si128((__m128i *) H, Hv);\n    H2v = mulv(Hv, Hv);\n    H3v = mulv(H2v, Hv);\n    H4v = mulv(H3v, Hv);\n\n    accv = _mm_setzero_si128();\n    /* unrolled by 4 GCM (by 8 doesn't improve using REDUCE4) */\n    for (i = 0; i < adlen_rnd64; i += 64) {\n        __m128i X4_ = _mm_loadu_si128((const __m128i *) (ad + i + 0));\n        __m128i X3_ = _mm_loadu_si128((const __m128i *) (ad + i + 16));\n        __m128i X2_ = _mm_loadu_si128((const __m128i *) (ad + i + 32));\n        __m128i X1_ = _mm_loadu_si128((const __m128i *) (ad + i + 48));\n        REDUCE4(rev, Hv, H2v, H3v, H4v, X1_, X2_, X3_, X4_, accv);\n    }\n    _mm_store_si128((__m128i *) accum, accv);\n\n    /* GCM remainder loop */\n    for (i = adlen_rnd64; i < adlen; i += 16) {\n        unsigned int blocklen = 16;\n\n        if (i + (unsigned long long) blocklen > adlen) {\n            blocklen = (unsigned int) (adlen - i);\n        }\n        addmul(accum, ad + i, blocklen, H);\n    }\n\n/* this only does 8 full blocks, so no fancy bounds checking is necessary*/\n#define LOOPRND128                                                                                   \\\n    do {                                                                                             \\\n        const int iter = 8;                                                                          \\\n        const int lb = iter * 16;                                                                    \\\n                                                                                                     \\\n        for (i = 0; i < mlen_rnd128; i += lb) {                                                      \\\n            aesni_encrypt8full(c + i, n2, rkeys, m + i, accum, Hv, H2v, H3v, H4v, rev);              \\\n        }                                                                                            \\\n    } while(0)\n\n/* remainder loop, with the slower GCM update to accomodate partial blocks */\n#define LOOPRMD128                                           \\\n    do {                                                     \\\n        const int iter = 8;                                  \\\n        const int lb = iter * 16;                            \\\n                                                             \\\n        for (i = mlen_rnd128; i < mlen; i += lb) {           \\\n            CRYPTO_ALIGN(16) unsigned char outni[8 * 16];    \\\n            unsigned long long mj = lb;                      \\\n                                                             \\\n            aesni_encrypt8(outni, n2, rkeys);                \\\n            if ((i + mj) >= mlen) {                          \\\n                mj = mlen - i;                               \\\n            }                                                \\\n            for (j = 0; j < mj; j++) {                       \\\n                c[i + j] = m[i + j] ^ outni[j];              \\\n            }                                                \\\n            for (j = 0; j < mj; j += 16) {                   \\\n                unsigned int bl = 16;                        \\\n                                                             \\\n                if (j + (unsigned long long) bl >= mj) {     \\\n                    bl = (unsigned int) (mj - j);            \\\n                }                                            \\\n                addmul(accum, c + i + j, bl, H);             \\\n            }                                                \\\n        }                                                    \\\n    } while(0)\n\n    n2[3] &= 0x00ffffff;\n    COUNTER_INC2(n2);\n    LOOPRND128;\n    LOOPRMD128;\n\n    addmul(accum, fb, 16, H);\n\n    for (i = 0; i < 16; ++i) {\n        c[i + mlen] = T[i] ^ accum[15 - i];\n    }\n    if (clen != NULL) {\n        *clen = mlen + 16;\n    }\n    return 0;\n}\n\nint\ncrypto_aead_aes256gcm_decrypt_afternm(unsigned char *m, unsigned long long *mlen_p,\n                                      unsigned char *nsec,\n                                      const unsigned char *c, unsigned long long clen,\n                                      const unsigned char *ad, unsigned long long adlen,\n                                      const unsigned char *npub,\n                                      const crypto_aead_aes256gcm_state *ctx_)\n{\n    const __m128i       rev = _mm_set_epi8(0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15);\n    const context      *ctx = (const context *) ctx_;\n    const __m128i      *rkeys = ctx->rkeys;\n    __m128i             Hv, H2v, H3v, H4v, accv;\n    unsigned long long  i, j;\n    unsigned long long  adlen_rnd64 = adlen & ~63ULL;\n    unsigned long long  mlen;\n    unsigned long long  mlen_rnd128;\n    CRYPTO_ALIGN(16) uint32_t      n2[4];\n    CRYPTO_ALIGN(16) unsigned char H[16];\n    CRYPTO_ALIGN(16) unsigned char T[16];\n    CRYPTO_ALIGN(16) unsigned char accum[16];\n    CRYPTO_ALIGN(16) unsigned char fb[16];\n\n    (void) nsec;\n    if (clen > 16ULL * (1ULL << 32) - 16ULL) {\n        abort();\n    }\n    if (mlen_p != NULL) {\n        *mlen_p = 0U;\n    }\n    if (clen < 16) {\n        return -1;\n    }\n    mlen = clen - 16;\n\n    memcpy(&n2[0], npub, 3 * 4);\n    n2[3] = 0x01000000;\n    aesni_encrypt1(T, _mm_load_si128((const __m128i *) n2), rkeys);\n    {\n        uint64_t x;\n        x = _bswap64((uint64_t)(8 * adlen));\n        memcpy(&fb[0], &x, sizeof x);\n        x = _bswap64((uint64_t)(8 * mlen));\n        memcpy(&fb[8], &x, sizeof x);\n    }\n    memcpy(H, ctx->H, sizeof H);\n    Hv = _mm_shuffle_epi8(_mm_load_si128((const __m128i *) H), rev);\n    _mm_store_si128((__m128i *) H, Hv);\n    H2v = mulv(Hv, Hv);\n    H3v = mulv(H2v, Hv);\n    H4v = mulv(H3v, Hv);\n\n    accv = _mm_setzero_si128();\n    for (i = 0; i < adlen_rnd64; i += 64) {\n        __m128i X4_ = _mm_loadu_si128((const __m128i *) (ad + i + 0));\n        __m128i X3_ = _mm_loadu_si128((const __m128i *) (ad + i + 16));\n        __m128i X2_ = _mm_loadu_si128((const __m128i *) (ad + i + 32));\n        __m128i X1_ = _mm_loadu_si128((const __m128i *) (ad + i + 48));\n        REDUCE4(rev, Hv, H2v, H3v, H4v, X1_, X2_, X3_, X4_, accv);\n    }\n    _mm_store_si128((__m128i *) accum, accv);\n\n    for (i = adlen_rnd64; i < adlen; i += 16) {\n        unsigned int blocklen = 16;\n        if (i + (unsigned long long) blocklen > adlen) {\n            blocklen = (unsigned int) (adlen - i);\n        }\n        addmul(accum, ad + i, blocklen, H);\n    }\n\n    mlen_rnd128 = mlen & ~127ULL;\n\n#define LOOPACCUMDRND128                                                                          \\\n    do {                                                                                          \\\n        const int iter = 8;                                                                       \\\n        const int lb = iter * 16;                                                                 \\\n        for (i = 0; i < mlen_rnd128; i += lb) {                                                   \\\n            aesni_addmul8full(c + i, accum, Hv, H2v, H3v, H4v, rev);                              \\\n        }                                                                                         \\\n    } while(0)\n\n#define LOOPDRND128                                                                               \\\n    do {                                                                                          \\\n        const int iter = 8;                                                                       \\\n        const int lb = iter * 16;                                                                 \\\n                                                                                                  \\\n        for (i = 0; i < mlen_rnd128; i += lb) {                                                   \\\n            aesni_decrypt8full(m + i, n2, rkeys, c + i);                                          \\\n        }                                                                                         \\\n    } while(0)\n\n#define LOOPACCUMDRMD128                                     \\\n    do {                                                     \\\n        const int iter = 8;                                  \\\n        const int lb = iter * 16;                            \\\n                                                             \\\n        for (i = mlen_rnd128; i < mlen; i += lb) {           \\\n            unsigned long long mj = lb;                      \\\n                                                             \\\n            if ((i + mj) >= mlen) {                          \\\n                mj = mlen - i;                               \\\n            }                                                \\\n            for (j = 0; j < mj; j += 16) {                   \\\n                unsigned int bl = 16;                        \\\n                                                             \\\n                if (j + (unsigned long long) bl >= mj) {     \\\n                    bl = (unsigned int) (mj - j);            \\\n                }                                            \\\n                addmul(accum, c + i + j, bl, H);             \\\n            }                                                \\\n        }                                                    \\\n    } while(0)\n\n#define LOOPDRMD128                                          \\\n    do {                                                     \\\n        const int iter = 8;                                  \\\n        const int lb = iter * 16;                            \\\n                                                             \\\n        for (i = mlen_rnd128; i < mlen; i += lb) {           \\\n            CRYPTO_ALIGN(16) unsigned char outni[8 * 16];    \\\n            unsigned long long mj = lb;                      \\\n                                                             \\\n            if ((i + mj) >= mlen) {                          \\\n                mj = mlen - i;                               \\\n            }                                                \\\n            aesni_encrypt8(outni, n2, rkeys);                \\\n            for (j = 0; j < mj; j++) {                       \\\n                m[i + j] = c[i + j] ^ outni[j];              \\\n            }                                                \\\n        }                                                    \\\n    } while(0)\n    n2[3] &= 0x00ffffff;\n\n    COUNTER_INC2(n2);\n    LOOPACCUMDRND128;\n    LOOPACCUMDRMD128;\n    addmul(accum, fb, 16, H);\n    {\n        unsigned char d = 0;\n\n        for (i = 0; i < 16; i++) {\n            d |= (c[i + mlen] ^ (T[i] ^ accum[15 - i]));\n        }\n        if (d != 0) {\n            return -1;\n        }\n    }\n    n2[3] = 0U;\n    COUNTER_INC2(n2);\n    LOOPDRND128;\n    LOOPDRMD128;\n\n    if (mlen_p != NULL) {\n        *mlen_p = mlen;\n    }\n    return 0;\n}\n\nint\ncrypto_aead_aes256gcm_encrypt(unsigned char *c,\n                              unsigned long long *clen_p,\n                              const unsigned char *m,\n                              unsigned long long mlen,\n                              const unsigned char *ad,\n                              unsigned long long adlen,\n                              const unsigned char *nsec,\n                              const unsigned char *npub,\n                              const unsigned char *k)\n{\n    crypto_aead_aes256gcm_state ctx;\n\n    crypto_aead_aes256gcm_beforenm(&ctx, k);\n\n    return crypto_aead_aes256gcm_encrypt_afternm\n        (c, clen_p, m, mlen, ad, adlen, nsec, npub,\n            (const crypto_aead_aes256gcm_state *) &ctx);\n}\n\nint\ncrypto_aead_aes256gcm_decrypt(unsigned char *m,\n                              unsigned long long *mlen_p,\n                              unsigned char *nsec,\n                              const unsigned char *c,\n                              unsigned long long clen,\n                              const unsigned char *ad,\n                              unsigned long long adlen,\n                              const unsigned char *npub,\n                              const unsigned char *k)\n{\n    crypto_aead_aes256gcm_state ctx;\n\n    crypto_aead_aes256gcm_beforenm(&ctx, k);\n\n    return crypto_aead_aes256gcm_decrypt_afternm\n        (m, mlen_p, nsec, c, clen, ad, adlen, npub,\n            (const crypto_aead_aes256gcm_state *) &ctx);\n}\n\nint\ncrypto_aead_aes256gcm_is_available(void)\n{\n    return sodium_runtime_has_pclmul() & sodium_runtime_has_aesni();\n}\n\nsize_t\ncrypto_aead_aes256gcm_keybytes(void)\n{\n    return crypto_aead_aes256gcm_KEYBYTES;\n}\n\nsize_t\ncrypto_aead_aes256gcm_nsecbytes(void)\n{\n    return crypto_aead_aes256gcm_NSECBYTES;\n}\n\nsize_t\ncrypto_aead_aes256gcm_npubbytes(void)\n{\n    return crypto_aead_aes256gcm_NPUBBYTES;\n}\n\nsize_t\ncrypto_aead_aes256gcm_abytes(void)\n{\n    return crypto_aead_aes256gcm_ABYTES;\n}\n\nsize_t\ncrypto_aead_aes256gcm_statebytes(void)\n{\n    return (sizeof(crypto_aead_aes256gcm_state) + (size_t) 15U) & ~(size_t) 15U;\n}\n\n#else\n\nint\ncrypto_aead_aes256gcm_is_available(void)\n{\n    return 0;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_aead/chacha20poly1305/sodium/aead_chacha20poly1305.c",
    "content": "\n#include <stdlib.h>\n#include <limits.h>\n#include <string.h>\n\n#include \"crypto_aead_chacha20poly1305.h\"\n#include \"crypto_onetimeauth_poly1305.h\"\n#include \"crypto_stream_chacha20.h\"\n#include \"crypto_verify_16.h\"\n#include \"utils.h\"\n\nstatic unsigned char _pad0[16];\n\nstatic inline void\n_u64_le_from_ull(unsigned char out[8U], unsigned long long x)\n{\n    out[0] = (unsigned char) (x & 0xff); x >>= 8;\n    out[1] = (unsigned char) (x & 0xff); x >>= 8;\n    out[2] = (unsigned char) (x & 0xff); x >>= 8;\n    out[3] = (unsigned char) (x & 0xff); x >>= 8;\n    out[4] = (unsigned char) (x & 0xff); x >>= 8;\n    out[5] = (unsigned char) (x & 0xff); x >>= 8;\n    out[6] = (unsigned char) (x & 0xff); x >>= 8;\n    out[7] = (unsigned char) (x & 0xff);\n}\n\nint\ncrypto_aead_chacha20poly1305_encrypt(unsigned char *c,\n                                     unsigned long long *clen_p,\n                                     const unsigned char *m,\n                                     unsigned long long mlen,\n                                     const unsigned char *ad,\n                                     unsigned long long adlen,\n                                     const unsigned char *nsec,\n                                     const unsigned char *npub,\n                                     const unsigned char *k)\n{\n    crypto_onetimeauth_poly1305_state state;\n    unsigned char                     block0[64U];\n    unsigned char                     slen[8U];\n\n    (void) nsec;\n/* LCOV_EXCL_START */\n#ifdef ULONG_LONG_MAX\n    if (mlen > ULONG_LONG_MAX - crypto_aead_chacha20poly1305_ABYTES) {\n        if (clen_p != NULL) {\n            *clen_p = 0ULL;\n        }\n        return -1;\n    }\n#endif\n/* LCOV_EXCL_STOP */\n\n    crypto_stream_chacha20(block0, sizeof block0, npub, k);\n    crypto_onetimeauth_poly1305_init(&state, block0);\n    sodium_memzero(block0, sizeof block0);\n\n    crypto_onetimeauth_poly1305_update(&state, ad, adlen);\n    _u64_le_from_ull(slen, adlen);\n    crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen);\n\n    crypto_stream_chacha20_xor_ic(c, m, mlen, npub, 1U, k);\n\n    crypto_onetimeauth_poly1305_update(&state, c, mlen);\n    _u64_le_from_ull(slen, mlen);\n    crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen);\n\n    crypto_onetimeauth_poly1305_final(&state, c + mlen);\n    sodium_memzero(&state, sizeof state);\n\n    if (clen_p != NULL) {\n        *clen_p = mlen + crypto_aead_chacha20poly1305_ABYTES;\n    }\n    return 0;\n}\n\nint\ncrypto_aead_chacha20poly1305_ietf_encrypt(unsigned char *c,\n                                          unsigned long long *clen_p,\n                                          const unsigned char *m,\n                                          unsigned long long mlen,\n                                          const unsigned char *ad,\n                                          unsigned long long adlen,\n                                          const unsigned char *nsec,\n                                          const unsigned char *npub,\n                                          const unsigned char *k)\n{\n    crypto_onetimeauth_poly1305_state state;\n    unsigned char                     block0[64U];\n    unsigned char                     slen[8U];\n\n    (void) nsec;\n/* LCOV_EXCL_START */\n#ifdef ULONG_LONG_MAX\n    if (mlen > ULONG_LONG_MAX - crypto_aead_chacha20poly1305_ABYTES) {\n        if (clen_p != NULL) {\n            *clen_p = 0ULL;\n        }\n        return -1;\n    }\n#endif\n/* LCOV_EXCL_STOP */\n\n    crypto_stream_chacha20_ietf(block0, sizeof block0, npub, k);\n    crypto_onetimeauth_poly1305_init(&state, block0);\n    sodium_memzero(block0, sizeof block0);\n\n    crypto_onetimeauth_poly1305_update(&state, ad, adlen);\n    crypto_onetimeauth_poly1305_update(&state, _pad0, (0x10 - adlen) & 0xf);\n\n    crypto_stream_chacha20_ietf_xor_ic(c, m, mlen, npub, 1U, k);\n\n    crypto_onetimeauth_poly1305_update(&state, c, mlen);\n    crypto_onetimeauth_poly1305_update(&state, _pad0, (0x10 - mlen) & 0xf);\n\n    _u64_le_from_ull(slen, adlen);\n    crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen);\n\n    _u64_le_from_ull(slen, mlen);\n    crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen);\n\n    crypto_onetimeauth_poly1305_final(&state, c + mlen);\n    sodium_memzero(&state, sizeof state);\n\n    if (clen_p != NULL) {\n        *clen_p = mlen + crypto_aead_chacha20poly1305_ABYTES;\n    }\n    return 0;\n}\n\nint\ncrypto_aead_chacha20poly1305_decrypt(unsigned char *m,\n                                     unsigned long long *mlen_p,\n                                     unsigned char *nsec,\n                                     const unsigned char *c,\n                                     unsigned long long clen,\n                                     const unsigned char *ad,\n                                     unsigned long long adlen,\n                                     const unsigned char *npub,\n                                     const unsigned char *k)\n{\n    crypto_onetimeauth_poly1305_state state;\n    unsigned char                     block0[64U];\n    unsigned char                     slen[8U];\n    unsigned char                     mac[crypto_aead_chacha20poly1305_ABYTES];\n    unsigned long long                mlen;\n    int                               ret;\n\n    (void) nsec;\n    if (mlen_p != NULL) {\n        *mlen_p = 0ULL;\n    }\n    if (clen < crypto_aead_chacha20poly1305_ABYTES) {\n        return -1;\n    }\n    crypto_stream_chacha20(block0, sizeof block0, npub, k);\n    crypto_onetimeauth_poly1305_init(&state, block0);\n    sodium_memzero(block0, sizeof block0);\n\n    crypto_onetimeauth_poly1305_update(&state, ad, adlen);\n    _u64_le_from_ull(slen, adlen);\n    crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen);\n\n    mlen = clen - crypto_aead_chacha20poly1305_ABYTES;\n    crypto_onetimeauth_poly1305_update(&state, c, mlen);\n    _u64_le_from_ull(slen, mlen);\n    crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen);\n\n    crypto_onetimeauth_poly1305_final(&state, mac);\n    sodium_memzero(&state, sizeof state);\n\n    (void) sizeof(int[sizeof mac == 16U ? 1 : -1]);\n    ret = crypto_verify_16(mac, c + mlen);\n    sodium_memzero(mac, sizeof mac);\n    if (ret != 0) {\n        memset(m, 0, mlen);\n        return -1;\n    }\n    crypto_stream_chacha20_xor_ic\n        (m, c, mlen, npub, 1U, k);\n    if (mlen_p != NULL) {\n        *mlen_p = mlen;\n    }\n    return 0;\n}\n\nint\ncrypto_aead_chacha20poly1305_ietf_decrypt(unsigned char *m,\n                                          unsigned long long *mlen_p,\n                                          unsigned char *nsec,\n                                          const unsigned char *c,\n                                          unsigned long long clen,\n                                          const unsigned char *ad,\n                                          unsigned long long adlen,\n                                          const unsigned char *npub,\n                                          const unsigned char *k)\n{\n    crypto_onetimeauth_poly1305_state state;\n    unsigned char                     block0[64U];\n    unsigned char                     slen[8U];\n    unsigned char                     mac[crypto_aead_chacha20poly1305_ABYTES];\n    unsigned long long                mlen;\n    int                               ret;\n\n    (void) nsec;\n    if (mlen_p != NULL) {\n        *mlen_p = 0ULL;\n    }\n    if (clen < crypto_aead_chacha20poly1305_ABYTES) {\n        return -1;\n    }\n    crypto_stream_chacha20_ietf(block0, sizeof block0, npub, k);\n    crypto_onetimeauth_poly1305_init(&state, block0);\n    sodium_memzero(block0, sizeof block0);\n\n    crypto_onetimeauth_poly1305_update(&state, ad, adlen);\n    crypto_onetimeauth_poly1305_update(&state, _pad0, (0x10 - adlen) & 0xf);\n\n    mlen = clen - crypto_aead_chacha20poly1305_ABYTES;\n    crypto_onetimeauth_poly1305_update(&state, c, mlen);\n    crypto_onetimeauth_poly1305_update(&state, _pad0, (0x10 - mlen) & 0xf);\n\n    _u64_le_from_ull(slen, adlen);\n    crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen);\n\n    _u64_le_from_ull(slen, mlen);\n    crypto_onetimeauth_poly1305_update(&state, slen, sizeof slen);\n\n    crypto_onetimeauth_poly1305_final(&state, mac);\n    sodium_memzero(&state, sizeof state);\n\n    (void) sizeof(int[sizeof mac == 16U ? 1 : -1]);\n    ret = crypto_verify_16(mac, c + mlen);\n    sodium_memzero(mac, sizeof mac);\n    if (ret != 0) {\n        memset(m, 0, mlen);\n        return -1;\n    }\n    crypto_stream_chacha20_ietf_xor_ic(m, c, mlen, npub, 1U, k);\n    if (mlen_p != NULL) {\n        *mlen_p = mlen;\n    }\n    return 0;\n}\n\nsize_t\ncrypto_aead_chacha20poly1305_keybytes(void) {\n    return crypto_aead_chacha20poly1305_KEYBYTES;\n}\n\nsize_t\ncrypto_aead_chacha20poly1305_npubbytes(void) {\n    return crypto_aead_chacha20poly1305_NPUBBYTES;\n}\n\nsize_t\ncrypto_aead_chacha20poly1305_ietf_npubbytes(void) {\n    return crypto_aead_chacha20poly1305_IETF_NPUBBYTES;\n}\n\nsize_t\ncrypto_aead_chacha20poly1305_nsecbytes(void) {\n    return crypto_aead_chacha20poly1305_NSECBYTES;\n}\n\nsize_t\ncrypto_aead_chacha20poly1305_abytes(void) {\n    return crypto_aead_chacha20poly1305_ABYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_auth/crypto_auth.c",
    "content": "\n#include \"crypto_auth.h\"\n\nsize_t\ncrypto_auth_bytes(void)\n{\n    return crypto_auth_BYTES;\n}\n\nsize_t\ncrypto_auth_keybytes(void)\n{\n    return crypto_auth_KEYBYTES;\n}\n\nconst char *\ncrypto_auth_primitive(void)\n{\n    return crypto_auth_PRIMITIVE;\n}\n\nint\ncrypto_auth(unsigned char *out, const unsigned char *in,\n            unsigned long long inlen, const unsigned char *k)\n{\n    return crypto_auth_hmacsha512256(out, in, inlen, k);\n}\n\nint\ncrypto_auth_verify(const unsigned char *h, const unsigned char *in,\n                   unsigned long long inlen,const unsigned char *k)\n{\n    return crypto_auth_hmacsha512256_verify(h, in, inlen, k);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_auth/hmacsha256/auth_hmacsha256_api.c",
    "content": "#include \"crypto_auth_hmacsha256.h\"\n\nsize_t\ncrypto_auth_hmacsha256_bytes(void) {\n    return crypto_auth_hmacsha256_BYTES;\n}\n\nsize_t\ncrypto_auth_hmacsha256_keybytes(void) {\n    return crypto_auth_hmacsha256_KEYBYTES;\n}\n\nsize_t\ncrypto_auth_hmacsha256_statebytes(void) {\n    return sizeof(crypto_auth_hmacsha256_state);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_auth/hmacsha256/cp/hmac_hmacsha256.c",
    "content": "\n/*-\n * Copyright 2005,2007,2009 Colin Percival\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n */\n\n#include \"crypto_auth_hmacsha256.h\"\n#include \"crypto_hash_sha256.h\"\n#include \"utils.h\"\n\n#include <sys/types.h>\n\n#include <stdint.h>\n#include <string.h>\n\nint\ncrypto_auth_hmacsha256_init(crypto_auth_hmacsha256_state *state,\n                            const unsigned char *key,\n                            size_t keylen)\n{\n    unsigned char pad[64];\n    unsigned char khash[32];\n    size_t        i;\n\n    if (keylen > 64) {\n        crypto_hash_sha256_init(&state->ictx);\n        crypto_hash_sha256_update(&state->ictx, key, keylen);\n        crypto_hash_sha256_final(&state->ictx, khash);\n        key = khash;\n        keylen = 32;\n    }\n    crypto_hash_sha256_init(&state->ictx);\n    memset(pad, 0x36, 64);\n    for (i = 0; i < keylen; i++) {\n        pad[i] ^= key[i];\n    }\n    crypto_hash_sha256_update(&state->ictx, pad, 64);\n\n    crypto_hash_sha256_init(&state->octx);\n    memset(pad, 0x5c, 64);\n    for (i = 0; i < keylen; i++) {\n        pad[i] ^= key[i];\n    }\n    crypto_hash_sha256_update(&state->octx, pad, 64);\n\n    sodium_memzero((void *) pad, sizeof pad);\n    sodium_memzero((void *) khash, sizeof khash);\n\n    return 0;\n}\n\nint\ncrypto_auth_hmacsha256_update(crypto_auth_hmacsha256_state *state,\n                              const unsigned char *in,\n                              unsigned long long inlen)\n{\n    crypto_hash_sha256_update(&state->ictx, in, inlen);\n\n    return 0;\n}\n\nint\ncrypto_auth_hmacsha256_final(crypto_auth_hmacsha256_state *state,\n                             unsigned char *out)\n{\n    unsigned char ihash[32];\n\n    crypto_hash_sha256_final(&state->ictx, ihash);\n    crypto_hash_sha256_update(&state->octx, ihash, 32);\n    crypto_hash_sha256_final(&state->octx, out);\n\n    sodium_memzero((void *) ihash, sizeof ihash);\n\n    return 0;\n}\n\nint\ncrypto_auth_hmacsha256(unsigned char *out, const unsigned char *in,\n                       unsigned long long inlen, const unsigned char *k)\n{\n    crypto_auth_hmacsha256_state state;\n\n    crypto_auth_hmacsha256_init(&state, k, crypto_auth_hmacsha256_KEYBYTES);\n    crypto_auth_hmacsha256_update(&state, in, inlen);\n    crypto_auth_hmacsha256_final(&state, out);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_auth/hmacsha256/cp/verify_hmacsha256.c",
    "content": "#include \"crypto_auth_hmacsha256.h\"\n#include \"crypto_verify_32.h\"\n#include \"utils.h\"\n\nint crypto_auth_hmacsha256_verify(const unsigned char *h,const unsigned char *in,unsigned long long inlen,const unsigned char *k)\n{\n  unsigned char correct[32];\n  crypto_auth_hmacsha256(correct,in,inlen,k);\n  return crypto_verify_32(h,correct) | (-(h == correct)) |\n         sodium_memcmp(correct,h,32);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_auth/hmacsha512/auth_hmacsha512_api.c",
    "content": "#include \"crypto_auth_hmacsha512.h\"\n\nsize_t\ncrypto_auth_hmacsha512_bytes(void) {\n    return crypto_auth_hmacsha512_BYTES;\n}\n\nsize_t\ncrypto_auth_hmacsha512_keybytes(void) {\n    return crypto_auth_hmacsha512_KEYBYTES;\n}\n\nsize_t\ncrypto_auth_hmacsha512_statebytes(void) {\n    return sizeof(crypto_auth_hmacsha512_state);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_auth/hmacsha512/cp/hmac_hmacsha512.c",
    "content": "\n/*-\n * Copyright 2005,2007,2009 Colin Percival\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n */\n\n#include \"crypto_auth_hmacsha512.h\"\n#include \"crypto_hash_sha512.h\"\n#include \"utils.h\"\n\n#include <sys/types.h>\n\n#include <stdint.h>\n#include <string.h>\n\nint\ncrypto_auth_hmacsha512_init(crypto_auth_hmacsha512_state *state,\n                            const unsigned char *key,\n                            size_t keylen)\n{\n    unsigned char pad[128];\n    unsigned char khash[64];\n    size_t        i;\n\n    if (keylen > 128) {\n        crypto_hash_sha512_init(&state->ictx);\n        crypto_hash_sha512_update(&state->ictx, key, keylen);\n        crypto_hash_sha512_final(&state->ictx, khash);\n        key = khash;\n        keylen = 64;\n    }\n    crypto_hash_sha512_init(&state->ictx);\n    memset(pad, 0x36, 128);\n    for (i = 0; i < keylen; i++) {\n        pad[i] ^= key[i];\n    }\n    crypto_hash_sha512_update(&state->ictx, pad, 128);\n\n    crypto_hash_sha512_init(&state->octx);\n    memset(pad, 0x5c, 128);\n    for (i = 0; i < keylen; i++) {\n        pad[i] ^= key[i];\n    }\n    crypto_hash_sha512_update(&state->octx, pad, 128);\n\n    sodium_memzero((void *) pad, sizeof pad);\n    sodium_memzero((void *) khash, sizeof khash);\n\n    return 0;\n}\n\nint\ncrypto_auth_hmacsha512_update(crypto_auth_hmacsha512_state *state,\n                              const unsigned char *in,\n                              unsigned long long inlen)\n{\n    crypto_hash_sha512_update(&state->ictx, in, inlen);\n\n    return 0;\n}\n\nint\ncrypto_auth_hmacsha512_final(crypto_auth_hmacsha512_state *state,\n                             unsigned char *out)\n{\n    unsigned char ihash[64];\n\n    crypto_hash_sha512_final(&state->ictx, ihash);\n    crypto_hash_sha512_update(&state->octx, ihash, 64);\n    crypto_hash_sha512_final(&state->octx, out);\n\n    sodium_memzero((void *) ihash, sizeof ihash);\n\n    return 0;\n}\n\nint\ncrypto_auth_hmacsha512(unsigned char *out, const unsigned char *in,\n                       unsigned long long inlen, const unsigned char *k)\n{\n    crypto_auth_hmacsha512_state state;\n\n    crypto_auth_hmacsha512_init(&state, k, crypto_auth_hmacsha512_KEYBYTES);\n    crypto_auth_hmacsha512_update(&state, in, inlen);\n    crypto_auth_hmacsha512_final(&state, out);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_auth/hmacsha512/cp/verify_hmacsha512.c",
    "content": "#include \"crypto_auth_hmacsha512.h\"\n#include \"crypto_verify_64.h\"\n#include \"utils.h\"\n\nint crypto_auth_hmacsha512_verify(const unsigned char *h, const unsigned char *in,\n                                  unsigned long long inlen, const unsigned char *k)\n{\n  unsigned char correct[64];\n  crypto_auth_hmacsha512(correct,in,inlen,k);\n  return crypto_verify_64(h,correct) | (-(h == correct)) |\n         sodium_memcmp(correct,h,64);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_auth/hmacsha512256/auth_hmacsha512256_api.c",
    "content": "#include \"crypto_auth_hmacsha512256.h\"\n\nsize_t\ncrypto_auth_hmacsha512256_bytes(void) {\n    return crypto_auth_hmacsha512256_BYTES;\n}\n\nsize_t\ncrypto_auth_hmacsha512256_keybytes(void) {\n    return crypto_auth_hmacsha512256_KEYBYTES;\n}\n\nsize_t\ncrypto_auth_hmacsha512256_statebytes(void) {\n    return sizeof(crypto_auth_hmacsha512256_state);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_auth/hmacsha512256/cp/hmac_hmacsha512256.c",
    "content": "\n#include \"crypto_auth_hmacsha512256.h\"\n#include \"crypto_auth_hmacsha512.h\"\n#include \"crypto_hash_sha512.h\"\n#include \"utils.h\"\n\n#include <sys/types.h>\n\n#include <stdint.h>\n#include <string.h>\n\nint\ncrypto_auth_hmacsha512256_init(crypto_auth_hmacsha512256_state *state,\n                               const unsigned char *key,\n                               size_t keylen)\n{\n    return crypto_auth_hmacsha512_init((crypto_auth_hmacsha512_state *) state,\n                                       key, keylen);\n}\n\nint\ncrypto_auth_hmacsha512256_update(crypto_auth_hmacsha512256_state *state,\n                                 const unsigned char *in,\n                                 unsigned long long inlen)\n{\n    return crypto_auth_hmacsha512_update((crypto_auth_hmacsha512_state *) state,\n                                         in, inlen);\n}\n\nint\ncrypto_auth_hmacsha512256_final(crypto_auth_hmacsha512256_state *state,\n                                unsigned char *out)\n{\n    unsigned char out0[64];\n\n    crypto_auth_hmacsha512_final((crypto_auth_hmacsha512_state *) state, out0);\n    memcpy(out, out0, 32);\n\n    return 0;\n}\n\nint\ncrypto_auth_hmacsha512256(unsigned char *out, const unsigned char *in,\n                          unsigned long long inlen, const unsigned char *k)\n{\n    crypto_auth_hmacsha512256_state state;\n\n    crypto_auth_hmacsha512256_init(&state, k,\n                                   crypto_auth_hmacsha512256_KEYBYTES);\n    crypto_auth_hmacsha512256_update(&state, in, inlen);\n    crypto_auth_hmacsha512256_final(&state, out);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_auth/hmacsha512256/cp/verify_hmacsha512256.c",
    "content": "#include \"crypto_auth_hmacsha512256.h\"\n#include \"crypto_verify_32.h\"\n#include \"utils.h\"\n\nint crypto_auth_hmacsha512256_verify(const unsigned char *h,\n                                     const unsigned char *in,\n                                     unsigned long long inlen,\n                                     const unsigned char *k)\n{\n  unsigned char correct[32];\n  crypto_auth_hmacsha512256(correct,in,inlen,k);\n  return crypto_verify_32(h,correct) | (-(h == correct)) |\n         sodium_memcmp(correct,h,32);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_box/crypto_box.c",
    "content": "\n#include \"crypto_box.h\"\n\nsize_t\ncrypto_box_seedbytes(void)\n{\n    return crypto_box_SEEDBYTES;\n}\n\nsize_t\ncrypto_box_publickeybytes(void)\n{\n    return crypto_box_PUBLICKEYBYTES;\n}\n\nsize_t\ncrypto_box_secretkeybytes(void)\n{\n    return crypto_box_SECRETKEYBYTES;\n}\n\nsize_t\ncrypto_box_beforenmbytes(void)\n{\n    return crypto_box_BEFORENMBYTES;\n}\n\nsize_t\ncrypto_box_noncebytes(void)\n{\n    return crypto_box_NONCEBYTES;\n}\n\nsize_t\ncrypto_box_zerobytes(void)\n{\n    return crypto_box_ZEROBYTES;\n}\n\nsize_t\ncrypto_box_boxzerobytes(void)\n{\n    return crypto_box_BOXZEROBYTES;\n}\n\nsize_t\ncrypto_box_macbytes(void)\n{\n    return crypto_box_MACBYTES;\n}\n\nconst char *\ncrypto_box_primitive(void)\n{\n    return crypto_box_PRIMITIVE;\n}\n\nint\ncrypto_box_seed_keypair(unsigned char *pk, unsigned char *sk,\n                        const unsigned char *seed)\n{\n    return crypto_box_curve25519xsalsa20poly1305_seed_keypair(pk, sk, seed);\n}\n\nint\ncrypto_box_keypair(unsigned char *pk, unsigned char *sk)\n{\n    return crypto_box_curve25519xsalsa20poly1305_keypair(pk, sk);\n}\n\nint\ncrypto_box_beforenm(unsigned char *k, const unsigned char *pk,\n                    const unsigned char *sk)\n{\n    return crypto_box_curve25519xsalsa20poly1305_beforenm(k, pk, sk);\n}\n\nint\ncrypto_box_afternm(unsigned char *c, const unsigned char *m,\n                   unsigned long long mlen, const unsigned char *n,\n                   const unsigned char *k)\n{\n    return crypto_box_curve25519xsalsa20poly1305_afternm(c, m, mlen, n, k);\n}\n\nint\ncrypto_box_open_afternm(unsigned char *m, const unsigned char *c,\n                        unsigned long long clen, const unsigned char *n,\n                        const unsigned char *k)\n{\n    return crypto_box_curve25519xsalsa20poly1305_open_afternm(m, c, clen, n, k);\n}\n\nint\ncrypto_box(unsigned char *c, const unsigned char *m,\n           unsigned long long mlen, const unsigned char *n,\n           const unsigned char *pk, const unsigned char *sk)\n{\n    return crypto_box_curve25519xsalsa20poly1305(c, m, mlen, n, pk, sk);\n}\n\nint\ncrypto_box_open(unsigned char *m, const unsigned char *c,\n                unsigned long long clen, const unsigned char *n,\n                const unsigned char *pk, const unsigned char *sk)\n{\n    return crypto_box_curve25519xsalsa20poly1305_open(m, c, clen, n, pk, sk);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_box/crypto_box_easy.c",
    "content": "\n#include <limits.h>\n#include <stdint.h>\n#include <stdlib.h>\n\n#include \"crypto_box.h\"\n#include \"crypto_secretbox.h\"\n#include \"utils.h\"\n\nint\ncrypto_box_detached_afternm(unsigned char *c, unsigned char *mac,\n                            const unsigned char *m, unsigned long long mlen,\n                            const unsigned char *n, const unsigned char *k)\n{\n    return crypto_secretbox_detached(c, mac, m, mlen, n, k);\n}\n\nint\ncrypto_box_detached(unsigned char *c, unsigned char *mac,\n                    const unsigned char *m, unsigned long long mlen,\n                    const unsigned char *n, const unsigned char *pk,\n                    const unsigned char *sk)\n{\n    unsigned char k[crypto_box_BEFORENMBYTES];\n    int           ret;\n\n    (void) sizeof(int[crypto_box_BEFORENMBYTES >=\n                      crypto_secretbox_KEYBYTES ? 1 : -1]);\n    if (crypto_box_beforenm(k, pk, sk) != 0) {\n        return -1;\n    }\n    ret = crypto_box_detached_afternm(c, mac, m, mlen, n, k);\n    sodium_memzero(k, sizeof k);\n\n    return ret;\n}\n\nint\ncrypto_box_easy_afternm(unsigned char *c, const unsigned char *m,\n                        unsigned long long mlen, const unsigned char *n,\n                        const unsigned char *k)\n{\n    if (mlen > SIZE_MAX - crypto_box_MACBYTES) {\n        return -1;\n    }\n    return crypto_box_detached_afternm(c + crypto_box_MACBYTES, c, m, mlen, n,\n                                       k);\n}\n\nint\ncrypto_box_easy(unsigned char *c, const unsigned char *m,\n                unsigned long long mlen, const unsigned char *n,\n                const unsigned char *pk, const unsigned char *sk)\n{\n    if (mlen > SIZE_MAX - crypto_box_MACBYTES) {\n        return -1;\n    }\n    return crypto_box_detached(c + crypto_box_MACBYTES, c, m, mlen, n,\n                               pk, sk);\n}\n\nint\ncrypto_box_open_detached_afternm(unsigned char *m, const unsigned char *c,\n                                 const unsigned char *mac,\n                                 unsigned long long clen, const unsigned char *n,\n                                 const unsigned char *k)\n{\n    return crypto_secretbox_open_detached(m, c, mac, clen, n, k);\n}\n\nint\ncrypto_box_open_detached(unsigned char *m, const unsigned char *c,\n                         const unsigned char *mac,\n                         unsigned long long clen, const unsigned char *n,\n                         const unsigned char *pk, const unsigned char *sk)\n{\n    unsigned char k[crypto_box_BEFORENMBYTES];\n    int           ret;\n\n    if (crypto_box_beforenm(k, pk, sk) != 0) {\n        return -1;\n    }\n    ret = crypto_box_open_detached_afternm(m, c, mac, clen, n, k);\n    sodium_memzero(k, sizeof k);\n\n    return ret;\n}\n\nint\ncrypto_box_open_easy_afternm(unsigned char *m, const unsigned char *c,\n                             unsigned long long clen, const unsigned char *n,\n                             const unsigned char *k)\n{\n    if (clen < crypto_box_MACBYTES) {\n        return -1;\n    }\n    return crypto_box_open_detached_afternm(m, c + crypto_box_MACBYTES, c,\n                                            clen - crypto_box_MACBYTES,\n                                            n, k);\n}\n\nint\ncrypto_box_open_easy(unsigned char *m, const unsigned char *c,\n                     unsigned long long clen, const unsigned char *n,\n                     const unsigned char *pk, const unsigned char *sk)\n{\n    if (clen < crypto_box_MACBYTES) {\n        return -1;\n    }\n    return crypto_box_open_detached(m, c + crypto_box_MACBYTES, c,\n                                    clen - crypto_box_MACBYTES,\n                                    n, pk, sk);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_box/crypto_box_seal.c",
    "content": "\n#include <string.h>\n\n#include \"crypto_box.h\"\n#include \"crypto_generichash.h\"\n#include \"utils.h\"\n\nstatic int\n_crypto_box_seal_nonce(unsigned char *nonce,\n                       const unsigned char *pk1, const unsigned char *pk2)\n{\n    crypto_generichash_state st;\n\n    crypto_generichash_init(&st, NULL, 0U, crypto_box_NONCEBYTES);\n    crypto_generichash_update(&st, pk1, crypto_box_PUBLICKEYBYTES);\n    crypto_generichash_update(&st, pk2, crypto_box_PUBLICKEYBYTES);\n    crypto_generichash_final(&st, nonce, crypto_box_NONCEBYTES);\n\n    return 0;\n}\n\nint\ncrypto_box_seal(unsigned char *c, const unsigned char *m,\n                unsigned long long mlen, const unsigned char *pk)\n{\n    unsigned char nonce[crypto_box_NONCEBYTES];\n    unsigned char epk[crypto_box_PUBLICKEYBYTES];\n    unsigned char esk[crypto_box_SECRETKEYBYTES];\n    int           ret;\n\n    if (crypto_box_keypair(epk, esk) != 0) {\n        return -1; /* LCOV_EXCL_LINE */\n    }\n    memcpy(c, epk, crypto_box_PUBLICKEYBYTES);\n    _crypto_box_seal_nonce(nonce, epk, pk);\n    ret = crypto_box_easy(c + crypto_box_PUBLICKEYBYTES, m, mlen,\n                          nonce, pk, esk);\n    sodium_memzero(nonce, sizeof nonce);\n    sodium_memzero(epk, sizeof epk);\n    sodium_memzero(esk, sizeof esk);\n\n    return ret;\n}\n\nint\ncrypto_box_seal_open(unsigned char *m, const unsigned char *c,\n                     unsigned long long clen,\n                     const unsigned char *pk, const unsigned char *sk)\n{\n    unsigned char nonce[crypto_box_NONCEBYTES];\n\n    if (clen < crypto_box_SEALBYTES) {\n        return -1;\n    }\n    _crypto_box_seal_nonce(nonce, c, pk);\n\n    (void) sizeof(int[crypto_box_PUBLICKEYBYTES < crypto_box_SEALBYTES ? 1 : -1]);\n    return crypto_box_open_easy(m, c + crypto_box_PUBLICKEYBYTES,\n                                clen - crypto_box_PUBLICKEYBYTES,\n                                nonce, c, sk);\n}\n\nsize_t\ncrypto_box_sealbytes(void)\n{\n    return crypto_box_SEALBYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_box/curve25519xsalsa20poly1305/box_curve25519xsalsa20poly1305_api.c",
    "content": "#include \"crypto_box_curve25519xsalsa20poly1305.h\"\n\nsize_t\ncrypto_box_curve25519xsalsa20poly1305_seedbytes(void) {\n    return crypto_box_curve25519xsalsa20poly1305_SEEDBYTES;\n}\n\nsize_t\ncrypto_box_curve25519xsalsa20poly1305_publickeybytes(void) {\n    return crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES;\n}\n\nsize_t\ncrypto_box_curve25519xsalsa20poly1305_secretkeybytes(void) {\n    return crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES;\n}\n\nsize_t\ncrypto_box_curve25519xsalsa20poly1305_beforenmbytes(void) {\n    return crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES;\n}\n\nsize_t\ncrypto_box_curve25519xsalsa20poly1305_noncebytes(void) {\n    return crypto_box_curve25519xsalsa20poly1305_NONCEBYTES;\n}\n\nsize_t\ncrypto_box_curve25519xsalsa20poly1305_zerobytes(void) {\n    return crypto_box_curve25519xsalsa20poly1305_ZEROBYTES;\n}\n\nsize_t\ncrypto_box_curve25519xsalsa20poly1305_boxzerobytes(void) {\n    return crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES;\n}\n\nsize_t\ncrypto_box_curve25519xsalsa20poly1305_macbytes(void) {\n    return crypto_box_curve25519xsalsa20poly1305_MACBYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_box/curve25519xsalsa20poly1305/ref/after_curve25519xsalsa20poly1305.c",
    "content": "#include \"crypto_box_curve25519xsalsa20poly1305.h\"\n#include \"crypto_secretbox_xsalsa20poly1305.h\"\n\nint crypto_box_curve25519xsalsa20poly1305_afternm(\n  unsigned char *c,\n  const unsigned char *m,unsigned long long mlen,\n  const unsigned char *n,\n  const unsigned char *k\n)\n{\n  return crypto_secretbox_xsalsa20poly1305(c,m,mlen,n,k);\n}\n\nint crypto_box_curve25519xsalsa20poly1305_open_afternm(\n  unsigned char *m,\n  const unsigned char *c,unsigned long long clen,\n  const unsigned char *n,\n  const unsigned char *k\n)\n{\n  return crypto_secretbox_xsalsa20poly1305_open(m,c,clen,n,k);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_box/curve25519xsalsa20poly1305/ref/before_curve25519xsalsa20poly1305.c",
    "content": "#include \"crypto_box_curve25519xsalsa20poly1305.h\"\n#include \"crypto_core_hsalsa20.h\"\n#include \"crypto_scalarmult_curve25519.h\"\n\nstatic const unsigned char sigma[16] = {\n    'e', 'x', 'p', 'a', 'n', 'd', ' ', '3', '2', '-', 'b', 'y', 't', 'e', ' ', 'k'\n};\nstatic const unsigned char n[16] = {0};\n\nint crypto_box_curve25519xsalsa20poly1305_beforenm(\n  unsigned char *k,\n  const unsigned char *pk,\n  const unsigned char *sk\n)\n{\n  unsigned char s[32];\n  if (crypto_scalarmult_curve25519(s,sk,pk) != 0) {\n      return -1;\n  }\n  return crypto_core_hsalsa20(k,n,s,sigma);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_box/curve25519xsalsa20poly1305/ref/box_curve25519xsalsa20poly1305.c",
    "content": "#include \"crypto_box_curve25519xsalsa20poly1305.h\"\n#include \"utils.h\"\n\nint crypto_box_curve25519xsalsa20poly1305(\n  unsigned char *c,\n  const unsigned char *m,unsigned long long mlen,\n  const unsigned char *n,\n  const unsigned char *pk,\n  const unsigned char *sk\n)\n{\n  unsigned char k[crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES];\n  int           ret;\n\n  if (crypto_box_curve25519xsalsa20poly1305_beforenm(k,pk,sk) != 0) {\n      return -1;\n  }\n  ret = crypto_box_curve25519xsalsa20poly1305_afternm(c,m,mlen,n,k);\n  sodium_memzero(k, sizeof k);\n\n  return ret;\n}\n\nint crypto_box_curve25519xsalsa20poly1305_open(\n  unsigned char *m,\n  const unsigned char *c,unsigned long long clen,\n  const unsigned char *n,\n  const unsigned char *pk,\n  const unsigned char *sk\n)\n{\n  unsigned char k[crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES];\n  int           ret;\n\n  if (crypto_box_curve25519xsalsa20poly1305_beforenm(k,pk,sk) != 0) {\n      return -1;\n  }\n  ret = crypto_box_curve25519xsalsa20poly1305_open_afternm(m,c,clen,n,k);\n  sodium_memzero(k, sizeof k);\n\n  return ret;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_box/curve25519xsalsa20poly1305/ref/keypair_curve25519xsalsa20poly1305.c",
    "content": "#include <string.h>\n\n#include \"crypto_box_curve25519xsalsa20poly1305.h\"\n#include \"crypto_hash_sha512.h\"\n#include \"crypto_scalarmult_curve25519.h\"\n#include \"randombytes.h\"\n#include \"utils.h\"\n\nint crypto_box_curve25519xsalsa20poly1305_seed_keypair(\n  unsigned char *pk,\n  unsigned char *sk,\n  const unsigned char *seed\n)\n{\n  unsigned char hash[64];\n  crypto_hash_sha512(hash,seed,32);\n  memmove(sk,hash,32);\n  sodium_memzero(hash, sizeof hash);\n  return crypto_scalarmult_curve25519_base(pk,sk);\n}\n\nint crypto_box_curve25519xsalsa20poly1305_keypair(\n  unsigned char *pk,\n  unsigned char *sk\n)\n{\n  randombytes_buf(sk,32);\n  return crypto_scalarmult_curve25519_base(pk,sk);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_core/hsalsa20/core_hsalsa20_api.c",
    "content": "#include \"crypto_core_hsalsa20.h\"\n\nsize_t\ncrypto_core_hsalsa20_outputbytes(void) {\n    return crypto_core_hsalsa20_OUTPUTBYTES;\n}\n\nsize_t\ncrypto_core_hsalsa20_inputbytes(void) {\n    return crypto_core_hsalsa20_INPUTBYTES;\n}\n\nsize_t\ncrypto_core_hsalsa20_keybytes(void) {\n    return crypto_core_hsalsa20_KEYBYTES;\n}\n\nsize_t\ncrypto_core_hsalsa20_constbytes(void) {\n    return crypto_core_hsalsa20_CONSTBYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_core/hsalsa20/ref2/core_hsalsa20.c",
    "content": "/*\nversion 20080912\nD. J. Bernstein\nPublic domain.\n*/\n\n#include \"crypto_core_hsalsa20.h\"\n\n#define ROUNDS 20\n\ntypedef unsigned int uint32;\n\nstatic uint32 rotate(uint32 u,int c)\n{\n  return (u << c) | (u >> (32 - c));\n}\n\nstatic uint32 load_littleendian(const unsigned char *x)\n{\n  return\n      (uint32) (x[0]) \\\n  | (((uint32) (x[1])) << 8) \\\n  | (((uint32) (x[2])) << 16) \\\n  | (((uint32) (x[3])) << 24)\n  ;\n}\n\nstatic void store_littleendian(unsigned char *x,uint32 u)\n{\n  x[0] = u; u >>= 8;\n  x[1] = u; u >>= 8;\n  x[2] = u; u >>= 8;\n  x[3] = u;\n}\n\nint crypto_core_hsalsa20(\n        unsigned char *out,\n  const unsigned char *in,\n  const unsigned char *k,\n  const unsigned char *c\n)\n{\n  uint32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15;\n  int i;\n\n  x0 = load_littleendian(c + 0);\n  x1 = load_littleendian(k + 0);\n  x2 = load_littleendian(k + 4);\n  x3 = load_littleendian(k + 8);\n  x4 = load_littleendian(k + 12);\n  x5 = load_littleendian(c + 4);\n  x6 = load_littleendian(in + 0);\n  x7 = load_littleendian(in + 4);\n  x8 = load_littleendian(in + 8);\n  x9 = load_littleendian(in + 12);\n  x10 = load_littleendian(c + 8);\n  x11 = load_littleendian(k + 16);\n  x12 = load_littleendian(k + 20);\n  x13 = load_littleendian(k + 24);\n  x14 = load_littleendian(k + 28);\n  x15 = load_littleendian(c + 12);\n\n  for (i = ROUNDS;i > 0;i -= 2) {\n     x4 ^= rotate( x0+x12, 7);\n     x8 ^= rotate( x4+ x0, 9);\n    x12 ^= rotate( x8+ x4,13);\n     x0 ^= rotate(x12+ x8,18);\n     x9 ^= rotate( x5+ x1, 7);\n    x13 ^= rotate( x9+ x5, 9);\n     x1 ^= rotate(x13+ x9,13);\n     x5 ^= rotate( x1+x13,18);\n    x14 ^= rotate(x10+ x6, 7);\n     x2 ^= rotate(x14+x10, 9);\n     x6 ^= rotate( x2+x14,13);\n    x10 ^= rotate( x6+ x2,18);\n     x3 ^= rotate(x15+x11, 7);\n     x7 ^= rotate( x3+x15, 9);\n    x11 ^= rotate( x7+ x3,13);\n    x15 ^= rotate(x11+ x7,18);\n     x1 ^= rotate( x0+ x3, 7);\n     x2 ^= rotate( x1+ x0, 9);\n     x3 ^= rotate( x2+ x1,13);\n     x0 ^= rotate( x3+ x2,18);\n     x6 ^= rotate( x5+ x4, 7);\n     x7 ^= rotate( x6+ x5, 9);\n     x4 ^= rotate( x7+ x6,13);\n     x5 ^= rotate( x4+ x7,18);\n    x11 ^= rotate(x10+ x9, 7);\n     x8 ^= rotate(x11+x10, 9);\n     x9 ^= rotate( x8+x11,13);\n    x10 ^= rotate( x9+ x8,18);\n    x12 ^= rotate(x15+x14, 7);\n    x13 ^= rotate(x12+x15, 9);\n    x14 ^= rotate(x13+x12,13);\n    x15 ^= rotate(x14+x13,18);\n  }\n\n  store_littleendian(out + 0,x0);\n  store_littleendian(out + 4,x5);\n  store_littleendian(out + 8,x10);\n  store_littleendian(out + 12,x15);\n  store_littleendian(out + 16,x6);\n  store_littleendian(out + 20,x7);\n  store_littleendian(out + 24,x8);\n  store_littleendian(out + 28,x9);\n\n  return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_core/salsa20/core_salsa20_api.c",
    "content": "#include \"crypto_core_salsa20.h\"\n\nsize_t\ncrypto_core_salsa20_outputbytes(void) {\n    return crypto_core_salsa20_OUTPUTBYTES;\n}\n\nsize_t\ncrypto_core_salsa20_inputbytes(void) {\n    return crypto_core_salsa20_INPUTBYTES;\n}\n\nsize_t\ncrypto_core_salsa20_keybytes(void) {\n    return crypto_core_salsa20_KEYBYTES;\n}\n\nsize_t\ncrypto_core_salsa20_constbytes(void) {\n    return crypto_core_salsa20_CONSTBYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_core/salsa20/ref/core_salsa20.c",
    "content": "/*\nversion 20080912\nD. J. Bernstein\nPublic domain.\n*/\n\n#include \"crypto_core_salsa20.h\"\n\n#define ROUNDS 20\n\ntypedef unsigned int uint32;\n\nstatic uint32 rotate(uint32 u,int c)\n{\n  return (u << c) | (u >> (32 - c));\n}\n\nstatic uint32 load_littleendian(const unsigned char *x)\n{\n  return\n      (uint32) (x[0]) \\\n  | (((uint32) (x[1])) << 8) \\\n  | (((uint32) (x[2])) << 16) \\\n  | (((uint32) (x[3])) << 24)\n  ;\n}\n\nstatic void store_littleendian(unsigned char *x,uint32 u)\n{\n  x[0] = u; u >>= 8;\n  x[1] = u; u >>= 8;\n  x[2] = u; u >>= 8;\n  x[3] = u;\n}\n\nint crypto_core_salsa20(\n        unsigned char *out,\n  const unsigned char *in,\n  const unsigned char *k,\n  const unsigned char *c\n)\n{\n  uint32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15;\n  uint32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;\n  int i;\n\n  j0 = x0 = load_littleendian(c + 0);\n  j1 = x1 = load_littleendian(k + 0);\n  j2 = x2 = load_littleendian(k + 4);\n  j3 = x3 = load_littleendian(k + 8);\n  j4 = x4 = load_littleendian(k + 12);\n  j5 = x5 = load_littleendian(c + 4);\n  j6 = x6 = load_littleendian(in + 0);\n  j7 = x7 = load_littleendian(in + 4);\n  j8 = x8 = load_littleendian(in + 8);\n  j9 = x9 = load_littleendian(in + 12);\n  j10 = x10 = load_littleendian(c + 8);\n  j11 = x11 = load_littleendian(k + 16);\n  j12 = x12 = load_littleendian(k + 20);\n  j13 = x13 = load_littleendian(k + 24);\n  j14 = x14 = load_littleendian(k + 28);\n  j15 = x15 = load_littleendian(c + 12);\n\n  for (i = ROUNDS;i > 0;i -= 2) {\n     x4 ^= rotate( x0+x12, 7);\n     x8 ^= rotate( x4+ x0, 9);\n    x12 ^= rotate( x8+ x4,13);\n     x0 ^= rotate(x12+ x8,18);\n     x9 ^= rotate( x5+ x1, 7);\n    x13 ^= rotate( x9+ x5, 9);\n     x1 ^= rotate(x13+ x9,13);\n     x5 ^= rotate( x1+x13,18);\n    x14 ^= rotate(x10+ x6, 7);\n     x2 ^= rotate(x14+x10, 9);\n     x6 ^= rotate( x2+x14,13);\n    x10 ^= rotate( x6+ x2,18);\n     x3 ^= rotate(x15+x11, 7);\n     x7 ^= rotate( x3+x15, 9);\n    x11 ^= rotate( x7+ x3,13);\n    x15 ^= rotate(x11+ x7,18);\n     x1 ^= rotate( x0+ x3, 7);\n     x2 ^= rotate( x1+ x0, 9);\n     x3 ^= rotate( x2+ x1,13);\n     x0 ^= rotate( x3+ x2,18);\n     x6 ^= rotate( x5+ x4, 7);\n     x7 ^= rotate( x6+ x5, 9);\n     x4 ^= rotate( x7+ x6,13);\n     x5 ^= rotate( x4+ x7,18);\n    x11 ^= rotate(x10+ x9, 7);\n     x8 ^= rotate(x11+x10, 9);\n     x9 ^= rotate( x8+x11,13);\n    x10 ^= rotate( x9+ x8,18);\n    x12 ^= rotate(x15+x14, 7);\n    x13 ^= rotate(x12+x15, 9);\n    x14 ^= rotate(x13+x12,13);\n    x15 ^= rotate(x14+x13,18);\n  }\n\n  x0 += j0;\n  x1 += j1;\n  x2 += j2;\n  x3 += j3;\n  x4 += j4;\n  x5 += j5;\n  x6 += j6;\n  x7 += j7;\n  x8 += j8;\n  x9 += j9;\n  x10 += j10;\n  x11 += j11;\n  x12 += j12;\n  x13 += j13;\n  x14 += j14;\n  x15 += j15;\n\n  store_littleendian(out + 0,x0);\n  store_littleendian(out + 4,x1);\n  store_littleendian(out + 8,x2);\n  store_littleendian(out + 12,x3);\n  store_littleendian(out + 16,x4);\n  store_littleendian(out + 20,x5);\n  store_littleendian(out + 24,x6);\n  store_littleendian(out + 28,x7);\n  store_littleendian(out + 32,x8);\n  store_littleendian(out + 36,x9);\n  store_littleendian(out + 40,x10);\n  store_littleendian(out + 44,x11);\n  store_littleendian(out + 48,x12);\n  store_littleendian(out + 52,x13);\n  store_littleendian(out + 56,x14);\n  store_littleendian(out + 60,x15);\n\n  return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_core/salsa2012/core_salsa2012_api.c",
    "content": "#include \"crypto_core_salsa2012.h\"\n\nsize_t\ncrypto_core_salsa2012_outputbytes(void) {\n    return crypto_core_salsa2012_OUTPUTBYTES;\n}\n\nsize_t\ncrypto_core_salsa2012_inputbytes(void) {\n    return crypto_core_salsa2012_INPUTBYTES;\n}\n\nsize_t\ncrypto_core_salsa2012_keybytes(void) {\n    return crypto_core_salsa2012_KEYBYTES;\n}\n\nsize_t\ncrypto_core_salsa2012_constbytes(void) {\n    return crypto_core_salsa2012_CONSTBYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_core/salsa2012/ref/core_salsa2012.c",
    "content": "/*\nversion 20080913\nD. J. Bernstein\nPublic domain.\n*/\n\n#include \"crypto_core_salsa2012.h\"\n\n#define ROUNDS 12\n\ntypedef unsigned int uint32;\n\nstatic uint32 rotate(uint32 u,int c)\n{\n  return (u << c) | (u >> (32 - c));\n}\n\nstatic uint32 load_littleendian(const unsigned char *x)\n{\n  return\n      (uint32) (x[0]) \\\n  | (((uint32) (x[1])) << 8) \\\n  | (((uint32) (x[2])) << 16) \\\n  | (((uint32) (x[3])) << 24)\n  ;\n}\n\nstatic void store_littleendian(unsigned char *x,uint32 u)\n{\n  x[0] = u; u >>= 8;\n  x[1] = u; u >>= 8;\n  x[2] = u; u >>= 8;\n  x[3] = u;\n}\n\nint crypto_core_salsa2012(\n        unsigned char *out,\n  const unsigned char *in,\n  const unsigned char *k,\n  const unsigned char *c\n)\n{\n  uint32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15;\n  uint32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;\n  int i;\n\n  j0 = x0 = load_littleendian(c + 0);\n  j1 = x1 = load_littleendian(k + 0);\n  j2 = x2 = load_littleendian(k + 4);\n  j3 = x3 = load_littleendian(k + 8);\n  j4 = x4 = load_littleendian(k + 12);\n  j5 = x5 = load_littleendian(c + 4);\n  j6 = x6 = load_littleendian(in + 0);\n  j7 = x7 = load_littleendian(in + 4);\n  j8 = x8 = load_littleendian(in + 8);\n  j9 = x9 = load_littleendian(in + 12);\n  j10 = x10 = load_littleendian(c + 8);\n  j11 = x11 = load_littleendian(k + 16);\n  j12 = x12 = load_littleendian(k + 20);\n  j13 = x13 = load_littleendian(k + 24);\n  j14 = x14 = load_littleendian(k + 28);\n  j15 = x15 = load_littleendian(c + 12);\n\n  for (i = ROUNDS;i > 0;i -= 2) {\n     x4 ^= rotate( x0+x12, 7);\n     x8 ^= rotate( x4+ x0, 9);\n    x12 ^= rotate( x8+ x4,13);\n     x0 ^= rotate(x12+ x8,18);\n     x9 ^= rotate( x5+ x1, 7);\n    x13 ^= rotate( x9+ x5, 9);\n     x1 ^= rotate(x13+ x9,13);\n     x5 ^= rotate( x1+x13,18);\n    x14 ^= rotate(x10+ x6, 7);\n     x2 ^= rotate(x14+x10, 9);\n     x6 ^= rotate( x2+x14,13);\n    x10 ^= rotate( x6+ x2,18);\n     x3 ^= rotate(x15+x11, 7);\n     x7 ^= rotate( x3+x15, 9);\n    x11 ^= rotate( x7+ x3,13);\n    x15 ^= rotate(x11+ x7,18);\n     x1 ^= rotate( x0+ x3, 7);\n     x2 ^= rotate( x1+ x0, 9);\n     x3 ^= rotate( x2+ x1,13);\n     x0 ^= rotate( x3+ x2,18);\n     x6 ^= rotate( x5+ x4, 7);\n     x7 ^= rotate( x6+ x5, 9);\n     x4 ^= rotate( x7+ x6,13);\n     x5 ^= rotate( x4+ x7,18);\n    x11 ^= rotate(x10+ x9, 7);\n     x8 ^= rotate(x11+x10, 9);\n     x9 ^= rotate( x8+x11,13);\n    x10 ^= rotate( x9+ x8,18);\n    x12 ^= rotate(x15+x14, 7);\n    x13 ^= rotate(x12+x15, 9);\n    x14 ^= rotate(x13+x12,13);\n    x15 ^= rotate(x14+x13,18);\n  }\n\n  x0 += j0;\n  x1 += j1;\n  x2 += j2;\n  x3 += j3;\n  x4 += j4;\n  x5 += j5;\n  x6 += j6;\n  x7 += j7;\n  x8 += j8;\n  x9 += j9;\n  x10 += j10;\n  x11 += j11;\n  x12 += j12;\n  x13 += j13;\n  x14 += j14;\n  x15 += j15;\n\n  store_littleendian(out + 0,x0);\n  store_littleendian(out + 4,x1);\n  store_littleendian(out + 8,x2);\n  store_littleendian(out + 12,x3);\n  store_littleendian(out + 16,x4);\n  store_littleendian(out + 20,x5);\n  store_littleendian(out + 24,x6);\n  store_littleendian(out + 28,x7);\n  store_littleendian(out + 32,x8);\n  store_littleendian(out + 36,x9);\n  store_littleendian(out + 40,x10);\n  store_littleendian(out + 44,x11);\n  store_littleendian(out + 48,x12);\n  store_littleendian(out + 52,x13);\n  store_littleendian(out + 56,x14);\n  store_littleendian(out + 60,x15);\n\n  return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_core/salsa208/core_salsa208_api.c",
    "content": "#include \"crypto_core_salsa208.h\"\n\nsize_t\ncrypto_core_salsa208_outputbytes(void) {\n    return crypto_core_salsa208_OUTPUTBYTES;\n}\n\nsize_t\ncrypto_core_salsa208_inputbytes(void) {\n    return crypto_core_salsa208_INPUTBYTES;\n}\n\nsize_t\ncrypto_core_salsa208_keybytes(void) {\n    return crypto_core_salsa208_KEYBYTES;\n}\n\nsize_t\ncrypto_core_salsa208_constbytes(void) {\n    return crypto_core_salsa208_CONSTBYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_core/salsa208/ref/core_salsa208.c",
    "content": "/*\nversion 20080913\nD. J. Bernstein\nPublic domain.\n*/\n\n#include \"crypto_core_salsa208.h\"\n\n#define ROUNDS 8\n\ntypedef unsigned int uint32;\n\nstatic uint32 rotate(uint32 u,int c)\n{\n  return (u << c) | (u >> (32 - c));\n}\n\nstatic uint32 load_littleendian(const unsigned char *x)\n{\n  return\n      (uint32) (x[0]) \\\n  | (((uint32) (x[1])) << 8) \\\n  | (((uint32) (x[2])) << 16) \\\n  | (((uint32) (x[3])) << 24)\n  ;\n}\n\nstatic void store_littleendian(unsigned char *x,uint32 u)\n{\n  x[0] = u; u >>= 8;\n  x[1] = u; u >>= 8;\n  x[2] = u; u >>= 8;\n  x[3] = u;\n}\n\nint crypto_core_salsa208(\n        unsigned char *out,\n  const unsigned char *in,\n  const unsigned char *k,\n  const unsigned char *c\n)\n{\n  uint32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15;\n  uint32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;\n  int i;\n\n  j0 = x0 = load_littleendian(c + 0);\n  j1 = x1 = load_littleendian(k + 0);\n  j2 = x2 = load_littleendian(k + 4);\n  j3 = x3 = load_littleendian(k + 8);\n  j4 = x4 = load_littleendian(k + 12);\n  j5 = x5 = load_littleendian(c + 4);\n  j6 = x6 = load_littleendian(in + 0);\n  j7 = x7 = load_littleendian(in + 4);\n  j8 = x8 = load_littleendian(in + 8);\n  j9 = x9 = load_littleendian(in + 12);\n  j10 = x10 = load_littleendian(c + 8);\n  j11 = x11 = load_littleendian(k + 16);\n  j12 = x12 = load_littleendian(k + 20);\n  j13 = x13 = load_littleendian(k + 24);\n  j14 = x14 = load_littleendian(k + 28);\n  j15 = x15 = load_littleendian(c + 12);\n\n  for (i = ROUNDS;i > 0;i -= 2) {\n     x4 ^= rotate( x0+x12, 7);\n     x8 ^= rotate( x4+ x0, 9);\n    x12 ^= rotate( x8+ x4,13);\n     x0 ^= rotate(x12+ x8,18);\n     x9 ^= rotate( x5+ x1, 7);\n    x13 ^= rotate( x9+ x5, 9);\n     x1 ^= rotate(x13+ x9,13);\n     x5 ^= rotate( x1+x13,18);\n    x14 ^= rotate(x10+ x6, 7);\n     x2 ^= rotate(x14+x10, 9);\n     x6 ^= rotate( x2+x14,13);\n    x10 ^= rotate( x6+ x2,18);\n     x3 ^= rotate(x15+x11, 7);\n     x7 ^= rotate( x3+x15, 9);\n    x11 ^= rotate( x7+ x3,13);\n    x15 ^= rotate(x11+ x7,18);\n     x1 ^= rotate( x0+ x3, 7);\n     x2 ^= rotate( x1+ x0, 9);\n     x3 ^= rotate( x2+ x1,13);\n     x0 ^= rotate( x3+ x2,18);\n     x6 ^= rotate( x5+ x4, 7);\n     x7 ^= rotate( x6+ x5, 9);\n     x4 ^= rotate( x7+ x6,13);\n     x5 ^= rotate( x4+ x7,18);\n    x11 ^= rotate(x10+ x9, 7);\n     x8 ^= rotate(x11+x10, 9);\n     x9 ^= rotate( x8+x11,13);\n    x10 ^= rotate( x9+ x8,18);\n    x12 ^= rotate(x15+x14, 7);\n    x13 ^= rotate(x12+x15, 9);\n    x14 ^= rotate(x13+x12,13);\n    x15 ^= rotate(x14+x13,18);\n  }\n\n  x0 += j0;\n  x1 += j1;\n  x2 += j2;\n  x3 += j3;\n  x4 += j4;\n  x5 += j5;\n  x6 += j6;\n  x7 += j7;\n  x8 += j8;\n  x9 += j9;\n  x10 += j10;\n  x11 += j11;\n  x12 += j12;\n  x13 += j13;\n  x14 += j14;\n  x15 += j15;\n\n  store_littleendian(out + 0,x0);\n  store_littleendian(out + 4,x1);\n  store_littleendian(out + 8,x2);\n  store_littleendian(out + 12,x3);\n  store_littleendian(out + 16,x4);\n  store_littleendian(out + 20,x5);\n  store_littleendian(out + 24,x6);\n  store_littleendian(out + 28,x7);\n  store_littleendian(out + 32,x8);\n  store_littleendian(out + 36,x9);\n  store_littleendian(out + 40,x10);\n  store_littleendian(out + 44,x11);\n  store_littleendian(out + 48,x12);\n  store_littleendian(out + 52,x13);\n  store_littleendian(out + 56,x14);\n  store_littleendian(out + 60,x15);\n\n  return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_generichash/blake2/generichash_blake2_api.c",
    "content": "#include \"crypto_generichash_blake2b.h\"\n\nsize_t\ncrypto_generichash_blake2b_bytes_min(void) {\n    return crypto_generichash_blake2b_BYTES_MIN;\n}\n\nsize_t\ncrypto_generichash_blake2b_bytes_max(void) {\n    return crypto_generichash_blake2b_BYTES_MAX;\n}\n\nsize_t\ncrypto_generichash_blake2b_bytes(void) {\n    return crypto_generichash_blake2b_BYTES;\n}\n\nsize_t\ncrypto_generichash_blake2b_keybytes_min(void) {\n    return crypto_generichash_blake2b_KEYBYTES_MIN;\n}\n\nsize_t\ncrypto_generichash_blake2b_keybytes_max(void) {\n    return crypto_generichash_blake2b_KEYBYTES_MAX;\n}\n\nsize_t\ncrypto_generichash_blake2b_keybytes(void) {\n    return crypto_generichash_blake2b_KEYBYTES;\n}\n\nsize_t\ncrypto_generichash_blake2b_saltbytes(void) {\n    return crypto_generichash_blake2b_SALTBYTES;\n}\n\nsize_t\ncrypto_generichash_blake2b_personalbytes(void) {\n    return crypto_generichash_blake2b_PERSONALBYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_generichash/blake2/ref/blake2-impl.h",
    "content": "/*\n   BLAKE2 reference source code package - reference C implementations\n\n   Written in 2012 by Samuel Neves <sneves@dei.uc.pt>\n\n   To the extent possible under law, the author(s) have dedicated all copyright\n   and related and neighboring rights to this software to the public domain\n   worldwide. This software is distributed without any warranty.\n\n   You should have received a copy of the CC0 Public Domain Dedication along with\n   this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.\n*/\n\n#ifndef blake2_impl_H\n#define blake2_impl_H\n\n#include <stdint.h>\n#include <string.h>\n\n#include \"utils.h\"\n\nstatic inline uint32_t load32( const void *src )\n{\n#ifdef NATIVE_LITTLE_ENDIAN\n  uint32_t w;\n  memcpy(&w, src, sizeof w);\n  return w;\n#else\n  const uint8_t *p = ( const uint8_t * )src;\n  uint32_t w = *p++;\n  w |= ( uint32_t )( *p++ ) <<  8;\n  w |= ( uint32_t )( *p++ ) << 16;\n  w |= ( uint32_t )( *p++ ) << 24;\n  return w;\n#endif\n}\n\nstatic inline uint64_t load64( const void *src )\n{\n#ifdef NATIVE_LITTLE_ENDIAN\n  uint64_t w;\n  memcpy(&w, src, sizeof w);\n  return w;\n#else\n  const uint8_t *p = ( const uint8_t * )src;\n  uint64_t w = *p++;\n  w |= ( uint64_t )( *p++ ) <<  8;\n  w |= ( uint64_t )( *p++ ) << 16;\n  w |= ( uint64_t )( *p++ ) << 24;\n  w |= ( uint64_t )( *p++ ) << 32;\n  w |= ( uint64_t )( *p++ ) << 40;\n  w |= ( uint64_t )( *p++ ) << 48;\n  w |= ( uint64_t )( *p++ ) << 56;\n  return w;\n#endif\n}\n\nstatic inline void store32( void *dst, uint32_t w )\n{\n#ifdef NATIVE_LITTLE_ENDIAN\n  memcpy(dst, &w, sizeof w);\n#else\n  uint8_t *p = ( uint8_t * )dst;\n  *p++ = ( uint8_t )w; w >>= 8;\n  *p++ = ( uint8_t )w; w >>= 8;\n  *p++ = ( uint8_t )w; w >>= 8;\n  *p++ = ( uint8_t )w;\n#endif\n}\n\nstatic inline void store64( void *dst, uint64_t w )\n{\n#ifdef NATIVE_LITTLE_ENDIAN\n  memcpy(dst, &w, sizeof w);\n#else\n  uint8_t *p = ( uint8_t * )dst;\n  *p++ = ( uint8_t )w; w >>= 8;\n  *p++ = ( uint8_t )w; w >>= 8;\n  *p++ = ( uint8_t )w; w >>= 8;\n  *p++ = ( uint8_t )w; w >>= 8;\n  *p++ = ( uint8_t )w; w >>= 8;\n  *p++ = ( uint8_t )w; w >>= 8;\n  *p++ = ( uint8_t )w; w >>= 8;\n  *p++ = ( uint8_t )w;\n#endif\n}\n\nstatic inline uint64_t load48( const void *src )\n{\n  const uint8_t *p = ( const uint8_t * )src;\n  uint64_t w = *p++;\n  w |= ( uint64_t )( *p++ ) <<  8;\n  w |= ( uint64_t )( *p++ ) << 16;\n  w |= ( uint64_t )( *p++ ) << 24;\n  w |= ( uint64_t )( *p++ ) << 32;\n  w |= ( uint64_t )( *p++ ) << 40;\n  return w;\n}\n\nstatic inline void store48( void *dst, uint64_t w )\n{\n  uint8_t *p = ( uint8_t * )dst;\n  *p++ = ( uint8_t )w; w >>= 8;\n  *p++ = ( uint8_t )w; w >>= 8;\n  *p++ = ( uint8_t )w; w >>= 8;\n  *p++ = ( uint8_t )w; w >>= 8;\n  *p++ = ( uint8_t )w; w >>= 8;\n  *p++ = ( uint8_t )w;\n}\n\nstatic inline uint32_t rotl32( const uint32_t w, const unsigned c )\n{\n  return ( w << c ) | ( w >> ( 32 - c ) );\n}\n\nstatic inline uint64_t rotl64( const uint64_t w, const unsigned c )\n{\n  return ( w << c ) | ( w >> ( 64 - c ) );\n}\n\nstatic inline uint32_t rotr32( const uint32_t w, const unsigned c )\n{\n  return ( w >> c ) | ( w << ( 32 - c ) );\n}\n\nstatic inline uint64_t rotr64( const uint64_t w, const unsigned c )\n{\n  return ( w >> c ) | ( w << ( 64 - c ) );\n}\n\n/* prevents compiler optimizing out memset() */\nstatic inline void secure_zero_memory( void *v, size_t n )\n{\n  sodium_memzero(v, n);\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_generichash/blake2/ref/blake2.h",
    "content": "/*\n   BLAKE2 reference source code package - reference C implementations\n\n   Written in 2012 by Samuel Neves <sneves@dei.uc.pt>\n\n   To the extent possible under law, the author(s) have dedicated all copyright\n   and related and neighboring rights to this software to the public domain\n   worldwide. This software is distributed without any warranty.\n\n   You should have received a copy of the CC0 Public Domain Dedication along with\n   this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.\n*/\n\n#ifndef blake2_H\n#define blake2_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"crypto_generichash_blake2b.h\"\n#include \"export.h\"\n\n#define blake2b_init_param               crypto_generichash_blake2b__init_param\n#define blake2b_init                     crypto_generichash_blake2b__init\n#define blake2b_init_salt_personal       crypto_generichash_blake2b__init_salt_personal\n#define blake2b_init_key                 crypto_generichash_blake2b__init_key\n#define blake2b_init_key_salt_personal   crypto_generichash_blake2b__init_key_salt_personal\n#define blake2b_update                   crypto_generichash_blake2b__update\n#define blake2b_final                    crypto_generichash_blake2b__final\n#define blake2b                          crypto_generichash_blake2b__blake2b\n#define blake2b_salt_personal            crypto_generichash_blake2b__blake2b_salt_personal\n#define blake2b_pick_best_implementation crypto_generichash_blake2b__pick_best_implementation\n\n#if defined(__cplusplus)\nextern \"C\" {\n#endif\n\n  enum blake2s_constant\n  {\n    BLAKE2S_BLOCKBYTES = 64,\n    BLAKE2S_OUTBYTES   = 32,\n    BLAKE2S_KEYBYTES   = 32,\n    BLAKE2S_SALTBYTES  = 8,\n    BLAKE2S_PERSONALBYTES = 8\n  };\n\n  enum blake2b_constant\n  {\n    BLAKE2B_BLOCKBYTES = 128,\n    BLAKE2B_OUTBYTES   = 64,\n    BLAKE2B_KEYBYTES   = 64,\n    BLAKE2B_SALTBYTES  = 16,\n    BLAKE2B_PERSONALBYTES = 16\n  };\n\n#if defined(__IBMC__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)\n# pragma pack(1)\n#else\n# pragma pack(push, 1)\n#endif\n\n  typedef struct blake2s_param_\n  {\n    uint8_t  digest_length; // 1\n    uint8_t  key_length;    // 2\n    uint8_t  fanout;        // 3\n    uint8_t  depth;         // 4\n    uint32_t leaf_length;   // 8\n    uint8_t  node_offset[6];// 14\n    uint8_t  node_depth;    // 15\n    uint8_t  inner_length;  // 16\n    // uint8_t  reserved[0];\n    uint8_t  salt[BLAKE2S_SALTBYTES]; // 24\n    uint8_t  personal[BLAKE2S_PERSONALBYTES];  // 32\n  } blake2s_param;\n\nCRYPTO_ALIGN( 64 ) typedef struct blake2s_state_\n  {\n    uint32_t h[8];\n    uint32_t t[2];\n    uint32_t f[2];\n    uint8_t  buf[2 * BLAKE2S_BLOCKBYTES];\n    size_t   buflen;\n    uint8_t  last_node;\n  } blake2s_state ;\n\n  typedef struct blake2b_param_\n  {\n    uint8_t  digest_length; // 1\n    uint8_t  key_length;    // 2\n    uint8_t  fanout;        // 3\n    uint8_t  depth;         // 4\n    uint32_t leaf_length;   // 8\n    uint64_t node_offset;   // 16\n    uint8_t  node_depth;    // 17\n    uint8_t  inner_length;  // 18\n    uint8_t  reserved[14];  // 32\n    uint8_t  salt[BLAKE2B_SALTBYTES]; // 48\n    uint8_t  personal[BLAKE2B_PERSONALBYTES];  // 64\n  } blake2b_param;\n\n#ifndef DEFINE_BLAKE2B_STATE\ntypedef crypto_generichash_blake2b_state blake2b_state;\n#else\nCRYPTO_ALIGN( 64 ) typedef struct blake2b_state_\n  {\n    uint64_t h[8];\n    uint64_t t[2];\n    uint64_t f[2];\n    uint8_t  buf[2 * BLAKE2B_BLOCKBYTES];\n    size_t   buflen;\n    uint8_t  last_node;\n  } blake2b_state;\n#endif\n\n  typedef struct blake2sp_state_\n  {\n    blake2s_state S[8][1];\n    blake2s_state R[1];\n    uint8_t buf[8 * BLAKE2S_BLOCKBYTES];\n    size_t  buflen;\n  } blake2sp_state;\n\n  typedef struct blake2bp_state_\n  {\n    blake2b_state S[4][1];\n    blake2b_state R[1];\n    uint8_t buf[4 * BLAKE2B_BLOCKBYTES];\n    size_t  buflen;\n  } blake2bp_state;\n\n#if defined(__IBMC__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)\n# pragma pack()\n#else\n# pragma pack(pop)\n#endif\n\n  // Streaming API\n  int blake2s_init( blake2s_state *S, const uint8_t outlen );\n  int blake2s_init_key( blake2s_state *S, const uint8_t outlen, const void *key, const uint8_t keylen );\n  int blake2s_init_param( blake2s_state *S, const blake2s_param *P );\n  int blake2s_update( blake2s_state *S, const uint8_t *in, uint64_t inlen );\n  int blake2s_final( blake2s_state *S, uint8_t *out, uint8_t outlen );\n\n  int blake2b_init( blake2b_state *S, const uint8_t outlen );\n  int blake2b_init_salt_personal( blake2b_state *S, const uint8_t outlen,\n                                  const void *personal, const void *salt );\n  int blake2b_init_key( blake2b_state *S, const uint8_t outlen, const void *key, const uint8_t keylen );\n  int blake2b_init_key_salt_personal( blake2b_state *S, const uint8_t outlen, const void *key, const uint8_t keylen,\n                                      const void *salt, const void *personal );\n  int blake2b_init_param( blake2b_state *S, const blake2b_param *P );\n  int blake2b_update( blake2b_state *S, const uint8_t *in, uint64_t inlen );\n  int blake2b_final( blake2b_state *S, uint8_t *out, uint8_t outlen );\n\n  int blake2sp_init( blake2sp_state *S, const uint8_t outlen );\n  int blake2sp_init_key( blake2sp_state *S, const uint8_t outlen, const void *key, const uint8_t keylen );\n  int blake2sp_update( blake2sp_state *S, const uint8_t *in, uint64_t inlen );\n  int blake2sp_final( blake2sp_state *S, uint8_t *out, uint8_t outlen );\n\n  int blake2bp_init( blake2bp_state *S, const uint8_t outlen );\n  int blake2bp_init_key( blake2bp_state *S, const uint8_t outlen, const void *key, const uint8_t keylen );\n  int blake2bp_update( blake2bp_state *S, const uint8_t *in, uint64_t inlen );\n  int blake2bp_final( blake2bp_state *S, uint8_t *out, uint8_t outlen );\n\n  // Simple API\n  int blake2s( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen );\n  int blake2b( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen );\n  int blake2b_salt_personal( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen, const void *salt, const void *personal );\n\n  int blake2sp( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen );\n  int blake2bp( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen );\n\n  static inline int blake2( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen )\n  {\n    return blake2b( out, in, key, outlen, inlen, keylen );\n  }\n\n  typedef int ( *blake2b_compress_fn )( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] );\n  int blake2b_pick_best_implementation(void);\n  int blake2b_compress_ref( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] );\n  int blake2b_compress_ssse3( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] );\n  int blake2b_compress_sse41( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] );\n\n#if defined(__cplusplus)\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_generichash/blake2/ref/blake2b-compress-ref.c",
    "content": "\n#include <stdint.h>\n#include <string.h>\n\n#include \"blake2.h\"\n#include \"blake2-impl.h\"\n\nstatic const uint64_t blake2b_IV[8] =\n{\n  0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,\n  0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,\n  0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,\n  0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL\n};\n\nstatic const uint8_t blake2b_sigma[12][16] =\n{\n  {  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15 } ,\n  { 14, 10,  4,  8,  9, 15, 13,  6,  1, 12,  0,  2, 11,  7,  5,  3 } ,\n  { 11,  8, 12,  0,  5,  2, 15, 13, 10, 14,  3,  6,  7,  1,  9,  4 } ,\n  {  7,  9,  3,  1, 13, 12, 11, 14,  2,  6,  5, 10,  4,  0, 15,  8 } ,\n  {  9,  0,  5,  7,  2,  4, 10, 15, 14,  1, 11, 12,  6,  8,  3, 13 } ,\n  {  2, 12,  6, 10,  0, 11,  8,  3,  4, 13,  7,  5, 15, 14,  1,  9 } ,\n  { 12,  5,  1, 15, 14, 13,  4, 10,  0,  7,  6,  3,  9,  2,  8, 11 } ,\n  { 13, 11,  7, 14, 12,  1,  3,  9,  5,  0, 15,  4,  8,  6,  2, 10 } ,\n  {  6, 15, 14,  9, 11,  3,  0,  8, 12,  2, 13,  7,  1,  4, 10,  5 } ,\n  { 10,  2,  8,  4,  7,  6,  1,  5, 15, 11,  9, 14,  3, 12, 13 , 0 } ,\n  {  0,  1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15 } ,\n  { 14, 10,  4,  8,  9, 15, 13,  6,  1, 12,  0,  2, 11,  7,  5,  3 }\n};\n\nint blake2b_compress_ref( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] )\n{\n  uint64_t m[16];\n  uint64_t v[16];\n  int      i;\n\n  for( i = 0; i < 16; ++i )\n    m[i] = load64( block + i * sizeof( m[i] ) );\n\n  for( i = 0; i < 8; ++i )\n    v[i] = S->h[i];\n\n  v[ 8] = blake2b_IV[0];\n  v[ 9] = blake2b_IV[1];\n  v[10] = blake2b_IV[2];\n  v[11] = blake2b_IV[3];\n  v[12] = S->t[0] ^ blake2b_IV[4];\n  v[13] = S->t[1] ^ blake2b_IV[5];\n  v[14] = S->f[0] ^ blake2b_IV[6];\n  v[15] = S->f[1] ^ blake2b_IV[7];\n#define G(r,i,a,b,c,d) \\\n  do { \\\n    a = a + b + m[blake2b_sigma[r][2*i+0]]; \\\n    d = rotr64(d ^ a, 32); \\\n    c = c + d; \\\n    b = rotr64(b ^ c, 24); \\\n    a = a + b + m[blake2b_sigma[r][2*i+1]]; \\\n    d = rotr64(d ^ a, 16); \\\n    c = c + d; \\\n    b = rotr64(b ^ c, 63); \\\n  } while(0)\n#define ROUND(r)  \\\n  do { \\\n    G(r,0,v[ 0],v[ 4],v[ 8],v[12]); \\\n    G(r,1,v[ 1],v[ 5],v[ 9],v[13]); \\\n    G(r,2,v[ 2],v[ 6],v[10],v[14]); \\\n    G(r,3,v[ 3],v[ 7],v[11],v[15]); \\\n    G(r,4,v[ 0],v[ 5],v[10],v[15]); \\\n    G(r,5,v[ 1],v[ 6],v[11],v[12]); \\\n    G(r,6,v[ 2],v[ 7],v[ 8],v[13]); \\\n    G(r,7,v[ 3],v[ 4],v[ 9],v[14]); \\\n  } while(0)\n  ROUND( 0 );\n  ROUND( 1 );\n  ROUND( 2 );\n  ROUND( 3 );\n  ROUND( 4 );\n  ROUND( 5 );\n  ROUND( 6 );\n  ROUND( 7 );\n  ROUND( 8 );\n  ROUND( 9 );\n  ROUND( 10 );\n  ROUND( 11 );\n\n  for( i = 0; i < 8; ++i )\n    S->h[i] = S->h[i] ^ v[i] ^ v[i + 8];\n\n#undef G\n#undef ROUND\n  return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_generichash/blake2/ref/blake2b-compress-sse41.c",
    "content": "\n#define BLAKE2_USE_SSSE3\n#define BLAKE2_USE_SSE41\n\n#include <stdint.h>\n#include <string.h>\n\n#if (defined(HAVE_EMMINTRIN_H) && defined(HAVE_TMMINTRIN_H) && defined(HAVE_SMMINTRIN_H)) || \\\n    (defined(_MSC_VER) && (defined(_M_X64) || defined(_M_AMD64) || defined(_M_IX86)))\n\n#pragma GCC target(\"sse2\")\n#pragma GCC target(\"ssse3\")\n#pragma GCC target(\"sse4.1\")\n\n#include <emmintrin.h>\n#include <tmmintrin.h>\n#include <smmintrin.h>\n\n#include \"blake2.h\"\n#include \"blake2-impl.h\"\n#include \"blake2b-round.h\"\n\nstatic const uint64_t blake2b_IV[8] =\n{\n  0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,\n  0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,\n  0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,\n  0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL\n};\n\nint blake2b_compress_sse41( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] )\n{\n  __m128i row1l, row1h;\n  __m128i row2l, row2h;\n  __m128i row3l, row3h;\n  __m128i row4l, row4h;\n  __m128i b0, b1;\n  __m128i t0, t1;\n  const __m128i r16 = _mm_setr_epi8( 2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9 );\n  const __m128i r24 = _mm_setr_epi8( 3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10 );\n  const __m128i m0 = LOADU( block + 00 );\n  const __m128i m1 = LOADU( block + 16 );\n  const __m128i m2 = LOADU( block + 32 );\n  const __m128i m3 = LOADU( block + 48 );\n  const __m128i m4 = LOADU( block + 64 );\n  const __m128i m5 = LOADU( block + 80 );\n  const __m128i m6 = LOADU( block + 96 );\n  const __m128i m7 = LOADU( block + 112 );\n  row1l = LOADU( &S->h[0] );\n  row1h = LOADU( &S->h[2] );\n  row2l = LOADU( &S->h[4] );\n  row2h = LOADU( &S->h[6] );\n  row3l = LOADU( &blake2b_IV[0] );\n  row3h = LOADU( &blake2b_IV[2] );\n  row4l = _mm_xor_si128( LOADU( &blake2b_IV[4] ), LOADU( &S->t[0] ) );\n  row4h = _mm_xor_si128( LOADU( &blake2b_IV[6] ), LOADU( &S->f[0] ) );\n  ROUND( 0 );\n  ROUND( 1 );\n  ROUND( 2 );\n  ROUND( 3 );\n  ROUND( 4 );\n  ROUND( 5 );\n  ROUND( 6 );\n  ROUND( 7 );\n  ROUND( 8 );\n  ROUND( 9 );\n  ROUND( 10 );\n  ROUND( 11 );\n  row1l = _mm_xor_si128( row3l, row1l );\n  row1h = _mm_xor_si128( row3h, row1h );\n  STOREU( &S->h[0], _mm_xor_si128( LOADU( &S->h[0] ), row1l ) );\n  STOREU( &S->h[2], _mm_xor_si128( LOADU( &S->h[2] ), row1h ) );\n  row2l = _mm_xor_si128( row4l, row2l );\n  row2h = _mm_xor_si128( row4h, row2h );\n  STOREU( &S->h[4], _mm_xor_si128( LOADU( &S->h[4] ), row2l ) );\n  STOREU( &S->h[6], _mm_xor_si128( LOADU( &S->h[6] ), row2h ) );\n  return 0;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_generichash/blake2/ref/blake2b-compress-ssse3.c",
    "content": "\n#define BLAKE2_USE_SSSE3\n\n#include <stdint.h>\n#include <string.h>\n\n#if (defined(HAVE_EMMINTRIN_H) && defined(HAVE_TMMINTRIN_H)) || \\\n    (defined(_MSC_VER) && (defined(_M_X64) || defined(_M_AMD64)))\n\n#pragma GCC target(\"sse2\")\n#pragma GCC target(\"ssse3\")\n\n#ifdef _MSC_VER\n# include <intrin.h> /* for _mm_set_epi64x */\n#endif\n#include <emmintrin.h>\n#include <tmmintrin.h>\n\n#include \"blake2.h\"\n#include \"blake2-impl.h\"\n#include \"blake2b-round.h\"\n\nstatic const uint64_t blake2b_IV[8] =\n{\n  0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,\n  0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,\n  0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,\n  0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL\n};\n\nint blake2b_compress_ssse3( blake2b_state *S, const uint8_t block[BLAKE2B_BLOCKBYTES] )\n{\n  __m128i row1l, row1h;\n  __m128i row2l, row2h;\n  __m128i row3l, row3h;\n  __m128i row4l, row4h;\n  __m128i b0, b1;\n  __m128i t0, t1;\n  const __m128i r16 = _mm_setr_epi8( 2, 3, 4, 5, 6, 7, 0, 1, 10, 11, 12, 13, 14, 15, 8, 9 );\n  const __m128i r24 = _mm_setr_epi8( 3, 4, 5, 6, 7, 0, 1, 2, 11, 12, 13, 14, 15, 8, 9, 10 );\n  const uint64_t  m0 = ( ( uint64_t * )block )[ 0];\n  const uint64_t  m1 = ( ( uint64_t * )block )[ 1];\n  const uint64_t  m2 = ( ( uint64_t * )block )[ 2];\n  const uint64_t  m3 = ( ( uint64_t * )block )[ 3];\n  const uint64_t  m4 = ( ( uint64_t * )block )[ 4];\n  const uint64_t  m5 = ( ( uint64_t * )block )[ 5];\n  const uint64_t  m6 = ( ( uint64_t * )block )[ 6];\n  const uint64_t  m7 = ( ( uint64_t * )block )[ 7];\n  const uint64_t  m8 = ( ( uint64_t * )block )[ 8];\n  const uint64_t  m9 = ( ( uint64_t * )block )[ 9];\n  const uint64_t m10 = ( ( uint64_t * )block )[10];\n  const uint64_t m11 = ( ( uint64_t * )block )[11];\n  const uint64_t m12 = ( ( uint64_t * )block )[12];\n  const uint64_t m13 = ( ( uint64_t * )block )[13];\n  const uint64_t m14 = ( ( uint64_t * )block )[14];\n  const uint64_t m15 = ( ( uint64_t * )block )[15];\n\n  row1l = LOADU( &S->h[0] );\n  row1h = LOADU( &S->h[2] );\n  row2l = LOADU( &S->h[4] );\n  row2h = LOADU( &S->h[6] );\n  row3l = LOADU( &blake2b_IV[0] );\n  row3h = LOADU( &blake2b_IV[2] );\n  row4l = _mm_xor_si128( LOADU( &blake2b_IV[4] ), LOADU( &S->t[0] ) );\n  row4h = _mm_xor_si128( LOADU( &blake2b_IV[6] ), LOADU( &S->f[0] ) );\n  ROUND( 0 );\n  ROUND( 1 );\n  ROUND( 2 );\n  ROUND( 3 );\n  ROUND( 4 );\n  ROUND( 5 );\n  ROUND( 6 );\n  ROUND( 7 );\n  ROUND( 8 );\n  ROUND( 9 );\n  ROUND( 10 );\n  ROUND( 11 );\n  row1l = _mm_xor_si128( row3l, row1l );\n  row1h = _mm_xor_si128( row3h, row1h );\n  STOREU( &S->h[0], _mm_xor_si128( LOADU( &S->h[0] ), row1l ) );\n  STOREU( &S->h[2], _mm_xor_si128( LOADU( &S->h[2] ), row1h ) );\n  row2l = _mm_xor_si128( row4l, row2l );\n  row2h = _mm_xor_si128( row4h, row2h );\n  STOREU( &S->h[4], _mm_xor_si128( LOADU( &S->h[4] ), row2l ) );\n  STOREU( &S->h[6], _mm_xor_si128( LOADU( &S->h[6] ), row2h ) );\n  return 0;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_generichash/blake2/ref/blake2b-load-sse2.h",
    "content": "/*\n   BLAKE2 reference source code package - optimized C implementations\n\n   Written in 2012 by Samuel Neves <sneves@dei.uc.pt>\n\n   To the extent possible under law, the author(s) have dedicated all copyright\n   and related and neighboring rights to this software to the public domain\n   worldwide. This software is distributed without any warranty.\n\n   You should have received a copy of the CC0 Public Domain Dedication along with\n   this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.\n*/\n\n#ifndef blake2b_load_sse2_H\n#define blake2b_load_sse2_H\n\n#define LOAD_MSG_0_1(b0, b1) b0 = _mm_set_epi64x(m2, m0); b1 = _mm_set_epi64x(m6, m4)\n#define LOAD_MSG_0_2(b0, b1) b0 = _mm_set_epi64x(m3, m1); b1 = _mm_set_epi64x(m7, m5)\n#define LOAD_MSG_0_3(b0, b1) b0 = _mm_set_epi64x(m10, m8); b1 = _mm_set_epi64x(m14, m12)\n#define LOAD_MSG_0_4(b0, b1) b0 = _mm_set_epi64x(m11, m9); b1 = _mm_set_epi64x(m15, m13)\n#define LOAD_MSG_1_1(b0, b1) b0 = _mm_set_epi64x(m4, m14); b1 = _mm_set_epi64x(m13, m9)\n#define LOAD_MSG_1_2(b0, b1) b0 = _mm_set_epi64x(m8, m10); b1 = _mm_set_epi64x(m6, m15)\n#define LOAD_MSG_1_3(b0, b1) b0 = _mm_set_epi64x(m0, m1); b1 = _mm_set_epi64x(m5, m11)\n#define LOAD_MSG_1_4(b0, b1) b0 = _mm_set_epi64x(m2, m12); b1 = _mm_set_epi64x(m3, m7)\n#define LOAD_MSG_2_1(b0, b1) b0 = _mm_set_epi64x(m12, m11); b1 = _mm_set_epi64x(m15, m5)\n#define LOAD_MSG_2_2(b0, b1) b0 = _mm_set_epi64x(m0, m8); b1 = _mm_set_epi64x(m13, m2)\n#define LOAD_MSG_2_3(b0, b1) b0 = _mm_set_epi64x(m3, m10); b1 = _mm_set_epi64x(m9, m7)\n#define LOAD_MSG_2_4(b0, b1) b0 = _mm_set_epi64x(m6, m14); b1 = _mm_set_epi64x(m4, m1)\n#define LOAD_MSG_3_1(b0, b1) b0 = _mm_set_epi64x(m3, m7); b1 = _mm_set_epi64x(m11, m13)\n#define LOAD_MSG_3_2(b0, b1) b0 = _mm_set_epi64x(m1, m9); b1 = _mm_set_epi64x(m14, m12)\n#define LOAD_MSG_3_3(b0, b1) b0 = _mm_set_epi64x(m5, m2); b1 = _mm_set_epi64x(m15, m4)\n#define LOAD_MSG_3_4(b0, b1) b0 = _mm_set_epi64x(m10, m6); b1 = _mm_set_epi64x(m8, m0)\n#define LOAD_MSG_4_1(b0, b1) b0 = _mm_set_epi64x(m5, m9); b1 = _mm_set_epi64x(m10, m2)\n#define LOAD_MSG_4_2(b0, b1) b0 = _mm_set_epi64x(m7, m0); b1 = _mm_set_epi64x(m15, m4)\n#define LOAD_MSG_4_3(b0, b1) b0 = _mm_set_epi64x(m11, m14); b1 = _mm_set_epi64x(m3, m6)\n#define LOAD_MSG_4_4(b0, b1) b0 = _mm_set_epi64x(m12, m1); b1 = _mm_set_epi64x(m13, m8)\n#define LOAD_MSG_5_1(b0, b1) b0 = _mm_set_epi64x(m6, m2); b1 = _mm_set_epi64x(m8, m0)\n#define LOAD_MSG_5_2(b0, b1) b0 = _mm_set_epi64x(m10, m12); b1 = _mm_set_epi64x(m3, m11)\n#define LOAD_MSG_5_3(b0, b1) b0 = _mm_set_epi64x(m7, m4); b1 = _mm_set_epi64x(m1, m15)\n#define LOAD_MSG_5_4(b0, b1) b0 = _mm_set_epi64x(m5, m13); b1 = _mm_set_epi64x(m9, m14)\n#define LOAD_MSG_6_1(b0, b1) b0 = _mm_set_epi64x(m1, m12); b1 = _mm_set_epi64x(m4, m14)\n#define LOAD_MSG_6_2(b0, b1) b0 = _mm_set_epi64x(m15, m5); b1 = _mm_set_epi64x(m10, m13)\n#define LOAD_MSG_6_3(b0, b1) b0 = _mm_set_epi64x(m6, m0); b1 = _mm_set_epi64x(m8, m9)\n#define LOAD_MSG_6_4(b0, b1) b0 = _mm_set_epi64x(m3, m7); b1 = _mm_set_epi64x(m11, m2)\n#define LOAD_MSG_7_1(b0, b1) b0 = _mm_set_epi64x(m7, m13); b1 = _mm_set_epi64x(m3, m12)\n#define LOAD_MSG_7_2(b0, b1) b0 = _mm_set_epi64x(m14, m11); b1 = _mm_set_epi64x(m9, m1)\n#define LOAD_MSG_7_3(b0, b1) b0 = _mm_set_epi64x(m15, m5); b1 = _mm_set_epi64x(m2, m8)\n#define LOAD_MSG_7_4(b0, b1) b0 = _mm_set_epi64x(m4, m0); b1 = _mm_set_epi64x(m10, m6)\n#define LOAD_MSG_8_1(b0, b1) b0 = _mm_set_epi64x(m14, m6); b1 = _mm_set_epi64x(m0, m11)\n#define LOAD_MSG_8_2(b0, b1) b0 = _mm_set_epi64x(m9, m15); b1 = _mm_set_epi64x(m8, m3)\n#define LOAD_MSG_8_3(b0, b1) b0 = _mm_set_epi64x(m13, m12); b1 = _mm_set_epi64x(m10, m1)\n#define LOAD_MSG_8_4(b0, b1) b0 = _mm_set_epi64x(m7, m2); b1 = _mm_set_epi64x(m5, m4)\n#define LOAD_MSG_9_1(b0, b1) b0 = _mm_set_epi64x(m8, m10); b1 = _mm_set_epi64x(m1, m7)\n#define LOAD_MSG_9_2(b0, b1) b0 = _mm_set_epi64x(m4, m2); b1 = _mm_set_epi64x(m5, m6)\n#define LOAD_MSG_9_3(b0, b1) b0 = _mm_set_epi64x(m9, m15); b1 = _mm_set_epi64x(m13, m3)\n#define LOAD_MSG_9_4(b0, b1) b0 = _mm_set_epi64x(m14, m11); b1 = _mm_set_epi64x(m0, m12)\n#define LOAD_MSG_10_1(b0, b1) b0 = _mm_set_epi64x(m2, m0); b1 = _mm_set_epi64x(m6, m4)\n#define LOAD_MSG_10_2(b0, b1) b0 = _mm_set_epi64x(m3, m1); b1 = _mm_set_epi64x(m7, m5)\n#define LOAD_MSG_10_3(b0, b1) b0 = _mm_set_epi64x(m10, m8); b1 = _mm_set_epi64x(m14, m12)\n#define LOAD_MSG_10_4(b0, b1) b0 = _mm_set_epi64x(m11, m9); b1 = _mm_set_epi64x(m15, m13)\n#define LOAD_MSG_11_1(b0, b1) b0 = _mm_set_epi64x(m4, m14); b1 = _mm_set_epi64x(m13, m9)\n#define LOAD_MSG_11_2(b0, b1) b0 = _mm_set_epi64x(m8, m10); b1 = _mm_set_epi64x(m6, m15)\n#define LOAD_MSG_11_3(b0, b1) b0 = _mm_set_epi64x(m0, m1); b1 = _mm_set_epi64x(m5, m11)\n#define LOAD_MSG_11_4(b0, b1) b0 = _mm_set_epi64x(m2, m12); b1 = _mm_set_epi64x(m3, m7)\n\n\n#endif\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_generichash/blake2/ref/blake2b-load-sse41.h",
    "content": "/*\n   BLAKE2 reference source code package - optimized C implementations\n\n   Written in 2012 by Samuel Neves <sneves@dei.uc.pt>\n\n   To the extent possible under law, the author(s) have dedicated all copyright\n   and related and neighboring rights to this software to the public domain\n   worldwide. This software is distributed without any warranty.\n\n   You should have received a copy of the CC0 Public Domain Dedication along with\n   this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.\n*/\n\n#ifndef blake2b_load_sse41_H\n#define blake2b_load_sse41_H\n\n#define LOAD_MSG_0_1(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m0, m1); \\\nb1 = _mm_unpacklo_epi64(m2, m3); \\\n} while(0)\n\n\n#define LOAD_MSG_0_2(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpackhi_epi64(m0, m1); \\\nb1 = _mm_unpackhi_epi64(m2, m3); \\\n} while(0)\n\n\n#define LOAD_MSG_0_3(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m4, m5); \\\nb1 = _mm_unpacklo_epi64(m6, m7); \\\n} while(0)\n\n\n#define LOAD_MSG_0_4(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpackhi_epi64(m4, m5); \\\nb1 = _mm_unpackhi_epi64(m6, m7); \\\n} while(0)\n\n\n#define LOAD_MSG_1_1(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m7, m2); \\\nb1 = _mm_unpackhi_epi64(m4, m6); \\\n} while(0)\n\n\n#define LOAD_MSG_1_2(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m5, m4); \\\nb1 = _mm_alignr_epi8(m3, m7, 8); \\\n} while(0)\n\n\n#define LOAD_MSG_1_3(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_shuffle_epi32(m0, _MM_SHUFFLE(1,0,3,2)); \\\nb1 = _mm_unpackhi_epi64(m5, m2); \\\n} while(0)\n\n\n#define LOAD_MSG_1_4(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m6, m1); \\\nb1 = _mm_unpackhi_epi64(m3, m1); \\\n} while(0)\n\n\n#define LOAD_MSG_2_1(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_alignr_epi8(m6, m5, 8); \\\nb1 = _mm_unpackhi_epi64(m2, m7); \\\n} while(0)\n\n\n#define LOAD_MSG_2_2(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m4, m0); \\\nb1 = _mm_blend_epi16(m1, m6, 0xF0); \\\n} while(0)\n\n\n#define LOAD_MSG_2_3(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_blend_epi16(m5, m1, 0xF0); \\\nb1 = _mm_unpackhi_epi64(m3, m4); \\\n} while(0)\n\n\n#define LOAD_MSG_2_4(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m7, m3); \\\nb1 = _mm_alignr_epi8(m2, m0, 8); \\\n} while(0)\n\n\n#define LOAD_MSG_3_1(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpackhi_epi64(m3, m1); \\\nb1 = _mm_unpackhi_epi64(m6, m5); \\\n} while(0)\n\n\n#define LOAD_MSG_3_2(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpackhi_epi64(m4, m0); \\\nb1 = _mm_unpacklo_epi64(m6, m7); \\\n} while(0)\n\n\n#define LOAD_MSG_3_3(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_blend_epi16(m1, m2, 0xF0); \\\nb1 = _mm_blend_epi16(m2, m7, 0xF0); \\\n} while(0)\n\n\n#define LOAD_MSG_3_4(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m3, m5); \\\nb1 = _mm_unpacklo_epi64(m0, m4); \\\n} while(0)\n\n\n#define LOAD_MSG_4_1(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpackhi_epi64(m4, m2); \\\nb1 = _mm_unpacklo_epi64(m1, m5); \\\n} while(0)\n\n\n#define LOAD_MSG_4_2(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_blend_epi16(m0, m3, 0xF0); \\\nb1 = _mm_blend_epi16(m2, m7, 0xF0); \\\n} while(0)\n\n\n#define LOAD_MSG_4_3(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_blend_epi16(m7, m5, 0xF0); \\\nb1 = _mm_blend_epi16(m3, m1, 0xF0); \\\n} while(0)\n\n\n#define LOAD_MSG_4_4(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_alignr_epi8(m6, m0, 8); \\\nb1 = _mm_blend_epi16(m4, m6, 0xF0); \\\n} while(0)\n\n\n#define LOAD_MSG_5_1(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m1, m3); \\\nb1 = _mm_unpacklo_epi64(m0, m4); \\\n} while(0)\n\n\n#define LOAD_MSG_5_2(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m6, m5); \\\nb1 = _mm_unpackhi_epi64(m5, m1); \\\n} while(0)\n\n\n#define LOAD_MSG_5_3(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_blend_epi16(m2, m3, 0xF0); \\\nb1 = _mm_unpackhi_epi64(m7, m0); \\\n} while(0)\n\n\n#define LOAD_MSG_5_4(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpackhi_epi64(m6, m2); \\\nb1 = _mm_blend_epi16(m7, m4, 0xF0); \\\n} while(0)\n\n\n#define LOAD_MSG_6_1(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_blend_epi16(m6, m0, 0xF0); \\\nb1 = _mm_unpacklo_epi64(m7, m2); \\\n} while(0)\n\n\n#define LOAD_MSG_6_2(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpackhi_epi64(m2, m7); \\\nb1 = _mm_alignr_epi8(m5, m6, 8); \\\n} while(0)\n\n\n#define LOAD_MSG_6_3(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m0, m3); \\\nb1 = _mm_shuffle_epi32(m4, _MM_SHUFFLE(1,0,3,2)); \\\n} while(0)\n\n\n#define LOAD_MSG_6_4(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpackhi_epi64(m3, m1); \\\nb1 = _mm_blend_epi16(m1, m5, 0xF0); \\\n} while(0)\n\n\n#define LOAD_MSG_7_1(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpackhi_epi64(m6, m3); \\\nb1 = _mm_blend_epi16(m6, m1, 0xF0); \\\n} while(0)\n\n\n#define LOAD_MSG_7_2(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_alignr_epi8(m7, m5, 8); \\\nb1 = _mm_unpackhi_epi64(m0, m4); \\\n} while(0)\n\n\n#define LOAD_MSG_7_3(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpackhi_epi64(m2, m7); \\\nb1 = _mm_unpacklo_epi64(m4, m1); \\\n} while(0)\n\n\n#define LOAD_MSG_7_4(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m0, m2); \\\nb1 = _mm_unpacklo_epi64(m3, m5); \\\n} while(0)\n\n\n#define LOAD_MSG_8_1(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m3, m7); \\\nb1 = _mm_alignr_epi8(m0, m5, 8); \\\n} while(0)\n\n\n#define LOAD_MSG_8_2(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpackhi_epi64(m7, m4); \\\nb1 = _mm_alignr_epi8(m4, m1, 8); \\\n} while(0)\n\n\n#define LOAD_MSG_8_3(b0, b1) \\\ndo \\\n{ \\\nb0 = m6; \\\nb1 = _mm_alignr_epi8(m5, m0, 8); \\\n} while(0)\n\n\n#define LOAD_MSG_8_4(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_blend_epi16(m1, m3, 0xF0); \\\nb1 = m2; \\\n} while(0)\n\n\n#define LOAD_MSG_9_1(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m5, m4); \\\nb1 = _mm_unpackhi_epi64(m3, m0); \\\n} while(0)\n\n\n#define LOAD_MSG_9_2(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m1, m2); \\\nb1 = _mm_blend_epi16(m3, m2, 0xF0); \\\n} while(0)\n\n\n#define LOAD_MSG_9_3(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpackhi_epi64(m7, m4); \\\nb1 = _mm_unpackhi_epi64(m1, m6); \\\n} while(0)\n\n\n#define LOAD_MSG_9_4(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_alignr_epi8(m7, m5, 8); \\\nb1 = _mm_unpacklo_epi64(m6, m0); \\\n} while(0)\n\n\n#define LOAD_MSG_10_1(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m0, m1); \\\nb1 = _mm_unpacklo_epi64(m2, m3); \\\n} while(0)\n\n\n#define LOAD_MSG_10_2(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpackhi_epi64(m0, m1); \\\nb1 = _mm_unpackhi_epi64(m2, m3); \\\n} while(0)\n\n\n#define LOAD_MSG_10_3(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m4, m5); \\\nb1 = _mm_unpacklo_epi64(m6, m7); \\\n} while(0)\n\n\n#define LOAD_MSG_10_4(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpackhi_epi64(m4, m5); \\\nb1 = _mm_unpackhi_epi64(m6, m7); \\\n} while(0)\n\n\n#define LOAD_MSG_11_1(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m7, m2); \\\nb1 = _mm_unpackhi_epi64(m4, m6); \\\n} while(0)\n\n\n#define LOAD_MSG_11_2(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m5, m4); \\\nb1 = _mm_alignr_epi8(m3, m7, 8); \\\n} while(0)\n\n\n#define LOAD_MSG_11_3(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_shuffle_epi32(m0, _MM_SHUFFLE(1,0,3,2)); \\\nb1 = _mm_unpackhi_epi64(m5, m2); \\\n} while(0)\n\n\n#define LOAD_MSG_11_4(b0, b1) \\\ndo \\\n{ \\\nb0 = _mm_unpacklo_epi64(m6, m1); \\\nb1 = _mm_unpackhi_epi64(m3, m1); \\\n} while(0)\n\n\n#endif\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_generichash/blake2/ref/blake2b-ref.c",
    "content": "/*\n   BLAKE2 reference source code package - C implementations\n\n   Written in 2012 by Samuel Neves <sneves@dei.uc.pt>\n\n   To the extent possible under law, the author(s) have dedicated all copyright\n   and related and neighboring rights to this software to the public domain\n   worldwide. This software is distributed without any warranty.\n\n   You should have received a copy of the CC0 Public Domain Dedication along with\n   this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.\n*/\n\n#include <assert.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"blake2.h\"\n#include \"blake2-impl.h\"\n#include \"runtime.h\"\n\n#ifdef HAVE_TI_MODE\n# if defined(__SIZEOF_INT128__)\ntypedef unsigned __int128 uint128_t;\n# else\ntypedef unsigned uint128_t __attribute__((mode(TI)));\n# endif\n#endif\n\nstatic blake2b_compress_fn blake2b_compress = blake2b_compress_ref;\n\nstatic const uint64_t blake2b_IV[8] =\n{\n  0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,\n  0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,\n  0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,\n  0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL\n};\n\n/* LCOV_EXCL_START */\nstatic inline int blake2b_set_lastnode( blake2b_state *S )\n{\n  S->f[1] = -1;\n  return 0;\n}\n/* LCOV_EXCL_STOP */\n#if 0\nstatic inline int blake2b_clear_lastnode( blake2b_state *S )\n{\n  S->f[1] = 0;\n  return 0;\n}\n#endif\n\nstatic inline int blake2b_set_lastblock( blake2b_state *S )\n{\n  if( S->last_node ) blake2b_set_lastnode( S );\n\n  S->f[0] = -1;\n  return 0;\n}\n#if 0\nstatic inline int blake2b_clear_lastblock( blake2b_state *S )\n{\n  if( S->last_node ) blake2b_clear_lastnode( S );\n\n  S->f[0] = 0;\n  return 0;\n}\n#endif\nstatic inline int blake2b_increment_counter( blake2b_state *S, const uint64_t inc )\n{\n#ifdef HAVE_TI_MODE\n  uint128_t t = ( ( uint128_t )S->t[1] << 64 ) | S->t[0];\n  t += inc;\n  S->t[0] = ( uint64_t )( t >>  0 );\n  S->t[1] = ( uint64_t )( t >> 64 );\n#else\n  S->t[0] += inc;\n  S->t[1] += ( S->t[0] < inc );\n#endif\n  return 0;\n}\n\n// Parameter-related functions\n#if 0\nstatic inline int blake2b_param_set_digest_length( blake2b_param *P, const uint8_t digest_length )\n{\n  P->digest_length = digest_length;\n  return 0;\n}\n\nstatic inline int blake2b_param_set_fanout( blake2b_param *P, const uint8_t fanout )\n{\n  P->fanout = fanout;\n  return 0;\n}\n\nstatic inline int blake2b_param_set_max_depth( blake2b_param *P, const uint8_t depth )\n{\n  P->depth = depth;\n  return 0;\n}\n\nstatic inline int blake2b_param_set_leaf_length( blake2b_param *P, const uint32_t leaf_length )\n{\n  store32( &P->leaf_length, leaf_length );\n  return 0;\n}\n\nstatic inline int blake2b_param_set_node_offset( blake2b_param *P, const uint64_t node_offset )\n{\n  store64( &P->node_offset, node_offset );\n  return 0;\n}\n\nstatic inline int blake2b_param_set_node_depth( blake2b_param *P, const uint8_t node_depth )\n{\n  P->node_depth = node_depth;\n  return 0;\n}\n\nstatic inline int blake2b_param_set_inner_length( blake2b_param *P, const uint8_t inner_length )\n{\n  P->inner_length = inner_length;\n  return 0;\n}\n#endif\nstatic inline int blake2b_param_set_salt( blake2b_param *P, const uint8_t salt[BLAKE2B_SALTBYTES] )\n{\n  memcpy( P->salt, salt, BLAKE2B_SALTBYTES );\n  return 0;\n}\n\nstatic inline int blake2b_param_set_personal( blake2b_param *P, const uint8_t personal[BLAKE2B_PERSONALBYTES] )\n{\n  memcpy( P->personal, personal, BLAKE2B_PERSONALBYTES );\n  return 0;\n}\n\nstatic inline int blake2b_init0( blake2b_state *S )\n{\n  int i;\n  memset( S, 0, sizeof( blake2b_state ) );\n\n  for( i = 0; i < 8; ++i ) S->h[i] = blake2b_IV[i];\n\n  return 0;\n}\n\n/* init xors IV with input parameter block */\nint blake2b_init_param( blake2b_state *S, const blake2b_param *P )\n{\n  size_t i;\n  const uint8_t *p;\n\n  blake2b_init0( S );\n  p = ( const uint8_t * )( P );\n\n  /* IV XOR ParamBlock */\n  for( i = 0; i < 8; ++i )\n    S->h[i] ^= load64( p + sizeof( S->h[i] ) * i );\n\n  return 0;\n}\n\nint blake2b_init( blake2b_state *S, const uint8_t outlen )\n{\n  blake2b_param P[1];\n\n  if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) abort();\n\n  P->digest_length = outlen;\n  P->key_length    = 0;\n  P->fanout        = 1;\n  P->depth         = 1;\n  store32( &P->leaf_length, 0 );\n  store64( &P->node_offset, 0 );\n  P->node_depth    = 0;\n  P->inner_length  = 0;\n  memset( P->reserved, 0, sizeof( P->reserved ) );\n  memset( P->salt,     0, sizeof( P->salt ) );\n  memset( P->personal, 0, sizeof( P->personal ) );\n  return blake2b_init_param( S, P );\n}\n\nint blake2b_init_salt_personal( blake2b_state *S, const uint8_t outlen,\n                                const void *salt, const void *personal )\n{\n  blake2b_param P[1];\n\n  if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) abort();\n\n  P->digest_length = outlen;\n  P->key_length    = 0;\n  P->fanout        = 1;\n  P->depth         = 1;\n  store32( &P->leaf_length, 0 );\n  store64( &P->node_offset, 0 );\n  P->node_depth    = 0;\n  P->inner_length  = 0;\n  memset( P->reserved, 0, sizeof( P->reserved ) );\n  if (salt != NULL) {\n    blake2b_param_set_salt( P, (const uint8_t *) salt );\n  } else {\n    memset( P->salt, 0, sizeof( P->salt ) );\n  }\n  if (personal != NULL) {\n    blake2b_param_set_personal( P, (const uint8_t *) personal );\n  } else {\n    memset( P->personal, 0, sizeof( P->personal ) );\n  }\n  return blake2b_init_param( S, P );\n}\n\nint blake2b_init_key( blake2b_state *S, const uint8_t outlen, const void *key, const uint8_t keylen )\n{\n  blake2b_param P[1];\n\n  if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) abort();\n\n  if ( !key || !keylen || keylen > BLAKE2B_KEYBYTES ) abort();\n\n  P->digest_length = outlen;\n  P->key_length    = keylen;\n  P->fanout        = 1;\n  P->depth         = 1;\n  store32( &P->leaf_length, 0 );\n  store64( &P->node_offset, 0 );\n  P->node_depth    = 0;\n  P->inner_length  = 0;\n  memset( P->reserved, 0, sizeof( P->reserved ) );\n  memset( P->salt,     0, sizeof( P->salt ) );\n  memset( P->personal, 0, sizeof( P->personal ) );\n\n  if( blake2b_init_param( S, P ) < 0 ) abort();\n\n  {\n    uint8_t block[BLAKE2B_BLOCKBYTES];\n    memset( block, 0, BLAKE2B_BLOCKBYTES );\n    memcpy( block, key, keylen );\n    blake2b_update( S, block, BLAKE2B_BLOCKBYTES );\n    secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */\n  }\n  return 0;\n}\n\nint blake2b_init_key_salt_personal( blake2b_state *S, const uint8_t outlen, const void *key, const uint8_t keylen,\n                                    const void *salt, const void *personal )\n{\n  blake2b_param P[1];\n\n  if ( ( !outlen ) || ( outlen > BLAKE2B_OUTBYTES ) ) abort();\n\n  if ( !key || !keylen || keylen > BLAKE2B_KEYBYTES ) abort();\n\n  P->digest_length = outlen;\n  P->key_length    = keylen;\n  P->fanout        = 1;\n  P->depth         = 1;\n  store32( &P->leaf_length, 0 );\n  store64( &P->node_offset, 0 );\n  P->node_depth    = 0;\n  P->inner_length  = 0;\n  memset( P->reserved, 0, sizeof( P->reserved ) );\n  if (salt != NULL) {\n    blake2b_param_set_salt( P, (const uint8_t *) salt );\n  } else {\n    memset( P->salt, 0, sizeof( P->salt ) );\n  }\n  if (personal != NULL) {\n    blake2b_param_set_personal( P, (const uint8_t *) personal );\n  } else {\n    memset( P->personal, 0, sizeof( P->personal ) );\n  }\n\n  if( blake2b_init_param( S, P ) < 0 ) abort();\n\n  {\n    uint8_t block[BLAKE2B_BLOCKBYTES];\n    memset( block, 0, BLAKE2B_BLOCKBYTES );\n    memcpy( block, key, keylen );\n    blake2b_update( S, block, BLAKE2B_BLOCKBYTES );\n    secure_zero_memory( block, BLAKE2B_BLOCKBYTES ); /* Burn the key from stack */\n  }\n  return 0;\n}\n\n/* inlen now in bytes */\nint blake2b_update( blake2b_state *S, const uint8_t *in, uint64_t inlen )\n{\n  while( inlen > 0 )\n  {\n    size_t left = S->buflen;\n    size_t fill = 2 * BLAKE2B_BLOCKBYTES - left;\n\n    if( inlen > fill )\n    {\n      memcpy( S->buf + left, in, fill ); // Fill buffer\n      S->buflen += fill;\n      blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES );\n      blake2b_compress( S, S->buf ); // Compress\n      memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, BLAKE2B_BLOCKBYTES ); // Shift buffer left\n      S->buflen -= BLAKE2B_BLOCKBYTES;\n      in += fill;\n      inlen -= fill;\n    }\n    else // inlen <= fill\n    {\n      memcpy( S->buf + left, in, inlen );\n      S->buflen += inlen; // Be lazy, do not compress\n      in += inlen;\n      inlen -= inlen;\n    }\n  }\n\n  return 0;\n}\n\nint blake2b_final( blake2b_state *S, uint8_t *out, uint8_t outlen )\n{\n  if( !outlen || outlen > BLAKE2B_OUTBYTES ) {\n    abort();\n  }\n  if( S->buflen > BLAKE2B_BLOCKBYTES )\n  {\n    blake2b_increment_counter( S, BLAKE2B_BLOCKBYTES );\n    blake2b_compress( S, S->buf );\n    S->buflen -= BLAKE2B_BLOCKBYTES;\n    assert( S->buflen <= BLAKE2B_BLOCKBYTES );\n    memcpy( S->buf, S->buf + BLAKE2B_BLOCKBYTES, S->buflen );\n  }\n\n  blake2b_increment_counter( S, S->buflen );\n  blake2b_set_lastblock( S );\n  memset( S->buf + S->buflen, 0, 2 * BLAKE2B_BLOCKBYTES - S->buflen ); /* Padding */\n  blake2b_compress( S, S->buf );\n\n#ifdef NATIVE_LITTLE_ENDIAN\n  memcpy( out, &S->h[0], outlen );\n#else\n  {\n    uint8_t buffer[BLAKE2B_OUTBYTES];\n    int     i;\n\n    for( i = 0; i < 8; ++i ) /* Output full hash to temp buffer */\n      store64( buffer + sizeof( S->h[i] ) * i, S->h[i] );\n    memcpy( out, buffer, outlen );\n  }\n#endif\n  return 0;\n}\n\n/* inlen, at least, should be uint64_t. Others can be size_t. */\nint blake2b( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen )\n{\n  blake2b_state S[1];\n\n  /* Verify parameters */\n  if( NULL == in && inlen > 0 ) abort();\n\n  if( NULL == out ) abort();\n\n  if( !outlen || outlen > BLAKE2B_OUTBYTES ) abort();\n\n  if( NULL == key && keylen > 0 ) abort();\n\n  if( keylen > BLAKE2B_KEYBYTES ) abort();\n\n  if( keylen > 0 )\n  {\n    if( blake2b_init_key( S, outlen, key, keylen ) < 0 ) abort();\n  }\n  else\n  {\n    if( blake2b_init( S, outlen ) < 0 ) abort();\n  }\n\n  blake2b_update( S, ( const uint8_t * )in, inlen );\n  blake2b_final( S, out, outlen );\n  return 0;\n}\n\nint blake2b_salt_personal( uint8_t *out, const void *in, const void *key, const uint8_t outlen, const uint64_t inlen, uint8_t keylen,\n                           const void *salt, const void *personal )\n{\n  blake2b_state S[1];\n\n  /* Verify parameters */\n  if( NULL == in && inlen > 0 ) abort();\n\n  if( NULL == out ) abort();\n\n  if( !outlen || outlen > BLAKE2B_OUTBYTES ) abort();\n\n  if( NULL == key && keylen > 0 ) abort();\n\n  if( keylen > BLAKE2B_KEYBYTES ) abort();\n\n  if( keylen > 0 )\n  {\n    if( blake2b_init_key_salt_personal( S, outlen, key, keylen, salt, personal ) < 0 ) abort();\n  }\n  else\n  {\n    if( blake2b_init_salt_personal( S, outlen, salt, personal ) < 0 ) abort();\n  }\n\n  blake2b_update( S, ( const uint8_t * )in, inlen );\n  blake2b_final( S, out, outlen );\n  return 0;\n}\n\nint\nblake2b_pick_best_implementation(void)\n{\n#if (defined(HAVE_EMMINTRIN_H) && defined(HAVE_TMMINTRIN_H) && defined(HAVE_SMMINTRIN_H)) || \\\n    (defined(_MSC_VER) && (defined(_M_X64) || defined(_M_AMD64) || defined(_M_IX86)))\n  if (sodium_runtime_has_sse41()) {\n    blake2b_compress = blake2b_compress_sse41;\n    return 0;\n  }\n#endif\n#if (defined(HAVE_EMMINTRIN_H) && defined(HAVE_TMMINTRIN_H)) || \\\n    (defined(_MSC_VER) && (defined(_M_X64) || defined(_M_AMD64)))\n  if (sodium_runtime_has_ssse3()) {\n    blake2b_compress = blake2b_compress_ssse3;\n    return 0;\n  }\n#endif\n  blake2b_compress = blake2b_compress_ref;\n\n  return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_generichash/blake2/ref/blake2b-round.h",
    "content": "/*\n   BLAKE2 reference source code package - optimized C implementations\n\n   Written in 2012 by Samuel Neves <sneves@dei.uc.pt>\n\n   To the extent possible under law, the author(s) have dedicated all copyright\n   and related and neighboring rights to this software to the public domain\n   worldwide. This software is distributed without any warranty.\n\n   You should have received a copy of the CC0 Public Domain Dedication along with\n   this software. If not, see <http://creativecommons.org/publicdomain/zero/1.0/>.\n*/\n\n#ifndef blake2b_round_H\n#define blake2b_round_H\n\n#ifndef BLAKE2_USE_SSSE3\n# error BLAKE2_USE_SSSE3 must be defined in order to use this file\n#endif\n\n#define LOADU(p)  _mm_loadu_si128( (const __m128i *)(const void *)(p) )\n#define STOREU(p,r) _mm_storeu_si128((__m128i *)(void *)(p), r)\n\n#define TOF(reg) _mm_castsi128_ps((reg))\n#define TOI(reg) _mm_castps_si128((reg))\n\n\n/* Microarchitecture-specific macros */\n#define _mm_roti_epi64(x, c) \\\n    (-(c) == 32) ? _mm_shuffle_epi32((x), _MM_SHUFFLE(2,3,0,1))  \\\n    : (-(c) == 24) ? _mm_shuffle_epi8((x), r24) \\\n    : (-(c) == 16) ? _mm_shuffle_epi8((x), r16) \\\n    : (-(c) == 63) ? _mm_xor_si128(_mm_srli_epi64((x), -(c)), _mm_add_epi64((x), (x)))  \\\n    : _mm_xor_si128(_mm_srli_epi64((x), -(c)), _mm_slli_epi64((x), 64-(-(c))))\n\n\n#define G1(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1) \\\n  row1l = _mm_add_epi64(_mm_add_epi64(row1l, b0), row2l); \\\n  row1h = _mm_add_epi64(_mm_add_epi64(row1h, b1), row2h); \\\n  \\\n  row4l = _mm_xor_si128(row4l, row1l); \\\n  row4h = _mm_xor_si128(row4h, row1h); \\\n  \\\n  row4l = _mm_roti_epi64(row4l, -32); \\\n  row4h = _mm_roti_epi64(row4h, -32); \\\n  \\\n  row3l = _mm_add_epi64(row3l, row4l); \\\n  row3h = _mm_add_epi64(row3h, row4h); \\\n  \\\n  row2l = _mm_xor_si128(row2l, row3l); \\\n  row2h = _mm_xor_si128(row2h, row3h); \\\n  \\\n  row2l = _mm_roti_epi64(row2l, -24); \\\n  row2h = _mm_roti_epi64(row2h, -24); \\\n\n#define G2(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1) \\\n  row1l = _mm_add_epi64(_mm_add_epi64(row1l, b0), row2l); \\\n  row1h = _mm_add_epi64(_mm_add_epi64(row1h, b1), row2h); \\\n  \\\n  row4l = _mm_xor_si128(row4l, row1l); \\\n  row4h = _mm_xor_si128(row4h, row1h); \\\n  \\\n  row4l = _mm_roti_epi64(row4l, -16); \\\n  row4h = _mm_roti_epi64(row4h, -16); \\\n  \\\n  row3l = _mm_add_epi64(row3l, row4l); \\\n  row3h = _mm_add_epi64(row3h, row4h); \\\n  \\\n  row2l = _mm_xor_si128(row2l, row3l); \\\n  row2h = _mm_xor_si128(row2h, row3h); \\\n  \\\n  row2l = _mm_roti_epi64(row2l, -63); \\\n  row2h = _mm_roti_epi64(row2h, -63); \\\n\n#define DIAGONALIZE(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h) \\\n  t0 = _mm_alignr_epi8(row2h, row2l, 8); \\\n  t1 = _mm_alignr_epi8(row2l, row2h, 8); \\\n  row2l = t0; \\\n  row2h = t1; \\\n  \\\n  t0 = row3l; \\\n  row3l = row3h; \\\n  row3h = t0;    \\\n  \\\n  t0 = _mm_alignr_epi8(row4h, row4l, 8); \\\n  t1 = _mm_alignr_epi8(row4l, row4h, 8); \\\n  row4l = t1; \\\n  row4h = t0;\n\n#define UNDIAGONALIZE(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h) \\\n  t0 = _mm_alignr_epi8(row2l, row2h, 8); \\\n  t1 = _mm_alignr_epi8(row2h, row2l, 8); \\\n  row2l = t0; \\\n  row2h = t1; \\\n  \\\n  t0 = row3l; \\\n  row3l = row3h; \\\n  row3h = t0; \\\n  \\\n  t0 = _mm_alignr_epi8(row4l, row4h, 8); \\\n  t1 = _mm_alignr_epi8(row4h, row4l, 8); \\\n  row4l = t1; \\\n  row4h = t0;\n\n#if defined(BLAKE2_USE_SSE41)\n#include \"blake2b-load-sse41.h\"\n#else\n#include \"blake2b-load-sse2.h\"\n#endif\n\n#define ROUND(r) \\\n  LOAD_MSG_ ##r ##_1(b0, b1); \\\n  G1(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1); \\\n  LOAD_MSG_ ##r ##_2(b0, b1); \\\n  G2(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1); \\\n  DIAGONALIZE(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h); \\\n  LOAD_MSG_ ##r ##_3(b0, b1); \\\n  G1(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1); \\\n  LOAD_MSG_ ##r ##_4(b0, b1); \\\n  G2(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h,b0,b1); \\\n  UNDIAGONALIZE(row1l,row2l,row3l,row4l,row1h,row2h,row3h,row4h);\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_generichash/blake2/ref/generichash_blake2b.c",
    "content": "\n#include <assert.h>\n#include <limits.h>\n#include <stdint.h>\n\n#include \"crypto_generichash_blake2b.h\"\n#include \"blake2.h\"\n\nint\ncrypto_generichash_blake2b(unsigned char *out, size_t outlen,\n                           const unsigned char *in, unsigned long long inlen,\n                           const unsigned char *key, size_t keylen)\n{\n    if (outlen <= 0U || outlen > BLAKE2B_OUTBYTES ||\n        keylen > BLAKE2B_KEYBYTES || inlen > UINT64_MAX) {\n        return -1;\n    }\n    assert(outlen <= UINT8_MAX);\n    assert(keylen <= UINT8_MAX);\n\n    return blake2b((uint8_t *) out, in, key,\n                   (uint8_t) outlen, (uint64_t) inlen, (uint8_t) keylen);\n}\n\nint\ncrypto_generichash_blake2b_salt_personal(unsigned char *out, size_t outlen,\n                                         const unsigned char *in, unsigned long long inlen,\n                                         const unsigned char *key, size_t keylen,\n                                         const unsigned char *salt,\n                                         const unsigned char *personal)\n{\n    if (outlen <= 0U || outlen > BLAKE2B_OUTBYTES ||\n        keylen > BLAKE2B_KEYBYTES || inlen > UINT64_MAX) {\n        return -1;\n    }\n    assert(outlen <= UINT8_MAX);\n    assert(keylen <= UINT8_MAX);\n\n    return blake2b_salt_personal((uint8_t *) out, in, key,\n                                 (uint8_t) outlen, (uint64_t) inlen, (uint8_t) keylen,\n                                 salt, personal);\n}\n\nint\ncrypto_generichash_blake2b_init(crypto_generichash_blake2b_state *state,\n                                const unsigned char *key,\n                                const size_t keylen, const size_t outlen)\n{\n    if (outlen <= 0U || outlen > BLAKE2B_OUTBYTES ||\n        keylen > BLAKE2B_KEYBYTES) {\n        return -1;\n    }\n    assert(outlen <= UINT8_MAX);\n    assert(keylen <= UINT8_MAX);\n    if (key == NULL || keylen <= 0U) {\n        if (blake2b_init(state, (uint8_t) outlen) != 0) {\n            return -1; /* LCOV_EXCL_LINE */\n        }\n    } else if (blake2b_init_key(state, (uint8_t) outlen, key,\n                                (uint8_t) keylen) != 0) {\n        return -1; /* LCOV_EXCL_LINE */\n    }\n    return 0;\n}\n\nint\ncrypto_generichash_blake2b_init_salt_personal(crypto_generichash_blake2b_state *state,\n                                              const unsigned char *key,\n                                              const size_t keylen, const size_t outlen,\n                                              const unsigned char *salt,\n                                              const unsigned char *personal)\n{\n    if (outlen <= 0U || outlen > BLAKE2B_OUTBYTES ||\n        keylen > BLAKE2B_KEYBYTES) {\n        return -1;\n    }\n    assert(outlen <= UINT8_MAX);\n    assert(keylen <= UINT8_MAX);\n    if (key == NULL || keylen <= 0U) {\n        if (blake2b_init_salt_personal(state, (uint8_t) outlen,\n                                       salt, personal) != 0) {\n            return -1; /* LCOV_EXCL_LINE */\n        }\n    } else if (blake2b_init_key_salt_personal(state,\n                                              (uint8_t) outlen, key,\n                                              (uint8_t) keylen,\n                                              salt, personal) != 0) {\n        return -1; /* LCOV_EXCL_LINE */\n    }\n    return 0;\n}\n\nint\ncrypto_generichash_blake2b_update(crypto_generichash_blake2b_state *state,\n                                  const unsigned char *in,\n                                  unsigned long long inlen)\n{\n    return blake2b_update(state, (const uint8_t *) in, (uint64_t) inlen);\n}\n\nint\ncrypto_generichash_blake2b_final(crypto_generichash_blake2b_state *state,\n                                 unsigned char *out,\n                                 const size_t outlen)\n{\n    assert(outlen <= UINT8_MAX);\n    return blake2b_final(state, (uint8_t *) out, (uint8_t) outlen);\n}\n\nint\n_crypto_generichash_blake2b_pick_best_implementation(void)\n{\n    return blake2b_pick_best_implementation();\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_generichash/crypto_generichash.c",
    "content": "\n#include \"crypto_generichash.h\"\n\nsize_t\ncrypto_generichash_bytes_min(void)\n{\n    return crypto_generichash_BYTES_MIN;\n}\n\nsize_t\ncrypto_generichash_bytes_max(void)\n{\n    return crypto_generichash_BYTES_MAX;\n}\n\nsize_t\ncrypto_generichash_bytes(void)\n{\n    return crypto_generichash_BYTES;\n}\n\nsize_t\ncrypto_generichash_keybytes_min(void)\n{\n    return crypto_generichash_KEYBYTES_MIN;\n}\n\nsize_t\ncrypto_generichash_keybytes_max(void)\n{\n    return crypto_generichash_KEYBYTES_MAX;\n}\n\nsize_t\ncrypto_generichash_keybytes(void)\n{\n    return crypto_generichash_KEYBYTES;\n}\n\nconst char *\ncrypto_generichash_primitive(void)\n{\n    return crypto_generichash_PRIMITIVE;\n}\n\nsize_t\ncrypto_generichash_statebytes(void)\n{\n    return (sizeof(crypto_generichash_state) + (size_t) 63U) & ~(size_t) 63U;\n}\n\nint\ncrypto_generichash(unsigned char *out, size_t outlen, const unsigned char *in,\n                   unsigned long long inlen, const unsigned char *key,\n                   size_t keylen)\n{\n    return crypto_generichash_blake2b(out, outlen, in, inlen, key, keylen);\n}\n\nint\ncrypto_generichash_init(crypto_generichash_state *state,\n                        const unsigned char *key,\n                        const size_t keylen, const size_t outlen)\n{\n    return crypto_generichash_blake2b_init\n        ((crypto_generichash_blake2b_state *) state, key, keylen, outlen);\n}\n\nint\ncrypto_generichash_update(crypto_generichash_state *state,\n                          const unsigned char *in,\n                          unsigned long long inlen)\n{\n    return crypto_generichash_blake2b_update\n        ((crypto_generichash_blake2b_state *) state, in, inlen);\n}\n\nint\ncrypto_generichash_final(crypto_generichash_state *state,\n                         unsigned char *out, const size_t outlen)\n{\n    return crypto_generichash_blake2b_final\n        ((crypto_generichash_blake2b_state *) state, out, outlen);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_hash/crypto_hash.c",
    "content": "\n#include \"crypto_hash.h\"\n\nsize_t\ncrypto_hash_bytes(void)\n{\n    return crypto_hash_BYTES;\n}\n\nint\ncrypto_hash(unsigned char *out, const unsigned char *in,\n            unsigned long long inlen)\n{\n    return crypto_hash_sha512(out, in, inlen);\n}\n\nconst char *\ncrypto_hash_primitive(void) {\n    return crypto_hash_PRIMITIVE;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_hash/sha256/cp/hash_sha256.c",
    "content": "\n/*-\n * Copyright 2005,2007,2009 Colin Percival\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n */\n\n#include \"crypto_hash_sha256.h\"\n#include \"utils.h\"\n\n#include <sys/types.h>\n\n#include <limits.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n/* Avoid namespace collisions with BSD <sys/endian.h>. */\n#define be32dec _sha256_be32dec\n#define be32enc _sha256_be32enc\n#define be64enc _sha256_be64enc\n\nstatic inline uint32_t\nbe32dec(const void *pp)\n{\n    const uint8_t *p = (uint8_t const *)pp;\n\n    return ((uint32_t)(p[3]) + ((uint32_t)(p[2]) << 8) +\n            ((uint32_t)(p[1]) << 16) + ((uint32_t)(p[0]) << 24));\n}\n\nstatic inline void\nbe32enc(void *pp, uint32_t x)\n{\n    uint8_t *p = (uint8_t *)pp;\n\n    p[3] = x & 0xff;\n    p[2] = (x >> 8) & 0xff;\n    p[1] = (x >> 16) & 0xff;\n    p[0] = (x >> 24) & 0xff;\n}\n\nstatic inline void\nbe64enc(void * pp, uint64_t x)\n{\n    uint8_t * p = (uint8_t *)pp;\n\n    p[7] = x & 0xff;\n    p[6] = (x >> 8) & 0xff;\n    p[5] = (x >> 16) & 0xff;\n    p[4] = (x >> 24) & 0xff;\n    p[3] = (x >> 32) & 0xff;\n    p[2] = (x >> 40) & 0xff;\n    p[1] = (x >> 48) & 0xff;\n    p[0] = (x >> 56) & 0xff;\n}\n\nstatic void\nbe32enc_vect(unsigned char *dst, const uint32_t *src, size_t len)\n{\n    size_t i;\n\n    for (i = 0; i < len / 4; i++) {\n        be32enc(dst + i * 4, src[i]);\n    }\n}\n\nstatic void\nbe32dec_vect(uint32_t *dst, const unsigned char *src, size_t len)\n{\n    size_t i;\n\n    for (i = 0; i < len / 4; i++) {\n        dst[i] = be32dec(src + i * 4);\n    }\n}\n\n#define Ch(x, y, z)     ((x & (y ^ z)) ^ z)\n#define Maj(x, y, z)    ((x & (y | z)) | (y & z))\n#define SHR(x, n)       (x >> n)\n#define ROTR(x, n)      ((x >> n) | (x << (32 - n)))\n#define S0(x)           (ROTR(x, 2) ^ ROTR(x, 13) ^ ROTR(x, 22))\n#define S1(x)           (ROTR(x, 6) ^ ROTR(x, 11) ^ ROTR(x, 25))\n#define s0(x)           (ROTR(x, 7) ^ ROTR(x, 18) ^ SHR(x, 3))\n#define s1(x)           (ROTR(x, 17) ^ ROTR(x, 19) ^ SHR(x, 10))\n\n#define RND(a, b, c, d, e, f, g, h, k)              \\\n    t0 = h + S1(e) + Ch(e, f, g) + k;               \\\n    t1 = S0(a) + Maj(a, b, c);                      \\\n    d += t0;                                        \\\n    h  = t0 + t1;\n\n#define RNDr(S, W, i, k)                    \\\n    RND(S[(64 - i) % 8], S[(65 - i) % 8],   \\\n        S[(66 - i) % 8], S[(67 - i) % 8],   \\\n        S[(68 - i) % 8], S[(69 - i) % 8],   \\\n        S[(70 - i) % 8], S[(71 - i) % 8],   \\\n        W[i] + k)\n\nstatic void\nSHA256_Transform(uint32_t *state, const unsigned char block[64])\n{\n    uint32_t W[64];\n    uint32_t S[8];\n    uint32_t t0, t1;\n    int i;\n\n    be32dec_vect(W, block, 64);\n    for (i = 16; i < 64; i++) {\n        W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];\n    }\n\n    memcpy(S, state, 32);\n\n    RNDr(S, W, 0, 0x428a2f98);\n    RNDr(S, W, 1, 0x71374491);\n    RNDr(S, W, 2, 0xb5c0fbcf);\n    RNDr(S, W, 3, 0xe9b5dba5);\n    RNDr(S, W, 4, 0x3956c25b);\n    RNDr(S, W, 5, 0x59f111f1);\n    RNDr(S, W, 6, 0x923f82a4);\n    RNDr(S, W, 7, 0xab1c5ed5);\n    RNDr(S, W, 8, 0xd807aa98);\n    RNDr(S, W, 9, 0x12835b01);\n    RNDr(S, W, 10, 0x243185be);\n    RNDr(S, W, 11, 0x550c7dc3);\n    RNDr(S, W, 12, 0x72be5d74);\n    RNDr(S, W, 13, 0x80deb1fe);\n    RNDr(S, W, 14, 0x9bdc06a7);\n    RNDr(S, W, 15, 0xc19bf174);\n    RNDr(S, W, 16, 0xe49b69c1);\n    RNDr(S, W, 17, 0xefbe4786);\n    RNDr(S, W, 18, 0x0fc19dc6);\n    RNDr(S, W, 19, 0x240ca1cc);\n    RNDr(S, W, 20, 0x2de92c6f);\n    RNDr(S, W, 21, 0x4a7484aa);\n    RNDr(S, W, 22, 0x5cb0a9dc);\n    RNDr(S, W, 23, 0x76f988da);\n    RNDr(S, W, 24, 0x983e5152);\n    RNDr(S, W, 25, 0xa831c66d);\n    RNDr(S, W, 26, 0xb00327c8);\n    RNDr(S, W, 27, 0xbf597fc7);\n    RNDr(S, W, 28, 0xc6e00bf3);\n    RNDr(S, W, 29, 0xd5a79147);\n    RNDr(S, W, 30, 0x06ca6351);\n    RNDr(S, W, 31, 0x14292967);\n    RNDr(S, W, 32, 0x27b70a85);\n    RNDr(S, W, 33, 0x2e1b2138);\n    RNDr(S, W, 34, 0x4d2c6dfc);\n    RNDr(S, W, 35, 0x53380d13);\n    RNDr(S, W, 36, 0x650a7354);\n    RNDr(S, W, 37, 0x766a0abb);\n    RNDr(S, W, 38, 0x81c2c92e);\n    RNDr(S, W, 39, 0x92722c85);\n    RNDr(S, W, 40, 0xa2bfe8a1);\n    RNDr(S, W, 41, 0xa81a664b);\n    RNDr(S, W, 42, 0xc24b8b70);\n    RNDr(S, W, 43, 0xc76c51a3);\n    RNDr(S, W, 44, 0xd192e819);\n    RNDr(S, W, 45, 0xd6990624);\n    RNDr(S, W, 46, 0xf40e3585);\n    RNDr(S, W, 47, 0x106aa070);\n    RNDr(S, W, 48, 0x19a4c116);\n    RNDr(S, W, 49, 0x1e376c08);\n    RNDr(S, W, 50, 0x2748774c);\n    RNDr(S, W, 51, 0x34b0bcb5);\n    RNDr(S, W, 52, 0x391c0cb3);\n    RNDr(S, W, 53, 0x4ed8aa4a);\n    RNDr(S, W, 54, 0x5b9cca4f);\n    RNDr(S, W, 55, 0x682e6ff3);\n    RNDr(S, W, 56, 0x748f82ee);\n    RNDr(S, W, 57, 0x78a5636f);\n    RNDr(S, W, 58, 0x84c87814);\n    RNDr(S, W, 59, 0x8cc70208);\n    RNDr(S, W, 60, 0x90befffa);\n    RNDr(S, W, 61, 0xa4506ceb);\n    RNDr(S, W, 62, 0xbef9a3f7);\n    RNDr(S, W, 63, 0xc67178f2);\n\n    for (i = 0; i < 8; i++) {\n        state[i] += S[i];\n    }\n\n    sodium_memzero((void *) W, sizeof W);\n    sodium_memzero((void *) S, sizeof S);\n    sodium_memzero((void *) &t0, sizeof t0);\n    sodium_memzero((void *) &t1, sizeof t1);\n}\n\nstatic unsigned char PAD[64] = {\n    0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\n\nstatic void\nSHA256_Pad(crypto_hash_sha256_state *state)\n{\n    unsigned char len[8];\n    uint32_t r, plen;\n\n    be64enc(len, state->count);\n\n    r = (state->count >> 3) & 0x3f;\n    plen = (r < 56) ? (56 - r) : (120 - r);\n    crypto_hash_sha256_update(state, PAD, (unsigned long long) plen);\n\n    crypto_hash_sha256_update(state, len, 8);\n}\n\nint\ncrypto_hash_sha256_init(crypto_hash_sha256_state *state)\n{\n    static const uint32_t sha256_initstate[8] = {\n        0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a,\n        0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19\n    };\n\n    state->count = (uint64_t) 0U;\n    memcpy(state->state, sha256_initstate, sizeof sha256_initstate);\n\n    return 0;\n}\n\nint\ncrypto_hash_sha256_update(crypto_hash_sha256_state *state,\n                          const unsigned char *in,\n                          unsigned long long inlen)\n{\n    uint32_t r;\n\n    if (inlen <= 0U) {\n        return 0;\n    }\n    r = (state->count >> 3) & 0x3f;\n    state->count += (uint64_t)(inlen) << 3;\n\n    if (inlen < 64 - r) {\n        memcpy(&state->buf[r], in, inlen);\n        return 0;\n    }\n    memcpy(&state->buf[r], in, 64 - r);\n    SHA256_Transform(state->state, state->buf);\n    in += 64 - r;\n    inlen -= 64 - r;\n\n    while (inlen >= 64) {\n        SHA256_Transform(state->state, in);\n        in += 64;\n        inlen -= 64;\n    }\n    memcpy(state->buf, in, inlen);\n\n    return 0;\n}\n\nint\ncrypto_hash_sha256_final(crypto_hash_sha256_state *state,\n                         unsigned char *out)\n{\n    SHA256_Pad(state);\n    be32enc_vect(out, state->state, 32);\n    sodium_memzero((void *) state, sizeof *state);\n\n    return 0;\n}\n\nint\ncrypto_hash_sha256(unsigned char *out, const unsigned char *in,\n                   unsigned long long inlen)\n{\n    crypto_hash_sha256_state state;\n\n    crypto_hash_sha256_init(&state);\n    crypto_hash_sha256_update(&state, in, inlen);\n    crypto_hash_sha256_final(&state, out);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_hash/sha256/hash_sha256_api.c",
    "content": "#include \"crypto_hash_sha256.h\"\n\nsize_t\ncrypto_hash_sha256_bytes(void) {\n    return crypto_hash_sha256_BYTES;\n}\n\nsize_t\ncrypto_hash_sha256_statebytes(void) {\n    return sizeof(crypto_hash_sha256_state);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_hash/sha512/cp/hash_sha512.c",
    "content": "\n/*-\n * Copyright 2005,2007,2009 Colin Percival\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n */\n\n#include \"crypto_hash_sha512.h\"\n#include \"utils.h\"\n\n#include <sys/types.h>\n\n#include <limits.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n/* Avoid namespace collisions with BSD <sys/endian.h>. */\n#define be64dec _sha512_be64dec\n#define be64enc _sha512_be64enc\n\nstatic inline uint64_t\nbe64dec(const void *pp)\n{\n    const uint8_t *p = (uint8_t const *)pp;\n\n    return ((uint64_t)(p[7]) + ((uint64_t)(p[6]) << 8) +\n            ((uint64_t)(p[5]) << 16) + ((uint64_t)(p[4]) << 24) +\n            ((uint64_t)(p[3]) << 32) + ((uint64_t)(p[2]) << 40) +\n            ((uint64_t)(p[1]) << 48) + ((uint64_t)(p[0]) << 56));\n}\n\nstatic inline void\nbe64enc(void *pp, uint64_t x)\n{\n    uint8_t *p = (uint8_t *)pp;\n\n    p[7] = x & 0xff;\n    p[6] = (x >> 8) & 0xff;\n    p[5] = (x >> 16) & 0xff;\n    p[4] = (x >> 24) & 0xff;\n    p[3] = (x >> 32) & 0xff;\n    p[2] = (x >> 40) & 0xff;\n    p[1] = (x >> 48) & 0xff;\n    p[0] = (x >> 56) & 0xff;\n}\n\nstatic void\nbe64enc_vect(unsigned char *dst, const uint64_t *src, size_t len)\n{\n    size_t i;\n\n    for (i = 0; i < len / 8; i++) {\n        be64enc(dst + i * 8, src[i]);\n    }\n}\n\nstatic void\nbe64dec_vect(uint64_t *dst, const unsigned char *src, size_t len)\n{\n    size_t i;\n\n    for (i = 0; i < len / 8; i++) {\n        dst[i] = be64dec(src + i * 8);\n    }\n}\n\n#define Ch(x, y, z)     ((x & (y ^ z)) ^ z)\n#define Maj(x, y, z)    ((x & (y | z)) | (y & z))\n#define SHR(x, n)       (x >> n)\n#define ROTR(x, n)      ((x >> n) | (x << (64 - n)))\n#define S0(x)           (ROTR(x, 28) ^ ROTR(x, 34) ^ ROTR(x, 39))\n#define S1(x)           (ROTR(x, 14) ^ ROTR(x, 18) ^ ROTR(x, 41))\n#define s0(x)           (ROTR(x, 1) ^ ROTR(x, 8) ^ SHR(x, 7))\n#define s1(x)           (ROTR(x, 19) ^ ROTR(x, 61) ^ SHR(x, 6))\n\n#define RND(a, b, c, d, e, f, g, h, k)              \\\n    t0 = h + S1(e) + Ch(e, f, g) + k;               \\\n    t1 = S0(a) + Maj(a, b, c);                      \\\n    d += t0;                                        \\\n    h  = t0 + t1;\n\n#define RNDr(S, W, i, k)                    \\\n    RND(S[(80 - i) % 8], S[(81 - i) % 8],   \\\n        S[(82 - i) % 8], S[(83 - i) % 8],   \\\n        S[(84 - i) % 8], S[(85 - i) % 8],   \\\n        S[(86 - i) % 8], S[(87 - i) % 8],   \\\n        W[i] + k)\n\nstatic void\nSHA512_Transform(uint64_t *state, const unsigned char block[128])\n{\n    uint64_t W[80];\n    uint64_t S[8];\n    uint64_t t0, t1;\n    int i;\n\n    be64dec_vect(W, block, 128);\n    for (i = 16; i < 80; i++) {\n        W[i] = s1(W[i - 2]) + W[i - 7] + s0(W[i - 15]) + W[i - 16];\n    }\n\n    memcpy(S, state, 64);\n\n    RNDr(S, W, 0, 0x428a2f98d728ae22ULL);\n    RNDr(S, W, 1, 0x7137449123ef65cdULL);\n    RNDr(S, W, 2, 0xb5c0fbcfec4d3b2fULL);\n    RNDr(S, W, 3, 0xe9b5dba58189dbbcULL);\n    RNDr(S, W, 4, 0x3956c25bf348b538ULL);\n    RNDr(S, W, 5, 0x59f111f1b605d019ULL);\n    RNDr(S, W, 6, 0x923f82a4af194f9bULL);\n    RNDr(S, W, 7, 0xab1c5ed5da6d8118ULL);\n    RNDr(S, W, 8, 0xd807aa98a3030242ULL);\n    RNDr(S, W, 9, 0x12835b0145706fbeULL);\n    RNDr(S, W, 10, 0x243185be4ee4b28cULL);\n    RNDr(S, W, 11, 0x550c7dc3d5ffb4e2ULL);\n    RNDr(S, W, 12, 0x72be5d74f27b896fULL);\n    RNDr(S, W, 13, 0x80deb1fe3b1696b1ULL);\n    RNDr(S, W, 14, 0x9bdc06a725c71235ULL);\n    RNDr(S, W, 15, 0xc19bf174cf692694ULL);\n    RNDr(S, W, 16, 0xe49b69c19ef14ad2ULL);\n    RNDr(S, W, 17, 0xefbe4786384f25e3ULL);\n    RNDr(S, W, 18, 0x0fc19dc68b8cd5b5ULL);\n    RNDr(S, W, 19, 0x240ca1cc77ac9c65ULL);\n    RNDr(S, W, 20, 0x2de92c6f592b0275ULL);\n    RNDr(S, W, 21, 0x4a7484aa6ea6e483ULL);\n    RNDr(S, W, 22, 0x5cb0a9dcbd41fbd4ULL);\n    RNDr(S, W, 23, 0x76f988da831153b5ULL);\n    RNDr(S, W, 24, 0x983e5152ee66dfabULL);\n    RNDr(S, W, 25, 0xa831c66d2db43210ULL);\n    RNDr(S, W, 26, 0xb00327c898fb213fULL);\n    RNDr(S, W, 27, 0xbf597fc7beef0ee4ULL);\n    RNDr(S, W, 28, 0xc6e00bf33da88fc2ULL);\n    RNDr(S, W, 29, 0xd5a79147930aa725ULL);\n    RNDr(S, W, 30, 0x06ca6351e003826fULL);\n    RNDr(S, W, 31, 0x142929670a0e6e70ULL);\n    RNDr(S, W, 32, 0x27b70a8546d22ffcULL);\n    RNDr(S, W, 33, 0x2e1b21385c26c926ULL);\n    RNDr(S, W, 34, 0x4d2c6dfc5ac42aedULL);\n    RNDr(S, W, 35, 0x53380d139d95b3dfULL);\n    RNDr(S, W, 36, 0x650a73548baf63deULL);\n    RNDr(S, W, 37, 0x766a0abb3c77b2a8ULL);\n    RNDr(S, W, 38, 0x81c2c92e47edaee6ULL);\n    RNDr(S, W, 39, 0x92722c851482353bULL);\n    RNDr(S, W, 40, 0xa2bfe8a14cf10364ULL);\n    RNDr(S, W, 41, 0xa81a664bbc423001ULL);\n    RNDr(S, W, 42, 0xc24b8b70d0f89791ULL);\n    RNDr(S, W, 43, 0xc76c51a30654be30ULL);\n    RNDr(S, W, 44, 0xd192e819d6ef5218ULL);\n    RNDr(S, W, 45, 0xd69906245565a910ULL);\n    RNDr(S, W, 46, 0xf40e35855771202aULL);\n    RNDr(S, W, 47, 0x106aa07032bbd1b8ULL);\n    RNDr(S, W, 48, 0x19a4c116b8d2d0c8ULL);\n    RNDr(S, W, 49, 0x1e376c085141ab53ULL);\n    RNDr(S, W, 50, 0x2748774cdf8eeb99ULL);\n    RNDr(S, W, 51, 0x34b0bcb5e19b48a8ULL);\n    RNDr(S, W, 52, 0x391c0cb3c5c95a63ULL);\n    RNDr(S, W, 53, 0x4ed8aa4ae3418acbULL);\n    RNDr(S, W, 54, 0x5b9cca4f7763e373ULL);\n    RNDr(S, W, 55, 0x682e6ff3d6b2b8a3ULL);\n    RNDr(S, W, 56, 0x748f82ee5defb2fcULL);\n    RNDr(S, W, 57, 0x78a5636f43172f60ULL);\n    RNDr(S, W, 58, 0x84c87814a1f0ab72ULL);\n    RNDr(S, W, 59, 0x8cc702081a6439ecULL);\n    RNDr(S, W, 60, 0x90befffa23631e28ULL);\n    RNDr(S, W, 61, 0xa4506cebde82bde9ULL);\n    RNDr(S, W, 62, 0xbef9a3f7b2c67915ULL);\n    RNDr(S, W, 63, 0xc67178f2e372532bULL);\n    RNDr(S, W, 64, 0xca273eceea26619cULL);\n    RNDr(S, W, 65, 0xd186b8c721c0c207ULL);\n    RNDr(S, W, 66, 0xeada7dd6cde0eb1eULL);\n    RNDr(S, W, 67, 0xf57d4f7fee6ed178ULL);\n    RNDr(S, W, 68, 0x06f067aa72176fbaULL);\n    RNDr(S, W, 69, 0x0a637dc5a2c898a6ULL);\n    RNDr(S, W, 70, 0x113f9804bef90daeULL);\n    RNDr(S, W, 71, 0x1b710b35131c471bULL);\n    RNDr(S, W, 72, 0x28db77f523047d84ULL);\n    RNDr(S, W, 73, 0x32caab7b40c72493ULL);\n    RNDr(S, W, 74, 0x3c9ebe0a15c9bebcULL);\n    RNDr(S, W, 75, 0x431d67c49c100d4cULL);\n    RNDr(S, W, 76, 0x4cc5d4becb3e42b6ULL);\n    RNDr(S, W, 77, 0x597f299cfc657e2aULL);\n    RNDr(S, W, 78, 0x5fcb6fab3ad6faecULL);\n    RNDr(S, W, 79, 0x6c44198c4a475817ULL);\n\n    for (i = 0; i < 8; i++) {\n        state[i] += S[i];\n    }\n\n    sodium_memzero((void *) W, sizeof W);\n    sodium_memzero((void *) S, sizeof S);\n    sodium_memzero((void *) &t0, sizeof t0);\n    sodium_memzero((void *) &t1, sizeof t1);\n}\n\nstatic unsigned char PAD[128] = {\n    0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,\n    0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0\n};\n\nstatic void\nSHA512_Pad(crypto_hash_sha512_state *state)\n{\n    unsigned char len[16];\n    uint64_t r, plen;\n\n    be64enc_vect(len, state->count, 16);\n\n    r = (state->count[1] >> 3) & 0x7f;\n    plen = (r < 112) ? (112 - r) : (240 - r);\n    crypto_hash_sha512_update(state, PAD, (unsigned long long) plen);\n\n    crypto_hash_sha512_update(state, len, 16);\n}\n\nint\ncrypto_hash_sha512_init(crypto_hash_sha512_state *state)\n{\n    static const uint64_t sha512_initstate[8] = {\n        0x6a09e667f3bcc908ULL, 0xbb67ae8584caa73bULL,\n        0x3c6ef372fe94f82bULL, 0xa54ff53a5f1d36f1ULL,\n        0x510e527fade682d1ULL, 0x9b05688c2b3e6c1fULL,\n        0x1f83d9abfb41bd6bULL, 0x5be0cd19137e2179ULL\n    };\n\n    state->count[0] = state->count[1] = (uint64_t) 0U;\n    memcpy(state->state, sha512_initstate, sizeof sha512_initstate);\n\n    return 0;\n}\n\nint\ncrypto_hash_sha512_update(crypto_hash_sha512_state *state,\n                          const unsigned char *in,\n                          unsigned long long inlen)\n{\n    uint64_t bitlen[2];\n    uint64_t r;\n    const unsigned char *src = in;\n\n    r = (state->count[1] >> 3) & 0x7f;\n\n    bitlen[1] = ((uint64_t)inlen) << 3;\n    bitlen[0] = ((uint64_t)inlen) >> 61;\n\n    /* LCOV_EXCL_START */\n    if ((state->count[1] += bitlen[1]) < bitlen[1]) {\n        state->count[0]++;\n    }\n    /* LCOV_EXCL_STOP */\n    state->count[0] += bitlen[0];\n\n    if (inlen < 128 - r) {\n        memcpy(&state->buf[r], src, inlen);\n        return 0;\n    }\n    memcpy(&state->buf[r], src, 128 - r);\n    SHA512_Transform(state->state, state->buf);\n    src += 128 - r;\n    inlen -= 128 - r;\n\n    while (inlen >= 128) {\n        SHA512_Transform(state->state, src);\n        src += 128;\n        inlen -= 128;\n    }\n    memcpy(state->buf, src, inlen);\n\n    return 0;\n}\n\nint\ncrypto_hash_sha512_final(crypto_hash_sha512_state *state,\n                         unsigned char *out)\n{\n    SHA512_Pad(state);\n    be64enc_vect(out, state->state, 64);\n    sodium_memzero((void *) state, sizeof *state);\n\n    return 0;\n}\n\nint\ncrypto_hash_sha512(unsigned char *out, const unsigned char *in,\n                   unsigned long long inlen)\n{\n    crypto_hash_sha512_state state;\n\n    crypto_hash_sha512_init(&state);\n    crypto_hash_sha512_update(&state, in, inlen);\n    crypto_hash_sha512_final(&state, out);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_hash/sha512/hash_sha512_api.c",
    "content": "#include \"crypto_hash_sha512.h\"\n\nsize_t\ncrypto_hash_sha512_bytes(void) {\n    return crypto_hash_sha512_BYTES;\n}\n\nsize_t\ncrypto_hash_sha512_statebytes(void) {\n    return sizeof(crypto_hash_sha512_state);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_onetimeauth/crypto_onetimeauth.c",
    "content": "\n#include \"crypto_onetimeauth.h\"\n\nsize_t\ncrypto_onetimeauth_statebytes(void)\n{\n    return sizeof(crypto_onetimeauth_state);\n}\n\nsize_t\ncrypto_onetimeauth_bytes(void)\n{\n    return crypto_onetimeauth_BYTES;\n}\n\nsize_t\ncrypto_onetimeauth_keybytes(void)\n{\n    return crypto_onetimeauth_KEYBYTES;\n}\n\nint\ncrypto_onetimeauth(unsigned char *out, const unsigned char *in,\n                   unsigned long long inlen, const unsigned char *k)\n{\n    return crypto_onetimeauth_poly1305(out, in, inlen, k);\n}\n\nint\ncrypto_onetimeauth_verify(const unsigned char *h, const unsigned char *in,\n                          unsigned long long inlen, const unsigned char *k)\n{\n    return crypto_onetimeauth_poly1305_verify(h, in, inlen, k);\n}\n\nint\ncrypto_onetimeauth_init(crypto_onetimeauth_state *state,\n                        const unsigned char *key)\n{\n    return crypto_onetimeauth_poly1305_init\n        ((crypto_onetimeauth_poly1305_state *) state, key);\n}\n\nint\ncrypto_onetimeauth_update(crypto_onetimeauth_state *state,\n                          const unsigned char *in,\n                          unsigned long long inlen)\n{\n    return crypto_onetimeauth_poly1305_update\n        ((crypto_onetimeauth_poly1305_state *) state, in, inlen);\n}\n\nint\ncrypto_onetimeauth_final(crypto_onetimeauth_state *state,\n                         unsigned char *out)\n{\n    return crypto_onetimeauth_poly1305_final\n        ((crypto_onetimeauth_poly1305_state *) state, out);\n}\n\nconst char *\ncrypto_onetimeauth_primitive(void)\n{\n    return crypto_onetimeauth_PRIMITIVE;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna.c",
    "content": "\n#include \"crypto_verify_16.h\"\n#include \"utils.h\"\n#include \"poly1305_donna.h\"\n#ifdef HAVE_TI_MODE\n# include \"poly1305_donna64.h\"\n#else\n# include \"poly1305_donna32.h\"\n#endif\n#include \"../onetimeauth_poly1305.h\"\n\nstatic void\npoly1305_update(poly1305_state_internal_t *st, const unsigned char *m,\n                unsigned long long bytes)\n{\n    unsigned long long i;\n\n    /* handle leftover */\n    if (st->leftover) {\n        unsigned long long want = (poly1305_block_size - st->leftover);\n\n        if (want > bytes)\n            want = bytes;\n        for (i = 0; i < want; i++)\n            st->buffer[st->leftover + i] = m[i];\n        bytes -= want;\n        m += want;\n        st->leftover += want;\n        if (st->leftover < poly1305_block_size)\n            return;\n        poly1305_blocks(st, st->buffer, poly1305_block_size);\n        st->leftover = 0;\n    }\n\n    /* process full blocks */\n    if (bytes >= poly1305_block_size) {\n        unsigned long long want = (bytes & ~(poly1305_block_size - 1));\n\n        poly1305_blocks(st, m, want);\n        m += want;\n        bytes -= want;\n    }\n\n    /* store leftover */\n    if (bytes) {\n        for (i = 0; i < bytes; i++) {\n            st->buffer[st->leftover + i] = m[i];\n        }\n        st->leftover += bytes;\n    }\n}\n\nstatic int\ncrypto_onetimeauth_poly1305_donna(unsigned char *out, const unsigned char *m,\n                                  unsigned long long inlen,\n                                  const unsigned char *key)\n{\n    CRYPTO_ALIGN(64) poly1305_state_internal_t state;\n\n    poly1305_init(&state, key);\n    poly1305_update(&state, m, inlen);\n    poly1305_finish(&state, out);\n\n    return 0;\n}\n\nstatic int\ncrypto_onetimeauth_poly1305_donna_init(crypto_onetimeauth_poly1305_state *state,\n                                       const unsigned char *key)\n{\n    (void) sizeof(int[sizeof (crypto_onetimeauth_poly1305_state) >=\n                      sizeof (poly1305_state_internal_t) ? 1 : -1]);\n    poly1305_init((poly1305_state_internal_t *)(void *) state, key);\n\n    return 0;\n}\n\nstatic int\ncrypto_onetimeauth_poly1305_donna_update(crypto_onetimeauth_poly1305_state *state,\n                                         const unsigned char *in,\n                                         unsigned long long inlen)\n{\n    poly1305_update((poly1305_state_internal_t *)(void *) state, in, inlen);\n\n    return 0;\n}\n\nstatic int\ncrypto_onetimeauth_poly1305_donna_final(crypto_onetimeauth_poly1305_state *state,\n                                        unsigned char *out)\n{\n    poly1305_finish((poly1305_state_internal_t *)(void *) state, out);\n\n    return 0;\n}\n\nstatic int\ncrypto_onetimeauth_poly1305_donna_verify(const unsigned char *h,\n                                         const unsigned char *in,\n                                         unsigned long long inlen,\n                                         const unsigned char *k)\n{\n    unsigned char correct[16];\n\n    crypto_onetimeauth_poly1305_donna(correct,in,inlen,k);\n\n    return crypto_verify_16(h,correct);\n}\n\nstruct crypto_onetimeauth_poly1305_implementation\ncrypto_onetimeauth_poly1305_donna_implementation = {\n    SODIUM_C99(.onetimeauth =) crypto_onetimeauth_poly1305_donna,\n    SODIUM_C99(.onetimeauth_verify =) crypto_onetimeauth_poly1305_donna_verify,\n    SODIUM_C99(.onetimeauth_init =) crypto_onetimeauth_poly1305_donna_init,\n    SODIUM_C99(.onetimeauth_update =) crypto_onetimeauth_poly1305_donna_update,\n    SODIUM_C99(.onetimeauth_final =) crypto_onetimeauth_poly1305_donna_final\n};\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna.h",
    "content": "#ifndef poly1305_donna_H\n#define poly1305_donna_H\n\n#include <stddef.h>\n\n#include \"crypto_onetimeauth_poly1305.h\"\n\nextern struct crypto_onetimeauth_poly1305_implementation\n    crypto_onetimeauth_poly1305_donna_implementation;\n\nstatic int crypto_onetimeauth_poly1305_donna(unsigned char *out,\n                                             const unsigned char *in,\n                                             unsigned long long inlen,\n                                             const unsigned char *k);\n\nstatic int crypto_onetimeauth_poly1305_donna_verify(const unsigned char *h,\n                                                    const unsigned char *in,\n                                                    unsigned long long inlen,\n                                                    const unsigned char *k);\n\nstatic int crypto_onetimeauth_poly1305_donna_init(crypto_onetimeauth_poly1305_state *state,\n                                                  const unsigned char *key);\n\nstatic int crypto_onetimeauth_poly1305_donna_update(crypto_onetimeauth_poly1305_state *state,\n                                                    const unsigned char *in,\n                                                    unsigned long long inlen);\n\nstatic int crypto_onetimeauth_poly1305_donna_final(crypto_onetimeauth_poly1305_state *state,\n                                                   unsigned char *out);\n\n#endif /* poly1305_donna_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna32.h",
    "content": "/*\n        poly1305 implementation using 32 bit * 32 bit = 64 bit multiplication and 64 bit addition\n*/\n\n#if defined(_MSC_VER)\n# define POLY1305_NOINLINE __declspec(noinline)\n#elif defined(__GNUC__)\n# define POLY1305_NOINLINE __attribute__((noinline))\n#else\n# define POLY1305_NOINLINE\n#endif\n\n#define poly1305_block_size 16\n\n/* 17 + sizeof(unsigned long long) + 14*sizeof(unsigned long) */\ntypedef struct poly1305_state_internal_t {\n        unsigned long r[5];\n        unsigned long h[5];\n        unsigned long pad[4];\n        unsigned long long leftover;\n        unsigned char buffer[poly1305_block_size];\n        unsigned char final;\n} poly1305_state_internal_t;\n\n/* interpret four 8 bit unsigned integers as a 32 bit unsigned integer in little endian */\nstatic unsigned long\nU8TO32(const unsigned char *p)\n{\n        return\n        (((unsigned long)(p[0] & 0xff)      ) |\n         ((unsigned long)(p[1] & 0xff) <<  8) |\n         ((unsigned long)(p[2] & 0xff) << 16) |\n         ((unsigned long)(p[3] & 0xff) << 24));\n}\n\n/* store a 32 bit unsigned integer as four 8 bit unsigned integers in little endian */\nstatic void\nU32TO8(unsigned char *p, unsigned long v)\n{\n        p[0] = (v      ) & 0xff;\n        p[1] = (v >>  8) & 0xff;\n        p[2] = (v >> 16) & 0xff;\n        p[3] = (v >> 24) & 0xff;\n}\n\nstatic void\npoly1305_init(poly1305_state_internal_t *st, const unsigned char key[32])\n{\n        /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */\n        st->r[0] = (U8TO32(&key[ 0])     ) & 0x3ffffff;\n        st->r[1] = (U8TO32(&key[ 3]) >> 2) & 0x3ffff03;\n        st->r[2] = (U8TO32(&key[ 6]) >> 4) & 0x3ffc0ff;\n        st->r[3] = (U8TO32(&key[ 9]) >> 6) & 0x3f03fff;\n        st->r[4] = (U8TO32(&key[12]) >> 8) & 0x00fffff;\n\n        /* h = 0 */\n        st->h[0] = 0;\n        st->h[1] = 0;\n        st->h[2] = 0;\n        st->h[3] = 0;\n        st->h[4] = 0;\n\n        /* save pad for later */\n        st->pad[0] = U8TO32(&key[16]);\n        st->pad[1] = U8TO32(&key[20]);\n        st->pad[2] = U8TO32(&key[24]);\n        st->pad[3] = U8TO32(&key[28]);\n\n        st->leftover = 0;\n        st->final = 0;\n}\n\nstatic void\npoly1305_blocks(poly1305_state_internal_t *st, const unsigned char *m, unsigned long long bytes)\n{\n        const unsigned long hibit = (st->final) ? 0 : (1 << 24); /* 1 << 128 */\n        unsigned long r0,r1,r2,r3,r4;\n        unsigned long s1,s2,s3,s4;\n        unsigned long h0,h1,h2,h3,h4;\n        unsigned long long d0,d1,d2,d3,d4;\n        unsigned long c;\n\n        r0 = st->r[0];\n        r1 = st->r[1];\n        r2 = st->r[2];\n        r3 = st->r[3];\n        r4 = st->r[4];\n\n        s1 = r1 * 5;\n        s2 = r2 * 5;\n        s3 = r3 * 5;\n        s4 = r4 * 5;\n\n        h0 = st->h[0];\n        h1 = st->h[1];\n        h2 = st->h[2];\n        h3 = st->h[3];\n        h4 = st->h[4];\n\n        while (bytes >= poly1305_block_size) {\n                /* h += m[i] */\n                h0 += (U8TO32(m+ 0)     ) & 0x3ffffff;\n                h1 += (U8TO32(m+ 3) >> 2) & 0x3ffffff;\n                h2 += (U8TO32(m+ 6) >> 4) & 0x3ffffff;\n                h3 += (U8TO32(m+ 9) >> 6) & 0x3ffffff;\n                h4 += (U8TO32(m+12) >> 8) | hibit;\n\n                /* h *= r */\n                d0 = ((unsigned long long)h0 * r0) + ((unsigned long long)h1 * s4) + ((unsigned long long)h2 * s3) + ((unsigned long long)h3 * s2) + ((unsigned long long)h4 * s1);\n                d1 = ((unsigned long long)h0 * r1) + ((unsigned long long)h1 * r0) + ((unsigned long long)h2 * s4) + ((unsigned long long)h3 * s3) + ((unsigned long long)h4 * s2);\n                d2 = ((unsigned long long)h0 * r2) + ((unsigned long long)h1 * r1) + ((unsigned long long)h2 * r0) + ((unsigned long long)h3 * s4) + ((unsigned long long)h4 * s3);\n                d3 = ((unsigned long long)h0 * r3) + ((unsigned long long)h1 * r2) + ((unsigned long long)h2 * r1) + ((unsigned long long)h3 * r0) + ((unsigned long long)h4 * s4);\n                d4 = ((unsigned long long)h0 * r4) + ((unsigned long long)h1 * r3) + ((unsigned long long)h2 * r2) + ((unsigned long long)h3 * r1) + ((unsigned long long)h4 * r0);\n\n                /* (partial) h %= p */\n                              c = (unsigned long)(d0 >> 26); h0 = (unsigned long)d0 & 0x3ffffff;\n                d1 += c;      c = (unsigned long)(d1 >> 26); h1 = (unsigned long)d1 & 0x3ffffff;\n                d2 += c;      c = (unsigned long)(d2 >> 26); h2 = (unsigned long)d2 & 0x3ffffff;\n                d3 += c;      c = (unsigned long)(d3 >> 26); h3 = (unsigned long)d3 & 0x3ffffff;\n                d4 += c;      c = (unsigned long)(d4 >> 26); h4 = (unsigned long)d4 & 0x3ffffff;\n                h0 += c * 5;  c =                (h0 >> 26); h0 =                h0 & 0x3ffffff;\n                h1 += c;\n\n                m += poly1305_block_size;\n                bytes -= poly1305_block_size;\n        }\n\n        st->h[0] = h0;\n        st->h[1] = h1;\n        st->h[2] = h2;\n        st->h[3] = h3;\n        st->h[4] = h4;\n}\n\nstatic POLY1305_NOINLINE void\npoly1305_finish(poly1305_state_internal_t *st, unsigned char mac[16])\n{\n        unsigned long h0,h1,h2,h3,h4,c;\n        unsigned long g0,g1,g2,g3,g4;\n        unsigned long long f;\n        unsigned long mask;\n\n        /* process the remaining block */\n        if (st->leftover) {\n                unsigned long long i = st->leftover;\n                st->buffer[i++] = 1;\n                for (; i < poly1305_block_size; i++)\n                        st->buffer[i] = 0;\n                st->final = 1;\n                poly1305_blocks(st, st->buffer, poly1305_block_size);\n        }\n\n        /* fully carry h */\n        h0 = st->h[0];\n        h1 = st->h[1];\n        h2 = st->h[2];\n        h3 = st->h[3];\n        h4 = st->h[4];\n\n                     c = h1 >> 26; h1 = h1 & 0x3ffffff;\n        h2 +=     c; c = h2 >> 26; h2 = h2 & 0x3ffffff;\n        h3 +=     c; c = h3 >> 26; h3 = h3 & 0x3ffffff;\n        h4 +=     c; c = h4 >> 26; h4 = h4 & 0x3ffffff;\n        h0 += c * 5; c = h0 >> 26; h0 = h0 & 0x3ffffff;\n        h1 +=     c;\n\n        /* compute h + -p */\n        g0 = h0 + 5; c = g0 >> 26; g0 &= 0x3ffffff;\n        g1 = h1 + c; c = g1 >> 26; g1 &= 0x3ffffff;\n        g2 = h2 + c; c = g2 >> 26; g2 &= 0x3ffffff;\n        g3 = h3 + c; c = g3 >> 26; g3 &= 0x3ffffff;\n        g4 = h4 + c - (1 << 26);\n\n        /* select h if h < p, or h + -p if h >= p */\n        mask = (g4 >> ((sizeof(unsigned long) * 8) - 1)) - 1;\n        g0 &= mask;\n        g1 &= mask;\n        g2 &= mask;\n        g3 &= mask;\n        g4 &= mask;\n        mask = ~mask;\n        h0 = (h0 & mask) | g0;\n        h1 = (h1 & mask) | g1;\n        h2 = (h2 & mask) | g2;\n        h3 = (h3 & mask) | g3;\n        h4 = (h4 & mask) | g4;\n\n        /* h = h % (2^128) */\n        h0 = ((h0      ) | (h1 << 26)) & 0xffffffff;\n        h1 = ((h1 >>  6) | (h2 << 20)) & 0xffffffff;\n        h2 = ((h2 >> 12) | (h3 << 14)) & 0xffffffff;\n        h3 = ((h3 >> 18) | (h4 <<  8)) & 0xffffffff;\n\n        /* mac = (h + pad) % (2^128) */\n        f = (unsigned long long)h0 + st->pad[0]            ; h0 = (unsigned long)f;\n        f = (unsigned long long)h1 + st->pad[1] + (f >> 32); h1 = (unsigned long)f;\n        f = (unsigned long long)h2 + st->pad[2] + (f >> 32); h2 = (unsigned long)f;\n        f = (unsigned long long)h3 + st->pad[3] + (f >> 32); h3 = (unsigned long)f;\n\n        U32TO8(mac +  0, h0);\n        U32TO8(mac +  4, h1);\n        U32TO8(mac +  8, h2);\n        U32TO8(mac + 12, h3);\n\n        /* zero out the state */\n        sodium_memzero((void *)st, sizeof *st);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_onetimeauth/poly1305/donna/poly1305_donna64.h",
    "content": "/*\n        poly1305 implementation using 64 bit * 64 bit = 128 bit multiplication and 128 bit addition\n*/\n\n#if defined(__SIZEOF_INT128__)\ntypedef unsigned __int128 uint128_t;\n#else\ntypedef unsigned uint128_t __attribute__((mode(TI)));\n#endif\n\n#define MUL(out, x, y) out = ((uint128_t)x * y)\n#define ADD(out, in) out += in\n#define ADDLO(out, in) out += in\n#define SHR(in, shift) (unsigned long long)(in >> (shift))\n#define LO(in) (unsigned long long)(in)\n\n#if defined(_MSC_VER)\n# define POLY1305_NOINLINE __declspec(noinline)\n#elif defined(__GNUC__)\n# define POLY1305_NOINLINE __attribute__((noinline))\n#else\n# define POLY1305_NOINLINE\n#endif\n\n#define poly1305_block_size 16\n\n/* 17 + sizeof(unsigned long long) + 8*sizeof(unsigned long long) */\ntypedef struct poly1305_state_internal_t {\n        unsigned long long r[3];\n        unsigned long long h[3];\n        unsigned long long pad[2];\n        unsigned long long leftover;\n        unsigned char buffer[poly1305_block_size];\n        unsigned char final;\n} poly1305_state_internal_t;\n\n/* interpret eight 8 bit unsigned integers as a 64 bit unsigned integer in little endian */\nstatic unsigned long long\nU8TO64(const unsigned char *p)\n{\n        return\n           (((unsigned long long)(p[0] & 0xff)      ) |\n            ((unsigned long long)(p[1] & 0xff) <<  8) |\n            ((unsigned long long)(p[2] & 0xff) << 16) |\n            ((unsigned long long)(p[3] & 0xff) << 24) |\n            ((unsigned long long)(p[4] & 0xff) << 32) |\n            ((unsigned long long)(p[5] & 0xff) << 40) |\n            ((unsigned long long)(p[6] & 0xff) << 48) |\n            ((unsigned long long)(p[7] & 0xff) << 56));\n}\n\n/* store a 64 bit unsigned integer as eight 8 bit unsigned integers in little endian */\nstatic void\nU64TO8(unsigned char *p, unsigned long long v)\n{\n        p[0] = (v      ) & 0xff;\n        p[1] = (v >>  8) & 0xff;\n        p[2] = (v >> 16) & 0xff;\n        p[3] = (v >> 24) & 0xff;\n        p[4] = (v >> 32) & 0xff;\n        p[5] = (v >> 40) & 0xff;\n        p[6] = (v >> 48) & 0xff;\n        p[7] = (v >> 56) & 0xff;\n}\n\nstatic void\npoly1305_init(poly1305_state_internal_t *st, const unsigned char key[32])\n{\n        unsigned long long t0,t1;\n\n        /* r &= 0xffffffc0ffffffc0ffffffc0fffffff */\n        t0 = U8TO64(&key[0]);\n        t1 = U8TO64(&key[8]);\n\n        st->r[0] = ( t0                    ) & 0xffc0fffffff;\n        st->r[1] = ((t0 >> 44) | (t1 << 20)) & 0xfffffc0ffff;\n        st->r[2] = ((t1 >> 24)             ) & 0x00ffffffc0f;\n\n        /* h = 0 */\n        st->h[0] = 0;\n        st->h[1] = 0;\n        st->h[2] = 0;\n\n        /* save pad for later */\n        st->pad[0] = U8TO64(&key[16]);\n        st->pad[1] = U8TO64(&key[24]);\n\n        st->leftover = 0;\n        st->final = 0;\n}\n\nstatic void\npoly1305_blocks(poly1305_state_internal_t *st, const unsigned char *m, unsigned long long bytes)\n{\n        const unsigned long long hibit = (st->final) ? 0 : ((unsigned long long)1 << 40); /* 1 << 128 */\n        unsigned long long r0,r1,r2;\n        unsigned long long s1,s2;\n        unsigned long long h0,h1,h2;\n        unsigned long long c;\n        uint128_t d0,d1,d2,d;\n\n        r0 = st->r[0];\n        r1 = st->r[1];\n        r2 = st->r[2];\n\n        h0 = st->h[0];\n        h1 = st->h[1];\n        h2 = st->h[2];\n\n        s1 = r1 * (5 << 2);\n        s2 = r2 * (5 << 2);\n\n        while (bytes >= poly1305_block_size) {\n                unsigned long long t0,t1;\n\n                /* h += m[i] */\n                t0 = U8TO64(&m[0]);\n                t1 = U8TO64(&m[8]);\n\n                h0 += (( t0                    ) & 0xfffffffffff);\n                h1 += (((t0 >> 44) | (t1 << 20)) & 0xfffffffffff);\n                h2 += (((t1 >> 24)             ) & 0x3ffffffffff) | hibit;\n\n                /* h *= r */\n                MUL(d0, h0, r0); MUL(d, h1, s2); ADD(d0, d); MUL(d, h2, s1); ADD(d0, d);\n                MUL(d1, h0, r1); MUL(d, h1, r0); ADD(d1, d); MUL(d, h2, s2); ADD(d1, d);\n                MUL(d2, h0, r2); MUL(d, h1, r1); ADD(d2, d); MUL(d, h2, r0); ADD(d2, d);\n\n                /* (partial) h %= p */\n                              c = SHR(d0, 44); h0 = LO(d0) & 0xfffffffffff;\n                ADDLO(d1, c); c = SHR(d1, 44); h1 = LO(d1) & 0xfffffffffff;\n                ADDLO(d2, c); c = SHR(d2, 42); h2 = LO(d2) & 0x3ffffffffff;\n                h0  += c * 5; c = (h0 >> 44);  h0 =    h0  & 0xfffffffffff;\n                h1  += c;\n\n                m += poly1305_block_size;\n                bytes -= poly1305_block_size;\n        }\n\n        st->h[0] = h0;\n        st->h[1] = h1;\n        st->h[2] = h2;\n}\n\n\nstatic POLY1305_NOINLINE void\npoly1305_finish(poly1305_state_internal_t *st, unsigned char mac[16])\n{\n        unsigned long long h0,h1,h2,c;\n        unsigned long long g0,g1,g2;\n        unsigned long long t0,t1;\n\n        /* process the remaining block */\n        if (st->leftover) {\n                unsigned long long i = st->leftover;\n                st->buffer[i] = 1;\n                for (i = i + 1; i < poly1305_block_size; i++)\n                        st->buffer[i] = 0;\n                st->final = 1;\n                poly1305_blocks(st, st->buffer, poly1305_block_size);\n        }\n\n        /* fully carry h */\n        h0 = st->h[0];\n        h1 = st->h[1];\n        h2 = st->h[2];\n\n                     c = (h1 >> 44); h1 &= 0xfffffffffff;\n        h2 += c;     c = (h2 >> 42); h2 &= 0x3ffffffffff;\n        h0 += c * 5; c = (h0 >> 44); h0 &= 0xfffffffffff;\n        h1 += c;         c = (h1 >> 44); h1 &= 0xfffffffffff;\n        h2 += c;     c = (h2 >> 42); h2 &= 0x3ffffffffff;\n        h0 += c * 5; c = (h0 >> 44); h0 &= 0xfffffffffff;\n        h1 += c;\n\n        /* compute h + -p */\n        g0 = h0 + 5; c = (g0 >> 44); g0 &= 0xfffffffffff;\n        g1 = h1 + c; c = (g1 >> 44); g1 &= 0xfffffffffff;\n        g2 = h2 + c - ((unsigned long long)1 << 42);\n\n        /* select h if h < p, or h + -p if h >= p */\n        c = (g2 >> ((sizeof(unsigned long long) * 8) - 1)) - 1;\n        g0 &= c;\n        g1 &= c;\n        g2 &= c;\n        c = ~c;\n        h0 = (h0 & c) | g0;\n        h1 = (h1 & c) | g1;\n        h2 = (h2 & c) | g2;\n\n        /* h = (h + pad) */\n        t0 = st->pad[0];\n        t1 = st->pad[1];\n\n        h0 += (( t0                    ) & 0xfffffffffff)    ; c = (h0 >> 44); h0 &= 0xfffffffffff;\n        h1 += (((t0 >> 44) | (t1 << 20)) & 0xfffffffffff) + c; c = (h1 >> 44); h1 &= 0xfffffffffff;\n        h2 += (((t1 >> 24)             ) & 0x3ffffffffff) + c;                 h2 &= 0x3ffffffffff;\n\n        /* mac = h % (2^128) */\n        h0 = ((h0      ) | (h1 << 44));\n        h1 = ((h1 >> 20) | (h2 << 24));\n\n        U64TO8(&mac[0], h0);\n        U64TO8(&mac[8], h1);\n\n        /* zero out the state */\n        sodium_memzero((void *)st, sizeof *st);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_onetimeauth/poly1305/onetimeauth_poly1305.c",
    "content": "\n#include \"crypto_onetimeauth_poly1305.h\"\n#include \"onetimeauth_poly1305.h\"\n#include \"runtime.h\"\n#include \"donna/poly1305_donna.h\"\n#if defined(HAVE_TI_MODE) && defined(HAVE_EMMINTRIN_H)\n# include \"sse2/poly1305_sse2.h\"\n#endif\n\nstatic const crypto_onetimeauth_poly1305_implementation *implementation =\n    &crypto_onetimeauth_poly1305_donna_implementation;\n\nint\ncrypto_onetimeauth_poly1305(unsigned char *out, const unsigned char *in,\n                            unsigned long long inlen, const unsigned char *k)\n{\n    return implementation->onetimeauth(out, in, inlen, k);\n}\n\nint\ncrypto_onetimeauth_poly1305_verify(const unsigned char *h,\n                                   const unsigned char *in,\n                                   unsigned long long inlen,\n                                   const unsigned char *k)\n{\n    return implementation->onetimeauth_verify(h, in, inlen, k);\n}\n\nint\ncrypto_onetimeauth_poly1305_init(crypto_onetimeauth_poly1305_state *state,\n                                 const unsigned char *key)\n{\n    return implementation->onetimeauth_init(state, key);\n}\n\nint\ncrypto_onetimeauth_poly1305_update(crypto_onetimeauth_poly1305_state *state,\n                                   const unsigned char *in,\n                                   unsigned long long inlen)\n{\n    return implementation->onetimeauth_update(state, in, inlen);\n}\n\nint\ncrypto_onetimeauth_poly1305_final(crypto_onetimeauth_poly1305_state *state,\n                                  unsigned char *out)\n{\n    return implementation->onetimeauth_final(state, out);\n}\n\nsize_t\ncrypto_onetimeauth_poly1305_bytes(void) {\n    return crypto_onetimeauth_poly1305_BYTES;\n}\n\nsize_t\ncrypto_onetimeauth_poly1305_keybytes(void) {\n    return crypto_onetimeauth_poly1305_KEYBYTES;\n}\n\nint\n_crypto_onetimeauth_poly1305_pick_best_implementation(void)\n{\n    implementation = &crypto_onetimeauth_poly1305_donna_implementation;\n#if defined(HAVE_TI_MODE) && defined(HAVE_EMMINTRIN_H)\n    if (sodium_runtime_has_sse2()) {\n        implementation = &crypto_onetimeauth_poly1305_sse2_implementation;\n    }\n#endif\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_onetimeauth/poly1305/onetimeauth_poly1305.h",
    "content": "\n#ifndef onetimeauth_poly1305_H\n#define onetimeauth_poly1305_H\n\ntypedef struct crypto_onetimeauth_poly1305_implementation {\n    int (*onetimeauth)(unsigned char *out,\n                       const unsigned char *in,\n                       unsigned long long inlen,\n                       const unsigned char *k);\n    int (*onetimeauth_verify)(const unsigned char *h,\n                              const unsigned char *in,\n                              unsigned long long inlen,\n                              const unsigned char *k);\n    int (*onetimeauth_init)(crypto_onetimeauth_poly1305_state *state,\n                            const unsigned char *key);\n    int (*onetimeauth_update)(crypto_onetimeauth_poly1305_state *state,\n                              const unsigned char *in,\n                              unsigned long long inlen);\n    int (*onetimeauth_final)(crypto_onetimeauth_poly1305_state *state,\n                             unsigned char *out);\n} crypto_onetimeauth_poly1305_implementation;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_onetimeauth/poly1305/sse2/poly1305_sse2.c",
    "content": "\n#include <stdint.h>\n#include <string.h>\n\n#include \"crypto_verify_16.h\"\n#include \"utils.h\"\n#include \"poly1305_sse2.h\"\n#include \"../onetimeauth_poly1305.h\"\n\n#if defined(HAVE_TI_MODE) && defined(HAVE_EMMINTRIN_H)\n\n#pragma GCC target(\"sse2\")\n\n#include <emmintrin.h>\n\ntypedef __m128i xmmi;\n\n#if defined(__SIZEOF_INT128__)\ntypedef unsigned __int128 uint128_t;\n#else\ntypedef unsigned uint128_t __attribute__((mode(TI)));\n#endif\n\n#if defined(_MSC_VER)\n# define POLY1305_NOINLINE __declspec(noinline)\n#elif defined(__GNUC__)\n# define POLY1305_NOINLINE __attribute__((noinline))\n#else\n# define POLY1305_NOINLINE\n#endif\n\n#define poly1305_block_size 32\n\nenum poly1305_state_flags_t {\n    poly1305_started = 1,\n    poly1305_final_shift8 = 4,\n    poly1305_final_shift16 = 8,\n    poly1305_final_r2_r = 16, /* use [r^2,r] for the final block */\n    poly1305_final_r_1 = 32, /* use [r,1] for the final block */\n};\n\ntypedef struct poly1305_state_internal_t {\n    union {\n        uint64_t h[3];\n        uint32_t hh[10];\n    };                       /*  40 bytes  */\n    uint32_t R[5];           /*  20 bytes  */\n    uint32_t R2[5];          /*  20 bytes  */\n    uint32_t R4[5];          /*  20 bytes  */\n    uint64_t pad[2];         /*  16 bytes  */\n    uint64_t flags;          /*   8 bytes  */\n    unsigned long long leftover; /* 8 bytes */\n    unsigned char buffer[poly1305_block_size]; /* 32 bytes */\n} poly1305_state_internal_t;   /* 164 bytes total */\n\n/*\n * _mm_loadl_epi64() is turned into a simple MOVQ. So, unaligned accesses are totally fine, even though this intrinsic requires a __m128i* input.\n * This confuses dynamic analysis, so force alignment, only in debug mode.\n */\n#ifdef DEBUG\nstatic xmmi\n_fakealign_mm_loadl_epi64(const void *m)\n{\n    xmmi tmp;\n    memcpy(&tmp, m, 8);\n    return _mm_loadl_epi64(&tmp);\n}\n# define _mm_loadl_epi64(X) _fakealign_mm_loadl_epi64(X)\n#endif\n\n/* copy 0-31 bytes */\nstatic inline void\npoly1305_block_copy31(unsigned char *dst, const unsigned char *src, unsigned long long bytes)\n{\n    if (bytes & 16) {\n        _mm_store_si128((xmmi *) (void *) dst,\n                        _mm_loadu_si128((const xmmi *) (const void *) src));\n        src += 16; dst += 16;\n    }\n    if (bytes &  8) { memcpy(dst, src, 8); src += 8; dst += 8; }\n    if (bytes &  4) { memcpy(dst, src, 4); src += 4; dst += 4; }\n    if (bytes &  2) { memcpy(dst, src, 2); src += 2; dst += 2; }\n    if (bytes &  1) { *dst = *src; }\n}\n\nstatic POLY1305_NOINLINE void\npoly1305_init_ext(poly1305_state_internal_t *st,\n                  const unsigned char key[32], unsigned long long bytes)\n{\n    uint32_t *R;\n    uint128_t d[3],m0;\n    uint64_t r0,r1,r2;\n    uint32_t rp0,rp1,rp2,rp3,rp4;\n    uint64_t rt0,rt1,rt2,st2,c;\n    uint64_t t0,t1;\n    unsigned long long i;\n\n    if (!bytes) bytes = ~(unsigned long long)0;\n\n    /* H = 0 */\n    _mm_storeu_si128((xmmi *)(void *)&st->hh[0], _mm_setzero_si128());\n    _mm_storeu_si128((xmmi *)(void *)&st->hh[4], _mm_setzero_si128());\n    _mm_storeu_si128((xmmi *)(void *)&st->hh[8], _mm_setzero_si128());\n\n    /* clamp key */\n    memcpy(&t0, key, 8);\n    memcpy(&t1, key + 8, 8);\n    r0 = t0 & 0xffc0fffffff; t0 >>= 44; t0 |= t1 << 20;\n    r1 = t0 & 0xfffffc0ffff; t1 >>= 24;\n    r2 = t1 & 0x00ffffffc0f;\n\n    /* r^1 */\n    R = st->R;\n    R[0] = (uint32_t)( r0                      ) & 0x3ffffff;\n    R[1] = (uint32_t)(( r0 >> 26) | ( r1 << 18)) & 0x3ffffff;\n    R[2] = (uint32_t)(( r1 >>  8)              ) & 0x3ffffff;\n    R[3] = (uint32_t)(( r1 >> 34) | ( r2 << 10)) & 0x3ffffff;\n    R[4] = (uint32_t)(( r2 >> 16)              );\n\n    /* save pad */\n    memcpy(&st->pad[0], key + 16, 8);\n    memcpy(&st->pad[1], key + 24, 8);\n\n    rt0 = r0;\n    rt1 = r1;\n    rt2 = r2;\n\n    /* r^2, r^4 */\n    for (i = 0; i < 2; i++) {\n        if (i == 0) {\n            R = st->R2;\n            if (bytes <= 16) {\n                break;\n            }\n        } else if (i == 1) {\n            R = st->R4;\n            if (bytes < 96) {\n                break;\n            }\n        }\n        st2 = rt2 * (5 << 2);\n        d[0] = ((uint128_t)rt0 * rt0) + ((uint128_t)(rt1 * 2) * st2);\n        d[1] = ((uint128_t)rt2 * st2) + ((uint128_t)(rt0 * 2) * rt1);\n        d[2] = ((uint128_t)rt1 * rt1) + ((uint128_t)(rt2 * 2) * rt0);\n        rt0 = (uint64_t)d[0] & 0xfffffffffff; c = (uint64_t)(d[0] >> 44);\n        d[1] += c   ; rt1 = (uint64_t)d[1] & 0xfffffffffff; c = (uint64_t)(d[1] >> 44);\n        d[2] += c   ; rt2 = (uint64_t)d[2] & 0x3ffffffffff; c = (uint64_t)(d[2] >> 42);\n        rt0 += c * 5; c = (rt0 >> 44); rt0 = rt0 & 0xfffffffffff;\n        rt1 += c    ; c = (rt1 >> 44); rt1 = rt1 & 0xfffffffffff;\n        rt2 += c    ; /* even if rt2 overflows, it will still fit in rp4 safely, and is safe to multiply with */\n\n        R[0] = (uint32_t)( rt0                     ) & 0x3ffffff;\n        R[1] = (uint32_t)((rt0 >> 26) | (rt1 << 18)) & 0x3ffffff;\n        R[2] = (uint32_t)((rt1 >> 8)               ) & 0x3ffffff;\n        R[3] = (uint32_t)((rt1 >> 34) | (rt2 << 10)) & 0x3ffffff;\n        R[4] = (uint32_t)((rt2 >> 16)              );\n    }\n\n    st->flags = 0;\n    st->leftover = 0U;\n}\n\nstatic POLY1305_NOINLINE void\npoly1305_blocks(poly1305_state_internal_t *st, const unsigned char *m,\n                unsigned long long bytes)\n{\n    CRYPTO_ALIGN(64) xmmi HIBIT = _mm_shuffle_epi32(_mm_cvtsi32_si128(1 << 24), _MM_SHUFFLE(1,0,1,0));\n    const xmmi MMASK = _mm_shuffle_epi32(_mm_cvtsi32_si128((1 << 26) - 1), _MM_SHUFFLE(1,0,1,0));\n    const xmmi FIVE = _mm_shuffle_epi32(_mm_cvtsi32_si128(5), _MM_SHUFFLE(1,0,1,0));\n    xmmi H0,H1,H2,H3,H4;\n    xmmi T0,T1,T2,T3,T4,T5,T6,T7,T8;\n    xmmi M0,M1,M2,M3,M4;\n    xmmi M5,M6,M7,M8,M9;\n    xmmi C1,C2;\n    xmmi R20,R21,R22,R23,R24,S21,S22,S23,S24;\n    xmmi R40,R41,R42,R43,R44,S41,S42,S43,S44;\n\n    if (st->flags & poly1305_final_shift8) HIBIT = _mm_srli_si128(HIBIT, 8);\n    if (st->flags & poly1305_final_shift16) HIBIT = _mm_setzero_si128();\n\n    if (!(st->flags & poly1305_started)) {\n        /* H = [Mx,My] */\n\n        T5 = _mm_unpacklo_epi64(_mm_loadl_epi64((const xmmi *)(const void *)(m + 0)), _mm_loadl_epi64((const xmmi *)(const void *)(m + 16)));\n        T6 = _mm_unpacklo_epi64(_mm_loadl_epi64((const xmmi *)(const void *)(m + 8)), _mm_loadl_epi64((const xmmi *)(const void *)(m + 24)));\n        H0 = _mm_and_si128(MMASK, T5);\n        H1 = _mm_and_si128(MMASK, _mm_srli_epi64(T5, 26));\n        T5 = _mm_or_si128(_mm_srli_epi64(T5, 52), _mm_slli_epi64(T6, 12));\n        H2 = _mm_and_si128(MMASK, T5);\n        H3 = _mm_and_si128(MMASK, _mm_srli_epi64(T5, 26));\n        H4 = _mm_srli_epi64(T6, 40);\n        H4 = _mm_or_si128(H4, HIBIT);\n        m += 32;\n        bytes -= 32;\n        st->flags |= poly1305_started;\n    } else {\n        T0 = _mm_loadu_si128((const xmmi *)(const void *)&st->hh[0]);\n        T1 = _mm_loadu_si128((const xmmi *)(const void *)&st->hh[4]);\n        T2 = _mm_loadu_si128((const xmmi *)(const void *)&st->hh[8]);\n        H0 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(1,1,0,0));\n        H1 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(3,3,2,2));\n        H2 = _mm_shuffle_epi32(T1, _MM_SHUFFLE(1,1,0,0));\n        H3 = _mm_shuffle_epi32(T1, _MM_SHUFFLE(3,3,2,2));\n        H4 = _mm_shuffle_epi32(T2, _MM_SHUFFLE(1,1,0,0));\n    }\n\n    if (st->flags & (poly1305_final_r2_r|poly1305_final_r_1)) {\n        if (st->flags & poly1305_final_r2_r) {\n            /* use [r^2, r] */\n            T2 = _mm_loadu_si128((const xmmi *)(const void *)&st->R[0]);\n            T3 = _mm_cvtsi32_si128(st->R[4]);\n            T0 = _mm_loadu_si128((const xmmi *)(const void *)&st->R2[0]);\n            T1 = _mm_cvtsi32_si128(st->R2[4]);\n            T4 = _mm_unpacklo_epi32(T0, T2);\n            T5 = _mm_unpackhi_epi32(T0, T2);\n            R24 = _mm_unpacklo_epi64(T1, T3);\n        } else {\n            /* use [r^1, 1] */\n            T0 = _mm_loadu_si128((const xmmi *)(const void *)&st->R[0]);\n            T1 = _mm_cvtsi32_si128(st->R[4]);\n            T2 = _mm_cvtsi32_si128(1);\n            T4 = _mm_unpacklo_epi32(T0, T2);\n            T5 = _mm_unpackhi_epi32(T0, T2);\n            R24 = T1;\n        }\n\n        R20 = _mm_shuffle_epi32(T4, _MM_SHUFFLE(1,1,0,0));\n        R21 = _mm_shuffle_epi32(T4, _MM_SHUFFLE(3,3,2,2));\n        R22 = _mm_shuffle_epi32(T5, _MM_SHUFFLE(1,1,0,0));\n        R23 = _mm_shuffle_epi32(T5, _MM_SHUFFLE(3,3,2,2));\n    } else {\n        /* use [r^2, r^2] */\n        T0 = _mm_loadu_si128((const xmmi *)(const void *)&st->R2[0]);\n        T1 = _mm_cvtsi32_si128(st->R2[4]);\n        R20 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(0,0,0,0));\n        R21 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(1,1,1,1));\n        R22 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(2,2,2,2));\n        R23 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(3,3,3,3));\n        R24 = _mm_shuffle_epi32(T1, _MM_SHUFFLE(0,0,0,0));\n    }\n    S21 = _mm_mul_epu32(R21, FIVE);\n    S22 = _mm_mul_epu32(R22, FIVE);\n    S23 = _mm_mul_epu32(R23, FIVE);\n    S24 = _mm_mul_epu32(R24, FIVE);\n\n    if (bytes >= 64) {\n        T0 = _mm_loadu_si128((const xmmi *)(const void *)&st->R4[0]);\n        T1 = _mm_cvtsi32_si128(st->R4[4]);\n        R40 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(0,0,0,0));\n        R41 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(1,1,1,1));\n        R42 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(2,2,2,2));\n        R43 = _mm_shuffle_epi32(T0, _MM_SHUFFLE(3,3,3,3));\n        R44 = _mm_shuffle_epi32(T1, _MM_SHUFFLE(0,0,0,0));\n        S41 = _mm_mul_epu32(R41, FIVE);\n        S42 = _mm_mul_epu32(R42, FIVE);\n        S43 = _mm_mul_epu32(R43, FIVE);\n        S44 = _mm_mul_epu32(R44, FIVE);\n\n        while (bytes >= 64) {\n            xmmi v00,v01,v02,v03,v04;\n            xmmi v10,v11,v12,v13,v14;\n            xmmi v20,v21,v22,v23,v24;\n            xmmi v30,v31,v32,v33,v34;\n            xmmi v40,v41,v42,v43,v44;\n            xmmi T14,T15;\n\n            /* H *= [r^4,r^4], preload [Mx,My] */\n            T15 = S42;\n            T0  = H4; T0  = _mm_mul_epu32(T0, S41);\n            v01 = H3; v01 = _mm_mul_epu32(v01, T15);\n            T14 = S43;\n            T1  = H4; T1  = _mm_mul_epu32(T1 , T15);\n            v11 = H3; v11 = _mm_mul_epu32(v11, T14);\n            T2  = H4; T2  = _mm_mul_epu32(T2 , T14); T0 = _mm_add_epi64(T0, v01);\n            T15 = S44;\n            v02 = H2; v02 = _mm_mul_epu32(v02, T14);\n            T3  = H4; T3  = _mm_mul_epu32(T3 , T15); T1 = _mm_add_epi64(T1, v11);\n            v03 = H1; v03 = _mm_mul_epu32(v03, T15);\n            v12 = H2; v12 = _mm_mul_epu32(v12, T15); T0 = _mm_add_epi64(T0, v02);\n            T14 = R40;\n            v21 = H3; v21 = _mm_mul_epu32(v21, T15);\n            v31 = H3; v31 = _mm_mul_epu32(v31, T14); T0 = _mm_add_epi64(T0, v03);\n            T4  = H4; T4  = _mm_mul_epu32(T4 , T14); T1 = _mm_add_epi64(T1, v12);\n            v04 = H0; v04 = _mm_mul_epu32(v04, T14); T2 = _mm_add_epi64(T2, v21);\n            v13 = H1; v13 = _mm_mul_epu32(v13, T14); T3 = _mm_add_epi64(T3, v31);\n            T15 = R41;\n            v22 = H2; v22 = _mm_mul_epu32(v22, T14);\n            v32 = H2; v32 = _mm_mul_epu32(v32, T15); T0 = _mm_add_epi64(T0, v04);\n            v41 = H3; v41 = _mm_mul_epu32(v41, T15); T1 = _mm_add_epi64(T1, v13);\n            v14 = H0; v14 = _mm_mul_epu32(v14, T15); T2 = _mm_add_epi64(T2, v22);\n            T14 = R42;\n            T5 = _mm_unpacklo_epi64(_mm_loadl_epi64((const xmmi *)(const void *)(m + 0)), _mm_loadl_epi64((const xmmi *)(const void *)(m + 16)));\n            v23 = H1; v23 = _mm_mul_epu32(v23, T15); T3 = _mm_add_epi64(T3, v32);\n            v33 = H1; v33 = _mm_mul_epu32(v33, T14); T4 = _mm_add_epi64(T4, v41);\n            v42 = H2; v42 = _mm_mul_epu32(v42, T14); T1 = _mm_add_epi64(T1, v14);\n            T15 = R43;\n            T6 = _mm_unpacklo_epi64(_mm_loadl_epi64((const xmmi *)(const void *)(m + 8)), _mm_loadl_epi64((const xmmi *)(const void *)(m + 24)));\n            v24 = H0; v24 = _mm_mul_epu32(v24, T14); T2 = _mm_add_epi64(T2, v23);\n            v34 = H0; v34 = _mm_mul_epu32(v34, T15); T3 = _mm_add_epi64(T3, v33);\n            M0 = _mm_and_si128(MMASK, T5);\n            v43 = H1; v43 = _mm_mul_epu32(v43, T15); T4 = _mm_add_epi64(T4, v42);\n            M1 = _mm_and_si128(MMASK, _mm_srli_epi64(T5, 26));\n            v44 = H0; v44 = _mm_mul_epu32(v44, R44); T2 = _mm_add_epi64(T2, v24);\n            T5 = _mm_or_si128(_mm_srli_epi64(T5, 52), _mm_slli_epi64(T6, 12));\n            T3 = _mm_add_epi64(T3, v34);\n            M3 = _mm_and_si128(MMASK, _mm_srli_epi64(T6, 14));\n            T4 = _mm_add_epi64(T4, v43);\n            M2 = _mm_and_si128(MMASK, T5);\n            T4 = _mm_add_epi64(T4, v44);\n            M4 = _mm_or_si128(_mm_srli_epi64(T6, 40), HIBIT);\n\n            /* H += [Mx',My'] */\n            T5 = _mm_loadu_si128((const xmmi *)(const void *)(m + 32));\n            T6 = _mm_loadu_si128((const xmmi *)(const void *)(m + 48));\n            T7 = _mm_unpacklo_epi32(T5, T6);\n            T8 = _mm_unpackhi_epi32(T5, T6);\n            M5 = _mm_unpacklo_epi32(T7, _mm_setzero_si128());\n            M6 = _mm_unpackhi_epi32(T7, _mm_setzero_si128());\n            M7 = _mm_unpacklo_epi32(T8, _mm_setzero_si128());\n            M8 = _mm_unpackhi_epi32(T8, _mm_setzero_si128());\n            M6 = _mm_slli_epi64(M6, 6);\n            M7 = _mm_slli_epi64(M7, 12);\n            M8 = _mm_slli_epi64(M8, 18);\n            T0 = _mm_add_epi64(T0, M5);\n            T1 = _mm_add_epi64(T1, M6);\n            T2 = _mm_add_epi64(T2, M7);\n            T3 = _mm_add_epi64(T3, M8);\n            T4 = _mm_add_epi64(T4, HIBIT);\n\n            /* H += [Mx,My]*[r^2,r^2] */\n            T15 = S22;\n            v00 = M4; v00 = _mm_mul_epu32(v00, S21);\n            v01 = M3; v01 = _mm_mul_epu32(v01, T15);\n            T14 = S23;\n            v10 = M4; v10 = _mm_mul_epu32(v10, T15);\n            v11 = M3; v11 = _mm_mul_epu32(v11, T14); T0 = _mm_add_epi64(T0, v00);\n            v20 = M4; v20 = _mm_mul_epu32(v20, T14); T0 = _mm_add_epi64(T0, v01);\n            T15 = S24;\n            v02 = M2; v02 = _mm_mul_epu32(v02, T14); T1 = _mm_add_epi64(T1, v10);\n            v30 = M4; v30 = _mm_mul_epu32(v30, T15); T1 = _mm_add_epi64(T1, v11);\n            v03 = M1; v03 = _mm_mul_epu32(v03, T15); T2 = _mm_add_epi64(T2, v20);\n            v12 = M2; v12 = _mm_mul_epu32(v12, T15); T0 = _mm_add_epi64(T0, v02);\n            T14 = R20;\n            v21 = M3; v21 = _mm_mul_epu32(v21, T15); T3 = _mm_add_epi64(T3, v30);\n            v31 = M3; v31 = _mm_mul_epu32(v31, T14); T0 = _mm_add_epi64(T0, v03);\n            v40 = M4; v40 = _mm_mul_epu32(v40, T14); T1 = _mm_add_epi64(T1, v12);\n            v04 = M0; v04 = _mm_mul_epu32(v04, T14); T2 = _mm_add_epi64(T2, v21);\n            v13 = M1; v13 = _mm_mul_epu32(v13, T14); T3 = _mm_add_epi64(T3, v31);\n            T15 = R21;\n            v22 = M2; v22 = _mm_mul_epu32(v22, T14); T4 = _mm_add_epi64(T4, v40);\n            v32 = M2; v32 = _mm_mul_epu32(v32, T15); T0 = _mm_add_epi64(T0, v04);\n            v41 = M3; v41 = _mm_mul_epu32(v41, T15); T1 = _mm_add_epi64(T1, v13);\n            v14 = M0; v14 = _mm_mul_epu32(v14, T15); T2 = _mm_add_epi64(T2, v22);\n            T14 = R22;\n            v23 = M1; v23 = _mm_mul_epu32(v23, T15); T3 = _mm_add_epi64(T3, v32);\n            v33 = M1; v33 = _mm_mul_epu32(v33, T14); T4 = _mm_add_epi64(T4, v41);\n            v42 = M2; v42 = _mm_mul_epu32(v42, T14); T1 = _mm_add_epi64(T1, v14);\n            T15 = R23;\n            v24 = M0; v24 = _mm_mul_epu32(v24, T14); T2 = _mm_add_epi64(T2, v23);\n            v34 = M0; v34 = _mm_mul_epu32(v34, T15); T3 = _mm_add_epi64(T3, v33);\n            v43 = M1; v43 = _mm_mul_epu32(v43, T15); T4 = _mm_add_epi64(T4, v42);\n            v44 = M0; v44 = _mm_mul_epu32(v44, R24); T2 = _mm_add_epi64(T2, v24);\n            T3 = _mm_add_epi64(T3, v34);\n            T4 = _mm_add_epi64(T4, v43);\n            T4 = _mm_add_epi64(T4, v44);\n\n            /* reduce */\n            C1 = _mm_srli_epi64(T0, 26); C2 = _mm_srli_epi64(T3, 26); T0 = _mm_and_si128(T0, MMASK); T3 = _mm_and_si128(T3, MMASK); T1 = _mm_add_epi64(T1, C1); T4 = _mm_add_epi64(T4, C2);\n            C1 = _mm_srli_epi64(T1, 26); C2 = _mm_srli_epi64(T4, 26); T1 = _mm_and_si128(T1, MMASK); T4 = _mm_and_si128(T4, MMASK); T2 = _mm_add_epi64(T2, C1); T0 = _mm_add_epi64(T0, _mm_mul_epu32(C2, FIVE));\n            C1 = _mm_srli_epi64(T2, 26); C2 = _mm_srli_epi64(T0, 26); T2 = _mm_and_si128(T2, MMASK); T0 = _mm_and_si128(T0, MMASK); T3 = _mm_add_epi64(T3, C1); T1 = _mm_add_epi64(T1, C2);\n            C1 = _mm_srli_epi64(T3, 26);                              T3 = _mm_and_si128(T3, MMASK);                                T4 = _mm_add_epi64(T4, C1);\n\n            /* Final: H = (H*[r^4,r^4] + [Mx,My]*[r^2,r^2] + [Mx',My']) */\n            H0 = T0;\n            H1 = T1;\n            H2 = T2;\n            H3 = T3;\n            H4 = T4;\n\n            m += 64;\n            bytes -= 64;\n        }\n    }\n\n    if (bytes >= 32) {\n        xmmi v01,v02,v03,v04;\n        xmmi v11,v12,v13,v14;\n        xmmi v21,v22,v23,v24;\n        xmmi v31,v32,v33,v34;\n        xmmi v41,v42,v43,v44;\n        xmmi T14,T15;\n\n        /* H *= [r^2,r^2] */\n        T15 = S22;\n        T0  = H4; T0  = _mm_mul_epu32(T0, S21);\n        v01 = H3; v01 = _mm_mul_epu32(v01, T15);\n        T14 = S23;\n        T1  = H4; T1  = _mm_mul_epu32(T1 , T15);\n        v11 = H3; v11 = _mm_mul_epu32(v11, T14);\n        T2  = H4; T2  = _mm_mul_epu32(T2 , T14); T0 = _mm_add_epi64(T0, v01);\n        T15 = S24;\n        v02 = H2; v02 = _mm_mul_epu32(v02, T14);\n        T3  = H4; T3  = _mm_mul_epu32(T3 , T15); T1 = _mm_add_epi64(T1, v11);\n        v03 = H1; v03 = _mm_mul_epu32(v03, T15);\n        v12 = H2; v12 = _mm_mul_epu32(v12, T15); T0 = _mm_add_epi64(T0, v02);\n        T14 = R20;\n        v21 = H3; v21 = _mm_mul_epu32(v21, T15);\n        v31 = H3; v31 = _mm_mul_epu32(v31, T14); T0 = _mm_add_epi64(T0, v03);\n        T4  = H4; T4  = _mm_mul_epu32(T4 , T14); T1 = _mm_add_epi64(T1, v12);\n        v04 = H0; v04 = _mm_mul_epu32(v04, T14); T2 = _mm_add_epi64(T2, v21);\n        v13 = H1; v13 = _mm_mul_epu32(v13, T14); T3 = _mm_add_epi64(T3, v31);\n        T15 = R21;\n        v22 = H2; v22 = _mm_mul_epu32(v22, T14);\n        v32 = H2; v32 = _mm_mul_epu32(v32, T15); T0 = _mm_add_epi64(T0, v04);\n        v41 = H3; v41 = _mm_mul_epu32(v41, T15); T1 = _mm_add_epi64(T1, v13);\n        v14 = H0; v14 = _mm_mul_epu32(v14, T15); T2 = _mm_add_epi64(T2, v22);\n        T14 = R22;\n        v23 = H1; v23 = _mm_mul_epu32(v23, T15); T3 = _mm_add_epi64(T3, v32);\n        v33 = H1; v33 = _mm_mul_epu32(v33, T14); T4 = _mm_add_epi64(T4, v41);\n        v42 = H2; v42 = _mm_mul_epu32(v42, T14); T1 = _mm_add_epi64(T1, v14);\n        T15 = R23;\n        v24 = H0; v24 = _mm_mul_epu32(v24, T14); T2 = _mm_add_epi64(T2, v23);\n        v34 = H0; v34 = _mm_mul_epu32(v34, T15); T3 = _mm_add_epi64(T3, v33);\n        v43 = H1; v43 = _mm_mul_epu32(v43, T15); T4 = _mm_add_epi64(T4, v42);\n        v44 = H0; v44 = _mm_mul_epu32(v44, R24); T2 = _mm_add_epi64(T2, v24);\n        T3 = _mm_add_epi64(T3, v34);\n        T4 = _mm_add_epi64(T4, v43);\n        T4 = _mm_add_epi64(T4, v44);\n\n        /* H += [Mx,My] */\n        if (m) {\n            T5 = _mm_loadu_si128((const xmmi *)(const void *)(m + 0));\n            T6 = _mm_loadu_si128((const xmmi *)(const void *)(m + 16));\n            T7 = _mm_unpacklo_epi32(T5, T6);\n            T8 = _mm_unpackhi_epi32(T5, T6);\n            M0 = _mm_unpacklo_epi32(T7, _mm_setzero_si128());\n            M1 = _mm_unpackhi_epi32(T7, _mm_setzero_si128());\n            M2 = _mm_unpacklo_epi32(T8, _mm_setzero_si128());\n            M3 = _mm_unpackhi_epi32(T8, _mm_setzero_si128());\n            M1 = _mm_slli_epi64(M1, 6);\n            M2 = _mm_slli_epi64(M2, 12);\n            M3 = _mm_slli_epi64(M3, 18);\n            T0 = _mm_add_epi64(T0, M0);\n            T1 = _mm_add_epi64(T1, M1);\n            T2 = _mm_add_epi64(T2, M2);\n            T3 = _mm_add_epi64(T3, M3);\n            T4 = _mm_add_epi64(T4, HIBIT);\n        }\n\n        /* reduce */\n        C1 = _mm_srli_epi64(T0, 26); C2 = _mm_srli_epi64(T3, 26); T0 = _mm_and_si128(T0, MMASK); T3 = _mm_and_si128(T3, MMASK); T1 = _mm_add_epi64(T1, C1); T4 = _mm_add_epi64(T4, C2);\n        C1 = _mm_srli_epi64(T1, 26); C2 = _mm_srli_epi64(T4, 26); T1 = _mm_and_si128(T1, MMASK); T4 = _mm_and_si128(T4, MMASK); T2 = _mm_add_epi64(T2, C1); T0 = _mm_add_epi64(T0, _mm_mul_epu32(C2, FIVE));\n        C1 = _mm_srli_epi64(T2, 26); C2 = _mm_srli_epi64(T0, 26); T2 = _mm_and_si128(T2, MMASK); T0 = _mm_and_si128(T0, MMASK); T3 = _mm_add_epi64(T3, C1); T1 = _mm_add_epi64(T1, C2);\n        C1 = _mm_srli_epi64(T3, 26);                              T3 = _mm_and_si128(T3, MMASK);                                T4 = _mm_add_epi64(T4, C1);\n\n        /* H = (H*[r^2,r^2] + [Mx,My]) */\n        H0 = T0;\n        H1 = T1;\n        H2 = T2;\n        H3 = T3;\n        H4 = T4;\n    }\n\n    if (m) {\n        T0 = _mm_shuffle_epi32(H0, _MM_SHUFFLE(0,0,2,0));\n        T1 = _mm_shuffle_epi32(H1, _MM_SHUFFLE(0,0,2,0));\n        T2 = _mm_shuffle_epi32(H2, _MM_SHUFFLE(0,0,2,0));\n        T3 = _mm_shuffle_epi32(H3, _MM_SHUFFLE(0,0,2,0));\n        T4 = _mm_shuffle_epi32(H4, _MM_SHUFFLE(0,0,2,0));\n        T0 = _mm_unpacklo_epi64(T0, T1);\n        T1 = _mm_unpacklo_epi64(T2, T3);\n        _mm_storeu_si128((xmmi *)(void *)&st->hh[0], T0);\n        _mm_storeu_si128((xmmi *)(void *)&st->hh[4], T1);\n        _mm_storel_epi64((xmmi *)(void *)&st->hh[8], T4);\n    } else {\n        uint32_t t0,t1,t2,t3,t4,b;\n        uint64_t h0,h1,h2,g0,g1,g2,c,nc;\n\n        /* H = H[0]+H[1] */\n        T0 = H0;\n        T1 = H1;\n        T2 = H2;\n        T3 = H3;\n        T4 = H4;\n\n        T0 = _mm_add_epi64(T0, _mm_srli_si128(T0, 8));\n        T1 = _mm_add_epi64(T1, _mm_srli_si128(T1, 8));\n        T2 = _mm_add_epi64(T2, _mm_srli_si128(T2, 8));\n        T3 = _mm_add_epi64(T3, _mm_srli_si128(T3, 8));\n        T4 = _mm_add_epi64(T4, _mm_srli_si128(T4, 8));\n\n        t0 = _mm_cvtsi128_si32(T0)    ; b = (t0 >> 26); t0 &= 0x3ffffff;\n        t1 = _mm_cvtsi128_si32(T1) + b; b = (t1 >> 26); t1 &= 0x3ffffff;\n        t2 = _mm_cvtsi128_si32(T2) + b; b = (t2 >> 26); t2 &= 0x3ffffff;\n        t3 = _mm_cvtsi128_si32(T3) + b; b = (t3 >> 26); t3 &= 0x3ffffff;\n        t4 = _mm_cvtsi128_si32(T4) + b;\n\n        /* everything except t4 is in range, so this is all safe */\n        h0 =  (((uint64_t)t0      ) | ((uint64_t)t1 << 26)                       ) & 0xfffffffffffull;\n        h1 =  (((uint64_t)t1 >> 18) | ((uint64_t)t2 <<  8) | ((uint64_t)t3 << 34)) & 0xfffffffffffull;\n        h2 =  (((uint64_t)t3 >> 10) | ((uint64_t)t4 << 16)                       );\n\n        c = (h2 >> 42); h2 &= 0x3ffffffffff;\n        h0 += c * 5; c = (h0 >> 44); h0 &= 0xfffffffffff;\n        h1 += c;     c = (h1 >> 44); h1 &= 0xfffffffffff;\n        h2 += c;     c = (h2 >> 42); h2 &= 0x3ffffffffff;\n        h0 += c * 5; c = (h0 >> 44); h0 &= 0xfffffffffff;\n        h1 += c;\n\n        g0 = h0 + 5; c = (g0 >> 44); g0 &= 0xfffffffffff;\n        g1 = h1 + c; c = (g1 >> 44); g1 &= 0xfffffffffff;\n        g2 = h2 + c - ((uint64_t)1 << 42);\n\n        c = (g2 >> 63) - 1;\n        nc = ~c;\n        h0 = (h0 & nc) | (g0 & c);\n        h1 = (h1 & nc) | (g1 & c);\n        h2 = (h2 & nc) | (g2 & c);\n\n        st->h[0] = h0;\n        st->h[1] = h1;\n        st->h[2] = h2;\n    }\n}\n\nstatic void\npoly1305_update(poly1305_state_internal_t *st, const unsigned char *m,\n                unsigned long long bytes)\n{\n    unsigned long long i;\n\n    /* handle leftover */\n    if (st->leftover) {\n        unsigned long long want = (poly1305_block_size - st->leftover);\n\n        if (want > bytes)\n            want = bytes;\n        for (i = 0; i < want; i++)\n            st->buffer[st->leftover + i] = m[i];\n        bytes -= want;\n        m += want;\n        st->leftover += want;\n        if (st->leftover < poly1305_block_size)\n            return;\n        poly1305_blocks(st, st->buffer, poly1305_block_size);\n        st->leftover = 0;\n    }\n\n    /* process full blocks */\n    if (bytes >= poly1305_block_size) {\n        unsigned long long want = (bytes & ~(poly1305_block_size - 1));\n\n        poly1305_blocks(st, m, want);\n        m += want;\n        bytes -= want;\n    }\n\n    /* store leftover */\n    if (bytes) {\n        for (i = 0; i < bytes; i++) {\n            st->buffer[st->leftover + i] = m[i];\n        }\n        st->leftover += bytes;\n    }\n}\n\nstatic POLY1305_NOINLINE void\npoly1305_finish_ext(poly1305_state_internal_t *st, const unsigned char *m,\n                    unsigned long long leftover, unsigned char mac[16])\n{\n    uint64_t h0,h1,h2;\n    uint64_t t0,t1,c;\n\n    if (leftover) {\n        CRYPTO_ALIGN(16) unsigned char final[32] = {0};\n        poly1305_block_copy31(final, m, leftover);\n        if (leftover != 16) final[leftover] = 1;\n        st->flags |= (leftover >= 16) ? poly1305_final_shift8 : poly1305_final_shift16;\n        poly1305_blocks(st, final, 32);\n    }\n\n    if (st->flags & poly1305_started) {\n        /* finalize, H *= [r^2,r], or H *= [r,1] */\n        if (!leftover || (leftover > 16)) {\n            st->flags |= poly1305_final_r2_r;\n        } else {\n            st->flags |= poly1305_final_r_1;\n        }\n        poly1305_blocks(st, NULL, 32);\n    }\n\n    h0 = st->h[0];\n    h1 = st->h[1];\n    h2 = st->h[2];\n\n    /* pad */\n    h0 = ((h0      ) | (h1 << 44));\n    h1 = ((h1 >> 20) | (h2 << 24));\n#ifdef HAVE_AMD64_ASM\n    __asm__ __volatile__(\"addq %2, %0 ;\\n\"\n                         \"adcq %3, %1 ;\\n\"\n                         : \"+r\"(h0), \"+r\"(h1)\n                         : \"r\"(st->pad[0]), \"r\"(st->pad[1])\n                         : \"flags\", \"cc\");\n#else\n    {\n        uint128_t h;\n\n        memcpy(&h, &st->pad[0], 16);\n        h += ((uint128_t) h1 << 64) | h0;\n        h0 = (uint64_t) h;\n        h1 = (uint64_t) (h >> 64);\n    }\n#endif\n    _mm_storeu_si128((xmmi *)(void *)st + 0, _mm_setzero_si128());\n    _mm_storeu_si128((xmmi *)(void *)st + 1, _mm_setzero_si128());\n    _mm_storeu_si128((xmmi *)(void *)st + 2, _mm_setzero_si128());\n    _mm_storeu_si128((xmmi *)(void *)st + 3, _mm_setzero_si128());\n    _mm_storeu_si128((xmmi *)(void *)st + 4, _mm_setzero_si128());\n    _mm_storeu_si128((xmmi *)(void *)st + 5, _mm_setzero_si128());\n    _mm_storeu_si128((xmmi *)(void *)st + 6, _mm_setzero_si128());\n    _mm_storeu_si128((xmmi *)(void *)st + 7, _mm_setzero_si128());\n\n    memcpy(&mac[0], &h0, 8);\n    memcpy(&mac[8], &h1, 8);\n\n    sodium_memzero((void *)st, sizeof *st);\n}\n\nstatic void\npoly1305_finish(poly1305_state_internal_t *st, unsigned char mac[16])\n{\n    poly1305_finish_ext(st, st->buffer, st->leftover, mac);\n}\n\nstatic int\ncrypto_onetimeauth_poly1305_sse2_init(crypto_onetimeauth_poly1305_state *state,\n                                      const unsigned char *key)\n{\n    (void) sizeof(int[sizeof (crypto_onetimeauth_poly1305_state) >=\n                      sizeof (poly1305_state_internal_t) ? 1 : -1]);\n    poly1305_init_ext((poly1305_state_internal_t *)(void *) state, key, 0U);\n\n    return 0;\n}\n\nstatic int\ncrypto_onetimeauth_poly1305_sse2_update(crypto_onetimeauth_poly1305_state *state,\n                                        const unsigned char *in,\n                                        unsigned long long inlen)\n{\n    poly1305_update((poly1305_state_internal_t *)(void *) state, in, inlen);\n\n    return 0;\n}\n\nstatic int\ncrypto_onetimeauth_poly1305_sse2_final(crypto_onetimeauth_poly1305_state *state,\n                                       unsigned char *out)\n{\n    poly1305_finish((poly1305_state_internal_t *)(void *) state, out);\n\n    return 0;\n}\n\nstatic int\ncrypto_onetimeauth_poly1305_sse2(unsigned char *out, const unsigned char *m,\n                                 unsigned long long inlen,\n                                 const unsigned char *key)\n{\n    CRYPTO_ALIGN(64) poly1305_state_internal_t st;\n    unsigned long long blocks;\n\n    poly1305_init_ext(&st, key, inlen);\n    blocks = inlen & ~31;\n    if (blocks > 0) {\n        poly1305_blocks(&st, m, blocks);\n        m += blocks;\n        inlen -= blocks;\n    }\n    poly1305_finish_ext(&st, m, inlen, out);\n\n    return 0;\n}\n\nstatic int\ncrypto_onetimeauth_poly1305_sse2_verify(const unsigned char *h,\n                                        const unsigned char *in,\n                                        unsigned long long inlen,\n                                        const unsigned char *k)\n{\n    unsigned char correct[16];\n\n    crypto_onetimeauth_poly1305_sse2(correct,in,inlen,k);\n\n    return crypto_verify_16(h,correct);\n}\n\nstruct crypto_onetimeauth_poly1305_implementation\ncrypto_onetimeauth_poly1305_sse2_implementation = {\n    SODIUM_C99(.onetimeauth =) crypto_onetimeauth_poly1305_sse2,\n    SODIUM_C99(.onetimeauth_verify =) crypto_onetimeauth_poly1305_sse2_verify,\n    SODIUM_C99(.onetimeauth_init =) crypto_onetimeauth_poly1305_sse2_init,\n    SODIUM_C99(.onetimeauth_update =) crypto_onetimeauth_poly1305_sse2_update,\n    SODIUM_C99(.onetimeauth_final =) crypto_onetimeauth_poly1305_sse2_final\n};\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_onetimeauth/poly1305/sse2/poly1305_sse2.h",
    "content": "#ifndef poly1305_sse2_H\n#define poly1305_sse2_H\n\n#include <stddef.h>\n\n#include \"crypto_onetimeauth_poly1305.h\"\n\nextern struct crypto_onetimeauth_poly1305_implementation\n    crypto_onetimeauth_poly1305_sse2_implementation;\n\nstatic int crypto_onetimeauth_poly1305_sse2(unsigned char *out,\n                                            const unsigned char *in,\n                                            unsigned long long inlen,\n                                            const unsigned char *k);\n\nstatic int crypto_onetimeauth_poly1305_sse2_verify(const unsigned char *h,\n                                                   const unsigned char *in,\n                                                   unsigned long long inlen,\n                                                   const unsigned char *k);\n\nstatic int crypto_onetimeauth_poly1305_sse2_init(crypto_onetimeauth_poly1305_state *state,\n                                                 const unsigned char *key);\n\nstatic int crypto_onetimeauth_poly1305_sse2_update(crypto_onetimeauth_poly1305_state *state,\n                                                   const unsigned char *in,\n                                                   unsigned long long inlen);\n\nstatic int crypto_onetimeauth_poly1305_sse2_final(crypto_onetimeauth_poly1305_state *state,\n                                                  unsigned char *out);\n\n#endif /* poly1305_sse2_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/crypto_scrypt-common.c",
    "content": "/*-\n * Copyright 2013 Alexander Peslyak\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include <stdint.h>\n#include <string.h>\n\n#include \"crypto_pwhash_scryptsalsa208sha256.h\"\n#include \"crypto_scrypt.h\"\n#include \"runtime.h\"\n#include \"utils.h\"\n\nstatic const char * const itoa64 =\n    \"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz\";\n\nstatic uint8_t *\nencode64_uint32(uint8_t * dst, size_t dstlen, uint32_t src, uint32_t srcbits)\n{\n    uint32_t bit;\n\n    for (bit = 0; bit < srcbits; bit += 6) {\n        if (dstlen < 1) {\n            return NULL; /* LCOV_EXCL_LINE */\n        }\n        *dst++ = itoa64[src & 0x3f];\n        dstlen--;\n        src >>= 6;\n    }\n\n    return dst;\n}\n\nstatic uint8_t *\nencode64(uint8_t * dst, size_t dstlen, const uint8_t * src, size_t srclen)\n{\n    size_t i;\n\n    for (i = 0; i < srclen; ) {\n        uint8_t * dnext;\n        uint32_t value = 0, bits = 0;\n        do {\n            value |= (uint32_t)src[i++] << bits;\n            bits += 8;\n        } while (bits < 24 && i < srclen);\n        dnext = encode64_uint32(dst, dstlen, value, bits);\n        if (!dnext) {\n            return NULL; /* LCOV_EXCL_LINE */\n        }\n        dstlen -= dnext - dst;\n        dst = dnext;\n    }\n\n    return dst;\n}\n\nstatic int\ndecode64_one(uint32_t * dst, uint8_t src)\n{\n    const char *ptr = strchr(itoa64, src);\n\n    if (ptr) {\n        *dst = (uint32_t) (ptr - itoa64);\n        return 0;\n    }\n    *dst = 0;\n    return -1;\n}\n\nstatic const uint8_t *\ndecode64_uint32(uint32_t * dst, uint32_t dstbits, const uint8_t * src)\n{\n    uint32_t bit;\n    uint32_t value;\n\n    value = 0;\n    for (bit = 0; bit < dstbits; bit += 6) {\n        uint32_t one;\n        if (decode64_one(&one, *src)) {\n            *dst = 0;\n            return NULL;\n        }\n        src++;\n        value |= one << bit;\n    }\n\n    *dst = value;\n    return src;\n}\n\nuint8_t *\nescrypt_r(escrypt_local_t * local, const uint8_t * passwd, size_t passwdlen,\n          const uint8_t * setting, uint8_t * buf, size_t buflen)\n{\n    uint8_t        hash[crypto_pwhash_scryptsalsa208sha256_STRHASHBYTES];\n    escrypt_kdf_t  escrypt_kdf;\n    const uint8_t *src;\n    const uint8_t *salt;\n    uint8_t       *dst;\n    size_t         prefixlen;\n    size_t         saltlen;\n    size_t         need;\n    uint64_t       N;\n    uint32_t       N_log2;\n    uint32_t       r;\n    uint32_t       p;\n\n    if (setting[0] != '$' || setting[1] != '7' || setting[2] != '$') {\n        return NULL;\n    }\n    src = setting + 3;\n\n    if (decode64_one(&N_log2, *src)) {\n        return NULL;\n    }\n    src++;\n    N = (uint64_t)1 << N_log2;\n\n    src = decode64_uint32(&r, 30, src);\n    if (!src) {\n        return NULL;\n    }\n    src = decode64_uint32(&p, 30, src);\n    if (!src) {\n        return NULL;\n    }\n    prefixlen = src - setting;\n\n    salt = src;\n    src = (uint8_t *) strrchr((char *)salt, '$');\n    if (src) {\n        saltlen = src - salt;\n    } else {\n        saltlen = strlen((char *)salt);\n    }\n    need = prefixlen + saltlen + 1 +\n        crypto_pwhash_scryptsalsa208sha256_STRHASHBYTES_ENCODED + 1;\n    if (need > buflen || need < saltlen) {\n        return NULL;\n    }\n#if defined(HAVE_EMMINTRIN_H) || \\\n    (defined(_MSC_VER) && (defined(_M_X64) || defined(_M_AMD64) || defined(_M_IX86)))\n    escrypt_kdf =\n        sodium_runtime_has_sse2() ? escrypt_kdf_sse : escrypt_kdf_nosse;\n#else\n    escrypt_kdf = escrypt_kdf_nosse;\n#endif\n    if (escrypt_kdf(local, passwd, passwdlen, salt, saltlen,\n                    N, r, p, hash, sizeof(hash))) {\n        return NULL;\n    }\n\n    dst = buf;\n    memcpy(dst, setting, prefixlen + saltlen);\n    dst += prefixlen + saltlen;\n    *dst++ = '$';\n\n    dst = encode64(dst, buflen - (dst - buf), hash, sizeof(hash));\n    sodium_memzero(hash, sizeof hash);\n    if (!dst || dst >= buf + buflen) {\n        return NULL; /* Can't happen LCOV_EXCL_LINE */\n    }\n    *dst = 0; /* NUL termination */\n\n    return buf;\n}\n\nuint8_t *\nescrypt_gensalt_r(uint32_t N_log2, uint32_t r, uint32_t p,\n                  const uint8_t * src, size_t srclen,\n                  uint8_t * buf, size_t buflen)\n{\n    uint8_t *dst;\n    size_t   prefixlen =\n        (sizeof \"$7$\" - 1U) + (1U /* N_log2 */) + (5U /* r */) + (5U /* p */);\n    size_t   saltlen = BYTES2CHARS(srclen);\n    size_t   need;\n\n    need = prefixlen + saltlen + 1;\n    if (need > buflen || need < saltlen || saltlen < srclen) {\n        return NULL; /* LCOV_EXCL_LINE */\n    }\n    if (N_log2 > 63 || ((uint64_t)r * (uint64_t)p >= (1U << 30))) {\n        return NULL;\n    }\n    dst = buf;\n    *dst++ = '$';\n    *dst++ = '7';\n    *dst++ = '$';\n\n    *dst++ = itoa64[N_log2];\n\n    dst = encode64_uint32(dst, buflen - (dst - buf), r, 30);\n    if (!dst) {\n        return NULL; /* Can't happen LCOV_EXCL_LINE */\n    }\n    dst = encode64_uint32(dst, buflen - (dst - buf), p, 30);\n    if (!dst) {\n        return NULL; /* Can't happen LCOV_EXCL_LINE */\n    }\n    dst = encode64(dst, buflen - (dst - buf), src, srclen);\n    if (!dst || dst >= buf + buflen) {\n        return NULL; /* Can't happen LCOV_EXCL_LINE */\n    }\n    *dst = 0; /* NUL termination */\n\n    return buf;\n}\n\nint\ncrypto_pwhash_scryptsalsa208sha256_ll(const uint8_t * passwd, size_t passwdlen,\n                                      const uint8_t * salt, size_t saltlen,\n                                      uint64_t N, uint32_t r, uint32_t p,\n                                      uint8_t * buf, size_t buflen)\n{\n    escrypt_kdf_t   escrypt_kdf;\n    escrypt_local_t local;\n    int             retval;\n\n    if (escrypt_init_local(&local)) {\n        return -1; /* LCOV_EXCL_LINE */\n    }\n#if defined(HAVE_EMMINTRIN_H) || \\\n    (defined(_MSC_VER) && (defined(_M_X64) || defined(_M_AMD64) || defined(_M_IX86)))\n    escrypt_kdf =\n        sodium_runtime_has_sse2() ? escrypt_kdf_sse : escrypt_kdf_nosse;\n#else\n    escrypt_kdf = escrypt_kdf_nosse;\n#endif\n    retval = escrypt_kdf(&local,\n                         passwd, passwdlen, salt, saltlen,\n                         N, r, p, buf, buflen);\n    if (escrypt_free_local(&local)) {\n        return -1; /* LCOV_EXCL_LINE */\n    }\n    return retval;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/crypto_scrypt.h",
    "content": "/*-\n * Copyright 2009 Colin Percival\n * Copyright 2013 Alexander Peslyak\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This file was originally written by Colin Percival as part of the Tarsnap\n * online backup system.\n */\n#ifndef crypto_scrypt_H\n#define crypto_scrypt_H\n\n#include <limits.h>\n#include <stdint.h>\n#include <stddef.h>\n\n#if SIZE_MAX > 0xffffffffULL\n# define ARCH_BITS 64\n#else\n# define ARCH_BITS 32\n#endif\n\n#define crypto_pwhash_scryptsalsa208sha256_STRPREFIXBYTES 14\n#define crypto_pwhash_scryptsalsa208sha256_STRSETTINGBYTES 57\n#define crypto_pwhash_scryptsalsa208sha256_STRSALTBYTES 32\n#define crypto_pwhash_scryptsalsa208sha256_STRSALTBYTES_ENCODED 43\n#define crypto_pwhash_scryptsalsa208sha256_STRHASHBYTES 32\n#define crypto_pwhash_scryptsalsa208sha256_STRHASHBYTES_ENCODED 43\n\n#define BYTES2CHARS(bytes) ((((bytes) * 8) + 5) / 6)\n\ntypedef struct {\n\tvoid * base, * aligned;\n\tsize_t size;\n} escrypt_region_t;\n\ntypedef union {\n\tuint64_t d[8];\n\tuint32_t w[16];\n} escrypt_block_t;\n\ntypedef escrypt_region_t escrypt_local_t;\n\nextern int escrypt_init_local(escrypt_local_t * __local);\n\nextern int escrypt_free_local(escrypt_local_t * __local);\n\nextern void *alloc_region(escrypt_region_t * region, size_t size);\nextern int free_region(escrypt_region_t * region);\n\ntypedef int (*escrypt_kdf_t)(escrypt_local_t * __local,\n                             const uint8_t * __passwd, size_t __passwdlen,\n                             const uint8_t * __salt, size_t __saltlen,\n                             uint64_t __N, uint32_t __r, uint32_t __p,\n                             uint8_t * __buf, size_t __buflen);\n\nextern int escrypt_kdf_nosse(escrypt_local_t * __local,\n    const uint8_t * __passwd, size_t __passwdlen,\n    const uint8_t * __salt, size_t __saltlen,\n    uint64_t __N, uint32_t __r, uint32_t __p,\n    uint8_t * __buf, size_t __buflen);\n\nextern int escrypt_kdf_sse(escrypt_local_t * __local,\n    const uint8_t * __passwd, size_t __passwdlen,\n    const uint8_t * __salt, size_t __saltlen,\n    uint64_t __N, uint32_t __r, uint32_t __p,\n    uint8_t * __buf, size_t __buflen);\n\nextern uint8_t * escrypt_r(escrypt_local_t * __local,\n    const uint8_t * __passwd, size_t __passwdlen,\n    const uint8_t * __setting,\n    uint8_t * __buf, size_t __buflen);\n\nextern uint8_t * escrypt_gensalt_r(\n    uint32_t __N_log2, uint32_t __r, uint32_t __p,\n    const uint8_t * __src, size_t __srclen,\n    uint8_t * __buf, size_t __buflen);\n\n#endif /* !_CRYPTO_SCRYPT_H_ */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/nosse/pwhash_scryptsalsa208sha256_nosse.c",
    "content": "/*-\n * Copyright 2009 Colin Percival\n * Copyright 2013 Alexander Peslyak\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This file was originally written by Colin Percival as part of the Tarsnap\n * online backup system.\n */\n\n#include <errno.h>\n#include <limits.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"../pbkdf2-sha256.h\"\n#include \"../sysendian.h\"\n#include \"../crypto_scrypt.h\"\n\nstatic inline void\nblkcpy_64(escrypt_block_t *dest, const escrypt_block_t *src)\n{\n\tint i;\n\n#if (ARCH_BITS==32)\n\tfor (i = 0; i < 16; ++i)\n\t\tdest->w[i] = src->w[i];\n#else\n\tfor (i = 0; i < 8; ++i)\n\t\tdest->d[i] = src->d[i];\n#endif\n}\n\nstatic inline void\nblkxor_64(escrypt_block_t *dest, const escrypt_block_t *src)\n{\n\tint i;\n\n#if (ARCH_BITS==32)\n\tfor (i = 0; i < 16; ++i)\n\t\tdest->w[i] ^= src->w[i];\n#else\n\tfor (i = 0; i < 8; ++i)\n\t\tdest->d[i] ^= src->d[i];\n#endif\n}\n\nstatic inline void\nblkcpy(escrypt_block_t *dest, const escrypt_block_t *src, size_t len)\n{\n\tsize_t i, L;\n#if (ARCH_BITS==32)\n\tL = (len>>2);\n\tfor (i = 0; i < L; ++i)\n\t\tdest->w[i] = src->w[i];\n#else\n\tL = (len>>3);\n\tfor (i = 0; i < L; ++i)\n\t\tdest->d[i] = src->d[i];\n#endif\n}\n\nstatic inline void\nblkxor(escrypt_block_t *dest, const escrypt_block_t *src, size_t len)\n{\n\tsize_t i, L;\n#if (ARCH_BITS==32)\n\tL = (len>>2);\n\tfor (i = 0; i < L; ++i)\n\t\tdest->w[i] ^= src->w[i];\n#else\n\tL = (len>>3);\n\tfor (i = 0; i < L; ++i)\n\t\tdest->d[i] ^= src->d[i];\n#endif\n}\n\n/**\n * salsa20_8(B):\n * Apply the salsa20/8 core to the provided block.\n */\nstatic void\nsalsa20_8(uint32_t B[16])\n{\n\tescrypt_block_t X;\n\tuint32_t *x = X.w;\n\tsize_t i;\n\n\tblkcpy_64(&X, (escrypt_block_t*)B);\n\tfor (i = 0; i < 8; i += 2) {\n#define R(a,b) (((a) << (b)) | ((a) >> (32 - (b))))\n\t\t/* Operate on columns. */\n\t\tx[ 4] ^= R(x[ 0]+x[12], 7);  x[ 8] ^= R(x[ 4]+x[ 0], 9);\n\t\tx[12] ^= R(x[ 8]+x[ 4],13);  x[ 0] ^= R(x[12]+x[ 8],18);\n\n\t\tx[ 9] ^= R(x[ 5]+x[ 1], 7);  x[13] ^= R(x[ 9]+x[ 5], 9);\n\t\tx[ 1] ^= R(x[13]+x[ 9],13);  x[ 5] ^= R(x[ 1]+x[13],18);\n\n\t\tx[14] ^= R(x[10]+x[ 6], 7);  x[ 2] ^= R(x[14]+x[10], 9);\n\t\tx[ 6] ^= R(x[ 2]+x[14],13);  x[10] ^= R(x[ 6]+x[ 2],18);\n\n\t\tx[ 3] ^= R(x[15]+x[11], 7);  x[ 7] ^= R(x[ 3]+x[15], 9);\n\t\tx[11] ^= R(x[ 7]+x[ 3],13);  x[15] ^= R(x[11]+x[ 7],18);\n\n\t\t/* Operate on rows. */\n\t\tx[ 1] ^= R(x[ 0]+x[ 3], 7);  x[ 2] ^= R(x[ 1]+x[ 0], 9);\n\t\tx[ 3] ^= R(x[ 2]+x[ 1],13);  x[ 0] ^= R(x[ 3]+x[ 2],18);\n\n\t\tx[ 6] ^= R(x[ 5]+x[ 4], 7);  x[ 7] ^= R(x[ 6]+x[ 5], 9);\n\t\tx[ 4] ^= R(x[ 7]+x[ 6],13);  x[ 5] ^= R(x[ 4]+x[ 7],18);\n\n\t\tx[11] ^= R(x[10]+x[ 9], 7);  x[ 8] ^= R(x[11]+x[10], 9);\n\t\tx[ 9] ^= R(x[ 8]+x[11],13);  x[10] ^= R(x[ 9]+x[ 8],18);\n\n\t\tx[12] ^= R(x[15]+x[14], 7);  x[13] ^= R(x[12]+x[15], 9);\n\t\tx[14] ^= R(x[13]+x[12],13);  x[15] ^= R(x[14]+x[13],18);\n#undef R\n\t}\n\tfor (i = 0; i < 16; i++)\n\t\tB[i] += x[i];\n}\n\n/**\n * blockmix_salsa8(Bin, Bout, X, r):\n * Compute Bout = BlockMix_{salsa20/8, r}(Bin).  The input Bin must be 128r\n * bytes in length; the output Bout must also be the same size.  The\n * temporary space X must be 64 bytes.\n */\nstatic void\nblockmix_salsa8(const uint32_t * Bin, uint32_t * Bout, uint32_t * X, size_t r)\n{\n\tsize_t i;\n\n\t/* 1: X <-- B_{2r - 1} */\n\tblkcpy_64((escrypt_block_t*)X, (escrypt_block_t*)&Bin[(2 * r - 1) * 16]);\n\n\t/* 2: for i = 0 to 2r - 1 do */\n\tfor (i = 0; i < 2 * r; i += 2) {\n\t\t/* 3: X <-- H(X \\xor B_i) */\n\t\tblkxor_64((escrypt_block_t*)X, (escrypt_block_t*)&Bin[i * 16]);\n\t\tsalsa20_8(X);\n\n\t\t/* 4: Y_i <-- X */\n\t\t/* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */\n\t\tblkcpy_64((escrypt_block_t*)&Bout[i * 8], (escrypt_block_t*)X);\n\n\t\t/* 3: X <-- H(X \\xor B_i) */\n\t\tblkxor_64((escrypt_block_t*)X, (escrypt_block_t*)&Bin[i * 16 + 16]);\n\t\tsalsa20_8(X);\n\n\t\t/* 4: Y_i <-- X */\n\t\t/* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */\n\t\tblkcpy_64((escrypt_block_t*)&Bout[i * 8 + r * 16], (escrypt_block_t*)X);\n\t}\n}\n\n/**\n * integerify(B, r):\n * Return the result of parsing B_{2r-1} as a little-endian integer.\n */\nstatic inline uint64_t\nintegerify(const void * B, size_t r)\n{\n\tconst uint32_t * X = (const uint32_t *)((uintptr_t)(B) + (2 * r - 1) * 64);\n\n\treturn (((uint64_t)(X[1]) << 32) + X[0]);\n}\n\n/**\n * smix(B, r, N, V, XY):\n * Compute B = SMix_r(B, N).  The input B must be 128r bytes in length;\n * the temporary storage V must be 128rN bytes in length; the temporary\n * storage XY must be 256r + 64 bytes in length.  The value N must be a\n * power of 2 greater than 1.  The arrays B, V, and XY must be aligned to a\n * multiple of 64 bytes.\n */\nstatic void\nsmix(uint8_t * B, size_t r, uint64_t N, uint32_t * V, uint32_t * XY)\n{\n\tuint32_t * X = XY;\n\tuint32_t * Y = &XY[32 * r];\n\tuint32_t * Z = &XY[64 * r];\n\tuint64_t i;\n\tuint64_t j;\n\tsize_t k;\n\n\t/* 1: X <-- B */\n\tfor (k = 0; k < 32 * r; k++)\n\t\tX[k] = le32dec(&B[4 * k]);\n\n\t/* 2: for i = 0 to N - 1 do */\n\tfor (i = 0; i < N; i += 2) {\n\t\t/* 3: V_i <-- X */\n\t\tblkcpy((escrypt_block_t*)&V[i * (32 * r)], (escrypt_block_t*)X, 128 * r);\n\n\t\t/* 4: X <-- H(X) */\n\t\tblockmix_salsa8(X, Y, Z, r);\n\n\t\t/* 3: V_i <-- X */\n\t\tblkcpy((escrypt_block_t*)&V[(i + 1) * (32 * r)], (escrypt_block_t*)Y, 128 * r);\n\n\t\t/* 4: X <-- H(X) */\n\t\tblockmix_salsa8(Y, X, Z, r);\n\t}\n\n\t/* 6: for i = 0 to N - 1 do */\n\tfor (i = 0; i < N; i += 2) {\n\t\t/* 7: j <-- Integerify(X) mod N */\n\t\tj = integerify(X, r) & (N - 1);\n\n\t\t/* 8: X <-- H(X \\xor V_j) */\n\t\tblkxor((escrypt_block_t*)X, (escrypt_block_t*)&V[j * (32 * r)], 128 * r);\n\t\tblockmix_salsa8(X, Y, Z, r);\n\n\t\t/* 7: j <-- Integerify(X) mod N */\n\t\tj = integerify(Y, r) & (N - 1);\n\n\t\t/* 8: X <-- H(X \\xor V_j) */\n\t\tblkxor((escrypt_block_t*)Y, (escrypt_block_t*)&V[j * (32 * r)], 128 * r);\n\t\tblockmix_salsa8(Y, X, Z, r);\n\t}\n\t/* 10: B' <-- X */\n\tfor (k = 0; k < 32 * r; k++)\n\t\tle32enc(&B[4 * k], X[k]);\n}\n\n/**\n * escrypt_kdf(local, passwd, passwdlen, salt, saltlen,\n *     N, r, p, buf, buflen):\n * Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r,\n * p, buflen) and write the result into buf.  The parameters r, p, and buflen\n * must satisfy r * p < 2^30 and buflen <= (2^32 - 1) * 32.  The parameter N\n * must be a power of 2 greater than 1.\n *\n * Return 0 on success; or -1 on error.\n */\nint\nescrypt_kdf_nosse(escrypt_local_t * local,\n    const uint8_t * passwd, size_t passwdlen,\n    const uint8_t * salt, size_t saltlen,\n    uint64_t N, uint32_t _r, uint32_t _p,\n    uint8_t * buf, size_t buflen)\n{\n\tsize_t B_size, V_size, XY_size, need;\n\tuint8_t * B;\n\tuint32_t * V, * XY;\n    size_t r = _r, p = _p;\n\tuint32_t i;\n\n\t/* Sanity-check parameters. */\n#if SIZE_MAX > UINT32_MAX\n\tif (buflen > (((uint64_t)(1) << 32) - 1) * 32) {\n\t\terrno = EFBIG;\n\t\treturn -1;\n\t}\n#endif\n\tif ((uint64_t)(r) * (uint64_t)(p) >= (1 << 30)) {\n\t\terrno = EFBIG;\n\t\treturn -1;\n\t}\n\tif (N > UINT32_MAX) {\n\t\terrno = EFBIG;\n\t\treturn -1;\n\t}\n\tif (((N & (N - 1)) != 0) || (N < 2)) {\n\t\terrno = EINVAL;\n\t\treturn -1;\n\t}\n\tif (r == 0 || p == 0) {\n\t\terrno = EINVAL;\n\t\treturn -1;\n\t}\n\tif ((r > SIZE_MAX / 128 / p) ||\n#if SIZE_MAX / 256 <= UINT32_MAX\n\t    (r > SIZE_MAX / 256) ||\n#endif\n\t    (N > SIZE_MAX / 128 / r)) {\n\t\terrno = ENOMEM;\n\t\treturn -1;\n\t}\n\n\t/* Allocate memory. */\n\tB_size = (size_t)128 * r * p;\n\tV_size = (size_t)128 * r * N;\n\tneed = B_size + V_size;\n\tif (need < V_size) {\n\t\terrno = ENOMEM;\n\t\treturn -1;\n\t}\n\tXY_size = (size_t)256 * r + 64;\n\tneed += XY_size;\n\tif (need < XY_size) {\n\t\terrno = ENOMEM;\n\t\treturn -1;\n\t}\n\tif (local->size < need) {\n\t\tif (free_region(local))\n\t\t\treturn -1;\n\t\tif (!alloc_region(local, need))\n\t\t\treturn -1;\n\t}\n\tB = (uint8_t *)local->aligned;\n\tV = (uint32_t *)((uint8_t *)B + B_size);\n\tXY = (uint32_t *)((uint8_t *)V + V_size);\n\n\t/* 1: (B_0 ... B_{p-1}) <-- PBKDF2(P, S, 1, p * MFLen) */\n\tPBKDF2_SHA256(passwd, passwdlen, salt, saltlen, 1, B, B_size);\n\n\t/* 2: for i = 0 to p - 1 do */\n\tfor (i = 0; i < p; i++) {\n\t\t/* 3: B_i <-- MF(B_i, N) */\n\t\tsmix(&B[(size_t)128 * i * r], r, N, V, XY);\n\t}\n\n\t/* 5: DK <-- PBKDF2(P, B, 1, dkLen) */\n\tPBKDF2_SHA256(passwd, passwdlen, B, B_size, 1, buf, buflen);\n\n\t/* Success! */\n\treturn 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.c",
    "content": "/*-\n * Copyright 2005,2007,2009 Colin Percival\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include <stdlib.h>\n#include <sys/types.h>\n\n#include <stdint.h>\n#include <string.h>\n\n#include \"crypto_auth_hmacsha256.h\"\n#include \"pbkdf2-sha256.h\"\n#include \"sysendian.h\"\n#include \"utils.h\"\n\n/**\n * PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen):\n * Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and\n * write the output to buf.  The value dkLen must be at most 32 * (2^32 - 1).\n */\nvoid\nPBKDF2_SHA256(const uint8_t * passwd, size_t passwdlen, const uint8_t * salt,\n              size_t saltlen, uint64_t c, uint8_t * buf, size_t dkLen)\n{\n    crypto_auth_hmacsha256_state PShctx, hctx;\n    size_t          i;\n    uint8_t         ivec[4];\n    uint8_t         U[32];\n    uint8_t         T[32];\n    uint64_t        j;\n    int             k;\n    size_t          clen;\n\n    if (dkLen > 0x1fffffffe0ULL) {\n        abort();\n    }\n    crypto_auth_hmacsha256_init(&PShctx, passwd, passwdlen);\n    crypto_auth_hmacsha256_update(&PShctx, salt, saltlen);\n\n    for (i = 0; i * 32 < dkLen; i++) {\n        be32enc(ivec, (uint32_t)(i + 1));\n        memcpy(&hctx, &PShctx, sizeof(crypto_auth_hmacsha256_state));\n        crypto_auth_hmacsha256_update(&hctx, ivec, 4);\n        crypto_auth_hmacsha256_final(&hctx, U);\n\n        memcpy(T, U, 32);\n        /* LCOV_EXCL_START */\n        for (j = 2; j <= c; j++) {\n            crypto_auth_hmacsha256_init(&hctx, passwd, passwdlen);\n            crypto_auth_hmacsha256_update(&hctx, U, 32);\n            crypto_auth_hmacsha256_final(&hctx, U);\n\n            for (k = 0; k < 32; k++) {\n                T[k] ^= U[k];\n            }\n        }\n        /* LCOV_EXCL_STOP */\n\n        clen = dkLen - i * 32;\n        if (clen > 32) {\n            clen = 32;\n        }\n        memcpy(&buf[i * 32], T, clen);\n    }\n    sodium_memzero((void *) &PShctx, sizeof PShctx);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/pbkdf2-sha256.h",
    "content": "/*-\n * Copyright 2005,2007,2009 Colin Percival\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n */\n\n#ifndef pbkdf2_sha256_H\n#define pbkdf2_sha256_H\n\n#include <sys/types.h>\n\n#include <stdint.h>\n\n#include \"crypto_auth_hmacsha256.h\"\n\n/**\n * PBKDF2_SHA256(passwd, passwdlen, salt, saltlen, c, buf, dkLen):\n * Compute PBKDF2(passwd, salt, c, dkLen) using HMAC-SHA256 as the PRF, and\n * write the output to buf.  The value dkLen must be at most 32 * (2^32 - 1).\n */\nvoid PBKDF2_SHA256(const uint8_t *, size_t, const uint8_t *, size_t,\n                   uint64_t, uint8_t *, size_t);\n\n#endif /* !_SHA256_H_ */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/pwhash_scryptsalsa208sha256.c",
    "content": "\n#include <errno.h>\n#include <limits.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <string.h>\n\n#include \"crypto_pwhash_scryptsalsa208sha256.h\"\n#include \"crypto_scrypt.h\"\n#include \"randombytes.h\"\n#include \"utils.h\"\n\n#define SETTING_SIZE(saltbytes) \\\n    (sizeof \"$7$\" - 1U) + \\\n    (1U /* N_log2 */) + (5U /* r */) + (5U /* p */) + BYTES2CHARS(saltbytes)\n\nstatic int\npickparams(unsigned long long opslimit, const size_t memlimit,\n           uint32_t * const N_log2, uint32_t * const p, uint32_t * const r)\n{\n    unsigned long long maxN;\n    unsigned long long maxrp;\n\n    if (opslimit < 32768) {\n        opslimit = 32768;\n    }\n    *r = 8;\n    if (opslimit < memlimit / 32) {\n        *p = 1;\n        maxN = opslimit / (*r * 4);\n        for (*N_log2 = 1; *N_log2 < 63; *N_log2 += 1) {\n            if ((uint64_t)(1) << *N_log2 > maxN / 2) {\n                break;\n            }\n        }\n    } else {\n        maxN = memlimit / ((size_t) *r * 128);\n        for (*N_log2 = 1; *N_log2 < 63; *N_log2 += 1) {\n            if ((uint64_t) (1) << *N_log2 > maxN / 2) {\n                break;\n            }\n        }\n        maxrp = (opslimit / 4) / ((uint64_t) (1) << *N_log2);\n        /* LCOV_EXCL_START */\n        if (maxrp > 0x3fffffff) {\n            maxrp = 0x3fffffff;\n        }\n        /* LCOV_EXCL_STOP */\n        *p = (uint32_t) (maxrp) / *r;\n    }\n    return 0;\n}\n\nsize_t\ncrypto_pwhash_scryptsalsa208sha256_saltbytes(void)\n{\n    return crypto_pwhash_scryptsalsa208sha256_SALTBYTES;\n}\n\nsize_t\ncrypto_pwhash_scryptsalsa208sha256_strbytes(void)\n{\n    return crypto_pwhash_scryptsalsa208sha256_STRBYTES;\n}\n\nconst char *\ncrypto_pwhash_scryptsalsa208sha256_strprefix(void)\n{\n    return crypto_pwhash_scryptsalsa208sha256_STRPREFIX;\n}\n\nsize_t\ncrypto_pwhash_scryptsalsa208sha256_opslimit_interactive(void)\n{\n    return crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE;\n}\n\nsize_t\ncrypto_pwhash_scryptsalsa208sha256_memlimit_interactive(void)\n{\n    return crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE;\n}\n\nsize_t\ncrypto_pwhash_scryptsalsa208sha256_opslimit_sensitive(void)\n{\n    return crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_SENSITIVE;\n}\n\nsize_t\ncrypto_pwhash_scryptsalsa208sha256_memlimit_sensitive(void)\n{\n    return crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_SENSITIVE;\n}\n\nint\ncrypto_pwhash_scryptsalsa208sha256(unsigned char * const out,\n                                   unsigned long long outlen,\n                                   const char * const passwd,\n                                   unsigned long long passwdlen,\n                                   const unsigned char * const salt,\n                                   unsigned long long opslimit,\n                                   size_t memlimit)\n{\n    uint32_t N_log2;\n    uint32_t p;\n    uint32_t r;\n\n    memset(out, 0, outlen);\n    if (passwdlen > SIZE_MAX || outlen > SIZE_MAX) {\n        errno = EFBIG; /* LCOV_EXCL_LINE */\n        return -1; /* LCOV_EXCL_LINE */\n    }\n    if (pickparams(opslimit, memlimit, &N_log2, &p, &r) != 0) {\n        errno = EINVAL; /* LCOV_EXCL_LINE */\n        return -1; /* LCOV_EXCL_LINE */\n    }\n    return crypto_pwhash_scryptsalsa208sha256_ll((const uint8_t *) passwd,\n                                                 (size_t) passwdlen,\n                                                 (const uint8_t *) salt,\n                                                 crypto_pwhash_scryptsalsa208sha256_SALTBYTES,\n                                                 (uint64_t) (1) << N_log2, r, p,\n                                                 out, (size_t) outlen);\n}\n\nint\ncrypto_pwhash_scryptsalsa208sha256_str(char out[crypto_pwhash_scryptsalsa208sha256_STRBYTES],\n                                       const char * const passwd,\n                                       unsigned long long passwdlen,\n                                       unsigned long long opslimit,\n                                       size_t memlimit)\n{\n    uint8_t         salt[crypto_pwhash_scryptsalsa208sha256_STRSALTBYTES];\n    char            setting[crypto_pwhash_scryptsalsa208sha256_STRSETTINGBYTES + 1U];\n    escrypt_local_t escrypt_local;\n    uint32_t        N_log2;\n    uint32_t        p;\n    uint32_t        r;\n\n    memset(out, 0, crypto_pwhash_scryptsalsa208sha256_STRBYTES);\n    if (passwdlen > SIZE_MAX) {\n        errno = EFBIG; /* LCOV_EXCL_LINE */\n        return -1; /* LCOV_EXCL_LINE */\n    }\n    if (pickparams(opslimit, memlimit, &N_log2, &p, &r) != 0) {\n        errno = EINVAL; /* LCOV_EXCL_LINE */\n        return -1; /* LCOV_EXCL_LINE */\n    }\n    randombytes_buf(salt, sizeof salt);\n    if (escrypt_gensalt_r(N_log2, r, p, salt, sizeof salt,\n                          (uint8_t *) setting, sizeof setting) == NULL) {\n        errno = EINVAL; /* LCOV_EXCL_LINE */\n        return -1; /* LCOV_EXCL_LINE */\n    }\n    if (escrypt_init_local(&escrypt_local) != 0) {\n        return -1; /* LCOV_EXCL_LINE */\n    }\n    if (escrypt_r(&escrypt_local, (const uint8_t *) passwd, (size_t) passwdlen,\n                  (const uint8_t *) setting, (uint8_t *) out,\n                  crypto_pwhash_scryptsalsa208sha256_STRBYTES) == NULL) {\n        /* LCOV_EXCL_START */\n        escrypt_free_local(&escrypt_local);\n        errno = EINVAL;\n        return -1;\n        /* LCOV_EXCL_STOP */\n    }\n    escrypt_free_local(&escrypt_local);\n\n    (void) sizeof\n        (int[SETTING_SIZE(crypto_pwhash_scryptsalsa208sha256_STRSALTBYTES)\n            == crypto_pwhash_scryptsalsa208sha256_STRSETTINGBYTES ? 1 : -1]);\n    (void) sizeof\n        (int[crypto_pwhash_scryptsalsa208sha256_STRSETTINGBYTES + 1U +\n             crypto_pwhash_scryptsalsa208sha256_STRHASHBYTES_ENCODED + 1U\n             == crypto_pwhash_scryptsalsa208sha256_STRBYTES ? 1 : -1]);\n\n    return 0;\n}\n\nint\ncrypto_pwhash_scryptsalsa208sha256_str_verify(const char str[crypto_pwhash_scryptsalsa208sha256_STRBYTES],\n                                              const char * const passwd,\n                                              unsigned long long passwdlen)\n{\n    char            wanted[crypto_pwhash_scryptsalsa208sha256_STRBYTES];\n    escrypt_local_t escrypt_local;\n    int             ret = -1;\n\n    if (memchr(str, 0, crypto_pwhash_scryptsalsa208sha256_STRBYTES) !=\n        &str[crypto_pwhash_scryptsalsa208sha256_STRBYTES - 1U]) {\n        return -1;\n    }\n    if (escrypt_init_local(&escrypt_local) != 0) {\n        return -1; /* LCOV_EXCL_LINE */\n    }\n    if (escrypt_r(&escrypt_local, (const uint8_t *) passwd, (size_t) passwdlen,\n                  (const uint8_t *) str, (uint8_t *) wanted,\n                  sizeof wanted) == NULL) {\n        escrypt_free_local(&escrypt_local);\n        return -1;\n    }\n    escrypt_free_local(&escrypt_local);\n    ret = sodium_memcmp(wanted, str, sizeof wanted);\n    sodium_memzero(wanted, sizeof wanted);\n\n    return ret;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/scrypt_platform.c",
    "content": "/*-\n * Copyright 2013 Alexander Peslyak\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#ifdef HAVE_SYS_MMAN_H\n# include <sys/mman.h>\n#endif\n#include <errno.h>\n#include <stdlib.h>\n\n#include \"crypto_scrypt.h\"\n#include \"runtime.h\"\n\n#if !defined(MAP_ANON) && defined(MAP_ANONYMOUS)\n# define MAP_ANON MAP_ANONYMOUS\n#endif\n\nvoid *\nalloc_region(escrypt_region_t * region, size_t size)\n{\n\tuint8_t * base, * aligned;\n#if defined(MAP_ANON) && defined(HAVE_MMAP)\n\tif ((base = (uint8_t *) mmap(NULL, size, PROT_READ | PROT_WRITE,\n#ifdef MAP_NOCORE\n\t    MAP_ANON | MAP_PRIVATE | MAP_NOCORE,\n#else\n\t    MAP_ANON | MAP_PRIVATE,\n#endif\n\t    -1, 0)) == MAP_FAILED)\n\t\tbase = NULL; /* LCOV_EXCL_LINE */\n\taligned = base;\n#elif defined(HAVE_POSIX_MEMALIGN)\n\tif ((errno = posix_memalign((void **) &base, 64, size)) != 0)\n\t\tbase = NULL;\n\taligned = base;\n#else\n\tbase = aligned = NULL;\n\tif (size + 63 < size)\n\t\terrno = ENOMEM;\n\telse if ((base = (uint8_t *) malloc(size + 63)) != NULL) {\n\t\taligned = base + 63;\n\t\taligned -= (uintptr_t)aligned & 63;\n\t}\n#endif\n\tregion->base = base;\n\tregion->aligned = aligned;\n\tregion->size = base ? size : 0;\n\treturn aligned;\n}\n\nstatic inline void\ninit_region(escrypt_region_t * region)\n{\n\tregion->base = region->aligned = NULL;\n\tregion->size = 0;\n}\n\nint\nfree_region(escrypt_region_t * region)\n{\n\tif (region->base) {\n#if defined(MAP_ANON) && defined(HAVE_MMAP)\n\t\tif (munmap(region->base, region->size))\n\t\t\treturn -1; /* LCOV_EXCL_LINE */\n#else\n\t\tfree(region->base);\n#endif\n\t}\n\tinit_region(region);\n\treturn 0;\n}\n\nint\nescrypt_init_local(escrypt_local_t * local)\n{\n\tinit_region(local);\n\treturn 0;\n}\n\nint\nescrypt_free_local(escrypt_local_t * local)\n{\n\treturn free_region(local);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/sse/pwhash_scryptsalsa208sha256_sse.c",
    "content": "/*-\n * Copyright 2009 Colin Percival\n * Copyright 2012,2013 Alexander Peslyak\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice, this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n *\n * This file was originally written by Colin Percival as part of the Tarsnap\n * online backup system.\n */\n\n#if defined(HAVE_EMMINTRIN_H) || \\\n    (defined(_MSC_VER) && (defined(_M_X64) || defined(_M_AMD64) || defined(_M_IX86)))\n#if __GNUC__\n# pragma GCC target(\"sse2\")\n#endif\n#include <emmintrin.h>\n#if defined(__XOP__) && defined(DISABLED)\n# include <x86intrin.h>\n#endif\n\n#include <errno.h>\n#include <limits.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"../pbkdf2-sha256.h\"\n#include \"../sysendian.h\"\n#include \"../crypto_scrypt.h\"\n\n#if defined(__XOP__) && defined(DISABLED)\n#define ARX(out, in1, in2, s) \\\n\tout = _mm_xor_si128(out, _mm_roti_epi32(_mm_add_epi32(in1, in2), s));\n#else\n#define ARX(out, in1, in2, s) \\\n\t{ \\\n\t\t__m128i T = _mm_add_epi32(in1, in2); \\\n\t\tout = _mm_xor_si128(out, _mm_slli_epi32(T, s)); \\\n\t\tout = _mm_xor_si128(out, _mm_srli_epi32(T, 32-s)); \\\n\t}\n#endif\n\n#define SALSA20_2ROUNDS \\\n\t/* Operate on \"columns\". */ \\\n\tARX(X1, X0, X3, 7) \\\n\tARX(X2, X1, X0, 9) \\\n\tARX(X3, X2, X1, 13) \\\n\tARX(X0, X3, X2, 18) \\\n\\\n\t/* Rearrange data. */ \\\n\tX1 = _mm_shuffle_epi32(X1, 0x93); \\\n\tX2 = _mm_shuffle_epi32(X2, 0x4E); \\\n\tX3 = _mm_shuffle_epi32(X3, 0x39); \\\n\\\n\t/* Operate on \"rows\". */ \\\n\tARX(X3, X0, X1, 7) \\\n\tARX(X2, X3, X0, 9) \\\n\tARX(X1, X2, X3, 13) \\\n\tARX(X0, X1, X2, 18) \\\n\\\n\t/* Rearrange data. */ \\\n\tX1 = _mm_shuffle_epi32(X1, 0x39); \\\n\tX2 = _mm_shuffle_epi32(X2, 0x4E); \\\n\tX3 = _mm_shuffle_epi32(X3, 0x93);\n\n/**\n * Apply the salsa20/8 core to the block provided in (X0 ... X3) ^ (Z0 ... Z3).\n */\n#define SALSA20_8_XOR(in, out) \\\n\t{ \\\n\t\t__m128i Y0 = X0 = _mm_xor_si128(X0, (in)[0]); \\\n\t\t__m128i Y1 = X1 = _mm_xor_si128(X1, (in)[1]); \\\n\t\t__m128i Y2 = X2 = _mm_xor_si128(X2, (in)[2]); \\\n\t\t__m128i Y3 = X3 = _mm_xor_si128(X3, (in)[3]); \\\n\t\tSALSA20_2ROUNDS \\\n\t\tSALSA20_2ROUNDS \\\n\t\tSALSA20_2ROUNDS \\\n\t\tSALSA20_2ROUNDS \\\n\t\t(out)[0] = X0 = _mm_add_epi32(X0, Y0); \\\n\t\t(out)[1] = X1 = _mm_add_epi32(X1, Y1); \\\n\t\t(out)[2] = X2 = _mm_add_epi32(X2, Y2); \\\n\t\t(out)[3] = X3 = _mm_add_epi32(X3, Y3); \\\n\t}\n\n/**\n * blockmix_salsa8(Bin, Bout, r):\n * Compute Bout = BlockMix_{salsa20/8, r}(Bin).  The input Bin must be 128r\n * bytes in length; the output Bout must also be the same size.\n */\nstatic inline void\nblockmix_salsa8(const __m128i * Bin, __m128i * Bout, size_t r)\n{\n\t__m128i X0, X1, X2, X3;\n\tsize_t i;\n\n\t/* 1: X <-- B_{2r - 1} */\n\tX0 = Bin[8 * r - 4];\n\tX1 = Bin[8 * r - 3];\n\tX2 = Bin[8 * r - 2];\n\tX3 = Bin[8 * r - 1];\n\n\t/* 3: X <-- H(X \\xor B_i) */\n\t/* 4: Y_i <-- X */\n\t/* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */\n\tSALSA20_8_XOR(Bin, Bout)\n\n\t/* 2: for i = 0 to 2r - 1 do */\n\tr--;\n\tfor (i = 0; i < r;) {\n\t\t/* 3: X <-- H(X \\xor B_i) */\n\t\t/* 4: Y_i <-- X */\n\t\t/* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */\n\t\tSALSA20_8_XOR(&Bin[i * 8 + 4], &Bout[(r + i) * 4 + 4])\n\n\t\ti++;\n\n\t\t/* 3: X <-- H(X \\xor B_i) */\n\t\t/* 4: Y_i <-- X */\n\t\t/* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */\n\t\tSALSA20_8_XOR(&Bin[i * 8], &Bout[i * 4])\n\t}\n\n\t/* 3: X <-- H(X \\xor B_i) */\n\t/* 4: Y_i <-- X */\n\t/* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */\n\tSALSA20_8_XOR(&Bin[i * 8 + 4], &Bout[(r + i) * 4 + 4])\n}\n\n#define XOR4(in) \\\n\tX0 = _mm_xor_si128(X0, (in)[0]); \\\n\tX1 = _mm_xor_si128(X1, (in)[1]); \\\n\tX2 = _mm_xor_si128(X2, (in)[2]); \\\n\tX3 = _mm_xor_si128(X3, (in)[3]);\n\n#define XOR4_2(in1, in2) \\\n\tX0 = _mm_xor_si128((in1)[0], (in2)[0]); \\\n\tX1 = _mm_xor_si128((in1)[1], (in2)[1]); \\\n\tX2 = _mm_xor_si128((in1)[2], (in2)[2]); \\\n\tX3 = _mm_xor_si128((in1)[3], (in2)[3]);\n\nstatic inline uint32_t\nblockmix_salsa8_xor(const __m128i * Bin1, const __m128i * Bin2, __m128i * Bout,\n    size_t r)\n{\n\t__m128i X0, X1, X2, X3;\n\tsize_t i;\n\n\t/* 1: X <-- B_{2r - 1} */\n\tXOR4_2(&Bin1[8 * r - 4], &Bin2[8 * r - 4])\n\n\t/* 3: X <-- H(X \\xor B_i) */\n\t/* 4: Y_i <-- X */\n\t/* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */\n\tXOR4(Bin1)\n\tSALSA20_8_XOR(Bin2, Bout)\n\n\t/* 2: for i = 0 to 2r - 1 do */\n\tr--;\n\tfor (i = 0; i < r;) {\n\t\t/* 3: X <-- H(X \\xor B_i) */\n\t\t/* 4: Y_i <-- X */\n\t\t/* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */\n\t\tXOR4(&Bin1[i * 8 + 4])\n\t\tSALSA20_8_XOR(&Bin2[i * 8 + 4], &Bout[(r + i) * 4 + 4])\n\n\t\ti++;\n\n\t\t/* 3: X <-- H(X \\xor B_i) */\n\t\t/* 4: Y_i <-- X */\n\t\t/* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */\n\t\tXOR4(&Bin1[i * 8])\n\t\tSALSA20_8_XOR(&Bin2[i * 8], &Bout[i * 4])\n\t}\n\n\t/* 3: X <-- H(X \\xor B_i) */\n\t/* 4: Y_i <-- X */\n\t/* 6: B' <-- (Y_0, Y_2 ... Y_{2r-2}, Y_1, Y_3 ... Y_{2r-1}) */\n\tXOR4(&Bin1[i * 8 + 4])\n\tSALSA20_8_XOR(&Bin2[i * 8 + 4], &Bout[(r + i) * 4 + 4])\n\n\treturn _mm_cvtsi128_si32(X0);\n}\n\n#undef ARX\n#undef SALSA20_2ROUNDS\n#undef SALSA20_8_XOR\n#undef XOR4\n#undef XOR4_2\n\n/**\n * integerify(B, r):\n * Return the result of parsing B_{2r-1} as a little-endian integer.\n */\nstatic inline uint32_t\nintegerify(const void * B, size_t r)\n{\n\treturn *(const uint32_t *)((uintptr_t)(B) + (2 * r - 1) * 64);\n}\n\n/**\n * smix(B, r, N, V, XY):\n * Compute B = SMix_r(B, N).  The input B must be 128r bytes in length;\n * the temporary storage V must be 128rN bytes in length; the temporary\n * storage XY must be 256r + 64 bytes in length.  The value N must be a\n * power of 2 greater than 1.  The arrays B, V, and XY must be aligned to a\n * multiple of 64 bytes.\n */\nstatic void\nsmix(uint8_t * B, size_t r, uint32_t N, void * V, void * XY)\n{\n\tsize_t s = 128 * r;\n\t__m128i * X = (__m128i *) V, * Y;\n\tuint32_t * X32 = (uint32_t *) V;\n\tuint32_t i, j;\n\tsize_t k;\n\n\t/* 1: X <-- B */\n\t/* 3: V_i <-- X */\n\tfor (k = 0; k < 2 * r; k++) {\n\t\tfor (i = 0; i < 16; i++) {\n\t\t\tX32[k * 16 + i] =\n\t\t\t    le32dec(&B[(k * 16 + (i * 5 % 16)) * 4]);\n\t\t}\n\t}\n\n\t/* 2: for i = 0 to N - 1 do */\n\tfor (i = 1; i < N - 1; i += 2) {\n\t\t/* 4: X <-- H(X) */\n\t\t/* 3: V_i <-- X */\n\t\tY = (__m128i *)((uintptr_t)(V) + i * s);\n\t\tblockmix_salsa8(X, Y, r);\n\n\t\t/* 4: X <-- H(X) */\n\t\t/* 3: V_i <-- X */\n\t\tX = (__m128i *)((uintptr_t)(V) + (i + 1) * s);\n\t\tblockmix_salsa8(Y, X, r);\n\t}\n\n\t/* 4: X <-- H(X) */\n\t/* 3: V_i <-- X */\n\tY = (__m128i *)((uintptr_t)(V) + i * s);\n\tblockmix_salsa8(X, Y, r);\n\n\t/* 4: X <-- H(X) */\n\t/* 3: V_i <-- X */\n\tX = (__m128i *) XY;\n\tblockmix_salsa8(Y, X, r);\n\n\tX32 = (uint32_t *) XY;\n\tY = (__m128i *)((uintptr_t)(XY) + s);\n\n\t/* 7: j <-- Integerify(X) mod N */\n\tj = integerify(X, r) & (N - 1);\n\n\t/* 6: for i = 0 to N - 1 do */\n\tfor (i = 0; i < N; i += 2) {\n\t\t__m128i * V_j = (__m128i *)((uintptr_t)(V) + j * s);\n\n\t\t/* 8: X <-- H(X \\xor V_j) */\n\t\t/* 7: j <-- Integerify(X) mod N */\n\t\tj = blockmix_salsa8_xor(X, V_j, Y, r) & (N - 1);\n\t\tV_j = (__m128i *)((uintptr_t)(V) + j * s);\n\n\t\t/* 8: X <-- H(X \\xor V_j) */\n\t\t/* 7: j <-- Integerify(X) mod N */\n\t\tj = blockmix_salsa8_xor(Y, V_j, X, r) & (N - 1);\n\t}\n\n\t/* 10: B' <-- X */\n\tfor (k = 0; k < 2 * r; k++) {\n\t\tfor (i = 0; i < 16; i++) {\n\t\t\tle32enc(&B[(k * 16 + (i * 5 % 16)) * 4],\n\t\t\t    X32[k * 16 + i]);\n\t\t}\n\t}\n}\n\n/**\n * escrypt_kdf(local, passwd, passwdlen, salt, saltlen,\n *     N, r, p, buf, buflen):\n * Compute scrypt(passwd[0 .. passwdlen - 1], salt[0 .. saltlen - 1], N, r,\n * p, buflen) and write the result into buf.  The parameters r, p, and buflen\n * must satisfy r * p < 2^30 and buflen <= (2^32 - 1) * 32.  The parameter N\n * must be a power of 2 greater than 1.\n *\n * Return 0 on success; or -1 on error.\n */\nint\nescrypt_kdf_sse(escrypt_local_t * local,\n    const uint8_t * passwd, size_t passwdlen,\n    const uint8_t * salt, size_t saltlen,\n    uint64_t N, uint32_t _r, uint32_t _p,\n    uint8_t * buf, size_t buflen)\n{\n\tsize_t B_size, V_size, XY_size, need;\n\tuint8_t * B;\n\tuint32_t * V, * XY;\n    size_t r = _r, p = _p;\n\tuint32_t i;\n\n\t/* Sanity-check parameters. */\n#if SIZE_MAX > UINT32_MAX\n\tif (buflen > (((uint64_t)(1) << 32) - 1) * 32) {\n\t\terrno = EFBIG;\n\t\treturn -1;\n\t}\n#endif\n\tif ((uint64_t)(r) * (uint64_t)(p) >= (1 << 30)) {\n\t\terrno = EFBIG;\n\t\treturn -1;\n\t}\n\tif (N > UINT32_MAX) {\n\t\terrno = EFBIG;\n\t\treturn -1;\n\t}\n\tif (((N & (N - 1)) != 0) || (N < 2)) {\n\t\terrno = EINVAL;\n\t\treturn -1;\n\t}\n\tif (r == 0 || p == 0) {\n\t\terrno = EINVAL;\n\t\treturn -1;\n\t}\n\tif ((r > SIZE_MAX / 128 / p) ||\n#if SIZE_MAX / 256 <= UINT32_MAX\n\t    (r > SIZE_MAX / 256) ||\n#endif\n\t    (N > SIZE_MAX / 128 / r)) {\n\t\terrno = ENOMEM;\n\t\treturn -1;\n\t}\n\n\t/* Allocate memory. */\n\tB_size = (size_t)128 * r * p;\n\tV_size = (size_t)128 * r * N;\n\tneed = B_size + V_size;\n\tif (need < V_size) {\n\t\terrno = ENOMEM;\n\t\treturn -1;\n\t}\n\tXY_size = (size_t)256 * r + 64;\n\tneed += XY_size;\n\tif (need < XY_size) {\n\t\terrno = ENOMEM;\n\t\treturn -1;\n\t}\n\tif (local->size < need) {\n\t\tif (free_region(local))\n\t\t\treturn -1; /* LCOV_EXCL_LINE */\n\t\tif (!alloc_region(local, need))\n\t\t\treturn -1; /* LCOV_EXCL_LINE */\n\t}\n\tB = (uint8_t *)local->aligned;\n\tV = (uint32_t *)((uint8_t *)B + B_size);\n\tXY = (uint32_t *)((uint8_t *)V + V_size);\n\n\t/* 1: (B_0 ... B_{p-1}) <-- PBKDF2(P, S, 1, p * MFLen) */\n\tPBKDF2_SHA256(passwd, passwdlen, salt, saltlen, 1, B, B_size);\n\n\t/* 2: for i = 0 to p - 1 do */\n\tfor (i = 0; i < p; i++) {\n\t\t/* 3: B_i <-- MF(B_i, N) */\n\t\tsmix(&B[(size_t)128 * i * r], r, (uint32_t) N, V, XY);\n\t}\n\n\t/* 5: DK <-- PBKDF2(P, B, 1, dkLen) */\n\tPBKDF2_SHA256(passwd, passwdlen, B, B_size, 1, buf, buflen);\n\n\t/* Success! */\n\treturn 0;\n}\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_pwhash/scryptsalsa208sha256/sysendian.h",
    "content": "#ifndef sysendian_H\n#define sysendian_H\n\n#include <stdint.h>\n\n/* Avoid namespace collisions with BSD <sys/endian.h>. */\n#define be16dec scrypt_be16dec\n#define be16enc scrypt_be16enc\n#define be32dec scrypt_be32dec\n#define be32enc scrypt_be32enc\n#define be64dec scrypt_be64dec\n#define be64enc scrypt_be64enc\n#define le16dec scrypt_le16dec\n#define le16enc scrypt_le16enc\n#define le32dec scrypt_le32dec\n#define le32enc scrypt_le32enc\n#define le64dec scrypt_le64dec\n#define le64enc scrypt_le64enc\n\nstatic inline uint16_t\nbe16dec(const void *pp)\n{\n\tconst uint8_t *p = (uint8_t const *)pp;\n\n\treturn ((uint16_t)(p[1]) + ((uint16_t)(p[0]) << 8));\n}\n\nstatic inline void\nbe16enc(void *pp, uint16_t x)\n{\n\tuint8_t * p = (uint8_t *)pp;\n\n\tp[1] = x & 0xff;\n\tp[0] = (x >> 8) & 0xff;\n}\n\nstatic inline uint32_t\nbe32dec(const void *pp)\n{\n\tconst uint8_t *p = (uint8_t const *)pp;\n\n\treturn ((uint32_t)(p[3]) + ((uint32_t)(p[2]) << 8) +\n\t    ((uint32_t)(p[1]) << 16) + ((uint32_t)(p[0]) << 24));\n}\n\nstatic inline void\nbe32enc(void *pp, uint32_t x)\n{\n\tuint8_t * p = (uint8_t *)pp;\n\n\tp[3] = x & 0xff;\n\tp[2] = (x >> 8) & 0xff;\n\tp[1] = (x >> 16) & 0xff;\n\tp[0] = (x >> 24) & 0xff;\n}\n\nstatic inline uint64_t\nbe64dec(const void *pp)\n{\n\tconst uint8_t *p = (uint8_t const *)pp;\n\n\treturn ((uint64_t)(p[7]) + ((uint64_t)(p[6]) << 8) +\n\t    ((uint64_t)(p[5]) << 16) + ((uint64_t)(p[4]) << 24) +\n\t    ((uint64_t)(p[3]) << 32) + ((uint64_t)(p[2]) << 40) +\n\t    ((uint64_t)(p[1]) << 48) + ((uint64_t)(p[0]) << 56));\n}\n\nstatic inline void\nbe64enc(void *pp, uint64_t x)\n{\n\tuint8_t * p = (uint8_t *)pp;\n\n\tp[7] = x & 0xff;\n\tp[6] = (x >> 8) & 0xff;\n\tp[5] = (x >> 16) & 0xff;\n\tp[4] = (x >> 24) & 0xff;\n\tp[3] = (x >> 32) & 0xff;\n\tp[2] = (x >> 40) & 0xff;\n\tp[1] = (x >> 48) & 0xff;\n\tp[0] = (x >> 56) & 0xff;\n}\n\nstatic inline uint16_t\nle16dec(const void *pp)\n{\n\tconst uint8_t *p = (uint8_t const *)pp;\n\n\treturn ((uint16_t)(p[0]) + ((uint16_t)(p[1]) << 8));\n}\n\nstatic inline void\nle16enc(void *pp, uint16_t x)\n{\n\tuint8_t * p = (uint8_t *)pp;\n\n\tp[0] = x & 0xff;\n\tp[1] = (x >> 8) & 0xff;\n}\n\nstatic inline uint32_t\nle32dec(const void *pp)\n{\n\tconst uint8_t *p = (uint8_t const *)pp;\n\n\treturn ((uint32_t)(p[0]) + ((uint32_t)(p[1]) << 8) +\n\t    ((uint32_t)(p[2]) << 16) + ((uint32_t)(p[3]) << 24));\n}\n\nstatic inline void\nle32enc(void *pp, uint32_t x)\n{\n\tuint8_t * p = (uint8_t *)pp;\n\n\tp[0] = x & 0xff;\n\tp[1] = (x >> 8) & 0xff;\n\tp[2] = (x >> 16) & 0xff;\n\tp[3] = (x >> 24) & 0xff;\n}\n\nstatic inline uint64_t\nle64dec(const void *pp)\n{\n\tconst uint8_t *p = (uint8_t const *)pp;\n\n\treturn ((uint64_t)(p[0]) + ((uint64_t)(p[1]) << 8) +\n\t    ((uint64_t)(p[2]) << 16) + ((uint64_t)(p[3]) << 24) +\n\t    ((uint64_t)(p[4]) << 32) + ((uint64_t)(p[5]) << 40) +\n\t    ((uint64_t)(p[6]) << 48) + ((uint64_t)(p[7]) << 56));\n}\n\nstatic inline void\nle64enc(void *pp, uint64_t x)\n{\n\tuint8_t * p = (uint8_t *)pp;\n\n\tp[0] = x & 0xff;\n\tp[1] = (x >> 8) & 0xff;\n\tp[2] = (x >> 16) & 0xff;\n\tp[3] = (x >> 24) & 0xff;\n\tp[4] = (x >> 32) & 0xff;\n\tp[5] = (x >> 40) & 0xff;\n\tp[6] = (x >> 48) & 0xff;\n\tp[7] = (x >> 56) & 0xff;\n}\n\n#endif /* !_SYSENDIAN_H_ */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/crypto_scalarmult.c",
    "content": "\n#include \"crypto_scalarmult.h\"\n\nconst char *\ncrypto_scalarmult_primitive(void)\n{\n    return crypto_scalarmult_PRIMITIVE;\n}\n\nint\ncrypto_scalarmult_base(unsigned char *q, const unsigned char *n)\n{\n    return crypto_scalarmult_curve25519_base(q, n);\n}\n\nint\ncrypto_scalarmult(unsigned char *q, const unsigned char *n,\n                  const unsigned char *p)\n{\n    return crypto_scalarmult_curve25519(q, n, p);\n}\n\nsize_t\ncrypto_scalarmult_bytes(void)\n{\n    return crypto_scalarmult_BYTES;\n}\n\nsize_t\ncrypto_scalarmult_scalarbytes(void)\n{\n    return crypto_scalarmult_SCALARBYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/donna_c64/curve25519_donna_c64.c",
    "content": "/* Copyright 2008, Google Inc.\n * All rights reserved.\n *\n * Code released into the public domain.\n *\n * curve25519-donna: Curve25519 elliptic curve, public key function\n *\n * http://code.google.com/p/curve25519-donna/\n *\n * Adam Langley <agl@imperialviolet.org>\n * Parts optimised by floodyberry\n * Derived from public domain C code by Daniel J. Bernstein <djb@cr.yp.to>\n *\n * More information about curve25519 can be found here\n *   http://cr.yp.to/ecdh.html\n *\n * djb's sample implementation of curve25519 is written in a special assembly\n * language called qhasm and uses the floating point registers.\n *\n * This is, almost, a clean room reimplementation from the curve25519 paper. It\n * uses many of the tricks described therein. Only the crecip function is taken\n * from the sample implementation.\n */\n\n#include <string.h>\n#include <stdint.h>\n\n#ifdef HAVE_TI_MODE\n\n#include \"utils.h\"\n#include \"curve25519_donna_c64.h\"\n#include \"../scalarmult_curve25519.h\"\n\ntypedef uint8_t u8;\ntypedef uint64_t limb;\ntypedef limb felem[5];\n// This is a special gcc mode for 128-bit integers. It's implemented on 64-bit\n// platforms only as far as I know.\ntypedef unsigned uint128_t __attribute__((mode(TI)));\n\n/* Sum two numbers: output += in */\nstatic inline void\nfsum(limb *output, const limb *in) {\n  output[0] += in[0];\n  output[1] += in[1];\n  output[2] += in[2];\n  output[3] += in[3];\n  output[4] += in[4];\n}\n\n/* Find the difference of two numbers: output = in - output\n * (note the order of the arguments!)\n *\n * Assumes that out[i] < 2**52\n * On return, out[i] < 2**55\n */\nstatic inline void\nfdifference_backwards(felem out, const felem in) {\n  /* 152 is 19 << 3 */\n  static const limb two54m152 = (((limb)1) << 54) - 152;\n  static const limb two54m8 = (((limb)1) << 54) - 8;\n\n  out[0] = in[0] + two54m152 - out[0];\n  out[1] = in[1] + two54m8 - out[1];\n  out[2] = in[2] + two54m8 - out[2];\n  out[3] = in[3] + two54m8 - out[3];\n  out[4] = in[4] + two54m8 - out[4];\n}\n\n/* Multiply a number by a scalar: output = in * scalar */\nstatic inline void\nfscalar_product(felem output, const felem in, const limb scalar) {\n  uint128_t a;\n\n  a = ((uint128_t) in[0]) * scalar;\n  output[0] = ((limb)a) & 0x7ffffffffffff;\n\n  a = ((uint128_t) in[1]) * scalar + ((limb) (a >> 51));\n  output[1] = ((limb)a) & 0x7ffffffffffff;\n\n  a = ((uint128_t) in[2]) * scalar + ((limb) (a >> 51));\n  output[2] = ((limb)a) & 0x7ffffffffffff;\n\n  a = ((uint128_t) in[3]) * scalar + ((limb) (a >> 51));\n  output[3] = ((limb)a) & 0x7ffffffffffff;\n\n  a = ((uint128_t) in[4]) * scalar + ((limb) (a >> 51));\n  output[4] = ((limb)a) & 0x7ffffffffffff;\n\n  output[0] += (a >> 51) * 19;\n}\n\n/* Multiply two numbers: output = in2 * in\n *\n * output must be distinct to both inputs. The inputs are reduced coefficient\n * form, the output is not.\n *\n * Assumes that in[i] < 2**55 and likewise for in2.\n * On return, output[i] < 2**52\n */\nstatic inline void\nfmul(felem output, const felem in2, const felem in) {\n  uint128_t t[5];\n  limb r0,r1,r2,r3,r4,s0,s1,s2,s3,s4,c;\n\n  r0 = in[0];\n  r1 = in[1];\n  r2 = in[2];\n  r3 = in[3];\n  r4 = in[4];\n\n  s0 = in2[0];\n  s1 = in2[1];\n  s2 = in2[2];\n  s3 = in2[3];\n  s4 = in2[4];\n\n  t[0]  =  ((uint128_t) r0) * s0;\n  t[1]  =  ((uint128_t) r0) * s1 + ((uint128_t) r1) * s0;\n  t[2]  =  ((uint128_t) r0) * s2 + ((uint128_t) r2) * s0 + ((uint128_t) r1) * s1;\n  t[3]  =  ((uint128_t) r0) * s3 + ((uint128_t) r3) * s0 + ((uint128_t) r1) * s2 + ((uint128_t) r2) * s1;\n  t[4]  =  ((uint128_t) r0) * s4 + ((uint128_t) r4) * s0 + ((uint128_t) r3) * s1 + ((uint128_t) r1) * s3 + ((uint128_t) r2) * s2;\n\n  r4 *= 19;\n  r1 *= 19;\n  r2 *= 19;\n  r3 *= 19;\n\n  t[0] += ((uint128_t) r4) * s1 + ((uint128_t) r1) * s4 + ((uint128_t) r2) * s3 + ((uint128_t) r3) * s2;\n  t[1] += ((uint128_t) r4) * s2 + ((uint128_t) r2) * s4 + ((uint128_t) r3) * s3;\n  t[2] += ((uint128_t) r4) * s3 + ((uint128_t) r3) * s4;\n  t[3] += ((uint128_t) r4) * s4;\n\n                  r0 = (limb)t[0] & 0x7ffffffffffff; c = (limb)(t[0] >> 51);\n  t[1] += c;      r1 = (limb)t[1] & 0x7ffffffffffff; c = (limb)(t[1] >> 51);\n  t[2] += c;      r2 = (limb)t[2] & 0x7ffffffffffff; c = (limb)(t[2] >> 51);\n  t[3] += c;      r3 = (limb)t[3] & 0x7ffffffffffff; c = (limb)(t[3] >> 51);\n  t[4] += c;      r4 = (limb)t[4] & 0x7ffffffffffff; c = (limb)(t[4] >> 51);\n  r0 +=   c * 19; c = r0 >> 51; r0 = r0 & 0x7ffffffffffff;\n  r1 +=   c;      c = r1 >> 51; r1 = r1 & 0x7ffffffffffff;\n  r2 +=   c;\n\n  output[0] = r0;\n  output[1] = r1;\n  output[2] = r2;\n  output[3] = r3;\n  output[4] = r4;\n}\n\nstatic inline void\nfsquare_times(felem output, const felem in, limb count) {\n  uint128_t t[5];\n  limb r0,r1,r2,r3,r4,c;\n  limb d0,d1,d2,d4,d419;\n\n  r0 = in[0];\n  r1 = in[1];\n  r2 = in[2];\n  r3 = in[3];\n  r4 = in[4];\n\n  do {\n    d0 = r0 * 2;\n    d1 = r1 * 2;\n    d2 = r2 * 2 * 19;\n    d419 = r4 * 19;\n    d4 = d419 * 2;\n\n    t[0] = ((uint128_t) r0) * r0 + ((uint128_t) d4) * r1 + (((uint128_t) d2) * (r3     ));\n    t[1] = ((uint128_t) d0) * r1 + ((uint128_t) d4) * r2 + (((uint128_t) r3) * (r3 * 19));\n    t[2] = ((uint128_t) d0) * r2 + ((uint128_t) r1) * r1 + (((uint128_t) d4) * (r3     ));\n    t[3] = ((uint128_t) d0) * r3 + ((uint128_t) d1) * r2 + (((uint128_t) r4) * (d419   ));\n    t[4] = ((uint128_t) d0) * r4 + ((uint128_t) d1) * r3 + (((uint128_t) r2) * (r2     ));\n\n                    r0 = (limb)t[0] & 0x7ffffffffffff; c = (limb)(t[0] >> 51);\n    t[1] += c;      r1 = (limb)t[1] & 0x7ffffffffffff; c = (limb)(t[1] >> 51);\n    t[2] += c;      r2 = (limb)t[2] & 0x7ffffffffffff; c = (limb)(t[2] >> 51);\n    t[3] += c;      r3 = (limb)t[3] & 0x7ffffffffffff; c = (limb)(t[3] >> 51);\n    t[4] += c;      r4 = (limb)t[4] & 0x7ffffffffffff; c = (limb)(t[4] >> 51);\n    r0 +=   c * 19; c = r0 >> 51; r0 = r0 & 0x7ffffffffffff;\n    r1 +=   c;      c = r1 >> 51; r1 = r1 & 0x7ffffffffffff;\n    r2 +=   c;\n  } while(--count);\n\n  output[0] = r0;\n  output[1] = r1;\n  output[2] = r2;\n  output[3] = r3;\n  output[4] = r4;\n}\n\n#ifdef NATIVE_LITTLE_ENDIAN\nstatic inline limb\nload_limb(const u8 *in) {\n    limb out;\n    memcpy(&out, in, sizeof (limb));\n    return out;\n}\nstatic inline void\nstore_limb(u8 *out, limb in) {\n    memcpy(out, &in, sizeof (limb));\n}\n#else\nstatic inline limb\nload_limb(const u8 *in) {\n  return\n    ((limb)in[0]) |\n    (((limb)in[1]) << 8) |\n    (((limb)in[2]) << 16) |\n    (((limb)in[3]) << 24) |\n    (((limb)in[4]) << 32) |\n    (((limb)in[5]) << 40) |\n    (((limb)in[6]) << 48) |\n    (((limb)in[7]) << 56);\n}\n\nstatic inline void\nstore_limb(u8 *out, limb in) {\n  out[0] = in & 0xff;\n  out[1] = (in >> 8) & 0xff;\n  out[2] = (in >> 16) & 0xff;\n  out[3] = (in >> 24) & 0xff;\n  out[4] = (in >> 32) & 0xff;\n  out[5] = (in >> 40) & 0xff;\n  out[6] = (in >> 48) & 0xff;\n  out[7] = (in >> 56) & 0xff;\n}\n#endif\n\n/* Take a little-endian, 32-byte number and expand it into polynomial form */\nstatic void\nfexpand(limb *output, const u8 *in) {\n  output[0] = load_limb(in) & 0x7ffffffffffff;\n  output[1] = (load_limb(in+6) >> 3) & 0x7ffffffffffff;\n  output[2] = (load_limb(in+12) >> 6) & 0x7ffffffffffff;\n  output[3] = (load_limb(in+19) >> 1) & 0x7ffffffffffff;\n  output[4] = (load_limb(in+24) >> 12) & 0x7ffffffffffff;\n}\n\n/* Take a fully reduced polynomial form number and contract it into a\n * little-endian, 32-byte array\n */\nstatic void\nfcontract(u8 *output, const felem input) {\n  uint128_t t[5];\n\n  t[0] = input[0];\n  t[1] = input[1];\n  t[2] = input[2];\n  t[3] = input[3];\n  t[4] = input[4];\n\n  t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff;\n  t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff;\n  t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff;\n  t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff;\n  t[0] += 19 * (t[4] >> 51); t[4] &= 0x7ffffffffffff;\n\n  t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff;\n  t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff;\n  t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff;\n  t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff;\n  t[0] += 19 * (t[4] >> 51); t[4] &= 0x7ffffffffffff;\n\n  /* now t is between 0 and 2^255-1, properly carried. */\n  /* case 1: between 0 and 2^255-20. case 2: between 2^255-19 and 2^255-1. */\n\n  t[0] += 19;\n\n  t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff;\n  t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff;\n  t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff;\n  t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff;\n  t[0] += 19 * (t[4] >> 51); t[4] &= 0x7ffffffffffff;\n\n  /* now between 19 and 2^255-1 in both cases, and offset by 19. */\n\n  t[0] += 0x8000000000000 - 19;\n  t[1] += 0x8000000000000 - 1;\n  t[2] += 0x8000000000000 - 1;\n  t[3] += 0x8000000000000 - 1;\n  t[4] += 0x8000000000000 - 1;\n\n  /* now between 2^255 and 2^256-20, and offset by 2^255. */\n\n  t[1] += t[0] >> 51; t[0] &= 0x7ffffffffffff;\n  t[2] += t[1] >> 51; t[1] &= 0x7ffffffffffff;\n  t[3] += t[2] >> 51; t[2] &= 0x7ffffffffffff;\n  t[4] += t[3] >> 51; t[3] &= 0x7ffffffffffff;\n  t[4] &= 0x7ffffffffffff;\n\n  store_limb(output, t[0] | (t[1] << 51));\n  store_limb(output + 8, (t[1] >> 13) | (t[2] << 38));\n  store_limb(output + 16, (t[2] >> 26) | (t[3] << 25));\n  store_limb(output + 24, (t[3] >> 39) | (t[4] << 12));\n}\n\n/* Input: Q, Q', Q-Q'\n * Output: 2Q, Q+Q'\n *\n *   x2 z3: long form\n *   x3 z3: long form\n *   x z: short form, destroyed\n *   xprime zprime: short form, destroyed\n *   qmqp: short form, preserved\n */\nstatic void\nfmonty(limb *x2, limb *z2, /* output 2Q */\n       limb *x3, limb *z3, /* output Q + Q' */\n       limb *x, limb *z,   /* input Q */\n       limb *xprime, limb *zprime, /* input Q' */\n       const limb *qmqp /* input Q - Q' */) {\n  limb origx[5], origxprime[5], zzz[5], xx[5], zz[5], xxprime[5],\n        zzprime[5], zzzprime[5];\n\n  memcpy(origx, x, 5 * sizeof(limb));\n  fsum(x, z);\n  fdifference_backwards(z, origx);  // does x - z\n\n  memcpy(origxprime, xprime, sizeof(limb) * 5);\n  fsum(xprime, zprime);\n  fdifference_backwards(zprime, origxprime);\n  fmul(xxprime, xprime, z);\n  fmul(zzprime, x, zprime);\n  memcpy(origxprime, xxprime, sizeof(limb) * 5);\n  fsum(xxprime, zzprime);\n  fdifference_backwards(zzprime, origxprime);\n  fsquare_times(x3, xxprime, 1);\n  fsquare_times(zzzprime, zzprime, 1);\n  fmul(z3, zzzprime, qmqp);\n\n  fsquare_times(xx, x, 1);\n  fsquare_times(zz, z, 1);\n  fmul(x2, xx, zz);\n  fdifference_backwards(zz, xx);  // does zz = xx - zz\n  fscalar_product(zzz, zz, 121665);\n  fsum(zzz, xx);\n  fmul(z2, zz, zzz);\n}\n\n// -----------------------------------------------------------------------------\n// Maybe swap the contents of two limb arrays (@a and @b), each @len elements\n// long. Perform the swap iff @swap is non-zero.\n//\n// This function performs the swap without leaking any side-channel\n// information.\n// -----------------------------------------------------------------------------\nstatic void\nswap_conditional(limb a[5], limb b[5], limb iswap) {\n  unsigned i;\n  const limb swap = -iswap;\n\n  for (i = 0; i < 5; ++i) {\n    const limb x = swap & (a[i] ^ b[i]);\n    a[i] ^= x;\n    b[i] ^= x;\n  }\n}\n\n/* Calculates nQ where Q is the x-coordinate of a point on the curve\n *\n *   resultx/resultz: the x coordinate of the resulting curve point (short form)\n *   n: a little endian, 32-byte number\n *   q: a point of the curve (short form)\n */\nstatic void\ncmult(limb *resultx, limb *resultz, const u8 *n, const limb *q) {\n  limb a[5] = {0}, b[5] = {1}, c[5] = {1}, d[5] = {0};\n  limb *nqpqx = a, *nqpqz = b, *nqx = c, *nqz = d, *t;\n  limb e[5] = {0}, f[5] = {1}, g[5] = {0}, h[5] = {1};\n  limb *nqpqx2 = e, *nqpqz2 = f, *nqx2 = g, *nqz2 = h;\n\n  unsigned i, j;\n\n  memcpy(nqpqx, q, sizeof(limb) * 5);\n\n  for (i = 0; i < 32; ++i) {\n    u8 byte = n[31 - i];\n    for (j = 0; j < 8; ++j) {\n      const limb bit = byte >> 7;\n\n      swap_conditional(nqx, nqpqx, bit);\n      swap_conditional(nqz, nqpqz, bit);\n      fmonty(nqx2, nqz2,\n             nqpqx2, nqpqz2,\n             nqx, nqz,\n             nqpqx, nqpqz,\n             q);\n      swap_conditional(nqx2, nqpqx2, bit);\n      swap_conditional(nqz2, nqpqz2, bit);\n\n      t = nqx;\n      nqx = nqx2;\n      nqx2 = t;\n      t = nqz;\n      nqz = nqz2;\n      nqz2 = t;\n      t = nqpqx;\n      nqpqx = nqpqx2;\n      nqpqx2 = t;\n      t = nqpqz;\n      nqpqz = nqpqz2;\n      nqpqz2 = t;\n\n      byte <<= 1;\n    }\n  }\n\n  memcpy(resultx, nqx, sizeof(limb) * 5);\n  memcpy(resultz, nqz, sizeof(limb) * 5);\n}\n\n\n// -----------------------------------------------------------------------------\n// Shamelessly copied from djb's code, tightened a little\n// -----------------------------------------------------------------------------\nstatic void\ncrecip(felem out, const felem z) {\n  felem a,t0,b,c;\n\n  /* 2 */ fsquare_times(a, z, 1); // a = 2\n  /* 8 */ fsquare_times(t0, a, 2);\n  /* 9 */ fmul(b, t0, z); // b = 9\n  /* 11 */ fmul(a, b, a); // a = 11\n  /* 22 */ fsquare_times(t0, a, 1);\n  /* 2^5 - 2^0 = 31 */ fmul(b, t0, b);\n  /* 2^10 - 2^5 */ fsquare_times(t0, b, 5);\n  /* 2^10 - 2^0 */ fmul(b, t0, b);\n  /* 2^20 - 2^10 */ fsquare_times(t0, b, 10);\n  /* 2^20 - 2^0 */ fmul(c, t0, b);\n  /* 2^40 - 2^20 */ fsquare_times(t0, c, 20);\n  /* 2^40 - 2^0 */ fmul(t0, t0, c);\n  /* 2^50 - 2^10 */ fsquare_times(t0, t0, 10);\n  /* 2^50 - 2^0 */ fmul(b, t0, b);\n  /* 2^100 - 2^50 */ fsquare_times(t0, b, 50);\n  /* 2^100 - 2^0 */ fmul(c, t0, b);\n  /* 2^200 - 2^100 */ fsquare_times(t0, c, 100);\n  /* 2^200 - 2^0 */ fmul(t0, t0, c);\n  /* 2^250 - 2^50 */ fsquare_times(t0, t0, 50);\n  /* 2^250 - 2^0 */ fmul(t0, t0, b);\n  /* 2^255 - 2^5 */ fsquare_times(t0, t0, 5);\n  /* 2^255 - 21 */ fmul(out, t0, a);\n}\n\nstatic const unsigned char basepoint[32] = {9};\n\nstatic int\ncrypto_scalarmult_curve25519_donna_c64(unsigned char *mypublic,\n                                       const unsigned char *secret,\n                                       const unsigned char *basepoint) {\n  limb bp[5], x[5], z[5], zmone[5];\n  uint8_t e[32];\n  int i;\n\n  for (i = 0;i < 32;++i) e[i] = secret[i];\n  e[0] &= 248;\n  e[31] &= 127;\n  e[31] |= 64;\n\n  fexpand(bp, basepoint);\n  cmult(x, z, e, bp);\n  crecip(zmone, z);\n  fmul(z, x, zmone);\n  fcontract(mypublic, z);\n  return 0;\n}\n\nstatic int\ncrypto_scalarmult_curve25519_donna_c64_base(unsigned char *q,\n                                            const unsigned char *n)\n{\n  return crypto_scalarmult_curve25519_donna_c64(q, n, basepoint);\n}\n\nstruct crypto_scalarmult_curve25519_implementation\ncrypto_scalarmult_curve25519_donna_c64_implementation = {\n    SODIUM_C99(.mult = ) crypto_scalarmult_curve25519_donna_c64,\n    SODIUM_C99(.mult_base = ) crypto_scalarmult_curve25519_donna_c64_base\n};\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/donna_c64/curve25519_donna_c64.h",
    "content": "#ifndef curve25519_donna_c64_H\n#define curve25519_donna_c64_H\n\n#include \"crypto_scalarmult_curve25519.h\"\n\nextern struct crypto_scalarmult_curve25519_implementation\n    crypto_scalarmult_curve25519_donna_c64_implementation;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/curve25519_ref10.c",
    "content": "\n#include <stddef.h>\n\n#ifndef HAVE_TI_MODE\n\n#include \"utils.h\"\n#include \"curve25519_ref10.h\"\n#include \"../scalarmult_curve25519.h\"\n#include \"fe.h\"\n\nstatic const unsigned char basepoint[32] = {9};\n\nstatic int\ncrypto_scalarmult_curve25519_ref10(unsigned char *q,\n                                   const unsigned char *n,\n                                   const unsigned char *p)\n{\n  unsigned char e[32];\n  unsigned int i;\n  fe x1;\n  fe x2;\n  fe z2;\n  fe x3;\n  fe z3;\n  fe tmp0;\n  fe tmp1;\n  int pos;\n  unsigned int swap;\n  unsigned int b;\n\n  for (i = 0;i < 32;++i) e[i] = n[i];\n  e[0] &= 248;\n  e[31] &= 127;\n  e[31] |= 64;\n  fe_frombytes(x1,p);\n  fe_1(x2);\n  fe_0(z2);\n  fe_copy(x3,x1);\n  fe_1(z3);\n\n  swap = 0;\n  for (pos = 254;pos >= 0;--pos) {\n    b = e[pos / 8] >> (pos & 7);\n    b &= 1;\n    swap ^= b;\n    fe_cswap(x2,x3,swap);\n    fe_cswap(z2,z3,swap);\n    swap = b;\n#include \"montgomery.h\"\n  }\n  fe_cswap(x2,x3,swap);\n  fe_cswap(z2,z3,swap);\n\n  fe_invert(z2,z2);\n  fe_mul(x2,x2,z2);\n  fe_tobytes(q,x2);\n  return 0;\n}\n\nstatic int\ncrypto_scalarmult_curve25519_ref10_base(unsigned char *q,\n                                        const unsigned char *n)\n{\n  return crypto_scalarmult_curve25519_ref10(q,n,basepoint);\n}\n\nstruct crypto_scalarmult_curve25519_implementation\ncrypto_scalarmult_curve25519_ref10_implementation = {\n        SODIUM_C99(.mult = ) crypto_scalarmult_curve25519_ref10,\n        SODIUM_C99(.mult_base = ) crypto_scalarmult_curve25519_ref10_base\n};\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/curve25519_ref10.h",
    "content": "#ifndef curve25519_ref10_H\n#define curve25519_ref10_H\n\n#include \"crypto_scalarmult_curve25519.h\"\n\nextern struct crypto_scalarmult_curve25519_implementation\n        crypto_scalarmult_curve25519_ref10_implementation;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/fe.h",
    "content": "#ifndef FE_H\n#define FE_H\n\n#include \"crypto_int32.h\"\n\ntypedef crypto_int32 fe[10];\n\n/*\nfe means field element.\nHere the field is \\Z/(2^255-19).\nAn element t, entries t[0]...t[9], represents the integer\nt[0]+2^26 t[1]+2^51 t[2]+2^77 t[3]+2^102 t[4]+...+2^230 t[9].\nBounds on each t[i] vary depending on context.\n*/\n\n#define fe_frombytes crypto_scalarmult_curve25519_ref10_fe_frombytes\n#define fe_tobytes crypto_scalarmult_curve25519_ref10_fe_tobytes\n#define fe_copy crypto_scalarmult_curve25519_ref10_fe_copy\n#define fe_0 crypto_scalarmult_curve25519_ref10_fe_0\n#define fe_1 crypto_scalarmult_curve25519_ref10_fe_1\n#define fe_cswap crypto_scalarmult_curve25519_ref10_fe_cswap\n#define fe_add crypto_scalarmult_curve25519_ref10_fe_add\n#define fe_sub crypto_scalarmult_curve25519_ref10_fe_sub\n#define fe_mul crypto_scalarmult_curve25519_ref10_fe_mul\n#define fe_sq crypto_scalarmult_curve25519_ref10_fe_sq\n#define fe_mul121666 crypto_scalarmult_curve25519_ref10_fe_mul121666\n#define fe_invert crypto_scalarmult_curve25519_ref10_fe_invert\n\nextern void fe_frombytes(fe,const unsigned char *);\nextern void fe_tobytes(unsigned char *,fe);\n\nextern void fe_copy(fe,fe);\nextern void fe_0(fe);\nextern void fe_1(fe);\nextern void fe_cswap(fe,fe,unsigned int);\n\nextern void fe_add(fe,fe,fe);\nextern void fe_sub(fe,fe,fe);\nextern void fe_mul(fe,fe,fe);\nextern void fe_sq(fe,fe);\nextern void fe_mul121666(fe,fe);\nextern void fe_invert(fe,fe);\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/fe_0_curve25519_ref10.c",
    "content": "#include \"fe.h\"\n\n#ifndef HAVE_TI_MODE\n\n/*\nh = 0\n*/\n\nvoid fe_0(fe h)\n{\n  h[0] = 0;\n  h[1] = 0;\n  h[2] = 0;\n  h[3] = 0;\n  h[4] = 0;\n  h[5] = 0;\n  h[6] = 0;\n  h[7] = 0;\n  h[8] = 0;\n  h[9] = 0;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/fe_1_curve25519_ref10.c",
    "content": "#include \"fe.h\"\n\n#ifndef HAVE_TI_MODE\n\n/*\nh = 1\n*/\n\nvoid fe_1(fe h)\n{\n  h[0] = 1;\n  h[1] = 0;\n  h[2] = 0;\n  h[3] = 0;\n  h[4] = 0;\n  h[5] = 0;\n  h[6] = 0;\n  h[7] = 0;\n  h[8] = 0;\n  h[9] = 0;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/fe_add_curve25519_ref10.c",
    "content": "#include \"fe.h\"\n\n#ifndef HAVE_TI_MODE\n\n/*\nh = f + g\nCan overlap h with f or g.\n\nPreconditions:\n   |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n   |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n\nPostconditions:\n   |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n*/\n\nvoid fe_add(fe h,fe f,fe g)\n{\n  crypto_int32 f0 = f[0];\n  crypto_int32 f1 = f[1];\n  crypto_int32 f2 = f[2];\n  crypto_int32 f3 = f[3];\n  crypto_int32 f4 = f[4];\n  crypto_int32 f5 = f[5];\n  crypto_int32 f6 = f[6];\n  crypto_int32 f7 = f[7];\n  crypto_int32 f8 = f[8];\n  crypto_int32 f9 = f[9];\n  crypto_int32 g0 = g[0];\n  crypto_int32 g1 = g[1];\n  crypto_int32 g2 = g[2];\n  crypto_int32 g3 = g[3];\n  crypto_int32 g4 = g[4];\n  crypto_int32 g5 = g[5];\n  crypto_int32 g6 = g[6];\n  crypto_int32 g7 = g[7];\n  crypto_int32 g8 = g[8];\n  crypto_int32 g9 = g[9];\n  crypto_int32 h0 = f0 + g0;\n  crypto_int32 h1 = f1 + g1;\n  crypto_int32 h2 = f2 + g2;\n  crypto_int32 h3 = f3 + g3;\n  crypto_int32 h4 = f4 + g4;\n  crypto_int32 h5 = f5 + g5;\n  crypto_int32 h6 = f6 + g6;\n  crypto_int32 h7 = f7 + g7;\n  crypto_int32 h8 = f8 + g8;\n  crypto_int32 h9 = f9 + g9;\n  h[0] = h0;\n  h[1] = h1;\n  h[2] = h2;\n  h[3] = h3;\n  h[4] = h4;\n  h[5] = h5;\n  h[6] = h6;\n  h[7] = h7;\n  h[8] = h8;\n  h[9] = h9;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/fe_copy_curve25519_ref10.c",
    "content": "#include \"fe.h\"\n\n#ifndef HAVE_TI_MODE\n\n/*\nh = f\n*/\n\nvoid fe_copy(fe h,fe f)\n{\n  crypto_int32 f0 = f[0];\n  crypto_int32 f1 = f[1];\n  crypto_int32 f2 = f[2];\n  crypto_int32 f3 = f[3];\n  crypto_int32 f4 = f[4];\n  crypto_int32 f5 = f[5];\n  crypto_int32 f6 = f[6];\n  crypto_int32 f7 = f[7];\n  crypto_int32 f8 = f[8];\n  crypto_int32 f9 = f[9];\n  h[0] = f0;\n  h[1] = f1;\n  h[2] = f2;\n  h[3] = f3;\n  h[4] = f4;\n  h[5] = f5;\n  h[6] = f6;\n  h[7] = f7;\n  h[8] = f8;\n  h[9] = f9;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/fe_cswap_curve25519_ref10.c",
    "content": "#include \"fe.h\"\n\n#ifndef HAVE_TI_MODE\n\n/*\nReplace (f,g) with (g,f) if b == 1;\nreplace (f,g) with (f,g) if b == 0.\n\nPreconditions: b in {0,1}.\n*/\n\nvoid fe_cswap(fe f,fe g,unsigned int b)\n{\n  crypto_int32 f0 = f[0];\n  crypto_int32 f1 = f[1];\n  crypto_int32 f2 = f[2];\n  crypto_int32 f3 = f[3];\n  crypto_int32 f4 = f[4];\n  crypto_int32 f5 = f[5];\n  crypto_int32 f6 = f[6];\n  crypto_int32 f7 = f[7];\n  crypto_int32 f8 = f[8];\n  crypto_int32 f9 = f[9];\n  crypto_int32 g0 = g[0];\n  crypto_int32 g1 = g[1];\n  crypto_int32 g2 = g[2];\n  crypto_int32 g3 = g[3];\n  crypto_int32 g4 = g[4];\n  crypto_int32 g5 = g[5];\n  crypto_int32 g6 = g[6];\n  crypto_int32 g7 = g[7];\n  crypto_int32 g8 = g[8];\n  crypto_int32 g9 = g[9];\n  crypto_int32 x0 = f0 ^ g0;\n  crypto_int32 x1 = f1 ^ g1;\n  crypto_int32 x2 = f2 ^ g2;\n  crypto_int32 x3 = f3 ^ g3;\n  crypto_int32 x4 = f4 ^ g4;\n  crypto_int32 x5 = f5 ^ g5;\n  crypto_int32 x6 = f6 ^ g6;\n  crypto_int32 x7 = f7 ^ g7;\n  crypto_int32 x8 = f8 ^ g8;\n  crypto_int32 x9 = f9 ^ g9;\n  b = (unsigned int) (- (int) b);\n  x0 &= b;\n  x1 &= b;\n  x2 &= b;\n  x3 &= b;\n  x4 &= b;\n  x5 &= b;\n  x6 &= b;\n  x7 &= b;\n  x8 &= b;\n  x9 &= b;\n  f[0] = f0 ^ x0;\n  f[1] = f1 ^ x1;\n  f[2] = f2 ^ x2;\n  f[3] = f3 ^ x3;\n  f[4] = f4 ^ x4;\n  f[5] = f5 ^ x5;\n  f[6] = f6 ^ x6;\n  f[7] = f7 ^ x7;\n  f[8] = f8 ^ x8;\n  f[9] = f9 ^ x9;\n  g[0] = g0 ^ x0;\n  g[1] = g1 ^ x1;\n  g[2] = g2 ^ x2;\n  g[3] = g3 ^ x3;\n  g[4] = g4 ^ x4;\n  g[5] = g5 ^ x5;\n  g[6] = g6 ^ x6;\n  g[7] = g7 ^ x7;\n  g[8] = g8 ^ x8;\n  g[9] = g9 ^ x9;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/fe_frombytes_curve25519_ref10.c",
    "content": "#include \"fe.h\"\n#include \"crypto_int32.h\"\n#include \"crypto_int64.h\"\n#include \"crypto_uint64.h\"\n\n#ifndef HAVE_TI_MODE\n\nstatic crypto_uint64 load_3(const unsigned char *in)\n{\n  crypto_uint64 result;\n  result = (crypto_uint64) in[0];\n  result |= ((crypto_uint64) in[1]) << 8;\n  result |= ((crypto_uint64) in[2]) << 16;\n  return result;\n}\n\nstatic crypto_uint64 load_4(const unsigned char *in)\n{\n  crypto_uint64 result;\n  result = (crypto_uint64) in[0];\n  result |= ((crypto_uint64) in[1]) << 8;\n  result |= ((crypto_uint64) in[2]) << 16;\n  result |= ((crypto_uint64) in[3]) << 24;\n  return result;\n}\n\nvoid fe_frombytes(fe h,const unsigned char *s)\n{\n  crypto_int64 h0 = load_4(s);\n  crypto_int64 h1 = load_3(s + 4) << 6;\n  crypto_int64 h2 = load_3(s + 7) << 5;\n  crypto_int64 h3 = load_3(s + 10) << 3;\n  crypto_int64 h4 = load_3(s + 13) << 2;\n  crypto_int64 h5 = load_4(s + 16);\n  crypto_int64 h6 = load_3(s + 20) << 7;\n  crypto_int64 h7 = load_3(s + 23) << 5;\n  crypto_int64 h8 = load_3(s + 26) << 4;\n  crypto_int64 h9 = (load_3(s + 29) & 8388607) << 2;\n  crypto_int64 carry0;\n  crypto_int64 carry1;\n  crypto_int64 carry2;\n  crypto_int64 carry3;\n  crypto_int64 carry4;\n  crypto_int64 carry5;\n  crypto_int64 carry6;\n  crypto_int64 carry7;\n  crypto_int64 carry8;\n  crypto_int64 carry9;\n\n  carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25;\n  carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25;\n  carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25;\n  carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25;\n  carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25;\n\n  carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26;\n  carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26;\n  carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26;\n  carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26;\n  carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26;\n\n  h[0] = (crypto_int32) h0;\n  h[1] = (crypto_int32) h1;\n  h[2] = (crypto_int32) h2;\n  h[3] = (crypto_int32) h3;\n  h[4] = (crypto_int32) h4;\n  h[5] = (crypto_int32) h5;\n  h[6] = (crypto_int32) h6;\n  h[7] = (crypto_int32) h7;\n  h[8] = (crypto_int32) h8;\n  h[9] = (crypto_int32) h9;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/fe_invert_curve25519_ref10.c",
    "content": "#include \"fe.h\"\n\n#ifndef HAVE_TI_MODE\n\nvoid fe_invert(fe out,fe z)\n{\n  fe t0;\n  fe t1;\n  fe t2;\n  fe t3;\n  int i;\n\n#include \"pow225521.h\"\n\n  return;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/fe_mul121666_curve25519_ref10.c",
    "content": "#include \"fe.h\"\n#include \"crypto_int64.h\"\n\n#ifndef HAVE_TI_MODE\n\n/*\nh = f * 121666\nCan overlap h with f.\n\nPreconditions:\n   |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n\nPostconditions:\n   |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n*/\n\nvoid fe_mul121666(fe h,fe f)\n{\n  crypto_int32 f0 = f[0];\n  crypto_int32 f1 = f[1];\n  crypto_int32 f2 = f[2];\n  crypto_int32 f3 = f[3];\n  crypto_int32 f4 = f[4];\n  crypto_int32 f5 = f[5];\n  crypto_int32 f6 = f[6];\n  crypto_int32 f7 = f[7];\n  crypto_int32 f8 = f[8];\n  crypto_int32 f9 = f[9];\n  crypto_int64 h0 = f0 * (crypto_int64) 121666;\n  crypto_int64 h1 = f1 * (crypto_int64) 121666;\n  crypto_int64 h2 = f2 * (crypto_int64) 121666;\n  crypto_int64 h3 = f3 * (crypto_int64) 121666;\n  crypto_int64 h4 = f4 * (crypto_int64) 121666;\n  crypto_int64 h5 = f5 * (crypto_int64) 121666;\n  crypto_int64 h6 = f6 * (crypto_int64) 121666;\n  crypto_int64 h7 = f7 * (crypto_int64) 121666;\n  crypto_int64 h8 = f8 * (crypto_int64) 121666;\n  crypto_int64 h9 = f9 * (crypto_int64) 121666;\n  crypto_int64 carry0;\n  crypto_int64 carry1;\n  crypto_int64 carry2;\n  crypto_int64 carry3;\n  crypto_int64 carry4;\n  crypto_int64 carry5;\n  crypto_int64 carry6;\n  crypto_int64 carry7;\n  crypto_int64 carry8;\n  crypto_int64 carry9;\n\n  carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25;\n  carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25;\n  carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25;\n  carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25;\n  carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25;\n\n  carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26;\n  carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26;\n  carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26;\n  carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26;\n  carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26;\n\n  h[0] = h0;\n  h[1] = h1;\n  h[2] = h2;\n  h[3] = h3;\n  h[4] = h4;\n  h[5] = h5;\n  h[6] = h6;\n  h[7] = h7;\n  h[8] = h8;\n  h[9] = h9;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/fe_mul_curve25519_ref10.c",
    "content": "#include \"fe.h\"\n#include \"crypto_int64.h\"\n\n#ifndef HAVE_TI_MODE\n\n/*\nh = f * g\nCan overlap h with f or g.\n\nPreconditions:\n   |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n   |g| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n\nPostconditions:\n   |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n*/\n\n/*\nNotes on implementation strategy:\n\nUsing schoolbook multiplication.\nKaratsuba would save a little in some cost models.\n\nMost multiplications by 2 and 19 are 32-bit precomputations;\ncheaper than 64-bit postcomputations.\n\nThere is one remaining multiplication by 19 in the carry chain;\none *19 precomputation can be merged into this,\nbut the resulting data flow is considerably less clean.\n\nThere are 12 carries below.\n10 of them are 2-way parallelizable and vectorizable.\nCan get away with 11 carries, but then data flow is much deeper.\n\nWith tighter constraints on inputs can squeeze carries into int32.\n*/\n\nvoid fe_mul(fe h,fe f,fe g)\n{\n  crypto_int32 f0 = f[0];\n  crypto_int32 f1 = f[1];\n  crypto_int32 f2 = f[2];\n  crypto_int32 f3 = f[3];\n  crypto_int32 f4 = f[4];\n  crypto_int32 f5 = f[5];\n  crypto_int32 f6 = f[6];\n  crypto_int32 f7 = f[7];\n  crypto_int32 f8 = f[8];\n  crypto_int32 f9 = f[9];\n  crypto_int32 g0 = g[0];\n  crypto_int32 g1 = g[1];\n  crypto_int32 g2 = g[2];\n  crypto_int32 g3 = g[3];\n  crypto_int32 g4 = g[4];\n  crypto_int32 g5 = g[5];\n  crypto_int32 g6 = g[6];\n  crypto_int32 g7 = g[7];\n  crypto_int32 g8 = g[8];\n  crypto_int32 g9 = g[9];\n  crypto_int32 g1_19 = 19 * g1; /* 1.4*2^29 */\n  crypto_int32 g2_19 = 19 * g2; /* 1.4*2^30; still ok */\n  crypto_int32 g3_19 = 19 * g3;\n  crypto_int32 g4_19 = 19 * g4;\n  crypto_int32 g5_19 = 19 * g5;\n  crypto_int32 g6_19 = 19 * g6;\n  crypto_int32 g7_19 = 19 * g7;\n  crypto_int32 g8_19 = 19 * g8;\n  crypto_int32 g9_19 = 19 * g9;\n  crypto_int32 f1_2 = 2 * f1;\n  crypto_int32 f3_2 = 2 * f3;\n  crypto_int32 f5_2 = 2 * f5;\n  crypto_int32 f7_2 = 2 * f7;\n  crypto_int32 f9_2 = 2 * f9;\n  crypto_int64 f0g0    = f0   * (crypto_int64) g0;\n  crypto_int64 f0g1    = f0   * (crypto_int64) g1;\n  crypto_int64 f0g2    = f0   * (crypto_int64) g2;\n  crypto_int64 f0g3    = f0   * (crypto_int64) g3;\n  crypto_int64 f0g4    = f0   * (crypto_int64) g4;\n  crypto_int64 f0g5    = f0   * (crypto_int64) g5;\n  crypto_int64 f0g6    = f0   * (crypto_int64) g6;\n  crypto_int64 f0g7    = f0   * (crypto_int64) g7;\n  crypto_int64 f0g8    = f0   * (crypto_int64) g8;\n  crypto_int64 f0g9    = f0   * (crypto_int64) g9;\n  crypto_int64 f1g0    = f1   * (crypto_int64) g0;\n  crypto_int64 f1g1_2  = f1_2 * (crypto_int64) g1;\n  crypto_int64 f1g2    = f1   * (crypto_int64) g2;\n  crypto_int64 f1g3_2  = f1_2 * (crypto_int64) g3;\n  crypto_int64 f1g4    = f1   * (crypto_int64) g4;\n  crypto_int64 f1g5_2  = f1_2 * (crypto_int64) g5;\n  crypto_int64 f1g6    = f1   * (crypto_int64) g6;\n  crypto_int64 f1g7_2  = f1_2 * (crypto_int64) g7;\n  crypto_int64 f1g8    = f1   * (crypto_int64) g8;\n  crypto_int64 f1g9_38 = f1_2 * (crypto_int64) g9_19;\n  crypto_int64 f2g0    = f2   * (crypto_int64) g0;\n  crypto_int64 f2g1    = f2   * (crypto_int64) g1;\n  crypto_int64 f2g2    = f2   * (crypto_int64) g2;\n  crypto_int64 f2g3    = f2   * (crypto_int64) g3;\n  crypto_int64 f2g4    = f2   * (crypto_int64) g4;\n  crypto_int64 f2g5    = f2   * (crypto_int64) g5;\n  crypto_int64 f2g6    = f2   * (crypto_int64) g6;\n  crypto_int64 f2g7    = f2   * (crypto_int64) g7;\n  crypto_int64 f2g8_19 = f2   * (crypto_int64) g8_19;\n  crypto_int64 f2g9_19 = f2   * (crypto_int64) g9_19;\n  crypto_int64 f3g0    = f3   * (crypto_int64) g0;\n  crypto_int64 f3g1_2  = f3_2 * (crypto_int64) g1;\n  crypto_int64 f3g2    = f3   * (crypto_int64) g2;\n  crypto_int64 f3g3_2  = f3_2 * (crypto_int64) g3;\n  crypto_int64 f3g4    = f3   * (crypto_int64) g4;\n  crypto_int64 f3g5_2  = f3_2 * (crypto_int64) g5;\n  crypto_int64 f3g6    = f3   * (crypto_int64) g6;\n  crypto_int64 f3g7_38 = f3_2 * (crypto_int64) g7_19;\n  crypto_int64 f3g8_19 = f3   * (crypto_int64) g8_19;\n  crypto_int64 f3g9_38 = f3_2 * (crypto_int64) g9_19;\n  crypto_int64 f4g0    = f4   * (crypto_int64) g0;\n  crypto_int64 f4g1    = f4   * (crypto_int64) g1;\n  crypto_int64 f4g2    = f4   * (crypto_int64) g2;\n  crypto_int64 f4g3    = f4   * (crypto_int64) g3;\n  crypto_int64 f4g4    = f4   * (crypto_int64) g4;\n  crypto_int64 f4g5    = f4   * (crypto_int64) g5;\n  crypto_int64 f4g6_19 = f4   * (crypto_int64) g6_19;\n  crypto_int64 f4g7_19 = f4   * (crypto_int64) g7_19;\n  crypto_int64 f4g8_19 = f4   * (crypto_int64) g8_19;\n  crypto_int64 f4g9_19 = f4   * (crypto_int64) g9_19;\n  crypto_int64 f5g0    = f5   * (crypto_int64) g0;\n  crypto_int64 f5g1_2  = f5_2 * (crypto_int64) g1;\n  crypto_int64 f5g2    = f5   * (crypto_int64) g2;\n  crypto_int64 f5g3_2  = f5_2 * (crypto_int64) g3;\n  crypto_int64 f5g4    = f5   * (crypto_int64) g4;\n  crypto_int64 f5g5_38 = f5_2 * (crypto_int64) g5_19;\n  crypto_int64 f5g6_19 = f5   * (crypto_int64) g6_19;\n  crypto_int64 f5g7_38 = f5_2 * (crypto_int64) g7_19;\n  crypto_int64 f5g8_19 = f5   * (crypto_int64) g8_19;\n  crypto_int64 f5g9_38 = f5_2 * (crypto_int64) g9_19;\n  crypto_int64 f6g0    = f6   * (crypto_int64) g0;\n  crypto_int64 f6g1    = f6   * (crypto_int64) g1;\n  crypto_int64 f6g2    = f6   * (crypto_int64) g2;\n  crypto_int64 f6g3    = f6   * (crypto_int64) g3;\n  crypto_int64 f6g4_19 = f6   * (crypto_int64) g4_19;\n  crypto_int64 f6g5_19 = f6   * (crypto_int64) g5_19;\n  crypto_int64 f6g6_19 = f6   * (crypto_int64) g6_19;\n  crypto_int64 f6g7_19 = f6   * (crypto_int64) g7_19;\n  crypto_int64 f6g8_19 = f6   * (crypto_int64) g8_19;\n  crypto_int64 f6g9_19 = f6   * (crypto_int64) g9_19;\n  crypto_int64 f7g0    = f7   * (crypto_int64) g0;\n  crypto_int64 f7g1_2  = f7_2 * (crypto_int64) g1;\n  crypto_int64 f7g2    = f7   * (crypto_int64) g2;\n  crypto_int64 f7g3_38 = f7_2 * (crypto_int64) g3_19;\n  crypto_int64 f7g4_19 = f7   * (crypto_int64) g4_19;\n  crypto_int64 f7g5_38 = f7_2 * (crypto_int64) g5_19;\n  crypto_int64 f7g6_19 = f7   * (crypto_int64) g6_19;\n  crypto_int64 f7g7_38 = f7_2 * (crypto_int64) g7_19;\n  crypto_int64 f7g8_19 = f7   * (crypto_int64) g8_19;\n  crypto_int64 f7g9_38 = f7_2 * (crypto_int64) g9_19;\n  crypto_int64 f8g0    = f8   * (crypto_int64) g0;\n  crypto_int64 f8g1    = f8   * (crypto_int64) g1;\n  crypto_int64 f8g2_19 = f8   * (crypto_int64) g2_19;\n  crypto_int64 f8g3_19 = f8   * (crypto_int64) g3_19;\n  crypto_int64 f8g4_19 = f8   * (crypto_int64) g4_19;\n  crypto_int64 f8g5_19 = f8   * (crypto_int64) g5_19;\n  crypto_int64 f8g6_19 = f8   * (crypto_int64) g6_19;\n  crypto_int64 f8g7_19 = f8   * (crypto_int64) g7_19;\n  crypto_int64 f8g8_19 = f8   * (crypto_int64) g8_19;\n  crypto_int64 f8g9_19 = f8   * (crypto_int64) g9_19;\n  crypto_int64 f9g0    = f9   * (crypto_int64) g0;\n  crypto_int64 f9g1_38 = f9_2 * (crypto_int64) g1_19;\n  crypto_int64 f9g2_19 = f9   * (crypto_int64) g2_19;\n  crypto_int64 f9g3_38 = f9_2 * (crypto_int64) g3_19;\n  crypto_int64 f9g4_19 = f9   * (crypto_int64) g4_19;\n  crypto_int64 f9g5_38 = f9_2 * (crypto_int64) g5_19;\n  crypto_int64 f9g6_19 = f9   * (crypto_int64) g6_19;\n  crypto_int64 f9g7_38 = f9_2 * (crypto_int64) g7_19;\n  crypto_int64 f9g8_19 = f9   * (crypto_int64) g8_19;\n  crypto_int64 f9g9_38 = f9_2 * (crypto_int64) g9_19;\n  crypto_int64 h0 = f0g0+f1g9_38+f2g8_19+f3g7_38+f4g6_19+f5g5_38+f6g4_19+f7g3_38+f8g2_19+f9g1_38;\n  crypto_int64 h1 = f0g1+f1g0   +f2g9_19+f3g8_19+f4g7_19+f5g6_19+f6g5_19+f7g4_19+f8g3_19+f9g2_19;\n  crypto_int64 h2 = f0g2+f1g1_2 +f2g0   +f3g9_38+f4g8_19+f5g7_38+f6g6_19+f7g5_38+f8g4_19+f9g3_38;\n  crypto_int64 h3 = f0g3+f1g2   +f2g1   +f3g0   +f4g9_19+f5g8_19+f6g7_19+f7g6_19+f8g5_19+f9g4_19;\n  crypto_int64 h4 = f0g4+f1g3_2 +f2g2   +f3g1_2 +f4g0   +f5g9_38+f6g8_19+f7g7_38+f8g6_19+f9g5_38;\n  crypto_int64 h5 = f0g5+f1g4   +f2g3   +f3g2   +f4g1   +f5g0   +f6g9_19+f7g8_19+f8g7_19+f9g6_19;\n  crypto_int64 h6 = f0g6+f1g5_2 +f2g4   +f3g3_2 +f4g2   +f5g1_2 +f6g0   +f7g9_38+f8g8_19+f9g7_38;\n  crypto_int64 h7 = f0g7+f1g6   +f2g5   +f3g4   +f4g3   +f5g2   +f6g1   +f7g0   +f8g9_19+f9g8_19;\n  crypto_int64 h8 = f0g8+f1g7_2 +f2g6   +f3g5_2 +f4g4   +f5g3_2 +f6g2   +f7g1_2 +f8g0   +f9g9_38;\n  crypto_int64 h9 = f0g9+f1g8   +f2g7   +f3g6   +f4g5   +f5g4   +f6g3   +f7g2   +f8g1   +f9g0   ;\n  crypto_int64 carry0;\n  crypto_int64 carry1;\n  crypto_int64 carry2;\n  crypto_int64 carry3;\n  crypto_int64 carry4;\n  crypto_int64 carry5;\n  crypto_int64 carry6;\n  crypto_int64 carry7;\n  crypto_int64 carry8;\n  crypto_int64 carry9;\n\n  /*\n  |h0| <= (1.1*1.1*2^52*(1+19+19+19+19)+1.1*1.1*2^50*(38+38+38+38+38))\n    i.e. |h0| <= 1.2*2^59; narrower ranges for h2, h4, h6, h8\n  |h1| <= (1.1*1.1*2^51*(1+1+19+19+19+19+19+19+19+19))\n    i.e. |h1| <= 1.5*2^58; narrower ranges for h3, h5, h7, h9\n  */\n\n  carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26;\n  carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26;\n  /* |h0| <= 2^25 */\n  /* |h4| <= 2^25 */\n  /* |h1| <= 1.51*2^58 */\n  /* |h5| <= 1.51*2^58 */\n\n  carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25;\n  carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25;\n  /* |h1| <= 2^24; from now on fits into int32 */\n  /* |h5| <= 2^24; from now on fits into int32 */\n  /* |h2| <= 1.21*2^59 */\n  /* |h6| <= 1.21*2^59 */\n\n  carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26;\n  carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26;\n  /* |h2| <= 2^25; from now on fits into int32 unchanged */\n  /* |h6| <= 2^25; from now on fits into int32 unchanged */\n  /* |h3| <= 1.51*2^58 */\n  /* |h7| <= 1.51*2^58 */\n\n  carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25;\n  carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25;\n  /* |h3| <= 2^24; from now on fits into int32 unchanged */\n  /* |h7| <= 2^24; from now on fits into int32 unchanged */\n  /* |h4| <= 1.52*2^33 */\n  /* |h8| <= 1.52*2^33 */\n\n  carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26;\n  carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26;\n  /* |h4| <= 2^25; from now on fits into int32 unchanged */\n  /* |h8| <= 2^25; from now on fits into int32 unchanged */\n  /* |h5| <= 1.01*2^24 */\n  /* |h9| <= 1.51*2^58 */\n\n  carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25;\n  /* |h9| <= 2^24; from now on fits into int32 unchanged */\n  /* |h0| <= 1.8*2^37 */\n\n  carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26;\n  /* |h0| <= 2^25; from now on fits into int32 unchanged */\n  /* |h1| <= 1.01*2^24 */\n\n  h[0] = h0;\n  h[1] = h1;\n  h[2] = h2;\n  h[3] = h3;\n  h[4] = h4;\n  h[5] = h5;\n  h[6] = h6;\n  h[7] = h7;\n  h[8] = h8;\n  h[9] = h9;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/fe_sq_curve25519_ref10.c",
    "content": "#include \"fe.h\"\n#include \"crypto_int64.h\"\n\n#ifndef HAVE_TI_MODE\n\n/*\nh = f * f\nCan overlap h with f.\n\nPreconditions:\n   |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n\nPostconditions:\n   |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n*/\n\n/*\nSee fe_mul.c for discussion of implementation strategy.\n*/\n\nvoid fe_sq(fe h,fe f)\n{\n  crypto_int32 f0 = f[0];\n  crypto_int32 f1 = f[1];\n  crypto_int32 f2 = f[2];\n  crypto_int32 f3 = f[3];\n  crypto_int32 f4 = f[4];\n  crypto_int32 f5 = f[5];\n  crypto_int32 f6 = f[6];\n  crypto_int32 f7 = f[7];\n  crypto_int32 f8 = f[8];\n  crypto_int32 f9 = f[9];\n  crypto_int32 f0_2 = 2 * f0;\n  crypto_int32 f1_2 = 2 * f1;\n  crypto_int32 f2_2 = 2 * f2;\n  crypto_int32 f3_2 = 2 * f3;\n  crypto_int32 f4_2 = 2 * f4;\n  crypto_int32 f5_2 = 2 * f5;\n  crypto_int32 f6_2 = 2 * f6;\n  crypto_int32 f7_2 = 2 * f7;\n  crypto_int32 f5_38 = 38 * f5; /* 1.31*2^30 */\n  crypto_int32 f6_19 = 19 * f6; /* 1.31*2^30 */\n  crypto_int32 f7_38 = 38 * f7; /* 1.31*2^30 */\n  crypto_int32 f8_19 = 19 * f8; /* 1.31*2^30 */\n  crypto_int32 f9_38 = 38 * f9; /* 1.31*2^30 */\n  crypto_int64 f0f0    = f0   * (crypto_int64) f0;\n  crypto_int64 f0f1_2  = f0_2 * (crypto_int64) f1;\n  crypto_int64 f0f2_2  = f0_2 * (crypto_int64) f2;\n  crypto_int64 f0f3_2  = f0_2 * (crypto_int64) f3;\n  crypto_int64 f0f4_2  = f0_2 * (crypto_int64) f4;\n  crypto_int64 f0f5_2  = f0_2 * (crypto_int64) f5;\n  crypto_int64 f0f6_2  = f0_2 * (crypto_int64) f6;\n  crypto_int64 f0f7_2  = f0_2 * (crypto_int64) f7;\n  crypto_int64 f0f8_2  = f0_2 * (crypto_int64) f8;\n  crypto_int64 f0f9_2  = f0_2 * (crypto_int64) f9;\n  crypto_int64 f1f1_2  = f1_2 * (crypto_int64) f1;\n  crypto_int64 f1f2_2  = f1_2 * (crypto_int64) f2;\n  crypto_int64 f1f3_4  = f1_2 * (crypto_int64) f3_2;\n  crypto_int64 f1f4_2  = f1_2 * (crypto_int64) f4;\n  crypto_int64 f1f5_4  = f1_2 * (crypto_int64) f5_2;\n  crypto_int64 f1f6_2  = f1_2 * (crypto_int64) f6;\n  crypto_int64 f1f7_4  = f1_2 * (crypto_int64) f7_2;\n  crypto_int64 f1f8_2  = f1_2 * (crypto_int64) f8;\n  crypto_int64 f1f9_76 = f1_2 * (crypto_int64) f9_38;\n  crypto_int64 f2f2    = f2   * (crypto_int64) f2;\n  crypto_int64 f2f3_2  = f2_2 * (crypto_int64) f3;\n  crypto_int64 f2f4_2  = f2_2 * (crypto_int64) f4;\n  crypto_int64 f2f5_2  = f2_2 * (crypto_int64) f5;\n  crypto_int64 f2f6_2  = f2_2 * (crypto_int64) f6;\n  crypto_int64 f2f7_2  = f2_2 * (crypto_int64) f7;\n  crypto_int64 f2f8_38 = f2_2 * (crypto_int64) f8_19;\n  crypto_int64 f2f9_38 = f2   * (crypto_int64) f9_38;\n  crypto_int64 f3f3_2  = f3_2 * (crypto_int64) f3;\n  crypto_int64 f3f4_2  = f3_2 * (crypto_int64) f4;\n  crypto_int64 f3f5_4  = f3_2 * (crypto_int64) f5_2;\n  crypto_int64 f3f6_2  = f3_2 * (crypto_int64) f6;\n  crypto_int64 f3f7_76 = f3_2 * (crypto_int64) f7_38;\n  crypto_int64 f3f8_38 = f3_2 * (crypto_int64) f8_19;\n  crypto_int64 f3f9_76 = f3_2 * (crypto_int64) f9_38;\n  crypto_int64 f4f4    = f4   * (crypto_int64) f4;\n  crypto_int64 f4f5_2  = f4_2 * (crypto_int64) f5;\n  crypto_int64 f4f6_38 = f4_2 * (crypto_int64) f6_19;\n  crypto_int64 f4f7_38 = f4   * (crypto_int64) f7_38;\n  crypto_int64 f4f8_38 = f4_2 * (crypto_int64) f8_19;\n  crypto_int64 f4f9_38 = f4   * (crypto_int64) f9_38;\n  crypto_int64 f5f5_38 = f5   * (crypto_int64) f5_38;\n  crypto_int64 f5f6_38 = f5_2 * (crypto_int64) f6_19;\n  crypto_int64 f5f7_76 = f5_2 * (crypto_int64) f7_38;\n  crypto_int64 f5f8_38 = f5_2 * (crypto_int64) f8_19;\n  crypto_int64 f5f9_76 = f5_2 * (crypto_int64) f9_38;\n  crypto_int64 f6f6_19 = f6   * (crypto_int64) f6_19;\n  crypto_int64 f6f7_38 = f6   * (crypto_int64) f7_38;\n  crypto_int64 f6f8_38 = f6_2 * (crypto_int64) f8_19;\n  crypto_int64 f6f9_38 = f6   * (crypto_int64) f9_38;\n  crypto_int64 f7f7_38 = f7   * (crypto_int64) f7_38;\n  crypto_int64 f7f8_38 = f7_2 * (crypto_int64) f8_19;\n  crypto_int64 f7f9_76 = f7_2 * (crypto_int64) f9_38;\n  crypto_int64 f8f8_19 = f8   * (crypto_int64) f8_19;\n  crypto_int64 f8f9_38 = f8   * (crypto_int64) f9_38;\n  crypto_int64 f9f9_38 = f9   * (crypto_int64) f9_38;\n  crypto_int64 h0 = f0f0  +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38;\n  crypto_int64 h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38;\n  crypto_int64 h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19;\n  crypto_int64 h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38;\n  crypto_int64 h4 = f0f4_2+f1f3_4 +f2f2   +f5f9_76+f6f8_38+f7f7_38;\n  crypto_int64 h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38;\n  crypto_int64 h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19;\n  crypto_int64 h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38;\n  crypto_int64 h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4   +f9f9_38;\n  crypto_int64 h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2;\n  crypto_int64 carry0;\n  crypto_int64 carry1;\n  crypto_int64 carry2;\n  crypto_int64 carry3;\n  crypto_int64 carry4;\n  crypto_int64 carry5;\n  crypto_int64 carry6;\n  crypto_int64 carry7;\n  crypto_int64 carry8;\n  crypto_int64 carry9;\n\n  carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26;\n  carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26;\n\n  carry1 = (h1 + (crypto_int64) (1<<24)) >> 25; h2 += carry1; h1 -= carry1 << 25;\n  carry5 = (h5 + (crypto_int64) (1<<24)) >> 25; h6 += carry5; h5 -= carry5 << 25;\n\n  carry2 = (h2 + (crypto_int64) (1<<25)) >> 26; h3 += carry2; h2 -= carry2 << 26;\n  carry6 = (h6 + (crypto_int64) (1<<25)) >> 26; h7 += carry6; h6 -= carry6 << 26;\n\n  carry3 = (h3 + (crypto_int64) (1<<24)) >> 25; h4 += carry3; h3 -= carry3 << 25;\n  carry7 = (h7 + (crypto_int64) (1<<24)) >> 25; h8 += carry7; h7 -= carry7 << 25;\n\n  carry4 = (h4 + (crypto_int64) (1<<25)) >> 26; h5 += carry4; h4 -= carry4 << 26;\n  carry8 = (h8 + (crypto_int64) (1<<25)) >> 26; h9 += carry8; h8 -= carry8 << 26;\n\n  carry9 = (h9 + (crypto_int64) (1<<24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25;\n\n  carry0 = (h0 + (crypto_int64) (1<<25)) >> 26; h1 += carry0; h0 -= carry0 << 26;\n\n  h[0] = h0;\n  h[1] = h1;\n  h[2] = h2;\n  h[3] = h3;\n  h[4] = h4;\n  h[5] = h5;\n  h[6] = h6;\n  h[7] = h7;\n  h[8] = h8;\n  h[9] = h9;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/fe_sub_curve25519_ref10.c",
    "content": "#include \"fe.h\"\n\n#ifndef HAVE_TI_MODE\n\n/*\nh = f - g\nCan overlap h with f or g.\n\nPreconditions:\n   |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n   |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n\nPostconditions:\n   |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n*/\n\nvoid fe_sub(fe h,fe f,fe g)\n{\n  crypto_int32 f0 = f[0];\n  crypto_int32 f1 = f[1];\n  crypto_int32 f2 = f[2];\n  crypto_int32 f3 = f[3];\n  crypto_int32 f4 = f[4];\n  crypto_int32 f5 = f[5];\n  crypto_int32 f6 = f[6];\n  crypto_int32 f7 = f[7];\n  crypto_int32 f8 = f[8];\n  crypto_int32 f9 = f[9];\n  crypto_int32 g0 = g[0];\n  crypto_int32 g1 = g[1];\n  crypto_int32 g2 = g[2];\n  crypto_int32 g3 = g[3];\n  crypto_int32 g4 = g[4];\n  crypto_int32 g5 = g[5];\n  crypto_int32 g6 = g[6];\n  crypto_int32 g7 = g[7];\n  crypto_int32 g8 = g[8];\n  crypto_int32 g9 = g[9];\n  crypto_int32 h0 = f0 - g0;\n  crypto_int32 h1 = f1 - g1;\n  crypto_int32 h2 = f2 - g2;\n  crypto_int32 h3 = f3 - g3;\n  crypto_int32 h4 = f4 - g4;\n  crypto_int32 h5 = f5 - g5;\n  crypto_int32 h6 = f6 - g6;\n  crypto_int32 h7 = f7 - g7;\n  crypto_int32 h8 = f8 - g8;\n  crypto_int32 h9 = f9 - g9;\n  h[0] = h0;\n  h[1] = h1;\n  h[2] = h2;\n  h[3] = h3;\n  h[4] = h4;\n  h[5] = h5;\n  h[6] = h6;\n  h[7] = h7;\n  h[8] = h8;\n  h[9] = h9;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/fe_tobytes_curve25519_ref10.c",
    "content": "#include \"fe.h\"\n\n#ifndef HAVE_TI_MODE\n\n/*\nPreconditions:\n  |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n\nWrite p=2^255-19; q=floor(h/p).\nBasic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))).\n\nProof:\n  Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4.\n  Also have |h-2^230 h9|<2^230 so |19 2^(-255)(h-2^230 h9)|<1/4.\n\n  Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9).\n  Then 0<y<1.\n\n  Write r=h-pq.\n  Have 0<=r<=p-1=2^255-20.\n  Thus 0<=r+19(2^-255)r<r+19(2^-255)2^255<=2^255-1.\n\n  Write x=r+19(2^-255)r+y.\n  Then 0<x<2^255 so floor(2^(-255)x) = 0 so floor(q+2^(-255)x) = q.\n\n  Have q+2^(-255)x = 2^(-255)(h + 19 2^(-25) h9 + 2^(-1))\n  so floor(2^(-255)(h + 19 2^(-25) h9 + 2^(-1))) = q.\n*/\n\nvoid fe_tobytes(unsigned char *s,fe h)\n{\n  crypto_int32 h0 = h[0];\n  crypto_int32 h1 = h[1];\n  crypto_int32 h2 = h[2];\n  crypto_int32 h3 = h[3];\n  crypto_int32 h4 = h[4];\n  crypto_int32 h5 = h[5];\n  crypto_int32 h6 = h[6];\n  crypto_int32 h7 = h[7];\n  crypto_int32 h8 = h[8];\n  crypto_int32 h9 = h[9];\n  crypto_int32 q;\n  crypto_int32 carry0;\n  crypto_int32 carry1;\n  crypto_int32 carry2;\n  crypto_int32 carry3;\n  crypto_int32 carry4;\n  crypto_int32 carry5;\n  crypto_int32 carry6;\n  crypto_int32 carry7;\n  crypto_int32 carry8;\n  crypto_int32 carry9;\n\n  q = (19 * h9 + (((crypto_int32) 1) << 24)) >> 25;\n  q = (h0 + q) >> 26;\n  q = (h1 + q) >> 25;\n  q = (h2 + q) >> 26;\n  q = (h3 + q) >> 25;\n  q = (h4 + q) >> 26;\n  q = (h5 + q) >> 25;\n  q = (h6 + q) >> 26;\n  q = (h7 + q) >> 25;\n  q = (h8 + q) >> 26;\n  q = (h9 + q) >> 25;\n\n  /* Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. */\n  h0 += 19 * q;\n  /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */\n\n  carry0 = h0 >> 26; h1 += carry0; h0 -= carry0 << 26;\n  carry1 = h1 >> 25; h2 += carry1; h1 -= carry1 << 25;\n  carry2 = h2 >> 26; h3 += carry2; h2 -= carry2 << 26;\n  carry3 = h3 >> 25; h4 += carry3; h3 -= carry3 << 25;\n  carry4 = h4 >> 26; h5 += carry4; h4 -= carry4 << 26;\n  carry5 = h5 >> 25; h6 += carry5; h5 -= carry5 << 25;\n  carry6 = h6 >> 26; h7 += carry6; h6 -= carry6 << 26;\n  carry7 = h7 >> 25; h8 += carry7; h7 -= carry7 << 25;\n  carry8 = h8 >> 26; h9 += carry8; h8 -= carry8 << 26;\n  carry9 = h9 >> 25;               h9 -= carry9 << 25;\n                  /* h10 = carry9 */\n\n  /*\n  Goal: Output h0+...+2^255 h10-2^255 q, which is between 0 and 2^255-20.\n  Have h0+...+2^230 h9 between 0 and 2^255-1;\n  evidently 2^255 h10-2^255 q = 0.\n  Goal: Output h0+...+2^230 h9.\n  */\n\n  s[0] = h0 >> 0;\n  s[1] = h0 >> 8;\n  s[2] = h0 >> 16;\n  s[3] = (h0 >> 24) | (h1 << 2);\n  s[4] = h1 >> 6;\n  s[5] = h1 >> 14;\n  s[6] = (h1 >> 22) | (h2 << 3);\n  s[7] = h2 >> 5;\n  s[8] = h2 >> 13;\n  s[9] = (h2 >> 21) | (h3 << 5);\n  s[10] = h3 >> 3;\n  s[11] = h3 >> 11;\n  s[12] = (h3 >> 19) | (h4 << 6);\n  s[13] = h4 >> 2;\n  s[14] = h4 >> 10;\n  s[15] = h4 >> 18;\n  s[16] = h5 >> 0;\n  s[17] = h5 >> 8;\n  s[18] = h5 >> 16;\n  s[19] = (h5 >> 24) | (h6 << 1);\n  s[20] = h6 >> 7;\n  s[21] = h6 >> 15;\n  s[22] = (h6 >> 23) | (h7 << 3);\n  s[23] = h7 >> 5;\n  s[24] = h7 >> 13;\n  s[25] = (h7 >> 21) | (h8 << 4);\n  s[26] = h8 >> 4;\n  s[27] = h8 >> 12;\n  s[28] = (h8 >> 20) | (h9 << 6);\n  s[29] = h9 >> 2;\n  s[30] = h9 >> 10;\n  s[31] = h9 >> 18;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/montgomery.h",
    "content": "\n/* qhasm: fe X2 */\n\n/* qhasm: fe Z2 */\n\n/* qhasm: fe X3 */\n\n/* qhasm: fe Z3 */\n\n/* qhasm: fe X4 */\n\n/* qhasm: fe Z4 */\n\n/* qhasm: fe X5 */\n\n/* qhasm: fe Z5 */\n\n/* qhasm: fe A */\n\n/* qhasm: fe B */\n\n/* qhasm: fe C */\n\n/* qhasm: fe D */\n\n/* qhasm: fe E */\n\n/* qhasm: fe AA */\n\n/* qhasm: fe BB */\n\n/* qhasm: fe DA */\n\n/* qhasm: fe CB */\n\n/* qhasm: fe t0 */\n\n/* qhasm: fe t1 */\n\n/* qhasm: fe t2 */\n\n/* qhasm: fe t3 */\n\n/* qhasm: fe t4 */\n\n/* qhasm: enter ladder */\n\n/* qhasm: D = X3-Z3 */\n/* asm 1: fe_sub(>D=fe#5,<X3=fe#3,<Z3=fe#4); */\n/* asm 2: fe_sub(>D=tmp0,<X3=x3,<Z3=z3); */\nfe_sub(tmp0,x3,z3);\n\n/* qhasm: B = X2-Z2 */\n/* asm 1: fe_sub(>B=fe#6,<X2=fe#1,<Z2=fe#2); */\n/* asm 2: fe_sub(>B=tmp1,<X2=x2,<Z2=z2); */\nfe_sub(tmp1,x2,z2);\n\n/* qhasm: A = X2+Z2 */\n/* asm 1: fe_add(>A=fe#1,<X2=fe#1,<Z2=fe#2); */\n/* asm 2: fe_add(>A=x2,<X2=x2,<Z2=z2); */\nfe_add(x2,x2,z2);\n\n/* qhasm: C = X3+Z3 */\n/* asm 1: fe_add(>C=fe#2,<X3=fe#3,<Z3=fe#4); */\n/* asm 2: fe_add(>C=z2,<X3=x3,<Z3=z3); */\nfe_add(z2,x3,z3);\n\n/* qhasm: DA = D*A */\n/* asm 1: fe_mul(>DA=fe#4,<D=fe#5,<A=fe#1); */\n/* asm 2: fe_mul(>DA=z3,<D=tmp0,<A=x2); */\nfe_mul(z3,tmp0,x2);\n\n/* qhasm: CB = C*B */\n/* asm 1: fe_mul(>CB=fe#2,<C=fe#2,<B=fe#6); */\n/* asm 2: fe_mul(>CB=z2,<C=z2,<B=tmp1); */\nfe_mul(z2,z2,tmp1);\n\n/* qhasm: BB = B^2 */\n/* asm 1: fe_sq(>BB=fe#5,<B=fe#6); */\n/* asm 2: fe_sq(>BB=tmp0,<B=tmp1); */\nfe_sq(tmp0,tmp1);\n\n/* qhasm: AA = A^2 */\n/* asm 1: fe_sq(>AA=fe#6,<A=fe#1); */\n/* asm 2: fe_sq(>AA=tmp1,<A=x2); */\nfe_sq(tmp1,x2);\n\n/* qhasm: t0 = DA+CB */\n/* asm 1: fe_add(>t0=fe#3,<DA=fe#4,<CB=fe#2); */\n/* asm 2: fe_add(>t0=x3,<DA=z3,<CB=z2); */\nfe_add(x3,z3,z2);\n\n/* qhasm: assign x3 to t0 */\n\n/* qhasm: t1 = DA-CB */\n/* asm 1: fe_sub(>t1=fe#2,<DA=fe#4,<CB=fe#2); */\n/* asm 2: fe_sub(>t1=z2,<DA=z3,<CB=z2); */\nfe_sub(z2,z3,z2);\n\n/* qhasm: X4 = AA*BB */\n/* asm 1: fe_mul(>X4=fe#1,<AA=fe#6,<BB=fe#5); */\n/* asm 2: fe_mul(>X4=x2,<AA=tmp1,<BB=tmp0); */\nfe_mul(x2,tmp1,tmp0);\n\n/* qhasm: E = AA-BB */\n/* asm 1: fe_sub(>E=fe#6,<AA=fe#6,<BB=fe#5); */\n/* asm 2: fe_sub(>E=tmp1,<AA=tmp1,<BB=tmp0); */\nfe_sub(tmp1,tmp1,tmp0);\n\n/* qhasm: t2 = t1^2 */\n/* asm 1: fe_sq(>t2=fe#2,<t1=fe#2); */\n/* asm 2: fe_sq(>t2=z2,<t1=z2); */\nfe_sq(z2,z2);\n\n/* qhasm: t3 = a24*E */\n/* asm 1: fe_mul121666(>t3=fe#4,<E=fe#6); */\n/* asm 2: fe_mul121666(>t3=z3,<E=tmp1); */\nfe_mul121666(z3,tmp1);\n\n/* qhasm: X5 = t0^2 */\n/* asm 1: fe_sq(>X5=fe#3,<t0=fe#3); */\n/* asm 2: fe_sq(>X5=x3,<t0=x3); */\nfe_sq(x3,x3);\n\n/* qhasm: t4 = BB+t3 */\n/* asm 1: fe_add(>t4=fe#5,<BB=fe#5,<t3=fe#4); */\n/* asm 2: fe_add(>t4=tmp0,<BB=tmp0,<t3=z3); */\nfe_add(tmp0,tmp0,z3);\n\n/* qhasm: Z5 = X1*t2 */\n/* asm 1: fe_mul(>Z5=fe#4,x1,<t2=fe#2); */\n/* asm 2: fe_mul(>Z5=z3,x1,<t2=z2); */\nfe_mul(z3,x1,z2);\n\n/* qhasm: Z4 = E*t4 */\n/* asm 1: fe_mul(>Z4=fe#2,<E=fe#6,<t4=fe#5); */\n/* asm 2: fe_mul(>Z4=z2,<E=tmp1,<t4=tmp0); */\nfe_mul(z2,tmp1,tmp0);\n\n/* qhasm: return */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/ref10/pow225521.h",
    "content": "\n/* qhasm: fe z1 */\n\n/* qhasm: fe z2 */\n\n/* qhasm: fe z8 */\n\n/* qhasm: fe z9 */\n\n/* qhasm: fe z11 */\n\n/* qhasm: fe z22 */\n\n/* qhasm: fe z_5_0 */\n\n/* qhasm: fe z_10_5 */\n\n/* qhasm: fe z_10_0 */\n\n/* qhasm: fe z_20_10 */\n\n/* qhasm: fe z_20_0 */\n\n/* qhasm: fe z_40_20 */\n\n/* qhasm: fe z_40_0 */\n\n/* qhasm: fe z_50_10 */\n\n/* qhasm: fe z_50_0 */\n\n/* qhasm: fe z_100_50 */\n\n/* qhasm: fe z_100_0 */\n\n/* qhasm: fe z_200_100 */\n\n/* qhasm: fe z_200_0 */\n\n/* qhasm: fe z_250_50 */\n\n/* qhasm: fe z_250_0 */\n\n/* qhasm: fe z_255_5 */\n\n/* qhasm: fe z_255_21 */\n\n/* qhasm: enter pow225521 */\n\n/* qhasm: z2 = z1^2^1 */\n/* asm 1: fe_sq(>z2=fe#1,<z1=fe#11); for (i = 1;i < 1;++i) fe_sq(>z2=fe#1,>z2=fe#1); */\n/* asm 2: fe_sq(>z2=t0,<z1=z); for (i = 1;i < 1;++i) fe_sq(>z2=t0,>z2=t0); */\nfe_sq(t0,z); /* for (i = 1;i < 1;++i) fe_sq(t0,t0); */\n\n/* qhasm: z8 = z2^2^2 */\n/* asm 1: fe_sq(>z8=fe#2,<z2=fe#1); for (i = 1;i < 2;++i) fe_sq(>z8=fe#2,>z8=fe#2); */\n/* asm 2: fe_sq(>z8=t1,<z2=t0); for (i = 1;i < 2;++i) fe_sq(>z8=t1,>z8=t1); */\nfe_sq(t1,t0); for (i = 1;i < 2;++i) fe_sq(t1,t1);\n\n/* qhasm: z9 = z1*z8 */\n/* asm 1: fe_mul(>z9=fe#2,<z1=fe#11,<z8=fe#2); */\n/* asm 2: fe_mul(>z9=t1,<z1=z,<z8=t1); */\nfe_mul(t1,z,t1);\n\n/* qhasm: z11 = z2*z9 */\n/* asm 1: fe_mul(>z11=fe#1,<z2=fe#1,<z9=fe#2); */\n/* asm 2: fe_mul(>z11=t0,<z2=t0,<z9=t1); */\nfe_mul(t0,t0,t1);\n\n/* qhasm: z22 = z11^2^1 */\n/* asm 1: fe_sq(>z22=fe#3,<z11=fe#1); for (i = 1;i < 1;++i) fe_sq(>z22=fe#3,>z22=fe#3); */\n/* asm 2: fe_sq(>z22=t2,<z11=t0); for (i = 1;i < 1;++i) fe_sq(>z22=t2,>z22=t2); */\nfe_sq(t2,t0); /* for (i = 1;i < 1;++i) fe_sq(t2,t2); */\n\n/* qhasm: z_5_0 = z9*z22 */\n/* asm 1: fe_mul(>z_5_0=fe#2,<z9=fe#2,<z22=fe#3); */\n/* asm 2: fe_mul(>z_5_0=t1,<z9=t1,<z22=t2); */\nfe_mul(t1,t1,t2);\n\n/* qhasm: z_10_5 = z_5_0^2^5 */\n/* asm 1: fe_sq(>z_10_5=fe#3,<z_5_0=fe#2); for (i = 1;i < 5;++i) fe_sq(>z_10_5=fe#3,>z_10_5=fe#3); */\n/* asm 2: fe_sq(>z_10_5=t2,<z_5_0=t1); for (i = 1;i < 5;++i) fe_sq(>z_10_5=t2,>z_10_5=t2); */\nfe_sq(t2,t1); for (i = 1;i < 5;++i) fe_sq(t2,t2);\n\n/* qhasm: z_10_0 = z_10_5*z_5_0 */\n/* asm 1: fe_mul(>z_10_0=fe#2,<z_10_5=fe#3,<z_5_0=fe#2); */\n/* asm 2: fe_mul(>z_10_0=t1,<z_10_5=t2,<z_5_0=t1); */\nfe_mul(t1,t2,t1);\n\n/* qhasm: z_20_10 = z_10_0^2^10 */\n/* asm 1: fe_sq(>z_20_10=fe#3,<z_10_0=fe#2); for (i = 1;i < 10;++i) fe_sq(>z_20_10=fe#3,>z_20_10=fe#3); */\n/* asm 2: fe_sq(>z_20_10=t2,<z_10_0=t1); for (i = 1;i < 10;++i) fe_sq(>z_20_10=t2,>z_20_10=t2); */\nfe_sq(t2,t1); for (i = 1;i < 10;++i) fe_sq(t2,t2);\n\n/* qhasm: z_20_0 = z_20_10*z_10_0 */\n/* asm 1: fe_mul(>z_20_0=fe#3,<z_20_10=fe#3,<z_10_0=fe#2); */\n/* asm 2: fe_mul(>z_20_0=t2,<z_20_10=t2,<z_10_0=t1); */\nfe_mul(t2,t2,t1);\n\n/* qhasm: z_40_20 = z_20_0^2^20 */\n/* asm 1: fe_sq(>z_40_20=fe#4,<z_20_0=fe#3); for (i = 1;i < 20;++i) fe_sq(>z_40_20=fe#4,>z_40_20=fe#4); */\n/* asm 2: fe_sq(>z_40_20=t3,<z_20_0=t2); for (i = 1;i < 20;++i) fe_sq(>z_40_20=t3,>z_40_20=t3); */\nfe_sq(t3,t2); for (i = 1;i < 20;++i) fe_sq(t3,t3);\n\n/* qhasm: z_40_0 = z_40_20*z_20_0 */\n/* asm 1: fe_mul(>z_40_0=fe#3,<z_40_20=fe#4,<z_20_0=fe#3); */\n/* asm 2: fe_mul(>z_40_0=t2,<z_40_20=t3,<z_20_0=t2); */\nfe_mul(t2,t3,t2);\n\n/* qhasm: z_50_10 = z_40_0^2^10 */\n/* asm 1: fe_sq(>z_50_10=fe#3,<z_40_0=fe#3); for (i = 1;i < 10;++i) fe_sq(>z_50_10=fe#3,>z_50_10=fe#3); */\n/* asm 2: fe_sq(>z_50_10=t2,<z_40_0=t2); for (i = 1;i < 10;++i) fe_sq(>z_50_10=t2,>z_50_10=t2); */\nfe_sq(t2,t2); for (i = 1;i < 10;++i) fe_sq(t2,t2);\n\n/* qhasm: z_50_0 = z_50_10*z_10_0 */\n/* asm 1: fe_mul(>z_50_0=fe#2,<z_50_10=fe#3,<z_10_0=fe#2); */\n/* asm 2: fe_mul(>z_50_0=t1,<z_50_10=t2,<z_10_0=t1); */\nfe_mul(t1,t2,t1);\n\n/* qhasm: z_100_50 = z_50_0^2^50 */\n/* asm 1: fe_sq(>z_100_50=fe#3,<z_50_0=fe#2); for (i = 1;i < 50;++i) fe_sq(>z_100_50=fe#3,>z_100_50=fe#3); */\n/* asm 2: fe_sq(>z_100_50=t2,<z_50_0=t1); for (i = 1;i < 50;++i) fe_sq(>z_100_50=t2,>z_100_50=t2); */\nfe_sq(t2,t1); for (i = 1;i < 50;++i) fe_sq(t2,t2);\n\n/* qhasm: z_100_0 = z_100_50*z_50_0 */\n/* asm 1: fe_mul(>z_100_0=fe#3,<z_100_50=fe#3,<z_50_0=fe#2); */\n/* asm 2: fe_mul(>z_100_0=t2,<z_100_50=t2,<z_50_0=t1); */\nfe_mul(t2,t2,t1);\n\n/* qhasm: z_200_100 = z_100_0^2^100 */\n/* asm 1: fe_sq(>z_200_100=fe#4,<z_100_0=fe#3); for (i = 1;i < 100;++i) fe_sq(>z_200_100=fe#4,>z_200_100=fe#4); */\n/* asm 2: fe_sq(>z_200_100=t3,<z_100_0=t2); for (i = 1;i < 100;++i) fe_sq(>z_200_100=t3,>z_200_100=t3); */\nfe_sq(t3,t2); for (i = 1;i < 100;++i) fe_sq(t3,t3);\n\n/* qhasm: z_200_0 = z_200_100*z_100_0 */\n/* asm 1: fe_mul(>z_200_0=fe#3,<z_200_100=fe#4,<z_100_0=fe#3); */\n/* asm 2: fe_mul(>z_200_0=t2,<z_200_100=t3,<z_100_0=t2); */\nfe_mul(t2,t3,t2);\n\n/* qhasm: z_250_50 = z_200_0^2^50 */\n/* asm 1: fe_sq(>z_250_50=fe#3,<z_200_0=fe#3); for (i = 1;i < 50;++i) fe_sq(>z_250_50=fe#3,>z_250_50=fe#3); */\n/* asm 2: fe_sq(>z_250_50=t2,<z_200_0=t2); for (i = 1;i < 50;++i) fe_sq(>z_250_50=t2,>z_250_50=t2); */\nfe_sq(t2,t2); for (i = 1;i < 50;++i) fe_sq(t2,t2);\n\n/* qhasm: z_250_0 = z_250_50*z_50_0 */\n/* asm 1: fe_mul(>z_250_0=fe#2,<z_250_50=fe#3,<z_50_0=fe#2); */\n/* asm 2: fe_mul(>z_250_0=t1,<z_250_50=t2,<z_50_0=t1); */\nfe_mul(t1,t2,t1);\n\n/* qhasm: z_255_5 = z_250_0^2^5 */\n/* asm 1: fe_sq(>z_255_5=fe#2,<z_250_0=fe#2); for (i = 1;i < 5;++i) fe_sq(>z_255_5=fe#2,>z_255_5=fe#2); */\n/* asm 2: fe_sq(>z_255_5=t1,<z_250_0=t1); for (i = 1;i < 5;++i) fe_sq(>z_255_5=t1,>z_255_5=t1); */\nfe_sq(t1,t1); for (i = 1;i < 5;++i) fe_sq(t1,t1);\n\n/* qhasm: z_255_21 = z_255_5*z11 */\n/* asm 1: fe_mul(>z_255_21=fe#12,<z_255_5=fe#2,<z11=fe#1); */\n/* asm 2: fe_mul(>z_255_21=out,<z_255_5=t1,<z11=t0); */\nfe_mul(out,t1,t0);\n\n/* qhasm: return */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/consts.S",
    "content": "#ifdef IN_SANDY2X\n\n/*\n   REDMASK51 is from amd64-51/consts.s.\n*/\n\n#include \"consts_namespace.h\"\n.data\n.p2align 4\nv0_0: .quad 0, 0\nv1_0: .quad 1, 0\nv2_1: .quad 2, 1\nv9_0: .quad 9, 0\nv9_9: .quad 9, 9\nv19_19: .quad 19, 19\nv38_1: .quad 38, 1\nv38_38: .quad 38, 38\nv121666_121666: .quad 121666, 121666\nm25: .quad 33554431, 33554431\nm26: .quad 67108863, 67108863\nsubc0: .quad 0x07FFFFDA, 0x03FFFFFE\nsubc2: .quad 0x07FFFFFE, 0x03FFFFFE\nREDMASK51:   .quad 0x0007FFFFFFFFFFFF\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/consts_namespace.h",
    "content": "#ifndef consts_namespace_H\n#define consts_namespace_H\n\n#define v0_0 crypto_scalarmult_curve25519_sandy2x_v0_0\n#define v1_0 crypto_scalarmult_curve25519_sandy2x_v1_0\n#define v2_1 crypto_scalarmult_curve25519_sandy2x_v2_1\n#define v9_0 crypto_scalarmult_curve25519_sandy2x_v9_0\n#define v9_9 crypto_scalarmult_curve25519_sandy2x_v9_9\n#define v19_19 crypto_scalarmult_curve25519_sandy2x_v19_19\n#define v38_1 crypto_scalarmult_curve25519_sandy2x_v38_1\n#define v38_38 crypto_scalarmult_curve25519_sandy2x_v38_38\n#define v121666_121666 crypto_scalarmult_curve25519_sandy2x_v121666_121666\n#define m25 crypto_scalarmult_curve25519_sandy2x_m25\n#define m26 crypto_scalarmult_curve25519_sandy2x_m26\n#define subc0 crypto_scalarmult_curve25519_sandy2x_subc0\n#define subc2 crypto_scalarmult_curve25519_sandy2x_subc2\n#define REDMASK51 crypto_scalarmult_curve25519_sandy2x_REDMASK51\n\n#endif //ifndef consts_namespace_H\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.c",
    "content": "/*\n   This file is adapted from ref10/scalarmult.c:\n   The code for Mongomery ladder is replace by the ladder assembly function;\n   Inversion is done in the same way as amd64-51/.\n   (fe is first converted into fe51 after Mongomery ladder)\n*/\n\n#include <stddef.h>\n\n#ifdef HAVE_AVX_ASM\n\n#include \"utils.h\"\n#include \"curve25519_sandy2x.h\"\n#include \"../scalarmult_curve25519.h\"\n#include \"fe.h\"\n#include \"fe51.h\"\n#include \"ladder.h\"\n#include \"ladder_base.h\"\n\n#define x1 var[0]\n#define x2 var[1]\n#define z2 var[2]\n\nstatic int\ncrypto_scalarmult_curve25519_sandy2x(unsigned char *q, const unsigned char *n,\n                                     const unsigned char *p)\n{\n  unsigned char e[32];\n  unsigned int i;\n\n  fe var[3];\n\n  fe51 x_51;\n  fe51 z_51;\n\n  for (i = 0;i < 32;++i) e[i] = n[i];\n  e[0] &= 248;\n  e[31] &= 127;\n  e[31] |= 64;\n\n  fe_frombytes(x1, p);\n\n  ladder(var, e);\n\n  z_51.v[0] = (z2[1] << 26) + z2[0];\n  z_51.v[1] = (z2[3] << 26) + z2[2];\n  z_51.v[2] = (z2[5] << 26) + z2[4];\n  z_51.v[3] = (z2[7] << 26) + z2[6];\n  z_51.v[4] = (z2[9] << 26) + z2[8];\n\n  x_51.v[0] = (x2[1] << 26) + x2[0];\n  x_51.v[1] = (x2[3] << 26) + x2[2];\n  x_51.v[2] = (x2[5] << 26) + x2[4];\n  x_51.v[3] = (x2[7] << 26) + x2[6];\n  x_51.v[4] = (x2[9] << 26) + x2[8];\n\n  fe51_invert(&z_51, &z_51);\n  fe51_mul(&x_51, &x_51, &z_51);\n  fe51_pack(q, &x_51);\n\n  return 0;\n}\n\n#undef x2\n#undef z2\n\n#define x2 var[0]\n#define z2 var[1]\n\nstatic int\ncrypto_scalarmult_curve25519_sandy2x_base(unsigned char *q,\n                                          const unsigned char *n)\n{\n  unsigned char e[32];\n  unsigned int i;\n\n  fe var[3];\n\n  fe51 x_51;\n  fe51 z_51;\n\n  for (i = 0;i < 32;++i) e[i] = n[i];\n  e[0] &= 248;\n  e[31] &= 127;\n  e[31] |= 64;\n\n  ladder_base(var, e);\n\n  z_51.v[0] = (z2[1] << 26) + z2[0];\n  z_51.v[1] = (z2[3] << 26) + z2[2];\n  z_51.v[2] = (z2[5] << 26) + z2[4];\n  z_51.v[3] = (z2[7] << 26) + z2[6];\n  z_51.v[4] = (z2[9] << 26) + z2[8];\n\n  x_51.v[0] = (x2[1] << 26) + x2[0];\n  x_51.v[1] = (x2[3] << 26) + x2[2];\n  x_51.v[2] = (x2[5] << 26) + x2[4];\n  x_51.v[3] = (x2[7] << 26) + x2[6];\n  x_51.v[4] = (x2[9] << 26) + x2[8];\n\n  fe51_invert(&z_51, &z_51);\n  fe51_mul(&x_51, &x_51, &z_51);\n  fe51_pack(q, &x_51);\n\n  return 0;\n}\n\nstruct crypto_scalarmult_curve25519_implementation\ncrypto_scalarmult_curve25519_sandy2x_implementation = {\n    SODIUM_C99(.mult = ) crypto_scalarmult_curve25519_sandy2x,\n    SODIUM_C99(.mult_base = ) crypto_scalarmult_curve25519_sandy2x_base\n};\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/curve25519_sandy2x.h",
    "content": "#ifndef curve25519_sandy2x_H\n#define curve25519_sandy2x_H\n\n#include \"crypto_scalarmult_curve25519.h\"\n\nextern struct crypto_scalarmult_curve25519_implementation\n    crypto_scalarmult_curve25519_sandy2x_implementation;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe.h",
    "content": "/*\n   This file is adapted from ref10/fe.h:\n   All the redundant functions are removed.\n*/\n\n#ifndef fe_H\n#define fe_H\n\n#include \"crypto_uint64.h\"\n\ntypedef crypto_uint64 fe[10];\n\n/*\nfe means field element.\nHere the field is \\Z/(2^255-19).\nAn element t, entries t[0]...t[9], represents the integer\nt[0]+2^26 t[1]+2^51 t[2]+2^77 t[3]+2^102 t[4]+...+2^230 t[9].\nBounds on each t[i] vary depending on context.\n*/\n\n#define fe_frombytes crypto_scalarmult_curve25519_sandy2x_fe_frombytes\n\nextern void fe_frombytes(fe, const unsigned char *);\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51.h",
    "content": "/*\n   This file is adapted from amd64-51/fe25519.h:\n   'fe25519' is renamed as 'fe51';\n   All the redundant functions are removed;\n   New function fe51_nsquare is introduced.\n*/\n\n#ifndef fe51_H\n#define fe51_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"crypto_uint64.h\"\n#include \"fe51_namespace.h\"\n\ntypedef struct \n{\n  crypto_uint64 v[5]; \n}\nfe51;\n\nextern void fe51_pack(unsigned char *, const fe51 *);\nextern void fe51_mul(fe51 *, const fe51 *, const fe51 *);\nextern void fe51_nsquare(fe51 *, const fe51 *, int);\nextern void fe51_invert(fe51 *, const fe51 *);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_invert.c",
    "content": "/*\n   This file is adapted from amd64-51/fe25519_invert.c:\n   Loops of squares are replaced by nsquares for better performance.\n*/\n\n#include \"fe51.h\"\n\n#ifdef HAVE_AVX_ASM\n\n#define fe51_square(x, y) fe51_nsquare(x, y, 1)\n\nvoid fe51_invert(fe51 *r, const fe51 *x)\n{\n\tfe51 z2;\n\tfe51 z9;\n\tfe51 z11;\n\tfe51 z2_5_0;\n\tfe51 z2_10_0;\n\tfe51 z2_20_0;\n\tfe51 z2_50_0;\n\tfe51 z2_100_0;\n\tfe51 t;\n\t\n\t/* 2 */ fe51_square(&z2,x);\n\t/* 4 */ fe51_square(&t,&z2);\n\t/* 8 */ fe51_square(&t,&t);\n\t/* 9 */ fe51_mul(&z9,&t,x);\n\t/* 11 */ fe51_mul(&z11,&z9,&z2);\n\t/* 22 */ fe51_square(&t,&z11);\n\t/* 2^5 - 2^0 = 31 */ fe51_mul(&z2_5_0,&t,&z9);\n\n\t/* 2^10 - 2^5 */ fe51_nsquare(&t,&z2_5_0, 5); \n\t/* 2^10 - 2^0 */ fe51_mul(&z2_10_0,&t,&z2_5_0);\n\n\t/* 2^20 - 2^10 */ fe51_nsquare(&t,&z2_10_0, 10); \n\t/* 2^20 - 2^0 */ fe51_mul(&z2_20_0,&t,&z2_10_0);\n\n\t/* 2^40 - 2^20 */ fe51_nsquare(&t,&z2_20_0, 20); \n\t/* 2^40 - 2^0 */ fe51_mul(&t,&t,&z2_20_0);\n\n\t/* 2^50 - 2^10 */ fe51_nsquare(&t,&t,10);\n\t/* 2^50 - 2^0 */ fe51_mul(&z2_50_0,&t,&z2_10_0);\n\n\t/* 2^100 - 2^50 */ fe51_nsquare(&t,&z2_50_0, 50); \n\t/* 2^100 - 2^0 */ fe51_mul(&z2_100_0,&t,&z2_50_0);\n\n\t/* 2^200 - 2^100 */ fe51_nsquare(&t,&z2_100_0, 100); \n\t/* 2^200 - 2^0 */ fe51_mul(&t,&t,&z2_100_0);\n\n\t/* 2^250 - 2^50 */ fe51_nsquare(&t,&t, 50);\n\t/* 2^250 - 2^0 */ fe51_mul(&t,&t,&z2_50_0);\n\n\t/* 2^255 - 2^5 */ fe51_nsquare(&t,&t,5);\n\t/* 2^255 - 21 */ fe51_mul(r,&t,&z11);\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_mul.S",
    "content": "#ifdef IN_SANDY2X\n\n/*\n   This file is basically amd64-51/fe25519_mul.s.\n*/\n#include \"fe51_namespace.h\"\n#include \"consts_namespace.h\"\n.text\n.p2align 5\n.globl _fe51_mul\n.globl fe51_mul\n_fe51_mul:\nfe51_mul:\nmov %rsp,%r11\nand $31,%r11\nadd $96,%r11\nsub %r11,%rsp\nmovq %r11,0(%rsp)\nmovq %r12,8(%rsp)\nmovq %r13,16(%rsp)\nmovq %r14,24(%rsp)\nmovq %r15,32(%rsp)\nmovq %rbx,40(%rsp)\nmovq %rbp,48(%rsp)\nmovq %rdi,56(%rsp)\nmov  %rdx,%rcx\nmovq   24(%rsi),%rdx\nimulq  $19,%rdx,%rax\nmovq %rax,64(%rsp)\nmulq  16(%rcx)\nmov  %rax,%r8\nmov  %rdx,%r9\nmovq   32(%rsi),%rdx\nimulq  $19,%rdx,%rax\nmovq %rax,72(%rsp)\nmulq  8(%rcx)\nadd  %rax,%r8\nadc %rdx,%r9\nmovq   0(%rsi),%rax\nmulq  0(%rcx)\nadd  %rax,%r8\nadc %rdx,%r9\nmovq   0(%rsi),%rax\nmulq  8(%rcx)\nmov  %rax,%r10\nmov  %rdx,%r11\nmovq   0(%rsi),%rax\nmulq  16(%rcx)\nmov  %rax,%r12\nmov  %rdx,%r13\nmovq   0(%rsi),%rax\nmulq  24(%rcx)\nmov  %rax,%r14\nmov  %rdx,%r15\nmovq   0(%rsi),%rax\nmulq  32(%rcx)\nmov  %rax,%rbx\nmov  %rdx,%rbp\nmovq   8(%rsi),%rax\nmulq  0(%rcx)\nadd  %rax,%r10\nadc %rdx,%r11\nmovq   8(%rsi),%rax\nmulq  8(%rcx)\nadd  %rax,%r12\nadc %rdx,%r13\nmovq   8(%rsi),%rax\nmulq  16(%rcx)\nadd  %rax,%r14\nadc %rdx,%r15\nmovq   8(%rsi),%rax\nmulq  24(%rcx)\nadd  %rax,%rbx\nadc %rdx,%rbp\nmovq   8(%rsi),%rdx\nimulq  $19,%rdx,%rax\nmulq  32(%rcx)\nadd  %rax,%r8\nadc %rdx,%r9\nmovq   16(%rsi),%rax\nmulq  0(%rcx)\nadd  %rax,%r12\nadc %rdx,%r13\nmovq   16(%rsi),%rax\nmulq  8(%rcx)\nadd  %rax,%r14\nadc %rdx,%r15\nmovq   16(%rsi),%rax\nmulq  16(%rcx)\nadd  %rax,%rbx\nadc %rdx,%rbp\nmovq   16(%rsi),%rdx\nimulq  $19,%rdx,%rax\nmulq  24(%rcx)\nadd  %rax,%r8\nadc %rdx,%r9\nmovq   16(%rsi),%rdx\nimulq  $19,%rdx,%rax\nmulq  32(%rcx)\nadd  %rax,%r10\nadc %rdx,%r11\nmovq   24(%rsi),%rax\nmulq  0(%rcx)\nadd  %rax,%r14\nadc %rdx,%r15\nmovq   24(%rsi),%rax\nmulq  8(%rcx)\nadd  %rax,%rbx\nadc %rdx,%rbp\nmovq 64(%rsp),%rax\nmulq  24(%rcx)\nadd  %rax,%r10\nadc %rdx,%r11\nmovq 64(%rsp),%rax\nmulq  32(%rcx)\nadd  %rax,%r12\nadc %rdx,%r13\nmovq   32(%rsi),%rax\nmulq  0(%rcx)\nadd  %rax,%rbx\nadc %rdx,%rbp\nmovq 72(%rsp),%rax\nmulq  16(%rcx)\nadd  %rax,%r10\nadc %rdx,%r11\nmovq 72(%rsp),%rax\nmulq  24(%rcx)\nadd  %rax,%r12\nadc %rdx,%r13\nmovq 72(%rsp),%rax\nmulq  32(%rcx)\nadd  %rax,%r14\nadc %rdx,%r15\nmovq REDMASK51(%rip),%rsi\nshld $13,%r8,%r9\nand  %rsi,%r8\nshld $13,%r10,%r11\nand  %rsi,%r10\nadd  %r9,%r10\nshld $13,%r12,%r13\nand  %rsi,%r12\nadd  %r11,%r12\nshld $13,%r14,%r15\nand  %rsi,%r14\nadd  %r13,%r14\nshld $13,%rbx,%rbp\nand  %rsi,%rbx\nadd  %r15,%rbx\nimulq  $19,%rbp,%rdx\nadd  %rdx,%r8\nmov  %r8,%rdx\nshr  $51,%rdx\nadd  %r10,%rdx\nmov  %rdx,%rcx\nshr  $51,%rdx\nand  %rsi,%r8\nadd  %r12,%rdx\nmov  %rdx,%r9\nshr  $51,%rdx\nand  %rsi,%rcx\nadd  %r14,%rdx\nmov  %rdx,%rax\nshr  $51,%rdx\nand  %rsi,%r9\nadd  %rbx,%rdx\nmov  %rdx,%r10\nshr  $51,%rdx\nand  %rsi,%rax\nimulq  $19,%rdx,%rdx\nadd  %rdx,%r8\nand  %rsi,%r10\nmovq   %r8,0(%rdi)\nmovq   %rcx,8(%rdi)\nmovq   %r9,16(%rdi)\nmovq   %rax,24(%rdi)\nmovq   %r10,32(%rdi)\nmovq 0(%rsp),%r11\nmovq 8(%rsp),%r12\nmovq 16(%rsp),%r13\nmovq 24(%rsp),%r14\nmovq 32(%rsp),%r15\nmovq 40(%rsp),%rbx\nmovq 48(%rsp),%rbp\nadd %r11,%rsp\nmov %rdi,%rax\nmov %rsi,%rdx\nret\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_namespace.h",
    "content": "#ifndef fe51_namespace_H\n#define fe51_namespace_H\n\n#define  fe51              crypto_scalarmult_curve25519_sandy2x_fe51\n#define _fe51             _crypto_scalarmult_curve25519_sandy2x_fe51\n#define  fe51_pack         crypto_scalarmult_curve25519_sandy2x_fe51_pack\n#define _fe51_pack        _crypto_scalarmult_curve25519_sandy2x_fe51_pack\n#define  fe51_mul          crypto_scalarmult_curve25519_sandy2x_fe51_mul\n#define _fe51_mul         _crypto_scalarmult_curve25519_sandy2x_fe51_mul\n#define  fe51_nsquare      crypto_scalarmult_curve25519_sandy2x_fe51_nsquare\n#define _fe51_nsquare     _crypto_scalarmult_curve25519_sandy2x_fe51_nsquare\n\n#define  fe51_invert       crypto_scalarmult_curve25519_sandy2x_fe51_invert\n\n#endif //ifndef fe51_namespace_H\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_nsquare.S",
    "content": "#ifdef IN_SANDY2X\n\n/*\n   This file is adapted from amd64-51/fe25519_square.s:\n   Adding loop to perform n squares.\n*/\n#include \"fe51_namespace.h\"\n#include \"consts_namespace.h\"\n.p2align 5\n\n.globl fe51_nsquare\n.globl _fe51_nsquare\n#ifdef __ELF__\n.type  fe51_nsquare, @function\n.type _fe51_nsquare, @function\n#endif\nfe51_nsquare:\n_fe51_nsquare:\n\nmov %rsp,%r11\nand $31,%r11\nadd $64,%r11\nsub %r11,%rsp\nmovq %r11,0(%rsp)\nmovq %r12,8(%rsp)\nmovq %r13,16(%rsp)\nmovq %r14,24(%rsp)\nmovq %r15,32(%rsp)\nmovq %rbx,40(%rsp)\nmovq %rbp,48(%rsp)\nmovq   0(%rsi),%rcx\nmovq   8(%rsi),%r8\nmovq   16(%rsi),%r9\nmovq   24(%rsi),%rax\nmovq   32(%rsi),%rsi\nmovq   %r9,16(%rdi)\nmovq   %rax,24(%rdi)\nmovq   %rsi,32(%rdi)\nmov  %rdx,%rsi\n._loop:\nsub  $1,%rsi\nmov  %rcx,%rax\nmul  %rcx\nadd  %rcx,%rcx\nmov  %rax,%r9\nmov  %rdx,%r10\nmov  %rcx,%rax\nmul  %r8\nmov  %rax,%r11\nmov  %rdx,%r12\nmov  %rcx,%rax\nmulq  16(%rdi)\nmov  %rax,%r13\nmov  %rdx,%r14\nmov  %rcx,%rax\nmulq  24(%rdi)\nmov  %rax,%r15\nmov  %rdx,%rbx\nmov  %rcx,%rax\nmulq  32(%rdi)\nmov  %rax,%rcx\nmov  %rdx,%rbp\nmov  %r8,%rax\nmul  %r8\nadd  %r8,%r8\nadd  %rax,%r13\nadc %rdx,%r14\nmov  %r8,%rax\nmulq  16(%rdi)\nadd  %rax,%r15\nadc %rdx,%rbx\nmov  %r8,%rax\nimulq  $19, %r8,%r8\nmulq  24(%rdi)\nadd  %rax,%rcx\nadc %rdx,%rbp\nmov  %r8,%rax\nmulq  32(%rdi)\nadd  %rax,%r9\nadc %rdx,%r10\nmovq   16(%rdi),%rax\nmulq  16(%rdi)\nadd  %rax,%rcx\nadc %rdx,%rbp\nshld $13,%rcx,%rbp\nmovq   16(%rdi),%rax\nimulq  $38, %rax,%rax\nmulq  24(%rdi)\nadd  %rax,%r9\nadc %rdx,%r10\nshld $13,%r9,%r10\nmovq   16(%rdi),%rax\nimulq  $38, %rax,%rax\nmulq  32(%rdi)\nadd  %rax,%r11\nadc %rdx,%r12\nmovq   24(%rdi),%rax\nimulq  $19, %rax,%rax\nmulq  24(%rdi)\nadd  %rax,%r11\nadc %rdx,%r12\nshld $13,%r11,%r12\nmovq   24(%rdi),%rax\nimulq  $38, %rax,%rax\nmulq  32(%rdi)\nadd  %rax,%r13\nadc %rdx,%r14\nshld $13,%r13,%r14\nmovq   32(%rdi),%rax\nimulq  $19, %rax,%rax\nmulq  32(%rdi)\nadd  %rax,%r15\nadc %rdx,%rbx\nshld $13,%r15,%rbx\nmovq REDMASK51(%rip),%rdx\nand  %rdx,%rcx\nadd  %rbx,%rcx\nand  %rdx,%r9\nand  %rdx,%r11\nadd  %r10,%r11\nand  %rdx,%r13\nadd  %r12,%r13\nand  %rdx,%r15\nadd  %r14,%r15\nimulq  $19, %rbp,%rbp\nlea  (%r9,%rbp),%r9\nmov  %r9,%rax\nshr  $51,%r9\nadd  %r11,%r9\nand  %rdx,%rax\nmov  %r9,%r8\nshr  $51,%r9\nadd  %r13,%r9\nand  %rdx,%r8\nmov  %r9,%r10\nshr  $51,%r9\nadd  %r15,%r9\nand  %rdx,%r10\nmovq   %r10,16(%rdi)\nmov  %r9,%r10\nshr  $51,%r9\nadd  %rcx,%r9\nand  %rdx,%r10\nmovq   %r10,24(%rdi)\nmov  %r9,%r10\nshr  $51,%r9\nimulq  $19, %r9,%r9\nlea  (%rax,%r9),%rcx\nand  %rdx,%r10\nmovq   %r10,32(%rdi)\ncmp  $0,%rsi\njne ._loop\nmovq   %rcx,0(%rdi)\nmovq   %r8,8(%rdi)\nmovq 0(%rsp),%r11\nmovq 8(%rsp),%r12\nmovq 16(%rsp),%r13\nmovq 24(%rsp),%r14\nmovq 32(%rsp),%r15\nmovq 40(%rsp),%rbx\nmovq 48(%rsp),%rbp\nadd %r11,%rsp\nret\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe51_pack.S",
    "content": "#ifdef IN_SANDY2X\n\n/*\n   This file is the result of merging \n   amd64-51/fe25519_pack.c and amd64-51/fe25519_freeze.s.\n*/\n#include \"fe51_namespace.h\"\n#include \"consts_namespace.h\"\n.p2align 5\n\n.globl fe51_pack\n.globl _fe51_pack\n#ifdef __ELF__\n.type  fe51_pack, @function\n.type _fe51_pack, @function\n#endif\nfe51_pack:\n_fe51_pack:\n\nmov %rsp,%r11\nand $31,%r11\nadd $32,%r11\nsub %r11,%rsp\nmovq %r11,0(%rsp)\nmovq %r12,8(%rsp)\nmovq   0(%rsi),%rdx\nmovq   8(%rsi),%rcx\nmovq   16(%rsi),%r8\nmovq   24(%rsi),%r9\nmovq   32(%rsi),%rsi\nmovq REDMASK51(%rip),%rax\nlea  -18(%rax),%r10\nmov  $3,%r11\n._reduceloop:\nmov  %rdx,%r12\nshr  $51,%r12\nand  %rax,%rdx\nadd  %r12,%rcx\nmov  %rcx,%r12\nshr  $51,%r12\nand  %rax,%rcx\nadd  %r12,%r8\nmov  %r8,%r12\nshr  $51,%r12\nand  %rax,%r8\nadd  %r12,%r9\nmov  %r9,%r12\nshr  $51,%r12\nand  %rax,%r9\nadd  %r12,%rsi\nmov  %rsi,%r12\nshr  $51,%r12\nand  %rax,%rsi\nimulq  $19, %r12,%r12\nadd  %r12,%rdx\nsub  $1,%r11\nja ._reduceloop\nmov  $1,%r12\ncmp  %r10,%rdx\ncmovl %r11,%r12\ncmp  %rax,%rcx\ncmovne %r11,%r12\ncmp  %rax,%r8\ncmovne %r11,%r12\ncmp  %rax,%r9\ncmovne %r11,%r12\ncmp  %rax,%rsi\ncmovne %r11,%r12\nneg  %r12\nand  %r12,%rax\nand  %r12,%r10\nsub  %r10,%rdx\nsub  %rax,%rcx\nsub  %rax,%r8\nsub  %rax,%r9\nsub  %rax,%rsi\nmov  %rdx,%rax\nand  $0xFF,%eax\nmovb   %al,0(%rdi)\nmov  %rdx,%rax\nshr  $8,%rax\nand  $0xFF,%eax\nmovb   %al,1(%rdi)\nmov  %rdx,%rax\nshr  $16,%rax\nand  $0xFF,%eax\nmovb   %al,2(%rdi)\nmov  %rdx,%rax\nshr  $24,%rax\nand  $0xFF,%eax\nmovb   %al,3(%rdi)\nmov  %rdx,%rax\nshr  $32,%rax\nand  $0xFF,%eax\nmovb   %al,4(%rdi)\nmov  %rdx,%rax\nshr  $40,%rax\nand  $0xFF,%eax\nmovb   %al,5(%rdi)\nmov  %rdx,%rdx\nshr  $48,%rdx\nmov  %rcx,%rax\nshl  $3,%rax\nand  $0xF8,%eax\nxor  %rdx,%rax\nmovb   %al,6(%rdi)\nmov  %rcx,%rdx\nshr  $5,%rdx\nand  $0xFF,%edx\nmovb   %dl,7(%rdi)\nmov  %rcx,%rdx\nshr  $13,%rdx\nand  $0xFF,%edx\nmovb   %dl,8(%rdi)\nmov  %rcx,%rdx\nshr  $21,%rdx\nand  $0xFF,%edx\nmovb   %dl,9(%rdi)\nmov  %rcx,%rdx\nshr  $29,%rdx\nand  $0xFF,%edx\nmovb   %dl,10(%rdi)\nmov  %rcx,%rdx\nshr  $37,%rdx\nand  $0xFF,%edx\nmovb   %dl,11(%rdi)\nmov  %rcx,%rdx\nshr  $45,%rdx\nmov  %r8,%rcx\nshl  $6,%rcx\nand  $0xC0,%ecx\nxor  %rdx,%rcx\nmovb   %cl,12(%rdi)\nmov  %r8,%rdx\nshr  $2,%rdx\nand  $0xFF,%edx\nmovb   %dl,13(%rdi)\nmov  %r8,%rdx\nshr  $10,%rdx\nand  $0xFF,%edx\nmovb   %dl,14(%rdi)\nmov  %r8,%rdx\nshr  $18,%rdx\nand  $0xFF,%edx\nmovb   %dl,15(%rdi)\nmov  %r8,%rdx\nshr  $26,%rdx\nand  $0xFF,%edx\nmovb   %dl,16(%rdi)\nmov  %r8,%rdx\nshr  $34,%rdx\nand  $0xFF,%edx\nmovb   %dl,17(%rdi)\nmov  %r8,%rdx\nshr  $42,%rdx\nmovb   %dl,18(%rdi)\nmov  %r8,%rdx\nshr  $50,%rdx\nmov  %r9,%rcx\nshl  $1,%rcx\nand  $0xFE,%ecx\nxor  %rdx,%rcx\nmovb   %cl,19(%rdi)\nmov  %r9,%rdx\nshr  $7,%rdx\nand  $0xFF,%edx\nmovb   %dl,20(%rdi)\nmov  %r9,%rdx\nshr  $15,%rdx\nand  $0xFF,%edx\nmovb   %dl,21(%rdi)\nmov  %r9,%rdx\nshr  $23,%rdx\nand  $0xFF,%edx\nmovb   %dl,22(%rdi)\nmov  %r9,%rdx\nshr  $31,%rdx\nand  $0xFF,%edx\nmovb   %dl,23(%rdi)\nmov  %r9,%rdx\nshr  $39,%rdx\nand  $0xFF,%edx\nmovb   %dl,24(%rdi)\nmov  %r9,%rdx\nshr  $47,%rdx\nmov  %rsi,%rcx\nshl  $4,%rcx\nand  $0xF0,%ecx\nxor  %rdx,%rcx\nmovb   %cl,25(%rdi)\nmov  %rsi,%rdx\nshr  $4,%rdx\nand  $0xFF,%edx\nmovb   %dl,26(%rdi)\nmov  %rsi,%rdx\nshr  $12,%rdx\nand  $0xFF,%edx\nmovb   %dl,27(%rdi)\nmov  %rsi,%rdx\nshr  $20,%rdx\nand  $0xFF,%edx\nmovb   %dl,28(%rdi)\nmov  %rsi,%rdx\nshr  $28,%rdx\nand  $0xFF,%edx\nmovb   %dl,29(%rdi)\nmov  %rsi,%rdx\nshr  $36,%rdx\nand  $0xFF,%edx\nmovb   %dl,30(%rdi)\nmov  %rsi,%rsi\nshr  $44,%rsi\nmovb   %sil,31(%rdi)\nmovq 0(%rsp),%r11\nmovq 8(%rsp),%r12\nadd %r11,%rsp\nret\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/fe_frombytes_sandy2x.c",
    "content": "/*\n   This file is basically ref10/fe_frombytes.h.\n*/\n\n#include \"fe.h\"\n#include \"crypto_uint64.h\"\n\n#ifdef HAVE_AVX_ASM\n\nstatic crypto_uint64 load_3(const unsigned char *in)\n{\n  crypto_uint64 result;\n  result = (crypto_uint64) in[0];\n  result |= ((crypto_uint64) in[1]) << 8;\n  result |= ((crypto_uint64) in[2]) << 16;\n  return result;\n}\n\nstatic crypto_uint64 load_4(const unsigned char *in)\n{\n  crypto_uint64 result;\n  result = (crypto_uint64) in[0];\n  result |= ((crypto_uint64) in[1]) << 8;\n  result |= ((crypto_uint64) in[2]) << 16;\n  result |= ((crypto_uint64) in[3]) << 24;\n  return result;\n}\n\nvoid fe_frombytes(fe h,const unsigned char *s)\n{\n  crypto_uint64 h0 = load_4(s);\n  crypto_uint64 h1 = load_3(s + 4) << 6;\n  crypto_uint64 h2 = load_3(s + 7) << 5;\n  crypto_uint64 h3 = load_3(s + 10) << 3;\n  crypto_uint64 h4 = load_3(s + 13) << 2;\n  crypto_uint64 h5 = load_4(s + 16);\n  crypto_uint64 h6 = load_3(s + 20) << 7;\n  crypto_uint64 h7 = load_3(s + 23) << 5;\n  crypto_uint64 h8 = load_3(s + 26) << 4;\n  crypto_uint64 h9 = (load_3(s + 29) & 8388607) << 2;\n  crypto_uint64 carry0;\n  crypto_uint64 carry1;\n  crypto_uint64 carry2;\n  crypto_uint64 carry3;\n  crypto_uint64 carry4;\n  crypto_uint64 carry5;\n  crypto_uint64 carry6;\n  crypto_uint64 carry7;\n  crypto_uint64 carry8;\n  crypto_uint64 carry9;\n\n  carry9 = h9 >> 25; h0 += carry9 * 19; h9 &= 0x1FFFFFF;\n  carry1 = h1 >> 25; h2 += carry1; h1 &= 0x1FFFFFF;\n  carry3 = h3 >> 25; h4 += carry3; h3 &= 0x1FFFFFF;\n  carry5 = h5 >> 25; h6 += carry5; h5 &= 0x1FFFFFF;\n  carry7 = h7 >> 25; h8 += carry7; h7 &= 0x1FFFFFF;\n\n  carry0 = h0 >> 26; h1 += carry0; h0 &= 0x3FFFFFF;\n  carry2 = h2 >> 26; h3 += carry2; h2 &= 0x3FFFFFF;\n  carry4 = h4 >> 26; h5 += carry4; h4 &= 0x3FFFFFF;\n  carry6 = h6 >> 26; h7 += carry6; h6 &= 0x3FFFFFF;\n  carry8 = h8 >> 26; h9 += carry8; h8 &= 0x3FFFFFF;\n\n  h[0] = h0;\n  h[1] = h1;\n  h[2] = h2;\n  h[3] = h3;\n  h[4] = h4;\n  h[5] = h5;\n  h[6] = h6;\n  h[7] = h7;\n  h[8] = h8;\n  h[9] = h9;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/ladder.S",
    "content": "#ifdef IN_SANDY2X\n\n#include \"ladder_namespace.h\"\n#include \"consts_namespace.h\"\n.p2align 5\n\n.globl ladder\n.globl _ladder\n#ifdef __ELF__\n.type  ladder, @function\n.type _ladder, @function\n#endif\nladder:\n_ladder:\n\nmov %rsp,%r11\nand $31,%r11\nadd $1856,%r11\nsub %r11,%rsp\nmovq %r11,1824(%rsp)\nmovq %r12,1832(%rsp)\nmovq %r13,1840(%rsp)\nmovq %r14,1848(%rsp)\nmovdqa v0_0(%rip),%xmm0\nmovdqa v1_0(%rip),%xmm1\nmovdqu   0(%rdi),%xmm2\nmovdqa %xmm2,0(%rsp)\nmovdqu   16(%rdi),%xmm2\nmovdqa %xmm2,16(%rsp)\nmovdqu   32(%rdi),%xmm2\nmovdqa %xmm2,32(%rsp)\nmovdqu   48(%rdi),%xmm2\nmovdqa %xmm2,48(%rsp)\nmovdqu   64(%rdi),%xmm2\nmovdqa %xmm2,64(%rsp)\nmovdqa %xmm1,80(%rsp)\nmovdqa %xmm0,96(%rsp)\nmovdqa %xmm0,112(%rsp)\nmovdqa %xmm0,128(%rsp)\nmovdqa %xmm0,144(%rsp)\nmovdqa %xmm1,%xmm0\npxor %xmm1,%xmm1\npxor %xmm2,%xmm2\npxor %xmm3,%xmm3\npxor %xmm4,%xmm4\npxor %xmm5,%xmm5\npxor %xmm6,%xmm6\npxor %xmm7,%xmm7\npxor %xmm8,%xmm8\npxor %xmm9,%xmm9\nmovdqu   0(%rdi),%xmm10\nmovdqa %xmm10,160(%rsp)\nmovdqu   16(%rdi),%xmm10\nmovdqa %xmm10,176(%rsp)\npmuludq v19_19(%rip),%xmm10\nmovdqa %xmm10,192(%rsp)\nmovdqu   32(%rdi),%xmm10\nmovdqa %xmm10,208(%rsp)\npmuludq v19_19(%rip),%xmm10\nmovdqa %xmm10,224(%rsp)\nmovdqu   48(%rdi),%xmm10\nmovdqa %xmm10,240(%rsp)\npmuludq v19_19(%rip),%xmm10\nmovdqa %xmm10,256(%rsp)\nmovdqu   64(%rdi),%xmm10\nmovdqa %xmm10,272(%rsp)\npmuludq v19_19(%rip),%xmm10\nmovdqa %xmm10,288(%rsp)\nmovdqu   8(%rdi),%xmm10\npmuludq v2_1(%rip),%xmm10\nmovdqa %xmm10,304(%rsp)\npmuludq v19_19(%rip),%xmm10\nmovdqa %xmm10,320(%rsp)\nmovdqu   24(%rdi),%xmm10\npmuludq v2_1(%rip),%xmm10\nmovdqa %xmm10,336(%rsp)\npmuludq v19_19(%rip),%xmm10\nmovdqa %xmm10,352(%rsp)\nmovdqu   40(%rdi),%xmm10\npmuludq v2_1(%rip),%xmm10\nmovdqa %xmm10,368(%rsp)\npmuludq v19_19(%rip),%xmm10\nmovdqa %xmm10,384(%rsp)\nmovdqu   56(%rdi),%xmm10\npmuludq v2_1(%rip),%xmm10\nmovdqa %xmm10,400(%rsp)\npmuludq v19_19(%rip),%xmm10\nmovdqa %xmm10,416(%rsp)\nmovdqu   0(%rdi),%xmm10\nmovdqu   64(%rdi),%xmm11\nblendps $12, %xmm11, %xmm10\npshufd $2,%xmm10,%xmm10\npmuludq v38_1(%rip),%xmm10\nmovdqa %xmm10,432(%rsp)\nmovq   0(%rsi),%rdx\nmovq   8(%rsi),%rcx\nmovq   16(%rsi),%r8\nmovq   24(%rsi),%r9\nshrd $1,%rcx,%rdx\nshrd $1,%r8,%rcx\nshrd $1,%r9,%r8\nshr  $1,%r9\nxorq 0(%rsi),%rdx\nxorq 8(%rsi),%rcx\nxorq 16(%rsi),%r8\nxorq 24(%rsi),%r9\nleaq 800(%rsp),%rsi\nmov  $64,%rax\n._ladder_small_loop:\nmov  %rdx,%r10\nmov  %rcx,%r11\nmov  %r8,%r12\nmov  %r9,%r13\nshr  $1,%rdx\nshr  $1,%rcx\nshr  $1,%r8\nshr  $1,%r9\nand  $1,%r10d\nand  $1,%r11d\nand  $1,%r12d\nand  $1,%r13d\nneg  %r10\nneg  %r11\nneg  %r12\nneg  %r13\nmovl   %r10d,0(%rsi)\nmovl   %r11d,256(%rsi)\nmovl   %r12d,512(%rsi)\nmovl   %r13d,768(%rsi)\nadd  $4,%rsi\nsub  $1,%rax\njne ._ladder_small_loop\nmov  $255,%rdx\nadd  $760,%rsi\n._ladder_loop:\nsub  $1,%rdx\nvbroadcastss 0(%rsi),%xmm10\nsub  $4,%rsi\nmovdqa 0(%rsp),%xmm11\nmovdqa 80(%rsp),%xmm12\nvpxor %xmm11,%xmm0,%xmm13\npand %xmm10,%xmm13\npxor %xmm13,%xmm0\npxor %xmm13,%xmm11\nvpxor %xmm12,%xmm1,%xmm13\npand %xmm10,%xmm13\npxor %xmm13,%xmm1\npxor %xmm13,%xmm12\nmovdqa 16(%rsp),%xmm13\nmovdqa 96(%rsp),%xmm14\nvpxor %xmm13,%xmm2,%xmm15\npand %xmm10,%xmm15\npxor %xmm15,%xmm2\npxor %xmm15,%xmm13\nvpxor %xmm14,%xmm3,%xmm15\npand %xmm10,%xmm15\npxor %xmm15,%xmm3\npxor %xmm15,%xmm14\nmovdqa %xmm13,0(%rsp)\nmovdqa %xmm14,16(%rsp)\nmovdqa 32(%rsp),%xmm13\nmovdqa 112(%rsp),%xmm14\nvpxor %xmm13,%xmm4,%xmm15\npand %xmm10,%xmm15\npxor %xmm15,%xmm4\npxor %xmm15,%xmm13\nvpxor %xmm14,%xmm5,%xmm15\npand %xmm10,%xmm15\npxor %xmm15,%xmm5\npxor %xmm15,%xmm14\nmovdqa %xmm13,32(%rsp)\nmovdqa %xmm14,80(%rsp)\nmovdqa 48(%rsp),%xmm13\nmovdqa 128(%rsp),%xmm14\nvpxor %xmm13,%xmm6,%xmm15\npand %xmm10,%xmm15\npxor %xmm15,%xmm6\npxor %xmm15,%xmm13\nvpxor %xmm14,%xmm7,%xmm15\npand %xmm10,%xmm15\npxor %xmm15,%xmm7\npxor %xmm15,%xmm14\nmovdqa %xmm13,48(%rsp)\nmovdqa %xmm14,96(%rsp)\nmovdqa 64(%rsp),%xmm13\nmovdqa 144(%rsp),%xmm14\nvpxor %xmm13,%xmm8,%xmm15\npand %xmm10,%xmm15\npxor %xmm15,%xmm8\npxor %xmm15,%xmm13\nvpxor %xmm14,%xmm9,%xmm15\npand %xmm10,%xmm15\npxor %xmm15,%xmm9\npxor %xmm15,%xmm14\nmovdqa %xmm13,64(%rsp)\nmovdqa %xmm14,112(%rsp)\nvpaddq subc0(%rip),%xmm11,%xmm10\npsubq %xmm12,%xmm10\npaddq %xmm12,%xmm11\nvpunpckhqdq %xmm10,%xmm11,%xmm12\nvpunpcklqdq %xmm10,%xmm11,%xmm10\nvpaddq %xmm1,%xmm0,%xmm11\npaddq subc0(%rip),%xmm0\npsubq %xmm1,%xmm0\nvpunpckhqdq %xmm11,%xmm0,%xmm1\nvpunpcklqdq %xmm11,%xmm0,%xmm0\nvpmuludq %xmm0,%xmm10,%xmm11\nvpmuludq %xmm1,%xmm10,%xmm13\nmovdqa %xmm1,128(%rsp)\npaddq %xmm1,%xmm1\nvpmuludq %xmm0,%xmm12,%xmm14\nmovdqa %xmm0,144(%rsp)\npaddq %xmm14,%xmm13\nvpmuludq %xmm1,%xmm12,%xmm0\nmovdqa %xmm1,448(%rsp)\nvpaddq %xmm3,%xmm2,%xmm1\npaddq subc2(%rip),%xmm2\npsubq %xmm3,%xmm2\nvpunpckhqdq %xmm1,%xmm2,%xmm3\nvpunpcklqdq %xmm1,%xmm2,%xmm1\nvpmuludq %xmm1,%xmm10,%xmm2\npaddq %xmm2,%xmm0\nvpmuludq %xmm3,%xmm10,%xmm2\nmovdqa %xmm3,464(%rsp)\npaddq %xmm3,%xmm3\nvpmuludq %xmm1,%xmm12,%xmm14\nmovdqa %xmm1,480(%rsp)\npaddq %xmm14,%xmm2\nvpmuludq %xmm3,%xmm12,%xmm1\nmovdqa %xmm3,496(%rsp)\nvpaddq %xmm5,%xmm4,%xmm3\npaddq subc2(%rip),%xmm4\npsubq %xmm5,%xmm4\nvpunpckhqdq %xmm3,%xmm4,%xmm5\nvpunpcklqdq %xmm3,%xmm4,%xmm3\nvpmuludq %xmm3,%xmm10,%xmm4\npaddq %xmm4,%xmm1\nvpmuludq %xmm5,%xmm10,%xmm4\nmovdqa %xmm5,512(%rsp)\npaddq %xmm5,%xmm5\nvpmuludq %xmm3,%xmm12,%xmm14\nmovdqa %xmm3,528(%rsp)\npaddq %xmm14,%xmm4\nvpaddq %xmm7,%xmm6,%xmm3\npaddq subc2(%rip),%xmm6\npsubq %xmm7,%xmm6\nvpunpckhqdq %xmm3,%xmm6,%xmm7\nvpunpcklqdq %xmm3,%xmm6,%xmm3\nvpmuludq %xmm3,%xmm10,%xmm6\nvpmuludq %xmm5,%xmm12,%xmm14\nmovdqa %xmm5,544(%rsp)\npmuludq v19_19(%rip),%xmm5\nmovdqa %xmm5,560(%rsp)\npaddq %xmm14,%xmm6\nvpmuludq %xmm7,%xmm10,%xmm5\nmovdqa %xmm7,576(%rsp)\npaddq %xmm7,%xmm7\nvpmuludq %xmm3,%xmm12,%xmm14\nmovdqa %xmm3,592(%rsp)\npaddq %xmm14,%xmm5\npmuludq v19_19(%rip),%xmm3\nmovdqa %xmm3,608(%rsp)\nvpaddq %xmm9,%xmm8,%xmm3\npaddq subc2(%rip),%xmm8\npsubq %xmm9,%xmm8\nvpunpckhqdq %xmm3,%xmm8,%xmm9\nvpunpcklqdq %xmm3,%xmm8,%xmm3\nmovdqa %xmm3,624(%rsp)\nvpmuludq %xmm7,%xmm12,%xmm8\nmovdqa %xmm7,640(%rsp)\npmuludq v19_19(%rip),%xmm7\nmovdqa %xmm7,656(%rsp)\nvpmuludq %xmm3,%xmm10,%xmm7\npaddq %xmm7,%xmm8\nvpmuludq %xmm9,%xmm10,%xmm7\nmovdqa %xmm9,672(%rsp)\npaddq %xmm9,%xmm9\nvpmuludq %xmm3,%xmm12,%xmm10\npaddq %xmm10,%xmm7\npmuludq v19_19(%rip),%xmm3\nmovdqa %xmm3,688(%rsp)\npmuludq v19_19(%rip),%xmm12\nvpmuludq %xmm9,%xmm12,%xmm3\nmovdqa %xmm9,704(%rsp)\npaddq %xmm3,%xmm11\nmovdqa 0(%rsp),%xmm3\nmovdqa 16(%rsp),%xmm9\nvpaddq subc2(%rip),%xmm3,%xmm10\npsubq %xmm9,%xmm10\npaddq %xmm9,%xmm3\nvpunpckhqdq %xmm10,%xmm3,%xmm9\nvpunpcklqdq %xmm10,%xmm3,%xmm3\nvpmuludq 144(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm0\nvpmuludq 128(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm2\nvpmuludq 480(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm1\nvpmuludq 464(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm4\nvpmuludq 528(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm6\nvpmuludq 512(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm5\nvpmuludq 592(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm8\nvpmuludq 576(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm7\npmuludq v19_19(%rip),%xmm3\nvpmuludq 624(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm11\npmuludq 672(%rsp),%xmm3\npaddq %xmm3,%xmm13\nvpmuludq 144(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm2\nvpmuludq 448(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm1\nvpmuludq 480(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm4\nvpmuludq 496(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm6\nvpmuludq 528(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm5\nvpmuludq 544(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm8\nvpmuludq 592(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm7\npmuludq v19_19(%rip),%xmm9\nvpmuludq 640(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm11\nvpmuludq 624(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm13\npmuludq 704(%rsp),%xmm9\npaddq %xmm9,%xmm0\nmovdqa 32(%rsp),%xmm3\nmovdqa 80(%rsp),%xmm9\nvpaddq subc2(%rip),%xmm3,%xmm10\npsubq %xmm9,%xmm10\npaddq %xmm9,%xmm3\nvpunpckhqdq %xmm10,%xmm3,%xmm9\nvpunpcklqdq %xmm10,%xmm3,%xmm3\nvpmuludq 144(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm1\nvpmuludq 128(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm4\nvpmuludq 480(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm6\nvpmuludq 464(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm5\nvpmuludq 528(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm8\nvpmuludq 512(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm7\npmuludq v19_19(%rip),%xmm3\nvpmuludq 592(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm11\nvpmuludq 576(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm13\nvpmuludq 624(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm0\npmuludq 672(%rsp),%xmm3\npaddq %xmm3,%xmm2\nvpmuludq 144(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm4\nvpmuludq 448(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm6\nvpmuludq 480(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm5\nvpmuludq 496(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm8\nvpmuludq 528(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm7\npmuludq v19_19(%rip),%xmm9\nvpmuludq 544(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm11\nvpmuludq 592(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm13\nvpmuludq 640(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm0\nvpmuludq 624(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm2\npmuludq 704(%rsp),%xmm9\npaddq %xmm9,%xmm1\nmovdqa 48(%rsp),%xmm3\nmovdqa 96(%rsp),%xmm9\nvpaddq subc2(%rip),%xmm3,%xmm10\npsubq %xmm9,%xmm10\npaddq %xmm9,%xmm3\nvpunpckhqdq %xmm10,%xmm3,%xmm9\nvpunpcklqdq %xmm10,%xmm3,%xmm3\nvpmuludq 144(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm6\nvpmuludq 128(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm5\nvpmuludq 480(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm8\nvpmuludq 464(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm7\npmuludq v19_19(%rip),%xmm3\nvpmuludq 528(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm11\nvpmuludq 512(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm13\nvpmuludq 592(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm0\nvpmuludq 576(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm2\nvpmuludq 624(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm1\npmuludq 672(%rsp),%xmm3\npaddq %xmm3,%xmm4\nvpmuludq 144(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm5\nvpmuludq 448(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm8\nvpmuludq 480(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm7\npmuludq v19_19(%rip),%xmm9\nvpmuludq 496(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm11\nvpmuludq 528(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm13\nvpmuludq 544(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm0\nvpmuludq 592(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm2\nvpmuludq 640(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm1\nvpmuludq 624(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm4\npmuludq 704(%rsp),%xmm9\npaddq %xmm9,%xmm6\nmovdqa 64(%rsp),%xmm3\nmovdqa 112(%rsp),%xmm9\nvpaddq subc2(%rip),%xmm3,%xmm10\npsubq %xmm9,%xmm10\npaddq %xmm9,%xmm3\nvpunpckhqdq %xmm10,%xmm3,%xmm9\nvpunpcklqdq %xmm10,%xmm3,%xmm3\nvpmuludq 144(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm8\nvpmuludq 128(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm7\npmuludq v19_19(%rip),%xmm3\nvpmuludq 480(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm11\nvpmuludq 464(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm13\nvpmuludq 528(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm0\nvpmuludq 512(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm2\nvpmuludq 592(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm1\nvpmuludq 576(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm4\nvpmuludq 624(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm6\npmuludq 672(%rsp),%xmm3\npaddq %xmm3,%xmm5\nvpmuludq 144(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm7\npmuludq v19_19(%rip),%xmm9\nvpmuludq 448(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm11\nvpmuludq 480(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm13\nvpmuludq 496(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm0\nvpmuludq 528(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm2\nvpmuludq 544(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm1\nvpmuludq 592(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm4\nvpmuludq 640(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm6\nvpmuludq 624(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm5\npmuludq 704(%rsp),%xmm9\npaddq %xmm9,%xmm8\nvpsrlq $25,%xmm4,%xmm3\npaddq %xmm3,%xmm6\npand m25(%rip),%xmm4\nvpsrlq $26,%xmm11,%xmm3\npaddq %xmm3,%xmm13\npand m26(%rip),%xmm11\nvpsrlq $26,%xmm6,%xmm3\npaddq %xmm3,%xmm5\npand m26(%rip),%xmm6\nvpsrlq $25,%xmm13,%xmm3\npaddq %xmm3,%xmm0\npand m25(%rip),%xmm13\nvpsrlq $25,%xmm5,%xmm3\npaddq %xmm3,%xmm8\npand m25(%rip),%xmm5\nvpsrlq $26,%xmm0,%xmm3\npaddq %xmm3,%xmm2\npand m26(%rip),%xmm0\nvpsrlq $26,%xmm8,%xmm3\npaddq %xmm3,%xmm7\npand m26(%rip),%xmm8\nvpsrlq $25,%xmm2,%xmm3\npaddq %xmm3,%xmm1\npand m25(%rip),%xmm2\nvpsrlq $25,%xmm7,%xmm3\nvpsllq $4,%xmm3,%xmm9\npaddq %xmm3,%xmm11\npsllq $1,%xmm3\npaddq %xmm3,%xmm9\npaddq %xmm9,%xmm11\npand m25(%rip),%xmm7\nvpsrlq $26,%xmm1,%xmm3\npaddq %xmm3,%xmm4\npand m26(%rip),%xmm1\nvpsrlq $26,%xmm11,%xmm3\npaddq %xmm3,%xmm13\npand m26(%rip),%xmm11\nvpsrlq $25,%xmm4,%xmm3\npaddq %xmm3,%xmm6\npand m25(%rip),%xmm4\nvpunpcklqdq %xmm13,%xmm11,%xmm3\nvpunpckhqdq %xmm13,%xmm11,%xmm9\nvpaddq subc0(%rip),%xmm9,%xmm10\npsubq %xmm3,%xmm10\npaddq %xmm9,%xmm3\nvpunpckhqdq %xmm3,%xmm10,%xmm9\npunpcklqdq %xmm3,%xmm10\nvpmuludq %xmm10,%xmm10,%xmm3\npaddq %xmm10,%xmm10\nvpmuludq %xmm9,%xmm10,%xmm11\nvpunpcklqdq %xmm2,%xmm0,%xmm12\nvpunpckhqdq %xmm2,%xmm0,%xmm0\nvpaddq subc2(%rip),%xmm0,%xmm2\npsubq %xmm12,%xmm2\npaddq %xmm0,%xmm12\nvpunpckhqdq %xmm12,%xmm2,%xmm0\npunpcklqdq %xmm12,%xmm2\nvpmuludq %xmm2,%xmm10,%xmm12\nvpaddq %xmm9,%xmm9,%xmm13\nvpmuludq %xmm13,%xmm9,%xmm9\npaddq %xmm9,%xmm12\nvpmuludq %xmm0,%xmm10,%xmm9\nvpmuludq %xmm2,%xmm13,%xmm14\npaddq %xmm14,%xmm9\nvpunpcklqdq %xmm4,%xmm1,%xmm14\nvpunpckhqdq %xmm4,%xmm1,%xmm1\nvpaddq subc2(%rip),%xmm1,%xmm4\npsubq %xmm14,%xmm4\npaddq %xmm1,%xmm14\nvpunpckhqdq %xmm14,%xmm4,%xmm1\npunpcklqdq %xmm14,%xmm4\nmovdqa %xmm1,0(%rsp)\npaddq %xmm1,%xmm1\nmovdqa %xmm1,16(%rsp)\npmuludq v19_19(%rip),%xmm1\nmovdqa %xmm1,32(%rsp)\nvpmuludq %xmm4,%xmm10,%xmm1\nvpmuludq %xmm2,%xmm2,%xmm14\npaddq %xmm14,%xmm1\nvpmuludq 0(%rsp),%xmm10,%xmm14\nvpmuludq %xmm4,%xmm13,%xmm15\npaddq %xmm15,%xmm14\nvpunpcklqdq %xmm5,%xmm6,%xmm15\nvpunpckhqdq %xmm5,%xmm6,%xmm5\nvpaddq subc2(%rip),%xmm5,%xmm6\npsubq %xmm15,%xmm6\npaddq %xmm5,%xmm15\nvpunpckhqdq %xmm15,%xmm6,%xmm5\npunpcklqdq %xmm15,%xmm6\nmovdqa %xmm6,48(%rsp)\npmuludq v19_19(%rip),%xmm6\nmovdqa %xmm6,64(%rsp)\nmovdqa %xmm5,80(%rsp)\npmuludq v38_38(%rip),%xmm5\nmovdqa %xmm5,96(%rsp)\nvpmuludq 48(%rsp),%xmm10,%xmm5\nvpaddq %xmm0,%xmm0,%xmm6\nvpmuludq %xmm6,%xmm0,%xmm0\npaddq %xmm0,%xmm5\nvpmuludq 80(%rsp),%xmm10,%xmm0\nvpmuludq %xmm4,%xmm6,%xmm15\npaddq %xmm15,%xmm0\nvpmuludq %xmm6,%xmm13,%xmm15\npaddq %xmm15,%xmm1\nvpmuludq %xmm6,%xmm2,%xmm15\npaddq %xmm15,%xmm14\nvpunpcklqdq %xmm7,%xmm8,%xmm15\nvpunpckhqdq %xmm7,%xmm8,%xmm7\nvpaddq subc2(%rip),%xmm7,%xmm8\npsubq %xmm15,%xmm8\npaddq %xmm7,%xmm15\nvpunpckhqdq %xmm15,%xmm8,%xmm7\npunpcklqdq %xmm15,%xmm8\nmovdqa %xmm8,112(%rsp)\npmuludq v19_19(%rip),%xmm8\nmovdqa %xmm8,448(%rsp)\nvpmuludq 112(%rsp),%xmm10,%xmm8\nvpmuludq %xmm7,%xmm10,%xmm10\nvpmuludq v38_38(%rip),%xmm7,%xmm15\nvpmuludq %xmm15,%xmm7,%xmm7\npaddq %xmm7,%xmm8\nvpmuludq %xmm15,%xmm13,%xmm7\npaddq %xmm7,%xmm3\nvpmuludq %xmm15,%xmm2,%xmm7\npaddq %xmm7,%xmm11\nvpmuludq 80(%rsp),%xmm13,%xmm7\npaddq %xmm7,%xmm7\npaddq %xmm7,%xmm8\nvpmuludq 16(%rsp),%xmm13,%xmm7\npaddq %xmm7,%xmm5\nvpmuludq 48(%rsp),%xmm13,%xmm7\npaddq %xmm7,%xmm0\nvpmuludq 112(%rsp),%xmm13,%xmm7\npaddq %xmm7,%xmm10\nvpmuludq %xmm15,%xmm6,%xmm7\npaddq %xmm7,%xmm12\nvpmuludq %xmm15,%xmm4,%xmm7\npaddq %xmm7,%xmm9\nvpaddq %xmm2,%xmm2,%xmm2\nvpmuludq %xmm4,%xmm2,%xmm7\npaddq %xmm7,%xmm5\nvpmuludq 448(%rsp),%xmm2,%xmm7\npaddq %xmm7,%xmm3\nvpmuludq 448(%rsp),%xmm6,%xmm7\npaddq %xmm7,%xmm11\nvpmuludq 0(%rsp),%xmm2,%xmm7\npaddq %xmm7,%xmm0\nvpmuludq 48(%rsp),%xmm2,%xmm7\npaddq %xmm7,%xmm8\nvpmuludq 80(%rsp),%xmm2,%xmm2\npaddq %xmm2,%xmm10\nvpmuludq 96(%rsp),%xmm4,%xmm2\npaddq %xmm2,%xmm11\nvpmuludq %xmm4,%xmm4,%xmm2\npaddq %xmm2,%xmm8\nvpaddq %xmm4,%xmm4,%xmm2\nvpmuludq 448(%rsp),%xmm2,%xmm4\npaddq %xmm4,%xmm12\nvpmuludq 16(%rsp),%xmm15,%xmm4\npaddq %xmm4,%xmm1\nvpmuludq 48(%rsp),%xmm15,%xmm4\npaddq %xmm4,%xmm14\nvpmuludq 96(%rsp),%xmm6,%xmm4\npaddq %xmm4,%xmm3\nmovdqa 16(%rsp),%xmm4\npmuludq 448(%rsp),%xmm4\npaddq %xmm4,%xmm9\nvpmuludq 16(%rsp),%xmm6,%xmm4\npaddq %xmm4,%xmm8\nvpmuludq 48(%rsp),%xmm6,%xmm4\npaddq %xmm4,%xmm10\nvpmuludq 80(%rsp),%xmm15,%xmm4\npaddq %xmm4,%xmm4\npaddq %xmm4,%xmm5\nvpmuludq 112(%rsp),%xmm15,%xmm4\npaddq %xmm4,%xmm0\nmovdqa 48(%rsp),%xmm4\npaddq %xmm4,%xmm4\npmuludq 448(%rsp),%xmm4\npaddq %xmm4,%xmm1\nmovdqa 80(%rsp),%xmm4\npaddq %xmm4,%xmm4\npmuludq 448(%rsp),%xmm4\npaddq %xmm4,%xmm14\nvpmuludq 64(%rsp),%xmm2,%xmm4\npaddq %xmm4,%xmm3\nmovdqa 16(%rsp),%xmm4\npmuludq 64(%rsp),%xmm4\npaddq %xmm4,%xmm11\nmovdqa 16(%rsp),%xmm4\npmuludq 96(%rsp),%xmm4\npaddq %xmm4,%xmm12\nmovdqa 48(%rsp),%xmm4\npmuludq 96(%rsp),%xmm4\npaddq %xmm4,%xmm9\nvpmuludq 0(%rsp),%xmm2,%xmm2\npaddq %xmm2,%xmm10\nmovdqa 32(%rsp),%xmm2\npmuludq 0(%rsp),%xmm2\npaddq %xmm2,%xmm3\nmovdqa 64(%rsp),%xmm2\npmuludq 48(%rsp),%xmm2\npaddq %xmm2,%xmm12\nmovdqa 96(%rsp),%xmm2\npmuludq 80(%rsp),%xmm2\npaddq %xmm2,%xmm1\nmovdqa 448(%rsp),%xmm2\npmuludq 112(%rsp),%xmm2\npaddq %xmm2,%xmm5\nvpsrlq $26,%xmm3,%xmm2\npaddq %xmm2,%xmm11\npand m26(%rip),%xmm3\nvpsrlq $25,%xmm14,%xmm2\npaddq %xmm2,%xmm5\npand m25(%rip),%xmm14\nvpsrlq $25,%xmm11,%xmm2\npaddq %xmm2,%xmm12\npand m25(%rip),%xmm11\nvpsrlq $26,%xmm5,%xmm2\npaddq %xmm2,%xmm0\npand m26(%rip),%xmm5\nvpsrlq $26,%xmm12,%xmm2\npaddq %xmm2,%xmm9\npand m26(%rip),%xmm12\nvpsrlq $25,%xmm0,%xmm2\npaddq %xmm2,%xmm8\npand m25(%rip),%xmm0\nvpsrlq $25,%xmm9,%xmm2\npaddq %xmm2,%xmm1\npand m25(%rip),%xmm9\nvpsrlq $26,%xmm8,%xmm2\npaddq %xmm2,%xmm10\npand m26(%rip),%xmm8\nvpsrlq $26,%xmm1,%xmm2\npaddq %xmm2,%xmm14\npand m26(%rip),%xmm1\nvpsrlq $25,%xmm10,%xmm2\nvpsllq $4,%xmm2,%xmm4\npaddq %xmm2,%xmm3\npsllq $1,%xmm2\npaddq %xmm2,%xmm4\npaddq %xmm4,%xmm3\npand m25(%rip),%xmm10\nvpsrlq $25,%xmm14,%xmm2\npaddq %xmm2,%xmm5\npand m25(%rip),%xmm14\nvpsrlq $26,%xmm3,%xmm2\npaddq %xmm2,%xmm11\npand m26(%rip),%xmm3\nvpunpckhqdq %xmm11,%xmm3,%xmm2\nmovdqa %xmm2,0(%rsp)\npshufd $0,%xmm3,%xmm2\npshufd $0,%xmm11,%xmm3\nvpmuludq 160(%rsp),%xmm2,%xmm4\nvpmuludq 432(%rsp),%xmm3,%xmm6\npaddq %xmm6,%xmm4\nvpmuludq 176(%rsp),%xmm2,%xmm6\nvpmuludq 304(%rsp),%xmm3,%xmm7\npaddq %xmm7,%xmm6\nvpmuludq 208(%rsp),%xmm2,%xmm7\nvpmuludq 336(%rsp),%xmm3,%xmm11\npaddq %xmm11,%xmm7\nvpmuludq 240(%rsp),%xmm2,%xmm11\nvpmuludq 368(%rsp),%xmm3,%xmm13\npaddq %xmm13,%xmm11\nvpmuludq 272(%rsp),%xmm2,%xmm2\nvpmuludq 400(%rsp),%xmm3,%xmm3\npaddq %xmm3,%xmm2\nvpunpckhqdq %xmm9,%xmm12,%xmm3\nmovdqa %xmm3,16(%rsp)\npshufd $0,%xmm12,%xmm3\npshufd $0,%xmm9,%xmm9\nvpmuludq 288(%rsp),%xmm3,%xmm12\npaddq %xmm12,%xmm4\nvpmuludq 416(%rsp),%xmm9,%xmm12\npaddq %xmm12,%xmm4\nvpmuludq 160(%rsp),%xmm3,%xmm12\npaddq %xmm12,%xmm6\nvpmuludq 432(%rsp),%xmm9,%xmm12\npaddq %xmm12,%xmm6\nvpmuludq 176(%rsp),%xmm3,%xmm12\npaddq %xmm12,%xmm7\nvpmuludq 304(%rsp),%xmm9,%xmm12\npaddq %xmm12,%xmm7\nvpmuludq 208(%rsp),%xmm3,%xmm12\npaddq %xmm12,%xmm11\nvpmuludq 336(%rsp),%xmm9,%xmm12\npaddq %xmm12,%xmm11\nvpmuludq 240(%rsp),%xmm3,%xmm3\npaddq %xmm3,%xmm2\nvpmuludq 368(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm2\nvpunpckhqdq %xmm14,%xmm1,%xmm3\nmovdqa %xmm3,32(%rsp)\npshufd $0,%xmm1,%xmm1\npshufd $0,%xmm14,%xmm3\nvpmuludq 256(%rsp),%xmm1,%xmm9\npaddq %xmm9,%xmm4\nvpmuludq 384(%rsp),%xmm3,%xmm9\npaddq %xmm9,%xmm4\nvpmuludq 288(%rsp),%xmm1,%xmm9\npaddq %xmm9,%xmm6\nvpmuludq 416(%rsp),%xmm3,%xmm9\npaddq %xmm9,%xmm6\nvpmuludq 160(%rsp),%xmm1,%xmm9\npaddq %xmm9,%xmm7\nvpmuludq 432(%rsp),%xmm3,%xmm9\npaddq %xmm9,%xmm7\nvpmuludq 176(%rsp),%xmm1,%xmm9\npaddq %xmm9,%xmm11\nvpmuludq 304(%rsp),%xmm3,%xmm9\npaddq %xmm9,%xmm11\nvpmuludq 208(%rsp),%xmm1,%xmm1\npaddq %xmm1,%xmm2\nvpmuludq 336(%rsp),%xmm3,%xmm1\npaddq %xmm1,%xmm2\nvpunpckhqdq %xmm0,%xmm5,%xmm1\nmovdqa %xmm1,48(%rsp)\npshufd $0,%xmm5,%xmm1\npshufd $0,%xmm0,%xmm0\nvpmuludq 224(%rsp),%xmm1,%xmm3\npaddq %xmm3,%xmm4\nvpmuludq 352(%rsp),%xmm0,%xmm3\npaddq %xmm3,%xmm4\nvpmuludq 256(%rsp),%xmm1,%xmm3\npaddq %xmm3,%xmm6\nvpmuludq 384(%rsp),%xmm0,%xmm3\npaddq %xmm3,%xmm6\nvpmuludq 288(%rsp),%xmm1,%xmm3\npaddq %xmm3,%xmm7\nvpmuludq 416(%rsp),%xmm0,%xmm3\npaddq %xmm3,%xmm7\nvpmuludq 160(%rsp),%xmm1,%xmm3\npaddq %xmm3,%xmm11\nvpmuludq 432(%rsp),%xmm0,%xmm3\npaddq %xmm3,%xmm11\nvpmuludq 176(%rsp),%xmm1,%xmm1\npaddq %xmm1,%xmm2\nvpmuludq 304(%rsp),%xmm0,%xmm0\npaddq %xmm0,%xmm2\nvpunpckhqdq %xmm10,%xmm8,%xmm0\nmovdqa %xmm0,64(%rsp)\npshufd $0,%xmm8,%xmm0\npshufd $0,%xmm10,%xmm1\nvpmuludq 192(%rsp),%xmm0,%xmm3\npaddq %xmm3,%xmm4\nvpmuludq 320(%rsp),%xmm1,%xmm3\npaddq %xmm3,%xmm4\nvpmuludq 224(%rsp),%xmm0,%xmm3\npaddq %xmm3,%xmm6\nvpmuludq 352(%rsp),%xmm1,%xmm3\npaddq %xmm3,%xmm6\nvpmuludq 256(%rsp),%xmm0,%xmm3\npaddq %xmm3,%xmm7\nvpmuludq 384(%rsp),%xmm1,%xmm3\npaddq %xmm3,%xmm7\nvpmuludq 288(%rsp),%xmm0,%xmm3\npaddq %xmm3,%xmm11\nvpmuludq 416(%rsp),%xmm1,%xmm3\npaddq %xmm3,%xmm11\nvpmuludq 160(%rsp),%xmm0,%xmm0\npaddq %xmm0,%xmm2\nvpmuludq 432(%rsp),%xmm1,%xmm0\npaddq %xmm0,%xmm2\nmovdqa %xmm4,80(%rsp)\nmovdqa %xmm6,96(%rsp)\nmovdqa %xmm7,112(%rsp)\nmovdqa %xmm11,448(%rsp)\nmovdqa %xmm2,496(%rsp)\nmovdqa 144(%rsp),%xmm0\nvpmuludq %xmm0,%xmm0,%xmm1\npaddq %xmm0,%xmm0\nmovdqa 128(%rsp),%xmm2\nvpmuludq %xmm2,%xmm0,%xmm3\nmovdqa 480(%rsp),%xmm4\nvpmuludq %xmm4,%xmm0,%xmm5\nmovdqa 464(%rsp),%xmm6\nvpmuludq %xmm6,%xmm0,%xmm7\nmovdqa 528(%rsp),%xmm8\nvpmuludq %xmm8,%xmm0,%xmm9\nvpmuludq 512(%rsp),%xmm0,%xmm10\nvpmuludq 592(%rsp),%xmm0,%xmm11\nvpmuludq 576(%rsp),%xmm0,%xmm12\nvpmuludq 624(%rsp),%xmm0,%xmm13\nmovdqa 672(%rsp),%xmm14\nvpmuludq %xmm14,%xmm0,%xmm0\nvpmuludq v38_38(%rip),%xmm14,%xmm15\nvpmuludq %xmm15,%xmm14,%xmm14\npaddq %xmm14,%xmm13\nvpaddq %xmm6,%xmm6,%xmm14\nvpmuludq %xmm14,%xmm6,%xmm6\npaddq %xmm6,%xmm11\nvpaddq %xmm2,%xmm2,%xmm6\nvpmuludq %xmm6,%xmm2,%xmm2\npaddq %xmm2,%xmm5\nvpmuludq %xmm15,%xmm6,%xmm2\npaddq %xmm2,%xmm1\nvpmuludq %xmm15,%xmm4,%xmm2\npaddq %xmm2,%xmm3\nvpmuludq 544(%rsp),%xmm6,%xmm2\npaddq %xmm2,%xmm11\nvpmuludq 592(%rsp),%xmm6,%xmm2\npaddq %xmm2,%xmm12\nvpmuludq 640(%rsp),%xmm6,%xmm2\npaddq %xmm2,%xmm13\nvpmuludq 624(%rsp),%xmm6,%xmm2\npaddq %xmm2,%xmm0\nvpmuludq %xmm4,%xmm6,%xmm2\npaddq %xmm2,%xmm7\nvpmuludq %xmm14,%xmm6,%xmm2\npaddq %xmm2,%xmm9\nvpmuludq %xmm8,%xmm6,%xmm2\npaddq %xmm2,%xmm10\nvpmuludq %xmm15,%xmm14,%xmm2\npaddq %xmm2,%xmm5\nvpmuludq %xmm15,%xmm8,%xmm2\npaddq %xmm2,%xmm7\nvpmuludq %xmm4,%xmm4,%xmm2\npaddq %xmm2,%xmm9\nvpmuludq %xmm14,%xmm4,%xmm2\npaddq %xmm2,%xmm10\nvpaddq %xmm4,%xmm4,%xmm2\nvpmuludq %xmm8,%xmm2,%xmm4\npaddq %xmm4,%xmm11\nvpmuludq 688(%rsp),%xmm2,%xmm4\npaddq %xmm4,%xmm1\nvpmuludq 688(%rsp),%xmm14,%xmm4\npaddq %xmm4,%xmm3\nvpmuludq 512(%rsp),%xmm2,%xmm4\npaddq %xmm4,%xmm12\nvpmuludq 592(%rsp),%xmm2,%xmm4\npaddq %xmm4,%xmm13\nvpmuludq 576(%rsp),%xmm2,%xmm2\npaddq %xmm2,%xmm0\nvpmuludq 656(%rsp),%xmm8,%xmm2\npaddq %xmm2,%xmm3\nvpmuludq %xmm8,%xmm14,%xmm2\npaddq %xmm2,%xmm12\nvpmuludq %xmm8,%xmm8,%xmm2\npaddq %xmm2,%xmm13\nvpaddq %xmm8,%xmm8,%xmm2\nvpmuludq 688(%rsp),%xmm2,%xmm4\npaddq %xmm4,%xmm5\nvpmuludq 544(%rsp),%xmm15,%xmm4\npaddq %xmm4,%xmm9\nvpmuludq 592(%rsp),%xmm15,%xmm4\npaddq %xmm4,%xmm10\nvpmuludq 656(%rsp),%xmm14,%xmm4\npaddq %xmm4,%xmm1\nmovdqa 544(%rsp),%xmm4\npmuludq 688(%rsp),%xmm4\npaddq %xmm4,%xmm7\nvpmuludq 544(%rsp),%xmm14,%xmm4\npaddq %xmm4,%xmm13\nvpmuludq 592(%rsp),%xmm14,%xmm4\npaddq %xmm4,%xmm0\nvpmuludq 640(%rsp),%xmm15,%xmm4\npaddq %xmm4,%xmm11\nvpmuludq 624(%rsp),%xmm15,%xmm4\npaddq %xmm4,%xmm12\nmovdqa 592(%rsp),%xmm4\npaddq %xmm4,%xmm4\npmuludq 688(%rsp),%xmm4\npaddq %xmm4,%xmm9\nvpmuludq 608(%rsp),%xmm2,%xmm4\npaddq %xmm4,%xmm1\nmovdqa 544(%rsp),%xmm4\npmuludq 608(%rsp),%xmm4\npaddq %xmm4,%xmm3\nmovdqa 544(%rsp),%xmm4\npmuludq 656(%rsp),%xmm4\npaddq %xmm4,%xmm5\nmovdqa 592(%rsp),%xmm4\npmuludq 656(%rsp),%xmm4\npaddq %xmm4,%xmm7\nmovdqa 640(%rsp),%xmm4\npmuludq 688(%rsp),%xmm4\npaddq %xmm4,%xmm10\nvpmuludq 512(%rsp),%xmm2,%xmm2\npaddq %xmm2,%xmm0\nmovdqa 560(%rsp),%xmm2\npmuludq 512(%rsp),%xmm2\npaddq %xmm2,%xmm1\nmovdqa 608(%rsp),%xmm2\npmuludq 592(%rsp),%xmm2\npaddq %xmm2,%xmm5\nmovdqa 656(%rsp),%xmm2\npmuludq 576(%rsp),%xmm2\npaddq %xmm2,%xmm9\nmovdqa 688(%rsp),%xmm2\npmuludq 624(%rsp),%xmm2\npaddq %xmm2,%xmm11\nvpsrlq $26,%xmm1,%xmm2\npaddq %xmm2,%xmm3\npand m26(%rip),%xmm1\nvpsrlq $25,%xmm10,%xmm2\npaddq %xmm2,%xmm11\npand m25(%rip),%xmm10\nvpsrlq $25,%xmm3,%xmm2\npaddq %xmm2,%xmm5\npand m25(%rip),%xmm3\nvpsrlq $26,%xmm11,%xmm2\npaddq %xmm2,%xmm12\npand m26(%rip),%xmm11\nvpsrlq $26,%xmm5,%xmm2\npaddq %xmm2,%xmm7\npand m26(%rip),%xmm5\nvpsrlq $25,%xmm12,%xmm2\npaddq %xmm2,%xmm13\npand m25(%rip),%xmm12\nvpsrlq $25,%xmm7,%xmm2\npaddq %xmm2,%xmm9\npand m25(%rip),%xmm7\nvpsrlq $26,%xmm13,%xmm2\npaddq %xmm2,%xmm0\npand m26(%rip),%xmm13\nvpsrlq $26,%xmm9,%xmm2\npaddq %xmm2,%xmm10\npand m26(%rip),%xmm9\nvpsrlq $25,%xmm0,%xmm2\nvpsllq $4,%xmm2,%xmm4\npaddq %xmm2,%xmm1\npsllq $1,%xmm2\npaddq %xmm2,%xmm4\npaddq %xmm4,%xmm1\npand m25(%rip),%xmm0\nvpsrlq $25,%xmm10,%xmm2\npaddq %xmm2,%xmm11\npand m25(%rip),%xmm10\nvpsrlq $26,%xmm1,%xmm2\npaddq %xmm2,%xmm3\npand m26(%rip),%xmm1\nvpunpckhqdq %xmm3,%xmm1,%xmm2\nvpunpcklqdq %xmm3,%xmm1,%xmm1\nmovdqa %xmm1,464(%rsp)\nvpaddq subc0(%rip),%xmm2,%xmm3\npsubq %xmm1,%xmm3\nvpunpckhqdq %xmm3,%xmm2,%xmm1\nvpunpcklqdq %xmm3,%xmm2,%xmm2\nmovdqa %xmm2,480(%rsp)\nmovdqa %xmm1,512(%rsp)\npsllq $1,%xmm1\nmovdqa %xmm1,528(%rsp)\npmuludq v121666_121666(%rip),%xmm3\nmovdqa 80(%rsp),%xmm1\nvpunpcklqdq %xmm1,%xmm3,%xmm2\nvpunpckhqdq %xmm1,%xmm3,%xmm1\nvpunpckhqdq %xmm7,%xmm5,%xmm3\nvpunpcklqdq %xmm7,%xmm5,%xmm4\nmovdqa %xmm4,544(%rsp)\nvpaddq subc2(%rip),%xmm3,%xmm5\npsubq %xmm4,%xmm5\nvpunpckhqdq %xmm5,%xmm3,%xmm4\nvpunpcklqdq %xmm5,%xmm3,%xmm3\nmovdqa %xmm3,560(%rsp)\nmovdqa %xmm4,576(%rsp)\npsllq $1,%xmm4\nmovdqa %xmm4,592(%rsp)\npmuludq v121666_121666(%rip),%xmm5\nmovdqa 96(%rsp),%xmm3\nvpunpcklqdq %xmm3,%xmm5,%xmm4\nvpunpckhqdq %xmm3,%xmm5,%xmm3\nvpunpckhqdq %xmm10,%xmm9,%xmm5\nvpunpcklqdq %xmm10,%xmm9,%xmm6\nmovdqa %xmm6,608(%rsp)\nvpaddq subc2(%rip),%xmm5,%xmm7\npsubq %xmm6,%xmm7\nvpunpckhqdq %xmm7,%xmm5,%xmm6\nvpunpcklqdq %xmm7,%xmm5,%xmm5\nmovdqa %xmm5,624(%rsp)\nmovdqa %xmm6,640(%rsp)\npsllq $1,%xmm6\nmovdqa %xmm6,656(%rsp)\npmuludq v121666_121666(%rip),%xmm7\nmovdqa 112(%rsp),%xmm5\nvpunpcklqdq %xmm5,%xmm7,%xmm6\nvpunpckhqdq %xmm5,%xmm7,%xmm5\nvpunpckhqdq %xmm12,%xmm11,%xmm7\nvpunpcklqdq %xmm12,%xmm11,%xmm8\nmovdqa %xmm8,672(%rsp)\nvpaddq subc2(%rip),%xmm7,%xmm9\npsubq %xmm8,%xmm9\nvpunpckhqdq %xmm9,%xmm7,%xmm8\nvpunpcklqdq %xmm9,%xmm7,%xmm7\nmovdqa %xmm7,688(%rsp)\nmovdqa %xmm8,704(%rsp)\npsllq $1,%xmm8\nmovdqa %xmm8,720(%rsp)\npmuludq v121666_121666(%rip),%xmm9\nmovdqa 448(%rsp),%xmm7\nvpunpcklqdq %xmm7,%xmm9,%xmm8\nvpunpckhqdq %xmm7,%xmm9,%xmm7\nvpunpckhqdq %xmm0,%xmm13,%xmm9\nvpunpcklqdq %xmm0,%xmm13,%xmm0\nmovdqa %xmm0,448(%rsp)\nvpaddq subc2(%rip),%xmm9,%xmm10\npsubq %xmm0,%xmm10\nvpunpckhqdq %xmm10,%xmm9,%xmm0\nvpunpcklqdq %xmm10,%xmm9,%xmm9\nmovdqa %xmm9,736(%rsp)\nmovdqa %xmm0,752(%rsp)\npsllq $1,%xmm0\nmovdqa %xmm0,768(%rsp)\npmuludq v121666_121666(%rip),%xmm10\nmovdqa 496(%rsp),%xmm0\nvpunpcklqdq %xmm0,%xmm10,%xmm9\nvpunpckhqdq %xmm0,%xmm10,%xmm0\nvpsrlq $26,%xmm2,%xmm10\npaddq %xmm10,%xmm1\npand m26(%rip),%xmm2\nvpsrlq $25,%xmm5,%xmm10\npaddq %xmm10,%xmm8\npand m25(%rip),%xmm5\nvpsrlq $25,%xmm1,%xmm10\npaddq %xmm10,%xmm4\npand m25(%rip),%xmm1\nvpsrlq $26,%xmm8,%xmm10\npaddq %xmm10,%xmm7\npand m26(%rip),%xmm8\nvpsrlq $26,%xmm4,%xmm10\npaddq %xmm10,%xmm3\npand m26(%rip),%xmm4\nvpsrlq $25,%xmm7,%xmm10\npaddq %xmm10,%xmm9\npand m25(%rip),%xmm7\nvpsrlq $25,%xmm3,%xmm10\npaddq %xmm10,%xmm6\npand m25(%rip),%xmm3\nvpsrlq $26,%xmm9,%xmm10\npaddq %xmm10,%xmm0\npand m26(%rip),%xmm9\nvpsrlq $26,%xmm6,%xmm10\npaddq %xmm10,%xmm5\npand m26(%rip),%xmm6\nvpsrlq $25,%xmm0,%xmm10\nvpsllq $4,%xmm10,%xmm11\npaddq %xmm10,%xmm2\npsllq $1,%xmm10\npaddq %xmm10,%xmm11\npaddq %xmm11,%xmm2\npand m25(%rip),%xmm0\nvpsrlq $25,%xmm5,%xmm10\npaddq %xmm10,%xmm8\npand m25(%rip),%xmm5\nvpsrlq $26,%xmm2,%xmm10\npaddq %xmm10,%xmm1\npand m26(%rip),%xmm2\nvpunpckhqdq %xmm1,%xmm2,%xmm10\nmovdqa %xmm10,80(%rsp)\nvpunpcklqdq %xmm1,%xmm2,%xmm1\nvpunpckhqdq %xmm3,%xmm4,%xmm2\nmovdqa %xmm2,96(%rsp)\nvpunpcklqdq %xmm3,%xmm4,%xmm2\nvpunpckhqdq %xmm5,%xmm6,%xmm3\nmovdqa %xmm3,112(%rsp)\nvpunpcklqdq %xmm5,%xmm6,%xmm3\nvpunpckhqdq %xmm7,%xmm8,%xmm4\nmovdqa %xmm4,128(%rsp)\nvpunpcklqdq %xmm7,%xmm8,%xmm4\nvpunpckhqdq %xmm0,%xmm9,%xmm5\nmovdqa %xmm5,144(%rsp)\nvpunpcklqdq %xmm0,%xmm9,%xmm0\nmovdqa 464(%rsp),%xmm5\npaddq %xmm5,%xmm1\nvpunpcklqdq %xmm1,%xmm5,%xmm6\nvpunpckhqdq %xmm1,%xmm5,%xmm1\nvpmuludq 512(%rsp),%xmm6,%xmm5\nvpmuludq 480(%rsp),%xmm1,%xmm7\npaddq %xmm7,%xmm5\nvpmuludq 560(%rsp),%xmm6,%xmm7\nvpmuludq 528(%rsp),%xmm1,%xmm8\npaddq %xmm8,%xmm7\nvpmuludq 576(%rsp),%xmm6,%xmm8\nvpmuludq 560(%rsp),%xmm1,%xmm9\npaddq %xmm9,%xmm8\nvpmuludq 624(%rsp),%xmm6,%xmm9\nvpmuludq 592(%rsp),%xmm1,%xmm10\npaddq %xmm10,%xmm9\nvpmuludq 640(%rsp),%xmm6,%xmm10\nvpmuludq 624(%rsp),%xmm1,%xmm11\npaddq %xmm11,%xmm10\nvpmuludq 688(%rsp),%xmm6,%xmm11\nvpmuludq 656(%rsp),%xmm1,%xmm12\npaddq %xmm12,%xmm11\nvpmuludq 704(%rsp),%xmm6,%xmm12\nvpmuludq 688(%rsp),%xmm1,%xmm13\npaddq %xmm13,%xmm12\nvpmuludq 736(%rsp),%xmm6,%xmm13\nvpmuludq 720(%rsp),%xmm1,%xmm14\npaddq %xmm14,%xmm13\nvpmuludq 752(%rsp),%xmm6,%xmm14\nvpmuludq 736(%rsp),%xmm1,%xmm15\npaddq %xmm15,%xmm14\nvpmuludq 480(%rsp),%xmm6,%xmm6\npmuludq v19_19(%rip),%xmm1\nvpmuludq 768(%rsp),%xmm1,%xmm1\npaddq %xmm1,%xmm6\nmovdqa 544(%rsp),%xmm1\npaddq %xmm1,%xmm2\nvpunpcklqdq %xmm2,%xmm1,%xmm15\nvpunpckhqdq %xmm2,%xmm1,%xmm1\nvpmuludq 480(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm7\nvpmuludq 512(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm8\nvpmuludq 560(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm9\nvpmuludq 576(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm10\nvpmuludq 624(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm11\nvpmuludq 640(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm12\nvpmuludq 688(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm13\nvpmuludq 704(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm14\npmuludq v19_19(%rip),%xmm15\nvpmuludq 736(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm6\npmuludq 752(%rsp),%xmm15\npaddq %xmm15,%xmm5\nvpmuludq 480(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm8\nvpmuludq 528(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm9\nvpmuludq 560(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm10\nvpmuludq 592(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm11\nvpmuludq 624(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm12\nvpmuludq 656(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm13\nvpmuludq 688(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm14\npmuludq v19_19(%rip),%xmm1\nvpmuludq 720(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm6\nvpmuludq 736(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm5\npmuludq 768(%rsp),%xmm1\npaddq %xmm1,%xmm7\nmovdqa 608(%rsp),%xmm1\npaddq %xmm1,%xmm3\nvpunpcklqdq %xmm3,%xmm1,%xmm2\nvpunpckhqdq %xmm3,%xmm1,%xmm1\nvpmuludq 480(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm9\nvpmuludq 512(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm10\nvpmuludq 560(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm11\nvpmuludq 576(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm12\nvpmuludq 624(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm13\nvpmuludq 640(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm14\npmuludq v19_19(%rip),%xmm2\nvpmuludq 688(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm6\nvpmuludq 704(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm5\nvpmuludq 736(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm7\npmuludq 752(%rsp),%xmm2\npaddq %xmm2,%xmm8\nvpmuludq 480(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm10\nvpmuludq 528(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm11\nvpmuludq 560(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm12\nvpmuludq 592(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm13\nvpmuludq 624(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm14\npmuludq v19_19(%rip),%xmm1\nvpmuludq 656(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm6\nvpmuludq 688(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm5\nvpmuludq 720(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm7\nvpmuludq 736(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm8\npmuludq 768(%rsp),%xmm1\npaddq %xmm1,%xmm9\nmovdqa 672(%rsp),%xmm1\npaddq %xmm1,%xmm4\nvpunpcklqdq %xmm4,%xmm1,%xmm2\nvpunpckhqdq %xmm4,%xmm1,%xmm1\nvpmuludq 480(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm11\nvpmuludq 512(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm12\nvpmuludq 560(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm13\nvpmuludq 576(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm14\npmuludq v19_19(%rip),%xmm2\nvpmuludq 624(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm6\nvpmuludq 640(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm5\nvpmuludq 688(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm7\nvpmuludq 704(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm8\nvpmuludq 736(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm9\npmuludq 752(%rsp),%xmm2\npaddq %xmm2,%xmm10\nvpmuludq 480(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm12\nvpmuludq 528(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm13\nvpmuludq 560(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm14\npmuludq v19_19(%rip),%xmm1\nvpmuludq 592(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm6\nvpmuludq 624(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm5\nvpmuludq 656(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm7\nvpmuludq 688(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm8\nvpmuludq 720(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm9\nvpmuludq 736(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm10\npmuludq 768(%rsp),%xmm1\npaddq %xmm1,%xmm11\nmovdqa 448(%rsp),%xmm1\npaddq %xmm1,%xmm0\nvpunpcklqdq %xmm0,%xmm1,%xmm2\nvpunpckhqdq %xmm0,%xmm1,%xmm0\nvpmuludq 480(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm13\nvpmuludq 512(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm14\npmuludq v19_19(%rip),%xmm2\nvpmuludq 560(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm6\nvpmuludq 576(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm5\nvpmuludq 624(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm7\nvpmuludq 640(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm8\nvpmuludq 688(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm9\nvpmuludq 704(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm10\nvpmuludq 736(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm11\npmuludq 752(%rsp),%xmm2\npaddq %xmm2,%xmm12\nvpmuludq 480(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm14\npmuludq v19_19(%rip),%xmm0\nvpmuludq 528(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm6\nvpmuludq 560(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm5\nvpmuludq 592(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm7\nvpmuludq 624(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm8\nvpmuludq 656(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm9\nvpmuludq 688(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm10\nvpmuludq 720(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm11\nvpmuludq 736(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm12\npmuludq 768(%rsp),%xmm0\npaddq %xmm0,%xmm13\nvpsrlq $26,%xmm6,%xmm0\npaddq %xmm0,%xmm5\npand m26(%rip),%xmm6\nvpsrlq $25,%xmm10,%xmm0\npaddq %xmm0,%xmm11\npand m25(%rip),%xmm10\nvpsrlq $25,%xmm5,%xmm0\npaddq %xmm0,%xmm7\npand m25(%rip),%xmm5\nvpsrlq $26,%xmm11,%xmm0\npaddq %xmm0,%xmm12\npand m26(%rip),%xmm11\nvpsrlq $26,%xmm7,%xmm0\npaddq %xmm0,%xmm8\npand m26(%rip),%xmm7\nvpsrlq $25,%xmm12,%xmm0\npaddq %xmm0,%xmm13\npand m25(%rip),%xmm12\nvpsrlq $25,%xmm8,%xmm0\npaddq %xmm0,%xmm9\npand m25(%rip),%xmm8\nvpsrlq $26,%xmm13,%xmm0\npaddq %xmm0,%xmm14\npand m26(%rip),%xmm13\nvpsrlq $26,%xmm9,%xmm0\npaddq %xmm0,%xmm10\npand m26(%rip),%xmm9\nvpsrlq $25,%xmm14,%xmm0\nvpsllq $4,%xmm0,%xmm1\npaddq %xmm0,%xmm6\npsllq $1,%xmm0\npaddq %xmm0,%xmm1\npaddq %xmm1,%xmm6\npand m25(%rip),%xmm14\nvpsrlq $25,%xmm10,%xmm0\npaddq %xmm0,%xmm11\npand m25(%rip),%xmm10\nvpsrlq $26,%xmm6,%xmm0\npaddq %xmm0,%xmm5\npand m26(%rip),%xmm6\nvpunpckhqdq %xmm5,%xmm6,%xmm1\nvpunpcklqdq %xmm5,%xmm6,%xmm0\nvpunpckhqdq %xmm8,%xmm7,%xmm3\nvpunpcklqdq %xmm8,%xmm7,%xmm2\nvpunpckhqdq %xmm10,%xmm9,%xmm5\nvpunpcklqdq %xmm10,%xmm9,%xmm4\nvpunpckhqdq %xmm12,%xmm11,%xmm7\nvpunpcklqdq %xmm12,%xmm11,%xmm6\nvpunpckhqdq %xmm14,%xmm13,%xmm9\nvpunpcklqdq %xmm14,%xmm13,%xmm8\ncmp  $0,%rdx\njne ._ladder_loop\nmovdqu   %xmm1,160(%rdi)\nmovdqu   %xmm0,80(%rdi)\nmovdqu   %xmm3,176(%rdi)\nmovdqu   %xmm2,96(%rdi)\nmovdqu   %xmm5,192(%rdi)\nmovdqu   %xmm4,112(%rdi)\nmovdqu   %xmm7,208(%rdi)\nmovdqu   %xmm6,128(%rdi)\nmovdqu   %xmm9,224(%rdi)\nmovdqu   %xmm8,144(%rdi)\nmovq 1824(%rsp),%r11\nmovq 1832(%rsp),%r12\nmovq 1840(%rsp),%r13\nmovq 1848(%rsp),%r14\nadd %r11,%rsp\nret\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/ladder.h",
    "content": "#ifndef ladder_H\n#define ladder_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"fe.h\"\n#include \"ladder_namespace.h\"\n\nextern void ladder(fe *, const unsigned char *);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif //ifndef ladder_H\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/ladder_base.S",
    "content": "#ifdef IN_SANDY2X\n\n#include \"ladder_base_namespace.h\"\n#include \"consts_namespace.h\"\n.p2align 5\n\n.globl ladder_base\n.globl _ladder_base\n#ifdef __ELF__\n.type  ladder_base, @function\n.type _ladder_base, @function\n#endif\nladder_base:\n_ladder_base:\n\nmov %rsp,%r11\nand $31,%r11\nadd $1568,%r11\nsub %r11,%rsp\nmovq %r11,1536(%rsp)\nmovq %r12,1544(%rsp)\nmovq %r13,1552(%rsp)\nmovdqa v0_0(%rip),%xmm0\nmovdqa v1_0(%rip),%xmm1\nmovdqa v9_0(%rip),%xmm2\nmovdqa %xmm2,0(%rsp)\nmovdqa %xmm0,16(%rsp)\nmovdqa %xmm0,32(%rsp)\nmovdqa %xmm0,48(%rsp)\nmovdqa %xmm0,64(%rsp)\nmovdqa %xmm1,80(%rsp)\nmovdqa %xmm0,96(%rsp)\nmovdqa %xmm0,112(%rsp)\nmovdqa %xmm0,128(%rsp)\nmovdqa %xmm0,144(%rsp)\nmovdqa %xmm1,%xmm0\npxor %xmm1,%xmm1\npxor %xmm2,%xmm2\npxor %xmm3,%xmm3\npxor %xmm4,%xmm4\npxor %xmm5,%xmm5\npxor %xmm6,%xmm6\npxor %xmm7,%xmm7\npxor %xmm8,%xmm8\npxor %xmm9,%xmm9\nmovq   0(%rsi),%rdx\nmovq   8(%rsi),%rcx\nmovq   16(%rsi),%r8\nmovq   24(%rsi),%r9\nshrd $1,%rcx,%rdx\nshrd $1,%r8,%rcx\nshrd $1,%r9,%r8\nshr  $1,%r9\nxorq 0(%rsi),%rdx\nxorq 8(%rsi),%rcx\nxorq 16(%rsi),%r8\nxorq 24(%rsi),%r9\nleaq 512(%rsp),%rsi\nmov  $64,%rax\n._ladder_base_small_loop:\nmov  %rdx,%r10\nmov  %rcx,%r11\nmov  %r8,%r12\nmov  %r9,%r13\nshr  $1,%rdx\nshr  $1,%rcx\nshr  $1,%r8\nshr  $1,%r9\nand  $1,%r10d\nand  $1,%r11d\nand  $1,%r12d\nand  $1,%r13d\nneg  %r10\nneg  %r11\nneg  %r12\nneg  %r13\nmovl   %r10d,0(%rsi)\nmovl   %r11d,256(%rsi)\nmovl   %r12d,512(%rsi)\nmovl   %r13d,768(%rsi)\nadd  $4,%rsi\nsub  $1,%rax\njne ._ladder_base_small_loop\nmov  $255,%rdx\nadd  $760,%rsi\n._ladder_base_loop:\nsub  $1,%rdx\nvbroadcastss 0(%rsi),%xmm10\nsub  $4,%rsi\nmovdqa 0(%rsp),%xmm11\nmovdqa 80(%rsp),%xmm12\nvpxor %xmm11,%xmm0,%xmm13\npand %xmm10,%xmm13\npxor %xmm13,%xmm0\npxor %xmm13,%xmm11\nvpxor %xmm12,%xmm1,%xmm13\npand %xmm10,%xmm13\npxor %xmm13,%xmm1\npxor %xmm13,%xmm12\nmovdqa 16(%rsp),%xmm13\nmovdqa 96(%rsp),%xmm14\nvpxor %xmm13,%xmm2,%xmm15\npand %xmm10,%xmm15\npxor %xmm15,%xmm2\npxor %xmm15,%xmm13\nvpxor %xmm14,%xmm3,%xmm15\npand %xmm10,%xmm15\npxor %xmm15,%xmm3\npxor %xmm15,%xmm14\nmovdqa %xmm13,0(%rsp)\nmovdqa %xmm14,16(%rsp)\nmovdqa 32(%rsp),%xmm13\nmovdqa 112(%rsp),%xmm14\nvpxor %xmm13,%xmm4,%xmm15\npand %xmm10,%xmm15\npxor %xmm15,%xmm4\npxor %xmm15,%xmm13\nvpxor %xmm14,%xmm5,%xmm15\npand %xmm10,%xmm15\npxor %xmm15,%xmm5\npxor %xmm15,%xmm14\nmovdqa %xmm13,32(%rsp)\nmovdqa %xmm14,80(%rsp)\nmovdqa 48(%rsp),%xmm13\nmovdqa 128(%rsp),%xmm14\nvpxor %xmm13,%xmm6,%xmm15\npand %xmm10,%xmm15\npxor %xmm15,%xmm6\npxor %xmm15,%xmm13\nvpxor %xmm14,%xmm7,%xmm15\npand %xmm10,%xmm15\npxor %xmm15,%xmm7\npxor %xmm15,%xmm14\nmovdqa %xmm13,48(%rsp)\nmovdqa %xmm14,96(%rsp)\nmovdqa 64(%rsp),%xmm13\nmovdqa 144(%rsp),%xmm14\nvpxor %xmm13,%xmm8,%xmm15\npand %xmm10,%xmm15\npxor %xmm15,%xmm8\npxor %xmm15,%xmm13\nvpxor %xmm14,%xmm9,%xmm15\npand %xmm10,%xmm15\npxor %xmm15,%xmm9\npxor %xmm15,%xmm14\nmovdqa %xmm13,64(%rsp)\nmovdqa %xmm14,112(%rsp)\nvpaddq subc0(%rip),%xmm11,%xmm10\npsubq %xmm12,%xmm10\npaddq %xmm12,%xmm11\nvpunpckhqdq %xmm10,%xmm11,%xmm12\nvpunpcklqdq %xmm10,%xmm11,%xmm10\nvpaddq %xmm1,%xmm0,%xmm11\npaddq subc0(%rip),%xmm0\npsubq %xmm1,%xmm0\nvpunpckhqdq %xmm11,%xmm0,%xmm1\nvpunpcklqdq %xmm11,%xmm0,%xmm0\nvpmuludq %xmm0,%xmm10,%xmm11\nvpmuludq %xmm1,%xmm10,%xmm13\nmovdqa %xmm1,128(%rsp)\npaddq %xmm1,%xmm1\nvpmuludq %xmm0,%xmm12,%xmm14\nmovdqa %xmm0,144(%rsp)\npaddq %xmm14,%xmm13\nvpmuludq %xmm1,%xmm12,%xmm0\nmovdqa %xmm1,160(%rsp)\nvpaddq %xmm3,%xmm2,%xmm1\npaddq subc2(%rip),%xmm2\npsubq %xmm3,%xmm2\nvpunpckhqdq %xmm1,%xmm2,%xmm3\nvpunpcklqdq %xmm1,%xmm2,%xmm1\nvpmuludq %xmm1,%xmm10,%xmm2\npaddq %xmm2,%xmm0\nvpmuludq %xmm3,%xmm10,%xmm2\nmovdqa %xmm3,176(%rsp)\npaddq %xmm3,%xmm3\nvpmuludq %xmm1,%xmm12,%xmm14\nmovdqa %xmm1,192(%rsp)\npaddq %xmm14,%xmm2\nvpmuludq %xmm3,%xmm12,%xmm1\nmovdqa %xmm3,208(%rsp)\nvpaddq %xmm5,%xmm4,%xmm3\npaddq subc2(%rip),%xmm4\npsubq %xmm5,%xmm4\nvpunpckhqdq %xmm3,%xmm4,%xmm5\nvpunpcklqdq %xmm3,%xmm4,%xmm3\nvpmuludq %xmm3,%xmm10,%xmm4\npaddq %xmm4,%xmm1\nvpmuludq %xmm5,%xmm10,%xmm4\nmovdqa %xmm5,224(%rsp)\npaddq %xmm5,%xmm5\nvpmuludq %xmm3,%xmm12,%xmm14\nmovdqa %xmm3,240(%rsp)\npaddq %xmm14,%xmm4\nvpaddq %xmm7,%xmm6,%xmm3\npaddq subc2(%rip),%xmm6\npsubq %xmm7,%xmm6\nvpunpckhqdq %xmm3,%xmm6,%xmm7\nvpunpcklqdq %xmm3,%xmm6,%xmm3\nvpmuludq %xmm3,%xmm10,%xmm6\nvpmuludq %xmm5,%xmm12,%xmm14\nmovdqa %xmm5,256(%rsp)\npmuludq v19_19(%rip),%xmm5\nmovdqa %xmm5,272(%rsp)\npaddq %xmm14,%xmm6\nvpmuludq %xmm7,%xmm10,%xmm5\nmovdqa %xmm7,288(%rsp)\npaddq %xmm7,%xmm7\nvpmuludq %xmm3,%xmm12,%xmm14\nmovdqa %xmm3,304(%rsp)\npaddq %xmm14,%xmm5\npmuludq v19_19(%rip),%xmm3\nmovdqa %xmm3,320(%rsp)\nvpaddq %xmm9,%xmm8,%xmm3\npaddq subc2(%rip),%xmm8\npsubq %xmm9,%xmm8\nvpunpckhqdq %xmm3,%xmm8,%xmm9\nvpunpcklqdq %xmm3,%xmm8,%xmm3\nmovdqa %xmm3,336(%rsp)\nvpmuludq %xmm7,%xmm12,%xmm8\nmovdqa %xmm7,352(%rsp)\npmuludq v19_19(%rip),%xmm7\nmovdqa %xmm7,368(%rsp)\nvpmuludq %xmm3,%xmm10,%xmm7\npaddq %xmm7,%xmm8\nvpmuludq %xmm9,%xmm10,%xmm7\nmovdqa %xmm9,384(%rsp)\npaddq %xmm9,%xmm9\nvpmuludq %xmm3,%xmm12,%xmm10\npaddq %xmm10,%xmm7\npmuludq v19_19(%rip),%xmm3\nmovdqa %xmm3,400(%rsp)\npmuludq v19_19(%rip),%xmm12\nvpmuludq %xmm9,%xmm12,%xmm3\nmovdqa %xmm9,416(%rsp)\npaddq %xmm3,%xmm11\nmovdqa 0(%rsp),%xmm3\nmovdqa 16(%rsp),%xmm9\nvpaddq subc2(%rip),%xmm3,%xmm10\npsubq %xmm9,%xmm10\npaddq %xmm9,%xmm3\nvpunpckhqdq %xmm10,%xmm3,%xmm9\nvpunpcklqdq %xmm10,%xmm3,%xmm3\nvpmuludq 144(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm0\nvpmuludq 128(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm2\nvpmuludq 192(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm1\nvpmuludq 176(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm4\nvpmuludq 240(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm6\nvpmuludq 224(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm5\nvpmuludq 304(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm8\nvpmuludq 288(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm7\npmuludq v19_19(%rip),%xmm3\nvpmuludq 336(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm11\npmuludq 384(%rsp),%xmm3\npaddq %xmm3,%xmm13\nvpmuludq 144(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm2\nvpmuludq 160(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm1\nvpmuludq 192(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm4\nvpmuludq 208(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm6\nvpmuludq 240(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm5\nvpmuludq 256(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm8\nvpmuludq 304(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm7\npmuludq v19_19(%rip),%xmm9\nvpmuludq 352(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm11\nvpmuludq 336(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm13\npmuludq 416(%rsp),%xmm9\npaddq %xmm9,%xmm0\nmovdqa 32(%rsp),%xmm3\nmovdqa 80(%rsp),%xmm9\nvpaddq subc2(%rip),%xmm3,%xmm10\npsubq %xmm9,%xmm10\npaddq %xmm9,%xmm3\nvpunpckhqdq %xmm10,%xmm3,%xmm9\nvpunpcklqdq %xmm10,%xmm3,%xmm3\nvpmuludq 144(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm1\nvpmuludq 128(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm4\nvpmuludq 192(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm6\nvpmuludq 176(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm5\nvpmuludq 240(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm8\nvpmuludq 224(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm7\npmuludq v19_19(%rip),%xmm3\nvpmuludq 304(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm11\nvpmuludq 288(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm13\nvpmuludq 336(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm0\npmuludq 384(%rsp),%xmm3\npaddq %xmm3,%xmm2\nvpmuludq 144(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm4\nvpmuludq 160(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm6\nvpmuludq 192(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm5\nvpmuludq 208(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm8\nvpmuludq 240(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm7\npmuludq v19_19(%rip),%xmm9\nvpmuludq 256(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm11\nvpmuludq 304(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm13\nvpmuludq 352(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm0\nvpmuludq 336(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm2\npmuludq 416(%rsp),%xmm9\npaddq %xmm9,%xmm1\nmovdqa 48(%rsp),%xmm3\nmovdqa 96(%rsp),%xmm9\nvpaddq subc2(%rip),%xmm3,%xmm10\npsubq %xmm9,%xmm10\npaddq %xmm9,%xmm3\nvpunpckhqdq %xmm10,%xmm3,%xmm9\nvpunpcklqdq %xmm10,%xmm3,%xmm3\nvpmuludq 144(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm6\nvpmuludq 128(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm5\nvpmuludq 192(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm8\nvpmuludq 176(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm7\npmuludq v19_19(%rip),%xmm3\nvpmuludq 240(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm11\nvpmuludq 224(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm13\nvpmuludq 304(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm0\nvpmuludq 288(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm2\nvpmuludq 336(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm1\npmuludq 384(%rsp),%xmm3\npaddq %xmm3,%xmm4\nvpmuludq 144(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm5\nvpmuludq 160(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm8\nvpmuludq 192(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm7\npmuludq v19_19(%rip),%xmm9\nvpmuludq 208(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm11\nvpmuludq 240(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm13\nvpmuludq 256(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm0\nvpmuludq 304(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm2\nvpmuludq 352(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm1\nvpmuludq 336(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm4\npmuludq 416(%rsp),%xmm9\npaddq %xmm9,%xmm6\nmovdqa 64(%rsp),%xmm3\nmovdqa 112(%rsp),%xmm9\nvpaddq subc2(%rip),%xmm3,%xmm10\npsubq %xmm9,%xmm10\npaddq %xmm9,%xmm3\nvpunpckhqdq %xmm10,%xmm3,%xmm9\nvpunpcklqdq %xmm10,%xmm3,%xmm3\nvpmuludq 144(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm8\nvpmuludq 128(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm7\npmuludq v19_19(%rip),%xmm3\nvpmuludq 192(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm11\nvpmuludq 176(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm13\nvpmuludq 240(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm0\nvpmuludq 224(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm2\nvpmuludq 304(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm1\nvpmuludq 288(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm4\nvpmuludq 336(%rsp),%xmm3,%xmm10\npaddq %xmm10,%xmm6\npmuludq 384(%rsp),%xmm3\npaddq %xmm3,%xmm5\nvpmuludq 144(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm7\npmuludq v19_19(%rip),%xmm9\nvpmuludq 160(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm11\nvpmuludq 192(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm13\nvpmuludq 208(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm0\nvpmuludq 240(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm2\nvpmuludq 256(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm1\nvpmuludq 304(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm4\nvpmuludq 352(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm6\nvpmuludq 336(%rsp),%xmm9,%xmm3\npaddq %xmm3,%xmm5\npmuludq 416(%rsp),%xmm9\npaddq %xmm9,%xmm8\nvpsrlq $25,%xmm4,%xmm3\npaddq %xmm3,%xmm6\npand m25(%rip),%xmm4\nvpsrlq $26,%xmm11,%xmm3\npaddq %xmm3,%xmm13\npand m26(%rip),%xmm11\nvpsrlq $26,%xmm6,%xmm3\npaddq %xmm3,%xmm5\npand m26(%rip),%xmm6\nvpsrlq $25,%xmm13,%xmm3\npaddq %xmm3,%xmm0\npand m25(%rip),%xmm13\nvpsrlq $25,%xmm5,%xmm3\npaddq %xmm3,%xmm8\npand m25(%rip),%xmm5\nvpsrlq $26,%xmm0,%xmm3\npaddq %xmm3,%xmm2\npand m26(%rip),%xmm0\nvpsrlq $26,%xmm8,%xmm3\npaddq %xmm3,%xmm7\npand m26(%rip),%xmm8\nvpsrlq $25,%xmm2,%xmm3\npaddq %xmm3,%xmm1\npand m25(%rip),%xmm2\nvpsrlq $25,%xmm7,%xmm3\nvpsllq $4,%xmm3,%xmm9\npaddq %xmm3,%xmm11\npsllq $1,%xmm3\npaddq %xmm3,%xmm9\npaddq %xmm9,%xmm11\npand m25(%rip),%xmm7\nvpsrlq $26,%xmm1,%xmm3\npaddq %xmm3,%xmm4\npand m26(%rip),%xmm1\nvpsrlq $26,%xmm11,%xmm3\npaddq %xmm3,%xmm13\npand m26(%rip),%xmm11\nvpsrlq $25,%xmm4,%xmm3\npaddq %xmm3,%xmm6\npand m25(%rip),%xmm4\nvpunpcklqdq %xmm13,%xmm11,%xmm3\nvpunpckhqdq %xmm13,%xmm11,%xmm9\nvpaddq subc0(%rip),%xmm9,%xmm10\npsubq %xmm3,%xmm10\npaddq %xmm9,%xmm3\nvpunpckhqdq %xmm3,%xmm10,%xmm9\npunpcklqdq %xmm3,%xmm10\nvpmuludq %xmm10,%xmm10,%xmm3\npaddq %xmm10,%xmm10\nvpmuludq %xmm9,%xmm10,%xmm11\nvpunpcklqdq %xmm2,%xmm0,%xmm12\nvpunpckhqdq %xmm2,%xmm0,%xmm0\nvpaddq subc2(%rip),%xmm0,%xmm2\npsubq %xmm12,%xmm2\npaddq %xmm0,%xmm12\nvpunpckhqdq %xmm12,%xmm2,%xmm0\npunpcklqdq %xmm12,%xmm2\nvpmuludq %xmm2,%xmm10,%xmm12\nvpaddq %xmm9,%xmm9,%xmm13\nvpmuludq %xmm13,%xmm9,%xmm9\npaddq %xmm9,%xmm12\nvpmuludq %xmm0,%xmm10,%xmm9\nvpmuludq %xmm2,%xmm13,%xmm14\npaddq %xmm14,%xmm9\nvpunpcklqdq %xmm4,%xmm1,%xmm14\nvpunpckhqdq %xmm4,%xmm1,%xmm1\nvpaddq subc2(%rip),%xmm1,%xmm4\npsubq %xmm14,%xmm4\npaddq %xmm1,%xmm14\nvpunpckhqdq %xmm14,%xmm4,%xmm1\npunpcklqdq %xmm14,%xmm4\nmovdqa %xmm1,0(%rsp)\npaddq %xmm1,%xmm1\nmovdqa %xmm1,16(%rsp)\npmuludq v19_19(%rip),%xmm1\nmovdqa %xmm1,32(%rsp)\nvpmuludq %xmm4,%xmm10,%xmm1\nvpmuludq %xmm2,%xmm2,%xmm14\npaddq %xmm14,%xmm1\nvpmuludq 0(%rsp),%xmm10,%xmm14\nvpmuludq %xmm4,%xmm13,%xmm15\npaddq %xmm15,%xmm14\nvpunpcklqdq %xmm5,%xmm6,%xmm15\nvpunpckhqdq %xmm5,%xmm6,%xmm5\nvpaddq subc2(%rip),%xmm5,%xmm6\npsubq %xmm15,%xmm6\npaddq %xmm5,%xmm15\nvpunpckhqdq %xmm15,%xmm6,%xmm5\npunpcklqdq %xmm15,%xmm6\nmovdqa %xmm6,48(%rsp)\npmuludq v19_19(%rip),%xmm6\nmovdqa %xmm6,64(%rsp)\nmovdqa %xmm5,80(%rsp)\npmuludq v38_38(%rip),%xmm5\nmovdqa %xmm5,96(%rsp)\nvpmuludq 48(%rsp),%xmm10,%xmm5\nvpaddq %xmm0,%xmm0,%xmm6\nvpmuludq %xmm6,%xmm0,%xmm0\npaddq %xmm0,%xmm5\nvpmuludq 80(%rsp),%xmm10,%xmm0\nvpmuludq %xmm4,%xmm6,%xmm15\npaddq %xmm15,%xmm0\nvpmuludq %xmm6,%xmm13,%xmm15\npaddq %xmm15,%xmm1\nvpmuludq %xmm6,%xmm2,%xmm15\npaddq %xmm15,%xmm14\nvpunpcklqdq %xmm7,%xmm8,%xmm15\nvpunpckhqdq %xmm7,%xmm8,%xmm7\nvpaddq subc2(%rip),%xmm7,%xmm8\npsubq %xmm15,%xmm8\npaddq %xmm7,%xmm15\nvpunpckhqdq %xmm15,%xmm8,%xmm7\npunpcklqdq %xmm15,%xmm8\nmovdqa %xmm8,112(%rsp)\npmuludq v19_19(%rip),%xmm8\nmovdqa %xmm8,160(%rsp)\nvpmuludq 112(%rsp),%xmm10,%xmm8\nvpmuludq %xmm7,%xmm10,%xmm10\nvpmuludq v38_38(%rip),%xmm7,%xmm15\nvpmuludq %xmm15,%xmm7,%xmm7\npaddq %xmm7,%xmm8\nvpmuludq %xmm15,%xmm13,%xmm7\npaddq %xmm7,%xmm3\nvpmuludq %xmm15,%xmm2,%xmm7\npaddq %xmm7,%xmm11\nvpmuludq 80(%rsp),%xmm13,%xmm7\npaddq %xmm7,%xmm7\npaddq %xmm7,%xmm8\nvpmuludq 16(%rsp),%xmm13,%xmm7\npaddq %xmm7,%xmm5\nvpmuludq 48(%rsp),%xmm13,%xmm7\npaddq %xmm7,%xmm0\nvpmuludq 112(%rsp),%xmm13,%xmm7\npaddq %xmm7,%xmm10\nvpmuludq %xmm15,%xmm6,%xmm7\npaddq %xmm7,%xmm12\nvpmuludq %xmm15,%xmm4,%xmm7\npaddq %xmm7,%xmm9\nvpaddq %xmm2,%xmm2,%xmm2\nvpmuludq %xmm4,%xmm2,%xmm7\npaddq %xmm7,%xmm5\nvpmuludq 160(%rsp),%xmm2,%xmm7\npaddq %xmm7,%xmm3\nvpmuludq 160(%rsp),%xmm6,%xmm7\npaddq %xmm7,%xmm11\nvpmuludq 0(%rsp),%xmm2,%xmm7\npaddq %xmm7,%xmm0\nvpmuludq 48(%rsp),%xmm2,%xmm7\npaddq %xmm7,%xmm8\nvpmuludq 80(%rsp),%xmm2,%xmm2\npaddq %xmm2,%xmm10\nvpmuludq 96(%rsp),%xmm4,%xmm2\npaddq %xmm2,%xmm11\nvpmuludq %xmm4,%xmm4,%xmm2\npaddq %xmm2,%xmm8\nvpaddq %xmm4,%xmm4,%xmm2\nvpmuludq 160(%rsp),%xmm2,%xmm4\npaddq %xmm4,%xmm12\nvpmuludq 16(%rsp),%xmm15,%xmm4\npaddq %xmm4,%xmm1\nvpmuludq 48(%rsp),%xmm15,%xmm4\npaddq %xmm4,%xmm14\nvpmuludq 96(%rsp),%xmm6,%xmm4\npaddq %xmm4,%xmm3\nmovdqa 16(%rsp),%xmm4\npmuludq 160(%rsp),%xmm4\npaddq %xmm4,%xmm9\nvpmuludq 16(%rsp),%xmm6,%xmm4\npaddq %xmm4,%xmm8\nvpmuludq 48(%rsp),%xmm6,%xmm4\npaddq %xmm4,%xmm10\nvpmuludq 80(%rsp),%xmm15,%xmm4\npaddq %xmm4,%xmm4\npaddq %xmm4,%xmm5\nvpmuludq 112(%rsp),%xmm15,%xmm4\npaddq %xmm4,%xmm0\nmovdqa 48(%rsp),%xmm4\npaddq %xmm4,%xmm4\npmuludq 160(%rsp),%xmm4\npaddq %xmm4,%xmm1\nmovdqa 80(%rsp),%xmm4\npaddq %xmm4,%xmm4\npmuludq 160(%rsp),%xmm4\npaddq %xmm4,%xmm14\nvpmuludq 64(%rsp),%xmm2,%xmm4\npaddq %xmm4,%xmm3\nmovdqa 16(%rsp),%xmm4\npmuludq 64(%rsp),%xmm4\npaddq %xmm4,%xmm11\nmovdqa 16(%rsp),%xmm4\npmuludq 96(%rsp),%xmm4\npaddq %xmm4,%xmm12\nmovdqa 48(%rsp),%xmm4\npmuludq 96(%rsp),%xmm4\npaddq %xmm4,%xmm9\nvpmuludq 0(%rsp),%xmm2,%xmm2\npaddq %xmm2,%xmm10\nmovdqa 32(%rsp),%xmm2\npmuludq 0(%rsp),%xmm2\npaddq %xmm2,%xmm3\nmovdqa 64(%rsp),%xmm2\npmuludq 48(%rsp),%xmm2\npaddq %xmm2,%xmm12\nmovdqa 96(%rsp),%xmm2\npmuludq 80(%rsp),%xmm2\npaddq %xmm2,%xmm1\nmovdqa 160(%rsp),%xmm2\npmuludq 112(%rsp),%xmm2\npaddq %xmm2,%xmm5\nvpsrlq $26,%xmm3,%xmm2\npaddq %xmm2,%xmm11\npand m26(%rip),%xmm3\nvpsrlq $25,%xmm14,%xmm2\npaddq %xmm2,%xmm5\npand m25(%rip),%xmm14\nvpsrlq $25,%xmm11,%xmm2\npaddq %xmm2,%xmm12\npand m25(%rip),%xmm11\nvpsrlq $26,%xmm5,%xmm2\npaddq %xmm2,%xmm0\npand m26(%rip),%xmm5\nvpsrlq $26,%xmm12,%xmm2\npaddq %xmm2,%xmm9\npand m26(%rip),%xmm12\nvpsrlq $25,%xmm0,%xmm2\npaddq %xmm2,%xmm8\npand m25(%rip),%xmm0\nvpsrlq $25,%xmm9,%xmm2\npaddq %xmm2,%xmm1\npand m25(%rip),%xmm9\nvpsrlq $26,%xmm8,%xmm2\npaddq %xmm2,%xmm10\npand m26(%rip),%xmm8\nvpsrlq $26,%xmm1,%xmm2\npaddq %xmm2,%xmm14\npand m26(%rip),%xmm1\nvpsrlq $25,%xmm10,%xmm2\nvpsllq $4,%xmm2,%xmm4\npaddq %xmm2,%xmm3\npsllq $1,%xmm2\npaddq %xmm2,%xmm4\npaddq %xmm4,%xmm3\npand m25(%rip),%xmm10\nvpsrlq $25,%xmm14,%xmm2\npaddq %xmm2,%xmm5\npand m25(%rip),%xmm14\nvpsrlq $26,%xmm3,%xmm2\npaddq %xmm2,%xmm11\npand m26(%rip),%xmm3\nvpunpckhqdq %xmm11,%xmm3,%xmm2\nmovdqa %xmm2,0(%rsp)\nvpunpcklqdq %xmm11,%xmm3,%xmm2\npmuludq v9_9(%rip),%xmm2\nmovdqa %xmm2,80(%rsp)\nvpunpckhqdq %xmm9,%xmm12,%xmm2\nmovdqa %xmm2,16(%rsp)\nvpunpcklqdq %xmm9,%xmm12,%xmm2\npmuludq v9_9(%rip),%xmm2\nmovdqa %xmm2,96(%rsp)\nvpunpckhqdq %xmm14,%xmm1,%xmm2\nmovdqa %xmm2,32(%rsp)\nvpunpcklqdq %xmm14,%xmm1,%xmm1\npmuludq v9_9(%rip),%xmm1\nmovdqa %xmm1,112(%rsp)\nvpunpckhqdq %xmm0,%xmm5,%xmm1\nmovdqa %xmm1,48(%rsp)\nvpunpcklqdq %xmm0,%xmm5,%xmm0\npmuludq v9_9(%rip),%xmm0\nmovdqa %xmm0,160(%rsp)\nvpunpckhqdq %xmm10,%xmm8,%xmm0\nmovdqa %xmm0,64(%rsp)\nvpunpcklqdq %xmm10,%xmm8,%xmm0\npmuludq v9_9(%rip),%xmm0\nmovdqa %xmm0,208(%rsp)\nmovdqa 144(%rsp),%xmm0\nvpmuludq %xmm0,%xmm0,%xmm1\npaddq %xmm0,%xmm0\nmovdqa 128(%rsp),%xmm2\nvpmuludq %xmm2,%xmm0,%xmm3\nmovdqa 192(%rsp),%xmm4\nvpmuludq %xmm4,%xmm0,%xmm5\nmovdqa 176(%rsp),%xmm6\nvpmuludq %xmm6,%xmm0,%xmm7\nmovdqa 240(%rsp),%xmm8\nvpmuludq %xmm8,%xmm0,%xmm9\nvpmuludq 224(%rsp),%xmm0,%xmm10\nvpmuludq 304(%rsp),%xmm0,%xmm11\nvpmuludq 288(%rsp),%xmm0,%xmm12\nvpmuludq 336(%rsp),%xmm0,%xmm13\nmovdqa 384(%rsp),%xmm14\nvpmuludq %xmm14,%xmm0,%xmm0\nvpmuludq v38_38(%rip),%xmm14,%xmm15\nvpmuludq %xmm15,%xmm14,%xmm14\npaddq %xmm14,%xmm13\nvpaddq %xmm6,%xmm6,%xmm14\nvpmuludq %xmm14,%xmm6,%xmm6\npaddq %xmm6,%xmm11\nvpaddq %xmm2,%xmm2,%xmm6\nvpmuludq %xmm6,%xmm2,%xmm2\npaddq %xmm2,%xmm5\nvpmuludq %xmm15,%xmm6,%xmm2\npaddq %xmm2,%xmm1\nvpmuludq %xmm15,%xmm4,%xmm2\npaddq %xmm2,%xmm3\nvpmuludq 256(%rsp),%xmm6,%xmm2\npaddq %xmm2,%xmm11\nvpmuludq 304(%rsp),%xmm6,%xmm2\npaddq %xmm2,%xmm12\nvpmuludq 352(%rsp),%xmm6,%xmm2\npaddq %xmm2,%xmm13\nvpmuludq 336(%rsp),%xmm6,%xmm2\npaddq %xmm2,%xmm0\nvpmuludq %xmm4,%xmm6,%xmm2\npaddq %xmm2,%xmm7\nvpmuludq %xmm14,%xmm6,%xmm2\npaddq %xmm2,%xmm9\nvpmuludq %xmm8,%xmm6,%xmm2\npaddq %xmm2,%xmm10\nvpmuludq %xmm15,%xmm14,%xmm2\npaddq %xmm2,%xmm5\nvpmuludq %xmm15,%xmm8,%xmm2\npaddq %xmm2,%xmm7\nvpmuludq %xmm4,%xmm4,%xmm2\npaddq %xmm2,%xmm9\nvpmuludq %xmm14,%xmm4,%xmm2\npaddq %xmm2,%xmm10\nvpaddq %xmm4,%xmm4,%xmm2\nvpmuludq %xmm8,%xmm2,%xmm4\npaddq %xmm4,%xmm11\nvpmuludq 400(%rsp),%xmm2,%xmm4\npaddq %xmm4,%xmm1\nvpmuludq 400(%rsp),%xmm14,%xmm4\npaddq %xmm4,%xmm3\nvpmuludq 224(%rsp),%xmm2,%xmm4\npaddq %xmm4,%xmm12\nvpmuludq 304(%rsp),%xmm2,%xmm4\npaddq %xmm4,%xmm13\nvpmuludq 288(%rsp),%xmm2,%xmm2\npaddq %xmm2,%xmm0\nvpmuludq 368(%rsp),%xmm8,%xmm2\npaddq %xmm2,%xmm3\nvpmuludq %xmm8,%xmm14,%xmm2\npaddq %xmm2,%xmm12\nvpmuludq %xmm8,%xmm8,%xmm2\npaddq %xmm2,%xmm13\nvpaddq %xmm8,%xmm8,%xmm2\nvpmuludq 400(%rsp),%xmm2,%xmm4\npaddq %xmm4,%xmm5\nvpmuludq 256(%rsp),%xmm15,%xmm4\npaddq %xmm4,%xmm9\nvpmuludq 304(%rsp),%xmm15,%xmm4\npaddq %xmm4,%xmm10\nvpmuludq 368(%rsp),%xmm14,%xmm4\npaddq %xmm4,%xmm1\nmovdqa 256(%rsp),%xmm4\npmuludq 400(%rsp),%xmm4\npaddq %xmm4,%xmm7\nvpmuludq 256(%rsp),%xmm14,%xmm4\npaddq %xmm4,%xmm13\nvpmuludq 304(%rsp),%xmm14,%xmm4\npaddq %xmm4,%xmm0\nvpmuludq 352(%rsp),%xmm15,%xmm4\npaddq %xmm4,%xmm11\nvpmuludq 336(%rsp),%xmm15,%xmm4\npaddq %xmm4,%xmm12\nmovdqa 304(%rsp),%xmm4\npaddq %xmm4,%xmm4\npmuludq 400(%rsp),%xmm4\npaddq %xmm4,%xmm9\nvpmuludq 320(%rsp),%xmm2,%xmm4\npaddq %xmm4,%xmm1\nmovdqa 256(%rsp),%xmm4\npmuludq 320(%rsp),%xmm4\npaddq %xmm4,%xmm3\nmovdqa 256(%rsp),%xmm4\npmuludq 368(%rsp),%xmm4\npaddq %xmm4,%xmm5\nmovdqa 304(%rsp),%xmm4\npmuludq 368(%rsp),%xmm4\npaddq %xmm4,%xmm7\nmovdqa 352(%rsp),%xmm4\npmuludq 400(%rsp),%xmm4\npaddq %xmm4,%xmm10\nvpmuludq 224(%rsp),%xmm2,%xmm2\npaddq %xmm2,%xmm0\nmovdqa 272(%rsp),%xmm2\npmuludq 224(%rsp),%xmm2\npaddq %xmm2,%xmm1\nmovdqa 320(%rsp),%xmm2\npmuludq 304(%rsp),%xmm2\npaddq %xmm2,%xmm5\nmovdqa 368(%rsp),%xmm2\npmuludq 288(%rsp),%xmm2\npaddq %xmm2,%xmm9\nmovdqa 400(%rsp),%xmm2\npmuludq 336(%rsp),%xmm2\npaddq %xmm2,%xmm11\nvpsrlq $26,%xmm1,%xmm2\npaddq %xmm2,%xmm3\npand m26(%rip),%xmm1\nvpsrlq $25,%xmm10,%xmm2\npaddq %xmm2,%xmm11\npand m25(%rip),%xmm10\nvpsrlq $25,%xmm3,%xmm2\npaddq %xmm2,%xmm5\npand m25(%rip),%xmm3\nvpsrlq $26,%xmm11,%xmm2\npaddq %xmm2,%xmm12\npand m26(%rip),%xmm11\nvpsrlq $26,%xmm5,%xmm2\npaddq %xmm2,%xmm7\npand m26(%rip),%xmm5\nvpsrlq $25,%xmm12,%xmm2\npaddq %xmm2,%xmm13\npand m25(%rip),%xmm12\nvpsrlq $25,%xmm7,%xmm2\npaddq %xmm2,%xmm9\npand m25(%rip),%xmm7\nvpsrlq $26,%xmm13,%xmm2\npaddq %xmm2,%xmm0\npand m26(%rip),%xmm13\nvpsrlq $26,%xmm9,%xmm2\npaddq %xmm2,%xmm10\npand m26(%rip),%xmm9\nvpsrlq $25,%xmm0,%xmm2\nvpsllq $4,%xmm2,%xmm4\npaddq %xmm2,%xmm1\npsllq $1,%xmm2\npaddq %xmm2,%xmm4\npaddq %xmm4,%xmm1\npand m25(%rip),%xmm0\nvpsrlq $25,%xmm10,%xmm2\npaddq %xmm2,%xmm11\npand m25(%rip),%xmm10\nvpsrlq $26,%xmm1,%xmm2\npaddq %xmm2,%xmm3\npand m26(%rip),%xmm1\nvpunpckhqdq %xmm3,%xmm1,%xmm2\nvpunpcklqdq %xmm3,%xmm1,%xmm1\nmovdqa %xmm1,176(%rsp)\nvpaddq subc0(%rip),%xmm2,%xmm3\npsubq %xmm1,%xmm3\nvpunpckhqdq %xmm3,%xmm2,%xmm1\nvpunpcklqdq %xmm3,%xmm2,%xmm2\nmovdqa %xmm2,192(%rsp)\nmovdqa %xmm1,224(%rsp)\npsllq $1,%xmm1\nmovdqa %xmm1,240(%rsp)\npmuludq v121666_121666(%rip),%xmm3\nmovdqa 80(%rsp),%xmm1\nvpunpcklqdq %xmm1,%xmm3,%xmm2\nvpunpckhqdq %xmm1,%xmm3,%xmm1\nvpunpckhqdq %xmm7,%xmm5,%xmm3\nvpunpcklqdq %xmm7,%xmm5,%xmm4\nmovdqa %xmm4,256(%rsp)\nvpaddq subc2(%rip),%xmm3,%xmm5\npsubq %xmm4,%xmm5\nvpunpckhqdq %xmm5,%xmm3,%xmm4\nvpunpcklqdq %xmm5,%xmm3,%xmm3\nmovdqa %xmm3,272(%rsp)\nmovdqa %xmm4,288(%rsp)\npsllq $1,%xmm4\nmovdqa %xmm4,304(%rsp)\npmuludq v121666_121666(%rip),%xmm5\nmovdqa 96(%rsp),%xmm3\nvpunpcklqdq %xmm3,%xmm5,%xmm4\nvpunpckhqdq %xmm3,%xmm5,%xmm3\nvpunpckhqdq %xmm10,%xmm9,%xmm5\nvpunpcklqdq %xmm10,%xmm9,%xmm6\nmovdqa %xmm6,320(%rsp)\nvpaddq subc2(%rip),%xmm5,%xmm7\npsubq %xmm6,%xmm7\nvpunpckhqdq %xmm7,%xmm5,%xmm6\nvpunpcklqdq %xmm7,%xmm5,%xmm5\nmovdqa %xmm5,336(%rsp)\nmovdqa %xmm6,352(%rsp)\npsllq $1,%xmm6\nmovdqa %xmm6,368(%rsp)\npmuludq v121666_121666(%rip),%xmm7\nmovdqa 112(%rsp),%xmm5\nvpunpcklqdq %xmm5,%xmm7,%xmm6\nvpunpckhqdq %xmm5,%xmm7,%xmm5\nvpunpckhqdq %xmm12,%xmm11,%xmm7\nvpunpcklqdq %xmm12,%xmm11,%xmm8\nmovdqa %xmm8,384(%rsp)\nvpaddq subc2(%rip),%xmm7,%xmm9\npsubq %xmm8,%xmm9\nvpunpckhqdq %xmm9,%xmm7,%xmm8\nvpunpcklqdq %xmm9,%xmm7,%xmm7\nmovdqa %xmm7,400(%rsp)\nmovdqa %xmm8,416(%rsp)\npsllq $1,%xmm8\nmovdqa %xmm8,432(%rsp)\npmuludq v121666_121666(%rip),%xmm9\nmovdqa 160(%rsp),%xmm7\nvpunpcklqdq %xmm7,%xmm9,%xmm8\nvpunpckhqdq %xmm7,%xmm9,%xmm7\nvpunpckhqdq %xmm0,%xmm13,%xmm9\nvpunpcklqdq %xmm0,%xmm13,%xmm0\nmovdqa %xmm0,160(%rsp)\nvpaddq subc2(%rip),%xmm9,%xmm10\npsubq %xmm0,%xmm10\nvpunpckhqdq %xmm10,%xmm9,%xmm0\nvpunpcklqdq %xmm10,%xmm9,%xmm9\nmovdqa %xmm9,448(%rsp)\nmovdqa %xmm0,464(%rsp)\npsllq $1,%xmm0\nmovdqa %xmm0,480(%rsp)\npmuludq v121666_121666(%rip),%xmm10\nmovdqa 208(%rsp),%xmm0\nvpunpcklqdq %xmm0,%xmm10,%xmm9\nvpunpckhqdq %xmm0,%xmm10,%xmm0\nvpsrlq $26,%xmm2,%xmm10\npaddq %xmm10,%xmm1\npand m26(%rip),%xmm2\nvpsrlq $25,%xmm5,%xmm10\npaddq %xmm10,%xmm8\npand m25(%rip),%xmm5\nvpsrlq $25,%xmm1,%xmm10\npaddq %xmm10,%xmm4\npand m25(%rip),%xmm1\nvpsrlq $26,%xmm8,%xmm10\npaddq %xmm10,%xmm7\npand m26(%rip),%xmm8\nvpsrlq $26,%xmm4,%xmm10\npaddq %xmm10,%xmm3\npand m26(%rip),%xmm4\nvpsrlq $25,%xmm7,%xmm10\npaddq %xmm10,%xmm9\npand m25(%rip),%xmm7\nvpsrlq $25,%xmm3,%xmm10\npaddq %xmm10,%xmm6\npand m25(%rip),%xmm3\nvpsrlq $26,%xmm9,%xmm10\npaddq %xmm10,%xmm0\npand m26(%rip),%xmm9\nvpsrlq $26,%xmm6,%xmm10\npaddq %xmm10,%xmm5\npand m26(%rip),%xmm6\nvpsrlq $25,%xmm0,%xmm10\nvpsllq $4,%xmm10,%xmm11\npaddq %xmm10,%xmm2\npsllq $1,%xmm10\npaddq %xmm10,%xmm11\npaddq %xmm11,%xmm2\npand m25(%rip),%xmm0\nvpsrlq $25,%xmm5,%xmm10\npaddq %xmm10,%xmm8\npand m25(%rip),%xmm5\nvpsrlq $26,%xmm2,%xmm10\npaddq %xmm10,%xmm1\npand m26(%rip),%xmm2\nvpunpckhqdq %xmm1,%xmm2,%xmm10\nmovdqa %xmm10,80(%rsp)\nvpunpcklqdq %xmm1,%xmm2,%xmm1\nvpunpckhqdq %xmm3,%xmm4,%xmm2\nmovdqa %xmm2,96(%rsp)\nvpunpcklqdq %xmm3,%xmm4,%xmm2\nvpunpckhqdq %xmm5,%xmm6,%xmm3\nmovdqa %xmm3,112(%rsp)\nvpunpcklqdq %xmm5,%xmm6,%xmm3\nvpunpckhqdq %xmm7,%xmm8,%xmm4\nmovdqa %xmm4,128(%rsp)\nvpunpcklqdq %xmm7,%xmm8,%xmm4\nvpunpckhqdq %xmm0,%xmm9,%xmm5\nmovdqa %xmm5,144(%rsp)\nvpunpcklqdq %xmm0,%xmm9,%xmm0\nmovdqa 176(%rsp),%xmm5\npaddq %xmm5,%xmm1\nvpunpcklqdq %xmm1,%xmm5,%xmm6\nvpunpckhqdq %xmm1,%xmm5,%xmm1\nvpmuludq 224(%rsp),%xmm6,%xmm5\nvpmuludq 192(%rsp),%xmm1,%xmm7\npaddq %xmm7,%xmm5\nvpmuludq 272(%rsp),%xmm6,%xmm7\nvpmuludq 240(%rsp),%xmm1,%xmm8\npaddq %xmm8,%xmm7\nvpmuludq 288(%rsp),%xmm6,%xmm8\nvpmuludq 272(%rsp),%xmm1,%xmm9\npaddq %xmm9,%xmm8\nvpmuludq 336(%rsp),%xmm6,%xmm9\nvpmuludq 304(%rsp),%xmm1,%xmm10\npaddq %xmm10,%xmm9\nvpmuludq 352(%rsp),%xmm6,%xmm10\nvpmuludq 336(%rsp),%xmm1,%xmm11\npaddq %xmm11,%xmm10\nvpmuludq 400(%rsp),%xmm6,%xmm11\nvpmuludq 368(%rsp),%xmm1,%xmm12\npaddq %xmm12,%xmm11\nvpmuludq 416(%rsp),%xmm6,%xmm12\nvpmuludq 400(%rsp),%xmm1,%xmm13\npaddq %xmm13,%xmm12\nvpmuludq 448(%rsp),%xmm6,%xmm13\nvpmuludq 432(%rsp),%xmm1,%xmm14\npaddq %xmm14,%xmm13\nvpmuludq 464(%rsp),%xmm6,%xmm14\nvpmuludq 448(%rsp),%xmm1,%xmm15\npaddq %xmm15,%xmm14\nvpmuludq 192(%rsp),%xmm6,%xmm6\npmuludq v19_19(%rip),%xmm1\nvpmuludq 480(%rsp),%xmm1,%xmm1\npaddq %xmm1,%xmm6\nmovdqa 256(%rsp),%xmm1\npaddq %xmm1,%xmm2\nvpunpcklqdq %xmm2,%xmm1,%xmm15\nvpunpckhqdq %xmm2,%xmm1,%xmm1\nvpmuludq 192(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm7\nvpmuludq 224(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm8\nvpmuludq 272(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm9\nvpmuludq 288(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm10\nvpmuludq 336(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm11\nvpmuludq 352(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm12\nvpmuludq 400(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm13\nvpmuludq 416(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm14\npmuludq v19_19(%rip),%xmm15\nvpmuludq 448(%rsp),%xmm15,%xmm2\npaddq %xmm2,%xmm6\npmuludq 464(%rsp),%xmm15\npaddq %xmm15,%xmm5\nvpmuludq 192(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm8\nvpmuludq 240(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm9\nvpmuludq 272(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm10\nvpmuludq 304(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm11\nvpmuludq 336(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm12\nvpmuludq 368(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm13\nvpmuludq 400(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm14\npmuludq v19_19(%rip),%xmm1\nvpmuludq 432(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm6\nvpmuludq 448(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm5\npmuludq 480(%rsp),%xmm1\npaddq %xmm1,%xmm7\nmovdqa 320(%rsp),%xmm1\npaddq %xmm1,%xmm3\nvpunpcklqdq %xmm3,%xmm1,%xmm2\nvpunpckhqdq %xmm3,%xmm1,%xmm1\nvpmuludq 192(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm9\nvpmuludq 224(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm10\nvpmuludq 272(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm11\nvpmuludq 288(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm12\nvpmuludq 336(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm13\nvpmuludq 352(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm14\npmuludq v19_19(%rip),%xmm2\nvpmuludq 400(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm6\nvpmuludq 416(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm5\nvpmuludq 448(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm7\npmuludq 464(%rsp),%xmm2\npaddq %xmm2,%xmm8\nvpmuludq 192(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm10\nvpmuludq 240(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm11\nvpmuludq 272(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm12\nvpmuludq 304(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm13\nvpmuludq 336(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm14\npmuludq v19_19(%rip),%xmm1\nvpmuludq 368(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm6\nvpmuludq 400(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm5\nvpmuludq 432(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm7\nvpmuludq 448(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm8\npmuludq 480(%rsp),%xmm1\npaddq %xmm1,%xmm9\nmovdqa 384(%rsp),%xmm1\npaddq %xmm1,%xmm4\nvpunpcklqdq %xmm4,%xmm1,%xmm2\nvpunpckhqdq %xmm4,%xmm1,%xmm1\nvpmuludq 192(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm11\nvpmuludq 224(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm12\nvpmuludq 272(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm13\nvpmuludq 288(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm14\npmuludq v19_19(%rip),%xmm2\nvpmuludq 336(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm6\nvpmuludq 352(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm5\nvpmuludq 400(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm7\nvpmuludq 416(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm8\nvpmuludq 448(%rsp),%xmm2,%xmm3\npaddq %xmm3,%xmm9\npmuludq 464(%rsp),%xmm2\npaddq %xmm2,%xmm10\nvpmuludq 192(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm12\nvpmuludq 240(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm13\nvpmuludq 272(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm14\npmuludq v19_19(%rip),%xmm1\nvpmuludq 304(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm6\nvpmuludq 336(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm5\nvpmuludq 368(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm7\nvpmuludq 400(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm8\nvpmuludq 432(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm9\nvpmuludq 448(%rsp),%xmm1,%xmm2\npaddq %xmm2,%xmm10\npmuludq 480(%rsp),%xmm1\npaddq %xmm1,%xmm11\nmovdqa 160(%rsp),%xmm1\npaddq %xmm1,%xmm0\nvpunpcklqdq %xmm0,%xmm1,%xmm2\nvpunpckhqdq %xmm0,%xmm1,%xmm0\nvpmuludq 192(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm13\nvpmuludq 224(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm14\npmuludq v19_19(%rip),%xmm2\nvpmuludq 272(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm6\nvpmuludq 288(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm5\nvpmuludq 336(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm7\nvpmuludq 352(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm8\nvpmuludq 400(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm9\nvpmuludq 416(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm10\nvpmuludq 448(%rsp),%xmm2,%xmm1\npaddq %xmm1,%xmm11\npmuludq 464(%rsp),%xmm2\npaddq %xmm2,%xmm12\nvpmuludq 192(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm14\npmuludq v19_19(%rip),%xmm0\nvpmuludq 240(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm6\nvpmuludq 272(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm5\nvpmuludq 304(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm7\nvpmuludq 336(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm8\nvpmuludq 368(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm9\nvpmuludq 400(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm10\nvpmuludq 432(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm11\nvpmuludq 448(%rsp),%xmm0,%xmm1\npaddq %xmm1,%xmm12\npmuludq 480(%rsp),%xmm0\npaddq %xmm0,%xmm13\nvpsrlq $26,%xmm6,%xmm0\npaddq %xmm0,%xmm5\npand m26(%rip),%xmm6\nvpsrlq $25,%xmm10,%xmm0\npaddq %xmm0,%xmm11\npand m25(%rip),%xmm10\nvpsrlq $25,%xmm5,%xmm0\npaddq %xmm0,%xmm7\npand m25(%rip),%xmm5\nvpsrlq $26,%xmm11,%xmm0\npaddq %xmm0,%xmm12\npand m26(%rip),%xmm11\nvpsrlq $26,%xmm7,%xmm0\npaddq %xmm0,%xmm8\npand m26(%rip),%xmm7\nvpsrlq $25,%xmm12,%xmm0\npaddq %xmm0,%xmm13\npand m25(%rip),%xmm12\nvpsrlq $25,%xmm8,%xmm0\npaddq %xmm0,%xmm9\npand m25(%rip),%xmm8\nvpsrlq $26,%xmm13,%xmm0\npaddq %xmm0,%xmm14\npand m26(%rip),%xmm13\nvpsrlq $26,%xmm9,%xmm0\npaddq %xmm0,%xmm10\npand m26(%rip),%xmm9\nvpsrlq $25,%xmm14,%xmm0\nvpsllq $4,%xmm0,%xmm1\npaddq %xmm0,%xmm6\npsllq $1,%xmm0\npaddq %xmm0,%xmm1\npaddq %xmm1,%xmm6\npand m25(%rip),%xmm14\nvpsrlq $25,%xmm10,%xmm0\npaddq %xmm0,%xmm11\npand m25(%rip),%xmm10\nvpsrlq $26,%xmm6,%xmm0\npaddq %xmm0,%xmm5\npand m26(%rip),%xmm6\nvpunpckhqdq %xmm5,%xmm6,%xmm1\nvpunpcklqdq %xmm5,%xmm6,%xmm0\nvpunpckhqdq %xmm8,%xmm7,%xmm3\nvpunpcklqdq %xmm8,%xmm7,%xmm2\nvpunpckhqdq %xmm10,%xmm9,%xmm5\nvpunpcklqdq %xmm10,%xmm9,%xmm4\nvpunpckhqdq %xmm12,%xmm11,%xmm7\nvpunpcklqdq %xmm12,%xmm11,%xmm6\nvpunpckhqdq %xmm14,%xmm13,%xmm9\nvpunpcklqdq %xmm14,%xmm13,%xmm8\ncmp  $0,%rdx\njne ._ladder_base_loop\nmovdqu   %xmm1,80(%rdi)\nmovdqu   %xmm0,0(%rdi)\nmovdqu   %xmm3,96(%rdi)\nmovdqu   %xmm2,16(%rdi)\nmovdqu   %xmm5,112(%rdi)\nmovdqu   %xmm4,32(%rdi)\nmovdqu   %xmm7,128(%rdi)\nmovdqu   %xmm6,48(%rdi)\nmovdqu   %xmm9,144(%rdi)\nmovdqu   %xmm8,64(%rdi)\nmovq 1536(%rsp),%r11\nmovq 1544(%rsp),%r12\nmovq 1552(%rsp),%r13\nadd %r11,%rsp\nret\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/ladder_base.h",
    "content": "#ifndef ladder_base_H\n#define ladder_base_H\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#include \"fe.h\"\n#include \"ladder_base_namespace.h\"\n\nextern void ladder_base(fe *, const unsigned char *);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif //ifndef ladder_base_H\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/ladder_base_namespace.h",
    "content": "#ifndef ladder_base_namespace_H\n#define ladder_base_namespace_H\n\n#define  ladder_base  crypto_scalarmult_curve25519_sandy2x_ladder_base\n#define _ladder_base _crypto_scalarmult_curve25519_sandy2x_ladder_base\n\n#endif //ifndef ladder_base_namespace_H\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/ladder_namespace.h",
    "content": "#ifndef ladder_namespace_H\n#define ladder_namespace_H\n\n#define  ladder  crypto_scalarmult_curve25519_sandy2x_ladder\n#define _ladder _crypto_scalarmult_curve25519_sandy2x_ladder\n\n#endif //ifndef ladder_namespace_H\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/sandy2x/sandy2x.S",
    "content": "\n#ifdef HAVE_AVX_ASM\n\n#define IN_SANDY2X\n\n#include \"consts.S\"\n#include \"fe51_mul.S\"\n#include \"fe51_nsquare.S\"\n#include \"fe51_pack.S\"\n#include \"ladder.S\"\n#include \"ladder_base.S\"\n\n#if defined(__linux__) && defined(__ELF__)\n.section .note.GNU-stack,\"\",%progbits\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/scalarmult_curve25519.c",
    "content": "\n#include \"crypto_scalarmult_curve25519.h\"\n#include \"scalarmult_curve25519.h\"\n#include \"runtime.h\"\n\n#ifdef HAVE_AVX_ASM\n# include \"sandy2x/curve25519_sandy2x.h\"\n#endif\n#ifdef HAVE_TI_MODE\n# include \"donna_c64/curve25519_donna_c64.h\"\nstatic const crypto_scalarmult_curve25519_implementation *implementation =\n    &crypto_scalarmult_curve25519_donna_c64_implementation;\n#else\n# include \"ref10/curve25519_ref10.h\"\nstatic const crypto_scalarmult_curve25519_implementation *implementation =\n    &crypto_scalarmult_curve25519_ref10_implementation;\n#endif\n\nint\ncrypto_scalarmult_curve25519(unsigned char *q, const unsigned char *n,\n                             const unsigned char *p)\n{\n    size_t        i;\n    unsigned char d = 0;\n\n    if (implementation->mult(q, n, p) != 0) {\n        return -1;\n    }\n    for (i = 0; i < crypto_scalarmult_curve25519_BYTES; i++) {\n        d |= q[i];\n    }\n    return -(1 & ((d - 1) >> 8));\n}\n\nint\ncrypto_scalarmult_curve25519_base(unsigned char *q, const unsigned char *n)\n{\n    return implementation->mult_base(q, n);\n}\n\nsize_t\ncrypto_scalarmult_curve25519_bytes(void)\n{\n    return crypto_scalarmult_curve25519_BYTES;\n}\n\nsize_t\ncrypto_scalarmult_curve25519_scalarbytes(void)\n{\n    return crypto_scalarmult_curve25519_SCALARBYTES;\n}\n\nint\n_crypto_scalarmult_curve25519_pick_best_implementation(void)\n{\n#ifdef HAVE_TI_MODE\n    implementation = &crypto_scalarmult_curve25519_donna_c64_implementation;\n#else\n    implementation = &crypto_scalarmult_curve25519_ref10_implementation;\n#endif\n#ifdef HAVE_AVX_ASM\n    if (sodium_runtime_has_avx()) {\n        implementation = &crypto_scalarmult_curve25519_sandy2x_implementation;\n    }\n#endif\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_scalarmult/curve25519/scalarmult_curve25519.h",
    "content": "\n#ifndef scalarmult_poly1305_H\n#define scalarmult_poly1305_H\n\ntypedef struct crypto_scalarmult_curve25519_implementation {\n    int (*mult)(unsigned char *q, const unsigned char *n,\n                const unsigned char *p);\n    int (*mult_base)(unsigned char *q, const unsigned char *n);\n} crypto_scalarmult_curve25519_implementation;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_secretbox/crypto_secretbox.c",
    "content": "\n#include \"crypto_secretbox.h\"\n\nsize_t\ncrypto_secretbox_keybytes(void)\n{\n    return crypto_secretbox_KEYBYTES;\n}\n\nsize_t\ncrypto_secretbox_noncebytes(void)\n{\n    return crypto_secretbox_NONCEBYTES;\n}\n\nsize_t\ncrypto_secretbox_zerobytes(void)\n{\n    return crypto_secretbox_ZEROBYTES;\n}\n\nsize_t\ncrypto_secretbox_boxzerobytes(void)\n{\n    return crypto_secretbox_BOXZEROBYTES;\n}\n\nsize_t\ncrypto_secretbox_macbytes(void)\n{\n    return crypto_secretbox_MACBYTES;\n}\n\nconst char *\ncrypto_secretbox_primitive(void)\n{\n    return crypto_secretbox_PRIMITIVE;\n}\n\nint\ncrypto_secretbox(unsigned char *c, const unsigned char *m,\n                 unsigned long long mlen, const unsigned char *n,\n                 const unsigned char *k)\n{\n    return crypto_secretbox_xsalsa20poly1305(c, m, mlen, n, k);\n}\n\nint\ncrypto_secretbox_open(unsigned char *m, const unsigned char *c,\n                      unsigned long long clen, const unsigned char *n,\n                      const unsigned char *k)\n{\n    return crypto_secretbox_xsalsa20poly1305_open(m, c, clen, n, k);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_secretbox/crypto_secretbox_easy.c",
    "content": "\n#include <assert.h>\n#include <limits.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"crypto_core_hsalsa20.h\"\n#include \"crypto_onetimeauth_poly1305.h\"\n#include \"crypto_secretbox.h\"\n#include \"crypto_stream_salsa20.h\"\n#include \"utils.h\"\n\nstatic const unsigned char sigma[16] = {\n    'e', 'x', 'p', 'a', 'n', 'd', ' ', '3', '2', '-', 'b', 'y', 't', 'e', ' ', 'k'\n};\n\nint\ncrypto_secretbox_detached(unsigned char *c, unsigned char *mac,\n                          const unsigned char *m,\n                          unsigned long long mlen, const unsigned char *n,\n                          const unsigned char *k)\n{\n    crypto_onetimeauth_poly1305_state state;\n    unsigned char                     block0[64U];\n    unsigned char                     subkey[crypto_stream_salsa20_KEYBYTES];\n    unsigned long long                i;\n    unsigned long long                mlen0;\n\n    crypto_core_hsalsa20(subkey, n, k, sigma);\n\n    if (((uintptr_t) c >= (uintptr_t) m &&\n         (uintptr_t) c - (uintptr_t) m < mlen) ||\n        ((uintptr_t) m >= (uintptr_t) c &&\n         (uintptr_t) m - (uintptr_t) c < mlen)) {\n        memmove(c, m, mlen);\n        m = c;\n    }\n    memset(block0, 0U, crypto_secretbox_ZEROBYTES);\n    (void) sizeof(int[64U >= crypto_secretbox_ZEROBYTES ? 1 : -1]);\n    mlen0 = mlen;\n    if (mlen0 > 64U - crypto_secretbox_ZEROBYTES) {\n        mlen0 = 64U - crypto_secretbox_ZEROBYTES;\n    }\n    for (i = 0U; i < mlen0; i++) {\n        block0[i + crypto_secretbox_ZEROBYTES] = m[i];\n    }\n    crypto_stream_salsa20_xor(block0, block0,\n                              mlen0 + crypto_secretbox_ZEROBYTES,\n                              n + 16, subkey);\n    (void) sizeof(int[crypto_secretbox_ZEROBYTES >=\n                      crypto_onetimeauth_poly1305_KEYBYTES ? 1 : -1]);\n    crypto_onetimeauth_poly1305_init(&state, block0);\n\n    for (i = 0U; i < mlen0; i++) {\n        c[i] = block0[crypto_secretbox_ZEROBYTES + i];\n    }\n    sodium_memzero(block0, sizeof block0);\n    if (mlen > mlen0) {\n        crypto_stream_salsa20_xor_ic(c + mlen0, m + mlen0, mlen - mlen0,\n                                     n + 16, 1U, subkey);\n    }\n    sodium_memzero(subkey, sizeof subkey);\n\n    crypto_onetimeauth_poly1305_update(&state, c, mlen);\n    crypto_onetimeauth_poly1305_final(&state, mac);\n    sodium_memzero(&state, sizeof state);\n\n    return 0;\n}\n\nint\ncrypto_secretbox_easy(unsigned char *c, const unsigned char *m,\n                      unsigned long long mlen, const unsigned char *n,\n                      const unsigned char *k)\n{\n    if (mlen > SIZE_MAX - crypto_secretbox_MACBYTES) {\n        return -1;\n    }\n    return crypto_secretbox_detached(c + crypto_secretbox_MACBYTES,\n                                     c, m, mlen, n, k);\n}\n\nint\ncrypto_secretbox_open_detached(unsigned char *m, const unsigned char *c,\n                               const unsigned char *mac,\n                               unsigned long long clen,\n                               const unsigned char *n,\n                               const unsigned char *k)\n{\n    unsigned char      block0[64U];\n    unsigned char      subkey[crypto_stream_salsa20_KEYBYTES];\n    unsigned long long i;\n    unsigned long long mlen0;\n\n    crypto_core_hsalsa20(subkey, n, k, sigma);\n    crypto_stream_salsa20(block0, crypto_stream_salsa20_KEYBYTES,\n                          n + 16, subkey);\n    if (crypto_onetimeauth_poly1305_verify(mac, c, clen, block0) != 0) {\n        sodium_memzero(subkey, sizeof subkey);\n        return -1;\n    }\n    if (((uintptr_t) c >= (uintptr_t) m &&\n         (uintptr_t) c - (uintptr_t) m < clen) ||\n        ((uintptr_t) m >= (uintptr_t) c &&\n         (uintptr_t) m - (uintptr_t) c < clen)) {\n        memmove(m, c, clen);\n        c = m;\n    }\n    mlen0 = clen;\n    if (mlen0 > 64U - crypto_secretbox_ZEROBYTES) {\n        mlen0 = 64U - crypto_secretbox_ZEROBYTES;\n    }\n    for (i = 0U; i < mlen0; i++) {\n        block0[crypto_secretbox_ZEROBYTES + i] = c[i];\n    }\n    crypto_stream_salsa20_xor(block0, block0,\n                              crypto_secretbox_ZEROBYTES + mlen0,\n                              n + 16, subkey);\n    for (i = 0U; i < mlen0; i++) {\n        m[i] = block0[i + crypto_secretbox_ZEROBYTES];\n    }\n    if (clen > mlen0) {\n        crypto_stream_salsa20_xor_ic(m + mlen0, c + mlen0, clen - mlen0,\n                                     n + 16, 1U, subkey);\n    }\n    sodium_memzero(subkey, sizeof subkey);\n\n    return 0;\n}\n\nint\ncrypto_secretbox_open_easy(unsigned char *m, const unsigned char *c,\n                           unsigned long long clen, const unsigned char *n,\n                           const unsigned char *k)\n{\n    if (clen < crypto_secretbox_MACBYTES) {\n        return -1;\n    }\n    return crypto_secretbox_open_detached(m, c + crypto_secretbox_MACBYTES, c,\n                                          clen - crypto_secretbox_MACBYTES,\n                                          n, k);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_secretbox/xsalsa20poly1305/ref/box_xsalsa20poly1305.c",
    "content": "#include \"crypto_onetimeauth_poly1305.h\"\n#include \"crypto_secretbox_xsalsa20poly1305.h\"\n#include \"crypto_stream_xsalsa20.h\"\n\nint crypto_secretbox_xsalsa20poly1305(\n  unsigned char *c,\n  const unsigned char *m,unsigned long long mlen,\n  const unsigned char *n,\n  const unsigned char *k\n)\n{\n  int i;\n  if (mlen < 32) return -1;\n  crypto_stream_xsalsa20_xor(c,m,mlen,n,k);\n  crypto_onetimeauth_poly1305(c + 16,c + 32,mlen - 32,c);\n  for (i = 0;i < 16;++i) c[i] = 0;\n  return 0;\n}\n\nint crypto_secretbox_xsalsa20poly1305_open(\n  unsigned char *m,\n  const unsigned char *c,unsigned long long clen,\n  const unsigned char *n,\n  const unsigned char *k\n)\n{\n  int i;\n  unsigned char subkey[32];\n  if (clen < 32) return -1;\n  crypto_stream_xsalsa20(subkey,32,n,k);\n  if (crypto_onetimeauth_poly1305_verify(c + 16,c + 32,clen - 32,subkey) != 0) return -1;\n  crypto_stream_xsalsa20_xor(m,c,clen,n,k);\n  for (i = 0;i < 32;++i) m[i] = 0;\n  return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_secretbox/xsalsa20poly1305/secretbox_xsalsa20poly1305_api.c",
    "content": "#include \"crypto_secretbox_xsalsa20poly1305.h\"\n\nsize_t\ncrypto_secretbox_xsalsa20poly1305_keybytes(void) {\n    return crypto_secretbox_xsalsa20poly1305_KEYBYTES;\n}\n\nsize_t\ncrypto_secretbox_xsalsa20poly1305_noncebytes(void) {\n    return crypto_secretbox_xsalsa20poly1305_NONCEBYTES;\n}\n\nsize_t\ncrypto_secretbox_xsalsa20poly1305_zerobytes(void) {\n    return crypto_secretbox_xsalsa20poly1305_ZEROBYTES;\n}\n\nsize_t\ncrypto_secretbox_xsalsa20poly1305_boxzerobytes(void) {\n    return crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES;\n}\n\nsize_t\ncrypto_secretbox_xsalsa20poly1305_macbytes(void) {\n    return crypto_secretbox_xsalsa20poly1305_MACBYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_shorthash/crypto_shorthash.c",
    "content": "\n#include \"crypto_shorthash.h\"\n\nsize_t\ncrypto_shorthash_bytes(void)\n{\n    return crypto_shorthash_BYTES;\n}\n\nsize_t\ncrypto_shorthash_keybytes(void)\n{\n    return crypto_shorthash_KEYBYTES;\n}\n\nconst char *\ncrypto_shorthash_primitive(void)\n{\n    return crypto_shorthash_PRIMITIVE;\n}\n\nint\ncrypto_shorthash(unsigned char *out, const unsigned char *in,\n                 unsigned long long inlen, const unsigned char *k)\n{\n    return crypto_shorthash_siphash24(out, in, inlen, k);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_shorthash/siphash24/ref/shorthash_siphash24.c",
    "content": "#include \"crypto_shorthash_siphash24.h\"\n#include \"crypto_uint64.h\"\n#include \"crypto_uint32.h\"\n#include \"crypto_uint8.h\"\n\ntypedef crypto_uint64 u64;\ntypedef crypto_uint32 u32;\ntypedef crypto_uint8   u8;\n\n#define ROTL(x,b) (u64)( ((x) << (b)) | ( (x) >> (64 - (b))) )\n\n#define U32TO8_LE(p, v)         \\\n    (p)[0] = (u8)((v)      ); (p)[1] = (u8)((v) >>  8); \\\n    (p)[2] = (u8)((v) >> 16); (p)[3] = (u8)((v) >> 24);\n\n#define U64TO8_LE(p, v)         \\\n  U32TO8_LE((p),     (u32)((v)      ));   \\\n  U32TO8_LE((p) + 4, (u32)((v) >> 32));\n\n#define U8TO64_LE(p) \\\n  (((u64)((p)[0])      ) | \\\n   ((u64)((p)[1]) <<  8) | \\\n   ((u64)((p)[2]) << 16) | \\\n   ((u64)((p)[3]) << 24) | \\\n   ((u64)((p)[4]) << 32) | \\\n   ((u64)((p)[5]) << 40) | \\\n   ((u64)((p)[6]) << 48) | \\\n   ((u64)((p)[7]) << 56))\n\n#define SIPROUND            \\\n  do {              \\\n    v0 += v1; v1=ROTL(v1,13); v1 ^= v0; v0=ROTL(v0,32); \\\n    v2 += v3; v3=ROTL(v3,16); v3 ^= v2;     \\\n    v0 += v3; v3=ROTL(v3,21); v3 ^= v0;     \\\n    v2 += v1; v1=ROTL(v1,17); v1 ^= v2; v2=ROTL(v2,32); \\\n  } while(0)\n\nint crypto_shorthash_siphash24(unsigned char *out, const unsigned char *in,\n                               unsigned long long inlen, const unsigned char *k)\n{\n  /* \"somepseudorandomlygeneratedbytes\" */\n  u64 v0 = 0x736f6d6570736575ULL;\n  u64 v1 = 0x646f72616e646f6dULL;\n  u64 v2 = 0x6c7967656e657261ULL;\n  u64 v3 = 0x7465646279746573ULL;\n  u64 b;\n  u64 k0 = U8TO64_LE( k );\n  u64 k1 = U8TO64_LE( k + 8 );\n  u64 m;\n  const u8 *end = in + inlen - ( inlen % sizeof( u64 ) );\n  const int left = inlen & 7;\n  b = ( ( u64 )inlen ) << 56;\n  v3 ^= k1;\n  v2 ^= k0;\n  v1 ^= k1;\n  v0 ^= k0;\n\n  for ( ; in != end; in += 8 )\n  {\n    m = U8TO64_LE( in );\n    v3 ^= m;\n    SIPROUND;\n    SIPROUND;\n    v0 ^= m;\n  }\n\n  switch( left )\n  {\n  case 7: b |= ( ( u64 )in[ 6] )  << 48;\n  case 6: b |= ( ( u64 )in[ 5] )  << 40;\n  case 5: b |= ( ( u64 )in[ 4] )  << 32;\n  case 4: b |= ( ( u64 )in[ 3] )  << 24;\n  case 3: b |= ( ( u64 )in[ 2] )  << 16;\n  case 2: b |= ( ( u64 )in[ 1] )  <<  8;\n  case 1: b |= ( ( u64 )in[ 0] ); break;\n  case 0: break;\n  }\n\n  v3 ^= b;\n  SIPROUND;\n  SIPROUND;\n  v0 ^= b;\n  v2 ^= 0xff;\n  SIPROUND;\n  SIPROUND;\n  SIPROUND;\n  SIPROUND;\n  b = v0 ^ v1 ^ v2  ^ v3;\n  U64TO8_LE( out, b );\n  return 0;\n}\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_shorthash/siphash24/shorthash_siphash24_api.c",
    "content": "#include \"crypto_shorthash_siphash24.h\"\n\nsize_t\ncrypto_shorthash_siphash24_bytes(void) {\n    return crypto_shorthash_siphash24_BYTES;\n}\n\nsize_t\ncrypto_shorthash_siphash24_keybytes(void) {\n    return crypto_shorthash_siphash24_KEYBYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/crypto_sign.c",
    "content": "\n#include \"crypto_sign.h\"\n\nsize_t\ncrypto_sign_bytes(void)\n{\n    return crypto_sign_BYTES;\n}\n\nsize_t\ncrypto_sign_seedbytes(void)\n{\n    return crypto_sign_SEEDBYTES;\n}\n\nsize_t\ncrypto_sign_publickeybytes(void)\n{\n    return crypto_sign_PUBLICKEYBYTES;\n}\n\nsize_t\ncrypto_sign_secretkeybytes(void)\n{\n    return crypto_sign_SECRETKEYBYTES;\n}\n\nconst char *\ncrypto_sign_primitive(void)\n{\n    return crypto_sign_PRIMITIVE;\n}\n\nint\ncrypto_sign_seed_keypair(unsigned char *pk, unsigned char *sk,\n                         const unsigned char *seed)\n{\n    return crypto_sign_ed25519_seed_keypair(pk, sk, seed);\n}\n\nint\ncrypto_sign_keypair(unsigned char *pk, unsigned char *sk)\n{\n    return crypto_sign_ed25519_keypair(pk, sk);\n}\n\nint\ncrypto_sign(unsigned char *sm, unsigned long long *smlen_p,\n            const unsigned char *m, unsigned long long mlen,\n            const unsigned char *sk)\n{\n    return crypto_sign_ed25519(sm, smlen_p, m, mlen, sk);\n}\n\nint\ncrypto_sign_open(unsigned char *m, unsigned long long *mlen_p,\n                 const unsigned char *sm, unsigned long long smlen,\n                 const unsigned char *pk)\n{\n    return crypto_sign_ed25519_open(m, mlen_p, sm, smlen, pk);\n}\n\nint\ncrypto_sign_detached(unsigned char *sig, unsigned long long *siglen_p,\n                     const unsigned char *m, unsigned long long mlen,\n                     const unsigned char *sk)\n{\n    return crypto_sign_ed25519_detached(sig, siglen_p, m, mlen, sk);\n}\n\nint\ncrypto_sign_verify_detached(const unsigned char *sig, const unsigned char *m,\n                            unsigned long long mlen, const unsigned char *pk)\n{\n    return crypto_sign_ed25519_verify_detached(sig, m, mlen, pk);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/description",
    "content": "EdDSA signatures using Curve25519\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/base.h",
    "content": "{\n {\n  { 25967493,-14356035,29566456,3660896,-12694345,4014787,27544626,-11754271,-6079156,2047605 },\n  { -12545711,934262,-2722910,3049990,-727428,9406986,12720692,5043384,19500929,-15469378 },\n  { -8738181,4489570,9688441,-14785194,10184609,-12363380,29287919,11864899,-24514362,-4438546 },\n },\n {\n  { -12815894,-12976347,-21581243,11784320,-25355658,-2750717,-11717903,-3814571,-358445,-10211303 },\n  { -21703237,6903825,27185491,6451973,-29577724,-9554005,-15616551,11189268,-26829678,-5319081 },\n  { 26966642,11152617,32442495,15396054,14353839,-12752335,-3128826,-9541118,-15472047,-4166697 },\n },\n {\n  { 15636291,-9688557,24204773,-7912398,616977,-16685262,27787600,-14772189,28944400,-1550024 },\n  { 16568933,4717097,-11556148,-1102322,15682896,-11807043,16354577,-11775962,7689662,11199574 },\n  { 30464156,-5976125,-11779434,-15670865,23220365,15915852,7512774,10017326,-17749093,-9920357 },\n },\n {\n  { -17036878,13921892,10945806,-6033431,27105052,-16084379,-28926210,15006023,3284568,-6276540 },\n  { 23599295,-8306047,-11193664,-7687416,13236774,10506355,7464579,9656445,13059162,10374397 },\n  { 7798556,16710257,3033922,2874086,28997861,2835604,32406664,-3839045,-641708,-101325 },\n },\n {\n  { 10861363,11473154,27284546,1981175,-30064349,12577861,32867885,14515107,-15438304,10819380 },\n  { 4708026,6336745,20377586,9066809,-11272109,6594696,-25653668,12483688,-12668491,5581306 },\n  { 19563160,16186464,-29386857,4097519,10237984,-4348115,28542350,13850243,-23678021,-15815942 },\n },\n {\n  { -15371964,-12862754,32573250,4720197,-26436522,5875511,-19188627,-15224819,-9818940,-12085777 },\n  { -8549212,109983,15149363,2178705,22900618,4543417,3044240,-15689887,1762328,14866737 },\n  { -18199695,-15951423,-10473290,1707278,-17185920,3916101,-28236412,3959421,27914454,4383652 },\n },\n {\n  { 5153746,9909285,1723747,-2777874,30523605,5516873,19480852,5230134,-23952439,-15175766 },\n  { -30269007,-3463509,7665486,10083793,28475525,1649722,20654025,16520125,30598449,7715701 },\n  { 28881845,14381568,9657904,3680757,-20181635,7843316,-31400660,1370708,29794553,-1409300 },\n },\n {\n  { 14499471,-2729599,-33191113,-4254652,28494862,14271267,30290735,10876454,-33154098,2381726 },\n  { -7195431,-2655363,-14730155,462251,-27724326,3941372,-6236617,3696005,-32300832,15351955 },\n  { 27431194,8222322,16448760,-3907995,-18707002,11938355,-32961401,-2970515,29551813,10109425 },\n },\n},\n{\n {\n  { -13657040,-13155431,-31283750,11777098,21447386,6519384,-2378284,-1627556,10092783,-4764171 },\n  { 27939166,14210322,4677035,16277044,-22964462,-12398139,-32508754,12005538,-17810127,12803510 },\n  { 17228999,-15661624,-1233527,300140,-1224870,-11714777,30364213,-9038194,18016357,4397660 },\n },\n {\n  { -10958843,-7690207,4776341,-14954238,27850028,-15602212,-26619106,14544525,-17477504,982639 },\n  { 29253598,15796703,-2863982,-9908884,10057023,3163536,7332899,-4120128,-21047696,9934963 },\n  { 5793303,16271923,-24131614,-10116404,29188560,1206517,-14747930,4559895,-30123922,-10897950 },\n },\n {\n  { -27643952,-11493006,16282657,-11036493,28414021,-15012264,24191034,4541697,-13338309,5500568 },\n  { 12650548,-1497113,9052871,11355358,-17680037,-8400164,-17430592,12264343,10874051,13524335 },\n  { 25556948,-3045990,714651,2510400,23394682,-10415330,33119038,5080568,-22528059,5376628 },\n },\n {\n  { -26088264,-4011052,-17013699,-3537628,-6726793,1920897,-22321305,-9447443,4535768,1569007 },\n  { -2255422,14606630,-21692440,-8039818,28430649,8775819,-30494562,3044290,31848280,12543772 },\n  { -22028579,2943893,-31857513,6777306,13784462,-4292203,-27377195,-2062731,7718482,14474653 },\n },\n {\n  { 2385315,2454213,-22631320,46603,-4437935,-15680415,656965,-7236665,24316168,-5253567 },\n  { 13741529,10911568,-33233417,-8603737,-20177830,-1033297,33040651,-13424532,-20729456,8321686 },\n  { 21060490,-2212744,15712757,-4336099,1639040,10656336,23845965,-11874838,-9984458,608372 },\n },\n {\n  { -13672732,-15087586,-10889693,-7557059,-6036909,11305547,1123968,-6780577,27229399,23887 },\n  { -23244140,-294205,-11744728,14712571,-29465699,-2029617,12797024,-6440308,-1633405,16678954 },\n  { -29500620,4770662,-16054387,14001338,7830047,9564805,-1508144,-4795045,-17169265,4904953 },\n },\n {\n  { 24059557,14617003,19037157,-15039908,19766093,-14906429,5169211,16191880,2128236,-4326833 },\n  { -16981152,4124966,-8540610,-10653797,30336522,-14105247,-29806336,916033,-6882542,-2986532 },\n  { -22630907,12419372,-7134229,-7473371,-16478904,16739175,285431,2763829,15736322,4143876 },\n },\n {\n  { 2379352,11839345,-4110402,-5988665,11274298,794957,212801,-14594663,23527084,-16458268 },\n  { 33431127,-11130478,-17838966,-15626900,8909499,8376530,-32625340,4087881,-15188911,-14416214 },\n  { 1767683,7197987,-13205226,-2022635,-13091350,448826,5799055,4357868,-4774191,-16323038 },\n },\n},\n{\n {\n  { 6721966,13833823,-23523388,-1551314,26354293,-11863321,23365147,-3949732,7390890,2759800 },\n  { 4409041,2052381,23373853,10530217,7676779,-12885954,21302353,-4264057,1244380,-12919645 },\n  { -4421239,7169619,4982368,-2957590,30256825,-2777540,14086413,9208236,15886429,16489664 },\n },\n {\n  { 1996075,10375649,14346367,13311202,-6874135,-16438411,-13693198,398369,-30606455,-712933 },\n  { -25307465,9795880,-2777414,14878809,-33531835,14780363,13348553,12076947,-30836462,5113182 },\n  { -17770784,11797796,31950843,13929123,-25888302,12288344,-30341101,-7336386,13847711,5387222 },\n },\n {\n  { -18582163,-3416217,17824843,-2340966,22744343,-10442611,8763061,3617786,-19600662,10370991 },\n  { 20246567,-14369378,22358229,-543712,18507283,-10413996,14554437,-8746092,32232924,16763880 },\n  { 9648505,10094563,26416693,14745928,-30374318,-6472621,11094161,15689506,3140038,-16510092 },\n },\n {\n  { -16160072,5472695,31895588,4744994,8823515,10365685,-27224800,9448613,-28774454,366295 },\n  { 19153450,11523972,-11096490,-6503142,-24647631,5420647,28344573,8041113,719605,11671788 },\n  { 8678025,2694440,-6808014,2517372,4964326,11152271,-15432916,-15266516,27000813,-10195553 },\n },\n {\n  { -15157904,7134312,8639287,-2814877,-7235688,10421742,564065,5336097,6750977,-14521026 },\n  { 11836410,-3979488,26297894,16080799,23455045,15735944,1695823,-8819122,8169720,16220347 },\n  { -18115838,8653647,17578566,-6092619,-8025777,-16012763,-11144307,-2627664,-5990708,-14166033 },\n },\n {\n  { -23308498,-10968312,15213228,-10081214,-30853605,-11050004,27884329,2847284,2655861,1738395 },\n  { -27537433,-14253021,-25336301,-8002780,-9370762,8129821,21651608,-3239336,-19087449,-11005278 },\n  { 1533110,3437855,23735889,459276,29970501,11335377,26030092,5821408,10478196,8544890 },\n },\n {\n  { 32173121,-16129311,24896207,3921497,22579056,-3410854,19270449,12217473,17789017,-3395995 },\n  { -30552961,-2228401,-15578829,-10147201,13243889,517024,15479401,-3853233,30460520,1052596 },\n  { -11614875,13323618,32618793,8175907,-15230173,12596687,27491595,-4612359,3179268,-9478891 },\n },\n {\n  { 31947069,-14366651,-4640583,-15339921,-15125977,-6039709,-14756777,-16411740,19072640,-9511060 },\n  { 11685058,11822410,3158003,-13952594,33402194,-4165066,5977896,-5215017,473099,5040608 },\n  { -20290863,8198642,-27410132,11602123,1290375,-2799760,28326862,1721092,-19558642,-3131606 },\n },\n},\n{\n {\n  { 7881532,10687937,7578723,7738378,-18951012,-2553952,21820786,8076149,-27868496,11538389 },\n  { -19935666,3899861,18283497,-6801568,-15728660,-11249211,8754525,7446702,-5676054,5797016 },\n  { -11295600,-3793569,-15782110,-7964573,12708869,-8456199,2014099,-9050574,-2369172,-5877341 },\n },\n {\n  { -22472376,-11568741,-27682020,1146375,18956691,16640559,1192730,-3714199,15123619,10811505 },\n  { 14352098,-3419715,-18942044,10822655,32750596,4699007,-70363,15776356,-28886779,-11974553 },\n  { -28241164,-8072475,-4978962,-5315317,29416931,1847569,-20654173,-16484855,4714547,-9600655 },\n },\n {\n  { 15200332,8368572,19679101,15970074,-31872674,1959451,24611599,-4543832,-11745876,12340220 },\n  { 12876937,-10480056,33134381,6590940,-6307776,14872440,9613953,8241152,15370987,9608631 },\n  { -4143277,-12014408,8446281,-391603,4407738,13629032,-7724868,15866074,-28210621,-8814099 },\n },\n {\n  { 26660628,-15677655,8393734,358047,-7401291,992988,-23904233,858697,20571223,8420556 },\n  { 14620715,13067227,-15447274,8264467,14106269,15080814,33531827,12516406,-21574435,-12476749 },\n  { 236881,10476226,57258,-14677024,6472998,2466984,17258519,7256740,8791136,15069930 },\n },\n {\n  { 1276410,-9371918,22949635,-16322807,-23493039,-5702186,14711875,4874229,-30663140,-2331391 },\n  { 5855666,4990204,-13711848,7294284,-7804282,1924647,-1423175,-7912378,-33069337,9234253 },\n  { 20590503,-9018988,31529744,-7352666,-2706834,10650548,31559055,-11609587,18979186,13396066 },\n },\n {\n  { 24474287,4968103,22267082,4407354,24063882,-8325180,-18816887,13594782,33514650,7021958 },\n  { -11566906,-6565505,-21365085,15928892,-26158305,4315421,-25948728,-3916677,-21480480,12868082 },\n  { -28635013,13504661,19988037,-2132761,21078225,6443208,-21446107,2244500,-12455797,-8089383 },\n },\n {\n  { -30595528,13793479,-5852820,319136,-25723172,-6263899,33086546,8957937,-15233648,5540521 },\n  { -11630176,-11503902,-8119500,-7643073,2620056,1022908,-23710744,-1568984,-16128528,-14962807 },\n  { 23152971,775386,27395463,14006635,-9701118,4649512,1689819,892185,-11513277,-15205948 },\n },\n {\n  { 9770129,9586738,26496094,4324120,1556511,-3550024,27453819,4763127,-19179614,5867134 },\n  { -32765025,1927590,31726409,-4753295,23962434,-16019500,27846559,5931263,-29749703,-16108455 },\n  { 27461885,-2977536,22380810,1815854,-23033753,-3031938,7283490,-15148073,-19526700,7734629 },\n },\n},\n{\n {\n  { -8010264,-9590817,-11120403,6196038,29344158,-13430885,7585295,-3176626,18549497,15302069 },\n  { -32658337,-6171222,-7672793,-11051681,6258878,13504381,10458790,-6418461,-8872242,8424746 },\n  { 24687205,8613276,-30667046,-3233545,1863892,-1830544,19206234,7134917,-11284482,-828919 },\n },\n {\n  { 11334899,-9218022,8025293,12707519,17523892,-10476071,10243738,-14685461,-5066034,16498837 },\n  { 8911542,6887158,-9584260,-6958590,11145641,-9543680,17303925,-14124238,6536641,10543906 },\n  { -28946384,15479763,-17466835,568876,-1497683,11223454,-2669190,-16625574,-27235709,8876771 },\n },\n {\n  { -25742899,-12566864,-15649966,-846607,-33026686,-796288,-33481822,15824474,-604426,-9039817 },\n  { 10330056,70051,7957388,-9002667,9764902,15609756,27698697,-4890037,1657394,3084098 },\n  { 10477963,-7470260,12119566,-13250805,29016247,-5365589,31280319,14396151,-30233575,15272409 },\n },\n {\n  { -12288309,3169463,28813183,16658753,25116432,-5630466,-25173957,-12636138,-25014757,1950504 },\n  { -26180358,9489187,11053416,-14746161,-31053720,5825630,-8384306,-8767532,15341279,8373727 },\n  { 28685821,7759505,-14378516,-12002860,-31971820,4079242,298136,-10232602,-2878207,15190420 },\n },\n {\n  { -32932876,13806336,-14337485,-15794431,-24004620,10940928,8669718,2742393,-26033313,-6875003 },\n  { -1580388,-11729417,-25979658,-11445023,-17411874,-10912854,9291594,-16247779,-12154742,6048605 },\n  { -30305315,14843444,1539301,11864366,20201677,1900163,13934231,5128323,11213262,9168384 },\n },\n {\n  { -26280513,11007847,19408960,-940758,-18592965,-4328580,-5088060,-11105150,20470157,-16398701 },\n  { -23136053,9282192,14855179,-15390078,-7362815,-14408560,-22783952,14461608,14042978,5230683 },\n  { 29969567,-2741594,-16711867,-8552442,9175486,-2468974,21556951,3506042,-5933891,-12449708 },\n },\n {\n  { -3144746,8744661,19704003,4581278,-20430686,6830683,-21284170,8971513,-28539189,15326563 },\n  { -19464629,10110288,-17262528,-3503892,-23500387,1355669,-15523050,15300988,-20514118,9168260 },\n  { -5353335,4488613,-23803248,16314347,7780487,-15638939,-28948358,9601605,33087103,-9011387 },\n },\n {\n  { -19443170,-15512900,-20797467,-12445323,-29824447,10229461,-27444329,-15000531,-5996870,15664672 },\n  { 23294591,-16632613,-22650781,-8470978,27844204,11461195,13099750,-2460356,18151676,13417686 },\n  { -24722913,-4176517,-31150679,5988919,-26858785,6685065,1661597,-12551441,15271676,-15452665 },\n },\n},\n{\n {\n  { 11433042,-13228665,8239631,-5279517,-1985436,-725718,-18698764,2167544,-6921301,-13440182 },\n  { -31436171,15575146,30436815,12192228,-22463353,9395379,-9917708,-8638997,12215110,12028277 },\n  { 14098400,6555944,23007258,5757252,-15427832,-12950502,30123440,4617780,-16900089,-655628 },\n },\n {\n  { -4026201,-15240835,11893168,13718664,-14809462,1847385,-15819999,10154009,23973261,-12684474 },\n  { -26531820,-3695990,-1908898,2534301,-31870557,-16550355,18341390,-11419951,32013174,-10103539 },\n  { -25479301,10876443,-11771086,-14625140,-12369567,1838104,21911214,6354752,4425632,-837822 },\n },\n {\n  { -10433389,-14612966,22229858,-3091047,-13191166,776729,-17415375,-12020462,4725005,14044970 },\n  { 19268650,-7304421,1555349,8692754,-21474059,-9910664,6347390,-1411784,-19522291,-16109756 },\n  { -24864089,12986008,-10898878,-5558584,-11312371,-148526,19541418,8180106,9282262,10282508 },\n },\n {\n  { -26205082,4428547,-8661196,-13194263,4098402,-14165257,15522535,8372215,5542595,-10702683 },\n  { -10562541,14895633,26814552,-16673850,-17480754,-2489360,-2781891,6993761,-18093885,10114655 },\n  { -20107055,-929418,31422704,10427861,-7110749,6150669,-29091755,-11529146,25953725,-106158 },\n },\n {\n  { -4234397,-8039292,-9119125,3046000,2101609,-12607294,19390020,6094296,-3315279,12831125 },\n  { -15998678,7578152,5310217,14408357,-33548620,-224739,31575954,6326196,7381791,-2421839 },\n  { -20902779,3296811,24736065,-16328389,18374254,7318640,6295303,8082724,-15362489,12339664 },\n },\n {\n  { 27724736,2291157,6088201,-14184798,1792727,5857634,13848414,15768922,25091167,14856294 },\n  { -18866652,8331043,24373479,8541013,-701998,-9269457,12927300,-12695493,-22182473,-9012899 },\n  { -11423429,-5421590,11632845,3405020,30536730,-11674039,-27260765,13866390,30146206,9142070 },\n },\n {\n  { 3924129,-15307516,-13817122,-10054960,12291820,-668366,-27702774,9326384,-8237858,4171294 },\n  { -15921940,16037937,6713787,16606682,-21612135,2790944,26396185,3731949,345228,-5462949 },\n  { -21327538,13448259,25284571,1143661,20614966,-8849387,2031539,-12391231,-16253183,-13582083 },\n },\n {\n  { 31016211,-16722429,26371392,-14451233,-5027349,14854137,17477601,3842657,28012650,-16405420 },\n  { -5075835,9368966,-8562079,-4600902,-15249953,6970560,-9189873,16292057,-8867157,3507940 },\n  { 29439664,3537914,23333589,6997794,-17555561,-11018068,-15209202,-15051267,-9164929,6580396 },\n },\n},\n{\n {\n  { -12185861,-7679788,16438269,10826160,-8696817,-6235611,17860444,-9273846,-2095802,9304567 },\n  { 20714564,-4336911,29088195,7406487,11426967,-5095705,14792667,-14608617,5289421,-477127 },\n  { -16665533,-10650790,-6160345,-13305760,9192020,-1802462,17271490,12349094,26939669,-3752294 },\n },\n {\n  { -12889898,9373458,31595848,16374215,21471720,13221525,-27283495,-12348559,-3698806,117887 },\n  { 22263325,-6560050,3984570,-11174646,-15114008,-566785,28311253,5358056,-23319780,541964 },\n  { 16259219,3261970,2309254,-15534474,-16885711,-4581916,24134070,-16705829,-13337066,-13552195 },\n },\n {\n  { 9378160,-13140186,-22845982,-12745264,28198281,-7244098,-2399684,-717351,690426,14876244 },\n  { 24977353,-314384,-8223969,-13465086,28432343,-1176353,-13068804,-12297348,-22380984,6618999 },\n  { -1538174,11685646,12944378,13682314,-24389511,-14413193,8044829,-13817328,32239829,-5652762 },\n },\n {\n  { -18603066,4762990,-926250,8885304,-28412480,-3187315,9781647,-10350059,32779359,5095274 },\n  { -33008130,-5214506,-32264887,-3685216,9460461,-9327423,-24601656,14506724,21639561,-2630236 },\n  { -16400943,-13112215,25239338,15531969,3987758,-4499318,-1289502,-6863535,17874574,558605 },\n },\n {\n  { -13600129,10240081,9171883,16131053,-20869254,9599700,33499487,5080151,2085892,5119761 },\n  { -22205145,-2519528,-16381601,414691,-25019550,2170430,30634760,-8363614,-31999993,-5759884 },\n  { -6845704,15791202,8550074,-1312654,29928809,-12092256,27534430,-7192145,-22351378,12961482 },\n },\n {\n  { -24492060,-9570771,10368194,11582341,-23397293,-2245287,16533930,8206996,-30194652,-5159638 },\n  { -11121496,-3382234,2307366,6362031,-135455,8868177,-16835630,7031275,7589640,8945490 },\n  { -32152748,8917967,6661220,-11677616,-1192060,-15793393,7251489,-11182180,24099109,-14456170 },\n },\n {\n  { 5019558,-7907470,4244127,-14714356,-26933272,6453165,-19118182,-13289025,-6231896,-10280736 },\n  { 10853594,10721687,26480089,5861829,-22995819,1972175,-1866647,-10557898,-3363451,-6441124 },\n  { -17002408,5906790,221599,-6563147,7828208,-13248918,24362661,-2008168,-13866408,7421392 },\n },\n {\n  { 8139927,-6546497,32257646,-5890546,30375719,1886181,-21175108,15441252,28826358,-4123029 },\n  { 6267086,9695052,7709135,-16603597,-32869068,-1886135,14795160,-7840124,13746021,-1742048 },\n  { 28584902,7787108,-6732942,-15050729,22846041,-7571236,-3181936,-363524,4771362,-8419958 },\n },\n},\n{\n {\n  { 24949256,6376279,-27466481,-8174608,-18646154,-9930606,33543569,-12141695,3569627,11342593 },\n  { 26514989,4740088,27912651,3697550,19331575,-11472339,6809886,4608608,7325975,-14801071 },\n  { -11618399,-14554430,-24321212,7655128,-1369274,5214312,-27400540,10258390,-17646694,-8186692 },\n },\n {\n  { 11431204,15823007,26570245,14329124,18029990,4796082,-31446179,15580664,9280358,-3973687 },\n  { -160783,-10326257,-22855316,-4304997,-20861367,-13621002,-32810901,-11181622,-15545091,4387441 },\n  { -20799378,12194512,3937617,-5805892,-27154820,9340370,-24513992,8548137,20617071,-7482001 },\n },\n {\n  { -938825,-3930586,-8714311,16124718,24603125,-6225393,-13775352,-11875822,24345683,10325460 },\n  { -19855277,-1568885,-22202708,8714034,14007766,6928528,16318175,-1010689,4766743,3552007 },\n  { -21751364,-16730916,1351763,-803421,-4009670,3950935,3217514,14481909,10988822,-3994762 },\n },\n {\n  { 15564307,-14311570,3101243,5684148,30446780,-8051356,12677127,-6505343,-8295852,13296005 },\n  { -9442290,6624296,-30298964,-11913677,-4670981,-2057379,31521204,9614054,-30000824,12074674 },\n  { 4771191,-135239,14290749,-13089852,27992298,14998318,-1413936,-1556716,29832613,-16391035 },\n },\n {\n  { 7064884,-7541174,-19161962,-5067537,-18891269,-2912736,25825242,5293297,-27122660,13101590 },\n  { -2298563,2439670,-7466610,1719965,-27267541,-16328445,32512469,-5317593,-30356070,-4190957 },\n  { -30006540,10162316,-33180176,3981723,-16482138,-13070044,14413974,9515896,19568978,9628812 },\n },\n {\n  { 33053803,199357,15894591,1583059,27380243,-4580435,-17838894,-6106839,-6291786,3437740 },\n  { -18978877,3884493,19469877,12726490,15913552,13614290,-22961733,70104,7463304,4176122 },\n  { -27124001,10659917,11482427,-16070381,12771467,-6635117,-32719404,-5322751,24216882,5944158 },\n },\n {\n  { 8894125,7450974,-2664149,-9765752,-28080517,-12389115,19345746,14680796,11632993,5847885 },\n  { 26942781,-2315317,9129564,-4906607,26024105,11769399,-11518837,6367194,-9727230,4782140 },\n  { 19916461,-4828410,-22910704,-11414391,25606324,-5972441,33253853,8220911,6358847,-1873857 },\n },\n {\n  { 801428,-2081702,16569428,11065167,29875704,96627,7908388,-4480480,-13538503,1387155 },\n  { 19646058,5720633,-11416706,12814209,11607948,12749789,14147075,15156355,-21866831,11835260 },\n  { 19299512,1155910,28703737,14890794,2925026,7269399,26121523,15467869,-26560550,5052483 },\n },\n},\n{\n {\n  { -3017432,10058206,1980837,3964243,22160966,12322533,-6431123,-12618185,12228557,-7003677 },\n  { 32944382,14922211,-22844894,5188528,21913450,-8719943,4001465,13238564,-6114803,8653815 },\n  { 22865569,-4652735,27603668,-12545395,14348958,8234005,24808405,5719875,28483275,2841751 },\n },\n {\n  { -16420968,-1113305,-327719,-12107856,21886282,-15552774,-1887966,-315658,19932058,-12739203 },\n  { -11656086,10087521,-8864888,-5536143,-19278573,-3055912,3999228,13239134,-4777469,-13910208 },\n  { 1382174,-11694719,17266790,9194690,-13324356,9720081,20403944,11284705,-14013818,3093230 },\n },\n {\n  { 16650921,-11037932,-1064178,1570629,-8329746,7352753,-302424,16271225,-24049421,-6691850 },\n  { -21911077,-5927941,-4611316,-5560156,-31744103,-10785293,24123614,15193618,-21652117,-16739389 },\n  { -9935934,-4289447,-25279823,4372842,2087473,10399484,31870908,14690798,17361620,11864968 },\n },\n {\n  { -11307610,6210372,13206574,5806320,-29017692,-13967200,-12331205,-7486601,-25578460,-16240689 },\n  { 14668462,-12270235,26039039,15305210,25515617,4542480,10453892,6577524,9145645,-6443880 },\n  { 5974874,3053895,-9433049,-10385191,-31865124,3225009,-7972642,3936128,-5652273,-3050304 },\n },\n {\n  { 30625386,-4729400,-25555961,-12792866,-20484575,7695099,17097188,-16303496,-27999779,1803632 },\n  { -3553091,9865099,-5228566,4272701,-5673832,-16689700,14911344,12196514,-21405489,7047412 },\n  { 20093277,9920966,-11138194,-5343857,13161587,12044805,-32856851,4124601,-32343828,-10257566 },\n },\n {\n  { -20788824,14084654,-13531713,7842147,19119038,-13822605,4752377,-8714640,-21679658,2288038 },\n  { -26819236,-3283715,29965059,3039786,-14473765,2540457,29457502,14625692,-24819617,12570232 },\n  { -1063558,-11551823,16920318,12494842,1278292,-5869109,-21159943,-3498680,-11974704,4724943 },\n },\n {\n  { 17960970,-11775534,-4140968,-9702530,-8876562,-1410617,-12907383,-8659932,-29576300,1903856 },\n  { 23134274,-14279132,-10681997,-1611936,20684485,15770816,-12989750,3190296,26955097,14109738 },\n  { 15308788,5320727,-30113809,-14318877,22902008,7767164,29425325,-11277562,31960942,11934971 },\n },\n {\n  { -27395711,8435796,4109644,12222639,-24627868,14818669,20638173,4875028,10491392,1379718 },\n  { -13159415,9197841,3875503,-8936108,-1383712,-5879801,33518459,16176658,21432314,12180697 },\n  { -11787308,11500838,13787581,-13832590,-22430679,10140205,1465425,12689540,-10301319,-13872883 },\n },\n},\n{\n {\n  { 5414091,-15386041,-21007664,9643570,12834970,1186149,-2622916,-1342231,26128231,6032912 },\n  { -26337395,-13766162,32496025,-13653919,17847801,-12669156,3604025,8316894,-25875034,-10437358 },\n  { 3296484,6223048,24680646,-12246460,-23052020,5903205,-8862297,-4639164,12376617,3188849 },\n },\n {\n  { 29190488,-14659046,27549113,-1183516,3520066,-10697301,32049515,-7309113,-16109234,-9852307 },\n  { -14744486,-9309156,735818,-598978,-20407687,-5057904,25246078,-15795669,18640741,-960977 },\n  { -6928835,-16430795,10361374,5642961,4910474,12345252,-31638386,-494430,10530747,1053335 },\n },\n {\n  { -29265967,-14186805,-13538216,-12117373,-19457059,-10655384,-31462369,-2948985,24018831,15026644 },\n  { -22592535,-3145277,-2289276,5953843,-13440189,9425631,25310643,13003497,-2314791,-15145616 },\n  { -27419985,-603321,-8043984,-1669117,-26092265,13987819,-27297622,187899,-23166419,-2531735 },\n },\n {\n  { -21744398,-13810475,1844840,5021428,-10434399,-15911473,9716667,16266922,-5070217,726099 },\n  { 29370922,-6053998,7334071,-15342259,9385287,2247707,-13661962,-4839461,30007388,-15823341 },\n  { -936379,16086691,23751945,-543318,-1167538,-5189036,9137109,730663,9835848,4555336 },\n },\n {\n  { -23376435,1410446,-22253753,-12899614,30867635,15826977,17693930,544696,-11985298,12422646 },\n  { 31117226,-12215734,-13502838,6561947,-9876867,-12757670,-5118685,-4096706,29120153,13924425 },\n  { -17400879,-14233209,19675799,-2734756,-11006962,-5858820,-9383939,-11317700,7240931,-237388 },\n },\n {\n  { -31361739,-11346780,-15007447,-5856218,-22453340,-12152771,1222336,4389483,3293637,-15551743 },\n  { -16684801,-14444245,11038544,11054958,-13801175,-3338533,-24319580,7733547,12796905,-6335822 },\n  { -8759414,-10817836,-25418864,10783769,-30615557,-9746811,-28253339,3647836,3222231,-11160462 },\n },\n {\n  { 18606113,1693100,-25448386,-15170272,4112353,10045021,23603893,-2048234,-7550776,2484985 },\n  { 9255317,-3131197,-12156162,-1004256,13098013,-9214866,16377220,-2102812,-19802075,-3034702 },\n  { -22729289,7496160,-5742199,11329249,19991973,-3347502,-31718148,9936966,-30097688,-10618797 },\n },\n {\n  { 21878590,-5001297,4338336,13643897,-3036865,13160960,19708896,5415497,-7360503,-4109293 },\n  { 27736861,10103576,12500508,8502413,-3413016,-9633558,10436918,-1550276,-23659143,-8132100 },\n  { 19492550,-12104365,-29681976,-852630,-3208171,12403437,30066266,8367329,13243957,8709688 },\n },\n},\n{\n {\n  { 12015105,2801261,28198131,10151021,24818120,-4743133,-11194191,-5645734,5150968,7274186 },\n  { 2831366,-12492146,1478975,6122054,23825128,-12733586,31097299,6083058,31021603,-9793610 },\n  { -2529932,-2229646,445613,10720828,-13849527,-11505937,-23507731,16354465,15067285,-14147707 },\n },\n {\n  { 7840942,14037873,-33364863,15934016,-728213,-3642706,21403988,1057586,-19379462,-12403220 },\n  { 915865,-16469274,15608285,-8789130,-24357026,6060030,-17371319,8410997,-7220461,16527025 },\n  { 32922597,-556987,20336074,-16184568,10903705,-5384487,16957574,52992,23834301,6588044 },\n },\n {\n  { 32752030,11232950,3381995,-8714866,22652988,-10744103,17159699,16689107,-20314580,-1305992 },\n  { -4689649,9166776,-25710296,-10847306,11576752,12733943,7924251,-2752281,1976123,-7249027 },\n  { 21251222,16309901,-2983015,-6783122,30810597,12967303,156041,-3371252,12331345,-8237197 },\n },\n {\n  { 8651614,-4477032,-16085636,-4996994,13002507,2950805,29054427,-5106970,10008136,-4667901 },\n  { 31486080,15114593,-14261250,12951354,14369431,-7387845,16347321,-13662089,8684155,-10532952 },\n  { 19443825,11385320,24468943,-9659068,-23919258,2187569,-26263207,-6086921,31316348,14219878 },\n },\n {\n  { -28594490,1193785,32245219,11392485,31092169,15722801,27146014,6992409,29126555,9207390 },\n  { 32382935,1110093,18477781,11028262,-27411763,-7548111,-4980517,10843782,-7957600,-14435730 },\n  { 2814918,7836403,27519878,-7868156,-20894015,-11553689,-21494559,8550130,28346258,1994730 },\n },\n {\n  { -19578299,8085545,-14000519,-3948622,2785838,-16231307,-19516951,7174894,22628102,8115180 },\n  { -30405132,955511,-11133838,-15078069,-32447087,-13278079,-25651578,3317160,-9943017,930272 },\n  { -15303681,-6833769,28856490,1357446,23421993,1057177,24091212,-1388970,-22765376,-10650715 },\n },\n {\n  { -22751231,-5303997,-12907607,-12768866,-15811511,-7797053,-14839018,-16554220,-1867018,8398970 },\n  { -31969310,2106403,-4736360,1362501,12813763,16200670,22981545,-6291273,18009408,-15772772 },\n  { -17220923,-9545221,-27784654,14166835,29815394,7444469,29551787,-3727419,19288549,1325865 },\n },\n {\n  { 15100157,-15835752,-23923978,-1005098,-26450192,15509408,12376730,-3479146,33166107,-8042750 },\n  { 20909231,13023121,-9209752,16251778,-5778415,-8094914,12412151,10018715,2213263,-13878373 },\n  { 32529814,-11074689,30361439,-16689753,-9135940,1513226,22922121,6382134,-5766928,8371348 },\n },\n},\n{\n {\n  { 9923462,11271500,12616794,3544722,-29998368,-1721626,12891687,-8193132,-26442943,10486144 },\n  { -22597207,-7012665,8587003,-8257861,4084309,-12970062,361726,2610596,-23921530,-11455195 },\n  { 5408411,-1136691,-4969122,10561668,24145918,14240566,31319731,-4235541,19985175,-3436086 },\n },\n {\n  { -13994457,16616821,14549246,3341099,32155958,13648976,-17577068,8849297,65030,8370684 },\n  { -8320926,-12049626,31204563,5839400,-20627288,-1057277,-19442942,6922164,12743482,-9800518 },\n  { -2361371,12678785,28815050,4759974,-23893047,4884717,23783145,11038569,18800704,255233 },\n },\n {\n  { -5269658,-1773886,13957886,7990715,23132995,728773,13393847,9066957,19258688,-14753793 },\n  { -2936654,-10827535,-10432089,14516793,-3640786,4372541,-31934921,2209390,-1524053,2055794 },\n  { 580882,16705327,5468415,-2683018,-30926419,-14696000,-7203346,-8994389,-30021019,7394435 },\n },\n {\n  { 23838809,1822728,-15738443,15242727,8318092,-3733104,-21672180,-3492205,-4821741,14799921 },\n  { 13345610,9759151,3371034,-16137791,16353039,8577942,31129804,13496856,-9056018,7402518 },\n  { 2286874,-4435931,-20042458,-2008336,-13696227,5038122,11006906,-15760352,8205061,1607563 },\n },\n {\n  { 14414086,-8002132,3331830,-3208217,22249151,-5594188,18364661,-2906958,30019587,-9029278 },\n  { -27688051,1585953,-10775053,931069,-29120221,-11002319,-14410829,12029093,9944378,8024 },\n  { 4368715,-3709630,29874200,-15022983,-20230386,-11410704,-16114594,-999085,-8142388,5640030 },\n },\n {\n  { 10299610,13746483,11661824,16234854,7630238,5998374,9809887,-16694564,15219798,-14327783 },\n  { 27425505,-5719081,3055006,10660664,23458024,595578,-15398605,-1173195,-18342183,9742717 },\n  { 6744077,2427284,26042789,2720740,-847906,1118974,32324614,7406442,12420155,1994844 },\n },\n {\n  { 14012521,-5024720,-18384453,-9578469,-26485342,-3936439,-13033478,-10909803,24319929,-6446333 },\n  { 16412690,-4507367,10772641,15929391,-17068788,-4658621,10555945,-10484049,-30102368,-4739048 },\n  { 22397382,-7767684,-9293161,-12792868,17166287,-9755136,-27333065,6199366,21880021,-12250760 },\n },\n {\n  { -4283307,5368523,-31117018,8163389,-30323063,3209128,16557151,8890729,8840445,4957760 },\n  { -15447727,709327,-6919446,-10870178,-29777922,6522332,-21720181,12130072,-14796503,5005757 },\n  { -2114751,-14308128,23019042,15765735,-25269683,6002752,10183197,-13239326,-16395286,-2176112 },\n },\n},\n{\n {\n  { -19025756,1632005,13466291,-7995100,-23640451,16573537,-32013908,-3057104,22208662,2000468 },\n  { 3065073,-1412761,-25598674,-361432,-17683065,-5703415,-8164212,11248527,-3691214,-7414184 },\n  { 10379208,-6045554,8877319,1473647,-29291284,-12507580,16690915,2553332,-3132688,16400289 },\n },\n {\n  { 15716668,1254266,-18472690,7446274,-8448918,6344164,-22097271,-7285580,26894937,9132066 },\n  { 24158887,12938817,11085297,-8177598,-28063478,-4457083,-30576463,64452,-6817084,-2692882 },\n  { 13488534,7794716,22236231,5989356,25426474,-12578208,2350710,-3418511,-4688006,2364226 },\n },\n {\n  { 16335052,9132434,25640582,6678888,1725628,8517937,-11807024,-11697457,15445875,-7798101 },\n  { 29004207,-7867081,28661402,-640412,-12794003,-7943086,31863255,-4135540,-278050,-15759279 },\n  { -6122061,-14866665,-28614905,14569919,-10857999,-3591829,10343412,-6976290,-29828287,-10815811 },\n },\n {\n  { 27081650,3463984,14099042,-4517604,1616303,-6205604,29542636,15372179,17293797,960709 },\n  { 20263915,11434237,-5765435,11236810,13505955,-10857102,-16111345,6493122,-19384511,7639714 },\n  { -2830798,-14839232,25403038,-8215196,-8317012,-16173699,18006287,-16043750,29994677,-15808121 },\n },\n {\n  { 9769828,5202651,-24157398,-13631392,-28051003,-11561624,-24613141,-13860782,-31184575,709464 },\n  { 12286395,13076066,-21775189,-1176622,-25003198,4057652,-32018128,-8890874,16102007,13205847 },\n  { 13733362,5599946,10557076,3195751,-5557991,8536970,-25540170,8525972,10151379,10394400 },\n },\n {\n  { 4024660,-16137551,22436262,12276534,-9099015,-2686099,19698229,11743039,-33302334,8934414 },\n  { -15879800,-4525240,-8580747,-2934061,14634845,-698278,-9449077,3137094,-11536886,11721158 },\n  { 17555939,-5013938,8268606,2331751,-22738815,9761013,9319229,8835153,-9205489,-1280045 },\n },\n {\n  { -461409,-7830014,20614118,16688288,-7514766,-4807119,22300304,505429,6108462,-6183415 },\n  { -5070281,12367917,-30663534,3234473,32617080,-8422642,29880583,-13483331,-26898490,-7867459 },\n  { -31975283,5726539,26934134,10237677,-3173717,-605053,24199304,3795095,7592688,-14992079 },\n },\n {\n  { 21594432,-14964228,17466408,-4077222,32537084,2739898,6407723,12018833,-28256052,4298412 },\n  { -20650503,-11961496,-27236275,570498,3767144,-1717540,13891942,-1569194,13717174,10805743 },\n  { -14676630,-15644296,15287174,11927123,24177847,-8175568,-796431,14860609,-26938930,-5863836 },\n },\n},\n{\n {\n  { 12962541,5311799,-10060768,11658280,18855286,-7954201,13286263,-12808704,-4381056,9882022 },\n  { 18512079,11319350,-20123124,15090309,18818594,5271736,-22727904,3666879,-23967430,-3299429 },\n  { -6789020,-3146043,16192429,13241070,15898607,-14206114,-10084880,-6661110,-2403099,5276065 },\n },\n {\n  { 30169808,-5317648,26306206,-11750859,27814964,7069267,7152851,3684982,1449224,13082861 },\n  { 10342826,3098505,2119311,193222,25702612,12233820,23697382,15056736,-21016438,-8202000 },\n  { -33150110,3261608,22745853,7948688,19370557,-15177665,-26171976,6482814,-10300080,-11060101 },\n },\n {\n  { 32869458,-5408545,25609743,15678670,-10687769,-15471071,26112421,2521008,-22664288,6904815 },\n  { 29506923,4457497,3377935,-9796444,-30510046,12935080,1561737,3841096,-29003639,-6657642 },\n  { 10340844,-6630377,-18656632,-2278430,12621151,-13339055,30878497,-11824370,-25584551,5181966 },\n },\n {\n  { 25940115,-12658025,17324188,-10307374,-8671468,15029094,24396252,-16450922,-2322852,-12388574 },\n  { -21765684,9916823,-1300409,4079498,-1028346,11909559,1782390,12641087,20603771,-6561742 },\n  { -18882287,-11673380,24849422,11501709,13161720,-4768874,1925523,11914390,4662781,7820689 },\n },\n {\n  { 12241050,-425982,8132691,9393934,32846760,-1599620,29749456,12172924,16136752,15264020 },\n  { -10349955,-14680563,-8211979,2330220,-17662549,-14545780,10658213,6671822,19012087,3772772 },\n  { 3753511,-3421066,10617074,2028709,14841030,-6721664,28718732,-15762884,20527771,12988982 },\n },\n {\n  { -14822485,-5797269,-3707987,12689773,-898983,-10914866,-24183046,-10564943,3299665,-12424953 },\n  { -16777703,-15253301,-9642417,4978983,3308785,8755439,6943197,6461331,-25583147,8991218 },\n  { -17226263,1816362,-1673288,-6086439,31783888,-8175991,-32948145,7417950,-30242287,1507265 },\n },\n {\n  { 29692663,6829891,-10498800,4334896,20945975,-11906496,-28887608,8209391,14606362,-10647073 },\n  { -3481570,8707081,32188102,5672294,22096700,1711240,-33020695,9761487,4170404,-2085325 },\n  { -11587470,14855945,-4127778,-1531857,-26649089,15084046,22186522,16002000,-14276837,-8400798 },\n },\n {\n  { -4811456,13761029,-31703877,-2483919,-3312471,7869047,-7113572,-9620092,13240845,10965870 },\n  { -7742563,-8256762,-14768334,-13656260,-23232383,12387166,4498947,14147411,29514390,4302863 },\n  { -13413405,-12407859,20757302,-13801832,14785143,8976368,-5061276,-2144373,17846988,-13971927 },\n },\n},\n{\n {\n  { -2244452,-754728,-4597030,-1066309,-6247172,1455299,-21647728,-9214789,-5222701,12650267 },\n  { -9906797,-16070310,21134160,12198166,-27064575,708126,387813,13770293,-19134326,10958663 },\n  { 22470984,12369526,23446014,-5441109,-21520802,-9698723,-11772496,-11574455,-25083830,4271862 },\n },\n {\n  { -25169565,-10053642,-19909332,15361595,-5984358,2159192,75375,-4278529,-32526221,8469673 },\n  { 15854970,4148314,-8893890,7259002,11666551,13824734,-30531198,2697372,24154791,-9460943 },\n  { 15446137,-15806644,29759747,14019369,30811221,-9610191,-31582008,12840104,24913809,9815020 },\n },\n {\n  { -4709286,-5614269,-31841498,-12288893,-14443537,10799414,-9103676,13438769,18735128,9466238 },\n  { 11933045,9281483,5081055,-5183824,-2628162,-4905629,-7727821,-10896103,-22728655,16199064 },\n  { 14576810,379472,-26786533,-8317236,-29426508,-10812974,-102766,1876699,30801119,2164795 },\n },\n {\n  { 15995086,3199873,13672555,13712240,-19378835,-4647646,-13081610,-15496269,-13492807,1268052 },\n  { -10290614,-3659039,-3286592,10948818,23037027,3794475,-3470338,-12600221,-17055369,3565904 },\n  { 29210088,-9419337,-5919792,-4952785,10834811,-13327726,-16512102,-10820713,-27162222,-14030531 },\n },\n {\n  { -13161890,15508588,16663704,-8156150,-28349942,9019123,-29183421,-3769423,2244111,-14001979 },\n  { -5152875,-3800936,-9306475,-6071583,16243069,14684434,-25673088,-16180800,13491506,4641841 },\n  { 10813417,643330,-19188515,-728916,30292062,-16600078,27548447,-7721242,14476989,-12767431 },\n },\n {\n  { 10292079,9984945,6481436,8279905,-7251514,7032743,27282937,-1644259,-27912810,12651324 },\n  { -31185513,-813383,22271204,11835308,10201545,15351028,17099662,3988035,21721536,-3148940 },\n  { 10202177,-6545839,-31373232,-9574638,-32150642,-8119683,-12906320,3852694,13216206,14842320 },\n },\n {\n  { -15815640,-10601066,-6538952,-7258995,-6984659,-6581778,-31500847,13765824,-27434397,9900184 },\n  { 14465505,-13833331,-32133984,-14738873,-27443187,12990492,33046193,15796406,-7051866,-8040114 },\n  { 30924417,-8279620,6359016,-12816335,16508377,9071735,-25488601,15413635,9524356,-7018878 },\n },\n {\n  { 12274201,-13175547,32627641,-1785326,6736625,13267305,5237659,-5109483,15663516,4035784 },\n  { -2951309,8903985,17349946,601635,-16432815,-4612556,-13732739,-15889334,-22258478,4659091 },\n  { -16916263,-4952973,-30393711,-15158821,20774812,15897498,5736189,15026997,-2178256,-13455585 },\n },\n},\n{\n {\n  { -8858980,-2219056,28571666,-10155518,-474467,-10105698,-3801496,278095,23440562,-290208 },\n  { 10226241,-5928702,15139956,120818,-14867693,5218603,32937275,11551483,-16571960,-7442864 },\n  { 17932739,-12437276,-24039557,10749060,11316803,7535897,22503767,5561594,-3646624,3898661 },\n },\n {\n  { 7749907,-969567,-16339731,-16464,-25018111,15122143,-1573531,7152530,21831162,1245233 },\n  { 26958459,-14658026,4314586,8346991,-5677764,11960072,-32589295,-620035,-30402091,-16716212 },\n  { -12165896,9166947,33491384,13673479,29787085,13096535,6280834,14587357,-22338025,13987525 },\n },\n {\n  { -24349909,7778775,21116000,15572597,-4833266,-5357778,-4300898,-5124639,-7469781,-2858068 },\n  { 9681908,-6737123,-31951644,13591838,-6883821,386950,31622781,6439245,-14581012,4091397 },\n  { -8426427,1470727,-28109679,-1596990,3978627,-5123623,-19622683,12092163,29077877,-14741988 },\n },\n {\n  { 5269168,-6859726,-13230211,-8020715,25932563,1763552,-5606110,-5505881,-20017847,2357889 },\n  { 32264008,-15407652,-5387735,-1160093,-2091322,-3946900,23104804,-12869908,5727338,189038 },\n  { 14609123,-8954470,-6000566,-16622781,-14577387,-7743898,-26745169,10942115,-25888931,-14884697 },\n },\n {\n  { 20513500,5557931,-15604613,7829531,26413943,-2019404,-21378968,7471781,13913677,-5137875 },\n  { -25574376,11967826,29233242,12948236,-6754465,4713227,-8940970,14059180,12878652,8511905 },\n  { -25656801,3393631,-2955415,-7075526,-2250709,9366908,-30223418,6812974,5568676,-3127656 },\n },\n {\n  { 11630004,12144454,2116339,13606037,27378885,15676917,-17408753,-13504373,-14395196,8070818 },\n  { 27117696,-10007378,-31282771,-5570088,1127282,12772488,-29845906,10483306,-11552749,-1028714 },\n  { 10637467,-5688064,5674781,1072708,-26343588,-6982302,-1683975,9177853,-27493162,15431203 },\n },\n {\n  { 20525145,10892566,-12742472,12779443,-29493034,16150075,-28240519,14943142,-15056790,-7935931 },\n  { -30024462,5626926,-551567,-9981087,753598,11981191,25244767,-3239766,-3356550,9594024 },\n  { -23752644,2636870,-5163910,-10103818,585134,7877383,11345683,-6492290,13352335,-10977084 },\n },\n {\n  { -1931799,-5407458,3304649,-12884869,17015806,-4877091,-29783850,-7752482,-13215537,-319204 },\n  { 20239939,6607058,6203985,3483793,-18386976,-779229,-20723742,15077870,-22750759,14523817 },\n  { 27406042,-6041657,27423596,-4497394,4996214,10002360,-28842031,-4545494,-30172742,-4805667 },\n },\n},\n{\n {\n  { 11374242,12660715,17861383,-12540833,10935568,1099227,-13886076,-9091740,-27727044,11358504 },\n  { -12730809,10311867,1510375,10778093,-2119455,-9145702,32676003,11149336,-26123651,4985768 },\n  { -19096303,341147,-6197485,-239033,15756973,-8796662,-983043,13794114,-19414307,-15621255 },\n },\n {\n  { 6490081,11940286,25495923,-7726360,8668373,-8751316,3367603,6970005,-1691065,-9004790 },\n  { 1656497,13457317,15370807,6364910,13605745,8362338,-19174622,-5475723,-16796596,-5031438 },\n  { -22273315,-13524424,-64685,-4334223,-18605636,-10921968,-20571065,-7007978,-99853,-10237333 },\n },\n {\n  { 17747465,10039260,19368299,-4050591,-20630635,-16041286,31992683,-15857976,-29260363,-5511971 },\n  { 31932027,-4986141,-19612382,16366580,22023614,88450,11371999,-3744247,4882242,-10626905 },\n  { 29796507,37186,19818052,10115756,-11829032,3352736,18551198,3272828,-5190932,-4162409 },\n },\n {\n  { 12501286,4044383,-8612957,-13392385,-32430052,5136599,-19230378,-3529697,330070,-3659409 },\n  { 6384877,2899513,17807477,7663917,-2358888,12363165,25366522,-8573892,-271295,12071499 },\n  { -8365515,-4042521,25133448,-4517355,-6211027,2265927,-32769618,1936675,-5159697,3829363 },\n },\n {\n  { 28425966,-5835433,-577090,-4697198,-14217555,6870930,7921550,-6567787,26333140,14267664 },\n  { -11067219,11871231,27385719,-10559544,-4585914,-11189312,10004786,-8709488,-21761224,8930324 },\n  { -21197785,-16396035,25654216,-1725397,12282012,11008919,1541940,4757911,-26491501,-16408940 },\n },\n {\n  { 13537262,-7759490,-20604840,10961927,-5922820,-13218065,-13156584,6217254,-15943699,13814990 },\n  { -17422573,15157790,18705543,29619,24409717,-260476,27361681,9257833,-1956526,-1776914 },\n  { -25045300,-10191966,15366585,15166509,-13105086,8423556,-29171540,12361135,-18685978,4578290 },\n },\n {\n  { 24579768,3711570,1342322,-11180126,-27005135,14124956,-22544529,14074919,21964432,8235257 },\n  { -6528613,-2411497,9442966,-5925588,12025640,-1487420,-2981514,-1669206,13006806,2355433 },\n  { -16304899,-13605259,-6632427,-5142349,16974359,-10911083,27202044,1719366,1141648,-12796236 },\n },\n {\n  { -12863944,-13219986,-8318266,-11018091,-6810145,-4843894,13475066,-3133972,32674895,13715045 },\n  { 11423335,-5468059,32344216,8962751,24989809,9241752,-13265253,16086212,-28740881,-15642093 },\n  { -1409668,12530728,-6368726,10847387,19531186,-14132160,-11709148,7791794,-27245943,4383347 },\n },\n},\n{\n {\n  { -28970898,5271447,-1266009,-9736989,-12455236,16732599,-4862407,-4906449,27193557,6245191 },\n  { -15193956,5362278,-1783893,2695834,4960227,12840725,23061898,3260492,22510453,8577507 },\n  { -12632451,11257346,-32692994,13548177,-721004,10879011,31168030,13952092,-29571492,-3635906 },\n },\n {\n  { 3877321,-9572739,32416692,5405324,-11004407,-13656635,3759769,11935320,5611860,8164018 },\n  { -16275802,14667797,15906460,12155291,-22111149,-9039718,32003002,-8832289,5773085,-8422109 },\n  { -23788118,-8254300,1950875,8937633,18686727,16459170,-905725,12376320,31632953,190926 },\n },\n {\n  { -24593607,-16138885,-8423991,13378746,14162407,6901328,-8288749,4508564,-25341555,-3627528 },\n  { 8884438,-5884009,6023974,10104341,-6881569,-4941533,18722941,-14786005,-1672488,827625 },\n  { -32720583,-16289296,-32503547,7101210,13354605,2659080,-1800575,-14108036,-24878478,1541286 },\n },\n {\n  { 2901347,-1117687,3880376,-10059388,-17620940,-3612781,-21802117,-3567481,20456845,-1885033 },\n  { 27019610,12299467,-13658288,-1603234,-12861660,-4861471,-19540150,-5016058,29439641,15138866 },\n  { 21536104,-6626420,-32447818,-10690208,-22408077,5175814,-5420040,-16361163,7779328,109896 },\n },\n {\n  { 30279744,14648750,-8044871,6425558,13639621,-743509,28698390,12180118,23177719,-554075 },\n  { 26572847,3405927,-31701700,12890905,-19265668,5335866,-6493768,2378492,4439158,-13279347 },\n  { -22716706,3489070,-9225266,-332753,18875722,-1140095,14819434,-12731527,-17717757,-5461437 },\n },\n {\n  { -5056483,16566551,15953661,3767752,-10436499,15627060,-820954,2177225,8550082,-15114165 },\n  { -18473302,16596775,-381660,15663611,22860960,15585581,-27844109,-3582739,-23260460,-8428588 },\n  { -32480551,15707275,-8205912,-5652081,29464558,2713815,-22725137,15860482,-21902570,1494193 },\n },\n {\n  { -19562091,-14087393,-25583872,-9299552,13127842,759709,21923482,16529112,8742704,12967017 },\n  { -28464899,1553205,32536856,-10473729,-24691605,-406174,-8914625,-2933896,-29903758,15553883 },\n  { 21877909,3230008,9881174,10539357,-4797115,2841332,11543572,14513274,19375923,-12647961 },\n },\n {\n  { 8832269,-14495485,13253511,5137575,5037871,4078777,24880818,-6222716,2862653,9455043 },\n  { 29306751,5123106,20245049,-14149889,9592566,8447059,-2077124,-2990080,15511449,4789663 },\n  { -20679756,7004547,8824831,-9434977,-4045704,-3750736,-5754762,108893,23513200,16652362 },\n },\n},\n{\n {\n  { -33256173,4144782,-4476029,-6579123,10770039,-7155542,-6650416,-12936300,-18319198,10212860 },\n  { 2756081,8598110,7383731,-6859892,22312759,-1105012,21179801,2600940,-9988298,-12506466 },\n  { -24645692,13317462,-30449259,-15653928,21365574,-10869657,11344424,864440,-2499677,-16710063 },\n },\n {\n  { -26432803,6148329,-17184412,-14474154,18782929,-275997,-22561534,211300,2719757,4940997 },\n  { -1323882,3911313,-6948744,14759765,-30027150,7851207,21690126,8518463,26699843,5276295 },\n  { -13149873,-6429067,9396249,365013,24703301,-10488939,1321586,149635,-15452774,7159369 },\n },\n {\n  { 9987780,-3404759,17507962,9505530,9731535,-2165514,22356009,8312176,22477218,-8403385 },\n  { 18155857,-16504990,19744716,9006923,15154154,-10538976,24256460,-4864995,-22548173,9334109 },\n  { 2986088,-4911893,10776628,-3473844,10620590,-7083203,-21413845,14253545,-22587149,536906 },\n },\n {\n  { 4377756,8115836,24567078,15495314,11625074,13064599,7390551,10589625,10838060,-15420424 },\n  { -19342404,867880,9277171,-3218459,-14431572,-1986443,19295826,-15796950,6378260,699185 },\n  { 7895026,4057113,-7081772,-13077756,-17886831,-323126,-716039,15693155,-5045064,-13373962 },\n },\n {\n  { -7737563,-5869402,-14566319,-7406919,11385654,13201616,31730678,-10962840,-3918636,-9669325 },\n  { 10188286,-15770834,-7336361,13427543,22223443,14896287,30743455,7116568,-21786507,5427593 },\n  { 696102,13206899,27047647,-10632082,15285305,-9853179,10798490,-4578720,19236243,12477404 },\n },\n {\n  { -11229439,11243796,-17054270,-8040865,-788228,-8167967,-3897669,11180504,-23169516,7733644 },\n  { 17800790,-14036179,-27000429,-11766671,23887827,3149671,23466177,-10538171,10322027,15313801 },\n  { 26246234,11968874,32263343,-5468728,6830755,-13323031,-15794704,-101982,-24449242,10890804 },\n },\n {\n  { -31365647,10271363,-12660625,-6267268,16690207,-13062544,-14982212,16484931,25180797,-5334884 },\n  { -586574,10376444,-32586414,-11286356,19801893,10997610,2276632,9482883,316878,13820577 },\n  { -9882808,-4510367,-2115506,16457136,-11100081,11674996,30756178,-7515054,30696930,-3712849 },\n },\n {\n  { 32988917,-9603412,12499366,7910787,-10617257,-11931514,-7342816,-9985397,-32349517,7392473 },\n  { -8855661,15927861,9866406,-3649411,-2396914,-16655781,-30409476,-9134995,25112947,-2926644 },\n  { -2504044,-436966,25621774,-5678772,15085042,-5479877,-24884878,-13526194,5537438,-13914319 },\n },\n},\n{\n {\n  { -11225584,2320285,-9584280,10149187,-33444663,5808648,-14876251,-1729667,31234590,6090599 },\n  { -9633316,116426,26083934,2897444,-6364437,-2688086,609721,15878753,-6970405,-9034768 },\n  { -27757857,247744,-15194774,-9002551,23288161,-10011936,-23869595,6503646,20650474,1804084 },\n },\n {\n  { -27589786,15456424,8972517,8469608,15640622,4439847,3121995,-10329713,27842616,-202328 },\n  { -15306973,2839644,22530074,10026331,4602058,5048462,28248656,5031932,-11375082,12714369 },\n  { 20807691,-7270825,29286141,11421711,-27876523,-13868230,-21227475,1035546,-19733229,12796920 },\n },\n {\n  { 12076899,-14301286,-8785001,-11848922,-25012791,16400684,-17591495,-12899438,3480665,-15182815 },\n  { -32361549,5457597,28548107,7833186,7303070,-11953545,-24363064,-15921875,-33374054,2771025 },\n  { -21389266,421932,26597266,6860826,22486084,-6737172,-17137485,-4210226,-24552282,15673397 },\n },\n {\n  { -20184622,2338216,19788685,-9620956,-4001265,-8740893,-20271184,4733254,3727144,-12934448 },\n  { 6120119,814863,-11794402,-622716,6812205,-15747771,2019594,7975683,31123697,-10958981 },\n  { 30069250,-11435332,30434654,2958439,18399564,-976289,12296869,9204260,-16432438,9648165 },\n },\n {\n  { 32705432,-1550977,30705658,7451065,-11805606,9631813,3305266,5248604,-26008332,-11377501 },\n  { 17219865,2375039,-31570947,-5575615,-19459679,9219903,294711,15298639,2662509,-16297073 },\n  { -1172927,-7558695,-4366770,-4287744,-21346413,-8434326,32087529,-1222777,32247248,-14389861 },\n },\n {\n  { 14312628,1221556,17395390,-8700143,-4945741,-8684635,-28197744,-9637817,-16027623,-13378845 },\n  { -1428825,-9678990,-9235681,6549687,-7383069,-468664,23046502,9803137,17597934,2346211 },\n  { 18510800,15337574,26171504,981392,-22241552,7827556,-23491134,-11323352,3059833,-11782870 },\n },\n {\n  { 10141598,6082907,17829293,-1947643,9830092,13613136,-25556636,-5544586,-33502212,3592096 },\n  { 33114168,-15889352,-26525686,-13343397,33076705,8716171,1151462,1521897,-982665,-6837803 },\n  { -32939165,-4255815,23947181,-324178,-33072974,-12305637,-16637686,3891704,26353178,693168 },\n },\n {\n  { 30374239,1595580,-16884039,13186931,4600344,406904,9585294,-400668,31375464,14369965 },\n  { -14370654,-7772529,1510301,6434173,-18784789,-6262728,32732230,-13108839,17901441,16011505 },\n  { 18171223,-11934626,-12500402,15197122,-11038147,-15230035,-19172240,-16046376,8764035,12309598 },\n },\n},\n{\n {\n  { 5975908,-5243188,-19459362,-9681747,-11541277,14015782,-23665757,1228319,17544096,-10593782 },\n  { 5811932,-1715293,3442887,-2269310,-18367348,-8359541,-18044043,-15410127,-5565381,12348900 },\n  { -31399660,11407555,25755363,6891399,-3256938,14872274,-24849353,8141295,-10632534,-585479 },\n },\n {\n  { -12675304,694026,-5076145,13300344,14015258,-14451394,-9698672,-11329050,30944593,1130208 },\n  { 8247766,-6710942,-26562381,-7709309,-14401939,-14648910,4652152,2488540,23550156,-271232 },\n  { 17294316,-3788438,7026748,15626851,22990044,113481,2267737,-5908146,-408818,-137719 },\n },\n {\n  { 16091085,-16253926,18599252,7340678,2137637,-1221657,-3364161,14550936,3260525,-7166271 },\n  { -4910104,-13332887,18550887,10864893,-16459325,-7291596,-23028869,-13204905,-12748722,2701326 },\n  { -8574695,16099415,4629974,-16340524,-20786213,-6005432,-10018363,9276971,11329923,1862132 },\n },\n {\n  { 14763076,-15903608,-30918270,3689867,3511892,10313526,-21951088,12219231,-9037963,-940300 },\n  { 8894987,-3446094,6150753,3013931,301220,15693451,-31981216,-2909717,-15438168,11595570 },\n  { 15214962,3537601,-26238722,-14058872,4418657,-15230761,13947276,10730794,-13489462,-4363670 },\n },\n {\n  { -2538306,7682793,32759013,263109,-29984731,-7955452,-22332124,-10188635,977108,699994 },\n  { -12466472,4195084,-9211532,550904,-15565337,12917920,19118110,-439841,-30534533,-14337913 },\n  { 31788461,-14507657,4799989,7372237,8808585,-14747943,9408237,-10051775,12493932,-5409317 },\n },\n {\n  { -25680606,5260744,-19235809,-6284470,-3695942,16566087,27218280,2607121,29375955,6024730 },\n  { 842132,-2794693,-4763381,-8722815,26332018,-12405641,11831880,6985184,-9940361,2854096 },\n  { -4847262,-7969331,2516242,-5847713,9695691,-7221186,16512645,960770,12121869,16648078 },\n },\n {\n  { -15218652,14667096,-13336229,2013717,30598287,-464137,-31504922,-7882064,20237806,2838411 },\n  { -19288047,4453152,15298546,-16178388,22115043,-15972604,12544294,-13470457,1068881,-12499905 },\n  { -9558883,-16518835,33238498,13506958,30505848,-1114596,-8486907,-2630053,12521378,4845654 },\n },\n {\n  { -28198521,10744108,-2958380,10199664,7759311,-13088600,3409348,-873400,-6482306,-12885870 },\n  { -23561822,6230156,-20382013,10655314,-24040585,-11621172,10477734,-1240216,-3113227,13974498 },\n  { 12966261,15550616,-32038948,-1615346,21025980,-629444,5642325,7188737,18895762,12629579 },\n },\n},\n{\n {\n  { 14741879,-14946887,22177208,-11721237,1279741,8058600,11758140,789443,32195181,3895677 },\n  { 10758205,15755439,-4509950,9243698,-4879422,6879879,-2204575,-3566119,-8982069,4429647 },\n  { -2453894,15725973,-20436342,-10410672,-5803908,-11040220,-7135870,-11642895,18047436,-15281743 },\n },\n {\n  { -25173001,-11307165,29759956,11776784,-22262383,-15820455,10993114,-12850837,-17620701,-9408468 },\n  { 21987233,700364,-24505048,14972008,-7774265,-5718395,32155026,2581431,-29958985,8773375 },\n  { -25568350,454463,-13211935,16126715,25240068,8594567,20656846,12017935,-7874389,-13920155 },\n },\n {\n  { 6028182,6263078,-31011806,-11301710,-818919,2461772,-31841174,-5468042,-1721788,-2776725 },\n  { -12278994,16624277,987579,-5922598,32908203,1248608,7719845,-4166698,28408820,6816612 },\n  { -10358094,-8237829,19549651,-12169222,22082623,16147817,20613181,13982702,-10339570,5067943 },\n },\n {\n  { -30505967,-3821767,12074681,13582412,-19877972,2443951,-19719286,12746132,5331210,-10105944 },\n  { 30528811,3601899,-1957090,4619785,-27361822,-15436388,24180793,-12570394,27679908,-1648928 },\n  { 9402404,-13957065,32834043,10838634,-26580150,-13237195,26653274,-8685565,22611444,-12715406 },\n },\n {\n  { 22190590,1118029,22736441,15130463,-30460692,-5991321,19189625,-4648942,4854859,6622139 },\n  { -8310738,-2953450,-8262579,-3388049,-10401731,-271929,13424426,-3567227,26404409,13001963 },\n  { -31241838,-15415700,-2994250,8939346,11562230,-12840670,-26064365,-11621720,-15405155,11020693 },\n },\n {\n  { 1866042,-7949489,-7898649,-10301010,12483315,13477547,3175636,-12424163,28761762,1406734 },\n  { -448555,-1777666,13018551,3194501,-9580420,-11161737,24760585,-4347088,25577411,-13378680 },\n  { -24290378,4759345,-690653,-1852816,2066747,10693769,-29595790,9884936,-9368926,4745410 },\n },\n {\n  { -9141284,6049714,-19531061,-4341411,-31260798,9944276,-15462008,-11311852,10931924,-11931931 },\n  { -16561513,14112680,-8012645,4817318,-8040464,-11414606,-22853429,10856641,-20470770,13434654 },\n  { 22759489,-10073434,-16766264,-1871422,13637442,-10168091,1765144,-12654326,28445307,-5364710 },\n },\n {\n  { 29875063,12493613,2795536,-3786330,1710620,15181182,-10195717,-8788675,9074234,1167180 },\n  { -26205683,11014233,-9842651,-2635485,-26908120,7532294,-18716888,-9535498,3843903,9367684 },\n  { -10969595,-6403711,9591134,9582310,11349256,108879,16235123,8601684,-139197,4242895 },\n },\n},\n{\n {\n  { 22092954,-13191123,-2042793,-11968512,32186753,-11517388,-6574341,2470660,-27417366,16625501 },\n  { -11057722,3042016,13770083,-9257922,584236,-544855,-7770857,2602725,-27351616,14247413 },\n  { 6314175,-10264892,-32772502,15957557,-10157730,168750,-8618807,14290061,27108877,-1180880 },\n },\n {\n  { -8586597,-7170966,13241782,10960156,-32991015,-13794596,33547976,-11058889,-27148451,981874 },\n  { 22833440,9293594,-32649448,-13618667,-9136966,14756819,-22928859,-13970780,-10479804,-16197962 },\n  { -7768587,3326786,-28111797,10783824,19178761,14905060,22680049,13906969,-15933690,3797899 },\n },\n {\n  { 21721356,-4212746,-12206123,9310182,-3882239,-13653110,23740224,-2709232,20491983,-8042152 },\n  { 9209270,-15135055,-13256557,-6167798,-731016,15289673,25947805,15286587,30997318,-6703063 },\n  { 7392032,16618386,23946583,-8039892,-13265164,-1533858,-14197445,-2321576,17649998,-250080 },\n },\n {\n  { -9301088,-14193827,30609526,-3049543,-25175069,-1283752,-15241566,-9525724,-2233253,7662146 },\n  { -17558673,1763594,-33114336,15908610,-30040870,-12174295,7335080,-8472199,-3174674,3440183 },\n  { -19889700,-5977008,-24111293,-9688870,10799743,-16571957,40450,-4431835,4862400,1133 },\n },\n {\n  { -32856209,-7873957,-5422389,14860950,-16319031,7956142,7258061,311861,-30594991,-7379421 },\n  { -3773428,-1565936,28985340,7499440,24445838,9325937,29727763,16527196,18278453,15405622 },\n  { -4381906,8508652,-19898366,-3674424,-5984453,15149970,-13313598,843523,-21875062,13626197 },\n },\n {\n  { 2281448,-13487055,-10915418,-2609910,1879358,16164207,-10783882,3953792,13340839,15928663 },\n  { 31727126,-7179855,-18437503,-8283652,2875793,-16390330,-25269894,-7014826,-23452306,5964753 },\n  { 4100420,-5959452,-17179337,6017714,-18705837,12227141,-26684835,11344144,2538215,-7570755 },\n },\n {\n  { -9433605,6123113,11159803,-2156608,30016280,14966241,-20474983,1485421,-629256,-15958862 },\n  { -26804558,4260919,11851389,9658551,-32017107,16367492,-20205425,-13191288,11659922,-11115118 },\n  { 26180396,10015009,-30844224,-8581293,5418197,9480663,2231568,-10170080,33100372,-1306171 },\n },\n {\n  { 15121113,-5201871,-10389905,15427821,-27509937,-15992507,21670947,4486675,-5931810,-14466380 },\n  { 16166486,-9483733,-11104130,6023908,-31926798,-1364923,2340060,-16254968,-10735770,-10039824 },\n  { 28042865,-3557089,-12126526,12259706,-3717498,-6945899,6766453,-8689599,18036436,5803270 },\n },\n},\n{\n {\n  { -817581,6763912,11803561,1585585,10958447,-2671165,23855391,4598332,-6159431,-14117438 },\n  { -31031306,-14256194,17332029,-2383520,31312682,-5967183,696309,50292,-20095739,11763584 },\n  { -594563,-2514283,-32234153,12643980,12650761,14811489,665117,-12613632,-19773211,-10713562 },\n },\n {\n  { 30464590,-11262872,-4127476,-12734478,19835327,-7105613,-24396175,2075773,-17020157,992471 },\n  { 18357185,-6994433,7766382,16342475,-29324918,411174,14578841,8080033,-11574335,-10601610 },\n  { 19598397,10334610,12555054,2555664,18821899,-10339780,21873263,16014234,26224780,16452269 },\n },\n {\n  { -30223925,5145196,5944548,16385966,3976735,2009897,-11377804,-7618186,-20533829,3698650 },\n  { 14187449,3448569,-10636236,-10810935,-22663880,-3433596,7268410,-10890444,27394301,12015369 },\n  { 19695761,16087646,28032085,12999827,6817792,11427614,20244189,-1312777,-13259127,-3402461 },\n },\n {\n  { 30860103,12735208,-1888245,-4699734,-16974906,2256940,-8166013,12298312,-8550524,-10393462 },\n  { -5719826,-11245325,-1910649,15569035,26642876,-7587760,-5789354,-15118654,-4976164,12651793 },\n  { -2848395,9953421,11531313,-5282879,26895123,-12697089,-13118820,-16517902,9768698,-2533218 },\n },\n {\n  { -24719459,1894651,-287698,-4704085,15348719,-8156530,32767513,12765450,4940095,10678226 },\n  { 18860224,15980149,-18987240,-1562570,-26233012,-11071856,-7843882,13944024,-24372348,16582019 },\n  { -15504260,4970268,-29893044,4175593,-20993212,-2199756,-11704054,15444560,-11003761,7989037 },\n },\n {\n  { 31490452,5568061,-2412803,2182383,-32336847,4531686,-32078269,6200206,-19686113,-14800171 },\n  { -17308668,-15879940,-31522777,-2831,-32887382,16375549,8680158,-16371713,28550068,-6857132 },\n  { -28126887,-5688091,16837845,-1820458,-6850681,12700016,-30039981,4364038,1155602,5988841 },\n },\n {\n  { 21890435,-13272907,-12624011,12154349,-7831873,15300496,23148983,-4470481,24618407,8283181 },\n  { -33136107,-10512751,9975416,6841041,-31559793,16356536,3070187,-7025928,1466169,10740210 },\n  { -1509399,-15488185,-13503385,-10655916,32799044,909394,-13938903,-5779719,-32164649,-15327040 },\n },\n {\n  { 3960823,-14267803,-28026090,-15918051,-19404858,13146868,15567327,951507,-3260321,-573935 },\n  { 24740841,5052253,-30094131,8961361,25877428,6165135,-24368180,14397372,-7380369,-6144105 },\n  { -28888365,3510803,-28103278,-1158478,-11238128,-10631454,-15441463,-14453128,-1625486,-6494814 },\n },\n},\n{\n {\n  { 793299,-9230478,8836302,-6235707,-27360908,-2369593,33152843,-4885251,-9906200,-621852 },\n  { 5666233,525582,20782575,-8038419,-24538499,14657740,16099374,1468826,-6171428,-15186581 },\n  { -4859255,-3779343,-2917758,-6748019,7778750,11688288,-30404353,-9871238,-1558923,-9863646 },\n },\n {\n  { 10896332,-7719704,824275,472601,-19460308,3009587,25248958,14783338,-30581476,-15757844 },\n  { 10566929,12612572,-31944212,11118703,-12633376,12362879,21752402,8822496,24003793,14264025 },\n  { 27713862,-7355973,-11008240,9227530,27050101,2504721,23886875,-13117525,13958495,-5732453 },\n },\n {\n  { -23481610,4867226,-27247128,3900521,29838369,-8212291,-31889399,-10041781,7340521,-15410068 },\n  { 4646514,-8011124,-22766023,-11532654,23184553,8566613,31366726,-1381061,-15066784,-10375192 },\n  { -17270517,12723032,-16993061,14878794,21619651,-6197576,27584817,3093888,-8843694,3849921 },\n },\n {\n  { -9064912,2103172,25561640,-15125738,-5239824,9582958,32477045,-9017955,5002294,-15550259 },\n  { -12057553,-11177906,21115585,-13365155,8808712,-12030708,16489530,13378448,-25845716,12741426 },\n  { -5946367,10645103,-30911586,15390284,-3286982,-7118677,24306472,15852464,28834118,-7646072 },\n },\n {\n  { -17335748,-9107057,-24531279,9434953,-8472084,-583362,-13090771,455841,20461858,5491305 },\n  { 13669248,-16095482,-12481974,-10203039,-14569770,-11893198,-24995986,11293807,-28588204,-9421832 },\n  { 28497928,6272777,-33022994,14470570,8906179,-1225630,18504674,-14165166,29867745,-8795943 },\n },\n {\n  { -16207023,13517196,-27799630,-13697798,24009064,-6373891,-6367600,-13175392,22853429,-4012011 },\n  { 24191378,16712145,-13931797,15217831,14542237,1646131,18603514,-11037887,12876623,-2112447 },\n  { 17902668,4518229,-411702,-2829247,26878217,5258055,-12860753,608397,16031844,3723494 },\n },\n {\n  { -28632773,12763728,-20446446,7577504,33001348,-13017745,17558842,-7872890,23896954,-4314245 },\n  { -20005381,-12011952,31520464,605201,2543521,5991821,-2945064,7229064,-9919646,-8826859 },\n  { 28816045,298879,-28165016,-15920938,19000928,-1665890,-12680833,-2949325,-18051778,-2082915 },\n },\n {\n  { 16000882,-344896,3493092,-11447198,-29504595,-13159789,12577740,16041268,-19715240,7847707 },\n  { 10151868,10572098,27312476,7922682,14825339,4723128,-32855931,-6519018,-10020567,3852848 },\n  { -11430470,15697596,-21121557,-4420647,5386314,15063598,16514493,-15932110,29330899,-15076224 },\n },\n},\n{\n {\n  { -25499735,-4378794,-15222908,-6901211,16615731,2051784,3303702,15490,-27548796,12314391 },\n  { 15683520,-6003043,18109120,-9980648,15337968,-5997823,-16717435,15921866,16103996,-3731215 },\n  { -23169824,-10781249,13588192,-1628807,-3798557,-1074929,-19273607,5402699,-29815713,-9841101 },\n },\n {\n  { 23190676,2384583,-32714340,3462154,-29903655,-1529132,-11266856,8911517,-25205859,2739713 },\n  { 21374101,-3554250,-33524649,9874411,15377179,11831242,-33529904,6134907,4931255,11987849 },\n  { -7732,-2978858,-16223486,7277597,105524,-322051,-31480539,13861388,-30076310,10117930 },\n },\n {\n  { -29501170,-10744872,-26163768,13051539,-25625564,5089643,-6325503,6704079,12890019,15728940 },\n  { -21972360,-11771379,-951059,-4418840,14704840,2695116,903376,-10428139,12885167,8311031 },\n  { -17516482,5352194,10384213,-13811658,7506451,13453191,26423267,4384730,1888765,-5435404 },\n },\n {\n  { -25817338,-3107312,-13494599,-3182506,30896459,-13921729,-32251644,-12707869,-19464434,-3340243 },\n  { -23607977,-2665774,-526091,4651136,5765089,4618330,6092245,14845197,17151279,-9854116 },\n  { -24830458,-12733720,-15165978,10367250,-29530908,-265356,22825805,-7087279,-16866484,16176525 },\n },\n {\n  { -23583256,6564961,20063689,3798228,-4740178,7359225,2006182,-10363426,-28746253,-10197509 },\n  { -10626600,-4486402,-13320562,-5125317,3432136,-6393229,23632037,-1940610,32808310,1099883 },\n  { 15030977,5768825,-27451236,-2887299,-6427378,-15361371,-15277896,-6809350,2051441,-15225865 },\n },\n {\n  { -3362323,-7239372,7517890,9824992,23555850,295369,5148398,-14154188,-22686354,16633660 },\n  { 4577086,-16752288,13249841,-15304328,19958763,-14537274,18559670,-10759549,8402478,-9864273 },\n  { -28406330,-1051581,-26790155,-907698,-17212414,-11030789,9453451,-14980072,17983010,9967138 },\n },\n {\n  { -25762494,6524722,26585488,9969270,24709298,1220360,-1677990,7806337,17507396,3651560 },\n  { -10420457,-4118111,14584639,15971087,-15768321,8861010,26556809,-5574557,-18553322,-11357135 },\n  { 2839101,14284142,4029895,3472686,14402957,12689363,-26642121,8459447,-5605463,-7621941 },\n },\n {\n  { -4839289,-3535444,9744961,2871048,25113978,3187018,-25110813,-849066,17258084,-7977739 },\n  { 18164541,-10595176,-17154882,-1542417,19237078,-9745295,23357533,-15217008,26908270,12150756 },\n  { -30264870,-7647865,5112249,-7036672,-1499807,-6974257,43168,-5537701,-32302074,16215819 },\n },\n},\n{\n {\n  { -6898905,9824394,-12304779,-4401089,-31397141,-6276835,32574489,12532905,-7503072,-8675347 },\n  { -27343522,-16515468,-27151524,-10722951,946346,16291093,254968,7168080,21676107,-1943028 },\n  { 21260961,-8424752,-16831886,-11920822,-23677961,3968121,-3651949,-6215466,-3556191,-7913075 },\n },\n {\n  { 16544754,13250366,-16804428,15546242,-4583003,12757258,-2462308,-8680336,-18907032,-9662799 },\n  { -2415239,-15577728,18312303,4964443,-15272530,-12653564,26820651,16690659,25459437,-4564609 },\n  { -25144690,11425020,28423002,-11020557,-6144921,-15826224,9142795,-2391602,-6432418,-1644817 },\n },\n {\n  { -23104652,6253476,16964147,-3768872,-25113972,-12296437,-27457225,-16344658,6335692,7249989 },\n  { -30333227,13979675,7503222,-12368314,-11956721,-4621693,-30272269,2682242,25993170,-12478523 },\n  { 4364628,5930691,32304656,-10044554,-8054781,15091131,22857016,-10598955,31820368,15075278 },\n },\n {\n  { 31879134,-8918693,17258761,90626,-8041836,-4917709,24162788,-9650886,-17970238,12833045 },\n  { 19073683,14851414,-24403169,-11860168,7625278,11091125,-19619190,2074449,-9413939,14905377 },\n  { 24483667,-11935567,-2518866,-11547418,-1553130,15355506,-25282080,9253129,27628530,-7555480 },\n },\n {\n  { 17597607,8340603,19355617,552187,26198470,-3176583,4593324,-9157582,-14110875,15297016 },\n  { 510886,14337390,-31785257,16638632,6328095,2713355,-20217417,-11864220,8683221,2921426 },\n  { 18606791,11874196,27155355,-5281482,-24031742,6265446,-25178240,-1278924,4674690,13890525 },\n },\n {\n  { 13609624,13069022,-27372361,-13055908,24360586,9592974,14977157,9835105,4389687,288396 },\n  { 9922506,-519394,13613107,5883594,-18758345,-434263,-12304062,8317628,23388070,16052080 },\n  { 12720016,11937594,-31970060,-5028689,26900120,8561328,-20155687,-11632979,-14754271,-10812892 },\n },\n {\n  { 15961858,14150409,26716931,-665832,-22794328,13603569,11829573,7467844,-28822128,929275 },\n  { 11038231,-11582396,-27310482,-7316562,-10498527,-16307831,-23479533,-9371869,-21393143,2465074 },\n  { 20017163,-4323226,27915242,1529148,12396362,15675764,13817261,-9658066,2463391,-4622140 },\n },\n {\n  { -16358878,-12663911,-12065183,4996454,-1256422,1073572,9583558,12851107,4003896,12673717 },\n  { -1731589,-15155870,-3262930,16143082,19294135,13385325,14741514,-9103726,7903886,2348101 },\n  { 24536016,-16515207,12715592,-3862155,1511293,10047386,-3842346,-7129159,-28377538,10048127 },\n },\n},\n{\n {\n  { -12622226,-6204820,30718825,2591312,-10617028,12192840,18873298,-7297090,-32297756,15221632 },\n  { -26478122,-11103864,11546244,-1852483,9180880,7656409,-21343950,2095755,29769758,6593415 },\n  { -31994208,-2907461,4176912,3264766,12538965,-868111,26312345,-6118678,30958054,8292160 },\n },\n {\n  { 31429822,-13959116,29173532,15632448,12174511,-2760094,32808831,3977186,26143136,-3148876 },\n  { 22648901,1402143,-22799984,13746059,7936347,365344,-8668633,-1674433,-3758243,-2304625 },\n  { -15491917,8012313,-2514730,-12702462,-23965846,-10254029,-1612713,-1535569,-16664475,8194478 },\n },\n {\n  { 27338066,-7507420,-7414224,10140405,-19026427,-6589889,27277191,8855376,28572286,3005164 },\n  { 26287124,4821776,25476601,-4145903,-3764513,-15788984,-18008582,1182479,-26094821,-13079595 },\n  { -7171154,3178080,23970071,6201893,-17195577,-4489192,-21876275,-13982627,32208683,-1198248 },\n },\n {\n  { -16657702,2817643,-10286362,14811298,6024667,13349505,-27315504,-10497842,-27672585,-11539858 },\n  { 15941029,-9405932,-21367050,8062055,31876073,-238629,-15278393,-1444429,15397331,-4130193 },\n  { 8934485,-13485467,-23286397,-13423241,-32446090,14047986,31170398,-1441021,-27505566,15087184 },\n },\n {\n  { -18357243,-2156491,24524913,-16677868,15520427,-6360776,-15502406,11461896,16788528,-5868942 },\n  { -1947386,16013773,21750665,3714552,-17401782,-16055433,-3770287,-10323320,31322514,-11615635 },\n  { 21426655,-5650218,-13648287,-5347537,-28812189,-4920970,-18275391,-14621414,13040862,-12112948 },\n },\n {\n  { 11293895,12478086,-27136401,15083750,-29307421,14748872,14555558,-13417103,1613711,4896935 },\n  { -25894883,15323294,-8489791,-8057900,25967126,-13425460,2825960,-4897045,-23971776,-11267415 },\n  { -15924766,-5229880,-17443532,6410664,3622847,10243618,20615400,12405433,-23753030,-8436416 },\n },\n {\n  { -7091295,12556208,-20191352,9025187,-17072479,4333801,4378436,2432030,23097949,-566018 },\n  { 4565804,-16025654,20084412,-7842817,1724999,189254,24767264,10103221,-18512313,2424778 },\n  { 366633,-11976806,8173090,-6890119,30788634,5745705,-7168678,1344109,-3642553,12412659 },\n },\n {\n  { -24001791,7690286,14929416,-168257,-32210835,-13412986,24162697,-15326504,-3141501,11179385 },\n  { 18289522,-14724954,8056945,16430056,-21729724,7842514,-6001441,-1486897,-18684645,-11443503 },\n  { 476239,6601091,-6152790,-9723375,17503545,-4863900,27672959,13403813,11052904,5219329 },\n },\n},\n{\n {\n  { 20678546,-8375738,-32671898,8849123,-5009758,14574752,31186971,-3973730,9014762,-8579056 },\n  { -13644050,-10350239,-15962508,5075808,-1514661,-11534600,-33102500,9160280,8473550,-3256838 },\n  { 24900749,14435722,17209120,-15292541,-22592275,9878983,-7689309,-16335821,-24568481,11788948 },\n },\n {\n  { -3118155,-11395194,-13802089,14797441,9652448,-6845904,-20037437,10410733,-24568470,-1458691 },\n  { -15659161,16736706,-22467150,10215878,-9097177,7563911,11871841,-12505194,-18513325,8464118 },\n  { -23400612,8348507,-14585951,-861714,-3950205,-6373419,14325289,8628612,33313881,-8370517 },\n },\n {\n  { -20186973,-4967935,22367356,5271547,-1097117,-4788838,-24805667,-10236854,-8940735,-5818269 },\n  { -6948785,-1795212,-32625683,-16021179,32635414,-7374245,15989197,-12838188,28358192,-4253904 },\n  { -23561781,-2799059,-32351682,-1661963,-9147719,10429267,-16637684,4072016,-5351664,5596589 },\n },\n {\n  { -28236598,-3390048,12312896,6213178,3117142,16078565,29266239,2557221,1768301,15373193 },\n  { -7243358,-3246960,-4593467,-7553353,-127927,-912245,-1090902,-4504991,-24660491,3442910 },\n  { -30210571,5124043,14181784,8197961,18964734,-11939093,22597931,7176455,-18585478,13365930 },\n },\n {\n  { -7877390,-1499958,8324673,4690079,6261860,890446,24538107,-8570186,-9689599,-3031667 },\n  { 25008904,-10771599,-4305031,-9638010,16265036,15721635,683793,-11823784,15723479,-15163481 },\n  { -9660625,12374379,-27006999,-7026148,-7724114,-12314514,11879682,5400171,519526,-1235876 },\n },\n {\n  { 22258397,-16332233,-7869817,14613016,-22520255,-2950923,-20353881,7315967,16648397,7605640 },\n  { -8081308,-8464597,-8223311,9719710,19259459,-15348212,23994942,-5281555,-9468848,4763278 },\n  { -21699244,9220969,-15730624,1084137,-25476107,-2852390,31088447,-7764523,-11356529,728112 },\n },\n {\n  { 26047220,-11751471,-6900323,-16521798,24092068,9158119,-4273545,-12555558,-29365436,-5498272 },\n  { 17510331,-322857,5854289,8403524,17133918,-3112612,-28111007,12327945,10750447,10014012 },\n  { -10312768,3936952,9156313,-8897683,16498692,-994647,-27481051,-666732,3424691,7540221 },\n },\n {\n  { 30322361,-6964110,11361005,-4143317,7433304,4989748,-7071422,-16317219,-9244265,15258046 },\n  { 13054562,-2779497,19155474,469045,-12482797,4566042,5631406,2711395,1062915,-5136345 },\n  { -19240248,-11254599,-29509029,-7499965,-5835763,13005411,-6066489,12194497,32960380,1459310 },\n },\n},\n{\n {\n  { 19852034,7027924,23669353,10020366,8586503,-6657907,394197,-6101885,18638003,-11174937 },\n  { 31395534,15098109,26581030,8030562,-16527914,-5007134,9012486,-7584354,-6643087,-5442636 },\n  { -9192165,-2347377,-1997099,4529534,25766844,607986,-13222,9677543,-32294889,-6456008 },\n },\n {\n  { -2444496,-149937,29348902,8186665,1873760,12489863,-30934579,-7839692,-7852844,-8138429 },\n  { -15236356,-15433509,7766470,746860,26346930,-10221762,-27333451,10754588,-9431476,5203576 },\n  { 31834314,14135496,-770007,5159118,20917671,-16768096,-7467973,-7337524,31809243,7347066 },\n },\n {\n  { -9606723,-11874240,20414459,13033986,13716524,-11691881,19797970,-12211255,15192876,-2087490 },\n  { -12663563,-2181719,1168162,-3804809,26747877,-14138091,10609330,12694420,33473243,-13382104 },\n  { 33184999,11180355,15832085,-11385430,-1633671,225884,15089336,-11023903,-6135662,14480053 },\n },\n {\n  { 31308717,-5619998,31030840,-1897099,15674547,-6582883,5496208,13685227,27595050,8737275 },\n  { -20318852,-15150239,10933843,-16178022,8335352,-7546022,-31008351,-12610604,26498114,66511 },\n  { 22644454,-8761729,-16671776,4884562,-3105614,-13559366,30540766,-4286747,-13327787,-7515095 },\n },\n {\n  { -28017847,9834845,18617207,-2681312,-3401956,-13307506,8205540,13585437,-17127465,15115439 },\n  { 23711543,-672915,31206561,-8362711,6164647,-9709987,-33535882,-1426096,8236921,16492939 },\n  { -23910559,-13515526,-26299483,-4503841,25005590,-7687270,19574902,10071562,6708380,-6222424 },\n },\n {\n  { 2101391,-4930054,19702731,2367575,-15427167,1047675,5301017,9328700,29955601,-11678310 },\n  { 3096359,9271816,-21620864,-15521844,-14847996,-7592937,-25892142,-12635595,-9917575,6216608 },\n  { -32615849,338663,-25195611,2510422,-29213566,-13820213,24822830,-6146567,-26767480,7525079 },\n },\n {\n  { -23066649,-13985623,16133487,-7896178,-3389565,778788,-910336,-2782495,-19386633,11994101 },\n  { 21691500,-13624626,-641331,-14367021,3285881,-3483596,-25064666,9718258,-7477437,13381418 },\n  { 18445390,-4202236,14979846,11622458,-1727110,-3582980,23111648,-6375247,28535282,15779576 },\n },\n {\n  { 30098053,3089662,-9234387,16662135,-21306940,11308411,-14068454,12021730,9955285,-16303356 },\n  { 9734894,-14576830,-7473633,-9138735,2060392,11313496,-18426029,9924399,20194861,13380996 },\n  { -26378102,-7965207,-22167821,15789297,-18055342,-6168792,-1984914,15707771,26342023,10146099 },\n },\n},\n{\n {\n  { -26016874,-219943,21339191,-41388,19745256,-2878700,-29637280,2227040,21612326,-545728 },\n  { -13077387,1184228,23562814,-5970442,-20351244,-6348714,25764461,12243797,-20856566,11649658 },\n  { -10031494,11262626,27384172,2271902,26947504,-15997771,39944,6114064,33514190,2333242 },\n },\n {\n  { -21433588,-12421821,8119782,7219913,-21830522,-9016134,-6679750,-12670638,24350578,-13450001 },\n  { -4116307,-11271533,-23886186,4843615,-30088339,690623,-31536088,-10406836,8317860,12352766 },\n  { 18200138,-14475911,-33087759,-2696619,-23702521,-9102511,-23552096,-2287550,20712163,6719373 },\n },\n {\n  { 26656208,6075253,-7858556,1886072,-28344043,4262326,11117530,-3763210,26224235,-3297458 },\n  { -17168938,-14854097,-3395676,-16369877,-19954045,14050420,21728352,9493610,18620611,-16428628 },\n  { -13323321,13325349,11432106,5964811,18609221,6062965,-5269471,-9725556,-30701573,-16479657 },\n },\n {\n  { -23860538,-11233159,26961357,1640861,-32413112,-16737940,12248509,-5240639,13735342,1934062 },\n  { 25089769,6742589,17081145,-13406266,21909293,-16067981,-15136294,-3765346,-21277997,5473616 },\n  { 31883677,-7961101,1083432,-11572403,22828471,13290673,-7125085,12469656,29111212,-5451014 },\n },\n {\n  { 24244947,-15050407,-26262976,2791540,-14997599,16666678,24367466,6388839,-10295587,452383 },\n  { -25640782,-3417841,5217916,16224624,19987036,-4082269,-24236251,-5915248,15766062,8407814 },\n  { -20406999,13990231,15495425,16395525,5377168,15166495,-8917023,-4388953,-8067909,2276718 },\n },\n {\n  { 30157918,12924066,-17712050,9245753,19895028,3368142,-23827587,5096219,22740376,-7303417 },\n  { 2041139,-14256350,7783687,13876377,-25946985,-13352459,24051124,13742383,-15637599,13295222 },\n  { 33338237,-8505733,12532113,7977527,9106186,-1715251,-17720195,-4612972,-4451357,-14669444 },\n },\n {\n  { -20045281,5454097,-14346548,6447146,28862071,1883651,-2469266,-4141880,7770569,9620597 },\n  { 23208068,7979712,33071466,8149229,1758231,-10834995,30945528,-1694323,-33502340,-14767970 },\n  { 1439958,-16270480,-1079989,-793782,4625402,10647766,-5043801,1220118,30494170,-11440799 },\n },\n {\n  { -5037580,-13028295,-2970559,-3061767,15640974,-6701666,-26739026,926050,-1684339,-13333647 },\n  { 13908495,-3549272,30919928,-6273825,-21521863,7989039,9021034,9078865,3353509,4033511 },\n  { -29663431,-15113610,32259991,-344482,24295849,-12912123,23161163,8839127,27485041,7356032 },\n },\n},\n{\n {\n  { 9661027,705443,11980065,-5370154,-1628543,14661173,-6346142,2625015,28431036,-16771834 },\n  { -23839233,-8311415,-25945511,7480958,-17681669,-8354183,-22545972,14150565,15970762,4099461 },\n  { 29262576,16756590,26350592,-8793563,8529671,-11208050,13617293,-9937143,11465739,8317062 },\n },\n {\n  { -25493081,-6962928,32500200,-9419051,-23038724,-2302222,14898637,3848455,20969334,-5157516 },\n  { -20384450,-14347713,-18336405,13884722,-33039454,2842114,-21610826,-3649888,11177095,14989547 },\n  { -24496721,-11716016,16959896,2278463,12066309,10137771,13515641,2581286,-28487508,9930240 },\n },\n {\n  { -17751622,-2097826,16544300,-13009300,-15914807,-14949081,18345767,-13403753,16291481,-5314038 },\n  { -33229194,2553288,32678213,9875984,8534129,6889387,-9676774,6957617,4368891,9788741 },\n  { 16660756,7281060,-10830758,12911820,20108584,-8101676,-21722536,-8613148,16250552,-11111103 },\n },\n {\n  { -19765507,2390526,-16551031,14161980,1905286,6414907,4689584,10604807,-30190403,4782747 },\n  { -1354539,14736941,-7367442,-13292886,7710542,-14155590,-9981571,4383045,22546403,437323 },\n  { 31665577,-12180464,-16186830,1491339,-18368625,3294682,27343084,2786261,-30633590,-14097016 },\n },\n {\n  { -14467279,-683715,-33374107,7448552,19294360,14334329,-19690631,2355319,-19284671,-6114373 },\n  { 15121312,-15796162,6377020,-6031361,-10798111,-12957845,18952177,15496498,-29380133,11754228 },\n  { -2637277,-13483075,8488727,-14303896,12728761,-1622493,7141596,11724556,22761615,-10134141 },\n },\n {\n  { 16918416,11729663,-18083579,3022987,-31015732,-13339659,-28741185,-12227393,32851222,11717399 },\n  { 11166634,7338049,-6722523,4531520,-29468672,-7302055,31474879,3483633,-1193175,-4030831 },\n  { -185635,9921305,31456609,-13536438,-12013818,13348923,33142652,6546660,-19985279,-3948376 },\n },\n {\n  { -32460596,11266712,-11197107,-7899103,31703694,3855903,-8537131,-12833048,-30772034,-15486313 },\n  { -18006477,12709068,3991746,-6479188,-21491523,-10550425,-31135347,-16049879,10928917,3011958 },\n  { -6957757,-15594337,31696059,334240,29576716,14796075,-30831056,-12805180,18008031,10258577 },\n },\n {\n  { -22448644,15655569,7018479,-4410003,-30314266,-1201591,-1853465,1367120,25127874,6671743 },\n  { 29701166,-14373934,-10878120,9279288,-17568,13127210,21382910,11042292,25838796,4642684 },\n  { -20430234,14955537,-24126347,8124619,-5369288,-5990470,30468147,-13900640,18423289,4177476 },\n },\n},\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/base2.h",
    "content": " {\n  { 25967493,-14356035,29566456,3660896,-12694345,4014787,27544626,-11754271,-6079156,2047605 },\n  { -12545711,934262,-2722910,3049990,-727428,9406986,12720692,5043384,19500929,-15469378 },\n  { -8738181,4489570,9688441,-14785194,10184609,-12363380,29287919,11864899,-24514362,-4438546 },\n },\n {\n  { 15636291,-9688557,24204773,-7912398,616977,-16685262,27787600,-14772189,28944400,-1550024 },\n  { 16568933,4717097,-11556148,-1102322,15682896,-11807043,16354577,-11775962,7689662,11199574 },\n  { 30464156,-5976125,-11779434,-15670865,23220365,15915852,7512774,10017326,-17749093,-9920357 },\n },\n {\n  { 10861363,11473154,27284546,1981175,-30064349,12577861,32867885,14515107,-15438304,10819380 },\n  { 4708026,6336745,20377586,9066809,-11272109,6594696,-25653668,12483688,-12668491,5581306 },\n  { 19563160,16186464,-29386857,4097519,10237984,-4348115,28542350,13850243,-23678021,-15815942 },\n },\n {\n  { 5153746,9909285,1723747,-2777874,30523605,5516873,19480852,5230134,-23952439,-15175766 },\n  { -30269007,-3463509,7665486,10083793,28475525,1649722,20654025,16520125,30598449,7715701 },\n  { 28881845,14381568,9657904,3680757,-20181635,7843316,-31400660,1370708,29794553,-1409300 },\n },\n {\n  { -22518993,-6692182,14201702,-8745502,-23510406,8844726,18474211,-1361450,-13062696,13821877 },\n  { -6455177,-7839871,3374702,-4740862,-27098617,-10571707,31655028,-7212327,18853322,-14220951 },\n  { 4566830,-12963868,-28974889,-12240689,-7602672,-2830569,-8514358,-10431137,2207753,-3209784 },\n },\n {\n  { -25154831,-4185821,29681144,7868801,-6854661,-9423865,-12437364,-663000,-31111463,-16132436 },\n  { 25576264,-2703214,7349804,-11814844,16472782,9300885,3844789,15725684,171356,6466918 },\n  { 23103977,13316479,9739013,-16149481,817875,-15038942,8965339,-14088058,-30714912,16193877 },\n },\n {\n  { -33521811,3180713,-2394130,14003687,-16903474,-16270840,17238398,4729455,-18074513,9256800 },\n  { -25182317,-4174131,32336398,5036987,-21236817,11360617,22616405,9761698,-19827198,630305 },\n  { -13720693,2639453,-24237460,-7406481,9494427,-5774029,-6554551,-15960994,-2449256,-14291300 },\n },\n {\n  { -3151181,-5046075,9282714,6866145,-31907062,-863023,-18940575,15033784,25105118,-7894876 },\n  { -24326370,15950226,-31801215,-14592823,-11662737,-5090925,1573892,-2625887,2198790,-15804619 },\n  { -3099351,10324967,-2241613,7453183,-5446979,-2735503,-13812022,-16236442,-32461234,-12290683 },\n },\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/d.h",
    "content": "-10913610,13857413,-15372611,6949391,114729,-8787816,-6275908,-3247719,-18696448,-12055116\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/d2.h",
    "content": "-21827239,-5839606,-30745221,13898782,229458,15978800,-12551817,-6495438,29715968,9444199\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/fe.h",
    "content": "#ifndef FE_H\n#define FE_H\n\n#include \"crypto_int32.h\"\n\ntypedef crypto_int32 fe[10];\n\n/*\nfe means field element.\nHere the field is \\Z/(2^255-19).\nAn element t, entries t[0]...t[9], represents the integer\nt[0]+2^26 t[1]+2^51 t[2]+2^77 t[3]+2^102 t[4]+...+2^230 t[9].\nBounds on each t[i] vary depending on context.\n*/\n\n#define fe_frombytes crypto_sign_ed25519_ref10_fe_frombytes\n#define fe_tobytes crypto_sign_ed25519_ref10_fe_tobytes\n#define fe_copy crypto_sign_ed25519_ref10_fe_copy\n#define fe_isnonzero crypto_sign_ed25519_ref10_fe_isnonzero\n#define fe_isnegative crypto_sign_ed25519_ref10_fe_isnegative\n#define fe_0 crypto_sign_ed25519_ref10_fe_0\n#define fe_1 crypto_sign_ed25519_ref10_fe_1\n#define fe_cswap crypto_sign_ed25519_ref10_fe_cswap\n#define fe_cmov crypto_sign_ed25519_ref10_fe_cmov\n#define fe_add crypto_sign_ed25519_ref10_fe_add\n#define fe_sub crypto_sign_ed25519_ref10_fe_sub\n#define fe_neg crypto_sign_ed25519_ref10_fe_neg\n#define fe_mul crypto_sign_ed25519_ref10_fe_mul\n#define fe_sq crypto_sign_ed25519_ref10_fe_sq\n#define fe_sq2 crypto_sign_ed25519_ref10_fe_sq2\n#define fe_mul121666 crypto_sign_ed25519_ref10_fe_mul121666\n#define fe_invert crypto_sign_ed25519_ref10_fe_invert\n#define fe_pow22523 crypto_sign_ed25519_ref10_fe_pow22523\n\nextern void fe_frombytes(fe,const unsigned char *);\nextern void fe_tobytes(unsigned char *,const fe);\n\nextern void fe_copy(fe,const fe);\nextern int fe_isnonzero(const fe);\nextern int fe_isnegative(const fe);\nextern void fe_0(fe);\nextern void fe_1(fe);\nextern void fe_cswap(fe,fe,unsigned int);\nextern void fe_cmov(fe,const fe,unsigned int);\n\nextern void fe_add(fe,const fe,const fe);\nextern void fe_sub(fe,const fe,const fe);\nextern void fe_neg(fe,const fe);\nextern void fe_mul(fe,const fe,const fe);\nextern void fe_sq(fe,const fe);\nextern void fe_sq2(fe,const fe);\nextern void fe_mul121666(fe,const fe);\nextern void fe_invert(fe,const fe);\nextern void fe_pow22523(fe,const fe);\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/fe_0.c",
    "content": "#include \"fe.h\"\n\n/*\nh = 0\n*/\n\nvoid fe_0(fe h)\n{\n  h[0] = 0;\n  h[1] = 0;\n  h[2] = 0;\n  h[3] = 0;\n  h[4] = 0;\n  h[5] = 0;\n  h[6] = 0;\n  h[7] = 0;\n  h[8] = 0;\n  h[9] = 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/fe_1.c",
    "content": "#include \"fe.h\"\n\n/*\nh = 1\n*/\n\nvoid fe_1(fe h)\n{\n  h[0] = 1;\n  h[1] = 0;\n  h[2] = 0;\n  h[3] = 0;\n  h[4] = 0;\n  h[5] = 0;\n  h[6] = 0;\n  h[7] = 0;\n  h[8] = 0;\n  h[9] = 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/fe_add.c",
    "content": "#include \"fe.h\"\n\n/*\nh = f + g\nCan overlap h with f or g.\n\nPreconditions:\n   |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n   |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n\nPostconditions:\n   |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n*/\n\nvoid fe_add(fe h,const fe f,const fe g)\n{\n  crypto_int32 f0 = f[0];\n  crypto_int32 f1 = f[1];\n  crypto_int32 f2 = f[2];\n  crypto_int32 f3 = f[3];\n  crypto_int32 f4 = f[4];\n  crypto_int32 f5 = f[5];\n  crypto_int32 f6 = f[6];\n  crypto_int32 f7 = f[7];\n  crypto_int32 f8 = f[8];\n  crypto_int32 f9 = f[9];\n  crypto_int32 g0 = g[0];\n  crypto_int32 g1 = g[1];\n  crypto_int32 g2 = g[2];\n  crypto_int32 g3 = g[3];\n  crypto_int32 g4 = g[4];\n  crypto_int32 g5 = g[5];\n  crypto_int32 g6 = g[6];\n  crypto_int32 g7 = g[7];\n  crypto_int32 g8 = g[8];\n  crypto_int32 g9 = g[9];\n  crypto_int32 h0 = f0 + g0;\n  crypto_int32 h1 = f1 + g1;\n  crypto_int32 h2 = f2 + g2;\n  crypto_int32 h3 = f3 + g3;\n  crypto_int32 h4 = f4 + g4;\n  crypto_int32 h5 = f5 + g5;\n  crypto_int32 h6 = f6 + g6;\n  crypto_int32 h7 = f7 + g7;\n  crypto_int32 h8 = f8 + g8;\n  crypto_int32 h9 = f9 + g9;\n  h[0] = h0;\n  h[1] = h1;\n  h[2] = h2;\n  h[3] = h3;\n  h[4] = h4;\n  h[5] = h5;\n  h[6] = h6;\n  h[7] = h7;\n  h[8] = h8;\n  h[9] = h9;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/fe_cmov.c",
    "content": "#include \"fe.h\"\n\n/*\nReplace (f,g) with (g,g) if b == 1;\nreplace (f,g) with (f,g) if b == 0.\n\nPreconditions: b in {0,1}.\n*/\n\nvoid fe_cmov(fe f,const fe g,unsigned int b)\n{\n  crypto_int32 f0 = f[0];\n  crypto_int32 f1 = f[1];\n  crypto_int32 f2 = f[2];\n  crypto_int32 f3 = f[3];\n  crypto_int32 f4 = f[4];\n  crypto_int32 f5 = f[5];\n  crypto_int32 f6 = f[6];\n  crypto_int32 f7 = f[7];\n  crypto_int32 f8 = f[8];\n  crypto_int32 f9 = f[9];\n  crypto_int32 g0 = g[0];\n  crypto_int32 g1 = g[1];\n  crypto_int32 g2 = g[2];\n  crypto_int32 g3 = g[3];\n  crypto_int32 g4 = g[4];\n  crypto_int32 g5 = g[5];\n  crypto_int32 g6 = g[6];\n  crypto_int32 g7 = g[7];\n  crypto_int32 g8 = g[8];\n  crypto_int32 g9 = g[9];\n  crypto_int32 x0 = f0 ^ g0;\n  crypto_int32 x1 = f1 ^ g1;\n  crypto_int32 x2 = f2 ^ g2;\n  crypto_int32 x3 = f3 ^ g3;\n  crypto_int32 x4 = f4 ^ g4;\n  crypto_int32 x5 = f5 ^ g5;\n  crypto_int32 x6 = f6 ^ g6;\n  crypto_int32 x7 = f7 ^ g7;\n  crypto_int32 x8 = f8 ^ g8;\n  crypto_int32 x9 = f9 ^ g9;\n  b = (unsigned int) (- (int) b);\n  x0 &= b;\n  x1 &= b;\n  x2 &= b;\n  x3 &= b;\n  x4 &= b;\n  x5 &= b;\n  x6 &= b;\n  x7 &= b;\n  x8 &= b;\n  x9 &= b;\n  f[0] = f0 ^ x0;\n  f[1] = f1 ^ x1;\n  f[2] = f2 ^ x2;\n  f[3] = f3 ^ x3;\n  f[4] = f4 ^ x4;\n  f[5] = f5 ^ x5;\n  f[6] = f6 ^ x6;\n  f[7] = f7 ^ x7;\n  f[8] = f8 ^ x8;\n  f[9] = f9 ^ x9;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/fe_copy.c",
    "content": "#include \"fe.h\"\n\n/*\nh = f\n*/\n\nvoid fe_copy(fe h,const fe f)\n{\n  crypto_int32 f0 = f[0];\n  crypto_int32 f1 = f[1];\n  crypto_int32 f2 = f[2];\n  crypto_int32 f3 = f[3];\n  crypto_int32 f4 = f[4];\n  crypto_int32 f5 = f[5];\n  crypto_int32 f6 = f[6];\n  crypto_int32 f7 = f[7];\n  crypto_int32 f8 = f[8];\n  crypto_int32 f9 = f[9];\n  h[0] = f0;\n  h[1] = f1;\n  h[2] = f2;\n  h[3] = f3;\n  h[4] = f4;\n  h[5] = f5;\n  h[6] = f6;\n  h[7] = f7;\n  h[8] = f8;\n  h[9] = f9;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/fe_frombytes.c",
    "content": "#include \"fe.h\"\n#include \"crypto_int64.h\"\n#include \"crypto_uint64.h\"\n\nstatic crypto_uint64 load_3(const unsigned char *in)\n{\n  crypto_uint64 result;\n  result = (crypto_uint64) in[0];\n  result |= ((crypto_uint64) in[1]) << 8;\n  result |= ((crypto_uint64) in[2]) << 16;\n  return result;\n}\n\nstatic crypto_uint64 load_4(const unsigned char *in)\n{\n  crypto_uint64 result;\n  result = (crypto_uint64) in[0];\n  result |= ((crypto_uint64) in[1]) << 8;\n  result |= ((crypto_uint64) in[2]) << 16;\n  result |= ((crypto_uint64) in[3]) << 24;\n  return result;\n}\n\n/*\nIgnores top bit of h.\n*/\n\nvoid fe_frombytes(fe h,const unsigned char *s)\n{\n  crypto_int64 h0 = load_4(s);\n  crypto_int64 h1 = load_3(s + 4) << 6;\n  crypto_int64 h2 = load_3(s + 7) << 5;\n  crypto_int64 h3 = load_3(s + 10) << 3;\n  crypto_int64 h4 = load_3(s + 13) << 2;\n  crypto_int64 h5 = load_4(s + 16);\n  crypto_int64 h6 = load_3(s + 20) << 7;\n  crypto_int64 h7 = load_3(s + 23) << 5;\n  crypto_int64 h8 = load_3(s + 26) << 4;\n  crypto_int64 h9 = (load_3(s + 29) & 8388607) << 2;\n  crypto_int64 carry0;\n  crypto_int64 carry1;\n  crypto_int64 carry2;\n  crypto_int64 carry3;\n  crypto_int64 carry4;\n  crypto_int64 carry5;\n  crypto_int64 carry6;\n  crypto_int64 carry7;\n  crypto_int64 carry8;\n  crypto_int64 carry9;\n\n  carry9 = (h9 + (crypto_int64) (1L << 24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25;\n  carry1 = (h1 + (crypto_int64) (1L << 24)) >> 25; h2 += carry1; h1 -= carry1 << 25;\n  carry3 = (h3 + (crypto_int64) (1L << 24)) >> 25; h4 += carry3; h3 -= carry3 << 25;\n  carry5 = (h5 + (crypto_int64) (1L << 24)) >> 25; h6 += carry5; h5 -= carry5 << 25;\n  carry7 = (h7 + (crypto_int64) (1L << 24)) >> 25; h8 += carry7; h7 -= carry7 << 25;\n\n  carry0 = (h0 + (crypto_int64) (1L << 25)) >> 26; h1 += carry0; h0 -= carry0 << 26;\n  carry2 = (h2 + (crypto_int64) (1L << 25)) >> 26; h3 += carry2; h2 -= carry2 << 26;\n  carry4 = (h4 + (crypto_int64) (1L << 25)) >> 26; h5 += carry4; h4 -= carry4 << 26;\n  carry6 = (h6 + (crypto_int64) (1L << 25)) >> 26; h7 += carry6; h6 -= carry6 << 26;\n  carry8 = (h8 + (crypto_int64) (1L << 25)) >> 26; h9 += carry8; h8 -= carry8 << 26;\n\n  h[0] = (crypto_int32) h0;\n  h[1] = (crypto_int32) h1;\n  h[2] = (crypto_int32) h2;\n  h[3] = (crypto_int32) h3;\n  h[4] = (crypto_int32) h4;\n  h[5] = (crypto_int32) h5;\n  h[6] = (crypto_int32) h6;\n  h[7] = (crypto_int32) h7;\n  h[8] = (crypto_int32) h8;\n  h[9] = (crypto_int32) h9;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/fe_invert.c",
    "content": "#include \"fe.h\"\n\nvoid fe_invert(fe out,const fe z)\n{\n  fe t0;\n  fe t1;\n  fe t2;\n  fe t3;\n  int i;\n\n#include \"pow225521.h\"\n\n  return;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/fe_isnegative.c",
    "content": "#include \"fe.h\"\n\n/*\nreturn 1 if f is in {1,3,5,...,q-2}\nreturn 0 if f is in {0,2,4,...,q-1}\n\nPreconditions:\n   |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n*/\n\nint fe_isnegative(const fe f)\n{\n  unsigned char s[32];\n  fe_tobytes(s,f);\n  return s[0] & 1;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/fe_isnonzero.c",
    "content": "#include \"fe.h\"\n#include \"crypto_verify_32.h\"\n\n/*\nreturn 1 if f == 0\nreturn 0 if f != 0\n\nPreconditions:\n   |f| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n*/\n\nstatic unsigned char zero[32];\n\nint fe_isnonzero(const fe f)\n{\n  unsigned char s[32];\n  fe_tobytes(s,f);\n  return crypto_verify_32(s,zero);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/fe_mul.c",
    "content": "#include \"fe.h\"\n#include \"crypto_int64.h\"\n\n/*\nh = f * g\nCan overlap h with f or g.\n\nPreconditions:\n   |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.\n   |g| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.\n\nPostconditions:\n   |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc.\n*/\n\n/*\nNotes on implementation strategy:\n\nUsing schoolbook multiplication.\nKaratsuba would save a little in some cost models.\n\nMost multiplications by 2 and 19 are 32-bit precomputations;\ncheaper than 64-bit postcomputations.\n\nThere is one remaining multiplication by 19 in the carry chain;\none *19 precomputation can be merged into this,\nbut the resulting data flow is considerably less clean.\n\nThere are 12 carries below.\n10 of them are 2-way parallelizable and vectorizable.\nCan get away with 11 carries, but then data flow is much deeper.\n\nWith tighter constraints on inputs can squeeze carries into int32.\n*/\n\nvoid fe_mul(fe h,const fe f,const fe g)\n{\n  crypto_int32 f0 = f[0];\n  crypto_int32 f1 = f[1];\n  crypto_int32 f2 = f[2];\n  crypto_int32 f3 = f[3];\n  crypto_int32 f4 = f[4];\n  crypto_int32 f5 = f[5];\n  crypto_int32 f6 = f[6];\n  crypto_int32 f7 = f[7];\n  crypto_int32 f8 = f[8];\n  crypto_int32 f9 = f[9];\n  crypto_int32 g0 = g[0];\n  crypto_int32 g1 = g[1];\n  crypto_int32 g2 = g[2];\n  crypto_int32 g3 = g[3];\n  crypto_int32 g4 = g[4];\n  crypto_int32 g5 = g[5];\n  crypto_int32 g6 = g[6];\n  crypto_int32 g7 = g[7];\n  crypto_int32 g8 = g[8];\n  crypto_int32 g9 = g[9];\n  crypto_int32 g1_19 = 19 * g1; /* 1.959375*2^29 */\n  crypto_int32 g2_19 = 19 * g2; /* 1.959375*2^30; still ok */\n  crypto_int32 g3_19 = 19 * g3;\n  crypto_int32 g4_19 = 19 * g4;\n  crypto_int32 g5_19 = 19 * g5;\n  crypto_int32 g6_19 = 19 * g6;\n  crypto_int32 g7_19 = 19 * g7;\n  crypto_int32 g8_19 = 19 * g8;\n  crypto_int32 g9_19 = 19 * g9;\n  crypto_int32 f1_2 = 2 * f1;\n  crypto_int32 f3_2 = 2 * f3;\n  crypto_int32 f5_2 = 2 * f5;\n  crypto_int32 f7_2 = 2 * f7;\n  crypto_int32 f9_2 = 2 * f9;\n  crypto_int64 f0g0    = f0   * (crypto_int64) g0;\n  crypto_int64 f0g1    = f0   * (crypto_int64) g1;\n  crypto_int64 f0g2    = f0   * (crypto_int64) g2;\n  crypto_int64 f0g3    = f0   * (crypto_int64) g3;\n  crypto_int64 f0g4    = f0   * (crypto_int64) g4;\n  crypto_int64 f0g5    = f0   * (crypto_int64) g5;\n  crypto_int64 f0g6    = f0   * (crypto_int64) g6;\n  crypto_int64 f0g7    = f0   * (crypto_int64) g7;\n  crypto_int64 f0g8    = f0   * (crypto_int64) g8;\n  crypto_int64 f0g9    = f0   * (crypto_int64) g9;\n  crypto_int64 f1g0    = f1   * (crypto_int64) g0;\n  crypto_int64 f1g1_2  = f1_2 * (crypto_int64) g1;\n  crypto_int64 f1g2    = f1   * (crypto_int64) g2;\n  crypto_int64 f1g3_2  = f1_2 * (crypto_int64) g3;\n  crypto_int64 f1g4    = f1   * (crypto_int64) g4;\n  crypto_int64 f1g5_2  = f1_2 * (crypto_int64) g5;\n  crypto_int64 f1g6    = f1   * (crypto_int64) g6;\n  crypto_int64 f1g7_2  = f1_2 * (crypto_int64) g7;\n  crypto_int64 f1g8    = f1   * (crypto_int64) g8;\n  crypto_int64 f1g9_38 = f1_2 * (crypto_int64) g9_19;\n  crypto_int64 f2g0    = f2   * (crypto_int64) g0;\n  crypto_int64 f2g1    = f2   * (crypto_int64) g1;\n  crypto_int64 f2g2    = f2   * (crypto_int64) g2;\n  crypto_int64 f2g3    = f2   * (crypto_int64) g3;\n  crypto_int64 f2g4    = f2   * (crypto_int64) g4;\n  crypto_int64 f2g5    = f2   * (crypto_int64) g5;\n  crypto_int64 f2g6    = f2   * (crypto_int64) g6;\n  crypto_int64 f2g7    = f2   * (crypto_int64) g7;\n  crypto_int64 f2g8_19 = f2   * (crypto_int64) g8_19;\n  crypto_int64 f2g9_19 = f2   * (crypto_int64) g9_19;\n  crypto_int64 f3g0    = f3   * (crypto_int64) g0;\n  crypto_int64 f3g1_2  = f3_2 * (crypto_int64) g1;\n  crypto_int64 f3g2    = f3   * (crypto_int64) g2;\n  crypto_int64 f3g3_2  = f3_2 * (crypto_int64) g3;\n  crypto_int64 f3g4    = f3   * (crypto_int64) g4;\n  crypto_int64 f3g5_2  = f3_2 * (crypto_int64) g5;\n  crypto_int64 f3g6    = f3   * (crypto_int64) g6;\n  crypto_int64 f3g7_38 = f3_2 * (crypto_int64) g7_19;\n  crypto_int64 f3g8_19 = f3   * (crypto_int64) g8_19;\n  crypto_int64 f3g9_38 = f3_2 * (crypto_int64) g9_19;\n  crypto_int64 f4g0    = f4   * (crypto_int64) g0;\n  crypto_int64 f4g1    = f4   * (crypto_int64) g1;\n  crypto_int64 f4g2    = f4   * (crypto_int64) g2;\n  crypto_int64 f4g3    = f4   * (crypto_int64) g3;\n  crypto_int64 f4g4    = f4   * (crypto_int64) g4;\n  crypto_int64 f4g5    = f4   * (crypto_int64) g5;\n  crypto_int64 f4g6_19 = f4   * (crypto_int64) g6_19;\n  crypto_int64 f4g7_19 = f4   * (crypto_int64) g7_19;\n  crypto_int64 f4g8_19 = f4   * (crypto_int64) g8_19;\n  crypto_int64 f4g9_19 = f4   * (crypto_int64) g9_19;\n  crypto_int64 f5g0    = f5   * (crypto_int64) g0;\n  crypto_int64 f5g1_2  = f5_2 * (crypto_int64) g1;\n  crypto_int64 f5g2    = f5   * (crypto_int64) g2;\n  crypto_int64 f5g3_2  = f5_2 * (crypto_int64) g3;\n  crypto_int64 f5g4    = f5   * (crypto_int64) g4;\n  crypto_int64 f5g5_38 = f5_2 * (crypto_int64) g5_19;\n  crypto_int64 f5g6_19 = f5   * (crypto_int64) g6_19;\n  crypto_int64 f5g7_38 = f5_2 * (crypto_int64) g7_19;\n  crypto_int64 f5g8_19 = f5   * (crypto_int64) g8_19;\n  crypto_int64 f5g9_38 = f5_2 * (crypto_int64) g9_19;\n  crypto_int64 f6g0    = f6   * (crypto_int64) g0;\n  crypto_int64 f6g1    = f6   * (crypto_int64) g1;\n  crypto_int64 f6g2    = f6   * (crypto_int64) g2;\n  crypto_int64 f6g3    = f6   * (crypto_int64) g3;\n  crypto_int64 f6g4_19 = f6   * (crypto_int64) g4_19;\n  crypto_int64 f6g5_19 = f6   * (crypto_int64) g5_19;\n  crypto_int64 f6g6_19 = f6   * (crypto_int64) g6_19;\n  crypto_int64 f6g7_19 = f6   * (crypto_int64) g7_19;\n  crypto_int64 f6g8_19 = f6   * (crypto_int64) g8_19;\n  crypto_int64 f6g9_19 = f6   * (crypto_int64) g9_19;\n  crypto_int64 f7g0    = f7   * (crypto_int64) g0;\n  crypto_int64 f7g1_2  = f7_2 * (crypto_int64) g1;\n  crypto_int64 f7g2    = f7   * (crypto_int64) g2;\n  crypto_int64 f7g3_38 = f7_2 * (crypto_int64) g3_19;\n  crypto_int64 f7g4_19 = f7   * (crypto_int64) g4_19;\n  crypto_int64 f7g5_38 = f7_2 * (crypto_int64) g5_19;\n  crypto_int64 f7g6_19 = f7   * (crypto_int64) g6_19;\n  crypto_int64 f7g7_38 = f7_2 * (crypto_int64) g7_19;\n  crypto_int64 f7g8_19 = f7   * (crypto_int64) g8_19;\n  crypto_int64 f7g9_38 = f7_2 * (crypto_int64) g9_19;\n  crypto_int64 f8g0    = f8   * (crypto_int64) g0;\n  crypto_int64 f8g1    = f8   * (crypto_int64) g1;\n  crypto_int64 f8g2_19 = f8   * (crypto_int64) g2_19;\n  crypto_int64 f8g3_19 = f8   * (crypto_int64) g3_19;\n  crypto_int64 f8g4_19 = f8   * (crypto_int64) g4_19;\n  crypto_int64 f8g5_19 = f8   * (crypto_int64) g5_19;\n  crypto_int64 f8g6_19 = f8   * (crypto_int64) g6_19;\n  crypto_int64 f8g7_19 = f8   * (crypto_int64) g7_19;\n  crypto_int64 f8g8_19 = f8   * (crypto_int64) g8_19;\n  crypto_int64 f8g9_19 = f8   * (crypto_int64) g9_19;\n  crypto_int64 f9g0    = f9   * (crypto_int64) g0;\n  crypto_int64 f9g1_38 = f9_2 * (crypto_int64) g1_19;\n  crypto_int64 f9g2_19 = f9   * (crypto_int64) g2_19;\n  crypto_int64 f9g3_38 = f9_2 * (crypto_int64) g3_19;\n  crypto_int64 f9g4_19 = f9   * (crypto_int64) g4_19;\n  crypto_int64 f9g5_38 = f9_2 * (crypto_int64) g5_19;\n  crypto_int64 f9g6_19 = f9   * (crypto_int64) g6_19;\n  crypto_int64 f9g7_38 = f9_2 * (crypto_int64) g7_19;\n  crypto_int64 f9g8_19 = f9   * (crypto_int64) g8_19;\n  crypto_int64 f9g9_38 = f9_2 * (crypto_int64) g9_19;\n  crypto_int64 h0 = f0g0+f1g9_38+f2g8_19+f3g7_38+f4g6_19+f5g5_38+f6g4_19+f7g3_38+f8g2_19+f9g1_38;\n  crypto_int64 h1 = f0g1+f1g0   +f2g9_19+f3g8_19+f4g7_19+f5g6_19+f6g5_19+f7g4_19+f8g3_19+f9g2_19;\n  crypto_int64 h2 = f0g2+f1g1_2 +f2g0   +f3g9_38+f4g8_19+f5g7_38+f6g6_19+f7g5_38+f8g4_19+f9g3_38;\n  crypto_int64 h3 = f0g3+f1g2   +f2g1   +f3g0   +f4g9_19+f5g8_19+f6g7_19+f7g6_19+f8g5_19+f9g4_19;\n  crypto_int64 h4 = f0g4+f1g3_2 +f2g2   +f3g1_2 +f4g0   +f5g9_38+f6g8_19+f7g7_38+f8g6_19+f9g5_38;\n  crypto_int64 h5 = f0g5+f1g4   +f2g3   +f3g2   +f4g1   +f5g0   +f6g9_19+f7g8_19+f8g7_19+f9g6_19;\n  crypto_int64 h6 = f0g6+f1g5_2 +f2g4   +f3g3_2 +f4g2   +f5g1_2 +f6g0   +f7g9_38+f8g8_19+f9g7_38;\n  crypto_int64 h7 = f0g7+f1g6   +f2g5   +f3g4   +f4g3   +f5g2   +f6g1   +f7g0   +f8g9_19+f9g8_19;\n  crypto_int64 h8 = f0g8+f1g7_2 +f2g6   +f3g5_2 +f4g4   +f5g3_2 +f6g2   +f7g1_2 +f8g0   +f9g9_38;\n  crypto_int64 h9 = f0g9+f1g8   +f2g7   +f3g6   +f4g5   +f5g4   +f6g3   +f7g2   +f8g1   +f9g0   ;\n  crypto_int64 carry0;\n  crypto_int64 carry1;\n  crypto_int64 carry2;\n  crypto_int64 carry3;\n  crypto_int64 carry4;\n  crypto_int64 carry5;\n  crypto_int64 carry6;\n  crypto_int64 carry7;\n  crypto_int64 carry8;\n  crypto_int64 carry9;\n\n  /*\n  |h0| <= (1.65*1.65*2^52*(1+19+19+19+19)+1.65*1.65*2^50*(38+38+38+38+38))\n    i.e. |h0| <= 1.4*2^60; narrower ranges for h2, h4, h6, h8\n  |h1| <= (1.65*1.65*2^51*(1+1+19+19+19+19+19+19+19+19))\n    i.e. |h1| <= 1.7*2^59; narrower ranges for h3, h5, h7, h9\n  */\n\n  carry0 = (h0 + (crypto_int64) (1L << 25)) >> 26; h1 += carry0; h0 -= carry0 << 26;\n  carry4 = (h4 + (crypto_int64) (1L << 25)) >> 26; h5 += carry4; h4 -= carry4 << 26;\n  /* |h0| <= 2^25 */\n  /* |h4| <= 2^25 */\n  /* |h1| <= 1.71*2^59 */\n  /* |h5| <= 1.71*2^59 */\n\n  carry1 = (h1 + (crypto_int64) (1L << 24)) >> 25; h2 += carry1; h1 -= carry1 << 25;\n  carry5 = (h5 + (crypto_int64) (1L << 24)) >> 25; h6 += carry5; h5 -= carry5 << 25;\n  /* |h1| <= 2^24; from now on fits into int32 */\n  /* |h5| <= 2^24; from now on fits into int32 */\n  /* |h2| <= 1.41*2^60 */\n  /* |h6| <= 1.41*2^60 */\n\n  carry2 = (h2 + (crypto_int64) (1L << 25)) >> 26; h3 += carry2; h2 -= carry2 << 26;\n  carry6 = (h6 + (crypto_int64) (1L << 25)) >> 26; h7 += carry6; h6 -= carry6 << 26;\n  /* |h2| <= 2^25; from now on fits into int32 unchanged */\n  /* |h6| <= 2^25; from now on fits into int32 unchanged */\n  /* |h3| <= 1.71*2^59 */\n  /* |h7| <= 1.71*2^59 */\n\n  carry3 = (h3 + (crypto_int64) (1L << 24)) >> 25; h4 += carry3; h3 -= carry3 << 25;\n  carry7 = (h7 + (crypto_int64) (1L << 24)) >> 25; h8 += carry7; h7 -= carry7 << 25;\n  /* |h3| <= 2^24; from now on fits into int32 unchanged */\n  /* |h7| <= 2^24; from now on fits into int32 unchanged */\n  /* |h4| <= 1.72*2^34 */\n  /* |h8| <= 1.41*2^60 */\n\n  carry4 = (h4 + (crypto_int64) (1L << 25)) >> 26; h5 += carry4; h4 -= carry4 << 26;\n  carry8 = (h8 + (crypto_int64) (1L << 25)) >> 26; h9 += carry8; h8 -= carry8 << 26;\n  /* |h4| <= 2^25; from now on fits into int32 unchanged */\n  /* |h8| <= 2^25; from now on fits into int32 unchanged */\n  /* |h5| <= 1.01*2^24 */\n  /* |h9| <= 1.71*2^59 */\n\n  carry9 = (h9 + (crypto_int64) (1L << 24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25;\n  /* |h9| <= 2^24; from now on fits into int32 unchanged */\n  /* |h0| <= 1.1*2^39 */\n\n  carry0 = (h0 + (crypto_int64) (1L << 25)) >> 26; h1 += carry0; h0 -= carry0 << 26;\n  /* |h0| <= 2^25; from now on fits into int32 unchanged */\n  /* |h1| <= 1.01*2^24 */\n\n  h[0] = (crypto_int32) h0;\n  h[1] = (crypto_int32) h1;\n  h[2] = (crypto_int32) h2;\n  h[3] = (crypto_int32) h3;\n  h[4] = (crypto_int32) h4;\n  h[5] = (crypto_int32) h5;\n  h[6] = (crypto_int32) h6;\n  h[7] = (crypto_int32) h7;\n  h[8] = (crypto_int32) h8;\n  h[9] = (crypto_int32) h9;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/fe_neg.c",
    "content": "#include \"fe.h\"\n\n/*\nh = -f\n\nPreconditions:\n   |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n\nPostconditions:\n   |h| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n*/\n\nvoid fe_neg(fe h,const fe f)\n{\n  crypto_int32 f0 = f[0];\n  crypto_int32 f1 = f[1];\n  crypto_int32 f2 = f[2];\n  crypto_int32 f3 = f[3];\n  crypto_int32 f4 = f[4];\n  crypto_int32 f5 = f[5];\n  crypto_int32 f6 = f[6];\n  crypto_int32 f7 = f[7];\n  crypto_int32 f8 = f[8];\n  crypto_int32 f9 = f[9];\n  crypto_int32 h0 = -f0;\n  crypto_int32 h1 = -f1;\n  crypto_int32 h2 = -f2;\n  crypto_int32 h3 = -f3;\n  crypto_int32 h4 = -f4;\n  crypto_int32 h5 = -f5;\n  crypto_int32 h6 = -f6;\n  crypto_int32 h7 = -f7;\n  crypto_int32 h8 = -f8;\n  crypto_int32 h9 = -f9;\n  h[0] = h0;\n  h[1] = h1;\n  h[2] = h2;\n  h[3] = h3;\n  h[4] = h4;\n  h[5] = h5;\n  h[6] = h6;\n  h[7] = h7;\n  h[8] = h8;\n  h[9] = h9;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/fe_pow22523.c",
    "content": "#include \"fe.h\"\n\nvoid fe_pow22523(fe out,const fe z)\n{\n  fe t0;\n  fe t1;\n  fe t2;\n  int i;\n\n#include \"pow22523.h\"\n\n  return;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/fe_sq.c",
    "content": "#include \"fe.h\"\n#include \"crypto_int64.h\"\n\n/*\nh = f * f\nCan overlap h with f.\n\nPreconditions:\n   |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.\n\nPostconditions:\n   |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc.\n*/\n\n/*\nSee fe_mul.c for discussion of implementation strategy.\n*/\n\nvoid fe_sq(fe h,const fe f)\n{\n  crypto_int32 f0 = f[0];\n  crypto_int32 f1 = f[1];\n  crypto_int32 f2 = f[2];\n  crypto_int32 f3 = f[3];\n  crypto_int32 f4 = f[4];\n  crypto_int32 f5 = f[5];\n  crypto_int32 f6 = f[6];\n  crypto_int32 f7 = f[7];\n  crypto_int32 f8 = f[8];\n  crypto_int32 f9 = f[9];\n  crypto_int32 f0_2 = 2 * f0;\n  crypto_int32 f1_2 = 2 * f1;\n  crypto_int32 f2_2 = 2 * f2;\n  crypto_int32 f3_2 = 2 * f3;\n  crypto_int32 f4_2 = 2 * f4;\n  crypto_int32 f5_2 = 2 * f5;\n  crypto_int32 f6_2 = 2 * f6;\n  crypto_int32 f7_2 = 2 * f7;\n  crypto_int32 f5_38 = 38 * f5; /* 1.959375*2^30 */\n  crypto_int32 f6_19 = 19 * f6; /* 1.959375*2^30 */\n  crypto_int32 f7_38 = 38 * f7; /* 1.959375*2^30 */\n  crypto_int32 f8_19 = 19 * f8; /* 1.959375*2^30 */\n  crypto_int32 f9_38 = 38 * f9; /* 1.959375*2^30 */\n  crypto_int64 f0f0    = f0   * (crypto_int64) f0;\n  crypto_int64 f0f1_2  = f0_2 * (crypto_int64) f1;\n  crypto_int64 f0f2_2  = f0_2 * (crypto_int64) f2;\n  crypto_int64 f0f3_2  = f0_2 * (crypto_int64) f3;\n  crypto_int64 f0f4_2  = f0_2 * (crypto_int64) f4;\n  crypto_int64 f0f5_2  = f0_2 * (crypto_int64) f5;\n  crypto_int64 f0f6_2  = f0_2 * (crypto_int64) f6;\n  crypto_int64 f0f7_2  = f0_2 * (crypto_int64) f7;\n  crypto_int64 f0f8_2  = f0_2 * (crypto_int64) f8;\n  crypto_int64 f0f9_2  = f0_2 * (crypto_int64) f9;\n  crypto_int64 f1f1_2  = f1_2 * (crypto_int64) f1;\n  crypto_int64 f1f2_2  = f1_2 * (crypto_int64) f2;\n  crypto_int64 f1f3_4  = f1_2 * (crypto_int64) f3_2;\n  crypto_int64 f1f4_2  = f1_2 * (crypto_int64) f4;\n  crypto_int64 f1f5_4  = f1_2 * (crypto_int64) f5_2;\n  crypto_int64 f1f6_2  = f1_2 * (crypto_int64) f6;\n  crypto_int64 f1f7_4  = f1_2 * (crypto_int64) f7_2;\n  crypto_int64 f1f8_2  = f1_2 * (crypto_int64) f8;\n  crypto_int64 f1f9_76 = f1_2 * (crypto_int64) f9_38;\n  crypto_int64 f2f2    = f2   * (crypto_int64) f2;\n  crypto_int64 f2f3_2  = f2_2 * (crypto_int64) f3;\n  crypto_int64 f2f4_2  = f2_2 * (crypto_int64) f4;\n  crypto_int64 f2f5_2  = f2_2 * (crypto_int64) f5;\n  crypto_int64 f2f6_2  = f2_2 * (crypto_int64) f6;\n  crypto_int64 f2f7_2  = f2_2 * (crypto_int64) f7;\n  crypto_int64 f2f8_38 = f2_2 * (crypto_int64) f8_19;\n  crypto_int64 f2f9_38 = f2   * (crypto_int64) f9_38;\n  crypto_int64 f3f3_2  = f3_2 * (crypto_int64) f3;\n  crypto_int64 f3f4_2  = f3_2 * (crypto_int64) f4;\n  crypto_int64 f3f5_4  = f3_2 * (crypto_int64) f5_2;\n  crypto_int64 f3f6_2  = f3_2 * (crypto_int64) f6;\n  crypto_int64 f3f7_76 = f3_2 * (crypto_int64) f7_38;\n  crypto_int64 f3f8_38 = f3_2 * (crypto_int64) f8_19;\n  crypto_int64 f3f9_76 = f3_2 * (crypto_int64) f9_38;\n  crypto_int64 f4f4    = f4   * (crypto_int64) f4;\n  crypto_int64 f4f5_2  = f4_2 * (crypto_int64) f5;\n  crypto_int64 f4f6_38 = f4_2 * (crypto_int64) f6_19;\n  crypto_int64 f4f7_38 = f4   * (crypto_int64) f7_38;\n  crypto_int64 f4f8_38 = f4_2 * (crypto_int64) f8_19;\n  crypto_int64 f4f9_38 = f4   * (crypto_int64) f9_38;\n  crypto_int64 f5f5_38 = f5   * (crypto_int64) f5_38;\n  crypto_int64 f5f6_38 = f5_2 * (crypto_int64) f6_19;\n  crypto_int64 f5f7_76 = f5_2 * (crypto_int64) f7_38;\n  crypto_int64 f5f8_38 = f5_2 * (crypto_int64) f8_19;\n  crypto_int64 f5f9_76 = f5_2 * (crypto_int64) f9_38;\n  crypto_int64 f6f6_19 = f6   * (crypto_int64) f6_19;\n  crypto_int64 f6f7_38 = f6   * (crypto_int64) f7_38;\n  crypto_int64 f6f8_38 = f6_2 * (crypto_int64) f8_19;\n  crypto_int64 f6f9_38 = f6   * (crypto_int64) f9_38;\n  crypto_int64 f7f7_38 = f7   * (crypto_int64) f7_38;\n  crypto_int64 f7f8_38 = f7_2 * (crypto_int64) f8_19;\n  crypto_int64 f7f9_76 = f7_2 * (crypto_int64) f9_38;\n  crypto_int64 f8f8_19 = f8   * (crypto_int64) f8_19;\n  crypto_int64 f8f9_38 = f8   * (crypto_int64) f9_38;\n  crypto_int64 f9f9_38 = f9   * (crypto_int64) f9_38;\n  crypto_int64 h0 = f0f0  +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38;\n  crypto_int64 h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38;\n  crypto_int64 h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19;\n  crypto_int64 h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38;\n  crypto_int64 h4 = f0f4_2+f1f3_4 +f2f2   +f5f9_76+f6f8_38+f7f7_38;\n  crypto_int64 h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38;\n  crypto_int64 h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19;\n  crypto_int64 h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38;\n  crypto_int64 h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4   +f9f9_38;\n  crypto_int64 h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2;\n  crypto_int64 carry0;\n  crypto_int64 carry1;\n  crypto_int64 carry2;\n  crypto_int64 carry3;\n  crypto_int64 carry4;\n  crypto_int64 carry5;\n  crypto_int64 carry6;\n  crypto_int64 carry7;\n  crypto_int64 carry8;\n  crypto_int64 carry9;\n\n  carry0 = (h0 + (crypto_int64) (1L << 25)) >> 26; h1 += carry0; h0 -= carry0 << 26;\n  carry4 = (h4 + (crypto_int64) (1L << 25)) >> 26; h5 += carry4; h4 -= carry4 << 26;\n\n  carry1 = (h1 + (crypto_int64) (1L << 24)) >> 25; h2 += carry1; h1 -= carry1 << 25;\n  carry5 = (h5 + (crypto_int64) (1L << 24)) >> 25; h6 += carry5; h5 -= carry5 << 25;\n\n  carry2 = (h2 + (crypto_int64) (1L << 25)) >> 26; h3 += carry2; h2 -= carry2 << 26;\n  carry6 = (h6 + (crypto_int64) (1L << 25)) >> 26; h7 += carry6; h6 -= carry6 << 26;\n\n  carry3 = (h3 + (crypto_int64) (1L << 24)) >> 25; h4 += carry3; h3 -= carry3 << 25;\n  carry7 = (h7 + (crypto_int64) (1L << 24)) >> 25; h8 += carry7; h7 -= carry7 << 25;\n\n  carry4 = (h4 + (crypto_int64) (1L << 25)) >> 26; h5 += carry4; h4 -= carry4 << 26;\n  carry8 = (h8 + (crypto_int64) (1L << 25)) >> 26; h9 += carry8; h8 -= carry8 << 26;\n\n  carry9 = (h9 + (crypto_int64) (1L << 24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25;\n\n  carry0 = (h0 + (crypto_int64) (1L << 25)) >> 26; h1 += carry0; h0 -= carry0 << 26;\n\n  h[0] = (crypto_int32) h0;\n  h[1] = (crypto_int32) h1;\n  h[2] = (crypto_int32) h2;\n  h[3] = (crypto_int32) h3;\n  h[4] = (crypto_int32) h4;\n  h[5] = (crypto_int32) h5;\n  h[6] = (crypto_int32) h6;\n  h[7] = (crypto_int32) h7;\n  h[8] = (crypto_int32) h8;\n  h[9] = (crypto_int32) h9;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/fe_sq2.c",
    "content": "#include \"fe.h\"\n#include \"crypto_int64.h\"\n\n/*\nh = 2 * f * f\nCan overlap h with f.\n\nPreconditions:\n   |f| bounded by 1.65*2^26,1.65*2^25,1.65*2^26,1.65*2^25,etc.\n\nPostconditions:\n   |h| bounded by 1.01*2^25,1.01*2^24,1.01*2^25,1.01*2^24,etc.\n*/\n\n/*\nSee fe_mul.c for discussion of implementation strategy.\n*/\n\nvoid fe_sq2(fe h,const fe f)\n{\n  crypto_int32 f0 = f[0];\n  crypto_int32 f1 = f[1];\n  crypto_int32 f2 = f[2];\n  crypto_int32 f3 = f[3];\n  crypto_int32 f4 = f[4];\n  crypto_int32 f5 = f[5];\n  crypto_int32 f6 = f[6];\n  crypto_int32 f7 = f[7];\n  crypto_int32 f8 = f[8];\n  crypto_int32 f9 = f[9];\n  crypto_int32 f0_2 = 2 * f0;\n  crypto_int32 f1_2 = 2 * f1;\n  crypto_int32 f2_2 = 2 * f2;\n  crypto_int32 f3_2 = 2 * f3;\n  crypto_int32 f4_2 = 2 * f4;\n  crypto_int32 f5_2 = 2 * f5;\n  crypto_int32 f6_2 = 2 * f6;\n  crypto_int32 f7_2 = 2 * f7;\n  crypto_int32 f5_38 = 38 * f5; /* 1.959375*2^30 */\n  crypto_int32 f6_19 = 19 * f6; /* 1.959375*2^30 */\n  crypto_int32 f7_38 = 38 * f7; /* 1.959375*2^30 */\n  crypto_int32 f8_19 = 19 * f8; /* 1.959375*2^30 */\n  crypto_int32 f9_38 = 38 * f9; /* 1.959375*2^30 */\n  crypto_int64 f0f0    = f0   * (crypto_int64) f0;\n  crypto_int64 f0f1_2  = f0_2 * (crypto_int64) f1;\n  crypto_int64 f0f2_2  = f0_2 * (crypto_int64) f2;\n  crypto_int64 f0f3_2  = f0_2 * (crypto_int64) f3;\n  crypto_int64 f0f4_2  = f0_2 * (crypto_int64) f4;\n  crypto_int64 f0f5_2  = f0_2 * (crypto_int64) f5;\n  crypto_int64 f0f6_2  = f0_2 * (crypto_int64) f6;\n  crypto_int64 f0f7_2  = f0_2 * (crypto_int64) f7;\n  crypto_int64 f0f8_2  = f0_2 * (crypto_int64) f8;\n  crypto_int64 f0f9_2  = f0_2 * (crypto_int64) f9;\n  crypto_int64 f1f1_2  = f1_2 * (crypto_int64) f1;\n  crypto_int64 f1f2_2  = f1_2 * (crypto_int64) f2;\n  crypto_int64 f1f3_4  = f1_2 * (crypto_int64) f3_2;\n  crypto_int64 f1f4_2  = f1_2 * (crypto_int64) f4;\n  crypto_int64 f1f5_4  = f1_2 * (crypto_int64) f5_2;\n  crypto_int64 f1f6_2  = f1_2 * (crypto_int64) f6;\n  crypto_int64 f1f7_4  = f1_2 * (crypto_int64) f7_2;\n  crypto_int64 f1f8_2  = f1_2 * (crypto_int64) f8;\n  crypto_int64 f1f9_76 = f1_2 * (crypto_int64) f9_38;\n  crypto_int64 f2f2    = f2   * (crypto_int64) f2;\n  crypto_int64 f2f3_2  = f2_2 * (crypto_int64) f3;\n  crypto_int64 f2f4_2  = f2_2 * (crypto_int64) f4;\n  crypto_int64 f2f5_2  = f2_2 * (crypto_int64) f5;\n  crypto_int64 f2f6_2  = f2_2 * (crypto_int64) f6;\n  crypto_int64 f2f7_2  = f2_2 * (crypto_int64) f7;\n  crypto_int64 f2f8_38 = f2_2 * (crypto_int64) f8_19;\n  crypto_int64 f2f9_38 = f2   * (crypto_int64) f9_38;\n  crypto_int64 f3f3_2  = f3_2 * (crypto_int64) f3;\n  crypto_int64 f3f4_2  = f3_2 * (crypto_int64) f4;\n  crypto_int64 f3f5_4  = f3_2 * (crypto_int64) f5_2;\n  crypto_int64 f3f6_2  = f3_2 * (crypto_int64) f6;\n  crypto_int64 f3f7_76 = f3_2 * (crypto_int64) f7_38;\n  crypto_int64 f3f8_38 = f3_2 * (crypto_int64) f8_19;\n  crypto_int64 f3f9_76 = f3_2 * (crypto_int64) f9_38;\n  crypto_int64 f4f4    = f4   * (crypto_int64) f4;\n  crypto_int64 f4f5_2  = f4_2 * (crypto_int64) f5;\n  crypto_int64 f4f6_38 = f4_2 * (crypto_int64) f6_19;\n  crypto_int64 f4f7_38 = f4   * (crypto_int64) f7_38;\n  crypto_int64 f4f8_38 = f4_2 * (crypto_int64) f8_19;\n  crypto_int64 f4f9_38 = f4   * (crypto_int64) f9_38;\n  crypto_int64 f5f5_38 = f5   * (crypto_int64) f5_38;\n  crypto_int64 f5f6_38 = f5_2 * (crypto_int64) f6_19;\n  crypto_int64 f5f7_76 = f5_2 * (crypto_int64) f7_38;\n  crypto_int64 f5f8_38 = f5_2 * (crypto_int64) f8_19;\n  crypto_int64 f5f9_76 = f5_2 * (crypto_int64) f9_38;\n  crypto_int64 f6f6_19 = f6   * (crypto_int64) f6_19;\n  crypto_int64 f6f7_38 = f6   * (crypto_int64) f7_38;\n  crypto_int64 f6f8_38 = f6_2 * (crypto_int64) f8_19;\n  crypto_int64 f6f9_38 = f6   * (crypto_int64) f9_38;\n  crypto_int64 f7f7_38 = f7   * (crypto_int64) f7_38;\n  crypto_int64 f7f8_38 = f7_2 * (crypto_int64) f8_19;\n  crypto_int64 f7f9_76 = f7_2 * (crypto_int64) f9_38;\n  crypto_int64 f8f8_19 = f8   * (crypto_int64) f8_19;\n  crypto_int64 f8f9_38 = f8   * (crypto_int64) f9_38;\n  crypto_int64 f9f9_38 = f9   * (crypto_int64) f9_38;\n  crypto_int64 h0 = f0f0  +f1f9_76+f2f8_38+f3f7_76+f4f6_38+f5f5_38;\n  crypto_int64 h1 = f0f1_2+f2f9_38+f3f8_38+f4f7_38+f5f6_38;\n  crypto_int64 h2 = f0f2_2+f1f1_2 +f3f9_76+f4f8_38+f5f7_76+f6f6_19;\n  crypto_int64 h3 = f0f3_2+f1f2_2 +f4f9_38+f5f8_38+f6f7_38;\n  crypto_int64 h4 = f0f4_2+f1f3_4 +f2f2   +f5f9_76+f6f8_38+f7f7_38;\n  crypto_int64 h5 = f0f5_2+f1f4_2 +f2f3_2 +f6f9_38+f7f8_38;\n  crypto_int64 h6 = f0f6_2+f1f5_4 +f2f4_2 +f3f3_2 +f7f9_76+f8f8_19;\n  crypto_int64 h7 = f0f7_2+f1f6_2 +f2f5_2 +f3f4_2 +f8f9_38;\n  crypto_int64 h8 = f0f8_2+f1f7_4 +f2f6_2 +f3f5_4 +f4f4   +f9f9_38;\n  crypto_int64 h9 = f0f9_2+f1f8_2 +f2f7_2 +f3f6_2 +f4f5_2;\n  crypto_int64 carry0;\n  crypto_int64 carry1;\n  crypto_int64 carry2;\n  crypto_int64 carry3;\n  crypto_int64 carry4;\n  crypto_int64 carry5;\n  crypto_int64 carry6;\n  crypto_int64 carry7;\n  crypto_int64 carry8;\n  crypto_int64 carry9;\n\n  h0 += h0;\n  h1 += h1;\n  h2 += h2;\n  h3 += h3;\n  h4 += h4;\n  h5 += h5;\n  h6 += h6;\n  h7 += h7;\n  h8 += h8;\n  h9 += h9;\n\n  carry0 = (h0 + (crypto_int64) (1L << 25)) >> 26; h1 += carry0; h0 -= carry0 << 26;\n  carry4 = (h4 + (crypto_int64) (1L << 25)) >> 26; h5 += carry4; h4 -= carry4 << 26;\n\n  carry1 = (h1 + (crypto_int64) (1L << 24)) >> 25; h2 += carry1; h1 -= carry1 << 25;\n  carry5 = (h5 + (crypto_int64) (1L << 24)) >> 25; h6 += carry5; h5 -= carry5 << 25;\n\n  carry2 = (h2 + (crypto_int64) (1L << 25)) >> 26; h3 += carry2; h2 -= carry2 << 26;\n  carry6 = (h6 + (crypto_int64) (1L << 25)) >> 26; h7 += carry6; h6 -= carry6 << 26;\n\n  carry3 = (h3 + (crypto_int64) (1L << 24)) >> 25; h4 += carry3; h3 -= carry3 << 25;\n  carry7 = (h7 + (crypto_int64) (1L << 24)) >> 25; h8 += carry7; h7 -= carry7 << 25;\n\n  carry4 = (h4 + (crypto_int64) (1L << 25)) >> 26; h5 += carry4; h4 -= carry4 << 26;\n  carry8 = (h8 + (crypto_int64) (1L << 25)) >> 26; h9 += carry8; h8 -= carry8 << 26;\n\n  carry9 = (h9 + (crypto_int64) (1L << 24)) >> 25; h0 += carry9 * 19; h9 -= carry9 << 25;\n\n  carry0 = (h0 + (crypto_int64) (1L << 25)) >> 26; h1 += carry0; h0 -= carry0 << 26;\n\n  h[0] = (crypto_int32) h0;\n  h[1] = (crypto_int32) h1;\n  h[2] = (crypto_int32) h2;\n  h[3] = (crypto_int32) h3;\n  h[4] = (crypto_int32) h4;\n  h[5] = (crypto_int32) h5;\n  h[6] = (crypto_int32) h6;\n  h[7] = (crypto_int32) h7;\n  h[8] = (crypto_int32) h8;\n  h[9] = (crypto_int32) h9;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/fe_sub.c",
    "content": "#include \"fe.h\"\n\n/*\nh = f - g\nCan overlap h with f or g.\n\nPreconditions:\n   |f| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n   |g| bounded by 1.1*2^25,1.1*2^24,1.1*2^25,1.1*2^24,etc.\n\nPostconditions:\n   |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n*/\n\nvoid fe_sub(fe h,const fe f,const fe g)\n{\n  crypto_int32 f0 = f[0];\n  crypto_int32 f1 = f[1];\n  crypto_int32 f2 = f[2];\n  crypto_int32 f3 = f[3];\n  crypto_int32 f4 = f[4];\n  crypto_int32 f5 = f[5];\n  crypto_int32 f6 = f[6];\n  crypto_int32 f7 = f[7];\n  crypto_int32 f8 = f[8];\n  crypto_int32 f9 = f[9];\n  crypto_int32 g0 = g[0];\n  crypto_int32 g1 = g[1];\n  crypto_int32 g2 = g[2];\n  crypto_int32 g3 = g[3];\n  crypto_int32 g4 = g[4];\n  crypto_int32 g5 = g[5];\n  crypto_int32 g6 = g[6];\n  crypto_int32 g7 = g[7];\n  crypto_int32 g8 = g[8];\n  crypto_int32 g9 = g[9];\n  crypto_int32 h0 = f0 - g0;\n  crypto_int32 h1 = f1 - g1;\n  crypto_int32 h2 = f2 - g2;\n  crypto_int32 h3 = f3 - g3;\n  crypto_int32 h4 = f4 - g4;\n  crypto_int32 h5 = f5 - g5;\n  crypto_int32 h6 = f6 - g6;\n  crypto_int32 h7 = f7 - g7;\n  crypto_int32 h8 = f8 - g8;\n  crypto_int32 h9 = f9 - g9;\n  h[0] = h0;\n  h[1] = h1;\n  h[2] = h2;\n  h[3] = h3;\n  h[4] = h4;\n  h[5] = h5;\n  h[6] = h6;\n  h[7] = h7;\n  h[8] = h8;\n  h[9] = h9;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/fe_tobytes.c",
    "content": "#include \"fe.h\"\n\n/*\nPreconditions:\n  |h| bounded by 1.1*2^26,1.1*2^25,1.1*2^26,1.1*2^25,etc.\n\nWrite p=2^255-19; q=floor(h/p).\nBasic claim: q = floor(2^(-255)(h + 19 2^(-25)h9 + 2^(-1))).\n\nProof:\n  Have |h|<=p so |q|<=1 so |19^2 2^(-255) q|<1/4.\n  Also have |h-2^230 h9|<2^231 so |19 2^(-255)(h-2^230 h9)|<1/4.\n\n  Write y=2^(-1)-19^2 2^(-255)q-19 2^(-255)(h-2^230 h9).\n  Then 0<y<1.\n\n  Write r=h-pq.\n  Have 0<=r<=p-1=2^255-20.\n  Thus 0<=r+19(2^-255)r<r+19(2^-255)2^255<=2^255-1.\n\n  Write x=r+19(2^-255)r+y.\n  Then 0<x<2^255 so floor(2^(-255)x) = 0 so floor(q+2^(-255)x) = q.\n\n  Have q+2^(-255)x = 2^(-255)(h + 19 2^(-25) h9 + 2^(-1))\n  so floor(2^(-255)(h + 19 2^(-25) h9 + 2^(-1))) = q.\n*/\n\nvoid fe_tobytes(unsigned char *s,const fe h)\n{\n  crypto_int32 h0 = h[0];\n  crypto_int32 h1 = h[1];\n  crypto_int32 h2 = h[2];\n  crypto_int32 h3 = h[3];\n  crypto_int32 h4 = h[4];\n  crypto_int32 h5 = h[5];\n  crypto_int32 h6 = h[6];\n  crypto_int32 h7 = h[7];\n  crypto_int32 h8 = h[8];\n  crypto_int32 h9 = h[9];\n  crypto_int32 q;\n  crypto_int32 carry0;\n  crypto_int32 carry1;\n  crypto_int32 carry2;\n  crypto_int32 carry3;\n  crypto_int32 carry4;\n  crypto_int32 carry5;\n  crypto_int32 carry6;\n  crypto_int32 carry7;\n  crypto_int32 carry8;\n  crypto_int32 carry9;\n\n  q = (19 * h9 + (((crypto_int32) 1) << 24)) >> 25;\n  q = (h0 + q) >> 26;\n  q = (h1 + q) >> 25;\n  q = (h2 + q) >> 26;\n  q = (h3 + q) >> 25;\n  q = (h4 + q) >> 26;\n  q = (h5 + q) >> 25;\n  q = (h6 + q) >> 26;\n  q = (h7 + q) >> 25;\n  q = (h8 + q) >> 26;\n  q = (h9 + q) >> 25;\n\n  /* Goal: Output h-(2^255-19)q, which is between 0 and 2^255-20. */\n  h0 += 19 * q;\n  /* Goal: Output h-2^255 q, which is between 0 and 2^255-20. */\n\n  carry0 = h0 >> 26; h1 += carry0; h0 -= carry0 << 26;\n  carry1 = h1 >> 25; h2 += carry1; h1 -= carry1 << 25;\n  carry2 = h2 >> 26; h3 += carry2; h2 -= carry2 << 26;\n  carry3 = h3 >> 25; h4 += carry3; h3 -= carry3 << 25;\n  carry4 = h4 >> 26; h5 += carry4; h4 -= carry4 << 26;\n  carry5 = h5 >> 25; h6 += carry5; h5 -= carry5 << 25;\n  carry6 = h6 >> 26; h7 += carry6; h6 -= carry6 << 26;\n  carry7 = h7 >> 25; h8 += carry7; h7 -= carry7 << 25;\n  carry8 = h8 >> 26; h9 += carry8; h8 -= carry8 << 26;\n  carry9 = h9 >> 25;               h9 -= carry9 << 25;\n                  /* h10 = carry9 */\n\n  /*\n  Goal: Output h0+...+2^255 h10-2^255 q, which is between 0 and 2^255-20.\n  Have h0+...+2^230 h9 between 0 and 2^255-1;\n  evidently 2^255 h10-2^255 q = 0.\n  Goal: Output h0+...+2^230 h9.\n  */\n\n  s[0] = h0 >> 0;\n  s[1] = h0 >> 8;\n  s[2] = h0 >> 16;\n  s[3] = (h0 >> 24) | (h1 << 2);\n  s[4] = h1 >> 6;\n  s[5] = h1 >> 14;\n  s[6] = (h1 >> 22) | (h2 << 3);\n  s[7] = h2 >> 5;\n  s[8] = h2 >> 13;\n  s[9] = (h2 >> 21) | (h3 << 5);\n  s[10] = h3 >> 3;\n  s[11] = h3 >> 11;\n  s[12] = (h3 >> 19) | (h4 << 6);\n  s[13] = h4 >> 2;\n  s[14] = h4 >> 10;\n  s[15] = h4 >> 18;\n  s[16] = h5 >> 0;\n  s[17] = h5 >> 8;\n  s[18] = h5 >> 16;\n  s[19] = (h5 >> 24) | (h6 << 1);\n  s[20] = h6 >> 7;\n  s[21] = h6 >> 15;\n  s[22] = (h6 >> 23) | (h7 << 3);\n  s[23] = h7 >> 5;\n  s[24] = h7 >> 13;\n  s[25] = (h7 >> 21) | (h8 << 4);\n  s[26] = h8 >> 4;\n  s[27] = h8 >> 12;\n  s[28] = (h8 >> 20) | (h9 << 6);\n  s[29] = h9 >> 2;\n  s[30] = h9 >> 10;\n  s[31] = h9 >> 18;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge.h",
    "content": "#ifndef GE_H\n#define GE_H\n\n/*\nge means group element.\n\nHere the group is the set of pairs (x,y) of field elements (see fe.h)\nsatisfying -x^2 + y^2 = 1 + d x^2y^2\nwhere d = -121665/121666.\n\nRepresentations:\n  ge_p2 (projective): (X:Y:Z) satisfying x=X/Z, y=Y/Z\n  ge_p3 (extended): (X:Y:Z:T) satisfying x=X/Z, y=Y/Z, XY=ZT\n  ge_p1p1 (completed): ((X:Z),(Y:T)) satisfying x=X/Z, y=Y/T\n  ge_precomp (Duif): (y+x,y-x,2dxy)\n*/\n\n#include \"fe.h\"\n\ntypedef struct {\n  fe X;\n  fe Y;\n  fe Z;\n} ge_p2;\n\ntypedef struct {\n  fe X;\n  fe Y;\n  fe Z;\n  fe T;\n} ge_p3;\n\ntypedef struct {\n  fe X;\n  fe Y;\n  fe Z;\n  fe T;\n} ge_p1p1;\n\ntypedef struct {\n  fe yplusx;\n  fe yminusx;\n  fe xy2d;\n} ge_precomp;\n\ntypedef struct {\n  fe YplusX;\n  fe YminusX;\n  fe Z;\n  fe T2d;\n} ge_cached;\n\n#define ge_frombytes_negate_vartime crypto_sign_ed25519_ref10_ge_frombytes_negate_vartime\n#define ge_tobytes crypto_sign_ed25519_ref10_ge_tobytes\n#define ge_p3_tobytes crypto_sign_ed25519_ref10_ge_p3_tobytes\n\n#define ge_p2_0 crypto_sign_ed25519_ref10_ge_p2_0\n#define ge_p3_0 crypto_sign_ed25519_ref10_ge_p3_0\n#define ge_precomp_0 crypto_sign_ed25519_ref10_ge_precomp_0\n#define ge_p3_to_p2 crypto_sign_ed25519_ref10_ge_p3_to_p2\n#define ge_p3_to_cached crypto_sign_ed25519_ref10_ge_p3_to_cached\n#define ge_p1p1_to_p2 crypto_sign_ed25519_ref10_ge_p1p1_to_p2\n#define ge_p1p1_to_p3 crypto_sign_ed25519_ref10_ge_p1p1_to_p3\n#define ge_p2_dbl crypto_sign_ed25519_ref10_ge_p2_dbl\n#define ge_p3_dbl crypto_sign_ed25519_ref10_ge_p3_dbl\n\n#define ge_madd crypto_sign_ed25519_ref10_ge_madd\n#define ge_msub crypto_sign_ed25519_ref10_ge_msub\n#define ge_add crypto_sign_ed25519_ref10_ge_add\n#define ge_sub crypto_sign_ed25519_ref10_ge_sub\n#define ge_scalarmult_base crypto_sign_ed25519_ref10_ge_scalarmult_base\n#define ge_double_scalarmult_vartime crypto_sign_ed25519_ref10_ge_double_scalarmult_vartime\n#define ge_scalarmult_vartime crypto_sign_ed25519_ref10_ge_scalarmult_vartime\n\nextern void ge_tobytes(unsigned char *,const ge_p2 *);\nextern void ge_p3_tobytes(unsigned char *,const ge_p3 *);\nextern int ge_frombytes_negate_vartime(ge_p3 *,const unsigned char *);\n\nextern void ge_p2_0(ge_p2 *);\nextern void ge_p3_0(ge_p3 *);\nextern void ge_precomp_0(ge_precomp *);\nextern void ge_p3_to_p2(ge_p2 *,const ge_p3 *);\nextern void ge_p3_to_cached(ge_cached *,const ge_p3 *);\nextern void ge_p1p1_to_p2(ge_p2 *,const ge_p1p1 *);\nextern void ge_p1p1_to_p3(ge_p3 *,const ge_p1p1 *);\nextern void ge_p2_dbl(ge_p1p1 *,const ge_p2 *);\nextern void ge_p3_dbl(ge_p1p1 *,const ge_p3 *);\n\nextern void ge_madd(ge_p1p1 *,const ge_p3 *,const ge_precomp *);\nextern void ge_msub(ge_p1p1 *,const ge_p3 *,const ge_precomp *);\nextern void ge_add(ge_p1p1 *,const ge_p3 *,const ge_cached *);\nextern void ge_sub(ge_p1p1 *,const ge_p3 *,const ge_cached *);\nextern void ge_scalarmult_base(ge_p3 *,const unsigned char *);\nextern void ge_double_scalarmult_vartime(ge_p2 *,const unsigned char *,const ge_p3 *,const unsigned char *);\nextern void ge_scalarmult_vartime(ge_p3 *,const unsigned char *,const ge_p3 *);\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_add.c",
    "content": "#include \"ge.h\"\n\n/*\nr = p + q\n*/\n\nvoid ge_add(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q)\n{\n  fe t0;\n#include \"ge_add.h\"\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_add.h",
    "content": "\n/* qhasm: enter ge_add */\n\n/* qhasm: fe X1 */\n\n/* qhasm: fe Y1 */\n\n/* qhasm: fe Z1 */\n\n/* qhasm: fe Z2 */\n\n/* qhasm: fe T1 */\n\n/* qhasm: fe ZZ */\n\n/* qhasm: fe YpX2 */\n\n/* qhasm: fe YmX2 */\n\n/* qhasm: fe T2d2 */\n\n/* qhasm: fe X3 */\n\n/* qhasm: fe Y3 */\n\n/* qhasm: fe Z3 */\n\n/* qhasm: fe T3 */\n\n/* qhasm: fe YpX1 */\n\n/* qhasm: fe YmX1 */\n\n/* qhasm: fe A */\n\n/* qhasm: fe B */\n\n/* qhasm: fe C */\n\n/* qhasm: fe D */\n\n/* qhasm: YpX1 = Y1+X1 */\n/* asm 1: fe_add(>YpX1=fe#1,<Y1=fe#12,<X1=fe#11); */\n/* asm 2: fe_add(>YpX1=r->X,<Y1=p->Y,<X1=p->X); */\nfe_add(r->X,p->Y,p->X);\n\n/* qhasm: YmX1 = Y1-X1 */\n/* asm 1: fe_sub(>YmX1=fe#2,<Y1=fe#12,<X1=fe#11); */\n/* asm 2: fe_sub(>YmX1=r->Y,<Y1=p->Y,<X1=p->X); */\nfe_sub(r->Y,p->Y,p->X);\n\n/* qhasm: A = YpX1*YpX2 */\n/* asm 1: fe_mul(>A=fe#3,<YpX1=fe#1,<YpX2=fe#15); */\n/* asm 2: fe_mul(>A=r->Z,<YpX1=r->X,<YpX2=q->YplusX); */\nfe_mul(r->Z,r->X,q->YplusX);\n\n/* qhasm: B = YmX1*YmX2 */\n/* asm 1: fe_mul(>B=fe#2,<YmX1=fe#2,<YmX2=fe#16); */\n/* asm 2: fe_mul(>B=r->Y,<YmX1=r->Y,<YmX2=q->YminusX); */\nfe_mul(r->Y,r->Y,q->YminusX);\n\n/* qhasm: C = T2d2*T1 */\n/* asm 1: fe_mul(>C=fe#4,<T2d2=fe#18,<T1=fe#14); */\n/* asm 2: fe_mul(>C=r->T,<T2d2=q->T2d,<T1=p->T); */\nfe_mul(r->T,q->T2d,p->T);\n\n/* qhasm: ZZ = Z1*Z2 */\n/* asm 1: fe_mul(>ZZ=fe#1,<Z1=fe#13,<Z2=fe#17); */\n/* asm 2: fe_mul(>ZZ=r->X,<Z1=p->Z,<Z2=q->Z); */\nfe_mul(r->X,p->Z,q->Z);\n\n/* qhasm: D = 2*ZZ */\n/* asm 1: fe_add(>D=fe#5,<ZZ=fe#1,<ZZ=fe#1); */\n/* asm 2: fe_add(>D=t0,<ZZ=r->X,<ZZ=r->X); */\nfe_add(t0,r->X,r->X);\n\n/* qhasm: X3 = A-B */\n/* asm 1: fe_sub(>X3=fe#1,<A=fe#3,<B=fe#2); */\n/* asm 2: fe_sub(>X3=r->X,<A=r->Z,<B=r->Y); */\nfe_sub(r->X,r->Z,r->Y);\n\n/* qhasm: Y3 = A+B */\n/* asm 1: fe_add(>Y3=fe#2,<A=fe#3,<B=fe#2); */\n/* asm 2: fe_add(>Y3=r->Y,<A=r->Z,<B=r->Y); */\nfe_add(r->Y,r->Z,r->Y);\n\n/* qhasm: Z3 = D+C */\n/* asm 1: fe_add(>Z3=fe#3,<D=fe#5,<C=fe#4); */\n/* asm 2: fe_add(>Z3=r->Z,<D=t0,<C=r->T); */\nfe_add(r->Z,t0,r->T);\n\n/* qhasm: T3 = D-C */\n/* asm 1: fe_sub(>T3=fe#4,<D=fe#5,<C=fe#4); */\n/* asm 2: fe_sub(>T3=r->T,<D=t0,<C=r->T); */\nfe_sub(r->T,t0,r->T);\n\n/* qhasm: return */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_double_scalarmult.c",
    "content": "#include \"ge.h\"\n\nstatic void slide(signed char *r,const unsigned char *a)\n{\n  int i;\n  int b;\n  int k;\n\n  for (i = 0;i < 256;++i)\n    r[i] = 1 & (a[i >> 3] >> (i & 7));\n\n  for (i = 0;i < 256;++i)\n    if (r[i]) {\n      for (b = 1;b <= 6 && i + b < 256;++b) {\n        if (r[i + b]) {\n          if (r[i] + (r[i + b] << b) <= 15) {\n            r[i] += r[i + b] << b; r[i + b] = 0;\n          } else if (r[i] - (r[i + b] << b) >= -15) {\n            r[i] -= r[i + b] << b;\n            for (k = i + b;k < 256;++k) {\n              if (!r[k]) {\n                r[k] = 1;\n                break;\n              }\n              r[k] = 0;\n            }\n          } else\n            break;\n        }\n      }\n    }\n\n}\n\nstatic ge_precomp Bi[8] = {\n#include \"base2.h\"\n} ;\n\n/*\nr = a * A + b * B\nwhere a = a[0]+256*a[1]+...+256^31 a[31].\nand b = b[0]+256*b[1]+...+256^31 b[31].\nB is the Ed25519 base point (x,4/5) with x positive.\n*/\n\nvoid ge_double_scalarmult_vartime(ge_p2 *r,const unsigned char *a,const ge_p3 *A,const unsigned char *b)\n{\n  signed char aslide[256];\n  signed char bslide[256];\n  ge_cached Ai[8]; /* A,3A,5A,7A,9A,11A,13A,15A */\n  ge_p1p1 t;\n  ge_p3 u;\n  ge_p3 A2;\n  int i;\n\n  slide(aslide,a);\n  slide(bslide,b);\n\n  ge_p3_to_cached(&Ai[0],A);\n  ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t);\n  ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u);\n  ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u);\n  ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u);\n  ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u);\n  ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u);\n  ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u);\n  ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u);\n\n  ge_p2_0(r);\n\n  for (i = 255;i >= 0;--i) {\n    if (aslide[i] || bslide[i]) break;\n  }\n\n  for (;i >= 0;--i) {\n    ge_p2_dbl(&t,r);\n\n    if (aslide[i] > 0) {\n      ge_p1p1_to_p3(&u,&t);\n      ge_add(&t,&u,&Ai[aslide[i]/2]);\n    } else if (aslide[i] < 0) {\n      ge_p1p1_to_p3(&u,&t);\n      ge_sub(&t,&u,&Ai[(-aslide[i])/2]);\n    }\n\n    if (bslide[i] > 0) {\n      ge_p1p1_to_p3(&u,&t);\n      ge_madd(&t,&u,&Bi[bslide[i]/2]);\n    } else if (bslide[i] < 0) {\n      ge_p1p1_to_p3(&u,&t);\n      ge_msub(&t,&u,&Bi[(-bslide[i])/2]);\n    }\n\n    ge_p1p1_to_p2(r,&t);\n  }\n}\n\nvoid ge_scalarmult_vartime(ge_p3 *r,const unsigned char *a,const ge_p3 *A)\n{\n  signed char aslide[256];\n  ge_cached Ai[8];\n  ge_p1p1 t;\n  ge_p3 u;\n  ge_p3 A2;\n  int i;\n\n  slide(aslide,a);\n\n  ge_p3_to_cached(&Ai[0],A);\n  ge_p3_dbl(&t,A); ge_p1p1_to_p3(&A2,&t);\n  ge_add(&t,&A2,&Ai[0]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[1],&u);\n  ge_add(&t,&A2,&Ai[1]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[2],&u);\n  ge_add(&t,&A2,&Ai[2]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[3],&u);\n  ge_add(&t,&A2,&Ai[3]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[4],&u);\n  ge_add(&t,&A2,&Ai[4]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[5],&u);\n  ge_add(&t,&A2,&Ai[5]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[6],&u);\n  ge_add(&t,&A2,&Ai[6]); ge_p1p1_to_p3(&u,&t); ge_p3_to_cached(&Ai[7],&u);\n\n  ge_p3_0(r);\n\n  for (i = 255;i >= 0;--i) {\n    if (aslide[i]) break;\n  }\n\n  for (;i >= 0;--i) {\n    ge_p3_dbl(&t,r);\n\n    if (aslide[i] > 0) {\n      ge_p1p1_to_p3(&u,&t);\n      ge_add(&t,&u,&Ai[aslide[i]/2]);\n    } else if (aslide[i] < 0) {\n      ge_p1p1_to_p3(&u,&t);\n      ge_sub(&t,&u,&Ai[(-aslide[i])/2]);\n    }\n\n   ge_p1p1_to_p3(r,&t);\n  }\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_frombytes.c",
    "content": "#include \"ge.h\"\n\nstatic const fe d = {\n#include \"d.h\"\n} ;\n\nstatic const fe sqrtm1 = {\n#include \"sqrtm1.h\"\n} ;\n\nint ge_frombytes_negate_vartime(ge_p3 *h,const unsigned char *s)\n{\n  fe u;\n  fe v;\n  fe v3;\n  fe vxx;\n  fe check;\n\n  fe_frombytes(h->Y,s);\n  fe_1(h->Z);\n  fe_sq(u,h->Y);\n  fe_mul(v,u,d);\n  fe_sub(u,u,h->Z);       /* u = y^2-1 */\n  fe_add(v,v,h->Z);       /* v = dy^2+1 */\n\n  fe_sq(v3,v);\n  fe_mul(v3,v3,v);        /* v3 = v^3 */\n  fe_sq(h->X,v3);\n  fe_mul(h->X,h->X,v);\n  fe_mul(h->X,h->X,u);    /* x = uv^7 */\n\n  fe_pow22523(h->X,h->X); /* x = (uv^7)^((q-5)/8) */\n  fe_mul(h->X,h->X,v3);\n  fe_mul(h->X,h->X,u);    /* x = uv^3(uv^7)^((q-5)/8) */\n\n  fe_sq(vxx,h->X);\n  fe_mul(vxx,vxx,v);\n  fe_sub(check,vxx,u);    /* vx^2-u */\n  if (fe_isnonzero(check)) {\n    fe_add(check,vxx,u);  /* vx^2+u */\n    if (fe_isnonzero(check)) return -1;\n    fe_mul(h->X,h->X,sqrtm1);\n  }\n\n  if (fe_isnegative(h->X) == (s[31] >> 7))\n    fe_neg(h->X,h->X);\n\n  fe_mul(h->T,h->X,h->Y);\n  return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_madd.c",
    "content": "#include \"ge.h\"\n\n/*\nr = p + q\n*/\n\nvoid ge_madd(ge_p1p1 *r,const ge_p3 *p,const ge_precomp *q)\n{\n  fe t0;\n#include \"ge_madd.h\"\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_madd.h",
    "content": "\n/* qhasm: enter ge_madd */\n\n/* qhasm: fe X1 */\n\n/* qhasm: fe Y1 */\n\n/* qhasm: fe Z1 */\n\n/* qhasm: fe T1 */\n\n/* qhasm: fe ypx2 */\n\n/* qhasm: fe ymx2 */\n\n/* qhasm: fe xy2d2 */\n\n/* qhasm: fe X3 */\n\n/* qhasm: fe Y3 */\n\n/* qhasm: fe Z3 */\n\n/* qhasm: fe T3 */\n\n/* qhasm: fe YpX1 */\n\n/* qhasm: fe YmX1 */\n\n/* qhasm: fe A */\n\n/* qhasm: fe B */\n\n/* qhasm: fe C */\n\n/* qhasm: fe D */\n\n/* qhasm: YpX1 = Y1+X1 */\n/* asm 1: fe_add(>YpX1=fe#1,<Y1=fe#12,<X1=fe#11); */\n/* asm 2: fe_add(>YpX1=r->X,<Y1=p->Y,<X1=p->X); */\nfe_add(r->X,p->Y,p->X);\n\n/* qhasm: YmX1 = Y1-X1 */\n/* asm 1: fe_sub(>YmX1=fe#2,<Y1=fe#12,<X1=fe#11); */\n/* asm 2: fe_sub(>YmX1=r->Y,<Y1=p->Y,<X1=p->X); */\nfe_sub(r->Y,p->Y,p->X);\n\n/* qhasm: A = YpX1*ypx2 */\n/* asm 1: fe_mul(>A=fe#3,<YpX1=fe#1,<ypx2=fe#15); */\n/* asm 2: fe_mul(>A=r->Z,<YpX1=r->X,<ypx2=q->yplusx); */\nfe_mul(r->Z,r->X,q->yplusx);\n\n/* qhasm: B = YmX1*ymx2 */\n/* asm 1: fe_mul(>B=fe#2,<YmX1=fe#2,<ymx2=fe#16); */\n/* asm 2: fe_mul(>B=r->Y,<YmX1=r->Y,<ymx2=q->yminusx); */\nfe_mul(r->Y,r->Y,q->yminusx);\n\n/* qhasm: C = xy2d2*T1 */\n/* asm 1: fe_mul(>C=fe#4,<xy2d2=fe#17,<T1=fe#14); */\n/* asm 2: fe_mul(>C=r->T,<xy2d2=q->xy2d,<T1=p->T); */\nfe_mul(r->T,q->xy2d,p->T);\n\n/* qhasm: D = 2*Z1 */\n/* asm 1: fe_add(>D=fe#5,<Z1=fe#13,<Z1=fe#13); */\n/* asm 2: fe_add(>D=t0,<Z1=p->Z,<Z1=p->Z); */\nfe_add(t0,p->Z,p->Z);\n\n/* qhasm: X3 = A-B */\n/* asm 1: fe_sub(>X3=fe#1,<A=fe#3,<B=fe#2); */\n/* asm 2: fe_sub(>X3=r->X,<A=r->Z,<B=r->Y); */\nfe_sub(r->X,r->Z,r->Y);\n\n/* qhasm: Y3 = A+B */\n/* asm 1: fe_add(>Y3=fe#2,<A=fe#3,<B=fe#2); */\n/* asm 2: fe_add(>Y3=r->Y,<A=r->Z,<B=r->Y); */\nfe_add(r->Y,r->Z,r->Y);\n\n/* qhasm: Z3 = D+C */\n/* asm 1: fe_add(>Z3=fe#3,<D=fe#5,<C=fe#4); */\n/* asm 2: fe_add(>Z3=r->Z,<D=t0,<C=r->T); */\nfe_add(r->Z,t0,r->T);\n\n/* qhasm: T3 = D-C */\n/* asm 1: fe_sub(>T3=fe#4,<D=fe#5,<C=fe#4); */\n/* asm 2: fe_sub(>T3=r->T,<D=t0,<C=r->T); */\nfe_sub(r->T,t0,r->T);\n\n/* qhasm: return */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_msub.c",
    "content": "#include \"ge.h\"\n\n/*\nr = p - q\n*/\n\nvoid ge_msub(ge_p1p1 *r,const ge_p3 *p,const ge_precomp *q)\n{\n  fe t0;\n#include \"ge_msub.h\"\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_msub.h",
    "content": "\n/* qhasm: enter ge_msub */\n\n/* qhasm: fe X1 */\n\n/* qhasm: fe Y1 */\n\n/* qhasm: fe Z1 */\n\n/* qhasm: fe T1 */\n\n/* qhasm: fe ypx2 */\n\n/* qhasm: fe ymx2 */\n\n/* qhasm: fe xy2d2 */\n\n/* qhasm: fe X3 */\n\n/* qhasm: fe Y3 */\n\n/* qhasm: fe Z3 */\n\n/* qhasm: fe T3 */\n\n/* qhasm: fe YpX1 */\n\n/* qhasm: fe YmX1 */\n\n/* qhasm: fe A */\n\n/* qhasm: fe B */\n\n/* qhasm: fe C */\n\n/* qhasm: fe D */\n\n/* qhasm: YpX1 = Y1+X1 */\n/* asm 1: fe_add(>YpX1=fe#1,<Y1=fe#12,<X1=fe#11); */\n/* asm 2: fe_add(>YpX1=r->X,<Y1=p->Y,<X1=p->X); */\nfe_add(r->X,p->Y,p->X);\n\n/* qhasm: YmX1 = Y1-X1 */\n/* asm 1: fe_sub(>YmX1=fe#2,<Y1=fe#12,<X1=fe#11); */\n/* asm 2: fe_sub(>YmX1=r->Y,<Y1=p->Y,<X1=p->X); */\nfe_sub(r->Y,p->Y,p->X);\n\n/* qhasm: A = YpX1*ymx2 */\n/* asm 1: fe_mul(>A=fe#3,<YpX1=fe#1,<ymx2=fe#16); */\n/* asm 2: fe_mul(>A=r->Z,<YpX1=r->X,<ymx2=q->yminusx); */\nfe_mul(r->Z,r->X,q->yminusx);\n\n/* qhasm: B = YmX1*ypx2 */\n/* asm 1: fe_mul(>B=fe#2,<YmX1=fe#2,<ypx2=fe#15); */\n/* asm 2: fe_mul(>B=r->Y,<YmX1=r->Y,<ypx2=q->yplusx); */\nfe_mul(r->Y,r->Y,q->yplusx);\n\n/* qhasm: C = xy2d2*T1 */\n/* asm 1: fe_mul(>C=fe#4,<xy2d2=fe#17,<T1=fe#14); */\n/* asm 2: fe_mul(>C=r->T,<xy2d2=q->xy2d,<T1=p->T); */\nfe_mul(r->T,q->xy2d,p->T);\n\n/* qhasm: D = 2*Z1 */\n/* asm 1: fe_add(>D=fe#5,<Z1=fe#13,<Z1=fe#13); */\n/* asm 2: fe_add(>D=t0,<Z1=p->Z,<Z1=p->Z); */\nfe_add(t0,p->Z,p->Z);\n\n/* qhasm: X3 = A-B */\n/* asm 1: fe_sub(>X3=fe#1,<A=fe#3,<B=fe#2); */\n/* asm 2: fe_sub(>X3=r->X,<A=r->Z,<B=r->Y); */\nfe_sub(r->X,r->Z,r->Y);\n\n/* qhasm: Y3 = A+B */\n/* asm 1: fe_add(>Y3=fe#2,<A=fe#3,<B=fe#2); */\n/* asm 2: fe_add(>Y3=r->Y,<A=r->Z,<B=r->Y); */\nfe_add(r->Y,r->Z,r->Y);\n\n/* qhasm: Z3 = D-C */\n/* asm 1: fe_sub(>Z3=fe#3,<D=fe#5,<C=fe#4); */\n/* asm 2: fe_sub(>Z3=r->Z,<D=t0,<C=r->T); */\nfe_sub(r->Z,t0,r->T);\n\n/* qhasm: T3 = D+C */\n/* asm 1: fe_add(>T3=fe#4,<D=fe#5,<C=fe#4); */\n/* asm 2: fe_add(>T3=r->T,<D=t0,<C=r->T); */\nfe_add(r->T,t0,r->T);\n\n/* qhasm: return */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_p1p1_to_p2.c",
    "content": "#include \"ge.h\"\n\n/*\nr = p\n*/\n\nextern void ge_p1p1_to_p2(ge_p2 *r,const ge_p1p1 *p)\n{\n  fe_mul(r->X,p->X,p->T);\n  fe_mul(r->Y,p->Y,p->Z);\n  fe_mul(r->Z,p->Z,p->T);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_p1p1_to_p3.c",
    "content": "#include \"ge.h\"\n\n/*\nr = p\n*/\n\nextern void ge_p1p1_to_p3(ge_p3 *r,const ge_p1p1 *p)\n{\n  fe_mul(r->X,p->X,p->T);\n  fe_mul(r->Y,p->Y,p->Z);\n  fe_mul(r->Z,p->Z,p->T);\n  fe_mul(r->T,p->X,p->Y);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_p2_0.c",
    "content": "#include \"ge.h\"\n\nvoid ge_p2_0(ge_p2 *h)\n{\n  fe_0(h->X);\n  fe_1(h->Y);\n  fe_1(h->Z);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_p2_dbl.c",
    "content": "#include \"ge.h\"\n\n/*\nr = 2 * p\n*/\n\nvoid ge_p2_dbl(ge_p1p1 *r,const ge_p2 *p)\n{\n  fe t0;\n#include \"ge_p2_dbl.h\"\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_p2_dbl.h",
    "content": "\n/* qhasm: enter ge_p2_dbl */\n\n/* qhasm: fe X1 */\n\n/* qhasm: fe Y1 */\n\n/* qhasm: fe Z1 */\n\n/* qhasm: fe A */\n\n/* qhasm: fe AA */\n\n/* qhasm: fe XX */\n\n/* qhasm: fe YY */\n\n/* qhasm: fe B */\n\n/* qhasm: fe X3 */\n\n/* qhasm: fe Y3 */\n\n/* qhasm: fe Z3 */\n\n/* qhasm: fe T3 */\n\n/* qhasm: XX=X1^2 */\n/* asm 1: fe_sq(>XX=fe#1,<X1=fe#11); */\n/* asm 2: fe_sq(>XX=r->X,<X1=p->X); */\nfe_sq(r->X,p->X);\n\n/* qhasm: YY=Y1^2 */\n/* asm 1: fe_sq(>YY=fe#3,<Y1=fe#12); */\n/* asm 2: fe_sq(>YY=r->Z,<Y1=p->Y); */\nfe_sq(r->Z,p->Y);\n\n/* qhasm: B=2*Z1^2 */\n/* asm 1: fe_sq2(>B=fe#4,<Z1=fe#13); */\n/* asm 2: fe_sq2(>B=r->T,<Z1=p->Z); */\nfe_sq2(r->T,p->Z);\n\n/* qhasm: A=X1+Y1 */\n/* asm 1: fe_add(>A=fe#2,<X1=fe#11,<Y1=fe#12); */\n/* asm 2: fe_add(>A=r->Y,<X1=p->X,<Y1=p->Y); */\nfe_add(r->Y,p->X,p->Y);\n\n/* qhasm: AA=A^2 */\n/* asm 1: fe_sq(>AA=fe#5,<A=fe#2); */\n/* asm 2: fe_sq(>AA=t0,<A=r->Y); */\nfe_sq(t0,r->Y);\n\n/* qhasm: Y3=YY+XX */\n/* asm 1: fe_add(>Y3=fe#2,<YY=fe#3,<XX=fe#1); */\n/* asm 2: fe_add(>Y3=r->Y,<YY=r->Z,<XX=r->X); */\nfe_add(r->Y,r->Z,r->X);\n\n/* qhasm: Z3=YY-XX */\n/* asm 1: fe_sub(>Z3=fe#3,<YY=fe#3,<XX=fe#1); */\n/* asm 2: fe_sub(>Z3=r->Z,<YY=r->Z,<XX=r->X); */\nfe_sub(r->Z,r->Z,r->X);\n\n/* qhasm: X3=AA-Y3 */\n/* asm 1: fe_sub(>X3=fe#1,<AA=fe#5,<Y3=fe#2); */\n/* asm 2: fe_sub(>X3=r->X,<AA=t0,<Y3=r->Y); */\nfe_sub(r->X,t0,r->Y);\n\n/* qhasm: T3=B-Z3 */\n/* asm 1: fe_sub(>T3=fe#4,<B=fe#4,<Z3=fe#3); */\n/* asm 2: fe_sub(>T3=r->T,<B=r->T,<Z3=r->Z); */\nfe_sub(r->T,r->T,r->Z);\n\n/* qhasm: return */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_p3_0.c",
    "content": "#include \"ge.h\"\n\nvoid ge_p3_0(ge_p3 *h)\n{\n  fe_0(h->X);\n  fe_1(h->Y);\n  fe_1(h->Z);\n  fe_0(h->T);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_p3_dbl.c",
    "content": "#include \"ge.h\"\n\n/*\nr = 2 * p\n*/\n\nvoid ge_p3_dbl(ge_p1p1 *r,const ge_p3 *p)\n{\n  ge_p2 q;\n  ge_p3_to_p2(&q,p);\n  ge_p2_dbl(r,&q);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_p3_to_cached.c",
    "content": "#include \"ge.h\"\n\n/*\nr = p\n*/\n\nstatic const fe d2 = {\n#include \"d2.h\"\n} ;\n\nextern void ge_p3_to_cached(ge_cached *r,const ge_p3 *p)\n{\n  fe_add(r->YplusX,p->Y,p->X);\n  fe_sub(r->YminusX,p->Y,p->X);\n  fe_copy(r->Z,p->Z);\n  fe_mul(r->T2d,p->T,d2);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_p3_to_p2.c",
    "content": "#include \"ge.h\"\n\n/*\nr = p\n*/\n\nextern void ge_p3_to_p2(ge_p2 *r,const ge_p3 *p)\n{\n  fe_copy(r->X,p->X);\n  fe_copy(r->Y,p->Y);\n  fe_copy(r->Z,p->Z);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_p3_tobytes.c",
    "content": "#include \"ge.h\"\n\nvoid ge_p3_tobytes(unsigned char *s,const ge_p3 *h)\n{\n  fe recip;\n  fe x;\n  fe y;\n\n  fe_invert(recip,h->Z);\n  fe_mul(x,h->X,recip);\n  fe_mul(y,h->Y,recip);\n  fe_tobytes(s,y);\n  s[31] ^= fe_isnegative(x) << 7;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_precomp_0.c",
    "content": "#include \"ge.h\"\n\nvoid ge_precomp_0(ge_precomp *h)\n{\n  fe_1(h->yplusx);\n  fe_1(h->yminusx);\n  fe_0(h->xy2d);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_scalarmult_base.c",
    "content": "#include \"ge.h\"\n#include \"crypto_uint32.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\n#endif\n\nstatic unsigned char equal(signed char b,signed char c)\n{\n  unsigned char ub = b;\n  unsigned char uc = c;\n  unsigned char x = ub ^ uc; /* 0: yes; 1..255: no */\n  crypto_uint32 y = x; /* 0: yes; 1..255: no */\n  y -= 1; /* 4294967295: yes; 0..254: no */\n  y >>= 31; /* 1: yes; 0: no */\n  return y;\n}\n\nstatic unsigned char negative(signed char b)\n{\n  unsigned long long x = b; /* 18446744073709551361..18446744073709551615: yes; 0..255: no */\n  x >>= 63; /* 1: yes; 0: no */\n  return x;\n}\n\nstatic void cmov(ge_precomp *t,ge_precomp *u,unsigned char b)\n{\n  fe_cmov(t->yplusx,u->yplusx,b);\n  fe_cmov(t->yminusx,u->yminusx,b);\n  fe_cmov(t->xy2d,u->xy2d,b);\n}\n\n/* base[i][j] = (j+1)*256^i*B */\nstatic ge_precomp base[32][8] = {\n#include \"base.h\"\n} ;\n\nstatic void ge_select(ge_precomp *t,int pos,signed char b)\n{\n  ge_precomp minust;\n  unsigned char bnegative = negative(b);\n  unsigned char babs = b - (((-bnegative) & b) << 1);\n\n  ge_precomp_0(t);\n  cmov(t,&base[pos][0],equal(babs,1));\n  cmov(t,&base[pos][1],equal(babs,2));\n  cmov(t,&base[pos][2],equal(babs,3));\n  cmov(t,&base[pos][3],equal(babs,4));\n  cmov(t,&base[pos][4],equal(babs,5));\n  cmov(t,&base[pos][5],equal(babs,6));\n  cmov(t,&base[pos][6],equal(babs,7));\n  cmov(t,&base[pos][7],equal(babs,8));\n  fe_copy(minust.yplusx,t->yminusx);\n  fe_copy(minust.yminusx,t->yplusx);\n  fe_neg(minust.xy2d,t->xy2d);\n  cmov(t,&minust,bnegative);\n}\n\n/*\nh = a * B\nwhere a = a[0]+256*a[1]+...+256^31 a[31]\nB is the Ed25519 base point (x,4/5) with x positive.\n\nPreconditions:\n  a[31] <= 127\n*/\n\nvoid ge_scalarmult_base(ge_p3 *h,const unsigned char *a)\n{\n  signed char e[64];\n  signed char carry;\n  ge_p1p1 r;\n  ge_p2 s;\n  ge_precomp t;\n  int i;\n\n  for (i = 0;i < 32;++i) {\n    e[2 * i + 0] = (a[i] >> 0) & 15;\n    e[2 * i + 1] = (a[i] >> 4) & 15;\n  }\n  /* each e[i] is between 0 and 15 */\n  /* e[63] is between 0 and 7 */\n\n  carry = 0;\n  for (i = 0;i < 63;++i) {\n    e[i] += carry;\n    carry = e[i] + 8;\n    carry >>= 4;\n    e[i] -= carry << 4;\n  }\n  e[63] += carry;\n  /* each e[i] is between -8 and 8 */\n\n  ge_p3_0(h);\n  for (i = 1;i < 64;i += 2) {\n    ge_select(&t,i / 2,e[i]);\n    ge_madd(&r,h,&t); ge_p1p1_to_p3(h,&r);\n  }\n\n  ge_p3_dbl(&r,h);  ge_p1p1_to_p2(&s,&r);\n  ge_p2_dbl(&r,&s); ge_p1p1_to_p2(&s,&r);\n  ge_p2_dbl(&r,&s); ge_p1p1_to_p2(&s,&r);\n  ge_p2_dbl(&r,&s); ge_p1p1_to_p3(h,&r);\n\n  for (i = 0;i < 64;i += 2) {\n    ge_select(&t,i / 2,e[i]);\n    ge_madd(&r,h,&t); ge_p1p1_to_p3(h,&r);\n  }\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_sub.c",
    "content": "#include \"ge.h\"\n\n/*\nr = p - q\n*/\n\nvoid ge_sub(ge_p1p1 *r,const ge_p3 *p,const ge_cached *q)\n{\n  fe t0;\n#include \"ge_sub.h\"\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_sub.h",
    "content": "\n/* qhasm: enter ge_sub */\n\n/* qhasm: fe X1 */\n\n/* qhasm: fe Y1 */\n\n/* qhasm: fe Z1 */\n\n/* qhasm: fe Z2 */\n\n/* qhasm: fe T1 */\n\n/* qhasm: fe ZZ */\n\n/* qhasm: fe YpX2 */\n\n/* qhasm: fe YmX2 */\n\n/* qhasm: fe T2d2 */\n\n/* qhasm: fe X3 */\n\n/* qhasm: fe Y3 */\n\n/* qhasm: fe Z3 */\n\n/* qhasm: fe T3 */\n\n/* qhasm: fe YpX1 */\n\n/* qhasm: fe YmX1 */\n\n/* qhasm: fe A */\n\n/* qhasm: fe B */\n\n/* qhasm: fe C */\n\n/* qhasm: fe D */\n\n/* qhasm: YpX1 = Y1+X1 */\n/* asm 1: fe_add(>YpX1=fe#1,<Y1=fe#12,<X1=fe#11); */\n/* asm 2: fe_add(>YpX1=r->X,<Y1=p->Y,<X1=p->X); */\nfe_add(r->X,p->Y,p->X);\n\n/* qhasm: YmX1 = Y1-X1 */\n/* asm 1: fe_sub(>YmX1=fe#2,<Y1=fe#12,<X1=fe#11); */\n/* asm 2: fe_sub(>YmX1=r->Y,<Y1=p->Y,<X1=p->X); */\nfe_sub(r->Y,p->Y,p->X);\n\n/* qhasm: A = YpX1*YmX2 */\n/* asm 1: fe_mul(>A=fe#3,<YpX1=fe#1,<YmX2=fe#16); */\n/* asm 2: fe_mul(>A=r->Z,<YpX1=r->X,<YmX2=q->YminusX); */\nfe_mul(r->Z,r->X,q->YminusX);\n\n/* qhasm: B = YmX1*YpX2 */\n/* asm 1: fe_mul(>B=fe#2,<YmX1=fe#2,<YpX2=fe#15); */\n/* asm 2: fe_mul(>B=r->Y,<YmX1=r->Y,<YpX2=q->YplusX); */\nfe_mul(r->Y,r->Y,q->YplusX);\n\n/* qhasm: C = T2d2*T1 */\n/* asm 1: fe_mul(>C=fe#4,<T2d2=fe#18,<T1=fe#14); */\n/* asm 2: fe_mul(>C=r->T,<T2d2=q->T2d,<T1=p->T); */\nfe_mul(r->T,q->T2d,p->T);\n\n/* qhasm: ZZ = Z1*Z2 */\n/* asm 1: fe_mul(>ZZ=fe#1,<Z1=fe#13,<Z2=fe#17); */\n/* asm 2: fe_mul(>ZZ=r->X,<Z1=p->Z,<Z2=q->Z); */\nfe_mul(r->X,p->Z,q->Z);\n\n/* qhasm: D = 2*ZZ */\n/* asm 1: fe_add(>D=fe#5,<ZZ=fe#1,<ZZ=fe#1); */\n/* asm 2: fe_add(>D=t0,<ZZ=r->X,<ZZ=r->X); */\nfe_add(t0,r->X,r->X);\n\n/* qhasm: X3 = A-B */\n/* asm 1: fe_sub(>X3=fe#1,<A=fe#3,<B=fe#2); */\n/* asm 2: fe_sub(>X3=r->X,<A=r->Z,<B=r->Y); */\nfe_sub(r->X,r->Z,r->Y);\n\n/* qhasm: Y3 = A+B */\n/* asm 1: fe_add(>Y3=fe#2,<A=fe#3,<B=fe#2); */\n/* asm 2: fe_add(>Y3=r->Y,<A=r->Z,<B=r->Y); */\nfe_add(r->Y,r->Z,r->Y);\n\n/* qhasm: Z3 = D-C */\n/* asm 1: fe_sub(>Z3=fe#3,<D=fe#5,<C=fe#4); */\n/* asm 2: fe_sub(>Z3=r->Z,<D=t0,<C=r->T); */\nfe_sub(r->Z,t0,r->T);\n\n/* qhasm: T3 = D+C */\n/* asm 1: fe_add(>T3=fe#4,<D=fe#5,<C=fe#4); */\n/* asm 2: fe_add(>T3=r->T,<D=t0,<C=r->T); */\nfe_add(r->T,t0,r->T);\n\n/* qhasm: return */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/ge_tobytes.c",
    "content": "#include \"ge.h\"\n\nvoid ge_tobytes(unsigned char *s,const ge_p2 *h)\n{\n  fe recip;\n  fe x;\n  fe y;\n\n  fe_invert(recip,h->Z);\n  fe_mul(x,h->X,recip);\n  fe_mul(y,h->Y,recip);\n  fe_tobytes(s,y);\n  s[31] ^= fe_isnegative(x) << 7;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/keypair.c",
    "content": "\n#include <string.h>\n\n#include \"crypto_sign_ed25519.h\"\n#include \"crypto_hash_sha512.h\"\n#include \"crypto_scalarmult_curve25519.h\"\n#include \"fe.h\"\n#include \"ge.h\"\n#include \"randombytes.h\"\n#include \"utils.h\"\n\nint crypto_sign_ed25519_seed_keypair(unsigned char *pk, unsigned char *sk,\n                                     const unsigned char *seed)\n{\n    ge_p3 A;\n\n    crypto_hash_sha512(sk,seed,32);\n    sk[0] &= 248;\n    sk[31] &= 63;\n    sk[31] |= 64;\n\n    ge_scalarmult_base(&A,sk);\n    ge_p3_tobytes(pk,&A);\n\n    memmove(sk, seed, 32);\n    memmove(sk + 32, pk, 32);\n    return 0;\n}\n\nint crypto_sign_ed25519_keypair(unsigned char *pk, unsigned char *sk)\n{\n    unsigned char seed[32];\n    int           ret;\n\n    randombytes_buf(seed, sizeof seed);\n    ret = crypto_sign_ed25519_seed_keypair(pk, sk, seed);\n    sodium_memzero(seed, sizeof seed);\n\n    return ret;\n}\n\nint crypto_sign_ed25519_pk_to_curve25519(unsigned char *curve25519_pk,\n                                         const unsigned char *ed25519_pk)\n{\n    ge_p3 A;\n    fe    x;\n    fe    one_minus_y;\n\n    if (ge_frombytes_negate_vartime(&A, ed25519_pk) != 0) {\n        return -1;\n    }\n    fe_1(one_minus_y);\n    fe_sub(one_minus_y, one_minus_y, A.Y);\n    fe_invert(one_minus_y, one_minus_y);\n    fe_1(x);\n    fe_add(x, x, A.Y);\n    fe_mul(x, x, one_minus_y);\n    fe_tobytes(curve25519_pk, x);\n\n    return 0;\n}\n\nint crypto_sign_ed25519_sk_to_curve25519(unsigned char *curve25519_sk,\n                                         const unsigned char *ed25519_sk)\n{\n    unsigned char h[crypto_hash_sha512_BYTES];\n\n    crypto_hash_sha512(h, ed25519_sk,\n                       crypto_sign_ed25519_SECRETKEYBYTES -\n                       crypto_sign_ed25519_PUBLICKEYBYTES);\n    h[0] &= 248;\n    h[31] &= 127;\n    h[31] |= 64;\n    memcpy(curve25519_sk, h, crypto_scalarmult_curve25519_BYTES);\n    sodium_memzero(h, sizeof h);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/obsolete.c",
    "content": "\n#include <limits.h>\n#include <stdint.h>\n#include <string.h>\n\n#include \"crypto_hash_sha512.h\"\n#include \"crypto_sign_edwards25519sha512batch.h\"\n#include \"crypto_verify_32.h\"\n#include \"fe.h\"\n#include \"ge.h\"\n#include \"randombytes.h\"\n#include \"sc.h\"\n#include \"utils.h\"\n\nint crypto_sign_edwards25519sha512batch_keypair(unsigned char *pk,\n                                                unsigned char *sk)\n{\n    ge_p3 A;\n\n    randombytes_buf(sk, 32);\n    crypto_hash_sha512(sk, sk, 32);\n    sk[0] &= 248;\n    sk[31] &= 63;\n    sk[31] |= 64;\n    ge_scalarmult_base(&A, sk);\n    ge_p3_tobytes(pk, &A);\n\n    return 0;\n}\n\nint crypto_sign_edwards25519sha512batch(unsigned char *sm,\n                                        unsigned long long *smlen_p,\n                                        const unsigned char *m,\n                                        unsigned long long mlen,\n                                        const unsigned char *sk)\n{\n    crypto_hash_sha512_state hs;\n    unsigned char nonce[64];\n    unsigned char hram[64];\n    unsigned char sig[64];\n    ge_p3 A;\n    ge_p3 R;\n\n    crypto_hash_sha512_init(&hs);\n    crypto_hash_sha512_update(&hs, sk + 32, 32);\n    crypto_hash_sha512_update(&hs, m, mlen);\n    crypto_hash_sha512_final(&hs, nonce);\n    ge_scalarmult_base(&A, sk);\n    ge_p3_tobytes(sig + 32, &A);\n    sc_reduce(nonce);\n    ge_scalarmult_base(&R, nonce);\n    ge_p3_tobytes(sig, &R);\n    crypto_hash_sha512_init(&hs);\n    crypto_hash_sha512_update(&hs, sig, 32);\n    crypto_hash_sha512_update(&hs, m, mlen);\n    crypto_hash_sha512_final(&hs, hram);\n    sc_reduce(hram);\n    sc_muladd(sig + 32, hram, nonce, sk);\n    sodium_memzero(hram, sizeof hram);\n    memmove(sm + 32, m, (size_t) mlen);\n    memcpy(sm, sig, 32);\n    memcpy(sm + 32 + mlen, sig + 32, 32);\n    *smlen_p = mlen + 64U;\n\n    return 0;\n}\n\nint crypto_sign_edwards25519sha512batch_open(unsigned char *m,\n                                             unsigned long long *mlen_p,\n                                             const unsigned char *sm,\n                                             unsigned long long smlen,\n                                             const unsigned char *pk)\n{\n    unsigned char h[64];\n    unsigned char t1[32], t2[32];\n    unsigned long long mlen;\n    ge_cached Ai;\n    ge_p1p1 csa;\n    ge_p2 cs;\n    ge_p3 A;\n    ge_p3 R;\n    ge_p3 cs3;\n\n    *mlen_p = 0;\n    if (smlen < 64 || smlen > SIZE_MAX) {\n        return -1;\n    }\n    mlen = smlen - 64;\n    if (sm[smlen - 1] & 224) {\n        return -1;\n    }\n    if (ge_frombytes_negate_vartime(&A, pk) != 0 ||\n        ge_frombytes_negate_vartime(&R, sm) != 0) {\n        return -1;\n    }\n    ge_p3_to_cached(&Ai, &A);\n    crypto_hash_sha512(h, sm, mlen + 32);\n    sc_reduce(h);\n    ge_scalarmult_vartime(&cs3, h, &R);\n    ge_add(&csa, &cs3, &Ai);\n    ge_p1p1_to_p2(&cs, &csa);\n    ge_tobytes(t1, &cs);\n    t1[31] ^= 1 << 7;\n    ge_scalarmult_base(&R, sm + 32 + mlen);\n    ge_p3_tobytes(t2, &R);\n    if (crypto_verify_32(t1, t2) != 0) {\n        return -1;\n    }\n    *mlen_p = mlen;\n    memmove(m, sm + 64, mlen);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/open.c",
    "content": "\n#include <limits.h>\n#include <stdint.h>\n#include <string.h>\n\n#include \"crypto_hash_sha512.h\"\n#include \"crypto_sign_ed25519.h\"\n#include \"crypto_verify_32.h\"\n#include \"ge.h\"\n#include \"sc.h\"\n#include \"utils.h\"\n\nint\ncrypto_sign_ed25519_verify_detached(const unsigned char *sig,\n                                    const unsigned char *m,\n                                    unsigned long long mlen,\n                                    const unsigned char *pk)\n{\n    crypto_hash_sha512_state hs;\n    unsigned char h[64];\n    unsigned char rcheck[32];\n    unsigned int  i;\n    unsigned char d = 0;\n    ge_p3 A;\n    ge_p2 R;\n\n    if (sig[63] & 224) {\n        return -1;\n    }\n    if (ge_frombytes_negate_vartime(&A, pk) != 0) {\n        return -1;\n    }\n    for (i = 0; i < 32; ++i) {\n        d |= pk[i];\n    }\n    if (d == 0) {\n        return -1;\n    }\n    crypto_hash_sha512_init(&hs);\n    crypto_hash_sha512_update(&hs, sig, 32);\n    crypto_hash_sha512_update(&hs, pk, 32);\n    crypto_hash_sha512_update(&hs, m, mlen);\n    crypto_hash_sha512_final(&hs, h);\n    sc_reduce(h);\n\n    ge_double_scalarmult_vartime(&R, h, &A, sig + 32);\n    ge_tobytes(rcheck, &R);\n\n    return crypto_verify_32(rcheck, sig) | (-(rcheck == sig)) |\n           sodium_memcmp(sig, rcheck, 32);\n}\n\nint\ncrypto_sign_ed25519_open(unsigned char *m, unsigned long long *mlen_p,\n                         const unsigned char *sm, unsigned long long smlen,\n                         const unsigned char *pk)\n{\n    unsigned long long mlen;\n\n    if (smlen < 64 || smlen > SIZE_MAX) {\n        goto badsig;\n    }\n    mlen = smlen - 64;\n    if (crypto_sign_ed25519_verify_detached(sm, sm + 64, mlen, pk) != 0) {\n        memset(m, 0, mlen);\n        goto badsig;\n    }\n    if (mlen_p != NULL) {\n        *mlen_p = mlen;\n    }\n    memmove(m, sm + 64, mlen);\n\n    return 0;\n\nbadsig:\n    if (mlen_p != NULL) {\n        *mlen_p = 0;\n    }\n    return -1;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/pow22523.h",
    "content": "\n/* qhasm: fe z1 */\n\n/* qhasm: fe z2 */\n\n/* qhasm: fe z8 */\n\n/* qhasm: fe z9 */\n\n/* qhasm: fe z11 */\n\n/* qhasm: fe z22 */\n\n/* qhasm: fe z_5_0 */\n\n/* qhasm: fe z_10_5 */\n\n/* qhasm: fe z_10_0 */\n\n/* qhasm: fe z_20_10 */\n\n/* qhasm: fe z_20_0 */\n\n/* qhasm: fe z_40_20 */\n\n/* qhasm: fe z_40_0 */\n\n/* qhasm: fe z_50_10 */\n\n/* qhasm: fe z_50_0 */\n\n/* qhasm: fe z_100_50 */\n\n/* qhasm: fe z_100_0 */\n\n/* qhasm: fe z_200_100 */\n\n/* qhasm: fe z_200_0 */\n\n/* qhasm: fe z_250_50 */\n\n/* qhasm: fe z_250_0 */\n\n/* qhasm: fe z_252_2 */\n\n/* qhasm: fe z_252_3 */\n\n/* qhasm: enter pow22523 */\n\n/* qhasm: z2 = z1^2^1 */\n/* asm 1: fe_sq(>z2=fe#1,<z1=fe#11); for (i = 1;i < 1;++i) fe_sq(>z2=fe#1,>z2=fe#1); */\n/* asm 2: fe_sq(>z2=t0,<z1=z); for (i = 1;i < 1;++i) fe_sq(>z2=t0,>z2=t0); */\nfe_sq(t0,z); /* for (i = 1;i < 1;++i) fe_sq(t0,t0); */\n\n/* qhasm: z8 = z2^2^2 */\n/* asm 1: fe_sq(>z8=fe#2,<z2=fe#1); for (i = 1;i < 2;++i) fe_sq(>z8=fe#2,>z8=fe#2); */\n/* asm 2: fe_sq(>z8=t1,<z2=t0); for (i = 1;i < 2;++i) fe_sq(>z8=t1,>z8=t1); */\nfe_sq(t1,t0); for (i = 1;i < 2;++i) fe_sq(t1,t1);\n\n/* qhasm: z9 = z1*z8 */\n/* asm 1: fe_mul(>z9=fe#2,<z1=fe#11,<z8=fe#2); */\n/* asm 2: fe_mul(>z9=t1,<z1=z,<z8=t1); */\nfe_mul(t1,z,t1);\n\n/* qhasm: z11 = z2*z9 */\n/* asm 1: fe_mul(>z11=fe#1,<z2=fe#1,<z9=fe#2); */\n/* asm 2: fe_mul(>z11=t0,<z2=t0,<z9=t1); */\nfe_mul(t0,t0,t1);\n\n/* qhasm: z22 = z11^2^1 */\n/* asm 1: fe_sq(>z22=fe#1,<z11=fe#1); for (i = 1;i < 1;++i) fe_sq(>z22=fe#1,>z22=fe#1); */\n/* asm 2: fe_sq(>z22=t0,<z11=t0); for (i = 1;i < 1;++i) fe_sq(>z22=t0,>z22=t0); */\nfe_sq(t0,t0); /* for (i = 1;i < 1;++i) fe_sq(t0,t0); */\n\n/* qhasm: z_5_0 = z9*z22 */\n/* asm 1: fe_mul(>z_5_0=fe#1,<z9=fe#2,<z22=fe#1); */\n/* asm 2: fe_mul(>z_5_0=t0,<z9=t1,<z22=t0); */\nfe_mul(t0,t1,t0);\n\n/* qhasm: z_10_5 = z_5_0^2^5 */\n/* asm 1: fe_sq(>z_10_5=fe#2,<z_5_0=fe#1); for (i = 1;i < 5;++i) fe_sq(>z_10_5=fe#2,>z_10_5=fe#2); */\n/* asm 2: fe_sq(>z_10_5=t1,<z_5_0=t0); for (i = 1;i < 5;++i) fe_sq(>z_10_5=t1,>z_10_5=t1); */\nfe_sq(t1,t0); for (i = 1;i < 5;++i) fe_sq(t1,t1);\n\n/* qhasm: z_10_0 = z_10_5*z_5_0 */\n/* asm 1: fe_mul(>z_10_0=fe#1,<z_10_5=fe#2,<z_5_0=fe#1); */\n/* asm 2: fe_mul(>z_10_0=t0,<z_10_5=t1,<z_5_0=t0); */\nfe_mul(t0,t1,t0);\n\n/* qhasm: z_20_10 = z_10_0^2^10 */\n/* asm 1: fe_sq(>z_20_10=fe#2,<z_10_0=fe#1); for (i = 1;i < 10;++i) fe_sq(>z_20_10=fe#2,>z_20_10=fe#2); */\n/* asm 2: fe_sq(>z_20_10=t1,<z_10_0=t0); for (i = 1;i < 10;++i) fe_sq(>z_20_10=t1,>z_20_10=t1); */\nfe_sq(t1,t0); for (i = 1;i < 10;++i) fe_sq(t1,t1);\n\n/* qhasm: z_20_0 = z_20_10*z_10_0 */\n/* asm 1: fe_mul(>z_20_0=fe#2,<z_20_10=fe#2,<z_10_0=fe#1); */\n/* asm 2: fe_mul(>z_20_0=t1,<z_20_10=t1,<z_10_0=t0); */\nfe_mul(t1,t1,t0);\n\n/* qhasm: z_40_20 = z_20_0^2^20 */\n/* asm 1: fe_sq(>z_40_20=fe#3,<z_20_0=fe#2); for (i = 1;i < 20;++i) fe_sq(>z_40_20=fe#3,>z_40_20=fe#3); */\n/* asm 2: fe_sq(>z_40_20=t2,<z_20_0=t1); for (i = 1;i < 20;++i) fe_sq(>z_40_20=t2,>z_40_20=t2); */\nfe_sq(t2,t1); for (i = 1;i < 20;++i) fe_sq(t2,t2);\n\n/* qhasm: z_40_0 = z_40_20*z_20_0 */\n/* asm 1: fe_mul(>z_40_0=fe#2,<z_40_20=fe#3,<z_20_0=fe#2); */\n/* asm 2: fe_mul(>z_40_0=t1,<z_40_20=t2,<z_20_0=t1); */\nfe_mul(t1,t2,t1);\n\n/* qhasm: z_50_10 = z_40_0^2^10 */\n/* asm 1: fe_sq(>z_50_10=fe#2,<z_40_0=fe#2); for (i = 1;i < 10;++i) fe_sq(>z_50_10=fe#2,>z_50_10=fe#2); */\n/* asm 2: fe_sq(>z_50_10=t1,<z_40_0=t1); for (i = 1;i < 10;++i) fe_sq(>z_50_10=t1,>z_50_10=t1); */\nfe_sq(t1,t1); for (i = 1;i < 10;++i) fe_sq(t1,t1);\n\n/* qhasm: z_50_0 = z_50_10*z_10_0 */\n/* asm 1: fe_mul(>z_50_0=fe#1,<z_50_10=fe#2,<z_10_0=fe#1); */\n/* asm 2: fe_mul(>z_50_0=t0,<z_50_10=t1,<z_10_0=t0); */\nfe_mul(t0,t1,t0);\n\n/* qhasm: z_100_50 = z_50_0^2^50 */\n/* asm 1: fe_sq(>z_100_50=fe#2,<z_50_0=fe#1); for (i = 1;i < 50;++i) fe_sq(>z_100_50=fe#2,>z_100_50=fe#2); */\n/* asm 2: fe_sq(>z_100_50=t1,<z_50_0=t0); for (i = 1;i < 50;++i) fe_sq(>z_100_50=t1,>z_100_50=t1); */\nfe_sq(t1,t0); for (i = 1;i < 50;++i) fe_sq(t1,t1);\n\n/* qhasm: z_100_0 = z_100_50*z_50_0 */\n/* asm 1: fe_mul(>z_100_0=fe#2,<z_100_50=fe#2,<z_50_0=fe#1); */\n/* asm 2: fe_mul(>z_100_0=t1,<z_100_50=t1,<z_50_0=t0); */\nfe_mul(t1,t1,t0);\n\n/* qhasm: z_200_100 = z_100_0^2^100 */\n/* asm 1: fe_sq(>z_200_100=fe#3,<z_100_0=fe#2); for (i = 1;i < 100;++i) fe_sq(>z_200_100=fe#3,>z_200_100=fe#3); */\n/* asm 2: fe_sq(>z_200_100=t2,<z_100_0=t1); for (i = 1;i < 100;++i) fe_sq(>z_200_100=t2,>z_200_100=t2); */\nfe_sq(t2,t1); for (i = 1;i < 100;++i) fe_sq(t2,t2);\n\n/* qhasm: z_200_0 = z_200_100*z_100_0 */\n/* asm 1: fe_mul(>z_200_0=fe#2,<z_200_100=fe#3,<z_100_0=fe#2); */\n/* asm 2: fe_mul(>z_200_0=t1,<z_200_100=t2,<z_100_0=t1); */\nfe_mul(t1,t2,t1);\n\n/* qhasm: z_250_50 = z_200_0^2^50 */\n/* asm 1: fe_sq(>z_250_50=fe#2,<z_200_0=fe#2); for (i = 1;i < 50;++i) fe_sq(>z_250_50=fe#2,>z_250_50=fe#2); */\n/* asm 2: fe_sq(>z_250_50=t1,<z_200_0=t1); for (i = 1;i < 50;++i) fe_sq(>z_250_50=t1,>z_250_50=t1); */\nfe_sq(t1,t1); for (i = 1;i < 50;++i) fe_sq(t1,t1);\n\n/* qhasm: z_250_0 = z_250_50*z_50_0 */\n/* asm 1: fe_mul(>z_250_0=fe#1,<z_250_50=fe#2,<z_50_0=fe#1); */\n/* asm 2: fe_mul(>z_250_0=t0,<z_250_50=t1,<z_50_0=t0); */\nfe_mul(t0,t1,t0);\n\n/* qhasm: z_252_2 = z_250_0^2^2 */\n/* asm 1: fe_sq(>z_252_2=fe#1,<z_250_0=fe#1); for (i = 1;i < 2;++i) fe_sq(>z_252_2=fe#1,>z_252_2=fe#1); */\n/* asm 2: fe_sq(>z_252_2=t0,<z_250_0=t0); for (i = 1;i < 2;++i) fe_sq(>z_252_2=t0,>z_252_2=t0); */\nfe_sq(t0,t0); for (i = 1;i < 2;++i) fe_sq(t0,t0);\n\n/* qhasm: z_252_3 = z_252_2*z1 */\n/* asm 1: fe_mul(>z_252_3=fe#12,<z_252_2=fe#1,<z1=fe#11); */\n/* asm 2: fe_mul(>z_252_3=out,<z_252_2=t0,<z1=z); */\nfe_mul(out,t0,z);\n\n/* qhasm: return */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/pow225521.h",
    "content": "\n/* qhasm: fe z1 */\n\n/* qhasm: fe z2 */\n\n/* qhasm: fe z8 */\n\n/* qhasm: fe z9 */\n\n/* qhasm: fe z11 */\n\n/* qhasm: fe z22 */\n\n/* qhasm: fe z_5_0 */\n\n/* qhasm: fe z_10_5 */\n\n/* qhasm: fe z_10_0 */\n\n/* qhasm: fe z_20_10 */\n\n/* qhasm: fe z_20_0 */\n\n/* qhasm: fe z_40_20 */\n\n/* qhasm: fe z_40_0 */\n\n/* qhasm: fe z_50_10 */\n\n/* qhasm: fe z_50_0 */\n\n/* qhasm: fe z_100_50 */\n\n/* qhasm: fe z_100_0 */\n\n/* qhasm: fe z_200_100 */\n\n/* qhasm: fe z_200_0 */\n\n/* qhasm: fe z_250_50 */\n\n/* qhasm: fe z_250_0 */\n\n/* qhasm: fe z_255_5 */\n\n/* qhasm: fe z_255_21 */\n\n/* qhasm: enter pow225521 */\n\n/* qhasm: z2 = z1^2^1 */\n/* asm 1: fe_sq(>z2=fe#1,<z1=fe#11); for (i = 1;i < 1;++i) fe_sq(>z2=fe#1,>z2=fe#1); */\n/* asm 2: fe_sq(>z2=t0,<z1=z); for (i = 1;i < 1;++i) fe_sq(>z2=t0,>z2=t0); */\nfe_sq(t0,z); /* for (i = 1;i < 1;++i) fe_sq(t0,t0); */\n\n/* qhasm: z8 = z2^2^2 */\n/* asm 1: fe_sq(>z8=fe#2,<z2=fe#1); for (i = 1;i < 2;++i) fe_sq(>z8=fe#2,>z8=fe#2); */\n/* asm 2: fe_sq(>z8=t1,<z2=t0); for (i = 1;i < 2;++i) fe_sq(>z8=t1,>z8=t1); */\nfe_sq(t1,t0); for (i = 1;i < 2;++i) fe_sq(t1,t1);\n\n/* qhasm: z9 = z1*z8 */\n/* asm 1: fe_mul(>z9=fe#2,<z1=fe#11,<z8=fe#2); */\n/* asm 2: fe_mul(>z9=t1,<z1=z,<z8=t1); */\nfe_mul(t1,z,t1);\n\n/* qhasm: z11 = z2*z9 */\n/* asm 1: fe_mul(>z11=fe#1,<z2=fe#1,<z9=fe#2); */\n/* asm 2: fe_mul(>z11=t0,<z2=t0,<z9=t1); */\nfe_mul(t0,t0,t1);\n\n/* qhasm: z22 = z11^2^1 */\n/* asm 1: fe_sq(>z22=fe#3,<z11=fe#1); for (i = 1;i < 1;++i) fe_sq(>z22=fe#3,>z22=fe#3); */\n/* asm 2: fe_sq(>z22=t2,<z11=t0); for (i = 1;i < 1;++i) fe_sq(>z22=t2,>z22=t2); */\nfe_sq(t2,t0); /* for (i = 1;i < 1;++i) fe_sq(t2,t2); */\n\n/* qhasm: z_5_0 = z9*z22 */\n/* asm 1: fe_mul(>z_5_0=fe#2,<z9=fe#2,<z22=fe#3); */\n/* asm 2: fe_mul(>z_5_0=t1,<z9=t1,<z22=t2); */\nfe_mul(t1,t1,t2);\n\n/* qhasm: z_10_5 = z_5_0^2^5 */\n/* asm 1: fe_sq(>z_10_5=fe#3,<z_5_0=fe#2); for (i = 1;i < 5;++i) fe_sq(>z_10_5=fe#3,>z_10_5=fe#3); */\n/* asm 2: fe_sq(>z_10_5=t2,<z_5_0=t1); for (i = 1;i < 5;++i) fe_sq(>z_10_5=t2,>z_10_5=t2); */\nfe_sq(t2,t1); for (i = 1;i < 5;++i) fe_sq(t2,t2);\n\n/* qhasm: z_10_0 = z_10_5*z_5_0 */\n/* asm 1: fe_mul(>z_10_0=fe#2,<z_10_5=fe#3,<z_5_0=fe#2); */\n/* asm 2: fe_mul(>z_10_0=t1,<z_10_5=t2,<z_5_0=t1); */\nfe_mul(t1,t2,t1);\n\n/* qhasm: z_20_10 = z_10_0^2^10 */\n/* asm 1: fe_sq(>z_20_10=fe#3,<z_10_0=fe#2); for (i = 1;i < 10;++i) fe_sq(>z_20_10=fe#3,>z_20_10=fe#3); */\n/* asm 2: fe_sq(>z_20_10=t2,<z_10_0=t1); for (i = 1;i < 10;++i) fe_sq(>z_20_10=t2,>z_20_10=t2); */\nfe_sq(t2,t1); for (i = 1;i < 10;++i) fe_sq(t2,t2);\n\n/* qhasm: z_20_0 = z_20_10*z_10_0 */\n/* asm 1: fe_mul(>z_20_0=fe#3,<z_20_10=fe#3,<z_10_0=fe#2); */\n/* asm 2: fe_mul(>z_20_0=t2,<z_20_10=t2,<z_10_0=t1); */\nfe_mul(t2,t2,t1);\n\n/* qhasm: z_40_20 = z_20_0^2^20 */\n/* asm 1: fe_sq(>z_40_20=fe#4,<z_20_0=fe#3); for (i = 1;i < 20;++i) fe_sq(>z_40_20=fe#4,>z_40_20=fe#4); */\n/* asm 2: fe_sq(>z_40_20=t3,<z_20_0=t2); for (i = 1;i < 20;++i) fe_sq(>z_40_20=t3,>z_40_20=t3); */\nfe_sq(t3,t2); for (i = 1;i < 20;++i) fe_sq(t3,t3);\n\n/* qhasm: z_40_0 = z_40_20*z_20_0 */\n/* asm 1: fe_mul(>z_40_0=fe#3,<z_40_20=fe#4,<z_20_0=fe#3); */\n/* asm 2: fe_mul(>z_40_0=t2,<z_40_20=t3,<z_20_0=t2); */\nfe_mul(t2,t3,t2);\n\n/* qhasm: z_50_10 = z_40_0^2^10 */\n/* asm 1: fe_sq(>z_50_10=fe#3,<z_40_0=fe#3); for (i = 1;i < 10;++i) fe_sq(>z_50_10=fe#3,>z_50_10=fe#3); */\n/* asm 2: fe_sq(>z_50_10=t2,<z_40_0=t2); for (i = 1;i < 10;++i) fe_sq(>z_50_10=t2,>z_50_10=t2); */\nfe_sq(t2,t2); for (i = 1;i < 10;++i) fe_sq(t2,t2);\n\n/* qhasm: z_50_0 = z_50_10*z_10_0 */\n/* asm 1: fe_mul(>z_50_0=fe#2,<z_50_10=fe#3,<z_10_0=fe#2); */\n/* asm 2: fe_mul(>z_50_0=t1,<z_50_10=t2,<z_10_0=t1); */\nfe_mul(t1,t2,t1);\n\n/* qhasm: z_100_50 = z_50_0^2^50 */\n/* asm 1: fe_sq(>z_100_50=fe#3,<z_50_0=fe#2); for (i = 1;i < 50;++i) fe_sq(>z_100_50=fe#3,>z_100_50=fe#3); */\n/* asm 2: fe_sq(>z_100_50=t2,<z_50_0=t1); for (i = 1;i < 50;++i) fe_sq(>z_100_50=t2,>z_100_50=t2); */\nfe_sq(t2,t1); for (i = 1;i < 50;++i) fe_sq(t2,t2);\n\n/* qhasm: z_100_0 = z_100_50*z_50_0 */\n/* asm 1: fe_mul(>z_100_0=fe#3,<z_100_50=fe#3,<z_50_0=fe#2); */\n/* asm 2: fe_mul(>z_100_0=t2,<z_100_50=t2,<z_50_0=t1); */\nfe_mul(t2,t2,t1);\n\n/* qhasm: z_200_100 = z_100_0^2^100 */\n/* asm 1: fe_sq(>z_200_100=fe#4,<z_100_0=fe#3); for (i = 1;i < 100;++i) fe_sq(>z_200_100=fe#4,>z_200_100=fe#4); */\n/* asm 2: fe_sq(>z_200_100=t3,<z_100_0=t2); for (i = 1;i < 100;++i) fe_sq(>z_200_100=t3,>z_200_100=t3); */\nfe_sq(t3,t2); for (i = 1;i < 100;++i) fe_sq(t3,t3);\n\n/* qhasm: z_200_0 = z_200_100*z_100_0 */\n/* asm 1: fe_mul(>z_200_0=fe#3,<z_200_100=fe#4,<z_100_0=fe#3); */\n/* asm 2: fe_mul(>z_200_0=t2,<z_200_100=t3,<z_100_0=t2); */\nfe_mul(t2,t3,t2);\n\n/* qhasm: z_250_50 = z_200_0^2^50 */\n/* asm 1: fe_sq(>z_250_50=fe#3,<z_200_0=fe#3); for (i = 1;i < 50;++i) fe_sq(>z_250_50=fe#3,>z_250_50=fe#3); */\n/* asm 2: fe_sq(>z_250_50=t2,<z_200_0=t2); for (i = 1;i < 50;++i) fe_sq(>z_250_50=t2,>z_250_50=t2); */\nfe_sq(t2,t2); for (i = 1;i < 50;++i) fe_sq(t2,t2);\n\n/* qhasm: z_250_0 = z_250_50*z_50_0 */\n/* asm 1: fe_mul(>z_250_0=fe#2,<z_250_50=fe#3,<z_50_0=fe#2); */\n/* asm 2: fe_mul(>z_250_0=t1,<z_250_50=t2,<z_50_0=t1); */\nfe_mul(t1,t2,t1);\n\n/* qhasm: z_255_5 = z_250_0^2^5 */\n/* asm 1: fe_sq(>z_255_5=fe#2,<z_250_0=fe#2); for (i = 1;i < 5;++i) fe_sq(>z_255_5=fe#2,>z_255_5=fe#2); */\n/* asm 2: fe_sq(>z_255_5=t1,<z_250_0=t1); for (i = 1;i < 5;++i) fe_sq(>z_255_5=t1,>z_255_5=t1); */\nfe_sq(t1,t1); for (i = 1;i < 5;++i) fe_sq(t1,t1);\n\n/* qhasm: z_255_21 = z_255_5*z11 */\n/* asm 1: fe_mul(>z_255_21=fe#12,<z_255_5=fe#2,<z11=fe#1); */\n/* asm 2: fe_mul(>z_255_21=out,<z_255_5=t1,<z11=t0); */\nfe_mul(out,t1,t0);\n\n/* qhasm: return */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/sc.h",
    "content": "#ifndef SC_H\n#define SC_H\n\n/*\nThe set of scalars is \\Z/l\nwhere l = 2^252 + 27742317777372353535851937790883648493.\n*/\n\n#define sc_reduce crypto_sign_ed25519_ref10_sc_reduce\n#define sc_muladd crypto_sign_ed25519_ref10_sc_muladd\n\nextern void sc_reduce(unsigned char *);\nextern void sc_muladd(unsigned char *,const unsigned char *,const unsigned char *,const unsigned char *);\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/sc_muladd.c",
    "content": "#include \"sc.h\"\n#include \"crypto_int64.h\"\n#include \"crypto_uint32.h\"\n#include \"crypto_uint64.h\"\n\nstatic crypto_uint64 load_3(const unsigned char *in)\n{\n  crypto_uint64 result;\n  result = (crypto_uint64) in[0];\n  result |= ((crypto_uint64) in[1]) << 8;\n  result |= ((crypto_uint64) in[2]) << 16;\n  return result;\n}\n\nstatic crypto_uint64 load_4(const unsigned char *in)\n{\n  crypto_uint64 result;\n  result = (crypto_uint64) in[0];\n  result |= ((crypto_uint64) in[1]) << 8;\n  result |= ((crypto_uint64) in[2]) << 16;\n  result |= ((crypto_uint64) in[3]) << 24;\n  return result;\n}\n\n/*\nInput:\n  a[0]+256*a[1]+...+256^31*a[31] = a\n  b[0]+256*b[1]+...+256^31*b[31] = b\n  c[0]+256*c[1]+...+256^31*c[31] = c\n\nOutput:\n  s[0]+256*s[1]+...+256^31*s[31] = (ab+c) mod l\n  where l = 2^252 + 27742317777372353535851937790883648493.\n*/\n\nvoid sc_muladd(unsigned char *s,const unsigned char *a,const unsigned char *b,const unsigned char *c)\n{\n  crypto_int64 a0 = 2097151 & load_3(a);\n  crypto_int64 a1 = 2097151 & (load_4(a + 2) >> 5);\n  crypto_int64 a2 = 2097151 & (load_3(a + 5) >> 2);\n  crypto_int64 a3 = 2097151 & (load_4(a + 7) >> 7);\n  crypto_int64 a4 = 2097151 & (load_4(a + 10) >> 4);\n  crypto_int64 a5 = 2097151 & (load_3(a + 13) >> 1);\n  crypto_int64 a6 = 2097151 & (load_4(a + 15) >> 6);\n  crypto_int64 a7 = 2097151 & (load_3(a + 18) >> 3);\n  crypto_int64 a8 = 2097151 & load_3(a + 21);\n  crypto_int64 a9 = 2097151 & (load_4(a + 23) >> 5);\n  crypto_int64 a10 = 2097151 & (load_3(a + 26) >> 2);\n  crypto_int64 a11 = (load_4(a + 28) >> 7);\n  crypto_int64 b0 = 2097151 & load_3(b);\n  crypto_int64 b1 = 2097151 & (load_4(b + 2) >> 5);\n  crypto_int64 b2 = 2097151 & (load_3(b + 5) >> 2);\n  crypto_int64 b3 = 2097151 & (load_4(b + 7) >> 7);\n  crypto_int64 b4 = 2097151 & (load_4(b + 10) >> 4);\n  crypto_int64 b5 = 2097151 & (load_3(b + 13) >> 1);\n  crypto_int64 b6 = 2097151 & (load_4(b + 15) >> 6);\n  crypto_int64 b7 = 2097151 & (load_3(b + 18) >> 3);\n  crypto_int64 b8 = 2097151 & load_3(b + 21);\n  crypto_int64 b9 = 2097151 & (load_4(b + 23) >> 5);\n  crypto_int64 b10 = 2097151 & (load_3(b + 26) >> 2);\n  crypto_int64 b11 = (load_4(b + 28) >> 7);\n  crypto_int64 c0 = 2097151 & load_3(c);\n  crypto_int64 c1 = 2097151 & (load_4(c + 2) >> 5);\n  crypto_int64 c2 = 2097151 & (load_3(c + 5) >> 2);\n  crypto_int64 c3 = 2097151 & (load_4(c + 7) >> 7);\n  crypto_int64 c4 = 2097151 & (load_4(c + 10) >> 4);\n  crypto_int64 c5 = 2097151 & (load_3(c + 13) >> 1);\n  crypto_int64 c6 = 2097151 & (load_4(c + 15) >> 6);\n  crypto_int64 c7 = 2097151 & (load_3(c + 18) >> 3);\n  crypto_int64 c8 = 2097151 & load_3(c + 21);\n  crypto_int64 c9 = 2097151 & (load_4(c + 23) >> 5);\n  crypto_int64 c10 = 2097151 & (load_3(c + 26) >> 2);\n  crypto_int64 c11 = (load_4(c + 28) >> 7);\n  crypto_int64 s0;\n  crypto_int64 s1;\n  crypto_int64 s2;\n  crypto_int64 s3;\n  crypto_int64 s4;\n  crypto_int64 s5;\n  crypto_int64 s6;\n  crypto_int64 s7;\n  crypto_int64 s8;\n  crypto_int64 s9;\n  crypto_int64 s10;\n  crypto_int64 s11;\n  crypto_int64 s12;\n  crypto_int64 s13;\n  crypto_int64 s14;\n  crypto_int64 s15;\n  crypto_int64 s16;\n  crypto_int64 s17;\n  crypto_int64 s18;\n  crypto_int64 s19;\n  crypto_int64 s20;\n  crypto_int64 s21;\n  crypto_int64 s22;\n  crypto_int64 s23;\n  crypto_int64 carry0;\n  crypto_int64 carry1;\n  crypto_int64 carry2;\n  crypto_int64 carry3;\n  crypto_int64 carry4;\n  crypto_int64 carry5;\n  crypto_int64 carry6;\n  crypto_int64 carry7;\n  crypto_int64 carry8;\n  crypto_int64 carry9;\n  crypto_int64 carry10;\n  crypto_int64 carry11;\n  crypto_int64 carry12;\n  crypto_int64 carry13;\n  crypto_int64 carry14;\n  crypto_int64 carry15;\n  crypto_int64 carry16;\n  crypto_int64 carry17;\n  crypto_int64 carry18;\n  crypto_int64 carry19;\n  crypto_int64 carry20;\n  crypto_int64 carry21;\n  crypto_int64 carry22;\n\n  s0 = c0 + a0*b0;\n  s1 = c1 + a0*b1 + a1*b0;\n  s2 = c2 + a0*b2 + a1*b1 + a2*b0;\n  s3 = c3 + a0*b3 + a1*b2 + a2*b1 + a3*b0;\n  s4 = c4 + a0*b4 + a1*b3 + a2*b2 + a3*b1 + a4*b0;\n  s5 = c5 + a0*b5 + a1*b4 + a2*b3 + a3*b2 + a4*b1 + a5*b0;\n  s6 = c6 + a0*b6 + a1*b5 + a2*b4 + a3*b3 + a4*b2 + a5*b1 + a6*b0;\n  s7 = c7 + a0*b7 + a1*b6 + a2*b5 + a3*b4 + a4*b3 + a5*b2 + a6*b1 + a7*b0;\n  s8 = c8 + a0*b8 + a1*b7 + a2*b6 + a3*b5 + a4*b4 + a5*b3 + a6*b2 + a7*b1 + a8*b0;\n  s9 = c9 + a0*b9 + a1*b8 + a2*b7 + a3*b6 + a4*b5 + a5*b4 + a6*b3 + a7*b2 + a8*b1 + a9*b0;\n  s10 = c10 + a0*b10 + a1*b9 + a2*b8 + a3*b7 + a4*b6 + a5*b5 + a6*b4 + a7*b3 + a8*b2 + a9*b1 + a10*b0;\n  s11 = c11 + a0*b11 + a1*b10 + a2*b9 + a3*b8 + a4*b7 + a5*b6 + a6*b5 + a7*b4 + a8*b3 + a9*b2 + a10*b1 + a11*b0;\n  s12 = a1*b11 + a2*b10 + a3*b9 + a4*b8 + a5*b7 + a6*b6 + a7*b5 + a8*b4 + a9*b3 + a10*b2 + a11*b1;\n  s13 = a2*b11 + a3*b10 + a4*b9 + a5*b8 + a6*b7 + a7*b6 + a8*b5 + a9*b4 + a10*b3 + a11*b2;\n  s14 = a3*b11 + a4*b10 + a5*b9 + a6*b8 + a7*b7 + a8*b6 + a9*b5 + a10*b4 + a11*b3;\n  s15 = a4*b11 + a5*b10 + a6*b9 + a7*b8 + a8*b7 + a9*b6 + a10*b5 + a11*b4;\n  s16 = a5*b11 + a6*b10 + a7*b9 + a8*b8 + a9*b7 + a10*b6 + a11*b5;\n  s17 = a6*b11 + a7*b10 + a8*b9 + a9*b8 + a10*b7 + a11*b6;\n  s18 = a7*b11 + a8*b10 + a9*b9 + a10*b8 + a11*b7;\n  s19 = a8*b11 + a9*b10 + a10*b9 + a11*b8;\n  s20 = a9*b11 + a10*b10 + a11*b9;\n  s21 = a10*b11 + a11*b10;\n  s22 = a11*b11;\n  s23 = 0;\n\n  carry0 = (s0 + (1L << 20)) >> 21; s1 += carry0; s0 -= carry0 * (1L << 21);\n  carry2 = (s2 + (1L << 20)) >> 21; s3 += carry2; s2 -= carry2 * (1L << 21);\n  carry4 = (s4 + (1L << 20)) >> 21; s5 += carry4; s4 -= carry4 * (1L << 21);\n  carry6 = (s6 + (1L << 20)) >> 21; s7 += carry6; s6 -= carry6 * (1L << 21);\n  carry8 = (s8 + (1L << 20)) >> 21; s9 += carry8; s8 -= carry8 * (1L << 21);\n  carry10 = (s10 + (1L << 20)) >> 21; s11 += carry10; s10 -= carry10 * (1L << 21);\n  carry12 = (s12 + (1L << 20)) >> 21; s13 += carry12; s12 -= carry12 * (1L << 21);\n  carry14 = (s14 + (1L << 20)) >> 21; s15 += carry14; s14 -= carry14 * (1L << 21);\n  carry16 = (s16 + (1L << 20)) >> 21; s17 += carry16; s16 -= carry16 * (1L << 21);\n  carry18 = (s18 + (1L << 20)) >> 21; s19 += carry18; s18 -= carry18 * (1L << 21);\n  carry20 = (s20 + (1L << 20)) >> 21; s21 += carry20; s20 -= carry20 * (1L << 21);\n  carry22 = (s22 + (1L << 20)) >> 21; s23 += carry22; s22 -= carry22 * (1L << 21);\n\n  carry1 = (s1 + (1L << 20)) >> 21; s2 += carry1; s1 -= carry1 * (1L << 21);\n  carry3 = (s3 + (1L << 20)) >> 21; s4 += carry3; s3 -= carry3 * (1L << 21);\n  carry5 = (s5 + (1L << 20)) >> 21; s6 += carry5; s5 -= carry5 * (1L << 21);\n  carry7 = (s7 + (1L << 20)) >> 21; s8 += carry7; s7 -= carry7 * (1L << 21);\n  carry9 = (s9 + (1L << 20)) >> 21; s10 += carry9; s9 -= carry9 * (1L << 21);\n  carry11 = (s11 + (1L << 20)) >> 21; s12 += carry11; s11 -= carry11 * (1L << 21);\n  carry13 = (s13 + (1L << 20)) >> 21; s14 += carry13; s13 -= carry13 * (1L << 21);\n  carry15 = (s15 + (1L << 20)) >> 21; s16 += carry15; s15 -= carry15 * (1L << 21);\n  carry17 = (s17 + (1L << 20)) >> 21; s18 += carry17; s17 -= carry17 * (1L << 21);\n  carry19 = (s19 + (1L << 20)) >> 21; s20 += carry19; s19 -= carry19 * (1L << 21);\n  carry21 = (s21 + (1L << 20)) >> 21; s22 += carry21; s21 -= carry21 * (1L << 21);\n\n  s11 += s23 * 666643;\n  s12 += s23 * 470296;\n  s13 += s23 * 654183;\n  s14 -= s23 * 997805;\n  s15 += s23 * 136657;\n  s16 -= s23 * 683901;\n\n\n  s10 += s22 * 666643;\n  s11 += s22 * 470296;\n  s12 += s22 * 654183;\n  s13 -= s22 * 997805;\n  s14 += s22 * 136657;\n  s15 -= s22 * 683901;\n\n\n  s9 += s21 * 666643;\n  s10 += s21 * 470296;\n  s11 += s21 * 654183;\n  s12 -= s21 * 997805;\n  s13 += s21 * 136657;\n  s14 -= s21 * 683901;\n\n\n  s8 += s20 * 666643;\n  s9 += s20 * 470296;\n  s10 += s20 * 654183;\n  s11 -= s20 * 997805;\n  s12 += s20 * 136657;\n  s13 -= s20 * 683901;\n\n\n  s7 += s19 * 666643;\n  s8 += s19 * 470296;\n  s9 += s19 * 654183;\n  s10 -= s19 * 997805;\n  s11 += s19 * 136657;\n  s12 -= s19 * 683901;\n\n\n  s6 += s18 * 666643;\n  s7 += s18 * 470296;\n  s8 += s18 * 654183;\n  s9 -= s18 * 997805;\n  s10 += s18 * 136657;\n  s11 -= s18 * 683901;\n\n\n  carry6 = (s6 + (1L << 20)) >> 21; s7 += carry6; s6 -= carry6 * (1L << 21);\n  carry8 = (s8 + (1L << 20)) >> 21; s9 += carry8; s8 -= carry8 * (1L << 21);\n  carry10 = (s10 + (1L << 20)) >> 21; s11 += carry10; s10 -= carry10 * (1L << 21);\n  carry12 = (s12 + (1L << 20)) >> 21; s13 += carry12; s12 -= carry12 * (1L << 21);\n  carry14 = (s14 + (1L << 20)) >> 21; s15 += carry14; s14 -= carry14 * (1L << 21);\n  carry16 = (s16 + (1L << 20)) >> 21; s17 += carry16; s16 -= carry16 * (1L << 21);\n\n  carry7 = (s7 + (1L << 20)) >> 21; s8 += carry7; s7 -= carry7 * (1L << 21);\n  carry9 = (s9 + (1L << 20)) >> 21; s10 += carry9; s9 -= carry9 * (1L << 21);\n  carry11 = (s11 + (1L << 20)) >> 21; s12 += carry11; s11 -= carry11 * (1L << 21);\n  carry13 = (s13 + (1L << 20)) >> 21; s14 += carry13; s13 -= carry13 * (1L << 21);\n  carry15 = (s15 + (1L << 20)) >> 21; s16 += carry15; s15 -= carry15 * (1L << 21);\n\n  s5 += s17 * 666643;\n  s6 += s17 * 470296;\n  s7 += s17 * 654183;\n  s8 -= s17 * 997805;\n  s9 += s17 * 136657;\n  s10 -= s17 * 683901;\n\n\n  s4 += s16 * 666643;\n  s5 += s16 * 470296;\n  s6 += s16 * 654183;\n  s7 -= s16 * 997805;\n  s8 += s16 * 136657;\n  s9 -= s16 * 683901;\n\n\n  s3 += s15 * 666643;\n  s4 += s15 * 470296;\n  s5 += s15 * 654183;\n  s6 -= s15 * 997805;\n  s7 += s15 * 136657;\n  s8 -= s15 * 683901;\n\n\n  s2 += s14 * 666643;\n  s3 += s14 * 470296;\n  s4 += s14 * 654183;\n  s5 -= s14 * 997805;\n  s6 += s14 * 136657;\n  s7 -= s14 * 683901;\n\n\n  s1 += s13 * 666643;\n  s2 += s13 * 470296;\n  s3 += s13 * 654183;\n  s4 -= s13 * 997805;\n  s5 += s13 * 136657;\n  s6 -= s13 * 683901;\n\n\n  s0 += s12 * 666643;\n  s1 += s12 * 470296;\n  s2 += s12 * 654183;\n  s3 -= s12 * 997805;\n  s4 += s12 * 136657;\n  s5 -= s12 * 683901;\n  s12 = 0;\n\n  carry0 = (s0 + (1L << 20)) >> 21; s1 += carry0; s0 -= carry0 * (1L << 21);\n  carry2 = (s2 + (1L << 20)) >> 21; s3 += carry2; s2 -= carry2 * (1L << 21);\n  carry4 = (s4 + (1L << 20)) >> 21; s5 += carry4; s4 -= carry4 * (1L << 21);\n  carry6 = (s6 + (1L << 20)) >> 21; s7 += carry6; s6 -= carry6 * (1L << 21);\n  carry8 = (s8 + (1L << 20)) >> 21; s9 += carry8; s8 -= carry8 * (1L << 21);\n  carry10 = (s10 + (1L << 20)) >> 21; s11 += carry10; s10 -= carry10 * (1L << 21);\n\n  carry1 = (s1 + (1L << 20)) >> 21; s2 += carry1; s1 -= carry1 * (1L << 21);\n  carry3 = (s3 + (1L << 20)) >> 21; s4 += carry3; s3 -= carry3 * (1L << 21);\n  carry5 = (s5 + (1L << 20)) >> 21; s6 += carry5; s5 -= carry5 * (1L << 21);\n  carry7 = (s7 + (1L << 20)) >> 21; s8 += carry7; s7 -= carry7 * (1L << 21);\n  carry9 = (s9 + (1L << 20)) >> 21; s10 += carry9; s9 -= carry9 * (1L << 21);\n  carry11 = (s11 + (1L << 20)) >> 21; s12 += carry11; s11 -= carry11 * (1L << 21);\n\n  s0 += s12 * 666643;\n  s1 += s12 * 470296;\n  s2 += s12 * 654183;\n  s3 -= s12 * 997805;\n  s4 += s12 * 136657;\n  s5 -= s12 * 683901;\n  s12 = 0;\n\n  carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 * (1L << 21);\n  carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 * (1L << 21);\n  carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 * (1L << 21);\n  carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 * (1L << 21);\n  carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 * (1L << 21);\n  carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 * (1L << 21);\n  carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 * (1L << 21);\n  carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 * (1L << 21);\n  carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 * (1L << 21);\n  carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 * (1L << 21);\n  carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 * (1L << 21);\n  carry11 = s11 >> 21; s12 += carry11; s11 -= carry11 * (1L << 21);\n\n  s0 += s12 * 666643;\n  s1 += s12 * 470296;\n  s2 += s12 * 654183;\n  s3 -= s12 * 997805;\n  s4 += s12 * 136657;\n  s5 -= s12 * 683901;\n\n\n  carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 * (1L << 21);\n  carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 * (1L << 21);\n  carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 * (1L << 21);\n  carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 * (1L << 21);\n  carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 * (1L << 21);\n  carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 * (1L << 21);\n  carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 * (1L << 21);\n  carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 * (1L << 21);\n  carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 * (1L << 21);\n  carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 * (1L << 21);\n  carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 * (1L << 21);\n\n  s[0] = s0 >> 0;\n  s[1] = s0 >> 8;\n  s[2] = (s0 >> 16) | (s1 << 5);\n  s[3] = s1 >> 3;\n  s[4] = s1 >> 11;\n  s[5] = (s1 >> 19) | (s2 << 2);\n  s[6] = s2 >> 6;\n  s[7] = (s2 >> 14) | (s3 << 7);\n  s[8] = s3 >> 1;\n  s[9] = s3 >> 9;\n  s[10] = (s3 >> 17) | (s4 << 4);\n  s[11] = s4 >> 4;\n  s[12] = s4 >> 12;\n  s[13] = (s4 >> 20) | (s5 << 1);\n  s[14] = s5 >> 7;\n  s[15] = (s5 >> 15) | (s6 << 6);\n  s[16] = s6 >> 2;\n  s[17] = s6 >> 10;\n  s[18] = (s6 >> 18) | (s7 << 3);\n  s[19] = s7 >> 5;\n  s[20] = s7 >> 13;\n  s[21] = s8 >> 0;\n  s[22] = s8 >> 8;\n  s[23] = (s8 >> 16) | (s9 << 5);\n  s[24] = s9 >> 3;\n  s[25] = s9 >> 11;\n  s[26] = (s9 >> 19) | (s10 << 2);\n  s[27] = s10 >> 6;\n  s[28] = (s10 >> 14) | (s11 << 7);\n  s[29] = s11 >> 1;\n  s[30] = s11 >> 9;\n  s[31] = s11 >> 17;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/sc_reduce.c",
    "content": "#include \"sc.h\"\n#include \"crypto_int64.h\"\n#include \"crypto_uint32.h\"\n#include \"crypto_uint64.h\"\n\nstatic crypto_uint64 load_3(const unsigned char *in)\n{\n  crypto_uint64 result;\n  result = (crypto_uint64) in[0];\n  result |= ((crypto_uint64) in[1]) << 8;\n  result |= ((crypto_uint64) in[2]) << 16;\n  return result;\n}\n\nstatic crypto_uint64 load_4(const unsigned char *in)\n{\n  crypto_uint64 result;\n  result = (crypto_uint64) in[0];\n  result |= ((crypto_uint64) in[1]) << 8;\n  result |= ((crypto_uint64) in[2]) << 16;\n  result |= ((crypto_uint64) in[3]) << 24;\n  return result;\n}\n\n/*\nInput:\n  s[0]+256*s[1]+...+256^63*s[63] = s\n\nOutput:\n  s[0]+256*s[1]+...+256^31*s[31] = s mod l\n  where l = 2^252 + 27742317777372353535851937790883648493.\n  Overwrites s in place.\n*/\n\nvoid sc_reduce(unsigned char *s)\n{\n  crypto_int64 s0 = 2097151 & load_3(s);\n  crypto_int64 s1 = 2097151 & (load_4(s + 2) >> 5);\n  crypto_int64 s2 = 2097151 & (load_3(s + 5) >> 2);\n  crypto_int64 s3 = 2097151 & (load_4(s + 7) >> 7);\n  crypto_int64 s4 = 2097151 & (load_4(s + 10) >> 4);\n  crypto_int64 s5 = 2097151 & (load_3(s + 13) >> 1);\n  crypto_int64 s6 = 2097151 & (load_4(s + 15) >> 6);\n  crypto_int64 s7 = 2097151 & (load_3(s + 18) >> 3);\n  crypto_int64 s8 = 2097151 & load_3(s + 21);\n  crypto_int64 s9 = 2097151 & (load_4(s + 23) >> 5);\n  crypto_int64 s10 = 2097151 & (load_3(s + 26) >> 2);\n  crypto_int64 s11 = 2097151 & (load_4(s + 28) >> 7);\n  crypto_int64 s12 = 2097151 & (load_4(s + 31) >> 4);\n  crypto_int64 s13 = 2097151 & (load_3(s + 34) >> 1);\n  crypto_int64 s14 = 2097151 & (load_4(s + 36) >> 6);\n  crypto_int64 s15 = 2097151 & (load_3(s + 39) >> 3);\n  crypto_int64 s16 = 2097151 & load_3(s + 42);\n  crypto_int64 s17 = 2097151 & (load_4(s + 44) >> 5);\n  crypto_int64 s18 = 2097151 & (load_3(s + 47) >> 2);\n  crypto_int64 s19 = 2097151 & (load_4(s + 49) >> 7);\n  crypto_int64 s20 = 2097151 & (load_4(s + 52) >> 4);\n  crypto_int64 s21 = 2097151 & (load_3(s + 55) >> 1);\n  crypto_int64 s22 = 2097151 & (load_4(s + 57) >> 6);\n  crypto_int64 s23 = (load_4(s + 60) >> 3);\n  crypto_int64 carry0;\n  crypto_int64 carry1;\n  crypto_int64 carry2;\n  crypto_int64 carry3;\n  crypto_int64 carry4;\n  crypto_int64 carry5;\n  crypto_int64 carry6;\n  crypto_int64 carry7;\n  crypto_int64 carry8;\n  crypto_int64 carry9;\n  crypto_int64 carry10;\n  crypto_int64 carry11;\n  crypto_int64 carry12;\n  crypto_int64 carry13;\n  crypto_int64 carry14;\n  crypto_int64 carry15;\n  crypto_int64 carry16;\n\n  s11 += s23 * 666643;\n  s12 += s23 * 470296;\n  s13 += s23 * 654183;\n  s14 -= s23 * 997805;\n  s15 += s23 * 136657;\n  s16 -= s23 * 683901;\n\n\n  s10 += s22 * 666643;\n  s11 += s22 * 470296;\n  s12 += s22 * 654183;\n  s13 -= s22 * 997805;\n  s14 += s22 * 136657;\n  s15 -= s22 * 683901;\n\n\n  s9 += s21 * 666643;\n  s10 += s21 * 470296;\n  s11 += s21 * 654183;\n  s12 -= s21 * 997805;\n  s13 += s21 * 136657;\n  s14 -= s21 * 683901;\n\n\n  s8 += s20 * 666643;\n  s9 += s20 * 470296;\n  s10 += s20 * 654183;\n  s11 -= s20 * 997805;\n  s12 += s20 * 136657;\n  s13 -= s20 * 683901;\n\n\n  s7 += s19 * 666643;\n  s8 += s19 * 470296;\n  s9 += s19 * 654183;\n  s10 -= s19 * 997805;\n  s11 += s19 * 136657;\n  s12 -= s19 * 683901;\n\n\n  s6 += s18 * 666643;\n  s7 += s18 * 470296;\n  s8 += s18 * 654183;\n  s9 -= s18 * 997805;\n  s10 += s18 * 136657;\n  s11 -= s18 * 683901;\n\n\n  carry6 = (s6 + (1L << 20)) >> 21; s7 += carry6; s6 -= carry6 * (1L << 21);\n  carry8 = (s8 + (1L << 20)) >> 21; s9 += carry8; s8 -= carry8 * (1L << 21);\n  carry10 = (s10 + (1L << 20)) >> 21; s11 += carry10; s10 -= carry10 * (1L << 21);\n  carry12 = (s12 + (1L << 20)) >> 21; s13 += carry12; s12 -= carry12 * (1L << 21);\n  carry14 = (s14 + (1L << 20)) >> 21; s15 += carry14; s14 -= carry14 * (1L << 21);\n  carry16 = (s16 + (1L << 20)) >> 21; s17 += carry16; s16 -= carry16 * (1L << 21);\n\n  carry7 = (s7 + (1L << 20)) >> 21; s8 += carry7; s7 -= carry7 * (1L << 21);\n  carry9 = (s9 + (1L << 20)) >> 21; s10 += carry9; s9 -= carry9 * (1L << 21);\n  carry11 = (s11 + (1L << 20)) >> 21; s12 += carry11; s11 -= carry11 * (1L << 21);\n  carry13 = (s13 + (1L << 20)) >> 21; s14 += carry13; s13 -= carry13 * (1L << 21);\n  carry15 = (s15 + (1L << 20)) >> 21; s16 += carry15; s15 -= carry15 * (1L << 21);\n\n  s5 += s17 * 666643;\n  s6 += s17 * 470296;\n  s7 += s17 * 654183;\n  s8 -= s17 * 997805;\n  s9 += s17 * 136657;\n  s10 -= s17 * 683901;\n\n\n  s4 += s16 * 666643;\n  s5 += s16 * 470296;\n  s6 += s16 * 654183;\n  s7 -= s16 * 997805;\n  s8 += s16 * 136657;\n  s9 -= s16 * 683901;\n\n\n  s3 += s15 * 666643;\n  s4 += s15 * 470296;\n  s5 += s15 * 654183;\n  s6 -= s15 * 997805;\n  s7 += s15 * 136657;\n  s8 -= s15 * 683901;\n\n\n  s2 += s14 * 666643;\n  s3 += s14 * 470296;\n  s4 += s14 * 654183;\n  s5 -= s14 * 997805;\n  s6 += s14 * 136657;\n  s7 -= s14 * 683901;\n\n\n  s1 += s13 * 666643;\n  s2 += s13 * 470296;\n  s3 += s13 * 654183;\n  s4 -= s13 * 997805;\n  s5 += s13 * 136657;\n  s6 -= s13 * 683901;\n\n\n  s0 += s12 * 666643;\n  s1 += s12 * 470296;\n  s2 += s12 * 654183;\n  s3 -= s12 * 997805;\n  s4 += s12 * 136657;\n  s5 -= s12 * 683901;\n  s12 = 0;\n\n  carry0 = (s0 + (1L << 20)) >> 21; s1 += carry0; s0 -= carry0 * (1L << 21);\n  carry2 = (s2 + (1L << 20)) >> 21; s3 += carry2; s2 -= carry2 * (1L << 21);\n  carry4 = (s4 + (1L << 20)) >> 21; s5 += carry4; s4 -= carry4 * (1L << 21);\n  carry6 = (s6 + (1L << 20)) >> 21; s7 += carry6; s6 -= carry6 * (1L << 21);\n  carry8 = (s8 + (1L << 20)) >> 21; s9 += carry8; s8 -= carry8 * (1L << 21);\n  carry10 = (s10 + (1L << 20)) >> 21; s11 += carry10; s10 -= carry10 * (1L << 21);\n\n  carry1 = (s1 + (1L << 20)) >> 21; s2 += carry1; s1 -= carry1 * (1L << 21);\n  carry3 = (s3 + (1L << 20)) >> 21; s4 += carry3; s3 -= carry3 * (1L << 21);\n  carry5 = (s5 + (1L << 20)) >> 21; s6 += carry5; s5 -= carry5 * (1L << 21);\n  carry7 = (s7 + (1L << 20)) >> 21; s8 += carry7; s7 -= carry7 * (1L << 21);\n  carry9 = (s9 + (1L << 20)) >> 21; s10 += carry9; s9 -= carry9 * (1L << 21);\n  carry11 = (s11 + (1L << 20)) >> 21; s12 += carry11; s11 -= carry11 * (1L << 21);\n\n  s0 += s12 * 666643;\n  s1 += s12 * 470296;\n  s2 += s12 * 654183;\n  s3 -= s12 * 997805;\n  s4 += s12 * 136657;\n  s5 -= s12 * 683901;\n  s12 = 0;\n\n  carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 * (1L << 21);\n  carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 * (1L << 21);\n  carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 * (1L << 21);\n  carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 * (1L << 21);\n  carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 * (1L << 21);\n  carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 * (1L << 21);\n  carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 * (1L << 21);\n  carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 * (1L << 21);\n  carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 * (1L << 21);\n  carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 * (1L << 21);\n  carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 * (1L << 21);\n  carry11 = s11 >> 21; s12 += carry11; s11 -= carry11 * (1L << 21);\n\n  s0 += s12 * 666643;\n  s1 += s12 * 470296;\n  s2 += s12 * 654183;\n  s3 -= s12 * 997805;\n  s4 += s12 * 136657;\n  s5 -= s12 * 683901;\n\n\n  carry0 = s0 >> 21; s1 += carry0; s0 -= carry0 * (1L << 21);\n  carry1 = s1 >> 21; s2 += carry1; s1 -= carry1 * (1L << 21);\n  carry2 = s2 >> 21; s3 += carry2; s2 -= carry2 * (1L << 21);\n  carry3 = s3 >> 21; s4 += carry3; s3 -= carry3 * (1L << 21);\n  carry4 = s4 >> 21; s5 += carry4; s4 -= carry4 * (1L << 21);\n  carry5 = s5 >> 21; s6 += carry5; s5 -= carry5 * (1L << 21);\n  carry6 = s6 >> 21; s7 += carry6; s6 -= carry6 * (1L << 21);\n  carry7 = s7 >> 21; s8 += carry7; s7 -= carry7 * (1L << 21);\n  carry8 = s8 >> 21; s9 += carry8; s8 -= carry8 * (1L << 21);\n  carry9 = s9 >> 21; s10 += carry9; s9 -= carry9 * (1L << 21);\n  carry10 = s10 >> 21; s11 += carry10; s10 -= carry10 * (1L << 21);\n\n  s[0] = s0 >> 0;\n  s[1] = s0 >> 8;\n  s[2] = (s0 >> 16) | (s1 << 5);\n  s[3] = s1 >> 3;\n  s[4] = s1 >> 11;\n  s[5] = (s1 >> 19) | (s2 << 2);\n  s[6] = s2 >> 6;\n  s[7] = (s2 >> 14) | (s3 << 7);\n  s[8] = s3 >> 1;\n  s[9] = s3 >> 9;\n  s[10] = (s3 >> 17) | (s4 << 4);\n  s[11] = s4 >> 4;\n  s[12] = s4 >> 12;\n  s[13] = (s4 >> 20) | (s5 << 1);\n  s[14] = s5 >> 7;\n  s[15] = (s5 >> 15) | (s6 << 6);\n  s[16] = s6 >> 2;\n  s[17] = s6 >> 10;\n  s[18] = (s6 >> 18) | (s7 << 3);\n  s[19] = s7 >> 5;\n  s[20] = s7 >> 13;\n  s[21] = s8 >> 0;\n  s[22] = s8 >> 8;\n  s[23] = (s8 >> 16) | (s9 << 5);\n  s[24] = s9 >> 3;\n  s[25] = s9 >> 11;\n  s[26] = (s9 >> 19) | (s10 << 2);\n  s[27] = s10 >> 6;\n  s[28] = (s10 >> 14) | (s11 << 7);\n  s[29] = s11 >> 1;\n  s[30] = s11 >> 9;\n  s[31] = s11 >> 17;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/sign.c",
    "content": "\n#include <string.h>\n\n#include \"crypto_hash_sha512.h\"\n#include \"crypto_sign_ed25519.h\"\n#include \"ge.h\"\n#include \"sc.h\"\n#include \"utils.h\"\n\nint\ncrypto_sign_ed25519_detached(unsigned char *sig, unsigned long long *siglen_p,\n                             const unsigned char *m, unsigned long long mlen,\n                             const unsigned char *sk)\n{\n    crypto_hash_sha512_state hs;\n    unsigned char az[64];\n    unsigned char nonce[64];\n    unsigned char hram[64];\n    ge_p3 R;\n\n    crypto_hash_sha512(az, sk, 32);\n    az[0] &= 248;\n    az[31] &= 63;\n    az[31] |= 64;\n\n    crypto_hash_sha512_init(&hs);\n    crypto_hash_sha512_update(&hs, az + 32, 32);\n    crypto_hash_sha512_update(&hs, m, mlen);\n    crypto_hash_sha512_final(&hs, nonce);\n\n    memmove(sig + 32, sk + 32, 32);\n\n    sc_reduce(nonce);\n    ge_scalarmult_base(&R, nonce);\n    ge_p3_tobytes(sig, &R);\n\n    crypto_hash_sha512_init(&hs);\n    crypto_hash_sha512_update(&hs, sig, 64);\n    crypto_hash_sha512_update(&hs, m, mlen);\n    crypto_hash_sha512_final(&hs, hram);\n\n    sc_reduce(hram);\n    sc_muladd(sig + 32, hram, az, nonce);\n\n    sodium_memzero(az, sizeof az);\n\n    if (siglen_p != NULL) {\n        *siglen_p = 64U;\n    }\n    return 0;\n}\n\nint\ncrypto_sign_ed25519(unsigned char *sm, unsigned long long *smlen_p,\n                    const unsigned char *m, unsigned long long mlen,\n                    const unsigned char *sk)\n{\n    unsigned long long siglen;\n\n    memmove(sm + crypto_sign_ed25519_BYTES, m, mlen);\n/* LCOV_EXCL_START */\n    if (crypto_sign_ed25519_detached(sm, &siglen,\n                                     sm + crypto_sign_ed25519_BYTES,\n                                     mlen, sk) != 0 ||\n        siglen != crypto_sign_ed25519_BYTES) {\n        if (smlen_p != NULL) {\n            *smlen_p = 0;\n        }\n        memset(sm, 0, mlen + crypto_sign_ed25519_BYTES);\n        return -1;\n    }\n/* LCOV_EXCL_STOP */\n\n    if (smlen_p != NULL) {\n        *smlen_p = mlen + siglen;\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/ref10/sqrtm1.h",
    "content": "-32595792,-7943725,9377950,3500415,12389472,-272473,-25146209,-2005654,326686,11406482\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_sign/ed25519/sign_ed25519_api.c",
    "content": "\n#include <string.h>\n\n#include \"crypto_sign_ed25519.h\"\n\nsize_t\ncrypto_sign_ed25519_bytes(void) {\n    return crypto_sign_ed25519_BYTES;\n}\n\nsize_t\ncrypto_sign_ed25519_seedbytes(void) {\n    return crypto_sign_ed25519_SEEDBYTES;\n}\n\nsize_t\ncrypto_sign_ed25519_publickeybytes(void) {\n    return crypto_sign_ed25519_PUBLICKEYBYTES;\n}\n\nsize_t\ncrypto_sign_ed25519_secretkeybytes(void) {\n    return crypto_sign_ed25519_SECRETKEYBYTES;\n}\n\nint\ncrypto_sign_ed25519_sk_to_seed(unsigned char *seed, const unsigned char *sk)\n{\n    memmove(seed, sk, crypto_sign_ed25519_SEEDBYTES);\n    return 0;\n}\n\nint\ncrypto_sign_ed25519_sk_to_pk(unsigned char *pk, const unsigned char *sk)\n{\n    memmove(pk, sk + crypto_sign_ed25519_SEEDBYTES,\n            crypto_sign_ed25519_PUBLICKEYBYTES);\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/aes128ctr/portable/afternm_aes128ctr.c",
    "content": "/* Author: Peter Schwabe, ported from an assembly implementation by Emilia Käsper\n * Date: 2009-03-19\n * Public domain */\n\n#include \"crypto_stream_aes128ctr.h\"\n#include \"int128.h\"\n#include \"common.h\"\n#include \"consts.h\"\n\nint crypto_stream_aes128ctr_afternm(unsigned char *out, unsigned long long len, const unsigned char *nonce, const unsigned char *c)\n{\n\n  int128 xmm0;\n  int128 xmm1;\n  int128 xmm2;\n  int128 xmm3;\n  int128 xmm4;\n  int128 xmm5;\n  int128 xmm6;\n  int128 xmm7;\n\n  int128 xmm8;\n  int128 xmm9;\n  int128 xmm10;\n  int128 xmm11;\n  int128 xmm12;\n  int128 xmm13;\n  int128 xmm14;\n  int128 xmm15;\n\n  int128 nonce_stack;\n  unsigned long long lensav;\n  unsigned char bl[128];\n  unsigned char *blp;\n  unsigned char *np;\n  unsigned char b;\n\n  uint32 tmp;\n\n  /* Copy nonce on the stack */\n  copy2(&nonce_stack, (const int128 *) (nonce + 0));\n  np = (unsigned char *)&nonce_stack;\n\n    enc_block:\n\n    xmm0 = *(int128 *) (np + 0);\n    copy2(&xmm1, &xmm0);\n    shufb(&xmm1, SWAP32);\n    copy2(&xmm2, &xmm1);\n    copy2(&xmm3, &xmm1);\n    copy2(&xmm4, &xmm1);\n    copy2(&xmm5, &xmm1);\n    copy2(&xmm6, &xmm1);\n    copy2(&xmm7, &xmm1);\n\n    add_uint32_big(&xmm1, 1);\n    add_uint32_big(&xmm2, 2);\n    add_uint32_big(&xmm3, 3);\n    add_uint32_big(&xmm4, 4);\n    add_uint32_big(&xmm5, 5);\n    add_uint32_big(&xmm6, 6);\n    add_uint32_big(&xmm7, 7);\n\n    shufb(&xmm0, M0);\n    shufb(&xmm1, M0SWAP);\n    shufb(&xmm2, M0SWAP);\n    shufb(&xmm3, M0SWAP);\n    shufb(&xmm4, M0SWAP);\n    shufb(&xmm5, M0SWAP);\n    shufb(&xmm6, M0SWAP);\n    shufb(&xmm7, M0SWAP);\n\n    bitslice(xmm7, xmm6, xmm5, xmm4, xmm3, xmm2, xmm1, xmm0, xmm8)\n\n    aesround( 1, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,c)\n    aesround( 2, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,c)\n    aesround( 3, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,c)\n    aesround( 4, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,c)\n    aesround( 5, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,c)\n    aesround( 6, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,c)\n    aesround( 7, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,c)\n    aesround( 8, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,c)\n    aesround( 9, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,c)\n    lastround(xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,c)\n\n    bitslice(xmm13, xmm10, xmm15, xmm11, xmm14, xmm12, xmm9, xmm8, xmm0)\n\n    if(len < 128) goto partial;\n    if(len == 128) goto full;\n\n    tmp = load32_bigendian(np + 12);\n    tmp += 8;\n    store32_bigendian(np + 12, tmp);\n\n    *(int128 *) (out + 0) = xmm8;\n    *(int128 *) (out + 16) = xmm9;\n    *(int128 *) (out + 32) = xmm12;\n    *(int128 *) (out + 48) = xmm14;\n    *(int128 *) (out + 64) = xmm11;\n    *(int128 *) (out + 80) = xmm15;\n    *(int128 *) (out + 96) = xmm10;\n    *(int128 *) (out + 112) = xmm13;\n\n    len -= 128;\n    out += 128;\n\n    goto enc_block;\n\n    partial:\n\n    lensav = len;\n    len >>= 4;\n\n    tmp = load32_bigendian(np + 12);\n    tmp += len;\n    store32_bigendian(np + 12, tmp);\n\n    blp = bl;\n    *(int128 *)(blp + 0) = xmm8;\n    *(int128 *)(blp + 16) = xmm9;\n    *(int128 *)(blp + 32) = xmm12;\n    *(int128 *)(blp + 48) = xmm14;\n    *(int128 *)(blp + 64) = xmm11;\n    *(int128 *)(blp + 80) = xmm15;\n    *(int128 *)(blp + 96) = xmm10;\n    *(int128 *)(blp + 112) = xmm13;\n\n    bytes:\n\n    if(lensav == 0) goto end;\n\n    b = blp[0]; /* clang false positive */\n    *(unsigned char *)(out + 0) = b;\n\n    blp += 1;\n    out +=1;\n    lensav -= 1;\n\n    goto bytes;\n\n    full:\n\n    tmp = load32_bigendian(np + 12);\n    tmp += 8;\n    store32_bigendian(np + 12, tmp);\n\n    *(int128 *) (out + 0) = xmm8;\n    *(int128 *) (out + 16) = xmm9;\n    *(int128 *) (out + 32) = xmm12;\n    *(int128 *) (out + 48) = xmm14;\n    *(int128 *) (out + 64) = xmm11;\n    *(int128 *) (out + 80) = xmm15;\n    *(int128 *) (out + 96) = xmm10;\n    *(int128 *) (out + 112) = xmm13;\n\n    end:\n    return 0;\n\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/aes128ctr/portable/beforenm_aes128ctr.c",
    "content": "/* Author: Peter Schwabe, ported from an assembly implementation by Emilia Käsper\n * Date: 2009-03-19\n * Public domain */\n\n#include \"crypto_stream_aes128ctr.h\"\n#include \"consts.h\"\n#include \"int128.h\"\n#include \"common.h\"\n\nint crypto_stream_aes128ctr_beforenm(unsigned char *c, const unsigned char *k)\n{\n\n  /*\n     int64 x0;\n     int64 x1;\n     int64 x2;\n     int64 x3;\n     int64 e;\n     int64 q0;\n     int64 q1;\n     int64 q2;\n     int64 q3;\n     */\n\n  int128 xmm0;\n  int128 xmm1;\n  int128 xmm2;\n  int128 xmm3;\n  int128 xmm4;\n  int128 xmm5;\n  int128 xmm6;\n  int128 xmm7;\n  int128 xmm8;\n  int128 xmm9;\n  int128 xmm10;\n  int128 xmm11;\n  int128 xmm12;\n  int128 xmm13;\n  int128 xmm14;\n  int128 xmm15;\n  int128 t;\n\n  bitslicekey0(k, c)\n\n    keyexpbs1(xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,c)\n    keyexpbs(xmm0, xmm1, xmm4, xmm6, xmm3, xmm7, xmm2, xmm5, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm1);, 2,c)\n    keyexpbs(xmm0, xmm1, xmm3, xmm2, xmm6, xmm5, xmm4, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm6);, 3,c)\n    keyexpbs(xmm0, xmm1, xmm6, xmm4, xmm2, xmm7, xmm3, xmm5, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm3);, 4,c)\n\n    keyexpbs(xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm3);, 5,c)\n    keyexpbs(xmm0, xmm1, xmm4, xmm6, xmm3, xmm7, xmm2, xmm5, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm5);, 6,c)\n    keyexpbs(xmm0, xmm1, xmm3, xmm2, xmm6, xmm5, xmm4, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm3);, 7,c)\n    keyexpbs(xmm0, xmm1, xmm6, xmm4, xmm2, xmm7, xmm3, xmm5, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm7);, 8,c)\n\n    keyexpbs(xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xor_rcon(&xmm0); xor_rcon(&xmm1); xor_rcon(&xmm6); xor_rcon(&xmm3);, 9,c)\n    keyexpbs10(xmm0, xmm1, xmm4, xmm6, xmm3, xmm7, xmm2, xmm5, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,c)\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/aes128ctr/portable/common.h",
    "content": "/* Author: Peter Schwabe, ported from an assembly implementation by Emilia Käsper\n Date: 2009-03-19\n Public domain */\n#ifndef COMMON_H\n#define COMMON_H\n\n#include \"types.h\"\n\n#define load32_bigendian crypto_stream_aes128ctr_portable_load32_bigendian\nuint32 load32_bigendian(const unsigned char *x);\n\n#define store32_bigendian crypto_stream_aes128ctr_portable_store32_bigendian\nvoid store32_bigendian(unsigned char *x,uint32 u);\n\n#define load32_littleendian crypto_stream_aes128ctr_portable_load32_littleendian\nuint32 load32_littleendian(const unsigned char *x);\n\n#define store32_littleendian crypto_stream_aes128ctr_portable_store32_littleendian\nvoid store32_littleendian(unsigned char *x,uint32 u);\n\n#define load64_littleendian crypto_stream_aes128ctr_portable_load64_littleendian\nuint64 load64_littleendian(const unsigned char *x);\n\n#define store64_littleendian crypto_stream_aes128ctr_portable_store64_littleendian\nvoid store64_littleendian(unsigned char *x,uint64 u);\n\n/* Macros required only for key expansion */\n\n#define keyexpbs1(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, t6, t7, bskey) \\\n  rotbyte(&b0);\\\n  rotbyte(&b1);\\\n  rotbyte(&b2);\\\n  rotbyte(&b3);\\\n  rotbyte(&b4);\\\n  rotbyte(&b5);\\\n  rotbyte(&b6);\\\n  rotbyte(&b7);\\\n  ;\\\n  sbox(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, t6, t7);\\\n  ;\\\n  xor_rcon(&b0);\\\n  shufb(&b0, EXPB0);\\\n  shufb(&b1, EXPB0);\\\n  shufb(&b4, EXPB0);\\\n  shufb(&b6, EXPB0);\\\n  shufb(&b3, EXPB0);\\\n  shufb(&b7, EXPB0);\\\n  shufb(&b2, EXPB0);\\\n  shufb(&b5, EXPB0);\\\n  shufb(&b0, EXPB0);\\\n  ;\\\n  t0 = *(int128 *)(bskey + 0);\\\n  t1 = *(int128 *)(bskey + 16);\\\n  t2 = *(int128 *)(bskey + 32);\\\n  t3 = *(int128 *)(bskey + 48);\\\n  t4 = *(int128 *)(bskey + 64);\\\n  t5 = *(int128 *)(bskey + 80);\\\n  t6 = *(int128 *)(bskey + 96);\\\n  t7 = *(int128 *)(bskey + 112);\\\n  ;\\\n  xor2(&b0, &t0);\\\n  xor2(&b1, &t1);\\\n  xor2(&b4, &t2);\\\n  xor2(&b6, &t3);\\\n  xor2(&b3, &t4);\\\n  xor2(&b7, &t5);\\\n  xor2(&b2, &t6);\\\n  xor2(&b5, &t7);\\\n  ;\\\n  rshift32_littleendian(&t0, 8);\\\n  rshift32_littleendian(&t1, 8);\\\n  rshift32_littleendian(&t2, 8);\\\n  rshift32_littleendian(&t3, 8);\\\n  rshift32_littleendian(&t4, 8);\\\n  rshift32_littleendian(&t5, 8);\\\n  rshift32_littleendian(&t6, 8);\\\n  rshift32_littleendian(&t7, 8);\\\n  ;\\\n  xor2(&b0, &t0);\\\n  xor2(&b1, &t1);\\\n  xor2(&b4, &t2);\\\n  xor2(&b6, &t3);\\\n  xor2(&b3, &t4);\\\n  xor2(&b7, &t5);\\\n  xor2(&b2, &t6);\\\n  xor2(&b5, &t7);\\\n  ;\\\n  rshift32_littleendian(&t0, 8);\\\n  rshift32_littleendian(&t1, 8);\\\n  rshift32_littleendian(&t2, 8);\\\n  rshift32_littleendian(&t3, 8);\\\n  rshift32_littleendian(&t4, 8);\\\n  rshift32_littleendian(&t5, 8);\\\n  rshift32_littleendian(&t6, 8);\\\n  rshift32_littleendian(&t7, 8);\\\n  ;\\\n  xor2(&b0, &t0);\\\n  xor2(&b1, &t1);\\\n  xor2(&b4, &t2);\\\n  xor2(&b6, &t3);\\\n  xor2(&b3, &t4);\\\n  xor2(&b7, &t5);\\\n  xor2(&b2, &t6);\\\n  xor2(&b5, &t7);\\\n  ;\\\n  rshift32_littleendian(&t0, 8);\\\n  rshift32_littleendian(&t1, 8);\\\n  rshift32_littleendian(&t2, 8);\\\n  rshift32_littleendian(&t3, 8);\\\n  rshift32_littleendian(&t4, 8);\\\n  rshift32_littleendian(&t5, 8);\\\n  rshift32_littleendian(&t6, 8);\\\n  rshift32_littleendian(&t7, 8);\\\n  ;\\\n  xor2(&b0, &t0);\\\n  xor2(&b1, &t1);\\\n  xor2(&b4, &t2);\\\n  xor2(&b6, &t3);\\\n  xor2(&b3, &t4);\\\n  xor2(&b7, &t5);\\\n  xor2(&b2, &t6);\\\n  xor2(&b5, &t7);\\\n  ;\\\n  *(int128 *)(bskey + 128) = b0;\\\n  *(int128 *)(bskey + 144) = b1;\\\n  *(int128 *)(bskey + 160) = b4;\\\n  *(int128 *)(bskey + 176) = b6;\\\n  *(int128 *)(bskey + 192) = b3;\\\n  *(int128 *)(bskey + 208) = b7;\\\n  *(int128 *)(bskey + 224) = b2;\\\n  *(int128 *)(bskey + 240) = b5;\\\n\n#define keyexpbs10(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, t6, t7, bskey) ;\\\n  toggle(&b0);\\\n  toggle(&b1);\\\n  toggle(&b5);\\\n  toggle(&b6);\\\n  rotbyte(&b0);\\\n  rotbyte(&b1);\\\n  rotbyte(&b2);\\\n  rotbyte(&b3);\\\n  rotbyte(&b4);\\\n  rotbyte(&b5);\\\n  rotbyte(&b6);\\\n  rotbyte(&b7);\\\n  ;\\\n  sbox(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, t6, t7);\\\n  ;\\\n  xor_rcon(&b1);\\\n  xor_rcon(&b4);\\\n  xor_rcon(&b3);\\\n  xor_rcon(&b7);\\\n  shufb(&b0, EXPB0);\\\n  shufb(&b1, EXPB0);\\\n  shufb(&b4, EXPB0);\\\n  shufb(&b6, EXPB0);\\\n  shufb(&b3, EXPB0);\\\n  shufb(&b7, EXPB0);\\\n  shufb(&b2, EXPB0);\\\n  shufb(&b5, EXPB0);\\\n  ;\\\n  t0 = *(int128 *)(bskey + 9 * 128 +   0);\\\n  t1 = *(int128 *)(bskey + 9 * 128 +  16);\\\n  t2 = *(int128 *)(bskey + 9 * 128 +  32);\\\n  t3 = *(int128 *)(bskey + 9 * 128 +  48);\\\n  t4 = *(int128 *)(bskey + 9 * 128 +  64);\\\n  t5 = *(int128 *)(bskey + 9 * 128 +  80);\\\n  t6 = *(int128 *)(bskey + 9 * 128 +  96);\\\n  t7 = *(int128 *)(bskey + 9 * 128 + 112);\\\n  ;\\\n  toggle(&t0);\\\n  toggle(&t1);\\\n  toggle(&t5);\\\n  toggle(&t6);\\\n  ;\\\n  xor2(&b0, &t0);\\\n  xor2(&b1, &t1);\\\n  xor2(&b4, &t2);\\\n  xor2(&b6, &t3);\\\n  xor2(&b3, &t4);\\\n  xor2(&b7, &t5);\\\n  xor2(&b2, &t6);\\\n  xor2(&b5, &t7);\\\n  ;\\\n  rshift32_littleendian(&t0, 8);\\\n  rshift32_littleendian(&t1, 8);\\\n  rshift32_littleendian(&t2, 8);\\\n  rshift32_littleendian(&t3, 8);\\\n  rshift32_littleendian(&t4, 8);\\\n  rshift32_littleendian(&t5, 8);\\\n  rshift32_littleendian(&t6, 8);\\\n  rshift32_littleendian(&t7, 8);\\\n  ;\\\n  xor2(&b0, &t0);\\\n  xor2(&b1, &t1);\\\n  xor2(&b4, &t2);\\\n  xor2(&b6, &t3);\\\n  xor2(&b3, &t4);\\\n  xor2(&b7, &t5);\\\n  xor2(&b2, &t6);\\\n  xor2(&b5, &t7);\\\n  ;\\\n  rshift32_littleendian(&t0, 8);\\\n  rshift32_littleendian(&t1, 8);\\\n  rshift32_littleendian(&t2, 8);\\\n  rshift32_littleendian(&t3, 8);\\\n  rshift32_littleendian(&t4, 8);\\\n  rshift32_littleendian(&t5, 8);\\\n  rshift32_littleendian(&t6, 8);\\\n  rshift32_littleendian(&t7, 8);\\\n  ;\\\n  xor2(&b0, &t0);\\\n  xor2(&b1, &t1);\\\n  xor2(&b4, &t2);\\\n  xor2(&b6, &t3);\\\n  xor2(&b3, &t4);\\\n  xor2(&b7, &t5);\\\n  xor2(&b2, &t6);\\\n  xor2(&b5, &t7);\\\n  ;\\\n  rshift32_littleendian(&t0, 8);\\\n  rshift32_littleendian(&t1, 8);\\\n  rshift32_littleendian(&t2, 8);\\\n  rshift32_littleendian(&t3, 8);\\\n  rshift32_littleendian(&t4, 8);\\\n  rshift32_littleendian(&t5, 8);\\\n  rshift32_littleendian(&t6, 8);\\\n  rshift32_littleendian(&t7, 8);\\\n  ;\\\n  xor2(&b0, &t0);\\\n  xor2(&b1, &t1);\\\n  xor2(&b4, &t2);\\\n  xor2(&b6, &t3);\\\n  xor2(&b3, &t4);\\\n  xor2(&b7, &t5);\\\n  xor2(&b2, &t6);\\\n  xor2(&b5, &t7);\\\n  ;\\\n  shufb(&b0, M0);\\\n  shufb(&b1, M0);\\\n  shufb(&b2, M0);\\\n  shufb(&b3, M0);\\\n  shufb(&b4, M0);\\\n  shufb(&b5, M0);\\\n  shufb(&b6, M0);\\\n  shufb(&b7, M0);\\\n  ;\\\n  *(int128 *)(bskey + 1280) = b0;\\\n  *(int128 *)(bskey + 1296) = b1;\\\n  *(int128 *)(bskey + 1312) = b4;\\\n  *(int128 *)(bskey + 1328) = b6;\\\n  *(int128 *)(bskey + 1344) = b3;\\\n  *(int128 *)(bskey + 1360) = b7;\\\n  *(int128 *)(bskey + 1376) = b2;\\\n  *(int128 *)(bskey + 1392) = b5;\\\n\n\n#define keyexpbs(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, t6, t7, rcon, i, bskey) \\\n  toggle(&b0);\\\n  toggle(&b1);\\\n  toggle(&b5);\\\n  toggle(&b6);\\\n  rotbyte(&b0);\\\n  rotbyte(&b1);\\\n  rotbyte(&b2);\\\n  rotbyte(&b3);\\\n  rotbyte(&b4);\\\n  rotbyte(&b5);\\\n  rotbyte(&b6);\\\n  rotbyte(&b7);\\\n  ;\\\n  sbox(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, t6, t7);\\\n  ;\\\n  rcon;\\\n  shufb(&b0, EXPB0);\\\n  shufb(&b1, EXPB0);\\\n  shufb(&b4, EXPB0);\\\n  shufb(&b6, EXPB0);\\\n  shufb(&b3, EXPB0);\\\n  shufb(&b7, EXPB0);\\\n  shufb(&b2, EXPB0);\\\n  shufb(&b5, EXPB0);\\\n  ;\\\n  t0 = *(int128 *)(bskey + (i-1) * 128 +   0);\\\n  t1 = *(int128 *)(bskey + (i-1) * 128 +  16);\\\n  t2 = *(int128 *)(bskey + (i-1) * 128 +  32);\\\n  t3 = *(int128 *)(bskey + (i-1) * 128 +  48);\\\n  t4 = *(int128 *)(bskey + (i-1) * 128 +  64);\\\n  t5 = *(int128 *)(bskey + (i-1) * 128 +  80);\\\n  t6 = *(int128 *)(bskey + (i-1) * 128 +  96);\\\n  t7 = *(int128 *)(bskey + (i-1) * 128 + 112);\\\n  ;\\\n  toggle(&t0);\\\n  toggle(&t1);\\\n  toggle(&t5);\\\n  toggle(&t6);\\\n  ;\\\n  xor2(&b0, &t0);\\\n  xor2(&b1, &t1);\\\n  xor2(&b4, &t2);\\\n  xor2(&b6, &t3);\\\n  xor2(&b3, &t4);\\\n  xor2(&b7, &t5);\\\n  xor2(&b2, &t6);\\\n  xor2(&b5, &t7);\\\n  ;\\\n  rshift32_littleendian(&t0, 8);\\\n  rshift32_littleendian(&t1, 8);\\\n  rshift32_littleendian(&t2, 8);\\\n  rshift32_littleendian(&t3, 8);\\\n  rshift32_littleendian(&t4, 8);\\\n  rshift32_littleendian(&t5, 8);\\\n  rshift32_littleendian(&t6, 8);\\\n  rshift32_littleendian(&t7, 8);\\\n  ;\\\n  xor2(&b0, &t0);\\\n  xor2(&b1, &t1);\\\n  xor2(&b4, &t2);\\\n  xor2(&b6, &t3);\\\n  xor2(&b3, &t4);\\\n  xor2(&b7, &t5);\\\n  xor2(&b2, &t6);\\\n  xor2(&b5, &t7);\\\n  ;\\\n  rshift32_littleendian(&t0, 8);\\\n  rshift32_littleendian(&t1, 8);\\\n  rshift32_littleendian(&t2, 8);\\\n  rshift32_littleendian(&t3, 8);\\\n  rshift32_littleendian(&t4, 8);\\\n  rshift32_littleendian(&t5, 8);\\\n  rshift32_littleendian(&t6, 8);\\\n  rshift32_littleendian(&t7, 8);\\\n  ;\\\n  xor2(&b0, &t0);\\\n  xor2(&b1, &t1);\\\n  xor2(&b4, &t2);\\\n  xor2(&b6, &t3);\\\n  xor2(&b3, &t4);\\\n  xor2(&b7, &t5);\\\n  xor2(&b2, &t6);\\\n  xor2(&b5, &t7);\\\n  ;\\\n  rshift32_littleendian(&t0, 8);\\\n  rshift32_littleendian(&t1, 8);\\\n  rshift32_littleendian(&t2, 8);\\\n  rshift32_littleendian(&t3, 8);\\\n  rshift32_littleendian(&t4, 8);\\\n  rshift32_littleendian(&t5, 8);\\\n  rshift32_littleendian(&t6, 8);\\\n  rshift32_littleendian(&t7, 8);\\\n  ;\\\n  xor2(&b0, &t0);\\\n  xor2(&b1, &t1);\\\n  xor2(&b4, &t2);\\\n  xor2(&b6, &t3);\\\n  xor2(&b3, &t4);\\\n  xor2(&b7, &t5);\\\n  xor2(&b2, &t6);\\\n  xor2(&b5, &t7);\\\n  ;\\\n  *(int128 *)(bskey + i*128 +   0) = b0;\\\n  *(int128 *)(bskey + i*128 +  16) = b1;\\\n  *(int128 *)(bskey + i*128 +  32) = b4;\\\n  *(int128 *)(bskey + i*128 +  48) = b6;\\\n  *(int128 *)(bskey + i*128 +  64) = b3;\\\n  *(int128 *)(bskey + i*128 +  80) = b7;\\\n  *(int128 *)(bskey + i*128 +  96) = b2;\\\n  *(int128 *)(bskey + i*128 + 112) = b5;\\\n\n/* Macros used in multiple contexts */\n\n#define bitslicekey0(key, bskey) \\\n  xmm0 = *(const int128 *) (key + 0);\\\n  shufb(&xmm0, M0);\\\n  copy2(&xmm1, &xmm0);\\\n  copy2(&xmm2, &xmm0);\\\n  copy2(&xmm3, &xmm0);\\\n  copy2(&xmm4, &xmm0);\\\n  copy2(&xmm5, &xmm0);\\\n  copy2(&xmm6, &xmm0);\\\n  copy2(&xmm7, &xmm0);\\\n  ;\\\n  bitslice(xmm7, xmm6, xmm5, xmm4, xmm3, xmm2, xmm1, xmm0, t);\\\n  ;\\\n  *(int128 *) (bskey + 0) = xmm0;\\\n  *(int128 *) (bskey + 16) = xmm1;\\\n  *(int128 *) (bskey + 32) = xmm2;\\\n  *(int128 *) (bskey + 48) = xmm3;\\\n  *(int128 *) (bskey + 64) = xmm4;\\\n  *(int128 *) (bskey + 80) = xmm5;\\\n  *(int128 *) (bskey + 96) = xmm6;\\\n  *(int128 *) (bskey + 112) = xmm7;\\\n\n\n#define bitslicekey10(key, bskey) \\\n  xmm0 = *(int128 *) (key + 0);\\\n  copy2(xmm1, xmm0);\\\n  copy2(xmm2, xmm0);\\\n  copy2(xmm3, xmm0);\\\n  copy2(xmm4, xmm0);\\\n  copy2(xmm5, xmm0);\\\n  copy2(xmm6, xmm0);\\\n  copy2(xmm7, xmm0);\\\n  ;\\\n  bitslice(xmm7, xmm6, xmm5, xmm4, xmm3, xmm2, xmm1, xmm0, t);\\\n  ;\\\n  toggle(&xmm6);\\\n  toggle(&xmm5);\\\n  toggle(&xmm1);\\\n  toggle(&xmm0);\\\n  ;\\\n  *(int128 *) (bskey +   0 + 1280) = xmm0;\\\n  *(int128 *) (bskey +  16 + 1280) = xmm1;\\\n  *(int128 *) (bskey +  32 + 1280) = xmm2;\\\n  *(int128 *) (bskey +  48 + 1280) = xmm3;\\\n  *(int128 *) (bskey +  64 + 1280) = xmm4;\\\n  *(int128 *) (bskey +  80 + 1280) = xmm5;\\\n  *(int128 *) (bskey +  96 + 1280) = xmm6;\\\n  *(int128 *) (bskey + 112 + 1280) = xmm7;\\\n\n\n#define bitslicekey(i,key,bskey) \\\n  xmm0 = *(int128 *) (key + 0);\\\n  shufb(&xmm0, M0);\\\n  copy2(&xmm1, &xmm0);\\\n  copy2(&xmm2, &xmm0);\\\n  copy2(&xmm3, &xmm0);\\\n  copy2(&xmm4, &xmm0);\\\n  copy2(&xmm5, &xmm0);\\\n  copy2(&xmm6, &xmm0);\\\n  copy2(&xmm7, &xmm0);\\\n  ;\\\n  bitslice(xmm7, xmm6, xmm5, xmm4, xmm3, xmm2, xmm1, xmm0, t);\\\n  ;\\\n  toggle(&xmm6);\\\n  toggle(&xmm5);\\\n  toggle(&xmm1);\\\n  toggle(&xmm0);\\\n  ;\\\n  *(int128 *) (bskey +   0 + 128*i) = xmm0;\\\n  *(int128 *) (bskey +  16 + 128*i) = xmm1;\\\n  *(int128 *) (bskey +  32 + 128*i) = xmm2;\\\n  *(int128 *) (bskey +  48 + 128*i) = xmm3;\\\n  *(int128 *) (bskey +  64 + 128*i) = xmm4;\\\n  *(int128 *) (bskey +  80 + 128*i) = xmm5;\\\n  *(int128 *) (bskey +  96 + 128*i) = xmm6;\\\n  *(int128 *) (bskey + 112 + 128*i) = xmm7;\\\n\n\n#define bitslice(x0, x1, x2, x3, x4, x5, x6, x7, t) \\\n        swapmove(x0, x1, 1, BS0, t);\\\n        swapmove(x2, x3, 1, BS0, t);\\\n        swapmove(x4, x5, 1, BS0, t);\\\n        swapmove(x6, x7, 1, BS0, t);\\\n        ;\\\n        swapmove(x0, x2, 2, BS1, t);\\\n        swapmove(x1, x3, 2, BS1, t);\\\n        swapmove(x4, x6, 2, BS1, t);\\\n        swapmove(x5, x7, 2, BS1, t);\\\n        ;\\\n        swapmove(x0, x4, 4, BS2, t);\\\n        swapmove(x1, x5, 4, BS2, t);\\\n        swapmove(x2, x6, 4, BS2, t);\\\n        swapmove(x3, x7, 4, BS2, t);\\\n\n\n#define swapmove(a, b, n, m, t) \\\n        copy2(&t, &b);\\\n  rshift64_littleendian(&t, n);\\\n        xor2(&t, &a);\\\n  and2(&t, &m);\\\n  xor2(&a, &t);\\\n  lshift64_littleendian(&t, n);\\\n  xor2(&b, &t);\n\n#define rotbyte(x) \\\n  shufb(x, ROTB) /* TODO: Make faster */\n\n\n/* Macros used for encryption (and decryption) */\n\n#define shiftrows(x0, x1, x2, x3, x4, x5, x6, x7, i, M, bskey) \\\n        xor2(&x0, (const int128 *)(bskey + 128*(i-1) + 0));\\\n  shufb(&x0, M);\\\n        xor2(&x1, (const int128 *)(bskey + 128*(i-1) + 16));\\\n  shufb(&x1, M);\\\n        xor2(&x2, (const int128 *)(bskey + 128*(i-1) + 32));\\\n  shufb(&x2, M);\\\n        xor2(&x3, (const int128 *)(bskey + 128*(i-1) + 48));\\\n  shufb(&x3, M);\\\n        xor2(&x4, (const int128 *)(bskey + 128*(i-1) + 64));\\\n  shufb(&x4, M);\\\n        xor2(&x5, (const int128 *)(bskey + 128*(i-1) + 80));\\\n  shufb(&x5, M);\\\n        xor2(&x6, (const int128 *)(bskey + 128*(i-1) + 96));\\\n  shufb(&x6, M);\\\n        xor2(&x7, (const int128 *)(bskey + 128*(i-1) + 112));\\\n  shufb(&x7, M);\\\n\n\n#define mixcolumns(x0, x1, x2, x3, x4, x5, x6, x7, t0, t1, t2, t3, t4, t5, t6, t7) \\\n  shufd(&t0, &x0, 0x93);\\\n  shufd(&t1, &x1, 0x93);\\\n  shufd(&t2, &x2, 0x93);\\\n  shufd(&t3, &x3, 0x93);\\\n  shufd(&t4, &x4, 0x93);\\\n  shufd(&t5, &x5, 0x93);\\\n  shufd(&t6, &x6, 0x93);\\\n  shufd(&t7, &x7, 0x93);\\\n        ;\\\n        xor2(&x0, &t0);\\\n        xor2(&x1, &t1);\\\n        xor2(&x2, &t2);\\\n        xor2(&x3, &t3);\\\n        xor2(&x4, &t4);\\\n        xor2(&x5, &t5);\\\n        xor2(&x6, &t6);\\\n        xor2(&x7, &t7);\\\n        ;\\\n        xor2(&t0, &x7);\\\n        xor2(&t1, &x0);\\\n        xor2(&t2, &x1);\\\n        xor2(&t1, &x7);\\\n        xor2(&t3, &x2);\\\n        xor2(&t4, &x3);\\\n        xor2(&t5, &x4);\\\n        xor2(&t3, &x7);\\\n        xor2(&t6, &x5);\\\n        xor2(&t7, &x6);\\\n        xor2(&t4, &x7);\\\n        ;\\\n  shufd(&x0, &x0, 0x4e);\\\n  shufd(&x1, &x1, 0x4e);\\\n  shufd(&x2, &x2, 0x4e);\\\n  shufd(&x3, &x3, 0x4e);\\\n  shufd(&x4, &x4, 0x4e);\\\n  shufd(&x5, &x5, 0x4e);\\\n  shufd(&x6, &x6, 0x4e);\\\n  shufd(&x7, &x7, 0x4e);\\\n        ;\\\n        xor2(&t0, &x0);\\\n        xor2(&t1, &x1);\\\n        xor2(&t2, &x2);\\\n        xor2(&t3, &x3);\\\n        xor2(&t4, &x4);\\\n        xor2(&t5, &x5);\\\n        xor2(&t6, &x6);\\\n        xor2(&t7, &x7);\\\n\n\n#define aesround(i, b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, t6, t7, bskey) \\\n        shiftrows(b0, b1, b2, b3, b4, b5, b6, b7, i, SR, bskey);\\\n        sbox(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, t6, t7);\\\n        mixcolumns(b0, b1, b4, b6, b3, b7, b2, b5, t0, t1, t2, t3, t4, t5, t6, t7);\\\n\n\n#define lastround(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, t6, t7, bskey) \\\n        shiftrows(b0, b1, b2, b3, b4, b5, b6, b7, 10, SRM0, bskey);\\\n        sbox(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, t4, t5, t6, t7);\\\n        xor2(&b0,(const int128 *)(bskey + 128*10));\\\n        xor2(&b1,(const int128 *)(bskey + 128*10+16));\\\n        xor2(&b4,(const int128 *)(bskey + 128*10+32));\\\n        xor2(&b6,(const int128 *)(bskey + 128*10+48));\\\n        xor2(&b3,(const int128 *)(bskey + 128*10+64));\\\n        xor2(&b7,(const int128 *)(bskey + 128*10+80));\\\n        xor2(&b2,(const int128 *)(bskey + 128*10+96));\\\n        xor2(&b5,(const int128 *)(bskey + 128*10+112));\\\n\n\n#define sbox(b0, b1, b2, b3, b4, b5, b6, b7, t0, t1, t2, t3, s0, s1, s2, s3) \\\n        InBasisChange(b0, b1, b2, b3, b4, b5, b6, b7); \\\n        Inv_GF256(b6, b5, b0, b3, b7, b1, b4, b2, t0, t1, t2, t3, s0, s1, s2, s3); \\\n        OutBasisChange(b7, b1, b4, b2, b6, b5, b0, b3); \\\n\n\n#define InBasisChange(b0, b1, b2, b3, b4, b5, b6, b7) \\\n        xor2(&b5, &b6);\\\n        xor2(&b2, &b1);\\\n        xor2(&b5, &b0);\\\n        xor2(&b6, &b2);\\\n        xor2(&b3, &b0);\\\n        ;\\\n        xor2(&b6, &b3);\\\n        xor2(&b3, &b7);\\\n        xor2(&b3, &b4);\\\n        xor2(&b7, &b5);\\\n        xor2(&b3, &b1);\\\n        ;\\\n        xor2(&b4, &b5);\\\n        xor2(&b2, &b7);\\\n        xor2(&b1, &b5);\\\n\n#define OutBasisChange(b0, b1, b2, b3, b4, b5, b6, b7) \\\n        xor2(&b0, &b6);\\\n        xor2(&b1, &b4);\\\n        xor2(&b2, &b0);\\\n        xor2(&b4, &b6);\\\n        xor2(&b6, &b1);\\\n        ;\\\n        xor2(&b1, &b5);\\\n        xor2(&b5, &b3);\\\n        xor2(&b2, &b5);\\\n        xor2(&b3, &b7);\\\n        xor2(&b7, &b5);\\\n        ;\\\n        xor2(&b4, &b7);\\\n\n#define Mul_GF4(x0, x1, y0, y1, t0) \\\n        copy2(&t0, &y0);\\\n        xor2(&t0, &y1);\\\n        and2(&t0, &x0);\\\n        xor2(&x0, &x1);\\\n        and2(&x0, &y1);\\\n        and2(&x1, &y0);\\\n        xor2(&x0, &x1);\\\n        xor2(&x1, &t0);\\\n\n#define Mul_GF4_N(x0, x1, y0, y1, t0) \\\n        copy2(&t0, &y0);\\\n        xor2(&t0, &y1);\\\n        and2(&t0, &x0);\\\n        xor2(&x0, &x1);\\\n        and2(&x0, &y1);\\\n        and2(&x1, &y0);\\\n        xor2(&x1, &x0);\\\n        xor2(&x0, &t0);\\\n\n#define Mul_GF4_2(x0, x1, x2, x3, y0, y1, t0, t1) \\\n        copy2(&t0, = y0);\\\n        xor2(&t0, &y1);\\\n        copy2(&t1, &t0);\\\n        and2(&t0, &x0);\\\n        and2(&t1, &x2);\\\n        xor2(&x0, &x1);\\\n        xor2(&x2, &x3);\\\n        and2(&x0, &y1);\\\n        and2(&x2, &y1);\\\n        and2(&x1, &y0);\\\n        and2(&x3, &y0);\\\n        xor2(&x0, &x1);\\\n        xor2(&x2, &x3);\\\n        xor2(&x1, &t0);\\\n        xor2(&x3, &t1);\\\n\n#define Mul_GF16(x0, x1, x2, x3, y0, y1, y2, y3, t0, t1, t2, t3) \\\n        copy2(&t0, &x0);\\\n        copy2(&t1, &x1);\\\n        Mul_GF4(x0, x1, y0, y1, t2);\\\n        xor2(&t0, &x2);\\\n        xor2(&t1, &x3);\\\n        xor2(&y0, &y2);\\\n        xor2(&y1, &y3);\\\n        Mul_GF4_N(t0, t1, y0, y1, t2);\\\n        Mul_GF4(x2, x3, y2, y3, t3);\\\n        ;\\\n        xor2(&x0, &t0);\\\n        xor2(&x2, &t0);\\\n        xor2(&x1, &t1);\\\n        xor2(&x3, &t1);\\\n\n#define Mul_GF16_2(x0, x1, x2, x3, x4, x5, x6, x7, y0, y1, y2, y3, t0, t1, t2, t3) \\\n        copy2(&t0, &x0);\\\n        copy2(&t1, &x1);\\\n        Mul_GF4(x0, x1, y0, y1, t2);\\\n        xor2(&t0, &x2);\\\n        xor2(&t1, &x3);\\\n        xor2(&y0, &y2);\\\n        xor2(&y1, &y3);\\\n        Mul_GF4_N(t0, t1, y0, y1, t3);\\\n        Mul_GF4(x2, x3, y2, y3, t2);\\\n        ;\\\n        xor2(&x0, &t0);\\\n        xor2(&x2, &t0);\\\n        xor2(&x1, &t1);\\\n        xor2(&x3, &t1);\\\n        ;\\\n        copy2(&t0, &x4);\\\n        copy2(&t1, &x5);\\\n        xor2(&t0, &x6);\\\n        xor2(&t1, &x7);\\\n        Mul_GF4_N(t0, t1, y0, y1, t3);\\\n        Mul_GF4(x6, x7, y2, y3, t2);\\\n        xor2(&y0, &y2);\\\n        xor2(&y1, &y3);\\\n        Mul_GF4(x4, x5, y0, y1, t3);\\\n        ;\\\n        xor2(&x4, &t0);\\\n        xor2(&x6, &t0);\\\n        xor2(&x5, &t1);\\\n        xor2(&x7, &t1);\\\n\n#define Inv_GF16(x0, x1, x2, x3, t0, t1, t2, t3) \\\n        copy2(&t0, &x1);\\\n        copy2(&t1, &x0);\\\n        and2(&t0, &x3);\\\n        or2(&t1, &x2);\\\n        copy2(&t2, &x1);\\\n        copy2(&t3, &x0);\\\n        or2(&t2, &x2);\\\n        or2(&t3, &x3);\\\n        xor2(&t2, &t3);\\\n        ;\\\n        xor2(&t0, &t2);\\\n        xor2(&t1, &t2);\\\n        ;\\\n        Mul_GF4_2(x0, x1, x2, x3, t1, t0, t2, t3);\\\n\n\n#define Inv_GF256(x0,  x1, x2, x3, x4, x5, x6, x7, t0, t1, t2, t3, s0, s1, s2, s3) \\\n        copy2(&t3, &x4);\\\n        copy2(&t2, &x5);\\\n        copy2(&t1, &x1);\\\n        copy2(&s1, &x7);\\\n        copy2(&s0, &x0);\\\n        ;\\\n        xor2(&t3, &x6);\\\n        xor2(&t2, &x7);\\\n        xor2(&t1, &x3);\\\n        xor2(&s1, &x6);\\\n        xor2(&s0, &x2);\\\n        ;\\\n        copy2(&s2, &t3);\\\n        copy2(&t0, &t2);\\\n        copy2(&s3, &t3);\\\n        ;\\\n        or2(&t2, &t1);\\\n        or2(&t3, &s0);\\\n        xor2(&s3, &t0);\\\n        and2(&s2, &s0);\\\n        and2(&t0, &t1);\\\n        xor2(&s0, &t1);\\\n        and2(&s3, &s0);\\\n        copy2(&s0, &x3);\\\n        xor2(&s0, &x2);\\\n        and2(&s1, &s0);\\\n        xor2(&t3, &s1);\\\n        xor2(&t2, &s1);\\\n        copy2(&s1, &x4);\\\n        xor2(&s1, &x5);\\\n        copy2(&s0, &x1);\\\n        copy2(&t1, &s1);\\\n        xor2(&s0, &x0);\\\n        or2(&t1, &s0);\\\n        and2(&s1, &s0);\\\n        xor2(&t0, &s1);\\\n        xor2(&t3, &s3);\\\n        xor2(&t2, &s2);\\\n        xor2(&t1, &s3);\\\n        xor2(&t0, &s2);\\\n        xor2(&t1, &s2);\\\n        copy2(&s0, &x7);\\\n        copy2(&s1, &x6);\\\n        copy2(&s2, &x5);\\\n        copy2(&s3, &x4);\\\n        and2(&s0, &x3);\\\n        and2(&s1, &x2);\\\n        and2(&s2, &x1);\\\n        or2(&s3, &x0);\\\n        xor2(&t3, &s0);\\\n        xor2(&t2, &s1);\\\n        xor2(&t1, &s2);\\\n        xor2(&t0, &s3);\\\n  ;\\\n  copy2(&s0, &t3);\\\n  xor2(&s0, &t2);\\\n  and2(&t3, &t1);\\\n  copy2(&s2, &t0);\\\n  xor2(&s2, &t3);\\\n  copy2(&s3, &s0);\\\n  and2(&s3, &s2);\\\n  xor2(&s3, &t2);\\\n  copy2(&s1, &t1);\\\n  xor2(&s1, &t0);\\\n  xor2(&t3, &t2);\\\n  and2(&s1, &t3);\\\n  xor2(&s1, &t0);\\\n  xor2(&t1, &s1);\\\n  copy2(&t2, &s2);\\\n  xor2(&t2, &s1);\\\n  and2(&t2, &t0);\\\n  xor2(&t1, &t2);\\\n  xor2(&s2, &t2);\\\n  and2(&s2, &s3);\\\n  xor2(&s2, &s0);\\\n  ;\\\n  Mul_GF16_2(x0, x1, x2, x3, x4, x5, x6, x7, s3, s2, s1, t1, s0, t0, t2, t3);\\\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/aes128ctr/portable/common_aes128ctr.c",
    "content": "#include \"common.h\"\n\nuint32 load32_bigendian(const unsigned char *x)\n{\n  return\n      (uint32) (x[3]) \\\n  | (((uint32) (x[2])) << 8) \\\n  | (((uint32) (x[1])) << 16) \\\n  | (((uint32) (x[0])) << 24)\n  ;\n}\n\nvoid store32_bigendian(unsigned char *x,uint32 u)\n{\n  x[3] = u; u >>= 8;\n  x[2] = u; u >>= 8;\n  x[1] = u; u >>= 8;\n  x[0] = u;\n}\n\nuint32 load32_littleendian(const unsigned char *x)\n{\n  return\n      (uint32) (x[0]) \\\n  | (((uint32) (x[1])) << 8) \\\n  | (((uint32) (x[2])) << 16) \\\n  | (((uint32) (x[3])) << 24)\n  ;\n}\n\nvoid store32_littleendian(unsigned char *x,uint32 u)\n{\n  x[0] = u; u >>= 8;\n  x[1] = u; u >>= 8;\n  x[2] = u; u >>= 8;\n  x[3] = u;\n}\n\n\nuint64 load64_littleendian(const unsigned char *x)\n{\n  return\n      (uint64) (x[0]) \\\n  | (((uint64) (x[1])) << 8) \\\n  | (((uint64) (x[2])) << 16) \\\n  | (((uint64) (x[3])) << 24)\n  | (((uint64) (x[4])) << 32)\n  | (((uint64) (x[5])) << 40)\n  | (((uint64) (x[6])) << 48)\n  | (((uint64) (x[7])) << 56)\n  ;\n}\n\nvoid store64_littleendian(unsigned char *x,uint64 u)\n{\n  x[0] = u; u >>= 8;\n  x[1] = u; u >>= 8;\n  x[2] = u; u >>= 8;\n  x[3] = u; u >>= 8;\n  x[4] = u; u >>= 8;\n  x[5] = u; u >>= 8;\n  x[6] = u; u >>= 8;\n  x[7] = u;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/aes128ctr/portable/consts.h",
    "content": "#ifndef CONSTS_H\n#define CONSTS_H\n\n#include \"int128.h\"\n\n#define ROTB crypto_stream_aes128ctr_portable_ROTB\n#define M0 crypto_stream_aes128ctr_portable_M0\n#define EXPB0 crypto_stream_aes128ctr_portable_EXPB0\n#define SWAP32 crypto_stream_aes128ctr_portable_SWAP32\n#define M0SWAP crypto_stream_aes128ctr_portable_M0SWAP\n#define SR crypto_stream_aes128ctr_portable_SR\n#define SRM0 crypto_stream_aes128ctr_portable_SRM0\n#define BS0 crypto_stream_aes128ctr_portable_BS0\n#define BS1 crypto_stream_aes128ctr_portable_BS1\n#define BS2 crypto_stream_aes128ctr_portable_BS2\n\nextern const unsigned char ROTB[16];\nextern const unsigned char M0[16];\nextern const unsigned char EXPB0[16];\nextern const unsigned char SWAP32[16];\nextern const unsigned char M0SWAP[16];\nextern const unsigned char SR[16];\nextern const unsigned char SRM0[16];\nextern const int128 BS0;\nextern const int128 BS1;\nextern const int128 BS2;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/aes128ctr/portable/consts_aes128ctr.c",
    "content": "#include \"consts.h\"\n\nconst unsigned char ROTB[16] = {0x00, 0x00, 0x00, 0x0c, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x08};\nconst unsigned char M0[16]   = {0x0f, 0x0b, 0x07, 0x03, 0x0e, 0x0a, 0x06, 0x02, 0x0d, 0x09, 0x05, 0x01, 0x0c, 0x08, 0x04, 0x00};\nconst unsigned char EXPB0[16] = {0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07, 0x0b, 0x0b, 0x0b, 0x0b, 0x0f, 0x0f, 0x0f, 0x0f};\n\nconst unsigned char SWAP32[16] = {0x03, 0x02, 0x01, 0x00, 0x07, 0x06, 0x05, 0x04, 0x0b, 0x0a, 0x09, 0x08, 0x0f, 0x0e, 0x0d, 0x0c};\nconst unsigned char M0SWAP[16] = {0x0c, 0x08, 0x04, 0x00, 0x0d, 0x09, 0x05, 0x01, 0x0e, 0x0a, 0x06, 0x02, 0x0f, 0x0b, 0x07, 0x03};\nconst unsigned char SR[16] = {0x01, 0x02, 0x03, 0x00, 0x06, 0x07, 0x04, 0x05, 0x0b, 0x08, 0x09, 0x0a, 0x0c, 0x0d, 0x0e, 0x0f};\nconst unsigned char SRM0[16] = {0x0f, 0x0a, 0x05, 0x00, 0x0e, 0x09, 0x04, 0x03, 0x0d, 0x08, 0x07, 0x02, 0x0c, 0x0b, 0x06, 0x01};\n\nconst int128 BS0 = {{0x5555555555555555ULL, 0x5555555555555555ULL}};\nconst int128 BS1 = {{0x3333333333333333ULL, 0x3333333333333333ULL}};\nconst int128 BS2 = {{0x0f0f0f0f0f0f0f0fULL, 0x0f0f0f0f0f0f0f0fULL}};\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/aes128ctr/portable/int128.h",
    "content": "#ifndef INT128_H\n#define INT128_H\n\n#include <stdint.h>\n\n#include \"common.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\n#endif\n\ntypedef union {\n  uint64_t u64[2];\n  uint32_t u32[4];\n  uint8_t  u8[16];\n} int128;\n\n#define xor2 crypto_stream_aes128ctr_portable_xor2\nvoid xor2(int128 *r, const int128 *x);\n\n#define and2 crypto_stream_aes128ctr_portable_and2\nvoid and2(int128 *r, const int128 *x);\n\n#define or2 crypto_stream_aes128ctr_portable_or2\nvoid or2(int128 *r, const int128 *x);\n\n#define copy2 crypto_stream_aes128ctr_portable_copy2\nvoid copy2(int128 *r, const int128 *x);\n\n#define shufb crypto_stream_aes128ctr_portable_shufb\nvoid shufb(int128 *r, const unsigned char *l);\n\n#define shufd crypto_stream_aes128ctr_portable_shufd\nvoid shufd(int128 *r, const int128 *x, const unsigned int c);\n\n#define rshift32_littleendian crypto_stream_aes128ctr_portable_rshift32_littleendian\nvoid rshift32_littleendian(int128 *r, const unsigned int n);\n\n#define rshift64_littleendian crypto_stream_aes128ctr_portable_rshift64_littleendian\nvoid rshift64_littleendian(int128 *r, const unsigned int n);\n\n#define lshift64_littleendian crypto_stream_aes128ctr_portable_lshift64_littleendian\nvoid lshift64_littleendian(int128 *r, const unsigned int n);\n\n#define toggle crypto_stream_aes128ctr_portable_toggle\nvoid toggle(int128 *r);\n\n#define xor_rcon crypto_stream_aes128ctr_portable_xor_rcon\nvoid xor_rcon(int128 *r);\n\n#define add_uint32_big crypto_stream_aes128ctr_portable_add_uint32_big\nvoid add_uint32_big(int128 *r, uint32 x);\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/aes128ctr/portable/int128_aes128ctr.c",
    "content": "\n#include \"int128.h\"\n#include \"common.h\"\n\nvoid xor2(int128 *r, const int128 *x)\n{\n  r->u64[0] ^= x->u64[0];\n  r->u64[1] ^= x->u64[1];\n}\n\nvoid and2(int128 *r, const int128 *x)\n{\n  r->u64[0] &= x->u64[0];\n  r->u64[1] &= x->u64[1];\n}\n\nvoid or2(int128 *r, const int128 *x)\n{\n  r->u64[0] |= x->u64[0];\n  r->u64[1] |= x->u64[1];\n}\n\nvoid copy2(int128 *r, const int128 *x)\n{\n  r->u64[0] = x->u64[0];\n  r->u64[1] = x->u64[1];\n}\n\nvoid shufb(int128 *r, const unsigned char *l)\n{\n  int128   t;\n  uint8_t *ct;\n  uint8_t *cr;\n\n  copy2(&t, r);\n  cr = r->u8;\n  ct = t.u8;\n  cr[0] = ct[l[0]];\n  cr[1] = ct[l[1]];\n  cr[2] = ct[l[2]];\n  cr[3] = ct[l[3]];\n  cr[4] = ct[l[4]];\n  cr[5] = ct[l[5]];\n  cr[6] = ct[l[6]];\n  cr[7] = ct[l[7]];\n  cr[8] = ct[l[8]];\n  cr[9] = ct[l[9]];\n  cr[10] = ct[l[10]];\n  cr[11] = ct[l[11]];\n  cr[12] = ct[l[12]];\n  cr[13] = ct[l[13]];\n  cr[14] = ct[l[14]];\n  cr[15] = ct[l[15]];\n}\n\nvoid shufd(int128 *r, const int128 *x, const unsigned int c)\n{\n  int128 t;\n\n  t.u32[0] = x->u32[c >> 0 & 3];\n  t.u32[1] = x->u32[c >> 2 & 3];\n  t.u32[2] = x->u32[c >> 4 & 3];\n  t.u32[3] = x->u32[c >> 6 & 3];\n  copy2(r, &t);\n}\n\nvoid rshift32_littleendian(int128 *r, const unsigned int n)\n{\n  unsigned char *rp = (unsigned char *)r;\n  uint32 t;\n  t = load32_littleendian(rp);\n  t >>= n;\n  store32_littleendian(rp, t);\n  t = load32_littleendian(rp+4);\n  t >>= n;\n  store32_littleendian(rp+4, t);\n  t = load32_littleendian(rp+8);\n  t >>= n;\n  store32_littleendian(rp+8, t);\n  t = load32_littleendian(rp+12);\n  t >>= n;\n  store32_littleendian(rp+12, t);\n}\n\nvoid rshift64_littleendian(int128 *r, const unsigned int n)\n{\n  unsigned char *rp = (unsigned char *)r;\n  uint64 t;\n  t = load64_littleendian(rp);\n  t >>= n;\n  store64_littleendian(rp, t);\n  t = load64_littleendian(rp+8);\n  t >>= n;\n  store64_littleendian(rp+8, t);\n}\n\nvoid lshift64_littleendian(int128 *r, const unsigned int n)\n{\n  unsigned char *rp = (unsigned char *)r;\n  uint64 t;\n  t = load64_littleendian(rp);\n  t <<= n;\n  store64_littleendian(rp, t);\n  t = load64_littleendian(rp+8);\n  t <<= n;\n  store64_littleendian(rp+8, t);\n}\n\nvoid toggle(int128 *r)\n{\n  r->u64[0] ^= 0xffffffffffffffffULL;\n  r->u64[1] ^= 0xffffffffffffffffULL;\n}\n\nvoid xor_rcon(int128 *r)\n{\n  unsigned char *rp = (unsigned char *)r;\n  uint32 t;\n  t = load32_littleendian(rp+12);\n  t ^= 0xffffffff;\n  store32_littleendian(rp+12, t);\n}\n\nvoid add_uint32_big(int128 *r, uint32 x)\n{\n  unsigned char *rp = (unsigned char *)r;\n  uint32 t;\n  t = load32_littleendian(rp+12);\n  t += x;\n  store32_littleendian(rp+12, t);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/aes128ctr/portable/stream_aes128ctr.c",
    "content": "\n#include \"crypto_stream_aes128ctr.h\"\n\nint crypto_stream_aes128ctr(\n        unsigned char *out,\n        unsigned long long outlen,\n        const unsigned char *n,\n        const unsigned char *k\n        )\n{\n    unsigned char d[crypto_stream_aes128ctr_BEFORENMBYTES];\n    crypto_stream_aes128ctr_beforenm(d, k);\n    crypto_stream_aes128ctr_afternm(out, outlen, n, d);\n    return 0;\n}\n\nint crypto_stream_aes128ctr_xor(\n        unsigned char *out,\n        const unsigned char *in,\n        unsigned long long inlen,\n        const unsigned char *n,\n        const unsigned char *k\n        )\n{\n    unsigned char d[crypto_stream_aes128ctr_BEFORENMBYTES];\n    crypto_stream_aes128ctr_beforenm(d, k);\n    crypto_stream_aes128ctr_xor_afternm(out, in, inlen, n, d);\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/aes128ctr/portable/types.h",
    "content": "#ifndef TYPES_H\n#define TYPES_H\n\n#include \"crypto_uint32.h\"\ntypedef crypto_uint32 uint32;\n\n#include \"crypto_uint64.h\"\ntypedef crypto_uint64 uint64;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/aes128ctr/portable/xor_afternm_aes128ctr.c",
    "content": "/* Author: Peter Schwabe, ported from an assembly implementation by Emilia Käsper\n * Date: 2009-03-19\n * Public domain */\n\n#include \"crypto_stream_aes128ctr.h\"\n#include \"int128.h\"\n#include \"common.h\"\n#include \"consts.h\"\n\nint crypto_stream_aes128ctr_xor_afternm(unsigned char *out, const unsigned char *in, unsigned long long len, const unsigned char *nonce, const unsigned char *c)\n{\n\n  int128 xmm0;\n  int128 xmm1;\n  int128 xmm2;\n  int128 xmm3;\n  int128 xmm4;\n  int128 xmm5;\n  int128 xmm6;\n  int128 xmm7;\n\n  int128 xmm8;\n  int128 xmm9;\n  int128 xmm10;\n  int128 xmm11;\n  int128 xmm12;\n  int128 xmm13;\n  int128 xmm14;\n  int128 xmm15;\n\n  int128 nonce_stack;\n  unsigned long long lensav;\n  unsigned char bl[128];\n  unsigned char *blp;\n  unsigned char *np;\n  unsigned char b;\n\n  uint32 tmp;\n\n  /* Copy nonce on the stack */\n  copy2(&nonce_stack, (const int128 *) (nonce + 0));\n  np = (unsigned char *)&nonce_stack;\n\n    enc_block:\n\n    xmm0 = *(int128 *) (np + 0);\n    copy2(&xmm1, &xmm0);\n    shufb(&xmm1, SWAP32);\n    copy2(&xmm2, &xmm1);\n    copy2(&xmm3, &xmm1);\n    copy2(&xmm4, &xmm1);\n    copy2(&xmm5, &xmm1);\n    copy2(&xmm6, &xmm1);\n    copy2(&xmm7, &xmm1);\n\n    add_uint32_big(&xmm1, 1);\n    add_uint32_big(&xmm2, 2);\n    add_uint32_big(&xmm3, 3);\n    add_uint32_big(&xmm4, 4);\n    add_uint32_big(&xmm5, 5);\n    add_uint32_big(&xmm6, 6);\n    add_uint32_big(&xmm7, 7);\n\n    shufb(&xmm0, M0);\n    shufb(&xmm1, M0SWAP);\n    shufb(&xmm2, M0SWAP);\n    shufb(&xmm3, M0SWAP);\n    shufb(&xmm4, M0SWAP);\n    shufb(&xmm5, M0SWAP);\n    shufb(&xmm6, M0SWAP);\n    shufb(&xmm7, M0SWAP);\n\n    bitslice(xmm7, xmm6, xmm5, xmm4, xmm3, xmm2, xmm1, xmm0, xmm8)\n\n    aesround( 1, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,c)\n    aesround( 2, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,c)\n    aesround( 3, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,c)\n    aesround( 4, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,c)\n    aesround( 5, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,c)\n    aesround( 6, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,c)\n    aesround( 7, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,c)\n    aesround( 8, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,c)\n    aesround( 9, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7, xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15,c)\n    lastround(xmm8, xmm9, xmm10, xmm11, xmm12, xmm13, xmm14, xmm15, xmm0, xmm1, xmm2, xmm3, xmm4, xmm5, xmm6, xmm7,c)\n\n    bitslice(xmm13, xmm10, xmm15, xmm11, xmm14, xmm12, xmm9, xmm8, xmm0)\n\n    if(len < 128) goto partial;\n    if(len == 128) goto full;\n\n    tmp = load32_bigendian(np + 12);\n    tmp += 8;\n    store32_bigendian(np + 12, tmp);\n\n    xor2(&xmm8, (const int128 *)(in + 0));\n    xor2(&xmm9, (const int128 *)(in + 16));\n    xor2(&xmm12, (const int128 *)(in + 32));\n    xor2(&xmm14, (const int128 *)(in + 48));\n    xor2(&xmm11, (const int128 *)(in + 64));\n    xor2(&xmm15, (const int128 *)(in + 80));\n    xor2(&xmm10, (const int128 *)(in + 96));\n    xor2(&xmm13, (const int128 *)(in + 112));\n\n    *(int128 *) (out + 0) = xmm8;\n    *(int128 *) (out + 16) = xmm9;\n    *(int128 *) (out + 32) = xmm12;\n    *(int128 *) (out + 48) = xmm14;\n    *(int128 *) (out + 64) = xmm11;\n    *(int128 *) (out + 80) = xmm15;\n    *(int128 *) (out + 96) = xmm10;\n    *(int128 *) (out + 112) = xmm13;\n\n    len -= 128;\n    in += 128;\n    out += 128;\n\n    goto enc_block;\n\n    partial:\n\n    lensav = len;\n    len >>= 4;\n\n    tmp = load32_bigendian(np + 12);\n    tmp += len;\n    store32_bigendian(np + 12, tmp);\n\n    blp = bl;\n    *(int128 *)(blp + 0) = xmm8;\n    *(int128 *)(blp + 16) = xmm9;\n    *(int128 *)(blp + 32) = xmm12;\n    *(int128 *)(blp + 48) = xmm14;\n    *(int128 *)(blp + 64) = xmm11;\n    *(int128 *)(blp + 80) = xmm15;\n    *(int128 *)(blp + 96) = xmm10;\n    *(int128 *)(blp + 112) = xmm13;\n\n    bytes:\n\n    if(lensav == 0) goto end;\n\n    b = blp[0]; /* clang false positive */\n    b ^= *(const unsigned char *)(in + 0);\n    *(unsigned char *)(out + 0) = b;\n\n    blp += 1;\n    in +=1;\n    out +=1;\n    lensav -= 1;\n\n    goto bytes;\n\n    full:\n\n    tmp = load32_bigendian(np + 12);\n    tmp += 8;\n    store32_bigendian(np + 12, tmp);\n\n    xor2(&xmm8, (const int128 *)(in + 0));\n    xor2(&xmm9, (const int128 *)(in + 16));\n    xor2(&xmm12, (const int128 *)(in + 32));\n    xor2(&xmm14, (const int128 *)(in + 48));\n    xor2(&xmm11, (const int128 *)(in + 64));\n    xor2(&xmm15, (const int128 *)(in + 80));\n    xor2(&xmm10, (const int128 *)(in + 96));\n    xor2(&xmm13, (const int128 *)(in + 112));\n\n    *(int128 *) (out + 0) = xmm8;\n    *(int128 *) (out + 16) = xmm9;\n    *(int128 *) (out + 32) = xmm12;\n    *(int128 *) (out + 48) = xmm14;\n    *(int128 *) (out + 64) = xmm11;\n    *(int128 *) (out + 80) = xmm15;\n    *(int128 *) (out + 96) = xmm10;\n    *(int128 *) (out + 112) = xmm13;\n\n    end:\n    return 0;\n\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/aes128ctr/stream_aes128ctr_api.c",
    "content": "#include \"crypto_stream_aes128ctr.h\"\n\nsize_t\ncrypto_stream_aes128ctr_keybytes(void) {\n    return crypto_stream_aes128ctr_KEYBYTES;\n}\n\nsize_t\ncrypto_stream_aes128ctr_noncebytes(void) {\n    return crypto_stream_aes128ctr_NONCEBYTES;\n}\n\nsize_t\ncrypto_stream_aes128ctr_beforenmbytes(void) {\n    return crypto_stream_aes128ctr_BEFORENMBYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/chacha20/ref/stream_chacha20_ref.c",
    "content": "\n/*\n chacha-merged.c version 20080118\n D. J. Bernstein\n Public domain.\n */\n\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"utils.h\"\n#include \"crypto_stream_chacha20.h\"\n#include \"stream_chacha20_ref.h\"\n#include \"../stream_chacha20.h\"\n\nstruct chacha_ctx {\n    uint32_t input[16];\n};\n\ntypedef uint8_t  u8;\ntypedef uint32_t u32;\n\ntypedef struct chacha_ctx chacha_ctx;\n\n#define U8C(v) (v##U)\n#define U32C(v) (v##U)\n\n#define U8V(v) ((u8)(v) & U8C(0xFF))\n#define U32V(v) ((u32)(v) & U32C(0xFFFFFFFF))\n\n#define ROTL32(v, n) \\\n  (U32V((v) << (n)) | ((v) >> (32 - (n))))\n\n#define U8TO32_LITTLE(p) \\\n  (((u32)((p)[0])      ) | \\\n   ((u32)((p)[1]) <<  8) | \\\n   ((u32)((p)[2]) << 16) | \\\n   ((u32)((p)[3]) << 24))\n\n#define U32TO8_LITTLE(p, v) \\\n  do { \\\n    (p)[0] = U8V((v)      ); \\\n    (p)[1] = U8V((v) >>  8); \\\n    (p)[2] = U8V((v) >> 16); \\\n    (p)[3] = U8V((v) >> 24); \\\n  } while (0)\n\n#define ROTATE(v,c) (ROTL32(v,c))\n#define XOR(v,w) ((v) ^ (w))\n#define PLUS(v,w) (U32V((v) + (w)))\n#define PLUSONE(v) (PLUS((v),1))\n\n#define QUARTERROUND(a,b,c,d) \\\n  a = PLUS(a,b); d = ROTATE(XOR(d,a),16); \\\n  c = PLUS(c,d); b = ROTATE(XOR(b,c),12); \\\n  a = PLUS(a,b); d = ROTATE(XOR(d,a), 8); \\\n  c = PLUS(c,d); b = ROTATE(XOR(b,c), 7);\n\nstatic const unsigned char sigma[16] = {\n    'e', 'x', 'p', 'a', 'n', 'd', ' ', '3', '2', '-', 'b', 'y', 't', 'e', ' ', 'k'\n};\n\nstatic void\nchacha_keysetup(chacha_ctx *ctx, const u8 *k)\n{\n    const unsigned char *constants;\n\n    ctx->input[4] = U8TO32_LITTLE(k + 0);\n    ctx->input[5] = U8TO32_LITTLE(k + 4);\n    ctx->input[6] = U8TO32_LITTLE(k + 8);\n    ctx->input[7] = U8TO32_LITTLE(k + 12);\n    k += 16;\n    constants = sigma;\n    ctx->input[8] = U8TO32_LITTLE(k + 0);\n    ctx->input[9] = U8TO32_LITTLE(k + 4);\n    ctx->input[10] = U8TO32_LITTLE(k + 8);\n    ctx->input[11] = U8TO32_LITTLE(k + 12);\n    ctx->input[0] = U8TO32_LITTLE(constants + 0);\n    ctx->input[1] = U8TO32_LITTLE(constants + 4);\n    ctx->input[2] = U8TO32_LITTLE(constants + 8);\n    ctx->input[3] = U8TO32_LITTLE(constants + 12);\n}\n\nstatic void\nchacha_ivsetup(chacha_ctx *ctx, const u8 *iv, const u8 *counter)\n{\n    ctx->input[12] = counter == NULL ? 0 : U8TO32_LITTLE(counter + 0);\n    ctx->input[13] = counter == NULL ? 0 : U8TO32_LITTLE(counter + 4);\n    ctx->input[14] = U8TO32_LITTLE(iv + 0);\n    ctx->input[15] = U8TO32_LITTLE(iv + 4);\n}\n\nstatic void\nchacha_ietf_ivsetup(chacha_ctx *ctx, const u8 *iv, const u8 *counter)\n{\n    ctx->input[12] = counter == NULL ? 0 : U8TO32_LITTLE(counter);\n    ctx->input[13] = U8TO32_LITTLE(iv + 0);\n    ctx->input[14] = U8TO32_LITTLE(iv + 4);\n    ctx->input[15] = U8TO32_LITTLE(iv + 8);\n}\n\nstatic void\nchacha_encrypt_bytes(chacha_ctx *ctx, const u8 *m, u8 *c, unsigned long long bytes)\n{\n    u32 x0, x1, x2, x3, x4, x5, x6, x7, x8, x9, x10, x11, x12, x13, x14, x15;\n    u32 j0, j1, j2, j3, j4, j5, j6, j7, j8, j9, j10, j11, j12, j13, j14, j15;\n    u8 *ctarget = NULL;\n    u8 tmp[64];\n    unsigned int i;\n\n    if (!bytes) {\n        return; /* LCOV_EXCL_LINE */\n    }\n    if (bytes > 64ULL * (1ULL << 32) - 64ULL) {\n        abort();\n    }\n    j0 = ctx->input[0];\n    j1 = ctx->input[1];\n    j2 = ctx->input[2];\n    j3 = ctx->input[3];\n    j4 = ctx->input[4];\n    j5 = ctx->input[5];\n    j6 = ctx->input[6];\n    j7 = ctx->input[7];\n    j8 = ctx->input[8];\n    j9 = ctx->input[9];\n    j10 = ctx->input[10];\n    j11 = ctx->input[11];\n    j12 = ctx->input[12];\n    j13 = ctx->input[13];\n    j14 = ctx->input[14];\n    j15 = ctx->input[15];\n\n    for (;;) {\n        if (bytes < 64) {\n            memset(tmp, 0, 64);\n            for (i = 0; i < bytes; ++i) {\n                tmp[i] = m[i];\n            }\n            m = tmp;\n            ctarget = c;\n            c = tmp;\n        }\n        x0 = j0;\n        x1 = j1;\n        x2 = j2;\n        x3 = j3;\n        x4 = j4;\n        x5 = j5;\n        x6 = j6;\n        x7 = j7;\n        x8 = j8;\n        x9 = j9;\n        x10 = j10;\n        x11 = j11;\n        x12 = j12;\n        x13 = j13;\n        x14 = j14;\n        x15 = j15;\n        for (i = 20; i > 0; i -= 2) {\n            QUARTERROUND(x0, x4, x8, x12)\n            QUARTERROUND(x1, x5, x9, x13)\n            QUARTERROUND(x2, x6, x10, x14)\n            QUARTERROUND(x3, x7, x11, x15)\n            QUARTERROUND(x0, x5, x10, x15)\n            QUARTERROUND(x1, x6, x11, x12)\n            QUARTERROUND(x2, x7, x8, x13)\n            QUARTERROUND(x3, x4, x9, x14)\n        }\n        x0 = PLUS(x0, j0);\n        x1 = PLUS(x1, j1);\n        x2 = PLUS(x2, j2);\n        x3 = PLUS(x3, j3);\n        x4 = PLUS(x4, j4);\n        x5 = PLUS(x5, j5);\n        x6 = PLUS(x6, j6);\n        x7 = PLUS(x7, j7);\n        x8 = PLUS(x8, j8);\n        x9 = PLUS(x9, j9);\n        x10 = PLUS(x10, j10);\n        x11 = PLUS(x11, j11);\n        x12 = PLUS(x12, j12);\n        x13 = PLUS(x13, j13);\n        x14 = PLUS(x14, j14);\n        x15 = PLUS(x15, j15);\n\n        x0 = XOR(x0, U8TO32_LITTLE(m + 0));\n        x1 = XOR(x1, U8TO32_LITTLE(m + 4));\n        x2 = XOR(x2, U8TO32_LITTLE(m + 8));\n        x3 = XOR(x3, U8TO32_LITTLE(m + 12));\n        x4 = XOR(x4, U8TO32_LITTLE(m + 16));\n        x5 = XOR(x5, U8TO32_LITTLE(m + 20));\n        x6 = XOR(x6, U8TO32_LITTLE(m + 24));\n        x7 = XOR(x7, U8TO32_LITTLE(m + 28));\n        x8 = XOR(x8, U8TO32_LITTLE(m + 32));\n        x9 = XOR(x9, U8TO32_LITTLE(m + 36));\n        x10 = XOR(x10, U8TO32_LITTLE(m + 40));\n        x11 = XOR(x11, U8TO32_LITTLE(m + 44));\n        x12 = XOR(x12, U8TO32_LITTLE(m + 48));\n        x13 = XOR(x13, U8TO32_LITTLE(m + 52));\n        x14 = XOR(x14, U8TO32_LITTLE(m + 56));\n        x15 = XOR(x15, U8TO32_LITTLE(m + 60));\n\n        j12 = PLUSONE(j12);\n        /* LCOV_EXCL_START */\n        if (!j12) {\n            j13 = PLUSONE(j13);\n        }\n        /* LCOV_EXCL_STOP */\n\n        U32TO8_LITTLE(c + 0, x0);\n        U32TO8_LITTLE(c + 4, x1);\n        U32TO8_LITTLE(c + 8, x2);\n        U32TO8_LITTLE(c + 12, x3);\n        U32TO8_LITTLE(c + 16, x4);\n        U32TO8_LITTLE(c + 20, x5);\n        U32TO8_LITTLE(c + 24, x6);\n        U32TO8_LITTLE(c + 28, x7);\n        U32TO8_LITTLE(c + 32, x8);\n        U32TO8_LITTLE(c + 36, x9);\n        U32TO8_LITTLE(c + 40, x10);\n        U32TO8_LITTLE(c + 44, x11);\n        U32TO8_LITTLE(c + 48, x12);\n        U32TO8_LITTLE(c + 52, x13);\n        U32TO8_LITTLE(c + 56, x14);\n        U32TO8_LITTLE(c + 60, x15);\n\n        if (bytes <= 64) {\n            if (bytes < 64) {\n                for (i = 0; i < (unsigned int) bytes; ++i) {\n                    ctarget[i] = c[i];\n                }\n            }\n            ctx->input[12] = j12;\n            ctx->input[13] = j13;\n            return;\n        }\n        bytes -= 64;\n        c += 64;\n        m += 64;\n    }\n}\n\nstatic int\nstream_ref(unsigned char *c, unsigned long long clen,\n           const unsigned char *n, const unsigned char *k)\n{\n    struct chacha_ctx ctx;\n\n    if (!clen) {\n        return 0;\n    }\n    (void) sizeof(int[crypto_stream_chacha20_KEYBYTES == 256 / 8 ? 1 : -1]);\n    chacha_keysetup(&ctx, k);\n    chacha_ivsetup(&ctx, n, NULL);\n    memset(c, 0, clen);\n    chacha_encrypt_bytes(&ctx, c, c, clen);\n    sodium_memzero(&ctx, sizeof ctx);\n\n    return 0;\n}\n\nstatic int\nstream_ietf_ref(unsigned char *c, unsigned long long clen,\n                const unsigned char *n, const unsigned char *k)\n{\n    struct chacha_ctx ctx;\n\n    if (!clen) {\n        return 0;\n    }\n    (void) sizeof(int[crypto_stream_chacha20_KEYBYTES == 256 / 8 ? 1 : -1]);\n    chacha_keysetup(&ctx, k);\n    chacha_ietf_ivsetup(&ctx, n, NULL);\n    memset(c, 0, clen);\n    chacha_encrypt_bytes(&ctx, c, c, clen);\n    sodium_memzero(&ctx, sizeof ctx);\n\n    return 0;\n}\n\nstatic int\nstream_ref_xor_ic(unsigned char *c, const unsigned char *m,\n                  unsigned long long mlen,\n                  const unsigned char *n, uint64_t ic,\n                  const unsigned char *k)\n{\n    struct chacha_ctx ctx;\n    uint8_t           ic_bytes[8];\n    uint32_t          ic_high;\n    uint32_t          ic_low;\n\n    if (!mlen) {\n        return 0;\n    }\n    ic_high = U32V(ic >> 32);\n    ic_low = U32V(ic);\n    U32TO8_LITTLE(&ic_bytes[0], ic_low);\n    U32TO8_LITTLE(&ic_bytes[4], ic_high);\n    chacha_keysetup(&ctx, k);\n    chacha_ivsetup(&ctx, n, ic_bytes);\n    chacha_encrypt_bytes(&ctx, m, c, mlen);\n    sodium_memzero(&ctx, sizeof ctx);\n\n    return 0;\n}\n\nstatic int\nstream_ietf_ref_xor_ic(unsigned char *c, const unsigned char *m,\n                       unsigned long long mlen,\n                       const unsigned char *n, uint32_t ic,\n                       const unsigned char *k)\n{\n    struct chacha_ctx ctx;\n    uint8_t           ic_bytes[4];\n\n    if (!mlen) {\n        return 0;\n    }\n    U32TO8_LITTLE(ic_bytes, ic);\n    chacha_keysetup(&ctx, k);\n    chacha_ietf_ivsetup(&ctx, n, ic_bytes);\n    chacha_encrypt_bytes(&ctx, m, c, mlen);\n    sodium_memzero(&ctx, sizeof ctx);\n\n    return 0;\n}\n\nstruct crypto_stream_chacha20_implementation\ncrypto_stream_chacha20_ref_implementation = {\n    SODIUM_C99(.stream =) stream_ref,\n    SODIUM_C99(.stream_ietf =) stream_ietf_ref,\n    SODIUM_C99(.stream_xor_ic =) stream_ref_xor_ic,\n    SODIUM_C99(.stream_ietf_xor_ic =) stream_ietf_ref_xor_ic\n};\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/chacha20/ref/stream_chacha20_ref.h",
    "content": "\n#include <stdint.h>\n\n#include \"crypto_stream_chacha20.h\"\n\nextern struct crypto_stream_chacha20_implementation\n    crypto_stream_chacha20_ref_implementation;\n\nint\ncrypto_stream_chacha20_ref(unsigned char *c, unsigned long long clen,\n                           const unsigned char *n, const unsigned char *k);\n\nint\ncrypto_stream_chacha20_ref_xor_ic(unsigned char *c, const unsigned char *m,\n                                  unsigned long long mlen,\n                                  const unsigned char *n, uint64_t ic,\n                                  const unsigned char *k);\n\nint\ncrypto_stream_chacha20_ietf_ref(unsigned char *c, unsigned long long clen,\n                                const unsigned char *n, const unsigned char *k);\n\nint\ncrypto_stream_chacha20_ietf_ref_xor_ic(unsigned char *c, const unsigned char *m,\n                                       unsigned long long mlen,\n                                       const unsigned char *n, uint32_t ic,\n                                       const unsigned char *k);\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/chacha20/stream_chacha20.c",
    "content": "#include \"crypto_stream_chacha20.h\"\n#include \"stream_chacha20.h\"\n#include \"runtime.h\"\n#include \"ref/stream_chacha20_ref.h\"\n#if (defined(HAVE_EMMINTRIN_H) && defined(HAVE_TMMINTRIN_H) && defined(__GNUC__))\n# include \"vec/stream_chacha20_vec.h\"\n#endif\n\nstatic const crypto_stream_chacha20_implementation *implementation =\n    &crypto_stream_chacha20_ref_implementation;\n\nsize_t\ncrypto_stream_chacha20_keybytes(void) {\n    return crypto_stream_chacha20_KEYBYTES;\n}\n\nsize_t\ncrypto_stream_chacha20_noncebytes(void) {\n    return crypto_stream_chacha20_NONCEBYTES;\n}\n\nsize_t\ncrypto_stream_chacha20_ietf_noncebytes(void) {\n    return crypto_stream_chacha20_IETF_NONCEBYTES;\n}\n\nint\ncrypto_stream_chacha20(unsigned char *c, unsigned long long clen,\n                       const unsigned char *n, const unsigned char *k)\n{\n    return implementation->stream(c, clen, n, k);\n}\n\nint\ncrypto_stream_chacha20_ietf(unsigned char *c, unsigned long long clen,\n                            const unsigned char *n, const unsigned char *k)\n{\n    return implementation->stream_ietf(c, clen, n, k);\n}\n\nint\ncrypto_stream_chacha20_xor_ic(unsigned char *c, const unsigned char *m,\n                              unsigned long long mlen,\n                              const unsigned char *n, uint64_t ic,\n                              const unsigned char *k)\n{\n    return implementation->stream_xor_ic(c, m, mlen, n, ic, k);\n}\n\nint\ncrypto_stream_chacha20_ietf_xor_ic(unsigned char *c, const unsigned char *m,\n                                   unsigned long long mlen,\n                                   const unsigned char *n, uint32_t ic,\n                                   const unsigned char *k)\n{\n    return implementation->stream_ietf_xor_ic(c, m, mlen, n, ic, k);\n}\n\nint\ncrypto_stream_chacha20_xor(unsigned char *c, const unsigned char *m,\n                           unsigned long long mlen, const unsigned char *n,\n                           const unsigned char *k)\n{\n    return implementation->stream_xor_ic(c, m, mlen, n, 0U, k);\n}\n\nint\ncrypto_stream_chacha20_ietf_xor(unsigned char *c, const unsigned char *m,\n                                unsigned long long mlen, const unsigned char *n,\n                                const unsigned char *k)\n{\n    return implementation->stream_ietf_xor_ic(c, m, mlen, n, 0U, k);\n}\n\nint\n_crypto_stream_chacha20_pick_best_implementation(void)\n{\n    implementation = &crypto_stream_chacha20_ref_implementation;\n#if (defined(HAVE_EMMINTRIN_H) && defined(HAVE_TMMINTRIN_H) && defined(__GNUC__))\n    if (sodium_runtime_has_ssse3()) {\n        implementation = &crypto_stream_chacha20_vec_implementation;\n    }\n#endif\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/chacha20/stream_chacha20.h",
    "content": "\n#ifndef stream_chacha20_H\n#define stream_chacha20_H\n\n#include <stdint.h>\n\ntypedef struct crypto_stream_chacha20_implementation {\n    int (*stream)(unsigned char *c, unsigned long long clen,\n                  const unsigned char *n, const unsigned char *k);\n    int (*stream_ietf)(unsigned char *c, unsigned long long clen,\n                      const unsigned char *n, const unsigned char *k);\n    int (*stream_xor_ic)(unsigned char *c, const unsigned char *m,\n                         unsigned long long mlen,\n                         const unsigned char *n, uint64_t ic,\n                         const unsigned char *k);\n    int (*stream_ietf_xor_ic)(unsigned char *c, const unsigned char *m,\n                              unsigned long long mlen,\n                              const unsigned char *n, uint32_t ic,\n                              const unsigned char *k);\n} crypto_stream_chacha20_implementation;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/chacha20/vec/stream_chacha20_vec.c",
    "content": "\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"export.h\"\n#include \"utils.h\"\n#include \"crypto_stream_chacha20.h\"\n#include \"stream_chacha20_vec.h\"\n#include \"../stream_chacha20.h\"\n\n#if (defined(HAVE_EMMINTRIN_H) && defined(HAVE_TMMINTRIN_H) && defined(__GNUC__))\n\n#pragma GCC target(\"sse2\")\n#pragma GCC target(\"ssse3\")\n\n#define CHACHA_RNDS 20\n\ntypedef unsigned int vec __attribute__((vector_size(16)));\n\n#include <emmintrin.h>\n#include <tmmintrin.h>\n\n# if __clang__\n#  define VBPI 4\n# else\n#  define VBPI 3\n# endif\n# define ONE (vec) _mm_set_epi32(0, 0, 0, 1)\n# define LOAD(m) (vec) _mm_loadu_si128((const __m128i *) (const void *) (m))\n# define LOAD_ALIGNED(m) (vec) _mm_load_si128((const __m128i *) (const void *) (m))\n# define STORE(m, r) _mm_storeu_si128((__m128i *) (void *) (m), (__m128i) (r))\n# define ROTV1(x) (vec) _mm_shuffle_epi32((__m128i)x, _MM_SHUFFLE(0, 3, 2, 1))\n# define ROTV2(x) (vec) _mm_shuffle_epi32((__m128i)x, _MM_SHUFFLE(1, 0, 3, 2))\n# define ROTV3(x) (vec) _mm_shuffle_epi32((__m128i)x, _MM_SHUFFLE(2, 1, 0, 3))\n# define ROTW7(x) \\\n    (vec)(_mm_slli_epi32((__m128i)x, 7) ^ _mm_srli_epi32((__m128i)x, 25))\n# define ROTW12(x) \\\n    (vec)(_mm_slli_epi32((__m128i)x, 12) ^ _mm_srli_epi32((__m128i)x, 20))\n# define ROTW8(x) \\\n    (vec)(_mm_slli_epi32((__m128i)x, 8) ^ _mm_srli_epi32((__m128i)x, 24))\n#define ROTW16(x) \\\n    (vec)(_mm_slli_epi32((__m128i)x, 16) ^ _mm_srli_epi32((__m128i)x, 16))\n\n#ifndef REVV_BE\n# define REVV_BE(x) (x)\n#endif\n\n#define BPI (VBPI + 0) /* Blocks computed per loop iteration   */\n\n#define DQROUND_VECTORS(a, b, c, d) \\\n    a += b;                         \\\n    d ^= a;                         \\\n    d = ROTW16(d);                  \\\n    c += d;                         \\\n    b ^= c;                         \\\n    b = ROTW12(b);                  \\\n    a += b;                         \\\n    d ^= a;                         \\\n    d = ROTW8(d);                   \\\n    c += d;                         \\\n    b ^= c;                         \\\n    b = ROTW7(b);                   \\\n    b = ROTV1(b);                   \\\n    c = ROTV2(c);                   \\\n    d = ROTV3(d);                   \\\n    a += b;                         \\\n    d ^= a;                         \\\n    d = ROTW16(d);                  \\\n    c += d;                         \\\n    b ^= c;                         \\\n    b = ROTW12(b);                  \\\n    a += b;                         \\\n    d ^= a;                         \\\n    d = ROTW8(d);                   \\\n    c += d;                         \\\n    b ^= c;                         \\\n    b = ROTW7(b);                   \\\n    b = ROTV3(b);                   \\\n    c = ROTV2(c);                   \\\n    d = ROTV1(d);\n\n#define WRITE_XOR(in, op, d, v0, v1, v2, v3)           \\\n    STORE(op + d + 0, LOAD(in + d + 0) ^ REVV_BE(v0)); \\\n    STORE(op + d + 4, LOAD(in + d + 4) ^ REVV_BE(v1)); \\\n    STORE(op + d + 8, LOAD(in + d + 8) ^ REVV_BE(v2)); \\\n    STORE(op + d + 12, LOAD(in + d + 12) ^ REVV_BE(v3));\n\nstruct chacha_ctx {\n    vec s1;\n    vec s2;\n    vec s3;\n};\n\ntypedef struct chacha_ctx chacha_ctx;\n\nstatic void\nchacha_ivsetup(chacha_ctx *ctx, const uint8_t *iv, uint64_t ic)\n{\n    const vec s3 = {\n        (uint32_t) ic,\n        (uint32_t) (ic >> 32),\n        ((const uint32_t *) (const void *) iv)[0],\n        ((const uint32_t *) (const void *) iv)[1]\n    };\n    ctx->s3 = s3;\n}\n\nstatic void\nchacha_ietf_ivsetup(chacha_ctx *ctx, const uint8_t *iv, uint32_t ic)\n{\n    const vec s3 = {\n        ic,\n        ((const uint32_t *) (const void *) iv)[0],\n        ((const uint32_t *) (const void *) iv)[1],\n        ((const uint32_t *) (const void *) iv)[2]\n    };\n    ctx->s3 = s3;\n}\n\nstatic void\nchacha_keysetup(chacha_ctx *ctx, const uint8_t *k)\n{\n    ctx->s1 = LOAD(k);\n    ctx->s2 = LOAD(k + 16);\n}\n\nstatic void\nchacha_encrypt_bytes(chacha_ctx *ctx, const uint8_t *in, uint8_t *out,\n                     unsigned long long inlen)\n{\n    CRYPTO_ALIGN(16) unsigned chacha_const[]\n        = { 0x61707865, 0x3320646E, 0x79622D32, 0x6B206574 };\n    uint32_t           *op = (uint32_t *) (void *) out;\n    const uint32_t     *ip = (const uint32_t *) (const void *) in;\n    vec                 s0, s1, s2, s3;\n    unsigned long long  iters;\n    unsigned long long  i;\n\n    if (inlen > 64ULL * (1ULL << 32) - 64ULL) {\n        abort();\n    }\n    s0 = LOAD_ALIGNED(chacha_const);\n    s1 = ctx->s1;\n    s2 = ctx->s2;\n    s3 = ctx->s3;\n\n    for (iters = 0; iters < inlen / (BPI * 64); iters++) {\n#if VBPI > 2\n        vec v8, v9, v10, v11;\n#endif\n#if VBPI > 3\n        vec v12, v13, v14, v15;\n#endif\n        vec v0, v1, v2, v3, v4, v5, v6, v7;\n        v4 = v0 = s0;\n        v5 = v1 = s1;\n        v6 = v2 = s2;\n        v3 = s3;\n        v7 = v3 + ONE;\n#if VBPI > 2\n        v8 = v4;\n        v9 = v5;\n        v10 = v6;\n        v11 = v7 + ONE;\n#endif\n#if VBPI > 3\n        v12 = v8;\n        v13 = v9;\n        v14 = v10;\n        v15 = v11 + ONE;\n#endif\n        for (i = CHACHA_RNDS / 2; i; i--) {\n            DQROUND_VECTORS(v0, v1, v2, v3)\n            DQROUND_VECTORS(v4, v5, v6, v7)\n#if VBPI > 2\n            DQROUND_VECTORS(v8, v9, v10, v11)\n#endif\n#if VBPI > 3\n            DQROUND_VECTORS(v12, v13, v14, v15)\n#endif\n        }\n\n        WRITE_XOR(ip, op, 0, v0 + s0, v1 + s1, v2 + s2, v3 + s3)\n        s3 += ONE;\n        WRITE_XOR(ip, op, 16, v4 + s0, v5 + s1, v6 + s2, v7 + s3)\n        s3 += ONE;\n#if VBPI > 2\n        WRITE_XOR(ip, op, 32, v8 + s0, v9 + s1, v10 + s2, v11 + s3)\n        s3 += ONE;\n#endif\n#if VBPI > 3\n        WRITE_XOR(ip, op, 48, v12 + s0, v13 + s1, v14 + s2, v15 + s3)\n        s3 += ONE;\n#endif\n        ip += VBPI * 16;\n        op += VBPI * 16;\n    }\n\n    for (iters = inlen % (BPI * 64) / 64; iters != 0; iters--) {\n        vec v0 = s0, v1 = s1, v2 = s2, v3 = s3;\n        for (i = CHACHA_RNDS / 2; i; i--) {\n            DQROUND_VECTORS(v0, v1, v2, v3);\n        }\n        WRITE_XOR(ip, op, 0, v0 + s0, v1 + s1, v2 + s2, v3 + s3)\n        s3 += ONE;\n        ip += 16;\n        op += 16;\n    }\n\n    inlen = inlen % 64;\n    if (inlen) {\n        CRYPTO_ALIGN(16) vec buf[4];\n        vec v0, v1, v2, v3;\n        v0 = s0;\n        v1 = s1;\n        v2 = s2;\n        v3 = s3;\n        for (i = CHACHA_RNDS / 2; i; i--) {\n            DQROUND_VECTORS(v0, v1, v2, v3);\n        }\n\n        if (inlen >= 16) {\n            STORE(op + 0, LOAD(ip + 0) ^ REVV_BE(v0 + s0));\n            if (inlen >= 32) {\n                STORE(op + 4, LOAD(ip + 4) ^ REVV_BE(v1 + s1));\n                if (inlen >= 48) {\n                    STORE(op + 8, LOAD(ip + 8) ^ REVV_BE(v2 + s2));\n                    buf[3] = REVV_BE(v3 + s3);\n                } else {\n                    buf[2] = REVV_BE(v2 + s2);\n                }\n            } else {\n                buf[1] = REVV_BE(v1 + s1);\n            }\n        } else {\n            buf[0] = REVV_BE(v0 + s0);\n        }\n        for (i = inlen & ~15ULL; i < inlen; i++) {\n            ((char *) op)[i] = ((const char *) ip)[i] ^ ((char *) buf)[i];\n        }\n    }\n}\n\nstatic int\nstream_vec(unsigned char *c, unsigned long long clen,\n           const unsigned char *n, const unsigned char *k)\n{\n    struct chacha_ctx ctx;\n\n    if (!clen) {\n        return 0;\n    }\n    (void) sizeof(int[crypto_stream_chacha20_KEYBYTES == 256 / 8 ? 1 : -1]);\n    chacha_keysetup(&ctx, k);\n    chacha_ivsetup(&ctx, n, 0ULL);\n    memset(c, 0, clen);\n    chacha_encrypt_bytes(&ctx, c, c, clen);\n    sodium_memzero(&ctx, sizeof ctx);\n\n    return 0;\n}\n\nstatic int\nstream_ietf_vec(unsigned char *c, unsigned long long clen,\n                const unsigned char *n, const unsigned char *k)\n{\n    struct chacha_ctx ctx;\n\n    if (!clen) {\n        return 0;\n    }\n    (void) sizeof(int[crypto_stream_chacha20_KEYBYTES == 256 / 8 ? 1 : -1]);\n    chacha_keysetup(&ctx, k);\n    chacha_ietf_ivsetup(&ctx, n, 0ULL);\n    memset(c, 0, clen);\n    chacha_encrypt_bytes(&ctx, c, c, clen);\n    sodium_memzero(&ctx, sizeof ctx);\n\n    return 0;\n}\n\nstatic int\nstream_vec_xor_ic(unsigned char *c, const unsigned char *m,\n                  unsigned long long mlen,\n                  const unsigned char *n, uint64_t ic,\n                  const unsigned char *k)\n{\n    struct chacha_ctx ctx;\n\n    if (!mlen) {\n        return 0;\n    }\n    chacha_keysetup(&ctx, k);\n    chacha_ivsetup(&ctx, n, ic);\n    chacha_encrypt_bytes(&ctx, m, c, mlen);\n    sodium_memzero(&ctx, sizeof ctx);\n\n    return 0;\n}\n\nstatic int\nstream_ietf_vec_xor_ic(unsigned char *c, const unsigned char *m,\n                       unsigned long long mlen,\n                       const unsigned char *n, uint32_t ic,\n                       const unsigned char *k)\n{\n    struct chacha_ctx ctx;\n\n    if (!mlen) {\n        return 0;\n    }\n    chacha_keysetup(&ctx, k);\n    chacha_ietf_ivsetup(&ctx, n, ic);\n    chacha_encrypt_bytes(&ctx, m, c, mlen);\n    sodium_memzero(&ctx, sizeof ctx);\n\n    return 0;\n}\n\nstruct crypto_stream_chacha20_implementation\ncrypto_stream_chacha20_vec_implementation = {\n    SODIUM_C99(.stream =) stream_vec,\n    SODIUM_C99(.stream_ietf =) stream_ietf_vec,\n    SODIUM_C99(.stream_xor_ic =) stream_vec_xor_ic,\n    SODIUM_C99(.stream_ietf_xor_ic =) stream_ietf_vec_xor_ic\n};\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/chacha20/vec/stream_chacha20_vec.h",
    "content": "\n#include <stdint.h>\n\n#include \"crypto_stream_chacha20.h\"\n\nextern struct crypto_stream_chacha20_implementation\n    crypto_stream_chacha20_vec_implementation;\n\nint\ncrypto_stream_chacha20_vec(unsigned char *c, unsigned long long clen,\n                           const unsigned char *n, const unsigned char *k);\n\nint\ncrypto_stream_chacha20_vec_xor_ic(unsigned char *c, const unsigned char *m,\n                                  unsigned long long mlen,\n                                  const unsigned char *n, uint64_t ic,\n                                  const unsigned char *k);\n\nint\ncrypto_stream_chacha20_ietf_vec(unsigned char *c, unsigned long long clen,\n                                const unsigned char *n, const unsigned char *k);\n\nint\ncrypto_stream_chacha20_ietf_vec_xor_ic(unsigned char *c, const unsigned char *m,\n                                       unsigned long long mlen,\n                                       const unsigned char *n, uint32_t ic,\n                                       const unsigned char *k);\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/crypto_stream.c",
    "content": "\n#include \"crypto_stream.h\"\n\nsize_t\ncrypto_stream_keybytes(void)\n{\n    return crypto_stream_KEYBYTES;\n}\n\nsize_t\ncrypto_stream_noncebytes(void)\n{\n    return crypto_stream_NONCEBYTES;\n}\n\nconst char *\ncrypto_stream_primitive(void)\n{\n    return crypto_stream_PRIMITIVE;\n}\n\nint\ncrypto_stream(unsigned char *c, unsigned long long clen,\n              const unsigned char *n, const unsigned char *k)\n{\n    return crypto_stream_xsalsa20(c, clen, n, k);\n}\n\n\nint\ncrypto_stream_xor(unsigned char *c, const unsigned char *m,\n                  unsigned long long mlen, const unsigned char *n,\n                  const unsigned char *k)\n{\n    return crypto_stream_xsalsa20_xor(c, m, mlen, n, k);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/salsa20/amd64_xmm6/stream_salsa20_amd64_xmm6.S",
    "content": "#ifdef HAVE_AMD64_ASM\n\n.text\n.p2align 5\n\n.globl  crypto_stream_salsa20\n.globl _crypto_stream_salsa20\n#ifdef __ELF__\n.type  crypto_stream_salsa20, @function\n.type _crypto_stream_salsa20, @function\n#endif\ncrypto_stream_salsa20:\n_crypto_stream_salsa20:\nmov %rsp,%r11\nand $31,%r11\nadd $512,%r11\nsub %r11,%rsp\nmovq %r11,416(%rsp)\nmovq %r12,424(%rsp)\nmovq %r13,432(%rsp)\nmovq %r14,440(%rsp)\nmovq %r15,448(%rsp)\nmovq %rbx,456(%rsp)\nmovq %rbp,464(%rsp)\nmov  %rsi,%r9\nmov  %rdi,%rdi\nmov  %rdi,%rsi\nmov  %rdx,%rdx\nmov  %rcx,%r10\ncmp  $0,%r9\njbe ._done\nmov  $0,%rax\nmov  %r9,%rcx\nrep stosb\nsub  %r9,%rdi\nmovq $0,472(%rsp)\njmp ._start\n\n.text\n.p2align 5\n\n.globl  crypto_stream_salsa20_xor_ic\n.globl _crypto_stream_salsa20_xor_ic\n#ifdef __ELF__\n.type  crypto_stream_salsa20_xor_ic, @function\n.type _crypto_stream_salsa20_xor_ic, @function\n#endif\ncrypto_stream_salsa20_xor_ic:\n_crypto_stream_salsa20_xor_ic:\n\nmov %rsp,%r11\nand $31,%r11\nadd $512,%r11\nsub %r11,%rsp\nmovq %r11,416(%rsp)\nmovq %r12,424(%rsp)\nmovq %r13,432(%rsp)\nmovq %r14,440(%rsp)\nmovq %r15,448(%rsp)\nmovq %rbx,456(%rsp)\nmovq %rbp,464(%rsp)\nmov  %rdi,%rdi\nmov  %rsi,%rsi\nmov  %r9,%r10\nmovq %r8,472(%rsp)\nmov  %rdx,%r9\nmov  %rcx,%rdx\ncmp  $0,%r9\njbe ._done\n\n._start:\nmovl   20(%r10),%ecx\nmovl   0(%r10),%r8d\nmovl   0(%rdx),%eax\nmovl   16(%r10),%r11d\nmovl %ecx,64(%rsp)\nmovl %r8d,4+64(%rsp)\nmovl %eax,8+64(%rsp)\nmovl %r11d,12+64(%rsp)\nmovl   24(%r10),%r8d\nmovl   4(%r10),%eax\nmovl   4(%rdx),%edx\nmovq 472(%rsp),%rcx\nmovl %ecx,80(%rsp)\nmovl %r8d,4+80(%rsp)\nmovl %eax,8+80(%rsp)\nmovl %edx,12+80(%rsp)\nmovl   12(%r10),%edx\nshr  $32,%rcx\nmovl   28(%r10),%r8d\nmovl   8(%r10),%eax\nmovl %edx,96(%rsp)\nmovl %ecx,4+96(%rsp)\nmovl %r8d,8+96(%rsp)\nmovl %eax,12+96(%rsp)\nmov  $1634760805,%rdx\nmov  $857760878,%rcx\nmov  $2036477234,%r8\nmov  $1797285236,%rax\nmovl %edx,112(%rsp)\nmovl %ecx,4+112(%rsp)\nmovl %r8d,8+112(%rsp)\nmovl %eax,12+112(%rsp)\ncmp  $256,%r9\njb ._bytesbetween1and255\nmovdqa 112(%rsp),%xmm0\npshufd $0x55,%xmm0,%xmm1\npshufd $0xaa,%xmm0,%xmm2\npshufd $0xff,%xmm0,%xmm3\npshufd $0x00,%xmm0,%xmm0\nmovdqa %xmm1,128(%rsp)\nmovdqa %xmm2,144(%rsp)\nmovdqa %xmm3,160(%rsp)\nmovdqa %xmm0,176(%rsp)\nmovdqa 64(%rsp),%xmm0\npshufd $0xaa,%xmm0,%xmm1\npshufd $0xff,%xmm0,%xmm2\npshufd $0x00,%xmm0,%xmm3\npshufd $0x55,%xmm0,%xmm0\nmovdqa %xmm1,192(%rsp)\nmovdqa %xmm2,208(%rsp)\nmovdqa %xmm3,224(%rsp)\nmovdqa %xmm0,240(%rsp)\nmovdqa 80(%rsp),%xmm0\npshufd $0xff,%xmm0,%xmm1\npshufd $0x55,%xmm0,%xmm2\npshufd $0xaa,%xmm0,%xmm0\nmovdqa %xmm1,256(%rsp)\nmovdqa %xmm2,272(%rsp)\nmovdqa %xmm0,288(%rsp)\nmovdqa 96(%rsp),%xmm0\npshufd $0x00,%xmm0,%xmm1\npshufd $0xaa,%xmm0,%xmm2\npshufd $0xff,%xmm0,%xmm0\nmovdqa %xmm1,304(%rsp)\nmovdqa %xmm2,320(%rsp)\nmovdqa %xmm0,336(%rsp)\n\n._bytesatleast256:\nmovq 472(%rsp),%rdx\nmov  %rdx,%rcx\nshr  $32,%rcx\nmovl %edx,352(%rsp)\nmovl %ecx,368(%rsp)\nadd  $1,%rdx\nmov  %rdx,%rcx\nshr  $32,%rcx\nmovl %edx,4+352(%rsp)\nmovl %ecx,4+368(%rsp)\nadd  $1,%rdx\nmov  %rdx,%rcx\nshr  $32,%rcx\nmovl %edx,8+352(%rsp)\nmovl %ecx,8+368(%rsp)\nadd  $1,%rdx\nmov  %rdx,%rcx\nshr  $32,%rcx\nmovl %edx,12+352(%rsp)\nmovl %ecx,12+368(%rsp)\nadd  $1,%rdx\nmov  %rdx,%rcx\nshr  $32,%rcx\nmovl %edx,80(%rsp)\nmovl %ecx,4+96(%rsp)\nmovq %rdx,472(%rsp)\nmovq %r9,480(%rsp)\nmov  $20,%rdx\nmovdqa 128(%rsp),%xmm0\nmovdqa 144(%rsp),%xmm1\nmovdqa 160(%rsp),%xmm2\nmovdqa 320(%rsp),%xmm3\nmovdqa 336(%rsp),%xmm4\nmovdqa 192(%rsp),%xmm5\nmovdqa 208(%rsp),%xmm6\nmovdqa 240(%rsp),%xmm7\nmovdqa 256(%rsp),%xmm8\nmovdqa 272(%rsp),%xmm9\nmovdqa 288(%rsp),%xmm10\nmovdqa 368(%rsp),%xmm11\nmovdqa 176(%rsp),%xmm12\nmovdqa 224(%rsp),%xmm13\nmovdqa 304(%rsp),%xmm14\nmovdqa 352(%rsp),%xmm15\n\n._mainloop1:\nmovdqa %xmm1,384(%rsp)\nmovdqa %xmm2,400(%rsp)\nmovdqa %xmm13,%xmm1\npaddd %xmm12,%xmm1\nmovdqa %xmm1,%xmm2\npslld $7,%xmm1\npxor  %xmm1,%xmm14\npsrld $25,%xmm2\npxor  %xmm2,%xmm14\nmovdqa %xmm7,%xmm1\npaddd %xmm0,%xmm1\nmovdqa %xmm1,%xmm2\npslld $7,%xmm1\npxor  %xmm1,%xmm11\npsrld $25,%xmm2\npxor  %xmm2,%xmm11\nmovdqa %xmm12,%xmm1\npaddd %xmm14,%xmm1\nmovdqa %xmm1,%xmm2\npslld $9,%xmm1\npxor  %xmm1,%xmm15\npsrld $23,%xmm2\npxor  %xmm2,%xmm15\nmovdqa %xmm0,%xmm1\npaddd %xmm11,%xmm1\nmovdqa %xmm1,%xmm2\npslld $9,%xmm1\npxor  %xmm1,%xmm9\npsrld $23,%xmm2\npxor  %xmm2,%xmm9\nmovdqa %xmm14,%xmm1\npaddd %xmm15,%xmm1\nmovdqa %xmm1,%xmm2\npslld $13,%xmm1\npxor  %xmm1,%xmm13\npsrld $19,%xmm2\npxor  %xmm2,%xmm13\nmovdqa %xmm11,%xmm1\npaddd %xmm9,%xmm1\nmovdqa %xmm1,%xmm2\npslld $13,%xmm1\npxor  %xmm1,%xmm7\npsrld $19,%xmm2\npxor  %xmm2,%xmm7\nmovdqa %xmm15,%xmm1\npaddd %xmm13,%xmm1\nmovdqa %xmm1,%xmm2\npslld $18,%xmm1\npxor  %xmm1,%xmm12\npsrld $14,%xmm2\npxor  %xmm2,%xmm12\nmovdqa 384(%rsp),%xmm1\nmovdqa %xmm12,384(%rsp)\nmovdqa %xmm9,%xmm2\npaddd %xmm7,%xmm2\nmovdqa %xmm2,%xmm12\npslld $18,%xmm2\npxor  %xmm2,%xmm0\npsrld $14,%xmm12\npxor  %xmm12,%xmm0\nmovdqa %xmm5,%xmm2\npaddd %xmm1,%xmm2\nmovdqa %xmm2,%xmm12\npslld $7,%xmm2\npxor  %xmm2,%xmm3\npsrld $25,%xmm12\npxor  %xmm12,%xmm3\nmovdqa 400(%rsp),%xmm2\nmovdqa %xmm0,400(%rsp)\nmovdqa %xmm6,%xmm0\npaddd %xmm2,%xmm0\nmovdqa %xmm0,%xmm12\npslld $7,%xmm0\npxor  %xmm0,%xmm4\npsrld $25,%xmm12\npxor  %xmm12,%xmm4\nmovdqa %xmm1,%xmm0\npaddd %xmm3,%xmm0\nmovdqa %xmm0,%xmm12\npslld $9,%xmm0\npxor  %xmm0,%xmm10\npsrld $23,%xmm12\npxor  %xmm12,%xmm10\nmovdqa %xmm2,%xmm0\npaddd %xmm4,%xmm0\nmovdqa %xmm0,%xmm12\npslld $9,%xmm0\npxor  %xmm0,%xmm8\npsrld $23,%xmm12\npxor  %xmm12,%xmm8\nmovdqa %xmm3,%xmm0\npaddd %xmm10,%xmm0\nmovdqa %xmm0,%xmm12\npslld $13,%xmm0\npxor  %xmm0,%xmm5\npsrld $19,%xmm12\npxor  %xmm12,%xmm5\nmovdqa %xmm4,%xmm0\npaddd %xmm8,%xmm0\nmovdqa %xmm0,%xmm12\npslld $13,%xmm0\npxor  %xmm0,%xmm6\npsrld $19,%xmm12\npxor  %xmm12,%xmm6\nmovdqa %xmm10,%xmm0\npaddd %xmm5,%xmm0\nmovdqa %xmm0,%xmm12\npslld $18,%xmm0\npxor  %xmm0,%xmm1\npsrld $14,%xmm12\npxor  %xmm12,%xmm1\nmovdqa 384(%rsp),%xmm0\nmovdqa %xmm1,384(%rsp)\nmovdqa %xmm4,%xmm1\npaddd %xmm0,%xmm1\nmovdqa %xmm1,%xmm12\npslld $7,%xmm1\npxor  %xmm1,%xmm7\npsrld $25,%xmm12\npxor  %xmm12,%xmm7\nmovdqa %xmm8,%xmm1\npaddd %xmm6,%xmm1\nmovdqa %xmm1,%xmm12\npslld $18,%xmm1\npxor  %xmm1,%xmm2\npsrld $14,%xmm12\npxor  %xmm12,%xmm2\nmovdqa 400(%rsp),%xmm12\nmovdqa %xmm2,400(%rsp)\nmovdqa %xmm14,%xmm1\npaddd %xmm12,%xmm1\nmovdqa %xmm1,%xmm2\npslld $7,%xmm1\npxor  %xmm1,%xmm5\npsrld $25,%xmm2\npxor  %xmm2,%xmm5\nmovdqa %xmm0,%xmm1\npaddd %xmm7,%xmm1\nmovdqa %xmm1,%xmm2\npslld $9,%xmm1\npxor  %xmm1,%xmm10\npsrld $23,%xmm2\npxor  %xmm2,%xmm10\nmovdqa %xmm12,%xmm1\npaddd %xmm5,%xmm1\nmovdqa %xmm1,%xmm2\npslld $9,%xmm1\npxor  %xmm1,%xmm8\npsrld $23,%xmm2\npxor  %xmm2,%xmm8\nmovdqa %xmm7,%xmm1\npaddd %xmm10,%xmm1\nmovdqa %xmm1,%xmm2\npslld $13,%xmm1\npxor  %xmm1,%xmm4\npsrld $19,%xmm2\npxor  %xmm2,%xmm4\nmovdqa %xmm5,%xmm1\npaddd %xmm8,%xmm1\nmovdqa %xmm1,%xmm2\npslld $13,%xmm1\npxor  %xmm1,%xmm14\npsrld $19,%xmm2\npxor  %xmm2,%xmm14\nmovdqa %xmm10,%xmm1\npaddd %xmm4,%xmm1\nmovdqa %xmm1,%xmm2\npslld $18,%xmm1\npxor  %xmm1,%xmm0\npsrld $14,%xmm2\npxor  %xmm2,%xmm0\nmovdqa 384(%rsp),%xmm1\nmovdqa %xmm0,384(%rsp)\nmovdqa %xmm8,%xmm0\npaddd %xmm14,%xmm0\nmovdqa %xmm0,%xmm2\npslld $18,%xmm0\npxor  %xmm0,%xmm12\npsrld $14,%xmm2\npxor  %xmm2,%xmm12\nmovdqa %xmm11,%xmm0\npaddd %xmm1,%xmm0\nmovdqa %xmm0,%xmm2\npslld $7,%xmm0\npxor  %xmm0,%xmm6\npsrld $25,%xmm2\npxor  %xmm2,%xmm6\nmovdqa 400(%rsp),%xmm2\nmovdqa %xmm12,400(%rsp)\nmovdqa %xmm3,%xmm0\npaddd %xmm2,%xmm0\nmovdqa %xmm0,%xmm12\npslld $7,%xmm0\npxor  %xmm0,%xmm13\npsrld $25,%xmm12\npxor  %xmm12,%xmm13\nmovdqa %xmm1,%xmm0\npaddd %xmm6,%xmm0\nmovdqa %xmm0,%xmm12\npslld $9,%xmm0\npxor  %xmm0,%xmm15\npsrld $23,%xmm12\npxor  %xmm12,%xmm15\nmovdqa %xmm2,%xmm0\npaddd %xmm13,%xmm0\nmovdqa %xmm0,%xmm12\npslld $9,%xmm0\npxor  %xmm0,%xmm9\npsrld $23,%xmm12\npxor  %xmm12,%xmm9\nmovdqa %xmm6,%xmm0\npaddd %xmm15,%xmm0\nmovdqa %xmm0,%xmm12\npslld $13,%xmm0\npxor  %xmm0,%xmm11\npsrld $19,%xmm12\npxor  %xmm12,%xmm11\nmovdqa %xmm13,%xmm0\npaddd %xmm9,%xmm0\nmovdqa %xmm0,%xmm12\npslld $13,%xmm0\npxor  %xmm0,%xmm3\npsrld $19,%xmm12\npxor  %xmm12,%xmm3\nmovdqa %xmm15,%xmm0\npaddd %xmm11,%xmm0\nmovdqa %xmm0,%xmm12\npslld $18,%xmm0\npxor  %xmm0,%xmm1\npsrld $14,%xmm12\npxor  %xmm12,%xmm1\nmovdqa %xmm9,%xmm0\npaddd %xmm3,%xmm0\nmovdqa %xmm0,%xmm12\npslld $18,%xmm0\npxor  %xmm0,%xmm2\npsrld $14,%xmm12\npxor  %xmm12,%xmm2\nmovdqa 384(%rsp),%xmm12\nmovdqa 400(%rsp),%xmm0\nsub  $2,%rdx\nja ._mainloop1\npaddd 176(%rsp),%xmm12\npaddd 240(%rsp),%xmm7\npaddd 288(%rsp),%xmm10\npaddd 336(%rsp),%xmm4\nmovd   %xmm12,%rdx\nmovd   %xmm7,%rcx\nmovd   %xmm10,%r8\nmovd   %xmm4,%r9\npshufd $0x39,%xmm12,%xmm12\npshufd $0x39,%xmm7,%xmm7\npshufd $0x39,%xmm10,%xmm10\npshufd $0x39,%xmm4,%xmm4\nxorl 0(%rsi),%edx\nxorl 4(%rsi),%ecx\nxorl 8(%rsi),%r8d\nxorl 12(%rsi),%r9d\nmovl   %edx,0(%rdi)\nmovl   %ecx,4(%rdi)\nmovl   %r8d,8(%rdi)\nmovl   %r9d,12(%rdi)\nmovd   %xmm12,%rdx\nmovd   %xmm7,%rcx\nmovd   %xmm10,%r8\nmovd   %xmm4,%r9\npshufd $0x39,%xmm12,%xmm12\npshufd $0x39,%xmm7,%xmm7\npshufd $0x39,%xmm10,%xmm10\npshufd $0x39,%xmm4,%xmm4\nxorl 64(%rsi),%edx\nxorl 68(%rsi),%ecx\nxorl 72(%rsi),%r8d\nxorl 76(%rsi),%r9d\nmovl   %edx,64(%rdi)\nmovl   %ecx,68(%rdi)\nmovl   %r8d,72(%rdi)\nmovl   %r9d,76(%rdi)\nmovd   %xmm12,%rdx\nmovd   %xmm7,%rcx\nmovd   %xmm10,%r8\nmovd   %xmm4,%r9\npshufd $0x39,%xmm12,%xmm12\npshufd $0x39,%xmm7,%xmm7\npshufd $0x39,%xmm10,%xmm10\npshufd $0x39,%xmm4,%xmm4\nxorl 128(%rsi),%edx\nxorl 132(%rsi),%ecx\nxorl 136(%rsi),%r8d\nxorl 140(%rsi),%r9d\nmovl   %edx,128(%rdi)\nmovl   %ecx,132(%rdi)\nmovl   %r8d,136(%rdi)\nmovl   %r9d,140(%rdi)\nmovd   %xmm12,%rdx\nmovd   %xmm7,%rcx\nmovd   %xmm10,%r8\nmovd   %xmm4,%r9\nxorl 192(%rsi),%edx\nxorl 196(%rsi),%ecx\nxorl 200(%rsi),%r8d\nxorl 204(%rsi),%r9d\nmovl   %edx,192(%rdi)\nmovl   %ecx,196(%rdi)\nmovl   %r8d,200(%rdi)\nmovl   %r9d,204(%rdi)\npaddd 304(%rsp),%xmm14\npaddd 128(%rsp),%xmm0\npaddd 192(%rsp),%xmm5\npaddd 256(%rsp),%xmm8\nmovd   %xmm14,%rdx\nmovd   %xmm0,%rcx\nmovd   %xmm5,%r8\nmovd   %xmm8,%r9\npshufd $0x39,%xmm14,%xmm14\npshufd $0x39,%xmm0,%xmm0\npshufd $0x39,%xmm5,%xmm5\npshufd $0x39,%xmm8,%xmm8\nxorl 16(%rsi),%edx\nxorl 20(%rsi),%ecx\nxorl 24(%rsi),%r8d\nxorl 28(%rsi),%r9d\nmovl   %edx,16(%rdi)\nmovl   %ecx,20(%rdi)\nmovl   %r8d,24(%rdi)\nmovl   %r9d,28(%rdi)\nmovd   %xmm14,%rdx\nmovd   %xmm0,%rcx\nmovd   %xmm5,%r8\nmovd   %xmm8,%r9\npshufd $0x39,%xmm14,%xmm14\npshufd $0x39,%xmm0,%xmm0\npshufd $0x39,%xmm5,%xmm5\npshufd $0x39,%xmm8,%xmm8\nxorl 80(%rsi),%edx\nxorl 84(%rsi),%ecx\nxorl 88(%rsi),%r8d\nxorl 92(%rsi),%r9d\nmovl   %edx,80(%rdi)\nmovl   %ecx,84(%rdi)\nmovl   %r8d,88(%rdi)\nmovl   %r9d,92(%rdi)\nmovd   %xmm14,%rdx\nmovd   %xmm0,%rcx\nmovd   %xmm5,%r8\nmovd   %xmm8,%r9\npshufd $0x39,%xmm14,%xmm14\npshufd $0x39,%xmm0,%xmm0\npshufd $0x39,%xmm5,%xmm5\npshufd $0x39,%xmm8,%xmm8\nxorl 144(%rsi),%edx\nxorl 148(%rsi),%ecx\nxorl 152(%rsi),%r8d\nxorl 156(%rsi),%r9d\nmovl   %edx,144(%rdi)\nmovl   %ecx,148(%rdi)\nmovl   %r8d,152(%rdi)\nmovl   %r9d,156(%rdi)\nmovd   %xmm14,%rdx\nmovd   %xmm0,%rcx\nmovd   %xmm5,%r8\nmovd   %xmm8,%r9\nxorl 208(%rsi),%edx\nxorl 212(%rsi),%ecx\nxorl 216(%rsi),%r8d\nxorl 220(%rsi),%r9d\nmovl   %edx,208(%rdi)\nmovl   %ecx,212(%rdi)\nmovl   %r8d,216(%rdi)\nmovl   %r9d,220(%rdi)\npaddd 352(%rsp),%xmm15\npaddd 368(%rsp),%xmm11\npaddd 144(%rsp),%xmm1\npaddd 208(%rsp),%xmm6\nmovd   %xmm15,%rdx\nmovd   %xmm11,%rcx\nmovd   %xmm1,%r8\nmovd   %xmm6,%r9\npshufd $0x39,%xmm15,%xmm15\npshufd $0x39,%xmm11,%xmm11\npshufd $0x39,%xmm1,%xmm1\npshufd $0x39,%xmm6,%xmm6\nxorl 32(%rsi),%edx\nxorl 36(%rsi),%ecx\nxorl 40(%rsi),%r8d\nxorl 44(%rsi),%r9d\nmovl   %edx,32(%rdi)\nmovl   %ecx,36(%rdi)\nmovl   %r8d,40(%rdi)\nmovl   %r9d,44(%rdi)\nmovd   %xmm15,%rdx\nmovd   %xmm11,%rcx\nmovd   %xmm1,%r8\nmovd   %xmm6,%r9\npshufd $0x39,%xmm15,%xmm15\npshufd $0x39,%xmm11,%xmm11\npshufd $0x39,%xmm1,%xmm1\npshufd $0x39,%xmm6,%xmm6\nxorl 96(%rsi),%edx\nxorl 100(%rsi),%ecx\nxorl 104(%rsi),%r8d\nxorl 108(%rsi),%r9d\nmovl   %edx,96(%rdi)\nmovl   %ecx,100(%rdi)\nmovl   %r8d,104(%rdi)\nmovl   %r9d,108(%rdi)\nmovd   %xmm15,%rdx\nmovd   %xmm11,%rcx\nmovd   %xmm1,%r8\nmovd   %xmm6,%r9\npshufd $0x39,%xmm15,%xmm15\npshufd $0x39,%xmm11,%xmm11\npshufd $0x39,%xmm1,%xmm1\npshufd $0x39,%xmm6,%xmm6\nxorl 160(%rsi),%edx\nxorl 164(%rsi),%ecx\nxorl 168(%rsi),%r8d\nxorl 172(%rsi),%r9d\nmovl   %edx,160(%rdi)\nmovl   %ecx,164(%rdi)\nmovl   %r8d,168(%rdi)\nmovl   %r9d,172(%rdi)\nmovd   %xmm15,%rdx\nmovd   %xmm11,%rcx\nmovd   %xmm1,%r8\nmovd   %xmm6,%r9\nxorl 224(%rsi),%edx\nxorl 228(%rsi),%ecx\nxorl 232(%rsi),%r8d\nxorl 236(%rsi),%r9d\nmovl   %edx,224(%rdi)\nmovl   %ecx,228(%rdi)\nmovl   %r8d,232(%rdi)\nmovl   %r9d,236(%rdi)\npaddd 224(%rsp),%xmm13\npaddd 272(%rsp),%xmm9\npaddd 320(%rsp),%xmm3\npaddd 160(%rsp),%xmm2\nmovd   %xmm13,%rdx\nmovd   %xmm9,%rcx\nmovd   %xmm3,%r8\nmovd   %xmm2,%r9\npshufd $0x39,%xmm13,%xmm13\npshufd $0x39,%xmm9,%xmm9\npshufd $0x39,%xmm3,%xmm3\npshufd $0x39,%xmm2,%xmm2\nxorl 48(%rsi),%edx\nxorl 52(%rsi),%ecx\nxorl 56(%rsi),%r8d\nxorl 60(%rsi),%r9d\nmovl   %edx,48(%rdi)\nmovl   %ecx,52(%rdi)\nmovl   %r8d,56(%rdi)\nmovl   %r9d,60(%rdi)\nmovd   %xmm13,%rdx\nmovd   %xmm9,%rcx\nmovd   %xmm3,%r8\nmovd   %xmm2,%r9\npshufd $0x39,%xmm13,%xmm13\npshufd $0x39,%xmm9,%xmm9\npshufd $0x39,%xmm3,%xmm3\npshufd $0x39,%xmm2,%xmm2\nxorl 112(%rsi),%edx\nxorl 116(%rsi),%ecx\nxorl 120(%rsi),%r8d\nxorl 124(%rsi),%r9d\nmovl   %edx,112(%rdi)\nmovl   %ecx,116(%rdi)\nmovl   %r8d,120(%rdi)\nmovl   %r9d,124(%rdi)\nmovd   %xmm13,%rdx\nmovd   %xmm9,%rcx\nmovd   %xmm3,%r8\nmovd   %xmm2,%r9\npshufd $0x39,%xmm13,%xmm13\npshufd $0x39,%xmm9,%xmm9\npshufd $0x39,%xmm3,%xmm3\npshufd $0x39,%xmm2,%xmm2\nxorl 176(%rsi),%edx\nxorl 180(%rsi),%ecx\nxorl 184(%rsi),%r8d\nxorl 188(%rsi),%r9d\nmovl   %edx,176(%rdi)\nmovl   %ecx,180(%rdi)\nmovl   %r8d,184(%rdi)\nmovl   %r9d,188(%rdi)\nmovd   %xmm13,%rdx\nmovd   %xmm9,%rcx\nmovd   %xmm3,%r8\nmovd   %xmm2,%r9\nxorl 240(%rsi),%edx\nxorl 244(%rsi),%ecx\nxorl 248(%rsi),%r8d\nxorl 252(%rsi),%r9d\nmovl   %edx,240(%rdi)\nmovl   %ecx,244(%rdi)\nmovl   %r8d,248(%rdi)\nmovl   %r9d,252(%rdi)\nmovq 480(%rsp),%r9\nsub  $256,%r9\nadd  $256,%rsi\nadd  $256,%rdi\ncmp  $256,%r9\njae ._bytesatleast256\ncmp  $0,%r9\njbe ._done\n\n._bytesbetween1and255:\ncmp  $64,%r9\njae ._nocopy\nmov  %rdi,%rdx\nleaq 0(%rsp),%rdi\nmov  %r9,%rcx\nrep movsb\nleaq 0(%rsp),%rdi\nleaq 0(%rsp),%rsi\n\n._nocopy:\nmovq %r9,480(%rsp)\nmovdqa 112(%rsp),%xmm0\nmovdqa 64(%rsp),%xmm1\nmovdqa 80(%rsp),%xmm2\nmovdqa 96(%rsp),%xmm3\nmovdqa %xmm1,%xmm4\nmov  $20,%rcx\n\n._mainloop2:\npaddd %xmm0,%xmm4\nmovdqa %xmm0,%xmm5\nmovdqa %xmm4,%xmm6\npslld $7,%xmm4\npsrld $25,%xmm6\npxor  %xmm4,%xmm3\npxor  %xmm6,%xmm3\npaddd %xmm3,%xmm5\nmovdqa %xmm3,%xmm4\nmovdqa %xmm5,%xmm6\npslld $9,%xmm5\npsrld $23,%xmm6\npxor  %xmm5,%xmm2\npshufd $0x93,%xmm3,%xmm3\npxor  %xmm6,%xmm2\npaddd %xmm2,%xmm4\nmovdqa %xmm2,%xmm5\nmovdqa %xmm4,%xmm6\npslld $13,%xmm4\npsrld $19,%xmm6\npxor  %xmm4,%xmm1\npshufd $0x4e,%xmm2,%xmm2\npxor  %xmm6,%xmm1\npaddd %xmm1,%xmm5\nmovdqa %xmm3,%xmm4\nmovdqa %xmm5,%xmm6\npslld $18,%xmm5\npsrld $14,%xmm6\npxor  %xmm5,%xmm0\npshufd $0x39,%xmm1,%xmm1\npxor  %xmm6,%xmm0\npaddd %xmm0,%xmm4\nmovdqa %xmm0,%xmm5\nmovdqa %xmm4,%xmm6\npslld $7,%xmm4\npsrld $25,%xmm6\npxor  %xmm4,%xmm1\npxor  %xmm6,%xmm1\npaddd %xmm1,%xmm5\nmovdqa %xmm1,%xmm4\nmovdqa %xmm5,%xmm6\npslld $9,%xmm5\npsrld $23,%xmm6\npxor  %xmm5,%xmm2\npshufd $0x93,%xmm1,%xmm1\npxor  %xmm6,%xmm2\npaddd %xmm2,%xmm4\nmovdqa %xmm2,%xmm5\nmovdqa %xmm4,%xmm6\npslld $13,%xmm4\npsrld $19,%xmm6\npxor  %xmm4,%xmm3\npshufd $0x4e,%xmm2,%xmm2\npxor  %xmm6,%xmm3\npaddd %xmm3,%xmm5\nmovdqa %xmm1,%xmm4\nmovdqa %xmm5,%xmm6\npslld $18,%xmm5\npsrld $14,%xmm6\npxor  %xmm5,%xmm0\npshufd $0x39,%xmm3,%xmm3\npxor  %xmm6,%xmm0\npaddd %xmm0,%xmm4\nmovdqa %xmm0,%xmm5\nmovdqa %xmm4,%xmm6\npslld $7,%xmm4\npsrld $25,%xmm6\npxor  %xmm4,%xmm3\npxor  %xmm6,%xmm3\npaddd %xmm3,%xmm5\nmovdqa %xmm3,%xmm4\nmovdqa %xmm5,%xmm6\npslld $9,%xmm5\npsrld $23,%xmm6\npxor  %xmm5,%xmm2\npshufd $0x93,%xmm3,%xmm3\npxor  %xmm6,%xmm2\npaddd %xmm2,%xmm4\nmovdqa %xmm2,%xmm5\nmovdqa %xmm4,%xmm6\npslld $13,%xmm4\npsrld $19,%xmm6\npxor  %xmm4,%xmm1\npshufd $0x4e,%xmm2,%xmm2\npxor  %xmm6,%xmm1\npaddd %xmm1,%xmm5\nmovdqa %xmm3,%xmm4\nmovdqa %xmm5,%xmm6\npslld $18,%xmm5\npsrld $14,%xmm6\npxor  %xmm5,%xmm0\npshufd $0x39,%xmm1,%xmm1\npxor  %xmm6,%xmm0\npaddd %xmm0,%xmm4\nmovdqa %xmm0,%xmm5\nmovdqa %xmm4,%xmm6\npslld $7,%xmm4\npsrld $25,%xmm6\npxor  %xmm4,%xmm1\npxor  %xmm6,%xmm1\npaddd %xmm1,%xmm5\nmovdqa %xmm1,%xmm4\nmovdqa %xmm5,%xmm6\npslld $9,%xmm5\npsrld $23,%xmm6\npxor  %xmm5,%xmm2\npshufd $0x93,%xmm1,%xmm1\npxor  %xmm6,%xmm2\npaddd %xmm2,%xmm4\nmovdqa %xmm2,%xmm5\nmovdqa %xmm4,%xmm6\npslld $13,%xmm4\npsrld $19,%xmm6\npxor  %xmm4,%xmm3\npshufd $0x4e,%xmm2,%xmm2\npxor  %xmm6,%xmm3\nsub  $4,%rcx\npaddd %xmm3,%xmm5\nmovdqa %xmm1,%xmm4\nmovdqa %xmm5,%xmm6\npslld $18,%xmm5\npxor   %xmm7,%xmm7\npsrld $14,%xmm6\npxor  %xmm5,%xmm0\npshufd $0x39,%xmm3,%xmm3\npxor  %xmm6,%xmm0\nja ._mainloop2\npaddd 112(%rsp),%xmm0\npaddd 64(%rsp),%xmm1\npaddd 80(%rsp),%xmm2\npaddd 96(%rsp),%xmm3\nmovd   %xmm0,%rcx\nmovd   %xmm1,%r8\nmovd   %xmm2,%r9\nmovd   %xmm3,%rax\npshufd $0x39,%xmm0,%xmm0\npshufd $0x39,%xmm1,%xmm1\npshufd $0x39,%xmm2,%xmm2\npshufd $0x39,%xmm3,%xmm3\nxorl 0(%rsi),%ecx\nxorl 48(%rsi),%r8d\nxorl 32(%rsi),%r9d\nxorl 16(%rsi),%eax\nmovl   %ecx,0(%rdi)\nmovl   %r8d,48(%rdi)\nmovl   %r9d,32(%rdi)\nmovl   %eax,16(%rdi)\nmovd   %xmm0,%rcx\nmovd   %xmm1,%r8\nmovd   %xmm2,%r9\nmovd   %xmm3,%rax\npshufd $0x39,%xmm0,%xmm0\npshufd $0x39,%xmm1,%xmm1\npshufd $0x39,%xmm2,%xmm2\npshufd $0x39,%xmm3,%xmm3\nxorl 20(%rsi),%ecx\nxorl 4(%rsi),%r8d\nxorl 52(%rsi),%r9d\nxorl 36(%rsi),%eax\nmovl   %ecx,20(%rdi)\nmovl   %r8d,4(%rdi)\nmovl   %r9d,52(%rdi)\nmovl   %eax,36(%rdi)\nmovd   %xmm0,%rcx\nmovd   %xmm1,%r8\nmovd   %xmm2,%r9\nmovd   %xmm3,%rax\npshufd $0x39,%xmm0,%xmm0\npshufd $0x39,%xmm1,%xmm1\npshufd $0x39,%xmm2,%xmm2\npshufd $0x39,%xmm3,%xmm3\nxorl 40(%rsi),%ecx\nxorl 24(%rsi),%r8d\nxorl 8(%rsi),%r9d\nxorl 56(%rsi),%eax\nmovl   %ecx,40(%rdi)\nmovl   %r8d,24(%rdi)\nmovl   %r9d,8(%rdi)\nmovl   %eax,56(%rdi)\nmovd   %xmm0,%rcx\nmovd   %xmm1,%r8\nmovd   %xmm2,%r9\nmovd   %xmm3,%rax\nxorl 60(%rsi),%ecx\nxorl 44(%rsi),%r8d\nxorl 28(%rsi),%r9d\nxorl 12(%rsi),%eax\nmovl   %ecx,60(%rdi)\nmovl   %r8d,44(%rdi)\nmovl   %r9d,28(%rdi)\nmovl   %eax,12(%rdi)\nmovq 480(%rsp),%r9\nmovq 472(%rsp),%rcx\nadd  $1,%rcx\nmov  %rcx,%r8\nshr  $32,%r8\nmovl %ecx,80(%rsp)\nmovl %r8d,4+96(%rsp)\nmovq %rcx,472(%rsp)\ncmp  $64,%r9\nja ._bytesatleast65\njae ._bytesatleast64\nmov  %rdi,%rsi\nmov  %rdx,%rdi\nmov  %r9,%rcx\nrep movsb\n\n._bytesatleast64:\n._done:\nmovq 416(%rsp),%r11\nmovq 424(%rsp),%r12\nmovq 432(%rsp),%r13\nmovq 440(%rsp),%r14\nmovq 448(%rsp),%r15\nmovq 456(%rsp),%rbx\nmovq 464(%rsp),%rbp\nadd %r11,%rsp\nxor %rax,%rax\nmov %rsi,%rdx\nret\n\n._bytesatleast65:\nsub  $64,%r9\nadd  $64,%rdi\nadd  $64,%rsi\njmp ._bytesbetween1and255\n\n#endif\n\n#if defined(__linux__) && defined(__ELF__)\n.section .note.GNU-stack,\"\",%progbits\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/salsa20/ref/stream_salsa20_ref.c",
    "content": "/*\nversion 20140420\nD. J. Bernstein\nPublic domain.\n*/\n\n#include \"crypto_core_salsa20.h\"\n#include \"crypto_stream_salsa20.h\"\n#include \"utils.h\"\n\n#ifndef HAVE_AMD64_ASM\n\ntypedef unsigned int uint32;\n\nstatic const unsigned char sigma[16] = {\n    'e', 'x', 'p', 'a', 'n', 'd', ' ', '3', '2', '-', 'b', 'y', 't', 'e', ' ', 'k'\n};\n\nint crypto_stream_salsa20(\n        unsigned char *c,unsigned long long clen,\n  const unsigned char *n,\n  const unsigned char *k\n)\n{\n  unsigned char in[16];\n  unsigned char block[64];\n  unsigned char kcopy[32];\n  unsigned int i;\n  unsigned int u;\n\n  if (!clen) return 0;\n\n  for (i = 0;i < 32;++i) kcopy[i] = k[i];\n  for (i = 0;i < 8;++i) in[i] = n[i];\n  for (i = 8;i < 16;++i) in[i] = 0;\n\n  while (clen >= 64) {\n    crypto_core_salsa20(c,in,kcopy,sigma);\n\n    u = 1;\n    for (i = 8;i < 16;++i) {\n      u += (unsigned int) in[i];\n      in[i] = u;\n      u >>= 8;\n    }\n\n    clen -= 64;\n    c += 64;\n  }\n\n  if (clen) {\n    crypto_core_salsa20(block,in,kcopy,sigma);\n    for (i = 0;i < (unsigned int) clen;++i) c[i] = block[i];\n  }\n  sodium_memzero(block, sizeof block);\n  sodium_memzero(kcopy, sizeof kcopy);\n\n  return 0;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/salsa20/ref/xor_salsa20_ref.c",
    "content": "/*\nversion 20140420\nD. J. Bernstein\nPublic domain.\n*/\n\n#include <stdint.h>\n\n#include \"crypto_core_salsa20.h\"\n#include \"crypto_stream_salsa20.h\"\n#include \"utils.h\"\n\n#ifndef HAVE_AMD64_ASM\n\ntypedef unsigned int uint32;\n\nstatic const unsigned char sigma[16] = {\n    'e', 'x', 'p', 'a', 'n', 'd', ' ', '3', '2', '-', 'b', 'y', 't', 'e', ' ', 'k'\n};\n\nint crypto_stream_salsa20_xor_ic(\n        unsigned char *c,\n  const unsigned char *m,unsigned long long mlen,\n  const unsigned char *n, uint64_t ic,\n  const unsigned char *k\n)\n{\n  unsigned char in[16];\n  unsigned char block[64];\n  unsigned char kcopy[32];\n  unsigned int i;\n  unsigned int u;\n\n  if (!mlen) return 0;\n\n  for (i = 0;i < 32;++i) kcopy[i] = k[i];\n  for (i = 0;i < 8;++i) in[i] = n[i];\n  for (i = 8;i < 16;++i) {\n      in[i] = (unsigned char) (ic & 0xff);\n      ic >>= 8;\n  }\n\n  while (mlen >= 64) {\n    crypto_core_salsa20(block,in,kcopy,sigma);\n    for (i = 0;i < 64;++i) c[i] = m[i] ^ block[i];\n\n    u = 1;\n    for (i = 8;i < 16;++i) {\n      u += (unsigned int) in[i];\n      in[i] = u;\n      u >>= 8;\n    }\n\n    mlen -= 64;\n    c += 64;\n    m += 64;\n  }\n\n  if (mlen) {\n    crypto_core_salsa20(block,in,kcopy,sigma);\n    for (i = 0;i < (unsigned int) mlen;++i) c[i] = m[i] ^ block[i];\n  }\n  sodium_memzero(block, sizeof block);\n  sodium_memzero(kcopy, sizeof kcopy);\n\n  return 0;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/salsa20/stream_salsa20_api.c",
    "content": "#include \"crypto_stream_salsa20.h\"\n\nsize_t\ncrypto_stream_salsa20_keybytes(void) {\n    return crypto_stream_salsa20_KEYBYTES;\n}\n\nsize_t\ncrypto_stream_salsa20_noncebytes(void) {\n    return crypto_stream_salsa20_NONCEBYTES;\n}\n\nint\ncrypto_stream_salsa20_xor(unsigned char *c, const unsigned char *m,\n                          unsigned long long mlen, const unsigned char *n,\n                          const unsigned char *k)\n{\n    return crypto_stream_salsa20_xor_ic(c, m, mlen, n, 0U, k);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/salsa2012/ref/stream_salsa2012.c",
    "content": "/*\nversion 20140420\nD. J. Bernstein\nPublic domain.\n*/\n\n#include \"crypto_core_salsa2012.h\"\n#include \"crypto_stream_salsa2012.h\"\n#include \"utils.h\"\n\ntypedef unsigned int uint32;\n\nstatic const unsigned char sigma[16] = {\n    'e', 'x', 'p', 'a', 'n', 'd', ' ', '3', '2', '-', 'b', 'y', 't', 'e', ' ', 'k'\n};\n\nint crypto_stream_salsa2012(\n        unsigned char *c,unsigned long long clen,\n  const unsigned char *n,\n  const unsigned char *k\n)\n{\n  unsigned char in[16];\n  unsigned char block[64];\n  unsigned char kcopy[32];\n  unsigned int i;\n  unsigned int u;\n\n  if (!clen) return 0;\n\n  for (i = 0;i < 32;++i) kcopy[i] = k[i];\n  for (i = 0;i < 8;++i) in[i] = n[i];\n  for (i = 8;i < 16;++i) in[i] = 0;\n\n  while (clen >= 64) {\n    crypto_core_salsa2012(c,in,kcopy,sigma);\n\n    u = 1;\n    for (i = 8;i < 16;++i) {\n      u += (unsigned int) in[i];\n      in[i] = u;\n      u >>= 8;\n    }\n\n    clen -= 64;\n    c += 64;\n  }\n\n  if (clen) {\n    crypto_core_salsa2012(block,in,kcopy,sigma);\n    for (i = 0;i < (unsigned int) clen;++i) c[i] = block[i];\n  }\n  sodium_memzero(block, sizeof block);\n  sodium_memzero(kcopy, sizeof kcopy);\n\n  return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/salsa2012/ref/xor_salsa2012.c",
    "content": "/*\nversion 20140420\nD. J. Bernstein\nPublic domain.\n*/\n\n#include \"crypto_core_salsa2012.h\"\n#include \"crypto_stream_salsa2012.h\"\n#include \"utils.h\"\n\ntypedef unsigned int uint32;\n\nstatic const unsigned char sigma[16] = {\n    'e', 'x', 'p', 'a', 'n', 'd', ' ', '3', '2', '-', 'b', 'y', 't', 'e', ' ', 'k'\n};\n\nint crypto_stream_salsa2012_xor(\n        unsigned char *c,\n  const unsigned char *m,unsigned long long mlen,\n  const unsigned char *n,\n  const unsigned char *k\n)\n{\n  unsigned char in[16];\n  unsigned char block[64];\n  unsigned char kcopy[32];\n  unsigned int i;\n  unsigned int u;\n\n  if (!mlen) return 0;\n\n  for (i = 0;i < 32;++i) kcopy[i] = k[i];\n  for (i = 0;i < 8;++i) in[i] = n[i];\n  for (i = 8;i < 16;++i) in[i] = 0;\n\n  while (mlen >= 64) {\n    crypto_core_salsa2012(block,in,kcopy,sigma);\n    for (i = 0;i < 64;++i) c[i] = m[i] ^ block[i];\n\n    u = 1;\n    for (i = 8;i < 16;++i) {\n      u += (unsigned int) in[i];\n      in[i] = u;\n      u >>= 8;\n    }\n\n    mlen -= 64;\n    c += 64;\n    m += 64;\n  }\n\n  if (mlen) {\n    crypto_core_salsa2012(block,in,kcopy,sigma);\n    for (i = 0;i < (unsigned int) mlen;++i) c[i] = m[i] ^ block[i];\n  }\n  sodium_memzero(block, sizeof block);\n  sodium_memzero(kcopy, sizeof kcopy);\n\n  return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/salsa2012/stream_salsa2012_api.c",
    "content": "#include \"crypto_stream_salsa2012.h\"\n\nsize_t\ncrypto_stream_salsa2012_keybytes(void) {\n    return crypto_stream_salsa2012_KEYBYTES;\n}\n\nsize_t\ncrypto_stream_salsa2012_noncebytes(void) {\n    return crypto_stream_salsa2012_NONCEBYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/salsa208/ref/stream_salsa208.c",
    "content": "/*\nversion 20140420\nD. J. Bernstein\nPublic domain.\n*/\n\n#include \"crypto_core_salsa208.h\"\n#include \"crypto_stream_salsa208.h\"\n#include \"utils.h\"\n\ntypedef unsigned int uint32;\n\nstatic const unsigned char sigma[16] = {\n        'e', 'x', 'p', 'a', 'n', 'd', ' ', '3', '2', '-', 'b', 'y', 't', 'e', ' ', 'k'\n};\n\nint crypto_stream_salsa208(\n        unsigned char *c,unsigned long long clen,\n  const unsigned char *n,\n  const unsigned char *k\n)\n{\n  unsigned char in[16];\n  unsigned char block[64];\n  unsigned char kcopy[32];\n  unsigned int i;\n  unsigned int u;\n\n  if (!clen) return 0;\n\n  for (i = 0;i < 32;++i) kcopy[i] = k[i];\n  for (i = 0;i < 8;++i) in[i] = n[i];\n  for (i = 8;i < 16;++i) in[i] = 0;\n\n  while (clen >= 64) {\n    crypto_core_salsa208(c,in,kcopy,sigma);\n\n    u = 1;\n    for (i = 8;i < 16;++i) {\n      u += (unsigned int) in[i];\n      in[i] = u;\n      u >>= 8;\n    }\n\n    clen -= 64;\n    c += 64;\n  }\n\n  if (clen) {\n    crypto_core_salsa208(block,in,kcopy,sigma);\n    for (i = 0;i < (unsigned int) clen;++i) c[i] = block[i];\n  }\n  sodium_memzero(block, sizeof block);\n  sodium_memzero(kcopy, sizeof kcopy);\n\n  return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/salsa208/ref/xor_salsa208.c",
    "content": "/*\nversion 20140420\nD. J. Bernstein\nPublic domain.\n*/\n\n#include \"crypto_core_salsa208.h\"\n#include \"crypto_stream_salsa208.h\"\n#include \"utils.h\"\n\ntypedef unsigned int uint32;\n\nstatic const unsigned char sigma[16] = {\n    'e', 'x', 'p', 'a', 'n', 'd', ' ', '3', '2', '-', 'b', 'y', 't', 'e', ' ', 'k'\n};\n\nint crypto_stream_salsa208_xor(\n        unsigned char *c,\n  const unsigned char *m,unsigned long long mlen,\n  const unsigned char *n,\n  const unsigned char *k\n)\n{\n  unsigned char in[16];\n  unsigned char block[64];\n  unsigned char kcopy[32];\n  unsigned int i;\n  unsigned int u;\n\n  if (!mlen) return 0;\n\n  for (i = 0;i < 32;++i) kcopy[i] = k[i];\n  for (i = 0;i < 8;++i) in[i] = n[i];\n  for (i = 8;i < 16;++i) in[i] = 0;\n\n  while (mlen >= 64) {\n    crypto_core_salsa208(block,in,kcopy,sigma);\n    for (i = 0;i < 64;++i) c[i] = m[i] ^ block[i];\n\n    u = 1;\n    for (i = 8;i < 16;++i) {\n      u += (unsigned int) in[i];\n      in[i] = u;\n      u >>= 8;\n    }\n\n    mlen -= 64;\n    c += 64;\n    m += 64;\n  }\n\n  if (mlen) {\n    crypto_core_salsa208(block,in,kcopy,sigma);\n    for (i = 0;i < (unsigned int) mlen;++i) c[i] = m[i] ^ block[i];\n  }\n  sodium_memzero(block, sizeof block);\n  sodium_memzero(kcopy, sizeof kcopy);\n\n  return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/salsa208/stream_salsa208_api.c",
    "content": "#include \"crypto_stream_salsa208.h\"\n\nsize_t\ncrypto_stream_salsa208_keybytes(void) {\n    return crypto_stream_salsa208_KEYBYTES;\n}\n\nsize_t\ncrypto_stream_salsa208_noncebytes(void) {\n    return crypto_stream_salsa208_NONCEBYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/xsalsa20/ref/stream_xsalsa20.c",
    "content": "/*\nversion 20080914\nD. J. Bernstein\nPublic domain.\n*/\n\n#include \"crypto_core_hsalsa20.h\"\n#include \"crypto_stream_salsa20.h\"\n#include \"crypto_stream_xsalsa20.h\"\n#include \"utils.h\"\n\nstatic const unsigned char sigma[16] = {\n    'e', 'x', 'p', 'a', 'n', 'd', ' ', '3', '2', '-', 'b', 'y', 't', 'e', ' ', 'k'\n};\n\nint crypto_stream_xsalsa20(\n        unsigned char *c,unsigned long long clen,\n  const unsigned char *n,\n  const unsigned char *k\n)\n{\n  unsigned char subkey[32];\n  int ret;\n  crypto_core_hsalsa20(subkey,n,k,sigma);\n  ret = crypto_stream_salsa20(c,clen,n + 16,subkey);\n  sodium_memzero(subkey, sizeof subkey);\n  return ret;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/xsalsa20/ref/xor_xsalsa20.c",
    "content": "/*\nversion 20080913\nD. J. Bernstein\nPublic domain.\n*/\n\n#include \"crypto_core_hsalsa20.h\"\n#include \"crypto_stream_salsa20.h\"\n#include \"crypto_stream_xsalsa20.h\"\n#include \"utils.h\"\n\nstatic const unsigned char sigma[16] = {\n    'e', 'x', 'p', 'a', 'n', 'd', ' ', '3', '2', '-', 'b', 'y', 't', 'e', ' ', 'k'\n};\n\nint crypto_stream_xsalsa20_xor_ic(\n        unsigned char *c,\n  const unsigned char *m,unsigned long long mlen,\n  const unsigned char *n,uint64_t ic,\n  const unsigned char *k\n)\n{\n  unsigned char subkey[32];\n  int ret;\n  crypto_core_hsalsa20(subkey,n,k,sigma);\n  ret = crypto_stream_salsa20_xor_ic(c,m,mlen,n + 16,ic,subkey);\n  sodium_memzero(subkey, sizeof subkey);\n  return ret;\n}\n\nint crypto_stream_xsalsa20_xor(\n        unsigned char *c,\n  const unsigned char *m,unsigned long long mlen,\n  const unsigned char *n,\n  const unsigned char *k\n)\n{\n  return crypto_stream_xsalsa20_xor_ic(c, m, mlen, n, 0ULL, k);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_stream/xsalsa20/stream_xsalsa20_api.c",
    "content": "#include \"crypto_stream_xsalsa20.h\"\n\nsize_t\ncrypto_stream_xsalsa20_keybytes(void) {\n    return crypto_stream_xsalsa20_KEYBYTES;\n}\n\nsize_t\ncrypto_stream_xsalsa20_noncebytes(void) {\n    return crypto_stream_xsalsa20_NONCEBYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_verify/16/ref/verify_16.c",
    "content": "\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"crypto_verify_16.h\"\n\nint\ncrypto_verify_16(const unsigned char *x, const unsigned char *y)\n{\n    uint_fast16_t d = 0U;\n    int           i;\n\n    for (i = 0; i < 16; i++) {\n        d |= x[i] ^ y[i];\n    }\n    return (1 & ((d - 1) >> 8)) - 1;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_verify/16/verify_16_api.c",
    "content": "#include \"crypto_verify_16.h\"\n\nsize_t\ncrypto_verify_16_bytes(void) {\n    return crypto_verify_16_BYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_verify/32/ref/verify_32.c",
    "content": "\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"crypto_verify_32.h\"\n\nint\ncrypto_verify_32(const unsigned char *x, const unsigned char *y)\n{\n    uint_fast16_t d = 0U;\n    int           i;\n\n    for (i = 0; i < 32; i++) {\n        d |= x[i] ^ y[i];\n    }\n    return (1 & ((d - 1) >> 8)) - 1;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_verify/32/verify_32_api.c",
    "content": "#include \"crypto_verify_32.h\"\n\nsize_t\ncrypto_verify_32_bytes(void) {\n    return crypto_verify_32_BYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_verify/64/ref/verify_64.c",
    "content": "\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"crypto_verify_64.h\"\n\nint\ncrypto_verify_64(const unsigned char *x, const unsigned char *y)\n{\n    uint_fast16_t d = 0U;\n    int           i;\n\n    for (i = 0; i < 64; i++) {\n        d |= x[i] ^ y[i];\n    }\n    return (1 & ((d - 1) >> 8)) - 1;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/crypto_verify/64/verify_64_api.c",
    "content": "#include \"crypto_verify_64.h\"\n\nsize_t\ncrypto_verify_64_bytes(void) {\n    return crypto_verify_64_BYTES;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/Makefile.am",
    "content": "\nSODIUM_EXPORT = \\\n\tsodium.h \\\n\tsodium/core.h \\\n\tsodium/crypto_aead_aes256gcm.h \\\n\tsodium/crypto_aead_chacha20poly1305.h \\\n\tsodium/crypto_auth.h \\\n\tsodium/crypto_auth_hmacsha256.h \\\n\tsodium/crypto_auth_hmacsha512.h \\\n\tsodium/crypto_auth_hmacsha512256.h \\\n\tsodium/crypto_box.h \\\n\tsodium/crypto_box_curve25519xsalsa20poly1305.h \\\n\tsodium/crypto_core_hsalsa20.h \\\n\tsodium/crypto_core_salsa20.h \\\n\tsodium/crypto_core_salsa2012.h \\\n\tsodium/crypto_core_salsa208.h \\\n\tsodium/crypto_generichash.h \\\n\tsodium/crypto_generichash_blake2b.h \\\n\tsodium/crypto_hash.h \\\n\tsodium/crypto_hash_sha256.h \\\n\tsodium/crypto_hash_sha512.h \\\n\tsodium/crypto_onetimeauth.h \\\n\tsodium/crypto_onetimeauth_poly1305.h \\\n\tsodium/crypto_pwhash_scryptsalsa208sha256.h \\\n\tsodium/crypto_scalarmult.h \\\n\tsodium/crypto_scalarmult_curve25519.h \\\n\tsodium/crypto_secretbox.h \\\n\tsodium/crypto_secretbox_xsalsa20poly1305.h \\\n\tsodium/crypto_shorthash.h \\\n\tsodium/crypto_shorthash_siphash24.h \\\n\tsodium/crypto_sign.h \\\n\tsodium/crypto_sign_ed25519.h \\\n\tsodium/crypto_sign_edwards25519sha512batch.h \\\n\tsodium/crypto_stream.h \\\n\tsodium/crypto_stream_aes128ctr.h \\\n\tsodium/crypto_stream_chacha20.h \\\n\tsodium/crypto_stream_salsa20.h \\\n\tsodium/crypto_stream_salsa2012.h \\\n\tsodium/crypto_stream_salsa208.h \\\n\tsodium/crypto_stream_xsalsa20.h \\\n\tsodium/crypto_int32.h \\\n\tsodium/crypto_int64.h \\\n\tsodium/crypto_uint16.h \\\n\tsodium/crypto_uint32.h \\\n\tsodium/crypto_uint64.h \\\n\tsodium/crypto_uint8.h \\\n\tsodium/crypto_verify_16.h \\\n\tsodium/crypto_verify_32.h \\\n\tsodium/crypto_verify_64.h \\\n\tsodium/export.h \\\n\tsodium/randombytes.h \\\n\tsodium/randombytes_salsa20_random.h \\\n\tsodium/randombytes_sysrandom.h \\\n\tsodium/runtime.h \\\n\tsodium/utils.h\n\nif NATIVECLIENT\nSODIUM_EXPORT += \\\n\tsodium/randombytes_nativeclient.h\nendif\n\nEXTRA_SRC = $(SODIUM_EXPORT) \\\n\tsodium/version.h.in\n\nnoinst_HEADERS = $(SODIUM_EXPORT) \\\n\tsodium/version.h\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/Makefile.in",
    "content": "# Makefile.in generated by automake 1.14.1 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2013 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\nam__is_gnu_make = test -n '$(MAKEFILE_LIST)' && test -n '$(MAKELEVEL)'\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\n@NATIVECLIENT_TRUE@am__append_1 = \\\n@NATIVECLIENT_TRUE@\tsodium/randombytes_nativeclient.h\n\nsubdir = src/libsodium/include\nDIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/Makefile.am \\\n\t$(am__noinst_HEADERS_DIST)\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \\\n\t$(top_srcdir)/m4/ax_check_define.m4 \\\n\t$(top_srcdir)/m4/ax_check_link_flag.m4 \\\n\t$(top_srcdir)/m4/ld-output-def.m4 $(top_srcdir)/m4/libtool.m4 \\\n\t$(top_srcdir)/m4/ltoptions.m4 $(top_srcdir)/m4/ltsugar.m4 \\\n\t$(top_srcdir)/m4/ltversion.m4 $(top_srcdir)/m4/lt~obsolete.m4 \\\n\t$(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nmkinstalldirs = $(install_sh) -d\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nSOURCES =\nDIST_SOURCES =\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nam__noinst_HEADERS_DIST = sodium.h sodium/core.h \\\n\tsodium/crypto_aead_aes256gcm.h \\\n\tsodium/crypto_aead_chacha20poly1305.h sodium/crypto_auth.h \\\n\tsodium/crypto_auth_hmacsha256.h \\\n\tsodium/crypto_auth_hmacsha512.h \\\n\tsodium/crypto_auth_hmacsha512256.h sodium/crypto_box.h \\\n\tsodium/crypto_box_curve25519xsalsa20poly1305.h \\\n\tsodium/crypto_core_hsalsa20.h sodium/crypto_core_salsa20.h \\\n\tsodium/crypto_core_salsa2012.h sodium/crypto_core_salsa208.h \\\n\tsodium/crypto_generichash.h \\\n\tsodium/crypto_generichash_blake2b.h sodium/crypto_hash.h \\\n\tsodium/crypto_hash_sha256.h sodium/crypto_hash_sha512.h \\\n\tsodium/crypto_onetimeauth.h \\\n\tsodium/crypto_onetimeauth_poly1305.h \\\n\tsodium/crypto_pwhash_scryptsalsa208sha256.h \\\n\tsodium/crypto_scalarmult.h \\\n\tsodium/crypto_scalarmult_curve25519.h \\\n\tsodium/crypto_secretbox.h \\\n\tsodium/crypto_secretbox_xsalsa20poly1305.h \\\n\tsodium/crypto_shorthash.h sodium/crypto_shorthash_siphash24.h \\\n\tsodium/crypto_sign.h sodium/crypto_sign_ed25519.h \\\n\tsodium/crypto_sign_edwards25519sha512batch.h \\\n\tsodium/crypto_stream.h sodium/crypto_stream_aes128ctr.h \\\n\tsodium/crypto_stream_chacha20.h sodium/crypto_stream_salsa20.h \\\n\tsodium/crypto_stream_salsa2012.h \\\n\tsodium/crypto_stream_salsa208.h \\\n\tsodium/crypto_stream_xsalsa20.h sodium/crypto_int32.h \\\n\tsodium/crypto_int64.h sodium/crypto_uint16.h \\\n\tsodium/crypto_uint32.h sodium/crypto_uint64.h \\\n\tsodium/crypto_uint8.h sodium/crypto_verify_16.h \\\n\tsodium/crypto_verify_32.h sodium/crypto_verify_64.h \\\n\tsodium/export.h sodium/randombytes.h \\\n\tsodium/randombytes_salsa20_random.h \\\n\tsodium/randombytes_sysrandom.h sodium/runtime.h sodium/utils.h \\\n\tsodium/randombytes_nativeclient.h sodium/version.h\nHEADERS = $(noinst_HEADERS)\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAR = @AR@\nAS = @AS@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCAS = @CCAS@\nCCASDEPMODE = @CCASDEPMODE@\nCCASFLAGS = @CCASFLAGS@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCFLAGS_AESNI = @CFLAGS_AESNI@\nCFLAGS_MMX = @CFLAGS_MMX@\nCFLAGS_PCLMUL = @CFLAGS_PCLMUL@\nCFLAGS_SSE2 = @CFLAGS_SSE2@\nCFLAGS_SSE3 = @CFLAGS_SSE3@\nCFLAGS_SSE41 = @CFLAGS_SSE41@\nCFLAGS_SSSE3 = @CFLAGS_SSSE3@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCWFLAGS = @CWFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDLLTOOL = @DLLTOOL@\nDLL_VERSION = @DLL_VERSION@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nHAVE_AMD64_ASM_V = @HAVE_AMD64_ASM_V@\nHAVE_AVX_ASM_V = @HAVE_AVX_ASM_V@\nHAVE_CPUID_V = @HAVE_CPUID_V@\nHAVE_TI_MODE_V = @HAVE_TI_MODE_V@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nISODATE = @ISODATE@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIBTOOL_DEPS = @LIBTOOL_DEPS@\nLIBTOOL_EXTRA_FLAGS = @LIBTOOL_EXTRA_FLAGS@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMANIFEST_TOOL = @MANIFEST_TOOL@\nMKDIR_P = @MKDIR_P@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nRANLIB = @RANLIB@\nSAFECODE_HOME = @SAFECODE_HOME@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSODIUM_LIBRARY_VERSION = @SODIUM_LIBRARY_VERSION@\nSODIUM_LIBRARY_VERSION_MAJOR = @SODIUM_LIBRARY_VERSION_MAJOR@\nSODIUM_LIBRARY_VERSION_MINOR = @SODIUM_LIBRARY_VERSION_MINOR@\nSTRIP = @STRIP@\nTEST_LDFLAGS = @TEST_LDFLAGS@\nVERSION = @VERSION@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_AR = @ac_ct_AR@\nac_ct_CC = @ac_ct_CC@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nSODIUM_EXPORT = sodium.h sodium/core.h sodium/crypto_aead_aes256gcm.h \\\n\tsodium/crypto_aead_chacha20poly1305.h sodium/crypto_auth.h \\\n\tsodium/crypto_auth_hmacsha256.h \\\n\tsodium/crypto_auth_hmacsha512.h \\\n\tsodium/crypto_auth_hmacsha512256.h sodium/crypto_box.h \\\n\tsodium/crypto_box_curve25519xsalsa20poly1305.h \\\n\tsodium/crypto_core_hsalsa20.h sodium/crypto_core_salsa20.h \\\n\tsodium/crypto_core_salsa2012.h sodium/crypto_core_salsa208.h \\\n\tsodium/crypto_generichash.h \\\n\tsodium/crypto_generichash_blake2b.h sodium/crypto_hash.h \\\n\tsodium/crypto_hash_sha256.h sodium/crypto_hash_sha512.h \\\n\tsodium/crypto_onetimeauth.h \\\n\tsodium/crypto_onetimeauth_poly1305.h \\\n\tsodium/crypto_pwhash_scryptsalsa208sha256.h \\\n\tsodium/crypto_scalarmult.h \\\n\tsodium/crypto_scalarmult_curve25519.h \\\n\tsodium/crypto_secretbox.h \\\n\tsodium/crypto_secretbox_xsalsa20poly1305.h \\\n\tsodium/crypto_shorthash.h sodium/crypto_shorthash_siphash24.h \\\n\tsodium/crypto_sign.h sodium/crypto_sign_ed25519.h \\\n\tsodium/crypto_sign_edwards25519sha512batch.h \\\n\tsodium/crypto_stream.h sodium/crypto_stream_aes128ctr.h \\\n\tsodium/crypto_stream_chacha20.h sodium/crypto_stream_salsa20.h \\\n\tsodium/crypto_stream_salsa2012.h \\\n\tsodium/crypto_stream_salsa208.h \\\n\tsodium/crypto_stream_xsalsa20.h sodium/crypto_int32.h \\\n\tsodium/crypto_int64.h sodium/crypto_uint16.h \\\n\tsodium/crypto_uint32.h sodium/crypto_uint64.h \\\n\tsodium/crypto_uint8.h sodium/crypto_verify_16.h \\\n\tsodium/crypto_verify_32.h sodium/crypto_verify_64.h \\\n\tsodium/export.h sodium/randombytes.h \\\n\tsodium/randombytes_salsa20_random.h \\\n\tsodium/randombytes_sysrandom.h sodium/runtime.h sodium/utils.h \\\n\t$(am__append_1)\nEXTRA_SRC = $(SODIUM_EXPORT) \\\n\tsodium/version.h.in\n\nnoinst_HEADERS = $(SODIUM_EXPORT) \\\n\tsodium/version.h\n\nall: all-am\n\n.SUFFIXES:\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/libsodium/include/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign src/libsodium/include/Makefile\n.PRECIOUS: Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-am\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-am\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscopelist: cscopelist-am\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(HEADERS)\ninstalldirs:\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-generic clean-libtool mostlyclean-am\n\ndistclean: distclean-am\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-generic distclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-generic mostlyclean-libtool\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am:\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \\\n\tclean-libtool cscopelist-am ctags ctags-am distclean \\\n\tdistclean-generic distclean-libtool distclean-tags distdir dvi \\\n\tdvi-am html html-am info info-am install install-am \\\n\tinstall-data install-data-am install-dvi install-dvi-am \\\n\tinstall-exec install-exec-am install-html install-html-am \\\n\tinstall-info install-info-am install-man install-pdf \\\n\tinstall-pdf-am install-ps install-ps-am install-strip \\\n\tinstallcheck installcheck-am installdirs maintainer-clean \\\n\tmaintainer-clean-generic mostlyclean mostlyclean-generic \\\n\tmostlyclean-libtool pdf pdf-am ps ps-am tags tags-am uninstall \\\n\tuninstall-am\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/core.h",
    "content": "\n#ifndef sodium_core_H\n#define sodium_core_H\n\n#include \"export.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nSODIUM_EXPORT\nint sodium_init(void)\n            __attribute__ ((warn_unused_result));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_aead_aes256gcm.h",
    "content": "#ifndef crypto_aead_aes256gcm_H\n#define crypto_aead_aes256gcm_H\n\n#include <stddef.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\nSODIUM_EXPORT\nint crypto_aead_aes256gcm_is_available(void);\n\n#define crypto_aead_aes256gcm_KEYBYTES  32U\nSODIUM_EXPORT\nsize_t crypto_aead_aes256gcm_keybytes(void);\n\n#define crypto_aead_aes256gcm_NSECBYTES 0U\nSODIUM_EXPORT\nsize_t crypto_aead_aes256gcm_nsecbytes(void);\n\n#define crypto_aead_aes256gcm_NPUBBYTES 12U\nSODIUM_EXPORT\nsize_t crypto_aead_aes256gcm_npubbytes(void);\n\n#define crypto_aead_aes256gcm_ABYTES    16U\nSODIUM_EXPORT\nsize_t crypto_aead_aes256gcm_abytes(void);\n\ntypedef CRYPTO_ALIGN(16) unsigned char crypto_aead_aes256gcm_state[512];\nSODIUM_EXPORT\nsize_t crypto_aead_aes256gcm_statebytes(void);\n\nSODIUM_EXPORT\nint crypto_aead_aes256gcm_encrypt(unsigned char *c,\n                                  unsigned long long *clen_p,\n                                  const unsigned char *m,\n                                  unsigned long long mlen,\n                                  const unsigned char *ad,\n                                  unsigned long long adlen,\n                                  const unsigned char *nsec,\n                                  const unsigned char *npub,\n                                  const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_aead_aes256gcm_decrypt(unsigned char *m,\n                                  unsigned long long *mlen_p,\n                                  unsigned char *nsec,\n                                  const unsigned char *c,\n                                  unsigned long long clen,\n                                  const unsigned char *ad,\n                                  unsigned long long adlen,\n                                  const unsigned char *npub,\n                                  const unsigned char *k)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_aead_aes256gcm_beforenm(crypto_aead_aes256gcm_state *ctx_,\n                                   const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_aead_aes256gcm_encrypt_afternm(unsigned char *c,\n                                          unsigned long long *clen_p,\n                                          const unsigned char *m,\n                                          unsigned long long mlen,\n                                          const unsigned char *ad,\n                                          unsigned long long adlen,\n                                          const unsigned char *nsec,\n                                          const unsigned char *npub,\n                                          const crypto_aead_aes256gcm_state *ctx_);\n\nSODIUM_EXPORT\nint crypto_aead_aes256gcm_decrypt_afternm(unsigned char *m,\n                                          unsigned long long *mlen_p,\n                                          unsigned char *nsec,\n                                          const unsigned char *c,\n                                          unsigned long long clen,\n                                          const unsigned char *ad,\n                                          unsigned long long adlen,\n                                          const unsigned char *npub,\n                                          const crypto_aead_aes256gcm_state *ctx_)\n            __attribute__ ((warn_unused_result));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_aead_chacha20poly1305.h",
    "content": "#ifndef crypto_aead_chacha20poly1305_H\n#define crypto_aead_chacha20poly1305_H\n\n#include <stddef.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_aead_chacha20poly1305_KEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_aead_chacha20poly1305_keybytes(void);\n\n#define crypto_aead_chacha20poly1305_NSECBYTES 0U\nSODIUM_EXPORT\nsize_t crypto_aead_chacha20poly1305_nsecbytes(void);\n\n#define crypto_aead_chacha20poly1305_NPUBBYTES 8U\nSODIUM_EXPORT\nsize_t crypto_aead_chacha20poly1305_npubbytes(void);\n\n#define crypto_aead_chacha20poly1305_ABYTES 16U\nSODIUM_EXPORT\nsize_t crypto_aead_chacha20poly1305_abytes(void);\n\nSODIUM_EXPORT\nint crypto_aead_chacha20poly1305_encrypt(unsigned char *c,\n                                         unsigned long long *clen_p,\n                                         const unsigned char *m,\n                                         unsigned long long mlen,\n                                         const unsigned char *ad,\n                                         unsigned long long adlen,\n                                         const unsigned char *nsec,\n                                         const unsigned char *npub,\n                                         const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_aead_chacha20poly1305_decrypt(unsigned char *m,\n                                         unsigned long long *mlen_p,\n                                         unsigned char *nsec,\n                                         const unsigned char *c,\n                                         unsigned long long clen,\n                                         const unsigned char *ad,\n                                         unsigned long long adlen,\n                                         const unsigned char *npub,\n                                         const unsigned char *k)\n            __attribute__ ((warn_unused_result));\n\n#define crypto_aead_chacha20poly1305_IETF_NPUBBYTES 12U\nSODIUM_EXPORT\nsize_t crypto_aead_chacha20poly1305_ietf_npubbytes(void);\n\nSODIUM_EXPORT\nint crypto_aead_chacha20poly1305_ietf_encrypt(unsigned char *c,\n                                              unsigned long long *clen_p,\n                                              const unsigned char *m,\n                                              unsigned long long mlen,\n                                              const unsigned char *ad,\n                                              unsigned long long adlen,\n                                              const unsigned char *nsec,\n                                              const unsigned char *npub,\n                                              const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_aead_chacha20poly1305_ietf_decrypt(unsigned char *m,\n                                              unsigned long long *mlen_p,\n                                              unsigned char *nsec,\n                                              const unsigned char *c,\n                                              unsigned long long clen,\n                                              const unsigned char *ad,\n                                              unsigned long long adlen,\n                                              const unsigned char *npub,\n                                              const unsigned char *k)\n            __attribute__ ((warn_unused_result));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_auth.h",
    "content": "#ifndef crypto_auth_H\n#define crypto_auth_H\n\n#include <stddef.h>\n\n#include \"crypto_auth_hmacsha512256.h\"\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_auth_BYTES crypto_auth_hmacsha512256_BYTES\nSODIUM_EXPORT\nsize_t  crypto_auth_bytes(void);\n\n#define crypto_auth_KEYBYTES crypto_auth_hmacsha512256_KEYBYTES\nSODIUM_EXPORT\nsize_t  crypto_auth_keybytes(void);\n\n#define crypto_auth_PRIMITIVE \"hmacsha512256\"\nSODIUM_EXPORT\nconst char *crypto_auth_primitive(void);\n\nSODIUM_EXPORT\nint crypto_auth(unsigned char *out, const unsigned char *in,\n                unsigned long long inlen, const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_auth_verify(const unsigned char *h, const unsigned char *in,\n                       unsigned long long inlen, const unsigned char *k)\n            __attribute__ ((warn_unused_result));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_auth_hmacsha256.h",
    "content": "#ifndef crypto_auth_hmacsha256_H\n#define crypto_auth_hmacsha256_H\n\n#include <stddef.h>\n#include \"crypto_hash_sha256.h\"\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_auth_hmacsha256_BYTES 32U\nSODIUM_EXPORT\nsize_t crypto_auth_hmacsha256_bytes(void);\n\n#define crypto_auth_hmacsha256_KEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_auth_hmacsha256_keybytes(void);\n\nSODIUM_EXPORT\nint crypto_auth_hmacsha256(unsigned char *out,\n                           const unsigned char *in,\n                           unsigned long long inlen,\n                           const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_auth_hmacsha256_verify(const unsigned char *h,\n                                  const unsigned char *in,\n                                  unsigned long long inlen,\n                                  const unsigned char *k)\n            __attribute__ ((warn_unused_result));\n\n/* ------------------------------------------------------------------------- */\n\ntypedef struct crypto_auth_hmacsha256_state {\n    crypto_hash_sha256_state ictx;\n    crypto_hash_sha256_state octx;\n} crypto_auth_hmacsha256_state;\nSODIUM_EXPORT\nsize_t crypto_auth_hmacsha256_statebytes(void);\n\nSODIUM_EXPORT\nint crypto_auth_hmacsha256_init(crypto_auth_hmacsha256_state *state,\n                                const unsigned char *key,\n                                size_t keylen);\n\nSODIUM_EXPORT\nint crypto_auth_hmacsha256_update(crypto_auth_hmacsha256_state *state,\n                                  const unsigned char *in,\n                                  unsigned long long inlen);\n\nSODIUM_EXPORT\nint crypto_auth_hmacsha256_final(crypto_auth_hmacsha256_state *state,\n                                 unsigned char *out);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_auth_hmacsha512.h",
    "content": "#ifndef crypto_auth_hmacsha512_H\n#define crypto_auth_hmacsha512_H\n\n#include <stddef.h>\n#include \"crypto_hash_sha512.h\"\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_auth_hmacsha512_BYTES 64U\nSODIUM_EXPORT\nsize_t crypto_auth_hmacsha512_bytes(void);\n\n#define crypto_auth_hmacsha512_KEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_auth_hmacsha512_keybytes(void);\n\nSODIUM_EXPORT\nint crypto_auth_hmacsha512(unsigned char *out,\n                           const unsigned char *in,\n                           unsigned long long inlen,\n                           const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_auth_hmacsha512_verify(const unsigned char *h,\n                                  const unsigned char *in,\n                                  unsigned long long inlen,\n                                  const unsigned char *k)\n            __attribute__ ((warn_unused_result));\n\n/* ------------------------------------------------------------------------- */\n\ntypedef struct crypto_auth_hmacsha512_state {\n    crypto_hash_sha512_state ictx;\n    crypto_hash_sha512_state octx;\n} crypto_auth_hmacsha512_state;\nSODIUM_EXPORT\nsize_t crypto_auth_hmacsha512_statebytes(void);\n\nSODIUM_EXPORT\nint crypto_auth_hmacsha512_init(crypto_auth_hmacsha512_state *state,\n                                const unsigned char *key,\n                                size_t keylen);\n\nSODIUM_EXPORT\nint crypto_auth_hmacsha512_update(crypto_auth_hmacsha512_state *state,\n                                  const unsigned char *in,\n                                  unsigned long long inlen);\n\nSODIUM_EXPORT\nint crypto_auth_hmacsha512_final(crypto_auth_hmacsha512_state *state,\n                                 unsigned char *out);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_auth_hmacsha512256.h",
    "content": "#ifndef crypto_auth_hmacsha512256_H\n#define crypto_auth_hmacsha512256_H\n\n#include <stddef.h>\n#include \"crypto_auth_hmacsha512.h\"\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_auth_hmacsha512256_BYTES 32U\nSODIUM_EXPORT\nsize_t crypto_auth_hmacsha512256_bytes(void);\n\n#define crypto_auth_hmacsha512256_KEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_auth_hmacsha512256_keybytes(void);\n\nSODIUM_EXPORT\nint crypto_auth_hmacsha512256(unsigned char *out, const unsigned char *in,\n                              unsigned long long inlen,const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_auth_hmacsha512256_verify(const unsigned char *h,\n                                     const unsigned char *in,\n                                     unsigned long long inlen,\n                                     const unsigned char *k)\n            __attribute__ ((warn_unused_result));\n\n/* ------------------------------------------------------------------------- */\n\ntypedef crypto_auth_hmacsha512_state crypto_auth_hmacsha512256_state;\nSODIUM_EXPORT\nsize_t crypto_auth_hmacsha512256_statebytes(void);\n\nSODIUM_EXPORT\nint crypto_auth_hmacsha512256_init(crypto_auth_hmacsha512256_state *state,\n                                   const unsigned char *key,\n                                   size_t keylen);\n\nSODIUM_EXPORT\nint crypto_auth_hmacsha512256_update(crypto_auth_hmacsha512256_state *state,\n                                     const unsigned char *in,\n                                     unsigned long long inlen);\n\nSODIUM_EXPORT\nint crypto_auth_hmacsha512256_final(crypto_auth_hmacsha512256_state *state,\n                                    unsigned char *out);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_box.h",
    "content": "#ifndef crypto_box_H\n#define crypto_box_H\n\n/*\n * THREAD SAFETY: crypto_box_keypair() is thread-safe,\n * provided that you called sodium_init() once before using any\n * other libsodium function.\n * Other functions are always thread-safe.\n */\n\n#include <stddef.h>\n\n#include \"crypto_box_curve25519xsalsa20poly1305.h\"\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_box_SEEDBYTES crypto_box_curve25519xsalsa20poly1305_SEEDBYTES\nSODIUM_EXPORT\nsize_t  crypto_box_seedbytes(void);\n\n#define crypto_box_PUBLICKEYBYTES crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES\nSODIUM_EXPORT\nsize_t  crypto_box_publickeybytes(void);\n\n#define crypto_box_SECRETKEYBYTES crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES\nSODIUM_EXPORT\nsize_t  crypto_box_secretkeybytes(void);\n\n#define crypto_box_NONCEBYTES crypto_box_curve25519xsalsa20poly1305_NONCEBYTES\nSODIUM_EXPORT\nsize_t  crypto_box_noncebytes(void);\n\n#define crypto_box_MACBYTES crypto_box_curve25519xsalsa20poly1305_MACBYTES\nSODIUM_EXPORT\nsize_t  crypto_box_macbytes(void);\n\n#define crypto_box_PRIMITIVE \"curve25519xsalsa20poly1305\"\nSODIUM_EXPORT\nconst char *crypto_box_primitive(void);\n\nSODIUM_EXPORT\nint crypto_box_seed_keypair(unsigned char *pk, unsigned char *sk,\n                            const unsigned char *seed);\n\nSODIUM_EXPORT\nint crypto_box_keypair(unsigned char *pk, unsigned char *sk);\n\nSODIUM_EXPORT\nint crypto_box_easy(unsigned char *c, const unsigned char *m,\n                    unsigned long long mlen, const unsigned char *n,\n                    const unsigned char *pk, const unsigned char *sk)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_box_open_easy(unsigned char *m, const unsigned char *c,\n                         unsigned long long clen, const unsigned char *n,\n                         const unsigned char *pk, const unsigned char *sk)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_box_detached(unsigned char *c, unsigned char *mac,\n                        const unsigned char *m, unsigned long long mlen,\n                        const unsigned char *n, const unsigned char *pk,\n                        const unsigned char *sk)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_box_open_detached(unsigned char *m, const unsigned char *c,\n                             const unsigned char *mac,\n                             unsigned long long clen,\n                             const unsigned char *n,\n                             const unsigned char *pk,\n                             const unsigned char *sk)\n            __attribute__ ((warn_unused_result));\n\n/* -- Precomputation interface -- */\n\n#define crypto_box_BEFORENMBYTES crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES\nSODIUM_EXPORT\nsize_t  crypto_box_beforenmbytes(void);\n\nSODIUM_EXPORT\nint crypto_box_beforenm(unsigned char *k, const unsigned char *pk,\n                        const unsigned char *sk)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_box_easy_afternm(unsigned char *c, const unsigned char *m,\n                            unsigned long long mlen, const unsigned char *n,\n                            const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_box_open_easy_afternm(unsigned char *m, const unsigned char *c,\n                                 unsigned long long clen, const unsigned char *n,\n                                 const unsigned char *k)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_box_detached_afternm(unsigned char *c, unsigned char *mac,\n                                const unsigned char *m, unsigned long long mlen,\n                                const unsigned char *n, const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_box_open_detached_afternm(unsigned char *m, const unsigned char *c,\n                                     const unsigned char *mac,\n                                     unsigned long long clen, const unsigned char *n,\n                                     const unsigned char *k)\n            __attribute__ ((warn_unused_result));\n\n/* -- Ephemeral SK interface -- */\n\n#define crypto_box_SEALBYTES (crypto_box_PUBLICKEYBYTES + crypto_box_MACBYTES)\nSODIUM_EXPORT\nsize_t crypto_box_sealbytes(void);\n\nSODIUM_EXPORT\nint crypto_box_seal(unsigned char *c, const unsigned char *m,\n                    unsigned long long mlen, const unsigned char *pk);\n\nSODIUM_EXPORT\nint crypto_box_seal_open(unsigned char *m, const unsigned char *c,\n                         unsigned long long clen,\n                         const unsigned char *pk, const unsigned char *sk)\n            __attribute__ ((warn_unused_result));\n\n/* -- NaCl compatibility interface ; Requires padding -- */\n\n#define crypto_box_ZEROBYTES crypto_box_curve25519xsalsa20poly1305_ZEROBYTES\nSODIUM_EXPORT\nsize_t  crypto_box_zerobytes(void);\n\n#define crypto_box_BOXZEROBYTES crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES\nSODIUM_EXPORT\nsize_t  crypto_box_boxzerobytes(void);\n\nSODIUM_EXPORT\nint crypto_box(unsigned char *c, const unsigned char *m,\n               unsigned long long mlen, const unsigned char *n,\n               const unsigned char *pk, const unsigned char *sk)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_box_open(unsigned char *m, const unsigned char *c,\n                    unsigned long long clen, const unsigned char *n,\n                    const unsigned char *pk, const unsigned char *sk)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_box_afternm(unsigned char *c, const unsigned char *m,\n                       unsigned long long mlen, const unsigned char *n,\n                       const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_box_open_afternm(unsigned char *m, const unsigned char *c,\n                            unsigned long long clen, const unsigned char *n,\n                            const unsigned char *k)\n            __attribute__ ((warn_unused_result));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_box_curve25519xsalsa20poly1305.h",
    "content": "#ifndef crypto_box_curve25519xsalsa20poly1305_H\n#define crypto_box_curve25519xsalsa20poly1305_H\n\n#include <stddef.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_box_curve25519xsalsa20poly1305_SEEDBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_box_curve25519xsalsa20poly1305_seedbytes(void);\n\n#define crypto_box_curve25519xsalsa20poly1305_PUBLICKEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_box_curve25519xsalsa20poly1305_publickeybytes(void);\n\n#define crypto_box_curve25519xsalsa20poly1305_SECRETKEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_box_curve25519xsalsa20poly1305_secretkeybytes(void);\n\n#define crypto_box_curve25519xsalsa20poly1305_BEFORENMBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_box_curve25519xsalsa20poly1305_beforenmbytes(void);\n\n#define crypto_box_curve25519xsalsa20poly1305_NONCEBYTES 24U\nSODIUM_EXPORT\nsize_t crypto_box_curve25519xsalsa20poly1305_noncebytes(void);\n\n#define crypto_box_curve25519xsalsa20poly1305_ZEROBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_box_curve25519xsalsa20poly1305_zerobytes(void);\n\n#define crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES 16U\nSODIUM_EXPORT\nsize_t crypto_box_curve25519xsalsa20poly1305_boxzerobytes(void);\n\n#define crypto_box_curve25519xsalsa20poly1305_MACBYTES \\\n    (crypto_box_curve25519xsalsa20poly1305_ZEROBYTES - \\\n     crypto_box_curve25519xsalsa20poly1305_BOXZEROBYTES)\nSODIUM_EXPORT\nsize_t crypto_box_curve25519xsalsa20poly1305_macbytes(void);\n\nSODIUM_EXPORT\nint crypto_box_curve25519xsalsa20poly1305(unsigned char *c,\n                                          const unsigned char *m,\n                                          unsigned long long mlen,\n                                          const unsigned char *n,\n                                          const unsigned char *pk,\n                                          const unsigned char *sk)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_box_curve25519xsalsa20poly1305_open(unsigned char *m,\n                                               const unsigned char *c,\n                                               unsigned long long clen,\n                                               const unsigned char *n,\n                                               const unsigned char *pk,\n                                               const unsigned char *sk)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_box_curve25519xsalsa20poly1305_seed_keypair(unsigned char *pk,\n                                                       unsigned char *sk,\n                                                       const unsigned char *seed);\n\nSODIUM_EXPORT\nint crypto_box_curve25519xsalsa20poly1305_keypair(unsigned char *pk,\n                                                  unsigned char *sk);\n\nSODIUM_EXPORT\nint crypto_box_curve25519xsalsa20poly1305_beforenm(unsigned char *k,\n                                                   const unsigned char *pk,\n                                                   const unsigned char *sk)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_box_curve25519xsalsa20poly1305_afternm(unsigned char *c,\n                                                  const unsigned char *m,\n                                                  unsigned long long mlen,\n                                                  const unsigned char *n,\n                                                  const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_box_curve25519xsalsa20poly1305_open_afternm(unsigned char *m,\n                                                       const unsigned char *c,\n                                                       unsigned long long clen,\n                                                       const unsigned char *n,\n                                                       const unsigned char *k)\n            __attribute__ ((warn_unused_result));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_core_hsalsa20.h",
    "content": "#ifndef crypto_core_hsalsa20_H\n#define crypto_core_hsalsa20_H\n\n#include <stddef.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define crypto_core_hsalsa20_OUTPUTBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_core_hsalsa20_outputbytes(void);\n\n#define crypto_core_hsalsa20_INPUTBYTES 16U\nSODIUM_EXPORT\nsize_t crypto_core_hsalsa20_inputbytes(void);\n\n#define crypto_core_hsalsa20_KEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_core_hsalsa20_keybytes(void);\n\n#define crypto_core_hsalsa20_CONSTBYTES 16U\nSODIUM_EXPORT\nsize_t crypto_core_hsalsa20_constbytes(void);\n\nSODIUM_EXPORT\nint crypto_core_hsalsa20(unsigned char *out, const unsigned char *in,\n                         const unsigned char *k, const unsigned char *c);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_core_salsa20.h",
    "content": "#ifndef crypto_core_salsa20_H\n#define crypto_core_salsa20_H\n\n#include <stddef.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define crypto_core_salsa20_OUTPUTBYTES 64U\nSODIUM_EXPORT\nsize_t crypto_core_salsa20_outputbytes(void);\n\n#define crypto_core_salsa20_INPUTBYTES 16U\nSODIUM_EXPORT\nsize_t crypto_core_salsa20_inputbytes(void);\n\n#define crypto_core_salsa20_KEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_core_salsa20_keybytes(void);\n\n#define crypto_core_salsa20_CONSTBYTES 16U\nSODIUM_EXPORT\nsize_t crypto_core_salsa20_constbytes(void);\n\nSODIUM_EXPORT\nint crypto_core_salsa20(unsigned char *out, const unsigned char *in,\n                        const unsigned char *k, const unsigned char *c);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_core_salsa2012.h",
    "content": "#ifndef crypto_core_salsa2012_H\n#define crypto_core_salsa2012_H\n\n#include <stddef.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define crypto_core_salsa2012_OUTPUTBYTES 64U\nSODIUM_EXPORT\nsize_t crypto_core_salsa2012_outputbytes(void);\n\n#define crypto_core_salsa2012_INPUTBYTES 16U\nSODIUM_EXPORT\nsize_t crypto_core_salsa2012_inputbytes(void);\n\n#define crypto_core_salsa2012_KEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_core_salsa2012_keybytes(void);\n\n#define crypto_core_salsa2012_CONSTBYTES 16U\nSODIUM_EXPORT\nsize_t crypto_core_salsa2012_constbytes(void);\n\nSODIUM_EXPORT\nint crypto_core_salsa2012(unsigned char *out, const unsigned char *in,\n                          const unsigned char *k, const unsigned char *c);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_core_salsa208.h",
    "content": "#ifndef crypto_core_salsa208_H\n#define crypto_core_salsa208_H\n\n#include <stddef.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define crypto_core_salsa208_OUTPUTBYTES 64U\nSODIUM_EXPORT\nsize_t crypto_core_salsa208_outputbytes(void);\n\n#define crypto_core_salsa208_INPUTBYTES 16U\nSODIUM_EXPORT\nsize_t crypto_core_salsa208_inputbytes(void);\n\n#define crypto_core_salsa208_KEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_core_salsa208_keybytes(void);\n\n#define crypto_core_salsa208_CONSTBYTES 16U\nSODIUM_EXPORT\nsize_t crypto_core_salsa208_constbytes(void);\n\nSODIUM_EXPORT\nint crypto_core_salsa208(unsigned char *out, const unsigned char *in,\n                         const unsigned char *k, const unsigned char *c);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_generichash.h",
    "content": "#ifndef crypto_generichash_H\n#define crypto_generichash_H\n\n#include <stddef.h>\n\n#include \"crypto_generichash_blake2b.h\"\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_generichash_BYTES_MIN crypto_generichash_blake2b_BYTES_MIN\nSODIUM_EXPORT\nsize_t  crypto_generichash_bytes_min(void);\n\n#define crypto_generichash_BYTES_MAX crypto_generichash_blake2b_BYTES_MAX\nSODIUM_EXPORT\nsize_t  crypto_generichash_bytes_max(void);\n\n#define crypto_generichash_BYTES crypto_generichash_blake2b_BYTES\nSODIUM_EXPORT\nsize_t  crypto_generichash_bytes(void);\n\n#define crypto_generichash_KEYBYTES_MIN crypto_generichash_blake2b_KEYBYTES_MIN\nSODIUM_EXPORT\nsize_t  crypto_generichash_keybytes_min(void);\n\n#define crypto_generichash_KEYBYTES_MAX crypto_generichash_blake2b_KEYBYTES_MAX\nSODIUM_EXPORT\nsize_t  crypto_generichash_keybytes_max(void);\n\n#define crypto_generichash_KEYBYTES crypto_generichash_blake2b_KEYBYTES\nSODIUM_EXPORT\nsize_t  crypto_generichash_keybytes(void);\n\n#define crypto_generichash_PRIMITIVE \"blake2b\"\nSODIUM_EXPORT\nconst char *crypto_generichash_primitive(void);\n\ntypedef crypto_generichash_blake2b_state crypto_generichash_state;\nSODIUM_EXPORT\nsize_t  crypto_generichash_statebytes(void);\n\nSODIUM_EXPORT\nint crypto_generichash(unsigned char *out, size_t outlen,\n                       const unsigned char *in, unsigned long long inlen,\n                       const unsigned char *key, size_t keylen);\n\nSODIUM_EXPORT\nint crypto_generichash_init(crypto_generichash_state *state,\n                            const unsigned char *key,\n                            const size_t keylen, const size_t outlen);\n\nSODIUM_EXPORT\nint crypto_generichash_update(crypto_generichash_state *state,\n                              const unsigned char *in,\n                              unsigned long long inlen);\n\nSODIUM_EXPORT\nint crypto_generichash_final(crypto_generichash_state *state,\n                             unsigned char *out, const size_t outlen);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_generichash_blake2b.h",
    "content": "#ifndef crypto_generichash_blake2b_H\n#define crypto_generichash_blake2b_H\n\n#include <stddef.h>\n#include <stdint.h>\n#include <stdlib.h>\n\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#if defined(__IBMC__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)\n# pragma pack(1)\n#else\n# pragma pack(push, 1)\n#endif\n\ntypedef CRYPTO_ALIGN(64) struct crypto_generichash_blake2b_state {\n    uint64_t h[8];\n    uint64_t t[2];\n    uint64_t f[2];\n    uint8_t  buf[2 * 128];\n    size_t   buflen;\n    uint8_t  last_node;\n} crypto_generichash_blake2b_state;\n\n#if defined(__IBMC__) || defined(__SUNPRO_C) || defined(__SUNPRO_CC)\n# pragma pack()\n#else\n# pragma pack(pop)\n#endif\n\n#define crypto_generichash_blake2b_BYTES_MIN     16U\nSODIUM_EXPORT\nsize_t crypto_generichash_blake2b_bytes_min(void);\n\n#define crypto_generichash_blake2b_BYTES_MAX     64U\nSODIUM_EXPORT\nsize_t crypto_generichash_blake2b_bytes_max(void);\n\n#define crypto_generichash_blake2b_BYTES         32U\nSODIUM_EXPORT\nsize_t crypto_generichash_blake2b_bytes(void);\n\n#define crypto_generichash_blake2b_KEYBYTES_MIN  16U\nSODIUM_EXPORT\nsize_t crypto_generichash_blake2b_keybytes_min(void);\n\n#define crypto_generichash_blake2b_KEYBYTES_MAX  64U\nSODIUM_EXPORT\nsize_t crypto_generichash_blake2b_keybytes_max(void);\n\n#define crypto_generichash_blake2b_KEYBYTES      32U\nSODIUM_EXPORT\nsize_t crypto_generichash_blake2b_keybytes(void);\n\n#define crypto_generichash_blake2b_SALTBYTES     16U\nSODIUM_EXPORT\nsize_t crypto_generichash_blake2b_saltbytes(void);\n\n#define crypto_generichash_blake2b_PERSONALBYTES 16U\nSODIUM_EXPORT\nsize_t crypto_generichash_blake2b_personalbytes(void);\n\nSODIUM_EXPORT\nint crypto_generichash_blake2b(unsigned char *out, size_t outlen,\n                               const unsigned char *in,\n                               unsigned long long inlen,\n                               const unsigned char *key, size_t keylen);\n\nSODIUM_EXPORT\nint crypto_generichash_blake2b_salt_personal(unsigned char *out, size_t outlen,\n                                             const unsigned char *in,\n                                             unsigned long long inlen,\n                                             const unsigned char *key,\n                                             size_t keylen,\n                                             const unsigned char *salt,\n                                             const unsigned char *personal);\n\nSODIUM_EXPORT\nint crypto_generichash_blake2b_init(crypto_generichash_blake2b_state *state,\n                                    const unsigned char *key,\n                                    const size_t keylen, const size_t outlen);\n\nSODIUM_EXPORT\nint crypto_generichash_blake2b_init_salt_personal(crypto_generichash_blake2b_state *state,\n                                                  const unsigned char *key,\n                                                  const size_t keylen, const size_t outlen,\n                                                  const unsigned char *salt,\n                                                  const unsigned char *personal);\n\nSODIUM_EXPORT\nint crypto_generichash_blake2b_update(crypto_generichash_blake2b_state *state,\n                                      const unsigned char *in,\n                                      unsigned long long inlen);\n\nSODIUM_EXPORT\nint crypto_generichash_blake2b_final(crypto_generichash_blake2b_state *state,\n                                     unsigned char *out,\n                                     const size_t outlen);\n\n/* ------------------------------------------------------------------------- */\n\nint _crypto_generichash_blake2b_pick_best_implementation(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_hash.h",
    "content": "#ifndef crypto_hash_H\n#define crypto_hash_H\n\n/*\n * WARNING: Unless you absolutely need to use SHA512 for interoperatibility,\n * purposes, you might want to consider crypto_generichash() instead.\n * Unlike SHA512, crypto_generichash() is not vulnerable to length\n * extension attacks.\n */\n\n#include <stddef.h>\n\n#include \"crypto_hash_sha512.h\"\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_hash_BYTES crypto_hash_sha512_BYTES\nSODIUM_EXPORT\nsize_t crypto_hash_bytes(void);\n\nSODIUM_EXPORT\nint crypto_hash(unsigned char *out, const unsigned char *in,\n                unsigned long long inlen);\n\n#define crypto_hash_PRIMITIVE \"sha512\"\nSODIUM_EXPORT\nconst char *crypto_hash_primitive(void)\n            __attribute__ ((warn_unused_result));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_hash_sha256.h",
    "content": "#ifndef crypto_hash_sha256_H\n#define crypto_hash_sha256_H\n\n/*\n * WARNING: Unless you absolutely need to use SHA256 for interoperatibility,\n * purposes, you might want to consider crypto_generichash() instead.\n * Unlike SHA256, crypto_generichash() is not vulnerable to length\n * extension attacks.\n */\n\n#include <stddef.h>\n#include <stdint.h>\n#include <stdlib.h>\n\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\ntypedef struct crypto_hash_sha256_state {\n    uint32_t      state[8];\n    uint64_t      count;\n    unsigned char buf[64];\n} crypto_hash_sha256_state;\nSODIUM_EXPORT\nsize_t crypto_hash_sha256_statebytes(void);\n\n#define crypto_hash_sha256_BYTES 32U\nSODIUM_EXPORT\nsize_t crypto_hash_sha256_bytes(void);\n\nSODIUM_EXPORT\nint crypto_hash_sha256(unsigned char *out, const unsigned char *in,\n                       unsigned long long inlen);\n\nSODIUM_EXPORT\nint crypto_hash_sha256_init(crypto_hash_sha256_state *state);\n\nSODIUM_EXPORT\nint crypto_hash_sha256_update(crypto_hash_sha256_state *state,\n                              const unsigned char *in,\n                              unsigned long long inlen);\n\nSODIUM_EXPORT\nint crypto_hash_sha256_final(crypto_hash_sha256_state *state,\n                             unsigned char *out);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_hash_sha512.h",
    "content": "#ifndef crypto_hash_sha512_H\n#define crypto_hash_sha512_H\n\n/*\n * WARNING: Unless you absolutely need to use SHA512 for interoperatibility,\n * purposes, you might want to consider crypto_generichash() instead.\n * Unlike SHA512, crypto_generichash() is not vulnerable to length\n * extension attacks.\n */\n\n#include <stddef.h>\n#include <stdint.h>\n#include <stdlib.h>\n\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\ntypedef struct crypto_hash_sha512_state {\n    uint64_t      state[8];\n    uint64_t      count[2];\n    unsigned char buf[128];\n} crypto_hash_sha512_state;\nSODIUM_EXPORT\nsize_t crypto_hash_sha512_statebytes(void);\n\n#define crypto_hash_sha512_BYTES 64U\nSODIUM_EXPORT\nsize_t crypto_hash_sha512_bytes(void);\n\nSODIUM_EXPORT\nint crypto_hash_sha512(unsigned char *out, const unsigned char *in,\n                       unsigned long long inlen);\n\nSODIUM_EXPORT\nint crypto_hash_sha512_init(crypto_hash_sha512_state *state);\n\nSODIUM_EXPORT\nint crypto_hash_sha512_update(crypto_hash_sha512_state *state,\n                              const unsigned char *in,\n                              unsigned long long inlen);\n\nSODIUM_EXPORT\nint crypto_hash_sha512_final(crypto_hash_sha512_state *state,\n                             unsigned char *out);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_int32.h",
    "content": "#ifndef crypto_int32_H\n#define crypto_int32_H\n\n#include <stdint.h>\n\ntypedef int32_t crypto_int32;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_int64.h",
    "content": "#ifndef crypto_int64_H\n#define crypto_int64_H\n\n#include <stdint.h>\n\ntypedef int64_t crypto_int64;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_onetimeauth.h",
    "content": "#ifndef crypto_onetimeauth_H\n#define crypto_onetimeauth_H\n\n#include <stddef.h>\n\n#include \"crypto_onetimeauth_poly1305.h\"\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\ntypedef crypto_onetimeauth_poly1305_state crypto_onetimeauth_state;\nSODIUM_EXPORT\nsize_t  crypto_onetimeauth_statebytes(void);\n\n#define crypto_onetimeauth_BYTES crypto_onetimeauth_poly1305_BYTES\nSODIUM_EXPORT\nsize_t  crypto_onetimeauth_bytes(void);\n\n#define crypto_onetimeauth_KEYBYTES crypto_onetimeauth_poly1305_KEYBYTES\nSODIUM_EXPORT\nsize_t  crypto_onetimeauth_keybytes(void);\n\n#define crypto_onetimeauth_PRIMITIVE \"poly1305\"\nSODIUM_EXPORT\nconst char *crypto_onetimeauth_primitive(void);\n\nSODIUM_EXPORT\nint crypto_onetimeauth(unsigned char *out, const unsigned char *in,\n                       unsigned long long inlen, const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_onetimeauth_verify(const unsigned char *h, const unsigned char *in,\n                              unsigned long long inlen, const unsigned char *k)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_onetimeauth_init(crypto_onetimeauth_state *state,\n                            const unsigned char *key);\n\nSODIUM_EXPORT\nint crypto_onetimeauth_update(crypto_onetimeauth_state *state,\n                              const unsigned char *in,\n                              unsigned long long inlen);\n\nSODIUM_EXPORT\nint crypto_onetimeauth_final(crypto_onetimeauth_state *state,\n                             unsigned char *out);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_onetimeauth_poly1305.h",
    "content": "#ifndef crypto_onetimeauth_poly1305_H\n#define crypto_onetimeauth_poly1305_H\n\n#include <stdlib.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#include <sys/types.h>\n\n#include <stdint.h>\n#include <stdio.h>\n\ntypedef CRYPTO_ALIGN(16) struct crypto_onetimeauth_poly1305_state {\n    unsigned char opaque[256];\n} crypto_onetimeauth_poly1305_state;\n\n#define crypto_onetimeauth_poly1305_BYTES 16U\nSODIUM_EXPORT\nsize_t crypto_onetimeauth_poly1305_bytes(void);\n\n#define crypto_onetimeauth_poly1305_KEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_onetimeauth_poly1305_keybytes(void);\n\nSODIUM_EXPORT\nint crypto_onetimeauth_poly1305(unsigned char *out,\n                                const unsigned char *in,\n                                unsigned long long inlen,\n                                const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_onetimeauth_poly1305_verify(const unsigned char *h,\n                                       const unsigned char *in,\n                                       unsigned long long inlen,\n                                       const unsigned char *k)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_onetimeauth_poly1305_init(crypto_onetimeauth_poly1305_state *state,\n                                     const unsigned char *key);\n\nSODIUM_EXPORT\nint crypto_onetimeauth_poly1305_update(crypto_onetimeauth_poly1305_state *state,\n                                       const unsigned char *in,\n                                       unsigned long long inlen);\n\nSODIUM_EXPORT\nint crypto_onetimeauth_poly1305_final(crypto_onetimeauth_poly1305_state *state,\n                                      unsigned char *out);\n\n/* ------------------------------------------------------------------------- */\n\nint _crypto_onetimeauth_poly1305_pick_best_implementation(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_pwhash_scryptsalsa208sha256.h",
    "content": "#ifndef crypto_pwhash_scryptsalsa208sha256_H\n#define crypto_pwhash_scryptsalsa208sha256_H\n\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_pwhash_scryptsalsa208sha256_SALTBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_pwhash_scryptsalsa208sha256_saltbytes(void);\n\n#define crypto_pwhash_scryptsalsa208sha256_STRBYTES 102U\nSODIUM_EXPORT\nsize_t crypto_pwhash_scryptsalsa208sha256_strbytes(void);\n\n#define crypto_pwhash_scryptsalsa208sha256_STRPREFIX \"$7$\"\nSODIUM_EXPORT\nconst char *crypto_pwhash_scryptsalsa208sha256_strprefix(void);\n\n#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_INTERACTIVE 524288ULL\nSODIUM_EXPORT\nsize_t crypto_pwhash_scryptsalsa208sha256_opslimit_interactive(void);\n\n#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_INTERACTIVE 16777216ULL\nSODIUM_EXPORT\nsize_t crypto_pwhash_scryptsalsa208sha256_memlimit_interactive(void);\n\n#define crypto_pwhash_scryptsalsa208sha256_OPSLIMIT_SENSITIVE 33554432ULL\nSODIUM_EXPORT\nsize_t crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive(void);\n\n#define crypto_pwhash_scryptsalsa208sha256_MEMLIMIT_SENSITIVE 1073741824ULL\nSODIUM_EXPORT\nsize_t crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive(void);\n\nSODIUM_EXPORT\nint crypto_pwhash_scryptsalsa208sha256(unsigned char * const out,\n                                       unsigned long long outlen,\n                                       const char * const passwd,\n                                       unsigned long long passwdlen,\n                                       const unsigned char * const salt,\n                                       unsigned long long opslimit,\n                                       size_t memlimit)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_pwhash_scryptsalsa208sha256_str(char out[crypto_pwhash_scryptsalsa208sha256_STRBYTES],\n                                           const char * const passwd,\n                                           unsigned long long passwdlen,\n                                           unsigned long long opslimit,\n                                           size_t memlimit)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_pwhash_scryptsalsa208sha256_str_verify(const char str[crypto_pwhash_scryptsalsa208sha256_STRBYTES],\n                                                  const char * const passwd,\n                                                  unsigned long long passwdlen)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_pwhash_scryptsalsa208sha256_ll(const uint8_t * passwd, size_t passwdlen,\n                                          const uint8_t * salt, size_t saltlen,\n                                          uint64_t N, uint32_t r, uint32_t p,\n                                          uint8_t * buf, size_t buflen)\n            __attribute__ ((warn_unused_result));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_scalarmult.h",
    "content": "#ifndef crypto_scalarmult_H\n#define crypto_scalarmult_H\n\n#include <stddef.h>\n\n#include \"crypto_scalarmult_curve25519.h\"\n#include \"export.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define crypto_scalarmult_BYTES crypto_scalarmult_curve25519_BYTES\nSODIUM_EXPORT\nsize_t  crypto_scalarmult_bytes(void);\n\n#define crypto_scalarmult_SCALARBYTES crypto_scalarmult_curve25519_SCALARBYTES\nSODIUM_EXPORT\nsize_t  crypto_scalarmult_scalarbytes(void);\n\n#define crypto_scalarmult_PRIMITIVE \"curve25519\"\nSODIUM_EXPORT\nconst char *crypto_scalarmult_primitive(void);\n\nSODIUM_EXPORT\nint crypto_scalarmult_base(unsigned char *q, const unsigned char *n);\n\nSODIUM_EXPORT\nint crypto_scalarmult(unsigned char *q, const unsigned char *n,\n                      const unsigned char *p)\n            __attribute__ ((warn_unused_result));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_scalarmult_curve25519.h",
    "content": "#ifndef crypto_scalarmult_curve25519_H\n#define crypto_scalarmult_curve25519_H\n\n#include <stddef.h>\n\n#include \"export.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define crypto_scalarmult_curve25519_BYTES 32U\nSODIUM_EXPORT\nsize_t crypto_scalarmult_curve25519_bytes(void);\n\n#define crypto_scalarmult_curve25519_SCALARBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_scalarmult_curve25519_scalarbytes(void);\n\nSODIUM_EXPORT\nint crypto_scalarmult_curve25519(unsigned char *q, const unsigned char *n,\n                                 const unsigned char *p)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_scalarmult_curve25519_base(unsigned char *q, const unsigned char *n);\n\n/* ------------------------------------------------------------------------- */\n\nint _crypto_scalarmult_curve25519_pick_best_implementation(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_secretbox.h",
    "content": "#ifndef crypto_secretbox_H\n#define crypto_secretbox_H\n\n#include <stddef.h>\n\n#include \"crypto_secretbox_xsalsa20poly1305.h\"\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_secretbox_KEYBYTES crypto_secretbox_xsalsa20poly1305_KEYBYTES\nSODIUM_EXPORT\nsize_t  crypto_secretbox_keybytes(void);\n\n#define crypto_secretbox_NONCEBYTES crypto_secretbox_xsalsa20poly1305_NONCEBYTES\nSODIUM_EXPORT\nsize_t  crypto_secretbox_noncebytes(void);\n\n#define crypto_secretbox_MACBYTES crypto_secretbox_xsalsa20poly1305_MACBYTES\nSODIUM_EXPORT\nsize_t  crypto_secretbox_macbytes(void);\n\n#define crypto_secretbox_PRIMITIVE \"xsalsa20poly1305\"\nSODIUM_EXPORT\nconst char *crypto_secretbox_primitive(void);\n\nSODIUM_EXPORT\nint crypto_secretbox_easy(unsigned char *c, const unsigned char *m,\n                          unsigned long long mlen, const unsigned char *n,\n                          const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_secretbox_open_easy(unsigned char *m, const unsigned char *c,\n                               unsigned long long clen, const unsigned char *n,\n                               const unsigned char *k)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_secretbox_detached(unsigned char *c, unsigned char *mac,\n                              const unsigned char *m,\n                              unsigned long long mlen,\n                              const unsigned char *n,\n                              const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_secretbox_open_detached(unsigned char *m,\n                                   const unsigned char *c,\n                                   const unsigned char *mac,\n                                   unsigned long long clen,\n                                   const unsigned char *n,\n                                   const unsigned char *k)\n            __attribute__ ((warn_unused_result));\n\n/* -- NaCl compatibility interface ; Requires padding -- */\n\n#define crypto_secretbox_ZEROBYTES crypto_secretbox_xsalsa20poly1305_ZEROBYTES\nSODIUM_EXPORT\nsize_t  crypto_secretbox_zerobytes(void);\n\n#define crypto_secretbox_BOXZEROBYTES crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES\nSODIUM_EXPORT\nsize_t  crypto_secretbox_boxzerobytes(void);\n\nSODIUM_EXPORT\nint crypto_secretbox(unsigned char *c, const unsigned char *m,\n                     unsigned long long mlen, const unsigned char *n,\n                     const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_secretbox_open(unsigned char *m, const unsigned char *c,\n                          unsigned long long clen, const unsigned char *n,\n                          const unsigned char *k)\n            __attribute__ ((warn_unused_result));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_secretbox_xsalsa20poly1305.h",
    "content": "#ifndef crypto_secretbox_xsalsa20poly1305_H\n#define crypto_secretbox_xsalsa20poly1305_H\n\n#include <stddef.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_secretbox_xsalsa20poly1305_KEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_secretbox_xsalsa20poly1305_keybytes(void);\n\n#define crypto_secretbox_xsalsa20poly1305_NONCEBYTES 24U\nSODIUM_EXPORT\nsize_t crypto_secretbox_xsalsa20poly1305_noncebytes(void);\n\n#define crypto_secretbox_xsalsa20poly1305_ZEROBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_secretbox_xsalsa20poly1305_zerobytes(void);\n\n#define crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES 16U\nSODIUM_EXPORT\nsize_t crypto_secretbox_xsalsa20poly1305_boxzerobytes(void);\n\n#define crypto_secretbox_xsalsa20poly1305_MACBYTES \\\n    (crypto_secretbox_xsalsa20poly1305_ZEROBYTES - \\\n     crypto_secretbox_xsalsa20poly1305_BOXZEROBYTES)\nSODIUM_EXPORT\nsize_t crypto_secretbox_xsalsa20poly1305_macbytes(void);\n\nSODIUM_EXPORT\nint crypto_secretbox_xsalsa20poly1305(unsigned char *c,\n                                      const unsigned char *m,\n                                      unsigned long long mlen,\n                                      const unsigned char *n,\n                                      const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_secretbox_xsalsa20poly1305_open(unsigned char *m,\n                                           const unsigned char *c,\n                                           unsigned long long clen,\n                                           const unsigned char *n,\n                                           const unsigned char *k);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_shorthash.h",
    "content": "#ifndef crypto_shorthash_H\n#define crypto_shorthash_H\n\n#include <stddef.h>\n\n#include \"crypto_shorthash_siphash24.h\"\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_shorthash_BYTES crypto_shorthash_siphash24_BYTES\nSODIUM_EXPORT\nsize_t  crypto_shorthash_bytes(void);\n\n#define crypto_shorthash_KEYBYTES crypto_shorthash_siphash24_KEYBYTES\nSODIUM_EXPORT\nsize_t  crypto_shorthash_keybytes(void);\n\n#define crypto_shorthash_PRIMITIVE \"siphash24\"\nSODIUM_EXPORT\nconst char *crypto_shorthash_primitive(void);\n\nSODIUM_EXPORT\nint crypto_shorthash(unsigned char *out, const unsigned char *in,\n                     unsigned long long inlen, const unsigned char *k);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_shorthash_siphash24.h",
    "content": "#ifndef crypto_shorthash_siphash24_H\n#define crypto_shorthash_siphash24_H\n\n#include <stddef.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_shorthash_siphash24_BYTES 8U\nSODIUM_EXPORT\nsize_t crypto_shorthash_siphash24_bytes(void);\n\n#define crypto_shorthash_siphash24_KEYBYTES 16U\nSODIUM_EXPORT\nsize_t crypto_shorthash_siphash24_keybytes(void);\n\nSODIUM_EXPORT\nint crypto_shorthash_siphash24(unsigned char *out, const unsigned char *in,\n                               unsigned long long inlen, const unsigned char *k);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_sign.h",
    "content": "#ifndef crypto_sign_H\n#define crypto_sign_H\n\n/*\n * THREAD SAFETY: crypto_sign_keypair() is thread-safe,\n * provided that you called sodium_init() once before using any\n * other libsodium function.\n * Other functions, including crypto_sign_seed_keypair() are always thread-safe.\n */\n\n#include <stddef.h>\n\n#include \"crypto_sign_ed25519.h\"\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_sign_BYTES crypto_sign_ed25519_BYTES\nSODIUM_EXPORT\nsize_t  crypto_sign_bytes(void);\n\n#define crypto_sign_SEEDBYTES crypto_sign_ed25519_SEEDBYTES\nSODIUM_EXPORT\nsize_t  crypto_sign_seedbytes(void);\n\n#define crypto_sign_PUBLICKEYBYTES crypto_sign_ed25519_PUBLICKEYBYTES\nSODIUM_EXPORT\nsize_t  crypto_sign_publickeybytes(void);\n\n#define crypto_sign_SECRETKEYBYTES crypto_sign_ed25519_SECRETKEYBYTES\nSODIUM_EXPORT\nsize_t  crypto_sign_secretkeybytes(void);\n\n#define crypto_sign_PRIMITIVE \"ed25519\"\nSODIUM_EXPORT\nconst char *crypto_sign_primitive(void);\n\nSODIUM_EXPORT\nint crypto_sign_seed_keypair(unsigned char *pk, unsigned char *sk,\n                             const unsigned char *seed);\n\nSODIUM_EXPORT\nint crypto_sign_keypair(unsigned char *pk, unsigned char *sk);\n\nSODIUM_EXPORT\nint crypto_sign(unsigned char *sm, unsigned long long *smlen_p,\n                const unsigned char *m, unsigned long long mlen,\n                const unsigned char *sk);\n\nSODIUM_EXPORT\nint crypto_sign_open(unsigned char *m, unsigned long long *mlen_p,\n                     const unsigned char *sm, unsigned long long smlen,\n                     const unsigned char *pk)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_sign_detached(unsigned char *sig, unsigned long long *siglen_p,\n                         const unsigned char *m, unsigned long long mlen,\n                         const unsigned char *sk);\n\nSODIUM_EXPORT\nint crypto_sign_verify_detached(const unsigned char *sig,\n                                const unsigned char *m,\n                                unsigned long long mlen,\n                                const unsigned char *pk)\n            __attribute__ ((warn_unused_result));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_sign_ed25519.h",
    "content": "#ifndef crypto_sign_ed25519_H\n#define crypto_sign_ed25519_H\n\n#include <stddef.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_sign_ed25519_BYTES 64U\nSODIUM_EXPORT\nsize_t crypto_sign_ed25519_bytes(void);\n\n#define crypto_sign_ed25519_SEEDBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_sign_ed25519_seedbytes(void);\n\n#define crypto_sign_ed25519_PUBLICKEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_sign_ed25519_publickeybytes(void);\n\n#define crypto_sign_ed25519_SECRETKEYBYTES (32U + 32U)\nSODIUM_EXPORT\nsize_t crypto_sign_ed25519_secretkeybytes(void);\n\nSODIUM_EXPORT\nint crypto_sign_ed25519(unsigned char *sm, unsigned long long *smlen_p,\n                        const unsigned char *m, unsigned long long mlen,\n                        const unsigned char *sk);\n\nSODIUM_EXPORT\nint crypto_sign_ed25519_open(unsigned char *m, unsigned long long *mlen_p,\n                             const unsigned char *sm, unsigned long long smlen,\n                             const unsigned char *pk)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_sign_ed25519_detached(unsigned char *sig,\n                                 unsigned long long *siglen_p,\n                                 const unsigned char *m,\n                                 unsigned long long mlen,\n                                 const unsigned char *sk);\n\nSODIUM_EXPORT\nint crypto_sign_ed25519_verify_detached(const unsigned char *sig,\n                                        const unsigned char *m,\n                                        unsigned long long mlen,\n                                        const unsigned char *pk)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_sign_ed25519_keypair(unsigned char *pk, unsigned char *sk);\n\nSODIUM_EXPORT\nint crypto_sign_ed25519_seed_keypair(unsigned char *pk, unsigned char *sk,\n                                     const unsigned char *seed);\n\nSODIUM_EXPORT\nint crypto_sign_ed25519_pk_to_curve25519(unsigned char *curve25519_pk,\n                                         const unsigned char *ed25519_pk)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint crypto_sign_ed25519_sk_to_curve25519(unsigned char *curve25519_sk,\n                                         const unsigned char *ed25519_sk);\n\nSODIUM_EXPORT\nint crypto_sign_ed25519_sk_to_seed(unsigned char *seed,\n                                   const unsigned char *sk);\n\nSODIUM_EXPORT\nint crypto_sign_ed25519_sk_to_pk(unsigned char *pk, const unsigned char *sk);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_sign_edwards25519sha512batch.h",
    "content": "#ifndef crypto_sign_edwards25519sha512batch_H\n#define crypto_sign_edwards25519sha512batch_H\n\n/*\n * WARNING: This construction was a prototype, which should not be used\n * any more in new projects.\n *\n * crypto_sign_edwards25519sha512batch is provided for applications\n * initially built with NaCl, but as recommended by the author of this\n * construction, new applications should use ed25519 instead.\n *\n * In Sodium, you should use the high-level crypto_sign_*() functions instead.\n */\n\n#include <stddef.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_sign_edwards25519sha512batch_BYTES 64U\nSODIUM_EXPORT\nsize_t crypto_sign_edwards25519sha512batch_bytes(void)\n       __attribute__ ((deprecated));\n\n#define crypto_sign_edwards25519sha512batch_PUBLICKEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_sign_edwards25519sha512batch_publickeybytes(void)\n       __attribute__ ((deprecated));\n\n#define crypto_sign_edwards25519sha512batch_SECRETKEYBYTES (32U + 32U)\nSODIUM_EXPORT\nsize_t crypto_sign_edwards25519sha512batch_secretkeybytes(void)\n       __attribute__ ((deprecated));\n\nSODIUM_EXPORT\nint crypto_sign_edwards25519sha512batch(unsigned char *sm,\n                                        unsigned long long *smlen_p,\n                                        const unsigned char *m,\n                                        unsigned long long mlen,\n                                        const unsigned char *sk)\n       __attribute__ ((deprecated));\n\nSODIUM_EXPORT\nint crypto_sign_edwards25519sha512batch_open(unsigned char *m,\n                                             unsigned long long *mlen_p,\n                                             const unsigned char *sm,\n                                             unsigned long long smlen,\n                                             const unsigned char *pk)\n       __attribute__ ((deprecated));\n\nSODIUM_EXPORT\nint crypto_sign_edwards25519sha512batch_keypair(unsigned char *pk,\n                                                unsigned char *sk)\n       __attribute__ ((deprecated));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_stream.h",
    "content": "#ifndef crypto_stream_H\n#define crypto_stream_H\n\n/*\n *  WARNING: This is just a stream cipher. It is NOT authenticated encryption.\n *  While it provides some protection against eavesdropping, it does NOT\n *  provide any security against active attacks.\n *  Unless you know what you're doing, what you are looking for is probably\n *  the crypto_box functions.\n */\n\n#include <stddef.h>\n\n#include \"crypto_stream_xsalsa20.h\"\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_stream_KEYBYTES crypto_stream_xsalsa20_KEYBYTES\nSODIUM_EXPORT\nsize_t  crypto_stream_keybytes(void);\n\n#define crypto_stream_NONCEBYTES crypto_stream_xsalsa20_NONCEBYTES\nSODIUM_EXPORT\nsize_t  crypto_stream_noncebytes(void);\n\n#define crypto_stream_PRIMITIVE \"xsalsa20\"\nSODIUM_EXPORT\nconst char *crypto_stream_primitive(void);\n\nSODIUM_EXPORT\nint crypto_stream(unsigned char *c, unsigned long long clen,\n                  const unsigned char *n, const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_stream_xor(unsigned char *c, const unsigned char *m,\n                      unsigned long long mlen, const unsigned char *n,\n                      const unsigned char *k);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_stream_aes128ctr.h",
    "content": "#ifndef crypto_stream_aes128ctr_H\n#define crypto_stream_aes128ctr_H\n\n/*\n *  WARNING: This is just a stream cipher. It is NOT authenticated encryption.\n *  While it provides some protection against eavesdropping, it does NOT\n *  provide any security against active attacks.\n *  Unless you know what you're doing, what you are looking for is probably\n *  the crypto_box functions.\n */\n\n#include <stddef.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_stream_aes128ctr_KEYBYTES 16U\nSODIUM_EXPORT\nsize_t crypto_stream_aes128ctr_keybytes(void);\n\n#define crypto_stream_aes128ctr_NONCEBYTES 16U\nSODIUM_EXPORT\nsize_t crypto_stream_aes128ctr_noncebytes(void);\n\n#define crypto_stream_aes128ctr_BEFORENMBYTES 1408U\nSODIUM_EXPORT\nsize_t crypto_stream_aes128ctr_beforenmbytes(void);\n\nSODIUM_EXPORT\nint crypto_stream_aes128ctr(unsigned char *out, unsigned long long outlen,\n                            const unsigned char *n, const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_stream_aes128ctr_xor(unsigned char *out, const unsigned char *in,\n                                unsigned long long inlen, const unsigned char *n,\n                                const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_stream_aes128ctr_beforenm(unsigned char *c, const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_stream_aes128ctr_afternm(unsigned char *out, unsigned long long len,\n                                    const unsigned char *nonce, const unsigned char *c);\n\nSODIUM_EXPORT\nint crypto_stream_aes128ctr_xor_afternm(unsigned char *out, const unsigned char *in,\n                                        unsigned long long len,\n                                        const unsigned char *nonce,\n                                        const unsigned char *c);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_stream_chacha20.h",
    "content": "#ifndef crypto_stream_chacha20_H\n#define crypto_stream_chacha20_H\n\n/*\n *  WARNING: This is just a stream cipher. It is NOT authenticated encryption.\n *  While it provides some protection against eavesdropping, it does NOT\n *  provide any security against active attacks.\n *  Unless you know what you're doing, what you are looking for is probably\n *  the crypto_box functions.\n */\n\n#include <stddef.h>\n#include <stdint.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_stream_chacha20_KEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_stream_chacha20_keybytes(void);\n\n#define crypto_stream_chacha20_NONCEBYTES 8U\nSODIUM_EXPORT\nsize_t crypto_stream_chacha20_noncebytes(void);\n\n/* ChaCha20 with a 64-bit nonce and a 64-bit counter, as originally designed */\n\nSODIUM_EXPORT\nint crypto_stream_chacha20(unsigned char *c, unsigned long long clen,\n                           const unsigned char *n, const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_stream_chacha20_xor(unsigned char *c, const unsigned char *m,\n                               unsigned long long mlen, const unsigned char *n,\n                               const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_stream_chacha20_xor_ic(unsigned char *c, const unsigned char *m,\n                                  unsigned long long mlen,\n                                  const unsigned char *n, uint64_t ic,\n                                  const unsigned char *k);\n\n/* ChaCha20 with a 96-bit nonce and a 32-bit counter (IETF) */\n\n#define crypto_stream_chacha20_IETF_NONCEBYTES 12U\nSODIUM_EXPORT\nsize_t crypto_stream_chacha20_ietf_noncebytes(void);\n\nSODIUM_EXPORT\nint crypto_stream_chacha20_ietf(unsigned char *c, unsigned long long clen,\n                                const unsigned char *n, const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_stream_chacha20_ietf_xor(unsigned char *c, const unsigned char *m,\n                                    unsigned long long mlen, const unsigned char *n,\n                                    const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_stream_chacha20_ietf_xor_ic(unsigned char *c, const unsigned char *m,\n                                       unsigned long long mlen,\n                                       const unsigned char *n, uint32_t ic,\n                                       const unsigned char *k);\n\n/* ------------------------------------------------------------------------- */\n\nint _crypto_stream_chacha20_pick_best_implementation(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_stream_salsa20.h",
    "content": "#ifndef crypto_stream_salsa20_H\n#define crypto_stream_salsa20_H\n\n/*\n *  WARNING: This is just a stream cipher. It is NOT authenticated encryption.\n *  While it provides some protection against eavesdropping, it does NOT\n *  provide any security against active attacks.\n *  Unless you know what you're doing, what you are looking for is probably\n *  the crypto_box functions.\n */\n\n#include <stddef.h>\n#include <stdint.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_stream_salsa20_KEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_stream_salsa20_keybytes(void);\n\n#define crypto_stream_salsa20_NONCEBYTES 8U\nSODIUM_EXPORT\nsize_t crypto_stream_salsa20_noncebytes(void);\n\nSODIUM_EXPORT\nint crypto_stream_salsa20(unsigned char *c, unsigned long long clen,\n                          const unsigned char *n, const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_stream_salsa20_xor(unsigned char *c, const unsigned char *m,\n                              unsigned long long mlen, const unsigned char *n,\n                              const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_stream_salsa20_xor_ic(unsigned char *c, const unsigned char *m,\n                                 unsigned long long mlen,\n                                 const unsigned char *n, uint64_t ic,\n                                 const unsigned char *k);\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_stream_salsa2012.h",
    "content": "#ifndef crypto_stream_salsa2012_H\n#define crypto_stream_salsa2012_H\n\n/*\n *  WARNING: This is just a stream cipher. It is NOT authenticated encryption.\n *  While it provides some protection against eavesdropping, it does NOT\n *  provide any security against active attacks.\n *  Unless you know what you're doing, what you are looking for is probably\n *  the crypto_box functions.\n */\n\n#include <stddef.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_stream_salsa2012_KEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_stream_salsa2012_keybytes(void);\n\n#define crypto_stream_salsa2012_NONCEBYTES 8U\nSODIUM_EXPORT\nsize_t crypto_stream_salsa2012_noncebytes(void);\n\nSODIUM_EXPORT\nint crypto_stream_salsa2012(unsigned char *c, unsigned long long clen,\n                            const unsigned char *n, const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_stream_salsa2012_xor(unsigned char *c, const unsigned char *m,\n                                unsigned long long mlen, const unsigned char *n,\n                                const unsigned char *k);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_stream_salsa208.h",
    "content": "#ifndef crypto_stream_salsa208_H\n#define crypto_stream_salsa208_H\n\n/*\n *  WARNING: This is just a stream cipher. It is NOT authenticated encryption.\n *  While it provides some protection against eavesdropping, it does NOT\n *  provide any security against active attacks.\n *  Unless you know what you're doing, what you are looking for is probably\n *  the crypto_box functions.\n */\n\n#include <stddef.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_stream_salsa208_KEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_stream_salsa208_keybytes(void);\n\n#define crypto_stream_salsa208_NONCEBYTES 8U\nSODIUM_EXPORT\nsize_t crypto_stream_salsa208_noncebytes(void);\n\nSODIUM_EXPORT\nint crypto_stream_salsa208(unsigned char *c, unsigned long long clen,\n                           const unsigned char *n, const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_stream_salsa208_xor(unsigned char *c, const unsigned char *m,\n                               unsigned long long mlen, const unsigned char *n,\n                               const unsigned char *k);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_stream_xsalsa20.h",
    "content": "#ifndef crypto_stream_xsalsa20_H\n#define crypto_stream_xsalsa20_H\n\n/*\n *  WARNING: This is just a stream cipher. It is NOT authenticated encryption.\n *  While it provides some protection against eavesdropping, it does NOT\n *  provide any security against active attacks.\n *  Unless you know what you're doing, what you are looking for is probably\n *  the crypto_box functions.\n */\n\n#include <stddef.h>\n#include <stdint.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\n#define crypto_stream_xsalsa20_KEYBYTES 32U\nSODIUM_EXPORT\nsize_t crypto_stream_xsalsa20_keybytes(void);\n\n#define crypto_stream_xsalsa20_NONCEBYTES 24U\nSODIUM_EXPORT\nsize_t crypto_stream_xsalsa20_noncebytes(void);\n\nSODIUM_EXPORT\nint crypto_stream_xsalsa20(unsigned char *c, unsigned long long clen,\n                           const unsigned char *n, const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_stream_xsalsa20_xor(unsigned char *c, const unsigned char *m,\n                               unsigned long long mlen, const unsigned char *n,\n                               const unsigned char *k);\n\nSODIUM_EXPORT\nint crypto_stream_xsalsa20_xor_ic(unsigned char *c, const unsigned char *m,\n                                  unsigned long long mlen,\n                                  const unsigned char *n, uint64_t ic,\n                                  const unsigned char *k);\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_uint16.h",
    "content": "#ifndef crypto_uint16_H\n#define crypto_uint16_H\n\n#include <stdint.h>\n\ntypedef uint16_t crypto_uint16;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_uint32.h",
    "content": "#ifndef crypto_uint32_H\n#define crypto_uint32_H\n\n#include <stdint.h>\n\ntypedef uint32_t crypto_uint32;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_uint64.h",
    "content": "#ifndef crypto_uint64_H\n#define crypto_uint64_H\n\n#include <stdint.h>\n\ntypedef uint64_t crypto_uint64;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_uint8.h",
    "content": "#ifndef crypto_uint8_H\n#define crypto_uint8_H\n\n#include <stdint.h>\n\ntypedef uint8_t crypto_uint8;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_verify_16.h",
    "content": "#ifndef crypto_verify_16_H\n#define crypto_verify_16_H\n\n#include <stddef.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define crypto_verify_16_BYTES 16U\nSODIUM_EXPORT\nsize_t crypto_verify_16_bytes(void);\n\nSODIUM_EXPORT\nint crypto_verify_16(const unsigned char *x, const unsigned char *y)\n            __attribute__ ((warn_unused_result));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_verify_32.h",
    "content": "#ifndef crypto_verify_32_H\n#define crypto_verify_32_H\n\n#include <stddef.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define crypto_verify_32_BYTES 32U\nSODIUM_EXPORT\nsize_t crypto_verify_32_bytes(void);\n\nSODIUM_EXPORT\nint crypto_verify_32(const unsigned char *x, const unsigned char *y)\n            __attribute__ ((warn_unused_result));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/crypto_verify_64.h",
    "content": "#ifndef crypto_verify_64_H\n#define crypto_verify_64_H\n\n#include <stddef.h>\n#include \"export.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#define crypto_verify_64_BYTES 64U\nSODIUM_EXPORT\nsize_t crypto_verify_64_bytes(void);\n\nSODIUM_EXPORT\nint crypto_verify_64(const unsigned char *x, const unsigned char *y)\n            __attribute__ ((warn_unused_result));\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/export.h",
    "content": "\n#ifndef sodium_export_H\n#define sodium_export_H\n\n#ifndef __GNUC__\n# ifdef __attribute__\n#  undef __attribute__\n# endif\n# define __attribute__(a)\n#endif\n\n#ifdef SODIUM_STATIC\n# define SODIUM_EXPORT\n#else\n# if defined(_MSC_VER)\n#  ifdef SODIUM_DLL_EXPORT\n#   define SODIUM_EXPORT __declspec(dllexport)\n#  else\n#   define SODIUM_EXPORT __declspec(dllimport)\n#  endif\n# else\n#  if defined(__SUNPRO_C)\n#   ifndef __GNU_C__\n#    define SODIUM_EXPORT __attribute__(visibility(__global))\n#   else\n#    define SODIUM_EXPORT __attribute__ __global\n#   endif\n#  elif defined(_MSG_VER)\n#   define SODIUM_EXPORT extern __declspec(dllexport)\n#  else\n#   define SODIUM_EXPORT __attribute__ ((visibility (\"default\")))\n#  endif\n# endif\n#endif\n\n#ifndef CRYPTO_ALIGN\n# if defined(__INTEL_COMPILER) || defined(_MSC_VER)\n#  define CRYPTO_ALIGN(x) __declspec(align(x))\n# else\n#  define CRYPTO_ALIGN(x) __attribute__((aligned(x)))\n# endif\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/randombytes.h",
    "content": "\n#ifndef randombytes_H\n#define randombytes_H\n\n#include <sys/types.h>\n\n#include <stddef.h>\n#include <stdint.h>\n\n#include \"export.h\"\n\n#ifdef __cplusplus\n# if __GNUC__\n#  pragma GCC diagnostic ignored \"-Wlong-long\"\n# endif\nextern \"C\" {\n#endif\n\ntypedef struct randombytes_implementation {\n    const char *(*implementation_name)(void); /* required */\n    uint32_t    (*random)(void);              /* required */\n    void        (*stir)(void);                /* optional */\n    uint32_t    (*uniform)(const uint32_t upper_bound); /* optional, a default implementation will be used if NULL */\n    void        (*buf)(void * const buf, const size_t size); /* required */\n    int         (*close)(void);               /* optional */\n} randombytes_implementation;\n\nSODIUM_EXPORT\nvoid randombytes_buf(void * const buf, const size_t size);\n\nSODIUM_EXPORT\nuint32_t randombytes_random(void);\n\nSODIUM_EXPORT\nuint32_t randombytes_uniform(const uint32_t upper_bound);\n\nSODIUM_EXPORT\nvoid randombytes_stir(void);\n\nSODIUM_EXPORT\nint randombytes_close(void);\n\nSODIUM_EXPORT\nint randombytes_set_implementation(randombytes_implementation *impl);\n\nSODIUM_EXPORT\nconst char *randombytes_implementation_name(void);\n\n/* -- NaCl compatibility interface -- */\n\nSODIUM_EXPORT\nvoid randombytes(unsigned char * const buf, const unsigned long long buf_len);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/randombytes_nativeclient.h",
    "content": "\n#ifndef randombytes_nativeclient_H\n#define randombytes_nativeclient_H\n\n#ifdef __native_client__\n\n# include \"export.h\"\n# include \"randombytes.h\"\n\n# ifdef __cplusplus\nextern \"C\" {\n# endif\n\nSODIUM_EXPORT\nextern struct randombytes_implementation randombytes_nativeclient_implementation;\n\n# ifdef __cplusplus\n}\n# endif\n\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/randombytes_salsa20_random.h",
    "content": "\n#ifndef randombytes_salsa20_random_H\n#define randombytes_salsa20_random_H\n\n#include \"export.h\"\n#include \"randombytes.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nSODIUM_EXPORT\nextern struct randombytes_implementation randombytes_salsa20_implementation;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/randombytes_sysrandom.h",
    "content": "\n#ifndef randombytes_sysrandom_H\n#define randombytes_sysrandom_H\n\n#include \"export.h\"\n#include \"randombytes.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nSODIUM_EXPORT\nextern struct randombytes_implementation randombytes_sysrandom_implementation;\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/runtime.h",
    "content": "\n#ifndef sodium_runtime_H\n#define sodium_runtime_H\n\n#include \"export.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nSODIUM_EXPORT\nint sodium_runtime_has_neon(void);\n\nSODIUM_EXPORT\nint sodium_runtime_has_sse2(void);\n\nSODIUM_EXPORT\nint sodium_runtime_has_sse3(void);\n\nSODIUM_EXPORT\nint sodium_runtime_has_ssse3(void);\n\nSODIUM_EXPORT\nint sodium_runtime_has_sse41(void);\n\nSODIUM_EXPORT\nint sodium_runtime_has_avx(void);\n\nSODIUM_EXPORT\nint sodium_runtime_has_pclmul(void);\n\nSODIUM_EXPORT\nint sodium_runtime_has_aesni(void);\n\n/* ------------------------------------------------------------------------- */\n\nint _sodium_runtime_get_cpu_features(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/utils.h",
    "content": "\n#ifndef sodium_utils_H\n#define sodium_utils_H\n\n#include <stddef.h>\n\n#include \"export.h\"\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n#if defined(__cplusplus) || !defined(__STDC_VERSION__) || __STDC_VERSION__ < 199901L\n# define SODIUM_C99(X)\n#else\n# define SODIUM_C99(X) X\n#endif\n\nSODIUM_EXPORT\nvoid sodium_memzero(void * const pnt, const size_t len);\n\n/*\n * WARNING: sodium_memcmp() must be used to verify if two secret keys\n * are equal, in constant time.\n * It returns 0 if the keys are equal, and -1 if they differ.\n * This function is not designed for lexicographical comparisons.\n */\nSODIUM_EXPORT\nint sodium_memcmp(const void * const b1_, const void * const b2_, size_t len)\n            __attribute__ ((warn_unused_result));\n\n/*\n * sodium_compare() returns -1 if b1_ < b2_, 1 if b1_ > b2_ and 0 if b1_ == b2_\n * It is suitable for lexicographical comparisons, or to compare nonces\n * and counters stored in little-endian format.\n * However, it is slower than sodium_memcmp().\n */\nSODIUM_EXPORT\nint sodium_compare(const unsigned char *b1_, const unsigned char *b2_,\n                   size_t len)\n            __attribute__ ((warn_unused_result));\n\nSODIUM_EXPORT\nint sodium_is_zero(const unsigned char *n, const size_t nlen);\n\nSODIUM_EXPORT\nvoid sodium_increment(unsigned char *n, const size_t nlen);\n\nSODIUM_EXPORT\nvoid sodium_add(unsigned char *a, const unsigned char *b, const size_t len);\n\nSODIUM_EXPORT\nchar *sodium_bin2hex(char * const hex, const size_t hex_maxlen,\n                     const unsigned char * const bin, const size_t bin_len);\n\nSODIUM_EXPORT\nint sodium_hex2bin(unsigned char * const bin, const size_t bin_maxlen,\n                   const char * const hex, const size_t hex_len,\n                   const char * const ignore, size_t * const bin_len,\n                   const char ** const hex_end);\n\nSODIUM_EXPORT\nint sodium_mlock(void * const addr, const size_t len);\n\nSODIUM_EXPORT\nint sodium_munlock(void * const addr, const size_t len);\n\n/* WARNING: sodium_malloc() and sodium_allocarray() are not general-purpose\n * allocation functions.\n *\n * They return a pointer to a region filled with 0xd0 bytes, immediately\n * followed by a guard page.\n * As a result, accessing a single byte after the requested allocation size\n * will intentionally trigger a segmentation fault.\n *\n * A canary and an additional guard page placed before the beginning of the\n * region may also kill the process if a buffer underflow is detected.\n *\n * The memory layout is:\n * [unprotected region size (read only)][guard page (no access)][unprotected pages (read/write)][guard page (no access)]\n * With the layout of the unprotected pages being:\n * [optional padding][16-bytes canary][user region]\n *\n * However:\n * - These functions are significantly slower than standard functions\n * - Each allocation requires 3 or 4 additional pages\n * - The returned address will not be aligned if the allocation size is not\n *   a multiple of the required alignment. For this reason, these functions\n *   are designed to store data, such as secret keys and messages.\n *\n * sodium_malloc() can be used to allocate any libsodium data structure,\n * with the exception of crypto_generichash_state.\n *\n * The crypto_generichash_state structure is packed and its length is\n * either 357 or 361 bytes. For this reason, when using sodium_malloc() to\n * allocate a crypto_generichash_state structure, padding must be added in\n * order to ensure proper alignment:\n * state = sodium_malloc((crypto_generichash_statebytes() + (size_t) 63U)\n *                       & ~(size_t) 63U);\n */\n\nSODIUM_EXPORT\nvoid *sodium_malloc(const size_t size)\n            __attribute__ ((malloc));\n\nSODIUM_EXPORT\nvoid *sodium_allocarray(size_t count, size_t size)\n            __attribute__ ((malloc));\n\nSODIUM_EXPORT\nvoid sodium_free(void *ptr);\n\nSODIUM_EXPORT\nint sodium_mprotect_noaccess(void *ptr);\n\nSODIUM_EXPORT\nint sodium_mprotect_readonly(void *ptr);\n\nSODIUM_EXPORT\nint sodium_mprotect_readwrite(void *ptr);\n\n/* -------- */\n\nint _sodium_alloc_init(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium/version.h.in",
    "content": "\n#ifndef sodium_version_H\n#define sodium_version_H\n\n#include \"export.h\"\n\n#define SODIUM_VERSION_STRING \"@VERSION@\"\n\n#define SODIUM_LIBRARY_VERSION_MAJOR @SODIUM_LIBRARY_VERSION_MAJOR@\n#define SODIUM_LIBRARY_VERSION_MINOR @SODIUM_LIBRARY_VERSION_MINOR@\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\nSODIUM_EXPORT\nconst char *sodium_version_string(void);\n\nSODIUM_EXPORT\nint         sodium_library_version_major(void);\n\nSODIUM_EXPORT\nint         sodium_library_version_minor(void);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/include/sodium.h",
    "content": "\n#ifndef sodium_H\n#define sodium_H\n\n#include \"sodium/core.h\"\n#include \"sodium/crypto_aead_aes256gcm.h\"\n#include \"sodium/crypto_aead_chacha20poly1305.h\"\n#include \"sodium/crypto_auth.h\"\n#include \"sodium/crypto_auth_hmacsha256.h\"\n#include \"sodium/crypto_auth_hmacsha512.h\"\n#include \"sodium/crypto_auth_hmacsha512256.h\"\n#include \"sodium/crypto_box.h\"\n#include \"sodium/crypto_box_curve25519xsalsa20poly1305.h\"\n#include \"sodium/crypto_core_hsalsa20.h\"\n#include \"sodium/crypto_core_salsa20.h\"\n#include \"sodium/crypto_core_salsa2012.h\"\n#include \"sodium/crypto_core_salsa208.h\"\n#include \"sodium/crypto_generichash.h\"\n#include \"sodium/crypto_generichash_blake2b.h\"\n#include \"sodium/crypto_hash.h\"\n#include \"sodium/crypto_hash_sha256.h\"\n#include \"sodium/crypto_hash_sha512.h\"\n#include \"sodium/crypto_onetimeauth.h\"\n#include \"sodium/crypto_onetimeauth_poly1305.h\"\n#include \"sodium/crypto_pwhash_scryptsalsa208sha256.h\"\n#include \"sodium/crypto_scalarmult.h\"\n#include \"sodium/crypto_scalarmult_curve25519.h\"\n#include \"sodium/crypto_secretbox.h\"\n#include \"sodium/crypto_secretbox_xsalsa20poly1305.h\"\n#include \"sodium/crypto_shorthash.h\"\n#include \"sodium/crypto_shorthash_siphash24.h\"\n#include \"sodium/crypto_sign.h\"\n#include \"sodium/crypto_sign_ed25519.h\"\n#include \"sodium/crypto_stream.h\"\n#include \"sodium/crypto_stream_aes128ctr.h\"\n#include \"sodium/crypto_stream_chacha20.h\"\n#include \"sodium/crypto_stream_salsa20.h\"\n#include \"sodium/crypto_stream_salsa2012.h\"\n#include \"sodium/crypto_stream_salsa208.h\"\n#include \"sodium/crypto_stream_xsalsa20.h\"\n#include \"sodium/crypto_verify_16.h\"\n#include \"sodium/crypto_verify_32.h\"\n#include \"sodium/crypto_verify_64.h\"\n#include \"sodium/randombytes.h\"\n#ifdef __native_client__\n# include \"sodium/randombytes_nativeclient.h\"\n#endif\n#include \"sodium/randombytes_salsa20_random.h\"\n#include \"sodium/randombytes_sysrandom.h\"\n#include \"sodium/runtime.h\"\n#include \"sodium/utils.h\"\n#include \"sodium/version.h\"\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/randombytes/nativeclient/randombytes_nativeclient.c",
    "content": "\n#include <assert.h>\n#include <stdint.h>\n#include <stdlib.h>\n\n#ifdef __native_client__\n# include <nacl/nacl_random.h>\n\n# include \"utils.h\"\n# include \"randombytes.h\"\n# include \"randombytes_nativeclient.h\"\n\nstatic void\nrandombytes_nativeclient_buf(void * const buf, const size_t size)\n{\n    size_t readnb;\n\n    if (nacl_secure_random(buf, size, &readnb) != 0) {\n        abort();\n    }\n    assert(readnb == size);\n}\n\nstatic uint32_t\nrandombytes_nativeclient_random(void)\n{\n    uint32_t r;\n\n    randombytes_nativeclient_buf(&r, sizeof r);\n\n    return r;\n}\n\nstatic const char *\nrandombytes_nativeclient_implementation_name(void)\n{\n    return \"nativeclient\";\n}\n\nstruct randombytes_implementation randombytes_nativeclient_implementation = {\n    SODIUM_C99(.implementation_name =) randombytes_nativeclient_implementation_name,\n    SODIUM_C99(.random =) randombytes_nativeclient_random,\n    SODIUM_C99(.stir =) NULL,\n    SODIUM_C99(.uniform =) NULL,\n    SODIUM_C99(.buf =) randombytes_nativeclient_buf,\n    SODIUM_C99(.close =) NULL\n};\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/randombytes/randombytes.c",
    "content": "\n#include <stdlib.h>\n#include <sys/types.h>\n\n#include <assert.h>\n#include <limits.h>\n#include <stdint.h>\n\n#ifdef __EMSCRIPTEN__\n# include <emscripten.h>\n#endif\n\n#include \"randombytes.h\"\n#include \"randombytes_sysrandom.h\"\n\n#ifdef __native_client__\n# include \"randombytes_nativeclient.h\"\n#endif\n\n#ifndef __EMSCRIPTEN__\n#ifdef __native_client__\nstatic const randombytes_implementation *implementation =\n    &randombytes_nativeclient_implementation;\n#else\nstatic const randombytes_implementation *implementation =\n    &randombytes_sysrandom_implementation;\n#endif\n#else\nstatic const randombytes_implementation *implementation = NULL;\n#endif\n\nint\nrandombytes_set_implementation(randombytes_implementation *impl)\n{\n    implementation = impl;\n\n    return 0;\n}\n\nconst char *\nrandombytes_implementation_name(void)\n{\n#ifndef __EMSCRIPTEN__\n    return implementation->implementation_name();\n#else\n    return \"js\";\n#endif\n}\n\nuint32_t\nrandombytes_random(void)\n{\n#ifndef __EMSCRIPTEN__\n    return implementation->random();\n#else\n    return EM_ASM_INT_V({\n        return Module.getRandomValue();\n    });\n#endif\n}\n\nvoid\nrandombytes_stir(void)\n{\n#ifndef __EMSCRIPTEN__\n    if (implementation != NULL && implementation->stir != NULL) {\n        implementation->stir();\n    }\n#else\n    EM_ASM({\n        if (Module.getRandomValue === undefined) {\n            try {\n                var window_ = \"object\" === typeof window ? window : self,\n                    crypto_ = typeof window_.crypto !== \"undefined\" ? window_.crypto : window_.msCrypto,\n                    randomValuesStandard = function() {\n                        var buf = new Uint32Array(1);\n                        crypto_.getRandomValues(buf);\n                        return buf[0] >>> 0;\n                    };\n                randomValuesStandard();\n                Module.getRandomValue = randomValuesStandard;\n            } catch (e) {\n                try {\n                    var crypto = require('crypto'),\n                        randomValueNodeJS = function() {\n                            var buf = crypto.randomBytes(4);\n                            return (buf[0] << 24 | buf[1] << 16 | buf[2] << 8 | buf[3]) >>> 0;\n                        };\n                    randomValueNodeJS();\n                    Module.getRandomValue = randomValueNodeJS;\n                } catch (e) {\n                    throw 'No secure random number generator found';\n                }\n            }\n        }\n    });\n#endif\n}\n\n/*\n * randombytes_uniform() derives from OpenBSD's arc4random_uniform()\n * Copyright (c) 2008, Damien Miller <djm@openbsd.org>\n */\nuint32_t\nrandombytes_uniform(const uint32_t upper_bound)\n{\n    uint32_t min;\n    uint32_t r;\n\n#ifdef __EMSCRIPTEN__\n    if (implementation != NULL && implementation->uniform != NULL) {\n        return implementation->uniform(upper_bound);\n    }\n#else\n    if (implementation->uniform != NULL) {\n        return implementation->uniform(upper_bound);\n    }\n#endif\n    if (upper_bound < 2) {\n        return 0;\n    }\n    min = (uint32_t) (-upper_bound % upper_bound);\n    do {\n        r = randombytes_random();\n    } while (r < min);\n\n    return r % upper_bound;\n}\n\nvoid\nrandombytes_buf(void * const buf, const size_t size)\n{\n#ifndef __EMSCRIPTEN__\n    if (size > (size_t) 0U) {\n        implementation->buf(buf, size);\n    }\n#else\n    unsigned char *p = buf;\n    size_t         i;\n\n    for (i = (size_t) 0U; i < size; i++) {\n        p[i] = (unsigned char) randombytes_random();\n    }\n#endif\n}\n\nint\nrandombytes_close(void)\n{\n    if (implementation != NULL && implementation->close != NULL) {\n        return implementation->close();\n    }\n    return 0;\n}\n\nvoid\nrandombytes(unsigned char * const buf, const unsigned long long buf_len)\n{\n    assert(buf_len <= SIZE_MAX);\n    randombytes_buf(buf, (size_t) buf_len);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/randombytes/salsa20/randombytes_salsa20_random.c",
    "content": "\n#include <stdlib.h>\n#include <sys/types.h>\n#ifndef _WIN32\n# include <sys/stat.h>\n# include <sys/time.h>\n#endif\n#ifdef __linux__\n# include <sys/syscall.h>\n#endif\n\n#include <assert.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <stdint.h>\n#include <string.h>\n#ifndef _MSC_VER\n# include <unistd.h>\n#endif\n\n#include \"crypto_core_salsa20.h\"\n#include \"crypto_generichash.h\"\n#include \"crypto_stream_salsa20.h\"\n#include \"randombytes.h\"\n#include \"randombytes_salsa20_random.h\"\n#include \"utils.h\"\n\n#ifdef _WIN32\n# include <windows.h>\n# include <sys/timeb.h>\n# define RtlGenRandom SystemFunction036\n# if defined(__cplusplus)\nextern \"C\"\n# endif\nBOOLEAN NTAPI RtlGenRandom(PVOID RandomBuffer, ULONG RandomBufferLength);\n# pragma comment(lib, \"advapi32.lib\")\n#endif\n\n#define SALSA20_RANDOM_BLOCK_SIZE crypto_core_salsa20_OUTPUTBYTES\n#define HASH_BLOCK_SIZE 128U\n#define COMPILER_ASSERT(X) (void) sizeof(char[(X) ? 1 : -1])\n\n#if defined(__OpenBSD__) || defined(__CloudABI__)\n# define HAVE_SAFE_ARC4RANDOM 1\n#endif\n\n#ifndef SSIZE_MAX\n# define SSIZE_MAX (SIZE_MAX / 2 - 1)\n#endif\n\ntypedef struct Salsa20Random_ {\n    unsigned char key[crypto_stream_salsa20_KEYBYTES];\n    unsigned char rnd32[16U * SALSA20_RANDOM_BLOCK_SIZE];\n    uint64_t      nonce;\n    size_t        rnd32_outleft;\n#ifdef HAVE_GETPID\n    pid_t         pid;\n#endif\n    int           random_data_source_fd;\n    int           initialized;\n    int           getrandom_available;\n} Salsa20Random;\n\nstatic Salsa20Random stream = {\n    SODIUM_C99(.random_data_source_fd =) -1,\n    SODIUM_C99(.rnd32_outleft =) (size_t) 0U,\n    SODIUM_C99(.initialized =) 0,\n    SODIUM_C99(.getrandom_available =) 0\n};\n\nstatic uint64_t\nsodium_hrtime(void)\n{\n    uint64_t ts;\n\n#ifdef _WIN32\n    {\n        struct _timeb tb;\n# pragma warning(push)\n# pragma warning(disable: 4996)\n        _ftime(&tb);\n# pragma warning(pop)\n        ts = ((uint64_t) tb.time) * 1000000U + ((uint64_t) tb.millitm) * 1000U;\n    }\n#else\n    {\n        struct timeval tv;\n        assert(gettimeofday(&tv, NULL) == 0);\n        ts = ((uint64_t) tv.tv_sec) * 1000000U + (uint64_t) tv.tv_usec;\n    }\n#endif\n    return ts;\n}\n\n#ifndef _WIN32\nstatic ssize_t\nsafe_read(const int fd, void * const buf_, size_t size)\n{\n    unsigned char *buf = (unsigned char *) buf_;\n    ssize_t        readnb;\n\n    assert(size > (size_t) 0U);\n    assert(size <= SSIZE_MAX);\n    do {\n        while ((readnb = read(fd, buf, size)) < (ssize_t) 0 &&\n               (errno == EINTR || errno == EAGAIN));  /* LCOV_EXCL_LINE */\n        if (readnb < (ssize_t) 0) {\n            return readnb; /* LCOV_EXCL_LINE */\n        }\n        if (readnb == (ssize_t) 0) {\n            break; /* LCOV_EXCL_LINE */\n        }\n        size -= (size_t) readnb;\n        buf += readnb;\n    } while (size > (ssize_t) 0);\n\n    return (ssize_t) (buf - (unsigned char *) buf_);\n}\n#endif\n\n#ifndef _WIN32\n# ifndef HAVE_SAFE_ARC4RANDOM\nstatic int\nrandombytes_salsa20_random_random_dev_open(void)\n{\n/* LCOV_EXCL_START */\n    struct stat       st;\n    static const char *devices[] = {\n#  ifndef USE_BLOCKING_RANDOM\n        \"/dev/urandom\",\n#  endif\n        \"/dev/random\", NULL\n    };\n    const char **     device = devices;\n    int               fd;\n\n    do {\n        fd = open(*device, O_RDONLY);\n        if (fd != -1) {\n            if (fstat(fd, &st) == 0 &&\n# ifdef __COMPCERT__\n                1\n# elif defined(S_ISNAM)\n                (S_ISNAM(st.st_mode) || S_ISCHR(st.st_mode))\n# else\n                S_ISCHR(st.st_mode)\n# endif\n               ) {\n#  if defined(F_SETFD) && defined(FD_CLOEXEC)\n                (void) fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);\n#  endif\n                return fd;\n            }\n            (void) close(fd);\n        } else if (errno == EINTR) {\n            continue;\n        }\n        device++;\n    } while (*device != NULL);\n\n    errno = EIO;\n    return -1;\n/* LCOV_EXCL_STOP */\n}\n# endif\n\n# ifdef SYS_getrandom\nstatic int\n_randombytes_linux_getrandom(void * const buf, const size_t size)\n{\n    int readnb;\n\n    assert(size <= 256U);\n    do {\n        readnb = syscall(SYS_getrandom, buf, (int) size, 0);\n    } while (readnb < 0 && (errno == EINTR || errno == EAGAIN));\n\n    return (readnb == (int) size) - 1;\n}\n\nstatic int\nrandombytes_linux_getrandom(void * const buf_, size_t size)\n{\n    unsigned char *buf = (unsigned char *) buf_;\n    size_t         chunk_size = 256U;\n\n    do {\n        if (size < chunk_size) {\n            chunk_size = size;\n            assert(chunk_size > (size_t) 0U);\n        }\n        if (_randombytes_linux_getrandom(buf, chunk_size) != 0) {\n            return -1;\n        }\n        size -= chunk_size;\n        buf += chunk_size;\n    } while (size > (size_t) 0U);\n\n    return 0;\n}\n# endif\n\nstatic void\nrandombytes_salsa20_random_init(void)\n{\n    const int errno_save = errno;\n\n    stream.nonce = sodium_hrtime();\n    assert(stream.nonce != (uint64_t) 0U);\n\n# ifdef HAVE_SAFE_ARC4RANDOM\n    errno = errno_save;\n# else\n\n#  ifdef SYS_getrandom\n    {\n        unsigned char fodder[16];\n\n        if (randombytes_linux_getrandom(fodder, sizeof fodder) == 0) {\n            stream.getrandom_available = 1;\n            errno = errno_save;\n            return;\n        }\n        stream.getrandom_available = 0;\n    }\n#  endif /* SYS_getrandom */\n\n    if ((stream.random_data_source_fd =\n         randombytes_salsa20_random_random_dev_open()) == -1) {\n        abort(); /* LCOV_EXCL_LINE */\n    }\n    errno = errno_save;\n# endif /* HAVE_SAFE_ARC4RANDOM */\n}\n\n#else /* _WIN32 */\n\nstatic void\nrandombytes_salsa20_random_init(void)\n{\n    stream.nonce = sodium_hrtime();\n    assert(stream.nonce != (uint64_t) 0U);\n}\n#endif\n\nstatic void\nrandombytes_salsa20_random_rekey(const unsigned char * const mix)\n{\n    unsigned char *key = stream.key;\n    size_t         i;\n\n    for (i = (size_t) 0U; i < sizeof stream.key; i++) {\n        key[i] ^= mix[i];\n    }\n}\n\nstatic void\nrandombytes_salsa20_random_stir(void)\n{\n    /* constant to personalize the hash function */\n    const unsigned char hsigma[crypto_generichash_KEYBYTES] = {\n        0x54, 0x68, 0x69, 0x73, 0x49, 0x73, 0x4a, 0x75,\n        0x73, 0x74, 0x41, 0x54, 0x68, 0x69, 0x72, 0x74,\n        0x79, 0x54, 0x77, 0x6f, 0x42, 0x79, 0x74, 0x65,\n        0x73, 0x53, 0x65, 0x65, 0x64, 0x2e, 0x2e, 0x2e\n    };\n    unsigned char  m0[crypto_stream_salsa20_KEYBYTES + HASH_BLOCK_SIZE];\n    unsigned char *k0 = m0 + crypto_stream_salsa20_KEYBYTES;\n    size_t         sizeof_k0 = sizeof m0 - crypto_stream_salsa20_KEYBYTES;\n\n    memset(stream.rnd32, 0, sizeof stream.rnd32);\n    stream.rnd32_outleft = (size_t) 0U;\n    if (stream.initialized == 0) {\n        randombytes_salsa20_random_init();\n        stream.initialized = 1;\n    }\n#ifndef _WIN32\n\n# ifdef HAVE_SAFE_ARC4RANDOM\n    arc4random_buf(m0, sizeof m0);\n# elif defined(SYS_getrandom)\n    if (stream.getrandom_available != 0) {\n        if (randombytes_linux_getrandom(m0, sizeof m0) != 0) {\n            abort(); /* LCOV_EXCL_LINE */\n        }\n    } else if (stream.random_data_source_fd == -1 ||\n               safe_read(stream.random_data_source_fd, m0,\n                         sizeof m0) != (ssize_t) sizeof m0) {\n        abort(); /* LCOV_EXCL_LINE */\n    }\n# else\n    if (stream.random_data_source_fd == -1 ||\n        safe_read(stream.random_data_source_fd, m0,\n                  sizeof m0) != (ssize_t) sizeof m0) {\n        abort(); /* LCOV_EXCL_LINE */\n    }\n# endif\n\n#else /* _WIN32 */\n    if (! RtlGenRandom((PVOID) m0, (ULONG) sizeof m0)) {\n        abort(); /* LCOV_EXCL_LINE */\n    }\n#endif\n    if (crypto_generichash(stream.key, sizeof stream.key, k0, sizeof_k0,\n                           hsigma, sizeof hsigma) != 0) {\n        abort();\n    }\n    COMPILER_ASSERT(sizeof stream.key <= sizeof m0);\n    randombytes_salsa20_random_rekey(m0);\n    sodium_memzero(m0, sizeof m0);\n#ifdef HAVE_GETPID\n    stream.pid = getpid();\n#endif\n}\n\nstatic void\nrandombytes_salsa20_random_stir_if_needed(void)\n{\n#ifdef HAVE_GETPID\n    if (stream.initialized == 0) {\n        randombytes_salsa20_random_stir();\n    } else if (stream.pid != getpid()) {\n        abort();\n    }\n#else\n    if (stream.initialized == 0) {\n        randombytes_salsa20_random_stir();\n    }\n#endif\n}\n\nstatic int\nrandombytes_salsa20_random_close(void)\n{\n    int ret = -1;\n\n#ifndef _WIN32\n    if (stream.random_data_source_fd != -1 &&\n        close(stream.random_data_source_fd) == 0) {\n        stream.random_data_source_fd = -1;\n        stream.initialized = 0;\n# ifdef HAVE_GETPID\n        stream.pid = (pid_t) 0;\n# endif\n        ret = 0;\n    }\n\n# ifdef HAVE_SAFE_ARC4RANDOM\n    ret = 0;\n# endif\n\n# ifdef SYS_getrandom\n    if (stream.getrandom_available != 0) {\n        ret = 0;\n    }\n# endif\n\n#else /* _WIN32 */\n    if (stream.initialized != 0) {\n        stream.initialized = 0;\n        ret = 0;\n    }\n#endif\n    return ret;\n}\n\nstatic void\nrandombytes_salsa20_random_buf(void * const buf, const size_t size)\n{\n    size_t i;\n    int    ret;\n\n    randombytes_salsa20_random_stir_if_needed();\n    COMPILER_ASSERT(sizeof stream.nonce == crypto_stream_salsa20_NONCEBYTES);\n#ifdef ULONG_LONG_MAX\n    /* coverity[result_independent_of_operands] */\n    assert(size <= ULONG_LONG_MAX);\n#endif\n    ret = crypto_stream_salsa20((unsigned char *) buf, (unsigned long long) size,\n                                (unsigned char *) &stream.nonce, stream.key);\n    assert(ret == 0);\n    for (i = 0U; i < sizeof size; i++) {\n        stream.key[i] ^= ((const unsigned char *) (const void *) &size)[i];\n    }\n    stream.nonce++;\n    crypto_stream_salsa20_xor(stream.key, stream.key, sizeof stream.key,\n                              (unsigned char *) &stream.nonce, stream.key);\n}\n\nstatic uint32_t\nrandombytes_salsa20_random_getword(void)\n{\n    uint32_t val;\n    int      ret;\n\n    COMPILER_ASSERT(sizeof stream.rnd32 >= (sizeof stream.key) + (sizeof val));\n    COMPILER_ASSERT(((sizeof stream.rnd32) - (sizeof stream.key))\n                    % sizeof val == (size_t) 0U);\n    if (stream.rnd32_outleft <= (size_t) 0U) {\n        randombytes_salsa20_random_stir_if_needed();\n        COMPILER_ASSERT(sizeof stream.nonce == crypto_stream_salsa20_NONCEBYTES);\n        ret = crypto_stream_salsa20((unsigned char *) stream.rnd32,\n                                    (unsigned long long) sizeof stream.rnd32,\n                                    (unsigned char *) &stream.nonce,\n                                    stream.key);\n        assert(ret == 0);\n        stream.rnd32_outleft = (sizeof stream.rnd32) - (sizeof stream.key);\n        randombytes_salsa20_random_rekey(&stream.rnd32[stream.rnd32_outleft]);\n        stream.nonce++;\n    }\n    stream.rnd32_outleft -= sizeof val;\n    memcpy(&val, &stream.rnd32[stream.rnd32_outleft], sizeof val);\n    memset(&stream.rnd32[stream.rnd32_outleft], 0, sizeof val);\n\n    return val;\n}\n\nstatic uint32_t\nrandombytes_salsa20_random(void)\n{\n    return randombytes_salsa20_random_getword();\n}\n\nstatic const char *\nrandombytes_salsa20_implementation_name(void)\n{\n    return \"salsa20\";\n}\n\nstruct randombytes_implementation randombytes_salsa20_implementation = {\n    SODIUM_C99(.implementation_name =) randombytes_salsa20_implementation_name,\n    SODIUM_C99(.random =) randombytes_salsa20_random,\n    SODIUM_C99(.stir =) randombytes_salsa20_random_stir,\n    SODIUM_C99(.uniform =) NULL,\n    SODIUM_C99(.buf =) randombytes_salsa20_random_buf,\n    SODIUM_C99(.close =) randombytes_salsa20_random_close\n};\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/randombytes/sysrandom/randombytes_sysrandom.c",
    "content": "\n#include <stdlib.h>\n#include <sys/types.h>\n#ifndef _WIN32\n# include <sys/stat.h>\n# include <sys/time.h>\n#endif\n#ifdef __linux__\n# include <sys/syscall.h>\n#endif\n\n#include <assert.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <limits.h>\n#include <stdint.h>\n#include <string.h>\n#ifndef _WIN32\n# include <unistd.h>\n#endif\n\n#include \"randombytes.h\"\n#include \"randombytes_sysrandom.h\"\n#include \"utils.h\"\n\n#ifdef _WIN32\n# include <windows.h>\n# define RtlGenRandom SystemFunction036\n# if defined(__cplusplus)\nextern \"C\"\n# endif\nBOOLEAN NTAPI RtlGenRandom(PVOID RandomBuffer, ULONG RandomBufferLength);\n# pragma comment(lib, \"advapi32.lib\")\n#endif\n\n#if defined(__OpenBSD__) || defined(__CloudABI__)\n# define HAVE_SAFE_ARC4RANDOM 1\n#endif\n\n#ifndef SSIZE_MAX\n# define SSIZE_MAX (SIZE_MAX / 2 - 1)\n#endif\n\n#ifdef HAVE_SAFE_ARC4RANDOM\n\nstatic uint32_t\nrandombytes_sysrandom(void)\n{\n    return arc4random();\n}\n\nstatic void\nrandombytes_sysrandom_stir(void)\n{\n}\n\nstatic void\nrandombytes_sysrandom_buf(void * const buf, const size_t size)\n{\n    return arc4random_buf(buf, size);\n}\n\nstatic int\nrandombytes_sysrandom_close(void)\n{\n    return 0;\n}\n\n#else /* __OpenBSD__ */\n\ntypedef struct SysRandom_ {\n    int random_data_source_fd;\n    int initialized;\n    int getrandom_available;\n} SysRandom;\n\nstatic SysRandom stream = {\n    SODIUM_C99(.random_data_source_fd =) -1,\n    SODIUM_C99(.initialized =) 0,\n    SODIUM_C99(.getrandom_available =) 0\n};\n\n#ifndef _WIN32\nstatic ssize_t\nsafe_read(const int fd, void * const buf_, size_t size)\n{\n    unsigned char *buf = (unsigned char *) buf_;\n    ssize_t        readnb;\n\n    assert(size > (size_t) 0U);\n    assert(size <= SSIZE_MAX);\n    do {\n        while ((readnb = read(fd, buf, size)) < (ssize_t) 0 &&\n               (errno == EINTR || errno == EAGAIN)); /* LCOV_EXCL_LINE */\n        if (readnb < (ssize_t) 0) {\n            return readnb; /* LCOV_EXCL_LINE */\n        }\n        if (readnb == (ssize_t) 0) {\n            break; /* LCOV_EXCL_LINE */\n        }\n        size -= (size_t) readnb;\n        buf += readnb;\n    } while (size > (ssize_t) 0);\n\n    return (ssize_t) (buf - (unsigned char *) buf_);\n}\n#endif\n\n#ifndef _WIN32\nstatic int\nrandombytes_sysrandom_random_dev_open(void)\n{\n/* LCOV_EXCL_START */\n    struct stat        st;\n    static const char *devices[] = {\n# ifndef USE_BLOCKING_RANDOM\n        \"/dev/urandom\",\n# endif\n        \"/dev/random\", NULL\n    };\n    const char **      device = devices;\n    int                fd;\n\n    do {\n        fd = open(*device, O_RDONLY);\n        if (fd != -1) {\n            if (fstat(fd, &st) == 0 &&\n# ifdef __COMPCERT__\n                1\n# elif defined(S_ISNAM)\n                (S_ISNAM(st.st_mode) || S_ISCHR(st.st_mode))\n# else\n                S_ISCHR(st.st_mode)\n# endif\n               ) {\n# if defined(F_SETFD) && defined(FD_CLOEXEC)\n                (void) fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC);\n# endif\n                return fd;\n            }\n            (void) close(fd);\n        } else if (errno == EINTR) {\n            continue;\n        }\n        device++;\n    } while (*device != NULL);\n\n    errno = EIO;\n    return -1;\n/* LCOV_EXCL_STOP */\n}\n\n# ifdef SYS_getrandom\nstatic int\n_randombytes_linux_getrandom(void * const buf, const size_t size)\n{\n    int readnb;\n\n    assert(size <= 256U);\n    do {\n        readnb = syscall(SYS_getrandom, buf, (int) size, 0);\n    } while (readnb < 0 && (errno == EINTR || errno == EAGAIN));\n\n    return (readnb == (int) size) - 1;\n}\n\nstatic int\nrandombytes_linux_getrandom(void * const buf_, size_t size)\n{\n    unsigned char *buf = (unsigned char *) buf_;\n    size_t         chunk_size = 256U;\n\n    do {\n        if (size < chunk_size) {\n            chunk_size = size;\n            assert(chunk_size > (size_t) 0U);\n        }\n        if (_randombytes_linux_getrandom(buf, chunk_size) != 0) {\n            return -1;\n        }\n        size -= chunk_size;\n        buf += chunk_size;\n    } while (size > (size_t) 0U);\n\n    return 0;\n}\n# endif\n\nstatic void\nrandombytes_sysrandom_init(void)\n{\n    const int     errno_save = errno;\n\n# ifdef SYS_getrandom\n    {\n        unsigned char fodder[16];\n\n        if (randombytes_linux_getrandom(fodder, sizeof fodder) == 0) {\n            stream.getrandom_available = 1;\n            errno = errno_save;\n            return;\n        }\n        stream.getrandom_available = 0;\n    }\n# endif\n\n    if ((stream.random_data_source_fd =\n         randombytes_sysrandom_random_dev_open()) == -1) {\n        abort(); /* LCOV_EXCL_LINE */\n    }\n    errno = errno_save;\n}\n\n#else /* _WIN32 */\n\nstatic void\nrandombytes_sysrandom_init(void)\n{\n}\n#endif\n\nstatic void\nrandombytes_sysrandom_stir(void)\n{\n    if (stream.initialized == 0) {\n        randombytes_sysrandom_init();\n        stream.initialized = 1;\n    }\n}\n\nstatic void\nrandombytes_sysrandom_stir_if_needed(void)\n{\n    if (stream.initialized == 0) {\n        randombytes_sysrandom_stir();\n    }\n}\n\nstatic int\nrandombytes_sysrandom_close(void)\n{\n    int ret = -1;\n\n#ifndef _WIN32\n    if (stream.random_data_source_fd != -1 &&\n        close(stream.random_data_source_fd) == 0) {\n        stream.random_data_source_fd = -1;\n        stream.initialized = 0;\n        ret = 0;\n    }\n# ifdef SYS_getrandom\n    if (stream.getrandom_available != 0) {\n        ret = 0;\n    }\n# endif\n#else /* _WIN32 */\n    if (stream.initialized != 0) {\n        stream.initialized = 0;\n        ret = 0;\n    }\n#endif\n    return ret;\n}\n\nstatic void\nrandombytes_sysrandom_buf(void * const buf, const size_t size)\n{\n    randombytes_sysrandom_stir_if_needed();\n#ifdef ULONG_LONG_MAX\n    /* coverity[result_independent_of_operands] */\n    assert(size <= ULONG_LONG_MAX);\n#endif\n#ifndef _WIN32\n# ifdef SYS_getrandom\n    if (stream.getrandom_available != 0) {\n        if (randombytes_linux_getrandom(buf, size) != 0) {\n            abort();\n        }\n        return;\n    }\n# endif\n    if (stream.random_data_source_fd == -1 ||\n        safe_read(stream.random_data_source_fd, buf, size) != (ssize_t) size) {\n        abort(); /* LCOV_EXCL_LINE */\n    }\n#else\n    if (size > (size_t) 0xffffffff) {\n        abort(); /* LCOV_EXCL_LINE */\n    }\n    if (! RtlGenRandom((PVOID) buf, (ULONG) size)) {\n        abort(); /* LCOV_EXCL_LINE */\n    }\n#endif\n}\n\nstatic uint32_t\nrandombytes_sysrandom(void)\n{\n    uint32_t r;\n\n    randombytes_sysrandom_buf(&r, sizeof r);\n\n    return r;\n}\n\n#endif /* __OpenBSD__ */\n\nstatic const char *\nrandombytes_sysrandom_implementation_name(void)\n{\n    return \"sysrandom\";\n}\n\nstruct randombytes_implementation randombytes_sysrandom_implementation = {\n    SODIUM_C99(.implementation_name =) randombytes_sysrandom_implementation_name,\n    SODIUM_C99(.random =) randombytes_sysrandom,\n    SODIUM_C99(.stir =) randombytes_sysrandom_stir,\n    SODIUM_C99(.uniform =) NULL,\n    SODIUM_C99(.buf =) randombytes_sysrandom_buf,\n    SODIUM_C99(.close =) randombytes_sysrandom_close\n};\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/sodium/core.c",
    "content": "\n#include \"core.h\"\n#include \"crypto_generichash.h\"\n#include \"crypto_onetimeauth.h\"\n#include \"crypto_scalarmult.h\"\n#include \"crypto_stream_chacha20.h\"\n#include \"randombytes.h\"\n#include \"runtime.h\"\n#include \"utils.h\"\n\nstatic int initialized;\n\nint\nsodium_init(void)\n{\n    if (initialized != 0) {\n        return 1;\n    }\n    _sodium_runtime_get_cpu_features();\n    randombytes_stir();\n    _sodium_alloc_init();\n    _crypto_generichash_blake2b_pick_best_implementation();\n    _crypto_onetimeauth_poly1305_pick_best_implementation();\n    _crypto_scalarmult_curve25519_pick_best_implementation();\n    _crypto_stream_chacha20_pick_best_implementation();\n    initialized = 1;\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/sodium/runtime.c",
    "content": "\n#ifdef HAVE_ANDROID_GETCPUFEATURES\n# include <cpu-features.h>\n#endif\n\n#include \"runtime.h\"\n\ntypedef struct CPUFeatures_ {\n    int initialized;\n    int has_neon;\n    int has_sse2;\n    int has_sse3;\n    int has_ssse3;\n    int has_sse41;\n    int has_avx;\n    int has_pclmul;\n    int has_aesni;\n} CPUFeatures;\n\nstatic CPUFeatures _cpu_features;\n\n#define CPUID_SSE2      0x04000000\n#define CPUIDECX_SSE3   0x00000001\n#define CPUIDECX_SSSE3  0x00000200\n#define CPUIDECX_SSE41  0x00080000\n#define CPUIDECX_AVX    0x10000000\n#define CPUIDECX_PCLMUL 0x00000002\n#define CPUIDECX_AESNI  0x02000000\n\nstatic int\n_sodium_runtime_arm_cpu_features(CPUFeatures * const cpu_features)\n{\n#ifndef __arm__\n    cpu_features->has_neon = 0;\n    return -1;\n#else\n# ifdef __APPLE__\n#  ifdef __ARM_NEON__\n    cpu_features->has_neon = 1;\n#  else\n    cpu_features->has_neon = 0;\n#  endif\n# elif defined(HAVE_ANDROID_GETCPUFEATURES) && defined(ANDROID_CPU_ARM_FEATURE_NEON)\n    cpu_features->has_neon =\n        (android_getCpuFeatures() & ANDROID_CPU_ARM_FEATURE_NEON) != 0x0;\n# else\n    cpu_features->has_neon = 0;\n# endif\n    return 0;\n#endif\n}\n\nstatic void\n_cpuid(unsigned int cpu_info[4U], const unsigned int cpu_info_type)\n{\n#if defined(_MSC_VER) && \\\n    (defined(_M_X64) || defined(_M_AMD64) || defined(_M_IX86))\n    __cpuid((int *) cpu_info, cpu_info_type);\n#elif defined(HAVE_CPUID)\n    cpu_info[0] = cpu_info[1] = cpu_info[2] = cpu_info[3] = 0;\n# ifdef __i386__\n    __asm__ __volatile__ (\"pushfl; pushfl; \"\n                          \"popl %0; \"\n                          \"movl %0, %1; xorl %2, %0; \"\n                          \"pushl %0; \"\n                          \"popfl; pushfl; popl %0; popfl\" :\n                          \"=&r\" (cpu_info[0]), \"=&r\" (cpu_info[1]) :\n                          \"i\" (0x200000));\n    if (((cpu_info[0] ^ cpu_info[1]) & 0x200000) == 0x0) {\n        return; /* LCOV_EXCL_LINE */\n    }\n# endif\n# ifdef __i386__\n    __asm__ __volatile__ (\"xchgl %%ebx, %k1; cpuid; xchgl %%ebx, %k1\" :\n                          \"=a\" (cpu_info[0]), \"=&r\" (cpu_info[1]),\n                          \"=c\" (cpu_info[2]), \"=d\" (cpu_info[3]) :\n                          \"0\" (cpu_info_type), \"2\" (0U));\n# elif defined(__x86_64__)\n    __asm__ __volatile__ (\"xchgq %%rbx, %q1; cpuid; xchgq %%rbx, %q1\" :\n                          \"=a\" (cpu_info[0]), \"=&r\" (cpu_info[1]),\n                          \"=c\" (cpu_info[2]), \"=d\" (cpu_info[3]) :\n                          \"0\" (cpu_info_type), \"2\" (0U));\n# else\n    __asm__ __volatile__ (\"cpuid\" :\n                          \"=a\" (cpu_info[0]), \"=b\" (cpu_info[1]),\n                          \"=c\" (cpu_info[2]), \"=d\" (cpu_info[3]) :\n                          \"0\" (cpu_info_type), \"2\" (0U));\n# endif\n#else\n    cpu_info[0] = cpu_info[1] = cpu_info[2] = cpu_info[3] = 0;\n#endif\n}\n\nstatic int\n_sodium_runtime_intel_cpu_features(CPUFeatures * const cpu_features)\n{\n    unsigned int cpu_info[4];\n    unsigned int id;\n\n    _cpuid(cpu_info, 0x0);\n    if ((id = cpu_info[0]) == 0U) {\n        return -1; /* LCOV_EXCL_LINE */\n    }\n    _cpuid(cpu_info, 0x00000001);\n#if defined(HAVE_EMMINTRIN_H) || \\\n    (defined(_MSC_VER) && (defined(_M_X64) || defined(_M_AMD64) || defined(_M_IX86)))\n    cpu_features->has_sse2 = ((cpu_info[3] & CPUID_SSE2) != 0x0);\n#else\n    cpu_features->has_sse2 = 0;\n#endif\n\n#if defined(HAVE_PMMINTRIN_H) || \\\n    (defined(_MSC_VER) && (defined(_M_X64) || defined(_M_AMD64) || defined(_M_IX86)))\n    cpu_features->has_sse3 = ((cpu_info[2] & CPUIDECX_SSE3) != 0x0);\n#else\n    cpu_features->has_sse3 = 0;\n#endif\n\n#if defined(HAVE_TMMINTRIN_H) || \\\n    (defined(_MSC_VER) && (defined(_M_X64) || defined(_M_AMD64) || defined(_M_IX86)))\n    cpu_features->has_ssse3 = ((cpu_info[2] & CPUIDECX_SSSE3) != 0x0);\n#else\n    cpu_features->has_ssse3 = 0;\n#endif\n\n#if defined(HAVE_SMMINTRIN_H) || \\\n    (defined(_MSC_VER) && (defined(_M_X64) || defined(_M_AMD64) || defined(_M_IX86)))\n    cpu_features->has_sse41 = ((cpu_info[2] & CPUIDECX_SSE41) != 0x0);\n#else\n    cpu_features->has_sse41 = 0;\n#endif\n\n#if defined(HAVE_AVXINTRIN_H) || \\\n    (defined(_MSC_VER) && (defined(_M_X64) || defined(_M_AMD64) || defined(_M_IX86)))\n    cpu_features->has_avx = ((cpu_info[2] & CPUIDECX_AVX) != 0x0);\n#else\n    cpu_features->has_avx = 0;\n#endif\n\n#if defined(HAVE_WMMINTRIN_H) || \\\n    (defined(_MSC_VER) && (defined(_M_X64) || defined(_M_AMD64) || defined(_M_IX86)))\n    cpu_features->has_pclmul = ((cpu_info[2] & CPUIDECX_PCLMUL) != 0x0);\n    cpu_features->has_aesni = ((cpu_info[2] & CPUIDECX_AESNI) != 0x0);\n#else\n    cpu_features->has_pclmul = 0;\n    cpu_features->has_aesni = 0;\n#endif\n\n    return 0;\n}\n\nint\n_sodium_runtime_get_cpu_features(void)\n{\n    int ret = -1;\n\n    ret &= _sodium_runtime_arm_cpu_features(&_cpu_features);\n    ret &= _sodium_runtime_intel_cpu_features(&_cpu_features);\n    _cpu_features.initialized = 1;\n\n    return ret;\n}\n\nint\nsodium_runtime_has_neon(void) {\n    return _cpu_features.has_neon;\n}\n\nint\nsodium_runtime_has_sse2(void) {\n    return _cpu_features.has_sse2;\n}\n\nint\nsodium_runtime_has_sse3(void) {\n    return _cpu_features.has_sse3;\n}\n\nint\nsodium_runtime_has_ssse3(void) {\n    return _cpu_features.has_ssse3;\n}\n\nint\nsodium_runtime_has_sse41(void) {\n    return _cpu_features.has_sse41;\n}\n\nint\nsodium_runtime_has_avx(void) {\n    return _cpu_features.has_avx;\n}\n\nint\nsodium_runtime_has_pclmul(void) {\n    return _cpu_features.has_pclmul;\n}\n\nint\nsodium_runtime_has_aesni(void) {\n    return _cpu_features.has_aesni;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/sodium/utils.c",
    "content": "#ifndef __STDC_WANT_LIB_EXT1__\n# define __STDC_WANT_LIB_EXT1__ 1\n#endif\n#include <assert.h>\n#include <errno.h>\n#include <limits.h>\n#include <signal.h>\n#include <stddef.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n#ifdef HAVE_SYS_MMAN_H\n# include <sys/mman.h>\n#endif\n\n#include \"utils.h\"\n#include \"randombytes.h\"\n#ifdef _WIN32\n# include <windows.h>\n# include <wincrypt.h>\n#else\n# include <unistd.h>\n#endif\n\n#if defined(_WIN32) && (!defined(WINAPI_FAMILY) || WINAPI_FAMILY == WINAPI_FAMILY_DESKTOP_APP)\n# define WINAPI_DESKTOP\n#endif\n\n#define CANARY_SIZE 16U\n#define GARBAGE_VALUE 0xd0\n\n#ifndef MAP_NOCORE\n# define MAP_NOCORE 0\n#endif\n#if !defined(MAP_ANON) && defined(MAP_ANONYMOUS)\n# define MAP_ANON MAP_ANONYMOUS\n#endif\n#if defined(WINAPI_DESKTOP) || (defined(MAP_ANON) && defined(HAVE_MMAP)) || defined(HAVE_POSIX_MEMALIGN)\n# define HAVE_ALIGNED_MALLOC\n#endif\n#if defined(HAVE_MPROTECT) && !(defined(PROT_NONE) && defined(PROT_READ) && defined(PROT_WRITE))\n# undef HAVE_MPROTECT\n#endif\n#if defined(HAVE_ALIGNED_MALLOC) && (defined(WINAPI_DESKTOP) || defined(HAVE_MPROTECT))\n# define HAVE_PAGE_PROTECTION\n#endif\n\nstatic size_t page_size;\nstatic unsigned char canary[CANARY_SIZE];\n\n#ifdef HAVE_WEAK_SYMBOLS\n__attribute__((weak)) void\n_sodium_dummy_symbol_to_prevent_memzero_lto(void * const pnt, const size_t len)\n{\n    (void) pnt;\n    (void) len;\n}\n#endif\n\nvoid\nsodium_memzero(void * const pnt, const size_t len)\n{\n#ifdef _WIN32\n    SecureZeroMemory(pnt, len);\n#elif defined(HAVE_MEMSET_S)\n    if (memset_s(pnt, (rsize_t) len, 0, (rsize_t) len) != 0) {\n        abort(); /* LCOV_EXCL_LINE */\n    }\n#elif defined(HAVE_EXPLICIT_BZERO)\n    explicit_bzero(pnt, len);\n#elif HAVE_WEAK_SYMBOLS\n    memset(pnt, 0, len);\n    _sodium_dummy_symbol_to_prevent_memzero_lto(pnt, len);\n#else\n    volatile unsigned char *pnt_ = (volatile unsigned char *) pnt;\n    size_t                     i = (size_t) 0U;\n\n    while (i < len) {\n        pnt_[i++] = 0U;\n    }\n#endif\n}\n\n#ifdef HAVE_WEAK_SYMBOLS\n__attribute__((weak)) void\n_sodium_dummy_symbol_to_prevent_memcmp_lto(const unsigned char *b1,\n                                           const unsigned char *b2,\n                                           const size_t len)\n{\n    (void) b1;\n    (void) b2;\n    (void) len;\n}\n#endif\n\nint\nsodium_memcmp(const void * const b1_, const void * const b2_, size_t len)\n{\n#ifdef HAVE_WEAK_SYMBOLS\n    const unsigned char *b1 = (const unsigned char *) b1_;\n    const unsigned char *b2 = (const unsigned char *) b2_;\n#else\n    const volatile unsigned char *b1 = (const volatile unsigned char *) b1_;\n    const volatile unsigned char *b2 = (const volatile unsigned char *) b2_;\n#endif\n    size_t               i;\n    unsigned char        d = (unsigned char) 0U;\n\n#if HAVE_WEAK_SYMBOLS\n    _sodium_dummy_symbol_to_prevent_memcmp_lto(b1, b2, len);\n#endif\n    for (i = 0U; i < len; i++) {\n        d |= b1[i] ^ b2[i];\n    }\n    return (1 & ((d - 1) >> 8)) - 1;\n}\n\n#ifdef HAVE_WEAK_SYMBOLS\n__attribute__((weak)) void\n_sodium_dummy_symbol_to_prevent_compare_lto(const unsigned char *b1,\n                                            const unsigned char *b2,\n                                            const size_t len)\n{\n    (void) b1;\n    (void) b2;\n    (void) len;\n}\n#endif\n\nint\nsodium_compare(const unsigned char *b1_, const unsigned char *b2_, size_t len)\n{\n#ifdef HAVE_WEAK_SYMBOLS\n    const unsigned char *b1 = b1_;\n    const unsigned char *b2 = b2_;\n#else\n    const volatile unsigned char *b1 = (const volatile unsigned char *) b1_;\n    const volatile unsigned char *b2 = (const volatile unsigned char *) b2_;\n#endif\n    unsigned char gt = 0U;\n    unsigned char eq = 1U;\n    size_t        i;\n\n#if HAVE_WEAK_SYMBOLS\n    _sodium_dummy_symbol_to_prevent_compare_lto(b1, b2, len);\n#endif\n    i = len;\n    while (i != 0U) {\n        i--;\n        gt |= ((b2[i] - b1[i]) >> 8) & eq;\n        eq &= ((b2[i] ^ b1[i]) - 1) >> 8;\n    }\n    return (int) (gt + gt + eq) - 1;\n}\n\nint\nsodium_is_zero(const unsigned char *n, const size_t nlen)\n{\n    size_t        i;\n    unsigned char d = 0U;\n\n    for (i = 0U; i < nlen; i++) {\n        d |= n[i];\n    }\n    return 1 & ((d - 1) >> 8);\n}\n\nvoid\nsodium_increment(unsigned char *n, const size_t nlen)\n{\n    size_t        i = 0U;\n    uint_fast16_t c = 1U;\n\n#ifdef HAVE_AMD64_ASM\n    uint64_t      t64, t64_2;\n    uint32_t      t32;\n\n    if (nlen == 12U) {\n        __asm__ __volatile__(\"xorq %[t64], %[t64] \\n\"\n                             \"xorl %[t32], %[t32] \\n\"\n                             \"stc \\n\"\n                             \"adcq %[t64], (%[out]) \\n\"\n                             \"adcl %[t32], 8(%[out]) \\n\"\n                             : [t64] \"=&r\"(t64), [t32] \"=&r\" (t32)\n                             : [out] \"D\"(n)\n                             : \"memory\", \"flags\", \"cc\");\n        return;\n    } else if (nlen == 24U) {\n        __asm__ __volatile__(\"movq $1, %[t64] \\n\"\n                             \"xorq %[t64_2], %[t64_2] \\n\"\n                             \"addq %[t64], (%[out]) \\n\"\n                             \"adcq %[t64_2], 8(%[out]) \\n\"\n                             \"adcq %[t64_2], 16(%[out]) \\n\"\n                             : [t64] \"=&r\"(t64), [t64_2] \"=&r\" (t64_2)\n                             : [out] \"D\"(n)\n                             : \"memory\", \"flags\", \"cc\");\n        return;\n    } else if (nlen == 8U) {\n        __asm__ __volatile__(\"incq (%[out]) \\n\"\n                             :\n                             : [out] \"D\"(n)\n                             : \"memory\", \"flags\", \"cc\");\n        return;\n    }\n#endif\n    for (; i < nlen; i++) {\n        c += (uint_fast16_t) n[i];\n        n[i] = (unsigned char) c;\n        c >>= 8;\n    }\n}\n\nvoid\nsodium_add(unsigned char *a, const unsigned char *b, const size_t len)\n{\n    size_t        i = 0U;\n    uint_fast16_t c = 0U;\n\n#ifdef HAVE_AMD64_ASM\n    uint64_t      t64, t64_2, t64_3;\n    uint32_t      t32;\n\n    if (len == 12U) {\n        __asm__ __volatile__(\"movq (%[in]), %[t64] \\n\"\n                             \"movl 8(%[in]), %[t32] \\n\"\n                             \"addq %[t64], (%[out]) \\n\"\n                             \"adcl %[t32], 8(%[out]) \\n\"\n                             : [t64] \"=&r\"(t64), [t32] \"=&r\" (t32)\n                             : [in] \"S\"(b), [out] \"D\"(a)\n                             : \"memory\", \"flags\", \"cc\");\n        return;\n    } else if (len == 24U) {\n        __asm__ __volatile__(\"movq (%[in]), %[t64] \\n\"\n                             \"movq 8(%[in]), %[t64_2] \\n\"\n                             \"movq 16(%[in]), %[t64_3] \\n\"\n                             \"addq %[t64], (%[out]) \\n\"\n                             \"adcq %[t64_2], 8(%[out]) \\n\"\n                             \"adcq %[t64_3], 16(%[out]) \\n\"\n                             : [t64] \"=&r\"(t64), [t64_2] \"=&r\"(t64_2), [t64_3] \"=&r\"(t64_3)\n                             : [in] \"S\"(b), [out] \"D\"(a)\n                             : \"memory\", \"flags\", \"cc\");\n        return;\n    } else if (len == 8U) {\n        __asm__ __volatile__(\"movq (%[in]), %[t64] \\n\"\n                             \"addq %[t64], (%[out]) \\n\"\n                             : [t64] \"=&r\"(t64)\n                             : [in] \"S\"(b), [out] \"D\"(a)\n                             : \"memory\", \"flags\", \"cc\");\n        return;\n    }\n#endif\n    for (; i < len; i++) {\n        c += (uint_fast16_t) a[i] + (uint_fast16_t) b[i];\n        a[i] = (unsigned char) c;\n        c >>= 8;\n    }\n}\n\n/* Derived from original code by CodesInChaos */\nchar *\nsodium_bin2hex(char * const hex, const size_t hex_maxlen,\n               const unsigned char * const bin, const size_t bin_len)\n{\n    size_t       i = (size_t) 0U;\n    unsigned int x;\n    int          b;\n    int          c;\n\n    if (bin_len >= SIZE_MAX / 2 || hex_maxlen <= bin_len * 2U) {\n        abort(); /* LCOV_EXCL_LINE */\n    }\n    while (i < bin_len) {\n        c = bin[i] & 0xf;\n        b = bin[i] >> 4;\n        x = (unsigned char) (87U + c + (((c - 10U) >> 8) & ~38U)) << 8 |\n            (unsigned char) (87U + b + (((b - 10U) >> 8) & ~38U));\n        hex[i * 2U] = (char) x;\n        x >>= 8;\n        hex[i * 2U + 1U] = (char) x;\n        i++;\n    }\n    hex[i * 2U] = 0U;\n\n    return hex;\n}\n\nint\nsodium_hex2bin(unsigned char * const bin, const size_t bin_maxlen,\n               const char * const hex, const size_t hex_len,\n               const char * const ignore, size_t * const bin_len,\n               const char ** const hex_end)\n{\n    size_t        bin_pos = (size_t) 0U;\n    size_t        hex_pos = (size_t) 0U;\n    int           ret = 0;\n    unsigned char c;\n    unsigned char c_acc = 0U;\n    unsigned char c_alpha0, c_alpha;\n    unsigned char c_num0, c_num;\n    unsigned char c_val;\n    unsigned char state = 0U;\n\n    while (hex_pos < hex_len) {\n        c = (unsigned char) hex[hex_pos];\n        c_num = c ^ 48U;\n        c_num0 = (c_num - 10U) >> 8;\n        c_alpha = (c & ~32U) - 55U;\n        c_alpha0 = ((c_alpha - 10U) ^ (c_alpha - 16U)) >> 8;\n        if ((c_num0 | c_alpha0) == 0U) {\n            if (ignore != NULL && state == 0U && strchr(ignore, c) != NULL) {\n                hex_pos++;\n                continue;\n            }\n            break;\n        }\n        c_val = (c_num0 & c_num) | (c_alpha0 & c_alpha);\n        if (bin_pos >= bin_maxlen) {\n            ret = -1;\n            errno = ERANGE;\n            break;\n        }\n        if (state == 0U) {\n            c_acc = c_val * 16U;\n        } else {\n            bin[bin_pos++] = c_acc | c_val;\n        }\n        state = ~state;\n        hex_pos++;\n    }\n    if (state != 0U) {\n        hex_pos--;\n    }\n    if (hex_end != NULL) {\n        *hex_end = &hex[hex_pos];\n    }\n    if (bin_len != NULL) {\n        *bin_len = bin_pos;\n    }\n    return ret;\n}\n\nint\n_sodium_alloc_init(void)\n{\n#ifdef HAVE_ALIGNED_MALLOC\n# if defined(_SC_PAGESIZE)\n    long page_size_ = sysconf(_SC_PAGESIZE);\n    if (page_size_ > 0L) {\n        page_size = (size_t) page_size_;\n    }\n# elif defined(WINAPI_DESKTOP)\n    SYSTEM_INFO si;\n    GetSystemInfo(&si);\n    page_size = (size_t) si.dwPageSize;\n# endif\n    if (page_size < CANARY_SIZE || page_size < sizeof(size_t)) {\n        abort(); /* LCOV_EXCL_LINE */\n    }\n#endif\n    randombytes_buf(canary, sizeof canary);\n\n    return 0;\n}\n\nint\nsodium_mlock(void * const addr, const size_t len)\n{\n#if defined(MADV_DONTDUMP) && defined(HAVE_MADVISE)\n    (void) madvise(addr, len, MADV_DONTDUMP);\n#endif\n#ifdef HAVE_MLOCK\n    return mlock(addr, len);\n#elif defined(WINAPI_DESKTOP)\n    return -(VirtualLock(addr, len) == 0);\n#else\n    errno = ENOSYS;\n    return -1;\n#endif\n}\n\nint\nsodium_munlock(void * const addr, const size_t len)\n{\n    sodium_memzero(addr, len);\n#if defined(MADV_DODUMP) && defined(HAVE_MADVISE)\n    (void) madvise(addr, len, MADV_DODUMP);\n#endif\n#ifdef HAVE_MLOCK\n    return munlock(addr, len);\n#elif defined(WINAPI_DESKTOP)\n    return -(VirtualUnlock(addr, len) == 0);\n#else\n    errno = ENOSYS;\n    return -1;\n#endif\n}\n\nstatic int\n_mprotect_noaccess(void *ptr, size_t size)\n{\n#ifdef HAVE_MPROTECT\n    return mprotect(ptr, size, PROT_NONE);\n#elif defined(WINAPI_DESKTOP)\n    DWORD old;\n    return -(VirtualProtect(ptr, size, PAGE_NOACCESS, &old) == 0);\n#else\n    errno = ENOSYS;\n    return -1;\n#endif\n}\n\nstatic int\n_mprotect_readonly(void *ptr, size_t size)\n{\n#ifdef HAVE_MPROTECT\n    return mprotect(ptr, size, PROT_READ);\n#elif defined(WINAPI_DESKTOP)\n    DWORD old;\n    return -(VirtualProtect(ptr, size, PAGE_READONLY, &old) == 0);\n#else\n    errno = ENOSYS;\n    return -1;\n#endif\n}\n\nstatic int\n_mprotect_readwrite(void *ptr, size_t size)\n{\n#ifdef HAVE_MPROTECT\n    return mprotect(ptr, size, PROT_READ | PROT_WRITE);\n#elif defined(WINAPI_DESKTOP)\n    DWORD old;\n    return -(VirtualProtect(ptr, size, PAGE_READWRITE, &old) == 0);\n#else\n    errno = ENOSYS;\n    return -1;\n#endif\n}\n\n#ifdef HAVE_ALIGNED_MALLOC\n\nstatic void\n_out_of_bounds(void)\n{\n# ifdef SIGSEGV\n    raise(SIGSEGV);\n# elif defined(SIGKILL)\n    raise(SIGKILL);\n# endif\n    abort();\n} /* LCOV_EXCL_LINE */\n\nstatic inline size_t\n_page_round(const size_t size)\n{\n    const size_t page_mask = page_size - 1U;\n\n    return (size + page_mask) & ~page_mask;\n}\n\nstatic __attribute__((malloc)) unsigned char *\n_alloc_aligned(const size_t size)\n{\n    void *ptr;\n\n# if defined(MAP_ANON) && defined(HAVE_MMAP)\n    if ((ptr = mmap(NULL, size, PROT_READ | PROT_WRITE,\n                    MAP_ANON | MAP_PRIVATE | MAP_NOCORE, -1, 0)) == MAP_FAILED) {\n        ptr = NULL; /* LCOV_EXCL_LINE */\n    } /* LCOV_EXCL_LINE */\n# elif defined(HAVE_POSIX_MEMALIGN)\n    if (posix_memalign(&ptr, page_size, size) != 0) {\n        ptr = NULL; /* LCOV_EXCL_LINE */\n    } /* LCOV_EXCL_LINE */\n# elif defined(WINAPI_DESKTOP)\n    ptr = VirtualAlloc(NULL, size, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);\n# else\n#  error Bug\n# endif\n    return (unsigned char *) ptr;\n}\n\nstatic void\n_free_aligned(unsigned char * const ptr, const size_t size)\n{\n# if defined(MAP_ANON) && defined(HAVE_MMAP)\n    (void) munmap(ptr, size);\n# elif defined(HAVE_POSIX_MEMALIGN)\n    free(ptr);\n# elif defined(WINAPI_DESKTOP)\n    VirtualFree(ptr, 0U, MEM_RELEASE);\n# else\n#  error Bug\n# endif\n}\n\nstatic unsigned char *\n_unprotected_ptr_from_user_ptr(void * const ptr)\n{\n    uintptr_t      unprotected_ptr_u;\n    unsigned char *canary_ptr;\n    size_t         page_mask;\n\n    canary_ptr = ((unsigned char *) ptr) - sizeof canary;\n    page_mask = page_size - 1U;\n    unprotected_ptr_u = ((uintptr_t) canary_ptr & (uintptr_t) ~page_mask);\n    if (unprotected_ptr_u <= page_size * 2U) {\n        abort(); /* LCOV_EXCL_LINE */\n    }\n    return (unsigned char *) unprotected_ptr_u;\n}\n\n#endif /* HAVE_ALIGNED_MALLOC */\n\n#ifndef HAVE_ALIGNED_MALLOC\nstatic __attribute__((malloc)) void *\n_sodium_malloc(const size_t size)\n{\n    return malloc(size);\n}\n#else\nstatic __attribute__((malloc)) void *\n_sodium_malloc(const size_t size)\n{\n    void          *user_ptr;\n    unsigned char *base_ptr;\n    unsigned char *canary_ptr;\n    unsigned char *unprotected_ptr;\n    size_t         size_with_canary;\n    size_t         total_size;\n    size_t         unprotected_size;\n\n    if (size >= (size_t) SIZE_MAX - page_size * 4U) {\n        errno = ENOMEM;\n        return NULL;\n    }\n    if (page_size <= sizeof canary || page_size < sizeof unprotected_size) {\n        abort(); /* LCOV_EXCL_LINE */\n    }\n    size_with_canary = (sizeof canary) + size;\n    unprotected_size = _page_round(size_with_canary);\n    total_size = page_size + page_size + unprotected_size + page_size;\n    if ((base_ptr = _alloc_aligned(total_size)) == NULL) {\n        return NULL; /* LCOV_EXCL_LINE */\n    }\n    unprotected_ptr = base_ptr + page_size * 2U;\n    _mprotect_noaccess(base_ptr + page_size, page_size);\n# ifndef HAVE_PAGE_PROTECTION\n    memcpy(unprotected_ptr + unprotected_size, canary, sizeof canary);\n# endif\n    _mprotect_noaccess(unprotected_ptr + unprotected_size, page_size);\n    sodium_mlock(unprotected_ptr, unprotected_size);\n    canary_ptr = unprotected_ptr + _page_round(size_with_canary) -\n        size_with_canary;\n    user_ptr = canary_ptr + sizeof canary;\n    memcpy(canary_ptr, canary, sizeof canary);\n    memcpy(base_ptr, &unprotected_size, sizeof unprotected_size);\n    _mprotect_readonly(base_ptr, page_size);\n    assert(_unprotected_ptr_from_user_ptr(user_ptr) == unprotected_ptr);\n\n    return user_ptr;\n}\n#endif /* !HAVE_ALIGNED_MALLOC */\n\n__attribute__((malloc)) void *\nsodium_malloc(const size_t size)\n{\n    void *ptr;\n\n    if ((ptr = _sodium_malloc(size)) == NULL) {\n        return NULL; /* LCOV_EXCL_LINE */\n    }\n    memset(ptr, (int) GARBAGE_VALUE, size);\n\n    return ptr;\n}\n\n__attribute__((malloc)) void *\nsodium_allocarray(size_t count, size_t size)\n{\n    size_t total_size;\n\n    if (count > (size_t) 0U && size >= (size_t) SIZE_MAX / count) {\n        errno = ENOMEM;\n        return NULL;\n    }\n    total_size = count * size;\n\n    return sodium_malloc(total_size);\n}\n\n#ifndef HAVE_ALIGNED_MALLOC\nvoid\nsodium_free(void *ptr)\n{\n    free(ptr);\n}\n#else\nvoid\nsodium_free(void *ptr)\n{\n    unsigned char *base_ptr;\n    unsigned char *canary_ptr;\n    unsigned char *unprotected_ptr;\n    size_t         total_size;\n    size_t         unprotected_size;\n\n    if (ptr == NULL) {\n        return;\n    }\n    canary_ptr = ((unsigned char *) ptr) - sizeof canary;\n    unprotected_ptr = _unprotected_ptr_from_user_ptr(ptr);\n    base_ptr = unprotected_ptr - page_size * 2U;\n    memcpy(&unprotected_size, base_ptr, sizeof unprotected_size);\n    total_size = page_size + page_size + unprotected_size + page_size;\n    _mprotect_readwrite(base_ptr, total_size);\n    if (sodium_memcmp(canary_ptr, canary, sizeof canary) != 0) {\n        _out_of_bounds();\n    }\n# ifndef HAVE_PAGE_PROTECTION\n    if (sodium_memcmp(unprotected_ptr + unprotected_size,\n                      canary, sizeof canary) != 0) {\n        _out_of_bounds();\n    }\n# endif\n    sodium_munlock(unprotected_ptr, unprotected_size);\n    _free_aligned(base_ptr, total_size);\n}\n#endif /* HAVE_ALIGNED_MALLOC */\n\n#ifndef HAVE_PAGE_PROTECTION\nstatic int\n_sodium_mprotect(void *ptr, int (*cb)(void *ptr, size_t size))\n{\n    (void) ptr;\n    (void) cb;\n    errno = ENOSYS;\n    return -1;\n}\n#else\nstatic int\n_sodium_mprotect(void *ptr, int (*cb)(void *ptr, size_t size))\n{\n    unsigned char *base_ptr;\n    unsigned char *unprotected_ptr;\n    size_t         unprotected_size;\n\n    unprotected_ptr = _unprotected_ptr_from_user_ptr(ptr);\n    base_ptr = unprotected_ptr - page_size * 2U;\n    memcpy(&unprotected_size, base_ptr, sizeof unprotected_size);\n\n    return cb(unprotected_ptr, unprotected_size);\n}\n#endif\n\nint\nsodium_mprotect_noaccess(void *ptr)\n{\n    return _sodium_mprotect(ptr, _mprotect_noaccess);\n}\n\nint\nsodium_mprotect_readonly(void *ptr)\n{\n    return _sodium_mprotect(ptr, _mprotect_readonly);\n}\n\nint\nsodium_mprotect_readwrite(void *ptr)\n{\n    return _sodium_mprotect(ptr, _mprotect_readwrite);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/src/libsodium/sodium/version.c",
    "content": "\n#include \"version.h\"\n\nconst char *\nsodium_version_string(void)\n{\n    return SODIUM_VERSION_STRING;\n}\n\nint\nsodium_library_version_major(void)\n{\n    return SODIUM_LIBRARY_VERSION_MAJOR;\n}\n\nint\nsodium_library_version_minor(void)\n{\n    return SODIUM_LIBRARY_VERSION_MINOR;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/HAVE_AMD64_ASM.c",
    "content": "#if defined(__amd64) || defined(__amd64__) || defined(__x86_64__)\n# if defined(__CYGWIN__) || defined(__MINGW32__) || defined(__MINGW64__) || defined(_WIN32) || defined(_WIN64)\n# error Windows x86_64 calling conventions are not supported yet\n# endif\n/* neat */\n#else\n# error !x86_64\n#endif\nvoid main() {\n\t__asm__(\"pxor %xmm12,%xmm6\");\n}"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/HAVE_CPUID.c",
    "content": "\nvoid main(){\n\tunsigned int cpu_info[4];\n\t__asm__ __volatile__ (\"xchgl %%ebx, %k1; cpuid; xchgl %%ebx, %k1\" :\n\t\"=a\" (cpu_info[0]), \"=&r\" (cpu_info[1]),\n\t\"=c\" (cpu_info[2]), \"=d\" (cpu_info[3]) :\n\t\"0\" (0U), \"2\" (0U));\n}"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/HAVE_TI_MODE.c",
    "content": "#ifndef __GNUC__\n# error mode(TI) is a gcc extension\n#endif\n#if defined(__clang__) && !defined(__x86_64__)\n# error clang doesn't properly compile smult_curve25519_donna_c64.c\n#endif\n#ifndef NATIVE_LITTLE_ENDIAN\n# error donna_c64 currently requires a little endian CPU\n#endif\n#ifdef EMSCRIPTEN\n# error emscripten currently supports only shift operations on integers \\\n# larger than 64 bits\n#endif\n#include <stdint.h>\ntypedef unsigned uint128_t __attribute__((mode(TI)));\nvoid fcontract(uint128_t *t) {\n\t*t += 0x8000000000000 - 1;\n}\n\nvoid main(){\n\t(void) fcontract;\n}"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/HAVE_WEAK_SYMBOLS.c",
    "content": "__attribute__((weak)) void __dummy(void *x) { }\nvoid f(void *x) { __dummy(x); }"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/IS_STDC_LIMIT_MACROS_NEEDED.c",
    "content": "#include <limits.h>\n#include <stdint.h>\n\nvoid main(){\n\t(void) SIZE_MAX;\n\t(void) UINT64_MAX;\n}"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/Makefile.am",
    "content": "SUBDIRS = \\\n\tdefault\n\nEXTRA_DIST = \\\n\tquirks/quirks.h\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/CMakeLists.txt",
    "content": "INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../include)\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../../include/sodium)\nINCLUDE_DIRECTORIES(${CMAKE_SOURCE_DIR}/test/quirks)\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/../quirks)\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})\n\n#For version.h.in to version.h\nINCLUDE_DIRECTORIES(${CMAKE_CURRENT_BINARY_DIR}/../../src/libsodium/include)\n\n#ADD_DEFINITIONS(\"-DTEST_SRCDIR=${CMAKE_CURRENT_SOURCE_DIR}\")\n\nSET(LIBSODIUM_LIB_PATH sodium)\n\nADD_EXECUTABLE       (aead_chacha20poly1305 cmptest.h aead_chacha20poly1305.c)\nTARGET_LINK_LIBRARIES(aead_chacha20poly1305 ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (auth                  cmptest.h auth.c)\nTARGET_LINK_LIBRARIES(auth                  ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (auth2                 cmptest.h auth2.c)\nTARGET_LINK_LIBRARIES(auth2                 ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (auth3                 cmptest.h auth3.c)\nTARGET_LINK_LIBRARIES(auth3                 ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (auth5                 cmptest.h auth5.c ${CMAKE_CURRENT_SOURCE_DIR}/../quirks/quirks.h)\nTARGET_LINK_LIBRARIES(auth5                 ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (auth6                 cmptest.h auth6.c ${CMAKE_CURRENT_SOURCE_DIR}/../quirks/quirks.h)\nTARGET_LINK_LIBRARIES(auth6                 ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (auth7                 cmptest.h auth7.c ${CMAKE_CURRENT_SOURCE_DIR}/../quirks/quirks.h)\nTARGET_LINK_LIBRARIES(auth7                 ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (box                   cmptest.h box.c)\nTARGET_LINK_LIBRARIES(box                   ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (box2                  cmptest.h box2.c)\nTARGET_LINK_LIBRARIES(box2                  ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (box7                  cmptest.h box7.c)\nTARGET_LINK_LIBRARIES(box7                  ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (box8                  cmptest.h box8.c)\nTARGET_LINK_LIBRARIES(box8                  ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (box_easy              cmptest.h box_easy.c)\nTARGET_LINK_LIBRARIES(box_easy              ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (box_easy2             cmptest.h box_easy2.c)\nTARGET_LINK_LIBRARIES(box_easy2             ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (box_seal              cmptest.h box_seal.c)\nTARGET_LINK_LIBRARIES(box_seal              ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (box_seed              cmptest.h box_seed.c)\nTARGET_LINK_LIBRARIES(box_seed              ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (chacha20              cmptest.h chacha20.c)\nTARGET_LINK_LIBRARIES(chacha20              ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (core1                 cmptest.h core1.c)\nTARGET_LINK_LIBRARIES(core1                 ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (core2                 cmptest.h core2.c)\nTARGET_LINK_LIBRARIES(core2                 ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (core3                 cmptest.h core3.c)\nTARGET_LINK_LIBRARIES(core3                 ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (core4                 cmptest.h core4.c)\nTARGET_LINK_LIBRARIES(core4                 ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (core5                 cmptest.h core5.c)\nTARGET_LINK_LIBRARIES(core5                 ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (core6                 cmptest.h core6.c)\nTARGET_LINK_LIBRARIES(core6                 ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (ed25519_convert       cmptest.h ed25519_convert.c)\nTARGET_LINK_LIBRARIES(ed25519_convert       ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (generichash           cmptest.h generichash.c)\nTARGET_LINK_LIBRARIES(generichash           ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (generichash2          cmptest.h generichash2.c)\nTARGET_LINK_LIBRARIES(generichash2          ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (generichash3          cmptest.h generichash3.c)\nTARGET_LINK_LIBRARIES(generichash3          ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (hash                  cmptest.h hash.c)\nTARGET_LINK_LIBRARIES(hash                  ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (hash3                 cmptest.h hash3.c)\nTARGET_LINK_LIBRARIES(hash3                 ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (onetimeauth           cmptest.h onetimeauth.c)\nTARGET_LINK_LIBRARIES(onetimeauth           ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (onetimeauth2          cmptest.h onetimeauth2.c)\nTARGET_LINK_LIBRARIES(onetimeauth2          ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (onetimeauth7          cmptest.h onetimeauth7.c)\nTARGET_LINK_LIBRARIES(onetimeauth7          ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (pwhash                cmptest.h pwhash.c)\nTARGET_LINK_LIBRARIES(pwhash                ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (pwhash_scrypt_ll      cmptest.h pwhash_scrypt_ll.c)\nTARGET_LINK_LIBRARIES(pwhash_scrypt_ll      ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (randombytes           cmptest.h randombytes.c)\nTARGET_LINK_LIBRARIES(randombytes           ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (scalarmult            cmptest.h scalarmult.c)\nTARGET_LINK_LIBRARIES(scalarmult            ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (scalarmult2           cmptest.h scalarmult2.c)\nTARGET_LINK_LIBRARIES(scalarmult2           ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (scalarmult5           cmptest.h scalarmult5.c)\nTARGET_LINK_LIBRARIES(scalarmult5           ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (scalarmult6           cmptest.h scalarmult6.c)\nTARGET_LINK_LIBRARIES(scalarmult6           ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (scalarmult7           cmptest.h scalarmult7.c)\nTARGET_LINK_LIBRARIES(scalarmult7           ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (secretbox             cmptest.h secretbox.c)\nTARGET_LINK_LIBRARIES(secretbox             ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (secretbox2            cmptest.h secretbox2.c)\nTARGET_LINK_LIBRARIES(secretbox2            ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (secretbox7            cmptest.h secretbox7.c)\nTARGET_LINK_LIBRARIES(secretbox7            ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (secretbox8            cmptest.h secretbox8.c)\nTARGET_LINK_LIBRARIES(secretbox8            ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (secretbox_easy        cmptest.h secretbox_easy.c)\nTARGET_LINK_LIBRARIES(secretbox_easy        ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (secretbox_easy2       cmptest.h secretbox_easy2.c)\nTARGET_LINK_LIBRARIES(secretbox_easy2       ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (shorthash             cmptest.h shorthash.c)\nTARGET_LINK_LIBRARIES(shorthash             ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (sign                  cmptest.h sign.c)\nTARGET_LINK_LIBRARIES(sign                  ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (sodium_core           cmptest.h sodium_core.c)\nTARGET_LINK_LIBRARIES(sodium_core           ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (sodium_utils          cmptest.h sodium_utils.c)\nTARGET_LINK_LIBRARIES(sodium_utils          ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (sodium_utils2         cmptest.h sodium_utils2.c)\nTARGET_LINK_LIBRARIES(sodium_utils2         ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (sodium_utils3         cmptest.h sodium_utils3.c)\nTARGET_LINK_LIBRARIES(sodium_utils3         ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (sodium_version        cmptest.h sodium_version.c)\nTARGET_LINK_LIBRARIES(sodium_version        ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (stream                cmptest.h stream.c)\nTARGET_LINK_LIBRARIES(stream                ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (stream2               cmptest.h stream2.c)\nTARGET_LINK_LIBRARIES(stream2               ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (stream3               cmptest.h stream3.c)\nTARGET_LINK_LIBRARIES(stream3               ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (stream4               cmptest.h stream4.c)\nTARGET_LINK_LIBRARIES(stream4               ${LIBSODIUM_LIB_PATH})\n\nADD_EXECUTABLE       (verify1               cmptest.h verify1.c)\nTARGET_LINK_LIBRARIES(verify1               ${LIBSODIUM_LIB_PATH})\n\n\nSET(ADDITIONAL_CLEAN_FILES\n    ${CMAKE_CURRENT_SOURCE_DIR}/aead_chacha20poly1305.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/auth.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/auth2.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/auth3.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/auth5.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/auth6.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/auth7.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/box.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/box2.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/box7.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/box8.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/box_easy.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/box_easy2.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/box_seal.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/box_seed.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/chacha20.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/core1.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/core2.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/core3.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/core4.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/core5.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/core6.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/ed25519_convert.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/generichash.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/generichash2.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/generichash3.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/hash.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/hash2.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/hash3.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/onetimeauth.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/onetimeauth2.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/onetimeauth7.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/pwhash.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/pwhash_scrypt_ll.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/randombytes.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/scalarmult.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/scalarmult2.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/scalarmult5.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/scalarmult6.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/scalarmult7.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/secretbox.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/secretbox2.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/secretbox7.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/secretbox8.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/secretbox_easy.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/secretbox_easy2.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/shorthash.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/sign.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/sodium_core.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/sodium_utils.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/sodium_utils2.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/sodium_utils3.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/sodium_version.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/stream.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/stream2.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/stream3.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/stream4.res\n    ${CMAKE_CURRENT_SOURCE_DIR}/verify1.res\n)\n\nSET_DIRECTORY_PROPERTIES(PROPERTIES\nADDITIONAL_MAKE_CLEAN_FILES \"${ADDITIONAL_CLEAN_FILES}\")\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/Makefile.am",
    "content": "\nEXTRA_DIST = \\\n\tcmptest.h \\\n\twintest.bat \\\n\tpre.js.inc \\\n\taead_chacha20poly1305.exp \\\n\tauth.exp \\\n\tauth2.exp \\\n\tauth3.exp \\\n\tauth5.exp \\\n\tauth6.exp \\\n\tauth7.exp \\\n\tbox.exp \\\n\tbox2.exp \\\n\tbox7.exp \\\n\tbox8.exp \\\n\tbox_easy.exp \\\n\tbox_easy2.exp \\\n\tbox_seal.exp \\\n\tbox_seed.exp \\\n\tchacha20.exp \\\n\tcore1.exp \\\n\tcore2.exp \\\n\tcore3.exp \\\n\tcore4.exp \\\n\tcore5.exp \\\n\tcore6.exp \\\n\ted25519_convert.exp \\\n\tgenerichash.exp \\\n\tgenerichash2.exp \\\n\tgenerichash3.exp \\\n\thash.exp \\\n\thash2.exp \\\n\thash3.exp \\\n\tonetimeauth.exp \\\n\tonetimeauth2.exp \\\n\tonetimeauth7.exp \\\n\tpwhash.exp \\\n\tpwhash_scrypt_ll.exp \\\n\trandombytes.exp \\\n\tscalarmult.exp \\\n\tscalarmult2.exp \\\n\tscalarmult5.exp \\\n\tscalarmult6.exp \\\n\tscalarmult7.exp \\\n\tsecretbox.exp \\\n\tsecretbox2.exp \\\n\tsecretbox7.exp \\\n\tsecretbox8.exp \\\n\tsecretbox_easy.exp \\\n\tsecretbox_easy2.exp \\\n\tshorthash.exp \\\n\tsign.exp \\\n\tsodium_core.exp \\\n\tsodium_utils.exp \\\n\tsodium_utils2.exp \\\n\tsodium_utils3.exp \\\n\tsodium_version.exp \\\n\tstream.exp \\\n\tstream2.exp \\\n\tstream3.exp \\\n\tstream4.exp \\\n\tverify1.exp\n\nDISTCLEANFILES = \\\n\taead_chacha20poly1305.res \\\n\tauth.res \\\n\tauth2.res \\\n\tauth3.res \\\n\tauth5.res \\\n\tauth6.res \\\n\tauth7.res \\\n\tbox.res \\\n\tbox2.res \\\n\tbox7.res \\\n\tbox8.res \\\n\tbox_easy.res \\\n\tbox_easy2.res \\\n\tbox_seal.res \\\n\tbox_seed.res \\\n\tchacha20.res \\\n\tcore1.res \\\n\tcore2.res \\\n\tcore3.res \\\n\tcore4.res \\\n\tcore5.res \\\n\tcore6.res \\\n\ted25519_convert.res \\\n\tgenerichash.res \\\n\tgenerichash2.res \\\n\tgenerichash3.res \\\n\thash.res \\\n\thash2.res \\\n\thash3.res \\\n\tonetimeauth.res \\\n\tonetimeauth2.res \\\n\tonetimeauth7.res \\\n\tpwhash.res \\\n\tpwhash_scrypt_ll.res \\\n\trandombytes.res \\\n\tscalarmult.res \\\n\tscalarmult2.res \\\n\tscalarmult5.res \\\n\tscalarmult6.res \\\n\tscalarmult7.res \\\n\tsecretbox.res \\\n\tsecretbox2.res \\\n\tsecretbox7.res \\\n\tsecretbox8.res \\\n\tsecretbox_easy.res \\\n\tsecretbox_easy2.res \\\n\tshorthash.res \\\n\tsign.res \\\n\tsodium_core.res \\\n\tsodium_utils.res \\\n\tsodium_utils2.res \\\n\tsodium_utils3.res \\\n\tsodium_version.res \\\n\tstream.res \\\n\tstream2.res \\\n\tstream3.res \\\n\tstream4.res \\\n\tverify1.res\n\nAM_CPPFLAGS = \\\n\t-DTEST_SRCDIR=\\\"@srcdir@\\\" \\\n\t-I$(top_srcdir)/src/libsodium/include \\\n\t-I$(top_srcdir)/src/libsodium/include/sodium \\\n\t-I$(top_builddir)/src/libsodium/include \\\n\t-I$(top_builddir)/src/libsodium/include/sodium \\\n\t-I$(top_srcdir)/test/quirks\n\nAM_LDFLAGS = @TEST_LDFLAGS@\n\nTESTS_TARGETS = \\\n\taead_chacha20poly1305 \\\n\tauth \\\n\tauth2 \\\n\tauth3 \\\n\tauth5 \\\n\tauth6 \\\n\tauth7 \\\n\tbox \\\n\tbox2 \\\n\tbox7 \\\n\tbox8 \\\n\tbox_easy \\\n\tbox_easy2 \\\n\tbox_seal \\\n\tbox_seed \\\n\tchacha20 \\\n\tcore1 \\\n\tcore2 \\\n\tcore3 \\\n\tcore4 \\\n\tcore5 \\\n\tcore6 \\\n\ted25519_convert \\\n\tgenerichash \\\n\tgenerichash2 \\\n\tgenerichash3 \\\n\thash \\\n\thash3 \\\n\tonetimeauth \\\n\tonetimeauth2 \\\n\tonetimeauth7 \\\n\tpwhash \\\n\tpwhash_scrypt_ll \\\n\trandombytes \\\n\tscalarmult \\\n\tscalarmult2 \\\n\tscalarmult5 \\\n\tscalarmult6 \\\n\tscalarmult7 \\\n\tsecretbox \\\n\tsecretbox2 \\\n\tsecretbox7 \\\n\tsecretbox8 \\\n\tsecretbox_easy \\\n\tsecretbox_easy2 \\\n\tshorthash \\\n\tsign \\\n\tsodium_core \\\n\tsodium_utils \\\n\tsodium_version \\\n\tstream \\\n\tstream2 \\\n\tstream3 \\\n\tstream4 \\\n\tverify1\n\nif !EMSCRIPTEN\nTESTS_TARGETS += \\\n\tsodium_utils2 \\\n\tsodium_utils3\nendif\n\ncheck_PROGRAMS = $(TESTS_TARGETS)\n\nTESTS = $(TESTS_TARGETS)\n\nTESTS_LDADD = \\\n\t${top_builddir}/src/libsodium/libsodium.la\n\naead_chacha20poly1305_SOURCE          = cmptest.h aead_chacha20poly1305.c\naead_chacha20poly1305_LDADD           = $(TESTS_LDADD)\n\nauth_SOURCE               = cmptest.h auth.c\nauth_LDADD                = $(TESTS_LDADD)\n\nauth2_SOURCE              = cmptest.h auth2.c\nauth2_LDADD               = $(TESTS_LDADD)\n\nauth3_SOURCE              = cmptest.h auth3.c\nauth3_LDADD               = $(TESTS_LDADD)\n\nauth5_SOURCE              = cmptest.h auth5.c quirks.h\nauth5_LDADD               = $(TESTS_LDADD)\n\nauth6_SOURCE              = cmptest.h auth6.c quirks.h\nauth6_LDADD               = $(TESTS_LDADD)\n\nauth7_SOURCE              = cmptest.h auth7.c quirks.h\nauth7_LDADD               = $(TESTS_LDADD)\n\nbox_SOURCE                = cmptest.h box.c\nbox_LDADD                 = $(TESTS_LDADD)\n\nbox2_SOURCE               = cmptest.h box2.c\nbox2_LDADD                = $(TESTS_LDADD)\n\nbox7_SOURCE               = cmptest.h box7.c\nbox7_LDADD                = $(TESTS_LDADD)\n\nbox8_SOURCE               = cmptest.h box8.c\nbox8_LDADD                = $(TESTS_LDADD)\n\nbox_easy_SOURCE           = cmptest.h box_easy.c\nbox_easy_LDADD            = $(TESTS_LDADD)\n\nbox_easy2_SOURCE          = cmptest.h box_easy2.c\nbox_easy2_LDADD           = $(TESTS_LDADD)\n\nbox_seal_SOURCE           = cmptest.h box_seal.c\nbox_seal_LDADD            = $(TESTS_LDADD)\n\nbox_seed_SOURCE           = cmptest.h box_seed.c\nbox_seed_LDADD            = $(TESTS_LDADD)\n\nchacha20_SOURCE           = cmptest.h chacha20.c\nchacha20_LDADD            = $(TESTS_LDADD)\n\ncore1_SOURCE              = cmptest.h core1.c\ncore1_LDADD               = $(TESTS_LDADD)\n\ncore2_SOURCE              = cmptest.h core2.c\ncore2_LDADD               = $(TESTS_LDADD)\n\ncore3_SOURCE              = cmptest.h core3.c\ncore3_LDADD               = $(TESTS_LDADD)\n\ncore4_SOURCE              = cmptest.h core4.c\ncore4_LDADD               = $(TESTS_LDADD)\n\ncore5_SOURCE              = cmptest.h core5.c\ncore5_LDADD               = $(TESTS_LDADD)\n\ncore6_SOURCE              = cmptest.h core6.c\ncore6_LDADD               = $(TESTS_LDADD)\n\ned25519_convert_SOURCE    = cmptest.h ed25519_convert.c\ned25519_convert_LDADD     = $(TESTS_LDADD)\n\ngenerichash_SOURCE        = cmptest.h generichash.c\ngenerichash_LDADD         = $(TESTS_LDADD)\n\ngenerichash2_SOURCE       = cmptest.h generichash2.c\ngenerichash2_LDADD        = $(TESTS_LDADD)\n\ngenerichash3_SOURCE       = cmptest.h generichash3.c\ngenerichash3_LDADD        = $(TESTS_LDADD)\n\nhash_SOURCE               = cmptest.h hash.c\nhash_LDADD                = $(TESTS_LDADD)\n\nhash3_SOURCE              = cmptest.h hash3.c\nhash3_LDADD               = $(TESTS_LDADD)\n\nonetimeauth_SOURCE        = cmptest.h onetimeauth.c\nonetimeauth_LDADD         = $(TESTS_LDADD)\n\nonetimeauth2_SOURCE       = cmptest.h onetimeauth2.c\nonetimeauth2_LDADD        = $(TESTS_LDADD)\n\nonetimeauth7_SOURCE       = cmptest.h onetimeauth7.c\nonetimeauth7_LDADD        = $(TESTS_LDADD)\n\npwhash_SOURCE             = cmptest.h pwhash.c\npwhash_LDADD              = $(TESTS_LDADD)\n\npwhash_scrypt_ll_SOURCE   = cmptest.h pwhash_scrypt_ll.c\npwhash_scrypt_ll_LDADD    = $(TESTS_LDADD)\n\nrandombytes_SOURCE        = cmptest.h randombytes.c\nrandombytes_LDADD         = $(TESTS_LDADD)\n\nscalarmult_SOURCE         = cmptest.h scalarmult.c\nscalarmult_LDADD          = $(TESTS_LDADD)\n\nscalarmult2_SOURCE        = cmptest.h scalarmult2.c\nscalarmult2_LDADD         = $(TESTS_LDADD)\n\nscalarmult5_SOURCE        = cmptest.h scalarmult5.c\nscalarmult5_LDADD         = $(TESTS_LDADD)\n\nscalarmult6_SOURCE        = cmptest.h scalarmult6.c\nscalarmult6_LDADD         = $(TESTS_LDADD)\n\nscalarmult7_SOURCE        = cmptest.h scalarmult7.c\nscalarmult7_LDADD         = $(TESTS_LDADD)\n\nsecretbox_SOURCE          = cmptest.h secretbox.c\nsecretbox_LDADD           = $(TESTS_LDADD)\n\nsecretbox2_SOURCE         = cmptest.h secretbox2.c\nsecretbox2_LDADD          = $(TESTS_LDADD)\n\nsecretbox7_SOURCE         = cmptest.h secretbox7.c\nsecretbox7_LDADD          = $(TESTS_LDADD)\n\nsecretbox8_SOURCE         = cmptest.h secretbox8.c\nsecretbox8_LDADD          = $(TESTS_LDADD)\n\nsecretbox_easy_SOURCE     = cmptest.h secretbox_easy.c\nsecretbox_easy_LDADD      = $(TESTS_LDADD)\n\nsecretbox_easy2_SOURCE    = cmptest.h secretbox_easy2.c\nsecretbox_easy2_LDADD     = $(TESTS_LDADD)\n\nshorthash_SOURCE          = cmptest.h shorthash.c\nshorthash_LDADD           = $(TESTS_LDADD)\n\nsign_SOURCE               = cmptest.h sign.c\nsign_LDADD                = $(TESTS_LDADD)\n\nsodium_core_SOURCE        = cmptest.h sodium_core.c\nsodium_core_LDADD         = $(TESTS_LDADD)\n\nsodium_utils_SOURCE       = cmptest.h sodium_utils.c\nsodium_utils_LDADD        = $(TESTS_LDADD)\n\nsodium_utils2_SOURCE      = cmptest.h sodium_utils2.c\nsodium_utils2_LDADD       = $(TESTS_LDADD)\n\nsodium_utils3_SOURCE      = cmptest.h sodium_utils3.c\nsodium_utils3_LDADD       = $(TESTS_LDADD)\n\nsodium_version_SOURCE     = cmptest.h sodium_version.c\nsodium_version_LDADD      = $(TESTS_LDADD)\n\nstream_SOURCE             = cmptest.h stream.c\nstream_LDADD              = $(TESTS_LDADD)\n\nstream2_SOURCE            = cmptest.h stream2.c\nstream2_LDADD             = $(TESTS_LDADD)\n\nstream3_SOURCE            = cmptest.h stream3.c\nstream3_LDADD             = $(TESTS_LDADD)\n\nstream4_SOURCE            = cmptest.h stream4.c\nstream4_LDADD             = $(TESTS_LDADD)\n\nverify1_SOURCE            = cmptest.h verify1.c\nverify1_LDADD             = $(TESTS_LDADD)\n\nverify: check\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/aead_chacha20poly1305.c",
    "content": "\n#define TEST_NAME \"aead_chacha20poly1305\"\n#include \"cmptest.h\"\n\nstatic unsigned char firstkey[crypto_aead_chacha20poly1305_KEYBYTES]\n    = { 0x42, 0x90, 0xbc, 0xb1, 0x54, 0x17, 0x35, 0x31, 0xf3, 0x14, 0xaf,\n        0x57, 0xf3, 0xbe, 0x3b, 0x50, 0x06, 0xda, 0x37, 0x1e, 0xce, 0x27,\n        0x2a, 0xfa, 0x1b, 0x5d, 0xbd, 0xd1, 0x10, 0x0a, 0x10, 0x07 };\n\nstatic unsigned char m[10U]\n    = { 0x86, 0xd0, 0x99, 0x74, 0x84, 0x0b, 0xde, 0xd2, 0xa5, 0xca };\n\nstatic unsigned char nonce[crypto_aead_chacha20poly1305_NPUBBYTES]\n    = { 0xcd, 0x7c, 0xf6, 0x7b, 0xe3, 0x9c, 0x79, 0x4a };\n\nstatic unsigned char ad[10U]\n    = { 0x87, 0xe2, 0x29, 0xd4, 0x50, 0x08, 0x45, 0xa0, 0x79, 0xc0 };\n\nstatic unsigned char c[10U + crypto_aead_chacha20poly1305_ABYTES];\n\nint main(void)\n{\n    unsigned char m2[10U];\n    unsigned long long clen;\n    unsigned long long m2len;\n    size_t i;\n\n    crypto_aead_chacha20poly1305_encrypt(c, &clen, m, sizeof m, ad, sizeof ad,\n                                         NULL, nonce, firstkey);\n    if (clen != sizeof m + crypto_aead_chacha20poly1305_abytes()) {\n        printf(\"clen is not properly set\\n\");\n    }\n    for (i = 0U; i < sizeof c; ++i) {\n        printf(\",0x%02x\", (unsigned int)c[i]);\n        if (i % 8 == 7) {\n            printf(\"\\n\");\n        }\n    }\n    printf(\"\\n\");\n\n    if (crypto_aead_chacha20poly1305_decrypt(m2, &m2len, NULL, c, sizeof c, ad,\n                                             sizeof ad, nonce, firstkey) != 0) {\n        printf(\"crypto_aead_chacha20poly1305_decrypt() failed\\n\");\n    }\n    if (m2len != sizeof c - crypto_aead_chacha20poly1305_abytes()) {\n        printf(\"m2len is not properly set\\n\");\n    }\n    if (memcmp(m, m2, sizeof m) != 0) {\n        printf(\"m != m2\\n\");\n    }\n\n    for (i = 0U; i < sizeof c; i++) {\n        c[i] ^= (i + 1U);\n        if (crypto_aead_chacha20poly1305_decrypt(m2, NULL, NULL, c, sizeof c,\n                                                 ad, sizeof ad, nonce, firstkey)\n            == 0 || memcmp(m, m2, sizeof m) == 0) {\n            printf(\"message can be forged\\n\");\n        }\n        c[i] ^= (i + 1U);\n    }\n\n    crypto_aead_chacha20poly1305_encrypt(c, &clen, m, sizeof m, NULL, 0U, NULL,\n                                         nonce, firstkey);\n    if (clen != sizeof m + crypto_aead_chacha20poly1305_abytes()) {\n        printf(\"clen is not properly set (adlen=0)\\n\");\n    }\n    for (i = 0U; i < sizeof c; ++i) {\n        printf(\",0x%02x\", (unsigned int)c[i]);\n        if (i % 8 == 7) {\n            printf(\"\\n\");\n        }\n    }\n    printf(\"\\n\");\n\n    if (crypto_aead_chacha20poly1305_decrypt(m2, &m2len, NULL, c, sizeof c,\n                                             NULL, 0U, nonce, firstkey) != 0) {\n        printf(\"crypto_aead_chacha20poly1305_decrypt() failed (adlen=0)\\n\");\n    }\n    if (m2len != sizeof c - crypto_aead_chacha20poly1305_abytes()) {\n        printf(\"m2len is not properly set (adlen=0)\\n\");\n    }\n    if (memcmp(m, m2, sizeof m) != 0) {\n        printf(\"m != m2 (adlen=0)\\n\");\n    }\n\n    if (crypto_aead_chacha20poly1305_decrypt(\n            m2, &m2len, NULL, c, crypto_aead_chacha20poly1305_ABYTES / 2, NULL,\n            0U, nonce, firstkey) != -1) {\n        printf(\"crypto_aead_chacha20poly1305_decrypt() worked with a short \"\n               \"ciphertext\\n\");\n    }\n    if (crypto_aead_chacha20poly1305_decrypt(m2, &m2len, NULL, c, 0U, NULL, 0U,\n                                             nonce, firstkey) != -1) {\n        printf(\"crypto_aead_chacha20poly1305_decrypt() worked with an empty \"\n               \"ciphertext\\n\");\n    }\n\n    memcpy(c, m, sizeof m);\n    crypto_aead_chacha20poly1305_encrypt(c, &clen, c, sizeof m, NULL, 0U, NULL,\n                                         nonce, firstkey);\n    if (clen != sizeof m + crypto_aead_chacha20poly1305_abytes()) {\n        printf(\"clen is not properly set (adlen=0)\\n\");\n    }\n    for (i = 0U; i < sizeof c; ++i) {\n        printf(\",0x%02x\", (unsigned int)c[i]);\n        if (i % 8 == 7) {\n            printf(\"\\n\");\n        }\n    }\n    printf(\"\\n\");\n\n    if (crypto_aead_chacha20poly1305_decrypt(c, &m2len, NULL, c, sizeof c,\n                                             NULL, 0U, nonce, firstkey) != 0) {\n        printf(\"crypto_aead_chacha20poly1305_decrypt() failed (adlen=0)\\n\");\n    }\n    if (m2len != sizeof c - crypto_aead_chacha20poly1305_abytes()) {\n        printf(\"m2len is not properly set (adlen=0)\\n\");\n    }\n    if (memcmp(m, c, sizeof m) != 0) {\n        printf(\"m != c (adlen=0)\\n\");\n    }\n\n    assert(crypto_aead_chacha20poly1305_keybytes() > 0U);\n    assert(crypto_aead_chacha20poly1305_npubbytes() > 0U);\n    assert(crypto_aead_chacha20poly1305_nsecbytes() == 0U);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/auth.c",
    "content": "\n#define TEST_NAME \"auth\"\n#include \"cmptest.h\"\n\n/* \"Test Case 2\" from RFC 4231 */\nunsigned char key[32] = \"Jefe\";\nunsigned char c[] = \"what do ya want for nothing?\";\n\n/* Hacker manifesto */\nunsigned char key2[] = \"Another one got caught today, it's all over the papers. \\\"Teenager Arrested in Computer Crime Scandal\\\", \\\"Hacker Arrested after Bank Tampering\\\"... Damn kids. They're all alike.\";\n\nunsigned char a[crypto_auth_BYTES];\nunsigned char a2[crypto_auth_hmacsha512_BYTES];\n\nint main(void)\n{\n    crypto_auth_hmacsha512_state st;\n    int i;\n\n    assert(crypto_auth_hmacsha512_statebytes() ==\n           sizeof(crypto_auth_hmacsha512_state));\n    crypto_auth(a, c, sizeof c - 1U, key);\n    for (i = 0; i < sizeof a; ++i) {\n        printf(\",0x%02x\", (unsigned int)a[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n    printf(\"\\n\");\n\n    crypto_auth_hmacsha512_init(&st, key, sizeof key);\n    crypto_auth_hmacsha512_update(&st, c, 1U);\n    crypto_auth_hmacsha512_update(&st, c, sizeof c - 2U);\n    crypto_auth_hmacsha512_final(&st, a2);\n    for (i = 0; i < sizeof a2; ++i) {\n        printf(\",0x%02x\", (unsigned int)a2[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n    printf(\"\\n\");\n\n    crypto_auth_hmacsha512_init(&st, key2, sizeof key2);\n    crypto_auth_hmacsha512_update(&st, c, 1U);\n    crypto_auth_hmacsha512_update(&st, c, sizeof c - 2U);\n    crypto_auth_hmacsha512_final(&st, a2);\n    for (i = 0; i < sizeof a2; ++i) {\n        printf(\",0x%02x\", (unsigned int)a2[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n\n    assert(crypto_auth_bytes() > 0U);\n    assert(crypto_auth_keybytes() > 0U);\n    assert(strcmp(crypto_auth_primitive(), \"hmacsha512256\") == 0);\n    assert(crypto_auth_hmacsha256_bytes() > 0U);\n    assert(crypto_auth_hmacsha256_keybytes() > 0U);\n    assert(crypto_auth_hmacsha512_bytes() > 0U);\n    assert(crypto_auth_hmacsha512_keybytes() > 0U);\n    assert(crypto_auth_hmacsha512256_bytes() == crypto_auth_bytes());\n    assert(crypto_auth_hmacsha512256_keybytes() == crypto_auth_keybytes());\n    assert(crypto_auth_hmacsha512256_statebytes() >=\n           crypto_auth_hmacsha512256_keybytes());\n    assert(crypto_auth_hmacsha256_statebytes() ==\n           sizeof(crypto_auth_hmacsha256_state));\n    assert(crypto_auth_hmacsha512_statebytes() ==\n           sizeof(crypto_auth_hmacsha512_state));\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/auth2.c",
    "content": "/* \"Test Case AUTH256-4\" from RFC 4868 */\n\n#define TEST_NAME \"auth2\"\n#include \"cmptest.h\"\n\nunsigned char key[32]\n    = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n        0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n        0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20 };\n\nunsigned char c[50]\n    = { 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,\n        0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,\n        0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,\n        0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,\n        0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd };\n\nunsigned char a[32];\n\nint main(void)\n{\n    int i;\n\n    crypto_auth_hmacsha256(a, c, sizeof c, key);\n    for (i = 0; i < 32; ++i) {\n        printf(\",0x%02x\", (unsigned int)a[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/auth3.c",
    "content": "/* \"Test Case AUTH256-4\" from RFC 4868 */\n\n#define TEST_NAME \"auth3\"\n#include \"cmptest.h\"\n\nunsigned char key[32]\n    = { 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,\n        0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16,\n        0x17, 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 0x20 };\n\nunsigned char c[50]\n    = { 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,\n        0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,\n        0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,\n        0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd,\n        0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd, 0xcd };\n\nunsigned char a[32]\n    = { 0x37, 0x2e, 0xfc, 0xf9, 0xb4, 0x0b, 0x35, 0xc2, 0x11, 0x5b, 0x13,\n        0x46, 0x90, 0x3d, 0x2e, 0xf4, 0x2f, 0xce, 0xd4, 0x6f, 0x08, 0x46,\n        0xe7, 0x25, 0x7b, 0xb1, 0x56, 0xd3, 0xd7, 0xb3, 0x0d, 0x3f };\n\nint main(void)\n{\n    printf(\"%d\\n\", crypto_auth_hmacsha256_verify(a, c, sizeof c, key));\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/auth5.c",
    "content": "\n#define TEST_NAME \"auth5\"\n#include \"cmptest.h\"\n\nunsigned char key[32];\nunsigned char c[10000];\nunsigned char a[32];\n\nint main(void)\n{\n    size_t clen;\n\n    for (clen = 0; clen < 10000; ++clen) {\n        randombytes_buf(key, sizeof key);\n        randombytes_buf(c, clen);\n        crypto_auth(a, c, clen, key);\n        if (crypto_auth_verify(a, c, clen, key) != 0) {\n            printf(\"fail %u\\n\", (unsigned int) clen);\n            return 100;\n        }\n        if (clen > 0) {\n            c[rand() % clen] += 1 + (rand() % 255);\n            if (crypto_auth_verify(a, c, clen, key) == 0) {\n                printf(\"forgery %u\\n\", (unsigned int) clen);\n                return 100;\n            }\n            a[rand() % sizeof a] += 1 + (rand() % 255);\n            if (crypto_auth_verify(a, c, clen, key) == 0) {\n                printf(\"forgery %u\\n\", (unsigned int) clen);\n                return 100;\n            }\n        }\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/auth6.c",
    "content": "\n#define TEST_NAME \"auth6\"\n#include \"cmptest.h\"\n\n/* \"Test Case 2\" from RFC 4231 */\nunsigned char key[32] = \"Jefe\";\nunsigned char c[] = \"what do ya want for nothing?\";\n\nunsigned char a[64];\n\nint main(void)\n{\n    int i;\n\n    crypto_auth_hmacsha512(a, c, sizeof c - 1U, key);\n    for (i = 0; i < 64; ++i) {\n        printf(\",0x%02x\", (unsigned int)a[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/auth7.c",
    "content": "\n#define TEST_NAME \"auth7\"\n#include \"cmptest.h\"\n\nunsigned char key[32];\nunsigned char c[10000];\nunsigned char a[64];\n\nint main(void)\n{\n    int clen;\n\n    for (clen = 0; clen < 10000; ++clen) {\n        randombytes_buf(key, sizeof key);\n        randombytes_buf(c, clen);\n        crypto_auth_hmacsha512(a, c, clen, key);\n        if (crypto_auth_hmacsha512_verify(a, c, clen, key) != 0) {\n            printf(\"fail %d\\n\", clen);\n            return 100;\n        }\n        if (clen > 0) {\n            c[rand() % clen] += 1 + (rand() % 255);\n            if (crypto_auth_hmacsha512_verify(a, c, clen, key) == 0) {\n                printf(\"forgery %d\\n\", clen);\n                return 100;\n            }\n            a[rand() % sizeof a] += 1 + (rand() % 255);\n            if (crypto_auth_hmacsha512_verify(a, c, clen, key) == 0) {\n                printf(\"forgery %d\\n\", clen);\n                return 100;\n            }\n        }\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/box.c",
    "content": "\n#define TEST_NAME \"box\"\n#include \"cmptest.h\"\n\nunsigned char alicesk[32]\n    = { 0x77, 0x07, 0x6d, 0x0a, 0x73, 0x18, 0xa5, 0x7d, 0x3c, 0x16, 0xc1,\n        0x72, 0x51, 0xb2, 0x66, 0x45, 0xdf, 0x4c, 0x2f, 0x87, 0xeb, 0xc0,\n        0x99, 0x2a, 0xb1, 0x77, 0xfb, 0xa5, 0x1d, 0xb9, 0x2c, 0x2a };\n\nunsigned char bobpk[32]\n    = { 0xde, 0x9e, 0xdb, 0x7d, 0x7b, 0x7d, 0xc1, 0xb4, 0xd3, 0x5b, 0x61,\n        0xc2, 0xec, 0xe4, 0x35, 0x37, 0x3f, 0x83, 0x43, 0xc8, 0x5b, 0x78,\n        0x67, 0x4d, 0xad, 0xfc, 0x7e, 0x14, 0x6f, 0x88, 0x2b, 0x4f };\n\nunsigned char nonce[24] = { 0x69, 0x69, 0x6e, 0xe9, 0x55, 0xb6, 0x2b, 0x73,\n                            0xcd, 0x62, 0xbd, 0xa8, 0x75, 0xfc, 0x73, 0xd6,\n                            0x82, 0x19, 0xe0, 0x03, 0x6b, 0x7a, 0x0b, 0x37 };\n\n// API requires first 32 bytes to be 0\nunsigned char m[163]\n    = { 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0xbe, 0x07, 0x5f, 0xc5,\n        0x3c, 0x81, 0xf2, 0xd5, 0xcf, 0x14, 0x13, 0x16, 0xeb, 0xeb, 0x0c, 0x7b,\n        0x52, 0x28, 0xc5, 0x2a, 0x4c, 0x62, 0xcb, 0xd4, 0x4b, 0x66, 0x84, 0x9b,\n        0x64, 0x24, 0x4f, 0xfc, 0xe5, 0xec, 0xba, 0xaf, 0x33, 0xbd, 0x75, 0x1a,\n        0x1a, 0xc7, 0x28, 0xd4, 0x5e, 0x6c, 0x61, 0x29, 0x6c, 0xdc, 0x3c, 0x01,\n        0x23, 0x35, 0x61, 0xf4, 0x1d, 0xb6, 0x6c, 0xce, 0x31, 0x4a, 0xdb, 0x31,\n        0x0e, 0x3b, 0xe8, 0x25, 0x0c, 0x46, 0xf0, 0x6d, 0xce, 0xea, 0x3a, 0x7f,\n        0xa1, 0x34, 0x80, 0x57, 0xe2, 0xf6, 0x55, 0x6a, 0xd6, 0xb1, 0x31, 0x8a,\n        0x02, 0x4a, 0x83, 0x8f, 0x21, 0xaf, 0x1f, 0xde, 0x04, 0x89, 0x77, 0xeb,\n        0x48, 0xf5, 0x9f, 0xfd, 0x49, 0x24, 0xca, 0x1c, 0x60, 0x90, 0x2e, 0x52,\n        0xf0, 0xa0, 0x89, 0xbc, 0x76, 0x89, 0x70, 0x40, 0xe0, 0x82, 0xf9, 0x37,\n        0x76, 0x38, 0x48, 0x64, 0x5e, 0x07, 0x05 };\n\nunsigned char c[163];\n\nint main(void)\n{\n    unsigned char k[crypto_box_BEFORENMBYTES];\n    int i;\n\n    crypto_box(c, m, 163, nonce, bobpk, alicesk);\n    for (i = 16; i < 163; ++i) {\n        printf(\",0x%02x\", (unsigned int)c[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n    printf(\"\\n\");\n\n    memset(c, 0, sizeof c);\n    crypto_box_beforenm(k, bobpk, alicesk);\n    crypto_box_afternm(c, m, 163, nonce, k);\n    for (i = 16; i < 163; ++i) {\n        printf(\",0x%02x\", (unsigned int)c[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n    printf(\"\\n\");\n\n    assert(crypto_box_seedbytes() > 0U);\n    assert(crypto_box_publickeybytes() > 0U);\n    assert(crypto_box_secretkeybytes() > 0U);\n    assert(crypto_box_beforenmbytes() > 0U);\n    assert(crypto_box_noncebytes() > 0U);\n    assert(crypto_box_zerobytes() > 0U);\n    assert(crypto_box_boxzerobytes() > 0U);\n    assert(crypto_box_macbytes() > 0U);\n    assert(strcmp(crypto_box_primitive(), \"curve25519xsalsa20poly1305\") == 0);\n    assert(crypto_box_curve25519xsalsa20poly1305_seedbytes()\n           == crypto_box_seedbytes());\n    assert(crypto_box_curve25519xsalsa20poly1305_publickeybytes()\n           == crypto_box_publickeybytes());\n    assert(crypto_box_curve25519xsalsa20poly1305_secretkeybytes()\n           == crypto_box_secretkeybytes());\n    assert(crypto_box_curve25519xsalsa20poly1305_beforenmbytes()\n           == crypto_box_beforenmbytes());\n    assert(crypto_box_curve25519xsalsa20poly1305_noncebytes()\n           == crypto_box_noncebytes());\n    assert(crypto_box_curve25519xsalsa20poly1305_zerobytes()\n           == crypto_box_zerobytes());\n    assert(crypto_box_curve25519xsalsa20poly1305_boxzerobytes()\n           == crypto_box_boxzerobytes());\n    assert(crypto_box_curve25519xsalsa20poly1305_macbytes()\n           == crypto_box_macbytes());\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/box2.c",
    "content": "\n#define TEST_NAME \"box2\"\n#include \"cmptest.h\"\n\nunsigned char bobsk[32]\n    = { 0x5d, 0xab, 0x08, 0x7e, 0x62, 0x4a, 0x8a, 0x4b, 0x79, 0xe1, 0x7f,\n        0x8b, 0x83, 0x80, 0x0e, 0xe6, 0x6f, 0x3b, 0xb1, 0x29, 0x26, 0x18,\n        0xb6, 0xfd, 0x1c, 0x2f, 0x8b, 0x27, 0xff, 0x88, 0xe0, 0xeb };\n\nunsigned char alicepk[32]\n    = { 0x85, 0x20, 0xf0, 0x09, 0x89, 0x30, 0xa7, 0x54, 0x74, 0x8b, 0x7d,\n        0xdc, 0xb4, 0x3e, 0xf7, 0x5a, 0x0d, 0xbf, 0x3a, 0x0d, 0x26, 0x38,\n        0x1a, 0xf4, 0xeb, 0xa4, 0xa9, 0x8e, 0xaa, 0x9b, 0x4e, 0x6a };\n\nunsigned char nonce[24] = { 0x69, 0x69, 0x6e, 0xe9, 0x55, 0xb6, 0x2b, 0x73,\n                            0xcd, 0x62, 0xbd, 0xa8, 0x75, 0xfc, 0x73, 0xd6,\n                            0x82, 0x19, 0xe0, 0x03, 0x6b, 0x7a, 0x0b, 0x37 };\n\n// API requires first 16 bytes to be 0\nunsigned char c[163]\n    = { 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0xf3, 0xff, 0xc7, 0x70, 0x3f, 0x94, 0x00, 0xe5,\n        0x2a, 0x7d, 0xfb, 0x4b, 0x3d, 0x33, 0x05, 0xd9, 0x8e, 0x99, 0x3b, 0x9f,\n        0x48, 0x68, 0x12, 0x73, 0xc2, 0x96, 0x50, 0xba, 0x32, 0xfc, 0x76, 0xce,\n        0x48, 0x33, 0x2e, 0xa7, 0x16, 0x4d, 0x96, 0xa4, 0x47, 0x6f, 0xb8, 0xc5,\n        0x31, 0xa1, 0x18, 0x6a, 0xc0, 0xdf, 0xc1, 0x7c, 0x98, 0xdc, 0xe8, 0x7b,\n        0x4d, 0xa7, 0xf0, 0x11, 0xec, 0x48, 0xc9, 0x72, 0x71, 0xd2, 0xc2, 0x0f,\n        0x9b, 0x92, 0x8f, 0xe2, 0x27, 0x0d, 0x6f, 0xb8, 0x63, 0xd5, 0x17, 0x38,\n        0xb4, 0x8e, 0xee, 0xe3, 0x14, 0xa7, 0xcc, 0x8a, 0xb9, 0x32, 0x16, 0x45,\n        0x48, 0xe5, 0x26, 0xae, 0x90, 0x22, 0x43, 0x68, 0x51, 0x7a, 0xcf, 0xea,\n        0xbd, 0x6b, 0xb3, 0x73, 0x2b, 0xc0, 0xe9, 0xda, 0x99, 0x83, 0x2b, 0x61,\n        0xca, 0x01, 0xb6, 0xde, 0x56, 0x24, 0x4a, 0x9e, 0x88, 0xd5, 0xf9, 0xb3,\n        0x79, 0x73, 0xf6, 0x22, 0xa4, 0x3d, 0x14, 0xa6, 0x59, 0x9b, 0x1f, 0x65,\n        0x4c, 0xb4, 0x5a, 0x74, 0xe3, 0x55, 0xa5 };\n\nunsigned char m[163];\n\nint main(void)\n{\n    unsigned char k[crypto_box_BEFORENMBYTES];\n    int i;\n\n    if (crypto_box_open(m, c, 163, nonce, alicepk, bobsk) == 0) {\n        for (i = 32; i < 163; ++i) {\n            printf(\",0x%02x\", (unsigned int)m[i]);\n            if (i % 8 == 7)\n                printf(\"\\n\");\n        }\n        printf(\"\\n\");\n    }\n\n    memset(m, 0, sizeof m);\n    crypto_box_beforenm(k, alicepk, bobsk);\n    if (crypto_box_open_afternm(m, c, 163, nonce, k) == 0) {\n        for (i = 32; i < 163; ++i) {\n            printf(\",0x%02x\", (unsigned int)m[i]);\n            if (i % 8 == 7)\n                printf(\"\\n\");\n        }\n        printf(\"\\n\");\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/box7.c",
    "content": "\n#define TEST_NAME \"box7\"\n#include \"cmptest.h\"\n\nunsigned char alicesk[crypto_box_SECRETKEYBYTES];\nunsigned char alicepk[crypto_box_PUBLICKEYBYTES];\nunsigned char bobsk[crypto_box_SECRETKEYBYTES];\nunsigned char bobpk[crypto_box_PUBLICKEYBYTES];\nunsigned char n[crypto_box_NONCEBYTES];\nunsigned char m[10000];\nunsigned char c[10000];\nunsigned char m2[10000];\n\nint main(void)\n{\n    size_t mlen;\n    size_t i;\n\n    for (mlen = 0; mlen < 1000 && mlen + crypto_box_ZEROBYTES < sizeof m;\n         ++mlen) {\n        crypto_box_keypair(alicepk, alicesk);\n        crypto_box_keypair(bobpk, bobsk);\n        randombytes_buf(n, crypto_box_NONCEBYTES);\n        randombytes_buf(m + crypto_box_ZEROBYTES, mlen);\n        crypto_box(c, m, mlen + crypto_box_ZEROBYTES, n, bobpk, alicesk);\n        if (crypto_box_open(m2, c, mlen + crypto_box_ZEROBYTES, n, alicepk,\n                            bobsk) == 0) {\n            for (i = 0; i < mlen + crypto_box_ZEROBYTES; ++i) {\n                if (m2[i] != m[i]) {\n                    printf(\"bad decryption\\n\");\n                    break;\n                }\n            }\n        } else {\n            printf(\"ciphertext fails verification\\n\");\n        }\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/box8.c",
    "content": "\n#define TEST_NAME \"box8\"\n#include \"cmptest.h\"\n\nunsigned char alicesk[crypto_box_SECRETKEYBYTES];\nunsigned char alicepk[crypto_box_PUBLICKEYBYTES];\nunsigned char bobsk[crypto_box_SECRETKEYBYTES];\nunsigned char bobpk[crypto_box_PUBLICKEYBYTES];\nunsigned char n[crypto_box_NONCEBYTES];\nunsigned char m[10000];\nunsigned char c[10000];\nunsigned char m2[10000];\n\nint main(void)\n{\n    size_t mlen;\n    size_t i;\n    int caught;\n\n    for (mlen = 0; mlen < 1000 && mlen + crypto_box_ZEROBYTES < sizeof m;\n         ++mlen) {\n        crypto_box_keypair(alicepk, alicesk);\n        crypto_box_keypair(bobpk, bobsk);\n        randombytes_buf(n, crypto_box_NONCEBYTES);\n        randombytes_buf(m + crypto_box_ZEROBYTES, mlen);\n        crypto_box(c, m, mlen + crypto_box_ZEROBYTES, n, bobpk, alicesk);\n        caught = 0;\n        while (caught < 10) {\n            c[rand() % (mlen + crypto_box_ZEROBYTES)] = rand();\n            if (crypto_box_open(m2, c, mlen + crypto_box_ZEROBYTES, n, alicepk,\n                                bobsk) == 0) {\n                for (i = 0; i < mlen + crypto_box_ZEROBYTES; ++i) {\n                    if (m2[i] != m[i]) {\n                        printf(\"forgery\\n\");\n                        return 100;\n                    }\n                }\n            } else {\n                ++caught;\n            }\n        }\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/box_easy.c",
    "content": "\n#define TEST_NAME \"box_easy\"\n#include \"cmptest.h\"\n\nunsigned char alicesk[32]\n    = { 0x77, 0x07, 0x6d, 0x0a, 0x73, 0x18, 0xa5, 0x7d, 0x3c, 0x16, 0xc1,\n        0x72, 0x51, 0xb2, 0x66, 0x45, 0xdf, 0x4c, 0x2f, 0x87, 0xeb, 0xc0,\n        0x99, 0x2a, 0xb1, 0x77, 0xfb, 0xa5, 0x1d, 0xb9, 0x2c, 0x2a };\n\nunsigned char bobpk[32]\n    = { 0xde, 0x9e, 0xdb, 0x7d, 0x7b, 0x7d, 0xc1, 0xb4, 0xd3, 0x5b, 0x61,\n        0xc2, 0xec, 0xe4, 0x35, 0x37, 0x3f, 0x83, 0x43, 0xc8, 0x5b, 0x78,\n        0x67, 0x4d, 0xad, 0xfc, 0x7e, 0x14, 0x6f, 0x88, 0x2b, 0x4f };\n\nunsigned char nonce[24] = { 0x69, 0x69, 0x6e, 0xe9, 0x55, 0xb6, 0x2b, 0x73,\n                            0xcd, 0x62, 0xbd, 0xa8, 0x75, 0xfc, 0x73, 0xd6,\n                            0x82, 0x19, 0xe0, 0x03, 0x6b, 0x7a, 0x0b, 0x37 };\n\nunsigned char m[131]\n    = { 0xbe, 0x07, 0x5f, 0xc5, 0x3c, 0x81, 0xf2, 0xd5, 0xcf, 0x14, 0x13, 0x16,\n        0xeb, 0xeb, 0x0c, 0x7b, 0x52, 0x28, 0xc5, 0x2a, 0x4c, 0x62, 0xcb, 0xd4,\n        0x4b, 0x66, 0x84, 0x9b, 0x64, 0x24, 0x4f, 0xfc, 0xe5, 0xec, 0xba, 0xaf,\n        0x33, 0xbd, 0x75, 0x1a, 0x1a, 0xc7, 0x28, 0xd4, 0x5e, 0x6c, 0x61, 0x29,\n        0x6c, 0xdc, 0x3c, 0x01, 0x23, 0x35, 0x61, 0xf4, 0x1d, 0xb6, 0x6c, 0xce,\n        0x31, 0x4a, 0xdb, 0x31, 0x0e, 0x3b, 0xe8, 0x25, 0x0c, 0x46, 0xf0, 0x6d,\n        0xce, 0xea, 0x3a, 0x7f, 0xa1, 0x34, 0x80, 0x57, 0xe2, 0xf6, 0x55, 0x6a,\n        0xd6, 0xb1, 0x31, 0x8a, 0x02, 0x4a, 0x83, 0x8f, 0x21, 0xaf, 0x1f, 0xde,\n        0x04, 0x89, 0x77, 0xeb, 0x48, 0xf5, 0x9f, 0xfd, 0x49, 0x24, 0xca, 0x1c,\n        0x60, 0x90, 0x2e, 0x52, 0xf0, 0xa0, 0x89, 0xbc, 0x76, 0x89, 0x70, 0x40,\n        0xe0, 0x82, 0xf9, 0x37, 0x76, 0x38, 0x48, 0x64, 0x5e, 0x07, 0x05 };\n\nunsigned char c[147 + crypto_box_MACBYTES];\n\nint main(void)\n{\n    size_t i;\n\n    crypto_box_easy(c, m, 131, nonce, bobpk, alicesk);\n    for (i = 0; i < 131 + crypto_box_MACBYTES; ++i) {\n        printf(\",0x%02x\", (unsigned int)c[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n    printf(\"\\n\");\n\n    assert(crypto_box_easy(c, m, SIZE_MAX - 1U, nonce, bobpk, alicesk) == -1);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/box_easy2.c",
    "content": "\n#define TEST_NAME \"box_easy2\"\n#include \"cmptest.h\"\n\nunsigned char m[10000];\nunsigned char m2[10000];\nunsigned char c[crypto_box_MACBYTES + 10000];\n\nint main(void)\n{\n    unsigned char *alicepk;\n    unsigned char *alicesk;\n    unsigned char *bobpk;\n    unsigned char *bobsk;\n    unsigned char *mac;\n    unsigned char *nonce;\n    unsigned char *k1;\n    unsigned char *k2;\n    size_t         mlen;\n    size_t         i;\n\n    alicepk = (unsigned char *) sodium_malloc(crypto_box_PUBLICKEYBYTES);\n    alicesk = (unsigned char *) sodium_malloc(crypto_box_SECRETKEYBYTES);\n    bobpk = (unsigned char *) sodium_malloc(crypto_box_PUBLICKEYBYTES);\n    bobsk = (unsigned char *) sodium_malloc(crypto_box_SECRETKEYBYTES);\n    mac = (unsigned char *) sodium_malloc(crypto_box_MACBYTES);\n    nonce = (unsigned char *) sodium_malloc(crypto_box_NONCEBYTES);\n    k1 = (unsigned char *) sodium_malloc(crypto_box_BEFORENMBYTES);\n    k2 = (unsigned char *) sodium_malloc(crypto_box_BEFORENMBYTES);\n    crypto_box_keypair(alicepk, alicesk);\n    crypto_box_keypair(bobpk, bobsk);\n    mlen = (size_t) randombytes_uniform((uint32_t)sizeof m);\n    randombytes_buf(m, mlen);\n    randombytes_buf(nonce, crypto_box_NONCEBYTES);\n    crypto_box_easy(c, m, mlen, nonce, bobpk, alicesk);\n    if (crypto_box_open_easy(m2, c,\n                             (unsigned long long) mlen + crypto_box_MACBYTES,\n                             nonce, alicepk, bobsk) != 0) {\n        printf(\"open() failed\");\n        return 1;\n    }\n    printf(\"%d\\n\", memcmp(m, m2, mlen));\n\n    for (i = 0; i < mlen + crypto_box_MACBYTES - 1; i++) {\n        if (crypto_box_open_easy(m2, c, (unsigned long long) i,\n                                 nonce, alicepk, bobsk) == 0) {\n            printf(\"short open() should have failed\");\n            return 1;\n        }\n    }\n\n    memcpy(c, m, mlen);\n    crypto_box_easy(c, c, (unsigned long long) mlen, nonce, bobpk, alicesk);\n    printf(\"%d\\n\", memcmp(m, c, mlen) == 0);\n    printf(\"%d\\n\", memcmp(m, c + crypto_box_MACBYTES, mlen) == 0);\n    if (crypto_box_open_easy(c, c,\n                             (unsigned long long) mlen + crypto_box_MACBYTES,\n                             nonce, alicepk, bobsk) != 0) {\n        printf(\"crypto_box_open_easy() failed\\n\");\n    }\n\n    crypto_box_beforenm(k1, alicepk, bobsk);\n    crypto_box_beforenm(k2, bobpk, alicesk);\n\n    memset(m2, 0, sizeof m2);\n\n    if (crypto_box_easy_afternm(c, m, SIZE_MAX - 1U, nonce, k1) == 0) {\n        printf(\"crypto_box_easy_afternm() with a short ciphertext should have failed\\n\");\n    }\n    crypto_box_easy_afternm(c, m, (unsigned long long) mlen, nonce, k1);\n    crypto_box_open_easy_afternm(m2, c,\n                                 (unsigned long long) mlen + crypto_box_MACBYTES,\n                                 nonce, k2);\n    printf(\"%d\\n\", memcmp(m, m2, mlen));\n    if (crypto_box_open_easy_afternm(m2, c, crypto_box_MACBYTES - 1U,\n                                     nonce, k2) == 0) {\n        printf(\"crypto_box_open_easy_afternm() with a huge ciphertext should have failed\\n\");\n    }\n    memset(m2, 0, sizeof m2);\n    crypto_box_detached(c, mac, m, (unsigned long long) mlen,\n                        nonce, alicepk, bobsk);\n    crypto_box_open_detached(m2, c, mac, (unsigned long long) mlen,\n                             nonce, bobpk, alicesk);\n    printf(\"%d\\n\", memcmp(m, m2, mlen));\n\n    memset(m2, 0, sizeof m2);\n    crypto_box_detached_afternm(c, mac, m, (unsigned long long) mlen,\n                                nonce, k1);\n    crypto_box_open_detached_afternm(m2, c, mac, (unsigned long long) mlen,\n                                     nonce, k2);\n    printf(\"%d\\n\", memcmp(m, m2, mlen));\n\n    sodium_free(alicepk);\n    sodium_free(alicesk);\n    sodium_free(bobpk);\n    sodium_free(bobsk);\n    sodium_free(mac);\n    sodium_free(nonce);\n    sodium_free(k1);\n    sodium_free(k2);\n    printf(\"OK\\n\");\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/box_seal.c",
    "content": "\n#define TEST_NAME \"box_seal\"\n#include \"cmptest.h\"\n\nint main(void)\n{\n    unsigned char pk[crypto_box_PUBLICKEYBYTES];\n    unsigned char sk[crypto_box_SECRETKEYBYTES];\n    unsigned char *c;\n    unsigned char *m;\n    unsigned char *m2;\n    size_t         m_len;\n    size_t         c_len;\n\n    crypto_box_keypair(pk, sk);\n    m_len = (size_t) randombytes_uniform(1000);\n    c_len = crypto_box_SEALBYTES + m_len;\n    m = (unsigned char *) sodium_malloc(m_len);\n    m2 = (unsigned char *) sodium_malloc(m_len);\n    c = (unsigned char *) sodium_malloc(c_len);\n    randombytes_buf(m, m_len);\n    if (crypto_box_seal(c, m, m_len, pk) != 0) {\n        printf(\"crypto_box_seal() failure\\n\");\n        return 1;\n    }\n    if (crypto_box_seal_open(m2, c, c_len, pk, sk) != 0) {\n        printf(\"crypto_box_seal_open() failure\\n\");\n        return 1;\n    }\n    printf(\"%d\\n\", memcmp(m, m2, m_len));\n\n    printf(\"%d\\n\", crypto_box_seal_open(m, c, 0U, pk, sk));\n    printf(\"%d\\n\", crypto_box_seal_open(m, c, c_len - 1U, pk, sk));\n    printf(\"%d\\n\", crypto_box_seal_open(m, c, c_len, sk, pk));\n\n    sodium_free(c);\n    sodium_free(m);\n    sodium_free(m2);\n\n    assert(crypto_box_sealbytes() == crypto_box_SEALBYTES);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/box_seed.c",
    "content": "\n#define TEST_NAME \"box_seed\"\n#include \"cmptest.h\"\n\nunsigned char seed[32]\n    = { 0x77, 0x07, 0x6d, 0x0a, 0x73, 0x18, 0xa5, 0x7d, 0x3c, 0x16, 0xc1,\n        0x72, 0x51, 0xb2, 0x66, 0x45, 0xdf, 0x4c, 0x2f, 0x87, 0xeb, 0xc0,\n        0x99, 0x2a, 0xb1, 0x77, 0xfb, 0xa5, 0x1d, 0xb9, 0x2c, 0x2a };\n\nint main(void)\n{\n    int i;\n    unsigned char sk[32];\n    unsigned char pk[32];\n\n    crypto_box_seed_keypair(pk, sk, seed);\n    for (i = 0; i < 32; ++i) {\n        printf(\",0x%02x\", (unsigned int)pk[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n    for (i = 0; i < 32; ++i) {\n        printf(\",0x%02x\", (unsigned int)sk[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/chacha20.c",
    "content": "\n#define TEST_NAME \"chacha20\"\n#include \"cmptest.h\"\n\nstatic void tv(void)\n{\n    static struct {\n        const char *key_hex;\n        const char *nonce_hex;\n    } tests[]\n      = { { \"0000000000000000000000000000000000000000000000000000000000000000\",\n            \"0000000000000000\" },\n          { \"0000000000000000000000000000000000000000000000000000000000000001\",\n            \"0000000000000000\" },\n          { \"0000000000000000000000000000000000000000000000000000000000000000\",\n            \"0000000000000001\" },\n          { \"0000000000000000000000000000000000000000000000000000000000000000\",\n            \"0100000000000000\" },\n          { \"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f\",\n            \"0001020304050607\" } };\n    unsigned char key[crypto_stream_chacha20_KEYBYTES];\n    unsigned char nonce[crypto_stream_chacha20_NONCEBYTES];\n    unsigned char out[160];\n    char out_hex[160 * 2 + 1];\n    size_t i = 0U;\n\n    do {\n        sodium_hex2bin((unsigned char *)key, sizeof key, tests[i].key_hex,\n                       strlen(tests[i].key_hex), NULL, NULL, NULL);\n        sodium_hex2bin(nonce, sizeof nonce, tests[i].nonce_hex,\n                       strlen(tests[i].nonce_hex), NULL, NULL, NULL);\n        crypto_stream_chacha20(out, sizeof out, nonce, key);\n        sodium_bin2hex(out_hex, sizeof out_hex, out, sizeof out);\n        printf(\"[%s]\\n\", out_hex);\n    } while (++i < (sizeof tests) / (sizeof tests[0]));\n\n    memset(out, 0x42, sizeof out);\n\n    assert(crypto_stream_chacha20(out, 0U, nonce, key) == 0);\n    assert(crypto_stream_chacha20_xor(out, out, 0U, nonce, key) == 0);\n    assert(crypto_stream_chacha20_xor(out, out, 0U, nonce, key) == 0);\n    assert(crypto_stream_chacha20_xor_ic(out, out, 0U, nonce, 1U, key) == 0);\n\n    crypto_stream_chacha20_xor(out, out, sizeof out, nonce, key);\n    sodium_bin2hex(out_hex, sizeof out_hex, out, sizeof out);\n    printf(\"[%s]\\n\", out_hex);\n\n    crypto_stream_chacha20_xor_ic(out, out, sizeof out, nonce, 0U, key);\n    sodium_bin2hex(out_hex, sizeof out_hex, out, sizeof out);\n    printf(\"[%s]\\n\", out_hex);\n\n    crypto_stream_chacha20_xor_ic(out, out, sizeof out, nonce, 1U, key);\n    sodium_bin2hex(out_hex, sizeof out_hex, out, sizeof out);\n    printf(\"[%s]\\n\", out_hex);\n};\n\nint main(void)\n{\n    tv();\n\n    assert(crypto_stream_chacha20_keybytes() > 0U);\n    assert(crypto_stream_chacha20_noncebytes() > 0U);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/cmptest.h",
    "content": "\n#ifndef __CMPTEST_H__\n#define __CMPTEST_H__\n\n#include <assert.h>\n#include <stdio.h>\n#include <stdint.h>\n#include <stdlib.h>\n#include <string.h>\n\n#include \"sodium.h\"\n#include \"quirks.h\"\n\n#ifdef __EMSCRIPTEN__\n# undef TEST_SRCDIR\n# define TEST_SRCDIR \"/test-data\"\n#endif\n#ifndef TEST_SRCDIR\n# define TEST_SRCDIR \".\"\n#endif\n\n#define TEST_NAME_RES TEST_NAME \".res\"\n#define TEST_NAME_OUT TEST_SRCDIR \"/\" TEST_NAME \".exp\"\n\n#ifdef HAVE_ARC4RANDOM\n# undef rand\n# define rand(X) arc4random(X)\n#endif\n\nFILE *fp_res;\nint   xmain(void);\n\nint main(void)\n{\n    FILE *fp_out;\n    int   c;\n\n    if ((fp_res = fopen(TEST_NAME_RES, \"w+\")) == NULL) {\n        perror(\"fopen(\" TEST_NAME_RES \")\");\n        return 99;\n    }\n    if (sodium_init() != 0) {\n        return 99;\n    }\n    if (xmain() != 0) {\n        return 99;\n    }\n    rewind(fp_res);\n    if ((fp_out = fopen(TEST_NAME_OUT, \"r\")) == NULL) {\n        perror(\"fopen(\" TEST_NAME_OUT \")\");\n        return 99;\n    }\n    do {\n        if ((c = fgetc(fp_res)) != fgetc(fp_out)) {\n            return 99;\n        }\n    } while (c != EOF);\n\n    return 0;\n}\n\n#undef  printf\n#define printf(...) fprintf(fp_res, __VA_ARGS__)\n#define main xmain\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/core1.c",
    "content": "\n#define TEST_NAME \"core1\"\n#include \"cmptest.h\"\n\nunsigned char shared[32]\n    = { 0x4a, 0x5d, 0x9d, 0x5b, 0xa4, 0xce, 0x2d, 0xe1, 0x72, 0x8e, 0x3b,\n        0xf4, 0x80, 0x35, 0x0f, 0x25, 0xe0, 0x7e, 0x21, 0xc9, 0x47, 0xd1,\n        0x9e, 0x33, 0x76, 0xf0, 0x9b, 0x3c, 0x1e, 0x16, 0x17, 0x42 };\n\nunsigned char zero[32] = { 0 };\n\nunsigned char c[16] = { 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x33,\n                        0x32, 0x2d, 0x62, 0x79, 0x74, 0x65, 0x20, 0x6b };\n\nunsigned char firstkey[32];\n\nint main(void)\n{\n    int i;\n\n    crypto_core_hsalsa20(firstkey, zero, shared, c);\n    for (i = 0; i < 32; ++i) {\n        if (i > 0) {\n            printf(\",\");\n        } else {\n            printf(\" \");\n        }\n        printf(\"0x%02x\", (unsigned int)firstkey[i]);\n        if (i % 8 == 7) {\n            printf(\"\\n\");\n        }\n    }\n    assert(crypto_core_hsalsa20_outputbytes() > 0U);\n    assert(crypto_core_hsalsa20_inputbytes() > 0U);\n    assert(crypto_core_hsalsa20_keybytes() > 0U);\n    assert(crypto_core_hsalsa20_constbytes() > 0U);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/core2.c",
    "content": "\n#define TEST_NAME \"core2\"\n#include \"cmptest.h\"\n\nunsigned char firstkey[32]\n    = { 0x1b, 0x27, 0x55, 0x64, 0x73, 0xe9, 0x85, 0xd4, 0x62, 0xcd, 0x51,\n        0x19, 0x7a, 0x9a, 0x46, 0xc7, 0x60, 0x09, 0x54, 0x9e, 0xac, 0x64,\n        0x74, 0xf2, 0x06, 0xc4, 0xee, 0x08, 0x44, 0xf6, 0x83, 0x89 };\n\nunsigned char nonceprefix[16]\n    = { 0x69, 0x69, 0x6e, 0xe9, 0x55, 0xb6, 0x2b, 0x73,\n        0xcd, 0x62, 0xbd, 0xa8, 0x75, 0xfc, 0x73, 0xd6 };\n\nunsigned char c[16] = { 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x33,\n                        0x32, 0x2d, 0x62, 0x79, 0x74, 0x65, 0x20, 0x6b };\n\nunsigned char secondkey[32];\n\nint main(void)\n{\n    int i;\n\n    crypto_core_hsalsa20(secondkey, nonceprefix, firstkey, c);\n    for (i = 0; i < 32; ++i) {\n        if (i > 0) {\n            printf(\",\");\n        } else {\n            printf(\" \");\n        }\n        printf(\"0x%02x\", (unsigned int)secondkey[i]);\n        if (i % 8 == 7) {\n            printf(\"\\n\");\n        }\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/core3.c",
    "content": "\n#define TEST_NAME \"core3\"\n#include \"cmptest.h\"\n\nunsigned char secondkey[32]\n    = { 0xdc, 0x90, 0x8d, 0xda, 0x0b, 0x93, 0x44, 0xa9, 0x53, 0x62, 0x9b,\n        0x73, 0x38, 0x20, 0x77, 0x88, 0x80, 0xf3, 0xce, 0xb4, 0x21, 0xbb,\n        0x61, 0xb9, 0x1c, 0xbd, 0x4c, 0x3e, 0x66, 0x25, 0x6c, 0xe4 };\n\nunsigned char noncesuffix[8]\n    = { 0x82, 0x19, 0xe0, 0x03, 0x6b, 0x7a, 0x0b, 0x37 };\n\nunsigned char c[16] = { 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x33,\n                        0x32, 0x2d, 0x62, 0x79, 0x74, 0x65, 0x20, 0x6b };\n\nunsigned char in[16] = { 0 };\n\nunsigned char output[64 * 256 * 256];\n\nunsigned char h[32];\n\nint main(void)\n{\n    int i;\n    long long pos = 0;\n\n    for (i = 0; i < 8; ++i)\n        in[i] = noncesuffix[i];\n    do {\n        do {\n            crypto_core_salsa20(output + pos, in, secondkey, c);\n            pos += 64;\n        } while (++in[8]);\n    } while (++in[9]);\n    crypto_hash_sha256(h, output, sizeof output);\n    for (i = 0; i < 32; ++i) {\n        printf(\"%02x\", h[i]);\n    }\n    printf(\"\\n\");\n    assert(crypto_core_salsa20_outputbytes() > 0U);\n    assert(crypto_core_salsa20_inputbytes() > 0U);\n    assert(crypto_core_salsa20_keybytes() > 0U);\n    assert(crypto_core_salsa20_constbytes() > 0U);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/core4.c",
    "content": "\n#define TEST_NAME \"core4\"\n#include \"cmptest.h\"\n\nunsigned char k[32] = { 1,   2,   3,   4,   5,   6,   7,   8,   9,   10,  11,\n                        12,  13,  14,  15,  16,  201, 202, 203, 204, 205, 206,\n                        207, 208, 209, 210, 211, 212, 213, 214, 215, 216 };\n\nunsigned char in[16] = { 101, 102, 103, 104, 105, 106, 107, 108,\n                         109, 110, 111, 112, 113, 114, 115, 116 };\n\nunsigned char c[16] = { 101, 120, 112, 97,  110, 100, 32, 51,\n                        50,  45,  98,  121, 116, 101, 32, 107 };\n\nunsigned char out[64];\n\nint main(void)\n{\n    int i;\n\n    crypto_core_salsa20(out, in, k, c);\n    for (i = 0; i < 64; ++i) {\n        if (i > 0) {\n            printf(\",\");\n        } else {\n            printf(\" \");\n        }\n        printf(\"%3d\", (unsigned int)out[i]);\n        if (i % 8 == 7) {\n            printf(\"\\n\");\n        }\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/core5.c",
    "content": "\n#define TEST_NAME \"core5\"\n#include \"cmptest.h\"\n\nunsigned char k[32]\n    = { 0xee, 0x30, 0x4f, 0xca, 0x27, 0x00, 0x8d, 0x8c, 0x12, 0x6f, 0x90,\n        0x02, 0x79, 0x01, 0xd8, 0x0f, 0x7f, 0x1d, 0x8b, 0x8d, 0xc9, 0x36,\n        0xcf, 0x3b, 0x9f, 0x81, 0x96, 0x92, 0x82, 0x7e, 0x57, 0x77 };\n\nunsigned char in[16] = { 0x81, 0x91, 0x8e, 0xf2, 0xa5, 0xe0, 0xda, 0x9b,\n                         0x3e, 0x90, 0x60, 0x52, 0x1e, 0x4b, 0xb3, 0x52 };\n\nunsigned char c[16] = { 101, 120, 112, 97,  110, 100, 32, 51,\n                        50,  45,  98,  121, 116, 101, 32, 107 };\n\nunsigned char out[32];\n\nint main(void)\n{\n    int i;\n\n    crypto_core_hsalsa20(out, in, k, c);\n    for (i = 0; i < 32; ++i) {\n        printf(\",0x%02x\", (unsigned int)out[i]);\n        if (i % 8 == 7) {\n            printf(\"\\n\");\n        }\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/core6.c",
    "content": "\n#define TEST_NAME \"core6\"\n#include \"cmptest.h\"\n\nunsigned char k[32]\n    = { 0xee, 0x30, 0x4f, 0xca, 0x27, 0x00, 0x8d, 0x8c, 0x12, 0x6f, 0x90,\n        0x02, 0x79, 0x01, 0xd8, 0x0f, 0x7f, 0x1d, 0x8b, 0x8d, 0xc9, 0x36,\n        0xcf, 0x3b, 0x9f, 0x81, 0x96, 0x92, 0x82, 0x7e, 0x57, 0x77 };\n\nunsigned char in[16] = { 0x81, 0x91, 0x8e, 0xf2, 0xa5, 0xe0, 0xda, 0x9b,\n                         0x3e, 0x90, 0x60, 0x52, 0x1e, 0x4b, 0xb3, 0x52 };\n\nunsigned char c[16] = { 101, 120, 112, 97,  110, 100, 32, 51,\n                        50,  45,  98,  121, 116, 101, 32, 107 };\n\nunsigned char out[64];\n\nvoid print(unsigned char *x, unsigned char *y)\n{\n    int i;\n    unsigned int borrow = 0;\n\n    for (i = 0; i < 4; ++i) {\n        unsigned int xi = x[i];\n        unsigned int yi = y[i];\n        printf(\",0x%02x\", 255 & (xi - yi - borrow));\n        borrow = (xi < yi + borrow);\n    }\n}\n\nint main(void)\n{\n    crypto_core_salsa20(out, in, k, c);\n    print(out, c);\n    print(out + 20, c + 4);\n    printf(\"\\n\");\n    print(out + 40, c + 8);\n    print(out + 60, c + 12);\n    printf(\"\\n\");\n    print(out + 24, in);\n    print(out + 28, in + 4);\n    printf(\"\\n\");\n    print(out + 32, in + 8);\n    print(out + 36, in + 12);\n    printf(\"\\n\");\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/ed25519_convert.c",
    "content": "\n#define TEST_NAME \"ed25519_convert\"\n#include \"cmptest.h\"\n\nstatic const unsigned char keypair_seed[crypto_sign_ed25519_SEEDBYTES]\n    = { 0x42, 0x11, 0x51, 0xa4, 0x59, 0xfa, 0xea, 0xde, 0x3d, 0x24, 0x71,\n        0x15, 0xf9, 0x4a, 0xed, 0xae, 0x42, 0x31, 0x81, 0x24, 0x09, 0x5a,\n        0xfa, 0xbe, 0x4d, 0x14, 0x51, 0xa5, 0x59, 0xfa, 0xed, 0xee };\n\nint main(void)\n{\n    unsigned char ed25519_pk[crypto_sign_ed25519_PUBLICKEYBYTES];\n    unsigned char ed25519_skpk[crypto_sign_ed25519_SECRETKEYBYTES];\n    unsigned char curve25519_pk[crypto_scalarmult_curve25519_BYTES];\n    unsigned char curve25519_pk2[crypto_scalarmult_curve25519_BYTES];\n    unsigned char curve25519_sk[crypto_scalarmult_curve25519_BYTES];\n    char curve25519_pk_hex[crypto_scalarmult_curve25519_BYTES * 2 + 1];\n    char curve25519_sk_hex[crypto_scalarmult_curve25519_BYTES * 2 + 1];\n    unsigned int i;\n\n    crypto_sign_ed25519_seed_keypair(ed25519_pk, ed25519_skpk, keypair_seed);\n    crypto_sign_ed25519_pk_to_curve25519(curve25519_pk, ed25519_pk);\n    crypto_sign_ed25519_sk_to_curve25519(curve25519_sk, ed25519_skpk);\n    sodium_bin2hex(curve25519_pk_hex, sizeof curve25519_pk_hex, curve25519_pk,\n                   sizeof curve25519_pk);\n    sodium_bin2hex(curve25519_sk_hex, sizeof curve25519_sk_hex, curve25519_sk,\n                   sizeof curve25519_sk);\n\n    printf(\"curve25519 pk: [%s]\\n\", curve25519_pk_hex);\n    printf(\"curve25519 sk: [%s]\\n\", curve25519_sk_hex);\n\n    for (i = 0U; i < 500U; i++) {\n        crypto_sign_ed25519_keypair(ed25519_pk, ed25519_skpk);\n        crypto_sign_ed25519_pk_to_curve25519(curve25519_pk, ed25519_pk);\n        crypto_sign_ed25519_sk_to_curve25519(curve25519_sk, ed25519_skpk);\n        crypto_scalarmult_curve25519_base(curve25519_pk2, curve25519_sk);\n        if (memcmp(curve25519_pk, curve25519_pk2, sizeof curve25519_pk) != 0) {\n            printf(\"conversion failed\\n\");\n        }\n    }\n    printf(\"ok\\n\");\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/generichash.c",
    "content": "\n#define TEST_NAME \"generichash\"\n#include \"cmptest.h\"\n\n#define MAXLEN 64\n\nint main(void)\n{\n    unsigned char in[MAXLEN];\n    unsigned char out[crypto_generichash_BYTES_MAX];\n    unsigned char k[crypto_generichash_KEYBYTES_MAX];\n    size_t        h;\n    size_t        i;\n    size_t        j;\n\n    for (h = 0; h < crypto_generichash_KEYBYTES_MAX; ++h) {\n        k[h] = (unsigned char) h;\n    }\n\n    for (i = 0; i < MAXLEN; ++i) {\n        in[i] = (unsigned char) i;\n        crypto_generichash(out, 1 + i % crypto_generichash_BYTES_MAX, in,\n                           (unsigned long long) i, k,\n                           1 + i % crypto_generichash_KEYBYTES_MAX);\n        for (j = 0; j < 1 + i % crypto_generichash_BYTES_MAX; ++j) {\n            printf(\"%02x\", (unsigned int) out[j]);\n        }\n        printf(\"\\n\");\n    }\n\n    memset(out, 0, sizeof out);\n    crypto_generichash(out, crypto_generichash_BYTES_MAX, in,\n                       (unsigned long long) i, k, 0U);\n    for (j = 0; j < crypto_generichash_BYTES_MAX; ++j) {\n        printf(\"%02x\", (unsigned int) out[j]);\n    }\n    printf(\"\\n\");\n\n    memset(out, 0, sizeof out);\n    crypto_generichash(out, crypto_generichash_BYTES_MAX, in,\n                       (unsigned long long) i, NULL, 1U);\n    for (j = 0; j < crypto_generichash_BYTES_MAX; ++j) {\n        printf(\"%02x\", (unsigned int) out[j]);\n    }\n    printf(\"\\n\");\n\n    assert(crypto_generichash(out, 0U, in, sizeof in, k, sizeof k) == -1);\n    assert(crypto_generichash(out, crypto_generichash_BYTES_MAX + 1U,\n                              in, sizeof in, k, sizeof k) == -1);\n    assert(crypto_generichash(out, sizeof out, in, sizeof in,\n                              k, crypto_generichash_KEYBYTES_MAX + 1U) == -1);\n\n    assert(crypto_generichash_bytes_min() > 0U);\n    assert(crypto_generichash_bytes_max() > 0U);\n    assert(crypto_generichash_bytes() > 0U);\n    assert(crypto_generichash_bytes() >= crypto_generichash_bytes_min());\n    assert(crypto_generichash_bytes() <= crypto_generichash_bytes_max());\n    assert(crypto_generichash_keybytes_min() > 0U);\n    assert(crypto_generichash_keybytes_max() > 0U);\n    assert(crypto_generichash_keybytes() > 0U);\n    assert(crypto_generichash_keybytes() >= crypto_generichash_keybytes_min());\n    assert(crypto_generichash_keybytes() <= crypto_generichash_keybytes_max());\n    assert(strcmp(crypto_generichash_primitive(), \"blake2b\") == 0);\n    assert(crypto_generichash_bytes_min()\n           == crypto_generichash_blake2b_bytes_min());\n    assert(crypto_generichash_bytes_max()\n           == crypto_generichash_blake2b_bytes_max());\n    assert(crypto_generichash_bytes() == crypto_generichash_blake2b_bytes());\n    assert(crypto_generichash_keybytes_min()\n           == crypto_generichash_blake2b_keybytes_min());\n    assert(crypto_generichash_keybytes_max()\n           == crypto_generichash_blake2b_keybytes_max());\n    assert(crypto_generichash_keybytes()\n           == crypto_generichash_blake2b_keybytes());\n    assert(crypto_generichash_blake2b_saltbytes() > 0U);\n    assert(crypto_generichash_blake2b_personalbytes() > 0U);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/generichash2.c",
    "content": "\n#define TEST_NAME \"generichash2\"\n#include \"cmptest.h\"\n\nint main(void)\n{\n#define MAXLEN 64\n    crypto_generichash_state st;\n    unsigned char in[MAXLEN], out[crypto_generichash_BYTES_MAX],\n        k[crypto_generichash_KEYBYTES_MAX];\n    size_t h, i, j;\n\n    assert(crypto_generichash_statebytes() == sizeof st);\n    for (h = 0; h < crypto_generichash_KEYBYTES_MAX; ++h)\n        k[h] = h;\n\n    for (i = 0; i < MAXLEN; ++i) {\n        in[i] = i;\n        if (crypto_generichash_init(&st, k,\n                                    1 + i % crypto_generichash_KEYBYTES_MAX,\n                                    1 + i % crypto_generichash_BYTES_MAX) != 0) {\n            printf(\"crypto_generichash_init()\\n\");\n            return 1;\n        }\n        crypto_generichash_update(&st, in, i);\n        crypto_generichash_update(&st, in, i);\n        crypto_generichash_update(&st, in, i);\n        crypto_generichash_final(&st, out,\n                                 1 + i % crypto_generichash_BYTES_MAX);\n        for (j = 0; j < 1 + i % crypto_generichash_BYTES_MAX; ++j) {\n            printf(\"%02x\", (unsigned int)out[j]);\n        }\n        printf(\"\\n\");\n    }\n\n    assert(crypto_generichash_init(&st, k, sizeof k, 0U) == -1);\n    assert(crypto_generichash_init(&st, k, sizeof k,\n                                   crypto_generichash_BYTES_MAX + 1U) == -1);\n    assert(crypto_generichash_init(&st, k, crypto_generichash_KEYBYTES_MAX + 1U,\n                                   sizeof out) == -1);\n    assert(crypto_generichash_init(&st, k, 0U, sizeof out) == 0);\n    assert(crypto_generichash_init(&st, k, 1U, sizeof out) == 0);\n    assert(crypto_generichash_init(&st, NULL, 1U, 0U) == -1);\n    assert(crypto_generichash_init(&st, NULL, crypto_generichash_KEYBYTES,\n                                   1U) == 0);\n    assert(crypto_generichash_init(&st, NULL, crypto_generichash_KEYBYTES,\n                                   0U) == -1);\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/generichash3.c",
    "content": "\n#define TEST_NAME \"generichash3\"\n#include \"cmptest.h\"\n\nint main(void)\n{\n#define MAXLEN 64\n    crypto_generichash_blake2b_state st;\n    unsigned char salt[crypto_generichash_blake2b_SALTBYTES]\n        = { '5', 'b', '6', 'b', '4', '1', 'e', 'd',\n            '9', 'b', '3', '4', '3', 'f', 'e', '0' };\n    unsigned char personal[crypto_generichash_blake2b_PERSONALBYTES]\n        = { '5', '1', '2', '6', 'f', 'b', '2', 'a',\n            '3', '7', '4', '0', '0', 'd', '2', 'a' };\n    unsigned char in[MAXLEN];\n    unsigned char out[crypto_generichash_blake2b_BYTES_MAX];\n    unsigned char k[crypto_generichash_blake2b_KEYBYTES_MAX];\n    size_t        h;\n    size_t        i;\n    size_t        j;\n\n    for (h = 0; h < crypto_generichash_blake2b_KEYBYTES_MAX; ++h) {\n        k[h] = (unsigned char) h;\n    }\n\n    for (i = 0; i < MAXLEN; ++i) {\n        in[i] = (unsigned char) i;\n        crypto_generichash_blake2b_init_salt_personal(\n            &st, k, 1 + i % crypto_generichash_blake2b_KEYBYTES_MAX,\n            1 + i % crypto_generichash_blake2b_BYTES_MAX, salt, personal);\n        crypto_generichash_blake2b_update(&st, in, (unsigned long long) i);\n        crypto_generichash_blake2b_final(\n            &st, out, 1 + i % crypto_generichash_blake2b_BYTES_MAX);\n        for (j = 0; j < 1 + i % crypto_generichash_blake2b_BYTES_MAX; ++j) {\n            printf(\"%02x\", (unsigned int) out[j]);\n        }\n        printf(\"\\n\");\n    }\n\n    memset(out, 0, sizeof out);\n    crypto_generichash_blake2b_init_salt_personal(\n        &st, k, 0U, crypto_generichash_blake2b_BYTES_MAX, salt, personal);\n    crypto_generichash_blake2b_update(&st, in, MAXLEN);\n    crypto_generichash_blake2b_final(&st, out,\n                                     crypto_generichash_blake2b_BYTES_MAX);\n    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {\n        printf(\"%02x\", (unsigned int) out[j]);\n    }\n    printf(\"\\n\");\n\n    memset(out, 0, sizeof out);\n    crypto_generichash_blake2b_init_salt_personal(\n        &st, NULL, 1U, crypto_generichash_blake2b_BYTES_MAX, salt, personal);\n    crypto_generichash_blake2b_update(&st, in, MAXLEN);\n    crypto_generichash_blake2b_final(&st, out,\n                                     crypto_generichash_blake2b_BYTES_MAX);\n    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {\n        printf(\"%02x\", (unsigned int) out[j]);\n    }\n    printf(\"\\n\");\n\n    memset(out, 0, sizeof out);\n    crypto_generichash_blake2b_init_salt_personal(\n        &st, k, crypto_generichash_blake2b_KEYBYTES_MAX,\n    crypto_generichash_blake2b_BYTES_MAX, NULL, personal);\n    crypto_generichash_blake2b_update(&st, in, MAXLEN);\n    crypto_generichash_blake2b_final(&st, out,\n                                     crypto_generichash_blake2b_BYTES_MAX);\n    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {\n        printf(\"%02x\", (unsigned int) out[j]);\n    }\n    printf(\"\\n\");\n\n    memset(out, 0, sizeof out);\n    crypto_generichash_blake2b_init_salt_personal(\n        &st, k, crypto_generichash_blake2b_KEYBYTES_MAX,\n        crypto_generichash_blake2b_BYTES_MAX, salt, NULL);\n    crypto_generichash_blake2b_update(&st, in, MAXLEN);\n    assert(crypto_generichash_blake2b_final(\n        &st, out, crypto_generichash_blake2b_BYTES_MAX + 1U) == -1);\n    crypto_generichash_blake2b_final(\n        &st, out, crypto_generichash_blake2b_BYTES_MAX);\n    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {\n        printf(\"%02x\", (unsigned int) out[j]);\n    }\n    printf(\"\\n\");\n\n    memset(out, 0, sizeof out);\n    crypto_generichash_blake2b_salt_personal(\n        out, crypto_generichash_blake2b_BYTES_MAX, in, MAXLEN,\n        k, 0U, salt, personal);\n    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {\n        printf(\"%02x\", (unsigned int) out[j]);\n    }\n    printf(\"\\n\");\n\n    memset(out, 0, sizeof out);\n    crypto_generichash_blake2b_salt_personal(\n        out, crypto_generichash_blake2b_BYTES_MAX, in, MAXLEN,\n        NULL, crypto_generichash_blake2b_KEYBYTES_MAX, salt, personal);\n    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {\n        printf(\"%02x\", (unsigned int) out[j]);\n    }\n    printf(\"\\n\");\n\n    memset(out, 0, sizeof out);\n    crypto_generichash_blake2b_salt_personal(\n        out, crypto_generichash_blake2b_BYTES_MAX, in, MAXLEN,\n        k, crypto_generichash_blake2b_KEYBYTES_MAX, salt, personal);\n    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {\n        printf(\"%02x\", (unsigned int) out[j]);\n    }\n    printf(\"\\n\");\n\n    memset(out, 0, sizeof out);\n    crypto_generichash_blake2b_salt_personal(\n        out, crypto_generichash_blake2b_BYTES_MAX, in, MAXLEN,\n        k, crypto_generichash_blake2b_KEYBYTES_MAX, NULL, personal);\n    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {\n        printf(\"%02x\", (unsigned int) out[j]);\n    }\n    printf(\"\\n\");\n\n    memset(out, 0, sizeof out);\n    crypto_generichash_blake2b_salt_personal(\n        out, crypto_generichash_blake2b_BYTES_MAX, in, MAXLEN,\n        k, crypto_generichash_blake2b_KEYBYTES_MAX, salt, NULL);\n    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {\n        printf(\"%02x\", (unsigned int) out[j]);\n    }\n    printf(\"\\n\");\n\n    crypto_generichash_blake2b_init_salt_personal(&st, NULL, 0U, crypto_generichash_BYTES,\n                                                  NULL, personal);\n    crypto_generichash_blake2b_update(&st, in, MAXLEN);\n    crypto_generichash_blake2b_final(&st, out, crypto_generichash_blake2b_BYTES_MAX);\n    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {\n        printf(\"%02x\", (unsigned int) out[j]);\n    }\n    printf(\"\\n\");\n\n    crypto_generichash_blake2b_init_salt_personal(&st, NULL, 0U, crypto_generichash_BYTES,\n                                                  salt, NULL);\n    crypto_generichash_blake2b_update(&st, in, MAXLEN);\n    crypto_generichash_blake2b_final(&st, out, crypto_generichash_blake2b_BYTES_MAX);\n    for (j = 0; j < crypto_generichash_blake2b_BYTES_MAX; ++j) {\n        printf(\"%02x\", (unsigned int) out[j]);\n    }\n    printf(\"\\n\");\n\n    assert(crypto_generichash_blake2b_init_salt_personal(&st, k, sizeof k, 0U,\n                                                         salt, personal) == -1);\n    assert(crypto_generichash_blake2b_init_salt_personal(&st, k, sizeof k,\n                                                         crypto_generichash_BYTES_MAX + 1U,\n                                                         salt, personal) == -1);\n    assert(crypto_generichash_blake2b_init_salt_personal(&st, k,\n                                                         crypto_generichash_KEYBYTES_MAX + 1U,\n                                                         sizeof out, salt, personal) == -1);\n\n    assert(crypto_generichash_blake2b_salt_personal(out, 0U, in, MAXLEN,\n                                                    k, sizeof k,\n                                                    salt, personal) == -1);\n    assert(crypto_generichash_blake2b_salt_personal(out, crypto_generichash_BYTES_MAX + 1U,\n                                                    in, MAXLEN, k, sizeof k,\n                                                    salt, personal) == -1);\n    assert(crypto_generichash_blake2b_salt_personal(out, sizeof out, in, MAXLEN,\n                                                    k, crypto_generichash_KEYBYTES_MAX + 1U,\n                                                    salt, personal) == -1);\n    assert(crypto_generichash_blake2b_init_salt_personal(&st, k, sizeof k, crypto_generichash_BYTES,\n                                                         NULL, personal) == 0);\n    assert(crypto_generichash_blake2b_init_salt_personal(&st, k, sizeof k, crypto_generichash_BYTES,\n                                                         salt, NULL) == 0);\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/hash.c",
    "content": "\n#define TEST_NAME \"hash\"\n#include \"cmptest.h\"\n\nunsigned char x[] = \"testing\\n\";\nunsigned char x2[] = \"The Conscience of a Hacker is a small essay written January 8, 1986 by a computer security hacker who went by the handle of The Mentor, who belonged to the 2nd generation of Legion of Doom.\";\nunsigned char h[crypto_hash_BYTES];\n\nint main(void)\n{\n    size_t i;\n\n    crypto_hash(h, x, sizeof x - 1U);\n    for (i = 0; i < crypto_hash_BYTES; ++i) {\n        printf(\"%02x\", (unsigned int)h[i]);\n    }\n    printf(\"\\n\");\n    crypto_hash(h, x2, sizeof x2 - 1U);\n    for (i = 0; i < crypto_hash_BYTES; ++i) {\n        printf(\"%02x\", (unsigned int)h[i]);\n    }\n    printf(\"\\n\");\n    crypto_hash_sha256(h, x, sizeof x - 1U);\n    for (i = 0; i < crypto_hash_sha256_BYTES; ++i) {\n        printf(\"%02x\", (unsigned int)h[i]);\n    }\n    printf(\"\\n\");\n    crypto_hash_sha256(h, x2, sizeof x2 - 1U);\n    for (i = 0; i < crypto_hash_sha256_BYTES; ++i) {\n        printf(\"%02x\", (unsigned int)h[i]);\n    }\n    printf(\"\\n\");\n\n    assert(crypto_hash_bytes() > 0U);\n    assert(strcmp(crypto_hash_primitive(), \"sha512\") == 0);\n    assert(crypto_hash_sha256_bytes() > 0U);\n    assert(crypto_hash_sha512_bytes() >= crypto_hash_sha256_bytes());\n    assert(crypto_hash_sha512_bytes() == crypto_hash_bytes());\n    assert(crypto_hash_sha256_statebytes() == sizeof(crypto_hash_sha256_state));\n    assert(crypto_hash_sha512_statebytes() == sizeof(crypto_hash_sha512_state));\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/hash3.c",
    "content": "\n#define TEST_NAME \"hash3\"\n#include \"cmptest.h\"\n\nunsigned char x[] = \"testing\\n\";\nunsigned char h[crypto_hash_BYTES];\n\nint main(void)\n{\n    size_t i;\n\n    crypto_hash(h, x, sizeof x - 1U);\n    for (i = 0; i < crypto_hash_BYTES; ++i) {\n        printf(\"%02x\", (unsigned int)h[i]);\n    }\n    printf(\"\\n\");\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/onetimeauth.c",
    "content": "\n#define TEST_NAME \"onetimeauth\"\n#include \"cmptest.h\"\n\nunsigned char rs[32]\n    = { 0xee, 0xa6, 0xa7, 0x25, 0x1c, 0x1e, 0x72, 0x91, 0x6d, 0x11, 0xc2,\n        0xcb, 0x21, 0x4d, 0x3c, 0x25, 0x25, 0x39, 0x12, 0x1d, 0x8e, 0x23,\n        0x4e, 0x65, 0x2d, 0x65, 0x1f, 0xa4, 0xc8, 0xcf, 0xf8, 0x80 };\n\nunsigned char c[131]\n    = { 0x8e, 0x99, 0x3b, 0x9f, 0x48, 0x68, 0x12, 0x73, 0xc2, 0x96, 0x50, 0xba,\n        0x32, 0xfc, 0x76, 0xce, 0x48, 0x33, 0x2e, 0xa7, 0x16, 0x4d, 0x96, 0xa4,\n        0x47, 0x6f, 0xb8, 0xc5, 0x31, 0xa1, 0x18, 0x6a, 0xc0, 0xdf, 0xc1, 0x7c,\n        0x98, 0xdc, 0xe8, 0x7b, 0x4d, 0xa7, 0xf0, 0x11, 0xec, 0x48, 0xc9, 0x72,\n        0x71, 0xd2, 0xc2, 0x0f, 0x9b, 0x92, 0x8f, 0xe2, 0x27, 0x0d, 0x6f, 0xb8,\n        0x63, 0xd5, 0x17, 0x38, 0xb4, 0x8e, 0xee, 0xe3, 0x14, 0xa7, 0xcc, 0x8a,\n        0xb9, 0x32, 0x16, 0x45, 0x48, 0xe5, 0x26, 0xae, 0x90, 0x22, 0x43, 0x68,\n        0x51, 0x7a, 0xcf, 0xea, 0xbd, 0x6b, 0xb3, 0x73, 0x2b, 0xc0, 0xe9, 0xda,\n        0x99, 0x83, 0x2b, 0x61, 0xca, 0x01, 0xb6, 0xde, 0x56, 0x24, 0x4a, 0x9e,\n        0x88, 0xd5, 0xf9, 0xb3, 0x79, 0x73, 0xf6, 0x22, 0xa4, 0x3d, 0x14, 0xa6,\n        0x59, 0x9b, 0x1f, 0x65, 0x4c, 0xb4, 0x5a, 0x74, 0xe3, 0x55, 0xa5 };\n\nunsigned char a[16];\n\nint main(void)\n{\n    crypto_onetimeauth_state st;\n    int i;\n\n    assert(crypto_onetimeauth_statebytes() == sizeof st);\n    crypto_onetimeauth(a, c, 131, rs);\n    for (i = 0; i < 16; ++i) {\n        printf(\",0x%02x\", (unsigned int)a[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n\n    memset(a, 0, sizeof a);\n    crypto_onetimeauth_init(&st, rs);\n    crypto_onetimeauth_update(&st, c, 100);\n    crypto_onetimeauth_update(&st, c + 100, 31);\n    crypto_onetimeauth_final(&st, a);\n    for (i = 0; i < 16; ++i) {\n        printf(\",0x%02x\", (unsigned int)a[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n\n    assert(crypto_onetimeauth_bytes() > 0U);\n    assert(crypto_onetimeauth_keybytes() > 0U);\n    assert(strcmp(crypto_onetimeauth_primitive(), \"poly1305\") == 0);\n    assert(crypto_onetimeauth_poly1305_bytes() == crypto_onetimeauth_bytes());\n    assert(crypto_onetimeauth_poly1305_keybytes()\n           == crypto_onetimeauth_keybytes());\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/onetimeauth2.c",
    "content": "\n#define TEST_NAME \"onetimeauth2\"\n#include \"cmptest.h\"\n\nunsigned char rs[32]\n    = { 0xee, 0xa6, 0xa7, 0x25, 0x1c, 0x1e, 0x72, 0x91, 0x6d, 0x11, 0xc2,\n        0xcb, 0x21, 0x4d, 0x3c, 0x25, 0x25, 0x39, 0x12, 0x1d, 0x8e, 0x23,\n        0x4e, 0x65, 0x2d, 0x65, 0x1f, 0xa4, 0xc8, 0xcf, 0xf8, 0x80 };\n\nunsigned char c[131]\n    = { 0x8e, 0x99, 0x3b, 0x9f, 0x48, 0x68, 0x12, 0x73, 0xc2, 0x96, 0x50, 0xba,\n        0x32, 0xfc, 0x76, 0xce, 0x48, 0x33, 0x2e, 0xa7, 0x16, 0x4d, 0x96, 0xa4,\n        0x47, 0x6f, 0xb8, 0xc5, 0x31, 0xa1, 0x18, 0x6a, 0xc0, 0xdf, 0xc1, 0x7c,\n        0x98, 0xdc, 0xe8, 0x7b, 0x4d, 0xa7, 0xf0, 0x11, 0xec, 0x48, 0xc9, 0x72,\n        0x71, 0xd2, 0xc2, 0x0f, 0x9b, 0x92, 0x8f, 0xe2, 0x27, 0x0d, 0x6f, 0xb8,\n        0x63, 0xd5, 0x17, 0x38, 0xb4, 0x8e, 0xee, 0xe3, 0x14, 0xa7, 0xcc, 0x8a,\n        0xb9, 0x32, 0x16, 0x45, 0x48, 0xe5, 0x26, 0xae, 0x90, 0x22, 0x43, 0x68,\n        0x51, 0x7a, 0xcf, 0xea, 0xbd, 0x6b, 0xb3, 0x73, 0x2b, 0xc0, 0xe9, 0xda,\n        0x99, 0x83, 0x2b, 0x61, 0xca, 0x01, 0xb6, 0xde, 0x56, 0x24, 0x4a, 0x9e,\n        0x88, 0xd5, 0xf9, 0xb3, 0x79, 0x73, 0xf6, 0x22, 0xa4, 0x3d, 0x14, 0xa6,\n        0x59, 0x9b, 0x1f, 0x65, 0x4c, 0xb4, 0x5a, 0x74, 0xe3, 0x55, 0xa5 };\n\nunsigned char a[16] = { 0xf3, 0xff, 0xc7, 0x70, 0x3f, 0x94, 0x00, 0xe5,\n                        0x2a, 0x7d, 0xfb, 0x4b, 0x3d, 0x33, 0x05, 0xd9 };\n\nint main(void)\n{\n    printf(\"%d\\n\", crypto_onetimeauth_verify(a, c, 131, rs));\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/onetimeauth7.c",
    "content": "\n#define TEST_NAME \"onetimeauth7\"\n#include \"cmptest.h\"\n\nunsigned char key[32];\nunsigned char c[10000];\nunsigned char a[16];\n\nint main(void)\n{\n    int clen;\n\n    for (clen = 0; clen < 10000; ++clen) {\n        randombytes_buf(key, sizeof key);\n        randombytes_buf(c, clen);\n        crypto_onetimeauth(a, c, clen, key);\n        if (crypto_onetimeauth_verify(a, c, clen, key) != 0) {\n            printf(\"fail %d\\n\", clen);\n            return 100;\n        }\n        if (clen > 0) {\n            c[rand() % clen] += 1 + (rand() % 255);\n            if (crypto_onetimeauth_verify(a, c, clen, key) == 0) {\n                printf(\"forgery %d\\n\", clen);\n                return 100;\n            }\n            a[rand() % sizeof a] += 1 + (rand() % 255);\n            if (crypto_onetimeauth_verify(a, c, clen, key) == 0) {\n                printf(\"forgery %d\\n\", clen);\n                return 100;\n            }\n        }\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/pre.js.inc",
    "content": "try {\n    this['Module'] = Module;\n    Module.test;\n} catch(e) {\n    this['Module'] = Module = {};\n}\nModule['preRun'] = Module['preRun'] || [];\nModule['preRun'].push(function(){\n    FS.init();\n    FS.mkdir('/test-data');\n    FS.mount(NODEFS,  { root: '.' }, '/test-data');\n});\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/pwhash.c",
    "content": "\n#define TEST_NAME \"pwhash\"\n#include \"cmptest.h\"\n\n#define OUT_LEN 128\n#define OPSLIMIT 1000000\n#define MEMLIMIT 10000000\n\nstatic void tv(void)\n{\n    static struct {\n        const char         *passwd_hex;\n        size_t              passwdlen;\n        const char         *salt_hex;\n        size_t              outlen;\n        unsigned long long  opslimit;\n        size_t              memlimit;\n    } tests[] = {\n          { \"a347ae92bce9f80f6f595a4480fc9c2fe7e7d7148d371e9487d75f5c23008ffae0\"\n            \"65577a928febd9b1973a5a95073acdbeb6a030cfc0d79caa2dc5cd011cef02c08d\"\n            \"a232d76d52dfbca38ca8dcbd665b17d1665f7cf5fe59772ec909733b24de97d6f5\"\n            \"8d220b20c60d7c07ec1fd93c52c31020300c6c1facd77937a597c7a6\",\n            127,\n            \"5541fbc995d5c197ba290346d2c559dedf405cf97e5f95482143202f9e74f5c2\",\n            155, 481326, 7256678 },\n          { \"e125cee61c8cb7778d9e5ad0a6f5d978ce9f84de213a8556d9ffe202020ab4a6ed\"\n            \"9074a4eb3416f9b168f137510f3a30b70b96cbfa219ff99f6c6eaffb15c06b60e0\"\n            \"0cc2890277f0fd3c622115772f7048adaebed86e\",\n            86,\n            \"f1192dd5dc2368b9cd421338b22433455ee0a3699f9379a08b9650ea2c126f0d\",\n            250, 535778, 7849083 },\n          { \"92263cbf6ac376499f68a4289d3bb59e5a22335eba63a32e6410249155b956b6a3\"\n            \"b48d4a44906b18b897127300b375b8f834f1ceffc70880a885f47c33876717e392\"\n            \"be57f7da3ae58da4fd1f43daa7e44bb82d3717af4319349c24cd31e46d295856b0\"\n            \"441b6b289992a11ced1cc3bf3011604590244a3eb737ff221129215e4e4347f491\"\n            \"5d41292b5173d196eb9add693be5319fdadc242906178bb6c0286c9b6ca6012746\"\n            \"711f58c8c392016b2fdfc09c64f0f6b6ab7b\",\n            183,\n            \"3b840e20e9555e9fb031c4ba1f1747ce25cc1d0ff664be676b9b4a90641ff194\",\n            249, 311757, 7994791 },\n          { \"027b6d8e8c8c474e9b69c7d9ed4f9971e8e1ce2f6ba95048414c3970f0f09b70e3\"\n            \"b6c5ae05872b3d8678705b7d381829c351a5a9c88c233569b35d6b0b809df44b64\"\n            \"51a9c273f1150e2ef8a0b5437eb701e373474cd44b97ef0248ebce2ca0400e1b53\"\n            \"f3d86221eca3f18eb45b702b9172440f774a82cbf1f6f525df30a6e293c873cce6\"\n            \"9bb078ed1f0d31e7f9b8062409f37f19f8550aae\",\n            152,\n            \"eb2a3056a09ad2d7d7f975bcd707598f24cd32518cde3069f2e403b34bfee8a5\",\n            5, 643464, 1397645 },\n          { \"4a857e2ee8aa9b6056f2424e84d24a72473378906ee04a46cb05311502d5250b82\"\n            \"ad86b83c8f20a23dbb74f6da60b0b6ecffd67134d45946ac8ebfb3064294bc097d\"\n            \"43ced68642bfb8bbbdd0f50b30118f5e\",\n            82,\n            \"39d82eef32010b8b79cc5ba88ed539fbaba741100f2edbeca7cc171ffeabf258\",\n            190, 758010, 5432947 },\n          { \"1845e375479537e9dd4f4486d5c91ac72775d66605eeb11a787b78a7745f1fd005\"\n            \"2d526c67235dbae1b2a4d575a74cb551c8e9096c593a497aee74ba3047d911358e\"\n            \"de57bc27c9ea1829824348daaab606217cc931dcb6627787bd6e4e5854f0e8\",\n            97,\n            \"3ee91a805aa62cfbe8dce29a2d9a44373a5006f4a4ce24022aca9cecb29d1473\",\n            212, 233177, 13101817 },\n          { \"c7b09aec680e7b42fedd7fc792e78b2f6c1bea8f4a884320b648f81e8cf515e8ba\"\n            \"9dcfb11d43c4aae114c1734aa69ca82d44998365db9c93744fa28b63fd16000e82\"\n            \"61cbbe083e7e2da1e5f696bde0834fe53146d7e0e35e7de9920d041f5a5621aabe\"\n            \"02da3e2b09b405b77937efef3197bd5772e41fdb73fb5294478e45208063b5f58e\"\n            \"089dbeb6d6342a909c1307b3fff5fe2cf4da56bdae50848f\",\n            156,\n            \"039c056d933b475032777edbaffac50f143f64c123329ed9cf59e3b65d3f43b6\",\n            178, 234753, 4886999 },\n          { \"8f3a06e2fd8711350a517bb12e31f3d3423e8dc0bb14aac8240fca0995938d59bb\"\n            \"37bd0a7dfc9c9cc0705684b46612e8c8b1d6655fb0f9887562bb9899791a0250d1\"\n            \"320f945eda48cdc20c233f40a5bb0a7e3ac5ad7250ce684f68fc0b8c9633bfd75a\"\n            \"ad116525af7bdcdbbdb4e00ab163fd4df08f243f12557e\",\n            122,\n            \"90631f686a8c3dbc0703ffa353bc1fdf35774568ac62406f98a13ed8f47595fd\",\n            55, 695191, 15738350 },\n          { \"b540beb016a5366524d4605156493f9874514a5aa58818cd0c6dfffaa9e90205f1\"\n            \"7b\",\n            34,\n            \"44071f6d181561670bda728d43fb79b443bb805afdebaf98622b5165e01b15fb\",\n            231, 78652, 6631659 },\n          { \"a14975c26c088755a8b715ff2528d647cd343987fcf4aa25e7194a8417fb2b4b3f\"\n            \"7268da9f3182b4cfb22d138b2749d673a47ecc7525dd15a0a3c66046971784bb63\"\n            \"d7eae24cc84f2631712075a10e10a96b0e0ee67c43e01c423cb9c44e5371017e9c\"\n            \"496956b632158da3fe12addecb88912e6759bc37f9af2f45af72c5cae3b179ffb6\"\n            \"76a697de6ebe45cd4c16d4a9d642d29ddc0186a0a48cb6cd62bfc3dd229d313b30\"\n            \"1560971e740e2cf1f99a9a090a5b283f35475057e96d7064e2e0fc81984591068d\"\n            \"55a3b4169f22cccb0745a2689407ea1901a0a766eb99\",\n            220,\n            \"3d968b2752b8838431165059319f3ff8910b7b8ecb54ea01d3f54769e9d98daf\",\n            167, 717248, 10784179 },\n      };\n    char          passwd[256];\n    unsigned char salt[crypto_pwhash_scryptsalsa208sha256_SALTBYTES];\n    unsigned char out[256];\n    char          out_hex[256 * 2 + 1];\n    size_t        i = 0U;\n\n    do {\n        sodium_hex2bin((unsigned char *) passwd, sizeof passwd,\n                       tests[i].passwd_hex, strlen(tests[i].passwd_hex), NULL,\n                       NULL, NULL);\n        sodium_hex2bin(salt, sizeof salt, tests[i].salt_hex,\n                       strlen(tests[i].salt_hex), NULL, NULL, NULL);\n        if (crypto_pwhash_scryptsalsa208sha256(\n                out, (unsigned long long) tests[i].outlen,\n                passwd, tests[i].passwdlen,\n                (const unsigned char *) salt, tests[i].opslimit,\n                tests[i].memlimit) != 0) {\n            printf(\"pwhash failure\\n\");\n        }\n        sodium_bin2hex(out_hex, sizeof out_hex, out, tests[i].outlen);\n        printf(\"%s\\n\", out_hex);\n    } while (++i < (sizeof tests) / (sizeof tests[0]));\n}\n\nstatic void tv2(void)\n{\n    static struct {\n        const char         *passwd_hex;\n        size_t              passwdlen;\n        const char         *salt_hex;\n        size_t              outlen;\n        unsigned long long  opslimit;\n        size_t              memlimit;\n    } tests[] = {\n          { \"a347ae92bce9f80f6f595a4480fc9c2fe7e7d7148d371e9487d75f5c23008ffae0\"\n            \"65577a928febd9b1973a5a95073acdbeb6a030cfc0d79caa2dc5cd011cef02c08d\"\n            \"a232d76d52dfbca38ca8dcbd665b17d1665f7cf5fe59772ec909733b24de97d6f5\"\n            \"8d220b20c60d7c07ec1fd93c52c31020300c6c1facd77937a597c7a6\",\n            127,\n            \"5541fbc995d5c197ba290346d2c559dedf405cf97e5f95482143202f9e74f5c2\",\n            155, 64, 1397645 },\n          { \"a347ae92bce9f80f6f595a4480fc9c2fe7e7d7148d371e9487d75f5c23008ffae0\"\n            \"65577a928febd9b1973a5a95073acdbeb6a030cfc0d79caa2dc5cd011cef02c08d\"\n            \"a232d76d52dfbca38ca8dcbd665b17d1665f7cf5fe59772ec909733b24de97d6f5\"\n            \"8d220b20c60d7c07ec1fd93c52c31020300c6c1facd77937a597c7a6\",\n            127,\n            \"5541fbc995d5c197ba290346d2c559dedf405cf97e5f95482143202f9e74f5c2\",\n            155, 32768, 1397645 },\n      };\n    char          passwd[256];\n    unsigned char salt[crypto_pwhash_scryptsalsa208sha256_SALTBYTES];\n    unsigned char out[256];\n    char          out_hex[256 * 2 + 1];\n    size_t        i = 0U;\n\n    do {\n        sodium_hex2bin((unsigned char *)passwd, sizeof passwd,\n                       tests[i].passwd_hex, strlen(tests[i].passwd_hex), NULL,\n                       NULL, NULL);\n        sodium_hex2bin(salt, sizeof salt, tests[i].salt_hex,\n                       strlen(tests[i].salt_hex), NULL, NULL, NULL);\n        if (crypto_pwhash_scryptsalsa208sha256(\n                out, (unsigned long long) tests[i].outlen,\n                passwd, tests[i].passwdlen,\n                (const unsigned char *) salt, tests[i].opslimit,\n                tests[i].memlimit) != 0) {\n            printf(\"pwhash failure\\n\");\n        }\n        sodium_bin2hex(out_hex, sizeof out_hex, out, tests[i].outlen);\n        printf(\"%s\\n\", out_hex);\n    } while (++i < (sizeof tests) / (sizeof tests[0]));\n}\n\nstatic void tv3(void)\n{\n    static struct {\n        const char *passwd;\n        const char *out;\n    } tests[] = {\n          { \"^T5H$JYt39n%K*j:W]!1s?vg!:jGi]Ax?..l7[p0v:1jHTpla9;]bUN;?bWyCbtqg \"\n            \"nrDFal+Jxl3,2`#^tFSu%v_+7iYse8-cCkNf!tD=KrW)\",\n            \"$7$B6....1....75gBMAGwfFWZqBdyF3WdTQnWdUsuTiWjG1fF9c1jiSD$tc8RoB3.\"\n            \"Em3/zNgMLWo2u00oGIoTyJv4fl3Fl8Tix72\" },\n          { \"bl72h6#y<':MFRZ>B IA1=NRkCKS%W8`1I.2uQxJN0g)N N aTt^4K!Iw5r \"\n            \"H6;crDsv^a55j9tsk'/GqweZn;cdk6+F_St6:#*=?ZCD_lw>.\",\n            \"$7$A6....3....Iahc6qM0.UQJHVgE4h9oa1/\"\n            \"4OWlWLm9CCtfguvz6bQD$QnXCo3M7nIqtry2WKsUZ5gQ.mY0wAlJu.\"\n            \"WUhtE8vF66\" },\n          { \"Py \"\n            \">e.5b+tLo@rL`dC2k@eJ&4eVl!W=JJ4+k&mAt@gt',FS1JjqKW3aq21:]^kna`\"\n            \"mde7kVkN5NrpKUptu)@4*b&?BE_sJMG1=&@`3GBCV]Wg7xwgo7x3El\",\n            \"$7$96..../....f6bEusKt79kK4wdYN0ki2nw4bJQ7P3rN6k3BSigsK/\"\n            \"D$Dsvuw7vXj5xijmrb/NOhdgoyK/OiSIYv88cEtl9Cik7\" },\n          { \"2vj;Um]FKOL27oam(:Uo8+UmSTvb1FD*h?jk_,S=;RDgF-$Fjk?]9yvfxe@fN^!NN(\"\n            \"Cuml?+2Raa\",\n            \"$7$86....I....7XwIxLtCx4VphmFeUa6OGuGJrFaIaYzDiLNu/\"\n            \"tyUPhD$U3q5GCEqCWxMwh.YQHDJrlg7FIZgViv9pcXE3h1vg61\" },\n          { \"CT=[9uUoGav,J`kU+348tA50ue#sL:ABZ3QgF+r[#vh:tTOiL>s8tv%,Jeo]jH/\"\n            \"_4^i(*jD-_ku[9Ko[=86 06V\",\n            \"$7$A6....2....R3.bjH6YS9wz9z8Jsj.3weGQ3J80ZZElGw2oVux1TP6$\"\n            \"i5u6lFzXDHaIgYEICinLD6WNaovbiXP8SnLrDRdKgA9\" },\n          { \"J#wNn`hDgOpTHNI.w^1a70%f,.9V_m038H_JIJQln`vdWnn/\"\n            \"rmILR?9H5g(+`;@H(2VosN9Fgk[WEjaBr'yB9Q19-imNa04[Mk5kvGcSn-TV\",\n            \"$7$B6....1....Dj1y.4mF1J9XmT/6IDskYdCLaPFJTq9xcCwXQ1DpT92$92/\"\n            \"hYfZLRq1nTLyIz.uc/dC6wLqwnsoqpkadrCXusm6\" },\n          { \"j4BS38Asa;p)[K+9TY!3YDj<LK-`nLVXQw9%*QfM\",\n            \"$7$B6....1....5Ods8mojVwXJq4AywF/uI9BdMSiJ/zT8hQP/\"\n            \"4cB68VC$nk4ExHNXJ802froj51/1wJTrSZvTIyyK7PecOxRRaz0\" },\n          { \"M.R>Qw+!qJb]>pP :_.9`dxM9k [eR7Y!yL-3)sNs[R,j_/^ \"\n            \"TH=5ny'15>6UXWcQW^6D%XCsO[vN[%ReA-`tV1vW(Nt*0KVK#]45P_A\",\n            \"$7$B6....1....D/\"\n            \"eyk8N5y6Z8YVQEsw521cTx.9zzLuK7YDs1KMMh.o4$alfW8ZbsUWnXc.\"\n            \"vqon2zoljVk24Tt1.IsCuo2KurvS2\" },\n          { \"K3S=KyH#)36_?]LxeR8QNKw6X=gFb'ai$C%29V* \"\n            \"tyh^Wo$TN-#Q4qkmtTCf0LLb.^E$0uykkP\",\n            \"$7$B6....1....CuBuU97xgAage8whp/\"\n            \"JNKobo0TFbsORGVbfcQIefyP8$aqalP.\"\n            \"XofGViB8EPLONqHma8vs1xc9uTIMYh9CgE.S8\" },\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"$7$A6....1....TrXs5Zk6s8sWHpQgWDIXTR8kUU3s6Jc3s.DtdS8M2i4$\"\n            \"a4ik5hGDN7foMuHOW.cp.CtX01UyCeO0.JAG.AHPpx5\" },\n\n          /* Invalid pwhash strings */\n\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"$7$A6....1....$TrXs5Zk6s8sWHpQgWDIXTR8kUU3s6Jc3s.DtdS8M2i4\"\n            \"a4ik5hGDN7foMuHOW.cp.CtX01UyCeO0.JAG.AHPpx5\" },\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"$7$.6....1....TrXs5Zk6s8sWHpQgWDIXTR8kUU3s6Jc3s.DtdS8M2i4$\"\n            \"a4ik5hGDN7foMuHOW.cp.CtX01UyCeO0.JAG.AHPpx5\" },\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"$7$A.....1....TrXs5Zk6s8sWHpQgWDIXTR8kUU3s6Jc3s.DtdS8M2i4$\"\n            \"a4ik5hGDN7foMuHOW.cp.CtX01UyCeO0.JAG.AHPpx5\" },\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"$7$A6.........TrXs5Zk6s8sWHpQgWDIXTR8kUU3s6Jc3s.DtdS8M2i4$\"\n            \"a4ik5hGDN7foMuHOW.cp.CtX01UyCeO0.JAG.AHPpx5\" },\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"$7$A6....1....TrXs5Zk6s8sWHpQgWDIXTR8kUU3s6Jc3s.DtdS8M2i44269$\"\n            \"a4ik5hGDN7foMuHOW.cp.CtX01UyCeO0.JAG.AH\" },\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"$7$A6....1....TrXs5Zk6s8sWHpQgWDIXTR8kUU3s6Jc3s.DtdS8M2i4$\"\n            \"a4ik5hGDN7foMuHOW.cp.CtX01UyCeO0.JAG.AHPpx54269\" },\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"$7^A6....1....TrXs5Zk6s8sWHpQgWDIXTR8kUU3s6Jc3s.DtdS8M2i4$\"\n            \"a4ik5hGDN7foMuHOW.cp.CtX01UyCeO0.JAG.AHPpx5\" },\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"$7$!6....1....TrXs5Zk6s8sWHpQgWDIXTR8kUU3s6Jc3s.DtdS8M2i4$\"\n            \"a4ik5hGDN7foMuHOW.cp.CtX01UyCeO0.JAG.AHPpx5\" },\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"$7$A!....1....TrXs5Zk6s8sWHpQgWDIXTR8kUU3s6Jc3s.DtdS8M2i4$\"\n            \"a4ik5hGDN7foMuHOW.cp.CtX01UyCeO0.JAG.AHPpx5\" },\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"$7$A6....!....TrXs5Zk6s8sWHpQgWDIXTR8kUU3s6Jc3s.DtdS8M2i4$\"\n            \"a4ik5hGDN7foMuHOW.cp.CtX01UyCeO0.JAG.AHPpx5\" },\n          { \"\",\n            \"$7$A6....1....TrXs5Zk6s8sWHpQgWDIXTR8kUU3s6Jc3s.DtdS8M2i4$\"\n            \"a4ik5hGDN7foMuHOW.cp.CtX01UyCeO0.JAG.AHPpx5\" },\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"$7fA6....1....TrXs5Zk6s8sWHpQgWDIXTR8kUU3s6Jc3s.DtdS8M2i4#\"\n            \"a4ik5hGDN7foMuHOW.cp.CtX01UyCeO0.JAG.AHPpx5\" },\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"$7$AX....1....TrXs5Zk6s8sWHpQgWDIXTR8kUU3s6Jc3s.DtdS8M2i4$\"\n            \"a4ik5hGDN7foMuHOW.cp.CtX01UyCeO0.JAG.AHPpx5\" },\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"$7$A6....1!...TrXs5Zk6s8sWHpQgWDIXTR8kUU3s6Jc3s.DtdS8M2i4$\"\n            \"a4ik5hGDN7foMuHOW.cp.CtX01UyCeO0.JAG.AHPpx5\" },\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"$7$A6....1\" },\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"$7$\" },\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"\" },\n          { \"Y0!?iQa9M%5ekffW(`\",\n            \"$7$A6....1....TrXs5Zk6s8sWHpQgWDIXTR8kUU3s6Jc3s.DtdS8M2i4$\"\n            \"\" },\n      };\n    char *out;\n    char *passwd;\n    size_t i = 0U;\n\n    do {\n        out = (char *) sodium_malloc(strlen(tests[i].out) + 1U);\n        assert(out != NULL);\n        memcpy(out, tests[i].out, strlen(tests[i].out) + 1U);\n        passwd = (char *) sodium_malloc(strlen(tests[i].passwd) + 1U);\n        assert(passwd != NULL);\n        memcpy(passwd, tests[i].passwd, strlen(tests[i].passwd) + 1U);\n        if (crypto_pwhash_scryptsalsa208sha256_str_verify\n            (out, passwd, strlen(passwd)) != 0) {\n            printf(\"pwhash_str failure: [%u]\\n\", (unsigned int)i);\n        }\n        sodium_free(out);\n        sodium_free(passwd);\n    } while (++i < (sizeof tests) / (sizeof tests[0]));\n}\n\nint main(void)\n{\n    char       *str_out;\n    char       *str_out2;\n    char       *salt;\n    const char *passwd = \"Correct Horse Battery Staple\";\n\n    tv();\n    tv2();\n    tv3();\n    salt = (char *)\n        sodium_malloc(crypto_pwhash_scryptsalsa208sha256_SALTBYTES);\n    str_out = (char *)\n        sodium_malloc(crypto_pwhash_scryptsalsa208sha256_STRBYTES);\n    str_out2 = (char *)\n        sodium_malloc(crypto_pwhash_scryptsalsa208sha256_STRBYTES);\n    memcpy(salt, \"[<~A 32-bytes salt for scrypt~>]\",\n           crypto_pwhash_scryptsalsa208sha256_SALTBYTES);\n    if (crypto_pwhash_scryptsalsa208sha256_str(str_out, passwd, strlen(passwd),\n                                               OPSLIMIT, MEMLIMIT) != 0) {\n        printf(\"pwhash_str failure\\n\");\n    }\n    if (crypto_pwhash_scryptsalsa208sha256_str(str_out2, passwd, strlen(passwd),\n                                               OPSLIMIT, MEMLIMIT) != 0) {\n        printf(\"pwhash_str(2) failure\\n\");\n    }\n    if (strcmp(str_out, str_out2) == 0) {\n        printf(\"pwhash_str doesn't generate different salts\\n\");\n    }\n    if (crypto_pwhash_scryptsalsa208sha256_str_verify(str_out, passwd,\n                                                      strlen(passwd)) != 0) {\n        printf(\"pwhash_str_verify failure\\n\");\n    }\n    if (crypto_pwhash_scryptsalsa208sha256_str_verify(str_out, passwd,\n                                                      strlen(passwd)) != 0) {\n        printf(\"pwhash_str_verify failure\\n\");\n    }\n    str_out[14]++;\n    if (crypto_pwhash_scryptsalsa208sha256_str_verify(\n        str_out, passwd, strlen(passwd)) == 0) {\n        printf(\"pwhash_str_verify(2) failure\\n\");\n    }\n    str_out[14]--;\n\n    assert(str_out[crypto_pwhash_scryptsalsa208sha256_STRBYTES - 1U] == 0);\n    assert(crypto_pwhash_scryptsalsa208sha256_saltbytes() > 0U);\n    assert(crypto_pwhash_scryptsalsa208sha256_strbytes() > 1U);\n    assert(crypto_pwhash_scryptsalsa208sha256_strbytes() >\n           strlen(crypto_pwhash_scryptsalsa208sha256_strprefix()));\n    assert(crypto_pwhash_scryptsalsa208sha256_opslimit_interactive() > 0U);\n    assert(crypto_pwhash_scryptsalsa208sha256_memlimit_interactive() > 0U);\n    assert(crypto_pwhash_scryptsalsa208sha256_opslimit_sensitive() > 0U);\n    assert(crypto_pwhash_scryptsalsa208sha256_memlimit_sensitive() > 0U);\n\n    sodium_free(salt);\n    sodium_free(str_out);\n    sodium_free(str_out2);\n\n    printf(\"OK\\n\");\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/pwhash_scrypt_ll.c",
    "content": "\n#define TEST_NAME \"pwhash_scrypt_ll\"\n#include \"cmptest.h\"\n\n/* Tarsnap test vectors, see: https://www.tarsnap.com/scrypt/scrypt.pdf */\n\nstatic const char *password1 = \"\";\nstatic const char *salt1 = \"\";\nstatic uint64_t N1 = 16U;\nstatic uint32_t r1 = 1U;\nstatic uint32_t p1 = 1U;\n\nstatic const char *password2 = \"password\";\nstatic const char *salt2 = \"NaCl\";\nstatic uint64_t N2 = 1024U;\nstatic uint32_t r2 = 8U;\nstatic uint32_t p2 = 16U;\n\nstatic const char *password3 = \"pleaseletmein\";\nstatic const char *salt3 = \"SodiumChloride\";\nstatic uint64_t N3 = 16384U;\nstatic uint32_t r3 = 8U;\nstatic uint32_t p3 = 1U;\n\nstatic void test_vector(const char *password, const char *salt, uint64_t N,\n                        uint32_t r, uint32_t p)\n{\n    uint8_t data[64];\n    size_t i;\n    size_t olen = (sizeof data / sizeof data[0]);\n    size_t passwordLength = strlen(password);\n    size_t saltLenght = strlen(salt);\n    int lineitems = 0;\n    int lineitemsLimit = 15;\n\n    if (crypto_pwhash_scryptsalsa208sha256_ll(\n            (const uint8_t *)password, passwordLength, (const uint8_t *)salt,\n            saltLenght, N, r, p, data, olen) != 0) {\n        printf(\"pwhash_scryptsalsa208sha256_ll([%s],[%s]) failure\\n\", password,\n               salt);\n        return;\n    }\n\n    printf(\"scrypt('%s', '%s', %llu, %lu, %lu, %lu) =\\n\", password, salt,\n           (unsigned long long)N, (unsigned long)r, (unsigned long)p,\n           (unsigned long)olen);\n\n    for (i = 0; i < olen; ++i) {\n        printf(\"%02x%c\", data[i], lineitems < lineitemsLimit ? ' ' : '\\n');\n        lineitems = lineitems < lineitemsLimit ? lineitems + 1 : 0;\n    }\n}\n\nint main(void)\n{\n    test_vector(password1, salt1, N1, r1, p1);\n    test_vector(password2, salt2, N2, r2, p2);\n    test_vector(password3, salt3, N3, r3, p3);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/randombytes.c",
    "content": "\n#define TEST_NAME \"randombytes\"\n#include \"cmptest.h\"\n\nunsigned char x[65536];\nunsigned long long freq[256];\n\nstatic int compat_tests(void)\n{\n    size_t i;\n\n    memset(x, 0, sizeof x);\n    randombytes(x, sizeof x);\n    for (i = 0; i < 256; ++i) {\n        freq[i] = 0;\n    }\n    for (i = 0; i < sizeof x; ++i) {\n        ++freq[255 & (int)x[i]];\n    }\n    for (i = 0; i < 256; ++i) {\n        if (!freq[i]) {\n            printf(\"nacl_tests failed\\n\");\n        }\n    }\n    return 0;\n}\n\nstatic int randombytes_tests(void)\n{\n    unsigned int f = 0U;\n    unsigned int i;\n    uint32_t     n;\n\n#ifdef __EMSCRIPTEN__\n    assert(strcmp(randombytes_implementation_name(), \"sysrandom\"));\n#else\n    assert(strcmp(randombytes_implementation_name(), \"js\"));\n#endif\n    randombytes(x, 1U);\n    do {\n        n = randombytes_random();\n        f |= ((n >> 24) > 1);\n        f |= ((n >> 16) > 1) << 1;\n        f |= ((n >>  8) > 1) << 2;\n        f |= ((n      ) > 1) << 3;\n        f |= (n > 0x7fffffff) << 4;\n    } while (f != 0x1f);\n    randombytes_close();\n\n    for (i = 0; i < 256; ++i) {\n        freq[i] = 0;\n    }\n    for (i = 0; i < 65536; ++i) {\n        ++freq[randombytes_uniform(256)];\n    }\n    for (i = 0; i < 256; ++i) {\n        if (!freq[i]) {\n            printf(\"randombytes_uniform() test failed\\n\");\n        }\n    }\n    assert(randombytes_uniform(1U) == 0U);\n    randombytes_close();\n#ifndef __EMSCRIPTEN__\n    randombytes_set_implementation(&randombytes_salsa20_implementation);\n    assert(strcmp(randombytes_implementation_name(), \"salsa20\") == 0);\n#endif\n    randombytes_stir();\n    for (i = 0; i < 256; ++i) {\n        freq[i] = 0;\n    }\n    for (i = 0; i < 65536; ++i) {\n        ++freq[randombytes_uniform(256)];\n    }\n    for (i = 0; i < 256; ++i) {\n        if (!freq[i]) {\n            printf(\"randombytes_uniform() test failed\\n\");\n        }\n    }\n    memset(x, 0, sizeof x);\n    randombytes_buf(x, sizeof x);\n    for (i = 0; i < 256; ++i) {\n        freq[i] = 0;\n    }\n    for (i = 0; i < sizeof x; ++i) {\n        ++freq[255 & (int)x[i]];\n    }\n    for (i = 0; i < 256; ++i) {\n        if (!freq[i]) {\n            printf(\"randombytes_buf() test failed\\n\");\n        }\n    }\n    assert(randombytes_uniform(1U) == 0U);\n    randombytes_close();\n\n    randombytes(x, 1U);\n    randombytes_close();\n\n    return 0;\n}\n\nstatic uint32_t randombytes_uniform_impl(const uint32_t upper_bound)\n{\n    return upper_bound;\n}\n\nstatic int impl_tests(void)\n{\n    randombytes_implementation impl = randombytes_sysrandom_implementation;\n    uint32_t                   v = randombytes_random();\n\n    impl.uniform = randombytes_uniform_impl;\n    randombytes_close();\n    randombytes_set_implementation(&impl);\n    assert(randombytes_uniform(v) == v);\n    assert(randombytes_uniform(v) == v);\n    assert(randombytes_uniform(v) == v);\n    assert(randombytes_uniform(v) == v);\n    randombytes_close();\n    impl.close = NULL;\n    randombytes_close();\n\n    return 0;\n}\n\nint main(void)\n{\n    compat_tests();\n    randombytes_tests();\n#ifndef __EMSCRIPTEN__\n    impl_tests();\n#endif\n    printf(\"OK\\n\");\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/scalarmult.c",
    "content": "\n#define TEST_NAME \"scalarmult\"\n#include \"cmptest.h\"\n\nunsigned char alicesk[32]\n    = { 0x77, 0x07, 0x6d, 0x0a, 0x73, 0x18, 0xa5, 0x7d, 0x3c, 0x16, 0xc1,\n        0x72, 0x51, 0xb2, 0x66, 0x45, 0xdf, 0x4c, 0x2f, 0x87, 0xeb, 0xc0,\n        0x99, 0x2a, 0xb1, 0x77, 0xfb, 0xa5, 0x1d, 0xb9, 0x2c, 0x2a };\n\nunsigned char alicepk[32];\n\nint main(void)\n{\n    int i;\n\n    crypto_scalarmult_base(alicepk, alicesk);\n\n    for (i = 0; i < 32; ++i) {\n        if (i > 0) {\n            printf(\",\");\n        } else {\n            printf(\" \");\n        }\n        printf(\"0x%02x\", (unsigned int)alicepk[i]);\n        if (i % 8 == 7) {\n            printf(\"\\n\");\n        }\n    }\n    assert(crypto_scalarmult_bytes() > 0U);\n    assert(crypto_scalarmult_scalarbytes() > 0U);\n    assert(strcmp(crypto_scalarmult_primitive(), \"curve25519\") == 0);\n    assert(crypto_scalarmult_bytes() == crypto_scalarmult_curve25519_bytes());\n    assert(crypto_scalarmult_scalarbytes()\n           == crypto_scalarmult_curve25519_scalarbytes());\n    assert(crypto_scalarmult_bytes() == crypto_scalarmult_scalarbytes());\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/scalarmult2.c",
    "content": "\n#define TEST_NAME \"scalarmult2\"\n#include \"cmptest.h\"\n\nunsigned char bobsk[32]\n    = { 0x5d, 0xab, 0x08, 0x7e, 0x62, 0x4a, 0x8a, 0x4b, 0x79, 0xe1, 0x7f,\n        0x8b, 0x83, 0x80, 0x0e, 0xe6, 0x6f, 0x3b, 0xb1, 0x29, 0x26, 0x18,\n        0xb6, 0xfd, 0x1c, 0x2f, 0x8b, 0x27, 0xff, 0x88, 0xe0, 0xeb };\n\nunsigned char bobpk[32];\n\nint main(void)\n{\n    int i;\n\n    crypto_scalarmult_base(bobpk, bobsk);\n\n    for (i = 0; i < 32; ++i) {\n        if (i > 0) {\n            printf(\",\");\n        } else {\n            printf(\" \");\n        }\n        printf(\"0x%02x\", (unsigned int)bobpk[i]);\n        if (i % 8 == 7) {\n            printf(\"\\n\");\n        }\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/scalarmult5.c",
    "content": "\n#define TEST_NAME \"scalarmult5\"\n#include \"cmptest.h\"\n\nunsigned char alicesk[32]\n    = { 0x77, 0x07, 0x6d, 0x0a, 0x73, 0x18, 0xa5, 0x7d, 0x3c, 0x16, 0xc1,\n        0x72, 0x51, 0xb2, 0x66, 0x45, 0xdf, 0x4c, 0x2f, 0x87, 0xeb, 0xc0,\n        0x99, 0x2a, 0xb1, 0x77, 0xfb, 0xa5, 0x1d, 0xb9, 0x2c, 0x2a };\n\nunsigned char bobpk[32]\n    = { 0xde, 0x9e, 0xdb, 0x7d, 0x7b, 0x7d, 0xc1, 0xb4, 0xd3, 0x5b, 0x61,\n        0xc2, 0xec, 0xe4, 0x35, 0x37, 0x3f, 0x83, 0x43, 0xc8, 0x5b, 0x78,\n        0x67, 0x4d, 0xad, 0xfc, 0x7e, 0x14, 0x6f, 0x88, 0x2b, 0x4f };\n\nunsigned char k[32];\n\nint main(void)\n{\n    int i;\n\n    crypto_scalarmult(k, alicesk, bobpk);\n\n    for (i = 0; i < 32; ++i) {\n        if (i > 0) {\n            printf(\",\");\n        } else {\n            printf(\" \");\n        }\n        printf(\"0x%02x\", (unsigned int)k[i]);\n        if (i % 8 == 7) {\n            printf(\"\\n\");\n        }\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/scalarmult6.c",
    "content": "\n#define TEST_NAME \"scalarmult6\"\n#include \"cmptest.h\"\n\nunsigned char bobsk_[crypto_scalarmult_SCALARBYTES]\n    = { 0x5d, 0xab, 0x08, 0x7e, 0x62, 0x4a, 0x8a, 0x4b, 0x79, 0xe1, 0x7f,\n        0x8b, 0x83, 0x80, 0x0e, 0xe6, 0x6f, 0x3b, 0xb1, 0x29, 0x26, 0x18,\n        0xb6, 0xfd, 0x1c, 0x2f, 0x8b, 0x27, 0xff, 0x88, 0xe0, 0xeb };\n\nunsigned char alicepk_[crypto_scalarmult_SCALARBYTES]\n    = { 0x85, 0x20, 0xf0, 0x09, 0x89, 0x30, 0xa7, 0x54, 0x74, 0x8b, 0x7d,\n        0xdc, 0xb4, 0x3e, 0xf7, 0x5a, 0x0d, 0xbf, 0x3a, 0x0d, 0x26, 0x38,\n        0x1a, 0xf4, 0xeb, 0xa4, 0xa9, 0x8e, 0xaa, 0x9b, 0x4e, 0x6a };\n\nint main(void)\n{\n    unsigned char *k;\n    unsigned char *bobsk;\n    unsigned char *alicepk;\n    int            i;\n\n    k = (unsigned char *) sodium_malloc(crypto_scalarmult_BYTES);\n    bobsk = (unsigned char *) sodium_malloc(crypto_scalarmult_SCALARBYTES);\n    alicepk = (unsigned char *) sodium_malloc(crypto_scalarmult_SCALARBYTES);\n    assert(k != NULL && bobsk != NULL && alicepk != NULL);\n\n    memcpy(bobsk, bobsk_, crypto_scalarmult_SCALARBYTES);\n    memcpy(alicepk, alicepk_, crypto_scalarmult_SCALARBYTES);\n\n    crypto_scalarmult(k, bobsk, alicepk);\n\n    sodium_free(alicepk);\n    sodium_free(bobsk);\n\n    for (i = 0; i < 32; ++i) {\n        if (i > 0) {\n            printf(\",\");\n        } else {\n            printf(\" \");\n        }\n        printf(\"0x%02x\", (unsigned int)k[i]);\n        if (i % 8 == 7) {\n            printf(\"\\n\");\n        }\n    }\n    sodium_free(k);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/scalarmult7.c",
    "content": "\n#define TEST_NAME \"scalarmult7\"\n#include \"cmptest.h\"\n\nunsigned char p1[32] = {\n    0x72, 0x20, 0xf0, 0x09, 0x89, 0x30, 0xa7, 0x54,\n    0x74, 0x8b, 0x7d, 0xdc, 0xb4, 0x3e, 0xf7, 0x5a,\n    0x0d, 0xbf, 0x3a, 0x0d, 0x26, 0x38, 0x1a, 0xf4,\n    0xeb, 0xa4, 0xa9, 0x8e, 0xaa, 0x9b, 0x4e, 0xea\n};\n\nunsigned char p2[32] = {\n    0x85, 0x20, 0xf0, 0x09, 0x89, 0x30, 0xa7, 0x54,\n    0x74, 0x8b, 0x7d, 0xdc, 0xb4, 0x3e, 0xf7, 0x5a,\n    0x0d, 0xbf, 0x3a, 0x0d, 0x26, 0x38, 0x1a, 0xf4,\n    0xeb, 0xa4, 0xa9, 0x8e, 0xaa, 0x9b, 0x4e, 0x6a\n};\n\nunsigned char scalar[32];\nunsigned char out1[32];\nunsigned char out2[32];\n\nint main(void)\n{\n    scalar[0] = 1U;\n    crypto_scalarmult_curve25519(out1, scalar, p1);\n    crypto_scalarmult_curve25519(out2, scalar, p2);\n    printf(\"%d\\n\", !!memcmp(out1, out2, 32));\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/secretbox.c",
    "content": "\n#define TEST_NAME \"secretbox\"\n#include \"cmptest.h\"\n\nunsigned char firstkey[32]\n    = { 0x1b, 0x27, 0x55, 0x64, 0x73, 0xe9, 0x85, 0xd4, 0x62, 0xcd, 0x51,\n        0x19, 0x7a, 0x9a, 0x46, 0xc7, 0x60, 0x09, 0x54, 0x9e, 0xac, 0x64,\n        0x74, 0xf2, 0x06, 0xc4, 0xee, 0x08, 0x44, 0xf6, 0x83, 0x89 };\n\nunsigned char nonce[24] = { 0x69, 0x69, 0x6e, 0xe9, 0x55, 0xb6, 0x2b, 0x73,\n                            0xcd, 0x62, 0xbd, 0xa8, 0x75, 0xfc, 0x73, 0xd6,\n                            0x82, 0x19, 0xe0, 0x03, 0x6b, 0x7a, 0x0b, 0x37 };\n\n// API requires first 32 bytes to be 0\nunsigned char m[163]\n    = { 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0xbe, 0x07, 0x5f, 0xc5,\n        0x3c, 0x81, 0xf2, 0xd5, 0xcf, 0x14, 0x13, 0x16, 0xeb, 0xeb, 0x0c, 0x7b,\n        0x52, 0x28, 0xc5, 0x2a, 0x4c, 0x62, 0xcb, 0xd4, 0x4b, 0x66, 0x84, 0x9b,\n        0x64, 0x24, 0x4f, 0xfc, 0xe5, 0xec, 0xba, 0xaf, 0x33, 0xbd, 0x75, 0x1a,\n        0x1a, 0xc7, 0x28, 0xd4, 0x5e, 0x6c, 0x61, 0x29, 0x6c, 0xdc, 0x3c, 0x01,\n        0x23, 0x35, 0x61, 0xf4, 0x1d, 0xb6, 0x6c, 0xce, 0x31, 0x4a, 0xdb, 0x31,\n        0x0e, 0x3b, 0xe8, 0x25, 0x0c, 0x46, 0xf0, 0x6d, 0xce, 0xea, 0x3a, 0x7f,\n        0xa1, 0x34, 0x80, 0x57, 0xe2, 0xf6, 0x55, 0x6a, 0xd6, 0xb1, 0x31, 0x8a,\n        0x02, 0x4a, 0x83, 0x8f, 0x21, 0xaf, 0x1f, 0xde, 0x04, 0x89, 0x77, 0xeb,\n        0x48, 0xf5, 0x9f, 0xfd, 0x49, 0x24, 0xca, 0x1c, 0x60, 0x90, 0x2e, 0x52,\n        0xf0, 0xa0, 0x89, 0xbc, 0x76, 0x89, 0x70, 0x40, 0xe0, 0x82, 0xf9, 0x37,\n        0x76, 0x38, 0x48, 0x64, 0x5e, 0x07, 0x05 };\n\nunsigned char c[163];\n\nint main(void)\n{\n    int i;\n\n    crypto_secretbox(c, m, 163, nonce, firstkey);\n    for (i = 16; i < 163; ++i) {\n        printf(\",0x%02x\", (unsigned int)c[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n    printf(\"\\n\");\n\n    assert(crypto_secretbox_keybytes() > 0U);\n    assert(crypto_secretbox_noncebytes() > 0U);\n    assert(crypto_secretbox_zerobytes() > 0U);\n    assert(crypto_secretbox_boxzerobytes() > 0U);\n    assert(crypto_secretbox_macbytes() > 0U);\n    assert(strcmp(crypto_secretbox_primitive(), \"xsalsa20poly1305\") == 0);\n    assert(crypto_secretbox_keybytes()\n           == crypto_secretbox_xsalsa20poly1305_keybytes());\n    assert(crypto_secretbox_noncebytes()\n           == crypto_secretbox_xsalsa20poly1305_noncebytes());\n    assert(crypto_secretbox_zerobytes()\n           == crypto_secretbox_xsalsa20poly1305_zerobytes());\n    assert(crypto_secretbox_boxzerobytes()\n           == crypto_secretbox_xsalsa20poly1305_boxzerobytes());\n    assert(crypto_secretbox_macbytes()\n           == crypto_secretbox_xsalsa20poly1305_macbytes());\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/secretbox2.c",
    "content": "\n#define TEST_NAME \"secretbox2\"\n#include \"cmptest.h\"\n\nunsigned char firstkey[32]\n    = { 0x1b, 0x27, 0x55, 0x64, 0x73, 0xe9, 0x85, 0xd4, 0x62, 0xcd, 0x51,\n        0x19, 0x7a, 0x9a, 0x46, 0xc7, 0x60, 0x09, 0x54, 0x9e, 0xac, 0x64,\n        0x74, 0xf2, 0x06, 0xc4, 0xee, 0x08, 0x44, 0xf6, 0x83, 0x89 };\n\nunsigned char nonce[24] = { 0x69, 0x69, 0x6e, 0xe9, 0x55, 0xb6, 0x2b, 0x73,\n                            0xcd, 0x62, 0xbd, 0xa8, 0x75, 0xfc, 0x73, 0xd6,\n                            0x82, 0x19, 0xe0, 0x03, 0x6b, 0x7a, 0x0b, 0x37 };\n\n// API requires first 16 bytes to be 0\nunsigned char c[163]\n    = { 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0xf3, 0xff, 0xc7, 0x70, 0x3f, 0x94, 0x00, 0xe5,\n        0x2a, 0x7d, 0xfb, 0x4b, 0x3d, 0x33, 0x05, 0xd9, 0x8e, 0x99, 0x3b, 0x9f,\n        0x48, 0x68, 0x12, 0x73, 0xc2, 0x96, 0x50, 0xba, 0x32, 0xfc, 0x76, 0xce,\n        0x48, 0x33, 0x2e, 0xa7, 0x16, 0x4d, 0x96, 0xa4, 0x47, 0x6f, 0xb8, 0xc5,\n        0x31, 0xa1, 0x18, 0x6a, 0xc0, 0xdf, 0xc1, 0x7c, 0x98, 0xdc, 0xe8, 0x7b,\n        0x4d, 0xa7, 0xf0, 0x11, 0xec, 0x48, 0xc9, 0x72, 0x71, 0xd2, 0xc2, 0x0f,\n        0x9b, 0x92, 0x8f, 0xe2, 0x27, 0x0d, 0x6f, 0xb8, 0x63, 0xd5, 0x17, 0x38,\n        0xb4, 0x8e, 0xee, 0xe3, 0x14, 0xa7, 0xcc, 0x8a, 0xb9, 0x32, 0x16, 0x45,\n        0x48, 0xe5, 0x26, 0xae, 0x90, 0x22, 0x43, 0x68, 0x51, 0x7a, 0xcf, 0xea,\n        0xbd, 0x6b, 0xb3, 0x73, 0x2b, 0xc0, 0xe9, 0xda, 0x99, 0x83, 0x2b, 0x61,\n        0xca, 0x01, 0xb6, 0xde, 0x56, 0x24, 0x4a, 0x9e, 0x88, 0xd5, 0xf9, 0xb3,\n        0x79, 0x73, 0xf6, 0x22, 0xa4, 0x3d, 0x14, 0xa6, 0x59, 0x9b, 0x1f, 0x65,\n        0x4c, 0xb4, 0x5a, 0x74, 0xe3, 0x55, 0xa5 };\n\nunsigned char m[163];\n\nint main(void)\n{\n    int i;\n\n    if (crypto_secretbox_open(m, c, 163, nonce, firstkey) == 0) {\n        for (i = 32; i < 163; ++i) {\n            printf(\",0x%02x\", (unsigned int)m[i]);\n            if (i % 8 == 7)\n                printf(\"\\n\");\n        }\n        printf(\"\\n\");\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/secretbox7.c",
    "content": "\n#define TEST_NAME \"secretbox7\"\n#include \"cmptest.h\"\n\nunsigned char k[crypto_secretbox_KEYBYTES];\nunsigned char n[crypto_secretbox_NONCEBYTES];\nunsigned char m[10000];\nunsigned char c[10000];\nunsigned char m2[10000];\n\nint main(void)\n{\n    size_t mlen;\n    size_t i;\n\n    for (mlen = 0; mlen < 1000 && mlen + crypto_secretbox_ZEROBYTES < sizeof m;\n         ++mlen) {\n        randombytes_buf(k, crypto_secretbox_KEYBYTES);\n        randombytes_buf(n, crypto_secretbox_NONCEBYTES);\n        randombytes_buf(m + crypto_secretbox_ZEROBYTES, mlen);\n        crypto_secretbox(c, m, mlen + crypto_secretbox_ZEROBYTES, n, k);\n        if (crypto_secretbox_open(m2, c, mlen + crypto_secretbox_ZEROBYTES, n,\n                                  k) == 0) {\n            for (i = 0; i < mlen + crypto_secretbox_ZEROBYTES; ++i) {\n                if (m2[i] != m[i]) {\n                    printf(\"bad decryption\\n\");\n                    break;\n                }\n            }\n        } else {\n            printf(\"ciphertext fails verification\\n\");\n        }\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/secretbox8.c",
    "content": "\n#define TEST_NAME \"secretbox8\"\n#include \"cmptest.h\"\n\nunsigned char k[crypto_secretbox_KEYBYTES];\nunsigned char n[crypto_secretbox_NONCEBYTES];\nunsigned char m[10000];\nunsigned char c[10000];\nunsigned char m2[10000];\n\nint main(void)\n{\n    size_t mlen;\n    size_t i;\n    int caught;\n\n    for (mlen = 0; mlen < 1000 && mlen + crypto_secretbox_ZEROBYTES < sizeof m;\n         ++mlen) {\n        randombytes_buf(k, crypto_secretbox_KEYBYTES);\n        randombytes_buf(n, crypto_secretbox_NONCEBYTES);\n        randombytes_buf(m + crypto_secretbox_ZEROBYTES, mlen);\n        crypto_secretbox(c, m, mlen + crypto_secretbox_ZEROBYTES, n, k);\n        caught = 0;\n        while (caught < 10) {\n            c[rand() % (mlen + crypto_secretbox_ZEROBYTES)] = rand();\n            if (crypto_secretbox_open(m2, c, mlen + crypto_secretbox_ZEROBYTES,\n                                      n, k) == 0) {\n                for (i = 0; i < mlen + crypto_secretbox_ZEROBYTES; ++i) {\n                    if (m2[i] != m[i]) {\n                        printf(\"forgery\\n\");\n                        return 100;\n                    }\n                }\n            } else {\n                ++caught;\n            }\n        }\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/secretbox_easy.c",
    "content": "\n#define TEST_NAME \"secretbox_easy\"\n#include \"cmptest.h\"\n\nunsigned char firstkey[32]\n    = { 0x1b, 0x27, 0x55, 0x64, 0x73, 0xe9, 0x85, 0xd4, 0x62, 0xcd, 0x51,\n        0x19, 0x7a, 0x9a, 0x46, 0xc7, 0x60, 0x09, 0x54, 0x9e, 0xac, 0x64,\n        0x74, 0xf2, 0x06, 0xc4, 0xee, 0x08, 0x44, 0xf6, 0x83, 0x89 };\n\nunsigned char nonce[24] = { 0x69, 0x69, 0x6e, 0xe9, 0x55, 0xb6, 0x2b, 0x73,\n                            0xcd, 0x62, 0xbd, 0xa8, 0x75, 0xfc, 0x73, 0xd6,\n                            0x82, 0x19, 0xe0, 0x03, 0x6b, 0x7a, 0x0b, 0x37 };\n\nunsigned char m[131]\n    = { 0xbe, 0x07, 0x5f, 0xc5, 0x3c, 0x81, 0xf2, 0xd5, 0xcf, 0x14, 0x13, 0x16,\n        0xeb, 0xeb, 0x0c, 0x7b, 0x52, 0x28, 0xc5, 0x2a, 0x4c, 0x62, 0xcb, 0xd4,\n        0x4b, 0x66, 0x84, 0x9b, 0x64, 0x24, 0x4f, 0xfc, 0xe5, 0xec, 0xba, 0xaf,\n        0x33, 0xbd, 0x75, 0x1a, 0x1a, 0xc7, 0x28, 0xd4, 0x5e, 0x6c, 0x61, 0x29,\n        0x6c, 0xdc, 0x3c, 0x01, 0x23, 0x35, 0x61, 0xf4, 0x1d, 0xb6, 0x6c, 0xce,\n        0x31, 0x4a, 0xdb, 0x31, 0x0e, 0x3b, 0xe8, 0x25, 0x0c, 0x46, 0xf0, 0x6d,\n        0xce, 0xea, 0x3a, 0x7f, 0xa1, 0x34, 0x80, 0x57, 0xe2, 0xf6, 0x55, 0x6a,\n        0xd6, 0xb1, 0x31, 0x8a, 0x02, 0x4a, 0x83, 0x8f, 0x21, 0xaf, 0x1f, 0xde,\n        0x04, 0x89, 0x77, 0xeb, 0x48, 0xf5, 0x9f, 0xfd, 0x49, 0x24, 0xca, 0x1c,\n        0x60, 0x90, 0x2e, 0x52, 0xf0, 0xa0, 0x89, 0xbc, 0x76, 0x89, 0x70, 0x40,\n        0xe0, 0x82, 0xf9, 0x37, 0x76, 0x38, 0x48, 0x64, 0x5e, 0x07, 0x05 };\n\nunsigned char c[147 + crypto_secretbox_MACBYTES];\nunsigned char mac[crypto_secretbox_MACBYTES];\n\nint main(void)\n{\n    size_t i;\n\n    crypto_secretbox_easy(c, m, 131, nonce, firstkey);\n    for (i = 0; i < 131 + crypto_secretbox_MACBYTES; ++i) {\n        printf(\",0x%02x\", (unsigned int)c[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n    printf(\"\\n\");\n\n    crypto_secretbox_detached(c, mac, m, 131, nonce, firstkey);\n    for (i = 0; i < crypto_secretbox_MACBYTES; ++i) {\n        printf(\",0x%02x\", (unsigned int)mac[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n    for (i = 0; i < 131; ++i) {\n        printf(\",0x%02x\", (unsigned int)c[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n\n    assert(crypto_secretbox_easy(c, m, SIZE_MAX - 1U, nonce, firstkey) == -1);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/secretbox_easy2.c",
    "content": "\n#define TEST_NAME \"secretbox_easy2\"\n#include \"cmptest.h\"\n\nunsigned char m[10000];\nunsigned char m2[10000];\nunsigned char c[crypto_secretbox_MACBYTES + 10000];\nunsigned char nonce[crypto_secretbox_NONCEBYTES];\nunsigned char k[crypto_secretbox_KEYBYTES];\nunsigned char mac[crypto_secretbox_MACBYTES];\n\nint main(void)\n{\n    size_t mlen;\n    size_t i;\n\n    randombytes_buf(k, sizeof k);\n    mlen = (size_t) randombytes_uniform((uint32_t) sizeof m);\n    randombytes_buf(m, (unsigned long long) mlen);\n    randombytes_buf(nonce, sizeof nonce);\n    crypto_secretbox_easy(c, m, (unsigned long long) mlen, nonce, k);\n    crypto_secretbox_open_easy(m2, c,\n                               (unsigned long long) mlen + crypto_secretbox_MACBYTES,\n                               nonce, k);\n    printf(\"%d\\n\", memcmp(m, m2, mlen));\n\n    for (i = 0; i < mlen + crypto_secretbox_MACBYTES - 1; i++) {\n        if (crypto_secretbox_open_easy(m2, c, (unsigned long long) i,\n                                       nonce, k) == 0) {\n            printf(\"short open() should have failed\\n\");\n            return 1;\n        }\n    }\n    crypto_secretbox_detached(c, mac, m, (unsigned long long) mlen, nonce, k);\n    if (crypto_secretbox_open_detached(m2, c, mac, (unsigned long long) mlen,\n                                       nonce, k) != 0) {\n        printf(\"crypto_secretbox_open_detached() failed\\n\");\n    }\n    printf(\"%d\\n\", memcmp(m, m2, mlen));\n\n    memcpy(c, m, mlen);\n    crypto_secretbox_easy(c, c, (unsigned long long) mlen, nonce, k);\n    printf(\"%d\\n\", memcmp(m, c, mlen) == 0);\n    printf(\"%d\\n\", memcmp(m, c + crypto_secretbox_MACBYTES, mlen) == 0);\n    if (crypto_secretbox_open_easy(c, c,\n                                   (unsigned long long) mlen + crypto_secretbox_MACBYTES,\n                                   nonce, k) != 0) {\n        printf(\"crypto_secretbox_open_easy() failed\\n\");\n    }\n    printf(\"%d\\n\", memcmp(m, c, mlen));\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/shorthash.c",
    "content": "\n#define TEST_NAME \"shorthash\"\n#include \"cmptest.h\"\n\n#define MAXLEN 64\n\nint main(void)\n{\n    unsigned char in[MAXLEN];\n    unsigned char out[crypto_shorthash_BYTES];\n    unsigned char k[crypto_shorthash_KEYBYTES];\n    size_t        i;\n    size_t        j;\n\n    for (i = 0; i < crypto_shorthash_KEYBYTES; ++i) {\n        k[i] = (unsigned char) i;\n    }\n\n    for (i = 0; i < MAXLEN; ++i) {\n        in[i] = (unsigned char) i;\n        crypto_shorthash(out, in, (unsigned long long) i, k);\n        for (j = 0; j < crypto_shorthash_BYTES; ++j) {\n            printf(\"%02x\", (unsigned int) out[j]);\n        }\n        printf(\"\\n\");\n    }\n    assert(crypto_shorthash_bytes() > 0);\n    assert(crypto_shorthash_keybytes() > 0);\n    assert(strcmp(crypto_shorthash_primitive(), \"siphash24\") == 0);\n    assert(crypto_shorthash_bytes() == crypto_shorthash_siphash24_bytes());\n    assert(crypto_shorthash_keybytes()\n           == crypto_shorthash_siphash24_keybytes());\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/sign.c",
    "content": "\n#define TEST_NAME \"sign\"\n#include \"cmptest.h\"\n\nstatic const unsigned char keypair_seed[]\n    = { 0x42, 0x11, 0x51, 0xa4, 0x59, 0xfa, 0xea, 0xde, 0x3d, 0x24, 0x71,\n        0x15, 0xf9, 0x4a, 0xed, 0xae, 0x42, 0x31, 0x81, 0x24, 0x09, 0x5a,\n        0xfa, 0xbe, 0x4d, 0x14, 0x51, 0xa5, 0x59, 0xfa, 0xed, 0xee };\n\ntypedef struct TestData_ {\n    const unsigned char  sk[crypto_sign_SEEDBYTES];\n    const unsigned char  pk[crypto_sign_PUBLICKEYBYTES];\n    const unsigned char  sig[crypto_sign_BYTES];\n    const char          *m;\n} TestData;\n\nstatic TestData test_data[] = {\n{{0x9d,0x61,0xb1,0x9d,0xef,0xfd,0x5a,0x60,0xba,0x84,0x4a,0xf4,0x92,0xec,0x2c,0xc4,0x44,0x49,0xc5,0x69,0x7b,0x32,0x69,0x19,0x70,0x3b,0xac,0x03,0x1c,0xae,0x7f,0x60,},{0xd7,0x5a,0x98,0x01,0x82,0xb1,0x0a,0xb7,0xd5,0x4b,0xfe,0xd3,0xc9,0x64,0x07,0x3a,0x0e,0xe1,0x72,0xf3,0xda,0xa6,0x23,0x25,0xaf,0x02,0x1a,0x68,0xf7,0x07,0x51,0x1a,},{0xe5,0x56,0x43,0x00,0xc3,0x60,0xac,0x72,0x90,0x86,0xe2,0xcc,0x80,0x6e,0x82,0x8a,0x84,0x87,0x7f,0x1e,0xb8,0xe5,0xd9,0x74,0xd8,0x73,0xe0,0x65,0x22,0x49,0x01,0x55,0x5f,0xb8,0x82,0x15,0x90,0xa3,0x3b,0xac,0xc6,0x1e,0x39,0x70,0x1c,0xf9,0xb4,0x6b,0xd2,0x5b,0xf5,0xf0,0x59,0x5b,0xbe,0x24,0x65,0x51,0x41,0x43,0x8e,0x7a,0x10,0x0b,},\"\"},\n{{0x4c,0xcd,0x08,0x9b,0x28,0xff,0x96,0xda,0x9d,0xb6,0xc3,0x46,0xec,0x11,0x4e,0x0f,0x5b,0x8a,0x31,0x9f,0x35,0xab,0xa6,0x24,0xda,0x8c,0xf6,0xed,0x4f,0xb8,0xa6,0xfb,},{0x3d,0x40,0x17,0xc3,0xe8,0x43,0x89,0x5a,0x92,0xb7,0x0a,0xa7,0x4d,0x1b,0x7e,0xbc,0x9c,0x98,0x2c,0xcf,0x2e,0xc4,0x96,0x8c,0xc0,0xcd,0x55,0xf1,0x2a,0xf4,0x66,0x0c,},{0x92,0xa0,0x09,0xa9,0xf0,0xd4,0xca,0xb8,0x72,0x0e,0x82,0x0b,0x5f,0x64,0x25,0x40,0xa2,0xb2,0x7b,0x54,0x16,0x50,0x3f,0x8f,0xb3,0x76,0x22,0x23,0xeb,0xdb,0x69,0xda,0x08,0x5a,0xc1,0xe4,0x3e,0x15,0x99,0x6e,0x45,0x8f,0x36,0x13,0xd0,0xf1,0x1d,0x8c,0x38,0x7b,0x2e,0xae,0xb4,0x30,0x2a,0xee,0xb0,0x0d,0x29,0x16,0x12,0xbb,0x0c,0x00,},\"\\x72\"},\n{{0xc5,0xaa,0x8d,0xf4,0x3f,0x9f,0x83,0x7b,0xed,0xb7,0x44,0x2f,0x31,0xdc,0xb7,0xb1,0x66,0xd3,0x85,0x35,0x07,0x6f,0x09,0x4b,0x85,0xce,0x3a,0x2e,0x0b,0x44,0x58,0xf7,},{0xfc,0x51,0xcd,0x8e,0x62,0x18,0xa1,0xa3,0x8d,0xa4,0x7e,0xd0,0x02,0x30,0xf0,0x58,0x08,0x16,0xed,0x13,0xba,0x33,0x03,0xac,0x5d,0xeb,0x91,0x15,0x48,0x90,0x80,0x25,},{0x62,0x91,0xd6,0x57,0xde,0xec,0x24,0x02,0x48,0x27,0xe6,0x9c,0x3a,0xbe,0x01,0xa3,0x0c,0xe5,0x48,0xa2,0x84,0x74,0x3a,0x44,0x5e,0x36,0x80,0xd7,0xdb,0x5a,0xc3,0xac,0x18,0xff,0x9b,0x53,0x8d,0x16,0xf2,0x90,0xae,0x67,0xf7,0x60,0x98,0x4d,0xc6,0x59,0x4a,0x7c,0x15,0xe9,0x71,0x6e,0xd2,0x8d,0xc0,0x27,0xbe,0xce,0xea,0x1e,0xc4,0x0a,},\"\\xaf\\x82\"},\n{{0x0d,0x4a,0x05,0xb0,0x73,0x52,0xa5,0x43,0x6e,0x18,0x03,0x56,0xda,0x0a,0xe6,0xef,0xa0,0x34,0x5f,0xf7,0xfb,0x15,0x72,0x57,0x57,0x72,0xe8,0x00,0x5e,0xd9,0x78,0xe9,},{0xe6,0x1a,0x18,0x5b,0xce,0xf2,0x61,0x3a,0x6c,0x7c,0xb7,0x97,0x63,0xce,0x94,0x5d,0x3b,0x24,0x5d,0x76,0x11,0x4d,0xd4,0x40,0xbc,0xf5,0xf2,0xdc,0x1a,0xa5,0x70,0x57,},{0xd9,0x86,0x8d,0x52,0xc2,0xbe,0xbc,0xe5,0xf3,0xfa,0x5a,0x79,0x89,0x19,0x70,0xf3,0x09,0xcb,0x65,0x91,0xe3,0xe1,0x70,0x2a,0x70,0x27,0x6f,0xa9,0x7c,0x24,0xb3,0xa8,0xe5,0x86,0x06,0xc3,0x8c,0x97,0x58,0x52,0x9d,0xa5,0x0e,0xe3,0x1b,0x82,0x19,0xcb,0xa4,0x52,0x71,0xc6,0x89,0xaf,0xa6,0x0b,0x0e,0xa2,0x6c,0x99,0xdb,0x19,0xb0,0x0c,},\"\\xcb\\xc7\\x7b\"},\n{{0x6d,0xf9,0x34,0x0c,0x13,0x8c,0xc1,0x88,0xb5,0xfe,0x44,0x64,0xeb,0xaa,0x3f,0x7f,0xc2,0x06,0xa2,0xd5,0x5c,0x34,0x34,0x70,0x7e,0x74,0xc9,0xfc,0x04,0xe2,0x0e,0xbb,},{0xc0,0xda,0xc1,0x02,0xc4,0x53,0x31,0x86,0xe2,0x5d,0xc4,0x31,0x28,0x47,0x23,0x53,0xea,0xab,0xdb,0x87,0x8b,0x15,0x2a,0xeb,0x8e,0x00,0x1f,0x92,0xd9,0x02,0x33,0xa7,},{0x12,0x4f,0x6f,0xc6,0xb0,0xd1,0x00,0x84,0x27,0x69,0xe7,0x1b,0xd5,0x30,0x66,0x4d,0x88,0x8d,0xf8,0x50,0x7d,0xf6,0xc5,0x6d,0xed,0xfd,0xb5,0x09,0xae,0xb9,0x34,0x16,0xe2,0x6b,0x91,0x8d,0x38,0xaa,0x06,0x30,0x5d,0xf3,0x09,0x56,0x97,0xc1,0x8b,0x2a,0xa8,0x32,0xea,0xa5,0x2e,0xdc,0x0a,0xe4,0x9f,0xba,0xe5,0xa8,0x5e,0x15,0x0c,0x07,},\"\\x5f\\x4c\\x89\\x89\"},\n{{0xb7,0x80,0x38,0x1a,0x65,0xed,0xf8,0xb7,0x8f,0x69,0x45,0xe8,0xdb,0xec,0x79,0x41,0xac,0x04,0x9f,0xd4,0xc6,0x10,0x40,0xcf,0x0c,0x32,0x43,0x57,0x97,0x5a,0x29,0x3c,},{0xe2,0x53,0xaf,0x07,0x66,0x80,0x4b,0x86,0x9b,0xb1,0x59,0x5b,0xe9,0x76,0x5b,0x53,0x48,0x86,0xbb,0xaa,0xb8,0x30,0x5b,0xf5,0x0d,0xbc,0x7f,0x89,0x9b,0xfb,0x5f,0x01,},{0xb2,0xfc,0x46,0xad,0x47,0xaf,0x46,0x44,0x78,0xc1,0x99,0xe1,0xf8,0xbe,0x16,0x9f,0x1b,0xe6,0x32,0x7c,0x7f,0x9a,0x0a,0x66,0x89,0x37,0x1c,0xa9,0x4c,0xaf,0x04,0x06,0x4a,0x01,0xb2,0x2a,0xff,0x15,0x20,0xab,0xd5,0x89,0x51,0x34,0x16,0x03,0xfa,0xed,0x76,0x8c,0xf7,0x8c,0xe9,0x7a,0xe7,0xb0,0x38,0xab,0xfe,0x45,0x6a,0xa1,0x7c,0x09,},\"\\x18\\xb6\\xbe\\xc0\\x97\"},\n{{0x78,0xae,0x9e,0xff,0xe6,0xf2,0x45,0xe9,0x24,0xa7,0xbe,0x63,0x04,0x11,0x46,0xeb,0xc6,0x70,0xdb,0xd3,0x06,0x0c,0xba,0x67,0xfb,0xc6,0x21,0x6f,0xeb,0xc4,0x45,0x46,},{0xfb,0xcf,0xbf,0xa4,0x05,0x05,0xd7,0xf2,0xbe,0x44,0x4a,0x33,0xd1,0x85,0xcc,0x54,0xe1,0x6d,0x61,0x52,0x60,0xe1,0x64,0x0b,0x2b,0x50,0x87,0xb8,0x3e,0xe3,0x64,0x3d,},{0x6e,0xd6,0x29,0xfc,0x1d,0x9c,0xe9,0xe1,0x46,0x87,0x55,0xff,0x63,0x6d,0x5a,0x3f,0x40,0xa5,0xd9,0xc9,0x1a,0xfd,0x93,0xb7,0x9d,0x24,0x18,0x30,0xf7,0xe5,0xfa,0x29,0x85,0x4b,0x8f,0x20,0xcc,0x6e,0xec,0xbb,0x24,0x8d,0xbd,0x8d,0x16,0xd1,0x4e,0x99,0x75,0x21,0x94,0xe4,0x90,0x4d,0x09,0xc7,0x4d,0x63,0x95,0x18,0x83,0x9d,0x23,0x00,},\"\\x89\\x01\\x0d\\x85\\x59\\x72\"},\n{{0x69,0x18,0x65,0xbf,0xc8,0x2a,0x1e,0x4b,0x57,0x4e,0xec,0xde,0x4c,0x75,0x19,0x09,0x3f,0xaf,0x0c,0xf8,0x67,0x38,0x02,0x34,0xe3,0x66,0x46,0x45,0xc6,0x1c,0x5f,0x79,},{0x98,0xa5,0xe3,0xa3,0x6e,0x67,0xaa,0xba,0x89,0x88,0x8b,0xf0,0x93,0xde,0x1a,0xd9,0x63,0xe7,0x74,0x01,0x3b,0x39,0x02,0xbf,0xab,0x35,0x6d,0x8b,0x90,0x17,0x8a,0x63,},{0x6e,0x0a,0xf2,0xfe,0x55,0xae,0x37,0x7a,0x6b,0x7a,0x72,0x78,0xed,0xfb,0x41,0x9b,0xd3,0x21,0xe0,0x6d,0x0d,0xf5,0xe2,0x70,0x37,0xdb,0x88,0x12,0xe7,0xe3,0x52,0x98,0x10,0xfa,0x55,0x52,0xf6,0xc0,0x02,0x09,0x85,0xca,0x17,0xa0,0xe0,0x2e,0x03,0x6d,0x7b,0x22,0x2a,0x24,0xf9,0x9b,0x77,0xb7,0x5f,0xdd,0x16,0xcb,0x05,0x56,0x81,0x07,},\"\\xb4\\xa8\\xf3\\x81\\xe7\\x0e\\x7a\"},\n{{0x3b,0x26,0x51,0x6f,0xb3,0xdc,0x88,0xeb,0x18,0x1b,0x9e,0xd7,0x3f,0x0b,0xcd,0x52,0xbc,0xd6,0xb4,0xc7,0x88,0xe4,0xbc,0xaf,0x46,0x05,0x7f,0xd0,0x78,0xbe,0xe0,0x73,},{0xf8,0x1f,0xb5,0x4a,0x82,0x5f,0xce,0xd9,0x5e,0xb0,0x33,0xaf,0xcd,0x64,0x31,0x40,0x75,0xab,0xfb,0x0a,0xbd,0x20,0xa9,0x70,0x89,0x25,0x03,0x43,0x6f,0x34,0xb8,0x63,},{0xd6,0xad,0xde,0xc5,0xaf,0xb0,0x52,0x8a,0xc1,0x7b,0xb1,0x78,0xd3,0xe7,0xf2,0x88,0x7f,0x9a,0xdb,0xb1,0xad,0x16,0xe1,0x10,0x54,0x5e,0xf3,0xbc,0x57,0xf9,0xde,0x23,0x14,0xa5,0xc8,0x38,0x8f,0x72,0x3b,0x89,0x07,0xbe,0x0f,0x3a,0xc9,0x0c,0x62,0x59,0xbb,0xe8,0x85,0xec,0xc1,0x76,0x45,0xdf,0x3d,0xb7,0xd4,0x88,0xf8,0x05,0xfa,0x08,},\"\\x42\\x84\\xab\\xc5\\x1b\\xb6\\x72\\x35\"},\n{{0xed,0xc6,0xf5,0xfb,0xdd,0x1c,0xee,0x4d,0x10,0x1c,0x06,0x35,0x30,0xa3,0x04,0x90,0xb2,0x21,0xbe,0x68,0xc0,0x36,0xf5,0xb0,0x7d,0x0f,0x95,0x3b,0x74,0x5d,0xf1,0x92,},{0xc1,0xa4,0x9c,0x66,0xe6,0x17,0xf9,0xef,0x5e,0xc6,0x6b,0xc4,0xc6,0x56,0x4c,0xa3,0x3d,0xe2,0xa5,0xfb,0x5e,0x14,0x64,0x06,0x2e,0x6d,0x6c,0x62,0x19,0x15,0x5e,0xfd,},{0x2c,0x76,0xa0,0x4a,0xf2,0x39,0x1c,0x14,0x70,0x82,0xe3,0x3f,0xaa,0xcd,0xbe,0x56,0x64,0x2a,0x1e,0x13,0x4b,0xd3,0x88,0x62,0x0b,0x85,0x2b,0x90,0x1a,0x6b,0xc1,0x6f,0xf6,0xc9,0xcc,0x94,0x04,0xc4,0x1d,0xea,0x12,0xed,0x28,0x1d,0xa0,0x67,0xa1,0x51,0x38,0x66,0xf9,0xd9,0x64,0xf8,0xbd,0xd2,0x49,0x53,0x85,0x6c,0x50,0x04,0x29,0x01,},\"\\x67\\x2b\\xf8\\x96\\x5d\\x04\\xbc\\x51\\x46\"},\n{{0x4e,0x7d,0x21,0xfb,0x3b,0x18,0x97,0x57,0x1a,0x44,0x58,0x33,0xbe,0x0f,0x9f,0xd4,0x1c,0xd6,0x2b,0xe3,0xaa,0x04,0x04,0x0f,0x89,0x34,0xe1,0xfc,0xbd,0xca,0xcd,0x45,},{0x31,0xb2,0x52,0x4b,0x83,0x48,0xf7,0xab,0x1d,0xfa,0xfa,0x67,0x5c,0xc5,0x38,0xe9,0xa8,0x4e,0x3f,0xe5,0x81,0x9e,0x27,0xc1,0x2a,0xd8,0xbb,0xc1,0xa3,0x6e,0x4d,0xff,},{0x28,0xe4,0x59,0x8c,0x41,0x5a,0xe9,0xde,0x01,0xf0,0x3f,0x9f,0x3f,0xab,0x4e,0x91,0x9e,0x8b,0xf5,0x37,0xdd,0x2b,0x0c,0xdf,0x6e,0x79,0xb9,0xe6,0x55,0x9c,0x94,0x09,0xd9,0x15,0x1a,0x4c,0x40,0xf0,0x83,0x19,0x39,0x37,0x62,0x7c,0x36,0x94,0x88,0x25,0x9e,0x99,0xda,0x5a,0x9f,0x0a,0x87,0x49,0x7f,0xa6,0x69,0x6a,0x5d,0xd6,0xce,0x08,},\"\\x33\\xd7\\xa7\\x86\\xad\\xed\\x8c\\x1b\\xf6\\x91\"},\n{{0xa9,0x80,0xf8,0x92,0xdb,0x13,0xc9,0x9a,0x3e,0x89,0x71,0xe9,0x65,0xb2,0xff,0x3d,0x41,0xea,0xfd,0x54,0x09,0x3b,0xc9,0xf3,0x4d,0x1f,0xd2,0x2d,0x84,0x11,0x5b,0xb6,},{0x44,0xb5,0x7e,0xe3,0x0c,0xdb,0x55,0x82,0x9d,0x0a,0x5d,0x4f,0x04,0x6b,0xae,0xf0,0x78,0xf1,0xe9,0x7a,0x7f,0x21,0xb6,0x2d,0x75,0xf8,0xe9,0x6e,0xa1,0x39,0xc3,0x5f,},{0x77,0xd3,0x89,0xe5,0x99,0x63,0x0d,0x93,0x40,0x76,0x32,0x95,0x83,0xcd,0x41,0x05,0xa6,0x49,0xa9,0x29,0x2a,0xbc,0x44,0xcd,0x28,0xc4,0x00,0x00,0xc8,0xe2,0xf5,0xac,0x76,0x60,0xa8,0x1c,0x85,0xb7,0x2a,0xf8,0x45,0x2d,0x7d,0x25,0xc0,0x70,0x86,0x1d,0xae,0x91,0x60,0x1c,0x78,0x03,0xd6,0x56,0x53,0x16,0x50,0xdd,0x4e,0x5c,0x41,0x00,},\"\\x34\\x86\\xf6\\x88\\x48\\xa6\\x5a\\x0e\\xb5\\x50\\x7d\"},\n{{0x5b,0x5a,0x61,0x9f,0x8c,0xe1,0xc6,0x6d,0x7c,0xe2,0x6e,0x5a,0x2a,0xe7,0xb0,0xc0,0x4f,0xeb,0xcd,0x34,0x6d,0x28,0x6c,0x92,0x9e,0x19,0xd0,0xd5,0x97,0x3b,0xfe,0xf9,},{0x6f,0xe8,0x36,0x93,0xd0,0x11,0xd1,0x11,0x13,0x1c,0x4f,0x3f,0xba,0xaa,0x40,0xa9,0xd3,0xd7,0x6b,0x30,0x01,0x2f,0xf7,0x3b,0xb0,0xe3,0x9e,0xc2,0x7a,0xb1,0x82,0x57,},{0x0f,0x9a,0xd9,0x79,0x30,0x33,0xa2,0xfa,0x06,0x61,0x4b,0x27,0x7d,0x37,0x38,0x1e,0x6d,0x94,0xf6,0x5a,0xc2,0xa5,0xa9,0x45,0x58,0xd0,0x9e,0xd6,0xce,0x92,0x22,0x58,0xc1,0xa5,0x67,0x95,0x2e,0x86,0x3a,0xc9,0x42,0x97,0xae,0xc3,0xc0,0xd0,0xc8,0xdd,0xf7,0x10,0x84,0xe5,0x04,0x86,0x0b,0xb6,0xba,0x27,0x44,0x9b,0x55,0xad,0xc4,0x0e,},\"\\x5a\\x8d\\x9d\\x0a\\x22\\x35\\x7e\\x66\\x55\\xf9\\xc7\\x85\"},\n{{0x94,0x0c,0x89,0xfe,0x40,0xa8,0x1d,0xaf,0xbd,0xb2,0x41,0x6d,0x14,0xae,0x46,0x91,0x19,0x86,0x97,0x44,0x41,0x0c,0x33,0x03,0xbf,0xaa,0x02,0x41,0xda,0xc5,0x78,0x00,},{0xa2,0xeb,0x8c,0x05,0x01,0xe3,0x0b,0xae,0x0c,0xf8,0x42,0xd2,0xbd,0xe8,0xde,0xc7,0x38,0x6f,0x6b,0x7f,0xc3,0x98,0x1b,0x8c,0x57,0xc9,0x79,0x2b,0xb9,0x4c,0xf2,0xdd,},{0xd8,0xbb,0x64,0xaa,0xd8,0xc9,0x95,0x5a,0x11,0x5a,0x79,0x3a,0xdd,0xd2,0x4f,0x7f,0x2b,0x07,0x76,0x48,0x71,0x4f,0x49,0xc4,0x69,0x4e,0xc9,0x95,0xb3,0x30,0xd0,0x9d,0x64,0x0d,0xf3,0x10,0xf4,0x47,0xfd,0x7b,0x6c,0xb5,0xc1,0x4f,0x9f,0xe9,0xf4,0x90,0xbc,0xf8,0xcf,0xad,0xbf,0xd2,0x16,0x9c,0x8a,0xc2,0x0d,0x3b,0x8a,0xf4,0x9a,0x0c,},\"\\xb8\\x7d\\x38\\x13\\xe0\\x3f\\x58\\xcf\\x19\\xfd\\x0b\\x63\\x95\"},\n{{0x9a,0xca,0xd9,0x59,0xd2,0x16,0x21,0x2d,0x78,0x9a,0x11,0x92,0x52,0xeb,0xfe,0x0c,0x96,0x51,0x2a,0x23,0xc7,0x3b,0xd9,0xf3,0xb2,0x02,0x29,0x2d,0x69,0x16,0xa7,0x38,},{0xcf,0x3a,0xf8,0x98,0x46,0x7a,0x5b,0x7a,0x52,0xd3,0x3d,0x53,0xbc,0x03,0x7e,0x26,0x42,0xa8,0xda,0x99,0x69,0x03,0xfc,0x25,0x22,0x17,0xe9,0xc0,0x33,0xe2,0xf2,0x91,},{0x6e,0xe3,0xfe,0x81,0xe2,0x3c,0x60,0xeb,0x23,0x12,0xb2,0x00,0x6b,0x3b,0x25,0xe6,0x83,0x8e,0x02,0x10,0x66,0x23,0xf8,0x44,0xc4,0x4e,0xdb,0x8d,0xaf,0xd6,0x6a,0xb0,0x67,0x10,0x87,0xfd,0x19,0x5d,0xf5,0xb8,0xf5,0x8a,0x1d,0x6e,0x52,0xaf,0x42,0x90,0x80,0x53,0xd5,0x5c,0x73,0x21,0x01,0x00,0x92,0x74,0x87,0x95,0xef,0x94,0xcf,0x06,},\"\\x55\\xc7\\xfa\\x43\\x4f\\x5e\\xd8\\xcd\\xec\\x2b\\x7a\\xea\\xc1\\x73\"},\n{{0xd5,0xae,0xee,0x41,0xee,0xb0,0xe9,0xd1,0xbf,0x83,0x37,0xf9,0x39,0x58,0x7e,0xbe,0x29,0x61,0x61,0xe6,0xbf,0x52,0x09,0xf5,0x91,0xec,0x93,0x9e,0x14,0x40,0xc3,0x00,},{0xfd,0x2a,0x56,0x57,0x23,0x16,0x3e,0x29,0xf5,0x3c,0x9d,0xe3,0xd5,0xe8,0xfb,0xe3,0x6a,0x7a,0xb6,0x6e,0x14,0x39,0xec,0x4e,0xae,0x9c,0x0a,0x60,0x4a,0xf2,0x91,0xa5,},{0xf6,0x8d,0x04,0x84,0x7e,0x5b,0x24,0x97,0x37,0x89,0x9c,0x01,0x4d,0x31,0xc8,0x05,0xc5,0x00,0x7a,0x62,0xc0,0xa1,0x0d,0x50,0xbb,0x15,0x38,0xc5,0xf3,0x55,0x03,0x95,0x1f,0xbc,0x1e,0x08,0x68,0x2f,0x2c,0xc0,0xc9,0x2e,0xfe,0x8f,0x49,0x85,0xde,0xc6,0x1d,0xcb,0xd5,0x4d,0x4b,0x94,0xa2,0x25,0x47,0xd2,0x44,0x51,0x27,0x1c,0x8b,0x00,},\"\\x0a\\x68\\x8e\\x79\\xbe\\x24\\xf8\\x66\\x28\\x6d\\x46\\x46\\xb5\\xd8\\x1c\"},\n{{0x0a,0x47,0xd1,0x04,0x52,0xae,0x2f,0xeb,0xec,0x51,0x8a,0x1c,0x7c,0x36,0x28,0x90,0xc3,0xfc,0x1a,0x49,0xd3,0x4b,0x03,0xb6,0x46,0x7d,0x35,0xc9,0x04,0xa8,0x36,0x2d,},{0x34,0xe5,0xa8,0x50,0x8c,0x47,0x43,0x74,0x69,0x62,0xc0,0x66,0xe4,0xba,0xde,0xa2,0x20,0x1b,0x8a,0xb4,0x84,0xde,0x5c,0x4f,0x94,0x47,0x6c,0xcd,0x21,0x43,0x95,0x5b,},{0x2a,0x3d,0x27,0xdc,0x40,0xd0,0xa8,0x12,0x79,0x49,0xa3,0xb7,0xf9,0x08,0xb3,0x68,0x8f,0x63,0xb7,0xf1,0x4f,0x65,0x1a,0xac,0xd7,0x15,0x94,0x0b,0xdb,0xe2,0x7a,0x08,0x09,0xaa,0xc1,0x42,0xf4,0x7a,0xb0,0xe1,0xe4,0x4f,0xa4,0x90,0xba,0x87,0xce,0x53,0x92,0xf3,0x3a,0x89,0x15,0x39,0xca,0xf1,0xef,0x4c,0x36,0x7c,0xae,0x54,0x50,0x0c,},\"\\xc9\\x42\\xfa\\x7a\\xc6\\xb2\\x3a\\xb7\\xff\\x61\\x2f\\xdc\\x8e\\x68\\xef\\x39\"},\n{{0xf8,0x14,0x8f,0x75,0x06,0xb7,0x75,0xef,0x46,0xfd,0xc8,0xe8,0xc7,0x56,0x51,0x68,0x12,0xd4,0x7d,0x6c,0xfb,0xfa,0x31,0x8c,0x27,0xc9,0xa2,0x26,0x41,0xe5,0x6f,0x17,},{0x04,0x45,0xe4,0x56,0xda,0xcc,0x7d,0x5b,0x0b,0xbe,0xd2,0x3c,0x82,0x00,0xcd,0xb7,0x4b,0xdc,0xb0,0x3e,0x4c,0x7b,0x73,0xf0,0xa2,0xb9,0xb4,0x6e,0xac,0x5d,0x43,0x72,},{0x36,0x53,0xcc,0xb2,0x12,0x19,0x20,0x2b,0x84,0x36,0xfb,0x41,0xa3,0x2b,0xa2,0x61,0x8c,0x4a,0x13,0x34,0x31,0xe6,0xe6,0x34,0x63,0xce,0xb3,0xb6,0x10,0x6c,0x4d,0x56,0xe1,0xd2,0xba,0x16,0x5b,0xa7,0x6e,0xaa,0xd3,0xdc,0x39,0xbf,0xfb,0x13,0x0f,0x1d,0xe3,0xd8,0xe6,0x42,0x7d,0xb5,0xb7,0x19,0x38,0xdb,0x4e,0x27,0x2b,0xc3,0xe2,0x0b,},\"\\x73\\x68\\x72\\x4a\\x5b\\x0e\\xfb\\x57\\xd2\\x8d\\x97\\x62\\x2d\\xbd\\xe7\\x25\\xaf\"},\n{{0x77,0xf8,0x86,0x91,0xc4,0xef,0xf2,0x3e,0xbb,0x73,0x64,0x94,0x70,0x92,0x95,0x1a,0x5f,0xf3,0xf1,0x07,0x85,0xb4,0x17,0xe9,0x18,0x82,0x3a,0x55,0x2d,0xab,0x7c,0x75,},{0x74,0xd2,0x91,0x27,0xf1,0x99,0xd8,0x6a,0x86,0x76,0xae,0xc3,0x3b,0x4c,0xe3,0xf2,0x25,0xcc,0xb1,0x91,0xf5,0x2c,0x19,0x1c,0xcd,0x1e,0x8c,0xca,0x65,0x21,0x3a,0x6b,},{0xfb,0xe9,0x29,0xd7,0x43,0xa0,0x3c,0x17,0x91,0x05,0x75,0x49,0x2f,0x30,0x92,0xee,0x2a,0x2b,0xf1,0x4a,0x60,0xa3,0xfc,0xac,0xec,0x74,0xa5,0x8c,0x73,0x34,0x51,0x0f,0xc2,0x62,0xdb,0x58,0x27,0x91,0x32,0x2d,0x6c,0x8c,0x41,0xf1,0x70,0x0a,0xdb,0x80,0x02,0x7e,0xca,0xbc,0x14,0x27,0x0b,0x70,0x34,0x44,0xae,0x3e,0xe7,0x62,0x3e,0x0a,},\"\\xbd\\x8e\\x05\\x03\\x3f\\x3a\\x8b\\xcd\\xcb\\xf4\\xbe\\xce\\xb7\\x09\\x01\\xc8\\x2e\\x31\"},\n{{0xab,0x6f,0x7a,0xee,0x6a,0x08,0x37,0xb3,0x34,0xba,0x5e,0xb1,0xb2,0xad,0x7f,0xce,0xcf,0xab,0x7e,0x32,0x3c,0xab,0x18,0x7f,0xe2,0xe0,0xa9,0x5d,0x80,0xef,0xf1,0x32,},{0x5b,0x96,0xdc,0xa4,0x97,0x87,0x5b,0xf9,0x66,0x4c,0x5e,0x75,0xfa,0xcf,0x3f,0x9b,0xc5,0x4b,0xae,0x91,0x3d,0x66,0xca,0x15,0xee,0x85,0xf1,0x49,0x1c,0xa2,0x4d,0x2c,},{0x73,0xbc,0xa6,0x4e,0x9d,0xd0,0xdb,0x88,0x13,0x8e,0xed,0xfa,0xfc,0xea,0x8f,0x54,0x36,0xcf,0xb7,0x4b,0xfb,0x0e,0x77,0x33,0xcf,0x34,0x9b,0xaa,0x0c,0x49,0x77,0x5c,0x56,0xd5,0x93,0x4e,0x1d,0x38,0xe3,0x6f,0x39,0xb7,0xc5,0xbe,0xb0,0xa8,0x36,0x51,0x0c,0x45,0x12,0x6f,0x8e,0xc4,0xb6,0x81,0x05,0x19,0x90,0x5b,0x0c,0xa0,0x7c,0x09,},\"\\x81\\x71\\x45\\x6f\\x8b\\x90\\x71\\x89\\xb1\\xd7\\x79\\xe2\\x6b\\xc5\\xaf\\xbb\\x08\\xc6\\x7a\"},\n{{0x8d,0x13,0x5d,0xe7,0xc8,0x41,0x1b,0xbd,0xbd,0x1b,0x31,0xe5,0xdc,0x67,0x8f,0x2a,0xc7,0x10,0x9e,0x79,0x2b,0x60,0xf3,0x8c,0xd2,0x49,0x36,0xe8,0xa8,0x98,0xc3,0x2d,},{0x1c,0xa2,0x81,0x93,0x85,0x29,0x89,0x65,0x35,0xa7,0x71,0x4e,0x35,0x84,0x08,0x5b,0x86,0xef,0x9f,0xec,0x72,0x3f,0x42,0x81,0x9f,0xc8,0xdd,0x5d,0x8c,0x00,0x81,0x7f,},{0xa1,0xad,0xc2,0xbc,0x6a,0x2d,0x98,0x06,0x62,0x67,0x7e,0x7f,0xdf,0xf6,0x42,0x4d,0xe7,0xdb,0xa5,0x0f,0x57,0x95,0xca,0x90,0xfd,0xf3,0xe9,0x6e,0x25,0x6f,0x32,0x85,0xca,0xc7,0x1d,0x33,0x60,0x48,0x2e,0x99,0x3d,0x02,0x94,0xba,0x4e,0xc7,0x44,0x0c,0x61,0xaf,0xfd,0xf3,0x5f,0xe8,0x3e,0x6e,0x04,0x26,0x39,0x37,0xdb,0x93,0xf1,0x05,},\"\\x8b\\xa6\\xa4\\xc9\\xa1\\x5a\\x24\\x4a\\x9c\\x26\\xbb\\x2a\\x59\\xb1\\x02\\x6f\\x21\\x34\\x8b\\x49\"},\n{{0x0e,0x76,0x5d,0x72,0x0e,0x70,0x5f,0x93,0x66,0xc1,0xab,0x8c,0x3f,0xa8,0x4c,0x9a,0x44,0x37,0x0c,0x06,0x96,0x9f,0x80,0x32,0x96,0x88,0x4b,0x28,0x46,0xa6,0x52,0xa4,},{0x7f,0xae,0x45,0xdd,0x0a,0x05,0x97,0x10,0x26,0xd4,0x10,0xbc,0x49,0x7a,0xf5,0xbe,0x7d,0x08,0x27,0xa8,0x2a,0x14,0x5c,0x20,0x3f,0x62,0x5d,0xfc,0xb8,0xb0,0x3b,0xa8,},{0xbb,0x61,0xcf,0x84,0xde,0x61,0x86,0x22,0x07,0xc6,0xa4,0x55,0x25,0x8b,0xc4,0xdb,0x4e,0x15,0xee,0xa0,0x31,0x7f,0xf8,0x87,0x18,0xb8,0x82,0xa0,0x6b,0x5c,0xf6,0xec,0x6f,0xd2,0x0c,0x5a,0x26,0x9e,0x5d,0x5c,0x80,0x5b,0xaf,0xbc,0xc5,0x79,0xe2,0x59,0x0a,0xf4,0x14,0xc7,0xc2,0x27,0x27,0x3c,0x10,0x2a,0x10,0x07,0x0c,0xdf,0xe8,0x0f,},\"\\x1d\\x56\\x6a\\x62\\x32\\xbb\\xaa\\xb3\\xe6\\xd8\\x80\\x4b\\xb5\\x18\\xa4\\x98\\xed\\x0f\\x90\\x49\\x86\"},\n{{0xdb,0x36,0xe3,0x26,0xd6,0x76,0xc2,0xd1,0x9c,0xc8,0xfe,0x0c,0x14,0xb7,0x09,0x20,0x2e,0xcf,0xc7,0x61,0xd2,0x70,0x89,0xeb,0x6e,0xa4,0xb1,0xbb,0x02,0x1e,0xcf,0xa7,},{0x48,0x35,0x9b,0x85,0x0d,0x23,0xf0,0x71,0x5d,0x94,0xbb,0x8b,0xb7,0x5e,0x7e,0x14,0x32,0x2e,0xaf,0x14,0xf0,0x6f,0x28,0xa8,0x05,0x40,0x3f,0xbd,0xa0,0x02,0xfc,0x85,},{0xb6,0xdc,0xd0,0x99,0x89,0xdf,0xba,0xc5,0x43,0x22,0xa3,0xce,0x87,0x87,0x6e,0x1d,0x62,0x13,0x4d,0xa9,0x98,0xc7,0x9d,0x24,0xb5,0x0b,0xd7,0xa6,0xa7,0x97,0xd8,0x6a,0x0e,0x14,0xdc,0x9d,0x74,0x91,0xd6,0xc1,0x4a,0x67,0x3c,0x65,0x2c,0xfb,0xec,0x9f,0x96,0x2a,0x38,0xc9,0x45,0xda,0x3b,0x2f,0x08,0x79,0xd0,0xb6,0x8a,0x92,0x13,0x00,},\"\\x1b\\x0a\\xfb\\x0a\\xc4\\xba\\x9a\\xb7\\xb7\\x17\\x2c\\xdd\\xc9\\xeb\\x42\\xbb\\xa1\\xa6\\x4b\\xce\\x47\\xd4\"},\n{{0xc8,0x99,0x55,0xe0,0xf7,0x74,0x1d,0x90,0x5d,0xf0,0x73,0x0b,0x3d,0xc2,0xb0,0xce,0x1a,0x13,0x13,0x4e,0x44,0xfe,0xf3,0xd4,0x0d,0x60,0xc0,0x20,0xef,0x19,0xdf,0x77,},{0xfd,0xb3,0x06,0x73,0x40,0x2f,0xaf,0x1c,0x80,0x33,0x71,0x4f,0x35,0x17,0xe4,0x7c,0xc0,0xf9,0x1f,0xe7,0x0c,0xf3,0x83,0x6d,0x6c,0x23,0x63,0x6e,0x3f,0xd2,0x28,0x7c,},{0x7e,0xf6,0x6e,0x5e,0x86,0xf2,0x36,0x08,0x48,0xe0,0x01,0x4e,0x94,0x88,0x0a,0xe2,0x92,0x0a,0xd8,0xa3,0x18,0x5a,0x46,0xb3,0x5d,0x1e,0x07,0xde,0xa8,0xfa,0x8a,0xe4,0xf6,0xb8,0x43,0xba,0x17,0x4d,0x99,0xfa,0x79,0x86,0x65,0x4a,0x08,0x91,0xc1,0x2a,0x79,0x44,0x55,0x66,0x93,0x75,0xbf,0x92,0xaf,0x4c,0xc2,0x77,0x0b,0x57,0x9e,0x0c,},\"\\x50\\x7c\\x94\\xc8\\x82\\x0d\\x2a\\x57\\x93\\xcb\\xf3\\x44\\x2b\\x3d\\x71\\x93\\x6f\\x35\\xfe\\x3a\\xfe\\xf3\\x16\"},\n{{0x4e,0x62,0x62,0x7f,0xc2,0x21,0x14,0x24,0x78,0xae,0xe7,0xf0,0x07,0x81,0xf8,0x17,0xf6,0x62,0xe3,0xb7,0x5d,0xb2,0x9b,0xb1,0x4a,0xb4,0x7c,0xf8,0xe8,0x41,0x04,0xd6,},{0xb1,0xd3,0x98,0x01,0x89,0x20,0x27,0xd5,0x8a,0x8c,0x64,0x33,0x51,0x63,0x19,0x58,0x93,0xbf,0xc1,0xb6,0x1d,0xbe,0xca,0x32,0x60,0x49,0x7e,0x1f,0x30,0x37,0x11,0x07,},{0x83,0x6a,0xfa,0x76,0x4d,0x9c,0x48,0xaa,0x47,0x70,0xa4,0x38,0x8b,0x65,0x4e,0x97,0xb3,0xc1,0x6f,0x08,0x29,0x67,0xfe,0xbc,0xa2,0x7f,0x2f,0xc4,0x7d,0xdf,0xd9,0x24,0x4b,0x03,0xcf,0xc7,0x29,0x69,0x8a,0xcf,0x51,0x09,0x70,0x43,0x46,0xb6,0x0b,0x23,0x0f,0x25,0x54,0x30,0x08,0x9d,0xdc,0x56,0x91,0x23,0x99,0xd1,0x12,0x2d,0xe7,0x0a,},\"\\xd3\\xd6\\x15\\xa8\\x47\\x2d\\x99\\x62\\xbb\\x70\\xc5\\xb5\\x46\\x6a\\x3d\\x98\\x3a\\x48\\x11\\x04\\x6e\\x2a\\x0e\\xf5\"},\n{{0x6b,0x83,0xd7,0xda,0x89,0x08,0xc3,0xe7,0x20,0x5b,0x39,0x86,0x4b,0x56,0xe5,0xf3,0xe1,0x71,0x96,0xa3,0xfc,0x9c,0x2f,0x58,0x05,0xaa,0xd0,0xf5,0x55,0x4c,0x14,0x2d,},{0xd0,0xc8,0x46,0xf9,0x7f,0xe2,0x85,0x85,0xc0,0xee,0x15,0x90,0x15,0xd6,0x4c,0x56,0x31,0x1c,0x88,0x6e,0xdd,0xcc,0x18,0x5d,0x29,0x6d,0xbb,0x16,0x5d,0x26,0x25,0xd6,},{0x16,0xe4,0x62,0xa2,0x9a,0x6d,0xd4,0x98,0x68,0x5a,0x37,0x18,0xb3,0xee,0xd0,0x0c,0xc1,0x59,0x86,0x01,0xee,0x47,0x82,0x04,0x86,0x03,0x2d,0x6b,0x9a,0xcc,0x9b,0xf8,0x9f,0x57,0x68,0x4e,0x08,0xd8,0xc0,0xf0,0x55,0x89,0xcd,0xa2,0x88,0x2a,0x05,0xdc,0x4c,0x63,0xf9,0xd0,0x43,0x1d,0x65,0x52,0x71,0x08,0x12,0x43,0x30,0x03,0xbc,0x08,},\"\\x6a\\xda\\x80\\xb6\\xfa\\x84\\xf7\\x03\\x49\\x20\\x78\\x9e\\x85\\x36\\xb8\\x2d\\x5e\\x46\\x78\\x05\\x9a\\xed\\x27\\xf7\\x1c\"},\n{{0x19,0xa9,0x1f,0xe2,0x3a,0x4e,0x9e,0x33,0xec,0xc4,0x74,0x87,0x8f,0x57,0xc6,0x4c,0xf1,0x54,0xb3,0x94,0x20,0x34,0x87,0xa7,0x03,0x5e,0x1a,0xd9,0xcd,0x69,0x7b,0x0d,},{0x2b,0xf3,0x2b,0xa1,0x42,0xba,0x46,0x22,0xd8,0xf3,0xe2,0x9e,0xcd,0x85,0xee,0xa0,0x7b,0x9c,0x47,0xbe,0x9d,0x64,0x41,0x2c,0x9b,0x51,0x0b,0x27,0xdd,0x21,0x8b,0x23,},{0x88,0x1f,0x5b,0x8c,0x5a,0x03,0x0d,0xf0,0xf7,0x5b,0x66,0x34,0xb0,0x70,0xdd,0x27,0xbd,0x1e,0xe3,0xc0,0x87,0x38,0xae,0x34,0x93,0x38,0xb3,0xee,0x64,0x69,0xbb,0xf9,0x76,0x0b,0x13,0x57,0x8a,0x23,0x7d,0x51,0x82,0x53,0x5e,0xde,0x12,0x12,0x83,0x02,0x7a,0x90,0xb5,0xf8,0x65,0xd6,0x3a,0x65,0x37,0xdc,0xa0,0x7b,0x44,0x04,0x9a,0x0f,},\"\\x82\\xcb\\x53\\xc4\\xd5\\xa0\\x13\\xba\\xe5\\x07\\x07\\x59\\xec\\x06\\xc3\\xc6\\x95\\x5a\\xb7\\xa4\\x05\\x09\\x58\\xec\\x32\\x8c\"},\n{{0x1d,0x5b,0x8c,0xb6,0x21,0x5c,0x18,0x14,0x16,0x66,0xba,0xee,0xfc,0xf5,0xd6,0x9d,0xad,0x5b,0xea,0x9a,0x34,0x93,0xdd,0xda,0xa3,0x57,0xa4,0x39,0x7a,0x13,0xd4,0xde,},{0x94,0xd2,0x3d,0x97,0x7c,0x33,0xe4,0x9e,0x5e,0x49,0x92,0xc6,0x8f,0x25,0xec,0x99,0xa2,0x7c,0x41,0xce,0x6b,0x91,0xf2,0xbf,0xa0,0xcd,0x82,0x92,0xfe,0x96,0x28,0x35,},{0x3a,0xcd,0x39,0xbe,0xc8,0xc3,0xcd,0x2b,0x44,0x29,0x97,0x22,0xb5,0x85,0x0a,0x04,0x00,0xc1,0x44,0x35,0x90,0xfd,0x48,0x61,0xd5,0x9a,0xae,0x74,0x96,0xac,0xb3,0xdf,0x73,0xfc,0x3f,0xdf,0x79,0x69,0xae,0x5f,0x50,0xba,0x47,0xdd,0xdc,0x43,0x52,0x46,0xe5,0xfd,0x37,0x6f,0x6b,0x89,0x1c,0xd4,0xc2,0xca,0xf5,0xd6,0x14,0xb6,0x17,0x0c,},\"\\xa9\\xa8\\xcb\\xb0\\xad\\x58\\x51\\x24\\xe5\\x22\\xab\\xbf\\xb4\\x05\\x33\\xbd\\xd6\\xf4\\x93\\x47\\xb5\\x5b\\x18\\xe8\\x55\\x8c\\xb0\"},\n{{0x6a,0x91,0xb3,0x22,0x7c,0x47,0x22,0x99,0x08,0x9b,0xdc,0xe9,0x35,0x6e,0x72,0x6a,0x40,0xef,0xd8,0x40,0xf1,0x10,0x02,0x70,0x8b,0x7e,0xe5,0x5b,0x64,0x10,0x5a,0xc2,},{0x9d,0x08,0x4a,0xa8,0xb9,0x7a,0x6b,0x9b,0xaf,0xa4,0x96,0xdb,0xc6,0xf7,0x6f,0x33,0x06,0xa1,0x16,0xc9,0xd9,0x17,0xe6,0x81,0x52,0x0a,0x0f,0x91,0x43,0x69,0x42,0x7e,},{0xf5,0x87,0x54,0x23,0x78,0x1b,0x66,0x21,0x6c,0xb5,0xe8,0x99,0x8d,0xe5,0xd9,0xff,0xc2,0x9d,0x1d,0x67,0x10,0x70,0x54,0xac,0xe3,0x37,0x45,0x03,0xa9,0xc3,0xef,0x81,0x15,0x77,0xf2,0x69,0xde,0x81,0x29,0x67,0x44,0xbd,0x70,0x6f,0x1a,0xc4,0x78,0xca,0xf0,0x9b,0x54,0xcd,0xf8,0x71,0xb3,0xf8,0x02,0xbd,0x57,0xf9,0xa6,0xcb,0x91,0x01,},\"\\x5c\\xb6\\xf9\\xaa\\x59\\xb8\\x0e\\xca\\x14\\xf6\\xa6\\x8f\\xb4\\x0c\\xf0\\x7b\\x79\\x4e\\x75\\x17\\x1f\\xba\\x96\\x26\\x2c\\x1c\\x6a\\xdc\"},\n{{0x93,0xea,0xa8,0x54,0xd7,0x91,0xf0,0x53,0x72,0xce,0x72,0xb9,0x4f,0xc6,0x50,0x3b,0x2f,0xf8,0xae,0x68,0x19,0xe6,0xa2,0x1a,0xfe,0x82,0x5e,0x27,0xad,0xa9,0xe4,0xfb,},{0x16,0xce,0xe8,0xa3,0xf2,0x63,0x18,0x34,0xc8,0x8b,0x67,0x08,0x97,0xff,0x0b,0x08,0xce,0x90,0xcc,0x14,0x7b,0x45,0x93,0xb3,0xf1,0xf4,0x03,0x72,0x7f,0x7e,0x7a,0xd5,},{0xd8,0x34,0x19,0x7c,0x1a,0x30,0x80,0x61,0x4e,0x0a,0x5f,0xa0,0xaa,0xaa,0x80,0x88,0x24,0xf2,0x1c,0x38,0xd6,0x92,0xe6,0xff,0xbd,0x20,0x0f,0x7d,0xfb,0x3c,0x8f,0x44,0x40,0x2a,0x73,0x82,0x18,0x0b,0x98,0xad,0x0a,0xfc,0x8e,0xec,0x1a,0x02,0xac,0xec,0xf3,0xcb,0x7f,0xde,0x62,0x7b,0x9f,0x18,0x11,0x1f,0x26,0x0a,0xb1,0xdb,0x9a,0x07,},\"\\x32\\xfe\\x27\\x99\\x41\\x24\\x20\\x21\\x53\\xb5\\xc7\\x0d\\x38\\x13\\xfd\\xee\\x9c\\x2a\\xa6\\xe7\\xdc\\x74\\x3d\\x4d\\x53\\x5f\\x18\\x40\\xa5\"},\n{{0x94,0x1c,0xac,0x69,0xfb,0x7b,0x18,0x15,0xc5,0x7b,0xb9,0x87,0xc4,0xd6,0xc2,0xad,0x2c,0x35,0xd5,0xf9,0xa3,0x18,0x2a,0x79,0xd4,0xba,0x13,0xea,0xb2,0x53,0xa8,0xad,},{0x23,0xbe,0x32,0x3c,0x56,0x2d,0xfd,0x71,0xce,0x65,0xf5,0xbb,0xa5,0x6a,0x74,0xa3,0xa6,0xdf,0xc3,0x6b,0x57,0x3d,0x2f,0x94,0xf6,0x35,0xc7,0xf9,0xb4,0xfd,0x5a,0x5b,},{0x0f,0x8f,0xad,0x1e,0x6b,0xde,0x77,0x1b,0x4f,0x54,0x20,0xea,0xc7,0x5c,0x37,0x8b,0xae,0x6d,0xb5,0xac,0x66,0x50,0xcd,0x2b,0xc2,0x10,0xc1,0x82,0x3b,0x43,0x2b,0x48,0xe0,0x16,0xb1,0x05,0x95,0x45,0x8f,0xfa,0xb9,0x2f,0x7a,0x89,0x89,0xb2,0x93,0xce,0xb8,0xdf,0xed,0x6c,0x24,0x3a,0x20,0x38,0xfc,0x06,0x65,0x2a,0xaa,0xf1,0x6f,0x02,},\"\\xbb\\x31\\x72\\x79\\x57\\x10\\xfe\\x00\\x05\\x4d\\x3b\\x5d\\xfe\\xf8\\xa1\\x16\\x23\\x58\\x2d\\xa6\\x8b\\xf8\\xe4\\x6d\\x72\\xd2\\x7c\\xec\\xe2\\xaa\"},\n{{0x1a,0xcd,0xbb,0x79,0x3b,0x03,0x84,0x93,0x46,0x27,0x47,0x0d,0x79,0x5c,0x3d,0x1d,0xd4,0xd7,0x9c,0xea,0x59,0xef,0x98,0x3f,0x29,0x5b,0x9b,0x59,0x17,0x9c,0xbb,0x28,},{0x3f,0x60,0xc7,0x54,0x1a,0xfa,0x76,0xc0,0x19,0xcf,0x5a,0xa8,0x2d,0xcd,0xb0,0x88,0xed,0x9e,0x4e,0xd9,0x78,0x05,0x14,0xae,0xfb,0x37,0x9d,0xab,0xc8,0x44,0xf3,0x1a,},{0xbe,0x71,0xef,0x48,0x06,0xcb,0x04,0x1d,0x88,0x5e,0xff,0xd9,0xe6,0xb0,0xfb,0xb7,0x3d,0x65,0xd7,0xcd,0xec,0x47,0xa8,0x9c,0x8a,0x99,0x48,0x92,0xf4,0xe5,0x5a,0x56,0x8c,0x4c,0xc7,0x8d,0x61,0xf9,0x01,0xe8,0x0d,0xbb,0x62,0x8b,0x86,0xa2,0x3c,0xcd,0x59,0x4e,0x71,0x2b,0x57,0xfa,0x94,0xc2,0xd6,0x7e,0xc2,0x66,0x34,0x87,0x85,0x07,},\"\\x7c\\xf3\\x4f\\x75\\xc3\\xda\\xc9\\xa8\\x04\\xd0\\xfc\\xd0\\x9e\\xba\\x9b\\x29\\xc9\\x48\\x4e\\x8a\\x01\\x8f\\xa9\\xe0\\x73\\x04\\x2d\\xf8\\x8e\\x3c\\x56\"},\n{{0x8e,0xd7,0xa7,0x97,0xb9,0xce,0xa8,0xa8,0x37,0x0d,0x41,0x91,0x36,0xbc,0xdf,0x68,0x3b,0x75,0x9d,0x2e,0x3c,0x69,0x47,0xf1,0x7e,0x13,0xe2,0x48,0x5a,0xa9,0xd4,0x20,},{0xb4,0x9f,0x3a,0x78,0xb1,0xc6,0xa7,0xfc,0xa8,0xf3,0x46,0x6f,0x33,0xbc,0x0e,0x92,0x9f,0x01,0xfb,0xa0,0x43,0x06,0xc2,0xa7,0x46,0x5f,0x46,0xc3,0x75,0x93,0x16,0xd9,},{0x04,0x26,0x6c,0x03,0x3b,0x91,0xc1,0x32,0x2c,0xeb,0x34,0x46,0xc9,0x01,0xff,0xcf,0x3c,0xc4,0x0c,0x40,0x34,0xe8,0x87,0xc9,0x59,0x7c,0xa1,0x89,0x3b,0xa7,0x33,0x0b,0xec,0xbb,0xd8,0xb4,0x81,0x42,0xef,0x35,0xc0,0x12,0xc6,0xba,0x51,0xa6,0x6d,0xf9,0x30,0x8c,0xb6,0x26,0x8a,0xd6,0xb1,0xe4,0xb0,0x3e,0x70,0x10,0x24,0x95,0x79,0x0b,},\"\\xa7\\x50\\xc2\\x32\\x93\\x3d\\xc1\\x4b\\x11\\x84\\xd8\\x6d\\x8b\\x4c\\xe7\\x2e\\x16\\xd6\\x97\\x44\\xba\\x69\\x81\\x8b\\x6a\\xc3\\x3b\\x1d\\x82\\x3b\\xb2\\xc3\"},\n{{0xf2,0xab,0x39,0x6f,0xe8,0x90,0x6e,0x3e,0x56,0x33,0xe9,0x9c,0xab,0xcd,0x5b,0x09,0xdf,0x08,0x59,0xb5,0x16,0x23,0x0b,0x1e,0x04,0x50,0xb5,0x80,0xb6,0x5f,0x61,0x6c,},{0x8e,0xa0,0x74,0x24,0x51,0x59,0xa1,0x16,0xaa,0x71,0x22,0xa2,0x5e,0xc1,0x6b,0x89,0x1d,0x62,0x5a,0x68,0xf3,0x36,0x60,0x42,0x39,0x08,0xf6,0xbd,0xc4,0x4f,0x8c,0x1b,},{0xa0,0x6a,0x23,0xd9,0x82,0xd8,0x1a,0xb8,0x83,0xaa,0xe2,0x30,0xad,0xbc,0x36,0x8a,0x6a,0x99,0x77,0xf0,0x03,0xce,0xbb,0x00,0xd4,0xc2,0xe4,0x01,0x84,0x90,0x19,0x1a,0x84,0xd3,0xa2,0x82,0xfd,0xbf,0xb2,0xfc,0x88,0x04,0x6e,0x62,0xde,0x43,0xe1,0x5f,0xb5,0x75,0x33,0x6b,0x3c,0x8b,0x77,0xd1,0x9c,0xe6,0xa0,0x09,0xce,0x51,0xf5,0x0c,},\"\\x5a\\x44\\xe3\\x4b\\x74\\x6c\\x5f\\xd1\\x89\\x8d\\x55\\x2a\\xb3\\x54\\xd2\\x8f\\xb4\\x71\\x38\\x56\\xd7\\x69\\x7d\\xd6\\x3e\\xb9\\xbd\\x6b\\x99\\xc2\\x80\\xe1\\x87\"},\n{{0x55,0x0a,0x41,0xc0,0x13,0xf7,0x9b,0xab,0x8f,0x06,0xe4,0x3a,0xd1,0x83,0x6d,0x51,0x31,0x27,0x36,0xa9,0x71,0x38,0x06,0xfa,0xfe,0x66,0x45,0x21,0x9e,0xaa,0x1f,0x9d,},{0xaf,0x6b,0x71,0x45,0x47,0x4d,0xc9,0x95,0x4b,0x9a,0xf9,0x3a,0x9c,0xdb,0x34,0x44,0x9d,0x5b,0x7c,0x65,0x1c,0x82,0x4d,0x24,0xe2,0x30,0xb9,0x00,0x33,0xce,0x59,0xc0,},{0x16,0xdc,0x1e,0x2b,0x9f,0xa9,0x09,0xee,0xfd,0xc2,0x77,0xba,0x16,0xeb,0xe2,0x07,0xb8,0xda,0x5e,0x91,0x14,0x3c,0xde,0x78,0xc5,0x04,0x7a,0x89,0xf6,0x81,0xc3,0x3c,0x4e,0x4e,0x34,0x28,0xd5,0xc9,0x28,0x09,0x59,0x03,0xa8,0x11,0xec,0x00,0x2d,0x52,0xa3,0x9e,0xd7,0xf8,0xb3,0xfe,0x19,0x27,0x20,0x0c,0x6d,0xd0,0xb9,0xab,0x3e,0x04,},\"\\x8b\\xc4\\x18\\x5e\\x50\\xe5\\x7d\\x5f\\x87\\xf4\\x75\\x15\\xfe\\x2b\\x18\\x37\\xd5\\x85\\xf0\\xaa\\xe9\\xe1\\xca\\x38\\x3b\\x3e\\xc9\\x08\\x88\\x4b\\xb9\\x00\\xff\\x27\"},\n{{0x19,0xac,0x3e,0x27,0x24,0x38,0xc7,0x2d,0xdf,0x7b,0x88,0x19,0x64,0x86,0x7c,0xb3,0xb3,0x1f,0xf4,0xc7,0x93,0xbb,0x7e,0xa1,0x54,0x61,0x3c,0x1d,0xb0,0x68,0xcb,0x7e,},{0xf8,0x5b,0x80,0xe0,0x50,0xa1,0xb9,0x62,0x0d,0xb1,0x38,0xbf,0xc9,0xe1,0x00,0x32,0x7e,0x25,0xc2,0x57,0xc5,0x92,0x17,0xb6,0x01,0xf1,0xf6,0xac,0x9a,0x41,0x3d,0x3f,},{0xea,0x85,0x5d,0x78,0x1c,0xbe,0xa4,0x68,0x2e,0x35,0x01,0x73,0xcb,0x89,0xe8,0x61,0x9c,0xcf,0xdd,0xb9,0x7c,0xdc,0xe1,0x6f,0x9a,0x2f,0x6f,0x68,0x92,0xf4,0x6d,0xbe,0x68,0xe0,0x4b,0x12,0xb8,0xd8,0x86,0x89,0xa7,0xa3,0x16,0x70,0xcd,0xff,0x40,0x9a,0xf9,0x8a,0x93,0xb4,0x9a,0x34,0x53,0x7b,0x6a,0xa0,0x09,0xd2,0xeb,0x8b,0x47,0x01,},\"\\x95\\x87\\x2d\\x5f\\x78\\x9f\\x95\\x48\\x4e\\x30\\xcb\\xb0\\xe1\\x14\\x02\\x89\\x53\\xb1\\x6f\\x5c\\x6a\\x8d\\x9f\\x65\\xc0\\x03\\xa8\\x35\\x43\\xbe\\xaa\\x46\\xb3\\x86\\x45\"},\n{{0xca,0x26,0x7d,0xe9,0x6c,0x93,0xc2,0x38,0xfa,0xfb,0x12,0x79,0x81,0x20,0x59,0xab,0x93,0xac,0x03,0x05,0x96,0x57,0xfd,0x99,0x4f,0x8f,0xa5,0xa0,0x92,0x39,0xc8,0x21,},{0x01,0x73,0x70,0xc8,0x79,0x09,0x0a,0x81,0xc7,0xf2,0x72,0xc2,0xfc,0x80,0xe3,0xaa,0xc2,0xbc,0x60,0x3f,0xcb,0x37,0x9a,0xfc,0x98,0x69,0x11,0x60,0xab,0x74,0x5b,0x26,},{0xac,0x95,0x7f,0x82,0x33,0x5a,0xa7,0x14,0x1e,0x96,0xb5,0x9d,0x63,0xe3,0xcc,0xee,0x95,0xc3,0xa2,0xc4,0x7d,0x02,0x65,0x40,0xc2,0xaf,0x42,0xdc,0x95,0x33,0xd5,0xfd,0x81,0x82,0x7d,0x16,0x79,0xad,0x18,0x7a,0xea,0xf3,0x78,0x34,0x91,0x5e,0x75,0xb1,0x47,0xa9,0x28,0x68,0x06,0xc8,0x01,0x75,0x16,0xba,0x43,0xdd,0x05,0x1a,0x5e,0x0c,},\"\\xe0\\x5f\\x71\\xe4\\xe4\\x9a\\x72\\xec\\x55\\x0c\\x44\\xa3\\xb8\\x5a\\xca\\x8f\\x20\\xff\\x26\\xc3\\xee\\x94\\xa8\\x0f\\x1b\\x43\\x1c\\x7d\\x15\\x4e\\xc9\\x60\\x3e\\xe0\\x25\\x31\"},\n{{0x3d,0xff,0x5e,0x89,0x94,0x75,0xe7,0xe9,0x1d,0xd2,0x61,0x32,0x2f,0xab,0x09,0x98,0x0c,0x52,0x97,0x0d,0xe1,0xda,0x6e,0x2e,0x20,0x16,0x60,0xcc,0x4f,0xce,0x70,0x32,},{0xf3,0x01,0x62,0xba,0xc9,0x84,0x47,0xc4,0x04,0x2f,0xac,0x05,0xda,0x44,0x80,0x34,0x62,0x9b,0xe2,0xc6,0xa5,0x8d,0x30,0xdf,0xd5,0x78,0xba,0x9f,0xb5,0xe3,0x93,0x0b,},{0x5e,0xfe,0x7a,0x92,0xff,0x96,0x23,0x08,0x9b,0x3e,0x3b,0x78,0xf3,0x52,0x11,0x53,0x66,0xe2,0x6b,0xa3,0xfb,0x1a,0x41,0x62,0x09,0xbc,0x02,0x9e,0x9c,0xad,0xcc,0xd9,0xf4,0xaf,0xfa,0x33,0x35,0x55,0xa8,0xf3,0xa3,0x5a,0x9d,0x0f,0x7c,0x34,0xb2,0x92,0xca,0xe7,0x7e,0xc9,0x6f,0xa3,0xad,0xfc,0xaa,0xde,0xe2,0xd9,0xce,0xd8,0xf8,0x05,},\"\\x93\\x8f\\x0e\\x77\\x62\\x1b\\xf3\\xea\\x52\\xc7\\xc4\\x91\\x1c\\x51\\x57\\xc2\\xd8\\xa2\\xa8\\x58\\x09\\x3e\\xf1\\x6a\\xa9\\xb1\\x07\\xe6\\x9d\\x98\\x03\\x7b\\xa1\\x39\\xa3\\xc3\\x82\"},\n{{0x9a,0x6b,0x84,0x78,0x64,0xe7,0x0c,0xfe,0x8b,0xa6,0xab,0x22,0xfa,0x0c,0xa3,0x08,0xc0,0xcc,0x8b,0xec,0x71,0x41,0xfb,0xca,0xa3,0xb8,0x1f,0x5d,0x1e,0x1c,0xfc,0xfc,},{0x34,0xad,0x0f,0xbd,0xb2,0x56,0x65,0x07,0xa8,0x1c,0x2b,0x1f,0x8a,0xa8,0xf5,0x3d,0xcc,0xaa,0x64,0xcc,0x87,0xad,0xa9,0x1b,0x90,0x3e,0x90,0x0d,0x07,0xee,0xe9,0x30,},{0x2a,0xb2,0x55,0x16,0x9c,0x48,0x9c,0x54,0xc7,0x32,0x23,0x2e,0x37,0xc8,0x73,0x49,0xd4,0x86,0xb1,0xeb,0xa2,0x05,0x09,0xdb,0xab,0xe7,0xfe,0xd3,0x29,0xef,0x08,0xfd,0x75,0xba,0x1c,0xd1,0x45,0xe6,0x7b,0x2e,0xa2,0x6c,0xb5,0xcc,0x51,0xca,0xb3,0x43,0xee,0xb0,0x85,0xfe,0x1f,0xd7,0xb0,0xec,0x4c,0x6a,0xfc,0xd9,0xb9,0x79,0xf9,0x05,},\"\\x83\\x83\\x67\\x47\\x11\\x83\\xc7\\x1f\\x7e\\x71\\x77\\x24\\xf8\\x9d\\x40\\x1c\\x3a\\xd9\\x86\\x3f\\xd9\\xcc\\x7a\\xa3\\xcf\\x33\\xd3\\xc5\\x29\\x86\\x0c\\xb5\\x81\\xf3\\x09\\x3d\\x87\\xda\"},\n{{0x57,0x5b,0xe0,0x7a,0xfc,0xa5,0xd0,0x63,0xc2,0x38,0xcd,0x9b,0x80,0x28,0x77,0x2c,0xc4,0x9c,0xda,0x34,0x47,0x14,0x32,0xa2,0xe1,0x66,0xe0,0x96,0xe2,0x21,0x9e,0xfc,},{0x94,0xe5,0xeb,0x4d,0x50,0x24,0xf4,0x9d,0x7e,0xbf,0x79,0x81,0x7c,0x8d,0xe1,0x14,0x97,0xdc,0x2b,0x55,0x62,0x2a,0x51,0xae,0x12,0x3f,0xfc,0x74,0x9d,0xbb,0x16,0xe0,},{0x58,0x27,0x1d,0x44,0x23,0x6f,0x3b,0x98,0xc5,0x8f,0xd7,0xae,0x0d,0x2f,0x49,0xef,0x2b,0x6e,0x3a,0xff,0xdb,0x22,0x5a,0xa3,0xba,0x55,0x5f,0x0e,0x11,0xcc,0x53,0xc2,0x3a,0xd1,0x9b,0xaf,0x24,0x34,0x65,0x90,0xd0,0x5d,0x7d,0x53,0x90,0x58,0x20,0x82,0xcf,0x94,0xd3,0x9c,0xad,0x65,0x30,0xab,0x93,0xd1,0x3e,0xfb,0x39,0x27,0x95,0x06,},\"\\x33\\xe5\\x91\\x8b\\x66\\xd3\\x3d\\x55\\xfe\\x71\\x7c\\xa3\\x43\\x83\\xea\\xe7\\x8f\\x0a\\xf8\\x28\\x89\\xca\\xf6\\x69\\x6e\\x1a\\xc9\\xd9\\x5d\\x1f\\xfb\\x32\\xcb\\xa7\\x55\\xf9\\xe3\\x50\\x3e\"},\n{{0x15,0xff,0xb4,0x55,0x14,0xd4,0x34,0x44,0xd6,0x1f,0xcb,0x10,0x5e,0x30,0xe1,0x35,0xfd,0x26,0x85,0x23,0xdd,0xa2,0x0b,0x82,0x75,0x8b,0x17,0x94,0x23,0x11,0x04,0x41,},{0x17,0x72,0xc5,0xab,0xc2,0xd2,0x3f,0xd2,0xf9,0xd1,0xc3,0x25,0x7b,0xe7,0xbc,0x3c,0x1c,0xd7,0x9c,0xee,0x40,0x84,0x4b,0x74,0x9b,0x3a,0x77,0x43,0xd2,0xf9,0x64,0xb8,},{0x68,0x28,0xcd,0x76,0x24,0xe7,0x93,0xb8,0xa4,0xce,0xb9,0x6d,0x3c,0x2a,0x97,0x5b,0xf7,0x73,0xe5,0xff,0x66,0x45,0xf3,0x53,0x61,0x40,0x58,0x62,0x1e,0x58,0x83,0x52,0x89,0xe7,0xf3,0x1f,0x42,0xdf,0xe6,0xaf,0x6d,0x73,0x6f,0x26,0x44,0x51,0x1e,0x32,0x0c,0x0f,0xa6,0x98,0x58,0x2a,0x79,0x77,0x8d,0x18,0x73,0x0e,0xd3,0xe8,0xcb,0x08,},\"\\xda\\x9c\\x55\\x59\\xd0\\xea\\x51\\xd2\\x55\\xb6\\xbd\\x9d\\x76\\x38\\xb8\\x76\\x47\\x2f\\x94\\x2b\\x33\\x0f\\xc0\\xe2\\xb3\\x0a\\xea\\x68\\xd7\\x73\\x68\\xfc\\xe4\\x94\\x82\\x72\\x99\\x1d\\x25\\x7e\"},\n{{0xfe,0x05,0x68,0x64,0x29,0x43,0xb2,0xe1,0xaf,0xbf,0xd1,0xf1,0x0f,0xe8,0xdf,0x87,0xa4,0x23,0x6b,0xea,0x40,0xdc,0xe7,0x42,0x07,0x2c,0xb2,0x18,0x86,0xee,0xc1,0xfa,},{0x29,0x9e,0xbd,0x1f,0x13,0x17,0x7d,0xbd,0xb6,0x6a,0x91,0x2b,0xbf,0x71,0x20,0x38,0xfd,0xf7,0x3b,0x06,0xc3,0xac,0x02,0x0c,0x7b,0x19,0x12,0x67,0x55,0xd4,0x7f,0x61,},{0xd5,0x9e,0x6d,0xfc,0xc6,0xd7,0xe3,0xe2,0xc5,0x8d,0xec,0x81,0xe9,0x85,0xd2,0x45,0xe6,0x81,0xac,0xf6,0x59,0x4a,0x23,0xc5,0x92,0x14,0xf7,0xbe,0xd8,0x01,0x5d,0x81,0x3c,0x76,0x82,0xb6,0x0b,0x35,0x83,0x44,0x03,0x11,0xe7,0x2a,0x86,0x65,0xba,0x2c,0x96,0xde,0xc2,0x3c,0xe8,0x26,0xe1,0x60,0x12,0x7e,0x18,0x13,0x2b,0x03,0x04,0x04,},\"\\xc5\\x9d\\x08\\x62\\xec\\x1c\\x97\\x46\\xab\\xcc\\x3c\\xf8\\x3c\\x9e\\xeb\\xa2\\xc7\\x08\\x2a\\x03\\x6a\\x8c\\xb5\\x7c\\xe4\\x87\\xe7\\x63\\x49\\x27\\x96\\xd4\\x7e\\x6e\\x06\\x3a\\x0c\\x1f\\xec\\xcc\\x2d\"},\n{{0x5e,0xcb,0x16,0xc2,0xdf,0x27,0xc8,0xcf,0x58,0xe4,0x36,0xa9,0xd3,0xaf,0xfb,0xd5,0x8e,0x95,0x38,0xa9,0x26,0x59,0xa0,0xf9,0x7c,0x4c,0x4f,0x99,0x46,0x35,0xa8,0xca,},{0xda,0x76,0x8b,0x20,0xc4,0x37,0xdd,0x3a,0xa5,0xf8,0x4b,0xb6,0xa0,0x77,0xff,0xa3,0x4a,0xb6,0x85,0x01,0xc5,0x35,0x2b,0x5c,0xc3,0xfd,0xce,0x7f,0xe6,0xc2,0x39,0x8d,},{0x1c,0x72,0x3a,0x20,0xc6,0x77,0x24,0x26,0xa6,0x70,0xe4,0xd5,0xc4,0xa9,0x7c,0x6e,0xbe,0x91,0x47,0xf7,0x1b,0xb0,0xa4,0x15,0x63,0x1e,0x44,0x40,0x6e,0x29,0x03,0x22,0xe4,0xca,0x97,0x7d,0x34,0x8f,0xe7,0x85,0x6a,0x8e,0xdc,0x23,0x5d,0x0f,0xe9,0x5f,0x7e,0xd9,0x1a,0xef,0xdd,0xf2,0x8a,0x77,0xe2,0xc7,0xdb,0xfd,0x8f,0x55,0x2f,0x0a,},\"\\x56\\xf1\\x32\\x9d\\x9a\\x6b\\xe2\\x5a\\x61\\x59\\xc7\\x2f\\x12\\x68\\x8d\\xc8\\x31\\x4e\\x85\\xdd\\x9e\\x7e\\x4d\\xc0\\x5b\\xbe\\xcb\\x77\\x29\\xe0\\x23\\xc8\\x6f\\x8e\\x09\\x37\\x35\\x3f\\x27\\xc7\\xed\\xe9\"},\n{{0xd5,0x99,0xd6,0x37,0xb3,0xc3,0x0a,0x82,0xa9,0x98,0x4e,0x2f,0x75,0x84,0x97,0xd1,0x44,0xde,0x6f,0x06,0xb9,0xfb,0xa0,0x4d,0xd4,0x0f,0xd9,0x49,0x03,0x9d,0x7c,0x84,},{0x67,0x91,0xd8,0xce,0x50,0xa4,0x46,0x89,0xfc,0x17,0x87,0x27,0xc5,0xc3,0xa1,0xc9,0x59,0xfb,0xee,0xd7,0x4e,0xf7,0xd8,0xe7,0xbd,0x3c,0x1a,0xb4,0xda,0x31,0xc5,0x1f,},{0xeb,0xf1,0x0d,0x9a,0xc7,0xc9,0x61,0x08,0x14,0x0e,0x7d,0xef,0x6f,0xe9,0x53,0x3d,0x72,0x76,0x46,0xff,0x5b,0x3a,0xf2,0x73,0xc1,0xdf,0x95,0x76,0x2a,0x66,0xf3,0x2b,0x65,0xa0,0x96,0x34,0xd0,0x13,0xf5,0x4b,0x5d,0xd6,0x01,0x1f,0x91,0xbc,0x33,0x6c,0xa8,0xb3,0x55,0xce,0x33,0xf8,0xcf,0xbe,0xc2,0x53,0x5a,0x4c,0x42,0x7f,0x82,0x05,},\"\\xa7\\xc0\\x4e\\x8b\\xa7\\x5d\\x0a\\x03\\xd8\\xb1\\x66\\xad\\x7a\\x1d\\x77\\xe1\\xb9\\x1c\\x7a\\xaf\\x7b\\xef\\xdd\\x99\\x31\\x1f\\xc3\\xc5\\x4a\\x68\\x4d\\xdd\\x97\\x1d\\x5b\\x32\\x11\\xc3\\xee\\xaf\\xf1\\xe5\\x4e\"},\n{{0x30,0xab,0x82,0x32,0xfa,0x70,0x18,0xf0,0xce,0x6c,0x39,0xbd,0x8f,0x78,0x2f,0xe2,0xe1,0x59,0x75,0x8b,0xb0,0xf2,0xf4,0x38,0x6c,0x7f,0x28,0xcf,0xd2,0xc8,0x58,0x98,},{0xec,0xfb,0x6a,0x2b,0xd4,0x2f,0x31,0xb6,0x12,0x50,0xba,0x5d,0xe7,0xe4,0x6b,0x47,0x19,0xaf,0xdf,0xbc,0x66,0x0d,0xb7,0x1a,0x7b,0xd1,0xdf,0x7b,0x0a,0x3a,0xbe,0x37,},{0x9a,0xf8,0x85,0x34,0x4c,0xc7,0x23,0x94,0x98,0xf7,0x12,0xdf,0x80,0xbc,0x01,0xb8,0x06,0x38,0x29,0x1e,0xd4,0xa1,0xd2,0x8b,0xaa,0x55,0x45,0x01,0x7a,0x72,0xe2,0xf6,0x56,0x49,0xcc,0xf9,0x60,0x3d,0xa6,0xeb,0x5b,0xfa,0xb9,0xf5,0x54,0x3a,0x6c,0xa4,0xa7,0xaf,0x38,0x66,0x15,0x3c,0x76,0xbf,0x66,0xbf,0x95,0xde,0xf6,0x15,0xb0,0x0c,},\"\\x63\\xb8\\x0b\\x79\\x56\\xac\\xbe\\xcf\\x0c\\x35\\xe9\\xab\\x06\\xb9\\x14\\xb0\\xc7\\x01\\x4f\\xe1\\xa4\\xbb\\xc0\\x21\\x72\\x40\\xc1\\xa3\\x30\\x95\\xd7\\x07\\x95\\x3e\\xd7\\x7b\\x15\\xd2\\x11\\xad\\xaf\\x9b\\x97\\xdc\"},\n{{0x0d,0xdc,0xdc,0x87,0x2c,0x7b,0x74,0x8d,0x40,0xef,0xe9,0x6c,0x28,0x81,0xae,0x18,0x9d,0x87,0xf5,0x61,0x48,0xed,0x8a,0xf3,0xeb,0xbb,0xc8,0x03,0x24,0xe3,0x8b,0xdd,},{0x58,0x8d,0xda,0xdc,0xbc,0xed,0xf4,0x0d,0xf0,0xe9,0x69,0x7d,0x8b,0xb2,0x77,0xc7,0xbb,0x14,0x98,0xfa,0x1d,0x26,0xce,0x0a,0x83,0x5a,0x76,0x0b,0x92,0xca,0x7c,0x85,},{0xc1,0x79,0xc0,0x94,0x56,0xe2,0x35,0xfe,0x24,0x10,0x5a,0xfa,0x6e,0x8e,0xc0,0x46,0x37,0xf8,0xf9,0x43,0x81,0x7c,0xd0,0x98,0xba,0x95,0x38,0x7f,0x96,0x53,0xb2,0xad,0xd1,0x81,0xa3,0x14,0x47,0xd9,0x2d,0x1a,0x1d,0xdf,0x1c,0xeb,0x0d,0xb6,0x21,0x18,0xde,0x9d,0xff,0xb7,0xdc,0xd2,0x42,0x40,0x57,0xcb,0xdf,0xf5,0xd4,0x1d,0x04,0x03,},\"\\x65\\x64\\x1c\\xd4\\x02\\xad\\xd8\\xbf\\x3d\\x1d\\x67\\xdb\\xeb\\x6d\\x41\\xde\\xbf\\xbe\\xf6\\x7e\\x43\\x17\\xc3\\x5b\\x0a\\x6d\\x5b\\xbb\\xae\\x0e\\x03\\x4d\\xe7\\xd6\\x70\\xba\\x14\\x13\\xd0\\x56\\xf2\\xd6\\xf1\\xde\\x12\"},\n{{0x89,0xf0,0xd6,0x82,0x99,0xba,0x0a,0x5a,0x83,0xf2,0x48,0xae,0x0c,0x16,0x9f,0x8e,0x38,0x49,0xa9,0xb4,0x7b,0xd4,0x54,0x98,0x84,0x30,0x5c,0x99,0x12,0xb4,0x66,0x03,},{0xab,0xa3,0xe7,0x95,0xaa,0xb2,0x01,0x2a,0xcc,0xea,0xdd,0x7b,0x3b,0xd9,0xda,0xee,0xed,0x6f,0xf5,0x25,0x8b,0xdc,0xd7,0xc9,0x36,0x99,0xc2,0xa3,0x83,0x6e,0x38,0x32,},{0x2c,0x69,0x1f,0xa8,0xd4,0x87,0xce,0x20,0xd5,0xd2,0xfa,0x41,0x55,0x91,0x16,0xe0,0xbb,0xf4,0x39,0x7c,0xf5,0x24,0x0e,0x15,0x25,0x56,0x18,0x35,0x41,0xd6,0x6c,0xf7,0x53,0x58,0x24,0x01,0xa4,0x38,0x8d,0x39,0x03,0x39,0xdb,0xef,0x4d,0x38,0x47,0x43,0xca,0xa3,0x46,0xf5,0x5f,0x8d,0xab,0xa6,0x8b,0xa7,0xb9,0x13,0x1a,0x8a,0x6e,0x0b,},\"\\x4f\\x18\\x46\\xdd\\x7a\\xd5\\x0e\\x54\\x5d\\x4c\\xfb\\xff\\xbb\\x1d\\xc2\\xff\\x14\\x5d\\xc1\\x23\\x75\\x4d\\x08\\xaf\\x4e\\x44\\xec\\xc0\\xbc\\x8c\\x91\\x41\\x13\\x88\\xbc\\x76\\x53\\xe2\\xd8\\x93\\xd1\\xea\\xc2\\x10\\x7d\\x05\"},\n{{0x0a,0x3c,0x18,0x44,0xe2,0xdb,0x07,0x0f,0xb2,0x4e,0x3c,0x95,0xcb,0x1c,0xc6,0x71,0x4e,0xf8,0x4e,0x2c,0xcd,0x2b,0x9d,0xd2,0xf1,0x46,0x0e,0xbf,0x7e,0xcf,0x13,0xb1,},{0x72,0xe4,0x09,0x93,0x7e,0x06,0x10,0xeb,0x5c,0x20,0xb3,0x26,0xdc,0x6e,0xa1,0xbb,0xbc,0x04,0x06,0x70,0x1c,0x5c,0xd6,0x7d,0x1f,0xbd,0xe0,0x91,0x92,0xb0,0x7c,0x01,},{0x87,0xf7,0xfd,0xf4,0x60,0x95,0x20,0x1e,0x87,0x7a,0x58,0x8f,0xe3,0xe5,0xaa,0xf4,0x76,0xbd,0x63,0x13,0x8d,0x8a,0x87,0x8b,0x89,0xd6,0xac,0x60,0x63,0x1b,0x34,0x58,0xb9,0xd4,0x1a,0x3c,0x61,0xa5,0x88,0xe1,0xdb,0x8d,0x29,0xa5,0x96,0x89,0x81,0xb0,0x18,0x77,0x6c,0x58,0x87,0x80,0x92,0x2f,0x5a,0xa7,0x32,0xba,0x63,0x79,0xdd,0x05,},\"\\x4c\\x82\\x74\\xd0\\xed\\x1f\\x74\\xe2\\xc8\\x6c\\x08\\xd9\\x55\\xbd\\xe5\\x5b\\x2d\\x54\\x32\\x7e\\x82\\x06\\x2a\\x1f\\x71\\xf7\\x0d\\x53\\x6f\\xdc\\x87\\x22\\xcd\\xea\\xd7\\xd2\\x2a\\xae\\xad\\x2b\\xfa\\xa1\\xad\\x00\\xb8\\x29\\x57\"},\n{{0xc8,0xd7,0xa8,0x81,0x8b,0x98,0xdf,0xdb,0x20,0x83,0x9c,0x87,0x1c,0xb5,0xc4,0x8e,0x9e,0x94,0x70,0xca,0x3a,0xd3,0x5b,0xa2,0x61,0x3a,0x5d,0x31,0x99,0xc8,0xab,0x23,},{0x90,0xd2,0xef,0xbb,0xa4,0xd4,0x3e,0x6b,0x2b,0x99,0x2c,0xa1,0x60,0x83,0xdb,0xcf,0xa2,0xb3,0x22,0x38,0x39,0x07,0xb0,0xee,0x75,0xf3,0xe9,0x58,0x45,0xd3,0xc4,0x7f,},{0xfa,0x2e,0x99,0x44,0x21,0xae,0xf1,0xd5,0x85,0x66,0x74,0x81,0x3d,0x05,0xcb,0xd2,0xcf,0x84,0xef,0x5e,0xb4,0x24,0xaf,0x6e,0xcd,0x0d,0xc6,0xfd,0xbd,0xc2,0xfe,0x60,0x5f,0xe9,0x85,0x88,0x33,0x12,0xec,0xf3,0x4f,0x59,0xbf,0xb2,0xf1,0xc9,0x14,0x9e,0x5b,0x9c,0xc9,0xec,0xda,0x05,0xb2,0x73,0x11,0x30,0xf3,0xed,0x28,0xdd,0xae,0x0b,},\"\\x78\\x3e\\x33\\xc3\\xac\\xbd\\xbb\\x36\\xe8\\x19\\xf5\\x44\\xa7\\x78\\x1d\\x83\\xfc\\x28\\x3d\\x33\\x09\\xf5\\xd3\\xd1\\x2c\\x8d\\xcd\\x6b\\x0b\\x3d\\x0e\\x89\\xe3\\x8c\\xfd\\x3b\\x4d\\x08\\x85\\x66\\x1c\\xa5\\x47\\xfb\\x97\\x64\\xab\\xff\"},\n{{0xb4,0x82,0x70,0x36,0x12,0xd0,0xc5,0x86,0xf7,0x6c,0xfc,0xb2,0x1c,0xfd,0x21,0x03,0xc9,0x57,0x25,0x15,0x04,0xa8,0xc0,0xac,0x4c,0x86,0xc9,0xc6,0xf3,0xe4,0x29,0xff,},{0xfd,0x71,0x1d,0xc7,0xdd,0x3b,0x1d,0xfb,0x9d,0xf9,0x70,0x4b,0xe3,0xe6,0xb2,0x6f,0x58,0x7f,0xe7,0xdd,0x7b,0xa4,0x56,0xa9,0x1b,0xa4,0x3f,0xe5,0x1a,0xec,0x09,0xad,},{0x58,0x83,0x2b,0xde,0xb2,0x6f,0xea,0xfc,0x31,0xb4,0x62,0x77,0xcf,0x3f,0xb5,0xd7,0xa1,0x7d,0xfb,0x7c,0xcd,0x9b,0x1f,0x58,0xec,0xbe,0x6f,0xeb,0x97,0x96,0x66,0x82,0x8f,0x23,0x9b,0xa4,0xd7,0x52,0x19,0x26,0x0e,0xca,0xc0,0xac,0xf4,0x0f,0x0e,0x5e,0x25,0x90,0xf4,0xca,0xa1,0x6b,0xbb,0xcd,0x8a,0x15,0x5d,0x34,0x79,0x67,0xa6,0x07,},\"\\x29\\xd7\\x7a\\xcf\\xd9\\x9c\\x7a\\x00\\x70\\xa8\\x8f\\xeb\\x62\\x47\\xa2\\xbc\\xe9\\x98\\x4f\\xe3\\xe6\\xfb\\xf1\\x9d\\x40\\x45\\x04\\x2a\\x21\\xab\\x26\\xcb\\xd7\\x71\\xe1\\x84\\xa9\\xa7\\x5f\\x31\\x6b\\x64\\x8c\\x69\\x20\\xdb\\x92\\xb8\\x7b\"},\n{{0x84,0xe5,0x0d,0xd9,0xa0,0xf1,0x97,0xe3,0x89,0x3c,0x38,0xdb,0xd9,0x1f,0xaf,0xc3,0x44,0xc1,0x77,0x6d,0x3a,0x40,0x0e,0x2f,0x0f,0x0e,0xe7,0xaa,0x82,0x9e,0xb8,0xa2,},{0x2c,0x50,0xf8,0x70,0xee,0x48,0xb3,0x6b,0x0a,0xc2,0xf8,0xa5,0xf3,0x36,0xfb,0x09,0x0b,0x11,0x30,0x50,0xdb,0xcc,0x25,0xe0,0x78,0x20,0x0a,0x6e,0x16,0x15,0x3e,0xea,},{0x69,0xe6,0xa4,0x49,0x1a,0x63,0x83,0x73,0x16,0xe8,0x6a,0x5f,0x4b,0xa7,0xcd,0x0d,0x73,0x1e,0xcc,0x58,0xf1,0xd0,0xa2,0x64,0xc6,0x7c,0x89,0xbe,0xfd,0xd8,0xd3,0x82,0x9d,0x8d,0xe1,0x3b,0x33,0xcc,0x0b,0xf5,0x13,0x93,0x17,0x15,0xc7,0x80,0x96,0x57,0xe2,0xbf,0xb9,0x60,0xe5,0xc7,0x64,0xc9,0x71,0xd7,0x33,0x74,0x60,0x93,0xe5,0x00,},\"\\xf3\\x99\\x2c\\xde\\x64\\x93\\xe6\\x71\\xf1\\xe1\\x29\\xdd\\xca\\x80\\x38\\xb0\\xab\\xdb\\x77\\xbb\\x90\\x35\\xf9\\xf8\\xbe\\x54\\xbd\\x5d\\x68\\xc1\\xae\\xff\\x72\\x4f\\xf4\\x7d\\x29\\x34\\x43\\x91\\xdc\\x53\\x61\\x66\\xb8\\x67\\x1c\\xbb\\xf1\\x23\"},\n{{0xb3,0x22,0xd4,0x65,0x77,0xa2,0xa9,0x91,0xa4,0xd1,0x69,0x82,0x87,0x83,0x2a,0x39,0xc4,0x87,0xef,0x77,0x6b,0x4b,0xff,0x03,0x7a,0x05,0xc7,0xf1,0x81,0x2b,0xde,0xec,},{0xeb,0x2b,0xca,0xdf,0xd3,0xee,0xc2,0x98,0x6b,0xaf,0xf3,0x2b,0x98,0xe7,0xc4,0xdb,0xf0,0x3f,0xf9,0x5d,0x8a,0xd5,0xff,0x9a,0xa9,0x50,0x6e,0x54,0x72,0xff,0x84,0x5f,},{0xc7,0xb5,0x51,0x37,0x31,0x7c,0xa2,0x1e,0x33,0x48,0x9f,0xf6,0xa9,0xbf,0xab,0x97,0xc8,0x55,0xdc,0x6f,0x85,0x68,0x4a,0x70,0xa9,0x12,0x5a,0x26,0x1b,0x56,0xd5,0xe6,0xf1,0x49,0xc5,0x77,0x4d,0x73,0x4f,0x2d,0x8d,0xeb,0xfc,0x77,0xb7,0x21,0x89,0x6a,0x82,0x67,0xc2,0x37,0x68,0xe9,0xba,0xdb,0x91,0x0e,0xef,0x83,0xec,0x25,0x88,0x02,},\"\\x19\\xf1\\xbf\\x5d\\xcf\\x17\\x50\\xc6\\x11\\xf1\\xc4\\xa2\\x86\\x52\\x00\\x50\\x4d\\x82\\x29\\x8e\\xdd\\x72\\x67\\x1f\\x62\\xa7\\xb1\\x47\\x1a\\xc3\\xd4\\xa3\\x0f\\x7d\\xe9\\xe5\\xda\\x41\\x08\\xc5\\x2a\\x4c\\xe7\\x0a\\x3e\\x11\\x4a\\x52\\xa3\\xb3\\xc5\"},\n{{0x96,0x0c,0xab,0x50,0x34,0xb9,0x83,0x8d,0x09,0x8d,0x2d,0xcb,0xf4,0x36,0x4b,0xec,0x16,0xd3,0x88,0xf6,0x37,0x6d,0x73,0xa6,0x27,0x3b,0x70,0xf8,0x2b,0xbc,0x98,0xc0,},{0x5e,0x3c,0x19,0xf2,0x41,0x5a,0xcf,0x72,0x9f,0x82,0x9a,0x4e,0xbd,0x5c,0x40,0xe1,0xa6,0xbc,0x9f,0xbc,0xa9,0x57,0x03,0xa9,0x37,0x60,0x87,0xed,0x09,0x37,0xe5,0x1a,},{0x27,0xd4,0xc3,0xa1,0x81,0x1e,0xf9,0xd4,0x36,0x0b,0x3b,0xdd,0x13,0x3c,0x2c,0xcc,0x30,0xd0,0x2c,0x2f,0x24,0x82,0x15,0x77,0x6c,0xb0,0x7e,0xe4,0x17,0x7f,0x9b,0x13,0xfc,0x42,0xdd,0x70,0xa6,0xc2,0xfe,0xd8,0xf2,0x25,0xc7,0x66,0x3c,0x7f,0x18,0x2e,0x7e,0xe8,0xec,0xcf,0xf2,0x0d,0xc7,0xb0,0xe1,0xd5,0x83,0x4e,0xc5,0xb1,0xea,0x01,},\"\\xf8\\xb2\\x19\\x62\\x44\\x7b\\x0a\\x8f\\x2e\\x42\\x79\\xde\\x41\\x1b\\xea\\x12\\x8e\\x0b\\xe4\\x4b\\x69\\x15\\xe6\\xcd\\xa8\\x83\\x41\\xa6\\x8a\\x0d\\x81\\x83\\x57\\xdb\\x93\\x8e\\xac\\x73\\xe0\\xaf\\x6d\\x31\\x20\\x6b\\x39\\x48\\xf8\\xc4\\x8a\\x44\\x73\\x08\"},\n{{0xeb,0x77,0xb2,0x63,0x8f,0x23,0xee,0xbc,0x82,0xef,0xe4,0x5e,0xe9,0xe5,0xa0,0x32,0x66,0x37,0x40,0x1e,0x66,0x3e,0xd0,0x29,0x69,0x9b,0x21,0xe6,0x44,0x3f,0xb4,0x8e,},{0x9e,0xf2,0x76,0x08,0x96,0x1a,0xc7,0x11,0xde,0x71,0xa6,0xe2,0xd4,0xd4,0x66,0x3e,0xa3,0xec,0xd4,0x2f,0xb7,0xe4,0xe8,0x62,0x7c,0x39,0x62,0x2d,0xf4,0xaf,0x0b,0xbc,},{0x18,0xdc,0x56,0xd7,0xbd,0x9a,0xcd,0x4f,0x4d,0xaa,0x78,0x54,0x0b,0x4a,0xc8,0xff,0x7a,0xa9,0x81,0x5f,0x45,0xa0,0xbb,0xa3,0x70,0x73,0x1a,0x14,0xea,0xab,0xe9,0x6d,0xf8,0xb5,0xf3,0x7d,0xbf,0x8e,0xae,0x4c,0xb1,0x5a,0x64,0xb2,0x44,0x65,0x1e,0x59,0xd6,0xa3,0xd6,0x76,0x1d,0x9e,0x3c,0x50,0xf2,0xd0,0xcb,0xb0,0x9c,0x05,0xec,0x06,},\"\\x99\\xe3\\xd0\\x09\\x34\\x00\\x3e\\xba\\xfc\\x3e\\x9f\\xdb\\x68\\x7b\\x0f\\x5f\\xf9\\xd5\\x78\\x2a\\x4b\\x1f\\x56\\xb9\\x70\\x00\\x46\\xc0\\x77\\x91\\x56\\x02\\xc3\\x13\\x4e\\x22\\xfc\\x90\\xed\\x7e\\x69\\x0f\\xdd\\xd4\\x43\\x3e\\x20\\x34\\xdc\\xb2\\xdc\\x99\\xab\"},\n{{0xb6,0x25,0xaa,0x89,0xd3,0xf7,0x30,0x87,0x15,0x42,0x7b,0x6c,0x39,0xbb,0xac,0x58,0xef,0xfd,0x3a,0x0f,0xb7,0x31,0x6f,0x7a,0x22,0xb9,0x9e,0xe5,0x92,0x2f,0x2d,0xc9,},{0x65,0xa9,0x9c,0x3e,0x16,0xfe,0xa8,0x94,0xec,0x33,0xc6,0xb2,0x0d,0x91,0x05,0xe2,0xa0,0x4e,0x27,0x64,0xa4,0x76,0x9d,0x9b,0xbd,0x4d,0x8b,0xac,0xfe,0xab,0x4a,0x2e,},{0x01,0xbb,0x90,0x1d,0x83,0xb8,0xb6,0x82,0xd3,0x61,0x4a,0xf4,0x6a,0x80,0x7b,0xa2,0x69,0x13,0x58,0xfe,0xb7,0x75,0x32,0x5d,0x34,0x23,0xf5,0x49,0xff,0x0a,0xa5,0x75,0x7e,0x4e,0x1a,0x74,0xe9,0xc7,0x0f,0x97,0x21,0xd8,0xf3,0x54,0xb3,0x19,0xd4,0xf4,0xa1,0xd9,0x14,0x45,0xc8,0x70,0xfd,0x0f,0xfb,0x94,0xfe,0xd6,0x46,0x64,0x73,0x0d,},\"\\xe0\\x72\\x41\\xdb\\xd3\\xad\\xbe\\x61\\x0b\\xbe\\x4d\\x00\\x5d\\xd4\\x67\\x32\\xa4\\xc2\\x50\\x86\\xec\\xb8\\xec\\x29\\xcd\\x7b\\xca\\x11\\x6e\\x1b\\xf9\\xf5\\x3b\\xfb\\xf3\\xe1\\x1f\\xa4\\x90\\x18\\xd3\\x9f\\xf1\\x15\\x4a\\x06\\x66\\x8e\\xf7\\xdf\\x5c\\x67\\x8e\\x6a\"},\n{{0xb1,0xc9,0xf8,0xbd,0x03,0xfe,0x82,0xe7,0x8f,0x5c,0x0f,0xb0,0x64,0x50,0xf2,0x7d,0xac,0xdf,0x71,0x64,0x34,0xdb,0x26,0x82,0x75,0xdf,0x3e,0x1d,0xc1,0x77,0xaf,0x42,},{0x7f,0xc8,0x8b,0x1f,0x7b,0x3f,0x11,0xc6,0x29,0xbe,0x67,0x1c,0x21,0x62,0x1f,0x5c,0x10,0x67,0x2f,0xaf,0xc8,0x49,0x2d,0xa8,0x85,0x74,0x20,0x59,0xee,0x67,0x74,0xcf,},{0x4b,0x22,0x99,0x51,0xef,0x26,0x2f,0x16,0x97,0x8f,0x79,0x14,0xbc,0x67,0x2e,0x72,0x26,0xc5,0xf8,0x37,0x9d,0x27,0x78,0xc5,0xa2,0xdc,0x0a,0x26,0x50,0x86,0x9f,0x7a,0xcf,0xbd,0x0b,0xcd,0x30,0xfd,0xb0,0x61,0x9b,0xb4,0x4f,0xc1,0xae,0x59,0x39,0xb8,0x7c,0xc3,0x18,0x13,0x30,0x09,0xc2,0x03,0x95,0xb6,0xc7,0xeb,0x98,0x10,0x77,0x01,},\"\\x33\\x1d\\xa7\\xa9\\xc1\\xf8\\x7b\\x2a\\xc9\\x1e\\xe3\\xb8\\x6d\\x06\\xc2\\x91\\x63\\xc0\\x5e\\xd6\\xf8\\xd8\\xa9\\x72\\x5b\\x47\\x1b\\x7d\\xb0\\xd6\\xac\\xec\\x7f\\x0f\\x70\\x24\\x87\\x16\\x3f\\x5e\\xda\\x02\\x0c\\xa5\\xb4\\x93\\xf3\\x99\\xe1\\xc8\\xd3\\x08\\xc3\\xc0\\xc2\"},\n{{0x6d,0x8c,0xdb,0x2e,0x07,0x5f,0x3a,0x2f,0x86,0x13,0x72,0x14,0xcb,0x23,0x6c,0xeb,0x89,0xa6,0x72,0x8b,0xb4,0xa2,0x00,0x80,0x6b,0xf3,0x55,0x7f,0xb7,0x8f,0xac,0x69,},{0x57,0xa0,0x4c,0x7a,0x51,0x13,0xcd,0xdf,0xe4,0x9a,0x4c,0x12,0x46,0x91,0xd4,0x6c,0x1f,0x9c,0xdc,0x8f,0x34,0x3f,0x9d,0xcb,0x72,0xa1,0x33,0x0a,0xec,0xa7,0x1f,0xda,},{0xa6,0xcb,0xc9,0x47,0xf9,0xc8,0x7d,0x14,0x55,0xcf,0x1a,0x70,0x85,0x28,0xc0,0x90,0xf1,0x1e,0xce,0xe4,0x85,0x5d,0x1d,0xba,0xad,0xf4,0x74,0x54,0xa4,0xde,0x55,0xfa,0x4c,0xe8,0x4b,0x36,0xd7,0x3a,0x5b,0x5f,0x8f,0x59,0x29,0x8c,0xcf,0x21,0x99,0x2d,0xf4,0x92,0xef,0x34,0x16,0x3d,0x87,0x75,0x3b,0x7e,0x9d,0x32,0xf2,0xc3,0x66,0x0b,},\"\\x7f\\x31\\x8d\\xbd\\x12\\x1c\\x08\\xbf\\xdd\\xfe\\xff\\x4f\\x6a\\xff\\x4e\\x45\\x79\\x32\\x51\\xf8\\xab\\xf6\\x58\\x40\\x33\\x58\\x23\\x89\\x84\\x36\\x00\\x54\\xf2\\xa8\\x62\\xc5\\xbb\\x83\\xed\\x89\\x02\\x5d\\x20\\x14\\xa7\\xa0\\xce\\xe5\\x0d\\xa3\\xcb\\x0e\\x76\\xbb\\xb6\\xbf\"},\n{{0x47,0xad,0xc6,0xd6,0xbf,0x57,0x1e,0xe9,0x57,0x0c,0xa0,0xf7,0x5b,0x60,0x4a,0xc4,0x3e,0x30,0x3e,0x4a,0xb3,0x39,0xca,0x9b,0x53,0xca,0xcc,0x5b,0xe4,0x5b,0x2c,0xcb,},{0xa3,0xf5,0x27,0xa1,0xc1,0xf1,0x7d,0xfe,0xed,0x92,0x27,0x73,0x47,0xc9,0xf9,0x8a,0xb4,0x75,0xde,0x17,0x55,0xb0,0xab,0x54,0x6b,0x8a,0x15,0xd0,0x1b,0x9b,0xd0,0xbe,},{0x4e,0x8c,0x31,0x83,0x43,0xc3,0x06,0xad,0xbb,0xa6,0x0c,0x92,0xb7,0x5c,0xb0,0x56,0x9b,0x92,0x19,0xd8,0xa8,0x6e,0x5d,0x57,0x75,0x2e,0xd2,0x35,0xfc,0x10,0x9a,0x43,0xc2,0xcf,0x4e,0x94,0x2c,0xac,0xf2,0x97,0x27,0x9f,0xbb,0x28,0x67,0x53,0x47,0xe0,0x80,0x27,0x72,0x2a,0x4e,0xb7,0x39,0x5e,0x00,0xa1,0x74,0x95,0xd3,0x2e,0xdf,0x0b,},\"\\xce\\x49\\x7c\\x5f\\xf5\\xa7\\x79\\x90\\xb7\\xd8\\xf8\\x69\\x9e\\xb1\\xf5\\xd8\\xc0\\x58\\x2f\\x70\\xcb\\x7a\\xc5\\xc5\\x4d\\x9d\\x92\\x49\\x13\\x27\\x8b\\xc6\\x54\\xd3\\x7e\\xa2\\x27\\x59\\x0e\\x15\\x20\\x22\\x17\\xfc\\x98\\xda\\xc4\\xc0\\xf3\\xbe\\x21\\x83\\xd1\\x33\\x31\\x57\\x39\"},\n{{0x3c,0x19,0xb5,0x0b,0x0f,0xe4,0x79,0x61,0x71,0x9c,0x38,0x1d,0x0d,0x8d,0xa9,0xb9,0x86,0x9d,0x31,0x2f,0x13,0xe3,0x29,0x8b,0x97,0xfb,0x22,0xf0,0xaf,0x29,0xcb,0xbe,},{0x0f,0x7e,0xda,0x09,0x14,0x99,0x62,0x5e,0x2b,0xae,0x85,0x36,0xea,0x35,0xcd,0xa5,0x48,0x3b,0xd1,0x6a,0x9c,0x7e,0x41,0x6b,0x34,0x1d,0x6f,0x2c,0x83,0x34,0x36,0x12,},{0xef,0xbd,0x41,0xf2,0x6a,0x5d,0x62,0x68,0x55,0x16,0xf8,0x82,0xb6,0xec,0x74,0xe0,0xd5,0xa7,0x18,0x30,0xd2,0x03,0xc2,0x31,0x24,0x8f,0x26,0xe9,0x9a,0x9c,0x65,0x78,0xec,0x90,0x0d,0x68,0xcd,0xb8,0xfa,0x72,0x16,0xad,0x0d,0x24,0xf9,0xec,0xbc,0x9f,0xfa,0x65,0x53,0x51,0x66,0x65,0x82,0xf6,0x26,0x64,0x53,0x95,0xa3,0x1f,0xa7,0x04,},\"\\x8d\\xdc\\xd6\\x30\\x43\\xf5\\x5e\\xc3\\xbf\\xc8\\x3d\\xce\\xae\\x69\\xd8\\xf8\\xb3\\x2f\\x4c\\xdb\\x6e\\x2a\\xeb\\xd9\\x4b\\x43\\x14\\xf8\\xfe\\x72\\x87\\xdc\\xb6\\x27\\x32\\xc9\\x05\\x2e\\x75\\x57\\xfe\\x63\\x53\\x43\\x38\\xef\\xb5\\xb6\\x25\\x4c\\x5d\\x41\\xd2\\x69\\x0c\\xf5\\x14\\x4f\"},\n{{0x34,0xe1,0xe9,0xd5,0x39,0x10,0x7e,0xb8,0x6b,0x39,0x3a,0x5c,0xce,0xa1,0x49,0x6d,0x35,0xbc,0x7d,0x5e,0x9a,0x8c,0x51,0x59,0xd9,0x57,0xe4,0xe5,0x85,0x2b,0x3e,0xb0,},{0x0e,0xcb,0x26,0x01,0xd5,0xf7,0x04,0x74,0x28,0xe9,0xf9,0x09,0x88,0x3a,0x12,0x42,0x00,0x85,0xf0,0x4e,0xe2,0xa8,0x8b,0x6d,0x95,0xd3,0xd7,0xf2,0xc9,0x32,0xbd,0x76,},{0x32,0xd2,0x29,0x04,0xd3,0xe7,0x01,0x2d,0x6f,0x5a,0x44,0x1b,0x0b,0x42,0x28,0x06,0x4a,0x5c,0xf9,0x5b,0x72,0x3a,0x66,0xb0,0x48,0xa0,0x87,0xec,0xd5,0x59,0x20,0xc3,0x1c,0x20,0x4c,0x3f,0x20,0x06,0x89,0x1a,0x85,0xdd,0x19,0x32,0xe3,0xf1,0xd6,0x14,0xcf,0xd6,0x33,0xb5,0xe6,0x32,0x91,0xc6,0xd8,0x16,0x6f,0x30,0x11,0x43,0x1e,0x09,},\"\\xa6\\xd4\\xd0\\x54\\x2c\\xfe\\x0d\\x24\\x0a\\x90\\x50\\x7d\\xeb\\xac\\xab\\xce\\x7c\\xbb\\xd4\\x87\\x32\\x35\\x3f\\x4f\\xad\\x82\\xc7\\xbb\\x7d\\xbd\\x9d\\xf8\\xe7\\xd9\\xa1\\x69\\x80\\xa4\\x51\\x86\\xd8\\x78\\x6c\\x5e\\xf6\\x54\\x45\\xbc\\xc5\\xb2\\xad\\x5f\\x66\\x0f\\xfc\\x7c\\x8e\\xaa\\xc0\"},\n{{0x49,0xdd,0x47,0x3e,0xde,0x6a,0xa3,0xc8,0x66,0x82,0x4a,0x40,0xad,0xa4,0x99,0x6c,0x23,0x9a,0x20,0xd8,0x4c,0x93,0x65,0xe4,0xf0,0xa4,0x55,0x4f,0x80,0x31,0xb9,0xcf,},{0x78,0x8d,0xe5,0x40,0x54,0x4d,0x3f,0xeb,0x0c,0x91,0x92,0x40,0xb3,0x90,0x72,0x9b,0xe4,0x87,0xe9,0x4b,0x64,0xad,0x97,0x3e,0xb6,0x5b,0x46,0x69,0xec,0xf2,0x35,0x01,},{0xd2,0xfd,0xe0,0x27,0x91,0xe7,0x20,0x85,0x25,0x07,0xfa,0xa7,0xc3,0x78,0x90,0x40,0xd9,0xef,0x86,0x64,0x63,0x21,0xf3,0x13,0xac,0x55,0x7f,0x40,0x02,0x49,0x15,0x42,0xdd,0x67,0xd0,0x5c,0x69,0x90,0xcd,0xb0,0xd4,0x95,0x50,0x1f,0xbc,0x5d,0x51,0x88,0xbf,0xbb,0x84,0xdc,0x1b,0xf6,0x09,0x8b,0xee,0x06,0x03,0xa4,0x7f,0xc2,0x69,0x0f,},\"\\x3a\\x53\\x59\\x4f\\x3f\\xba\\x03\\x02\\x93\\x18\\xf5\\x12\\xb0\\x84\\xa0\\x71\\xeb\\xd6\\x0b\\xae\\xc7\\xf5\\x5b\\x02\\x8d\\xc7\\x3b\\xfc\\x9c\\x74\\xe0\\xca\\x49\\x6b\\xf8\\x19\\xdd\\x92\\xab\\x61\\xcd\\x8b\\x74\\xbe\\x3c\\x0d\\x6d\\xcd\\x12\\x8e\\xfc\\x5e\\xd3\\x34\\x2c\\xba\\x12\\x4f\\x72\\x6c\"},\n{{0x33,0x1c,0x64,0xda,0x48,0x2b,0x6b,0x55,0x13,0x73,0xc3,0x64,0x81,0xa0,0x2d,0x81,0x36,0xec,0xad,0xbb,0x01,0xab,0x11,0x4b,0x44,0x70,0xbf,0x41,0x60,0x7a,0xc5,0x71,},{0x52,0xa0,0x0d,0x96,0xa3,0x14,0x8b,0x47,0x26,0x69,0x2d,0x9e,0xff,0x89,0x16,0x0e,0xa9,0xf9,0x9a,0x5c,0xc4,0x38,0x9f,0x36,0x1f,0xed,0x0b,0xb1,0x6a,0x42,0xd5,0x21,},{0x22,0xc9,0x9a,0xa9,0x46,0xea,0xd3,0x9a,0xc7,0x99,0x75,0x62,0x81,0x0c,0x01,0xc2,0x0b,0x46,0xbd,0x61,0x06,0x45,0xbd,0x2d,0x56,0xdc,0xdc,0xba,0xac,0xc5,0x45,0x2c,0x74,0xfb,0xf4,0xb8,0xb1,0x81,0x3b,0x0e,0x94,0xc3,0x0d,0x80,0x8c,0xe5,0x49,0x8e,0x61,0xd4,0xf7,0xcc,0xbb,0x4c,0xc5,0xf0,0x4d,0xfc,0x61,0x40,0x82,0x5a,0x96,0x00,},\"\\x20\\xe1\\xd0\\x5a\\x0d\\x5b\\x32\\xcc\\x81\\x50\\xb8\\x11\\x6c\\xef\\x39\\x65\\x9d\\xd5\\xfb\\x44\\x3a\\xb1\\x56\\x00\\xf7\\x8e\\x5b\\x49\\xc4\\x53\\x26\\xd9\\x32\\x3f\\x28\\x50\\xa6\\x3c\\x38\\x08\\x85\\x94\\x95\\xae\\x27\\x3f\\x58\\xa5\\x1e\\x9d\\xe9\\xa1\\x45\\xd7\\x74\\xb4\\x0b\\xa9\\xd7\\x53\\xd3\"},\n{{0x5c,0x0b,0x96,0xf2,0xaf,0x87,0x12,0x12,0x2c,0xf7,0x43,0xc8,0xf8,0xdc,0x77,0xb6,0xcd,0x55,0x70,0xa7,0xde,0x13,0x29,0x7b,0xb3,0xdd,0xe1,0x88,0x62,0x13,0xcc,0xe2,},{0x05,0x10,0xea,0xf5,0x7d,0x73,0x01,0xb0,0xe1,0xd5,0x27,0x03,0x9b,0xf4,0xc6,0xe2,0x92,0x30,0x0a,0x3a,0x61,0xb4,0x76,0x54,0x34,0xf3,0x20,0x3c,0x10,0x03,0x51,0xb1,},{0x06,0xe5,0xd8,0x43,0x6a,0xc7,0x70,0x5b,0x3a,0x90,0xf1,0x63,0x1c,0xdd,0x38,0xec,0x1a,0x3f,0xa4,0x97,0x78,0xa9,0xb9,0xf2,0xfa,0x5e,0xbe,0xa4,0xe7,0xd5,0x60,0xad,0xa7,0xdd,0x26,0xff,0x42,0xfa,0xfa,0x8b,0xa4,0x20,0x32,0x37,0x42,0x76,0x1a,0xca,0x69,0x04,0x94,0x0d,0xc2,0x1b,0xbe,0xf6,0x3f,0xf7,0x2d,0xaa,0xb4,0x5d,0x43,0x0b,},\"\\x54\\xe0\\xca\\xa8\\xe6\\x39\\x19\\xca\\x61\\x4b\\x2b\\xfd\\x30\\x8c\\xcf\\xe5\\x0c\\x9e\\xa8\\x88\\xe1\\xee\\x44\\x46\\xd6\\x82\\xcb\\x50\\x34\\x62\\x7f\\x97\\xb0\\x53\\x92\\xc0\\x4e\\x83\\x55\\x56\\xc3\\x1c\\x52\\x81\\x6a\\x48\\xe4\\xfb\\x19\\x66\\x93\\x20\\x6b\\x8a\\xfb\\x44\\x08\\x66\\x2b\\x3c\\xb5\\x75\"},\n{{0xde,0x84,0xf2,0x43,0x5f,0x78,0xde,0xdb,0x87,0xda,0x18,0x19,0x4f,0xf6,0xa3,0x36,0xf0,0x81,0x11,0x15,0x0d,0xef,0x90,0x1c,0x1a,0xc4,0x18,0x14,0x6e,0xb7,0xb5,0x4a,},{0xd3,0xa9,0x2b,0xba,0xa4,0xd6,0x3a,0xf7,0x9c,0x22,0x26,0xa7,0x23,0x6e,0x64,0x27,0x42,0x8d,0xf8,0xb3,0x62,0x42,0x7f,0x87,0x30,0x23,0xb2,0x2d,0x2f,0x5e,0x03,0xf2,},{0x47,0x1e,0xbc,0x97,0x3c,0xfd,0xac,0xee,0xc0,0x72,0x79,0x30,0x73,0x68,0xb7,0x3b,0xe3,0x5b,0xc6,0xf8,0xd8,0x31,0x2b,0x70,0x15,0x05,0x67,0x36,0x90,0x96,0x70,0x6d,0xc4,0x71,0x12,0x6c,0x35,0x76,0xf9,0xf0,0xeb,0x55,0x0d,0xf5,0xac,0x6a,0x52,0x51,0x81,0x11,0x00,0x29,0xdd,0x1f,0xc1,0x11,0x74,0xd1,0xaa,0xce,0xd4,0x8d,0x63,0x0f,},\"\\x20\\x51\\x35\\xec\\x7f\\x41\\x7c\\x85\\x80\\x72\\xd5\\x23\\x3f\\xb3\\x64\\x82\\xd4\\x90\\x6a\\xbd\\x60\\xa7\\x4a\\x49\\x8c\\x34\\x7f\\xf2\\x48\\xdf\\xa2\\x72\\x2c\\xa7\\x4e\\x87\\x9d\\xe3\\x31\\x69\\xfa\\xdc\\x7c\\xd4\\x4d\\x6c\\x94\\xa1\\x7d\\x16\\xe1\\xe6\\x30\\x82\\x4b\\xa3\\xe0\\xdf\\x22\\xed\\x68\\xea\\xab\"},\n{{0xba,0x4d,0x6e,0x67,0xb2,0xce,0x67,0xa1,0xe4,0x43,0x26,0x49,0x40,0x44,0xf3,0x7a,0x44,0x2f,0x3b,0x81,0x72,0x5b,0xc1,0xf9,0x34,0x14,0x62,0x71,0x8b,0x55,0xee,0x20,},{0xf7,0x3f,0xa0,0x76,0xf8,0x4b,0x6d,0xb6,0x75,0xa5,0xfd,0xa5,0xad,0x67,0xe3,0x51,0xa4,0x1e,0x8e,0x7f,0x29,0xad,0xd1,0x68,0x09,0xca,0x01,0x03,0x87,0xe9,0xc6,0xcc,},{0x57,0xb9,0xd2,0xa7,0x11,0x20,0x7f,0x83,0x74,0x21,0xba,0xe7,0xdd,0x48,0xea,0xa1,0x8e,0xab,0x1a,0x9a,0x70,0xa0,0xf1,0x30,0x58,0x06,0xfe,0xe1,0x7b,0x45,0x8f,0x3a,0x09,0x64,0xb3,0x02,0xd1,0x83,0x4d,0x3e,0x0a,0xc9,0xe8,0x49,0x6f,0x00,0x0b,0x77,0xf0,0x08,0x3b,0x41,0xf8,0xa9,0x57,0xe6,0x32,0xfb,0xc7,0x84,0x0e,0xee,0x6a,0x06,},\"\\x4b\\xaf\\xda\\xc9\\x09\\x9d\\x40\\x57\\xed\\x6d\\xd0\\x8b\\xca\\xee\\x87\\x56\\xe9\\xa4\\x0f\\x2c\\xb9\\x59\\x80\\x20\\xeb\\x95\\x01\\x95\\x28\\x40\\x9b\\xbe\\xa3\\x8b\\x38\\x4a\\x59\\xf1\\x19\\xf5\\x72\\x97\\xbf\\xb2\\xfa\\x14\\x2f\\xc7\\xbb\\x1d\\x90\\xdb\\xdd\\xde\\x77\\x2b\\xcd\\xe4\\x8c\\x56\\x70\\xd5\\xfa\\x13\"},\n{{0x0d,0x13,0x1c,0x45,0xae,0xa6,0xf3,0xa4,0xe1,0xb9,0xa2,0xcf,0x60,0xc5,0x51,0x04,0x58,0x7e,0xfa,0xa8,0x46,0xb2,0x22,0xbf,0x0a,0x7b,0x74,0xce,0x7a,0x3f,0x63,0xb6,},{0x3c,0x67,0x29,0xdb,0xe9,0x3b,0x49,0x9c,0x4e,0x61,0x4a,0x2f,0x21,0xbe,0xb7,0x29,0x43,0x8d,0x49,0x8e,0x1a,0xc8,0xd1,0x4c,0xba,0xd9,0x71,0x7a,0x5d,0xbd,0x97,0xcd,},{0xa9,0xc5,0xee,0x86,0xfb,0x06,0xd9,0xe4,0x6b,0x37,0x9c,0x32,0xdd,0xa7,0xc9,0x2c,0x9c,0x13,0xdb,0x27,0x4d,0xc2,0x41,0x16,0xfb,0xdd,0x87,0x86,0x96,0x04,0x54,0x88,0xcc,0x75,0xa5,0x2f,0xff,0x67,0xd1,0xa5,0x11,0x3d,0x06,0xe3,0x33,0xac,0x67,0xff,0x66,0x4b,0x3f,0x2a,0x40,0x5f,0xa1,0xd1,0x4d,0xd5,0xbb,0xb9,0x74,0x09,0xb6,0x06,},\"\\xb4\\x29\\x1d\\x08\\xb8\\x8f\\xb2\\xf7\\xb8\\xf9\\x9d\\x0d\\xce\\x40\\x07\\x9f\\xcb\\xab\\x71\\x8b\\xbd\\x8f\\x4e\\x8e\\xab\\xc3\\xc1\\x42\\x8b\\x6a\\x07\\x1f\\xb2\\xa3\\xc8\\xeb\\xa1\\xca\\xcc\\xcf\\xa8\\x71\\xb3\\x65\\xc7\\x08\\xbe\\xf2\\x68\\x5b\\xc1\\x3e\\x6b\\x80\\xbc\\x14\\xa5\\xf2\\x49\\x17\\x0f\\xfc\\x56\\xd0\\x14\"},\n{{0xa7,0x5e,0x3b,0x6b,0x41,0x70,0xe4,0x44,0x78,0x1b,0xe4,0xee,0xac,0x3e,0x0f,0xda,0xa4,0xb4,0x35,0x6f,0x70,0x54,0x86,0xbc,0xb0,0x71,0xa3,0x25,0xae,0x07,0x1f,0xba,},{0x99,0x3d,0x38,0xa7,0xd7,0x2f,0x0a,0xee,0x15,0xff,0x6f,0x4f,0xdc,0x37,0xca,0x77,0x24,0xfd,0x13,0x73,0xa3,0x76,0x6b,0x27,0x5d,0xbc,0x77,0xe6,0x47,0x98,0x0e,0x0a,},{0xa5,0xdb,0x4d,0x3d,0x33,0x29,0xab,0xe3,0x69,0x79,0x59,0xe6,0xb5,0x94,0x7e,0xa8,0x60,0x1b,0x03,0xef,0x8e,0x1d,0x6f,0xe2,0x02,0x14,0x49,0x31,0x27,0x2c,0xa0,0xa0,0x9b,0x5e,0xb0,0xf3,0x90,0x57,0x2e,0xa7,0xef,0x03,0xc6,0x13,0x1e,0x9d,0xe5,0xf1,0x6b,0xf0,0xb0,0x34,0x24,0x4f,0x7e,0x10,0x4f,0xf5,0x31,0x1b,0xbf,0x66,0x3a,0x0d,},\"\\x40\\x37\\x86\\x6f\\x65\\x48\\xb0\\x1c\\xc6\\xbc\\xf3\\xa9\\x40\\xe3\\x94\\x5a\\xa2\\xd1\\x88\\xb4\\xb7\\xf1\\x82\\xaa\\x77\\xec\\x4d\\x6b\\x04\\x28\\xab\\x5b\\x84\\xd8\\x5d\\xf1\\x92\\xa5\\xa3\\x8a\\xda\\x08\\x9d\\x76\\xfa\\x26\\xbf\\x67\\x73\\x6a\\x70\\x41\\xa5\\xeb\\x8f\\x0c\\x57\\x19\\xeb\\x39\\x66\\x93\\xc4\\x51\\x60\\xf8\"},\n{{0xbc,0xbc,0xf5,0x61,0xec,0xc0,0x5a,0x41,0xc7,0xd7,0xe5,0x5e,0x69,0x6d,0x32,0xce,0x39,0xb4,0xd0,0x3c,0x1f,0x5f,0x3f,0x3a,0x89,0x27,0xfe,0x5e,0x62,0xe8,0x44,0xb2,},{0x4d,0xdf,0x53,0xfa,0xd6,0xa7,0xa9,0xed,0x30,0xf3,0xaf,0xec,0xca,0x13,0x6f,0xd7,0x84,0x3b,0x72,0xc2,0x43,0x09,0x08,0x91,0xae,0x40,0x21,0xa3,0x2c,0xad,0xff,0x1a,},{0x9f,0xf1,0x51,0x15,0xf6,0x66,0x1f,0x32,0x11,0xd7,0xa4,0x07,0x64,0x96,0x76,0x29,0xba,0x6a,0x52,0x63,0x95,0x1b,0xdc,0x3c,0x6a,0x4c,0x90,0xd0,0x70,0xf7,0xbe,0x00,0x02,0x4b,0x80,0xd8,0x3b,0x6b,0xc2,0x75,0x87,0xfc,0xff,0x5f,0x5c,0xcc,0x0e,0xb3,0xcd,0xe1,0x49,0x7c,0xf5,0x68,0x95,0x14,0x7a,0x06,0x3f,0x61,0xf0,0x8a,0xdf,0x0b,},\"\\x6f\\x67\\x16\\xb6\\x78\\x47\\x40\\x98\\x0a\\xeb\\xc3\\x24\\x88\\x07\\xe3\\x1c\\x12\\x86\\xac\\x7b\\x68\\x1c\\x00\\xb6\\x6c\\x88\\xff\\x7a\\x33\\x6d\\x44\\x1f\\xa5\\xc3\\xeb\\x25\\x6d\\x20\\xcf\\x6d\\x1a\\xc9\\x2c\\xcf\\xe4\\xbe\\x6d\\xcc\\x41\\xb1\\xaf\\xf8\\x46\\xd3\\x60\\xc2\\x43\\x00\\x1c\\xab\\xdf\\xbf\\x1a\\x9b\\x24\\x04\\x55\"},\n{{0x21,0x05,0x32,0x80,0x5f,0xa9,0xcc,0x9b,0xe9,0x16,0xd2,0x13,0xca,0xc3,0x74,0xe3,0xcd,0x6f,0xc2,0x60,0x2a,0x54,0x4d,0x0c,0x1c,0xe2,0x9d,0x30,0x10,0x5d,0x69,0xab,},{0x10,0x69,0x9e,0x49,0x9b,0xe9,0x9e,0x2b,0x11,0xb9,0x8f,0x6f,0x86,0xb6,0x7c,0xdc,0x4c,0xcf,0x69,0xf3,0xc5,0x3c,0xe0,0x94,0x87,0x56,0x47,0xd2,0xd0,0xd0,0xec,0xc5,},{0x4c,0x2d,0x31,0xd5,0xbb,0xc4,0x2e,0x02,0x6d,0xc1,0xe0,0x79,0xec,0xc4,0xdd,0x07,0x2c,0x5d,0x2c,0xce,0x65,0xe3,0xdb,0x8d,0x8a,0x1d,0xd9,0x05,0x7f,0xaa,0x03,0x71,0x72,0x7f,0x72,0x72,0x31,0xa0,0xf0,0x60,0xfa,0x27,0x09,0x75,0x33,0xb6,0xdb,0x3b,0x8f,0x62,0x52,0xf2,0x79,0x3d,0x75,0x66,0x2c,0xaa,0xdf,0x5f,0x0f,0xcc,0x71,0x0e,},\"\\x9f\\xc4\\xd2\\x8c\\xfd\\x25\\xe6\\xc0\\xc5\\xe7\\x24\\xe1\\x9c\\xa3\\x9d\\x71\\xe5\\x3b\\xf4\\xaa\\x27\\x96\\xc5\\x4c\\x33\\x51\\xf1\\x08\\xfc\\x70\\xf2\\x61\\x1a\\x62\\xe0\\xab\\x90\\xaf\\x6a\\xde\\x52\\x16\\x78\\x8e\\x9e\\xb2\\xa8\\x73\\x05\\x9b\\x1e\\x79\\xd7\\xd5\\x9d\\xeb\\xd6\\x8f\\x2d\\x4d\\x80\\xff\\xe3\\x1b\\xf7\\x4b\\x92\\x8c\"},\n{{0x18,0x5d,0x64,0xb6,0x94,0x79,0xe0,0xba,0x0a,0x58,0x44,0xa1,0x0a,0xd8,0x41,0x25,0xba,0x11,0xc4,0xb4,0x0d,0x63,0xed,0xa2,0xc5,0x7a,0xfc,0x7e,0x01,0x9c,0x8e,0x0c,},{0xa5,0x76,0x4f,0x63,0x98,0xa5,0xae,0x22,0x66,0xa3,0x8f,0x97,0x14,0x53,0x3c,0x4b,0xbd,0x8d,0x07,0x82,0x6f,0x63,0xe2,0x04,0xcb,0xac,0x37,0x4b,0x0a,0xce,0xf1,0xbd,},{0x43,0xe0,0x38,0x7d,0xa5,0xba,0x09,0xa1,0x90,0xf6,0xe7,0xb2,0x68,0x05,0x78,0xd8,0x89,0x76,0x9b,0xcc,0x44,0x5e,0x5e,0xf5,0x71,0xb4,0x92,0x87,0x1c,0x15,0x5c,0x5b,0x9f,0x62,0x0b,0xfa,0xcf,0xbf,0x2d,0xf1,0xfd,0x87,0x44,0x46,0x04,0xb7,0x1b,0x2e,0x23,0x7b,0xaa,0xa7,0xee,0x20,0x93,0xed,0xe4,0xa6,0x01,0xed,0xf8,0x83,0xe3,0x07,},\"\\x4a\\x08\\x24\\xfe\\x70\\xd4\\x31\\x54\\x13\\xd0\\xa0\\xca\\xfb\\xf4\\xf5\\xfe\\x11\\x7d\\x5e\\x07\\xe1\\xc3\\xa4\\xef\\xfb\\x9d\\x0a\\xe9\\x14\\x90\\x23\\x48\\x78\\xcc\\xf6\\x79\\x2a\\x91\\xf6\\x8c\\x6a\\x52\\x0d\\xe1\\x60\\x71\\xf0\\x8a\\xbe\\x35\\xdc\\x5e\\xa4\\x28\\xf1\\x95\\x7b\\x66\\x33\\x71\\xce\\x24\\xc6\\x09\\xdd\\x55\\xb8\\xf4\\x93\"},\n{{0xcf,0xa9,0xd9,0x16,0x4b,0x3c,0x4f,0x6f,0x72,0x26,0x35,0xd2,0x06,0x6c,0xd7,0xea,0x5e,0x55,0x33,0xd2,0xc7,0x4f,0x8a,0xdd,0x66,0x9c,0x37,0x1f,0xaa,0x47,0x64,0x26,},{0x41,0x16,0x9a,0x66,0xf9,0xa6,0x3f,0x28,0x57,0x82,0xa6,0xc2,0xdb,0x81,0xcc,0x3f,0x70,0xb3,0xad,0xa2,0x1a,0x68,0xc8,0x47,0x45,0xc8,0x8a,0x74,0xc3,0xb0,0xa2,0xde,},{0x01,0xd7,0xc9,0xb5,0x70,0x1a,0xf7,0x1e,0x2f,0x48,0x77,0xff,0xc9,0xb7,0xb5,0x30,0x5f,0x52,0x81,0x6d,0x44,0x58,0xe3,0x7e,0x41,0xc7,0x71,0x9f,0xac,0x1d,0x76,0xa0,0x1f,0xff,0x3f,0x50,0xfe,0x1a,0x58,0x75,0xcc,0xc3,0xfb,0x70,0x00,0x1c,0x94,0x7a,0x33,0xfc,0x8b,0x20,0x7d,0xe1,0x35,0x72,0xcc,0xdb,0x8b,0xa9,0x89,0x33,0xab,0x01,},\"\\x75\\x76\\x21\\xb1\\x67\\x5d\\xb7\\xca\\xce\\xf7\\xf2\\x78\\x25\\x87\\xff\\x3a\\xf5\\x1a\\x3e\\xf2\\xf4\\xbc\\xf9\\x27\\x9c\\x4c\\xe9\\x40\\x02\\xe1\\xf0\\x04\\x24\\xbf\\x0e\\xb6\\x21\\x98\\x2c\\xc8\\x5c\\xb4\\xd1\\x71\\xe5\\x64\\xa0\\xc2\\xf6\\xe3\\x56\\x7a\\x1a\\xae\\x2c\\xdd\\xb7\\xe9\\xb2\\x5f\\x47\\xdc\\x20\\xa5\\x10\\x50\\x54\\x29\\x69\\xca\"},\n{{0x1a,0xcb,0x4a,0x25,0x6c,0x2f,0x89,0x93,0xca,0x24,0xde,0x1e,0x00,0x14,0x60,0x6d,0x66,0x8b,0x5e,0x75,0x60,0x32,0xd2,0x69,0xf1,0xd2,0x4d,0x35,0x1c,0x8e,0xea,0x4a,},{0xcb,0xbd,0xcd,0x8c,0xbc,0x88,0x5a,0xb4,0x3a,0x05,0x7e,0x5f,0x95,0x79,0xf1,0x16,0x19,0x54,0x15,0x9e,0x7b,0x56,0x2e,0xa2,0x6c,0xd9,0xa4,0x3c,0x88,0xd3,0xf9,0x6d,},{0x05,0xaa,0x76,0xf7,0xfe,0x51,0x89,0x23,0x03,0xd7,0x89,0x14,0x71,0x59,0x95,0xe7,0xd7,0x68,0xff,0x77,0x14,0xce,0x27,0x0f,0x17,0x5e,0x56,0xaf,0x17,0xae,0x01,0x8d,0x3f,0xa9,0x39,0xf5,0xf6,0x20,0xde,0x82,0xbc,0xd1,0x54,0x96,0x87,0xb2,0x05,0xc7,0x87,0x12,0x03,0xe6,0x24,0x23,0x8c,0x4e,0x30,0x9f,0xab,0x7f,0x92,0xfb,0xaa,0x05,},\"\\xc4\\x6a\\x6d\\x61\\xaa\\x0a\\xed\\x1c\\x1d\\x85\\x47\\xa7\\x0b\\x89\\xb7\\x19\\x64\\x75\\xd5\\xa4\\x87\\x08\\x81\\xb1\\xec\\xd0\\xf0\\xcb\\x9c\\x74\\x5f\\x8a\\x2a\\xdc\\x80\\x24\\xe2\\xdc\\x55\\xb5\\x3a\\xa5\\xd3\\x83\\xa8\\x1a\\xab\\xc1\\xa4\\x7e\\x8d\\x07\\xd0\\x0b\\x7f\\x0b\\x56\\xce\\xdd\\xbf\\xb1\\xf4\\x24\\xbb\\x5c\\x02\\x18\\x46\\x78\\xa6\\x66\"},\n{{0xac,0xe3,0xc4,0x64,0x24,0x82,0x36,0x22,0x97,0x9f,0xc3,0xa8,0x4a,0x7d,0xa6,0x9c,0x1d,0x52,0x7d,0x83,0x12,0xe8,0xfb,0x01,0x83,0x75,0xbd,0x3a,0x96,0xc2,0x9c,0x18,},{0x93,0x7c,0xf3,0x41,0x36,0xd9,0xe1,0xcc,0xe0,0xde,0x11,0xb1,0x2c,0x70,0xcb,0xfb,0x74,0x55,0x44,0x84,0x21,0xe9,0x2c,0x82,0xe7,0xc4,0x09,0x34,0xbf,0xf8,0xc6,0x76,},{0xfe,0xb8,0x89,0x6d,0xd3,0xfe,0x60,0x01,0xff,0xea,0x17,0x1b,0x37,0xb7,0x88,0xa6,0x9f,0x7f,0x85,0x01,0x93,0xa6,0x34,0x06,0xf5,0x63,0x76,0xdd,0x26,0x3d,0x09,0x9a,0xef,0x80,0xec,0xe6,0x7e,0x2c,0x43,0xf4,0x0e,0xca,0x46,0x2c,0x6b,0x71,0xe7,0x94,0x06,0xb1,0x8d,0xb7,0x4a,0xe5,0xd4,0x98,0x44,0xe3,0xb1,0x32,0xbc,0x2a,0x13,0x07,},\"\\xa9\\xf1\\x37\\xbc\\x90\\x21\\xbf\\x10\\x5a\\xee\\x25\\xbe\\x21\\xcd\\x9e\\xe5\\xb3\\x54\\x7c\\xf1\\x0c\\xc5\\xf9\\x84\\x76\\xfb\\x58\\x8b\\xd7\\x0e\\x2d\\x6d\\x6b\\x08\\x34\\xe8\\x42\\xe4\\xee\\x94\\x30\\x3c\\xf9\\x6b\\x09\\xc1\\x71\\x53\\x81\\xb3\\x6e\\x14\\xa4\\x91\\xb8\\x0f\\x89\\x5e\\xa4\\x21\\xb8\\xec\\x2b\\x1d\\x3c\\x18\\x7e\\x02\\x93\\x5c\\x55\\x26\"},\n{{0x88,0xf6,0x81,0x93,0x4e,0x33,0xc3,0x5c,0x07,0xdc,0x6e,0x5a,0x83,0x29,0x42,0xae,0x3d,0x59,0x90,0x3c,0xcd,0xe2,0xf7,0x6c,0xcb,0x75,0x87,0xce,0xa7,0xec,0x41,0xb6,},{0x6a,0x4e,0x8a,0xa5,0xad,0xb6,0x3d,0x22,0xfd,0x7b,0x14,0xa2,0x6f,0xdb,0x03,0xb7,0xc8,0xaa,0x6c,0xcd,0x5a,0x19,0x6f,0x2c,0x54,0xb0,0x46,0x5a,0xdb,0x50,0x92,0xe1,},{0x45,0xb2,0x7b,0xf1,0xb9,0xea,0xc0,0x6b,0x62,0xb6,0x86,0xf6,0xd5,0x46,0x56,0x3b,0x2d,0xfe,0x5b,0x17,0x5d,0xbe,0xf3,0x2b,0xf7,0x8c,0x35,0xa1,0x6c,0x95,0x8a,0x9d,0x4f,0x26,0xd2,0x91,0xde,0x9b,0xb2,0x06,0x6c,0x0a,0x28,0x61,0x13,0xcc,0x09,0x17,0x2d,0x40,0xa3,0x6d,0x4c,0xbd,0x95,0x17,0x08,0x86,0x02,0x26,0xeb,0x30,0xcd,0x05,},\"\\x6e\\x8b\\xac\\x1f\\x85\\x3b\\x81\\xfe\\xf9\\x47\\x07\\xe1\\x8c\\xc6\\x1c\\x6f\\x0a\\x9c\\xbc\\x2a\\x41\\xd0\\x78\\xdc\\xc8\\x3f\\xc0\\x22\\x9c\\x7f\\x8d\\xbe\\x6d\\xbd\\xd9\\x08\\x54\\xb1\\xf1\\xae\\x2b\\x9f\\x2b\\x12\\x0b\\x86\\xa8\\x78\\x6b\\x4e\\x78\\xce\\x23\\xab\\x86\\xba\\xaf\\x88\\x75\\x4a\\xf0\\xf3\\xd8\\x88\\x81\\xda\\xe0\\xbc\\x52\\x61\\xbf\\xd0\\x38\"},\n{{0x48,0x05,0x0a,0x6e,0x01,0x58,0xf6,0xad,0x25,0x34,0x12,0xe4,0x49,0x7c,0xff,0x62,0xd5,0xee,0x55,0x5e,0xdf,0xfe,0x59,0xe4,0xdc,0x40,0x15,0x22,0x81,0x32,0x95,0xce,},{0x97,0x5e,0x01,0x0a,0xbb,0x9a,0x3e,0x56,0x65,0x91,0x37,0xb0,0x50,0x60,0x57,0xf2,0x83,0x98,0x2f,0x88,0x6c,0xa1,0x72,0xc7,0xbc,0x2c,0x50,0x0e,0xd9,0xbd,0x26,0xc1,},{0x72,0x16,0xab,0x60,0xc3,0x51,0x68,0x18,0x7d,0x0f,0xce,0x47,0x53,0xc8,0x6e,0x80,0x05,0x8d,0x54,0x0b,0x76,0xbf,0x95,0x84,0x3a,0x58,0x98,0x84,0x10,0x60,0xa9,0x9a,0x44,0xde,0x6f,0x43,0x96,0x25,0xa3,0xf6,0x36,0x5f,0x59,0xc3,0x77,0xbf,0x45,0x90,0x9b,0xbf,0xef,0x5c,0x50,0xb2,0x5f,0x31,0x94,0xe5,0xfb,0xd3,0x4e,0xa5,0xe7,0x06,},\"\\xed\\x6e\\xec\\x29\\xfb\\x70\\x49\\xdf\\xf7\\x07\\xf0\\xa4\\x42\\x6e\\xbc\\x8f\\x5b\\x35\\x0e\\x95\\x87\\x0b\\x9d\\x61\\x98\\xc8\\x13\\x9e\\x9c\\x3e\\x1e\\x40\\x99\\x37\\xd1\\xa8\\x58\\xa0\\xde\\xa4\\x82\\xa5\\xcb\\x1a\\x85\\x4e\\xd3\\xb5\\xa9\\x39\\x7a\\xcb\\x63\\xbf\\xf6\\xb6\\x40\\x39\\xef\\x2e\\xb1\\x15\\x9e\\x99\\x85\\x83\\x10\\xbb\\xbd\\x86\\x12\\x5c\\x3e\\x0e\"},\n{{0x18,0xd1,0x3d,0x0c,0x00,0xe8,0xe3,0x38,0x6a,0x5c,0xfb,0x30,0xa9,0xe7,0x9f,0xe8,0x8b,0x18,0x61,0xed,0x2d,0x12,0x01,0xeb,0x17,0x00,0x38,0xe1,0x94,0x77,0x04,0x03,},{0xa4,0xaf,0xc8,0x33,0x40,0x18,0x76,0x09,0x0d,0x9b,0x88,0x0c,0x41,0x26,0x7d,0x68,0xcb,0xbe,0xea,0xa3,0x8a,0xfb,0x20,0x88,0x4e,0x27,0x32,0x8f,0x3b,0x7f,0x53,0x5e,},{0x03,0x39,0x88,0x15,0x4c,0x5d,0x79,0xd2,0x51,0x0b,0xe8,0x3e,0x77,0x80,0x15,0xdf,0xe2,0xfb,0x85,0xb8,0x11,0x1f,0x7e,0xc1,0x39,0x91,0x8b,0x54,0x00,0xe3,0xd6,0x56,0xee,0x80,0xa9,0xf5,0xc9,0x07,0x2b,0x5b,0x46,0x7a,0x5c,0xc5,0xa5,0x7c,0xc8,0xad,0x10,0x62,0xb5,0xbf,0xf1,0x08,0x62,0xd9,0xd3,0x69,0xdd,0xe2,0xcc,0x96,0x67,0x01,},\"\\x91\\x0f\\x6c\\x27\\x2d\\xd9\\x79\\x31\\xac\\x47\\x31\\x0d\\x24\\x4c\\xad\\xb4\\x32\\x51\\x36\\x5e\\x02\\xba\\x9f\\x6a\\x5b\\x3c\\x32\\x26\\xbe\\x9d\\x7d\\x3a\\x74\\xa2\\xba\\x49\\x06\\xe8\\xe7\\x1a\\x4b\\xf3\\xd3\\x55\\x6e\\xbd\\xfc\\x66\\x6c\\xd6\\xb1\\x2f\\x20\\xc4\\xa0\\x08\\x34\\xb8\\x8f\\xbb\\x24\\x45\\x75\\x19\\x92\\x86\\xb0\\xb9\\x34\\x4c\\xf3\\x34\\xaf\\xf0\\x07\"},\n{{0x4a,0xdc,0x8c,0x28,0x64,0x6a,0x93,0xa8,0x17,0x29,0x3a,0x14,0xd2,0x9b,0x48,0xe2,0xc6,0xd7,0x12,0xa6,0x89,0x93,0x54,0x7a,0x5c,0x5e,0x4d,0x14,0x52,0xac,0xbc,0x3a,},{0x7f,0x40,0x47,0x36,0x28,0xf2,0x3f,0xc0,0xdf,0xf0,0x02,0x1a,0xfd,0x48,0x77,0x40,0xd4,0x91,0x6a,0x91,0x22,0xe6,0xc9,0x7d,0x36,0x43,0x3e,0x5e,0xbf,0x04,0xf8,0x8c,},{0x6d,0x3b,0x4e,0x90,0xec,0x40,0x83,0x11,0xf9,0xb1,0x5b,0x92,0x53,0xd3,0xd9,0x5c,0x5d,0x15,0x26,0x20,0xc2,0x60,0xd5,0x63,0x02,0x55,0x5a,0x88,0x04,0xa5,0x10,0x4b,0xa5,0xe8,0xd2,0x9e,0xe1,0x08,0xe7,0x64,0xa6,0x42,0x19,0x29,0x72,0x98,0xab,0x76,0x74,0xbb,0xca,0x78,0x4d,0xee,0x28,0x77,0x3b,0x34,0xe1,0x85,0xa3,0x86,0xc2,0x08,},\"\\x09\\xfb\\x55\\x01\\xf1\\x68\\x8f\\x80\\xa0\\xab\\x9e\\x22\\xd7\\x78\\xae\\x13\\x0a\\xca\\xf7\\x4d\\x7f\\x51\\x85\\xb4\\xda\\x19\\x8c\\x6b\\x9e\\xda\\xc4\\x30\\x2e\\x2b\\x75\\x3e\\x57\\x87\\x66\\xe1\\x7d\\x40\\x56\\xdc\\x40\\xd9\\x5c\\xf4\\xca\\x8b\\xcc\\x65\\x65\\x79\\x5e\\x97\\xd6\\x8b\\xcd\\xa7\\x9f\\xa7\\x7c\\x49\\x33\\x97\\x71\\x63\\x56\\x16\\x4c\\xaa\\xb5\\xd1\\x9c\\xfd\"},\n{{0xf2,0x6e,0x1c,0x84,0x69,0x7a,0x49,0x08,0x15,0x1b,0x44,0x7d,0xcf,0x6c,0x7c,0x7a,0x38,0xb0,0x40,0x81,0xdb,0x9e,0x7c,0x77,0x38,0xe6,0xfe,0xc9,0x00,0xbe,0xd0,0xc1,},{0xa8,0x6e,0x14,0x22,0xc1,0x23,0x5f,0xf8,0xe1,0xaa,0x08,0x34,0x70,0xd5,0xe4,0x22,0x88,0xcb,0x00,0x7a,0xb5,0x0e,0x79,0x5d,0xd0,0xb4,0xff,0x87,0x39,0x49,0x66,0xc4,},{0x44,0xf3,0x34,0x4b,0x95,0x66,0xc9,0xdf,0xd2,0x2d,0x61,0x98,0xe1,0xcb,0xf9,0x5d,0x9e,0x28,0xf2,0x98,0x2f,0xc7,0xf1,0x66,0xab,0x25,0xdd,0xa3,0x0c,0x46,0xf7,0x68,0xc5,0x58,0xe0,0x39,0x4f,0xb9,0xab,0x3e,0x1d,0x4d,0xb4,0xcf,0x48,0x7c,0x17,0x64,0x1a,0x13,0xf3,0xf4,0x89,0x39,0xe0,0xc6,0x48,0x27,0xa7,0x51,0x03,0xc5,0x74,0x06,},\"\\x54\\xed\\x47\\x60\\x6a\\x14\\x87\\xc2\\xf9\\x00\\xce\\xfb\\x6e\\x89\\x9d\\xba\\xf6\\xc3\\x1c\\xc8\\x8e\\xbe\\x35\\x58\\xb8\\x3b\\x93\\xf6\\xd4\\x22\\xc3\\x1e\\x88\\x8e\\x48\\xe5\\x20\\xee\\xae\\xdd\\x7e\\x55\\x4a\\x9c\\xd4\\x0c\\x2c\\x51\\x9d\\x53\\x3b\\x61\\x44\\xce\\xe4\\x84\\xc3\\x89\\xe9\\x76\\xb1\\xe4\\x02\\x2b\\x50\\xe7\\xdb\\xb8\\x7e\\xad\\x7e\\x54\\x1a\\x20\\x04\\xda\\xf7\"},\n{{0xcc,0x0c,0x33,0xf3,0xa8,0x6f,0x5a,0x17,0xd3,0x0c,0x18,0x6c,0xe0,0xf3,0xb7,0x40,0xba,0xfa,0x5f,0xe3,0xc7,0x09,0x0f,0x14,0x35,0x41,0xe2,0xb2,0xc1,0xe5,0x34,0xbc,},{0x96,0x7a,0x71,0xc7,0xcf,0x9b,0x82,0xcc,0x78,0xcb,0xe1,0x09,0x10,0x4d,0x8b,0x43,0x8a,0x8d,0x1f,0xd7,0x1d,0x26,0x0d,0x02,0x90,0x46,0xa9,0xa4,0x52,0x68,0x66,0xff,},{0xe2,0x77,0xb3,0xdd,0x65,0x5c,0x33,0xff,0x75,0xfa,0x92,0x0a,0xf1,0xfc,0xc8,0x59,0x40,0x1e,0x6c,0x7a,0x6e,0xf4,0xc6,0xbf,0xbf,0xac,0x50,0x69,0x63,0x8f,0x19,0xca,0x11,0x5b,0xaf,0x13,0xc0,0x9c,0x82,0xaf,0x79,0x3f,0xac,0xb6,0xab,0xd0,0xcd,0x58,0xe8,0x48,0x1b,0x08,0xc1,0xb6,0x8a,0xd7,0xa2,0x66,0x5c,0x4a,0x61,0x4a,0x28,0x06,},\"\\x19\\x44\\xe5\\xe1\\x55\\xd7\\x5e\\x0d\\x0b\\xe9\\x2e\\x1b\\xe1\\x4c\\xec\\x37\\x0a\\xd1\\x37\\x91\\xf2\\xbf\\xd4\\x0f\\x27\\x12\\x14\\xe9\\x4f\\xcf\\x21\\x3c\\x71\\xbc\\x20\\xd7\\xce\\x0c\\x75\\x84\\x42\\x1a\\xc4\\xef\\xc4\\x51\\x88\\x3c\\xc3\\xf4\\x95\\x6f\\x21\\xf7\\x3a\\x42\\x16\\x72\\x04\\x38\\xbc\\x38\\xff\\x2c\\xfd\\xf3\\x70\\x99\\x05\\xa5\\x0a\\x9d\\x94\\xb1\\xd9\\xe7\\x93\\x2b\"},\n{{0xf0,0xbc,0x97,0x93,0x75,0xa7,0x07,0x30,0x68,0xdb,0xa7,0xf6,0xc0,0x94,0xdb,0x65,0x98,0xb4,0xe4,0x5d,0xf7,0xd5,0x49,0x58,0x3c,0x22,0xfd,0xed,0x80,0x48,0xfa,0x2e,},{0xb4,0x2b,0x6c,0x57,0xa7,0x8f,0x1d,0x90,0x09,0x0a,0x71,0x81,0xab,0x2a,0xe0,0x9f,0x42,0x6c,0xbc,0x2b,0xe9,0x6e,0xb2,0xcf,0x27,0xab,0xc7,0x0d,0x7d,0x32,0xa4,0xb3,},{0x19,0xdb,0xc3,0x02,0x7f,0x9f,0xae,0x70,0x7d,0xeb,0x76,0xf5,0x88,0xf9,0xfd,0x07,0xaa,0x8e,0xae,0x29,0xbd,0x4e,0x1d,0x04,0xc2,0xc9,0x84,0x38,0x82,0x86,0xb3,0xb1,0x22,0x24,0x8a,0x6c,0x03,0xed,0x67,0xec,0xa3,0x5d,0xf4,0xdb,0x3d,0xc1,0xe4,0x23,0x7f,0x26,0x78,0x92,0x51,0x84,0x97,0xd9,0x55,0x2a,0x21,0xde,0x19,0xb5,0x14,0x0f,},\"\\x27\\xab\\x30\\x49\\xb5\\xc6\\x35\\x1f\\x6c\\xfe\\x38\\xb1\\x3a\\x05\\x9f\\x50\\x37\\x25\\x7e\\xe3\\xd6\\x5d\\x60\\x79\\x65\\x68\\x56\\xed\\xc8\\x76\\xea\\x08\\x1f\\xd8\\xa9\\x48\\x04\\x66\\xf8\\x83\\x94\\x78\\x08\\x84\\x66\\xf5\\x1e\\xcb\\xfa\\xf2\\xd6\\x5d\\xef\\x25\\xf0\\xc4\\xdd\\x8d\\x08\\x58\\x82\\x02\\x81\\x22\\x32\\xf5\\x79\\x45\\xdf\\x8a\\x6f\\xa1\\x61\\xed\\x8c\\x03\\x43\\xb5\\x83\"},\n{{0x30,0x22,0x97,0x5f,0x29,0x8c,0x0a,0xd5,0xdd,0xbe,0x90,0x95,0x4f,0x20,0xe6,0x3a,0xe0,0xc0,0xd2,0x70,0x4c,0xf1,0x3c,0x22,0x1f,0x5b,0x37,0x20,0xaf,0x4d,0xba,0x32,},{0xb8,0x45,0xbc,0xe3,0x8e,0x26,0xab,0x02,0x7b,0x82,0x47,0x46,0x3d,0x43,0x7a,0x71,0xbb,0xdd,0xca,0x2a,0x23,0x81,0xd8,0x1f,0xad,0x4c,0x29,0x7d,0xf9,0x14,0x0b,0xd5,},{0xae,0x14,0xa8,0x60,0xfa,0xd0,0x05,0x1b,0x3e,0xb7,0x2b,0x37,0x21,0xa8,0x2f,0x7b,0x95,0x46,0xb2,0x86,0x72,0x61,0xe2,0xb7,0xb6,0x38,0x97,0x9e,0x25,0x61,0xbd,0xeb,0x89,0xb6,0x00,0x76,0x8f,0x82,0x45,0x0a,0x66,0xc8,0xb0,0x48,0x12,0x83,0xfa,0x21,0xcb,0x6c,0x53,0xbd,0xe3,0x50,0xef,0xfb,0x68,0xa7,0xd1,0x11,0x4b,0xfd,0xb2,0x03,},\"\\x9a\\xa1\\x9a\\x59\\x5d\\x98\\x93\\x78\\xcd\\xc0\\x68\\x91\\x88\\x7e\\xf5\\xf9\\xc2\\x46\\xe5\\xf8\\x3c\\x0b\\x65\\x87\\x10\\x67\\x3e\\x4e\\x7d\\xb7\\x60\\xc7\\x63\\x54\\xc4\\xf5\\xd1\\xe9\\x0d\\xb0\\x4a\\x23\\xb4\\xfb\\x43\\x4c\\x69\\x38\\x45\\x93\\xd0\\x10\\xe3\\x12\\xb1\\x1d\\x29\\x9c\\x9f\\x97\\x48\\x2d\\xe8\\x87\\xce\\xcf\\xe8\\x2e\\xa7\\x23\\xbc\\xa7\\x9a\\x1b\\xd6\\x4d\\x03\\xef\\x19\\xee\"},\n{{0x0f,0x71,0x0b,0x6c,0x48,0x1f,0x71,0x44,0x95,0x89,0x75,0x33,0x12,0xef,0x64,0x93,0x2b,0x46,0x52,0xeb,0xe0,0xe0,0x75,0x97,0xf7,0xda,0x1c,0x4f,0x3d,0xcf,0xfb,0x80,},{0x69,0x73,0xff,0x29,0x32,0xcc,0xdd,0xfc,0x1d,0x16,0xc4,0xc0,0xda,0x50,0xc8,0xb2,0x9f,0xe6,0x45,0x2d,0x1e,0xe8,0x4d,0x52,0x06,0x4e,0xbf,0x3d,0x62,0x8d,0x40,0x3e,},{0x02,0xa8,0xd2,0x6a,0xee,0x11,0x42,0x0f,0xb4,0xf0,0x9d,0x11,0x63,0xe1,0x4b,0x86,0x7d,0xf7,0xc6,0xf6,0xc8,0xf8,0xdc,0x7a,0x78,0x03,0x46,0x59,0xf0,0x40,0x1c,0xad,0x0a,0xa9,0x03,0x97,0xef,0xdd,0x07,0x04,0xb7,0x98,0xdb,0x19,0x36,0x50,0x30,0x26,0xe2,0xa1,0xad,0xc2,0x97,0xe2,0x79,0x74,0xd4,0xbe,0x31,0x2a,0x37,0x53,0xf8,0x04,},\"\\x85\\xd8\\x57\\x44\\xad\\x55\\xe9\\xef\\x9a\\x65\\xca\\x91\\xe8\\x5c\\x8a\\x4f\\x80\\xe4\\xc5\\x8f\\x8e\\x4e\\x93\\x54\\xe8\\x33\\x98\\x60\\x98\\xb7\\xd9\\xfe\\x9f\\xdc\\x0d\\xed\\xb0\\xd7\\x5d\\x25\\x39\\xfb\\xa0\\x00\\x34\\xfc\\x0c\\x2e\\x84\\x34\\x4d\\x1e\\xda\\xa0\\x9d\\x4f\\x63\\xd5\\x54\\x6d\\x67\\x80\\x3d\\xd6\\xb5\\x4d\\xdc\\xc0\\xb1\\xd3\\xf2\\x58\\x2d\\xd7\\x52\\x89\\xe3\\x1d\\xe4\\x2e\\x69\"},\n{{0x7a,0x05,0xf1,0x21,0xf6,0x01,0x12,0xdd,0x16,0xfe,0xe8,0xc9,0x1b,0xc2,0xa1,0x14,0x79,0xf4,0xb6,0x7e,0xe3,0x34,0x56,0x04,0x2c,0x8d,0xe1,0x67,0xfc,0x58,0x80,0x17,},{0xb3,0xb0,0x5b,0xe9,0x89,0xce,0xa7,0x19,0x75,0x05,0xd4,0xb5,0x43,0x35,0xe5,0xe1,0xd7,0x7a,0x4b,0x52,0xba,0x72,0x82,0x60,0x4b,0xbc,0x1c,0xf6,0xc4,0xe8,0x7a,0x6c,},{0xd3,0x0c,0xe8,0xa3,0x22,0xb4,0x50,0xa2,0xfb,0x1a,0xfd,0x32,0x9c,0xec,0x85,0x59,0xcc,0xf1,0x12,0xbd,0x83,0x96,0x5f,0x9e,0xc4,0x73,0x62,0x70,0xa0,0x91,0x4e,0x06,0x11,0x96,0xbf,0x52,0x09,0x77,0x8c,0x9f,0x8c,0xcf,0x39,0xc4,0x66,0x8b,0xbf,0x0e,0x13,0x63,0xf8,0x1a,0xfe,0x45,0xdd,0x74,0xe8,0x0d,0x58,0x75,0xdd,0xbf,0x6f,0x01,},\"\\xd9\\xc5\\x9e\\x8c\\xc4\\xed\\xe5\\x37\\xbe\\x21\\x22\\xab\\x49\\x2a\\x5b\\x91\\x5a\\x9b\\x0a\\x11\\x4b\\x2a\\xde\\x35\\x6f\\xc0\\x45\\x7e\\xf9\\x87\\x22\\xd5\\xf5\\x67\\xb8\\x62\\x11\\xe2\\x83\\x69\\xd1\\x41\\x68\\xec\\x4a\\x3c\\x80\\x40\\x76\\xe1\\x54\\xad\\xc7\\x0a\\x66\\x8c\\xf6\\x4a\\x20\\xd1\\x3c\\xf1\\x90\\xd1\\x15\\xcd\\x68\\x8d\\x03\\x6e\\x46\\x93\\x82\\x51\\xdf\\x49\\x64\\xdc\\x35\\x17\\xb1\\x0c\"},\n{{0xbf,0x38,0x1f,0x8d,0xfb,0x5d,0x0c,0x6d,0x64,0xe4,0x16,0xac,0x23,0xe0,0xd0,0xfc,0xb8,0x6e,0xbb,0x89,0x9b,0x1d,0x14,0x6a,0xbd,0x91,0x1b,0x92,0xa7,0x80,0x8e,0xb6,},{0x86,0x3f,0xad,0x8d,0x1f,0x1b,0xc6,0x30,0xa1,0x5f,0x6f,0xe8,0xec,0xef,0xe6,0xb4,0x49,0x7b,0x60,0xb2,0x1a,0xe8,0x83,0x0d,0xa4,0x67,0x42,0x04,0x5f,0xef,0x15,0x6f,},{0x99,0xb7,0x53,0x78,0x73,0x8f,0xca,0xc8,0x06,0x76,0x69,0xe8,0x50,0x9b,0x5d,0x26,0x07,0xe1,0xef,0x76,0xaf,0x90,0x04,0xe1,0x3f,0xe5,0xd3,0x93,0x2d,0xf6,0x0b,0x16,0x82,0x16,0xf5,0x85,0x65,0x34,0x0f,0xa4,0xd6,0x38,0x05,0x5a,0x89,0x04,0x4e,0xe7,0xd4,0x5e,0x2b,0xd0,0x82,0xa5,0x33,0x82,0x28,0x9a,0x34,0x70,0x06,0x48,0x98,0x0e,},\"\\x86\\x54\\xf2\\xf5\\xc6\\xdc\\xd2\\xcf\\xcb\\xb6\\xed\\x8d\\x2b\\xc5\\xfb\\x5f\\xec\\x53\\xe3\\xef\\xfb\\x0d\\xe6\\x5a\\xac\\x50\\x7f\\xa5\\x6c\\x89\\x77\\x32\\x39\\x5a\\xa0\\x99\\x46\\xd3\\xb6\\x58\\x6a\\x92\\xed\\xd6\\xdc\\x99\\x31\\x5e\\x1b\\xa7\\x4c\\x6a\\x02\\x47\\xc4\\xba\\x77\\x60\\xb9\\x48\\xeb\\x3c\\x09\\x32\\xd9\\xfe\\x1f\\x0e\\x9f\\xea\\x6e\\xb6\\x1a\\x54\\x8a\\x9a\\xb4\\x8f\\xfd\\xf1\\x54\\x73\\x29\"},\n{{0x36,0x98,0x32,0x41,0xa0,0xa8,0xe6,0x0c,0xe0,0x2a,0x61,0xb3,0xfa,0xfa,0xb1,0x5a,0x73,0x13,0xa5,0xa2,0x70,0xd0,0x15,0xb9,0xc9,0xec,0x07,0x0d,0xc4,0x2d,0xee,0xda,},{0x66,0x47,0x98,0x4d,0x42,0xb9,0xa5,0xb3,0xb1,0xaf,0xa3,0xb7,0xf8,0xf4,0x9d,0x4c,0x2b,0x05,0xe3,0x89,0x84,0xe9,0x9c,0xea,0x8f,0xd6,0x82,0x35,0xd2,0xae,0x46,0x27,},{0xee,0x37,0xdf,0x8a,0xf4,0x22,0xf9,0x1f,0x85,0xdf,0xe4,0x3e,0xfe,0x79,0xf6,0x23,0x78,0x06,0x8c,0xcd,0xba,0xf3,0x91,0x6e,0xec,0xbc,0x3a,0xdf,0xed,0x05,0x08,0xbd,0xeb,0xaf,0x5c,0xe0,0x6b,0x3b,0xc2,0x79,0xf7,0x80,0x87,0xf0,0xdb,0x8d,0xb3,0xc6,0x82,0x3e,0xdf,0xb3,0x2c,0x12,0x21,0x78,0x30,0xbe,0x72,0x3d,0x88,0x72,0xb3,0x0c,},\"\\xce\\xbb\\x9e\\x40\\x44\\x51\\x81\\x82\\x53\\xc0\\x39\\x2a\\x45\\x54\\xee\\x73\\x23\\xc5\\xd5\\xb8\\xb2\\x26\\x77\\x57\\x00\\xb8\\x06\\xed\\x5b\\x91\\x33\\x79\\x16\\xea\\x7e\\xcb\\xc3\\xd4\\x10\\x3f\\xc6\\x5e\\x53\\x72\\xae\\x7e\\x5f\\x9b\\xa2\\xd8\\xf5\\xae\\xe2\\x4c\\xcf\\x6e\\x63\\x1a\\xe2\\x0c\\x4a\\xf9\\xb5\\xf7\\x28\\xcd\\xf8\\x9e\\x81\\x89\\xde\\xf1\\xa5\\xb3\\xd3\\x53\\x47\\xaa\\x20\\x35\\x25\\xea\\x1d\\x2e\"},\n{{0xd0,0x68,0x99,0xf9,0x3a,0x40,0x8d,0xac,0xb4,0x1c,0x96,0x97,0x18,0x34,0x6f,0x1e,0x28,0x9b,0xb5,0xea,0x65,0xe2,0x83,0xff,0x79,0xc7,0x05,0xa0,0x74,0x51,0x7c,0x35,},{0x46,0xbf,0x2a,0x08,0xa0,0x76,0xc4,0x7d,0x7f,0x11,0xb7,0x33,0xf8,0x14,0x1c,0x35,0x53,0x63,0xed,0x85,0xd7,0xde,0xf2,0x6b,0xa6,0xa0,0xce,0x15,0xac,0x5f,0x2b,0xe8,},{0x6f,0x89,0xde,0x92,0xa6,0x6b,0xc5,0xf4,0x14,0x43,0x39,0x12,0x49,0x50,0xbd,0xf5,0x88,0x14,0x4c,0xb3,0x72,0xf6,0x73,0x62,0x45,0x35,0x1c,0x94,0x76,0xbe,0xcc,0x59,0xa2,0x58,0xf9,0xa9,0x33,0xff,0xff,0x2b,0xef,0x4b,0x46,0xcd,0x10,0x57,0x39,0x52,0x25,0x79,0x9f,0xd0,0x9d,0xed,0xe6,0x82,0x3d,0xb0,0xe3,0x25,0xdb,0xc8,0x14,0x0d,},\"\\x08\\x64\\xc3\\x9a\\xc4\\xfd\\xa8\\xeb\\x90\\x48\\x59\\x7b\\xd4\\x0b\\xe0\\x40\\x10\\x21\\xfd\\x2d\\xd3\\xa3\\x39\\x0a\\x8f\\xac\\xce\\x98\\x4b\\x26\\x0a\\x13\\xfa\\x2c\\x7c\\xfc\\x00\\xd1\\x92\\xfa\\xdf\\x13\\x4a\\x0a\\xd5\\xa1\\x81\\xee\\x89\\xef\\xf0\\xc7\\x95\\xea\\xa0\\xfb\\xfe\\x2f\\x3b\\x26\\x11\\x5d\\x07\\x16\\x8d\\xb4\\x2e\\xd2\\x1a\\x51\\x30\\x3b\\x19\\x58\\xe4\\xa4\\x2d\\xc0\\x65\\xb2\\x2c\\xe4\\x8f\\x17\\xa6\"},\n{{0xee,0xbc,0xa7,0x96,0x69,0x70,0xee,0x9f,0x2c,0xc4,0xd7,0x4c,0x6f,0x1d,0x8e,0x0e,0xbf,0xf7,0xc4,0x5a,0xeb,0xad,0x34,0x9f,0xb9,0xf8,0x6d,0xf6,0x28,0xdf,0xff,0x0e,},{0x89,0x10,0x1e,0x03,0x09,0xf7,0x67,0xe6,0x4a,0xe9,0xc9,0x8c,0x4a,0x5d,0x8d,0x23,0x28,0xfb,0x3e,0xf2,0x62,0xd0,0x82,0xf4,0x9b,0x64,0xca,0x20,0x9e,0x19,0x90,0xf6,},{0x7d,0x44,0x7e,0xe5,0x32,0x8c,0x9f,0xe7,0xf1,0x19,0x36,0xcc,0x42,0x99,0x87,0x54,0xa5,0x6c,0xd1,0xd2,0xa6,0x95,0x1a,0xf4,0xfe,0xe7,0xc4,0xa8,0xeb,0x31,0x9d,0x49,0x23,0x70,0x7c,0x79,0x3c,0x55,0xd7,0x90,0x67,0xf8,0x22,0xd5,0xb1,0x6b,0xb5,0x77,0x6e,0x38,0xdf,0xfa,0xbc,0x67,0x23,0x7a,0x91,0x6a,0x81,0xa6,0x33,0x39,0xb0,0x03,},\"\\x0f\\xac\\x79\\x0a\\xdb\\x9f\\x59\\xe5\\xcb\\x0d\\xdc\\xb2\\xb6\\x67\\x17\\x2f\\x2a\\x21\\x03\\x4d\\x93\\xbc\\xad\\xdf\\x18\\x86\\x06\\xfa\\x9e\\x77\\x6d\\xb3\\x3a\\x8f\\xcc\\x6b\\xd7\\xf5\\x56\\x78\\x83\\xfc\\x0d\\xe3\\x51\\xaa\\x9a\\xfa\\xa3\\x6d\\x20\\x75\\xb1\\xba\\x85\\x3b\\xad\\xa8\\x49\\xb8\\x66\\x1d\\x5c\\x81\\x54\\xe7\\xb0\\xaf\\xea\\x65\\x6d\\xd1\\x5e\\x01\\xa9\\xc5\\xba\\x21\\x58\\x9b\\x02\\xf8\\xfc\\x54\\x81\\xc2\"},\n{{0x38,0x20,0xb6,0xb1,0x59,0x39,0xd0,0xaf,0xe1,0x8c,0x9c,0xb3,0xd9,0xa2,0xa0,0x8f,0x16,0x7d,0xd4,0x58,0xeb,0x6c,0x7e,0x3f,0x15,0x58,0xb0,0xc6,0xdb,0x4c,0x68,0x90,},{0x80,0xb8,0x5c,0x65,0x59,0xfe,0xa8,0xb4,0x00,0xe1,0x99,0x9c,0xc5,0xbf,0xed,0x50,0x7a,0xd7,0xfc,0x29,0x4c,0xd9,0xba,0x0c,0xe2,0xdd,0x25,0x84,0xa9,0x10,0x89,0xb0,},{0x82,0x3e,0xe2,0xc0,0xc8,0xd8,0x7f,0xaa,0x0e,0xc0,0x14,0x1e,0x9c,0xe0,0x8b,0x51,0xe5,0x7c,0x83,0x97,0x92,0xd1,0xfb,0xd9,0x7a,0x96,0x72,0x07,0xfd,0x41,0x58,0x49,0xeb,0xfb,0x5d,0xad,0xb5,0xa1,0xdc,0x2c,0x0a,0x8b,0x7f,0xc6,0x3f,0xc3,0x54,0x85,0x7b,0x8c,0x90,0xc4,0x47,0x20,0xe1,0x3f,0x45,0xcd,0x01,0xe7,0xaa,0x23,0x14,0x0c,},\"\\x3e\\x5a\\xd9\\x2d\\x44\\xb4\\x0e\\x86\\x14\\xd8\\x08\\x7c\\x9c\\x74\\x3d\\xe0\\xc0\\x86\\x1a\\x07\\xf1\\xf5\\x14\\x6d\\x71\\xca\\xc2\\xf3\\x74\\x00\\x24\\xe8\\x41\\xcc\\x2d\\x46\\x02\\x7c\\xf5\\xd2\\x61\\xd3\\xee\\x7c\\x18\\x75\\xb3\\x95\\x51\\x01\\x7b\\x5f\\xb1\\x46\\x81\\x14\\xfc\\x3e\\x09\\x8a\\x89\\x9c\\xdb\\xd5\\x58\\xb3\\x9f\\x09\\x8e\\x15\\x6b\\x6e\\x98\\x01\\xeb\\xcd\\xd6\\x5f\\xed\\x56\\xdb\\xfc\\xaf\\x2c\\x8c\\x78\\x7b\"},\n{{0x0d,0x20,0xfa,0x4a,0x37,0xff,0x30,0xc4,0xdc,0xc3,0xe4,0x4e,0xa7,0xac,0x50,0x11,0x37,0xe5,0x80,0x7e,0x97,0x81,0x33,0x0a,0xc3,0x10,0x98,0x2c,0xc3,0xd3,0x9d,0xbd,},{0x67,0xbb,0x0a,0x01,0xbc,0x86,0x17,0xb4,0x91,0xef,0xf1,0xa3,0x26,0xc1,0xc7,0x0f,0x7d,0x0c,0x5b,0x95,0xa5,0xad,0x48,0x24,0x1a,0xed,0xce,0x1c,0x6f,0x08,0x83,0xcf,},{0xde,0xab,0x12,0xed,0x82,0xba,0x94,0xb4,0x69,0xca,0x98,0xb6,0x6f,0xa2,0x04,0x44,0xb4,0xb7,0x88,0x1c,0x4f,0x0f,0x85,0x34,0x09,0xc9,0xa1,0x50,0x4a,0x5b,0x2b,0x6d,0x78,0x60,0xf2,0x6a,0xda,0x6b,0xf7,0x34,0x59,0xb9,0xcd,0xb5,0x73,0xc8,0x01,0x71,0x21,0x33,0x8e,0xfa,0x60,0xf4,0x14,0x80,0x86,0xd7,0xa3,0xa8,0xed,0x59,0xbb,0x07,},\"\\x35\\xe0\\xf4\\xb4\\xa5\\x17\\xf9\\xc7\\xaa\\x45\\x14\\xf0\\x3e\\x6d\\x65\\xf1\\x9b\\x27\\xc6\\x2c\\xc0\\x69\\xf6\\xbf\\x07\\xdd\\x63\\x78\\xbd\\x6a\\xfe\\x2b\\x76\\x65\\x60\\x00\\x6c\\xbd\\x57\\x30\\xa0\\x09\\x19\\xed\\x11\\x19\\x1f\\xb0\\xc8\\xda\\xc5\\x6e\\x15\\x3f\\xc1\\xce\\xa4\\xbd\\xce\\x50\\x46\\xcc\\xcb\\x71\\x77\\x59\\xa4\\x08\\x3e\\x1c\\x16\\xf7\\x40\\x76\\x32\\x64\\xcc\\x80\\x4d\\xe0\\xd0\\xe1\\xa4\\xb5\\xa2\\x30\\x67\\xaf\"},\n{{0xbe,0xe1,0x61,0x88,0x1d,0x81,0x9b,0x37,0x0d,0x24,0x0d,0x50,0x9b,0xa4,0x6b,0x06,0xfb,0x82,0x8e,0x20,0x31,0x0d,0x9f,0x6b,0x30,0x97,0x80,0x70,0x3e,0x98,0x92,0x7b,},{0x10,0x85,0x43,0x80,0xde,0x89,0x16,0x2b,0xfb,0x9f,0x78,0x35,0xa2,0x71,0x6a,0x3a,0x6e,0x02,0x65,0x67,0x1b,0x25,0x0b,0x38,0x9d,0x01,0xc3,0xbc,0xc0,0x37,0x36,0xb8,},{0xb0,0x7d,0x07,0x2e,0xb3,0x83,0x1f,0xae,0x8a,0x06,0xef,0xfa,0x92,0x01,0x79,0x74,0x96,0xdc,0xe1,0x26,0xb8,0xe1,0x1f,0xef,0x2f,0xa0,0x7f,0x66,0x4d,0xc5,0xcf,0x3d,0x4b,0xf9,0xc3,0x8a,0x8b,0x3c,0x09,0xfb,0x5f,0x14,0xfa,0x2d,0xeb,0x21,0x9e,0x7d,0x85,0x2f,0xdd,0x27,0xc7,0xba,0x32,0xd3,0x09,0x94,0x2f,0x27,0x46,0xdf,0xe4,0x04,},\"\\x5a\\x6f\\xe5\\x99\\xb6\\xb0\\x9b\\x05\\xc0\\xba\\x6a\\x62\\x2d\\xf3\\xa9\\x2b\\x3d\\x37\\x6d\\x24\\xd0\\x4e\\xa8\\x5e\\xbe\\x76\\x7b\\xc2\\xec\\x4d\\x14\\xe8\\x3e\\x69\\x37\\xdc\\x0b\\x91\\x4b\\x48\\x09\\xfd\\xb6\\x07\\x90\\x68\\x41\\xa6\\xfd\\x1d\\xcd\\xf6\\x1a\\xae\\xa8\\xf9\\xbb\\x81\\xb2\\xcc\\xaa\\x32\\xdf\\x41\\x29\\x89\\xae\\x53\\x64\\x66\\x80\\xa7\\x1a\\x21\\x1c\\x84\\x40\\xea\\xb0\\xf1\\xae\\xc5\\xe4\\xfc\\x00\\xe6\\xa2\\xc9\\x6d\"},\n{{0x70,0x15,0x0e,0x95,0x16,0x16,0x4a,0x3d,0x7b,0x7e,0x8b,0x6f,0x25,0x5b,0x65,0xca,0xc9,0xf0,0x74,0x59,0xb3,0x2d,0x11,0xbb,0x94,0xb3,0xd2,0x77,0x20,0x8a,0xbc,0x99,},{0x23,0x28,0xbe,0xc8,0xe4,0x03,0x51,0x04,0x78,0x82,0xe8,0xb4,0x3b,0xc1,0xab,0x08,0x53,0x86,0xfa,0x47,0x98,0x7e,0x46,0xea,0x87,0x60,0x88,0x14,0xc5,0xda,0x71,0x3c,},{0xed,0xa3,0xf5,0x03,0x3e,0xa7,0x95,0x3a,0x0d,0x58,0x3c,0x64,0x57,0x52,0x2e,0x84,0xad,0x78,0x44,0x53,0x04,0xd4,0x8e,0x57,0x7d,0x4d,0x69,0xe8,0x64,0x1f,0xeb,0xe1,0x52,0x48,0xd8,0xd9,0x0c,0xe0,0x94,0x4a,0x8f,0x80,0x1d,0x39,0x09,0x9b,0xc7,0x74,0x94,0xba,0xc4,0xce,0x2a,0x20,0xb3,0x83,0x69,0xc6,0xad,0xfb,0x71,0xe0,0x3d,0x0f,},\"\\x77\\xbe\\x8e\\xce\\xaa\\xb4\\x31\\xa1\\x3c\\x2a\\x28\\xd0\\xd1\\x55\\x64\\x89\\xd8\\xc3\\x92\\xfd\\x7a\\xe4\\x11\\x57\\xf7\\xca\\xf0\\x82\\xcb\\x54\\xe4\\x5f\\x08\\x62\\x6b\\xe0\\x07\\x6b\\xe8\\x44\\xd3\\x8f\\xde\\x90\\x1a\\x5e\\xab\\x0e\\x88\\x32\\xd6\\x9d\\xac\\x22\\xfb\\x85\\x07\\xfb\\x8e\\xc4\\xfa\\xf7\\xc8\\x8f\\xd2\\x6d\\xa3\\x08\\x46\\x1a\\xfe\\x38\\x59\\x87\\x97\\x2b\\x5e\\x76\\x0a\\x34\\xa5\\xe1\\x8b\\x9a\\x82\\xb4\\xaa\\xa5\\x29\\xb7\"},\n{{0x3f,0x87,0xfc,0xfd,0xb4,0x21,0x42,0x2a,0x9c,0x5f,0xb9,0x82,0x68,0x31,0x3c,0x15,0x12,0x8c,0x78,0x84,0x4e,0xf9,0xeb,0x3b,0x37,0x13,0xfa,0x77,0xb6,0x71,0x89,0x03,},{0x53,0x3e,0xc5,0x92,0x28,0x37,0x4b,0xd0,0x3a,0x46,0x99,0xe3,0xa8,0x89,0x6b,0x86,0x18,0x2f,0xcf,0x8f,0xc3,0x08,0x5f,0xdb,0x8f,0x5c,0x46,0x71,0x52,0x4d,0x6f,0xe0,},{0xf6,0x51,0x9d,0x7e,0xdb,0x61,0x34,0x11,0x19,0x74,0x03,0x3f,0x03,0xb8,0xd8,0x9e,0x9c,0x76,0xca,0xec,0x89,0x65,0xa8,0xe1,0x7c,0xd4,0x5f,0xff,0x19,0xde,0x26,0x15,0xd7,0x3e,0xcc,0xdb,0x4a,0x66,0x64,0xa8,0xf0,0xe2,0x3a,0xdf,0x98,0x98,0x8e,0x96,0x25,0x1b,0xf2,0x6e,0xb7,0xa4,0xcc,0xaa,0xc1,0x07,0x9f,0x0a,0x77,0x2f,0x9b,0x05,},\"\\xc0\\x0f\\xed\\x2d\\x68\\x94\\x68\\xbc\\xba\\xcc\\xcd\\x44\\x6e\\x8d\\x8f\\x29\\x9e\\x2a\\x86\\x92\\x5e\\x62\\xe5\\x97\\x09\\xaf\\xaf\\x48\\x57\\x46\\x9f\\xf1\\xe0\\x06\\xd0\\x0f\\xa3\\xe1\\x8a\\x36\\x15\\xf8\\xf0\\x6b\\x6e\\xbd\\xff\\x78\\x5d\\xde\\x58\\x85\\x1d\\x2c\\x23\\x90\\x38\\xa0\\xc3\\x44\\xdc\\xe9\\x85\\xbd\\x1f\\xc8\\xde\\xb4\\x77\\x9a\\xe5\\xf8\\x93\\x2e\\x2f\\x9e\\xd5\\x99\\x0b\\x64\\x72\\xdb\\xe4\\xe6\\xfe\\xf6\\x91\\x76\\x57\\xe0\\xb5\"},\n{{0x44,0xce,0xef,0x04,0x4f,0xf9,0x98,0xd4,0xab,0xea,0xaf,0x37,0x4e,0xb4,0x1d,0x08,0x67,0x18,0xb6,0x30,0x97,0xb1,0xe3,0x5f,0x89,0x63,0x4c,0x14,0x89,0x71,0x32,0xea,},{0xe8,0x3c,0x86,0x67,0x7d,0x03,0xed,0x3a,0x5e,0x8c,0x95,0xf4,0x1f,0x0b,0x32,0x5f,0xf4,0x33,0x37,0x02,0xf2,0xff,0x69,0x36,0xf5,0x7f,0xf3,0x0a,0xa3,0x14,0x85,0xc7,},{0x55,0x45,0x52,0xd6,0xb7,0x90,0xd4,0x21,0xd0,0x6b,0x0a,0x67,0xf8,0xe0,0x02,0xad,0x7a,0x1e,0xd0,0x1c,0x06,0xcf,0x00,0xcb,0xea,0xec,0x2a,0x26,0x8b,0xda,0x29,0xf1,0x18,0x3f,0x0c,0xea,0xfc,0x62,0x5f,0xa5,0xfd,0xb8,0x47,0xdc,0x86,0xfa,0xe1,0xa2,0x04,0x06,0xe4,0x59,0xd4,0xa0,0x17,0x7c,0xb5,0x15,0x22,0x0a,0x56,0x8e,0x08,0x00,},\"\\x8d\\x3e\\x2d\\xec\\x46\\x44\\xc7\\xb5\\x16\\x33\\xb1\\x3e\\x63\\x75\\xca\\x42\\xff\\x91\\x38\\x46\\x5f\\x43\\xd7\\x80\\x0c\\x73\\x13\\x19\\x9f\\x67\\xc9\\xcf\\x1b\\x52\\x0b\\x18\\x20\\xbd\\x63\\x0e\\xcf\\x1c\\x99\\x2e\\x27\\x67\\xb3\\x8e\\xb5\\xbb\\xc4\\x41\\xa4\\xab\\x8d\\x31\\x7d\\xb4\\x41\\xdb\\x35\\xa0\\xfe\\x3a\\xbe\\x7a\\x9e\\x45\\x41\\x88\\x1c\\x2d\\x7b\\x1a\\x26\\x12\\x30\\x69\\x59\\x81\\x5d\\x1d\\xa4\\x12\\x67\\xd9\\x64\\x9d\\xd4\\x49\\x4a\\xce\"},\n{{0x98,0xef,0x2a,0x44,0xd4,0xc8,0x47,0x6d,0xff,0x05,0xaa,0x78,0xdc,0xf9,0xc6,0xdc,0x08,0x6c,0xb2,0xf6,0x22,0xa0,0x67,0x45,0xd6,0x0c,0xbf,0x22,0x3f,0xaa,0xba,0x66,},{0x42,0xfd,0xb1,0xda,0xa3,0x9f,0x01,0x59,0x11,0x9b,0xee,0xc1,0xbe,0xdf,0x6f,0x03,0x94,0xb2,0x6a,0x2a,0x29,0xbd,0x1f,0xde,0x08,0x1e,0xcc,0xda,0xde,0xcc,0x22,0x6a,},{0xab,0x5e,0x87,0x24,0xa3,0xe6,0xff,0x76,0x05,0x8c,0xfb,0x21,0x4d,0x57,0x4e,0x04,0xd0,0x55,0x74,0xec,0xdd,0x4f,0xfe,0x8c,0x07,0xc7,0xaf,0x39,0x6e,0x88,0x26,0x87,0xc5,0xd7,0x9e,0xf1,0xe6,0x2f,0xbb,0x4c,0x5f,0x1b,0xd0,0x6b,0x9b,0xd8,0x97,0x82,0x6e,0xdd,0xe0,0xd1,0x11,0xd9,0x18,0xe8,0xef,0x96,0x1f,0xf2,0xa0,0x0d,0x77,0x00,},\"\\xc8\\xb5\\xfc\\xfc\\x3c\\x18\\xc7\\xd9\\x59\\x57\\xb6\\x68\\xe9\\x1c\\x73\\x1d\\x50\\xc7\\xfc\\xea\\x4f\\x95\\x75\\xbb\\xf7\\x84\\x62\\x58\\x70\\xe2\\x38\\xdf\\x54\\x6e\\x2c\\xb1\\xa1\\x9d\\x28\\x08\\xdd\\x5b\\x23\\x0d\\x38\\x71\\xfd\\xec\\x16\\x10\\x0e\\xe1\\xfb\\xf9\\xb7\\x22\\xfa\\x37\\x44\\xa7\\x50\\xa3\\xb3\\x96\\xb0\\x5f\\x9c\\x21\\xb8\\xc0\\xf6\\x1e\\xad\\x57\\xa7\\x8c\\x5e\\xcf\\x72\\xb5\\x79\\xcf\\xe8\\x8a\\x3f\\x40\\x4c\\x8a\\xcf\\x52\\x4f\\x9a\\xb9\"},\n{{0x93,0xa8,0xc7,0x92,0xa2,0x39,0xc9,0x31,0x91,0x7c,0x11,0x48,0x24,0xa0,0x17,0x4f,0x8b,0xc4,0xeb,0xbf,0x98,0xaf,0x8c,0x7e,0x32,0x1e,0x0f,0x5b,0xea,0x40,0x15,0xec,},{0x9b,0x2e,0xaa,0x8a,0x9c,0x2c,0x25,0xff,0x4f,0x6e,0x13,0xbb,0x12,0xba,0xe5,0xd0,0x6f,0xda,0x0e,0xb1,0x10,0x5f,0xaf,0xae,0x58,0x80,0xff,0x16,0x87,0x40,0xbb,0x74,},{0xcf,0xe3,0x2c,0x44,0x35,0xd9,0x11,0xd7,0x72,0xdc,0x07,0x27,0xe7,0x8d,0x68,0x9d,0x01,0x64,0xc5,0x06,0x95,0x97,0xcb,0x44,0x1b,0x22,0xc1,0xd2,0x62,0x36,0x47,0x9f,0x1a,0xfd,0x70,0x89,0x12,0x1b,0x9a,0xb4,0xf6,0x1b,0xbb,0x1f,0xae,0x1a,0xb4,0x2f,0x76,0x35,0xa9,0x2a,0x53,0x78,0x4d,0x71,0x70,0x91,0x6b,0x70,0x3a,0xa5,0xcc,0x09,},\"\\x90\\x1b\\xf4\\xe0\\x41\\xca\\xf1\\x6e\\x04\\xf2\\xff\\xde\\x8d\\x6f\\xe9\\x7e\\x93\\xd0\\x90\\x0f\\x6b\\xc0\\xfc\\x09\\xa9\\xa0\\x17\\x9d\\x13\\x7b\\x4b\\x77\\x88\\xe5\\x7e\\xb9\\x27\\x66\\xa9\\xc6\\x34\\xf3\\x5a\\xdb\\x5c\\x29\\x88\\xaf\\x1e\\x86\\x20\\x8f\\x46\\x19\\x98\\xf5\\x9c\\xfe\\xc9\\x92\\x04\\xb4\\x84\\xfb\\xca\\xd3\\x95\\x1e\\x7e\\xe4\\x40\\x55\\x23\\x70\\x5d\\x97\\x39\\xb4\\x43\\x07\\xdb\\x03\\xf7\\x13\\xfd\\xa7\\x8d\\xb4\\x21\\xef\\x31\\x21\\xb3\\xba\"},\n{{0x70,0x01,0xfa,0x0c,0x44,0x04,0xc2,0x8a,0xa5,0xb5,0xfc,0xff,0x30,0xa9,0x61,0xf2,0x1a,0x22,0xf5,0xb8,0x5a,0x9e,0x38,0x2e,0x07,0xae,0xa8,0xa8,0x92,0x4d,0x0e,0xc1,},{0xda,0xeb,0xb6,0x3c,0x4d,0x8f,0x40,0xce,0xba,0x8e,0xc3,0x5e,0x3d,0xd9,0x46,0xa6,0xb7,0x5b,0xc7,0x4f,0xcb,0x29,0xad,0xe7,0xb5,0x5e,0xee,0x3c,0xc3,0xae,0xa5,0xca,},{0x64,0xea,0xc9,0xce,0x87,0x46,0x06,0x18,0x63,0x6b,0x41,0xfd,0x2d,0xec,0xc1,0x67,0x3b,0xfc,0x48,0xc5,0xf4,0x79,0xdf,0xac,0xb5,0x1e,0x86,0x68,0x64,0x07,0x37,0x4b,0x1d,0x10,0xbf,0x65,0xd6,0xd7,0x47,0x42,0x14,0xd7,0x77,0x0c,0x9e,0x5c,0x7f,0x80,0x6c,0x80,0xd5,0x3d,0x48,0xb7,0x20,0x87,0x0e,0x5e,0x78,0xf3,0x2e,0x3a,0x7e,0x05,},\"\\x44\\xf4\\x8c\\xfb\\x02\\xf0\\x87\\x77\\xa5\\x78\\x73\\x85\\x5f\\x96\\xbe\\x4c\\x02\\x91\\x32\\x3f\\x27\\x39\\xb2\\x75\\xd9\\x07\\x57\\xa1\\x54\\x72\\xe5\\x75\\x04\\x36\\xe0\\x10\\x74\\x08\\xfe\\x30\\x26\\xc0\\x06\\x25\\x68\\x99\\x83\\xf9\\x90\\xeb\\xa9\\xbe\\xcb\\xfc\\xe4\\x03\\xcc\\xd5\\x63\\x56\\xad\\x27\\x41\\xfd\\x21\\x44\\x5d\\xfb\\x23\\xd7\\x61\\x12\\xe5\\x78\\xb3\\x39\\x5c\\xf9\\xd9\\x60\\x95\\x5f\\x1d\\xa8\\xf3\\x99\\xca\\x28\\x6f\\x21\\x39\\x0e\\x25\\xa5\\x9a\"},\n{{0x3a,0xdc,0xe3,0xa3,0xd3,0xfb,0xc9,0x77,0xdd,0x4b,0x30,0x0a,0x74,0x74,0x9f,0x13,0xa3,0xb0,0x4a,0x5d,0x73,0xa2,0xcd,0x75,0xa9,0x94,0xe3,0x19,0x5e,0xfe,0xbd,0xac,},{0x6f,0xf1,0x9b,0x1f,0x18,0xd6,0x48,0x51,0xd5,0xc7,0x48,0x45,0xc6,0x40,0x7f,0x0b,0xf5,0x96,0xa5,0x2e,0x38,0x5e,0x02,0x01,0x27,0xe8,0x3e,0x54,0xcf,0xf5,0xac,0x19,},{0x7d,0xda,0x89,0xf8,0x5b,0x40,0x53,0x9f,0x5a,0xd8,0xc6,0xde,0x49,0x53,0xf7,0x09,0x4a,0x71,0x5b,0x63,0xdd,0xa3,0x0e,0xc7,0xcf,0x65,0xa7,0x85,0xce,0xae,0x5f,0xc6,0x88,0x70,0x7e,0xe0,0x0b,0xe6,0x82,0xce,0xcb,0xe7,0xee,0x37,0xd8,0xfc,0x39,0xee,0x6d,0x83,0xc6,0x44,0x09,0x68,0x17,0x08,0xa0,0x89,0x8a,0x18,0x3b,0x28,0x8a,0x06,},\"\\xfe\\x6c\\x1a\\x31\\x06\\x8e\\x33\\x2d\\x12\\xaa\\xb3\\x7d\\x99\\x40\\x65\\x68\\xde\\xaa\\x36\\xbd\\xb2\\x77\\xce\\xe5\\x53\\x04\\x63\\x3b\\xd0\\xa2\\x67\\xa8\\x50\\xe2\\x03\\xbb\\x3f\\xab\\xe5\\x11\\x0b\\xcc\\x1c\\xa4\\x31\\x66\\x98\\xab\\x1c\\xf0\\x0f\\x0b\\x0f\\x1d\\x97\\xef\\x21\\x80\\x88\\x7f\\x0e\\xc0\\x99\\x1e\\x8c\\x11\\x11\\xf0\\xc0\\xe1\\xd2\\xb7\\x12\\x43\\x3a\\xd2\\xb3\\x07\\x1b\\xd6\\x6e\\x1d\\x81\\xf7\\xfa\\x47\\xbb\\x4b\\xb3\\x1a\\xc0\\xf0\\x59\\xbb\\x3c\\xb8\"},\n{{0x14,0x80,0x3c,0x1f,0x23,0xa4,0x7f,0xcd,0xd3,0x5e,0x5d,0x14,0x6e,0x20,0xca,0x63,0x0c,0xd7,0x12,0xc0,0x47,0xd5,0x33,0x0b,0x65,0x2e,0x31,0x85,0x7a,0xcb,0xc9,0xe8,},{0x36,0xf2,0xd5,0xbd,0x6d,0x83,0x24,0xfa,0x6e,0x9d,0xb7,0xf7,0xd8,0x54,0xeb,0xe4,0x8c,0x0e,0x62,0x99,0x99,0x81,0x22,0xe9,0xd4,0x4b,0x8a,0xdb,0xef,0x54,0xf0,0x93,},{0x07,0xa7,0xde,0x6c,0xe9,0x76,0x64,0xb3,0xea,0x09,0x28,0xe1,0x38,0x5c,0x33,0x09,0xbe,0x08,0xa4,0x7c,0xbf,0x4d,0xaa,0x91,0x86,0xa1,0xb9,0x48,0xc8,0x6f,0xbb,0xa3,0x9c,0x4e,0xfc,0xfc,0xb7,0xa0,0xa3,0x86,0x6b,0xc9,0x4c,0x67,0x88,0xff,0xe6,0xbe,0x0d,0x49,0x72,0xe5,0x6d,0x0c,0x32,0x92,0xd1,0xcc,0x6e,0x25,0x44,0x7b,0x99,0x04,},\"\\x55\\x59\\x83\\x67\\x9d\\x02\\x6e\\x53\\x54\\xb4\\xcc\\x05\\x5a\\xe1\\xbc\\x14\\x65\\x3c\\x72\\x81\\xec\\x72\\x23\\x72\\xf3\\xfe\\xb7\\x78\\xe8\\x41\\xda\\x82\\x1b\\x3d\\x0b\\x8e\\xe7\\xa9\\xa9\\x12\\x9e\\xa0\\x68\\x24\\xbe\\x83\\x79\\xfb\\xbd\\xcb\\x07\\x48\\xf4\\x23\\x72\\x1c\\xcb\\x17\\x2a\\x1b\\xaf\\xa1\\xd5\\xae\\x9f\\xc1\\xc5\\x1e\\x93\\xd4\\x1d\\xd5\\x51\\xc3\\x08\\x60\\x79\\xb6\\x20\\x28\\x6c\\x1c\\x40\\xc1\\x22\\x3b\\xbc\\xbb\\x76\\x72\\x2e\\x92\\xca\\x21\\xd8\\x41\\x0a\"},\n{{0x1a,0x61,0x15,0x4d,0x34,0x72,0xcd,0x96,0xb3,0x28,0xee,0x67,0x4b,0xeb,0x4f,0xc8,0x67,0x63,0xa9,0x69,0xfb,0x41,0x04,0x94,0xe0,0x67,0x84,0x14,0xe3,0x1a,0x46,0xa6,},{0x75,0x76,0xd9,0x3a,0xc8,0x5d,0x0f,0xc6,0x1f,0x25,0x8c,0x55,0xcf,0x90,0xbd,0x87,0xa6,0x35,0x09,0x9c,0x0e,0x81,0x0e,0xd0,0xb9,0x37,0x25,0x8d,0x13,0xb4,0x25,0x59,},{0xad,0xa1,0x66,0x6c,0x9c,0x3b,0x82,0x84,0xb8,0xa2,0x1c,0x4f,0x26,0x18,0xef,0x08,0x08,0xa6,0x46,0xf3,0xf1,0x09,0x41,0xe4,0x70,0xf7,0x38,0xe1,0x78,0x5e,0x2d,0xe9,0xfd,0xd9,0xc8,0xcb,0x52,0x6f,0x94,0x5c,0x7a,0x8c,0x69,0x94,0xf1,0x51,0xb7,0xd0,0x66,0x58,0x1b,0x1d,0x75,0x53,0x07,0x94,0x7c,0x62,0xbe,0xfc,0x8a,0xb7,0x07,0x0f,},\"\\x64\\xc5\\x65\\xef\\xbc\\xb8\\xb9\\x52\\x8e\\xd4\\x72\\x53\\xf3\\xc6\\xa4\\x03\\x5d\\xb7\\x81\\xd6\\xf0\\x97\\x6b\\x5e\\x5b\\xa8\\x44\\x7d\\x4e\\xd5\\x4b\\x04\\x10\\x52\\x93\\xef\\x4c\\x00\\x0d\\x8b\\x2e\\x1b\\x5b\\x75\\xe7\\x27\\xe5\\xd2\\xa0\\x77\\x74\\x3b\\x50\\xd1\\x83\\xb4\\x91\\x76\\x48\\x01\\xa2\\x50\\x4d\\x16\\xee\\x6d\\x7d\\x8a\\xc4\\xfe\\x40\\xe6\\xbf\\xc2\\xa8\\x12\\x9c\\x72\\x85\\xa5\\xac\\x69\\x1c\\x35\\xe6\\x42\\xed\\x16\\x2c\\xf7\\xfb\\xc6\\x45\\x16\\x73\\x3a\\x23\\xb3\"},\n{{0xf2,0x15,0xd3,0x4f,0xe2,0xd7,0x57,0xcf,0xf9,0xcf,0x5c,0x05,0x43,0x09,0x94,0xde,0x58,0x79,0x87,0xce,0x45,0xcb,0x04,0x59,0xf6,0x1e,0xc6,0xc8,0x25,0xc6,0x22,0x59,},{0x1e,0xd5,0x06,0x48,0x5b,0x09,0xa6,0x45,0x0b,0xe7,0xc9,0x33,0x7d,0x9f,0xe8,0x7e,0xf9,0x9c,0x96,0xf8,0xbd,0x11,0xcd,0x63,0x1c,0xa1,0x60,0xd0,0xfd,0x73,0x06,0x7e,},{0xcb,0xef,0x65,0xb6,0xf3,0xfd,0x58,0x09,0x69,0xfc,0x33,0x40,0xcf,0xae,0x4f,0x7c,0x99,0xdf,0x13,0x40,0xcc,0xe5,0x46,0x26,0x18,0x31,0x44,0xef,0x46,0x88,0x71,0x63,0x4b,0x0a,0x5c,0x00,0x33,0x53,0x41,0x08,0xe1,0xc6,0x7c,0x0d,0xc9,0x9d,0x30,0x14,0xf0,0x10,0x84,0xe9,0x8c,0x95,0xe1,0x01,0x4b,0x30,0x9b,0x1d,0xbb,0x2e,0x67,0x04,},\"\\xfb\\xed\\x2a\\x7d\\xf4\\x18\\xec\\x0e\\x80\\x36\\x31\\x2e\\xc2\\x39\\xfc\\xee\\x6e\\xf9\\x7d\\xc8\\xc2\\xdf\\x1f\\x2e\\x14\\xad\\xee\\x28\\x78\\x08\\xb7\\x88\\xa6\\x07\\x21\\x43\\xb8\\x51\\xd9\\x75\\xc8\\xe8\\xa0\\x29\\x9d\\xf8\\x46\\xb1\\x91\\x13\\xe3\\x8c\\xee\\x83\\xda\\x71\\xea\\x8e\\x9b\\xd6\\xf5\\x7b\\xdc\\xd3\\x55\\x75\\x23\\xf4\\xfe\\xb6\\x16\\xca\\xa5\\x95\\xae\\xa0\\x1e\\xb0\\xb3\\xd4\\x90\\xb9\\x9b\\x52\\x5e\\xa4\\xfb\\xb9\\x25\\x8b\\xc7\\xfb\\xb0\\xde\\xea\\x8f\\x56\\x8c\\xb2\"},\n{{0x8c,0x9f,0x95,0x08,0x30,0x75,0xa4,0x3f,0xe4,0x26,0xd1,0x9f,0x1e,0x87,0x71,0x9b,0x40,0x04,0x3d,0xe8,0x8e,0xb0,0xee,0x97,0x1f,0x70,0xe1,0x0c,0x76,0x94,0xce,0x4e,},{0xe9,0x1d,0x16,0x7a,0xa3,0xeb,0xc2,0x3e,0x70,0xaa,0xb4,0x5d,0xab,0xe9,0x05,0xe4,0x16,0x26,0x2f,0x91,0x0e,0x2a,0x95,0x5d,0xd8,0x61,0x9e,0xfc,0x74,0xc2,0x4e,0x85,},{0xca,0xc5,0x55,0x22,0x2d,0xaf,0xec,0x76,0xa0,0xb4,0x7b,0x9d,0x2c,0x58,0x6b,0x3b,0x3b,0x9b,0x3b,0x9c,0x83,0x64,0xbe,0xb3,0xca,0xe1,0xe8,0xdd,0x7f,0x1a,0xe9,0xdd,0x74,0xf2,0x2b,0x8d,0xd4,0xad,0x2b,0x29,0x0f,0x81,0x35,0x1a,0x41,0x5a,0x99,0xf0,0x30,0xf1,0x07,0x78,0xbe,0x4c,0xda,0x85,0xd1,0xd3,0x53,0x33,0x1e,0x70,0xf1,0x09,},\"\\xb6\\x9d\\x70\\xe8\\x60\\xf5\\x5c\\x42\\x7e\\xf2\\xa7\\x1d\\xf3\\x6e\\x05\\xbb\\xc4\\x3b\\xb2\\xe0\\x64\\x63\\xaa\\x5d\\xe3\\x44\\x19\\xc6\\xa6\\x14\\xee\\xa6\\x69\\x53\\x35\\xa8\\x75\\x26\\xc1\\x22\\x64\\x88\\xd8\\x42\\x89\\x1d\\x05\\x74\\xdf\\x34\\x3c\\x9c\\x1e\\x17\\xae\\xd6\\x95\\x8e\\xce\\xe8\\x74\\x74\\x22\\x1e\\xb7\\x7a\\x59\\x9e\\xcb\\x05\\x93\\x44\\xc0\\xd0\\x52\\xc0\\x00\\x2a\\x66\\xe5\\xa6\\x01\\x31\\x85\\xaf\\x69\\xa0\\x1b\\xa5\\xdb\\xc6\\x60\\xd3\\x6c\\xae\\x23\\x5f\\x67\\xfe\\x0e\"},\n{{0xd7,0xeb,0x1f,0xba,0x42,0x4f,0xee,0xd1,0x00,0x77,0x7e,0xed,0xb4,0x87,0x4b,0xf2,0x08,0x10,0xad,0x68,0x6b,0x67,0xe3,0x1d,0x27,0xec,0xf6,0x10,0x60,0x9a,0x33,0xf5,},{0xa2,0x5a,0xcb,0x11,0xa6,0xc8,0x25,0x71,0x3a,0x08,0x5f,0xa7,0x54,0x69,0x28,0x86,0xa8,0x7d,0x07,0xfb,0x9b,0xe1,0xa5,0x3e,0xb9,0x61,0x72,0x8b,0xb6,0x6c,0x90,0x60,},{0x2b,0xf7,0x19,0x68,0x2b,0x07,0xcc,0x5e,0xcc,0x04,0x80,0xf3,0x7e,0x9d,0x12,0x3f,0xf6,0xf4,0x4c,0x26,0xe6,0x95,0x8e,0x59,0xf0,0x80,0x46,0x6f,0x9c,0xd3,0x73,0xa1,0x65,0x00,0xda,0xf1,0x23,0xdc,0x3f,0x13,0x34,0x77,0x4b,0xfc,0x9f,0xa8,0x45,0x03,0xb1,0x6d,0xbf,0x21,0xa8,0x15,0xc1,0xad,0xa6,0xeb,0xef,0x49,0x20,0x46,0x17,0x02,},\"\\xa1\\xd0\\xf8\\x1e\\x3d\\x59\\x08\\x9c\\xc2\\xb1\\x9e\\x07\\xd2\\xfc\\xe4\\x3d\\xb4\\xcf\\x17\\x1f\\xaa\\x64\\x2f\\x3b\\x0b\\xbd\\xe7\\x7a\\xe3\\xd5\\x3a\\xf5\\xc0\\x2b\\xf8\\xfc\\x12\\xff\\xb4\\xe5\\x7f\\x7c\\x8a\\x01\\x5d\\x6c\\x2d\\x17\\x89\\x44\\xfa\\xe9\\xf7\\xc8\\xfc\\x96\\x9d\\x4b\\x77\\xbe\\xa5\\x18\\x76\\xae\\x99\\xd5\\x9e\\x94\\xad\\x24\\x56\\xe0\\xed\\x72\\xc5\\x2c\\xf4\\xe5\\x34\\x0d\\xa1\\x7c\\x44\\xdb\\xff\\x86\\x45\\x7a\\x51\\x9b\\x6f\\xff\\xe2\\x69\\x06\\x62\\x90\\xd6\\x29\\xfe\\x69\"},\n{{0x4f,0x6a,0xeb,0x35,0xfc,0xe1,0x4f,0xbc,0xbb,0x9a,0xa8,0xa4,0xf6,0x45,0x1b,0xf9,0x5b,0x98,0xdf,0x04,0x7f,0xa8,0xc4,0x3f,0x1e,0xad,0x3b,0x40,0x4d,0x3f,0x92,0x8f,},{0xbf,0x66,0xa9,0xed,0xd0,0x94,0x81,0xdb,0x84,0x44,0xa1,0x76,0xc8,0xce,0x05,0x78,0xd2,0x93,0x4f,0x0c,0xdc,0x97,0x34,0xe8,0x6f,0xca,0xac,0x05,0xbf,0x33,0x30,0xf1,},{0x6a,0xdb,0x07,0xe3,0x64,0xf2,0xa4,0x55,0xcb,0x05,0x86,0x7a,0xbc,0x51,0x1a,0xcd,0x9d,0x65,0x89,0x77,0xf0,0xca,0xca,0xfc,0x92,0x82,0x8e,0x7b,0x72,0x4f,0x6b,0xbf,0x98,0xbf,0x0b,0xfb,0x29,0xf4,0xe5,0xe6,0xc7,0x47,0x38,0xd4,0xfd,0xd8,0x16,0xd9,0x25,0x24,0x07,0xae,0x4f,0x3a,0xfc,0x57,0x4c,0x4f,0x00,0x61,0x48,0x24,0xe2,0x03,},\"\\x2d\\xfb\\xb3\\xf5\\x9e\\x19\\xea\\x17\\xd4\\x4a\\x5b\\xde\\x4a\\xd2\\x27\\xa1\\xa3\\x51\\xdd\\xa1\\x7a\\xf8\\x40\\xee\\x0a\\x75\\xda\\x21\\xa5\\xcc\\xa8\\x9b\\x6d\\x1c\\x56\\x7c\\x33\\x3e\\x9c\\xc9\\x10\\xe2\\x15\\x7e\\x05\\xe8\\x6a\\xd5\\xd9\\x31\\x14\\x50\\x64\\x59\\x4c\\x47\\xba\\xee\\xa8\\x66\\x3a\\x34\\x64\\x9c\\x43\\xe9\\x0e\\xb9\\x5c\\xa1\\x0f\\x7d\\x51\\x59\\x7b\\x37\\x8a\\x72\\x2f\\x1f\\x70\\x4a\\xdf\\x9f\\x22\\xe9\\xf8\\x85\\xb8\\x9d\\x1f\\x93\\x80\\x06\\xa2\\xef\\xcd\\xb4\\x2a\\xaf\\xf5\\xe3\"},\n{{0xef,0x4a,0x67,0x62,0xb4,0x00,0x97,0x52,0x04,0xcc,0xc1,0x3a,0xbb,0x47,0x34,0x40,0x15,0x45,0x49,0x06,0x85,0x0f,0xf1,0x49,0x40,0xcb,0xb8,0x3a,0xa2,0x24,0x14,0xae,},{0xea,0xca,0x45,0x09,0x96,0xf5,0x0c,0xfa,0xf2,0xbd,0x7f,0x9d,0x7f,0xa7,0x08,0x7f,0x09,0xad,0x49,0x66,0x42,0x06,0xa8,0x0b,0xc2,0xe5,0xbb,0xbb,0x85,0xbb,0x66,0x8e,},{0x02,0x69,0x7d,0x44,0xca,0xd8,0x62,0xf1,0xda,0xf5,0x70,0x82,0x05,0xf4,0x50,0xd4,0x08,0x52,0x5b,0x10,0xc0,0x1f,0xfd,0x06,0xcf,0xee,0x80,0x37,0x4f,0x3d,0xb1,0x6f,0xa9,0xa4,0x9c,0x19,0xa9,0x84,0x4b,0x34,0x5f,0x2f,0x95,0x59,0xea,0x74,0xaa,0xb1,0x73,0xba,0xa0,0x78,0xc5,0x43,0x70,0xa5,0x16,0x67,0x00,0xc6,0xda,0xfb,0x78,0x0a,},\"\\xa4\\xb6\\x3e\\xae\\xd5\\xa6\\x4a\\x94\\xf2\\xca\\xd2\\x12\\xce\\x2a\\xe7\\x10\\x92\\xfd\\x3e\\xa7\\x44\\xf5\\xbd\\x89\\x56\\x2b\\x2f\\xc2\\xa6\\xc9\\xe4\\xd7\\xaa\\x27\\xad\\xd5\\x62\\x64\\xa5\\xa5\\x50\\x16\\x61\\x0b\\xe6\\xc1\\x9f\\xf7\\xd4\\x98\\x9e\\x95\\x04\\x74\\x08\\x53\\x01\\x27\\x15\\xa7\\x9e\\xce\\x9e\\x12\\xc3\\x01\\xb3\\x31\\x7c\\x7d\\x9b\\x67\\x30\\xdb\\x86\\x2a\\x4a\\x1d\\x28\\x05\\x8e\\x0f\\x8b\\x5d\\xdd\\x97\\x38\\xc7\\xc6\\x2e\\xa5\\x72\\xcf\\xe5\\x9e\\xae\\x08\\xe2\\xb8\\xb6\\x59\\x3b\\x58\"},\n{{0x55,0x01,0x7e,0x5f,0x61,0xf0,0xc5,0xba,0xfb,0xcd,0xe6,0xf8,0x49,0xf4,0x2a,0x31,0xe5,0xe7,0xa8,0x78,0xc1,0xd3,0xf9,0x12,0x6f,0xc5,0x69,0xfd,0x41,0x7e,0xa9,0xf2,},{0x66,0x91,0x4f,0x74,0xed,0x93,0x2f,0xc8,0x81,0xff,0x01,0x66,0x68,0x3f,0x67,0x5a,0x7c,0x28,0xa9,0x26,0xfd,0xdd,0x64,0x69,0xcd,0xb3,0xf2,0x8e,0x6d,0xec,0x42,0xcc,},{0xb1,0xa5,0xe7,0xc4,0x9b,0x8f,0xc6,0xb4,0x33,0x1e,0x04,0x16,0xce,0x7e,0x4e,0xd5,0x9e,0xdd,0x56,0x30,0x0b,0x80,0x2e,0x0d,0x72,0xab,0xca,0x4a,0x6f,0xcb,0x87,0x6c,0x03,0xbf,0x33,0x15,0x79,0x12,0x4a,0xe0,0xd3,0xfe,0x43,0xf7,0x89,0x8b,0xc8,0x7e,0x93,0xfc,0x2d,0xa3,0x97,0x0f,0xc8,0x63,0x89,0x57,0xd1,0x8c,0x66,0x13,0xc8,0x08,},\"\\x2f\\xc8\\x4a\\x09\\x98\\xfa\\x6e\\x16\\x8a\\x86\\x64\\x10\\xbb\\x68\\x10\\x5d\\xf2\\x49\\xa2\\x8c\\xfc\\x76\\x60\\x4b\\xe9\\x4f\\xd7\\xdf\\xff\\xf2\\xfc\\x1d\\xed\\xd2\\x20\\x19\\x94\\x65\\x57\\x5e\\x8d\\xf8\\x60\\x19\\x0f\\x16\\xac\\xa4\\x08\\x41\\x69\\xbe\\x16\\xc6\\xba\\x32\\xeb\\x67\\x04\\x2f\\xfd\\x4f\\x23\\x03\\x16\\xa2\\x6b\\x26\\x24\\xa4\\x2f\\x8f\\x90\\xad\\x57\\xf6\\x91\\x64\\x86\\xfa\\x91\\xfd\\x94\\xed\\x68\\xad\\xed\\x4e\\x63\\x24\\x30\\xef\\x71\\x94\\x46\\x97\\x9b\\xfa\\xf3\\x45\\x40\\x9c\\x38\\x7f\"},\n{{0x05,0x53,0xfb,0xa8,0x66,0x94,0x23,0x41,0x21,0x7c,0xf2,0x78,0xac,0x57,0xcb,0x21,0xac,0xd0,0x9d,0x99,0x16,0xcc,0x6a,0xf0,0xac,0x46,0x94,0x1e,0xa1,0x39,0xd5,0x45,},{0x84,0x0c,0x66,0xe5,0x7c,0x2d,0x4f,0x52,0xa4,0xa2,0x79,0x6d,0x2a,0x53,0xc5,0x70,0x9b,0x96,0xa6,0x28,0xc2,0xe0,0x63,0xfe,0x6e,0xfd,0x47,0xf2,0x83,0xef,0x5e,0x82,},{0xbc,0x33,0x64,0xc1,0x52,0xee,0x5c,0x80,0x8a,0xc3,0x40,0xf4,0x9e,0xa2,0xcc,0x40,0x4e,0x93,0x51,0x71,0x21,0x22,0x0c,0xce,0x6f,0x7c,0x30,0xa2,0x25,0x00,0xe4,0x1b,0xcd,0xb6,0xe8,0x20,0x48,0x0f,0x8f,0xcc,0xdd,0x22,0xff,0x9a,0xd9,0x6d,0xa5,0x32,0x80,0x2f,0x43,0x1e,0x94,0x24,0x0f,0xb8,0x3d,0x4b,0xce,0xaa,0x09,0xb9,0x2b,0x0d,},\"\\xc1\\xfa\\xe6\\x26\\x2a\\x0e\\x98\\xa6\\xb1\\x23\\x5f\\xcb\\x62\\x28\\x3b\\x7f\\x0a\\x09\\x7f\\x9d\\x00\\x24\\x16\\xd3\\x18\\xfe\\xfc\\x60\\xc5\\xa1\\x58\\x4f\\x90\\x0a\\xd0\\xab\\x26\\xcc\\xfa\\xe0\\xd6\\xd8\\x4a\\xa9\\xaa\\x2d\\xf1\\x6d\\x4c\\x11\\x7e\\xa2\\x72\\x46\\x76\\xcb\\x86\\x6d\\x48\\x70\\xa8\\x72\\xfc\\x82\\x9a\\x7c\\x2a\\x5d\\x21\\xba\\x83\\x34\\x0a\\xdb\\x33\\x9a\\x34\\xc5\\x18\\x4c\\x7f\\x5e\\xad\\x0f\\x07\\x72\\x89\\xb3\\x36\\x77\\xed\\x6a\\x1b\\xa3\\x4b\\xe1\\x99\\x4e\\x25\\x76\\x3b\\xd1\\xd9\\xfa\\xec\"},\n{{0x7a,0x5a,0xc6,0x02,0xde,0x19,0xf3,0xc2,0x10,0x40,0xbc,0xdd,0xbf,0xf4,0x2f,0x6a,0xee,0x6f,0x95,0xc1,0xb0,0x93,0x86,0x8f,0x48,0xe5,0x04,0x82,0xdb,0xf4,0xf9,0xc7,},{0xfb,0xb6,0xc7,0x53,0x1c,0xda,0x21,0xe7,0xd1,0x7e,0xa9,0x03,0xc4,0xd1,0x4b,0xe6,0xc6,0x8b,0x4c,0xa8,0x03,0xa1,0x6b,0xd8,0x71,0x20,0xf5,0xaa,0xf7,0xdc,0xe1,0xd4,},{0x84,0x10,0x1d,0xd4,0xb5,0xe8,0xca,0x3e,0xd9,0x8c,0x1e,0x8a,0x06,0xe1,0x1d,0x7e,0x42,0x4b,0x0d,0x12,0xca,0x71,0x4e,0xe7,0x37,0x4b,0x64,0xc2,0x9d,0x51,0xa2,0x02,0x1c,0xc7,0x7a,0xc7,0x53,0x89,0xd9,0xb0,0xa6,0x46,0xa4,0x47,0x62,0x3d,0x7d,0x04,0xd1,0x24,0x18,0x66,0xb0,0xca,0x6e,0xdd,0x1b,0x7a,0xc0,0x15,0x66,0x6b,0x70,0x0d,},\"\\xbd\\x16\\x85\\x41\\x92\\x79\\xeb\\x81\\xe4\\xcf\\x3c\\x90\\x90\\x31\\xf0\\xf0\\x9c\\x5f\\xfa\\xe7\\xe2\\xce\\x6b\\xa9\\xd9\\x6c\\x2b\\xce\\x87\\xb8\\xba\\x0d\\xd7\\x63\\x23\\x10\\x01\\xe5\\x32\\xc7\\xdd\\xd6\\x21\\x03\\xab\\xf7\\x01\\x28\\x8e\\x19\\xdd\\x8f\\x53\\x02\\xe8\\xf5\\xd3\\x1b\\x64\\xcc\\x33\\x9b\\xd8\\xb7\\xa9\\x55\\x50\\xc8\\xa1\\x16\\xfd\\x48\\x69\\x48\\x77\\x2b\\xd5\\xaf\\x8d\\xfd\\x46\\x00\\x1c\\x59\\x76\\x7b\\x0d\\x6b\\xdc\\xe3\\x83\\xa7\\x07\\x89\\x92\\xd1\\x02\\x2f\\xbc\\xaf\\x90\\x71\\x06\\x87\\xb9\\xaa\"},\n{{0x50,0x41,0x4c,0xf5,0x49,0xbc,0xc5,0x5b,0x5b,0x6b,0x75,0xea,0x37,0x82,0xb2,0xea,0x7c,0x08,0x7b,0x6a,0x01,0x06,0x17,0x5e,0x46,0x9c,0xa2,0xcc,0x76,0x4a,0xeb,0x01,},{0xd0,0xf3,0x0c,0x12,0xe9,0x97,0xf9,0x6e,0x7a,0xee,0xcd,0x1b,0xff,0x6a,0x01,0x2e,0xc3,0x88,0xeb,0xf8,0xf3,0xf4,0xaf,0x66,0x48,0x04,0xd1,0x63,0x8e,0x4c,0x34,0x6a,},{0xb3,0x09,0x80,0x01,0x60,0xde,0x43,0xa6,0x3a,0x89,0xa0,0xac,0xb8,0xa6,0x05,0x00,0x59,0x58,0x9b,0x3e,0xae,0xca,0xc2,0x0b,0x25,0x6f,0xec,0xe4,0x38,0x04,0x2f,0x69,0x41,0x5d,0x8a,0x56,0x88,0x3e,0xe3,0x83,0x6d,0x31,0x34,0xa7,0xfc,0x1d,0xe6,0x4f,0xa8,0xc8,0xce,0xcc,0x3c,0xe2,0x75,0x89,0xf6,0x06,0x05,0x88,0x20,0x85,0x7a,0x0c,},\"\\x75\\xad\\x77\\xe8\\xc5\\x4b\\x0b\\x05\\xfb\\x2d\\x16\\x2e\\x7c\\xad\\xb8\\xa7\\x52\\x80\\x81\\xb8\\x63\\xf7\\x6a\\x44\\x1b\\x37\\x44\\x69\\x41\\x3e\\x57\\x14\\xed\\xf5\\x4f\\x80\\x04\\x96\\xaf\\x01\\x57\\xc1\\x7e\\x42\\x55\\x83\\x41\\x4d\\x43\\x61\\xf2\\x13\\x41\\x71\\xc0\\xb8\\x7c\\x22\\xce\\x68\\x20\\xa4\\x85\\x0a\\xb4\\x9d\\x99\\xa9\\xba\\xdc\\xe9\\xe3\\x61\\x10\\xe7\\xf3\\x06\\x01\\x18\\xb3\\x59\\x0f\\x82\\xb4\\x37\\x71\\xe9\\xfb\\xb0\\x81\\xaf\\xe6\\x22\\x27\\xe0\\x24\\xd9\\x8d\\xe6\\xcd\\xec\\x02\\x8d\\x7c\\x49\\x49\\x0d\"},\n{{0x93,0xcb,0x00,0xd8,0xfe,0x9c,0x97,0x77,0xa6,0x83,0x63,0x1f,0x39,0xba,0x0f,0x48,0x76,0x14,0x82,0xcf,0x1c,0x36,0x6b,0xd8,0x63,0xcf,0x71,0x51,0x01,0x53,0x25,0x55,},{0x87,0xe9,0x4a,0x1e,0xa5,0x25,0x8d,0x61,0x18,0x0c,0xb8,0x28,0x59,0x0f,0xf1,0x41,0x8a,0x87,0xd0,0x1e,0x70,0x26,0x86,0xba,0x8a,0xbc,0x26,0x92,0xc8,0xdc,0x3c,0x91,},{0x09,0x82,0x4f,0xa2,0xdf,0xbc,0x4d,0x6e,0xf7,0x6a,0x9e,0x41,0x45,0x96,0x11,0x16,0x76,0x91,0x30,0x55,0x3b,0x3e,0xdf,0xfa,0x50,0xd0,0x4f,0x39,0xb8,0xb7,0x9f,0xac,0xbd,0x23,0x7a,0xcf,0x71,0x35,0x4a,0x53,0xa6,0xe5,0xfe,0xe7,0x54,0xe8,0x23,0xb0,0xb2,0x90,0xf9,0x61,0x93,0x20,0xa1,0x3d,0x56,0x12,0x69,0xa2,0x21,0x63,0x9f,0x03,},\"\\x88\\xd8\\x53\\x8d\\x31\\x86\\x78\\x13\\xd8\\x8f\\xef\\x72\\x28\\xd4\\x9a\\x7e\\x95\\x0d\\x73\\x83\\x96\\xf1\\x16\\xdd\\xa1\\x02\\x5f\\x79\\x13\\x54\\x7c\\x5d\\x1d\\xc5\\x67\\x7a\\x6d\\xe4\\xb4\\xa5\\x88\\x05\\x07\\xb3\\x61\\x78\\x0b\\x61\\xb4\\x3f\\x77\\x95\\x26\\x3d\\xb2\\x2f\\xf3\\x41\\x64\\x5f\\x2f\\x59\\x14\\xfd\\x60\\x88\\xc2\\x81\\x12\\x11\\xed\\x47\\x56\\xac\\x01\\x9a\\x60\\x35\\xd6\\x6e\\x31\\x70\\xc1\\xd8\\x2b\\xfa\\xa3\\x05\\x96\\xb3\\x96\\xb3\\x26\\x0c\\xc1\\xd1\\x0d\\x41\\x3d\\xd4\\x7e\\xbe\\x6d\\xaa\\x0c\\x30\\xdc\\x42\"},\n{{0x2b,0x4c,0xae,0x38,0x0e,0x95,0xce,0x69,0x4c,0x26,0xac,0x79,0x57,0x44,0x73,0x47,0xf9,0x8e,0x31,0xb4,0xbf,0x02,0xd7,0x44,0xe1,0x31,0x52,0x90,0x71,0xe2,0x30,0x1d,},{0xe6,0xfc,0x70,0x5a,0x79,0xc9,0x8e,0x11,0x5b,0x4e,0x28,0xd3,0xaa,0x15,0x06,0xb7,0x4e,0xe7,0x42,0x76,0xc5,0xfc,0x11,0x09,0xa7,0xf4,0xd8,0x9c,0x6f,0xaf,0xb8,0x89,},{0x55,0x5e,0x45,0x65,0x6b,0xa9,0xcf,0xbf,0x51,0x55,0xd0,0xe5,0x25,0x76,0xe5,0x19,0x7a,0xbb,0xbc,0x9d,0xd2,0x33,0x99,0x3e,0xec,0x2a,0x1e,0xe7,0xf6,0xa8,0x64,0x09,0xc0,0xb7,0x1b,0x0a,0x66,0x19,0x78,0xff,0x5e,0x0a,0xcd,0xc9,0x46,0x3d,0xc4,0x49,0x90,0x6f,0x47,0x4f,0x8e,0x79,0xbb,0x86,0x16,0x8b,0xf7,0x07,0x41,0xe3,0x4b,0x02,},\"\\xe0\\xb8\\x25\\x0e\\x27\\xb7\\xc0\\x29\\x1d\\xbc\\x47\\xa6\\xda\\x6f\\x12\\x68\\x98\\x7a\\xfd\\xf0\\xa1\\xe9\\x0b\\xe6\\x9b\\xcb\\xc4\\x37\\x08\\x65\\x21\\x78\\x30\\xd5\\x20\\x86\\x93\\xbe\\x7b\\x70\\x45\\x09\\x9a\\x22\\xea\\x27\\xf9\\x52\\xeb\\x3f\\x79\\xa9\\xa0\\xf1\\xb5\\xa8\\x7b\\x19\\x36\\x77\\x90\\x78\\x8d\\x34\\xc2\\x19\\xc2\\xe2\\xa6\\xb8\\x34\\x02\\x0f\\xb4\\xfd\\x14\\x9d\\xc5\\x6b\\x54\\x4f\\xdd\\xbb\\x42\\x07\\x1a\\x16\\x2f\\xc7\\xcb\\x33\\xc1\\x46\\xca\\xc0\\x5a\\x31\\xb1\\x83\\xe9\\xda\\xad\\xc6\\x16\\xf3\\xaf\\x44\\x9b\\x17\"},\n{{0xb5,0x64,0x91,0xe5,0x49,0x99,0xbb,0x5a,0x17,0x15,0xeb,0xfa,0x2f,0xeb,0x14,0xa5,0x45,0xa3,0xa4,0x3c,0x2f,0xdf,0xd4,0xbe,0x0c,0x95,0xfc,0x11,0x81,0x9a,0xd6,0x95,},{0xcd,0x42,0xbf,0x41,0x4f,0x9b,0xfc,0x72,0xec,0x06,0x98,0x82,0xa8,0x00,0x55,0x7c,0xdf,0x31,0xbc,0x34,0x64,0xfb,0x10,0x2c,0x31,0x0e,0x6d,0xbd,0x3a,0xe2,0x08,0x63,},{0xe3,0xbe,0x3e,0x71,0xa8,0x98,0x52,0xdf,0x3c,0xff,0xd7,0x2d,0x68,0x20,0x78,0x69,0xdd,0x3e,0xce,0xb4,0x9b,0x1f,0x02,0x94,0x93,0xec,0xcb,0xb9,0x32,0x44,0x4e,0xbe,0x8c,0x8c,0x6d,0xb5,0xf0,0xa5,0xa6,0x7e,0x21,0x94,0x40,0x8d,0xf9,0x84,0x19,0x13,0xa5,0xac,0x1a,0x60,0x68,0x96,0x41,0x9a,0x66,0x8f,0x4f,0x47,0xc5,0x6c,0x2b,0x08,},\"\\xeb\\x44\\x18\\xba\\x30\\x68\\x3e\\xc7\\x95\\x9b\\xdb\\x1e\\xc7\\xb2\\x63\\xf8\\x3e\\x81\\xf0\\x54\\xdd\\xcd\\xbe\\x0a\\x67\\x38\\xca\\x77\\x63\\xe2\\x46\\x93\\x5b\\xac\\x41\\x90\\x26\\xc2\\x2b\\xfb\\xdd\\x12\\x36\\x33\\x6c\\xc1\\x61\\x07\\xc5\\x35\\x13\\xe3\\xdd\\xf3\\x4e\\x12\\x08\\x46\\x96\\x2c\\x3b\\xdd\\x54\\xf5\\xad\\x57\\x49\\x59\\x72\\x08\\xf1\\x5a\\x8b\\xb5\\x66\\x67\\xba\\xa8\\x95\\xf0\\x83\\x40\\xdb\\x89\\xb8\\x5c\\x43\\x5e\\x77\\x09\\x31\\x92\\x8d\\x8a\\xbc\\x99\\x26\\x2f\\x83\\x9a\\xed\\xd9\\xbe\\x2a\\xa1\\x38\\xc9\\x25\\x9a\\xdf\"},\n{{0x65,0x79,0xc2,0x47,0xdd,0x2c,0xd0,0x2b,0xa2,0xf7,0xd7,0xa9,0x50,0xa3,0x30,0x75,0x26,0x81,0xe9,0x2c,0x0d,0xc6,0x29,0x84,0xbb,0xea,0x27,0x9e,0xa5,0x21,0xc3,0x81,},{0x0b,0x08,0x7b,0xea,0x1a,0x1b,0x3d,0x15,0x80,0x5c,0xb6,0x04,0xf4,0xbb,0x8d,0x68,0xed,0xde,0x27,0x4f,0xaf,0x52,0x1f,0xe6,0xdf,0x50,0xc5,0x5f,0x8a,0xd4,0xa7,0x0d,},{0xec,0xca,0xf8,0x01,0xae,0x0a,0x91,0x2e,0x21,0xc6,0xb8,0x3a,0x5f,0x0e,0x4e,0x88,0xd4,0xb2,0x71,0x34,0x59,0xff,0x93,0x44,0x9f,0xc0,0xb2,0x1a,0x9f,0x41,0x60,0x50,0x11,0x3c,0xba,0xe4,0xe8,0x14,0xd2,0x0c,0x0a,0x79,0x8f,0x76,0xd2,0xf9,0xd3,0x26,0xed,0x83,0x95,0x9e,0xa0,0x2a,0xbd,0xc1,0xab,0x35,0x0a,0x46,0x71,0x23,0xf7,0x09,},\"\\xdf\\x7c\\x55\\x2f\\xfc\\x89\\x37\\x4b\\x95\\x71\\xa6\\x02\\x4a\\x8d\\x04\\x71\\xd7\\xeb\\x6b\\xe8\\xdf\\xca\\x6f\\x41\\x66\\xb5\\x81\\xb6\\x54\\x79\\x01\\x5a\\x05\\x68\\x12\\x90\\x74\\xcc\\x04\\xd6\\x34\\x2c\\x75\\x8c\\xa1\\x8f\\x79\\x87\\xde\\xc5\\x36\\xb7\\x03\\x3d\\x5f\\x96\\x81\\x50\\x43\\x40\\xe2\\x09\\x86\\xf0\\x27\\xb8\\xcf\\x1f\\x26\\x3b\\xe7\\x6d\\xb3\\x52\\x5d\\x17\\x34\\x22\\x95\\x0e\\xa8\\xdc\\xed\\xdc\\x58\\x56\\x40\\x91\\x8a\\xa9\\xd2\\x5c\\xa8\\x9c\\xba\\x70\\x1c\\x20\\x20\\x15\\x38\\x73\\xf4\\x61\\x08\\xc7\\x72\\xcb\\x38\\x8d\\x55\"},\n{{0x18,0xfb,0xa6,0x0c,0x50,0x26,0xf3,0xc9,0xdd,0x7a,0xed,0xc0,0x42,0x09,0xd5,0x26,0x03,0x61,0xde,0x40,0x0e,0x19,0x0a,0xeb,0x60,0x16,0x9e,0x05,0xa3,0x36,0x7c,0x9f,},{0xdf,0xff,0x34,0x7f,0x3d,0xd2,0x55,0x53,0x0b,0xf7,0xfb,0x34,0xd0,0x2b,0xa4,0x86,0xd1,0x12,0xbb,0x46,0xe9,0x50,0xe2,0xef,0x80,0xe5,0x17,0x01,0x4c,0xc9,0x57,0x34,},{0x4b,0xc0,0x11,0xe4,0x0f,0x0f,0x59,0xc6,0x18,0xf6,0xbb,0xe2,0x30,0xb6,0xf7,0xbc,0x2f,0x50,0xe3,0x61,0x7c,0x7f,0xaa,0xb7,0xf4,0xc2,0x1c,0xb8,0x4f,0x77,0xeb,0xa9,0x94,0xcb,0x7c,0x2a,0x1b,0xf1,0x0b,0x01,0xbb,0x20,0x08,0x44,0x97,0xfd,0xf0,0xa6,0xab,0x5d,0x9b,0xcd,0x22,0xc4,0xa2,0xc5,0xa7,0x8f,0x79,0x92,0x68,0x25,0x94,0x0f,},\"\\x34\\xf0\\x8a\\x80\\x4d\\x78\\x29\\xcc\\x39\\x14\\xf0\\x00\\xce\\x1a\\x32\\x88\\xac\\xce\\x21\\x49\\xc8\\xa0\\x20\\x86\\xb9\\xf6\\x7a\\xfc\\xcd\\x83\\xa1\\x78\\xb0\\xbc\\xfd\\x49\\x70\\xc0\\x56\\x99\\x7d\\xa7\\xdc\\x3d\\x47\\x56\\x2f\\x16\\x66\\x3c\\xed\\xc5\\x2f\\x82\\xd7\\x10\\x85\\x0c\\xf4\\x05\\x03\\x79\\xef\\xda\\xc2\\x3b\\xee\\x17\\xc3\\x30\\xa3\\x83\\xad\\x13\\x7f\\x78\\x84\\x73\\xb2\\xb0\\x72\\x36\\x03\\xb6\\xde\\xb1\\xfd\\xbf\\x6c\\x52\\x3f\\xc9\\x48\\xa0\\xcc\\xc4\\xff\\x10\\x0f\\xb9\\x46\\xd8\\x74\\xc1\\xf9\\x90\\x43\\x6a\\xe8\\xc4\\xf3\\xb2\"},\n{{0x07,0x3c,0xc1,0x5b,0x05,0x36,0x28,0x59,0x33,0xb2,0xbe,0x39,0x25,0x3c,0xf4,0xfd,0x69,0x6b,0x81,0x61,0x0f,0x5d,0xd3,0xad,0xac,0x2e,0x9c,0xbf,0x33,0x8e,0xf2,0xf6,},{0x00,0xb5,0x51,0xd3,0x71,0x54,0x43,0x75,0xda,0xc5,0xc4,0xe9,0x6c,0xd1,0xf0,0x21,0x52,0x07,0xe8,0xe1,0x66,0xa1,0xfe,0x49,0xd5,0xb0,0xa5,0x1a,0xc1,0x84,0x43,0xec,},{0x3a,0xa5,0x2a,0x83,0x06,0x2a,0x8f,0x28,0xa5,0xd6,0xb7,0x60,0x7f,0x48,0x4b,0x66,0xcc,0x37,0x48,0x96,0xb7,0x66,0x12,0x31,0x26,0x33,0x3c,0x57,0x95,0x81,0x31,0x6c,0x74,0x28,0x06,0xf6,0x27,0xb5,0xbc,0x55,0xca,0xd7,0x05,0xcc,0x1d,0x47,0x82,0xb0,0x44,0x08,0x0c,0x8a,0xc8,0x40,0xf3,0x8c,0x0c,0x50,0xd3,0x5e,0x34,0x5c,0x78,0x03,},\"\\xc2\\x85\\x36\\x2b\\xc8\\xef\\x62\\x8f\\x7a\\xed\\xf6\\x54\\x23\\x1e\\xe5\\x1a\\xcd\\xf2\\xcf\\x69\\xa8\\x86\\xb9\\x42\\xbb\\x9b\\xfe\\xd8\\x15\\x51\\x05\\xd9\\x20\\x9d\\xed\\x2a\\xf2\\x4f\\x16\\x9a\\xd5\\xfc\\xd4\\x51\\x37\\x0f\\x58\\x27\\xa8\\x51\\x11\\xc7\\xa5\\x2e\\x03\\x2c\\x50\\x38\\x61\\x7c\\x0c\\x01\\x70\\xe2\\xa6\\xc2\\x31\\xdc\\x40\\x1d\\x12\\x06\\x2e\\xdb\\x18\\x60\\x36\\x11\\x4e\\x38\\x79\\x3b\\x79\\x08\\x90\\x77\\x58\\x1b\\x97\\x83\\xf4\\x00\\x07\\x10\\x3e\\xf1\\x74\\x72\\x49\\x1c\\x00\\xe7\\x13\\x8a\\xec\\xc5\\x08\\x4d\\x3c\\x85\\x01\\x04\\x70\"},\n{{0xfd,0x89,0x4a,0x1e,0x82,0x32,0x20,0x3b,0x28,0x95,0x05,0xd5,0xc6,0x8c,0x68,0x79,0x1f,0xfc,0x0e,0x54,0xf2,0xa8,0x75,0x30,0xfb,0xba,0x5b,0x3a,0x3f,0x2c,0xaf,0x00,},{0xe9,0x5a,0xb5,0x65,0x94,0x5c,0x7a,0xe5,0xd5,0x33,0xdf,0x5d,0x0c,0xcc,0xc7,0xe9,0xab,0xbc,0x83,0x8e,0x20,0xa0,0xb6,0x1c,0x93,0x0f,0x5d,0x41,0xd8,0x1a,0x6f,0xe7,},{0xf5,0x11,0x02,0x21,0x9e,0x88,0x04,0xbe,0x71,0x3e,0x55,0x6d,0xf4,0xe4,0xaf,0xa2,0xf8,0x86,0x6f,0xe8,0x65,0x41,0xa1,0xc2,0xa0,0x93,0x4d,0x24,0xc3,0xc9,0xbe,0xb2,0x80,0xa7,0x0d,0xd8,0xd5,0x27,0xfe,0x8b,0x7e,0x0b,0x94,0x82,0x14,0xd5,0xf2,0xf9,0x63,0x86,0x19,0x91,0x4b,0x72,0xd5,0x5d,0xc1,0x98,0xb0,0x22,0x9a,0x84,0x87,0x08,},\"\\x26\\x69\\x62\\x4a\\x94\\xf2\\xc4\\x4a\\x05\\xb7\\xdc\\x3e\\xbf\\x93\\xe5\\x8a\\x4b\\xf3\\xa0\\x1c\\x27\\x36\\x57\\xe7\\xe7\\x87\\x89\\x76\\xf6\\xb6\\xea\\x73\\x7f\\xa3\\xf2\\x2c\\xc8\\x36\\x5b\\x8b\\x22\\x0c\\x00\\x7d\\x5b\\x64\\x27\\x26\\xa4\\x08\\xfe\\x2f\\xab\\x69\\xeb\\xb3\\xbd\\x07\\x2b\\x34\\x9f\\x4d\\xc3\\x37\\x7e\\xe7\\xcc\\x75\\x29\\x34\\x25\\x42\\x15\\xd2\\x39\\x89\\xbd\\x3c\\xd0\\x2c\\xe9\\x99\\xad\\xec\\x97\\x84\\x99\\x3f\\x4c\\x19\\x94\\x08\\x15\\xf3\\x9c\\x9e\\x22\\x92\\x47\\xf5\\x20\\x5c\\x36\\xcb\\xa4\\x4e\\x71\\x42\\x66\\x36\\x92\\x89\\xb4\\xa7\"},\n{{0x18,0xef,0x46,0x4e,0x28,0xf8,0x7f,0xfc,0xfa,0x4d,0x3a,0x9c,0x09,0xa2,0x29,0x10,0x95,0x1b,0x8c,0x71,0x9f,0xda,0xcd,0xb5,0x6d,0xe6,0x2c,0x4b,0x40,0x6d,0xf0,0x0c,},{0xc5,0x06,0x4c,0x9d,0x43,0xee,0x2d,0xa7,0x5b,0x06,0xbb,0x09,0xc7,0x72,0x67,0xdb,0xd0,0xd3,0x91,0x28,0xf1,0xcd,0xc6,0xbf,0xa4,0x51,0xa0,0x3e,0x93,0xaf,0x4a,0x70,},{0xd1,0xe7,0xf1,0x6e,0x8e,0x59,0x7d,0x42,0x8a,0xde,0xa6,0x55,0x91,0xd5,0x51,0xb5,0x4b,0x66,0x7a,0xff,0x20,0x20,0xc4,0x64,0xf7,0xf4,0xe5,0x3c,0x47,0x73,0xf7,0x04,0x33,0x24,0x9a,0x3c,0x71,0xb4,0xd1,0x1c,0x89,0xc3,0xfa,0xa8,0x92,0x80,0x92,0x27,0xb9,0xf2,0x9e,0xf4,0xf7,0xf5,0xd0,0x20,0xd4,0x67,0x4d,0x40,0x21,0x35,0x94,0x05,},\"\\x9c\\x82\\x57\\x07\\xd9\\x35\\x83\\x65\\xab\\x9d\\x38\\xf7\\xe7\\x28\\xd6\\x28\\xaa\\x72\\x2a\\x4f\\x1a\\x20\\xa3\\x8e\\x47\\xc9\\x99\\xff\\xf8\\xfc\\x32\\x41\\x7f\\xbe\\x07\\x2f\\x96\\xeb\\x6a\\x0e\\x11\\xe4\\xda\\x9b\\x6d\\xe9\\x61\\x54\\x45\\x28\\x0e\\x93\\xc7\\x7a\\x36\\x34\\xd3\\xd2\\xc6\\x87\\x98\\x56\\xc2\\x48\\xf9\\x80\\x0f\\x60\\xa0\\xd3\\x8d\\xc1\\xce\\xa8\\xb7\\xf3\\x1f\\x28\\x6c\\xb0\\x37\\x48\\x27\\xb4\\xc6\\xba\\x14\\x4a\\x66\\x94\\xf2\\xb9\\x08\\xea\\xd6\\x8d\\x18\\x34\\x01\\x24\\xcb\\x59\\xcf\\x17\\x01\\x86\\x3b\\xd4\\xf3\\xef\\xc7\\x09\\xf3\\x62\\x7a\"},\n{{0xc9,0x11,0xbd,0xf2,0xf9,0xe7,0xcc,0x5f,0xff,0x35,0xc9,0x6e,0x15,0xcc,0x12,0xea,0xfd,0x05,0xab,0x0d,0xb3,0x1f,0x64,0x9f,0x74,0x08,0xac,0xd0,0xca,0xda,0x76,0xe0,},{0xde,0x44,0x69,0x6c,0xd6,0xbd,0x2c,0xbe,0x9b,0x11,0xa0,0xef,0x18,0xb8,0x81,0x64,0x80,0x1a,0x96,0x9d,0x5e,0x06,0xed,0x45,0x3e,0xb4,0x00,0x8c,0xce,0x9a,0x57,0x25,},{0xd5,0x84,0xb5,0xda,0x37,0x1a,0xe4,0xf5,0xc9,0x85,0x9b,0x25,0xf7,0x0d,0xc5,0x6c,0x1b,0x7b,0x4e,0x02,0xd1,0xae,0x66,0x36,0x28,0x3b,0x1b,0x7b,0x11,0x21,0x7a,0xfd,0xcd,0xf6,0x5d,0x1b,0x49,0xca,0x2c,0x8e,0xf1,0x79,0x66,0xe9,0xbc,0x65,0xf1,0x0c,0x31,0x0b,0x77,0xbb,0x5d,0xf7,0xaf,0xf5,0xec,0x1b,0x37,0x9a,0x2c,0xe5,0x5d,0x0d,},\"\\x76\\xc4\\x71\\x24\\x1d\\x17\\x19\\x29\\x84\\xb0\\x03\\x62\\x69\\x6e\\x4d\\x9d\\x4d\\x2b\\x7f\\x83\\x9c\\x20\\x64\\x11\\x7e\\x50\\xa1\\x59\\x8f\\x3a\\x11\\x72\\xb1\\x6c\\x55\\xe5\\x39\\x68\\x66\\x08\\x47\\x52\\x02\\x4f\\x3a\\x7e\\xb6\\x8b\\xb3\\xff\\xdb\\x80\\x97\\x9a\\x0a\\xf6\\xd0\\xf6\\xaf\\x26\\xb6\\xf0\\xbc\\x0c\\x03\\x84\\x43\\x3b\\xcf\\xd4\\x4c\\x75\\xeb\\x65\\x4a\\x8a\\x82\\x25\\xcb\\x9c\\x4a\\x7f\\xb3\\xc8\\x24\\xc3\\xaf\\x61\\x25\\xfd\\x46\\xdb\\x28\\x7e\\x70\\x49\\x2d\\x15\\x46\\x32\\xcb\\x8f\\x62\\x43\\x26\\x59\\xd9\\x58\\xd6\\x28\\x1d\\x04\\xa5\\x4f\\x5f\\x5f\"},\n{{0xd3,0x70,0x32,0x99,0xc4,0x1d,0xb3,0x6d,0x77,0xdd,0x3a,0x49,0x54,0x1f,0x3f,0xb2,0x1d,0x0b,0x2b,0xad,0x1f,0x6e,0x07,0x4a,0xff,0xd9,0x6f,0x1c,0x40,0xd0,0xf9,0x27,},{0x86,0x2c,0x5e,0xf6,0x16,0xa5,0xf0,0x66,0xfd,0x87,0x75,0x8a,0x56,0xab,0x45,0x05,0x6f,0xea,0x4b,0xd3,0x3f,0x00,0x8b,0xe2,0x4f,0x7b,0x54,0x0e,0x09,0x5e,0x14,0x8e,},{0xdf,0x28,0x27,0x71,0x21,0xea,0xc4,0x46,0x30,0x08,0x4c,0xce,0x75,0x91,0x7a,0xe9,0xf6,0xbe,0xc6,0x5a,0xf5,0x57,0x2d,0xc3,0x07,0x19,0xbd,0xe6,0x61,0xcf,0x69,0x6b,0x85,0xb8,0x67,0x2d,0xd4,0x98,0x3c,0xab,0x30,0xbd,0x05,0xcc,0x3a,0x11,0x9d,0x7d,0xb9,0xba,0xbd,0x52,0x2d,0x7b,0x3a,0x6b,0xcf,0x38,0x86,0xec,0xd2,0x5e,0x08,0x0f,},\"\\xac\\x92\\xed\\xbe\\x22\\x25\\x7b\\xb0\\x6d\\x94\\xaa\\x95\\x0e\\x62\\xd1\\x8c\\xa2\\xac\\x0a\\x8f\\xc1\\x06\\x00\\x0d\\x22\\x31\\xf8\\xa1\\x3b\\x8d\\x7a\\x20\\x9c\\xcd\\x8c\\xc4\\x9a\\x6c\\xd6\\x8a\\x7f\\x36\\xc0\\x2f\\xb8\\xf7\\x28\\xd1\\x55\\x95\\x16\\x7f\\x0b\\xa8\\xcf\\xe9\\x5c\\x8a\\x1e\\x43\\x5f\\x32\\x75\\x13\\x01\\x4a\\xc4\\x28\\xb7\\x5d\\x4f\\x72\\xe7\\xc8\\x34\\xdd\\x70\\xe1\\xa4\\x48\\xf1\\x84\\x7d\\x34\\x98\\x47\\x5f\\x74\\xe3\\xd9\\x33\\x4d\\xc7\\xdc\\xc4\\xfe\\xd7\\x2b\\xf6\\xc7\\xfe\\x3b\\x1d\\x4f\\x53\\xd4\\x29\\x61\\x6f\\x1d\\xf4\\x4f\\x19\\x73\\x31\\x58\\xb6\"},\n{{0xd4,0x11,0xcd,0x33,0x57,0x6d,0x0e,0xfe,0x9e,0xc4,0x13,0xcc,0xda,0xab,0xd4,0xfc,0xba,0xfe,0xc0,0x1a,0x3a,0xf4,0xb3,0xcb,0xe3,0x4f,0x8b,0x05,0xef,0x8b,0x59,0xba,},{0xe8,0x70,0x34,0x4d,0xf9,0x8d,0xd3,0xa8,0x70,0x2c,0x45,0x19,0xbf,0x9e,0x8b,0x35,0xa9,0xd1,0x89,0xe7,0x46,0xf7,0x20,0x3d,0xbb,0xf9,0xbb,0xfa,0xb2,0x2d,0x6f,0x63,},{0x83,0x46,0x0d,0x15,0x46,0x1d,0x67,0x17,0x71,0x0b,0xaf,0xd6,0xa4,0x7a,0x1e,0xaa,0x90,0x0a,0x80,0xf2,0xbf,0x8b,0x8a,0xae,0x24,0x68,0x77,0x36,0x14,0xee,0x84,0xbd,0x62,0x8c,0x97,0x17,0x47,0x63,0x68,0xef,0x36,0x40,0xcf,0x76,0x0a,0xca,0xc8,0x3a,0xd6,0x02,0x32,0xa7,0x69,0x63,0xb7,0xd5,0x25,0x88,0xb1,0x1d,0xc0,0x04,0xd7,0x0d,},\"\\x11\\xd2\\xc2\\xa7\\xf0\\x19\\x09\\x88\\x12\\x66\\x96\\x43\\x1b\\x4b\\xbc\\xd9\\x0a\\xb7\\xb5\\x6a\\x32\\xda\\x64\\x04\\xae\\x44\\x6a\\xa7\\x62\\xa4\\xdd\\xc6\\x60\\x94\\x97\\x15\\x38\\xee\\xb8\\x5b\\xde\\x04\\x70\\xa5\\x10\\xbe\\x0d\\x6d\\x85\\x78\\x0e\\xe7\\x30\\xa9\\x85\\x41\\x38\\x72\\x8a\\xe6\\x81\\x61\\x62\\x26\\x8d\\xa8\\x52\\x85\\x8e\\xae\\xd4\\xec\\x74\\xc7\\xac\\x62\\xe6\\xe7\\x09\\x6d\\xc0\\x02\\xdf\\x0b\\xdf\\x5f\\xa4\\x0d\\xa5\\x65\\xb4\\x1d\\x18\\x1a\\x3f\\x0a\\xd0\\xc5\\xe0\\xb9\\x76\\x74\\x3e\\x31\\x5d\\x9d\\xb8\\xed\\x41\\x60\\xab\\xe6\\x9c\\x13\\xa2\\xb3\\xf0\\x9a\"},\n{{0xe1,0x0a,0x2f,0x13,0x80,0xc3,0xe4,0x72,0x0e,0x8a,0x87,0x07,0xa9,0xbc,0xb2,0x5a,0x0f,0x58,0x27,0x0d,0x70,0x59,0xcd,0x76,0x26,0xc7,0x15,0x34,0x47,0xed,0xfb,0x87,},{0xa3,0xc7,0x17,0xac,0xab,0x36,0x6a,0x40,0xb5,0x11,0x87,0xbb,0xf3,0x5b,0x2d,0x15,0xe9,0x7c,0xfe,0xac,0xd7,0x34,0x9c,0x06,0xef,0x1c,0x91,0xac,0x93,0xe9,0x06,0x56,},{0x09,0x4b,0xf6,0xf9,0x53,0xca,0x0e,0xb7,0x7d,0xf4,0x51,0x29,0xb7,0xbf,0x10,0xd1,0x92,0xcf,0x6d,0xde,0xae,0x94,0xad,0x62,0x02,0xb8,0xea,0xcf,0xbe,0xc1,0x19,0xe5,0x29,0x15,0x78,0xfe,0x64,0xa0,0x84,0xae,0x60,0x0f,0xe0,0x7e,0xfd,0xb8,0xa7,0x82,0x61,0x0d,0xbd,0xb0,0xb4,0x9e,0xb5,0xf2,0xa4,0x6c,0x43,0x23,0x55,0x55,0x2f,0x01,},\"\\x13\\x52\\x12\\xa9\\xcf\\x00\\xd0\\xa0\\x52\\x20\\xbe\\x73\\x23\\xbf\\xa4\\xa5\\xba\\x7f\\xc5\\x46\\x55\\x14\\x00\\x77\\x02\\x12\\x1a\\x9c\\x92\\xe4\\x6b\\xd4\\x73\\x06\\x2f\\x00\\x84\\x1a\\xf8\\x3c\\xb7\\xbc\\x4b\\x2c\\xd5\\x8d\\xc4\\xd5\\xb1\\x51\\x24\\x4c\\xc8\\x29\\x3e\\x79\\x57\\x96\\x83\\x5e\\xd3\\x68\\x22\\xc6\\xe0\\x98\\x93\\xec\\x99\\x1b\\x38\\xad\\xa4\\xb2\\x1a\\x06\\xe6\\x91\\xaf\\xa8\\x87\\xdb\\x4e\\x9d\\x7b\\x1d\\x2a\\xfc\\x65\\xba\\x8d\\x2f\\x5e\\x69\\x26\\xff\\x53\\xd2\\xd4\\x4d\\x55\\xfa\\x09\\x5f\\x3f\\xad\\x62\\x54\\x5c\\x71\\x4f\\x0f\\x3f\\x59\\xe4\\xbf\\xe9\\x1a\\xf8\"},\n{{0xb2,0xe6,0x97,0xb3,0xd3,0xef,0xec,0x97,0x6e,0xf3,0x36,0x95,0x30,0xc7,0x92,0x71,0x7b,0xdb,0xb4,0x28,0xd9,0xed,0x0c,0x11,0xec,0x0e,0xa9,0xb2,0xe5,0xf3,0x9f,0x82,},{0xc4,0xd2,0xe4,0xb3,0xc2,0x36,0xd6,0xc9,0xb8,0xc7,0x4f,0xa3,0x84,0x61,0x2c,0x47,0x10,0xd8,0x3a,0xa1,0x6a,0xd7,0xef,0x01,0xfb,0xb7,0x42,0x1d,0x4f,0xb3,0xf0,0xf6,},{0x50,0x47,0xfa,0x38,0x19,0x7b,0x83,0x28,0xe7,0x8d,0xd8,0xa1,0x0e,0x96,0x6a,0xfb,0x7b,0xd3,0xd4,0x36,0x08,0x28,0x0f,0x1c,0x25,0x7d,0x25,0xca,0x43,0xbc,0x1c,0x06,0xe9,0x4a,0x57,0x47,0xab,0x62,0x15,0xec,0xe5,0x4c,0xde,0xff,0x8c,0x56,0x56,0x7d,0x70,0xd2,0xf9,0x1f,0x9e,0xc8,0xc2,0x60,0xaa,0x10,0x80,0xa6,0xab,0x5a,0x7a,0x02,},\"\\x7b\\x43\\x62\\x32\\xac\\x21\\x11\\xa8\\x40\\x59\\x51\\x0c\\x48\\x36\\x25\\x88\\xfc\\xb7\\x38\\x34\\x26\\xbe\\x5e\\x6f\\x62\\xf3\\x72\\xe4\\xf7\\xcc\\xa8\\x3c\\x81\\xc2\\x35\\x7f\\x9b\\x54\\xf4\\xa1\\x52\\x91\\x06\\x5b\\x6d\\x41\\xaa\\xd1\\xea\\x93\\xcf\\xfa\\x77\\x6b\\x9a\\xca\\xa5\\x8a\\xfe\\x2b\\x51\\x64\\x4b\\x97\\xaf\\x9a\\x3e\\x53\\xf8\\x4e\\x40\\xaa\\x6d\\x86\\x05\\x1e\\x69\\x14\\xcd\\x03\\x9d\\x41\\x70\\xa9\\xa5\\x26\\xdd\\x69\\x95\\x5f\\xf5\\x07\\xc3\\x3f\\x74\\xe2\\x17\\x65\\x91\\xfb\\x0b\\x3c\\xd7\\xf0\\x0e\\xe4\\x18\\xf2\\xc2\\x58\\xa9\\x98\\x1c\\xcc\\xee\\x72\\xf0\\x1c\\x84\\x30\"},\n{{0x19,0xa6,0x79,0xa7,0xa9,0x05,0xa1,0xe2,0xb3,0x03,0x8e,0x6e,0x41,0x8b,0x3d,0xa9,0x7c,0x30,0x89,0xc7,0xcd,0x35,0x1e,0xa0,0x7b,0xc8,0xd1,0xaf,0x64,0xea,0xcc,0x46,},{0x19,0xf0,0x83,0x61,0xf4,0x69,0xb4,0xae,0x1e,0x0c,0xeb,0x94,0xf4,0x7a,0x7d,0xe7,0x31,0x74,0x10,0xa9,0x2d,0xd0,0x13,0xb1,0x6a,0xe0,0xd0,0x53,0x2f,0xa4,0xb3,0xef,},{0x43,0x47,0xb7,0xb4,0xf7,0xc3,0xc4,0xdd,0x31,0x5b,0x83,0x84,0xa0,0xb0,0xca,0xee,0xd8,0x4b,0xda,0xbe,0x24,0xb2,0x91,0x5f,0x12,0x51,0x2d,0xfd,0x04,0x77,0x0f,0xc9,0x96,0xa1,0xbf,0xb7,0x29,0xaf,0xef,0x9e,0xdd,0x61,0x14,0x47,0x08,0x1a,0x53,0x30,0x61,0x7e,0xae,0xa1,0xc1,0xda,0xb1,0xbf,0x13,0xce,0xa8,0x99,0x72,0x04,0x91,0x0c,},\"\\x98\\x0c\\x7b\\x4d\\x29\\x39\\x06\\x1a\\xc7\\xb9\\xba\\x44\\x11\\x17\\xa1\\x94\\x85\\x66\\x17\\x81\\xa4\\x08\\x30\\x67\\xc5\\x5a\\xcf\\x93\\x02\\x6c\\x08\\x2a\\x93\\xcc\\x12\\x4f\\x09\\x5e\\x1b\\x4f\\x2c\\x3f\\x6c\\x13\\x54\\x12\\xa5\\x09\\x62\\x28\\xe8\\xa0\\x71\\xe8\\xb4\\xb6\\x68\\xba\\x9d\\x96\\x44\\xea\\x9f\\x4d\\xab\\xfc\\x54\\xa9\\x85\\x6c\\x3e\\x96\\x5e\\x63\\x63\\x39\\x5a\\xb7\\x09\\x03\\x7d\\xda\\x22\\x9b\\xaf\\x92\\x7c\\xd0\\x1f\\x9a\\xf5\\xe0\\x39\\xaf\\xc4\\x2f\\x3c\\xec\\x63\\x4f\\x5d\\x83\\x2d\\x2a\\xb7\\xc7\\xca\\xd3\\xad\\x7b\\x8c\\xf2\\x7e\\xbd\\xac\\x69\\x84\\x31\\xad\\x82\\x36\"},\n{{0xf0,0x3b,0x83,0x63,0xee,0x5b,0x0e,0xef,0x70,0x18,0xa4,0x9b,0xc0,0x2a,0xdf,0x73,0x1d,0xa5,0x4e,0xe5,0x0a,0x7f,0x03,0xb8,0x8a,0x29,0xa2,0x08,0x2b,0x18,0x9c,0x43,},{0x31,0x28,0x7e,0xf5,0xa2,0xe6,0x41,0x04,0xab,0x77,0x90,0xb3,0x12,0xf3,0x5c,0x7a,0xd4,0xaf,0x6b,0xeb,0x0d,0x7c,0xeb,0x8a,0x58,0xf3,0x6a,0x54,0xce,0x27,0x2c,0x3e,},{0xe8,0xfa,0x96,0x7e,0x6a,0xfa,0xdf,0x6a,0x87,0x7d,0x87,0xe5,0xf5,0xc5,0x2b,0xb6,0x34,0xb7,0x5a,0x78,0x04,0x19,0x9a,0x2b,0xc9,0xd0,0x27,0xb6,0x3a,0x35,0x65,0x4d,0x9d,0xdd,0x06,0x83,0x04,0x55,0x64,0x1d,0xbf,0xb4,0x9e,0xdc,0xe4,0x2e,0x20,0xe7,0xd4,0x10,0x4a,0x07,0x1c,0x2c,0xbb,0xec,0x23,0x01,0x8c,0x29,0x7c,0xed,0x99,0x08,},\"\\x24\\x19\\x1b\\x54\\x64\\xb3\\x5a\\xc7\\xbc\\xf4\\xa3\\x75\\xf0\\x33\\xef\\xba\\x89\\x43\\xb0\\x9b\\x9f\\xf0\\xfc\\x40\\x3c\\xa7\\xaa\\xe7\\x02\\xa3\\xcb\\xf3\\x96\\xc5\\x13\\x1b\\xc0\\x08\\x13\\x2c\\xf5\\xf1\\x29\\x10\\xd5\\x86\\xdc\\x1d\\xb9\\xc0\\x84\\x57\\x4a\\x96\\xba\\xbe\\xe9\\x56\\x42\\xf9\\x22\\x37\\x1c\\x03\\x82\\xec\\x04\\x02\\xa2\\x6f\\xeb\\x14\\x2e\\x41\\x46\\xbb\\xd3\\x36\\x0c\\x2b\\x36\\x83\\x4f\\xe4\\x5a\\xf5\\xe2\\x86\\x8d\\x4d\\x56\\xfd\\xd5\\x04\\xce\\xbf\\x0c\\x2d\\x7f\\x57\\x91\\xb4\\x42\\x94\\x17\\xc8\\xb6\\x5a\\x98\\xe0\\xb1\\x5c\\x46\\x6c\\x13\\x7f\\x41\\x05\\x24\\xfc\\xe7\\x37\"},\n{{0x11,0x08,0x6b,0x0d,0x11,0xe4,0x15,0xab,0x1c,0xe0,0x2a,0xaf,0x8f,0x06,0x21,0xb5,0x44,0x30,0xf6,0xfb,0x13,0x5c,0x74,0xf4,0x0d,0x38,0xe8,0xc6,0x47,0x37,0x06,0x4b,},{0x71,0x66,0xdf,0xbc,0x69,0x1e,0xb8,0xc2,0x01,0x11,0x4b,0xa0,0xd1,0xa2,0xc7,0xb8,0x7f,0x7a,0x1f,0xd8,0xd0,0xb3,0x60,0x58,0xb0,0xd7,0xdc,0xab,0xe1,0xae,0x30,0xda,},{0xe9,0x07,0x45,0x9d,0x5a,0xdc,0xd0,0xd0,0xc3,0x64,0x18,0x58,0x1f,0x19,0xd0,0xee,0xbd,0xa7,0x13,0x8e,0xbd,0x9f,0xaa,0x0b,0x26,0x22,0x01,0xf4,0x58,0xc8,0x56,0x31,0x0b,0xb7,0x7f,0x4c,0x7d,0xe9,0x22,0x49,0x5d,0xcf,0xe8,0xb2,0x48,0xed,0xa2,0xad,0x0d,0xf6,0xa7,0x3f,0x47,0xbb,0xfb,0x89,0x4b,0xaa,0x7d,0x88,0x69,0x87,0x58,0x02,},\"\\x4b\\x5b\\x29\\x36\\xc5\\xe3\\x60\\xa3\\x84\\x55\\x50\\x37\\x21\\x07\\x8f\\x8a\\xdb\\x40\\x4a\\x7e\\xe7\\xec\\xc1\\x48\\x01\\xdc\\x87\\xa6\\x7a\\x15\\x2b\\x76\\x95\\x69\\xfb\\xea\\xc0\\xaf\\xa2\\x5a\\x20\\x70\\xa1\\x68\\x6b\\x90\\x0a\\xc1\\x63\\x3d\\x49\\x98\\x08\\xcd\\xb2\\xe8\\x1c\\xe3\\x91\\x6d\\x5a\\x3c\\x04\\xd1\\x9c\\x5b\\xb2\\x69\\x9a\\x66\\x2b\\x8a\\xba\\x4a\\xf9\\x4d\\x39\\x0b\\xac\\x7c\\xcc\\x8e\\xc9\\x10\\xed\\x2a\\xcd\\xf8\\x6e\\xbb\\x71\\xad\\xb6\\x01\\x87\\x78\\x85\\xee\\xf3\\xc9\\x16\\x62\\xfc\\x30\\x73\\x8e\\x35\\x2c\\xc7\\x43\\x53\\xcc\\xf8\\xd8\\xed\\xee\\xfa\\xcc\\x04\\x2c\\x10\\xa0\\xe5\"},\n{{0xef,0xce,0x76,0x67,0xa8,0xef,0x91,0x22,0x8c,0xae,0xd1,0x4e,0xb4,0x77,0xa3,0x45,0xe5,0xe8,0x23,0x92,0x34,0x08,0x08,0x48,0x76,0x0e,0xd0,0x97,0x07,0x13,0xfa,0x86,},{0x91,0x93,0x05,0x5a,0x84,0xdf,0x1e,0xac,0xca,0x28,0xce,0x2a,0x08,0xc2,0xa0,0x7a,0x50,0xf0,0x4c,0x02,0x4e,0xcf,0x1f,0xe4,0xa4,0x7d,0x2e,0xfb,0xaf,0x63,0xed,0x58,},{0xe5,0xa6,0x31,0x24,0xdb,0x16,0x96,0xb6,0x41,0x40,0xb6,0xe9,0x61,0x2f,0xa9,0x58,0x7b,0x3e,0xef,0x71,0x01,0x09,0x39,0x8d,0x44,0xba,0x0c,0xa6,0x3c,0x0e,0xba,0xd0,0x6f,0x0a,0x6c,0x89,0x94,0xea,0x34,0xb3,0xa2,0xaf,0x91,0xa8,0x9b,0xf4,0x1a,0xe6,0x14,0xd7,0x72,0x7d,0x71,0x6f,0xd4,0x2f,0x8b,0x92,0xe1,0xac,0x64,0xfd,0xbf,0x03,},\"\\xaa\\x1b\\xc8\\x0d\\x7b\\xcc\\x1d\\x94\\xa2\\x3a\\x57\\xce\\xdf\\x50\\x27\\x48\\x24\\x77\\xdc\\x46\\xb8\\x68\\x90\\xbc\\x0e\\x5a\\xc2\\x9a\\xe6\\xc9\\x1b\\xbc\\x43\\x13\\x03\\x48\\x79\\x73\\x05\\xf7\\x55\\x43\\x58\\x0a\\x8a\\x06\\x9b\\x34\\x8a\\x7b\\xd8\\xfc\\x3e\\x01\\x52\\x30\\xb7\\xc1\\x94\\x0c\\x7f\\x80\\xa8\\x2b\\x12\\x90\\x09\\x10\\xdb\\xcf\\x06\\x30\\xda\\x03\\xf0\\x81\\xd4\\x4c\\x7f\\x95\\x5d\\x4a\\x11\\x72\\xf5\\x6e\\xcc\\x7c\\x5a\\xc6\\x46\\x69\\x6b\\xff\\xdf\\x4e\\xb6\\xd8\\x8b\\xdd\\x9c\\xc3\\x84\\x35\\x28\\xb7\\x25\\x83\\xab\\xb3\\xba\\xd0\\x2e\\x56\\xef\\x76\\x46\\xee\\xd5\\x13\\x95\\x51\\xcd\\xeb\"},\n{{0x88,0xfc,0xca,0xa9,0x6a,0xd8,0x84,0xd1,0x16,0x5b,0xe7,0x1d,0xd0,0xc4,0xf5,0xf8,0xf4,0x42,0x1c,0x60,0xfb,0xfa,0x49,0x8b,0xfe,0xe9,0xb9,0x67,0x46,0x24,0x43,0xbd,},{0xc7,0x5c,0xb0,0xe0,0x23,0x7b,0x45,0xb8,0x65,0x6e,0xea,0x9f,0x3d,0x1a,0x9d,0x4a,0xcd,0x01,0xa1,0x03,0xaa,0x26,0x9b,0xb2,0x4f,0xd5,0x41,0x22,0xfd,0x81,0xf2,0xac,},{0x27,0xd3,0xa1,0x97,0xcc,0x99,0x94,0x21,0x20,0x63,0xbc,0xe8,0xd7,0x99,0xe7,0x7b,0x68,0x53,0xb7,0x35,0x5e,0xbe,0x36,0x9b,0xcf,0x18,0x89,0xa4,0x18,0xa8,0x2c,0xaa,0x3a,0x79,0x87,0xa6,0x63,0xf6,0x21,0xde,0xfe,0x86,0xb3,0xac,0x4a,0xd4,0x4f,0xae,0xed,0x16,0xc9,0x11,0x6a,0xce,0x28,0xfc,0xcf,0x91,0x55,0x57,0xfa,0x77,0x99,0x03,},\"\\x9d\\x0e\\xac\\x98\\x55\\x6b\\xfa\\x86\\x72\\xc3\\x57\\x05\\xd1\\xd6\\x1a\\xc4\\xd0\\xfc\\xa1\\x9d\\xc0\\xd9\\x93\\x01\\x58\\x77\\x85\\x7d\\x27\\xfd\\x80\\xf7\\x4a\\xca\\xce\\x66\\x6c\\x56\\x34\\x85\\xd8\\x1e\\x53\\x60\\x3a\\x6a\\xef\\x40\\x87\\x5f\\xa5\\x51\\xcc\\x10\\x5f\\x2c\\xc1\\x0b\\x39\\x69\\x46\\x79\\xcd\\xf4\\xa6\\xb0\\x73\\xbc\\x88\\x64\\x5f\\xc5\\x1a\\x36\\xda\\x17\\x9d\\x3d\\x1e\\x3c\\x77\\x22\\x45\\x4c\\x5e\\x73\\x57\\x7c\\x61\\xaa\\x7d\\x14\\x8c\\x4b\\xa5\\x0e\\xa4\\x6c\\x56\\xa1\\xc3\\xb3\\xb3\\xc4\\x70\\xf9\\x31\\x00\\x49\\x4e\\x08\\xbc\\x55\\x14\\xac\\x76\\x3a\\x85\\x48\\x3c\\x42\\xc7\\xcd\\xc2\\x7c\"},\n{{0x67,0x0b,0x30,0x62,0x6f,0xe3,0x67,0xd8,0xb4,0x5f,0x43,0x73,0x3d,0x6f,0x25,0xb3,0x7e,0xcc,0xbc,0xb5,0x51,0x96,0x3f,0x0a,0xc8,0xb6,0x66,0xb4,0x80,0x41,0xc7,0x2d,},{0x65,0xaa,0x4c,0x6d,0x4b,0xa0,0xab,0x34,0xbc,0x75,0xb3,0x9f,0x09,0x52,0x7c,0xa6,0xf2,0x42,0x5f,0x52,0x41,0x5c,0xdf,0xfd,0xf2,0xdf,0xf2,0x73,0xf8,0xea,0x61,0x2c,},{0x1b,0x6b,0x43,0x77,0xd2,0xb9,0x8e,0x0f,0x9d,0x24,0xae,0x8d,0xfe,0x30,0xe2,0x39,0x6e,0x20,0x04,0x38,0x0d,0x34,0x31,0x48,0x8e,0x58,0x43,0xcf,0x8d,0x2d,0x7a,0x00,0x70,0xab,0x21,0xf8,0xa3,0xb5,0x1c,0xe8,0x4d,0x2f,0x4b,0xa2,0x09,0xf7,0x39,0xf9,0x22,0xbe,0xbf,0x79,0x80,0x96,0x69,0x3f,0x56,0x22,0x87,0x3d,0x79,0xae,0x6f,0x04,},\"\\xd0\\x0b\\xcc\\xa7\\xe1\\x84\\xd1\\x0e\\x1f\\x1f\\xe4\\x20\\xb5\\x06\\x39\\xe1\\xd5\\xde\\xba\\x52\\xa7\\x51\\x23\\x6e\\x68\\xc5\\x9b\\xb4\\xbf\\xf9\\x80\\x2f\\x5f\\xc1\\x65\\xed\\x42\\xfd\\x6d\\x53\\x46\\x70\\xa7\\xc6\\xfb\\x60\\xe4\\x30\\x7d\\x94\\x79\\x15\\xa2\\x48\\xbf\\x2f\\x93\\x46\\x5c\\x2c\\xb4\\x4d\\x8f\\x45\\x3d\\x2c\\x01\\x5a\\xfb\\xc8\\xed\\x58\\x81\\x8e\\xa5\\x17\\x26\\xa2\\x51\\x77\\x93\\x0e\\x9e\\xa1\\x92\\xef\\x45\\x14\\xf4\\xbb\\x0e\\xb4\\xe0\\xf5\\xd4\\xae\\x3c\\x46\\xe3\\x57\\xc8\\x11\\x87\\xf7\\xed\\x17\\x47\\x33\\xff\\xf9\\x59\\xc3\\xf9\\xfa\\xe6\\x48\\x6c\\xfa\\x13\\x56\\xa9\\x56\\x99\\x21\\x1d\\xe5\"},\n{{0x81,0x3c,0x4d,0xae,0xd6,0x7a,0x19,0x0d,0x68,0xbb,0x63,0x5d,0x73,0xaf,0x6d,0xa7,0x4f,0x32,0xfd,0xf7,0xc4,0x8c,0xca,0x6e,0x59,0x26,0x29,0x46,0xb8,0xe8,0xc7,0x1f,},{0xa2,0x09,0x54,0x57,0xd7,0x69,0x70,0x20,0xe2,0xb8,0x84,0xd9,0x5a,0x96,0x57,0x8c,0x2a,0x90,0x0a,0x76,0x66,0xac,0x0d,0xc7,0xbd,0x38,0xf1,0x93,0x1d,0x79,0x45,0xd8,},{0xb4,0x46,0x57,0x4f,0xf6,0xa4,0xbd,0x2b,0x57,0x2e,0x48,0x7c,0x4a,0xb4,0x43,0xca,0x64,0x10,0x75,0x16,0x8a,0xa4,0xe1,0x09,0x2f,0x71,0xf3,0x0b,0xdb,0x06,0x8c,0xe4,0x6a,0x39,0x5e,0xfe,0xe1,0xee,0x66,0x0b,0x9f,0xac,0x26,0xd5,0x41,0x09,0x72,0x2c,0x15,0xcd,0xb7,0x91,0xbf,0xb8,0x7f,0xff,0x63,0xc6,0x59,0x6a,0xd4,0xf2,0x27,0x0c,},\"\\xce\\x54\\xcb\\x04\\x50\\xe6\\x89\\xa0\\xdb\\xef\\x78\\x53\\x08\\xb3\\x17\\x74\\x72\\xfc\\xd6\\xd3\\x82\\x03\\xe5\\x8a\\x05\\x90\\xb3\\x1f\\xa2\\x53\\xf9\\xea\\x59\\x0b\\xe5\\x36\\x8a\\x92\\x2d\\xe8\\x8b\\x63\\x45\\x01\\x02\\x68\\x44\\x43\\xfb\\x81\\x89\\xe6\\x01\\x28\\x20\\x03\\x32\\x3b\\x89\\xc8\\x1e\\x92\\xea\\xef\\x2b\\x5d\\xdc\\x4a\\x55\\xc5\\x3f\\xa3\\xcf\\xad\\x41\\x60\\x24\\x8b\\x3c\\x28\\x6f\\xf8\\x0d\\x31\\xd1\\x61\\xb7\\xb8\\xde\\xe7\\x13\\x55\\x2b\\x56\\xf1\\x50\\x7f\\xb7\\x2e\\xad\\xfa\\x89\\x05\\x4e\\x9d\\x16\\x00\\xac\\x87\\x4c\\x4b\\x0a\\x96\\x10\\x04\\xeb\\x6d\\x0d\\x4b\\xfd\\x2e\\xcb\\x9c\\x73\\x4f\\x00\\xba\"},\n{{0x84,0x00,0x96,0x2b,0xb7,0x69,0xf6,0x38,0x68,0xca,0xe5,0xa3,0xfe,0xc8,0xdb,0x6a,0x9c,0x8d,0x3f,0x1c,0x84,0x6c,0x8d,0xce,0xeb,0x64,0x2b,0x69,0x46,0xef,0xa8,0xe3,},{0x98,0xbe,0x21,0x00,0x19,0x93,0xa7,0xeb,0x1a,0x12,0x77,0xff,0x74,0xc1,0x55,0x04,0x18,0x3d,0x25,0xfd,0xfc,0xc0,0x5f,0x0d,0x4d,0xea,0x89,0x2f,0x6e,0x30,0x18,0x90,},{0x0a,0xd7,0x1b,0x00,0x25,0xf3,0xd9,0xa5,0x0d,0xb3,0x38,0x41,0x4d,0x6d,0x67,0x0e,0x77,0x99,0xb7,0x27,0x0a,0x84,0x44,0xf6,0xae,0x7f,0x12,0xae,0x7e,0xb7,0x1b,0xd0,0x3f,0xfd,0x3c,0x4f,0x36,0x63,0x1f,0x69,0xfd,0xcc,0x40,0x61,0x46,0x8f,0xf5,0x82,0xed,0xe4,0x95,0x24,0x3e,0xf1,0x36,0x1a,0x3b,0x32,0x95,0xfa,0x81,0x3b,0xa2,0x05,},\"\\xf7\\xe6\\x7d\\x98\\x2a\\x2f\\xf9\\x3e\\xcd\\xa4\\x08\\x71\\x52\\xb4\\x86\\x4c\\x94\\x3b\\x1b\\xa7\\x02\\x1f\\x54\\x07\\x04\\x3c\\xcb\\x42\\x53\\xd3\\x48\\xc2\\x7b\\x92\\x83\\xac\\xb2\\x6c\\x19\\x4f\\xd1\\xcb\\xb7\\x9e\\x6a\\xfc\\x32\\xff\\x68\\x6b\\x55\\xb0\\xb3\\x61\\x72\\x18\\xdc\\xf3\\x93\\x16\\xb4\\xb6\\x6b\\x3c\\x8c\\x0d\\x67\\x26\\x7a\\x86\\xdb\\x8a\\xdf\\x37\\x50\\x80\\x1b\\xcf\\x93\\x27\\xd4\\xc2\\x54\\x41\\xb9\\x61\\x97\\x83\\x2b\\x4c\\xde\\x0e\\xac\\x3f\\xf2\\x28\\x92\\xa2\\xf0\\xbc\\x17\\xc2\\xc2\\x13\\xc0\\x23\\x77\\xa3\\x33\\xe3\\x08\\xed\\x27\\x16\\x58\\x04\\x93\\x83\\xb7\\xe2\\xe5\\x7b\\x6b\\x8b\\x12\\x55\\x12\\xe0\"},\n{{0x62,0x88,0x72,0x20,0x35,0xd1,0xea,0x69,0x9b,0xc7,0xcf,0xdf,0x18,0xd8,0x96,0x25,0x42,0x31,0x80,0xb6,0x83,0xfa,0x74,0x63,0x9f,0x4f,0x30,0xf1,0x53,0x59,0xcc,0x85,},{0xe1,0x7f,0xaa,0x01,0x95,0x72,0x86,0x1a,0x06,0x4e,0x1b,0xc5,0x71,0x25,0x6d,0xea,0x14,0x68,0xf3,0xa4,0x85,0x90,0xa8,0x91,0x38,0xaa,0xa8,0x59,0x25,0x08,0x0c,0xd7,},{0x9d,0xec,0x92,0xb6,0xe8,0x9a,0xdb,0xe8,0xf4,0xe1,0xb5,0xe9,0x3a,0xc4,0xfc,0xf9,0x57,0xde,0x7d,0x19,0x70,0xa2,0x26,0x77,0x0e,0xc4,0xed,0xa6,0x47,0xc8,0xe3,0xb3,0xdf,0xfb,0x27,0x31,0xa3,0x9e,0x16,0xe4,0xa0,0x11,0x9d,0x36,0x62,0xa9,0x37,0xe5,0x60,0x52,0x24,0x91,0xec,0x7a,0x16,0x96,0xbe,0x04,0xc0,0x76,0xb1,0x2e,0x35,0x01,},\"\\x8b\\x6c\\xaa\\xca\\xc5\\x1d\\x89\\x49\\xfb\\x86\\xac\\xbc\\xb1\\xb9\\x9d\\x85\\x9f\\xf6\\x7c\\x64\\x14\\x7b\\xc1\\x21\\x69\\x09\\xdc\\xab\\x07\\xee\\x6e\\xf0\\x9f\\x40\\x38\\x63\\x32\\x73\\x94\\x68\\x9d\\xc3\\x4a\\xbc\\x77\\x8f\\xcb\\x5c\\x1f\\x50\\x91\\xac\\xf5\\xa0\\x8f\\x9d\\x84\\x22\\x11\\xd1\\xae\\x2e\\xb4\\x0b\\xe9\\xbb\\x8d\\x66\\x79\\x07\\x74\\x71\\x54\\x7a\\x6c\\x71\\xff\\x77\\xb5\\x19\\xd4\\xb7\\x10\\x8e\\x32\\xbc\\x46\\x25\\x1c\\x60\\xde\\xe8\\xe3\\x32\\xb6\\x22\\x93\\x16\\xe6\\xd5\\x7c\\x22\\xab\\x82\\x6f\\xf1\\xbc\\x33\\xf2\\xb0\\x21\\x38\\x07\\xc1\\x92\\x80\\xaf\\x11\\x0f\\xd2\\x6e\\xe2\\x74\\x68\\x20\\x1c\\xff\\x49\\xcb\"},\n{{0x13,0x03,0x8a,0x3a,0x65,0xef,0x32,0x75,0x9a,0x9c,0xd9,0x03,0xac,0xb5,0x54,0xb2,0x52,0xde,0x00,0xe7,0xcd,0xb7,0x7b,0xbe,0xd1,0x97,0x0b,0x20,0x68,0x0e,0xe1,0x7b,},{0xb6,0xa3,0x08,0xe6,0x7f,0x9b,0x46,0xc6,0x64,0x99,0x45,0x6a,0xb5,0xcd,0x13,0x5c,0xb2,0xfe,0x84,0xa3,0x2e,0xb0,0x45,0x35,0x86,0x26,0x60,0x4d,0xa4,0x12,0x2c,0x8f,},{0x52,0x61,0x55,0x8e,0xcc,0x3c,0x98,0xff,0x36,0x35,0x1f,0x42,0xf5,0x04,0xca,0xd4,0xa3,0x2f,0xfd,0xa5,0xa7,0x44,0x56,0x09,0x60,0xb4,0xc1,0x06,0xe4,0x49,0x2f,0x02,0xe2,0x04,0x78,0x88,0x7a,0xfe,0xe4,0xf7,0x70,0xf0,0x55,0x97,0xa7,0xe3,0x88,0xca,0xce,0xae,0x80,0x5a,0xe3,0x51,0xe0,0xe4,0x5e,0x8e,0x57,0x8e,0x6a,0x6f,0xf2,0x0c,},\"\\xdd\\xf0\\x0b\\x40\\x33\\xa2\\xa0\\x88\\x02\\x2d\\xab\\xe9\\x33\\x56\\x43\\x2f\\x50\\xdd\\xc6\\xc6\\xe1\\xa6\\x59\\xdc\\x1a\\x93\\x12\\x4a\\x4c\\x2f\\xff\\xfd\\x18\\x27\\x65\\xa2\\xf5\\x6c\\x43\\xea\\x0b\\xfd\\x8d\\xe8\\x01\\x50\\x60\\x88\\x9a\\xe6\\x94\\x1c\\x3f\\x3e\\x25\\x5d\\x44\\x21\\xa1\\xc3\\x62\\x01\\xbe\\x84\\x6a\\x27\\x38\\xa7\\x1f\\x12\\x0c\\xad\\x59\\x8c\\xa8\\x52\\x7d\\x70\\xff\\x8d\\x5a\\x09\\x93\\xb5\\x5c\\xb5\\x15\\x35\\x17\\x11\\x0a\\x41\\x96\\x2d\\xaf\\xf4\\x22\\x50\\x15\\x8f\\x20\\x96\\xd1\\xdd\\xaf\\x71\\x86\\xe5\\x02\\x98\\xcb\\xe5\\x1f\\xcb\\x42\\x9c\\xbe\\xa4\\x11\\x29\\x3f\\x8a\\x7b\\xd9\\xcf\\x06\\x9f\\xa2\\x37\\xe4\"},\n{{0xb9,0xde,0x5b,0x06,0x3d,0x3c,0xa3,0xa7,0x73,0xf1,0x14,0x94,0x1b,0x2e,0x42,0x27,0xc0,0x75,0x11,0xc0,0xf5,0xc0,0x60,0x17,0xb9,0xc8,0x84,0x50,0x18,0xf2,0x34,0x32,},{0x52,0x95,0x24,0x3c,0x86,0x46,0xe0,0x96,0x67,0x4d,0xda,0x15,0x97,0x9b,0x32,0x2b,0x9d,0xd0,0xfa,0xf2,0x7d,0x02,0x4a,0x0e,0xd5,0x77,0x13,0x34,0xe1,0x17,0x9e,0xd2,},{0x92,0xba,0x76,0x0d,0x14,0xd1,0x41,0x5c,0xfa,0xf2,0x18,0xca,0x84,0x70,0x14,0x08,0x8a,0xe5,0x1a,0xd8,0x21,0x11,0x3a,0x6f,0x86,0x30,0x35,0x6f,0x7b,0xa8,0x5c,0x00,0x5e,0x23,0x30,0xf1,0x06,0x6d,0x0d,0xf4,0x64,0x80,0x60,0x52,0xa4,0x17,0x46,0x10,0x05,0x04,0x62,0xf3,0xe0,0x13,0xd7,0x02,0xe7,0xc7,0x71,0x85,0xa0,0x32,0x58,0x0b,},\"\\x94\\x93\\xcc\\x23\\x89\\x6b\\x84\\x09\\x60\\x46\\xae\\x10\\x53\\xaf\\xe3\\x94\\x99\\xe9\\x42\\x42\\x54\\xb3\\x66\\xfe\\x14\\x3f\\x4d\\xa3\\x21\\xe2\\xdc\\x9e\\x47\\x84\\x20\\x8e\\x12\\xa5\\x42\\xd8\\x99\\x82\\x8d\\xde\\x7e\\xff\\x62\\x5a\\x7f\\x12\\x41\\x69\\x90\\xc2\\x84\\x1f\\xfb\\x09\\x5b\\xf9\\x4c\\x0c\\x61\\x0e\\x5a\\x66\\x39\\x18\\xb6\\x89\\x03\\x1c\\xcd\\x6b\\x51\\x93\\x49\\xd0\\x4d\\xe1\\xc2\\x12\\xca\\x2a\\x9d\\x7a\\xbf\\x52\\xe1\\xb4\\xfd\\x46\\x7b\\xb6\\x65\\xb6\\x91\\x9e\\xf8\\xf9\\x16\\x17\\xe2\\x05\\x56\\x5b\\xf5\\x66\\x47\\xe5\\xf8\\xd5\\x08\\xea\\x20\\x0a\\x84\\x46\\x7f\\x8f\\xa1\\x22\\xe7\\x4b\\xc3\\xb9\\x97\\x9f\\x11\\x74\\xe5\"},\n{{0x8f,0xf0,0x29,0x7c,0xc0,0x88,0x42,0xb5,0xe6,0x75,0x52,0xec,0x28,0x43,0xe0,0x43,0x53,0xa3,0x4d,0x74,0xef,0x89,0xb8,0x56,0x5d,0x97,0x20,0x5b,0x74,0xca,0x13,0x3a,},{0x0f,0x7e,0xf9,0x8c,0x5b,0xa4,0xaf,0x98,0x4d,0xfb,0x77,0xbc,0x4e,0x53,0x7b,0x2b,0x39,0xe6,0x27,0x3b,0xb3,0xe7,0xb9,0x5f,0xe1,0xb7,0xe6,0x78,0x19,0x52,0xbd,0x4a,},{0x07,0x83,0x73,0x7f,0x70,0x6e,0x6f,0xf3,0x66,0x14,0xf8,0x50,0x07,0x4f,0xca,0x1f,0x48,0x5f,0x24,0xfc,0xde,0x2a,0x28,0xaf,0x54,0x4f,0x37,0xab,0xd6,0x9b,0x7a,0x58,0x1d,0xef,0xd8,0xc7,0x71,0xb0,0x31,0xe1,0x08,0xd1,0x9d,0x78,0x8c,0x74,0xc5,0xf2,0x0b,0xb3,0xf1,0xc2,0x1c,0xd9,0x2b,0xe3,0x17,0xba,0xcd,0x8f,0x65,0x0b,0x49,0x05,},\"\\x2b\\xdc\\x3a\\x48\\x6c\\x5e\\x4e\\xa6\\x2d\\xcf\\xec\\x8a\\x9d\\x4f\\xcf\\x9e\\xa9\\x49\\x0d\\xbc\\xc7\\x15\\x61\\x5d\\x58\\x49\\x0a\\x72\\xce\\x83\\x3f\\xa2\\x23\\x87\\xca\\x50\\xa0\\x05\\x25\\x08\\xcf\\x0a\\xff\\x1c\\xa7\\x27\\xf0\\xfe\\xd4\\x6f\\xfa\\x7d\\x3c\\x8e\\x23\\xc5\\xbb\\x01\\xd4\\x7e\\x90\\xff\\x06\\xd3\\x85\\x8a\\x55\\x7d\\x99\\x26\\x48\\x15\\x79\\xda\\xf4\\x38\\x4a\\xea\\x50\\xe9\\x6e\\xc6\\x15\\xd2\\xa3\\xbf\\x3c\\x11\\x22\\xf1\\xf2\\x4d\\xd6\\xed\\x98\\xa5\\xde\\x42\\x18\\x83\\x58\\x9c\\x21\\x39\\x98\\xca\\x54\\x32\\x37\\x3e\\x68\\xbb\\xbe\\x89\\x42\\x8c\\xa9\\x88\\x5d\\x05\\x93\\xd5\\xe6\\x21\\x51\\x16\\xb8\\x26\\x63\\x86\\x45\\x2b\"},\n{{0x05,0x0d,0x55,0x3d,0x28,0x2d,0xca,0x32,0x69,0xc8,0x3c,0x18,0x17,0x68,0xec,0x06,0x7b,0x81,0xc9,0xfe,0x0c,0x94,0xf2,0xa0,0xeb,0xbb,0x0c,0x94,0x2d,0x0f,0xcd,0x7c,},{0x63,0xe2,0x30,0xb0,0x03,0xc5,0x3a,0x56,0x72,0xe8,0x32,0xff,0x7f,0x24,0x43,0x0b,0xe2,0x23,0xe4,0x97,0xde,0x84,0x02,0x33,0xf5,0x95,0xa3,0xe2,0x00,0xc7,0x12,0x7e,},{0x3f,0x0e,0x83,0x76,0x5b,0x31,0xbb,0xe8,0xe1,0xfb,0x92,0xe9,0x67,0x8d,0x6c,0xde,0x57,0x1a,0x03,0xba,0x7f,0x1d,0xcc,0x11,0x28,0x46,0x1f,0x70,0x85,0x25,0x45,0x7f,0x4e,0x0e,0x23,0x53,0xaa,0x2b,0x59,0x8c,0x06,0x3f,0xf1,0xbf,0xfd,0xac,0x91,0x6b,0x5a,0x22,0x00,0x65,0x51,0x56,0x90,0x4b,0x05,0x85,0x57,0x7a,0x16,0x28,0x56,0x0d,},\"\\x15\\xe1\\x3b\\x8c\\x01\\x00\\x4f\\x6a\\xa5\\xb2\\x36\\xdb\\xb2\\x81\\x67\\x7f\\x74\\x6d\\x81\\xe5\\x48\\xe0\\xaa\\x80\\xf0\\xe4\\x14\\x52\\x15\\x21\\xd8\\x56\\xcd\\x69\\x4e\\x7c\\x91\\x52\\xbb\\x5e\\x43\\x77\\x6b\\x60\\xf6\\xb5\\x60\\xed\\x1a\\xd3\\xe4\\xb3\\x90\\xdb\\xf3\\xe4\\x6e\\xf9\\x25\\x74\\x43\\xf3\\x9c\\x14\\x9e\\x02\\x40\\xa0\\x2d\\x02\\x1e\\x1e\\x3d\\x7d\\x04\\x6b\\x26\\xfd\\x00\\x4e\\xee\\x7c\\xa1\\x6a\\x80\\x59\\xe1\\x26\\xc7\\x4c\\xb3\\xf2\\x19\\x4d\\xb4\\x7b\\xf6\\x04\\x65\\xec\\xef\\x5c\\x70\\x4d\\x2e\\x2c\\x75\\xe2\\xe5\\x00\\x60\\xea\\x2a\\x31\\xcb\\x72\\xb7\\xb3\\xc6\\xb1\\xb5\\xec\\x72\\xab\\x38\\x00\\x40\\x85\\x28\\x1a\\x22\\xfe\\x86\"},\n{{0x69,0x49,0x7c,0xd7,0xb4,0xe8,0x68,0xcf,0xa0,0x32,0x8d,0x92,0xbd,0x60,0x52,0xd7,0x72,0xb2,0x76,0x73,0x95,0xc1,0x45,0x95,0xb2,0x79,0x85,0x1a,0x9c,0xdd,0x31,0xaa,},{0x5d,0x27,0x6d,0x62,0x6e,0x23,0x0d,0x18,0xe7,0xbc,0xd6,0x11,0x41,0xcb,0x93,0xc9,0x0e,0xf0,0xf7,0x9e,0x01,0x32,0x12,0x12,0xd8,0x38,0xec,0x71,0x45,0x7b,0x1a,0xac,},{0xbe,0xaf,0xa5,0x83,0x40,0x96,0x09,0x08,0xe8,0xd8,0x6e,0x40,0x32,0x9e,0x3a,0x45,0x23,0xfc,0x7b,0xe7,0x70,0xad,0xdb,0x86,0xe3,0x4c,0x37,0x72,0xf8,0x4c,0xd9,0xfb,0x33,0x8d,0x1f,0x3b,0x65,0xbf,0xcd,0xb0,0x9f,0x35,0xc6,0xda,0x36,0xd1,0xa3,0xad,0xf8,0xf9,0x1f,0x1f,0xfd,0x57,0x82,0xcc,0x83,0x02,0x06,0x43,0x3a,0x08,0x41,0x0d,},\"\\x53\\xcd\\x08\\x0a\\x0c\\x61\\xf1\\xa0\\x93\\xd3\\xb3\\xa7\\x45\\x71\\xc2\\x96\\x30\\x3f\\x36\\x3b\\x41\\x07\\xed\\xbe\\x88\\x0b\\x7a\\xa9\\xdf\\xe4\\x4a\\xb5\\xd5\\xdc\\x5f\\x74\\xbe\\x9c\\x8d\\x87\\x6f\\x04\\xd7\\x54\\x65\\x34\\x91\\xab\\x51\\xb1\\x35\\xfc\\x95\\x3f\\x71\\x28\\x7b\\x62\\xff\\x41\\xb6\\x7c\\x74\\x2b\\xd3\\x44\\x56\\x71\\xa9\\xd4\\xf2\\xdc\\x17\\x4c\\xa1\\xb0\\x33\\x5f\\x78\\x62\\x7a\\x0d\\xd4\\xb3\\x06\\x50\\x50\\x41\\x78\\x03\\x9e\\x73\\x93\\x63\\x85\\x10\\xff\\xe8\\x40\\x91\\xb5\\x72\\x98\\xd3\\xac\\x90\\x01\\xc3\\x67\\xc1\\x45\\x2f\\xbc\\xb3\\x3d\\xc5\\x4a\\x5d\\xc3\\x16\\xfb\\x2a\\x52\\x70\\x76\\x4a\\x2a\\xc8\\x20\\xa0\\xb6\\x3f\\xbd\\xc6\"},\n{{0x21,0x65,0xa4,0x86,0xb6,0x12,0xbb,0xff,0x52,0x9c,0xd0,0x03,0x46,0x96,0x4a,0x3c,0xb8,0xcd,0xcf,0xfa,0x51,0xdc,0x3d,0x52,0x4d,0xd5,0xad,0xc5,0xac,0x93,0x6d,0x68,},{0x7e,0xbc,0x83,0x9a,0x46,0x5e,0x14,0xf5,0x89,0x24,0x76,0xe4,0xa1,0x3b,0x39,0x88,0xf8,0x3b,0x3c,0xd2,0x7e,0xf7,0x9e,0x19,0x3f,0x86,0xfa,0x16,0xf3,0x4a,0x1c,0xe1,},{0x7e,0xc6,0xfb,0xa5,0x6b,0xa5,0x24,0x60,0xa1,0xb4,0xf2,0x73,0x86,0x89,0xc1,0x88,0x3d,0xda,0x9a,0xaf,0xfc,0x8b,0xde,0x17,0xcb,0x60,0x29,0xbd,0xce,0x3a,0x0e,0xbe,0x2f,0xff,0xda,0x55,0x93,0x9b,0x70,0xbb,0xd0,0x7f,0xdb,0xf6,0xfc,0x5c,0xda,0x87,0xfe,0xd8,0xba,0x58,0x57,0x5f,0x89,0x4a,0x36,0x6e,0x45,0xe5,0x70,0x5e,0xea,0x09,},\"\\xb7\\x28\\xda\\x7a\\x36\\x16\\x7c\\x60\\x85\\xbd\\x2d\\x96\\x2c\\xf6\\x39\\x59\\xfa\\xcd\\x95\\xc9\\xad\\x45\\x42\\x02\\x8a\\xfb\\xa9\\x0e\\xc9\\xc6\\xc0\\x76\\x0b\\xda\\xe9\\x35\\x42\\x9c\\x3f\\xeb\\x39\\x33\\xe2\\xf0\\x00\\x42\\xc6\\x72\\xad\\x2c\\xd7\\x34\\x8d\\x92\\xbc\\x33\\xf8\\x17\\x51\\xe2\\x94\\xae\\x91\\x71\\xb9\\x45\\xb1\\x93\\x14\\x4e\\xf8\\xac\\xb9\\xa1\\xbd\\x9a\\xbf\\x04\\x75\\xce\\x0d\\x0a\\xc7\\x89\\xb2\\x00\\xc3\\x2e\\x9c\\x9a\\x27\\x36\\xb1\\x68\\x36\\x9c\\xe5\\xf9\\x7b\\x1e\\x8d\\x2e\\x79\\x00\\xe1\\xa7\\x59\\x17\\x84\\x41\\xf1\\xfc\\x43\\x05\\x64\\xae\\x12\\x9b\\xae\\x78\\x57\\x74\\x05\\x11\\xa6\\x68\\xf3\\x2c\\x0a\\x3b\\x07\\x7a\\x9d\\x8b\\x19\"},\n{{0x1c,0x64,0xad,0x63,0xdd,0x14,0x70,0x34,0x59,0x8e,0x12,0x8f,0x74,0x06,0xec,0x05,0x30,0x74,0x6e,0xa1,0xc5,0xb7,0x2e,0xcf,0x79,0xe8,0x88,0x06,0x54,0x86,0xfa,0x1b,},{0xba,0xa6,0xbc,0xc1,0xc3,0xd8,0xd3,0xb1,0x1f,0xfc,0x15,0x87,0xad,0xdd,0xc5,0x8b,0xfd,0x96,0xc2,0xb9,0x92,0xb6,0xc6,0xf5,0x9f,0xcc,0x50,0xcc,0xbc,0xdd,0x0e,0xb9,},{0x74,0x77,0xe5,0x41,0x58,0xf1,0x3b,0x71,0x28,0xc0,0xa1,0x10,0xca,0x6b,0x65,0xf4,0x25,0x14,0xfb,0x70,0xcd,0x5c,0xf2,0x8a,0x8b,0x1c,0xc6,0x11,0x0e,0xa0,0x6f,0xcf,0x94,0x29,0x0d,0xa1,0x3f,0x85,0xa1,0x1c,0x23,0x51,0xd3,0xbb,0xcc,0xbb,0x4c,0x64,0xe0,0x21,0x5d,0x6d,0x0f,0x00,0x99,0xe7,0xf2,0x7b,0xc9,0x4e,0x94,0x9b,0x15,0x0b,},\"\\x9e\\xbd\\x8e\\x33\\x78\\x93\\xbb\\x05\\x3e\\xf2\\xb9\\xe3\\x26\\x9d\\xf5\\x48\\x48\\x49\\x4f\\x03\\xcd\\x63\\x57\\x6b\\x33\\xe6\\x4b\\x10\\x80\\xbe\\x4b\\xe0\\x15\\x26\\x4a\\x40\\x3f\\xb9\\x60\\x2b\\xbf\\x90\\xca\\x19\\xb2\\x41\\xa9\\xb6\\x68\\x63\\x90\\x9b\\x90\\x08\\xce\\x1b\\x2f\\xfc\\xf2\\x36\\xef\\xa4\\xc2\\x66\\x8f\\x0f\\x47\\xdb\\x9f\\xf5\\xfa\\x15\\x7d\\x9c\\xb6\\x05\\x41\\x2b\\xe7\\xdd\\x8b\\x07\\xea\\x87\\x8c\\xcc\\xae\\x6b\\xf5\\x0f\\x93\\x5b\\x86\\xd1\\x9e\\x1b\\x64\\x8b\\x69\\xe5\\x28\\x55\\x3a\\x56\\xd8\\xaf\\xb7\\x82\\x21\\xad\\x53\\x30\\x7b\\x7a\\x4e\\xc8\\xd2\\xfd\\x48\\x61\\xb5\\x5d\\xc5\\xda\\xe8\\xe9\\x3e\\xf3\\x87\\xfb\\xbe\\x0b\\x4c\\xe7\\xf7\\x88\"},\n{{0x55,0xab,0xbc,0x5d,0xac,0x41,0x28,0x13,0x4d,0xc8,0xc6,0x01,0x8a,0x21,0x3e,0xd4,0xb6,0x0f,0xcc,0x8e,0x90,0xcb,0xd4,0x1d,0xb2,0xd2,0x1e,0xda,0x53,0x73,0xe9,0x36,},{0x25,0x1a,0xfa,0xa2,0x64,0x69,0x26,0xb2,0xa3,0x71,0xf2,0xa0,0x9d,0x58,0x65,0xb9,0x8c,0x9a,0x5e,0xb6,0xca,0x04,0x7c,0xd0,0xd8,0xee,0x36,0xe5,0xe0,0x41,0x69,0x74,},{0xf6,0xa6,0x1c,0x2e,0x66,0x1a,0x9e,0xb7,0xbd,0xe1,0x82,0xe3,0x8e,0xc9,0x9a,0xf9,0x85,0xf6,0x16,0x98,0xa5,0xd7,0xfa,0x43,0x0d,0x16,0xe3,0xf1,0xa9,0x37,0x09,0xb7,0x55,0x22,0x32,0x0d,0xe4,0x8a,0xfc,0xc5,0x95,0xab,0x20,0x91,0x22,0xae,0x0c,0xe1,0x32,0xcd,0xf4,0xb0,0x39,0x17,0x46,0xe7,0xff,0x34,0x11,0x77,0x57,0x0c,0x81,0x08,},\"\\x47\\x01\\x0e\\x13\\x98\\xad\\x55\\xfa\\xbe\\x37\\x1d\\xd8\\x64\\x8f\\x76\\x8d\\x90\\xdf\\x4b\\x96\\x5a\\x3b\\x39\\x61\\x00\\xb3\\x03\\xb4\\x0a\\x17\\x51\\x8b\\xed\\x6d\\x86\\xb0\\x9f\\x73\\x4a\\xb7\\xc1\\x0b\\x5f\\x3a\\x01\\xb5\\x3d\\xee\\xc5\\xf8\\x53\\x4b\\x70\\xc7\\x9f\\x3f\\x29\\xb2\\x84\\xfd\\xec\\x48\\x6f\\x22\\xf4\\x4c\\x22\\xcc\\xd5\\xc6\\x46\\x35\\x94\\x41\\x52\\x67\\xba\\xa6\\x11\\xf7\\x0b\\x1b\\x31\\x6c\\xaa\\x1b\\x68\\xb5\\xe0\\xe9\\x9b\\x31\\xc5\\xbb\\x0c\\xe1\\x36\\x79\\xa2\\x3c\\x31\\xa6\\x39\\x99\\x69\\x81\\x64\\xcb\\xf3\\x7d\\x10\\x3b\\xa9\\x24\\x90\\x18\\x8b\\xe5\\x99\\x37\\xf1\\x23\\x04\\x3e\\xc7\\x86\\xef\\xe3\\xd4\\x11\\xf9\\xb0\\x62\\x3a\\x6a\\xd9\\x72\"},\n{{0xf2,0xdc,0xf4,0xa1,0xa0,0xd4,0x6d,0xdb,0x2d,0x72,0xf8,0xfd,0xd8,0x0b,0xbe,0xc5,0xb7,0xde,0xa5,0x91,0x3d,0xa4,0x96,0x6c,0x2f,0x4d,0x12,0xc2,0x61,0xf0,0xbf,0x98,},{0xd3,0x95,0x70,0xa2,0x5c,0xa5,0x9f,0x22,0x57,0xf9,0x3f,0x96,0x60,0x0d,0xf4,0xf6,0x3e,0x68,0x4b,0xf6,0x3a,0xe8,0xdf,0xfd,0x91,0x4e,0x46,0x29,0xc3,0xd5,0x09,0x5f,},{0x42,0x88,0x2a,0x81,0x1d,0xad,0x2d,0x85,0x18,0x85,0xe4,0xcb,0xe9,0x04,0x47,0x08,0xd9,0x1a,0x86,0xf1,0x5d,0xfa,0x1d,0x66,0xc3,0xeb,0x30,0x43,0x14,0x53,0x1f,0x30,0x15,0x20,0x8c,0x71,0x1b,0x9b,0xdb,0xc5,0xfb,0x23,0x39,0x51,0xe5,0x69,0xb5,0x9d,0x34,0xe4,0x15,0xee,0xc4,0xb3,0x7f,0xfd,0x37,0x4d,0x41,0x2c,0x9a,0x36,0x0d,0x0c,},\"\\x3b\\x00\\xe8\\x08\\xfc\\xa4\\xc1\\x16\\x51\\xd8\\x53\\xd6\\xb9\\x0f\\x95\\x2c\\xcf\\x56\\x47\\xe1\\x02\\xd4\\xee\\x0a\\xd7\\xa5\\xd1\\x81\\xd5\\xb4\\x25\\x8c\\x52\\x3c\\xd3\\x9e\\x3d\\x98\\x25\\x29\\x8d\\x84\\xc8\\xcb\\xa0\\x9f\\x43\\xdb\\xba\\x11\\x99\\x88\\x22\\x2c\\x76\\x05\\x9c\\xaf\\x17\\xb4\\xbf\\x99\\x31\\xc4\\x5e\\x61\\x74\\x48\\xae\\xad\\xe1\\x51\\x18\\x14\\x97\\xb2\\x45\\x52\\x36\\x7e\\x52\\xbc\\x45\\xac\\x79\\x08\\x88\\x06\\xd3\\x36\\x82\\x07\\xaa\\xfe\\xfd\\x30\\x57\\x84\\x5d\\xce\\x81\\x9d\\x5a\\xaa\\xa7\\x7b\\x21\\x8e\\x2a\\xed\\x3d\\xa7\\x6d\\x40\\xc1\\xf0\\x76\\x99\\xf8\\x17\\x2e\\x4a\\x5c\\x80\\x3f\\x7a\\x2a\\xce\\xb9\\xa4\\x7a\\x89\\x52\\xe1\\xb2\\xf0\\x53\\xf2\"},\n{{0x22,0x46,0xbf,0xb0,0x61,0x55,0x85,0x9e,0x10,0xa7,0x48,0xff,0x8f,0x59,0x19,0xad,0x5d,0x1d,0xaa,0xb7,0x56,0xf0,0x10,0x57,0xb7,0x90,0xd0,0x74,0x74,0x77,0x5f,0x4f,},{0xfa,0x63,0x49,0xb6,0x2d,0xc8,0xc6,0xa2,0xfe,0xee,0xf6,0xff,0xc3,0x3a,0xe0,0x85,0xc6,0x49,0x79,0x5c,0x1c,0x9d,0x98,0x98,0xe7,0x5c,0x13,0xae,0x16,0x25,0xdb,0x34,},{0x2b,0xe4,0x91,0x5a,0x35,0x2f,0x77,0x85,0x48,0x30,0x46,0xd8,0xae,0x96,0x25,0xb8,0xb6,0x32,0x57,0xaf,0x57,0xc0,0x73,0x69,0x12,0x56,0xee,0x07,0x6d,0x6e,0x1b,0x97,0x2a,0x10,0x1f,0x55,0x1c,0x70,0x5d,0x3f,0x96,0x15,0x7c,0x33,0xb5,0x6e,0xa0,0x49,0xbe,0x4a,0xf4,0xdc,0x56,0x1c,0xbe,0x3c,0x1e,0xc5,0x07,0x2d,0x7f,0x13,0x4e,0x07,},\"\\x63\\xee\\x1c\\x7b\\xbb\\x15\\xce\\xbe\\x1c\\x22\\x53\\x2d\\x48\\x16\\x82\\x75\\x4b\\xda\\xf5\\x8b\\x8b\\xc9\\x97\\xae\\x30\\xa3\\x4c\\x9d\\x23\\xc3\\x3f\\x16\\x90\\xc3\\x46\\xab\\x0a\\x73\\x65\\xff\\x62\\x45\\x74\\x24\\xb6\\x10\\x5f\\x84\\x21\\xec\\xa0\\xce\\x3c\\x63\\x0a\\xcf\\xeb\\x9a\\x1c\\xc4\\x16\\x39\\x0e\\xdf\\x49\\x20\\xe2\\x2b\\x23\\x67\\xe9\\xfb\\x5d\\x2a\\xb2\\x5b\\xee\\x56\\xda\\x03\\xea\\x55\\xe3\\xf5\\x78\\x82\\xd4\\x8b\\x89\\x22\\x93\\x14\\xd7\\x34\\xcb\\x83\\xc7\\x9f\\x4e\\x17\\xee\\x64\\xba\\xe6\\xf7\\xad\\xdb\\xe9\\xb5\\x25\\xfc\\xd0\\x3a\\x91\\x40\\x9a\\x2d\\xde\\x90\\x77\\x51\\xdb\\x8c\\xc9\\x7e\\x08\\xd0\\xea\\x89\\xc4\\xd1\\x87\\x18\\xd2\\x6d\\x0b\\x89\\x7b\\x64\"},\n{{0xc0,0x88,0xa3,0xdd,0x2c,0xb8,0xbd,0x5d,0x68,0x4d,0xb8,0x53,0x8d,0xc2,0x24,0x73,0xb6,0xf0,0x14,0xf6,0x4f,0xe8,0x6a,0xf1,0x68,0xb4,0xbb,0x01,0xb9,0x0a,0x1d,0xd0,},{0xaa,0xd6,0x15,0xa9,0xc2,0x87,0x59,0xf0,0x3d,0x37,0x3a,0xbe,0x66,0x66,0x91,0xde,0xad,0x8b,0x84,0xf9,0xb8,0xb5,0x0a,0x67,0xf8,0xf0,0xaa,0x4a,0x70,0x15,0x80,0xd1,},{0x3b,0xb4,0x59,0xd1,0xac,0x57,0x5a,0x18,0x0c,0x17,0x28,0xd8,0xb8,0x92,0x49,0x70,0x49,0x2a,0x0c,0x8d,0x2a,0x37,0x8c,0x29,0xd1,0xd4,0x17,0x85,0xc8,0x37,0x9a,0x58,0xe2,0xba,0x36,0x06,0x78,0x5e,0x1c,0x5d,0xa2,0x9e,0x55,0x27,0x55,0x2b,0xc6,0xdc,0x89,0xa2,0xb6,0x9c,0x27,0xfe,0x51,0xed,0x25,0x3a,0x9f,0x3b,0x56,0x5b,0x27,0x00,},\"\\x74\\x90\\x6a\\xe0\\x5a\\x5a\\xf8\\xe9\\x96\\x8b\\x6f\\xeb\\x49\\x85\\x69\\xd6\\x34\\x5a\\x24\\xf9\\x71\\x1b\\xef\\xb1\\x36\\xe6\\xc3\\xb5\\xed\\x49\\x33\\x9e\\x59\\xa7\\x93\\x8b\\x4b\\xa1\\xa1\\x18\\xf1\\x69\\xb9\\xac\\xe0\\xf7\\x84\\x2a\\x26\\xa6\\x45\\xf1\\x4c\\x0a\\xd2\\x2e\\xbb\\xcd\\xa9\\x3e\\x67\\xe4\\xc3\\x48\\xef\\xc3\\xd9\\xec\\xbb\\x14\\x19\\xe6\\x26\\x2d\\x04\\x36\\xa5\\x8e\\xa8\\x2c\\x22\\x02\\x38\\x90\\x65\\xcc\\xf6\\x7c\\x4f\\x55\\x0e\\x45\\xb5\\xf6\\xa1\\x2a\\x6c\\x01\\x1b\\x2e\\x0a\\x30\\x10\\x1d\\x5c\\x62\\x32\\x8b\\xbf\\x99\\xc8\\xc9\\x55\\x63\\xa6\\xe3\\x3b\\xdd\\x9c\\xce\\x72\\xb1\\xf7\\x20\\x13\\x9c\\x2f\\xd3\\xe0\\x49\\x13\\x14\\x6a\\xe5\\xba\\xc5\\x28\\x8e\\x0e\\x3e\"},\n{{0x45,0x66,0x7d,0x1e,0x7b,0x59,0x10,0x97,0x9c,0x4a,0x32,0x83,0x17,0x96,0x83,0x71,0xc8,0x64,0xd5,0x64,0xa6,0x61,0xc5,0xcc,0xe5,0x57,0xc9,0xec,0xc6,0x1b,0xab,0x9e,},{0xed,0xcd,0xf5,0xe1,0xa1,0x70,0xe0,0x0c,0x8c,0x68,0x7e,0x7e,0x9c,0x18,0xf9,0x89,0x3b,0x5f,0xe4,0x95,0xcd,0x29,0x77,0xce,0xb7,0xf4,0x46,0xc0,0x14,0x9a,0xa9,0xd3,},{0x6d,0xe6,0x68,0xf1,0xca,0x6f,0x29,0x28,0x14,0x62,0x52,0x89,0xa0,0x80,0x80,0x20,0xc8,0x7c,0x89,0xac,0x94,0xf5,0xb0,0x50,0x8e,0x55,0x7b,0xdf,0x80,0x00,0xa5,0xca,0x80,0x8f,0x02,0x1c,0x96,0x79,0xb5,0x0e,0xe2,0xf3,0x20,0x06,0x4c,0x95,0xa4,0x64,0xa8,0x43,0x93,0x79,0x82,0x8c,0x3b,0x76,0xcf,0xa7,0x66,0x45,0x5e,0x12,0x8c,0x0b,},\"\\xcd\\x66\\xce\\xc4\\x76\\xc8\\x7c\\x8d\\xbf\\x47\\xec\\x91\\xda\\xc4\\x8f\\xb5\\xb4\\x2d\\xb1\\x28\\x2a\\x57\\x3e\\x0a\\x5c\\xf0\\xb9\\x17\\x68\\x98\\x66\\x08\\xe1\\xd7\\xeb\\xd0\\x5f\\x52\\x51\\xbc\\xf8\\xb4\\x7a\\x17\\x09\\x32\\x29\\xac\\xef\\xbd\\x44\\xbe\\xb2\\x1c\\x0c\\x0c\\x92\\x8d\\xd3\\xcd\\x3f\\x89\\x66\\xec\\xce\\x69\\x10\\x33\\x1c\\x50\\x8e\\xa7\\x6b\\xaf\\x90\\x4d\\x8c\\x21\\xf6\\xc1\\x7c\\x2c\\x58\\xd0\\x0a\\xfd\\x32\\x59\\xb8\\xbf\\x79\\x4c\\x14\\x6b\\x12\\xb9\\x95\\xcd\\xdd\\x1c\\x42\\x89\\xc5\\xbe\\x31\\x68\\xeb\\xd6\\x16\\xb3\\x84\\xc2\\x81\\xce\\x1b\\x38\\xa1\\x0e\\x18\\x07\\x80\\x88\\x53\\xc6\\x81\\xa6\\x40\\xa0\\x09\\xb4\\xd2\\xac\\xd7\\x93\\x4f\\x8c\\x6d\\x07\\x57\\x81\\x61\"},\n{{0x24,0x89,0x74,0x28,0xae,0x65,0x46,0xd8,0x5b,0x31,0x90,0xeb,0xe3,0xf1,0xf7,0xbf,0x7c,0x71,0x25,0x28,0xac,0x85,0x1a,0x58,0x8b,0x07,0xd5,0xc8,0xf9,0x4e,0xec,0xd1,},{0x5f,0x34,0x8f,0xe3,0xea,0x5b,0x2c,0x02,0x3d,0x0a,0xf7,0xed,0xe6,0x0e,0x55,0xf9,0x1a,0xa5,0x51,0x99,0x69,0x9d,0xa1,0x5a,0x11,0xc3,0x79,0x1d,0x68,0xd7,0x10,0xbd,},{0x1b,0x5e,0x75,0xde,0xf4,0x9f,0x51,0xd6,0xb2,0xde,0x00,0x8c,0x71,0xfc,0x1a,0x90,0x9b,0xd4,0x2c,0xa8,0x13,0x29,0x8d,0xce,0x4e,0xee,0xf7,0x17,0x81,0x5d,0x7a,0x6c,0x07,0x8c,0x2f,0x3d,0x9a,0x3f,0xce,0x1a,0xb5,0xb3,0xad,0x8e,0xf8,0xd4,0x5c,0xdf,0x2e,0xb4,0x90,0x1c,0x32,0xee,0xa2,0xd5,0xe0,0x18,0xdc,0xf2,0x83,0x3c,0xad,0x0c,},\"\\x52\\x01\\xd9\\x72\\x5f\\x1d\\xff\\xa1\\x86\\x3f\\xa4\\xd8\\x4c\\x30\\x18\\x61\\x14\\x1a\\xcd\\xfb\\x64\\xbe\\x1f\\xbf\\xdd\\x5b\\x93\\x86\\xdb\\x20\\xef\\x39\\x40\\x99\\xee\\xbc\\xfd\\xfe\\xcc\\x62\\xc6\\x26\\x86\\x07\\xa8\\x4d\\x55\\xc5\\x5c\\xd0\\xef\\xdc\\x37\\x2e\\xcf\\x30\\x67\\x34\\x3e\\x7b\\x07\\x31\\xc2\\x68\\x54\\x61\\xe2\\x4b\\x95\\x3f\\x99\\x94\\x9e\\x59\\xba\\x3e\\x67\\xed\\x0f\\x08\\x48\\x31\\x37\\x93\\x96\\x2a\\x29\\x2c\\x45\\x98\\x14\\xc5\\xe2\\x86\\x90\\xec\\x1f\\x45\\x17\\x1f\\x1a\\xba\\xb8\\x6f\\xdd\\x14\\x56\\x8b\\x00\\xca\\xf4\\x85\\x81\\x11\\x5e\\xe5\\xea\\x83\\xb0\\x00\\x28\\x2f\\xbb\\xf0\\xc0\\xb2\\xa1\\x11\\x60\\x39\\xa3\\x5c\\xfa\\x3f\\x20\\x14\\x22\\x20\\x7a\\x3d\\x49\\x48\"},\n{{0x7b,0x04,0xac,0xa7,0xcf,0x92,0x62,0x16,0xcb,0x96,0x0a,0x38,0x90,0x78,0x63,0x39,0xd0,0xa6,0x15,0x96,0x76,0x80,0x19,0x01,0x23,0xfd,0xa3,0xb6,0x0c,0x6a,0xeb,0x11,},{0xcd,0xbc,0x3e,0x70,0xe4,0xe8,0xfd,0x13,0xd0,0xcc,0xe2,0x85,0x2a,0x3b,0x93,0x72,0xc3,0xa6,0x16,0x0c,0xd6,0xde,0xab,0xa9,0x0f,0x9b,0x30,0x22,0xf7,0x0c,0x91,0xf9,},{0x25,0xd2,0xd3,0x61,0x75,0x1d,0x52,0xb4,0xfe,0x66,0xea,0x18,0xe4,0xb9,0x86,0x6b,0xde,0x3d,0x12,0x1a,0x73,0x12,0xfd,0x9e,0x28,0xa1,0xe2,0x95,0xe0,0x87,0xe3,0x17,0x6c,0x94,0xc8,0x74,0xa2,0xe8,0x16,0x00,0xf2,0x4c,0x46,0x54,0xf4,0x3d,0x1b,0x67,0xd4,0x7b,0x64,0x82,0x26,0x48,0x59,0x0c,0xe5,0xce,0x44,0xf3,0xb5,0xdd,0xc5,0x02,},\"\\x1c\\xb0\\x96\\x24\\xb1\\xf1\\x4a\\x02\\x60\\xc7\\xf5\\x6d\\x8c\\x60\\xb5\\xfe\\x45\\x83\\x71\\x14\\x23\\x25\\x51\\xef\\x59\\x66\\x38\\x6e\\x0c\\x2b\\x44\\x1b\\x75\\xcf\\xdb\\x8d\\xf2\\x18\\x57\\x85\\xd2\\x2c\\xf5\\x26\\xfa\\x9d\\xf7\\xfd\\x45\\xd9\\xd8\\x38\\x81\\xb6\\x6c\\x1f\\xee\\xe0\\x91\\x3e\\x23\\x81\\x21\\xee\\xdb\\xb7\\xab\\x50\\x4d\\xa0\\xbe\\xe8\\x99\\x80\\x16\\x68\\x45\\x35\\x03\\x19\\x91\\xf1\\x1b\\xfc\\xd9\\xb9\\x56\\x90\\xaa\\xd2\\xd1\\x9b\\xd6\\xa9\\xde\\x18\\x44\\xed\\x13\\x62\\x30\\x2d\\xf4\\x21\\x72\\x30\\xb2\\x5c\\x05\\x52\\xce\\x27\\x75\\x34\\xc6\\x50\\xca\\xe5\\x26\\x57\\x7f\\x25\\xd8\\xb1\\xfe\\x9f\\x9f\\xeb\\xca\\x2c\\x81\\x46\\x70\\xd4\\x80\\x5b\\x21\\xad\\xef\\x85\\x2d\\xaf\\x94\"},\n{{0xea,0x73,0xbf,0x64,0xa1,0xa9,0x78,0x77,0xc3,0xc3,0xe7,0xca,0x46,0x44,0xb7,0x1a,0xaa,0x66,0x31,0x4c,0x8f,0x1b,0x66,0xba,0xfa,0xeb,0xd5,0xed,0xfb,0x88,0x8b,0xcd,},{0xca,0xac,0x93,0x90,0x2e,0x57,0x64,0xad,0xe4,0x72,0x94,0xed,0xd5,0x1f,0xaa,0x14,0x62,0x09,0x40,0xc6,0x68,0xb5,0xc1,0xc3,0x92,0xa6,0x92,0x83,0x25,0xd4,0xc3,0xfd,},{0xbd,0x86,0xcb,0x9c,0x70,0xa0,0x55,0x27,0x9a,0x86,0xa9,0xe6,0x48,0x70,0x98,0x8b,0x8a,0x73,0x45,0xc3,0xcd,0x29,0x48,0xa0,0xfa,0xbc,0xfb,0x38,0xab,0xce,0x3c,0x42,0x0b,0x4d,0x55,0x21,0x61,0x8e,0x11,0xd2,0xde,0x82,0x7d,0x9d,0xe5,0x69,0xf6,0xbc,0x3b,0xe6,0x6a,0xad,0x40,0x63,0x6c,0xda,0xa6,0x47,0x60,0xde,0xd3,0xb7,0xc2,0x09,},\"\\x36\\x2e\\xec\\x68\\xb9\\x12\\x85\\x27\\x86\\xbb\\x4f\\x9a\\xff\\xf9\\xec\\xf7\\xcb\\x28\\xc9\\xde\\x6b\\x18\\x42\\x2a\\x8c\\xa9\\x40\\xb0\\xd7\\xe6\\xdc\\xb8\\x3a\\xa4\\x4b\\xe0\\xaf\\xb5\\xf1\\x80\\x6d\\x43\\xf0\\xe3\\x1d\\x71\\xf9\\x22\\xf8\\x53\\x61\\x5a\\x26\\xe2\\x87\\xa2\\x7f\\x08\\xa0\\x4f\\xbc\\xe3\\xd4\\x5a\\x0c\\x6c\\x31\\x1d\\x4b\\x7c\\xb1\\x7e\\x42\\x5b\\xbe\\xb0\\xa6\\xb4\\x10\\xb5\\xd6\\xdb\\xb7\\xac\\x11\\xdf\\x98\\x50\\xa1\\x31\\xa6\\x91\\xe3\\xb6\\x0b\\x0b\\x21\\x4e\\xbe\\x04\\x41\\x06\\xe9\\x82\\x43\\x32\\x87\\x59\\x52\\x67\\xb0\\x31\\xb5\\xd4\\xa0\\x92\\x62\\xde\\xd8\\x93\\x4f\\xdf\\xdf\\x96\\x4d\\x86\\x8e\\xf9\\xa2\\xc8\\x42\\xf8\\x04\\xea\\xfd\\xde\\xfc\\xb7\\x1d\\x9f\\x16\\xa5\\x9b\\xf8\"},\n{{0xb8,0x12,0x3c,0x11,0x6b,0x33,0xba,0xd0,0xdc,0xbc,0x2c,0x4d,0xc0,0x6a,0x3d,0x66,0x85,0x0d,0xab,0x36,0x0c,0xdb,0x5a,0x03,0x3c,0x14,0x89,0x5c,0x4e,0xe3,0x1b,0xfb,},{0xbd,0xca,0x15,0x1b,0xa3,0x2c,0x6b,0xb3,0x15,0x31,0xb0,0x5f,0xdf,0x86,0xc6,0xd7,0x8c,0x8c,0xd1,0x93,0x56,0x11,0xd5,0xff,0x11,0x1a,0x0f,0x00,0x63,0x5b,0x18,0x85,},{0x9c,0xf1,0x3e,0xba,0x3d,0xcc,0x37,0xb8,0xfc,0x70,0xcc,0xb2,0x32,0x74,0x36,0xb9,0xf0,0x88,0x55,0xe7,0x26,0xaa,0x7e,0xd8,0x2b,0xd5,0xcb,0x7d,0xf4,0x5f,0xdf,0x9e,0xc1,0xf9,0x6a,0xfa,0xd1,0x93,0xf4,0x75,0x72,0xd7,0x70,0x44,0x4b,0x65,0xb7,0x4a,0x37,0xcc,0x03,0x4f,0xc5,0x14,0xcb,0x3f,0x91,0xb2,0xd8,0xad,0xa5,0xb0,0x20,0x06,},\"\\x79\\x70\\xf6\\x66\\x66\\x34\\x54\\x8c\\x84\\x8b\\xb5\\x23\\x38\\x81\\x7b\\x26\\xa4\\xd0\\xca\\x68\\xdf\\x3d\\x28\\xaf\\xff\\x20\\x7c\\x2d\\x02\\x80\\x67\\xa1\\x8e\\x4c\\x95\\x43\\x02\\x5f\\x5b\\x02\\x28\\xaa\\x69\\x1e\\x50\\x88\\x51\\x31\\x51\\xa9\\x44\\x94\\xe1\\x5d\\x1f\\x54\\x21\\x03\\x28\\xe0\\xdf\\x15\\x9b\\x35\\x2c\\x30\\xaa\\xa7\\xa8\\x44\\xf1\\x8a\\x9f\\x4c\\x39\\x5d\\xcb\\xb3\\xfb\\x9f\\xcf\\xbe\\xd1\\x10\\x3e\\x07\\x06\\xfb\\xf9\\xc3\\x5f\\xe2\\x66\\x68\\x48\\xfa\\x35\\xdc\\x2c\\xf5\\x22\\x7e\\xbe\\xe8\\x9e\\x7d\\x3b\\xcf\\xae\\x27\\x21\\xb2\\x5f\\xde\\xc3\\xd3\\x17\\x4e\\xa7\\xce\\x26\\x7a\\x55\\xdd\\x61\\xd5\\x82\\x01\\xe9\\x6b\\xda\\x30\\x3c\\xf4\\x18\\xed\\xf6\\xe3\\x2f\\xb9\\x2f\\x5d\\xc1\\xa0\\xb1\"},\n{{0xb1,0x8e,0x1d,0x00,0x45,0x99,0x5e,0xc3,0xd0,0x10,0xc3,0x87,0xcc,0xfe,0xb9,0x84,0xd7,0x83,0xaf,0x8f,0xbb,0x0f,0x40,0xfa,0x7d,0xb1,0x26,0xd8,0x89,0xf6,0xda,0xdd,},{0x77,0xf4,0x8b,0x59,0xca,0xed,0xa7,0x77,0x51,0xed,0x13,0x8b,0x0e,0xc6,0x67,0xff,0x50,0xf8,0x76,0x8c,0x25,0xd4,0x83,0x09,0xa8,0xf3,0x86,0xa2,0xba,0xd1,0x87,0xfb,},{0x6b,0xd7,0x10,0xa3,0x68,0xc1,0x24,0x99,0x23,0xfc,0x7a,0x16,0x10,0x74,0x74,0x03,0x04,0x0f,0x0c,0xc3,0x08,0x15,0xa0,0x0f,0x9f,0xf5,0x48,0xa8,0x96,0xbb,0xda,0x0b,0x4e,0xb2,0xca,0x19,0xeb,0xcf,0x91,0x7f,0x0f,0x34,0x20,0x0a,0x9e,0xdb,0xad,0x39,0x01,0xb6,0x4a,0xb0,0x9c,0xc5,0xef,0x7b,0x9b,0xcc,0x3c,0x40,0xc0,0xff,0x75,0x09,},\"\\x91\\x6c\\x7d\\x1d\\x26\\x8f\\xc0\\xe7\\x7c\\x1b\\xef\\x23\\x84\\x32\\x57\\x3c\\x39\\xbe\\x57\\x7b\\xbe\\xa0\\x99\\x89\\x36\\xad\\xd2\\xb5\\x0a\\x65\\x31\\x71\\xce\\x18\\xa5\\x42\\xb0\\xb7\\xf9\\x6c\\x16\\x91\\xa3\\xbe\\x60\\x31\\x52\\x28\\x94\\xa8\\x63\\x41\\x83\\xed\\xa3\\x87\\x98\\xa0\\xc5\\xd5\\xd7\\x9f\\xbd\\x01\\xdd\\x04\\xa8\\x64\\x6d\\x71\\x87\\x3b\\x77\\xb2\\x21\\x99\\x8a\\x81\\x92\\x2d\\x81\\x05\\xf8\\x92\\x31\\x63\\x69\\xd5\\x22\\x4c\\x99\\x83\\x37\\x2d\\x23\\x13\\xc6\\xb1\\xf4\\x55\\x6e\\xa2\\x6b\\xa4\\x9d\\x46\\xe8\\xb5\\x61\\xe0\\xfc\\x76\\x63\\x3a\\xc9\\x76\\x6e\\x68\\xe2\\x1f\\xba\\x7e\\xdc\\xa9\\x3c\\x4c\\x74\\x60\\x37\\x6d\\x7f\\x3a\\xc2\\x2f\\xf3\\x72\\xc1\\x8f\\x61\\x3f\\x2a\\xe2\\xe8\\x56\\xaf\\x40\"},\n{{0x93,0x64,0x9c,0x63,0x91,0x0b,0x35,0x71,0x8e,0x48,0xc5,0x90,0xd2,0x61,0xc4,0x8e,0x4e,0xf8,0x33,0x66,0x13,0xf6,0xaa,0x07,0x7b,0x46,0x26,0x76,0xb3,0xba,0x88,0x29,},{0x06,0xa6,0x85,0x89,0x8b,0x85,0x52,0x12,0xeb,0xc2,0x89,0x91,0x5d,0x10,0x5a,0x43,0x20,0xd6,0x20,0xd8,0x57,0x71,0xb8,0xc6,0xb1,0x5b,0xf1,0x0a,0x1b,0xe6,0xe9,0xb8,},{0x62,0x74,0xf2,0xd4,0xf4,0x31,0xd5,0xaf,0xfe,0xfa,0x35,0xe7,0xcf,0x58,0x4a,0x59,0x90,0x17,0x19,0x3d,0xa9,0x90,0x94,0xca,0x90,0x8b,0x75,0xac,0xb6,0x08,0xd1,0xbf,0x98,0x18,0x57,0xbe,0x93,0xa7,0xda,0xfb,0x0f,0xad,0xb3,0xff,0x09,0x06,0xf4,0x8a,0x5e,0xe9,0x50,0x45,0x6f,0x78,0x2c,0x2d,0x60,0x5b,0x14,0x09,0x5b,0xa0,0xff,0x0f,},\"\\x2c\\xd1\\xa9\\x51\\x05\\x6c\\x9e\\xba\\xe1\\x39\\x9b\\x6b\\xd2\\xd8\\x2c\\x0a\\xe2\\x77\\x85\\x62\\x90\\xd0\\x69\\x20\\xac\\x56\\xca\\xc8\\xfb\\x42\\x43\\x51\\x01\\xc7\\x2a\\xa9\\xc0\\x8d\\xd2\\xd1\\x24\\x26\\x32\\x55\\x62\\xc2\\xf0\\xa4\\x9c\\xd8\\x21\\xb1\\x1b\\x93\\x9a\\xaf\\xa5\\x93\\xb4\\x09\\x5c\\x02\\x1b\\xcb\\x48\\x27\\xb1\\x07\\xb9\\x66\\x4d\\x68\\x28\\x28\\x88\\xbc\\x4a\\x44\\xaf\\x3e\\x3b\\xdc\\x86\\x1b\\xe6\\xaf\\x30\\x90\\x44\\xc3\\xda\\xab\\x57\\xb7\\x70\\x23\\xdc\\x90\\x2d\\x47\\xeb\\xc3\\x26\\xf9\\xbd\\xd0\\x2d\\xbc\\x02\\xcd\\x54\\x0f\\xf8\\x1b\\x2d\\xdf\\x7c\\xf6\\x79\\xa4\\x11\\x93\\xdf\\xe5\\xf8\\xc8\\xca\\x1a\\xae\\xfc\\x41\\xef\\x74\\x02\\x80\\xd9\\x82\\x3e\\x30\\xa3\\x54\\x71\\x7c\\x84\\x31\\xf5\\xd8\"},\n{{0x1c,0x15,0xcb,0xeb,0x89,0x36,0x2d,0x69,0x47,0x6a,0x2a,0xa4,0xa5,0xf3,0xef,0x20,0x89,0xcf,0x87,0x28,0x63,0x49,0xe0,0xdf,0xe0,0xe7,0x2d,0x9e,0x3e,0x5a,0x66,0xc7,},{0x13,0xa8,0x82,0xa1,0x06,0x41,0x82,0x58,0x2c,0x21,0x18,0x47,0xe1,0x9b,0x4d,0xac,0x59,0x72,0x2c,0x9f,0xfd,0x34,0x82,0x6d,0x96,0xf3,0x31,0x13,0x40,0x0f,0xac,0x7a,},{0x59,0x98,0xb2,0x80,0x8a,0xdf,0xde,0xea,0xeb,0xe2,0xc3,0xea,0xc0,0x26,0xd3,0xf8,0x25,0xf9,0xc7,0xf2,0xaf,0x97,0xca,0x32,0x4f,0xbd,0x57,0xaa,0xc1,0xbe,0xdf,0xf7,0x8a,0x8e,0xe6,0x21,0xd0,0x37,0xee,0x3a,0xd2,0xa7,0x12,0xe9,0xa0,0x09,0xc5,0x8e,0xa3,0xe6,0xf2,0xa8,0x28,0xf7,0x4b,0x86,0xda,0x27,0x5a,0x44,0xa4,0xb1,0xe5,0x0b,},\"\\x09\\x1c\\x9b\\x9b\\x11\\x6a\\xe8\\x3d\\x23\\xd0\\x1a\\x62\\x95\\x21\\x17\\x85\\xd4\\x46\\xb6\\x22\\x8d\\xd6\\x87\\xdd\\xf7\\x9b\\xd0\\xd5\\xa4\\xda\\xa8\\xc7\\x9d\\x2c\\xbf\\xc3\\x73\\x65\\xf1\\xf2\\x85\\xe3\\x61\\x73\\x81\\x23\\xe3\\x4e\\x2b\\xcb\\xfc\\x66\\x4c\\xe1\\x25\\x3a\\x11\\xd9\\xe4\\xa7\\x98\\x2e\\x58\\xcf\\x94\\x68\\xe1\\x01\\x7e\\xa1\\x4d\\x2c\\xc6\\xd0\\x86\\x5d\\x40\\xfd\\xe8\\xcb\\x56\\x02\\x41\\xe9\\x6a\\xc1\\x61\\x7c\\x79\\x1f\\x0c\\xa7\\xc6\\x41\\x0c\\xad\\xf3\\x28\\x61\\x1b\\x18\\xae\\xf3\\x33\\xd8\\x35\\x0a\\xc4\\x97\\xf0\\xa4\\xae\\x2d\\x03\\xfd\\xf0\\xe2\\x3e\\x42\\x6d\\x34\\xf4\\x51\\x47\\x80\\xd1\\x47\\x4e\\x11\\x35\\x83\\x54\\x1f\\x3c\\x04\\x36\\x72\\x05\\x71\\x72\\x61\\x8c\\xb2\\x05\\x9e\\xaa\\xed\\x56\"},\n{{0x11,0x24,0x1f,0xfd,0xf3,0x4a,0xe8,0xab,0x87,0x54,0x75,0xe9,0x4c,0x6c,0xc3,0x29,0x1f,0x0b,0x88,0x20,0xdc,0x85,0xe2,0x0f,0x32,0xfc,0x53,0xb2,0x4a,0xe6,0x89,0x78,},{0x09,0xc0,0x45,0xe4,0xbd,0x51,0x37,0x31,0x4c,0x0e,0xc1,0xd0,0x31,0xfa,0xf9,0x14,0x91,0x0c,0x45,0xa4,0x67,0x6f,0x5a,0x3c,0xd8,0xf5,0x81,0xbc,0xcc,0xb0,0x3c,0x97,},{0x72,0xce,0x9f,0x91,0xbe,0x2e,0x66,0xcf,0xc9,0x0f,0x95,0x25,0x95,0x94,0x6f,0xfc,0x90,0xbf,0xce,0x53,0x08,0x7d,0x49,0xe5,0xdd,0x7c,0x08,0x7f,0x3f,0xaa,0x8f,0x18,0xf2,0x35,0x6d,0xe9,0x71,0xe4,0x42,0x9d,0x98,0x5a,0x99,0x19,0x4b,0x4f,0x92,0xce,0xd3,0xef,0x47,0xcd,0x71,0x14,0x37,0x9e,0x0b,0x32,0x67,0xa9,0xf8,0xb1,0xe7,0x06,},\"\\x3b\\x89\\xde\\xcc\\xb7\\x02\\x3e\\x4b\\x2b\\x7a\\xff\\x2c\\x39\\x51\\x87\\x0a\\xf4\\x13\\xa9\\xb0\\x4d\\xd8\\x6a\\xc7\\x8b\\x7c\\x8f\\xd8\\x87\\x49\\x2d\\x8d\\xde\\x49\\xd8\\xfd\\xa1\\x49\\xed\\xd5\\x47\\x81\\xae\\x2b\\x50\\x80\\x30\\xd1\\x44\\x16\\xa9\\xa3\\x8b\\xed\\x2b\\x9a\\xeb\\xbb\\xb2\\x02\\x50\\xb3\\xc9\\x31\\xac\\xd4\\xe3\\x2f\\xbe\\xee\\xc5\\xa2\\x65\\x01\\xbe\\xab\\x72\\x68\\xd1\\x44\\xfc\\xe8\\x95\\x1a\\x10\\x1c\\x4b\\x51\\x78\\x16\\x6f\\xbb\\x59\\x27\\xb1\\xdf\\xb1\\xe1\\xce\\x90\\xd1\\xd1\\x23\\x06\\x8e\\x3f\\x47\\x2c\\x88\\x8f\\xdb\\x01\\xfd\\xf7\\x0e\\x7f\\x8d\\xe9\\xb0\\xad\\xb2\\x84\\xb7\\x11\\x9f\\x55\\x35\\x43\\x16\\xf8\\x4e\\xd0\\x90\\x03\\x0f\\x9c\\x26\\x62\\x06\\x1c\\xa4\\x84\\x47\\xcc\\x0a\\xef\\x96\\x41\\x26\"},\n{{0x3b,0xdb,0x16,0x24,0x65,0xea,0xce,0xff,0x98,0xd6,0x9c,0x86,0xf7,0x00,0x39,0xc5,0x17,0xd1,0x68,0xae,0xfe,0x6b,0xb1,0x01,0xb4,0xf7,0x69,0xa8,0x6b,0x17,0xc9,0x72,},{0xd7,0x6c,0xb7,0xbe,0x74,0x32,0x82,0x89,0xfd,0x1c,0x64,0xbe,0x74,0x7c,0xca,0x5b,0xb3,0x02,0x95,0xdf,0xac,0xcd,0x0f,0x2e,0x43,0xf5,0x17,0x03,0xfd,0x5d,0x36,0x83,},{0x6f,0x13,0x62,0xa4,0x02,0x06,0x37,0x91,0xf9,0x50,0x98,0x4f,0x54,0x49,0x28,0xe6,0x16,0xa4,0xef,0x79,0xbb,0xeb,0x68,0x54,0xe9,0x61,0x5a,0xab,0x9c,0xdb,0xae,0xc4,0x83,0xfb,0x9a,0x04,0xbf,0x22,0xde,0x5d,0x97,0xa1,0x5b,0xda,0x2d,0x39,0x04,0x83,0xc7,0xf6,0x1d,0xbe,0xe0,0x7b,0xb5,0x14,0x1f,0xc1,0x73,0xb1,0xaa,0x47,0x65,0x0d,},\"\\xfb\\xf3\\x68\\xfe\\xae\\xba\\x87\\x91\\x8b\\x1b\\x8c\\x7b\\x8a\\x26\\x83\\x2b\\xe6\\xe7\\xfc\\x1c\\xbd\\xb8\\x90\\x25\\x19\\x28\\x1a\\x06\\x54\\xec\\x73\\xde\\x0b\\xb0\\x71\\x01\\xa9\\xd6\\x03\\xf7\\x45\\xd4\\xec\\x23\\x57\\xae\\xe9\\x87\\x0c\\xb1\\x9a\\x56\\xcb\\x44\\xfb\\xd9\\xc9\\x1f\\xc3\\x47\\x52\\x61\\x2f\\xbd\\x83\\xd6\\xfc\\x1a\\x16\\xbf\\x8a\\x85\\xa2\\x15\\xd0\\x14\\x8e\\x4a\\xf3\\x7d\\x29\\x84\\x67\\xe5\\xcc\\x48\\x6b\\x13\\x13\\x52\\xce\\x09\\x21\\x82\\xce\\x82\\x84\\x15\\x9a\\x38\\x12\\xb3\\x0b\\xac\\xbf\\xf5\\x95\\x86\\x38\\x11\\xbf\\x9a\\x30\\xa9\\xda\\x49\\x45\\x65\\xc3\\xac\\x18\\x14\\x43\\x00\\x18\\xea\\x0e\\xee\\xd3\\x9c\\xdb\\xca\\x27\\xf9\\x31\\x40\\xe4\\x69\\x49\\xdb\\x57\\x0b\\xfa\\x2e\\xd4\\xf4\\x07\\x3f\\x88\\x33\"},\n{{0xd5,0xef,0xe5,0x1d,0x5c,0xd8,0xe1,0x08,0xbd,0x92,0x2f,0xc0,0xea,0x12,0x61,0x90,0xa9,0x46,0x28,0xff,0xa5,0x3c,0x43,0x3a,0x51,0x80,0x22,0x79,0x2d,0xdc,0x78,0xef,},{0x42,0x6b,0x01,0xcc,0x61,0xff,0x5e,0x0e,0x72,0x4d,0xa1,0xd3,0xb2,0x97,0xf5,0x32,0x5c,0x18,0xc6,0x2f,0x64,0xd5,0xeb,0x48,0xd4,0xa5,0x21,0x6a,0x8e,0x9a,0x40,0x73,},{0x23,0x06,0xf5,0x8f,0xcd,0x4c,0xff,0x22,0x22,0xd8,0x1b,0x05,0xa4,0x75,0x53,0x2b,0x8b,0x19,0xdc,0x67,0xe6,0xd7,0x8d,0xdb,0x42,0x05,0xa3,0xb7,0x62,0x1c,0xc5,0xae,0xf0,0xb3,0x93,0xd5,0xd2,0x4d,0xd9,0x6c,0x88,0xcc,0xbc,0x53,0xa3,0x20,0x8d,0xa3,0x23,0xbe,0x45,0x87,0xd5,0xec,0x06,0x7c,0x82,0x0f,0x07,0x23,0xaa,0x44,0xe9,0x0e,},\"\\x9d\\x17\\xbc\\xfe\\x2d\\xfc\\x74\\x2f\\x41\\x1c\\xb5\\x3a\\x94\\xf3\\x59\\xc0\\x01\\xab\\xf0\\x96\\xc7\\x41\\xf3\\x4a\\xf4\\x86\\x79\\xf2\\x81\\xe7\\xce\\x6b\\xbd\\x9e\\x87\\x70\\x9f\\xc0\\x72\\x8a\\x56\\x3d\\xb2\\xb9\\xcf\\x8e\\xa4\\xfb\\xdc\\xc3\\x44\\xc1\\x84\\x8e\\x65\\x3c\\xe9\\x70\\xc6\\xce\\x29\\xde\\x2c\\xcd\\x52\\x03\\x00\\x64\\x9a\\xdc\\xdd\\xfc\\x75\\x39\\x71\\xf8\\x46\\xaa\\xc1\\xba\\x42\\xae\\x45\\x28\\x95\\x2d\\x94\\x98\\x0a\\xa7\\xc6\\xcf\\xa2\\x14\\x29\\x07\\x64\\x7f\\x89\\x4a\\xe9\\x74\\xa7\\x4d\\x59\\x03\\x5a\\x73\\xef\\x56\\xa1\\x0b\\x66\\x12\\x62\\x48\\x09\\x52\\x01\\x90\\xac\\xe6\\x61\\xc3\\xa4\\x70\\x95\\xe0\\x32\\x2e\\xfd\\x78\\x1d\\x50\\xd1\\x16\\x35\\x98\\xf2\\xda\\x32\\xf3\\x1b\\xc9\\xc4\\xf9\\x13\\xd1\\xb1\\x48\\x61\"},\n{{0x18,0xaf,0x89,0x02,0x5e,0xbf,0xa7,0x6b,0xd5,0x57,0xcf,0xb2,0xdf,0xf1,0x48,0x24,0x52,0x14,0x64,0x1f,0xd5,0xbd,0xa1,0x59,0xf7,0x3d,0xa0,0x4b,0x08,0xe8,0x7c,0x88,},{0x0c,0x58,0x44,0x59,0xb9,0xeb,0xcc,0xca,0xd5,0x87,0xb2,0x72,0x16,0x0b,0xc6,0x0b,0x27,0xf4,0xf7,0x72,0xb4,0x32,0x1d,0xe7,0x72,0x3a,0xfe,0xf5,0x77,0xed,0xc7,0xb4,},{0x26,0xbb,0x08,0x82,0x29,0x7c,0x2c,0x08,0xa7,0x52,0xd3,0x98,0x11,0x45,0xdc,0xde,0x55,0x89,0x3a,0x11,0xdf,0x77,0xf8,0xaa,0x4c,0x19,0xd0,0xb9,0xed,0x6e,0x52,0x20,0xed,0x12,0xe9,0xfa,0xc3,0xaf,0x13,0xd0,0xf0,0xc7,0x15,0x68,0xf4,0xa5,0x47,0xd3,0x01,0x14,0xa6,0x59,0x9a,0x23,0x68,0x06,0xc4,0xbe,0xee,0x67,0x65,0x28,0x44,0x08,},\"\\xe8\\x2f\\x46\\x65\\x2a\\xb9\\x14\\xaf\\x53\\x5d\\x8f\\xb7\\x20\\xb5\\x57\\xac\\x95\\x01\\x8d\\x9f\\x2a\\x3f\\xcc\\xe8\\x57\\x71\\xbb\\x40\\xab\\x14\\xcb\\x9a\\x98\\x6e\\x09\\x6f\\x3a\\xfe\\x5b\\xee\\x82\\x9d\\xfd\\x8b\\x97\\x33\\x5c\\x53\\x6a\\xc9\\x71\\xa2\\x16\\x55\\xaf\\x16\\xa2\\xf8\\xfd\\xba\\x18\\x3a\\x4e\\x18\\x56\\x4c\\x21\\x49\\x29\\x56\\x53\\x7a\\x41\\x9a\\xbb\\xbb\\xb0\\x2a\\x4b\\xbd\\xc0\\x14\\x81\\xf5\\xc6\\xe6\\x58\\xec\\xf3\\xc3\\x4f\\x01\\x1a\\xd8\\x46\\xf5\\xed\\xcd\\x49\\x39\\x19\\x5d\\xf8\\x5e\\x41\\x30\\x3f\\xb9\\xa8\\x8f\\xdf\\xbd\\x70\\x43\\x96\\xf7\\x55\\x9a\\x32\\x73\\x18\\xb9\\x52\\xb3\\xe6\\x0c\\xe8\\xdd\\xde\\x56\\x37\\x85\\x79\\x23\\x2f\\xaf\\x95\\x0c\\x78\\xe7\\xf0\\xb1\\x7c\\x3b\\x8d\\xec\\xe3\\x6b\\x78\\x8a\\x84\\x73\"},\n{{0x0c,0x93,0xd9,0x98,0x15,0xff,0xf8,0xfe,0x22,0xb9,0xe4,0x5a,0xa0,0x2b,0x3e,0x64,0x45,0xce,0x1d,0x6b,0xf5,0xa6,0x5d,0xce,0x3d,0xa1,0x07,0xaa,0x10,0x55,0x94,0x0e,},{0x4d,0x27,0xa4,0x7b,0x0f,0xc8,0x08,0x00,0xd8,0x4d,0x24,0x4e,0xeb,0xb1,0xde,0xb4,0x43,0x6d,0x97,0x63,0x3a,0x83,0xe6,0x71,0x25,0xad,0x52,0xea,0x01,0x68,0x50,0x57,},{0x7d,0xc4,0x46,0x7a,0xbc,0xf6,0x43,0x1a,0xdb,0x7c,0xcf,0xe8,0x68,0xea,0xc8,0xcd,0x8a,0x61,0x5a,0x0f,0xf6,0x5f,0x6a,0x9e,0x33,0x83,0x75,0xb1,0xaa,0xe3,0xc4,0x9a,0x12,0x6c,0x9e,0xba,0x79,0x42,0x6d,0x16,0x41,0xc6,0xb9,0x7c,0x3e,0x92,0xc1,0x94,0xe5,0xee,0x44,0x31,0xef,0xa2,0x43,0x9f,0xd4,0x50,0xf2,0xcd,0x01,0x8c,0x87,0x00,},\"\\x11\\xe8\\x77\\xde\\x58\\xc1\\x34\\xea\\xf4\\xc9\\xf1\\xb5\\x3c\\x3d\\xc4\\x51\\xd3\\xc0\\x55\\xf1\\x6b\\x09\\x62\\x27\\x25\\xb2\\x79\\x76\\x85\\x12\\xfe\\x10\\xa7\\xad\\xb0\\x76\\x5b\\x68\\x9e\\xc2\\x1d\\x5b\\x6e\\xfa\\xa1\\x9f\\x1b\\x9d\\x36\\x25\\x4d\\xf0\\xa9\\x36\\x7f\\x44\\x1b\\x26\\xbd\\xb9\\x0b\\x28\\xcb\\xc4\\x03\\xe5\\x07\\x40\\x82\\xfa\\x1f\\xed\\x58\\xe1\\x40\\xda\\xc9\\x7a\\xea\\xf4\\x83\\xe2\\xc1\\x3f\\x3c\\xc5\\x60\\xab\\xff\\xab\\xa0\\x5b\\x76\\x3f\\xee\\xdb\\x51\\xe6\\x06\\x98\\x15\\x1c\\xf5\\x6e\\xfd\\xf1\\xd3\\x7d\\x6c\\xe0\\x56\\x44\\x86\\x21\\x0f\\x05\\x2e\\x93\\x7f\\x2e\\xa2\\x6f\\x63\\xef\\xa5\\xd2\\x47\\xff\\x18\\x83\\x29\\xbb\\x1a\\xa8\\x3c\\xe3\\xf4\\xf3\\x5a\\x3d\\x7d\\xec\\x14\\x59\\x9e\\x5f\\xeb\\x7b\\x6d\\x5f\\xe4\\x29\\x6a\"},\n{{0x98,0x9e,0x99,0x94,0x56,0x35,0x19,0x2c,0x02,0x3c,0xc5,0x18,0x6f,0xc2,0x5b,0xba,0xef,0x47,0x24,0x07,0x75,0xd1,0x5a,0x56,0x19,0x5d,0x88,0xcd,0x07,0xc3,0x74,0x8e,},{0xca,0x0b,0xea,0xfd,0xf7,0x31,0xd8,0x93,0x01,0xf7,0x72,0x3c,0x5b,0xb7,0xe5,0xa1,0xc3,0xff,0x3e,0xab,0x27,0xc9,0x7d,0x71,0x1b,0xcd,0x76,0xe4,0x20,0x54,0xbe,0xe4,},{0xae,0xf7,0x56,0xbf,0xb8,0xa7,0x26,0x6e,0x17,0xd1,0x5f,0x3f,0x11,0xee,0x50,0xed,0x25,0xbe,0x42,0x0e,0x95,0xa0,0x74,0x22,0x71,0xeb,0xd1,0x22,0x94,0xe2,0xcb,0x96,0xea,0xd0,0x83,0xb8,0xff,0x0b,0x82,0x9d,0x2e,0xde,0xb1,0x4d,0xa8,0x6e,0x40,0x2e,0xf2,0x5e,0x6d,0x4a,0x5a,0x79,0x58,0xc1,0x84,0xed,0x10,0xc1,0x76,0xcb,0x57,0x0b,},\"\\xc4\\x84\\x14\\xf5\\xc7\\x57\\xd0\\x3c\\x52\\x3e\\xf3\\xf3\\xb8\\x51\\x07\\x71\\xb0\\xff\\x3b\\x4b\\x97\\xde\\x27\\x96\\x25\\xd3\\x49\\xec\\x18\\x5a\\x29\\x92\\x7a\\x66\\xb9\\x59\\x3b\\xa1\\x93\\x38\\xc2\\xf5\\xe4\\x13\\x1f\\x1a\\xc0\\x7e\\xa4\\x6d\\x2c\\x1b\\x6e\\x4a\\xb5\\x22\\x92\\x80\\xb2\\xe2\\xbb\\x9d\\x14\\x0d\\x1e\\xf7\\xaf\\x7b\\x16\\x92\\xbf\\x2d\\x09\\x7b\\x80\\xf8\\x11\\xad\\xcf\\xa9\\x5d\\x5c\\xbf\\x9e\\xee\\x92\\xa1\\x64\\x1c\\x55\\x2b\\x4b\\xe4\\xa0\\xd7\\x34\\xf0\\xaf\\xd4\\x70\\xb9\\xd7\\xf4\\xe4\\x57\\x78\\x95\\x1e\\x21\\xfc\\x53\\x4f\\x20\\x0a\\x12\\x8b\\x96\\xad\\xb8\\x37\\x3f\\x10\\xce\\xce\\xc2\\xda\\xc2\\x99\\x6a\\x06\\x2f\\xb3\\xc2\\x94\\x31\\x59\\x65\\xa9\\xd5\\xd7\\xb0\\x77\\xc4\\xb0\\x13\\xc6\\x4a\\x38\\x42\\x97\\x69\\xd2\\x3e\\xab\"},\n{{0x6b,0xdb,0xbe,0x06,0xd9,0xf4,0x21,0x9e,0xea,0x64,0x03,0xa3,0x57,0xb2,0x5e,0x56,0x19,0x92,0xfa,0xe0,0xf0,0xf6,0x14,0x56,0x1d,0xd8,0x6d,0x23,0xde,0x41,0x5a,0x43,},{0xed,0x52,0xdd,0x1c,0xce,0x32,0xd9,0xb4,0x85,0xe0,0x94,0x07,0x46,0x42,0x1d,0x36,0xb9,0xfd,0xe6,0xcd,0xf0,0x21,0x15,0x45,0xb6,0x34,0x04,0x4d,0x4b,0x3c,0xb8,0xf1,},{0x95,0x02,0x06,0x60,0x5b,0x0f,0x41,0x7c,0x90,0x84,0x3e,0x2c,0x8d,0x8e,0x66,0xc8,0x28,0xbb,0x10,0xb9,0x9b,0x36,0xee,0xee,0xe8,0xca,0xf2,0xe0,0xe5,0x48,0x4d,0x93,0xfe,0x02,0xbf,0x53,0x34,0x05,0xf4,0xbb,0x74,0xa5,0x0e,0x55,0x85,0xfa,0x0d,0xae,0xf4,0x82,0x1f,0x03,0x01,0xd0,0x1b,0x46,0x32,0x1b,0xaa,0x31,0xe1,0xf0,0x8d,0x03,},\"\\x58\\x2a\\xda\\x13\\xd6\\x92\\x93\\xe4\\x9b\\xbd\\x46\\x10\\x32\\xdf\\xea\\x1c\\xa2\\x02\\x5b\\x52\\xe0\\x13\\xa3\\x3a\\x03\\x87\\xfc\\xfc\\x5f\\x7c\\x0b\\x8e\\xc9\\x55\\x98\\x26\\x07\\xfc\\x90\\x1e\\x1b\\x7f\\x63\\x6a\\x9d\\x37\\x1e\\x1f\\x91\\xfe\\x47\\x6b\\xdd\\x44\\x85\\x6e\\x27\\x5d\\x67\\xef\\xa1\\x42\\x38\\x16\\x43\\x54\\xc2\\x31\\x12\\x4c\\x84\\xde\\x8f\\x5b\\x89\\xd5\\xa5\\x8e\\xa6\\x74\\x4b\\x4d\\x3b\\x3d\\x79\\x06\\x90\\x52\\x33\\xcc\\xe6\\x94\\xa6\\x4d\\x69\\x6f\\x5a\\x70\\x24\\xfc\\x90\\x33\\xb1\\xce\\x39\\x08\\x99\\xa3\\xb4\\x41\\xa4\\x8e\\x53\\xc7\\xc9\\xb3\\x0b\\xa1\\x2e\\x7d\\x61\\xf3\\x5f\\x15\\xe6\\x58\\xc7\\xcc\\x44\\x07\\xe2\\xf6\\x89\\xea\\x8a\\x55\\xd0\\x1b\\xf5\\xdb\\xac\\xb1\\x19\\x54\\x75\\x4f\\x92\\x0f\\x09\\xdb\\xd4\\x84\\x09\\xbb\\xb5\"},\n{{0xd7,0x61,0xc8,0xc5,0xa9,0x60,0x1b,0x91,0x45,0xb7,0xd0,0x51,0x24,0x9b,0x00,0x41,0x07,0xe4,0x52,0xe5,0x63,0x10,0x0c,0x6c,0x78,0x80,0x38,0xc9,0xee,0x8a,0xda,0xd7,},{0xe6,0x48,0x87,0x75,0xd6,0x40,0x7e,0xfc,0x7b,0x2b,0xca,0x89,0x0a,0x7f,0xc6,0x22,0x66,0xfc,0x54,0xcd,0xac,0x89,0x33,0x43,0xb4,0xf5,0x9a,0x19,0x6d,0x94,0x88,0x98,},{0x7a,0xb7,0x8b,0x64,0xe6,0xdb,0x35,0x9a,0x2d,0xc8,0x30,0x2e,0x10,0x92,0xed,0x66,0xfa,0x73,0x6b,0x53,0x62,0x53,0xa1,0xcd,0x90,0xfd,0xb8,0xc1,0x0e,0xfd,0x78,0x30,0x02,0x25,0xe1,0x91,0x96,0x35,0x99,0xba,0x54,0x9c,0xc8,0x59,0x20,0x9d,0xf0,0xff,0x61,0xcd,0x06,0x9b,0x03,0xd2,0x54,0xe6,0xe7,0xd7,0x6c,0x79,0x84,0x40,0xf9,0x07,},\"\\x84\\xea\\xd5\\xea\\xbd\\x2f\\xd4\\xb7\\xc7\\x9a\\x9a\\x92\\x8a\\xb8\\xee\\x0a\\x16\\xa5\\xfd\\x66\\x7a\\x05\\x7f\\x8a\\x25\\x46\\x63\\xd5\\x6d\\xaa\\xe1\\x56\\xd1\\xa4\\x9a\\xff\\xb2\\x99\\x61\\x37\\xb9\\xd8\\xb3\\x40\\xe6\\x35\\x73\\x2f\\x9d\\x2b\\x4c\\x60\\x21\\x84\\x42\\x54\\x1e\\x72\\xd2\\xb0\\x0e\\x1e\\xe7\\xa7\\x3c\\x3f\\x67\\xca\\xa4\\x99\\xfa\\x9d\\x07\\x0b\\x57\\xd0\\x76\\xdc\\xde\\x96\\xb0\\x76\\x47\\x23\\xc3\\xc6\\x59\\xc7\\xa0\\x0c\\x1b\\x78\\xb1\\x5c\\xcc\\x22\\x23\\x89\\x0b\\x51\\x06\\x7f\\xc8\\x1e\\x23\\xe9\\x45\\x8a\\xb0\\x68\\x3b\\xa6\\x26\\xa5\\x3d\\x0c\\x37\\x93\\xa5\\x8a\\x98\\x57\\xbb\\x44\\xb3\\xbd\\x85\\xbb\\x6c\\xe5\\x3a\\x85\\x69\\x4e\\x7f\\x53\\xcc\\x1b\\xd4\\x6d\\x50\\xed\\xa3\\x7d\\x81\\xf5\\x38\\x1b\\x51\\x3d\\x1f\\x38\\x33\\x9d\\x29\\x1b\"},\n{{0xc5,0xe0,0xc7,0xa7,0xbb,0x8b,0x7c,0xa0,0x7b,0xf0,0xa0,0x5e,0xa6,0x7e,0xff,0x6d,0xee,0xbf,0xe3,0x71,0x4e,0xe3,0xe1,0xa2,0x27,0xf4,0xdc,0x8e,0x24,0x2a,0x2f,0xa0,},{0x51,0x35,0xef,0xcd,0x90,0x52,0xbe,0xc5,0x7a,0x44,0x31,0xca,0xab,0xe8,0x26,0x80,0xee,0xc0,0xa3,0x3a,0xfd,0x59,0xb3,0x02,0x03,0xb2,0x80,0xba,0x12,0xbe,0x48,0x5c,},{0x2e,0x7f,0xde,0xb3,0x48,0x4d,0x0a,0x5e,0x8d,0xce,0x94,0x44,0x89,0x79,0x49,0x6b,0x06,0x42,0xca,0xbc,0x37,0x33,0xa5,0x1f,0x8c,0x3c,0x5c,0x51,0xc1,0x9a,0xe3,0x19,0x01,0x8d,0xa9,0x10,0x91,0xc2,0x38,0x5f,0x2f,0x4e,0x9a,0x59,0xed,0xbc,0xa2,0xab,0xd0,0xd0,0x85,0xee,0x40,0xd3,0xf0,0xd4,0x20,0x61,0xa5,0xa9,0x83,0x2a,0x37,0x0c,},\"\\x37\\x70\\xa6\\x78\\x66\\x52\\xc4\\xb7\\x8a\\x04\\x3e\\xdc\\xe0\\x7f\\x3e\\x20\\x4d\\x81\\x99\\x7c\\x42\\xaf\\xc2\\x23\\x31\\xf7\\x5a\\x54\\x94\\xa8\\x26\\xd7\\xcb\\x69\\xab\\x43\\x14\\xa4\\x73\\x72\\x10\\x58\\xa1\\x83\\x99\\x81\\xd5\\xb7\\x02\\x2d\\x0c\\xd8\\x67\\x03\\x77\\xda\\xf3\\x32\\x04\\x76\\xd2\\x5b\\x9f\\x55\\x95\\x61\\xd6\\x6e\\xe0\\xa7\\x09\\xfe\\x17\\x36\\x1e\\x2a\\x52\\x89\\x8f\\x57\\x53\\xc4\\xfb\\x43\\xbd\\x0c\\x98\\xb3\\x68\\xf5\\x12\\xad\\xc0\\x9c\\xd9\\x27\\xc6\\x62\\x26\\x76\\x92\\x6d\\x8c\\x2d\\x91\\xa1\\x4a\\xca\\x32\\xf2\\x26\\xf7\\x00\\x36\\xc1\\xc8\\x58\\xbc\\xff\\xc2\\xb5\\x9f\\x54\\xc1\\xc3\\x7b\\xf8\\x1e\\xb5\\x2e\\xcb\\x3f\\x00\\xda\\x60\\x2c\\x94\\x36\\x1b\\x52\\xa5\\xaf\\xdd\\xbf\\xd7\\xe0\\x50\\x36\\xe3\\x77\\x50\\x30\\x50\\x33\\x3b\\xe5\\x12\"},\n{{0x11,0xbb,0x47,0x48,0xd2,0x54,0x7e,0x61,0x96,0xbe,0x82,0x3c,0x9b,0xe7,0xaa,0x18,0x15,0x0c,0x20,0x4b,0x12,0xca,0x8d,0x73,0xc1,0xbd,0x46,0xb1,0x1a,0x54,0xb4,0x75,},{0xef,0xeb,0x42,0xda,0x28,0xd7,0x64,0x96,0x64,0x03,0xdd,0x30,0x0d,0x9f,0x94,0x51,0xb2,0x58,0xab,0x1c,0x80,0xdf,0x06,0xfe,0x59,0x43,0x15,0x3f,0x53,0x01,0xcc,0xcb,},{0x44,0xc5,0x8d,0xa4,0x9d,0x23,0x65,0xd2,0x70,0x29,0xd1,0xee,0xbb,0x3b,0xeb,0xf7,0xc0,0x32,0xd8,0x58,0xaa,0x07,0xe0,0x75,0x6b,0x1c,0x26,0xa5,0x41,0x2d,0x22,0x69,0x11,0x76,0x03,0x13,0x41,0xad,0x37,0xd7,0xbb,0x78,0x43,0x28,0x9e,0xb3,0x9d,0xb4,0x91,0x58,0x4c,0x1b,0x2a,0x1d,0xa2,0xe4,0xa2,0x64,0x9c,0x22,0x93,0x82,0x66,0x06,},\"\\xf4\\xb7\\x65\\xb2\\x58\\xba\\x35\\xb4\\x27\\x52\\x5c\\x7f\\x10\\xa4\\x6f\\x0b\\xcc\\xd3\\x57\\xec\\x1a\\xd5\\x2a\\x5b\\x13\\x94\\x17\\xa9\\xd3\\x89\\x4c\\x51\\x2d\\x89\\xeb\\x88\\xe6\\x81\\xb1\\xf3\\x0a\\xac\\x4c\\x11\\x5c\\xcf\\x36\\x54\\x5e\\x83\\xf3\\x78\\x34\\xc8\\x2e\\x83\\x00\\xcc\\x1e\\xb2\\x89\\xaf\\x43\\x75\\x96\\x8c\\x29\\xc0\\xff\\xef\\xb4\\x0e\\x15\\x6c\\x20\\xc0\\x43\\x26\\x69\\xac\\x8d\\xc0\\xa8\\x3c\\x13\\xb1\\xe8\\x55\\xa8\\x4a\\xd0\\x13\\x3c\\x40\\xc8\\x2c\\x87\\xee\\x1e\\x7d\\xd4\\x08\\x4d\\x74\\x1c\\x80\\xde\\x8a\\x7a\\x9f\\x77\\x59\\xe8\\x43\\xa5\\x62\\x09\\x9c\\x4d\\x7d\\xf8\\x75\\x35\\x20\\x39\\xff\\x4d\\x38\\x24\\x65\\x13\\x86\\xc9\\x77\\x59\\xff\\x7d\\xba\\x52\\x06\\x4e\\x6d\\x31\\x12\\xe0\\x80\\x81\\x9a\\xee\\x8c\\xe7\\x23\\xa1\\xa2\\xaa\\x46\\x4d\\x8a\"},\n{{0x74,0x52,0xa0,0x01,0x56,0xd7,0x94,0xed,0xeb,0xff,0x4a,0xdb,0x1f,0x7a,0x7e,0xec,0x26,0x21,0x7f,0xef,0x67,0xc3,0xd2,0x68,0x35,0x2b,0x2b,0x54,0x60,0xa7,0xdc,0x25,},{0x5f,0x4d,0xc3,0x38,0xcf,0xbd,0x38,0x4b,0x5f,0x1c,0x14,0xc2,0x26,0x70,0x14,0x46,0xb5,0x2b,0x1e,0x3e,0x2a,0x3c,0xba,0x1a,0x40,0xee,0x28,0x25,0x08,0x0d,0x1d,0xe6,},{0xa8,0xf9,0xfa,0x24,0xa3,0xde,0xa1,0x02,0x2e,0x73,0xf0,0xd8,0x8b,0x1c,0x37,0xd0,0x6d,0x0f,0x0b,0x20,0xbb,0xff,0x0e,0xcd,0xb4,0xa4,0x0c,0x86,0xd7,0xe4,0x75,0x61,0x7c,0x03,0x57,0x0a,0x74,0x19,0xd7,0x4b,0xa0,0xf1,0x32,0x70,0x96,0xbf,0x19,0xf0,0xd0,0xcf,0x9f,0x51,0xd4,0x83,0x11,0x2f,0x26,0x92,0x23,0x78,0x68,0x2f,0x48,0x07,},\"\\x8c\\x4e\\xe2\\x86\\x76\\x56\\xe3\\x3f\\x52\\x69\\x41\\x4d\\x77\\xb4\\x2d\\x8e\\x47\\x50\\xdb\\xa9\\x3c\\x41\\x8b\\xac\\xca\\x10\\x93\\x8c\\xc3\\xb5\\x70\\xc6\\x60\\x3d\\x52\\xc2\\x34\\x44\\x88\\x60\\x7b\\x2f\\x93\\x4f\\x6d\\x26\\x9f\\xcb\\x2a\\xd9\\x66\\x21\\x9b\\x1a\\xb1\\x14\\x72\\xf4\\x2c\\x67\\x2c\\xe2\\x05\\x92\\x49\\x0e\\xc5\\xba\\xf6\\xa2\\xd2\\xfc\\x8a\\x3e\\xe3\\x53\\x74\\xb1\\x90\\x2f\\xde\\xfc\\x78\\x70\\xb1\\xb6\\x26\\xfa\\x46\\xb1\\x2b\\x6c\\xee\\x24\\x1f\\x60\\x1a\\x9b\\x3f\\xe4\\xc5\\x08\\x12\\xe5\\x73\\xe6\\x75\\x2c\\xe2\\xc7\\x64\\x4e\\x33\\x67\\xa6\\xa6\\xb7\\x77\\x58\\xd8\\xe4\\x93\\x4b\\x58\\xaf\\x23\\xab\\xae\\x8f\\xec\\xac\\x25\\xed\\xd7\\x34\\x03\\x0e\\xe7\\xcf\\x39\\x90\\x7e\\x3e\\xed\\x81\\x86\\xa1\\x9a\\x80\\x71\\x03\\xa9\\xfc\\x49\\xd3\\x8f\\x4c\\x84\\x60\"},\n{{0x88,0x0e,0xf1,0x06,0x73,0x3f,0x04,0xe7,0x61,0x95,0xeb,0xa2,0x80,0xb3,0xfa,0xdd,0xa0,0xf2,0x5d,0xcf,0x96,0xa6,0xa9,0x9c,0x8c,0xcf,0x84,0x2c,0x68,0xaf,0xda,0xe5,},{0x70,0xce,0xe3,0x3d,0x41,0xc7,0x28,0xce,0x7b,0x14,0x19,0x31,0xe6,0xe8,0x52,0x45,0x67,0xd7,0x60,0x1e,0xb7,0x9f,0x67,0xfd,0xcd,0x07,0xb9,0xd6,0x82,0xc6,0x50,0xf0,},{0xff,0x6c,0xae,0xdd,0x8a,0x46,0x8a,0xa0,0x7d,0x4c,0x6e,0x71,0x31,0xbb,0xda,0x76,0x18,0x2b,0xa9,0x58,0x64,0x93,0x76,0xe7,0x11,0xf4,0x4c,0x7b,0xba,0xcb,0xa6,0x07,0x7b,0xea,0x87,0x8b,0xa5,0x94,0x9c,0xde,0xee,0xf0,0x5c,0xfd,0x49,0x83,0xb0,0x05,0x7d,0x27,0x5e,0xa3,0xe1,0x8c,0x32,0x65,0x94,0x68,0xc3,0x0c,0x47,0xac,0x8f,0x0b,},\"\\xf4\\xf3\\x8d\\x07\\x7f\\x2b\\x03\\xda\\x82\\x1b\\xd3\\x6f\\xde\\x67\\x3d\\x66\\x6e\\x52\\xf4\\x83\\x2e\\x1c\\x0d\\xcf\\xee\\xf0\\x49\\x32\\x8a\\xcb\\x7b\\xd7\\x1a\\xd2\\xbf\\xc4\\x9c\\x12\\x35\\x16\\xe1\\x96\\xc4\\x70\\xdf\\x08\\x47\\xb3\\x84\\x8a\\x45\\xa2\\xc6\\x9b\\xea\\x03\\xe2\\xaf\\xa7\\xe5\\x82\\x05\\xb6\\x3b\\x52\\x38\\x14\\xfc\\x8e\\x24\\x2f\\x05\\x9c\\x69\\xff\\x7e\\x40\\xf9\\x7b\\xe8\\x12\\x5b\\x70\\xa5\\x4f\\xda\\xf3\\x5a\\xea\\xfa\\xc7\\x91\\x14\\xa7\\xb4\\x19\\xe6\\xbb\\x9e\\x70\\xbf\\x07\\xad\\xb5\\x59\\x81\\x96\\x00\\xdc\\x25\\xe5\\x1b\\x4b\\x70\\x0d\\x27\\xca\\x54\\x72\\xa0\\xe7\\xcb\\xbf\\xd1\\x4e\\x09\\x9f\\xaa\\x3a\\x72\\x00\\x2d\\xa5\\x38\\xcb\\xe4\\x5d\\x62\\x1e\\xf0\\xd5\\x25\\x2b\\xa2\\x9d\\x83\\xf8\\xb3\\xec\\x83\\x89\\xc9\\xce\\xb6\\xc6\\xb2\\xe8\\xd8\\xa2\\x0f\"},\n{{0xa2,0xd8,0x8f,0x37,0xec,0xc2,0xb2,0xc0,0x5d,0xd6,0xcb,0x31,0x59,0x96,0x2c,0x5f,0x64,0x6a,0x98,0x15,0xb2,0xfb,0x37,0x79,0x1f,0xc7,0xb6,0x06,0xe2,0x91,0x3e,0xd5,},{0x58,0xdd,0x67,0xd7,0xa1,0x5d,0x4c,0xa0,0x34,0x1a,0x4c,0x86,0x95,0x66,0xca,0xd8,0xc4,0xee,0x16,0xe5,0x83,0xa1,0x0b,0x48,0x24,0x17,0x3b,0x08,0x29,0x0d,0x92,0xd1,},{0xcc,0xf2,0x40,0x0c,0xd6,0x73,0xe1,0xef,0xfd,0x20,0x16,0x1d,0x7b,0x68,0xa5,0xfb,0x87,0xc1,0xe9,0x9d,0x36,0x35,0xd7,0x8c,0x2d,0xa1,0xb5,0x09,0xfa,0xc3,0x33,0x46,0xc0,0x69,0x16,0x3a,0x6c,0x46,0xc7,0x82,0x6a,0x48,0xbb,0xbd,0x03,0xb0,0x5e,0x6e,0x23,0x51,0xfa,0x62,0xbf,0x89,0xbf,0x7c,0xcf,0x9a,0x90,0x24,0xbd,0x15,0x7d,0x07,},\"\\xd1\\xb8\\x7e\\x9e\\x88\\x6d\\xfb\\xbd\\xc8\\xca\\x8a\\xb9\\x01\\x0e\\xcf\\x9b\\xba\\xf2\\x3f\\x72\\xab\\x3c\\xbe\\x76\\x9d\\xb1\\xd4\\x3c\\x2a\\x47\\x4a\\x81\\x65\\x1c\\x46\\x4e\\x9f\\xb9\\x27\\x34\\x63\\x46\\x41\\xc9\\x48\\x5a\\x02\\x39\\xb3\\x11\\x07\\x71\\xe7\\xf7\\x5e\\x05\\x25\\x2e\\x4d\\x8f\\x4c\\x0a\\xa1\\xba\\x08\\x62\\x6d\\x7e\\x96\\x31\\x7c\\x20\\xac\\xde\\x2a\\xd9\\x9b\\x23\\xbd\\xad\\xfd\\x6f\\x17\\x46\\x8e\\xb4\\x02\\xec\\x5e\\xef\\xa5\\x7b\\x47\\xca\\xf9\\x72\\xb3\\xdd\\x21\\xd8\\x9f\\x0e\\x29\\x89\\xff\\x87\\xd5\\x1e\\xd2\\xe2\\xd6\\x39\\xc1\\x64\\x4e\\x69\\x8c\\xbe\\x02\\x21\\xb8\\xe1\\x79\\xf3\\xcf\\xb0\\x4a\\x20\\xcb\\x24\\x70\\x21\\x6a\\x68\\x82\\xfb\\x4f\\xf7\\x99\\xe1\\x15\\x36\\xcf\\x64\\x21\\x9f\\x0c\\x07\\x51\\x76\\xbc\\x7c\\xf0\\xf6\\xc5\\xb7\\x92\\x5f\\xcd\\x61\\x55\"},\n{{0x42,0xaa,0xfd,0x0a,0xe2,0x6d,0xf1,0xe7,0xaa,0x02,0x76,0x86,0x0d,0x75,0x27,0x83,0xaf,0x97,0x28,0x04,0x39,0xbb,0x23,0xea,0xe4,0x6e,0x3f,0x84,0xca,0xac,0x78,0xde,},{0xda,0xa2,0x35,0x0a,0xdb,0x55,0xdb,0xa9,0xdf,0x7d,0x7a,0xf5,0x10,0x19,0x98,0xfe,0x51,0x5d,0x31,0x1c,0x3c,0xba,0x3e,0xea,0xb9,0x13,0x82,0x33,0x19,0x0c,0x3b,0x4e,},{0x11,0x61,0x43,0x65,0x0b,0x6c,0x13,0x3d,0x61,0x78,0x59,0xdb,0x24,0x29,0xc2,0x91,0x35,0x79,0x79,0x0b,0x21,0x97,0xd7,0xb7,0xb1,0xb4,0x96,0x2b,0x32,0x87,0x21,0x03,0x2c,0xee,0xca,0x58,0xb2,0xd5,0x64,0x39,0xe2,0x33,0xbb,0x84,0xdc,0x52,0x5e,0x28,0x4f,0xf8,0xdf,0x2b,0xde,0x1d,0xb4,0x98,0x6f,0xaf,0xd2,0x1b,0x3d,0x7d,0x6a,0x0a,},\"\\x72\\x13\\x1b\\x80\\xad\\x59\\x9b\\x6f\\x5f\\xf6\\x98\\x54\\x7d\\x16\\xe7\\x49\\x9d\\x71\\x27\\x5e\\x4e\\x9b\\x30\\x52\\x6a\\x5a\\xac\\x0b\\x0c\\x8b\\x14\\xfa\\x4a\\x54\\x0c\\xfb\\x11\\x45\\xfc\\x00\\x44\\x18\\xbc\\xd3\\x18\\xc1\\xa7\\x0e\\x62\\x69\\xa3\\xfb\\x69\\xba\\xed\\x86\\xf3\\x63\\xf5\\xb8\\xf9\\x7f\\x56\\x9c\\x20\\xd4\\xf4\\x99\\x0e\\x7b\\xb4\\xd0\\xc3\\x99\\x21\\x26\\x8d\\x63\\x6e\\xd0\\x55\\x4b\\xd6\\x2a\\xcf\\xca\\xcd\\x3b\\x8e\\x03\\x02\\x17\\xaa\\xfa\\xc3\\x04\\x4c\\x03\\x7e\\x0f\\x94\\xda\\x18\\xc6\\xb9\\xa0\\x93\\x2c\\x3c\\x58\\x75\\xd3\\xa9\\x3f\\xbd\\xad\\xcf\\x67\\x96\\x4e\\xec\\x9e\\xc2\\xbe\\x69\\xb4\\x8f\\x02\\x0f\\x6c\\x98\\x74\\xde\\x5f\\x8a\\x51\\x67\\xb5\\xee\\x02\\x4a\\x2c\\x2e\\xfd\\x0c\\xdc\\xd2\\xac\\xd8\\xc1\\xf7\\x87\\x81\\x41\\x41\\xe3\\x0b\\x38\\xb1\\x63\\x17\\x5b\"},\n{{0xb6,0x9c,0x33,0xb1,0x1b,0xa6,0x78,0x41,0xc3,0xd4,0xe6,0xf9,0x23,0x4e,0x35,0x37,0x0a,0x28,0xb4,0x76,0x62,0xac,0x56,0x0b,0x27,0xc0,0x78,0xb6,0x6a,0xb1,0xb0,0x21,},{0x9d,0xf6,0x8e,0x9a,0xcf,0x67,0x37,0x92,0x61,0x74,0x4d,0xb5,0xd1,0xe3,0x77,0x89,0x2f,0x2b,0x69,0x2e,0xd5,0xa3,0x8b,0x37,0x07,0x3c,0x04,0xde,0x5d,0x22,0x67,0x37,},{0x24,0x36,0x8f,0xee,0x5b,0xd8,0x48,0xb4,0xc6,0x61,0xa3,0xbe,0x4f,0x31,0x0c,0xfc,0x43,0x6e,0x79,0xec,0x4a,0x78,0x50,0x1b,0x81,0x09,0x5f,0xe5,0x16,0x14,0x23,0x1b,0x6c,0xa1,0xab,0x12,0x69,0x99,0x6a,0xd2,0xe9,0x8e,0x29,0x97,0x81,0xaf,0x8e,0x29,0x80,0x4b,0x24,0xfe,0x56,0x79,0xca,0x3b,0xa6,0x50,0xc5,0xc4,0xcc,0x58,0xce,0x01,},\"\\xf9\\xea\\x12\\x6d\\x3a\\xb2\\x19\\x61\\xaa\\x24\\x33\\x90\\x0a\\x39\\x82\\xb8\\x3e\\x0e\\xf8\\x6d\\x52\\xd1\\x34\\x40\\xaf\\xa4\\x81\\x7f\\x9b\\x82\\x2f\\xb5\\x82\\xcc\\x39\\x32\\xbf\\x45\\x0d\\x46\\x77\\xc9\\x18\\x81\\x81\\xfe\\x75\\x26\\xad\\x6f\\xe5\\xab\\xc6\\x1d\\x0a\\xe7\\x59\\xf2\\x15\\x01\\x3c\\x0b\\x2b\\x41\\x06\\x4c\\xb6\\x27\\x8b\\xa7\\xe3\\x9e\\x2f\\x4c\\x10\\xd6\\xcc\\x96\\x05\\xb3\\x86\\x9e\\x16\\x9d\\x7d\\xa4\\x2e\\x88\\xeb\\x85\\x78\\x70\\xfe\\x61\\x18\\xbb\\x02\\xbc\\x08\\xc8\\x05\\x5f\\x0c\\x18\\x9b\\x62\\xf7\\x9f\\xb1\\x46\\xb4\\xc5\\x43\\xaa\\x30\\xcc\\x0c\\xd5\\x7f\\x03\\x7e\\x9e\\xf7\\xa6\\x37\\x11\\xf6\\x6e\\x6f\\x28\\x78\\x93\\x17\\x02\\x20\\x27\\x02\\x61\\x42\\x77\\xd5\\x13\\xf0\\x85\\x0b\\x75\\x85\\x49\\x33\\x6b\\x30\\xcf\\x40\\xab\\x8b\\xd4\\x60\\xe6\\x0e\\x12\\xde\\xed\\x04\"},\n{{0x7b,0x63,0x61,0x3f,0x6d,0xae,0x01,0xcd,0xcd,0x5e,0x6b,0x37,0x68,0x69,0x71,0xcd,0x8d,0x8a,0x99,0x54,0x2f,0x63,0x29,0xa1,0x28,0x54,0xa9,0xd8,0xff,0x81,0x05,0xac,},{0x72,0xec,0x43,0xfa,0xf3,0x4d,0x87,0x30,0x17,0x7d,0x1f,0x07,0x43,0xc7,0x4c,0x20,0xbf,0x72,0xc2,0x39,0x4b,0x8a,0x7d,0x47,0x1f,0xfe,0x2a,0x04,0xab,0x00,0x81,0x1c,},{0x76,0xf5,0x0b,0x2b,0x9c,0x2a,0xd9,0x7b,0xfb,0x94,0x99,0xee,0x41,0x92,0x8a,0xc0,0x72,0xda,0x5e,0x8b,0xc7,0x1d,0x02,0x12,0x55,0x09,0x42,0x33,0x2b,0x62,0xe7,0x0c,0x8b,0xfe,0x1c,0x72,0x25,0x42,0x39,0x46,0x88,0xde,0xcd,0x91,0x7a,0xec,0x8f,0x95,0x35,0x3e,0x1d,0x72,0x62,0x4b,0x70,0xeb,0xed,0x5d,0x17,0xf6,0xc5,0x49,0x77,0x02,},\"\\x18\\x16\\x48\\x8f\\x1f\\xc8\\x3e\\x1e\\xd5\\x91\\x16\\x37\\xdd\\x42\\xba\\x20\\x77\\x65\\x7d\\xfe\\x1a\\xe4\\x22\\xad\\x0a\\xee\\x59\\xdf\\x9d\\xd5\\x6a\\x27\\x63\\xc2\\xdd\\x0e\\xf6\\x1a\\x12\\xbb\\x82\\x5b\\x0d\\xac\\x1e\\xda\\x5f\\xbb\\x69\\x1c\\x5e\\xd5\\x8f\\x3f\\xb3\\x25\\x05\\x0b\\x45\\x63\\xa4\\x04\\x20\\x99\\x98\\x2f\\xff\\xa5\\xd6\\xed\\x74\\x2d\\x95\\x82\\x3d\\xa8\\xe1\\x78\\x7c\\xf7\\x46\\xef\\x63\\xb3\\xfb\\xb0\\xe8\\x8a\\x6c\\x0b\\xea\\xe4\\xf7\\x31\\x83\\x66\\x93\\x6b\\x49\\x17\\xf5\\x07\\x33\\x60\\x68\\xb1\\x94\\x68\\x09\\x00\\xa7\\xbf\\x4a\\x6f\\xb6\\x9a\\x5c\\x38\\x7b\\x97\\xe3\\x1b\\xc7\\xf9\\xbe\\x53\\xc2\\xa8\\x9e\\x36\\x51\\xce\\x1d\\xe4\\x1b\\x10\\xe9\\x21\\xb2\\x06\\xeb\\xf3\\x2e\\x56\\x21\\xef\\x80\\x81\\x61\\x6d\\xcd\\x7a\\x20\\x59\\x43\\x7e\\xfa\\xd0\\x14\\xbb\\x8e\\x2c\\x82\\x21\"},\n{{0x35,0x58,0xd3,0xa7,0x43,0x95,0xbd,0xcb,0xa5,0x60,0xe2,0xc4,0x5a,0x91,0x96,0x0c,0xec,0x6c,0xb3,0xed,0xbc,0xd3,0x0e,0x72,0x2f,0x7f,0x05,0x52,0x10,0xf3,0x7b,0x51,},{0x53,0x4f,0x43,0xeb,0xa4,0x03,0xa8,0x4f,0x25,0x96,0x7c,0x15,0x2d,0x93,0xa0,0x17,0x5e,0xc8,0x29,0x3e,0x6f,0x43,0x75,0x31,0x9e,0xad,0xf9,0x57,0x40,0x1f,0xbb,0xd2,},{0xb3,0x65,0xb5,0x56,0x1a,0x13,0xa5,0x45,0x17,0xcf,0x90,0xd8,0x8b,0x35,0xeb,0x09,0x67,0xd6,0xd5,0x84,0x14,0xb8,0xc1,0x54,0x7e,0x69,0x31,0x59,0xe0,0x13,0x78,0x56,0x36,0x54,0xc5,0x0f,0xb4,0x23,0x23,0xf0,0x9d,0xd7,0x8f,0xfe,0x28,0x05,0x6d,0xdf,0xa5,0x4f,0xeb,0xf4,0x48,0x91,0xe8,0xa7,0x41,0xb6,0xa1,0x68,0x7d,0x72,0x86,0x05,},\"\\xbe\\x75\\x44\\x4f\\x9c\\xe6\\xbe\\x1d\\x83\\xaf\\x62\\x2a\\x8c\\x47\\x8d\\x51\\x01\\x27\\xdb\\x56\\xf1\\xde\\x6e\\xb8\\xa5\\x12\\x65\\x22\\xb0\\x9f\\xdc\\x6c\\xa0\\x86\\x2c\\xec\\x0b\\x8b\\x2a\\xaf\\xa3\\x1c\\x17\\xa2\\xcc\\x47\\x7d\\xa5\\x33\\xd2\\x76\\xa1\\xae\\x4f\\x8e\\x07\\x59\\xd6\\xaf\\xa0\\xb1\\x74\\x11\\xb5\\x17\\x0b\\x52\\xf2\\x05\\x47\\xc7\\x2f\\x3e\\x88\\xd4\\x8c\\xb4\\x56\\xfe\\x62\\x5b\\x62\\xfe\\xb0\\xf8\\x13\\x17\\xed\\xf1\\xec\\x09\\xec\\xe5\\x34\\xb9\\xf5\\x00\\xd4\\xe1\\xb1\\xbd\\xa2\\xdb\\x21\\x98\\x2a\\xa9\\x50\\x94\\x22\\x6e\\xe9\\xf5\\xb0\\xa6\\x5d\\xa8\\x3f\\x91\\x12\\x1c\\x96\\xb3\\xb4\\x01\\x0a\\xe7\\x82\\x6c\\x9e\\x80\\x63\\x6c\\xba\\x00\\xf7\\x0c\\x3c\\x8a\\x27\\x9b\\x01\\xb9\\x52\\x94\\xcb\\x85\\x0f\\x91\\x70\\x9f\\x43\\x76\\x66\\x2a\\x58\\x0b\\x15\\xac\\x29\\x81\\xaf\\xe9\\xf8\\x54\"},\n{{0xa3,0x5b,0x92,0xf2,0x44,0x06,0x3a,0x19,0xbb,0x5e,0x3e,0xd4,0xd6,0x99,0xed,0x20,0x69,0x60,0x71,0x16,0xd2,0xbd,0x08,0x11,0x3f,0x0d,0x83,0x73,0x61,0x3f,0x35,0xb7,},{0x7e,0xc9,0x36,0x01,0x86,0x4e,0xe4,0x99,0x5a,0x4f,0x7a,0xbc,0xd3,0xdf,0xc1,0x01,0xe9,0xe7,0xf3,0x69,0xe6,0x3d,0xe1,0xae,0x68,0xa0,0x7a,0xa7,0xf0,0x75,0xb3,0x29,},{0xa2,0x3d,0xbe,0x37,0x57,0xe4,0x78,0xdb,0xc8,0x4d,0x3d,0xb3,0xa9,0x33,0xb0,0x42,0x8c,0xed,0xb6,0xb0,0x1b,0x86,0xd8,0xd7,0x3f,0x39,0x59,0x87,0x8d,0xae,0x6f,0x05,0x88,0xf5,0x05,0xcd,0x4d,0x39,0xf2,0xab,0x46,0x77,0xb6,0x48,0x05,0xd6,0x29,0x65,0x2a,0x22,0x52,0x98,0x25,0xc3,0xa9,0x1d,0x04,0x37,0x49,0xfc,0x71,0xf0,0x37,0x06,},\"\\x65\\xcd\\x36\\xda\\xe0\\x16\\x8d\\x69\\x97\\x4f\\x95\\xf0\\x9d\\xd9\\xa5\\x9d\\xb7\\x99\\xf9\\x11\\xe1\\xa1\\x5b\\x85\\xa0\\x08\\x93\\xb8\\xc9\\xa3\\xd4\\x8a\\x2f\\x58\\xac\\x12\\x6b\\xfa\\xa0\\xa6\\x06\\xc0\\x5d\\x94\\x70\\x1d\\x27\\x3a\\xbf\\x7d\\x68\\x81\\x7f\\x2c\\x71\\xb1\\xc5\\x41\\x79\\x5c\\x4f\\x60\\x95\\xe2\\x6c\\x9d\\xff\\x80\\x3f\\x03\\x2f\\x75\\x66\\x3f\\xd1\\x69\\x8e\\xdd\\x97\\xff\\x3a\\x0e\\x72\\xe1\\xb7\\xc9\\x94\\x8b\\x08\\xba\\xcb\\x5f\\x7d\\xe5\\x02\\xb2\\xfe\\xa6\\x7c\\xa2\\xfe\\xf1\\x90\\xd6\\x0e\\xae\\x92\\xd1\\x51\\x58\\xda\\x44\\x4a\\x49\\xd2\\xe9\\xd5\\xa5\\x73\\xe8\\xe1\\x77\\xe8\\xbb\\xf7\\xe6\\xc4\\x9f\\x90\\x71\\x36\\xe7\\x1d\\x2a\\x66\\xcb\\x07\\x63\\x6d\\x48\\x76\\x8f\\xf4\\x17\\xc8\\xbe\\xcc\\xf4\\x32\\x31\\x81\\xfe\\xfb\\x31\\x24\\xe4\\x34\\x04\\x9e\\xa4\\x5d\\xd5\\x01\\x9e\\x40\\xb4\"},\n{{0x72,0xd4,0xa5,0x64,0xca,0x15,0x49,0x9b,0x5e,0x4e,0x75,0xd8,0xac,0x0f,0x28,0x21,0x7d,0x32,0x11,0x4a,0x0c,0x64,0x9a,0x7c,0x8e,0xaa,0xdd,0x0c,0xc7,0x8c,0x52,0x0b,},{0xc7,0x66,0xbd,0x73,0x83,0x7c,0x4f,0xaa,0x52,0x15,0x50,0x2f,0x1e,0xfc,0x90,0xc0,0x03,0xf7,0x11,0xbb,0xef,0x55,0x17,0x00,0x91,0x02,0x8a,0x34,0x49,0x34,0x08,0xa9,},{0x8f,0xc4,0xf1,0x79,0x33,0x0b,0x64,0x2d,0xd8,0x6c,0xa9,0x36,0x26,0x51,0xb8,0x3b,0x00,0x6d,0x83,0x75,0xcc,0xef,0x81,0x1d,0x3c,0x67,0x06,0xf9,0x15,0x94,0x65,0x1d,0xf2,0x76,0x99,0x53,0x72,0x30,0x46,0xcc,0xb9,0xbf,0xe6,0x6a,0x66,0x7e,0x0d,0x11,0xfc,0x3e,0xa2,0xd8,0x22,0x62,0x34,0xfd,0xd5,0x16,0x47,0x65,0x26,0x0f,0x7b,0x05,},\"\\x6c\\x7e\\x7b\\x62\\xeb\\x24\\x4a\\x45\\xd7\\x84\\x36\\xe2\\x97\\x0d\\xcd\\x6c\\x0f\\x7d\\xb8\\x22\\x97\\xa8\\x61\\x40\\xea\\x58\\xdd\\x22\\xc2\\x19\\x5a\\xdb\\xc9\\x56\\xd4\\xc4\\xec\\x05\\x35\\x4b\\x21\\xef\\xe2\\x4c\\xfc\\xfe\\x10\\xe1\\x76\\x22\\x36\\x88\\x48\\x18\\x0d\\x2c\\x46\\x80\\xcc\\x21\\x5e\\x8c\\xee\\xa6\\xcc\\xe2\\x22\\x16\\x1f\\x1e\\x09\\x22\\x39\\x25\\x3b\\x97\\x46\\xf7\\x88\\x7d\\xf2\\x42\\x5a\\xb5\\xa8\\x80\\xbd\\xba\\x98\\x15\\x3b\\xe7\\x86\\xdc\\x83\\x8c\\xbe\\xca\\x01\\x6b\\x1d\\x06\\x52\\x4b\\xd6\\xbf\\xba\\x80\\x9a\\x8b\\xb3\\x7a\\xda\\xb1\\x5d\\x42\\x41\\x5f\\x86\\xec\\x03\\x58\\x36\\x5e\\xa8\\x7b\\x81\\x50\\xb0\\x54\\x41\\xd9\\xd4\\x98\\x46\\x87\\x14\\x85\\xca\\xae\\x6d\\xe3\\x59\\x73\\x6c\\x27\\x18\\x97\\x36\\xd8\\xf1\\x76\\x5f\\x3e\\x5c\\x5f\\x6b\\x92\\x16\\x83\\x96\\x39\\x0b\\xee\\x94\\xcf\\xbd\"},\n{{0x2e,0x5a,0xaa,0xb2,0x98,0xe6,0x6c,0x2d,0xc1,0xd7,0x7e,0xa7,0x42,0x1f,0xf8,0x95,0x25,0x5f,0x9d,0x90,0x0d,0xb0,0x45,0x0d,0x63,0xf9,0xf7,0x9c,0x1a,0x70,0x13,0xcf,},{0x03,0x81,0xf3,0xf1,0x90,0x45,0x71,0x9b,0x9e,0x8c,0xeb,0x56,0x2f,0x0e,0x96,0x5d,0xc0,0x7b,0x09,0xf3,0x71,0xa9,0x63,0xa2,0x81,0xc7,0x49,0xc2,0x53,0x2f,0x65,0x4a,},{0x7c,0x74,0x30,0x30,0x5b,0x36,0x1a,0x9e,0x35,0xb2,0x78,0x0c,0x4d,0x44,0x08,0x07,0x1b,0x21,0x30,0x93,0x1d,0x39,0x83,0x0e,0xc8,0xd3,0x13,0xaa,0xfb,0xc8,0x3a,0x65,0xda,0xe1,0x9c,0xb7,0x47,0xd9,0xd1,0xc4,0xce,0x3f,0x35,0x9c,0xc8,0x24,0xea,0x8c,0x92,0xf6,0x6a,0x42,0xb8,0x61,0x4e,0x78,0x48,0xb8,0x84,0xac,0x8a,0xa4,0xae,0x02,},\"\\x3d\\xf0\\xe5\\x4c\\x71\\x1e\\x31\\x32\\xd7\\xae\\x95\\x3d\\xeb\\x7b\\x66\\x86\\x9e\\xe5\\x31\\xee\\x40\\xb6\\x3c\\xe6\\x93\\x20\\x6c\\xdb\\x2f\\x4b\\xda\\x0a\\x25\\x69\\xe9\\x13\\xac\\x3e\\x65\\x32\\xc5\\xd9\\x64\\x8e\\xfd\\x46\\x27\\x78\\x0f\\xb8\\xa3\\x1d\\x10\\x7e\\x03\\x3f\\x05\\x4d\\x19\\xed\\x8b\\x7c\\x49\\xdc\\x40\\x7d\\x2e\\x94\\x9d\\xe2\\x5f\\x99\\x30\\x72\\x21\\xd3\\x58\\x43\\xf6\\xd5\\xeb\\x7d\\xe5\\xcd\\xf4\\x1b\\x91\\xdb\\xbf\\x34\\xcb\\x6c\\x9c\\x53\\x00\\x21\\x01\\x4b\\x56\\xab\\xc4\\x4a\\xc2\\x30\\x03\\x13\\x61\\x56\\x08\\xa7\\xb4\\xa2\\x35\\xe9\\x9c\\x14\\xce\\xf8\\x05\\x08\\x87\\x03\\x22\\x09\\x48\\x8b\\x9e\\xae\\xaa\\x82\\xc0\\x94\\x05\\xfc\\x75\\xbe\\xc9\\x4d\\xd4\\x2d\\x6f\\xf1\\xb5\\x99\\xa6\\x3e\\xe5\\x74\\x2f\\x33\\x64\\x09\\x3a\\xc9\\x2c\\xab\\xab\\x30\\x35\\x82\\x2a\\xa8\\x67\\xae\\x56\\xdc\\xc9\\x9d\"},\n{{0xb6,0x36,0xa0,0x24,0x48,0x00,0x35,0x43,0xdb,0x86,0x4b,0x40,0xb5,0xd8,0xd6,0xdd,0x9a,0xd6,0x11,0x62,0x4c,0x9b,0x0f,0xc6,0x89,0x0c,0x51,0xea,0x55,0x92,0xc7,0x90,},{0x1e,0xf3,0x60,0x49,0x59,0x68,0xe5,0x6e,0x6d,0x3f,0xe7,0x40,0xb1,0xc8,0x4c,0x4e,0x44,0x90,0xed,0x68,0x2d,0xeb,0x43,0x05,0xaf,0xd5,0x96,0xef,0xb2,0x80,0x22,0x3b,},{0xd4,0xba,0x80,0x30,0x0d,0x5c,0xb5,0x13,0x53,0xc0,0x3f,0x28,0xc4,0x4f,0xd0,0xa4,0x24,0xff,0xe1,0xe4,0x0d,0x78,0xed,0x7b,0xb1,0x13,0x3e,0x8f,0xe4,0xe1,0x87,0x50,0x52,0x93,0xb2,0x0a,0x39,0x1d,0xa9,0x62,0xc6,0xa8,0xac,0x0a,0xce,0xc9,0xc6,0x72,0x26,0xaf,0x3b,0x61,0x95,0xda,0xbe,0x39,0xb3,0x66,0x22,0x94,0xda,0x3e,0x0e,0x09,},\"\\x4a\\xa8\\x5a\\xac\\x25\\x03\\x4f\\x61\\x4e\\xd4\\x4f\\x7a\\xdc\\xdb\\xee\\xec\\x25\\xfc\\xc2\\xa9\\xee\\xa3\\x2a\\xb6\\xa8\\x69\\x95\\x06\\xf7\\xa1\\xca\\xd3\\xbc\\x89\\x2e\\x9d\\xce\\x93\\x4e\\x75\\xb0\\xa8\\xcd\\x14\\x64\\x2b\\x77\\x85\\x99\\x28\\x6c\\xfd\\x8f\\x50\\xa9\\xe4\\xf2\\xed\\xf9\\xf9\\xd6\\x29\\x1a\\x2e\\x29\\x79\\xcf\\x18\\x06\\xb9\\x3e\\xd8\\xc9\\xa7\\x8f\\xae\\x19\\x9b\\x28\\x54\\xa0\\x3e\\xc4\\x06\\xab\\x3f\\x72\\x08\\x35\\xee\\x26\\x3f\\xbb\\xc9\\x1c\\xb4\\xef\\x07\\x58\\xd7\\x75\\xfc\\x78\\x4c\\x7d\\x5b\\x25\\x1a\\xc8\\x93\\x79\\x19\\xa9\\xe6\\x7b\\xe8\\x8c\\x9e\\x44\\xcf\\x2e\\xc7\\xf5\\x60\\x26\\x9a\\xa0\\xf1\\x11\\x3d\\x91\\xb8\\x44\\x01\\xdb\\x15\\xa3\\xc4\\x8c\\x7d\\xac\\xff\\x49\\x39\\xee\\x01\\xba\\xbb\\x98\\x2f\\xb9\\x56\\x25\\xc6\\xc3\\xad\\x78\\x74\\x90\\x60\\x55\\x1b\\xfd\\xe8\\xcc\\xe4\\xfb\\x8a\\x29\"},\n{{0x5c,0xa0,0x54,0x3c,0x71,0xf5,0x68,0xa0,0x0e,0xed,0xf5,0x0a,0x95,0x20,0xf4,0xc1,0x5b,0x52,0x6e,0x3f,0xb0,0xda,0x81,0x6c,0x29,0xea,0x3d,0x50,0xb2,0xf6,0x2a,0x12,},{0xd4,0xa2,0x93,0x3c,0xe1,0x94,0x54,0xe3,0x31,0xb5,0x28,0x01,0x00,0x20,0x9a,0x6c,0xe8,0xe5,0x69,0xf9,0x93,0xc2,0xac,0xab,0x51,0xdb,0xe8,0x64,0xc5,0xcb,0x25,0x63,},{0x43,0x68,0x23,0xee,0xff,0x3e,0xdc,0xe5,0xd8,0x58,0x7d,0x68,0xe5,0x47,0x3e,0xf3,0xd8,0xdc,0x94,0x65,0xb5,0x58,0xb6,0xe8,0xe7,0xcd,0x31,0x37,0xec,0xcc,0x80,0xb4,0xc4,0xe8,0x06,0xed,0xf1,0x36,0x19,0xd8,0xe7,0x17,0xe6,0x9f,0x48,0xd7,0x06,0x1b,0x68,0xde,0x02,0xc8,0x20,0x9b,0xe1,0xf7,0xac,0x26,0xba,0x8e,0xdf,0x60,0x6d,0x02,},\"\\x4e\\xf8\\x49\\x69\\x78\\xd2\\x8c\\x10\\xab\\xd5\\x4a\\x26\\x35\\x6e\\xe5\\x59\\x21\\xce\\xb3\\x50\\xdd\\x4b\\x74\\x2c\\x41\\x61\\xfb\\xeb\\xa8\\xa1\\x60\\x1f\\x8a\\xd0\\x48\\x4b\\x21\\xa8\\xcf\\x5a\\x29\\x4f\\xac\\x00\\xec\\x8a\\x6f\\x59\\xe3\\x36\\x2e\\x47\\xbf\\xae\\x1e\\x28\\xa2\\xe6\\xd0\\x17\\xc5\\xca\\xa7\\x5f\\xb0\\xf4\\x84\\x82\\x80\\x80\\x37\\xca\\x21\\x47\\x69\\x54\\xd7\\x78\\xff\\x1a\\x05\\x86\\xda\\x3e\\xf6\\x9d\\x6c\\xef\\x6d\\x2d\\x8d\\xf4\\xae\\x7a\\x85\\x44\\x2a\\x1e\\x46\\xc9\\x98\\xcf\\x40\\x7a\\x6a\\xd4\\xc5\\x46\\x3a\\x43\\xc2\\x48\\xf3\\xb6\\x93\\x7f\\xdb\\xc8\\x45\\xb6\\x0c\\x6d\\x85\\xe0\\x56\\x3c\\xc1\\x6b\\xa9\\x67\\x5d\\x36\\x4f\\x52\\x5f\\x66\\x9a\\xaa\\xc9\\x5f\\x42\\x8b\\xb5\\x82\\x05\\x09\\x9f\\x9e\\x4a\\x6d\\xbb\\xd0\\x15\\x1f\\xb6\\x5b\\xab\\xe1\\x23\\xe5\\x39\\x3a\\xd6\\x40\\x26\\x93\\x5c\\xb4\\x88\\xaa\"},\n{{0x5f,0x87,0x11,0x7d,0xa9,0xbb,0xb6,0x09,0x1c,0x94,0xda,0x6b,0x23,0x0b,0x7d,0x8f,0x6d,0xe0,0xed,0x2a,0x07,0x64,0x13,0xb9,0x2e,0xac,0xdc,0x43,0xab,0xbc,0x68,0x97,},{0xaa,0x78,0x6a,0x14,0x62,0x26,0x83,0x2a,0xa7,0x3c,0x43,0x4b,0x0e,0xdc,0x2d,0x41,0xd2,0x55,0x8f,0x82,0x0a,0xb8,0xf8,0x7e,0x09,0xe6,0xcd,0xa9,0x10,0x72,0xb9,0xb6,},{0x0f,0x19,0xe6,0xea,0x0c,0x05,0xf3,0x81,0x85,0xc0,0x1c,0x2d,0x64,0x77,0x99,0x5d,0xaf,0x50,0x65,0xba,0x9d,0x80,0x17,0x3f,0xa6,0xbb,0x23,0xa7,0x74,0xdc,0x88,0xb3,0xaa,0xe8,0x79,0xd8,0xa6,0x24,0x71,0xd2,0xd3,0x04,0xcc,0x3d,0xc6,0x62,0x78,0xa7,0xab,0xcb,0x0b,0xb0,0x77,0x1c,0xd2,0x78,0xe1,0x1e,0x7b,0x93,0x2e,0x9f,0x9b,0x0f,},\"\\x22\\x97\\xc4\\x0a\\x2e\\x83\\x65\\xba\\xe4\\xc5\\xf0\\x63\\x0c\\x50\\xb1\\x3b\\xdd\\x9a\\xd9\\x77\\x0a\\x5d\\x9a\\x94\\x51\\xd0\\x08\\x74\\xb0\\x23\\xd2\\x5e\\xcd\\x46\\x8b\\x96\\x57\\x1b\\x2f\\x16\\xdc\\xb1\\xb0\\xd3\\xd7\\x56\\xc1\\xf0\\x44\\xfc\\xdd\\xd1\\xc5\\x1f\\x27\\x72\\x7a\\x03\\x69\\xc9\\xcf\\x25\\xbd\\x6a\\xa5\\x95\\x51\\xb5\\xb0\\x7c\\xf8\\xf8\\x07\\xd9\\x2b\\x15\\x91\\x98\\x63\\x97\\x04\\x74\\x0f\\xe6\\xed\\xa0\\xf2\\x6d\\xba\\x7e\\x75\\xd4\\x53\\x0b\\x28\\x00\\xf0\\x3f\\xb6\\xaa\\x67\\x7d\\x84\\xdf\\x75\\xd6\\x8d\\x4f\\xbb\\x64\\xad\\x21\\x00\\x1e\\x3f\\xc8\\x7b\\x60\\x9b\\x9c\\x25\\x1e\\x8c\\xcb\\x12\\xbb\\xca\\x92\\x74\\x47\\xe2\\x05\\x4e\\x07\\x68\\x8e\\xb8\\xa2\\x05\\x21\\xa5\\x22\\x49\\xe7\\xb9\\x43\\xbe\\xd6\\x0e\\x6a\\x93\\xc0\\x1e\\x3e\\xb6\\x21\\xf0\\x46\\x0c\\x18\\xa6\\x90\\xb6\\xf6\\xb6\\x6e\\xdc\\x6e\\x87\\x43\\xa6\"},\n{{0xb5,0x3a,0x64,0x4c,0x92,0xba,0x2d,0xc7,0x10,0x8b,0x16,0x83,0x3f,0x09,0xad,0x59,0x17,0x84,0x64,0x37,0x22,0x5a,0x77,0x3d,0x32,0xd7,0x9c,0x97,0x73,0x3c,0x0a,0x58,},{0x51,0x58,0x18,0xc6,0x9c,0x0e,0x0a,0x17,0x06,0xb0,0x41,0x43,0x84,0x2f,0x3e,0x9e,0x27,0x14,0x48,0xfb,0xaf,0x3a,0x89,0x91,0x19,0xc3,0x2f,0x42,0x56,0x6f,0xfd,0x33,},{0x13,0xd2,0xcb,0xac,0x79,0x76,0xad,0x27,0xf0,0xbf,0x66,0x9a,0xd5,0x88,0xef,0xb2,0xc9,0x1b,0xab,0x85,0x07,0xd5,0x7f,0xb1,0x6b,0xfe,0xa9,0xca,0xff,0x2b,0x09,0x64,0xe7,0x56,0x25,0xc4,0xd8,0x08,0xd7,0xbb,0xb7,0x8c,0x5b,0x46,0x4e,0xdf,0xfe,0x49,0x49,0xec,0xfb,0xc8,0xb9,0x5f,0xf6,0xfd,0xb1,0xbd,0xca,0x27,0x42,0x06,0x81,0x00,},\"\\x13\\x03\\x6d\\xaa\\xee\\x45\\xfc\\xfd\\xe0\\xc5\\x3e\\x06\\xd0\\x5a\\xa9\\xc0\\x1e\\xa9\\x4a\\x67\\xe8\\x6c\\x6c\\x53\\x8c\\xcb\\x28\\x3b\\x36\\x8d\\xaf\\x70\\x78\\xd3\\xfb\\xab\\x58\\x0c\\x76\\xec\\xf8\\x2b\\x4e\\x96\\x60\\xf0\\x68\\xdc\\xbb\\x50\\x0b\\x80\\x59\\x50\\x17\\xc5\\xbe\\x3c\\x44\\x8f\\xbd\\x8a\\x17\\xd9\\x7c\\x56\\x43\\x19\\x78\\x90\\xe1\\x67\\xb3\\x53\\x45\\xbf\\x65\\xe7\\x5b\\x82\\xc8\\xd6\\x52\\x29\\xf2\\xf6\\x0a\\xae\\x27\\x72\\x58\\x1b\\xc9\\x9c\\x49\\xd4\\x16\\xbc\\x3d\\x78\\x74\\x6e\\xf8\\x30\\xf1\\xaf\\x94\\x4f\\x4a\\x67\\x15\\xab\\x4f\\xfb\\x01\\x59\\x1b\\xac\\x28\\x57\\xf1\\xa9\\xc9\\xd1\\x70\\x08\\x88\\x78\\x00\\x06\\xa3\\x16\\x07\\x33\\x8f\\x7a\\xf7\\xbe\\xdf\\x6e\\xfe\\x0b\\x57\\x29\\x9a\\xc9\\x15\\x52\\x6f\\xe5\\xe1\\xe1\\x01\\x29\\x87\\x08\\xc6\\xe6\\x1b\\x84\\x22\\x0a\\xfe\\x95\\xb5\\x3f\\x89\\x59\\x87\\x45\\x61\\x52\"},\n{{0xd2,0x7c,0x9e,0xaf,0xcf,0x88,0x15,0x19,0x90,0xbb,0x5b,0x2f,0xa8,0x44,0x3e,0x70,0x9b,0x5f,0xd8,0xd7,0x8d,0x23,0x38,0x03,0x32,0x2d,0xc8,0x6d,0x93,0xd9,0x32,0x95,},{0x08,0xe0,0xef,0xf5,0x29,0x77,0x67,0x14,0x68,0x61,0x96,0xd8,0x17,0xfd,0xf7,0x1e,0xb5,0xb6,0xe8,0x32,0x65,0x16,0xef,0x48,0x9b,0xfe,0x18,0x6a,0xc5,0xc5,0xbf,0x6d,},{0xc2,0x54,0xe3,0x71,0x44,0x56,0x33,0x13,0x74,0x42,0xee,0xfe,0x40,0xad,0x4a,0x82,0xe6,0x9b,0x1e,0xbf,0x48,0xa6,0x85,0xa2,0xbc,0x6f,0xfb,0xac,0x12,0x6d,0x22,0x84,0x87,0xb2,0xe3,0x53,0x7c,0x97,0xef,0x74,0x10,0x34,0x20,0x91,0x96,0x2e,0x50,0xc0,0xcb,0x85,0xde,0x7b,0x39,0xce,0xb4,0x1a,0xc4,0x07,0x8d,0x40,0xf3,0x40,0x71,0x06,},\"\\x77\\xc3\\x5b\\xda\\x32\\xa5\\x96\\x7d\\x8b\\x30\\x2f\\xa7\\xa4\\x75\\x83\\xce\\xab\\x89\\xc9\\xa6\\x09\\xa6\\x67\\xb7\\x53\\x15\\x5f\\xa6\\x99\\x6f\\x86\\x31\\xd0\\xeb\\xed\\xfe\\x0a\\xc3\\x64\\xc7\\x7e\\x85\\xba\\x37\\x31\\x1f\\x0d\\xe5\\x7a\\x0d\\xc2\\xc1\\xe9\\xe4\\x00\\xd5\\x8b\\x42\\x4a\\x32\\x2e\\x1d\\x57\\x71\\xe0\\xa9\\xfd\\x95\\x02\\xad\\x02\\x32\\xce\\x54\\x4f\\x07\\xd8\\xc6\\x6e\\x7c\\x31\\x47\\xf8\\x60\\x7a\\xc6\\x18\\x9b\\xb6\\x90\\x66\\xf2\\xfa\\xd6\\x31\\x18\\x5f\\x45\\x7f\\x46\\x7e\\xba\\x33\\x22\\x8e\\xcc\\x40\\xe8\\x94\\xa7\\x7b\\x57\\x16\\x98\\xa9\\xbf\\xac\\x84\\x1a\\x54\\xea\\xc5\\x21\\x9d\\xa9\\x9c\\x6a\\x91\\x25\\xc4\\x69\\xa2\\x2f\\xe8\\x1f\\x3b\\x95\\x14\\x33\\x89\\x6f\\x19\\xce\\x39\\xb3\\x73\\xfd\\x7e\\x5c\\x7b\\x65\\x0a\\x5e\\xf2\\x36\\x5a\\xe7\\x51\\x0b\\x0d\\xa5\\xe4\\x9d\\x7c\\x07\\x07\\x3c\\xf1\\x66\\xa9\\x83\\x87\\xe8\"},\n{{0x70,0x21,0x3d,0x3a,0x79,0xc6,0x5d,0x6d,0xbb,0xa5,0x42,0xa3,0x67,0x96,0x35,0x00,0x3a,0x68,0x2a,0xf5,0xfa,0x58,0xde,0x6b,0x0d,0x65,0xbf,0xa2,0x41,0x84,0x90,0x1c,},{0x44,0x02,0xfb,0x92,0xcc,0x12,0x49,0xdd,0x1a,0xe1,0x69,0x0f,0x03,0xb3,0xec,0x4f,0x1e,0x9b,0xda,0xb0,0xde,0x5b,0xfd,0x28,0x9f,0x10,0x29,0x68,0x30,0xfd,0x40,0x3e,},{0x5b,0x6c,0xe2,0x77,0x4d,0x40,0x0e,0xce,0xa8,0xa8,0x08,0xf5,0xfd,0x0a,0x79,0x7f,0xfc,0x61,0x16,0x75,0x23,0x76,0xcd,0x7b,0xfa,0x3b,0x2c,0xca,0x3a,0x84,0xd5,0x59,0x3f,0x5c,0x03,0xad,0x3e,0xec,0x1d,0x89,0x53,0x22,0x75,0xc4,0x7b,0x7c,0xe2,0xa0,0xe9,0xc5,0x9c,0xc4,0x02,0x8a,0x8a,0x65,0xe5,0xbb,0x90,0x97,0xea,0x71,0xc2,0x08,},\"\\xcd\\x6e\\x1c\\xd9\\xc9\\x0f\\x56\\x6d\\xe0\\x43\\xd7\\x5d\\x72\\x44\\xec\\xfd\\xb3\\x8e\\x8b\\xde\\x2f\\x9a\\x6c\\xd5\\xa4\\xfd\\xac\\x72\\xb5\\xed\\xe6\\xaf\\x62\\xd9\\x81\\x91\\x8c\\x5e\\x61\\x0a\\x38\\x78\\x92\\x74\\xfa\\x10\\xe5\\x27\\xf8\\x5f\\xad\\x20\\x9b\\x76\\xca\\x1c\\x28\\x1a\\xd5\\x89\\x0f\\x9c\\x96\\xd3\\x5d\\xe5\\x22\\xf1\\xdd\\xcc\\xb5\\x39\\xb8\\x79\\x8a\\x00\\x67\\xac\\xdd\\x45\\xb6\\xe3\\x44\\xa5\\xd9\\xa9\\x77\\x31\\xf5\\x45\\xff\\xa4\\xb1\\x7b\\x87\\x5c\\x67\\xb4\\x8e\\x9d\\x4c\\x4b\\xa7\\x2c\\x98\\xa4\\x50\\x55\\x83\\xfd\\xbf\\x1e\\x12\\xf2\\x2b\\x5a\\x7a\\x49\\x47\\x46\\xcc\\x9b\\x6c\\x1b\\x57\\x19\\x06\\xc6\\x7f\\xcc\\x88\\x3a\\x9c\\x15\\xa3\\x80\\x68\\x75\\xb6\\x59\\xe5\\x81\\x6b\\x42\\x76\\xc3\\x19\\x0e\\x25\\xcc\\x1a\\xc3\\xde\\x47\\xbf\\x99\\xc4\\x99\\x65\\x38\\x8f\\x54\\xf3\\xef\\x8e\\xb5\\x69\\x90\\x6c\\x60\\x08\\xe5\\xfb\\xbd\"},\n{{0x5d,0x54,0x0b,0x3b,0x14,0xf0,0xc0,0x17,0x5c,0x04,0x7e,0xaf,0x02,0x6c,0x90,0x70,0x65,0x9e,0xf1,0x3e,0x9d,0x28,0xe0,0xc5,0xc5,0x16,0xa4,0x28,0x26,0x9b,0x14,0xeb,},{0x1d,0x2d,0x4d,0x55,0x1a,0x57,0xc6,0xfb,0x2b,0x04,0x18,0x10,0x49,0xd4,0x03,0x9d,0x57,0x5c,0xf8,0x0c,0x0b,0xc6,0xec,0x70,0x33,0x06,0x7f,0x27,0x30,0x93,0x44,0xde,},{0x32,0x52,0x7d,0xa7,0x55,0x31,0x28,0x89,0x93,0x5d,0xd5,0xee,0x91,0xb1,0xbb,0x11,0x7a,0x5d,0x37,0x7d,0xd2,0x3e,0xf5,0xb7,0xe1,0x5b,0xaf,0xfa,0xe9,0xa5,0x43,0x91,0xa3,0xfd,0x23,0x4b,0xdc,0xe0,0x73,0xe0,0x98,0xc5,0x8d,0x05,0xbf,0x19,0x5b,0x4c,0x3c,0xc6,0x39,0x72,0x38,0x3b,0xa4,0xb5,0x10,0x72,0x97,0x1a,0xeb,0xcb,0x62,0x0d,},\"\\xe4\\xc9\\xe8\\x70\\x68\\x98\\xca\\xd4\\xac\\x68\\xd7\\x3c\\x13\\x0e\\xfa\\x04\\xa5\\x4f\\x8c\\xa2\\x59\\x19\\xea\\x6b\\xfa\\xa5\\x4c\\x8c\\x72\\x0c\\xed\\x85\\x4c\\x5e\\x95\\x09\\x10\\x2c\\x7b\\x88\\x5a\\xed\\xdf\\xfb\\xd1\\xb7\\xf2\\xc5\\x92\\x25\\x83\\x67\\x7a\\xc9\\xee\\xa9\\xa1\\x08\\xc7\\xe8\\x3e\\x88\\x71\\xae\\xd5\\xa0\\x84\\xf5\\x44\\x0b\\x0f\\x39\\x1a\\xd7\\xff\\xc6\\xba\\xb4\\x57\\x4a\\xf1\\xb9\\x67\\x70\\xf4\\x37\\x0e\\x8e\\x98\\x8e\\x85\\xec\\xb1\\xa8\\xd6\\x03\\x4f\\xc3\\xd7\\xf4\\x9f\\x74\\x22\\x02\\x3b\\x9d\\xab\\x5d\\x0c\\x16\\xbe\\xab\\x5f\\x5d\\x37\\xb0\\xa4\\xd7\\xde\\x19\\x7a\\xd8\\x7c\\xd4\\xff\\x8c\\xe7\\x8e\\xb1\\x2e\\x1d\\xaf\\x73\\x9d\\x8b\\x47\\xab\\x38\\x0a\\xbe\\x90\\x93\\x35\\x6d\\xb5\\xb5\\x97\\x17\\x75\\x1a\\x49\\xe1\\x94\\x84\\x72\\xfd\\xac\\xc2\\x59\\xff\\xff\\xc8\\xc1\\xdb\\xae\\x59\\x26\\x07\\xd4\\xec\\x71\\xcc\\x6a\\x8f\\x6b\"},\n{{0xca,0x41,0x76,0x9c,0xaf,0x17,0x17,0xb4,0xe4,0x5c,0x93,0xc1,0x21,0xdc,0x82,0xa5,0x34,0xfb,0xc6,0xec,0x09,0x86,0x66,0x2c,0x32,0x22,0xd7,0x14,0x92,0xbd,0x11,0x76,},{0xaf,0x3f,0x89,0xf6,0x18,0x7d,0xbc,0xf9,0x21,0x77,0x50,0xc6,0x7e,0xf8,0x9e,0xd4,0x7b,0x03,0x9f,0x9e,0xb0,0x62,0xff,0xec,0x9d,0xf6,0x4a,0xb5,0x2b,0x0b,0x45,0xcb,},{0x5c,0xda,0x87,0x2f,0x7e,0xd6,0xd7,0xc9,0x02,0x18,0xac,0x10,0xbe,0xe8,0xe2,0x14,0xf3,0xb3,0x4d,0x15,0xd2,0x5c,0x39,0x25,0x5e,0xc9,0xe6,0xb0,0x17,0x7a,0xa3,0xcb,0x73,0x68,0xd1,0x1c,0xb8,0xed,0x6f,0xf5,0xcf,0x0c,0x04,0x28,0x1d,0x06,0xbc,0x42,0x72,0xb8,0xbc,0x09,0xc2,0x3f,0x6f,0x4c,0xd5,0xa8,0x10,0xdd,0xc7,0xb9,0xc1,0x03,},\"\\x9d\\xe8\\x47\\x6c\\x58\\x13\\x84\\x8a\\xb1\\x45\\x15\\x37\\x84\\x1c\\xc1\\x78\\x00\\x21\\x81\\xa2\\x18\\x2a\\xf3\\x05\\xb1\\x2e\\x5f\\x7c\\x3b\\x1d\\x56\\xb2\\x2c\\xf4\\x6a\\xe6\\x27\\x6d\\x18\\x26\\xec\\x0a\\x8c\\x9a\\x7d\\x9f\\x68\\x08\\x3b\\x72\\x25\\xbb\\xfa\\xef\\xce\\x82\\xb3\\xb6\\x45\\x94\\x05\\x2a\\x77\\x00\\xf3\\x09\\x23\\x3a\\x79\\xff\\xfd\\xfc\\xcc\\x5c\\x21\\x40\\x0c\\x91\\xcc\\x0e\\x41\\x8d\\x51\\x41\\xd4\\x86\\xb5\\x21\\x99\\x01\\xd6\\xdd\\x24\\x47\\xc1\\xf7\\xb7\\xcf\\x5a\\x08\\x79\\xe7\\x0e\\x1d\\xd6\\x58\\xd0\\xf2\\xec\\xf3\\x1e\\xbe\\xee\\x11\\xa5\\xc7\\x44\\x40\\xc6\\x3b\\x9d\\x8b\\x45\\x31\\x8c\\x34\\x65\\xd7\\xff\\x03\\x36\\x5e\\xdd\\x03\\x85\\xed\\xf8\\x0d\\x4f\\xde\\xd5\\x1f\\x0f\\x75\\x33\\xee\\x40\\x99\\xf1\\x9e\\x93\\xbc\\x9d\\x08\\xda\\xdc\\xd1\\x34\\x85\\xdb\\x23\\x95\\x22\\xff\\xc8\\x1e\\x2c\\x05\\x1f\\x87\\x96\\xd6\\x2e\\x97\\x9f\\xcf\"},\n{{0xfe,0xdd,0x63,0xff,0xd4,0xcf,0xbf,0x61,0x88,0x94,0x96,0x2e,0x12,0x1a,0x90,0x25,0xee,0xa3,0x18,0xa8,0x0a,0x1a,0xdf,0x16,0x9d,0x64,0x90,0x44,0x5d,0x2e,0x02,0xa0,},{0x54,0x2f,0x22,0x44,0xbd,0xb7,0xd8,0x4b,0x87,0xe6,0x28,0xa8,0xe6,0xa1,0x2f,0x17,0xbf,0x74,0xa9,0xa6,0xd0,0xea,0x46,0xc5,0x95,0xdb,0xfd,0xc6,0x80,0xc0,0x4b,0x26,},{0xed,0x59,0xd9,0xe2,0x3d,0xec,0x34,0x94,0xb0,0xfb,0xc5,0xd1,0x0c,0xd0,0x2b,0xab,0x86,0xb3,0xeb,0x35,0xab,0xbf,0x9e,0x4d,0x4a,0x92,0x64,0x79,0xf1,0x34,0x58,0x3a,0x44,0xce,0x72,0xdc,0x41,0x22,0xac,0xa3,0x77,0xa4,0x07,0x2b,0x71,0x56,0x46,0x2b,0x74,0xe8,0xdf,0x46,0xb6,0x86,0x69,0x86,0x36,0x83,0x6e,0xf2,0x03,0x17,0x9c,0x07,},\"\\x2e\\x2a\\xe5\\x84\\x64\\x1b\\xe0\\x3d\\xd4\\x8f\\x9c\\x61\\x80\\x77\\xae\\xaa\\x18\\x21\\x2a\\x42\\x41\\xf0\\xc0\\x19\\x4e\\xd2\\x3e\\x37\\x0d\\x74\\x1a\\x3a\\xe1\\x1a\\x5f\\xec\\x3b\\x04\\x0c\\x16\\xea\\xfa\\x4a\\xc8\\xd1\\x8a\\xba\\xa7\\xce\\x8f\\x28\\x69\\x67\\x33\\x71\\x89\\xf0\\x49\\x5f\\xfd\\xd6\\x19\\x95\\xcd\\xe3\\x1d\\xd8\\xdf\\xc3\\xdf\\x57\\x00\\xb5\\x7a\\x7a\\x29\\x98\\x0e\\x9c\\x82\\x3f\\xee\\x85\\xd6\\x14\\x51\\x17\\x67\\x29\\xe7\\x27\\x87\\xc6\\x10\\x9b\\x47\\x35\\x9b\\x93\\xdf\\xd6\\x2e\\x1e\\x5a\\x2d\\x64\\x2c\\x05\\x72\\x42\\xda\\xe5\\x00\\xa9\\x4c\\xa1\\xa9\\x3b\\xc5\\x7b\\xe1\\xad\\xe7\\x6f\\xe4\\x50\\x1c\\x0f\\x63\\x77\\xed\\x0e\\x92\\x46\\x17\\x9a\\xec\\xdd\\x99\\x46\\xb6\\x71\\xe8\\x19\\x0e\\x1e\\xd2\\x3f\\x96\\x6e\\x96\\x40\\x9b\\x94\\x82\\x22\\xd8\\xea\\x58\\x39\\xde\\x90\\x4f\\xc5\\x13\\x48\\x07\\x3b\\x8f\\x40\\xed\\xbd\\x9b\\x4a\\x4b\\x22\\x75\"},\n{{0x38,0xf2,0x18,0x4e,0xaa,0x55,0x36,0x56,0xee,0x29,0x02,0x70,0x6b,0xce,0xc4,0xac,0xb5,0xaf,0x25,0x15,0x7c,0xa0,0xf6,0xa2,0xd4,0x8d,0xe8,0x52,0x85,0xfa,0x3b,0xc0,},{0x7f,0xf0,0x3f,0xb4,0xc8,0x2e,0x9c,0x15,0xd6,0x59,0xdf,0x42,0x4b,0x3e,0x73,0xed,0x1d,0x78,0x00,0x6f,0x3e,0x0b,0x79,0xeb,0x64,0xd9,0x8c,0x13,0xae,0xc6,0xba,0x37,},{0x4a,0x64,0x13,0xc2,0xc8,0x7f,0x2b,0x38,0x56,0xa8,0xde,0xcb,0xce,0x49,0x3a,0xde,0xae,0x0c,0x69,0xc9,0x41,0x34,0x70,0x7f,0xb0,0xf1,0x8f,0x30,0x49,0xfd,0x3e,0x3d,0x05,0x1a,0xbd,0xb9,0xd4,0xbe,0xe2,0x53,0xc6,0x10,0x7c,0x02,0xd5,0x7a,0xd7,0xcc,0x9f,0x31,0x01,0xdb,0x66,0x0a,0xfa,0xc2,0xb7,0x98,0x19,0x38,0xe9,0x56,0x4f,0x01,},\"\\xc2\\xdf\\x77\\xc9\\xe4\\x79\\xf6\\x19\\x83\\xb6\\xc7\\x48\\x3e\\xf9\\x3f\\xb8\\x5a\\x10\\x3b\\x21\\x39\\x23\\x92\\x65\\x23\\x06\\x5e\\xbf\\xf2\\x25\\x7e\\x85\\x42\\x7e\\x05\\xcd\\xc2\\x75\\x82\\xef\\x6c\\x16\\xbe\\x35\\x3a\\x3b\\x25\\x03\\x72\\xd6\\x37\\x0e\\xec\\xb6\\xc8\\x96\\x29\\x17\\xeb\\x65\\x6f\\x26\\x41\\x69\\x01\\x89\\xd1\\x72\\xa1\\x11\\x05\\x15\\x57\\xab\\xc2\\x49\\x4e\\x32\\xca\\xb6\\x5e\\xd0\\x63\\x3a\\xff\\xe9\\x24\\x08\\xb5\\x5c\\x4e\\xd8\\xaf\\x65\\xe2\\xc5\\xe7\\xaa\\xb8\\x87\\xa3\\xcc\\x8d\\x28\\xc5\\x2e\\x9e\\x13\\x36\\xd0\\xb7\\xbb\\x3f\\xe2\\xcd\\x84\\x3e\\x7f\\xa1\\x68\\x03\\x42\\xf8\\xa4\\xaa\\xfa\\x02\\xc4\\xab\\x25\\x2f\\x08\\xc3\\xd4\\x6d\\x5f\\x00\\xfd\\x01\\x48\\x42\\x63\\xee\\x63\\x52\\x84\\xf6\\xdb\\x26\\xd6\\x29\\x8d\\xe5\\xb0\\xdd\\x23\\x8d\\xa4\\x0a\\x8d\\x2a\\x93\\x37\\x6d\\xa0\\x30\\x27\\x83\\xa0\\xe3\\xbe\\x23\\xd9\\xe7\\xf9\\x90\\xd2\\x5b\"},\n{{0x8b,0xfc,0xa4,0x84,0x62,0xd2,0x53,0x6f,0x74,0xb8,0x4f,0x6a,0xf5,0x9f,0x5d,0x85,0x82,0xff,0x8f,0x7e,0xc2,0x87,0x45,0xd6,0x72,0xe7,0x2e,0xb7,0x2e,0x79,0xd3,0xe9,},{0x9d,0x10,0xd2,0x75,0xc3,0xd3,0xfe,0x45,0x9f,0x7f,0xe2,0x90,0x1b,0xce,0x38,0x91,0x91,0xcc,0x84,0x83,0xc0,0xf5,0x11,0x40,0xd9,0xc6,0x2b,0x08,0xfa,0xde,0x81,0xbb,},{0x44,0xd7,0x7e,0x43,0x9e,0xf6,0xca,0x5e,0xb9,0x40,0xc6,0x0f,0xf8,0x73,0x2d,0xdc,0x16,0x26,0x9e,0xa0,0x23,0xbb,0x26,0x13,0xbd,0x44,0x7e,0xba,0x7f,0xd6,0x98,0x51,0x22,0x6c,0x48,0x19,0xce,0x8d,0x44,0x98,0x5a,0x49,0xf3,0xf4,0x1a,0xc7,0xaf,0x33,0xc4,0x7f,0xfe,0x5f,0x89,0x30,0x4a,0x32,0x56,0xe4,0x45,0xf8,0xd6,0x86,0xe3,0x07,},\"\\x81\\xee\\x4c\\xb9\\xc4\\x5d\\xa6\\x91\\xda\\xcd\\x7d\\xd0\\x9a\\xff\\x59\\x73\\x72\\x67\\xbb\\x55\\xc3\\xad\\xe1\\xba\\x32\\xc1\\x7b\\x7d\\x0d\\x2d\\x0c\\x60\\x79\\xc3\\x9d\\x5f\\xd5\\xb2\\x9b\\xa5\\xf9\\xc1\\x76\\x20\\x97\\x70\\x98\\x43\\xee\\xe5\\x61\\x2b\\xd2\\x0b\\xc8\\x18\\x5b\\xf6\\x4d\\x5c\\x93\\x41\\x84\\xe1\\x36\\x24\\xe6\\xf8\\x77\\xa2\\xa5\\xdd\\xa1\\x5c\\x0d\\xf6\\x2a\\xfb\\xb9\\x70\\x57\\xcc\\x91\\xca\\xc9\\xa1\\x84\\x06\\xa0\\xe0\\x10\\x9c\\xc3\\x9b\\x2e\\x3f\\x81\\x2e\\x22\\x7a\\x40\\x62\\xd5\\xef\\x81\\xc9\\x2c\\x22\\xa7\\xdc\\x79\\x7c\\x84\\x5d\\x71\\xeb\\x6e\\xa9\\xe4\\x2e\\xc8\\x41\\x7f\\xba\\x90\\xa9\\x6d\\x2b\\xb1\\x43\\x94\\x18\\x33\\x0b\\x4b\\xb2\\xf9\\x9c\\x6d\\x63\\xd3\\x04\\xa0\\xe5\\x06\\xdc\\xa9\\x65\\x3e\\x5d\\xe0\\xdd\\x56\\xe3\\x09\\xdb\\x1a\\x76\\xa0\\xfa\\xab\\xab\\x16\\x37\\x74\\xf0\\x00\\x08\\x8c\\xef\\x3d\\x1b\\x7a\\x6c\\xf6\\x61\\xd2\\xe1\\xd9\"},\n{{0xd7,0x48,0x0d,0x42,0x72,0xbc,0xb1,0x55,0x7b,0x1b,0xbe,0xe0,0x49,0x15,0xc1,0x26,0xa5,0x2c,0xa6,0xd6,0xa8,0xbb,0x53,0x14,0xa0,0xe1,0xa5,0x2b,0x59,0xbf,0xc9,0x9c,},{0x99,0xc8,0x39,0xd3,0x6d,0x8f,0x5b,0x86,0x52,0x61,0x8e,0xd7,0xb0,0xfe,0x9e,0xc3,0xd9,0x4e,0xff,0xf4,0xc4,0x53,0xc5,0x40,0x63,0x14,0x76,0xa5,0x97,0x9b,0xbb,0xe0,},{0xe0,0x4d,0xc8,0x44,0x2d,0x35,0x21,0x73,0xe9,0x31,0x81,0x8e,0x29,0x08,0x58,0xde,0x85,0x68,0x8a,0x46,0x49,0xea,0x3e,0x3c,0x3a,0xe7,0x4e,0xda,0xa5,0x4a,0xd0,0x1b,0x64,0x62,0x2a,0xd8,0xa0,0x90,0xb6,0xad,0x60,0xad,0xfd,0x01,0x88,0x18,0x82,0x82,0x8d,0x39,0x07,0x8b,0xb5,0xb2,0x71,0x4f,0xd3,0xea,0x83,0x97,0xa3,0x42,0xfd,0x04,},\"\\x61\\x5c\\xc1\\x9f\\x94\\x20\\x17\\x36\\x5b\\xa8\\xbf\\xa2\\x56\\xce\\xcc\\xc8\\x5e\\xe2\\x89\\xa1\\xc3\\x4b\\xb1\\x44\\x2a\\xcc\\x07\\x16\\xc7\\xfc\\x2c\\xae\\xb7\\x6a\\x9d\\xe1\\x9a\\xde\\xc1\\x06\\x37\\x1e\\x47\\xa3\\x0d\\x2e\\x12\\x39\\xce\\x1f\\x7d\\xca\\x25\\x52\\x6d\\x60\\x4b\\xdd\\x64\\x76\\x59\\xd9\\x42\\xbc\\xba\\xc3\\x68\\x91\\x13\\x49\\xc3\\xb9\\x46\\xa9\\x7d\\xa1\\x0a\\x42\\xdb\\xcf\\x3c\\x73\\x41\\x6d\\x2e\\x6b\\xa2\\x2b\\xd2\\x9d\\x9f\\x70\\x56\\x72\\xe9\\xe3\\x38\\x94\\x4c\\xef\\x01\\xad\\x21\\xf0\\x09\\x74\\x2e\\x07\\xbc\\xd8\\x88\\xca\\x31\\xe1\\xee\\x95\\x3e\\x8c\\x1b\\x1f\\xd9\\x54\\xb7\\xdc\\xf1\\xa0\\xb1\\xd5\\xa0\\x69\\x06\\x5a\\x66\\xcb\\x72\\x1a\\xdc\\x02\\x0f\\x4e\\xfe\\x1a\\xbd\\xd1\\x67\\x42\\x74\\x69\\x39\\x28\\x57\\x80\\xd7\\x53\\x13\\x7a\\xe0\\x14\\x0b\\xb4\\x10\\xfb\\x6c\\xe3\\x36\\x76\\xc2\\x7a\\xee\\xc5\\x93\\xa8\\x8c\\xbc\\x73\\xaf\\xd9\\xf4\\x05\\x11\"},\n{{0x3c,0x2d,0x36,0x50,0x73,0x5b,0x41,0xef,0x90,0x06,0xbb,0x45,0xe4,0xbe,0x2e,0x0a,0xa5,0xcd,0xe8,0x51,0xae,0xac,0x42,0x1e,0xe9,0xc1,0xb4,0x92,0xd8,0x7a,0xa1,0x8a,},{0x3e,0x46,0xdd,0xce,0x29,0x88,0x44,0xfc,0xaf,0xa0,0x0a,0x1b,0x47,0xea,0xf3,0xde,0x70,0x59,0x6d,0xf1,0xbb,0xee,0x3c,0x80,0x9d,0x1b,0xe7,0xdd,0x94,0x08,0x0e,0x34,},{0x3f,0x2a,0xf0,0x1a,0xd5,0x37,0x7a,0xc3,0x90,0x40,0xd4,0x1a,0x41,0xe3,0x6e,0x7b,0x93,0xfa,0x72,0x35,0xb8,0x41,0x79,0x1f,0x43,0x2e,0xcd,0x7f,0x91,0xa3,0xb2,0x1a,0xb7,0x19,0x6c,0x88,0x3a,0xd5,0xa7,0xdb,0x44,0x6f,0x6c,0x06,0x67,0x24,0x60,0xf3,0xf6,0x3e,0xf8,0x63,0xd9,0x43,0x2b,0xe9,0xca,0xea,0xbb,0x79,0xe8,0x7e,0x22,0x08,},\"\\x14\\x25\\xd8\\xd2\\x18\\xda\\x1a\\x10\\xa8\\x0b\\x6a\\x9c\\x3c\\x27\\x50\\xef\\xe4\\x16\\x57\\x98\\x4a\\xbd\\x51\\x00\\xf4\\x51\\xba\\x94\\x9d\\xb0\\x10\\x46\\xb7\\x12\\x6b\\xe8\\x40\\x23\\x34\\xed\\x57\\x52\\x8b\\xac\\x05\\x62\\x25\\x53\\xa8\\x6b\\x72\\x67\\x22\\x69\\x5a\\x8f\\xb3\\x31\\xd8\\x56\\x54\\x17\\xc4\\xff\\x0f\\x25\\x1a\\x32\\x0a\\xd0\\x6d\\xed\\xbb\\x75\\x0d\\xef\\x35\\xd5\\x21\\xc3\\xc4\\xcd\\x57\\x1a\\x45\\xad\\xa8\\x45\\x06\\x53\\xd5\\xe8\\x1f\\xe0\\xbe\\xb5\\x3a\\xaa\\xe7\\x87\\xb3\\xeb\\x65\\x3c\\x23\\x81\\xed\\x55\\xaa\\xf2\\x59\\x0e\\xe5\\xed\\x8b\\x66\\x26\\xf1\\xc4\\xb0\\x43\\x0a\\x54\\xf3\\x96\\x58\\x62\\x4e\\x66\\x35\\xfe\\xfc\\x98\\xfe\\xe8\\xfc\\x3e\\x1c\\xc7\\xff\\x3d\\xd4\\x20\\xde\\x9d\\xa1\\x1a\\x62\\xfc\\xae\\x0e\\x0c\\xb4\\x54\\xfc\\x6f\\x7d\\xf0\\x39\\x54\\x29\\x1d\\x26\\x20\\x2f\\x1b\\x18\\x8b\\x65\\x7b\\x3b\\xae\\x07\\x38\\x94\\x49\\xb7\\x5e\\x67\\x42\\x2f\"},\n{{0x74,0x96,0x59,0x96,0x26,0x8c,0xdc,0x4c,0x09,0x22,0x0b,0xd3,0x1c,0xe0,0x7b,0x21,0x7a,0x03,0x82,0x6e,0xe9,0x81,0xfa,0x89,0xf3,0xa2,0x35,0x9c,0xed,0x09,0x5e,0xf1,},{0x40,0x96,0xd0,0x27,0xc1,0xc5,0xee,0x4c,0xbf,0xc0,0x4b,0x9d,0x53,0x41,0x74,0x02,0x9f,0xdb,0x50,0xcf,0x56,0x10,0xd3,0x02,0x1e,0xf9,0x33,0xb4,0xca,0xf3,0x39,0x85,},{0x8c,0x66,0x28,0x34,0x43,0x17,0xa6,0x3a,0xca,0x6f,0x78,0xcf,0xae,0xa9,0x65,0xb3,0xaa,0x55,0x22,0xce,0x91,0x41,0x95,0x14,0x1c,0x08,0x87,0x0a,0x1b,0x8d,0xac,0xf3,0x4b,0x79,0xc7,0xab,0xc6,0x93,0xcd,0x9e,0x5e,0xbe,0x1a,0x2e,0x86,0xf0,0x33,0x2d,0x20,0x48,0xdb,0x3c,0xbd,0xef,0x01,0x68,0x79,0x62,0xd6,0xdf,0x24,0x9e,0x38,0x00,},\"\\x45\\xb2\\xf0\\x64\\x61\\x5b\\xf7\\x74\\xfc\\xe9\\x7f\\x51\\xc4\\x64\\x68\\x5d\\x7b\\x3e\\x4f\\xef\\xff\\x92\\x31\\x24\\x0a\\x71\\x9b\\x3b\\x06\\x21\\xcd\\x4a\\xd8\\x33\\x05\\x67\\x5c\\xd6\\xea\\xae\\xbf\\xf7\\x91\\x00\\x0b\\x0b\\x1f\\xa3\\x1d\\x82\\xd8\\x18\\x1b\\x7f\\xe5\\x7c\\x5e\\x00\\xce\\xc5\\x6f\\xf9\\x02\\x2e\\x9c\\xe8\\xdb\\x66\\x35\\x6e\\x40\\x8e\\x3e\\xe2\\x62\\xfe\\x62\\x77\\x89\\xe6\\x55\\x35\\xef\\x1a\\x63\\xe8\\xfe\\xc9\\x33\\xbe\\x3d\\xee\\x34\\xd2\\xfa\\xcd\\xb8\\x92\\x8c\\xc4\\x56\\xab\\xf2\\xf3\\xe8\\xca\\xb4\\x7e\\xff\\x1c\\xa4\\x2e\\x8b\\x0e\\x48\\xd2\\xc7\\x3e\\x7b\\xcc\\x5d\\xe3\\xf1\\x05\\x6f\\xc5\\x23\\xdf\\xef\\x6b\\x00\\x23\\xf3\\x28\\x89\\xed\\x39\\x4e\\xed\\xa0\\x32\\xab\\xf6\\xbc\\xaa\\xda\\xa7\\xf3\\xee\\x74\\x11\\x87\\x60\\xab\\x6d\\x91\\xdf\\x52\\x8b\\xdc\\x58\\x07\\x97\\x2c\\x85\\xfa\\x7c\\xb5\\x6e\\x38\\x7d\\x73\\x32\\xe7\\x79\\xe5\\x2d\\x0d\\xd7\\xdb\\x0c\\xfb\"},\n{{0x0a,0xbf,0x06,0x9c,0x08,0xb2,0x69,0x1c,0x3a,0x26,0xf7,0x9d,0xc8,0xed,0x05,0xcb,0x71,0xd2,0x20,0xff,0x78,0xf3,0xa5,0xc5,0x78,0x0a,0xe9,0xda,0x18,0xe4,0x56,0x43,},{0x9e,0xf3,0xb5,0xcc,0x01,0x6c,0xc8,0x2d,0xbd,0xda,0x70,0x57,0x66,0xaa,0x44,0x8b,0xd6,0x1f,0xa1,0xaa,0xf1,0x17,0x0e,0xfe,0x91,0x49,0xda,0xa9,0xfe,0x64,0xa1,0xae,},{0xc7,0x56,0x6f,0xb3,0xb4,0xd8,0xde,0xf6,0x67,0xe0,0x40,0xf2,0x76,0xd3,0xed,0x98,0xd3,0x6d,0xff,0x46,0x01,0x26,0xa7,0x5b,0x4c,0xc2,0x10,0x03,0x86,0xbb,0x01,0xc6,0x42,0xf6,0xd8,0xde,0x7e,0x64,0x9b,0xe6,0xe0,0x81,0x8b,0x08,0xd7,0x7c,0xe6,0x0f,0x4e,0xe5,0xe7,0x71,0x7a,0x50,0x88,0x4b,0xde,0xe0,0x20,0x34,0xec,0xf1,0xcd,0x0c,},\"\\x0d\\x05\\x52\\x91\\xb2\\xe8\\x61\\xea\\xe1\\x9e\\xa0\\xfb\\x20\\x69\\xd8\\xc9\\xee\\xf4\\xf1\\x34\\x7f\\x35\\x76\\xd7\\x84\\x11\\xae\\x7c\\x0b\\x1c\\x1c\\xaf\\x31\\xfd\\xe7\\x36\\xdc\\x8a\\xcc\\xac\\xb6\\x62\\xdf\\x76\\xb6\\x20\\xb6\\x2c\\xe9\\x0b\\x9f\\x92\\xc8\\x33\\x09\\x12\\x86\\x21\\xd0\\x57\\xcf\\x84\\x58\\x05\\x94\\x90\\x88\\xe9\\x38\\xdd\\xbc\\x3d\\x41\\xc5\\xe5\\x54\\x1f\\xec\\x82\\x98\\x68\\x7a\\xd2\\xf7\\x9a\\xcd\\xa0\\x1a\\xa2\\x15\\xd2\\x58\\x21\\x43\\x6e\\xac\\x9d\\x26\\x87\\x16\\xd4\\xcd\\x60\\x50\\x26\\x0c\\xb4\\xef\\x6a\\xad\\xa4\\x83\\x5e\\x07\\x3a\\x84\\x58\\x21\\xff\\x21\\x1a\\xe2\\xba\\xad\\xce\\xb6\\xe5\\x7f\\x06\\xf8\\x83\\x45\\xed\\xbf\\x93\\xbf\\xdf\\x54\\xfb\\x74\\x12\\x3b\\x57\\xc0\\xfb\\x4a\\x79\\x60\\x8d\\x8d\\xb6\\x74\\x08\\x89\\xe1\\x57\\x33\\x50\\x77\\x99\\xf7\\xa1\\xfd\\x30\\x17\\xbc\\xd7\\x7b\\x28\\xa2\\xbb\\x6c\\x91\\xec\\xd1\\x54\\xe9\\xc5\\xa5\\xff\\xa0\\xeb\\x62\"},\n{{0xf3,0xfd,0x5e,0xc5,0xe2,0x30,0xb6,0xda,0xd1,0xac,0x3d,0x3a,0xeb,0xad,0xc7,0x86,0x3f,0xf8,0x9d,0xe2,0xa1,0x31,0x7f,0x42,0x4d,0x15,0x98,0x9a,0x3e,0xfb,0x0a,0xfd,},{0xf9,0x9e,0x5d,0x5e,0xee,0xae,0xd1,0x20,0x5c,0xfb,0x5c,0x2c,0xc4,0xe5,0xe9,0xf6,0xb4,0xe7,0xf6,0x41,0x29,0xf8,0x60,0x10,0x4c,0xa6,0x24,0x4e,0xb9,0xfe,0xb5,0x64,},{0x44,0xb0,0x12,0x46,0x63,0xad,0xb0,0xc7,0x3a,0xed,0x49,0xf7,0x34,0x03,0x46,0x1f,0xcb,0x19,0x11,0x1b,0x0b,0xa1,0x7a,0xa9,0x96,0x56,0x6f,0x47,0x7e,0x37,0xd5,0x24,0xb0,0xe1,0xf1,0x07,0x61,0x2f,0xc5,0x2a,0x7c,0x76,0x7b,0x18,0x1f,0xbf,0x4d,0x62,0x9b,0xdd,0xc0,0x8f,0x30,0x58,0x4d,0xec,0x61,0x24,0xc5,0xd3,0x9d,0x42,0x31,0x02,},\"\\x71\\xf2\\x89\\x73\\xed\\x3d\\xf0\\x59\\x45\\xfa\\x0b\\xdb\\x23\\xe9\\xbe\\xca\\x65\\x1d\\x3e\\xe6\\xbf\\x9f\\xa4\\x5f\\xfd\\xc6\\x06\\x1e\\x42\\xfa\\x2e\\x8d\\x76\\x23\\x5f\\x0e\\x9e\\x2d\\xaa\\x65\\xe5\\x26\\x31\\xfc\\x3b\\xea\\xd3\\x3d\\xa0\\x55\\xbb\\x49\\x2e\\x47\\x58\\xe5\\x98\\xa0\\x30\\xa3\\x3b\\x3c\\x40\\xb3\\x43\\x71\\x45\\x9b\\x23\\x3c\\xcc\\x04\\x3c\\xcc\\xc3\\xa3\\xcb\\xce\\x54\\x9e\\x20\\xe0\\xb2\\xb4\\x33\\x05\\xb6\\x4a\\xec\\x66\\x1a\\xad\\xba\\x65\\x56\\xb1\\x7d\\x76\\xe3\\xbb\\xed\\x62\\xc4\\xa4\\xea\\xc4\\xf8\\x86\\x03\\x99\\x67\\x52\\xd2\\x36\\x3c\\x8d\\x4a\\x27\\x89\\xd1\\x28\\xf6\\xe9\\x59\\x94\\x5c\\x68\\xc3\\x01\\x46\\xd1\\x94\\xcc\\xb6\\x83\\x9e\\xc6\\x53\\x44\\x60\\x16\\x52\\xc1\\x8b\\x00\\x74\\xe2\\xbc\\x76\\x68\\x31\\x16\\x97\\xd9\\x60\\xc7\\x06\\x65\\x97\\x92\\x4d\\x70\\x4d\\x02\\xa0\\x19\\x3f\\xaf\\xbf\\xdf\\x57\\x1e\\xe0\\xdf\\xe4\\x14\\xdc\\x2f\\x52\\x89\\x69\\x12\\xbc\\x32\"},\n{{0x73,0x8f,0x13,0x10,0xa4,0xe0,0x8f,0x91,0x7a,0x0a,0x5c,0x1f,0xba,0xf4,0xef,0x72,0xf9,0x5e,0xe6,0x2f,0xcd,0xed,0x50,0x86,0x8a,0x3d,0xaf,0x98,0x85,0x6a,0x44,0x8d,},{0x42,0x27,0x2c,0x2c,0x8b,0x08,0x47,0x0e,0xe5,0xdd,0x8a,0xf8,0x84,0x9c,0x01,0xb7,0x50,0x8d,0x3a,0x3c,0x65,0xb0,0x33,0x0e,0x69,0x5c,0x84,0x1d,0x5d,0xcc,0xb2,0xf5,},{0xce,0x1e,0x35,0x77,0xb6,0xa2,0x10,0x16,0xb9,0xdd,0x0b,0x51,0x7b,0xaa,0x0c,0xcb,0x10,0x7b,0xc1,0x99,0xb8,0xbb,0xae,0xf6,0x8f,0x95,0x0c,0x8e,0xd5,0x80,0x13,0xc8,0x53,0xb4,0xd3,0x38,0xee,0xdc,0x67,0x50,0x79,0xab,0x13,0x90,0x46,0x2f,0xfe,0xfa,0x6a,0x95,0x9b,0x04,0x3f,0x8b,0x56,0x51,0xc6,0xca,0x37,0x5c,0xe0,0xb4,0xa4,0x03,},\"\\xf0\\xe7\\xef\\x67\\x82\\xd0\\x4c\\x69\\x43\\xb1\\x9e\\xb6\\x6f\\xf6\\x22\\x6b\\x73\\x6e\\x3b\\x09\\x40\\xc0\\x9b\\xb1\\x26\\xbf\\xc4\\xc4\\xca\\x7a\\x5e\\x70\\x16\\xc2\\x86\\xb7\\xbf\\xd7\\x3a\\xa6\\xa7\\x9a\\x96\\x03\\x1b\\xc8\\x1c\\xb5\\xda\\x68\\xce\\xc7\\x1a\\x6a\\x0d\\x39\\x78\\x0c\\xbe\\x6a\\x0c\\xd4\\x77\\x4d\\x3a\\xa0\\x6a\\x88\\x16\\x10\\x44\\x4a\\x8c\\x9d\\x19\\x10\\x22\\x94\\xe5\\xf6\\x35\\x18\\x7a\\xa6\\xf4\\x8d\\x11\\x91\\x2c\\x70\\x94\\xb3\\x88\\x33\\x02\\x8d\\x57\\x0c\\xb1\\x10\\xdb\\x60\\x62\\x5b\\xb1\\xbd\\xc3\\x7a\\xff\\xa2\\x5e\\xa3\\xc8\\xf8\\xdb\\xfc\\x25\\x14\\xf4\\x36\\x5c\\x62\\xb2\\x98\\x9a\\x66\\xd2\\x7c\\x80\\x38\\x4e\\x74\\xae\\x5f\\xba\\x8c\\x1c\\x2a\\xf9\\xc7\\x2c\\x49\\x71\\xe6\\x4f\\xa6\\xa1\\xdc\\x25\\x17\\xb3\\x1e\\xa5\\x7c\\xcb\\x08\\x15\\xa7\\xfe\\x2d\\xa0\\xf1\\x46\\xca\\xa0\\x84\\x31\\xd2\\x5d\\x15\\x16\\x62\\xd9\\xd2\\x6e\\x95\\x22\\x9d\\x0c\\x62\\x82\\x36\\x64\\x12\\x3c\"},\n{{0x88,0x41,0xd2,0x2a,0xde,0xd6,0x9c,0x13,0x1e,0xf5,0xee,0x0a,0x10,0xab,0x0a,0x9b,0x77,0xcb,0x75,0x4e,0xde,0x8d,0x25,0x7a,0x53,0x72,0x72,0x6e,0x2b,0x49,0x9c,0x6e,},{0x71,0x5e,0xcc,0xa6,0x36,0x81,0xbc,0x6e,0x9e,0x31,0xd1,0x88,0x48,0x90,0x2f,0x4d,0x96,0xfe,0xaf,0x43,0xb9,0x5d,0x00,0x86,0x42,0x90,0x3b,0x17,0x63,0xbc,0x9f,0xb8,},{0xbb,0x2b,0xab,0x70,0x03,0xf1,0x31,0x1b,0xe9,0xb8,0xc8,0x83,0xfc,0x4f,0xd5,0x28,0xad,0xfd,0x51,0xa9,0xc9,0x9d,0xb3,0xdc,0xa8,0xda,0x0f,0xca,0x95,0x8d,0xa1,0x9a,0x10,0xeb,0x22,0x33,0x26,0x67,0xb1,0xa0,0x06,0x5d,0x3d,0xbc,0x0d,0x06,0x26,0x9a,0x12,0x59,0xb6,0xa8,0x90,0x48,0x4a,0xa2,0x14,0x3a,0x52,0x69,0x5f,0x14,0x5b,0x0a,},\"\\x08\\x7c\\xa6\\xbe\\x2a\\x95\\x0c\\x02\\x4b\\x3e\\x74\\x67\\xfe\\x00\\xa7\\xd3\\x64\\x55\\x5d\\x5d\\xc6\\x77\\x0f\\x5e\\xbd\\x26\\x06\\x42\\x52\\x5b\\xd3\\xc0\\xf9\\x65\\xdb\\x36\\xd7\\xb2\\x29\\xa5\\x74\\x21\\xee\\xc6\\x4e\\x4d\\x99\\x1c\\xdd\\xe5\\x91\\x23\\x03\\x44\\x70\\x55\\x3f\\x4e\\xb0\\xbe\\x81\\xad\\x29\\x36\\xc8\\xca\\x26\\xbc\\xab\\x4e\\x5d\\x79\\x04\\x0e\\x29\\x79\\x87\\x28\\x60\\x16\\x84\\xa4\\x68\\x32\\x3c\\xf3\\xba\\xae\\x4d\\x94\\x8d\\x0a\\x1f\\xd9\\x05\\xef\\xfe\\x16\\xdc\\x44\\x64\\x20\\x88\\xdf\\x53\\xf6\\x38\\x8b\\xc4\\x80\\xed\\xf4\\xaa\\x20\\x7d\\x0e\\xd1\\x61\\xed\\xa3\\x45\\x71\\x2b\\x4c\\x00\\xcb\\x05\\xfc\\xf6\\x35\\xec\\x25\\x88\\x78\\x5b\\xfb\\x8a\\x27\\xcd\\xc2\\x89\\x96\\xa1\\xdb\\x3e\\x67\\x87\\x02\\x33\\x93\\xc0\\x75\\xd8\\x3c\\x90\\x38\\xfe\\xd7\\x89\\x9c\\x55\\xfe\\xc3\\x07\\xde\\x32\\x49\\xc1\\x4b\\xda\\x49\\xe8\\xb8\\x95\\x86\\x09\\x42\\xc3\\x6d\\x64\\x0b\\xb8\\x93\\x77\\x91\\x42\"},\n{{0xc0,0x21,0x35,0xe7,0xb6,0x5a,0xac,0x72,0xf6,0x3c,0x32,0xbf,0x5b,0xef,0x5b,0x68,0xc7,0xf3,0xb8,0xed,0x56,0x20,0x8e,0x59,0xe4,0x75,0x20,0x70,0xe9,0xd0,0x70,0x95,},{0xdc,0xf6,0x00,0xf2,0x44,0x03,0x7a,0x75,0x20,0x3a,0xe1,0x1a,0xc3,0x16,0xe8,0xdb,0xe9,0x98,0x6f,0x0d,0xce,0x23,0x47,0x39,0x39,0x33,0x4b,0xf5,0xce,0xa4,0x8b,0x0d,},{0xdd,0x5c,0xba,0xe4,0x79,0xeb,0x5e,0x22,0x95,0x74,0xc2,0x1e,0xc3,0xbe,0xd9,0x11,0x11,0x3a,0x57,0xa1,0x91,0x6d,0x33,0x13,0x45,0x75,0x15,0xd5,0x5c,0xc5,0xb6,0xe6,0xeb,0xc5,0x2c,0x93,0xf8,0x21,0xd1,0x39,0x88,0xdb,0xba,0x8d,0xf5,0x09,0x6d,0x55,0xff,0x9c,0x39,0xe7,0xf9,0xd5,0x61,0xcb,0x58,0x93,0x0c,0x96,0xa7,0xa5,0xd6,0x0b,},\"\\x86\\xd9\\x49\\x13\\x50\\xd2\\x56\\x6e\\x70\\x8e\\xd3\\x56\\x18\\x5d\\x61\\x0c\\x73\\x46\\x5b\\x2a\\x5c\\x70\\x12\\x91\\x99\\x58\\xaf\\x2c\\xf7\\x6a\\xf9\\x95\\x23\\x0d\\x36\\x0d\\xe4\\x00\\xb7\\x13\\x71\\x70\\xdd\\x08\\x35\\xf1\\x0f\\xcb\\xec\\x22\\x4e\\xe4\\xe4\\x2c\\x7d\\x1c\\xeb\\xb7\\xf5\\x80\\xfe\\xa8\\xed\\x62\\x23\\x16\\x3b\\xac\\xdd\\x19\\x23\\xa5\\x72\\xcb\\xb6\\xdc\\x26\\xca\\x8b\\x17\\xad\\xe6\\x8c\\x6d\\x28\\x08\\xc4\\xca\\x1e\\xca\\x28\\xea\\xe9\\xa1\\x45\\xf6\\x8d\\x40\\x79\\xd8\\xd5\\x9d\\x14\\x0e\\x95\\x82\\x28\\xe7\\xe9\\x95\\x20\\xe3\\x42\\xdb\\xd7\\x45\\x7a\\x91\\x59\\x74\\x0f\\x48\\xbd\\xc2\\x7b\\x93\\xbd\\xab\\xeb\\xa4\\x65\\xcb\\xf0\\xc8\\xdf\\x5e\\xf2\\xc0\\xf9\\x38\\x6e\\xeb\\xe6\\x56\\xf5\\xd7\\x49\\xd5\\xf9\\x14\\x7f\\x52\\x52\\x66\\x91\\x0d\\x7b\\x80\\x39\\x6a\\x90\\xbe\\x5c\\xc1\\x88\\xa9\\xa9\\x45\\xf9\\x3e\\x75\\x3f\\xc9\\x9b\\xaf\\xa1\\x8e\\xe0\\xa6\\xdf\\xf7\\x9b\\xf8\\x48\\x48\\x98\\xef\"},\n{{0x15,0x4a,0x47,0xeb,0xa1,0xb8,0xc3,0x83,0x62,0xea,0x61,0xfa,0xeb,0x0c,0x0a,0xd7,0xe6,0x1e,0x41,0x2a,0x3c,0xba,0x46,0x88,0xaf,0x0d,0xb2,0xa4,0x87,0x20,0x8b,0x1c,},{0x16,0xde,0x2c,0x89,0x4a,0x50,0xcb,0xd4,0xca,0x90,0x41,0x9a,0x4c,0xa6,0x49,0x42,0xcb,0x14,0xbd,0x33,0x5c,0x5d,0x3f,0x4a,0x53,0xe2,0x39,0xc2,0x80,0xbd,0xa7,0x25,},{0xf4,0xb6,0xeb,0x1a,0x8d,0x95,0x0e,0x88,0x7f,0xd2,0xf3,0x0f,0x70,0xa2,0x3b,0x41,0x87,0x14,0x95,0xbf,0xa5,0xb8,0xa4,0xad,0x39,0x96,0xcd,0x9b,0xf5,0x1e,0xb7,0x42,0xe0,0x7f,0x4c,0x4d,0x2d,0xa4,0xb0,0x1a,0xb0,0x87,0x36,0x7a,0x50,0xe2,0xb6,0x5b,0x3c,0xef,0x51,0x4e,0x40,0xd8,0x37,0x54,0x0b,0x8c,0x89,0x96,0x64,0x85,0x91,0x0f,},\"\\xbf\\x60\\x7e\\x8b\\x6e\\x14\\xd9\\xc8\\xac\\xd9\\x68\\x15\\xaf\\x0c\\x03\\x5a\\xc7\\x3c\\x41\\x04\\xc9\\x37\\x86\\xcc\\xc1\\xc9\\xf8\\x59\\x39\\x5d\\xd7\\x81\\x90\\x03\\x20\\xeb\\xf3\\x56\\xaa\\x99\\x1c\\xdc\\x9f\\x50\\x3f\\xce\\xe9\\xf8\\x36\\x75\\x88\\x8a\\x7d\\x59\\x20\\x02\\xd2\\xa5\\x4a\\x57\\x3a\\x96\\x99\\x4b\\x3f\\xa8\\x65\\x53\\x8c\\x61\\x7e\\xd8\\xad\\x1f\\xf6\\x20\\x18\\x28\\x8a\\x67\\x4f\\x44\\x9b\\xe0\\xaa\\xb5\\x22\\x2f\\x74\\xc4\\xfd\\x47\\x5e\\xd6\\xa8\\xdf\\xb2\\x7f\\x45\\x28\\x7b\\x22\\xb2\\xb6\\xc3\\xbd\\x15\\x17\\x9f\\x26\\x7d\\x15\\x7d\\x7d\\x8a\\x41\\x59\\x67\\x9b\\xe8\\x5b\\x25\\xc2\\xbb\\x2b\\xa8\\x50\\xaa\\xed\\x9a\\xe3\\xae\\x57\\x1b\\xe4\\xf7\\x58\\x36\\x32\\x9c\\xf3\\x6f\\x41\\x2c\\x1c\\x80\\xf1\\x41\\x3b\\x76\\x61\\xea\\xb4\\xa8\\xe1\\x1b\\x60\\x24\\x24\\x4f\\xc6\\x23\\x23\\xff\\x02\\xe3\\x8a\\xce\\xb1\\x73\\x7b\\xd4\\x74\\xbf\\x1e\\x98\\x01\\x5d\\xbc\\x78\\x8b\\x02\\x7b\\xbe\\x21\\x7c\\xf4\\xe7\"},\n{{0xd3,0x02,0x84,0x31,0xce,0x2e,0xef,0x73,0xbd,0x94,0x0a,0xb8,0x4c,0xa2,0x9f,0x13,0xfb,0x26,0x43,0x6a,0xa2,0x5e,0x1b,0x7b,0xf2,0x6c,0xb3,0x3f,0x17,0xfd,0xf8,0x17,},{0x63,0xdf,0x20,0x3e,0x28,0x60,0xba,0xc4,0xd3,0x52,0xe7,0x22,0xc1,0xc9,0x1f,0xe3,0x77,0x6e,0x1c,0xbc,0xae,0x85,0x53,0xa4,0xf1,0x98,0x90,0x26,0x0b,0xf0,0xe4,0x57,},{0xce,0x97,0x29,0xa9,0x6c,0x3e,0xd2,0x89,0x43,0xb2,0x78,0x39,0xc7,0x33,0x82,0xec,0xd5,0x72,0x96,0x0c,0x1f,0x9e,0x90,0xc5,0xef,0xf9,0xdd,0x49,0x9f,0xf4,0x8f,0x17,0xd2,0x5e,0xdd,0x12,0x68,0xef,0xfe,0x41,0xee,0x6a,0x81,0xce,0x48,0xd8,0x4d,0xe5,0x13,0xdf,0x9c,0x41,0x44,0x26,0x21,0xb2,0xf5,0x49,0x1e,0x34,0x6b,0xe1,0x8c,0x04,},\"\\x08\\x63\\x35\\xd6\\x12\\x75\\xd1\\x68\\xea\\xac\\x05\\x40\\x47\\x7f\\x50\\xd4\\xb1\\x5f\\x9e\\x50\\xb9\\xbe\\x69\\x39\\x21\\xed\\x54\\xa9\\x94\\x1b\\xc4\\x06\\x43\\xcd\\xa6\\x2e\\x1d\\x80\\x5d\\x02\\x50\\xa8\\x11\\x46\\xbd\\x5f\\xe2\\xd3\\x9e\\x81\\x44\\x4d\\x21\\xe2\\xb2\\x1b\\x03\\x1c\\x11\\x13\\x06\\xca\\xcb\\xf5\\x27\\x17\\xf6\\xfb\\x4c\\xd3\\x41\\x6f\\x12\\x15\\xf8\\xdd\\xdc\\xed\\xd2\\xf0\\x09\\x6b\\x0f\\xcf\\xa0\\xa6\\xcc\\x2c\\xde\\x7a\\x2b\\xab\\x7f\\x1e\\x32\\x79\\x0b\\x53\\x61\\xdf\\x36\\x71\\x42\\x4c\\xc7\\x22\\xf2\\x31\\xbf\\x71\\x89\\x5b\\xcd\\xcb\\x7b\\x22\\xee\\x07\\x4e\\x8f\\xb4\\xa9\\x67\\x85\\x04\\xe7\\x35\\x36\\x6c\\x17\\x2f\\x07\\x63\\x7b\\x7a\\x93\\x14\\x9b\\xb2\\x1f\\x38\\x88\\x33\\x78\\xa1\\xdb\\x27\\x3f\\xc2\\x32\\x39\\xe3\\x53\\x37\\xf9\\xce\\x56\\x6d\\x8d\\xdf\\x3b\\x31\\x33\\xca\\xd7\\xf2\\xce\\x81\\xed\\xb5\\x03\\xce\\x1d\\x27\\xc5\\xa6\\x57\\x16\\x0b\\x78\\xdc\\xa9\\xae\\xae\\xa3\\x79\\xbe\\x9c\\x85\"},\n{{0xee,0x89,0x85,0xdc,0x27,0x50,0x44,0x40,0xa8,0x75,0x8d,0x4c,0x53,0xe4,0x22,0x52,0x15,0x79,0x7a,0x00,0xcd,0x86,0x31,0xd5,0x9b,0xd9,0x3b,0xc6,0x6f,0x37,0x3d,0x5e,},{0xcd,0x64,0x7b,0xb0,0x65,0x69,0x3d,0x48,0x65,0x89,0x15,0x6a,0x9f,0xa2,0x61,0x43,0x75,0x34,0xdc,0x86,0xf4,0x6f,0x72,0xd0,0xa8,0x00,0x39,0x9a,0x7a,0xf0,0x10,0xf7,},{0x5b,0xd6,0x0a,0xd5,0xe9,0xba,0xd9,0x93,0x2c,0xa9,0xc7,0x5f,0x23,0x1a,0x76,0x88,0x9a,0xe7,0xa8,0xb8,0x64,0xb9,0x1d,0x1f,0xcb,0xa5,0xc5,0xd4,0xbf,0xa1,0xd9,0x28,0x38,0xad,0xb9,0x74,0x84,0x2a,0x07,0x10,0x77,0x9b,0x3e,0x30,0x94,0x04,0x49,0x09,0xe9,0x2c,0x7c,0xf0,0x46,0xce,0x51,0x9f,0x4c,0x68,0xe8,0xf1,0x9e,0xc0,0x3c,0x02,},\"\\xf2\\x22\\x04\\x85\\xad\\xdf\\xeb\\xce\\x02\\xa8\\x33\\xac\\xa3\\x33\\x81\\xd1\\xdf\\x91\\x7e\\xd6\\x09\\x95\\x0e\\xd2\\x4f\\x85\\xe3\\xb0\\x2b\\x2b\\x99\\x4b\\x4d\\x93\\x97\\x84\\xe3\\x32\\xf4\\x10\\x64\\xc8\\xb4\\xa2\\x63\\x0a\\xb3\\x69\\x61\\x74\\x2a\\xa1\\xcf\\xfd\\xcb\\x08\\xc1\\x44\\xee\\xae\\xde\\xaf\\xd4\\x8b\\x5d\\xbe\\x96\\xbf\\x24\\x35\\x0e\\x14\\xfd\\x68\\x28\\x6b\\xc0\\x8e\\xea\\xef\\x8b\\xc6\\xad\\x9e\\x19\\x5d\\x14\\x84\\xaf\\xcd\\x30\\xaf\\xa8\\xce\\xd4\\x84\\x81\\x26\\xd5\\x6c\\x81\\xb4\\x3c\\x27\\xa5\\xdb\\xbd\\xec\\x1a\\x50\\xc1\\x10\\x62\\xce\\x21\\xc6\\x1d\\x86\\x0c\\x25\\xa8\\x62\\xfb\\xb7\\x5c\\x3b\\xd5\\x1c\\x8d\\xc0\\x76\\x36\\x66\\x86\\x69\\xbb\\xf7\\x51\\xea\\xca\\xcc\\xb3\\xb5\\x1d\\x2c\\x0d\\x41\\x40\\x31\\x6c\\xfc\\xe2\\xeb\\x18\\xd2\\x90\\x8c\\xec\\xd5\\xa1\\x88\\x67\\x9b\\xc5\\xf5\\xde\\x29\\x0f\\x54\\x8e\\x7e\\xbc\\x57\\xd4\\x1b\\x58\\x9a\\x24\\xce\\x88\\xee\\x48\\xd9\\x7e\\x8d\\x0c\\x7c\\x76\\x99\\x60\"},\n{{0x80,0xdf,0xe2,0xbf,0x73,0x87,0xba,0xd4,0x65,0x4e,0xb0,0x76,0xf8,0xda,0xe9,0x59,0x51,0x63,0xe4,0x01,0x27,0xf5,0xdf,0x49,0x2d,0xad,0x7d,0xf0,0x4c,0x72,0x21,0xc4,},{0xd1,0x78,0x3c,0xee,0xb9,0xcf,0x8e,0x4d,0x07,0x76,0x4c,0x47,0x3f,0xa4,0x06,0x1b,0x82,0x74,0x39,0x71,0x03,0xf2,0x07,0x6d,0x70,0x32,0x49,0xd7,0x58,0xb8,0xfb,0xd5,},{0x27,0x27,0x9e,0x3c,0xdc,0xb0,0x3e,0xf5,0x57,0xa5,0xde,0xfc,0x2f,0x6c,0x58,0x12,0x8a,0x6d,0xc3,0xf8,0xb0,0x38,0x59,0x58,0x01,0x4e,0x70,0x9c,0x1f,0x61,0xb0,0xae,0x6b,0x40,0x35,0x76,0xf0,0xe4,0x54,0xd5,0xe4,0xc6,0x4c,0x17,0x31,0x38,0xee,0x4b,0xbd,0x5f,0xe7,0xb6,0x0d,0x06,0xc5,0xab,0xe2,0x3f,0xe9,0x9e,0xe3,0xb4,0x6a,0x00,},\"\\xaa\\x09\\xd7\\x84\\xbb\\x09\\xdc\\x99\\x99\\x31\\xeb\\xb4\\xc0\\x0e\\x42\\x4c\\xef\\xec\\xa1\\x04\\x81\\x8d\\x8e\\xaf\\x06\\x61\\xf0\\x97\\x28\\xad\\x02\\x5e\\xf4\\x73\\x93\\x21\\x05\\x71\\xf1\\x74\\x04\\xe9\\xaa\\x6d\\x8c\\xbd\\x5f\\xd8\\x8c\\xd7\\xdf\\xb8\\xe2\\xe8\\xa1\\x08\\xc0\\x5d\\xe2\\x06\\xf3\\x40\\x82\\x34\\xa3\\xb4\\x63\\xdb\\xe7\\x1a\\x07\\xd0\\x55\\x87\\x32\\x45\\x24\\xb7\\x32\\x6e\\xe7\\x9d\\x33\\x48\\xdd\\xbe\\xd7\\x87\\x1b\\x86\\xfc\\xb4\\x88\\x03\\x1d\\xc9\\xea\\x93\\xf6\\xb8\\xd7\\xfd\\xa6\\x23\\x93\\x48\\xa5\\x62\\x44\\x4f\\xaf\\x1e\\x72\\xd3\\x1a\\xf3\\x54\\x43\\xe9\\xdf\\x53\\xe7\\x62\\xf3\\xe5\\x6b\\x48\\x66\\x8f\\x97\\x84\\xb3\\x36\\x8a\\xb2\\x78\\xa4\\x8e\\xf4\\x54\\x6a\\x26\\xcf\\xad\\x0d\\x0a\\x51\\x61\\x69\\x8f\\x26\\xee\\x8d\\x34\\xfc\\x2b\\x3d\\x6d\\xfb\\x93\\xb0\\x09\\xac\\x29\\x6f\\x6a\\xfe\\x48\\x7e\\xe3\\x35\\xea\\xc9\\xf0\\x2c\\xfc\\xae\\x5f\\xcb\\xd1\\xa1\\x6b\\xa4\\xe7\\x1b\\xe1\\xb1\\x12\\x56\\x2f\\xc2\"},\n{{0xda,0x1f,0x86,0x85,0x42,0xcd,0x7c,0xce,0x7a,0x5c,0xa3,0xfa,0x3c,0x24,0x08,0x1b,0x4d,0x23,0x44,0xb2,0x1a,0x15,0x7f,0x02,0x64,0xa3,0x47,0x13,0x2d,0x19,0x65,0x9d,},{0xcb,0x3a,0x25,0xa5,0x3f,0x27,0x2e,0xa8,0x13,0x80,0x44,0x68,0xd6,0x50,0x0e,0x96,0xa1,0xea,0xf8,0x22,0x70,0x5b,0x77,0x90,0xa8,0xac,0x3e,0x98,0xcc,0x4e,0x52,0x4b,},{0x75,0xc5,0x17,0xad,0xe4,0xf0,0x8d,0x77,0x46,0x30,0x57,0x43,0xd1,0xa7,0x76,0xc3,0xc5,0x5e,0xb5,0xee,0xdf,0xdf,0xcb,0x5e,0xb1,0xd5,0x63,0x4a,0x1b,0xda,0xf7,0xa4,0xb8,0xd2,0x41,0x87,0xd6,0xc8,0x85,0x0e,0x3c,0xed,0x65,0x67,0xa0,0x3c,0x4c,0x59,0x38,0x9a,0x4c,0xf4,0x71,0x14,0xce,0x54,0x73,0x16,0x0f,0x23,0x05,0x46,0xe6,0x0d,},\"\\xc6\\x98\\x7e\\xf3\\x80\\xd5\\xd0\\xe7\\x41\\x96\\x44\\x3a\\xaa\\x3a\\x32\\x35\\x6c\\xbc\\x02\\x63\\x6c\\x5a\\x4b\\x6d\\x62\\xa8\\x11\\x4b\\x21\\x11\\xbc\\x1a\\xbd\\xdd\\x9e\\x44\\xb3\\x67\\x2c\\x18\\xb5\\x8d\\x4e\\xf5\\x91\\xaf\\x45\\x62\\xe0\\x20\\x04\\x9f\\x8e\\x12\\x74\\x68\\x8e\\x1f\\x8e\\x52\\x96\\xd2\\xf9\\x25\\x2e\\x7f\\xc8\\x4c\\xd1\\xd0\\xc5\\x8e\\x98\\xf0\\xf1\\x60\\x53\\x0a\\xa2\\x2c\\x87\\x1e\\xef\\x65\\x2e\\x71\\x97\\x4c\\xe9\\x1b\\x4a\\x65\\xfc\\x25\\xfd\\x09\\xfa\\x1b\\x6c\\x32\\x08\\x6e\\x98\\xec\\x70\\x8d\\x9a\\xbc\\xb1\\xd9\\xcc\\x8e\\x1a\\x08\\x9e\\xd8\\xdb\\x22\\x06\\xee\\x95\\x70\\x23\\x6a\\xd6\\x9b\\x3d\\xe6\\x82\\x18\\x62\\xfd\\x2c\\x70\\xcd\\x83\\xa3\\x2a\\x68\\xb0\\x48\\x62\\x29\\x55\\x3d\\x92\\x8d\\xe4\\x8d\\x03\\xa1\\x04\\xe8\\x73\\x81\\x96\\x4a\\xbe\\xa7\\x66\\x83\\x97\\x6d\\x52\\x7c\\x84\\x16\\x3a\\x12\\xee\\xe0\\xa5\\x59\\x86\\xcf\\x14\\x31\\xe9\\xc8\\x6c\\xba\\x81\\x82\\xca\\x94\\x68\\x9b\\xac\\xd1\\x65\\xfb\\xce\"},\n{{0xf1,0x3d,0xae,0xc0,0xef,0x33,0xdd,0xd1,0x33,0xc7,0xd2,0x44,0xd1,0x0f,0xd2,0x7d,0xdb,0x23,0x70,0x52,0x80,0xff,0x5f,0x18,0x15,0xf0,0xf6,0x56,0xd8,0x36,0xfe,0x84,},{0x2d,0xc7,0xf1,0x36,0x7d,0xe6,0x72,0xc5,0x1e,0x00,0x5c,0x74,0xf8,0x76,0xf9,0x82,0x59,0x39,0x96,0x87,0x3a,0xcb,0xa0,0x79,0x29,0x27,0x34,0xc2,0x09,0xc2,0xb1,0x11,},{0xdb,0x77,0x18,0x33,0xf7,0xfd,0xba,0xcd,0xab,0x2b,0x5c,0xc8,0x0e,0xed,0x50,0xaf,0xdf,0x13,0x78,0x3b,0x7f,0xe5,0xe9,0x03,0xd5,0xdb,0xb4,0xc2,0xe5,0x35,0x31,0x6a,0x6e,0xef,0x4c,0x34,0xf0,0x04,0xd2,0xb9,0xa4,0xe2,0x70,0x0b,0xd6,0xe2,0xac,0xdd,0x56,0x4c,0x3c,0x80,0xcc,0x68,0xa3,0x03,0xf5,0xfb,0x09,0x1c,0xb4,0x34,0x0f,0x0a,},\"\\xec\\x02\\xff\\x18\\x04\\xb2\\xb3\\x09\\xaf\\x31\\x58\\xb6\\x62\\x72\\xa1\\x4a\\x3a\\xad\\x83\\xc4\\x1a\\x71\\x98\\x46\\xf7\\x08\\x8c\\xa9\\x79\\x2a\\xf5\\x75\\xc7\\x89\\x13\\xc4\\x32\\x75\\x9f\\x0b\\x9a\\x74\\x8b\\xdc\\x55\\x68\\x49\\x6e\\x41\\x65\\x8c\\xc1\\xcd\\xb8\\xda\\x6c\\x91\\xd0\\x7c\\x3e\\xc2\\xf4\\xaf\\x50\\x42\\x49\\xb9\\x96\\xaa\\x00\\xc0\\x07\\x1c\\xdf\\xa7\\x93\\xf8\\x2d\\x0e\\xc5\\xd2\\x67\\x26\\x2f\\x51\\x8f\\xc0\\x29\\xb8\\x8e\\x20\\xb6\\x20\\x1f\\xb9\\xe0\\x5a\\xbd\\x3f\\x95\\x24\\xc5\\xda\\x2f\\xa8\\x97\\x8f\\xf2\\xef\\xd4\\x81\\x20\\xcf\\x00\\x82\\x2d\\x1b\\xee\\x90\\xdf\\x81\\x61\\x25\\xd8\\xed\\xc0\\xcf\\xb5\\xde\\x66\\xd1\\x6b\\xe6\\x38\\x96\\xa4\\x12\\xa6\\x2b\\x03\\x1b\\x71\\x18\\xac\\x13\\xfe\\x2c\\x9f\\xaa\\x6b\\x1a\\x33\\x42\\xf9\\xcc\\xf7\\x88\\x41\\x66\\xcf\\x48\\x9a\\x84\\xde\\x26\\xb5\\xce\\x5b\\x21\\x85\\x6a\\x3a\\xf2\\x89\\xbc\\x66\\x22\\xc0\\xaa\\xb9\\xf2\\x14\\x2d\\x39\\x3f\\x5d\\x4b\\x23\\x67\\x79\\xdb\\xb0\\x66\"},\n{{0x42,0xdc,0x16,0xc5,0x7f,0xb6,0xf1,0x28,0x94,0x5f,0xa1,0x01,0xe0,0x5b,0xbf,0x54,0x8e,0xf7,0xd9,0x77,0x26,0xb6,0x92,0xfe,0x40,0x40,0x69,0xcc,0x57,0xcc,0xef,0xa0,},{0x0a,0x1b,0xa5,0xdf,0x52,0x39,0x96,0xf9,0x54,0xb3,0x4d,0xdc,0xfa,0xba,0xd3,0xf3,0xde,0xe2,0x1a,0x5f,0xa7,0xa4,0xce,0x32,0x2d,0x21,0x6b,0xd8,0xcc,0xaf,0x43,0x8c,},{0xc7,0x59,0x77,0xe8,0x3b,0xcf,0xe9,0xdf,0x72,0x92,0xa8,0x60,0xed,0x97,0x25,0x55,0xb5,0xc2,0x44,0x16,0xfd,0x4b,0x7e,0xe3,0x28,0x53,0x88,0xfa,0x5b,0x14,0x47,0x60,0x8e,0x4a,0x34,0x78,0x13,0xcf,0xe0,0x93,0x51,0x2a,0x76,0x51,0xe4,0x22,0xe9,0x86,0x7d,0xb7,0xb9,0x7c,0x0b,0x08,0x67,0xf0,0xb8,0xc7,0xb7,0xf4,0xf0,0x2c,0x31,0x0d,},\"\\xf2\\x71\\x4c\\x23\\xa3\\xa6\\xfc\\x11\\xad\\x15\\xc9\\x80\\xb7\\x35\\x0f\\xc8\\x42\\x17\\x87\\x76\\x61\\x18\\x80\\x55\\xff\\x75\\x0d\\x82\\xc4\\x9c\\x5f\\xef\\x7b\\xc8\\xe6\\xaa\\xc5\\x74\\xa1\\xb7\\x9a\\x3f\\x26\\xd1\\x69\\x69\\xc0\\xf4\\x06\\xee\\xab\\x3e\\x9e\\x12\\x85\\x0a\\x55\\x70\\x97\\x45\\xe3\\x0d\\xff\\xa6\\x2a\\x69\\xdf\\xb2\\xb6\\x4b\\x3c\\x1b\\xd2\\xbc\\x35\\x86\\xe2\\x6d\\x4e\\xea\\x71\\x4d\\x2a\\x7b\\x71\\xcf\\x79\\xfb\\x8f\\xfb\\xf2\\xaa\\xad\\x00\\xca\\x3e\\x4f\\x2b\\x6f\\x50\\x3c\\xc1\\xfe\\xf2\\xea\\xb3\\x65\\x6f\\xb4\\x4f\\x8d\\x62\\xa8\\xdb\\x8a\\xb5\\x8f\\x39\\x46\\x93\\x94\\x9e\\xea\\x57\\xfa\\xfe\\xcf\\x00\\x5f\\x6e\\xbf\\x12\\x87\\xdb\\xa4\\xd2\\xd6\\x23\\xc0\\x2e\\xa1\\x71\\xf5\\x67\\xe5\\x26\\xad\\xd2\\x07\\x09\\xeb\\xca\\xb9\\x62\\xf8\\x3d\\x98\\xef\\x66\\x8e\\xbd\\x01\\xef\\x20\\x48\\x8b\\x36\\x65\\xe3\\xa4\\x46\\xfb\\xfb\\x13\\xd3\\x40\\x50\\x94\\x2c\\x74\\x9b\\xb2\\xdf\\xfc\\x76\\x63\\x67\\xfd\\x45\\x2e\\x68\\xe5\\xb0\\xc6\"},\n{{0x90,0xb4,0x55,0xc6,0xbb,0x9c,0xec,0x83,0xe1,0x37,0x35,0x70,0x65,0x33,0x9d,0x03,0x05,0x25,0xd0,0xea,0x7f,0x5b,0x92,0x3a,0x2d,0x59,0x72,0xc3,0xc1,0x2a,0xa3,0x7b,},{0x5c,0xef,0x03,0x8c,0x16,0xbf,0xa4,0xb4,0xc9,0x23,0xa0,0xfe,0x70,0xcd,0x7f,0x25,0xc8,0xbc,0x83,0x7f,0xdf,0x5a,0x7e,0xfb,0x9d,0x95,0xf2,0x1b,0x96,0xbe,0x92,0x5a,},{0xc9,0x34,0x5e,0xec,0x2c,0x4a,0x0a,0xec,0x73,0x23,0x86,0x49,0x4a,0x69,0xa3,0xfc,0xe8,0xb8,0xa1,0xbe,0x36,0x6b,0xbe,0xd1,0x65,0x9f,0x13,0x1f,0xe9,0x7c,0xc0,0x37,0xfb,0x1b,0x7c,0x1b,0x68,0xb0,0xf3,0x02,0x39,0x45,0xd2,0x00,0x90,0xa0,0xcd,0x2c,0x15,0x53,0xa4,0x7f,0xae,0xc4,0xd6,0x6f,0xd8,0x16,0xce,0x12,0x11,0x68,0xf3,0x09,},\"\\xc6\\x2c\\xfd\\xb9\\xd2\\x1e\\xee\\x6b\\xe4\\x7f\\x30\\x72\\x7a\\xae\\xe5\\x1f\\x07\\x03\\x78\\x9a\\x43\\x1d\\x32\\x22\\x85\\x33\\x35\\x02\\x17\\xa9\\x3a\\x18\\x90\\x06\\x69\\xc9\\x59\\x56\\xf3\\xf2\\xae\\x90\\xdc\\x74\\x5a\\x71\\xe1\\x83\\x40\\xd0\\x58\\xd1\\x6b\\x4c\\x6f\\xe3\\x3b\\x64\\xaf\\x8d\\xad\\x97\\x3f\\xe5\\xdc\\x02\\xe8\\x52\\x07\\x05\\xc7\\xa8\\xbb\\x3c\\xcb\\xe1\\x83\\x8c\\x6c\\x24\\x93\\x37\\xf9\\xb6\\xa4\\xc0\\xe1\\xf8\\xa4\\xe5\\xd1\\x03\\x19\\x6f\\xa7\\x99\\x98\\x92\\x3d\\x04\\x22\\xe9\\xd0\\x79\\xa7\\x2c\\xc2\\xa8\\xf8\\x6d\\x65\\x90\\x31\\xa6\\x07\\xd4\\xcc\\xa0\\xb9\\x47\\xb3\\xab\\xee\\xee\\xf6\\x4c\\x28\\xda\\x42\\x0d\\x05\\xde\\x66\\x5a\\x55\\x10\\xfe\\x55\\xf7\\x75\\x98\\xec\\xad\\x7f\\xaa\\x0a\\xc2\\x84\\x80\\x0b\\x53\\x82\\x93\\x94\\xc4\\xae\\x90\\xbe\\x66\\x67\\x8f\\xf0\\x4a\\xb4\\x6d\\xa2\\x65\\xae\\x06\\x40\\x2d\\x8c\\x83\\xca\\xd8\\x4d\\x61\\xa0\\x51\\xde\\x02\\x60\\x55\\x98\\x88\\xe7\\x79\\xf7\\x4b\\x72\\xa5\\xd7\\x1c\\x13\\x2f\"},\n{{0xdc,0x18,0x5c,0x2b,0xa0,0xb3,0x78,0xdf,0xe5,0xdd,0xa5,0x10,0xc3,0x2f,0xef,0xf5,0x35,0xca,0x2e,0x8a,0x02,0x43,0x4b,0x32,0x6e,0x01,0x58,0xbc,0x87,0x8e,0x88,0x48,},{0x33,0xd6,0xcc,0x05,0xa4,0x34,0xe4,0x19,0x28,0x0d,0x58,0x64,0xa1,0xaf,0x20,0x9a,0x2c,0x67,0x68,0x14,0xb7,0x0f,0x72,0xf8,0x14,0x1a,0xc7,0xe0,0x57,0x3e,0xe6,0x3e,},{0xf1,0xe4,0x45,0x14,0xd2,0xec,0xbc,0xc8,0xd1,0xa7,0xe8,0x4b,0xf5,0x84,0xce,0x73,0x18,0x35,0xe9,0x89,0x4f,0x88,0x97,0x4f,0x09,0x8d,0x45,0x6b,0x60,0x71,0x8f,0x57,0x5e,0xf4,0xd8,0x06,0x2f,0x21,0x82,0x50,0x42,0x50,0xcf,0x83,0xbb,0x2a,0xf2,0xa7,0x9b,0x1f,0x58,0xa6,0xa9,0x7b,0xd9,0x8d,0xa4,0x67,0x13,0x2d,0x7b,0xec,0x2f,0x05,},\"\\xe2\\x76\\xb1\\x19\\x12\\xcc\\xa5\\xa8\\x4b\\xba\\x65\\x0c\\x17\\x2a\\xef\\x3a\\x4d\\x5f\\x91\\xac\\x72\\x29\\x13\\xbb\\x89\\x1a\\x3a\\xb0\\x42\\x4a\\xb0\\x7e\\xa7\\x09\\xcb\\x8b\\xba\\x3a\\x3d\\x11\\xf8\\x2f\\x51\\xc2\\xaf\\x01\\x62\\xa8\\x2f\\x72\\x19\\xce\\x27\\xb3\\x5a\\x30\\x50\\x7d\\x53\\x6a\\x93\\x08\\x17\\xe4\\x0f\\x85\\xa2\\x2a\\x5a\\x43\\x2b\\x94\\xd1\\x92\\xc3\\xc8\\x91\\x17\\x77\\xcf\\xdb\\x7f\\xe9\\x37\\xa6\\x75\\x02\\x77\\x0d\\x6d\\x75\\x75\\x3d\\x3a\\xe8\\x82\\x29\\xe0\\x8f\\x1e\\xd2\\x3b\\x43\\x28\\xd8\\x62\\xac\\x61\\x86\\x3c\\x06\\x3e\\xa9\\x84\\x8f\\x8a\\xb9\\x6a\\x02\\x13\\xd7\\xb9\\x36\\xc4\\x8f\\xe7\\x54\\x83\\x6c\\x98\\x48\\x78\\x59\\xd1\\x99\\xb3\\xd9\\x40\\x39\\x27\\x16\\xa1\\xd5\\x69\\xe6\\xc0\\xcb\\x1b\\xa9\\x18\\x93\\x2c\\xf8\\x85\\x25\\xe2\\x56\\xc8\\xab\\xb1\\x1a\\xaf\\x0b\\x45\\x46\\x55\\xd5\\xdb\\x55\\x71\\x3c\\xeb\\xba\\x28\\x7a\\xe2\\x02\\x65\\x1a\\xc8\\x72\\xbf\\xc8\\x0f\\xea\\xa7\\xe0\\x0d\\x47\\xc0\\xbe\\x38\\xe6\\x58\\xf7\\xc5\"},\n{{0x90,0x72,0x1c,0x43,0xbc,0x36,0x6f,0x24,0xbf,0x4e,0x8c,0x99,0x3e,0x13,0x80,0x24,0x68,0x2f,0x10,0x29,0xdb,0xa3,0x5a,0xbe,0xb0,0xd6,0x0c,0x7f,0xa7,0x10,0x02,0x1c,},{0x7c,0x63,0xa2,0xf1,0x3b,0x7b,0x22,0x0a,0x0b,0xb7,0x52,0xe3,0x80,0x07,0x53,0xb8,0xb6,0xb3,0x26,0x69,0x37,0x8c,0xe1,0x31,0xbb,0x77,0xa9,0xa8,0xd2,0x30,0xe9,0xae,},{0xd2,0x06,0x4a,0x6d,0x6c,0x99,0xc6,0xc3,0xf1,0x52,0xd2,0xd4,0x35,0xf2,0x4e,0x34,0xb5,0x45,0x9b,0x08,0x2e,0xf1,0x1e,0x94,0x4a,0x77,0xff,0x54,0xdd,0xf9,0x86,0x27,0x37,0xec,0xb2,0xac,0x8d,0x54,0x20,0x7d,0x36,0xc5,0x1a,0xd4,0x1f,0x36,0x49,0x0a,0x11,0x1b,0xa8,0x0e,0x12,0x6b,0xfe,0xcb,0x09,0xde,0xf6,0xac,0xcb,0xdf,0x88,0x0e,},\"\\x65\\x1c\\x96\\x17\\xca\\xc9\\x58\\xc7\\xed\\xd4\\xa5\\xf3\\xfe\\xdf\\xb8\\x3d\\xc9\\x71\\xab\\xfb\\xb6\\x9a\\x31\\xe8\\x98\\xcc\\xa8\\x47\\x2e\\xf0\\x68\\x03\\x4a\\x6d\\x23\\x76\\xee\\x0e\\x72\\xd0\\xa9\\xbf\\xee\\x27\\x57\\x96\\xc3\\x79\\x5a\\xda\\xc8\\xeb\\xe1\\xd1\\x2b\\x66\\xec\\x26\\x8f\\x6b\\x75\\xfa\\x39\\x41\\x15\\x4f\\x99\\xe2\\x23\\xfa\\xf2\\xcb\\xab\\x5b\\x92\\xe2\\xb3\\xba\\x7b\\x79\\xbe\\x77\\x00\\xef\\x9d\\xba\\x69\\x25\\x3c\\xce\\x53\\x56\\xb0\\xc4\\xe7\\x47\\x03\\xcf\\xca\\xfd\\xb5\\x54\\x68\\x50\\xb4\\x62\\x32\\x67\\x5c\\x90\\xc0\\x2d\\x5e\\x42\\x6d\\x33\\xd6\\x0c\\xeb\\xf0\\xc7\\x93\\x01\\x82\\x37\\x9d\\xbb\\x00\\x7f\\x53\\x61\\x63\\xc8\\xdd\\xbb\\xd3\\x15\\x7b\\xb2\\xda\\x62\\x34\\x01\\x33\\xf0\\x0a\\xe2\\x68\\x2e\\xc6\\xba\\xa6\\x41\\x6b\\x5a\\x01\\x52\\x1c\\xc1\\x0e\\x04\\x69\\x52\\x95\\xf2\\xe5\\xb9\\x4c\\x05\\xf0\\x03\\x83\\xff\\xe9\\x54\\x83\\x07\\x97\\xf6\\xdf\\x82\\x31\\x72\\x53\\x2f\\x98\\x16\\x5f\\xe3\\x14\\xab\\x32\\x59\\x29\\xaf\\x83\\x85\"},\n{{0x9c,0xec,0x24,0x67,0x58,0xe4,0x12,0xe7,0x37,0x8b,0x45,0x79,0xea,0xfe,0x9f,0xac,0x5a,0x25,0xd5,0x40,0x5f,0x92,0x70,0xb5,0xd7,0xe5,0x43,0x41,0x4e,0xc3,0xd5,0xda,},{0x97,0x5a,0x9e,0x6a,0x15,0x2c,0xae,0xbb,0x2f,0x9d,0xd0,0xde,0xb7,0x6d,0xd9,0x22,0xb6,0xdc,0x77,0x05,0x5d,0xda,0x03,0xfb,0xae,0x9e,0x7c,0x68,0x5d,0x07,0x3a,0xa1,},{0x9b,0xad,0x1e,0x3b,0x12,0x79,0xef,0x65,0x8f,0x4d,0x07,0x16,0x44,0xc6,0x3a,0xe2,0xb7,0xa7,0x80,0x35,0x7e,0x9d,0xc4,0x26,0xf1,0x65,0x0e,0xc0,0x63,0x4d,0xfc,0x52,0x0f,0x8e,0xda,0x9d,0xc8,0xf1,0x0a,0xa7,0x32,0x4c,0x59,0x42,0xd2,0x34,0x7f,0xf8,0x80,0x2b,0xd9,0x0e,0x95,0xfc,0xec,0x31,0x33,0x52,0xcd,0xae,0x64,0xf3,0x2a,0x04,},\"\\x17\\xec\\x9b\\xd4\\x7a\\xdd\\x6c\\xcf\\xbd\\x78\\x7a\\xf0\\xd9\\x01\\x3e\\x9c\\xc9\\x79\\xaa\\xf8\\x50\\xe0\\x94\\x26\\xd3\\xb2\\x8e\\xdf\\xd7\\x12\\x96\\xeb\\x31\\xff\\x8b\\x21\\xc5\\xfe\\x7b\\xe0\\x50\\xf5\\x36\\x32\\x4c\\x3e\\xc4\\x88\\x50\\xe0\\xb5\\x08\\xa3\\x6b\\xb4\\xcb\\x7e\\x75\\x4b\\x32\\x71\\x83\\xa1\\xb3\\x94\\xd8\\x8a\\x79\\x41\\xd1\\xce\\x8d\\xac\\x62\\xa5\\xd8\\x29\\x18\\x74\\xd7\\x84\\x85\\xe5\\x1f\\x29\\xed\\x05\\x86\\x5a\\x20\\x6e\\x52\\xec\\xb1\\x2c\\x5d\\x10\\x7d\\x4f\\xf9\\x6f\\x25\\xd3\\xc5\\xd1\\x81\\xd2\\xc4\\xba\\x64\\x63\\x60\\x0d\\xb1\\xcc\\xa3\\x28\\x57\\xfc\\xf5\\x97\\xcb\\xdf\\xb2\\xfd\\xa2\\x70\\x8a\\x8a\\xba\\x28\\x1b\\x43\\xc3\\xd2\\x8c\\x4a\\x4e\\x79\\x83\\x36\\x15\\x09\\xf6\\x1a\\x10\\x74\\xe6\\xf0\\xad\\x61\\x01\\xc7\\xb5\\x67\\xee\\x40\\x78\\xe9\\x83\\x9c\\x47\\xf4\\x65\\x31\\xb7\\x29\\xff\\x0e\\xfe\\xef\\x7c\\x9d\\x1a\\x8d\\x83\\x3d\\x9c\\x0f\\x42\\x81\\x2a\\x34\\x18\\x7c\\x3a\\x77\\x8c\\x16\\x5c\\x09\\xd6\\x45\\x9c\\x9c\\x7c\\xea\\xa2\"},\n{{0xd1,0x40,0x3f,0x63,0x20,0x2e,0x08,0x05,0x25,0x84,0x3b,0xde,0x25,0x5e,0xeb,0x6b,0x67,0x83,0xc1,0xca,0xae,0x9d,0x6e,0xd0,0x0b,0xa6,0x08,0x05,0xbe,0xd1,0x94,0x1f,},{0x23,0x8a,0xea,0x3a,0xd6,0xd6,0xf2,0x77,0x83,0xe7,0x05,0x16,0xbb,0xfc,0xca,0x47,0x70,0x36,0x6b,0x50,0xed,0x0f,0xe6,0xa4,0xe9,0x66,0xb5,0x3a,0xf1,0x21,0xa7,0x21,},{0x8e,0x60,0xe7,0x3c,0x06,0x38,0x16,0x79,0x5e,0x29,0xf5,0xd6,0x4e,0xce,0x11,0x59,0xf1,0xb5,0xd5,0x02,0x1a,0x6f,0x8f,0x65,0x5e,0x26,0x1a,0x4d,0x00,0x26,0xf5,0xb9,0x4f,0xf2,0x92,0x32,0x50,0x49,0x9d,0x99,0x52,0x98,0x48,0x05,0x12,0xe4,0x12,0x62,0x76,0xaa,0x4a,0x22,0x6d,0x01,0x5a,0x95,0x82,0x7b,0x3c,0xe6,0x92,0xe2,0x33,0x02,},\"\\xc4\\xf1\\x7d\\x44\\x2f\\xba\\x4c\\xa0\\xdf\\x8d\\xc1\\xd0\\x62\\x8d\\x7d\\x7f\\x36\\xb6\\x0b\\x57\\x58\\xd7\\xc1\\x3b\\x80\\xb8\\xf9\\x7a\\x62\\x12\\x4d\\x96\\xa2\\x3b\\x27\\x95\\x65\\x49\\x5a\\x8a\\xcc\\xab\\x59\\x97\\x11\\x5b\\x13\\xa4\\xba\\x22\\x0a\\x73\\x95\\x7e\\xb7\\x93\\x05\\x20\\xac\\xbb\\xfb\\x6f\\x54\\xcf\\x68\\x72\\x6b\\x64\\x50\\xc6\\xff\\xa9\\x47\\x0b\\x05\\x5e\\xa2\\x62\\x91\\x4e\\x2b\\xc6\\x12\\x63\\x3f\\x1a\\xc3\\xd0\\x61\\x8a\\x23\\xdf\\xf1\\x88\\xa7\\x33\\xd7\\x6b\\xcb\\xcc\\x46\\x0f\\x52\\xab\\x61\\xe1\\x99\\x38\\xf9\\xc8\\xca\\xaa\\x79\\x2c\\x20\\x8d\\x1f\\x6c\\x75\\x47\\x28\\x90\\x5f\\xda\\x51\\xd8\\x81\\xa3\\x47\\xa5\\x3d\\xa7\\x44\\xd3\\xba\\xad\\xc0\\xa7\\x6c\\x47\\x4c\\x55\\x86\\x80\\x26\\x90\\x95\\xf9\\x08\\x4a\\x74\\x47\\x1d\\x5c\\x09\\xff\\xc2\\x91\\x41\\xb5\\xbf\\xaf\\x49\\x54\\xdf\\xac\\xbc\\xa6\\x63\\xd0\\x37\\xb1\\x7e\\xbf\\x95\\x59\\x88\\x22\\x33\\xe5\\xca\\x5a\\x8b\\xf7\\x5c\\xca\\x4f\\xc9\\xc5\\xa4\\x10\\x9f\\x32\\xe1\\x45\\xf3\\x85\\x3b\\x17\"},\n{{0xbd,0xf6,0xbd,0xc3,0x1a,0xb0,0xb5,0x31,0x37,0x84,0x48,0x3a,0xbe,0xca,0x6e,0xa5,0xe9,0xcd,0xc6,0x8f,0x81,0xb2,0x1f,0x35,0x0d,0x09,0xc3,0x90,0x7b,0xb9,0xb6,0xa1,},{0x03,0x62,0x77,0x12,0xb7,0x55,0xe5,0x06,0x9f,0xb9,0xab,0x8f,0x9e,0x89,0x97,0x24,0x02,0x9a,0x7f,0x26,0x8a,0xf9,0x39,0x88,0x21,0xee,0xec,0x93,0x60,0xc9,0x28,0x5b,},{0x38,0xfa,0xc6,0x03,0xed,0x24,0x6f,0x83,0x3f,0x1c,0x0f,0xd4,0x58,0x56,0x98,0xb0,0xa7,0x13,0x05,0xef,0xf0,0xd1,0x4a,0x00,0x49,0xb3,0xce,0xf0,0x73,0xbd,0x03,0x6d,0xd4,0x51,0xb3,0xda,0xba,0xda,0xae,0xae,0xa2,0xae,0xaf,0x83,0xd3,0x95,0x74,0x6f,0x4e,0x86,0x86,0x6a,0xda,0x97,0x1c,0xbe,0x48,0x2e,0xdb,0x04,0x19,0x33,0x2f,0x0e,},\"\\x90\\xa6\\x6a\\xaf\\xa5\\x64\\x2a\\x98\\xe7\\x9f\\x0d\\x88\\x14\\x70\\x80\\x16\\x7b\\x11\\xe4\\x46\\x65\\x18\\xf1\\x95\\xcd\\xdd\\x89\\x40\\xd1\\x2e\\xe4\\x91\\x8d\\x31\\xa6\\xd4\\xcb\\x77\\xd0\\xbf\\x5a\\xf2\\x99\\x83\\xbb\\xe5\\x08\\x56\\x10\\xa7\\x9d\\xaf\\x0c\\x75\\xa7\\x8c\\xcb\\xcf\\xfb\\xbd\\xab\\x21\\x89\\xc3\\x94\\xae\\x24\\xe2\\x65\\xbd\\x8c\\x55\\xfd\\x3f\\x40\\x98\\xe1\\xb1\\x75\\x57\\x75\\x49\\x51\\x8e\\x7a\\x4d\\xcf\\x74\\x52\\x08\\x6d\\xd1\\x27\\x8d\\xd5\\x8e\\xa4\\xc0\\xaa\\x69\\x0e\\x91\\x79\\x51\\xef\\x39\\xfc\\xff\\x60\\xcb\\xfa\\x1e\\x90\\x91\\x0b\\xab\\x53\\x74\\x92\\x8d\\x47\\x22\\xf7\\x02\\xbf\\x5a\\xd6\\x02\\x8f\\xfd\\xa6\\x54\\x1f\\xa5\\xba\\x1a\\x37\\x79\\xec\\x78\\xb0\\xa9\\x5f\\xe3\\x85\\x0c\\x74\\x8b\\x6c\\x8f\\x42\\xf3\\x30\\xec\\x79\\x54\\x1a\\x52\\xa1\\xcf\\x57\\xdb\\x72\\xdf\\x4f\\x92\\xce\\x7f\\x74\\x8a\\xee\\xf1\\xaf\\x33\\xbc\\x5a\\xe0\\xa8\\x2c\\x89\\xdf\\xf2\\x16\\xf2\\x3a\\xec\\x16\\x8a\\x7d\\xbb\\x51\\x0a\\xa6\\x32\\xda\\xab\\xcc\\x97\\x1b\\x3f\"},\n{{0x57,0xb3,0xb1,0x4a,0xce,0x1c,0xd0,0xcd,0x60,0x3e,0x63,0x28,0xbd,0x21,0x9e,0xe7,0xd9,0xd0,0x94,0x48,0x7f,0xa6,0x68,0xf2,0x8a,0xee,0xc0,0x2b,0x43,0xc9,0x09,0xa7,},{0x24,0xe6,0xb6,0x39,0x5f,0x97,0xea,0x0e,0x23,0x71,0x86,0xd4,0x69,0xb7,0x19,0x23,0xd2,0x11,0x3a,0xdf,0x40,0x3b,0xee,0xeb,0x4a,0x2d,0x27,0x90,0x9a,0xaf,0x3e,0xda,},{0xfc,0x79,0xfd,0xc6,0xd0,0x90,0x88,0x7a,0x61,0xe4,0x3c,0x6b,0x91,0x87,0xb6,0x57,0xd2,0xe4,0xd9,0xcb,0xaf,0xd6,0xe7,0xca,0xeb,0x7e,0xbd,0xea,0x84,0x28,0x25,0xb7,0x8f,0xb9,0x49,0xd2,0xc4,0x9a,0x0c,0xf3,0x8b,0x6c,0x73,0x29,0x6d,0x82,0xc8,0xdd,0xeb,0x1f,0xe2,0xd4,0x0a,0xad,0xdd,0x79,0x64,0xda,0x68,0xac,0xf8,0xc6,0x6f,0x0e,},\"\\xb2\\xe0\\xde\\xdd\\x80\\x2e\\xed\\x99\\x6d\\xbd\\x58\\x36\\xbf\\x86\\x88\\xb0\\xd1\\x20\\x1b\\xf5\\x44\\x2f\\xf9\\xbb\\xd3\\x51\\xae\\xef\\xe1\\xa0\\xc2\\x1f\\xea\\x2b\\x5c\\x9f\\xe5\\xed\\xee\\x47\\xe9\\x21\\x09\\x9b\\x05\\xae\\xda\\xa8\\x03\\x67\\xc1\\xce\\x08\\x82\\x1d\\x78\\x3a\\x5b\\x64\\xcf\\x05\\x9c\\x0f\\x43\\x35\\x08\\x39\\x86\\xa5\\xa6\\xec\\xff\\x8c\\x84\\xfd\\x40\\xe0\\xba\\x5d\\xd5\\xe5\\xd2\\xf0\\x11\\x12\\xa8\\x4c\\xe5\\xcf\\x8e\\x0d\\xb7\\x8b\\xeb\\x18\\x2d\\x91\\x39\\xc0\\xb0\\xf3\\xe0\\x06\\x0a\\x3f\\xa7\\x38\\x69\\xe9\\x64\\x23\\xf1\\x70\\xdf\\x9a\\xf1\\xcb\\x9c\\x35\\x56\\x6d\\x87\\xdf\\xf5\\x42\\x22\\x3f\\x6d\\x43\\x9b\\xdb\\x54\\x72\\x9d\\x36\\x6a\\xff\\x63\\x7b\\x0f\\x36\\xa5\\xd1\\x4b\\x15\\xd6\\x12\\xbd\\x03\\x07\\x6c\\xc4\\xd0\\x4c\\x1f\\x25\\xb3\\xba\\x84\\xe0\\xd1\\xfe\\x47\\x4e\\x57\\x18\\xd1\\xa1\\x7d\\x5a\\x48\\x84\\x65\\x66\\x2e\\xe4\\xc3\\xf6\\x64\\xb4\\xc9\\x27\\x4b\\x64\\x9d\\x78\\xce\\xa4\\xe8\\x52\\x43\\xf3\\x71\\x32\\x39\\x04\\x8a\\x90\\x8c\\xe3\\xe1\"},\n{{0x01,0x8a,0x2c,0x3d,0xee,0xa5,0x0a,0xb5,0x06,0x75,0x1f,0x9c,0x2a,0xda,0xad,0xfd,0x9e,0x21,0x92,0x12,0x16,0x09,0x93,0x16,0x84,0xeb,0x26,0x5e,0x19,0x3e,0x7f,0x89,},{0xaf,0x41,0x0b,0xdd,0xde,0xfc,0x64,0x4e,0xf1,0x2c,0x98,0x99,0xff,0x71,0xb9,0xe1,0xd0,0xdf,0xa3,0xd6,0x9d,0x8c,0x2c,0xd6,0x76,0xc1,0x91,0x6b,0x34,0x59,0x1c,0xfd,},{0x7a,0x44,0xe6,0xa3,0x19,0x32,0xde,0xe6,0xdc,0x2d,0x83,0x94,0xe2,0x9a,0x65,0x51,0xd1,0x3e,0x6c,0x6f,0xfd,0xfa,0x21,0x8f,0xa5,0xb9,0x98,0x66,0x8d,0x84,0x39,0xdb,0x5e,0x05,0x37,0x9f,0xbf,0xa0,0xda,0x5b,0x56,0x3e,0xd9,0x66,0x43,0x5a,0xe2,0xc5,0x4e,0x3a,0xd1,0x6e,0x1a,0x9f,0xca,0x1f,0x5a,0x15,0x7a,0x08,0x07,0x04,0xab,0x03,},\"\\xcf\\x78\\x13\\xef\\xac\\x12\\xad\\x1c\\x7c\\x73\\x22\\xcc\\xbe\\x54\\xaa\\x0e\\x9a\\x8b\\xa4\\xfd\\x43\\x45\\xb0\\x6e\\x4c\\xe7\\xa3\\x5c\\x8b\\x1c\\xd5\\xe3\\xf7\\xf0\\x68\\x85\\x33\\x84\\x9b\\xa2\\xcf\\x4c\\x75\\xb6\\xf2\\x09\\x26\\xa1\\x19\\x4a\\x72\\xdf\\x0e\\x1b\\x1b\\x34\\x45\\x6a\\x21\\x33\\x11\\x2d\\x00\\x67\\x22\\xfe\\x81\\x1d\\x5e\\x40\\xc4\\x12\\x11\\x59\\xde\\xd8\\x89\\x90\\xc0\\xac\\x2b\\xfd\\x34\\xf3\\x5a\\xf4\\xf0\\x7c\\xc4\\x02\\xe9\\xa3\\x81\\xa6\\x75\\xd0\\x3f\\xec\\x7e\\xc4\\x38\\xc4\\xad\\x9d\\x92\\x9a\\xec\\x8f\\x24\\x2d\\xef\\x02\\x3c\\x99\\x3c\\x9e\\x8b\\xa1\\x8c\\x74\\x28\\xe8\\x8f\\xde\\x68\\xa4\\x71\\x1e\\x50\\x6d\\x79\\x69\\xf6\\x3c\\x8e\\x0b\\xc8\\x3f\\xf0\\xde\\x4e\\x13\\x36\\x10\\x6c\\x05\\xe0\\x9d\\x59\\x22\\x40\\x0e\\x8a\\x81\\xbf\\x54\\x88\\x56\\x67\\x89\\x97\\x85\\x88\\x2b\\x70\\xf2\\x0d\\xd8\\xfb\\x1e\\x75\\xf5\\x85\\x5b\\x76\\x5a\\x25\\x6d\\xa4\\x34\\x1b\\xf2\\x3e\\xa0\\xff\\xa1\\x8a\\xad\\xda\\x38\\x18\\x16\\x94\\x60\\x01\\x04\\x56\\x69\\xc8\\xd0\\x4d\\xf0\"},\n{{0xbe,0xa4,0x45,0xe9,0xb6,0xd3,0xf2,0x12,0x35,0x91,0x2c,0xd6,0xc4,0x2e,0xc0,0x57,0x72,0x97,0xca,0x20,0xa1,0x03,0x57,0x88,0x0c,0x2b,0x84,0x6d,0xd8,0xe2,0xcc,0x77,},{0x02,0x41,0x74,0x96,0x62,0x21,0x69,0x9e,0xa4,0xb0,0xa3,0x7e,0x51,0x7f,0xf9,0xb1,0x65,0x98,0xae,0x4d,0x4e,0x83,0xbf,0xa3,0xca,0x50,0xbc,0x61,0x68,0x41,0xf5,0x95,},{0x69,0x64,0xb9,0xc5,0x90,0x3e,0x74,0xe9,0x93,0x28,0xac,0xef,0x03,0x65,0x58,0xee,0xcd,0x33,0x69,0x15,0x0a,0x52,0xe2,0xcb,0xad,0x4b,0xbb,0x97,0xd4,0x61,0xb3,0xdf,0xc6,0xb3,0xe8,0x45,0x58,0x13,0xa4,0xf4,0xbd,0xca,0x46,0x30,0x2e,0x02,0xe6,0x83,0xec,0xea,0x18,0x20,0x17,0x1c,0x53,0x8e,0x54,0xc3,0xde,0x6c,0x95,0x4a,0xa4,0x07,},\"\\x47\\x43\\xc7\\xc0\\x99\\xab\\x81\\x59\\x27\\xb3\\x67\\x4d\\x00\\x54\\xb6\\xde\\x59\\xaf\\x28\\x11\\xab\\xc2\\xcf\\x7f\\xde\\x08\\xf6\\x29\\x29\\x18\\x5a\\xdc\\x23\\x8f\\xad\\xd5\\xe7\\x5a\\xe3\\xba\\x00\\x36\\xff\\x56\\x5a\\x79\\x40\\x5b\\x42\\x4f\\x65\\x52\\x33\\x1e\\x27\\x89\\xd9\\x70\\x9a\\xc1\\xec\\xbd\\x83\\x9a\\xa1\\xe9\\x1c\\x85\\x48\\x17\\x59\\x79\\x58\\xcc\\x4b\\xd9\\x1d\\x07\\x37\\x75\\x07\\xc2\\xc8\\xd3\\xc0\\x06\\xcf\\xeb\\x6c\\x0a\\x6c\\x5a\\x50\\xee\\xe1\\x15\\xe2\\x11\\x53\\xdd\\x19\\x8e\\xa0\\xa3\\xaf\\xf6\\x2b\\x70\\x75\\xd5\\xa4\\x61\\x78\\x87\\x83\\xf0\\x50\\xe6\\x59\\xc5\\x72\\x96\\x3d\\x7a\\x59\\xe5\\xaf\\xaa\\x2b\\x9c\\x50\\x1f\\x43\\xc6\\xac\\x08\\xab\\x47\\x97\\xc4\\x56\\x6d\\x22\\xb9\\x3c\\xdf\\x65\\xa9\\x9a\\x2a\\x1d\\x63\\x8e\\x79\\xf7\\x2b\\x5f\\x46\\x31\\xfe\\x5e\\x9e\\x5f\\x96\\x8f\\x6d\\xb7\\xa1\\x88\\x0d\\xf5\\x1d\\x8f\\xeb\\xc1\\x49\\x42\\x67\\x2f\\x8e\\xa6\\xfc\\x3a\\x72\\x81\\x4a\\x44\\xd6\\x6d\\x14\\x84\\x20\\xa6\\x90\\x00\\xf6\\x8c\\x33\\x0d\\xe5\\xb8\\x0f\\xc6\"},\n{{0x64,0x47,0x54,0x0e,0xd7,0xbe,0x0a,0x11,0xc2,0xa8,0xde,0x79,0x3d,0x83,0xc6,0xe2,0x44,0x98,0x3d,0xb1,0x8d,0x78,0xec,0x9d,0x75,0xf1,0x72,0x9c,0x92,0xe0,0xfd,0xf1,},{0x39,0x12,0x12,0xc8,0xed,0xc4,0xd3,0x34,0xa5,0xbe,0xc8,0x60,0xef,0x0f,0x5e,0xbb,0x5e,0xc4,0x4e,0x8b,0xb5,0x1c,0x0f,0x67,0x41,0x99,0x89,0x59,0xb2,0xb3,0x79,0xfc,},{0x3a,0xb5,0xf8,0x8e,0x2f,0x72,0x76,0xb5,0xb6,0x58,0x3d,0xff,0xba,0x56,0x39,0x99,0x3a,0x90,0x5d,0xbf,0x9b,0x88,0xce,0xea,0xaa,0xae,0x33,0x35,0x80,0x0e,0x4a,0x5f,0x10,0xf8,0x3d,0xa6,0xd6,0x22,0x5a,0x8d,0xbe,0x99,0xae,0x80,0x07,0x50,0x09,0xdd,0x50,0x87,0x86,0xb3,0x97,0x51,0x13,0xdb,0x47,0x8e,0x14,0xba,0x10,0x1b,0xee,0x0f,},\"\\xa4\\x38\\x1c\\x76\\x38\\xc4\\x87\\x99\\xe9\\xb5\\xc4\\x3f\\x67\\xfc\\x3a\\xa3\\xcb\\xb5\\xec\\x42\\x34\\xf3\\x7e\\x70\\xcc\\xcc\\xce\\xd1\\x62\\x7a\\x57\\x68\\x3d\\x1e\\x53\\xf4\\xe0\\x88\\x3d\\x8b\\x46\\x2b\\xf8\\x3f\\x13\\x08\\x63\\x03\\x68\\xc8\\x9b\\x49\\x15\\x33\\xdd\\xb8\\xc9\\xa5\\xb9\\xe8\\x15\\x50\\x02\\xfd\\xd5\\x81\\xa9\\xa5\\xbe\\x0e\\x43\\x0b\\x90\\x86\\xa6\\xbe\\xac\\x47\\x20\\x21\\x0f\\x87\\xb1\\x4e\\x86\\x2d\\x97\\xe5\\xcc\\x69\\x28\\x67\\x86\\xa7\\x58\\x67\\x23\\xf2\\x31\\xef\\x0e\\x3e\\x1b\\x93\\x2d\\xbb\\xa3\\xa1\\x8a\\x0c\\xb2\\x21\\xcb\\x07\\xf8\\x0e\\x6a\\x8e\\x13\\x00\\x05\\x6c\\x13\\xe7\\x02\\xb2\\x3b\\xfb\\x32\\x50\\xec\\x7c\\xc8\\x64\\xd5\\xc7\\xec\\x57\\x86\\x24\\x07\\x09\\xc5\\x60\\x24\\xea\\x6b\\xe5\\xf7\\xb1\\x5a\\x4f\\xa5\\x55\\x5e\\x39\\xa7\\x44\\xa1\\xdc\\x55\\x7d\\xf5\\xb9\\x48\\xdb\\x22\\x0b\\x3d\\x57\\x45\\x74\\x66\\x91\\xda\\xcb\\x44\\x21\\x64\\x1c\\xdc\\xc1\\x2e\\x7e\\xc0\\x45\\x02\\x93\\xf1\\x9e\\xc5\\x7b\\x09\\xcf\\xf1\\x35\\x84\\x7a\\xab\\xe4\\x46\\xa6\\x13\\x32\"},\n{{0x0c,0x58,0x7a,0x81,0x1a,0xdd,0x88,0xb9,0x94,0x45,0x8c,0x3c,0x80,0x8a,0xc4,0xe3,0xa8,0x3a,0xfa,0xb2,0x6d,0x4c,0xff,0x5c,0x96,0x1b,0x9d,0xf0,0xb5,0xc8,0x33,0x44,},{0x06,0x78,0x3b,0x0c,0xdc,0xc5,0x02,0x8c,0x56,0x38,0xbd,0x74,0x8f,0x0b,0xc7,0x6f,0x7e,0x94,0xd1,0xaa,0x20,0x15,0xca,0x94,0x87,0x38,0xa3,0x50,0x04,0x60,0xac,0xa0,},{0x33,0xb4,0xf4,0x27,0x4f,0x20,0x00,0x8a,0x72,0x1d,0x1e,0x8d,0x05,0x4a,0x2b,0x4e,0x95,0x32,0x7e,0x38,0xbb,0x07,0xb3,0x3c,0x4b,0xee,0x7e,0x1c,0xe0,0x20,0xa4,0x42,0xfb,0x26,0x27,0xed,0xa3,0xb7,0xac,0x93,0xcd,0x3a,0xb0,0xb1,0x2b,0x99,0x93,0x5a,0x1a,0x92,0x33,0x11,0x16,0x04,0xda,0x4a,0xcf,0xfb,0x53,0x15,0xb9,0x07,0x12,0x0b,},\"\\xf5\\x6d\\xc6\\xb7\\x60\\x76\\x32\\x5b\\x21\\x26\\xed\\x11\\xd1\\xf0\\x9d\\xec\\xef\\x9d\\x15\\xc3\\x1d\\x0e\\x90\\xcd\\xb1\\xa2\\x7e\\x08\\x9c\\xc5\\x63\\x29\\xf6\\xec\\x3f\\x66\\x5e\\xb6\\x73\\x9e\\xc5\\x67\\x8b\\x3f\\x37\\xee\\x1f\\xb3\\x7d\\xeb\\x9e\\x24\\x00\\x92\\xb7\\xa8\\x8f\\xd2\\x55\\x25\\xac\\xd5\\x5e\\x29\\x4e\\xb1\\x04\\x6f\\x9b\\x1b\\x69\\xa8\\x47\\xeb\\x9c\\xeb\\x7b\\x15\\x93\\xb9\\xf6\\x97\\x8e\\xf6\\x18\\xc1\\x5d\\xe4\\xe0\\x59\\xec\\xc3\\xbf\\xda\\x32\\x97\\xa1\\x9c\\x2d\\xf2\\x02\\xad\\xf7\\x21\\x55\\xcf\\x21\\xea\\xbd\\x03\\x94\\x8d\\xf1\\x51\\x98\\xe8\\xa6\\x8b\\x08\\x84\\xf9\\x3a\\xd5\\xe3\\x6e\\xb0\\x98\\x3c\\xca\\x30\\xe4\\x5a\\x8b\\x4b\\x5f\\xb8\\x13\\x6f\\xde\\xa8\\xa3\\x34\\x1d\\xd7\\x87\\x75\\x40\\xa5\\x57\\xde\\xbf\\x75\\x30\\xcc\\x33\\xae\\xee\\xf6\\x27\\x1c\\x3f\\x0a\\xf6\\xd0\\x97\\x87\\xe8\\x15\\xf2\\xf1\\xdd\\x25\\xce\\x4d\\x2f\\xd0\\x9f\\xfa\\x9f\\x53\\x08\\x1b\\x46\\x9c\\x50\\x0d\\xa4\\xd4\\x41\\x80\\xc0\\x4e\\xb1\\x86\\x93\\x29\\xcb\\xf2\\xd8\\x23\\x18\\x7e\\x83\\x1c\\x24\"},\n{{0x66,0xcf,0x40,0x1a,0x21,0x42,0xfc,0xf4,0xa8,0x01,0x80,0x46,0xcf,0x41,0x40,0xbc,0xa1,0x8d,0x76,0xef,0x62,0x66,0xe7,0xa0,0x24,0x75,0x7d,0xf1,0x72,0xa5,0xd6,0x53,},{0x67,0xd4,0x8d,0xfd,0x23,0x74,0x3c,0xc2,0xca,0x40,0xe4,0xdf,0xd6,0xb8,0xcc,0x5d,0x84,0xbe,0x82,0xdd,0x2b,0x11,0x20,0xcc,0x47,0x6e,0x6a,0xf6,0xf2,0x5e,0xcc,0x98,},{0xd6,0xb0,0xe8,0x0e,0x60,0xbc,0x1b,0x29,0xab,0x8f,0x74,0x80,0x8f,0xc4,0x60,0x84,0x77,0x95,0xcc,0xb8,0x87,0xba,0xc0,0xec,0xaa,0x8e,0x13,0x52,0x97,0xa8,0x50,0x97,0x71,0x2b,0x24,0xb0,0xa1,0xfb,0xaf,0x7a,0x67,0xc5,0xd5,0x30,0xa4,0x7d,0x06,0x43,0xfc,0x87,0x02,0xc0,0x59,0xd2,0x15,0xfb,0x11,0x2d,0xbe,0x47,0x5e,0x5b,0xca,0x0d,},\"\\xda\\xa8\\xef\\xb3\\xfd\\x41\\xf1\\x2f\\xbc\\x55\\xbd\\x60\\x46\\x41\\x57\\xa2\\x6d\\x71\\x86\\x32\\xd8\\x82\\xae\\xdb\\x6b\\xf9\\x8e\\x47\\xdd\\x23\\x37\\x87\\x9e\\x0b\\x46\\x45\\x2e\\x06\\x2e\\x6d\\xfb\\xff\\x3e\\x7b\\xca\\x72\\x89\\xe4\\xef\\x6b\\x3f\\x41\\xd4\\xb0\\x3b\\xdc\\x2c\\x84\\x2a\\xfe\\x97\\xf3\\x02\\x98\\x83\\xed\\x45\\xf6\\x05\\x4d\\xde\\x96\\x90\\x64\\x9a\\xbb\\x2b\\x8d\\xc2\\x8f\\x5f\\xe8\\xce\\xcf\\x80\\xfc\\x1e\\xa4\\x11\\xbf\\xc4\\x0b\\xbf\\x4f\\xd2\\x0b\\x21\\x8c\\xf4\\x7e\\xa8\\xee\\x11\\x8d\\x4d\\x5a\\xef\\xa5\\xc1\\xbf\\xa0\\x8a\\x8f\\xb1\\xb3\\x0d\\x6d\\xe0\\x97\\x7c\\xd1\\x5e\\x50\\x29\\x2c\\x50\\x1f\\x2e\\x71\\xce\\x27\\x40\\xff\\x82\\x8b\\x84\\x32\\xda\\x5a\\x59\\x4b\\xab\\x52\\x23\\x76\\x0b\\x64\\x79\\x2e\\xd3\\xa6\\x9d\\xd7\\x5e\\x28\\x29\\x23\\x49\\x43\\x65\\x65\\x13\\xdf\\x1a\\x17\\xa2\\xa0\\x67\\xa9\\xa8\\xea\\xa6\\x4e\\x19\\x56\\x9f\\x46\\x93\\x9d\\x34\\xb9\\x92\\x71\\xae\\x50\\xa4\\x7d\\x7d\\xbc\\xa3\\x62\\x0c\\x81\\x25\\x5b\\x0e\\x1f\\xd1\\xf3\\xce\\xc8\\x51\\xf1\\xb1\\x1b\\x35\"},\n{{0x5d,0xbf,0x88,0x5a,0xa5,0x98,0xe8,0x95,0x57,0x1f,0x5f,0x65,0x09,0x0b,0x72,0x32,0x3e,0x9d,0x70,0xb0,0xf5,0x81,0x10,0x68,0x7a,0xfb,0xbc,0x38,0x3a,0xfe,0xdc,0xac,},{0xfa,0x17,0xeb,0xa7,0x6e,0x3b,0xc3,0xea,0x6d,0xab,0x3a,0x5b,0x12,0x0d,0xc5,0xec,0xb9,0xae,0x6f,0x00,0x13,0x8f,0x7d,0x36,0xdd,0xa9,0x26,0x8b,0xc4,0x72,0x21,0x74,},{0xe1,0x42,0x9d,0xab,0x2e,0x42,0xcd,0x03,0x5b,0x7f,0xc6,0x02,0xef,0xd6,0xba,0xf9,0x47,0x06,0xf1,0x6e,0xaf,0x2f,0x8b,0x5f,0xed,0x32,0x92,0x39,0xe8,0x75,0x60,0x5f,0xb1,0x72,0xf5,0xdd,0x9a,0xe2,0xbc,0x2e,0xb4,0x2e,0xb4,0x74,0x56,0x7e,0x29,0x2f,0x52,0x06,0xe8,0x2e,0x69,0x4b,0xca,0x0d,0x6d,0x43,0x3b,0x86,0x76,0x34,0xcb,0x0d,},\"\\x1e\\x0b\\x6c\\xf1\\x5c\\xe0\\x33\\x37\\x17\\x9c\\x02\\xd6\\x54\\x08\\xdf\\x5b\\xe9\\x20\\x0c\\x37\\x82\\xb6\\x00\\x4a\\xf9\\x4e\\xa4\\xde\\xcb\\x25\\x79\\x99\\xd6\\xfd\\xff\\x30\\x1d\\x11\\xd0\\x0c\\x98\\xc3\\x72\\xfa\\xc0\\xd0\\x26\\xcb\\x56\\xdf\\xef\\xe3\\xde\\xf7\\xeb\\x99\\xac\\x68\\xd6\\x96\\x8e\\x17\\x12\\x4d\\x84\\x46\\xf5\\x3e\\x8d\\x2d\\x3d\\xd8\\x90\\xd3\\x7a\\x23\\xc7\\xe0\\xb8\\x3a\\x48\\x4b\\x3c\\x93\\xbd\\xdf\\x6c\\x11\\x8e\\x02\\x81\\x95\\x9d\\x27\\xbd\\x87\\xd3\\x7e\\x84\\x3d\\x57\\x85\\xf4\\xa4\\x07\\x71\\x39\\x84\\x94\\xe6\\xc4\\x32\\x2f\\xbb\\x67\\x5c\\x1d\\x47\\x93\\x21\\x03\\x21\\x48\\xf7\\xfe\\x52\\x56\\x4d\\xdf\\x7a\\xe7\\xac\\x26\\x9d\\x0c\\xd2\\xe5\\x52\\xfe\\xc5\\x89\\xae\\xae\\x0f\\xb9\\x3f\\xe3\\xee\\xae\\xf0\\x85\\x60\\x96\\xcf\\x4f\\x6b\\x34\\x97\\xe7\\x23\\x5c\\xc8\\x49\\x4d\\x81\\x0a\\x0b\\x46\\xc5\\xea\\xc8\\x7f\\x18\\x7e\\x50\\x5b\\xb7\\x76\\x4f\\x80\\x45\\xc9\\x54\\x19\\x83\\xf7\\xb0\\x25\\x69\\x80\\x09\\xa2\\x3d\\x9d\\xf0\\xbd\\x1a\\x47\\x3c\\xbe\\xe4\\xcf\\x5e\\x94\\x88\\xec\\xbc\"},\n{{0x84,0xb3,0xae,0xdd,0x47,0x97,0xa5,0x65,0xc3,0x51,0xde,0x7d,0xfa,0x07,0x00,0xb9,0xff,0x7c,0x4d,0x72,0x91,0xc8,0x80,0x8d,0x8a,0x8a,0xe5,0x05,0xcd,0xd2,0x25,0x90,},{0xd7,0xad,0x72,0xca,0xa7,0xc2,0x22,0x09,0xec,0x46,0x78,0xd1,0x1d,0x55,0x90,0xa6,0xcb,0x28,0xa0,0x71,0x17,0xfe,0x5a,0xef,0x57,0xb5,0x07,0x51,0x58,0x32,0x01,0xa5,},{0x92,0x20,0xf0,0xed,0xaa,0xae,0xe1,0xb8,0x76,0x35,0x0d,0xbe,0x92,0x66,0x06,0x17,0x67,0xb8,0x62,0x96,0xc3,0x51,0xd4,0xca,0xc9,0x9d,0x07,0xcd,0x61,0x2c,0x6e,0xfb,0x24,0xf8,0xf9,0xb0,0xb9,0x75,0xf9,0x5c,0x42,0xc5,0xb6,0xaf,0xed,0xc8,0x92,0xf8,0x7e,0xfe,0xdd,0x39,0xd5,0x16,0x02,0x94,0xc2,0x76,0x58,0xbd,0xcf,0x42,0x85,0x0b,},\"\\x53\\x25\\x67\\xff\\xa5\\x3b\\x5c\\x0f\\xcd\\x29\\xc3\\x94\\x99\\xd2\\xe7\\x8e\\xcd\\x20\\xe6\\x31\\x23\\x49\\x92\\x40\\xe7\\x75\\x08\\x8b\\x39\\x4d\\xc6\\x5c\\x8b\\xaa\\xa0\\xfe\\x8f\\x6a\\xa7\\xe7\\x01\\x81\\xf9\\xe1\\x0a\\xdd\\x8b\\x4a\\x8b\\xeb\\x0b\\x2e\\xc3\\x8a\\x43\\x30\\x9f\\x10\\x0c\\xd4\\xbe\\x91\\xc6\\xf4\\x8e\\x79\\xdc\\x0a\\xee\\x93\\xa1\\x5c\\x94\\x03\\x77\\x3b\\x35\\x4a\\x8d\\x42\\xed\\x48\\xd8\\xf2\\x76\\x23\\x0f\\xa6\\xde\\x5a\\xda\\x50\\x1e\\xe0\\xa6\\x53\\xb4\\x45\\x8f\\x0e\\xcf\\x6d\\x5b\\x3c\\x33\\xe2\\x14\\x1c\\x66\\x2f\\x6e\\xa0\\x55\\xf7\\x41\\xe5\\x45\\x86\\x91\\x7d\\x2e\\x0c\\x4e\\xb2\\xb5\\x66\\x21\\xf9\\x66\\x5f\\xef\\x32\\x46\\xf0\\xbd\\x80\\x0b\\x53\\x3e\\x3b\\xc6\\x15\\xc4\\x02\\x1f\\x8d\\x0e\\x2a\\xd2\\x33\\xa1\\x1e\\x77\\x36\\xc4\\x93\\xac\\xc3\\x1f\\xae\\xe7\\x6a\\x09\\x7d\\xc4\\x0d\\xb9\\xef\\xc2\\x24\\x46\\xea\\xcf\\x1c\\xc1\\x8f\\x51\\xfd\\x10\\x23\\x6a\\x2f\\x94\\x2d\\x0a\\x53\\xc3\\xce\\x20\\x91\\x08\\xb5\\x93\\x8c\\x0a\\x9e\\x53\\x6b\\x89\\xef\\x0a\\xd6\\xb4\\x05\\xa1\\x0f\\x22\\xc3\"},\n{{0x69,0x50,0xbf,0xcf,0x48,0x0b,0x98,0xea,0x18,0xa2,0xd5,0xae,0x5b,0xa6,0xe7,0x66,0x8f,0x4c,0x28,0x3f,0xf2,0x71,0x13,0x57,0x74,0x0f,0xfe,0x32,0xcf,0x25,0x81,0x9a,},{0x8e,0x4c,0x6f,0x23,0x3f,0x7b,0x86,0x32,0x1c,0x9d,0x67,0x99,0xba,0xc2,0x8a,0xaf,0xcd,0x25,0x03,0xd7,0xaa,0x0a,0x7b,0xde,0xd8,0x72,0x27,0x27,0xfb,0xbc,0xae,0xb8,},{0x94,0xde,0x5d,0xf7,0xa2,0x5e,0xcd,0x70,0x20,0x5d,0x40,0xbc,0x94,0x99,0xfc,0x7c,0xd7,0x13,0x65,0x68,0x06,0x0a,0x41,0x9a,0x93,0xbe,0x6e,0x31,0x86,0x64,0xbb,0x6d,0xfc,0xe6,0x0e,0x2d,0x4e,0x63,0x3f,0x7e,0xc1,0x48,0xfe,0x4f,0x83,0x4e,0xd2,0x77,0xc1,0xfe,0xc4,0xc4,0xe2,0xa8,0x6f,0x44,0xc4,0x58,0x9c,0x81,0x78,0x88,0xdb,0x00,},\"\\xa4\\x01\\xb9\\x22\\xab\\xa5\\x7e\\xe0\\xc6\\xac\\x1c\\x8f\\x1b\\x48\\x29\\x6a\\x85\\x62\\xee\\xf1\\x37\\x52\\x68\\x93\\x88\\x6a\\x08\\x30\\x6e\\x22\\x03\\x66\\x77\\x88\\x61\\x8b\\x93\\x98\\x64\\x46\\x7a\\x31\\xf1\\x6e\\xdc\\xe1\\x52\\xa4\\x2c\\x25\\x54\\x6b\\x64\\x0e\\xa8\\xbe\\xd1\\x89\\xa4\\xf8\\x98\\x86\\xa3\\x7f\\x10\\x69\\x11\\xea\\xe1\\xf5\\x00\\x81\\xbf\\x79\\x5e\\x70\\xc6\\x50\\x44\\x37\\xd2\\xa8\\x0c\\xb8\\x39\\x47\\x9e\\xcb\\xb8\\x7c\\x12\\x9b\\xcc\\x5f\\xe3\\x1d\\x71\\x6e\\xf9\\x78\\xc2\\x06\\xd7\\xf0\\x8a\\x79\\x34\\x66\\x59\\x4f\\x4d\\x75\\xe2\\x15\\xbb\\x63\\x74\\x59\\x6f\\x8e\\x7d\\x00\\xee\\xa7\\x24\\x78\\x09\\x43\\xe8\\x9b\\xd3\\x86\\x3c\\x95\\x1b\\xbd\\x24\\xef\\xee\\x23\\xc9\\x7c\\x2c\\x79\\x7c\\x7f\\xaf\\xbf\\x8f\\x2c\\x8b\\x43\\xf3\\x7a\\x5f\\x88\\x11\\x29\\xa0\\x95\\x73\\xfa\\x7a\\x03\\x4a\\x28\\x5e\\x80\\xdc\\x4b\\xa4\\xbc\\x95\\x64\\xa4\\xdc\\xed\\xeb\\x33\\x16\\x7e\\x0b\\x30\\xc5\\xa0\\x0b\\x9a\\x10\\x9a\\x22\\x31\\xcf\\xa0\\x01\\x2b\\x29\\xb2\\xb3\\x45\\x0b\\x89\\x2e\\xcc\\xef\\x08\\x08\\xe5\\x03\\xf8\"},\n{{0x61,0xb2,0x60,0xf5,0xb8,0x48,0xb2,0x71,0xef,0x48,0xe5,0xa5,0x6d,0x29,0x74,0x32,0xd8,0x9f,0x2a,0xb8,0x5b,0xd5,0x38,0xfa,0x66,0x88,0x70,0xd0,0x56,0x02,0x20,0xe5,},{0x60,0x86,0xfe,0x87,0x35,0xf3,0x99,0xf1,0xaf,0x2e,0x39,0x5e,0x0f,0xdf,0xb5,0x62,0x9e,0xbc,0xb0,0x4b,0x6e,0xd4,0xa5,0x4a,0x9e,0x47,0x05,0x2c,0x6e,0x81,0x91,0xd4,},{0x98,0x28,0xfe,0xc8,0xff,0x5c,0xf8,0x5a,0x98,0xf4,0x50,0x77,0x0b,0x5b,0xdb,0x4b,0x80,0xda,0xca,0x44,0x37,0x9d,0x8f,0x53,0xc9,0x1c,0x34,0x8e,0x22,0xdf,0x64,0xac,0x48,0xf2,0xb6,0xe2,0xa7,0xb3,0xb6,0x42,0xbc,0x81,0x93,0xa1,0x94,0x31,0x62,0x29,0xe6,0x94,0x47,0xed,0x24,0x1c,0xd4,0x23,0xd8,0x3b,0x6f,0xe7,0xb2,0xd4,0x4b,0x00,},\"\\x28\\x26\\x29\\x5d\\x79\\x94\\x5f\\x67\\x54\\x76\\xbc\\x4d\\x45\\xef\\x80\\x0d\\x80\\xb1\\xf0\\x39\\x8e\\x4b\\xe6\\x0e\\x3d\\xe4\\x57\\x1e\\xd1\\x08\\xdf\\x98\\x9f\\x03\\x2d\\xe6\\xc2\\x34\\x5d\\x99\\x48\\xd6\\x77\\x92\\x7e\\xa0\\xb8\\xcf\\x1a\\x5c\\xa3\\x6f\\xd5\\xf2\\x3c\\x25\\xdc\\x0d\\x2a\\xb5\\xbd\\x56\\x5a\\x54\\xaf\\x46\\xfd\\x97\\xd3\\x38\\xd7\\x70\\xe3\\xa7\\xb4\\x7e\\xfb\\x54\\xc0\\x7a\\x16\\x64\\x70\\x77\\x71\\xeb\\x4e\\x37\\xd9\\xd7\\x0b\\xa7\\x79\\x25\\x1d\\xcd\\xcd\\x3b\\xf6\\xd1\\x24\\x8a\\xde\\xc5\\x3f\\x78\\x72\\x59\\xc4\\xd5\\x94\\xd5\\xfd\\x4c\\xed\\x8e\\x3d\\xb7\\x62\\x1d\\x49\\x65\\xd4\\x82\\x98\\x17\\x81\\x24\\x93\\x1a\\x3d\\x0c\\xd2\\x69\\xb2\\xd5\\x3b\\x7c\\xd2\\x61\\xb9\\x6d\\x37\\x0c\\x5d\\x96\\x93\\xc8\\xad\\x13\\x3e\\xd5\\x89\\x45\\xee\\x35\\x40\\xe1\\x06\\x25\\xd9\\x24\\xae\\xba\\x9b\\xda\\xfc\\x65\\x61\\x00\\xaa\\xb2\\x76\\xfa\\x99\\x6b\\x1d\\xb4\\x77\\xbf\\x85\\xea\\x55\\x90\\x81\\xd5\\xb4\\xc7\\x30\\x7d\\xc1\\x59\\x56\\x54\\xac\\xa8\\x2f\\x7b\\x6d\\x2d\\xda\\xf7\\x35\\x7c\\x15\\xa4\\xd7\\xd8\\xb9\\x08\"},\n{{0x93,0x6d,0xc1,0xce,0xf6,0xa3,0x10,0x74,0x7f,0x35,0x00,0x88,0x05,0x5a,0x39,0xaa,0x76,0x2d,0x9a,0x4b,0x52,0xc8,0xc8,0xe4,0xc6,0x82,0x79,0x43,0x80,0xc2,0x72,0x5c,},{0x03,0xb3,0x18,0x00,0x41,0x2d,0xf4,0xd5,0x6f,0x15,0x32,0xc0,0x58,0x28,0xc0,0xb7,0x25,0x28,0xa6,0x7a,0x78,0x1b,0xef,0x4c,0x06,0xc1,0xfb,0x6f,0xf2,0xce,0x32,0x4b,},{0x3f,0x99,0x4b,0x8e,0xf5,0x28,0xf6,0x42,0x1c,0x6a,0x6a,0x22,0xe9,0x77,0xad,0xe5,0xce,0xe8,0x87,0x26,0x3d,0xe3,0x8b,0x71,0x9a,0xcd,0x12,0xd4,0x69,0xbf,0xd8,0xc3,0xf6,0x8e,0x7a,0xc0,0x7d,0x2f,0xae,0x80,0xa2,0x09,0x27,0x78,0xdf,0x0b,0x46,0x35,0x37,0xad,0x3a,0x05,0x51,0x99,0x7a,0x3d,0x5b,0x51,0xf8,0x32,0xd9,0xc8,0x23,0x0b,},\"\\xeb\\x58\\xfe\\x86\\xc4\\xef\\x34\\x9c\\x29\\xae\\x6f\\xb0\\x4f\\x10\\x85\\x0e\\x38\\xc6\\x82\\x3d\\xbe\\x64\\xa0\\x9a\\x5b\\xf1\\xe0\\xce\\x60\\x0d\\x39\\x4e\\xfa\\x6f\\xb9\\x6e\\xd6\\xa8\\xf2\\xc9\\xd4\\xbe\\xc0\\x5e\\x6a\\x5e\\xbd\\x5a\\x1b\\xf4\\xd0\\xc5\\x1d\\xb9\\x34\\xe5\\x7b\\x79\\xe5\\xc6\\xa8\\x79\\xd9\\x75\\x19\\x7d\\xbb\\x10\\x47\\x5f\\x65\\xc7\\xf8\\xa8\\xc6\\xa7\\x7a\\x42\\x03\\x84\\xb5\\x06\\x2a\\x27\\x40\\xf1\\x40\\x17\\x40\\xee\\x0f\\x5e\\x04\\x3a\\xad\\x7a\\x2a\\x2b\\x42\\x60\\xc5\\xd9\\x07\\xf7\\x05\\xed\\xaf\\x65\\xb0\\xe3\\x75\\xdf\\xc7\\xb0\\x0b\\xd6\\x60\\xdb\\x61\\x47\\xf2\\xeb\\xe8\\x70\\xa0\\xee\\x18\\xdc\\x2b\\xa3\\xc9\\x2b\\x0b\\x76\\xfa\\xe2\\xb9\\x09\\x32\\xcd\\xb6\\xc1\\x49\\xe4\\x6f\\x3f\\xee\\xcf\\x4c\\x26\\xf0\\x44\\x1f\\x3a\\x9e\\x00\\x66\\x78\\xae\\xcf\\xf8\\xcc\\xae\\xca\\xed\\xa7\\x3a\\x18\\xa6\\x8a\\xc9\\x88\\xb6\\x2e\\x83\\xa9\\xbb\\x51\\x88\\xae\\xde\\x38\\xdf\\x77\\xa9\\xa1\\x64\\xab\\xbd\\xd9\\xd5\\x8e\\x52\\xa6\\xca\\xf7\\x22\\x23\\x89\\xf1\\x98\\xe8\\x5f\\xbf\\x96\\x62\\x36\\xdc\\xdb\\xd4\\xc1\"},\n{{0xf8,0x9e,0xed,0x09,0xde,0xc5,0x51,0x36,0x1f,0xa4,0x6f,0x37,0x59,0x73,0xd4,0xfb,0xfa,0x5c,0x5c,0x12,0xf1,0xb5,0xe5,0xab,0xf4,0x5c,0xfa,0x05,0xff,0x31,0xa3,0x40,},{0x3e,0x0e,0xfd,0xca,0x39,0x19,0xfa,0x10,0xd4,0xa8,0x49,0xce,0xf1,0xde,0x42,0x88,0x51,0xbd,0x08,0xef,0xd2,0x48,0x59,0x4f,0xd8,0x9c,0xde,0xb9,0xde,0xee,0x43,0xb0,},{0x89,0x7e,0x6f,0x27,0x97,0xc3,0xf3,0x26,0xd2,0xcd,0xb1,0xd2,0x67,0x3d,0x36,0x06,0x31,0xf0,0x63,0x30,0x45,0x80,0xff,0x5b,0x4e,0xb4,0x3d,0x39,0xad,0x68,0x51,0x83,0x4c,0x9c,0xf8,0x91,0xd9,0xf0,0x90,0x5b,0xf8,0xde,0x07,0x5f,0x76,0x35,0xdf,0xca,0x60,0x1a,0xdc,0x0f,0x14,0xe7,0xb2,0xc7,0x6f,0x75,0x71,0xbf,0xa4,0x68,0xed,0x0c,},\"\\x4c\\xf9\\x77\\x3d\\xa0\\x5f\\xd3\\x22\\xfc\\x14\\x7b\\xe9\\x00\\xef\\x5c\\xf2\\x56\\xc8\\x8a\\xfd\\xad\\x4b\\x08\\xc2\\x30\\xdf\\xc8\\x98\\x1f\\xb6\\x9f\\x47\\x6f\\x7d\\x45\\xef\\x7c\\x90\\x06\\xbc\\x10\\x03\\x2b\\xa5\\x34\\x36\\xac\\x22\\x84\\x3e\\x0d\\x76\\x28\\x9c\\xf6\\x8f\\x98\\x18\\xfa\\x64\\x03\\x1d\\x4b\\x40\\x95\\x50\\x59\\xaa\\x69\\x11\\x09\\x15\\x88\\x9f\\x5e\\x22\\x73\\x2a\\x13\\x43\\x91\\x25\\x81\\xab\\x3b\\x11\\xa3\\xba\\xe7\\xa4\\x71\\x35\\x95\\x08\\x59\\x65\\x75\\xf8\\x88\\x16\\x0b\\xee\\xf9\\x66\\xe5\\x70\\x8f\\x0e\\x31\\x47\\xea\\xcf\\xce\\xc1\\xca\\xa3\\xef\\x24\\x0c\\x5e\\x0a\\x14\\xc1\\x86\\x54\\x6c\\x8e\\xeb\\x64\\x65\\x83\\x50\\xb1\\xaf\\xfc\\x0c\\xfd\\x2a\\xc2\\x13\\xaf\\x67\\x0a\\xfc\\xa7\\xbb\\xc9\\xdd\\xdd\\x28\\xa4\\x65\\xb5\\x86\\xe6\\x9c\\x38\\x8c\\xd7\\x34\\x78\\xd6\\x8e\\xfb\\x32\\x2b\\xdf\\x86\\xd9\\x21\\x30\\x11\\xe7\\x11\\xb2\\xb9\\x5f\\xef\\xa7\\xbb\\x9b\\x59\\x39\\x76\\x17\\x06\\xaa\\x71\\x21\\x02\\x49\\x06\\x42\\x0b\\xdd\\xf1\\xd8\\x80\\x0a\\x43\\x38\\xd9\\x38\\xfa\\x13\\x7c\\xf2\\x7e\\x9f\\xfc\\x51\\xc6\"},\n{{0x40,0x07,0x96,0xef,0x60,0xc5,0xcf,0x40,0x84,0xde,0xe1,0x80,0x1c,0x4a,0x19,0x75,0xe4,0x82,0xe7,0x0a,0xef,0x96,0x1c,0xd4,0x2e,0x2f,0xd5,0xa3,0xfa,0x1a,0x0f,0xbe,},{0xf4,0x7d,0xa3,0x81,0x28,0xf2,0xd0,0x12,0xcc,0x57,0x97,0x57,0x1d,0x47,0x9c,0x83,0xe7,0xd8,0xa3,0x40,0x98,0x02,0xf9,0xa7,0xd9,0x76,0xc2,0x70,0x67,0xcb,0xbe,0x43,},{0x84,0xd3,0xaa,0x3f,0x36,0x18,0x44,0x39,0x67,0x54,0xd8,0x0d,0x9f,0xa0,0x5b,0x8b,0x2f,0xa4,0xab,0xf3,0xa0,0xf3,0x6b,0x63,0x9b,0xee,0x9c,0xfb,0x5c,0x85,0x30,0xa3,0xa9,0xcc,0x34,0x67,0x7f,0x92,0xa9,0x13,0xc4,0x1e,0x80,0x0f,0x2e,0x80,0x41,0xf7,0x66,0x6d,0x07,0xed,0x85,0xf1,0x6a,0x57,0xd8,0x17,0xb1,0x24,0x1f,0xc5,0xee,0x04,},\"\\xc4\\x73\\x32\\x5e\\x78\\x5b\\x27\\xdf\\x44\\x71\\xee\\xfb\\x9e\\xbe\\xbd\\x64\\x61\\xd5\\x70\\x80\\x01\\x81\\x10\\x0f\\xf3\\x6c\\xaf\\x3c\\x38\\xf6\\x7c\\x19\\x21\\xb1\\x57\\xec\\x8e\\x61\\x26\\xf9\\x55\\xae\\xbd\\x90\\xea\\x3f\\xe5\\x38\\x5f\\x80\\x42\\xcd\\x70\\x4b\\x27\\xcc\\x1d\\x69\\x78\\xc0\\xe2\\xa2\\x96\\x69\\x5f\\x5e\\xf9\\x7b\\x7c\\x2e\\x16\\xae\\x4f\\xf4\\xd0\\x63\\xc6\\x88\\xd7\\xf4\\x6e\\x96\\x4e\\x1f\\x0a\\x00\\x50\\x3f\\x35\\x73\\x45\\x97\\x76\\x83\\xd6\\xe4\\xc3\\x42\\x3d\\x56\\xbd\\xb6\\xce\\x86\\x4b\\x69\\x87\\xe0\\x85\\xe8\\x3e\\x70\\xc7\\xc1\\xa1\\x4e\\x0e\\x41\\x3f\\x59\\x2a\\x72\\xa7\\x1e\\x01\\x7d\\x50\\x5b\\x64\\xc2\\x4f\\x1a\\x1a\\x6b\\x81\\x3e\\x06\\x4e\\x6e\\x0c\\xf8\\xbd\\x45\\x71\\xd0\\xff\\x2f\\x26\\x7a\\x6a\\x13\\xe0\\xcd\\x43\\x04\\x63\\xb6\\xca\\x3b\\x88\\xf0\\xcd\\x40\\xb0\\xfb\\x83\\xd5\\xbe\\xdf\\x6f\\x7d\\x47\\xe1\\x70\\xe8\\x7d\\x0a\\x75\\x00\\x93\\x69\\x3e\\xda\\x23\\x2a\\x6d\\xaf\\x98\\x12\\x57\\x27\\xb9\\x58\\x8e\\xcb\\x89\\x4a\\xe3\\x73\\xba\\xe3\\xa4\\x45\\xa1\\x06\\x30\\x64\\x69\\xa4\\xc2\\xcd\\x77\\xff\"},\n{{0x67,0x03,0xa6,0x23,0x2c,0x5e,0x2e,0x65,0xe0,0xab,0x3b,0x92,0xe2,0xaa,0xf9,0xf5,0xfb,0xd3,0x3f,0xb4,0x69,0x88,0x04,0x7d,0x6f,0x4d,0x0f,0xf5,0x38,0x7f,0xa0,0x29,},{0x04,0x7c,0xff,0xca,0x8b,0x7b,0x11,0xac,0x6e,0xac,0xc0,0xea,0xa0,0xc5,0xb7,0x3c,0x75,0xb9,0xc6,0x37,0x95,0x69,0x73,0xaf,0x9d,0x97,0xb2,0xdd,0x5b,0x60,0x5d,0x6f,},{0xca,0xe9,0x68,0x79,0xe5,0xb6,0x03,0xbe,0x86,0x66,0x09,0xd4,0xa0,0x53,0xbf,0xa1,0x2a,0x51,0x37,0x8e,0x99,0xb2,0xa2,0x81,0x2e,0x47,0x89,0x26,0x7d,0x8f,0x32,0xf4,0x73,0x24,0x3f,0x8a,0xf7,0x4b,0x9b,0xe7,0x3f,0x47,0xde,0xa5,0x0f,0x0d,0x16,0x5e,0xbf,0x49,0x45,0x8b,0x73,0xe5,0x3d,0x88,0x58,0x0c,0x19,0x1a,0x18,0x2d,0x19,0x04,},\"\\xa2\\x6b\\x30\\xa7\\x69\\x19\\x79\\x32\\xa3\\xa6\\x28\\x54\\x96\\x8d\\x76\\x01\\x51\\x61\\x23\\x66\\x77\\x8d\\xc9\\x94\\x57\\x6a\\x2e\\x0e\\x03\\x55\\x49\\x6b\\x46\\x20\\x0e\\x50\\x69\\x48\\xa0\\xd1\\x02\\xb6\\x65\\x1b\\x2e\\x73\\x34\\xca\\x6c\\x6e\\xae\\xf8\\xbc\\xa4\\x4b\\x42\\x59\\x70\\xa0\\xb3\\x7d\\x6b\\xde\\x0d\\xa9\\xd3\\xc1\\xb9\\xf5\\x1c\\xbb\\x25\\xbc\\x33\\x5c\\xd6\\xfa\\x92\\x8a\\x74\\xf2\\xc0\\xdc\\x2c\\x6e\\x99\\xd3\\x7a\\x12\\x86\\x3a\\x47\\x4d\\x4d\\xf4\\x3a\\xad\\x35\\x41\\x5f\\xfc\\xaa\\x24\\xd8\\xc2\\x9f\\x91\\x45\\x72\\xab\\x2a\\xbe\\xc3\\x89\\x2d\\xb4\\x9e\\x67\\x9c\\x5e\\xa2\\x20\\xc2\\xf5\\x19\\xa7\\xd0\\x33\\xac\\x1a\\x2c\\x5a\\x46\\x78\\x69\\xe3\\x0e\\xda\\x3d\\x26\\x35\\xca\\x86\\x34\\x31\\x47\\x3f\\x95\\x8d\\x55\\x2b\\xdc\\x55\\x82\\x35\\x2c\\x29\\x0d\\x0c\\xe4\\xfa\\x9c\\xfd\\x0a\\xd4\\x27\\x99\\xc2\\x27\\xec\\x90\\xb7\\xc9\\xe5\\xdb\\x9f\\x5a\\x7b\\x6d\\x56\\x92\\x12\\xee\\xd9\\x4d\\x32\\x33\\x26\\x80\\x5f\\x2b\\x3a\\x00\\x10\\xd6\\xc1\\x1e\\xb4\\x10\\x7c\\x82\\x83\\x03\\x76\\x52\\xf5\\x0d\\xc0\\x67\\xb6\\xdc\\x81\\xf4\\xdb\"},\n{{0xe0,0xe7,0x2f,0x8f,0x17,0x86,0x33,0x62,0x67,0x33,0xbc,0xbd,0xa2,0xad,0x2a,0x50,0xe6,0x53,0x89,0x0f,0x15,0x35,0x9b,0x6c,0x22,0xfc,0x73,0x45,0xad,0x33,0x31,0x09,},{0xd1,0x3c,0xee,0x54,0x0d,0x84,0xb5,0x66,0x7d,0x51,0x6f,0xe7,0xec,0x72,0x39,0xbf,0x8d,0xa9,0x15,0x46,0xee,0x79,0x1f,0x84,0xed,0xd8,0xff,0xcf,0x3a,0x08,0x3e,0x76,},{0x14,0x55,0x21,0x71,0xb9,0x52,0x45,0xac,0x0f,0x0e,0x5a,0x6e,0x7a,0x2f,0x54,0x17,0x21,0x06,0x8d,0xb6,0x50,0xc6,0xda,0xda,0x04,0xc2,0x8c,0xab,0x7c,0x49,0x19,0x5f,0x64,0x36,0x71,0x21,0x44,0xcb,0x31,0x91,0x3c,0x56,0x2e,0x30,0xc3,0x9d,0x8a,0x85,0x49,0xfb,0x64,0xff,0xea,0x81,0xc7,0x44,0x51,0x43,0xb5,0xf2,0x32,0x86,0xda,0x05,},\"\\x79\\x1f\\xd6\\x13\\xc1\\x09\\x52\\x92\\xc8\\xa4\\xa2\\xc8\\x6b\\x47\\xae\\x02\\x61\\x55\\xb8\\x46\\x5b\\x60\\x7d\\xbb\\x41\\x64\\x77\\xef\\x79\\xa2\\x97\\xc9\\xd7\\x75\\x8c\\xe3\\x4a\\xf9\\xdc\\xbf\\x1c\\x68\\x47\\x4f\\x30\\x90\\x9f\\xbe\\x74\\xb7\\xba\\x42\\x96\\x32\\xf2\\x40\\x3a\\xad\\x83\\x2b\\x48\\x6b\\x72\\xc2\\x30\\x54\\xad\\x42\\xf7\\x65\\x3a\\x9d\\xdb\\x45\\x6c\\xc7\\x91\\xf3\\x48\\x88\\x6a\\x7a\\xe5\\xdc\\xec\\x7c\\x0b\\xa8\\x15\\xf7\\xa9\\x3a\\x10\\xfe\\x33\\x1e\\x90\\x3b\\x97\\x0f\\x7b\\x50\\x28\\xbe\\x49\\xd1\\x4b\\xc5\\x62\\x0d\\x63\\x79\\x26\\x72\\xb9\\x8b\\x94\\x88\\xc6\\x7a\\xe1\\x66\\x46\\x69\\x3e\\x11\\x20\\x47\\xf0\\xac\\x89\\x21\\xff\\x56\\x1c\\x92\\xdd\\x05\\x96\\xd3\\x2d\\xf0\\xa6\\xe5\\x07\\xac\\x1b\\x07\\xde\\x51\\x6c\\x98\\x42\\x8d\\x57\\x0a\\x37\\xdb\\x9b\\xcd\\x7c\\x7e\\x61\\xc6\\x94\\x8a\\xb3\\xfe\\x91\\x25\\x0d\\xd1\\xd5\\xbd\\x67\\x12\\x75\\xdf\\x9a\\x97\\x2f\\x22\\xc2\\xba\\x36\\x80\\x47\\x47\\xae\\xc1\\xea\\x24\\x16\\xc1\\xf4\\x1a\\xb8\\x7b\\xef\\xde\\x31\\x62\\x9b\\x2d\\x43\\x31\\x7c\\xe4\\x1c\\xda\\x03\\x62\\x62\\x86\\xc0\"},\n{{0x54,0x4d,0xaf,0xd9,0x96,0x0d,0x82,0x97,0x56,0xc6,0xd4,0xb3,0xea,0xdd,0x44,0x37,0x5f,0xe7,0x80,0x51,0x87,0x6b,0xf9,0x78,0xa3,0x81,0xb0,0xde,0xca,0xaa,0x80,0x96,},{0xae,0x4f,0x64,0x25,0xc1,0xb6,0x7c,0xcb,0x77,0xf9,0xaa,0xcf,0xea,0x28,0xea,0xef,0x76,0x9c,0x8c,0xac,0xee,0x03,0x52,0x05,0xcd,0xcd,0x78,0x7e,0x8d,0x07,0x62,0x9d,},{0xa2,0xae,0x11,0x7c,0x8d,0xe4,0xca,0x6d,0x6f,0xe7,0x5e,0x46,0x60,0x23,0xbd,0x55,0x0c,0x26,0xfe,0xdd,0x3e,0x74,0xca,0x13,0xad,0xb6,0x25,0xf2,0x72,0xe1,0x75,0xf1,0x4d,0x5d,0xf5,0x50,0xac,0xe7,0xd8,0x22,0x88,0xef,0xef,0xab,0xf9,0x63,0x11,0xa1,0x23,0xbe,0xe2,0x38,0x89,0xad,0x37,0x11,0xbf,0xf2,0xb8,0x08,0x79,0x46,0xbf,0x0e,},\"\\x44\\x7f\\xe7\\x34\\x4c\\xad\\x1f\\xae\\x09\\xd6\\xa7\\xd0\\x5f\\x09\\xd5\\x03\\xc1\\xb3\\xd3\\xd5\\xdf\\xa5\\x84\\x81\\x0c\\x35\\xbc\\x41\\xe4\\x95\\x56\\x93\\x70\\x61\\x54\\xe2\\xd7\\x51\\xb2\\xf1\\xb5\\x25\\xe1\\xa1\\x45\\x47\\xba\\x7f\\x8b\\x23\\x20\\x88\\xa6\\xfc\\x92\\x27\\x02\\xd9\\x3a\\x11\\xcd\\x82\\x94\\x9c\\x27\\xbe\\xd6\\x45\\xdc\\x35\\x1f\\xb4\\xc1\\x24\\x2c\\xf4\\x1d\\x01\\x57\\x54\\x12\\xe7\\x92\\xae\\xd2\\x14\\x53\\x1d\\x94\\xfd\\x66\\xe0\\x3d\\xd3\\x2e\\x97\\x2f\\xd7\\x7f\\x69\\x47\\xa3\\x53\\xe1\\xae\\x5e\\x00\\xf5\\xa6\\xca\\x77\\x99\\x24\\x72\\xf0\\x96\\xb6\\xe7\\x47\\x5f\\xe5\\x34\\xe9\\x13\\xa7\\x7b\\xcb\\x0d\\x68\\x1f\\xdf\\xb3\\xa7\\xa0\\xdc\\xb5\\x6d\\x27\\x4d\\xf4\\xaa\\x10\\x9d\\x4a\\x8a\\x37\\x79\\x4a\\x92\\x76\\xf5\\x00\\x06\\x69\\x6f\\xf1\\x2c\\xa4\\xd0\\x25\\x40\\x39\\xdf\\x0f\\xb3\\xf7\\x2a\\x96\\x0d\\xa0\\x5c\\x98\\x72\\xf2\\xe3\\x3e\\xe8\\x1d\\x1c\\xf7\\xa6\\xf4\\x8b\\xbc\\xe0\\xaa\\x18\\xc7\\xc0\\xf0\\x6b\\xa5\\x5e\\x67\\x68\\x9e\\x0a\\xf5\\x87\\xb5\\x00\\xea\\xb7\\x9c\\xc7\\xf9\\x64\\x0b\\xca\\x10\\x4b\\x7f\\xbf\\x31\\xf0\\x8e\"},\n{{0xbf,0xbc,0xd8,0x67,0x02,0x7a,0x19,0x99,0x78,0xd5,0x3e,0x35,0x9d,0x70,0x31,0x8f,0xc7,0x8c,0x7c,0xc7,0xbb,0x5c,0x79,0x96,0xba,0x79,0x7c,0x85,0x54,0xf3,0xf0,0xf0,},{0x7c,0x5a,0xe3,0xba,0xb9,0x20,0x11,0x99,0xdf,0xbe,0x74,0xb7,0xd1,0xec,0x15,0x71,0x25,0xbd,0xba,0xa4,0x52,0x0f,0x50,0x1d,0xa3,0xf2,0x48,0x57,0x9d,0xc6,0xc2,0x2d,},{0xe4,0x86,0x15,0xb6,0x56,0x33,0xe6,0x19,0x93,0xb0,0xaa,0xa1,0xfa,0xfb,0x74,0xb9,0x62,0x9c,0x38,0x4f,0xd5,0x92,0xbd,0x73,0x5f,0xa1,0xf6,0x2c,0x5c,0xad,0x11,0x29,0x1f,0xcd,0x8c,0x2e,0x91,0xa5,0x0b,0xfe,0x0b,0x03,0xb4,0x35,0x02,0xff,0xf3,0xa5,0xc3,0x82,0xb9,0xc2,0x82,0x19,0x07,0xef,0xc3,0x4d,0xa5,0xba,0x05,0x4a,0xf0,0x0e,},\"\\x11\\x7f\\xae\\x13\\xe7\\x87\\x77\\xb6\\x21\\x9f\\x02\\x02\\x14\\xc1\\xb8\\x7c\\x57\\x04\\x6d\\x1c\\x09\\xce\\x82\\xee\\x2b\\x56\\x29\\x89\\x8d\\x9b\\x0d\\xe7\\x4a\\x15\\xcf\\xe9\\x9f\\x80\\x54\\x8b\\xa9\\x13\\xd7\\x03\\x6c\\x56\\x28\\x5a\\x4c\\xba\\x49\\x3b\\x52\\xd2\\xcb\\x70\\xd6\\x36\\x5a\\xce\\x3d\\xa1\\x2b\\x1f\\x34\\xa2\\x77\\x8a\\xf3\\x6e\\xf5\\x2a\\xb8\\x2e\\xde\\x04\\xca\\xca\\xf2\\x79\\x3f\\x5f\\x89\\x83\\x1e\\x3b\\x20\\x5a\\x9e\\xe4\\xc1\\xd6\\xfb\\xda\\xb4\\xba\\x4d\\x9f\\xae\\x65\\xdd\\x79\\xa5\\xfe\\x76\\xb4\\xb3\\x9a\\x30\\x92\\xcc\\x71\\x48\\xd2\\x11\\xe8\\x5e\\xe8\\x2a\\xb4\\x63\\xd3\\x4d\\xce\\xe9\\x06\\x1d\\x9c\\x21\\xde\\xd2\\x05\\x1b\\xbd\\x50\\xb4\\x13\\xf0\\xe2\\x1a\\x0e\\x48\\xd1\\xff\\xa8\\xdc\\xae\\x24\\x0b\\x34\\x95\\xbe\\x25\\xd9\\x31\\x51\\xb5\\x7a\\xa2\\x71\\xab\\x99\\xaa\\x70\\x8c\\xa2\\x80\\x80\\xca\\xb4\\x80\\x4f\\xce\\xfa\\x92\\x9f\\x5f\\x1e\\xf3\\xf4\\xc6\\xc0\\xfb\\xfb\\x40\\xbe\\xf7\\xea\\x1b\\x50\\x9b\\x36\\xba\\x12\\x60\\x32\\x35\\x12\\x37\\x9d\\x7b\\xc3\\xfd\\xbb\\x5d\\x3f\\xaa\\xc9\\xb0\\x0e\\x21\\xf1\\x2e\\xa1\\xca\\x2e\\x29\"},\n{{0xdf,0x2d,0xf8,0xa9,0xd6,0x6d,0x56,0x38,0xcd,0xee,0x09,0x32,0x4e,0x7b,0x10,0xf8,0xed,0x29,0xab,0x91,0x38,0x7e,0x31,0x47,0xb7,0xdc,0x03,0xf7,0xcd,0x80,0x05,0x08,},{0x5c,0x04,0x2e,0x15,0x7f,0xb7,0xfb,0x12,0xd4,0xd4,0xfe,0xf2,0x84,0x71,0x41,0xec,0xfb,0x57,0xc1,0x25,0x3e,0x14,0xea,0xf3,0x00,0x4d,0x65,0x13,0xf5,0x2f,0xe6,0x25,},{0x9a,0x10,0x74,0x53,0x1e,0xd4,0x3d,0x07,0xbf,0xfc,0x7f,0x2b,0x6c,0x13,0xb8,0x83,0x8f,0xc7,0x5c,0xba,0x02,0xc7,0xd1,0xec,0x7b,0xa3,0x8b,0xca,0x3c,0xef,0x20,0xdc,0x9b,0xad,0xf3,0xa3,0x06,0x4a,0x2c,0x93,0xb1,0x84,0x24,0x41,0x42,0x0b,0x6a,0x8d,0x42,0x1a,0x96,0x0d,0x70,0xdf,0xb7,0xc7,0x0e,0xec,0x29,0x5f,0x21,0xf8,0x3f,0x0a,},\"\\x21\\x57\\x66\\x15\\xc9\\x34\\x6a\\x63\\xdc\\xcf\\x0c\\x50\\xec\\xbd\\x7c\\x6d\\x72\\xad\\x45\\x2c\\xfe\\xd4\\x3e\\xa7\\x32\\x02\\xcc\\x7a\\x98\\x57\\x60\\x56\\xb9\\x66\\x4b\\x54\\x62\\x29\\x05\\xa1\\xe7\\x22\\x17\\x20\\x73\\x0a\\xc6\\x85\\xd3\\xbd\\x39\\x77\\xec\\x39\\x59\\xd4\\x46\\xbf\\xa9\\x41\\xe7\\x25\\xb6\\xfe\\x16\\xaf\\xe5\\x43\\x2c\\x4b\\x4b\\xde\\xe7\\xaa\\x0f\\xd8\\x03\\x09\\x48\\xed\\x6f\\xcb\\xa7\\xc0\\xbd\\xb4\\x0c\\x2e\\x51\\x7d\\xa9\\x74\\x56\\xe7\\x4e\\x1f\\x93\\xd5\\xed\\x67\\x6d\\xe0\\xf4\\xa8\\xb0\\xae\\xa4\\x49\\x40\\x4b\\xd1\\x5b\\x6d\\xa7\\x9d\\xc1\\xb8\\x13\\x96\\x5f\\xe5\\x57\\x24\\x10\\xd7\\x6f\\x5b\\x5e\\xac\\x66\\x30\\x50\\x57\\x03\\x11\\xdc\\x98\\x42\\xb6\\xfb\\xf8\\x80\\x6a\\xec\\x03\\x15\\x17\\x15\\xca\\xcf\\x7f\\x21\\x80\\x2e\\x8b\\xf5\\xe9\\x8a\\x89\\xc0\\xd7\\xd0\\xd0\\x98\\xb7\\x3c\\x6e\\xfc\\x09\\x96\\x2e\\x36\\xb4\\xe0\\x30\\xc1\\xa6\\x4b\\x5d\\x34\\x9f\\x5f\\x20\\x42\\xc7\\x44\\x28\\x67\\x1e\\x4a\\x2c\\x7f\\xea\\x0c\\xae\\xe2\\x42\\x2d\\x85\\xc4\\xfc\\xdd\\xfe\\xd3\\x22\\x13\\x85\\x9a\\x69\\x95\\x5d\\x4e\\x3e\\xbb\\x7e\\x1b\\x20\\x22\"},\n{{0xe8,0xee,0x06,0x5f,0x99,0x07,0xf1,0xef,0xa2,0xda,0xec,0xb2,0x3a,0x04,0x25,0xf3,0x53,0x09,0x4d,0xa0,0x2b,0xc2,0xc9,0x31,0xf0,0xa5,0x87,0xef,0xc0,0xd1,0x3d,0xe1,},{0xc7,0x26,0x51,0xb7,0xfb,0x7a,0xc0,0x33,0x7a,0x17,0x29,0x77,0x49,0x6f,0xd7,0xf2,0xa7,0x2a,0xea,0x88,0x93,0x85,0x83,0x5e,0x56,0x3c,0x6b,0x60,0x53,0xa3,0x2d,0xc1,},{0xa5,0x10,0xdf,0xf4,0x2d,0x45,0x59,0xa1,0x9a,0x7b,0xf0,0xfe,0x0b,0xea,0x53,0xd3,0xe1,0xf2,0x2d,0xfa,0x6b,0xe5,0x50,0x39,0x89,0x5e,0x12,0xa5,0xd0,0x7d,0xa5,0xf2,0xe3,0x77,0x13,0xcc,0xb2,0xeb,0x21,0x60,0x11,0x62,0x8f,0x69,0x83,0xf8,0x71,0xfe,0xe2,0x86,0xe6,0x6f,0xff,0x4b,0xe7,0x58,0x2c,0x96,0x1a,0x1e,0xd7,0x56,0x84,0x04,},\"\\xa2\\xf0\\xc1\\x37\\x34\\x73\\xa3\\x05\\xd8\\xf1\\xd9\\x91\\x38\\xb0\\x6b\\x9a\\x96\\x94\\xff\\xaa\\x8a\\x88\\x22\\x2d\\xe9\\xf7\\x29\\xbe\\xe1\\x30\\x51\\x75\\xdf\\xb1\\x70\\x01\\xcc\\x77\\xf6\\x7b\\x6d\\x40\\xc9\\x0c\\x1a\\x28\\xfb\\x22\\x6c\\x11\\x28\\x6d\\xb4\\xa1\\x3e\\x45\\xe6\\x92\\x11\\x24\\x2b\\xcd\\xd0\\x1c\\xb6\\xe2\\xc4\\x54\\xe7\\x6c\\x0c\\xab\\x88\\x1b\\x4d\\x2d\\x9d\\x3a\\xb1\\x00\\xa5\\xd6\\x1d\\x17\\x25\\xd8\\x66\\xe4\\xfd\\xb6\\x6d\\x93\\xd7\\x7f\\x5b\\x30\\x86\\x93\\xb9\\xb5\\xa3\\x33\\xe5\\x7f\\xa2\\x5d\\x1e\\x5d\\x2e\\x38\\xdf\\x6e\\x4e\\x9e\\xc8\\x41\\x59\\xbb\\xee\\x1f\\xfe\\xa9\\x26\\x83\\x6a\\x01\\x01\\xc9\\x14\\x83\\xbd\\x5b\\xc8\\x8a\\x6f\\x1c\\xc4\\xd4\\xe7\\xf0\\x08\\xad\\x08\\x45\\x3a\\x01\\x23\\x42\\x9d\\xd3\\x35\\x78\\x1c\\x7c\\xbf\\x8d\\x68\\x5a\\x89\\x99\\xed\\x11\\x77\\x60\\x70\\x04\\xa1\\x3c\\x4c\\xb5\\xea\\x49\\x08\\xc5\\x42\\x60\\x7d\\x3f\\x2c\\xd6\\x69\\x0c\\xf1\\xf2\\xa7\\x45\\x5b\\xbd\\x38\\xf5\\x38\\xf0\\x7a\\x10\\x39\\x64\\x31\\x7e\\xfb\\xce\\xe3\\x7e\\xb4\\x69\\x31\\xc0\\x27\\xcf\\x15\\x3e\\xf8\\x6e\\x43\\xd7\\x82\\x81\\xeb\\xd7\\x10\"},\n{{0xc7,0x2e,0x67,0xd8,0xc3,0xfe,0xc0,0x04,0xff,0x61,0x87,0x18,0xa9,0x09,0x9e,0xb8,0xad,0x7b,0x06,0xff,0x3b,0x8c,0x54,0x2a,0x7e,0x8b,0x98,0x47,0x31,0x34,0x75,0xe1,},{0x4e,0xb0,0x02,0xd3,0xcc,0xeb,0x18,0x8c,0x66,0x58,0xfe,0xc5,0x1c,0xb4,0x79,0xa6,0x52,0x64,0xac,0x55,0x5c,0x75,0xcd,0xc2,0x24,0x9c,0xf1,0xce,0x3d,0xef,0xc1,0x6d,},{0x2d,0x7b,0xab,0x8e,0xbd,0xa7,0xfc,0xa5,0xbb,0x3c,0x25,0xf5,0x1d,0xc5,0x1b,0x73,0xe6,0xff,0x6a,0x3b,0xb1,0xb5,0x2a,0xcc,0x78,0x11,0xa7,0xd2,0x59,0x5c,0xd6,0xfd,0xaf,0x73,0x04,0x94,0x41,0x8e,0x2f,0x57,0xef,0xdc,0x56,0x17,0xb0,0x66,0xfd,0x7b,0x62,0x07,0x68,0x0d,0x94,0xfb,0x8c,0x43,0xd3,0xd4,0x74,0x0b,0x41,0xcb,0x69,0x01,},\"\\xa8\\xf3\\x41\\x35\\xc0\\x13\\x2e\\xc9\\x5b\\x64\\xb0\\xcb\\xf5\\x1d\\x66\\x90\\x01\\x43\\x37\\x04\\x06\\x79\\x1f\\xbb\\x55\\xf2\\xb8\\xca\\x95\\x3c\\xc7\\x4a\\x46\\xe0\\x8b\\x00\\x2f\\xa2\\xda\\x21\\xb9\\x51\\xb8\\x87\\x1f\\x7a\\x29\\xbc\\x6d\\x38\\x79\\x0a\\xfc\\x66\\xa3\\x29\\xc3\\x97\\xd9\\xf9\\x25\\x0b\\xae\\x0e\\x30\\xae\\x34\\x26\\xe0\\x8d\\x8e\\xad\\x01\\x79\\xa3\\xb3\\x13\\xc9\\x08\\x83\\x91\\x92\\xf2\\x89\\xa3\\xf3\\xb6\\xe9\\x60\\xb4\\xc5\\xce\\xbe\\xf0\\xa0\\x9d\\xaa\\x9c\\x7a\\x15\\xc1\\x9d\\x4e\\xbc\\x6f\\xc2\\xac\\x3c\\xd0\\x22\\x32\\xe8\\x32\\xb2\\x34\\xed\\xd7\\x96\\x5d\\x68\\x7b\\xfe\\xb7\\x58\\xf7\\x0f\\xa7\\x96\\x38\\x41\\xb7\\x85\\x9b\\xb9\\x7c\\x97\\x1b\\xd5\\x57\\xbc\\x87\\x69\\x52\\x4a\\xc4\\xc6\\xee\\xb3\\x57\\x97\\x93\\x33\\x4b\\x52\\x2d\\x17\\x6b\\xc6\\x2f\\x86\\xb4\\xd5\\xc0\\xd4\\x01\\x70\\x36\\xd2\\xb6\\xbd\\x4e\\x43\\x84\\x41\\x6e\\xf8\\x26\\x31\\x39\\x69\\x1a\\x86\\x06\\x17\\x0d\\x73\\xc9\\x3d\\x64\\x17\\xdc\\xc1\\xa0\\x8a\\x53\\x7c\\x9e\\xd4\\x40\\x04\\x71\\xa4\\x6f\\x52\\x90\\x7b\\x46\\xb1\\x0a\\x8b\\x68\\x89\\xdb\\xb4\\x64\\x7a\\x8b\\xbc\\x71\\x49\"},\n{{0x69,0x64,0x50,0xb5,0x57,0xec,0x3c,0x94,0xcf,0x1a,0xf1,0x32,0x64,0x75,0x63,0x4a,0xa8,0x1d,0xef,0x38,0x14,0xff,0x30,0xa0,0x2b,0xa7,0xf2,0x04,0x4b,0x59,0xc0,0xfe,},{0x85,0x84,0x77,0x3c,0x56,0x6b,0x0e,0xed,0x3f,0x43,0x28,0x17,0x05,0xb5,0x75,0xa4,0x34,0xe4,0x7d,0x6c,0xf6,0xb2,0x51,0xb8,0x98,0x03,0xfe,0xf5,0x35,0x34,0xcb,0x29,},{0xce,0x8b,0x0a,0x57,0x79,0xf4,0xf5,0xf4,0x01,0xe8,0x4d,0x65,0x92,0x7a,0x0c,0x28,0xdf,0x82,0x9e,0x95,0xd0,0x9b,0xfa,0x97,0x11,0x1b,0x87,0x00,0x07,0x8f,0xf8,0x94,0xcf,0x72,0x77,0xe3,0x4a,0x71,0x61,0x44,0xd5,0x53,0x06,0xfc,0x9e,0x2f,0x64,0xcd,0x28,0x75,0x83,0xcc,0x80,0x03,0xbe,0x0e,0x8f,0xaf,0x26,0xaf,0x76,0x40,0x14,0x0e,},\"\\xcc\\x25\\x78\\x29\\xf3\\x0a\\x5f\\x90\\xdf\\xdb\\xc2\\x47\\xd4\\x2e\\x38\\x87\\x38\\xb7\\x6c\\x41\\xef\\x8a\\x82\\xa5\\xe0\\x22\\x5d\\xdf\\x1e\\x38\\x6d\\x77\\x08\\x0b\\x3b\\x9d\\xf8\\x6c\\x54\\xb8\\x5c\\xdf\\x2c\\x32\\xf3\\x67\\xab\\xa0\\xc3\\xb6\\xbf\\x88\\x8a\\x5a\\x69\\x03\\x52\\x9b\\x6a\\xeb\\x4d\\x54\\x07\\xa1\\x01\\x80\\x14\\x91\\x14\\x13\\x02\\x28\\xfc\\x43\\x56\\xcc\\xf3\\x66\\xb7\\x7b\\xe8\\x97\\x96\\xa9\\xe7\\x1a\\x0c\\x69\\x3f\\x31\\xe5\\x84\\xa4\\xf1\\x43\\x09\\x7b\\xa3\\x70\\x36\\x3b\\x67\\xb2\\xf2\\xe2\\xfd\\x8d\\x6f\\xe8\\xb4\\xe8\\xdb\\xf0\\xd7\\xdc\\xc1\\xa8\\x36\\x00\\x41\\x15\\x8a\\xa2\\xaf\\xf7\\xe2\\xa3\\x25\\xb8\\xe5\\x18\\xf1\\x93\\xa2\\x8b\\xae\\x05\\xe3\\xd5\\x2b\\x26\\x62\\x1a\\xf4\\x02\\x02\\x6d\\x7f\\x25\\x0e\\x86\\xdc\\xee\\x30\\x1a\\x58\\xb6\\x31\\xea\\xdf\\x45\\x27\\xe9\\x58\\xf0\\x2a\\x61\\x58\\x7f\\x0b\\xb5\\x16\\xce\\xfa\\xc0\\x09\\xfe\\x51\\x05\\x2f\\xff\\x53\\x33\\x6d\\xbd\\x94\\xe7\\x26\\x6d\\x3b\\x43\\xca\\xba\\x8a\\x1b\\x38\\xe5\\xd8\\x71\\xc2\\xa2\\x4a\\x4c\\x41\\x2f\\xff\\x3f\\x7a\\x9a\\x52\\xa8\\xab\\x23\\xba\\xc9\\x79\\x1b\\x2b\\x5a\\x66\\x9a\"},\n{{0xa8,0xdd,0x35,0xf0,0x54,0xfb,0x6f,0xf6,0xf0,0xab,0x09,0x4a,0x0d,0x3d,0x1c,0x26,0x28,0x32,0x18,0x1d,0xf3,0x5c,0xcd,0x51,0x92,0x54,0x5e,0xbd,0x6a,0x9c,0xf5,0x29,},{0xca,0x41,0x23,0x38,0xd3,0x81,0x4b,0x88,0x6d,0x96,0x4b,0x71,0x92,0x5e,0x1a,0xab,0xb3,0xff,0xd0,0x78,0x34,0xdb,0xe7,0xdc,0x51,0x25,0x68,0x88,0x2b,0x53,0xe4,0xa3,},{0xfa,0x70,0x9f,0xbc,0x83,0x82,0xaf,0x83,0xd1,0x18,0x12,0x61,0x8d,0xfa,0xca,0x45,0x2e,0xab,0x83,0xe4,0xc5,0x3f,0xe9,0xe5,0x85,0x84,0x67,0xd0,0x7b,0x67,0x67,0xe1,0x79,0x75,0xc1,0xe0,0x63,0x93,0xd6,0xdd,0xe1,0x5a,0x34,0xd9,0x47,0x3d,0x1c,0xf4,0xd6,0xd8,0xc2,0xd5,0x73,0x94,0x52,0x00,0x80,0xfa,0xc4,0xe4,0x34,0x48,0xbe,0x07,},\"\\x55\\xa7\\xad\\x91\\x32\\xd6\\x3a\\xc1\\x61\\xe7\\xad\\xb1\\x32\\xb9\\x18\\x9f\\xdd\\x84\\xc3\\x61\\xc1\\xe4\\xf5\\x41\\x9a\\x6d\\xf7\\x3d\\xf4\\xd7\\xae\\xb2\\x9a\\x8d\\xc4\\xbf\\x01\\x49\\x0d\\x4f\\x48\\x4e\\x2d\\x12\\x07\\x75\\x17\\xf5\\xfc\\x7a\\xd0\\xbd\\xed\\xa2\\x0a\\x6c\\xb0\\x22\\x79\\x42\\x29\\x0b\\x08\\xc3\\xfe\\x33\\xab\\x9b\\x21\\x35\\xbc\\x38\\xa6\\x57\\x9a\\x54\\xbd\\x98\\x2f\\x7d\\x14\\x17\\xce\\x86\\x71\\x17\\xae\\xa9\\x18\\xdb\\xd3\\xdd\\x47\\x6e\\x7e\\xb5\\xb5\\xd3\\xc3\\xe4\\x8a\\x86\\x4a\\x2f\\x94\\x2a\\x31\\x50\\x1a\\xa2\\xb2\\x9b\\x53\\xb8\\x05\\x13\\xc9\\x5d\\x6a\\x41\\x18\\x44\\xf0\\xde\\xdf\\x16\\xa2\\x9a\\xc2\\x67\\xd3\\x31\\xe5\\x3b\\xdc\\x25\\x39\\xbf\\xcf\\x32\\xdc\\x9b\\x5d\\x64\\x0f\\x12\\x31\\xe2\\xca\\xfb\\x0a\\xe9\\x4b\\xb5\\x18\\x94\\x26\\x86\\x33\\x64\\x26\\x2e\\xfb\\x47\\xb5\\xb5\\xcc\\xdb\\xbc\\x93\\x32\\x42\\x16\\xa7\\x99\\xb6\\xf5\\x0d\\x37\\x04\\xf1\\x5e\\xd5\\x9a\\xf6\\xcc\\x7d\\x91\\x0c\\xf0\\x62\\xd1\\xbe\\x63\\x2d\\xca\\x5d\\xf2\\x13\\xd4\\x87\\xd8\\x56\\x4f\\x2b\\x2b\\xd7\\xd8\\x18\\xbb\\xa2\\x7c\\x36\\x40\\x13\\xd9\\x2d\\x7f\\x72\\x62\\x54\\x62\"},\n{{0xae,0x1d,0x2c,0x6b,0x17,0x1b,0xe2,0x4c,0x2e,0x41,0x3d,0x36,0x4d,0xcd,0xa9,0x7f,0xa4,0x76,0xaa,0xf9,0x12,0x3d,0x33,0x66,0xb0,0xbe,0x03,0xa1,0x42,0xfe,0x6e,0x7d,},{0xd4,0x37,0xf5,0x75,0x42,0xc6,0x81,0xdd,0x54,0x34,0x87,0x40,0x8e,0xc7,0xa4,0x4b,0xd4,0x2a,0x5f,0xd5,0x45,0xce,0x2f,0x4c,0x82,0x97,0xd6,0x7b,0xb0,0xb3,0xaa,0x7b,},{0x90,0x90,0x08,0xf3,0xfc,0xff,0xf4,0x39,0x88,0xae,0xe1,0x31,0x4b,0x15,0xb1,0x82,0x2c,0xaa,0xa8,0xda,0xb1,0x20,0xbd,0x45,0x2a,0xf4,0x94,0xe0,0x83,0x35,0xb4,0x4a,0x94,0xc3,0x13,0xc4,0xb1,0x45,0xea,0xdd,0x51,0x66,0xea,0xac,0x03,0x4e,0x29,0xb7,0xe6,0xac,0x79,0x41,0xd5,0x96,0x1f,0xc4,0x9d,0x26,0x0e,0x1c,0x48,0x20,0xb0,0x0e,},\"\\x9e\\x6c\\x2f\\xc7\\x6e\\x30\\xf1\\x7c\\xd8\\xb4\\x98\\x84\\x5d\\xa4\\x4f\\x22\\xd5\\x5b\\xec\\x15\\x0c\\x61\\x30\\xb4\\x11\\xc6\\x33\\x9d\\x14\\xb3\\x99\\x69\\xab\\x10\\x33\\xbe\\x68\\x75\\x69\\xa9\\x91\\xa0\\x6f\\x70\\xb2\\xa8\\xa6\\x93\\x1a\\x77\\x7b\\x0e\\x4b\\xe6\\x72\\x3c\\xd7\\x5e\\x5a\\xa7\\x53\\x28\\x13\\xef\\x50\\xb3\\xd3\\x72\\x71\\x64\\x0f\\xa2\\xfb\\x28\\x7c\\x03\\x55\\x25\\x76\\x41\\xea\\x93\\x5c\\x85\\x1c\\x0b\\x6a\\xc6\\x8b\\xe7\\x2c\\x88\\xdf\\xc5\\x85\\x6f\\xb5\\x35\\x43\\xfb\\x37\\x7b\\x0d\\xbf\\x64\\x80\\x8a\\xfc\\xc4\\x27\\x4a\\xa4\\x56\\x85\\x5a\\xd2\\x8f\\x61\\x26\\x7a\\x41\\x9b\\xc7\\x21\\x66\\xb9\\xca\\x73\\xcd\\x3b\\xb7\\x9b\\xf7\\xdd\\x25\\x9b\\xaa\\x75\\x91\\x14\\x40\\x97\\x4b\\x68\\xe8\\xba\\x95\\xa7\\x8c\\xbb\\xe1\\xcb\\x6a\\xd8\\x07\\xa3\\x3a\\x1c\\xce\\x2f\\x40\\x6f\\xf7\\xbc\\xbd\\x05\\x8b\\x44\\xa3\\x11\\xb3\\x8a\\xb4\\xd4\\xe6\\x14\\x16\\xc4\\xa7\\x4d\\x88\\x3d\\x6a\\x6a\\x79\\x4a\\xbd\\x9c\\xf1\\xc0\\x39\\x02\\x8b\\xf1\\xb2\\x0e\\x3d\\x49\\x90\\xaa\\xe8\\x6f\\x32\\xbf\\x06\\xcd\\x83\\x49\\xa7\\xa8\\x84\\xcc\\xe0\\x16\\x5e\\x36\\xa0\\x64\\x0e\\x98\\x7b\\x9d\\x51\"},\n{{0x02,0x65,0xa7,0x94,0x4b,0xac,0xcf,0xeb,0xf4,0x17,0xb8,0x7a,0xe1,0xe6,0xdf,0x2f,0xf2,0xa5,0x44,0xff,0xb5,0x82,0x25,0xa0,0x8e,0x09,0x2b,0xe0,0x3f,0x02,0x60,0x97,},{0x63,0xd3,0x27,0x61,0x5e,0xa0,0x13,0x9b,0xe0,0x74,0x0b,0x61,0x8a,0xff,0x1a,0xcf,0xa8,0x18,0xd4,0xb0,0xc2,0xcf,0xea,0xf0,0xda,0x93,0xcd,0xd5,0x24,0x5f,0xb5,0xa9,},{0xb6,0xc4,0x45,0xb7,0xed,0xdc,0xa5,0x93,0x5c,0x61,0x70,0x8d,0x44,0xea,0x59,0x06,0xbd,0x19,0xcc,0x54,0x22,0x4e,0xae,0x3c,0x8e,0x46,0xce,0x99,0xf5,0xcb,0xbd,0x34,0x1f,0x26,0x62,0x39,0x38,0xf5,0xfe,0x04,0x07,0x0b,0x1b,0x02,0xe7,0x1f,0xbb,0x7c,0x78,0xa9,0x0c,0x0d,0xda,0x66,0xcb,0x14,0x3f,0xab,0x02,0xe6,0xa0,0xba,0xe3,0x06,},\"\\x87\\x4e\\xd7\\x12\\xa2\\xc4\\x1c\\x26\\xa2\\xd9\\x52\\x7c\\x55\\x23\\x3f\\xde\\x0a\\x4f\\xfb\\x86\\xaf\\x8e\\x8a\\x1d\\xd0\\xa8\\x20\\x50\\x2c\\x5a\\x26\\x93\\x2b\\xf8\\x7e\\xe0\\xde\\x72\\xa8\\x87\\x4e\\xf2\\xee\\xbf\\x83\\x38\\x4d\\x44\\x3f\\x7a\\x5f\\x46\\xa1\\x23\\x3b\\x4f\\xb5\\x14\\xa2\\x46\\x99\\x81\\x82\\x48\\x94\\xf3\\x25\\xbf\\x86\\xaa\\x0f\\xe1\\x21\\x71\\x53\\xd4\\x0f\\x35\\x56\\xc4\\x3a\\x8e\\xa9\\x26\\x94\\x44\\xe1\\x49\\xfb\\x70\\xe9\\x41\\x5a\\xe0\\x76\\x6c\\x56\\x5d\\x93\\xd1\\xd6\\x36\\x8f\\x9a\\x23\\xa0\\xad\\x76\\xf9\\xa0\\x9d\\xbf\\x79\\x63\\x4a\\xa9\\x71\\x78\\x67\\x77\\x34\\xd0\\x4e\\xf1\\xa5\\xb3\\xf8\\x7c\\xe1\\xee\\x9f\\xc5\\xa9\\xac\\x4e\\x7a\\x72\\xc9\\xd7\\xd3\\x1e\\xc8\\x9e\\x28\\xa8\\x45\\xd2\\xe1\\x10\\x3c\\x15\\xd6\\x41\\x0c\\xe3\\xc7\\x23\\xb0\\xcc\\x22\\x09\\xf6\\x98\\xaa\\x9f\\xa2\\x88\\xbb\\xbe\\xcf\\xd9\\xe5\\xf8\\x9c\\xdc\\xb0\\x9d\\x3c\\x21\\x5f\\xeb\\x47\\xa5\\x8b\\x71\\xea\\x70\\xe2\\xab\\xea\\xd6\\x7f\\x1b\\x08\\xea\\x6f\\x56\\x1f\\xb9\\x3e\\xf0\\x52\\x32\\xee\\xda\\xbf\\xc1\\xc7\\x70\\x2a\\xb0\\x39\\xbc\\x46\\x5c\\xf5\\x7e\\x20\\x7f\\x10\\x93\\xfc\\x82\\x08\"},\n{{0x6b,0xce,0x4d,0xfd,0x53,0xbf,0xa5,0x50,0x6f,0x2f,0x55,0x4d,0x2d,0x99,0x4a,0x0d,0xc4,0x0c,0xaf,0xcd,0xec,0x7e,0x1b,0xe0,0x50,0x00,0x6e,0x5c,0x5a,0x4b,0x38,0xa1,},{0xc8,0x90,0x02,0x37,0x28,0xd8,0x39,0x70,0x70,0x29,0x17,0x71,0xe6,0x5e,0x03,0x4d,0x34,0xd4,0xaa,0xe5,0xe2,0x47,0x65,0x3e,0x4f,0xf4,0xc0,0x74,0x59,0x1d,0xa7,0x02,},{0x99,0xae,0x67,0x82,0xff,0x27,0x64,0x6c,0x27,0xf6,0x1e,0x23,0x63,0x6a,0xe1,0x88,0x15,0x21,0xcf,0xa5,0xed,0x25,0x6f,0x70,0xbc,0xe7,0xce,0x00,0xb6,0x82,0x80,0xce,0x8e,0x0c,0x82,0xaa,0x76,0x5a,0xfb,0x8b,0x5a,0x1f,0xf2,0xfe,0x42,0xc5,0x74,0x41,0xe4,0x58,0xe4,0x43,0xdc,0x8b,0x12,0x34,0x77,0xae,0x33,0xd8,0x84,0x88,0x8c,0x0b,},\"\\x32\\x39\\x19\\x07\\x47\\xee\\x33\\xd4\\x0b\\xf8\\x70\\xac\\x9a\\xd4\\x9d\\x88\\xee\\x32\\x0f\\x63\\xc0\\x52\\x57\\xe8\\xab\\x2c\\x60\\x30\\x65\\x97\\xce\\x76\\xd1\\xf1\\xe7\\x92\\xab\\x6a\\x65\\xca\\xa5\\x44\\xfb\\xec\\x20\\x89\\x2f\\xd4\\x96\\x05\\x94\\xf3\\x1b\\x37\\x63\\xef\\x07\\xd4\\x98\\x2e\\xae\\x4a\\x2d\\xbf\\x33\\x77\\xdc\\xc1\\xe3\\xf9\\x5e\\x46\\xed\\x39\\xb7\\xf0\\x22\\x2f\\x04\\xbb\\x5c\\x3b\\x43\\x4c\\x8f\\x9f\\x31\\x0d\\xe9\\xf1\\x22\\xa2\\x9f\\x82\\x41\\xe8\\x1e\\x20\\x65\\x49\\xae\\x62\\x8d\\x2b\\x8a\\xd7\\x68\\x97\\x2c\\x98\\x84\\x7c\\x11\\x88\\xad\\x04\\xc8\\x35\\x35\\x63\\x78\\xbe\\xf7\\x9c\\xd1\\x26\\x86\\x94\\x05\\xb1\\x29\\xfd\\xbd\\xc3\\xbc\\x48\\x9c\\xbd\\x13\\x99\\x50\\x5d\\xad\\xef\\x76\\x17\\xb5\\xbe\\x5d\\xa1\\x73\\xd3\\xe8\\x0e\\x58\\x38\\xc9\\x9e\\x34\\x92\\x76\\x24\\x27\\x29\\xe0\\x21\\x9b\\xd7\\x47\\x6a\\xe5\\xc4\\xf8\\x1a\\x12\\x87\\x8f\\xb4\\x83\\xa6\\xc0\\xe9\\xb0\\xdf\\x29\\x62\\xeb\\x0b\\xf0\\x01\\x57\\x78\\x2c\\xf7\\x68\\xa1\\xb7\\x1c\\x01\\x01\\x69\\xee\\x85\\x22\\xde\\xf0\\x02\\x4a\\xd7\\xe4\\x57\\x75\\xa2\\x90\\x63\\x9c\\x53\\xaa\\xf4\\x81\\x98\\xc4\\x2d\\xe7\\x5c\"},\n{{0x17,0x86,0x1a,0x8d,0x41,0x54,0xac,0xd4,0xfa,0x9c,0x8f,0xc9,0x47,0xc1,0x88,0x6c,0x11,0x29,0x0b,0xe2,0x22,0x87,0x2f,0xf4,0xf8,0xcd,0x25,0x93,0x9e,0x4d,0x13,0x61,},{0x43,0x77,0x3f,0x44,0x49,0x06,0x5e,0xae,0xba,0xf8,0x93,0x7b,0xaf,0x75,0x85,0x60,0xb0,0xc4,0xd2,0xde,0x46,0x97,0x78,0x39,0xb3,0xb8,0x73,0xd5,0xd7,0xd5,0xfd,0x8f,},{0xa5,0xee,0x02,0x4c,0xcd,0xbd,0xd4,0xc2,0x1a,0x24,0x70,0x9e,0xc5,0x3d,0xcc,0xb7,0xee,0x17,0x62,0x6d,0xd0,0x0a,0x09,0x3d,0x08,0x84,0xf5,0xb4,0x5c,0x4c,0x9d,0x16,0x91,0x84,0x01,0x51,0xc3,0x3c,0x8a,0xa0,0x7b,0x69,0xb3,0x4e,0x16,0xf6,0x16,0x47,0xeb,0xe7,0x93,0xae,0x4d,0xaa,0x70,0xcf,0xf4,0x8e,0x6a,0xb4,0x2f,0xfd,0xbc,0x00,},\"\\x18\\x4d\\xf5\\xea\\x32\\x15\\xeb\\xe1\\x80\\x39\\x0b\\x0f\\xf0\\x42\\xba\\x23\\x81\\x15\\x5a\\x03\\x8d\\xc7\\x32\\xf7\\x6a\\x01\\xc7\\xe7\\x0f\\x82\\xd1\\xcc\\xc9\\xde\\x9a\\x05\\x96\\xb3\\xfe\\xe4\\x47\\x20\\x9c\\x99\\x26\\x84\\xf6\\x43\\xdf\\x21\\xf4\\xcf\\x9d\\x17\\x92\\x62\\x79\\x0e\\x86\\x23\\xe4\\x24\\x72\\xdc\\x35\\x19\\x97\\xe6\\xda\\x18\\x9c\\x07\\xe1\\xe8\\x88\\x2c\\x07\\xf8\\x6c\\x63\\x37\\xec\\x01\\x13\\x91\\x2c\\xf9\\x22\\x15\\xc8\\xde\\x19\\x82\\xb8\\xfc\\x57\\xbf\\xab\\xc5\\x5a\\x3e\\x87\\x36\\xf7\\x36\\x10\\x42\\x9d\\x97\\xfe\\xb5\\x1d\\x79\\x4f\\x50\\x5d\\x0c\\x5a\\x0b\\x3a\\xbd\\x48\\xef\\x7f\\x55\\xa6\\x28\\xf9\\x0b\\x85\\x67\\xa1\\xc1\\x5e\\xa9\\xd1\\x90\\xd7\\xbf\\x4e\\xc2\\xbc\\x93\\x34\\xad\\xa6\\xcb\\x92\\x80\\x8d\\xfc\\x20\\x64\\x83\\x6f\\xcf\\xa4\\x6b\\x96\\xfd\\x7a\\x5d\\x6f\\x4b\\x05\\x4d\\xab\\x09\\xb7\\x35\\x95\\xfe\\xb8\\x9e\\xd0\\x05\\xb9\\xec\\x9d\\x31\\x88\\x12\\x1d\\xe6\\x96\\x96\\xd6\\x4e\\x7c\\x7b\\xbd\\xfc\\x1c\\x46\\x9f\\xaf\\x14\\x8c\\x38\\xa7\\x78\\x59\\x70\\xaf\\xe1\\xac\\xd0\\x6a\\x92\\xc9\\x94\\x78\\xfe\\x44\\x97\\x4e\\x3b\\xb2\\x09\\x5e\\x44\\x67\\xe9\\xb2\\xe9\\x96\"},\n{{0x0a,0x84,0xba,0xa5,0x4f,0x11,0xcf,0x17,0x09,0x0f,0xec,0x61,0xf3,0xf9,0x40,0x15,0x08,0xa3,0xa0,0x38,0x87,0xac,0xa1,0xa7,0x93,0x93,0x94,0xb1,0xee,0x40,0xa9,0x25,},{0x30,0x9a,0x73,0xc6,0x2d,0x23,0xd7,0x40,0xf2,0xe9,0x3c,0x18,0x58,0x7a,0xc1,0x5e,0x7e,0xc4,0x80,0xd2,0x5a,0xc0,0x79,0x4e,0x10,0xf8,0xcd,0x46,0x1c,0xc2,0xb1,0x30,},{0x4d,0x87,0x0b,0xd5,0x3a,0xf8,0xf1,0x3f,0x21,0x4d,0x99,0x34,0xec,0x90,0x3a,0xc4,0x82,0x84,0x09,0x2c,0xd9,0xb1,0x62,0xa4,0x4c,0xce,0xc8,0x51,0xfa,0x94,0x2d,0xe7,0x15,0xcc,0xda,0x07,0xb7,0x99,0x1d,0x71,0x27,0x23,0xe7,0xa4,0xd5,0xb4,0xf0,0x37,0x4a,0xb8,0x5a,0xc3,0x86,0x7e,0x0b,0x53,0xeb,0xc4,0x6b,0x53,0x0f,0x9f,0xed,0x05,},\"\\xfe\\x70\\x01\\x7b\\x14\\x67\\x8b\\x0d\\x3a\\xd0\\x3e\\x18\\x3d\\x6f\\x53\\x31\\x43\\x78\\x37\\x9a\\xb3\\xda\\x65\\xb3\\x51\\x12\\x57\\xb3\\xd5\\x40\\x86\\xe8\\x6f\\x20\\x31\\x13\\x90\\x21\\x39\\x1a\\xf9\\xd7\\x20\\x85\\xff\\x7c\\x3d\\xc8\\xc1\\xe2\\xd9\\x1e\\x53\\x33\\x38\\x55\\x42\\x3d\\x0f\\x78\\x5e\\x2c\\xc5\\xf8\\xb7\\x79\\x9f\\xcf\\x1b\\x70\\xe6\\xbe\\xcb\\x78\\x8e\\x53\\xe9\\x02\\x0f\\x29\\x95\\xdd\\xb0\\xc3\\x83\\xa1\\xf8\\x10\\x38\\xfc\\x3d\\x54\\x3c\\xe0\\xa3\\x8c\\x9c\\x28\\x8a\\x9b\\xc4\\x07\\x7f\\x42\\x77\\xdc\\xc6\\xc5\\x64\\x22\\x63\\xfc\\xfe\\x19\\x68\\x80\\x05\\xa6\\x03\\xf5\\x76\\x75\\xd2\\x43\\x4f\\x3e\\xd1\\xf4\\x6d\\x32\\xf1\\x4e\\xae\\xb0\\x73\\xe8\\x3e\\xe7\\x08\\x6d\\xa2\\xfb\\x67\\x65\\x9d\\x3f\\xb6\\x8c\\x62\\x32\\x0b\\x77\\x27\\xb3\\xb8\\xea\\x00\\x65\\x76\\xbc\\x2c\\x7e\\x6b\\x5f\\x1e\\xce\\xfa\\x8b\\x92\\xe7\\x0c\\x92\\xc8\\x89\\x51\\xd0\\xc1\\x2d\\x91\\xde\\x80\\x1c\\x38\\xb7\\xca\\x5a\\x0a\\x04\\xb4\\xc3\\x42\\x9a\\xba\\x86\\x38\\x6e\\x96\\xe0\\x6a\\xfd\\x20\\xd4\\xc5\\xc2\\xfe\\x2b\\x9b\\x42\\x73\\xeb\\x05\\x20\\x1a\\x79\\x27\\x3a\\xbd\\xbe\\xb3\\x7e\\xd1\\x83\\x0d\\x22\\x6b\\x6b\\xdb\"},\n{{0x38,0x37,0x94,0x23,0xda,0xfd,0xbf,0x25,0xe1,0x9d,0x72,0x31,0xbd,0xdd,0x80,0xb4,0xce,0xfc,0xfe,0x2a,0xed,0x93,0x25,0x84,0xdf,0xa0,0xcc,0x3c,0x9f,0x92,0x32,0xde,},{0x59,0x7e,0x81,0xdc,0xee,0x94,0x48,0xb7,0x7d,0xe6,0x82,0x9e,0x79,0x21,0xc8,0xa3,0x90,0x53,0x5d,0x89,0xa0,0x84,0x94,0x30,0xae,0xd6,0x63,0x64,0xee,0x14,0x0d,0x8b,},{0xd8,0xb5,0x0a,0x88,0xae,0xd6,0xf2,0xa9,0x6d,0x08,0x22,0x13,0xad,0xf8,0xb2,0x51,0x9f,0x6a,0x0b,0xbd,0x30,0xdd,0x3c,0xb0,0xf3,0xfd,0x3c,0xe1,0xc6,0x43,0xfc,0x02,0x99,0x46,0xcd,0x43,0x46,0x2e,0xd2,0x25,0x13,0xf1,0xd6,0x5f,0xca,0x24,0xbd,0xe3,0x81,0x81,0x66,0xba,0xa8,0x6d,0xaa,0x79,0x87,0x92,0xaf,0xaf,0xe0,0xc1,0xa1,0x0a,},\"\\x36\\x12\\x5c\\xa6\\x66\\x68\\x80\\x29\\x06\\x23\\x7e\\x63\\xa2\\xfe\\x5a\\xe6\\x10\\xf1\\x1a\\x7c\\xf9\\x25\\x20\\xd1\\x9e\\x66\\x90\\xa3\\xad\\xfa\\xfd\\x5d\\x07\\xa7\\x84\\xbc\\x1a\\x0e\\x18\\x52\\x73\\xd1\\x1d\\x34\\x0d\\x5e\\xff\\x90\\x15\\x97\\xde\\xdf\\x45\\x0c\\x46\\x99\\xd4\\x3f\\x3f\\xb1\\x68\\xd5\\x57\\xf6\\xc9\\xc0\\x30\\x77\\xc3\\xcd\\xc3\\x70\\xd3\\x48\\x32\\xcc\\xdf\\x2a\\x8e\\x3d\\x75\\x79\\x64\\x90\\xed\\x02\\x42\\x89\\x9d\\x25\\xdd\\xf4\\x4b\\xfc\\x66\\xf3\\x29\\xcf\\x4c\\x45\\x16\\x87\\x03\\xc3\\x1b\\xc9\\x20\\x2d\\x89\\x0f\\x39\\x69\\xff\\xd3\\xac\\x35\\xa1\\x28\\x18\\xdc\\xa7\\x51\\xce\\xb8\\x80\\x8f\\xe8\\x1e\\xfa\\x26\\xa5\\xe0\\xd2\\x00\\xc5\\xec\\x1d\\x94\\xa5\\x09\\x7e\\xa7\\x4b\\x64\\x98\\xfe\\x28\\x8f\\x30\\xc4\\x8d\\x72\\x7e\\x9d\\x3d\\x35\\xc8\\xe1\\x2d\\x85\\x42\\x07\\x02\\x55\\x6f\\x28\\x61\\x48\\x4f\\xfd\\x09\\xb4\\xf1\\x22\\x65\\xcc\\x9a\\xba\\xfe\\xb8\\x2c\\xf5\\x90\\x02\\x88\\x95\\xa7\\xd0\\x50\\xff\\x57\\xcc\\xf5\\xf2\\x80\\x22\\xd0\\x16\\xab\\x40\\x94\\xb0\\x62\\xe4\\x8b\\x66\\xfd\\x36\\xd1\\xe1\\x96\\x26\\xe5\\x21\\x5e\\xfa\\x40\\xfb\\x7e\\x3b\\x70\\x62\\xf8\\x1e\\x95\\x48\\x30\\xc9\"},\n{{0xf9,0x25,0xd2,0x74,0xaa,0xf1,0xfe,0x1a,0x21,0x65,0x62,0x37,0x38,0x5e,0x97,0xf7,0x78,0x3e,0x78,0x09,0x0c,0x5d,0x42,0x17,0xfe,0xce,0x70,0x57,0xc8,0x0f,0x42,0x6d,},{0x3b,0x0f,0xc3,0x70,0xbe,0x3a,0x4b,0x19,0xa8,0x8a,0xb9,0x98,0xc5,0x95,0x04,0xff,0xb5,0x9a,0x87,0x60,0x63,0x38,0xe6,0x73,0xdf,0x5b,0x3f,0xab,0x4d,0x9b,0xfb,0x8d,},{0x79,0x54,0x9a,0x31,0x7d,0x10,0xa0,0xbe,0x32,0x2a,0x94,0xa1,0x51,0xad,0x11,0xe7,0x7e,0xfc,0x48,0x36,0xcc,0x80,0x06,0xa8,0x50,0x81,0x27,0x3d,0x76,0x02,0xa6,0x38,0x96,0x3a,0x9c,0xaf,0x19,0xc3,0xed,0xf1,0xe2,0x5f,0xad,0x1e,0x9d,0x68,0x70,0x1a,0x71,0xde,0xa7,0x27,0xda,0x6a,0x5c,0x5b,0xca,0xc9,0x33,0x95,0x89,0x22,0x4b,0x05,},\"\\x14\\x3c\\xaa\\xfa\\x5f\\x62\\xb1\\x3e\\x43\\xdf\\xfa\\x49\\xd4\\x20\\xfa\\x99\\xf7\\x71\\xb1\\x92\\x6d\\x40\\xd6\\xcb\\x2b\\xbb\\x42\\x7f\\x27\\xb6\\xc2\\x66\\xeb\\x3d\\xeb\\x2d\\x8b\\xbb\\xd4\\x7b\\x82\\x14\\xad\\x40\\x25\\x1c\\xb1\\x90\\x7a\\xd6\\x5e\\xb9\\x41\\x93\\xe5\\x4a\\xd8\\x5c\\x67\\x00\\xb4\\x18\\x9e\\x80\\xf1\\xcc\\x01\\x54\\xc6\\x3e\\xd1\\x51\\xa8\\xbb\\xbd\\x30\\xe0\\x16\\x37\\xca\\x58\\xe7\\x0a\\xa3\\xee\\x52\\xef\\x75\\xd0\\x87\\x30\\x78\\xa4\\x05\\x01\\x4f\\x78\\x6e\\xb2\\xd7\\x7b\\x7f\\x44\\x22\\xf9\\x27\\x82\\x3e\\x47\\x5e\\x05\\xb2\\x42\\x45\\xf9\\x06\\x8a\\x67\\xf1\\x4f\\x4f\\x3c\\xfb\\x1e\\xb3\\x0b\\xfe\\xde\\x7b\\x32\\x62\\x23\\x0c\\xed\\x9e\\x31\\x36\\x1d\\xb1\\x96\\x36\\xb2\\xc1\\x2f\\xdf\\x1b\\x9c\\x14\\x51\\x0a\\xcd\\x5b\\xc1\\x8c\\x0d\\xdf\\x76\\x35\\xe0\\x03\\x50\\x3e\\x6f\\x71\\xe1\\xc3\\x65\\xcd\\xfb\\x4c\\x65\\xee\\x75\\xb4\\xde\\x06\\x94\\xaf\\x87\\x07\\x63\\x74\\xd6\\x31\\xe6\\xc4\\xb8\\xe2\\x40\\xfa\\x51\\xda\\xb5\\xe1\\xf8\\x0c\\xa2\\xa0\\x6c\\x49\\xf4\\x2e\\xa0\\x9e\\x04\\x75\\xde\\xfb\\x18\\x4d\\x9c\\xde\\x9f\\x58\\xf9\\x59\\xe6\\x40\\x92\\xaa\\xc8\\xf2\\x02\\x7e\\x46\\x81\\x26\\xf2\\xfb\"},\n{{0x97,0x1f,0x80,0x6b,0xe6,0xf0,0x7d,0x41,0xbe,0x88,0x30,0xff,0x8d,0xae,0x70,0x4b,0x08,0x63,0x8a,0xd6,0xcf,0xf7,0x22,0xd8,0x43,0x25,0x38,0x12,0x7b,0x76,0x96,0x25,},{0xaf,0x6a,0xc9,0x8d,0xce,0x20,0x78,0xa6,0xc7,0x3f,0x60,0x97,0xba,0xb6,0x3f,0x20,0x5c,0xaf,0x69,0x53,0xaf,0xa2,0x84,0xd0,0x42,0xbd,0x50,0xa4,0xfc,0xe9,0x6c,0xb4,},{0x20,0x37,0xa0,0xa7,0x67,0x4b,0x84,0xff,0x27,0xd0,0xb2,0x2f,0x62,0xb4,0xba,0xc6,0x5e,0x2d,0xc0,0xf5,0xfd,0xc8,0x99,0xfe,0xb7,0x80,0x0f,0x25,0xc2,0x99,0x81,0xde,0xe6,0x41,0xc5,0xa5,0x0f,0x8b,0x94,0x10,0x97,0x0b,0x49,0xd2,0xd5,0x36,0x58,0xc8,0x9e,0xe1,0x69,0x61,0xdc,0xcf,0x53,0x91,0xa6,0x91,0x8f,0x2a,0x84,0xea,0xda,0x0b,},\"\\x01\\x34\\x55\\xd0\\x49\\xaa\\x54\\xed\\x99\\x5f\\xbd\\x94\\xe6\\x36\\x99\\x55\\x49\\x53\\x95\\xe4\\x43\\x88\\x22\\x25\\x9b\\x10\\x60\\xe9\\xa3\\x47\\x79\\x04\\x2a\\x1a\\x69\\x21\\x1f\\x6e\\xa2\\x07\\x73\\x99\\xdd\\x23\\x48\\x06\\xba\\x0b\\x35\\x3c\\xd7\\x9a\\x57\\xe1\\xc4\\x9b\\x25\\x0a\\xb2\\x71\\x06\\xdc\\xde\\x57\\x6e\\xcf\\xa1\\x15\\xea\\xe4\\x61\\xfe\\xbb\\x12\\xd2\\xda\\x25\\xff\\xcf\\x17\\xb7\\x15\\xf8\\xd9\\x5c\\x2f\\x0c\\x42\\x5d\\x5a\\x81\\xf7\\x00\\x11\\x5b\\x70\\xd4\\x9e\\x1c\\xfe\\x49\\xfc\\xaa\\x14\\xfa\\x20\\x5e\\x28\\xec\\x85\\x24\\x7f\\x1a\\x6e\\x71\\x28\\xbf\\x3b\\xb3\\x06\\x0d\\xc0\\x84\\x64\\xbd\\xa6\\x53\\x85\\x40\\xd0\\xac\\x47\\x20\\x93\\xe5\\xa0\\x72\\x0f\\xde\\x2f\\x3d\\xc4\\x78\\x8e\\x0e\\x9b\\x0d\\xbf\\xe2\\xa2\\xb5\\xf1\\xa0\\xf3\\xf8\\x0d\\xe9\\x84\\x02\\x5b\\x15\\xc6\\x5a\\xf7\\x7f\\x67\\x1e\\x1c\\x5e\\x28\\x40\\x44\\x4d\\xe5\\xc7\\xed\\xa0\\x25\\xe6\\xdc\\x1a\\x3f\\xf1\\x6e\\x26\\xcc\\x54\\xcd\\xee\\xd5\\x6b\\xe7\\x3f\\x9b\\x01\\xab\\x2b\\x1b\\xc1\\x6c\\x8e\\xf5\\x8a\\x5b\\x76\\xdd\\x47\\x28\\x78\\x07\\xe5\\xc5\\x0f\\x0d\\x7c\\x0a\\x5b\\x81\\x20\\xdf\\xde\\x64\\x5a\\x01\\x2c\\x5c\\xf1\\x14\\x91\\xbc\"},\n{{0x2b,0xb0,0x65,0x2f,0x8f,0xff,0x69,0x01,0x99,0x11,0x48,0xc6,0x8a,0x32,0x67,0x87,0x72,0x71,0x00,0x6a,0xe9,0x58,0x91,0x49,0xbb,0x20,0x68,0x50,0xcd,0xf5,0x2f,0xb0,},{0xc0,0x3b,0x77,0xbe,0x98,0x3e,0x74,0xa2,0x34,0xc1,0x98,0x64,0x96,0xb2,0x92,0xe1,0x39,0x99,0x2e,0xb7,0x52,0x9e,0x70,0xb3,0xaf,0xad,0x7a,0xe4,0xfd,0xcf,0x8a,0x66,},{0x4e,0x15,0x8d,0xea,0xae,0xc3,0xd8,0x89,0x41,0x29,0x6a,0xf2,0xd2,0x73,0x41,0x01,0x2b,0x02,0x41,0xd4,0xe0,0xf4,0x6e,0x43,0x5e,0x37,0x5c,0x98,0x75,0xe8,0x9f,0x5e,0x32,0xc0,0x57,0xb5,0x27,0xbc,0x34,0x11,0xaf,0x09,0x6a,0x77,0xbf,0xce,0xb4,0x5b,0x98,0x3e,0xfe,0x45,0x5e,0x3f,0x03,0x15,0x5d,0x6b,0xc7,0xb0,0xac,0xc8,0xe6,0x0c,},\"\\xb9\\x23\\xca\\x67\\xe3\\x96\\xd8\\x65\\x6f\\xa3\\xdb\\xce\\x82\\x89\\xa3\\x8b\\xd3\\xc1\\x28\\xce\\xfb\\x30\\xef\\xc1\\x86\\x2b\\xb9\\x44\\xb4\\x50\\x78\\x05\\x41\\x98\\x24\\xce\\x2b\\x83\\xd6\\x90\\xef\\x4c\\xf1\\x07\\x49\\x28\\x17\\x14\\x3b\\xf6\\x4c\\x02\\x49\\x89\\xaf\\x1a\\x7d\\x2e\\x1f\\x5a\\xc9\\x78\\x74\\xf8\\x6b\\xb0\\xd3\\x77\\x3f\\xf8\\x40\\xf5\\x14\\xd9\\xa1\\x39\\x4a\\x39\\x59\\xb0\\x11\\xd3\\xa6\\xb8\\x16\\xa3\\xfa\\xe5\\xde\\x17\\xb2\\xa9\\xff\\x34\\x98\\x63\\xd2\\x7f\\xbb\\xb5\\x0c\\xca\\x73\\x41\\x08\\x75\\x10\\x00\\xd6\\x35\\x8c\\xa0\\x64\\x7a\\x93\\xeb\\x49\\xe2\\xe7\\xaf\\x06\\x28\\x7d\\x48\\xf2\\xc0\\x9d\\x5c\\x1c\\x73\\xe4\\xd8\\xf7\\x7e\\xa2\\xbc\\xaa\\x73\\x56\\x79\\x5b\\x26\\x72\\x87\\x19\\xbe\\xd5\\xff\\xdb\\x82\\x15\\x78\\xbd\\x5d\\x66\\xbf\\x92\\xed\\xaf\\x8b\\x23\\x8b\\x2b\\xbd\\x7d\\x1e\\x2c\\x30\\xa7\\x87\\xf9\\x01\\xa3\\x3d\\x0a\\x76\\x66\\x9a\\x9c\\x3c\\x7f\\x2b\\x55\\x2c\\xcb\\x83\\x49\\xc7\\xde\\xd5\\xe1\\xa4\\x61\\x70\\xcf\\x28\\xe3\\x59\\xe2\\xfd\\xd5\\x4b\\x05\\xa5\\x62\\xf5\\x28\\xc6\\x8a\\x56\\x97\\x4d\\xf8\\x2d\\x46\\x66\\x37\\xc8\\xe5\\x32\\x46\\xa7\\x21\\x7e\\x43\\x86\\x80\\x1e\\x0e\\x32\\x66\"},\n{{0xdb,0x9b,0x81,0x2c,0xb3,0xc7,0xc0,0x3b,0x97,0x7f,0x48,0x7d,0x3d,0x65,0xcc,0xd9,0xcd,0x2f,0x3d,0xee,0x11,0x60,0x20,0x67,0xdb,0xfb,0x72,0xb5,0x89,0xff,0x3f,0x79,},{0xff,0xa0,0x38,0xad,0x8c,0x3b,0x37,0x8c,0xe7,0x5d,0x65,0x84,0x4d,0x08,0xe3,0xd6,0xa9,0x2d,0x19,0x4a,0x1b,0x78,0x62,0xe9,0xd9,0x72,0x0d,0x20,0x67,0x9b,0x29,0x44,},{0xa6,0x28,0xa7,0x74,0x21,0xb2,0xab,0xab,0x57,0x6e,0xed,0x35,0xd2,0xee,0x3d,0x14,0x56,0x1b,0x21,0xfa,0x14,0xa6,0xe2,0xfa,0xc2,0x63,0xc3,0xea,0xdd,0x79,0xf2,0xfc,0x06,0x69,0xf9,0x42,0x9b,0x91,0x0b,0x84,0x22,0xb4,0xb2,0x9a,0xc0,0x26,0xa4,0x2e,0x98,0xd1,0x81,0xbe,0x35,0x07,0xc5,0xed,0x7c,0x74,0x8a,0x1f,0xdc,0xf1,0xd8,0x07,},\"\\xa7\\x00\\x92\\xc7\\x69\\x7c\\xd4\\xa2\\x09\\x56\\x7c\\x38\\xba\\x7f\\xb7\\x1a\\xa8\\xf1\\x5e\\x58\\x27\\xa2\\x08\\x76\\x92\\x39\\x43\\xfd\\x6a\\xdc\\x65\\x9c\\x98\\x67\\xac\\x6f\\x58\\xa6\\x1d\\xc7\\xce\\xc3\\xd3\\x62\\x41\\x16\\x82\\x00\\x0c\\x1a\\x9a\\xd1\\x29\\x5e\\xb8\\xb7\\x0f\\x24\\x2d\\x86\\xb5\\x86\\x5e\\xb7\\x6b\\x87\\xe3\\xf2\\xc6\\x94\\x1d\\x26\\x12\\xee\\x3b\\xcd\\xe8\\xf1\\x97\\x65\\x56\\x67\\x33\\x15\\x2e\\xf5\\x4e\\x95\\x69\\x09\\x43\\x28\\x5f\\x78\\xb3\\x75\\xf4\\x03\\x65\\x85\\xd4\\x73\\x9d\\xee\\xde\\xef\\x6d\\x94\\x6d\\xb6\\x1c\\xa4\\x58\\xef\\x4f\\x65\\x0d\\xa9\\x63\\xc3\\x85\\xe2\\x9d\\xfd\\xee\\x41\\x5f\\xe4\\x95\\x84\\x5f\\x55\\x19\\x7a\\x87\\x0f\\x8c\\xde\\xb5\\xa0\\x10\\xba\\x6b\\xbb\\x32\\xbf\\x1a\\x58\\x8c\\xc7\\x74\\xd4\\x89\\x01\\x84\\xc4\\xb2\\x92\\x4a\\x5b\\x80\\x73\\x31\\x3b\\xce\\x22\\x65\\x85\\xf1\\xad\\xfc\\x22\\x9c\\x90\\xbc\\x6c\\xc9\\xd2\\x12\\xe6\\x2f\\x05\\xd3\\x3b\\xed\\xac\\x96\\x1d\\x77\\xcf\\x8c\\x26\\x20\\xe4\\x51\\xde\\x81\\x7f\\x8c\\x1b\\xb1\\x6a\\x2c\\x59\\xff\\x80\\x4b\\x63\\x5a\\x73\\xa8\\xcf\\x8c\\x18\\x1b\\x3f\\x94\\x01\\xc3\\xb6\\x43\\xd1\\x8a\\x2f\\x70\\x6e\\xa9\\xca\\xe4\\x70\\x71\\xa6\"},\n{{0xce,0x37,0x9b,0xbe,0x2f,0xa8,0xab,0xcb,0xa5,0x1c,0x7a,0x75,0x43,0xde,0x5b,0x71,0x80,0x77,0x1b,0x3c,0x44,0xbc,0x6b,0x41,0x89,0x2e,0x7b,0x88,0x97,0x9b,0xab,0x90,},{0x7f,0x3c,0xff,0x89,0xf4,0x1b,0xab,0xf4,0xfa,0x64,0xcb,0xa3,0x3a,0x5b,0xb1,0x7f,0x41,0x3b,0xbf,0x2a,0x1e,0x11,0x2b,0x50,0xa8,0xe9,0xb1,0xf8,0x21,0xd8,0x49,0xbf,},{0xda,0x98,0xdf,0xb1,0x89,0x38,0x5b,0x2c,0x85,0x3b,0x6c,0xf3,0x75,0x73,0x80,0x46,0xa8,0xf2,0x7e,0xf2,0x79,0x74,0xab,0xce,0xce,0xa1,0xdb,0x02,0x98,0x9b,0x95,0x1f,0xe4,0x33,0xa6,0xce,0x1e,0x22,0x5b,0x3f,0xa8,0x20,0x32,0xfe,0x06,0x0a,0x7d,0x3f,0x6c,0x18,0x3f,0xd1,0x15,0x7f,0x79,0x1a,0x06,0x4b,0x40,0x76,0x50,0x57,0x16,0x00,},\"\\x00\\x1a\\x74\\xf0\\x95\\xc8\\x14\\xd3\\xbe\\xed\\x67\\xa8\\xd1\\x5f\\xc1\\x8e\\xfe\\x23\\x5d\\xc3\\xf6\\x45\\x78\\x12\\xa4\\x03\\x9b\\x7a\\x46\\xfe\\x9a\\x0e\\x9d\\xe8\\x1a\\x7a\\x4e\\x5f\\xba\\xb5\\xeb\\xe9\\xe1\\xe4\\x80\\x1b\\xd1\\x1b\\x45\\xc9\\xf7\\xad\\x06\\x36\\xa0\\x9b\\xff\\x42\\x16\\x4b\\xe5\\x74\\x9a\\x04\\xc0\\x2f\\x0a\\xb6\\x1f\\x0e\\xcf\\xdf\\xef\\x79\\x9b\\x82\\x7d\\xa6\\xa2\\x74\\xc8\\xd3\\xb3\\x9f\\x2e\\x38\\x05\\xa6\\x79\\x12\\x87\\xee\\xdb\\x23\\x14\\xd3\\xf8\\x42\\xb5\\x58\\xb9\\xb4\\x89\\xaf\\xe1\\xed\\x37\\xbb\\xbc\\xfc\\x5e\\x60\\xa4\\x31\\xd5\\xac\\x60\\xb3\\x9e\\x94\\x6d\\x90\\x3d\\x6b\\xf6\\xb1\\x40\\xe1\\x2c\\x7e\\x07\\xf9\\xed\\x7a\\xc4\\x6a\\x39\\x99\\xc6\\x24\\x5c\\x8a\\xb1\\xbd\\xb2\\x18\\x79\\xa3\\x17\\xa3\\xdc\\xd2\\x57\\xa5\\xc4\\xf3\\x49\\xb7\\xf5\\x9e\\x4e\\x43\\xd6\\x2d\\x9f\\x1c\\xd1\\x6f\\x51\\x8f\\x1c\\xa6\\xca\\xd3\\x7e\\x2c\\xb2\\x0f\\x25\\x98\\xc4\\x13\\x42\\x91\\xc6\\xb8\\xa9\\x8a\\xae\\x52\\x47\\xe2\\x6e\\xef\\xb7\\x6a\\xa3\\x8c\\x9c\\x82\\x31\\xc1\\x7e\\x9d\\xbf\\x27\\x1c\\xec\\x80\\xfb\\xa5\\xb4\\xa8\\x34\\xbd\\x9b\\xe8\\x1e\\xa8\\x41\\x63\\x7a\\xa9\\xcd\\xd4\\xc4\\xbf\\x26\\xd7\\xad\\x24\\xca\\x3c\"},\n{{0x2b,0x2e,0xe8,0x09,0xd6,0x47,0x02,0x3e,0x7b,0x77,0xfc,0x54,0x1f,0x44,0x87,0x5a,0x35,0xfa,0x94,0x1d,0x37,0xf7,0xc5,0xb2,0x1f,0xd3,0x49,0x34,0xd2,0x39,0x19,0x35,},{0x2c,0x29,0xd5,0x3e,0x1b,0xf2,0xc7,0x87,0x9d,0x73,0xd2,0x0b,0xa8,0x8c,0xa0,0x7a,0x0b,0x21,0x6d,0x7f,0x6d,0x05,0xd9,0x36,0x63,0xa6,0x5c,0x3d,0x9e,0x10,0x63,0x3a,},{0x12,0xd9,0x06,0x85,0x77,0x55,0x72,0xc9,0xea,0xbc,0x9b,0xe2,0x57,0x4c,0xa9,0xae,0x66,0xf0,0xe6,0x52,0xe5,0x78,0xb2,0x17,0x36,0xcd,0x6e,0x65,0x4f,0x7c,0x6b,0x15,0x45,0x88,0x3d,0x56,0xbf,0x76,0x0c,0xcf,0xc3,0xcf,0x87,0x54,0x4e,0x00,0x04,0xc7,0x98,0x06,0x12,0x57,0xe1,0x30,0x03,0x0c,0xb9,0x97,0xa7,0x88,0x36,0x9a,0x9a,0x05,},\"\\xc4\\x14\\x7d\\x64\\xeb\\xfd\\xa4\\x1a\\x1b\\xe5\\x97\\x72\\x62\\x95\\x81\\x04\\xe9\\x40\\xc3\\x87\\x6b\\xcd\\x5b\\x69\\x56\\xac\\xfd\\xec\\x32\\xc6\\x60\\x91\\x4d\\x62\\x62\\x3c\\x21\\x06\\x63\\xcb\\x2c\\xbe\\x62\\x49\\xd7\\xf5\\x27\\x49\\x91\\xc6\\x0e\\x95\\x0e\\x8e\\x28\\x09\\x04\\x99\\x53\\xc6\\x95\\x81\\xd2\\x46\\x9f\\x4f\\xe9\\x82\\xc7\\x43\\x4f\\xed\\xd9\\xd4\\xe0\\x0a\\xe0\\x88\\x96\\xd6\\x2c\\xc1\\xfb\\x98\\x4d\\xd2\\x33\\x15\\x0c\\xc2\\x48\\x3e\\x15\\x9c\\xff\\x40\\x97\\xdf\\x8c\\x03\\x6b\\xb6\\x33\\x00\\x3a\\xbb\\xfb\\xe1\\x8c\\x8f\\xa7\\x9b\\x5a\\x22\\x27\\x08\\x38\\x12\\x3f\\xc9\\xbe\\x39\\xb8\\x89\\x2c\\x80\\x38\\x4a\\x38\\x50\\x28\\xc1\\xa8\\x1e\\xc5\\x8c\\x8f\\x21\\x06\\x0e\\x78\\xaf\\xd2\\xc0\\x4b\\xfd\\x2d\\x30\\xca\\x39\\x77\\xc6\\xed\\xad\\x51\\x8c\\xc1\\xe2\\x00\\x4c\\xdc\\x14\\xbf\\x3d\\x15\\xf5\\xf5\\x28\\xe5\\xaf\\x27\\x7f\\xa1\\x82\\x27\\x58\\x70\\xe5\\xc0\\x12\\xf5\\xf8\\x2f\\xb1\\xaf\\xd0\\x4e\\xdd\\xe4\\x57\\x8d\\xdd\\x21\\x60\\xa1\\xa3\\xdb\\xc0\\x50\\xe8\\x0b\\xdd\\x81\\x1b\\xc8\\x8e\\xad\\x79\\xbf\\x93\\xf0\\x10\\xcd\\x0f\\xd4\\x43\\x3d\\x0b\\xc3\\x48\\xda\\xcf\\xd0\\x94\\x7c\\xce\\xda\\x62\\xbf\\xa4\\x97\\x11\\xd0\\x13\"},\n{{0x4e,0xa1,0x8d,0x6b,0x4a,0xf8,0x05,0x3b,0x88,0x5e,0xc1,0x88,0xbe,0x48,0xde,0xb8,0x6f,0xfb,0x2a,0x69,0xa4,0xce,0xc8,0x66,0x37,0xbb,0xd7,0xb4,0x1b,0x80,0x7c,0x46,},{0xe5,0x98,0x60,0x59,0x97,0x62,0x33,0xed,0x77,0x38,0x2c,0x3d,0x99,0x59,0xf3,0x4e,0x31,0x79,0x62,0x69,0x65,0x53,0xe8,0x6e,0xd1,0xe5,0x90,0x2c,0x4b,0xed,0xd1,0x67,},{0x27,0x57,0x0c,0x00,0x2a,0x48,0x7d,0x00,0x0c,0xa3,0x92,0x8b,0x83,0xcb,0x43,0x19,0x72,0x2c,0x46,0xdf,0xb4,0xcc,0xa2,0x60,0xde,0x79,0x0e,0xc0,0xe3,0xc1,0x93,0x26,0x88,0xf8,0x73,0x62,0x95,0x28,0x18,0xb5,0x4f,0x51,0xbc,0x7a,0xee,0xb2,0x63,0xf9,0x60,0xbc,0x0d,0xa8,0x96,0x4b,0xf3,0x12,0xef,0x93,0xe8,0x1f,0x06,0xc8,0x0b,0x04,},\"\\xe9\\xc8\\x9a\\x1a\\x11\\x19\\x37\\x32\\x06\\xce\\x40\\xed\\xe3\\xb8\\x9a\\x82\\xf8\\x94\\x62\\xa1\\xde\\xe9\\xe7\\x89\\xe9\\x84\\x5e\\xec\\x21\\xf5\\x71\\xc0\\xfa\\xef\\xd4\\x30\\xad\\x33\\x8e\\x4a\\x72\\xc0\\x47\\xa3\\x9a\\x42\\x59\\x58\\x03\\x87\\xfb\\x9a\\xac\\xad\\xdc\\x36\\xa2\\xb5\\x1e\\x7b\\x60\\xa8\\x7c\\xa1\\x32\\x1f\\xf8\\x06\\x79\\x4c\\xd6\\xdd\\x45\\x49\\xa4\\xdf\\x45\\xc2\\xda\\xe3\\xe5\\x39\\xc4\\xd7\\xd0\\x6b\\x6e\\x6e\\x9f\\x46\\x6f\\xfc\\xa2\\xfa\\x49\\x78\\xce\\x3d\\xc7\\x92\\xe4\\x4a\\x62\\x83\\x88\\x0c\\xd1\\x38\\xa7\\x5a\\x22\\x6f\\x98\\x5d\\xa4\\x1f\\xfd\\xc0\\xe3\\x2a\\x5a\\x85\\xc8\\x5f\\xe9\\xa4\\x3a\\xe7\\x8f\\xcf\\xe5\\x7f\\x4d\\xd7\\x54\\x0a\\x6d\\xd3\\x92\\x4a\\x49\\xab\\x39\\xeb\\x69\\x95\\x0d\\x42\\x11\\x51\\xd9\\x6b\\x1e\\x4f\\xd3\\x93\\x58\\x90\\xf6\\x34\\xcd\\x52\\xa7\\x3a\\x75\\x5f\\x5c\\x2f\\xb7\\x2f\\x9c\\xd5\\xa2\\xe6\\x7e\\xa9\\x30\\x91\\x5e\\x13\\x3b\\x47\\xcf\\x6b\\x7c\\x10\\xa9\\xd8\\x89\\xc6\\xaf\\x6b\\x5f\\x1f\\x4f\\x51\\x09\\x4d\\x27\\xfb\\xba\\x22\\x8a\\xc2\\x26\\x8b\\x34\\x40\\x27\\xfd\\x49\\xe4\\x26\\x34\\x3c\\xc0\\x13\\x43\\x99\\xb4\\xb5\\x10\\xaa\\xea\\x50\\x23\\x4d\\xf4\\x2c\\x37\\xfa\\x1c\\x4f\\x4d\\x0e\"},\n{{0xfc,0x1b,0x75,0xd1,0x7d,0x38,0x07,0x21,0x73,0x51,0xd2,0xaa,0x40,0xd9,0xb0,0x4f,0x52,0x5b,0x89,0xed,0x3f,0x5f,0xcd,0xb3,0x11,0xbe,0xc2,0xae,0xc5,0xcb,0x7e,0xce,},{0x55,0xe4,0x84,0xe7,0x74,0xa4,0x39,0x2a,0x9d,0x6e,0xef,0xf8,0x35,0xa8,0xfb,0xb2,0x32,0xcf,0x62,0x76,0xa8,0x9c,0x74,0xfc,0x0d,0x1b,0xb2,0x04,0x5a,0x8b,0x21,0xbe,},{0x9a,0x68,0xd1,0x51,0xfe,0xa3,0x90,0x98,0x93,0x35,0x9e,0x60,0xb9,0x6b,0x68,0xb2,0xa3,0xe2,0x94,0x6f,0x2b,0x47,0xb8,0x75,0x39,0x8a,0x1e,0x39,0xeb,0x01,0x46,0x3d,0x35,0xea,0xe7,0xd9,0x76,0xf8,0x33,0xa7,0x62,0xb5,0x1f,0x27,0x26,0xee,0x0d,0xcc,0xad,0x5c,0xe3,0x60,0x05,0x64,0xfd,0x9d,0xd5,0x8c,0x23,0x80,0x7f,0xdf,0xfd,0x05,},\"\\xd0\\x31\\xbd\\x11\\xda\\x30\\x80\\x97\\xe3\\xbe\\xb6\\xff\\xdb\\x26\\x00\\xee\\x6a\\x19\\x3c\\xa6\\xd8\\x32\\x45\\x01\\xc9\\x72\\xb1\\xa2\\x51\\x66\\xfa\\x7a\\x36\\x9f\\x5b\\xc8\\x82\\xea\\x45\\x61\\x2c\\xf0\\x25\\x80\\x25\\x4d\\x21\\xb4\\x0b\\x03\\x63\\x23\\x7e\\x83\\x5d\\xae\\x26\\x56\\xc1\\xb7\\xf4\\x73\\x6e\\x88\\xbe\\x53\\xd6\\xb1\\x19\\xc0\\x7f\\x57\\x29\\xbb\\xd8\\x2f\\x67\\xde\\x03\\x58\\x83\\x22\\x87\\x92\\x43\\xc5\\x99\\x0a\\x7e\\x61\\xf5\\x69\\x07\\xb2\\x41\\x71\\xa5\\x7c\\xbb\\x0b\\xbe\\xfb\\xa2\\x31\\x62\\x77\\xaf\\x93\\x26\\xf9\\xcb\\xf3\\x53\\x8b\\xcb\\xf6\\x78\\x0b\\xe4\\x18\\x25\\xa2\\xca\\x77\\x4b\\x41\\xbd\\xb1\\xcd\\x5c\\x60\\x88\\x51\\xec\\x23\\x39\\xeb\\x2f\\x4f\\xee\\xdd\\xaa\\x89\\x1a\\x63\\x26\\xb2\\x9d\\x97\\xd7\\xfb\\xf3\\x11\\xe3\\xbb\\x74\\x9c\\x5d\\x4c\\x05\\x8d\\xcc\\x14\\xf4\\x52\\xf9\\x33\\x49\\x91\\xe2\\x71\\xc1\\x6d\\x65\\x08\\xc8\\x18\\x63\\x39\\x27\\xf4\\x29\\x80\\x4c\\xa7\\xa3\\x81\\x70\\xf1\\xb9\\xf6\\xbd\\x73\\xed\\x67\\x5e\\x11\\xe8\\xc0\\xd3\\x21\\xfa\\xc9\\x12\\x73\\x0b\\x4b\\xa2\\xf7\\xc4\\x28\\x53\\x4a\\xdc\\xaa\\x4d\\xad\\x31\\x4c\\x55\\x80\\x7e\\x6c\\x64\\x2d\\x49\\x4c\\x6b\\x2f\\x0e\\x8c\\xd1\\x29\\x77\\x5c\\xc0\"},\n{{0x0d,0x0b,0xf4,0xd4,0x2e,0xf8,0x10,0xb1,0x79,0xeb,0x84,0x17,0x71,0xde,0x6d,0xbd,0xe7,0x63,0x61,0xca,0xf8,0x94,0xe4,0x2a,0x14,0xb1,0xe0,0x97,0x87,0xea,0x3e,0x06,},{0x71,0x71,0x51,0x0b,0x43,0xfc,0x17,0xef,0xa8,0x0b,0x15,0xe3,0x20,0xb1,0xb0,0xa4,0x08,0x33,0x25,0x42,0xe0,0xd3,0x6e,0x4a,0xb9,0xa6,0x49,0xcd,0x94,0x1b,0x5a,0xed,},{0x24,0x44,0x6b,0xdf,0x03,0x41,0x6a,0x4d,0x08,0x61,0x44,0x66,0xfb,0x85,0x1d,0xb5,0x0e,0x91,0xa6,0x23,0xca,0xcd,0x1b,0x0b,0x35,0x66,0x0f,0x3c,0xf9,0x33,0x20,0x0e,0x15,0x30,0x87,0x08,0xda,0x34,0x99,0xa5,0xad,0x25,0xf0,0xf0,0x30,0x6b,0x79,0x42,0x76,0x2e,0x20,0xa7,0x65,0xb7,0xca,0x9b,0x90,0x1c,0x75,0x0b,0x3a,0x95,0x32,0x0a,},\"\\x8e\\x21\\x79\\x97\\x5d\\x0a\\x8e\\x5a\\x69\\xfe\\x87\\x5a\\x3c\\xb1\\xe7\\x9a\\xec\\x49\\xc3\\x85\\x3e\\x30\\xdd\\x03\\x20\\xfe\\x3e\\xbf\\xb6\\x38\\xb8\\x2f\\x89\\xad\\x16\\x43\\x03\\x6b\\x37\\xe5\\x6e\\x0b\\x55\\xe0\\xa9\\xe2\\x2a\\x4e\\x28\\x3d\\x7a\\x27\\x48\\x5c\\xe9\\x10\\x2d\\xb6\\x78\\x7d\\x66\\x28\\xb7\\x79\\x13\\xe1\\x08\\x96\\x77\\x4e\\x49\\x5c\\x26\\xe8\\xba\\xb2\\x6e\\x7f\\x9a\\x94\\xd2\\x9a\\xaa\\x36\\xae\\xc9\\xc2\\x6a\\xd3\\xf5\\x0e\\x5d\\x8c\\x0b\\x76\\x98\\xbb\\x5f\\x01\\xb8\\x76\\xd0\\xd6\\x5f\\xcf\\x5e\\x9e\\x32\\xcd\\x7b\\x89\\x82\\x9e\\xd0\\x5b\\x0b\\x8f\\x63\\xa9\\x38\\x58\\x98\\x5b\\xc9\\x56\\x9f\\xce\\x42\\x9f\\xd3\\x7a\\x21\\x1a\\xbe\\xd6\\x50\\xf5\\x85\\xc3\\xb5\\x59\\x00\\x44\\x3b\\x6c\\x5d\\x6e\\x8a\\x48\\xba\\x67\\xde\\xee\\xd0\\x7b\\x76\\xe9\\x69\\xfc\\x88\\x43\\x0f\\xce\\x27\\x09\\xc0\\xbb\\x5c\\xe9\\x26\\xab\\x7f\\x44\\xe0\\xcd\\x79\\xf4\\xec\\x35\\x9e\\xf7\\x67\\x48\\x88\\x3f\\xcc\\x3d\\x02\\x6e\\xdd\\x06\\xc8\\xb9\\xcb\\xa5\\x4b\\x99\\x0d\\x30\\xaa\\x41\\xf1\\x44\\x8a\\x10\\x89\\x3f\\xb0\\x53\\x92\\x80\\xc5\\x99\\xd4\\x23\\x61\\x43\\x3a\\x34\\xcd\\xaf\\xd8\\xeb\\xdd\\x92\\xef\\xb9\\xc3\\x8a\\x36\\xda\\xf4\\xc7\\x40\\x60\\xc6\\x96\"},\n{{0x57,0xb5,0x19,0x4d,0x26,0xab,0xe4,0xab,0x21,0x16,0xc0,0xf0,0x3d,0x23,0xdb,0xe1,0x16,0xd4,0x88,0x25,0xa2,0x5e,0x77,0xd6,0x46,0x48,0xb4,0x36,0x92,0xae,0x25,0xbf,},{0x49,0x9c,0x02,0xdb,0xad,0x2a,0x4e,0xab,0x3b,0x6f,0xf1,0xab,0xa3,0x94,0x4b,0x91,0xc3,0xf2,0x73,0xa3,0x82,0xc5,0x48,0xa6,0xf3,0xa1,0x9c,0x83,0xf0,0xa8,0x67,0x24,},{0x4c,0x73,0x45,0x96,0x0c,0x8f,0xd4,0x8a,0x7d,0xea,0xd7,0x1d,0xbd,0x61,0x90,0x84,0x68,0xef,0xa8,0x65,0xa1,0x35,0x56,0x8c,0x8f,0x9c,0xa0,0x05,0x54,0x83,0x46,0x86,0x17,0xa7,0xe3,0x35,0x84,0x0f,0x57,0xc6,0xcd,0x8f,0x2c,0x98,0x05,0xcd,0x47,0xa9,0xd7,0xcd,0xfd,0xe5,0x3d,0xa8,0xef,0x4f,0x1a,0xdb,0xb6,0xf6,0x98,0xaa,0xf1,0x00,},\"\\xb4\\x81\\x3c\\x9d\\x13\\x21\\x5f\\xe9\\xf6\\x3a\\x78\\xff\\x7a\\xc9\\x51\\x73\\xeb\\x81\\x0b\\x46\\x13\\xf0\\xf4\\x8d\\x68\\x76\\xb2\\xbd\\x3b\\x2c\\x72\\xbc\\x7d\\x98\\xcb\\x1a\\xc3\\x2b\\xc4\\x1c\\xa4\\x7f\\x09\\x89\\x6f\\x79\\x20\\x4e\\xcf\\xb8\\x26\\x4c\\xe8\\xf3\\xc3\\xe7\\x6d\\xc1\\x24\\xda\\x8d\\xdc\\x6e\\x0d\\xfc\\x1e\\x13\\xb5\\xa5\\x29\\xf2\\x0c\\x82\\x61\\x3f\\xb9\\xa8\\x2e\\x5f\\x5d\\x77\\x32\\x6a\\x86\\x1f\\xae\\xda\\xbc\\x73\\x25\\xc5\\x9a\\xf3\\x3d\\xae\\x67\\x44\\x02\\x5e\\x64\\x97\\x74\\xfc\\x4f\\x79\\x13\\x4b\\xf9\\xf6\\xe3\\xd5\\x87\\x5d\\xd9\\x1b\\xc8\\xa1\\x4c\\xc3\\x6a\\x66\\x28\\x3d\\x01\\xd8\\xd1\\x08\\xc1\\x33\\x27\\xec\\xa5\\x30\\x57\\xba\\x50\\xbf\\x21\\x0c\\x19\\xf1\\x39\\xde\\x64\\x94\\x98\\x26\\x46\\x19\\x8a\\x12\\x46\\xc2\\x71\\xb0\\xa3\\x68\\xc1\\x0a\\xab\\x95\\xcd\\x89\\x61\\x23\\x5d\\x74\\x2d\\xf4\\x54\\x5b\\xe6\\x8b\\xd0\\x10\\xdc\\x0d\\xb2\\x3b\\x67\\x3e\\x62\\x36\\x09\\xe4\\x20\\xee\\x76\\xb1\\x05\\x6c\\x52\\x0f\\x9c\\xe8\\xfb\\xe8\\xee\\x18\\x63\\xdf\\x97\\xd1\\x7b\\x71\\x74\\x63\\x6c\\x3a\\x2b\\x61\\x22\\x95\\x09\\x19\\x48\\x81\\x0d\\x1d\\x4b\\x8a\\x58\\x43\\x76\\x0a\\x28\\x87\\xdc\\x55\\xef\\x51\\x2a\\xf0\\x41\\xec\\x54\\xfa\\xd3\"},\n{{0x06,0x8d,0x27,0xb2,0x1e,0x2a,0xcf,0xcc,0x19,0xc3,0xe9,0x67,0x3d,0xd4,0x41,0x42,0xd9,0x8a,0xac,0xae,0x89,0x49,0x30,0xe2,0x0c,0xa0,0x67,0x43,0x9e,0x74,0x9a,0x79,},{0xe2,0x2d,0xdd,0x39,0x6f,0x95,0x5b,0xb9,0x0e,0x28,0x47,0x76,0xaa,0x76,0xe9,0x21,0xe5,0x06,0x99,0xd0,0xca,0x89,0x14,0xa9,0xb7,0xb8,0x41,0xeb,0x5f,0xf4,0x7d,0x6d,},{0x0c,0x17,0x3c,0x48,0x8a,0xd0,0x01,0xcb,0xb9,0xc4,0x3d,0x7b,0x30,0xa7,0xc0,0x71,0xa2,0xfd,0xb0,0x8c,0xf7,0xf3,0x7d,0xaf,0x71,0xd7,0xae,0x71,0x28,0xdc,0x0d,0x43,0xf0,0xf0,0x95,0xb2,0x92,0x9c,0x54,0xb7,0x73,0xed,0x4a,0x1f,0x0b,0xf0,0xdc,0x4f,0x36,0x4f,0x06,0x01,0xe8,0xd5,0xae,0x06,0x2f,0x5b,0x78,0xc0,0x5b,0xfb,0xc7,0x02,},\"\\x1c\\x68\\x15\\x42\\x3d\\x1a\\x2c\\x5e\\xbe\\x88\\x28\\xd1\\x64\\x65\\x27\\xc1\\x7b\\x20\\x06\\xe5\\x47\\xf0\\x16\\xb5\\x35\\x0f\\x01\\x0d\\x79\\xb1\\x3d\\xf4\\xfb\\x8c\\x6e\\xd5\\x7b\\xa9\\xc2\\x6c\\x3c\\xb0\\xe0\\xa6\\x41\\x78\\xb6\\x50\\xa3\\xea\\x54\\x44\\xa4\\xfa\\xd5\\xb2\\x0a\\x3e\\xb8\\xca\\xa7\\x02\\x63\\x40\\x11\\xcf\\x78\\x92\\xa0\\x72\\x7b\\x6e\\x81\\x50\\xb0\\x77\\x04\\x29\\xa3\\x7a\\x8a\\x0b\\xb3\\xa7\\xed\\xb8\\x91\\xa7\\xc9\\x02\\x40\\xbc\\x03\\x60\\xb1\\x4e\\x6d\\xd7\\x70\\xa9\\x90\\xb3\\x1b\\x31\\xf3\\x3d\\xdb\\xf6\\x53\\x98\\x8f\\x82\\x74\\x2e\\x5e\\xec\\x31\\xb2\\x73\\x68\\xeb\\x0e\\x4f\\x1e\\xcf\\x4d\\x67\\x6f\\x49\\x21\\x4a\\x52\\x0d\\x1e\\x5b\\x2b\\xbb\\x59\\xac\\x2e\\x13\\x26\\x7e\\x07\\xa0\\xcb\\xac\\xbe\\xd9\\xf9\\x4d\\x74\\x73\\xed\\x69\\x78\\x28\\xb0\\x92\\x8f\\xcc\\x61\\x6e\\xe0\\x2e\\x51\\xfc\\xd8\\xdb\\x4d\\x8f\\x75\\x33\\xb7\\xb1\\x39\\xa0\\x5e\\x06\\xf9\\xe0\\xea\\xe3\\x29\\x93\\xe3\\x02\\x5a\\xef\\x05\\x90\\xb3\\xfb\\xb4\\x29\\x2a\\x3a\\xc4\\x07\\x65\\xe8\\x58\\x4e\\xad\\x00\\x26\\x6a\\xcd\\xcb\\xdd\\xe1\\x45\\x7a\\x03\\xb7\\xd5\\x7b\\xd5\\xc9\\xe6\\x4f\\xb0\\x6b\\x64\\xa5\\x0f\\x35\\xf0\\xa1\\xec\\x34\\xb6\\xdd\\xbd\\xe7\\x67\\xb9\\x6f\\xfd\"},\n{{0xa3,0x4d,0x52,0x56,0x31,0x59,0xe0,0x72,0x3e,0x9f,0x3f,0xd1,0x33,0xbd,0x96,0xe2,0x0a,0xda,0xe6,0x23,0xf8,0xc7,0x98,0x01,0x3b,0xc3,0x6b,0x44,0x14,0x89,0xbd,0xc2,},{0x1f,0xb6,0x58,0xe6,0x45,0xde,0x6d,0x3e,0xfd,0xb0,0x83,0xa7,0x3f,0xbd,0x59,0x2f,0xcd,0x4b,0x80,0x0e,0x03,0xc7,0xbd,0x68,0x1a,0xea,0xe6,0x57,0x6b,0xfb,0xbe,0x2f,},{0x5f,0xab,0x5a,0x71,0x40,0xd4,0x78,0x73,0x68,0x43,0x05,0xaa,0x63,0x53,0xd3,0x86,0x2f,0x5f,0xc1,0x3e,0x54,0xa4,0x0c,0x95,0x63,0xcc,0xea,0xc8,0xf7,0x40,0x08,0xc6,0xc4,0x45,0x63,0x1f,0xa8,0x64,0xe0,0xf1,0xc3,0x45,0xb5,0x95,0x4f,0x80,0x05,0x6a,0xeb,0xa2,0x56,0x62,0xb7,0x88,0x27,0xb5,0xe8,0xe3,0xa9,0x43,0x78,0x13,0x72,0x0f,},\"\\x1d\\x21\\x5f\\x85\\xc0\\x89\\xf3\\x5f\\x30\\x7a\\x74\\x6c\\x66\\xc7\\xc1\\xe4\\x1d\\x6b\\xa3\\x77\\x30\\xd7\\x59\\xe6\\xe5\\x62\\x2d\\x6c\\x6a\\x19\\x8e\\x40\\xf6\\x3d\\x37\\x87\\x3b\\x71\\x5d\\xf7\\x51\\x8b\\x3c\\x6b\\xb5\\xe9\\x5a\\x46\\x77\\x26\\xb9\\x7c\\x9a\\x0f\\x8f\\x5d\\xfc\\xdb\\xfd\\x1e\\x0d\\xe3\\x57\\x66\\x1d\\xde\\xab\\x55\\x50\\x42\\xb9\\x45\\xfd\\x89\\x9f\\xad\\x6d\\x38\\x2d\\x79\\x17\\xda\\x9e\\x12\\xdf\\xbd\\xa0\\xd6\\x99\\x00\\xb3\\x97\\x51\\x65\\xa7\\x3d\\x0a\\xc9\\xde\\x01\\xfd\\x30\\x48\\xb8\\xfe\\x5f\\x0b\\x90\\xbe\\x67\\xe0\\x3d\\xc2\\x2f\\x65\\x3a\\x0a\\x13\\xeb\\x4b\\x0b\\x75\\x3f\\x3f\\x3b\\xbf\\x78\\x73\\x69\\xeb\\xd8\\xbf\\x5e\\x00\\xeb\\x78\\xbf\\x0b\\x35\\x15\\xa9\\x1e\\x68\\xb1\\xd5\\xfc\\x69\\x20\\xbf\\x4f\\x42\\x59\\xf8\\xa7\\x30\\xef\\xc7\\xf1\\x01\\x6d\\x50\\x1e\\xf6\\xfb\\x7c\\xb8\\x36\\x6f\\xc8\\xe7\\x16\\xcf\\xa5\\x0e\\xa8\\xb2\\x03\\xcc\\xa1\\xa3\\x16\\x70\\x7e\\x0b\\x0f\\xc5\\x7e\\xaf\\xce\\x82\\xd6\\x2f\\x7f\\xf3\\xae\\x04\\xac\\x8f\\xd0\\x41\\xb5\\x5b\\x19\\xa3\\x52\\xa6\\x9e\\x6d\\x4b\\x79\\xd0\\xe6\\x50\\x17\\x51\\x68\\xe3\\x4f\\xa3\\x35\\x8e\\xac\\x81\\x6c\\xec\\xf2\\xc8\\xdd\\x1b\\xf2\\xa5\\x89\\x11\\x3e\\x91\\xbb\\x81\\x8f\\x91\\xf8\"},\n{{0x58,0xdf,0xe7,0x68,0xbf,0x52,0x11,0x84,0x94,0xb2,0x99,0x75,0x15,0x4c,0xf4,0x52,0xbd,0x97,0x46,0xdc,0x7d,0xe1,0xd6,0xbc,0xd1,0x8e,0xe6,0xa0,0x5a,0xcf,0xd8,0x58,},{0x0f,0x14,0x76,0xc6,0xcc,0x2a,0x1b,0x47,0x64,0xaf,0x75,0x80,0x5e,0x77,0x34,0x1f,0x14,0xa0,0xd8,0xb0,0x9c,0x6a,0x5b,0x2e,0xa2,0x87,0xfd,0x51,0x7c,0x3f,0xa6,0xb9,},{0x97,0x71,0x37,0xa3,0x8a,0xf4,0x4f,0x4b,0x26,0x2a,0xbf,0xf7,0xe0,0x72,0x82,0x43,0x3c,0x58,0x92,0x6d,0x56,0x2f,0xbc,0x61,0x80,0xbd,0xe6,0xcd,0x94,0x97,0x86,0x1f,0xb6,0xd9,0x55,0xcf,0x38,0x3d,0x99,0x9f,0xa1,0x03,0x7b,0x8b,0x17,0x54,0xce,0x88,0x8c,0x9f,0xfc,0x15,0x60,0xa4,0x51,0xd0,0xe9,0xdb,0x8d,0x74,0xd2,0x94,0x06,0x04,},\"\\x60\\x97\\x94\\x20\\x1c\\x4f\\x6f\\xaf\\x48\\x87\\x90\\xd6\\x1d\\xbf\\xf3\\xf4\\x1b\\x32\\x8c\\x5b\\x06\\x95\\xcb\\xe9\\xaa\\x8a\\x13\\x6d\\x72\\xb4\\x97\\x7b\\x21\\xb5\\x00\\xf2\\x16\\xe9\\xf3\\x21\\x68\\xad\\xa8\\xc1\\x3b\\xff\\x25\\x32\\x76\\x47\\xe3\\x0d\\x8a\\x24\\x4d\\x74\\xd8\\x83\\x03\\xab\\xc9\\x0b\\x7f\\x71\\xaa\\x07\\xca\\x04\\xd1\\x7b\\xc8\\xa0\\x16\\x7d\\x6e\\x63\\xfb\\x88\\xba\\xa1\\xda\\xb8\\x1d\\x50\\xf1\\xe9\\x1f\\x46\\xf5\\xaf\\x77\\xf2\\xe8\\x40\\x8b\\x82\\x63\\x36\\xa3\\x50\\x52\\xef\\xff\\xdf\\x4a\\xf7\\x95\\x96\\xaf\\x1b\\xb2\\x25\\x9f\\x83\\xc1\\xbc\\x10\\x9c\\xfd\\xc3\\xdd\\x50\\xfd\\x96\\xd3\\x10\\xf2\\x7e\\xa4\\xc6\\xc7\\x69\\x0f\\x21\\x81\\x5e\\xa9\\x2b\\xd7\\x93\\x89\\x68\\x0c\\xfe\\x3e\\xd4\\x0c\\x80\\x18\\x11\\x90\\x68\\x8d\\x24\\x22\\x2d\\x9a\\x1e\\xd5\\x2c\\xe6\\xa1\\x6b\\x41\\xdb\\xd9\\x10\\x7e\\xb6\\xd2\\xe3\\x59\\x4e\\x44\\x94\\xd7\\x5d\\xd7\\xc0\\x89\\xe3\\xb2\\x6f\\xfd\\x00\\xd1\\x00\\x3c\\x92\\xc4\\xc3\\x9a\\xe5\\x38\\x2e\\xf9\\x29\\x14\\x91\\xa8\\x80\\xca\\x4e\\xc3\\xac\\x2b\\x86\\xe6\\x67\\x19\\xb9\\x2b\\x6f\\x7c\\xea\\x2c\\xb0\\xbb\\xb1\\xcf\\x62\\x4d\\x0d\\x1a\\xbe\\xae\\x55\\x6e\\x5f\\x73\\x90\\x9d\\xd5\\x46\\x27\\x70\\x37\\xec\\x97\\x2f\\xd4\"},\n{{0x5a,0x63,0xef,0x9b,0xd7,0xdb,0xf0,0xe8,0x9f,0xef,0x15,0x59,0x83,0x65,0x9e,0x8a,0x0a,0x6c,0xa0,0x02,0xbc,0x42,0xfa,0xd5,0xa4,0x5a,0xf8,0xe0,0x28,0x19,0x23,0xf4,},{0xe6,0x32,0xf4,0xdc,0x99,0x42,0x31,0xcc,0x17,0x90,0xc2,0x1a,0xfa,0xda,0xa9,0x77,0xa5,0x89,0xb0,0xeb,0x0d,0xa1,0x9f,0xcb,0x27,0x92,0x91,0x1b,0x15,0xec,0xf8,0xaf,},{0x75,0x46,0x1f,0x99,0x65,0x0c,0x03,0x68,0x05,0x81,0x13,0xa1,0x5b,0xa1,0x6b,0xd2,0x33,0x7b,0x2e,0x63,0x3d,0xa3,0x81,0x12,0x87,0x8c,0x48,0x34,0xfa,0xc9,0xba,0x2e,0x30,0x7c,0x86,0x6c,0x02,0xaf,0x79,0xbe,0xa3,0x36,0x59,0x61,0x4c,0xbb,0x44,0x65,0xc5,0x7e,0xc3,0xef,0xfd,0x4c,0x47,0x8a,0xe3,0x8a,0x34,0xa0,0x5c,0xf1,0xed,0x07,},\"\\x79\\x6b\\xc8\\x36\\x1c\\x6e\\x8e\\xec\\x39\\x83\\x8b\\x24\\xf5\\x39\\x71\\xe8\\x20\\xf8\\x23\\x61\\xe0\\x51\\x0e\\xb4\\xde\\xf1\\xdb\\x25\\x12\\x38\\x7d\\x6b\\xf3\\x5b\\xbd\\xfa\\x31\\x88\\x79\\x20\\x94\\x35\\xd6\\x88\\x7b\\x14\\x10\\xb3\\xeb\\xc1\\x45\\x5f\\x91\\xf9\\x85\\xe0\\xfa\\xb1\\xce\\x1c\\x50\\x5c\\x45\\x55\\x76\\xbc\\xa0\\x35\\x39\\xd0\\x48\\xad\\x3a\\x0e\\xd1\\xf1\\x1c\\x73\\xba\\xc6\\x80\\x9e\\x2e\\xa1\\x47\\x97\\x5b\\xee\\x27\\xc6\\x52\\x61\\xac\\xa1\\x17\\xdf\\x0f\\xae\\x70\\x08\\xe2\\xc3\\xc1\\x30\\xbe\\xc5\\x53\\x3a\\xb8\\x93\\x51\\xc2\\x14\\x0c\\x9d\\x1a\\x62\\xbd\\xf6\\x88\\x62\\x97\\x87\\xf9\\x54\\xe1\\xc6\\x10\\xcb\\xb7\\x5e\\xdb\\x86\\x20\\x9d\\x7c\\x35\\x7c\\xd0\\x6e\\xf4\\x19\\x31\\xdd\\x5d\\xfd\\x1c\\x7d\\x40\\x7f\\xa4\\xee\\x1e\\xf2\\x93\\x93\\xbe\\xab\\x57\\x13\\x17\\x38\\x02\\xcc\\xe2\\xd5\\x62\\x29\\xcf\\xa7\\x6b\\x60\\x16\\x62\\xc4\\xd9\\xa8\\x4a\\x49\\x36\\xc5\\x2a\\xbb\\x19\\x81\\x37\\x8b\\x71\\x7e\\xb5\\x5c\\xb6\\x04\\xa6\\x8d\\x34\\xf0\\x3b\\x21\\x9f\\x32\\x22\\x6c\\xa0\\xe6\\x69\\x34\\x8a\\x2d\\x8d\\x24\\x53\\x93\\x0e\\xb6\\xe9\\xc2\\xbf\\x66\\xfa\\x4e\\x92\\xc7\\x51\\x36\\xe1\\x48\\xcd\\xb0\\x34\\x13\\x0d\\x3f\\x64\\x63\\x82\\xe1\\xc7\\x15\\x79\\xac\\x70\"},\n{{0x8b,0x2f,0x06,0x14,0x1e,0x40,0x11,0x63,0xf9,0x0f,0x67,0x4b,0x04,0xdc,0x90,0xdc,0xb6,0xdd,0x33,0x86,0x41,0x93,0x39,0x66,0x2e,0xcb,0x0d,0xff,0xad,0xf2,0x50,0x0b,},{0x54,0xda,0x93,0x4a,0x65,0x91,0x19,0x19,0x85,0x53,0xfd,0x45,0x66,0xb6,0x60,0xd8,0xd6,0x10,0xad,0xc3,0x29,0x0c,0xb8,0x48,0x29,0xc8,0x94,0x14,0x8c,0xf3,0xf6,0x7e,},{0xd6,0x8e,0x37,0x50,0xdc,0x56,0x43,0x23,0x97,0x40,0x1c,0x98,0xff,0x15,0x29,0xdb,0x9e,0xd4,0x8f,0xea,0x24,0x6d,0xd4,0xed,0x38,0x3e,0xc7,0x4c,0x1a,0x46,0x3a,0xeb,0x78,0x4c,0x87,0xb1,0xfd,0xa8,0xbb,0xce,0x97,0x0f,0xc9,0x7a,0xa9,0x80,0x7d,0xdb,0xe9,0x5d,0x41,0xfb,0x02,0x2e,0xa6,0x8c,0x1e,0x31,0x16,0x54,0xfa,0x1d,0xa2,0x07,},\"\\x1d\\xeb\\x25\\xd4\\x34\\x58\\x69\\x03\\x23\\xa7\\xd2\\x6a\\x26\\x69\\x50\\x90\\x99\\x34\\x74\\xf4\\x67\\xc6\\xfd\\xe5\\xdd\\xb3\\x4d\\xa9\\x45\\xbe\\x3c\\xea\\x2f\\x6b\\x75\\x65\\x2a\\xe2\\x1c\\xbc\\x4f\\xd2\\x27\\x63\\xa1\\xb4\\x55\\x83\\xe1\\xc3\\xe8\\x8b\\xbb\\x5f\\xea\\x20\\x49\\xb7\\x33\\x6c\\x91\\x15\\x99\\x88\\xc0\\x15\\x26\\x82\\x4c\\xa3\\xbe\\xf1\\x6b\\x36\\x2b\\x92\\x02\\xb8\\xb9\\x75\\x41\\x85\\xbd\\x61\\xbe\\xa8\\xf5\\x39\\xaa\\xdf\\x4a\\x1a\\xb1\\x35\\xfb\\xc3\\x1d\\x2a\\x8e\\x33\\x17\\x80\\x73\\x10\\x6c\\xbb\\xc0\\x2d\\x4c\\xd0\\xd3\\xc8\\xfe\\xaa\\x8e\\xb7\\x33\\x08\\x43\\x56\\x25\\x17\\x95\\xaf\\xbd\\x78\\xac\\x3c\\x4f\\x8a\\x3b\\xa1\\x9a\\xed\\x75\\x5c\\x64\\x6f\\x35\\x56\\x9c\\x7a\\x6c\\x67\\x5b\\x6d\\x69\\x18\\xe8\\x34\\x96\\x9a\\xca\\x03\\xf7\\x1a\\x2e\\x72\\xcc\\xb1\\x70\\x03\\xbb\\x75\\xb6\\x2e\\x85\\x2a\\xaf\\x58\\xb3\\xba\\xea\\x89\\xbc\\xd6\\x4a\\x32\\xeb\\x14\\xa6\\xb9\\xe1\\x0d\\xe4\\x89\\x71\\xe5\\x3d\\x0e\\x9a\\xc9\\x9a\\x78\\xf4\\x2d\\xe0\\x38\\x2e\\xf0\\xe8\\x0e\\xd3\\xcf\\xa3\\x43\\xf3\\x5e\\x4a\\x99\\x83\\xb9\\xae\\xed\\x98\\x6d\\x3a\\x57\\xf4\\x7e\\x5e\\x46\\xd4\\x0e\\x9d\\x67\\x73\\x02\\x80\\x9a\\x2d\\x37\\xe4\\xec\\x01\\x1f\\x05\\x1b\\x4d\\x03\\x1e\\xd6\\x00\"},\n{{0xdc,0x64,0x9f,0xbb,0x1b,0xee,0x0a,0x44,0x81,0x4d,0x6d,0x9e,0x90,0x80,0xd5,0xd9,0x0c,0x1f,0xc1,0x73,0xab,0x5f,0xef,0xed,0x82,0x6a,0x74,0x72,0x3a,0x77,0x4e,0x0a,},{0x02,0x14,0xc8,0x9f,0x38,0x67,0xad,0x2e,0x88,0x70,0xe5,0x0f,0x8c,0x2a,0x62,0x54,0x98,0x6d,0x9c,0x22,0x0e,0x33,0x38,0x41,0x13,0x00,0xcd,0x9c,0x64,0x04,0xd4,0xb1,},{0x0e,0x0c,0x5e,0x4e,0x18,0x43,0x75,0xda,0x4e,0xf7,0xe2,0xa2,0xe4,0x88,0x80,0x50,0xcd,0x84,0xe2,0xfe,0x21,0xd0,0x8e,0x84,0xa8,0x52,0xdb,0x2b,0xe3,0xfb,0xc3,0x72,0xc4,0x72,0xde,0x09,0x54,0xdc,0xd1,0xdc,0x11,0xae,0xc4,0x93,0xc5,0x69,0xf4,0x0f,0xc6,0xf7,0x7f,0x03,0xee,0x52,0x4f,0xb0,0x6e,0xc4,0x0f,0xaa,0x1d,0x6c,0xc1,0x0f,},\"\\x32\\x87\\x00\\xa8\\xae\\x58\\x1c\\x1e\\xdc\\x4e\\x2c\\x00\\xc7\\x8b\\xf4\\x60\\x60\\x97\\xf9\\xbd\\x75\\xaa\\xde\\x20\\x5a\\x24\\x3c\\x5f\\xd7\\x43\\x4d\\x62\\x22\\xda\\x93\\x7e\\x28\\x81\\xa2\\xe3\\xc5\\x74\\x35\\x6d\\x4d\\x56\\x79\\x30\\x1d\\xa9\\x9e\\x11\\xcf\\x74\\x9c\\x27\\x92\\x1c\\x8c\\xaa\\x2a\\xb2\\xa5\\x64\\xd8\\x7c\\x5d\\xf8\\xec\\xf1\\xa7\\x2b\\x68\\x01\\x84\\x82\\x4f\\x69\\x86\\x02\\x2e\\x3f\\xc9\\x8b\\xd2\\xa2\\x1c\\x34\\x55\\xab\\xf1\\x15\\x49\\x54\\xfb\\x30\\xc8\\x98\\x82\\x94\\x7b\\x02\\xf3\\x5a\\xf7\\xb1\\xbf\\xad\\x05\\x23\\x7d\\x24\\x2e\\x2b\\x74\\x83\\x2f\\xc5\\x36\\x19\\x6f\\x2e\\x59\\xd1\\xac\\xd0\\xc1\\xdb\\x6f\\x19\\x43\\xd0\\xf6\\x04\\x3b\\xbd\\x6a\\x76\\x90\\x83\\xed\\x66\\xba\\x0e\\x05\\xa5\\x0f\\xeb\\x0a\\xcf\\x72\\xb6\\xc1\\x6b\\xa9\\xaf\\x03\\x9a\\xfb\\x7f\\xe2\\xa4\\xaa\\xeb\\x4d\\x06\\x18\\x1c\\x5a\\x18\\x78\\x68\\x9e\\x67\\xa3\\xf5\\xd0\\xad\\x39\\xe7\\x94\\xd6\\x23\\x9a\\x7e\\x0a\\x12\\xce\\x82\\x0c\\x5b\\xe6\\x0f\\xd5\\xf1\\xdd\\x79\\x70\\x2f\\x49\\xd0\\x2b\\x79\\x75\\x5f\\xe8\\x73\\xf5\\x78\\x5c\\x72\\xf7\\x46\\x25\\xcd\\x7e\\x24\\x28\\x26\\x25\\x97\\xd3\\x14\\x82\\xc2\\xc0\\x50\\x88\\x01\\xfd\\x96\\x31\\x9d\\x61\\xb9\\x1b\\xa2\\x53\\xa5\\xe7\\x22\\xf4\\x14\\xcf\"},\n{{0x39,0xb8,0x06,0x2d,0xa4,0x3e,0x64,0xe1,0x67,0x67,0x65,0xd6,0x2c,0x7f,0xb8,0xe0,0xa9,0x9c,0x4f,0xd4,0x17,0xd6,0xf7,0xe3,0x31,0x9b,0xb1,0x30,0x44,0x20,0x5f,0x3b,},{0x62,0x27,0xce,0xfe,0x88,0xea,0x4f,0xb2,0x7b,0x37,0xb5,0xf7,0x97,0x77,0x8b,0xd7,0x2f,0xda,0xfe,0xad,0xcc,0xd9,0xae,0xb6,0x7a,0xd4,0x37,0xce,0x08,0xfb,0xa6,0xa8,},{0xc5,0xf6,0x26,0x49,0x0c,0x0e,0xf4,0xe1,0xef,0xc3,0xed,0xeb,0x0c,0xbc,0x3f,0x7d,0xe2,0x67,0x05,0x7f,0xb7,0xb6,0xeb,0x8f,0x0c,0x81,0x35,0x84,0x96,0x5b,0xc5,0xc4,0x21,0xfe,0xed,0xf5,0x42,0x41,0xca,0xe0,0x01,0xec,0x6d,0x5e,0x25,0xc9,0xb1,0xfb,0xa0,0x38,0x5e,0x5d,0xbd,0x95,0xa0,0x6e,0xc1,0xd8,0xae,0x51,0x91,0x44,0x96,0x0d,},\"\\x74\\x0a\\xf6\\x79\\xe3\\x06\\x9f\\xad\\x05\\x9f\\xa4\\x82\\x5f\\xa4\\x1c\\x59\\xfb\\xd4\\x84\\xaa\\x64\\x93\\x03\\xc2\\x7c\\x4f\\x7a\\x94\\x71\\x1c\\x5b\\x71\\x3b\\x2a\\x6b\\x89\\x87\\x85\\x9e\\x22\\x71\\xa6\\xa7\\x1e\\xb0\\xb4\\xa1\\x5a\\xbd\\xe4\\xf5\\x16\\x8f\\x6c\\xb9\\xdb\\xdc\\x6a\\x27\\xa2\\xa1\\x3d\\x52\\xc9\\x72\\x08\\x96\\xa1\\xf4\\xce\\x3a\\x53\\x45\\xee\\x79\\x3b\\x6c\\xc3\\xad\\x80\\xd7\\xd5\\x81\\x63\\xd5\\x45\\x5b\\x9c\\xbd\\x07\\x3e\\x2b\\x7a\\xdb\\xff\\x95\\x59\\x0c\\x71\\x72\\x27\\x1b\\xd9\\x1f\\xef\\xdb\\xd0\\x16\\x57\\xee\\x17\\x50\\x65\\x10\\x36\\xcd\\xc3\\x56\\x0b\\x44\\x4c\\xa2\\x18\\x4b\\xf4\\xf3\\xea\\x89\\xfc\\x97\\x3a\\xab\\x6f\\xb4\\xa8\\xee\\x57\\x04\\xbb\\xe5\\xa7\\x1c\\x99\\xfa\\x3b\\x5e\\xf0\\xd0\\x39\\x62\\x49\\x75\\x82\\x97\\x69\\x9a\\xe2\\x02\\xb8\\x19\\x69\\x0d\\xc7\\xac\\x46\\x92\\x77\\x03\\x46\\x90\\x78\\x45\\xe2\\x21\\x0d\\x53\\x63\\xad\\xee\\xc0\\x3f\\x0f\\xc7\\x76\\x1b\\x7e\\x0e\\xc0\\xfe\\xa1\\xbc\\xf6\\xb0\\x4f\\xc5\\x4b\\x3e\\x4c\\x40\\xd1\\x9b\\x8f\\xa6\\x49\\xac\\x84\\x79\\xe8\\xf8\\x07\\x30\\xc0\\xc9\\x4e\\x9f\\x4a\\x1a\\xd5\\x06\\xf2\\xbc\\xab\\x0c\\x49\\x54\\x0f\\x6d\\xec\\xaa\\x77\\xb3\\xd6\\x57\\xdc\\x38\\xa0\\x2b\\x28\\xa9\\x77\\xec\\xe4\\x82\\x54\\x5a\"},\n{{0x52,0xf4,0x67,0x5d,0x8c,0xcd,0x0e,0xb9,0x09,0xdf,0x0a,0x51,0x66,0x48,0xdb,0x26,0xfa,0x03,0x3b,0xa4,0x1d,0x43,0xfc,0x38,0x45,0x89,0x6d,0x45,0x6e,0x14,0x26,0x5f,},{0xf3,0x9e,0x7d,0xaf,0xc9,0x7b,0x0a,0x84,0xdc,0xbf,0x7f,0xa1,0x4a,0x94,0x03,0xee,0x1f,0xa9,0x2b,0x85,0xe5,0xa7,0xe5,0xd0,0x5f,0x03,0x1b,0x44,0xdd,0xf1,0xf7,0x94,},{0x4b,0xf6,0x68,0x82,0x7a,0x72,0x0a,0xf6,0x88,0x98,0xa0,0x6e,0xa7,0xb4,0x45,0x45,0xa3,0x4c,0xa8,0x96,0xec,0xf3,0x11,0xfe,0xea,0x47,0xe0,0x68,0x6d,0x91,0x1f,0xad,0xaa,0x03,0x11,0x89,0x97,0x15,0x3c,0x65,0x36,0x1f,0xea,0x15,0xde,0x9b,0xb8,0x91,0xb8,0x90,0x98,0x72,0x04,0x55,0x08,0xff,0xad,0x0c,0xd9,0xea,0xb2,0x1a,0x97,0x02,},\"\\x74\\x42\\x71\\x10\\x85\\x7c\\xb4\\xaf\\x0a\\x33\\x42\\xc2\\xb5\\x29\\x97\\xbc\\xe1\\xa0\\xdb\\x64\\x05\\xc7\\x4e\\x96\\x51\\xc5\\xb8\\x59\\x79\\xac\\xb0\\x71\\xe5\\x67\\xfe\\x70\\x41\\x2c\\x4e\\x0d\\x8c\\x9f\\xa4\\x21\\x91\\x4f\\x6a\\x62\\xf2\\xae\\x42\\x0b\\x7b\\x2f\\x4c\\xf8\\x0c\\x90\\x57\\x42\\x21\\x22\\x22\\x88\\xb6\\x58\\x67\\xea\\xa6\\x6e\\x7e\\x0a\\x05\\x57\\xa2\\x6c\\x54\\x9f\\x9a\\x7a\\x4e\\x70\\x83\\x8b\\xa4\\x07\\x4b\\x4c\\xd7\\xa9\\xd7\\x58\\xb3\\x78\\xb8\\x8d\\xd4\\x94\\x41\\xdf\\x80\\x2a\\x44\\x4d\\xcb\\xc3\\x06\\x24\\x93\\x3b\\x59\\x92\\x2f\\x33\\xc2\\x0f\\x01\\x9f\\xe7\\x8e\\xe2\\x4b\\x8f\\xba\\x79\\xa6\\x82\\xf3\\x88\\x50\\x5a\\xc9\\xc9\\x7f\\x4e\\xb8\\x7c\\x61\\x18\\x80\\x02\\x6b\\x4c\\x23\\x30\\x6b\\x86\\x51\\x73\\xf5\\xd7\\x16\\xab\\xc6\\xcd\\x9a\\x99\\x06\\xdb\\x34\\x30\\x13\\x6f\\x75\\x41\\x29\\xc4\\x43\\xb2\\x0c\\x42\\xbe\\x2f\\xbc\\xbc\\xd4\\x40\\x34\\xd7\\x14\\xf5\\x8a\\x4b\\xa8\\xe7\\x56\\x60\\x7a\\x02\\xb6\\x08\\xef\\x49\\x64\\x8f\\x2a\\xd0\\xce\\xa9\\x9e\\x7a\\xb3\\x0a\\x8d\\xd7\\x81\\x40\\x04\\xf7\\x25\\xf4\\x93\\x01\\xd7\\xb3\\x04\\xdc\\xda\\x62\\x5c\\x29\\x6d\\x92\\x8c\\xb5\\x81\\x73\\x6a\\xb7\\x39\\xc8\\x6b\\x46\\x92\\x41\\xa8\\x25\\x93\\x51\\xfd\\x37\\xb4\\x78\\x0a\\x99\\x93\"},\n{{0xba,0xd7,0x3c,0x9f,0xda,0x4c,0xeb,0x9d,0xa6,0xc7,0x01,0xc2,0xa6,0xe2,0xef,0xc0,0x46,0x7a,0xfa,0x0a,0x74,0xf8,0x75,0x0c,0x52,0xcf,0x1f,0xd4,0xc8,0xe7,0x48,0x9a,},{0xbb,0x0f,0x02,0x7a,0x90,0x35,0x37,0x6e,0x1a,0xa3,0x20,0x6c,0x3d,0x77,0x44,0x75,0xe3,0x51,0xf5,0x76,0x7e,0xf8,0x6e,0xf4,0x8a,0x72,0xc0,0x37,0xc2,0x4c,0xce,0x62,},{0x19,0x7d,0x6b,0x6c,0xc8,0x8a,0x98,0xc0,0x6d,0xfc,0xa0,0xc0,0x12,0x25,0xed,0xfe,0x38,0xa0,0xb2,0x28,0x9f,0x29,0xf8,0xa4,0x4e,0xc0,0x81,0x6a,0x95,0x2d,0x58,0x5e,0x2d,0x59,0xb5,0xb0,0x8d,0xe1,0x00,0xc0,0x60,0x62,0x96,0xcc,0xf5,0xe9,0x2a,0x99,0xe0,0x93,0x62,0x31,0x44,0xb8,0xb2,0x2d,0xb8,0x7d,0x92,0x92,0x25,0x54,0x60,0x05,},\"\\x74\\xb9\\x66\\xcb\\x78\\x07\\x71\\xae\\xe6\\x3d\\x73\\x4d\\xf3\\x75\\x67\\x02\\xd1\\xd5\\xfd\\xed\\xdf\\x32\\x13\\x6c\\x63\\x58\\xb8\\x36\\x31\\x8a\\x4f\\x98\\x4f\\xe7\\x1e\\x77\\x16\\xad\\xdd\\xbd\\x64\\x9e\\xba\\x44\\xcd\\x42\\x82\\xe0\\x05\\x5d\\x8c\\x1e\\xd2\\xd3\\x51\\x23\\xd6\\x6e\\x5a\\x98\\xf1\\xc0\\x83\\x8d\\xed\\x56\\x3b\\x9a\\x20\\xeb\\x80\\x07\\x53\\x8f\\xc7\\xb0\\x71\\x3e\\x7e\\x48\\x5e\\x3c\\x28\\xf6\\xeb\\xc4\\x21\\xa2\\x9d\\xce\\x25\\x24\\xdb\\x7f\\x29\\x20\\x57\\x61\\x03\\x6a\\xda\\x62\\xe5\\xb0\\xb7\\xd5\\xb7\\xf2\\x94\\xff\\x17\\xf3\\x38\\x23\\x2f\\xa5\\xfd\\x42\\xb6\\xf7\\x25\\x33\\x04\\x09\\x2d\\x84\\x8f\\x50\\x73\\x52\\x48\\x59\\x5d\\xa0\\xf7\\xef\\x28\\xe5\\x68\\xe9\\x91\\x6b\\xfc\\x56\\xd7\\xed\\x0d\\x81\\x1b\\x59\\xd5\\xd8\\x91\\xae\\x43\\xe1\\xb1\\x98\\x07\\x13\\x06\\xbf\\x52\\x5c\\x67\\x8c\\x63\\x43\\x99\\x80\\x05\\xfb\\xb7\\x86\\x9d\\x1c\\x40\\xf8\\xca\\xc8\\x07\\xfe\\x2e\\xf0\\x3f\\x3d\\x5b\\x93\\x3f\\x58\\x97\\x8e\\xf2\\x90\\x6f\\xcc\\xf7\\x44\\x4a\\x29\\x36\\xe6\\x3d\\x92\\x8c\\x69\\x09\\x26\\xc9\\xc9\\x94\\xed\\x3d\\x66\\x62\\x63\\xe9\\x56\\xfd\\xfe\\xa2\\x77\\x64\\xbc\\x5f\\x74\\x12\\x5b\\xc4\\x6b\\xc1\\x02\\xdd\\x3e\\x5f\\xf9\\x3b\\x5e\\x12\\x3e\\x4b\\x38\\xbd\\xef\\x69\\x7e\\x15\"},\n{{0x70,0x73,0x27,0xa4,0x31,0xdb,0xa7,0x76,0x39,0xb3,0x96,0x6b,0x2b,0xc0,0x95,0xf8,0xee,0xdf,0x57,0xf7,0xa2,0x00,0xe3,0xb0,0x07,0x7c,0xe4,0x20,0x38,0x9c,0x92,0xfe,},{0xee,0x24,0x96,0x91,0x08,0x64,0x18,0x9f,0xda,0xa3,0xc7,0x75,0x7e,0xb3,0xcd,0xa9,0xab,0x1e,0x70,0xfc,0x9e,0x7f,0x71,0xa3,0x8a,0x0b,0xfc,0x84,0x59,0x31,0xc9,0x5a,},{0xfb,0x99,0x02,0x9f,0xec,0xa3,0x87,0xa5,0xd7,0x65,0x96,0x1e,0x36,0x1d,0x71,0x72,0xb9,0x8b,0x7e,0x0f,0x11,0x29,0x0b,0xb1,0xe5,0xb5,0x7b,0x51,0xbc,0x21,0x23,0xd0,0xbc,0xe2,0x90,0x20,0x39,0x2a,0x4f,0xec,0x9a,0xe6,0xa7,0x2c,0x4c,0x38,0x6c,0xea,0x18,0x57,0xcb,0x8f,0x9c,0x50,0xaa,0x9a,0x76,0xd7,0xf1,0x68,0x7f,0xcf,0x29,0x00,},\"\\x32\\xef\\x31\\xb6\\x4e\\xee\\x70\\x0f\\xca\\x2a\\xb2\\x1a\\x26\\x7f\\x8d\\x9d\\x3b\\xdc\\x68\\x9c\\x75\\x38\\xfe\\x95\\x9b\\xf7\\x13\\xfa\\x99\\x5d\\xb2\\xc0\\xad\\x36\\xdd\\xe4\\x30\\xa8\\x41\\x7d\\x43\\x7b\\x72\\xc7\\x4e\\x26\\xdb\\xe3\\x1d\\x93\\x70\\x1d\\x46\\x17\\xfe\\x51\\x82\\x5c\\xff\\x7a\\x54\\x4f\\xc9\\xf4\\x4e\\x43\\x45\\xe1\\x4b\\x4b\\x11\\xe1\\x5f\\x26\\xff\\xc2\\xaf\\x80\\x35\\xf3\\xf9\\x70\\xe4\\xdd\\xa4\\x4c\\x0e\\xbc\\x03\\x63\\xc2\\xb5\\x6f\\xde\\x21\\x86\\x63\\xbf\\x78\\x83\\x90\\x92\\x53\\x8f\\xc2\\xf3\\x91\\x53\\xd4\\xeb\\x29\\xda\\x0c\\x1a\\x08\\xaa\\x96\\x66\\x01\\xcc\\x68\\xca\\x96\\xe9\\x93\\xb0\\x1b\\x17\\x3a\\x26\\x1b\\x2e\\xf3\\x27\\x65\\x03\\x82\\xf5\\x68\\xfe\\x94\\x48\\x55\\xb0\\xf4\\xfd\\x9d\\x15\\xe7\\x52\\xac\\x74\\xdc\\xfd\\x37\\xb3\\x78\\x6f\\xff\\xce\\xf2\\x33\\x39\\xc2\\x1e\\x92\\x70\\xdc\\xe8\\x89\\x1d\\xd5\\xee\\xeb\\xa9\\x60\\x8f\\xdc\\x7b\\x6f\\xbc\\xc9\\x9f\\xa1\\xb5\\x90\\x3d\\xaa\\x09\\x68\\xe1\\xb6\\x91\\xd1\\x9d\\x06\\xf2\\x15\\xde\\xd0\\x47\\xef\\x9d\\x76\\x61\\x0f\\x5d\\xe2\\x20\\xf5\\x04\\x1b\\x31\\x3f\\xaf\\x9e\\x96\\xc9\\xfd\\x7d\\xb5\\x4b\\x52\\x25\\x72\\x6a\\xf4\\x35\\xf9\\xcb\\xd9\\xfd\\x87\\xab\\x40\\xce\\x8f\\x2c\\x69\\x40\\xb5\\x5f\\x0f\\xaa\\xe8\\x78\\x50\\xca\"},\n{{0x6a,0xa5,0xc9,0xf0,0x08,0xf9,0x90,0x47,0x3b,0xa4,0xa6,0x28,0x6a,0x41,0x66,0x14,0x02,0x66,0x61,0xf1,0x1e,0x1a,0x24,0xef,0xa8,0x1a,0xc3,0x58,0x52,0xd1,0xd0,0x70,},{0x60,0x5a,0xc9,0xb4,0xdb,0xdd,0x50,0x33,0xd6,0xc8,0x28,0xbf,0xaf,0xa9,0x3c,0x00,0x39,0x44,0x0a,0xa1,0x1c,0xa7,0x24,0xae,0x83,0x40,0x43,0xe0,0x7b,0xd0,0x32,0xd5,},{0x97,0x56,0x30,0x3b,0x90,0x65,0x5e,0x93,0x52,0x51,0x03,0x2a,0xb1,0x9c,0xfc,0x95,0xca,0x1c,0x2a,0x2c,0x3e,0xa2,0x8b,0x03,0x3b,0xd4,0x70,0x66,0xcb,0xd4,0xc7,0xd8,0x98,0x2a,0x8b,0x98,0x86,0xf1,0xb9,0xcd,0x02,0xe8,0x8a,0x65,0x56,0x4d,0xa8,0xdc,0xc3,0x4f,0x30,0x8b,0xa9,0xf1,0x01,0x44,0xba,0x46,0x9c,0x2e,0xfa,0x49,0xe0,0x04,},\"\\xb5\\x16\\x5d\\x39\\x63\\xf6\\xe6\\xf9\\xea\\x56\\x57\\xe9\\xf0\\x7f\\xf3\\xa3\\x21\\xeb\\x33\\x8f\\x9a\\x8c\\x3d\\x3c\\x42\\x30\\x6b\\x2b\\x27\\x89\\x78\\xb3\\x1c\\x62\\x3a\\x63\\x1b\\xe3\\xb0\\x4c\\x41\\xed\\xfd\\xed\\xdf\\x53\\x8e\\x1b\\x76\\x5b\\xc8\\x78\\x54\\x01\\xc1\\xaf\\x29\\xd0\\x46\\x7a\\x64\\x41\\x1c\\x49\\x73\\x95\\xd7\\x55\\xdc\\xa0\\x3a\\xe3\\x27\\x2f\\x4b\\xc1\\xfb\\x19\\x18\\xdc\\xc1\\xed\\x6f\\x04\\xd6\\x49\\x84\\x04\\xa8\\xce\\x14\\x09\\xd4\\x47\\xf5\\x70\\xa4\\x35\\x95\\x22\\xcc\\x54\\x62\\x92\\x02\\xeb\\xe5\\x07\\xab\\x69\\x38\\x43\\x14\\x1b\\xd5\\xea\\x05\\x73\\xb2\\x0f\\x32\\x1a\\x48\\x3f\\xf3\\x83\\xa4\\x68\\x97\\xf5\\x92\\x6f\\xe0\\xb8\\xaf\\xc2\\x55\\x72\\x70\\x7b\\x63\\xee\\xed\\x28\\x35\\x32\\x92\\x8a\\x41\\x44\\x19\\x64\\x97\\x94\\x2c\\x57\\x2a\\xc5\\x47\\x60\\x51\\x39\\x25\\x6b\\x0a\\xa0\\xea\\xf0\\x4d\\xb1\\xa2\\x56\\x01\\x2e\\xd4\\x53\\xb1\\x73\\xee\\x19\\xad\\x6e\\x9b\\x1a\\xf3\\xf4\\x5f\\xf3\\x04\\x4a\\x64\\x1f\\x8c\\x8e\\xb0\\xac\\x7b\\xb4\\x5a\\xbb\\xde\\xd4\\x72\\x86\\xb2\\xa0\\x69\\xd3\\x90\\x86\\x94\\xee\\x06\\xf2\\xfb\\xd0\\xef\\x60\\x5a\\x79\\x11\\x02\\x6e\\xa9\\xea\\x3c\\x49\\x13\\xf3\\x8c\\x04\\xd8\\xb6\\x95\\x65\\xa7\\x02\\x78\\x67\\xab\\x30\\x92\\xd0\\x5f\\x4c\\xfb\\x18\\xfc\\x7c\"},\n{{0x8e,0xfb,0x8b,0x79,0x74,0x2b,0xe2,0x1e,0x6d,0x31,0xde,0x67,0x8b,0xc8,0x14,0x50,0xba,0x86,0x21,0x08,0x2c,0xd6,0xf0,0x00,0x3e,0x22,0x86,0x1e,0x22,0x91,0xc4,0x81,},{0x33,0x38,0x1e,0x35,0x6c,0x4f,0xd3,0x86,0xa3,0xf7,0xb9,0x69,0xaf,0xd9,0xf5,0xc0,0x0d,0x20,0x67,0xb6,0x98,0xb3,0xf1,0xf0,0x0f,0x37,0x84,0x20,0x2d,0x30,0x84,0xcf,},{0x92,0x30,0x05,0xcb,0x48,0x48,0x40,0x2a,0xa8,0xf9,0xd5,0xda,0x74,0x03,0x0b,0x00,0x94,0x44,0x92,0x4c,0x21,0x4a,0xd6,0x00,0xdd,0xba,0xb4,0xc1,0x53,0xa6,0xff,0x02,0x2b,0x53,0xcf,0x63,0x64,0xcd,0x7e,0xe9,0x9b,0xef,0x34,0xfe,0x14,0x4d,0xa9,0x64,0xed,0xfc,0x38,0xa0,0xba,0x63,0x33,0x12,0x65,0x0e,0xbf,0x0e,0x55,0xa0,0x60,0x09,},\"\\x6b\\x75\\x03\\x25\\xd3\\xa0\\xf0\\x8a\\x14\\x77\\x00\\xb5\\x1a\\x9b\\x37\\x25\\x57\\x10\\x94\\x81\\x8e\\xd6\\x9d\\x1f\\x76\\x10\\x13\\xeb\\x86\\xf3\\x23\\xf7\\x3c\\x49\\xf5\\xe4\\x39\\x87\\x7c\\x27\\x83\\xb3\\x36\\xd1\\xf1\\xa6\\x74\\xef\\x3e\\x43\\x1f\\xc1\\xae\\x01\\x80\\x08\\x2d\\xf5\\xfc\\xa6\\x9f\\x84\\x81\\x39\\xfe\\x6a\\xb6\\x73\\x9a\\x05\\x92\\xeb\\xd6\\xd4\\x70\\x5c\\x7f\\x01\\x36\\xb2\\x21\\x89\\xa1\\x1d\\x60\\xd4\\xd3\\xc9\\xbc\\x80\\xfe\\x7d\\x7c\\x00\\x95\\x2d\\x57\\x42\\xf9\\xc0\\xc2\\x12\\x1f\\xe7\\x92\\xdf\\x13\\x3f\\x22\\x1d\\xb9\\x91\\xfc\\x96\\x0e\\xe6\\x4b\\x9d\\x32\\xe0\\x17\\x8e\\x54\\x2b\\xce\\x8e\\xfa\\x8d\\x03\\xac\\x80\\x26\\xcd\\x77\\xba\\x8b\\xf0\\xb2\\x42\\x15\\xb9\\xfa\\xed\\x2e\\xae\\xc9\\x20\\xe9\\x25\\xd5\\xec\\x46\\xff\\xf6\\xbd\\xe7\\x25\\xe9\\x1c\\x82\\x80\\xe4\\xad\\xa2\\x32\\xa5\\x43\\x3a\\xe9\\x68\\x0e\\xbb\\x53\\xeb\\x55\\x55\\x31\\x47\\xc9\\x33\\x70\\x57\\x48\\x54\\x89\\x61\\x54\\x51\\x42\\x99\\xc0\\x93\\x21\\x9a\\x11\\x1d\\xca\\x4e\\x63\\x7a\\xd5\\x00\\x13\\x38\\xc6\\xd4\\xd5\\xee\\x90\\x98\\xc6\\x58\\x32\\xf7\\xaf\\x83\\x5b\\xcb\\x62\\x21\\x28\\x42\\x30\\x36\\xc7\\x9a\\x57\\x37\\x73\\x8a\\x75\\x39\\xf8\\xd4\\xa6\\xb8\\xb2\\x21\\xb5\\x6d\\x14\\x01\\xae\\xb7\\x4d\\x45\\x71\\xbc\\x00\\x9d\"},\n{{0xed,0x04,0x6d,0x68,0x8b,0x2b,0x0a,0x1b,0xc3,0xda,0xf2,0x11,0x9d,0xd3,0x21,0xa6,0x07,0xb1,0x6d,0x2a,0x2d,0x1d,0x96,0x3a,0xdd,0x12,0x09,0xc6,0x65,0xb5,0xcc,0xba,},{0x87,0x34,0xf1,0xff,0xcb,0xd7,0x1c,0xfd,0xe2,0x90,0x01,0x7e,0xa6,0x25,0x3e,0x58,0x0d,0x59,0xe6,0x5b,0x54,0x1b,0x46,0x52,0x1f,0x5e,0x5e,0xc1,0x45,0x1e,0xae,0xc6,},{0x72,0x1b,0xfd,0x47,0x76,0xcf,0xba,0x13,0x33,0x0f,0xd3,0x72,0x69,0xe9,0x79,0xc1,0xd7,0xb6,0xce,0x54,0xa5,0x1b,0x82,0xf4,0x56,0xe1,0x37,0x37,0x8e,0x58,0x2f,0x19,0x2a,0x12,0x08,0x9d,0xa5,0xab,0xa7,0x6a,0x7b,0x16,0x18,0x13,0xdc,0xe5,0x6b,0x72,0x89,0x2a,0x35,0x33,0x0c,0x94,0xf7,0xff,0x21,0xd0,0x9c,0xf0,0x9e,0x55,0x35,0x04,},\"\\xb9\\xcc\\x90\\xfd\\x8d\\xe2\\xa1\\x41\\xf9\\x51\\x16\\xdb\\x3b\\x04\\xbe\\x83\\xe9\\x85\\x22\\x59\\x7e\\xc2\\x17\\x49\\x64\\x24\\x51\\x80\\xb9\\xa4\\x73\\x76\\x7d\\x6d\\x47\\x0a\\x21\\x7d\\xb5\\xff\\x5a\\x1a\\xb7\\x77\\xe1\\xe2\\x8a\\x0b\\x16\\x97\\x5e\\x2b\\xac\\xb8\\x73\\x02\\x04\\x44\\xb4\\x7e\\xd8\\x32\\x64\\x21\\xb9\\x0e\\xbb\\x50\\x36\\x88\\xf0\\x90\\xc1\\x1b\\x3b\\x13\\x61\\x7c\\x5c\\x50\\x52\\xc2\\x97\\xa4\\x1e\\x28\\x93\\x77\\x5e\\x34\\xd5\\x9a\\xda\\x49\\xd9\\x94\\xc0\\xe4\\xa9\\xf5\\x22\\x0e\\x9f\\x03\\x15\\xa6\\x77\\x05\\xa3\\xec\\x08\\xaf\\x0d\\xc7\\x24\\xb5\\xcf\\x67\\xff\\x34\\xfa\\xda\\x8b\\xa7\\x10\\x9e\\xd2\\xb5\\xa8\\x90\\x7b\\xb4\\x03\\xfb\\x1a\\x83\\x8b\\x4b\\x05\\x9f\\x18\\xc7\\x92\\xd7\\xbf\\xec\\x05\\xde\\xe0\\xc9\\xcb\\xbf\\x17\\x53\\x40\\x9d\\x7d\\xb3\\xac\\xea\\xf4\\x7b\\x4c\\x61\\x39\\x84\\x97\\xb0\\xec\\xa6\\xc1\\xf8\\xac\\x08\\xa7\\xea\\x1e\\xb9\\xc4\\x0b\\xc4\\xe9\\x2e\\x88\\x82\\x12\\xf7\\xd9\\xee\\x14\\xfd\\xb7\\x31\\x58\\x16\\x09\\x44\\xff\\x9b\\xcd\\xfe\\xf1\\xa7\\x46\\x9c\\xc7\\x0f\\x94\\x74\\xe5\\xf2\\x4d\\xff\\xfe\\xa5\\x85\\xf0\\x9e\\xaa\\xab\\x4b\\xe2\\xaf\\xeb\\xbe\\x8e\\x6c\\xf8\\x6d\\x35\\x68\\x0d\\xc5\\xd1\\xb9\\x29\\x13\\xe8\\x48\\x25\\x6e\\xc7\\x36\\x31\\x6f\\xd0\\xa2\\x14\\x20\\x63\\xb0\"},\n{{0x76,0xac,0x8e,0x57,0x0a,0x39,0xb3,0xa0,0x23,0x2c,0x45,0x49,0x75,0x37,0xfb,0x21,0x55,0xac,0xec,0x36,0x17,0x86,0x5e,0xd1,0xdf,0x21,0x0f,0x00,0xb4,0x9d,0x1b,0x8d,},{0x31,0x2a,0x3a,0xd8,0x99,0xae,0x6a,0x25,0x50,0x7a,0xe6,0xe4,0x52,0x4e,0x10,0xb6,0x3a,0x6e,0x7a,0xe5,0x3d,0x9c,0xff,0xd3,0x9c,0xf2,0x85,0x21,0xd9,0x35,0x33,0xd6,},{0xcf,0x03,0xf5,0x25,0x91,0x3c,0x44,0x30,0x3b,0x2f,0x80,0x07,0x93,0x93,0xc2,0x1c,0x11,0x58,0x14,0x6e,0xcf,0x99,0x63,0x6f,0x5d,0x97,0xad,0xfd,0xd9,0xf3,0x58,0x39,0x80,0x4c,0x23,0x80,0x4c,0xbf,0x1e,0x55,0x3c,0xfd,0x4b,0x73,0xf6,0x89,0xa9,0x14,0x3a,0xec,0x29,0x8f,0x82,0x76,0xe1,0xe4,0xee,0x08,0x91,0xf1,0xba,0x75,0xde,0x04,},\"\\x53\\xce\\xd9\\xdb\\x2b\\x47\\x9e\\x59\\xd3\\xed\\x64\\x3f\\x7c\\xc3\\x78\\x4c\\x24\\xb8\\xbd\\x4c\\x63\\x20\\x6c\\x72\\xe2\\x3f\\xa8\\x50\\x02\\x88\\x99\\xa4\\x1c\\xe1\\xa8\\xbd\\xc0\\x03\\xf1\\x2b\\x7c\\x29\\x97\\x2c\\x9a\\x08\\xbc\\xd2\\x31\\xfe\\x0e\\x1a\\x0f\\xef\\x0b\\xaf\\xbf\\xa4\\xe0\\xe0\\x27\\xd7\\x20\\x04\\x07\\x5b\\xa3\\x7d\\x49\\x0e\\xb9\\x96\\x4e\\x78\\x3b\\xb9\\x8f\\x9e\\x50\\x3e\\x9c\\x1f\\xd3\\xd2\\x3f\\xb0\\x01\\x7c\\xc7\\xc7\\xa9\\xf8\\x6d\\x17\\x1f\\x04\\x1e\\x23\\x55\\xd8\\xc5\\xe6\\x22\\x9d\\x34\\xc7\\xee\\xac\\xb6\\x35\\x8c\\xf3\\x06\\x0d\\x5d\\x26\\x5b\\xae\\x20\\x04\\xa5\\x58\\x87\\x86\\x59\\xa3\\x0d\\xfe\\xd5\\xf2\\xec\\x78\\x8b\\x4e\\x14\\x39\\x7b\\x5d\\x00\\xc2\\x9d\\xb5\\xd4\\xeb\\xf1\\x66\\x39\\xa8\\xdf\\x29\\x2a\\x3d\\x24\\xf6\\x98\\x3c\\xbc\\xa7\\x60\\xd9\\x03\\xe9\\x76\\xf5\\xb6\\x98\\x64\\x2b\\xa1\\xfe\\xd4\\x9e\\x79\\xc3\\x8f\\x4b\\xb3\\x94\\x6e\\xfc\\xcc\\x9d\\x6a\\xef\\xad\\x33\\x6d\\x55\\x8f\\x78\\xe4\\xf2\\x05\\x42\\x2e\\x10\\x38\\x4a\\x4e\\x53\\x1e\\x75\\x80\\x7e\\xfb\\x38\\x9d\\x2a\\xf4\\xca\\xb4\\x38\\x25\\xfb\\x87\\xf1\\x96\\xa9\\x08\\x07\\x69\\xfe\\x75\\x85\\x78\\x29\\x70\\xa6\\x91\\x8a\\xff\\xe1\\x0d\\x20\\xd6\\x29\\xb7\\x05\\x84\\x55\\x97\\x41\\x8d\\x69\\x9d\\xe3\\xf1\\xde\\x85\\x4f\\x94\\xbd\"},\n{{0xf6,0x4a,0x66,0xba,0x0f,0x08,0x19,0xf3,0x00,0x14,0x16,0xc2,0x20,0xbf,0x52,0xd8,0x60,0x13,0x0a,0x19,0x76,0x4a,0xa8,0xab,0x38,0xd1,0x5b,0x2a,0xa7,0x5a,0xc0,0x22,},{0x81,0x25,0x25,0x3c,0xd3,0x37,0xe0,0x0d,0x45,0xb4,0x50,0x79,0xb5,0x85,0x34,0x95,0x61,0xe5,0xf5,0x42,0xa8,0x1f,0x6d,0x2f,0xcf,0xd9,0x85,0xc1,0x0f,0xea,0xb2,0xaf,},{0x4d,0xe6,0xf5,0x25,0x08,0x22,0xd7,0xc9,0xd5,0xbb,0x98,0x58,0x25,0x00,0xb5,0xc0,0x85,0xf5,0x41,0xeb,0xdc,0x45,0x0e,0xd1,0xac,0xaf,0x83,0x68,0x48,0x27,0xed,0x1d,0xc7,0x71,0x47,0xaa,0xe4,0xb1,0x9e,0x14,0xa7,0xdc,0x5b,0xbe,0x1f,0x1e,0x4f,0x57,0x71,0xd8,0xa6,0xe4,0xf2,0x35,0x17,0x39,0xaf,0xb0,0x8c,0x80,0x6d,0x55,0x87,0x01,},\"\\x80\\x72\\x86\\x2e\\xd0\\xab\\x35\\x92\\x1d\\xb5\\xec\\x2c\\xba\\x8e\\x6a\\xed\\xb0\\x44\\x1f\\xdf\\x47\\x49\\x10\\x06\\xc0\\x1e\\x64\\x56\\xad\\x70\\xfa\\xe3\\xc4\\x15\\x2d\\xcf\\xbf\\xdb\\xb8\\xf0\\xfd\\xde\\xc5\\xe9\\x6b\\x12\\xbf\\x67\\x98\\x9b\\xa9\\x67\\x93\\xf4\\x86\\x1a\\x11\\xb6\\x39\\x09\\xce\\x8d\\x19\\xb8\\xca\\x64\\xa5\\x44\\xb3\\x1c\\xe0\\x51\\xfb\\xc8\\x8e\\x06\\x28\\x06\\xd9\\x96\\x5c\\xbd\\x29\\x67\\xb0\\x16\\x14\\xe8\\x6b\\x53\\x2f\\xbf\\x59\\x84\\x32\\x18\\xdc\\x9c\\x19\\xc8\\x03\\x15\\xf0\\x44\\x73\\x17\\x19\\x37\\x10\\x92\\xa3\\xda\\x38\\x87\\x8b\\xc4\\xcf\\x77\\xde\\x97\\x2e\\x86\\x04\\x66\\xb8\\xfc\\x45\\xe4\\x65\\xdc\\x3d\\x0e\\xbf\\x94\\xbd\\xea\\x60\\xef\\x0b\\x98\\x91\\xce\\xd4\\x1b\\x99\\x7b\\x11\\xb3\\x1e\\xe4\\x16\\x7d\\xb6\\x0c\\x9c\\xfc\\x8b\\x85\\xbe\\xac\\xfe\\x22\\x3c\\xc1\\x82\\x92\\x13\\x77\\x40\\x85\\xd7\\xc0\\x6d\\x2b\\x2e\\x63\\x2c\\xc2\\x1c\\xd9\\x66\\x0d\\xf4\\x7c\\x4f\\xa9\\x18\\xbd\\xd5\\x96\\xdd\\xf6\\x22\\xdc\\xb6\\x52\\x64\\x2b\\x67\\x52\\x7b\\xa8\\xed\\x15\\xa8\\x19\\xa8\\xe2\\x1f\\x48\\xd7\\xee\\x70\\x24\\x7f\\x52\\x00\\xe3\\x7c\\x25\\x9d\\xff\\xd1\\x7e\\xec\\x8c\\x23\\x2f\\x97\\x0c\\xb0\\x31\\x82\\xfe\\x39\\x64\\x13\\x29\\x93\\xf6\\xec\\xb7\\xc4\\xdb\\x18\\xcc\\xef\\x39\\x0c\\x9e\\xb3\\x63\\x9e\"},\n{{0x84,0x39,0xb1,0xd6,0x0a,0xa4,0x84,0x60,0x13,0x5e,0xb1,0x00,0x2c,0xc1,0x12,0x79,0x29,0x95,0x07,0x9a,0x77,0xe6,0xe8,0xab,0x02,0x0b,0x9a,0xba,0xca,0x89,0x20,0xb4,},{0xea,0xdc,0x3e,0x0c,0x5b,0xdd,0xbc,0x30,0x52,0xc3,0xb2,0xf8,0xb0,0xa9,0x45,0x66,0xc2,0xb2,0xc8,0x79,0xed,0x17,0x03,0x4a,0xc0,0xe6,0xa4,0x5f,0x2b,0x3e,0x32,0xd2,},{0x62,0xda,0x81,0xe1,0x64,0x40,0x82,0x1b,0x59,0x3b,0x6e,0xe6,0x54,0x0e,0x15,0xd1,0xae,0xa7,0x5d,0x23,0xe0,0xa1,0xbb,0xfe,0xdc,0x80,0x8c,0x95,0x48,0xf8,0x7e,0x8b,0xbf,0x36,0x91,0x5a,0x39,0xa7,0x47,0x16,0xf6,0x45,0xcc,0xa5,0x71,0x4d,0x17,0x0a,0xf9,0x07,0x57,0x6d,0x4f,0x37,0x05,0xe5,0x43,0xd2,0xad,0xdd,0xc5,0xff,0x23,0x03,},\"\\x54\\x19\\xf6\\xd2\\x4e\\xb4\\x66\\x35\\xd4\\xa7\\xf8\\xea\\xb8\\x03\\xcf\\xd0\\xd0\\x4d\\xe0\\x92\\xaf\\xbd\\x86\\xf2\\xa6\\x96\\x1a\\x8d\\x1e\\xb8\\xc0\\xd1\\x97\\xba\\x55\\xee\\x08\\xc9\\x91\\x82\\x2a\\x5a\\xa7\\x02\\xba\\xe0\\x33\\x7a\\xbd\\x5c\\xa7\\xfa\\xa1\\x5e\\x1f\\x1a\\xe3\\x69\\x94\\x6e\\x9b\\x81\\x21\\x6c\\x0f\\x5f\\xc2\\x2b\\xbd\\x44\\x33\\xc3\\xde\\x93\\xc5\\xca\\xa2\\x74\\x16\\x83\\xbb\\xd0\\xe1\\xa7\\x8d\\xf2\\x8d\\xda\\x19\\x17\\x41\\x01\\x87\\x63\\x34\\xd4\\x03\\x39\\x65\\x9f\\x02\\x1a\\xe7\\x66\\x16\\x2c\\x6c\\xc5\\x42\\x1b\\x79\\xcf\\x9d\\x5c\\x09\\x0e\\xd4\\xaf\\x07\\xec\\x84\\x49\\x30\\x35\\xbd\\x0b\\x24\\x21\\xb5\\x33\\x68\\x42\\x95\\xbb\\xe7\\x6a\\x70\\xfe\\xc5\\x96\\xef\\x8c\\x89\\xc5\\xc9\\xdd\\xa3\\xc3\\x3b\\x77\\x35\\xd2\\xd2\\xf2\\x0b\\x28\\xf1\\xa5\\x40\\x2e\\x72\\xd0\\x4b\\xa2\\x91\\xdd\\x59\\xf1\\x4a\\xf0\\x8a\\xdf\\x56\\xee\\xb0\\x86\\xd7\\x69\\xc6\\xbe\\xc3\\x45\\x18\\x91\\x37\\x23\\x45\\xfd\\x6b\\xd0\\x2d\\xcf\\x95\\xe8\\x03\\xaf\\x03\\x53\\x15\\x0e\\x18\\x2e\\x32\\x3a\\xaf\\x68\\x3e\\x03\\x6d\\x9a\\x13\\x5d\\x2e\\x6f\\x98\\xcb\\x4d\\x32\\x7e\\x2c\\xe7\\xd5\\x42\\x47\\xf3\\x59\\x2e\\xd0\\x67\\xb4\\xce\\x76\\x27\\x17\\x4f\\x99\\x6f\\x28\\x16\\x5c\\x9c\\x11\\xf0\\x7e\\x5e\\xe9\\xce\\xe6\\x38\\x51\\xc6\\xb6\\x8e\\xa2\"},\n{{0x3a,0x04,0x63,0x97,0xf0,0xaf,0xc0,0x72,0xbc,0x7f,0x90,0x7c,0x74,0xd3,0x8f,0xd1,0xb9,0xaf,0xdf,0x27,0xe1,0x4a,0x35,0x34,0x76,0x8b,0x0d,0xd2,0xdf,0x3a,0x1c,0x22,},{0x99,0xcd,0x70,0xef,0x3b,0xe3,0x42,0x49,0x33,0x93,0x87,0x2f,0x54,0xc4,0x7d,0xea,0xa0,0x81,0x02,0x18,0x92,0xd1,0x1a,0x32,0x68,0xf3,0x14,0x5e,0xd4,0xf3,0xab,0xe5,},{0x50,0x24,0xce,0x60,0x25,0x79,0x65,0x68,0x70,0x80,0xc5,0xb1,0xfc,0x7d,0x13,0x01,0xc3,0x2a,0xa6,0xfc,0xc8,0x35,0x49,0x7d,0x9c,0xb2,0x3a,0x74,0xa6,0xca,0x27,0x24,0xf5,0x53,0x53,0xc1,0xb7,0x57,0x82,0x7c,0xa5,0x44,0x0c,0x9e,0xf8,0xf8,0xc1,0x05,0x09,0x13,0xe2,0x0a,0xab,0xec,0x35,0xc4,0x97,0xb5,0x60,0x41,0xb5,0xde,0xb2,0x09,},\"\\xf0\\x8d\\xde\\xf4\\x6c\\xc6\\xc3\\x41\\x79\\x82\\x0c\\x98\\x61\\x37\\x51\\x72\\xfd\\xdf\\x77\\x4f\\x8d\\xc3\\xf7\\xd6\\x4a\\xa4\\x32\\xda\\x8e\\x5f\\xae\\x64\\x4c\\x0a\\x8a\\x9e\\x69\\x08\\x51\\x7d\\x50\\x5d\\xeb\\xd6\\x12\\x86\\x8a\\xc6\\xda\\xf9\\x5c\\xd7\\xe1\\x69\\x97\\x50\\x02\\x2c\\xcd\\x4b\\x88\\xdb\\xae\\x2b\\xbf\\x73\\x54\\x6e\\xe4\\xb8\\x35\\xd3\\x19\\xa8\\x42\\xda\\xe8\\xb9\\xed\\x68\\x33\\x23\\xf3\\x1e\\x5c\\xc5\\x79\\x19\\xbc\\x9d\\xbe\\x3b\\xcf\\xff\\xb2\\xad\\xa4\\x80\\x72\\x69\\x7f\\xf4\\xa7\\xd3\\x10\\xc9\\x1a\\xdb\\xca\\x81\\xfa\\xf2\\x6a\\x0e\\xb7\\xbb\\x0c\\x40\\x4a\\xc9\\xd8\\xdf\\xec\\x63\\xe9\\xc6\\x4e\\x2f\\x42\\x0c\\x07\\xd3\\x23\\xb7\\xc0\\xdc\\x3b\\x73\\x50\\x72\\x83\\xae\\xb1\\xce\\xe5\\x1d\\xb4\\xe1\\xa8\\x3a\\x69\\x2c\\x7c\\x1e\\xa3\\x98\\xf6\\xf3\\x09\\x40\\xfa\\xb8\\x5e\\x21\\x38\\xd4\\xb8\\x5a\\xa4\\xe2\\x31\\xe5\\x42\\x4f\\x5b\\x06\\x4e\\xd0\\x26\\xf0\\xcc\\xb9\\x9d\\x1c\\x85\\xa9\\xeb\\x15\\xf5\\x93\\x4a\\x11\\x35\\x9d\\x41\\x1c\\xf9\\x4a\\xe8\\xff\\xa3\\x36\\x1a\\x22\\x4f\\x46\\xba\\xb8\\x52\\xd1\\x84\\xa2\\x48\\xb4\\xc3\\x1f\\xe3\\xa7\\xe7\\xf5\\x13\\x4c\\x05\\x10\\x31\\xa9\\xf3\\x28\\xa7\\xbe\\x4a\\x7c\\xbb\\xb1\\xd8\\xd8\\x63\\xa4\\x00\\xfd\\x2d\\x58\\xda\\xa4\\x4f\\x1b\\x9d\\x8e\\x9d\\xdf\\x96\\x1c\\xe6\\x32\\x2f\"},\n{{0x12,0x4f,0x74,0x16,0xa8,0x04,0x53,0xe4,0xcf,0x1c,0xd7,0xb5,0xe0,0x50,0xa9,0x76,0x14,0x18,0x25,0x8b,0xf7,0xd2,0x7b,0xeb,0x7f,0x23,0x23,0x8c,0x45,0x40,0xbe,0x2d,},{0x0d,0xa3,0x4a,0xb1,0x73,0x99,0x01,0x50,0xdf,0x73,0x99,0xb6,0xbc,0xdd,0xba,0x93,0xc6,0xdb,0xcb,0xf4,0xd1,0x76,0x94,0x1c,0xb5,0x07,0x1e,0x87,0x34,0xc5,0xdc,0x92,},{0xb0,0x57,0x21,0x04,0xaa,0x69,0xe5,0x29,0xe3,0x46,0x5a,0x6f,0xd2,0x8f,0x40,0x4a,0x4e,0xc2,0x02,0x76,0xa9,0x93,0xb1,0x72,0x5e,0xb8,0xc5,0xf6,0x50,0xb4,0xa2,0x16,0xf1,0x87,0x1b,0x24,0xe3,0x68,0xcc,0x46,0xcd,0x1e,0xe0,0x17,0x4c,0xda,0x1b,0x5e,0x4a,0xe2,0x20,0x0a,0xa9,0xfc,0x44,0x52,0x2d,0x97,0x5a,0x9c,0x51,0x81,0x49,0x08,},\"\\x9d\\xcb\\x98\\x73\\xff\\x05\\x4d\\xb1\\x1d\\x0a\\x9b\\x19\\xde\\x68\\x85\\xff\\xba\\x7f\\x0e\\x68\\x1c\\xf7\\xfb\\x8f\\x6c\\xd9\\x50\\xc4\\x83\\x28\\xd1\\xf9\\x19\\xca\\x46\\x05\\x4e\\xee\\xe6\\xc9\\xe5\\x78\\x43\\xeb\\xdd\\xa7\\xb2\\x4b\\xc3\\x50\\x3c\\x4d\\x61\\x2a\\xbb\\x1a\\x31\\x4f\\x39\\xf5\\x82\\x21\\xd2\\xb5\\x4d\\xc7\\x55\\xac\\xca\\x79\\x69\\x74\\x0e\\x7f\\xa8\\xb1\\xa9\\x52\\x3b\\x8c\\x73\\x79\\xfd\\x39\\x52\\x53\\xf4\\xe6\\xcd\\x05\\x4e\\xe2\\x4b\\x75\\x61\\x3c\\x35\\x81\\xd4\\x9e\\x19\\x24\\x6a\\x7b\\x3b\\xe1\\xce\\xcb\\x33\\x4b\\xe4\\x4f\\x3d\\x62\\x6f\\xe3\\xb7\\xb2\\x69\\xe6\\x28\\xd4\\x45\\x80\\xc2\\x06\\x36\\xeb\\xa2\\x64\\x2f\\x27\\x44\\xb9\\x59\\xe6\\x57\\x57\\xd0\\xee\\x60\\x18\\x43\\xf1\\x88\\xe9\\x5d\\x17\\x25\\x3f\\xef\\x56\\x70\\x68\\xa5\\x40\\x5a\\x3a\\x9e\\x67\\x7f\\xea\\x3d\\x7d\\x55\\xf7\\xea\\xd1\\x9a\\x3f\\x30\\xc5\\xf9\\x85\\x67\\x1b\\x55\\xfa\\x12\\x0c\\xb9\\xd0\\x5f\\x47\\x1b\\x6e\\x1e\\x8d\\x77\\x9a\\x2c\\x80\\x3a\\x19\\xe6\\xd0\\xd7\\xcd\\x50\\x78\\x87\\xed\\x64\\x7c\\x2a\\x95\\x48\\x3f\\x93\\x39\\x91\\xed\\x45\\xae\\x30\\x1a\\x2b\\x0e\\x95\\x4a\\x57\\x03\\xd2\\x48\\xc7\\x88\\x10\\xaa\\x0b\\x19\\x9c\\xc2\\xbe\\xbb\\x2f\\x1d\\x71\\xcc\\x40\\x48\\x7d\\xbd\\x42\\xee\\xe0\\xf7\\x45\\xf7\\xd2\\x85\\x68\\x5b\\x1f\\xb3\\x1b\\x15\"},\n{{0x25,0xd1,0x3b,0x38,0x37,0x60,0x1b,0x07,0xa9,0x75,0x69,0x3e,0x5a,0x33,0xd5,0x33,0x7c,0x34,0xc1,0x12,0x7f,0xe4,0xc2,0x74,0x90,0x61,0x2a,0xaf,0x7f,0x64,0x2e,0x9a,},{0x3a,0x07,0xcd,0x68,0xee,0x26,0x92,0xd5,0x1c,0xfa,0xd1,0xa8,0x0e,0x77,0x63,0xb1,0x8a,0x04,0x3c,0x74,0xf4,0xe1,0xb0,0x1e,0xdc,0x55,0xba,0x9a,0x9e,0x07,0x79,0x5a,},{0x20,0xcb,0xf0,0x83,0x92,0xfe,0xa6,0xa9,0x9c,0xf4,0x46,0xa9,0x5c,0x19,0x9c,0xaa,0x0c,0x0f,0x98,0x13,0xcc,0x21,0x7b,0x8d,0x22,0x8e,0x2e,0xd9,0x0b,0xab,0x95,0xea,0x92,0xcd,0x73,0xac,0x95,0x83,0x47,0x64,0xd3,0x3e,0x42,0x24,0x3c,0x80,0xa7,0x60,0x34,0x91,0xc8,0xd3,0xe4,0x9a,0xc7,0x15,0xfd,0x8a,0x5b,0x9e,0x47,0x89,0xbb,0x03,},\"\\x11\\x5b\\x32\\x20\\xb4\\x5c\\xa8\\xf3\\x6c\\x7f\\xf5\\xb5\\x38\\x87\\xd4\\x7e\\x66\\x9b\\x78\\xda\\xc1\\x3b\\x98\\xcc\\x7a\\xac\\xa5\\xc2\\xe1\\x9f\\xce\\x81\\xec\\x86\\x17\\xca\\x41\\x0e\\x11\\xc9\\xa9\\x11\\x8a\\x66\\x84\\x53\\xb3\\x29\\xff\\xb7\\x18\\xea\\xec\\x73\\x91\\x72\\xf0\\xa8\\x49\\xa0\\x84\\x81\\x92\\xa5\\xbd\\xea\\x18\\xab\\x4f\\x60\\xd8\\xd1\\xa0\\xd3\\x38\\x95\\x2d\\x77\\xb2\\xcc\\x13\\xef\\xe8\\x3c\\x76\\xe8\\xdd\\x58\\x80\\x3b\\x1d\\x8b\\x3c\\x97\\x29\\xef\\x10\\x2b\\x20\\x83\\x5b\\x7d\\xe8\\x72\\xbe\\xf3\\x01\\x0f\\x15\\xa4\\xca\\xdd\\xf0\\x7c\\xf7\\xbd\\xd2\\x22\\xd8\\x4b\\x17\\x4b\\xc2\\x15\\x27\\xcf\\xfb\\x1b\\x7f\\xfd\\xe8\\x1e\\x28\\x1d\\x30\\xcb\\x7b\\xce\\x25\\xea\\x3d\\xff\\xb6\\xea\\x1f\\xbb\\x06\\xcb\\x70\\x56\\x9a\\x95\\xed\\x1a\\x07\\xe9\\x7c\\xa4\\x2d\\xe7\\x0a\\xa2\\x18\\x15\\x9e\\xfd\\x60\\x8f\\xa9\\xb0\\x89\\x6e\\x0b\\x58\\x51\\x8a\\x32\\x2f\\x25\\x1d\\x13\\x3e\\x58\\xc8\\xfc\\x14\\x28\\xab\\x0a\\x17\\x0e\\xd8\\x45\\xc7\\x5f\\xb4\\x03\\xf1\\xff\\xb9\\x7d\\x2d\\x2a\\x6d\\x4f\\x27\\x79\\x11\\xd3\\x26\\xc1\\xca\\xbb\\xb8\\x51\\x6c\\xbc\\x17\\x90\\x8a\\xb8\\x1f\\xf8\\xd7\\x9a\\xf4\\x46\\x11\\xea\\x1d\\x05\\x87\\x9c\\x1e\\xc8\\x1d\\x06\\x93\\x6e\\x0f\\x4a\\x0a\\xef\\x6d\\x57\\x48\\xe1\\x81\\xd3\\x0e\\xc2\\x52\\x36\\x59\\x7a\\x97\\x3d\"},\n{{0x7b,0x3a,0x76,0xde,0xca,0xea,0x60,0xc4,0x1e,0x95,0xb0,0x58,0x77,0xa7,0xda,0x82,0x06,0x4c,0x27,0x27,0x8c,0x8d,0x7d,0xf5,0xf0,0xbb,0x95,0xf0,0xad,0x2d,0x04,0x35,},{0xf8,0x0d,0xb5,0xc2,0x87,0x21,0xb1,0xc6,0x11,0xbd,0x87,0xeb,0x14,0x5a,0x98,0xbb,0xf3,0x83,0xb0,0x68,0x04,0x5d,0xf2,0x45,0x8d,0x1a,0x6f,0xda,0x09,0x9f,0x7f,0xc2,},{0x2c,0xd2,0x6f,0xb3,0xc4,0xf7,0x44,0x0a,0x72,0xaf,0xfe,0x93,0x56,0x4f,0x6f,0x65,0x59,0xad,0xb1,0x5c,0xc7,0xa2,0xba,0x10,0x87,0x9f,0xb7,0xd6,0x7e,0x47,0xd4,0xeb,0xd0,0x2f,0xe4,0x82,0x36,0x98,0xa5,0xfb,0xd4,0xa9,0x07,0xfd,0x69,0x18,0x4c,0x25,0x5a,0x17,0x0e,0x5f,0x17,0x47,0xfc,0xe9,0x68,0x10,0x2d,0xc2,0x19,0xb5,0x0d,0x02,},\"\\x37\\x5f\\xad\\xae\\xdd\\x9c\\xac\\x49\\xb6\\x4e\\x15\\x74\\x02\\x80\\x46\\x06\\x9f\\x4c\\x83\\x65\\x4c\\x8a\\x70\\x11\\xab\\xdb\\x64\\xdb\\x16\\xb4\\x7f\\xa3\\x11\\x79\\x81\\x72\\xf9\\x07\\x22\\x17\\xb0\\xa6\\xa4\\x3e\\x5d\\xf6\\xff\\xcc\\x11\\x54\\xbc\\xec\\x1c\\x68\\xe1\\xd3\\x5e\\xc0\\x58\\x80\\xd0\\x12\\xce\\x76\\xe4\\xce\\xbf\\x30\\x1b\\xb2\\xec\\x98\\x3d\\x00\\xb4\\xa0\\x54\\x0c\\x93\\x7f\\xf1\\xc6\\xdf\\x94\\x41\\xc6\\x1b\\xdb\\x3b\\xe8\\xe0\\xc7\\xc1\\x1a\\x35\\xd4\\x9b\\x6f\\x55\\xc3\\x81\\x26\\x9a\\x0e\\x76\\x8e\\xfb\\xd4\\x53\\x44\\x7f\\xe4\\x8b\\x75\\xac\\x39\\x64\\x6c\\xa8\\x2e\\xca\\x7d\\x14\\x93\\x04\\x42\\x34\\x91\\x87\\x1c\\x10\\xdb\\xcf\\xc5\\x97\\x3a\\x57\\xfa\\xb8\\x37\\x1c\\x30\\xcb\\xc4\\xe9\\x0b\\xec\\xc0\\xb6\\x71\\x52\\x22\\x6e\\xe1\\x77\\xb4\\xff\\x36\\x8e\\xc8\\x79\\xb3\\x91\\xeb\\x95\\xe3\\x6d\\xcb\\xb0\\x7b\\x2c\\x16\\xba\\x39\\x55\\x45\\xd4\\x52\\x9f\\x72\\x7b\\x1a\\x11\\xef\\x65\\xd1\\x20\\x97\\x6b\\x7c\\xcc\\x86\\xaf\\x4b\\xd2\\x04\\xcb\\x94\\x89\\xc9\\x21\\xe4\\x3b\\xa5\\xe8\\x50\\xcf\\xe5\\x98\\x99\\xf1\\xc1\\xec\\x4a\\xa5\\xc9\\x2b\\x6d\\xac\\x69\\x14\\xb1\\x95\\x2b\\x53\\xdc\\xb5\\x40\\xb4\\x09\\x23\\x13\\x81\\x56\\x89\\x87\\xbb\\x22\\x36\\xbc\\x40\\x89\\x5d\\xf3\\xf1\\x7e\\xab\\x7c\\x02\\x74\\xf2\\x24\\x4f\\x95\\x86\\x12\\xe8\\x8e\"},\n{{0x5f,0xf8,0xd4,0x05,0x26,0x08,0xeb,0x03,0x3a,0x5e,0x94,0xb6,0x03,0xce,0x38,0x4d,0x84,0x52,0xf6,0x0a,0x26,0x49,0x8b,0x91,0x12,0x56,0x7f,0x34,0x10,0xc1,0x86,0x66,},{0xc4,0x90,0x0d,0xe2,0x4d,0x9a,0xf2,0x48,0x27,0x63,0x10,0x99,0x26,0xaf,0x7c,0x48,0x13,0x80,0xfa,0xbc,0xda,0x94,0x40,0xc1,0xa5,0x3e,0xa1,0xcd,0xc2,0x7e,0x65,0x68,},{0xb7,0x37,0xd4,0xe5,0xbe,0x27,0xde,0xb6,0xd8,0x77,0x29,0xc6,0x36,0xdf,0xf7,0xa4,0x06,0xc0,0x13,0xf3,0x13,0xc3,0x8c,0xf6,0x83,0xfe,0x14,0xf7,0x5a,0x3b,0x30,0x05,0xd9,0x53,0x5d,0x7e,0x58,0x15,0xc8,0xf8,0xb3,0x7c,0x51,0xd6,0x92,0x71,0x11,0xc9,0x79,0xf7,0xd9,0xd8,0x1a,0x34,0x7a,0xa9,0xcc,0x09,0xed,0x4e,0x6c,0x18,0xe9,0x0f,},\"\\x13\\x8c\\x60\\x55\\x7c\\x2e\\x90\\x08\\xaf\\xc0\\x3d\\x45\\xbe\\xc7\\x1f\\x96\\x11\\x49\\xa0\\x83\\x59\\x26\\x75\\x1c\\x8f\\xf3\\x93\\x5c\\x7d\\x65\\x2d\\x83\\xe1\\xb0\\xb1\\xda\\x7d\\x5b\\xbe\\x0b\\x8e\\x17\\x1a\\x4e\\x49\\xaa\\xe0\\x6f\\xd8\\xa9\\xde\\xff\\x78\\xdc\\xde\\x4d\\x25\\xb1\\xaa\\x89\\x99\\x98\\xa0\\xf9\\x9e\\x1d\\xf6\\xf9\\x33\\x7a\\x3e\\xa2\\xf2\\x4b\\x76\\xc3\\x17\\xa7\\x01\\x4d\\xb4\\xe5\\x28\\x31\\x91\\x79\\x5a\\x70\\xd8\\x82\\x1d\\x21\\x78\\x46\\x49\\x0f\\x95\\x87\\x01\\xd3\\x9d\\xc2\\xc8\\xce\\x47\\xd9\\x28\\x93\\x88\\x74\\xd8\\x7b\\x35\\x58\\x98\\x9b\\xc7\\x7a\\xf8\\x20\\x97\\x9a\\x35\\x1e\\xef\\x95\\x94\\xaa\\x5b\\x94\\xf3\\x34\\x1e\\xde\\xd4\\xea\\x20\\xb0\\x8c\\x3e\\x7c\\x56\\x10\\xd4\\x32\\x67\\x81\\x8d\\xfa\\xc0\\xa8\\x7d\\xdf\\x52\\x7f\\xbc\\xe8\\x51\\x2b\\xbf\\x85\\xb6\\x6c\\x9b\\xb5\\xd6\\x2f\\x0f\\xe8\\x40\\x48\\xf2\\x3b\\x19\\x60\\x4a\\x5c\\x8d\\x82\\xb1\\xf2\\x5a\\x8d\\xa0\\x27\\x31\\xfe\\xb2\\xec\\xae\\x48\\x9b\\x84\\x75\\xf7\\xbd\\x32\\x6d\\xdf\\x1a\\x08\\x18\\x9e\\x46\\xc0\\x8c\\xf5\\x05\\x38\\xc2\\xa3\\x63\\xe2\\xf4\\xeb\\x2c\\x01\\xa2\\x04\\xc7\\xff\\xbc\\x0b\\x98\\x1a\\xdc\\x0f\\xd9\\x97\\xaa\\xfd\\xf2\\xa2\\x22\\xee\\x84\\xc3\\x09\\xf6\\xe9\\x5e\\xc7\\xde\\x4f\\xa8\\x5d\\x47\\x68\\xd5\\xc0\\x03\\x16\\x50\\x28\\x22\\x5e\\x22\\xe0\\x9e\"},\n{{0xee,0xde,0xfc,0x17,0x57,0xe3,0xa7,0xe5,0xed,0x39,0x46,0xdb,0xed,0xc3,0x96,0xa3,0x62,0xf6,0x83,0xd2,0xc5,0x1b,0x0b,0x9f,0x60,0x76,0x5d,0x4b,0xfc,0x51,0x34,0xde,},{0xa9,0x87,0x2b,0xc2,0x19,0x2f,0xc0,0x2b,0x18,0x9c,0xee,0xd4,0x03,0xab,0x9f,0x27,0x0a,0x03,0x2a,0x83,0x5f,0xde,0xbf,0xaf,0x1c,0x9d,0x69,0x34,0xed,0x83,0x04,0xbc,},{0xd5,0xbe,0xa8,0xea,0x9a,0x5f,0xe9,0xed,0x6d,0x2b,0xf8,0x39,0x93,0x0c,0x0c,0x6c,0xd5,0x03,0x9e,0x98,0x8f,0x55,0x1f,0xde,0xdb,0x54,0x37,0xe1,0xc1,0xaf,0x0e,0xd7,0xb3,0x89,0x7c,0x03,0x57,0x11,0xc3,0xc5,0x19,0x26,0xbe,0x8d,0x1b,0x32,0x02,0x4d,0x5c,0xd5,0x82,0xf5,0xf8,0x36,0x9a,0xd8,0x4d,0x18,0xb1,0x25,0x02,0x65,0x2f,0x07,},\"\\xb1\\x94\\xdb\\x73\\xf9\\x94\\xcb\\xdc\\x3c\\xbe\\x63\\x0b\\xa7\\x2c\\x47\\xc2\\x24\\x9b\\xc0\\x59\\x2a\\xb5\\x47\\x94\\x2b\\x1d\\x1b\\x88\\x2b\\x44\\xf5\\xb3\\x85\\x5e\\x56\\x8b\\xdd\\xdf\\x92\\xef\\x05\\x02\\x2d\\x88\\xfc\\xfc\\x29\\x4e\\x76\\xb6\\x4a\\x00\\xe9\\xc7\\x43\\x55\\x37\\x37\\x63\\xe4\\x9a\\x4e\\xbc\\x47\\x24\\x3d\\x48\\xa9\\xad\\x58\\x89\\x94\\xa5\\x18\\xf8\\x0f\\x86\\x15\\xc2\\xb3\\x1d\\xa5\\x87\\xa5\\x3e\\x52\\x9d\\x43\\x5a\\x86\\x97\\x35\\x0d\\xfc\\xde\\x02\\xd2\\x0c\\xce\\x7d\\x5e\\xee\\xfe\\x3f\\x5a\\xb2\\xaa\\xc6\\x01\\x25\\x9c\\xda\\x38\\x53\\x8a\\x1b\\x83\\x01\\xf9\\x83\\x2e\\x75\\xab\\x90\\xf8\\xa9\\x32\\xf2\\x67\\xea\\xc1\\x81\\x00\\x39\\x65\\xd5\\x26\\x6f\\x20\\x61\\x80\\xc6\\xc3\\x80\\xec\\xe8\\x03\\x57\\x7c\\xcb\\x46\\x17\\x6b\\xf6\\x07\\x15\\x94\\x86\\xf2\\x42\\x59\\x74\\x7e\\x2c\\xa6\\xfb\\x19\\x12\\xdb\\x7b\\x78\\xa9\\x73\\xb2\\x84\\x63\\x87\\xc1\\x20\\x80\\x30\\xee\\x1f\\x40\\x0d\\x0c\\x5b\\x5e\\x8b\\xde\\x96\\x35\\xae\\x55\\x63\\x8b\\xa1\\x7c\\x73\\x4d\\xe8\\x63\\x8b\\xb8\\x5d\\xfc\\xd7\\x66\\x29\\xa7\\xf9\\xf4\\x0d\\x6a\\xb9\\x54\\xd5\\x5b\\xf8\\x57\\x5f\\xc9\\xc9\\xa5\\x95\\x09\\x7e\\x08\\x93\\xdb\\x5a\\x7b\\x8a\\x6c\\x45\\x5e\\xcb\\xd3\\xd2\\x2d\\x72\\x5e\\x19\\xde\\x29\\x41\\xf4\\x67\\xf9\\xeb\\x93\\xd6\\x6a\\x0e\\x2b\\xbd\\xbf\\x92\\xed\\x1c\"},\n{{0x09,0xd2,0x2b,0xba,0xa5,0x95,0x6c,0xfa,0xcb,0xbf,0x9f,0xd5,0x51,0x09,0x75,0x12,0x86,0x86,0xc4,0x0c,0x6e,0xa9,0x6b,0x89,0xef,0x4c,0x0f,0x0c,0x64,0x9b,0xcd,0x7f,},{0xe5,0x59,0xea,0x8a,0xcb,0xdc,0x61,0xb6,0x70,0x9a,0x7d,0x83,0xae,0x15,0x84,0x9a,0x6c,0x78,0xb2,0x03,0x92,0x3d,0xd0,0xa2,0x99,0x23,0x9e,0xe4,0x88,0x69,0x30,0xba,},{0xe6,0x52,0x75,0xc4,0x32,0x8a,0x70,0xad,0x62,0x40,0x8e,0xd7,0xfb,0x17,0x28,0xbe,0x87,0xa7,0x3a,0x81,0x4f,0xee,0x8e,0xbd,0x94,0xf2,0x66,0x5c,0x71,0xbc,0x66,0xab,0x0c,0x1b,0x07,0xa6,0x00,0xb3,0x0b,0xc0,0x81,0xa7,0x4c,0x53,0x68,0x57,0xc2,0x06,0x10,0x38,0x4b,0xe2,0x68,0xd9,0xaf,0x3e,0x3e,0xcd,0xdd,0x3e,0xb0,0xc1,0x4c,0x0c,},\"\\x1c\\x26\\xa0\\xf3\\xa1\\xa5\\xb2\\xd7\\xd5\\xb2\\x97\\xaf\\x8a\\x6a\\x68\\x9d\\x7c\\x62\\xa2\\x52\\x67\\xe1\\x97\\xd2\\x3b\\xec\\xd2\\xf2\\xb8\\x16\\xc4\\xde\\x92\\xfb\\xda\\xff\\xb9\\x41\\xc3\\xfc\\x8d\\xb7\\xa8\\x43\\x35\\xa8\\x4c\\xfb\\xc9\\x2c\\xb3\\xac\\x80\\x6e\\xd5\\x8d\\xf1\\x6b\\x6b\\x8e\\x11\\x9a\\x48\\xdf\\x4f\\x27\\xc7\\x1e\\x93\\x1a\\x59\\x38\\xe7\\xd0\\x02\\x73\\x48\\x85\\xe1\\x3a\\x25\\x8a\\x15\\xb6\\xe1\\x13\\x6e\\xfb\\xa7\\x2f\\x1d\\x09\\x6b\\x68\\x9f\\x76\\x18\\xf4\\x9c\\x96\\x80\\x63\\xe8\\xf9\\x91\\xfa\\x0b\\x55\\x60\\x1e\\x43\\x0e\\xee\\x13\\x49\\x2a\\x1b\\x09\\x41\\x3e\\xb2\\x38\\x13\\x59\\x1a\\x7a\\x9f\\x07\\x0c\\xc3\\x96\\xca\\x9d\\x1f\\xac\\xdd\\x4f\\x4c\\xe3\\x7c\\x40\\xf7\\x24\\x5f\\x55\\x03\\x5e\\x10\\xfa\\xd6\\xb8\\x5b\\x5f\\x01\\xa1\\xda\\xac\\xc0\\xdf\\x94\\x06\\x9f\\x7d\\xe8\\xf6\\x46\\x7f\\x96\\xd1\\xfb\\x98\\x64\\x8e\\x8a\\x05\\x20\\xa8\\xcd\\x72\\x3c\\x98\\xe9\\xdc\\x2d\\xd4\\xb2\\x93\\x4d\\x82\\x28\\xf0\\xae\\x1a\\x41\\x5b\\xd3\\xa7\\xcd\\xa3\\x8d\\x7a\\x99\\x83\\xce\\x1a\\xf6\\xf8\\xc9\\x70\\xa2\\xa5\\x91\\x63\\x5f\\xe1\\x2b\\x91\\x75\\x36\\xef\\x81\\x5e\\xaf\\x1a\\x31\\x38\\xd7\\x0c\\xe7\\x0a\\x79\\x42\\x64\\xd7\\xc9\\x86\\xd9\\xee\\x32\\x90\\x44\\x5f\\x15\\xa9\\x24\\x8f\\x27\\x65\\x27\\x1e\\x5a\\x99\\x21\\x96\\xae\\x33\\x1a\\xbd\\x41\\x64\\xbf\"},\n{{0x77,0x82,0x6e,0xd3,0x51,0xa3,0xf0,0x92,0x54,0xae,0x56,0x92,0x88,0x5d,0x77,0x4c,0xb3,0xf2,0x44,0x10,0xa4,0x80,0x9f,0xd9,0x0f,0x8a,0x00,0xda,0x9a,0xee,0x99,0x03,},{0x3e,0xac,0x8f,0x41,0xee,0x73,0xe6,0xef,0x13,0x68,0x21,0xf7,0x95,0x7a,0x1c,0x27,0xe1,0x56,0x38,0xd0,0xe3,0x91,0x6e,0x6c,0xaa,0xc6,0xfb,0x7b,0xeb,0x7b,0xcf,0xb0,},{0x97,0x7a,0xdc,0xcd,0xb8,0x29,0xb4,0x0b,0xbd,0x8e,0x53,0x85,0x6a,0x78,0x3d,0xb3,0x46,0xa3,0x9d,0xff,0x62,0x04,0x1a,0x29,0x72,0xd2,0x90,0x09,0xf1,0xc9,0xff,0x81,0xb8,0xad,0x54,0xcb,0x90,0x1e,0x49,0x7c,0x1d,0x30,0x21,0xb5,0x0b,0x6c,0x69,0xee,0x73,0x55,0x8f,0xd7,0xbe,0x05,0xd6,0x25,0xf5,0x72,0x7f,0x9a,0xf2,0xce,0x87,0x02,},\"\\x1f\\xf0\\x6c\\x0b\\x39\\x99\\xce\\xcb\\x19\\x00\\xa4\\x7d\\x26\\x7b\\xea\\xfb\\xb3\\x5d\\x93\\xd1\\x4c\\xb2\\xc8\\x92\\x5e\\x3e\\x3f\\xe5\\xd9\\x67\\x58\\x69\\x25\\xee\\x4b\\xaa\\x41\\x99\\x8e\\xdd\\x01\\x03\\x20\\x58\\x10\\xaa\\xd5\\xc0\\xbb\\xdc\\x77\\x87\\x44\\x76\\x81\\x02\\x46\\xd1\\x30\\x89\\xa6\\x4d\\xb5\\x76\\x42\\x4f\\xae\\x0b\\xed\\x96\\x64\\xa4\\x2a\\x49\\x11\\x47\\xd1\\xee\\x3b\\x9c\\x3b\\x1b\\xa4\\x87\\x5b\\xe1\\x54\\x62\\x39\\x25\\x40\\xf9\\x97\\x8d\\x9a\\x46\\x30\\xba\\x4c\\x52\\x54\\x99\\x75\\x1a\\x45\\xef\\xc2\\x99\\xec\\x7d\\x73\\xb1\\x7f\\x9a\\xd2\\x75\\xee\\x71\\xa6\\x87\\xe7\\x26\\x90\\xd7\\x32\\x02\\x42\\xd2\\xdc\\x2b\\xd4\\xd5\\xc5\\xcf\\x0f\\x17\\xa4\\x65\\x18\\x5d\\xcf\\x60\\xf8\\xef\\xff\\x53\\x90\\x3f\\x20\\xb0\\xc2\\xab\\x21\\x92\\xd4\\x43\\x68\\xf2\\xf2\\xfb\\x36\\x04\\x8a\\xf0\\x71\\xf7\\xaa\\x85\\x7b\\x14\\xad\\x1d\\x11\\x46\\x12\\x05\\xbe\\xbe\\x17\\xe0\\x2b\\xe2\\xe3\\xcc\\xb6\\x09\\x28\\x21\\x88\\x5c\\x4e\\x0d\\x48\\x11\\xbe\\x3f\\x45\\xb1\\xfe\\xa0\\x88\\x45\\x3e\\x02\\x24\\x32\\xf5\\x62\\x56\\x2b\\x43\\xa3\\x55\\xcb\\x56\\x27\\x0c\\xed\\xb6\\xc2\\xc4\\x2d\\xbf\\x9b\\xe8\\x50\\xe7\\x71\\x92\\xfd\\xc6\\x5c\\xfd\\x36\\x83\\x4b\\xe9\\x88\\xdb\\xe9\\xa9\\x3e\\x25\\x18\\xc1\\x38\\xb0\\x90\\xfb\\x9d\\xa8\\x27\\xcb\\x1c\\x91\\xc8\\xfe\\x52\\xfe\\x7c\\x57\\xf7\"},\n{{0x99,0xa9,0x95,0x31,0xc3,0xcd,0x6e,0x3e,0x9c,0x90,0x0a,0x9e,0xeb,0x26,0x26,0x7e,0x72,0xf0,0x9d,0x11,0xb6,0x51,0xa8,0x97,0xeb,0xb7,0x9b,0xe0,0x16,0xf6,0x4c,0x6e,},{0x9b,0xf9,0xf8,0xb4,0x8a,0x27,0x28,0xe0,0x26,0x08,0xfc,0x19,0x89,0x9d,0x21,0x96,0x56,0x83,0x9d,0x1c,0xc1,0xe9,0xa8,0x98,0x4d,0xf6,0x74,0xec,0x26,0x66,0x2f,0x41,},{0x0e,0x89,0xda,0x5d,0x94,0x9c,0xf2,0xbf,0x40,0xc7,0xe1,0x7c,0x2d,0x0f,0x9c,0xea,0xbc,0x88,0xa0,0x92,0xeb,0x4d,0x49,0xcf,0xbf,0xea,0xb7,0xc8,0xbf,0xf4,0x32,0x45,0xc6,0x7b,0x9e,0x2e,0x92,0xf9,0xbc,0xb9,0xb3,0x4b,0x3f,0xcf,0x8b,0x01,0xfa,0x2e,0xa7,0xa9,0x64,0x9f,0x81,0x4c,0x3a,0xa9,0x8b,0x3d,0xd0,0x45,0x40,0xc3,0x1d,0x09,},\"\\x7a\\x89\\xc0\\xc1\\x95\\x2f\\xdc\\x42\\x98\\xdc\\xae\\xa8\\x54\\xef\\xc1\\x34\\x65\\x6b\\xe1\\x47\\xe9\\xe8\\xe8\\x2f\\xc9\\xa4\\x49\\x05\\x9d\\x80\\x57\\x0f\\x75\\x67\\x6b\\x81\\xc4\\xa9\\x4f\\x76\\xa9\\x68\\x20\\x0c\\xde\\xb0\\x98\\x8c\\x73\\xf5\\x9a\\xfc\\x72\\xad\\x4c\\x31\\x03\\xe1\\x9f\\xe6\\x3b\\x7e\\x95\\xe1\\x40\\xb5\\xcb\\x2e\\xfc\\x7b\\x97\\xa6\\xff\\xbb\\x6c\\x29\\x8d\\xda\\xce\\x3b\\xe6\\xd2\\xed\\x3d\\x59\\x8b\\x8b\\xdf\\x0c\\x2f\\xe6\\xc9\\x76\\x02\\x14\\x2a\\x76\\xe9\\x78\\x51\\x4c\\x19\\x6c\\x1b\\x9a\\x88\\xef\\xdc\\x19\\x25\\xfc\\x50\\x61\\x55\\xcf\\xf9\\xa2\\xf2\\x1a\\xb6\\x34\\xe2\\xb9\\x3e\\x96\\x92\\x8a\\x5d\\x8f\\x7c\\xe4\\xcb\\x73\\x26\\xd9\\x68\\x94\\x69\\x24\\x2b\\xa9\\xc6\\xa0\\x1b\\x77\\x49\\x6b\\xad\\xef\\x87\\x57\\x8f\\x5a\\x17\\x28\\x4e\\x90\\x0a\\x72\\xdf\\x14\\x1c\\x61\\x99\\xb0\\xe7\\x1a\\xb5\\xda\\x43\\x75\\x03\\x76\\x17\\xec\\x61\\x96\\xd4\\xf4\\xe2\\x3a\\xe2\\x91\\x6a\\x72\\xd0\\xfc\\xe7\\x96\\x02\\x23\\x05\\xac\\x9f\\xbb\\xbb\\xe4\\x70\\x5b\\x34\\x0e\\x42\\xb7\\x8e\\x1c\\x02\\xbb\\x10\\x01\\x86\\x0c\\xdc\\xaf\\x71\\xed\\x89\\x25\\x5d\\xd5\\x6c\\xc0\\xb3\\x1c\\x59\\xd4\\x59\\x6d\\xce\\xf8\\x4e\\x22\\x23\\x4b\\xe5\\x62\\xbd\\x80\\x1e\\x94\\x11\\x1d\\x83\\xa7\\x80\\x64\\xc9\\x0f\\x9d\\x82\\xfc\\xe9\\x1f\\x68\\xab\\xb0\\x3c\\x73\\xb6\\xbd\\x8d\\x7e\\x02\\xd4\"},\n{{0xaa,0x58,0x40,0x3e,0x76,0x3b,0xac,0x40,0x5d,0xb0,0x65,0xeb,0x11,0xeb,0x6b,0xe3,0xe3,0xb6,0xcf,0x00,0xec,0x4a,0x22,0x2b,0x52,0xbf,0xf4,0xb6,0xe3,0xd1,0x56,0xac,},{0x16,0x7f,0x9b,0x9a,0x46,0x65,0xf9,0x3f,0x5d,0x7d,0x30,0x16,0xac,0xe6,0xfb,0xd1,0x34,0x20,0xb2,0xe5,0x1e,0x72,0xbd,0xe5,0x9e,0xed,0xf2,0x69,0x93,0xb6,0x6c,0xae,},{0x64,0xb5,0x98,0xca,0x5b,0x8f,0x9a,0xe7,0x42,0xe4,0x6e,0xe0,0xd8,0xc1,0xaa,0xf3,0x14,0x58,0xb5,0x0c,0x25,0xd2,0x67,0xa6,0x77,0xe4,0x4b,0xe5,0xb7,0x55,0xf1,0x4d,0x51,0x80,0x1a,0x30,0x39,0x9b,0xfc,0xc3,0x8d,0x14,0x07,0x1a,0xa0,0xae,0x93,0xda,0x82,0x5a,0x58,0x1a,0xb6,0xc2,0x07,0x25,0xa0,0xa9,0x10,0xb4,0x73,0x5d,0xfa,0x0b,},\"\\x3b\\xaa\\x09\\x98\\xff\\x02\\xb3\\x2b\\x90\\xb5\\x1f\\x9a\\x84\\x0c\\x7b\\x5c\\x58\\x70\\xcf\\xb1\\x81\\x0a\\x9b\\x0f\\x77\\xb5\\x59\\x09\\xd4\\x7a\\xd3\\x35\\x14\\x7a\\x99\\x1c\\x29\\xfb\\xeb\\xfc\\x59\\x2e\\x93\\x07\\x17\\x5c\\x19\\x64\\x12\\x9a\\x2d\\x5e\\xfc\\x62\\x15\\x80\\x74\\x53\\xbc\\xd7\\x26\\x96\\x97\\x81\\x22\\x2b\\xca\\xd1\\xc9\\x9a\\x49\\x74\\x8b\\x9e\\xe6\\x67\\xc4\\xd0\\xc8\\x28\\x89\\xe2\\xf5\\x00\\x64\\xc1\\x15\\xdb\\xd8\\xfb\\x48\\x3d\\x72\\xab\\x0c\\xca\\xdf\\x76\\xbd\\xdb\\x2d\\xc7\\x27\\xdb\\xc3\\xfa\\x5c\\x46\\x24\\xc2\\x83\\xd8\\x92\\x1c\\x8a\\xa4\\x42\\x51\\x10\\xdc\\xdd\\x69\\xc0\\x5e\\x5e\\xd5\\x9b\\x35\\x96\\x25\\xee\\xaa\\xec\\x1e\\x27\\xea\\xfe\\x9d\\x9a\\x5c\\xe7\\x36\\xc3\\xf9\\xc5\\x27\\xea\\x54\\x78\\x18\\xb9\\xbc\\xa6\\x81\\x1b\\xe4\\xcc\\x15\\x05\\x8a\\x6f\\x5b\\x68\\x33\\x03\\xb8\\x0c\\x90\\xc9\\x4a\\x83\\xb8\\xb1\\x58\\x69\\x71\\x3a\\x66\\xb1\\xe0\\xf6\\x56\\x33\\x1b\\x28\\x6d\\x1e\\xf7\\x69\\x88\\x34\\xab\\x3e\\x13\\x84\\x17\\xaa\\xd6\\xbb\\x3a\\xb3\\xbd\\x9f\\xc7\\x87\\x61\\xa4\\x82\\xdf\\xc6\\x54\\xf3\\xf8\\x62\\x8c\\x8d\\x9f\\xc1\\x60\\x18\\x89\\x8f\\x16\\x41\\xe8\\x62\\x2b\\xd2\\x72\\xe3\\x8d\\x41\\x70\\x6c\\xb9\\xce\\xbe\\x6e\\xe5\\xe1\\x73\\x57\\x6b\\xf6\\x1b\\xb1\\x18\\x8c\\xf2\\xf3\\x9c\\x62\\x22\\x0b\\xba\\x88\\xfc\\xb4\\xde\\x48\\x98\\xb2\\x5b\\x04\"},\n{{0x10,0x44,0xee,0x37,0x08,0xc0,0xb0,0xe9,0x09,0xa8,0xcb,0x2b,0xa2,0xcd,0x0a,0xf8,0xd2,0x8a,0x5d,0xe0,0x1d,0x96,0x2e,0x82,0x60,0x87,0xfb,0x23,0x2d,0xf7,0xb2,0xd2,},{0x46,0xd2,0x41,0xea,0x0c,0x70,0x2c,0x18,0x89,0xd4,0x46,0x55,0x82,0x46,0x29,0xb6,0x72,0x84,0xd4,0xe6,0x44,0xa4,0x8f,0xa4,0x54,0x55,0xd2,0x7a,0xc5,0xf6,0x25,0x29,},{0x7d,0x6b,0xed,0x7f,0x87,0xd0,0x90,0xab,0xe0,0x13,0xc3,0x1e,0x12,0x03,0x90,0x3b,0xac,0x9c,0x93,0x44,0x5d,0x06,0xc7,0xb5,0x3d,0x31,0xd1,0x5f,0x97,0x0d,0x88,0x64,0x7a,0x7e,0xd2,0xc3,0xa6,0x30,0x50,0xba,0x19,0xd6,0x80,0x43,0xaa,0xdd,0x18,0xbd,0x86,0x1d,0xe1,0xac,0x47,0x15,0xb8,0xe8,0x28,0xb2,0xb1,0x6f,0x8a,0x92,0xb0,0x01,},\"\\xb8\\xa4\\x45\\x45\\x5f\\xb6\\x6e\\x17\\xe3\\x14\\x3d\\x35\\x20\\x4c\\x9e\\xa9\\x34\\x74\\xee\\xbe\\xef\\x93\\x96\\x3e\\xe5\\xc1\\xd3\\x77\\xca\\x21\\x7a\\xcd\\x4c\\xa6\\x3e\\x57\\x55\\xda\\x08\\xfb\\xff\\xdb\\xd4\\x35\\x2b\\xf1\\x65\\x19\\x38\\x96\\xc8\\xd6\\xf7\\x6b\\xb4\\xcd\\x3b\\xc2\\xd3\\xa4\\x76\\xa4\\xe3\\x20\\x82\\x4a\\x12\\x10\\xce\\x74\\xd0\\x01\\x4d\\x74\\x7f\\x11\\x1e\\xec\\x31\\x0c\\x5c\\x89\\xed\\x4d\\x08\\x50\\xe8\\x11\\xf8\\x0a\\x8b\\xb2\\x8d\\xca\\xf6\\xf4\\x11\\xdf\\x83\\xe2\\xc1\\xdf\\xd9\\x0c\\x4a\\xd2\\x35\\x61\\x45\\x4e\\xb5\\xd7\\x56\\xb6\\x3b\\x4e\\xa7\\xf3\\x7d\\xc5\\xd4\\x66\\xc1\\x6e\\xf7\\x0d\\x11\\x19\\x0c\\x4f\\x53\\x16\\xfe\\x2a\\xa8\\x59\\x74\\x40\\xe8\\x8b\\xbe\\xba\\xeb\\x35\\xea\\x5f\\x04\\xf0\\x7b\\x03\\x39\\x26\\x41\\x58\\xef\\x90\\x9a\\xd5\\x16\\x3b\\xfc\\x24\\x8c\\xd7\\x24\\x13\\x3e\\x27\\x4f\\x81\\x26\\x95\\xf2\\x90\\xe5\\x71\\x76\\xa9\\x6b\\x93\\x93\\xd0\\x7b\\xb3\\x10\\x29\\x9f\\x5d\\x2a\\x6b\\x6d\\xd1\\xda\\xbc\\xb5\\x1b\\xf2\\x9c\\x5a\\xfa\\x7e\\xbb\\x07\\x01\\xc6\\xc8\\x47\\x67\\xac\\x13\\x77\\x93\\x09\\x1f\\xe0\\xed\\x6e\\x47\\xd7\\x80\\x62\\x8a\\x32\\xc8\\x4f\\x83\\xe0\\x0e\\x9c\\x16\\x74\\x2a\\x52\\x3e\\xcb\\x63\\xc2\\x4f\\x4a\\x33\\x8e\\xd2\\x99\\xa0\\x61\\x94\\x92\\x4f\\x44\\xc5\\xa5\\xd3\\xc9\\x37\\xff\\x9b\\x09\\x45\\x98\\x2a\\xd2\\x4a\\x2d\\x1c\\x79\"},\n{{0x95,0xdd,0x1a,0x5e,0x65,0x8f,0xa6,0xc8,0xd4,0x25,0x07,0xb3,0xe5,0xb8,0xed,0xb5,0xba,0xec,0xa6,0x2d,0xeb,0x00,0xfc,0x5d,0x4d,0xca,0x8e,0x1a,0xb5,0x83,0x5e,0x59,},{0x3a,0x53,0x23,0xdd,0x1e,0x07,0xf3,0x23,0xbb,0x6d,0x83,0xe9,0xc2,0xdb,0x92,0xa2,0x9f,0x62,0xe2,0xe0,0x03,0xee,0x0d,0xea,0xcd,0x7e,0x2e,0x4e,0x03,0x0d,0x8d,0x27,},{0xd0,0x2a,0x75,0x23,0xdc,0xbd,0x29,0x57,0x6b,0xa8,0x09,0xb5,0x31,0x03,0x77,0x74,0xdf,0x41,0x73,0x4a,0x41,0x17,0x58,0x13,0x11,0x9c,0x6a,0x6a,0x78,0x8c,0xd9,0xb8,0xad,0x78,0x08,0x65,0x67,0x86,0x67,0x69,0x9a,0xe6,0x6d,0x01,0x09,0x19,0xa9,0x66,0xa0,0x51,0xc0,0x81,0x63,0xdf,0x67,0xa9,0x77,0xee,0x6e,0x22,0x0d,0x0d,0xc3,0x0f,},\"\\x9b\\x7a\\xfd\\x48\\xc4\\x74\\x60\\x4c\\x26\\x36\\x75\\x31\\x55\\x68\\x40\\xc3\\x88\\x66\\x8b\\x0f\\x38\\x40\\x06\\x3d\\xfc\\x98\\x69\\xad\\x5b\\x90\\x12\\x74\\xb9\\x31\\x29\\x3d\\x04\\xf3\\xc8\\xe8\\xf7\\xf8\\xea\\xb8\\x15\\xa6\\x41\\xd7\\xc3\\x51\\x28\\x4e\\x8b\\xb0\\x43\\x7a\\xc5\\x51\\xbb\\x29\\x43\\x89\\x64\\xe6\\xa7\\xc7\\xba\\x77\\x23\\x44\\xb3\\x33\\xf9\\xed\\xa5\\xa7\\x75\\x68\\xc8\\x93\\x1d\\xdc\\xaf\\x21\\xe3\\x2e\\x07\\xb1\\x0b\\xf4\\x82\\x0f\\xb8\\x59\\xbc\\xf8\\x7b\\x81\\xc4\\xbf\\xf4\\x26\\xf2\\x4a\\x4d\\x46\\x8f\\x2e\\x9a\\xed\\xa8\\xf1\\x7d\\x93\\x97\\x09\\x97\\x0d\\xb1\\x1d\\xf7\\x62\\x47\\xe9\\x8a\\x39\\xeb\\x8b\\x38\\xf5\\x94\\x9f\\x34\\x9f\\x2a\\xe0\\x5a\\xb4\\x8c\\x01\\x85\\x17\\xc4\\x8f\\xa0\\x20\\x5d\\xc7\\xf1\\x56\\x64\\x53\\xe1\\x05\\xe4\\x8c\\x52\\xeb\\x45\\x5c\\x0c\\x40\\x80\\x2f\\x79\\x7b\\x3e\\xef\\xb1\\xe2\\xf3\\xb1\\xf8\\x43\\x15\\xae\\xd5\\xb0\\x71\\x1c\\x64\\x99\\xa6\\x91\\xb7\\x4b\\x91\\xf1\\x2e\\xf7\\x0f\\x76\\xc4\\xc0\\x5c\\x1a\\xa1\\xa9\\x93\\xe2\\xf3\\xe5\\x28\\xab\\x34\\x3d\\xd2\\x36\\x81\\x62\\xf4\\x03\\x6a\\x61\\xa1\\x3a\\x88\\x04\\x5d\\xcd\\xef\\xa8\\x5d\\x68\\x53\\x22\\x75\\xbc\\xf5\\xb8\\xf5\\xf0\\x0e\\xfd\\xea\\x99\\x9a\\x95\\x78\\x31\\x75\\xd9\\xee\\x95\\xa9\\x25\\xd4\\x8a\\x54\\x49\\x34\\xd8\\xc6\\xb2\\x62\\x22\\x5b\\x6e\\xbe\\xa3\\x54\\x15\\xdd\\x44\\xdf\\x1f\"},\n{{0x1a,0xbc,0x0b,0x9a,0xa0,0x1d,0xc5,0x7c,0xa5,0x3e,0xfe,0x73,0x80,0x96,0x2b,0x1a,0x88,0xd5,0x0a,0x96,0x4f,0x5c,0xd9,0x86,0x40,0x98,0x2c,0x74,0x39,0x3f,0x29,0x26,},{0x8d,0x4f,0xd1,0x43,0x94,0xd7,0xc1,0x40,0x57,0x00,0x30,0x69,0x83,0xfb,0xf7,0x6e,0xa9,0xf1,0x71,0xb1,0x5a,0x6b,0x56,0x61,0x2a,0x1f,0xeb,0x1c,0xbd,0xae,0x5d,0xd5,},{0xf7,0x38,0xaf,0x2d,0x3e,0x29,0x0b,0x3d,0x23,0xd9,0xaf,0xf7,0x41,0x4b,0xfc,0x5f,0xfa,0x47,0x23,0x5d,0xc0,0x53,0x68,0x7a,0x8b,0xa5,0xc8,0x54,0x1b,0x85,0x11,0xf7,0x81,0x56,0x6c,0xda,0xa1,0x30,0xe0,0x67,0x7d,0xb5,0x5f,0xa8,0xbe,0x9d,0x81,0xa0,0x92,0xcb,0x58,0x92,0x3a,0x86,0x28,0x49,0x4d,0x2f,0x62,0xd9,0x5c,0x16,0x71,0x00,},\"\\xda\\x2d\\xd9\\x40\\xd5\\xe1\\xdb\\x6e\\x80\\xbf\\x7e\\x2b\\x78\\x2e\\x7e\\x74\\x5c\\xd4\\xfd\\x25\\x2e\\x98\\x15\\x17\\x97\\x58\\x87\\xdd\\x05\\xac\\x77\\xed\\x83\\x7d\\x08\\x29\\x61\\x57\\x5e\\xfe\\xdf\\x30\\x1f\\xdf\\x24\\xb7\\x07\\x18\\xb9\\x91\\xb8\\xd9\\x2b\\xdd\\x2e\\x6b\\xee\\x17\\xc8\\xaa\\x4b\\xc6\\x94\\xa7\\x27\\xbc\\xfc\\x78\\xfd\\x85\\x19\\x5c\\x42\\xca\\xf8\\x83\\xa2\\xc3\\x8d\\x16\\x1c\\xad\\xd7\\x9c\\xfd\\xa9\\xa3\\x91\\x10\\xe1\\x26\\x4d\\x30\\xbd\\x4c\\x5c\\x4a\\x58\\x76\\x77\\x7f\\x23\\x3b\\x07\\x1b\\x1b\\x0b\\x40\\x89\\x35\\xf0\\x46\\x89\\x54\\xcc\\x74\\x4a\\xf8\\x06\\x3b\\x00\\x4e\\xde\\x56\\xcd\\x98\\x1c\\x4d\\xd5\\x60\\x8a\\xbf\\xfe\\xae\\xc9\\xe5\\x8f\\x3f\\xaf\\xaa\\x67\\x14\\x67\\x80\\x4b\\x7f\\xa2\\x55\\x8f\\x4f\\x95\\x17\\x42\\x01\\xf1\\x83\\xd8\\x0a\\x59\\x14\\x06\\x5f\\xed\\x53\\x11\\x5b\\x41\\xeb\\xc3\\x38\\xf7\\x8d\\xf0\\x50\\x05\\x3b\\x8a\\x4e\\x75\\xea\\x7c\\x6f\\xdc\\x35\\x4d\\xad\\x27\\xbf\\xd8\\xa2\\xe6\\x6f\\xcd\\x7a\\xe2\\xf5\\x87\\xd2\\x4b\\xe0\\xd4\\xa3\\x3d\\xa3\\x0a\\x22\\x0e\\x51\\xbc\\x05\\xfa\\x4e\\x41\\x2b\\x95\\x9f\\xd9\\x5d\\x89\\xea\\x6e\\xc0\\x16\\x25\\x16\\xc0\\x96\\xa9\\x43\\x3a\\x9e\\x7c\\xf5\\x99\\xc9\\x28\\xbd\\x53\\x05\\xc2\\x17\\x3b\\xf7\\x49\\x3e\\xd0\\xc1\\xc6\\x03\\xcd\\x03\\xf0\\x82\\xcc\\xe4\\x42\\x37\\xa7\\x9f\\xfd\\x8b\\xe9\\xa6\\x72\\xc2\\xeb\\xaa\"},\n{{0xcb,0xff,0xce,0x2c,0x9b,0xd3,0xe2,0x3e,0x40,0x6e,0x5f,0x66,0xe6,0x32,0xdc,0xfa,0x72,0x66,0x54,0xd2,0x9a,0x95,0x5c,0xec,0x98,0x31,0x73,0x23,0x5f,0xa3,0x59,0xd0,},{0x49,0x65,0x3e,0xdd,0x64,0xa5,0x5f,0x7c,0xd4,0x0e,0xaf,0x3f,0x8e,0x72,0xeb,0x96,0xdb,0xcd,0xee,0x39,0x8f,0x34,0x81,0x7f,0x2c,0x95,0x86,0x79,0x49,0x71,0x0b,0x14,},{0xe7,0xce,0xd4,0xfa,0x2a,0x7d,0xff,0x73,0xf1,0x06,0x8b,0xba,0xd0,0xec,0x9a,0x11,0x09,0x04,0x3c,0x97,0xa6,0x2e,0xff,0xa1,0x48,0x87,0x6f,0x09,0x69,0xed,0x4d,0xc6,0x08,0xe2,0x8b,0xce,0x79,0x7a,0xf3,0xb8,0x25,0x32,0xc9,0x4d,0xec,0x4d,0x68,0x11,0xb7,0xf5,0x63,0x67,0x91,0x29,0xfa,0xcf,0x17,0xbb,0x73,0xd6,0x93,0x75,0xeb,0x05,},\"\\x1f\\xfd\\xe6\\x82\\x6e\\x4f\\x0c\\x24\\xa7\\x96\\x1f\\x19\\x1e\\x74\\xcc\\x0b\\xbc\\x92\\x8e\\x3f\\x1a\\xec\\x3e\\xfa\\xb3\\x27\\x65\\xc2\\x50\\x1c\\xbc\\x16\\x20\\xe7\\xee\\x6f\\x61\\xfc\\xcf\\xb0\\x0c\\xfc\\xa9\\xfb\\x98\\x14\\x3b\\x52\\x9b\\xcc\\x8c\\x3d\\x0f\\xdf\\x89\\xee\\x7c\\x34\\x2f\\x10\\x18\\x15\\xfa\\xbf\\x7d\\xea\\xf9\\xf3\\x02\\xa2\\x88\\xfe\\x17\\x58\\x26\\xd5\\x90\\xd9\\x9e\\xe6\\xfd\\x92\\xda\\x74\\xf9\\x59\\x6b\\x78\\x3c\\x0e\\x7d\\x47\\xd7\\x11\\xa3\\x2f\\x39\\xea\\x41\\x65\\xe5\\x21\\x24\\x31\\x44\\x1b\\x49\\x8c\\x6b\\x70\\xdb\\x3b\\x09\\xd1\\xf4\\xe4\\xa1\\x4a\\x6b\\xae\\x39\\xda\\x50\\x88\\xbb\\x85\\xb3\\x28\\x5c\\xe9\\xdf\\x2f\\x90\\x68\\x1a\\xf2\\xc7\\x4d\\xec\\xe4\\x39\\xae\\xb9\\x1e\\x1c\\x1b\\x07\\x12\\xed\\xdb\\xee\\x8d\\x72\\x56\\x98\\x28\\xf3\\x7c\\xb7\\x20\\xc5\\x09\\xd0\\x2a\\xec\\x47\\x60\\x70\\x48\\x4e\\x9b\\x16\\xec\\x71\\x79\\x94\\x7a\\xc9\\x6c\\xaf\\x0e\\x1b\\xe8\\xb6\\xb7\\x4f\\x37\\x2d\\x72\\x35\\xfe\\x6e\\x39\\x99\\xdf\\x73\\x3b\\xcc\\xd4\\x82\\xdf\\xe2\\xe6\\x31\\xf5\\x6b\\x58\\x26\\x67\\xdc\\xe5\\xe3\\x12\\x17\\x63\\xad\\xfa\\xcf\\x3b\\x18\\xcf\\x20\\x95\\xf7\\x39\\x4d\\xee\\x49\\x27\\xfc\\x2b\\xea\\x6b\\x58\\x24\\xd9\\x0c\\xd5\\x9e\\x85\\x4e\\xc5\\x87\\x2b\\x45\\x51\\xb0\\x2e\\xfa\\xba\\x5a\\xd5\\x4a\\x9b\\x7a\\x8f\\x6d\\xe5\\xd7\\xcd\\xa5\\x82\\x5b\\x32\\x5b\\x07\\x6d\\xed\"},\n{{0x9f,0x91,0x23,0x14,0x97,0x48,0x4c,0xab,0x39,0xb9,0xe2,0x0f,0x86,0x11,0x81,0xd3,0x97,0x90,0x85,0x77,0xbb,0xb2,0x96,0x82,0x42,0xd0,0x71,0xbc,0xa4,0x81,0x3f,0xfb,},{0x88,0x24,0xbc,0x6c,0xd6,0xa6,0xf1,0x5a,0x5f,0x41,0x66,0x8f,0x2b,0x3b,0xae,0x8f,0xc4,0x96,0x73,0x83,0x07,0x8d,0x08,0xb5,0x1d,0x6d,0x1b,0x2b,0x93,0xa1,0x07,0x1f,},{0x0a,0x1c,0x70,0x6d,0xd8,0xa1,0x30,0x77,0xab,0x18,0x38,0x6c,0x65,0xfa,0x97,0xcf,0x9d,0xfc,0x43,0x54,0x2d,0x18,0x46,0xec,0xbd,0xde,0xb7,0xb3,0xc9,0x3f,0x3c,0x66,0xf3,0xcc,0xd0,0x44,0x7a,0xac,0xdd,0x4d,0xad,0x8f,0xbf,0x73,0x6c,0x4f,0xf9,0xdb,0xdb,0x62,0xbf,0xc1,0x4d,0x88,0x83,0xe3,0x85,0xbc,0xe9,0xba,0xc5,0x6a,0x35,0x0c,},\"\\x21\\xd4\\xfb\\xc9\\x81\\x63\\xc3\\xfb\\x6e\\x09\\xf7\\x75\\xc2\\xab\\x7b\\x18\\xb1\\x87\\x92\\x34\\x0b\\xaf\\xed\\xac\\xb4\\x96\\x05\\x62\\x2e\\x3c\\x08\\xaa\\x3b\\x2b\\x8d\\x0e\\x09\\x02\\xf3\\x61\\xaa\\x1c\\x0f\\x65\\x2e\\x27\\x32\\xb1\\x0a\\x0c\\x5c\\x6a\\x05\\x09\\x89\\x96\\xb5\\x88\\x26\\x7c\\xc8\\x95\\x1a\\x78\\xb5\\xd4\\x31\\xe7\\x22\\x2b\\xbb\\x50\\x8e\\xee\\xf1\\xb5\\xe8\\xb8\\xd0\\x1d\\x39\\x91\\xe1\\x8d\\xdd\\xc6\\xca\\x8d\\x22\\x2e\\xf1\\x77\\xce\\x62\\x93\\x8d\\x18\\x10\\xee\\xcf\\x06\\xf4\\x73\\x8b\\x28\\xf4\\x40\\x94\\x6c\\xca\\xd2\\xa1\\x2e\\x39\\xd3\\x86\\x11\\xbe\\xd3\\xa3\\x9f\\x93\\x41\\x9a\\x17\\x9e\\xc2\\xb1\\xb5\\x2d\\x5f\\xe5\\xc8\\x0c\\x23\\xb8\\x4d\\x88\\x03\\x75\\x5f\\x51\\x46\\x09\\x2c\\xc1\\x99\\xb4\\xbd\\xce\\xa5\\xbc\\xf2\\x03\\x7b\\xd5\\x3f\\xf6\\x34\\x66\\x94\\x15\\x5f\\x02\\x7d\\x8c\\xe2\\xba\\xff\\xe3\\x0a\\x56\\x66\\x59\\x6c\\x00\\x78\\x3a\\xae\\xad\\xe9\\xc7\\x7f\\xc8\\x63\\x79\\x42\\xec\\xe0\\x17\\xd6\\x48\\x4c\\x28\\x99\\xb1\\x91\\x8d\\x3a\\x48\\x0b\\xd5\\x15\\x76\\x78\\xd4\\x77\\x2d\\x27\\x1f\\x9b\\x99\\x76\\x8e\\xe1\\xbc\\xc4\\x6b\\x24\\x89\\xae\\x87\\xcd\\x03\\x0f\\x47\\xd1\\x33\\x3c\\x76\\x72\\xcb\\x90\\x2c\\xb4\\xf5\\xfe\\x74\\x6e\\x85\\x3d\\xe5\\x79\\x40\\xba\\x22\\x64\\xd3\\xe6\\x29\\x64\\x4d\\x65\\x3a\\x5b\\x7a\\xf7\\x8c\\xe6\\x4a\\x99\\x3f\\x36\\x25\\x0f\\x8c\\xb7\\xcb\\x45\"},\n{{0x1e,0x2b,0xd5,0x48,0x7c,0x5f,0x5c,0xed,0x46,0x1f,0x60,0x4d,0xcc,0xb4,0xe7,0x8e,0xb9,0x16,0x08,0xf0,0xb8,0x21,0xf5,0xaf,0xc4,0xe3,0xe5,0x34,0xf7,0x96,0x03,0x92,},{0xef,0x82,0x54,0x75,0xcf,0x20,0x51,0xa2,0x01,0x7a,0xe5,0x32,0xf0,0x77,0xd9,0x67,0x74,0x34,0x7d,0x27,0x67,0xea,0x7b,0x45,0xf9,0xc1,0xb8,0x60,0xab,0x99,0x35,0x06,},{0x4d,0x33,0xc9,0x6a,0x2e,0x3a,0x5d,0xb7,0x39,0x1a,0xdf,0x65,0xc1,0xcc,0x35,0x65,0xfe,0x76,0xee,0xaf,0xd0,0xb5,0xc7,0xab,0xb0,0xb4,0x92,0xa0,0xb5,0x1e,0x1f,0xa3,0x36,0x39,0x94,0x6a,0x24,0x3b,0x2d,0xde,0xf3,0x57,0x55,0x22,0x98,0xce,0x0a,0xa9,0x5e,0xac,0x6f,0xbf,0xe6,0x60,0x98,0x82,0x71,0x87,0x7e,0xb2,0xa7,0xda,0x18,0x06,},\"\\x1d\\xbb\\xbb\\x13\\xcd\\xad\\x88\\x85\\x4b\\x80\\x9c\\xed\\xed\\x27\\x33\\x43\\xd3\\x06\\xa8\\xde\\xab\\xf3\\xff\\x02\\xc9\\xce\\xc6\\xf0\\x02\\xb8\\xe9\\xe1\\x0e\\xf5\\xd1\\xb0\\xf5\\x71\\x1f\\x33\\x26\\x7a\\xa9\\x1c\\x17\\x1b\\x61\\xe9\\x60\\xf7\\x40\\x45\\x7b\\x81\\xd7\\x51\\xa4\\x73\\xf4\\x4f\\x75\\x0a\\x08\\x0c\\xab\\x80\\xaf\\x7c\\xcc\\xa7\\xdf\\xfc\\xfa\\xc9\\xee\\x4c\\x39\\xdc\\x85\\xcb\\xdf\\x51\\x25\\x9c\\xcd\\x34\\x70\\xd9\\xba\\xd3\\xad\\x30\\xf4\\xee\\x5d\\xbd\\x4f\\xac\\x6b\\xd5\\xc6\\xc4\\xdf\\x73\\x11\\xa4\\x70\\x04\\x46\\x95\\xa7\\xe1\\xa7\\xe1\\x85\\x72\\x20\\x75\\x88\\xaf\\xa5\\x7e\\xeb\\xcd\\x4d\\x57\\x5b\\x6d\\x42\\x44\\x57\\xee\\x92\\x46\\x5c\\xe1\\x86\\x3e\\x3c\\x67\\x7c\\xf8\\x75\\xfd\\xb9\\x8d\\x40\\x78\\xeb\\xe7\\x14\\x42\\x60\\x80\\x70\\x52\\x57\\x71\\x44\\xcb\\x8e\\x03\\x59\\xaa\\x42\\xad\\x15\\x5d\\x79\\xda\\xe3\\xde\\xb9\\x9c\\x46\\x32\\xc1\\x91\\xc7\\x99\\xcb\\xfe\\x58\\x7d\\x95\\x47\\x87\\x06\\x8d\\x66\\x3b\\xdf\\xc0\\xfa\\xb1\\x33\\x4f\\x18\\x76\\xbf\\x49\\x8c\\x4d\\xb5\\xc5\\x3d\\xb7\\xb0\\x20\\x4e\\xd5\\xa5\\x21\\xc6\\x2f\\x09\\xea\\xca\\x8d\\x01\\x89\\xf3\\xb3\\x94\\x14\\x3f\\x29\\xc4\\x21\\xcb\\x5c\\x8d\\x07\\xbd\\x75\\x1b\\xaf\\x4c\\xbe\\x3b\\xf4\\xbe\\x17\\x01\\xdf\\x4b\\x22\\x07\\xdf\\xb2\\x90\\x4d\\x84\\xf4\\xdb\\xda\\x51\\xcb\\xa5\\x76\\xd5\\xa5\\xbb\\x16\\xef\\xe6\\x98\\xed\\xd6\\x08\"},\n{{0xf7,0x8d,0xb1,0x4d,0x6d,0x1a,0x64,0x3d,0xd7,0x73,0x5b,0xaf,0x26,0x35,0x32,0x12,0x44,0xe7,0xec,0x8c,0xa7,0x2c,0x5c,0x38,0xc9,0x8c,0x80,0x9d,0xb9,0xcb,0x5a,0x55,},{0x54,0x14,0xf7,0x5f,0x52,0xf3,0x86,0x4a,0xfb,0x0c,0x79,0xc2,0xc5,0xc1,0xd0,0x6b,0x4b,0xce,0x40,0x0f,0xbd,0xdf,0x17,0xfe,0x9c,0xfb,0x2a,0x8b,0xac,0x47,0xa0,0xdd,},{0xd7,0xcb,0xd4,0x18,0x1f,0x67,0x71,0x20,0x07,0xb7,0xf0,0xe1,0x84,0x52,0xe0,0xa0,0x24,0x46,0x4d,0x9d,0xc9,0xb5,0xff,0x9c,0xf6,0x69,0xd1,0xb9,0x11,0x69,0xd7,0x57,0x32,0x62,0xf8,0x33,0x36,0xb9,0x7c,0x86,0x1b,0xfa,0xb3,0xfc,0xf6,0x69,0x22,0x3c,0xe8,0xca,0xf3,0x19,0xf2,0x1d,0x23,0xf1,0xfa,0x33,0x1a,0x2d,0x89,0xb6,0xca,0x0b,},\"\\x05\\xca\\xf1\\xb8\\xed\\xc3\\xb1\\x73\\xfb\\xc1\\xed\\x29\\xb9\\x5e\\x2b\\xf0\\x6d\\x81\\x4b\\xa2\\x40\\x7d\\x4b\\x31\\xc7\\x28\\xd0\\x4e\\xc2\\x73\\xd2\\x53\\x94\\x42\\x3a\\xc7\\xd4\\xff\\xf2\\xca\\x36\\xee\\x90\\x27\\x30\\x93\\xc7\\x56\\xe2\\xbd\\x13\\xc9\\x6d\\x4a\\x3d\\xc7\\xf5\\xbe\\x17\\x59\\xfc\\xd3\\x28\\xeb\\x66\\xc5\\x88\\x2b\\x58\\xfa\\x45\\x88\\xe5\\xb2\\xa3\\x71\\x3a\\x41\\x54\\xa2\\x34\\x0d\\x0b\\x06\\xad\\x01\\x96\\x01\\xb0\\xe0\\x28\\xe4\\x97\\xf8\\x98\\x25\\x6b\\x02\\x8a\\xf9\\x5c\\xd8\\x16\\x8d\\xf5\\xe5\\x8a\\x57\\xcd\\x1e\\xbf\\xc0\\xa0\\xc9\\x1c\\xed\\x61\\xdb\\xb4\\x80\\xac\\xa7\\xdf\\x8d\\xca\\x91\\xeb\\x16\\xe9\\x80\\x07\\xcd\\x2c\\xd1\\xa2\\x04\\x5b\\x0e\\x44\\x77\\xd1\\x2d\\x5a\\x40\\x72\\xf3\\x65\\x42\\x65\\x67\\xc9\\xd6\\x15\\x77\\xf3\\x48\\x5c\\x8f\\x46\\x60\\x5e\\x7f\\x47\\x5e\\xf0\\x4a\\x39\\x48\\xf6\\x0d\\xba\\x8c\\x55\\x08\\xd1\\x4b\\xfd\\xdb\\x9b\\x11\\xdd\\x04\\x4e\\xf2\\xd8\\x4c\\x16\\xb9\\xa9\\x03\\x8d\\x8e\\x78\\xed\\xa4\\x3b\\x91\\x29\\x7d\\xf3\\x5f\\x43\\x61\\xa3\\x83\\xb4\\x1d\\x49\\x67\\x7a\\x68\\x7d\\x5b\\x34\\x4a\\xd1\\xab\\x0f\\xc7\\x30\\x17\\xb3\\xbe\\xbf\\x32\\x30\\x6f\\xb3\\xfd\\x7b\\x3d\\x50\\x71\\xf3\\xab\\x5f\\x6e\\x49\\xaa\\x15\\x54\\x0c\\xad\\x65\\x03\\xbe\\xa7\\x78\\x4c\\xf9\\x42\\x18\\x01\\xce\\x13\\x85\\x83\\x98\\x93\\x36\\x2a\\x97\\xfa\\xe1\\x21\\x30\\x0d\\x67\\x83\\xaf\\x0f\"},\n{{0x7d,0xfa,0x32,0x8e,0x90,0xa1,0xb8,0x49,0xc2,0x19,0xe3,0xda,0x83,0x2d,0xf9,0xed,0x77,0x44,0x82,0x34,0xf0,0xd8,0x9e,0xa5,0xd1,0x7a,0x3d,0x64,0xe7,0x88,0x3d,0xaf,},{0xe3,0x0c,0xe6,0xfd,0x5f,0x58,0x00,0x38,0x9a,0x70,0xcd,0x11,0x73,0x64,0xf5,0x99,0x45,0xaf,0xb1,0x80,0xf2,0x29,0x92,0x73,0x60,0xb0,0x6b,0x48,0x35,0xf8,0xdc,0x91,},{0x1c,0x61,0xd5,0x3b,0x87,0x2f,0x8c,0xde,0x59,0x86,0x09,0x68,0x2c,0x79,0xf6,0xc5,0xdf,0x00,0x7c,0x51,0x3a,0x71,0xcf,0xb3,0xa0,0x6d,0xcb,0x82,0xd8,0x5c,0x4b,0x00,0xcc,0xc4,0x0b,0x00,0xe5,0x9f,0x59,0x53,0x93,0x08,0x8b,0x4c,0xd0,0x43,0x28,0x55,0xc6,0x7a,0x20,0x7d,0xa7,0x1f,0x87,0xe7,0x2c,0x40,0x9b,0x3e,0x50,0x27,0x95,0x07,},\"\\xe5\\xe4\\x95\\xd6\\x63\\xf4\\x72\\x36\\x71\\x45\\x32\\x68\\x7a\\x24\\x30\\x8f\\x94\\x2c\\xa9\\xc3\\x3e\\x08\\x8f\\x7f\\x10\\x6a\\x5a\\x72\\x35\\x18\\xca\\xcb\\xbe\\xf4\\xa6\\x8c\\x93\\x9a\\x69\\x50\\xb2\\xdc\\x25\\x89\\xf8\\x2d\\x35\\x4e\\x57\\x52\\x72\\xd4\\x2b\\x13\\x83\\xd3\\x15\\xab\\x8a\\x20\\xaa\\x0c\\xdc\\x9d\\x4d\\xf6\\x78\\xab\\x3b\\x26\\x61\\x2b\\x5d\\xca\\x66\\xe7\\x1f\\x9f\\x3f\\xa7\\xd9\\xe7\\x31\\xdc\\x48\\x1e\\x2b\\xc7\\x12\\x7c\\xea\\x3b\\x62\\x03\\xca\\x6c\\xd8\\x16\\x2e\\x90\\x88\\x6a\\x73\\xdc\\x46\\xc8\\x3d\\xde\\xfc\\x4b\\x9e\\x2d\\x53\\xd2\\x9d\\xd3\\x87\\xc6\\x24\\xe0\\x8b\\xd8\\xd5\\x3b\\xe9\\x28\\xa4\\x0a\\x9a\\xa8\\xae\\x8b\\x1c\\x8d\\x0f\\xb6\\xa7\\xbd\\x6d\\xce\\x5f\\x62\\x31\\x5b\\x7a\\x21\\x81\\xf6\\x27\\xf2\\x56\\xbb\\xe7\\xe2\\xa9\\x5b\\xf4\\x64\\xe6\\x13\\x22\\x04\\xc1\\x74\\x20\\x96\\x29\\x84\\x02\\x35\\xb2\\xc3\\x99\\x13\\x30\\x1a\\x4b\\x40\\x32\\x5d\\x11\\x8d\\x38\\x4b\\xc7\\xac\\x02\\x8c\\xd4\\xf1\\x27\\x02\\xe1\\x61\\x19\\x1b\\x14\\x9e\\x42\\x09\\x05\\x8a\\x55\\x12\\x2b\\xbb\\x8b\\x22\\xb2\\x46\\x83\\xba\\x4f\\x8e\\x2e\\x6c\\xcf\\xc0\\x8d\\xc8\\xc8\\xb1\\xbc\\xfb\\x6d\\x60\\xbd\\x8f\\x06\\x21\\x96\\x93\\x3d\\xf3\\x19\\xab\\x16\\x90\\x6d\\x08\\x57\\x30\\xeb\\xa1\\x72\\x0d\\x4b\\x02\\xc6\\x7d\\xaf\\x38\\xcc\\xe6\\xab\\xa3\\x8e\\x25\\xd6\\x8e\\xf9\\x5b\\x2f\\x52\\x19\\x13\\xa1\\xd7\\x7d\\x5e\\xb6\\x50\"},\n{{0x6c,0xe1,0x3d,0x3c,0x2e,0xc7,0x1f,0xed,0x83,0x13,0x1a,0x69,0xd5,0xd0,0x30,0x31,0x4a,0xb4,0x9e,0x65,0x65,0xef,0x68,0x16,0x3f,0xff,0x09,0xac,0x5d,0x9b,0x47,0xe7,},{0x9c,0x7b,0x11,0x18,0xfa,0xb9,0x1e,0x0e,0x7b,0x19,0x2a,0x23,0xd9,0x5f,0xb8,0x77,0xcb,0x79,0x36,0xcc,0x6c,0x8a,0x33,0x05,0x92,0xf4,0x8e,0x67,0x84,0xed,0xc2,0x92,},{0x60,0x8b,0x2b,0xf6,0xf6,0xda,0x05,0xc2,0xac,0x5b,0xbf,0xd7,0x95,0xa2,0xac,0x32,0xc7,0x9c,0x74,0x15,0x3f,0x94,0x31,0xde,0xa5,0x97,0x68,0xff,0x4c,0x22,0x5e,0x3b,0x69,0x3b,0x64,0x5a,0x50,0x67,0x66,0xb8,0x60,0x85,0x0e,0xe9,0x7e,0xa4,0x30,0x32,0xb0,0x5b,0x69,0xe5,0x67,0x67,0xe8,0xeb,0x9d,0x19,0x18,0xdf,0x9a,0xfb,0xa8,0x05,},\"\\x10\\xbb\\xc3\\x11\\xeb\\x2a\\x76\\x5e\\x01\\x67\\xff\\x37\\x61\\x8f\\xf7\\x0e\\x13\\xf0\\x2d\\x7b\\x06\\x17\\xae\\x4a\\xc0\\x6b\\xef\\xbb\\xe1\\x49\\xc9\\x72\\xa9\\x94\\xf6\\x80\\xca\\x4d\\xc9\\xa9\\x2e\\xc7\\xef\\xa5\\x39\\x97\\xfa\\xd3\\x56\\xb9\\xff\\x4e\\xbd\\xee\\x62\\x95\\x41\\xd1\\xf4\\xde\\xa6\\x2e\\xd0\\xd2\\x49\\x4f\\x9c\\xcf\\xdf\\x07\\xa9\\x31\\x04\\x91\\xf6\\x1c\\x4b\\x3e\\x27\\x00\\xb4\\xa3\\xc6\\x68\\xd6\\x78\\x32\\x9a\\x38\\xc2\\xef\\xf9\\xd8\\xcb\\xa4\\x31\\xfb\\x95\\x9e\\x7f\\x76\\x55\\xbd\\x0f\\xbd\\x77\\xd5\\x3b\\xbb\\xc2\\xeb\\x8d\\xc5\\x1d\\xd7\\x18\\xed\\x98\\x72\\x8a\\x18\\x16\\x86\\xbe\\x12\\x2b\\x84\\x4d\\x3d\\xa3\\x31\\xe3\\x29\\xd3\\x95\\x9b\\x59\\x23\\xf7\\x73\\x43\\x25\\xa0\\x21\\x02\\x6e\\x27\\x54\\xe1\\x7a\\x15\\x10\\x8b\\xe8\\x01\\x46\\x5a\\xd9\\x58\\xdb\\xcf\\x21\\xdf\\x89\\x0c\\xfe\\x5d\\x5b\\x88\\x3c\\xa4\\x3c\\x61\\xce\\xdc\\xcb\\xdb\\x58\\xb8\\x49\\xea\\x75\\x37\\x4f\\x1e\\x91\\x8e\\x80\\x3e\\x57\\x7a\\x5d\\xc7\\xa1\\xc1\\x79\\x36\\xec\\xcf\\xcd\\x34\\x81\\xbd\\x2b\\x1e\\xb0\\x75\\xb8\\x32\\x37\\xca\\x6f\\x3c\\x07\\xc1\\x9e\\x9a\\xf9\\x73\\x12\\x67\\xbe\\x82\\xd4\\x89\\x8e\\xee\\x96\\xeb\\xc9\\x00\\xd4\\x8b\\x05\\x9d\\x51\\xb0\\xdd\\x41\\x5b\\x1c\\x89\\x06\\x60\\xa8\\x8d\\x25\\xf5\\xc5\\xf3\\x5d\\x8e\\x45\\xe5\\x23\\xe0\\xce\\x33\\x36\\x92\\x3a\\xb4\\x36\\x70\\xe3\\x5c\\x50\\x57\\xd5\\x6c\\x75\\x88\\x76\"},\n{{0xd4,0x5e,0xe6,0x9a,0x5f,0x1a,0x7c,0xfd,0xd0,0x34,0x3f,0x87,0x70,0xd1,0xc6,0xbc,0x02,0x6f,0x06,0x7a,0x70,0xdb,0xe8,0x39,0xa8,0x6f,0x2a,0xa0,0x68,0xc3,0x3f,0x81,},{0xfc,0x8d,0x9f,0xb0,0xe4,0xf3,0x47,0x93,0x09,0x07,0x55,0xe0,0x32,0x80,0x96,0xe0,0x1e,0x28,0x1e,0xa3,0x51,0xb8,0xd9,0x5c,0xd9,0x11,0x6e,0x13,0x1a,0x5c,0xa5,0x4e,},{0x15,0x6c,0x51,0xc5,0xf9,0x15,0xd8,0x9b,0x8d,0x14,0x00,0x35,0x0f,0x8f,0x21,0x7a,0x5c,0x02,0xe2,0x62,0x9e,0xde,0x9f,0x4a,0x30,0xb6,0xe7,0x1d,0x1e,0xa7,0xa9,0x53,0xcc,0x6d,0xb3,0x1b,0xa5,0xc7,0x78,0xc2,0x69,0x92,0x0b,0x64,0x9f,0xb4,0x22,0x1c,0x6d,0x38,0xcf,0x2c,0xea,0x2a,0x7d,0xe3,0xad,0x42,0x3e,0x04,0xfa,0xaa,0x06,0x07,},\"\\xeb\\x5e\\xd8\\xab\\x79\\xcb\\xfe\\x61\\xc2\\x59\\x81\\xb9\\xd1\\xd6\\xb7\\x0f\\x10\\xb6\\x01\\x94\\xb4\\x16\\x1f\\xe1\\x7d\\x11\\xaf\\xf1\\x76\\x79\\x94\\xaa\\x08\\x13\\xe9\\xec\\xe2\\xf4\\xc5\\xd5\\x31\\xb9\\x9e\\x8a\\xdf\\x18\\x88\\xc3\\x0a\\x63\\x89\\x3e\\xb4\\x51\\xaa\\xf5\\x5a\\xcd\\x5a\\x52\\xad\\x8c\\x40\\x1f\\xaa\\x88\\xd6\\xea\\xcf\\x3e\\x49\\x47\\x05\\x66\\x11\\x4f\\xd0\\xc6\\xa2\\x74\\xe9\\x54\\x48\\x46\\xb0\\xae\\x9b\\xfa\\x12\\x4d\\x79\\x51\\xeb\\x26\\x71\\x5e\\x19\\x25\\x3f\\xf7\\xed\\xc8\\xa7\\x09\\x65\\x77\\x6f\\x23\\xce\\x46\\x03\\x1e\\x03\\x4a\\x20\\x07\\x23\\xba\\x3d\\x11\\xe1\\x1d\\x35\\x3d\\x7e\\x7c\\xd8\\x4a\\xed\\xe2\\x67\\xff\\x64\\xbe\\xd4\\x18\\xcb\\x9f\\x28\\xc6\\x1c\\xd0\\xf6\\x3b\\x6c\\xe2\\xec\\xae\\x14\\xb2\\x0b\\xc6\\xbd\\xae\\xd8\\xc4\\x28\\xba\\xd1\\x8b\\xe4\\xb7\\xd6\\x63\\x38\\x36\\x4a\\xcd\\x80\\x42\\xa8\\x25\\x6f\\x25\\x8a\\x69\\x96\\x9b\\x8d\\x3c\\xa2\\xea\\xb3\\xae\\xa3\\x70\\x6e\\x5f\\x21\\xc3\\xb1\\xef\\xcc\\x25\\x4a\\x82\\x4b\\xb4\\xe7\\xea\\x7a\\xba\\x88\\x27\\xc8\\xeb\\x82\\x78\\x6c\\x66\\x5a\\xa9\\x73\\x82\\x19\\x31\\xff\\x99\\x0a\\x63\\xfd\\x34\\xa7\\x4a\\x6d\\x8c\\x22\\xa8\\x82\\xb0\\xb9\\x35\\x15\\x2c\\xcb\\x36\\xfc\\xc7\\x6f\\x4e\\xca\\x65\\xd6\\x7c\\x86\\x80\\x94\\x2f\\x75\\xdf\\xad\\x07\\x34\\x39\\xc0\\x91\\x60\\x65\\xe8\\x38\\x77\\xf7\\xba\\x20\\x93\\x03\\xf3\\x35\\x48\\xd9\\xe4\\x0d\\x4a\\x6b\"},\n{{0x8a,0x76,0xea,0xab,0x3a,0x21,0xec,0x5a,0x97,0x5c,0x8b,0x9e,0x19,0x7a,0x98,0x9e,0x8e,0x03,0x08,0x99,0xeb,0x45,0xd7,0x89,0x68,0xd0,0xfb,0x69,0x7b,0x92,0xe4,0x6d,},{0x2d,0x9c,0x81,0x3d,0x2d,0x81,0xe2,0x73,0x0b,0x0d,0x17,0xd8,0x51,0x2b,0xb8,0xb5,0xd3,0x3f,0x43,0x6c,0xab,0xaa,0x13,0xe1,0x41,0xca,0x1c,0xb7,0x85,0x01,0x43,0x44,},{0xfc,0xee,0xcc,0xa4,0xb0,0x14,0xfe,0xcd,0x90,0xb9,0x21,0xb0,0xfa,0x3b,0x15,0xae,0xaa,0x4e,0x62,0xca,0xa1,0xfb,0x22,0x72,0x9c,0x70,0x26,0x92,0x32,0xc3,0x3c,0xef,0x0d,0x0a,0xee,0xa6,0x64,0x32,0xc1,0x28,0xaf,0xb9,0xa3,0x64,0x6b,0xc7,0xf0,0x3a,0x12,0x77,0x4d,0xa8,0x75,0x83,0x98,0xc2,0xa0,0xdc,0xce,0x0b,0xbb,0xf6,0x74,0x0a,},\"\\xc6\\xc7\\x8f\\x2e\\x20\\x80\\x46\\x1a\\xed\\x9f\\x12\\xb4\\xf7\\x7c\\x98\\x9b\\x19\\x71\\x67\\x80\\xfa\\xb6\\x0e\\x6e\\xcb\\x97\\x93\\xb4\\xbc\\x7e\\xd6\\x9e\\x5f\\x70\\xfa\\x6b\\xdb\\xa1\\x6e\\x9b\\xd3\\x19\\x49\\x69\\xee\\xa6\\x66\\x5a\\xbf\\xd6\\x30\\xde\\xee\\xfa\\x3d\\x71\\x7b\\x6d\\x25\\x4d\\xd2\\x4b\\xc9\\x7d\\xde\\x21\\xf0\\xf2\\x9f\\x9e\\xd3\\x4b\\x8b\\xd7\\xa0\\x13\\x38\\x0f\\x4f\\x82\\xc9\\x84\\xfd\\xbd\\x95\\xaf\\x98\\x05\\xb7\\x44\\xbc\\xd9\\x52\\xc5\\xa7\\x1f\\xbb\\x57\\xd1\\x1f\\x41\\x1c\\x18\\xcc\\x30\\xbc\\x35\\x94\\xf7\\xad\\x82\\x28\\xcb\\x60\\x99\\x39\\x4a\\x1b\\x6b\\x0a\\x81\\x85\\x81\\xbd\\xf9\\x3c\\xce\\x58\\xf3\\xa4\\xa2\\x3e\\x55\\xdb\\x3e\\x69\\xca\\x9d\\x60\\xcf\\xb3\\xa9\\x07\\xfb\\x68\\x32\\x9e\\x2f\\xfb\\x6c\\x65\\xf1\\xe8\\x28\\xd2\\x81\\x27\\x10\\x9c\\x9e\\x9f\\xb7\\x01\\x60\\xf2\\xef\\x82\\xa2\\xee\\x9f\\x9b\\xd1\\x70\\xc5\\x1e\\x13\\xfd\\x3f\\xc1\\x86\\x6b\\x22\\xc7\\x9f\\xe6\\xd5\\x10\\x12\\x17\\x97\\x9d\\xbe\\x27\\x24\\xdc\\xad\\x8a\\x9b\\xc6\\x9a\\xcc\\x42\\xc1\\x12\\xdc\\x69\\x7b\\xd2\\x71\\xee\\xa5\\x50\\xe9\\xe5\\x04\\x06\\xbf\\xd2\\x82\\x45\\xb8\\x3b\\x8f\\x01\\x2d\\x34\\xdb\\x6d\\xbd\\xd5\\x5a\\xe6\\xe5\\x75\\x74\\x5c\\x15\\x3d\\x6e\\x75\\x34\\x90\\x10\\x27\\xea\\xdc\\x2f\\xcc\\x33\\xa5\\x28\\x7d\\xdb\\xca\\x6d\\x3a\\xea\\xb8\\x97\\x22\\x94\\xdc\\x6c\\x71\\x2b\\x99\\x42\\x54\\x72\\x77\\x34\\x0e\\x7a\\xd1\\x9e\"},\n{{0x18,0xa8,0xf9,0x36,0x48,0xcd,0xcf,0x47,0x13,0x36,0x30,0xaf,0x1e,0x11,0xc0,0xce,0xea,0x3d,0xe0,0x73,0x27,0x31,0x4c,0x96,0x58,0x0d,0xf7,0x75,0x59,0x7d,0x7a,0x9c,},{0x29,0x12,0xf4,0x1a,0xb4,0xc8,0x7e,0x39,0x37,0xa0,0x33,0x31,0x80,0x2c,0xba,0x87,0x71,0x6b,0x4e,0xea,0x14,0xb9,0xfb,0xa6,0xf5,0x46,0xd0,0xac,0x2c,0x09,0x73,0xdf,},{0x3b,0x77,0x39,0x4c,0xd6,0x9f,0x8b,0x45,0xd0,0x0c,0xfe,0x3a,0x79,0xa7,0x90,0x06,0x28,0xa5,0x65,0x18,0xb3,0x79,0xed,0x8a,0x11,0x58,0x1f,0xc3,0xa3,0x76,0xe5,0xd6,0x68,0x07,0xdf,0x11,0xe7,0x09,0x04,0xf6,0x96,0xc7,0x41,0xd2,0x1d,0x13,0x93,0x10,0xfa,0x1b,0x89,0xa9,0x3b,0xdc,0x4d,0x2c,0x39,0x97,0x99,0x1f,0x52,0x20,0xee,0x00,},\"\\x59\\x20\\x93\\xac\\x7c\\xd6\\x71\\xd6\\x07\\x0b\\x00\\x27\\xed\\xac\\x1f\\xb0\\x15\\xcc\\x20\\x5d\\x78\\xbb\\x60\\x3f\\x37\\x8e\\xb9\\xf8\\xaa\\x38\\x8c\\xa8\\x30\\xdb\\x3c\\xb2\\x34\\x20\\xc7\\xe8\\x52\\xdb\\x0b\\x55\\x24\\x1e\\xb8\\x8a\\x02\\xcc\\x62\\x7a\\xa9\\x41\\x43\\xbe\\x43\\x9a\\xab\\x4b\\xf2\\x63\\x47\\x57\\x47\\x04\\x06\\xe8\\x42\\xf2\\x0e\\xb1\\x0f\\x07\\x00\\xe3\\xc2\\xda\\x36\\x4f\\x58\\x8a\\x80\\x00\\xf2\\x38\\x50\\xc1\\x2c\\xe9\\x76\\xf3\\x26\\xd2\\xdf\\x1b\\xac\\x13\\xe9\\x50\\x20\\xb4\\x12\\xb1\\x75\\xbf\\x74\\xbd\\x7e\\xbb\\xac\\xf3\\xae\\x55\\xc0\\xda\\xeb\\xb5\\xc0\\x10\\xbf\\x80\\x4f\\xee\\xe1\\xd7\\xd4\\x9f\\xae\\x05\\x0b\\xea\\x55\\x99\\x6f\\x53\\xcf\\xe1\\xf1\\x5a\\x0c\\xf2\\x07\\x27\\xdb\\x4e\\xe3\\x11\\xc2\\x60\\xba\\xd9\\x68\\x2d\\x7b\\x96\\x5e\\x27\\xa9\\x49\\x1f\\x47\\x1d\\x4a\\x47\\x3a\\xff\\x64\\x6c\\x7d\\x42\\x4d\\x5a\\x0b\\xdc\\xbb\\x8a\\x02\\x33\\xf4\\xb3\\x06\\x0d\\xd0\\x4c\\x98\\xec\\x98\\xdf\\xd0\\x5e\\xc7\\x24\\x78\\x84\\xe2\\xd8\\xe1\\x52\\xd4\\xae\\x52\\xb3\\xd5\\x86\\x5d\\x9e\\xfd\\x67\\x06\\xa6\\x0e\\x08\\x8e\\x1e\\x7c\\x9f\\x62\\x45\\x10\\xab\\xc7\\xa2\\x04\\x5a\\x2c\\x7a\\x75\\x88\\xe2\\x53\\x5e\\x73\\x19\\x1d\\xd5\\xcf\\x05\\x42\\x15\\x63\\xf5\\x56\\xa1\\x3e\\x82\\x36\\x67\\x03\\x43\\xcd\\x5b\\xa4\\xd4\\x66\\xe2\\x45\\xc4\\xee\\x3b\\x5a\\x41\\xe7\\x0c\\x9a\\x0f\\x5e\\x6e\\xa2\\xc5\\x59\\xeb\\xe6\\x1b\\xa8\\x1e\"},\n{{0x20,0x6c,0xd2,0xb8,0x11,0x4a,0xae,0x18,0x8d,0x81,0x86,0x2c,0xce,0xc4,0xcb,0x92,0xc4,0xef,0x5f,0xc7,0x8c,0x24,0x43,0x5a,0x19,0xf9,0xed,0x9b,0x8a,0x22,0xf4,0x7e,},{0x97,0xa6,0x7a,0xc2,0x81,0x1f,0x52,0x94,0x56,0xdf,0x53,0x27,0x37,0xd7,0x6b,0xed,0x7e,0x38,0x7d,0xa8,0x3b,0xd5,0x54,0x59,0x37,0x2f,0xdf,0xb2,0x7f,0xfa,0xcf,0xf3,},{0x73,0xa4,0x0d,0x9d,0xa0,0x8f,0xb9,0x8e,0xa2,0x5b,0x67,0xe7,0x21,0x55,0x7a,0x1a,0x51,0x22,0x52,0x94,0xd3,0x16,0xb5,0x31,0x49,0xaf,0x89,0x5f,0xa4,0xd6,0x3c,0xb4,0xa3,0xf5,0x6f,0x68,0x85,0x66,0xef,0x6d,0xa4,0x2f,0xd2,0x94,0x1d,0xff,0xa0,0x6d,0x49,0x7a,0xa9,0x02,0x16,0x5d,0x50,0x21,0x3a,0x62,0x14,0x11,0x62,0x99,0xa9,0x0c,},\"\\x48\\x0c\\x48\\x00\\xf6\\x8c\\x79\\xf5\\xdf\\xc0\\xc3\\x66\\x6c\\x0a\\xc4\\x29\\xb3\\x0f\\xe0\\xc5\\xfe\\x84\\x87\\x50\\xdb\\x21\\x71\\x38\\x0b\\x80\\xc8\\xe9\\xfe\\xc0\\xa0\\x54\\xb1\\x6d\\x08\\x67\\x4c\\xef\\xe2\\xf6\\x4e\\xc2\\x8b\\xb6\\xb0\\x59\\x6b\\x35\\x23\\x55\\x75\\xf1\\x89\\xbe\\xe2\\x59\\xac\\xa7\\x66\\xc2\\x22\\xac\\x0a\\x46\\xcf\\x2a\\xf7\\x57\\x74\\xda\\x4e\\x34\\xa0\\xb5\\x4f\\xc2\\xac\\x49\\xec\\x8b\\xed\\xf4\\x88\\x7c\\xd9\\xb7\\xbe\\x4f\\xdb\\x7f\\x68\\x69\\x02\\xdd\\xfa\\xb0\\x46\\x27\\xe2\\x6e\\xa2\\xdc\\x3d\\x97\\xd6\\x2a\\x4b\\x15\\x46\\x18\\x02\\x18\\xed\\x8f\\xa1\\x13\\x33\\x48\\x19\\xb5\\x27\\x5c\\xc5\\x4a\\xfd\\xee\\x44\\x30\\x90\\x08\\x59\\x65\\x07\\x97\\x16\\x75\\xe6\\xd8\\xb8\\xa8\\xed\\xec\\x47\\x18\\xf2\\xd4\\xbd\\x73\\x52\\x13\\xcb\\xbd\\x18\\x79\\x1f\\xaa\\x80\\x54\\x17\\x49\\x07\\xa7\\xac\\x17\\xd7\\x14\\x3a\\x47\\x57\\xe4\\x93\\xbe\\xee\\xc4\\x84\\x9d\\x0b\\x83\\x6f\\x18\\xbb\\x2b\\x3c\\x90\\x16\\xf2\\x5a\\xf4\\x7f\\xb9\\x61\\x99\\x25\\x17\\x20\\x54\\x9f\\x15\\xd1\\x49\\x50\\x3d\\x41\\x09\\x5e\\x25\\xf2\\x62\\x09\\xda\\xac\\x39\\x15\\x44\\x85\\xc3\\xde\\xd7\\xcb\\x1a\\x8c\\x3e\\x83\\xa5\\x2f\\x5a\\x06\\xec\\x09\\xcf\\x83\\xdf\\x00\\x72\\x6b\\x79\\x68\\xf6\\x4c\\x0c\\xba\\xe2\\x99\\x51\\x2f\\xb4\\x38\\x56\\x0f\\x04\\xb3\\xb6\\x44\\x34\\x6f\\x93\\x8a\\xc8\\xe9\\x04\\x86\\x61\\x4c\\xd8\\x44\\xb5\\x4e\\xae\\x07\\x8b\\xf6\\x78\\xb3\"},\n{{0x59,0xb1,0x44,0xa7,0x08,0xab,0xec,0x97,0x27,0x29,0xa0,0x4a,0x6c,0x13,0xf0,0xea,0x02,0x0b,0x4e,0xd4,0xa4,0x82,0x98,0x02,0x3a,0x56,0x89,0x58,0xc2,0x12,0x15,0xec,},{0xc4,0xf4,0x72,0x00,0x92,0xed,0x61,0x79,0xa0,0x82,0xae,0x4d,0x61,0x45,0xdf,0x37,0x71,0x78,0x6e,0xfc,0xa9,0xbd,0x9b,0xb7,0x9c,0x9f,0x66,0x67,0xd2,0xcb,0x56,0xb3,},{0x1a,0x80,0x85,0x0f,0xcb,0xd6,0xe6,0x43,0xc6,0xba,0x8e,0xb6,0x84,0xdb,0xef,0x7d,0xf0,0x15,0x15,0x92,0x28,0xda,0xed,0xcf,0x06,0x04,0x70,0x91,0x86,0x05,0x4d,0xb1,0x85,0xaa,0x7b,0xaa,0xcb,0x09,0xd6,0xca,0xad,0x01,0x63,0x8e,0xff,0x8e,0x46,0x87,0x35,0xa6,0x01,0x24,0xde,0x0c,0x53,0x76,0xe9,0x43,0x40,0xe5,0x41,0xa9,0x80,0x07,},\"\\x38\\x57\\xbd\\x26\\x0b\\x8a\\xad\\x9d\\x07\\x3f\\x06\\x76\\x5d\\x37\\xfe\\x89\\x3a\\x3f\\x53\\xe2\\x3d\\xe8\\x66\\xdd\\xac\\x33\\x49\\x5a\\x39\\xad\\x33\\xee\\x9e\\x9d\\x5c\\x22\\x50\\x2b\\xc1\\xc4\\xb5\\x47\\x0d\\x0e\\x3f\\x3a\\x58\\x52\\x23\\xfe\\x4c\\xb9\\x3c\\xc4\\xad\\x2b\\x5b\\xa6\\xd7\\x88\\x26\\xa5\\x3f\\xc0\\x25\\x3d\\xc5\\x80\\xa2\\x01\\x8c\\xc9\\xff\\x1c\\xfe\\xdb\\xd3\\xac\\x0b\\x53\\x29\\x2d\\xee\\xfb\\xc1\\x4e\\x58\\x9a\\xcf\\x49\\x6c\\xb5\\xf7\\x67\\x01\\x30\\xfd\\xbb\\x6c\\xf3\\x8d\\x20\\x89\\x53\\xc0\\x15\\xa0\\x47\\x46\\x75\\xb7\\x24\\xbd\\x10\\x9f\\x7c\\xb8\\x9c\\x33\\x01\\x67\\x51\\xfe\\x7a\\xa7\\x85\\xd0\\x99\\xd0\\x9a\\xb2\\x0d\\xd5\\x25\\x8c\\xd7\\x64\\xac\\x8d\\xaf\\x34\\x3c\\xe4\\x79\\x0e\\xad\\x08\\x63\\xaf\\x43\\x12\\x1a\\xa5\\x27\\xa3\\x7a\\x11\\x62\\x8f\\x47\\x86\\x96\\x68\\xf8\\xea\\xc0\\x0d\\x80\\xb6\\xbf\\x99\\x06\\x66\\x3d\\x7a\\x28\\x99\\xc1\\xcb\\x67\\x8c\\xd7\\xb3\\xeb\\x3b\\xc8\\x02\\x26\\xb8\\xb1\\x3b\\x6e\\x46\\x87\\x7f\\x38\\xf0\\x7c\\x3d\\x9c\\x86\\xd3\\x36\\x8b\\xaa\\xc4\\xa6\\xf6\\xb9\\x3c\\xce\\xbc\\xec\\x98\\x11\\x47\\x4b\\x6a\\x6a\\x4d\\xa5\\xc3\\xa5\\x96\\x65\\x71\\xee\\xd0\\x5e\\xdc\\xc0\\xe3\\xfe\\x7c\\xd1\\x59\\x15\\xc9\\x1f\\x44\\xee\\xe8\\xc1\\x49\\xae\\x45\\x1f\\x37\\x55\\x18\\xa7\\x9f\\xb6\\x00\\xa9\\x71\\xa3\\x9b\\x94\\x33\\xdf\\xa1\\x9f\\x91\\x93\\x1b\\x19\\x32\\x27\\x57\\x47\\xc2\\x62\\xee\\xdc\\xbd\\x27\\xf1\"},\n{{0x8d,0x16,0x21,0xee,0xab,0x83,0x27,0x0d,0xe8,0x57,0x33,0x5c,0x66,0x5b,0xbf,0x57,0x26,0xe3,0x72,0x22,0x25,0xfd,0x01,0x6e,0x23,0xbf,0x90,0xab,0x47,0xae,0xec,0x3d,},{0xbe,0xcd,0xbc,0x02,0x4d,0xae,0x6a,0x94,0xed,0x4e,0x29,0xc8,0x0f,0x2a,0xff,0x79,0x6a,0xed,0x8f,0xeb,0x2c,0x1b,0x37,0x90,0xa8,0xc7,0x2d,0x7b,0x04,0x8a,0x2c,0x61,},{0xe0,0x8d,0x6c,0xaa,0x5f,0x39,0x32,0x7d,0x6e,0x66,0x52,0xed,0x74,0xdd,0x1a,0x37,0x84,0x4b,0x97,0x9f,0x5c,0xce,0x74,0x7a,0x60,0x6f,0x56,0x79,0xf4,0x89,0x8b,0xbb,0x76,0x43,0xdf,0x7e,0x93,0x1b,0x54,0xa2,0xb4,0x0e,0xbd,0xef,0xe8,0x30,0x03,0xf6,0x1c,0xa0,0xf1,0x11,0x12,0xf0,0x23,0xc6,0xa3,0xe8,0xcc,0x18,0xca,0xfe,0x5f,0x0d,},\"\\x97\\xfa\\xcd\\xdc\\x82\\xcc\\xcc\\xcf\\x78\\x8c\\x31\\xb3\\x30\\x5e\\x93\\xeb\\xa9\\x56\\xf8\\x96\\x13\\xe6\\xe5\\x35\\x42\\xb0\\x43\\x26\\x7f\\xee\\x54\\x4c\\x2b\\x0a\\x8a\\xe8\\x88\\x6a\\x31\\xb9\\xd3\\x21\\xa6\\x3c\\x27\\x62\\x3b\\xae\\xfe\\xa8\\x40\\xb2\\xa8\\xaf\\x5b\\x23\\x30\\x19\\x3f\\xfb\\x5b\\xaf\\x87\\x3c\\x33\\x55\\x28\\xaf\\xea\\xe2\\x16\\x01\\x63\\xc8\\x51\\xc5\\xa2\\xe5\\x81\\x54\\xa1\\xb0\\x56\\x9c\\x2d\\x13\\x66\\xc0\\x71\\x04\\x37\\x62\\x3b\\x0e\\x08\\xc6\\x86\\xe5\\x4f\\xc2\\x79\\xed\\x4c\\x45\\xf3\\xe8\\x56\\x86\\x83\\x75\\xf7\\x82\\x24\\xc7\\x77\\xb1\\x3d\\x75\\xde\\x10\\xd7\\x91\\x73\\x55\\x24\\x25\\xd1\\x5a\\x56\\x19\\x04\\x15\\x5f\\x21\\x17\\xb2\\xf1\\x47\\x13\\xeb\\x0b\\x04\\x64\\x8a\\x3b\\xde\\xb3\\x30\\x21\\x67\\xd1\\x97\\x3e\\x78\\x8a\\x06\\xcb\\x00\\xd4\\x8c\\xcb\\x26\\x9f\\xa7\\x1a\\xf8\\xba\\x68\\xea\\xe5\\x5d\\xbb\\xfd\\x95\\x94\\xd5\\xc2\\xb4\\xdc\\x13\\xae\\x03\\x21\\x71\\x85\\x61\\xac\\xdf\\x67\\xdc\\x8c\\xfc\\xc2\\x5b\\xc4\\x6b\\xb6\\x6e\\x09\\x6a\\x19\\x41\\xd9\\x33\\x52\\x07\\xd3\\xf7\\xd1\\x1e\\x89\\x04\\x90\\x4f\\xab\\xe3\\xa5\\x0a\\x38\\x83\\xe7\\x07\\x80\\x47\\xdf\\x25\\x2f\\x38\\xb6\\x7c\\xd2\\x8a\\x6a\\xc4\\x5c\\x7d\\x7a\\x1d\\x2a\\x1d\\xe8\\xd4\\x57\\x47\\xcf\\x09\\x30\\x1e\\x01\\xcd\\xaf\\xd0\\xcd\\x99\\xa6\\xe9\\x1b\\x70\\x4d\\x50\\x9f\\xce\\x69\\x2f\\xbd\\xef\\x2f\\x71\\xa5\\xce\\x0b\\x35\\xbc\\x15\\xc6\\x5f\\x87\\x68\\x24\"},\n{{0xf2,0x73,0x5d,0x50,0xee,0x3a,0x9a,0x65,0xb5,0x8c,0x8a,0xcf,0x55,0x16,0x63,0xe9,0x88,0x09,0xec,0x40,0x6f,0x73,0xe3,0xe7,0xf4,0xe7,0x3b,0xc4,0xea,0x92,0x38,0x74,},{0xdf,0x48,0xa5,0xb9,0x4a,0x07,0xaf,0x3c,0x2c,0x99,0xb8,0x38,0x87,0x62,0x24,0x32,0x33,0xc8,0x50,0xdc,0x17,0x53,0x17,0xd6,0x02,0x63,0x8e,0x5b,0x86,0xab,0x49,0xed,},{0x69,0x42,0xa7,0x69,0x64,0x17,0xef,0xaa,0x59,0x1b,0x95,0xe1,0x1f,0x02,0xd7,0x63,0xbe,0xf5,0x27,0x9b,0x93,0x2a,0x8e,0x2a,0x7c,0xbb,0x9f,0x58,0x36,0x95,0xc1,0x4c,0xe5,0xcc,0x55,0x6b,0xec,0x66,0x79,0x9b,0x33,0xcb,0x59,0x2d,0xa4,0xdf,0x27,0x35,0xf9,0xee,0xf2,0xc3,0xce,0xca,0x43,0x62,0x16,0x4b,0x6c,0xc9,0x3d,0xa4,0xe1,0x05,},\"\\xae\\x31\\xe9\\x4e\\x71\\x97\\xe4\\xe4\\xd0\\x23\\x93\\x48\\x02\\x5e\\xd6\\x68\\x1e\\x51\\x3c\\xe1\\xa6\\xe0\\xaa\\x0e\\x5b\\x97\\x93\\x73\\x91\\x21\\x50\\xef\\x11\\x3e\\x50\\xef\\x05\\x69\\xc4\\x83\\xf7\\x56\\x8c\\x4b\\xbc\\x47\\x03\\xc5\\xda\\xca\\xa8\\x0a\\x0d\\xe4\\xe7\\x38\\x38\\x3f\\xa1\\xf1\\x0d\\x6d\\x40\\x71\\xa3\\x1b\\x99\\xe6\\x48\\x51\\x43\\x97\\x23\\x16\\xc8\\x65\\x22\\xe3\\x7c\\x68\\x87\\xa1\\xc3\\x07\\xb2\\x9b\\x0d\\xd6\\xf9\\xf1\\xb4\\x38\\x31\\x0a\\xf9\\xd8\\xd7\\x34\\x6f\\xb4\\x1f\\x9b\\x2d\\xd2\\xe8\\x0b\\x14\\xc4\\x5e\\xb8\\x7d\\x4e\\xd4\\x8e\\x37\\xa5\\x26\\x0b\\x52\\x25\\x7b\\x3e\\x99\\x78\\x7a\\x13\\xc5\\x53\\x92\\xba\\x93\\x0c\\x08\\xe0\\x24\\x0e\\x96\\x0d\\xef\\x0c\\x29\\xb8\\x55\\x07\\x45\\xcf\\x14\\x9d\\xee\\x53\\xa5\\xd1\\x74\\xec\\x06\\x5d\\x2d\\x66\\x77\\xde\\xe1\\xfc\\x42\\x05\\x70\\x62\\xc3\\x4e\\x27\\xea\\x5d\\xbc\\xdb\\x86\\x1b\\x9f\\x67\\x0c\\x60\\x32\\xc7\\x84\\x6c\\xec\\x8e\\x87\\xa7\\xc9\\x52\\x0e\\x27\\x96\\x7b\\x01\\x86\\xee\\x71\\xb7\\x7e\\xd6\\xd0\\x29\\xbb\\xdd\\x70\\x94\\x9c\\xec\\x4a\\x70\\x93\\x29\\xfa\\x37\\xfe\\xe0\\x02\\x49\\x0c\\xc1\\xbc\\x4c\\x2d\\xf6\\xf7\\x63\\xf9\\x85\\x8f\\x33\\xd7\\x50\\xc5\\xb5\\x05\\xa6\\x7e\\x23\\x70\\x63\\xc0\\x48\\x6f\\x94\\x56\\xd3\\xc6\\x20\\xd9\\xac\\x7c\\x98\\xf1\\x38\\x1d\\xe0\\xef\\xfe\\x41\\xc1\\x82\\x59\\x50\\x4a\\x15\\x0d\\x68\\xa6\\xa2\\x8b\\x0a\\x3e\\xea\\x80\\x3b\\x85\\x53\\x15\\xc9\\xe0\"},\n{{0xca,0xd9,0xd2,0x1a,0x01,0xc7,0xe1,0xd1,0x5d,0xf2,0xfb,0xd7,0x9c,0x51,0x6e,0xb8,0xc3,0x40,0x1e,0x9f,0xe2,0x84,0x67,0xcc,0x7b,0x21,0x67,0x9d,0x4e,0x33,0x1a,0x3d,},{0xa7,0xb5,0x5c,0x15,0xd6,0x79,0x0b,0x40,0x53,0x6f,0xca,0xe5,0xad,0x28,0x92,0xcd,0x66,0xb1,0x86,0x89,0xf4,0x99,0xc1,0xfd,0xee,0xa6,0x6d,0x4a,0x7d,0xf3,0x94,0x24,},{0x31,0x92,0x7d,0x01,0xdb,0x9f,0x24,0x72,0xf4,0xdf,0x6f,0x63,0xc1,0x8e,0xbd,0x83,0xc2,0xb1,0xaa,0xf8,0x8d,0x58,0x0e,0x84,0x88,0x54,0xdf,0x8c,0xba,0x63,0x95,0xd3,0xda,0x7b,0xd6,0xbb,0x9e,0xdc,0x1f,0xce,0x1c,0x7d,0x7e,0x13,0x60,0x55,0x8f,0xcd,0xdf,0xa9,0x39,0x15,0xbe,0x07,0x6e,0xfb,0x8e,0xa2,0xdc,0x5e,0xa7,0xb2,0x0d,0x0a,},\"\\x70\\x70\\x2b\\xf1\\x9c\\x91\\x9f\\x98\\x36\\xde\\xfd\\x7b\\x84\\x6f\\xd9\\x99\\x2d\\x8b\\x7e\\xb2\\xe1\\x06\\xae\\xb7\\x1e\\x60\\xa3\\x1b\\x4e\\xa2\\x5a\\x41\\xb2\\x12\\xdc\\x7d\\xe7\\xc9\\x1c\\xbd\\x61\\x3d\\x58\\xd0\\x59\\x5d\\xb8\\x33\\xcf\\xe7\\xe5\\x05\\x84\\xf2\\x55\\x69\\x60\\x2c\\x77\\x44\\xfa\\x67\\x5d\\x15\\x6d\\x0f\\x63\\xcd\\x2b\\x7c\\x08\\x9c\\x8a\\x00\\x68\\x6a\\x43\\x71\\x69\\x82\\x6a\\x12\\xdc\\x48\\x5b\\x38\\xc0\\x68\\xa8\\x00\\x71\\x42\\xe5\\x16\\x37\\x47\\x01\\x1a\\x07\\xa4\\x15\\x68\\x36\\x22\\xab\\x1e\\x23\\xce\\x57\\x7c\\x73\\x2b\\xa1\\x4f\\x40\\x1f\\xbc\\x30\\x43\\xe0\\x69\\x3a\\x92\\x05\\xc1\\x9a\\x92\\x29\\x8a\\x3d\\x9b\\x08\\xfb\\x7a\\xfa\\xfa\\xe0\\xa9\\xf0\\x16\\xbc\\x75\\x0e\\xe6\\x31\\xa5\\xf5\\xda\\x5d\\xb6\\xf9\\xba\\x26\\x92\\xc7\\x4c\\xaa\\xae\\xb4\\xd0\\x97\\xe9\\x0e\\x3c\\x02\\xd2\\xe3\\xa7\\xfb\\x3a\\xa0\\x00\\x04\\x0b\\x7c\\x17\\xb7\\x45\\x64\\xe6\\x46\\xbe\\xa1\\x6b\\xad\\x61\\x1e\\xbc\\x08\\x59\\xa3\\x82\\x88\\x04\\xab\\x4f\\x5c\\xfb\\xa4\\x17\\xd2\\x54\\x51\\x5c\\xa3\\x62\\x0a\\x3a\\xd6\\x83\\xc4\\x6c\\xa6\\x26\\x7b\\xb4\\x95\\x39\\xbb\\x30\\xe3\\x69\\x08\\x7e\\x67\\x43\\x8e\\x94\\x89\\x56\\x27\\x50\\xdc\\xcb\\xa3\\xaa\\x0b\\x1b\\x0a\\x6c\\x26\\x70\\x32\\xd2\\x0c\\x2a\\xdb\\x75\\xe6\\x8d\\xf1\\x12\\x3b\\x52\\x59\\xbf\\xe4\\xea\\xc6\\xca\\xdc\\xa6\\x77\\x81\\x38\\xa3\\x73\\x18\\xad\\xb3\\x0e\\x8d\\x66\\x9f\\x3b\\xc9\\x69\\x2c\\xc7\\x4b\\x68\"},\n{{0xd9,0xbe,0x84,0x22,0x55,0xe9,0xa1,0x6b,0x0a,0x51,0xa8,0x67,0x42,0x18,0xce,0xe7,0xcd,0x9a,0x8b,0xdf,0x34,0x35,0x08,0x39,0x7f,0x4d,0xdb,0x05,0xf3,0xfa,0x00,0x82,},{0x79,0x31,0xbc,0x6d,0xfa,0x33,0x24,0x94,0x3a,0xab,0x18,0x3d,0x12,0x85,0x51,0x59,0x19,0x39,0x9f,0xfe,0x0b,0x71,0x06,0x77,0xf0,0x91,0x5d,0x3a,0x5b,0xe5,0x1e,0x92,},{0xc9,0x38,0x45,0x65,0x8c,0x95,0x60,0xd2,0xc0,0xe2,0x8f,0x28,0x2a,0xdb,0xd4,0x65,0x2b,0xaf,0xd3,0xbb,0x2e,0xde,0xc1,0x7c,0x94,0x87,0x8f,0x7b,0x94,0xd3,0xc7,0x7a,0xfe,0xc9,0x06,0xed,0x29,0x2a,0x8d,0xfb,0xf5,0xf8,0xe7,0xc1,0x18,0xe8,0xf2,0xca,0x33,0xdd,0xa7,0x90,0x9d,0x9b,0x69,0x5b,0x8f,0xf5,0xa1,0xc0,0xe9,0x7a,0xc8,0x07,},\"\\xac\\x6c\\x55\\xb1\\x34\\x66\\x3e\\x41\\xf0\\x2a\\x6d\\xcb\\x85\\x49\\xea\\xa1\\xc0\\x13\\xf5\\x96\\x58\\xd8\\x1d\\x81\\x2f\\x95\\xb7\\x40\\x09\\x51\\x37\\x23\\x67\\x19\\x45\\xe1\\x32\\x4f\\x90\\xf8\\xa3\\xf9\\x71\\x36\\x91\\x81\\xb5\\x87\\xba\\xb4\\x56\\x65\\xf7\\x88\\xd6\\x63\\xab\\x78\\x14\\x0c\\x5a\\x22\\xc1\\xc1\\x8d\\x4a\\xfe\\xdc\\x74\\x48\\xa7\\x48\\xaf\\xe5\\xbf\\x23\\x87\\x00\\x3c\\x1d\\x65\\xab\\x18\\x48\\x2e\\xf9\\x89\\x22\\xb4\\x70\\xda\\x80\\xad\\x14\\xc9\\x44\\x95\\x1c\\xe4\\xae\\xd3\\x73\\x90\\xcc\\xe7\\x9a\\x8e\\x01\\xb2\\x4c\\x7d\\xfc\\x11\\x41\\xc0\\xec\\xa2\\xc7\\xf7\\x73\\xed\\x4b\\x11\\x80\\x6a\\x34\\x61\\x55\\x13\\x48\\x6e\\x4e\\xe1\\x1a\\xf0\\x80\\x78\\xa1\\xb4\\x05\\x4c\\xf9\\x88\\x02\\x98\\x60\\x8d\\xd9\\xb3\\xfa\\xa1\\xa2\\x42\\xa4\\x52\\xfe\\x51\\x16\\x04\\xb3\\x10\\x2c\\x31\\x3d\\x14\\xcc\\x27\\xc6\\xf0\\xf8\\x47\\x1d\\x94\\x55\\x53\\x17\\xea\\xa2\\x64\\xcd\\xf5\\x2c\\x69\\xe1\\x8f\\x46\\x1e\\x47\\x90\\x3d\\x21\\x29\\x87\\x16\\xb1\\x72\\xee\\x9c\\xb1\\x78\\xf0\\x8f\\xf2\\xd3\\xc9\\xc1\\x62\\x12\\x1c\\x2e\\xd2\\x1d\\x87\\x34\\xb2\\xf0\\x63\\x0d\\x39\\x91\\x46\\xcb\\xf7\\x6e\\x02\\x8a\\x14\\x3f\\x2b\\xf7\\xbb\\x50\\xaf\\x0f\\x57\\xb9\\xba\\x80\\x21\\xd2\\x64\\xb0\\x0c\\x66\\x62\\xf8\\x4c\\x86\\xcb\\x6d\\x59\\x52\\xb3\\xd2\\x41\\xf7\\xdc\\x3e\\x70\\x0c\\x96\\x61\\x6c\\xbc\\xfb\\x0d\\x0e\\x75\\x3f\\xfd\\x5d\\x21\\xee\\x32\\x0e\\x65\\xe9\\x7e\\x25\\xcb\\x86\\x09\"},\n{{0xcf,0xc4,0x8c,0xc6,0xf6,0x58,0x11,0xfe,0x7d,0x7b,0xba,0x85,0xd1,0xcd,0x84,0x85,0x8f,0xd6,0xf7,0xed,0xd6,0x38,0xf4,0xf5,0x52,0x36,0x3e,0xe7,0x68,0x5f,0x69,0xca,},{0xd2,0x9c,0x10,0x69,0x4c,0x5e,0x8e,0x3f,0x34,0x47,0xed,0x78,0xd3,0x4d,0xbd,0x74,0xa2,0xb3,0x01,0x37,0x3b,0xa8,0x71,0xb5,0x85,0x0c,0x33,0x3d,0xff,0x7b,0xf8,0xd0,},{0x80,0xc5,0xd5,0x1e,0x96,0xd1,0xca,0xc8,0xef,0xd3,0x45,0x98,0x25,0xe7,0x9c,0x1e,0x9f,0x65,0xaf,0x70,0x1d,0x1d,0x29,0xe1,0xf9,0x5b,0x03,0x67,0x07,0x11,0x3b,0x77,0x98,0x4b,0x7b,0x33,0x50,0xf0,0x40,0x77,0x33,0x3c,0x95,0x7f,0x8f,0xbc,0x7d,0x9b,0x04,0x0c,0x36,0x26,0x51,0x41,0x7b,0x98,0x99,0x02,0x7c,0xd3,0x3e,0xdb,0x11,0x03,},\"\\x8e\\x7d\\xef\\xb9\\xd1\\x6d\\x03\\x6b\\xd6\\x42\\xcf\\x22\\x6e\\x32\\x77\\x3e\\x60\\x53\\x61\\xc5\\xec\\x4b\\x95\\x12\\x55\\x78\\x8d\\xb0\\xa0\\x42\\xc6\\x3e\\x5a\\x43\\x67\\xd6\\x15\\x24\\xf1\\x0e\\x62\\x58\\x99\\x13\\x25\\xa3\\x9a\\xb6\\xb0\\x36\\x12\\x26\\x0c\\x3f\\xe3\\xdf\\x20\\xb3\\x42\\x02\\xd3\\x43\\x95\\xbd\\x4e\\xd4\\x0b\\xd6\\x13\\x73\\xdf\\x78\\x1a\\x4c\\x8b\\xcf\\xbd\\x15\\x30\\x10\\x60\\xf0\\x74\\x37\\x73\\x23\\x33\\xd8\\xe4\\x97\\x36\\x32\\x2d\\xee\\x6b\\x22\\x43\\x8e\\x78\\x7d\\x88\\x56\\xb7\\x0c\\x26\\xec\\x57\\xd6\\xda\\xde\\x9c\\x3c\\x28\\xe2\\x72\\x20\\xc5\\x67\\x0e\\x39\\x35\\x44\\xed\\x09\\x59\\x37\\x29\\x8d\\xc3\\xad\\xc7\\x38\\x65\\xf7\\x77\\xe9\\x00\\x37\\xbd\\xef\\x83\\x47\\x16\\x47\\x6d\\x78\\xf4\\xe6\\xcb\\x49\\x61\\xa4\\xc6\\x8a\\x8a\\x83\\x63\\x38\\xa9\\xf5\\xda\\x17\\x9c\\x4d\\x5e\\x93\\xc3\\xf7\\x0d\\xd3\\x5e\\xec\\x70\\x96\\x53\\xdd\\x8d\\xe3\\x79\\x96\\xb1\\x20\\x56\\xd4\\xee\\xfc\\xb4\\xb6\\xb3\\xc1\\x3b\\xa9\\x84\\xd8\\x32\\x27\\x5c\\x43\\x86\\xeb\\xf4\\xa8\\xff\\x7f\\x07\\x8b\\xe3\\xd4\\x28\\xc1\\xe0\\xd9\\xb1\\x62\\x38\\x1f\\x06\\xa5\\xb7\\xbb\\x12\\x70\\x40\\x03\\xd9\\x1f\\x25\\xd1\\xd8\\xfd\\x43\\x62\\x6c\\xe7\\x0f\\xff\\x59\\xd2\\x92\\x77\\x68\\xa7\\x6b\\xf7\\xf9\\xef\\x76\\xff\\x95\\x48\\x9f\\x38\\xed\\xcd\\x1c\\x9e\\x9b\\x8a\\x8b\\x0e\\xf6\\x6c\\x32\\x80\\x57\\x76\\xd5\\xae\\x9f\\xbd\\x84\\xa7\\xaf\\x4f\\xa6\\x56\\x3e\\xc7\\x0a\\xc5\\x73\\x3a\\x44\"},\n{{0x15,0xc9,0xf7,0xc4,0xd8,0x4a,0x5a,0x47,0x90,0x41,0x95,0x2e,0x6a,0x8c,0xac,0x24,0xe7,0x6f,0xd2,0xd2,0x75,0xc1,0x97,0xe6,0xb5,0x21,0x92,0x9b,0x43,0xba,0x6c,0x5d,},{0x86,0x33,0xc1,0x82,0x9d,0x29,0x09,0x1d,0xf7,0x1f,0xd5,0xc0,0xef,0x64,0x05,0x72,0xe4,0xb6,0x49,0x74,0xcd,0x09,0x7d,0xbe,0xbb,0xcd,0xde,0xba,0x04,0x16,0x47,0xc0,},{0x1e,0x36,0xbe,0xa5,0xa5,0x83,0x76,0x7e,0xbd,0x80,0x30,0x6c,0xab,0x23,0x31,0x55,0xb7,0xb4,0x28,0x14,0xb4,0x34,0x73,0xcf,0x45,0xcd,0xc5,0x03,0x9c,0x93,0x97,0x44,0xa9,0x69,0x4b,0x87,0x22,0x0d,0xaf,0x4c,0xcd,0x29,0xf2,0x5c,0xea,0x40,0x5e,0x7c,0x08,0xdb,0x2e,0xf1,0x7f,0x3f,0x03,0x4d,0xbb,0x49,0xcf,0xf6,0x02,0x83,0xe3,0x06,},\"\\x11\\x73\\x0d\\xd4\\x5d\\xda\\x80\\xd8\\x4d\\x08\\x0d\\x92\\xe9\\xbd\\xda\\xee\\xa6\\x87\\x8e\\x4a\\x0b\\x3b\\x51\\x2d\\x9e\\xa7\\x33\\x80\\x8e\\x1c\\xef\\x51\\xd4\\x90\\x48\\xd6\\xc7\\x81\\x16\\xa4\\xbd\\xe3\\xc6\\x4a\\xce\\xaa\\x52\\xbe\\xca\\x86\\xb3\\x31\\xab\\x59\\xe9\\x18\\x5c\\x70\\x28\\x6a\\x02\\xbb\\x5d\\xd0\\x4f\\x5c\\x7f\\x4e\\x9c\\x7e\\x44\\x5e\\x77\\x45\\x85\\x65\\xf1\\x59\\xc7\\x83\\xdf\\xd4\\xd9\\x76\\xa9\\x10\\xe9\\x37\\x78\\x9d\\x21\\x41\\xd4\\x16\\xed\\x3a\\x7f\\x60\\x8d\\x26\\x73\\x7a\\x86\\xb2\\x0b\\x62\\x4e\\x3c\\x36\\xaf\\x18\\xd2\\x5c\\x7d\\x59\\xb8\\xd7\\x42\\x7e\\xc6\\xc4\\xd3\\xd4\\x38\\xd7\\xae\\x09\\x49\\xdd\\x7d\\x74\\x8c\\x1f\\xfd\\x6f\\x28\\xe8\\x28\\x5d\\x44\\x04\\x22\\xd2\\x2a\\x37\\x61\\x20\\x2e\\x95\\x84\\xf5\\xcd\\xb3\\x50\\x45\\x47\\xaa\\x4b\\x68\\x57\\x30\\xc9\\x82\\xcb\\xa2\\x13\\xde\\x08\\x02\\x0a\\x5e\\x4e\\x46\\xa9\\x5f\\xac\\x4b\\x48\\x1b\\xea\\x0b\\x63\\x0a\\xbd\\x03\\x0d\\xdd\\x33\\x5a\\x20\\xfe\\x2c\\xf7\\x09\\x4a\\xef\\x48\\x13\\x95\\x69\\x91\\x91\\x3c\\x68\\x21\\xf4\\xb5\\x41\\x0d\\xf4\\xf1\\x33\\xfe\\x63\\xe2\\x2c\\x08\\x09\\x2a\\x0a\\x65\\x97\\x27\\x22\\xa2\\x7a\\xe4\\x20\\x11\\xa8\\x07\\xc3\\x27\\xb4\\x17\\x23\\x7c\\x54\\x01\\x14\\xee\\xcb\\x9f\\x0e\\x96\\xcd\\xa5\\xdc\\xf0\\x24\\x6f\\x1d\\x27\\x17\\xf4\\x9b\\x9c\\xea\\x9d\\xc6\\xa3\\xda\\x9b\\x39\\x6f\\x02\\x70\\x52\\x92\\x26\\xf5\\xdc\\xba\\x64\\x99\\x91\\x8a\\x6c\\x28\\x9f\\xe0\\x55\\xfe\\xc8\"},\n{{0x6d,0x2d,0x0d,0x82,0x3f,0x29,0x47,0x46,0xb9,0xa5,0x51,0x2e,0x14,0xe7,0x3c,0x1d,0x85,0x5b,0x5e,0x4b,0xca,0x65,0xfe,0x81,0x77,0x29,0x81,0x0c,0xc5,0xef,0x84,0x0d,},{0x1b,0x64,0x80,0xa6,0xa9,0x0d,0xfb,0x47,0x29,0x84,0x85,0x5c,0xef,0x6f,0x1a,0xb3,0x1e,0xb7,0xb3,0xf1,0x3c,0x8a,0xc0,0x0f,0xa5,0x56,0xd2,0x0b,0x53,0xe5,0xae,0x17,},{0xb5,0x15,0xf4,0x9e,0xb3,0x2a,0xd4,0x78,0x69,0x2d,0xf8,0x8f,0x07,0xb7,0x80,0x2c,0x6e,0x0e,0x53,0x27,0xaa,0x08,0xa6,0x36,0x6e,0x4c,0xb1,0xd1,0xe2,0x6f,0x9e,0x65,0xfc,0x81,0xab,0xeb,0xe2,0x21,0x5d,0x64,0x91,0x00,0xf2,0x75,0x98,0x27,0x3a,0x41,0x2b,0x62,0x4e,0x84,0x2d,0x81,0x30,0x40,0x37,0x97,0xe5,0x7d,0xec,0x97,0x5a,0x0a,},\"\\x87\\x72\\x72\\x1f\\x72\\xea\\xf7\\xf7\\x30\\x40\\xc0\\x68\\xa7\\xc3\\x75\\x3b\\xff\\xca\\x7d\\xc2\\xd0\\x93\\x0c\\x65\\x25\\xf4\\x25\\xe6\\x00\\x5c\\x25\\xcd\\x4c\\x0f\\xf5\\x09\\x5c\\x9c\\x61\\xa5\\xd8\\xa1\\x96\\x7b\\x8c\\x86\\x01\\x0c\\x88\\x4e\\x50\\x9e\\x6b\\x16\\x70\\xf7\\x90\\x46\\xe2\\x29\\x79\\xeb\\xd3\\x54\\x73\\x40\\x90\\xd3\\xad\\xa2\\x14\\x35\\xc1\\xf8\\x25\\x4f\\x7b\\x52\\x22\\xcd\\x55\\x64\\xf0\\x64\\xe9\\x77\\x64\\x03\\x66\\x44\\x9f\\x4e\\x50\\x08\\xf8\\x70\\xf9\\xc4\\x84\\x05\\x65\\xbf\\x4f\\xb5\\xf5\\x74\\xc9\\x77\\x4b\\xa2\\x56\\x8e\\x71\\xa9\\xcc\\xd8\\x2f\\xfc\\x59\\xb6\\x94\\xf2\\x6e\\x7d\\xe4\\xce\\x2e\\x3f\\xd8\\x80\\xa0\\xee\\xf3\\x87\\x93\\x13\\x33\\xed\\xe0\\x0d\\xcb\\x06\\x5e\\x6d\\x0f\\x79\\x59\\x1a\\x2a\\xa9\\x56\\xdf\\x19\\x48\\xa2\\x65\\xcb\\x95\\x75\\x0d\\x8a\\x23\\x3b\\x15\\xc2\\x88\\xa0\\x54\\x87\\xc5\\x15\\x66\\x3f\\x93\\xe7\\x40\\xfb\\x15\\x70\\xfb\\xe4\\xbd\\x80\\xc6\\x8e\\x8d\\x92\\x97\\x34\\x5a\\x8a\\x01\\xcd\\xbd\\x88\\xf4\\xa3\\x9b\\xed\\x9c\\x5e\\xf0\\x9f\\x14\\x4b\\xce\\x5d\\xe5\\x68\\xbf\\x37\\x33\\xbc\\x53\\xb2\\x03\\x9a\\x29\\xcb\\x3e\\x19\\x45\\x01\\xad\\xc1\\xc1\\x0e\\x86\\x38\\x3a\\xac\\x8b\\x0f\\x85\\xc6\\x7a\\x66\\x89\\xbb\\xe1\\x47\\x0a\\x39\\x24\\x76\\x31\\x34\\x39\\xca\\x88\\xd9\\x8c\\x02\\x1c\\x0e\\xae\\xc2\\x5f\\xb2\\xf9\\xa1\\x60\\xce\\x5c\\x78\\x61\\x70\\xbe\\x02\\x38\\xfb\\x87\\x85\\xdd\\x33\\xbf\\xa9\\x05\\x9a\\x6c\\x37\\x02\\xd0\\xde\\x05\"},\n{{0xc0,0xcf,0x79,0x9a,0xf7,0x39,0x5b,0xf2,0x7b,0xaf,0xa3,0x6c,0xab,0x43,0x70,0x45,0xe3,0x9c,0x90,0x3b,0xf8,0x07,0x54,0x83,0x19,0xce,0x44,0xf2,0x87,0x49,0x4f,0xbb,},{0xaf,0xbf,0x55,0x0c,0xa2,0x90,0xc9,0x05,0xbd,0xd9,0x2f,0xc8,0x83,0x1e,0xbe,0x3d,0xfe,0xb6,0xda,0xae,0x4f,0x56,0x00,0x52,0x53,0xcc,0x50,0x95,0x1e,0x50,0xed,0xc2,},{0x5b,0xba,0x01,0xa4,0xc7,0xb2,0x55,0x42,0xd0,0x69,0x12,0xde,0x70,0xaa,0x1e,0x22,0x04,0x23,0xfd,0xf8,0x33,0x8a,0x9e,0x69,0x33,0x95,0xcb,0x6f,0x0d,0xc1,0xfb,0xfd,0x01,0x8e,0x3c,0x77,0xe5,0x0a,0xef,0x90,0xa9,0x08,0x0f,0x30,0xf1,0xf5,0x79,0x2b,0x24,0x31,0x07,0x8f,0xe6,0xe3,0xe0,0x04,0x64,0x24,0x5e,0x17,0xcd,0x8d,0xc1,0x07,},\"\\xdb\\xe6\\x57\\x80\\xe9\\x68\\xde\\x9e\\x40\\xff\\xb5\\x7c\\xf5\\x9a\\x60\\xfd\\x93\\xb3\\xf9\\xa5\\xe7\\xd8\\xed\\x51\\x80\\xad\\xbc\\x57\\x8c\\xa1\\xbc\\x48\\xbd\\x9f\\xb6\\x0a\\x13\\x24\\xc9\\xc2\\xc1\\x14\\x14\\x79\\xa0\\xdc\\xf0\\xf1\\xd0\\x7e\\x84\\x93\\x65\\x26\\xdf\\x42\\x33\\x3c\\x0d\\x77\\x3e\\x3f\\xed\\x9e\\x40\\x38\\xde\\x5b\\x95\\xad\\x90\\x5c\\x92\\xcb\\xe0\\x40\\x48\\x7b\\xf5\\x5e\\x10\\xe1\\xed\\xb4\\x29\\xa0\\xec\\xc4\\xe0\\xe8\\xd0\\x0a\\x98\\x8a\\x9c\\xd5\\x3e\\x2e\\xb3\\x72\\xf4\\xfc\\x4c\\xd9\\x53\\x7b\\x26\\x9b\\xa3\\xa2\\x3c\\xef\\xbc\\x8d\\xf6\\x47\\x6e\\x75\\x43\\x4b\\x81\\xd9\\x3e\\x88\\x91\\xbf\\x41\\x7c\\x82\\xe3\\x63\\xf3\\xe4\\xab\\xf8\\x0a\\x4f\\x73\\xac\\xa8\\x4a\\xc7\\xdf\\x63\\x37\\xf5\\x36\\xd6\\x3d\\x93\\x9d\\x92\\xcb\\xa6\\x4b\\xe7\\x42\\x22\\x11\\x16\\x06\\x9e\\xf2\\x51\\xab\\xba\\x0b\\x00\\xaf\\x01\\x71\\x8b\\xb5\\x80\\xdd\\xbe\\xb7\\x99\\x73\\xef\\x10\\xa6\\x8b\\x4d\\x0f\\xa0\\x23\\xd6\\xeb\\xd3\\x07\\x9d\\x6b\\x32\\xa1\\xaa\\x20\\xa2\\x1e\\x92\\x02\\xf2\\x75\\x90\\xc3\\xf0\\xc0\\xcc\\x25\\x30\\x73\\xc3\\xf8\\x22\\xaa\\xc4\\x59\\xd3\\x9f\\x50\\x75\\x8b\\x70\\xc0\\x07\\x10\\xa3\\xc9\\x84\\x38\\x41\\x65\\x08\\x52\\x2e\\x51\\x2a\\xda\\xa0\\xaf\\xd5\\x03\\xa7\\xce\\xb0\\x4f\\xb9\\x4a\\x4a\\x93\\x2c\\xe8\\x0c\\xd5\\xa7\\xf1\\x1b\\xb8\\x61\\x26\\x3f\\x58\\xe5\\x74\\x9d\\x54\\x2a\\x11\\x0d\\xe7\\xc7\\x68\\x9d\\xfc\\xb0\\xc5\\x1a\\xfa\\x9d\\x54\\xa5\\x8f\\xf8\\x9f\\x3f\\x67\"},\n{{0xcd,0xaa,0x50,0xe8,0x52,0x7d,0xc7,0xa5,0x0f,0xb3,0x7e,0x28,0xfa,0x8b,0x95,0x68,0xc3,0x7e,0x85,0x67,0xe0,0xb4,0x99,0x99,0x7b,0x9a,0xed,0x67,0x61,0x80,0xc3,0xb0,},{0x7c,0x56,0xe1,0x64,0x51,0x02,0x68,0xc1,0x82,0xb4,0x23,0x74,0x79,0x04,0xf1,0xd3,0xa5,0x80,0x93,0x30,0xf6,0xe1,0xb2,0x92,0x66,0xec,0x46,0xe7,0x3b,0xe1,0x55,0x0f,},{0x13,0x7b,0xd1,0x0a,0x50,0xef,0x60,0x93,0x84,0xfe,0x66,0x87,0x68,0xfb,0x87,0x1d,0xe7,0x41,0xca,0x0f,0x53,0xff,0x84,0x77,0xd7,0xeb,0xfa,0x90,0xaa,0xfd,0x5e,0x26,0x81,0xfd,0xf1,0xb8,0x92,0x50,0x46,0x3c,0x15,0xdb,0x8e,0x17,0xa5,0x88,0x25,0xfe,0x94,0x27,0xde,0x08,0x9c,0x34,0xde,0x13,0xcd,0x07,0xbb,0xa1,0x8d,0x4a,0xa4,0x0d,},\"\\x94\\xfc\\xfb\\xaa\\xa3\\x03\\xde\\xce\\x7b\\x90\\x8f\\x87\\x4c\\xc5\\xf0\\x95\\x06\\x1f\\x17\\x54\\xbb\\x35\\x78\\x0d\\xb6\\x66\\xb6\\x3a\\xb8\\x29\\x08\\x11\\xbf\\x1c\\x52\\x1a\\x7f\\x8f\\x78\\x5e\\xa2\\x70\\xdf\\xb3\\x9d\\x0d\\x6e\\xd9\\x5a\\xb7\\x19\\x55\\xa1\\x1f\\xfa\\xea\\xa2\\x68\\xe0\\x81\\xff\\x3e\\x4f\\x24\\x25\\xb4\\x18\\x80\\xa9\\x87\\x15\\x1e\\x67\\x8e\\x89\\x11\\x13\\x50\\x94\\x2d\\x82\\x0c\\x3e\\xec\\x36\\x21\\x24\\x26\\x66\\x3b\\xe1\\x75\\xe5\\x28\\x6b\\x4a\\xd1\\xcc\\x80\\x4e\\x3e\\x3a\\x03\\xb9\\xfa\\x3e\\x82\\x83\\x8e\\xbb\\xc2\\x61\\x5a\\x64\\x5f\\x2c\\xa1\\x46\\x8a\\xc4\\xa1\\xcd\\xbe\\x52\\x37\\x61\\xe8\\x3f\\x43\\x81\\xb0\\xc8\\x55\\x0a\\xe5\\xe8\\xc8\\xcd\\x1f\\xda\\x57\\x19\\x14\\x36\\xe2\\x7c\\xb8\\x83\\xbc\\x64\\xbe\\x86\\xa9\\xdc\\x61\\x10\\xef\\x34\\x01\\xd8\\x8a\\x7d\\xeb\\xd1\\xb7\\x01\\xd9\\xc2\\x57\\xa6\\x82\\x6c\\xf0\\x1e\\x9e\\x29\\x22\\xe3\\xae\\x57\\x7f\\x28\\x34\\x27\\x5f\\xb0\\xec\\xda\\x80\\xed\\x8c\\xf1\\x80\\x1e\\x0b\\xc5\\xe0\\x1e\\x26\\xa7\\x7c\\x48\\xbd\\xf4\\x6a\\x5c\\x48\\x94\\xd2\\x2a\\xb5\\x3e\\x74\\x18\\x27\\xe2\\x4b\\xed\\x5f\\x07\\x50\\xff\\xad\\x05\\xe5\\x3f\\x1d\\x5e\\x61\\xdf\\xd3\\x16\\xb1\\x91\\xd9\\x79\\x7e\\xf7\\x13\\x13\\x1a\\x8b\\x43\\x0a\\xbe\\x3f\\xac\\x5f\\x3c\\x4a\\x2c\\xa0\\x21\\x87\\x8b\\x15\\xad\\xc8\\xc5\\xf5\\x42\\x11\\x42\\x60\\xe6\\x87\\xa9\\xd1\\x99\\xd2\\x30\\xc4\\xe0\\xd3\\xfc\\x69\\x69\\x93\\xb5\\x9c\\xcf\\xa3\\xff\\xa9\\xd8\\xd2\\xfb\"},\n{{0x0f,0xde,0xa9,0xbe,0xe6,0x28,0x8f,0x94,0x7e,0x0a,0xdb,0xdd,0xa4,0xdf,0xb2,0xba,0xa0,0x38,0x91,0xaf,0x25,0x02,0x4a,0x5e,0x13,0x8a,0xc7,0x79,0x84,0xd0,0x05,0x07,},{0x70,0xab,0xd8,0x64,0x30,0xd7,0xe8,0xd6,0x32,0x09,0xc8,0xb3,0x73,0xec,0x4e,0x4b,0x79,0xe9,0x89,0xe6,0x72,0x5f,0xac,0xef,0xba,0xde,0x3c,0x75,0x74,0xd2,0x3c,0xd0,},{0x80,0xc4,0x2d,0xd5,0xdf,0x03,0xb2,0x85,0xa8,0x6a,0xc9,0x5c,0xe6,0x66,0x9f,0x78,0x6a,0x97,0x8a,0x81,0x3a,0x9d,0x7b,0x8c,0x6a,0x23,0xde,0x76,0xfb,0xd0,0x9b,0xdb,0x66,0xc5,0xdd,0x1c,0xc9,0xf1,0xa1,0x76,0xcb,0xa3,0x88,0xd5,0x05,0x17,0x64,0xa3,0x2f,0xa2,0x7f,0x00,0x28,0xba,0x48,0x98,0x06,0x8b,0xd0,0x1a,0x3e,0xe1,0x72,0x08,},\"\\xcf\\x72\\xc1\\xa1\\x80\\xa2\\xbc\\x37\\xd8\\x47\\x8d\\x9a\\x7a\\x39\\xac\\xf0\\x3b\\xf2\\xa5\\x07\\x90\\xf7\\x90\\x2f\\x81\\x12\\x12\\x22\\xd3\\x1d\\x3e\\xc9\\x16\\xf4\\xf2\\x4c\\xef\\x9d\\x7c\\x41\\xdc\\x02\\x1b\\x0e\\x84\\x87\\xbb\\x89\\x2e\\x47\\x30\\x5e\\x54\\x52\\x03\\x03\\xe8\\x9b\\x30\\xb2\\x63\\xda\\xc4\\xa9\\xba\\x37\\x5d\\x46\\xc4\\x0f\\xcf\\x40\\x05\\x35\\xc9\\x59\\xd2\\xb7\\x46\\xa7\\xfc\\x97\\x0c\\xf6\\x5b\\x47\\x2e\\x84\\xb5\\xf1\\xd0\\xeb\\xad\\xcf\\xa1\\xae\\xd6\\xfc\\x47\\xfa\\xcc\\xe1\\x6a\\x36\\x6a\\x3b\\x1d\\x6e\\x51\\x68\\x13\\xc1\\x96\\x09\\x75\\xf8\\xf2\\xb4\\x30\\x42\\xfb\\x4e\\xea\\xab\\xe6\\x3c\\x6f\\x65\\xdb\\x45\\xdd\\xb7\\xdb\\x88\\x8a\\x19\\xa9\\xd7\\xba\\x6c\\xa4\\x79\\xfc\\xd7\\x0c\\x5d\\x1e\\x97\\x0f\\x12\\xc1\\x4f\\x4d\\x24\\xfb\\x7e\\x2f\\x35\\x7b\\xd3\\xa9\\x4a\\xa1\\xb8\\x68\\xcc\\xc0\\x84\\x7f\\x2e\\xef\\x21\\x85\\x3e\\x25\\x3b\\xaf\\xbf\\x07\\xc4\\xe6\\x17\\x6a\\x1e\\xf0\\x77\\x16\\x78\\x41\\xeb\\xbe\\x56\\x29\\x33\\x71\\x57\\xf3\\x9f\\x75\\xc7\\x1d\\x21\\xe7\\xe9\\x6c\\x51\\xa1\\xb1\\x6f\\xa8\\xdc\\x60\\xf0\\xb1\\x27\\x9f\\xcd\\xa2\\x64\\x1f\\xc8\\x59\\x1e\\x3c\\x49\\x2f\\x15\\xbf\\x83\\xca\\xf1\\xd9\\x5b\\x2c\\xd9\\x13\\x32\\xf1\\xb4\\x20\\x2f\\xe7\\x28\\x62\\xca\\x2e\\xa2\\xef\\x92\\xc1\\x1d\\xb8\\x31\\xd8\\x2f\\x8f\\xc3\\xd4\\x1f\\xe2\\x9a\\x76\\xc2\\x11\\xa7\\x58\\xe2\\xf7\\x1b\\xd8\\x9d\\x2c\\x66\\x10\\xf2\\x01\\x42\\x9f\\x34\\x8d\\x56\\xe1\\x0e\\x3b\\x7a\\xf5\\x3e\\x27\"},\n{{0x03,0xd5,0xe4,0x66,0xf8,0x29,0x8a,0xb5,0x43,0x8a,0x30,0x97,0x6d,0x13,0x22,0xa7,0x21,0x5a,0x64,0x2d,0xd5,0xfb,0x4c,0x3f,0x85,0x19,0x40,0x9a,0x75,0x22,0xf0,0x92,},{0x4b,0x3e,0xd4,0xdb,0x08,0x0e,0x2a,0x45,0x2e,0x16,0x91,0x2c,0x14,0x50,0x44,0x24,0x92,0x0a,0x60,0x97,0x56,0x04,0xe4,0xf3,0x79,0x25,0x8d,0x1c,0x8b,0x19,0x3d,0x6f,},{0x6d,0x7e,0x46,0x58,0xf2,0x6f,0x33,0x7c,0x98,0xe0,0x3f,0x13,0x54,0x2e,0x2f,0x39,0x44,0x0f,0xf7,0xbf,0x8d,0x88,0xf3,0xf6,0xdf,0xa4,0xd6,0x49,0x48,0xcd,0x96,0xb7,0x90,0x51,0x49,0x2f,0xc2,0x8f,0x65,0xf2,0xcc,0x0d,0x23,0xa0,0xc4,0xd5,0xe2,0x30,0x7b,0xb1,0xc4,0x7e,0x11,0xe5,0x3b,0x37,0x1f,0x09,0x1b,0x69,0xf8,0x0d,0xbd,0x05,},\"\\x1b\\x47\\xb7\\x00\\x13\\xcb\\x53\\xe1\\xf8\\xf4\\x97\\x1e\\x0f\\x39\\x56\\x3c\\xe8\\x7e\\xdb\\xc2\\xce\\xdd\\x99\\xe5\\xa3\\x55\\x85\\xdf\\x8b\\x00\\xa8\\x52\\xf7\\xb9\\xc9\\x7c\\x7e\\x4a\\x54\\x65\\xfc\\x56\\x05\\xae\\x8c\\x5c\\x36\\x57\\x0a\\x99\\x20\\x1a\\x7a\\xd6\\x03\\x12\\x87\\xef\\x0c\\x7b\\x2b\\xa6\\xe5\\x7b\\x05\\x6d\\x0f\\xc8\\xd6\\xca\\x43\\xbf\\x6c\\xbd\\xab\\x09\\x89\\x34\\xb4\\x03\\x19\\x7b\\x52\\x5d\\x22\\xd4\\x5e\\x6b\\x29\\xc7\\x8f\\x8d\\x61\\x83\\xe4\\x1f\\xfe\\x19\\x7d\\xae\\x25\\xba\\x22\\xb0\\x66\\x69\\xae\\x05\\xba\\xdd\\x7e\\x1d\\xa6\\x93\\x2a\\x7d\\x05\\x4c\\xba\\xb3\\xf5\\x4e\\x51\\x46\\x22\\x3a\\xd8\\x67\\x12\\x31\\xbc\\x16\\xfe\\x62\\x67\\x9b\\xd2\\x81\\x7a\\x6b\\x80\\xe6\\x53\\x99\\x8c\\x49\\x49\\xf8\\x1f\\xf5\\x3b\\x61\\x73\\x16\\x3e\\x11\\xda\\x3e\\x6d\\x3c\\x76\\xd8\\x4c\\x71\\x32\\x25\\xb4\\x17\\x3d\\x6b\\xf0\\x6a\\x85\\xb6\\x98\\x8a\\x48\\xbe\\x43\\x59\\xcb\\x51\\x55\\x03\\xca\\x56\\x3f\\x43\\x53\\xf8\\xe7\\xd4\\x5e\\x4d\\x94\\x46\\x2c\\x89\\xa0\\x4a\\x00\\xf1\\xb3\\xb0\\xca\\x64\\x22\\xd5\\xdb\\x02\\x9c\\x50\\x7d\\x46\\x48\\x34\\xa2\\x0c\\x78\\xa7\\x13\\x66\\x1d\\x84\\xed\\xff\\xc4\\x96\\xd6\\x92\\x82\\x61\\x98\\x94\\x43\\x7b\\x44\\x87\\x95\\x4c\\xbe\\xa2\\xaa\\x72\\x61\\xe6\\xa6\\x2b\\x68\\x51\\x15\\x4a\\x5d\\x25\\xfb\\x6b\\x4f\\x09\\xc5\\x94\\x73\\xd3\\x85\\xce\\x03\\xe9\\x1b\\xa8\\x65\\xea\\xb6\\x6c\\x58\\xc0\\xab\\xb0\\xb7\\xa7\\x8e\\x4b\\xe9\\x27\\xe5\\x54\\x60\\xcc\\xd7\\x0d\\x82\"},\n{{0x76,0xcc,0x18,0xa1,0xda,0xff,0xfa,0x10,0x05,0x86,0xc0,0x6a,0x7b,0x40,0xf7,0x9c,0x35,0xfe,0x55,0x8c,0x33,0x9c,0x29,0x99,0xa5,0xf4,0x38,0x75,0xcf,0xad,0xe0,0x3e,},{0x4b,0x9d,0xa8,0xd2,0xf1,0x37,0xdc,0x6c,0x85,0x7a,0x99,0xa5,0x99,0x8d,0xd8,0x9d,0xd5,0xf0,0x59,0x71,0xa2,0x1e,0x8c,0x77,0x66,0x70,0xeb,0x47,0xbc,0x12,0x70,0xa5,},{0xdb,0x74,0x75,0x1c,0x66,0xe6,0xb1,0x86,0x60,0x44,0xdd,0x9a,0xe9,0x9f,0x19,0xe6,0x33,0x4f,0x17,0x9e,0x79,0xd8,0xb8,0xe0,0xc8,0xcd,0x71,0xd2,0x2c,0xef,0xb9,0xea,0xb7,0xe3,0xe7,0xa9,0xc2,0xda,0x22,0x5f,0x2a,0x9d,0x93,0xa3,0x13,0xd1,0xcb,0xf1,0xb7,0xfe,0x25,0x97,0xb8,0xd7,0x02,0xbf,0x30,0x17,0xa6,0xa6,0xbc,0x7b,0x7b,0x06,},\"\\x45\\x22\\xb1\\xd8\\x23\\x73\\xf7\\xa3\\x18\\x22\\x1e\\x7e\\x57\\x61\\x75\\x03\\xdd\\xf4\\x4f\\xd5\\x39\\x97\\x52\\x2a\\x1d\\x96\\x3c\\x85\\xb7\\x08\\xd0\\xb2\\x45\\xde\\x37\\x2a\\xd5\\x2e\\xc7\\xf5\\x4f\\x62\\x13\\xd2\\x71\\xf7\\xc9\\x1d\\x5a\\x1d\\x36\\xd1\\x34\\xdb\\x38\\x9d\\xf0\\xb0\\x81\\xa0\\x6b\\xc0\\xc7\\xa4\\x87\\x5f\\x72\\x40\\x92\\x79\\x31\\x72\\xc9\\x11\\x56\\x41\\xc6\\xd0\\x54\\xf1\\xd9\\x92\\xe0\\xfa\\xe4\\xdf\\x58\\x69\\x5f\\x0e\\xa3\\x44\\x9d\\x7a\\x4b\\x3a\\x88\\x57\\xe1\\x98\\x03\\xfe\\x49\\xb6\\xd5\\x2c\\x9f\\xf3\\x74\\x6a\\x57\\x4a\\x27\\x56\\x95\\x65\\x79\\xf9\\xfb\\x80\\x9a\\x0e\\xde\\xc9\\x2c\\x55\\xe9\\x5f\\xfe\\xfa\\x3d\\x05\\xf1\\x65\\x82\\x2f\\x46\\x4a\\x21\\x99\\x9f\\x29\\x69\\x1f\\x67\\x44\\xac\\x5a\\x3e\\xe4\\x90\\x17\\x88\\x06\\x45\\xe8\\x37\\xed\\xeb\\xfd\\x2e\\x0f\\x24\\x99\\x7f\\x04\\x11\\x45\\xa7\\x2e\\x23\\x76\\xad\\xa2\\x83\\x18\\x6c\\xa2\\xb8\\x36\\x36\\x29\\x77\\x19\\x5b\\xae\\xe3\\x0a\\x3a\\xcc\\x81\\xb2\\x43\\xf3\\xee\\x37\\x6a\\x2c\\x47\\x64\\xc7\\x83\\x66\\x7a\\x4b\\x11\\x77\\xe7\\x95\\x1d\\x3e\\x3c\\x7b\\xe4\\xf1\\xbd\\x7a\\xe8\\xc6\\x0f\\xd5\\xfb\\x0f\\xd9\\x1f\\x0c\\x1c\\x14\\xd0\\xd2\\x32\\x7e\\x8f\\x20\\xd9\\x2c\\x0d\\xfc\\xc5\\x38\\x70\\xe9\\xd9\\x9f\\xdb\\xf9\\xdd\\x9a\\x17\\xe8\\x82\\x50\\x9a\\xe7\\xba\\xa8\\x65\\x3e\\x39\\xed\\xc8\\xee\\x56\\x90\\x00\\xd6\\x24\\xcb\\x93\\xa0\\x75\\x4a\\x79\\x8d\\x1f\\x81\\x1f\\x6a\\x0e\\xf5\\x50\\x1a\\x17\\xbc\\xf2\\x5f\\xd0\\xf9\\x16\\x26\"},\n{{0x71,0xad,0x98,0x0d,0x58,0xad,0x8e,0x7d,0x33,0x30,0x66,0x89,0x35,0x89,0x36,0xa3,0x72,0xd5,0x19,0x0b,0x24,0xec,0x7f,0x9b,0xde,0x74,0x9c,0xb8,0x11,0x50,0xef,0xda,},{0xfd,0x35,0xa7,0x5f,0xe5,0xab,0xc2,0x01,0x04,0x69,0x1a,0x24,0xa4,0x65,0x94,0x40,0xb5,0x5a,0xea,0xea,0x90,0x2a,0xc3,0xbe,0x27,0x4a,0xf2,0x7a,0xa8,0x31,0x28,0x69,},{0x81,0x67,0x0b,0x10,0x29,0xe4,0x81,0xe9,0xff,0x3c,0x17,0x1f,0x05,0xc1,0x68,0x61,0xc8,0x46,0xee,0x79,0xcd,0xf2,0xe2,0x1e,0x3b,0xf9,0x52,0xbc,0xfa,0xc9,0x75,0x65,0xf2,0xb1,0xdc,0xed,0xf6,0x9d,0x2e,0x7e,0xb3,0x5c,0xaf,0x56,0x62,0xe8,0xbc,0x67,0x1f,0xbb,0x96,0x75,0x6a,0x63,0xa5,0x96,0x26,0x4d,0x1b,0x7f,0x4a,0xf9,0x7e,0x06,},\"\\xe8\\x7a\\xe0\\x73\\xff\\x5d\\xcc\\x54\\x85\\xa1\\x99\\x40\\xe4\\xe3\\xff\\x26\\x3a\\x06\\x18\\xa9\\x02\\x5a\\xd4\\x03\\x2d\\xfb\\x36\\xd1\\x71\\xce\\x88\\x1f\\x71\\xc1\\x8a\\x49\\x21\\x0e\\xb4\\x58\\x19\\x80\\x61\\x42\\xe2\\xf0\\x0d\\xb3\\x04\\x18\\x35\\xbf\\x2c\\x3b\\xcc\\xf1\\xdb\\xa0\\x2b\\x8b\\x5a\\x5b\\xda\\xf8\\xfe\\xa3\\x16\\xc0\\x62\\x3d\\xd4\\x8a\\x56\\x4e\\xc1\\x66\\xf0\\x37\\xd5\\x87\\xc8\\xc0\\x16\\x84\\xe5\\xe5\\xc0\\xba\\x9d\\xba\\x4d\\x23\\xb4\\x9a\\x03\\x09\\x24\\x4e\\x28\\x2a\\x51\\x40\\x86\\x22\\xed\\xb0\\x57\\x04\\x74\\x7e\\x0c\\xde\\xec\\x97\\x68\\x93\\x77\\x70\\x71\\x09\\x89\\x72\\xc1\\x13\\xa8\\xab\\x63\\x9c\\x31\\xf1\\x61\\x32\\x33\\xee\\x46\\x0e\\xea\\x8a\\x8c\\x10\\xe1\\xe6\\xe1\\x52\\x21\\x45\\x29\\x87\\x8c\\xf1\\xad\\xae\\xaf\\x78\\xcf\\x19\\xba\\xc7\\x13\\x61\\x81\\x5b\\xf5\\x79\\x55\\x49\\x8f\\xab\\x4f\\x0f\\x2b\\x75\\x86\\xc8\\x6f\\x9f\\x4c\\x2d\\xdf\\x89\\x72\\xf9\\xb9\\xe0\\xeb\\x63\\x6d\\x84\\xbc\\xc1\\x43\\x85\\xb2\\xd0\\x38\\xbe\\x55\\xa9\\x63\\x70\\x2e\\xfe\\x22\\x5a\\x50\\xbd\\xd0\\xc4\\xda\\x92\\xa2\\xa6\\xa0\\x91\\x00\\xea\\x04\\xa2\\x11\\xd3\\x96\\x45\\x8d\\xce\\xb4\\x48\\x71\\x16\\x83\\x7d\\x13\\x9e\\xb0\\xf1\\x22\\x53\\x8e\\xd3\\x98\\x6a\\xd0\\xaf\\x4d\\xa2\\xdf\\xfc\\x89\\xf3\\x26\\x9c\\xa8\\x85\\x38\\x08\\x6e\\x69\\x1e\\x5b\\xea\\xe9\\x58\\x1e\\x7c\\x63\\xd8\\xe6\\x12\\xda\\x2c\\x47\\xf7\\x4d\\xde\\x1d\\x94\\x95\\x1e\\xad\\xb0\\xdf\\x60\\xc3\\x89\\x7d\\x2a\\x30\\x95\\xc5\\x06\\x09\\x3b\"},\n{{0x61,0x59,0x4e,0x24,0xe7,0x5f,0x99,0x6b,0x4f,0xb6,0xb3,0xe5,0x63,0xf6,0xa4,0xf9,0x91,0x5c,0xfa,0x65,0xdd,0xb1,0x99,0xb0,0x1f,0xed,0x7f,0x8e,0xd7,0x82,0x4e,0xcb,},{0x86,0x27,0xd2,0x14,0x15,0x79,0xcd,0x25,0x21,0xaa,0x07,0x68,0x00,0xac,0x35,0x4b,0x9e,0x3a,0x47,0xd7,0x1c,0xed,0xc8,0x54,0x74,0x34,0x26,0x82,0x25,0xe3,0x30,0x05,},{0x63,0x02,0xb3,0xff,0x27,0x10,0xbe,0x30,0x6c,0x92,0xb9,0xaa,0xe3,0x0d,0x23,0xc3,0xd4,0xbe,0xff,0x39,0x4e,0x63,0x20,0x1e,0x6a,0xd1,0x17,0x13,0x34,0x5c,0x4f,0xcb,0x5c,0xc8,0xd3,0xdd,0x10,0xad,0xfb,0x82,0xbb,0x11,0xa1,0x89,0xce,0x7e,0xc3,0xe4,0x22,0x27,0x27,0x62,0x4f,0xc1,0x78,0x81,0xc1,0x47,0x88,0xd2,0x71,0x0e,0x16,0x08,},\"\\xbc\\x01\\xb0\\x8c\\x7c\\xaa\\x23\\x61\\x00\\xa0\\x12\\xa7\\x26\\x47\\x7d\\x0e\\xc3\\x89\\xdb\\xfa\\xda\\xc7\\x3d\\x51\\x06\\x42\\x4c\\x5d\\x1f\\x3d\\x1c\\xef\\x16\\x95\\xcf\\xd9\\x3a\\x70\\x62\\xec\\x8b\\xf1\\x06\\x70\\x47\\x85\\x49\\x20\\x16\\x2f\\x65\\x13\\x57\\xbe\\xdf\\x1c\\xd5\\xa9\\x2e\\xc2\\x9b\\xdb\\x5d\\xff\\x71\\x6e\\x8f\\x60\\x25\\x51\\x5a\\x95\\x49\\xba\\x36\\xcd\\xc3\\x5c\\xed\\x7c\\x5c\\x0c\\x36\\x8e\\x6c\\xd9\\x2f\\x2f\\x10\\xae\\x14\\x6a\\x20\\x72\\x8c\\x37\\x4b\\xba\\x50\\x96\\x41\\xce\\x88\\xcb\\x42\\xff\\xf0\\xce\\xdf\\xd9\\xfd\\x67\\xf3\\x10\\xf9\\xd0\\x1a\\x3f\\x36\\x90\\xeb\\x21\\xdb\\x17\\xbc\\xe6\\x7a\\xe3\\x5c\\x4c\\xd2\\x4c\\x20\\x9f\\x09\\xf0\\x44\\x75\\x9d\\x8d\\x5a\\x7d\\x24\\x8e\\x2b\\xd9\\x66\\x52\\x4b\\xa8\\xc0\\xc2\\x89\\x74\\x72\\x6b\\x43\\xbd\\x05\\xde\\x84\\x34\\x33\\xcc\\x40\\x05\\x98\\x92\\x29\\x74\\x62\\x3d\\x9a\\xcb\\xfd\\xc7\\x61\\xc4\\xc0\\x43\\x75\\xa9\\x52\\xce\\x54\\xca\\xff\\xaa\\x96\\xac\\xff\\x6d\\x9d\\xc2\\x78\\x74\\x2a\\xf4\\x76\\xe1\\x86\\x5c\\xb8\\xc2\\x0d\\x13\\xd1\\xc1\\x90\\x08\\x63\\xbc\\xa2\\x31\\xe4\\x4c\\x6b\\x0d\\x47\\xcb\\x41\\xd5\\x10\\xf7\\x95\\x8f\\x48\\xf3\\x04\\xd0\\x3d\\xa0\\x33\\x48\\x4a\\x3e\\x1f\\x27\\x3f\\xaf\\x69\\x83\\x37\\x5b\\x7d\\x3b\\xe0\\x3d\\x8a\\x0a\\x00\\x2d\\xef\\x63\\x65\\xbe\\xb2\\xfa\\x8c\\xcf\\x1a\\x94\\x98\\x7a\\xdc\\xd3\\x3d\\x0d\\xa1\\x17\\x7f\\xc5\\x15\\x9b\\x6e\\x56\\xd0\\x04\\x30\\x1e\\x92\\x1d\\xbc\\x12\\xec\\x0a\\x73\\xf4\\x13\\xcf\\x2c\\x48\"},\n{{0x54,0xe6,0xbb,0xfb,0xf8,0xc0,0x6f,0xf2,0xc0,0x66,0x31,0x8c,0x2e,0xbf,0x03,0xd5,0x06,0x54,0x7b,0xf4,0x3c,0x2d,0x7a,0x5d,0x4d,0xf3,0x05,0xa3,0x03,0x2b,0x71,0x38,},{0x3b,0x71,0xaa,0x1d,0xef,0x66,0x6d,0x91,0x88,0xf4,0x03,0xf8,0x2e,0xd3,0x04,0x54,0xab,0xa5,0xbc,0x9f,0x47,0x0f,0x6e,0xb9,0x88,0xda,0x18,0x7c,0x92,0x52,0x32,0x84,},{0x3d,0xf4,0xd0,0x90,0x79,0xf8,0x30,0xe3,0xf9,0x82,0x28,0x36,0x81,0xba,0x37,0xb5,0x0f,0x3c,0x73,0xde,0x2c,0x5d,0x22,0xa2,0x91,0x35,0x8e,0xbb,0x1f,0xb8,0x54,0xe5,0x10,0xf6,0x3f,0x9a,0x48,0xe9,0xff,0xf7,0xfd,0x83,0x11,0x30,0x2e,0xa3,0xe9,0x69,0x39,0x4e,0x6d,0x49,0xc9,0xe3,0x18,0x20,0x54,0x94,0x2f,0x6a,0x74,0x4c,0xee,0x03,},\"\\x03\\x18\\xd7\\xcb\\x48\\x05\\xaf\\x98\\x21\\xdd\\x3f\\x91\\x4b\\x0e\\x07\\x6f\\xea\\x04\\xa7\\xd2\\xdb\\x3a\\x59\\xa0\\x0a\\xff\\xea\\xd3\\x32\\x5a\\x2b\\xe4\\x0c\\x1f\\x87\\xf5\\x32\\x76\\xa8\\x55\\x26\\x04\\xf2\\x28\\xb9\\x76\\xe2\\x88\\xb9\\xbe\\x90\\x6a\\x7b\\xd2\\x5b\\x2f\\xfa\\xb8\\xa8\\xaf\\x5d\\x0f\\x6e\\x08\\x78\\x6f\\xd0\\x34\\xe2\\xfe\\x1e\\xb7\\xee\\x03\\x39\\x79\\x86\\x0d\\xd1\\xe5\\x32\\x72\\x87\\xe9\\xe6\\x15\\xf5\\xdc\\x5a\\x96\\x0f\\x17\\x02\\x6b\\x56\\x84\\x2f\\xc8\\xd4\\x4c\\xad\\x00\\x2e\\xdc\\x85\\x01\\xcf\\xb9\\x56\\x00\\x15\\x02\\xe4\\xdd\\xc8\\x1a\\x77\\x00\\xd9\\xc0\\xbe\\x88\\xeb\\x4a\\xaa\\x64\\xa6\\xcb\\xc3\\x9d\\xe8\\x2f\\x13\\xc1\\x10\\x86\\xde\\x1a\\x42\\x70\\xd3\\xaf\\x97\\x28\\x4b\\xac\\x1c\\xae\\xf1\\xd3\\xed\\xaa\\x10\\x71\\x66\\x6b\\xd8\\x3b\\x2e\\xde\\x39\\x62\\xd9\\x8b\\x9d\\x93\\x49\\x7d\\xdf\\xd8\\xe9\\x7d\\xab\\x30\\x89\\x95\\x0c\\xf3\\x0e\\xd1\\x1d\\xb7\\x7a\\xd1\\x43\\x7a\\x0a\\xf5\\x88\\x9d\\x8e\\xfc\\x44\\xe6\\x12\\x42\\x0e\\x39\\x07\\x26\\x7d\\xf3\\xac\\xff\\x4b\\xd3\\xfb\\x6e\\x8c\\xa5\\xba\\xdf\\x8e\\x72\\xf9\\xde\\x39\\x52\\x86\\x53\\x05\\x85\\x24\\x45\\x6a\\x81\\xda\\x5f\\x84\\x98\\x2a\\xfa\\xc3\\x4b\\xef\\x5f\\x71\\xe9\\x1f\\x8f\\x90\\x93\\x8a\\x6f\\x5f\\x1f\\x28\\x77\\x16\\xde\\x56\\xa0\\x94\\x6d\\x26\\x1e\\x87\\xbc\\x77\\x5c\\xe1\\x89\\xe4\\x1a\\x77\\xba\\xed\\xe7\\x32\\x0a\\x3c\\x60\\x8f\\xc9\\x71\\xe5\\x5d\\x0a\\x77\\x3c\\x4d\\x84\\x8d\\x42\\x86\\x37\\xf1\\x1b\\x4e\\x44\\x60\\x39\\x0c\"},\n{{0x68,0x62,0x06,0x1b,0xe0,0xde,0x9d,0xfd,0x99,0x81,0x18,0x20,0x4b,0x2b,0x98,0xdb,0x3c,0xe7,0xd7,0xe8,0x19,0xdb,0xc1,0x07,0x94,0xaf,0x0a,0xb2,0xb0,0x6e,0x84,0x34,},{0x9c,0x5f,0x7c,0x22,0x65,0xdd,0xe1,0xb2,0x5e,0x4f,0x27,0xec,0x71,0x58,0x0d,0x52,0xdc,0x89,0xf2,0xc3,0xa7,0x12,0xbc,0x1a,0xd5,0xd6,0xd6,0x9e,0x71,0x1e,0x08,0xd4,},{0x96,0x5e,0xdb,0x34,0xe8,0xab,0x8b,0xc3,0x20,0x4a,0x32,0x01,0xd2,0x21,0x86,0x37,0x2d,0xe4,0x24,0x26,0x00,0x29,0x7c,0xfd,0xb5,0x7a,0xa1,0xdf,0x07,0x4e,0xc5,0x0d,0xdf,0x10,0x10,0x5e,0x9d,0x4c,0x89,0xa2,0x66,0xc3,0x4d,0xb7,0x77,0x2a,0xa9,0x4c,0xba,0x94,0x64,0x29,0xe6,0x8b,0xa6,0x2b,0xf9,0xa0,0xac,0x90,0xf5,0xf0,0x5b,0x02,},\"\\x17\\x40\\xdd\\xe8\\x43\\x4a\\x0d\\x68\\x99\\x25\\x67\\x9b\\x0c\\x18\\x03\\x00\\xcd\\xbd\\x0c\\xf6\\xa8\\x9a\\xd8\\xfd\\xe3\\x46\\x53\\x31\\x6c\\xee\\x4c\\x57\\x1a\\x41\\x05\\xc9\\xe9\\xe0\\x28\\x42\\x38\\xfe\\xf2\\xc3\\x8a\\x09\\x15\\x7c\\x5d\\xb9\\x43\\x40\\x57\\x1b\\x39\\x0a\\xdf\\xb6\\x9f\\xf4\\xc0\\xdc\\x50\\x53\\x25\\x3a\\x67\\x9d\\x42\\xcc\\x1f\\x1b\\xf1\\xff\\x42\\x92\\x29\\xea\\x0a\\x50\\x44\\xc6\\xf7\\x95\\x64\\xe0\\xdd\\x28\\x7f\\x53\\xf0\\x15\\xb8\\x31\\x87\\xd9\\xad\\x27\\xd9\\x10\\x39\\xaf\\x06\\x2c\\x43\\x7b\\x15\\x75\\xa0\\xea\\xb6\\xae\\xb8\\xaa\\x0d\\x27\\xb2\\x76\\x65\\xd6\\xde\\xa9\\x04\\x1f\\xf9\\x96\\x3a\\x31\\x18\\xb3\\x29\\x8a\\x85\\x44\\xe3\\xfd\\x69\\xac\\x68\\x77\\xe3\\xe4\\x05\\x2f\\xe4\\x42\\x2b\\xf0\\x35\\x60\\xb2\\xc5\\x7e\\xc5\\x31\\xee\\x8b\\x5f\\xf5\\x3c\\x28\\xdb\\xde\\x35\\xbb\\x45\\xc3\\x50\\x77\\x63\\x6e\\x6f\\x84\\x1b\\x59\\xd7\\xeb\\x77\\xbc\\x77\\x91\\xb6\\x09\\x38\\x58\\xa3\\xa8\\x0a\\x3a\\xa6\\xd7\\x78\\xdb\\xf5\\x3d\\xb9\\xd0\\x61\\x19\\xc5\\x0b\\x71\\xc7\\x91\\xc0\\x49\\x5c\\x57\\x6d\\x1b\\x59\\xd3\\x96\\x87\\x3e\\xd8\\x71\\x48\\x53\\x52\\xc8\\x29\\x9a\\x35\\x9d\\xa5\\xee\\x9d\\x7f\\x36\\xed\\x14\\x55\\xf8\\x98\\x51\\xa3\\x08\\x51\\xbe\\xa7\\x19\\x68\\x5a\\xec\\xd0\\x8f\\x25\\x56\\x26\\x09\\xdd\\x10\\x66\\x30\\x73\\x52\\x77\\xe1\\xd6\\x51\\x9b\\xb1\\x68\\x7d\\xe8\\xb8\\xc6\\x8b\\x96\\x71\\x45\\x2e\\xdb\\xb3\\x49\\x1d\\xa2\\x64\\xcd\\xfa\\x00\\x17\\xc5\\x12\\xd2\\x76\\x97\\x59\\xcb\\x92\\x5f\\xb6\\x64\"},\n{{0xb2,0x25,0x0b,0xbc,0xb2,0x68,0xd2,0x47,0x7c,0x83,0x12,0xb1,0x90,0x0f,0xd9,0x99,0x82,0xba,0xa2,0x9a,0x68,0x97,0x4f,0xbf,0x87,0x78,0xa1,0x22,0x8d,0xc9,0x75,0x50,},{0x44,0xaa,0x8d,0xf1,0x18,0x16,0x74,0xb0,0x5a,0xde,0x98,0x0f,0x7e,0xdd,0xba,0xf3,0xbd,0x74,0x22,0xa9,0x20,0x28,0x7c,0xb2,0xd2,0xdb,0x59,0xa0,0x63,0xee,0xbf,0x74,},{0xf2,0xb8,0xd9,0x2e,0xd5,0x1e,0xbd,0x10,0x00,0xbf,0x9d,0xd3,0x41,0x1a,0x9f,0xa9,0xe7,0xae,0xe5,0x4c,0x4c,0x86,0xe2,0x4a,0xd0,0xf9,0xad,0x5c,0x55,0x64,0x3a,0x12,0xd6,0x80,0x01,0x9c,0xa0,0x3f,0x21,0x6b,0xd4,0xbd,0x32,0xc9,0xce,0x1c,0xd8,0xa5,0x28,0xc3,0xff,0xaa,0x5d,0x5b,0x1d,0xc9,0x1a,0x4b,0xe5,0x6f,0x0e,0x2c,0x5e,0x06,},\"\\x7e\\xf0\\xae\\x13\\x36\\xa6\\xfa\\xb3\\x7f\\x99\\xda\\x5f\\xa7\\xd0\\xde\\xc7\\x40\\x9c\\x07\\x26\\x23\\xea\\xd8\\x4f\\x24\\x1d\\x53\\xd0\\x59\\x6b\\x46\\x17\\x05\\xfb\\x1b\\x3c\\x53\\x7d\\x36\\xb8\\x9e\\x89\\x60\\xfe\\xbb\\x4c\\xdc\\x0d\\x42\\x7c\\xe2\\xfc\\x1b\\xe5\\x8d\\xbb\\xce\\x15\\x1e\\x35\\xac\\xd8\\xb6\\xac\\xe4\\x0a\\x19\\x82\\x29\\x14\\xa4\\xbd\\x8c\\x4a\\xf6\\x32\\xf1\\x36\\x41\\x8a\\xc4\\x9b\\x18\\x4d\\x55\\x19\\x3e\\xbc\\xc3\\x2d\\x0d\\x79\\x87\\x09\\xb1\\xa8\\xfe\\x29\\x4f\\xba\\x8a\\x1f\\xe7\\x2d\\x97\\x6b\\x44\\x00\\xd4\\xa3\\x93\\x24\\x23\\x11\\xb0\\xf8\\xcc\\x99\\x4e\\x89\\x47\\x5b\\x00\\x38\\xae\\x5d\\x89\\x14\\x93\\x8e\\x8f\\x6e\\x87\\xc6\\xf5\\x0b\\x9d\\x65\\x6c\\x45\\xd7\\xb1\\x42\\x31\\xef\\xed\\x97\\xf3\\xc9\\x06\\x68\\x91\\x36\\x70\\xbf\\x5b\\xe2\\xef\\xd5\\xc2\\x70\\xc7\\xcb\\xaf\\x01\\xe8\\x57\\x2e\\x98\\x00\\x97\\x8d\\xfe\\x2e\\x10\\xa2\\xfc\\x04\\x40\\xb8\\x55\\x62\\x9b\\xf9\\xcd\\x40\\x9e\\xa9\\x41\\xcb\\x69\\x22\\x6c\\xac\\x77\\x1b\\x15\\xea\\x77\\xc0\\x32\\x68\\x48\\x80\\x6f\\xf8\\xd2\\xe2\\x01\\xe6\\xe2\\x6c\\xd5\\xf4\\x54\\x30\\xda\\xdc\\xff\\x8f\\x59\\xc3\\x21\\xc1\\xc9\\xc6\\xa2\\x9b\\x94\\x88\\x29\\x35\\x44\\x7d\\x3e\\x6c\\x2e\\x88\\x04\\xb1\\x16\\x15\\x76\\xbd\\xf0\\x32\\x0f\\xe5\\x3c\\x30\\x7d\\x9c\\xde\\x42\\x60\\x77\\xa7\\x67\\x7c\\xde\\x3c\\x1b\\xc8\\x3e\\x18\\xe6\\x0a\\x0c\\x4e\\xe6\\xdc\\xcd\\x87\\x7c\\x21\\x3a\\x8e\\x4c\\xca\\x64\\x0e\\xe0\\x49\\x29\\x80\\x45\\x70\\xae\\x1f\\x96\\x15\\x7c\\x04\\x35\\x7a\"},\n{{0xb8,0x09,0x36,0x1f,0x55,0xcf,0xe8,0x13,0x7f,0xbd,0xa8,0x80,0xfc,0x62,0xcb,0xe4,0x4c,0x21,0x6e,0x14,0x18,0x93,0x34,0x63,0x02,0xb3,0x36,0x04,0x5d,0xe2,0x18,0x78,},{0xfd,0x23,0xe4,0x2f,0xf0,0x66,0x44,0xea,0xd3,0x47,0xab,0xcc,0x1b,0x3e,0x03,0xb0,0xe8,0x85,0x93,0xb6,0x12,0x54,0x98,0x1d,0xd8,0xae,0x59,0x45,0x4e,0x61,0xb3,0xe0,},{0xb5,0xb5,0x95,0x0d,0x37,0x72,0xd2,0xee,0xf8,0x8e,0x1b,0x0f,0x5d,0xf5,0xff,0xae,0x2f,0x21,0x03,0x88,0x5e,0x71,0x44,0x6d,0x34,0x6f,0xbb,0x5d,0xae,0xf9,0x49,0x67,0xa6,0xb7,0xb6,0xe4,0xbe,0x88,0x51,0x10,0x06,0x58,0x76,0xc6,0x65,0xb7,0x81,0x2d,0xe4,0x6a,0xd3,0x1e,0xc3,0xbf,0xcb,0xea,0xee,0x13,0xed,0x0c,0x1e,0x0b,0x30,0x0e,},\"\\x17\\xac\\xe1\\x97\\xd0\\x83\\xaa\\xf1\\x72\\x6f\\x53\\xe5\\xef\\x81\\xb5\\xa8\\xc0\\x92\\x22\\xf2\\x60\\xee\\x5f\\x1f\\x54\\x04\\xab\\x78\\xd9\\x00\\xd4\\x89\\x68\\x84\\x49\\xb8\\x43\\xba\\xd3\\xc4\\x98\\xaa\\xc6\\xd8\\x0b\\x46\\x39\\xb7\\x6e\\x6e\\x81\\xc5\\x52\\x76\\xa6\\xf9\\xc7\\xce\\xcd\\x70\\xb7\\x1a\\xaa\\xf2\\x01\\x8e\\xf7\\x6c\\x0e\\x30\\x15\\x4a\\xae\\x86\\xa5\\xc8\\x6d\\x4e\\x8d\\x0e\\x4e\\xc6\\x8c\\xc4\\x27\\x06\\x0b\\xd5\\x65\\x14\\xf7\\x23\\x80\\x86\\xbb\\xef\\x5b\\xfc\\xa1\\xf5\\x67\\x1b\\x18\\x04\\x18\\x38\\xfd\\x01\\x35\\x72\\x44\\x3d\\xba\\x48\\xfb\\xdd\\x95\\xca\\x74\\x0b\\x0d\\xaa\\x43\\x27\\x16\\x4a\\x1e\\x34\\x67\\x72\\x49\\x70\\x8f\\x77\\xbd\\x79\\x3e\\x7c\\xaa\\x66\\x38\\xb5\\xdc\\x9f\\xbe\\x6f\\x0d\\xfd\\x41\\x20\\x20\\x90\\x97\\x20\\x9c\\x93\\xce\\xdf\\xaf\\x21\\xb6\\xbf\\x59\\xca\\x6e\\x99\\xe6\\x20\\x96\\x39\\x44\\x4f\\x0e\\x82\\x7b\\xbc\\xc0\\xa6\\x1c\\x3a\\x23\\x7c\\xa2\\x2a\\x28\\x32\\x13\\x22\\x3a\\xb6\\x58\\xe7\\x12\\xc7\\x55\\x62\\x38\\xd3\\xa5\\xfe\\x31\\x72\\x2d\\x65\\xf5\\x70\\x6e\\xf6\\xd6\\x4d\\x73\\x23\\x2d\\x30\\x43\\x22\\x0f\\x14\\xe5\\xcf\\xd3\\xc2\\xc8\\x3a\\x83\\xd6\\x8e\\x20\\x27\\x4b\\x6f\\x96\\xb2\\x9d\\xe0\\x40\\xce\\xc8\\x47\\x50\\x30\\xb6\\xa8\\xa8\\x7d\\x29\\x80\\x8d\\xd3\\x81\\x79\\x5c\\x3d\\x22\\xac\\xf5\\xdc\\x19\\x3b\\x72\\x0d\\x95\\xa7\\x52\\xd9\\xf1\\x23\\xc2\\x09\\xff\\xba\\x00\\x4e\\x48\\xdd\\x06\\xdd\\x8c\\x9e\\x17\\x2b\\xc9\\xe0\\x87\\xd8\\x0b\\xc5\\x21\\x6c\\x0b\\x0b\\x6e\\x77\\x03\\x12\\x41\"},\n{{0xee,0xef,0x80,0x74,0xc2,0xeb,0x9a,0x1c,0xee,0x2f,0x2d,0x3b,0xb0,0x53,0x25,0x54,0x6a,0x9f,0xb7,0xcb,0xe4,0x4b,0x59,0x94,0x61,0xfc,0x58,0x85,0xf5,0xfd,0x9c,0xac,},{0x9b,0x89,0x29,0x41,0xa0,0x57,0x3b,0x7a,0x16,0x73,0xef,0x48,0x0f,0x08,0x11,0x68,0xd9,0xb7,0x49,0x6a,0x81,0xf9,0x17,0x7d,0xc4,0x27,0xca,0x1f,0x84,0xcb,0xbf,0x7d,},{0x6f,0x71,0x01,0x98,0x4f,0xd6,0x89,0x2e,0x21,0x44,0xb7,0xd4,0x56,0x19,0x83,0x0c,0xae,0xb6,0x71,0x3b,0xfa,0xb4,0xee,0xbb,0xe2,0x17,0xc5,0xbe,0xcd,0x24,0x9b,0xd9,0xd7,0x52,0xeb,0x76,0xe9,0xfa,0x99,0x5e,0x7c,0x71,0xff,0x7d,0xf8,0x6b,0xb2,0x60,0xcd,0xda,0x17,0x3f,0xf5,0xde,0xec,0x6a,0xf2,0x04,0xb7,0xdd,0xe0,0x11,0xde,0x09,},\"\\x9a\\xe3\\x9f\\xea\\xde\\x90\\x5a\\xff\\xcb\\xed\\xd2\\xe7\\x2a\\x6f\\x24\\x29\\xb3\\xd1\\x10\\x8e\\x5b\\xc1\\xa9\\xdb\\xaf\\x49\\x0a\\x62\\x99\\xbc\\xcd\\x94\\xac\\xc4\\x13\\xad\\xac\\xc9\\x18\\xb1\\x4a\\xfa\\x85\\xc7\\x8b\\xc1\\x68\\xcc\\x00\\x74\\x0c\\x3d\\xa0\\xe0\\x81\\x83\\x91\\x5f\\x79\\xb7\\xfe\\x38\\x68\\xce\\x2a\\x7e\\x88\\x6b\\x32\\xad\\x45\\x00\\x98\\x05\\xbf\\xb8\\x1b\\x8c\\x07\\xb3\\xb1\\x02\\x24\\x20\\xc0\\xf0\\x09\\xb8\\x89\\xd7\\xfc\\x22\\xfd\\x19\\x97\\xae\\x34\\x19\\x84\\x38\\xca\\x94\\x77\\x85\\x75\\x12\\x2f\\xca\\xaf\\x96\\xe6\\x50\\x2c\\x33\\xa7\\x5a\\x12\\x9a\\x2d\\x0d\\xbb\\x07\\x3d\\x93\\x82\\x0d\\x9c\\x96\\x68\\x3d\\xb3\\x18\\x99\\x0b\\xe3\\xfe\\xf4\\xca\\xfc\\x89\\x0a\\xfb\\xd9\\xb1\\x50\\x4c\\x74\\x39\\xa0\\x8a\\x06\\x5e\\x78\\x14\\xee\\x4f\\x9b\\x6f\\x57\\xee\\x16\\xba\\xed\\x3f\\x0e\\x3a\\xa3\\x5d\\xd2\\x3d\\x35\\x28\\xa4\\x58\\x91\\x9a\\xd7\\x70\\x48\\xb4\\xe2\\xe6\\x17\\x23\\x46\\xbe\\x24\\x9a\\x50\\xaf\\x02\\xbc\\x6c\\x85\\x33\\x04\\xc2\\x08\\xae\\x0b\\xa0\\x27\\x71\\x26\\x2a\\x0d\\x8a\\x46\\x5f\\x71\\xfa\\x06\\x35\\xe5\\x3e\\xb2\\xef\\x0a\\x84\\x7d\\x56\\xa0\\xbc\\xd7\\xdd\\x3f\\xe0\\x77\\xc9\\x2b\\xcd\\xca\\x30\\x69\\xa4\\xa6\\x82\\xa2\\x85\\x99\\x28\\x31\\x5c\\xe3\\xeb\\x44\\x5c\\x60\\x72\\xa7\\x14\\x92\\xee\\x82\\xe1\\x72\\xa2\\x0b\\xe0\\xb6\\x48\\xb7\\x56\\xe6\\xc7\\x75\\x37\\x6f\\x0c\\x7c\\x3d\\xf8\\xe6\\x42\\x88\\x08\\x9c\\x2f\\x81\\xce\\x95\\x93\\xc6\\xe0\\x8b\\xb1\\xcc\\x1b\\x27\\xfc\\xbd\\x39\\x2f\\xc7\\x95\\x2c\\x55\"},\n{{0x61,0xfa,0xeb,0x15,0xf8,0x57,0xf6,0x55,0x78,0x62,0xc8,0xb8,0xc7,0xef,0x41,0xf8,0x05,0x45,0x52,0x09,0x96,0xfc,0xc1,0x12,0x7b,0x8c,0x24,0x91,0x82,0x22,0x01,0xae,},{0x60,0xa2,0x90,0xc0,0xfc,0x42,0x5a,0x08,0x74,0x67,0x3d,0x94,0xf9,0xbb,0x14,0x00,0xf9,0xda,0xcd,0xe9,0x95,0x4f,0x9f,0x5b,0x05,0xdd,0x48,0xab,0x74,0x7a,0x39,0x50,},{0x31,0xf9,0x0f,0x50,0xb2,0xdc,0x70,0x5f,0x1d,0x92,0xf1,0x2c,0xa9,0x97,0x5d,0x76,0xf1,0xb2,0x82,0x6a,0xda,0x3c,0xc1,0x85,0xb0,0xed,0x6c,0x83,0x86,0x07,0x77,0xbd,0x8c,0x48,0x9b,0x59,0x85,0x5a,0x91,0xf6,0x48,0x39,0xd4,0x9b,0xa4,0x67,0x98,0x5a,0xbb,0x37,0x6c,0x47,0xa4,0x90,0x8b,0x27,0x1b,0x8f,0x77,0xc5,0x8d,0x01,0xfd,0x04,},\"\\x25\\x3b\\x56\\x6e\\xcc\\xb5\\x63\\xbd\\x6e\\x48\\x0c\\x69\\x73\\x9b\\x8e\\x37\\x25\\x19\\xa3\\x43\\x72\\x54\\xe0\\xe5\\x02\\x9c\\xac\\x86\\xc7\\x16\\x38\\xf2\\xdf\\x2a\\x6c\\xf9\\xe5\\x6d\\xb2\\x56\\x99\\x34\\xde\\xba\\x90\\xdb\\x75\\x54\\x7e\\x36\\x71\\x74\\x7d\\xf6\\x4d\\x6f\\x2a\\xaf\\x3c\\x11\\x0f\\xa6\\x7a\\x70\\x94\\xcc\\xbe\\x4c\\xc5\\x35\\x5f\\x0d\\x43\\x23\\x51\\x36\\xee\\x26\\xdb\\xe3\\x7f\\x42\\x25\\xd3\\xbb\\xfe\\x24\\x55\\x95\\x28\\x05\\x85\\xfb\\x54\\x8f\\x89\\x4e\\x86\\xc5\\x16\\x10\\x25\\x80\\x29\\x1f\\xa7\\xa0\\x28\\x59\\x55\\x7f\\xb9\\x8e\\xb5\\x88\\x87\\x08\\x28\\xb0\\x99\\x0a\\xe9\\xd7\\x4f\\x38\\x31\\xda\\x58\\x94\\x6b\\xc7\\xa5\\xce\\x1b\\xa4\\x98\\xb4\\xe8\\xbe\\x89\\x89\\xa3\\xb5\\x0d\\x7e\\x87\\x89\\xf5\\x6b\\x8b\\x4f\\xec\\xbc\\x2a\\x33\\xbf\\xa3\\xef\\x59\\x1a\\x0f\\xbc\\xd9\\x32\\xfa\\x93\\xe1\\x9f\\x3a\\x81\\x2a\\xe5\\xe4\\xe3\\xb4\\xb2\\x42\\xbe\\x77\\x05\\xa5\\x87\\x4a\\xf7\\x3b\\xe3\\x10\\xb0\\x05\\x82\\x66\\xa3\\x78\\xf2\\x3c\\x13\\x48\\x52\\x47\\x15\\xb0\\xcc\\xc1\\x8d\\x66\\x34\\xb2\\x36\\x36\\xc3\\x16\\xba\\x6a\\x1d\\xd2\\xfd\\x50\\x92\\xc0\\x67\\x16\\xa7\\x17\\xb5\\x4d\\x0e\\xb9\\xfc\\x7f\\x63\\x6f\\x85\\xbb\\xf2\\x25\\xa2\\xcf\\x03\\x5b\\x4b\\x7c\\xfd\\xdd\\x75\\x35\\x16\\x82\\xc0\\x57\\x6c\\x6b\\x3b\\xa5\\xa1\\xc0\\xb2\\x5e\\xc5\\x94\\xe7\\x70\\x9d\\xd0\\x9a\\x00\\x79\\x77\\x2f\\xf3\\xac\\xc6\\x7f\\xb6\\xc1\\xb3\\x7b\\xb3\\x74\\x2b\\x72\\x6e\\x77\\xe8\\x05\\x61\\xd9\\xab\\x73\\x16\\x0b\\x73\\x36\\x25\\x81\\xda\\x5b\\x9c\\x7f\"},\n{{0xe6,0xb9,0xcd,0x4d,0xa0,0x7c,0xb3,0x4f,0x30,0x39,0x1c,0xf6,0x8f,0x0d,0x87,0xc7,0xcf,0xcf,0x68,0xf8,0x10,0xff,0xa4,0x0f,0x97,0x39,0xc9,0x5d,0xeb,0x03,0x7f,0x71,},{0x56,0x9e,0xde,0x0f,0x04,0x63,0x0b,0x43,0xa0,0x4c,0x5a,0x66,0xb6,0xa5,0x63,0x6b,0x76,0x6c,0x75,0x96,0x59,0x84,0xa7,0x47,0x7e,0x15,0x49,0x19,0x60,0xfd,0xd8,0x64,},{0x1e,0x37,0x5c,0x94,0xbd,0x80,0x9c,0xa0,0xcd,0xd0,0x2f,0x89,0xec,0xec,0x4e,0x43,0x77,0x32,0xdd,0x20,0xa0,0xa8,0x4b,0x25,0x4e,0xae,0x88,0x9d,0x80,0x70,0xe6,0x82,0xd1,0x13,0xb0,0xbe,0x22,0xe4,0x1e,0x6c,0xdc,0x3b,0xe8,0x77,0x68,0x0e,0x7e,0xeb,0x7f,0x09,0x95,0xe6,0x62,0x2d,0xc0,0xb4,0x34,0xfb,0x09,0x49,0xdd,0x99,0x4b,0x0c,},\"\\x69\\xde\\xf0\\x52\\x3a\\xfd\\xa6\\x96\\xf8\\x44\\x8f\\x9c\\x11\\x43\\xab\\xc2\\x65\\x33\\xe6\\x86\\x95\\xa0\\x90\\xdf\\x0d\\x9e\\x43\\xd0\\xc0\\xef\\xf4\\x35\\x83\\xe6\\xf7\\x09\\xd2\\x04\\x3c\\x81\\x5f\\xbb\\x3f\\x96\\xba\\x2b\\x0d\\xc3\\xbe\\x6f\\xec\\xad\\x5d\\xd3\\x81\\x48\\x78\\x8e\\x4a\\x03\\x85\\xa9\\xfe\\x7a\\x92\\x1f\\xcb\\x8c\\xce\\xe0\\xe4\\xd3\\xae\\xd4\\xbc\\x3d\\x21\\x6d\\x84\\xb4\\x14\\xf9\\x58\\x0b\\x02\\x82\\x0c\\x03\\xd9\\x2e\\x67\\x5e\\x68\\x5c\\x4b\\x58\\x51\\xf3\\x63\\xbb\\x4d\\xf9\\x7b\\x41\\x7c\\x3f\\xd9\\x00\\x22\\xee\\xaf\\xa2\\x0d\\xfb\\xe8\\x29\\x64\\xf2\\xff\\x07\\x3d\\x25\\x57\\x58\\xfb\\xe5\\x67\\xc7\\x6b\\x2c\\x35\\xe2\\xb0\\x9f\\x8a\\x8d\\x7a\\xfa\\x32\\xc6\\xf5\\xad\\x01\\xbc\\x3e\\xbf\\x6e\\x21\\x06\\x06\\xdb\\x03\\x8e\\xcb\\x68\\x20\\xce\\x1e\\xa4\\xdd\\x52\\x9f\\xc1\\xad\\xfb\\xc2\\xa1\\x38\\x56\\x5a\\xc6\\xd0\\xf4\\xa4\\x10\\x9b\\xdd\\x47\\xb8\\xaa\\x6e\\xf4\\xb8\\xbe\\xde\\x45\\x46\\x80\\xd1\\xdb\\xdb\\x75\\xfe\\x1e\\xb2\\xe5\\x48\\xd5\\xde\\x7c\\xb6\\xd7\\x92\\xfe\\xf3\\xaa\\x0d\\x84\\x80\\xa6\\x03\\x0b\\x30\\xf1\\x04\\xd7\\xe7\\x6b\\x58\\xe9\\xf4\\x76\\xeb\\xf2\\xcc\\x83\\x29\\x23\\xb5\\x0c\\x50\\xc1\\x11\\xc3\\x51\\x5f\\xc5\\x18\\x85\\x23\\x23\\x42\\x6c\\xa7\\x78\\xa5\\x96\\xd3\\x19\\x5d\\xa8\\x58\\x5d\\x8c\\x3a\\xa9\\x20\\x83\\x31\\x3a\\x6e\\x65\\x85\\xb7\\x0c\\x98\\xb1\\x85\\xb4\\x72\\x79\\x8a\\x61\\xcd\\xe7\\x7e\\x62\\xec\\x27\\x2f\\x14\\xb0\\xd9\\xeb\\x4f\\x22\\xf9\\xc7\\xc0\\x58\\x17\\xda\\x6f\\xde\\xfe\\x78\\x79\\xa5\\x84\"},\n{{0x4d,0x90,0x44,0xf1,0x7b,0x5a,0x09,0x77,0xdc,0x5a,0xa9,0x91,0x6a,0x92,0x43,0x00,0xa2,0x44,0xa1,0xef,0x7f,0x06,0x02,0x77,0xad,0x49,0x78,0x35,0x1e,0xa6,0x42,0x91,},{0xab,0x9c,0x06,0x92,0xa6,0x06,0xb2,0x56,0x7c,0x19,0xc3,0x0f,0x9f,0xaa,0x3b,0x4c,0xfe,0x72,0xfb,0x23,0x70,0x77,0x76,0x7b,0x76,0xd3,0xb2,0xae,0x14,0x90,0xa6,0xd4,},{0x6f,0xa4,0x8a,0xea,0x4d,0x5b,0x9a,0xf6,0x5a,0xf9,0x64,0xcd,0xb7,0x09,0x44,0x3a,0x11,0xfa,0x84,0xf7,0xd4,0x4a,0xcd,0xda,0xb1,0x6e,0x04,0xa6,0xfc,0xef,0xb2,0x7a,0xe3,0x3c,0x05,0xb3,0x6d,0xa1,0x3c,0x23,0xde,0x51,0x7d,0x6e,0x6a,0xc5,0x74,0xa0,0x3e,0xa6,0x30,0xba,0x4f,0xbb,0x95,0x81,0x31,0x12,0x9a,0xa7,0xf1,0x35,0x4c,0x01,},\"\\x7c\\x8c\\x71\\x89\\xaf\\x67\\x32\\x7a\\xf1\\xc6\\xdd\\x2c\\x30\\xe9\\x75\\xf1\\x90\\xe3\\xb3\\x8d\\x00\\x8b\\x45\\x85\\x16\\x7e\\x0d\\x45\\x07\\x40\\xd4\\x67\\x34\\x58\\x7f\\x6d\\x20\\x87\\x84\\x24\\x5c\\xc5\\xcb\\x06\\x2a\\x2a\\x27\\x7f\\x17\\xeb\\xb2\\x74\\x6f\\x9b\\xdf\\x4a\\x82\\x37\\xca\\x47\\x9a\\xb0\\xa4\\x30\\x17\\x7e\\x19\\xed\\x7d\\xd3\\x62\\x25\\x76\\xb1\\x4c\\xdc\\x08\\x28\\x22\\x14\\xfe\\x5e\\xe4\\xd7\\x6b\\x43\\xc1\\x6a\\xc9\\x08\\x64\\xc5\\x1b\\xe8\\xae\\xd4\\x5d\\x7b\\x98\\x0d\\xf7\\x91\\x7f\\x29\\x0f\\xdf\\x79\\x58\\x46\\x46\\x5f\\x27\\xfc\\xb7\\xe5\\x73\\x06\\x37\\x94\\x4f\\x05\\x77\\xc9\\x2f\\x32\\x37\\x5e\\x99\\x5b\\xc0\\xcd\\xa9\\xd7\\x19\\x6f\\x2c\\x0c\\x1a\\xc8\\xb8\\x0d\\x12\\xa0\\x43\\x99\\x63\\xeb\\xd2\\x25\\x4c\\x34\\x77\\x03\\x57\\x58\\x16\\xe7\\x96\\x4c\\x13\\xd4\\x4d\\x62\\x92\\x80\\xc3\\x12\\xea\\x26\\x53\\x44\\xde\\x38\\xf3\\xb1\\x8d\\x91\\x50\\xf8\\xf9\\x24\\xaf\\xb4\\x4b\\x6b\\xfb\\x9e\\xda\\x51\\x3d\\x59\\xe6\\x5e\\x2e\\xf1\\x86\\x66\\xe6\\xc2\\xa2\\x1c\\x40\\x18\\x66\\x5b\\xef\\xe9\\x2c\\xae\\x58\\x1d\\x3c\\xb1\\x4e\\x23\\xe9\\x7d\\x83\\x00\\x02\\xcb\\x90\\x93\\x1a\\xe0\\x21\\x00\\x68\\xaf\\x39\\x4e\\xbe\\x35\\x1b\\xe5\\xb8\\x17\\xf3\\x67\\x4b\\xfb\\xf4\\x00\\x49\\x03\\x0e\\x4f\\xe5\\x05\\xd3\\x4a\\x1d\\x50\\x2a\\x2c\\x50\\xd8\\xe6\\x38\\xe9\\x26\\xc2\\x30\\x67\\x6b\\x7e\\xde\\xfb\\x6b\\xec\\x77\\xb1\\xc0\\xce\\x60\\x93\\x25\\x28\\x7b\\xa5\\xfd\\xd7\\xa9\\x97\\x69\\x87\\xbd\\x07\\xfc\\x6a\\x43\\x44\\x95\\x6e\\xbf\\x81\\x8f\\x08\\x58\\x6c\"},\n{{0x75,0xad,0x76,0xbb,0x4c,0x0c,0x22,0x9a,0x5a,0xdc,0x79,0xe4,0x44,0xb1,0x3f,0x88,0xa9,0x64,0x59,0x86,0x2c,0x8c,0xf0,0xba,0x49,0x8d,0x0c,0x99,0x6a,0xf9,0x4a,0x7a,},{0xf0,0x74,0xdd,0x2b,0x9c,0x1c,0x30,0x91,0x05,0xec,0x95,0x1b,0xb5,0x81,0x2a,0x91,0xdd,0xb5,0x40,0x23,0xb3,0x80,0x9a,0xb3,0x79,0xc5,0x6a,0xf0,0x46,0x1a,0xf6,0x17,},{0x0c,0x46,0x43,0xa8,0xbe,0x6d,0xc2,0x2f,0x4b,0xeb,0x6b,0xcc,0x70,0xc6,0x17,0x2e,0xc7,0x60,0x83,0x78,0x65,0x3c,0xb4,0xe9,0x9f,0x3a,0xe7,0x95,0xea,0xdf,0x4e,0x98,0x2a,0x29,0x76,0x09,0xca,0x79,0x38,0xf5,0xdf,0x63,0x2b,0x09,0x56,0x28,0xcb,0x75,0x06,0x2d,0x3d,0x51,0xfc,0x0f,0x33,0x23,0xbf,0xa7,0xb2,0x2e,0xc4,0xd4,0x72,0x05,},\"\\x0c\\xa8\\xc1\\xc7\\x41\\x28\\xd7\\x4e\\x9d\\x0a\\x7b\\xf8\\x96\\x42\\x91\\xd0\\x74\\x91\\x7f\\x2f\\x99\\x20\\xef\\xb9\\x11\\x52\\x05\\x67\\x64\\x2a\\x50\\xa6\\x15\\xab\\xcb\\xd0\\x0a\\xed\\x4a\\xbb\\xfe\\xf1\\xa9\\x83\\xcc\\xe3\\x33\\xe1\\xd0\\xdf\\x3e\\x64\\x04\\xfb\\x90\\x43\\xc6\\x80\\x39\\x14\\xcd\\x5f\\xff\\xbc\\x66\\xa0\\x79\\x0c\\x78\\x78\\xa2\\x40\\x89\\xa5\\x71\\xf8\\x95\\x66\\x2a\\x1d\\x18\\xbe\\x3f\\x01\\xff\\x97\\xfb\\x33\\x23\\x33\\x4b\\x6f\\x5b\\xaf\\x96\\x55\\x14\\x48\\xe4\\x09\\x0d\\x03\\x3c\\x46\\x42\\x94\\xd0\\x91\\x33\\xb1\\x51\\xd5\\xb5\\xc6\\x32\\x1b\\x50\\xe2\\x24\\x1d\\xe0\\xef\\x6f\\x88\\x28\\x89\\xcc\\xf4\\xad\\x35\\x40\\xd5\\xa1\\xe3\\xf7\\x54\\x8f\\xb1\\x3b\\xe7\\x1c\\x16\\x51\\x66\\x06\\xe7\\x9d\\x04\\x49\\xc2\\xa0\\x8e\\x5d\\xc2\\x31\\x48\\x84\\x3c\\x84\\xe9\\x7e\\xd2\\x40\\x69\\x16\\x1c\\x8e\\x75\\x20\\x8f\\x33\\xe9\\x5b\\x3e\\x10\\xd1\\xd4\\x9a\\x2f\\xae\\xf9\\xd9\\x86\\xab\\x62\\x80\\x9f\\x62\\xad\\x39\\xc7\\xcc\\x87\\x1f\\x37\\x5a\\x4f\\x5a\\x6f\\xaf\\x10\\x4d\\x7e\\x11\\xb8\\x90\\xcf\\xb0\\x58\\x99\\x02\\x68\\x52\\x16\\xec\\x07\\xcb\\x8e\\x8e\\x9e\\x7a\\x7c\\x43\\x63\\x5e\\x23\\x21\\x2b\\x69\\xca\\x3b\\x7e\\xd5\\x4f\\x0b\\x97\\x94\\x9e\\x3d\\x9a\\x66\\x62\\xf8\\xe4\\xb3\\xab\\x09\\xcd\\x49\\x52\\x94\\xc3\\x31\\xc0\\x47\\xd8\\x6e\\xe7\\x85\\xff\\x65\\x8b\\xcd\\x7f\\xcf\\x9c\\x48\\x06\\x05\\xce\\x05\\xe8\\x10\\x06\\x8d\\x60\\xfc\\x9b\\x26\\xb5\\xf0\\x63\\xeb\\x90\\x00\\xd2\\x65\\x7a\\x50\\x94\\x28\\x4a\\xc8\\x0f\\x13\\x75\\xd0\\xb6\\x6d\\x6f\\x5f\"},\n{{0xad,0xc6,0xe9,0xb2,0xe1,0x03,0xb6,0x2c,0x24,0xad,0x43,0x46,0x41,0x0e,0x83,0xa1,0xa0,0xbd,0x25,0x3e,0x4a,0xbf,0x77,0x91,0x18,0x50,0xc6,0xd9,0x66,0x6e,0x09,0xf9,},{0xfc,0xe3,0x16,0xe3,0x3c,0x91,0x08,0x21,0xbe,0xed,0xdd,0x63,0x4b,0xed,0xc5,0x8e,0xe5,0x79,0x99,0xa7,0x6e,0xce,0x38,0x46,0x05,0x28,0x3b,0x99,0xb5,0x43,0xb7,0x8b,},{0xcb,0x01,0x7d,0x6d,0x26,0x82,0xc9,0x85,0x43,0x66,0x25,0x9a,0xa3,0x5f,0x30,0xd4,0x91,0xcf,0xaa,0x93,0x09,0x98,0xc2,0x97,0xdb,0xdd,0xc6,0xad,0xed,0x5b,0x3d,0x40,0x1c,0xf7,0x6d,0x80,0xd8,0xa2,0x76,0x4d,0xe1,0x31,0x71,0x8b,0x6e,0x0c,0x48,0x1d,0x71,0x96,0xbc,0x72,0x57,0x97,0x16,0xb0,0xc0,0xf6,0xff,0x05,0x3e,0x68,0xc5,0x0c,},\"\\x8c\\xcc\\xd9\\x8e\\xbb\\xf2\\x43\\x9f\\xfd\\xfa\\xc4\\x16\\x87\\x63\\x8f\\xaa\\x44\\x4e\\x1c\\xa4\\xb6\\x3d\\x13\\xe8\\x98\\xea\\xa8\\x35\\x54\\x92\\xf2\\x88\\x13\\xab\\x81\\x3f\\xd0\\x15\\x10\\xe1\\x12\\xbe\\x10\\x6b\\x20\\x45\\xd3\\x0f\\x63\\x33\\x5d\\x24\\x89\\x04\\xd5\\x21\\xde\\x18\\x1a\\xba\\xc0\\x3e\\x3d\\x2c\\xb2\\xd1\\x6c\\x44\\xb3\\xb0\\x12\\xa0\\xc5\\x1f\\x99\\x01\\xae\\xf9\\x05\\x6c\\x72\\x4d\\x7a\\x2c\\x6b\\x2a\\xcb\\x0a\\x07\\x55\\x59\\x40\\xe4\\xc6\\xe2\\x11\\x54\\x89\\x06\\x11\\xad\\xeb\\x64\\x89\\xf4\\x61\\xd3\\xe5\\xec\\xd1\\xaf\\x5a\\x4d\\x2b\\x0a\\xda\\xf4\\x17\\x47\\x43\\x6e\\xb4\\x14\\x75\\x7a\\x8f\\xe4\\x77\\x56\\x74\\xe3\\xc6\\xe5\\xde\\x45\\x69\\xd6\\xfc\\x6c\\x78\\x8e\\x10\\x90\\x5e\\xba\\x32\\xc2\\x70\\xa3\\x93\\xe6\\xf7\\x21\\xa7\\x65\\x29\\x4e\\x2a\\xc9\\x9a\\x9b\\x6e\\x53\\x4d\\x3d\\xf0\\x8d\\x1d\\xb9\\x7d\\x60\\x2a\\xc3\\x19\\x5c\\xb0\\xb7\\x7f\\x5b\\xd4\\xac\\xaf\\x73\\x7f\\xad\\xd6\\x99\\x1f\\x06\\x88\\xab\\xc7\\x49\\x18\\x04\\x75\\x74\\xea\\xc2\\x82\\x89\\x73\\x9a\\x66\\x4e\\x0e\\x0e\\x20\\x57\\x4a\\x2c\\x25\\xfd\\xe4\\x9d\\x14\\x53\\x9d\\xb1\\xce\\xdd\\x4a\\x92\\x04\\xa7\\x0a\\xcf\\xf0\\xa6\\x2c\\x8f\\x25\\xcd\\x76\\x8f\\xfa\\xb1\\x5c\\x4d\\xb3\\x16\\x84\\x0a\\x4d\\x1b\\xc9\\x2e\\x21\\x26\\x70\\xbe\\x07\\xc5\\xbd\\xcf\\x53\\x75\\x90\\x60\\x7d\\xfb\\xbb\\xb4\\xd9\\xf9\\x8b\\x89\\xda\\x0b\\x4d\\xf7\\xd8\\x8f\\x3e\\xca\\x48\\x14\\xd1\\x6b\\xfa\\x20\\xc8\\xd2\\xfa\\x94\\xf9\\xf2\\x59\\xf2\\xee\\x2d\\x3a\\x83\\xc9\\xe4\\x17\\x1b\\x1a\\x26\\x2c\\x4b\\x99\"},\n{{0x37,0xfc,0x1b,0xed,0xa4,0x06,0x0b,0x6c,0x57,0x88,0x3d,0xdb,0xa0,0x77,0x6c,0x2b,0xcf,0x5a,0xc2,0x8a,0x65,0x13,0x26,0x02,0x1c,0xca,0x97,0x72,0x37,0x30,0xfb,0xb0,},{0x7b,0xd7,0xbf,0x1c,0x99,0xdc,0x82,0xe0,0x6f,0x08,0xbb,0x45,0x4d,0x8f,0xb2,0x88,0xa5,0x79,0x27,0xe0,0x7f,0xf1,0xb1,0x2a,0xf1,0x5e,0xe2,0xc1,0x2f,0xbb,0x6b,0x3d,},{0xa0,0x1d,0xd6,0x5f,0xad,0xa2,0x70,0x39,0xf1,0x68,0xb1,0x23,0x41,0x9d,0x8a,0xbf,0xbd,0xa4,0x8c,0x57,0x2e,0xce,0x24,0xfd,0xa0,0x6e,0x1a,0x5e,0xc3,0x1e,0x08,0x4f,0x4e,0xe1,0xcb,0xf9,0x96,0x1e,0x88,0xed,0x51,0xe1,0x89,0xfc,0xb7,0xf5,0xf2,0x35,0xde,0x1e,0x5b,0x28,0xd0,0x8f,0x2b,0xfc,0xa1,0x90,0xb0,0xf0,0x19,0xec,0xc2,0x07,},\"\\x3d\\xfc\\xac\\x02\\x65\\xa0\\x24\\xa8\\x3c\\xb9\\x32\\x67\\x44\\x89\\xa1\\x63\\xaa\\xc3\\x14\\xbf\\x3d\\x96\\x9f\\x27\\x59\\x6e\\x45\\x17\\x33\\xb9\\x9d\\xeb\\xa5\\xee\\xb7\\x79\\x21\\x0b\\xaf\\x95\\xbf\\x54\\x5a\\x1a\\xe6\\xb8\\xa9\\x15\\x86\\x06\\x93\\xee\\x89\\x0f\\x93\\x93\\x20\\xe0\\x6a\\x84\\x44\\x83\\xd1\\x8c\\x6a\\x1b\\xcd\\x03\\xc6\\x38\\xbb\\x7d\\x1f\\xe2\\xa8\\x2e\\xb4\\x48\\xa3\\x11\\xb1\\x30\\x2e\\xa6\\x42\\x8f\\x54\\xa3\\x9f\\x45\\xa4\\xd5\\x60\\xbe\\x15\\x57\\xa2\\xb2\\x54\\xc4\\x5c\\x13\\x7f\\x45\\xcc\\x68\\x35\\x68\\x36\\xe2\\x1b\\xed\\x0b\\x7f\\x73\\xa5\\x18\\xce\\x09\\xdb\\x0b\\xe3\\x93\\x92\\x7c\\x33\\x9b\\xf2\\xa4\\xb5\\x98\\x75\\x39\\x40\\x4c\\xe6\\x50\\x28\\x4d\\xe1\\x2e\\x3b\\x55\\x3b\\x26\\x2e\\xfe\\x23\\x84\\x83\\x32\\xcc\\xfd\\xc3\\x5e\\x79\\x1a\\x0a\\xb4\\x3f\\x13\\x9c\\x71\\xed\\x0f\\xcb\\x2d\\x17\\x3b\\xb3\\x77\\xee\\x46\\xb1\\xa9\\xdc\\xa9\\x27\\x7e\\x77\\xdf\\x85\\x5f\\x28\\x30\\x25\\x1e\\x31\\xe2\\x6a\\xcd\\x86\\x76\\x3c\\x8d\\x7e\\xac\\x22\\xc8\\x82\\xfc\\x17\\x4f\\x2b\\x5e\\x75\\xca\\x6a\\xd1\\xad\\xe0\\x3f\\x94\\x2b\\xb2\\xa1\\x3b\\xf5\\x41\\x90\\x61\\x59\\x15\\x8c\\x68\\x36\\x3c\\x74\\x80\\xc5\\xb2\\x7a\\x99\\x32\\x0f\\x82\\x83\\xa2\\x69\\x9d\\x43\\x69\\xc0\\x71\\xc5\\x0d\\xbd\\x90\\xb7\\x79\\x2e\\x47\\x72\\xef\\xbc\\x0b\\x19\\x5b\\xce\\x84\\xcc\\x4d\\xcf\\xff\\x70\\x72\\xa4\\x89\\x68\\xdb\\x69\\xf9\\xfe\\xdd\\xd0\\xf9\\xce\\xd6\\x59\\xeb\\x5d\\xb7\\x16\\x7f\\x35\\xf9\\x88\\xce\\xc1\\x14\\x88\\x7d\\xcb\\xfd\\xf2\\x7d\\x02\\xd3\\x00\\xb3\\xe1\\xab\\xec\"},\n{{0x8d,0x42,0xf4,0xdd,0xd2,0xbb,0xd2,0xb8,0x27,0xb0,0xa0,0xd3,0x1d,0x8f,0x75,0x8e,0xbd,0x13,0xa1,0xb9,0xb3,0x71,0x22,0x28,0x94,0x8c,0xa6,0x10,0xbb,0x88,0x58,0xe5,},{0xb7,0x35,0x48,0x98,0x79,0x4f,0x9d,0xb0,0xa8,0xaf,0x6e,0xea,0xfc,0xdb,0xdf,0x01,0x1d,0x3f,0xbe,0xf0,0x21,0x2a,0xd9,0x38,0xa4,0xa4,0xad,0x27,0xab,0x16,0xeb,0xbf,},{0x70,0x76,0x4b,0xe3,0x9c,0x6d,0xca,0x0f,0x06,0x7a,0xbe,0x1e,0xca,0x49,0x0f,0xda,0x95,0x1f,0xd4,0xe9,0x49,0x96,0x95,0x26,0x6e,0x27,0x0b,0x9b,0x05,0xea,0xe7,0x06,0xca,0x8d,0x1c,0xa6,0xa9,0x2d,0x7c,0x48,0x8e,0xc6,0xad,0x8b,0xa1,0x14,0x57,0xa4,0x2a,0x5e,0x31,0x70,0x2a,0x9c,0x2b,0xce,0x89,0x2d,0xc4,0x05,0x35,0xc0,0x9f,0x01,},\"\\xe3\\xa2\\xbe\\xbc\\x04\\x96\\xd8\\x97\\x4a\\x8f\\x40\\x61\\x88\\x03\\x69\\x31\\x4e\\xd9\\xe4\\x40\\xc1\\xb7\\x7e\\x26\\xfe\\x50\\x71\\xce\\x69\\x4f\\xfd\\x21\\x36\\xdb\\x0c\\x4d\\x5e\\x88\\x0e\\x60\\x00\\x08\\x3a\\x75\\xc9\\x0d\\x3c\\xf7\\x2b\\x9c\\xf5\\xa2\\xb1\\xa9\\x00\\x2c\\x27\\x01\\xa2\\xff\\x59\\xb0\\x69\\x9a\\x8f\\x42\\xd7\\x9d\\xd8\\xa5\\xfb\\x71\\xa8\\x12\\x54\\x53\\xd9\\x1f\\xb8\\x00\\x80\\xa3\\xf0\\xa1\\x65\\x84\\x28\\x2f\\x17\\xec\\x7d\\xfd\\xc2\\xe5\\xc6\\x9c\\x4d\\x9b\\xdf\\x48\\x4d\\x55\\x94\\x4d\\xae\\x27\\x3f\\x21\\x1c\\xfb\\x76\\xad\\x37\\xda\\x45\\x87\\x13\\x65\\x43\\x9a\\xf3\\x5e\\xea\\x1f\\xbe\\xcd\\x4c\\xa6\\x79\\xb5\\x9b\\x5e\\x01\\xba\\xcf\\x49\\xc7\\xf4\\xe5\\xef\\xaa\\x40\\x6b\\xa1\\xda\\xeb\\x08\\x54\\x82\\xaf\\x5d\\xed\\x89\\xdc\\x68\\x85\\xff\\xbe\\x3d\\x14\\xd2\\x93\\x1b\\x83\\x89\\x7e\\x28\\xad\\x06\\xe5\\x56\\x4e\\x27\\x89\\xba\\xea\\x81\\xbd\\x93\\x2a\\xa2\\x79\\xfe\\x8e\\x32\\x4b\\x9a\\x8e\\xf1\\x11\\xc2\\xab\\xe2\\xf1\\x37\\xd4\\xbb\\x50\\xd8\\xab\\x76\\xce\\xbc\\x0b\\xd9\\x82\\xa2\\x39\\x19\\x75\\x1a\\xd4\\xd4\\x9e\\x88\\xeb\\x14\\x17\\x3d\\x33\\x10\\x28\\x9a\\x87\\x23\\x17\\xe4\\xa4\\x51\\xe8\\x8d\\x54\\x32\\x08\\x91\\x87\\x0f\\x15\\xb2\\xd5\\x33\\x24\\x43\\x08\\x77\\xa9\\xfb\\x5b\\x49\\xbb\\x92\\x9f\\x21\\x1c\\x5b\\x89\\x76\\x4d\\xd9\\xc3\\xa5\\x95\\xa1\\x45\\x1e\\x9f\\x85\\xa2\\x38\\x54\\x00\\x02\\x56\\x6e\\x53\\xa9\\x9e\\xd1\\xe6\\xdd\\xc9\\xb4\\x85\\x3f\\x45\\x5e\\xdb\\x4c\\xf1\\x98\\x0d\\x56\\xbb\\xdc\\x13\\x13\\xa3\\x6e\\x76\\xea\\x9c\\xbb\\x04\\x8a\"},\n{{0xb6,0x2d,0xe5,0xa1,0xac,0xfe,0x4c,0xa2,0xd1,0xf0,0xc1,0x32,0xaf,0xcb,0xda,0xe6,0x6f,0xb2,0x9a,0x02,0xf2,0x97,0xfb,0xc2,0x40,0x7f,0xad,0xbb,0xf2,0x45,0x42,0x00,},{0xb6,0x3b,0x2d,0x0b,0xf3,0x55,0xf7,0xb6,0xd0,0xba,0xc0,0x74,0x03,0x41,0x1c,0x40,0xaf,0xbb,0xb2,0xf7,0x07,0x50,0x3b,0x3f,0xc2,0xce,0xe8,0xa1,0xc7,0xd0,0xa8,0x38,},{0x5c,0xdb,0x00,0xe9,0x8d,0xe7,0x3e,0xab,0x48,0x0b,0xe4,0x2f,0x8a,0x8a,0x61,0x63,0x80,0x9a,0x0d,0x37,0x10,0x1b,0x6a,0x5a,0x4e,0xed,0x6a,0x0c,0x92,0x03,0x0d,0x09,0xa5,0x56,0x2c,0x72,0x90,0x80,0xce,0x6f,0x65,0x94,0xc8,0xfa,0xfb,0x1f,0x59,0x47,0x72,0xdb,0x7a,0x90,0xa9,0xe7,0xda,0x15,0x89,0x6e,0x82,0xf7,0x05,0x69,0x39,0x0d,},\"\\xe6\\x59\\xe5\\x1d\\x7b\\x19\\x3c\\x4b\\x8e\\x2b\\x3e\\xd7\\x3a\\x9d\\x75\\x57\\xed\\x2b\\xab\\x61\\x53\\x88\\x3a\\xb7\\x23\\x59\\x2f\\x73\\x0a\\x91\\x45\\x67\\x14\\x2b\\x3f\\xa4\\x35\\xdb\\x32\\x19\\xf8\\x3a\\x54\\x2d\\xc7\\xa4\\xbd\\x80\\x5a\\xf6\\x66\\xea\\x86\\x5b\\x85\\x31\\x46\\xf8\\xe3\\xa9\\xfe\\x87\\x07\\x11\\xf9\\x0d\\x12\\xb0\\x69\\x34\\x92\\xaf\\x2a\\x1e\\xdf\\x99\\xa1\\x64\\x58\\xf7\\x81\\xf1\\x26\\x6e\\xc4\\x37\\xa5\\x29\\x6a\\x82\\x2c\\xa9\\xd6\\x9c\\xe8\\x44\\xb5\\xc5\\x90\\x97\\xa2\\xa5\\x6f\\x3e\\xb8\\xfd\\x27\\x3a\\x63\\x61\\x16\\xdb\\x77\\x43\\x00\\x92\\x2d\\x45\\xb7\\x44\\x65\\x7a\\x69\\x2f\\x5e\\x8b\\xfb\\xcb\\x06\\xd2\\x42\\x28\\x18\\xae\\xb5\\x1e\\x7c\\xda\\x68\\xac\\xfb\\xed\\xa1\\x6e\\x7c\\x79\\x58\\x0d\\xcc\\xcd\\xe2\\x4e\\x8e\\x3d\\x60\\x1b\\x16\\xe0\\x63\\xb4\\x3a\\x6d\\x0d\\x14\\x07\\x55\\x2f\\x75\\x04\\xf5\\xbe\\x19\\x88\\x2e\\x4f\\xfe\\x32\\x34\\x4f\\x5f\\x47\\x3e\\x73\\xa8\\xf6\\xed\\x37\\xb0\\xd8\\xd9\\xe5\\xe0\\xa0\\xdc\\x98\\x28\\x39\\x5b\\xcb\\xd8\\xf3\\xa4\\xe3\\x12\\x48\\x69\\x24\\x9d\\x05\\x8b\\xe0\\xe0\\x45\\xde\\x0b\\x1e\\x12\\xb1\\xc8\\x3b\\xa0\\xaa\\x22\\x7c\\x95\\xb8\\x2b\\xf7\\x42\\xc3\\xea\\xc0\\x15\\x2b\\x33\\xe6\\xd1\\x9b\\xe8\\xb3\\x3a\\x35\\xbf\\x70\\x5d\\xaa\\xb1\\x06\\x22\\xa9\\x0a\\xed\\x02\\x2e\\xa6\\xe4\\x39\\xed\\x50\\xa9\\x30\\x84\\x37\\x92\\x99\\x24\\xba\\x3a\\xb1\\x11\\xad\\x0c\\xaa\\x6f\\xeb\\x0a\\x6e\\xb1\\x65\\x82\\x4e\\xbd\\xb0\\x86\\x65\\x71\\xef\\xc0\\x7e\\x52\\x22\\xed\\x86\\x86\\xb1\\x4d\\x92\\x70\\xbf\\x76\\xb9\\x45\\xd5\\x20\\x14\"},\n{{0x97,0x32,0x05,0x9d,0x7b,0xf0,0x20,0x0f,0x5f,0x30,0x41,0x24,0x30,0x33,0x6b,0xe4,0xef,0x1e,0x3c,0xae,0x62,0x93,0x8a,0xd0,0x87,0x29,0xce,0x3b,0xa7,0x14,0xcf,0xd4,},{0x0d,0xe8,0x42,0x5f,0x5e,0x30,0xb2,0xb8,0xae,0xbb,0x80,0x72,0x00,0x9a,0x30,0xcf,0x04,0x11,0xc3,0xc8,0x23,0x8f,0x4e,0x42,0x08,0x76,0x0c,0x56,0xc3,0x3e,0x43,0x4f,},{0xfb,0xa1,0x74,0x9b,0x64,0x1d,0xd4,0xdf,0x34,0x66,0x4b,0xc4,0x3c,0x00,0x46,0x8c,0x7d,0x75,0xe8,0x4a,0xfa,0xd7,0x2d,0xe4,0x73,0xfd,0x1e,0x9c,0x87,0xda,0x15,0xea,0x60,0x4f,0xc2,0x54,0x9a,0x1a,0x86,0x7f,0xa8,0x08,0x50,0xe9,0xc2,0xa5,0x9c,0xd9,0x90,0x53,0x88,0x67,0x60,0xa8,0xd9,0x76,0x4b,0x84,0xdd,0x67,0x26,0x76,0x72,0x0d,},\"\\x1a\\x13\\xe7\\xab\\x60\\x3b\\x48\\xeb\\x89\\x6f\\xe1\\x71\\x73\\xfb\\x31\\x95\\x0b\\x0d\\xcd\\x5a\\x35\\xff\\xdb\\xe1\\x37\\x1c\\x7a\\x5b\\xfb\\xa5\\x93\\x31\\x75\\x89\\xd9\\x65\\x2d\\x88\\x79\\x77\\x29\\x18\\x0b\\x8d\\x0e\\x51\\x5a\\xbf\\xe6\\x54\\x8f\\x16\\x04\\x21\\xe5\\x37\\xd5\\xc9\\x4a\\xef\\x2b\\x34\\xc7\\xeb\\xb0\\x97\\x42\\x00\\x03\\xbc\\x0f\\x36\\x1b\\x42\\x3e\\x7e\\x14\\x63\\x0a\\x80\\x3c\\x11\\x82\\x02\\x54\\x00\\x49\\xf6\\x8c\\x9c\\xf4\\x6f\\xae\\x03\\x68\\xd1\\x62\\xe4\\x00\\xd7\\x7b\\xb4\\x52\\x3c\\xf6\\xc7\\x53\\xb9\\x75\\xc2\\x45\\xbc\\x99\\xed\\x2f\\x41\\x3a\\x9d\\x06\\xc2\\xda\\x6c\\xe0\\xcc\\x09\\x87\\xb6\\x40\\x6b\\x80\\x9e\\x8e\\xb3\\x19\\x03\\x3d\\x2d\\xe9\\x13\\x1d\\xee\\x3b\\x1b\\x7b\\x5c\\x95\\xd6\\x53\\xce\\xd8\\xfc\\xcf\\x99\\x8d\\xa1\\x76\\x85\\x11\\xec\\xa4\\xd3\\xc5\\xf7\\x35\\xad\\xab\\x96\\x50\\x3b\\x35\\x51\\x80\\x3e\\x49\\x22\\x63\\x50\\x95\\xef\\x81\\x1b\\xe4\\xc0\\x8a\\x6c\\xba\\xc9\\x17\\xcb\\xe6\\xcd\\x91\\xa4\\xae\\x5a\\x33\\x0c\\xce\\xc0\\xe8\\xe8\\x15\\x37\\x12\\x17\\xa3\\xde\\x62\\xf2\\xd2\\xd6\\x14\\x66\\x21\\x98\\x33\\xf3\\x34\\x47\\x13\\x2f\\x4d\\x43\\x35\\x0c\\x58\\xcb\\xaf\\x42\\x24\\x75\\xed\\xb1\\x28\\xc5\\x6d\\x80\\xa4\\x95\\x72\\x6b\\x1f\\xdb\\xc5\\x65\\x51\\xeb\\x72\\xd0\\xf4\\xfe\\xc2\\x6b\\xa8\\xbf\\xf5\\xee\\xd6\\x77\\x4b\\x85\\x03\\x9a\\x52\\x92\\x83\\x4b\\x5d\\x1c\\xc1\\xb0\\x9b\\xa0\\xa3\\x95\\x4d\\x29\\x32\\x36\\x73\\xf5\\xe7\\x12\\x76\\xa1\\x2a\\xc4\\xc5\\x79\\x35\\x5b\\xf1\\xec\\xca\\x48\\xe6\\xa7\\x16\\xb9\\xfc\\xec\\xdc\\x56\\x5c\\x51\\xb9\"},\n{{0x9c,0x7f,0x6f,0x37,0x9e,0x38,0x57,0x00,0x7e,0x2a,0xc6,0x32,0x4c,0xbb,0xce,0xd5,0x7a,0xc9,0xee,0xe4,0x47,0x78,0x13,0xf8,0x3a,0x81,0xfc,0x8c,0xef,0xa9,0x64,0xd5,},{0xa5,0x4b,0xa3,0x96,0xd6,0x87,0x63,0x4d,0x3e,0xcc,0xf4,0x1c,0x57,0x82,0x49,0x4f,0x5f,0x10,0xa5,0x21,0xa1,0xe5,0xd3,0x88,0x52,0x3d,0x80,0xee,0xba,0x5b,0x0b,0x2b,},{0x65,0x68,0x5f,0x9c,0xa5,0x98,0x2e,0x15,0xa2,0x2b,0xa3,0xc8,0x3a,0x03,0x48,0x34,0x84,0x82,0xdf,0xae,0x57,0xce,0xa1,0x78,0xf0,0x78,0x0c,0x05,0x7b,0xae,0xbe,0x4a,0xf6,0x32,0xf9,0x84,0x54,0x0a,0x26,0x01,0x9a,0x7f,0xb3,0x42,0x53,0xc9,0xec,0xe7,0xff,0x30,0x8a,0xda,0x23,0x3c,0xe0,0x68,0x63,0x47,0xab,0x5b,0x21,0xce,0x57,0x0b,},\"\\x3f\\x2d\\x30\\x72\\xfe\\x73\\x83\\xe5\\x41\\x55\\x1e\\xa9\\xab\\xdb\\xae\\xae\\x6a\\x46\\x4a\\xe6\\xb9\\xf0\\xba\\x78\\x6a\\x44\\x1b\\x2d\\x08\\xda\\x5b\\xca\\xda\\x3c\\x54\\x24\\xdc\\x69\\x31\\xd6\\xb3\\x95\\x23\\xe2\\xde\\x0a\\x0c\\x2e\\x4e\\x6b\\x5b\\x8c\\xda\\x92\\x5e\\x5e\\xac\\x93\\x84\\x16\\xa2\\xc5\\x1b\\xf1\\x3d\\x49\\x53\\x1d\\x7e\\xc7\\x11\\x4b\\x1c\\x82\\xfe\\xaf\\x90\\xf3\\xf8\\x75\\x91\\xe3\\x97\\xd0\\x27\\x02\\xf8\\xec\\x1b\\x30\\xd9\\x9f\\x5b\\xe7\\xd2\\x20\\x3e\\x4f\\xe4\\xdb\\x2e\\xa4\\x7e\\x7b\\x45\\x89\\xd8\\xac\\x50\\x62\\x48\\xd7\\x34\\x74\\x66\\xed\\xbc\\x96\\xea\\x32\\xbf\\x3a\\x6e\\xa7\\x50\\x2d\\xd6\\x0c\\x9e\\x84\\x90\\x27\\x15\\xab\\x2c\\x6c\\xa6\\x8f\\x5b\\x00\\xe1\\xd9\\x09\\xd8\\x3a\\xa6\\xab\\x66\\x2d\\x8a\\xea\\x87\\x0e\\xcd\\x86\\x1f\\xec\\x69\\xf2\\xee\\xc0\\xae\\x67\\x7d\\x29\\x95\\xb0\\xed\\x68\\x8f\\xaa\\x8e\\xf7\\x82\\x44\\xe0\\xd1\\x19\\x56\\x97\\xb0\\x71\\x22\\xce\\xaa\\x11\\xf5\\xa6\\xea\\x58\\xfb\\xdf\\xa2\\xe2\\xec\\x2d\\xf9\\xd1\\x86\\x93\\xae\\x96\\xd4\\x71\\x27\\x55\\x6e\\x91\\xf0\\x86\\x49\\x82\\xc1\\x34\\x19\\xb0\\x4a\\x63\\xf2\\x08\\xe7\\x30\\xd2\\x69\\x51\\x88\\x2a\\xef\\xe0\\x01\\xbc\\xa3\\x40\\x8b\\xd9\\x86\\x27\\x48\\xc6\\xcc\\x87\\x6c\\x28\\xca\\xc3\\xbb\\x2e\\xb3\\x39\\x58\\x18\\xc2\\x09\\x1e\\x0f\\xbd\\x7a\\x0b\\x44\\x68\\xc6\\xb0\\xd0\\x0c\\xd0\\x08\\xc1\\x1c\\x3c\\x3a\\xd0\\x10\\x80\\xa1\\xf5\\xa4\\x0a\\xe2\\xe4\\xb0\\xc3\\xa0\\x71\\xef\\xc8\\xe1\\xd1\\xba\\x6a\\xce\\x6d\\x4d\\xf0\\xff\\x19\\x82\\x9b\\x0c\\x68\\x0b\\x3a\\xeb\\x75\\x91\\x77\\xed\\x34\"},\n{{0xa4,0x78,0xf3,0x5a,0xbb,0x73,0x72,0x7b,0x6b,0xe6,0xee,0x5e,0x56,0xee,0xc3,0x23,0xc9,0x51,0x78,0x82,0xfd,0x69,0x19,0x36,0x0e,0xbb,0xbf,0x5d,0x5c,0xb8,0xb8,0x3a,},{0x7a,0x6e,0x26,0x6a,0x54,0xd1,0x35,0xdd,0xa0,0x00,0x9c,0xcd,0xa8,0xa9,0x4a,0x47,0x12,0xae,0x5c,0xb1,0x47,0x61,0xe8,0x43,0x6e,0x97,0xc4,0xb7,0x81,0x4d,0x8e,0x8c,},{0x9d,0x16,0xfd,0x40,0xb9,0xf8,0xdd,0x9b,0x4a,0x1a,0x8c,0x6d,0x70,0x3b,0x9f,0xcc,0xbb,0x94,0x0b,0x1e,0x0a,0xe7,0x7a,0x59,0x70,0x37,0x4a,0xf0,0xcf,0x72,0x6f,0x44,0x79,0xfd,0x30,0xd7,0xdf,0xf5,0xcf,0x53,0x49,0x4d,0x9a,0x29,0x6a,0xb6,0xb9,0xe4,0x6e,0xa6,0xc1,0x36,0xb4,0xdb,0x2c,0x71,0xc2,0x1b,0x97,0xc1,0xc8,0x25,0x4d,0x0a,},\"\\x01\\x73\\xa3\\x40\\x50\\xb4\\x37\\x48\\x06\\x1f\\xf8\\xf5\\xa3\\xd7\\xc4\\x3b\\x63\\x60\\x84\\x77\\x86\\xe8\\xbb\\x75\\xe5\\x36\\xfb\\x47\\xb6\\x45\\xb2\\x14\\xf2\\x21\\xba\\x24\\xd8\\x3d\\x28\\xbc\\x02\\x50\\x24\\x66\\x3e\\x53\\x4f\\x90\\xf6\\xe8\\x3a\\x93\\xd8\\xbd\\xde\\xda\\x2c\\xd8\\x80\\x81\\x55\\x65\\x2a\\x90\\x8c\\x43\\x7c\\x2d\\xb6\\xf3\\xed\\x49\\x12\\xf5\\x7c\\xa5\\xb9\\x79\\x28\\xa7\\x3b\\xe9\\x64\\xaf\\x59\\xdf\\x44\\x39\\x85\\x4b\\xb0\\x06\\xfc\\x29\\x5a\\x87\\xb7\\xb7\\x22\\x39\\xc7\\xfa\\xdf\\xec\\x40\\x71\\x55\\x09\\xd9\\x85\\x79\\xda\\xad\\xfb\\x8d\\x52\\x4b\\x4c\\xec\\x66\\x20\\x70\\x5e\\xfd\\x41\\x04\\xc2\\x97\\x14\\x4a\\xea\\x72\\x29\\x74\\xe1\\x2c\\x5e\\xce\\xe5\\x39\\x1e\\xf2\\xd9\\x3a\\xc2\\xb1\\x24\\xe4\\xac\\x49\\x61\\x47\\xc8\\xb7\\x03\\x63\\x58\\x5d\\x70\\x78\\xcc\\xc5\\x3e\\x2a\\xe5\\x93\\x35\\x0b\\xc2\\x55\\x48\\xa0\\x54\\x25\\x26\\xab\\x00\\xaf\\xe4\\x77\\xa0\\xf4\\xb2\\x73\\x97\\xc7\\x2b\\xc7\\x4a\\x8a\\x8a\\xb1\\x56\\xe6\\x2b\\x8b\\xb4\\x7c\\x3f\\xbb\\x4b\\x34\\x91\\x3e\\x45\\x96\\x87\\x47\\x6b\\xf3\\x31\\x42\\xc6\\x14\\x70\\x21\\x07\\xff\\xe2\\xcc\\x01\\xe2\\x5f\\xa3\\x02\\x75\\xe1\\xe2\\xe6\\x3c\\xea\\x91\\x68\\xe4\\xa4\\x7c\\x02\\xde\\x09\\x7d\\x4d\\x85\\x3b\\x27\\x67\\x5c\\x5b\\xb3\\x30\\xb9\\x4a\\x97\\x4e\\xad\\x85\\xe2\\xbd\\xee\\x8e\\xe1\\x7c\\xbb\\x56\\x53\\x34\\x66\\x58\\xdf\\x2f\\x91\\xf6\\xbd\\x73\\x94\\x91\\xdd\\x71\\x98\\x8b\\x3a\\x97\\x6a\\x3e\\x2e\\x7a\\x9d\\x13\\x74\\x10\\xf4\\xac\\xba\\x9f\\xeb\\x5f\\x11\\x79\\x8c\\x9a\\x43\\xb6\\xad\\xce\\x14\\x36\\x5a\\x7c\\x6d\"},\n{{0xff,0xe8,0x25,0x14,0x8c,0x09,0x59,0xb3,0xa6,0x8d,0xe8,0x6a,0xd8,0xe8,0xaf,0x7f,0xa5,0xe0,0x78,0xf3,0x63,0xdc,0x12,0x42,0x13,0xc9,0x00,0x20,0xda,0x0c,0x90,0x89,},{0x13,0x91,0x52,0xa0,0xbd,0x22,0x96,0x2d,0xd9,0x19,0xae,0x3e,0x0b,0x16,0x20,0xe0,0x3c,0x03,0x3c,0x2a,0xd0,0xa3,0x97,0x9e,0xc6,0xbc,0xd1,0x70,0x5e,0x23,0xd5,0x98,},{0xfe,0x4e,0x89,0xee,0x31,0x78,0x6c,0x0a,0x3d,0x3d,0xe3,0x64,0x9b,0xb9,0x3f,0x0b,0x8a,0xef,0x1c,0xaf,0x5a,0x83,0x2e,0xc5,0xe4,0x06,0x78,0x10,0x70,0x5a,0xdd,0xdf,0x53,0x9b,0x8f,0x4e,0x05,0xad,0x08,0xcf,0x34,0x79,0xe4,0x5b,0x42,0xc9,0x65,0x28,0xf6,0xd5,0x9a,0x46,0x25,0x70,0x3d,0xdb,0xf1,0x5b,0x63,0x09,0x39,0x65,0xd8,0x0d,},\"\\xf1\\x25\\x78\\x0d\\x0c\\xd0\\x88\\x53\\x0f\\x0c\\x87\\xb7\\x0b\\xd4\\x2e\\xba\\xb5\\x6a\\xdb\\x5a\\xd4\\x34\\x5f\\x92\\x9a\\xe5\\xde\\xae\\x07\\xfb\\x55\\x32\\x21\\x53\\xa8\\xf0\\x23\\xd3\\x88\\x43\\xbf\\x5d\\x6a\\x93\\xfe\\x99\\x3e\\xee\\x71\\xbc\\x2e\\xe5\\x63\\xb2\\x5a\\x50\\x91\\x8f\\x03\\xef\\xdb\\x5d\\xbf\\x72\\x69\\xad\\xd6\\x9d\\xed\\x3e\\x66\\x95\\x38\\x95\\x62\\x0d\\x9b\\x6c\\xf4\\x6b\\xa2\\x34\\x8f\\x8d\\x66\\xd7\\xf0\\x92\\x23\\x5e\\x37\\x8c\\x1e\\x3e\\xdf\\xeb\\xeb\\x78\\x08\\x4b\\xc8\\xde\\xa0\\x13\\xf9\\x93\\x3a\\xae\\x14\\xa0\\x41\\x94\\x82\\x76\\xd0\\x1f\\x1c\\xb5\\x83\\x4b\\x0e\\x59\\x0e\\x13\\xd9\\x31\\xd1\\x92\\x92\\xbb\\x1d\\x80\\x41\\xff\\x2f\\xe2\\xe1\\x17\\x1a\\x2e\\x0b\\x9a\\x05\\x98\\x21\\xd0\\x92\\x4d\\xde\\x7f\\x3b\\x1b\\xb5\\x98\\x13\\xf5\\xe3\\xc6\\x35\\x20\\xaa\\xfb\\x88\\x01\\xba\\x62\\xc7\\x09\\x7d\\x4d\\x8c\\xf4\\x37\\xa5\\x68\\xa7\\xf0\\x08\\x7c\\x6e\\xa0\\xfc\\xe6\\xe5\\x68\\xc4\\x88\\x3f\\x1c\\xd1\\x2c\\x74\\x9d\\x06\\xa6\\xfe\\xb2\\x78\\xf1\\x08\\x6a\\x8b\\x04\\x76\\x99\\x21\\xf7\\x8a\\x99\\x59\\x06\\x2a\\xb0\\x6f\\x98\\xee\\x80\\xc2\\xc7\\x85\\x4f\\xfa\\x76\\x0f\\x86\\xa8\\x9e\\xe1\\xa5\\x12\\x66\\x05\\x3d\\x19\\x5e\\x61\\xbb\\x1d\\xbd\\x18\\xdd\\x89\\xff\\x39\\x4e\\x40\\x8a\\xce\\x0f\\x64\\x1a\\x39\\x5d\\x56\\x11\\x8e\\xa7\\x2b\\x7d\\x8a\\xdf\\x78\\xb1\\x65\\x5e\\xce\\xce\\x7e\\x82\\x50\\xe8\\xa3\\xa9\\x1c\\xb8\\xfc\\xa0\\xd9\\xce\\x0b\\xaf\\x89\\x80\\xa3\\x87\\xc5\\xed\\x43\\x18\\x66\\x32\\x80\\xe5\\xb4\\x53\\x1f\\x31\\x87\\xc4\\x7e\\xae\\xa7\\xc3\\x29\\x72\\x8d\\xdd\\x0e\\x40\"},\n{{0x49,0xaf,0xf4,0x21,0xa7,0xcd,0x12,0x72,0x2a,0xa8,0x4c,0x48,0xc1,0xfb,0x1c,0x5f,0x8d,0x9e,0x27,0x7d,0x0a,0x99,0xec,0xbc,0x93,0x48,0xc3,0xaa,0xa7,0x4b,0xe4,0x22,},{0x88,0xd2,0xc2,0x62,0x66,0xf4,0x93,0xbc,0x67,0x57,0x8c,0xa0,0xb1,0xf5,0x11,0x60,0xcf,0x0f,0xdb,0x6a,0x09,0xa9,0x06,0xdb,0x9f,0xaa,0x68,0x6f,0x11,0xf8,0x20,0x8d,},{0x74,0x91,0x81,0x28,0x4d,0xf0,0x5d,0xbe,0x59,0x74,0xb9,0x17,0x82,0xa1,0xa7,0x6e,0xa0,0x86,0x42,0xcb,0x0f,0x0c,0x98,0xdb,0x58,0x6c,0x57,0x5c,0x21,0x0c,0xdc,0x8b,0x65,0x1b,0xd3,0x4b,0x75,0x7a,0xe3,0x8e,0x4b,0x6b,0xe9,0x46,0x52,0x35,0xbd,0x0e,0xca,0x43,0x0e,0x26,0xc3,0xee,0xde,0x56,0x1c,0x6e,0x82,0x4d,0xfa,0x20,0x0e,0x0a,},\"\\x70\\xa1\\xac\\x14\\x4b\\x75\\xfd\\xa7\\x55\\x86\\xa7\\x9c\\x36\\xfd\\x39\\xcc\\xe5\\xf5\\xca\\xe2\\xe6\\x37\\x58\\x52\\xd3\\xb6\\x2a\\x96\\x30\\x33\\x6a\\x29\\x3e\\xa6\\xd2\\xac\\x6e\\x5b\\x57\\xda\\x21\\xef\\x36\\x4a\\x59\\x5b\\xb0\\x75\\x0f\\x5b\\xf4\\xd2\\xb3\\x20\\x67\\x64\\x23\\x87\\x0e\\x4b\\x8e\\x08\\x69\\x60\\x1f\\x16\\x68\\x06\\x19\\x04\\x8c\\x4e\\xde\\x27\\x6d\\xa6\\x9f\\x20\\x5a\\x70\\x17\\x6e\\x25\\xea\\x04\\xbd\\x08\\x97\\x63\\xe7\\x09\\xba\\x34\\x3f\\xc8\\x83\\x1e\\x52\\x04\\x4e\\xab\\xf9\\x44\\x1e\\x69\\x97\\xf8\\xba\\x1a\\xeb\\x9e\\xf0\\xf4\\x91\\x17\\x06\\x67\\xa7\\xf5\\xfc\\x96\\x27\\xcb\\xd0\\x55\\x1b\\x76\\xbe\\x27\\x28\\x3a\\x4b\\x0c\\x5f\\x66\\x78\\x46\\x68\\x82\\x26\\xa1\\x15\\xee\\x80\\x20\\xdf\\x08\\x04\\x2b\\x19\\xb5\\x9f\\xe5\\x51\\x31\\x6a\\x6c\\xb6\\x91\\x68\\x60\\xb9\\xec\\xd7\\x41\\x54\\xb4\\x05\\x10\\x38\\xa1\\x73\\x52\\x37\\x2e\\xc1\\x4d\\x3c\\x95\\x7d\\x2e\\xf5\\x0f\\xf7\\x86\\x18\\x9a\\x8a\\xeb\\x9c\\x08\\xf4\\x5e\\xeb\\x5e\\xb8\\xb0\\x40\\x33\\x99\\x74\\xaa\\x97\\x98\\xc4\\x25\\xd7\\xbe\\xcb\\x22\\x8c\\x44\\x7a\\x6d\\x0b\\x3c\\xef\\x27\\x18\\x93\\xe0\\xf7\\x07\\x6e\\x22\\x3a\\x7e\\x87\\xc6\\xa3\\xd2\\x70\\xa0\\x33\\xbc\\x97\\xa4\\x56\\x5e\\xdc\\xe0\\xaa\\x91\\xff\\xc3\\xf7\\x80\\x17\\x75\\xa6\\xf2\\x9b\\x23\\x02\\x45\\xbd\\x71\\xfa\\x03\\x43\\x53\\xde\\x37\\x23\\x95\\xd1\\xbf\\xcb\\xde\\xbb\\xa0\\x81\\x33\\x0f\\x7c\\x07\\x6b\\xe9\\x9c\\x2c\\xf4\\x86\\x7f\\x15\\xb7\\x8d\\x52\\xf4\\x6f\\xc7\\x39\\x1c\\x9c\\xb9\\x5e\\x5d\\x64\\x64\\x3b\\xaf\\xfe\\x72\\xa8\\xe3\\xa6\\x50\\x66\\x7f\\xbb\\x3e\"},\n{{0x70,0x3a,0x6e,0x2b,0x62,0xd0,0x09,0x0c,0x61,0xd8,0x65,0x9b,0x6a,0x96,0x3e,0x03,0xc9,0xd6,0x2c,0x1b,0x38,0xf7,0xd7,0x0e,0x5f,0x9f,0xf0,0x55,0x90,0xcd,0x03,0x60,},{0x37,0x0c,0x21,0xde,0x6e,0xf2,0xfa,0xb5,0x34,0xad,0xa9,0x99,0x86,0x9c,0x90,0xbc,0x9b,0x92,0xcc,0xbf,0x24,0x9b,0x79,0xd3,0x9d,0x95,0x44,0x1d,0x1e,0xde,0x21,0x0a,},{0xe5,0xfd,0x64,0xda,0x02,0x88,0x00,0xc6,0xce,0xed,0x06,0x8a,0x5e,0x59,0x6f,0x16,0x21,0xc7,0x0a,0x8c,0xb1,0x38,0xb3,0x1b,0x32,0x64,0x7e,0xb4,0xb0,0x7b,0xd2,0xec,0xc5,0x94,0x2c,0x18,0x84,0x4f,0x36,0x70,0x33,0xf6,0x73,0x98,0xe3,0x14,0xba,0x2c,0x7c,0xcf,0x29,0x9c,0x06,0x97,0x87,0x77,0x70,0x25,0xd8,0x45,0xf2,0xaa,0xd6,0x0e,},\"\\xd4\\x2a\\x17\\x56\\xe8\\x4d\\xf4\\xb4\\xe9\\x77\\x3f\\x86\\xf7\\x67\\x4a\\x2c\\xd7\\x8e\\x71\\xe4\\x0a\\xa8\\xf6\\x44\\xe6\\x70\\x2d\\xfb\\xc2\\xc2\\xc5\\xca\\x90\\xfc\\x24\\x2e\\x9c\\xb0\\x09\\x9c\\xc8\\xf2\\xc2\\xd3\\x13\\x6b\\xaa\\xfc\\x0f\\xf6\\x95\\x48\\x2f\\xda\\xcd\\xef\\x9f\\x56\\x56\\x10\\xb6\\xe1\\x90\\x07\\x22\\xf4\\x35\\xc6\\x38\\x5b\\x35\\xe9\\xf6\\xc4\\x36\\xca\\x03\\x7e\\x03\\xf6\\x4e\\x22\\x33\\xdf\\xfa\\x58\\xdb\\x3b\\x91\\xcc\\x1d\\xaa\\x0b\\xb0\\xc5\\x4c\\x8a\\x43\\xe4\\x69\\xd2\\xcf\\xf7\\xfa\\x2b\\xf8\\xf5\\xd1\\xd8\\x77\\x93\\x10\\x89\\xc8\\x2e\\xd8\\x9a\\xba\\x42\\xf2\\xee\\x2b\\x86\\xe4\\x45\\xcf\\xd0\\x9f\\x4c\\xd7\\x8b\\x35\\x19\\x1b\\xf4\\x67\\xe7\\x84\\xee\\xf7\\x5d\\xc9\\x87\\xe0\\x46\\xd3\\x7d\\x4d\\x4e\\x8e\\x9b\\xbe\\x14\\xaf\\x80\\xd0\\x3a\\x1f\\x40\\x89\\x83\\x84\\xb9\\xd3\\x27\\x9f\\xac\\x9c\\x57\\xfd\\x9c\\x7e\\xec\\xbe\\x19\\xa5\\xac\\xc1\\x50\\x33\\xb8\\x4e\\x07\\xfd\\x0e\\x40\\x9b\\xdb\\xd5\\xa5\\x7f\\x65\\x64\\x11\\x83\\xa6\\xc0\\xa8\\xec\\x42\\x6d\\x1f\\x1d\\x22\\x31\\x66\\xff\\x0a\\x19\\x00\\xb2\\xe9\\x2b\\x7d\\x85\\x83\\x5d\\x01\\x9d\\x17\\x77\\x5e\\x50\\x93\\xcc\\xd1\\x26\\xf9\\x0f\\x63\\xcb\\x7d\\x15\\xcb\\xeb\\x53\\x13\\x24\\x21\\x9c\\xd6\\x4d\\xed\\x67\\x14\\xb2\\x1a\\x65\\x37\\x1a\\xf0\\x72\\x10\\xdf\\xdf\\x0e\\x4e\\x58\\xdd\\xc7\\xd5\\x9f\\x4c\\xfa\\x65\\xc4\\x21\\xd8\\x14\\xee\\x2c\\x9b\\xf6\\xdb\\xf6\\x48\\x73\\xd5\\x79\\xb0\\x9e\\xe5\\xdc\\xed\\xd7\\x33\\x06\\x3e\\x03\\x9a\\xc9\\xa5\\xf9\\xca\\x4c\\x25\\x25\\xa4\\xcc\\x8e\\x98\\x4d\\xa7\\x18\\x5e\\x2d\\x64\\xfa\\xd8\\x1c\\x8a\"},\n{{0x76,0x84,0x9c,0x18,0x8e,0x3e,0xdd,0x0f,0xf5,0xf8,0xfb,0x87,0x4d,0xc0,0x45,0x66,0x45,0x51,0x84,0x45,0xe4,0x1a,0x7d,0x68,0x33,0xe6,0x16,0xc3,0xc4,0x8c,0x98,0x68,},{0xd6,0x70,0xe2,0xea,0x07,0xdb,0x60,0xc2,0x2a,0xb7,0x9a,0x93,0xeb,0xf4,0x9d,0x22,0xa6,0x24,0x5e,0xe3,0xaf,0x07,0xb3,0xbe,0x58,0x4e,0xda,0x69,0x4c,0x37,0x72,0x9e,},{0x71,0x41,0x39,0x9d,0x51,0xda,0xa6,0xeb,0x45,0x19,0xbf,0x3f,0x01,0xb2,0x33,0x92,0x0f,0xa9,0x08,0xfe,0xfa,0x61,0x2f,0x0c,0xd7,0xd5,0xaf,0x8a,0x9a,0x3c,0x44,0x19,0x0e,0x3f,0x63,0x84,0xa8,0xd1,0x4d,0x37,0xc9,0x70,0x30,0xef,0x50,0x18,0xcf,0x8a,0xee,0x8a,0xeb,0x15,0x69,0xa7,0x3d,0x84,0x86,0x2a,0x59,0xb7,0xdf,0x72,0xfe,0x09,},\"\\x1e\\xcc\\xb0\\xbc\\x8e\\xca\\x3a\\xb5\\xbe\\xe6\\x8c\\x5f\\x8c\\xaa\\x34\\x53\\x67\\x66\\xc7\\x05\\xf5\\x08\\x27\\xdb\\x7a\\xc3\\x75\\xd4\\xfe\\x30\\xb5\\x8f\\xfb\\x7e\\x2f\\xe4\\x90\\xcc\\x71\\xa8\\xff\\x86\\xc0\\x06\\xd6\\x17\\x4d\\x05\\x79\\x3a\\xb8\\xa5\\x5d\\xd5\\x1b\\x06\\xde\\x41\\x7b\\xc0\\xac\\x45\\x2c\\xdc\\x7c\\xfb\\x0b\\xb0\\x03\\x62\\xb6\\x76\\x5d\\x20\\xdb\\x23\\xeb\\x18\\x48\\x02\\x70\\x64\\xa1\\xd9\\x09\\x1d\\x3b\\x10\\xed\\x77\\x6f\\x28\\xb7\\x67\\x68\\xbd\\xfc\\x08\\xf0\\xbc\\x51\\x1f\\x76\\xfa\\xeb\\xa7\\x6c\\xfc\\x4c\\xb5\\xc8\\x3d\\xc9\\xeb\\xe8\\xa8\\xd7\\x9e\\xdc\\xa9\\x23\\xec\\xcd\\x52\\x40\\x09\\xca\\xfe\\xdc\\x90\\xe3\\xad\\x87\\xd1\\x39\\x2e\\x1f\\xcc\\xf4\\xe6\\x0c\\xca\\xb9\\x5d\\xc0\\xab\\x54\\xbf\\x44\\x24\\x5a\\x00\\x7a\\x96\\xd4\\x66\\x34\\xb1\\xb2\\x96\\x5b\\x82\\x9c\\x3d\\x7d\\xaa\\x76\\x59\\x72\\xb5\\x4a\\x7b\\x36\\x5b\\x6f\\x34\\xd7\\x7d\\x71\\x76\\xac\\xd8\\xd8\\x94\\xf6\\xb4\\x17\\x09\\x1b\\x6c\\x00\\xed\\xb7\\xa4\\xe8\\x13\\x79\\x98\\x8b\\xfc\\xec\\xb6\\x92\\xe9\\xc3\\xc4\\x31\\x0a\\x7e\\x24\\x0e\\x5c\\x10\\x63\\xcd\\xe1\\x13\\xf2\\x2a\\x68\\x4a\\x50\\xa1\\x12\\xff\\x47\\xd3\\x89\\x88\\x12\\xef\\xb9\\x26\\x37\\x07\\x2b\\x86\\x16\\x3a\\xd8\\x93\\x16\\xd2\\x21\\x19\\x5a\\xcb\\xfa\\xd0\\xa0\\x3a\\x1f\\xbc\\x2d\\x96\\x7f\\xe8\\x3f\\x84\\xc8\\x45\\x9f\\xcc\\xd4\\x90\\xb9\\xc5\\xb3\\xe5\\x5d\\x27\\xe9\\x48\\x4e\\x94\\x3c\\x41\\x7f\\x21\\x28\\xd7\\x37\\x01\\xda\\x28\\xf4\\x9f\\xd3\\x68\\x3f\\x33\\xa3\\x9c\\xde\\xe2\\x34\\xbd\\x30\\x5b\\x94\\x91\\xe2\\xf3\\xeb\\x62\\x1b\\xe3\\xdd\\x1d\\xbb\\xb3\\x1b\"},\n{{0x83,0xae,0x48,0xad,0x70,0xda,0x0b,0xb3,0xcd,0xf8,0x74,0x81,0xee,0x2c,0x0c,0x85,0x71,0xc2,0xca,0x98,0x67,0x12,0xf8,0xbc,0x23,0x29,0xe9,0xa3,0xe3,0x33,0x83,0xc5,},{0xb7,0x85,0x30,0x90,0x00,0xdf,0x95,0xf5,0xa0,0x4f,0x7d,0x89,0xc4,0x11,0x33,0x01,0x05,0x7a,0xda,0xee,0xb2,0x9b,0xcd,0x28,0xd9,0x93,0x71,0xb5,0x37,0xbb,0xa2,0xf6,},{0x43,0x33,0x23,0x51,0xd3,0xfb,0x7b,0x45,0xfc,0xf3,0x7c,0x60,0x7d,0x44,0x2e,0xa8,0x0d,0xbd,0xa2,0xcb,0x69,0xc2,0x88,0x4f,0x42,0x4e,0x65,0xea,0x3a,0x33,0x1e,0xd8,0x47,0x2d,0x43,0x68,0x40,0x5c,0xb7,0x36,0xb2,0xd6,0x68,0x5a,0xd7,0x82,0xe2,0x39,0xfe,0x83,0x3e,0xd7,0x89,0xa2,0x92,0x31,0x85,0x16,0x6f,0x60,0x83,0x42,0xee,0x05,},\"\\xb7\\x52\\x1d\\x3f\\x71\\xc6\\x79\\xfa\\x70\\x37\\xfe\\x74\\x88\\xa6\\x41\\xf6\\xb9\\x7c\\x49\\x45\\x4a\\xcc\\x8e\\x36\\xb9\\x03\\xd8\\xf9\\xeb\\xb5\\x4d\\x89\\xcb\\x56\\xef\\xd1\\x9e\\x04\\xba\\x6a\\x7c\\x8f\\x48\\xa7\\xd3\\xec\\x9d\\xec\\xd3\\xf1\\xcd\\x0f\\xaf\\x6e\\x97\\x81\\x18\\xe6\\xad\\xce\\x9c\\x6c\\x6b\\xe6\\x3c\\x6a\\x6a\\x1a\\xe2\\x16\\x51\\x82\\x84\\x79\\xa4\\x6b\\xc9\\xa0\\xf7\\x94\\x30\\x40\\xf9\\x40\\xa0\\xd4\\x70\\xc8\\xe5\\x77\\xc5\\xd5\\x75\\xcb\\x53\\xc1\\xbf\\x3a\\xb1\\xfe\\xb0\\x50\\xdc\\xb6\\xfe\\xf0\\xba\\x44\\x47\\xf2\\x99\\xfd\\xb9\\xf2\\x7e\\xcb\\x07\\x14\\xec\\xfe\\xfd\\x74\\xba\\xd7\\xb1\\x22\\xa4\\x62\\xc2\\x4a\\x20\\x98\\x48\\xa0\\x33\\x89\\x07\\x45\\x78\\xc5\\xbd\\xc3\\x63\\x96\\xd8\\x09\\xb0\\xf1\\x40\\x18\\xda\\x64\\x91\\x7e\\x6b\\xf8\\x7e\\xf4\\x05\\xc8\\xf3\\xe3\\x33\\xff\\x9c\\x3b\\xaf\\x63\\x39\\x66\\x76\\x20\\x79\\x4b\\xb4\\x74\\x3f\\x05\\x14\\xb5\\xde\\x7d\\x7f\\xdd\\x94\\x7a\\x7e\\x35\\x01\\xee\\x88\\xef\\xad\\x15\\x9e\\x33\\xa1\\x07\\x2f\\xbb\\x99\\xc7\\xc7\\x1e\\x9d\\x13\\xa5\\x02\\xd5\\xa0\\x7c\\x4f\\x81\\x7e\\xeb\\x7f\\x0c\\x53\\x19\\xaa\\x41\\xa9\\x6d\\x5f\\xf4\\xf1\\x5a\\x73\\xc2\\x9b\\x57\\x1f\\xe2\\x11\\x09\\x0e\\x17\\x2c\\x8d\\xb5\\x18\\x62\\x46\\x12\\xa5\\xc3\\x71\\xa9\\xd7\\xce\\xf6\\xde\\x35\\xeb\\xef\\x96\\xe8\\x8e\\x1a\\x78\\xaf\\x3b\\xd5\\xdd\\x35\\x25\\x1a\\xb5\\x4d\\x73\\x71\\x8f\\x3e\\x70\\xd2\\xd5\\x90\\x21\\x53\\x1d\\xc7\\x31\\x84\\xf0\\xfc\\x69\\xc2\\xe9\\x29\\x65\\x84\\x4e\\xc2\\x7c\\x1c\\x02\\xaf\\x5e\\x9a\\x34\\x69\\xde\\x35\\x5d\\xb2\\x25\\x6e\\x0e\\xc2\\xa4\\xeb\\xa3\\x0a\"},\n{{0x39,0xe5,0x6a,0x65,0x62,0x3a,0x0a,0xeb,0xad,0xe0,0xda,0x12,0xce,0x1d,0xf3,0x78,0xbc,0x92,0x40,0x73,0xf7,0x3a,0x54,0x9e,0xff,0xae,0xbc,0x46,0x5d,0x1a,0x78,0xe2,},{0x83,0xda,0x8a,0xd5,0x0b,0xad,0x09,0xeb,0x3e,0x94,0xc7,0x25,0xdf,0x3c,0xc3,0xa1,0x19,0x73,0x6a,0xdc,0x85,0x9c,0xa1,0xa1,0x05,0x03,0xf4,0x8f,0xf2,0xfe,0xc5,0x96,},{0x39,0x8e,0x82,0x60,0x01,0x1f,0x57,0xd8,0xac,0x8c,0x58,0xd5,0x45,0x7b,0xc6,0x52,0xc7,0x41,0x4a,0xaf,0x6f,0xb2,0xf4,0x26,0xb7,0x89,0x90,0x56,0x60,0x5c,0x0a,0xfc,0x28,0x39,0x24,0x23,0xb2,0xb5,0x71,0xf5,0xe6,0xc3,0xc7,0xf6,0xd6,0x02,0x45,0xe5,0x3e,0xbd,0x03,0xbd,0xc5,0xad,0x3c,0x1a,0xd8,0x73,0x8c,0xb3,0x22,0x14,0xd0,0x0f,},\"\\xa9\\x6d\\xc2\\xea\\x3f\\xa1\\x35\\x14\\x92\\xa4\\x61\\x9d\\x91\\x94\\x68\\x1f\\x8e\\xc4\\x00\\xa9\\x71\\x58\\x24\\x44\\x82\\x65\\x38\\x38\\xcc\\xb7\\xe1\\x56\\xa8\\x2d\\x56\\x43\\x68\\xf8\\x3a\\x6e\\xe1\\xbe\\x46\\xbc\\x34\\xb8\\x17\\x20\\x0e\\x84\\x64\\xc3\\xd1\\x2b\\x5e\\xf2\\xc5\\x0b\\x19\\x56\\x5b\\x88\\x1c\\x4c\\x3d\\x45\\x63\\xfb\\x94\\x7e\\xb4\\x7c\\x3e\\xe9\\xc1\\xee\\x78\\x53\\x26\\x98\\x74\\x45\\x5b\\xfa\\xcb\\xa3\\x05\\xf3\\x07\\xd1\\xac\\x53\\x09\\xee\\xae\\x5c\\x07\\xfa\\x5c\\x4d\\x42\\x8e\\xdb\\xc8\\xb9\\x52\\x8c\\x44\\x15\\x24\\x3a\\x9e\\xf5\\x80\\xaf\\xf8\\xfc\\xfb\\x12\\x00\\x0a\\x71\\xfc\\xee\\xe8\\x9d\\xe9\\x7f\\x90\\x27\\x95\\x29\\xbc\\xc8\\x22\\xed\\x3c\\xb3\\x4c\\x82\\xba\\x5f\\xec\\x15\\xf4\\x94\\x56\\x63\\x63\\x6d\\x67\\xb5\\xfe\\xce\\xac\\xc3\\x1d\\x25\\xf9\\x8a\\xea\\x07\\xf7\\x80\\x0d\\x5a\\x10\\x34\\x25\\x1c\\xb9\\x1d\\xd0\\x96\\x3e\\xc2\\xc1\\xa5\\x47\\x73\\xa4\\xd9\\x6c\\x18\\x35\\x7f\\x8d\\x10\\x1d\\xe5\\x8e\\x93\\x2f\\x8c\\x6c\\xdd\\xe8\\xe3\\xcf\\xce\\xf5\\xa7\\x44\\x3f\\xdb\\xa7\\xb7\\x83\\x20\\x40\\x3c\\x01\\x96\\x84\\x47\\x24\\xa6\\x12\\x18\\x3e\\x34\\xbd\\xd8\\x08\\xce\\x7b\\x95\\x88\\x61\\xca\\x37\\x11\\x57\\x30\\xea\\xed\\xe1\\xfd\\x0b\\xaa\\xbe\\x97\\x6e\\xfe\\xfd\\x03\\x65\\xfd\\xf9\\x26\\x77\\x6c\\x53\\x6f\\x47\\xff\\x80\\xde\\x5c\\x18\\x29\\x1b\\xb7\\xe9\\xf1\\xb9\\x13\\xff\\xd1\\xd9\\x44\\x68\\xb7\\x89\\x75\\x2f\\xae\\x6c\\xa8\\x97\\xc0\\xcc\\xa5\\x3e\\xf1\\xe7\\x31\\xd0\\x0c\\x8b\\xdb\\xe8\\x92\\x9e\\xa6\\xb1\\xdc\\xe1\\xf3\\x1a\\x20\\x68\\x8d\\x37\\xb0\\xf3\\xa2\\xb4\\x15\\x3b\\x30\\x6b\\xdb\\xa1\"},\n{{0x4b,0x99,0x21,0x85,0x2f,0x40,0x9a,0x32,0x3a,0xe3,0x81,0x75,0xe8,0xd7,0x6a,0x21,0x1f,0xc4,0xd9,0xc6,0x54,0x17,0x8e,0xea,0x3b,0xaa,0x7a,0x76,0x7a,0x6f,0xda,0x06,},{0x4c,0x72,0x3e,0x43,0x6b,0x6b,0xd9,0x7f,0x44,0xaf,0x52,0x50,0x3b,0x21,0xcc,0x50,0xd5,0xf6,0xad,0x6c,0xfc,0x82,0x88,0x34,0x5d,0xde,0x80,0x54,0xe9,0x95,0x58,0x2e,},{0xcb,0xf1,0xf1,0x64,0x2d,0xf9,0x50,0xeb,0x71,0xfd,0x09,0x59,0x0d,0x34,0xc2,0x65,0x92,0x2c,0x58,0xbd,0x80,0x26,0xbb,0xa3,0xfc,0x0e,0x59,0x4a,0x6b,0xb1,0xf2,0xb9,0x0d,0xa3,0xdc,0x1d,0x5f,0x6b,0x6d,0x5b,0x40,0x5a,0x89,0x6d,0x1d,0xbb,0x71,0xb8,0x68,0x5c,0x4d,0xfc,0x44,0x4a,0xca,0xff,0xe6,0x5a,0xb8,0x33,0x17,0x89,0xf5,0x07,},\"\\x3f\\x33\\xd8\\xfb\\x83\\xe6\\x87\\x41\\x09\\x0a\\x37\\xbe\\xdd\\x74\\x5c\\xf1\\x41\\xaa\\xae\\xd8\\xc9\\x2f\\xfa\\x74\\x2a\\x52\\x56\\x17\\x77\\x88\\x58\\x05\\xac\\xe1\\x42\\x46\\xab\\x98\\xa8\\xcb\\x59\\x8c\\x9c\\xe3\\xde\\x9b\\x29\\xba\\xe5\\xfa\\x04\\xb1\\xcf\\x82\\x8d\\xe1\\x1a\\xff\\x80\\xa7\\xef\\x8a\\x3a\\x38\\xae\\xde\\x4f\\x3c\\x35\\x63\\xa2\\x5d\\x04\\x9b\\xad\\xca\\xd5\\xed\\x7e\\x47\\xfd\\xbb\\xa6\\xe1\\x11\\x30\\x7e\\xeb\\xe9\\xef\\x49\\x06\\xbc\\x98\\x97\\x28\\xb7\\x6e\\x84\\xaf\\xe8\\x08\\xe6\\x65\\x3b\\x27\\x1e\\x21\\x10\\x4a\\xa6\\x65\\xf1\\x89\\x8d\\xd2\\xaa\\xb2\\x30\\x90\\xe2\\x2b\\x4e\\x34\\x4a\\x26\\x16\\xfb\\xd8\\xee\\x4a\\xd8\\xed\\x81\\x08\\x39\\x5e\\xba\\x81\\x7f\\xbd\\x14\\xfe\\xc5\\xc1\\x7d\\xcf\\x56\\xb8\\x22\\x08\\x56\\xb2\\xb8\\x33\\xe0\\x91\\x40\\x7d\\x50\\x89\\xb3\\x5d\\xdf\\x34\\xb8\\x6f\\xf7\\xdc\\x9f\\xde\\x52\\xb2\\x1e\\xf1\\x21\\x76\\xef\\x33\\x70\\xb7\\xf3\\xa0\\xa8\\xcb\\x1b\\x05\\x8a\\x51\\xae\\xff\\xf3\\xd2\\x79\\xd8\\x0f\\x51\\xa6\\x8b\\xfb\\x59\\x25\\x87\\xb4\\x5c\\x5c\\x63\\xa7\\xe4\\xd6\\x25\\xb8\\x87\\xde\\x48\\x6a\\x11\\x83\\x16\\xc3\\xb6\\xa2\\x38\\x57\\x5f\\x92\\xac\\x5b\\x1c\\x94\\xc3\\xf5\\xdb\\xbd\\x96\\x68\\x60\\x00\\xd6\\xd3\\x9c\\xcc\\xd5\\x58\\xd4\\x20\\xe4\\xd4\\x47\\xa8\\xcb\\xc4\\xbc\\x7b\\x8c\\x6a\\x03\\xaf\\x0f\\x00\\x34\\xfb\\x35\\x18\\xd9\\x38\\x00\\xf0\\xf7\\x13\\xe4\\xb1\\x37\\x32\\xe1\\x6a\\xda\\x51\\x80\\x1d\\x7e\\x55\\x9c\\xf8\\x39\\xd1\\x05\\x8f\\x64\\x95\\x56\\x98\\x31\\x13\\x99\\x34\\x54\\x16\\x85\\x0d\\xdd\\xcc\\x56\\x01\\xa6\\x84\\xfd\\x09\\xe6\\xaf\\xd3\\x94\\x4f\\x5e\\x19\"},\n{{0x1b,0xff,0x65,0x2a,0x2c,0x83,0x09,0xa3,0x93,0xac,0x11,0xda,0x3a,0xa9,0x7f,0xb0,0x78,0xbb,0x28,0x4e,0xd5,0xe1,0xb8,0xcc,0xc9,0x83,0x65,0x2e,0xf8,0x55,0x6c,0xd0,},{0xaa,0xab,0xdc,0x09,0x1f,0xc3,0x68,0x23,0x54,0x20,0x17,0x44,0xe9,0xb7,0x3f,0xd2,0xa6,0xcf,0xb2,0x81,0x91,0x4b,0xf2,0xc7,0x0e,0xc3,0xdc,0x1d,0xec,0x72,0x16,0xb0,},{0x93,0xc9,0xc3,0x34,0x93,0xfc,0x64,0x17,0x2d,0x51,0xe1,0x6a,0x0a,0x1c,0xd7,0x29,0xa0,0xd9,0x9e,0x3c,0xb8,0x64,0xe8,0x9a,0x42,0x98,0x7f,0x39,0xdd,0x8c,0xd2,0x65,0x45,0xfd,0xfe,0x37,0x58,0x19,0x11,0xe8,0x03,0x67,0x7d,0xa4,0xc5,0x5b,0x0a,0x68,0x3d,0xdf,0x62,0xb7,0x28,0xf8,0xf3,0x06,0x85,0xae,0x58,0xf6,0x28,0xeb,0xe6,0x09,},\"\\x48\\xd0\\x26\\x98\\xa9\\x7b\\xdc\\xb3\\xef\\x07\\x8d\\xcf\\xcf\\x57\\x50\\x00\\x5f\\x17\\x02\\xd3\\x00\\xe7\\xe8\\x9b\\xc4\\x36\\xe3\\x81\\x11\\x34\\x01\\xf8\\x52\\xb8\\xb4\\xac\\xff\\x60\\xff\\xbd\\x4a\\xb4\\x6d\\x20\\x21\\x68\\xd9\\x8b\\x87\\x35\\xe7\\x9c\\xb3\\x50\\xe3\\x5b\\x07\\x0f\\xf6\\xbd\\xca\\xfd\\x95\\x4b\\x55\\x19\\x69\\xb6\\xb1\\xa7\\x0c\\x91\\x31\\xeb\\xd4\\x0d\\x96\\x14\\x02\\x91\\xd8\\xd2\\xb0\\x91\\x54\\x0a\\x8b\\x18\\xd8\\xe5\\x46\\x59\\x15\\xc2\\x5d\\xbc\\x6b\\x5c\\x9a\\x68\\x79\\x42\\x53\\x3c\\x37\\x2c\\x8b\\x4e\\x95\\xa9\\x53\\x67\\x71\\x69\\xb9\\x50\\xed\\xd3\\x46\\x43\\x75\\xcd\\x43\\x13\\x2f\\xf9\\xbd\\x54\\x1e\\xe2\\x2b\\xd4\\x18\\xce\\x23\\x19\\x5f\\x65\\xd8\\xb2\\x89\\xf6\\x33\\xec\\x8d\\x71\\xe1\\xa8\\x01\\xb0\\x6c\\x3c\\x82\\x7f\\x62\\x7e\\x72\\x3d\\x21\\x99\\x10\\x0c\\xe7\\x3e\\x8e\\x4a\\x44\\x40\\xe7\\x78\\x31\\x7a\\x47\\x49\\x10\\x79\\x3b\\x47\\xb1\\x0f\\xfb\\x55\\xdb\\x7f\\x28\\x1c\\x7d\\x7a\\x03\\x3b\\xd8\\x00\\x48\\xb8\\x26\\x73\\xb8\\x7c\\xf9\\x5e\\x99\\x42\\x2b\\xa6\\x28\\x68\\x8f\\x3c\\x97\\x18\\x90\\xca\\x15\\xd1\\x2f\\x57\\x2f\\xa1\\x97\\x7a\\x17\\x30\\x70\\x69\\xda\\x30\\x4e\\xad\\x30\\x26\\xeb\\x01\\x04\\x26\\x68\\x89\\x0d\\x17\\x00\\x8c\\xd1\\xe9\\x2c\\x46\\xcb\\xe9\\xc8\\x57\\xe7\\x19\\x3d\\xe3\\xab\\xa3\\x91\\x1e\\x4f\\x86\\xfe\\x0a\\x16\\x98\\xab\\x7c\\xdb\\x92\\x51\\xa8\\x42\\x4b\\x28\\x48\\xb9\\x6a\\xd8\\x1e\\xa2\\x39\\xd3\\x65\\xfd\\xea\\x92\\xea\\x5c\\x04\\x73\\xd0\\xa6\\xbb\\x1e\\x37\\x13\\x56\\xbd\\xfa\\xd2\\xd0\\x35\\x03\\x36\\xd3\\xe1\\x94\\x7c\\x93\\x6f\\xd0\\xc2\\x51\\x95\\x44\\x50\\x11\\x73\\x1b\"},\n{{0x00,0x2f,0xdd,0x1f,0x76,0x41,0x79,0x3a,0xb0,0x64,0xbb,0x7a,0xa8,0x48,0xf7,0x62,0xe7,0xec,0x6e,0x33,0x2f,0xfc,0x26,0xee,0xac,0xda,0x14,0x1a,0xe3,0x3b,0x17,0x83,},{0x77,0xd1,0xd8,0xeb,0xac,0xd1,0x3f,0x4e,0x2f,0x8a,0x40,0xe2,0x8c,0x4a,0x63,0xbc,0x9c,0xe3,0xbf,0xb6,0x97,0x16,0x33,0x4b,0xcb,0x28,0xa3,0x3e,0xb1,0x34,0x08,0x6c,},{0x0d,0xf3,0xaa,0x0d,0x09,0x99,0xad,0x3d,0xc5,0x80,0x37,0x8f,0x52,0xd1,0x52,0x70,0x0d,0x5b,0x3b,0x05,0x7f,0x56,0xa6,0x6f,0x92,0x11,0x2e,0x44,0x1e,0x1c,0xb9,0x12,0x3c,0x66,0xf1,0x87,0x12,0xc8,0x7e,0xfe,0x22,0xd2,0x57,0x37,0x77,0x29,0x62,0x41,0x21,0x69,0x04,0xd7,0xcd,0xd7,0xd5,0xea,0x43,0x39,0x28,0xbd,0x28,0x72,0xfa,0x0c,},\"\\x5a\\xc1\\xdf\\xc3\\x24\\xf4\\x3e\\x6c\\xb7\\x9a\\x87\\xab\\x04\\x70\\xfa\\x85\\x7b\\x51\\xfb\\x94\\x49\\x82\\xe1\\x90\\x74\\xca\\x44\\xb1\\xe4\\x00\\x82\\xc1\\xd0\\x7b\\x92\\xef\\xa7\\xea\\x55\\xad\\x42\\xb7\\xc0\\x27\\xe0\\xb9\\xe3\\x37\\x56\\xd9\\x5a\\x2c\\x17\\x96\\xa7\\xc2\\x06\\x68\\x11\\xdc\\x41\\x85\\x83\\x77\\xd4\\xb8\\x35\\xc1\\x68\\x8d\\x63\\x88\\x84\\xcd\\x2a\\xd8\\x97\\x0b\\x74\\xc1\\xa5\\x4a\\xad\\xd2\\x70\\x64\\x16\\x39\\x28\\xa7\\x79\\x88\\xb2\\x44\\x03\\xaa\\x85\\xaf\\x82\\xce\\xab\\x6b\\x72\\x8e\\x55\\x47\\x61\\xaf\\x71\\x75\\xae\\xb9\\x92\\x15\\xb7\\x42\\x1e\\x44\\x74\\xc0\\x4d\\x21\\x3e\\x01\\xff\\x03\\xe3\\x52\\x9b\\x11\\x07\\x7c\\xdf\\x28\\x96\\x4b\\x8c\\x49\\xc5\\x64\\x9e\\x3a\\x46\\xfa\\x0a\\x09\\xdc\\xd5\\x9d\\xca\\xd5\\x8b\\x9b\\x92\\x2a\\x83\\x21\\x0a\\xcd\\x5e\\x65\\x06\\x55\\x31\\x40\\x02\\x34\\xf5\\xe4\\x0c\\xdd\\xcf\\x98\\x04\\x96\\x8e\\x3e\\x9a\\xc6\\xf5\\xc4\\x4a\\xf6\\x50\\x01\\xe1\\x58\\x06\\x7f\\xc3\\xa6\\x60\\x50\\x2d\\x13\\xfa\\x88\\x74\\xfa\\x93\\x33\\x21\\x38\\xd9\\x60\\x6b\\xc4\\x1b\\x4c\\xee\\x7e\\xdc\\x39\\xd7\\x53\\xda\\xe1\\x2a\\x87\\x39\\x41\\xbb\\x35\\x7f\\x7e\\x92\\xa4\\x49\\x88\\x47\\xd6\\x60\\x54\\x56\\xcb\\x8c\\x0b\\x42\\x5a\\x47\\xd7\\xd3\\xca\\x37\\xe5\\x4e\\x90\\x3a\\x41\\xe6\\x45\\x0a\\x35\\xeb\\xe5\\x23\\x7c\\x6f\\x0c\\x1b\\xbb\\xc1\\xfd\\x71\\xfb\\x7c\\xd8\\x93\\xd1\\x89\\x85\\x02\\x95\\xc1\\x99\\xb7\\xd8\\x8a\\xf2\\x6b\\xc8\\x54\\x89\\x75\\xfd\\xa1\\x09\\x9f\\xfe\\xfe\\xe4\\x2a\\x52\\xf3\\x42\\x8d\\xdf\\xf3\\x5e\\x01\\x73\\xd3\\x33\\x95\\x62\\x50\\x7a\\xc5\\xd2\\xc4\\x5b\\xbd\\x2c\\x19\\xcf\\xe8\\x9b\"},\n{{0x25,0xb0,0xf0,0xbb,0x3d,0xcb,0x42,0x2a,0x6f,0x3c,0x6c,0x22,0x0e,0xaa,0xdb,0x11,0xdb,0xfe,0x48,0x9c,0x2d,0x45,0x5b,0x27,0x6c,0xef,0xe8,0xcb,0xa0,0x57,0xf9,0xf3,},{0xfe,0x03,0xc9,0xc4,0x39,0x4a,0xdc,0x74,0xb1,0x3f,0x47,0x65,0x4b,0xea,0xd8,0xbc,0x85,0x59,0x58,0xb4,0x19,0x4f,0xda,0xb2,0x09,0x7a,0xc1,0xb1,0x57,0x93,0x3c,0x05,},{0xda,0x50,0xd5,0x24,0x2b,0xf5,0x1c,0x39,0x51,0x78,0x0c,0xaf,0xd9,0x26,0xd6,0x7b,0xdf,0x56,0x40,0xd5,0xd3,0xbb,0x08,0x43,0x38,0x31,0xd5,0x6e,0x48,0xe2,0x59,0x2a,0x1c,0x37,0x59,0x68,0xbb,0x4d,0x2f,0xbe,0xa5,0x61,0x45,0xab,0xf2,0xd8,0x29,0x91,0x36,0x3b,0x15,0x65,0xfa,0x1e,0xff,0xe2,0x14,0x01,0x1a,0x68,0x6e,0x39,0x95,0x0e,},\"\\x54\\xd9\\x9f\\x96\\x9e\\xfa\\x88\\x70\\xfc\\x20\\xfa\\x9a\\x96\\x2b\\xb3\\x72\\x61\\x9c\\x32\\x44\\x39\\x72\\x8a\\xf3\\x13\\x9c\\x2a\\x07\\xe8\\xc1\\xb2\\x9c\\x1e\\x4e\\xed\\xc2\\xd4\\x0b\\xa7\\x22\\xf6\\x3c\\xe3\\x76\\x70\\x36\\x2a\\xf6\\xf5\\x20\\x2a\\xdd\\x66\\x8c\\x4f\\xb4\\xd6\\x2f\\xa8\\xba\\xcb\\xc7\\xd0\\x7f\\xf3\\xbd\\x38\\xc1\\x5a\\x01\\x06\\x42\\x59\\xcc\\x34\\x13\\x48\\x61\\x63\\x29\\x67\\x46\\x05\\x41\\xa9\\x9b\\x8d\\x51\\x82\\xbf\\x59\\x34\\x7b\\x5a\\x59\\x87\\x9a\\xa3\\xb0\\x91\\xa1\\xf3\\xe0\\x41\\x35\\xbd\\x63\\x01\\xbe\\x52\\x26\\xd4\\x89\\x5e\\x5e\\x9c\\x2b\\x15\\xe4\\x8e\\x5e\\xcd\\xf4\\x41\\x29\\xe6\\x12\\x28\\x53\\xa6\\x06\\xfc\\x11\\x84\\x66\\xfa\\x72\\x0b\\x5a\\xb1\\x65\\x63\\x5c\\x3b\\xde\\x04\\xd7\\x42\\x89\\x27\\x4f\\xa0\\x35\\x47\\xac\\xcb\\xde\\x78\\x0e\\x1f\\xa0\\xbf\\x2c\\x56\\xf8\\x43\\x6a\\x53\\xe7\\x38\\x78\\xa4\\x24\\xa2\\x9a\\xa9\\xde\\x38\\x5d\\xba\\x41\\x9a\\xe6\\xa5\\xd1\\x2e\\x00\\x42\\x76\\x15\\x2b\\x58\\xd3\\x25\\xb3\\x02\\x40\\x0a\\x55\\x33\\x3c\\x38\\xcd\\xe4\\x90\\x8a\\xe1\\xd0\\x12\\x1c\\xbe\\xca\\x95\\x08\\x09\\xc5\\x43\\x31\\x42\\x77\\xc1\\x48\\x5e\\x68\\xd9\\xf9\\xc0\\xa9\\x62\\xd1\\xb1\\xe0\\xdd\\xa1\\xd4\\xa5\\x2b\\x56\\xf8\\x30\\x8a\\x80\\xb9\\x2a\\xcc\\x9f\\x4e\\xbc\\x3e\\xd4\\x5d\\x91\\xa1\\x29\\xda\\x86\\x75\\x62\\x1a\\xf6\\x76\\x70\\x3d\\xef\\x3b\\x84\\x11\\x31\\x83\\xb2\\xe3\\xa8\\xc5\\x61\\x57\\xf2\\x43\\xf1\\x39\\x80\\xf3\\xd1\\x75\\x6f\\xea\\x76\\x68\\xc9\\x15\\x03\\xd3\\x5c\\x83\\x9a\\x21\\x20\\xc7\\x9e\\xc9\\x54\\xfb\\x54\\x6d\\x7b\\x54\\x2f\\x98\\x72\\x89\\x53\\x4f\\xfd\\xef\\x62\\xd4\\x7f\\xd5\\xec\"},\n{{0xbf,0x5b,0xa5,0xd6,0xa4,0x9d,0xd5,0xef,0x7b,0x4d,0x5d,0x7d,0x3e,0x4e,0xcc,0x50,0x5c,0x01,0xf6,0xcc,0xee,0x4c,0x54,0xb5,0xef,0x7b,0x40,0xaf,0x6a,0x45,0x41,0x40,},{0x1b,0xe0,0x34,0xf8,0x13,0x01,0x7b,0x90,0x0d,0x89,0x90,0xaf,0x45,0xfa,0xd5,0xb5,0x21,0x4b,0x57,0x3b,0xd3,0x03,0xef,0x7a,0x75,0xef,0x4b,0x8c,0x5c,0x5b,0x98,0x42,},{0x27,0x9c,0xac,0xe6,0xfd,0xaf,0x39,0x45,0xe3,0x83,0x7d,0xf4,0x74,0xb2,0x86,0x46,0x14,0x37,0x47,0x63,0x2b,0xed,0xe9,0x3e,0x7a,0x66,0xf5,0xca,0x29,0x1d,0x2c,0x24,0x97,0x85,0x12,0xca,0x0c,0xb8,0x82,0x7c,0x8c,0x32,0x26,0x85,0xbd,0x60,0x55,0x03,0xa5,0xec,0x94,0xdb,0xae,0x61,0xbb,0xdc,0xae,0x1e,0x49,0x65,0x06,0x02,0xbc,0x07,},\"\\x16\\x15\\x2c\\x2e\\x03\\x7b\\x1c\\x0d\\x32\\x19\\xce\\xd8\\xe0\\x67\\x4a\\xee\\x6b\\x57\\x83\\x4b\\x55\\x10\\x6c\\x53\\x44\\x62\\x53\\x22\\xda\\x63\\x8e\\xce\\xa2\\xfc\\x9a\\x42\\x4a\\x05\\xee\\x95\\x12\\xd4\\x8f\\xcf\\x75\\xdd\\x8b\\xd4\\x69\\x1b\\x3c\\x10\\xc2\\x8e\\xc9\\x8e\\xe1\\xaf\\xa5\\xb8\\x63\\xd1\\xc3\\x67\\x95\\xed\\x18\\x10\\x5d\\xb3\\xa9\\xaa\\xbd\\x9d\\x2b\\x4c\\x17\\x47\\xad\\xba\\xf1\\xa5\\x6f\\xfc\\xc0\\xc5\\x33\\xc1\\xc0\\xfa\\xef\\x33\\x1c\\xdb\\x79\\xd9\\x61\\xfa\\x39\\xf8\\x80\\xa1\\xb8\\xb1\\x16\\x47\\x41\\x82\\x2e\\xfb\\x15\\xa7\\x25\\x9a\\x46\\x5b\\xef\\x21\\x28\\x55\\x75\\x1f\\xab\\x66\\xa8\\x97\\xbf\\xa2\\x11\\xab\\xe0\\xea\\x2f\\x2e\\x1c\\xd8\\xa1\\x1d\\x80\\xe1\\x42\\xcd\\xe1\\x26\\x3e\\xec\\x26\\x7a\\x31\\x38\\xae\\x1f\\xcf\\x40\\x99\\xdb\\x0a\\xb5\\x3d\\x64\\xf3\\x36\\xf4\\xbc\\xd7\\xa3\\x63\\xf6\\xdb\\x11\\x2c\\x0a\\x24\\x53\\x05\\x1a\\x00\\x06\\xf8\\x13\\xaa\\xf4\\xae\\x94\\x8a\\x20\\x90\\x61\\x93\\x74\\xfa\\x58\\x05\\x24\\x09\\xc2\\x8e\\xf7\\x62\\x25\\x68\\x7d\\xf3\\xcb\\x2d\\x1b\\x0b\\xfb\\x43\\xb0\\x9f\\x47\\xf1\\x23\\x2f\\x79\\x0e\\x6d\\x8d\\xea\\x75\\x9e\\x57\\x94\\x20\\x99\\xf4\\xc4\\xbd\\x33\\x90\\xf2\\x8a\\xfc\\x20\\x98\\x24\\x49\\x61\\x46\\x5c\\x64\\x3f\\xc8\\xb2\\x97\\x66\\xaf\\x2b\\xcb\\xc5\\x44\\x0b\\x86\\xe8\\x36\\x08\\xcf\\xc9\\x37\\xbe\\x98\\xbb\\x48\\x27\\xfd\\x5e\\x6b\\x68\\x9a\\xdc\\x2e\\x26\\x51\\x3d\\xb5\\x31\\x07\\x6a\\x65\\x64\\x39\\x62\\x55\\xa0\\x99\\x75\\xb7\\x03\\x4d\\xac\\x06\\x46\\x1b\\x25\\x56\\x42\\xe3\\xa7\\xed\\x75\\xfa\\x9f\\xc2\\x65\\x01\\x1f\\x5f\\x62\\x50\\x38\\x2a\\x84\\xac\\x26\\x8d\\x63\\xba\\x64\"},\n{{0x65,0xde,0x29,0x7b,0x70,0xcb,0xe8,0x09,0x80,0x50,0x0a,0xf0,0x56,0x1a,0x24,0xdb,0x50,0x00,0x10,0x00,0x12,0x5f,0x44,0x90,0x36,0x6d,0x83,0x00,0xd3,0x12,0x85,0x92,},{0xba,0x8e,0x2a,0xd9,0x29,0xbd,0xce,0xa5,0x38,0x74,0x10,0x42,0xb5,0x7f,0x20,0x67,0xd3,0x15,0x37,0x07,0xa4,0x53,0x77,0x0d,0xb9,0xf3,0xc4,0xca,0x75,0x50,0x4d,0x24,},{0x7a,0x9b,0x73,0x6b,0x01,0xcc,0x92,0xa3,0x34,0x9f,0x1a,0x3c,0x32,0xdb,0xd9,0x19,0x59,0x82,0x53,0x94,0xff,0x44,0x3c,0x56,0x74,0x05,0xe8,0x99,0xc8,0x18,0x5c,0xe8,0xfa,0xd9,0x50,0x0e,0x1f,0xce,0x89,0xd9,0x5a,0x62,0x53,0xc0,0x04,0x77,0x43,0x5a,0xcf,0x04,0xbf,0xf9,0x93,0xde,0x1b,0x00,0x49,0x5d,0xef,0x08,0x34,0xee,0x1f,0x07,},\"\\x13\\x1d\\x8f\\x4c\\x2c\\x94\\xb1\\x53\\x56\\x5b\\x86\\x59\\x2e\\x77\\x0c\\x98\\x7a\\x44\\x34\\x61\\xb3\\x9a\\xa2\\x40\\x8b\\x29\\xe2\\x13\\xab\\x05\\x7a\\xff\\xc5\\x98\\xb5\\x83\\x73\\x9d\\x66\\x03\\xa8\\x3f\\xef\\x0a\\xfc\\x51\\x47\\x21\\xdb\\x0e\\x76\\xf9\\xbd\\x1b\\x72\\xb9\\x8c\\x56\\x5c\\xc8\\x88\\x1a\\xf5\\x74\\x7c\\x0b\\xa6\\xf5\\x8c\\x53\\xdd\\x23\\x77\\xda\\x6c\\x0d\\x3a\\xa8\\x05\\x62\\x0c\\xc4\\xe7\\x5d\\x52\\xaa\\xbc\\xba\\x1f\\x9b\\x28\\x49\\xe0\\x8b\\xd1\\xb6\\xb9\\x2e\\x6f\\x06\\x61\\x5b\\x81\\x45\\x19\\x60\\x6a\\x02\\xdc\\x65\\xa8\\x60\\x9f\\x5b\\x29\\xe9\\xc2\\xaf\\x5a\\x89\\x4f\\x71\\x16\\xef\\x28\\xcf\\xd1\\xe7\\xb7\\x6b\\x64\\x06\\x17\\x32\\xf7\\xa5\\xa3\\xf8\\xaa\\x4c\\x2e\\x56\\x9e\\x62\\x7a\\x3f\\x97\\x49\\xaa\\x59\\x7b\\xe4\\x9d\\x6b\\x94\\x43\\x6c\\x35\\x2d\\xd5\\xfa\\x7b\\x83\\xc9\\x2d\\x26\\x10\\xfa\\xa3\\x20\\x95\\xca\\x30\\x21\\x52\\xd9\\x1a\\x3c\\x97\\x76\\x75\\x0e\\x75\\x8e\\xe8\\xe9\\xe4\\x02\\xc6\\xf5\\x38\\x5e\\xaa\\x5d\\xf2\\x38\\x50\\xe5\\x4b\\xeb\\x1b\\xe4\\x37\\xa4\\x16\\xc7\\x11\\x5e\\xd6\\xaa\\x6d\\xe1\\x3b\\x55\\x48\\x25\\x32\\x78\\x7e\\x0b\\xee\\x34\\xb8\\x3f\\x30\\x84\\x40\\x67\\x65\\x63\\x54\\x97\\xc9\\x31\\xb6\\x2a\\x05\\x18\\xf1\\xfb\\xc2\\xb8\\x91\\xdc\\x72\\x62\\xc7\\xc6\\xb6\\x7e\\xda\\x59\\x4f\\xa5\\x30\\xd7\\x4c\\x93\\x29\\xba\\xd5\\xbe\\x94\\xc2\\x87\\xfb\\xcd\\xe5\\x3a\\xa8\\x02\\x72\\xb8\\x33\\x22\\x61\\x3d\\x93\\x68\\xe5\\x90\\x40\\x76\\xfd\\xbc\\xc8\\x8b\\x2c\\x0e\\x59\\xc1\\x0b\\x02\\xc4\\x48\\xe0\\x0d\\x1b\\x3e\\x7a\\x9c\\x96\\x40\\xfe\\xff\\xb9\\x52\\x3a\\x8a\\x60\\xe1\\xd8\\x3f\\x04\\xa4\\xb8\\xdf\\x69\\x15\\x3b\"},\n{{0x08,0x26,0xe7,0x33,0x33,0x24,0xe7,0xec,0x8c,0x76,0x42,0x92,0xf6,0x01,0x5d,0x46,0x70,0xe9,0xb8,0xd7,0xc4,0xa8,0x9e,0x8d,0x90,0x9e,0x8e,0xf4,0x35,0xd1,0x8d,0x15,},{0xff,0xb2,0x34,0x8c,0xa8,0xa0,0x18,0x05,0x8b,0xe7,0x1d,0x15,0x12,0xf3,0x76,0xf9,0x1e,0x8b,0x0d,0x55,0x25,0x81,0x25,0x4e,0x10,0x76,0x02,0x21,0x73,0x95,0xe6,0x62,},{0x4b,0xac,0x7f,0xab,0xec,0x87,0x24,0xd8,0x1a,0xb0,0x9a,0xe1,0x30,0x87,0x4d,0x70,0xb5,0x21,0x34,0x92,0x10,0x43,0x72,0xf6,0x01,0xae,0x5a,0xbb,0x10,0x53,0x27,0x99,0x37,0x3c,0x4d,0xad,0x21,0x58,0x76,0x44,0x1f,0x47,0x4e,0x2c,0x00,0x6b,0xe3,0x7c,0x3c,0x8f,0x5f,0x6f,0x01,0x7d,0x08,0x70,0x41,0x4f,0xd2,0x76,0xa8,0xf4,0x28,0x08,},\"\\x7f\\x9e\\x3e\\x2f\\x03\\xc9\\xdf\\x3d\\x21\\xb9\\x90\\xf5\\xa4\\xaf\\x82\\x95\\x73\\x4a\\xfe\\x78\\x3a\\xcc\\xc3\\x4f\\xb1\\xe9\\xb8\\xe9\\x5a\\x0f\\xd8\\x37\\xaf\\x7e\\x05\\xc1\\x3c\\xda\\x0d\\xe8\\xfa\\xda\\xc9\\x20\\x52\\x65\\xa0\\x79\\x2b\\x52\\x56\\x3b\\xdc\\x2f\\xee\\x76\\x63\\x48\\xbe\\xfc\\xc5\\x6b\\x88\\xbb\\xb9\\x5f\\x15\\x44\\x14\\xfb\\x18\\x6e\\xc4\\x36\\xaa\\x62\\xea\\x6f\\xca\\xbb\\x11\\xc0\\x17\\xa9\\xd2\\xd1\\x5f\\x67\\xe5\\x95\\x98\\x0e\\x04\\xc9\\x31\\x3b\\xc9\\x4f\\xbc\\x8c\\x11\\x34\\xc2\\xf4\\x03\\x32\\xbc\\x7e\\x31\\x1a\\xc1\\xce\\x11\\xb5\\x05\\xf8\\x57\\x2a\\xda\\x7f\\xbe\\x19\\x6f\\xba\\x82\\x2d\\x9a\\x91\\x44\\x92\\xfa\\x71\\x85\\xe9\\xf3\\xbe\\xa4\\x68\\x72\\x00\\xa5\\x24\\xc6\\x73\\xa1\\xcd\\xf8\\x7e\\xb3\\xa1\\x40\\xdc\\xdb\\x6a\\x88\\x75\\x61\\x34\\x88\\xa2\\xb0\\x0a\\xdf\\x71\\x75\\x34\\x1c\\x1c\\x25\\x76\\x35\\xfa\\x1a\\x53\\xa3\\xe2\\x1d\\x60\\xc2\\x28\\x39\\x9e\\xea\\x09\\x91\\xf1\\x12\\xc6\\x0f\\x65\\x3d\\x71\\x48\\xe2\\xc5\\xce\\xb9\\x8f\\x94\\x08\\x31\\xf0\\x70\\xdb\\x10\\x84\\xd7\\x91\\x56\\xcc\\x82\\xc4\\x6b\\xc9\\xb8\\xe8\\x84\\xf3\\xfa\\x81\\xbe\\x2d\\xa4\\xcd\\xda\\x46\\xbc\\xaa\\x24\\xcc\\x46\\x1f\\x76\\xee\\x64\\x7b\\xb0\\xf0\\xf8\\xc1\\x5a\\xc5\\xda\\xa7\\x95\\xb9\\x45\\xe6\\xf8\\x5b\\xb3\\x10\\x36\\x2e\\x48\\xd8\\x09\\x5c\\x78\\x2c\\x61\\xc5\\x2b\\x48\\x1b\\x4b\\x00\\x2a\\xd0\\x6e\\xa7\\x4b\\x8d\\x30\\x6e\\xff\\x71\\xab\\xf2\\x1d\\xb7\\x10\\xa8\\x91\\x3c\\xbe\\x48\\x33\\x2b\\xe0\\xa0\\xb3\\xf3\\x1e\\x0c\\x7a\\x6e\\xba\\x85\\xce\\x33\\xf3\\x57\\xc7\\xae\\xcc\\xd3\\x0b\\xfb\\x1a\\x65\\x74\\x40\\x8b\\x66\\xfe\\x40\\x4d\\x31\\xc3\\xc5\"},\n{{0x00,0xad,0x62,0x27,0x97,0x7b,0x5f,0x38,0xcc,0xda,0x99,0x4d,0x92,0x8b,0xba,0x90,0x86,0xd2,0xda,0xeb,0x01,0x3f,0x86,0x90,0xdb,0x98,0x66,0x48,0xb9,0x0c,0x1d,0x45,},{0x91,0xa4,0xea,0x00,0x57,0x52,0xb9,0x2c,0xbe,0xbf,0x99,0xa8,0xa5,0xcb,0xec,0xd2,0x40,0xae,0x3f,0x01,0x6c,0x44,0xad,0x14,0x1b,0x2e,0x57,0xdd,0xc7,0x73,0xdc,0x8e,},{0xdc,0x50,0x1d,0xb7,0x9f,0xd7,0x82,0xbc,0x88,0xca,0xe7,0x92,0x55,0x7d,0x5d,0x27,0x3f,0x9b,0xa5,0x60,0xc7,0xd9,0x00,0x37,0xfe,0x84,0xac,0x87,0x9d,0x68,0x4f,0x61,0x2a,0x77,0x45,0x2c,0x44,0x43,0xe9,0x5c,0x07,0xb8,0xbe,0x19,0x2c,0x35,0x76,0x9b,0x17,0xbb,0xdf,0xca,0x42,0x28,0x0d,0xe7,0x96,0xd9,0x21,0x19,0xd8,0x33,0x67,0x0d,},\"\\xcb\\x5b\\xc5\\xb9\\x8b\\x2e\\xfc\\xe4\\x35\\x43\\xe9\\x1d\\xf0\\x41\\xe0\\xdb\\xb5\\x3e\\xd8\\xf6\\x7b\\xf0\\xf1\\x97\\xc5\\x2b\\x22\\x11\\xe7\\xa4\\x5e\\x2e\\x1e\\xc8\\x18\\xc1\\xa8\\x0e\\x10\\xab\\xf6\\xa4\\x35\\x35\\xf5\\xb7\\x9d\\x97\\x4d\\x8a\\xe2\\x8a\\x22\\x95\\xc0\\xa6\\x52\\x17\\x63\\xb6\\x07\\xd5\\x10\\x3c\\x6a\\xef\\x3b\\x27\\x86\\xbd\\x5a\\xfd\\x75\\x63\\x69\\x56\\x60\\x68\\x43\\x37\\xbc\\x30\\x90\\x73\\x9f\\xb1\\xcd\\x53\\xa9\\xd6\\x44\\x13\\x9b\\x6d\\x4c\\xae\\xc7\\x5b\\xda\\x7f\\x25\\x21\\xfb\\xfe\\x67\\x6a\\xb4\\x5b\\x98\\xcb\\x31\\x7a\\xa7\\xca\\x79\\xfc\\x54\\xa3\\xd7\\xc5\\x78\\x46\\x6a\\x6a\\xa6\\x4e\\x43\\x4e\\x92\\x34\\x65\\xa7\\xf2\\x11\\xaa\\x0c\\x61\\x68\\x1b\\xb8\\x48\\x6e\\x90\\x20\\x6a\\x25\\x25\\x0d\\x3f\\xda\\xe6\\xfb\\x03\\x29\\x97\\x21\\xe9\\x9e\\x2a\\x91\\x49\\x10\\xd9\\x17\\x60\\x08\\x9b\\x5d\\x28\\x1e\\x13\\x1e\\x6c\\x83\\x6b\\xc2\\xde\\x08\\xf7\\xe0\\x2c\\x48\\xd3\\x23\\xc6\\x47\\xe9\\x53\\x6c\\x00\\xec\\x10\\x39\\x20\\x1c\\x03\\x62\\x61\\x8c\\x7d\\x47\\xaa\\x8e\\x7b\\x97\\x15\\xff\\xc4\\x39\\x98\\x7a\\xe1\\xd3\\x11\\x54\\xa6\\x19\\x8c\\x5a\\xa1\\x1c\\x12\\x8f\\x40\\x82\\xf5\\x56\\xc9\\x9b\\xaf\\x10\\x3e\\xca\\xdc\\x3b\\x2f\\x3b\\x2e\\xc5\\xb4\\x69\\x62\\x3b\\xc0\\x3a\\x53\\xca\\xf3\\x81\\x4b\\x16\\x30\\x0a\\xed\\xbd\\xa5\\x38\\xd6\\x76\\xd1\\xf6\\x07\\x10\\x26\\x39\\xdb\\x2a\\x62\\xc4\\x46\\x70\\x7c\\xe6\\x46\\x9b\\xd8\\x73\\xa0\\x46\\x82\\x25\\xbe\\x88\\xb0\\xae\\xf5\\xd4\\x02\\x04\\x59\\xb9\\x4b\\x32\\xfe\\x2b\\x01\\x33\\xe9\\x2e\\x7b\\xa5\\x4d\\xd2\\xa5\\x39\\x7e\\xd8\\x5f\\x96\\x6a\\xb3\\x9e\\xd0\\x73\\x0c\\xca\\x8e\\x7d\\xac\\xb8\\xa3\\x36\"},\n{{0x15,0x21,0xc6,0xdb,0xd6,0xf7,0x24,0xde,0x73,0xea,0xf7,0xb5,0x62,0x64,0xf0,0x10,0x35,0xc0,0x4e,0x01,0xc1,0xf3,0xeb,0x3c,0xbe,0x83,0xef,0xd2,0x6c,0x43,0x9a,0xda,},{0x2f,0x61,0xa2,0x6f,0xfb,0x68,0xba,0x4f,0x6e,0x14,0x15,0x29,0xdc,0x26,0x17,0xe8,0x53,0x1c,0x71,0x51,0x40,0x48,0x08,0x09,0x3b,0x4f,0xa7,0xfe,0xda,0xea,0x25,0x5d,},{0xa8,0x17,0xed,0x23,0xec,0x39,0x8a,0x12,0x86,0x01,0xc1,0x83,0x2d,0xc6,0xaf,0x76,0x43,0xbf,0x3a,0x5f,0x51,0x7b,0xcc,0x57,0x94,0x50,0xfd,0xb4,0x75,0x90,0x28,0xf4,0x96,0x61,0x64,0x12,0x5f,0x6e,0xbd,0x0d,0x6b,0xf8,0x6f,0xf2,0x98,0xa3,0x9c,0x76,0x6d,0x0c,0x21,0xfd,0xb0,0xcb,0xfd,0xf8,0x1c,0xd0,0xeb,0x1f,0x03,0xcd,0x8a,0x08,},\"\\x3e\\x3c\\x7c\\x49\\x07\\x88\\xe4\\xb1\\xd4\\x2f\\x5c\\xbc\\xae\\x3a\\x99\\x30\\xbf\\x61\\x7e\\xbd\\xff\\x44\\x7f\\x7b\\xe2\\xac\\x2b\\xa7\\xcd\\x5b\\xcf\\xc0\\x15\\x76\\x09\\x63\\xe6\\xfe\\x5b\\x95\\x6f\\xb7\\xcd\\xb3\\x5b\\xd5\\xa1\\x7f\\x54\\x29\\xca\\x66\\x4f\\x43\\x7f\\x08\\x75\\x3a\\x74\\x1c\\x2b\\xc8\\x69\\x2b\\x71\\xa9\\x11\\x5c\\x58\\x2a\\x25\\xb2\\xf7\\x4d\\x32\\x98\\x54\\xd6\\x0b\\x78\\x17\\xc0\\x79\\xb3\\x52\\x3a\\xaf\\xf8\\x79\\x3c\\x2f\\x72\\xff\\xf8\\xcd\\x10\\x59\\x2c\\x54\\xe7\\x38\\xdf\\x1d\\x64\\x52\\xfb\\x72\\xda\\x13\\x1c\\x67\\x31\\xea\\x5c\\x95\\x3c\\x62\\xea\\x17\\x7a\\xc1\\xf4\\x73\\x5e\\x51\\x54\\x47\\x73\\x87\\x10\\x9a\\xfa\\xe1\\x5f\\x3e\\xd6\\xee\\xb0\\x86\\x06\\xe2\\x8c\\x81\\xd4\\x38\\x6f\\x03\\xb9\\x37\\x69\\x24\\xb6\\xef\\x8d\\x22\\x1e\\xe2\\x95\\x47\\xf8\\x2a\\x7e\\xde\\x48\\xe1\\xdc\\x17\\x72\\x3e\\x3d\\x42\\x17\\x1e\\xea\\xf9\\x6a\\xc8\\x4b\\xed\\xc2\\xa0\\x1d\\xd8\\x6f\\x4d\\x08\\x57\\x34\\xfd\\x69\\xf9\\x1b\\x52\\x63\\xe4\\x39\\x08\\x3f\\xf0\\x31\\x85\\x36\\xad\\xff\\x41\\x47\\x30\\x8e\\x3a\\xaf\\xd1\\xb5\\x8b\\xb7\\x4f\\x6f\\xb0\\x21\\x4a\\x46\\xfd\\xcd\\x35\\x24\\xf1\\x8d\\xf5\\xa7\\x19\\xce\\x57\\x31\\x9e\\x79\\x1b\\x4e\\xa6\\x06\\xb4\\x99\\xbf\\xa5\\x7a\\x60\\xe7\\x07\\xf9\\x4e\\x18\\xf1\\xfe\\xd2\\x2f\\x91\\xbc\\x79\\xe6\\x36\\x4a\\x84\\x3f\\x9c\\xbf\\x93\\x82\\x5c\\x46\\x5e\\x9c\\xae\\x90\\x72\\xbc\\x9d\\x3e\\xc4\\x47\\x1f\\x21\\xab\\x2f\\x7e\\x99\\xa6\\x33\\xf5\\x87\\xaa\\xc3\\xdb\\x78\\xae\\x96\\x66\\xa8\\x9a\\x18\\x00\\x8d\\xd6\\x1d\\x60\\x21\\x85\\x54\\x41\\x1a\\x65\\x74\\x0f\\xfd\\x1a\\xe3\\xad\\xc0\\x65\\x95\\xe3\\xb7\\x87\\x64\\x07\\xb6\"},\n{{0x17,0xe5,0xf0,0xa8,0xf3,0x47,0x51,0xba,0xbc,0x5c,0x72,0x3e,0xcf,0x33,0x93,0x06,0x99,0x2f,0x39,0xea,0x06,0x5a,0xc1,0x40,0xfc,0xbc,0x39,0x7d,0x2d,0xd3,0x2c,0x4b,},{0x4f,0x1e,0x23,0xcc,0x0f,0x2f,0x69,0xc8,0x8e,0xf9,0x16,0x2a,0xb5,0xf8,0xc5,0x9f,0xb3,0xb8,0xab,0x20,0x96,0xb7,0x7e,0x78,0x2c,0x63,0xc0,0x7c,0x8c,0x4f,0x2b,0x60,},{0xef,0xe2,0xcb,0x63,0xfe,0x7b,0x4f,0xc9,0x89,0x46,0xdc,0x82,0xfb,0x69,0x98,0xe7,0x41,0xed,0x9c,0xe6,0xb9,0xc1,0xa9,0x3b,0xb4,0x5b,0xc0,0xa7,0xd8,0x39,0x6d,0x74,0x05,0x28,0x2b,0x43,0xfe,0x36,0x3b,0xa5,0xb2,0x35,0x89,0xf8,0xe1,0xfa,0xe1,0x30,0xe1,0x57,0xce,0x88,0x8c,0xd7,0x2d,0x05,0x3d,0x0c,0xc1,0x9d,0x25,0x7a,0x43,0x00,},\"\\xc0\\xfa\\xd7\\x90\\x02\\x40\\x19\\xbd\\x6f\\xc0\\x8a\\x7a\\x92\\xf5\\xf2\\xac\\x35\\xcf\\x64\\x32\\xe2\\xea\\xa5\\x3d\\x48\\x2f\\x6e\\x12\\x04\\x93\\x53\\x36\\xcb\\x3a\\xe6\\x5a\\x63\\xc2\\x4d\\x0e\\xc6\\x53\\x9a\\x10\\xee\\x18\\x76\\x0f\\x2f\\x52\\x05\\x37\\x77\\x4c\\xde\\xc6\\xe9\\x6b\\x55\\x53\\x60\\x11\\xda\\xa8\\xf8\\xbc\\xb9\\xcd\\xaf\\x6d\\xf5\\xb3\\x46\\x48\\x44\\x8a\\xc7\\xd7\\xcb\\x7c\\x6b\\xd8\\x0d\\x67\\xfb\\xf3\\x30\\xf8\\x76\\x52\\x97\\x76\\x60\\x46\\xa9\\x25\\xab\\x52\\x41\\x1d\\x16\\x04\\xc3\\xed\\x6a\\x85\\x17\\x30\\x40\\x12\\x56\\x58\\xa3\\x2c\\xf4\\xc8\\x54\\xef\\x28\\x13\\xdf\\x2b\\xe6\\xf3\\x83\\x0e\\x5e\\xee\\x5a\\x61\\x63\\xa8\\x3c\\xa8\\x84\\x9f\\x61\\x29\\x91\\xa3\\x1e\\x9f\\x88\\x02\\x8e\\x50\\xbf\\x85\\x35\\xe1\\x17\\x55\\xfa\\xd0\\x29\\xd9\\x4c\\xf2\\x59\\x59\\xf6\\x69\\x5d\\x09\\xc1\\xba\\x43\\x15\\xd4\\x0f\\x7c\\xf5\\x1b\\x3f\\x81\\x66\\xd0\\x2f\\xab\\xa7\\x51\\x1e\\xcd\\x8b\\x1d\\xde\\xd5\\xf1\\x0c\\xd6\\x84\\x34\\x55\\xcf\\xf7\\x07\\xed\\x22\\x53\\x96\\xc6\\x1d\\x08\\x20\\xd2\\x0a\\xda\\x70\\xd0\\xc3\\x61\\x9f\\xf6\\x79\\x42\\x20\\x61\\xc9\\xf7\\xc7\\x6e\\x97\\xd5\\xa3\\x7a\\xf6\\x1f\\xd6\\x22\\x12\\xd2\\xda\\xfc\\x64\\x7e\\xbb\\xb9\\x79\\xe6\\x1d\\x90\\x70\\xec\\x03\\x60\\x9a\\x07\\xf5\\xfc\\x57\\xd1\\x19\\xae\\x64\\xb7\\xa6\\xef\\x92\\xa5\\xaf\\xae\\x66\\x0a\\x30\\xed\\x48\\xd7\\x02\\xcc\\x31\\x28\\xc6\\x33\\xb4\\xf1\\x90\\x60\\xa0\\x57\\x81\\x01\\x72\\x9e\\xe9\\x79\\xf7\\x90\\xf4\\x5b\\xdb\\xb5\\xfe\\x1a\\x8a\\x62\\xf0\\x1a\\x61\\xa3\\x1d\\x61\\xaf\\x07\\x03\\x04\\x50\\xfa\\x04\\x17\\x32\\x3e\\x94\\x07\\xbc\\x76\\xe7\\x31\\x30\\xe7\\xc6\\x9d\\x62\\xe6\\xa7\"},\n{{0x0c,0xd7,0xaa,0x7d,0x60,0x5e,0x44,0xd5,0xff,0xb9,0x79,0x66,0xb2,0xcb,0x93,0xc1,0x89,0xe4,0xc5,0xa8,0x5d,0xb8,0x7f,0xad,0x7a,0xb8,0xd6,0x24,0x63,0xc5,0x9b,0x59,},{0x48,0x89,0x85,0x5f,0xe4,0x11,0x6b,0x49,0x13,0x92,0x7f,0x47,0xf2,0x27,0x3b,0xf5,0x59,0xc3,0xb3,0x94,0xa9,0x83,0x63,0x1a,0x25,0xae,0x59,0x70,0x33,0x18,0x5e,0x46,},{0xbf,0x91,0x15,0xfd,0x3d,0x02,0x70,0x6e,0x39,0x8d,0x4b,0xf3,0xb0,0x2a,0x82,0x67,0x4f,0xf3,0x04,0x15,0x08,0xfd,0x39,0xd2,0x9f,0x86,0x7e,0x50,0x16,0x34,0xb9,0x26,0x1f,0x51,0x6a,0x79,0x4f,0x98,0x73,0x8d,0x7c,0x70,0x13,0xa3,0xf2,0xf8,0x58,0xff,0xdd,0x08,0x04,0x7f,0xb6,0xbf,0x3d,0xdd,0xfb,0x4b,0x4f,0x4c,0xbe,0xef,0x30,0x03,},\"\\x28\\xa5\\x5d\\xda\\x6c\\xd0\\x84\\x4b\\x65\\x77\\xc9\\xd6\\xda\\x07\\x3a\\x4d\\xc3\\x5c\\xbc\\x98\\xac\\x15\\x8a\\xb5\\x4c\\xf8\\x8f\\xd2\\x0c\\xc8\\x7e\\x83\\xc4\\xbb\\xa2\\xd7\\x4d\\x82\\xce\\x0f\\x48\\x54\\xec\\x4d\\xb5\\x13\\xde\\x40\\x04\\x65\\xaa\\xa5\\xee\\xe7\\x90\\xbc\\x84\\xf1\\x63\\x37\\x07\\x2d\\x3a\\x91\\xcd\\xe4\\x0d\\x6e\\x0d\\xf1\\xba\\x0c\\xc0\\x64\\x5f\\x5d\\x5c\\xbb\\xb6\\x42\\x38\\x1d\\x7b\\x9e\\x21\\x1d\\x25\\x26\\x7a\\x8a\\xcf\\x77\\xd1\\xed\\xb6\\x9c\\x3a\\x63\\x0f\\x5b\\x13\\x3d\\x24\\xf0\\x46\\xa8\\x1b\\xf2\\x2f\\xf0\\x3b\\x31\\xd8\\x44\\x7e\\x12\\xc3\\xf7\\xb7\\x71\\x14\\xa7\\x0c\\xbd\\x20\\xbb\\xd0\\x8b\\x0b\\x38\\x27\\xa6\\xbb\\xcf\\x90\\x40\\x9e\\x34\\x44\\x47\\xa7\\xfb\\xc5\\x9b\\xdd\\x97\\xd7\\x29\\x07\\x1f\\x8d\\x71\\xdc\\xc3\\x3e\\x6e\\xf2\\xcb\\xab\\x1d\\x41\\x1e\\xdf\\x13\\x73\\x4d\\xb1\\xdd\\x97\\x03\\x27\\x6f\\x5e\\xb2\\xd6\\xaa\\x2c\\xb8\\x95\\x2d\\xd6\\x71\\x2b\\xfa\\xe8\\x09\\xce\\x08\\xc3\\xaa\\x50\\x2b\\x81\\x35\\x71\\x3f\\xac\\x0a\\x9c\\x25\\xb1\\xd4\\x5b\\x6a\\x58\\x31\\xe0\\x24\\x21\\xbb\\xa6\\x5b\\x81\\xa5\\x96\\xef\\xa2\\x4b\\x05\\x76\\xbd\\x1d\\xc7\\xfd\\xfb\\x49\\xbe\\x76\\x28\\x75\\xe8\\x1b\\xd5\\x40\\x72\\x2b\\xc0\\x61\\x40\\xb9\\xaa\\x2e\\xf7\\xb8\\x4a\\x80\\x1e\\x41\\xde\\xd6\\x8d\\x45\\x46\\xac\\x48\\x73\\xd9\\xe7\\xce\\xd6\\x49\\xb6\\x4f\\xad\\xaf\\x0b\\x5c\\x4b\\x6e\\xb8\\xd0\\x36\\x31\\x52\\x33\\xf4\\x32\\x6c\\xa0\\x1e\\x03\\x39\\x30\\x50\\xcd\\x02\\x7c\\x24\\xf6\\x73\\x03\\xfb\\x84\\x6b\\xd2\\xc6\\xb3\\xdb\\xa0\\x6b\\xed\\x0d\\x59\\xa3\\x62\\x89\\xd2\\x4b\\xd6\\x48\\xf7\\xdb\\x0b\\x3a\\x81\\x34\\x66\\x12\\x59\\x3e\\x3d\\xdd\\x18\\xc5\\x57\"},\n{{0x33,0x37,0x1d,0x9e,0x89,0x2f,0x98,0x75,0x05,0x2a,0xc8,0xe3,0x25,0xba,0x50,0x5e,0x74,0x77,0xc1,0xac,0xe2,0x4b,0xa7,0x82,0x26,0x43,0xd4,0x3d,0x0a,0xce,0xf3,0xde,},{0x35,0x92,0x9b,0xde,0xd2,0x7c,0x24,0x9c,0x87,0xd8,0xb8,0xd8,0x2f,0x59,0x26,0x0a,0x57,0x53,0x27,0xb5,0x46,0xc3,0xa1,0x67,0xc6,0x9f,0x59,0x92,0xd5,0xb8,0xe0,0x06,},{0x98,0x5c,0xa4,0x46,0xdd,0xc0,0x07,0x82,0x7c,0xc8,0xf2,0x85,0x2c,0xbd,0x81,0x15,0xef,0x8c,0x59,0x75,0xe9,0xd7,0xce,0x96,0xd7,0x4d,0xfe,0xd8,0x59,0xaa,0x14,0xa4,0xc1,0x52,0x54,0x00,0x6b,0xea,0x5e,0x08,0x35,0x9e,0xfe,0x26,0x25,0xd7,0x15,0xe0,0x89,0x7e,0xe5,0xa1,0x6f,0x15,0x12,0x03,0xbe,0x50,0x10,0x41,0x86,0x37,0xde,0x05,},\"\\x27\\xa3\\x2e\\xfb\\xa2\\x82\\x04\\xbe\\x59\\xb7\\xff\\x5f\\xe4\\x88\\xca\\x15\\x8a\\x91\\xd5\\x98\\x60\\x91\\xec\\xc4\\x45\\x8b\\x49\\xe0\\x90\\xdd\\x37\\xcb\\xfe\\xde\\x7c\\x0f\\x46\\x18\\x6f\\xab\\xcb\\xdf\\xf7\\x8d\\x28\\x44\\x15\\x58\\x08\\xef\\xff\\xd8\\x73\\xed\\x9c\\x92\\x61\\x52\\x6e\\x04\\xe4\\xf7\\x05\\x0b\\x8d\\x7b\\xd2\\x67\\xa0\\xfe\\x3d\\x5a\\x44\\x93\\x78\\xd5\\x4a\\x4f\\xeb\\xbd\\x2f\\x26\\x82\\x43\\x38\\xe2\\xaa\\xaf\\x35\\xa3\\x2f\\xf0\\xf6\\x25\\x04\\xbd\\xa5\\xc2\\xe4\\x4a\\xbc\\x63\\x15\\x9f\\x33\\x6c\\xf2\\x5e\\x6b\\xb4\\x0d\\xdb\\x7d\\x88\\x25\\xdf\\xf1\\x8f\\xd5\\x1f\\xc0\\x19\\x51\\xea\\xed\\xcd\\x33\\x70\\x70\\x07\\xe1\\x20\\x3c\\xa5\\x8b\\x4f\\x7d\\x24\\x2f\\x81\\x66\\xa9\\x07\\xe0\\x99\\x93\\x2c\\x00\\x1b\\xfb\\x1e\\xc9\\xa6\\x1e\\x0e\\xf2\\xda\\x4e\\x84\\x46\\xaf\\x20\\x82\\x01\\x31\\x5d\\x69\\x68\\x17\\x10\\xd4\\x25\\xd2\\x40\\x0c\\x38\\x7d\\x7b\\x9d\\xf3\\x21\\xa4\\xae\\xc6\\x02\\xb9\\xc6\\x56\\xc3\\xe2\\x31\\x0b\\xff\\x87\\x56\\xd1\\x8b\\x80\\x21\\x34\\xb1\\x56\\x04\\xf4\\xed\\xc1\\x11\\x14\\x9a\\x98\\x79\\xe3\\x12\\x41\\xdd\\x34\\xf7\\x02\\xf4\\xc3\\x49\\x61\\x7b\\x13\\x52\\x97\\x69\\xa7\\x72\\xf5\\xe5\\x2a\\x89\\xc0\\x98\\xe0\\xdc\\xa5\\x92\\x06\\x67\\x89\\x3a\\x25\\x00\\x61\\xb1\\x79\\x91\\x62\\x6e\\xb9\\x31\\x92\\x98\\x68\\x5b\\xe4\\x6b\\x6a\\x8b\\x68\\x42\\x24\\x44\\xfa\\x5a\\x36\\xbc\\xf3\\xa6\\x87\\xe2\\xec\\xcb\\x93\\x22\\xc8\\x7d\\xc8\\x01\\x65\\xda\\x89\\x89\\x30\\x85\\x0b\\x98\\xfc\\x86\\x3c\\xad\\xa1\\xaa\\x99\\xc6\\xd6\\x1c\\x45\\x1b\\x9c\\xcf\\x48\\x74\\xc7\\xf0\\xe7\\x5b\\x0a\\x0c\\x60\\x2f\\x04\\x48\\x12\\xc7\\x17\\x65\\xad\\xaf\\x02\\x02\\x53\\x95\\xb0\"},\n{{0xbe,0xed,0xb8,0x07,0x3d,0xf5,0x8f,0x8c,0x1b,0xff,0xbd,0xbd,0x77,0xec,0x7d,0xec,0xb2,0xc8,0x2a,0x9b,0xab,0xec,0xef,0xc0,0x33,0x15,0x07,0xbd,0xc2,0xc2,0xa7,0xe7,},{0xb2,0x7e,0x90,0x8b,0x80,0x5e,0x29,0x6f,0xc3,0x0d,0x2e,0x47,0x4b,0x06,0x0c,0xd5,0x0c,0x0f,0x6f,0x52,0x0b,0x36,0x71,0x71,0x21,0x83,0xbd,0x89,0xd4,0xe7,0x33,0xe9,},{0x8c,0x89,0x0c,0xcc,0xad,0xc7,0x76,0x0e,0x1e,0x82,0xe4,0x3c,0x44,0xb3,0xdc,0x0b,0x68,0x5a,0x48,0xb4,0x79,0xae,0x13,0xcc,0x0a,0x6b,0x05,0x57,0xd0,0xfb,0x1c,0xba,0xbb,0xa6,0x3d,0x2a,0x96,0x84,0x34,0x12,0xea,0x8d,0x36,0xc5,0x0a,0xcb,0xf5,0x2b,0x92,0xcf,0xb2,0xdc,0xe4,0x9d,0xc4,0x8a,0xf6,0xdd,0xcf,0x8e,0xe4,0x7a,0x86,0x08,},\"\\x35\\xca\\x57\\xf0\\xf9\\x15\\xe5\\x20\\x9d\\x54\\xea\\x4b\\x87\\x1f\\xfb\\x58\\x53\\x54\\xdf\\x1b\\x4a\\x4a\\x17\\x96\\xfb\\xe4\\xd6\\x22\\x7d\\x3e\\x1a\\xba\\x51\\x71\\xed\\x03\\x91\\xa7\\x9e\\x83\\xe2\\x4d\\x82\\xfd\\xaf\\xd1\\x5c\\x17\\xb2\\x8b\\xf6\\xc9\\x4d\\x61\\x8c\\x74\\xd6\\x52\\x64\\xe5\\x8f\\xaa\\xac\\xd2\\x90\\x28\\x72\\xfd\\xd0\\xef\\xa2\\x2e\\x8d\\x2d\\x7c\\xe8\\xe3\\xb8\\x19\\x7f\\x0c\\x36\\x15\\xb0\\xa3\\x85\\x23\\x5f\\xa9\\xfd\\x8e\\x45\\x64\\xee\\x6e\\x6b\\x16\\x50\\xb4\\xcf\\xb9\\x4d\\x87\\x2c\\x80\\x5c\\x32\\xd4\\xf3\\xa1\\x8f\\x96\\x64\\x61\\xd3\\xad\\xbb\\x60\\x5f\\xa5\\x25\\x88\\x4f\\x8e\\xb1\\x97\\x62\\x73\\x96\\xba\\x4d\\x99\\x5d\\x78\\xac\\x02\\x94\\x8a\\x0e\\xaa\\xbb\\x58\\x51\\x9b\\x9a\\x8e\\x2e\\x79\\x85\\xcd\\x1d\\xe2\\xc7\\x1d\\x89\\x18\\xd9\\x6a\\x01\\x68\\x66\\x0c\\xe1\\x7c\\xdd\\xf3\\x64\\xe3\\xec\\x0d\\x4b\\xd9\\x0f\\x21\\x04\\x75\\x1a\\x19\\x27\\xee\\x1d\\x23\\xf3\\xe7\\xa6\\x98\\x40\\xed\\x04\\x0b\\x00\\xe5\\xf6\\xe4\\x86\\x6e\\xc5\\x88\\x13\\x14\\x9c\\xc3\\x82\\xae\\xbf\\x61\\x62\\x60\\x8c\\x79\\x57\\x4d\\x55\\x3f\\x47\\x23\\x0e\\x92\\x4a\\x0e\\xf1\\xeb\\xf5\\x5d\\x8e\\x1a\\x52\\xab\\xb6\\x2a\\x2d\\x7a\\xc8\\x60\\x27\\xc7\\xc0\\x3c\\xc8\\x3f\\xa1\\x94\\x9d\\xa2\\x9e\\x2f\\x30\\x37\\xab\\x98\\x6f\\xd2\\xff\\xfe\\x65\\x0e\\x31\\x49\\xba\\xba\\xe5\\xa5\\x0b\\x1e\\xe9\\x69\\x6f\\x3b\\xab\\xec\\x72\\xe2\\x96\\x97\\xc8\\x24\\x22\\x81\\x4d\\x27\\x20\\x85\\x50\\x0f\\xd8\\x37\\xfe\\x3c\\x7a\\x97\\x3e\\xf4\\xc1\\x69\\xaf\\x12\\xdd\\x7f\\x02\\x70\\x06\\x20\\xbb\\x04\\x5b\\xdb\\xf8\\x46\\x23\\xf3\\x26\\x35\\x05\\x70\\xb3\\xca\\xdb\\xc9\\xae\\xa4\\x20\\x0b\\x28\\x28\\x7e\\x17\\xab\"},\n{{0x91,0x84,0xef,0x61,0x88,0x16,0x83,0x25,0x92,0xbc,0x8e,0xb3,0x5f,0x4f,0xfd,0x4f,0xf9,0x8d,0xfb,0xf7,0x77,0x6c,0x90,0xf2,0xaa,0xd2,0x12,0xce,0x7e,0x03,0x35,0x1e,},{0x68,0x7b,0x77,0x26,0x01,0x0d,0x9b,0xde,0x2c,0x90,0xe5,0x73,0xcd,0x2a,0x2a,0x70,0x2f,0xf2,0x8c,0x4a,0x2a,0xf7,0x0a,0xfc,0x73,0x15,0xc9,0x4d,0x57,0x56,0x01,0xe5,},{0xb3,0xc2,0x4e,0x75,0x13,0x2c,0x56,0x34,0x75,0x42,0x2d,0x5e,0xa4,0x12,0xb5,0xc1,0xe8,0xe6,0xe5,0xea,0x1c,0x08,0xea,0xd1,0x39,0x3c,0x41,0x2d,0xa1,0x34,0xc9,0xa1,0x63,0x82,0x84,0xea,0x7e,0x2c,0xa0,0x32,0xfe,0x3d,0x3e,0x32,0xa9,0x06,0x6a,0x8c,0x88,0x39,0x90,0x3f,0x6e,0xf4,0x6e,0x96,0x6b,0xb5,0xe4,0x92,0xd8,0xc2,0xaa,0x00,},\"\\x72\\x9e\\xb7\\xe5\\x4a\\x9d\\x00\\xc5\\x86\\x17\\xaf\\x18\\xc3\\x45\\xb8\\xdc\\x6e\\x5b\\x4e\\x0f\\x57\\xde\\x2f\\x3c\\x02\\xe5\\x4a\\x2e\\xc8\\xf1\\x42\\x5e\\xc2\\xe2\\x40\\x77\\x5b\\x5a\\xb0\\xc1\\x0f\\x84\\xac\\x8b\\xaf\\xda\\x45\\x84\\xf7\\xe2\\x1c\\x65\\x5f\\xae\\xcd\\x80\\x30\\xa9\\x89\\x06\\xbd\\x68\\x39\\x8f\\x26\\xb5\\xd5\\x8d\\x92\\xb6\\xcf\\x04\\x5e\\x9b\\xd9\\x74\\x3c\\x74\\xc9\\xa3\\x42\\xec\\x61\\xce\\x57\\xf3\\x7b\\x98\\x1e\\xac\\x4d\\x8b\\xf0\\x34\\x60\\x88\\x66\\xe9\\x85\\xbb\\x68\\x68\\x6a\\x68\\xb4\\xa2\\xaf\\x88\\xb9\\x92\\xa2\\xa6\\xd2\\xdc\\x8c\\xe8\\x8b\\xfb\\x0a\\x36\\xcf\\x28\\xbb\\xab\\x70\\x24\\xab\\xfa\\x2b\\xea\\x53\\x31\\x3b\\x66\\xc9\\x06\\xf4\\xf7\\xcf\\x66\\x97\\x0f\\x54\\x00\\x95\\xbd\\x01\\x04\\xaa\\x49\\x24\\xdd\\x82\\xe1\\x54\\x13\\xc2\\x26\\x79\\xf8\\x47\\xe4\\x8c\\xd0\\xc7\\xec\\x1f\\x67\\x7e\\x00\\x5f\\xec\\x01\\x77\\xfb\\xd5\\xc5\\x59\\xfc\\x39\\xad\\xd6\\x13\\x99\\x1f\\xba\\xea\\xe4\\xd2\\x4d\\x39\\xd3\\x09\\xef\\x74\\x64\\x7f\\x81\\x92\\xcc\\x4c\\x62\\xd0\\x64\\x20\\x28\\xc7\\x6a\\x1b\\x95\\x1f\\x6b\\xc9\\x63\\x9d\\xeb\\x91\\xec\\xc0\\x8b\\xe6\\x04\\x3f\\x21\\x09\\x70\\x5a\\x42\\xc7\\xea\\xe7\\x12\\x64\\x9d\\x91\\xd9\\x6c\\xcb\\xbf\\xb6\\x3d\\x8d\\x0d\\xd6\\xdd\\x11\\x21\\x60\\xf6\\x13\\x61\\xec\\xdc\\x67\\x93\\x92\\x9c\\xa9\\xae\\xf9\\xab\\x56\\x94\\x4a\\x6f\\xa4\\xa7\\xdf\\x1e\\x27\\x9e\\xaf\\x58\\xce\\x83\\x23\\xa9\\xcf\\x62\\xc9\\x42\\x79\\xff\\xf7\\x44\\x0f\\xbc\\x93\\x6b\\xaa\\x61\\x48\\x9c\\x99\\x93\\x30\\xba\\xdc\\xb9\\xfc\\x0e\\x18\\x4b\\xc5\\x09\\x3f\\x33\\x0c\\xbb\\x24\\x2f\\x71\\xfb\\x37\\x87\\x38\\xfe\\xa1\\x05\\x11\\xdd\\x43\\x83\\x64\\xd7\\xf7\\x6b\\xcc\"},\n{{0x35,0x4e,0x13,0x15,0x2e,0xe1,0xfe,0x74,0x8a,0x12,0x52,0x20,0x4c,0x65,0x27,0xbd,0xc1,0xb1,0xeb,0x2e,0xb5,0x36,0x78,0x15,0x0e,0x63,0x59,0x92,0x47,0x08,0xd8,0x12,},{0xd4,0x5f,0xf6,0xc5,0xfb,0x83,0xe7,0xbb,0x96,0x69,0xaa,0x89,0x60,0xde,0xb7,0xdb,0xc6,0x65,0xc9,0x88,0x43,0x9b,0x6c,0x9e,0xf6,0x72,0xc6,0x81,0x1d,0xc8,0xbc,0xf6,},{0xde,0x2b,0x46,0xe6,0x5f,0x3d,0xec,0xef,0x34,0x33,0x2e,0x50,0x0f,0x2e,0x11,0x30,0x6f,0xbd,0xcf,0x1b,0xe8,0x5a,0x1c,0x1e,0xe6,0x8b,0xa3,0x04,0x5d,0xce,0xc2,0xc7,0xbe,0x60,0x8d,0x22,0x92,0x7d,0xa1,0xf4,0x4c,0x0e,0x20,0x83,0xae,0x62,0x2c,0xf3,0xc2,0x9d,0x89,0x38,0x87,0x99,0x4e,0xfc,0xfa,0x2c,0xa5,0x94,0xf5,0x05,0x1f,0x03,},\"\\x8e\\x5f\\xcc\\xf6\\x6b\\x1b\\xa6\\x16\\x9c\\xb6\\x85\\x73\\x3d\\x9d\\x0e\\x01\\x90\\x36\\x1c\\x90\\xbc\\xab\\x95\\xc1\\x63\\x28\\x5a\\x97\\xfe\\x35\\x6d\\x2b\\xdc\\xde\\x3c\\x93\\x80\\x26\\x88\\x05\\xa3\\x84\\xd0\\x63\\xda\\x09\\xcc\\xd9\\x96\\x9c\\xc3\\xff\\x74\\x31\\xe6\\x0a\\x8e\\x9f\\x86\\x9c\\xd6\\x2f\\xaa\\x0e\\x35\\x61\\x51\\xb2\\x80\\xbc\\x52\\x6e\\x57\\x7c\\x2c\\x53\\x8c\\x9a\\x72\\x4d\\xc4\\x8b\\xf8\\x8b\\x70\\x32\\x1d\\x7e\\x1e\\xee\\xdb\\x3c\\x4a\\xf7\\x06\\x74\\x8c\\x94\\x2e\\x67\\xbd\\xab\\xdb\\x41\\xbe\\xc2\\x97\\x7b\\x15\\x23\\x06\\x9e\\x31\\xe2\\x9b\\x76\\x30\\x02\\x88\\xf8\\x8a\\x51\\xb3\\x84\\xb8\\x0c\\xc2\\x52\\x6f\\x16\\x79\\x34\\x0d\\xde\\xc3\\x88\\x1f\\x5c\\xd2\\x8b\\x03\\x78\\xd9\\xcd\\x0a\\x81\\x2b\\x68\\xdd\\x3f\\x68\\xf7\\xa2\\x3e\\x1b\\x54\\xbe\\xe7\\x46\\x6a\\xc7\\x65\\xcf\\x38\\xdf\\x04\\xd6\\x74\\x41\\xdf\\xa4\\x98\\xc4\\xbf\\xfc\\x52\\x04\\x5f\\xa6\\xd2\\xdb\\xcd\\xbf\\xa3\\x3d\\xfa\\xa7\\x76\\x44\\xff\\xcc\\xef\\x0d\\xec\\xdb\\x67\\x90\\xc7\\x0a\\x0d\\x73\\x4e\\xc2\\x87\\xcc\\x33\\x8c\\xb5\\xa9\\x09\\xc0\\x05\\x51\\x89\\x30\\x11\\x69\\xc4\\xf7\\x70\\x2c\\x05\\xc0\\x91\\x1a\\x27\\xb1\\x6e\\xf9\\xed\\x93\\x4f\\xa6\\xa0\\xca\\x7b\\x13\\xe4\\x13\\x52\\x34\\x22\\x53\\x56\\x47\\x96\\x80\\x30\\xed\\xc4\\x0c\\xd7\\x3e\\x7d\\x6b\\x34\\x5b\\x75\\x81\\xf4\\x38\\x31\\x6d\\x68\\xe3\\xcd\\x29\\x2b\\x84\\x6d\\x3f\\x4f\\x7c\\x48\\x62\\xbc\\x7e\\x6b\\x3f\\xb8\\x9a\\x27\\xf6\\xf6\\x0c\\xd7\\xdb\\x2e\\x34\\xec\\x9a\\xae\\x10\\x13\\xfe\\x37\\xac\\xff\\x8a\\xd8\\x88\\xcb\\x9a\\x59\\x3e\\xf5\\xe6\\x21\\xea\\xe5\\x18\\x6c\\x58\\xb3\\x1d\\xcf\\xde\\x22\\x87\\x0e\\x33\\x6d\\x33\\xf4\\x40\\xf6\\xb8\\xd4\\x9a\"},\n{{0x7f,0xf6,0x2d,0x4b,0x3c,0x4d,0x99,0xd3,0x42,0xd4,0xbb,0x40,0x1d,0x72,0x6b,0x21,0xe9,0x9f,0x4e,0xf5,0x92,0x14,0x9f,0xc3,0x11,0xb6,0x87,0x61,0xf5,0x56,0x7f,0xf6,},{0x7f,0xdf,0xdb,0x9e,0xca,0x29,0xd3,0xf0,0x1d,0x94,0x86,0xd7,0xe1,0x12,0xce,0x03,0xaa,0x37,0xb9,0x13,0x26,0xa4,0x28,0x3b,0x9c,0x03,0x99,0x9c,0x5e,0xda,0x09,0x9a,},{0x05,0x8f,0x79,0x92,0x7f,0xbf,0x61,0x78,0x72,0x48,0x15,0xc7,0xb1,0x1c,0x63,0xba,0xaa,0x90,0xbc,0xc1,0x5d,0x72,0x72,0xbe,0x08,0x2f,0x8a,0x91,0x41,0x86,0x1c,0x81,0x64,0x33,0x05,0x5f,0x6c,0xf6,0x49,0x14,0x24,0x85,0x3f,0x9e,0xc7,0x8b,0xb9,0x1a,0xce,0x91,0x3a,0x93,0x41,0x1b,0x4e,0x5e,0xd5,0x8b,0xc4,0xba,0x57,0x15,0xc6,0x0a,},\"\\x99\\xc4\\x4c\\x79\\x65\\x72\\xa4\\x82\\x3f\\xc6\\xc3\\x80\\x77\\x30\\x83\\x91\\x73\\x77\\x4c\\x05\\xdb\\xfc\\x14\\x92\\xed\\x0d\\x00\\x50\\x9a\\x95\\xa1\\xde\\x37\\x27\\x4b\\x31\\x35\\xed\\x04\\x56\\xa1\\x71\\x8e\\x57\\x65\\x97\\xdc\\x13\\xf2\\xa2\\xab\\x37\\xa4\\x5c\\x06\\xcb\\xb4\\xa2\\xd2\\x2a\\xfa\\xd4\\xd5\\xf3\\xd9\\x0a\\xb3\\xd8\\xda\\x4d\\xcd\\xaa\\x06\\xd4\\x4f\\x22\\x19\\x08\\x84\\x01\\xc5\\xdc\\xee\\xe2\\x60\\x55\\xc4\\x78\\x2f\\x78\\xd7\\xd6\\x3a\\x38\\x06\\x08\\xe1\\xbe\\xf8\\x9e\\xee\\xf3\\x38\\xc2\\xf0\\x89\\x7d\\xa1\\x06\\xfa\\xfc\\xe2\\xfb\\x2e\\xbc\\x5d\\xb6\\x69\\xc7\\xc1\\x72\\xc9\\xcf\\xe7\\x7d\\x31\\x09\\xd2\\x39\\xfe\\x5d\\x00\\x5c\\x8e\\xe7\\x51\\x51\\x1b\\x5a\\x88\\x31\\x7c\\x72\\x9b\\x0d\\x8b\\x70\\xb5\\x2f\\x6b\\xd3\\xcd\\xa2\\xfe\\x86\\x5c\\x77\\xf3\\x6e\\x4f\\x1b\\x63\\x5f\\x33\\x6e\\x03\\x6b\\xd7\\x18\\xbe\\xc9\\x0e\\xe7\\x8a\\x80\\x28\\x11\\x51\\x0c\\x40\\x58\\xc1\\xba\\x36\\x40\\x17\\x25\\x3a\\xa8\\x42\\x92\\x2e\\x1d\\xd7\\xd7\\xa0\\xf0\\xfc\\x9c\\x69\\xe4\\x3f\\xc4\\xea\\xef\\xfa\\xaf\\x1a\\xe5\\xfa\\x5d\\x2d\\x73\\xb4\\x30\\x79\\x61\\x7b\\xab\\xa0\\x30\\x92\\x3f\\xe5\\xb1\\x3d\\x2c\\x1c\\x4f\\xe6\\xfa\\xc3\\xf2\\xdb\\x74\\xe2\\x02\\x0a\\x73\\x4b\\x61\\x21\\xa0\\x30\\x2f\\xce\\x82\\x0b\\xa0\\x58\\x0c\\xe6\\x13\\x53\\x48\\xfd\\xf0\\x63\\x2e\\x00\\x08\\xdf\\x03\\xee\\x11\\x21\\x68\\xf5\\xcf\\xa0\\x03\\x7a\\x26\\xa1\\xf6\\x9b\\x1f\\x13\\x17\\xed\\xf2\\xa3\\xab\\x36\\x74\\x55\\xa7\\x7e\\x00\\x69\\x12\\x15\\xd7\\xaa\\x31\\x33\\xc2\\x15\\x9d\\x3d\\xa2\\xb1\\x34\\xcf\\x04\\xf0\\xde\\xfb\\xf0\\x7a\\x60\\x64\\x01\\x1e\\x64\\xdd\\x14\\xd4\\xf8\\xf0\\x64\\x35\\x66\\x55\\x42\\x88\\x04\\xc2\\x77\\x1a\"},\n{{0x6c,0xab,0xad,0xd0,0x3f,0x8a,0x2e,0x6e,0xba,0xb9,0x6a,0x74,0xf8,0x0e,0x18,0x16,0x4e,0x4d,0x1b,0x6b,0xaa,0x67,0x8f,0x5a,0x82,0xe2,0x56,0x04,0xaf,0x98,0x9a,0xaf,},{0x2a,0x4a,0x31,0x79,0x56,0x41,0x94,0xe0,0x01,0x00,0xc1,0x8b,0xc3,0x53,0x51,0xd8,0xb1,0x35,0xbb,0xae,0x5b,0x32,0xb2,0x8f,0xce,0x1d,0x7b,0x67,0x66,0xca,0x4b,0x32,},{0x4e,0x65,0xc6,0xc1,0xd4,0x93,0x04,0x5e,0x8a,0x92,0x50,0xe3,0x97,0xc1,0xd1,0xd3,0x0f,0xfe,0xd2,0x4d,0xb6,0x6a,0x89,0x61,0xaa,0x45,0x8f,0x8f,0x0f,0xcb,0x76,0x0c,0x39,0xfe,0x86,0x57,0xd7,0xab,0x8f,0x84,0x00,0x0b,0x96,0xd5,0x19,0x71,0x7c,0xff,0x71,0xf9,0x26,0x52,0x2c,0x1e,0xfe,0xc7,0xf8,0xb2,0x62,0x4e,0xae,0x55,0xf6,0x0c,},\"\\x27\\x9f\\x78\\xcf\\x3b\\x9c\\xcf\\xc6\\xe1\\xb0\\x1e\\x1a\\x82\\xf5\\x0e\\xd1\\x72\\xe9\\xa8\\xe1\\xe7\\x02\\xbb\\x15\\x66\\x1d\\xd7\\xdc\\x3a\\x45\\x6f\\xf7\\xa7\\xa7\\xfd\\xfb\\x08\\x1d\\xb3\\x86\\x70\\x79\\x63\\x0c\\x7f\\x70\\xfd\\x75\\x32\\x92\\xec\\x60\\xec\\xbf\\x50\\x63\\x2e\\x9a\\xa4\\x5b\\x99\\x65\\x05\\xc6\\x6e\\x6d\\xc3\\xc6\\xae\\x89\\x2e\\x21\\xb6\\xa8\\x70\\x5e\\x4b\\xba\\xe8\\xf1\\x6a\\x33\\x78\\x55\\x4b\\x31\\xfd\\xb0\\x13\\x9d\\xcd\\x15\\xc9\\x6a\\x8a\\x7e\\x4b\\x88\\x75\\x6a\\x86\\xd1\\x8d\\xb5\\xdc\\x74\\xfd\\x76\\x91\\x19\\x7d\\xd8\\x8e\\x2c\\x7d\\x5d\\xf5\\x2b\\x04\\x93\\x44\\xcd\\xc4\\x77\\xc9\\xcd\\x7e\\x89\\xed\\xa9\\x9c\\xcf\\xb1\\xd0\\x08\\x14\\xd0\\x15\\x2b\\x96\\x54\\xdf\\x32\\x79\\x37\\x2c\\xa5\\xf1\\x8b\\x1c\\x94\\x6f\\x28\\x94\\xa7\\x6b\\x07\\x9d\\xdb\\x1c\\x3c\\xd6\\x1f\\xbb\\x96\\x9a\\xee\\xc9\\x19\\x3a\\x6b\\x88\\xfb\\x7d\\x13\\x6c\\x07\\xf9\\x82\\x1e\\x5c\\x10\\x74\\xb4\\xe9\\x3b\\xca\\xf6\\xfa\\x14\\xd0\\xd1\\xd7\\xe1\\x70\\x75\\x89\\xd7\\x7e\\xc1\\x33\\x72\\x06\\xe5\\x3a\\x1f\\x06\\xcc\\x26\\x67\\x2f\\xf9\\x5c\\x13\\xd5\\xff\\x44\\x47\\x66\\x93\\x1b\\xa3\\x0a\\x0a\\xfd\\xcd\\xad\\xd2\\x09\\x8e\\x9c\\x41\\xfd\\x87\\xa3\\xf2\\x3c\\xd1\\x6d\\xbb\\x0e\\xfb\\xf8\\x09\\x2c\\xe3\\x3e\\x32\\x7f\\x42\\x61\\x09\\x90\\xe1\\xce\\xe6\\xcb\\x8e\\x54\\x95\\x1a\\xa0\\x81\\xe6\\x97\\x65\\xae\\x40\\x09\\xae\\xed\\x75\\x8e\\x76\\x8d\\xe5\\x0c\\x23\\xd9\\xa2\\x2b\\x4a\\x06\\xdc\\x4d\\x19\\xfc\\x8c\\xbd\\x0c\\xde\\xf4\\xc9\\x83\\x46\\x17\\x55\\xd0\\xa3\\xb5\\xd6\\xa9\\xc1\\x22\\x53\\xe0\\x95\\x68\\x33\\x9f\\xf7\\xe5\\xf7\\x8c\\x5f\\xdf\\x7e\\xc8\\x9f\\x91\\x86\\xa6\\x21\\xa8\\xc0\\xee\\xd1\\x1b\\x67\\x02\\x2e\"},\n{{0x0f,0xa0,0xc3,0x2c,0x3a,0xe3,0x4b,0xe5,0x1b,0x92,0xf9,0x19,0x45,0x40,0x59,0x81,0xa8,0xe2,0x02,0x48,0x85,0x58,0xa8,0xe2,0x20,0xc2,0x88,0xc7,0xd6,0xa5,0x53,0x2d,},{0xd6,0xae,0xe6,0x2b,0xd9,0x1f,0xc9,0x45,0x36,0x35,0xff,0xcc,0x02,0xb2,0xf3,0x8d,0xca,0xb1,0x32,0x85,0x14,0x03,0x80,0x58,0x0c,0xcd,0xff,0x08,0x65,0xdf,0x04,0x92,},{0x7e,0x9a,0xb8,0x5e,0xe9,0x4f,0xe4,0xb3,0x5d,0xcb,0x54,0x53,0x29,0xa0,0xef,0x25,0x92,0x3d,0xe5,0xc9,0xdc,0x23,0xe7,0xdf,0x1a,0x7e,0x77,0xab,0x0d,0xcf,0xb8,0x9e,0x03,0xf4,0xe7,0x85,0xca,0x64,0x29,0xcb,0x2b,0x0d,0xf5,0x0d,0xa6,0x23,0x0f,0x73,0x3f,0x00,0xf3,0x3a,0x45,0xc4,0xe5,0x76,0xcd,0x40,0xbd,0xb8,0x4f,0x1a,0xe0,0x01,},\"\\x53\\xf4\\x4b\\xe0\\xe5\\x99\\x7f\\xf0\\x72\\x64\\xcb\\x64\\xba\\x13\\x59\\xe2\\x80\\x1d\\xef\\x87\\x55\\xe6\\x4a\\x23\\x62\\xbd\\xda\\xf5\\x97\\xe6\\x72\\xd0\\x21\\xd3\\x4f\\xfa\\xce\\x6d\\x97\\xe0\\xf2\\xb1\\xf6\\xae\\x62\\x5f\\xd3\\x3d\\x3c\\x4f\\x6e\\x9f\\xf7\\xd0\\xc7\\x3f\\x1d\\xa8\\xde\\xfb\\x23\\xf3\\x24\\x97\\x5e\\x92\\x1b\\xb2\\x47\\x32\\x58\\x17\\x7a\\x16\\x61\\x25\\x67\\xed\\xf7\\xd5\\x76\\x0f\\x3f\\x3e\\x3a\\x6d\\x26\\xaa\\xab\\xc5\\xfd\\xe4\\xe2\\x04\\x3f\\x73\\xfa\\x70\\xf1\\x28\\x02\\x09\\x33\\xb1\\xba\\x3b\\x6b\\xd6\\x94\\x98\\xe9\\x50\\x3e\\xa6\\x70\\xf1\\xed\\x88\\x0d\\x36\\x51\\xf2\\xe4\\xc5\\x9e\\x79\\xca\\xbc\\x86\\xe9\\xb7\\x03\\x39\\x42\\x94\\x11\\x2d\\x5d\\x8e\\x21\\x3c\\x31\\x74\\x23\\xb5\\x25\\xa6\\xdf\\x70\\x10\\x6a\\x9d\\x65\\x8a\\x26\\x20\\x28\\xb5\\xf4\\x51\\x00\\xcb\\x77\\xd1\\x15\\x0d\\x8f\\xe4\\x61\\xee\\xd4\\x34\\xf2\\x41\\x01\\x5f\\x32\\x76\\xad\\x7b\\x09\\xa2\\x91\\xb4\\xa7\\xf3\\x5e\\x3c\\x30\\x05\\x1c\\xbf\\x13\\xb1\\xd4\\xa7\\xfa\\x0c\\x81\\xa5\\x0f\\x93\\x9e\\x7c\\x49\\x67\\x3a\\xfd\\xc8\\x78\\x83\\xc9\\xe3\\xe6\\x1f\\x5a\\x1d\\xf0\\x37\\x55\\x47\\x0f\\xda\\x74\\xbf\\x23\\xea\\x88\\x67\\x6b\\x25\\x8a\\x97\\xa2\\x80\\xd5\\xf9\\x0b\\x52\\xb7\\x14\\xb5\\x96\\x03\\x5b\\xae\\x08\\xc8\\xd0\\xfe\\x6d\\x94\\xf8\\x94\\x95\\x59\\xb1\\xf2\\x7d\\x71\\x16\\xcf\\x59\\xdd\\x3c\\xfb\\xf1\\x82\\x02\\xa0\\x9c\\x13\\xf5\\xc4\\xfb\\xc8\\xd9\\x72\\x25\\x49\\x28\\x87\\xd3\\x28\\x70\\xc2\\x29\\x7e\\x34\\xde\\xbd\\x98\\x76\\xd6\\xd0\\x1a\\xc2\\x7a\\x16\\xb0\\x88\\xb0\\x79\\x07\\x9f\\x2b\\x20\\xfe\\xb0\\x25\\x37\\xcd\\xa3\\x14\\xc4\\x3c\\xb2\\xdc\\xa3\\x71\\xb9\\xdf\\x37\\xed\\x11\\xec\\x97\\xe1\\xa7\\xa6\\x99\\x3a\"},\n{{0x7b,0x06,0xf8,0x80,0x26,0xfa,0x86,0xf3,0x9f,0xce,0x24,0x26,0xf6,0x7c,0xc5,0x99,0x6b,0xed,0xd0,0xcf,0xc4,0xb5,0xeb,0xb1,0xb5,0xe3,0xed,0xbb,0x47,0xe0,0x80,0xaa,},{0x3f,0x14,0x69,0xee,0x6a,0x2e,0x78,0x67,0xe2,0xe9,0x01,0x2d,0x40,0x2c,0xf5,0xa4,0x86,0x14,0x97,0xc0,0x1d,0xf8,0x79,0xa1,0xde,0xb1,0xc5,0x39,0x83,0x0b,0x58,0xde,},{0x42,0xf1,0x33,0xe3,0x4e,0x3e,0xb7,0x03,0x2a,0x13,0x3e,0xd7,0x81,0x53,0x7e,0xc6,0x2e,0x44,0xa5,0xce,0x83,0x81,0xe5,0xe0,0xbf,0x9e,0x13,0xa9,0x14,0xa4,0xb2,0xc7,0x57,0x81,0x1d,0x6d,0x3b,0x1e,0x86,0x67,0x24,0x24,0xea,0x42,0x30,0xd1,0x0f,0x7c,0x61,0x0a,0xbb,0x70,0x69,0xe6,0x1e,0x31,0x9b,0x40,0x66,0xa2,0xbd,0x7b,0xc9,0x00,},\"\\x71\\x17\\x5d\\x4e\\x21\\x72\\x12\\x97\\xd9\\x17\\x6d\\x81\\x7f\\x4e\\x78\\x5d\\x96\\x00\\xd9\\x23\\xf9\\x87\\xfe\\x0b\\x26\\xfd\\x79\\xd3\\x3a\\x5e\\xa5\\xd1\\xe8\\x18\\xb7\\x1f\\x0f\\x92\\xb8\\xc7\\x3a\\xfd\\xda\\xbd\\xcc\\x27\\xf6\\xd1\\x6e\\x26\\xaa\\xfa\\x87\\x4c\\xfd\\x77\\xa0\\x0e\\x06\\xc3\\x6b\\x04\\x14\\x87\\x58\\x2b\\xb9\\x33\\x76\\x0f\\x88\\xb4\\x19\\x12\\x73\\x45\\x77\\x6e\\xa4\\x18\\xf8\\x35\\x22\\x25\\x4f\\xed\\x33\\x81\\x9b\\xc5\\xc9\\x5f\\x8f\\x84\\x04\\xcc\\x14\\x4e\\xbf\\x14\\x86\\xc8\\x85\\x15\\x40\\x9d\\x34\\x33\\xaa\\xf5\\x19\\xd9\\x92\\x0f\\x52\\x56\\xe6\\x29\\x41\\x9e\\x9a\\x95\\x58\\x0a\\x35\\xb0\\x69\\xb8\\xd2\\x55\\x33\\xdf\\xcb\\xc9\\x8a\\xd3\\x64\\x04\\xa9\\x51\\x80\\x8e\\x01\\x37\\x8c\\x03\\x26\\x63\\x26\\xd1\\x20\\x04\\x69\\x75\\xfd\\xe0\\x7d\\xae\\xf3\\x26\\x6c\\xaa\\xcd\\x82\\x1c\\x14\\x03\\x49\\x9d\\x7f\\xdf\\x17\\xc0\\x33\\xc8\\xd8\\xc3\\xf2\\x8f\\x16\\x2b\\x5f\\x09\\xdf\\xda\\xca\\x06\\x28\\x5f\\x00\\xc6\\xcb\\x98\\x6d\\xfd\\xf5\\x15\\x1a\\xa6\\x63\\x96\\x08\\xb5\\xb1\\x3e\\x78\\xd6\\x5a\\x43\\x68\\x58\\x5b\\x16\\x13\\x87\\x54\\xfb\\xd1\\x13\\x83\\x5a\\x68\\x6c\\xd0\\x66\\xc2\\xb8\\x9b\\xb0\\x95\\x3c\\x24\\xd5\\x0e\\x77\\xbf\\x0f\\xc4\\x57\\xc1\\xe0\\xfc\\xf5\\xd4\\x4d\\xa8\\xdb\\x9a\\x88\\xf0\\x62\\xbe\\x3b\\x68\\x8d\\x5c\\xdc\\xff\\x1d\\x1c\\x00\\xe8\\x1e\\xc9\\xd4\\x13\\x88\\x22\\x95\\xb3\\x41\\xfe\\xe8\\xfa\\x42\\x7d\\xc1\\x09\\xad\\xeb\\x5f\\x28\\x4e\\xec\\x20\\x2f\\x1b\\xef\\x11\\x5b\\xf9\\x6b\\x17\\x82\\xd3\\xcc\\xde\\xb6\\x82\\xb6\\x9b\\xf9\\x2d\\x17\\x0c\\x00\\x7d\\x5d\\xf8\\x0e\\x1e\\xd9\\x62\\xf6\\x77\\xdc\\x24\\xa1\\x45\\xa1\\xe4\\xe8\\x29\\xe8\\xde\\xc0\\x10\\x4e\\x5f\\x78\\x36\\x59\\x44\"},\n{{0xc3,0xf5,0xe1,0x49,0x96,0x8a,0x24,0xf4,0xde,0x91,0x19,0x53,0x19,0x75,0xf4,0x43,0x01,0x5c,0xcc,0xa3,0x05,0xd7,0x11,0x9e,0xd4,0x74,0x9e,0x8b,0xf6,0xd9,0x4f,0xc7,},{0x39,0xaa,0xcc,0xdb,0x94,0x8a,0x40,0x38,0x53,0x8a,0x45,0x88,0x32,0x2f,0x80,0x6b,0xb1,0x29,0xb5,0x87,0x6c,0x4b,0xec,0x51,0x27,0x1a,0xfe,0x4f,0x49,0x69,0x00,0x45,},{0x5f,0xa2,0xb5,0x31,0x67,0x7b,0x00,0xb8,0x5b,0x0a,0x31,0x3c,0xbd,0x47,0x9f,0x55,0xf4,0xab,0x3e,0xc5,0xcf,0xce,0x5e,0x45,0x4d,0x2b,0x74,0x17,0x6c,0xcc,0x33,0x99,0xc8,0x99,0xf9,0xd6,0xb5,0x1e,0xd4,0xc1,0xe7,0x61,0x85,0xac,0x9f,0xe7,0x30,0xc4,0xb4,0x01,0x40,0x44,0xf7,0x04,0x11,0x85,0xbc,0x3c,0x85,0x72,0x2e,0xb2,0xea,0x02,},\"\\xc4\\x63\\x70\\xe3\\x7f\\x2e\\x0c\\xad\\xcf\\x93\\x40\\x2f\\x1f\\x0c\\xb0\\x48\\xf5\\x28\\x81\\xba\\x75\\x0b\\x7a\\x43\\xf5\\x6a\\xb1\\x1c\\xe3\\x48\\x73\\x2f\\xb5\\x7e\\x7f\\x9a\\xaf\\x8d\\xfc\\xbe\\x45\\x5e\\x14\\xe9\\x83\\xc2\\x48\\xd0\\x26\\xa2\\x7e\\x7f\\x14\\x8d\\x5d\\xb5\\xa5\\x3f\\x94\\x63\\x57\\x02\\xb8\\x95\\x12\\x77\\x71\\x04\\x7a\\x87\\x6d\\x14\\x10\\x73\\x86\\xc5\\xe0\\xff\\x89\\x33\\x34\\x5b\\xbd\\x7a\\x93\\x6d\\x99\\x0d\\x33\\xef\\xa2\\x8c\\x2e\\xc4\\xe4\\x86\\x4f\\xfd\\x2f\\xf5\\x76\\xf7\\xc8\\x8f\\x95\\x4c\\xfc\\x1c\\x45\\x9e\\x88\\x3b\\xb7\\x12\\xda\\xe3\\xcd\\xf6\\x63\\x20\\x66\\xf1\\xf4\\xd1\\x3a\\x50\\x96\\x15\\xb3\\x36\\x0c\\xad\\xc5\\xa3\\x07\\xf2\\x3e\\x52\\xa5\\x1b\\x40\\xa6\\xfe\\xeb\\xe0\\xb1\\x8d\\x0e\\x9e\\xe4\\xe3\\x48\\xf3\\x3c\\xd8\\x1a\\x8d\\xef\\x22\\x2f\\x6a\\x59\\xb1\\x28\\x61\\xd3\\x35\\xbd\\x9a\\xf8\\x5c\\xc0\\x04\\xbe\\x46\\xf1\\xd3\\xa4\\x24\\xf4\\x87\\x0a\\xe9\\xdc\\x58\\x7e\\x5a\\x4a\\xde\\x13\\x6b\\x93\\x70\\x64\\x93\\x48\\xc3\\x3a\\xc3\\xbf\\x1f\\xeb\\xee\\xbf\\xfe\\xa3\\x70\\x85\\xed\\x59\\xca\\xc9\\xd9\\xe6\\x96\\x47\\x0b\\x23\\x46\\x09\\xe9\\xa1\\x0a\\x9d\\x43\\x1f\\xf9\\x1e\\x69\\xcb\\x51\\x35\\xfd\\x11\\x7f\\xf5\\x8a\\x36\\x53\\x97\\x44\\xeb\\xe7\\x0c\\xea\\x69\\x73\\xc0\\x0c\\x7a\\x4d\\x57\\xb6\\x2f\\x4a\\x71\\x36\\xd7\\x31\\xb8\\xe4\\x6f\\xf1\\x8e\\xc0\\xed\\x69\\x07\\x00\\x31\\x90\\x50\\x75\\xd8\\x54\\x1d\\x56\\x8c\\xfc\\xe6\\xee\\xb7\\x62\\x42\\xb7\\x81\\x9a\\x7b\\x6a\\x93\\x55\\x21\\x11\\xbb\\x88\\xf1\\x65\\x52\\x7c\\xfa\\x69\\x66\\xd3\\x9f\\xcb\\xe0\\xa7\\xde\\xa0\\x08\\xe3\\x9c\\x7a\\x3e\\x57\\x7a\\xb3\\x07\\xcd\\x1d\\x0e\\xa3\\x26\\x83\\x3d\\x52\\x65\\x4e\\x17\\x29\\x55\\xf3\\xfc\\xd4\"},\n{{0x42,0x30,0x5c,0x93,0x02,0xf4,0x5e,0xa6,0xf8,0x7e,0x26,0xe2,0x20,0x8f,0xd9,0x4b,0x3c,0x4a,0xd0,0x37,0xb1,0xb6,0xc8,0x3c,0xf6,0x67,0x7a,0xa1,0x09,0x6a,0x01,0x3c,},{0x3b,0x97,0xb1,0xf1,0x1c,0xe4,0x5b,0xa4,0x6f,0xfb,0xb2,0x5b,0x76,0xbf,0xc5,0xad,0x7b,0x77,0xf9,0x0c,0xc6,0x9e,0xd7,0x61,0x15,0xde,0xa4,0x02,0x94,0x69,0xd5,0x87,},{0x18,0xd0,0x5e,0x5d,0x01,0x66,0x8e,0x83,0xf4,0x0f,0xa3,0xbb,0xee,0x28,0xb3,0x88,0xac,0xf3,0x18,0xd1,0xb0,0xb5,0xad,0x66,0x8c,0x67,0x2f,0x34,0x5c,0x8e,0xda,0x14,0xc2,0xf8,0x84,0xcd,0x2a,0x90,0x39,0x45,0x9c,0xe0,0x81,0x0b,0xc5,0xb5,0x80,0xfe,0x70,0xd3,0x96,0x4a,0x43,0xed,0xb4,0x9e,0x73,0xa6,0xff,0x91,0x4b,0xbf,0x04,0x0c,},\"\\xd1\\x10\\x82\\x8d\\x44\\x91\\x98\\xd6\\x75\\xe7\\x4e\\x8e\\x39\\x43\\x9f\\xd1\\x5e\\x75\\xbf\\x2c\\xc1\\xf4\\x30\\xab\\xfb\\x24\\x58\\x36\\x88\\x5b\\xaf\\xc4\\x20\\xf7\\x54\\xb8\\x9d\\x2f\\xbb\\xf6\\xdd\\x34\\x90\\x79\\x2e\\x7a\\x4f\\x76\\x60\\x73\\xcf\\xe3\\xb3\\x02\\xd0\\x89\\x83\\x1a\\xce\\x86\\x9e\\x27\\x30\\xfd\\xe4\\x5c\\x21\\x21\\xec\\x3e\\xf2\\x17\\xaa\\x9c\\x43\\xfa\\x7c\\xc7\\xe9\\xed\\x0a\\x01\\xad\\x9f\\x1d\\x2f\\xc3\\x61\\x36\\x38\\xca\\x9f\\xc1\\x93\\xc9\\x8b\\x37\\x45\\x5b\\xf5\\xdb\\xf8\\xf3\\x8b\\x64\\x70\\x8d\\xfd\\xca\\x6c\\x21\\xf0\\x97\\x5f\\x10\\x17\\xc5\\xda\\x5f\\x64\\x34\\xbd\\xa9\\xf0\\x33\\xce\\xc2\\xa6\\x31\\xab\\x50\\x31\\x8e\\x01\\x7b\\x17\\x0b\\x24\\x0b\\xf0\\x1e\\xb8\\xb3\\x6c\\x7e\\x1c\\xb5\\x9e\\x77\\x36\\xac\\x34\\x44\\x42\\x08\\x13\\x2a\\x8f\\x59\\xe4\\xf3\\x13\\xd6\\x5d\\x84\\x9c\\x6a\\x4f\\xdf\\x13\\xe2\\x0e\\xca\\xee\\x38\\x23\\xe5\\x89\\xa1\\x71\\xb3\\x9b\\x24\\x89\\x49\\x7b\\x06\\xe6\\xff\\x58\\xc2\\xc9\\xf1\\xdc\\x5d\\x3a\\xa3\\xbd\\x10\\xe6\\x44\\x3e\\x22\\xd4\\x2d\\x07\\xb7\\x83\\xf7\\x9f\\xd4\\x3a\\x46\\xe1\\xcd\\xe3\\x14\\xb6\\x63\\xa9\\x5f\\x72\\x46\\xde\\xa1\\x31\\xfc\\xd4\\x6d\\x1d\\xc3\\x33\\xc5\\x45\\x4f\\x86\\xb2\\xc4\\xe2\\xe4\\x24\\xde\\xa4\\x05\\xcc\\x22\\x30\\xd4\\xdc\\xd3\\x9a\\x2e\\xab\\x2f\\x92\\x84\\x5c\\xf6\\xa7\\x99\\x41\\x92\\x06\\x3f\\x12\\x02\\x74\\x9e\\xf5\\x2d\\xcb\\x96\\xf2\\xb7\\x9e\\xd6\\xa9\\x81\\x18\\xca\\x0b\\x99\\xba\\x22\\x85\\x49\\x08\\x60\\xeb\\x4c\\x61\\xab\\x78\\xb9\\xdd\\xc6\\xac\\xc7\\xad\\x88\\x3f\\xa5\\xe9\\x6f\\x9d\\x02\\x91\\x71\\x22\\x3a\\xbf\\x75\\x73\\xe3\\x62\\x30\\xe0\\xa8\\x1f\\x6c\\x13\\x11\\x15\\x14\\x73\\xee\\x26\\x4f\\x4b\\x84\\x2e\\x92\\x3d\\xcb\\x3b\"},\n{{0xc5,0x7a,0x43,0xdc,0xd7,0xba,0xb8,0x51,0x60,0x09,0x54,0x69,0x18,0xd7,0x1a,0xd4,0x59,0xb7,0x34,0x5e,0xfd,0xca,0x8d,0x4f,0x19,0x92,0x98,0x75,0xc8,0x39,0xd7,0x22,},{0x20,0x83,0xb4,0x44,0x23,0x6b,0x9a,0xb3,0x1d,0x4e,0x00,0xc8,0x9d,0x55,0xc6,0x26,0x0f,0xee,0x71,0xac,0x1a,0x47,0xc4,0xb5,0xba,0x22,0x74,0x04,0xd3,0x82,0xb8,0x2d,},{0x1e,0xde,0xf9,0xbc,0x03,0x69,0x71,0xf1,0xfa,0x88,0xed,0xf4,0x53,0x93,0xc8,0x02,0xe6,0xc1,0xa1,0x63,0x1c,0x8a,0x06,0x87,0x1a,0x09,0xa3,0x20,0x82,0x1d,0xce,0x40,0xbe,0xca,0x97,0xe5,0x3a,0x03,0x61,0xa9,0x55,0xa4,0xc6,0xd6,0x0b,0x8c,0xa8,0xe4,0x00,0xc8,0x13,0x40,0x91,0x1c,0xcb,0x4f,0x56,0x28,0x40,0x41,0xcd,0xbb,0x18,0x04,},\"\\xa4\\xf6\\xd9\\xc2\\x81\\xcf\\x81\\xa2\\x8a\\x0b\\x9e\\x77\\x49\\x9a\\xa2\\x4b\\xde\\x96\\xcc\\x12\\x64\\x37\\x44\\x91\\xc0\\x08\\x29\\x4e\\xe0\\xaf\\x6f\\x6e\\x4b\\xbb\\x68\\x63\\x96\\xf5\\x90\\x68\\xd3\\x58\\xe3\\x0f\\xe9\\x99\\x2d\\xb0\\xc6\\xf1\\x66\\x80\\xa1\\xc7\\x1e\\x27\\xa4\\xa9\\x07\\xac\\x60\\x7d\\x39\\xbd\\xc3\\x25\\x8c\\x79\\x56\\x48\\x2f\\xb3\\x79\\x96\\xf4\\xbe\\xb3\\xe5\\x05\\x1b\\x81\\x48\\x01\\x9a\\x1c\\x25\\x6e\\x2e\\xe9\\x99\\xeb\\xc8\\xce\\x64\\xc5\\x4e\\x07\\xfe\\xdb\\x4f\\xbd\\x89\\x53\\xeb\\xd9\\x3b\\x7d\\x69\\xce\\x5a\\x00\\x82\\xed\\xd6\\x20\\x9d\\x12\\xd3\\x61\\x9b\\x4f\\xd2\\xea\\xe9\\x16\\x46\\x1f\\x72\\xa4\\xce\\x72\\x71\\x57\\x25\\x1a\\x19\\x20\\x9b\\xbf\\xf9\\xfb\\xdb\\xd2\\x89\\x43\\x6f\\x3f\\xca\\xcc\\x6b\\x4e\\x13\\x18\\x52\\x1a\\x47\\x83\\x9c\\xba\\x4b\\x14\\xf7\\xd7\\xa2\\x1e\\x7b\\x5d\\x6b\\x6a\\x75\\x3d\\x58\\x04\\xaf\\xcd\\x2b\\x1e\\xb7\\x77\\x9b\\x92\\xab\\xab\\x8a\\xfa\\x8a\\xa4\\xfa\\x51\\xca\\xec\\x0b\\x85\\xdc\\xd0\\xfc\\x2a\\x06\\x76\\x03\\x6d\\x3f\\x56\\x63\\x0a\\x83\\x1f\\xfe\\xb5\\x02\\x86\\x1d\\xd8\\x91\\x61\\xc7\\x08\\xa9\\xc0\\x06\\xc7\\x3c\\x93\\x0c\\xe5\\xb9\\x47\\x56\\x42\\x6f\\xf1\\x8a\\xa1\\x12\\xfb\\x4e\\xb9\\xa6\\x85\\x00\\xb4\\x8d\\x4e\\xed\\xbd\\x41\\x67\\xb6\\xff\\xd0\\xa1\\x1d\\x49\\x44\\x3a\\x17\\x3c\\xe9\\xd9\\x49\\x43\\x67\\x48\\xfc\\x06\\x34\\xf0\\x6b\\xb0\\x8b\\x8f\\x34\\x23\\xf4\\x46\\x3d\\xba\\x7b\\x4d\\x19\\x9b\\x64\\xdf\\x57\\x81\\x17\\xf0\\xa2\\x64\\x5f\\x0b\\x2a\\x1e\\x2a\\xda\\x27\\xd2\\x86\\xf7\\x67\\x33\\xf2\\x5b\\x82\\xed\\x1d\\x48\\xa5\\xc3\\x89\\x8d\\x4a\\xd6\\x21\\xe5\\x0e\\xd9\\x06\\x0d\\xaa\\xd4\\x0a\\x39\\x53\\x2e\\x4d\\x1b\\xf1\\x62\\xce\\x36\\x80\\x4d\\x5d\\x4e\\x2d\"},\n{{0x2d,0xdd,0xb6,0xb8,0xfd,0x04,0xfa,0x90,0xec,0xe1,0xa7,0x09,0xf8,0x41,0x8f,0x2e,0x5d,0x0c,0x9c,0x43,0xaf,0xe7,0xcf,0xce,0x19,0xe6,0xad,0x15,0xa7,0x34,0x76,0xf7,},{0x80,0x59,0xde,0x6a,0x7c,0x47,0x76,0x48,0x9e,0xcc,0x2e,0x7d,0x70,0x7f,0xfc,0xe3,0x02,0x85,0xbf,0x30,0xa2,0x3f,0x78,0xd7,0x2d,0xb4,0x9c,0xfd,0x6e,0xd0,0xd4,0x92,},{0xc6,0x34,0xea,0x7b,0xf7,0x2e,0x89,0x5a,0x2e,0x79,0x6e,0x28,0x34,0x20,0x14,0x15,0xb8,0xb4,0x5e,0x05,0xe0,0x45,0x55,0x92,0x84,0xeb,0x90,0x52,0xc0,0xe8,0x4f,0x62,0xa5,0xa9,0xf0,0xc9,0x76,0x4f,0x75,0x76,0x78,0x8c,0x72,0x28,0xb1,0x9e,0xf5,0x17,0xc1,0x95,0x49,0x73,0x25,0xa4,0x8a,0x93,0x44,0xb1,0x47,0xc1,0x2f,0xd7,0x55,0x09,},\"\\x47\\x4b\\xaa\\x59\\x0a\\x4c\\xd7\\x2d\\x54\\x24\\xe5\\x1d\\x82\\x57\\xb3\\xd4\\x43\\x25\\xbc\\x4c\\x50\\x63\\xa0\\x03\\x3c\\x86\\xeb\\xbe\\x99\\xed\\x72\\x12\\x18\\x4c\\x19\\x94\\x4d\\x08\\x2a\\x11\\x53\\x79\\xdd\\x4c\\xec\\xe9\\x73\\xfa\\xa0\\xbc\\xa6\\x48\\x5b\\xd2\\x5f\\x37\\x44\\xa7\\x19\\xe7\\x0a\\xa0\\x29\\x1e\\x1b\\x5a\\x96\\xe6\\x37\\xc1\\x40\\x61\\x6a\\x98\\x26\\x33\\x57\\xc7\\x6b\\x6e\\xb0\\x08\\x3f\\xe5\\x14\\x14\\xe3\\x86\\x87\\x0d\\x0f\\xdc\\x7d\\xd9\\xab\\xe4\\xff\\x6f\\xb5\\xbb\\xf1\\xe7\\xb1\\x5d\\xac\\x3e\\x08\\xe2\\x61\\x5f\\x65\\x5c\\x31\\x04\\xce\\xb3\\x2a\\x4c\\xc2\\xc9\\xe9\\xc4\\x3c\\xf2\\x82\\xd3\\x46\\xac\\x25\\x3c\\xcc\\x46\\xb6\\x35\\xae\\x04\\x09\\x73\\xb4\\x97\\x35\\x72\\x0f\\xfb\\x89\\x04\\x69\\xa5\\x67\\xc5\\x82\\x4e\\x0c\\x00\\xd7\\xcc\\xd5\\x50\\x9a\\x71\\x80\\x92\\xa9\\x06\\x46\\x1c\\x4d\\x61\\x63\\xea\\xf4\\x22\\x41\\x8f\\x5f\\xc6\\xe0\\x09\\xfc\\x3f\\x52\\x9a\\xc6\\x1a\\x2f\\x89\\xbb\\x8e\\x0e\\xd4\\x5d\\x94\\x0c\\x4c\\x23\\x31\\xff\\x8d\\x8e\\x1d\\x6d\\x58\\xd4\\x17\\xd8\\xfc\\x26\\x56\\xa0\\x2e\\x87\\x01\\xae\\xe7\\x5a\\xed\\x91\\x87\\x24\\xee\\xbe\\x4a\\x2c\\xf4\\x74\\x4c\\x5c\\x40\\x1e\\x21\\x70\\x23\\xdf\\x68\\xa6\\xf6\\xa0\\x22\\x8b\\xd0\\x5a\\x67\\x9a\\x69\\x7d\\x8d\\xe7\\x03\\x6b\\x9e\\xd2\\x69\\x09\\x0d\\x3c\\x65\\x48\\x6a\\xfb\\x91\\xe2\\x79\\x54\\xeb\\x15\\xb9\\x64\\x66\\x5e\\xde\\x7a\\xd0\\x08\\xf1\\x2f\\xb3\\xa9\\xd0\\xe6\\x9c\\x13\\xb4\\x25\\x4f\\x43\\x81\\x9e\\x08\\x18\\xa4\\x19\\x5f\\x68\\xb8\\xa3\\x8a\\xe8\\x1f\\x3f\\xcb\\x18\\x79\\xc9\\x5a\\xb4\\xcd\\x0f\\xfc\\x38\\xe3\\x81\\x08\\x92\\x60\\xcc\\xa9\\x67\\xac\\xe5\\xa0\\x85\\xb4\\x57\\xab\\x5e\\xb3\\x63\\x85\\x21\\x01\\x37\\x75\\x70\\xf9\\xac\\x9e\\x38\"},\n{{0x55,0x47,0xf1,0x00,0x4b,0xae,0xdf,0xce,0x5c,0xfc,0x08,0x50,0xb0,0x53,0x02,0x37,0x4a,0xad,0x24,0xf6,0x16,0x39,0x94,0xec,0xd7,0x51,0xdf,0x3a,0xf3,0xc1,0x06,0x20,},{0x7c,0xe6,0x20,0x78,0x73,0x85,0xee,0x19,0x51,0xac,0x49,0xa7,0x73,0x52,0xee,0x0d,0x6f,0x8c,0x5c,0xd4,0x7d,0xf7,0x4e,0x9e,0x32,0x16,0xa6,0x32,0x4f,0xc7,0xcf,0x7f,},{0x29,0xdf,0x3a,0xd5,0x89,0x00,0x9c,0x66,0x7b,0xaa,0x5e,0x72,0xda,0xbb,0x4e,0x53,0xcb,0x78,0x76,0xde,0x4e,0x7e,0xfe,0x5c,0xc2,0x1e,0xad,0x7f,0xa8,0x78,0xdb,0x57,0xf9,0x7c,0x11,0x03,0xdd,0xb3,0x9a,0x86,0x1e,0xb8,0x86,0x53,0xc1,0xd4,0xec,0x3b,0x43,0x06,0xe4,0x58,0x4b,0x47,0xb8,0xbc,0x90,0x42,0x31,0x19,0xe7,0xe4,0xaf,0x00,},\"\\xa6\\xc1\\x7e\\xeb\\x5b\\x80\\x66\\xc2\\xcd\\x9a\\x89\\x66\\x73\\x17\\xa9\\x45\\xa0\\xc7\\xc9\\x69\\x96\\xe7\\x7a\\xe8\\x54\\xc5\\x09\\xc6\\xcd\\x06\\x31\\xe9\\x22\\xad\\x04\\x50\\x3a\\xf8\\x7a\\x3c\\x46\\x28\\xad\\xaf\\xed\\x76\\x00\\xd0\\x71\\xc0\\x78\\xa2\\x2e\\x7f\\x64\\xbd\\xa0\\x8a\\x36\\x2b\\x38\\xb2\\x6c\\xa1\\x50\\x06\\xd3\\x8a\\xcf\\x53\\x2d\\x0d\\xed\\xea\\x41\\x77\\xa2\\xd3\\x3f\\x06\\x95\\x6d\\x80\\xe9\\x63\\x84\\x8e\\xc7\\x91\\xb2\\x76\\x2f\\xa9\\x94\\x49\\xb4\\xf1\\xa1\\xed\\x9b\\x3f\\x25\\x80\\xbe\\x3a\\xc7\\xd7\\xf5\\x2f\\xb1\\x44\\x21\\xd6\\x22\\x2b\\xa7\\x6f\\x80\\x77\\x50\\xc6\\xcb\\xb0\\xb1\\x6f\\x08\\x95\\xfc\\x73\\xd9\\xdf\\xc5\\x87\\xe1\\xa9\\xe5\\xd1\\xe5\\x83\\x75\\xfb\\xab\\x70\\x5b\\x8f\\x0c\\x1f\\xd7\\xdf\\x8b\\x3a\\xd4\\x46\\xf2\\xf0\\x84\\x59\\xe7\\xed\\x1a\\xf5\\x95\\x56\\xfb\\xc9\\x66\\xdc\\x24\\x9c\\x1c\\xf6\\x04\\xf3\\xe6\\x77\\xc8\\xa0\\x9d\\x43\\x63\\x60\\x87\\x74\\xbf\\x38\\x11\\xbe\\xf0\\x64\\x27\\x48\\xc5\\x5c\\x51\\x6c\\x7a\\x58\\x0f\\xa3\\x49\\x90\\x50\\xac\\xb3\\x0e\\xed\\x87\\x0d\\x0d\\x91\\x17\\x4c\\xb6\\x23\\xe9\\x8c\\x3a\\xd1\\x21\\xcf\\x81\\xf0\\x4e\\x57\\xd4\\x9b\\x00\\x84\\x24\\xa9\\x8a\\x31\\xee\\xaa\\xf5\\xf3\\x8e\\x00\\x0f\\x90\\x3d\\x48\\xd2\\x15\\xed\\x52\\xf8\\x62\\xd6\\x36\\xa5\\xa7\\x36\\x07\\xde\\x85\\x76\\x01\\x67\\x26\\x7e\\xfe\\x30\\xf8\\xa2\\x6e\\xbc\\x5a\\xa0\\xc0\\x9f\\x5b\\x25\\x8d\\x33\\x61\\xca\\x69\\xd1\\xd7\\xee\\x07\\xb5\\x96\\x48\\x17\\x9a\\xb2\\x17\\x0e\\xc5\\x0c\\x07\\xf6\\x61\\x6f\\x21\\x68\\x72\\x52\\x94\\x21\\xa6\\x33\\x4a\\x4a\\x1e\\xd3\\xd2\\x67\\x1e\\xf4\\x7b\\xc9\\xa9\\x2a\\xfb\\x58\\x31\\x4e\\x83\\x2d\\xb8\\xa9\\x00\\x34\\x08\\xa0\\x48\\x75\\x03\\xfe\\x4f\\x67\\x77\\x0d\\xd4\\xb6\"},\n{{0x3d,0xd7,0x20,0x3c,0x23,0x7a,0xef,0xe9,0xe3,0x8a,0x20,0x1f,0xf3,0x41,0x49,0x01,0x79,0x90,0x5f,0x9f,0x10,0x08,0x28,0xda,0x18,0xfc,0xbe,0x58,0x76,0x8b,0x57,0x60,},{0xf0,0x67,0xd7,0xb2,0xff,0x3a,0x95,0x7e,0x83,0x73,0xa7,0xd4,0x2e,0xf0,0x83,0x2b,0xcd,0xa8,0x4e,0xbf,0x28,0x72,0x49,0xa1,0x84,0xa2,0x12,0xa9,0x4c,0x99,0xea,0x5b,},{0x4c,0x03,0x69,0x35,0xa9,0x6a,0xbc,0x0d,0x05,0x0d,0x90,0x7b,0xed,0xbe,0x99,0x46,0xfb,0x97,0x43,0x9f,0x03,0x9c,0x74,0x2e,0x05,0x1c,0xcf,0x09,0xad,0xd7,0xdf,0x44,0xd1,0x7d,0xa9,0x8c,0x2c,0xa0,0x1b,0xdc,0x24,0x24,0xda,0x1e,0x4d,0xeb,0xf3,0x47,0xf8,0xff,0xf4,0x8a,0xc8,0x03,0x0d,0x2c,0xc0,0x7f,0x95,0x75,0xc0,0x44,0xbe,0x04,},\"\\xdb\\x28\\xed\\x31\\xac\\x04\\xb0\\xc2\\xde\\xce\\xe7\\xa6\\xb2\\x4f\\xc9\\xa0\\x82\\xcc\\x26\\x2c\\xa7\\xcc\\xf2\\xa2\\x47\\xd6\\x37\\x2e\\xc3\\xe9\\x12\\x0e\\xce\\xdb\\x45\\x42\\xea\\x59\\x3f\\xea\\x30\\x33\\x5c\\x5a\\xb9\\xdd\\x31\\x8a\\x3b\\x4f\\xd5\\x83\\x42\\x99\\xcf\\x3f\\x53\\xd9\\xef\\x46\\x13\\x7b\\x27\\x3c\\x39\\x0e\\xc3\\xc2\\x6a\\x0b\\x44\\x70\\xd0\\xd9\\x4b\\x77\\xd8\\x2c\\xae\\x4b\\x24\\x58\\x78\\x37\\xb1\\x67\\xbb\\x7f\\x81\\x66\\x71\\x0b\\xae\\xb3\\xee\\x70\\xaf\\x79\\x73\\x16\\xcb\\x7d\\x05\\xfa\\x57\\xe4\\x68\\xae\\x3f\\x0b\\xd4\\x49\\x40\\x4d\\x85\\x28\\x80\\x8b\\x41\\xfc\\xca\\x62\\xf5\\xe0\\xa2\\xaa\\x5d\\x8f\\x3a\\xca\\xb0\\x08\\xcc\\x5f\\x6e\\x5a\\xb0\\x27\\x77\\xbd\\xcd\\xe8\\x7f\\x0a\\x10\\xef\\x06\\xa4\\xbb\\x37\\xfe\\x02\\xc9\\x48\\x15\\xcf\\x76\\xbf\\xb8\\xf5\\xcd\\xd8\\x65\\xcc\\x26\\xdc\\xb5\\xcf\\x49\\x2e\\xdf\\xd5\\x47\\xb5\\x35\\xe2\\xe6\\xa6\\xd8\\x54\\x09\\x56\\xdc\\xba\\x62\\xcf\\xea\\x19\\xa9\\x47\\x44\\x06\\xe9\\x34\\x33\\x7e\\x45\\x42\\x70\\xe0\\x10\\x36\\xac\\x45\\x79\\x3b\\x6b\\x8a\\xce\\xda\\x18\\x7a\\x08\\xd5\\x6a\\x2c\\xe4\\xe9\\x8f\\x42\\xea\\x37\\x5b\\x10\\x1a\\x6b\\x9f\\xcb\\x42\\x31\\xd1\\x71\\xaa\\x46\\x3e\\xeb\\x43\\x58\\x6a\\x4b\\x82\\xa3\\x87\\xbc\\xdd\\xaf\\x71\\xa8\\x0f\\xd5\\xc1\\xf7\\x29\\x2e\\xfc\\x2b\\xd8\\xe7\\x0c\\x11\\xea\\xa8\\x17\\x10\\x60\\x61\\xb6\\xc4\\x61\\xc4\\x88\\x3d\\x61\\x3c\\xc0\\x6c\\x7e\\x2a\\x03\\xf7\\x3d\\x90\\xfc\\x55\\xcd\\xc0\\x72\\x65\\xee\\xfd\\x36\\xbe\\x72\\x27\\x03\\x83\\xd6\\xc6\\x76\\xca\\xe3\\x7c\\x93\\x69\\x1f\\x1a\\xe3\\xd9\\x27\\xb3\\xa1\\xcd\\x96\\x3e\\x42\\x29\\x75\\x7a\\xe5\\x23\\x1e\\xea\\x73\\xa9\\xf7\\x15\\x15\\x62\\x83\\x05\\x41\\x0a\\xc2\\x59\\x3b\\x32\\x5c\\xc6\\x31\"},\n{{0x28,0x27,0x75,0xdf,0x9e,0xbb,0xd7,0xc5,0xa6,0x5f,0x3a,0x2b,0x09,0x6e,0x36,0xee,0x64,0xa8,0xf8,0xea,0x71,0x9d,0xa7,0x77,0x58,0x73,0x9e,0x4e,0x74,0x76,0x11,0x1d,},{0xa2,0xb4,0x96,0x46,0x03,0x3a,0x13,0x93,0x7c,0xad,0x6b,0x0e,0x91,0x4e,0x3c,0xec,0x54,0x98,0x9c,0x25,0x2c,0xa5,0x64,0x3d,0x07,0x65,0x55,0xd8,0xc5,0x5e,0x56,0xe0,},{0x15,0x76,0x39,0x73,0x85,0x94,0x02,0x90,0x7d,0x8d,0xcb,0x86,0xad,0xc2,0x4a,0x2a,0x16,0x8b,0xa3,0xab,0xf2,0x24,0x61,0x73,0xd6,0x34,0x8a,0xfe,0xd5,0x1e,0xf6,0x0b,0x0c,0x0e,0xde,0xff,0x4e,0x10,0xbc,0xef,0x4c,0x6e,0x57,0x78,0xc8,0xbc,0x1f,0x5e,0x9e,0xe0,0x23,0x73,0x73,0x44,0x5b,0x45,0x51,0x55,0xd2,0x3d,0xe1,0x27,0xa2,0x02,},\"\\x14\\xcc\\x50\\xc2\\x97\\x3e\\xa9\\xd0\\x18\\x7a\\x73\\xf7\\x1c\\xb9\\xf1\\xce\\x07\\xe7\\x39\\xe0\\x49\\xec\\x2b\\x27\\xe6\\x61\\x3c\\x10\\xc2\\x6b\\x73\\xa2\\xa9\\x66\\xe0\\x1a\\xc3\\xbe\\x8b\\x50\\x5a\\xea\\xad\\x14\\x85\\xc1\\xc2\\xa3\\xc6\\xc2\\xb0\\x0f\\x81\\xb9\\xe5\\xf9\\x27\\xb7\\x3b\\xfd\\x49\\x86\\x01\\xa7\\x62\\x2e\\x85\\x44\\x83\\x7a\\xad\\x02\\xe7\\x2b\\xf7\\x21\\x96\\xdc\\x24\\x69\\x02\\xe5\\x8a\\xf2\\x53\\xad\\x7e\\x02\\x5e\\x36\\x66\\xd3\\xbf\\xc4\\x6b\\x5b\\x02\\xf0\\xeb\\x4a\\x37\\xc9\\x55\\x49\\x92\\xab\\xc8\\x65\\x1d\\xe1\\x2f\\xd8\\x13\\x17\\x73\\x79\\xbb\\x0c\\xe1\\x72\\xcd\\x8a\\xaf\\x93\\x7f\\x97\\x96\\x42\\xbc\\x2e\\xd7\\xc7\\xa4\\x30\\xcb\\x14\\xc3\\xcd\\x31\\x01\\xb9\\xf6\\xb9\\x1e\\xe3\\xf5\\x42\\xac\\xdf\\x01\\x7f\\x8c\\x21\\x16\\x29\\x7f\\x45\\x64\\x76\\x8f\\x4d\\xb9\\x5d\\xad\\x8a\\x9b\\xcd\\xc8\\xda\\x4d\\x8f\\xb1\\x3e\\xf6\\xe2\\xda\\x0b\\x13\\x16\\xd3\\xc8\\xc2\\xf3\\xed\\x83\\x6b\\x35\\xfe\\x2f\\xd3\\x3e\\xff\\xb4\\x09\\xe3\\xbc\\x1b\\x0f\\x85\\x22\\x5d\\x2a\\x1d\\xe3\\xbf\\xc2\\xd2\\x05\\x63\\x94\\x64\\x75\\xc4\\xd7\\xca\\x9f\\xdd\\xba\\xf5\\x9a\\xd8\\xf8\\x96\\x1d\\x28\\x7a\\xe7\\xdd\\x80\\x3e\\x7a\\xf1\\xfa\\x61\\x23\\x29\\xb1\\xbd\\xc0\\x4e\\x22\\x56\\x00\\xae\\x73\\x1b\\xc0\\x1a\\xe0\\x92\\x5a\\xed\\x62\\xac\\x50\\xd4\\x60\\x86\\xf3\\x64\\x6c\\xf4\\x7b\\x07\\x2f\\x0d\\x3b\\x04\\x4b\\x36\\xf8\\x5c\\xec\\x72\\x9a\\x8b\\xb2\\xb9\\x28\\x83\\xca\\x4d\\xfb\\x34\\xa8\\xee\\x8a\\x02\\x73\\xb3\\x1a\\xf5\\x09\\x82\\xbb\\x61\\x31\\xbf\\xa1\\x1d\\x55\\x50\\x4b\\x1f\\x6f\\x1a\\x0a\\x00\\x43\\x8c\\xa2\\x6d\\x8a\\xb4\\xf4\\x8b\\xcd\\xdc\\x9d\\x5a\\x38\\x85\\x1a\\xbe\\xde\\x41\\x51\\xd5\\xb7\\x0d\\x72\\x07\\x32\\xa0\\x0a\\xbe\\xa2\\xc8\\xb9\\x79\"},\n{{0x47,0x30,0xa5,0xcf,0x97,0x72,0xd7,0xd6,0x66,0x5b,0xa7,0x87,0xbe,0xa4,0xc9,0x52,0x52,0xe6,0xec,0xd6,0x3e,0xc6,0x23,0x90,0x54,0x7b,0xf1,0x00,0xc0,0xa4,0x63,0x75,},{0xf9,0xf0,0x94,0xf7,0xcc,0x1d,0x40,0xf1,0x92,0x6b,0x5b,0x22,0xdc,0xe4,0x65,0x78,0x44,0x68,0xb2,0x0a,0xb3,0x49,0xbc,0x6d,0x4f,0xdf,0x78,0xd0,0x04,0x2b,0xbc,0x5b,},{0x55,0x2c,0x73,0x47,0xbd,0xfe,0x13,0x16,0x46,0xce,0x09,0x32,0xd8,0x2a,0x36,0xd2,0xc1,0xb7,0x6d,0x7c,0x30,0xee,0x89,0x0e,0x05,0x92,0xe1,0x9f,0x9d,0x18,0xb9,0xa5,0x6f,0x48,0xd7,0xa9,0xb6,0x8c,0x01,0x7d,0xa6,0xb5,0x50,0xc9,0x43,0xaf,0x4a,0x90,0x7b,0xaf,0x31,0x7e,0x41,0x9f,0xbb,0xc9,0x6f,0x6c,0xf4,0xbf,0xad,0x42,0xde,0x00,},\"\\xe7\\x47\\x6d\\x2e\\x66\\x84\\x20\\xe1\\xb0\\xfa\\xdf\\xba\\xa5\\x42\\x86\\xfa\\x7f\\xa8\\x90\\xa8\\x7b\\x82\\x80\\xe2\\x60\\x78\\x15\\x22\\x95\\xe1\\xe6\\xe5\\x5d\\x12\\x41\\x43\\x5c\\xc4\\x30\\xa8\\x69\\x3b\\xb1\\x0c\\xde\\x46\\x43\\xf5\\x9c\\xbf\\xcc\\x25\\x6f\\x45\\xf5\\x09\\x0c\\x90\\x9a\\x14\\xc7\\xfc\\x49\\xd3\\x7b\\xfc\\x25\\xaf\\x11\\xe8\\xf4\\xc8\\x3f\\x4c\\x32\\xd4\\xaa\\xbf\\x43\\xb2\\x0f\\xa3\\x82\\xbb\\x66\\x22\\xa1\\x84\\x8f\\x8f\\xfc\\x4d\\xff\\x34\\x08\\xbb\\x4e\\xc7\\xc6\\x7a\\x35\\xb4\\xcd\\xae\\xe5\\xe2\\x79\\xc0\\xfc\\x0a\\x66\\x09\\x3a\\x9f\\x36\\xa6\\x0f\\xdd\\x65\\xe6\\x33\\x4a\\x80\\x4e\\x84\\x5c\\x85\\x30\\xb6\\xfd\\xa3\\x63\\xb5\\x64\\x03\\x37\\xd0\\x27\\x24\\x3c\\xcf\\xb3\\xc1\\x77\\xf4\\x3e\\x71\\x78\\x96\\xe4\\x6e\\xad\\x7f\\x72\\xca\\x06\\xaa\\x0f\\xf1\\xe7\\x72\\x47\\x12\\x1b\\xaf\\x48\\xbe\\x9a\\x44\\x5f\\x72\\x9c\\xa1\\x39\\x0f\\xc4\\x61\\x51\\xcb\\xd3\\x3f\\xcb\\xd7\\x37\\x3f\\x27\\xa6\\xba\\x55\\xc9\\x2c\\xbf\\x69\\x45\\xb0\\x9b\\x44\\xb9\\xa4\\xe5\\x80\\x0d\\x40\\x30\\x70\\xae\\x66\\x04\\x89\\x97\\xb2\\x19\\x7f\\x02\\x18\\x1a\\x09\\x7e\\x56\\x3f\\x9b\\x9a\\xcc\\x84\\x11\\x39\\x25\\x8a\\x25\\x8b\\xc6\\x10\\xd3\\xbd\\x89\\x16\\x37\\x35\\x6b\\x2e\\xdc\\x8c\\x18\\x4c\\x35\\xc6\\x5a\\xf9\\x1a\\xaf\\x7b\\x1c\\x16\\xd7\\x4a\\x5f\\x5f\\x86\\x25\\x48\\x13\\x92\\x54\\xec\\xf5\\x50\\x63\\x1d\\x5f\\x88\\x49\\xaf\\xdb\\x5b\\x64\\xcf\\x36\\x6f\\xf2\\x63\\x3a\\x93\\xf3\\xa1\\x8c\\x39\\xb5\\x15\\x02\\x45\\xfb\\x5f\\x33\\xc9\\xe4\\xe2\\xd9\\x4a\\xf6\\x96\\x3a\\x70\\xb8\\x8f\\x9e\\x7e\\x51\\x9f\\x8f\\xa2\\xa0\\xf2\\xe3\\x74\\x9d\\xe8\\x83\\xd0\\xe6\\xf0\\x52\\xa9\\x49\\xd0\\xfc\\x71\\x53\\xa8\\x69\\x3f\\x6d\\x80\\x1d\\x73\\x52\\xeb\\x2f\\x7a\\x46\\x5c\\x0e\"},\n{{0x27,0x70,0xaa,0xdd,0x1d,0x12,0x3e,0x95,0x47,0x83,0x2d,0xfb,0x2a,0x83,0x7e,0xba,0x08,0x91,0x79,0xef,0x4f,0x23,0xab,0xc4,0xa5,0x3f,0x2a,0x71,0x4e,0x42,0x3e,0xe2,},{0x3c,0x5f,0xbb,0x07,0x53,0x0d,0xd3,0xa2,0x0f,0xf3,0x5a,0x50,0x0e,0x37,0x08,0x92,0x63,0x10,0xfe,0xd8,0xa8,0x99,0x69,0x02,0x32,0xb4,0x2c,0x15,0xbd,0x86,0xe5,0xdc,},{0xf2,0x67,0x71,0x5e,0x9a,0x84,0xc7,0x31,0x4f,0x2d,0x58,0x69,0xef,0x4a,0xb8,0xd2,0x14,0x9a,0x13,0xf7,0xe8,0xe1,0xc7,0x28,0xc4,0x23,0x90,0x62,0x93,0xb4,0x9c,0xe6,0x28,0x34,0x54,0xdd,0x1c,0x7b,0x04,0x74,0x1d,0xf2,0xea,0xbe,0xdc,0x4d,0x6a,0xb1,0x39,0x7d,0xc9,0x5a,0x67,0x9d,0xf0,0x4d,0x2c,0x17,0xd6,0x6c,0x79,0xbb,0x76,0x01,},\"\\xa5\\xcc\\x20\\x55\\xeb\\xa3\\xcf\\x6f\\x0c\\x63\\x32\\xc1\\xf2\\xab\\x58\\x54\\x87\\x09\\x13\\xb0\\x3f\\xf7\\x09\\x3b\\xc9\\x4f\\x33\\x5a\\xdd\\x44\\x33\\x22\\x31\\xd9\\x86\\x9f\\x02\\x7d\\x82\\xef\\xd5\\xf1\\x22\\x71\\x44\\xab\\x56\\xe3\\x22\\x2d\\xc3\\xdd\\xcc\\xf0\\x62\\xd9\\xc1\\xb0\\xc1\\x02\\x4d\\x9b\\x41\\x6d\\xfa\\x3e\\xe8\\xa7\\x02\\x79\\x23\\x00\\x34\\x65\\xe0\\xff\\xae\\xfb\\x75\\xb9\\xf2\\x9d\\xc6\\xbc\\xf2\\x13\\xad\\xc5\\xe3\\x18\\xfd\\x8b\\xa9\\x3a\\x7a\\xa5\\xbf\\xb4\\x95\\xde\\x9d\\x7c\\x5e\\x1a\\x19\\x6c\\xd3\\xa2\\xd7\\x72\\x1f\\x8b\\xa7\\x85\\xaa\\x90\\x52\\xa1\\x81\\x1c\\x7f\\xcc\\x8f\\x93\\x93\\x27\\x65\\x05\\x9c\\xab\\x9c\\x9b\\x71\\x89\\x45\\x89\\x5e\\xf2\\x6f\\x3a\\xc0\\x48\\xd4\\xca\\xbf\\x91\\xa9\\xe6\\xaa\\x83\\xac\\x14\\xd4\\x31\\x56\\x82\\x78\\x37\\x91\\x4e\\xb7\\x63\\xa2\\x3c\\xba\\x53\\xf6\\x0f\\x15\\x0f\\x4b\\x70\\x20\\x3e\\xc1\\x83\\x3f\\xf1\\x05\\x84\\x94\\x57\\xa8\\xda\\x73\\x27\\x66\\x1f\\xb2\\x3a\\x55\\x41\\x64\\xe0\\x5f\\xcf\\x01\\x46\\xb1\\x06\\x74\\x96\\x4b\\xe6\\xf6\\xaa\\x0a\\xcc\\x94\\xc4\\x1a\\xd5\\x71\\x80\\xe5\\x18\\x0d\\x19\\x9b\\xd9\\x10\\x2f\\x55\\xd7\\x40\\xe8\\x17\\x89\\xb1\\x56\\x71\\xbb\\xd0\\x67\\x0e\\x6d\\xe5\\xd9\\x7e\\x1a\\xe6\\x26\\xd8\\xa0\\xeb\\xc3\\x2c\\x8f\\xd9\\xd2\\x47\\x37\\x27\\x4e\\x47\\xd2\\xdd\\x59\\x41\\xa2\\x72\\xe7\\x2a\\x59\\x89\\x28\\xad\\x10\\x9c\\xde\\x93\\x7b\\xf2\\x48\\xd5\\x7f\\x5d\\x29\\x42\\x98\\x3c\\x51\\xe2\\xa8\\x9f\\x8f\\x05\\x4d\\x5c\\x48\\xdf\\xad\\x8f\\xcf\\x1f\\xfa\\x97\\xf7\\xde\\x6a\\x3a\\x43\\xca\\x15\\xfc\\x67\\x20\\xef\\xae\\xc6\\x9f\\x08\\x36\\xd8\\x42\\x23\\xf9\\x77\\x6d\\x11\\x1e\\xc2\\xbb\\xc6\\x9b\\x2d\\xfd\\x58\\xbe\\x8c\\xa1\\x2c\\x07\\x21\\x64\\xb7\\x18\\xcd\\x7c\\x24\\x6d\\x64\"},\n{{0x4f,0xda,0xb7,0xc1,0x60,0x0e,0x70,0x11,0x4b,0x11,0xf5,0x33,0x24,0x23,0x76,0xaf,0x76,0x14,0xb4,0xd5,0xda,0x04,0x6a,0xc4,0xbe,0xde,0xa2,0x1d,0x8a,0x36,0x15,0x98,},{0xa2,0x5c,0x9a,0x94,0xd6,0xe4,0xec,0xd9,0x5a,0x4b,0xd6,0x80,0x5f,0x76,0x2e,0xb1,0xc4,0x57,0xa8,0xd4,0x5d,0x24,0x32,0x38,0xb1,0x83,0x9c,0xbb,0xa8,0xf4,0x41,0xcc,},{0x50,0x75,0xc0,0x90,0xcf,0xbe,0xb6,0xb0,0x18,0x02,0xaf,0x7f,0x4d,0xa5,0xaa,0x4f,0x43,0x4d,0x5e,0xe2,0xf3,0x53,0x0e,0xeb,0xb7,0x5c,0x85,0xe0,0x86,0x21,0xf8,0x3e,0xdc,0x08,0xaa,0x96,0x69,0x38,0x94,0xa4,0x27,0x76,0x33,0xba,0x81,0xe1,0x9e,0x9e,0x55,0xaf,0x5c,0x49,0x5d,0xaa,0x5e,0x1a,0x6f,0x8c,0xbb,0x79,0xc0,0x1c,0x72,0x07,},\"\\xda\\x40\\x58\\x90\\xd1\\x1a\\x87\\x2c\\x11\\x9d\\xab\\x5e\\xfc\\xbf\\xf6\\x1e\\x93\\x1f\\x38\\xec\\xcc\\xa4\\x57\\xed\\xc6\\x26\\xd3\\xea\\x29\\xed\\x4f\\xe3\\x15\\x4f\\xaf\\xec\\x14\\x44\\xda\\x74\\x34\\x3c\\x06\\xad\\x90\\xac\\x9d\\x17\\xb5\\x11\\xbc\\xb7\\x3b\\xb4\\x9d\\x90\\xba\\xfb\\x7c\\x7e\\xa8\\x00\\xbd\\x58\\x41\\x1d\\xf1\\x27\\x5c\\x3c\\xae\\x71\\xb7\\x00\\xa5\\xda\\xb4\\x91\\xa4\\x26\\x16\\x78\\x58\\x79\\x56\\xaa\\x4a\\x21\\x9e\\x1a\\xc6\\xdd\\x3f\\xb2\\xcb\\x8c\\x46\\x19\\x72\\x18\\xe7\\x26\\xdc\\x7e\\xd2\\x34\\x52\\x6a\\x6b\\x01\\xc0\\xd7\\x2c\\xb9\\x3a\\xb3\\xf4\\xf3\\x8a\\x08\\xe5\\x94\\x0b\\x3f\\x61\\xa7\\x2a\\xd2\\x78\\x9a\\x05\\x32\\x00\\x0f\\xac\\x1d\\x2d\\x2e\\x3a\\xd6\\x32\\xac\\x8b\\x62\\xbb\\x3f\\xf5\\xb9\\x9d\\x53\\x59\\x7b\\xf4\\xd4\\x4b\\x19\\x67\\x49\\x24\\xdf\\x9b\\x3d\\xb3\\xd0\\x25\\x3f\\x74\\x62\\x7c\\xca\\xb3\\x00\\x31\\xc8\\x5e\\x29\\x1c\\x58\\xb5\\xfa\\x91\\x67\\x52\\x2a\\x46\\x74\\x6f\\xc3\\x07\\x03\\x67\\x45\\xd4\\xf9\\x81\\x77\\x86\\xe5\\xd3\\x00\\xe6\\xc5\\xd5\\x03\\x12\\x5f\\xea\\x01\\xde\\xc3\\xe3\\xfe\\xdb\\xf3\\x86\\x1c\\xa2\\x62\\x7a\\x05\\x18\\xfb\\x2b\\x24\\xe5\\xa7\\xa0\\x14\\x17\\x87\\x19\\xe9\\xb3\\x45\\xf7\\xb2\\x49\\xce\\x3a\\x41\\x32\\x80\\xc8\\xde\\xb6\\x74\\xf5\\x9a\\x25\\xbe\\x92\\xa8\\xab\\x64\\x00\\xc7\\xc5\\x2b\\x07\\x28\\xae\\x34\\xe2\\x2b\\x2e\\xc2\\x00\\xc1\\xcb\\xab\\xa2\\xcc\\xd8\\xaf\\x29\\x24\\x9d\\x17\\xaf\\x60\\xc3\\x60\\x07\\xa7\\x22\\xfc\\x80\\x25\\x8a\\x7b\\xeb\\xab\\x1c\\xda\\xad\\x74\\x62\\xa8\\xb7\\x58\\x8c\\x2f\\x7e\\x27\\xc6\\xd0\\x7a\\xfc\\xf6\\x01\\x17\\xfe\\xd1\\x1b\\xd6\\x85\\x9e\\x75\\xe3\\xb4\\xfc\\xee\\x39\\x81\\x88\\x1e\\x95\\xdd\\x11\\x68\\x27\\xdd\\x4b\\x36\\x9a\\xf0\\x69\\xd3\\xc8\\xf2\\x67\\x6f\\x8a\"},\n{{0x26,0x45,0x04,0x60,0x4e,0x70,0xd7,0x2d,0xc4,0x47,0x4d,0xbb,0x34,0x91,0x3e,0x9c,0x0f,0x80,0x6d,0xfe,0x18,0xc7,0x87,0x9a,0x41,0x76,0x2a,0x9e,0x43,0x90,0xec,0x61,},{0xeb,0x2b,0x51,0x8c,0xe7,0xdc,0x71,0xc9,0x1f,0x36,0x65,0x58,0x16,0x51,0xfd,0x03,0xaf,0x84,0xc4,0x6b,0xf1,0xfe,0xd2,0x43,0x32,0x22,0x35,0x3b,0xc7,0xec,0x51,0x1d,},{0xee,0xa4,0x39,0xa0,0x0f,0x7e,0x45,0x9b,0x40,0x2b,0x83,0x51,0x50,0xa7,0x79,0xee,0xd1,0x71,0xab,0x97,0x1b,0xd1,0xb5,0x8d,0xcc,0x7f,0x93,0x86,0xda,0xdd,0x58,0x3d,0xe8,0xdc,0x69,0xe2,0x67,0x12,0x1d,0xde,0x41,0xf0,0xf9,0x49,0x3d,0x45,0x0b,0x16,0x21,0x9c,0xdf,0x3c,0x22,0xf0,0x94,0x82,0xce,0x40,0x2f,0xe1,0x7c,0xa4,0x9e,0x08,},\"\\x90\\x1d\\x70\\xe6\\x7e\\xd2\\x42\\xf2\\xec\\x1d\\xda\\x81\\x3d\\x4c\\x05\\x2c\\xfb\\x31\\xfd\\x00\\xcf\\xe5\\x44\\x6b\\xf3\\xb9\\x3f\\xdb\\x95\\x0f\\x95\\x2d\\x94\\xef\\x9c\\x99\\xd1\\xc2\\x64\\xa6\\xb1\\x3c\\x35\\x54\\xa2\\x64\\xbe\\xb9\\x7e\\xd2\\x0e\\x6b\\x5d\\x66\\xad\\x84\\xdb\\x5d\\x8f\\x1d\\xe3\\x5c\\x49\\x6f\\x94\\x7a\\x23\\x27\\x09\\x54\\x05\\x1f\\x8e\\x4d\\xbe\\x0d\\x3e\\xf9\\xab\\x30\\x03\\xdd\\x47\\xb8\\x59\\x35\\x6c\\xec\\xb8\\x1c\\x50\\xaf\\xfa\\x68\\xc1\\x5d\\xad\\xb5\\xf8\\x64\\xd5\\xe1\\xbb\\x4d\\x3b\\xad\\xa6\\xf3\\xab\\xa1\\xc8\\x3c\\x43\\x8d\\x79\\xa9\\x4b\\xfb\\x50\\xb4\\x38\\x79\\xe9\\xce\\xf0\\x8a\\x2b\\xfb\\x22\\xfa\\xd9\\x43\\xdb\\xf7\\x68\\x37\\x79\\x74\\x6e\\x31\\xc4\\x86\\xf0\\x1f\\xd6\\x44\\x90\\x50\\x48\\xb1\\x12\\xee\\x25\\x80\\x42\\x15\\x3f\\x46\\xd1\\xc7\\x77\\x2a\\x06\\x24\\xbc\\xd6\\x94\\x1e\\x90\\x62\\xcf\\xda\\x75\\xdc\\x87\\x12\\x53\\x3f\\x40\\x57\\x33\\x5c\\x29\\x80\\x38\\xcb\\xca\\x29\\xeb\\xdb\\x56\\x0a\\x29\\x5a\\x88\\x33\\x96\\x92\\x80\\x8e\\xb3\\x48\\x1f\\xd9\\x73\\x5e\\xa4\\x14\\xf6\\x20\\xc1\\x43\\xb2\\x13\\x3f\\x57\\xbb\\x64\\xe4\\x47\\x78\\xa8\\xca\\x70\\x91\\x82\\x02\\xd1\\x57\\x42\\x61\\x02\\xe1\\xdf\\xc0\\xa8\\xf7\\xb1\\xae\\x48\\x7b\\x74\\xf0\\x27\\x92\\x63\\x31\\x54\\xdf\\xe7\\x4c\\xaa\\x1b\\x70\\x88\\xfd\\xa2\\x2f\\xa8\\xb9\\xbc\\x35\\x4c\\x58\\x5f\\x15\\x67\\x70\\x6e\\x29\\x55\\x49\\x38\\x70\\xf5\\x41\\x69\\xe0\\xd7\\x69\\x11\\x59\\xdf\\x43\\x89\\x79\\x61\\xd2\\x4a\\x85\\x2e\\xa9\\x70\\xc5\\x14\\x94\\x8f\\x3b\\x48\\xf7\\x1e\\xe5\\x86\\xe7\\x2e\\xc7\\x8d\\xb8\\x20\\xf2\\x53\\xe0\\x8d\\xb8\\x4f\\x6f\\x31\\x2c\\x43\\x33\\xbd\\x0b\\x73\\x2f\\xe7\\x58\\x83\\x50\\x77\\x83\\xe9\\xa1\\xfd\\x4f\\xba\\xb8\\xe5\\x87\\x0f\\x9b\\xf7\\xad\\x58\\xaa\"},\n{{0x2c,0xa7,0x44,0x7a,0x36,0x68,0xb7,0x48,0xb1,0xfd,0x3d,0x52,0xd2,0x08,0x0d,0x30,0xe3,0x4d,0x39,0x7b,0xb2,0x84,0x6c,0xaf,0x8f,0x65,0x9a,0xc1,0x68,0x78,0x8c,0xa5,},{0xab,0x33,0x1c,0xd4,0x0a,0x31,0xd0,0x17,0x3c,0x0c,0x8c,0x1c,0x17,0x00,0x25,0x32,0x80,0x7b,0xf8,0x9e,0x3e,0xdb,0x6d,0x34,0xc2,0xdd,0x82,0x94,0x63,0x2b,0x9f,0xbc,},{0xf9,0x3a,0xda,0x15,0xae,0x9c,0xd2,0xb5,0x4f,0x26,0xf8,0x6f,0x0c,0x28,0x39,0x2a,0xed,0x5e,0xb6,0xb6,0xb4,0x4d,0x01,0xa4,0xe3,0x3a,0x54,0xe7,0xda,0x37,0xc3,0x8e,0x8d,0x53,0x36,0x6f,0x73,0xfd,0x85,0xbe,0x64,0x2e,0x4e,0xc8,0x12,0x36,0xd1,0x63,0xf0,0xd0,0x25,0xe7,0x6c,0x8b,0xbd,0xd6,0x5d,0x43,0xdf,0x49,0xf0,0x9c,0x1f,0x01,},\"\\xa8\\x2b\\xcd\\x94\\x24\\xbf\\xfd\\xa0\\xf2\\xf5\\xe9\\xea\\xe1\\x78\\x35\\xdb\\xe4\\x68\\xf6\\x1b\\x78\\x5a\\xab\\x82\\x93\\x47\\x37\\xa9\\x1c\\x5f\\x60\\x2c\\xb7\\xc6\\x17\\xcd\\xff\\xe8\\x7c\\xad\\x72\\x6a\\x49\\x72\\xe1\\x5a\\x7b\\x8e\\xe1\\x47\\xf0\\x62\\xd2\\xa5\\xa4\\xd8\\x97\\x06\\xb5\\x71\\xfa\\x8a\\xa2\\xb9\\x59\\x81\\xc7\\x8a\\xbe\\xaa\\xae\\x86\\x20\\x3f\\xa2\\xc0\\xe0\\x72\\x97\\x40\\x6e\\xa8\\xc2\\x71\\x11\\xa8\\x6d\\xbe\\x1d\\x5a\\x7c\\x3b\\x7a\\xe9\\x30\\x90\\x4d\\x98\\x90\\xf6\\xd4\\xab\\xeb\\xd1\\x41\\x2a\\x73\\xad\\x5f\\xee\\xa6\\x4a\\xcf\\x06\\x5d\\x3e\\x63\\xb5\\xcb\\xe2\\x0c\\xf2\\x0b\\xbd\\x2d\\x8b\\x94\\xf9\\x05\\x3e\\xd5\\xf6\\x66\\x33\\x48\\x25\\x30\\x12\\x44\\x46\\x60\\x59\\x18\\xde\\x66\\x45\\x5e\\x8c\\xf4\\xb1\\x01\\xa1\\x27\\x23\\x3c\\x4e\\x27\\xd5\\xd5\\x5b\\xf9\\x5b\\xd3\\x19\\x5d\\x03\\x40\\xd4\\x35\\x31\\xfc\\x75\\xfa\\xf8\\xdd\\xed\\x52\\x75\\xbf\\x89\\x75\\x0d\\xe8\\x38\\xfd\\x10\\xc3\\x17\\x45\\xbe\\x4c\\xa4\\x1f\\xa8\\x71\\xcb\\x0f\\x9b\\x01\\x67\\x06\\xa1\\xa7\\xe3\\xc4\\x4b\\xb9\\x0a\\xc7\\xa8\\xad\\x51\\xe2\\x72\\x38\\x92\\x92\\xfd\\x6c\\x98\\xad\\x7a\\x06\\x9e\\x76\\xe3\\xf5\\xf3\\xe0\\xcc\\x77\\x0b\\x9e\\x9b\\x35\\xa7\\x65\\xd0\\xd9\\x37\\x12\\xd7\\xcd\\xab\\xd1\\x7e\\x5d\\x01\\xdd\\x81\\x83\\xaf\\x4a\\xd9\\x36\\x5d\\xb0\\xa0\\xfa\\x41\\x38\\x1f\\xce\\x60\\xa0\\x81\\xdf\\x1c\\x5a\\xb0\\xf8\\xc1\\x8f\\x95\\xa7\\xa8\\xb5\\x82\\xdf\\xff\\x7f\\x14\\x9e\\xa5\\x79\\xdf\\x06\\x23\\xb3\\x3b\\x75\\x08\\xf0\\xc6\\x63\\xf0\\x1e\\x3a\\x2d\\xcd\\x9d\\xfb\\xee\\x51\\xcc\\x61\\x52\\x20\\xfd\\xaf\\xfd\\xab\\x51\\xbd\\xae\\x42\\xcb\\x9f\\x7f\\xa9\\xe3\\xb7\\xc6\\x9c\\xc8\\xad\\xa5\\xcc\\xd6\\x42\\x52\\x9b\\xa5\\x14\\xfd\\xc5\\x4f\\xcf\\x27\\x20\\xb8\\xf5\\xd0\\x8b\\x95\"},\n{{0x49,0x4e,0xa9,0xbc,0xce,0x26,0x88,0x5b,0x7d,0x17,0xd1,0xfc,0x11,0x44,0x48,0xf2,0x39,0xf0,0xce,0x46,0xe5,0xf2,0x47,0xb4,0xc9,0x99,0xfa,0x86,0x29,0x69,0x24,0x72,},{0x69,0x01,0xe5,0xef,0xae,0x57,0x53,0x6b,0xa5,0xfd,0xd9,0x6b,0x59,0x65,0x73,0x59,0x06,0x5f,0x25,0xd3,0x91,0xa1,0xaa,0x8c,0xdc,0x0d,0x38,0xbb,0x5d,0x53,0xc1,0x39,},{0x54,0x8a,0x09,0x3a,0x68,0x03,0x61,0xb7,0xdc,0x56,0xf1,0x45,0x03,0xb5,0x5e,0xee,0xc3,0xb3,0xf4,0xfd,0x4c,0xa9,0x9d,0x6a,0xed,0xce,0x08,0x30,0xf7,0xf4,0xae,0x2f,0x73,0x28,0x53,0x9b,0x34,0xc4,0x8f,0xc9,0x76,0x09,0x22,0x33,0x3d,0xae,0x9c,0x7c,0x01,0x7e,0x7d,0xb7,0x3b,0x8f,0xaa,0x6c,0x06,0xbe,0x05,0xe3,0x47,0x99,0x2b,0x06,},\"\\x3b\\xad\\xbf\\xa5\\xf5\\xa8\\xaa\\x2c\\xce\\x0a\\x60\\xe6\\x86\\xcd\\xce\\x65\\x4d\\x24\\x45\\x2f\\x98\\xfd\\x54\\x87\\x2e\\x73\\x95\\xb3\\x94\\x64\\x38\\x0a\\x0e\\x18\\x55\\x57\\xea\\x13\\x4d\\x09\\x57\\x30\\x86\\x4f\\x42\\x54\\xd3\\xdd\\x94\\x69\\x70\\xc1\\x0c\\x80\\x4f\\xcc\\x08\\x99\\xdf\\xa0\\x24\\x20\\x5b\\xe0\\xf8\\x0b\\x1c\\x75\\x44\\x95\\x23\\x32\\x4f\\xe6\\xa0\\x75\\x1e\\x47\\xb4\\xff\\x48\\x22\\xb8\\xc3\\x3e\\x9e\\xaf\\x1d\\x1d\\x96\\xe0\\xde\\x3d\\x4a\\xcd\\x89\\x69\\x6b\\x7f\\xcc\\x03\\xd4\\x9f\\x92\\xf8\\x2b\\x97\\x25\\x70\\x0b\\x35\\x0d\\xb1\\xa8\\x76\\x15\\x36\\x95\\x45\\x56\\x1b\\x85\\x99\\xf5\\xea\\x92\\x0a\\x31\\x0a\\x8b\\xaf\\xc0\\xe8\\xd7\\x46\\x8c\\xbf\\x6f\\x38\\x20\\xe9\\x43\\x59\\x4a\\xfd\\xd5\\x16\\x6e\\x4e\\x33\\x09\\xdd\\xdd\\x76\\x94\\xef\\x67\\xe6\\x94\\xf3\\x4f\\xc6\\x27\\x24\\xff\\x96\\xac\\x33\\x64\\x17\\x6f\\x34\\xe8\\xa0\\x2b\\x4c\\xf5\\x69\\xdb\\x5b\\x8f\\x77\\xd5\\x85\\x12\\xae\\xda\\xbf\\x0b\\xcd\\x1c\\x2d\\xf1\\x2d\\xb3\\xa9\\x47\\x3f\\x94\\x8c\\x5c\\x32\\x43\\x30\\x9a\\xae\\x46\\xc4\\x9e\\xfd\\x08\\x8b\\x60\\xf3\\x1a\\x8a\\x72\\xad\\x7e\\x5a\\x35\\xac\\xc5\\xd8\\x9f\\xa6\\x68\\x07\\xeb\\x5d\\x3b\\xa9\\xcd\\xf0\\x8d\\x47\\x53\\xcb\\x85\\x08\\x9e\\xe3\\x6f\\x5c\\x96\\xb4\\x32\\xb6\\x92\\x83\\x52\\xaf\\xad\\x58\\x01\\x22\\x25\\xd6\\x15\\x7f\\x9e\\x36\\x11\\x42\\x6d\\xf9\\x21\\xb6\\xd1\\xd8\\x37\\x46\\x28\\xa6\\x30\\x31\\xe9\\xff\\xb9\\x0e\\x42\\xff\\xbb\\xa0\\x21\\xf1\\x74\\xf6\\x85\\x03\\x15\\x54\\x30\\x15\\x2c\\x91\\x55\\xdc\\x98\\xff\\xa2\\x6c\\x4f\\xab\\x06\\x5e\\x1f\\x8e\\x46\\x22\\xc2\\xf2\\x8a\\x8c\\xb0\\x43\\x11\\x0b\\x61\\x74\\x41\\x14\\x0f\\x8e\\x20\\xad\\xc1\\x6f\\x79\\x9d\\x1d\\x50\\x96\\xb1\\xf5\\x05\\x32\\xbe\\x50\\x42\\xd2\\x1b\\x81\\xea\\x46\\xc7\"},\n{{0x00,0xd7,0x35,0xeb,0xae,0xe7,0x5d,0xd5,0x79,0xa4,0x0d,0xfd,0x82,0x50,0x82,0x74,0xd0,0x1a,0x15,0x72,0xdf,0x99,0xb8,0x11,0xd5,0xb0,0x11,0x90,0xd8,0x21,0x92,0xe4,},{0xba,0x02,0x51,0x7c,0x0f,0xdd,0x3e,0x26,0x14,0xb3,0xf7,0xbf,0x99,0xed,0x9b,0x49,0x2b,0x80,0xed,0xf0,0x49,0x5d,0x23,0x0f,0x88,0x17,0x30,0xea,0x45,0xbc,0x17,0xc4,},{0xdc,0xdc,0x54,0x61,0x19,0x37,0xd2,0xbd,0x06,0xca,0xcd,0x98,0x18,0xb3,0xbe,0x15,0xce,0x74,0x25,0x42,0x7a,0x75,0xf5,0x0d,0x19,0x7a,0x33,0x7a,0x3b,0x8b,0xa6,0x71,0x4e,0xf4,0x88,0x66,0xf2,0x43,0xbd,0x5a,0xc7,0x41,0x5e,0x91,0x45,0x17,0xa2,0xc1,0xc5,0xa9,0x53,0xf4,0x32,0xb9,0x9d,0xb0,0xe6,0x20,0xd6,0x4f,0x74,0xeb,0x85,0x05,},\"\\x59\\xc0\\xb6\\x9a\\xf9\\x5d\\x07\\x4c\\x88\\xfd\\xc8\\xf0\\x63\\xbf\\xdc\\x31\\xb5\\xf4\\xa9\\xbc\\x9c\\xec\\xdf\\xfa\\x81\\x28\\xe0\\x1e\\x7c\\x19\\x37\\xdd\\xe5\\xeb\\x05\\x70\\xb5\\x1b\\x7b\\x5d\\x0a\\x67\\xa3\\x55\\x5b\\x4c\\xdc\\xe2\\xbc\\xa7\\xa3\\x1a\\x4f\\xe8\\xe1\\xd0\\x3a\\xb3\\x2b\\x40\\x35\\xe6\\xda\\xdb\\xf1\\x53\\x20\\x59\\xee\\x01\\xd3\\xd9\\xa7\\x63\\x3a\\x0e\\x70\\x6a\\x11\\x54\\xca\\xb2\\x2a\\x07\\xcd\\x74\\xc0\\x6a\\x3c\\xb6\\x01\\x24\\x4c\\xf3\\xcf\\x35\\xa3\\x5c\\x31\\x00\\xba\\x47\\xf3\\x13\\x72\\xa2\\xda\\x65\\xdc\\xff\\x0d\\x7a\\x80\\xa1\\x05\\x5d\\x8a\\xa9\\x92\\x12\\xe8\\x99\\xaa\\xd7\\xf0\\x2e\\x94\\x9e\\x6f\\xee\\x4d\\x3c\\x9c\\xef\\xa8\\x50\\x69\\xea\\xff\\x1f\\x6a\\xd0\\x6f\\xc3\\x00\\xc8\\x71\\xab\\x82\\xb2\\xbe\\xdb\\x93\\x4d\\x20\\x87\\x5c\\x2a\\x26\\x32\\x42\\xcd\\xb7\\xf9\\xbe\\x19\\x2a\\x87\\x10\\xb2\\x4c\\x7e\\xa9\\x8d\\x43\\xda\\xec\\x8b\\xaa\\x55\\x53\\xc6\\x78\\xa3\\x8f\\x0e\\x0a\\xdf\\x7d\\x3f\\xf2\\xdc\\xc7\\x99\\xa1\\xdb\\xad\\x6e\\xab\\x1c\\x3d\\x94\\x58\\xa9\\xdb\\x92\\x2f\\x02\\xe7\\x5c\\xfa\\xb9\\xd6\\x5c\\x73\\x36\\xda\\xe7\\x18\\x95\\xd5\\xbb\\x15\\xca\\xc2\\x03\\xf2\\xb3\\x8b\\x99\\x96\\xc4\\x10\\xf8\\x65\\x5a\\xd2\\x2d\\x3c\\x09\\x1c\\x20\\xb7\\xf9\\x26\\xd4\\x5e\\x78\\x01\\x28\\xf1\\x97\\x47\\x46\\x2a\\xbc\\x5c\\x58\\x93\\x2f\\xbb\\x9e\\x0b\\xc6\\x2d\\x53\\x86\\x88\\x02\\xf1\\xb0\\x83\\xf1\\x83\\xb8\\xa1\\xf9\\x43\\x49\\x86\\xd5\\xcf\\x97\\xc0\\x4e\\x2f\\x3e\\x14\\x57\\x30\\xcb\\xa9\\x87\\x79\\xc7\\xfe\\xd0\\xca\\xb1\\xc0\\x5d\\x5e\\x46\\x53\\xc6\\xc3\\xf6\\x73\\x62\\x60\\xbc\\x78\\xee\\x43\\x72\\x86\\x2f\\xfe\\x9e\\x90\\x37\\x1d\\x76\\x2c\\x74\\x32\\x78\\x1f\\x35\\xce\\xd8\\x84\\xa4\\xba\\xca\\x05\\x65\\x3e\\xf2\\x5f\\x25\\xa6\\xf3\\xd5\\x62\\x83\\x08\"},\n{{0x8c,0x34,0xb9,0x05,0x44,0x0b,0x61,0x91,0x1d,0x1d,0x81,0x37,0xc5,0x3d,0x46,0xa1,0xa7,0x6d,0x46,0x09,0xaf,0x97,0x3e,0x18,0xeb,0x4c,0x57,0x09,0x29,0x56,0x27,0xbb,},{0xb6,0x9a,0x8b,0x2f,0xdf,0x5c,0x20,0xe7,0x34,0xc2,0xff,0xb2,0x94,0xbc,0x8a,0xe1,0x01,0x1d,0x66,0x4f,0x11,0xaf,0xe7,0xfb,0xc4,0x71,0x92,0x5c,0xf7,0x2f,0xa9,0x9d,},{0x3e,0x0b,0x72,0x07,0x3d,0xc9,0x37,0x5e,0xed,0xcc,0xa6,0xc4,0xfc,0x1c,0xd3,0x15,0x93,0x8a,0x05,0x0c,0x92,0x71,0x6b,0xd2,0x28,0x4f,0x46,0x29,0xa9,0x62,0xbe,0xec,0x0b,0x7d,0x7c,0xf1,0x6a,0xb9,0x23,0xd5,0x8f,0x5b,0x90,0xd3,0x90,0x1a,0x8e,0x5c,0x75,0xc8,0xf1,0x7d,0xab,0x99,0x98,0xe0,0x07,0xd8,0xc4,0x95,0x11,0x97,0x3d,0x0e,},\"\\x30\\xb5\\x7a\\x38\\x9b\\x48\\xa0\\xbe\\xb1\\xa4\\x84\\x32\\xbf\\xf6\\xb3\\x14\\xbd\\xed\\x79\\xc4\\xa1\\x76\\x3a\\x5a\\xcb\\x57\\xce\\xa1\\xbf\\xb4\\xc6\\xd0\\x16\\xcf\\x09\\x0f\\x5b\\xd0\\x5b\\xbd\\x11\\x4e\\x33\\xae\\x7c\\x17\\x78\\x2d\\xfa\\x26\\x4f\\x46\\xc4\\x5f\\x8c\\x59\\x9c\\x60\\x30\\x16\\xfe\\x9f\\xf0\\x5b\\x6b\\x5a\\x99\\xe9\\x2f\\xe7\\x13\\xa4\\xcd\\x5c\\x41\\xb2\\x92\\xed\\x2b\\xb2\\xe9\\xcf\\x33\\xa4\\x40\\x54\\x2e\\x82\\x1e\\xc8\\x2c\\xbf\\x66\\x5c\\x3f\\x02\\xe3\\xdc\\x33\\x7d\\x7f\\xdb\\x58\\xe3\\x1b\\x27\\xcb\\x29\\x54\\x54\\x14\\x68\\x81\\x46\\x98\\x51\\x0d\\xf1\\x8c\\x85\\xc8\\x1f\\xad\\x12\\xdb\\x11\\xec\\x6b\\x96\\x6f\\x49\\x30\\xda\\x56\\x46\\xb9\\x91\\xdb\\x97\\x44\\x50\\x97\\xda\\x30\\xda\\xb6\\x1c\\xda\\x53\\xa4\\x10\\x83\\xcb\\x96\\xad\\xd1\\x9d\\xe6\\xc5\\xee\\xc3\\x23\\xbc\\xa9\\xd3\\x53\\x0e\\x38\\xc0\\x0b\\x35\\xaf\\x73\\x60\\x07\\x76\\x01\\xbe\\x6a\\xc9\\x7f\\x30\\x30\\xf9\\x30\\xa2\\x7b\\x90\\xfe\\x8b\\x69\\x11\\xba\\xe3\\x89\\x06\\x5a\\xdc\\x15\\xe1\\x88\\x23\\x00\\xe2\\xa0\\x03\\x27\\x4d\\x23\\x18\\x2d\\x5e\\xfd\\x5b\\xa4\\xb9\\x13\\x0c\\x07\\xbd\\x5c\\x65\\xfe\\xcb\\x8b\\x5c\\xb7\\xeb\\x38\\x83\\x6b\\x31\\x8b\\xef\\xdf\\xd7\\x7d\\xe4\\xd6\\xca\\x01\\x81\\xf7\\x7a\\xe5\\x74\\x08\\x91\\x68\\x32\\x25\\xf5\\x49\\xdd\\x84\\x26\\x14\\x5c\\x97\\xc5\\x81\\x8c\\x31\\x9f\\x7a\\xb2\\xd8\\x68\\xe1\\xa4\\x1c\\xea\\xb6\\x4c\\x08\\x51\\x16\\x06\\x98\\x97\\xbf\\x2c\\xa3\\x66\\x76\\x52\\x40\\x61\\x55\\xed\\x06\\x46\\x43\\x1b\\x6d\\xe1\\xcc\\xc0\\x3b\\x42\\x79\\xae\\x4d\\x32\\x66\\x79\\x26\\x5d\\xce\\x82\\x04\\x8e\\x72\\x98\\xe1\\xf8\\x7f\\xce\\xc0\\x76\\x8a\\xc0\\xf5\\xd8\\xff\\x84\\xf7\\x21\\x0b\\xe5\\x4d\\x41\\x1a\\xf8\\xed\\xea\\x72\\x17\\xf4\\xe5\\x94\\x13\\x12\\x1e\\x14\\x8c\\x60\\xda\"},\n{{0x77,0xa8,0x3e,0x18,0xc9,0xf0,0x00,0xee,0xff,0x7d,0xee,0xac,0x95,0x9e,0xcb,0xa2,0x20,0x6c,0x0a,0xa3,0x9d,0x2f,0x0e,0x2a,0xed,0x57,0x29,0x48,0x2a,0x7a,0x02,0x29,},{0x62,0xb1,0xb3,0x16,0x13,0x55,0x96,0xbf,0xbc,0xa6,0x03,0x7e,0xd8,0x47,0xc6,0x1f,0xb7,0xf0,0x9f,0xa3,0x6c,0xe9,0x0a,0xbb,0x77,0x89,0xb8,0x6f,0x76,0x8b,0x59,0xdd,},{0x1e,0xaa,0xd8,0x42,0x0a,0xc1,0x2c,0x99,0xac,0x1f,0xf4,0x47,0x66,0x78,0xe3,0xcb,0xbe,0x94,0xda,0x6a,0x79,0x7f,0x17,0x46,0x64,0xd5,0xee,0x0f,0x64,0x14,0x33,0xfb,0x1e,0x7c,0xb2,0xf5,0x61,0x3e,0x10,0x80,0x5d,0xf8,0x65,0x4c,0xd8,0xe0,0xd4,0x5d,0x96,0x23,0x09,0x32,0xbc,0x7f,0x20,0xb0,0x4e,0xae,0x83,0x64,0x35,0x13,0x43,0x09,},\"\\xf3\\xd5\\xfa\\x2a\\xca\\xef\\xd8\\x58\\xf1\\xdf\\x26\\xe0\\x30\\x59\\xcd\\xcb\\xc2\\x46\\x8a\\xd7\\x4a\\xfc\\x99\\x3d\\x0d\\xb9\\xc4\\xcd\\xe4\\x11\\x3f\\x8d\\x55\\xc7\\xda\\x71\\xd3\\x8b\\xa0\\x65\\x20\\x53\\x1c\\x61\\xfd\\xdb\\x5f\\x33\\xd5\\xf0\\x35\\x3b\\xe2\\x37\\x6e\\x58\\x07\\x11\\xbe\\x45\\xc0\\xa3\\x0b\\x1f\\xa0\\x1b\\x55\\xe2\\x28\\xc6\\xfa\\x35\\xe3\\xf9\\x5b\\x67\\x90\\x9f\\xc7\\xdf\\x3f\\xd4\\x64\\xd9\\x3d\\x66\\x1a\\x92\\x6f\\x9d\\x11\\xf7\\x55\\x0c\\x17\\xfb\\xcc\\x34\\x96\\x52\\x6e\\x8f\\x10\\xe0\\xc8\\x91\\x66\\x77\\xb2\\xbe\\x5b\\x31\\x9b\\x68\\x8f\\x21\\xe8\\x1a\\xaa\\x94\\x82\\xe5\\xc9\\x3e\\x64\\xce\\x8c\\x43\\x7b\\x9c\\x1e\\x14\\xfe\\xfe\\xd7\\x0a\\x3f\\xee\\x56\\x88\\x11\\xdc\\x31\\xca\\xda\\xb3\\xd5\\xb2\\x20\\x25\\x44\\x65\\x33\\x6d\\xc4\\xd9\\x7a\\x3b\\xd0\\x96\\xb5\\xe0\\x65\\xe0\\xcf\\xbe\\x82\\x84\\x9e\\x2c\\x19\\x05\\xac\\xa4\\x86\\x53\\x3f\\x0d\\xa7\\xa6\\x1f\\x1e\\x9a\\x55\\xb8\\xe2\\xa8\\x32\\x62\\xde\\xeb\\x59\\xf2\\xb1\\x3d\\x3a\\x8a\\xef\\x57\\x00\\x84\\x5b\\x83\\xb2\\x5a\\xe2\\x18\\x3c\\x0d\\xda\\xc0\\xce\\x42\\xf8\\xd2\\x56\\x74\\xcb\\x0d\\x0d\\x22\\x0a\\x6d\\xe7\\xc1\\x85\\x8b\\xb0\\x7d\\x59\\xa3\\x37\\x23\\x44\\xd9\\x44\\x60\\x2a\\xa4\\x51\\xd2\\xb9\\x37\\xdb\\x0f\\xe6\\xfe\\xca\\x0b\\xeb\\xa8\\x17\\x21\\xfc\\x36\\x1e\\xa7\\x50\\x9e\\x2b\\x6d\\x39\\x7e\\x1c\\x19\\x1b\\x56\\xf5\\x4a\\xb4\\x36\\xd0\\xd2\\x7a\\xb4\\xc0\\x61\\xbd\\x66\\x1a\\xd1\\xa4\\x45\\x23\\x87\\xe8\\x73\\x57\\x54\\xd0\\x7f\\xa7\\xef\\x4d\\x45\\x48\\xb1\\x72\\x58\\x24\\x25\\xb2\\x99\\x04\\x6e\\x63\\x01\\xb5\\xba\\x6b\\x91\\x44\\x18\\xf1\\x49\\xcf\\x72\\x2e\\x10\\xbd\\xe2\\xe0\\xd4\\x17\\x00\\xf1\\x2c\\x84\\x29\\xfc\\x89\\x7b\\x78\\x19\\xda\\x92\\x29\\x22\\x40\\xcd\\x45\\x56\\x54\\x58\\xc9\\xa7\\xb2\\x9c\\x12\"},\n{{0x73,0xb0,0x33,0x73,0xef,0x1f,0xd8,0x49,0x00,0x5e,0xcd,0x62,0x70,0xdd,0x99,0x06,0xf1,0x9f,0x44,0x39,0xe4,0x03,0x76,0xcd,0xbc,0x52,0x09,0x02,0xbc,0x97,0x68,0x12,},{0x66,0x37,0x19,0xe0,0x8b,0xa3,0xba,0x16,0x66,0xf6,0x06,0x9a,0x3f,0x54,0x99,0x18,0x66,0xb1,0x8c,0xc6,0xbe,0x41,0x99,0x1b,0x02,0xeb,0x30,0x26,0xff,0x9e,0x15,0x5f,},{0xa4,0x0a,0xbe,0x98,0xfc,0x69,0xda,0x8a,0x1f,0xf9,0xff,0x5c,0x2c,0xca,0x93,0x63,0x2e,0x97,0x59,0x80,0xee,0x8b,0x82,0xc3,0xc3,0x76,0x02,0x2d,0x65,0x24,0xab,0x73,0x6d,0x01,0xb0,0x72,0xf2,0xb6,0x81,0xb5,0xf1,0xcd,0x3e,0xa0,0x67,0x01,0x2e,0xd6,0xd0,0x74,0xe9,0x49,0xc4,0x23,0x27,0xa3,0x66,0xca,0xa9,0xe4,0x75,0x0a,0x3c,0x08,},\"\\xd5\\xc2\\xde\\xab\\xa7\\x95\\xc3\\x0a\\xba\\x32\\x1b\\xc7\\xde\\x69\\x96\\xf0\\xd9\\x0e\\x4d\\x05\\xc7\\x47\\xfb\\x4d\\xae\\x8f\\x34\\x51\\x89\\x5d\\xef\\x6e\\x16\\xe7\\x2f\\x38\\xea\\xce\\x75\\x6f\\x36\\x63\\x5f\\x8f\\xb0\\xb7\\x2a\\x3a\\x0c\\x1f\\x54\\x66\\x38\\x17\\xa9\\x4d\\x4f\\xd3\\x46\\xf8\\x35\\xab\\x0e\\x65\\x7f\\x00\\x1a\\x6f\\x2c\\xec\\xb8\\x6d\\x08\\x25\\xbd\\x02\\x63\\x92\\x54\\xf7\\xf7\\xf3\\x8c\\xa9\\x9d\\xbb\\x86\\xc6\\x4a\\x63\\x3f\\x73\\xba\\xf9\\x33\\xaa\\xe3\\x56\\x32\\x81\\xf4\\x00\\x5e\\x2d\\x0e\\x7c\\xec\\x9f\\xbd\\xe8\\xe5\\x88\\xa9\\x57\\xe2\\x11\\x06\\x8b\\xe6\\x5b\\x3d\\x3d\\x35\\xbf\\x4e\\x8d\\x5b\\xb3\\x47\\x83\\x33\\xdf\\x9c\\xed\\x9b\\x2a\\xba\\xf4\\x86\\x97\\x99\\x4a\\x14\\x5e\\x93\\x21\\x49\\x9f\\xc5\\xee\\x56\\x0f\\x4f\\xbb\\x68\\x49\\xe1\\xae\\x8e\\xb3\\xd1\\xde\\x00\\x83\\xa2\\x1a\\x03\\xf6\\xa6\\xb2\\x81\\x76\\xf0\\x13\\x0d\\x38\\x95\\xe5\\x0e\\x75\\xe3\\xd7\\xd0\\x94\\x7a\\x7b\\xc2\\xc5\\xb9\\xff\\x69\\x89\\x5d\\x27\\x79\\x14\\x42\\xba\\x8d\\x0f\\x21\\x80\\x71\\x2b\\x56\\x7f\\x71\\x2e\\xa9\\x12\\xf3\\xb0\\xd9\\x2c\\x19\\x34\\x2e\\x01\\x06\\xff\\x1d\\x87\\xb4\\x6a\\xd3\\x3a\\xf3\\x00\\xb9\\x08\\x55\\xba\\x97\\x69\\xd3\\x66\\xe7\\x94\\x25\\xd9\\x8e\\x4d\\xe1\\x99\\x05\\xa0\\x45\\x77\\x70\\x7c\\xbe\\x62\\x5b\\x84\\x69\\x17\\x81\\xcd\\x26\\xbf\\x62\\x26\\x0b\\x4a\\x8b\\xd6\\x05\\xf7\\x7a\\xf6\\xf9\\x70\\xe1\\xb3\\xa1\\x12\\xe8\\x91\\x83\\x44\\xbd\\x0d\\x8d\\x2e\\x41\\xdf\\xd2\\xce\\x98\\x95\\xb0\\x24\\x6e\\x50\\x88\\x7a\\xa3\\xa5\\x77\\xff\\x73\\xbe\\x4b\\x6a\\xe6\\x0f\\xeb\\x0c\\xa3\\x6f\\x6a\\x5f\\x81\\x71\\xed\\x20\\x9e\\x5c\\x56\\x65\\x29\\xc0\\x94\\x0d\\x9b\\x4b\\xd7\\x44\\xcc\\xee\\x56\\xe5\\x4a\\x9a\\x0c\\x6e\\x4d\\xa5\\x20\\xdd\\x31\\x5c\\x28\\x72\\xb0\\x2d\\xb5\\x63\\x70\\x3e\"},\n{{0xea,0xb1,0x79,0xe4,0x1e,0xd5,0xc8,0x89,0xff,0xe6,0xaa,0xbd,0xc0,0x54,0xfa,0xf1,0x30,0x7c,0x39,0x5e,0x46,0xe3,0x13,0xe1,0x7a,0x14,0xfe,0x01,0x02,0x3f,0xfa,0x30,},{0x86,0xf3,0x47,0x46,0xd3,0xf7,0xa0,0x1d,0xdb,0xe3,0x22,0xf1,0xac,0xa5,0x6d,0x22,0x85,0x6d,0x38,0x73,0x3a,0x3a,0x69,0x00,0xbb,0x08,0xe7,0x76,0x45,0x0e,0xc8,0x03,},{0x14,0x3c,0xb2,0x80,0x27,0xc2,0xf8,0x2e,0x37,0x5e,0x5f,0x34,0x0e,0x7f,0xe6,0xe6,0x0c,0xe7,0xbd,0x51,0x00,0x0b,0x49,0xc7,0x41,0x68,0xaf,0x85,0xe2,0x6e,0xd2,0xed,0x63,0x0e,0xd2,0x67,0x20,0x90,0x16,0x4c,0xc5,0x4b,0x05,0x2d,0xa6,0x94,0xeb,0xdd,0x21,0xa2,0x1b,0x30,0x53,0xf4,0xdc,0xfd,0x78,0x95,0xea,0x5f,0x6c,0x8a,0xa8,0x0d,},\"\\x97\\x10\\x95\\xce\\xbe\\x50\\x31\\x53\\x02\\x24\\x38\\x7c\\x5c\\x31\\x96\\x6e\\x38\\x9b\\x85\\x66\\x39\\x00\\x54\\xcf\\x45\\x26\\x4b\\x44\\xe1\\x89\\x64\\xb7\\xbe\\x52\\xc3\\x3c\\x4f\\xfb\\x25\\x9a\\xf1\\x62\\x83\\x43\\x8f\\xa1\\x5d\\xd6\\x6b\\xc7\\x79\\x1b\\x75\\x33\\xef\\x10\\xcb\\x0b\\xea\\xb5\\x24\\xa6\\x43\\x76\\x26\\xf4\\xcc\\x74\\x51\\x28\\x51\\xad\\xcc\\x2f\\xb1\\x29\\x05\\x5a\\x48\\x2c\\x61\\x10\\x73\\x83\\xfb\\x7c\\x52\\x41\\x83\\x1d\\x55\\x51\\x63\\x4e\\xef\\x0d\\xc0\\xb8\\xf9\\x05\\x3a\\x00\\x97\\x1a\\xa8\\xfa\\x1a\\xe0\\x89\\x8e\\x4b\\x48\\x1b\\x67\\x07\\xe9\\x7c\\x0f\\x94\\x20\\x40\\xb3\\x39\\xd9\\x2f\\xc1\\x7b\\xba\\xde\\x74\\x67\\x5a\\xf2\\x43\\xd8\\xb2\\xda\\xfb\\x15\\xb1\\xdb\\x55\\xd1\\x24\\x15\\xb8\\x5f\\x30\\x37\\x29\\x19\\x30\\xab\\x61\\x60\\x0b\\xa3\\x43\\x1f\\x8e\\xb4\\x25\\xbe\\x44\\x91\\x61\\x47\\x28\\xaf\\x10\\x1e\\x81\\xc0\\x91\\xf3\\x48\\xbc\\x5f\\xfd\\x1b\\xde\\x6a\\xe6\\xca\\xd5\\xc1\\x5b\\x3a\\xa7\\x35\\x80\\x78\\xcc\\x4e\\xff\\xb5\\x4a\\x86\\xe7\\xf0\\xe0\\xc5\\x5e\\x4c\\xfe\\x0a\\x54\\x60\\x5e\\xd4\\x43\\xfd\\xf2\\xaa\\xba\\x01\\x65\\x85\\xda\\x61\\x7e\\x77\\x34\\x1d\\x52\\x88\\x9d\\x75\\xdd\\x54\\x0d\\x39\\xfe\\x8b\\x79\\x93\\xed\\x70\\x5c\\xfd\\xde\\xa0\\xcb\\x0d\\x5a\\x73\\x1d\\x6b\\xfc\\xdb\\x81\\x6a\\xfa\\xff\\x47\\xe9\\x63\\xee\\xde\\xbd\\xf2\\x41\\xaf\\x55\\x93\\x35\\x3d\\x6d\\x40\\x1a\\x34\\xf0\\x29\\xa8\\xcd\\xeb\\x19\\x04\\xcc\\x2c\\xaa\\x4f\\x96\\x35\\xcc\\x2b\\xa6\\xb7\\xb1\\xa2\\x9d\\xa6\\x25\\xff\\xc3\\x83\\xbe\\x2f\\x5a\\x8f\\x1f\\xa4\\xf3\\x9b\\x2d\\x4b\\x4f\\x4c\\x2d\\x88\\x38\\xce\\x25\\x8a\\x04\\xd4\\xa1\\x20\\x49\\x3f\\xdf\\x07\\xf6\\x8c\\x0f\\xfd\\x1c\\x16\\xb7\\x68\\xa3\\x5c\\x55\\xfe\\xa2\\xca\\xc6\\x96\\xb5\\xc2\\x0e\\xfc\\x10\\x86\\x5c\\xde\\x8a\\x64\\x62\\x7d\\xcd\"},\n{{0xfb,0xf1,0x46,0xeb,0xd5,0x10,0x75,0x57,0x0e,0xc5,0x1a,0xc4,0x10,0xae,0x9f,0x39,0x1d,0xb7,0x5b,0x61,0x0a,0xda,0x63,0x62,0xb4,0xdb,0xd9,0x49,0x65,0x6c,0xfb,0x66,},{0xbe,0x7c,0x2f,0x5b,0x21,0xd7,0x46,0xc8,0xea,0x32,0x45,0xce,0x6f,0x26,0x8e,0x9d,0xa7,0x4e,0x00,0xfa,0x85,0xc9,0xc4,0x75,0x26,0x0c,0x68,0xfa,0x1a,0xf6,0x36,0x1f,},{0x67,0x68,0x00,0x6f,0xe0,0xf2,0x01,0xb2,0x17,0xdd,0x10,0xeb,0x05,0xd4,0xb8,0x2a,0xdc,0xfe,0xb2,0xec,0xfc,0x83,0x73,0xc3,0x30,0x8f,0x41,0x50,0x39,0x48,0x11,0xeb,0x60,0x49,0x18,0x81,0xa2,0xe5,0x3d,0x12,0x89,0xd9,0x64,0x78,0xe1,0x8a,0x64,0xc3,0x4b,0x2a,0x19,0x83,0x2c,0xdc,0xcf,0xd9,0x6a,0x2e,0x4a,0x0c,0x46,0x9f,0xdc,0x0b,},\"\\xcd\\x7a\\xd4\\xf1\\x7f\\xcf\\xf7\\x3a\\xcc\\x40\\x2d\\xc1\\x02\\xd0\\x90\\x79\\xb2\\x9a\\xaf\\x2a\\x0f\\x4b\\x27\\xcf\\x6b\\xee\\xb1\\xe2\\xb2\\x3d\\x19\\xab\\x47\\xde\\xb3\\xae\\x1b\\xec\\xd6\\x88\\x61\\xea\\x27\\x9c\\x46\\x69\\x17\\x38\\xf4\\xff\\xf4\\x7c\\x43\\x04\\x7c\\x4f\\x8b\\x56\\xb6\\xbb\\xcc\\x3f\\xde\\x07\\x23\\xd4\\x41\\x20\\xdc\\xd3\\x07\\xa6\\x31\\x0d\\xc4\\xf3\\x66\\xb8\\xf3\\xcd\\x52\\xdb\\x19\\xb8\\x26\\x6a\\x48\\x7f\\x78\\x72\\x39\\x1c\\x45\\xfe\\x0d\\x32\\x48\\xa7\\xab\\xf2\\xc2\\x00\\x22\\xd3\\x76\\x95\\x47\\xf6\\x83\\x06\\x7d\\xcc\\x36\\x3c\\xd2\\x2f\\xd7\\xcd\\xa3\\xca\\xdc\\x15\\x80\\x40\\x56\\xf0\\xe2\\xaa\\x2b\\x79\\x50\\x08\\xc5\\x98\\xbe\\x7a\\x96\\x18\\x05\\xe6\\xdf\\x29\\x1b\\xa3\\x04\\x1c\\x47\\xff\\x56\\x40\\x27\\x5f\\x46\\xe6\\xae\\x82\\x09\\x2d\\x21\\xab\\xcb\\xcf\\xba\\x11\\xe7\\x30\\x21\\x60\\x08\\x82\\x2d\\xe3\\xce\\x46\\x24\\x00\\x59\\x6d\\xa7\\x9f\\x7a\\xe5\\xd1\\xdf\\x83\\x89\\x11\\x2a\\xd9\\x88\\x68\\xfa\\x94\\xfb\\x05\\x46\\xbf\\xe6\\xa6\\x7a\\xa8\\xd2\\x8c\\x4d\\x32\\x07\\x2d\\x2e\\xad\\xd6\\x25\\x62\\x55\\xf1\\x8c\\x23\\x82\\xe6\\x62\\xdf\\xa9\\x22\\xa6\\x80\\xe0\\x6a\\x43\\x62\\x2c\\x48\\x71\\xd2\\x7d\\x18\\x07\\xf7\\xb2\\x70\\x30\\x70\\xc8\\x3d\\xb8\\xdd\\x92\\x9c\\x06\\x03\\x8b\\x21\\x83\\xcb\\x8e\\x2b\\x9e\\xc4\\xc7\\x78\\xd7\\xec\\xf9\\xe9\\xff\\xac\\x77\\xfa\\x77\\x37\\xb0\\x55\\xfe\\xac\\x2e\\x79\\x82\\xae\\xee\\xc0\\xb7\\x2f\\x1b\\xbc\\xa2\\x42\\x4e\\x1a\\x84\\x4b\\xba\\xc7\\x9c\\xb2\\xe7\\x40\\x0f\\x81\\xdc\\x44\\x9d\\x05\\x60\\xb5\\x21\\xa7\\xc1\\x6b\\xb4\\x16\\x7e\\x66\\x96\\x58\\x60\\x58\\xa9\\xb8\\xed\\x2e\\x51\\x16\\x69\\x0b\\x77\\xf2\\xa1\\x7e\\x5c\\x0b\\x16\\xa8\\x3d\\xcb\\xd2\\xe2\\x45\\x52\\x29\\x3e\\x25\\x8b\\x32\\xba\\x7f\\x84\\x49\\x44\\x37\\x93\\x42\\x69\\x86\\x27\"},\n{{0xdf,0xf0,0xeb,0x6b,0x42,0x6d,0xea,0x2f,0xd3,0x3c,0x1d,0x3f,0xc2,0x4d,0xf9,0xb3,0x1b,0x48,0x6f,0xac,0xb7,0xed,0xb8,0x50,0x29,0x54,0xa3,0xe8,0xda,0x99,0xd9,0xfd,},{0xc2,0x45,0x08,0x5e,0xce,0x69,0xfb,0x9a,0xa5,0x60,0xd0,0xc2,0x7f,0xdb,0x63,0x4f,0x7a,0x84,0x0d,0x41,0xd8,0x46,0x36,0x60,0xfb,0xe8,0x24,0x83,0xb0,0xf3,0xcc,0x3a,},{0x6b,0x48,0xb1,0x0f,0x54,0x5d,0xdb,0x7a,0x89,0xcd,0x58,0x29,0xf4,0xe5,0xb2,0x01,0x46,0xcf,0x6b,0xc9,0x6e,0x55,0x0d,0x06,0xf6,0x5d,0xe8,0xbd,0xae,0x7c,0xcd,0xde,0xd2,0x6c,0xd6,0x30,0xf8,0x6c,0x92,0x66,0xbc,0xcf,0x88,0xe9,0x24,0x03,0x3e,0x04,0xf8,0x3a,0x54,0xf8,0x29,0x0d,0x7f,0x73,0x4c,0xf8,0x67,0x3c,0xca,0x8f,0x97,0x03,},\"\\xe7\\xc9\\xe3\\x13\\xd8\\x61\\x60\\xf4\\xc7\\x4a\\xa0\\xae\\x07\\x36\\x9e\\xe2\\x2b\\x27\\xf8\\x1b\\x3f\\x69\\x09\\x7a\\xff\\xae\\x28\\xda\\xe4\\x84\\x83\\xfb\\x52\\xa5\\xc0\\x62\\x30\\x6b\\x59\\x61\\x0f\\x5c\\xdb\\xff\\x63\\x32\\xb1\\x96\\x0c\\xd6\\xf2\\xb8\\xf7\\xb4\\x15\\x78\\xc2\\x0f\\x0b\\xc9\\x63\\x7a\\x0f\\xdf\\xc7\\x39\\xd6\\x1f\\x69\\x9a\\x57\\x3f\\x1c\\x1a\\x0b\\x49\\x29\\x45\\x06\\xcf\\x44\\x87\\x96\\x5e\\x5b\\xb0\\x7b\\xbf\\x81\\x80\\x3c\\xb3\\xd5\\xcb\\x38\\x29\\xc6\\x6c\\x4b\\xee\\x7f\\xc8\\x00\\xed\\xe2\\x16\\x15\\x09\\x34\\xd2\\x77\\xde\\xa5\\x0e\\xdb\\x09\\x7b\\x99\\x2f\\x11\\xbb\\x66\\x9f\\xdf\\x14\\x0b\\xf6\\xae\\x9f\\xec\\x46\\xc3\\xea\\x32\\xf8\\x88\\xfd\\xe9\\xd1\\x54\\xea\\x84\\xf0\\x1c\\x51\\x26\\x5a\\x7d\\x3f\\xef\\x6e\\xef\\xc1\\xcc\\xdb\\xff\\xd1\\xe2\\xc8\\x97\\xf0\\x55\\x46\\xa3\\xb1\\xca\\x11\\xd9\\x51\\x7c\\xd6\\x67\\xc6\\x60\\xec\\x39\\x60\\xf7\\xa8\\xe5\\xe8\\x02\\x02\\xa7\\x8d\\x3a\\x38\\x8b\\x92\\xf5\\xc1\\xde\\xe1\\x4a\\xe6\\xac\\xf8\\xe1\\x7c\\x84\\x1c\\x95\\x57\\xc3\\x5a\\x2e\\xec\\xed\\x6e\\x6a\\xf6\\x37\\x21\\x48\\xe4\\x83\\xcc\\xd0\\x6c\\x8f\\xe3\\x44\\x92\\x4e\\x10\\x19\\xfb\\x91\\xcb\\xf7\\x94\\x1b\\x9a\\x17\\x6a\\x07\\x34\\x15\\x86\\x72\\x10\\x67\\x04\\x10\\xc5\\xdb\\xd0\\xac\\x4a\\x50\\xe6\\xc0\\xa5\\x09\\xdd\\xfd\\xc5\\x55\\xf6\\x0d\\x69\\x6d\\x41\\xc7\\x7d\\xb8\\xe6\\xc8\\x4d\\x51\\x81\\xf8\\x72\\x75\\x5e\\x64\\xa7\\x21\\xb0\\x61\\xfc\\xd6\\x8c\\x46\\x3d\\xb4\\xd3\\x2c\\x9e\\x01\\xea\\x50\\x12\\x67\\xde\\x22\\x87\\x9d\\x7f\\xc1\\x2c\\x8c\\xa0\\x37\\x9e\\xdb\\x45\\xab\\xaa\\x6e\\x64\\xdd\\xa2\\xaf\\x6d\\x40\\xcc\\xf2\\x4f\\xbe\\xba\\xd7\\xb5\\xa8\\xd3\\xe5\\x20\\x07\\x94\\x5e\\xcd\\x3d\\xdc\\x1e\\x3e\\xfe\\xb5\\x22\\x58\\x1a\\xc8\\x0e\\x98\\xc8\\x63\\xba\\x0c\\x59\\x0a\\x3e\\xd9\\x5c\\xd1\"},\n{{0x9f,0x32,0x95,0x8c,0x76,0x79,0xb9,0x0f,0xd5,0x03,0x60,0x56,0xa7,0x5e,0xc2,0xeb,0x2f,0x56,0xec,0x1e,0xff,0xc7,0xc0,0x12,0x46,0x1d,0xc8,0x9a,0x3a,0x16,0x74,0x20,},{0x1d,0x72,0x69,0xdc,0xb6,0xd1,0xf5,0x84,0xe6,0x62,0xd4,0xce,0x25,0x1d,0xe0,0xab,0xa2,0x90,0xef,0x78,0xb9,0x7d,0x44,0x8a,0xfb,0x1e,0x53,0x33,0xf1,0x97,0x6d,0x26,},{0x98,0x81,0xa5,0x76,0x3b,0xdb,0x25,0x9a,0x3f,0xef,0xbb,0xa3,0xd9,0x57,0x16,0x2d,0x6c,0x70,0xb8,0x04,0xfa,0x94,0xab,0x61,0x34,0x06,0xa6,0xec,0x42,0x50,0x5b,0x87,0x89,0x46,0x5c,0xa1,0xa9,0xa3,0x3e,0x18,0x95,0x98,0x88,0x42,0x27,0x0c,0x55,0xe5,0xbd,0xd5,0x48,0x3f,0x6b,0x17,0xb3,0x17,0x81,0xb5,0x93,0x50,0x7a,0x6c,0x18,0x08,},\"\\xa5\\x6b\\xa8\\x6c\\x71\\x36\\x05\\x04\\x08\\x7e\\x74\\x5c\\x41\\x62\\x70\\x92\\xad\\x6b\\x49\\xa7\\x1e\\x9d\\xaa\\x56\\x40\\xe1\\x04\\x4b\\xf0\\x4d\\x4f\\x07\\x1a\\xd7\\x28\\x77\\x9e\\x95\\xd1\\xe2\\x46\\x05\\x84\\xe6\\xf0\\x77\\x35\\x45\\xda\\x82\\xd4\\x81\\x4c\\x91\\x89\\xa1\\x20\\xf1\\x2f\\x3e\\x38\\x19\\x81\\x3e\\x5b\\x24\\x0d\\x0f\\x26\\x43\\x6f\\x70\\xee\\x35\\x3b\\x4d\\x20\\xce\\xa5\\x4a\\x14\\x60\\xb5\\xb8\\xf1\\x00\\x8d\\x6f\\x95\\xf3\\xaa\\x2d\\x8f\\x1e\\x90\\x8f\\xce\\xd5\\x0d\\x62\\x4e\\x3a\\x09\\x69\\x38\\xb9\\x35\\x38\\x54\\xb9\\x6d\\xa4\\x63\\xa2\\x79\\x8a\\x5a\\x31\\x2e\\xc7\\x90\\x84\\x2c\\x10\\xc4\\x46\\xe3\\x35\\x0c\\x76\\x4b\\xf5\\xc9\\x72\\x59\\x3b\\x99\\x87\\xbf\\x23\\x25\\x6d\\xaa\\x88\\x94\\xd4\\x7f\\x22\\xe8\\x5b\\x97\\x60\\x7e\\x66\\xfc\\x08\\xa1\\x2c\\x78\\x9c\\x47\\x46\\x08\\x03\\x68\\xd3\\x21\\xbb\\x90\\x15\\xa1\\x15\\x5b\\x65\\x52\\x3a\\xd8\\xe9\\x9b\\xb9\\x89\\xb4\\x4e\\xac\\x75\\x6b\\x07\\x34\\xac\\xd7\\xc6\\x35\\x7c\\x70\\xb5\\x97\\x43\\x24\\x6d\\x16\\x52\\xd9\\x1b\\x0f\\x98\\x96\\x96\\x51\\x41\\x34\\x5b\\x99\\x45\\xcf\\x34\\x98\\x04\\x52\\xf3\\x50\\x29\\x74\\xed\\xb7\\x6b\\x9c\\x78\\x5f\\xb0\\xf4\\x39\\x52\\x66\\xb0\\x55\\xf3\\xb5\\xdb\\x8a\\xab\\x68\\xe9\\xd7\\x10\\x2a\\x1c\\xd9\\xee\\x3d\\x14\\x25\\x04\\xf0\\xe8\\x8b\\x28\\x2e\\x60\\x3a\\x73\\x8e\\x05\\x1d\\x98\\xde\\x05\\xd1\\xfc\\xc6\\x5b\\x5f\\x7e\\x99\\xc4\\x11\\x1c\\xc0\\xae\\xc4\\x89\\xab\\xd0\\xec\\xad\\x31\\x1b\\xfc\\x13\\xe7\\xd1\\x65\\x3b\\x9c\\x31\\xe8\\x1c\\x99\\x80\\x37\\xf9\\x59\\xd5\\xcd\\x98\\x08\\x35\\xaa\\x0e\\x0b\\x09\\xbc\\xbe\\xd6\\x34\\x39\\x11\\x51\\xda\\x02\\xbc\\x01\\xa3\\x6c\\x9a\\x58\\x00\\xaf\\xb9\\x84\\x16\\x3a\\x7b\\xb8\\x15\\xed\\xbc\\x02\\x26\\xed\\xa0\\x59\\x5c\\x72\\x4c\\xa9\\xb3\\xf8\\xa7\\x11\\x78\\xf0\\xd2\\x0a\\x5a\"},\n{{0xf8,0x6d,0x6f,0x76,0x6f,0x88,0xb0,0x07,0x17,0xb7,0xd6,0x32,0x7e,0xb2,0x6c,0xf3,0xce,0xeb,0xa5,0x38,0x51,0x84,0x42,0x6f,0x9c,0xfd,0x82,0x95,0xe2,0x42,0x1f,0xf2,},{0xcb,0x1d,0x25,0x05,0x04,0x75,0x41,0x83,0x70,0x4d,0xbe,0x21,0xc3,0x23,0xd6,0x6f,0x9f,0x90,0x11,0x75,0x8f,0x6d,0x8d,0xab,0x6f,0x59,0x7b,0x19,0x96,0x62,0x14,0x5b,},{0xec,0x61,0xc0,0xb2,0x92,0x20,0x3a,0x8f,0x1d,0x87,0x23,0x5e,0xde,0x92,0xb7,0x47,0x23,0xc8,0xd2,0x34,0x08,0x42,0x37,0x73,0xae,0x50,0xb1,0xe9,0xbc,0x44,0x64,0xe0,0x3e,0x44,0x6d,0xa9,0xdc,0xe4,0xc3,0x9f,0x6d,0xd1,0x59,0xbe,0xa2,0x6c,0x00,0x9e,0xd0,0x01,0x20,0xbc,0x36,0xd4,0xa2,0x47,0xdc,0x0d,0x24,0xbc,0xef,0xcc,0x11,0x0c,},\"\\xda\\x84\\x23\\xa6\\xb7\\xa1\\x8f\\x20\\xaa\\x1f\\x90\\xed\\x23\\x31\\xb1\\x7b\\x24\\x06\\x7c\\x40\\x17\\x5b\\xc2\\x5d\\x81\\x09\\xe2\\x1d\\x87\\xac\\x00\\x52\\x8e\\xb3\\xb2\\xf6\\x6a\\x2b\\x52\\xdc\\x7e\\xf2\\xf8\\xce\\xcb\\x75\\xc7\\x60\\x99\\xcf\\xa2\\x3d\\xb8\\xda\\x89\\x70\\x43\\xba\\x1c\\xce\\x31\\xe2\\xdf\\xea\\x46\\x07\\x5f\\x5e\\x07\\x32\\x03\\xea\\xeb\\x3d\\x62\\xc8\\x4c\\x10\\x7b\\x6d\\xab\\x33\\xa1\\x4e\\xaf\\x14\\x9a\\xa6\\x18\\x50\\xc1\\x5f\\x5a\\x58\\xd8\\x8a\\x15\\xab\\xa9\\x19\\x6f\\x9e\\x49\\x5e\\x8d\\xbe\\xcb\\xcf\\x7e\\x84\\x44\\xf5\\xdd\\x72\\xa0\\x8a\\x09\\x9d\\x7f\\x62\\x09\\x99\\x0b\\x56\\x29\\x74\\xea\\x82\\x9e\\xf1\\x1d\\x29\\xa9\\x20\\xe3\\xa7\\x99\\xd0\\xd9\\x2c\\xb5\\x0d\\x50\\xf8\\x17\\x63\\x1a\\xb0\\x9d\\xe9\\x7c\\x31\\xe9\\xa0\\x5f\\x4d\\x78\\xd6\\x49\\xfc\\xd9\\x3a\\x83\\x75\\x20\\x78\\xab\\x3b\\xb0\\xe1\\x6c\\x56\\x4d\\x4f\\xb0\\x7c\\xa9\\x23\\xc0\\x37\\x4b\\xa5\\xbf\\x1e\\xea\\x7e\\x73\\x66\\x8e\\x13\\x50\\x31\\xfe\\xaf\\xcb\\xb4\\x7c\\xbc\\x2a\\xe3\\x0e\\xc1\\x6a\\x39\\xb9\\xc3\\x37\\xe0\\xa6\\x2e\\xec\\xdd\\x80\\xc0\\xb7\\xa0\\x49\\x24\\xac\\x39\\x72\\xda\\x4f\\xa9\\x29\\x9c\\x14\\xb5\\xa5\\x3d\\x37\\xb0\\x8b\\xf0\\x22\\x68\\xb3\\xba\\xc9\\xea\\x93\\x55\\x09\\x0e\\xeb\\x04\\xad\\x87\\xbe\\xe0\\x59\\x3b\\xa4\\xe4\\x44\\x3d\\xda\\x38\\xa9\\x7a\\xfb\\xf2\\xdb\\x99\\x52\\xdf\\x63\\xf1\\x78\\xf3\\xb4\\xc5\\x2b\\xcc\\x13\\x2b\\xe8\\xd9\\xe2\\x68\\x81\\x21\\x3a\\xbd\\xeb\\x7e\\x1c\\x44\\xc4\\x06\\x15\\x48\\x90\\x9f\\x05\\x20\\xf0\\xdd\\x75\\x20\\xfc\\x40\\x8e\\xa2\\x8c\\x2c\\xeb\\xc0\\xf5\\x30\\x63\\xa2\\xd3\\x05\\x70\\xe0\\x53\\x50\\xe5\\x2b\\x39\\x0d\\xd9\\xb6\\x76\\x62\\x98\\x48\\x47\\xbe\\x9a\\xd9\\xb4\\xcd\\x50\\xb0\\x69\\xff\\xd2\\x9d\\xd9\\xc6\\x2e\\xf1\\x47\\x01\\xf8\\xd0\\x12\\xa4\\xa7\\x0c\\x84\\x31\\xcc\"},\n{{0xa5,0xb3,0x4c,0xef,0xab,0x94,0x79,0xdf,0x83,0x89,0xd7,0xe6,0xf6,0xc1,0x46,0xaa,0x8a,0xff,0xb0,0xbe,0xc8,0x37,0xf7,0x8a,0xf6,0x46,0x24,0xa1,0x45,0xcc,0x34,0x4e,},{0x7b,0x0f,0x4f,0x24,0xd9,0x97,0x2b,0xc6,0xfe,0x83,0x82,0x6c,0x52,0x71,0x6a,0xd1,0xe0,0xd7,0xd1,0x9f,0x12,0x38,0x58,0xcb,0x3e,0x99,0xfa,0x63,0x6a,0xc9,0x63,0x1a,},{0x2f,0xbd,0x89,0x9d,0x72,0xb6,0xd3,0x9e,0x4f,0x45,0xb8,0xb6,0x2c,0xbb,0xd5,0xf3,0xc0,0xac,0xb1,0xad,0x85,0x40,0x91,0x3f,0xa5,0x85,0x87,0x7e,0x91,0xcc,0xfe,0xf7,0xbe,0xe5,0x0a,0x4b,0x0f,0x9f,0xed,0xf5,0xcc,0x1e,0x0d,0x19,0x53,0xad,0x39,0x9c,0x83,0x89,0xa9,0x33,0x91,0xe1,0xb7,0xc9,0x29,0xaf,0x6d,0x6f,0x3b,0x79,0x6c,0x08,},\"\\xe2\\x1e\\x98\\xaf\\x6c\\x2b\\xac\\x70\\x55\\x7e\\xb0\\xe8\\x64\\xda\\x2c\\x2b\\x4d\\x6c\\x0a\\x39\\xa0\\x59\\xd3\\x47\\x72\\x51\\xf6\\x17\\x8a\\x39\\x67\\x6f\\x47\\x49\\xe7\\xfb\\xea\\x62\\x3f\\x14\\x8a\\x43\\xa8\\xb0\\xfe\\x06\\x10\\x50\\x6f\\xa6\\x58\\xab\\xd2\\xf5\\xfa\\x39\\x19\\x8f\\x26\\x36\\xb7\\x24\\xdb\\x22\\xd1\\xae\\xbc\\x2a\\xb0\\x7b\\x2b\\x6d\\xbf\\xfd\\xee\\x8c\\xec\\xe8\\x1e\\x1a\\xf1\\x49\\x3e\\xc1\\x96\\x4e\\x16\\xbf\\x86\\xab\\x25\\x8c\\xa0\\xfe\\xb7\\x7e\\x3c\\x87\\x17\\xe4\\x40\\x38\\xab\\xe1\\x52\\xc1\\x4b\\xe1\\x56\\x60\\xbf\\x93\\xb2\\xd4\\x8d\\x92\\xc4\\xed\\x70\\x74\\xd2\\x49\\x42\\x10\\x62\\x1b\\xcf\\x20\\x4f\\xba\\x88\\xc6\\x54\\xd5\\xff\\xe0\\x1e\\x1a\\x53\\xd0\\x8f\\x70\\xbb\\x23\\x70\\x89\\xdc\\x80\\x72\\x16\\xff\\x6a\\x85\\xdb\\xec\\x31\\x02\\x23\\x7d\\x42\\x59\\x07\\x78\\xac\\xf6\\xc1\\xdc\\x56\\x6d\\x5a\\x2b\\xb9\\xa6\\x3b\\xc2\\x1c\\x32\\x9c\\x27\\x2e\\x59\\x65\\xba\\xee\\xb0\\xfe\\x89\\x1d\\xe3\\xcc\\x8c\\xbf\\xa8\\xe5\\x41\\xa8\\x88\\x1d\\xf6\\x89\\x42\\xe7\\xff\\x8d\\xc6\\x56\\xbd\\x08\\x57\\x5f\\x6a\\xaf\\x92\\x4a\\x17\\x6d\\x66\\x3b\\x1a\\x1f\\x43\\x57\\x4d\\x11\\x76\\x8c\\x70\\x1b\\x26\\x95\\x61\\xe5\\x54\\x38\\xdb\\xeb\\xfd\\x44\\x3d\\x21\\x15\\xcb\\x93\\x3d\\x1c\\xde\\x4a\\x91\\x5b\\x54\\xc3\\x25\\xc2\\x7f\\x49\\x9e\\xf0\\x2b\\xd0\\x12\\xff\\x1f\\x9a\\x36\\x39\\x09\\x22\\x88\\x76\\x00\\xfe\\x71\\x2b\\xcd\\xc2\\x3e\\xb5\\x97\\x4a\\x30\\x53\\x72\\xad\\x52\\x95\\x1f\\x83\\xf0\\xe5\\x8c\\xc4\\x9e\\x28\\x98\\x41\\x62\\x19\\x17\\xf1\\xfc\\xb0\\x23\\x51\\x47\\x24\\x0d\\xae\\x4c\\xf3\\xb9\\x9b\\x6a\\xc6\\xd8\\xde\\x94\\xef\\xe7\\xc4\\x43\\x67\\x14\\x50\\x8b\\xcd\\x01\\x14\\xc5\\x60\\x68\\xff\\x1b\\x7c\\x16\\xd5\\x1b\\xd9\\x06\\x43\\x78\\x74\\xd6\\x54\\x9a\\xb5\\xd8\\x08\\x78\\x96\\x87\\x2e\\xc8\\xa0\\x9d\\x74\\x12\"},\n{{0xad,0x75,0xc9,0xce,0x29,0x9c,0x4d,0x59,0x39,0x33,0x67,0xd7,0x7a,0x4c,0x9f,0x8d,0xf8,0xdc,0xec,0x76,0x5c,0x6d,0xbd,0x25,0xb5,0x27,0xfb,0x76,0x69,0x91,0x36,0x04,},{0xb9,0x91,0x05,0x48,0xfe,0x63,0x12,0xa1,0x19,0xc9,0x99,0x3e,0xeb,0xcf,0xb9,0xdc,0x90,0x03,0x0f,0xfb,0x0e,0x4d,0xe2,0xb7,0xcc,0xd2,0x3c,0xbe,0xb4,0xfe,0xf7,0x1b,},{0x6b,0x7e,0xf2,0x7b,0xcf,0xbf,0x2b,0x71,0x49,0x85,0x03,0x37,0x64,0xfc,0xcf,0xf5,0x55,0xe3,0xf5,0xbc,0x44,0x61,0x0d,0x6c,0x8c,0x62,0x11,0x7c,0xb3,0x83,0x1a,0x07,0xf4,0xa8,0xbd,0xdb,0x0e,0xae,0xd1,0xd4,0x6b,0x02,0x89,0xb1,0x5d,0xe1,0xaa,0x4d,0xcc,0x17,0xd7,0x1b,0xe9,0x6a,0x09,0xe6,0x6b,0xa4,0xdc,0x46,0x27,0xc7,0x87,0x05,},\"\\x62\\xfc\\x5a\\xb6\\x7d\\xeb\\x1f\\xee\\x9a\\xb6\\xcc\\xa3\\xb8\\x8a\\x1d\\xf1\\xe5\\x89\\xf0\\xfd\\x4a\\x88\\xf4\\xaa\\x77\\x38\\x94\\x87\\x61\\xfe\\x84\\x37\\x2c\\x5b\\x18\\xe4\\x65\\x52\\x20\\xc1\\xd8\\x4d\\x52\\xac\\xad\\x32\\xe2\\x29\\xa5\\xc7\\x56\\xc2\\x0f\\xc6\\x2f\\xe4\\xb4\\xb4\\xe5\\xfd\\x70\\x77\\xae\\x4e\\xd5\\x39\\x7a\\xa7\\x96\\xf2\\x30\\x7c\\xee\\xdb\\x65\\x05\\xb3\\x92\\x97\\x85\\x6f\\x4a\\xeb\\x5e\\x70\\x93\\x8e\\x36\\xee\\x24\\xa0\\xac\\x7d\\x98\\x68\\x30\\x6f\\x6b\\x53\\x91\\x06\\x23\\xb7\\xdc\\x89\\xa6\\x67\\x2a\\xd7\\x38\\x57\\x6e\\xd5\\xd8\\x88\\x31\\xdd\\x33\\x83\\x21\\xc8\\x90\\x2b\\xc2\\x06\\x1f\\x65\\xe9\\x4d\\x45\\x2f\\xdf\\xa0\\xdc\\x66\\x5c\\xef\\xb9\\x23\\x08\\xe5\\x23\\x01\\xbd\\x46\\x27\\x00\\x6b\\x36\\x3d\\x06\\xb7\\x75\\xa3\\x95\\x91\\x4d\\x8c\\x86\\x3e\\x95\\xa0\\x0d\\x68\\x93\\xf3\\x37\\x61\\x34\\xc4\\x29\\xf5\\x64\\x78\\x14\\x5e\\x44\\x56\\xf7\\xa1\\x2d\\x65\\xbb\\x2b\\x89\\x65\\xd7\\x28\\xcb\\x2d\\xdb\\xb7\\x08\\xf7\\x12\\x5c\\x23\\x70\\x95\\xa9\\x21\\x95\\xd9\\x2f\\xa7\\x27\\xa3\\x72\\xf3\\x54\\x5a\\xe7\\x01\\xf3\\x80\\x8f\\xee\\x80\\x2c\\x89\\x67\\xa7\\x6e\\x8a\\x94\\x0e\\x55\\xfb\\x2d\\x81\\x0b\\xfb\\x47\\xad\\xa1\\x56\\xf0\\xed\\xa1\\x82\\x9b\\x15\\x9c\\xf0\\x5c\\x7f\\x36\\xcf\\x38\\x47\\xd7\\xb2\\x1d\\xe8\\x4c\\x3d\\xc0\\xfe\\x65\\x83\\x47\\xf7\\x93\\x96\\xa0\\x11\\x39\\xa5\\x08\\xb6\\x00\\x22\\xdb\\x1c\\x0e\\x5a\\xee\\xf4\\x7e\\x44\\x5e\\x66\\xf7\\x83\\xe6\\x2c\\x96\\x59\\x7b\\xdb\\x16\\xf2\\x09\\xc0\\x8a\\x91\\x32\\xc7\\x57\\x31\\x36\\x17\\x0e\\xe3\\xeb\\xf2\\x42\\x61\\x26\\x5a\\x89\\xfb\\x4f\\x10\\x33\\x33\\x75\\xe2\\x0b\\x33\\xab\\x74\\x03\\x46\\x4f\\x52\\x49\\x46\\x1c\\x68\\x53\\xc5\\xfd\\xdb\\x9f\\x58\\xaf\\x81\\x68\\x92\\x91\\x03\\x93\\xa7\\x07\\x7b\\x79\\x9f\\xdc\\x34\\x89\\x72\\x09\\x98\\xfe\\xea\\x86\"},\n{{0x1c,0xed,0x57,0x45,0x29,0xb9,0xb4,0x16,0x97,0x7e,0x92,0xeb,0x39,0x44,0x8a,0x87,0x17,0xca,0xc2,0x93,0x4a,0x24,0x3a,0x5c,0x44,0xfb,0x44,0xb7,0x3c,0xcc,0x16,0xda,},{0x85,0xe1,0x67,0xd5,0xf0,0x62,0xfe,0xe8,0x20,0x14,0xf3,0xc8,0xb1,0xbe,0xae,0xd8,0xee,0xfb,0x2c,0x22,0xd8,0x64,0x9c,0x42,0x4b,0x86,0xb2,0x1b,0x11,0xeb,0x8b,0xda,},{0xe0,0x30,0x3a,0xef,0xe0,0x8a,0x77,0x73,0x8d,0xcc,0x65,0x7a,0xfb,0xb9,0xb8,0x35,0xed,0x27,0x96,0x13,0xa5,0x3c,0x73,0xfd,0xc5,0xdd,0xbf,0xb3,0x50,0xe5,0xcf,0xf4,0xd6,0xc9,0xbb,0x43,0xdc,0x07,0xc9,0x5b,0xf4,0xe2,0x3b,0x64,0xc4,0x0f,0x88,0x04,0xc7,0x16,0x99,0x52,0xe3,0xc8,0xd5,0x9a,0x71,0x97,0x24,0x1b,0xfe,0xd0,0x74,0x0f,},\"\\x1b\\x3b\\x95\\x3c\\xce\\x6d\\x15\\x30\\x3c\\x61\\xca\\x70\\x76\\x09\\xf7\\x0e\\x72\\x50\\xf6\\xc0\\xde\\xba\\x56\\xa8\\xce\\x52\\x2b\\x59\\x86\\x68\\x96\\x51\\xcd\\xb8\\x48\\xb8\\x42\\xb2\\x22\\x96\\x61\\xb8\\xee\\xab\\xfb\\x85\\x70\\x74\\x9e\\xd6\\xc2\\xb1\\x0a\\x8f\\xbf\\x51\\x50\\x53\\xb5\\xea\\x7d\\x7a\\x92\\x28\\x34\\x9e\\x46\\x46\\xf9\\x50\\x5e\\x19\\x80\\x29\\xfe\\xc9\\xce\\x0f\\x38\\xe4\\xe0\\xca\\x73\\x62\\x58\\x42\\xd6\\x4c\\xaf\\x8c\\xed\\x07\\x0a\\x6e\\x29\\xc7\\x43\\x58\\x6a\\xa3\\xdb\\x6d\\x82\\x99\\x3a\\xc7\\x1f\\xd3\\x8b\\x78\\x31\\x62\\xd8\\xfe\\x04\\xff\\xd0\\xfa\\x5c\\xbc\\x38\\x1d\\x0e\\x21\\x9c\\x91\\x93\\x7d\\xf6\\xc9\\x73\\x91\\x2f\\xc0\\x2f\\xda\\x53\\x77\\x31\\x24\\x68\\x27\\x4c\\x4b\\xee\\x6d\\xca\\x7f\\x79\\xc8\\xb5\\x44\\x86\\x1e\\xd5\\xba\\xbc\\xf5\\xc5\\x0e\\x14\\x73\\x49\\x1b\\xe0\\x17\\x08\\xac\\x7c\\x9f\\xf5\\x8f\\x1e\\x40\\xf8\\x55\\x49\\x7c\\xe9\\xd7\\xcc\\x47\\xb9\\x41\\x0f\\x2e\\xdd\\x00\\xf6\\x49\\x67\\x40\\x24\\x3b\\x8d\\x03\\xb2\\xf5\\xfa\\x74\\x2b\\x9c\\x63\\x08\\x67\\xf7\\x7a\\xc4\\x2f\\x2b\\x62\\xc1\\x4e\\x5e\\xbd\\xdc\\x7b\\x64\\x7a\\x05\\xff\\xf4\\x36\\x70\\x74\\x5f\\x28\\x51\\xef\\xf4\\x90\\x9f\\x5d\\x27\\xd5\\x7a\\xe8\\x7f\\x61\\xe9\\x65\\xee\\x60\\xfd\\xf9\\x77\\x24\\xc5\\x92\\x67\\xf2\\x61\\x0b\\x7a\\xd5\\xde\\x91\\x98\\x56\\xd6\\x4d\\x7c\\x21\\x26\\x59\\xce\\x86\\x56\\x14\\x9b\\x6a\\x6d\\x29\\xd8\\xf9\\x2b\\x31\\x2b\\xe5\\x0b\\x6e\\x2a\\x43\\x1d\\x36\\xae\\x02\\x2b\\x00\\xa6\\xfe\\x36\\x0e\\x3a\\xf6\\x54\\x32\\x89\\x9c\\x43\\xbe\\x04\\x27\\xe3\\x6d\\x21\\xcf\\xec\\x81\\xf2\\x1a\\xa5\\x3b\\x33\\xdb\\x5e\\xd2\\xc3\\x7d\\xa8\\xf9\\x6a\\xc3\\xe7\\xdc\\x67\\xa1\\xde\\x37\\x54\\x6c\\xf7\\xde\\x10\\x08\\xc7\\xe1\\xad\\xbe\\x0f\\x34\\xfa\\x7e\\xb2\\x43\\x4d\\x94\\xe6\\xa1\\x3f\\x4c\\xf8\\x6a\\x98\\xd4\\x97\\x62\\x2f\"},\n{{0xf0,0x79,0x0d,0x93,0xe2,0xd3,0xb8,0x4f,0x61,0xef,0x4c,0x80,0x71,0x47,0xab,0xa4,0x10,0xe4,0x15,0xe7,0x2b,0x71,0xb0,0xd6,0x1d,0x01,0x02,0x6f,0xed,0x99,0xda,0x3d,},{0xef,0xdf,0x64,0x9f,0xb0,0x33,0xcf,0x32,0x8e,0x0b,0x28,0x77,0x96,0xf8,0xa2,0x5e,0x9c,0x6e,0x2e,0x87,0x1b,0x33,0xc2,0xc2,0x1a,0x40,0x28,0xa8,0xa2,0x5a,0x4b,0x28,},{0x08,0x77,0x3a,0x6a,0x78,0x76,0x2c,0xbb,0x1e,0x25,0xfc,0xbb,0x29,0x13,0x99,0x41,0xbd,0xf1,0x6f,0x4e,0x09,0xa1,0xfa,0x08,0xfc,0x70,0x1f,0x32,0xf9,0x33,0xed,0xd7,0x4c,0x0a,0xe9,0x83,0xc1,0x2a,0x0a,0x5b,0x02,0x0b,0x6b,0xcf,0x44,0xbb,0x71,0x9d,0xde,0x8e,0xd0,0x78,0x1a,0x82,0x98,0x26,0x56,0x40,0xe1,0x60,0x8c,0x98,0xb3,0x01,},\"\\x79\\x73\\xe9\\xf3\\x2d\\x74\\x80\\x59\\x92\\xeb\\x65\\xda\\x0d\\x63\\x73\\x35\\xe5\\x0e\\xff\\x0c\\xe6\\x8e\\xa2\\xd1\\xf3\\xa0\\x2d\\xe7\\x04\\x49\\x2b\\x9c\\xfb\\xe7\\xe7\\xba\\x96\\xfd\\xb4\\x2b\\xb8\\x21\\xa5\\x13\\xd7\\x3f\\xc6\\x04\\x02\\xe9\\x2c\\x85\\x5d\\xea\\xed\\x73\\xff\\xea\\xf7\\x09\\x52\\x02\\x90\\x62\\xc8\\x33\\xe1\\x4e\\xc1\\xb1\\x4f\\x14\\x4e\\x22\\x07\\xf6\\xa0\\xe7\\x27\\xe5\\xa7\\xe3\\xcb\\xab\\x27\\xd5\\x97\\x29\\x70\\xf6\\x95\\x18\\xa1\\x5b\\x09\\x3e\\x74\\x0c\\xc0\\xce\\x11\\xbf\\x52\\x48\\xf0\\x82\\x6b\\x8a\\x98\\xbd\\xe8\\xbf\\x2c\\x70\\x82\\xc9\\x7a\\xff\\x15\\x8d\\x08\\x37\\x11\\x18\\xc8\\x90\\x21\\xcc\\x39\\x74\\xae\\x8f\\x76\\xd8\\x66\\x73\\xc3\\xf8\\x24\\xb6\\x2c\\x79\\xc4\\xb4\\x1f\\x40\\xea\\xa8\\x94\\x37\\x38\\xf0\\x33\\x00\\xf6\\x8c\\xbe\\x17\\x54\\x68\\xeb\\x23\\x5a\\x9f\\xf0\\xe6\\x53\\x7f\\x87\\x14\\xe9\\x7e\\x8f\\x08\\xca\\x44\\x4e\\x41\\x19\\x10\\x63\\xb5\\xfa\\xbd\\x15\\x6e\\x85\\xdc\\xf6\\x66\\x06\\xb8\\x1d\\xad\\x4a\\x95\\x06\\x55\\x84\\xb3\\xe0\\x65\\x8c\\x20\\xa7\\x06\\xea\\xf4\\xa0\\x77\\x7d\\xa4\\xd2\\xe0\\xcd\\x2a\\x0f\\xca\\x60\\x10\\x9c\\x2b\\x44\\x03\\xdb\\x3f\\x03\\xcd\\x47\\x81\\xc1\\xfb\\xb0\\x27\\x22\\x02\\xbc\\xb1\\x16\\x87\\x80\\x8c\\x50\\xcb\\x98\\xf6\\x4b\\x7f\\x3f\\xd3\\xd4\\x33\\x33\\xbb\\x5a\\x06\\x1b\\x9e\\x37\\x70\\x90\\xab\\xb1\\xe0\\xa8\\x85\\xcb\\x26\\xb7\\x3c\\x16\\x3e\\x63\\xff\\x64\\x51\\xff\\x2f\\x4e\\xc8\\x24\\x9c\\x7e\\x15\\x2b\\xd0\\x39\\x73\\xa1\\xe9\\x64\\xe2\\xb5\\xb2\\x35\\x28\\x1a\\x93\\x83\\x99\\xa1\\x12\\xa2\\x45\\x29\\xe3\\x83\\xa5\\x60\\xdc\\x50\\xbb\\x1b\\x62\\x2a\\xd7\\x4e\\xf3\\x56\\x58\\xdc\\xb1\\x0f\\xfe\\x02\\x25\\x68\\xac\\x3f\\xfa\\xe5\\xb4\\x65\\xa8\\xed\\x76\\x43\\xe8\\x56\\x1b\\x35\\x2e\\xe9\\x94\\x4a\\x35\\xd8\\x82\\xc7\\x12\\xb1\\x87\\x78\\x8a\\x0a\\xba\\xe5\\xa2\\x2f\"},\n{{0x4c,0xb9,0xdf,0x7c,0xe6,0xfa,0xe9,0xd6,0x2b,0xa0,0x9e,0x8e,0xb7,0x0e,0x4c,0x96,0x9b,0xde,0xaf,0xcb,0x5e,0xc7,0xd7,0x02,0x43,0x26,0xe6,0x60,0x3b,0x06,0x21,0xbf,},{0x01,0x80,0x69,0xdd,0x0e,0xb4,0x40,0x55,0xa3,0x5c,0xd8,0xc7,0x7c,0x37,0xca,0x9f,0xb1,0xad,0x24,0x17,0x27,0x13,0x85,0xe1,0x34,0xb2,0xf4,0xe8,0x1f,0x52,0x03,0x3c,},{0xe3,0x3c,0x07,0x83,0x6c,0x53,0x7d,0x6b,0xfb,0xd0,0xf4,0x59,0x2d,0x6e,0x35,0xb1,0x63,0x49,0x9b,0xa7,0x8d,0xc7,0xff,0xce,0xc5,0x65,0xd0,0x4f,0x9a,0x7d,0xb7,0x81,0x94,0x3e,0x29,0xe6,0xce,0x76,0x76,0x3e,0x9b,0xad,0xdf,0x57,0x43,0x7f,0xd9,0xc6,0xb0,0x32,0x39,0xa6,0xe6,0x85,0x0e,0x45,0x02,0xa3,0x56,0xc2,0xe1,0x2c,0x37,0x05,},\"\\x14\\x62\\x7d\\x6e\\xa0\\xe7\\x89\\x54\\x60\\x75\\x94\\x76\\xdc\\x74\\xc4\\x28\\x00\\xce\\xef\\x99\\x43\\x27\\x51\\x81\\x51\\x49\\x0d\\x9d\\xf2\\x30\\x67\\x91\\x4e\\x44\\x78\\x8a\\x12\\x76\\x8c\\xcb\\x25\\x47\\x1b\\x9c\\x3b\\xa9\\xd1\\x4f\\xb4\\x36\\xdc\\xba\\x38\\x42\\x9b\\x3a\\x04\\x56\\x87\\x77\\x63\\xc4\\x91\\x75\\xd0\\xe0\\x82\\x68\\x3e\\x07\\xa9\\x05\\x8f\\x36\\x85\\xc6\\x27\\x93\\x07\\xb2\\x30\\x3d\\x12\\x21\\xb9\\xc2\\x97\\x93\\xd8\\xa4\\x87\\x7f\\x6d\\xf5\\x15\\x87\\x38\\x4d\\xad\\xf7\\x51\\xc5\\xf7\\xbf\\xbd\\x20\\x7d\\x51\\x96\\x22\\xc3\\x7b\\x51\\xce\\xee\\xe2\\xc2\\x0d\\x82\\x69\\xf8\\xcb\\x88\\xd3\\xfe\\x43\\xd6\\xd4\\x34\\xd5\\xbb\\xd0\\xe2\\x03\\xc1\\x53\\x2d\\x97\\xba\\x55\\x21\\x47\\x22\\x74\\x96\\xc8\\x7f\\x67\\xb5\\x0b\\xb7\\x61\\x93\\xad\\xd0\\x14\\x4d\\xf1\\xc1\\x76\\x65\\x75\\x85\\x40\\x83\\x62\\xca\\x2e\\xd0\\x4a\\xd6\\x2a\\xcf\\x1c\\x25\\xe3\\x41\\xdf\\xd1\\x49\\x8d\\x85\\xb4\\xb1\\x34\\x9a\\x8b\\x0b\\x9b\\x02\\xc4\\x35\\x23\\xc5\\x58\\x53\\x41\\x9b\\xfe\\xd3\\x7d\\x5a\\x2c\\xdf\\x17\\xdf\\xbf\\x1a\\x3b\\xd7\\x75\\x9d\\x6a\\xe1\\x80\\xf9\\xd2\\x7d\\xcd\\x9a\\x89\\x33\\xe2\\x9a\\x7c\\x0a\\x30\\x77\\x1e\\xea\\x7c\\x2e\\x0f\\xa2\\x42\\x92\\x5d\\x23\\x36\\xdc\\xe5\\x85\\x62\\x90\\x57\\xd8\\x44\\x32\\x39\\x64\\xf6\\xd3\\xd1\\x1f\\xf0\\xb3\\xf8\\x29\\xa3\\xbe\\x8c\\x9f\\x04\\x68\\xa6\\x82\\x3d\\x8e\\x70\\xab\\x5a\\x2d\\xa2\\x1e\\x15\\xfa\\x8b\\x04\\x1a\\x29\\x81\\x22\\x22\\xe9\\xc3\\x0b\\x2b\\xd9\\xa1\\x2d\\x1f\\xde\\xe6\\xf8\\x78\\x76\\xe8\\xce\\x81\\x00\\x96\\x37\\xa8\\xbb\\x22\\x36\\x12\\x9a\\x47\\xca\\x74\\x28\\x9e\\xe4\\xaa\\xd4\\x29\\xff\\xe2\\x9f\\x47\\x43\\x02\\x41\\xca\\x8c\\xc3\\x84\\x8b\\x72\\x00\\xfd\\x6e\\x14\\x70\\x65\\x1a\\x9a\\x0a\\x6f\\x72\\xc9\\x03\\x3e\\x83\\x1d\\xf0\\x51\\x40\\x8a\\x62\\x60\\xf6\\x5c\\xba\\xf6\\xe0\\x12\\xb1\\x8e\"},\n{{0xa1,0x36,0xe0,0x09,0xd5,0x3e,0x5e,0xf5,0x9d,0x09,0x46,0xbc,0x17,0x56,0x63,0xa8,0x6b,0xc0,0xfc,0xd2,0x9e,0xad,0xd9,0x5c,0xfc,0x9d,0x26,0x60,0x37,0xb1,0xe4,0xfb,},{0x9c,0x18,0x06,0xec,0x04,0x54,0xf5,0x83,0x14,0xeb,0x83,0x97,0xd6,0x42,0x87,0xde,0xe3,0x86,0x64,0x0d,0x84,0x91,0xab,0xa3,0x64,0x60,0x76,0x88,0x84,0x17,0x15,0xa0,},{0xbc,0x09,0x4b,0xa9,0x1c,0x11,0x5d,0xee,0x15,0xd7,0x53,0x36,0x1a,0x75,0xf3,0xf0,0x3d,0x6a,0xf4,0x5c,0x92,0x15,0x7e,0x95,0xdb,0xe8,0xd3,0x21,0x94,0xb6,0xc5,0xce,0x72,0xb9,0xdc,0x66,0xf7,0x3d,0xf1,0x2d,0xca,0x0b,0x63,0x9f,0x3e,0x79,0x1d,0x47,0x86,0x16,0xa1,0xf8,0xd7,0x35,0x9a,0x42,0xc8,0xea,0xe0,0xdd,0xa1,0x6b,0x16,0x06,},\"\\xa4\\x9d\\x1c\\x3d\\x49\\xe1\\x3c\\x2e\\xda\\x56\\x86\\x8a\\x88\\x24\\xaa\\x9f\\x8d\\x2b\\xf7\\x2f\\x21\\x95\\x5e\\xba\\xfd\\x07\\xb3\\xbd\\xc8\\xe9\\x24\\xde\\x20\\x93\\x6c\\xee\\x51\\x3d\\x8a\\x64\\xa4\\x71\\x73\\xa3\\xbd\\x65\\x9e\\xff\\x1a\\xcc\\xff\\x82\\x44\\xb2\\x6a\\xae\\x1a\\x0c\\x27\\xfa\\x89\\x1b\\xf4\\xd8\\x5e\\x8f\\xb1\\xb7\\x6a\\x6c\\xab\\x1e\\x7f\\x74\\xc8\\x9e\\xe0\\x7b\\xb4\\x0d\\x71\\x43\\x26\\xf0\\x9b\\x3f\\xd4\\x06\\x32\\xfa\\xd2\\x08\\xea\\x81\\x6f\\x90\\x72\\x02\\x8c\\x14\\xb5\\xb5\\x4e\\xcc\\x1c\\x5b\\x7f\\xc8\\x09\\xe7\\xe0\\x78\\x6e\\x2f\\x11\\x49\\x5e\\x76\\x01\\x7e\\xb6\\x2a\\xa4\\x56\\x3f\\x3d\\x00\\xee\\x84\\x34\\x8d\\x98\\x38\\xcd\\x17\\x64\\x9f\\x69\\x29\\xa6\\xd2\\x06\\xf6\\x0e\\x6f\\xc8\\x2e\\x0c\\x34\\x64\\xb2\\x7e\\x0e\\x6a\\xbd\\x22\\xf4\\x46\\x9b\\xdf\\xd4\\xcb\\x54\\xf7\\x7e\\x32\\x9b\\x80\\xf7\\x1b\\xf4\\x21\\x29\\xec\\x13\\xc9\\xdf\\xe1\\x92\\xad\\xfa\\xa4\\x2e\\xe3\\xdd\\xee\\xda\\x38\\x58\\x16\\xfb\\xad\\x5f\\x41\\x19\\x38\\xc6\\x3b\\x56\\x0f\\x4e\\xcd\\x94\\x53\\x4b\\xe7\\xd9\\x87\\x25\\xcd\\x94\\xc9\\x9c\\xe4\\x92\\xf0\\xf0\\x69\\xba\\x0e\\xc0\\x8f\\x87\\x7a\\x78\\x12\\xef\\x27\\xae\\x19\\xd7\\xa7\\x7b\\xe6\\x3f\\x66\\xbc\\xf8\\xd6\\xcf\\x3a\\x1a\\x61\\xfc\\x9c\\xfe\\xf1\\x04\\xc7\\x46\\x2a\\x21\\xca\\x7f\\x03\\xaf\\xb5\\xbb\\x1a\\xc8\\xc7\\x51\\x24\\xb5\\x54\\xe8\\xd0\\x44\\xb8\\x10\\xd9\\x5f\\xf8\\xc9\\xdd\\x09\\xa3\\x44\\x84\\xd8\\xc4\\xb6\\xc9\\x5f\\x95\\xc3\\xc2\\x28\\x23\\xf5\\x2c\\xe8\\x44\\x29\\x37\\x24\\xd5\\x25\\x91\\x91\\xf1\\xba\\x09\\x29\\xe2\\xac\\xdb\\xb8\\xb9\\xa7\\xa8\\xad\\xf0\\xc5\\x2e\\x78\\xac\\xdf\\xdf\\x05\\x7b\\x09\\x85\\x88\\x1a\\xfb\\xed\\x4d\\xbe\\xbd\\xeb\\xbd\\xae\\x0a\\x2b\\x63\\xbd\\x4e\\x90\\xf9\\x6a\\xfd\\xcb\\xbd\\x78\\xf5\\x06\\x30\\x9f\\x9b\\xdb\\x65\\x00\\x13\\xcb\\x73\\xfa\\xed\\x73\\x90\\x4e\"},\n{{0xff,0x0f,0x1c,0x57,0xdd,0x88,0x4f,0xbe,0xea,0x6e,0x29,0x17,0x28,0x2b,0x79,0xba,0x67,0xf8,0xa6,0x85,0x12,0x67,0xb9,0xf4,0x63,0x6d,0xaf,0xda,0x33,0xbd,0x2b,0x5b,},{0xfe,0xf6,0x37,0x8a,0xd1,0x2a,0x7c,0x25,0x2f,0xa6,0xeb,0x74,0x2b,0x05,0x06,0x4b,0x41,0x53,0x0f,0xf0,0x19,0xdc,0x68,0x0a,0xb5,0x44,0xc0,0x27,0xea,0x28,0x36,0xe7,},{0xd5,0x00,0x84,0x86,0x72,0x6c,0xce,0x33,0x0a,0x29,0xdd,0x7e,0x4d,0x74,0x74,0xd7,0x35,0x79,0x82,0x01,0xaf,0xd1,0x20,0x6f,0xeb,0x86,0x9a,0x11,0x2e,0x5b,0x43,0x52,0x3c,0x06,0x97,0x67,0x61,0xbe,0x3c,0xf9,0xb2,0x71,0x63,0x78,0x27,0x3c,0x94,0xf9,0x35,0x72,0xa7,0xd2,0xb8,0x98,0x26,0x34,0xe0,0x75,0x5c,0x63,0x2b,0x44,0x90,0x08,},\"\\x52\\x2a\\x5e\\x5e\\xff\\x5b\\x5e\\x98\\xfa\\xd6\\x87\\x8a\\x9d\\x72\\xdf\\x6e\\xb3\\x18\\x62\\x26\\x10\\xa1\\xe1\\xa4\\x81\\x83\\xf5\\x59\\x0e\\xce\\xf5\\xa6\\xdf\\x67\\x1b\\x28\\xbe\\x91\\xc8\\x8c\\xdf\\x7a\\xe2\\x88\\x11\\x47\\xfe\\x6c\\x37\\xc2\\x8b\\x43\\xf6\\x4c\\xf9\\x81\\xc4\\x55\\xc5\\x9e\\x76\\x5c\\xe9\\x4e\\x1b\\x64\\x91\\x63\\x1d\\xea\\xee\\xf6\\xd1\\xda\\x9e\\xbc\\xa8\\x86\\x43\\xc7\\x7f\\x83\\xea\\xe2\\xcf\\xdd\\x2d\\x97\\xf6\\x04\\xfe\\x45\\x08\\x1d\\x1b\\xe5\\xc4\\xae\\x2d\\x87\\x59\\x96\\xb8\\xb6\\xfe\\xcd\\x70\\x7d\\x3f\\xa2\\x19\\xa9\\x3b\\xa0\\x48\\x8e\\x55\\x24\\x7b\\x40\\x5e\\x33\\x0c\\xfb\\x97\\xd3\\x1a\\x13\\x61\\xc9\\xb2\\x08\\x4b\\xdb\\x13\\xfb\\x0c\\x05\\x89\\x25\\xdb\\x8c\\x3c\\x64\\x9c\\x9a\\x3e\\x93\\x7b\\x53\\x3c\\xc6\\x31\\x0f\\xa3\\xb1\\x61\\x26\\xfb\\x3c\\xc9\\xbb\\x2b\\x35\\xc5\\xc8\\x30\\x00\\x15\\x48\\x8a\\x30\\xfa\\xdc\\xa3\\xc8\\x87\\x1f\\xa7\\x0d\\xfd\\xc7\\x05\\x5b\\xf8\\xe6\\x31\\xf2\\x0c\\x9b\\x25\\x28\\x31\\x1e\\x32\\x4a\\x7c\\x4e\\xdd\\x54\\x62\\x07\\x9f\\x34\\x41\\xc9\\xec\\xf5\\x5f\\xa9\\x99\\xe7\\x31\\x37\\x23\\x44\\xfd\\xc0\\xd4\\x13\\xe4\\x17\\xaa\\xa0\\x01\\xa1\\xb2\\xd3\\xd9\\xbc\\x00\\x0f\\xec\\x1b\\x02\\xbd\\x7a\\x88\\xa8\\x12\\xd9\\xd8\\xa6\\x6f\\x94\\x64\\x76\\x4c\\x07\\x0c\\x93\\x04\\x1e\\xef\\xb1\\x7c\\xe7\\x4e\\xff\\x6d\\x4a\\xff\\x75\\xf0\\xcb\\xf6\\xa7\\x89\\xa9\\xec\\xde\\x74\\xab\\xe3\\x31\\x30\\xfc\\xa0\\xda\\x85\\x3a\\xa7\\xc3\\x31\\x3a\\xda\\x3f\\x0a\\xe2\\xf5\\x95\\xc6\\x79\\x6a\\x93\\x68\\x5e\\x72\\x9d\\xd1\\x8a\\x66\\x9d\\x63\\x81\\x82\\x5a\\xb3\\xf3\\x6a\\x39\\x1e\\x75\\x25\\xb2\\xa8\\x07\\xa5\\x2f\\xa5\\xec\\x2a\\x03\\x0a\\x8c\\xf3\\xb7\\x73\\x37\\xac\\x41\\xfc\\xeb\\x58\\x0e\\x84\\x5e\\xed\\x65\\x5a\\x48\\xb5\\x47\\x23\\x8c\\x2e\\x81\\x37\\xc9\\x2f\\x8c\\x27\\xe5\\x85\\xca\\xad\\x31\\x06\\xee\\xe3\\x81\\x4a\"},\n{{0x0b,0xc6,0xaf,0x64,0xde,0x57,0x09,0xd3,0xdb,0xc2,0x8f,0x7e,0xf6,0xd3,0xfe,0x28,0xb6,0xde,0x52,0x9f,0x08,0xf5,0x85,0x7c,0xcb,0x91,0x06,0x95,0xde,0x45,0x4f,0x56,},{0xfb,0x49,0x1f,0xc9,0x00,0x23,0x7b,0xdc,0x7e,0x9a,0x11,0x9f,0x27,0x15,0x0c,0xd9,0x11,0x93,0x5c,0xd3,0x62,0x87,0x49,0xff,0x40,0xef,0x41,0xf3,0x95,0x5b,0xc8,0xac,},{0xdb,0xc7,0x13,0x4d,0x1c,0xd6,0xb0,0x81,0x3b,0x53,0x35,0x27,0x14,0xb6,0xdf,0x93,0x94,0x98,0xe9,0x1c,0xf3,0x7c,0x32,0x43,0x37,0xd9,0xc0,0x88,0xa1,0xb9,0x98,0x34,0x7d,0x26,0x18,0x5b,0x43,0x09,0x00,0x41,0x29,0x29,0xe4,0xf6,0x3e,0x91,0x03,0x79,0xfc,0x42,0xe3,0x55,0xa4,0xe9,0x8f,0x6f,0xee,0x27,0xda,0xfa,0xd1,0x95,0x72,0x06,},\"\\xac\\x78\\x86\\xe4\\xf4\\x17\\x2a\\x22\\xc9\\x5e\\x8e\\xea\\x37\\x43\\x7b\\x37\\x5d\\x72\\xac\\xce\\xdc\\xee\\x6c\\xc6\\xe8\\x16\\x76\\x33\\x01\\xa2\\xd8\\xef\\x4d\\x6f\\x31\\xa2\\xc1\\xd6\\x35\\x81\\x8b\\x70\\x26\\xa3\\x95\\xce\\x0d\\xaf\\xd7\\x1c\\x51\\x80\\x89\\x3a\\xf7\\x6b\\x7e\\xa0\\x56\\xc9\\x72\\xd6\\x80\\xec\\xa0\\x1d\\xcb\\xdb\\xae\\x6b\\x26\\xf1\\xc5\\xf3\\x3f\\xc9\\x88\\xb8\\x24\\xfb\\xbe\\x00\\xca\\xcc\\x31\\x64\\x69\\xa3\\xba\\xe0\\x7a\\xa7\\xc8\\x88\\x5a\\xf7\\xf6\\x5f\\x42\\xe7\\x5c\\xef\\x94\\xdb\\xb9\\xaa\\xb4\\x82\\x51\\x43\\xc8\\x50\\x70\\xe7\\x71\\x6b\\x76\\x12\\xf6\\x4e\\xf0\\xb0\\x16\\x60\\x11\\xd2\\x3e\\xb5\\x65\\x4a\\xa0\\x98\\xb0\\x2d\\x8d\\x71\\xe5\\x7c\\x8f\\xa1\\x7b\\xff\\x2f\\xe9\\x7d\\xc8\\x19\\x31\\x77\\xea\\xdc\\x09\\xfb\\x19\\x2d\\x80\\xaa\\x92\\xaf\\xa9\\x87\\x20\\xd4\\x61\\x48\\x17\\xff\\x3c\\x39\\xd3\\xac\\xce\\x18\\x90\\x6f\\xa3\\xde\\x09\\x61\\x89\\x31\\xd0\\xd7\\xa6\\x0c\\x44\\x29\\xcb\\xfa\\x20\\xcf\\x16\\x5c\\x94\\x79\\x29\\xac\\x29\\x3a\\xe6\\xc0\\x6e\\x7e\\x8f\\x25\\xf1\\x26\\x42\\x91\\xe3\\xe1\\xc9\\x8f\\x5d\\x93\\xe6\\xec\\xc2\\x38\\x9b\\xc6\\x0d\\xbb\\xf4\\xa6\\x21\\xb1\\x32\\xc5\\x52\\xa9\\x9c\\x95\\xd2\\x6d\\x8d\\x1a\\xf6\\x11\\x38\\xb5\\x70\\xa0\\xde\\x4b\\x49\\x7e\\xbe\\x80\\x51\\xc7\\x27\\x3a\\x98\\xe6\\xe7\\x87\\x6d\\x0b\\x32\\x75\\x03\\xaf\\x3c\\xb2\\xcc\\x40\\x91\\xce\\x19\\x25\\xcb\\x2f\\x29\\x57\\xf4\\xec\\x56\\xee\\x90\\xf8\\xa0\\x9d\\xd5\\x7d\\x6e\\x83\\x06\\x7a\\x35\\x6a\\x4c\\xfe\\x65\\xb1\\xb7\\xa4\\x46\\x5d\\xa2\\xab\\x13\\x3b\\x0e\\xfb\\x5e\\x7d\\x4d\\xbb\\x81\\x1b\\xcb\\xbd\\xe7\\x12\\xaf\\xbf\\x0f\\x7d\\xd3\\xf3\\x26\\x22\\x22\\x84\\xb8\\xc7\\x4e\\xac\\x7a\\xd6\\x25\\x7f\\xa8\\xc6\\x32\\xb7\\xda\\x25\\x59\\xa6\\x26\\x6e\\x91\\xe0\\xef\\x90\\xdb\\xb0\\xaa\\x96\\x8f\\x75\\x37\\x6b\\x69\\x3f\\xca\\xa5\\xda\\x34\\x22\\x21\"},\n{{0x2f,0x5e,0x83,0xbd,0x5b,0x41,0x2e,0x71,0xae,0x3e,0x90,0x84,0xcd,0x36,0x9e,0xfc,0xc7,0x9b,0xf6,0x03,0x7c,0x4b,0x17,0x4d,0xfd,0x6a,0x11,0xfb,0x0f,0x5d,0xa2,0x18,},{0xa2,0x2a,0x6d,0xa2,0x9a,0x5e,0xf6,0x24,0x0c,0x49,0xd8,0x89,0x6e,0x3a,0x0f,0x1a,0x42,0x81,0xa2,0x66,0xc7,0x7d,0x38,0x3e,0xe6,0xf9,0xd2,0x5f,0xfa,0xcb,0xb8,0x72,},{0x9f,0x80,0x92,0x2b,0xc8,0xdb,0x32,0xd0,0xcc,0x43,0xf9,0x93,0x6a,0xff,0xeb,0xe7,0xb2,0xbc,0x35,0xa5,0xd8,0x22,0x77,0xcd,0x18,0x7b,0x5d,0x50,0xdc,0x7f,0xc4,0xc4,0x83,0x2f,0xff,0xa3,0x4e,0x95,0x43,0x80,0x6b,0x48,0x5c,0x04,0x54,0x8e,0x7c,0x75,0x42,0x94,0x25,0xe1,0x4d,0x55,0xd9,0x1f,0xc1,0x05,0x2e,0xfd,0x86,0x67,0x43,0x0b,},\"\\xb7\\x66\\x27\\x3f\\x06\\x0e\\xf3\\xb2\\xae\\x33\\x40\\x45\\x4a\\x39\\x1b\\x42\\x6b\\xc2\\xe9\\x72\\x64\\xf8\\x67\\x45\\x53\\xeb\\x00\\xdd\\x6e\\xcf\\xdd\\x59\\xb6\\x11\\xd8\\xd6\\x62\\x92\\x9f\\xec\\x71\\x0d\\x0e\\x46\\x20\\x20\\xe1\\x2c\\xdb\\xf9\\xc1\\xec\\x88\\x58\\xe8\\x56\\x71\\xac\\xf8\\xb7\\xb1\\x44\\x24\\xce\\x92\\x07\\x9d\\x7d\\x80\\x1e\\x2a\\xd9\\xac\\xac\\x03\\x6b\\xc8\\xd2\\xdf\\xaa\\x72\\xaa\\x83\\x9b\\xff\\x30\\xc0\\xaa\\x7e\\x41\\x4a\\x88\\x2c\\x00\\xb6\\x45\\xff\\x9d\\x31\\xbc\\xf5\\xa5\\x43\\x82\\xde\\xf4\\xd0\\x14\\x2e\\xfa\\x4f\\x06\\xe8\\x23\\x25\\x7f\\xf1\\x32\\xee\\x96\\x8c\\xdc\\x67\\x38\\xc5\\x3f\\x53\\xb8\\x4c\\x8d\\xf7\\x6e\\x9f\\x78\\xdd\\x50\\x56\\xcf\\x3d\\x4d\\x5a\\x80\\xa8\\xf8\\x4e\\x3e\\xde\\xc4\\x85\\x20\\xf2\\xcb\\x45\\x83\\xe7\\x08\\x53\\x93\\x55\\xef\\x7a\\xa8\\x6f\\xb5\\xa0\\xe8\\x7a\\x94\\xdc\\xf1\\x4f\\x30\\xa2\\xcc\\xa5\\x68\\xf1\\x39\\xd9\\xce\\x59\\xea\\xf4\\x59\\xa5\\xc5\\x91\\x6c\\xc8\\xf2\\x0b\\x26\\xaa\\xf6\\xc7\\xc0\\x29\\x37\\x9a\\xed\\xb0\\x5a\\x07\\xfe\\x58\\x5c\\xca\\xc6\\x03\\x07\\xc1\\xf5\\x8c\\xa9\\xf8\\x59\\x15\\x7d\\x06\\xd0\\x6b\\xaa\\x39\\x4a\\xac\\xe7\\x9d\\x51\\xb8\\xcb\\x38\\xcf\\xa2\\x59\\x81\\x41\\xe2\\x45\\x62\\x4e\\x5a\\xb9\\xb9\\xd6\\x87\\x31\\x17\\x33\\x48\\x90\\x53\\x15\\xbf\\x1a\\x5a\\xd6\\x1d\\x1e\\x8a\\xda\\xeb\\x81\\x0e\\x4e\\x8a\\x86\\xd7\\xc1\\x35\\x37\\xb0\\xbe\\x86\\x0a\\xb2\\xed\\x35\\xb7\\x33\\x99\\xb8\\x80\\x8a\\xa9\\x1d\\x75\\x0f\\x77\\x94\\x3f\\x8a\\x8b\\x7e\\x89\\xfd\\xb5\\x07\\x28\\xaa\\x3d\\xbb\\xd8\\xa4\\x1a\\x6e\\x00\\x75\\x6f\\x43\\x8c\\x9b\\x9e\\x9d\\x55\\x87\\x2d\\xf5\\xa9\\x06\\x8a\\xdd\\x8a\\x97\\x2b\\x7e\\x43\\xed\\xad\\x9c\\xed\\x22\\x37\\xca\\x13\\x67\\xbe\\x4b\\x7c\\xdb\\x66\\xa5\\x4e\\xa1\\x2e\\xef\\x12\\x94\\x71\\x15\\x86\\x10\\xea\\xf2\\x8f\\x99\\xf7\\xf6\\x86\\x55\\x7d\\xcd\\xf6\\x44\\xea\"},\n{{0x72,0x2a,0x2d,0xa5,0x0e,0x42,0xc1,0x1a,0x61,0xc9,0xaf,0xac,0x7b,0xe1,0xa2,0xfe,0xd2,0x26,0x7d,0x65,0x0f,0x8f,0x7d,0x8e,0x5b,0xc7,0x06,0xb8,0x07,0xc1,0xb9,0x1d,},{0xfd,0x0b,0x96,0x45,0x62,0xf8,0x23,0x72,0x1e,0x64,0x9c,0x3f,0xed,0xb4,0x32,0xa7,0x6f,0x91,0xe0,0xae,0xad,0x7c,0x61,0xd3,0x5f,0x95,0xed,0x77,0x26,0xd7,0x85,0x89,},{0xc2,0x69,0x5a,0x57,0x17,0x2a,0xaa,0x31,0xbd,0x08,0x90,0xf2,0x31,0xca,0x8e,0xee,0xc0,0x28,0x7a,0x87,0x17,0x26,0x69,0xa8,0x99,0xad,0x08,0x91,0xce,0xa4,0xc4,0x75,0x79,0xb5,0x04,0x20,0xe7,0x91,0xcd,0xec,0x8c,0x18,0x2c,0x8a,0x0e,0x8d,0xde,0x21,0xb2,0x48,0x0b,0x0c,0xfd,0x81,0x11,0xe2,0x8e,0x56,0x03,0x34,0x7a,0x35,0x2d,0x04,},\"\\x17\\x3e\\x8b\\xb8\\x85\\xe1\\xf9\\x08\\x14\\x04\\xac\\xac\\x99\\x90\\x41\\xd2\\xec\\xfc\\xb7\\x3f\\x94\\x5e\\x0d\\xb3\\x6e\\x63\\x1d\\x7c\\xd1\\xab\\x99\\x9e\\xb7\\x17\\xf3\\x4b\\xf0\\x78\\x74\\xbf\\x3d\\x34\\xe2\\x53\\x0e\\xb6\\x08\\x5f\\x4a\\x9f\\x88\\xae\\x1b\\x0f\\x7d\\x80\\xf2\\x21\\x45\\x6a\\x8e\\x9a\\x88\\x90\\xb9\\x1a\\x50\\x19\\x2d\\xea\\xaa\\xcc\\x0a\\x1a\\x61\\x5a\\x87\\x84\\x1e\\x2c\\x5a\\x9e\\x05\\x79\\x57\\xaf\\x6e\\x48\\xe7\\x8c\\xc8\\x61\\x98\\xe3\\x2e\\x7a\\xa2\\x4d\\xcf\\x6c\\xff\\xa3\\x29\\xbc\\x72\\x60\\x6d\\x65\\xb1\\x16\\x82\\xc8\\xba\\x73\\x6c\\xce\\x22\\xa0\\x57\\x85\\xdf\\x11\\x46\\x33\\x1e\\x41\\x60\\x9c\\xf9\\xca\\x71\\x1c\\xf4\\x64\\x95\\x82\\x97\\x13\\x8b\\x58\\xa9\\x07\\x3f\\x3b\\xbf\\x06\\xad\\x8a\\x85\\xd1\\x35\\xde\\x66\\x65\\x21\\x04\\xd8\\x8b\\x49\\xd2\\x7a\\xd4\\x1e\\x59\\xbc\\xc4\\x4c\\x7f\\xab\\x68\\xf5\\x3f\\x05\\x02\\xe2\\x93\\xff\\xca\\xba\\xaf\\x75\\x59\\x27\\xdf\\xdf\\xfb\\xfd\\xe3\\xb3\\x5c\\x08\\x0b\\x5d\\xe4\\xc8\\xb7\\x85\\xf4\\xda\\x64\\xef\\x35\\x7b\\xc0\\xd1\\x46\\x6a\\x6a\\x96\\x56\\x0c\\x3c\\x4f\\x3e\\x3c\\x0b\\x56\\x3a\\x00\\x3f\\x5f\\x95\\xf2\\x37\\x17\\x1b\\xce\\x1a\\x00\\x17\\x71\\xa0\\x4e\\xde\\x7c\\xdd\\x9b\\x8c\\xa7\\x70\\xfd\\x36\\xef\\x90\\xe9\\xfe\\x00\\x00\\xa8\\xd7\\x68\\x5f\\xd1\\x53\\xcc\\x72\\x82\\xde\\x95\\x92\\x0a\\x8f\\x8f\\x08\\x98\\xd0\\x0b\\xf0\\xc6\\xc9\\x33\\xfe\\x5b\\xb9\\x65\\x3f\\xf1\\x46\\xc4\\xe2\\xac\\xd1\\xa2\\xe0\\xc2\\x3c\\x12\\x44\\x84\\x4d\\xac\\xf8\\x65\\x27\\x16\\x30\\x2c\\x20\\x32\\xf9\\xc1\\x14\\x67\\x9e\\xd2\\x6b\\x3e\\xe3\\xab\\x4a\\x7b\\x18\\xbc\\x4e\\x30\\x71\\xf0\\x97\\x7d\\xb5\\x7c\\xd0\\xac\\x68\\xc0\\x72\\x7a\\x09\\xb4\\xf1\\x25\\xfb\\x64\\xaf\\x28\\x50\\xb2\\x6c\\x8a\\x48\\x42\\x63\\x33\\x4e\\x2d\\xa9\\x02\\xd7\\x44\\x73\\x70\\x44\\xe7\\x9a\\xb1\\xcf\\x5b\\x2f\\x93\\xa0\\x22\\xb6\\x3d\\x40\\xcd\"},\n{{0x5f,0xe9,0xc3,0x96,0x0e,0xd5,0xbd,0x37,0x4c,0xc9,0x4d,0x42,0x35,0x7e,0x6a,0x24,0xdc,0x7e,0x30,0x60,0x78,0x8f,0x72,0x63,0x65,0xde,0xfa,0xcf,0x13,0xcd,0x12,0xda,},{0x0c,0xe7,0xb1,0x55,0xc8,0xb2,0x0e,0xbd,0xaa,0xcd,0xc2,0xaa,0x23,0x62,0x7e,0x34,0xb1,0xf9,0xac,0xe9,0x80,0x65,0x0a,0x25,0x30,0xc7,0x60,0x7d,0x04,0x81,0x4e,0xb4,},{0x37,0x9f,0x9c,0x54,0xc4,0x13,0xaf,0x0d,0x19,0x2e,0x9b,0xc7,0x36,0xb2,0x9d,0xa9,0xd5,0x21,0xe7,0xba,0x78,0x41,0xd3,0x09,0xf9,0xbc,0xc1,0xe7,0x42,0xec,0x43,0x08,0xfe,0x9f,0x7b,0xa5,0x1e,0x0b,0x22,0xae,0xd4,0x87,0xcb,0x4a,0xa3,0x91,0x3b,0x9b,0xeb,0xfb,0x3a,0xac,0xd3,0x8f,0x40,0x39,0xf9,0xbb,0xbe,0xbe,0x1a,0xd8,0x00,0x02,},\"\\xc9\\x49\\x0d\\x83\\xd9\\xc3\\xa9\\x37\\x0f\\x06\\xc9\\x1a\\xf0\\x01\\x68\\x5a\\x02\\xfe\\x49\\xb5\\xca\\x66\\x77\\x33\\xff\\xf1\\x89\\xee\\xe8\\x53\\xec\\x16\\x67\\xa6\\xc1\\xb6\\xc7\\x87\\xe9\\x24\\x48\\x12\\xd2\\xd5\\x32\\x86\\x6a\\xb7\\x4d\\xfc\\x87\\x0d\\x6f\\x14\\x03\\x3b\\x6b\\xcd\\x39\\x85\\x2a\\x39\\x00\\xf8\\xf0\\x8c\\xd9\\x5a\\x74\\xcb\\x8c\\xbe\\x02\\xb8\\xb8\\xb5\\x1e\\x99\\x3a\\x06\\xad\\xfe\\xbd\\x7f\\xc9\\x85\\x4a\\xe5\\xd2\\x9f\\x4d\\xf9\\x64\\x28\\x71\\xd0\\xc5\\xe4\\x70\\xd9\\x03\\xcf\\xbc\\xbd\\x5a\\xdb\\x32\\x75\\x62\\x8f\\x28\\xa8\\x0b\\xf8\\xc0\\xf0\\x37\\x66\\x87\\xda\\xe6\\x73\\xbf\\x7a\\x85\\x47\\xe8\\x0d\\x4a\\x98\\x55\\xae\\x25\\x72\\xfc\\x2b\\x20\\x5d\\xc8\\xa1\\x98\\x01\\x6d\\xdc\\x9b\\x50\\x99\\x5f\\x5b\\x39\\xf3\\x68\\xf5\\x40\\x50\\x4a\\x55\\x18\\x03\\xd6\\xdd\\x5f\\x87\\x48\\x28\\xe5\\x54\\x1d\\xed\\x05\\x28\\x94\\xd9\\xe2\\xdc\\x5e\\x6a\\xa3\\x51\\x08\\x7e\\x79\\x0c\\x0d\\xd5\\xd9\\xc4\\xde\\xcb\\x21\\x7e\\x4d\\xb8\\x1c\\x98\\xa1\\x84\\xb2\\x64\\xe6\\xda\\xea\\xc0\\xf1\\x1e\\x07\\x4c\\xae\\x2b\\xfc\\x89\\x9f\\x54\\xb4\\x19\\xc6\\x5d\\xcc\\x22\\x66\\x4a\\x91\\x5f\\xbf\\xff\\xac\\x35\\xce\\xe0\\xf2\\x86\\xeb\\x7b\\x14\\x49\\x33\\xdb\\x93\\x3e\\x16\\xc4\\xbc\\xb6\\x50\\xd5\\x37\\x72\\x24\\x89\\xde\\x23\\x63\\x73\\xfd\\x8d\\x65\\xfc\\x86\\x11\\x8b\\x6d\\xef\\x37\\xca\\x46\\x08\\xbc\\x6c\\xe9\\x27\\xb6\\x54\\x36\\xff\\xda\\x7f\\x02\\xbf\\xbf\\x88\\xb0\\x45\\xae\\x7d\\x2c\\x2b\\x45\\xa0\\xb3\\x0c\\x8f\\x2a\\x04\\xdf\\x95\\x32\\x21\\x08\\x8c\\x55\\x5f\\xe9\\xa5\\xdf\\x26\\x09\\x82\\xa3\\xd6\\x4d\\xf1\\x94\\xee\\x95\\x2f\\xa9\\xa9\\x8c\\x31\\xb9\\x64\\x93\\xdb\\x61\\x80\\xd1\\x3d\\x67\\xc3\\x67\\x16\\xf9\\x5f\\x8c\\x0b\\xd7\\xa0\\x39\\xad\\x99\\x06\\x67\\xca\\x34\\xa8\\x3a\\xc1\\xa1\\x8c\\x37\\xdd\\x7c\\x77\\x36\\xaa\\x6b\\x9b\\x6f\\xc2\\xb1\\xac\\x0c\\xe1\\x19\\xef\\x77\"},\n{{0xec,0x2f,0xa5,0x41,0xac,0x14,0xb4,0x14,0x14,0x9c,0x38,0x25,0xea,0xa7,0x00,0x1b,0x79,0x5a,0xa1,0x95,0x7d,0x40,0x40,0xdd,0xa9,0x25,0x73,0x90,0x4a,0xfa,0x7e,0xe4,},{0x71,0xb3,0x63,0xb2,0x40,0x84,0x04,0xd7,0xbe,0xec,0xde,0xf1,0xe1,0xf5,0x11,0xbb,0x60,0x84,0x65,0x8b,0x53,0x2f,0x7e,0xa6,0x3d,0x4e,0x3f,0x5f,0x01,0xc6,0x1d,0x31,},{0x84,0xd1,0x8d,0x56,0xf9,0x64,0xe3,0x77,0x67,0x59,0xbb,0xa9,0x2c,0x51,0x0c,0x2b,0x6d,0x57,0x45,0x55,0xc3,0xcd,0xda,0xde,0x21,0x2d,0xa9,0x03,0x74,0x55,0x49,0x91,0xe7,0xd7,0x7e,0x27,0x8d,0x63,0xe3,0x46,0x93,0xe1,0x95,0x80,0x78,0xcc,0x36,0x85,0xf8,0xc4,0x1c,0x1f,0x53,0x42,0xe3,0x51,0x89,0x96,0x38,0xef,0x61,0x21,0x14,0x01,},\"\\x27\\x49\\xfc\\x7c\\x4a\\x72\\x9e\\x0e\\x0a\\xd7\\x1b\\x5b\\x74\\xeb\\x9f\\x9c\\x53\\x4e\\xbd\\x02\\xff\\xc9\\xdf\\x43\\x74\\xd8\\x13\\xbd\\xd1\\xae\\x4e\\xb8\\x7f\\x13\\x50\\xd5\\xfd\\xc5\\x63\\x93\\x45\\x15\\x77\\x17\\x63\\xe6\\xc3\\x3b\\x50\\xe6\\x4e\\x0c\\xd1\\x14\\x57\\x30\\x31\\xd2\\x18\\x6b\\x6e\\xca\\x4f\\xc8\\x02\\xcd\\xdc\\x7c\\xc5\\x1d\\x92\\xa6\\x13\\x45\\xa1\\x7f\\x6a\\xc3\\x8c\\xc7\\x4d\\x84\\x70\\x7a\\x51\\x56\\xbe\\x92\\x02\\xde\\xe3\\x44\\x46\\x52\\xe7\\x9b\\xae\\x7f\\x0d\\x31\\xbd\\x17\\x56\\x79\\x61\\xf6\\x5d\\xd0\\x1a\\x8e\\x4b\\xee\\x38\\x33\\x19\\x38\\xce\\x4b\\x2b\\x55\\x06\\x91\\xb9\\x9a\\x4b\\xc3\\xc0\\x72\\xd1\\x86\\xdf\\x4b\\x33\\x44\\xa5\\xc8\\xfb\\xfb\\xb9\\xfd\\x2f\\x35\\x5f\\x61\\x07\\xe4\\x10\\xc3\\xd0\\xc7\\x98\\xb6\\x8d\\x3f\\xb9\\xc6\\xf7\\xab\\x5f\\xe2\\x7e\\x70\\x87\\x1e\\x86\\x76\\x76\\x98\\xfe\\x35\\xb7\\x7e\\xad\\x4e\\x43\\x5a\\x94\\x02\\xcc\\x9e\\xd6\\xa2\\x65\\x7b\\x05\\x9b\\xe0\\xa2\\x10\\x03\\xc0\\x48\\xbb\\xf5\\xe0\\xeb\\xd9\\x3c\\xbb\\x2e\\x71\\xe9\\x23\\xcf\\x5c\\x72\\x8d\\x17\\x58\\xcd\\x81\\x7a\\xd7\\x4b\\x45\\x4a\\x88\\x71\\x26\\xd6\\x53\\xb9\\x5a\\x7f\\x25\\xe5\\x29\\x3b\\x76\\x8c\\x9f\\xc5\\xa9\\xc3\\x5a\\x23\\x72\\xe3\\x74\\x1b\\xc9\\x0f\\xd6\\x63\\x01\\x42\\x7b\\x10\\x82\\x4b\\xb4\\xb1\\xe9\\x11\\x0b\\xfb\\xa8\\x4c\\x21\\xa4\\x0e\\xb8\\xfe\\xd4\\x49\\x7e\\x91\\xdc\\x3f\\xfd\\x04\\x38\\xc5\\x14\\xc0\\xa8\\xcb\\x4c\\xac\\x6a\\xd0\\x25\\x6b\\xf1\\x1d\\x5a\\xa7\\xa9\\xc7\\xc0\\x0b\\x66\\x9b\\x01\\x5b\\x0b\\xf8\\x14\\x25\\xa2\\x14\\x13\\xe2\\xff\\xb6\\xed\\xc0\\xbd\\x78\\xe3\\x85\\xc4\\x4f\\xd7\\x45\\x58\\xe5\\x11\\xc2\\xc2\\x5f\\xee\\x1f\\xec\\x18\\xd3\\x99\\x0b\\x86\\x90\\x30\\x0f\\xa7\\x11\\xe9\\x3d\\x98\\x54\\x66\\x8f\\x01\\x87\\x06\\x5e\\x76\\xe7\\x11\\x3a\\xe7\\x63\\xc3\\x0d\\xdd\\x86\\x72\\x0b\\x55\\x46\\xa6\\xc3\\xc6\\xf1\\xc4\\x3b\\xc6\\x7b\\x14\"},\n{{0x61,0x32,0x69,0x2a,0x5e,0xf2,0x7b,0xf4,0x76,0xb1,0xe9,0x91,0xe6,0xc4,0x31,0xa8,0xc7,0x64,0xf1,0xae,0xbd,0x47,0x02,0x82,0xdb,0x33,0x21,0xbb,0x7c,0xb0,0x9c,0x20,},{0x7a,0x2d,0x16,0x61,0x84,0xf9,0xe5,0xf7,0x3b,0xea,0x45,0x44,0x86,0xb0,0x41,0xce,0xb5,0xfc,0x23,0x14,0xa7,0xbd,0x59,0xcb,0x71,0x8e,0x79,0xf0,0xec,0x98,0x9d,0x84,},{0xeb,0x67,0x7f,0x33,0x47,0xe1,0xa1,0xea,0x92,0x9e,0xfd,0xf6,0x2b,0xf9,0x10,0x5a,0x6c,0x8f,0x49,0x93,0x03,0x3b,0x4f,0x6d,0x03,0xcb,0x0d,0xbf,0x9c,0x74,0x2b,0x27,0x07,0x04,0xe3,0x83,0xab,0x7c,0x06,0x76,0xbd,0xb1,0xad,0x0c,0xe9,0xb1,0x66,0x73,0x08,0x3c,0x96,0x02,0xec,0x10,0xae,0x1d,0xd9,0x8e,0x87,0x48,0xb3,0x36,0x44,0x0b,},\"\\xa9\\xc0\\x86\\x16\\x65\\xd8\\xc2\\xde\\x06\\xf9\\x30\\x1d\\xa7\\x0a\\xfb\\x27\\xb3\\x02\\x4b\\x74\\x4c\\x6b\\x38\\xb2\\x42\\x59\\x29\\x4c\\x97\\xb1\\xd1\\xcb\\x4f\\x0d\\xcf\\x75\\x75\\xa8\\xed\\x45\\x4e\\x2f\\x09\\x80\\xf5\\x03\\x13\\xa7\\x73\\x63\\x41\\x51\\x83\\xfe\\x96\\x77\\xa9\\xeb\\x1e\\x06\\xcb\\x6d\\x34\\xa4\\x67\\xcb\\x7b\\x07\\x58\\xd6\\xf5\\x5c\\x56\\x4b\\x5b\\xa1\\x56\\x03\\xe2\\x02\\xb1\\x88\\x56\\xd8\\x9e\\x72\\xa2\\x3a\\xb0\\x7d\\x88\\x53\\xff\\x77\\xda\\x7a\\xff\\x1c\\xae\\xbd\\x79\\x59\\xf2\\xc7\\x10\\xef\\x31\\xf5\\x07\\x8a\\x9f\\x2c\\xda\\xe9\\x26\\x41\\xa1\\xcc\\x5f\\x74\\xd0\\xc1\\x43\\xec\\x42\\xaf\\xba\\xa5\\xf3\\x78\\xa9\\xe1\\x0d\\x5b\\xf7\\x45\\x87\\xfa\\x5f\\x49\\xc1\\x56\\x23\\x32\\x47\\xda\\xfd\\x39\\x29\\xac\\xde\\x88\\x8d\\xc6\\x84\\x33\\x7e\\x40\\xcd\\xc5\\x93\\x2e\\x7e\\xb7\\x3f\\xfc\\xc9\\x0b\\x85\\xc0\\xad\\x46\\x04\\x16\\x69\\x1a\\xef\\xbd\\x7e\\xfd\\x07\\xb6\\x57\\xc3\\x50\\x94\\x6a\\x0e\\x36\\x6b\\x37\\xa6\\xc8\\x08\\x9a\\xba\\x5c\\x5f\\xe3\\xbb\\xca\\x06\\x4a\\xfb\\xe9\\xd4\\x7f\\xbc\\x83\\x91\\x4a\\xf1\\xcb\\x43\\xc2\\xb2\\xef\\xa9\\x8e\\x0a\\x43\\xbe\\x32\\xba\\x82\\x32\\x02\\x00\\x1d\\xef\\x36\\x81\\x72\\x51\\xb6\\x5f\\x9b\\x05\\x06\\xce\\xf6\\x68\\x36\\x42\\xa4\\x6e\\xd6\\x12\\xf8\\xca\\x81\\xee\\x97\\xbb\\x04\\xd3\\x17\\xb5\\x17\\x34\\x3a\\xde\\x2b\\x77\\x12\\x6d\\x1f\\x02\\xa8\\x7b\\x76\\x04\\xc8\\x65\\x3b\\x67\\x48\\xcf\\x54\\x88\\xfa\\x6d\\x43\\xdf\\x80\\x9f\\xaa\\x19\\xe6\\x92\\x92\\xd3\\x8c\\x5d\\x39\\x7d\\xd8\\xe2\\x0c\\x7a\\xf7\\xc5\\x33\\x4e\\xc9\\x77\\xf5\\x01\\x0a\\x0f\\x7c\\xb5\\xb8\\x94\\x79\\xca\\x06\\xdb\\x4d\\x12\\x62\\x7f\\x06\\x7d\\x6c\\x42\\x18\\x6a\\x6b\\x1f\\x87\\x42\\xf3\\x6a\\xe7\\x09\\xba\\x72\\x0e\\x3c\\xd8\\x98\\x11\\x66\\x66\\xd8\\x1b\\x19\\x0b\\x9b\\x9d\\x2a\\x72\\x20\\x2c\\xb6\\x90\\xa0\\x3f\\x33\\x10\\x42\\x9a\\x71\\xdc\\x04\\x8c\\xde\"},\n{{0xf2,0x19,0xb2,0x10,0x11,0x64,0xaa,0x97,0x23,0xbd,0xe3,0xa7,0x34,0x6f,0x68,0xa3,0x50,0x61,0xc0,0x1f,0x97,0x82,0x07,0x25,0x80,0xba,0x32,0xdf,0x90,0x3b,0xa8,0x91,},{0xf6,0x6b,0x92,0x0d,0x5a,0xa1,0xa6,0x08,0x54,0x95,0xa1,0x48,0x05,0x39,0xbe,0xba,0x01,0xff,0xe6,0x0e,0x6a,0x63,0x88,0xd1,0xb2,0xe8,0xed,0xa2,0x33,0x55,0x81,0x0e,},{0x17,0xf0,0x12,0x7c,0xa3,0xba,0xfa,0x5f,0x4e,0xe9,0x59,0xcd,0x60,0xf7,0x72,0xbe,0x87,0xa0,0x03,0x49,0x61,0x51,0x7e,0x39,0xa0,0xa1,0xd0,0xf4,0xb9,0xe2,0x6d,0xb1,0x33,0x6e,0x60,0xc8,0x2b,0x35,0x2c,0x4c,0xba,0xcd,0xbb,0xd1,0x17,0x71,0xc3,0x77,0x4f,0x8c,0xc5,0xa1,0xa7,0x95,0xd6,0xe4,0xf4,0xeb,0xd5,0x1d,0xef,0x36,0x77,0x0b,},\"\\x01\\x55\\x77\\xd3\\xe4\\xa0\\xec\\x1a\\xb2\\x59\\x30\\x10\\x63\\x43\\xff\\x35\\xab\\x4f\\x1e\\x0a\\x8a\\x2d\\x84\\x4a\\xad\\xbb\\x70\\xe5\\xfc\\x53\\x48\\xcc\\xb6\\x79\\xc2\\x29\\x5c\\x51\\xd7\\x02\\xaa\\xae\\x7f\\x62\\x73\\xce\\x70\\x29\\x7b\\x26\\xcb\\x7a\\x25\\x3a\\x3d\\xb9\\x43\\x32\\xe8\\x6a\\x15\\xb4\\xa6\\x44\\x91\\x23\\x27\\x91\\xf7\\xa8\\xb0\\x82\\xee\\x28\\x34\\xaf\\x30\\x40\\x0e\\x80\\x46\\x47\\xa5\\x32\\xe9\\xc4\\x54\\xd2\\xa0\\xa7\\x32\\x01\\x30\\xab\\x6d\\x4d\\x86\\x00\\x73\\xa3\\x46\\x67\\xac\\x25\\xb7\\xe5\\xe2\\x74\\x7b\\xa9\\xf5\\xc9\\x45\\x94\\xfb\\x68\\x37\\x7a\\xe2\\x60\\x36\\x9c\\x40\\x71\\x3b\\x4e\\x32\\xf2\\x31\\x95\\xbf\\x91\\xd3\\xd7\\xf1\\xa2\\x71\\x9b\\xf4\\x08\\xaa\\xd8\\xd8\\xa3\\x47\\xb1\\x12\\xe8\\x4b\\x11\\x88\\x17\\xcb\\x06\\x51\\x33\\x44\\x02\\x17\\x63\\x03\\x52\\x72\\xa7\\xdb\\x72\\x8a\\x0c\\xcd\\xaa\\x94\\x9c\\x61\\x71\\x5d\\x07\\x64\\x14\\x0b\\x3e\\x8c\\x01\\xd2\\x0f\\xf1\\x59\\x3c\\x7f\\x2d\\x55\\xc4\\xe8\\x2a\\x1c\\x0c\\xb1\\xea\\x58\\x44\\x2b\\xf8\\x0a\\x74\\x1b\\xca\\x91\\xf5\\x8a\\xb0\\x58\\x1b\\x49\\x8e\\xe9\\xfe\\x3c\\x92\\xca\\x65\\x41\\x48\\xef\\x75\\x31\\x35\\x43\\xd1\\xaf\\xf3\\x82\\xbe\\xfe\\x1a\\x93\\xb0\\x21\\x90\\xce\\x01\\x02\\x17\\x51\\x58\\xe2\\x07\\x1d\\x02\\xba\\xca\\xd8\\xdb\\xe9\\xfb\\x94\\x0f\\xcb\\x61\\x0c\\x10\\x5a\\xd5\\x2c\\x80\\xfe\\xb1\\xec\\x4e\\x52\\x4f\\x4c\\x0e\\xc7\\x98\\x3e\\x9c\\xe6\\x96\\xfa\\x4f\\xcf\\x4b\\xf0\\x51\\x4b\\x8f\\x04\\x32\\xb1\\x7d\\x54\\x48\\xfc\\x42\\x6f\\xea\\x2b\\x01\\xac\\x7b\\x26\\xc2\\xae\\xd7\\x69\\x92\\x75\\x34\\xda\\x22\\x57\\x6f\\xc1\\xbb\\xa7\\x26\\xe9\\xd6\\x5b\\xe0\\x1b\\x59\\xf6\\x0a\\x64\\x8a\\xce\\x2f\\xc3\\xe5\\xe2\\x75\\x78\\x9f\\xa6\\x37\\xcb\\xbd\\x84\\xbe\\x3d\\x6a\\xc2\\x44\\x57\\xa6\\x29\\x2c\\xd6\\x56\\xc7\\xb5\\x69\\xa5\\x2f\\xfe\\xa7\\x91\\x6b\\x8d\\x04\\xb4\\xf4\\xa7\\x5b\\xe7\\xac\\x95\\x14\\x2f\"},\n{{0xfc,0x18,0x00,0x35,0xae,0xc0,0xf5,0xed,0xe7,0xbd,0xa9,0x3b,0xf7,0x7a,0xde,0x7a,0x81,0xed,0x06,0xde,0x07,0xee,0x2e,0x3a,0xa8,0x57,0x6b,0xe8,0x16,0x08,0x61,0x0a,},{0x4f,0x21,0x5e,0x94,0x8c,0xae,0x24,0x3e,0xe3,0x14,0x3b,0x80,0x28,0x2a,0xd7,0x92,0xc7,0x80,0xd2,0xa6,0xb7,0x50,0x60,0xca,0x1d,0x29,0x0c,0xa1,0xa8,0xe3,0x15,0x1f,},{0xa4,0x3a,0x71,0xc3,0xa1,0x9c,0x35,0x66,0x0d,0xae,0x6f,0x31,0xa2,0x54,0xb8,0xc0,0xea,0x35,0x93,0xfc,0x8f,0xca,0x74,0xd1,0x36,0x40,0x01,0x2b,0x9e,0x94,0x73,0xd4,0xaf,0xe0,0x70,0xdb,0x01,0xe7,0xfb,0x39,0x9b,0xf4,0xca,0x60,0x70,0xe0,0x62,0x18,0x00,0x11,0x28,0x5a,0x67,0xdd,0x68,0x58,0xb7,0x61,0xe4,0x6c,0x6b,0xd3,0x20,0x04,},\"\\xb5\\xe8\\xb0\\x16\\x25\\x66\\x4b\\x22\\x23\\x39\\xe0\\xf0\\x5f\\x93\\xa9\\x90\\xba\\x48\\xb5\\x6a\\xe6\\x54\\x39\\xa1\\x75\\x20\\x93\\x2d\\xf0\\x11\\x72\\x1e\\x28\\x4d\\xbe\\x36\\xf9\\x86\\x31\\xc0\\x66\\x51\\x00\\x98\\xa6\\x8d\\x7b\\x69\\x2a\\x38\\x63\\xe9\\x9d\\x58\\xdb\\x76\\xca\\x56\\x67\\xc8\\x04\\x3c\\xb1\\x0b\\xd7\\xab\\xba\\xf5\\x06\\x52\\x9f\\xbb\\x23\\xa5\\x16\\x6b\\xe0\\x38\\xaf\\xfd\\xb9\\xa2\\x34\\xc4\\xf4\\xfc\\xf4\\x3b\\xdd\\xd6\\xb8\\xd2\\xce\\x77\\x2d\\xd6\\x53\\xed\\x11\\x5c\\x09\\x5e\\x23\\x2b\\x26\\x9d\\xd4\\x88\\x8d\\x23\\x68\\xcb\\x1c\\x66\\xbe\\x29\\xdd\\x38\\x3f\\xca\\x67\\xf6\\x67\\x65\\xb2\\x96\\x56\\x4e\\x37\\x55\\x5f\\x0c\\x0e\\x48\\x45\\x04\\xc5\\x91\\xf0\\x06\\xea\\x85\\x33\\xa1\\x25\\x83\\xad\\x2e\\x48\\x31\\x8f\\xf6\\xf3\\x24\\xec\\xaf\\x80\\x4b\\x1b\\xae\\x04\\xaa\\x89\\x67\\x43\\xe6\\x7e\\xf6\\x1c\\xa3\\x83\\xd5\\x8e\\x42\\xac\\xfc\\x64\\x10\\xde\\x30\\x77\\x6e\\x3b\\xa2\\x62\\x37\\x3b\\x9e\\x14\\x41\\x94\\x39\\x55\\x10\\x1a\\x4e\\x76\\x82\\x31\\xad\\x9c\\x65\\x29\\xef\\xf6\\x11\\x8d\\xde\\x5d\\xf0\\x2f\\x94\\xb8\\xd6\\xdf\\x2d\\x99\\xf2\\x78\\x63\\xb5\\x17\\x24\\x3a\\x57\\x9e\\x7a\\xaf\\xf3\\x11\\xea\\x3a\\x02\\x82\\xe4\\x7c\\xa8\\x76\\xfa\\xbc\\x22\\x80\\xfc\\xe7\\xad\\xc9\\x84\\xdd\\x0b\\x30\\x88\\x5b\\x16\\x50\\xf1\\x47\\x1d\\xfc\\xb0\\x52\\x2d\\x49\\xfe\\xc7\\xd0\\x42\\xf3\\x2a\\x93\\xbc\\x36\\x8f\\x07\\x60\\x06\\xea\\x01\\xec\\x1c\\x74\\x12\\xbf\\x66\\xf6\\x2d\\xc8\\x8d\\xe2\\xc0\\xb7\\x47\\x01\\xa5\\x61\\x4e\\x85\\x5e\\x9f\\xa7\\x28\\xfb\\x1f\\x11\\x71\\x38\\x5f\\x96\\xaf\\xbd\\xe7\\x0d\\xea\\x02\\xe9\\xaa\\x94\\xdc\\x21\\x84\\x8c\\x26\\x30\\x2b\\x50\\xae\\x91\\xf9\\x69\\x3a\\x18\\x64\\xe4\\xe0\\x95\\xae\\x03\\xcd\\xc2\\x2a\\xd2\\x8a\\x0e\\xb7\\xdb\\x59\\x67\\x79\\x24\\x67\\x12\\xfa\\xb5\\xf5\\xda\\x32\\x7e\\xfe\\xc3\\xe7\\x96\\x12\\xde\\x0a\\x6c\\xca\\xa5\\x36\\x75\\x9b\\x8e\"},\n{{0xa2,0x83,0x6a,0x65,0x42,0x79,0x12,0x12,0x2d,0x25,0xdc,0xdf,0xc9,0x9d,0x70,0x46,0xfe,0x9b,0x53,0xd5,0xc1,0xbb,0x23,0x61,0x7f,0x11,0x89,0x0e,0x94,0xca,0x93,0xed,},{0x8c,0x12,0xbd,0xa2,0x14,0xc8,0xab,0xb2,0x28,0x6a,0xcf,0xfb,0xf8,0x11,0x24,0x25,0x04,0x0a,0xab,0x9f,0x4d,0x8b,0xb7,0x87,0x0b,0x98,0xda,0x01,0x59,0xe8,0x82,0xf1,},{0xe6,0xa9,0xa6,0xb4,0x36,0x55,0x9a,0x43,0x20,0xc4,0x5c,0x0c,0x2c,0x4a,0x2a,0xed,0xec,0xb9,0x0d,0x41,0x6d,0x52,0xc8,0x26,0x80,0xac,0x73,0x30,0xd0,0x62,0xae,0xbe,0xf3,0xe9,0xac,0x9f,0x2c,0x5f,0xfa,0x45,0x5c,0x9b,0xe1,0x13,0x01,0x3a,0x2b,0x28,0x2e,0x56,0x00,0xfd,0x30,0x64,0x35,0xad,0xa8,0x3b,0x1e,0x48,0xba,0x2a,0x36,0x05,},\"\\x81\\x3d\\x60\\x61\\xc5\\x6e\\xae\\x0f\\xf5\\x30\\x41\\xc0\\x24\\x4a\\xa5\\xe2\\x9e\\x13\\xec\\x0f\\x3f\\xb4\\x28\\xd4\\xbe\\xb8\\xa9\\x9e\\x04\\xbc\\xa8\\xc4\\x1b\\xdd\\xb0\\xdb\\x94\\x5f\\x48\\x7e\\xfe\\x38\\xf2\\xfc\\x14\\xa6\\x28\\xfa\\xfa\\x24\\x62\\xf8\\x60\\xe4\\xe3\\x42\\x50\\xeb\\x4e\\x93\\xf1\\x39\\xab\\x1b\\x74\\xa2\\x61\\x45\\x19\\xe4\\x1e\\xe2\\x40\\x3b\\xe4\\x27\\x93\\x0a\\xb8\\xbc\\x82\\xec\\x89\\xce\\xaf\\xb6\\x09\\x05\\xbd\\x4d\\xdb\\xbd\\x13\\xbd\\xb1\\x96\\x54\\x31\\x4f\\xc9\\x23\\x73\\x14\\x0b\\x96\\x2e\\x22\\x58\\xe0\\x38\\xd7\\x1b\\x9e\\xc6\\x6b\\x84\\xef\\x83\\x19\\xe0\\x35\\x51\\xcb\\x70\\x7e\\x74\\x7f\\x6c\\x40\\xad\\x47\\x6f\\xbe\\xfd\\xce\\x71\\xf3\\xa7\\xb6\\x7a\\x1a\\xf1\\x86\\x9b\\xc6\\x44\\x06\\x86\\xe7\\xe0\\x85\\x5e\\x4f\\x36\\x9d\\x1d\\x88\\xb8\\x09\\x9f\\xba\\x54\\x71\\x46\\x78\\x62\\x7b\\xba\\x1a\\xff\\x41\\xe7\\x70\\x7b\\xc9\\x7e\\xdd\\xf8\\x90\\xb0\\xc0\\x8d\\xce\\x3e\\x98\\x00\\xd2\\x4c\\x6f\\x61\\x09\\x2c\\xe2\\x8d\\x48\\x1b\\x5d\\xea\\x5c\\x09\\x6c\\x55\\xd7\\x2f\\x89\\x46\\x00\\x91\\x31\\xfb\\x96\\x8e\\x2b\\xc8\\xa0\\x54\\xd8\\x25\\xad\\xab\\x76\\x74\\x0d\\xcf\\x0d\\x75\\x8c\\x8b\\xf5\\x4f\\xf3\\x86\\x59\\xe7\\x1b\\x32\\xbf\\xe2\\xe6\\x15\\xaa\\xab\\xb0\\xf5\\x29\\x30\\x85\\x64\\x9c\\xf6\\x0b\\x98\\x47\\xbc\\x62\\x01\\x1c\\xe3\\x87\\x8a\\xf6\\x28\\x98\\x4a\\x58\\x40\\xa4\\xad\\x5d\\xae\\x37\\x02\\xdb\\x36\\x7d\\xa0\\xf8\\xa1\\x65\\xfe\\xd0\\x51\\x7e\\xb5\\xc4\\x42\\xb0\\x14\\x53\\x30\\x24\\x1b\\x97\\xee\\xca\\x73\\x3b\\xa6\\x68\\x8b\\x9c\\x12\\x9a\\x61\\xcd\\x12\\x36\\xaf\\xf0\\xe2\\x7b\\xcf\\x98\\xc2\\x8b\\x0f\\xbe\\xea\\x55\\xa3\\xd7\\xc7\\x19\\x3d\\x64\\x4b\\x27\\x49\\xf9\\x86\\xbd\\x46\\xaf\\x89\\x38\\xe8\\xfa\\xae\\xaf\\xbd\\x9c\\xec\\x36\\x12\\xab\\x00\\x5b\\xd7\\xc3\\xee\\xaf\\xe9\\xa3\\x12\\x79\\xca\\x61\\x02\\x56\\x06\\x66\\xba\\x16\\x13\\x6f\\xf1\\x45\\x2f\\x85\\x0a\\xdb\"},\n{{0xf0,0x51,0xaf,0x42,0x6d,0x0c,0x32,0x82,0xfa,0xfc,0x8b,0xf9,0x12,0xad,0xe1,0xc2,0x42,0x11,0xa9,0x5a,0xd2,0x00,0xe1,0xee,0xf5,0x49,0x32,0x0e,0x1c,0xb1,0xa2,0x52,},{0xfa,0x87,0x95,0x5e,0x0e,0xa1,0x3d,0xde,0x49,0xd8,0x3d,0xc2,0x2e,0x63,0xa2,0xbd,0xf1,0x07,0x67,0x25,0xc2,0xcc,0x7f,0x93,0xc7,0x65,0x11,0xf2,0x8e,0x79,0x44,0xf2,},{0xb8,0xf7,0x13,0x57,0x8a,0x64,0x46,0x67,0x19,0xac,0xeb,0x43,0x2f,0xce,0x30,0x2a,0x87,0xcf,0x06,0x6b,0xf3,0xe1,0x02,0xa3,0x50,0x61,0x69,0x21,0xa8,0x40,0x96,0x4b,0xfc,0x7e,0x68,0x5d,0x8f,0xd1,0x74,0x55,0xac,0x3e,0xb4,0x86,0x1e,0xdc,0xb8,0x97,0x9d,0x35,0xe3,0xa4,0xbd,0x82,0xa0,0x78,0xcd,0x70,0x77,0x21,0xd7,0x33,0x40,0x0e,},\"\\xb4\\x8d\\x9f\\x84\\x76\\x2b\\x3b\\xcc\\x66\\xe9\\x6d\\x76\\xa6\\x16\\xfa\\x8f\\xe8\\xe0\\x16\\x95\\x25\\x1f\\x47\\xcf\\xc1\\xb7\\xb1\\x7d\\x60\\xdc\\x9f\\x90\\xd5\\x76\\xef\\x64\\xee\\x7d\\x38\\x85\\x04\\xe2\\xc9\\x07\\x96\\x38\\x16\\x5a\\x88\\x96\\x96\\x47\\x1c\\x98\\x9a\\x87\\x6f\\x8f\\x13\\xb6\\x3b\\x58\\xd5\\x31\\xfe\\xa4\\xdd\\x12\\x29\\xfc\\x63\\x16\\x68\\xa0\\x47\\xbf\\xae\\x2d\\xa2\\x81\\xfe\\xae\\x1b\\x6d\\xe3\\xeb\\xe2\\x80\\xab\\xe0\\xa8\\x2e\\xe0\\x0f\\xbf\\xdc\\x22\\xce\\x2d\\x10\\xe0\\x6a\\x04\\x92\\xff\\x14\\x04\\xdf\\xc0\\x94\\xc4\\x0b\\x20\\x3b\\xf5\\x57\\x21\\xdd\\x78\\x7e\\xd4\\xe9\\x1d\\x55\\x17\\xaa\\xf5\\x8d\\x3b\\xdd\\x35\\xd4\\x4a\\x65\\xae\\x6b\\xa7\\x56\\x19\\xb3\\x39\\xb6\\x50\\x51\\x8c\\xef\\xcc\\x17\\x49\\x3d\\xe2\\x7a\\x3b\\x5d\\x41\\x78\\x8f\\x87\\xed\\xbd\\xe7\\x26\\x10\\xf1\\x81\\xbf\\x06\\xe2\\x08\\xe0\\xeb\\x7c\\xdf\\xe8\\x81\\xd9\\x1a\\x2d\\x6c\\xc7\\x7a\\xa1\\x9c\\x0f\\xcf\\x33\\x0f\\xed\\xb4\\x46\\x75\\xd8\\x00\\xeb\\x8c\\xff\\x95\\x05\\xd8\\x88\\x75\\x44\\xa5\\x03\\xcb\\xe3\\x73\\xc4\\x84\\x7b\\x19\\xe8\\xf3\\x99\\x57\\x26\\xef\\xd6\\x64\\x98\\x58\\x59\\x5c\\x57\\xcc\\xaf\\x0c\\xbc\\x9e\\xb2\\x5d\\xe8\\x3b\\xa0\\x46\\xbc\\x9f\\x18\\x38\\xac\\x7b\\x89\\x53\\xdd\\x81\\xb8\\x1a\\xc0\\xf6\\x8d\\x0e\\x93\\x38\\xcb\\x55\\x40\\x25\\x52\\xaf\\xb6\\xbc\\x16\\x94\\x93\\x51\\xb9\\x26\\xd1\\x51\\xa8\\x2e\\xfc\\x69\\x5e\\x8d\\x7d\\xa0\\xdd\\x55\\x09\\x93\\x66\\x78\\x97\\x18\\xcc\\xbf\\x36\\x03\\x0b\\xd2\\xc3\\xc1\\x09\\x39\\x9b\\xe2\\x6c\\xdb\\x8b\\x9e\\x2a\\x15\\x5f\\x3b\\x2c\\xb1\\xbf\\xa7\\x1a\\xb6\\x9a\\x23\\x62\\x5a\\x4a\\xc1\\x18\\xfe\\x91\\xcb\\x2c\\x19\\x78\\x8c\\xf5\\x2a\\x71\\xd7\\x30\\xd5\\x76\\xb4\\x21\\xd9\\x69\\x82\\xa5\\x1a\\x29\\x91\\xda\\xec\\x44\\x0c\\xda\\x7e\\x6c\\xc3\\x28\\x2b\\x83\\x12\\x71\\x42\\x78\\xb8\\x19\\xbf\\xe2\\x38\\x7e\\xb9\\x6a\\xa9\\x1d\\x40\\x17\\x30\\x34\\xf4\\x28\"},\n{{0xa1,0x03,0xe9,0x26,0x72,0xc6,0x5f,0x81,0xea,0x5d,0xa1,0xff,0xf1,0xa4,0x03,0x87,0x88,0x47,0x9e,0x94,0x1d,0x50,0x3a,0x75,0x6f,0x4a,0x75,0x52,0x01,0xa5,0x7c,0x1d,},{0xee,0x63,0xa5,0xb6,0x96,0x41,0x21,0x7a,0xcb,0xaf,0x33,0x39,0xda,0x82,0x9e,0xc0,0x71,0xb9,0x93,0x1e,0x59,0x87,0x15,0x35,0x14,0xd3,0x01,0x40,0x83,0x7a,0x7a,0xf4,},{0x2a,0xa2,0x03,0x5c,0x2c,0xe5,0xb5,0xe6,0xae,0x16,0x1e,0x16,0x8f,0x3a,0xd0,0xd6,0x59,0x2b,0xcf,0x2c,0x4a,0x04,0x9d,0x3e,0xd3,0x42,0xfc,0xeb,0x56,0xbe,0x9c,0x7c,0xb3,0x72,0x02,0x75,0x73,0xae,0x01,0x78,0xe8,0x87,0x8e,0xbe,0xfc,0xa7,0xb0,0x30,0x32,0x7b,0x8a,0xad,0x41,0x85,0x7d,0xe5,0x8c,0xb7,0x8e,0x1a,0x00,0xcb,0xac,0x05,},\"\\xb1\\x98\\x4e\\x9e\\xec\\x08\\x5d\\x52\\x4c\\x1e\\xb3\\xb9\\x5c\\x89\\xc8\\x4a\\xe0\\x85\\xbe\\x5d\\xc6\\x5c\\x32\\x6e\\x19\\x02\\x5e\\x12\\x10\\xa1\\xd5\\x0e\\xdb\\xbb\\xa5\\xd1\\x37\\x0c\\xf1\\x5d\\x68\\xd6\\x87\\xeb\\x11\\x32\\x33\\xe0\\xfb\\xa5\\x0f\\x94\\x33\\xc7\\xd3\\x58\\x77\\x39\\x50\\xc6\\x79\\x31\\xdb\\x82\\x96\\xbb\\xcb\\xec\\xec\\x88\\x8e\\x87\\xe7\\x1a\\x2f\\x75\\x79\\xfa\\xd2\\xfa\\x16\\x2b\\x85\\xfb\\x97\\x47\\x3c\\x45\\x6b\\x9a\\x5c\\xe2\\x95\\x66\\x76\\x96\\x9c\\x7b\\xf4\\xc4\\x56\\x79\\x08\\x5b\\x62\\xf2\\xc2\\x24\\xfc\\x7f\\x45\\x87\\x94\\x27\\x3f\\x6d\\x12\\xc5\\xf3\\xe0\\xd0\\x69\\x51\\x82\\x4d\\x1c\\xca\\x3e\\x2f\\x90\\x45\\x59\\xed\\x28\\xe2\\x86\\x8b\\x36\\x6d\\x79\\xd9\\x4d\\xc9\\x86\\x67\\xb9\\xb5\\x92\\x42\\x68\\xf3\\xe3\\x9b\\x12\\x91\\xe5\\xab\\xe4\\xa7\\x58\\xf7\\x70\\x19\\xda\\xcb\\xb2\\x2b\\xd8\\x19\\x6e\\x0a\\x83\\xa5\\x67\\x76\\x58\\x83\\x6e\\x96\\xca\\x56\\x35\\x05\\x5a\\x1e\\x63\\xd6\\x5d\\x03\\x6a\\x68\\xd8\\x7a\\xc2\\xfd\\x28\\x3f\\xdd\\xa3\\x90\\x31\\x99\\x09\\xc5\\xcc\\x76\\x80\\x36\\x88\\x48\\x87\\x3d\\x59\\x7f\\x29\\x8e\\x0c\\x61\\x72\\x30\\x80\\x30\\xff\\xd4\\x52\\xbb\\x13\\x63\\x61\\x7b\\x31\\x6e\\xd7\\xcd\\x94\\x9a\\x16\\x5d\\xc8\\xab\\xb5\\x3f\\x99\\x1a\\xef\\x3f\\x3e\\x95\\x02\\xc5\\xdf\\xe4\\x75\\x6b\\x7c\\x6b\\xfd\\xfe\\x89\\xf5\\xe0\\x0f\\xeb\\xdd\\x6a\\xfb\\x04\\x02\\x81\\x8f\\x11\\xcf\\x8d\\x1d\\x58\\x64\\xfe\\x9d\\xa1\\xb8\\x6e\\x39\\xaa\\x93\\x58\\x31\\x50\\x6c\\xf2\\x40\\x0e\\xa7\\xed\\x75\\xbd\\x95\\x33\\xb2\\x3e\\x20\\x2f\\xe8\\x75\\xd7\\xd9\\x63\\x8c\\x89\\xd1\\x1c\\xb2\\xd6\\xe6\\x02\\x1a\\xe6\\xbd\\x27\\xc7\\x75\\x48\\x10\\xd3\\x5c\\xd3\\xa6\\x14\\x94\\xf2\\x7b\\x16\\xfc\\x79\\x4e\\x2c\\xd2\\xf0\\xd3\\x45\\x3a\\xda\\x93\\x38\\x65\\xdb\\x78\\xc5\\x79\\x57\\x1f\\x8f\\xc5\\xc5\\xc6\\xbe\\x8e\\xaf\\xfc\\xe6\\xa8\\x52\\xe5\\xb3\\xb1\\xc5\\x24\\xc4\\x93\\x13\\xd4\\x27\\xab\\xcb\"},\n{{0xd4,0x7c,0x1b,0x4b,0x9e,0x50,0xcb,0xb7,0x1f,0xd0,0x7d,0x09,0x6d,0x91,0xd8,0x72,0x13,0xd4,0x4b,0x02,0x43,0x73,0x04,0x47,0x61,0xc4,0x82,0x2f,0x9d,0x9d,0xf8,0x80,},{0xf4,0xe1,0xcb,0x86,0xc8,0xca,0x2c,0xfe,0xe4,0x3e,0x58,0x59,0x4a,0x87,0x78,0x43,0x6d,0x3e,0xa5,0x19,0x70,0x4e,0x00,0xc1,0xbb,0xe4,0x8b,0xbb,0x1c,0x94,0x54,0xf8,},{0x62,0x7e,0x7c,0xa7,0xe3,0x4e,0xd6,0x33,0x1d,0x62,0xb9,0x54,0x1c,0x1e,0xa9,0xa9,0x29,0x2b,0xe7,0xb0,0xa6,0x5d,0x80,0x5e,0x26,0x6b,0x51,0x22,0x27,0x2a,0x82,0xdb,0x7d,0x76,0x5a,0xcc,0x7e,0x2a,0x29,0x0d,0x68,0x58,0x04,0x92,0x2f,0x91,0xed,0x04,0xa3,0xc3,0x82,0xc0,0x3f,0xf2,0x1a,0x17,0x68,0xf5,0x84,0x41,0x3c,0x4e,0x5f,0x00,},\"\\x88\\xd7\\x00\\x9d\\x51\\xde\\x3d\\x33\\x7e\\xef\\x0f\\x21\\x5e\\xa6\\x6a\\xb8\\x30\\xec\\x5a\\x9e\\x68\\x23\\x76\\x1c\\x3b\\x92\\xad\\x93\\xea\\x34\\x1d\\xb9\\x2e\\xce\\x67\\xf4\\xef\\x4c\\xeb\\x84\\x19\\x4a\\xe6\\x92\\x6c\\x3d\\x01\\x4b\\x2d\\x59\\x78\\x1f\\x02\\xe0\\xb3\\x2f\\x9a\\x61\\x12\\x22\\xcb\\x9a\\x58\\x50\\xc6\\x95\\x7c\\xb8\\x07\\x9a\\xe6\\x4e\\x08\\x32\\xa1\\xf0\\x5e\\x5d\\x1a\\x3c\\x57\\x2f\\x9d\\x08\\xf1\\x43\\x7f\\x76\\xbb\\x3b\\x83\\xb5\\x29\\x67\\xc3\\xd4\\x8c\\x35\\x76\\x84\\x88\\x91\\xc9\\x65\\x8d\\x49\\x59\\xeb\\x80\\x65\\x6d\\x26\\xcd\\xba\\x08\\x10\\x03\\x7c\\x8a\\x18\\x31\\x8f\\xf1\\x22\\xf8\\xaa\\x89\\x85\\xc7\\x73\\xcb\\x31\\x7e\\xfa\\x2f\\x55\\x7f\\x1c\\x38\\x96\\xbc\\xb1\\x62\\xdf\\x5d\\x87\\x68\\x1b\\xb7\\x87\\xe7\\x81\\x3a\\xa2\\xde\\xa3\\xb0\\xc5\\x64\\xd6\\x46\\xa9\\x28\\x61\\xf4\\x44\\xca\\x14\\x07\\xef\\xba\\xc3\\xd1\\x24\\x32\\xcb\\xb7\\x0a\\x1d\\x0e\\xaf\\xfb\\x11\\x74\\x1d\\x37\\x18\\xfe\\xde\\xe2\\xb8\\x30\\x36\\x18\\x9a\\x6f\\xc4\\x5a\\x52\\xf7\\x4f\\xa4\\x87\\xc1\\x8f\\xd2\\x64\\xa7\\x94\\x5f\\x6c\\x9e\\x44\\xb0\\x11\\xf5\\xd8\\x66\\x13\\xf1\\x93\\x9b\\x19\\xf4\\xf4\\xfd\\xf5\\x32\\x34\\x05\\x7b\\xe3\\xf0\\x05\\xad\\x64\\xee\\xbf\\x3c\\x8f\\xfb\\x58\\xcb\\x40\\x95\\x6c\\x43\\x36\\xdf\\x01\\xd4\\x42\\x4b\\x70\\x6a\\x0e\\x56\\x1d\\x60\\x17\\x08\\xd1\\x24\\x85\\xe2\\x1b\\xcb\\x6d\\x79\\x9d\\x8d\\x1d\\x04\\x4b\\x40\\x00\\x64\\xec\\x09\\x44\\x50\\x14\\x06\\xe7\\x02\\x53\\x94\\x70\\x06\\xca\\xbb\\xdb\\x2d\\xd6\\xbd\\x8c\\xee\\x44\\x97\\x65\\x3d\\x91\\x13\\xa4\\x4d\\x4d\\xe9\\xb6\\x8d\\x4c\\x52\\x6f\\xca\\x0b\\x9b\\x0c\\x18\\xfe\\x50\\xfb\\x91\\x7f\\xdd\\x9a\\x91\\x4f\\xb8\\x16\\x10\\x8a\\x73\\xa6\\xb3\\xff\\xf9\\xe6\\x54\\xe6\\x9c\\x9c\\xfe\\x02\\xb0\\x5c\\x6c\\x1b\\x9d\\x15\\xc4\\xe6\\x5c\\xf3\\x10\\x18\\xb8\\x10\\x0d\\x78\\x46\\x33\\xee\\x18\\x88\\xee\\xe3\\x57\\x2a\\xaf\\xa6\\xf1\\x89\\xea\\x22\\xd0\"},\n{{0xfc,0x0c,0x32,0xc5,0xeb,0x6c,0x71,0xea,0x08,0xdc,0x2b,0x30,0x0c,0xbc,0xef,0x18,0xfd,0xde,0x3e,0xa2,0x0f,0x68,0xf2,0x17,0x33,0x23,0x7b,0x4d,0xda,0xab,0x90,0x0e,},{0x47,0xc3,0x7d,0x8a,0x08,0x08,0x57,0xeb,0x87,0x77,0xa6,0xc0,0xa9,0xa5,0xc9,0x27,0x30,0x3f,0xaf,0x5c,0x32,0x09,0x53,0xb5,0xde,0x48,0xe4,0x62,0xe1,0x2d,0x00,0x62,},{0x68,0x87,0xc6,0xe2,0xb9,0x8a,0x82,0xaf,0x5e,0xe3,0xdf,0xa7,0xca,0x2c,0xb2,0x5d,0x9c,0x10,0x74,0x56,0x20,0xa8,0x29,0x56,0xac,0xba,0x85,0xcb,0x57,0xc8,0xec,0x24,0x27,0x9f,0xa4,0x2f,0x09,0x23,0x59,0xa1,0xb6,0xbb,0xea,0xfb,0xa0,0x50,0xf1,0x4b,0x62,0x88,0x20,0x9e,0x6e,0xf7,0xbc,0x1e,0x0a,0x2b,0x87,0x2c,0x11,0x38,0xf3,0x05,},\"\\xa7\\xb1\\xe2\\xdb\\x6b\\xdd\\x96\\xb3\\xd5\\x14\\x75\\x60\\x35\\x37\\xa7\\x6b\\x42\\xb0\\x4d\\x7e\\xbd\\x24\\xfe\\x51\\x5a\\x88\\x76\\x58\\xe4\\xa3\\x52\\xe2\\x21\\x09\\x33\\x56\\x39\\xa5\\x9e\\x25\\x34\\x81\\x1f\\x47\\x53\\xb7\\x02\\x09\\xd0\\xe4\\x69\\x8e\\x9d\\x92\\x60\\x88\\x82\\x6c\\x14\\x68\\x96\\x81\\xea\\x00\\xfa\\x3a\\x2f\\xca\\xa0\\x04\\x7c\\xed\\x3e\\xf2\\x87\\xe6\\x17\\x25\\x02\\xb2\\x15\\xe5\\x64\\x97\\x61\\x4d\\x86\\xb4\\xcb\\x26\\xbc\\xd7\\x7a\\x2e\\x17\\x25\\x09\\x36\\x0e\\xe5\\x88\\x93\\xd0\\x1c\\x0d\\x0f\\xb4\\xd4\\xab\\xfe\\x4d\\xbd\\x8d\\x2a\\x2f\\x54\\x19\\x0f\\xa2\\xf7\\x31\\xc1\\xce\\xac\\x68\\x29\\xc3\\xdd\\xc9\\xbf\\xb2\\xff\\xd7\\x0c\\x57\\xba\\x0c\\x2b\\x22\\xd2\\x32\\x6f\\xbf\\xe7\\x39\\x0d\\xb8\\x80\\x9f\\x73\\x54\\x7f\\xf4\\x7b\\x86\\xc3\\x6f\\x2b\\xf7\\x45\\x4e\\x67\\x8c\\x4f\\x1c\\x0f\\xa8\\x70\\xbd\\x0e\\x30\\xbb\\xf3\\x27\\x8e\\xc8\\xd0\\xc5\\xe9\\xb6\\x4a\\xff\\x0a\\xf6\\x4b\\xab\\xc1\\x9b\\x70\\xf4\\xcf\\x9a\\x41\\xcb\\x8f\\x95\\xd3\\xcd\\xe2\\x4f\\x45\\x6b\\xa3\\x57\\x1c\\x8f\\x02\\x1d\\x38\\xe5\\x91\\xde\\xc0\\x5c\\xb5\\xd1\\xca\\x7b\\x48\\xf9\\xda\\x4b\\xd7\\x34\\xb0\\x69\\xa9\\xfd\\x10\\x65\\x00\\xc1\\xf4\\x08\\xab\\x7f\\xe8\\xe4\\xa6\\xe6\\xf3\\xed\\x64\\xda\\x0e\\xd2\\x4b\\x01\\xe3\\x3d\\xf8\\x47\\x5f\\x95\\xfa\\x9e\\xd7\\x1d\\x04\\xdd\\x30\\xb3\\xcd\\x82\\x37\\x55\\xa3\\x40\\x1b\\xf5\\xaf\\xae\\x10\\xee\\x7e\\x18\\xec\\x6f\\xe6\\x37\\xc3\\x79\\x3f\\xd4\\x34\\xb4\\x8d\\x71\\x45\\x13\\x04\\x47\\xe0\\x02\\x99\\x10\\x10\\x52\\x55\\x8b\\x50\\x65\\x54\\xec\\x9c\\x39\\x9f\\x62\\x94\\x1c\\x3f\\x41\\x4c\\xbc\\x35\\x2c\\xaa\\x34\\x5b\\x93\\x0a\\xde\\xcf\\xad\\xda\\xc9\\x1e\\xe5\\x3d\\x14\\x51\\xa6\\x5e\\x06\\x20\\x10\\x26\\x32\\x5d\\xe0\\x7c\\x93\\x1f\\x69\\xbb\\xa8\\x68\\xa7\\xc8\\x7e\\xe2\\x3c\\x60\\x4e\\xc6\\x79\\x43\\x32\\x91\\x7d\\xfe\\x2c\\x5b\\x69\\x66\\x9b\\x65\\x97\\x06\\x91\\x7f\\x71\\xed\\xdf\\x96\"},\n{{0xa8,0xd7,0x3d,0x63,0x9a,0x23,0xcc,0x6a,0x96,0x7e,0xf3,0x1b,0xca,0xbb,0x5d,0x06,0x3e,0x53,0xe1,0xea,0xb8,0xfc,0xc7,0xca,0xb9,0xbc,0x3a,0x17,0xfd,0xe9,0xc2,0xf8,},{0x8d,0xaa,0x9f,0x4c,0x8b,0x1a,0x44,0x69,0x1b,0xf4,0x45,0x21,0xf2,0xf7,0xca,0x45,0xdc,0x7f,0xc6,0x1f,0x6a,0x4c,0xe6,0xf9,0x8f,0xaa,0x41,0xc2,0xa7,0x49,0x77,0xd1,},{0xc4,0xdc,0xef,0x1a,0x24,0x53,0x93,0x9b,0x36,0x4b,0x34,0x02,0x50,0xc3,0x12,0x94,0x31,0x43,0x1d,0x5b,0xa3,0xf4,0x76,0x70,0xab,0x07,0xce,0x68,0x0c,0x69,0xbf,0x28,0xb6,0x78,0x62,0x7c,0x76,0xa6,0x36,0x0f,0xc4,0x0d,0xc1,0x09,0xaa,0x7d,0xea,0x37,0x1b,0x82,0x5e,0x46,0x13,0x4f,0x62,0x45,0x72,0x18,0x2a,0xcf,0x39,0x57,0xe7,0x0f,},\"\\xfd\\x1f\\xac\\x3d\\x53\\x31\\x3b\\x11\\xac\\xd2\\x9f\\x5a\\x83\\xac\\x11\\x89\\x6d\\xab\\x25\\x30\\xfa\\x47\\x86\\x5b\\x22\\x95\\xc0\\xd9\\x9d\\xd6\\x7c\\x36\\xed\\x8e\\x5f\\xa5\\x49\\x15\\x0c\\x79\\x4c\\x55\\x49\\xef\\xb5\\xc1\\xd6\\x91\\x14\\xd5\\xd6\\x07\\xb2\\x32\\x85\\xb7\\x21\\x2a\\xfa\\xab\\x57\\x84\\x6a\\x54\\xae\\x67\\xb9\\xe8\\x80\\xe0\\x7b\\x65\\x86\\x60\\x7c\\xec\\xf6\\xd4\\xee\\xd5\\x16\\xa3\\xa7\\x55\\x11\\xfe\\x36\\x7d\\x88\\xeb\\x87\\x1e\\x6d\\x71\\xb7\\xd6\\xaa\\x13\\x67\\xa0\\x14\\x21\\xb1\\x08\\x8f\\xc2\\xd7\\x5e\\x44\\x95\\x4b\\x73\\x62\\x5c\\x52\\xda\\x8a\\x3a\\x18\\x3c\\x60\\xbe\\x9d\\xa6\\x05\\x0f\\x59\\xa4\\x53\\xca\\xa5\\x35\\x20\\x59\\x36\\x71\\x72\\x8d\\x43\\x18\\x77\\xbf\\xaa\\xc9\\x13\\xa7\\x65\\xfb\\x6a\\x56\\xb7\\x52\\x90\\xb2\\xa8\\xaa\\xac\\x34\\xaf\\xb9\\x21\\x7b\\xa1\\xb0\\xd5\\x85\\x0b\\xa0\\xfd\\xab\\xf8\\x09\\x69\\xde\\xf0\\xfe\\xee\\x79\\x4c\\xeb\\x60\\x61\\x4e\\x33\\x68\\xe6\\x3e\\xf2\\x0e\\x4c\\x32\\xd3\\x41\\xec\\x9b\\x03\\x28\\xea\\x9f\\xe1\\x39\\x20\\x7e\\xd7\\xa6\\x26\\xff\\x08\\x94\\x3b\\x41\\x52\\x33\\xdb\\x7c\\xfc\\xc8\\x45\\xc9\\xb6\\x31\\x21\\xd4\\xed\\x52\\xec\\x37\\x48\\xab\\x6a\\x1f\\x36\\xb2\\x10\\x3c\\x7d\\xc7\\xe9\\x30\\x3a\\xce\\xa4\\xba\\x8a\\xf7\\xa3\\xe0\\x71\\x84\\xfb\\x49\\x1e\\x89\\x1e\\xde\\x84\\xf0\\xdc\\x41\\xca\\xdc\\x39\\x73\\x02\\x8e\\x87\\x9a\\xcd\\x20\\x31\\xaf\\xc2\\x9a\\x16\\x09\\x28\\x68\\xe2\\xc7\\xf5\\x39\\xfc\\x1b\\x79\\x2e\\xda\\xb1\\x95\\xa2\\x5a\\xb9\\x83\\x06\\x61\\x34\\x6b\\x39\\xef\\x53\\x91\\x5d\\xe4\\xaf\\x52\\xc4\\x21\\xea\\xf1\\x72\\xe9\\xda\\x76\\xa0\\x8c\\x28\\x3a\\x52\\xdf\\x90\\x7f\\x70\\x5d\\x7e\\x85\\x99\\xc5\\xba\\xae\\x0c\\x2a\\xf3\\x80\\xc1\\xbb\\x46\\xf9\\x34\\x84\\xa0\\x3f\\x28\\x37\\x43\\x24\\xb2\\x78\\x99\\x2b\\x50\\xb7\\xaf\\xa0\\x25\\x52\\xca\\xfa\\x50\\x3f\\x03\\x4f\\x8d\\x86\\x6e\\x9b\\x72\\x02\\x71\\xdd\\x68\\xcc\\xb6\\x85\\xa8\\x5f\\xff\\xd1\"},\n{{0x79,0xc7,0xdc,0xb7,0xd5,0x9a,0x8d,0xf6,0xb2,0xb2,0xba,0x04,0x13,0x05,0x9d,0x89,0x68,0x09,0x95,0xc2,0x0e,0x91,0x6d,0xa0,0x1b,0x8f,0x06,0x7d,0xc6,0x0c,0xde,0xb4,},{0x29,0x87,0x43,0xc7,0x39,0x18,0xbd,0x55,0x6b,0x28,0xf8,0xd4,0x82,0x4a,0x09,0xb8,0x14,0x75,0x2a,0x7a,0xea,0xe7,0xee,0x04,0x87,0x5c,0x53,0xf4,0xd6,0xb1,0x08,0xd9,},{0x7b,0x7c,0xbe,0x44,0xc7,0x71,0xe4,0x37,0x1b,0xae,0x13,0xb0,0x72,0x2b,0xab,0xcc,0x10,0x64,0x15,0x57,0x32,0x96,0x2f,0x40,0x7c,0xba,0x2a,0xcd,0x35,0x38,0x1d,0x42,0x21,0x0b,0xec,0xe8,0x22,0xf4,0x68,0x11,0x21,0xfd,0x4d,0xab,0x74,0x5a,0x1f,0x30,0x77,0x92,0x2f,0xba,0x1a,0x78,0x04,0x5b,0x71,0x29,0x02,0xba,0xcc,0xac,0x66,0x0e,},\"\\x5f\\xe2\\x02\\xf5\\xb3\\x3b\\x77\\x88\\x81\\x0d\\x25\\x08\\xa1\\x3b\\x31\\x14\\xd6\\x9b\\x85\\x96\\xe6\\xea\\xcd\\xa0\\x5a\\x04\\xa2\\xeb\\x59\\x7f\\xa3\\x27\\x9c\\x20\\x8b\\x5a\\x5b\\x65\\xda\\xac\\xb6\\x99\\xf1\\x44\\xe1\\xd6\\x60\\xe7\\x8e\\x13\\x9b\\x57\\x83\\x31\\xab\\xec\\x5c\\x3c\\x35\\x33\\x44\\x54\\xf0\\x3e\\x83\\x2c\\x8d\\x6e\\x29\\x84\\xdf\\x5d\\x45\\x0e\\xcb\\x5d\\x33\\x58\\x2a\\x78\\x80\\x8a\\x9c\\x78\\xf2\\x6e\\xbc\\xd1\\x24\\x4e\\xf5\\x2e\\x3f\\xa6\\xdc\\xa1\\x15\\xc1\\xf0\\xcb\\x56\\xe3\\x8e\\xae\\x0e\\x5b\\x39\\xf5\\xfd\\x86\\x3d\\xff\\xd0\\xb2\\xfb\\x5b\\x95\\x8f\\x2d\\x73\\x9d\\xb3\\x12\\xfc\\x66\\x7a\\x17\\xb0\\x31\\xc4\\xc9\\xf8\\xc5\\xa2\\xad\\x57\\x79\\x84\\xcc\\x41\\x46\\xc4\\x37\\x58\\x0e\\xfd\\x21\\x52\\x17\\x3f\\xe0\\xd5\\x78\\x2c\\xc2\\xae\\x98\\x31\\xa8\\xd9\\xa0\\x41\\x77\\x25\\x60\\x18\\xff\\x76\\x31\\xe0\\xb0\\xd8\\xa9\\x9c\\xb2\\x8f\\x00\\x8b\\x32\\x04\\x21\\xe2\\x7a\\x74\\xc3\\x13\\x59\\x18\\x86\\x63\\x45\\x6d\\x85\\xe0\\x98\\xc1\\xeb\\xd2\\x81\\x70\\x10\\x97\\xb6\\xae\\x5a\\x87\\x1e\\x5c\\xcc\\x02\\x05\\x8a\\x50\\x14\\x16\\xcb\\x91\\xc1\\x2c\\xef\\x5b\\xe6\\xf1\\x91\\x43\\x70\\xe5\\x63\\xf1\\xa1\\xb2\\xaa\\x41\\xf4\\xb8\\xee\\x84\\xcd\\x32\\xa1\\xd5\\x09\\xe5\\x29\\x78\\x7d\\x14\\xa4\\x45\\x43\\x8d\\x80\\x7e\\xcd\\x62\\x0e\\x2f\\xa2\\x6d\\xe0\\xda\\x64\\x26\\x86\\x47\\x84\\xd4\\xa2\\x8f\\x54\\x10\\x3e\\x60\\x92\\x83\\xb9\\x9e\\xe9\\xb2\\xb6\\x99\\xc9\\x80\\xbb\\xb7\\x88\\x2c\\x3e\\xa6\\x8d\\xdc\\x90\\x80\\x2a\\xc2\\x32\\xf2\\xc8\\xe8\\x42\\x91\\x98\\x7b\\xf3\\xc5\\x24\\x09\\x21\\xb5\\x9c\\xfa\\x21\\x49\\x69\\x31\\x76\\x73\\xd0\\xbe\\x7f\\x34\\xb1\\xca\\x0e\\x15\\xea\\x73\\xc7\\x17\\x54\\x01\\xce\\x55\\x0b\\xe1\\x06\\xb4\\x9e\\x62\\xf8\\xdb\\x68\\x69\\x5e\\x74\\x0e\\x0f\\x3a\\x35\\x56\\xa1\\x9f\\x3c\\x8e\\x6b\\x91\\xac\\x1c\\xc2\\x3e\\x86\\x3f\\xcd\\x0f\\x0d\\x9e\\xb7\\x04\\x7a\\xa6\\x31\\xe0\\xd2\\xeb\\x9b\\xcc\\x6b\"},\n{{0xb9,0xce,0xd0,0x41,0x25,0x93,0xfe,0xfe,0xd9,0x5e,0x94,0xac,0x96,0x5e,0x5b,0x23,0xff,0x9d,0x4b,0x0e,0x79,0x7d,0xb0,0x2b,0xf4,0x97,0x99,0x4d,0x3b,0x79,0x3e,0x60,},{0xc1,0x62,0x9a,0x72,0x31,0x89,0x95,0x93,0x37,0xf5,0x53,0x52,0x01,0xe5,0xd3,0x95,0xba,0x0a,0x03,0xea,0x8c,0x17,0x66,0x0d,0x0f,0x8b,0x6f,0x6e,0x64,0x04,0xbb,0x12,},{0xf1,0xb7,0x97,0xde,0xd8,0xa6,0x94,0x2b,0x12,0x62,0x68,0x48,0x34,0x0f,0xb7,0x19,0xfc,0xdd,0xaf,0xd9,0x8f,0x33,0xe2,0x99,0x2d,0x35,0x7b,0xfd,0xd3,0x59,0x33,0xc7,0xac,0x56,0x1e,0x5b,0x2f,0x93,0x94,0x64,0x33,0x8c,0x56,0x66,0x85,0x4c,0xa8,0x85,0xc4,0xd0,0x46,0xeb,0x2c,0x54,0xe4,0x8a,0x1b,0x5e,0xd2,0x66,0xad,0x34,0xde,0x05,},\"\\x55\\x5b\\xb3\\x9c\\x18\\x99\\xd5\\x7c\\xab\\xe4\\x28\\x06\\x4c\\x2d\\x92\\x5f\\x5f\\xc4\\xcf\\x70\\x59\\xb9\\x5f\\xb8\\x9a\\x8e\\x9e\\x3a\\x7e\\x42\\x6c\\x6c\\x92\\x2d\\x9e\\x4d\\x76\\x98\\x4e\\xa2\\x38\\x3c\\xab\\xb4\\xf2\\xbe\\xfd\\x89\\xc1\\xf2\\x0e\\xaa\\x8a\\x00\\xdb\\xe7\\x87\\xcf\\xa7\\x0a\\xe2\\xae\\x6a\\xa9\\x03\\x31\\xcb\\xbe\\x58\\x0f\\xa5\\xa0\\x21\\x84\\xed\\x05\\xe6\\xc8\\xe8\\x9d\\x57\\x6a\\xf2\\x8a\\xee\\xaf\\x7c\\x4e\\x25\\x00\\xf3\\x58\\xa0\\x09\\x71\\xa0\\xa7\\x59\\x20\\xe8\\x54\\x84\\x9b\\xf3\\x32\\x14\\x29\\x75\\x40\\x4f\\x59\\x8c\\x32\\xe9\\x69\\x82\\x04\\x3d\\x99\\x2b\\xcd\\x1a\\x4f\\xe8\\x19\\xbb\\x56\\x34\\xad\\x03\\x46\\x7a\\xfc\\x4c\\xe0\\x50\\x73\\xf8\\x8b\\xa1\\xba\\x4a\\xe8\\x65\\x3a\\x04\\x66\\x5c\\xf3\\xf7\\x16\\x90\\xfe\\x13\\x34\\x38\\x85\\xbc\\x5e\\xbc\\x0e\\x5e\\x62\\xd8\\x82\\xf4\\x3b\\x7c\\x68\\x90\\x0a\\xc9\\x43\\x8b\\xf4\\xa8\\x1c\\xe9\\x01\\x69\\xec\\x12\\x9e\\xe6\\x3e\\x2c\\x67\\x5a\\x1a\\x5a\\x67\\xe2\\x7c\\xc7\\x98\\xc4\\x8c\\xc2\\x3f\\x51\\x07\\x8f\\x46\\x3b\\x3b\\x7c\\xc1\\x4e\\x3b\\xcf\\xd2\\xe9\\xb8\\x2c\\x75\\x24\\x09\\x34\\xcb\\xdc\\x50\\xc4\\x30\\x8f\\x28\\x2f\\x19\\x31\\x22\\x99\\x56\\x06\\xf4\\x01\\x35\\x10\\x0a\\x29\\x1c\\x55\\xaf\\xdf\\x89\\x34\\xeb\\x8b\\x61\\xd8\\x14\\x21\\x67\\x41\\x24\\xde\\xc3\\xb8\\x8f\\x9a\\x73\\x11\\x0a\\x9e\\x61\\x6f\\x5b\\x82\\x6b\\x9d\\x34\\x3f\\x3a\\xc0\\xe9\\xd7\\xbd\\xf4\\xfd\\x8b\\x64\\x8b\\x40\\xf0\\x09\\x8b\\x38\\x97\\xa3\\xa1\\xcd\\x65\\xa6\\x45\\x70\\x05\\x9b\\x8b\\xc5\\xc6\\x74\\x38\\x83\\x07\\x4c\\x88\\x62\\x3c\\x1f\\x5a\\x88\\xc5\\x89\\x69\\xe2\\x1c\\x69\\x2a\\xca\\x23\\x68\\x33\\xd3\\x47\\x0b\\x3e\\xb0\\x98\\x15\\xe1\\x13\\x8e\\x9d\\x06\\x50\\xc3\\x90\\xee\\xe9\\x77\\x42\\x21\\x93\\xb0\\x09\\x18\\xbe\\x8a\\x97\\xcc\\x61\\x99\\xb4\\x51\\xb0\\x5b\\x57\\x30\\xd1\\xd1\\x33\\x58\\xcf\\x74\\x61\\x06\\x78\\xf7\\xac\\x7f\\x78\\x95\\xcc\\x2e\\xfc\\x45\\x6e\\x03\\x87\\x3b\"},\n{{0x81,0xda,0x16,0x8f,0x02,0xd4,0x6b,0xb8,0x7c,0xda,0x84,0x5d,0xa4,0x3f,0x8a,0x6c,0xba,0x2c,0x01,0x68,0x78,0xd6,0xf4,0x9c,0x6f,0x06,0x1a,0x60,0xf1,0x55,0xa0,0x4a,},{0xaf,0xf8,0x6e,0x98,0x09,0x3c,0xa4,0xc7,0x1b,0x1b,0x80,0x4c,0x5f,0xe4,0x51,0xcf,0xdf,0x86,0x82,0x50,0xde,0xa3,0x03,0x45,0xfa,0x4b,0x89,0xbb,0x09,0xb6,0xa5,0x3b,},{0x4a,0xac,0xa9,0x47,0xe3,0xf2,0x2c,0xc8,0xb8,0x58,0x8e,0xe0,0x30,0xac,0xe8,0xf6,0xb5,0xf5,0x71,0x1c,0x29,0x74,0xf2,0x0c,0xc1,0x8c,0x3b,0x65,0x5b,0x07,0xa5,0xbc,0x13,0x66,0xb5,0x9a,0x17,0x08,0x03,0x2d,0x12,0xca,0xe0,0x1a,0xb7,0x94,0xf8,0xcb,0xcc,0x1a,0x33,0x08,0x74,0xa7,0x50,0x35,0xdb,0x1d,0x69,0x42,0x2d,0x2f,0xc0,0x0c,},\"\\x6b\\xc6\\x72\\x6a\\x34\\xa6\\x4a\\xae\\x76\\xab\\x08\\xc9\\x2b\\x17\\x9e\\x54\\xff\\x5d\\x2e\\x65\\xeb\\x2c\\x6c\\x65\\x9a\\xe8\\x70\\x3c\\xc2\\x45\\xcb\\xc2\\xcf\\x45\\xa1\\x2b\\x22\\xc4\\x68\\xae\\x61\\xfd\\x9a\\x66\\x27\\xad\\x06\\x26\\xc9\\xb1\\xe5\\xaf\\x41\\x2c\\xb4\\x83\\xea\\xee\\x1d\\xb1\\x1b\\x29\\xf0\\xa5\\x10\\xc1\\x3e\\x38\\x02\\x0e\\x09\\xae\\x0e\\xee\\x76\\x25\\x37\\xa3\\xe9\\xd1\\xa0\\xc7\\xb0\\x33\\xd0\\x97\\xfd\\xc1\\xf4\\xf8\\x26\\x29\\xa9\\xde\\x9e\\xf3\\x8d\\xa1\\xcf\\x96\\xa9\\x40\\x35\\x7d\\x5f\\x2e\\x0e\\x7e\\x8d\\xbc\\x29\\xdb\\x72\\x8a\\x1e\\x6a\\xad\\x87\\x6e\\x5e\\x05\\x31\\x13\\xd0\\x64\\x20\\x27\\x2b\\x87\\xcf\\x0c\\x40\\xdf\\xe0\\x3a\\x54\\x4d\\xe9\\x6c\\x7a\\xea\\x13\\xba\\x00\\x29\\xb5\\x7b\\x48\\xd9\\x9d\\xcc\\x6a\\x65\\x04\\x92\\xd7\\x8c\\x4c\\xdd\\x1b\\x28\\xe1\\xa1\\x15\\xa7\\xe3\\xe7\\xa7\\xcb\\x21\\x33\\x3d\\x4f\\xf8\\x08\\x58\\xdf\\xb6\\x77\\x82\\xc1\\x63\\x54\\xb8\\x71\\x65\\x96\\x56\\x0d\\x7d\\x8e\\x38\\x9e\\xb1\\x5a\\x05\\x2a\\x0b\\xf5\\xd1\\x6e\\xb5\\x4f\\xb3\\xe4\\x97\\x3a\\xd4\\x98\\x4e\\x72\\xa1\\x87\\xf5\\x34\\x7d\\x5b\\x26\\x2c\\x32\\xb1\\x64\\x7e\\x42\\xb6\\xa5\\x38\\x37\\x09\\x6c\\xc7\\x8c\\x2a\\x05\\xce\\x1c\\x6e\\x12\\x49\\x3a\\x03\\xf1\\xa6\\x67\\x58\\x4c\\xb9\\x7f\\x4f\\xcd\\x57\\xee\\x94\\x4c\\x65\\xb7\\xee\\xd2\\x5f\\x7a\\xe0\\xf3\\xf6\\xce\\xde\\x17\\x3f\\xdf\\xac\\xf5\\xaf\\x1d\\xb1\\x43\\x73\\x0d\\x18\\x09\\x66\\x64\\x91\\x4b\\xa4\\xcf\\xc6\\x96\\x6f\\x39\\x20\\x22\\x78\\x1c\\x66\\xa9\\x41\\x7c\\xa2\\x68\\x0b\\x51\\xf6\\x3e\\x4f\\xba\\x42\\x4e\\xcf\\xdb\\xc6\\xa2\\xf0\\x17\\x87\\xd0\\xe7\\x48\\x4f\\x8a\\x8a\\xb3\\x90\\xae\\xaa\\x6d\\x1f\\x7e\\xd3\\x25\\xd8\\x2f\\xea\\xa1\\x69\\x2a\\x49\\x84\\xfa\\xe4\\x3d\\xa8\\x73\\x29\\xb0\\x45\\xda\\x8f\\x0a\\x4f\\x56\\xb6\\x95\\xaa\\x93\\x5d\\xe1\\x52\\xce\\x03\\x85\\x15\\x37\\x20\\x97\\x9a\\x2b\\x70\\x06\\xd4\\x05\\xfc\\xb0\\xfb\\xa0\\x9e\\x23\\xb8\\x5f\\xd1\\x9b\"},\n{{0xaf,0x2e,0x60,0xda,0x0f,0x29,0xbb,0x16,0x14,0xfc,0x3f,0x19,0x3c,0xc3,0x53,0x33,0x19,0x86,0xb7,0x3f,0x3f,0x9a,0x0a,0xec,0x94,0x21,0xb9,0x47,0x3d,0x6a,0x4b,0x6a,},{0xc8,0xbf,0xe2,0x83,0x58,0x22,0x19,0x9c,0x61,0x27,0xb8,0x06,0xfa,0xbe,0xef,0x0c,0xb9,0xff,0x59,0xf3,0xc8,0x1f,0xf0,0xcb,0x89,0xc5,0x56,0xf5,0x51,0x06,0xaf,0x6a,},{0x50,0xf9,0xf9,0x41,0xa8,0xda,0x9f,0x62,0x40,0xf7,0x6d,0x2f,0xa3,0xb0,0x6d,0xd6,0xb2,0x29,0x2e,0xd3,0x2d,0x1c,0x05,0x21,0x80,0x97,0xd3,0x4d,0x8a,0x19,0xdf,0xe5,0x53,0xf7,0x6a,0xe3,0xc6,0xb4,0xa2,0xed,0x20,0x85,0x21,0x28,0x46,0x15,0x40,0xde,0xcf,0x41,0x8f,0x52,0xd3,0x8e,0x64,0x03,0x7e,0xec,0x77,0x71,0xbd,0x1a,0xfe,0x00,},\"\\x7d\\xbb\\x77\\xb8\\x8b\\xda\\x94\\xf3\\x44\\x41\\x6a\\x06\\xb0\\x96\\x56\\x6c\\x6e\\x8b\\x39\\x39\\x31\\xa8\\x24\\x3a\\x6c\\xab\\x75\\xc3\\x61\\xfd\\xe7\\xdc\\x53\\x6a\\xec\\x40\\xcd\\xed\\x83\\x29\\x6a\\x89\\xe8\\xc3\\xbe\\xf7\\xd7\\x87\\xcf\\xc4\\x94\\x01\\xa7\\xb9\\x18\\x3f\\x13\\x8d\\x50\\x00\\x61\\x9f\\xf0\\x73\\xc0\\x5e\\x2f\\x84\\x1d\\x60\\x08\\x35\\x8f\\x10\\xa2\\xda\\x7d\\xcf\\xac\\x3d\\x4d\\x70\\xc2\\x0d\\x2e\\xc3\\x4c\\x7b\\x6d\\x5c\\xd1\\xa7\\x34\\xd6\\xbb\\xb1\\x1c\\x5f\\xd8\\xd2\\xbc\\xe3\\x2a\\xc8\\x10\\xef\\x82\\xb4\\x18\\x8a\\xa8\\xea\\x3c\\xfc\\x30\\x32\\x23\\x3d\\xc0\\xe2\\x60\\x0e\\x9d\\xb6\\xe1\\x8b\\xc2\\x2b\\x10\\x04\\x4a\\x31\\xc1\\x5b\\xac\\xea\\xf5\\x55\\x4d\\xe8\\x9d\\x2a\\x34\\x66\\x80\\x7f\\x24\\x44\\x14\\xd0\\x80\\xff\\x29\\x63\\x95\\x6c\\x6e\\x83\\xc8\\xe1\\x44\\xed\\x00\\x66\\x08\\x8b\\x47\\x6d\\xdc\\xb5\\x64\\x40\\x34\\x47\\xd9\\x15\\x9f\\x90\\x89\\xab\\xa2\\xb4\\xd5\\x57\\x5c\\x4d\\x8a\\xe6\\x6f\\xc8\\x69\\x0e\\x73\\x49\\xed\\x40\\x83\\x2e\\x63\\x69\\xc0\\x24\\x56\\x3e\\xc4\\x93\\xbf\\xcc\\x0f\\xc9\\xac\\x78\\x7a\\xc8\\x41\\x39\\x7f\\xe1\\x33\\x16\\x72\\x83\\xd8\\x0c\\x42\\xf0\\x06\\xa9\\x9d\\x39\\xe8\\x29\\x79\\xda\\x3f\\xa9\\x33\\x4b\\xd9\\xed\\xe0\\xd1\\x4b\\x41\\xb7\\x46\\x6b\\xce\\xbb\\xe8\\x17\\x1b\\xc8\\x04\\xa6\\x45\\xd3\\x72\\x32\\x74\\xa1\\xb9\\x2b\\xf8\\x2f\\xd9\\x93\\x35\\x87\\x44\\xde\\x92\\x44\\x19\\x03\\xd4\\x36\\xfd\\x47\\xf2\\x3d\\x40\\x05\\x2a\\x38\\x29\\x36\\x7f\\x20\\x2f\\x05\\x53\\xb5\\xe4\\x9b\\x76\\xc5\\xe0\\x3f\\xa6\\xce\\x7c\\x3c\\xf5\\xee\\xb2\\x1d\\xe9\\x67\\xbe\\xc4\\xdd\\x35\\x59\\x25\\x38\\x4e\\xbf\\x96\\x69\\x7e\\x82\\x37\\x62\\xba\\xc4\\xd4\\x3a\\x76\\x7c\\x24\\x1a\\x4c\\xef\\x72\\x4a\\x97\\x0d\\x00\\xff\\x3a\\x8a\\xb3\\xb8\\x3e\\xed\\x84\\x00\\x75\\xc7\\x4e\\x90\\xf3\\x06\\xe3\\x30\\x01\\x32\\x60\\x96\\x21\\x61\\xe9\\xd0\\x91\\x0d\\xe1\\x83\\x62\\x2c\\xe9\\xa6\\xb8\\xd5\\x14\\x42\\x80\\x55\\x0f\\xc7\"},\n{{0x60,0x5f,0x90,0xb5,0x3d,0x8e,0x4a,0x3b,0x48,0xb9,0x7d,0x74,0x54,0x39,0xf2,0xa0,0x80,0x7d,0x83,0xb8,0x50,0x2e,0x8e,0x29,0x79,0xf0,0x3e,0x8d,0x37,0x6a,0xc9,0xfe,},{0xaa,0x3f,0xae,0x4c,0xfa,0x6f,0x6b,0xfd,0x14,0xba,0x0a,0xfa,0x36,0xdc,0xb1,0xa2,0x65,0x6f,0x36,0x54,0x1a,0xd6,0xb3,0xe6,0x7f,0x17,0x94,0xb0,0x63,0x60,0xa6,0x2f,},{0xdd,0x02,0x12,0xe6,0x32,0x88,0xcb,0xe1,0x4a,0x45,0x69,0xb4,0xd8,0x91,0xda,0x3c,0x7f,0x92,0x72,0x7c,0x5e,0x7f,0x9a,0x80,0x1c,0xf9,0xd6,0x82,0x70,0x85,0xe7,0x09,0x5b,0x66,0x9d,0x7d,0x45,0xf8,0x82,0xca,0x5f,0x07,0x45,0xdc,0xcd,0x24,0xd8,0x7a,0x57,0x18,0x13,0x20,0x19,0x1e,0x5b,0x7a,0x47,0xc3,0xf7,0xf2,0xdc,0xcb,0xd7,0x07,},\"\\x3b\\xcd\\xca\\xc2\\x92\\xac\\x95\\x19\\x02\\x4a\\xae\\xce\\xe2\\xb3\\xe9\\x99\\xff\\x5d\\x34\\x45\\xe9\\xf1\\xeb\\x60\\x94\\x0f\\x06\\xb9\\x12\\x75\\xb6\\xc5\\xdb\\x27\\x22\\xed\\x4d\\x82\\xfe\\x89\\x60\\x52\\x26\\x53\\x0f\\x3e\\x6b\\x07\\x37\\xb3\\x08\\xcd\\xe8\\x95\\x61\\x84\\x94\\x4f\\x38\\x8a\\x80\\x04\\x2f\\x6c\\xba\\x27\\x4c\\x0f\\x7d\\x11\\x92\\xa0\\xa9\\x6b\\x0d\\xa6\\xe2\\xd6\\xa6\\x1b\\x76\\x51\\x8f\\xbe\\xe5\\x55\\x77\\x3a\\x41\\x45\\x90\\xa9\\x28\\xb4\\xcd\\x54\\x5f\\xcc\\xf5\\x81\\x72\\xf3\\x58\\x57\\x12\\x0e\\xb9\\x6e\\x75\\xc5\\xc8\\xac\\x9a\\xe3\\xad\\xd3\\x67\\xd5\\x1d\\x34\\xac\\x40\\x34\\x46\\x36\\x0e\\xc1\\x0f\\x55\\x3e\\xa9\\xf1\\x4f\\xb2\\xb8\\xb7\\x8c\\xba\\x18\\xc3\\xe5\\x06\\xb2\\xf0\\x40\\x97\\x06\\x3a\\x43\\xb2\\xd3\\x64\\x31\\xcc\\xe0\\x2c\\xaf\\x11\\xc5\\xa4\\xdb\\x8c\\x82\\x17\\x52\\xe5\\x29\\x85\\xd5\\xaf\\x1b\\xfb\\xf4\\xc6\\x15\\x72\\xe3\\xfa\\xda\\xe3\\xad\\x42\\x4a\\xcd\\x81\\x66\\x2e\\xa5\\x83\\x7a\\x11\\x43\\xb9\\x66\\x93\\x91\\xd7\\xb9\\xcf\\xe2\\x30\\xcf\\xfb\\x3a\\x7b\\xb0\\x3f\\x65\\x91\\xc2\\x5a\\x4f\\x01\\xc0\\xd2\\xd4\\xac\\xa3\\xe7\\x4d\\xb1\\x99\\x7d\\x37\\x39\\xc8\\x51\\xf0\\x32\\x7d\\xb9\\x19\\xff\\x6e\\x77\\xf6\\xc8\\xa2\\x0f\\xdd\\x3e\\x15\\x94\\xe9\\x2d\\x01\\x90\\x1a\\xb9\\xae\\xf1\\x94\\xfc\\x89\\x3e\\x70\\xd7\\x8c\\x8a\\xe0\\xf4\\x80\\x00\\x1a\\x51\\x5d\\x4f\\x99\\x23\\xae\\x62\\x78\\xe8\\x92\\x72\\x37\\xd0\\x5d\\xb2\\x3e\\x98\\x4c\\x92\\xa6\\x83\\x88\\x2f\\x57\\xb1\\xf1\\x88\\x2a\\x74\\xa1\\x93\\xab\\x69\\x12\\xff\\x24\\x1b\\x9f\\xfa\\x66\\x2a\\x0d\\x47\\xf2\\x92\\x05\\xf0\\x84\\xdb\\xde\\x84\\x5b\\xaa\\xeb\\x5d\\xd3\\x6a\\xe6\\x43\\x9a\\x43\\x76\\x42\\xfa\\x76\\x3b\\x57\\xe8\\xdb\\xe8\\x4e\\x55\\x81\\x3f\\x01\\x51\\xe9\\x7e\\x5b\\x9d\\xe7\\x68\\xb2\\x34\\xb8\\xdb\\x15\\xc4\\x96\\xd4\\xbf\\xcf\\xa1\\x38\\x87\\x88\\x97\\x2b\\xb5\\x0c\\xe0\\x30\\xbc\\x6e\\x0c\\xcf\\x4f\\xa7\\xd0\\x0d\\x34\\x37\\x82\\xf6\\xba\\x8d\\xe0\"},\n{{0x9e,0x2c,0x3d,0x18,0x98,0x38,0xf4,0xdd,0x52,0xef,0x08,0x32,0x88,0x68,0x74,0xc5,0xca,0x49,0x39,0x83,0xdd,0xad,0xc0,0x7c,0xbc,0x57,0x0a,0xf2,0xee,0x9d,0x62,0x09,},{0xf6,0x8d,0x3b,0x81,0xe7,0x35,0x57,0xee,0x1f,0x08,0xbd,0x2d,0x3f,0x46,0xa4,0x71,0x82,0x56,0xa0,0xf3,0xcd,0x8d,0x2e,0x03,0xeb,0x8f,0xe8,0x82,0xaa,0xb6,0x5c,0x69,},{0x38,0xa3,0x1b,0x6b,0x46,0x50,0x84,0x73,0x82,0x62,0xa2,0x6c,0x06,0x5f,0xe5,0xd9,0xe2,0x88,0x6b,0xf9,0xdd,0x35,0xcd,0xe0,0x5d,0xf9,0xba,0xd0,0xcc,0x7d,0xb4,0x01,0xc7,0x50,0xaa,0x19,0xe6,0x60,0x90,0xbc,0xe2,0x5a,0x3c,0x72,0x12,0x01,0xe6,0x05,0x02,0xc8,0xc1,0x04,0x54,0x34,0x66,0x48,0xaf,0x06,0x5e,0xab,0x0e,0xe7,0xd8,0x0f,},\"\\x19\\x48\\x5f\\x52\\x38\\xba\\x82\\xea\\xdf\\x5e\\xff\\x14\\xca\\x75\\xcd\\x42\\xe5\\xd5\\x6f\\xea\\x69\\xd5\\x71\\x8c\\xfb\\x5b\\x1d\\x40\\xd7\\x60\\x89\\x9b\\x45\\x0e\\x66\\x88\\x45\\x58\\xf3\\xf2\\x5b\\x7c\\x3d\\xe9\\xaf\\xc4\\x73\\x8d\\x7a\\xc0\\x9d\\xa5\\xdd\\x46\\x89\\xbb\\xfa\\xc0\\x78\\x36\\xf5\\xe0\\xbe\\x43\\x2b\\x1d\\xdc\\xf1\\xb1\\xa0\\x75\\xbc\\x98\\x15\\xd0\\xde\\xbc\\x86\\x5d\\x90\\xbd\\x5a\\x0c\\x5f\\x56\\x04\\xd9\\xb4\\x6a\\xce\\x81\\x6c\\x57\\x69\\x4e\\xcc\\x3d\\x40\\xd8\\xf8\\x4d\\xf0\\xed\\xe2\\xbc\\x4d\\x57\\x77\\x75\\xa0\\x27\\xf7\\x25\\xde\\x08\\x16\\xf5\\x63\\xfa\\x88\\xf8\\x8e\\x07\\x77\\x20\\xeb\\xb6\\xac\\x02\\x57\\x46\\x04\\x81\\x98\\x24\\xdb\\x74\\x74\\xd4\\xd0\\xb2\\x2c\\xd1\\xbc\\x05\\x76\\x8e\\x0f\\xb8\\x67\\xca\\x1c\\x1a\\x7b\\x90\\xb3\\x4a\\xb7\\xa4\\x1a\\xfc\\x66\\x95\\x72\\x66\\xac\\x0c\\x91\\x59\\x34\\xaa\\xf3\\x1c\\x0c\\xf6\\x92\\x7a\\x4f\\x03\\xf2\\x32\\x85\\xe6\\xf2\\x4a\\xfd\\x58\\x13\\x84\\x9b\\xb0\\x8c\\x20\\x3a\\xc2\\xd0\\x33\\x6d\\xcb\\xf8\\x0d\\x77\\xf6\\xcf\\x71\\x20\\xed\\xfb\\xcd\\xf1\\x81\\xdb\\x10\\x7e\\xc8\\xe0\\x0f\\x32\\x44\\x9c\\x1d\\x3f\\x5c\\x04\\x9a\\x92\\x69\\x4b\\x4e\\xa2\\xc6\\xeb\\xe5\\xe2\\xb0\\xf6\\x4b\\x5a\\xe5\\x0a\\xd3\\x37\\x4d\\x24\\x6b\\x32\\x70\\x05\\x7e\\x72\\x4a\\x27\\xcf\\x26\\x3b\\x63\\x3a\\xb6\\x5e\\xcb\\x7f\\x5c\\x26\\x6b\\x80\\x07\\x61\\x8b\\x10\\xac\\x9a\\xc8\\x3d\\xb0\\xfe\\xbc\\x04\\xfd\\x86\\x3d\\x96\\x61\\xab\\x6e\\x58\\x49\\x47\\x66\\xf7\\x1b\\x9a\\x86\\x7c\\x5a\\x7a\\x45\\x55\\xf6\\x67\\xc1\\xaf\\x2e\\x54\\x58\\x8f\\x16\\x2a\\x41\\xce\\x75\\x64\\x07\\xcc\\x41\\x61\\xd6\\x07\\xb6\\xe0\\x68\\x29\\x80\\x93\\x4c\\xaa\\x1b\\xef\\x03\\x6f\\x73\\x30\\xd9\\xee\\xf0\\x1e\\xcc\\x55\\x35\\x83\\xfe\\xe5\\x99\\x4e\\x53\\x3a\\x46\\xca\\x91\\x6f\\x60\\xf8\\xb9\\x61\\xae\\x01\\xd2\\x0f\\x7a\\xbf\\x0d\\xf6\\x14\\x1b\\x60\\x4d\\xe7\\x33\\xc6\\x36\\xb4\\x20\\x18\\xcd\\x5f\\x1d\\x1e\\xf4\\xf8\\x4c\\xee\\x40\\xfc\"},\n{{0x31,0x01,0x0d,0x1d,0x67,0xeb,0x61,0x63,0x48,0xe8,0x47,0x92,0xb9,0x2d,0x5d,0xc1,0x28,0x55,0x3c,0xb5,0x2f,0x63,0x68,0x15,0x9f,0xe7,0xb8,0x16,0xcd,0x0e,0x7c,0x37,},{0x26,0x65,0x43,0xd9,0x67,0x87,0xca,0x90,0x1f,0xcf,0xf0,0x6e,0x6e,0x43,0x44,0x91,0xae,0x09,0x70,0x88,0x0a,0x5a,0x18,0x7d,0x53,0x5e,0xdb,0x19,0xdb,0x5c,0xab,0xeb,},{0x7b,0x1e,0xb6,0x77,0xc3,0xe5,0xe6,0xa8,0xb4,0xba,0x69,0xfc,0xb7,0xf6,0xb1,0x87,0x0e,0x42,0xa8,0xd5,0x89,0x58,0xa3,0x5c,0x67,0x4e,0x2d,0xb8,0x21,0x07,0x48,0x1c,0x4c,0x7b,0x37,0xf0,0xf6,0x89,0xd3,0x9d,0x9f,0x51,0xe1,0x81,0xb1,0x7b,0x11,0x08,0xc1,0x5a,0x3e,0x27,0xb2,0x9d,0xf3,0xa4,0x31,0x5d,0xcc,0x4f,0xaf,0x12,0x22,0x05,},\"\\x39\\xf8\\x9a\\x5e\\x7a\\xa5\\x30\\xb5\\x46\\x3d\\x49\\x8f\\x80\\x35\\xb9\\x90\\x9d\\x55\\xda\\x52\\x7c\\xdb\\xd4\\xde\\x6d\\x22\\x83\\x79\\xf0\\x89\\xe6\\x08\\xa9\\x20\\x7a\\x2c\\x5b\\x9c\\x42\\x05\\x1a\\x60\\xc8\\xca\\x3f\\xb9\\x7a\\x1c\\x06\\xcd\\x74\\x7d\\x9d\\x07\\x39\\x97\\x0c\\xeb\\x88\\xce\\x52\\x6f\\x97\\x11\\x40\\xea\\x2e\\xc2\\x1f\\x09\\x0b\\xa0\\x75\\xbf\\x89\\x75\\xfa\\xa5\\x08\\xb1\\xcc\\x10\\xef\\xa4\\x94\\xdc\\x17\\x2e\\x6d\\x3d\\x3f\\x3f\\x75\\xdc\\x8e\\x0e\\x96\\xf0\\x5c\\x0c\\xcc\\xb2\\xf9\\x6e\\x91\\x1c\\xfa\\x7a\\x2c\\x82\\xc9\\x84\\x50\\x18\\xbb\\x1f\\x9d\\x75\\xf8\\x2e\\x3d\\xfe\\x11\\x39\\x34\\x7b\\x2a\\xc0\\x58\\xb0\\x14\\xac\\x93\\x76\\x0c\\x90\\xf5\\x56\\x7a\\xb5\\xc4\\xeb\\xa0\\x4b\\x49\\xfb\\x09\\xdd\\xad\\xd3\\x05\\xbe\\x51\\x1d\\xfe\\x05\\xc9\\x6e\\xbc\\x86\\xfd\\x67\\xb5\\xd0\\xab\\x57\\xd8\\x5f\\x4f\\xe5\\xe2\\xf0\\xfa\\x9d\\x88\\xa6\\x8f\\x0f\\x6b\\x6b\\xc8\\xbb\\x94\\x4e\\xb3\\xc0\\xb1\\x75\\x57\\xe5\\x5d\\x5e\\xa1\\x87\\xd9\\x22\\xa4\\x28\\x13\\xe6\\x90\\x57\\xc9\\xb6\\xa7\\xf7\\x5e\\x49\\x92\\x1b\\x70\\x79\\xe5\\x8f\\x8a\\x63\\x71\\x9e\\xe3\\xe1\\xad\\x10\\xcf\\x0e\\x8a\\x70\\xc4\\xf1\\x54\\x02\\x18\\xb7\\x04\\x94\\xbd\\x02\\x9e\\xe0\\x2f\\xf9\\x72\\x7a\\x7d\\x85\\xd3\\x77\\x91\\x9e\\xc4\\x05\\x14\\x79\\xb7\\x0f\\x7c\\xd6\\x76\\x77\\x23\\xfe\\x42\\xc1\\xc7\\x89\\x9c\\x2b\\x7c\\x1f\\x70\\x2d\\xd6\\xb4\\xd1\\x3b\\x67\\x2d\\x48\\x8f\\x34\\xa0\\xe9\\x69\\xdb\\x79\\xcc\\x2c\\xb2\\x52\\x4a\\x94\\x8a\\x8d\\xe4\\xc5\\xb6\\x23\\xec\\xd9\\x0d\\x6e\\x82\\xd9\\x70\\x33\\xc1\\x25\\x63\\x7d\\x1c\\xd8\\xc8\\x48\\x03\\xd8\\xfb\\xc0\\x12\\x84\\x6f\\xfe\\x48\\x4f\\x6c\\x02\\x14\\x92\\x58\\xf9\\x46\\x2f\\xa1\\xe9\\x9c\\x30\\x7d\\xd0\\x06\\x2f\\xe0\\xb6\\xf1\\x1e\\xee\\x40\\xc2\\x62\\x9e\\xf7\\xc0\\xf6\\xa5\\x10\\x72\\x59\\xea\\x5b\\x9f\\xfb\\x6f\\x29\\xf1\\x2c\\x32\\xf7\\xb5\\x22\\x8c\\xab\\xc9\\x86\\xab\\x66\\x45\\x0a\\xf9\\xdc\\xc3\\xda\\x09\\xd0\\xe0\\xb9\\xa4\"},\n{{0x8f,0xf2,0x39,0x8c,0xd5,0x1f,0x51,0xd4,0xc2,0xc5,0x78,0x69,0xa2,0x21,0x8b,0x84,0x86,0x82,0x20,0x31,0xf4,0x00,0x72,0x9f,0x4a,0xc4,0xd5,0x90,0x9c,0x48,0xba,0xfe,},{0xa5,0xa8,0x87,0x04,0xb6,0x86,0x77,0xbe,0x3d,0x16,0xc3,0xdc,0x00,0x52,0xcf,0xee,0x6e,0x2b,0x30,0xe0,0x86,0x09,0x05,0x9d,0x4c,0xba,0x52,0xc6,0xd9,0x60,0x61,0xfb,},{0x41,0x7a,0x64,0x78,0x29,0xc9,0x28,0x98,0xe5,0x20,0xff,0x53,0x11,0xda,0xa0,0xa1,0x39,0xcd,0x8f,0xff,0xcb,0x25,0xa1,0x8e,0x6d,0x9b,0x50,0xcb,0x52,0xcb,0xc3,0x54,0x24,0xc3,0x9e,0xbb,0xb5,0xd5,0xac,0x6a,0x6d,0x63,0xf1,0xf5,0x3c,0x4d,0xf2,0x12,0xf7,0x02,0x5a,0x8a,0xae,0xf8,0xe3,0x64,0x93,0xc8,0x74,0xc3,0xce,0x34,0x1a,0x0e,},\"\\x99\\x39\\x53\\xe4\\x7a\\x34\\x11\\x88\\xbc\\x59\\x29\\x42\\xe1\\x55\\x7a\\xf2\\x95\\x46\\xe4\\xe9\\x36\\x8e\\x2f\\x1a\\x5e\\xe9\\x80\\x6e\\x2b\\xaf\\x66\\xb6\\x19\\x01\\x91\\xfc\\x5d\\x2b\\x7e\\x47\\xde\\x37\\xff\\x05\\x4f\\xb2\\xbb\\xb1\\xf0\\x31\\x68\\x4a\\xda\\x5d\\x60\\x7a\\xdd\\xa3\\xd6\\x54\\x33\\x12\\x2f\\xa9\\x04\\xe0\\x45\\x6f\\xaa\\x84\\x10\\x9b\\xbc\\x51\\x7f\\x8a\\xd3\\x96\\x60\\x87\\x63\\x82\\xad\\xcf\\xed\\x0f\\x76\\x20\\xcf\\x11\\x64\\x62\\x2e\\xac\\xd9\\x1e\\xb3\\x7a\\x85\\x96\\x46\\x2e\\xbe\\x9e\\xbe\\x26\\xbd\\xc1\\xe3\\x2c\\xc3\\x4a\\xd4\\x6f\\xb1\\xce\\xa4\\x20\\xe7\\x3c\\x31\\x21\\x54\\x08\\xe6\\xd3\\x54\\x25\\xf4\\x4a\\x82\\x9b\\x13\\x2f\\x63\\x1a\\x3f\\x6d\\xd4\\xb8\\x73\\xa0\\x00\\x66\\x7e\\x19\\xeb\\x22\\xff\\xfd\\x59\\x03\\xaa\\xa7\\xd4\\xc8\\xfd\\xf2\\x19\\x53\\xc3\\xc6\\x17\\x8f\\x5f\\x8c\\xb2\\xaa\\x6b\\xff\\x92\\x89\\x4e\\xad\\x83\\x58\\x88\\xdf\\x06\\x0a\\x3c\\x90\\x43\\x02\\x6e\\x0e\\x2c\\xef\\x27\\x54\\x97\\xe7\\xd1\\x05\\xdf\\x3b\\x64\\x4a\\x98\\xf2\\x6b\\xf0\\x01\\x05\\xc9\\x94\\x13\\xee\\x0a\\xf8\\x85\\x19\\x54\\xd6\\x5c\\xeb\\x8d\\x79\\xad\\x30\\x71\\xb8\\xbb\\x87\\xf0\\xb1\\x97\\x43\\xd2\\x55\\x6f\\xfd\\x98\\x19\\x83\\x0b\\x6e\\xeb\\xf7\\xec\\xc7\\xe0\\x45\\x66\\x1f\\x43\\x57\\x0c\\xe9\\xfd\\xbb\\xe2\\xd2\\x52\\x40\\x6f\\xa9\\x0d\\x04\\x23\\x6f\\x22\\x2c\\x42\\x9e\\xc1\\x6b\\x12\\x87\\x22\\x4a\\xda\\x1a\\x53\\x21\\x61\\xae\\x8b\\x48\\x1b\\xca\\xb8\\xd4\\x7a\\xfb\\x3e\\xd0\\x44\\x5b\\x30\\x60\\xfd\\x67\\x59\\x17\\x98\\x56\\xf4\\x08\\x5c\\x1e\\x58\\x5f\\xd7\\xc1\\x40\\x97\\x99\\xaf\\x69\\x3c\\xf4\\x27\\xbd\\x1d\\x3d\\xc1\\x0b\\x5a\\xe3\\x44\\x7a\\x8d\\x2a\\x18\\xdc\\x3a\\x12\\xa6\\x86\\x0b\\x22\\x17\\x5d\\xd5\\xeb\\x53\\xa0\\x95\\x04\\x32\\xe2\\xd7\\xae\\xfe\\xce\\x8a\\xf0\\xad\\xe3\\xd8\\x56\\x77\\x43\\xde\\x43\\x69\\x0f\\x2d\\x25\\x37\\x23\\xc5\\xd7\\xe4\\x8b\\xd3\\x0d\\x29\\x37\\x59\\x37\\x01\\xce\\xcd\\xe9\\x15\\x4b\\x76\\x65\\xcb\\x61\\x1d\\x7d\"},\n{{0xef,0x81,0x6c,0x8f,0x5e,0xc3,0x4e,0xf4,0x1f,0x68,0x83,0x1d,0x90,0xcd,0x29,0xe5,0x2d,0xe8,0x97,0x37,0x82,0xd0,0x03,0xee,0x4e,0xda,0xda,0x2a,0xda,0x26,0x91,0xd6,},{0x47,0xf9,0xb3,0x63,0xa8,0x8a,0x45,0x05,0x3a,0x05,0xbb,0x72,0x16,0x08,0x52,0xbf,0xe8,0xf7,0xdf,0xef,0xc2,0xf3,0x72,0x83,0xde,0x34,0x67,0x52,0xca,0xf0,0x92,0xcc,},{0x65,0xc5,0xd1,0x0e,0xa7,0xbf,0xdb,0xb3,0x8d,0x55,0x36,0x4a,0x99,0x68,0xf8,0x2b,0x54,0x82,0x24,0xdf,0xf3,0x36,0x3b,0x2d,0xdc,0xf5,0x85,0x16,0x3d,0xea,0x27,0xdc,0x63,0xb0,0x56,0x3e,0xb1,0xa8,0xdf,0xbe,0xe9,0x51,0xd3,0xc9,0xb3,0x3f,0xcd,0x6b,0xbf,0x09,0x21,0xc3,0xab,0xb2,0x17,0x86,0xb2,0x29,0x06,0x9b,0xd9,0xca,0x00,0x0a,},\"\\x95\\x93\\xc3\\x5c\\xde\\xc5\\x35\\xbe\\xbb\\x69\\x65\\xda\\x68\\xea\\xb0\\xb6\\x46\\xbf\\xfc\\xfb\\xd0\\x48\\x83\\xbc\\x4c\\xef\\x90\\xd5\\xd0\\x1f\\x01\\x8c\\x63\\xc9\\xb0\\xdd\\xfb\\x3c\\xef\\x5e\\x78\\x62\\x84\\xd5\\x21\\x8c\\xaa\\xaf\\x06\\x0e\\x92\\x88\\x95\\x2f\\x16\\x30\\x1e\\xd8\\xa4\\xc1\\xbc\\xee\\x25\\x63\\x56\\xa0\\xc8\\xbd\\xa3\\x59\\xfb\\xaa\\x27\\x82\\xb1\\x0c\\x86\\xd1\\x8e\\x20\\xf7\\xa0\\xec\\x99\\xb2\\x7a\\x0b\\x4d\\xbe\\xfc\\x0a\\x26\\x2a\\x3b\\xf6\\x8f\\xe8\\x14\\x44\\xdc\\xae\\x5f\\x69\\x3e\\xb0\\xf1\\x6e\\x6e\\xe0\\x3f\\x8f\\xcb\\xf3\\xa3\\x39\\x81\\x46\\xd2\\x0e\\xc4\\xd2\\x65\\x77\\x61\\xfd\\x03\\x20\\xfe\\xe7\\xea\\x70\\x3c\\x49\\xa6\\xa5\\x43\\xbc\\x9b\\xba\\x91\\x1e\\x79\\x25\\x03\\x87\\x10\\xe8\\xc3\\x65\\x52\\xd4\\x76\\xd6\\x02\\x7f\\x58\\xb2\\xc5\\x2b\\xa5\\x1a\\xd6\\x5e\\xa4\\xf0\\x39\\xc7\\x8f\\x96\\xb8\\x89\\x10\\x2b\\xb4\\xbd\\xd6\\x9b\\x68\\xe9\\xc3\\xd4\\x5b\\x51\\x76\\xa2\\xd8\\x2b\\x0b\\x95\\xdc\\x32\\x10\\x16\\x37\\x0d\\xae\\x30\\xc3\\x93\\x65\\x15\\xdb\\x04\\x64\\xc4\\x17\\x74\\x30\\x1c\\x74\\xe4\\x2d\\x89\\xb8\\xbf\\x4b\\x9c\\x19\\xed\\x55\\x4b\\x12\\xfe\\xba\\xc0\\xf6\\x0d\\xdb\\x32\\x19\\xcc\\xc5\\x60\\x35\\x31\\xdb\\xf2\\xeb\\x5f\\x29\\x34\\x25\\xd7\\x2c\\xce\\xfa\\x0c\\x7f\\x14\\x4a\\xba\\x89\\x34\\x7b\\x29\\x6b\\xe8\\x7f\\xf1\\x89\\x94\\xb4\\xa0\\xc7\\x0c\\x93\\x0f\\x05\\x93\\x03\\xb5\\xdd\\x4c\\x8f\\xe1\\xe6\\xbb\\xc3\\xcd\\x68\\xc6\\xc0\\xd8\\x42\\x46\\xdc\\x6e\\x61\\x40\\xa2\\xab\\xd1\\x78\\x0b\\x13\\xf1\\x59\\x4a\\x60\\x19\\xd1\\x77\\x8b\\x7c\\xbb\\x3a\\x3e\\x3a\\x34\\xbf\\xae\\x72\\x97\\xf0\\xb3\\xed\\xc3\\x76\\x94\\x1c\\x32\\x35\\x2a\\x4b\\xe3\\x14\\xb8\\x4a\\x9d\\x8d\\x6d\\x7f\\x1f\\x38\\xa0\\xad\\x37\\x98\\x02\\x0a\\xa2\\xa3\\x31\\xa4\\x02\\xbe\\x9c\\x70\\x44\\x84\\x74\\x4a\\x73\\x0c\\xbd\\xed\\xcb\\x90\\x4b\\x6f\\xde\\x70\\x8f\\xbd\\x14\\xbf\\xdc\\x29\\xef\\xd4\\x61\\xd1\\xd0\\xb5\\x82\\x5d\\xe0\\xbc\\x79\\x42\\x2b\\x69\\xa2\\x72\\x2f\"},\n{{0x45,0xeb,0x0c,0x4d,0xfa,0xfa,0x2a,0x76,0x90,0xef,0x57,0x9c,0x09,0x54,0x56,0xce,0xed,0xcd,0x32,0xf0,0xb6,0x14,0x4d,0x0c,0x38,0x0f,0x87,0xfb,0x74,0x4a,0x0b,0x1f,},{0xfc,0x85,0x63,0x2c,0x98,0x38,0x4b,0x5f,0x96,0x82,0xae,0xd9,0xcd,0x66,0x4c,0xf1,0xf4,0x8e,0x58,0x8b,0xe2,0xd5,0x68,0xe5,0xc7,0x34,0x49,0x4d,0xf4,0xc7,0x12,0xb8,},{0x55,0x85,0x1d,0xe8,0xe1,0x09,0x2f,0x78,0x94,0x4f,0x6c,0x6d,0xd9,0x5b,0xf0,0x7e,0x2d,0xbc,0x8d,0xf7,0xf5,0x7a,0xd5,0x76,0x82,0x9b,0x97,0x8e,0x3a,0xf5,0x8a,0x7a,0x8e,0x94,0xed,0x4d,0xcc,0xbc,0x01,0x82,0x46,0x7e,0xdf,0x0b,0xad,0x4b,0xae,0x7c,0xa8,0x4a,0xa9,0xa0,0xc1,0x7c,0x61,0xa9,0xe0,0xdd,0xff,0x1d,0x75,0x25,0xd7,0x04,},\"\\x6f\\x66\\xd8\\x47\\x40\\x5a\\x03\\xd7\\xbd\\x6f\\x8d\\x28\\x97\\xdb\\xdf\\x04\\xe7\\x6d\\x7d\\xf2\\xd9\\x47\\x0a\\x49\\x96\\xb7\\xdd\\x6d\\xb8\\x85\\x00\\xf8\\xf4\\xf8\\x3e\\x96\\x0e\\x21\\x9a\\x24\\x86\\xe2\\x45\\x45\\xad\\xd1\\x36\\x14\\x55\\x04\\x14\\xd8\\x27\\xc4\\x1a\\x9b\\x08\\x31\\x8d\\xaf\\x01\\xb1\\x52\\x14\\xc6\\x4a\\x42\\x66\\xcb\\xf8\\xa5\\x71\\x7a\\xda\\x3e\\x62\\xc2\\x67\\x29\\x07\\x3e\\x16\\xdd\\xbd\\x66\\xf2\\xd5\\x20\\xe1\\xe0\\x99\\x35\\xde\\x05\\xe4\\xdb\\x11\\xc3\\x96\\xd4\\x77\\x01\\x0a\\xec\\x66\\xaa\\xfb\\x76\\x2e\\x69\\x23\\x8d\\x0b\\x9e\\x76\\xb4\\x52\\x45\\x4b\\xf9\\xe4\\x51\\xe7\\x6a\\xc7\\x9e\\x69\\x90\\xd4\\x1b\\x93\\x2b\\xc3\\x29\\x17\\x09\\x37\\x83\\xc9\\x1b\\xc9\\xcf\\x0b\\xbe\\x3b\\x51\\x40\\x70\\xa1\\xe6\\x92\\xff\\x34\\xfd\\x06\\xb6\\x6e\\xa1\\x1f\\x39\\xe1\\x0a\\xf9\\x33\\xee\\x96\\xd8\\xe9\\xb6\\x77\\xcb\\x03\\x73\\x7e\\x79\\x64\\xee\\xaa\\x72\\x5f\\x12\\x12\\x07\\xf9\\xc1\\xb2\\x6a\\x96\\xc6\\x16\\xdf\\x7c\\xb7\\xca\\xef\\x47\\xbd\\xa9\\x01\\x36\\x8f\\xf2\\xea\\x58\\x6e\\x42\\x2e\\x65\\xbf\\x21\\xa6\\x91\\xbd\\xd2\\xc1\\x3e\\x67\\xff\\xf5\\x8c\\xfb\\xfe\\xd8\\x17\\x82\\x04\\x9d\\xaf\\xa0\\xf7\\x27\\xdf\\x88\\x62\\x3f\\x2f\\x7e\\x8f\\x26\\x2d\\xaf\\x93\\x95\\x42\\xa1\\x87\\xb8\\x72\\x0a\\x9b\\x6b\\x2b\\x09\\x89\\x0e\\x54\\x87\\x6b\\x28\\xa4\\x38\\x74\\xab\\xbe\\x3b\\xfa\\x98\\x1f\\x81\\x38\\xb7\\x72\\xc5\\xd5\\x17\\x36\\x88\\x5f\\x86\\xac\\xac\\x22\\x15\\xa0\\xb0\\x10\\xdf\\xc2\\xc6\\xb1\\x50\\x84\\x5d\\x4f\\x82\\x96\\x25\\x25\\x86\\xa3\\xe1\\x15\\xf3\\x03\\xc3\\xd8\\xa5\\x82\\xe2\\x0f\\xd2\\xd4\\x3f\\x6c\\x44\\x6e\\x5d\\x00\\x28\\x0e\\xc1\\x79\\x82\\x3b\\x7f\\xb4\\xc1\\xb0\\xfe\\xb9\\x4e\\xb4\\xef\\x17\\x07\\xf5\\x18\\x4e\\x3b\\x52\\x46\\x1a\\x75\\x62\\xd1\\xf3\\x07\\xcb\\x75\\x1c\\xdb\\xbf\\x6e\\xae\\x49\\xff\\xae\\x91\\x86\\x23\\x58\\xe7\\x4e\\x95\\x48\\x82\\x2b\\x8a\\x04\\x9f\\xec\\x6b\\xf4\\xc7\\xa9\\x9c\\xab\\xbe\\x09\\x20\\x65\\x77\\xb6\\x57\\xe3\\x1f\"},\n{{0x70,0x9d,0x2e,0x19,0x90,0x06,0xf5,0x36,0x9a,0x7a,0x0b,0xdd,0x34,0xe7,0x4d,0xc7,0x84,0xbe,0x33,0x88,0x0e,0xa3,0xc5,0xdd,0x10,0xed,0x5c,0x94,0x45,0x1e,0x79,0x72,},{0x06,0xf9,0x89,0x20,0x2b,0xa2,0xcb,0xc9,0xc1,0x50,0xbe,0x61,0x12,0x62,0xac,0xa0,0x0c,0x45,0xf0,0x12,0xf8,0x9f,0xba,0xf8,0x9f,0x8c,0xec,0xcb,0xa0,0xb1,0x93,0x4a,},{0x62,0x9b,0xf9,0x7b,0x0c,0x78,0xee,0x6a,0x9c,0x87,0x59,0xfb,0xea,0x28,0x22,0x4e,0x27,0xab,0xbb,0x6c,0xbe,0x4d,0xea,0x5b,0xb7,0x97,0xe6,0xe0,0xfe,0x80,0xc9,0x13,0xf9,0x53,0xe3,0xa9,0xb6,0x23,0x35,0x2d,0x13,0xac,0xf4,0xce,0x62,0x50,0xfb,0x02,0x9a,0x1e,0x19,0x8d,0x72,0xbd,0x5e,0x74,0x02,0xe6,0x0e,0x9e,0x48,0xca,0x35,0x01,},\"\\x62\\xf0\\x03\\x14\\x0f\\xa0\\x9e\\x03\\x87\\xd1\\x87\\xa0\\xff\\x96\\xc4\\x56\\x3d\\xf9\\xf4\\xe2\\x8c\\x22\\x82\\xc0\\x18\\x3a\\xc3\\xee\\xde\\x13\\x12\\x35\\x49\\x21\\xf7\\x80\\xfc\\xa5\\x36\\x1d\\x30\\x68\\xd2\\x99\\x49\\x63\\x0b\\x75\\x30\\xcd\\x59\\x14\\xac\\xe0\\x46\\x8d\\x01\\x4b\\x6f\\x53\\xd8\\x39\\xb8\\x2e\\x38\\x81\\x7d\\xbf\\x2d\\x83\\x92\\xc3\\xce\\x34\\x24\\xea\\xb8\\x6a\\x24\\xd8\\x04\\xc7\\xac\\xb1\\xce\\x7a\\xcf\\xe0\\xa1\\xcd\\xa4\\x39\\x39\\x24\\x28\\x31\\x05\\xda\\x4a\\x77\\x41\\x19\\x6e\\x02\\x75\\x50\\x04\\x7f\\x85\\xb7\\xa0\\xa0\\x1d\\x45\\x41\\x24\\xef\\xc0\\xe2\\x99\\xf0\\xef\\x9a\\xd1\\x43\\x50\\x54\\x30\\x53\\x48\\x22\\x61\\x52\\x8b\\xaa\\x56\\xe6\\x59\\x99\\xac\\x80\\x2c\\x00\\xa3\\x36\\x26\\x7c\\x63\\x51\\x06\\xb2\\x64\\x03\\xc1\\x9f\\x39\\x1d\\x53\\xbd\\x82\\x86\\x1d\\x6d\\x48\\xa4\\x38\\x0b\\x30\\x43\\xaa\\x91\\xd6\\x49\\x53\\x68\\x81\\x20\\x4e\\xcc\\xb0\\xde\\x20\\xd4\\x3e\\x5a\\x37\\x55\\xb7\\xf6\\x00\\x91\\x6e\\xcc\\xae\\x42\\xa0\\xc9\\x05\\x3b\\x46\\x2d\\x94\\x17\\xa1\\x3d\\x67\\xd7\\x78\\x26\\x4a\\x89\\x6e\\x8e\\xaf\\x90\\xba\\xf6\\x6d\\x29\\xe5\\x43\\x8a\\x71\\x67\\x81\\x12\\x3a\\x89\\xfa\\x9b\\x8b\\xee\\xf9\\x1d\\x96\\x5a\\xf2\\xf4\\xa1\\xa5\\xbd\\x5d\\x2e\\x2a\\xaf\\x46\\xd5\\xc9\\x4b\\x77\\x09\\xcd\\xd3\\x8d\\x05\\xfe\\xee\\x4b\\xfb\\x76\\xa3\\x59\\x07\\x7c\\x16\\xbc\\x4b\\xe9\\x11\\x6e\\x69\\x00\\x12\\x71\\xcd\\xa5\\x65\\xbc\\x19\\xbf\\x47\\xd4\\xf9\\x86\\xbd\\x9c\\x0d\\x18\\x4c\\xd8\\xa3\\x52\\x0c\\xa1\\xbd\\xb4\\xb5\\x05\\xaa\\xf7\\xcb\\x4e\\xc9\\xf9\\x47\\x89\\x77\\x9d\\x30\\x71\\x4e\\x79\\x11\\x6d\\xd5\\x01\\x9d\\x59\\xb2\\x8b\\x17\\xda\\xd9\\x6f\\x4e\\x21\\x55\\xad\\x9c\\x61\\x27\\x4a\\xdd\\xc6\\xb6\\x38\\x10\\x95\\x04\\xe9\\xed\\x19\\xf4\\xed\\xa5\\x37\\x77\\x62\\x64\\x8c\\x40\\x98\\x22\\x4e\\x33\\x91\\x04\\x3e\\x4c\\x2a\\xd5\\x91\\x65\\x4c\\x9e\\x7f\\x97\\x4e\\xfd\\xf0\\xb0\\x50\\x4b\\x6f\\xa5\\xf6\\x46\\xce\\xcf\\x44\\xcd\\x37\\x24\\x12\\x37\\x25\\x05\"},\n{{0x51,0x51,0x61,0x74,0x21,0xaa,0xdc,0x9c,0x95,0xa4,0x42,0xb4,0x5e,0x7f,0xf6,0xde,0x06,0xa2,0xc7,0x33,0xb8,0x5b,0xd7,0x89,0xfb,0xad,0x41,0x4e,0xe3,0xc9,0x1a,0xdd,},{0x14,0x94,0x1d,0x55,0x97,0x61,0xb3,0x0a,0xb0,0xa8,0x6d,0x47,0xe0,0xf7,0xd1,0x89,0x6b,0x33,0x78,0x45,0x27,0xc8,0x0a,0xf4,0x1c,0xb8,0x48,0x10,0xcb,0xff,0x9d,0xbf,},{0xfa,0xe4,0x77,0x3b,0x33,0x44,0x60,0xc7,0x7b,0xf0,0x1e,0xc6,0x36,0x6c,0x4f,0xe6,0x1c,0x0c,0xab,0x57,0xd8,0xa4,0xb0,0x39,0x09,0xc6,0x19,0xe1,0x1e,0xe3,0x46,0x1c,0x13,0xfa,0x21,0x57,0x6f,0x63,0x87,0x0e,0x42,0x3d,0xd0,0x41,0x81,0xe4,0xa7,0x01,0x3a,0x75,0x24,0xf2,0x46,0xfe,0x33,0x85,0x3c,0x67,0x41,0x62,0xa7,0x81,0x51,0x04,},\"\\x21\\x6e\\x9d\\x40\\xbc\\xdc\\x3b\\x26\\x50\\x18\\x8d\\x12\\x1c\\x9f\\x8e\\xf2\\x9e\\x91\\x4f\\xac\\xd0\\x22\\xfe\\x01\\xb9\\x0e\\xd1\\x12\\x25\\xf2\\xeb\\x93\\x53\\x8e\\x5f\\xce\\xe5\\xab\\x80\\x45\\xe9\\x19\\x9a\\xa7\\x6a\\x16\\xbd\\xd0\\x61\\x68\\x05\\x66\\x0e\\x24\\x7f\\xec\\xd7\\xe2\\x28\\x21\\xb6\\x9b\\x1f\\x8e\\x8a\\x58\\xac\\x3f\\xb8\\x56\\x91\\xd7\\x5d\\x59\\x57\\xa1\\xda\\xf5\\x3f\\xf9\\xee\\x64\\x76\\xd7\\xc4\\xbc\\x54\\x1e\\x6a\\xd3\\x8e\\x3a\\x34\\xea\\x90\\xfc\\x52\\xa4\\x8b\\x93\\x99\\xf9\\x2d\\x17\\xc9\\xbb\\x0d\\x7f\\xc3\\x10\\x4c\\x55\\xd0\\xef\\xb4\\xea\\x5b\\x83\\x1f\\xf9\\x49\\x0b\\x3f\\x79\\xf4\\xd9\\xd6\\x99\\x59\\x4b\\x74\\x15\\x66\\xf2\\xb5\\x0a\\x8f\\xc7\\x8c\\xc4\\x03\\xfa\\x40\\xf5\\xab\\xb6\\x63\\x8a\\x32\\xf4\\x49\\xa8\\xb3\\xef\\x02\\x9c\\x40\\x2f\\x46\\x93\\x1a\\xd2\\xbd\\x3e\\x8e\\x68\\x31\\x08\\x71\\x4c\\x98\\x9a\\xe2\\x16\\x89\\xe9\\xc4\\x44\\xb9\\xf5\\x5b\\x81\\x11\\x9b\\xb5\\x03\\x5b\\xcf\\x73\\xe9\\x7c\\xe4\\x3a\\x22\\x18\\xc7\\xbc\\x3e\\x43\\x0d\\x1e\\x81\\x4f\\x34\\xde\\xe0\\x57\\x26\\x5d\\x31\\x94\\xb9\\xf4\\x38\\x75\\xd8\\x38\\x1f\\x52\\x5f\\x78\\x57\\x6e\\x64\\xce\\x69\\x25\\x84\\xfa\\xa3\\x0f\\xb7\\x43\\xa1\\x2d\\x1b\\x77\\x61\\x4d\\x2e\\x10\\xa6\\xb8\\x56\\xb5\\x2b\\xe2\\x7c\\xdb\\x63\\x0b\\xa1\\xf0\\xd3\\xa6\\xf8\\xea\\x98\\x44\\x54\\x2e\\x58\\x4e\\xa0\\xa2\\x77\\x75\\x27\\xd0\\xc5\\x2a\\xca\\x94\\x9a\\xac\\xda\\x45\\xad\\x83\\xd1\\x6d\\x5c\\x83\\xd6\\x63\\xad\\xb7\\x9c\\xad\\x6f\\x3e\\x39\\xe9\\x90\\xfe\\x28\\x2a\\x14\\xc3\\x53\\xaa\\x23\\x79\\xd7\\xf0\\x6a\\xda\\xb7\\x4c\\xea\\x02\\x1b\\x89\\x83\\xa5\\x7f\\x1d\\x0c\\xf7\\x03\\x29\\x2e\\xb0\\x5e\\xce\\x89\\xc5\\x3f\\x3a\\x12\\x65\\x61\\x0e\\x0c\\x1e\\xa8\\xdd\\xd4\\x44\\xd1\\xff\\xd6\\xbc\\x3d\\x03\\xf0\\xa6\\xe4\\xd0\\xdf\\x5c\\x5b\\x8d\\xc1\\xf9\\x5d\\x9f\\x55\\x58\\xb1\\x18\\xaf\\xe6\\xbe\\xa0\\xf6\\xc2\\x93\\x13\\x63\\xf0\\x3a\\xb3\\x4e\\x75\\x7d\\x49\\x36\\x41\\x74\\xf6\\x58\\xef\\xbb\\xf3\\x8d\\xc1\\x77\"},\n{{0x38,0xbe,0xd4,0x45,0x55,0x6d,0xe7,0x44,0x82,0xbf,0x5f,0xec,0x05,0x06,0xf9,0xaf,0x33,0x0b,0x15,0x1e,0x50,0xd4,0x77,0x4d,0xfe,0x85,0x91,0xd7,0xb7,0xe0,0x27,0x6b,},{0x4c,0x0f,0x9c,0x49,0xa4,0x2f,0x40,0x47,0xbf,0xe6,0x88,0x55,0x51,0xc5,0xe4,0xb8,0x56,0xcf,0x77,0x1a,0x67,0xaf,0x3f,0x89,0xdb,0xf6,0x02,0xf9,0xdb,0x92,0x20,0xf3,},{0xf7,0x02,0xd0,0xd4,0x63,0x28,0x2f,0xc7,0xfd,0x5f,0x8f,0x90,0x29,0xb8,0x9c,0x62,0x6c,0xaf,0xd8,0x34,0x50,0xc3,0xbb,0x9d,0xd8,0xf6,0x58,0x9f,0x0c,0x4b,0x4b,0x71,0xf6,0x49,0xea,0x21,0x2e,0x5e,0x33,0x48,0x7c,0x59,0xc1,0x68,0xea,0x3a,0xd8,0x31,0x50,0xf1,0xfc,0xdf,0xe8,0xc5,0x3e,0xba,0x65,0xad,0xc2,0x02,0x3c,0x25,0x83,0x0f,},\"\\x0f\\xf0\\x03\\x1d\\xf0\\xbe\\xef\\xf3\\x71\\x0c\\x6b\\x76\\x3f\\x9b\\x8e\\xc8\\x17\\x19\\xbf\\xa1\\x52\\x8c\\xe4\\x65\\x19\\xad\\xf3\\xd3\\x41\\x2d\\x93\\xfb\\x18\\x8f\\xd4\\x97\\xd5\\xd1\\x70\\x91\\xc0\\xf0\\x34\\x59\\x60\\xdd\\x0e\\xb0\\xc0\\x9f\\xc4\\x00\\x51\\x73\\x66\\x5d\\x4d\\x97\\xf9\\x5c\\x13\\x82\\x8b\\xc7\\x6b\\x34\\x92\\xb8\\x7a\\x4b\\x64\\x25\\x3c\\x8b\\x5f\\xa4\\x7a\\xa7\\x5f\\xa3\\xb8\\x6d\\x5a\\xbe\\xea\\x8d\\xe5\\x95\\x9a\\x60\\x22\\x89\\x13\\x6f\\x60\\xa6\\x9b\\x30\\x9e\\x77\\x3b\\x22\\x55\\xcd\\xe1\\x9e\\xd2\\xa2\\xe1\\x99\\xc3\\x3d\\xb1\\x1c\\x16\\xad\\xe0\\x8a\\x31\\x97\\x50\\xb8\\x51\\xd9\\x2c\\x69\\x29\\x24\\xfc\\x98\\x59\\xbe\\x52\\x34\\x31\\xcb\\xe7\\x8e\\xc0\\x92\\xdb\\x11\\x29\\x21\\x0e\\xbb\\xea\\xa7\\xc2\\xa2\\xc0\\x00\\xee\\xb1\\x05\\xca\\x03\\x01\\xa4\\x8f\\x3e\\x45\\xfd\\xfb\\x15\\xb2\\x75\\xcb\\xab\\x83\\xca\\x5c\\x99\\xd7\\x37\\xa5\\x85\\x32\\x0e\\x9e\\x3b\\x31\\x71\\x79\\xbd\\x86\\x46\\x7f\\xa9\\x69\\x4f\\xcd\\xb2\\xac\\x6a\\xd3\\x6e\\xd7\\x14\\x48\\x43\\xdb\\xc3\\x4e\\x42\\x3d\\x35\\xaf\\xd7\\xd8\\x97\\x2a\\x1c\\x43\\xc1\\x99\\xa1\\x91\\xab\\xd6\\xce\\xba\\x49\\x36\\xd3\\x95\\xc9\\x95\\xa3\\xeb\\x13\\xcb\\x05\\x7f\\x88\\xa9\\xdc\\x94\\x90\\xfe\\x98\\x84\\x5e\\xe5\\xd2\\x6a\\x89\\xfb\\x64\\x2a\\x2a\\x51\\x6d\\xc3\\x05\\x6c\\x54\\xd3\\x63\\x72\\x13\\x36\\x3a\\x86\\x28\\xa4\\x2a\\x39\\x5d\\x94\\x2b\\x95\\x4a\\x89\\xe8\\xef\\x7a\\x74\\x4d\\x8a\\xe5\\xad\\xac\\x88\\xc6\\x16\\xef\\xaa\\x90\\xe2\\x07\\x72\\x05\\xa6\\x0b\\xaf\\xfe\\xde\\x5c\\x87\\xbb\\x14\\xde\\xad\\x30\\x62\\x29\\x49\\x5f\\x69\\x8f\\x3e\\x49\\x06\\x16\\x96\\x6b\\x16\\x36\\x38\\x7d\\x0d\\x86\\x18\\x3f\\x94\\x5b\\x24\\xa9\\xdc\\xfc\\xcf\\x4d\\x36\\x72\\x2c\\xd1\\x2e\\xbb\\x6b\\xd8\\xe7\\x83\\x25\\x75\\x2a\\xfa\\x2b\\x1a\\xbd\\x13\\xc4\\xbd\\xbc\\xad\\xd1\\x70\\x86\\x91\\x36\\x82\\x62\\x42\\xac\\xfb\\x72\\x1d\\xe5\\xff\\x27\\xba\\x8a\\xa0\\xc0\\x18\\xb2\\x25\\xed\\x34\\x04\\x80\\x3c\\xe9\\xfa\\x2d\\x50\\x8d\\x89\\x44\"},\n{{0x05,0x54,0x60,0xb3,0x2d,0xd0,0x4d,0x7f,0x4b,0x23,0x11,0xa8,0x98,0x07,0xe0,0x73,0xfd,0x55,0x65,0x65,0xa4,0x77,0x18,0x57,0xd8,0x82,0x79,0x41,0x30,0xa2,0xfe,0x5d,},{0x26,0x0f,0x8f,0xed,0x4b,0xba,0x30,0xb9,0xe1,0x2a,0xd8,0x52,0x3f,0xbb,0x6f,0x57,0xf0,0xa7,0xa8,0x82,0x55,0x00,0x61,0xf1,0xda,0x46,0xfb,0xd8,0xea,0x44,0x22,0x21,},{0x23,0xf4,0xf1,0x62,0x7f,0xba,0xbd,0x78,0x91,0xd7,0xd8,0x48,0x96,0x31,0xc7,0x23,0x1d,0x22,0xde,0x71,0x86,0x4e,0x26,0x2a,0xb4,0xda,0x84,0xea,0x8a,0x13,0xa6,0x0f,0xea,0xc4,0xdc,0xfb,0x18,0x12,0xf1,0x20,0x04,0x44,0xb7,0x75,0xf1,0x21,0xd7,0x26,0x6d,0x75,0x5c,0xe9,0xb6,0xa9,0xad,0x79,0x65,0x59,0xc0,0xa2,0x6b,0x51,0x6d,0x02,},\"\\x74\\x07\\xf9\\x6e\\xe3\\xe7\\x9c\\x69\\xd3\\x6c\\xe1\\xf6\\x4e\\x4f\\x18\\x86\\x55\\xea\\x68\\xb9\\x47\\xe7\\xe2\\xbe\\x97\\xb0\\x5e\\xbc\\x6d\\x44\\x39\\xe9\\x50\\x27\\x6e\\xf3\\xf0\\xe6\\xa0\\x3d\\xd4\\x8b\\x24\\xf6\\x69\\x29\\xb4\\x9c\\x15\\x80\\xeb\\x46\\x88\\x07\\xe1\\xe7\\xa2\\x5e\\xb9\\xb9\\x4d\\xa3\\x40\\xc5\\x3f\\x98\\x4f\\x8b\\x81\\x60\\x3e\\xfb\\x61\\x04\\x7b\\xf3\\xf1\\x4b\\x68\\x6d\\x97\\x98\\x00\\x3d\\x2f\\x68\\x58\\x9a\\x79\\xeb\\xfa\\xd5\\x44\\x09\\xc7\\x1c\\x90\\xff\\x67\\xc1\\x1f\\xbd\\x76\\xcc\\x72\\xc2\\xd1\\x45\\xf4\\x58\\xe4\\x2f\\x88\\xb7\\x5d\\x25\\x0e\\xad\\xca\\xfe\\x66\\xbf\\x37\\xff\\xc8\\x37\\xb6\\x2f\\xf0\\x06\\x68\\x5b\\x7f\\x85\\xa9\\xd8\\x75\\xfc\\x07\\x8c\\x82\\xe6\\x1f\\xe3\\x5d\\x19\\x22\\x52\\x7a\\x55\\x1d\\xab\\x62\\xf9\\xe4\\x77\\x49\\x91\\x46\\xba\\xd9\\x12\\x20\\x3e\\x66\\x4c\\x41\\x7c\\x36\\x79\\xc0\\x2d\\x87\\x2a\\xba\\xc0\\x03\\x2f\\x8c\\xc7\\x7f\\x77\\xbf\\xe5\\x4d\\x33\\x26\\xfd\\xee\\x92\\x76\\xa4\\x8e\\xa4\\xeb\\x25\\x13\\x50\\x40\\x68\\x82\\xd0\\x8c\\x83\\x0e\\x76\\x49\\xfe\\x68\\x54\\x55\\x8a\\x75\\x13\\xab\\x2d\\x8d\\x2a\\xc3\\xe5\\xce\\xd8\\xa8\\x08\\xd2\\xae\\xe4\\x54\\x77\\x9e\\xda\\xbd\\x1a\\xa6\\x3b\\xb1\\x9f\\x71\\x8f\\x47\\x0b\\xdc\\x84\\x51\\xcd\\x9b\\x29\\x49\\x41\\xe3\\x49\\x70\\x63\\xb1\\xe3\\x9b\\x6c\\xa1\\x84\\x56\\x2f\\xe8\\x38\\xcb\\xfe\\xee\\x92\\x2d\\xe2\\x4d\\xdf\\xcf\\x98\\x82\\xc5\\xe6\\x15\\xb1\\x1b\\xf9\\x04\\x81\\x7f\\xbd\\x64\\x71\\x39\\xdb\\x80\\xb4\\xe8\\xfe\\xb3\\x7f\\x11\\xe1\\x85\\x2d\\x7e\\x87\\x6d\\xb9\\xcb\\x63\\xc9\\x4d\\x7e\\xe3\\x41\\x92\\xf7\\x20\\x0b\\x5b\\xc7\\x7a\\x03\\x11\\xae\\x43\\xb8\\x06\\xeb\\xd4\\xc2\\x89\\x6c\\x53\\xf5\\x8f\\x7e\\xbc\\x16\\x25\\xcb\\x20\\xd7\\x10\\x7e\\xf9\\xdb\\x0d\\xa2\\x87\\x88\\x52\\x3d\\xe9\\x91\\xef\\x6c\\x58\\x66\\xb1\\x8d\\x8d\\xe8\\x3a\\x95\\x4d\\x32\\x81\\xe0\\x6d\\xbf\\x27\\xc4\\xf2\\x38\\x2e\\x08\\xcd\\x0e\\x0f\\x6e\\xba\\xe3\\xf9\\x61\\xb7\\x7f\\xce\\x5a\\x95\\xa9\\xb0\\x62\\x1b\\x75\\x6f\"},\n{{0xe9,0xf6,0xd3,0x1b,0x93,0x69,0x42,0xc5,0x26,0xe0,0xf9,0xec,0x4f,0x5a,0x7a,0xc2,0x5f,0xa7,0x89,0xe0,0xc4,0x34,0xbc,0xd9,0x19,0x9d,0x72,0x0c,0x74,0x3c,0x84,0xc4,},{0x32,0x12,0x6d,0x26,0xe2,0x82,0x31,0xc5,0xb5,0x85,0xb1,0x3f,0x43,0xa0,0x1c,0x6f,0xe5,0x42,0x94,0x6b,0x07,0xd3,0xa9,0x1e,0x57,0xd2,0x81,0x52,0x3f,0x5c,0xb4,0x5c,},{0x7e,0x3b,0x1c,0x4c,0x71,0x6c,0x80,0x8e,0x90,0xb9,0x74,0x45,0x89,0x15,0xf3,0xb2,0x23,0x9c,0x42,0x07,0x71,0x19,0xfe,0x27,0x07,0x88,0xfa,0xe5,0x20,0x57,0x8b,0xd7,0xda,0x64,0x88,0x04,0x41,0x32,0xe1,0xbe,0xf2,0x3e,0x3b,0x23,0xc3,0x4d,0x9c,0x18,0x62,0x74,0x4f,0x28,0xfc,0xae,0xcd,0xa6,0xca,0xc0,0xfd,0x72,0xb9,0x3b,0x6a,0x0f,},\"\\xe8\\x81\\x33\\xf3\\xd1\\x76\\x42\\xd5\\xc2\\x27\\x79\\xa8\\x53\\x16\\xba\\x0d\\xf3\\x4c\\x79\\x2b\\x4e\\xfe\\xe4\\x9e\\xd7\\xdd\\x93\\xca\\x33\\x22\\xef\\x47\\xc7\\x2e\\x5b\\x2e\\x45\\x95\\xc7\\x78\\x00\\x43\\x4b\\x60\\x71\\x9a\\xdf\\x54\\xe4\\xc1\\xa3\\x4c\\x89\\xfa\\x1e\\x27\\xee\\x8d\\x35\\xa0\\x92\\x1f\\x97\\x55\\xac\\x4a\\x77\\xa6\\xc1\\x68\\x4e\\xa0\\xf5\\xc8\\xee\\x5f\\x75\\x9c\\xe5\\x9b\\xfe\\x83\\x15\\x80\\x0a\\x67\\xaa\\x6c\\x64\\xdd\\xfa\\xac\\x92\\xea\\xbe\\x6c\\x2c\\x61\\x37\\x79\\x78\\x4b\\x3a\\xff\\xaf\\xcc\\x62\\x0f\\x2a\\x6d\\xc5\\xcb\\x8d\\x8d\\xc7\\xd7\\x4a\\xa4\\xd7\\x94\\x94\\x67\\x84\\x94\\xe5\\xe6\\x39\\x4c\\x43\\x3c\\x14\\x80\\x9f\\xf4\\x0c\\x9a\\x59\\x2d\\x0d\\x69\\x4a\\x81\\x10\\x3b\\x44\\x53\\x1e\\x1f\\x48\\xbc\\x13\\x96\\x5d\\x15\\xaf\\x8b\\xf3\\x34\\x04\\x88\\xf8\\xcd\\x58\\xf0\\x9a\\xe1\\xa6\\x61\\x6b\\xf8\\x5a\\xc9\\xde\\x7e\\x0c\\x66\\x96\\xaa\\x2f\\x1b\\xec\\x15\\xe1\\x7a\\x44\\xda\\x4a\\x84\\xed\\xb4\\xec\\x6d\\x77\\x24\\x77\\x88\\xba\\x0d\\xe3\\xae\\x12\\xa1\\x55\\xcb\\xed\\xc0\\xda\\x2f\\x56\\x8e\\xef\\x0b\\x75\\xa8\\x77\\xea\\x5b\\x0c\\x2c\\x0d\\x4b\\xf2\\xc6\\x1d\\x46\\x8a\\x46\\xfa\\xad\\xfa\\xec\\xe3\\x5f\\xc2\\x63\\xa9\\xbe\\x99\\x87\\xf4\\xf7\\xf7\\x8f\\x05\\xc7\\x07\\x78\\x43\\x78\\xc7\\xb8\\xf7\\xda\\xf9\\xac\\x3a\\x12\\x2a\\xad\\x39\\xa1\\x67\\x79\\x66\\xda\\x9e\\xf2\\x86\\xc9\\xe0\\x62\\xc4\\xf4\\x39\\xad\\x0b\\xdd\\xea\\x26\\xe5\\x4b\\x2f\\x73\\x88\\xe2\\x38\\xb2\\xa6\\x49\\x28\\x45\\x0d\\x34\\x56\\x4c\\x5a\\x44\\x7e\\x7a\\xfb\\xbe\\xdd\\x10\\x85\\xf1\\xf2\\x4c\\x11\\xae\\x08\\x43\\x22\\xd1\\xa3\\x2c\\xf8\\xaa\\x47\\x39\\x41\\xf0\\x0d\\x56\\xb1\\x61\\x82\\x13\\xca\\xb3\\x90\\x0a\\xa6\\x06\\x46\\x3d\\x9f\\x80\\x0e\\x92\\x6f\\x9f\\x42\\xd4\\xb0\\x82\\xd8\\xc5\\xec\\x3a\\x4a\\x02\\x5b\\x45\\xf9\\xaa\\xdc\\x8b\\xcb\\xd1\\x70\\x91\\xb3\\xda\\x49\\xe9\\x45\\x3d\\xc5\\x5e\\x89\\xb5\\xb5\\xfe\\x6b\\x31\\xf5\\xed\\xda\\xd1\\x0b\\x66\\x01\\x57\\x25\\x68\\xd8\\xe2\\x05\\xd3\\x25\\x1a\"},\n{{0x6b,0xf4,0xca,0xaa,0xbb,0x96,0x85,0x4a,0x38,0xa5,0x72,0xf4,0xce,0x6c,0x78,0x38,0xf7,0xe7,0x50,0x11,0x8c,0x73,0xf2,0x72,0x35,0x82,0x61,0x8e,0x23,0x07,0xf8,0x38,},{0x08,0x12,0x63,0x73,0xd0,0x56,0xf0,0x0e,0x54,0xb8,0xd4,0x3d,0x77,0xc3,0x5f,0x5f,0x91,0x98,0x33,0xe9,0x0d,0x8a,0xaf,0xd6,0xc8,0x24,0x6d,0x27,0x91,0x7a,0xd0,0x91,},{0xd2,0x11,0x3f,0x80,0xd6,0xcf,0x92,0x84,0x86,0xa2,0x50,0xa6,0x79,0xd6,0xe7,0x4b,0x35,0xea,0x9d,0x26,0x06,0x1f,0xa9,0x4d,0x76,0x9e,0x1a,0x8f,0xbf,0xa0,0xa7,0x34,0x22,0x7f,0x55,0x53,0x7e,0x4e,0xbf,0xf5,0x93,0x36,0xdb,0x14,0x1c,0xf5,0xd6,0xd4,0x82,0xa0,0x71,0x1f,0x1e,0x9f,0xc7,0x2f,0xf7,0x09,0x56,0xa1,0x1b,0x4f,0xb9,0x09,},\"\\x47\\x76\\xe9\\xd6\\x00\\x85\\x48\\x1f\\xa5\\x37\\xbf\\x29\\x5b\\xda\\xbd\\x8b\\x1c\\xf6\\x32\\xa8\\xcd\\x40\\xbc\\xe6\\xbd\\x32\\x5c\\x12\\x9f\\x97\\x70\\x00\\xe8\\x84\\x68\\xeb\\xf2\\xdc\\x15\\x8a\\xc0\\xf2\\x07\\x21\\x2d\\xb0\\x0f\\xb6\\x0b\\x8e\\xc8\\xba\\xe2\\x29\\x37\\x2e\\x9a\\x6b\\x01\\x53\\x0a\\x7e\\xd1\\xbc\\x9d\\x38\\x9e\\xc8\\x91\\x3f\\x59\\x03\\x0d\\x5b\\x54\\xaf\\x56\\xae\\x1c\\xcc\\x28\\xf3\\x7c\\xc9\\x6a\\x8e\\x53\\x20\\x4e\\x92\\xa6\\x77\\x76\\x6a\\xdf\\xaa\\xda\\x99\\xb0\\x28\\x1f\\x86\\x7f\\x61\\xac\\x9f\\xf7\\xd9\\x72\\xee\\x3e\\xd4\\x27\\xd7\\x2f\\xaa\\xe7\\x5d\\x4a\\xec\\x01\\xb5\\xff\\xc3\\x70\\x61\\xb6\\xf0\\xf7\\xe5\\x71\\x4c\\x4c\\xf3\\x0d\\x5b\\x73\\x1b\\x07\\x46\\x06\\x5f\\x19\\xe4\\xc8\\x92\\x2d\\xde\\x64\\x2f\\x80\\xfe\\x24\\xa3\\xc8\\xdc\\xb2\\xe5\\xf1\\xc2\\x66\\xe2\\xaf\\x6c\\x37\\xde\\xcf\\x55\\xa2\\xba\\xa5\\x4f\\x0d\\x5c\\xf0\\x83\\x93\\x70\\xc3\\xe0\\xb4\\xe7\\x7a\\x4f\\x36\\xbb\\xb3\\x16\\x20\\x14\\x93\\x3a\\x4a\\x4e\\xbc\\xae\\x8c\\x60\\x96\\x1a\\xc6\\xdc\\xf1\\x34\\xf3\\x08\\x28\\xd3\\x14\\x02\\xae\\x74\\xe7\\xe8\\x51\\x3c\\x9d\\x2a\\xd8\\xee\\x46\\xb7\\xa9\\xd5\\x3a\\x1f\\x87\\xeb\\xfc\\xe0\\x4f\\x46\\x1b\\xde\\xd1\\x74\\x9b\\x6f\\xc4\\xc4\\xf2\\x57\\x93\\x52\\x56\\x92\\xd7\\xa0\\xe4\\x26\\xc8\\x4e\\x06\\x08\\x2c\\xc3\\xe6\\xab\\xb5\\x13\\x68\\x37\\x0c\\xbb\\x10\\x6c\\x7a\\x08\\x97\\xf6\\x6d\\x92\\xc9\\x73\\x9c\\xff\\x9f\\x27\\x06\\xd6\\xa2\\x98\\x0e\\xce\\xa3\\xac\\x49\\x45\\xf0\\xf4\\x7e\\x65\\x6b\\xd9\\x63\\x77\\x77\\xe8\\x53\\xd2\\xa8\\x39\\x10\\x43\\x27\\xdc\\x04\\x9e\\xbc\\x34\\xf0\\x49\\xd6\\xc2\\xf8\\x0e\\xca\\x99\\xdb\\x7b\\x41\\x84\\x24\\xac\\xef\\x75\\x22\\x60\\xd2\\xd4\\x27\\x94\\x93\\x23\\x99\\x7c\\xd9\\x61\\x7e\\xdf\\x50\\xd4\\x41\\xd0\\x08\\x8b\\x1d\\x47\\x91\\x2e\\x35\\xcf\\x54\\x23\\x15\\x26\\x58\\x29\\xf3\\x83\\xf4\\x58\\x60\\xd3\\xb4\\x5e\\x73\\x5b\\xb2\\xf8\\x58\\x6d\\xcf\\x58\\xdb\\x4f\\x2a\\xcf\\xb4\\xa6\\x88\\x53\\xa9\\x6e\\xed\\x7b\\x89\\x76\\x9d\\x36\\x56\\x13\"},\n{{0x5d,0x95,0x85,0x73,0x6a,0xb2,0x09,0xb0,0xab,0xe8,0xbf,0x74,0xac,0xa4,0xee,0xa4,0xf6,0xd1,0x65,0x0b,0x53,0x25,0x50,0xa2,0x23,0xe0,0x44,0x58,0x0f,0x8e,0x20,0xde,},{0xe7,0x77,0x29,0xed,0xfd,0x21,0x44,0xb2,0xb1,0x20,0x78,0x76,0x54,0x17,0xfa,0x21,0xf1,0x59,0x4f,0x09,0xb2,0x69,0xe9,0xb6,0x70,0x68,0x02,0xb4,0xf3,0xbd,0xfe,0x85,},{0xe7,0xb0,0x8e,0x1d,0x58,0x09,0xfd,0xd8,0x52,0x94,0x43,0xd6,0x5a,0xda,0x5d,0xd6,0x55,0xea,0x55,0xb5,0x41,0x5a,0x01,0x13,0x93,0xbe,0x70,0x71,0x67,0x64,0x86,0xd3,0x58,0xe8,0xd2,0xa4,0x60,0xeb,0xe0,0x75,0xb0,0xe7,0x01,0xb2,0x4c,0x9e,0x3a,0xb5,0xf2,0xb0,0x33,0x59,0x2d,0x4d,0xe3,0xb7,0xf3,0x7f,0xd5,0x41,0xf6,0x92,0x09,0x09,},\"\\x08\\x69\\x35\\x91\\xe6\\xc5\\x8a\\x5e\\xad\\x9c\\x85\\xfe\\x8e\\xc5\\x85\\x08\\xf8\\x1a\\x34\\x67\\x63\\x6c\\x2d\\x34\\xfc\\xc1\\xf4\\x66\\xe5\\xc6\\xda\\xfd\\xc3\\x7c\\x35\\xcb\\xee\\x35\\x58\\x9c\\x69\\x97\\xe2\\xb1\\x54\\x48\\x13\\x27\\x44\\xe5\\xa1\\xe1\\x31\\xbb\\x49\\xbf\\x5c\\x25\\x63\\xf8\\x7e\\xad\\x3e\\xfe\\x01\\xe8\\x8c\\xbf\\x24\\xcc\\x17\\x69\\xc7\\x8c\\xdf\\xc1\\x67\\xe3\\x78\\x21\\x5b\\x15\\x85\\x9c\\x7a\\x28\\xec\\xe7\\x0e\\x18\\x8f\\xa3\\x30\\x26\\x7d\\x3f\\xc5\\x7b\\x4a\\xce\\x6c\\x15\\x20\\xec\\x67\\x87\\x50\\x67\\xfd\\x33\\xbe\\x86\\xf4\\xa1\\x96\\x7a\\xfb\\x3e\\xb1\\x64\\xc7\\x97\\xcf\\x28\\xd8\\x07\\x2a\\xa6\\x9d\\x82\\xaf\\xa3\\x83\\x74\\xf8\\xe5\\x79\\x7c\\x4c\\x28\\x47\\x1b\\x7d\\x69\\xf5\\xb9\\xc7\\xb4\\xac\\xdb\\xc1\\x9f\\x3c\\x5c\\x5d\\x40\\x08\\x08\\xa9\\x82\\xa4\\x78\\x37\\xae\\xd1\\xb3\\x84\\x1d\\x69\\x89\\x0e\\xeb\\x31\\x49\\x4e\\x10\\xe3\\xe5\\x13\\xd1\\x2d\\x0c\\xa6\\x86\\xc7\\xce\\x65\\x17\\x78\\x09\\x27\\x03\\xfe\\xf0\\xdc\\xc0\\x21\\x40\\x77\\xdf\\xb3\\x61\\x25\\x1b\\xde\\xa4\\x36\\x4d\\xd4\\x1b\\x97\\xbc\\xeb\\x0f\\xb1\\x47\\x5a\\x50\\xe4\\x70\\x8f\\x47\\xf7\\x87\\x8c\\x74\\x40\\x1e\\x97\\x71\\xcc\\x3f\\xce\\xac\\xe8\\x91\\x69\\x98\\x1a\\xa7\\x72\\x50\\x85\\x00\\x90\\xd1\\x81\\xd8\\x35\\x8e\\xbb\\xa6\\x5e\\x29\\x0a\\xcb\\x03\\x52\\xbe\\xce\\x8c\\x57\\x98\\x32\\xa6\\x01\\x55\\x18\\x16\\xd1\\xc0\\x56\\x21\\xcc\\xbb\\xee\\x0f\\xbe\\x39\\xea\\x2f\\x19\\x53\\x93\\x19\\x9e\\x69\\xc2\\x34\\xc2\\xfb\\x1c\\x37\\xe4\\x74\\x84\\x08\\x60\\xce\\x60\\x91\\x61\\xfc\\xfc\\xe2\\x86\\x95\\x74\\xbe\\x0d\\x38\\xf9\\x5e\\x20\\xf4\\xf8\\x72\\x52\\x47\\xb9\\x62\\x7b\\x46\\xe8\\x34\\x90\\x51\\x01\\xac\\x12\\xb9\\x34\\xcb\\xf8\\x7c\\xb2\\xd1\\x90\\xd2\\xf5\\x14\\x90\\xa8\\x2c\\x4e\\x81\\x0e\\xdd\\xb8\\x1f\\x95\\x6a\\x9f\\x36\\xbd\\xa4\\x97\\xbc\\xa5\\x06\\xa4\\x9e\\xe9\\xcd\\x47\\xfd\\xa5\\xb7\\xf2\\xb8\\x84\\xa3\\x64\\x8c\\xad\\xd1\\x2a\\xb6\\x18\\x98\\xad\\xa4\\x6e\\xcc\\x97\\x0f\\x81\\xdc\\x9f\\x87\\x68\\x45\\xdb\"},\n{{0x60,0xb1,0x42,0xf1,0x65,0x11,0x41,0x43,0xca,0x30,0xa6,0x04,0xfe,0xf5,0x1c,0x68,0x64,0x36,0xaa,0x1b,0x9a,0xfd,0xb2,0x66,0xb3,0xe3,0x98,0xcc,0xb3,0xc4,0xd8,0x55,},{0xea,0xf6,0xc5,0xa7,0x6c,0xa9,0x9b,0xf7,0x30,0x64,0x98,0x88,0x8c,0x3b,0x7a,0x1f,0xea,0xe9,0x8b,0xf8,0x98,0x8d,0x7f,0x2e,0x15,0x47,0xf8,0xf5,0x3a,0x45,0x28,0xaa,},{0xa6,0x21,0xf0,0x84,0xea,0x1a,0x36,0xef,0x81,0x2a,0x97,0x55,0xc9,0xaf,0xbb,0x53,0xda,0xda,0xae,0x6b,0x3a,0x53,0xfa,0x83,0x44,0xca,0x40,0xd3,0x61,0x2a,0x26,0x8a,0x35,0xfe,0xd0,0xfd,0x39,0x8a,0xb7,0x5b,0xcd,0x63,0x9c,0x54,0x79,0x37,0xc9,0x41,0x55,0xab,0x1a,0x7a,0x34,0x67,0xdd,0x4b,0xfd,0xdf,0xac,0xab,0x16,0x55,0xe9,0x08,},\"\\x18\\x15\\xde\\xe1\\x17\\x3b\\x78\\x26\\x47\\x20\\xd3\\x5b\\x7c\\xc2\\x45\\x4a\\x00\\x0a\\x65\\xff\\xf2\\x14\\xe2\\x47\\x3e\\x20\\xbc\\x83\\xf3\\xec\\xde\\x9c\\x04\\xc1\\xe0\\x69\\x6c\\xe6\\xe5\\x55\\x19\\xdd\\x2a\\x75\\xce\\x04\\x64\\xbf\\x60\\x1a\\xdc\\x38\\x1e\\x79\\x3e\\xcb\\x9f\\x8c\\xe7\\xab\\x87\\xb6\\xca\\x2a\\x3e\\x41\\x0f\\x63\\x90\\x69\\x45\\x19\\x78\\xd1\\x48\\x73\\xd3\\x39\\x0f\\xab\\x86\\x23\\x96\\x97\\x13\\xc3\\xdf\\xcd\\x58\\xd8\\x6d\\x12\\x40\\x73\\x76\\x1e\\xe0\\x9a\\x65\\x2a\\x48\\x76\\x7f\\x96\\x46\\xcb\\x72\\x6a\\xc4\\x54\\xac\\x9a\\x1b\\xc5\\xfa\\xed\\x30\\x26\\xb7\\x03\\x98\\x2b\\xc2\\xb1\\xe0\\x75\\x82\\x10\\xe1\\xd6\\x25\\x19\\x23\\x0e\\xb2\\xb2\\xf4\\xa4\\x86\\xbc\\x55\\x16\\x85\\x60\\xc4\\x36\\x3d\\xf5\\xff\\x5a\\xdf\\xda\\x11\\xac\\x7e\\xf5\\x1b\\x18\\x19\\x6c\\x94\\x33\\x7c\\x07\\xae\\xf1\\x17\\x99\\x0f\\x77\\x0c\\x0f\\x1e\\x8c\\x0f\\x88\\xeb\\x6f\\xfc\\x40\\xe8\\xed\\x7c\\x3a\\x80\\xa6\\x32\\xdb\\x1e\\x7f\\x63\\xb6\\x30\\x96\\xe2\\xac\\x49\\xe5\\x77\\x92\\xb3\\x11\\x43\\xe2\\xf4\\xfa\\xab\\xce\\xae\\x66\\xb2\\x74\\x71\\x68\\x1c\\x36\\xfc\\x11\\x39\\x00\\x7f\\x9b\\x54\\x8c\\xdc\\x6e\\x3b\\x8f\\xbb\\xda\\xba\\x7a\\x8a\\xdb\\x84\\x34\\x31\\x23\\x8b\\xb4\\x61\\xba\\x24\\xf6\\xe0\\x9f\\x62\\xc7\\x2d\\x63\\x77\\xb4\\x04\\x8c\\xb0\\x13\\x4c\\x25\\xa5\\x41\\x1a\\x20\\xbf\\xcf\\xc1\\x3e\\x48\\xd8\\x0e\\x36\\xbf\\xb0\\xda\\x7e\\x01\\x85\\xd3\\x3f\\x19\\x28\\x63\\x6e\\x15\\xde\\xe0\\xe5\\xdf\\x89\\x92\\xa1\\x65\\x72\\xb1\\x3e\\xa8\\xf7\\xcf\\x85\\xca\\xe3\\x2d\\x52\\x9f\\x66\\xe8\\xf6\\xd2\\xfb\\x2a\\xd0\\xbb\\xfe\\x71\\x99\\x16\\x9b\\x25\\x67\\xba\\x00\\xc7\\x81\\xb2\\x0a\\x48\\xe1\\xd7\\x0d\\xf9\\xfa\\x31\\x19\\xcd\\x7e\\x5b\\xbe\\x58\\x88\\x4b\\x0b\\x51\\x21\\x89\\x40\\xfa\\x81\\x5f\\x85\\x62\\x5f\\xa2\\x03\\x47\\x1c\\xee\\x80\\x84\\x78\\x0e\\xb0\\xb9\\x35\\x6f\\x9f\\x3d\\x4f\\x6d\\xf7\\x40\\x30\\x1d\\x70\\x7e\\xf1\\xff\\xb3\\x51\\x9e\\x3f\\x90\\xb8\\x06\\x4b\\x98\\xe7\\x0f\\x37\\x5d\\x07\\x14\\x26\\x88\\x17\\x18\"},\n{{0x73,0x4b,0xa4,0x70,0x33,0xc6,0x14,0x02,0x32,0xdd,0x4a,0x7a,0x14,0xf1,0xa7,0x74,0x3e,0xef,0xe9,0x07,0x0b,0xad,0x96,0x62,0x49,0x16,0x30,0xcc,0x9d,0x28,0xc1,0xf3,},{0x2f,0xa5,0xdf,0x30,0x26,0xd6,0x07,0x42,0xe2,0xaf,0xf6,0xb5,0x78,0x42,0xc7,0x12,0x68,0x46,0xc8,0xa7,0xbb,0xe9,0x26,0x6e,0xfa,0x7b,0x3f,0x23,0x98,0xc3,0x57,0xea,},{0x9b,0xd0,0x74,0xd1,0xd0,0xbd,0x28,0x00,0x1b,0xaf,0x7d,0x2d,0x4e,0x82,0x43,0x5d,0xf0,0x8c,0x42,0x64,0xd8,0xcb,0xb1,0xc3,0x81,0x18,0x3c,0x2f,0x01,0x22,0x3f,0x79,0xf9,0x49,0x23,0xca,0x17,0x8c,0xac,0x75,0x56,0x4e,0x16,0xc7,0xf5,0x60,0x79,0x08,0x8f,0x7e,0xd8,0x85,0xde,0x4d,0x50,0x9f,0xbc,0x78,0xf4,0x38,0xfb,0xa3,0xf6,0x07,},\"\\x5d\\x3c\\x65\\x98\\x10\\xc3\\xfe\\xa5\\x2a\\x6d\\xf3\\x86\\x1e\\x5c\\xdc\\x5b\\x70\\x3c\\xc1\\xce\\xf4\\x85\\x58\\xc6\\x1d\\x8c\\x51\\xd0\\xed\\xea\\x5a\\x14\\x79\\xcf\\xe5\\x06\\x3d\\x82\\xde\\xd9\\xca\\x68\\x1e\\x57\\x48\\x88\\x7c\\x40\\xec\\xfb\\x9e\\x1a\\x9a\\x8b\\x7f\\x85\\x09\\xd1\\x07\\x76\\x46\\x1c\\x39\\x23\\x39\\x96\\x93\\xa7\\x81\\x89\\x08\\x91\\x78\\xd5\\xaa\\xbd\\x15\\xf8\\xc8\\x46\\x64\\x2b\\xe4\\x7d\\x6d\\x4c\\xaf\\x13\\x82\\x4e\\xdc\\xef\\xb8\\x09\\x86\\x8f\\xa7\\x2d\\xdf\\x03\\x5c\\x4d\\xe8\\xef\\x0a\\x9c\\x83\\x22\\x64\\xf6\\x6f\\x01\\x27\\x61\\xce\\x69\\x55\\xbc\\x3c\\x41\\x6e\\x93\\xe2\\x91\\x88\\x02\\x5e\\xbb\\xb1\\x3a\\x55\\x32\\x58\\xc1\\xd7\\xc4\\x99\\xc9\\xa4\\xae\\xb1\\x0b\\xb3\\x6f\\x61\\xd1\\xbb\\x4c\\xec\\x5a\\xe5\\x5d\\x17\\x57\\x22\\xb9\\xa9\\x69\\x6d\\xf8\\x81\\x95\\x1e\\x35\\x20\\x0b\\x96\\x53\\xcf\\x6e\\xd4\\xb3\\xd1\\x5d\\xe0\\x87\\xa9\\xd1\\xc3\\x19\\xfc\\xe8\\x58\\x21\\x56\\xbe\\xbf\\x3f\\xc9\\x1e\\x0e\\x61\\x0f\\xf7\\xa1\\x53\\x08\\xfd\\x1d\\x2c\\x60\\x69\\xfb\\xbb\\x29\\x47\\xd3\\x11\\x07\\x31\\xd2\\x45\\xae\\x29\\x63\\x01\\x4b\\xd7\\x6d\\xea\\x42\\xdb\\x12\\x5c\\xec\\xc4\\x93\\xc8\\xe9\\x09\\x1a\\x76\\x64\\x65\\x77\\x72\\x9a\\xed\\x49\\x66\\xfc\\xe9\\x69\\x9f\\xe1\\x2e\\x36\\x7d\\x66\\x5d\\xf9\\xe9\\x5a\\x91\\x93\\xe1\\x13\\x3e\\x14\\x3a\\xf9\\x2f\\x82\\xb6\\x6a\\xc7\\x76\\x4e\\x50\\x33\\x17\\x86\\x90\\x52\\x18\\x09\\xa7\\x10\\x7d\\x8a\\xe9\\xb8\\x8e\\x0e\\xd1\\xf3\\x5b\\x17\\x19\\x90\\x1b\\x93\\x0a\\xd0\\xe1\\xcb\\xce\\x7f\\xb3\\x02\\x67\\xb1\\x15\\x52\\x04\\xf6\\x05\\xf5\\x25\\xe4\\x9d\\xe2\\x98\\x8e\\xa7\\xf7\\x4b\\xe8\\x81\\x51\\x77\\xfd\\x97\\x6a\\x1b\\xcc\\x12\\x6d\\x9c\\x9c\\x13\\x5c\\x5b\\x42\\x76\\xd3\\x80\\x19\\xc3\\x4a\\xef\\xb7\\xa0\\x22\\x0f\\x7f\\x5a\\xef\\xf3\\x80\\xae\\xd6\\x27\\xb0\\x70\\xc2\\xc9\\xe2\\x15\\x33\\xbb\\x35\\xc0\\x8e\\x39\\x4c\\x85\\xae\\x25\\xe6\\x86\\x29\\x42\\x59\\x9c\\x65\\xdb\\xae\\x59\\x77\\xa5\\x84\\xa8\\x81\\x80\\xe0\\xc8\\xc7\\x1e\\x5a\\x84\\x09\\xe0\\x4e\\xf7\"},\n{{0x45,0xe3,0x4d,0x0e,0xf4,0xc1,0x96,0xfa,0x6d,0x57,0x2b,0x6b,0x17,0x74,0xb5,0x21,0x8f,0x7c,0x32,0x91,0x30,0x4c,0x13,0x50,0x0d,0xf7,0x07,0x0d,0x90,0xe8,0x03,0x9e,},{0x13,0xa7,0x30,0x4d,0xff,0x42,0x33,0x59,0x17,0x7a,0xba,0xfa,0x5e,0x65,0x08,0xd2,0x67,0x69,0xca,0x99,0xcf,0x8a,0xf4,0x5c,0x38,0x3f,0x3f,0xf6,0x34,0x40,0x60,0x03,},{0xb4,0x2c,0x1f,0x92,0x5f,0x4b,0xac,0xcd,0x12,0x9e,0xfb,0x10,0x9d,0xb3,0x54,0xac,0xa3,0x1c,0x68,0x98,0xf4,0xf4,0x51,0x29,0x47,0x49,0xa2,0x6a,0x6d,0xa1,0x67,0x7b,0xd3,0xa5,0xc0,0x41,0x19,0xe3,0x5f,0x47,0x31,0x9f,0x20,0xcf,0xdf,0xc0,0x8b,0xb4,0x52,0x8b,0x21,0x00,0x9e,0x00,0xbd,0x41,0xeb,0xc0,0xf4,0x68,0x63,0xbe,0xd1,0x0b,},\"\\x3d\\x9e\\xd5\\xc6\\x4b\\x75\\xe1\\x35\\xdf\\x2f\\x5e\\x85\\x30\\x0d\\x90\\xf2\\x1b\\x36\\x39\\x35\\xe2\\x81\\x75\\x56\\xfc\\x93\\x11\\x75\\x1b\\xa7\\x53\\x54\\x77\\xde\\xc8\\x35\\x6e\\xc3\\x85\\xef\\xb8\\x2b\\x41\\x40\\x62\\xf3\\x5b\\xb6\\xd3\\xed\\xea\\xfd\\xe3\\x05\\xf9\\x90\\x0a\\x25\\xe9\\x81\\x3c\\x9e\\xe0\\x23\\x7d\\x46\\x40\\x96\\x50\\xcd\\xcd\\xb5\\xdf\\xa2\\x30\\x1a\\x8e\\x26\\x47\\xf8\\xd3\\x81\\x9d\\x86\\xf7\\xb7\\xe3\\x07\\x0d\\x33\\x44\\x0f\\x82\\xc4\\x05\\x4b\\x1a\\xb5\\xed\\xeb\\xeb\\x27\\xf9\\x5b\\x3c\\x4c\\x6f\\xdd\\x46\\x8f\\x21\\x60\\x0f\\x03\\xb3\\x49\\x4d\\xa2\\x00\\xba\\xb9\\x29\\x3c\\x38\\xd0\\x2f\\xc4\\x40\\x48\\xe5\\x2f\\xf5\\xfd\\x0f\\x72\\x17\\xa0\\x4d\\x4c\\xe9\\x12\\xa1\\x80\\xd1\\x62\\x8f\\x36\\x82\\x80\\xb6\\x89\\x26\\x72\\xe8\\xff\\x98\\xd4\\x62\\x9a\\xc2\\x8b\\x60\\xc0\\x2a\\x30\\x1e\\x6c\\x60\\x26\\xc1\\xb9\\xe9\\xef\\x21\\xcf\\x03\\x92\\xdf\\x22\\x50\\x08\\xd5\\xa0\\xe0\\x28\\x4b\\x28\\x26\\x31\\xad\\x17\\x10\\xf8\\x11\\x61\\x56\\x97\\x06\\x6c\\x98\\x29\\x65\\x19\\x94\\x8a\\x7c\\xfe\\xd5\\xae\\xeb\\x45\\x4e\\xe7\\xa6\\x1c\\xc2\\x71\\xbd\\x3d\\x49\\x9b\\xe1\\x7d\\xf0\\x9d\\x3a\\x0e\\x79\\x0e\\xe6\\xb9\\xbd\\x99\\xe1\\xb9\\x19\\xbe\\xd4\\xa0\\x63\\xb8\\xd1\\xa3\\x4f\\x1a\\xfd\\x2e\\x95\\x2b\\x9d\\xfe\\xfd\\x77\\x09\\x69\\xc8\\xb2\\xfc\\x37\\x97\\x7a\\xbb\\x0f\\xee\\x63\\x17\\x25\\x3a\\x23\\xec\\xc9\\x75\\x78\\x16\\x89\\x73\\x33\\x4c\\x8f\\x91\\x76\\x3a\\xb9\\x7f\\x29\\xc4\\x9b\\xae\\xee\\x7b\\x35\\xf3\\xae\\x7f\\x5c\\xd3\\xa4\\xa6\\xe6\\x97\\xef\\x25\\x5a\\x3c\\x2e\\xc0\\xc7\\x52\\xa3\\x39\\x6f\\x69\\xf6\\x63\\xca\\x1f\\xc2\\xb3\\x32\\xdf\\xe6\\xc0\\xfa\\xf7\\x8a\\xfe\\x9c\\x68\\xd9\\x95\\x71\\xe8\\xe8\\x96\\xc5\\x09\\x30\\x85\\xe9\\x86\\x3a\\x27\\x64\\x8a\\x9e\\x58\\xf3\\xa9\\xa8\\x4c\\xbb\\xfe\\x2b\\x41\\xca\\x36\\x33\\xdd\\x5c\\xf6\\xe8\\x2c\\xb7\\x7c\\xec\\xac\\xad\\x8d\\x78\\xb3\\x53\\xf4\\x8d\\xb4\\x2d\\x99\\xc3\\x6b\\xca\\xd1\\x70\\xea\\x9e\\x98\\xab\\xb2\\x78\\x8c\\x33\\xa3\\xc7\\x06\\x26\\x8f\\x36\\x31\"},\n{{0x88,0x8c,0xe2,0xec,0xce,0xda,0x9c,0xa2,0xb9,0x48,0xac,0x14,0x43,0xc2,0xae,0xdd,0x75,0x95,0xaa,0xcf,0x36,0xed,0xaf,0x27,0x25,0x5b,0xde,0x7a,0x69,0x91,0xdc,0xc0,},{0x01,0x6e,0x57,0x2b,0x4f,0x98,0x41,0x7c,0x6e,0xe2,0x97,0xab,0xd7,0x84,0xea,0x48,0x22,0x6f,0xf4,0xfb,0xf0,0x05,0x0a,0x5a,0xde,0x88,0x06,0xe7,0x04,0x6d,0x3b,0xa3,},{0x99,0xd8,0x3f,0x14,0x8a,0x23,0x6e,0xbb,0xef,0x1c,0xad,0x88,0xcb,0x3c,0x76,0x94,0xf4,0x98,0x6c,0x92,0x50,0xe2,0x1c,0x36,0x03,0xa0,0xd9,0x41,0xbf,0xf1,0x99,0xcf,0x77,0xd6,0xce,0x99,0xef,0xdb,0x20,0x53,0x31,0x88,0xd6,0x8a,0xd1,0x33,0xde,0x03,0x3a,0x1f,0xb3,0x46,0x8a,0xbb,0x70,0x6d,0x2b,0x8b,0x4f,0xba,0xc0,0x8d,0xfe,0x03,},\"\\x5c\\x80\\x1a\\x8e\\x66\\x4e\\x76\\x60\\x76\\x0a\\x25\\xa5\\xe1\\x43\\x1a\\x62\\x15\\x9f\\xc3\\xf3\\xaa\\x71\\x37\\x80\\xae\\x7c\\xbc\\xe2\\x3b\\x85\\x64\\x78\\x27\\x99\\xbf\\x2b\\xe4\\x81\\x7e\\xe2\\x92\\x19\\x65\\xba\\xb7\\xe1\\xd4\\x48\\x33\\x82\\x4c\\x16\\x28\\xd4\\x2d\\xce\\xe3\\xe4\\x6a\\xe4\\x2b\\x28\\x16\\xd0\\xa4\\x32\\xa1\\xab\\x0b\\xd2\\x1f\\xcf\\x30\\xad\\xb6\\x3d\\x8d\\xd7\\x65\\x69\\x54\\x43\\x43\\xd0\\x03\\x5c\\x76\\x05\\x22\\xca\\x68\\xbe\\xa7\\x2c\\x40\\x4e\\xdd\\xa1\\xe9\\x09\\x5e\\xc9\\x0f\\x33\\x25\\x68\\x1c\\x6d\\xe0\\xf4\\xc1\\x2d\\x1a\\xfb\\xcb\\xa2\\xc7\\x87\\x1a\\x1b\\x1e\\x1f\\x19\\xc3\\x5b\\x0b\\xed\\x9e\\xc2\\xa8\\x7c\\x04\\x3d\\x36\\xd8\\x19\\x39\\x6b\\xd5\\xd0\\x99\\xe1\\xaa\\x09\\x03\\x91\\x29\\x7c\\x73\\x3f\\x65\\xa8\\xc5\\xd2\\x12\\x0c\\x67\\x63\\x53\\x16\\xfa\\xb2\\x5b\\x4d\\x48\\x47\\xa4\\x5f\\xc3\\xf7\\x6f\\x2e\\x24\\x26\\xdb\\xee\\x46\\x29\\x97\\x50\\x62\\xfc\\xe1\\x4e\\x21\\x89\\xdb\\xa2\\x7f\\xb1\\xde\\xd2\\x45\\x3f\\x00\\x1d\\xeb\\xfa\\xa8\\x99\\xc1\\x16\\x60\\x61\\x2d\\x2c\\xe2\\xad\\x2f\\x76\\x2e\\xa5\\xde\\xe7\\xe7\\x1e\\x58\\xad\\xcd\\xce\\xfa\\x79\\xe8\\xe8\\xb2\\x7f\\xc4\\xcc\\xf8\\x9a\\xab\\xf1\\x76\\xb5\\xd3\\x4f\\x82\\xdd\\x15\\xd8\\x89\\xf9\\xf0\\x87\\xdc\\x9a\\xe8\\xa4\\x2a\\x72\\xf3\\xb8\\x35\\x83\\x61\\x6e\\x17\\x06\\x37\\xcd\\x1a\\xdf\\x38\\xaa\\x65\\x51\\xcb\\xac\\xca\\x36\\x02\\xbd\\xc7\\xae\\x21\\x0c\\x4a\\x44\\x6b\\x3a\\xf8\\xdb\\x27\\x20\\xe5\\x49\\xbb\\xed\\xb8\\xbe\\xd2\\x15\\xae\\x00\\xf1\\x9d\\xa2\\x9d\\x8f\\xb0\\xb6\\x42\\xd2\\x7b\\x2d\\x88\\x57\\x5f\\x0e\\xe8\\x4f\\x3d\\x12\\x9e\\xb7\\x74\\xd2\\x0f\\x53\\x7a\\x1c\\x0f\\xdc\\xf7\\x17\\xbd\\xeb\\xcf\\xe4\\x7f\\x83\\x31\\xa3\\x41\\x86\\x43\\x46\\xfa\\x6a\\x1c\\x6b\\xbf\\xd1\\x78\\x81\\x9e\\x38\\x7a\\x0d\\x54\\x99\\xa6\\x8e\\x81\\xcc\\x9f\\x82\\xad\\x39\\xe3\\x1e\\x4d\\xfe\\x71\\x95\\x2d\\x5e\\xa5\\xcc\\x80\\x52\\xa3\\xce\\xed\\x17\\x51\\xf5\\x9d\\xc7\\xec\\xc9\\x74\\x2f\\xad\\x14\\x4e\\x18\\xdd\\xa8\\xd0\\x58\\x2e\\x74\\xe3\\x9c\\xa8\\xc4\"},\n{{0x61,0x73,0x90,0x85,0x7d,0xc1,0x0c,0xdf,0x82,0xb5,0xc9,0x42,0x61,0xf5,0x8c,0xe2,0xd4,0x4a,0xa2,0xf5,0x7d,0x29,0x8f,0x08,0xa2,0xd6,0xc7,0x4d,0x28,0x14,0x7d,0xaf,},{0x89,0xe0,0xc3,0xe0,0xa0,0xf1,0x30,0xd1,0x91,0x6e,0x0e,0x38,0x49,0xb7,0x28,0x6f,0xa2,0xe3,0xac,0x4c,0x17,0xbd,0x1f,0x71,0x6e,0xe5,0xa7,0x2f,0x02,0x57,0xfb,0x8d,},{0x63,0xe9,0x0a,0x6a,0xfb,0xbb,0xb0,0xee,0x69,0x6b,0xfb,0x56,0xef,0xd6,0x79,0xd6,0x8a,0x98,0x51,0xa8,0x94,0x76,0x40,0xa9,0x7f,0x41,0xf6,0x8e,0xdf,0xea,0xdd,0x21,0x6e,0xd8,0x69,0x8e,0x2e,0x43,0xc8,0x20,0xc9,0x04,0x4c,0xaa,0x7a,0xda,0xab,0x5b,0x76,0x76,0x2b,0x68,0x18,0x31,0xa9,0xf7,0x60,0x47,0x6a,0x84,0x43,0xc4,0x3c,0x06,},\"\\x1f\\xd9\\xe7\\x45\\x3e\\xaf\\xfd\\x7c\\x9b\\x54\\x05\\x56\\x22\\xdd\\xe1\\x70\\xdd\\x58\\xb7\\x1c\\xb9\\x45\\xde\\x75\\x35\\x1d\\x5f\\xce\\xb1\\xf5\\x36\\xbd\\xe2\\x51\\x58\\xf0\\x37\\x86\\x15\\x5f\\x95\\x3d\\xc2\\x07\\xa1\\x70\\x8f\\x90\\xd9\\x5b\\x15\\xac\\xa0\\xae\\xe3\\x09\\x7f\\xdc\\xaa\\xe8\\x5e\\x4a\\xb1\\xc2\\xcd\\xb7\\x05\\xc5\\x3e\\x6c\\x2e\\xd2\\x1a\\x99\\x4b\\x30\\x4a\\x75\\xca\\xf2\\xce\\x4f\\xc7\\xd6\\x1f\\x56\\x1e\\x74\\xe2\\x97\\x39\\x7e\\x2c\\xde\\x5c\\xc6\\x90\\x56\\x94\\x03\\x43\\xaa\\x81\\x37\\x5d\\x0a\\xf1\\x8d\\x17\\xd2\\xf3\\x4c\\x0a\\x71\\xdc\\xf1\\xde\\x3c\\x4f\\xc4\\x88\\xa1\\x4c\\x5f\\xa6\\xb3\\x33\\x7a\\x31\\x74\\xb1\\xda\\x79\\x58\\xfb\\x00\\xbd\\x59\\x55\\x14\\x82\\x21\\x42\\x7c\\x60\\xdb\\xa0\\x41\\x17\\xc8\\x0d\\x24\\x88\\x65\\x6d\\xbd\\x53\\x43\\xde\\x89\\x12\\x87\\xb5\\x0e\\xf4\\xdf\\x98\\x25\\xed\\xa7\\x6b\\x49\\x77\\xf3\\xac\\xd4\\xab\\x6d\\x31\\x02\\xfa\\x56\\x87\\x83\\x06\\xcd\\x76\\x56\\x14\\x91\\xbc\\xfd\\xaa\\x1d\\xa5\\x67\\xe6\\x77\\xf7\\xf0\\x3b\\xae\\x5d\\xbf\\x44\\x26\\xc3\\xc4\\xa6\\xc3\\xd0\\x82\\xf9\\x17\\x8b\\x2e\\xfd\\xd2\\xbd\\x49\\xee\\xe9\\x7e\\xf4\\xdc\\xf3\\xf0\\xf5\\x1b\\xbd\\xef\\xfe\\x5a\\xe6\\x60\\x1e\\x28\\x01\\x95\\x18\\xf8\\x27\\xf0\\x2e\\x51\\xf6\\x67\\x9b\\x87\\x15\\x97\\x8b\\xec\\x3e\\x69\\xd5\\x77\\x15\\x6d\\xd7\\x19\\x95\\x93\\x71\\xba\\xf0\\x34\\x21\\x9f\\xbb\\xd1\\x7a\\x23\\x69\\xa8\\x54\\x14\\x90\\xf6\\xa0\\x20\\x13\\xe3\\x3e\\x74\\xf4\\x76\\x9b\\xe3\\x7a\\xef\\xa4\\xde\\xfb\\x6b\\xfb\\x3f\\x35\\x1c\\x2a\\x26\\x14\\x82\\xc2\\xfb\\xec\\x49\\xf8\\x5f\\x84\\x45\\x45\\x6e\\x8f\\x5a\\x47\\x40\\x30\\xcd\\x72\\xd0\\x95\\xef\\x6a\\x62\\x20\\x30\\xe1\\xe4\\x3a\\x0c\\x5d\\xeb\\xb0\\x34\\x73\\x1d\\x2f\\x5e\\x8e\\x4b\\xa3\\x99\\x0f\\x07\\x7d\\x0c\\x16\\x26\\x49\\xd1\\xfa\\x3e\\xa4\\xfe\\x1e\\x81\\xd7\\x4a\\xa8\\x49\\xe2\\x1b\\x05\\x9d\\x96\\x6c\\xba\\xd4\\xc4\\x93\\xca\\x10\\xba\\xfe\\x7a\\x69\\x24\\x3e\\x3c\\x0a\\x6e\\xbf\\xd1\\x3d\\x69\\x79\\x06\\x30\\x33\\x92\\xba\\x65\\xd4\\xfe\\x06\\xb6\\xa5\"},\n{{0x87,0x7d,0x01,0x74,0x36,0x36,0x9e,0xc2,0x45,0x3f,0xed,0x46,0xe9,0x77,0xd6,0xac,0xc3,0xa7,0xbe,0x60,0xd3,0x13,0x95,0xad,0x6e,0x7e,0xa9,0xe0,0x74,0x80,0xe4,0xc9,},{0x4e,0x65,0x42,0x2f,0xed,0x33,0x4a,0x55,0xe8,0xb6,0x73,0x89,0x3e,0xba,0x7c,0x18,0x1d,0xd7,0x24,0xdd,0xa0,0x02,0x81,0x7b,0x0b,0xae,0x28,0xac,0xdc,0x3f,0x7f,0xc0,},{0x76,0x88,0xf3,0xf2,0x40,0x1e,0xac,0xaf,0x2d,0xd8,0x8e,0x17,0x0f,0xf1,0xc4,0xd7,0xe9,0x48,0x22,0xa7,0x7f,0x6b,0x55,0x0b,0x56,0x9e,0x82,0x15,0x2b,0xbb,0xb4,0x34,0x05,0x7e,0x01,0x23,0x0b,0x05,0xce,0x58,0xee,0x1d,0xee,0x52,0x26,0xb5,0xc7,0xcd,0xbe,0x5a,0x8a,0xde,0x3b,0x94,0x65,0xf5,0x9a,0xed,0x74,0x14,0x5d,0x14,0x33,0x0c,},\"\\x4e\\xd3\\xf5\\xbd\\xbd\\x41\\xd0\\xe3\\xb0\\xa8\\xa7\\xfc\\x37\\x52\\xee\\xa4\\x96\\xd6\\x14\\x16\\x78\\xcb\\xfe\\x06\\x75\\x7f\\x61\\xe1\\xa1\\x68\\xd7\\x61\\xb6\\xda\\x83\\x05\\x2f\\x79\\x94\\x95\\x0d\\x24\\x62\\x6f\\x00\\x4f\\xbe\\x9b\\x8c\\x95\\x62\\xe0\\xc9\\x55\\xfb\\x3b\\x5c\\x08\\xfd\\x2d\\x3d\\x25\\x83\\x93\\xa3\\x49\\x03\\x0c\\x8e\\x15\\x62\\x05\\xb4\\x04\\x83\\x03\\x8b\\xe1\\x95\\x9f\\x1c\\xba\\x49\\x0a\\x87\\xfe\\x13\\x89\\x9e\\x4f\\x37\\x52\\x06\\x3b\\x68\\xfe\\x3e\\x1c\\x50\\x71\\xf7\\xdb\\x00\\x02\\xf0\\x14\\x94\\xb4\\xa3\\xee\\x2e\\x07\\x99\\x2b\\xdd\\x20\\x0d\\xb4\\x31\\x66\\x29\\xee\\x8a\\x95\\xca\\x34\\x7f\\x0b\\x28\\xd6\\x40\\x2a\\x6d\\xa8\\xb5\\x3e\\x6b\\x32\\x58\\x1c\\x36\\x91\\xe1\\x1a\\xe9\\xb6\\xe0\\xf0\\x49\\x48\\x94\\xe6\\x49\\xa9\\x2d\\x03\\xeb\\x49\\xc4\\xd6\\x83\\x3f\\xa1\\xf5\\x4f\\x8d\\xcd\\x91\\xd0\\x69\\x36\\xa6\\xe6\\x2d\\x49\\x1e\\x2c\\xea\\x46\\xdd\\x07\\xd9\\xf0\\x2d\\x32\\x54\\xb8\\x50\\xbc\\x97\\x49\\xf2\\x58\\xa6\\x1a\\xd3\\xb9\\xcc\\x24\\xb0\\x32\\x87\\x33\\x1b\\x85\\xa2\\x41\\x43\\xaa\\xf8\\xfc\\xcc\\xac\\x5f\\x18\\xbf\\xc7\\x2d\\xec\\x75\\xc0\\x23\\x35\\x16\\xaa\\x6e\\x45\\x89\\xc7\\x8c\\x66\\x5a\\x18\\x6e\\xd9\\x02\\x09\\x1d\\xf9\\x7b\\x0d\\x04\\xe8\\x3a\\x2d\\x74\\xd7\\x89\\x89\\x1a\\xea\\x2c\\xac\\xf8\\x13\\xff\\xfb\\x5e\\xfa\\xf7\\x8d\\xbc\\xd7\\xaf\\x54\\xef\\x55\\xc7\\x7b\\x1c\\x4c\\x8a\\xce\\x9e\\x92\\x78\\xad\\xc2\\x3d\\x76\\xc7\\x79\\xd6\\x4b\\x3b\\xbb\\xd1\\xfb\\x33\\xb0\\x98\\x36\\xea\\x64\\xa7\\x1e\\x47\\x11\\xe8\\x9e\\x8d\\xa0\\xf7\\x09\\x21\\x33\\x42\\x17\\x6a\\xe2\\x2c\\x6e\\x78\\x52\\xc3\\x97\\x3b\\x60\\xd9\\xf9\\x88\\x89\\xb4\\x42\\xaa\\x48\\xd7\\xbf\\xdf\\xde\\xf6\\x4c\\x36\\xc5\\x86\\xc4\\xfb\\x2a\\xd2\\xe2\\x7e\\xbe\\x47\\x9f\\x6d\\x72\\x2f\\x06\\x9f\\xd6\\x10\\x6b\\x0d\\x08\\x97\\x5d\\x5f\\x72\\x15\\x47\\xc3\\xb9\\xc5\\x2f\\x9f\\xc5\\xf4\\x5b\\xb4\\x5b\\x5b\\x63\\x21\\x88\\xe8\\x06\\x26\\x51\\x8a\\x79\\x05\\x6b\\xdc\\x4e\\xe1\\xd2\\xbe\\x6c\\x65\\x42\\xa2\\x1f\\xad\\xea\\x92\\xc6\\xdf\\xb7\\x76\"},\n{{0x4f,0x0b,0x36,0x07,0xd7,0x0b,0x0f,0x26,0x98,0x32,0x7e,0xf4,0xf1,0x98,0x2c,0x5b,0x4b,0x94,0xbe,0x78,0xf5,0x0c,0x76,0xf4,0x3b,0xd6,0x42,0xf1,0xf0,0xed,0xe3,0x9b,},{0x94,0x2b,0x43,0x08,0x9f,0xd0,0x31,0xce,0xc0,0xf9,0x9e,0x5e,0x55,0x0d,0x65,0x30,0x7f,0xb6,0xc3,0xe7,0x93,0x44,0x9f,0xb3,0x90,0xff,0x73,0x0f,0xff,0xd7,0xc7,0x4b,},{0xf3,0x96,0xa1,0x1f,0x2f,0x03,0xc6,0x14,0x39,0x68,0x4f,0x79,0x00,0x1b,0xd4,0xf3,0x46,0xa3,0x48,0xdc,0xf1,0xd3,0xbe,0xb2,0xd3,0xbf,0xe3,0x3e,0xa7,0x3a,0x5a,0xd4,0xeb,0x97,0x50,0x6a,0xcf,0xbf,0xfb,0x78,0x4e,0x77,0x54,0x81,0x89,0xcd,0x59,0x9f,0x8c,0xcf,0x17,0x35,0x5d,0xde,0x80,0xe7,0x50,0x24,0xef,0x2a,0x78,0xd5,0xfa,0x03,},\"\\x9f\\x70\\x0a\\x1d\\x25\\x60\\xf6\\x9d\\x9b\\xc1\\x05\\xbc\\x83\\xbf\\xf5\\x39\\xe4\\x25\\x8c\\x02\\x48\\x60\\x20\\x13\\xa9\\x59\\xb9\\x78\\xa1\\x9c\\xc2\\x73\\x28\\x0d\\x90\\xc0\\x17\\x80\\x89\\x57\\x8b\\x50\\x51\\x8e\\x06\\xad\\x1e\\xab\\x79\\x0f\\xfe\\x71\\x0c\\x63\\xd7\\x88\\x87\\xa9\\x55\\x69\\x14\\x4f\\x3e\\x58\\xa8\\x83\\x7f\\x93\\xdd\\x51\\x6f\\xcd\\xdd\\x22\\xbc\\x97\\xa7\\xf1\\x44\\x11\\xd4\\x24\\xb2\\xe8\\xe9\\xaa\\x7c\\x28\\x01\\x19\\xad\\x94\\xce\\x92\\x53\\x3f\\xc7\\xfe\\xa6\\xc6\\x62\\x48\\x64\\x4a\\xc3\\xe1\\xbe\\xef\\x25\\x53\\xa6\\xf6\\x1e\\x91\\xb9\\x37\\x9b\\x0f\\xe0\\xc6\\x8b\\x40\\x68\\x14\\x55\\xb3\\x11\\xf4\\x0d\\xf0\\xc9\\x7f\\x53\\xfc\\x95\\x42\\x42\\xc3\\x75\\xe7\\x70\\x8d\\x61\\xba\\xd9\\xf5\\x12\\x96\\x24\\x72\\x74\\xfa\\x01\\xa7\\x32\\x8f\\xa5\\x00\\x9d\\x99\\x95\\xf5\\x01\\xae\\x86\\x83\\x55\\x2b\\x11\\xa4\\x9d\\x26\\x38\\x11\\x67\\x23\\xb1\\x31\\x94\\x50\\xa9\\x01\\x38\\xd2\\x78\\xcd\\x95\\x12\\xb8\\x0c\\xa5\\x79\\x2e\\xd1\\x6c\\x68\\x3b\\xef\\x92\\xec\\x87\\x88\\x4c\\x9f\\x07\\xf1\\x37\\xdc\\x47\\xa1\\x31\\x46\\xe5\\x11\\x06\\x5c\\x2e\\x1b\\x4b\\x80\\xef\\xde\\x88\\xae\\x12\\xe2\\x94\\x31\\xbe\\xb7\\xae\\xe3\\x65\\xc1\\x6d\\x80\\x50\\x6b\\x99\\xaf\\xa6\\xa1\\x40\\x6e\\xdb\\x06\\x17\\x66\\x87\\x58\\x32\\xdb\\xa4\\x73\\xe5\\x19\\xdd\\x70\\x18\\xf4\\x02\\xeb\\x1b\\xb3\\x01\\x4b\\x7c\\xee\\x4f\\x02\\xe9\\x80\\xb1\\xb1\\x71\\x27\\xe7\\xd2\\x5d\\xfe\\x0c\\x16\\x8c\\x53\\x44\\xf1\\xc9\\x00\\x44\\xf8\\x27\\x70\\x7d\\xca\\x03\\x07\\x0e\\x4c\\x43\\xcc\\x46\\x00\\x47\\xff\\x62\\x87\\x0f\\x07\\x5f\\x34\\x59\\x18\\x16\\xe4\\xd0\\x7e\\xe3\\x02\\xe7\\xb2\\xc2\\xca\\x92\\x55\\xa3\\x5e\\x8a\\xde\\xc0\\x35\\x30\\xe8\\x6a\\x13\\xb1\\xbd\\xfa\\x14\\x98\\x81\\x30\\x98\\xf9\\xba\\x59\\xf8\\x18\\x7a\\xbc\\xaf\\xe2\\x1b\\xa0\\x9d\\x7c\\x4a\\xaa\\x1a\\xd1\\x0a\\x2f\\x28\\x33\\x4a\\xb5\\x39\\x96\\x14\\x7c\\x24\\x59\\xc0\\x1b\\x6a\\x10\\x83\\x9e\\x03\\x01\\x12\\x3d\\x91\\xa3\\x5c\\xed\\x7a\\xf8\\x9a\\xfb\\xac\\x7d\\x9c\\xf8\\xac\\x9a\\x38\\xce\\xeb\\xef\\x83\"},\n{{0xb8,0xa0,0x01,0x0c,0x78,0x4d,0x8d,0x00,0x2a,0x31,0xda,0x11,0xd0,0x22,0xd3,0x01,0x88,0xa4,0x19,0x7a,0x1d,0x5f,0x14,0xea,0x4c,0x0d,0xab,0x29,0xa2,0xe4,0x06,0x68,},{0x8b,0xdc,0x63,0xe5,0x0b,0xed,0xe1,0x3c,0x91,0xa4,0x1e,0x4b,0x4b,0x78,0x57,0xb9,0xe5,0x53,0xf4,0x84,0xe3,0xc1,0xec,0x16,0x7d,0xc0,0x4c,0x28,0x1e,0xa8,0x66,0x22,},{0xb3,0xf6,0xcf,0x4c,0x0e,0x0f,0x90,0x74,0xff,0x2c,0x2c,0x47,0xe1,0x63,0x20,0x2f,0x1e,0x9d,0x6e,0xe1,0x17,0xcf,0x75,0x76,0x33,0xe4,0xab,0xe7,0x44,0x23,0xaa,0x70,0x00,0x8a,0xda,0x15,0x09,0xec,0x1d,0xc1,0x17,0xc1,0xc2,0x30,0xe9,0xb2,0x37,0x86,0xf3,0xd0,0xf2,0x9b,0x73,0xaa,0x28,0x45,0x36,0xe9,0x58,0x01,0x06,0xa8,0xa7,0x0c,},\"\\x5c\\x6c\\xcb\\x29\\x8b\\xe2\\x16\\x80\\x8b\\x81\\x1e\\x56\\xd9\\x72\\xf4\\x56\\xb6\\x9a\\xd3\\x95\\x94\\xee\\xe3\\x54\\x70\\x1c\\xa6\\xb3\\xe3\\x8d\\x1f\\x41\\xa3\\x59\\xe5\\x51\\x2a\\xf9\\x8a\\x3a\\x08\\x73\\x26\\x5f\\xe5\\x19\\x1f\\x4f\\x2e\\xca\\xf6\\x6b\\xee\\x75\\xa3\\xac\\x0b\\x71\\xa4\\xdd\\xf2\\xa7\\x59\\xeb\\xdd\\xdb\\xd8\\x8a\\x6a\\x1c\\x6f\\xd0\\xfc\\xf7\\xd7\\xcb\\x92\\xa8\\x4e\\x33\\x07\\xb4\\xa4\\xf9\\x8c\\x71\\x0a\\xbf\\x4f\\x55\\x3d\\xee\\x74\\xf6\\x52\\xd2\\xac\\x64\\xbc\\x30\\xf7\\x2b\\xf4\\x35\\x4e\\xf7\\xe8\\x06\\xa1\\x90\\x71\\xa0\\x51\\xbc\\xfc\\xfb\\x27\\xe3\\x7f\\xdd\\xd4\\x1e\\xce\\xae\\xc1\\x75\\x8e\\x94\\x69\\x5c\\x67\\x0e\\xf4\\xc5\\xa5\\x90\\x21\\x78\\x32\\x9d\\xb9\\x58\\x5c\\x65\\xef\\x0f\\xa3\\xcd\\x62\\x44\\x9b\\xb2\\x0b\\x1f\\x13\\xae\\xcf\\xdd\\x1c\\x6c\\xf7\\x8c\\x51\\xf5\\x68\\xce\\x9f\\xb8\\x52\\x59\\xaa\\xd0\\x5b\\x38\\xc6\\xb4\\x85\\xf6\\xb8\\x60\\x76\\x92\\x8d\\xdb\\x4e\\x20\\x36\\xf4\\x5e\\x7b\\x9c\\x6a\\x7f\\xf2\\x4a\\xe1\\x77\\x60\\x30\\xe2\\x57\\x68\\x25\\x01\\x9a\\xb4\\x63\\xeb\\xf7\\x10\\x3a\\x33\\x07\\x20\\x33\\xea\\xcb\\xb5\\xb5\\x03\\xf5\\x32\\x66\\xaf\\xb8\\x2f\\x9b\\x24\\x54\\xb8\\xdc\\x05\\x7d\\x84\\xf3\\x0d\\x9d\\x2c\\xb7\\xc3\\xa3\\x1a\\x7d\\xbd\\xfb\\xa5\\xb8\\xe4\\x92\\x31\\xc2\\x31\\x39\\x6c\\x47\\xca\\x04\\x2c\\x8e\\x48\\xa1\\xa5\\xe3\\xec\\x9a\\xfe\\x40\\x20\\x59\\x53\\x90\\xf9\\x99\\x0d\\xfb\\x87\\x4e\\x08\\x25\\xae\\x9a\\xe5\\xe7\\x52\\xaf\\x63\\xaf\\x6f\\xd3\\xe7\\x87\\xe7\\x5e\\x8d\\x8d\\xc4\\xc6\\x63\\x02\\x27\\x7a\\xc0\\x1b\\x30\\xa1\\x8a\\x56\\xcb\\x82\\xc8\\xa7\\xeb\\xdc\\x91\\x5b\\x71\\x53\\x25\\x5a\\x1f\\xed\\xc4\\x92\\xe4\\x96\\x60\\x26\\x2b\\xb2\\x49\\x78\\x0d\\x17\\x3e\\x1f\\xd2\\x0d\\x18\\xc4\\xf6\\xb0\\xb6\\x9a\\xa2\\xec\\xa0\\x24\\xbf\\x3c\\x80\\xd7\\xd5\\x96\\x2c\\xc4\\xa1\\x29\\xa7\\x94\\x3b\\x27\\xf3\\x3c\\xc7\\x99\\xa3\\x60\\x45\\x54\\x12\\x75\\xa2\\xcd\\xb9\\x2a\\x40\\xe4\\x85\\xba\\x8b\\x73\\x7a\\x04\\xb4\\x3d\\x29\\xc3\\xe2\\x5f\\x76\\xcb\\x3d\\x93\\xa6\\xb9\\x44\\x61\\xf8\\x8f\\x56\\x96\"},\n{{0xef,0xc8,0x6c,0xbe,0x40,0x36,0x3a,0xbf,0xbb,0x2a,0x4b,0x1f,0xcc,0xe5,0xfd,0x60,0x84,0xda,0x96,0xe7,0xe8,0x14,0xde,0x71,0xaa,0xdf,0x9a,0x61,0x8f,0x30,0x36,0x25,},{0x22,0xf2,0x95,0xce,0xe7,0x27,0xd2,0x8d,0x2b,0x93,0x17,0x15,0x3e,0x7d,0x94,0x12,0xda,0x10,0x65,0xc1,0xb1,0x6a,0xe2,0xa2,0x51,0xdd,0x1f,0xb4,0x31,0xc6,0x2b,0x01,},{0xf8,0x81,0x83,0x10,0x22,0x8c,0xa7,0x61,0x11,0x52,0x4c,0xe9,0x4b,0xfc,0xb0,0x24,0x6e,0xa6,0x35,0x08,0xce,0xe9,0x30,0x65,0x92,0xb2,0xf7,0x75,0x48,0xed,0xef,0xcf,0x76,0xbd,0x14,0x54,0x50,0x8e,0xa7,0x15,0x04,0x2c,0xec,0x16,0x9c,0xea,0x51,0x15,0xab,0x54,0x23,0x5c,0xb1,0x09,0x7b,0x10,0x70,0x2a,0xa3,0x83,0x78,0x02,0x8e,0x0c,},\"\\x9e\\x4f\\xa4\\x5d\\xc0\\x26\\x71\\x0f\\x6b\\xef\\x4e\\xd0\\xf0\\x7c\\x54\\x4b\\x0b\\xb0\\xd8\\x8f\\xa7\\x9e\\x71\\x77\\xd8\\x44\\x8b\\xc2\\x09\\xd7\\x1c\\xfe\\x97\\x43\\xc1\\x0a\\xf0\\xc9\\x93\\x7d\\x72\\xe1\\x81\\x9e\\x5b\\x53\\x1d\\x66\\x1c\\x58\\xc6\\x31\\x41\\xce\\x86\\x62\\xc8\\x83\\x9e\\x66\\x4d\\xb7\\x9e\\x16\\xc5\\x4d\\x11\\x3a\\xbb\\x02\\xa7\\x5b\\xdf\\x11\\xb3\\x45\\x3d\\x07\\x18\\x25\\xbc\\x41\\x57\\x41\\xe9\\x94\\x83\\x54\\x6b\\x8e\\x1e\\x68\\x19\\xde\\x53\\x01\\x70\\x92\\xe4\\xef\\x87\\x1f\\x1c\\xa0\\xd3\\x50\\x8f\\x93\\x78\\x28\\xa4\\x66\\x7d\\xb1\\x1f\\xff\\xf9\\x41\\x6e\\xeb\\xb9\\x4b\\xf9\\xb8\\x4d\\x65\\x46\\x03\\x09\\x48\\x34\\xa9\\x9c\\xa7\\x0b\\x90\\xf5\\x62\\xa8\\x68\\x23\\x62\\x4d\\xfe\\x9c\\xb2\\xf9\\xe8\\x8c\\x17\\x3f\\x13\\x46\\x4d\\x4c\\xe2\\x55\\xf2\\x22\\xdb\\x50\\xdd\\x63\\xab\\x42\\x46\\x57\\x34\\xe7\\x52\\x95\\xc0\\x64\\xb6\\x4c\\xc3\\xf1\\x5e\\x62\\x37\\xe3\\x7f\\x33\\xd6\\x15\\xf7\\xc2\\x43\\xe4\\xba\\x30\\x89\\x60\\xcf\\xd4\\x39\\x34\\x02\\x52\\x55\\x00\\xbb\\x79\\x02\\x97\\x0b\\x39\\x31\\xd4\\x8b\\x35\\x66\\x6a\\x2d\\x4d\\x2a\\xb0\\x8f\\xa1\\x2a\\xf3\\x66\\xa0\\x04\\x34\\x6c\\x9d\\xd9\\x3d\\x39\\xfb\\x1b\\x73\\x40\\xf1\\x04\\xe5\\x1f\\xed\\xbb\\x53\\x36\\x05\\xb5\\xff\\x39\\xcf\\x6d\\x59\\x51\\x3f\\x12\\x85\\x6d\\xcf\\xa1\\x98\\xd7\\x93\\xb0\\xfc\\x87\\x5c\\xde\\xa0\\x74\\x1f\\x14\\x55\\x74\\x6d\\x8a\\x19\\xc3\\xe9\\xd9\\x28\\xf0\\x02\\x1b\\x01\\xc2\\x51\\x31\\x81\\x1e\\x48\\xc3\\xc7\\x5c\\x6f\\x41\\x42\\x2a\\x88\\x10\\xc6\\xc8\\x1f\\x35\\xb4\\x54\\xee\\xae\\x8c\\xd1\\x7c\\xf3\\xf2\\xe6\\xf0\\xbc\\xd9\\xf2\\x90\\x98\\x4f\\x49\\x65\\x78\\x62\\x3a\\xb8\\xe2\\x73\\x8d\\x2d\\x10\\x84\\x0e\\xb9\\x1d\\x10\\x1c\\xb4\\xa2\\x37\\x22\\xb7\\x2e\\x3d\\xd1\\x85\\x44\\x0c\\x3b\\x9f\\x44\\xd4\\x6a\\x39\\x3a\\x34\\xc1\\x87\\xa2\\x0d\\x61\\x0b\\xb6\\x98\\xc5\\x05\\x31\\x74\\x1e\\xfe\\x96\\x32\\x35\\x12\\x32\\x98\\x00\\x77\\x2a\\x40\\x80\\x65\\xa7\\xef\\x8e\\x4e\\x41\\x05\\xeb\\x1f\\x5b\\xf6\\xd3\\xfd\\x6b\\x21\\x7f\\xd8\\x36\\xd8\\x9f\\x53\\xb9\\x6f\\x45\"},\n{{0x33,0x55,0x6c,0x60,0xde,0x2f,0x2c,0x9a,0x93,0x03,0xb9,0x9a,0xdd,0x37,0x85,0x92,0x06,0x05,0x05,0xf8,0xe4,0x98,0x61,0x08,0x5a,0x4b,0x15,0xf0,0x72,0xa7,0xef,0x28,},{0x23,0x1e,0xc8,0xcd,0x84,0x58,0x59,0xf6,0x99,0x61,0x27,0x51,0x19,0xdb,0xe4,0xf7,0x15,0xe5,0xec,0x5a,0xa9,0x8b,0xb8,0x74,0x16,0x75,0xb3,0xc2,0xd0,0xc8,0x9f,0xee,},{0xe0,0x6a,0x7a,0x41,0x44,0x57,0xbb,0xbe,0xf2,0xba,0xc3,0x77,0x5c,0xca,0xd0,0x87,0xda,0xcb,0x1f,0xa4,0xbf,0x93,0x88,0x94,0xe8,0xc9,0x29,0x11,0x8e,0x09,0xe6,0x78,0xdd,0x19,0x93,0x8b,0xc8,0x8f,0x43,0xed,0x0f,0x7d,0x31,0xcc,0x6a,0x0e,0x60,0x2c,0x4e,0x4d,0x1f,0xee,0x33,0xd4,0x1e,0x74,0xa1,0x19,0xfa,0x2d,0x1e,0x4e,0x34,0x0f,},\"\\x96\\xaf\\x54\\x0e\\xa2\\xb1\\x92\\x3f\\x5f\\xd0\\xaa\\xd3\\x21\\xac\\x03\\x20\\x70\\xc2\\xd6\\x5b\\xa1\\x3d\\x16\\x4e\\x75\\xc3\\x46\\x97\\x58\\xfc\\xf3\\x1b\\xb3\\x16\\x55\\xcb\\x3a\\x72\\x1f\\x9c\\xb3\\x4b\\xe2\\xc9\\x0c\\x77\\xeb\\x65\\xbe\\x37\\xf6\\x06\\xd3\\x2a\\x91\\x7a\\x4c\\xb9\\xa7\\x09\\xac\\x07\\x05\\x22\\x99\\x30\\xef\\x6e\\xb6\\xfd\\xb0\\xfa\\x3c\\x0f\\xd3\\xa9\\x0c\\xe1\\x71\\x67\\x4e\\xe3\\xed\\x06\\x35\\x4b\\xaf\\xc3\\xc7\\x07\\x54\\x67\\xa5\\x74\\x45\\xb8\\x03\\x85\\x64\\x04\\x47\\x90\\x2b\\xe3\\x92\\x62\\x89\\x4b\\x1f\\x64\\xfe\\xa5\\x82\\x87\\xdc\\x32\\x2d\\x19\\x87\\x59\\x72\\xa7\\xc8\\xbe\\x91\\xd3\\x1f\\x02\\x1c\\x70\\xeb\\x68\\x2f\\xdf\\x11\\xa1\\x0f\\x8f\\x58\\x2a\\x12\\x6e\\x06\\x47\\x94\\x83\\x8c\\x69\\xfd\\xf6\\x4f\\x5b\\x6e\\x8b\\xa5\\x9d\\x48\\xb4\\x38\\x4f\\x8e\\x9f\\xb5\\xc0\\x87\\xcc\\x77\\x38\\x29\\x5c\\xd3\\x23\\x44\\xba\\x3b\\x69\\x7e\\xe6\\xb6\\xa8\\xb7\\x8e\\xe7\\xa9\\x57\\x5c\\x97\\x97\\x2a\\x4d\\x1b\\xb1\\x84\\x86\\xf9\\x03\\x7a\\x0f\\x3c\\x6f\\x47\\x1a\\x90\\xf8\\x64\\x98\\xdb\\xc0\\xdf\\x52\\x32\\xc0\\x7e\\x8c\\x01\\xb6\\x90\\xbe\\xe7\\x53\\x02\\x99\\x2a\\x7a\\x36\\xfb\\x44\\x37\\xc2\\x5a\\x8b\\xf5\\xe3\\x4c\\xf7\\xd5\\xb5\\x55\\x72\\xc7\\x00\\xa0\\x79\\x84\\x8d\\x38\\x13\\x64\\xf9\\x94\\x6a\\x91\\xeb\\x16\\x03\\xff\\x3d\\xe5\\xeb\\xdd\\x52\\x3b\\xd9\\x25\\x64\\x81\\x8e\\x23\\x7a\\x53\\xe8\\xf5\\x22\\xde\\xaa\\x2c\\x29\\xb8\\x97\\xe9\\x61\\x58\\x6e\\x10\\x0e\\xd0\\xfc\\x0a\\xd7\\x0d\\x16\\x09\\x34\\xe6\\x94\\x02\\x7e\\x5c\\x95\\x79\\x20\\xbc\\x05\\x46\\xe9\\x01\\xbe\\x39\\xa8\\x45\\x35\\x59\\x7e\\x1f\\x28\\x0c\\x22\\x22\\x67\\xab\\xe9\\x7f\\x41\\x20\\x5d\\x81\\x71\\x82\\x0d\\xd2\\xfa\\xaf\\xc0\\x69\\x94\\x19\\x32\\x1a\\x91\\x60\\xf6\\x9b\\x99\\xfd\\x41\\x18\\x09\\x45\\xb6\\x2d\\x2d\\xd1\\x05\\xcc\\x7b\\xbe\\x82\\x1d\\x28\\x60\\x5e\\x09\\x8e\\xdf\\xa8\\xb2\\x30\\x9a\\xeb\\x05\\x34\\xe7\\x56\\x37\\x7f\\x59\\x93\\x7c\\x67\\x46\\x3f\\xd8\\x7c\\x8b\\x92\\xab\\x58\\x11\\x9c\\xf4\\xce\\x6c\\x66\\x5a\\xf5\\x72\\xfb\\xae\\x1d\\xe4\\xa2\\xcc\\x71\"},\n{{0x7a,0x5c,0x74,0x31,0x4e,0x11,0x83,0x33,0x4a,0x4b,0x62,0x26,0xb9,0xa8,0x2d,0x70,0xfc,0x2a,0x12,0x4e,0x3f,0x87,0xdb,0x6a,0x22,0x83,0xee,0x05,0xb6,0x8e,0x34,0xe0,},{0xbe,0xae,0x7d,0x3d,0xd9,0x7c,0x67,0xf6,0x27,0x3b,0xfa,0xa0,0x66,0x13,0x1f,0xed,0x8a,0xce,0x7f,0x53,0x5f,0xe6,0x46,0x4e,0x65,0x79,0x1c,0x7e,0x53,0x98,0x57,0x6c,},{0xc2,0xab,0x1f,0x6f,0x51,0x14,0xa8,0x4f,0x21,0x85,0x02,0x58,0x2c,0x56,0x7b,0x37,0xa8,0xbd,0xbc,0xdf,0x63,0x40,0xfa,0x46,0x22,0x87,0x3b,0xe8,0x91,0x06,0xf0,0xa9,0x0b,0x48,0x29,0x50,0x5f,0x72,0x12,0x9d,0xf0,0xab,0x3d,0x85,0x13,0x26,0x87,0x74,0xa3,0x4d,0xf3,0xad,0x21,0xce,0x25,0x4b,0x46,0x44,0x88,0xad,0xdd,0x6c,0x9b,0x04,},\"\\x98\\xba\\xc6\\x72\\x47\\x55\\x91\\x29\\x92\\xad\\xc2\\xa4\\x8b\\x54\\x42\\x37\\x6f\\x2d\\x92\\x79\\x97\\xa0\\x40\\xfb\\x98\\xef\\xe5\\x44\\xeb\\x0c\\x8e\\x18\\x66\\xb9\\x61\\x6e\\x29\\x8d\\x33\\x60\\x31\\x6e\\xd9\\x76\\xbd\\x94\\x6a\\x41\\x1f\\xdd\\x3a\\x6b\\x62\\x5c\\x0c\\x1a\\x37\\xaf\\x0f\\x41\\xcf\\x65\\x69\\xa7\\x88\\x4a\\xb8\\x46\\x74\\x91\\xa9\\x87\\xdf\\x3e\\xa7\\xa0\\xb7\\xeb\\xc4\\x69\\x25\\x69\\xa3\\x4c\\xe3\\xa2\\xea\\x35\\x03\\x49\\x5b\\x2c\\x02\\xd4\\x9d\\x7d\\x7d\\xb5\\x79\\xd1\\x3a\\x82\\xcf\\x0c\\xf7\\xa9\\x54\\x7a\\x6e\\xae\\xbe\\x68\\xe7\\x26\\x7d\\x45\\xa6\\x0b\\x8d\\x47\\x72\\x45\\x52\\x28\\xcc\\xa4\\x03\\x6e\\x28\\x2e\\x1a\\x12\\x16\\xf3\\x4c\\xef\\x7e\\xa6\\x8f\\x93\\x82\\x70\\xbd\\xb0\\x42\\x93\\xc8\\x85\\xd0\\x05\\xf9\\xf7\\xe6\\x38\\xa8\\xb4\\xea\\xd2\\x62\\x6c\\x09\\x45\\x17\\x4f\\xf2\\xa3\\xe2\\xd6\\xe1\\x5a\\x4c\\x03\\x38\\xc0\\x9e\\x12\\x60\\xf0\\x92\\x8c\\xa9\\xd3\\x49\\x98\\x24\\xf3\\xfe\\xdc\\x47\\x85\\xda\\x49\\xc5\\xc3\\x4a\\x56\\x85\\x5e\\x24\\x1f\\xac\\xc6\\x34\\x7a\\x39\\x9d\\xdc\\xac\\x43\\x99\\xa8\\xb1\\x58\\x19\\x8c\\x15\\x14\\x61\\xa3\\xb1\\x89\\xe5\\x8e\\xc1\\xf7\\xef\\xcf\\x2a\\xb2\\x03\\x1f\\xb1\\x7b\\x6f\\x03\\x5b\\xa1\\xf0\\x92\\xe9\\xee\\xe2\\xe9\\x2c\\x2d\\x6c\\xc2\\x03\\x22\\x87\\xf8\\x54\\xb4\\x1e\\x70\\xfc\\x61\\xc8\\xd1\\x1a\\x2e\\x4f\\x07\\x08\\xf0\\x2e\\xeb\\xd0\\x2e\\x8c\\x7e\\x8c\\x7b\\x38\\xa5\\x7b\\xfa\\x1a\\x74\\x5f\\x3a\\x86\\xc2\\x39\\x09\\xf6\\xf8\\x9a\\xb1\\x6c\\xe7\\xe1\\x81\\x3c\\x1d\\x20\\x14\\x7f\\x31\\xb4\\xcf\\x2a\\xd0\\xb6\\x06\\xfb\\x17\\xe5\\xac\\x1a\\xb5\\x1e\\xf4\\xa7\\xd8\\x09\\x3c\\xee\\x9a\\x65\\x5f\\x47\\x1d\\xc5\\xb1\\x46\\xbd\\x1b\\x93\\xe5\\x40\\xa3\\xd3\\xd3\\xe2\\xde\\x81\\x05\\x91\\x1c\\x10\\xd6\\xab\\x5f\\xf7\\x9c\\x2d\\x06\\x02\\x7f\\x7a\\x54\\x56\\x1f\\x20\\x71\\x41\\x4b\\xd3\\x30\\xa8\\x78\\x54\\x42\\x25\\x1c\\x81\\x0e\\x23\\x2f\\x83\\xc3\\x67\\xf0\\xbe\\x77\\x99\\xa9\\x3f\\x52\\x38\\xf7\\xf1\\x7b\\x5b\\xe8\\x29\\xfd\\x89\\x12\\x3c\\x04\\x83\\x3a\\xf8\\xb7\\x7e\\x5a\\x43\\x63\\x04\\x7c\\xec\\xa7\"},\n{{0xda,0x80,0x06,0xad,0xc4,0x92,0xca,0x5d,0xc8,0x6c,0x29,0x59,0x43,0x7a,0x75,0xde,0xb6,0x12,0x0f,0xf7,0x87,0xd2,0xec,0xb9,0xc2,0x0c,0x30,0xb5,0x2c,0x26,0xbc,0x41,},{0xff,0x11,0x3b,0xf0,0xaa,0x58,0xd5,0x46,0xf2,0x38,0x5d,0x44,0x4e,0xcb,0x78,0x88,0xf8,0xca,0xba,0x43,0xa1,0x74,0xa8,0x9f,0xd6,0x06,0x5f,0x2b,0x7d,0xc1,0x7b,0xf0,},{0x1f,0x53,0x75,0xdc,0xb3,0xad,0x2b,0xaa,0xff,0x95,0x6d,0x85,0x54,0xec,0xb4,0x24,0x17,0x6b,0xe9,0xa6,0xeb,0x9e,0xa5,0x4e,0x81,0x4e,0x0a,0x73,0xdf,0x2a,0x5d,0x84,0x8a,0xda,0x26,0xba,0x8e,0x18,0x05,0xcd,0x51,0xc5,0xe1,0x69,0x50,0xc1,0xff,0x7d,0x4d,0x27,0x64,0xda,0xa6,0xf4,0xc7,0x50,0x2f,0xb8,0x65,0xcb,0xe5,0x5a,0xaf,0x0b,},\"\\x3e\\xb4\\x32\\x4d\\xbc\\x01\\x49\\xd2\\xe7\\xd6\\xdf\\x63\\x2b\\xb0\\xcb\\xe9\\xa9\\xf6\\xdf\\xa8\\x3e\\x22\\x7f\\xc0\\x7b\\xde\\x1b\\x57\\x7b\\x36\\x11\\xfb\\x92\\x1c\\x9f\\x83\\x13\\xf0\\x68\\xe6\\x29\\x5d\\x49\\x13\\xa8\\x19\\x6b\\xe5\\x30\\xf6\\xa0\\x1f\\x57\\xc0\\x9c\\x02\\x84\\x91\\x44\\x4b\\x78\\x47\\x20\\xe9\\x09\\xea\\x1f\\xb6\\x9c\\x1c\\x1d\\xd6\\x30\\x44\\x00\\x32\\x7b\\x77\\x31\\xb3\\x3c\\xc4\\x6d\\xeb\\x04\\x6c\\xda\\xb6\\xad\\x1b\\x53\\xf1\\x74\\x9a\\x0c\\x65\\xcb\\x9a\\x7e\\x37\\x6f\\xfa\\x02\\x23\\x0f\\x53\\x65\\x84\\xae\\xa2\\x43\\xc6\\x39\\x10\\x3a\\xdb\\xba\\x76\\x43\\x21\\x64\\x9d\\x7e\\x01\\x26\\xf8\\x2e\\x0b\\x4f\\xd9\\xdc\\xb8\\x6c\\x73\\x1c\\xbc\\xc5\\x17\\xf2\\x01\\x68\\x41\\xe9\\x16\\xbc\\xd5\\xfd\\xe8\\x71\\xdc\\x09\\x8c\\xd9\\x13\\xdc\\x54\\x62\\x84\\xd1\\xb2\\x16\\x5c\\x63\\xe8\\x8f\\x32\\xa2\\x78\\x9a\\x50\\x08\\x56\\x37\\x1b\\x50\\xd2\\x2f\\xb8\\xc8\\x7d\\x1a\\x3c\\xae\\xdc\\xdf\\xd0\\x1e\\xe5\\xf8\\x70\\xa5\\x3c\\x28\\x41\\x81\\xd6\\x32\\xec\\x66\\xd4\\x8b\\x6b\\xdd\\x56\\x46\\xac\\x39\\xc9\\xe7\\x53\\x38\\xa5\\x20\\x21\\x20\\x62\\xbc\\x34\\x66\\xef\\x5c\\x58\\x76\\x55\\x70\\xb9\\x05\\xf6\\x3a\\x93\\xd0\\x7f\\x8f\\x1b\\xaa\\xc3\\x52\\x6b\\x01\\x6d\\xa7\\x99\\xf3\\xe9\\xe0\\x3a\\x4f\\x7f\\x81\\x35\\x5e\\x0f\\x7a\\x76\\xf3\\x0a\\x42\\xb8\\x07\\x32\\x20\\x51\\xb7\\x1c\\x62\\x6a\\x7a\\x29\\x6d\\x75\\xb9\\xd9\\xd1\\xa2\\x3b\\xcb\\x13\\xc9\\xef\\x48\\xa9\\x12\\xdc\\x05\\x73\\x25\\xd3\\xbc\\xfb\\x3f\\x9f\\xad\\xaf\\x0c\\x24\\x9b\\x10\\x2a\\xeb\\x85\\x4a\\xa3\\x63\\x1e\\x34\\xf6\\x9a\\xd9\\x0c\\x2a\\xb2\\xed\\x33\\xba\\xcc\\x40\\xb9\\xed\\x10\\x37\\xfa\\xe6\\x7c\\xdf\\x79\\x9d\\x5a\\x9b\\x43\\x78\\x59\\x61\\x12\\x7d\\x62\\xf8\\xe0\\xbc\\x15\\x89\\xfd\\x1a\\x06\\xfc\\xa2\\xae\\xa7\\xcf\\xc0\\x12\\xcb\\xf7\\xb5\\xb2\\x07\\xdd\\xc4\\xe6\\x77\\xd8\\xae\\x4a\\xec\\x10\\x00\\x45\\xce\\x36\\xc0\\x0b\\x74\\xd1\\xd2\\x82\\x50\\x79\\x12\\x36\\xdc\\x5d\\xcc\\x1e\\xd3\\x13\\xc8\\xc2\\x46\\x17\\x26\\x66\\xf7\\x52\\x17\\x43\\x7c\\x60\\x34\\xac\\xd6\\x41\\x98\\xcd\\x96\\xdf\\x2a\"},\n{{0xa2,0x84,0xe2,0x6b,0x97,0xe5,0x38,0x83,0x9c,0x80,0x8d,0x45,0xbd,0xe6,0xf0,0x12,0xa3,0x54,0x45,0x4a,0xef,0x81,0xca,0xa8,0xc5,0x59,0x14,0x62,0x4f,0x2b,0x7d,0x66,},{0x5a,0xe4,0x6e,0x34,0x69,0x5e,0xfa,0xf4,0x63,0xa4,0x20,0x8f,0xc4,0xe3,0x5b,0x81,0xf2,0xc6,0x35,0x93,0x23,0x8a,0x56,0xf2,0x44,0x4b,0x85,0x0f,0x05,0x8c,0x3c,0x5c,},{0xbf,0x11,0x0e,0x2e,0x9c,0xec,0xbc,0x31,0xfa,0x3e,0x0c,0x24,0x38,0xcd,0x1f,0x43,0x21,0xf9,0x2c,0xd2,0x87,0x00,0x5a,0x48,0x52,0x8a,0xdd,0xf7,0x6c,0xad,0x8d,0x88,0xbb,0x22,0x71,0x9e,0xf9,0x1b,0x13,0x95,0x62,0xa1,0x51,0x18,0x38,0x68,0x26,0x74,0xfa,0xa9,0xff,0x7e,0x7a,0xde,0x6c,0x9d,0x57,0x3f,0x84,0x50,0x36,0xd1,0x89,0x05,},\"\\x9e\\xbf\\xe9\\x10\\xb5\\x0a\\x5c\\xb7\\x19\\xd9\\x5b\\x96\\x1e\\x59\\x05\\xf0\\x0e\\xc7\\x94\\x3b\\x55\\x46\\x8a\\xb5\\x95\\x66\\x92\\x01\\x76\\x45\\xb3\\x66\\x07\\x1f\\x8f\\xbb\\x77\\xeb\\x49\\xec\\x73\\xea\\x7d\\x64\\x51\\x14\\x05\\xb9\\x0d\\xe2\\x2d\\xb9\\x8c\\x3e\\xae\\x39\\xc4\\x03\\x9c\\x7a\\x13\\x34\\x30\\xe8\\x01\\x0b\\xdd\\x39\\xa0\\x0f\\xd1\\xa5\\x28\\xb1\\x13\\xda\\xe1\\x49\\xcf\\xad\\x3a\\xe3\\x40\\xda\\x27\\xdc\\xc5\\x07\\x78\\x2e\\xcd\\x89\\x29\\x23\\x75\\x17\\xaf\\xe7\\x46\\x3e\\xca\\x24\\x73\\xc7\\xac\\xf6\\xf7\\xaa\\x04\\xef\\xc9\\xf2\\x66\\xae\\x7b\\x6d\\x63\\xbb\\x8c\\xc2\\xa4\\x38\\xb3\\x44\\x82\\x7f\\x07\\x13\\xd1\\xf1\\x73\\x6f\\x0c\\xbb\\x65\\xb9\\x93\\x53\\xf2\\x03\\x55\\xfa\\x02\\x30\\xd4\\xfa\\x70\\x73\\x28\\xa8\\x66\\x26\\x54\\xe8\\x3a\\xd0\\x53\\x0a\\x10\\xf9\\xa6\\x9e\\x17\\xc0\\x99\\xe1\\xe2\\xb5\\xdb\\x18\\xe5\\xf6\\xf1\\xdc\\xed\\xa5\\x88\\x3e\\x8c\\xab\\x79\\x70\\x1a\\x5e\\x90\\x89\\x56\\x2e\\xd1\\x53\\xad\\x08\\xc6\\x74\\xf0\\x97\\xc2\\x8e\\x4d\\x16\\x63\\x3e\\x09\\x29\\x69\\xa8\\xf0\\xbd\\xac\\x54\\x52\\x7c\\x0e\\xe0\\x3b\\xc2\\x00\\xe5\\xbe\\x61\\x2e\\x3d\\x1e\\xab\\xd8\\x70\\x91\\x10\\x1b\\x49\\x62\\xaf\\xa0\\x7b\\x31\\x08\\x06\\x99\\x2f\\x37\\x30\\x76\\xd7\\x6a\\x58\\x18\\x51\\x18\\x13\\x7c\\x9d\\x26\\xee\\x2c\\xd4\\xc6\\x18\\xc1\\x82\\x83\\xdd\\x19\\xf0\\xe7\\xa0\\x89\\xee\\x37\\x30\\x5b\\x6b\\x95\\x18\\xa7\\x8d\\x80\\x98\\x43\\x6e\\xf6\\x2b\\xe7\\xd6\\x99\\x80\\x8a\\xce\\xcf\\x67\\x93\\x9d\\x61\\xb3\\xe0\\x29\\x37\\xcd\\x8c\\x5f\\x1e\\x74\\x6d\\x42\\x74\\x33\\x4b\\xc9\\xc3\\x7f\\xdc\\xba\\x23\\x4c\\x16\\x6f\\xd7\\x12\\x89\\x3f\\x3a\\x04\\x08\\x32\\xec\\x54\\x25\\xe5\\x7d\\x80\\xf1\\x1e\\xf9\\xca\\x5f\\xbc\\xd6\\xc1\\x47\\xfb\\xbf\\x5e\\x2f\\xae\\x74\\x6e\\x0d\\xdb\\x60\\x58\\x67\\xe3\\xbd\\x05\\x04\\x83\\xc3\\xcd\\x13\\x29\\xab\\xe5\\x7a\\x60\\xbf\\x88\\x89\\x8d\\xc7\\xe8\\x0e\\xde\\x0f\\x45\\x17\\xde\\x8f\\xc8\\x07\\xe8\\x88\\xb6\\x21\\xa0\\x0f\\x66\\x30\\x84\\xff\\x94\\xb9\\x99\\x96\\x62\\x8f\\x3b\\x11\\x69\\x0a\\x60\\xf0\\x91\\x8c\\xb5\\xc9\\xa7\\xef\"},\n{{0xcc,0x97,0xa9,0x63,0x01,0xce,0xed,0x0f,0x92,0x27,0x31,0xb6,0x85,0xba,0xd8,0xad,0x4f,0x06,0x20,0x7b,0xe3,0x40,0xf5,0xa4,0x4f,0xd1,0x87,0xf2,0x99,0x03,0xec,0x20,},{0xeb,0x56,0x3a,0x7b,0xce,0x12,0xdb,0x97,0xf1,0x89,0x1d,0x0f,0x61,0x0b,0xeb,0xd5,0x51,0x01,0xa3,0x12,0x5c,0xa8,0xdb,0xb5,0x0b,0x25,0xa6,0xb5,0x05,0x0d,0x37,0x84,},{0xff,0xbd,0xd3,0x24,0x41,0x81,0xcd,0xf6,0x03,0x4f,0x4a,0x45,0x0f,0xdd,0x95,0xde,0xe4,0x97,0x1a,0x93,0x3f,0x8b,0xe0,0x22,0xbb,0x0a,0x41,0x06,0xae,0xf3,0x9a,0xf3,0x05,0x5b,0x72,0x18,0x81,0xc9,0xb5,0x4d,0x1e,0x99,0xb9,0x40,0x90,0x96,0xfb,0xe6,0xdc,0x2c,0x99,0x66,0xe3,0x67,0x99,0x64,0xbd,0x7e,0xf4,0xc8,0x08,0xca,0xbf,0x01,},\"\\xb9\\xea\\x3b\\x3d\\xf7\\x18\\x7e\\xa4\\x15\\xa3\\xc3\\x35\\xe0\\x83\\x4e\\x10\\xf4\\x40\\x91\\x5b\\x2a\\xd4\\x1c\\x71\\xf2\\x55\\xd6\\x95\\x0a\\x4e\\x91\\x20\\xe4\\xd4\\x94\\xfd\\x9e\\x67\\x2c\\xe5\\x32\\x06\\xfd\\xc4\\x17\\xd8\\x65\\x89\\x7b\\x47\\xac\\x10\\x54\\xe1\\xca\\x10\\x68\\x19\\x52\\x32\\xd4\\x29\\x74\\x35\\xe4\\x4e\\x12\\x24\\xe6\\x6a\\x91\\x2d\\x9d\\x7d\\x18\\x29\\x46\\xff\\x5a\\x9f\\x08\\x5b\\xb8\\xba\\x19\\xc5\\x4d\\x16\\xb5\\x86\\xa9\\xb3\\x04\\x61\\xb6\\x77\\x3b\\x93\\x95\\x03\\x11\\xe1\\x61\\x98\\x86\\xf5\\xa5\\xb3\\xf1\\x11\\xaa\\xad\\x09\\x4b\\xae\\x31\\xc4\\x8f\\x19\\x41\\x08\\x09\\x68\\xbd\\x02\\x77\\xbb\\x6f\\xa9\\x2e\\xeb\\xf3\\x24\\xb1\\x92\\xdf\\x5c\\xc9\\x69\\x51\\x6c\\x78\\xc7\\xb2\\xd1\\x21\\x59\\xb4\\xd1\\xc8\\xeb\\x03\\x16\\x0c\\x4c\\xd1\\x90\\x7f\\x62\\xed\\x4b\\x85\\x4c\\x56\\x9e\\xcc\\x48\\x1c\\x08\\xe6\\x36\\xf4\\x4e\\xd7\\xc3\\x90\\xe5\\x8b\\x59\\x37\\xd2\\x90\\x6b\\x28\\x17\\xbc\\x37\\x69\\xda\\xd9\\xda\\x1b\\x0f\\x79\\x39\\x1b\\x55\\x94\\x20\\x63\\x05\\x5d\\xa0\\xd6\\xf2\\x49\\xa3\\xe4\\x52\\xba\\xdd\\xaa\\x03\\x29\\x98\\xd7\\xf7\\x33\\x98\\xcc\\xd0\\x15\\x1b\\xfc\\x92\\xc5\\xe2\\xfd\\xfa\\x9b\\x14\\x85\\x5e\\x6b\\x0d\\x37\\x46\\xdc\\xe2\\x48\\xe2\\x19\\x67\\x29\\x87\\x25\\x2e\\xc7\\x47\\xdf\\x27\\x47\\xfd\\x3f\\xbd\\x8b\\x71\\x4c\\x88\\x2d\\x70\\x7e\\xe3\\x02\\xa9\\x04\\x95\\x0c\\x34\\x75\\x4f\\x85\\x35\\x0e\\x1a\\xa3\\xf8\\xea\\x62\\x93\\xcf\\x01\\xf7\\x17\\xce\\xfb\\x6b\\x83\\xa2\\x21\\x26\\xdf\\x5c\\x4f\\x56\\x98\\xaa\\xfd\\x06\\xa2\\x24\\x4a\\xd7\\xd0\\x1f\\x34\\x01\\x7c\\xa0\\xec\\xe6\\xf2\\x10\\x40\\x04\\x8a\\xba\\x6c\\xa4\\xae\\xb0\\x43\\x25\\xb9\\x40\\x2b\\xcd\\x43\\xab\\x13\\x0a\\x10\\x57\\x88\\xac\\x3d\\x7b\\x7d\\xa0\\x1e\\xa9\\x42\\x6d\\xd0\\xea\\x19\\x33\\xa8\\x18\\x99\\x33\\xa6\\xc0\\xc6\\xcd\\x64\\x8e\\xa3\\x16\\xa7\\x46\\x9a\\x5f\\xdc\\x6e\\x7c\\x93\\x4d\\x91\\x86\\x58\\x60\\x97\\xb5\\x5d\\xd5\\x1a\\xc4\\x87\\xbb\\x80\\xed\\x11\\xd4\\xdf\\x8d\\x33\\x62\\x6b\\xbc\\xe9\\x5e\\x4f\\x13\\xbd\\x49\\x92\\x2f\\x00\\xc9\\x20\\x22\\x3f\\x4c\\xbf\\x93\\xcb\"},\n{{0x67,0x9e,0x3e,0x34,0x77,0x3a,0xbe,0x4a,0xe2,0x5c,0xae,0x7d,0x07,0xcc,0xd0,0xeb,0x3b,0x0e,0xc0,0xa3,0x5d,0x57,0x02,0x57,0xd6,0x25,0x70,0xde,0x58,0xea,0x25,0x16,},{0x18,0xac,0xff,0xce,0x25,0x3b,0x27,0x25,0x95,0x79,0xed,0x99,0x24,0xf4,0x79,0xca,0xe3,0x12,0x16,0x7b,0xcd,0x87,0x6e,0xdb,0xa8,0x8b,0x5d,0x1d,0x73,0xc4,0x3d,0xbe,},{0x1a,0x51,0x02,0x26,0x28,0xcc,0xbb,0x88,0xea,0xe9,0xb2,0x17,0x73,0xc3,0xf8,0x30,0xb7,0xb6,0xe5,0xbc,0x36,0xc9,0x90,0x3c,0xe7,0x0f,0xbc,0xf4,0x59,0xd6,0xa1,0xed,0x8a,0x1d,0xce,0xff,0x5b,0x19,0x26,0x9e,0xbf,0x5a,0x6f,0xd3,0xd8,0x95,0x88,0x60,0xf5,0x54,0x46,0x1f,0x0e,0x9f,0xc0,0xe2,0x9a,0xf9,0xb1,0xfb,0x17,0x44,0xa8,0x0b,},\"\\xfb\\x2b\\x64\\x8e\\xbb\\x16\\x68\\x82\\x44\\xf7\\x8b\\x2e\\xe9\\xa2\\x73\\x59\\x9d\\x56\\xb6\\x19\\x89\\x00\\xd4\\x38\\xa9\\xe9\\x9c\\x19\\x14\\x25\\xc7\\x2b\\xec\\x4f\\x23\\x58\\x47\\xe1\\x8e\\x47\\xf5\\x7c\\x3c\\xb3\\x96\\x65\\x5f\\x77\\x89\\x21\\xf9\\x08\\x58\\x0e\\x8e\\x83\\xc9\\x6c\\x10\\x8b\\x20\\xdd\\x41\\x66\\x78\\x02\\x1b\\xca\\x25\\x9b\\x98\\x51\\x8f\\xab\\xb2\\xd3\\x53\\x2e\\x48\\x51\\xd9\\xd5\\x2a\\xdd\\x25\\x42\\xc0\\xcb\\x3e\\xfa\\x38\\x57\\xa1\\x7e\\x51\\x24\\x38\\xbc\\x0e\\xc4\\x76\\x2e\\x2f\\x9b\\xab\\xa4\\x29\\xc0\\x3e\\x99\\xbe\\xc4\\x03\\x8e\\x6b\\x0c\\xa4\\x2b\\xff\\x5b\\x23\\x3b\\x24\\xc3\\x33\\xb4\\xca\\xea\\xd2\\xde\\x37\\x4a\\x87\\xb2\\xab\\x5d\\x80\\xd6\\xe4\\x9e\\x44\\x56\\x32\\x9d\\x51\\xae\\x97\\x3b\\xc8\\x3d\\x78\\x62\\xf3\\xd3\\x15\\xe5\\x14\\x48\\x1b\\x12\\x85\\x4a\\x9d\\xfc\\x09\\xe7\\xd1\\x4f\\x0d\\x02\\x2c\\x0b\\xa3\\x02\\x25\\x78\\xeb\\xa8\\xf8\\x74\\xde\\xba\\x4a\\xa8\\xc8\\x33\\xf2\\xb1\\x32\\x86\\x1d\\x4d\\x51\\xe5\\x0f\\xe9\\xaa\\x4b\\x78\\x7b\\xd2\\xf0\\x51\\xaa\\xc5\\x0c\\x37\\x53\\x90\\xcb\\xbc\\xfb\\xa2\\x00\\x2b\\x80\\xad\\x00\\xcd\\xc1\\x29\\x80\\xf8\\xba\\x8b\\xcb\\x70\\x64\\xaf\\xc0\\x4d\\x5c\\x46\\x82\\xc1\\x02\\x9b\\x10\\xa6\\xd4\\x5f\\xe6\\xec\\xd7\\x04\\x24\\x5f\\xaf\\x59\\x8c\\x46\\x59\\x59\\x7c\\x5d\\x68\\xa1\\x92\\xcc\\x1c\\xd4\\xfa\\x45\\xe8\\x4b\\x54\\x9e\\x8e\\x5e\\x67\\xda\\xa8\\x79\\xae\\x5a\\x52\\x0a\\x6b\\x55\\x50\\x51\\x98\\x76\\xa5\\x62\\xac\\x49\\xc6\\xdb\\x0a\\xa7\\x6e\\xc6\\x9b\\xb6\\x4d\\xd6\\xb5\\xe1\\xa3\\xaf\\x2e\\x13\\x1e\\x72\\x2e\\x7c\\xdd\\x05\\xbe\\x34\\xb5\\xfc\\xc6\\x25\\x9a\\xa1\\x24\\xcc\\xf8\\x14\\xcf\\x5b\\x50\\x0d\\x17\\x6b\\xe2\\x8e\\xbc\\x40\\xbb\\x21\\xf0\\x3e\\x24\\xcc\\xc1\\x31\\xe0\\xf4\\x1d\\xaa\\x1c\\xa0\\x2e\\x6b\\x00\\xc9\\xc5\\x3f\\xad\\x12\\x48\\x61\\x4e\\x94\\x0d\\x4b\\x23\\x77\\x60\\xab\\x75\\x69\\xa7\\x67\\xb7\\x51\\x5d\\xd2\\xd6\\x23\\xe5\\x7a\\x28\\x41\\xb7\\xd2\\x44\\x1c\\xf4\\x30\\x49\\xe4\\x69\\x8d\\x2f\\x9c\\x9e\\xae\\x7b\\x29\\x10\\xf6\\xad\\x65\\xed\\xf9\\xcb\\x2b\\xdb\\xd9\\xb2\\x9f\\x60\\x6e\\x0d\"},\n{{0x9b,0xfa,0x60,0x92,0x3a,0x43,0xed,0x0c,0x24,0xe2,0xf1,0x2f,0x5b,0x86,0xa0,0x71,0x63,0x29,0xf9,0x3d,0x4d,0x8d,0x3e,0x06,0x23,0x80,0x02,0x89,0x32,0x78,0xc1,0x9a,},{0xfb,0x1c,0x00,0x68,0x77,0x81,0xb5,0x5b,0x89,0x3d,0x6b,0x2f,0x4f,0x49,0xcf,0x5f,0x73,0xd2,0x90,0x3c,0x31,0x6d,0x1e,0xee,0x75,0x99,0x1d,0x98,0x3a,0x18,0x68,0xc0,},{0x55,0xf2,0x02,0xef,0xb2,0xa5,0x7b,0xe8,0xb4,0xe4,0xfd,0x89,0x4d,0xcc,0x11,0xa4,0xfc,0x5f,0x82,0x76,0x61,0x8e,0xf5,0xcd,0x34,0xa4,0x49,0x5a,0xdb,0x01,0x6a,0x29,0x8e,0x64,0x80,0xa3,0x5c,0xfc,0x53,0xed,0xb2,0x5f,0xf1,0x49,0x9f,0xc5,0x32,0xa3,0x30,0x61,0xcc,0x01,0xa2,0x50,0x45,0x8a,0xa5,0xe4,0xf7,0xf1,0x6f,0x51,0x44,0x0d,},\"\\xa9\\x90\\x28\\xb0\\xf4\\xa3\\xaa\\x5e\\x79\\xab\\xef\\x6c\\x0d\\xf4\\xa7\\x83\\xef\\x47\\x0f\\x1a\\x29\\xba\\x51\\xeb\\xa0\\x0f\\x62\\x14\\xe8\\x40\\xfe\\x19\\xe5\\xb6\\xdc\\x60\\x21\\xab\\x59\\x9b\\xb2\\xee\\x36\\x99\\x57\\x60\\x15\\xd7\\x9a\\x79\\x39\\xaf\\x82\\x35\\x35\\xb6\\x30\\xe3\\x93\\x8c\\x72\\x3f\\x6e\\x0b\\x92\\x29\\xd4\\x6b\\xb3\\x37\\x9a\\xcd\\xba\\x58\\x7c\\x23\\x85\\x67\\xe3\\xd8\\x9b\\xc3\\xbd\\x35\\x19\\xb7\\x27\\xfc\\x69\\x4f\\xff\\x11\\x18\\xbf\\x22\\xc8\\xbc\\x8b\\xc8\\x2c\\x4d\\xf7\\xf5\\xad\\x38\\xde\\x05\\xfe\\x9f\\x76\\x29\\x99\\xec\\xaa\\x79\\x5f\\x3a\\xe6\\x30\\xa9\\xa3\\x16\\xd2\\x6d\\xce\\x9f\\x15\\x68\\xff\\xa3\\xf2\\x2b\\x02\\x95\\x21\\x40\\x20\\xb3\\xd3\\xf5\\x33\\x7c\\x14\\x95\\x68\\x19\\x22\\x18\\x13\\x2a\\x90\\x70\\x92\\x79\\xc0\\x1d\\x23\\xba\\xef\\xa6\\x69\\xe1\\xc4\\xe4\\x20\\x38\\x17\\x3f\\x13\\x19\\xc2\\x12\\xda\\x14\\x4f\\x1c\\x4e\\xa4\\xc5\\x2c\\x00\\x5c\\xbc\\x0b\\x5b\\xc2\\x83\\xe7\\x44\\x83\\xa0\\xdc\\xa6\\x92\\x79\\xde\\xb1\\x7a\\xe5\\xb2\\x9c\\xfa\\xfa\\x7d\\x00\\x63\\xf4\\xe1\\xbc\\x93\\x53\\x7e\\xfd\\x93\\x7e\\x58\\xa8\\xac\\xa7\\x37\\x22\\x8f\\x93\\x7f\\xf2\\xa7\\x41\\x89\\x0e\\x96\\xc5\\x72\\x5d\\xa1\\x1b\\x45\\xc4\\x13\\xa9\\xbb\\xb4\\x18\\x0a\\x41\\x99\\x87\\xbb\\xf0\\x46\\xbf\\xd3\\x46\\x29\\x5d\\x62\\xf0\\x81\\xc7\\x6d\\xaf\\x2b\\x0e\\x1e\\xb4\\xf6\\x71\\x2f\\xee\\xbe\\x6f\\x0a\\x92\\xe3\\x58\\xe7\\xdd\\xb8\\x58\\x96\\x50\\x7c\\x34\\x0a\\x01\\xf6\\x8d\\x1b\\x0f\\x08\\x57\\x78\\xb7\\xc4\\x4b\\x01\\x4a\\xa6\\x67\\x3e\\x50\\x17\\x96\\x95\\x9a\\x17\\xa6\\x88\\xdb\\x09\\x59\\x05\\x84\\x88\\xa7\\x11\\x25\\x72\\xf2\\x3c\\xf9\\xcd\\xb5\\x3b\\x5e\\xb4\\xb4\\x5f\\x59\\x53\\xba\\x0c\\x0c\\x69\\x0f\\x86\\xbd\\x75\\xe8\\x9a\\x04\\x7b\\xeb\\xaf\\x84\\x7c\\x1d\\xfc\\x34\\x5a\\x4f\\x3c\\x7d\\x3b\\xee\\xc9\\x8b\\x84\\xb0\\x21\\x90\\x03\\xe8\\x19\\xf5\\xc2\\xad\\xb4\\x5f\\x87\\x17\\x90\\x3d\\x1f\\x5b\\xd5\\xd7\\x19\\x14\\xc5\\x6f\\xca\\xbc\\x7a\\x29\\x0f\\x9c\\x41\\x69\\x9c\\x95\\x58\\x4d\\x6a\\x3a\\x16\\x34\\x0c\\xb1\\x7b\\xaa\\x1f\\xc5\\xe5\\x46\\x7a\\xf7\\xac\\x32\\x21\"},\n{{0x6e,0x3a,0xf4,0x5e,0x66,0xe2,0x28,0x90,0xc3,0xf3,0xc9,0x34,0xf5,0x23,0xa4,0xd6,0x94,0x27,0x97,0x6e,0x6e,0x52,0x62,0x5f,0x8b,0xad,0x55,0x89,0x93,0x96,0x32,0x19,},{0xe0,0x97,0x36,0x4e,0x76,0xff,0x9f,0x2e,0x1d,0x16,0x7f,0x6b,0x20,0xc1,0xbc,0x58,0x30,0x08,0x5e,0x7e,0xc9,0x93,0xc1,0x38,0xf8,0xb1,0xb2,0x17,0x56,0x37,0xe7,0x41,},{0x26,0xba,0x56,0x2e,0x8a,0x40,0x65,0x70,0x82,0x07,0xc2,0x5e,0x23,0x9b,0x78,0x0a,0xee,0x38,0x79,0x4c,0xf9,0x83,0xa3,0x7a,0xcb,0xb9,0xd5,0x57,0xa6,0x5c,0xee,0xd3,0xc0,0xda,0x47,0xd1,0x7f,0x3e,0x8b,0x8f,0x4e,0xeb,0x1b,0x65,0xa2,0xc1,0x82,0xea,0x6f,0x29,0x62,0x3b,0x63,0xbb,0x0f,0x1c,0x72,0x59,0x26,0x83,0xb1,0x26,0xb9,0x01,},\"\\x5c\\xfc\\x2f\\x4b\\x55\\x9f\\x82\\x05\\xb3\\x91\\x02\\x08\\x76\\x17\\xf4\\xd8\\x6c\\x7c\\xe6\\xcb\\x25\\x1e\\x5f\\x89\\x60\\x1d\\xfc\\x88\\xed\\x28\\xe8\\xd7\\xa6\\x70\\xec\\x00\\x87\\xd2\\xea\\x5d\\x89\\x30\\x21\\xc7\\x04\\x4d\\xa2\\x89\\x9a\\x22\\xd7\\x76\\xfe\\x90\\x17\\x0e\\x51\\xc2\\x03\\x25\\x06\\x90\\xd3\\x7a\\x29\\x45\\x55\\xe7\\x4a\\xf9\\x23\\x4c\\xbf\\x1a\\xd8\\xf2\\x2c\\xee\\x89\\x74\\x82\\x8a\\x0d\\x09\\xe9\\x55\\x4b\\x71\\xee\\x3b\\xcf\\x88\\x0a\\xb9\\x83\\x25\\xf7\\x06\\x27\\x21\\x94\\xeb\\x2e\\x80\\xc7\\x01\\xd4\\x41\\xb5\\xf8\\x66\\x85\\x61\\xb8\\x88\\x49\\xf8\\x27\\xaf\\x70\\x3a\\xb0\\x95\\x41\\x05\\xfd\\x3c\\x54\\xb3\\xf6\\xec\\x54\\x93\\x59\\x6d\\x0e\\x3b\\xc6\\x78\\x18\\x04\\x83\\x10\\xc4\\xa3\\xe0\\xc5\\x56\\xbc\\x80\\x67\\x5f\\x20\\x1f\\x9b\\xb9\\xc6\\x53\\x8a\\x41\\xd9\\x9a\\xa4\\x0c\\x88\\x6f\\xc4\\x31\\x46\\x72\\x18\\xd8\\x19\\xc2\\x3e\\x78\\x49\\x8a\\xed\\x06\\x13\\xfa\\x6f\\x97\\x3e\\x22\\x11\\xdf\\x9f\\xb8\\x7f\\x44\\x11\\x6f\\x3f\\xe4\\xc2\\x6d\\x6c\\xb2\\xfa\\x33\\x4c\\x87\\xf7\\x8c\\x08\\xca\\x8c\\x9b\\x90\\x41\\xd8\\x3a\\x12\\x30\\x67\\x7e\\x0a\\xf7\\x88\\x59\\x8a\\x42\\xe4\\x4c\\xfd\\xf6\\x96\\x4a\\x4e\\xe8\\x0e\\x38\\x40\\x2b\\xa6\\x7c\\x73\\xa5\\x81\\xe5\\x52\\xba\\xa2\\x28\\x24\\x25\\xcb\\x2c\\xa1\\x7c\\xa9\\x2e\\xdf\\xbf\\x98\\x29\\x91\\x02\\xfb\\xa7\\x61\\xb9\\xb7\\x1a\\x54\\x52\\x14\\x1b\\xb9\\xc1\\x8d\\xd9\\x5f\\xeb\\xc2\\xa7\\x82\\xde\\x9c\\xee\\xc0\\x8b\\xd2\\xee\\x3f\\x7f\\x0c\\x1b\\xd8\\x94\\x6d\\xba\\x99\\xcf\\x9e\\xa0\\x86\\xab\\xaf\\xd3\\x7c\\x9c\\xa6\\x02\\x13\\xf0\\xde\\x17\\xc6\\x1f\\xf9\\xc3\\x91\\xc9\\x81\\x8e\\xd5\\xcd\\x85\\x71\\x77\\x8b\\x7d\\xcc\\x13\\x22\\x49\\x62\\x38\\x6f\\xb8\\xca\\x14\\xf8\\x61\\xe9\\x9f\\x3b\\x18\\xed\\xac\\x8a\\x5f\\x13\\x0f\\x7b\\xfc\\xd4\\x5d\\x04\\x5d\\x0f\\xf3\\x4c\\x81\\x57\\x2a\\x51\\x23\\x63\\xd6\\x53\\x0f\\x93\\x81\\x3e\\x5f\\xb1\\x0e\\x9c\\xb8\\x33\\x8a\\x7f\\x93\\x80\\x04\\x91\\x00\\x6f\\x44\\x63\\xe8\\x9f\\x0e\\xd4\\x53\\x0e\\x5f\\x12\\xdf\\x67\\x4f\\x59\\x89\\x04\\x78\\x0a\\xd0\\x81\\x2b\\x1e\\x35\\x21\\xfc\\xd0\\xf8\\x3e\"},\n{{0x5f,0x1f,0x27,0x18,0x44,0xd9,0xed,0x5a,0x6a,0x6f,0x20,0x9a,0x21,0x40,0x8d,0xae,0xa4,0x70,0xf6,0xfd,0x53,0xba,0x64,0x79,0xd7,0x40,0x71,0x05,0xb7,0xde,0x4d,0x65,},{0x60,0x85,0xd7,0xfb,0x5a,0x9b,0x2e,0xd8,0x06,0xc1,0xfd,0x30,0xa2,0xaf,0xde,0x76,0x09,0x61,0xf7,0xa3,0x6b,0x48,0xf4,0x87,0x52,0x46,0xe6,0x15,0xa2,0xbd,0x99,0x28,},{0x31,0x9b,0xb4,0xde,0xb2,0x17,0x81,0x12,0x24,0x1b,0x3f,0xb8,0xf4,0x6e,0x10,0x5c,0x3b,0x8e,0x4e,0xf7,0x21,0xeb,0x20,0x0d,0x76,0x2e,0xf3,0x63,0xe2,0x71,0x6f,0x2a,0x89,0xf8,0x0b,0x5b,0x9e,0x89,0x97,0x08,0x90,0xa0,0x98,0x92,0xad,0x6a,0x58,0x80,0x8b,0x47,0x7e,0x94,0x3b,0x3c,0xfa,0x77,0x77,0x4a,0x36,0x45,0xbc,0x74,0x5f,0x03,},\"\\xee\\xd6\\xb4\\x47\\x5d\\xc2\\x63\\xbd\\x22\\x07\\xfe\\x9d\\x41\\xd4\\x82\\x82\\xb7\\x13\\xf6\\x80\\xf2\\xe0\\x37\\x38\\x4f\\x18\\xb4\\xbf\\x22\\x43\\x47\\xf5\\xe4\\xc4\\xb0\\x60\\xb8\\x08\\xd4\\x12\\xea\\xab\\xcf\\x73\\x3d\\xc3\\x9a\\x40\\xc6\\xbd\\xa0\\x50\\x5c\\xe7\\x1f\\xa8\\x23\\xbd\\x1b\\x17\\x94\\x84\\x76\\x78\\xdc\\x03\\x4e\\x79\\x99\\xc1\\x63\\x69\\x34\\x0b\\xc6\\x0c\\x64\\xd0\\x9b\\xb9\\x18\\x7b\\x2e\\x32\\x60\\x55\\xa0\\x53\\xf8\\xe5\\x05\\xea\\x41\\x96\\x86\\x14\\x71\\x62\\x2d\\xb0\\xe4\\x6f\\x0f\\x89\\x54\\xd8\\xa1\\xf0\\x73\\x32\\xda\\x4d\\x8a\\xc5\\x57\\x12\\x62\\x60\\x09\\x91\\x2f\\x8a\\x15\\xa9\\xcd\\x63\\xa7\\x4a\\x03\\xc9\\x2f\\x24\\x6c\\xb6\\x3c\\xc7\\x3f\\x92\\xe5\\x1d\\xad\\x1b\\xc9\\x71\\x5b\\x1e\\xd3\\xfe\\x5f\\x2e\\x1b\\x29\\x59\\xb9\\xb7\\x1e\\x0e\\x37\\x36\\x0e\\xb2\\x95\\x36\\xcf\\x79\\x71\\x47\\xfa\\xb1\\x08\\x64\\xd6\\x14\\x6c\\x36\\xb8\\x23\\x35\\xa0\\xce\\x93\\x14\\x08\\x47\\x9c\\x7e\\xde\\x48\\x4f\\xf7\\x3e\\x2d\\xbf\\xff\\xc6\\xc9\\x22\\x7e\\x16\\xd7\\xa2\\x3f\\x4d\\x90\\xf1\\x55\\x84\\x51\\x4c\\x39\\x59\\x4e\\x17\\xbf\\xbb\\x29\\x5d\\xe9\\xd6\\x2a\\xda\\xdb\\x58\\x9d\\xbb\\xe0\\xb0\\x6d\\xc8\\xda\\xc5\\xb3\\xbf\\x51\\x7b\\x24\\xc1\\x83\\x7b\\x39\\x47\\x2a\\x6d\\xd3\\x89\\x31\\xff\\xbb\\xff\\x5b\\x76\\x36\\x38\\x80\\x5b\\x4e\\x22\\x32\\x1f\\x7a\\xfe\\x92\\xcd\\xf5\\x02\\xfb\\x63\\xd1\\x09\\xdd\\xcd\\x9e\\x40\\x51\\xad\\x6f\\x45\\x59\\x85\\x32\\xbe\\x17\\x95\\x23\\x71\\x08\\x51\\xd3\\x93\\x1e\\x88\\x7d\\x02\\xc3\\x45\\xc7\\x9c\\x48\\x9f\\xc1\\x06\\xa4\\xae\\x16\\x2f\\x7d\\xf7\\x1a\\xb9\\x0b\\x75\\x1d\\xa7\\x03\\x8a\\x6d\\xf7\\x61\\x6c\\xfc\\x11\\x88\\x7e\\x21\\x06\\x8f\\xb9\\xe3\\x3b\\xe5\\x66\\x40\\x2b\\xe5\\x04\\xf3\\xfc\\x27\\x42\\xb8\\x81\\x50\\x9b\\xd4\\xfe\\x6a\\x0f\\xc7\\x22\\x64\\x98\\x83\\xf8\\xcb\\x65\\x55\\x98\\xa1\\x5a\\x1d\\x4c\\x22\\x9d\\xd8\\x6b\\x5c\\xae\\xb7\\x11\\xa0\\x28\\xde\\xfd\\x43\\x11\\x54\\xbb\\xa4\\x6b\\x48\\x17\\x2a\\x4d\\x8c\\xbd\\x45\\xbc\\x90\\xaa\\xf8\\x74\\xb6\\x08\\x5f\\xa2\\x84\\xf5\\xfe\\xd6\\x55\\xad\\x6f\\xa1\\x7d\\x67\\xb3\\xb9\\xa7\\x96\\xfa\\x3e\"},\n{{0x04,0x8a,0xc9,0xec,0x3e,0xcb,0x30,0xa3,0xb1,0xbf,0xda,0x9b,0x3b,0x79,0xa4,0x8c,0x07,0x93,0xb4,0x90,0x87,0x9e,0x3c,0x8a,0x5e,0x23,0xee,0x2b,0xab,0xcd,0x9b,0x7c,},{0x94,0x6c,0x18,0x6f,0xea,0xfc,0x35,0x80,0xa5,0x8d,0xdd,0x52,0x6f,0xf2,0x29,0xc0,0x47,0x20,0x25,0x0f,0x4c,0xf6,0xbd,0xe0,0x27,0x1e,0xef,0x9b,0x12,0xb1,0xc3,0xf3,},{0x2e,0xcf,0x5b,0x8a,0x59,0xa8,0xe2,0x7d,0x25,0x89,0x0a,0x2a,0xa3,0x2f,0x4a,0x06,0x73,0x27,0x5d,0x53,0x9b,0x17,0x4a,0xfa,0x7b,0x2c,0xeb,0xf2,0xe7,0x62,0x80,0xdf,0xfc,0x33,0x8e,0xde,0x85,0xac,0x8f,0x61,0x40,0x39,0x56,0x0e,0x28,0x06,0xd9,0xe1,0xe3,0xcf,0x9c,0xce,0x2c,0xeb,0x78,0x74,0xff,0xe1,0xa7,0xe8,0x0c,0xde,0xf4,0x0b,},\"\\xd6\\x8b\\xe8\\xef\\x7b\\x4c\\x7a\\x42\\x89\\xf2\\xb1\\x8b\\x16\\xad\\xe9\\x7f\\x4e\\x4f\\xa1\\x64\\x52\\x97\\x6a\\xfb\\x58\\x16\\x93\\x38\\x0c\\xc5\\x4d\\xe3\\x8a\\x07\\x58\\x7f\\x32\\xe2\\xd4\\x54\\x9f\\x26\\x59\\x5f\\xee\\x23\\x93\\xbd\\x06\\x2e\\x9b\\x00\\xba\\xe7\\x24\\x98\\xe4\\x14\\x8c\\x8b\\x88\\x2a\\x88\\x40\\xe1\\x5b\\x58\\x5c\\x82\\xb5\\xc0\\xde\\xfb\\x23\\x35\\x18\\x40\\x99\\x16\\x61\\x5d\\xeb\\x3a\\x55\\xa5\\xf8\\x4e\\x6b\\x3a\\xab\\x93\\x84\\x4d\\xe3\\xb1\\xe4\\xd8\\x6e\\x09\\xf8\\x89\\xac\\x71\\xc3\\x24\\xeb\\x12\\xd0\\xfb\\xd8\\x61\\xcc\\x31\\x22\\x95\\x40\\xe8\\x43\\xa3\\x4f\\x8d\\x5b\\xe4\\x7c\\x0e\\xc0\\xd2\\x3d\\xf4\\x3e\\x06\\x81\\x3f\\xca\\x30\\x94\\x39\\x90\\x4c\\x16\\x7d\\x10\\x43\\xc0\\xdc\\xd4\\x44\\xb0\\x04\\xbe\\x1f\\xf2\\x7b\\x78\\x62\\xb0\\x0e\\xba\\x94\\x33\\xb9\\x4b\\x0f\\xcd\\xc6\\x75\\x21\\xda\\x0c\\x1d\\x53\\x58\\x63\\x6c\\x78\\xf5\\x30\\x43\\x11\\x64\\xdd\\xe2\\x0a\\x1c\\xf1\\x64\\xf5\\x1e\\x29\\xb8\\xe6\\x3e\\xac\\xde\\xcc\\x86\\x9b\\x41\\x39\\x2c\\x66\\x76\\x64\\xd9\\x16\\x80\\xd9\\xac\\x51\\x6a\\xf5\\x48\\xf0\\x9e\\x60\\x56\\x4e\\x81\\x4e\\x36\\xe0\\xb5\\x63\\xdb\\xae\\x55\\xc6\\x27\\xff\\xc1\\x41\\x58\\xa5\\x6d\\x8e\\xb3\\x60\\x9e\\x17\\x43\\x81\\xb2\\x1d\\xe4\\xba\\x82\\x34\\x44\\x66\\xdd\\x57\\x7f\\x4d\\x11\\x03\\xc4\\x3c\\x27\\xfb\\x83\\xcb\\x83\\x3d\\x87\\xaf\\xdf\\x74\\x12\\xb4\\x09\\x09\\x09\\xb1\\xdd\\xe2\\x64\\xda\\xdd\\xce\\x96\\x7f\\x49\\x6b\\xf6\\xf1\\x71\\x12\\xbf\\x35\\x1e\\x41\\x7d\\xb5\\x95\\x3b\\x13\\xb8\\xf0\\xfc\\xcc\\xbf\\x30\\xf5\\xbc\\xf3\\x76\\x86\\x1c\\x12\\xef\\x20\\xee\\xc8\\x9e\\xd2\\x3c\\xf3\\x84\\xee\\x78\\xdc\\x6e\\xb4\\x0f\\xd5\\x81\\x1a\\x7b\\x23\\x92\\x7c\\x13\\xe7\\xdc\\x5d\\xa3\\xa9\\x21\\xb8\\x83\\xa9\\xb2\\xb1\\x15\\x59\\x70\\xfb\\x0d\\xa7\\xd2\\x99\\x3d\\xcd\\xfd\\x43\\x43\\x64\\x2a\\x9d\\x5a\\x63\\x47\\xe4\\x3c\\x19\\x3b\\x57\\x93\\xe4\\x45\\x3a\\xc1\\x53\\x7a\\xa3\\xd0\\x4d\\xc9\\xf7\\x74\\xe8\\x40\\x93\\x48\\x81\\xd7\\x8a\\x39\\xba\\x25\\x04\\x38\\xc5\\x07\\x25\\x0e\\xed\\x2f\\x6e\\x07\\xcc\\x95\\x3f\\x78\\x3d\\x6b\\x72\\xb1\\xcc\\x61\\x99\\x81\"},\n{{0x2f,0x05,0x7d,0x20,0xb1,0x67,0x85,0x31,0x61,0x1f,0x48,0xf0,0x03,0xb7,0xd2,0x2e,0xba,0x5d,0xbb,0xd7,0xe2,0xdd,0x41,0xb7,0xc7,0x9d,0x09,0x07,0x1f,0x85,0xe9,0x93,},{0x62,0x0f,0xc4,0xea,0xa3,0x4d,0x78,0x7d,0xf6,0x75,0xcc,0xbf,0x7e,0x89,0x32,0x04,0x82,0x8d,0xb9,0x2e,0xad,0x17,0xa1,0x16,0x5a,0xc7,0xfa,0x1a,0xb4,0x27,0x19,0xd8,},{0x30,0xdf,0x7b,0x0b,0x1c,0x04,0xfb,0x1e,0xfa,0x35,0x17,0xe9,0x28,0xd6,0xd5,0x7c,0x2c,0xa0,0xd0,0x7f,0x4e,0x04,0xff,0xb1,0xf0,0x8b,0x47,0x92,0xc5,0x93,0x7d,0xd2,0x71,0xcc,0xab,0xdc,0x00,0xdc,0xe8,0x50,0xaf,0xe5,0x0a,0xf5,0x99,0x0f,0x22,0x4e,0x84,0x20,0xa6,0x81,0xd9,0x5f,0x9f,0x7f,0x51,0x5a,0xfe,0xc1,0x02,0xef,0xd1,0x0e,},\"\\x6e\\x35\\xf6\\xea\\xa2\\xbf\\xee\\x06\\xea\\x6f\\x2b\\x2f\\x7a\\xb1\\x5f\\xa9\\x7c\\x51\\x80\\x95\\x8a\\xf2\\xe9\\x0a\\xf9\\x18\\xad\\xfb\\x3d\\xb8\\x32\\x3f\\x44\\x7c\\x7b\\xf2\\x6d\\xc5\\x34\\x99\\x7c\\x38\\xb7\\xfc\\x97\\x7f\\x64\\x2d\\xe2\\x88\\xcd\\xf2\\x53\\x07\\x1c\\xac\\xf3\\x56\\x4e\\x3b\\x8e\\xd6\\xdc\\xe5\\x7d\\xdf\\xba\\x9f\\xf7\\x83\\xba\\xd2\\xe7\\x6d\\xf1\\x24\\x82\\x8f\\xc1\\x03\\x1a\\xcf\\xad\\xf0\\x1a\\x44\\xd4\\x1b\\x42\\x16\\x1a\\xd9\\x06\\x03\\x01\\xc1\\xaf\\x19\\x28\\xb9\\xe5\\xb7\\x3b\\x9b\\xd2\\x1c\\xac\\x60\\xa8\\x42\\xb5\\x04\\xdc\\x3c\\xc3\\x11\\xc5\\x22\\xe3\\xbb\\x04\\x8b\\xf2\\x21\\x44\\x4f\\x53\\xce\\xb0\\x8e\\x77\\xe9\\x48\\x59\\x0e\\x94\\xed\\x98\\xf1\\xb6\\x04\\xcb\\x9e\\xad\\xc9\\x3b\\xbe\\x74\\x31\\xc1\\x14\\x9b\\x23\\x19\\x3f\\xf9\\x3e\\x85\\x69\\xf1\\x13\\xe1\\x68\\x4d\\x89\\x76\\xec\\xae\\x6f\\x09\\xe0\\x10\\x36\\x14\\xbe\\x41\\x8a\\x47\\x2e\\xf5\\x5b\\xb8\\x89\\x0d\\x72\\xb3\\x41\\xcd\\xd7\\x50\\x5b\\x50\\xa4\\x55\\x22\\xab\\x63\\xed\\x79\\x1c\\xe8\\xf8\\x2f\\xed\\xdd\\x7a\\x62\\x0a\\x4f\\x6f\\xb1\\xd2\\xfb\\x0e\\xd0\\xc4\\x56\\x0d\\x78\\x44\\x6d\\x83\\xb3\\xd1\\xb1\\xbb\\x56\\xb3\\x66\\xd1\\x96\\x02\\x0d\\x06\\x24\\xb1\\xfb\\xdb\\x75\\xce\\x73\\x5d\\xd4\\x3e\\x8e\\x8d\\xf1\\x63\\xc4\\x4e\\x23\\x69\\x93\\xdc\\xa3\\x41\\xf5\\x13\\x2d\\x82\\x5d\\x0a\\x4e\\x39\\x3a\\x19\\xd3\\x8f\\x61\\xe1\\x1e\\x0c\\xf3\\x92\\xcb\\x9b\\x64\\x6e\\xa2\\x3c\\x58\\x09\\x98\\x24\\xdd\\x8d\\x9f\\xbe\\x26\\xa4\\x9e\\x33\\xb2\\x3d\\xf8\\x06\\x07\\xab\\xf1\\x97\\x15\\x79\\x9c\\x19\\xac\\xc7\\x22\\xed\\x9b\\xcf\\x94\\xa0\\xc2\\x9a\\xd2\\x4b\\x78\\xb0\\xb0\\x35\\xb3\\x24\\x1c\\x64\\xcd\\x86\\xed\\xea\\xc8\\x10\\xe6\\x67\\x45\\x69\\x4b\\x5e\\xb1\\x62\\x50\\x60\\xed\\xf2\\xd9\\x49\\xde\\x0d\\x34\\xf5\\x22\\xdf\\x2d\\xc6\\x0a\\xe6\\x94\\xa1\\x93\\xf3\\xb8\\x2c\\x1d\\x6f\\x83\\xa0\\xcb\\xb8\\x40\\xf4\\x6c\\x49\\xa3\\xd7\\xd1\\xcf\\x06\\xde\\xaf\\x96\\xc6\\x4f\\x8f\\x9e\\x17\\xbd\\x9a\\xd5\\x12\\xae\\x63\\x09\\xc4\\x86\\xd9\\xe2\\xa7\\x8d\\xce\\xec\\xa4\\x73\\xa0\\x42\\x1d\\xd1\\xb6\\x43\\xc7\\x87\\x54\\x27\\x1b\\x53\\xce\"},\n{{0x3a,0x3d,0x27,0x97,0x0f,0xe2,0xac,0xb6,0x95,0x1e,0xdd,0x5c,0xa9,0x0d,0xda,0x0f,0xc6,0xdd,0x22,0x9c,0x0a,0x56,0xdf,0x6e,0xb1,0x1a,0x9c,0x54,0xd2,0x42,0xdb,0xbf,},{0x56,0x4f,0x0d,0xc3,0xdc,0x47,0x20,0xe6,0x8e,0x44,0xdd,0x16,0x71,0x1e,0x04,0x9e,0x61,0x12,0x00,0x00,0x98,0xfa,0x62,0xa1,0xb9,0x8c,0x28,0x80,0x42,0xf7,0xc3,0xbd,},{0x22,0xeb,0x8e,0xa0,0x50,0x73,0x49,0xb6,0xa0,0xac,0xe2,0x5c,0xf9,0x18,0x0c,0xb0,0x8e,0x03,0x57,0xb0,0x45,0x02,0x90,0x5f,0xbe,0x69,0xb4,0xe2,0x1b,0x2b,0xd9,0x4e,0x22,0xcf,0xbd,0xb8,0x51,0xae,0x71,0x6a,0x5c,0x25,0x3c,0x70,0xd5,0xe2,0xb2,0x4e,0xa7,0x8f,0x35,0xbc,0x21,0x32,0x92,0x54,0x3d,0x94,0xe1,0x41,0x10,0xb2,0x41,0x06,},\"\\x43\\x74\\xf6\\x1c\\x2c\\xd8\\x8a\\x3b\\x89\\x72\\x24\\x9b\\xfa\\x79\\xb3\\x6a\\xb6\\x9e\\x3e\\xd4\\x84\\xcc\\x60\\xe5\\xd9\\x54\\x1f\\xa7\\x68\\x6c\\xf4\\xee\\xd1\\x21\\x0c\\x5d\\x0d\\xcf\\x42\\xdd\\x25\\x97\\x25\\x01\\x90\\x91\\x93\\xca\\x76\\xae\\x6e\\xb7\\xf4\\x71\\xd8\\xbd\\x0d\\x5f\\xb5\\xa6\\xb4\\x31\\xbc\\x3d\\xe0\\xe0\\x31\\x8d\\x50\\x51\\x45\\x24\\xde\\x87\\xc4\\xb8\\x30\\x05\\xdf\\xb4\\x12\\x45\\xfb\\x1a\\xf7\\x9b\\x84\\xa9\\x7b\\x83\\xd3\\xca\\xc7\\xad\\x7a\\x53\\x36\\x4e\\x2e\\x9b\\x21\\xc9\\x7b\\x76\\x9b\\xdc\\x57\\xf0\\x70\\x31\\x16\\x16\\x83\\x80\\xf3\\xcc\\x88\\x36\\x89\\xeb\\x4a\\x7f\\xa3\\xb2\\x6d\\xbe\\x12\\xbc\\x28\\xf8\\xc4\\x03\\x81\\xaf\\x64\\xdf\\x4b\\x53\\x61\\xd1\\x74\\xcf\\x75\\xac\\xbd\\x46\\x42\\x87\\x40\\xb0\\xd1\\x32\\x2d\\x32\\xbb\\xe9\\x48\\x45\\x21\\x59\\x66\\xae\\x58\\x87\\x77\\xa8\\xc0\\x53\\x36\\xe3\\x52\\x30\\x6d\\x49\\x27\\x8d\\x32\\x8e\\x49\\x6d\\xb6\\x5e\\x9e\\xcf\\x6c\\xe6\\x40\\x5e\\xd1\\xc8\\x93\\x49\\x0b\\xc4\\x8c\\x13\\xa1\\x34\\xe1\\xfb\\x6e\\x80\\xde\\xbe\\x6d\\x32\\xfc\\xe6\\xef\\x74\\x78\\x3c\\x8d\\x77\\x98\\x0a\\x44\\x1a\\x26\\xae\\xb4\\xfd\\x83\\xcc\\x85\\x53\\x52\\xce\\xdc\\x18\\x8f\\x52\\x79\\xce\\x21\\x1f\\x74\\x4a\\x40\\xb2\\x3c\\xe7\\xff\\x24\\x43\\x7a\\x1d\\xd3\\x37\\x3e\\xc5\\xb2\\x90\\xda\\x1f\\x94\\xf4\\x3a\\x07\\xa3\\xff\\xea\\x5b\\x5f\\x67\\xb5\\x2c\\x19\\x61\\x85\\xbc\\xe9\\xe9\\xa8\\x58\\x25\\x7f\\xcd\\x7a\\x8e\\xba\\xf9\\x04\\x0e\\xd0\\x91\\xfa\\xce\\x5a\\x15\\x5a\\xa4\\x47\\xfa\\x15\\xe1\\x21\\x22\\xd2\\x5e\\x8f\\xc3\\x6e\\xae\\xe2\\x13\\x7c\\x7b\\x3a\\xa3\\x0b\\x7e\\x3f\\xf6\\xcc\\x86\\xb6\\xdc\\xb9\\xea\\xf4\\x9c\\x95\\x76\\xf0\\xf4\\x62\\x00\\x84\\x39\\xcb\\x1a\\x3a\\xba\\x01\\x3e\\x89\\x7a\\x0f\\xaf\\x99\\x4c\\xb7\\xd5\\x9e\\xde\\x57\\x74\\xbb\\x14\\x47\\x74\\xf7\\x3c\\xa3\\x0e\\x64\\x14\\xa7\\xcc\\x7c\\x74\\xb2\\x0c\\x51\\xa1\\x40\\x4d\\xdc\\x41\\x9e\\xf7\\x62\\x45\\x93\\xe9\\xbc\\xfb\\x37\\xc0\\xa7\\x62\\xea\\xb6\\x8f\\xac\\xa5\\x86\\x34\\x43\\xe1\\x6e\\xdb\\x75\\x9d\\xbc\\x87\\x88\\x73\\x2b\\x9e\\x4f\\x59\\xc1\\x11\\x92\\xc3\\xfc\\xc8\\x72\\xaf\\x55\\xf3\\x2d\"},\n{{0x06,0xd4,0x98,0x31,0x8d,0xa4,0x56,0x24,0x2b,0x9c,0x3b,0x9a,0xb6,0xd5,0x32,0xa1,0x28,0xfc,0xe0,0x44,0xf5,0x38,0x82,0x68,0x2e,0x92,0x62,0x14,0x9c,0x16,0x52,0x88,},{0x41,0x35,0x17,0xaa,0x63,0x20,0x0a,0x17,0x17,0x32,0x09,0xa4,0xb3,0xe7,0x8a,0xb9,0x38,0x3c,0xb4,0xe3,0x9e,0xfd,0x67,0x94,0xc4,0x6a,0x2d,0x13,0xfa,0xfa,0x99,0xc0,},{0x82,0x50,0xf7,0x6d,0xc5,0x99,0xc5,0x12,0x87,0x87,0xe4,0xf6,0xd3,0xda,0x23,0x17,0x33,0x30,0xce,0x33,0x20,0xdb,0xa9,0x59,0xbd,0x71,0x4c,0xc8,0xcc,0x07,0xc6,0x79,0x45,0xd6,0x3e,0x75,0x66,0x2c,0x07,0x5e,0x26,0x74,0x60,0xab,0x7b,0xf5,0x61,0xf2,0x4f,0xaa,0xe3,0xb4,0x1d,0xbf,0x67,0x68,0x99,0x19,0x1e,0x3b,0x02,0xb5,0xaf,0x0a,},\"\\x3f\\xe3\\x0e\\xcd\\x55\\x07\\x7a\\x6e\\x50\\xdf\\x54\\xbb\\x1b\\xf1\\x24\\x8b\\xea\\x40\\x63\\xe3\\xfa\\x75\\x5f\\x65\\xfc\\xd1\\x15\\x9e\\xe0\\x46\\xef\\xd0\\xeb\\x5f\\x2f\\xbb\\x38\\xb5\\xc0\\x09\\x47\\xc9\\x7d\\xc8\\x79\\xb3\\x6b\\x9e\\x53\\x61\\x92\\x28\\x60\\x86\\xd0\\xdc\\x12\\x05\\x36\\x10\\x38\\x61\\x74\\xa7\\xc5\\x6f\\x22\\xa8\\x5b\\x73\\xff\\x20\\x8c\\x59\\x44\\xf3\\x93\\x23\\x6c\\x32\\x41\\x58\\x09\\xda\\x03\\x6e\\x73\\xca\\xd8\\xfc\\x3c\\x30\\x37\\x80\\x64\\xa7\\x6a\\xfa\\x93\\x0a\\x3b\\xaa\\xe9\\xaa\\x35\\x70\\x61\\xa8\\xc5\\xe8\\xe7\\x56\\xa9\\xce\\xcf\\x94\\xb7\\x2d\\xf4\\x3f\\xac\\xd8\\x8f\\xa4\\x9c\\xb4\\x94\\x8c\\x63\\x68\\x31\\x8a\\x6b\\x1e\\x5c\\xff\\x52\\xe5\\x87\\xec\\xdf\\xae\\xfd\\xb6\\x90\\x81\\xf2\\x8c\\x2d\\x13\\xbf\\x8e\\xab\\x81\\xdb\\xaa\\x5e\\x37\\x28\\xc4\\x31\\x7f\\xb7\\x93\\xdd\\x19\\x6b\\xca\\x0f\\xe5\\x4a\\x6c\\x24\\x2c\\xf2\\x6e\\x2d\\x12\\x9b\\xa0\\xd8\\x2a\\x2c\\x3a\\x45\\xbc\\x8d\\x1d\\xfd\\x6f\\x54\\xf8\\xda\\x4f\\x51\\x89\\xc9\\x1a\\xc2\\x14\\xfd\\xab\\xf4\\xc5\\x97\\x38\\x1b\\x2e\\x5c\\x40\\xcc\\x71\\xfa\\x70\\x51\\xcf\\x2e\\xa9\\x39\\x06\\xa3\\x7d\\x57\\xdf\\x12\\xd5\\xc7\\xe5\\xcd\\x77\\xc9\\x07\\xe4\\x42\\x56\\x63\\x15\\xba\\xe5\\x1a\\x22\\x22\\xd6\\x2e\\x3f\\x42\\xd1\\x76\\x78\\x82\\x63\\x7d\\x66\\xa1\\xd5\\x30\\x5a\\xb4\\x01\\x0a\\x0e\\x49\\xc5\\x7d\\xef\\x69\\xdc\\xea\\x83\\x9e\\x1b\\x76\\xa4\\x11\\x35\\xba\\x95\\x2c\\xc4\\x24\\x95\\x0e\\x8d\\x3a\\xac\\x19\\xe1\\xd9\\x3d\\xe7\\x75\\x7c\\x15\\xff\\x99\\x97\\xb3\\xd2\\xa8\\x61\\x3c\\xd9\\xa1\\x64\\x78\\x1d\\x1b\\xe3\\x31\\x79\\x9f\\xa6\\x10\\x9c\\xef\\x61\\x43\\x05\\xa1\\x95\\x8f\\x62\\x90\\x3c\\x8c\\x9e\\xa0\\xb2\\x3b\\xa7\\x06\\xd4\\x9c\\x54\\xba\\xcc\\xc1\\xe6\\x3c\\xb4\\xbf\\x14\\x78\\x5f\\xc7\\xb0\\x62\\xa9\\x80\\x03\\x49\\xbd\\xb0\\xbb\\x92\\x72\\x60\\xb6\\x77\\xb6\\x0f\\x10\\xe6\\x2c\\x87\\x80\\xf3\\xeb\\xb5\\xeb\\x6f\\xf0\\x36\\x02\\x63\\xd4\\x57\\xab\\x52\\xfd\\x11\\x25\\xc9\\xce\\x04\\x6a\\x95\\xd8\\x9d\\x28\\x73\\x50\\xc8\\x04\\xcf\\xd4\\xff\\x2b\\x2d\\xdd\\x18\\xa9\\xe1\\x35\\x19\\xf2\\x0b\\x4d\\x1e\\x05\\x1a\\xf6\\x24\\x64\\x0f\"},\n{{0x8e,0x8e,0x1d,0xb5,0xb1,0x10,0x2e,0x22,0xa9,0x5c,0x47,0xaf,0x36,0x61,0x46,0x9f,0x00,0x0a,0x33,0xf1,0x3b,0x8b,0x87,0xb1,0x15,0xd2,0x45,0x2a,0x41,0x1f,0x6f,0x39,},{0x56,0xd7,0xb3,0x16,0x9a,0x95,0xc2,0x29,0x98,0xec,0x93,0x79,0x25,0xbd,0x7c,0xad,0x13,0xcc,0x65,0x80,0x8c,0xd5,0xd3,0x4a,0x6c,0x4d,0xa8,0x70,0xea,0xf3,0x23,0x64,},{0xf6,0xee,0x5e,0x13,0xcf,0xaa,0x36,0x2c,0x89,0x71,0xd5,0xa4,0xa8,0x79,0xa7,0xe3,0x69,0x66,0x52,0x5c,0xcd,0x86,0xc5,0xa4,0x8c,0xba,0x08,0xd9,0x13,0xec,0xe1,0xa7,0x9c,0x4c,0xd1,0x46,0xb8,0xe9,0xc6,0x51,0x25,0xfb,0xad,0xf1,0x7b,0xac,0x1c,0xab,0xcd,0xe8,0xfd,0x17,0xcf,0xd6,0x8f,0xa1,0xf9,0xc4,0x4e,0xa6,0x1c,0x08,0xa4,0x05,},\"\\xb2\\x46\\x34\\xfb\\xdd\\x1b\\x76\\x61\\x31\\x5d\\x9d\\xc1\\x53\\xba\\x90\\xd6\\x6a\\x88\\x62\\x2a\\x41\\x58\\xf8\\xbc\\xff\\x25\\xba\\x9c\\x29\\xe6\\x5f\\x29\\x7f\\x8e\\x60\\x31\\x18\\x00\\xb7\\x33\\x1b\\x69\\xfc\\x20\\xc9\\xf8\\x5b\\xb7\\xc1\\x84\\xbd\\x40\\x86\\xb3\\xa9\\xf9\\xa2\\x71\\x02\\xb6\\x23\\x62\\xbd\\xb4\\xfa\\x5b\\x20\\x15\\x94\\x25\\x0f\\xc6\\x28\\xfd\\x2e\\x0e\\x0d\\x1b\\xe0\\x3d\\xcf\\x81\\x8c\\x60\\x94\\xc4\\xc2\\x91\\x21\\xcb\\x2b\\xf6\\xd9\\x08\\xed\\x8a\\xab\\x42\\x7c\\x37\\x71\\xc0\\xc9\\x5f\\x0a\\xc1\\x46\\x9a\\x08\\x10\\xb6\\x03\\xa4\\x70\\x28\\x2e\\x59\\x80\\xa6\\x07\\x29\\x19\\x7f\\xe6\\xc2\\x0e\\xf6\\x81\\xcd\\x1b\\x96\\x93\\x2d\\x20\\x58\\xf8\\x96\\xea\\x74\\x16\\x42\\x2a\\x7e\\x54\\x1f\\x22\\x4a\\x5f\\x04\\x25\\x30\\x80\\x74\\x1c\\x5d\\x4e\\x3e\\xb0\\x39\\xdb\\x6b\\xa0\\x51\\xb4\\xca\\x54\\x17\\xce\\x8a\\xfd\\xc7\\x02\\x14\\xba\\x4d\\xcc\\x85\\xb6\\x23\\xd1\\x1e\\x68\\x1c\\x60\\x09\\xae\\xe4\\xe6\\x13\\x0a\\x83\\xed\\xd0\\xd2\\xc9\\x9f\\xb0\\x64\\x7e\\x11\\xed\\xe7\\x30\\x1a\\xe5\\x6b\\x59\\x90\\x4e\\xf7\\x02\\x57\\x32\\xcd\\xe0\\x38\\x80\\x1e\\xc7\\xe8\\xd9\\x0a\\x9a\\x1b\\xba\\x04\\x7f\\xe6\\x28\\x35\\x1b\\x3b\\x89\\xd0\\xbc\\x5a\\xe6\\x65\\xa7\\x00\\x89\\x1f\\x09\\xeb\\xee\\xc0\\x55\\x91\\x84\\x2a\\xdf\\xcc\\x25\\xad\\xc3\\xc7\\x1c\\x1e\\xbc\\x4a\\x31\\x2e\\x54\\x71\\xbe\\x67\\x25\\x3b\\x0e\\x94\\x28\\xb0\\xca\\xe3\\x76\\x45\\xa0\\xf7\\xec\\xb8\\x9d\\xd7\\x9f\\xbd\\x9b\\xe2\\x87\\x54\\x33\\x66\\x7a\\xe0\\x7d\\x74\\xa7\\x98\\x3c\\x4c\\xea\\x60\\x1e\\x72\\xe9\\x75\\xc2\\x1d\\xf9\\x93\\xe7\\xfa\\x22\\xa9\\xfa\\xbd\\x45\\x45\\x5d\\x45\\xe3\\x70\\x31\\x55\\x8e\\x13\\xa7\\xa4\\xf5\\xf4\\x97\\xea\\x78\\xfb\\x73\\x99\\xf8\\x83\\x8c\\x0f\\xd5\\xde\\x4e\\xbb\\x66\\xdb\\x29\\x0f\\x43\\xa4\\x86\\x7d\\x50\\x53\\x09\\xf1\\xc1\\xbc\\x27\\xe9\\xfa\\xbc\\xbb\\xa7\\x13\\x02\\xfc\\x12\\x04\\x71\\x5c\\xe3\\xfc\\xb0\\x90\\x5b\\xfa\\x41\\x1c\\x9d\\x1c\\x9a\\xb4\\xa3\\x99\\x54\\xe5\\x0b\\x8e\\x0c\\xf7\\x36\\xc1\\x02\\x89\\x56\\x3b\\xdf\\xa9\\x67\\x55\\x3c\\x36\\xcd\\x9e\\x55\\x5b\\xc8\\xcc\\x56\\xbe\\x59\\x48\\x47\\xde\\x9f\\x26\\xf9\"},\n{{0x38,0x84,0xb8,0xb7,0x9a,0xbf,0xd3,0xbe,0x6c,0x13,0x98,0x5e,0xb8,0x59,0xab,0x74,0x3f,0x15,0x7c,0xd9,0xde,0xb8,0x1b,0x2f,0xe9,0x7e,0xa4,0xd6,0x17,0x3e,0x46,0xf5,},{0xbd,0x7f,0xd9,0xa8,0xde,0xf1,0x3a,0x54,0x2e,0xd2,0xf2,0xfb,0x04,0x88,0x86,0x88,0x5b,0xa9,0xb5,0xce,0x59,0xcb,0x70,0x19,0xfb,0x54,0x66,0x79,0x86,0xee,0xbc,0x26,},{0xf4,0x20,0x6f,0xcd,0x34,0x50,0x24,0x41,0xd5,0x4a,0x73,0x32,0x3f,0x33,0xa5,0xdb,0xb4,0xc9,0x85,0x57,0x31,0x9f,0x21,0x24,0x6f,0x26,0x0f,0xfb,0xbe,0x58,0x44,0x88,0x6d,0xb5,0x67,0xf4,0xb6,0x3c,0x47,0x94,0x3d,0xbb,0x78,0xfc,0x35,0x65,0x7d,0x7c,0x04,0xd4,0xfe,0xb0,0x42,0xff,0x85,0x36,0xf6,0x72,0x92,0x5c,0x31,0x9e,0xfb,0x09,},\"\\x12\\xad\\xaf\\xe3\\x0e\\xaf\\x2b\\x9c\\x72\\x03\\xca\\x5d\\x44\\xb9\\x7f\\xfe\\xd4\\xbf\\x65\\x17\\xa4\\x99\\x88\\xe4\\xe6\\x76\\xc8\\xe3\\x14\\xad\\xbd\\xbe\\x23\\xd8\\xf2\\xd3\\xe2\\xb0\\x81\\xa7\\x02\\x4f\\xa5\\x25\\xab\\x5a\\xae\\x26\\xe6\\x00\\x57\\xc1\\x01\\xe8\\xf3\\x68\\xd3\\xad\\xdb\\x93\\x76\\xc4\\x68\\x2c\\x1f\\x42\\x24\\xd7\\xf1\\x49\\xa8\\x47\\x4b\\xb9\\xa8\\xf6\\x63\\xef\\x21\\x0e\\x95\\x72\\xce\\x82\\x9d\\xa3\\x88\\xd8\\xaa\\xe7\\x2a\\x46\\x71\\x41\\xad\\xc1\\x53\\x47\\x3b\\xe3\\x65\\x3b\\xaa\\xa6\\x4b\\x5b\\x1e\\x2e\\x30\\x68\\x3f\\x6f\\x06\\xda\\xc2\\x78\\x4d\\x5b\\xbf\\x0d\\x08\\x2a\\xab\\x47\\x30\\x5e\\xd8\\xa8\\xef\\xd0\\x88\\x6c\\xe6\\x3a\\x17\\x93\\x15\\x22\\x5d\\x1e\\x4d\\x4f\\xfc\\xf1\\xf2\\x4a\\xc2\\xf4\\x64\\xcf\\x5e\\xd3\\xa8\\xb6\\xd3\\x99\\x84\\x54\\xf1\\xc0\\x2c\\xdb\\xf0\\xa4\\x44\\xee\\x2b\\x59\\xdd\\xbe\\x0a\\x17\\x4a\\x0d\\x93\\x7f\\xa6\\x28\\x65\\x08\\x8a\\xc6\\x47\\x49\\x99\\x57\\xd2\\x81\\xc6\\x94\\x98\\x03\\xa5\\xfb\\xdf\\xdd\\x0d\\xd9\\xe9\\x1b\\x69\\x76\\x86\\x1f\\x3c\\x5f\\x21\\x26\\xf3\\x9a\\xac\\x93\\x5b\\xe0\\x9f\\x4b\\x97\\x15\\xbd\\x4f\\x0d\\x5c\\x55\\xdf\\x73\\xa6\\xb9\\xf2\\xc0\\xad\\x26\\xce\\x49\\xd8\\x22\\xbf\\x85\\xbf\\xa2\\x34\\x6f\\x31\\x65\\xb0\\x38\\x59\\xa7\\x1c\\x3d\\x2a\\x7b\\x86\\xdb\\x6e\\x9f\\x2e\\x5d\\x7b\\x16\\x9a\\x91\\x0e\\xeb\\x7e\\xf3\\x8f\\xbd\\xfb\\xbe\\xc4\\x3a\\x9a\\x25\\xf0\\x4b\\xc3\\xac\\xfd\\x3b\\x06\\x91\\x54\\x2a\\xb6\\xde\\x9d\\xb6\\xf0\\x30\\x58\\xf9\\x58\\x40\\x24\\xf9\\x91\\x8e\\xde\\xcd\\x90\\xfb\\xb8\\x57\\x35\\xd6\\xdc\\xec\\x5b\\xd5\\x93\\xae\\x63\\xe2\\xcc\\x96\\x55\\x35\\x99\\xa3\\x10\\xf8\\xf2\\x00\\x9b\\xa9\\x53\\x71\\x19\\x6b\\x4d\\x5b\\x80\\xe7\\x55\\x96\\x37\\xf2\\x29\\x26\\x77\\x8b\\xe5\\xe1\\xcc\\xef\\x51\\x26\\xe2\\x44\\x3f\\xa9\\x39\\xc2\\xa5\\x3d\\xdd\\xb0\\x49\\x61\\xee\\xfd\\x34\\xe5\\x38\\xcd\\x8d\\x7f\\x0b\\xec\\x2b\\xff\\x1e\\xf0\\xd3\\xa4\\xbd\\xd3\\x58\\x31\\x76\\x37\\xf4\\x2d\\x59\\x55\\x38\\xc1\\x12\\x22\\x51\\xa9\\x4e\\x96\\x3d\\x1f\\x81\\xe7\\xb9\\xae\\xb1\\x64\\xf9\\x5d\\xa9\\xa4\\xed\\x75\\x29\\xb8\\x45\\xeb\\xc9\\x61\\xb2\\x7b\\x5c\\x19\"},\n{{0xec,0xd5,0x19,0xf2,0x87,0xad,0x39,0x50,0x52,0xb0,0xb3,0x0d,0xea,0xc3,0x41,0xd2,0xa9,0xdf,0x13,0xd6,0x56,0x7c,0x89,0x1c,0x81,0x3a,0x0c,0x9c,0xa5,0x2e,0x87,0x1e,},{0x8e,0xe9,0x4c,0x58,0x8e,0x0b,0x34,0x35,0x85,0xfc,0x67,0x48,0xfd,0x1b,0x54,0xb5,0x77,0x0c,0x64,0xe9,0x93,0x7a,0x56,0x35,0x7a,0x48,0xd4,0x4a,0xe2,0xf5,0x18,0x24,},{0xe8,0xf5,0x1b,0xe7,0x3f,0xc4,0xe0,0x23,0x5a,0xa1,0x53,0xa2,0xe1,0xb3,0x54,0xe9,0xc5,0xd2,0xd3,0x3a,0x11,0xae,0x0e,0x33,0x34,0x78,0xde,0x1d,0x8e,0x6c,0x44,0x56,0xd2,0xe2,0x50,0x82,0x4c,0x32,0x46,0xca,0x0e,0x8d,0x6a,0xe3,0xe1,0x66,0x77,0xa9,0x73,0x44,0x14,0x41,0x08,0xc1,0x3b,0x95,0x9e,0x1d,0xaf,0x51,0xcf,0x0f,0xe5,0x01,},\"\\xaa\\x71\\xbe\\x5f\\x55\\x7e\\x10\\xc9\\xfb\\x5f\\x09\\x1a\\x3a\\x27\\x44\\x53\\x94\\x7c\\x07\\xa0\\xe2\\x5b\\x26\\xf9\\x50\\x92\\x24\\x54\\x1d\\xff\\x76\\xf4\\xd9\\x6e\\xff\\xd0\\xd5\\xa4\\x1d\\x31\\x9b\\xc9\\x32\\x1a\\x86\\x66\\x7d\\x55\\xcf\\x49\\x43\\x2f\\xb5\\xc3\\xe7\\x15\\x38\\x8f\\x3f\\x10\\x6c\\x91\\x74\\xb1\\x61\\x0c\\x8f\\x30\\x75\\xd5\\x93\\x1c\\x29\\x00\\x99\\x38\\x5c\\xe9\\x24\\x9e\\x23\\x51\\x28\\xe9\\x07\\xc5\\x33\\x90\\x03\\x6f\\xbf\\x5d\\xa9\\x68\\xf8\\xd0\\x12\\x33\\x69\\x58\\xde\\x90\\xc5\\xe8\\xe6\\xb1\\x01\\x6a\\xd4\\x3f\\xb5\\x7c\\x8e\\x28\\x8d\\xaf\\xe1\\x4e\\x90\\xe6\\x4b\\x63\\x79\\x1e\\x5c\\xbe\\x55\\x7e\\x02\\xdf\\x8a\\xc9\\x37\\x06\\x42\\xa7\\x1f\\xaf\\x85\\x10\\x75\\xe5\\x56\\x5f\\x6f\\x9a\\x26\\x7f\\x4f\\x6b\\x45\\x4c\\xe4\\xc5\\x47\\x48\\x10\\xb8\\x04\\x84\\x4d\\xda\\x38\\x39\\x29\\x39\\x71\\x97\\x93\\x24\\x6a\\xa4\\x74\\x54\\xb9\\xb0\\xe8\\x2e\\x98\\x03\\xc0\\x99\\x35\\xd0\\x02\\x7f\\x39\\x95\\xcc\\xa9\\x71\\x30\\x69\\xbb\\x31\\x02\\x7f\\x7b\\x2a\\xf1\\x2f\\xe5\\xfe\\xec\\x7e\\xeb\\x06\\x84\\x3d\\x82\\x96\\xec\\x56\\x82\\x26\\x2a\\x07\\xda\\xe7\\x47\\xed\\x7b\\xc8\\x21\\xec\\x17\\x01\\x8d\\x89\\x9f\\xd1\\x67\\xb3\\x6a\\x7e\\x37\\x73\\xb4\\x27\\x49\\x9d\\x99\\xdc\\x58\\x3b\\xbe\\x4b\\x42\\x9a\\xfa\\x6a\\x26\\x59\\x39\\x53\\xf9\\x43\\xe4\\x67\\x3b\\xdd\\x0d\\x2a\\x84\\x42\\x56\\x13\\x16\\x03\\xcd\\x09\\x03\\x25\\x6f\\x33\\x4d\\x4f\\x8e\\xc8\\x2d\\xe1\\x15\\xb6\\xca\\x53\\x38\\xc7\\x5c\\x8b\\xaa\\x44\\xb4\\xba\\x96\\x3c\\x7c\\x78\\x51\\x0d\\x8d\\xe9\\xb2\\xa5\\x85\\x2f\\x42\\xf3\\x46\\x3c\\x68\\x5f\\xb3\\xa6\\xda\\x61\\xa8\\xe0\\x89\\x26\\x62\\xd6\\xa2\\x50\\xfc\\xaa\\x6f\\xef\\x74\\xd4\\x50\\xfc\\x45\\x7b\\x98\\x71\\xd0\\x8b\\xb5\\xbe\\x30\\x11\\x29\\x4a\\xc8\\x88\\xfc\\xe2\\x15\\xd5\\x35\\xc3\\xb1\\xa4\\x3b\\xb4\\x7e\\xfe\\x3a\\xd2\\x5d\\xa1\\x59\\x19\\x1a\\xed\\x55\\x19\\x54\\x69\\xc5\\x90\\x93\\xff\\xb2\\x4f\\x65\\xd6\\x0c\\x40\\x20\\xbf\\xbe\\x64\\x7f\\xf5\\xdb\\x7a\\xb8\\xa0\\x1d\\x5e\\x48\\x7b\\x0b\\x1b\\x64\\xef\\x25\\xda\\x15\\x6d\\xb1\\x42\\xe6\\xad\\x87\\x2a\\x4d\\xc1\\xee\\x9b\\xa6\\x68\\x46\\x52\\x65\\x37\\x9e\"},\n{{0x19,0x3f,0x3c,0x63,0x0f,0x0c,0x85,0x5b,0x52,0x9f,0x34,0xa4,0x4e,0x94,0x49,0x70,0xf4,0xa6,0x97,0x2e,0x6c,0x38,0x59,0x35,0x9c,0x2e,0x0c,0x87,0x62,0xba,0x9e,0xaf,},{0x32,0x56,0xf2,0xc8,0x2e,0x7c,0x80,0x12,0x01,0x21,0x01,0x40,0x56,0x9f,0xaf,0x18,0x50,0x7e,0x60,0x33,0x8c,0x2c,0xc4,0x11,0x8b,0xb1,0xce,0x60,0x5b,0x0e,0xbe,0x61,},{0xb1,0x25,0x10,0xac,0x5f,0x2f,0x6d,0x33,0x36,0x0c,0xdd,0xc6,0x72,0x91,0xd6,0xc2,0x70,0xfd,0x9e,0xe6,0x2d,0xc0,0x86,0xb3,0x8d,0x93,0x2d,0x26,0x47,0x3f,0xe9,0xa2,0x4e,0xfb,0xd4,0x24,0x88,0x67,0xea,0x7e,0x91,0x5a,0x30,0xc5,0xbf,0xb3,0xb8,0xb1,0x9a,0xa0,0x1a,0xa2,0xfe,0xbf,0x0d,0xac,0x6c,0xfd,0x66,0x38,0xa2,0xba,0x7e,0x0c,},\"\\x98\\x62\\x3f\\x65\\x16\\x98\\x08\\x5b\\xde\\x02\\x76\\x2e\\x8c\\x33\\x21\\xf1\\x4d\\xa1\\x61\\x9b\\x5c\\x3f\\x7c\\x1a\\x56\\x8e\\x8c\\x26\\xff\\x0c\\x62\\xfd\\xcc\\x41\\x24\\x75\\x91\\x2e\\xb8\\xe8\\xc4\\xb0\\xd3\\x09\\x18\\xb8\\xff\\xee\\xf3\\x50\\x93\\x15\\xe5\\x8d\\xa3\\x59\\xcd\\xc2\\xf2\\x6b\\xeb\\xfb\\x57\\x03\\x95\\x3b\\xe1\\x6b\\x8f\\x3b\\xeb\\x1e\\x54\\xa1\\xab\\xee\\x0a\\xeb\\xe2\\x4e\\x64\\xdb\\xe8\\x73\\x40\\x2e\\x15\\x6f\\x37\\xdf\\xc1\\x68\\xea\\xf8\\xa1\\x14\\xce\\x08\\xa6\\x79\\x5d\\x3f\\x64\\xf5\\x15\\x1e\\x9a\\x8b\\x82\\x75\\xcc\\x7b\\x49\\xa6\\xb8\\xd8\\xa6\\x6b\\x6d\\x4b\\x76\\x32\\xef\\x80\\x74\\x0d\\xc1\\xc1\\xb0\\xa3\\x8d\\x1a\\x28\\xf7\\xc1\\xb2\\x9f\\xa4\\x45\\x41\\xc1\\xaa\\xd3\\x54\\xd4\\x59\\x0c\\x23\\x1d\\xae\\x68\\x7a\\x2a\\x8f\\xed\\x09\\xe8\\xc1\\xeb\\xbf\\xcc\\x38\\xf3\\x47\\xbf\\x06\\xd9\\x45\\x77\\xe4\\x9a\\xd1\\x39\\xf7\\x10\\xed\\x8b\\xb1\\xfd\\x07\\x66\\x3c\\x03\\x20\\x84\\x6f\\xbb\\x45\\x5a\\xb8\\x37\\xef\\x96\\x4a\\xe7\\xd4\\xec\\xee\\xa4\\x5f\\xd7\\xbd\\x8d\\x50\\x9f\\x82\\x1e\\x6e\\xb0\\x27\\x49\\x4e\\xfd\\x8d\\xd8\\xe9\\x92\\xb8\\x86\\x98\\xee\\xc2\\xeb\\xc5\\xe0\\x30\\x25\\xbe\\x78\\x9c\\x18\\x01\\x3f\\x20\\x1f\\x77\\xaa\\x2d\\x34\\xf5\\x68\\x64\\x60\\xe4\\x3f\\xb4\\x89\\xe0\\x87\\x76\\xf9\\x8b\\xcd\\xe2\\xce\\xeb\\x9d\\x4f\\xaf\\xdf\\xfe\\x03\\x75\\x60\\x43\\x71\\xec\\x32\\xf4\\x6b\\x81\\xfe\\xc4\\x74\\x38\\x29\\x08\\xe9\\xd2\\x50\\xa0\\xba\\x27\\x80\\xa7\\xd6\\xdf\\x40\\x7b\\xd2\\xb1\\xeb\\x12\\x67\\x48\\xd7\\x25\\x11\\xb9\\xb0\\x69\\xeb\\x1c\\xd4\\x42\\x70\\xf2\\x9f\\xe8\\x4b\\x9a\\x71\\x77\\x51\\x83\\x1d\\x04\\xc2\\x81\\x8e\\x40\\x8f\\x22\\x78\\x93\\x76\\xc6\\x1c\\x2c\\xa4\\x5e\\x32\\xe7\\x88\\xea\\xd3\\xa7\\x53\\x6b\\xf0\\x9d\\xa8\\xaf\\x47\\x03\\x90\\x2f\\x55\\x16\\xa0\\x20\\xd8\\x92\\x63\\xe9\\x37\\x01\\xa2\\x56\\x5e\\xef\\x12\\x70\\x41\\x89\\x25\\xf3\\x5a\\x28\\x8e\\x32\\x7b\\xab\\x62\\x8a\\xc2\\xf0\\x24\\x8c\\xfb\\xca\\x34\\x82\\xe2\\x65\\xd1\\x62\\x1c\\xc3\\x43\\xc3\\x1f\\x65\\x49\\x3f\\x06\\x4b\\xad\\x0d\\x76\\x02\\x46\\x07\\x15\\xfa\\x48\\x6f\\x29\\x42\\x63\\x46\\xaf\\x53\\xe3\\x33\\xb7\\x5f\\x59\\x05\"},\n{{0xa8,0x8a,0xd0,0x04,0x8d,0x38,0xc4,0x4c,0xeb,0xe7,0x35,0xea,0x38,0x02,0xca,0x57,0x6e,0x37,0x12,0x1c,0x7d,0x4d,0x76,0x0d,0xfd,0x88,0xde,0x16,0x63,0x06,0x4a,0xbb,},{0x14,0xdd,0x8b,0xb3,0x06,0x80,0x3e,0x5a,0x75,0x8e,0xd6,0x8a,0xd2,0x1d,0x07,0xd8,0x81,0x61,0xd5,0x0f,0x1c,0x74,0x71,0x37,0x77,0xda,0x12,0x09,0xaf,0xba,0xea,0x0b,},{0x13,0x41,0xa1,0x48,0xda,0x45,0x93,0xc8,0x8e,0xbc,0x5a,0x58,0x82,0x1e,0xef,0x77,0xf9,0x21,0x86,0x39,0x0f,0xf6,0x33,0xe7,0x62,0x07,0x08,0x4e,0x78,0x74,0xcc,0xf0,0xeb,0x1f,0x9e,0xc7,0x0a,0x3a,0x3f,0x96,0xb5,0x89,0x34,0xbc,0xb0,0x61,0xff,0x92,0x01,0x24,0xf7,0xe5,0x80,0xfa,0x2b,0x0b,0x27,0x95,0x83,0xad,0xf9,0x23,0x2d,0x0c,},\"\\x2c\\xe8\\xbc\\xa2\\x61\\x78\\x91\\x3b\\x16\\x76\\xe9\\x0f\\xfe\\xfd\\x94\\x5b\\xc5\\x61\\x98\\x26\\x60\\xe2\\xa7\\x5d\\x48\\x2f\\xf3\\x0a\\xab\\xa1\\xba\\x43\\xf8\\x2d\\x2e\\x6b\\x90\\x9e\\xc1\\x0f\\xc0\\x97\\x89\\xff\\x5c\\xf3\\x2a\\x51\\x80\\xb6\\x01\\xea\\x80\\xfa\\xde\\xce\\x6d\\x7e\\x7b\\xae\\xef\\x48\\x1d\\xc6\\x97\\x9e\\x2f\\x65\\x8a\\xe0\\xf6\\xd8\\xe4\\x16\\xb9\\x32\\x98\\xf7\\xd3\\x40\\x31\\xbb\\x76\\xf7\\x16\\xed\\x99\\x1a\\x16\\xd0\\x9a\\x58\\x2e\\x58\\xba\\x40\\x03\\xac\\x17\\xbe\\x8b\\x44\\x69\\xe1\\xa8\\x89\\xb2\\xfb\\xb2\\x28\\x9e\\x98\\xaf\\x1c\\x6d\\x5b\\xbe\\xe7\\x77\\x56\\x71\\x3c\\x07\\x78\\xb0\\xdc\\x44\\x6a\\x1f\\x6c\\x48\\xc4\\xd4\\x08\\x18\\xec\\x79\\x99\\x05\\xf0\\x69\\xbc\\x95\\x34\\x16\\x57\\xca\\x5d\\x02\\xb7\\xa5\\x39\\xa1\\x3a\\x02\\xcd\\x03\\x76\\xa5\\x0e\\x83\\x43\\xc0\\xdc\\x20\\x34\\x6d\\xe5\\x27\\x5b\\x1d\\xcd\\x4a\\xd7\\xaf\\x72\\x51\\x31\\xac\\x75\\xe9\\x54\\x82\\x5d\\x30\\xea\\xa5\\x7a\\x68\\xbb\\x98\\xdf\\xc4\\x1c\\xaf\\xe5\\x71\\x05\\x56\\x64\\x7b\\x38\\x7d\\x9b\\x7f\\xd4\\xe4\\x76\\x51\\xe5\\x13\\x80\\x50\\x79\\x8f\\x6d\\x40\\xf4\\xee\\x71\\x20\\xb5\\x8f\\x74\\xda\\x94\\xd7\\x3c\\xac\\xbf\\xd3\\x93\\xd1\\x34\\x73\\x88\\xee\\x00\\xb7\\x9b\\x8d\\xbf\\xeb\\x57\\x81\\x41\\x21\\xbd\\xda\\x60\\xc6\\x27\\xdc\\xe1\\x47\\xd4\\xd5\\x68\\xd7\\x90\\x52\\xe9\\x7b\\x9a\\x5f\\x3e\\xb5\\x40\\x7c\\xc4\\x64\\x61\\xa5\\x5e\\x18\\xa9\\x60\\xd8\\x09\\x4a\\x5f\\xea\\x48\\xb6\\x93\\x75\\x29\\xcc\\x4e\\xc9\\x19\\xcd\\xbe\\xdf\\x91\\x85\\x45\\x6d\\xc0\\x0e\\x8d\\x98\\xad\\x15\\x37\\xee\\x10\\xa0\\x57\\xf4\\xee\\xc4\\xb8\\x1d\\xc6\\x03\\x92\\xfc\\x91\\x88\\xd3\\xe5\\x61\\x78\\x59\\x65\\x09\\x2e\\x44\\x31\\x7f\\x2a\\x48\\xe3\\x66\\x05\\xfc\\x58\\x3f\\xc1\\x73\\xb0\\x5d\\xb9\\xdc\\xbc\\x75\\x57\\xd0\\x64\\x87\\x39\\x0f\\xbb\\xba\\x77\\xaf\\x3a\\x01\\x4e\\x1a\\xc3\\x51\\x39\\xca\\xa1\\xc5\\x3a\\x8d\\x17\\x34\\x7f\\x17\\x8e\\x1c\\x54\\xd0\\xf5\\x2b\\x40\\xe9\\x10\\x42\\xc9\\x3e\\x7e\\x48\\x1d\\x79\\x2e\\x28\\x8f\\xc2\\x7e\\x4c\\x2f\\xcf\\x11\\x1f\\xe9\\x7d\\x9e\\x23\\x37\\xd2\\xfc\\x1c\\x30\\x98\\xf0\\x66\\x84\\xa3\\x1d\\x55\\xeb\\xf3\\x62\\xc0\\x27\"},\n{{0x3f,0x59,0xd6,0xa0,0x18,0xf5,0x0a,0x82,0x21,0x17,0xe5,0xb4,0x73,0x60,0x9e,0x30,0xcd,0x64,0x92,0x0c,0xa1,0xc2,0x75,0x0d,0xcb,0x09,0xea,0xab,0x80,0x7a,0x3e,0xac,},{0x45,0x7d,0x0e,0x59,0xc1,0x1f,0x34,0x8f,0x3b,0xfb,0xdd,0x3f,0x32,0x7d,0xe7,0x8c,0x0a,0x75,0x77,0xc0,0xae,0xef,0x42,0xd4,0xc1,0xe5,0x67,0x00,0xd1,0x08,0x80,0x8b,},{0xd7,0x42,0x5e,0xa1,0x94,0xa6,0x71,0x5c,0x45,0x2e,0xc4,0xf6,0xd6,0xc7,0x6e,0x6d,0xd3,0x74,0xd3,0xca,0x7a,0xe7,0xa1,0x19,0x95,0xd0,0x2b,0x94,0x2d,0x4a,0x31,0x87,0x0d,0xd7,0x34,0xc1,0x2f,0xca,0x89,0xa8,0xeb,0x02,0x13,0xeb,0x13,0x9c,0x14,0xa8,0x7a,0x6a,0x33,0xe8,0x18,0x60,0x3b,0x2e,0x31,0x30,0x23,0xfa,0x58,0x73,0x7d,0x0e,},\"\\x7d\\x10\\x3a\\x6c\\x6b\\xa2\\xd0\\x90\\x87\\xee\\xf2\\x25\\x4c\\x1c\\x90\\x3f\\x06\\x76\\x95\\xa5\\x4c\\x45\\x15\\xe4\\xd1\\x3b\\xc1\\xfb\\xfb\\x54\\xd6\\xe7\\xa1\\x67\\x34\\x9c\\x14\\x80\\x99\\x76\\xda\\x04\\xa7\\xe5\\x8d\\x96\\xb4\\x0a\\xac\\x3b\\x2b\\xdd\\x14\\xb9\\xb5\\x03\\x22\\xbb\\x11\\x64\\x5f\\x05\\xe5\\xe9\\x78\\xbc\\x7f\\xbd\\x02\\x49\\x2e\\xf8\\x8f\\x87\\xd6\\x68\\x28\\x0f\\xd7\\x08\\x37\\x32\\x07\\xff\\x67\\x0f\\xcd\\xa9\\x7d\\xf8\\x48\\x5d\\x5e\\x46\\xdc\\x3b\\xd0\\x43\\x47\\xf4\\xd7\\x52\\x7e\\xab\\x27\\x18\\xf7\\xd9\\x3d\\x13\\x2b\\xa7\\x75\\x82\\x18\\x89\\x4e\\x75\\xa7\\xde\\xab\\xe6\\x93\\x33\\x5b\\xa0\\xdc\\x73\\xbf\\x26\\xc2\\x88\\xbf\\xe9\\xbe\\x8a\\x73\\x6d\\x75\\xe5\\xe0\\xea\\xa7\\xbb\\xe8\\xd0\\xb7\\x7a\\xbd\\xd5\\x14\\x6e\\x0f\\xc9\\xb3\\x0d\\xb9\\xf0\\x7c\\xf4\\xbf\\x36\\x26\\x0a\\x1f\\x41\\x41\\x03\\x31\\xf8\\xb4\\x7c\\x6b\\x38\\x33\\x8c\\x6d\\xc9\\xe8\\x01\\xff\\xe1\\xd5\\x85\\xf9\\xb7\\xfc\\x31\\xe9\\x77\\x8b\\xca\\x30\\x27\\xc2\\x32\\xc0\\x74\\xcb\\x18\\xe5\\xb7\\x29\\x97\\x00\\x5f\\xfe\\xee\\x4b\\xf3\\x7c\\x8f\\x87\\x4b\\x1b\\x24\\x6a\\x63\\x45\\x41\\x5d\\xac\\xac\\xa7\\x07\\x5a\\x60\\x44\\x3a\\xc3\\x31\\x92\\x36\\xe2\\x3c\\xf6\\xb7\\x54\\x47\\x40\\x80\\x70\\x52\\x11\\x49\\x84\\xb8\\xd8\\xf7\\xe8\\x57\\xdc\\xc6\\xfa\\xec\\x88\\x69\\xcf\\x96\\xb9\\x97\\xdf\\xa9\\xaf\\x91\\x84\\xad\\x62\\x3f\\x1d\\x90\\xb8\\xca\\x75\\x9b\\x44\\x8e\\xab\\xfc\\xe1\\x8c\\x17\\xcf\\xdf\\x9a\\x3e\\x33\\x12\\xe6\\x3e\\x5f\\x08\\x4c\\xea\\x90\\x4c\\x1c\\x90\\x99\\x13\\xcc\\x4b\\x19\\xd0\\x44\\xa3\\x72\\x00\\x34\\x97\\x3c\\x73\\x84\\x94\\x9b\\xd6\\xf9\\xba\\x92\\x56\\xf9\\x8c\\xd3\\x94\\xc5\\x66\\xda\\x83\\xc3\\x11\\x80\\x10\\x9f\\x16\\xd1\\x03\\x47\\xb7\\xe3\\xe9\\xdd\\x6b\\xe3\\xbd\\x3c\\x77\\xff\\x1a\\x79\\x96\\xa0\\x78\\xdc\\xf8\\x9d\\xcd\\xce\\x2d\\x1b\\x61\\x56\\x95\\xf4\\xcc\\x9f\\x8f\\x4f\\x2a\\x08\\x80\\x46\\x41\\xbc\\xa8\\x26\\x62\\xce\\x88\\xfa\\xa5\\x31\\x45\\xb6\\xa4\\x59\\x55\\xae\\xc8\\xcc\\x2a\\xf8\\x1c\\xcc\\xb5\\xd7\\xc6\\x4f\\x9e\\xce\\x1c\\x99\\x83\\x32\\x64\\x84\\xa1\\xe5\\xec\\xe4\\xce\\x36\\x54\\x4d\\x63\\x73\\x5f\\x77\\x76\\xf2\\x1a\\x20\"},\n{{0xa1,0x21,0x2b,0x34,0xdb,0xca,0x63,0xb7,0x09,0x36,0x12,0xd0,0x5d,0xab,0x7b,0x4c,0xc8,0xf7,0xb6,0x76,0xa9,0x34,0xad,0x01,0xf6,0x59,0x85,0x1b,0x3b,0xb4,0x4e,0x4e,},{0xba,0x2f,0xcc,0xea,0x9a,0x08,0x05,0x91,0xbe,0x71,0x26,0x8d,0x7e,0x95,0x1f,0x25,0x0d,0xed,0xc0,0x04,0x16,0xe5,0xf3,0xf9,0x08,0xdb,0x6c,0xc5,0x71,0x25,0x49,0x25,},{0xfa,0x93,0xed,0x65,0x95,0xbc,0x95,0x8d,0xc0,0x42,0xce,0x16,0x45,0x16,0x7b,0x79,0xe8,0xf6,0x73,0x4c,0x46,0xf8,0x0f,0x63,0x1f,0xd5,0x48,0x49,0x08,0xf5,0xe5,0x1a,0x22,0x42,0x7e,0xe6,0x86,0xf5,0x64,0xff,0x98,0x2f,0x6e,0xf4,0xd2,0xca,0x1f,0x0c,0xa5,0x62,0x49,0x10,0xcd,0xd6,0x3c,0x11,0xa3,0xc2,0xb1,0x6d,0x40,0x97,0x3c,0x07,},\"\\x07\\xc3\\x7c\\x46\\xbe\\x3c\\x68\\xd0\\x56\\x89\\x57\\x7a\\xa6\\x4a\\x93\\x2b\\x90\\x64\\x46\\xb2\\x9b\\xaf\\x12\\xf6\\x17\\x4a\\x6b\\x42\\xbb\\xae\\xfd\\x1f\\x1f\\x37\\x3e\\x0b\\xcc\\xc4\\x73\\xdd\\xfc\\xee\\x1a\\x7f\\x21\\xb9\\x6a\\x62\\x60\\xef\\x0a\\xa1\\xf2\\xd8\\xb2\\x95\\x9e\\x71\\xd1\\x2c\\x95\\x33\\x58\\xa2\\x77\\x4c\\xc5\\xe6\\xf3\\x79\\xa3\\x13\\xe4\\x35\\xed\\x69\\xdf\\xd6\\xd4\\xa5\\x9a\\xde\\xe3\\xcc\\x7e\\xc4\\xba\\xcb\\xdb\\xb3\\xfe\\xe5\\x43\\x0b\\x73\\xf6\\x05\\x1a\\x60\\x96\\xc6\\x0e\\x9b\\xc9\\x2c\\xc8\\xfa\\x05\\x9f\\xac\\x2a\\x93\\xef\\x70\\x07\\xd6\\x4f\\xbe\\x50\\x06\\x49\\x64\\xd5\\xa0\\xad\\x60\\x11\\x75\\xcd\\x9c\\xab\\xa4\\x53\\xf9\\x10\\x3b\\x25\\x48\\x55\\x45\\xd3\\x01\\xf0\\x3c\\x5f\\x9f\\x94\\x78\\xbd\\xf9\\xd4\\x14\\xbf\\x1d\\xca\\x3b\\x1c\\x1d\\x9d\\xaa\\x99\\x71\\xf9\\xe6\\x17\\xfb\\xfa\\xf5\\xb0\\x2a\\x7f\\xbd\\x5d\\x4f\\xb8\\x94\\xc0\\x97\\x5c\\x54\\x59\\x2b\\x49\\xa0\\xfc\\x85\\xdd\\x08\\x53\\xf3\\x0c\\x51\\x50\\x2d\\x98\\xfc\\x1a\\xb8\\x5a\\x17\\xcc\\x58\\x96\\x1a\\xae\\x97\\x64\\x57\\x0b\\xa5\\xcb\\xdb\\xc9\\x6d\\xfc\\xeb\\x8d\\x11\\xda\\x53\\x36\\x4b\\x40\\x25\\xfe\\x0b\\x8b\\xa8\\xa3\\x53\\xad\\x23\\x68\\x67\\x20\\x16\\x9f\\xe9\\x73\\x43\\x2f\\xfe\\x29\\x1a\\x4b\\x11\\xde\\xdd\\xa0\\xaa\\xc7\\x9a\\x5e\\x42\\x62\\x0a\\x64\\x58\\x7d\\x20\\x59\\xe7\\x87\\x01\\x3b\\x40\\xce\\xec\\x59\\x92\\x08\\xf6\\x6e\\xd0\\xca\\x6e\\x1b\\xe9\\x09\\x2e\\xc2\\x7d\\xb2\\x16\\xee\\x6d\\xad\\xfe\\xbc\\x21\\x70\\x5b\\xc4\\xa8\\x5a\\xee\\x57\\x7e\\x57\\xd2\\x39\\xaf\\x58\\x6e\\xfe\\xec\\x22\\xcf\\x38\\xd1\\xcf\\xb3\\xcd\\x74\\xdd\\x0d\\x9a\\x33\\x81\\xaa\\x81\\xe6\\xa2\\x97\\xe3\\x9b\\x81\\x91\\x37\\xad\\x27\\xd4\\x75\\xe2\\xbf\\x54\\xaa\\x42\\x6d\\xc2\\x9c\\x4c\\xa8\\x17\\x6d\\xf3\\x43\\x13\\x7a\\x2d\\x79\\xd1\\x2e\\xf9\\xaa\\x7b\\xe1\\xcf\\x67\\x75\\xe5\\xd8\\xa4\\x43\\x0a\\x85\\xc3\\x3d\\xb6\\x1c\\xd2\\xf3\\x51\\x87\\xb4\\xf6\\xea\\x9e\\xbd\\xd7\\x53\\xd1\\xc4\\xef\\x72\\x47\\x11\\x59\\xff\\x07\\xb7\\x78\\x70\\x90\\x64\\x96\\x24\\x9d\\x42\\x78\\xe3\\xf3\\xca\\x6b\\xcb\\xf3\\x7a\\x26\\x5b\\x89\\x65\\x39\\x19\\x0f\\x9a\\x31\\xf1\\xe7\\xb4\\xb6\\x5c\\xd1\"},\n{{0xd9,0x68,0x20,0x86,0xfe,0x7d,0xda,0x30,0xb8,0x71,0x11,0x06,0x01,0x93,0xd8,0x47,0x56,0x6a,0xb9,0x4c,0xfd,0x9c,0x97,0xab,0x6b,0x43,0xe7,0xa8,0xd3,0xf7,0x93,0x82,},{0x8b,0x0b,0x13,0x72,0xd8,0x87,0x33,0xef,0x72,0x33,0xf6,0x37,0x97,0x90,0xd1,0xe4,0x6e,0x1e,0x07,0xe9,0xd3,0xfb,0x8b,0x0b,0xe2,0x52,0xed,0x04,0xc5,0xfa,0x16,0x3d,},{0x17,0x93,0xe4,0x97,0xeb,0x52,0x1c,0xa7,0x4e,0x35,0xd1,0x4a,0x63,0x86,0x8c,0xbe,0x94,0x99,0xda,0x2f,0x21,0xb4,0xeb,0x52,0x60,0x34,0x0f,0xca,0x3c,0x1f,0xec,0xa7,0x8d,0xbe,0x5b,0x14,0xac,0x10,0xf3,0xfa,0x76,0xfa,0x2e,0x71,0xe4,0xc9,0x14,0x61,0xaa,0x75,0x97,0x7e,0x5e,0x70,0x79,0x26,0x70,0xef,0x7f,0xf0,0xe6,0xa2,0x87,0x08,},\"\\xe8\\x81\\x4b\\xe1\\x24\\xbe\\x3c\\x63\\xcc\\x9a\\xdb\\x03\\xaf\\x49\\x3d\\x44\\x2f\\xf2\\x0d\\x8b\\x20\\x0b\\x20\\xcd\\x24\\x93\\x67\\xf4\\x17\\xf9\\xa9\\xd8\\x93\\xfb\\xbb\\xe8\\x5a\\x64\\x2b\\xe2\\x70\\x1d\\x1d\\x1b\\x3c\\xd4\\x8a\\x85\\xcf\\x58\\xf1\\x59\\xa1\\x97\\x27\\x31\\x43\\xa5\\x78\\xf4\\x2e\\x8b\\xcc\\x8b\\x62\\x40\\xf9\\x32\\x71\\x90\\x05\\x38\\xff\\xc1\\x87\\xc0\\xaf\\xc8\\xdb\\xcc\\x49\\x2b\\xcd\\x67\\x9b\\xaa\\xef\\x3a\\xf5\\x08\\x84\\x34\\xa9\\x45\\x86\\xf9\\x4b\\x49\\x97\\x0b\\xba\\x18\\xf5\\xea\\x0e\\xbf\\x0d\\x27\\xee\\x48\\x2a\\xa8\\x3a\\xd0\\xdd\\x0e\\xe6\\x09\\xdf\\x59\\xd3\\x7f\\x81\\x8b\\x2c\\x8d\\x7c\\x15\\xf0\\xf6\\xf5\\x44\\xdd\\x4c\\x7e\\x7c\\xb3\\xa1\\x67\\x24\\x32\\x4f\\x77\\xd5\\x89\\x48\\xf8\\x47\\x5a\\x60\\xd5\\x3e\\x5b\\xd5\\x10\\xc1\\x71\\x37\\xc9\\x9e\\x1c\\xfa\\x51\\x5a\\xf9\\xbc\\x85\\x56\\x9d\\x21\\x2a\\x21\\x19\\x07\\x29\\xf2\\x81\\x7d\\xe8\\xc4\\x69\\x15\\xe0\\x21\\xdf\\x70\\xff\\x6d\\x60\\x21\\x5f\\x61\\x4f\\xc2\\x11\\x39\\x90\\x4d\\xf3\\xb2\\x92\\xb7\\x49\\xdc\\x4d\\xea\\x02\\x51\\x8b\\x62\\xd1\\x58\\x62\\xc9\\x2d\\x2a\\x4c\\x99\\x67\\x01\\xcd\\xec\\xae\\xd8\\x4a\\xb6\\x28\\xee\\x98\\x4f\\xc1\\x11\\xee\\xcb\\x59\\xe4\\x84\\x44\\xef\\xc0\\xd4\\x56\\xe2\\xc8\\x52\\x51\\x84\\x41\\xc3\\xdb\\x76\\x30\\xdd\\xd5\\x15\\x62\\x49\\xa2\\x87\\x30\\x98\\x38\\x38\\xae\\x59\\xac\\x4c\\xc7\\x11\\x0f\\xd6\\xde\\x68\\x10\\x1e\\xa5\\xb2\\xff\\x69\\xfd\\x36\\x4e\\x3c\\x94\\x48\\xde\\xfe\\xfe\\x17\\x5b\\xcb\\xe1\\x17\\xcc\\x11\\xb4\\xff\\x75\\x49\\xc3\\x3e\\x10\\x25\\xb6\\xb5\\x92\\x04\\x8a\\x8e\\x31\\x96\\x9e\\x81\\x8d\\xcc\\x18\\x8b\\xb1\\x9d\\x7a\\x24\\x40\\xa3\\xba\\xba\\x4e\\xb1\\xb8\\x1c\\x45\\x67\\x9d\\xb4\\x6b\\x31\\xbc\\xde\\x77\\x76\\x75\\x7d\\x99\\x31\\xec\\x20\\x63\\xfc\\x6f\\x1f\\xcd\\x76\\x1e\\xcc\\x57\\xa7\\xd0\\x30\\xa8\\x5e\\xa2\\x73\\xef\\x18\\x25\\xb0\\x50\\x92\\xab\\x96\\x45\\x35\\x9a\\x44\\x4f\\xf7\\xd1\\x66\\xb5\\x75\\xfa\\xc2\\x98\\x30\\x8d\\x9f\\xaa\\x68\\x46\\x3d\\x1d\\x0f\\x7b\\x7d\\xf8\\xa5\\x1c\\x68\\x15\\xd3\\x71\\x59\\xad\\xc0\\xb5\\x93\\x22\\x4a\\x81\\x83\\x21\\xd7\\x21\\x9f\\x09\\x68\\x6c\\xfc\\x95\\x22\\x59\\x71\\x8d\\xfc\"},\n{{0xb5,0x2b,0x24,0x9a,0x7a,0xea,0xe0,0xfb,0xd9,0x4f,0xfc,0xf9,0xa9,0xfd,0xe1,0x0d,0xe6,0x1c,0x3f,0x4c,0xbd,0xa1,0x4b,0x28,0x9f,0xe0,0x1f,0x82,0x70,0x73,0x34,0xca,},{0x73,0x51,0x63,0xbf,0xcf,0xd5,0x4f,0x9d,0x35,0x2e,0x1c,0x2f,0x3c,0x01,0x70,0xc9,0x5c,0x18,0x42,0xcc,0xc7,0x42,0x16,0x23,0xae,0x04,0x96,0x98,0x0c,0xee,0x79,0x1c,},{0x6f,0x48,0xa9,0xf7,0xf0,0xfa,0x19,0x2b,0x66,0xd1,0x21,0x75,0xa3,0x33,0x61,0x23,0x03,0xe1,0x80,0xb9,0xfa,0xb1,0x8e,0xda,0xbe,0xbc,0xdf,0x66,0x74,0xfd,0xfc,0xc5,0x36,0x07,0x08,0x9b,0xf9,0x80,0xce,0x35,0x89,0x4c,0x2f,0x9b,0xab,0xdc,0x44,0x38,0x66,0x7a,0xb3,0x29,0x7a,0x62,0x48,0xec,0x02,0x69,0xfa,0xa9,0x9c,0x72,0x48,0x07,},\"\\x1d\\x44\\x5e\\x8e\\xe3\\x6f\\x6e\\x10\\x64\\xee\\x12\\x81\\xe6\\xb4\\xa4\\xce\\xc5\\x0a\\x91\\xc2\\xb6\\x67\\xc8\\x30\\x5d\\x1e\\x9a\\x5f\\x7b\\x73\\xa3\\x44\\x58\\x82\\x58\\x1f\\xb0\\xc1\\x1e\\x64\\xf6\\xee\\x92\\xe8\\x11\\xf9\\xf2\\xd6\\xc5\\x9c\\x63\\x44\\xbe\\x76\\x91\\xd1\\x16\\xdd\\xa4\\x93\\xca\\xde\\x51\\xc0\\xce\\x77\\x37\\x2b\\x61\\xa7\\xc4\\xfb\\xb6\\x33\\x40\\x13\\x33\\xcb\\xf7\\x13\\x72\\xad\\x2f\\x04\\x4e\\x99\\x2a\\xc0\\x35\\xf5\\x87\\x9c\\x05\\x30\\x04\\xf8\\x22\\x3f\\x23\\x7a\\x24\\xa4\\x09\\xb7\\x89\\x4f\\x6a\\xd5\\x18\\xe0\\x46\\xb8\\xa8\\x4c\\x3f\\x4c\\x62\\x60\\xe6\\x16\\x9f\\xd9\\x44\\xd5\\x7f\\xbc\\xf9\\xba\\x27\\x75\\xf2\\xd6\\x0e\\xd7\\x72\\xc4\\x6c\\xcd\\x63\\xc8\\x50\\xb8\\x0d\\x58\\x7c\\x52\\x08\\xdf\\xb1\\xa2\\x58\\x78\\xc0\\x2d\\xec\\xe3\\xe6\\x02\\xe9\\x63\\x2f\\xc3\\xc2\\xc7\\x9b\\x25\\xab\\x41\\x03\\x4c\\x6e\\x26\\xb8\\x69\\x25\\x53\\x57\\xa6\\x86\\x78\\x1d\\xfe\\x6e\\x64\\x4b\\xeb\\xa9\\xb6\\x27\\xda\\x1f\\xcb\\x5e\\xc0\\xbe\\x49\\x7c\\xf1\\x88\\xe1\\xef\\x1a\\xf0\\x60\\x1b\\xf1\\x6b\\x29\\x11\\xfd\\x9f\\xf3\\x4f\\x0e\\x97\\xac\\x95\\xa7\\xfe\\x2c\\xf9\\x0e\\xa6\\xce\\xd3\\x3c\\xcb\\x0e\\xd1\\xef\\x2d\\x41\\x60\\xef\\xb0\\x7c\\x59\\x1a\\x5c\\xb1\\x6c\\x70\\xca\\x16\\x94\\xfb\\x36\\xf2\\xca\\x19\\xeb\\xa5\\x2b\\xe3\\xd4\\xad\\x89\\x5a\\xbc\\xad\\xa4\\xb3\\x6f\\x02\\x61\\xd6\\x5f\\x59\\xe0\\xcf\\xd2\\xa6\\x14\\x8a\\x88\\x92\\xdd\\xbb\\x45\\x81\\x0d\\xb3\\xbf\\x4a\\x9e\\x26\\xe9\\x2c\\x15\\xea\\x26\\x18\\xcf\\xee\\xb4\\x62\\xd8\\x62\\x8f\\x25\\x4f\\x54\\xd2\\xaf\\x27\\x11\\x3b\\xab\\x4f\\x9a\\x7d\\x06\\x79\\x18\\x11\\x94\\x2b\\xdc\\x32\\xf8\\x45\\x92\\x2d\\x7b\\x2d\\xdb\\xa9\\x59\\x14\\x09\\x28\\xf8\\xc2\\x8d\\x98\\xb4\\x4e\\x1d\\x19\\xb9\\x7f\\xd3\\x9c\\xc0\\xf9\\xa5\\x23\\x6d\\x34\\x9f\\xc8\\x35\\xac\\x49\\x21\\x92\\x46\\x2e\\x40\\xac\\x62\\x9b\\xeb\\xff\\xd2\\xeb\\xa7\\x2d\\x27\\x88\\xb2\\x44\\xbb\\x77\\x7a\\xd0\\xf7\\xb7\\xf9\\x6f\\x23\\x41\\x23\\x99\\xfc\\x1d\\x87\\xa1\\xd0\\x87\\xba\\x08\\x90\\x27\\xea\\xbb\\xc0\\x5e\\xda\\xfe\\xe4\\x33\\x79\\xe8\\x93\\x29\\x13\\x31\\xb4\\x60\\xbf\\xa7\\x33\\x2e\\x08\\x42\\xec\\x25\\x73\\x39\\x3d\\xe9\\x53\\x06\"},\n{{0x78,0x2a,0x93,0xef,0xe0,0xef,0x06,0xcb,0x25,0x34,0x33,0x0e,0xfd,0x0e,0x96,0x84,0xe9,0x96,0x9b,0x52,0x58,0x12,0x3e,0x49,0x02,0x39,0xbf,0x24,0xbf,0x9f,0x65,0x23,},{0x94,0x2f,0xa1,0x40,0x6e,0xe2,0x68,0x3e,0x29,0x37,0x7e,0x49,0xf7,0xba,0x75,0x7c,0xf5,0x0e,0xf0,0x72,0x37,0x07,0xd4,0x40,0x3d,0x28,0x62,0x25,0x70,0x45,0xde,0x87,},{0x93,0xe7,0x40,0x5a,0x40,0x44,0x51,0x01,0x66,0xc8,0xac,0x26,0x4c,0xe3,0xb5,0xba,0x66,0x65,0xd6,0x8b,0xad,0x45,0x87,0x12,0xdc,0x93,0xc2,0xc3,0x90,0x56,0x8d,0x74,0x02,0xef,0x7d,0x57,0xf5,0x49,0xb8,0xa1,0x04,0x2f,0x7f,0x69,0xa6,0x79,0xaa,0x85,0x5f,0x34,0xf8,0x01,0xd5,0x7d,0x79,0x89,0x5d,0xeb,0x8d,0xea,0xdb,0x35,0x23,0x08,},\"\\x46\\xa4\\xe3\\x19\\xa6\\x70\\xac\\x99\\x39\\x94\\xa5\\x33\\x00\\xc3\\xf7\\x91\\x44\\xc2\\xf7\\xfe\\xc1\\x11\\x6e\\xee\\xb3\\x62\\x1c\\x76\\xac\\x35\\xda\\x79\\xdb\\xff\\x6e\\x18\\x9c\\xa9\\xdb\\xfc\\x9a\\xbb\\xda\\x05\\x48\\x47\\xb2\\x97\\x1b\\x02\\xfa\\xce\\xbb\\xe9\\x26\\xd4\\x69\\xeb\\x0a\\x86\\x03\\x89\\xac\\x74\\x41\\x62\\xbf\\x6f\\xb1\\x3b\\x42\\xcb\\x9b\\xb8\\xc9\\xd7\\x26\\x07\\x13\\x8e\\x78\\x00\\x12\\x1e\\xe0\\xcd\\x63\\x3e\\xd5\\x35\\xc7\\xae\\x5f\\x40\\x60\\xbb\\xdd\\x27\\x1c\\x9d\\x11\\x0a\\xbf\\xf5\\xe0\\x60\\xea\\x6e\\xe8\\x38\\x90\\xb1\\xe9\\x2a\\x92\\x56\\xd7\\xb2\\xba\\x98\\x2a\\x31\\x14\\xbb\\x6d\\xef\\xfe\\xe2\\x69\\x6f\\x0a\\x2f\\x9c\\x21\\xaa\\xa5\\xb2\\xde\\xfa\\x11\\xaa\\xb7\\x07\\x6d\\xe6\\xe5\\x7e\\x86\\xf2\\x84\\xbb\\x67\\xf5\\xa4\\x9e\\xe6\\x85\\x92\\x10\\x32\\xc9\\x5b\\x74\\xe7\\xe3\\xea\\xc7\\x23\\xf1\\x75\\xaf\\x08\\x2c\\x85\\x8e\\x0d\\xfa\\x01\\x72\\x8c\\x38\\xfb\\xbb\\x4c\\x83\\x58\\x1f\\x81\\xac\\xe6\\xc6\\x3c\\x6b\\xda\\xac\\x56\\x20\\xeb\\x9a\\x56\\x8e\\x7e\\xbb\\x7b\\x72\\xb3\\xd1\\xa1\\x64\\xef\\x52\\x4e\\x7b\\x9f\\x00\\x79\\x9a\\xb0\\x86\\x71\\x59\\x76\\xc1\\x4d\\x0d\\xf6\\x5f\\x7b\\x96\\xbf\\x9e\\xbc\\xda\\x7f\\xee\\xef\\x11\\x34\\x22\\x00\\x1a\\x03\\xa7\\x63\\x3d\\xf5\\xe4\\x99\\x39\\xa1\\x21\\xdb\\x89\\x9d\\x9b\\x8a\\xc2\\xdb\\x4f\\xad\\x0c\\x30\\xcf\\x0b\\x8b\\xdb\\xc9\\xe9\\x80\\x2a\\x79\\x7c\\x82\\x38\\xe4\\x65\\x11\\xff\\x24\\x06\\x8c\\xad\\xcf\\xf2\\x44\\x8c\\xc0\\xbf\\xf9\\x27\\x69\\x22\\x33\\x48\\xd4\\x5d\\x6b\\x6f\\x2c\\x8f\\x15\\x93\\x38\\x8c\\x0b\\xbb\\xf4\\x4b\\x6d\\xdb\\x50\\xb9\\x8c\\xd7\\xf0\\x9c\\x73\\x0f\\x7d\\xe4\\xd0\\x08\\x15\\x6c\\xb3\\xcd\\xe0\\xca\\xb3\\xad\\x0a\\x58\\xa8\\x39\\x54\\xe2\\x34\\xa0\\xa8\\xa0\\x4b\\x57\\x3c\\x9a\\x8e\\x9b\\x92\\x9e\\xd3\\x8b\\x8b\\x22\\x8b\\xf5\\x5a\\x3c\\x6e\\x2c\\x6b\\x51\\xf6\\x82\\x65\\x2f\\xbb\\x70\\x8e\\x74\\x64\\x0e\\x33\\x13\\xe1\\x7b\\x46\\x94\\xd7\\xfd\\xf0\\x11\\x1f\\x90\\x60\\x8c\\x1b\\x5a\\xf4\\x22\\xdc\\xde\\xca\\xd9\\xdd\\xb7\\xf5\\x0d\\x1b\\xf5\\xbc\\x63\\x78\\xcc\\xaf\\xfc\\x32\\x01\\xe6\\xc7\\x87\\xb4\\x8c\\x44\\x3b\\xa2\\x40\\xd9\\xd5\\x0f\\xf6\\xc0\\xe9\\xdf\\x7f\\x1a\\x5b\"},\n{{0x6f,0xe7,0xbc,0xf7,0xa6,0x84,0x42,0x3d,0xe1,0x07,0x6f,0xd7,0x6d,0xa7,0x83,0x42,0x33,0x73,0xb3,0x81,0x32,0x9e,0xfd,0x61,0x57,0x42,0x4e,0xc4,0xb2,0x65,0x5a,0x94,},{0x77,0x40,0xe9,0x1a,0xfe,0x45,0x32,0x4f,0x8b,0xb9,0x90,0xca,0x2a,0x34,0x12,0x79,0xdd,0xaf,0x23,0x2c,0x3b,0xb4,0x15,0xf1,0x78,0xb6,0x09,0x2f,0xba,0x19,0x5f,0xec,},{0x99,0x14,0xcc,0x50,0xfe,0xf0,0x93,0x5e,0xfb,0x89,0xb3,0xd6,0x4e,0x3c,0x1c,0x34,0x12,0xae,0xd6,0x59,0xb9,0x01,0x66,0x22,0x2c,0x0d,0x13,0xec,0x1c,0xe3,0xa6,0x8a,0xe6,0x28,0x1b,0x7e,0xfd,0x9d,0x4e,0xc6,0x4b,0x82,0xe7,0x3e,0x14,0x47,0x9f,0x03,0xfb,0xac,0x8f,0xa3,0xab,0xdb,0x41,0xea,0x42,0x15,0xc4,0xa4,0xd4,0x94,0x9d,0x09,},\"\\x0b\\xaf\\x0a\\xd4\\x40\\x61\\x2b\\x4c\\x5a\\x13\\x6c\\x3a\\x42\\xbe\\x1c\\xa2\\xb7\\xc3\\x19\\x86\\x2a\\x44\\xa9\\xfd\\x50\\xc4\\xee\\x73\\x54\\x1c\\x5e\\x64\\x57\\xef\\xa8\\x18\\x25\\xb6\\xdd\\x4a\\x72\\x19\\x4a\\x29\\x68\\x68\\x8b\\xd4\\x9e\\x5a\\x8f\\x4c\\x04\\xdb\\xaf\\xc2\\xe7\\x88\\x4c\\x0c\\x70\\xc2\\x08\\xd4\\xe9\\x54\\xcd\\x16\\x75\\xda\\x8e\\x74\\xc6\\x5c\\x49\\x7c\\xf9\\xdc\\x69\\x42\\x49\\x65\\xbd\\xcb\\xa5\\xde\\x52\\x93\\x6f\\x92\\x5f\\x62\\xe2\\x01\\xf9\\x95\\x05\\xd3\\x77\\x7b\\xeb\\x3c\\x2e\\x08\\xb2\\xec\\x9a\\x87\\x3e\\x5a\\x9c\\x21\\xfb\\x4a\\x2f\\x3e\\x86\\x1f\\x3c\\xf4\\xd6\\xb5\\xdc\\xd1\\xc8\\x8b\\xcd\\x91\\x63\\x53\\x9a\\xc6\\x2c\\xd0\\x65\\x9f\\x4e\\xf2\\x32\\xc2\\xce\\x57\\xfc\\x77\\xf9\\x02\\x85\\xeb\\x35\\x01\\x69\\xed\\xc6\\xa8\\x06\\xff\\x50\\xf6\\x1c\\x7e\\x0b\\xee\\xeb\\xec\\xec\\x63\\xbf\\xc9\\xd3\\x98\\x3f\\x5b\\xb4\\xb2\\x61\\xc7\\x46\\x47\\x1f\\xcb\\xf2\\x89\\x2c\\x61\\x08\\x97\\x0b\\x68\\xdb\\x5e\\x43\\xc4\\x50\\x4d\\xda\\xe2\\xd0\\xff\\xff\\xa2\\x8b\\x67\\x59\\xae\\x11\\x28\\xe1\\x6f\\x66\\xd4\\x92\\xad\\x61\\xe3\\x72\\x2c\\x96\\x0f\\x88\\x69\\x2b\\xe8\\x1a\\x9f\\x41\\x28\\x90\\xff\\xa3\\x46\\xe7\\x02\\xc8\\x67\\xdf\\xa2\\x59\\x70\\x3b\\x73\\xf5\\x25\\x07\\x4f\\x32\\x27\\xc4\\x9c\\xec\\x1b\\x64\\x5a\\x10\\x3b\\xd4\\x47\\x1f\\x33\\xf9\\xf1\\xba\\xc3\\x27\\xd7\\x91\\x78\\x61\\xd0\\xad\\x91\\xab\\xee\\x60\\x22\\x2e\\xa2\\xa3\\xc8\\xca\\xc0\\x52\\xae\\x9a\\x2c\\xbd\\x90\\x85\\x5d\\x73\\x3d\\x53\\x19\\x13\\x3f\\x95\\x41\\xbd\\x0b\\x61\\xf0\\x99\\x52\\x68\\x35\\x1e\\x28\\x63\\xc1\\xca\\x2c\\xa5\\x1e\\x3c\\x97\\x63\\x83\\xf5\\xc4\\xc1\\x1f\\xf4\\x10\\x03\\x6f\\xd5\\x1d\\x5a\\xc5\\x6b\\x02\\x3c\\xe9\\x02\\x9c\\x62\\x0f\\x22\\x55\\x70\\x19\\xad\\x9b\\x42\\x64\\xed\\x4d\\x71\\xb4\\x34\\xf4\\xa4\\xd1\\x7a\\x7d\\x57\\x69\\xfa\\x1e\\x14\\xa6\\x9f\\x7a\\xe4\\x19\\xcc\\xf5\\x94\\x7f\\x8c\\x76\\x82\\x69\\x71\\x16\\xc2\\x40\\x5f\\x5a\\x19\\x59\\xc5\\x4b\\x48\\xf0\\x87\\x2f\\x59\\x6e\\xd4\\x59\\x64\\x48\\x8d\\xde\\xc1\\x2b\\xdb\\x63\\x6d\\x0b\\x34\\x9e\\x74\\x9e\\xb6\\x60\\x92\\xff\\x45\\x11\\xfb\\xa5\\x9b\\x59\\x62\\xcb\\x93\\xcc\\x85\\x51\\x5c\\xc8\\x6a\\xb0\\xc6\\xb2\"},\n{{0xdd,0xa4,0x8a,0x0d,0x15,0xa2,0x9e,0xba,0x9a,0x76,0x30,0x5d,0x36,0x0e,0x46,0x6e,0x72,0xd8,0x04,0x0e,0xfe,0x2e,0x89,0xc0,0x4b,0x64,0x61,0x31,0x5a,0x9b,0x8b,0xf4,},{0x4f,0x5c,0xc3,0x6a,0x80,0x94,0x16,0xb5,0x8e,0x15,0xd2,0x4c,0xc5,0x79,0x68,0xcb,0x57,0x3b,0x76,0xad,0x90,0x88,0x7a,0x8e,0xf3,0x6c,0xde,0x7e,0xca,0x40,0x0f,0xcc,},{0xce,0x71,0xbc,0x82,0xd5,0x31,0xd0,0xf9,0x3b,0x57,0xbf,0xdc,0x2f,0x73,0x16,0xcf,0x40,0x4e,0xe0,0x9a,0xf8,0x8f,0x33,0xbf,0x80,0x6c,0x7c,0xad,0x6b,0x8f,0xfa,0x36,0x62,0x36,0xba,0x74,0xe7,0x5c,0x15,0x09,0x6d,0xda,0xa6,0xe3,0xa6,0x2a,0x8f,0x5e,0xb1,0xc8,0xc3,0xf6,0xb6,0xc9,0x4a,0x6a,0x34,0x9f,0xc7,0xc0,0xcb,0xfb,0x19,0x0d,},\"\\xf5\\xac\\x19\\xb8\\x1f\\x21\\x11\\xa0\\xdb\\x0a\\xe3\\x0d\\x15\\x13\\xed\\x34\\x3e\\x7f\\x57\\xf7\\xf7\\x7d\\x65\\xb8\\xac\\x7c\\xe3\\xa6\\x01\\x17\\x4b\\xae\\xd9\\xbf\\xa1\\x36\\x03\\x59\\x76\\xf5\\x16\\xd5\\xa8\\x70\\xf4\\x5d\\xb1\\x91\\x9f\\x1e\\xb1\\xcb\\xec\\xbe\\x88\\xec\\x32\\xd1\\x91\\xe9\\x24\\x88\\x21\\xa7\\xe7\\x68\\x1f\\xe3\\xab\\xec\\x11\\x58\\x4b\\xdb\\x33\\xde\\x1b\\x4c\\xa9\\x48\\x91\\xeb\\x66\\xdc\\xb8\\x53\\x9a\\xc4\\x11\\x63\\x73\\x6c\\xcf\\xd6\\x9a\\xbb\\x83\\x81\\x4d\\xd3\\x8c\\xd6\\x03\\x81\\x31\\x87\\x28\\x05\\x2a\\x25\\xcb\\x66\\x54\\x71\\x05\\x86\\x50\\xcc\\xc7\\x57\\x56\\xdb\\xee\\x68\\x8a\\xb8\\x26\\xec\\xad\\x4a\\xd5\\xa7\\xdb\\x57\\xe8\\xf6\\x5f\\x1b\\x64\\xab\\xff\\x82\\xdd\\x53\\x33\\x4b\\x79\\x7a\\xc4\\x02\\x28\\xdd\\x81\\x7f\\x23\\x9d\\x3e\\xe8\\x04\\xa1\\x9a\\xea\\xc8\\xcf\\xe3\\x3e\\xb6\\x57\\xec\\x9c\\xe9\\x23\\xd6\\xb3\\x88\\x91\\x4c\\xfb\\xa2\\xe7\\x2b\\xfc\\x2b\\xc3\\xd6\\xf9\\x85\\xc0\\xd9\\x75\\x34\\xdb\\x95\\x8e\\xed\\xe5\\x7b\\x16\\x49\\x1f\\xfb\\x75\\x5c\\x1a\\x58\\xd7\\x8a\\xb3\\x77\\xfa\\xec\\x0d\\x31\\x18\\x18\\xe8\\x99\\x26\\x0e\\x3e\\xbd\\x1c\\xcd\\x29\\x24\\x6f\\xa8\\x2d\\x0b\\x76\\x62\\x2b\\x2c\\x4b\\xc5\\x2f\\x54\\x9f\\xee\\x72\\xa3\\x0f\\x55\\x4f\\x33\\x1f\\x36\\xd2\\xa7\\x4d\\x99\\x9e\\xc1\\x0a\\x08\\x29\\x4f\\x00\\x2b\\x43\\x61\\xe5\\x90\\x27\\x9c\\x2f\\xb1\\xbd\\xa4\\x31\\x2c\\xcb\\x24\\xd7\\x52\\x82\\xce\\x7c\\x06\\x1a\\x0c\\xa5\\x52\\x0c\\x74\\xf6\\xf6\\x33\\x3b\\x18\\xc4\\xb5\\x41\\xcb\\x6c\\x51\\xe0\\x15\\x75\\xba\\x80\\x51\\x2f\\xfa\\x7c\\xe0\\xac\\xcd\\x22\\xd1\\x40\\x27\\xc5\\x3a\\xba\\x1f\\x74\\x37\\x83\\x5f\\x11\\x14\\xd6\\x8e\\x3a\\xcf\\x3f\\xf8\\xde\\x94\\xc8\\xe4\\xef\\x6d\\x3a\\xb3\\x12\\xc9\\x1d\\x02\\x97\\x01\\x57\\x50\\x8f\\x54\\xa5\\x81\\x6f\\x46\\x7a\\x21\\x4e\\x9b\\x12\\x84\\x30\\x02\\x89\\xe6\\x5f\\x36\\x5a\\x61\\x0a\\x8e\\xa2\\x84\\x66\\x6c\\xfe\\x55\\x18\\xe4\\x35\\xbc\\xcd\\x21\\x62\\x75\\x01\\xc7\\x25\\xf0\\xb8\\xeb\\x57\\x25\\xe0\\xe0\\x6e\\x0c\\xef\\x5d\\xb2\\x01\\xb4\\x8e\\xc9\\x1e\\xbf\\x87\\x8d\\xd5\\x7c\\xe8\\xda\\xc7\\x33\\x48\\x48\\xa1\\xbc\\x82\\xc1\\x8b\\x06\\x59\\x55\\xe4\\xf5\\x9b\\xe3\\x39\\x85\\x94\\xdc\"},\n{{0xec,0x57,0xb9,0x41,0xad,0xf3,0xca,0x13,0xe7,0x7a,0x78,0x05,0x77,0xcf,0xd0,0xdf,0x5b,0x49,0xed,0xc8,0x53,0x51,0x05,0x2d,0xa3,0x4e,0x99,0xf8,0xa9,0xbf,0x32,0x08,},{0x28,0x59,0xc0,0x71,0x97,0x8a,0x04,0xb7,0xf5,0x40,0x7b,0x6d,0x22,0x40,0x1a,0x78,0xef,0xd0,0x39,0x4b,0xb9,0x66,0xb9,0xa0,0x4d,0xa6,0xb5,0xef,0x81,0x9d,0xe3,0xfa,},{0x11,0x8e,0x14,0x62,0x12,0x6b,0x45,0xb8,0xc6,0x80,0x35,0x23,0x75,0x5c,0x56,0xdf,0xc4,0xe1,0x23,0xe4,0xac,0xbb,0x66,0xba,0x0b,0xa6,0xfe,0x3e,0x05,0x3d,0xa4,0x11,0x9f,0x57,0x19,0x29,0x5e,0x0c,0x82,0xac,0x64,0xd7,0xc5,0xcb,0x1a,0xc8,0x98,0xdf,0x26,0x3d,0xdf,0xd3,0x60,0xf3,0x00,0x8d,0x91,0x01,0x8b,0x26,0xf6,0xa1,0x73,0x0a,},\"\\xd2\\xbc\\xbd\\x1b\\xc3\\x61\\xab\\x32\\xc6\\x6d\\x72\\xfd\\x48\\xa8\\xe2\\x27\\xdc\\x6b\\x8d\\x6b\\x15\\x08\\x48\\xba\\x71\\x5f\\xf4\\x7d\\xd3\\x5c\\x8e\\x49\\x38\\x1b\\xb4\\xe2\\x93\\x3f\\x42\\xcd\\x26\\xb7\\x5b\\x14\\xd9\\xc0\\x03\\x92\\x82\\xb6\\x2b\\x85\\x56\\xaa\\xa1\\x1c\\xd6\\x91\\xe8\\x28\\x38\\x2b\\xe3\\x06\\x88\\x9f\\xc9\\x20\\x51\\x37\\xb1\\x69\\xd3\\xbf\\x17\\xb7\\xf3\\x76\\x93\\xfc\\xe2\\x86\\x03\\x9f\\x03\\x80\\x9d\\x7d\\x9d\\x98\\xc8\\xfd\\xe4\\x6f\\x11\\x01\\x94\\x2a\\x27\\x9c\\x51\\x67\\x06\\xf5\\x01\\x91\\xa9\\x11\\x2f\\x6a\\x24\\x63\\x0e\\x1a\\x26\\xc3\\x21\\xe4\\x6c\\x9c\\xcc\\x85\\xb6\\xef\\x94\\x2f\\x35\\x3a\\x64\\x2b\\x9e\\x7e\\xf9\\x98\\xc0\\xfc\\xe2\\xd3\\xa7\\x5b\\x99\\x9e\\xeb\\x77\\xf3\\x1f\\x9b\\x08\\x13\\xa9\\x7e\\x30\\x14\\xc3\\xa8\\x6e\\x25\\x58\\x73\\x46\\x21\\xa3\\x06\\x6d\\xae\\x35\\x84\\x50\\x31\\xe3\\x56\\x65\\xf1\\x92\\x29\\x07\\xdb\\xb7\\x39\\x78\\x6a\\x8b\\x76\\x58\\xab\\x60\\x27\\x6f\\x2d\\x92\\x1d\\x1a\\x51\\x23\\x0f\\xc7\\x4d\\x19\\xe8\\x01\\x84\\xa4\\xf1\\x0e\\x9e\\x83\\x4a\\xbc\\x9a\\x36\\xc4\\x29\\x72\\x6b\\xc0\\x55\\xdc\\x8c\\x06\\x3f\\x0e\\xca\\x9c\\x61\\xa8\\xa9\\x70\\xbd\\x4b\\xb5\\xf4\\x24\\xee\\x4d\\x04\\xbf\\xc2\\x95\\xe3\\xbb\\x1f\\x34\\xbe\\xcb\\xd9\\x92\\x0f\\xe2\\xe7\\x7f\\xcf\\x36\\x76\\x3f\\x32\\xfc\\x9c\\xfd\\x5e\\x46\\x59\\x79\\xc1\\x67\\xca\\xbf\\x5a\\x12\\x44\\xb4\\x91\\xfc\\x06\\xb8\\x94\\x64\\x19\\x04\\x6b\\xa5\\x16\\xc5\\xb2\\x33\\xc4\\x14\\xdd\\xef\\xb6\\xda\\x04\\xf2\\xe1\\x3d\\xaf\\xf7\\xa9\\xa0\\xc0\\x2a\\x51\\x8e\\xde\\x57\\xad\\x95\\x21\\xde\\x64\\xed\\xdf\\x6f\\x49\\xa9\\x67\\x0f\\x63\\x2d\\x3f\\x7d\\x42\\x42\\x52\\x07\\xd0\\x53\\x60\\x4f\\xe3\\x9d\\x13\\xb9\\xf5\\x2c\\x8b\\xc2\\x92\\xb0\\x07\\x6e\\xa4\\x2a\\x56\\x00\\x56\\xdf\\x25\\xde\\x51\\xad\\x35\\x88\\x1d\\x08\\x54\\x32\\x24\\xd7\\xfa\\x5d\\x70\\xb8\\x60\\x3e\\xf2\\x3c\\xe0\\x63\\x39\\xd6\\xcd\\x09\\xe2\\x2a\\x95\\x74\\x9e\\x50\\xdf\\xbd\\x3b\\x8a\\xd6\\x9f\\xd3\\x04\\x96\\xb9\\x84\\xd1\\xc0\\xa1\\x99\\xc8\\x59\\x48\\x05\\xf3\\x8b\\xa4\\x46\\x31\\xa2\\xc5\\x9e\\xad\\xc6\\x55\\x4d\\x19\\xf9\\xbc\\x98\\x36\\x6d\\xfd\\xec\\x2a\\x12\\x1d\\x0e\\x48\\x14\\xd2\\xcd\\x3f\\x58\\x71\"},\n{{0xcb,0xfd,0x91,0xd7,0x69,0x5c,0x1f,0x27,0x0f,0x69,0x24,0x6a,0xb3,0xdf,0x90,0xed,0xb2,0x14,0x01,0x10,0x1c,0xa7,0xf8,0xf2,0x6c,0x6d,0x00,0xf4,0xdc,0xb7,0x23,0x3e,},{0x51,0x38,0x79,0xcf,0x79,0xd2,0xf4,0x6d,0xf4,0xb8,0x5a,0x5c,0x09,0x49,0xeb,0x21,0x16,0xab,0xf9,0x81,0x73,0x5a,0x30,0x31,0x64,0xcb,0xd8,0x5a,0xdf,0x20,0xb7,0x52,},{0xf3,0x36,0x13,0x7d,0xfe,0x6f,0x42,0xa6,0x66,0x9b,0x55,0xf7,0x4b,0x80,0xb3,0x03,0x5a,0x04,0x03,0x67,0xf9,0x06,0x56,0xfc,0xef,0x0a,0x64,0x4c,0x52,0x27,0x2d,0xdc,0x39,0x27,0x3c,0xd7,0x72,0x60,0x10,0xeb,0xcd,0x8a,0x30,0xa0,0x52,0x01,0xab,0x70,0xb8,0xff,0x97,0xd0,0x28,0x8a,0x2c,0xb9,0x4c,0xbc,0x49,0x02,0x06,0x47,0x39,0x0b,},\"\\x26\\x4a\\x93\\x3f\\x7d\\x0a\\xec\\xba\\xc1\\x3e\\xef\\x64\\x4b\\x0b\\x53\\xdd\\x53\\xa1\\x28\\x09\\x04\\x10\\x0d\\xbc\\x1a\\xb8\\x7b\\x51\\x14\\x89\\x98\\xf9\\xda\\x0b\\x3a\\x0a\\x63\\x37\\xf5\\xe3\\x48\\x6c\\x2b\\x7e\\x54\\x8d\\x21\\x12\\x59\\x39\\x7a\\xaa\\x19\\x4e\\xe4\\x69\\x5b\\xf9\\x8c\\x2d\\x5f\\x44\\x87\\x69\\x9f\\x73\\x97\\xe5\\xd3\\xa7\\xe6\\xd5\\xf6\\x28\\xfb\\xd0\\x54\\x97\\xc5\\x56\\xa5\\x0a\\x4d\\x05\\xe2\\xb7\\x12\\xcd\\xbc\\x35\\x10\\x68\\xe4\\x2a\\xf1\\x95\\x38\\x90\\x1b\\x88\\x25\\x31\\x0e\\x34\\x3e\\x1a\\x17\\xa1\\x86\\x7d\\xde\\x0e\\xb4\\x7d\\xda\\xb4\\x56\\xd3\\x16\\xf3\\x52\\x15\\x54\\x93\\x7b\\xf8\\x08\\xae\\x4e\\x4b\\xc1\\xc3\\xc5\\xb4\\x75\\x6e\\x4a\\x16\\x5a\\xd9\\xe8\\x82\\x7f\\x53\\x16\\xf7\\x48\\xca\\xc6\\x99\\x8e\\xd2\\xd2\\x10\\x4f\\x26\\x84\\x07\\xc1\\x35\\xe6\\x2f\\x26\\xa9\\x22\\x46\\x0e\\xab\\x6d\\x85\\x16\\x39\\xa0\\x0e\\x5f\\x08\\xb3\\x47\\x65\\xea\\x02\\x44\\xf4\\x75\\xbb\\xfe\\xac\\x18\\x3e\\x3b\\x5b\\xd1\\xaa\\xb7\\x98\\x52\\x27\\x98\\xa0\\x8e\\xc6\\xbf\\x22\\x57\\xd4\\x69\\x2f\\x5b\\x03\\xcd\\xd0\\xa2\\x13\\x3d\\xe9\\x70\\x60\\x3e\\x32\\x51\\x47\\x5a\\xad\\x8d\\x93\\x4a\\xf6\\xb2\\xbf\\xc7\\xa6\\x50\\xb9\\x1b\\xde\\xc1\\x43\\xf8\\xad\\x25\\x4c\\xfa\\x50\\x6b\\xbf\\xf2\\x8a\\x03\\xbe\\xb6\\x59\\xef\\x5e\\x5d\\xdf\\xfe\\x76\\xe2\\x32\\x30\\xc4\\xcc\\xd4\\x63\\x10\\xb3\\x7d\\xd9\\x1f\\xa6\\xaa\\x68\\x16\\x7f\\x62\\xa5\\x5c\\x8a\\x69\\xf9\\xed\\x1e\\xc6\\xcd\\xb1\\x44\\xdd\\x81\\xab\\x0b\\xcb\\xd6\\x26\\x43\\x42\\x0b\\xca\\xe6\\x78\\x69\\xf6\\x4c\\x0b\\x16\\x9f\\x3c\\xdf\\x3c\\x90\\x58\\x95\\xb7\\xd3\\x5b\\x6f\\xaf\\xda\\x25\\xcc\\xf2\\x3c\\x3d\\x10\\xde\\x32\\xe7\\xf2\\x71\\xe3\\x00\\xd3\\x95\\x97\\xda\\x8f\\x84\\x37\\x22\\xef\\x08\\x36\\x4a\\x5f\\x7a\\x10\\x5b\\x96\\x55\\x17\\x2d\\xf7\\xc8\\x2d\\x73\\x74\\xf9\\x82\\x64\\xc9\\xcd\\xcc\\xb4\\x96\\xf2\\xe1\\x0f\\xd8\\x26\\x2f\\xb1\\xa9\\xa9\\x96\\x5b\\x0b\\x84\\x1a\\xc0\\xd0\\xe9\\xc1\\xa3\\xd9\\x49\\x3e\\xa7\\xaa\\x60\\x02\\x05\\xb8\\xf9\\x00\\xbe\\x0d\\x7a\\xbb\\x4d\\x98\\xa0\\x65\\x83\\xd2\\x29\\x5c\\x27\\x63\\x18\\xbe\\x28\\xd4\\x21\\x98\\x2d\\xed\\xd5\\xbf\\xc3\\x3b\\x88\\x65\\xd9\\x4e\\xf7\\x47\\xd6\\x26\\xaf\\x99\"},\n{{0x51,0xa4,0x19,0x7a,0xb7,0x68,0x6f,0x82,0xf6,0x00,0x3a,0x0c,0x32,0xf3,0x9d,0x0f,0x2e,0x47,0x55,0x5f,0x4e,0x9f,0x8d,0xee,0xe7,0x5b,0xcb,0x1b,0xd1,0xef,0x69,0xe5,},{0x06,0x38,0x6d,0xf8,0x6b,0x61,0xf1,0xf8,0xf4,0xdc,0x45,0xb7,0x3e,0xda,0xa8,0x41,0x92,0x09,0x68,0xbb,0xd1,0x31,0xcc,0x5c,0xa1,0xc5,0x29,0x4e,0xee,0xd5,0xc8,0xba,},{0x2c,0x07,0x29,0x69,0xff,0x47,0x19,0x21,0x2a,0x12,0x19,0x38,0xb5,0x06,0xc6,0x02,0x99,0x5b,0x4d,0x02,0xa2,0x2e,0x61,0x98,0xd6,0xe8,0x7d,0xd6,0xae,0x07,0x62,0x25,0xac,0x70,0xbb,0x25,0xef,0x8c,0x0e,0xe8,0x1e,0xb6,0xfe,0x95,0x3d,0xf6,0xb1,0x81,0x59,0x49,0xe8,0xed,0x05,0x06,0xcb,0x01,0x2e,0x87,0x3c,0xd3,0x6c,0xd0,0x9b,0x0a,},\"\\x2a\\xed\\xb7\\xe8\\x2f\\x1f\\xe4\\xce\\x46\\x9a\\xda\\x48\\x34\\x5d\\x00\\x6d\\x1b\\x3b\\xff\\x40\\xeb\\x21\\x86\\x7f\\x51\\xfc\\xe9\\x65\\x64\\x0c\\x40\\x9e\\xc1\\x3a\\xd4\\xd5\\x2f\\x89\\x1b\\xd7\\x90\\x66\\xd6\\xb4\\xd9\\x44\\xca\\x86\\x8d\\x89\\x86\\xd2\\x42\\xb5\\x7e\\xcc\\xc4\\xc4\\xa4\\x88\\x29\\x1b\\x15\\x9c\\x8d\\xe4\\x39\\x2b\\xe4\\xb8\\x6f\\xeb\\xaa\\x75\\xea\\xc5\\xd2\\x2d\\x3c\\x4f\\x8d\\x6b\\xef\\x79\\xad\\xb9\\xb9\\x2b\\x49\\x14\\xd5\\xea\\x07\\xc7\\xf0\\x21\\xe2\\xc2\\x9f\\x58\\xd0\\x7b\\xe8\\xa0\\x84\\x10\\x0b\\xc1\\x52\\xd5\\x1c\\xa8\\x97\\xd7\\xc1\\x31\\x64\\x4d\\x08\\x95\\x32\\x2e\\x94\\x40\\xa8\\x33\\x9e\\x1a\\xa3\\x90\\xa7\\xf4\\xfc\\xb5\\x1d\\xdf\\xb6\\xdf\\x48\\xaa\\xf5\\x67\\x63\\x37\\xd8\\x7d\\xdd\\x85\\xb1\\xd9\\x25\\xe1\\xa9\\xc2\\x9f\\xe0\\x81\\x8f\\x51\\x4e\\xf7\\x2f\\x74\\x7a\\x67\\x49\\x46\\x47\\x69\\x07\\xa7\\xca\\x99\\xe9\\xdb\\x8d\\x20\\x96\\x41\\x05\\x7a\\x7f\\x44\\xa3\\x17\\xb9\\x09\\x74\\xbc\\x86\\xf9\\x61\\x7a\\x96\\x8a\\x76\\xa6\\xb8\\x38\\x7c\\xf5\\x85\\x3e\\x60\\x81\\x90\\xc1\\xa7\\x9f\\x1e\\x1d\\x68\\x6e\\x0d\\xe2\\x2d\\xb6\\xcd\\x9a\\xeb\\x85\\x32\\xc5\\xc8\\x5c\\xc9\\x0b\\x5a\\x01\\x85\\x79\\xf2\\x8e\\x50\\x2a\\x77\\x0a\\x4e\\xc6\\x75\\x26\\x3d\\x0d\\xd7\\x81\\xb4\\xfa\\x53\\xc9\\xdb\\xf8\\x09\\x8d\\x57\\xb3\\x3a\\xe2\\xaf\\xba\\xeb\\x3e\\x68\\x26\\x6a\\xd9\\xaa\\xb7\\x17\\x4b\\xa6\\x8c\\x64\\x79\\x88\\x39\\x92\\x67\\x0c\\xcf\\x3e\\x5a\\xc6\\xa1\\x7e\\x65\\xe3\\x1e\\x1f\\xdc\\x85\\xe2\\x69\\xc8\\x09\\x35\\xef\\x57\\x4f\\x20\\xd2\\x39\\x56\\x84\\x86\\xe7\\xd9\\x4a\\x4f\\x72\\x4a\\xb7\\x00\\x60\\x98\\xb2\\x4f\\x3f\\x61\\x58\\x76\\x91\\x43\\x5c\\x7f\\x29\\xce\\x4e\\x5c\\xa7\\x1b\\x2b\\x18\\x74\\x55\\x64\\x33\\xa3\\x58\\xc8\\xc5\\xef\\x3c\\x88\\x08\\x43\\x03\\x0c\\x2d\\x13\\xd5\\x1b\\x78\\xc9\\xbf\\x1a\\x88\\x24\\xe6\\x2e\\x11\\x18\\x44\\x39\\x6f\\x5a\\xf2\\xe2\\x5c\\x31\\x26\\xef\\x36\\x26\\xe2\\x6e\\xfa\\xfa\\xcf\\x99\\x83\\x0a\\xa4\\x12\\x12\\x33\\x2f\\x37\\x8a\\x16\\x72\\x33\\xa0\\xb4\\x22\\x13\\xaf\\xe3\\x6d\\x83\\xdc\\x45\\x82\\xa7\\x96\\x93\\xb9\\xd5\\x71\\xa5\\x77\\x12\\xa0\\x8b\\x85\\x66\\xd3\\x61\\xac\\x90\\x26\\x47\\xaf\\xc8\\x86\\x60\\x3e\\x24\\x28\\x3e\\xfb\"},\n{{0xb1,0x11,0x9c,0x36,0x11,0x8b,0x7a,0x06,0x5a,0x19,0x5b,0xfb,0x8b,0x79,0xa5,0xc2,0x87,0xe0,0x9b,0xd2,0x87,0xc2,0xda,0xac,0x5e,0x6b,0x01,0x16,0x4c,0x5d,0x73,0x7f,},{0x88,0xf2,0x18,0xec,0xba,0x99,0xe7,0x70,0xed,0x21,0x4a,0x8d,0x01,0xa9,0x2a,0x10,0x40,0x0a,0xca,0xf1,0xf6,0xee,0xd4,0x20,0x06,0x7e,0x13,0x6e,0xe2,0xc0,0xc6,0x70,},{0x24,0xec,0x1e,0x54,0xfc,0x7e,0x72,0x2d,0x37,0x55,0x1d,0x02,0xcf,0x13,0x5d,0x33,0xf5,0xd3,0xff,0x53,0x57,0x73,0xe0,0x29,0x91,0xee,0x85,0xff,0xd3,0xaa,0x29,0x99,0x7f,0x9c,0x46,0x44,0x70,0x19,0x7f,0xee,0x81,0xdc,0xe1,0x10,0x60,0x9f,0x87,0x0b,0x27,0xc1,0x8d,0xfb,0xcf,0xd9,0x32,0x05,0x48,0x52,0x5e,0x93,0x14,0x8e,0x22,0x05,},\"\\x88\\x16\\xb1\\xeb\\x20\\x6d\\x5f\\x6d\\xcc\\x2e\\x4c\\xc3\\x91\\xd2\\x32\\x09\\x00\\x6d\\xe9\\x35\\xe3\\x18\\x15\\x2e\\x93\\xfc\\x8c\\x2c\\xf0\\x8e\\x26\\x43\\x2b\\xad\\x9a\\xdb\\x32\\x03\\xd8\\x98\\xdf\\x0a\\x2e\\x7f\\x1f\\x83\\xdc\\x2f\\x3e\\xd3\\x20\\x5b\\xec\\x8e\\xfc\\xfd\\x31\\xad\\xc1\\xac\\xa5\\x75\\x5d\\xb9\\xbd\\x4e\\xfe\\x54\\xcc\\x17\\x07\\x30\\x77\\xde\\x4a\\x3f\\xdd\\x11\\x99\\x6e\\x84\\xb6\\xa0\\x52\\xf0\\x34\\xb4\\x10\\x99\\x22\\x6c\\x9c\\x27\\x2e\\xae\\x12\\x52\\x8f\\x16\\x58\\x1b\\x91\\xb8\\x12\\x85\\x0c\\x20\\x71\\x44\\xdb\\xff\\x3e\\x85\\x0c\\xca\\x84\\x8e\\xc2\\xb1\\xdd\\x16\\x47\\x44\\xd7\\xb5\\x93\\x37\\xd7\\xe3\\xef\\xef\\x00\\x81\\x62\\xe6\\x80\\xbd\\x4a\\x08\\x99\\xce\\xd6\\x0b\\x17\\x1f\\x8c\\xbe\\xb4\\x8c\\x51\\x58\\xdf\\x6c\\xbf\\xdb\\x26\\x24\\x08\\x81\\xbd\\x58\\xeb\\xb8\\xb6\\xa0\\x79\\x58\\x72\\x79\\x67\\x9c\\xb5\\xad\\x82\\xf3\\x71\\xb5\\x3c\\x80\\x13\\x80\\x4c\\x35\\x59\\x6c\\x88\\x7e\\x43\\x6d\\x23\\x92\\x6f\\x99\\x4e\\x09\\xd9\\x8f\\xbb\\x8c\\xe2\\x70\\x41\\x74\\xef\\x38\\xb6\\x82\\x62\\xa7\\xf1\\xa7\\x12\\xda\\x0e\\xf0\\xde\\xc6\\x39\\x60\\x68\\x14\\xb3\\xbd\\xca\\xf2\\x53\\xff\\x31\\xc4\\x8e\\x8a\\x75\\x2c\\x11\\x1b\\xd7\\x10\\x10\\x31\\xcc\\x3d\\x38\\xef\\xb0\\xc9\\xc7\\xf1\\x9c\\x59\\x08\\x15\\x84\\xa0\\xe0\\x15\\xee\\x7c\\x75\\xb1\\x0a\\x4c\\x51\\xff\\x54\\x3a\\x30\\xe5\\x2d\\x5f\\x94\\xd8\\x18\\x8c\\x6b\\x08\\xe9\\xdf\\x1e\\x84\\xa4\\xe2\\xc8\\x07\\x17\\x0a\\xc1\\x24\\xa7\\x71\\xb9\\x94\\x65\\xa0\\xd3\\x8b\\x1f\\x1c\\x63\\x30\\x40\\x3c\\x82\\x54\\x35\\x82\\xc5\\xbb\\x61\\xb2\\x20\\xde\\x1b\\x9e\\x0e\\xf6\\x9b\\xda\\xe2\\x60\\x23\\x18\\x1b\\xa4\\xcc\\x07\\x7a\\x5f\\x0d\\x42\\x57\\x32\\xac\\xe1\\x32\\xae\\x0c\\x6f\\xf0\\xbb\\x18\\xba\\xea\\x83\\xe8\\x87\\x7a\\xfb\\xe6\\x50\\xfe\\x0b\\xd0\\x20\\x93\\xf0\\x0a\\x7b\\x53\\x65\\x72\\x8d\\xcb\\x66\\xfb\\xb8\\x81\\xf5\\x92\\x94\\x50\\x58\\xa5\\xb3\\x50\\x66\\x5a\\xf9\\x1c\\x55\\x7a\\x54\\x72\\x50\\xad\\x29\\x5e\\x68\\xb4\\xfb\\x72\\x45\\x7c\\xfb\\x9d\\x5e\\xa1\\xa7\\xb2\\xa3\\x9c\\x9a\\xb7\\xd7\\xac\\xe0\\xaf\\x5d\\x51\\x66\\x9c\\xb6\\xc2\\xc4\\xc0\\x7b\\x22\\x56\\xd1\\x0e\\x5f\\xfc\\x6b\\x97\\xc6\\x60\\x00\\x63\\x13\\xc4\\xeb\\x8d\"},\n{{0xcb,0xb5,0x87,0x51,0x4e,0x0a,0x34,0xff,0xc3,0x4c,0xbc,0x04,0xf2,0x8c,0x9b,0x4f,0x64,0x65,0xf1,0xeb,0x22,0x5c,0xca,0x19,0xb8,0x64,0x87,0x6d,0xae,0xf3,0x7d,0x7f,},{0x6b,0x70,0x5d,0x46,0x77,0xd2,0xd8,0x49,0xb6,0x74,0x4b,0x1e,0xbe,0xd1,0x67,0xdb,0xcb,0xf6,0x45,0x92,0x4b,0x1f,0xf2,0xe6,0x36,0x07,0x94,0xbd,0xd0,0xe0,0x97,0x88,},{0x12,0x74,0xd6,0xf3,0x56,0xeb,0x64,0x14,0x72,0xb6,0xb9,0xe5,0xb3,0xce,0x65,0xd2,0x65,0x4e,0x6c,0xb8,0x7d,0x3a,0x83,0xfb,0x49,0xd0,0xf7,0xda,0x9c,0x44,0xbe,0x2b,0x53,0x26,0x04,0x46,0x5f,0x60,0x89,0xd6,0x80,0xd2,0xd9,0x4b,0x0e,0xdd,0x2b,0x6b,0x2b,0x80,0x5c,0x5e,0x84,0xc3,0x79,0xef,0xc0,0x59,0x67,0x3d,0x31,0x00,0x7a,0x09,},\"\\xbd\\xf7\\xd1\\x7c\\x70\\x67\\x96\\xef\\xd3\\x48\\x95\\x59\\xb5\\x27\\xb1\\xc0\\x58\\x4b\\x90\\x22\\xc9\\xcb\\xda\\x3a\\xac\\x51\\x46\\xda\\x34\\x0d\\x9c\\xea\\x69\\xf9\\x16\\x03\\x7c\\xd2\\x1b\\x3e\\xb1\\x10\\x43\\x48\\x88\\x0f\\xd5\\xc5\\xb7\\xc6\\x5f\\xf8\\x20\\xf7\\x49\\x93\\x46\\x01\\x69\\x51\\xcb\\x71\\x5d\\x8d\\xf2\\xb4\\x1c\\x88\\xcd\\x3c\\x66\\x10\\x54\\x58\\xb7\\xb5\\x90\\xc2\\x1c\\x1a\\xe2\\xf6\\xea\\x9d\\xde\\xa7\\x47\\x0f\\x25\\xe0\\x20\\x27\\xd1\\x71\\xe0\\xe5\\x74\\xa2\\xbb\\x21\\x64\\x2f\\x8f\\x9d\\xa5\\x08\\xe2\\x1d\\x8e\\x73\\x35\\xb5\\xac\\xe5\\x93\\x52\\x99\\x40\\x7b\\xd1\\xb0\\x1b\\xdd\\x14\\x23\\x13\\x3e\\xf0\\x45\\x23\\x4e\\x70\\x1f\\x55\\x54\\x94\\x34\\xad\\xe9\\x4a\\x60\\xbe\\x1e\\x14\\x06\\xca\\x5c\\x75\\x8c\\x36\\x79\\x9c\\xe1\\x70\\x30\\x84\\x47\\x6e\\x48\\x4f\\xb1\\x74\\x05\\x30\\xae\\xe8\\x42\\x66\\xd0\\x7a\\xdf\\xb4\\xcc\\x68\\x9f\\x32\\x65\\x13\\x3a\\x59\\xcd\\xf9\\x92\\xfb\\xb9\\xa4\\xb1\\x2d\\xef\\xbe\\x24\\x1d\\xdb\\xf6\\x5d\\x12\\xb2\\xfb\\xdd\\xfc\\x05\\xaf\\x0f\\xb8\\xde\\x42\\x08\\x07\\x75\\xba\\xd2\\x9c\\x6b\\x04\\x59\\x84\\x1c\\xbb\\x64\\x8a\\x9a\\x95\\xe4\\x8d\\x6e\\x36\\xac\\x51\\x44\\x80\\xa3\\xde\\xb4\\xb3\\x65\\x54\\xd8\\xda\\x62\\x08\\x08\\xae\\x9d\\x47\\x32\\x97\\x10\\xd2\\x0a\\xaa\\x6e\\x5d\\x7f\\x54\\x7d\\x81\\xad\\x30\\xf8\\x4c\\x0e\\x3d\\x23\\x9c\\xde\\x5b\\x16\\x9d\\x9d\\xdf\\x29\\x48\\x32\\xd6\\x7a\\x80\\x60\\xba\\x32\\x9c\\x4e\\xf3\\x9b\\xe9\\x4a\\xc4\\x64\\x34\\xdd\\x21\\x85\\x93\\x1d\\x12\\x31\\xf9\\xb6\\xdf\\x87\\x8a\\x5a\\xf0\\x83\\x1e\\x0e\\x9d\\x8a\\x08\\xd0\\x80\\x69\\xde\\xd6\\xa9\\x61\\xef\\x7f\\x39\\xfa\\xd5\\x01\\xff\\xd1\\x7d\\x6d\\x9b\\x7c\\x65\\x46\\x53\\xc1\\xf5\\x8f\\xce\\xe1\\xa6\\xcd\\x80\\x3d\\x2a\\xef\\x16\\x6c\\x78\\xef\\x55\\x14\\xa3\\x27\\x6d\\x69\\x98\\xdc\\x7c\\x09\\xa3\\xfa\\x98\\x2e\\x42\\x7c\\x78\\x5a\\xa6\\xa9\\xe2\\x56\\xf7\\xba\\x72\\xd5\\xa6\\xba\\x33\\xeb\\x46\\xf1\\xf9\\xfe\\x9b\\xe2\\xbf\\xc1\\x41\\x09\\xf6\\x47\\x73\\xc0\\x0c\\x06\\x3b\\x4d\\x5c\\xb4\\xf4\\xf8\\xa0\\xbe\\xca\\x92\\xa9\\xa0\\x16\\xc4\\xf5\\x40\\xfe\\xea\\x9c\\x3a\\x31\\xe3\\x13\\xbb\\xcb\\xc2\\xff\\x5e\\xca\\x99\\x67\\x85\\x7f\\x5f\\x8a\\x90\\x9a\\x29\\xd7\\xf2\\x0d\"},\n{{0x8b,0xde,0x3f,0xf6,0x1a,0x16,0x99,0x5a,0xb9,0xd5,0x39,0xf6,0x05,0x32,0x19,0x08,0x1b,0xca,0xea,0x1d,0x45,0x8e,0xc3,0x36,0x84,0xfc,0x1c,0x01,0xfb,0x56,0x5b,0xfa,},{0xcd,0x9d,0x78,0x2a,0x35,0x6e,0x84,0x7b,0x7a,0x04,0xc8,0x85,0xa9,0xb0,0x90,0x7c,0xc3,0x3b,0xa9,0x7a,0xd5,0x39,0x0d,0x4e,0xa5,0xfe,0xe5,0xeb,0x19,0x8d,0x08,0xb3,},{0x74,0x64,0xdf,0x0b,0x67,0xeb,0x90,0xb4,0xb7,0x3f,0xf0,0x82,0xad,0x0d,0x60,0xeb,0xfe,0x06,0x60,0xda,0xe9,0x70,0x69,0xb5,0x2c,0x37,0x27,0x22,0x3b,0xf7,0x0e,0x29,0xe4,0x87,0x11,0xa2,0xbb,0xb4,0x38,0xf5,0xf8,0xd8,0xa3,0x3b,0xb9,0xc4,0x8f,0xe7,0xb6,0x28,0xfa,0x8a,0x54,0x2f,0xf0,0xb5,0xae,0x36,0x26,0x9d,0x40,0x07,0xa5,0x05,},\"\\xa1\\xf4\\x0e\\xc5\\x80\\x7e\\x7a\\x27\\x06\\x9a\\x43\\xb1\\xae\\xbf\\xf5\\x83\\xef\\x03\\x70\\x28\\xc0\\x2c\\x85\\x95\\x25\\xeb\\x8f\\xa4\\xc3\\xba\\x95\\xa9\\x01\\xff\\x3a\\xed\\x78\\xc4\\xf8\\x77\\x52\\xfb\\x79\\x55\\x22\\xf5\\xbf\\x71\\x5b\\xe7\\xe3\\xde\\xfa\\xc1\\x0f\\xcf\\x17\\xe3\\xfa\\x5c\\x54\\xb2\\x00\\x89\\xa4\\x72\\x33\\x33\\x27\\x25\\x2e\\xc9\\x45\\x71\\x8f\\xb4\\x55\\xe3\\xf2\\x7c\\xcf\\xde\\xf8\\x23\\xd1\\x2d\\x40\\x6e\\x62\\xa4\\xae\\xba\\x3c\\xb9\\xd1\\xc6\\x1b\\x2b\\x17\\xe4\\x9e\\x20\\x0a\\x84\\x18\\xf9\\x35\\xf2\\x6e\\xeb\\x57\\x60\\x2c\\x7a\\xa3\\xb3\\xa2\\x4f\\x7e\\x62\\x38\\xd3\\xe0\\x8d\\x2d\\x60\\x9f\\x2e\\xad\\xa0\\x33\\x2b\\xc8\\xcb\\x12\\x91\\x6c\\xb0\\x3b\\x0d\\x4f\\x9c\\xd6\\x02\\x00\\x25\\x86\\xd3\\xe4\\xcc\\x7e\\x0e\\x03\\x81\\xc0\\x45\\xad\\x2e\\x1e\\xe2\\x82\\x98\\xae\\x7f\\xcf\\x0c\\x10\\xf2\\x12\\x80\\x85\\x65\\x29\\x6f\\x15\\x8d\\x2c\\x32\\xe8\\xcb\\x28\\x15\\x65\\x81\\xaf\\x52\\xbf\\xc3\\x47\\x0c\\x3c\\x95\\x82\\x13\\x8d\\x22\\x55\\xe8\\x42\\x6d\\x64\\x8c\\xa2\\x37\\xd7\\xaa\\xd2\\x85\\x6f\\x17\\x16\\x38\\x55\\x82\\x41\\xd8\\xae\\x3f\\x62\\xba\\x92\\xdb\\x59\\x65\\x68\\xed\\xee\\x3e\\xc0\\xef\\x37\\x0f\\x83\\x62\\x6a\\xa0\\x44\\x5a\\xf0\\x8f\\x96\\x78\\x63\\x66\\x0e\\x8f\\xba\\x5a\\x41\\xc8\\xe8\\xed\\xe1\\xc9\\x60\\x51\\x4a\\x14\\x68\\x7a\\x4a\\x81\\xe7\\x76\\xae\\x0e\\x8e\\x77\\x7f\\xb0\\xf2\\x50\\xd5\\x1a\\x83\\xb5\\x5f\\x8c\\x1f\\xfd\\xd7\\x8d\\xf3\\xbd\\xc9\\x7f\\xf1\\x77\\xaf\\xec\\xa0\\x46\\xc7\\x2d\\x72\\xaf\\x92\\x4a\\xd0\\xd0\\xab\\x2b\\xfc\\x11\\xb7\\xf4\\xab\\xde\\xd5\\x1c\\x39\\x87\\xa8\\xbb\\x94\\xd6\\x40\\xc8\\x71\\x0e\\x5f\\xc9\\xa4\\x19\\x0e\\x8a\\x00\\x83\\x63\\xd7\\x41\\x9c\\xea\\x17\\xc4\\x0d\\xea\\x20\\xea\\x51\\x56\\x02\\x9f\\x3d\\xeb\\xf0\\x52\\x41\\x91\\x8f\\x54\\xaf\\x50\\x39\\xe2\\xc4\\xcf\\x2c\\xa2\\xe1\\x39\\xf6\\x0e\\x45\\xcc\\x65\\x59\\x5c\\xdf\\x54\\xa6\\x7d\\x92\\xb6\\xac\\x66\\xfc\\x0c\\x5a\\x29\\x04\\x95\\xca\\x57\\xb0\\x7e\\xf5\\x75\\x0d\\x05\\xf5\\x7d\\x87\\xd0\\xc2\\x28\\xf7\\xe4\\xe1\\x5a\\xd0\\xba\\x01\\x78\\x73\\x0f\\x95\\x1c\\x69\\x75\\x83\\x48\\x1c\\x66\\xcb\\xfc\\xd4\\x80\\x32\\x54\\x4a\\xa8\\xd5\\x09\\x08\\x30\\x4b\\xd8\\x19\\x40\\x30\\x87\\x06\"},\n{{0xda,0x59,0xbb,0xc5,0x23,0x40,0x4f,0x07,0x64,0x6a,0xdd,0x79,0x08,0x29,0x49,0x77,0xe4,0x66,0x45,0xbc,0x8a,0x38,0xba,0xd2,0x80,0x96,0x41,0xa2,0x3d,0xe3,0xb1,0x5a,},{0xb2,0x2c,0x0f,0x21,0xaa,0x1c,0x2d,0x45,0xf4,0xb2,0xe5,0x6c,0xc9,0xb5,0xe0,0x2f,0x9e,0x31,0xa2,0xea,0xa3,0x67,0xec,0xb4,0x82,0xf8,0x74,0xcb,0xd8,0xe9,0xfe,0x34,},{0x14,0x72,0x45,0x9c,0xbb,0xae,0x2c,0xf2,0x1c,0xe4,0x4a,0x15,0xba,0xe9,0xfc,0x85,0xdc,0xa4,0x0b,0x81,0x82,0xda,0x7d,0x52,0xcb,0xf5,0x6e,0xd5,0x38,0xd1,0x8e,0x03,0x47,0x7c,0x14,0x0a,0x3d,0xdd,0x0e,0xfb,0xa4,0x3c,0x96,0xaa,0x92,0xf5,0xf9,0xbc,0xdf,0x34,0x81,0x28,0x6c,0xe7,0x62,0xa7,0xe2,0xbd,0x1e,0x77,0x9b,0xa9,0x9b,0x0d,},\"\\x09\\x71\\x06\\xc3\\x62\\x4d\\x77\\x4d\\xde\\x25\\x51\\xe0\\xc2\\x7e\\x19\\x50\\x4e\\x65\\x18\\xcc\\x86\\x36\\x9a\\xb2\\x6f\\xf8\\x10\\x96\\x9e\\x7d\\xe2\\x4a\\xbc\\x68\\xb4\\xb5\\x3f\\x11\\xd9\\x45\\xd4\\x9e\\xf0\\x78\\xeb\\x4f\\x6b\\xa6\\xbf\\x25\\x7f\\xf7\\xb6\\x08\\xaf\\xdc\\xb3\\x0a\\x5c\\x59\\xa7\\x56\\xfd\\x77\\xa6\\xc1\\x24\\x7f\\x6f\\x2a\\x41\\x10\\x0d\\x99\\xfc\\x52\\x06\\xaf\\x3b\\xcc\\x6d\\xe1\\xd3\\xe4\\x96\\x8e\\x28\\xfb\\xa0\\x12\\x3f\\x60\\x45\\xa1\\xb5\\x4d\\x69\\x3a\\x42\\xbd\\xfa\\x07\\x1b\\x2b\\x91\\x4b\\x3c\\x3c\\x0c\\x29\\xb2\\x59\\x3d\\x07\\xe8\\xbd\\xc8\\x6c\\xa4\\x2a\\xc5\\x55\\xb7\\xdc\\xd9\\x43\\x9d\\xf9\\xfb\\xd4\\xbb\\xec\\x73\\x0d\\x63\\x27\\xbf\\xae\\x4f\\xc4\\x1e\\xd4\\x98\\xb4\\xf0\\x4a\\x0e\\xb1\\x4c\\xee\\x60\\x82\\x83\\xaa\\xa6\\xe6\\xaa\\x46\\x67\\x6b\\xc8\\x8a\\xed\\x5d\\x99\\x39\\x03\\x7a\\xad\\x49\\x15\\x66\\x1a\\xf9\\x4b\\xb5\\xf6\\xe6\\x53\\xa2\\xca\\xc1\\x23\\x28\\x70\\x73\\x27\\x0e\\x0b\\x13\\xfd\\xa1\\xdd\\x48\\x71\\xaf\\x6a\\x92\\xf9\\x92\\xf5\\x39\\xdf\\x88\\x17\\x12\\xfe\\xfb\\x03\\x85\\x40\\xd4\\x11\\x91\\x12\\x3b\\x6b\\x3b\\x4b\\x6f\\xf8\\x7f\\xfc\\x92\\x9a\\x6b\\xe5\\x3c\\x6c\\xef\\x02\\xf4\\x8f\\x2f\\x0c\\xf2\\xfe\\x64\\xa4\\x5f\\xd6\\x60\\x25\\xcc\\x2d\\x7e\\xe5\\x5e\\xbe\\x23\\x16\\xc0\\x00\\x85\\x56\\x61\\x16\\x5e\\x2a\\x5b\\xa4\\x1a\\xfc\\x20\\x97\\x95\\x7b\\x6f\\xe4\\xc5\\x52\\x21\\x20\\x4b\\x6f\\xc1\\xf3\\x17\\xdd\\x3b\\xa1\\x3c\\xac\\x39\\x92\\x40\\x26\\xbd\\xb6\\x6b\\xe4\\x54\\x22\\x68\\x87\\x56\\x31\\xd2\\x77\\xf2\\x10\\x10\\x7a\\x33\\x76\\x7f\\x6d\\x95\\x96\\xe2\\x57\\x42\\xd7\\xa9\\x0e\\xa7\\x91\\xea\\x4b\\xc9\\xee\\x84\\xa6\\x7f\\xd3\\x28\\xb8\\x0f\\x79\\x1e\\xde\\x96\\xd8\\x96\\x63\\xe9\\x37\\xf0\\xb7\\x55\\xba\\xa9\\xd5\\x2b\\xda\\x21\\x0c\\xee\\x1d\\xb3\\x39\\xff\\x1d\\x3c\\x4b\\x00\\x0b\\x65\\x3b\\x9b\\xde\\x33\\x80\\x49\\xaf\\x84\\x36\\x4e\\x21\\x77\\xf8\\x0d\\xd5\\x1e\\x2a\\x16\\x72\\xee\\x55\\x5d\\x63\\x17\\x58\\x9f\\x6f\\x1d\\x5a\\xbe\\x6c\\x28\\x77\\x35\\x8b\\xf9\\x4b\\x0b\\x80\\x8f\\xf8\\x57\\x36\\x3f\\xbf\\xbe\\x32\\xe9\\x73\\x37\\xe4\\xb8\\xa8\\xc2\\x21\\xa9\\xe7\\x59\\x62\\xa8\\xdc\\x9b\\x5a\\x3d\\x7c\\xa5\\xf9\\xc9\\xb6\\x1c\\x73\\xc1\\x46\\x9a\\x72\\xbd\"},\n{{0x40,0xea,0x82,0xda,0x41,0xfd,0x15,0xb0,0x6f,0xfe,0xb9,0x9c,0xd6,0x16,0xdc,0x6b,0xc8,0xc1,0xb2,0x14,0x77,0xea,0x23,0x94,0x66,0x08,0x8e,0x28,0x49,0xbf,0x10,0x16,},{0x59,0x10,0xe5,0x80,0xbf,0x41,0x2c,0x31,0xa8,0x74,0x51,0xd9,0xdd,0xf3,0x2b,0x3a,0xb7,0x13,0xf9,0xe4,0xa2,0x2c,0x59,0x0c,0x64,0x1c,0x14,0xa5,0xdf,0xbb,0xe0,0xd7,},{0xd2,0x98,0xfc,0xc9,0xa8,0xec,0xb7,0x6a,0x98,0xd4,0xa7,0x1d,0xfb,0x01,0xd2,0x76,0xab,0x2d,0x96,0x70,0xa9,0x5b,0xab,0x34,0xcf,0x1d,0x83,0x64,0x51,0x6d,0x1e,0xbd,0xb2,0x39,0x03,0x46,0x02,0x15,0x30,0x71,0x25,0xaf,0xd0,0x9c,0x75,0x8e,0x98,0x1a,0x45,0x2d,0xa9,0x5c,0x0a,0xc2,0xc0,0xb9,0x58,0xc6,0x91,0x7e,0x68,0x74,0x19,0x0d,},\"\\xa0\\x6c\\x4e\\x02\\xb8\\x3a\\xb7\\xe1\\x91\\xad\\x81\\x8c\\xb8\\x18\\x7b\\x52\\xa8\\xda\\x00\\x4f\\xe8\\x38\\xdb\\x33\\x3c\\x4e\\x02\\x54\\x8d\\xb6\\xbd\\xf7\\x91\\x44\\x46\\x42\\xe5\\x7f\\xdb\\xc8\\x59\\x4e\\x59\\xd7\\x02\\x32\\x80\\xbb\\xae\\x82\\x98\\x6f\\x39\\x98\\x05\\x43\\x4b\\xb0\\x72\\xc8\\xa2\\x7a\\x2d\\xcd\\x5a\\xa6\\x2f\\x06\\x5b\\xc5\\x8b\\x06\\x21\\xfc\\xd3\\x65\\xf6\\xcd\\xbf\\x4d\\x57\\xd5\\x77\\xd9\\x11\\x50\\x30\\x1f\\xa4\\x8f\\x18\\x2f\\x87\\xe8\\xdc\\xa7\\xce\\x45\\xa7\\xd6\\x48\\x45\\xff\\x43\\x4d\\x1b\\xab\\x05\\x34\\xcc\\xc8\\x3a\\xa0\\x97\\x4e\\x88\\xb3\\x8f\\xc2\\x50\\x8c\\xef\\xcb\\xbc\\x82\\x13\\x5b\\x73\\xb3\\x84\\xc8\\x0e\\xcc\\xb8\\xa0\\x9e\\x28\\x73\\xcc\\x07\\x12\\x90\\x21\\xd8\\x1c\\xe1\\x29\\xa9\\xdf\\x65\\xe6\\x13\\x41\\x0a\\xf9\\x50\\x19\\x7d\\xbf\\x9a\\xfc\\x28\\xed\\xc4\\xe6\\x5c\\x3e\\x84\\xda\\x40\\xd2\\xef\\x84\\x1b\\x88\\x6b\\xc4\\x47\\x19\\xa5\\xd5\\x9d\\xb2\\xc6\\xdc\\x77\\x64\\x01\\xc8\\x95\\xe2\\xb3\\xc8\\x37\\x83\\xd7\\x81\\x7b\\xba\\x68\\xba\\xff\\x59\\x47\\x0d\\x60\\x15\\xbb\\xa8\\xd9\\x75\\xf0\\xeb\\x71\\x2f\\x3b\\x89\\x02\\x91\\x28\\x05\\x52\\x3a\\xa7\\x1c\\x90\\x49\\x9d\\xe6\\x89\\xd3\\x1a\\xe4\\x4e\\x21\\x0b\\x84\\x46\\xf2\\x48\\x47\\x27\\xcc\\x49\\x1b\\x92\\xa8\\xe8\\xb1\\x99\\xd6\\x28\\xe1\\xdf\\x79\\xa2\\x8c\\x56\\x1e\\x5a\\x7d\\x88\\x2e\\x30\\x78\\x7d\\x08\\xfb\\x2d\\x51\\x96\\xba\\x61\\x19\\x63\\x09\\xb3\\xbf\\x0c\\x58\\x24\\xa3\\x54\\x8c\\x70\\x00\\x03\\xfe\\x99\\x13\\xbe\\xfe\\x12\\x22\\x31\\x50\\x01\\x26\\x85\\xe9\\x07\\x20\\xe9\\xec\\x6b\\xc4\\xdb\\x60\\x74\\x25\\xae\\xc5\\x31\\xc4\\xfa\\x36\\x08\\x6d\\x3b\\x9b\\xe3\\x91\\xa3\\xf0\\x46\\x35\\xa8\\x07\\x7a\\x44\\x7a\\x16\\xa6\\xfd\\x89\\xaf\\xbb\\x9a\\x72\\xd0\\xd3\\x55\\xcb\\x0b\\x22\\xd5\\x62\\xf4\\x3f\\x59\\xd4\\xe3\\x71\\x28\\xb3\\xe2\\xd9\\x06\\xc8\\xae\\x23\\xd0\\xaa\\x59\\x9c\\x70\\xd3\\x77\\x8a\\x07\\x6c\\x1a\\x39\\x72\\x8f\\x1d\\x69\\x37\\xbd\\x48\\xb9\\x78\\x74\\x08\\x50\\x56\\x61\\x38\\xd3\\x48\\x52\\xb6\\x30\\x75\\xe8\\x9a\\x8e\\x22\\x80\\xed\\xba\\x6f\\x4e\\xe8\\xf6\\x15\\x11\\xe9\\xb7\\x68\\xe9\\x5c\\x78\\xd1\\x97\\xb6\\x93\\xb1\\x09\\xe8\\x88\\x18\\xb4\\x86\\xa9\\xdf\\xdb\\x74\\xb4\\xc5\\x55\\x0a\\xcd\\xfb\\xd5\"},\n{{0x28,0xbb,0x81,0xa1,0x7d,0x45,0x84,0x75,0x4d,0x52,0x81,0x8c,0xd0,0xf1,0xf2,0x1b,0xaa,0x77,0x7e,0x69,0x58,0x44,0xa1,0x51,0x22,0xac,0x05,0x34,0x4d,0xdd,0xc0,0x27,},{0xd5,0xf6,0x1d,0x51,0x99,0x44,0xd1,0x3b,0x84,0xbf,0xa7,0xcd,0x67,0xcb,0x0b,0xea,0x4e,0xf2,0x28,0x1e,0xfa,0x46,0x1f,0x22,0xad,0xe4,0xba,0x88,0x2d,0x11,0xb2,0x52,},{0x9c,0xe4,0x5a,0x07,0xdb,0xd2,0x8d,0x3f,0x6f,0x1b,0x35,0x63,0x0a,0x3f,0xd5,0x6f,0x1d,0x54,0x8f,0x84,0xff,0xb1,0xc6,0xae,0x64,0xb2,0x14,0x98,0xae,0x38,0xe5,0x96,0x91,0x6e,0x77,0xf7,0x99,0x05,0xe6,0x09,0xfb,0x1a,0xe0,0xda,0x36,0x13,0x8a,0x80,0xf2,0x42,0x12,0x21,0x67,0x06,0x80,0x92,0xcc,0x60,0x57,0x96,0xc5,0x66,0x9e,0x06,},\"\\x92\\xe8\\x4c\\x7a\\x55\\xb0\\xbe\\xa0\\x3e\\x17\\xcf\\xb6\\x5f\\x70\\x85\\xce\\x3f\\x44\\x5b\\x15\\x42\\xba\\xe9\\x97\\xde\\x5f\\x09\\x2a\\x24\\xff\\x24\\x33\\x80\\x28\\x6d\\x13\\x70\\x91\\xa5\\x98\\xf3\\x5e\\x6d\\xae\\x1a\\x1c\\x64\\x8f\\x5a\\x49\\x4c\\x81\\x9d\\xfb\\x24\\x06\\x52\\xff\\x90\\x83\\x81\\xf3\\x2d\\x70\\xbc\\x51\\x31\\x00\\xac\\xa1\\x6f\\xe7\\x22\\x02\\x95\\xb1\\xc7\\x18\\x35\\xf1\\x6d\\x93\\x10\\xa9\\xd2\\x7a\\x04\\xa9\\x80\\xac\\xe2\\x97\\xd5\\xaf\\x3f\\x7c\\xb7\\xc7\\x8b\\x24\\x99\\x7c\\xcb\\x41\\xf5\\x4e\\xcb\\xab\\x50\\x7e\\xb7\\x3e\\xa6\\xa3\\xed\\x47\\x0e\\x49\\x59\\x05\\x09\\xf5\\xd1\\xe6\\x03\\x2a\\x26\\x05\\xdb\\x87\\xf4\\xa9\\xb9\\xec\\x91\\x60\\x25\\x83\\xf1\\x4e\\x2f\\xe1\\xbd\\xb9\\x00\\xec\\xb8\\x97\\x11\\x96\\xb5\\x5c\\x0d\\x43\\x34\\x89\\xf2\\x6b\\xe9\\xca\\x15\\x7c\\xbd\\x56\\x57\\x28\\x87\\xba\\x85\\x9f\\x39\\x67\\x4a\\x8e\\x0c\\xa0\\x8f\\x2d\\xbb\\x0f\\x27\\x07\\x35\\x51\\xd0\\xb1\\x99\\x06\\x85\\x17\\x8b\\x1a\\xe9\\xe7\\x88\\x54\\x99\\x14\\x3d\\x9d\\x72\\xc8\\x57\\x1d\\x11\\xe0\\xd8\\x5b\\xf5\\x8d\\xf9\\x4e\\x2a\\x74\\xd9\\xb6\\x84\\x65\\x57\\xf9\\x12\\x5c\\xa0\\x94\\x4c\\xe5\\x71\\x8d\\x2c\\xba\\xe1\\x67\\x2b\\xa0\\x2b\\x84\\x7c\\x17\\xa6\\xf6\\xb4\\x45\\x63\\x4d\\x2f\\x01\\x75\\xa7\\x5c\\xf6\\x88\\x3c\\x62\\xe5\\xb5\\x21\\xc5\\x71\\x41\\xf2\\x18\\xb2\\xfb\\x09\\x94\\xb3\\x72\\xa7\\x16\\xc4\\xa2\\x17\\x43\\x4b\\xea\\xb7\\x57\\x40\\xb8\\xe9\\x1c\\x62\\x21\\x87\\xd0\\x3c\\x85\\xda\\x00\\x1e\\x00\\x24\\x73\\x12\\xa4\\x65\\x22\\x5f\\x5d\\x6a\\xf2\\x32\\x06\\x4a\\x42\\x7d\\x30\\x18\\x70\\x0d\\xed\\x77\\x4b\\x90\\x26\\x77\\x7a\\x52\\x75\\xfc\\x04\\x75\\x46\\x06\\xc8\\x66\\x00\\x29\\x7b\\xf7\\xb7\\x1a\\xaf\\xf8\\xb9\\xa7\\x46\\x67\\x7a\\x36\\x62\\xf3\\x75\\x0e\\x81\\xb5\\x01\\x66\\xf6\\x23\\x70\\x00\\x05\\x1f\\xfa\\x15\\x86\\x8d\\xef\\xdf\\x09\\x00\\x57\\x72\\x2a\\xe2\\x29\\x96\\x4a\\x4e\\xa0\\x85\\xe0\\xdb\\xc0\\x4c\\xe1\\x99\\x77\\x22\\xc5\\xbb\\x65\\xd2\\xb4\\x7e\\xcb\\x74\\x6f\\xd8\\x3a\\x9f\\x6a\\x69\\xc8\\x15\\x45\\xa9\\xb5\\x02\\xf5\\xe7\\x6d\\x31\\x30\\xc5\\xaf\\xcb\\x1c\\x9a\\xf9\\x9d\\x91\\x87\\x40\\x83\\x7c\\xe8\\x9d\\x7c\\xd2\\x13\\xfe\\xf2\\xfd\\x06\\x2c\\xe8\\x85\\x0f\\x69\\x65\\x9e\\x4a\\xd3\\x27\"},\n{{0x24,0xbf,0xd4,0xfc,0x45,0xd5,0x09,0x35,0x85,0x67,0x81,0x01,0xcf,0x56,0x3a,0xb8,0x01,0x1f,0xd6,0x43,0x0d,0xe1,0x55,0xf2,0xa4,0x25,0xf0,0x63,0x3e,0xe3,0xb7,0xcd,},{0x9c,0xf5,0xc5,0xfc,0x0c,0xcf,0xae,0xb2,0x8a,0x08,0xba,0x67,0x70,0x7b,0x18,0xdc,0x84,0xea,0x06,0x98,0xff,0xbd,0xbc,0x16,0x9a,0x09,0xc2,0x81,0x23,0xe6,0xc2,0xac,},{0xdc,0x93,0x5b,0x60,0xfd,0xe4,0x43,0x59,0xaf,0x8f,0x50,0xed,0x7f,0x91,0x9f,0x48,0x3c,0xe3,0xf2,0x4e,0x23,0x20,0xc5,0x5b,0xa9,0x2f,0x3e,0x76,0x17,0xc1,0x9b,0xfb,0x54,0x70,0x19,0x03,0xff,0x18,0x3b,0x42,0xcb,0xed,0xfe,0xf0,0x87,0x5f,0x42,0xb1,0x28,0x75,0xd3,0x6a,0x0a,0xee,0xc7,0x3f,0xfd,0x09,0x50,0x9d,0x92,0xb2,0x8b,0x0d,},\"\\xba\\x54\\x12\\x8f\\x45\\xbe\\x20\\x01\\xdb\\xb0\\x60\\xd5\\xdc\\xc4\\x71\\x44\\x99\\x74\\x15\\xd4\\x29\\x4f\\x6e\\xba\\x8d\\xce\\xba\\x4f\\x6c\\xf2\\x23\\x46\\x83\\xc4\\x26\\x5f\\x88\\x03\\x22\\x05\\x29\\x6e\\x9b\\x27\\xd6\\x85\\x06\\x23\\x2d\\x57\\xb6\\x88\\x40\\x76\\x48\\xf8\\x7c\\xeb\\x34\\x20\\x52\\xbd\\xe9\\xd0\\x06\\x55\\x42\\xff\\x17\\x15\\xc9\\x42\\x02\\x7e\\x67\\x48\\x2a\\xf4\\xbc\\x27\\x8f\\xf7\\x19\\x66\\xfb\\x3f\\x62\\xa2\\xa5\\x32\\x3c\\xb1\\xb4\\xba\\xe1\\xe7\\xb8\\xfe\\xdc\\xbc\\x73\\xea\\x05\\xb4\\x07\\x64\\x21\\xb0\\xb4\\xfa\\xe8\\xbc\\x33\\x37\\x41\\x6a\\x17\\xfe\\x12\\x4e\\x7e\\xe4\\x65\\xeb\\xb3\\x8d\\x87\\x92\\x30\\x64\\x29\\xd8\\x27\\x9a\\x1b\\xd5\\x4c\\x37\\xbe\\xe8\\xf9\\xc8\\x5e\\xeb\\xe3\\xaf\\xd1\\xf6\\x44\\x89\\xd4\\xe5\\x3a\\xc5\\xf5\\x06\\x57\\xbb\\x6f\\xfb\\x97\\x12\\x07\\x44\\xb7\\x5d\\x47\\xc6\\x22\\x6d\\x5a\\x9c\\x9c\\x26\\x4e\\xe3\\xe6\\xa6\\xde\\xd0\\x50\\x62\\xca\\x10\\x06\\x66\\x91\\x18\\x45\\x45\\x50\\x01\\x09\\x19\\xc2\\x63\\x3c\\xf0\\x86\\x95\\x03\\x45\\xe5\\x14\\xaf\\x38\\x43\\x14\\x8e\\x5c\\x64\\x35\\x2e\\x69\\x03\\x7d\\xfe\\x60\\xd4\\xa8\\xea\\xb3\\xeb\\x8c\\xb5\\x4b\\xd3\\x9a\\xf2\\xf3\\x53\\xd5\\xde\\xd2\\xe2\\xbc\\x8b\\x11\\xc0\\x9f\\x61\\x2e\\x12\\x8c\\x6e\\xfa\\x41\\xf6\\xeb\\x2c\\x95\\x80\\x87\\xbe\\x34\\xc6\\x33\\x5a\\x43\\x00\\x5d\\x11\\xa9\\xd3\\xb5\\xa5\\x29\\xc2\\xd1\\xb0\\x64\\x2f\\x77\\xaf\\xdd\\x8c\\x6b\\x1d\\x6f\\xb2\\xa9\\xdc\\xb6\\x5f\\x42\\xf4\\xec\\xa8\\xea\\x9a\\x05\\x40\\x58\\xbe\\x86\\x13\\x66\\x76\\x10\\xe3\\xee\\xd8\\xd1\\xdf\\x07\\x39\\xec\\xa1\\x71\\x95\\x41\\x17\\x98\\x9d\\x1b\\x12\\x18\\x9a\\xb5\\x79\\x04\\xaa\\x96\\x0b\\x0c\\xa8\\x55\\x41\\x74\\x63\\x85\\xef\\xa9\\x85\\xbe\\x9d\\x97\\xb5\\xa9\\x02\\x99\\x89\\xa9\\xc7\\x14\\x98\\xdf\\xab\\xdb\\x81\\x36\\x81\\xf5\\x7e\\x27\\x6b\\x64\\xdb\\x49\\x1b\\x8f\\x08\\x2a\\x88\\x51\\x45\\x46\\x9a\\x53\\x1b\\x7f\\x9f\\x04\\xca\\x0a\\x2c\\x2f\\x8d\\xff\\x20\\xcc\\xb9\\x9c\\x28\\x61\\xf5\\x4e\\x5e\\xaf\\xa9\\x62\\xcc\\x53\\xea\\xf1\\x8d\\x3d\\x5e\\x50\\xd3\\x37\\xaf\\x48\\x5f\\x19\\x97\\x5f\\x05\\x93\\x07\\x00\\xa8\\xa7\\x25\\x3f\\x11\\xf1\\x84\\x13\\x0d\\x0a\\xee\\x70\\x96\\x9d\\x96\\xfe\\x08\\xf2\\x16\\x95\\x1d\\x9d\\xce\\xd5\\x23\\x88\"},\n{{0x2f,0xc2,0xf9,0xb2,0x05,0x0a,0xd7,0xd1,0x39,0x27,0x3e,0x93,0xe2,0xa0,0x45,0x1c,0x7b,0x5c,0xce,0x57,0x59,0x9a,0xa6,0xb0,0x8d,0x3e,0xdc,0x5b,0xb0,0x75,0x90,0xc8,},{0xff,0xe5,0xa1,0x78,0x80,0xd7,0x18,0xcc,0x79,0x88,0xc2,0xfd,0x98,0x25,0xb0,0x3b,0x93,0x45,0x0a,0xc1,0xde,0xb8,0xfb,0xd1,0xf1,0xbf,0x3b,0x8f,0x87,0x80,0x59,0x54,},{0x7a,0xff,0x16,0x2a,0x3c,0x0d,0x28,0xdf,0xf4,0x17,0x15,0xa9,0x74,0xaf,0x07,0xec,0xac,0x21,0x32,0xfc,0x18,0xbc,0x43,0xa1,0x98,0xfe,0x66,0x46,0x59,0x05,0x0d,0xa1,0x9a,0xe2,0x27,0x58,0xd5,0x2c,0x9c,0xbb,0x94,0xf1,0x35,0x8b,0xb0,0x26,0x10,0xa8,0xa3,0x51,0xc2,0x11,0x62,0x79,0xe7,0x24,0x5a,0xdf,0x69,0x67,0x5d,0xfd,0x36,0x0a,},\"\\xdc\\x12\\x97\\x99\\x0c\\xc0\\x27\\xd5\\x6d\\x1f\\xee\\x26\\x5c\\x09\\xbc\\xf2\\x07\\xa9\\x58\\x3e\\x6b\\xab\\x8d\\x32\\x47\\x82\\x28\\xe0\\xbc\\x30\\x5b\\x98\\x18\\x15\\x4c\\x33\\x8c\\xee\\xc3\\x4b\\x04\\xc4\\xad\\xe7\\xac\\x61\\xdc\\xb0\\x9b\\xfa\\xc8\\xad\\xe0\\x0d\\x1f\\x29\\xde\\x31\\x70\\x60\\xb8\\xa4\\xda\\xf1\\x98\\x7d\\xe4\\x09\\xca\\x2c\\x3f\\xe4\\x38\\x00\\x88\\x07\\x3c\\xcf\\x48\\x5e\\x9a\\x69\\x51\\x6b\\x5b\\xbb\\x41\\x30\\xf2\\x0b\\xe6\\x9b\\x2d\\xd6\\xa9\\xb4\\x65\\x15\\x9c\\xca\\x1a\\xc8\\x8b\\x32\\x8b\\x80\\xc5\\x1b\\x66\\xaf\\x7f\\x4c\\x50\\xf6\\x22\\x87\\x72\\xf2\\x87\\x34\\x69\\x3c\\xe4\\x80\\x5a\\x41\\x63\\xdf\\xf1\\x4b\\x4d\\x03\\x98\\x11\\xee\\x3f\\xce\\x65\\x93\\x54\\x44\\xa6\\xea\\x9a\\x72\\xd7\\x8b\\x91\\x5c\\x9c\\x3b\\x76\\x6c\\x60\\xb7\\xe0\\x32\\x9e\\x43\\xc9\\xc5\\x7e\\xde\\x94\\xb9\\x15\\x25\\xce\\x5a\\x07\\x5a\\x72\\x97\\x21\\x97\\x72\\xef\\x3c\\x02\\x96\\x49\\xb5\\x86\\xa9\\x5a\\x73\\xbb\\xdf\\x16\\xd8\\xfc\\x20\\x36\\x8d\\xe4\\xba\\x44\\xde\\x10\\x64\\xbe\\x58\\x26\\xb3\\x76\\xbe\\x31\\xa8\\x6c\\xa4\\x78\\xa5\\x2e\\xfb\\x98\\xf1\\xfa\\x33\\x31\\x57\\x71\\x9b\\xd6\\xe0\\xda\\x80\\xed\\x68\\xd0\\xef\\xea\\xfe\\xe5\\xa1\\x3b\\xcc\\x3b\\x45\\x75\\x25\\x25\\x8f\\x1f\\x7e\\x03\\x1f\\x7b\\x40\\x3a\\x46\\x15\\x06\\x92\\x7b\\x1e\\x6c\\x7d\\x4a\\x0c\\x8d\\x84\\xb5\\xf3\\xdd\\x0e\\xb8\\xbd\\xb1\\x3e\\xdc\\x2b\\x51\\x4a\\x81\\xd0\\x88\\xeb\\x07\\x7a\\x52\\xc8\\xa8\\x31\\x86\\x1f\\xee\\xe8\\x11\\x0e\\x41\\xa3\\x25\\xdc\\xe2\\x06\\xb2\\xd6\\x7d\\x25\\xf9\\x0e\\xf5\\x7e\\x0f\\xde\\x70\\x9f\\x3e\\x5a\\x39\\xc0\\x4e\\xed\\x31\\xe5\\x7c\\x19\\x3b\\x28\\x3e\\x2d\\xa7\\x27\\x9e\\xe3\\xf1\\xee\\xd4\\x82\\xb3\\xbb\\xcd\\x37\\x39\\x02\\xc1\\xdf\\x81\\x1a\\xc3\\x3e\\x1d\\xe0\\x64\\x29\\xe8\\xf8\\x44\\x3f\\x60\\x20\\x19\\x65\\x0b\\xdc\\x2e\\xe8\\xd7\\xf6\\x50\\x03\\x6a\\x7a\\x22\\xb8\\xfd\\x88\\x51\\x75\\x11\\x22\\x9c\\x72\\x9a\\x32\\x69\\xb3\\xa3\\xe8\\xfc\\x72\\xb0\\x1b\\x5a\\x4b\\x3e\\x33\\xf5\\x27\\x2f\\x3a\\xd2\\x16\\x29\\xd0\\x8b\\x1f\\x71\\x79\\x35\\xe9\\xe1\\x04\\xad\\xd2\\xf0\\xf2\\x03\\x34\\x32\\xbe\\xc8\\x2e\\x21\\x21\\xd9\\x8c\\x9c\\x1a\\x58\\xe0\\xda\\xba\\x25\\x53\\x6a\\x1b\\xe8\\xe5\\x08\\x83\\x47\\xf4\\xa1\\x4e\\x48\\xd8\\xe3\"},\n{{0x8a,0xfe,0x33,0xa0,0xc0,0x8a,0xa3,0x48,0x7a,0x97,0xdf,0x9f,0x01,0xf0,0x5b,0x23,0x27,0x7d,0xf0,0xbb,0x7e,0x4c,0xe3,0x95,0x22,0xae,0xc3,0xd1,0x78,0x16,0xe4,0x67,},{0xd0,0x04,0x37,0x0e,0x6e,0xdc,0x34,0xb3,0xe8,0x81,0x86,0x67,0x21,0x6f,0x5b,0x22,0x6b,0x0f,0xf7,0x5a,0x58,0x48,0x4c,0x86,0x16,0xe1,0xa8,0x66,0x44,0x4c,0xab,0x57,},{0x63,0xa8,0xae,0xac,0x02,0x5f,0x2d,0xde,0x9a,0x73,0x28,0x6e,0x56,0xc2,0xd6,0x2d,0xcb,0x79,0xa2,0x41,0xba,0x0b,0x2e,0x2d,0xba,0xca,0x87,0x52,0xed,0x2f,0xc8,0xcc,0x7a,0xb8,0xe6,0x60,0x0b,0x67,0x64,0x5f,0xb5,0xe8,0x18,0xa4,0xe8,0x2c,0x29,0x18,0x0a,0x6b,0x2c,0x3f,0x58,0xd0,0x99,0xcb,0x63,0x5c,0xe5,0x2b,0xdc,0x15,0x70,0x04,},\"\\x86\\xfb\\x74\\x1f\\x1b\\x97\\x08\\x92\\x91\\x95\\x03\\x1a\\xa1\\x64\\x5f\\xb7\\x09\\xa8\\xae\\x32\\x3f\\xff\\x85\\xe5\\x47\\x01\\x94\\x45\\x2e\\x11\\xb7\\xb1\\x27\\x91\\x94\\xb5\\xe2\\x42\\x7c\\xe2\\x3e\\x1d\\x74\\x9c\\x3d\\xdf\\x91\\x0b\\x01\\x7e\\x4f\\x2d\\xff\\x86\\xdb\\xe4\\x82\\xc9\\x1b\\xd9\\x94\\xe8\\x49\\x3f\\x2e\\x68\\x24\\xbb\\xa3\\xbc\\x7d\\x7a\\x84\\x5f\\x21\\x7a\\xe9\\x76\\x0b\\x3c\\xd0\\x02\\x26\\xd9\\xff\\x26\\x16\\xd4\\x52\\x75\\x1a\\x90\\xc3\\xd0\\xd3\\xc3\\x6d\\x4a\\xb4\\xb2\\x52\\x0f\\x67\\x28\\x81\\x71\\xbd\\x3a\\x34\\xb2\\xea\\xca\\xe8\\xd4\\x4c\\x1e\\x15\\x3d\\xda\\x1f\\x90\\xbc\\xd3\\x59\\x5d\\xad\\x37\\x71\\x3b\\x8d\\x34\\x01\\x56\\xea\\x90\\xa4\\xe1\\x35\\x95\\x1b\\xa7\\x16\\x9a\\xc1\\x75\\x57\\x8b\\x81\\xe9\\x7a\\x54\\x1a\\xb9\\xbf\\xb7\\x63\\x28\\x79\\x8d\\x7d\\x63\\x1c\\x14\\xdf\\x2a\\xd6\\x13\\xe9\\xc6\\xe1\\x14\\x7a\\x0e\\x84\\x06\\x2d\\xdb\\xa0\\x35\\x85\\x9d\\x46\\xba\\xde\\x5f\\xad\\xd9\\xb3\\x2b\\x43\\xda\\xd4\\x83\\xc6\\xb8\\x02\\x3b\\x32\\x39\\x1e\\x51\\xef\\x15\\x20\\xc6\\x8c\\x61\\x91\\x32\\x6c\\x49\\x44\\x23\\x08\\x0c\\x62\\x3d\\xc4\\xad\\x0a\\xa0\\x74\\x74\\x8d\\x82\\x6c\\x29\\x64\\x4c\\x38\\x98\\x6a\\x77\\x00\\x2f\\x0c\\xab\\x90\\x68\\xe6\\xc9\\xec\\x73\\xcc\\x2e\\x0c\\x58\\x4b\\x80\\xe0\\xbc\\x37\\x57\\x21\\xf7\\xa8\\xfc\\x35\\x31\\x7a\\x5e\\x24\\x0e\\x8c\\x66\\x09\\x2f\\xb6\\x30\\x5b\\x01\\x2c\\x70\\xe1\\x7a\\xea\\xff\\x13\\x38\\x6d\\x5e\\x28\\xd0\\x64\\x30\\xca\\x58\\x5b\\x0c\\x85\\xb2\\x74\\xe7\\xfc\\xbb\\x63\\xe3\\x42\\x3a\\x98\\x25\\x79\\xe5\\xa6\\x4a\\x02\\x62\\xc4\\x19\\x08\\xe5\\x5d\\xbe\\x43\\xda\\xc1\\xe5\\xcc\\x1b\\xb7\\x29\\x8b\\xe4\\x28\\x72\\x0a\\x12\\xe3\\xb0\\x72\\x55\\x9e\\xc2\\x67\\x5d\\x45\\x7a\\xaf\\x8f\\x13\\x25\\x2e\\x28\\xaa\\xd6\\x3c\\x15\\x13\\xf5\\xf2\\x39\\x56\\x4d\\x36\\x3c\\x85\\x05\\xff\\xa4\\xe5\\x0f\\x66\\x48\\xc1\\xcb\\x82\\xbb\\xa8\\x52\\xbf\\xf0\\xac\\xb0\\x30\\xcb\\xe7\\x3f\\x05\\x9d\\xd8\\x7b\\xbd\\x73\\x18\\xc5\\x58\\x6e\\x70\\x86\\x18\\xa4\\xf4\\xc9\\xf3\\xbe\\xc3\\xf4\\xf0\\x7c\\x60\\x9e\\xeb\\xb2\\x4b\\xa8\\x78\\xc6\\xbf\\x1e\\x4f\\x2d\\x0f\\xd1\\x45\\x0a\\xb9\\x4e\\x31\\x75\\x52\\x17\\x78\\x6f\\xb1\\x51\\x82\\x76\\x0f\\xfb\\xe5\\xa2\\x67\\xcb\\xe9\\x98\\xa4\\xff\\x90\\xa2\"},\n{{0x6d,0xc7,0xcc,0xf3,0x29,0x37,0x8e,0x81,0x31,0xb6,0xde,0xfc,0xd8,0x93,0x70,0x30,0x10,0x68,0x94,0x63,0x36,0xb0,0xb7,0x62,0xac,0x5e,0xa5,0x14,0x87,0xdb,0xd3,0x9e,},{0x04,0xe9,0x0d,0x27,0x5e,0x79,0xdf,0x5f,0x2b,0x6e,0xf4,0xa3,0x15,0x05,0xaa,0xc0,0x5a,0x69,0x45,0x9b,0xaf,0x2c,0x58,0x1b,0x3c,0xe3,0xdb,0x29,0xf0,0xf1,0xfc,0x14,},{0x04,0x50,0x9d,0xb0,0x03,0xa1,0xa6,0xed,0x3f,0xbc,0xec,0x21,0xac,0x44,0xec,0x10,0xcc,0x06,0xd7,0x9f,0x27,0x14,0x96,0x08,0x82,0x17,0x03,0x16,0x27,0x5d,0xf8,0x04,0x23,0xa1,0xc1,0xa1,0x12,0xd8,0x81,0xfc,0x24,0xd2,0x81,0x25,0x26,0x07,0x90,0x58,0xaa,0x8b,0x60,0x8b,0xfc,0x6b,0x5e,0x57,0x63,0x22,0x40,0xc6,0x36,0xd6,0xeb,0x00,},\"\\x20\\xce\\xbb\\xe9\\x84\\x01\\xac\\x89\\x34\\xc3\\xe6\\x5a\\x57\\x38\\xcb\\x0e\\xc0\\xcd\\xc7\\x5f\\xdb\\x09\\xdc\\x96\\x31\\x28\\x94\\xb1\\x87\\xc0\\xa4\\x6d\\x2c\\x38\\xf4\\x85\\x5b\\xe3\\xee\\xcc\\xdc\\xdc\\xc5\\x6d\\x92\\x6a\\x8c\\x08\\xce\\x6e\\x74\\x8e\\x2a\\x85\\x8f\\x53\\x53\\x2e\\x7e\\x5f\\xc5\\xf7\\x01\\x4c\\x8c\\x6f\\x86\\x31\\x0c\\xc2\\x6e\\xfe\\xf3\\x0a\\xe5\\x25\\xa5\\x15\\x79\\x40\\xab\\x53\\x5e\\xd8\\xe4\\x03\\x11\\x2b\\x08\\xe3\\x5e\\x2b\\xb3\\xdd\\x91\\xa9\\xae\\x8f\\x77\\x2d\\x2a\\xff\\x37\\xd8\\xc4\\x0d\\x2b\\x5c\\xc8\\x87\\xa6\\xf1\\x50\\x50\\xa0\\xf5\\xbc\\xf0\\x36\\x0c\\x3a\\x9d\\x12\\xd5\\x91\\x86\\x55\\xed\\xc3\\xc1\\x3c\\x86\\xba\\x6f\\x4a\\x2f\\xa3\\xbf\\xcd\\x40\\x5e\\xd3\\x8f\\x87\\x1c\\xf7\\xdf\\xf0\\xf7\\x5d\\xaf\\x2c\\x32\\x10\\x84\\xee\\x9f\\xa8\\x12\\x11\\xad\\xb1\\x05\\xb2\\x5c\\x22\\x88\\xf0\\xf2\\xf7\\xf9\\x3e\\xf6\\x56\\xb2\\xde\\x19\\x01\\x22\\xe7\\xa4\\xbf\\xd4\\xa1\\xbd\\x98\\x93\\xa8\\x48\\x5b\\x50\\x9f\\xf0\\xbc\\x46\\xcc\\x96\\x10\\x51\\xc1\\xdb\\x5a\\x12\\x49\\x0c\\x7e\\x74\\x19\\x22\\xcc\\xc0\\xa6\\x65\\x49\\x64\\x70\\x27\\x6f\\x69\\xc7\\xb7\\x70\\x98\\xc1\\xe6\\x70\\xaf\\x6b\\x9f\\x85\\x12\\x52\\x99\\x68\\x75\\xeb\\x80\\x35\\xa8\\x17\\xfa\\x9b\\xe0\\x7f\\x2b\\xe0\\xbb\\xb1\\x20\\x25\\xe0\\x56\\x54\\x14\\xc8\\x17\\xe9\\x42\\x1a\\xc7\\x00\\x37\\x38\\x93\\x86\\x2f\\x24\\xcb\\x16\\x5f\\x9a\\x27\\x1a\\x64\\xfd\\x23\\x05\\xc6\\x67\\x2c\\x46\\x76\\x7f\\x8f\\x07\\x5b\\xe5\\xd2\\xd4\\x07\\x9b\\xfa\\xdc\\x39\\x56\\x28\\x8b\\x02\\x15\\x60\\x53\\x11\\xb5\\xbf\\x32\\xf0\\x03\\x7b\\x7c\\x5a\\xd5\\x02\\x01\\x3e\\x82\\xae\\x34\\x19\\xd9\\xd8\\xf3\\x9c\\x54\\x5b\\x58\\x88\\xf4\\x71\\x06\\xc9\\x4d\\x5f\\xd6\\x08\\x4d\\x26\\x03\\x4a\\x99\\xf5\\xdc\\xbf\\x26\\xa8\\x4e\\xb4\\xee\\x14\\x9c\\x62\\xa0\\x41\\x0d\\x8c\\x70\\x7b\\x1a\\x9b\\x07\\x1f\\x74\\xed\\x23\\x93\\x25\\x85\\x07\\x2c\\xe6\\xcb\\xd3\\x3d\\x4d\\x54\\xee\\x91\\x79\\x16\\xf5\\xdf\\xc6\\x4d\\x26\\xa4\\x98\\x01\\x84\\x38\\xb4\\x55\\x73\\x93\\x45\\xdd\\x60\\xae\\x0f\\x47\\x50\\x62\\x59\\x15\\xcc\\x82\\x9a\\xb6\\x82\\x2d\\x6f\\x05\\xf6\\xd2\\xbd\\xa0\\xa7\\xbf\\x56\\x01\\xe9\\xa2\\xed\\x6d\\xe9\\x60\\x37\\x1d\\x17\\xe6\\xf4\\x37\\x09\\xc9\\x67\\x8c\\xa7\\x43\\xad\\xfb\\xdb\\x45\"},\n{{0xcc,0xae,0x07,0xd2,0xa0,0x21,0xfe,0x3e,0x6e,0xe2,0x38,0x36,0xa7,0x11,0xb9,0x7b,0x04,0xe0,0xa4,0x41,0xf1,0x69,0x60,0x75,0x72,0x73,0x1c,0xb0,0x8c,0x26,0x94,0x88,},{0xa3,0x22,0x65,0xe5,0x32,0x8a,0x4f,0x49,0xcf,0x06,0xb4,0x67,0xa9,0x8b,0x9f,0x9d,0x5b,0x99,0x7b,0x85,0xdf,0xb7,0x52,0x3c,0xa6,0xa0,0xa1,0xd6,0x27,0xd3,0x28,0x91,},{0x0e,0xec,0x75,0x41,0x05,0x44,0x7f,0x97,0xd4,0xa9,0xcd,0x24,0x6c,0x7e,0xed,0xe3,0xfd,0x06,0x90,0x18,0xf0,0xd0,0x1a,0x41,0xdf,0xab,0xca,0x3e,0x90,0xa7,0x41,0x83,0x5e,0xa4,0xa9,0xd6,0x82,0x34,0x22,0x67,0xb2,0x50,0xfc,0x1c,0x8c,0x54,0x7c,0x89,0x63,0x2d,0x9f,0x68,0x9a,0xf5,0x36,0xc7,0x92,0x90,0x04,0xde,0xd0,0xd9,0x6f,0x09,},\"\\xa4\\xbf\\x82\\x97\\xd0\\xdc\\x5e\\x4c\\x92\\xbd\\x00\\xad\\x5b\\x9c\\x09\\xb1\\x23\\x8b\\x50\\x3d\\x61\\x91\\x16\\xef\\x74\\x26\\x03\\x78\\x34\\x9a\\x92\\x82\\xb4\\x1f\\x3f\\x46\\x76\\xa6\\x21\\x5e\\x3c\\xe6\\xd0\\x22\\x38\\x48\\x0a\\x96\\x04\\x3b\\x29\\x42\\xb3\\xfe\\xed\\x12\\x62\\x0b\\x1f\\xa9\\x7f\\x77\\x03\\xb3\\xeb\\x68\\x3c\\x16\\x01\\xbd\\x2f\\x51\\x82\\x5c\\x45\\x0d\\xf4\\xfd\\x1f\\x33\\xb0\\xbf\\x9c\\x23\\xc0\\x32\\x23\\x78\\x9e\\x06\\xe2\\x4c\\xf1\\x36\\xd3\\xb5\\x57\\x40\\x3a\\x66\\x98\\x1f\\x4b\\x77\\x7d\\xcf\\xe8\\x90\\xd2\\xba\\x96\\xda\\x4a\\x47\\x42\\xae\\xed\\xdd\\x6a\\x61\\x1d\\x05\\xfc\\x21\\x56\\x94\\xa5\\xd8\\x9a\\x5d\\xe6\\x76\\x0b\\x1d\\x94\\x15\\x15\\x50\\x44\\xc0\\x49\\xcb\\x02\\x29\\x1a\\x15\\x14\\xfa\\xa2\\xe7\\x7d\\x2a\\xe3\\x3d\\x44\\x58\\x5b\\xda\\xc6\\x36\\x5b\\xf4\\x81\\xd9\\xc9\\x78\\x33\\x93\\x7e\\xab\\x63\\x6e\\xd6\\x57\\x42\\xa0\\xd5\\x97\\x3b\\x24\\xd5\\x40\\x89\\xb2\\xda\\xf0\\x84\\xd5\\x41\\x47\\x65\\x10\\x5e\\x4e\\xca\\x14\\xaa\\xad\\xd1\\x05\\x33\\x38\\xa8\\x47\\x05\\x05\\x23\\x2e\\x4a\\xc6\\x33\\x34\\x5c\\x5c\\xde\\xe1\\xe4\\x65\\x3d\\x1d\\x93\\x58\\x3a\\xf1\\x18\\x54\\xb1\\xd9\\xb6\\x5f\\xc2\\x02\\x81\\x83\\x8c\\x56\\xdf\\x11\\x48\\xf3\\x5c\\xcf\\x9b\\xfe\\x2f\\x3f\\x80\\xab\\x73\\xf5\\xb7\\x91\\xcb\\xed\\x2d\\x92\\x06\\x44\\xcf\\x03\\x16\\xf0\\xcb\\x5d\\x36\\x62\\xb9\\x12\\x06\\x47\\xda\\x56\\xaf\\xbe\\xb4\\x7a\\x95\\x29\\x53\\xbc\\x1a\\x37\\xde\\x85\\x7e\\x4b\\x39\\xfd\\x92\\xb6\\x32\\xb8\\x51\\x59\\xf4\\x6c\\xd0\\x5b\\x6a\\xbc\\x23\\x38\\xd4\\x63\\x2d\\x48\\xe9\\xa1\\x78\\x86\\x0d\\xe8\\xf6\\x5d\\x9b\\xc2\\x3f\\x24\\x50\\x7b\\x7c\\x56\\x29\\xe0\\xbd\\xaa\\xc0\\x67\\xc4\\x76\\xc9\\xc3\\x94\\x1d\\x86\\xf7\\x88\\x94\\x4d\\x74\\x48\\x52\\xa6\\x1d\\xa7\\x16\\xf9\\x5f\\x3b\\x04\\xf0\\x78\\x3a\\x56\\x29\\x41\\xbc\\xdd\\xa4\\x39\\x59\\x0f\\xd1\\x86\\xb2\\xa8\\xeb\\xf1\\x9a\\x5a\\x7e\\x4f\\x4a\\x3a\\xaa\\xb7\\xa8\\x7a\\x43\\x45\\x24\\xfb\\xc9\\x79\\x9c\\x99\\x31\\xeb\\x8c\\xe4\\xe3\\x4e\\x99\\xb6\\x08\\xca\\xc9\\x4a\\xb7\\xe7\\x44\\x95\\x66\\x8d\\xf1\\x36\\x18\\x5f\\x48\\x7d\\x9f\\xbc\\xb6\\x60\\x5a\\xd7\\x25\\x34\\x54\\x03\\xec\\x57\\xf3\\xf6\\xdb\\x36\\x4a\\x87\\xf3\\x8f\\xea\\x4b\\x4c\\x27\\x15\\x52\\xe9\\xf2\\xe4\\xa1\\xbe\"},\n{{0xdb,0x5d,0x5f,0x41,0xfd,0xdd,0x67,0x68,0x70,0x97,0x47,0xab,0x82,0x39,0xbb,0x4f,0x42,0xa3,0x1d,0x34,0xb4,0xfa,0x88,0x82,0x4d,0x94,0xbf,0x78,0xd3,0x14,0x92,0x64,},{0x03,0x85,0x8c,0xe6,0xb2,0xd2,0x40,0x79,0xee,0xad,0x66,0xca,0x0d,0xfe,0x77,0x2e,0xcd,0xa9,0xaf,0x4d,0x46,0xbc,0x9b,0x5e,0xdf,0xdc,0x28,0x6b,0x95,0xfe,0x97,0x16,},{0x5b,0x3d,0x0d,0xa7,0x10,0x23,0x55,0x48,0x6b,0xe4,0xd6,0x9c,0xfd,0x65,0x88,0x6c,0x9d,0x9c,0x87,0x38,0xb2,0x93,0xca,0xfb,0x23,0xb2,0x10,0x4b,0xfd,0xac,0x8d,0x7d,0x01,0x29,0x8e,0xeb,0x18,0xfd,0xe3,0xde,0xd6,0x49,0x1d,0x41,0xb4,0x19,0xcc,0x66,0x37,0x52,0xc4,0xe6,0x7d,0xbe,0x89,0x86,0x83,0x3d,0x20,0xe4,0xef,0x34,0x18,0x0b,},\"\\x67\\xee\\x03\\xde\\x45\\xc3\\xe7\\x03\\x0d\\xb5\\x24\\x6e\\xe5\\xb5\\x1b\\xf2\\x98\\xbb\\xa3\\xe4\\xd0\\x93\\x49\\x37\\xfc\\x12\\xd9\\xa6\\x29\\x60\\x4c\\x53\\xc0\\x70\\xe3\\x0d\\x61\\x19\\x99\\xa9\\xcd\\xda\\xf2\\xd9\\xac\\xda\\x6a\\x9f\\x67\\x20\\x2b\\x35\\x23\\x69\\xd4\\x82\\x60\\xee\\xbc\\xe0\\xe7\\x8e\\x4d\\x5a\\xe5\\x4f\\x67\\x75\\x21\\xf8\\x4a\\x7b\\xe0\\x01\\x7f\\xab\\x27\\x8b\\x2b\\x57\\x27\\x5e\\xfc\\x5f\\xa5\\x7c\\x61\\x71\\x86\\xfc\\x1b\\xa4\\x9e\\xdf\\xbd\\x33\\x08\\x63\\x48\\x78\\xd8\\x64\\xf2\\xda\\x15\\x83\\xca\\x8d\\x56\\xce\\x9f\\xae\\x77\\xc4\\x62\\x03\\x9a\\xbc\\x32\\xd0\\x53\\x9c\\x0a\\x60\\xb7\\xbb\\xba\\x50\\x29\\xe9\\x32\\x9d\\x27\\x56\\x83\\xd9\\xc4\\xce\\x77\\xd0\\xb9\\x08\\xad\\xe9\\x8b\\x0e\\x32\\xb4\\x42\\x0d\\x9a\\xee\\x2c\\xc1\\x0e\\x4b\\xe9\\x22\\xf9\\x57\\x25\\x82\\xdd\\x89\\x67\\x14\\x1c\\x1d\\x40\\x2e\\x21\\x5f\\x20\\xae\\xe0\\xa8\\x90\\xe2\\x36\\x8e\\x40\\x6d\\xea\\x11\\xbd\\x11\\x17\\x7f\\x2e\\x03\\x8a\\xa2\\xf1\\xa0\\xdf\\xf5\\x1a\\x12\\x8d\\x95\\x5d\\x5e\\x5f\\x8d\\x5d\\x00\\x09\\xaa\\xa8\\x24\\x40\\xa9\\x68\\x64\\xd6\\xc6\\x97\\xf9\\x10\\xd1\\xdf\\x23\\x0f\\x46\\x7f\\x0e\\x02\\xa2\\xe0\\x2b\\xf9\\xe4\\x5d\\xa9\\x5f\\x25\\x54\\x10\\xcc\\x5a\\xab\\x8d\\x85\\xf4\\x49\\xa5\\xde\\x99\\xaa\\xbd\\x44\\xfd\\x76\\x3e\\xc1\\x46\\x29\\xf3\\xdb\\xab\\x1a\\x24\\x7b\\xff\\xb7\\x17\\x46\\x48\\xe4\\x3b\\x9f\\xb1\\xeb\\x0d\\xf5\\xe4\\x10\\x9b\\x7a\\x88\\xe0\\x55\\x12\\xb2\\x08\\x65\\xba\\xd3\\x9f\\x9e\\xa7\\x9d\\x52\\xf5\\x18\\x8e\\x7c\\xa5\\x19\\x44\\x05\\xbf\\xb1\\xa0\\x97\\x27\\x61\\x7f\\x3f\\x6c\\x88\\x19\\x20\\x08\\xed\\xbc\\x0c\\x65\\x85\\xdb\\xf2\\x61\\xf1\\x49\\xdf\\xfb\\x59\\x3d\\x42\\x71\\x6e\\x5a\\x57\\x77\\xf5\\x46\\x2b\\xee\\xb1\\xe9\\xa5\\x6a\\x2c\\x76\\xe6\\xcb\\x73\\x51\\x17\\xcc\\x11\\x83\\xa3\\x8d\\x1e\\x00\\xb3\\x03\\xd1\\x74\\xaa\\x9c\\xf5\\xc7\\x31\\xb2\\xc7\\x0e\\xdd\\x79\\xcc\\x5d\\xc9\\x6f\\x40\\x18\\xf1\\xd7\\x1d\\x71\\x98\\xbb\\xb7\\xd1\\x34\\xcd\\x2f\\xf8\\xc1\\x5f\\x9a\\x04\\x28\\x0d\\xb2\\x6a\\x8f\\xa9\\x99\\x7e\\xb8\\x6b\\x13\\x3c\\x02\\x2e\\xda\\x15\\xd8\\xad\\x5e\\x77\\xcc\\x9f\\x62\\x61\\x59\\x60\\xba\\xc2\\xf9\\xbb\\xc3\\xeb\\xbd\\x19\\x8f\\x72\\xc5\\x72\\xb9\\x71\\x56\\xfa\\x7f\\xa2\\x29\\xa9\\x80\\x14\\xe1\\x70\"},\n{{0x7f,0x04,0x8d,0xfc,0xc2,0x65,0x0c,0xda,0x59,0x49,0x1d,0x4c,0xe2,0xb2,0x53,0x3a,0xec,0xc8,0x9c,0xc4,0xb3,0x36,0x88,0x51,0x94,0xb7,0xad,0x91,0x7d,0xb5,0xcd,0x14,},{0x08,0x00,0x1b,0x5d,0x40,0x95,0x8b,0xcb,0x27,0x0b,0xee,0xa9,0xba,0xba,0x33,0x87,0xe3,0xa4,0xb9,0x00,0xfc,0x42,0x27,0x56,0x57,0xc6,0xc6,0x91,0xa2,0xe2,0x64,0xf2,},{0x58,0x33,0x70,0x97,0x1d,0x24,0x65,0x2a,0xd2,0x13,0xc4,0x26,0x15,0x91,0x19,0x38,0xfa,0x9a,0xa3,0xd9,0xb7,0x19,0x69,0x40,0xe6,0xeb,0x08,0x15,0x12,0x00,0xc7,0xb6,0x72,0x9d,0x1e,0xff,0x8f,0x4f,0x09,0x04,0x07,0x4d,0xab,0x3d,0xdd,0xa6,0xaf,0x1e,0x4e,0x56,0x2b,0x7d,0x62,0x20,0xc1,0xa5,0x62,0x68,0x3b,0xea,0xb2,0x68,0xf8,0x0e,},\"\\x91\\x75\\x19\\xcd\\xb3\\x35\\x19\\x68\\x0b\\xca\\xe0\\x4f\\xaa\\x79\\x07\\x71\\xce\\x7d\\x13\\x97\\xc3\\x45\\xf1\\xb0\\x3d\\xd7\\x62\\x57\\x76\\xf3\\xf1\\x95\\x80\\x99\\x32\\x61\\x8b\\x1c\\x64\\xac\\xd9\\x3a\\xd0\\x00\\xea\\xd0\\x96\\x54\\xa3\\x3d\\x14\\xf7\\x48\\xb4\\x6b\\x67\\xaa\\xe0\\xff\\x12\\xdf\\x3c\\xc1\\x63\\x28\\x0f\\x47\\xce\\xdc\\x16\\xa8\\x57\\x90\\x34\\xe4\\x98\\x84\\x29\\x67\\x72\\xec\\xbd\\xbb\\x71\\xca\\x29\\xc1\\x66\\x23\\x35\\x33\\xc8\\xde\\x54\\x01\\x2b\\x41\\x2c\\xa1\\x3c\\xc2\\x58\\xf7\\xc5\\x46\\x5d\\x83\\x42\\x2f\\x52\\x4e\\x4c\\x05\\xf8\\x06\\x31\\x34\\x78\\x31\\x9f\\xd1\\x43\\xcf\\x50\\x88\\xe6\\x98\\x37\\x69\\x7d\\x36\\x15\\xd8\\x0a\\x7f\\xa7\\xe7\\x44\\x3f\\xca\\x65\\xe7\\x53\\xac\\x1b\\x11\\xd8\\xef\\xf3\\x47\\x66\\x36\\xae\\x02\\xd7\\xa2\\x0f\\x4b\\x23\\x88\\xda\\xd6\\x84\\x00\\x2f\\x5c\\xe9\\x57\\xca\\xdd\\xd2\\x05\\x3d\\x0e\\xd5\\x33\\x13\\x2a\\x81\\xca\\x19\\xbb\\x08\\x0b\\xd4\\x3b\\xe9\\x32\\x02\\x8c\\xb5\\xf6\\xb9\\x64\\xf0\\x08\\xb5\\xb1\\xc1\\xc5\\x99\\x3b\\xc9\\xb5\\x48\\x5b\\x22\\xbb\\xef\\x70\\x1f\\x0a\\x26\\xa3\\xe6\\x75\\xea\\x31\\x12\\x2b\\xba\\xe9\\x1d\\x86\\x4b\\x54\\xd8\\x95\\xaf\\xdc\\x79\\xca\\x58\\xd4\\xfe\\x44\\x92\\x13\\x35\\x3b\\x14\\x9f\\x31\\x43\\xb5\\x14\\x4d\\x74\\x7c\\x5b\\x46\\x97\\x47\\x9a\\xe6\\x85\\x28\\x48\\x53\\x84\\x04\\x4a\\xa2\\xc9\\x9b\\xa4\\xb1\\x7b\\x18\\x4e\\x94\\x98\\x22\\x69\\xbd\\xe2\\xde\\x0b\\x17\\x70\\x5d\\x0b\\xfc\\x46\\xd6\\x90\\x6a\\x90\\xed\\xef\\xe8\\x91\\x95\\xde\\x6b\\xb8\\xf3\\xfb\\x6a\\x37\\x41\\x86\\xc7\\xcd\\x08\\x6d\\x13\\xd1\\xb3\\x52\\x5a\\x39\\x94\\xdc\\x80\\x20\\xe1\\xa0\\x05\\x54\\xac\\x8a\\x82\\xd6\\x04\\x7c\\x5b\\xff\\x5e\\x7f\\x12\\x45\\x0f\\x48\\x65\\xda\\x16\\x1e\\x1a\\x02\\x1f\\xd9\\xbe\\x8b\\xd3\\x3a\\x32\\xbb\\x54\\xa4\\xdd\\xf8\\x74\\x51\\x2e\\x74\\xb5\\xcf\\xd3\\xfc\\x3c\\xd9\\xac\\x11\\xed\\xd8\\x78\\x43\\x36\\x68\\xe3\\xfc\\xc7\\x82\\xb9\\x7b\\x6d\\x90\\x5a\\xdb\\x0e\\xbe\\xc4\\x2c\\x92\\x54\\xac\\x90\\xf3\\x58\\x22\\xc0\\x0f\\x97\\xff\\x3f\\x0c\\x7c\\x39\\xed\\x3c\\x7c\\xb3\\x92\\x0f\\x56\\x08\\xbb\\x45\\x83\\x8b\\xb2\\x42\\xa5\\x2a\\x86\\x37\\xd7\\xce\\xcd\\xcf\\x48\\x9f\\xa1\\x83\\xb4\\x54\\x51\\xc6\\xc9\\xfc\\xbb\\xbf\\x91\\x4f\\x5f\\x7e\\x6b\\x22\\x3b\\xcb\\x46\\x75\"},\n{{0x9f,0xeb,0x3d,0xf8,0x8c,0x49,0x4a,0x99,0x84,0x9c,0x6f,0xca,0x19,0x42,0x01,0x47,0x7a,0x2f,0xa7,0x56,0x4e,0x29,0xfb,0x06,0xcb,0x44,0xc1,0x15,0x4e,0x8c,0xea,0x3a,},{0xc3,0x56,0x28,0xca,0x6e,0xe2,0x8e,0xc1,0xc2,0x39,0xdd,0xc5,0xbb,0xa2,0xa9,0xe0,0x9e,0x48,0x46,0x81,0x6b,0x14,0x3c,0x74,0xdf,0xa2,0xae,0xc1,0xf6,0x25,0x51,0xb6,},{0xa1,0xc2,0x60,0x78,0x35,0xbe,0xc1,0xa1,0xd8,0x78,0x72,0xfd,0x8e,0xe4,0x88,0xd0,0xae,0x9e,0xd2,0x3d,0x49,0xfd,0x67,0x86,0xfc,0x49,0x96,0x72,0x5e,0x49,0xb3,0x26,0x21,0x18,0xba,0xbb,0x48,0x34,0x87,0x7c,0x7f,0x78,0xfb,0xea,0xc0,0x2d,0xf4,0x0a,0xb0,0x91,0xb8,0xb4,0x20,0xdc,0x99,0x51,0x38,0x1e,0x3b,0xcd,0xa0,0x67,0x05,0x02,},\"\\x95\\xfb\\x75\\x81\\xbd\\x25\\xff\\xd4\\x42\\xc3\\xae\\x38\\xa1\\x9b\\xea\\x73\\x49\\xc7\\xb7\\x68\\x3b\\xa6\\x76\\x7e\\x14\\x8f\\x0a\\xfc\\x15\\x37\\x3f\\x67\\xc1\\x6d\\x47\\x17\\x81\\x20\\x2e\\x6d\\xa8\\x05\\x4e\\xd7\\xfb\\x9e\\xe2\\x04\\xcc\\x0f\\x63\\xc2\\x10\\xa6\\x70\\xa5\\xf9\\xce\\xd4\\x29\\x45\\x88\\x19\\x63\\x30\\xd3\\x1b\\x8e\\x83\\x92\\xbe\\xf6\\xb4\\x8f\\xe3\\xc9\\x20\\x78\\xfa\\xe1\\x12\\x84\\xb4\\xc3\\xba\\x20\\xd9\\x37\\xe2\\x71\\x9d\\xe7\\xbf\\x67\\xc0\\x06\\x69\\xad\\x23\\xe6\\x13\\x84\\xeb\\xdf\\x8c\\x6e\\x60\\x73\\x54\\x28\\xc0\\x84\\xfe\\x21\\x7f\\xdb\\x47\\x09\\xcc\\xb6\\x08\\x3f\\xc0\\xae\\x4a\\x05\\x27\\x3e\\xef\\x73\\x90\\x23\\xd3\\x4b\\xb7\\x3f\\x66\\x2d\\xac\\xdf\\x11\\x0b\\x6d\\xbd\\x3e\\x74\\xfc\\x14\\x91\\xe8\\xc9\\x65\\x96\\x07\\x5f\\xae\\x5c\\x36\\xaa\\xbe\\x2a\\x0a\\x53\\x05\\x2b\\xf7\\x7c\\x44\\x62\\x43\\x80\\x63\\xaa\\x7b\\xc0\\xc5\\x0a\\xb9\\x20\\xc9\\xeb\\x28\\x86\\x71\\x56\\x0c\\xa5\\xba\\x7a\\xf4\\x4a\\x53\\xdb\\x2e\\x2f\\xf4\\x3c\\xa5\\x60\\x69\\xea\\x55\\x17\\xcb\\x21\\x4e\\x76\\xfa\\xa5\\x3d\\xbd\\xa1\\x00\\x00\\x3c\\x4f\\x61\\x75\\x41\\x40\\x41\\xbe\\x74\\xde\\x22\\xce\\x15\\x5d\\x22\\x81\\xb6\\xf4\\x03\\x5b\\xe3\\x98\\x41\\xaf\\xdb\\x96\\xdd\\x89\\xaa\\x80\\x8e\\x68\\x65\\xba\\xe6\\x2d\\x6b\\xed\\xd9\\x19\\xd3\\xe8\\x65\\x10\\xb9\\xfa\\x5f\\xed\\xd1\\x97\\x7c\\x41\\x31\\xb2\\xb8\\x6e\\x0f\\x48\\xd7\\x21\\x5e\\xb1\\x3d\\x54\\x98\\xca\\x5d\\x23\\x68\\xf8\\x18\\x95\\xed\\x85\\x5a\\x52\\x71\\x24\\x65\\x7e\\xc9\\x53\\x9e\\xfe\\x3b\\x24\\x99\\xa3\\xb0\\xb3\\x38\\x26\\x2f\\x26\\x34\\x0e\\x22\\x55\\x4c\\x79\\xf4\\xfa\\xd2\\xb4\\xe4\\x19\\xc7\\x0b\\xc1\\xa2\\x10\\x7d\\x20\\x64\\x56\\xb6\\x36\\x87\\x81\\xbe\\x4b\\x5e\\x2c\\x54\\xda\\x42\\xd3\\x36\\x04\\x0f\\xb7\\xba\\x49\\xc3\\x2d\\x75\\x23\\x21\\xad\\xcd\\x92\\x98\\x6e\\x78\\xbe\\xdb\\x22\\x6c\\xea\\xc5\\x02\\x92\\x08\\x9b\\xb5\\x79\\x02\\x7f\\x70\\x22\\x17\\x74\\x5a\\xfe\\x06\\xa5\\xbe\\x13\\x6b\\x39\\x98\\xa3\\x60\\x4c\\x9f\\xf2\\xac\\xd6\\xfa\\x3f\\x3f\\x71\\x63\\x3d\\x31\\x02\\xfb\\xf0\\x30\\x47\\xc5\\x48\\x6f\\x84\\xc4\\xdc\\x24\\x47\\xd8\\x63\\x79\\x63\\x83\\xd5\\x5f\\x08\\xc9\\x81\\xfd\\x4d\\xd7\\xdc\\x1c\\xb7\\x2b\\x8b\\xa4\\x43\\x5a\\xf6\\xab\\xdd\\x74\\xe6\\xf6\\xe6\\x79\\x8f\\x1a\\xe2\"},\n{{0xbf,0xf6,0x89,0x55,0xdd,0x6a,0xe0,0xe8,0xba,0x85,0xab,0x0d,0x0c,0xda,0xf0,0x4a,0x9f,0x5b,0xef,0xd5,0xef,0x60,0x14,0xf4,0x99,0x94,0xa7,0x83,0x63,0xdc,0x17,0xf7,},{0x0a,0xd9,0x49,0x3a,0xf8,0x0b,0x15,0xf0,0x7a,0x52,0x1c,0xcd,0x67,0x4f,0xe9,0xe5,0x21,0x2a,0x4a,0x28,0xc1,0x7c,0x74,0xf6,0x60,0x5f,0xfe,0xf7,0x8a,0x4a,0xed,0x72,},{0x93,0x19,0xee,0xf7,0x40,0x63,0x3a,0xda,0x1a,0xf0,0xe1,0x37,0x64,0x4c,0x61,0xfb,0x3e,0x11,0xba,0x4b,0x01,0xd3,0xc6,0xf2,0x53,0x92,0xdc,0x93,0x67,0x87,0x2a,0x23,0xbe,0x56,0x31,0x0d,0x31,0x2e,0xfc,0xb9,0x1b,0xdb,0xab,0x78,0xa7,0x5e,0x57,0x6e,0xbe,0x90,0x81,0x97,0x24,0x15,0xf5,0x62,0xdb,0x41,0xba,0xf5,0xe2,0x33,0x8b,0x07,},\"\\xd8\\xf5\\x65\\x0a\\xa3\\x58\\x1c\\x4d\\x39\\xbd\\x1b\\x8a\\xfc\\x96\\xc1\\xad\\x7c\\x4b\\xf7\\x23\\x42\\x6f\\x9d\\x7f\\xab\\xd1\\xa5\\xc8\\xac\\x1d\\x2f\\xe5\\x4a\\x97\\x1f\\xac\\x76\\x5e\\x05\\xaf\\x6e\\x40\\x7d\\x72\\x69\\xba\\xb6\\x61\\xb3\\x43\\x22\\x92\\xa4\\x84\\xf9\\x52\\xc1\\x10\\x95\\xbb\\xd2\\x0a\\x15\\xd7\\x7c\\x41\\xf8\\xf3\\x73\\x1a\\x50\\x4d\\x51\\x8e\\xe1\\x0c\\xd0\\x06\\xc9\\x6e\\xe5\\x73\\x72\\xde\\x5b\\xea\\x34\\x8e\\xc8\\xba\\x15\\x91\\x62\\x17\\x0c\\x63\\xe9\\x70\\xf1\\xc7\\xa3\\x46\\x5a\\x3d\\x59\\x2e\\x1d\\x56\\xc6\\x54\\x0f\\xbd\\xb6\\x02\\x28\\xe3\\x40\\x90\\x96\\x46\\x32\\x0c\\x95\\xf2\\x56\\x98\\xcd\\x48\\x96\\xbd\\xff\\x58\\xe2\\x56\\x1e\\x3b\\x3d\\x9a\\x73\\xb8\\x97\\x47\\x91\\x2a\\x1c\\xf4\\x67\\xd6\\x3e\\x41\\x45\\x5f\\xda\\x77\\x47\\x7f\\x46\\xfe\\x69\\x37\\xbb\\x0e\\x79\\xd9\\x2c\\xcd\\x52\\xe8\\x2d\\xba\\x90\\x8a\\x05\\xa5\\x7c\\x7e\\xcf\\x49\\x55\\x4a\\xb4\\x4c\\x0b\\x71\\x8e\\x3b\\xdd\\x5f\\xc0\\xbf\\x70\\x70\\xd9\\xc5\\x8f\\x86\\x05\\x91\\xc1\\x8b\\xca\\x8b\\x3a\\x9a\\x14\\x8a\\x06\\x54\\x8e\\x0f\\x01\\x60\\x2b\\x1e\\x6f\\x68\\x60\\x37\\xc9\\x4f\\xf7\\x32\\xe1\\x55\\xd5\\x2d\\x5b\\x0b\\x44\\x70\\x3b\\x3d\\x11\\x16\\x3e\\x3f\\x56\\xe3\\xb9\\xc1\\xb8\\x64\\x76\\xe4\\xdc\\xbf\\xc5\\x3f\\xa0\\x59\\x84\\xe8\\xc7\\x5d\\xd2\\x18\\x43\\xcf\\x96\\xf9\\xe4\\x94\\xab\\xba\\xe7\\x18\\x4a\\xa4\\x27\\x36\\x63\\x3e\\x38\\x11\\xae\\xff\\x40\\x2b\\x2f\\xcb\\x7d\\x7f\\x70\\x2e\\x44\\x72\\x41\\xe2\\x2a\\x58\\x84\\x2f\\xd6\\xd0\\xc0\\x3d\\x33\\xff\\x5b\\x8c\\x79\\x22\\x00\\xe1\\x73\\xda\\xa7\\xb2\\x17\\xe4\\xb2\\xf4\\x43\\x3e\\x6c\\x02\\x0a\\xcc\\xe5\\x01\\xb9\\x32\\x3a\\xa0\\x24\\x11\\x44\\x43\\x4b\\x08\\xe9\\xd2\\x46\\x91\\x39\\xff\\x67\\x34\\x22\\x08\\x90\\x05\\x46\\x20\\x0f\\xd9\\x71\\xa6\\x5d\\xbd\\x6d\\xb6\\xc2\\x1e\\x3e\\xf9\\x17\\x2a\\xbb\\xa1\\xea\\x9e\\xa2\\xa2\\x49\\xad\\xdf\\x1a\\x1e\\xaa\\x3c\\xe1\\x19\\x38\\xb1\\x3e\\x30\\x91\\x3c\\xd0\\xda\\xd4\\x91\\xfc\\xbb\\x32\\x85\\xea\\x37\\x8b\\x8e\\xf9\\x22\\x7f\\x3f\\xa8\\x0b\\x58\\x6e\\xcf\\xea\\xe1\\x37\\x06\\x6f\\x84\\x48\\xac\\xdf\\xb7\\x8d\\x6d\\x3e\\x9e\\xf4\\xa6\\xb3\\x62\\xdf\\x42\\x41\\xad\\x9a\\xe2\\x53\\xb8\\xe1\\x59\\x7d\\x65\\x6e\\x00\\x0c\\xea\\x44\\x7a\\x02\\xfa\\x49\\x33\\x32\\x86\\x09\\xbb\\xa0\"},\n{{0x1b,0xa9,0x19,0xc0,0x66,0xbb,0x56,0xe6,0x40,0xc3,0x33,0x59,0x68,0xe1,0xd1,0xb5,0xbc,0xc0,0x93,0x38,0x3e,0x2d,0x7c,0xf8,0xb5,0xff,0xf5,0xc6,0x1e,0xc4,0x7a,0x77,},{0x80,0x4c,0x90,0xbd,0xc2,0xb3,0x61,0x8b,0x01,0xf0,0x75,0xe0,0x41,0xfa,0x97,0x1b,0x83,0xc5,0xb6,0xcf,0xa3,0xb6,0xb3,0x97,0x4f,0x3f,0xa4,0x35,0x99,0xbe,0xac,0xab,},{0x50,0x3e,0xb7,0xed,0x6d,0xe1,0xb7,0x76,0xc9,0x52,0xf2,0x55,0xbb,0xd4,0xbc,0xfb,0x0e,0x48,0xbc,0x70,0xc2,0xcc,0x2f,0x1f,0x72,0xbf,0x68,0x81,0x47,0x90,0x40,0xc4,0x75,0x24,0xec,0x54,0x2a,0xe1,0x3f,0x60,0x05,0xca,0x50,0x16,0xb5,0x8b,0x73,0x6a,0x50,0x89,0x8d,0xd0,0x56,0x9d,0x4d,0x38,0xad,0x29,0x86,0x30,0xd6,0x8a,0xdb,0x0b,},\"\\x87\\xc5\\xc7\\x5d\\x8a\\xd0\\x7d\\x52\\xac\\xd7\\x81\\xd1\\xbb\\x95\\xf7\\x8c\\x70\\xe2\\x1c\\x2d\\xd6\\x6f\\x7a\\xa4\\x42\\x34\\x15\\x2f\\x98\\x23\\x4d\\x12\\x83\\x58\\xa8\\xae\\xe9\\x8e\\xa9\\x03\\xa7\\x7b\\x44\\x1d\\xb1\\x44\\x7a\\xe6\\xff\\x34\\x32\\xdd\\xd4\\x57\\x0f\\x7f\\x58\\x03\\x61\\x22\\xc1\\xfd\\xcc\\x93\\xcb\\x21\\x57\\x37\\x39\\xc1\\x9c\\xca\\xa4\\x11\\x50\\x8e\\x08\\xde\\x26\\x06\\xf3\\xd8\\xf2\\xdb\\x89\\xdf\\x6a\\x44\\xa4\\x61\\x33\\xd5\\x70\\x18\\x46\\x26\\x27\\xe2\\x2f\\x57\\xef\\x36\\xd1\\xde\\x02\\x4d\\xe3\\xd4\\xae\\x41\\xb7\\x52\\xdf\\x48\\x21\\x15\\x59\\x34\\xb4\\x47\\xb2\\xef\\xfe\\x51\\x24\\x87\\x52\\x1b\\xe0\\x35\\x68\\x32\\xa7\\x4c\\xe0\\xe2\\xd8\\x30\\x1b\\x79\\xf9\\x31\\x75\\xe8\\xb6\\xb9\\x61\\xb1\\xdf\\x63\\x7d\\x8a\\xca\\xdc\\x88\\x45\\x43\\xc6\\x86\\x4f\\x80\\x25\\xec\\xec\\xec\\x7c\\x6e\\x4f\\xe0\\xfe\\xcf\\xc4\\x0d\\xcd\\x95\\xe8\\xd6\\xab\\x93\\xce\\x25\\x59\\x53\\x84\\x43\\x6b\\x59\\x8b\\x73\\xc7\\x4b\\x03\\xd4\\x9e\\xd5\\x00\\x2c\\x0f\\x85\\x8c\\xfd\\x9d\\x0d\\xf6\\x1e\\xde\\x93\\x7c\\xc4\\x16\\x59\\xd6\\x70\\x8b\\x96\\xfc\\x5a\\xaa\\xde\\xe1\\x09\\xe2\\xa6\\x88\\x46\\xba\\xf2\\xc2\\x46\\xdf\\xcf\\x3d\\x27\\xc2\\x8b\\xd1\\x37\\x1e\\x35\\xfc\\x94\\x12\\x63\\x14\\x42\\xee\\x75\\xf3\\x8c\\x6e\\x49\\x58\\x07\\x0a\\x74\\xf6\\xe6\\xa2\\x20\\xf7\\x5c\\x72\\x80\\xea\\xb4\\x73\\x7d\\x97\\xe3\\x78\\x82\\xf3\\x62\\x48\\x11\\x67\\x5f\\x16\\xca\\xf6\\x0c\\xb9\\x44\\xbc\\xe9\\x2e\\x75\\x88\\x4c\\x56\\x48\\x3c\\x61\\xf2\\x6b\\x63\\x71\\xb1\\xb5\\x12\\x37\\x62\\x1a\\x06\\x54\\x3e\\xb4\\xab\\xea\\x7b\\xec\\xc4\\xfc\\x31\\xdb\\xb5\\x47\\x5b\\x3d\\xeb\\x9b\\xb3\\xc8\\x99\\x23\\x87\\x10\\x48\\x30\\xc6\\x07\\x2a\\xfe\\x1a\\xf2\\x44\\xbf\\x68\\x1a\\x40\\x32\\x9c\\x9b\\x37\\x77\\x2b\\x09\\xc5\\xe8\\x8e\\x78\\xf7\\xdf\\xfb\\xc0\\x45\\x49\\xff\\xa1\\x3b\\x41\\x44\\xdd\\xfa\\x53\\x8f\\xc4\\xb3\\x30\\x05\\x40\\xad\\x83\\x02\\x15\\xe2\\x5f\\x11\\x44\\x6d\\x28\\x9f\\x33\\x12\\x2c\\x2c\\x88\\x0d\\xe3\\xda\\x71\\xc4\\x53\\xd7\\xe8\\x8f\\x7c\\xa4\\xea\\x3d\\x12\\x55\\xe8\\x2f\\x4b\\xc9\\xe5\\x53\\x3d\\xc4\\x01\\xc3\\x30\\x40\\xe1\\x69\\x40\\xb2\\xcf\\x9c\\xf2\\x1f\\xea\\xca\\x1c\\x2c\\x6c\\x33\\x33\\x7c\\xf7\\x5e\\x18\\x84\\xb4\\x83\\xbf\\x80\\x15\\x36\\xd3\\x04\\x08\\x91\\x15\\xa0\"},\n{{0x9b,0x36,0x24,0x7c,0x17,0x71,0x0e,0x95,0x26,0x1a,0x7d,0x70,0x2f,0x57,0xfe,0x81,0xf2,0x97,0x11,0x17,0xa5,0x0c,0x87,0x92,0x01,0x93,0xb3,0x86,0xd4,0x94,0xca,0x97,},{0x29,0xae,0x39,0xf2,0x73,0xe3,0x5f,0xb3,0xf6,0x11,0xda,0x09,0x16,0x00,0x65,0x0e,0xfb,0xc4,0xfc,0x4d,0x1e,0x7b,0x4c,0x76,0xac,0xed,0x5a,0x83,0xf8,0x26,0x34,0xf3,},{0x03,0x59,0x70,0xa6,0x72,0xe9,0x3f,0x87,0xeb,0x42,0xcc,0x39,0x6f,0x6e,0xa7,0xe1,0xb3,0xdd,0x5c,0x59,0x51,0x57,0x28,0x26,0xd1,0x07,0x5a,0x15,0xc2,0xd7,0xe4,0x54,0xdf,0x19,0x5b,0x51,0xaa,0xe8,0xdc,0x61,0xef,0x7a,0xb8,0x95,0x48,0x5f,0x64,0xe5,0x98,0x95,0x73,0xd9,0x8a,0x06,0x2e,0x67,0xae,0x73,0x56,0xfe,0x5c,0x9e,0x3b,0x0f,},\"\\xe8\\xd9\\xd5\\x3b\\xa2\\x7e\\x98\\xed\\xd5\\x5d\\xf3\\xc6\\xb2\\x45\\xea\\xcd\\xdc\\x8a\\x40\\xe3\\xef\\xb0\\x07\\xbc\\x91\\x8e\\xc5\\xa8\\x69\\x17\\x8a\\x17\\x0b\\xb4\\xa6\\x35\\xb7\\xf8\\xf7\\x42\\xe3\\x7a\\xd4\\x5d\\x14\\xa7\\x43\\x44\\xa6\\xb5\\x22\\x83\\x0a\\x52\\x21\\x06\\xeb\\x96\\x0d\\xaf\\x19\\x2d\\xc1\\xe0\\xfd\\x70\\xf1\\x61\\x60\\xe1\\x22\\x51\\x68\\x92\\xd0\\xe2\\xab\\xd0\\xd4\\xae\\x0f\\x0d\\x2e\\x5a\\xdc\\xc9\\x9a\\xd5\\x53\\x02\\xe2\\x51\\xb3\\xe7\\xa4\\xd0\\xcb\\x33\\x77\\x4a\\x49\\x70\\x49\\x90\\x5c\\x33\\xde\\x1f\\xbb\\xc1\\xad\\x2b\\x6c\\x64\\x52\\x95\\xfe\\x41\\x6b\\x4d\\x12\\xb2\\x32\\xef\\xe0\\xa3\\x3c\\xd2\\xad\\x87\\x32\\xeb\\xa1\\xc3\\xcb\\x0e\\xae\\xb0\\xb2\\xa5\\x7f\\xa0\\x3e\\xc5\\x67\\xca\\x29\\x21\\x0b\\xf6\\xff\\x95\\x42\\xa7\\x66\\xf4\\x96\\xfe\\x68\\x05\\x8a\\xa9\\x83\\x80\\x6c\\xbe\\x7a\\xb1\\x0a\\x47\\x92\\x0b\\xac\\x82\\x48\\x81\\x8e\\x54\\xa4\\x15\\x51\\xc9\\xa0\\x95\\x9e\\x89\\x94\\xca\\xc6\\x0f\\xc8\\x68\\xad\\x48\\xb5\\xa2\\x4d\\x5f\\x24\\xa7\\xa5\\xa3\\xfd\\x90\\xb8\\x47\\xe8\\x17\\xad\\x3d\\xd5\\xd0\\xd6\\xf8\\xde\\x2d\\x20\\x4f\\x64\\x24\\x83\\xbd\\x53\\x58\\x5a\\x92\\xef\\x92\\x54\\x15\\xa9\\xb3\\x8f\\xbb\\xf0\\x7f\\xc0\\xf3\\x5e\\x70\\x75\\x69\\xcf\\x48\\x8b\\x20\\x54\\x53\\xce\\x54\\x33\\xeb\\xa6\\xfd\\xe8\\x78\\x1a\\xf7\\x2b\\x52\\xbf\\xbc\\xab\\x85\\xea\\xd3\\x85\\xd9\\xd3\\x17\\x5e\\x21\\xad\\x33\\x73\\xad\\x53\\x5c\\xf0\\xe3\\x57\\xed\\x6b\\x53\\x83\\xef\\x38\\x29\\xa9\\xd5\\x09\\x5b\\x87\\xdc\\x9a\\xad\\xbe\\x0c\\xa7\\xab\\xad\\xf3\\x3e\\xc3\\xb6\\xff\\xd6\\xeb\\x94\\xaf\\xdc\\xc1\\x2e\\x8d\\x66\\xa6\\xfc\\x05\\xac\\xf9\\x73\\x68\\xdb\\x0f\\x69\\x56\\x5d\\xcd\\x8f\\xef\\x4d\\x1e\\x49\\xd7\\xdd\\x4a\\xc0\\x53\\xc2\\x18\\xf5\\x24\\x0c\\x81\\x2d\\x4e\\xbb\\xa4\\x40\\xdc\\x54\\xca\\xcd\\xdb\\x1c\\x39\\x32\\x9e\\x5b\\xd0\\xc3\\xc8\\x0d\\xc3\\x25\\x9a\\x80\\xf0\\x59\\xf9\\x46\\x79\\xaa\\x07\\x94\\xca\\x01\\x15\\xcc\\x62\\xaf\\x25\\xe1\\x24\\xcb\\x8a\\x9d\\x41\\x60\\xea\\xce\\x6d\\x22\\xc7\\xb1\\xc4\\x45\\x44\\xf8\\x11\\x42\\xa1\\x9e\\xbb\\x02\\xa9\\xbd\\xa6\\x42\\x9c\\x50\\xe7\\x83\\xdb\\x4a\\x07\\xf0\\x21\\x9e\\x85\\x7c\\x8d\\x3c\\x56\\x55\\xa5\\x82\\x83\\x1c\\x8e\\xab\\xc3\\xf1\\x9b\\x59\\xad\\x8d\\x2c\\x71\\x4a\\xde\\xaf\\x40\\x39\\xd5\\xcf\\x70\"},\n{{0x6f,0xed,0xe7,0x39,0x6c,0x46,0x20,0x33,0x18,0x9a,0xcd,0x23,0xd2,0xf9,0xd0,0x2b,0x68,0x89,0x8d,0x35,0xf3,0xa0,0x1a,0x79,0x8f,0xc2,0x4d,0x48,0x8d,0xe9,0x3a,0x78,},{0xb3,0x40,0x62,0x06,0x0b,0x2c,0x20,0x07,0x6a,0x98,0xfe,0xa9,0x39,0xb3,0xb3,0xa5,0x04,0x51,0xa5,0xf4,0x9f,0x83,0x51,0xc0,0xad,0x75,0x91,0xdb,0xbe,0xbb,0x13,0x0f,},{0x88,0xa8,0x3e,0x20,0x12,0xd2,0x09,0xca,0x03,0xb8,0xeb,0xf6,0xde,0x5b,0xb7,0xef,0x4c,0xcb,0x5e,0x3d,0xf5,0xca,0xc7,0x89,0x54,0xaa,0x69,0x49,0x30,0xe4,0xde,0x82,0x54,0x4e,0xf5,0x08,0x3c,0x48,0x92,0xdb,0x9f,0x05,0xd7,0x7b,0xf6,0x3f,0x4f,0xdf,0xce,0x15,0xa4,0xd1,0xc3,0xf8,0x5b,0xae,0x80,0x77,0x06,0x2b,0xec,0x0e,0x7b,0x07,},\"\\x5a\\xbc\\xc1\\x4b\\x9d\\x85\\x78\\xde\\x08\\x32\\x1d\\xe0\\xd4\\x15\\xe3\\xd4\\x0e\\x9d\\xe3\\x1e\\x18\\x88\\x13\\x74\\x75\\xce\\x62\\xbc\\x6f\\xbe\\xe8\\xfd\\xd0\\x3b\\x9d\\x47\\xc7\\xb8\\x8b\\xbc\\xeb\\x80\\x44\\x44\\x49\\x0b\\xf6\\xa3\\xcc\\xb7\\xa2\\x73\\x26\\x1e\\x24\\x00\\x4e\\xa6\\x7c\\xef\\xa3\\xd5\\xd1\\x73\\x57\\x6d\\x01\\xe3\\x8f\\x76\\xc1\\xe0\\xe5\\x15\\x08\\x3c\\x97\\xe7\\x99\\x14\\xac\\xf2\\xbe\\x41\\x60\\xef\\x93\\x60\\xbb\\xe9\\x86\\xb3\\x6e\\x9f\\xf9\\x33\\x46\\xb0\\xe7\\x06\\x91\\xd9\\x34\\xe4\\x7f\\x8a\\x50\\x3f\\xa9\\x33\\xab\\x2a\\x50\\x42\\x69\\x47\\xcd\\xa8\\xe8\\x10\\xc9\\xeb\\xe3\\xb3\\x69\\x82\\xf0\\x9a\\xee\\x60\\x92\\x73\\x9f\\xa2\\x35\\x8b\\x61\\x3c\\x7f\\x12\\x9d\\xb0\\xdc\\xbe\\x36\\x8b\\xee\\x52\\xf2\\xf7\\xf1\\xdf\\xe3\\xd2\\x43\\x46\\x05\\xb5\\xaf\\xcf\\x25\\x60\\x71\\x71\\x7d\\x92\\x4f\\xd0\\x80\\x3b\\xbd\\x0d\\xd1\\xf9\\x55\\x5c\\xe8\\x34\\xda\\xc7\\x81\\xdf\\x4c\\xc7\\xaa\\x19\\xe7\\xf1\\x1d\\xa9\\xfb\\x99\\xcb\\x9e\\x6b\\x9e\\x1e\\x6f\\xb4\\xf7\\xe8\\xdc\\xb2\\x23\\x6c\\x28\\xae\\xb6\\xcb\\xc5\\x5a\\x13\\x0e\\x03\\xc1\\xb1\\x7a\\x99\\x1c\\xca\\x1b\\x79\\x4e\\x6c\\x13\\x73\\x2d\\x5b\\x0a\\x66\\xf6\\xeb\\xa8\\x60\\xec\\xb9\\x85\\x55\\xaa\\x4c\\x21\\x8d\\x11\\x2b\\x11\\x6b\\xce\\x23\\x82\\x95\\xde\\x14\\x27\\x41\\xf6\\x87\\xbe\\x0b\\x24\\x87\\xf5\\x8f\\xfc\\x5c\\x12\\xa0\\xa5\\x19\\xf1\\xe2\\x37\\x93\\x24\\x2e\\xf8\\x57\\xed\\x39\\x8a\\x20\\x69\\x9d\\x43\\x51\\x45\\x3f\\xc2\\xf0\\x92\\x76\\x2a\\xbd\\xe3\\x4f\\x4d\\xa2\\xdb\\xe0\\xce\\x2a\\xab\\xaf\\x6b\\xc4\\xc0\\x15\\x9f\\x3f\\xe1\\xae\\xa1\\x6a\\x03\\x6f\\x7e\\xae\\xcd\\x62\\x95\\x38\\xf3\\xe0\\xee\\xd8\\x3c\\x9a\\x4d\\xc1\\xab\\xc2\\x38\\xf9\\x0d\\xaa\\xf4\\x89\\xfd\\x61\\xb3\\x4d\\x93\\x7b\\x6f\\x46\\x07\\xa7\\x88\\xba\\xa8\\x20\\x61\\x94\\x3d\\xba\\xb2\\x6c\\x1d\\x38\\x4d\\x8d\\x49\\xf9\\x93\\x48\\x80\\x0b\\xf3\\x61\\xf8\\x71\\xf5\\xd6\\xcd\\xa1\\x8f\\x68\\x99\\x18\\xce\\xc3\\x1a\\xd1\\x58\\xf1\\x86\\x3d\\x13\\xff\\xac\\x54\\x05\\xc1\\x62\\xc3\\x2d\\xe0\\x6e\\x32\\x99\\x4c\\xc4\\x10\\x6f\\x95\\xbb\\x4f\\xff\\xdb\\xef\\xe7\\xd6\\x29\\xec\\x77\\x97\\x39\\x46\\x09\\xfd\\xbf\\xea\\xdb\\x46\\x92\\x73\\x70\\xa1\\x1f\\xb3\\x84\\x71\\x54\\x0f\\x95\\x1b\\x93\\xc6\\xeb\\x23\\x86\\x68\\xdc\\x00\\x6c\\x21\\x66\\x0b\\xa2\"},\n{{0xd5,0x59,0x58,0x01,0x34,0xab,0x05,0x0a,0xca,0x44,0x6e,0xa7,0x75,0x0e,0xf6,0xb3,0x71,0xd9,0x2d,0x76,0x45,0xec,0x76,0x35,0xfe,0x78,0x51,0x10,0x0b,0xc4,0xe5,0x1e,},{0xde,0x50,0x20,0xcd,0x21,0xa8,0xb3,0x23,0x39,0xde,0xcb,0xed,0xff,0x24,0x66,0x4d,0x95,0x80,0x32,0x63,0x27,0xae,0xdf,0x09,0xc5,0xec,0x6b,0x3f,0xe5,0x40,0x52,0x26,},{0x6f,0xcb,0x1a,0xc9,0x29,0x0a,0xb7,0x67,0xd5,0x9b,0x59,0x8c,0x9a,0x24,0xec,0xdb,0x6c,0x05,0xbb,0x02,0x3e,0xc3,0x60,0x14,0xa4,0x0d,0x90,0x8e,0xf0,0xdc,0x37,0x8a,0x45,0x28,0xb3,0x76,0x0d,0x88,0x9a,0x79,0x17,0x4e,0x21,0xca,0xe3,0x5d,0xf4,0x5d,0x42,0x7b,0xa6,0xea,0x81,0x2b,0xdd,0xca,0x16,0xe3,0x5a,0x69,0xb5,0xe7,0x9f,0x0a,},\"\\x68\\x42\\xe3\\x19\\x0a\\x11\\x0e\\xee\\x96\\xc5\\x07\\xd4\\xbc\\xb4\\xc5\\x48\\xc3\\xa0\\xed\\x7b\\x1a\\x8e\\xd7\\x7d\\xd9\\x3b\\x38\\x61\\x3b\\x23\\xc7\\x3e\\x83\\x0b\\x20\\x5e\\x62\\x65\\x19\\x21\\xad\\x82\\x96\\xb0\\x8d\\x1e\\x10\\x08\\xad\\x78\\xf2\\x99\\x6e\\x3c\\x7f\\x38\\x03\\x2e\\x46\\x7c\\xff\\xec\\xd7\\x7b\\x85\\x25\\xe2\\x43\\xce\\xc0\\x21\\xf8\\x52\\x96\\xaf\\xd5\\x45\\xd7\\xbe\\x1a\\x62\\x56\\x8b\\xb0\\xcf\\xcd\\xb9\\x0d\\x61\\x4e\\xd7\\x98\\xbf\\xb7\\xef\\xc6\\x55\\x32\\x68\\x16\\xa6\\x10\\x82\\x25\\x1d\\xf0\\x16\\x13\\xaa\\xc8\\x8e\\xfc\\xea\\x1e\\x0e\\xa2\\x96\\x1b\\x8f\\x92\\x1e\\xbe\\x15\\x58\\xde\\xe8\\x33\\x74\\xa0\\x11\\x3a\\x78\\xc5\\x58\\x57\\xce\\x20\\x55\\xbb\\x2c\\x48\\xba\\xdb\\xd3\\xd8\\xf4\\xcb\\x19\\x73\\x4d\\x00\\xd0\\x60\\x4b\\x61\\x90\\x73\\x02\\x0d\\x72\\xa9\\x9a\\x19\\x23\\xe6\\x16\\x0a\\x09\\x94\\x65\\x67\\xfd\\x4b\\xda\\x66\\x44\\x2e\\xf5\\xa7\\x36\\x07\\x86\\xd1\\x78\\xda\\xe4\\x49\\x22\\xf3\\x50\\xce\\x2e\\xdc\\x6a\\xf7\\x3d\\x1b\\xd8\\x0d\\xc0\\x3e\\xc3\\xca\\x70\\x05\\xf4\\x10\\x9d\\x10\\xc6\\xd4\\xf7\\xd8\\xfa\\x61\\x73\\x51\\x10\\xf8\\xdb\\xae\\xdf\\x91\\xa0\\xba\\xd7\\xd7\\xfb\\x5c\\x04\\xd7\\x06\\x37\\x3c\\x15\\xc6\\x45\\x06\\x3f\\xf4\\xb4\\xfb\\xd2\\xd5\\x59\\xb0\\xaf\\xad\\x43\\x2d\\x4c\\x49\\x6c\\xd8\\xab\\xfe\\xa2\\x86\\xfa\\x67\\x5d\\xc0\\x76\\x72\\x6e\\xc5\\x22\\xb3\\xa3\\xc2\\xf4\\x7a\\xec\\xc5\\x39\\xf4\\x8a\\x79\\x21\\x69\\xc4\\xcc\\x8c\\xd4\\x1c\\xd2\\xcb\\x6b\\x63\\xdd\\xbc\\x19\\x37\\x3a\\xc9\\x69\\x1c\\x2b\\xc2\\xf7\\x8f\\x22\\x60\\x3d\\x55\\x13\\x71\\x5a\\x16\\xd4\\x57\\x4e\\x7a\\xcc\\x4b\\xea\\x6d\\xcd\\x8c\\xa7\\xf1\\x98\\x65\\xa4\\x9d\\x36\\x64\\xa2\\x10\\xdf\\xad\\x29\\x07\\x74\\xb1\\x0b\\x71\\x88\\xf2\\x55\\xb3\\xbe\\x4d\\xc8\\xfa\\x86\\xf8\\xda\\x3f\\x73\\xa4\\xe7\\xc9\\x29\\x95\\x1d\\xf3\\x0f\\xe6\\x6a\\x17\\xc8\\xce\\xe2\\x3e\\x4f\\x2e\\xd2\\x06\\x3f\\x0b\\x02\\xab\\x40\\x37\\x2c\\xbe\\x54\\xb9\\xa7\\x08\\xdf\\x7c\\x48\\xa0\\x65\\x66\\xd3\\x9b\\x19\\x43\\x4c\\x6c\\x76\\x69\\x87\\xb3\\xeb\\xb0\\x06\\x75\\xf4\\x4c\\x4b\\x3c\\x1e\\x9f\\x45\\x04\\xe7\\xa9\\x27\\x05\\x89\\xc0\\xd0\\xf4\\xcb\\x73\\x42\\x35\\xa5\\x8e\\xf0\\x74\\xcf\\x9d\\xec\\xf3\\x60\\x1a\\xee\\xca\\x9f\\x1d\\x8e\\x35\\x6c\\xb2\\xdb\\x5f\\xce\\x79\\xcb\\xc3\\x61\\x43\\xf3\\x4b\"},\n{{0x9d,0x4c,0xe9,0x75,0x54,0x78,0x76,0x63,0x6f,0xea,0x25,0x43,0x7c,0x28,0x80,0xc9,0xaa,0x8e,0xe6,0xb2,0x70,0xd1,0xb2,0xda,0x19,0x7c,0x8d,0x7f,0x95,0xe7,0xdc,0xcc,},{0xbd,0xe4,0x99,0x3c,0x03,0x04,0x77,0xc3,0x58,0x90,0xaa,0xe8,0x2b,0xb5,0x08,0x7e,0x91,0x4e,0x64,0xb9,0x4f,0xfc,0x64,0xe2,0xd7,0xa5,0xa7,0xc9,0x19,0xe2,0xd9,0x02,},{0xbe,0x17,0x44,0x4c,0xd4,0x65,0xa8,0x7a,0x97,0x1d,0xf8,0x4e,0xb1,0x02,0xf9,0xc7,0xa6,0x26,0xa7,0xc4,0xff,0x7a,0xea,0x51,0xd3,0x2c,0x81,0x35,0x3d,0x5d,0xbc,0x07,0x39,0x3c,0xa0,0x3d,0xb8,0x97,0xd1,0xff,0x09,0x94,0x5c,0x4d,0x91,0xd9,0x8c,0x9d,0x91,0xac,0xbd,0xc7,0xcc,0x7f,0x34,0x14,0x4d,0x4d,0x69,0xeb,0x04,0xd8,0x1f,0x0c,},\"\\xea\\x0f\\xa3\\x2a\\x4a\\x28\\x88\\x11\\x30\\x1b\\x9e\\xe5\\x33\\xfa\\x35\\x1f\\xdf\\xbf\\x6b\\xc1\\xd0\\x55\\x5a\\x74\\x02\\x76\\x7a\\x3a\\x91\\x98\\x55\\x8f\\x74\\xbb\\xa7\\x03\\x18\\x57\\x99\\x5b\\x9f\\x32\\x62\\x26\\xf1\\xdd\\x5d\\xf1\\x07\\xb0\\x63\\x42\\x20\\x3e\\xb8\\xd4\\x0c\\x5f\\x1d\\xc9\\x5b\\x4f\\x3f\\x88\\x97\\x5a\\xa2\\x4a\\xf8\\x76\\x9e\\x26\\x70\\xc4\\x66\\x71\\xbe\\xbb\\x7a\\x0f\\x1b\\x75\\x68\\x72\\x9a\\xee\\x47\\x7e\\x89\\x88\\xaf\\x9c\\x74\\x9f\\x32\\x02\\x70\\x81\\x71\\xfd\\x94\\xb3\\x37\\xae\\x67\\xed\\x21\\xa6\\xc4\\x41\\x74\\x01\\x4b\\x0b\\x0e\\xb5\\xba\\x71\\xc2\\x77\\x97\\x8d\\x48\\x8c\\x24\\xc4\\xa7\\x84\\x13\\x09\\x84\\x6b\\x4e\\x30\\xa4\\xfb\\xbc\\xfc\\x45\\x07\\x8d\\x7e\\x14\\x01\\x41\\x14\\xb1\\xac\\x64\\xf7\\xc3\\x3c\\x9a\\xc2\\x5e\\xa5\\x62\\x6c\\x2c\\x81\\x9f\\xba\\xa2\\xa4\\xde\\x8a\\x2b\\xf5\\xf1\\x36\\x5d\\x6b\\x70\\x40\\x7e\\x80\\x94\\xf9\\x91\\x97\\xce\\x1f\\x0c\\x35\\xe1\\x1a\\x98\\xfb\\xe3\\x72\\x41\\x4e\\xa2\\x06\\x4a\\x3a\\x12\\xd1\\xcd\\x5c\\x8d\\xf8\\xfc\\x0e\\x79\\xf5\\xb7\\x70\\xb5\\x8f\\x47\\x7f\\x91\\x97\\x6c\\xa0\\x13\\x98\\x95\\x12\\x0e\\x24\\x6b\\xaa\\xb5\\xa0\\x26\\xf2\\xd3\\x9c\\x68\\x7d\\xc0\\x78\\x83\\x34\\xb5\\xc6\\x26\\xd5\\x2c\\xde\\xbe\\x05\\xea\\xf3\\x08\\x64\\xb4\\x13\\xee\\xbd\\xc5\\x58\\x1e\\xf0\\x0d\\x43\\x92\\x76\\xe5\\x2f\\x47\\x9c\\x9c\\x05\\xb1\\x16\\x39\\x58\\x26\\xb6\\x04\\x90\\xb3\\xce\\x70\\x0c\\xc0\\x02\\x7f\\x61\\xe4\\x6c\\xa2\\xf6\\xfb\\xc2\\xc9\\xde\\x2e\\x80\\x08\\x06\\x55\\x0a\\xfb\\x06\\xd4\\xa0\\x8e\\xac\\x7a\\x75\\x8e\\x24\\x58\\x2a\\x4d\\x6d\\x42\\x8b\\x43\\x3d\\x36\\x5f\\xc3\\x1d\\x44\\x44\\x60\\x7a\\xfb\\x64\\xf1\\x5e\\x37\\x07\\x94\\x00\\x5a\\x3a\\x22\\x44\\xe6\\x66\\xd5\\xd4\\xc3\\x8a\\xd2\\x00\\x9c\\x76\\x9a\\x51\\xcd\\xbf\\x73\\x8d\\x23\\x59\\x42\\xf4\\x12\\xd0\\x7f\\xee\\xb7\\x3b\\x36\\x57\\xd0\\xb0\\xc9\\x1c\\xb5\\x94\\x0b\\xad\\x6a\\x70\\x6e\\x14\\xed\\xcd\\xc3\\x42\\x25\\xb1\\xc1\\xf3\\x8b\\x1a\\xbe\\xcb\\x2a\\xdc\\xaf\\x81\\x91\\x55\\xa9\\x4f\\xe1\\x90\\xfd\\x55\\x68\\x22\\xd5\\x59\\xd9\\xc4\\x70\\x85\\x4d\\x3a\\x43\\xbf\\xb8\\x68\\xda\\xdd\\x6e\\x44\\x3d\\x98\\xee\\x87\\xe4\\xd8\\x28\\x4f\\x5c\\xf3\\xa6\\xda\\xfa\\xf2\\x95\\xb9\\x02\\x83\\x6c\\x64\\x05\\x11\\xe6\\x10\\xae\\x7d\\x0c\\xb1\\xb1\\xd3\\xd6\\x07\\x9f\\xe6\"},\n{{0x02,0x73,0x86,0x82,0x32,0xf5,0xbe,0x48,0x59,0x2c,0xfa,0x05,0x13,0x4e,0x8d,0x55,0x54,0xed,0x1f,0x9a,0x57,0xbc,0x7e,0x39,0x82,0xa3,0x30,0xc5,0x7e,0x5a,0x7f,0x3a,},{0xf1,0x72,0x20,0x87,0x82,0xdb,0x66,0xd4,0x66,0xcb,0xe4,0xf4,0x41,0x7f,0x6f,0xc4,0x77,0xb7,0x34,0x9f,0x2a,0x98,0xdb,0x56,0xc0,0x3a,0x47,0x22,0x75,0x46,0xbc,0x5a,},{0x15,0xe8,0xd8,0xdc,0x7d,0x5d,0x25,0x35,0x9d,0x6a,0x10,0xd0,0x4e,0xe4,0x19,0x18,0xa9,0xc9,0xdf,0x4c,0x87,0xbe,0x26,0x9f,0xa8,0x32,0x43,0x4d,0x53,0x01,0xdb,0x02,0x24,0x81,0xbf,0xa3,0x95,0xa3,0xe3,0x46,0x6f,0x95,0x54,0xce,0xee,0x05,0x32,0xa8,0x18,0x3a,0x0d,0x05,0x50,0xe7,0xd1,0xab,0xe9,0x9f,0xc6,0x94,0xc6,0xff,0x93,0x01,},\"\\xf7\\xa1\\xd4\\x61\\x4c\\xc6\\x4a\\x3b\\xc4\\x8f\\x00\\xc6\\x27\\x63\\x04\\xf3\\x4d\\x4d\\xfd\\x15\\xe0\\x61\\x7b\\x93\\xcc\\xef\\x12\\x6c\\x5c\\x63\\x8c\\x9d\\x99\\x53\\xaa\\xbb\\x7d\\xf4\\x2d\\xf4\\xe0\\xaa\\xa7\\xea\\xc9\\x6a\\x4b\\x38\\xc7\\xba\\x75\\x8d\\x86\\x0c\\x90\\xd0\\x5e\\x3d\\x14\\xe4\\x79\\xe5\\x45\\xf3\\x19\\xb0\\xe5\\xa8\\x5a\\xd8\\xf0\\x99\\x1b\\x43\\xd6\\xe4\\x9c\\x24\\xfa\\x06\\x0e\\x3e\\x5d\\xf9\\x5c\\x98\\xd9\\x45\\x1a\\xb8\\x33\\xe1\\x2a\\xa9\\x7f\\x40\\x46\\x11\\xbb\\xa3\\x59\\x49\\x62\\x65\\xa6\\xdb\\x11\\x91\\x7d\\x0d\\xa5\\xc6\\xa7\\x02\\xd0\\xb1\\x02\\xde\\x36\\xdd\\x0c\\x98\\xdf\\x5b\\x54\\x80\\x6c\\xe6\\x26\\xbb\\x96\\x37\\x44\\x75\\xf6\\x8a\\x60\\x60\\xeb\\x35\\x0a\\x7d\\x2a\\xae\\x32\\x04\\xb3\\xdf\\xdf\\x9f\\x1e\\x31\\xbe\\x81\\xf7\\x17\\x0f\\x8a\\x1b\\x93\\x85\\x41\\x3f\\xf8\\xf6\\x88\\x1e\\x10\\xc1\\xe8\\xda\\x4c\\x88\\xaf\\xb5\\x06\\x39\\xab\\x44\\x88\\x7a\\xca\\x2a\\xbe\\xec\\xed\\xf1\\x10\\xd2\\x95\\x8c\\x13\\xfd\\x33\\x90\\xd1\\xb9\\x6a\\x76\\x2d\\x16\\xce\\x19\\x69\\x20\\xce\\x85\\xf6\\xc4\\x15\\xbe\\xd5\\x45\\xb1\\x44\\x53\\x02\\xa6\\xf0\\x01\\xeb\\x8d\\x00\\xe9\\x7c\\x75\\x18\\x87\\x86\\x8d\\x48\\x1a\\x0b\\x1e\\x4d\\xfa\\x04\\xb6\\xf7\\x61\\x08\\x6e\\xe8\\xe6\\x97\\xb0\\x19\\xe0\\x17\\x10\\x4b\\xaf\\xb9\\x8f\\xca\\x24\\x2e\\x33\\x4c\\x6f\\x18\\xf1\\xdb\\x5b\\x6f\\x29\\x5f\\x05\\xc5\\x59\\x36\\x1c\\x68\\x31\\xda\\xbc\\x42\\xc2\\x11\\x07\\x03\\xf9\\xd1\\xf6\\x4e\\x12\\xdd\\xf2\\x6a\\x86\\x79\\x85\\x4e\\x9f\\x8e\\xf8\\x47\\x9e\\x1f\\x12\\xc3\\x54\\x47\\xaa\\xc0\\x2e\\xa7\\xf2\\x42\\xe5\\x86\\x32\\xcf\\x2f\\xd0\\x63\\xfe\\x66\\x50\\x70\\x44\\x5b\\x80\\xf3\\xdc\\x6a\\x33\\x03\\xbb\\xa9\\x6e\\x05\\xfa\\x88\\xee\\xc2\\x01\\xc5\\xc2\\xd0\\x0c\\xa8\\x1b\\x8d\\xa6\\x96\\x9d\\x0a\\x4d\\xd0\\x48\\x3b\\x34\\x77\\xd3\\x25\\xa7\\x1f\\xac\\xd6\\xfa\\x22\\x09\\xb4\\x8c\\xb4\\xf6\\x52\\x5d\\xa7\\x3c\\x9c\\x05\\xb2\\xd9\\x78\\x9b\\x01\\x44\\x8e\\x15\\x27\\xe5\\x6a\\x09\\xa9\\xbc\\x61\\x36\\xd9\\x83\\x72\\x43\\xc2\\x07\\x7b\\x92\\x5b\\xbb\\x93\\x3f\\x8f\\xb1\\xda\\xac\\x96\\x33\\x98\\xc5\\x80\\x2a\\xed\\xa3\\xbb\\xca\\x8a\\xe3\\xb8\\xf4\\xa9\\xa8\\x71\\xf7\\xea\\x8e\\x2c\\x0c\\xe8\\x98\\xc5\\x66\\x21\\x7b\\x5c\\x06\\xff\\x55\\xff\\x9f\\x4f\\xe7\\x83\\x98\\xae\\x79\\x73\\x64\\x1e\\xaf\\xb5\\x21\"},\n{{0x33,0x6a,0x83,0xb5,0x5a,0xbf,0x4c,0x02,0xe2,0x5e,0x54,0x03,0x29,0xb5,0x27,0x58,0x43,0xc2,0xec,0xb8,0xdf,0x69,0x39,0x5b,0x5a,0x5e,0x24,0x1b,0xd0,0xd8,0xc1,0x0d,},{0xdd,0x60,0x56,0x98,0x44,0x57,0x0c,0x9f,0x0a,0x82,0x64,0x3f,0x44,0x64,0x78,0xb5,0xac,0x6f,0xc5,0x42,0x21,0x42,0x31,0xa7,0xca,0x65,0x6a,0x92,0xb5,0xfd,0xaa,0x54,},{0xd2,0x63,0xf5,0x6d,0x59,0xcb,0x9b,0x28,0x96,0xa9,0x47,0x26,0x7c,0x2e,0xd7,0x8a,0x94,0x5b,0xac,0x5a,0xbd,0xbf,0x3c,0x14,0xdc,0x3a,0xd0,0x92,0xb2,0x30,0x8c,0xb9,0x31,0x5c,0x46,0x49,0x42,0xa0,0xa2,0x0b,0x20,0x24,0x51,0x1d,0x76,0x6e,0x85,0xc9,0x36,0x49,0x9a,0x14,0x9c,0xd0,0xbb,0xb2,0x09,0x15,0x0a,0x16,0x43,0x26,0x52,0x00,},\"\\x9a\\xfe\\xe8\\xab\\x48\\x20\\x10\\xe2\\x92\\x64\\xb4\\x06\\xd9\\xb4\\x94\\x53\\xd1\\xce\\x6d\\x55\\x09\\x39\\x07\\x21\\x82\\x86\\x3e\\x46\\x65\\x28\\x4a\\xb0\\x5d\\x86\\x25\\x8e\\x06\\x23\\xb1\\x87\\x54\\xc4\\x78\\x52\\x38\\xf6\\x97\\xf0\\x75\\xad\\xfb\\x9e\\x1d\\x31\\xa4\\x2e\\x85\\x93\\x4e\\xc0\\x71\\xdd\\xdd\\xec\\xc2\\xe6\\xc2\\xf6\\x13\\x34\\xa7\\x95\\x26\\x78\\x8b\\x49\\x52\\x19\\x07\\x16\\x90\\x6d\\xde\\x17\\xfb\\xa5\\x56\\xee\\xa4\\xc8\\xb5\\x97\\x27\\x51\\x4f\\x6f\\x56\\x15\\xa1\\x9c\\xa3\\x6d\\xa3\\x58\\xfa\\xe6\\xa6\\xc5\\x4f\\x7f\\x4b\\x7a\\x92\\x9e\\x31\\xba\\x7c\\xc7\\x1b\\xde\\x78\\x82\\xfa\\x9f\\xfd\\x87\\x30\\x01\\x36\\x40\\x9c\\xaf\\x3c\\xa6\\x4e\\xef\\xea\\x61\\x6a\\xed\\x58\\xda\\x5d\\xfb\\xf2\\x8b\\x66\\x8e\\xc1\\xcc\\xcf\\xfc\\xef\\x6e\\x2e\\x14\\xf8\\x10\\x9e\\x9c\\xbf\\x76\\xcf\\xa4\\x14\\xf9\\x1a\\xc0\\x0f\\x48\\xe9\\x3e\\xad\\xa3\\x85\\xdd\\x3d\\x5c\\x16\\xe1\\xa3\\x9e\\xa3\\xdd\\x55\\xc7\\x61\\xfc\\xa3\\x61\\xb4\\x28\\xf5\\x16\\xc0\\x5e\\x69\\x4f\\xe5\\xc3\\xc3\\x45\\xcd\\x94\\x45\\x71\\x87\\xa8\\xe6\\x04\\xb2\\x00\\xa1\\xa0\\xf9\\x37\\xae\\x89\\xf4\\xd6\\xb5\\x42\\x1d\\xff\\xcf\\x7c\\xa1\\x5f\\x2e\\x2c\\x25\\x37\\x8a\\x41\\x13\\x23\\x3f\\x76\\x13\\xf4\\x57\\x0a\\xa4\\xb9\\x09\\xa9\\x13\\x5e\\xae\\x4c\\x7b\\x9e\\xad\\x45\\x80\\x07\\xae\\x17\\x12\\x6a\\x11\\xd1\\x45\\x25\\x8a\\xf9\\x56\\x3d\\xb2\\xf7\\xe8\\x92\\x54\\x31\\x87\\x8b\\x0e\\xec\\xa8\\xaf\\xfc\\x01\\xac\\x59\\x13\\xbf\\x5b\\xac\\x4f\\xa3\\xa8\\x57\\xc5\\x4c\\xc8\\x90\\x6d\\x6a\\xf7\\x7d\\xe6\\xb9\\x32\\x6b\\x65\\x06\\x15\\x10\\x99\\xe8\\x7e\\x99\\xb1\\xe8\\x19\\xc6\\xfb\\xe0\\x82\\x68\\x8f\\x34\\xb8\\x03\\xd5\\x88\\xe4\\x16\\xd8\\x53\\x16\\x97\\x65\\xd6\\x2f\\x7e\\x0b\\xdf\\x72\\xc5\\xcd\\x66\\x66\\x9a\\x03\\x35\\x56\\x23\\x36\\x73\\x5e\\x7e\\xfb\\x73\\x4a\\x2f\\xad\\xa3\\x27\\xf8\\x58\\xbe\\xc6\\x02\\xd0\\xda\\x08\\xeb\\xa4\\x47\\x9e\\x7f\\x6d\\xc4\\xde\\xf6\\xe4\\xeb\\xdb\\xb7\\x30\\xee\\x91\\xa3\\x34\\x45\\xca\\xdc\\x9d\\xf5\\x2c\\x82\\x5a\\xd3\\x61\\x49\\xce\\xfb\\xc5\\x1a\\xb1\\x02\\x03\\x35\\x30\\x81\\x4b\\xaf\\xa7\\xe8\\x79\\x61\\xb0\\x63\\x67\\xff\\x89\\x6f\\x08\\xae\\x33\\x4a\\x9b\\x1a\\xad\\x70\\x3d\\xa6\\x86\\x70\\x6c\\x11\\xa0\\x49\\x43\\xea\\x75\\xe1\\x29\\x92\\xdc\\xf6\\x10\\x6e\\x37\\x20\\x77\\xcd\\x03\\x11\\x02\\x9f\"},\n{{0x88,0x40,0x91,0x72,0x61,0x8b,0x49,0x03,0x93,0xdb,0x27,0xd9,0x60,0x17,0x1c,0xbc,0x18,0x7e,0xaf,0x4d,0xd8,0xb3,0x20,0xb3,0xd2,0xf8,0x24,0x98,0x00,0x43,0x71,0x8f,},{0xce,0x2e,0x7c,0x58,0x39,0xef,0x56,0x32,0xa1,0x23,0xdc,0x37,0x3d,0xc1,0x4b,0x1f,0x05,0x05,0x76,0x6e,0x96,0x75,0x40,0x76,0x04,0xca,0x7c,0xf5,0x4e,0x8d,0x44,0xb2,},{0x93,0xb6,0xe2,0x9d,0x63,0x94,0x5d,0x5c,0x42,0x73,0x87,0xd0,0x06,0xc7,0xf0,0xb0,0x19,0x56,0xa9,0x5f,0xc0,0x43,0x6e,0xd4,0x2b,0x46,0xd0,0xf1,0x7b,0x5b,0xb1,0x93,0xea,0x8c,0x0e,0xbb,0xf3,0xd6,0xd1,0x3b,0xb5,0x39,0xe3,0x5c,0x91,0xf3,0xf0,0xf9,0xfa,0x34,0x14,0xa0,0x22,0x3c,0x90,0x60,0xba,0xc8,0x36,0x53,0xc6,0xfc,0xd9,0x06,},\"\\xfb\\x3e\\x82\\xf1\\x1b\\xc2\\x86\\x26\\x7e\\x12\\x38\\x17\\xad\\x88\\x64\\xe0\\x77\\xd9\\xf7\\xa8\\xe7\\xa1\\x63\\xac\\x7e\\xea\\xf9\\x3d\\x55\\xdd\\x11\\x1d\\xe8\\x08\\x3b\\x66\\xb5\\x3c\\xe7\\xbc\\x77\\x1f\\xc5\\x07\\x1a\\x2d\\x7a\\xc2\\xf8\\x5d\\x6f\\xc6\\xad\\xcf\\xce\\xc4\\x46\\xe1\\x6a\\xa1\\x04\\x6d\\xf3\\x72\\x09\\xad\\x7a\\x29\\xcf\\x96\\x65\\xb4\\x39\\xa5\\x4d\\x6f\\x8d\\x94\\x2f\\x89\\xbd\\xaa\\x56\\xf2\\xf1\\x12\\x60\\xcc\\x95\\x99\\x30\\x38\\xb0\\xe8\\xfb\\xdb\\x32\\x14\\xf1\\x42\\xe6\\xc9\\x0b\\x61\\xa1\\xd2\\xb1\\x42\\x07\\x62\\x06\\xaf\\x30\\xac\\x35\\x78\\x4a\\x6d\\xc1\\x5a\\x1e\\x79\\x25\\x1a\\x8c\\x77\\x31\\xa1\\xc5\\x39\\x78\\x03\\x8f\\x8d\\x76\\xd7\\x0c\\x6c\\x1c\\xdf\\x52\\x9f\\xbd\\xb8\\x4d\\x15\\x07\\xdc\\xff\\xdd\\x42\\x87\\x3d\\xfa\\x6a\\x8f\\xe6\\xbd\\x6f\\x7f\\xd2\\x9c\\x80\\xe4\\xb2\\xf9\\x33\\xd2\\xb6\\xc9\\xe6\\x2c\\x94\\x57\\xe6\\x65\\x47\\x26\\x55\\x05\\x9b\\x63\\xb6\\x18\\xe2\\xa9\\xa8\\xe5\\xb9\\xe4\\x1c\\x36\\x46\\x17\\x3a\\x89\\x2b\\x8e\\x6d\\x4b\\xca\\xd6\\xa6\\x2a\\x6f\\xcc\\xd3\\x45\\x58\\x90\\xb5\\x8e\\xc2\\x68\\x1a\\x95\\xcc\\x97\\x76\\xa9\\xfc\\xe8\\x3c\\x54\\xa9\\xef\\x31\\x2a\\x33\\x19\\x59\\xc7\\xef\\x3f\\x79\\xee\\x57\\x6e\\xb7\\xb7\\x94\\x69\\xc9\\x23\\x4b\\x1e\\xae\\xf6\\x09\\x88\\x47\\x08\\xfe\\x4b\\xb0\\xef\\xac\\x66\\x2d\\xa8\\x71\\xba\\x61\\xdd\\xab\\xb3\\xfc\\xbd\\xeb\\x8f\\x63\\x56\\x57\\xdd\\x9a\\x5d\\x73\\x11\\xe6\\x39\\xa8\\x24\\x85\\x8b\\x9a\\x98\\x68\\xd3\\xf9\\x38\\x4d\\xa6\\x12\\xc7\\xf2\\xe7\\x71\\xa4\\x6b\\xd2\\x62\\x4c\\x99\\xea\\x2b\\x6c\\xcb\\xca\\x99\\x6c\\x1d\\x9c\\x37\\x55\\x54\\xf2\\xa5\\x51\\x61\\x9c\\xe6\\xd5\\xe6\\xe4\\xd6\\xb8\\x44\\xa4\\xdb\\xea\\x83\\xba\\x73\\x23\\x31\\xfc\\xf4\\x65\\x72\\xc1\\xfb\\x0e\\x25\\x7c\\xe1\\x04\\x1b\\x26\\x5d\\xf0\\x2e\\x69\\x0a\\x92\\x81\\x4b\\xbf\\x3b\\x5e\\xca\\xc6\\x9e\\xe9\\x98\\x76\\x6a\\x02\\xb0\\xd2\\xf9\\x08\\xb3\\xc1\\x5f\\x95\\x26\\x99\\x61\\x6f\\x2c\\x07\\xd5\\x89\\x19\\x89\\x89\\xe6\\x05\\x6c\\x16\\x31\\x9a\\xab\\x6c\\xf8\\x77\\x19\\x02\\xc0\\x78\\x04\\x6a\\x88\\xb2\\x57\\x0c\\x13\\xbc\\x5e\\xde\\xba\\x2e\\xd1\\xe3\\xba\\x13\\x1d\\xaf\\x94\\xe6\\x89\\x18\\x62\\xbb\\x3d\\xe7\\xd1\\x06\\x3f\\xe4\\x05\\x30\\x7a\\x5c\\xd9\\x75\\x69\\x3e\\x9d\\x58\\xe1\\x7c\\x69\\x0e\\xee\\xf4\\xa2\\x60\\x3c\\xaf\\xc6\\x8c\\x2b\"},\n{{0xe5,0x71,0x18,0x9b,0x5c,0xd9,0xe7,0x88,0x30,0x2d,0xe3,0x91,0x9d,0x85,0x0c,0x22,0x7d,0xcb,0xb6,0x15,0x02,0x2e,0x56,0x8b,0xda,0xeb,0x37,0xac,0x5b,0x29,0x39,0xc5,},{0xed,0xda,0x89,0x0f,0x42,0xdd,0x5f,0xbc,0x73,0x16,0xa5,0xfa,0xdf,0xbe,0xc3,0x85,0x56,0xf2,0x3f,0x51,0xb8,0xef,0xd2,0x62,0x54,0x37,0xf6,0xb5,0x06,0x9f,0x1e,0xe5,},{0x7f,0x79,0x7a,0x31,0x71,0x5d,0x7c,0x35,0x6f,0x8f,0x1f,0x78,0x37,0x00,0xaa,0x99,0x74,0xbb,0x93,0x6d,0x66,0x16,0x61,0xad,0x96,0x8c,0x7c,0xde,0x1a,0xc9,0xe7,0x67,0xbe,0x56,0xa2,0xdd,0x49,0xb9,0x23,0x0e,0x90,0x11,0x0c,0x67,0xc0,0xed,0x18,0x7c,0xb7,0xe7,0x5c,0x30,0x53,0xec,0xe8,0x44,0x98,0x4d,0x29,0x6f,0x0d,0x85,0xcb,0x07,},\"\\xb6\\x2c\\x86\\x7a\\xd6\\x22\\x74\\x35\\xbf\\xa6\\xda\\xb8\\x30\\x68\\x4e\\x38\\xd1\\x96\\xe1\\xf8\\x61\\xaa\\xde\\x0f\\xd6\\xa7\\x69\\x9b\\x6d\\x60\\x90\\x1f\\xef\\xb2\\xd7\\x99\\xc3\\x5c\\x6f\\x3d\\x8b\\xb9\\x4d\\xee\\xe8\\x34\\x40\\x39\\x81\\x86\\x6b\\xab\\x84\\x94\\x6a\\xe9\\x47\\x6c\\x75\\xe9\\xf1\\xd3\\x60\\x2b\\x42\\xcb\\x2d\\xb4\\x37\\xbf\\xf3\\x3a\\x77\\x58\\x22\\xf0\\xd6\\xa2\\x57\\xd4\\xb7\\x54\\x00\\xeb\\xa5\\xb8\\xab\\xb3\\x14\\xb7\\x1f\\xc6\\xb4\\x6f\\x8a\\x34\\xe8\\x61\\xa9\\xa6\\x2a\\xbf\\x33\\xde\\x84\\x82\\xf6\\x3f\\x9d\\x71\\x69\\xe7\\x73\\xa2\\xdc\\xeb\\xee\\x03\\x70\\x5d\\xac\\x11\\x7f\\xd1\\x49\\x9b\\x68\\xe7\\x41\\x4f\\x51\\xff\\x94\\x37\\xf2\\x53\\xa1\\xd9\\x90\\x1e\\xc3\\xb0\\xbb\\xa8\\x69\\x65\\xa1\\x93\\x83\\x65\\x54\\x87\\xb5\\x80\\x10\\xf8\\x04\\x90\\x9d\\xe1\\xff\\xb2\\x21\\x2c\\x02\\x52\\xdd\\xd9\\xbf\\x2a\\x56\\xac\\x46\\xbd\\x59\\xc0\\xc3\\x4d\\xd5\\x9e\\x46\\x59\\x8b\\x6b\\xab\\xd4\\xe5\\xf3\\xff\\xfd\\xe5\\x5e\\x48\\xda\\xb0\\x39\\x8c\\x22\\xaf\\x9e\\x26\\xba\\xdd\\xf7\\x72\\x75\\xe5\\xf0\\x17\\xb3\\x5a\\x9b\\x8f\\x84\\x35\\xf9\\x63\\x19\\x36\\xb3\\x91\\xcb\\x95\\xd7\\xad\\xf3\\x5d\\x1d\\x85\\x45\\xa0\\xfd\\x06\\x64\\x12\\xd5\\x08\\x96\\x7b\\xbe\\x9a\\x20\\x24\\x5a\\x26\\x9e\\x3b\\xe2\\x77\\x71\\x17\\xe7\\x5f\\xba\\xc1\\x70\\xdb\\xa3\\x52\\xbe\\x69\\xb2\\x54\\xd3\\x53\\xb3\\xb2\\xcb\\x3b\\x7e\\x21\\xb7\\x21\\xaa\\x9f\\xe0\\x44\\xf8\\x91\\x6b\\x4b\\x2a\\x6f\\x8c\\x28\\xf8\\xab\\xe6\\x6a\\xc9\\x2b\\x91\\x32\\x3a\\xc7\\x3a\\xfd\\x93\\xdf\\xbe\\xea\\xee\\xf2\\x6d\\x19\\xbd\\x9f\\x67\\xe9\\x9d\\x48\\xcd\\x2a\\xd2\\xd3\\xe5\\x5e\\x45\\xd2\\x4d\\x54\\xb5\\x0f\\x44\\xa3\\x9b\\x90\\xe2\\x42\\xeb\\xe9\\xb4\\x2b\\xeb\\xdb\\x23\\x0c\\x47\\x0b\\xdf\\xde\\x1b\\xc7\\x72\\x1c\\x31\\x20\\x00\\x84\\x77\\x39\\x3d\\xcc\\x2e\\x15\\xfd\\x22\\xb2\\x51\\xfe\\xb0\\xe1\\x8b\\x02\\x88\\x3c\\x07\\x8a\\xee\\x4f\\xb7\\x60\\x65\\x5a\\x67\\x1d\\xc7\\xb8\\xaa\\xdb\\x9a\\x56\\x24\\x20\\xa3\\xc2\\xef\\xa2\\xd3\\x42\\xe1\\xe0\\x09\\x9d\\x95\\x1b\\x42\\x24\\x29\\x84\\xf5\\x94\\xe6\\x91\\x4f\\xe2\\x82\\xb1\\xee\\x12\\x87\\x35\\x98\\x4e\\xf9\\x3a\\x66\\x9e\\x6e\\xcb\\xa2\\x6c\\x9f\\xcb\\x9f\\x09\\xf0\\x92\\x56\\x64\\x56\\x17\\xf1\\x39\\x2d\\x35\\x90\\x89\\x17\\xcb\\x8d\\x29\\xe0\\x89\\x7c\\x75\\x03\\xcd\\xdd\\x5d\\xe1\\x95\\x96\\x86\"},\n{{0x37,0x17,0x44,0xab,0x63,0xc1,0x15,0x61,0x39,0x29,0xa3,0x43,0x70,0x9b,0xb0,0x19,0xb7,0x35,0x7d,0xff,0x72,0xd2,0xa1,0x49,0xf1,0xd0,0xf7,0x1d,0x3a,0x20,0x1e,0xfe,},{0xe5,0x8a,0xbf,0xad,0x4a,0x13,0x85,0x9f,0x0a,0xcb,0x05,0xd0,0xe4,0x7d,0x59,0x63,0x8f,0x7b,0x1b,0x49,0x36,0x10,0x0b,0x98,0x8d,0x61,0xe6,0xe7,0x0e,0x22,0x66,0x7d,},{0x5e,0xae,0x4a,0xc7,0x2a,0xf0,0x17,0x4a,0xb2,0x56,0x52,0x7b,0x7c,0xd3,0x37,0xa0,0xe5,0x48,0x2e,0x61,0x5a,0xf0,0x68,0xdb,0x21,0xda,0xe3,0x5a,0x64,0x64,0x07,0x42,0x60,0x4d,0xf7,0x3f,0xd4,0xca,0x02,0xed,0x95,0x15,0xa5,0x60,0x8d,0x73,0x19,0x52,0x30,0xfa,0xdc,0xa7,0xb4,0x26,0xf0,0x2a,0x2f,0xbf,0xd0,0x20,0x61,0xaf,0x36,0x00,},\"\\xc2\\x19\\xde\\x1e\\x8d\\x7a\\xd8\\xdf\\x08\\xc4\\x93\\x77\\x39\\x6f\\xe7\\xc1\\xf2\\xd5\\x7b\\xd2\\x17\\x06\\x33\\xa0\\x0d\\x70\\x8f\\xaa\\xde\\xe1\\x80\\xce\\xba\\x92\\x84\\x9a\\x77\\x78\\x50\\x6c\\xbb\\x36\\x68\\x75\\xbf\\x91\\x24\\x70\\x18\\x94\\xce\\xcd\\xb3\\x38\\x51\\x47\\xd0\\x67\\x18\\x43\\x92\\x2a\\x64\\x9a\\xff\\x7c\\x43\\x5e\\xb5\\xa9\\xc7\\x49\\x27\\x50\\x30\\x72\\xd0\\x06\\x79\\x78\\x71\\x6d\\xc8\\x0b\\xe1\\x54\\x5a\\x2d\\xbf\\x5a\\x1c\\x38\\x53\\x6e\\x12\\xbd\\x77\\x20\\xc1\\x96\\x5d\\x38\\x03\\xa4\\xe8\\xaa\\x55\\x76\\x51\\x92\\xa1\\x3b\\x70\\x5c\\xa1\\x05\\x9d\\xed\\x0e\\x80\\x63\\x62\\xfc\\x5b\\xbe\\x6c\\x76\\xa1\\xc9\\x67\\x4b\\xb8\\x53\\x79\\x0f\\x7e\\x90\\xaf\\x00\\x75\\x3e\\x00\\x43\\x6d\\xa4\\x8c\\xd0\\x82\\xea\\xd6\\x4f\\xdd\\xb6\\x89\\x89\\x01\\x62\\x08\\x2f\\x84\\x82\\x92\\x4f\\x33\\xac\\xd6\\x04\\x64\\x0f\\x69\\x92\\x73\\x52\\xb4\\x3f\\x64\\x40\\x2d\\x27\\xa8\\x83\\xfa\\x6b\\x72\\xaa\\x70\\xd2\\x41\\xdf\\xfa\\xa1\\x70\\x1a\\x25\\xcf\\x10\\x79\\x35\\x82\\x60\\x79\\x38\\x75\\xf7\\x6a\\x29\\x78\\xe9\\xf9\\xf9\\xd6\\x86\\x34\\xeb\\x3f\\x5f\\x01\\xbd\\xe1\\xce\\x49\\xe5\\x92\\x12\\x52\\xf9\\x49\\xf0\\x82\\x79\\x5e\\x4e\\xaf\\xed\\x7b\\xe5\\xb4\\x9a\\x9f\\x95\\xed\\xbb\\x4a\\x13\\x53\\x2e\\x3f\\x3b\\x3b\\xe6\\x2e\\x26\\x52\\x23\\x12\\x53\\xa2\\x0c\\x1d\\x54\\x77\\xe8\\xf4\\xbc\\x57\\xed\\x76\\xfa\\x19\\xea\\xf0\\x3a\\x11\\xbb\\xa4\\x29\\xb6\\x49\\x6c\\xe7\\x62\\x46\\x17\\x0e\\x04\\x3b\\xc1\\x4f\\x2d\\x2f\\x70\\x3d\\x96\\x8f\\x1d\\xeb\\x09\\x38\\x87\\x15\\xc3\\x7c\\xb4\\x75\\x2d\\xa8\\xd4\\x64\\xe3\\x48\\xe0\\x31\\x3c\\x89\\x93\\xe2\\x41\\x33\\xa7\\xc5\\x45\\x28\\x4e\\x3c\\x9c\\x90\\x7d\\x01\\xb2\\x60\\xc4\\x88\\x3f\\x9c\\xb3\\xe3\\xdc\\x5b\\x6f\\x7f\\xb6\\xd7\\x55\\x36\\x36\\x5f\\x21\\x32\\xea\\xed\\xda\\xb5\\x70\\xe7\\x27\\x3a\\xfa\\xc0\\xbf\\xf5\\xc9\\xfc\\x0b\\x82\\x0f\\x20\\x78\\xe0\\x33\\x60\\x52\\xe1\\xfe\\x7b\\xde\\xc8\\x66\\x74\\xd0\\x99\\x8e\\xc7\\x8d\\xa1\\xc3\\xf3\\x47\\x51\\xf8\\x86\\x72\\x76\\x95\\xf3\\x5e\\xca\\x13\\x04\\xb1\\x47\\x34\\x76\\x6a\\xb0\\x5c\\x11\\x86\\x30\\x6d\\xed\\x9d\\xb3\\xee\\xf6\\x5d\\x3c\\x04\\x56\\xcd\\xae\\x81\\x81\\xaf\\xee\\x04\\xb2\\x96\\xc6\\x72\\x2a\\x88\\xc7\\xef\\x30\\x88\\xd2\\x6f\\x7f\\xe7\\x4b\\xc8\\x9c\\xf5\\x28\\x5c\\x68\\x8f\\x02\\x7b\\x7e\\x68\\x60\\x04\\x86\\xaf\"},\n{{0x49,0x8b,0x6e,0xe6,0x49,0x2d,0x53,0x23,0x1b,0x35,0x32,0xd1,0x93,0x57,0x8b,0xa7,0x5d,0x6a,0x89,0x4e,0x2e,0x53,0x00,0x34,0xe2,0x1a,0xb8,0xad,0x8d,0x2c,0x0d,0x1f,},{0xd1,0x24,0x66,0x5b,0x28,0xfa,0xcd,0x2d,0x17,0x94,0x6a,0x04,0xdf,0xe3,0xd1,0x29,0xa4,0x56,0x1a,0x2b,0x24,0xeb,0x32,0x6d,0x84,0xb6,0x2b,0x42,0x2e,0x44,0xdb,0xcf,},{0x11,0x2f,0x5c,0x6d,0x3b,0xcb,0x3d,0xd9,0x93,0x46,0xd3,0x2a,0xd6,0x9c,0xbf,0xac,0x3e,0x65,0x3b,0xef,0x29,0xc6,0x8a,0x33,0xf4,0x32,0x31,0xf6,0x6c,0xea,0x1d,0x0a,0x19,0x54,0x27,0xd6,0xe1,0x0c,0x0e,0x77,0xc5,0xd5,0x5f,0xe2,0x79,0x42,0x87,0xee,0x32,0xe5,0xe2,0x2b,0xaf,0xbb,0xd8,0x05,0x2a,0xd3,0x60,0x6b,0x90,0xf9,0x45,0x05,},\"\\x04\\x98\\xa5\\x9b\\x87\\xcd\\xae\\x28\\x69\\x55\\x47\\xe1\\x08\\x63\\xbc\\xe8\\x04\\xd9\\x7d\\xe0\\xac\\x80\\x08\\xf3\\xd5\\xfb\\x65\\x2c\\x17\\x57\\x41\\x9f\\xdc\\x9e\\x0f\\x97\\x36\\xf4\\xc5\\x9a\\x34\\xf2\\x1c\\xfc\\x74\\x59\\x9f\\xa7\\x88\\xfc\\xc1\\x0c\\x67\\x30\\xc7\\xdf\\x8c\\x3d\\x2c\\x1b\\x6a\\x78\\x6d\\x12\\x30\\xb6\\x55\\x85\\x71\\x9d\\x1c\\xb5\\xc4\\x90\\x35\\x9b\\x94\\x43\\x5d\\x6d\\xd6\\x71\\xf5\\x4d\\x6e\\x9a\\x19\\xb9\\xb5\\xaa\\xad\\x7e\\x0f\\x23\\x3f\\x87\\x97\\xdf\\x99\\x78\\x28\\xd8\\x8c\\xd9\\x2e\\xf0\\x89\\xef\\x7d\\xbf\\x1e\\x95\\x27\\x78\\x94\\xa2\\xf7\\xc2\\xfd\\x0c\\x8e\\x4d\\xfd\\xfa\\x6d\\x3d\\x14\\x58\\x9f\\xf0\\x19\\x16\\xdb\\xf9\\xdd\\xd8\\x11\\xc2\\xf5\\xe0\\x1e\\x94\\x29\\x89\\x90\\xa1\\x45\\xa6\\xcf\\xc2\\x68\\x95\\x61\\x4c\\x7c\\x96\\x3f\\xef\\x30\\x8a\\x4e\\x38\\x56\\xc3\\x2d\\xd3\\xe3\\x59\\xbc\\x56\\xd2\\xcc\\xa4\\x96\\xad\\x19\\x9f\\xf1\\xa5\\x68\\xd6\\x43\\x0a\\xc5\\xcd\\x20\\x8e\\x0e\\x2d\\x07\\x80\\x3c\\xa5\\x23\\xe0\\xd8\\x13\\xad\\x37\\x33\\xab\\x50\\xbd\\xca\\xdc\\xb9\\x88\\xae\\xe7\\x58\\xea\\x50\\x43\\x9b\\xf3\\x8e\\xe6\\x49\\x99\\x76\\x04\\xf1\\x51\\xc6\\x02\\xc8\\x29\\x00\\xa8\\x20\\x5d\\x8f\\x6f\\x67\\x0c\\x86\\x84\\xbf\\x5a\\xbb\\x5f\\x75\\xff\\x29\\xa3\\x7e\\xb9\\xbf\\x81\\x05\\x19\\x9f\\xbb\\xfb\\x47\\x07\\xe1\\x62\\xe6\\x4c\\x71\\x52\\x70\\xf8\\x53\\xe6\\x48\\xb0\\xaa\\x26\\xfe\\xa0\\xf6\\xdb\\x56\\x28\\x96\\xbf\\x42\\x4a\\x9f\\xfc\\xb2\\x92\\xfa\\xe8\\x5b\\x76\\xce\\xfb\\x8b\\xd5\\xa4\\xb3\\xce\\x1f\\xb3\\x9b\\xd2\\xa5\\x0d\\x0c\\x9e\\x6d\\x93\\x3e\\x16\\x7f\\xf6\\x29\\xb8\\xa4\\x94\\xf2\\xa9\\xb7\\x74\\xeb\\x30\\x3c\\x78\\x1e\\xa0\\x2a\\xff\\x1a\\x8a\\xfa\\xdc\\x24\\x65\\xcc\\x61\\x69\\x68\\x01\\x5e\\xd6\\xa5\\xa3\\x3c\\x31\\x20\\xb9\\x45\\xed\\x53\\x51\\x98\\x1e\\x32\\xfb\\x9f\\xb9\\x6b\\x22\\x12\\xdc\\xf8\\xfe\\x9a\\xc5\\x6e\\x3c\\xf4\\x1d\\xc5\\x24\\xf8\\x00\\x63\\x10\\x20\\xb0\\x25\\x91\\x91\\x78\\xce\\x07\\x4e\\xef\\x07\\x8d\\x68\\x42\\x01\\x2a\\x27\\x6e\\xfa\\x62\\x8d\\xb5\\x40\\x58\\xd1\\xeb\\x5b\\x5b\\x70\\x5f\\x1e\\x18\\x18\\xd2\\xdf\\x51\\x64\\xba\\xab\\xb0\\xc6\\x19\\x56\\xec\\xdb\\x8c\\x70\\x6e\\x56\\x2f\\xc4\\xfd\\x64\\x05\\x28\\x70\\x53\\x0a\\xe4\\x25\\xb2\\x21\\xf8\\x9d\\xd6\\xf9\\x0d\\xab\\x88\\x2e\\x76\\x3e\\x7a\\x7f\\xfa\\x14\\x1b\\xba\\xa8\\xbf\\x7a\\x3f\\x21\\xb0\"},\n{{0xce,0xfc,0xfc,0xd1,0xcf,0xf4,0xd8,0x91,0x07,0x49,0x27,0x91,0x31,0x83,0x0b,0x1d,0xa1,0x9d,0xfc,0x52,0x45,0xf7,0x8c,0xa6,0x8b,0x8c,0x3c,0x1b,0x62,0x2b,0x45,0x51,},{0x1d,0x39,0x4a,0xbd,0x1b,0x4e,0xd1,0xae,0xdf,0x96,0x6a,0x60,0xef,0xd3,0xff,0x88,0x21,0x40,0xa7,0xe5,0x6b,0x42,0x83,0x74,0xec,0xb4,0x43,0x28,0x9a,0x9c,0x7f,0x00,},{0x7d,0x83,0xff,0x66,0xec,0x79,0x30,0x7b,0x1c,0x0c,0x09,0x3f,0xda,0x39,0x68,0xa9,0x6c,0xf6,0x04,0x4f,0x5c,0x80,0x28,0x88,0x58,0x40,0x18,0x84,0x5e,0x7c,0xaf,0x2a,0x13,0x5a,0xc6,0xf1,0x67,0x7e,0x84,0xd2,0x2e,0x45,0x8e,0x22,0x7e,0x4f,0x93,0x02,0x09,0x91,0x9b,0xc1,0x1b,0x12,0xf7,0xaa,0xf2,0xb8,0xc9,0x43,0x02,0xd6,0x42,0x00,},\"\\x5e\\xc9\\x4e\\xd0\\x6f\\xc1\\x25\\x7a\\xe9\\xc1\\x83\\xce\\x56\\x27\\x12\\x07\\xac\\xa3\\x7a\\x23\\xfd\\xb4\\xb0\\xe7\\x4a\\xc9\\x30\\x7a\\x1b\\xb1\\x12\\xe0\\x5e\\xd5\\xa5\\xd0\\x47\\xc9\\x31\\x09\\xe2\\xe5\\x94\\x77\\xb0\\x33\\x78\\x34\\x64\\x22\\xde\\x36\\x71\\x4c\\x29\\x61\\xbb\\x97\\x36\\xa5\\x13\\xca\\x36\\x71\\xc6\\x03\\xa6\\x8c\\x2b\\xe7\\x31\\x7b\\x1b\\x52\\xa0\\x76\\xda\\xe2\\xaf\\xf7\\xbc\\x88\\xcd\\x5e\\xea\\x0a\\xa2\\x68\\xfa\\xaa\\xda\\xe5\\x39\\xc9\\x38\\xbb\\x4f\\xd4\\xb6\\x06\\x9b\\x19\\x45\\xeb\\x6a\\xf0\\xc9\\xe6\\xc8\\xaa\\x5e\\xe4\\xa4\\xaf\\x37\\xe9\\x0c\\x67\\xe2\\x48\\xe8\\xd2\\x7b\\xd7\\xf9\\x58\\x9c\\x4d\\x30\\xe9\\x05\\x65\\x1b\\xaf\\x45\\x36\\x4f\\xa0\\x49\\x95\\x7e\\xa5\\xd9\\xb7\\x14\\x6c\\xa6\\x82\\x04\\xe5\\xe9\\x73\\xd0\\xf1\\xc9\\x1a\\x1c\\x4b\\xde\\xd6\\x61\\x15\\x02\\x8a\\x71\\x11\\x4f\\x0f\\x4f\\x85\\x1b\\xd1\\x15\\xfa\\xeb\\x95\\x4e\\x3f\\x71\\xa0\\x14\\x70\\xb2\\x48\\x1a\\x00\\x98\\xd9\\x9f\\x9d\\x74\\x89\\x8c\\x8b\\xa0\\x28\\x7c\\xc7\\x83\\x41\\x55\\x21\\x41\\x73\\xd1\\xfc\\xba\\xfc\\xfe\\x9b\\x08\\x25\\x03\\x84\\x43\\x94\\x76\\x05\\x58\\x83\\x83\\x38\\x16\\xc9\\x52\\x4c\\xfd\\x57\\x44\\xaa\\xa2\\x59\\xdb\\x7e\\xbd\\x3a\\x6a\\xa2\\x0b\\x5a\\x65\\x46\\xda\\xde\\xfd\\x14\\x06\\x68\\xeb\\x0e\\xcc\\xb5\\xf6\\x68\\xdb\\x9f\\xc6\\x29\\x83\\xdf\\x98\\x08\\x50\\xc9\\xd1\\x98\\x82\\xa1\\x75\\x50\\xd5\\xdc\\xa3\\x54\\x2c\\xd3\\x60\\x03\\xa0\\xd0\\x3c\\xff\\xb0\\x45\\x75\\xa3\\xe8\\xe1\\xd0\\x70\\x15\\xc7\\xb3\\x0e\\xca\\x91\\x15\\xcd\\x2b\\x72\\xe4\\x6d\\xfd\\xdf\\x6a\\x4d\\xda\\x1f\\xaa\\x2d\\xbd\\xc8\\x90\\x00\\xd4\\x33\\xf6\\xec\\x9a\\xdc\\x46\\x14\\x6d\\x93\\x9f\\x32\\x12\\x1b\\x99\\xb2\\x89\\x83\\xd9\\x8b\\x9d\\xde\\x8c\\x3f\\x6e\\x57\\x79\\xf2\\xb0\\x70\\x0c\\xb0\\x23\\xdb\\x13\\xde\\x65\\x6e\\x0a\\xed\\x1d\\xa2\\xd5\\xc6\\xba\\x26\\x52\\x34\\x36\\x48\\xad\\x42\\x0f\\x6a\\xb9\\xe5\\x5a\\x97\\x48\\x2a\\x1a\\x22\\xb3\\xbc\\x2e\\xe5\\x98\\x62\\x9a\\xba\\xd9\\x54\\x7e\\xdb\\x5f\\xf7\\x90\\x99\\x05\\x64\\xbd\\x87\\x1f\\x81\\xb2\\x4b\\x12\\xf2\\xbf\\x8d\\xbd\\xfe\\x7a\\x88\\x37\\x5f\\xad\\x9c\\xcb\\xd9\\xfc\\x0b\\xa1\\xd3\\xbb\\xa5\\xe3\\xc4\\x81\\x3c\\x18\\xa0\\x34\\x8a\\xad\\x83\\xfb\\x1b\\x82\\x68\\x90\\x54\\xd9\\x9b\\x46\\x00\\xdd\\x17\\x60\\xd0\\xdc\\xce\\x44\\x75\\x74\\x67\\xbe\\xc1\\x94\\x64\\x06\\xd5\\x30\"},\n{{0xd1,0x07,0xcf,0x26,0xf5,0x27,0xdb,0x71,0xa2,0x06,0xe4,0x1d,0x17,0x95,0x53,0x21,0x01,0x32,0x25,0xbb,0x20,0xf9,0x3e,0x12,0xdf,0x3d,0xc7,0x39,0x9e,0x72,0x0c,0xa3,},{0x18,0x6b,0xf4,0x53,0xc9,0x5d,0xc0,0xa2,0xfd,0x58,0x9a,0x78,0xe2,0xc8,0x00,0x40,0xb3,0xf6,0xdd,0xf9,0xa6,0xf8,0x68,0x1d,0x14,0x60,0x36,0xcf,0x21,0x46,0xe8,0xfc,},{0x80,0x71,0xd9,0x7f,0x32,0x4f,0x10,0x35,0x8f,0x13,0xac,0x8c,0x61,0xd4,0x24,0xb4,0xf3,0x00,0xdd,0x04,0x19,0x57,0x1c,0x39,0xe4,0x0d,0x99,0xae,0xa5,0xf0,0x31,0x40,0xe6,0x2a,0xb4,0xc9,0x71,0x27,0xab,0x33,0xe9,0x82,0x69,0x96,0x6a,0xe1,0xd4,0x55,0x7e,0x45,0x9b,0xf7,0xf5,0x97,0xb3,0x13,0xf3,0x51,0xa2,0x01,0x22,0xf0,0x66,0x0e,},\"\\x78\\xeb\\x9e\\x13\\x78\\x99\\x28\\xa7\\x4f\\x36\\x01\\x41\\x72\\x8e\\xde\\x98\\x38\\x96\\x85\\xc8\\x36\\xb9\\x1f\\xaf\\xbf\\x1a\\x7e\\x8c\\x19\\xcf\\xbe\\x21\\xbd\\x3c\\x3d\\x6c\\x6e\\xd8\\x3c\\x40\\x9e\\xf6\\x93\\xf1\\xd7\\x35\\xda\\x3f\\xa4\\x66\\x49\\x7e\\x19\\xf3\\x8e\\x30\\xfb\\xa2\\xa1\\x02\\x37\\x85\\x45\\x90\\x70\\xe6\\xe9\\x2c\\x1c\\xb7\\xc9\\xbd\\x0c\\x9b\\xa6\\x12\\x20\\x15\\x78\\x66\\xc3\\xbe\\xd2\\xb0\\x1e\\x6e\\x6b\\x9b\\x8d\\xd3\\xf0\\xc4\\x7c\\x02\\xf1\\x81\\x34\\x6a\\x0a\\x9b\\x9b\\x5d\\x3d\\x7e\\x18\\xa9\\x4d\\x69\\x56\\x85\\x5e\\x16\\xe8\\xea\\xaa\\xab\\x71\\xb1\\x03\\x02\\xf3\\x5b\\xd8\\xfb\\x1f\\x9b\\x58\\x47\\x30\\x41\\x60\\x32\\x49\\x26\\x64\\x5b\\x05\\x82\\xc2\\xf2\\xf1\\x53\\x3a\\x24\\x28\\x14\\x61\\x51\\x42\\x41\\xdb\\x28\\x50\\xef\\x31\\xc5\\x76\\x3b\\x2e\\x3d\\x4f\\xb1\\x8f\\xc6\\xd8\\xc1\\xd7\\xe5\\x2f\\x7c\\x13\\x39\\x2c\\x17\\xe2\\x70\\x19\\xff\\x60\\x00\\x8e\\x43\\x1f\\x17\\x14\\x37\\x0b\\xc0\\xef\\xd9\\x45\\x2a\\x61\\xf5\\xc5\\x64\\x88\\xd9\\x1a\\x18\\x50\\x37\\xf1\\xf6\\x47\\xf7\\x2f\\xa7\\x85\\x01\\x0d\\x5d\\x78\\xf0\\xa1\\x15\\x87\\xcc\\xf6\\x6b\\x80\\x88\\xe0\\xe6\\x35\\xff\\xf3\\x77\\x41\\x93\\xb2\\xed\\xef\\xfd\\x92\\xd6\\xe8\\xa0\\x32\\x11\\x28\\xae\\x64\\xcd\\xb8\\x62\\xe6\\x31\\xe2\\xee\\x5b\\xa0\\xda\\x44\\xbb\\xd5\\x89\\xdc\\x39\\x2b\\x5a\\x11\\x3b\\x86\\xa7\\x27\\xa8\\xdd\\xb6\\x98\\xa3\\x34\\xcc\\x66\\x8b\\x39\\xb1\\xcd\\xe1\\x99\\xb8\\x88\\x37\\xca\\x5f\\x00\\xf5\\x53\\xf8\\x9c\\x62\\x28\\x34\\x27\\x36\\x41\\xd3\\x9b\\xc1\\x0c\\x6a\\x24\\xe1\\xeb\\x42\\x58\\x75\\x42\\xf0\\x3f\\xc1\\x62\\x75\\x24\\xed\\x6b\\x74\\x93\\x91\\xf1\\x10\\x28\\x70\\x6c\\x42\\x36\\x44\\x25\\xb2\\xca\\xf2\\x01\\x80\\xe1\\xb8\\x02\\xc7\\x44\\xb4\\x9b\\x7b\\xcd\\x9b\\xf7\\xb1\\x5c\\x23\\xa0\\xbf\\x1c\\x69\\x65\\x96\\x0d\\x34\\x15\\x54\\xe1\\x96\\x6b\\x6e\\xf8\\x2f\\xcf\\xbb\\xe4\\x1d\\x1e\\x09\\xd7\\x41\\xe3\\x09\\x25\\x44\\x46\\x77\\x7f\\x13\\xc2\\x9a\\x67\\xb8\\xbd\\xeb\\xc5\\xf7\\xf0\\x4d\\x16\\x0d\\x60\\xe3\\x32\\xe3\\xd0\\x44\\x1a\\x0f\\x2f\\x7b\\x19\\x2c\\x3e\\x2b\\xdf\\x6d\\xad\\xec\\x2a\\x42\\x4f\\x88\\x66\\x98\\x06\\x23\\x6e\\xe0\\x4d\\xea\\x69\\x2b\\xd8\\xbb\\x6f\\x91\\xca\\x06\\x82\\xec\\xe3\\x49\\x14\\x25\\x75\\x35\\x8b\\x9b\\x7b\\xe7\\x06\\x00\\xb3\\xcb\\x81\\xe1\\x45\\x6b\\xa0\\x79\\x9f\\xdc\\x01\\xff\\xd6\\x86\\x23\"},\n{{0xaf,0x7e,0xa8,0xe4,0x1c,0x89,0x37,0xa4,0xec,0x47,0x5a,0xd8,0x13,0x71,0xa1,0x71,0xd3,0xd0,0xf9,0xfd,0x75,0x19,0xa0,0x4c,0x75,0x1e,0xd4,0xad,0x8f,0xf8,0xfe,0xf9,},{0x15,0xdf,0xc7,0x15,0x85,0xba,0xc7,0x1e,0xf2,0x0f,0x37,0x49,0x87,0xc5,0x55,0xa3,0xf2,0xf0,0x7d,0x6b,0x9c,0x78,0x70,0x66,0xc1,0x0d,0x63,0xcf,0x06,0xe0,0x2a,0xb0,},{0xc0,0xf1,0x73,0x91,0x67,0x27,0x4b,0xf9,0x18,0x31,0xc7,0x4b,0xeb,0x64,0x5a,0xf7,0x90,0x45,0x9b,0x28,0xbb,0x3f,0x21,0x32,0x53,0x65,0x13,0x0f,0x40,0x9a,0xcb,0x66,0xdf,0x1d,0x22,0x37,0x59,0xa9,0x75,0x8e,0x08,0xfd,0x72,0x53,0x73,0x74,0x84,0xe2,0x85,0xa6,0xfb,0x47,0x40,0x4a,0xbe,0x2e,0xba,0x5e,0xf2,0x49,0xfd,0x02,0x5c,0x0a,},\"\\x05\\xf2\\x26\\x3f\\x02\\x45\\xec\\xb9\\xfa\\xeb\\x14\\xe5\\x7a\\xca\\x43\\x66\\x68\\x30\\x8c\\x81\\x25\\xdf\\x31\\x16\\xc4\\xee\\x20\\x50\\x1d\\x0c\\xde\\x70\\x1b\\x36\\x6e\\x2b\\x50\\xa1\\xc5\\xed\\xf4\\x84\\x14\\x4c\\xe1\\x6b\\xfb\\x1f\\x7d\\x26\\xdc\\x42\\x75\\xea\\x97\\x32\\xe2\\x64\\xba\\x4d\\x4a\\x36\\x2b\\x40\\x27\\x5b\\xa4\\x73\\x77\\xdb\\xc3\\x32\\xcb\\x65\\xe2\\xf4\\xc8\\x85\\x38\\x94\\xaa\\x87\\x8a\\x4c\\x17\\x5d\\xc5\\xb3\\xb2\\xa7\\x57\\xff\\x3c\\x8d\\x7d\\xe6\\x60\\x97\\x3b\\x89\\xda\\xdf\\x07\\x6e\\x2e\\x4f\\xc7\\x62\\x39\\xb7\\xbc\\x75\\x2a\\x22\\x9d\\x44\\xe0\\x00\\xce\\xb6\\x67\\x10\\x4c\\xb0\\x74\\x6b\\xfc\\xf5\\x9d\\x69\\x60\\x3a\\xe7\\xfc\\x1b\\xcf\\x11\\xd2\\xe3\\x3f\\x61\\xdc\\x49\\x7e\\xc1\\xb0\\xbd\\x5e\\x4f\\x1d\\xbe\\xf4\\x35\\xf2\\xf2\\x91\\xf3\\x0b\\x00\\xa8\\x5e\\x83\\x39\\x46\\xc8\\xb1\\x04\\x84\\xe4\\xab\\xd7\\xd6\\x0b\\xdb\\xb1\\xfe\\x6d\\xff\\x58\\x07\\xa5\\x3b\\xb8\\x93\\x82\\x15\\x30\\x13\\xb7\\x0c\\xa0\\x8e\\xfc\\x91\\xb7\\xe9\\xfc\\x5b\\x5d\\xbb\\xb6\\xaf\\x12\\x3b\\x57\\xbe\\x2e\\x14\\x0f\\xc4\\x71\\xa4\\x5d\\x89\\xfa\\x82\\x84\\xcc\\x27\\xe0\\xa1\\xfe\\x77\\x1f\\x55\\x59\\x8b\\xbd\\xcf\\x06\\x8d\\x50\\x6d\\xad\\x0a\\x59\\x21\\x79\\xce\\xca\\x39\\xee\\x95\\x26\\xf9\\xe4\\xfe\\x47\\xbf\\x2b\\xb1\\x4f\\xb1\\x48\\x6a\\x67\\x7d\\x4d\\x7b\\x99\\xa5\\x20\\x54\\x56\\x76\\xa0\\xf1\\xfa\\x80\\x90\\x49\\xaa\\x24\\x14\\xae\\x7b\\x81\\x7d\\x9a\\x03\\x6e\\x5c\\x15\\x78\\x86\\xe8\\x34\\x1d\\x4e\\x81\\x9c\\x09\\x2a\\x3b\\x48\\xb3\\x60\\x6b\\x03\\xac\\xb7\\x27\\xc6\\xc2\\x21\\x7d\\x0a\\xf3\\x01\\x21\\x54\\x6a\\x94\\xaf\\x6b\\x49\\xca\\xa2\\xa8\\xc9\\xb1\\x78\\x6f\\xa0\\xc2\\xa5\\x24\\xec\\x7a\\x02\\x3e\\x92\\x4b\\x5f\\x8a\\x89\\xa5\\x37\\x80\\xc7\\xf8\\x78\\x1c\\x5b\\x8e\\x86\\x94\\x30\\xca\\xa0\\xe6\\xd0\\x43\\x79\\x67\\xe3\\xae\\xd4\\x4f\\x45\\xc9\\x01\\xcb\\xcf\\x10\\x26\\xfb\\xbd\\x4e\\x3d\\xd9\\xa0\\x91\\xec\\xf8\\xb3\\x4f\\x7d\\xd5\\x03\\x8e\\x54\\x3d\\xc7\\xeb\\x6a\\xd5\\x49\\x4e\\xfb\\x14\\x5c\\xf6\\x3e\\xc0\\xd3\\x55\\xbb\\x8e\\x17\\x2f\\x45\\x5d\\x8a\\x6b\\x13\\xda\\xca\\xad\\xdb\\xc5\\x6e\\x47\\xde\\x3c\\xf7\\x62\\xa1\\xa7\\x38\\xef\\x09\\x2f\\x14\\x36\\x68\\x04\\x67\\xb5\\xcd\\x82\\xe9\\xe3\\x6e\\x2d\\x2b\\x68\\x42\\xb3\\xbd\\x5d\\xce\\x77\\x18\\x0d\\xda\\xf0\\xb6\\x43\\x37\\x8e\\x69\\x85\\x99\\xdd\\x47\\xf5\\xcd\\xbb\"},\n{{0x0c,0x57,0xcb,0xfc,0xeb,0xde,0x10,0xed,0xe0,0x2d,0x1c,0xb0,0x1d,0xf3,0x60,0xd4,0x1f,0x2e,0x66,0xa5,0x04,0x43,0xd5,0x8b,0x5d,0x4f,0x08,0x28,0xc9,0xa1,0x8b,0xb7,},{0xc4,0xd7,0x61,0xba,0x18,0x99,0x71,0xb9,0x46,0x2c,0x61,0xbf,0x46,0xa7,0x65,0xf8,0x8e,0x2e,0xca,0xa5,0xbf,0x22,0x11,0x22,0x0a,0xfb,0x00,0xac,0x65,0x7f,0x7c,0xe5,},{0x8a,0xf7,0xbb,0xe0,0x1b,0x8a,0xb9,0x39,0x51,0xd1,0x6f,0xca,0x05,0xa9,0xc9,0x67,0xd1,0xc5,0x2c,0x97,0x4b,0xea,0x15,0x1e,0xa7,0x2e,0x4c,0xeb,0xaa,0x20,0xcc,0x78,0x3b,0xb6,0x1d,0x8d,0x69,0x38,0x5c,0xac,0x5b,0xc6,0xd7,0x2d,0xbd,0x16,0x2b,0xee,0xf1,0xfc,0xb5,0xdd,0x0e,0x0a,0x08,0xb4,0x8c,0xa0,0xb9,0xf6,0xd9,0xa9,0x88,0x0c,},\"\\x33\\x77\\x03\\x24\\x3a\\xb5\\xb4\\xe4\\xd3\\x48\\x1e\\xe8\\xdd\\x1f\\x44\\x94\\x50\\x71\\x74\\x41\\x26\\x58\\xa9\\x39\\x88\\xb5\\xc3\\x04\\x03\\xa7\\xb7\\xed\\x85\\x22\\xce\\xb4\\x6f\\xa1\\xee\\x02\\x75\\x3a\\x87\\x4e\\xf0\\x67\\x5d\\x39\\x7c\\x57\\x5d\\xa0\\xb0\\x8c\\xaa\\x8c\\xee\\x33\\x93\\x78\\x4d\\x0f\\x0d\\xb8\\x45\\x98\\x37\\xaf\\x90\\xb9\\x05\\x6d\\xf4\\xe3\\x8e\\x41\\x7f\\x3a\\xd2\\xeb\\x1a\\x10\\x0e\\xf2\\x07\\xce\\x2c\\xa6\\xc6\\x10\\x01\\x80\\x21\\x66\\x1e\\x30\\x70\\x99\\xf2\\xb7\\xc4\\xae\\x87\\x59\\x91\\x14\\x0b\\xdd\\x3f\\x0f\\x99\\xad\\x2c\\x5d\\x55\\xaa\\xcb\\x84\\xcc\\x1c\\xdc\\xd5\\x79\\xe0\\x80\\x72\\xb6\\x95\\x1f\\xd4\\x5e\\xd2\\x89\\xac\\x9f\\xf7\\xf0\\x98\\x6a\\xc8\\x8a\\x4f\\xbb\\x9d\\xc9\\x20\\x3d\\x9b\\xaf\\x18\\x0c\\x90\\xed\\xf9\\x37\\x25\\x8c\\x9d\\x0a\\x6d\\x48\\xe2\\x20\\xf7\\x2d\\x25\\x0c\\x7f\\x2c\\x77\\x7e\\xaa\\x7f\\xb9\\xfa\\x11\\xd5\\x0a\\x57\\x98\\x77\\x2f\\x9f\\xd9\\x76\\xb0\\x05\\x99\\xf1\\xf0\\x27\\x6f\\x3a\\x2e\\x4d\\x98\\x8a\\xe9\\x21\\x25\\x46\\x7a\\x8d\\xed\\xb7\\xa1\\x6f\\x9e\\x3a\\x56\\xe8\\xd0\\x06\\x62\\xb3\\xeb\\x67\\xa3\\x5b\\x9b\\x60\\xe7\\x3b\\xd9\\x35\\x07\\x7e\\xe2\\x38\\xdf\\x8f\\x6e\\x83\\x3b\\x9a\\x55\\x23\\x38\\x68\\x26\\xc1\\xf2\\x91\\x7b\\x1c\\x3e\\xc9\\x8e\\x0a\\x5f\\xde\\x89\\xc4\\x8b\\x1d\\x44\\x6d\\xa5\\xd0\\xc8\\x85\\xfe\\xf0\\xe3\\x74\\xbf\\xf3\\x0a\\x99\\x7c\\x7b\\xaf\\xd5\\xe7\\x43\\xc8\\x5d\\x0c\\x6a\\xaa\\x6e\\xf1\\x0a\\x06\\x12\\x11\\xa2\\x32\\x7c\\x6d\\x84\\xeb\\x74\\x7a\\x56\\xe9\\xbf\\x60\\xfc\\xd5\\xb5\\x53\\xb7\\x98\\x83\\x4d\\x0c\\x5c\\xca\\xdb\\x9d\\x4b\\x54\\xe7\\x23\\x7d\\x12\\xc6\\x79\\xc1\\x93\\xa2\\x87\\xbb\\x2f\\x51\\x1c\\xd4\\xee\\x2a\\x2d\\x85\\x49\\xb4\\x4b\\x21\\xc1\\x1f\\xbe\\x57\\x23\\x38\\x1c\\x6c\\x5f\\x78\\x46\\x87\\xfd\\x90\\xce\\xbc\\x5b\\x49\\x5a\\xf9\\xe4\\x14\\xf2\\x96\\x1b\\x06\\xa1\\xc8\\x43\\x3b\\x9a\\xa3\\x29\\x2b\\xcf\\xf4\\x24\\x1c\\x22\\x71\\x67\\xf8\\xd1\\xde\\x05\\x4b\\xa3\\x3a\\xd8\\x1d\\xa3\\xeb\\x3e\\xc6\\xe4\\x0a\\x6e\\x26\\x85\\x4a\\xf3\\x49\\x54\\x01\\x71\\xb7\\x5d\\x75\\xfb\\x9a\\x8d\\x12\\x93\\x78\\x27\\xfd\\x59\\x4d\\x31\\x7b\\x7a\\x8d\\x9f\\x1c\\x2f\\xca\\xbd\\xa5\\x63\\x75\\x56\\x8c\\x3e\\x9e\\x51\\x4c\\x2e\\xff\\xfc\\x38\\x78\\x36\\x3d\\xcf\\xad\\x9f\\xd9\\x54\\x36\\xb0\\x22\\xe8\\x77\\x2a\\x88\\xcb\\x71\\xe8\\x03\\xbf\\x90\\x38\\x19\\x62\"},\n{{0xfe,0x71,0x72,0x27,0x83,0x64,0x19,0x4b,0xcf,0xef,0xb4,0x78,0x31,0x42,0xb7,0x9f,0x59,0xd5,0xfd,0x97,0x8b,0x1e,0x47,0xc3,0x14,0xd7,0x8d,0x4c,0xb3,0xf6,0x1c,0x8a,},{0x2e,0x82,0xcc,0xe4,0x79,0x10,0xc7,0xe2,0xa7,0x9b,0xc1,0xf4,0x19,0xdc,0x3c,0x3d,0xf5,0x4f,0x23,0x29,0x1f,0xc8,0x19,0x3e,0x82,0x58,0xcc,0xd2,0xfd,0x38,0xd5,0x48,},{0xf6,0xc2,0xa4,0x29,0x6b,0x9a,0x34,0x07,0xc6,0xd7,0xa5,0x67,0x9d,0xae,0x86,0x66,0xb5,0x03,0xd1,0xa1,0x7e,0xac,0xf7,0x1d,0xf4,0x93,0x79,0x1b,0x8f,0xf0,0xc0,0xaa,0x8e,0xed,0x36,0xb3,0x27,0xa2,0x9a,0xb7,0x82,0x8f,0x46,0xf2,0x2d,0xe8,0x68,0xb6,0x28,0xb1,0xcf,0xd5,0x01,0xe8,0x59,0x9f,0xa3,0x16,0x93,0xb1,0x5f,0x61,0x08,0x0f,},\"\\x23\\x50\\x94\\x51\\xa0\\x59\\x96\\x9f\\x2b\\x4b\\xdf\\xce\\xe5\\x38\\x89\\x57\\xe9\\x45\\x6d\\x1f\\xc0\\xcd\\x85\\x7e\\x4f\\x4d\\x3c\\x25\\xa4\\x15\\x5d\\x5e\\xe9\\x1c\\x20\\x53\\xd5\\x58\\x06\\x2e\\xea\\x68\\x27\\x95\\x0d\\xe8\\x63\\xbc\\x9c\\x3d\\xf9\\x67\\x2c\\xde\\x8b\\xa7\\x41\\x74\\x4e\\xbb\\xdd\\xb4\\x5e\\xc1\\xf4\\x28\\x45\\x70\\xfd\\x0a\\xac\\xd0\\x7e\\xa5\\x8c\\x58\\x1b\\xe2\\xaf\\xc9\\x5a\\xe4\\x44\\xe6\\x78\\xed\\xc2\\xa0\\x24\\x39\\xf3\\x87\\xce\\xc9\\x82\\xea\\x3a\\x44\\x81\\x4a\\x8a\\x30\\x2b\\xb3\\xbf\\xe8\\x22\\x8d\\x58\\xde\\x03\\x9d\\xeb\\xdf\\x7c\\x2a\\x7e\\xdd\\xb4\\xe7\\x1c\\xa4\\x74\\xf9\\x4f\\x7e\\x2b\\xd8\\x9d\\xc6\\x5b\\x16\\x10\\x73\\x3c\\x91\\xff\\xf8\\x9b\\xd4\\x99\\xf4\\x01\\x54\\xa6\\x19\\x8f\\xdf\\x5e\\xc7\\xad\\x37\\x22\\xd9\\x25\\xb2\\x92\\x19\\x6c\\x42\\x94\\x99\\x07\\x5b\\xe0\\xc5\\xb6\\xda\\x9c\\x09\\x0c\\x07\\x91\\xa7\\x01\\x9e\\xb5\\xe7\\x36\\x6b\\xe6\\xce\\x58\\xab\\x2f\\x04\\xfe\\xcd\\x91\\x27\\xc4\\x27\\x18\\x04\\x7b\\xf4\\x70\\x30\\x69\\x15\\x21\\x31\\x2c\\x08\\x77\\xaa\\x3f\\x36\\xcc\\x5f\\xbc\\x9c\\xaa\\xe0\\xfd\\xe3\\x94\\x5d\\x2a\\x86\\x8e\\xe2\\x50\\x2a\\x38\\x33\\x20\\x8e\\xb8\\x50\\xa1\\x63\\xcf\\xcb\\xf6\\xda\\x9e\\xe6\\xad\\x9f\\xe0\\x67\\xfe\\x24\\x19\\x86\\xfe\\x44\\x36\\xd6\\xae\\x4e\\xdc\\x61\\x56\\x19\\x38\\xe2\\xa3\\x3f\\x4a\\x33\\xdb\\x63\\xf6\\x9d\\x3f\\x1a\\x88\\x50\\xed\\x40\\x02\\x88\\x69\\x16\\x41\\x03\\x48\\x8f\\xb7\\x95\\xcd\\x82\\xca\\x06\\x7f\\xe1\\xb4\\x89\\x7c\\xaa\\x49\\xa7\\xca\\x9a\\x80\\xf3\\xa8\\x15\\x1f\\xd1\\x3b\\xbb\\x7f\\xf3\\x50\\xe8\\x57\\x9f\\x56\\x5d\\xc1\\xc4\\xa9\\xca\\x93\\x8d\\x27\\xb1\\x5b\\x3f\\x85\\x8e\\xf4\\x5d\\x3d\\xd7\\x8b\\x2c\\x35\\x86\\x35\\x35\\x63\\x15\\xf5\\x5a\\x97\\x52\\x8e\\xcf\\xec\\x5d\\x11\\xa5\\xb7\\x21\\x50\\x31\\x07\\xfa\\xa4\\x06\\xc1\\x70\\x34\\xe6\\x01\\x47\\x4b\\x3b\\x60\\xcf\\x48\\x69\\x2e\\x26\\x92\\x61\\x15\\x8f\\xc3\\x53\\xd4\\xdf\\x42\\x74\\x38\\x13\\x57\\x79\\x0b\\x77\\x56\\x08\\x7b\\x00\\xcc\\x79\\xe3\\xb9\\xd2\\x8a\\x3f\\x24\\x39\\xfe\\xbf\\x19\\x9e\\x64\\xa8\\xb3\\x7c\\x91\\xb5\\xa4\\x33\\x4e\\x33\\x54\\xe8\\xfa\\xf3\\xa3\\x61\\xe8\\x56\\xc5\\x4b\\xda\\xa4\\x3b\\xfd\\xcd\\x6e\\xe6\\xc9\\xf9\\x67\\x95\\x88\\xf6\\x06\\x99\\x50\\x83\\x23\\x48\\xaa\\xcb\\xa2\\xbf\\xee\\xba\\xca\\xa2\\x07\\x1d\\xdc\\x7d\\x77\\x89\\x8e\\xf0\\xf6\\x87\\x93\\xcd\\x25\"},\n{{0xa9,0x51,0xe4,0xe6,0xba,0x9f,0x1f,0x0b,0x35,0x48,0x31,0xc9,0x86,0x94,0x24,0x48,0xfa,0xed,0xe3,0x7e,0x11,0xb0,0xf2,0x47,0xda,0x27,0x06,0xdc,0xee,0xf7,0x3a,0xc7,},{0x30,0x36,0x20,0x14,0x97,0x4b,0xf7,0x5c,0x84,0x95,0xc2,0xe2,0x71,0xe7,0x13,0xd5,0x73,0x84,0x38,0x4d,0x0a,0x5d,0xa8,0x8e,0xde,0xea,0x79,0x27,0x9c,0x0c,0x58,0xec,},{0x02,0x78,0xc8,0x6a,0x15,0x20,0x8d,0x9b,0xe5,0xb1,0xe1,0x57,0x47,0x61,0x86,0x1b,0x8a,0xf7,0x2a,0xe0,0x8d,0x40,0xcd,0xcb,0xec,0x35,0x4e,0x65,0xa9,0xc3,0xd0,0xa0,0x6b,0x5f,0xcb,0xb2,0x97,0xd0,0x9b,0xef,0x39,0x74,0x62,0x39,0x59,0x86,0xc3,0x09,0x3e,0xeb,0x22,0x64,0x4c,0x00,0x3c,0x30,0x78,0x17,0x8c,0xdf,0x67,0x4e,0x99,0x0a,},\"\\x20\\x57\\x7d\\xca\\xc8\\x91\\x74\\x88\\x5e\\xed\\xb0\\x62\\x48\\x9c\\xd5\\x12\\xfa\\x72\\x86\\x3e\\xc5\\x43\\x8e\\x31\\xe9\\x58\\x78\\xb7\\x5c\\xe2\\x77\\x2a\\xee\\x62\\x90\\xa0\\xba\\x3c\\x8f\\x64\\x2c\\x1d\\x0e\\xf5\\x5d\\xa8\\xd5\\xbc\\x14\\x84\\xf8\\x3b\\xb9\\x87\\x6c\\x7a\\x8c\\x0b\\x6b\\x60\\x9b\\x94\\xd1\\x12\\xa0\\x6f\\xc8\\x3c\\xe8\\xd2\\xc1\\xe0\\x8e\\xd6\\xc7\\x35\\xe5\\x7b\\x24\\x4a\\xad\\x6e\\xcf\\x70\\x75\\x36\\x3d\\x56\\x5b\\xa4\\x78\\x65\\x69\\x5c\\x84\\x23\\x51\\x09\\x09\\xe0\\xa3\\xdb\\x4b\\x61\\xed\\x7a\\xa6\\x7a\\x74\\x71\\x33\\x1e\\x83\\xa0\\xc5\\x8b\\x82\\x20\\xa6\\x24\\x5f\\x65\\x66\\x15\\x49\\xc1\\xa1\\x2d\\x4c\\x0d\\x50\\xc3\\x26\\xfb\\x94\\x91\\x7c\\xbd\\x07\\xbe\\x51\\xe8\\x3f\\xe8\\xbb\\x3e\\x46\\xca\\x01\\xb0\\xa2\\x60\\xda\\xaf\\x1d\\x6a\\xbe\\x37\\x03\\xd6\\xa9\\x25\\x11\\x3b\\xb4\\xd5\\x7e\\xa1\\xa4\\x8b\\x4c\\x7d\\xbd\\xaa\\x03\\xee\\xa8\\x14\\xa4\\xb5\\xf0\\x2e\\x1d\\xfb\\x54\\x5c\\xc6\\x23\\xfe\\x17\\xa3\\xbb\\x18\\xe4\\x37\\x3f\\x5f\\x7e\\xc2\\xfb\\x52\\x17\\xd2\\x3e\\x4f\\xed\\x54\\xa7\\x72\\xe1\\x13\\x23\\xe7\\x30\\xaa\\xd7\\xef\\xca\\x8c\\x46\\x44\\x00\\xe7\\x67\\x90\\x55\\xfc\\xc1\\x25\\xa8\\x76\\xef\\x7b\\x8b\\x9d\\xe1\\x86\\xe2\\x29\\xa7\\xab\\xf1\\x91\\xd0\\xc5\\x6d\\x91\\x81\\x5f\\x67\\x87\\x2e\\x95\\x7b\\xfb\\xc7\\x63\\x4a\\xac\\x40\\x35\\x76\\xa5\\x8f\\x42\\x7b\\xdb\\xb3\\x0e\\x8c\\x4b\\x6f\\xc6\\xc4\\x47\\x74\\x10\\x24\\xeb\\xb5\\x03\\xa5\\xa9\\x02\\x51\\x24\\xa4\\x88\\x7f\\x82\\x5a\\x43\\xee\\x94\\x0f\\x21\\x0a\\x1b\\xd5\\xae\\x4f\\x67\\x32\\xd6\\x0f\\x95\\xf2\\xb8\\x32\\x01\\xc4\\xc6\\xdf\\xe2\\x79\\x41\\x2d\\x75\\x02\\xa5\\x21\\x1f\\x8f\\x48\\xf8\\x00\\xdb\\x30\\xfc\\x37\\x76\\xc4\\xed\\x3a\\x38\\xbb\\x46\\x34\\x82\\x2c\\x98\\xa6\\xd6\\xdd\\x32\\x33\\xbe\\x60\\xe4\\x2c\\xca\\x45\\xa3\\x16\\x3c\\xc8\\x4e\\x9e\\x8d\\xa6\\x47\\xc0\\x71\\x1b\\xc4\\xc6\\xcc\\xd6\\x5a\\xa1\\xe9\\x72\\xc0\\x74\\x04\\xd1\\x03\\xe7\\x4b\\xcc\\x31\\xa7\\xe2\\xc3\\xee\\xa5\\xac\\x92\\x57\\xab\\x42\\x89\\x47\\xab\\x3d\\xd3\\xfb\\x15\\x3d\\x90\\x69\\x4a\\x40\\x73\\x37\\x3c\\x4d\\xd9\\xce\\xb1\\x31\\x15\\x4f\\xe8\\x77\\x47\\x3f\\xd9\\x96\\xf4\\x24\\xf3\\x3e\\x31\\x6e\\x4e\\xb0\\x2b\\x8c\\x75\\x13\\xbe\\x69\\x98\\xe5\\x16\\xcb\\xba\\x54\\xd9\\x4c\\xd0\\xa4\\x35\\xe0\\xff\\xcc\\x2c\\x0a\\x8e\\xf7\\x2b\\x63\\x0e\\xc2\\x47\\x81\\x06\\x6a\\xa5\\xef\\xb9\"},\n{{0x38,0xa9,0xb2,0xd4,0x9b,0xa8,0xb8,0x2f,0x30,0x1a,0x57,0x72,0xce,0xa0,0xef,0xc2,0x21,0x84,0x55,0xc8,0xb2,0x18,0xb2,0x2c,0xba,0xa2,0xaa,0xd2,0xd7,0xad,0x3b,0x35,},{0x9d,0xf5,0xea,0x1f,0x78,0xf8,0x10,0xa5,0x21,0x77,0x46,0x02,0xbb,0xba,0x49,0x42,0xf0,0x45,0x92,0x38,0x96,0x6c,0x8b,0xcd,0x21,0x90,0x0a,0xfb,0xf3,0xd8,0x42,0x93,},{0xe1,0x9e,0x62,0xac,0x53,0x9a,0x9c,0xa2,0x51,0xd1,0x2d,0x4c,0x71,0x05,0x5b,0x0a,0x3f,0x58,0x1d,0x19,0xf2,0x68,0x2e,0x67,0x24,0x04,0xc7,0x8a,0xc1,0xf1,0x2b,0xbe,0xfc,0x91,0x51,0x92,0x76,0xa5,0xcb,0xe1,0x6f,0x52,0x0c,0xf7,0xa7,0xf6,0x87,0xa2,0x40,0xf0,0x32,0x91,0x57,0xc5,0x9f,0x50,0x02,0x6a,0x58,0xdc,0xdc,0x50,0xfc,0x08,},\"\\x17\\x78\\x16\\x7c\\x49\\xb3\\xa4\\x4d\\x4a\\x5b\\xa8\\x38\\xb7\\x38\\x85\\x53\\xb1\\xe1\\x3d\\x36\\xea\\x4f\\x86\\xd3\\x02\\x42\\xe1\\xa8\\x22\\xa3\\xbb\\xaf\\xf5\\xce\\xa6\\x3e\\x2a\\xe2\\xa4\\x63\\x5b\\xe2\\x36\\xfe\\xf2\\xb8\\x13\\x5d\\x14\\xfb\\x62\\x1c\\x0b\\xb7\\x73\\xc9\\xc1\\x77\\x53\\xf8\\x09\\x26\\xeb\\x55\\xd0\\xf1\\x15\\xbd\\x09\\xa8\\x85\\xd8\\x44\\xb8\\x18\\xc9\\xf0\\x44\\x89\\xa3\\x31\\xbb\\x5e\\x03\\x2b\\x8e\\x58\\xcd\\xa3\\x69\\x49\\xc5\\xa8\\xd0\\x8b\\x55\\xbb\\x8d\\xe9\\x65\\xe1\\xf9\\x0d\\x3b\\x9c\\xfe\\xec\\xfc\\x6a\\xd9\\xa4\\xee\\x5c\\xb4\\x04\\x7e\\x94\\x50\\xac\\xdc\\x64\\x64\\x01\\x66\\xa8\\xc0\\x69\\xea\\x84\\x9a\\xeb\\xdd\\xac\\x1a\\xe4\\xaf\\xec\\x91\\xdd\\xd1\\x7f\\xa5\\x55\\x3f\\xa8\\x7c\\x56\\xf7\\xe5\\x1e\\xc1\\xcd\\x6b\\x5c\\xc2\\x33\\x51\\xd0\\x57\\xa4\\xce\\x4a\\x89\\x23\\xc8\\xae\\x6a\\xc7\\xa8\\xaf\\xdc\\xc0\\x88\\x1c\\x0e\\x74\\xeb\\xb0\\x24\\xef\\x72\\x96\\x16\\x2c\\xb9\\x3c\\x68\\xe5\\x0b\\xbb\\x07\\x4e\\x65\\x1a\\xc8\\x7d\\xac\\x9e\\xa5\\x9d\\x4c\\x3f\\xbf\\x0f\\xe3\\x79\\xf3\\xe9\\x7a\\x24\\x56\\x6e\\xca\\xe5\\x43\\x03\\xbc\\xfb\\x6f\\x0c\\xc9\\xf1\\x5f\\x66\\x39\\x43\\x0e\\x66\\xb1\\x9a\\x42\\x78\\x49\\xfd\\xff\\xf8\\x33\\xdf\\x02\\x68\\x9e\\x9d\\xe4\\x40\\x06\\xc9\\x03\\xc5\\x59\\x18\\x34\\x59\\xb9\\xf4\\xa9\\x7f\\x54\\xa0\\xf2\\xa2\\x8d\\xf7\\xb0\\xe9\\xde\\xed\\xa8\\x23\\x9d\\x7b\\x51\\x69\\x77\\xf5\\xe7\\xd6\\x97\\x1b\\x45\\x02\\xe9\\x88\\x5f\\x75\\x0a\\xf8\\xd1\\xa6\\x66\\x9e\\x25\\xe7\\x7d\\x5f\\x32\\x7c\\x77\\xc8\\x7a\\x86\\xe0\\xa1\\x87\\x2b\\xc9\\x6a\\x76\\x06\\x0f\\x5f\\x8a\\x0c\\x40\\xcc\\x97\\x3b\\xfc\\x7f\\xe6\\xed\\x9b\\xca\\x78\\xf8\\x84\\xe6\\xa2\\x82\\x8b\\x94\\xd4\\x89\\xd3\\x2a\\x0f\\xd3\\x37\\xe6\\x9d\\xb8\\x3f\\xb8\\x78\\x9a\\xfd\\x4e\\x8e\\xf5\\x4c\\x22\\xa7\\x8c\\x25\\x87\\x46\\x8b\\x9a\\xe0\\x71\\xba\\xe3\\xb2\\x02\\xd3\\x18\\x3a\\xd5\\xf0\\xf8\\xe8\\x42\\xe5\\xa8\\xde\\x85\\xbf\\xff\\x49\\xe0\\x3c\\x83\\x81\\xbc\\xa7\\xfd\\x42\\x78\\xdd\\xcc\\xaf\\x01\\x34\\xfb\\x55\\x93\\xa3\\x95\\xa7\\x7a\\x5c\\xbd\\x43\\x45\\x93\\xbc\\x4a\\xd0\\xff\\x4b\\x84\\x00\\xec\\x67\\x4c\\x4e\\xca\\xf1\\xd5\\x77\\x54\\xbe\\x0c\\xb2\\xfa\\x9a\\x64\\x41\\xa9\\xab\\xad\\x7b\\x42\\x19\\x7a\\xd8\\x2e\\x50\\x82\\x7e\\x4a\\x42\\x45\\x57\\x3a\\x8f\\x0e\\xf8\\x7f\\x58\\x22\\x8a\\x28\\x67\\xf4\\xb3\\xb8\\x34\\xb6\\x63\\x50\\x37\\x94\\x0a\"},\n{{0x9a,0x17,0x17,0x87,0x36,0x89,0xa0,0x3c,0x11,0x2d,0xd6,0xb4,0xd7,0x6a,0xe7,0x3b,0x89,0xb4,0x16,0xa5,0x98,0xce,0xec,0x20,0x9e,0x27,0x96,0x1e,0x7b,0xb1,0xee,0x8a,},{0xee,0xca,0xd1,0xe0,0xe4,0xb8,0x63,0x29,0x18,0x81,0xa8,0xc2,0x41,0xdb,0x9c,0xcf,0xff,0xe4,0xe5,0x5d,0x8b,0x5a,0x42,0xf3,0x07,0xb4,0x43,0x6a,0xcd,0x06,0x49,0xa6,},{0x1a,0xf8,0xbe,0x09,0x55,0x38,0x96,0x58,0x00,0xd8,0xef,0xf6,0xd7,0x23,0xd0,0x28,0xd6,0x5d,0x0e,0x9c,0x6e,0xb5,0xe9,0xd1,0x25,0xbb,0x3b,0x17,0x83,0xf1,0x1e,0xf7,0x07,0x9a,0x49,0xa8,0x07,0xe2,0x7e,0xf1,0x26,0x0b,0xe2,0x6a,0x3b,0x23,0x1d,0x03,0xb2,0xae,0x15,0x1e,0x49,0xf6,0xf1,0x89,0xf1,0x5b,0x1c,0x83,0xea,0xb0,0x1c,0x02,},\"\\xe2\\x65\\x80\\x47\\x09\\x01\\xa0\\x7a\\xb0\\x93\\x1a\\xa2\\x38\\x29\\x80\\x2c\\xe0\\x4d\\xa5\\x9f\\xdc\\x2f\\x77\\x3b\\xc5\\x67\\xf1\\xe6\\x5b\\x4f\\x2e\\x2d\\x4a\\x1a\\x6a\\xec\\x1f\\x54\\x15\\x8a\\xdf\\xce\\x9b\\x09\\x97\\x90\\xb5\\x03\\xa1\\x3d\\x22\\x09\\x7a\\xe2\\x3e\\xbc\\xcf\\x92\\x3f\\x3b\\xb1\\x98\\x6d\\x6e\\x49\\x11\\x1a\\x8c\\xf0\\xd4\\xeb\\x82\\x36\\xbf\\xe0\\xd7\\xc9\\xe9\\x3a\\x5e\\xfc\\x7f\\xeb\\x8e\\x6a\\x9c\\xd1\\xb8\\xd9\\x21\\xef\\xa2\\x1e\\x44\\x9f\\xf4\\x9e\\x06\\xc1\\xcc\\xfe\\xa3\\x1f\\x93\\xe0\\x33\\xc3\\xc2\\xa5\\x4d\\xdb\\x0f\\x65\\x3a\\x09\\xfb\\xd1\\x8a\\x70\\xb5\\x63\\x15\\xf1\\x93\\xe7\\xbe\\x56\\xe5\\x16\\x8f\\x59\\x56\\x38\\x21\\xd4\\xbc\\x3b\\xbb\\x0e\\xaa\\x20\\x48\\x28\\x6b\\xbe\\xee\\x5a\\xa3\\xf3\\xe7\\x53\\x6c\\xf2\\xb7\\x50\\xfd\\x32\\x26\\x02\\xbb\\x38\\x47\\xce\\xca\\x39\\xb7\\x54\\x74\\x32\\x2d\\x76\\xb1\\xde\\x80\\xfa\\x2e\\xad\\xba\\x15\\x2d\\x6f\\x8f\\x02\\x0d\\x4d\\x93\\x1c\\x53\\xf0\\xa2\\x80\\x12\\x24\\xd3\\x5d\\xeb\\x6e\\xc1\\x3b\\x01\\x48\\x73\\xe6\\x89\\x90\\x36\\x07\\xde\\x96\\xd9\\xb7\\xa7\\x43\\xa8\\x87\\xd2\\xf4\\x8d\\xaf\\x2e\\xd2\\xee\\xfb\\x20\\x2a\\xbf\\x60\\x82\\x79\\x69\\x81\\x12\\x3b\\x96\\x6e\\x93\\x6d\\xcf\\x34\\x83\\xe2\\xd2\\x4d\\x69\\x4e\\xcb\\x86\\x5f\\xbe\\xb6\\x96\\x9f\\x34\\x70\\x27\\xfb\\x8b\\x17\\x5d\\x24\\xa4\\xc0\\x45\\xc0\\xbb\\x4a\\xb5\\xe0\\x2d\\xdc\\xbe\\x77\\xd4\\x75\\x6c\\x46\\xd1\\x37\\xb0\\x94\\x47\\x3a\\x02\\x30\\x7a\\x10\\x83\\x40\\xac\\xad\\x9d\\x03\\xba\\xe8\\x40\\x3a\\xf1\\x99\\xcb\\x75\\xca\\xe3\\x16\\x2f\\x38\\x15\\x81\\x3c\\xc6\\x8b\\xf2\\xa5\\xe4\\x99\\xe5\\x94\\x92\\x11\\x49\\xf3\\xbb\\xd2\\x14\\xda\\x51\\x37\\xe7\\x56\\x52\\x15\\x59\\xdc\\x80\\xd9\\xa4\\xb7\\x4a\\x0f\\x49\\x43\\x02\\x2c\\x7c\\xd5\\xfc\\xa4\\x23\\x15\\xe0\\xbc\\xee\\xae\\x90\\x69\\x61\\x5c\\xe6\\x7a\\x04\\x38\\x24\\x12\\x31\\x3a\\x31\\xd6\\x7b\\x34\\x6c\\x32\\x9a\\xd8\\x2e\\x74\\x2c\\x0a\\x6c\\xe0\\xa6\\xa0\\x24\\x54\\xc1\\x13\\xe5\\x20\\x22\\xf3\\xcc\\x03\\xfd\\xa6\\x91\\xeb\\xdf\\xe1\\x4c\\x53\\xc8\\xce\\x5c\\xa9\\xb9\\x32\\xca\\x1a\\x38\\x6e\\x3e\\xb4\\xe9\\x0a\\x4d\\xc6\\xe8\\xad\\x85\\x33\\xb5\\xaf\\x1a\\xae\\xf5\\x00\\x31\\x28\\x65\\x5c\\xa6\\x4f\\x67\\xfc\\xd9\\x7c\\x6a\\xc8\\x03\\x00\\x24\\x04\\x90\\x0b\\xc0\\xfa\\xe9\\x84\\x63\\xbc\\xc3\\x14\\x09\\xf9\\x98\\x17\\x48\\x78\\x9a\\xde\\x2d\\x07\\x78\\x3b\\xc3\\x2b\"},\n{{0x43,0xbd,0x92,0x4d,0xb8,0x15,0x60,0x08,0xc6,0xb3,0x99,0x4a,0x81,0x30,0xd4,0x27,0xd5,0x14,0xdb,0x8a,0x61,0x3b,0x84,0xdf,0xb0,0xb8,0xe0,0xde,0x6a,0xc3,0x06,0x76,},{0x1b,0x34,0x61,0xc2,0x69,0xd5,0xb0,0x06,0x2d,0x5d,0xf6,0xfa,0x65,0x4a,0x25,0x86,0xf6,0x47,0xa0,0x68,0x42,0x18,0xa0,0x6e,0x5e,0x2f,0x7b,0xad,0xfb,0x39,0x41,0x31,},{0xd2,0xa0,0x5d,0x88,0xd9,0xd5,0x43,0xd9,0x4d,0x57,0xec,0x88,0xae,0x55,0x68,0x17,0x50,0xf2,0x0b,0x9b,0xe9,0xc1,0xe9,0x18,0xcd,0xaf,0x45,0x77,0x67,0xf2,0x94,0x8d,0xd6,0x29,0xe9,0x4f,0x06,0x8e,0xdc,0xf3,0xd9,0x92,0x7e,0x33,0x02,0x34,0xba,0xdc,0x3a,0x02,0xfa,0x5a,0xd3,0xd9,0xd8,0x5e,0x94,0x8c,0xb0,0xb0,0xcb,0x3c,0xd7,0x0a,},\"\\x61\\x84\\xe6\\x48\\x0c\\x42\\xe9\\x6c\\xc8\\x77\\x26\\x9b\\x16\\x37\\x15\\x45\\xff\\x95\\x23\\xc4\\x5e\\xa8\\x8e\\x76\\xa1\\x34\\x8c\\x68\\xae\\x7f\\x31\\x8b\\x08\\x8f\\xe4\\x61\\x09\\x28\\x23\\x91\\x85\\xb6\\xb5\\x5b\\xfa\\x0f\\x43\\x64\\x4c\\x4a\\x4c\\x97\\xc5\\x6e\\xd7\\x7d\\x08\\xb1\\xf4\\xaa\\xd2\\xf4\\xaa\\x06\\x99\\x94\\xab\\xec\\xa9\\x6b\\x7b\\xf8\\x1b\\x80\\x64\\xea\\x43\\x50\\xd8\\xa8\\xb0\\x22\\x97\\xa5\\x13\\x08\\xb6\\x1c\\x57\\xc8\\xf1\\x87\\x3c\\x6f\\x97\\x00\\x7a\\xca\\x31\\x80\\x42\\x9e\\x73\\x0a\\x66\\x43\\xf2\\x87\\x33\\x54\\x7b\\xcf\\x7b\\x9a\\xdf\\xe3\\x27\\xe8\\x57\\x36\\xbd\\x04\\xaf\\x7f\\x1d\\x9f\\x4f\\xb8\\x4a\\x7f\\x3a\\xff\\xdf\\x4e\\x22\\xb5\\x74\\xec\\xb4\\xbc\\x88\\x36\\xb1\\x0b\\x84\\x53\\xae\\xaa\\x5c\\x1b\\xf1\\x32\\x24\\x8b\\x82\\x6c\\xc5\\x23\\x0f\\x75\\xe0\\x75\\xfa\\xc9\\xf0\\x37\\x56\\x11\\x36\\xe0\\x06\\x43\\xd0\\x82\\x53\\xe7\\xad\\x65\\x2f\\x70\\x2c\\x0d\\x15\\xb6\\xd7\\xd4\\x8a\\xa6\\xf8\\xe9\\xb5\\xf5\\xcc\\x14\\x6e\\x3f\\x15\\x6f\\xb2\\x52\\x27\\x51\\xc3\\x71\\x00\\x41\\xbd\\x92\\x2f\\x37\\xa5\\x03\\x77\\xe0\\x28\\xb0\\xc4\\xe4\\xbc\\x34\\x65\\xd7\\xc8\\x4a\\xf6\\xa5\\xfb\\x42\\x7a\\xcb\\x3b\\x41\\x37\\x8b\\x10\\x2b\\xda\\x46\\xd8\\xf6\\xf2\\x03\\xa5\\xff\\xcf\\x39\\x5d\\x43\\x5e\\x93\\x45\\x8a\\x0b\\x0a\\x4c\\x2e\\x77\\x82\\xfa\\xfe\\x11\\x9f\\x76\\x9f\\x67\\x05\\x8c\\x66\\x77\\xf6\\xd1\\x0d\\x9c\\xf5\\xcb\\x87\\x48\\xe1\\x80\\x57\\x98\\xed\\x23\\x3f\\x6f\\x93\\x0e\\xee\\x0e\\x50\\x75\\xbc\\x58\\xb9\\x7a\\xf9\\x17\\x7f\\xda\\x75\\xd5\\x37\\x08\\xbe\\xb0\\x4d\\xc4\\xf1\\x9a\\x43\\xe7\\x68\\x07\\x46\\x09\\xf1\\x40\\x65\\xf4\\x8f\\xda\\xd5\\x07\\x7c\\xe1\\x09\\xba\\xcc\\x35\\x71\\x74\\xa6\\xb7\\x95\\x6f\\x6e\\x7f\\x32\\xe3\\x84\\x15\\xbe\\x52\\x63\\x70\\xfa\\x58\\xc3\\xc0\\xb3\\x1f\\x51\\xe6\\xcd\\x4b\\x2c\\xf2\\x7f\\x8b\\xcb\\xc2\\x12\\x59\\xd9\\xe5\\xc3\\xb5\\xc2\\x94\\x6a\\x9f\\xc1\\xb0\\x0d\\x9d\\x15\\xc3\\xb7\\xd8\\x0b\\xfd\\x9d\\x05\\xdb\\x91\\xd2\\x49\\xd3\\xe4\\x2d\\x89\\x56\\x68\\x20\\x44\\x54\\x8d\\x83\\xbd\\xa8\\xd5\\xcc\\x92\\x12\\x44\\x2f\\x30\\xb4\\x5c\\xf4\\xae\\xad\\x80\\xcc\\xe9\\xb3\\x51\\x2c\\x39\\xc5\\xc7\\x37\\xd3\\xf8\\xd7\\x47\\xaf\\xba\\xb2\\x65\\xaf\\x5e\\xee\\xf8\\xca\\x93\\x62\\xec\\x76\\xe9\\x43\\xb0\\xa0\\xd7\\xa3\\x9f\\x3d\\xb1\\x1e\\xca\\x14\\x45\\x8a\\x7b\\x59\\x2e\\x5e\\x4f\\xf2\\x27\\x5d\\xd4\\x8b\\x28\\x53\"},\n{{0x8f,0xb0,0x86,0x20,0x6d,0xd9,0x5a,0x26,0x21,0xf5,0x98,0x56,0x0c,0xcb,0x28,0x1f,0x82,0x73,0xc8,0xfc,0x72,0xe2,0x36,0x11,0x08,0x9b,0xaa,0xc8,0x9d,0x3c,0x3c,0x78,},{0x20,0x27,0x6e,0xf4,0x79,0xf4,0xd4,0x52,0x3a,0xb7,0x74,0x20,0xd4,0x24,0xe8,0x81,0x9c,0x33,0xc8,0x37,0x79,0xed,0x80,0xc7,0xf6,0x66,0xe8,0xf4,0x40,0x3f,0x94,0xd7,},{0xa9,0x30,0x5e,0x00,0x16,0x00,0xd5,0x97,0xd0,0x5e,0xf6,0x71,0x69,0x9b,0xf0,0x9f,0x0d,0xcc,0x0c,0x44,0x47,0x5d,0x3c,0xa3,0x1e,0x7f,0xf1,0xbf,0xfe,0xdc,0x0c,0x67,0xda,0xa1,0xf3,0xb7,0x6a,0x03,0x59,0x48,0xc5,0x9c,0xd8,0x7f,0x82,0x45,0x3a,0x40,0x95,0x0a,0x1c,0x97,0x03,0xc2,0xe7,0xd9,0x28,0x0e,0x73,0x03,0x96,0x6d,0xa3,0x01,},\"\\xf0\\x29\\x03\\xed\\x42\\x66\\xe8\\x49\\xa4\\x48\\x52\\x05\\x95\\x4f\\xff\\xa8\\xa1\\x08\\xc3\\x23\\xb7\\xe3\\xf8\\x43\\x31\\x04\\x35\\x14\\xe4\\x85\\x56\\xab\\x01\\x94\\x97\\x23\\x3a\\x5a\\x12\\x7b\\xff\\x3c\\xd7\\xc9\\x70\\x86\\xbe\\xce\\xf5\\x38\\xb3\\xf3\\x39\\xd7\\xd0\\x6e\\x53\\x2d\\xc7\\x32\\x5e\\x59\\x7a\\xe3\\x57\\xf8\\x16\\xde\\xa4\\x2a\\x6a\\x22\\xc7\\x9d\\x22\\x07\\x4a\\x2e\\x1a\\xd8\\x02\\x3c\\x42\\x4b\\x7e\\x09\\x6e\\x5a\\xd8\\x89\\x7b\\x05\\xef\\x7d\\x00\\xd3\\x0a\\x04\\xaa\\xf2\\x98\\x1e\\xdd\\xff\\x2b\\x34\\x7f\\x1e\\x27\\xe2\\x0a\\xab\\xbe\\x7e\\x7a\\x95\\x44\\x97\\x8e\\x09\\x2b\\x00\\xcc\\xe4\\x20\\xab\\xa0\\x61\\x87\\x37\\x4f\\xfb\\xb3\\x7b\\x4c\\x22\\xd7\\x5f\\x04\\xe5\\x75\\x90\\xf6\\x10\\xa2\\x73\\x47\\x28\\x6c\\x29\\x83\\x12\\xa6\\xc9\\xb1\\xbd\\xf2\\x4f\\xbd\\xa8\\x51\\x3c\\x4f\\x83\\x56\\xcc\\xf7\\x57\\x06\\x8f\\xfc\\x11\\xbc\\x65\\x11\\x37\\x83\\xa5\\xdd\\xe7\\x72\\x2f\\xaf\\x4c\\xeb\\x19\\xfb\\xb6\\x2f\\x40\\x70\\x2e\\x2c\\x6e\\x6a\\x8b\\xb4\\x9e\\xf4\\x04\\x46\\x45\\x0c\\x4c\\x59\\xa2\\x99\\x09\\x44\\xda\\x47\\x44\\xf6\\xee\\x77\\x0b\\x93\\x0c\\x24\\x66\\x69\\x81\\x3c\\xe5\\xa9\\xf5\\xa4\\x7d\\xd8\\x03\\x88\\x98\\x1b\\xfc\\xc3\\xa5\\x6b\\x5b\\xe2\\xc4\\xc7\\xe6\\x59\\xa2\\xe9\\x18\\x2d\\xec\\x0a\\xaa\\xfe\\x90\\x31\\xaa\\x39\\x54\\xd4\\xfe\\x7c\\x43\\x11\\x96\\xa5\\x61\\xa5\\xb7\\x8e\\xab\\xa6\\x4f\\x3d\\xb1\\xb5\\x86\\xc5\\x3b\\x16\\xf6\\x79\\xa8\\x49\\x21\\xa6\\x42\\xc2\\x60\\xe4\\x65\\x3a\\x61\\xde\\x10\\x8e\\xbd\\xe6\\xf7\\x05\\x3a\\xfa\\x2c\\xb3\\xf3\\x66\\x8e\\xde\\x12\\x10\\x20\\xdd\\x1b\\xac\\xe8\\x41\\x8a\\xeb\\xac\\x3a\\x5b\\xd5\\x14\\x2f\\x10\\x5a\\xc2\\x6f\\xe4\\x9e\\x5f\\xb1\\x40\\xc1\\x9b\\x22\\xd5\\x4a\\x62\\x91\\xdf\\xc9\\x54\\x67\\x02\\x47\\x88\\x16\\x46\\x87\\x4d\\xef\\xad\\x81\\x49\\x95\\x51\\x9f\\x62\\x60\\xe9\\x77\\x4a\\x8d\\x18\\x5c\\x37\\x88\\x1b\\x4f\\x25\\x43\\xc4\\xb6\\x3f\\xbf\\x19\\x85\\x01\\x6a\\xb4\\x1c\\x4d\\x72\\x8c\\xbc\\x90\\xb3\\xab\\x87\\x62\\x67\\xbe\\xd4\\x1d\\x0c\\x09\\x02\\xf6\\xb5\\x0e\\x8f\\xa9\\x06\\xfc\\x47\\x88\\xf7\\xb8\\x20\\x46\\x73\\x06\\xe0\\xfe\\x9e\\x03\\x6a\\x0a\\x00\\xf8\\x04\\xf9\\x1c\\x3c\\xa7\\x18\\xb9\\x5f\\xf6\\xd9\\xe2\\x20\\x4b\\xc3\\x16\\x1b\\xf7\\x0f\\xcc\\x17\\xb2\\x96\\x4b\\x56\\xbc\\x61\\x2e\\x29\\x40\\x2d\\x96\\xf5\\x09\\x86\\x51\\x4b\\xc7\\xd8\\x31\\xd5\\x8e\\x42\\x79\\x37\\x86\\xd5\\x80\\x6f\"},\n{{0xaf,0xa1,0xb8,0x46,0xc2,0x10,0xb5,0x23,0x00,0xe9,0x76,0x96,0xf8,0x1b,0x8e,0xa7,0x74,0xd1,0xdf,0x12,0xe6,0x12,0x52,0x7c,0x55,0x74,0x7f,0x29,0xc1,0x93,0x73,0x96,},{0xb6,0x09,0x56,0x6b,0xbd,0x19,0x47,0xbd,0x7a,0xfa,0xce,0xb1,0x43,0x89,0xe8,0x36,0x22,0x71,0x69,0x21,0x5f,0xab,0x66,0x85,0x1a,0xa5,0xd7,0x0d,0x6e,0x2e,0x3b,0x89,},{0x98,0xb0,0xc6,0x31,0x3c,0xec,0xaf,0x7c,0x82,0xcb,0xde,0xb3,0xd0,0x28,0x06,0x41,0xc6,0x1a,0x06,0x0f,0x65,0xe5,0x63,0xaa,0x93,0xce,0x18,0x30,0x0a,0x9b,0x58,0x27,0x2d,0xc8,0x68,0x0b,0x48,0x5e,0x8c,0xd1,0x1c,0xf8,0x0f,0xdc,0xa8,0x68,0xfa,0xb3,0x65,0x37,0x83,0x84,0xa1,0x42,0x72,0x7f,0x2f,0x84,0x4f,0x87,0xcf,0xdf,0x19,0x05,},\"\\x4c\\xac\\x1b\\x1f\\x4b\\xd4\\x82\\x84\\xdc\\xc9\\xaf\\xc8\\xb5\\x95\\x5b\\x64\\xb4\\x36\\xdb\\x70\\x4b\\x03\\x35\\xd9\\x75\\x5c\\xc1\\xf9\\x74\\x77\\xf8\\xd3\\x23\\xcb\\x64\\x10\\xef\\x14\\x6a\\xb8\\xa9\\xef\\xb9\\x52\\x6d\\x8b\\x62\\xe3\\xbb\\xad\\x1f\\x72\\x95\\xf4\\x7b\\xa9\\xf0\\xde\\x95\\x8f\\x8e\\xc9\\xb7\\x7a\\xb4\\x22\\x32\\x43\\x7e\\xd9\\x74\\x85\\x64\\x44\\xcd\\x22\\xe2\\x0b\\xe3\\x5e\\x91\\x81\\x3b\\xff\\x4b\\x01\\x6f\\x81\\x0d\\x0f\\x61\\xd8\\x9f\\x6b\\x61\\x4d\\xb3\\x3f\\x34\\xbd\\x09\\x98\\x5b\\x59\\x3f\\xe3\\xe0\\x6e\\x06\\x5b\\x7b\\xc6\\xcd\\x39\\xd5\\x5c\\x2c\\xfb\\xec\\x7b\\x6d\\x59\\xc0\\xb3\\x7d\\xd1\\xd0\\xd3\\x51\\x35\\xab\\x1d\\x1b\\x04\\xf2\\xf3\\x0c\\x2f\\x04\\xf4\\xba\\x2b\\x36\\x58\\x27\\x38\\x08\\x1c\\xf5\\x91\\x90\\xf5\\x28\\x36\\x3d\\xb9\\x44\\xed\\x61\\x29\\x31\\xd1\\xd5\\x14\\xc6\\x21\\x4f\\x9a\\xb9\\x2a\\xbb\\x18\\x33\\x92\\x61\\x83\\xac\\x52\\xfb\\xa2\\xa4\\x55\\x1e\\x20\\xe4\\xc0\\xac\\x95\\x9a\\x49\\xdd\\xb1\\x67\\xa3\\x81\\xe0\\x24\\x1d\\x40\\xc0\\x86\\xe9\\x0e\\x52\\xac\\xa0\\x17\\x25\\x89\\x75\\xdb\\xab\\x2b\\xa4\\x51\\xee\\x53\\x9a\\x71\\x8f\\x07\\x6a\\x58\\x70\\x9c\\x66\\x97\\x41\\x8d\\x9c\\x6f\\x13\\xe4\\xd3\\x91\\x36\\x8b\\xf0\\xe8\\xbd\\x8f\\x29\\x32\\xdd\\x95\\xce\\xaf\\x7a\\xac\\xa1\\x24\\x11\\x47\\xd3\\x41\\xa3\\xac\\xd0\\x8d\\xc3\\x29\\x05\\x48\\x35\\x72\\xb8\\x9a\\x80\\xcc\\x47\\x23\\x14\\x68\\xab\\x8d\\xe3\\x59\\xdd\\x52\\x5a\\x62\\x57\\xcf\\x19\\x6c\\x2e\\xcb\\x82\\xfa\\x8a\\x78\\xaa\\x3a\\x85\\x1c\\x7c\\x96\\xca\\x25\\xbf\\x7c\\xa3\\xdc\\xf3\\xca\\x21\\x45\\x3d\\x0d\\xfd\\x33\\x23\\xd5\\xa4\\x22\\xde\\xc8\\x43\\x16\\x10\\x2f\\x68\\x4c\\x35\\x9f\\x22\\x6b\\xb5\\x37\\x79\\xc0\\xb9\\x95\\x09\\x39\\x28\\x1e\\xf7\\x9a\\x58\\xc0\\x11\\x99\\x3e\\xac\\xe0\\x85\\x49\\x7a\\xfa\\x4d\\xaf\\x64\\xc9\\x68\\x7b\\x0a\\x11\\xaa\\x11\\x6c\\xfa\\x7b\\x03\\x93\\x62\\x41\\xa5\\x56\\x7b\\x64\\x6e\\x7e\\x42\\xe9\\xfb\\x59\\x24\\x05\\xb8\\xfa\\x3c\\x0a\\x82\\x1f\\xc3\\x12\\x1b\\x45\\xb1\\x75\\x3c\\xec\\x9a\\x83\\x94\\x7d\\x21\\x1a\\x45\\x49\\x9b\\xd6\\x37\\x90\\xb8\\x7f\\x01\\x47\\x2f\\xe5\\x66\\xd8\\x76\\x96\\xef\\xed\\xbb\\x74\\xed\\x00\\x04\\x8c\\x38\\x4b\\xa7\\xf0\\x27\\xb3\\xaa\\x42\\x98\\xdc\\x41\\x10\\x34\\x9f\\xed\\xf5\\x2a\\x96\\xcd\\x05\\xd0\\x8b\\xd6\\x35\\x77\\x1e\\xd4\\x51\\x07\\x38\\xd8\\xf0\\x7a\\x60\\x21\\x24\\x4d\\x19\\x03\\x57\\x9a\\x3e\\xa7\\x39\"},\n{{0xc8,0x59,0x13,0xa6,0x87,0x78,0x77,0x13,0x10,0x01,0x62,0x3c,0xcd,0xa9,0xcd,0xc1,0x2b,0x9d,0x40,0x43,0xb8,0xa8,0x37,0x93,0xc4,0x46,0x96,0x63,0x2c,0xd6,0x42,0x1c,},{0x9c,0xc6,0x7c,0x69,0x48,0xf7,0xbf,0x6e,0x55,0x6d,0x08,0x49,0xd3,0xb8,0xd2,0x03,0x45,0x7a,0x7b,0x61,0x54,0x9b,0x36,0x68,0x1d,0x75,0x4f,0x1d,0xc0,0x84,0x1e,0x96,},{0x01,0xfc,0xcf,0xdb,0x1f,0xb6,0x88,0x8b,0x03,0x10,0xa9,0x13,0x17,0x0f,0x7e,0x36,0x68,0x16,0xda,0xeb,0xe7,0x65,0x0d,0x72,0x51,0x3d,0x95,0x06,0xe6,0x6f,0x7d,0x62,0x20,0x8a,0x49,0xec,0xe0,0xaf,0x18,0x71,0x49,0x7f,0x45,0x41,0xef,0x60,0x5b,0xde,0x71,0x1c,0x9e,0x0a,0x12,0x05,0xef,0x48,0xf2,0x6c,0x03,0xdc,0x1a,0xd4,0xaf,0x03,},\"\\x91\\xb5\\x00\\x9e\\x83\\xd0\\xf6\\x10\\x33\\x99\\xc2\\xd3\\xfe\\xec\\x00\\x84\\x97\\x3a\\x30\\x5b\\xf4\\x17\\x6e\\xc7\\x82\\x53\\x75\\x60\\x47\\x2d\\xb1\\x87\\xa1\\x1b\\x4d\\xcb\\x4b\\x2f\\xfb\\x7f\\x06\\x44\\xfe\\xb3\\x94\\xb2\\x8e\\x5b\\xfe\\x97\\x24\\x7c\\x4a\\x4a\\x23\\x1c\\xf6\\xe9\\x16\\xbf\\x99\\x34\\x4c\\xcd\\xa8\\x8a\\x7f\\x5d\\x83\\x1d\\x6d\\xe3\\xd5\\x63\\xdd\\x10\\x2e\\xae\\xb1\\x08\\xc5\\xbd\\xce\\x44\\xe0\\x63\\x2d\\x17\\xe6\\xfa\\x55\\xb1\\x80\\x67\\xdf\\x2f\\xa8\\xd2\\x00\\xa9\\x86\\x9f\\x6a\\xff\\x92\\x0c\\x51\\xd4\\x6a\\x1c\\xed\\x2d\\x90\\x3b\\x1d\\x9b\\x6b\\x07\\x5f\\xac\\xbf\\x91\\xcd\\x05\\xeb\\x41\\xad\\x81\\x1a\\x8e\\xf4\\x0d\\x91\\x18\\x26\\x10\\x12\\xc7\\x2b\\x89\\x79\\xf1\\x51\\x53\\xdb\\xb8\\x56\\x12\\x93\\xda\\x9f\\x8b\\x77\\xc8\\xff\\x14\\xf7\\x53\\x87\\x53\\x6f\\x00\\x36\\xd1\\x71\\x3a\\x72\\xce\\x8c\\x35\\xb1\\x06\\x2f\\x2c\\x67\\x32\\xae\\xbf\\x32\\x93\\x67\\x99\\xb5\\x1c\\x2c\\xbc\\xd6\\x57\\x24\\x13\\xe7\\xdf\\xaa\\xb8\\x64\\x1a\\x02\\xc1\\x50\\x23\\x73\\x81\\xcf\\x7a\\x14\\xe2\\x2c\\x74\\xc6\\xc2\\x00\\x09\\xde\\x7d\\x3b\\x7e\\x69\\xcd\\x1b\\x45\\x84\\xac\\x2c\\x01\\xba\\xba\\xf9\\x73\\xc5\\x6b\\x38\\x14\\xbb\\x00\\x89\\x72\\x0e\\x41\\x96\\x81\\x06\\xcf\\x26\\x50\\x9d\\x4a\\xa5\\x46\\xfc\\xad\\x55\\x34\\xaf\\x30\\x3f\\xfc\\xa4\\x2b\\x16\\xae\\x6c\\x93\\xee\\x06\\xbc\\x3c\\xac\\xe1\\x2e\\x4e\\xc7\\x18\\x84\\x4b\\xd3\\x0d\\x22\\x24\\xcc\\x48\\x6d\\x10\\x6d\\x1c\\x45\\x6b\\xfa\\x16\\x5e\\xa0\\x12\\x0f\\xab\\x3d\\xf2\\xc5\\xab\\x3a\\x52\\x3b\\xbf\\xa7\\x89\\xde\\xed\\x44\\x03\\x2a\\xb0\\xbe\\x86\\xeb\\x7c\\xc0\\x9c\\xdb\\x7c\\x07\\xaa\\x94\\x8d\\xd5\\x27\\x7c\\x3d\\xf1\\xd9\\xd1\\x84\\x35\\x67\\xde\\xc8\\x4f\\x92\\x88\\xe0\\x85\\xb0\\x5a\\xe4\\xb8\\xaf\\x2c\\xea\\x5d\\x9a\\x18\\x4d\\x50\\xbe\\xf8\\x55\\x50\\xc8\\x36\\x61\\x3d\\x5d\\x3a\\xf5\\xf9\\xc2\\x92\\x8e\\x6a\\x89\\x66\\x0f\\xa6\\x27\\x19\\xeb\\xff\\x77\\x3e\\x46\\xb7\\x7e\\x34\\xbc\\x04\\x70\\xda\\x4d\\x2c\\xdb\\xc7\\x07\\x1d\\xa7\\x58\\xc4\\xd3\\x9f\\xe6\\x52\\x01\\xc8\\x8a\\xaa\\x8e\\x66\\x03\\xd0\\xbb\\xe7\\xc3\\xe9\\xb2\\xd9\\xe4\\x1b\\x63\\x46\\x82\\x09\\x2f\\x14\\x73\\x41\\xad\\x6d\\x66\\x7f\\x20\\xc6\\x4e\\x81\\xa6\\x8d\\x62\\x94\\x67\\xa5\\x4d\\xd8\\x6e\\x1c\\xe1\\x2c\\x56\\x0a\\x6f\\x9b\\x64\\x51\\x2d\\x6f\\x38\\x86\\xcb\\xb9\\xf3\\x7c\\x37\\xeb\\x39\\x85\\xc8\\xac\\x38\\xdd\\x66\\x82\\xf4\\x8f\\xe1\"},\n{{0xfa,0x1e,0x11,0xdc,0x83,0x64,0x20,0x8d,0x8e,0x1c,0xb6,0x6a,0x36,0x1b,0xe7,0xe8,0x4c,0x5e,0x36,0x81,0x66,0x58,0x7d,0x4f,0xdb,0x06,0xac,0xed,0x7f,0x62,0xe1,0x7c,},{0x4d,0x8e,0x6f,0x4b,0x34,0x15,0xdf,0x6c,0xed,0xab,0xfb,0x29,0x5c,0x19,0x84,0xfd,0x41,0x99,0x23,0xc6,0xac,0x41,0x76,0x4e,0x32,0xd2,0x2d,0xaf,0x37,0x2c,0x50,0xfc,},{0xe8,0x57,0xdb,0x08,0x7e,0x28,0xd6,0x75,0x0b,0xf5,0x4e,0x53,0x79,0x72,0x51,0xd8,0x43,0x99,0x89,0x57,0x6c,0x12,0xda,0x2d,0x9c,0x81,0x1a,0x14,0x87,0x7c,0x3b,0xd4,0x6c,0x4e,0xfa,0xb8,0x61,0xa1,0x0e,0xeb,0xe7,0xda,0x04,0xc0,0xb0,0xb4,0x45,0xc7,0xa3,0x90,0xa5,0x0c,0x13,0xde,0x36,0xf3,0xa3,0xc7,0xae,0x01,0x57,0x02,0x2c,0x0e,},\"\\x29\\x4e\\x63\\xba\\xcc\\xcb\\x80\\x1b\\xbf\\x04\\xc1\\xf1\\x9d\\x0a\\xee\\x16\\xf5\\x65\\x0a\\x6e\\x8e\\xea\\x6f\\xe4\\x11\\x10\\x66\\x3e\\xc0\\x15\\x32\\xbd\\x49\\x60\\xa5\\x27\\xf1\\x5e\\xca\\x4a\\xf2\\xf4\\xe6\\xb7\\xb0\\xfc\\x34\\x0c\\xf9\\x7a\\xa2\\x34\\xe9\\x2c\\xf7\\xd6\\x9d\\x50\\xe4\\x00\\x9c\\x24\\x96\\xe3\\xed\\x4d\\x9a\\xff\\x00\\x0f\\x9e\\x18\\x52\\x75\\xb8\\x17\\xd2\\x6a\\x0b\\xab\\x69\\xb7\\xf7\\xee\\x1e\\xa3\\x0d\\xae\\xc8\\xbc\\xee\\x38\\x7a\\xe4\\x6b\\x4b\\x29\\x9c\\x27\\xbd\\xc0\\x6e\\xea\\x63\\xf2\\x4d\\xbe\\xe9\\x55\\xa6\\xc0\\x96\\x90\\x37\\xee\\xf9\\x1c\\x34\\x32\\x1e\\x3c\\x5c\\x97\\x2f\\xde\\x99\\x31\\x83\\xb7\\xd2\\x3f\\x6e\\x01\\x9c\\x3e\\x0c\\xac\\x75\\x89\\xae\\x4a\\x15\\x21\\xaf\\x87\\xea\\x42\\xdf\\x8c\\x22\\xc2\\x27\\x0e\\xc2\\x3d\\x6d\\x14\\x0f\\x9c\\xf6\\xd4\\xd5\\x2f\\xac\\x1b\\x9d\\x6c\\x89\\x39\\xef\\x81\\x31\\xcb\\x62\\xa0\\x35\\xc5\\x26\\x15\\x38\\xbc\\xdf\\xd6\\xdb\\x41\\x9a\\x55\\xef\\x9f\\xe5\\xd7\\xa5\\xac\\x44\\x57\\x9d\\xe7\\x00\\x85\\x8d\\x74\\xa3\\x43\\x48\\x44\\xf2\\x83\\x42\\xc5\\x65\\x89\\x27\\x22\\xe2\\x7f\\x40\\x7d\\x7f\\x17\\xb7\\x4a\\x59\\x34\\xbe\\x91\\x5b\\x20\\xc2\\x40\\x06\\x43\\x23\\x5f\\x8a\\xb5\\x79\\x5f\\x32\\x4e\\x33\\xc5\\x06\\x44\\xa0\\x40\\x33\\x54\\x2c\\xb3\\x81\\x6d\\x77\\x0f\\xa8\\x99\\xe7\\x31\\x1c\\x14\\x30\\x1c\\x1b\\xd0\\xf5\\xaa\\x60\\xa2\\xeb\\x31\\x65\\x68\\x0c\\x72\\x0e\\x1e\\xfa\\x80\\x96\\xfc\\x25\\xd2\\x77\\x92\\x75\\xf1\\x84\\x2b\\x2d\\xb5\\x3b\\x4d\\xa0\\xad\\x3e\\x59\\xc0\\x75\\x40\\xc2\\x84\\x60\\xce\\xc1\\xfd\\xd3\\xcd\\xb7\\xa3\\x47\\x8b\\x91\\xa9\\xca\\xf9\\xac\\x89\\x1c\\xdf\\x3a\\xea\\xee\\xca\\x9a\\x96\\x56\\xac\\x13\\x07\\x25\\x99\\x22\\xfc\\xa7\\x4c\\x5c\\xc6\\x9f\\x7e\\x25\\xc6\\xbf\\x58\\x79\\x73\\xa4\\xb7\\xd3\\xe3\\xac\\x06\\x35\\xb0\\xdb\\x22\\xa0\\x09\\x3a\\x79\\x07\\x68\\x81\\xc7\\x17\\x36\\xee\\x1d\\x4d\\x45\\xf8\\xed\\x2d\\x29\\xa0\\x67\\x1a\\x64\\xe6\\xca\\x2f\\x7a\\x5e\\xf4\\x04\\xb1\\xed\\xeb\\x84\\x20\\x34\\xf5\\x71\\xb6\\x99\\xbc\\x59\\xe5\\xa3\\x7d\\xf0\\x20\\x54\\xe8\\x48\\x2b\\xf1\\xe7\\xb7\\x7d\\x8e\\x83\\x97\\xda\\x15\\xd8\\x9d\\x73\\x55\\xa5\\xdc\\xe8\\x6b\\x16\\x83\\xa9\\xac\\x4e\\x40\\x6c\\x08\\xa9\\x4a\\x6e\\xb0\\x0e\\x5a\\xe1\\x6d\\x96\\x72\\x29\\x72\\xe5\\xc5\\x0c\\x7b\\xee\\x4a\\x84\\xd0\\x69\\x7b\\xbe\\x67\\xce\\xb7\\xef\\x29\\x5f\\x06\\xaa\\xea\\x5a\\xbb\\xa4\\x44\\x66\\xbe\\x0f\\x67\"},\n{{0x24,0xa9,0x14,0xce,0xb4,0x99,0xe3,0x75,0xe5,0xc6,0x67,0x77,0xc1,0xed,0x20,0x43,0xbe,0x56,0x54,0x9d,0x5e,0x50,0x2a,0x84,0x47,0x10,0x36,0x40,0x42,0xba,0x9a,0xcb,},{0x20,0xd2,0x1e,0xe7,0x64,0xb1,0xf3,0x5f,0x94,0x56,0x82,0x00,0xd6,0x3b,0xd5,0x82,0x8a,0xca,0x8c,0x5d,0x3e,0x90,0x47,0xd2,0x3f,0x47,0x8b,0x92,0x52,0x95,0xfa,0x2e,},{0x3a,0xe0,0xcc,0x7b,0xca,0x8d,0x73,0xbe,0x83,0xa9,0xb8,0x09,0xb1,0x33,0x38,0xc1,0x27,0x06,0xaa,0xef,0x75,0xc4,0xd1,0xa4,0x78,0x17,0x8f,0x9d,0xc5,0x65,0x51,0x4c,0x75,0x29,0xe2,0x98,0x04,0x3e,0xa7,0x8d,0x21,0xa5,0xa0,0x9d,0xd0,0x4f,0x10,0xae,0x87,0x44,0x1e,0x56,0x86,0xa9,0x33,0xc9,0x2c,0x75,0x54,0x84,0x27,0xad,0x3a,0x03,},\"\\x3f\\xf9\\xf6\\x6f\\xa2\\x64\\x6e\\xc6\\x6a\\x1b\\xf9\\x33\\xc2\\xb4\\xcc\\x0f\\xbf\\x91\\x2b\\x4d\\x6d\\xb5\\x05\\x34\\x25\\x7f\\x97\\xd0\\x1e\\x69\\x8d\\x05\\x48\\x57\\x47\\xde\\x25\\x44\\xe9\\xf5\\xa4\\xa4\\xa0\\x75\\x38\\x8c\\xf4\\x40\\x0a\\xb8\\x9b\\x03\\x53\\xce\\x86\\x19\\x82\\x02\\xdb\\x3a\\x90\\x37\\x67\\xb8\\x79\\xa2\\xaf\\x9d\\xaa\\x15\\x58\\x43\\x11\\x1a\\xf1\\x5a\\x2b\\xc3\\x5e\\xfe\\x41\\xbc\\xc9\\x2c\\x82\\x07\\xe0\\x01\\x13\\xb0\\x4f\\x13\\x03\\x00\\x79\\x49\\xff\\xb6\\xce\\x8d\\xf4\\xb0\\xb3\\x42\\x48\\xfe\\xdf\\x5d\\x9c\\xb2\\xce\\xe9\\x4b\\x81\\x2e\\xd5\\x8e\\xce\\x2a\\x0c\\xe0\\x45\\x4c\\xf1\\x4c\\x20\\xe4\\x9e\\x09\\xfe\\x66\\x4d\\x6e\\x25\\x76\\x2e\\x87\\x89\\x59\\x32\\xcd\\x5c\\xd3\\x2e\\xb6\\xa3\\xab\\xb3\\x8e\\xe1\\x63\\x07\\x8c\\x13\\x3e\\x93\\x58\\x87\\x91\\xdb\\xf6\\xaf\\x49\\x9a\\x31\\xea\\x44\\x53\\xbb\\xcc\\x7a\\x85\\xe4\\x06\\xc9\\x84\\x8a\\x66\\x40\\x52\\xf1\\x11\\x13\\xfb\\xb4\\xff\\xa7\\x60\\xde\\xe4\\xc2\\x61\\xe3\\x96\\x94\\x24\\x91\\x11\\x9d\\xa2\\x9a\\x33\\x58\\x2f\\x82\\x1d\\x41\\x25\\xe0\\xb4\\x16\\x2f\\x28\\xbe\\xb0\\x66\\x03\\x1a\\x65\\x2d\\x05\\x74\\x9a\\xa7\\x24\\x4d\\xd4\\xf3\\xd3\\xbb\\x15\\xd2\\x68\\x32\\x8d\\x6a\\x02\\xfc\\xe2\\x50\\x18\\x15\\x25\\x7f\\x8a\\xd5\\xaf\\x4e\\xcb\\xe7\\xcb\\x8a\\xe9\\x66\\x1e\\x34\\x4f\\x90\\x72\\x31\\x87\\x91\\xf3\\xe8\\x59\\x09\\x11\\x21\\xe0\\x8a\\xef\\xca\\x89\\x82\\xea\\xaf\\x66\\x25\\x9d\\x9d\\xe4\\xf4\\x6a\\x31\\xe7\\x16\\xdc\\x03\\x3d\\x0f\\x95\\xd1\\xfa\\x93\\x6b\\x6c\\x60\\x79\\xb1\\x37\\xdd\\x11\\x58\\xd1\\xde\\xf1\\x13\\x01\\x8c\\x73\\xf8\\xeb\\xb9\\x80\\x7e\\x0f\\x74\\x15\\x40\\x4e\\xa9\\xc7\\x85\\x44\\xac\\xe7\\xce\\x46\\x3c\\xd1\\xd1\\xc5\\x7e\\x31\\xf4\\x09\\x1b\\xc0\\x91\\x80\\x4c\\xbc\\xdd\\xad\\x0e\\x15\\xa4\\x0c\\xa9\\x1a\\xcb\\xe1\\xc6\\x22\\x4e\\xd1\\x3c\\xaf\\xb4\\xdf\\x2c\\x84\\xac\\x9f\\x0c\\x3c\\x9b\\x54\\x60\\x07\\xd9\\xdd\\x6e\\x52\\x4c\\x46\\x70\\x72\\x56\\x3d\\x4a\\xc0\\xd7\\x00\\xcc\\x1b\\xf3\\x0f\\xeb\\xb3\\x34\\x31\\x3d\\xae\\x57\\x61\\x74\\x5e\\xc0\\xa5\\xe9\\xe8\\x81\\x50\\x25\\x95\\x8f\\x00\\xfa\\x2e\\x58\\x06\\x0d\\x7e\\x9a\\x5f\\x2b\\x72\\x7f\\x48\\x69\\x9f\\x92\\x9c\\x84\\x59\\x93\\x08\\x92\\x57\\x3f\\x78\\x4f\\xef\\x56\\x92\\x51\\x8b\\x5c\\xa2\\x68\\xe2\\xa7\\x3e\\xbe\\xad\\x6e\\xbd\\xeb\\x7e\\xc2\\x4e\\xac\\x92\\xaa\\x7d\\xcb\\x41\\xb5\\x98\\xbd\\x6e\\xff\\x36\\x32\\xd0\\x69\\x72\\x62\\x91\"},\n{{0x55,0x32,0xe0,0x9b,0x93,0x7f,0xfd,0x3d,0x5f,0x4c,0x1d,0x9f,0x1f,0xfc,0xde,0xd2,0x6e,0xe7,0x4d,0x4d,0xa0,0x75,0x26,0x48,0x44,0x69,0x0b,0xd9,0xc8,0x61,0x39,0x94,},{0x50,0x93,0x96,0x9f,0x37,0x7b,0xec,0x3e,0x35,0xf5,0x9e,0xfd,0xa0,0x1a,0xb4,0x18,0x6c,0x5d,0x2a,0x36,0x74,0x0c,0xf0,0x22,0x67,0x5e,0x01,0x09,0x6b,0x1a,0x3f,0x0a,},{0xd5,0x27,0xff,0x0d,0x4a,0x21,0x9d,0x61,0xf4,0x18,0x12,0x12,0x06,0xa5,0x4a,0xe4,0x98,0x58,0x54,0xa3,0x10,0x48,0x27,0x44,0x48,0x6e,0x4d,0x13,0x0a,0x7d,0xe9,0x7c,0x31,0x9d,0xf8,0x37,0x2c,0x82,0x82,0x8c,0x93,0x6e,0x6a,0x8a,0xfd,0x9c,0x5d,0xe1,0x82,0x85,0x73,0xd8,0x26,0x1a,0xe9,0x36,0x5b,0x8f,0x23,0x76,0x76,0x18,0x24,0x02,},\"\\xad\\xd4\\xd7\\xa9\\xce\\x3f\\x63\\xd1\\xf9\\x46\\xe8\\x67\\x90\\x65\\x54\\x5d\\x8c\\x7b\\xf0\\xa2\\xcc\\x3a\\x4c\\x00\\xb8\\xf1\\x42\\xf0\\x94\\x5a\\xe3\\x62\\xc4\\xc9\\x46\\x2a\\x75\\x76\\xa4\\x05\\x9d\\x57\\x86\\x16\\x62\\x88\\x4b\\xd8\\x0b\\x96\\xd9\\x0d\\x27\\x9a\\x95\\x2e\\xda\\x95\\x2d\\x37\\xd4\\xf9\\x5c\\xf0\\xd7\\x0d\\xa9\\x8f\\x4f\\xba\\xca\\x39\\xe1\\x69\\xf9\\xd9\\x45\\xd4\\x1f\\x87\\x23\\x97\\xbb\\xdd\\x57\\x01\\x45\\x43\\x03\\xd7\\x7d\\x31\\xe8\\x63\\x48\\x27\\x1d\\xa4\\x0a\\x1b\\x8f\\x1e\\x57\\xc3\\x6f\\xcd\\x80\\x3e\\x14\\xfa\\x17\\x71\\x6c\\x56\\x31\\xef\\xa0\\x1d\\x3a\\x79\\x5d\\xc2\\x0b\\x2b\\xde\\x36\\xab\\x73\\xff\\x6a\\x2d\\x53\\x3b\\xc1\\x5c\\xce\\x22\\x32\\x87\\x13\\xc3\\xc9\\xcc\\xd0\\x72\\xc3\\xe4\\x50\\xd7\\xf2\\x2c\\x0c\\x9f\\x94\\x91\\x97\\x52\\xcb\\xfe\\x45\\xee\\x65\\x5d\\x1b\\x53\\x67\\x65\\x93\\xcd\\xb4\\x48\\x70\\x41\\x02\\x63\\x1c\\xaa\\xa9\\x76\\x95\\x2e\\xaa\\x1f\\x6c\\x2e\\x87\\x65\\x64\\xe4\\x20\\xf0\\xc6\\x46\\xa0\\xf8\\x83\\x65\\xf7\\x64\\x15\\xb4\\x08\\x5f\\x60\\xa3\\x38\\xb2\\x9c\\x51\\x63\\x3e\\x54\\x0f\\x0b\\xf3\\x2d\\x40\\x87\\xe7\\xd0\\xfb\\x68\\x5b\\xe8\\x8c\\x75\\x95\\xdc\\x53\\x1c\\x99\\xb4\\x89\\x58\\x45\\x60\\xad\\x82\\x34\\xb1\\x8e\\x39\\xa1\\x07\\xcf\\x5d\\x84\\x2d\\xab\\xd4\\x21\\xe7\\x7d\\x26\\xea\\x5e\\x0f\\x14\\x05\\xce\\x35\\xfe\\x79\\x27\\x14\\xeb\\x4e\\xe1\\xa8\\x01\\x76\\x48\\xac\\x1a\\xe7\\x39\\xa3\\x3d\\x7b\\x1e\\x08\\x91\\x05\\xd1\\xe5\\xad\\xd2\\x7a\\x62\\xce\\x64\\x15\\x45\\x70\\x34\\x0a\\xf9\\xeb\\x14\\xe7\\xfd\\xfc\\x2f\\x9a\\x2c\\x2f\\xcf\\xcd\\xac\\x3c\\xc4\\x22\\x77\\x63\\xf4\\xd6\\x29\\x49\\x74\\x79\\xf8\\x49\\x21\\x6e\\x5d\\x90\\xec\\x16\\xdf\\xa3\\x6b\\x72\\x51\\x7f\\x7b\\x54\\x86\\xba\\xee\\x7f\\xda\\x44\\x50\\xc3\\x52\\xcf\\xfb\\xba\\xe7\\x39\\x26\\xc8\\x43\\x22\\x4f\\x8c\\xe4\\x4b\\x38\\xda\\xe5\\x3f\\x3e\\xad\\x21\\x89\\x0b\\x52\\xa7\\x80\\x10\\x75\\x29\\x16\\x84\\xfd\\x59\\x10\\xed\\x86\\xad\\x33\\xe8\\xa0\\x07\\xf6\\xc3\\xf8\\x5c\\x16\\xb2\\x09\\x29\\x37\\x40\\x18\\x4f\\x58\\x90\\x87\\x4d\\x43\\x1c\\xd4\\xe0\\xea\\x40\\x87\\xc4\\x9c\\x34\\x71\\xd7\\x89\\xc8\\x13\\xc6\\xdc\\x9a\\x78\\x69\\x93\\x63\\xa1\\xd8\\x71\\x97\\xd3\\xb9\\x2c\\x02\\x86\\x68\\x93\\x11\\x82\\x3f\\x4d\\xf2\\x2c\\xe8\\x03\\x5e\\x75\\x73\\x2c\\xde\\xa7\\xf5\\x62\\x1f\\x67\\xdb\\x0e\\x2a\\x4c\\xa6\\x61\\x61\\x93\\x22\\x1c\\x0a\\xa3\\xd6\\xde\\x50\\xd8\\x52\\x82\\xee\"},\n{{0xeb,0x36,0x51,0x10,0x09,0xd3,0x7a,0x9c,0x46,0xc4,0xd1,0x37,0x4d,0x0b,0xbd,0x0d,0x99,0x81,0xe7,0x8c,0xee,0x7d,0x18,0x8c,0x5a,0xab,0x98,0x3e,0xc2,0x39,0xe1,0x0c,},{0xb1,0xcc,0x21,0x2b,0x45,0x21,0xbb,0xe7,0xb1,0x9a,0x76,0x93,0x87,0x8a,0x55,0x84,0x40,0xee,0xc3,0x62,0x05,0xd8,0x43,0x9d,0x04,0x0a,0x46,0xa9,0x90,0x2f,0xbf,0x55,},{0x9f,0x58,0x37,0x24,0xde,0x55,0x2e,0xae,0x82,0xf2,0x54,0xac,0x6e,0x2e,0xd4,0x83,0xec,0x1a,0x07,0x34,0x62,0x66,0x73,0x5c,0x49,0x09,0x20,0x69,0x0c,0x1e,0x3f,0xb2,0xa9,0xe9,0xa3,0x41,0x94,0xed,0x64,0x73,0x73,0x3b,0x30,0x0d,0x4f,0x23,0xc9,0xae,0xc0,0xda,0x5a,0x20,0x22,0x05,0x4c,0xa4,0x38,0x85,0xa1,0x5a,0x29,0x84,0x32,0x0e,},\"\\xba\\x24\\x66\\xe5\\x6c\\x1d\\xf7\\x7f\\x22\\xb6\\xf0\\x24\\x1f\\xc7\\x95\\x2a\\xe9\\xbc\\x24\\x75\\x64\\x19\\xa9\\x44\\x6d\\xd2\\xb4\\x9e\\x2c\\xb9\\xdf\\x59\\x4e\\x5b\\x6c\\x77\\xa9\\x5a\\xa5\\xfb\\xd9\\xdc\\x57\\xfe\\xc8\\x39\\x62\\xc7\\x75\\x1e\\xeb\\xb4\\xba\\x21\\x82\\x53\\xf9\\x16\\xa9\\x22\\xa5\\x13\\x96\\x63\\xe3\\x20\\x3e\\x3b\\xe4\\x82\\xbe\\x37\\x9c\\xa1\\x51\\xc4\\x63\\xd9\\xad\\xa2\\x14\\x46\\x13\\x5f\\x35\\x69\\x94\\xfa\\x54\\x49\\xf0\\x84\\x47\\x8f\\x5b\\xb4\\xf5\\xba\\x61\\x45\\xc5\\x15\\x8e\\xb7\\xb1\\xc4\\x3c\\x32\\xeb\\xea\\x25\\xe0\\x9c\\x90\\x0f\\x01\\xef\\x91\\xe9\\x2f\\x88\\xc0\\x3c\\x76\\x50\\x4a\\xce\\x96\\x46\\x01\\x6f\\xfc\\x27\\x89\\x55\\x9d\\x0f\\x3c\\xc9\\xd0\\x0f\\xb6\\x1b\\xdc\\x6a\\xf7\\xd3\\x94\\x0f\\x30\\x2e\\x58\\x8e\\x04\\xf7\\x9f\\x7b\\x3d\\x4b\\x91\\xa5\\xd1\\x93\\xa4\\xf8\\x22\\x2b\\xfe\\xb6\\x9b\\xf0\\x34\\x7d\\x98\\xad\\x81\\xef\\x99\\xd1\\x30\\xeb\\xc7\\xb3\\x6b\\x07\\x83\\x39\\x4e\\xea\\x92\\xa3\\x8d\\xdd\\x5e\\x74\\x80\\xd2\\xad\\xd4\\xe4\\xde\\xf5\\x3e\\xb9\\x9c\\x44\\x9b\\xff\\x94\\xe4\\x71\\x8b\\x09\\xf2\\xea\\x9b\\x1f\\x2b\\x88\\x65\\x94\\xa9\\x5c\\x33\\xa6\\x9e\\x03\\x33\\x15\\x4e\\x44\\x0a\\xb3\\x4b\\x7b\\x6c\\x11\\x34\\xd8\\x17\\x9b\\x6f\\x0c\\x56\\x25\\x1a\\x9a\\xd8\\xe1\\xb6\\xb0\\xf9\\xb8\\xa5\\xc9\\x70\\x81\\xa7\\xf8\\xfd\\x05\\xd0\\xb0\\xaf\\xfc\\x82\\xdb\\xdd\\xc8\\xb0\\xc0\\xab\\x7e\\x83\\x3f\\x30\\x06\\x26\\xd4\\xb9\\x73\\xb3\\xf6\\x0f\\xea\\xc5\\x55\\x71\\xe8\\x9c\\xda\\x0f\\x2b\\x44\\x1e\\xd2\\xfa\\xa6\\x69\\xa7\\x0d\\x55\\x6c\\xb4\\x8f\\x9b\\x1d\\x1c\\xbc\\xe3\\x2e\\xde\\x5d\\x16\\x6b\\x11\\x43\\xe2\\x64\\xb1\\x1e\\xa3\\x27\\x68\\x1c\\xb5\\x59\\xed\\xd1\\x3c\\x36\\x4b\\xd2\\xba\\xf1\\xfd\\x54\\xbb\\x78\\x18\\x07\\xbd\\x59\\xc8\\x68\\xb0\\xe4\\x79\\x5a\\x77\\x9e\\x67\\xf0\\xbd\\x0d\\x14\\xb5\\xa6\\xb9\\xe4\\x40\\xb5\\x7a\\x58\\x23\\x32\\x8b\\x59\\xaf\\xfb\\xd0\\x27\\xed\\xa7\\xdd\\x78\\x50\\x79\\xc5\\xf0\\x2b\\x5e\\x32\\x89\\x0b\\x03\\x87\\x30\\x98\\x6a\\x39\\xa5\\xa9\\x83\\x4a\\x3f\\xed\\x86\\x8b\\x6f\\x45\\xcb\\xdd\\x28\\xac\\xb2\\x70\\x9a\\xff\\x55\\x62\\x63\\x86\\x4f\\x9a\\xe1\\xe7\\x57\\xb3\\x27\\x8c\\x28\\x8d\\xbe\\x29\\x32\\x82\\x57\\x12\\x77\\x3e\\x43\\x1f\\x7c\\x29\\x32\\x98\\x57\\xfd\\xae\\xa7\\x98\\xed\\x93\\x92\\x08\\x93\\x63\\x14\\x02\\xe6\\xb1\\x3b\\xab\\x62\\xb4\\x85\\x54\\x61\\xed\\xb9\\x46\\x20\\xf2\\xd1\\x75\\x18\\x65\\xf4\\x45\\xc4\\x66\"},\n{{0x7d,0xbc,0x81,0x90,0x2e,0x4e,0xaa,0xb3,0x07,0x75,0x40,0xf5,0x59,0x99,0x5c,0x38,0x74,0x03,0xca,0xc3,0x06,0xd4,0x86,0xe9,0x59,0xc5,0xeb,0x59,0xe4,0x31,0xc0,0xa8,},{0xe0,0x30,0x66,0x13,0x90,0x82,0xf6,0x13,0x44,0x8b,0xdb,0xc2,0x7f,0xe5,0x3a,0xa3,0xf8,0x89,0x94,0xc3,0x1d,0xdc,0xe0,0x02,0xe3,0x6b,0xbb,0x29,0x63,0xdf,0x3e,0xc8,},{0x5b,0x7f,0x65,0x2f,0x08,0xf2,0x29,0xfd,0xa1,0xb0,0xbd,0x75,0x93,0x77,0xb3,0xfb,0x72,0x6c,0x1b,0x9c,0x9a,0x10,0xef,0x63,0x42,0x6d,0x35,0x2d,0xd0,0x86,0x9b,0xd5,0x4d,0x87,0x6c,0x30,0x92,0xf1,0xcd,0x41,0x1c,0x37,0x57,0xd3,0xc6,0xb6,0xea,0x94,0x2a,0xa7,0x0c,0x3a,0xae,0xb4,0x21,0x7a,0x4c,0x73,0x64,0xd1,0x8e,0x76,0xe5,0x0f,},\"\\xdf\\xf7\\x98\\xb1\\x55\\x7b\\x17\\x08\\x5a\\x06\\x34\\x37\\x1d\\xed\\x5d\\xdf\\x7a\\x5a\\xcb\\x99\\x6e\\xf9\\x03\\x54\\x75\\xe6\\x82\\x63\\x36\\xf6\\x4a\\xd8\\xb8\\x4b\\x88\\x2e\\x30\\xba\\xde\\xc2\\xb4\\xa7\\x11\\x99\\x87\\x52\\xf4\\xa1\\x57\\x4b\\xc1\\xf8\\x9d\\x43\\x25\\xcf\\x2b\\x39\\x86\\x10\\x44\\xdd\\x03\\x69\\x1e\\x71\\xd0\\x77\\x68\\xb5\\x93\\x3a\\x30\\x52\\xcc\\x7c\\x81\\xd5\\x71\\xa9\\xde\\x06\\x1d\\xc1\\x90\\x26\\xc2\\xf1\\xe7\\x01\\xf2\\xdc\\xf2\\x6a\\x88\\xd3\\x40\\x1b\\xc9\\x9f\\xb8\\x15\\x59\\xdc\\xa7\\x6d\\x8a\\x31\\xa9\\x20\\x44\\xa2\\x73\\x58\\x7d\\x62\\x2a\\x08\\xd1\\xcc\\xe6\\x1c\\x8f\\x94\\x8a\\x34\\xde\\xd1\\xac\\xb3\\x18\\x88\\x1c\\x9b\\x49\\xf6\\xf3\\x7c\\x30\\xa6\\x5d\\x49\\x5b\\x02\\xd5\\x42\\x9e\\x7a\\xb4\\x04\\x0d\\x8b\\xeb\\xeb\\x78\\x79\\x4f\\xf7\\x36\\xd1\\x51\\x10\\x31\\xa6\\xd6\\x7a\\x22\\xcd\\xf3\\x41\\xb9\\x80\\x81\\x1c\\x9d\\x77\\x5f\\xb1\\x9c\\x64\\x78\\xf0\\x5e\\xd9\\x84\\x30\\x10\\x3e\\xa2\\x4c\\x0f\\x41\\x4d\\x4c\\xc0\\x7d\\x86\\x0b\\x72\\xdc\\x54\\x2f\\xf2\\x2d\\x83\\x84\\x5a\\x42\\xf8\\xba\\x45\\xca\\x7f\\xf3\\xaa\\xb0\\xb1\\xe7\\xde\\x2b\\x10\\x94\\xde\\xac\\x08\\xd1\\x6e\\xee\\x01\\x96\\x9f\\x91\\xbc\\x16\\xfe\\xc2\\x9c\\xcc\\x06\\x1c\\x54\\xdb\\x53\\x45\\xba\\x64\\x84\\x2d\\xac\\xc9\\x9e\\xe7\\x72\\x94\\x68\\xd8\\x0a\\x3f\\x09\\x55\\x83\\xd8\\xe8\\x01\\x24\\x08\\x51\\x9d\\x58\\x2c\\xc3\\xff\\x9a\\x2e\\xb7\\xae\\xba\\xa2\\x2d\\xb8\\x1f\\xfc\\x78\\xee\\x90\\xef\\x4e\\xc5\\x89\\xdc\\xce\\x87\\x11\\x8d\\xab\\x31\\xa6\\x32\\x8e\\x40\\x9a\\xd5\\x05\\x9a\\x51\\x32\\xc8\\x2d\\xf3\\xce\\xfe\\x2e\\x40\\x14\\xe4\\x76\\xf0\\x4c\\x3a\\x70\\x18\\xe4\\x52\\x67\\xec\\x50\\x18\\xec\\xd7\\xbf\\xf1\\xdd\\xa9\\x26\\x7e\\x90\\x66\\x6b\\x6b\\x14\\x17\\xe8\\x9d\\xda\\xcb\\x50\\x85\\x94\\x3b\\xef\\xc7\\xad\\x2f\\x4d\\xf5\\xf1\\xee\\x0a\\xf9\\x43\\x1a\\xee\\xb6\\xb2\\x4a\\x55\\x15\\xb9\\x3d\\xbc\\xf6\\x86\\x40\\xf7\\xda\\xf8\\xc9\\x61\\xe5\\x67\\xd7\\x53\\x49\\x00\\x20\\x5c\\x3d\\xf2\\x18\\x4b\\x6a\\xc2\\xda\\x96\\x1c\\x4c\\x1d\\x2b\\xc4\\x9b\\x4e\\xa9\\x6b\\x81\\x54\\xff\\xd4\\xef\\xff\\xdc\\x5e\\x55\\xa7\\x11\\x9c\\xb8\\xaf\\x42\\x9e\\x85\\x10\\x5d\\xff\\xd4\\x1f\\xe4\\xa2\\xeb\\xba\\x48\\x16\\x8a\\xa0\\x5f\\xa7\\xdf\\x27\\xc4\\x29\\x87\\x35\\xff\\x86\\x8f\\x14\\x96\\xbe\\xb4\\xb2\\xed\\x0b\\x89\\x80\\xc7\\x5f\\xfd\\x93\\x9d\\xdd\\x1a\\x17\\xe4\\x4a\\x44\\xfe\\x3b\\x02\\x79\\x53\\x39\\xb0\\x8c\\x8d\"},\n{{0x91,0xb0,0x95,0xc8,0xa9,0x99,0xe0,0x3f,0x3e,0xd7,0x49,0xcd,0x9f,0x2f,0xaa,0xcc,0x00,0x76,0xc3,0xb4,0x77,0xa8,0x7a,0xb5,0xcc,0xd6,0x63,0x17,0x38,0x76,0x74,0x46,},{0xda,0xd1,0x74,0xd3,0x59,0xda,0xec,0xca,0x9c,0x6b,0x38,0x9b,0xa0,0x96,0x45,0x2a,0xb5,0xca,0x91,0xe6,0x38,0x3c,0x6d,0x04,0x2a,0x28,0x4e,0xce,0x16,0xba,0x97,0xb6,},{0x64,0xee,0x9e,0xfd,0xb0,0xc2,0x60,0x1a,0x83,0x5f,0x41,0x85,0x20,0x64,0x1e,0x43,0x6c,0x7d,0xd4,0x7c,0x33,0x3d,0x9f,0xc3,0x0c,0xfb,0xb9,0xe3,0x90,0xfe,0x76,0x45,0x30,0x65,0x47,0x08,0xb4,0x0b,0x03,0x58,0x18,0x99,0xa9,0xac,0x87,0x0e,0xfd,0x76,0x6f,0xfb,0xb4,0x63,0x71,0x52,0xf8,0xff,0x27,0x79,0x64,0xfe,0x35,0x42,0x52,0x09,},\"\\x9b\\x0d\\x8b\\x00\\x29\\x98\\x52\\xd6\\x8b\\xbf\\x49\\x7f\\xe6\\x03\\x96\\x1a\\x48\\x54\\x66\\xa9\\x9a\\x54\\x84\\x00\\x5d\\xb7\\x3d\\x4e\\x4b\\xad\\x81\\x4e\\x85\\x74\\xef\\xd5\\x4d\\x64\\x8b\\xd5\\xc9\\x1a\\xe8\\x48\\x3c\\x54\\xb2\\xf9\\x98\\xb0\\x2e\\x1a\\xbd\\x6f\\x40\\x1a\\x25\\x52\\x68\\x43\\xa5\\xf2\\xa2\\x3a\\x97\\xbd\\x58\\x9d\\x1f\\x7e\\x1a\\xb1\\x49\\x15\\xb1\\xe3\\x59\\xa3\\x96\\xd3\\x52\\xc3\\x60\\xae\\x65\\x84\\x32\\x5a\\xe4\\xbb\\x7d\\x62\\x4f\\x61\\x25\\x5c\\x5c\\x7b\\xf0\\xa6\\x7a\\xca\\xb4\\x6c\\x3b\\x57\\xb3\\x45\\x34\\xc0\\xee\\x84\\x31\\xd2\\x60\\x57\\x66\\x06\\xcb\\xd8\\x4d\\x8d\\x18\\x39\\xe7\\x3d\\xa6\\xfe\\x4b\\x0b\\x8b\\x78\\xf0\\xf9\\x58\\x82\\x7c\\x2f\\x1d\\x93\\xba\\x7a\\x34\\x6d\\xcc\\x75\\xcb\\x56\\x3d\\xff\\xde\\x26\\xf9\\x97\\x59\\x8e\\x8b\\x5c\\x2f\\x16\\x17\\xc6\\xfe\\xfc\\x9b\\xe4\\xb2\\x8b\\x54\\x01\\xb0\\x00\\x64\\x13\\xa2\\x51\\x69\\x0d\\x12\\x03\\xaa\\xae\\x4f\\x6d\\x8a\\x3f\\xb2\\x1f\\x24\\x00\\x9a\\xb3\\xbf\\xf1\\x37\\x37\\xa8\\xa7\\xe6\\x64\\x6c\\x02\\x73\\x2d\\x9e\\xc5\\xa4\\xa5\\x10\\x46\\x9e\\x2d\\x29\\x9e\\x4c\\xc1\\xad\\x64\\x80\\xa4\\x82\\xaa\\x95\\x6f\\x89\\xdd\\xcc\\xcc\\x64\\xa1\\x36\\xfb\\x15\\xb8\\x76\\xb6\\xec\\xd8\\x8c\\x7c\\x86\\xa4\\xdf\\xc6\\x0e\\x66\\x62\\x07\\xc6\\x04\\x16\\x7d\\x16\\x34\\x40\\xca\\x9a\\xb9\\xcf\\x87\\xa5\\xe0\\xf7\\xbb\\xc5\\x51\\x7d\\xe4\\xde\\xe8\\x76\\xc0\\x37\\xf8\\xcc\\x9d\\x95\\x9c\\x8f\\xf5\\xdb\\xe9\\x44\\xff\\x54\\xcd\\x91\\xa7\\x71\\xe2\\x92\\x31\\xf8\\xb5\\xf1\\x7d\\x61\\xde\\x90\\x4c\\x95\\x5f\\xe2\\x02\\x5d\\xc5\\x2e\\xd4\\x80\\xfb\\x3c\\xc9\\x0f\\x23\\x24\\x59\\xc6\\x07\\xef\\x7e\\x2a\\xdb\\x52\\xc7\\x48\\x2b\\xec\\xd6\\x7a\\xd2\\x14\\x9a\\x41\\x28\\xf9\\x84\\x03\\x8b\\x58\\xaa\\x90\\x17\\x67\\x82\\x39\\x36\\x04\\xaa\\xc7\\x4c\\x18\\x20\\x9a\\x3d\\x6a\\x78\\x63\\x0c\\x01\\x95\\x5a\\x7c\\xec\\xe5\\xda\\x83\\x84\\xda\\x3b\\xaf\\x63\\xaa\\x2d\\xdf\\x59\\x63\\xfa\\xe0\\x5b\\xa3\\xb8\\x1c\\x6a\\x03\\xd8\\x6a\\x00\\xef\\x78\\xed\\xb4\\x18\\x4f\\xdc\\x89\\xb1\\xd6\\xbf\\xeb\\x31\\x0f\\xd1\\xb5\\xfc\\xce\\x1e\\x21\\x95\\x24\\xa3\\xcf\\xb2\\xe9\\x72\\x57\\x7f\\x06\\xb1\\xdd\\xde\\xba\\x00\\x86\\x5d\\xae\\x49\\x79\\x00\\x0c\\x00\\x8a\\xd9\\x9f\\x3b\\x63\\x8c\\xce\\xb8\\xe8\\xc7\\xa0\\xf9\\x98\\xd3\\x4d\\x92\\x14\\x3d\\x81\\xc0\\xe1\\xc0\\x96\\xa9\\x25\\xce\\xba\\x65\\xc4\\x30\\x03\\xee\\x18\\xd4\\x94\\xd0\\x03\\xe9\\xc6\\x1f\\x77\\xd6\\x57\\x59\"},\n{{0x8c,0x56,0x8b,0x31,0x0a,0xce,0x7d,0x1f,0x0e,0xde,0xce,0xfd,0x60,0x3a,0x88,0x40,0x00,0x54,0x4c,0x79,0x25,0x65,0xd4,0x81,0xc3,0xd3,0xe0,0x6e,0x2d,0x82,0xca,0x96,},{0x5f,0xa6,0xe2,0x67,0xc7,0x66,0x73,0x68,0x41,0x41,0x10,0x72,0xd1,0x98,0x3d,0x19,0x00,0xac,0xf0,0x1d,0x48,0xc3,0xce,0x11,0x77,0x0b,0x26,0xf7,0x8d,0xa9,0x79,0xf7,},{0xde,0xbd,0xd8,0xe5,0xd3,0x11,0x2f,0xd7,0x7b,0x39,0x4a,0xa0,0xe3,0x6e,0x94,0x26,0xba,0xc9,0x1d,0xf1,0x26,0xfa,0x9c,0x31,0x7c,0xea,0x7c,0x9d,0x45,0x95,0x7c,0xdd,0x96,0xa4,0x5a,0xe3,0xad,0x76,0x04,0x13,0xee,0x12,0x05,0xaf,0xd7,0x1a,0x29,0xf9,0xc3,0xcb,0x58,0x6c,0xd2,0xd7,0xcd,0x1e,0x93,0xbc,0x16,0x52,0xfc,0x34,0xdc,0x04,},\"\\xb5\\x9f\\x5f\\xe9\\xbb\\x4e\\xcf\\xf9\\x28\\x95\\x94\\x72\\x1f\\x26\\x47\\x04\\x7b\\x0d\\xa5\\xe0\\xe4\\x94\\x1b\\xbe\\x57\\xc5\\xb7\\x22\\xb4\\x76\\x72\\x3f\\x0a\\xc5\\x97\\x0b\\x41\\x11\\xf8\\x93\\xbc\\xaa\\x41\\x1f\\x28\\xfc\\xeb\\x4f\\x58\\x5a\\x2a\\x71\\x87\\x01\\x8a\\x90\\x4b\\x70\\xef\\x8f\\xe1\\xf6\\x56\\x9a\\x54\\xd0\\x0a\\xda\\x37\\xb6\\x9c\\xb5\\xe9\\xc9\\xd2\\x6c\\x16\\xa9\\x03\\x51\\x81\\x48\\xe0\\x4a\\x1b\\x93\\x6a\\x32\\x32\\x9c\\x94\\xee\\x1a\\x8f\\xb6\\xb5\\x91\\x89\\x2c\\x3a\\xff\\x00\\xbf\\x6e\\x44\\xdd\\x0a\\x76\\x2b\\xab\\xe8\\x9d\\x70\\x60\\xc1\\x7b\\x90\\x39\\x0d\\x23\\xbf\\x9d\\x36\\x0a\\x29\\x3b\\x83\\x08\\x38\\x30\\x86\\x91\\x6e\\x11\\x82\\xb1\\xba\\x43\\x36\\xf0\\x01\\xb8\\xd2\\x0d\\xea\\xe9\\xa0\\x29\\xf7\\xe8\\x53\\x97\\xa9\\xae\\x5c\\xf3\\xca\\x10\\xc7\\xf3\\x87\\x55\\x88\\xb8\\xff\\xab\\xb0\\x63\\xc0\\x0c\\xa2\\x6f\\x58\\x0f\\x69\\xed\\xc5\\x27\\xa1\\xac\\xcf\\x4f\\x41\\x39\\x7b\\x33\\x76\\x6b\\xcf\\x6d\\x55\\xeb\\x8d\\xe0\\x81\\xa4\\x8c\\x98\\x1d\\x05\\xc0\\x66\\x61\\x7b\\x80\\xd8\\xf6\\xf5\\xe6\\x0e\\x59\\xdd\\x9b\\x93\\x0b\\xc4\\xd0\\x45\\x86\\x40\\x3b\\xb8\\x68\\xdf\\x75\\x93\\x3b\\xdd\\x86\\x23\\x0e\\x44\\x70\\x36\\xc1\\x75\\xa1\\x0d\\xe9\\xbb\\x39\\x95\\x3d\\xcb\\x19\\x66\\xa1\\xf1\\x19\\x12\\x07\\x8e\\x35\\x8f\\x48\\xc5\\xb2\\x09\\xa6\\x36\\xc7\\xf7\\x83\\xf4\\xd3\\x6a\\x93\\xad\\x2c\\xc2\\xe3\\x24\\x45\\x19\\x07\\x8e\\x99\\xde\\x1d\\x51\\x58\\xb3\\x96\\x1e\\x0f\\xc5\\xa4\\xf2\\x60\\xc2\\x5f\\x45\\xf5\\xe8\\x58\\x5e\\x60\\x1d\\xb0\\x8b\\xa0\\x58\\xd2\\x90\\x9a\\x1b\\xf4\\x99\\x5f\\x48\\x13\\x46\\x0d\\x36\\x95\\x03\\xc6\\x87\\x36\\x85\\xeb\\xcd\\x33\\x30\\xa1\\x30\\xb7\\x5f\\x23\\x65\\xfb\\x2a\\x5a\\x34\\xea\\x63\\xd9\\x58\\xa2\\xa8\\x67\\xe9\\x05\\x52\\xd2\\xce\\xc8\\xc3\\x90\\x08\\x4b\\xe0\\xc1\\x08\\xb0\\xfd\\x2d\\x83\\xcb\\x92\\x84\\xdb\\x5b\\x84\\x2c\\xbb\\x5d\\x0c\\x3f\\x6f\\x1e\\x26\\x03\\xc9\\xc3\\x0c\\x0f\\x6a\\x9b\\x11\\x8e\\x1a\\x14\\x3a\\x15\\xe3\\x19\\xfd\\x1b\\x60\\x71\\x52\\xb7\\xcc\\x05\\x47\\x49\\x79\\x54\\xc1\\xf7\\x29\\x19\\x9d\\x0b\\x23\\xe5\\x38\\x65\\x40\\x3b\\x0a\\xd6\\x80\\xe9\\xb4\\x53\\x69\\xa6\\xaa\\x38\\xd6\\x68\\x5a\\xbd\\x39\\x7f\\x07\\xfb\\xca\\x40\\x62\\x7e\\xca\\xf8\\xd8\\xd3\\x01\\x33\\xa6\\xd9\\xd5\\xaf\\x00\\x91\\x92\\x75\\x1c\\x9c\\x45\\xf7\\x7c\\x0b\\xc0\\x11\\x26\\x88\\x00\\xbf\\x55\\x25\\x12\\x73\\x0e\\x69\\x97\\x3c\\x5b\\xf3\\x62\\xab\\x16\\x48\\x94\\xbf\"},\n{{0x3d,0x09,0xaf,0xce,0xe3,0xc4,0x32,0xfd,0xfb,0x6b,0xdc,0xea,0xd5,0x4e,0x3d,0xa5,0xb1,0xb4,0x16,0x5c,0x50,0xd6,0xd3,0x10,0xb7,0xfa,0xd7,0x87,0xb4,0x44,0xd6,0x80,},{0xb0,0xd9,0x02,0x8c,0x4d,0x14,0x87,0xd2,0x93,0xed,0x58,0x5a,0x76,0xbc,0x94,0xff,0xfb,0xaf,0xe2,0xc6,0x5d,0x98,0x0c,0x49,0x4e,0x14,0x1e,0x48,0x10,0xa3,0x5c,0xb9,},{0x89,0x73,0x9f,0xe4,0x41,0xca,0x0c,0xed,0x08,0xa6,0xeb,0x57,0x96,0xe9,0xbd,0xda,0x0e,0x74,0xfb,0x47,0x35,0x28,0xfd,0x49,0x07,0xed,0xb6,0x59,0xaa,0xb4,0x4d,0x33,0x43,0x22,0x90,0x46,0x71,0x63,0x68,0xfa,0xf8,0x8e,0x85,0xc1,0x64,0x4a,0xf6,0x6f,0xf2,0xdc,0xaf,0x0b,0x17,0xac,0x93,0xca,0x13,0x81,0x9f,0x3f,0x24,0x1d,0xd3,0x00,},\"\\x76\\x71\\x65\\xca\\xae\\x0e\\x57\\x8f\\x16\\x53\\x7e\\x17\\x50\\xbe\\x7d\\xe8\\x7a\\x78\\x9a\\x51\\xff\\x2d\\xe1\\x18\\x38\\xf5\\x64\\xe2\\x58\\x0b\\x23\\x91\\x36\\x2d\\x28\\x68\\xa5\\xa4\\x70\\x8a\\xf1\\x5d\\x2e\\x2d\\xb7\\xb9\\xbe\\x39\\xc1\\x6a\\xdc\\xc1\\x20\\x0b\\x34\\xe6\\xb4\\xd4\\x02\\x7d\\xdf\\xfc\\x1a\\x2a\\x35\\x95\\xe2\\x9e\\x85\\x5e\\xc5\\x26\\x1b\\x20\\xbd\\x55\\xc4\\x28\\xb0\\x13\\x09\\xba\\xdb\\x59\\xe2\\xca\\x3e\\xdb\\x96\\x7f\\xc2\\xf4\\xba\\xc0\\x72\\x9d\\xdf\\x54\\xfb\\x6c\\x20\\x05\\x7b\\xdd\\xa9\\xe7\\xaf\\x7c\\xbf\\xc0\\x92\\xfb\\xa8\\x65\\xfd\\x32\\x75\\xb9\\xd3\\xbc\\xb0\\xc3\\x46\\xb9\\x51\\xd1\\x70\\xac\\x9a\\xa6\\x50\\xa8\\x6d\\xf4\\x98\\x55\\xd4\\x8a\\x1b\\x37\\xce\\x56\\xc9\\xf2\\x73\\x89\\xf5\\xc8\\xb1\\x5f\\x5c\\x2c\\x90\\x0c\\x4f\\x10\\x7c\\x06\\x4f\\x60\\x3e\\x4f\\x86\\x7e\\xf2\\xe9\\xc1\\x0a\\x1b\\x74\\x21\\x0e\\x6b\\x89\\xbb\\x01\\x17\\x93\\xaa\\x85\\xde\\xd4\\x3b\\x51\\xb7\\x49\\xba\\x7f\\x70\\x28\\x7b\\x6b\\xc1\\xb8\\x94\\x34\\xdb\\x8b\\x8c\\x8b\\x5d\\x73\\xb2\\x14\\xb4\\x1e\\x36\\xb5\\x28\\x00\\x5b\\xfb\\xfe\\x00\\x2e\\x21\\xb1\\x00\\x6f\\xb9\\xd2\\x4b\\xab\\xd7\\x21\\x06\\xd0\\x93\\xe3\\xc7\\x09\\x3b\\x31\\x38\\xae\\xa7\\x19\\xd6\\x94\\x79\\x08\\x46\\x47\\x49\\x8c\\xd6\\xc9\\xbb\\xb7\\x44\\x50\\x9c\\xd7\\xda\\x8d\\xd6\\x1a\\x62\\x71\\x00\\xf0\\x3c\\x21\\xe7\\x50\\xac\\xb3\\xfc\\xf4\\x63\\x1d\\x7c\\x0f\\x61\\x81\\x54\\xd2\\xe5\\xfa\\x66\\x56\\xfb\\x76\\xf7\\x4c\\x24\\x79\\x50\\x47\\xbb\\xce\\x45\\x79\\xeb\\x11\\x06\\x43\\xfa\\x98\\xe1\\xf7\\x76\\xca\\x76\\xd7\\xa2\\xb7\\xb7\\xb8\\x67\\x81\\x73\\xc7\\x73\\xf4\\xbe\\x7e\\x18\\x2f\\xd2\\x4d\\xd7\\x62\\x91\\xac\\x67\\xd9\\xf2\\x6a\\x28\\xc5\\xe3\\xcb\\x02\\x5c\\x68\\x13\\xa3\\x78\\xb3\\x83\\x22\\x46\\x42\\xb4\\xae\\xfa\\xd0\\xc7\\x6a\\x65\\x79\\x51\\x7b\\x8f\\x36\\x07\\x97\\xdd\\x22\\x61\\x3e\\xe6\\x82\\xb1\\x79\\x38\\x19\\x50\\xfb\\x71\\x60\\x9a\\x5f\\xb5\\x49\\x4d\\x2d\\x57\\xdc\\xb0\\x0f\\x26\\xd1\\xe7\\x29\\x56\\xf4\\xd6\\x67\\x28\\x30\\xe0\\x5c\\x01\\xb3\\x77\\x96\\x77\\xc0\\x7e\\xa0\\x09\\x53\\xc6\\xb8\\xf0\\xdc\\x20\\x4c\\x8d\\xbd\\xcc\\xb3\\x81\\xbc\\x01\\xb8\\x9c\\x5c\\x26\\x1d\\xb1\\x89\\xab\\x1f\\x54\\xe4\\x6b\\xc3\\xed\\xc4\\xde\\x5a\\xd4\\xf0\\xeb\\x29\\xc0\\xa1\\x20\\xe4\\x37\\xcd\\x8f\\x37\\xac\\x67\\xd4\\x8c\\x7f\\x0e\\x73\\x02\\x78\\x70\\x8f\\x02\\xb5\\x4a\\xee\\x62\\xb7\\x29\\x52\\xbc\\x1c\\x0e\\xb4\\x37\\xca\\x8b\\xd5\\x65\\x54\\x37\"},\n{{0x41,0xc1,0xa2,0xdf,0x93,0x69,0xcd,0xc9,0x27,0x16,0x4a,0xa5,0xad,0xf7,0x75,0x71,0x36,0xab,0xe5,0x13,0x95,0x60,0x42,0x66,0x33,0x4c,0xc5,0x46,0x0a,0xd5,0x68,0x3e,},{0x40,0x55,0x78,0x34,0xcc,0xe8,0xe0,0x43,0x58,0x0a,0x42,0x72,0xa8,0x80,0x4d,0x4f,0x92,0x6e,0x88,0xcb,0x10,0xd1,0xdf,0x0c,0x5e,0x28,0xb9,0xb6,0x7e,0x1b,0x63,0xda,},{0xb8,0xb2,0x75,0x2a,0x09,0x71,0x96,0xc2,0x89,0x84,0x9d,0x78,0xf8,0x11,0xd9,0xa6,0x2f,0xc7,0x67,0x27,0x8f,0x0c,0x46,0x62,0x8b,0x52,0x1f,0x62,0xed,0x27,0x59,0xd7,0x44,0x62,0xa1,0x75,0xda,0x22,0x40,0x3f,0x15,0x02,0x04,0x45,0xca,0xe0,0x6d,0xa3,0xed,0x61,0xcc,0xa6,0x20,0x3b,0x70,0x06,0x36,0x2a,0x0e,0x19,0x89,0x63,0xd2,0x0e,},\"\\xb6\\x4b\\x14\\xba\\x77\\xd2\\x39\\xe6\\xf8\\x1a\\xbe\\x06\\x0a\\xcc\\xef\\x85\\xf0\\x44\\x2b\\x65\\x0c\\x44\\x01\\x5e\\xfc\\x43\\xa0\\xaa\\x2b\\xa1\\x0b\\xf4\\x8d\\x30\\x18\\xb1\\x95\\x3d\\xdf\\xff\\xbc\\xda\\x5b\\xf3\\xbb\\xe0\\xb6\\xb3\\xe4\\xb0\\xd9\\xa3\\x2c\\x6b\\x72\\x5b\\xbb\\x23\\x1e\\x0a\\x27\\x04\\x47\\x1e\\xe8\\xbc\\x1d\\x59\\x4f\\x5c\\x54\\x22\\x6f\\x5d\\xd9\\xdf\\xa1\\x63\\xcf\\xc1\\x45\\x2c\\x61\\xf9\\x3e\\x4f\\x81\\x39\\xab\\x4c\\xe4\\x47\\x6f\\x07\\xec\\x93\\x36\\x61\\xea\\xe9\\x1b\\x6d\\x50\\x0b\\xf5\\x08\\xac\\x63\\xe4\\xba\\xaf\\x1f\\xfc\\x8f\\x00\\x07\\xd8\\x02\\xe0\\x05\\xf1\\xb4\\xfc\\x1c\\x88\\xbe\\xe4\\xd5\\xe9\\xe7\\x63\\x84\\xf5\\xa7\\x04\\x3b\\xd6\\x60\\xcc\\xe7\\x1f\\x3b\\x67\\xf0\\x1f\\x6a\\xb8\\x44\\x29\\x85\\x31\\xaa\\xc7\\x3a\\x39\\xd0\\x45\\x37\\x00\\x88\\x85\\x50\\x05\\xa0\\x9c\\x6d\\x04\\x23\\x8e\\xa4\\x78\\xdf\\xac\\xad\\x1e\\x6b\\x22\\xb2\\xbe\\x4c\\x46\\xb0\\xd5\\x9b\\x1e\\xba\\x1f\\x06\\x0b\\xf7\\xda\\x5d\\x15\\x66\\xcf\\x1f\\xdb\\x5c\\x54\\x3a\\x33\\x92\\x6a\\xf6\\x3f\\x01\\xa0\\xdb\\x86\\xe1\\xa6\\x71\\x1c\\x47\\x3d\\xc7\\x95\\xab\\x28\\x3c\\x8d\\x93\\xfa\\xcf\\xb5\\x70\\x1f\\xa2\\xf2\\xf6\\xbb\\x99\\xf9\\xb7\\xe3\\x74\\x9b\\x07\\x1d\\x58\\x60\\x7b\\xe4\\x4a\\x70\\x89\\xbc\\xb5\\x03\\xec\\x14\\x95\\xb5\\xfe\\xed\\xb3\\x99\\x96\\x1f\\xd3\\x67\\x7d\\x74\\x93\\xea\\xa3\\xb3\\xe9\\xcc\\x5e\\x36\\x42\\xf4\\x0d\\x47\\xde\\x9b\\xfe\\xe7\\xc2\\x0b\\x0e\\x51\\x9c\\x4e\\xb4\\xa4\\x0f\\x4d\\xa4\\x46\\xed\\x6a\\xc7\\xaa\\xca\\x05\\x3e\\x75\\x9c\\x97\\xda\\xbe\\x0a\\x8e\\xc2\\xf5\\x8e\\x7f\\x2f\\x9b\\x20\\x72\\x76\\x2f\\x9f\\x79\\x4a\\x6a\\x4e\\x36\\x06\\x0b\\x88\\x72\\xbd\\x2c\\x18\\xd0\\x6a\\x85\\xc2\\xc1\\x41\\xa7\\x82\\x93\\x77\\x3e\\xe8\\xcf\\xbf\\x15\\x4b\\x99\\x30\\xcd\\x39\\xda\\x31\\xb4\\x97\\xe7\\x37\\xa7\\x75\\x0c\\x90\\xa1\\x3f\\x5a\\xaa\\x14\\x7c\\xd0\\xdc\\x43\\x11\\xf2\\xe3\\x49\\x41\\x25\\x2e\\xf1\\x98\\xb0\\xc1\\xf5\\x08\\x27\\xe5\\x6c\\x9f\\x16\\xf5\\x95\\xac\\xed\\x6d\\x2a\\x69\\x34\\x65\\x31\\x49\\x5a\\x64\\x99\\x77\\x4d\\x36\\x07\\x66\\xca\\x9b\\xe5\\xed\\x88\\x81\\xc0\\xdb\\x26\\xed\\x7c\\x5e\\x6f\\xf3\\xa4\\xf9\\xb7\\x3c\\xd8\\xb6\\x54\\x64\\x0d\\xc9\\x6b\\xf4\\x3b\\xd4\\x26\\xa0\\xf2\\x8c\\x9b\\x25\\xfa\\x70\\x4d\\x62\\xff\\x02\\x88\\xfc\\xce\\xff\\xaa\\xeb\\xd3\\xea\\x30\\x97\\xbc\\xbb\\xd7\\x78\\x42\\x0e\\xbc\\x52\\x0a\\x41\\x77\\x30\\xa1\\xb5\\xb3\\xb8\\xc9\\x6c\\xda\\x9f\\x4e\\x17\\x7d\"},\n{{0xa0,0x06,0x11,0x48,0x94,0x67,0x12,0x2c,0x4c,0x16,0x4b,0xfb,0x6a,0x61,0x6e,0x6a,0x61,0x9b,0x9f,0x83,0xc4,0x36,0x72,0x06,0xb8,0x5d,0x3f,0xbe,0xc3,0x8c,0xd6,0x2c,},{0x57,0xab,0x58,0xba,0xbb,0x41,0xdc,0x0d,0xa0,0xbc,0xd5,0x06,0x05,0x9a,0xac,0x9f,0x46,0xec,0xa9,0x1c,0xd3,0x5a,0x61,0xf1,0xba,0x04,0x9a,0x9a,0xc2,0x27,0xf3,0xd9,},{0xc7,0x71,0xba,0x0a,0x3d,0x3c,0x4a,0x7b,0x06,0x4b,0xd5,0x1a,0xd0,0x5c,0x9f,0xf2,0x7f,0xd3,0x26,0x61,0x0f,0xbf,0xa0,0x91,0x83,0x03,0x9e,0x5e,0xdf,0x35,0x47,0x2d,0xde,0xd8,0xfc,0x22,0x75,0xbb,0xcc,0x5d,0xf1,0xbf,0x12,0x98,0x60,0xc0,0x1a,0x2c,0x13,0x11,0xda,0x60,0x2f,0xba,0xff,0xc8,0xb7,0x9c,0x24,0x9c,0x9c,0xc9,0x55,0x02,},\"\\x34\\xdb\\x02\\xed\\x75\\x12\\xbf\\x8c\\x67\\xd3\\x59\\xe7\\x20\\x3a\\x2e\\xa4\\x41\\xe2\\x0e\\x72\\x97\\x66\\xc1\\x5a\\xa0\\x0f\\xa2\\x49\\xa3\\x51\\x8f\\xc2\\x9e\\xf8\\x90\\x5a\\xa5\\xb4\\x67\\x09\\x58\\xc6\\xa4\\x60\\xd7\\x7b\\x3a\\x80\\xef\\xcb\\x47\\x38\\x59\\xbb\\xaf\\xf8\\x62\\x22\\x3e\\xee\\x52\\xfe\\x58\\xac\\xfd\\x33\\x15\\xf1\\x50\\xf3\\xc6\\xc2\\x7f\\xf4\\x8f\\xca\\x76\\x55\\x2f\\x98\\xf6\\x58\\x5b\\x5e\\x79\\x33\\x08\\xbf\\x59\\x76\\xba\\xd6\\xee\\x32\\x7b\\x4a\\x7a\\x31\\x32\\x14\\xb9\\xae\\x04\\xb9\\x65\\x1b\\x63\\xcd\\x8d\\x9f\\x5b\\x3b\\xec\\x68\\x9e\\x0f\\xd0\\x00\\xdd\\x50\\x17\\x70\\xdd\\x0e\\x99\\xb8\\xf9\\x9e\\xaf\\xa0\\x9c\\x39\\x6a\\x24\\x5a\\x4a\\x96\\xe5\\x68\\x96\\xa2\\x9b\\x24\\x19\\x0b\\x1e\\xf1\\x10\\x63\\xf3\\x9b\\x63\\xee\\x3a\\x58\\x6b\\x07\\x62\\x7d\\xd3\\x50\\x0c\\x4e\\x17\\x0b\\x83\\x5d\\xc0\\xec\\x23\\x6f\\xa5\\xa3\\x5c\\x44\\x18\\x47\\x07\\x56\\x5c\\x4a\\x50\\x66\\x2d\\x8d\\xbc\\xcf\\xff\\x7f\\x9a\\x7a\\x68\\xd0\\x21\\xb4\\xaf\\x64\\xd5\\x32\\xb7\\xc3\\xd2\\x74\\x74\\x18\\xc2\\xd7\\x17\\xbb\\x6a\\xca\\x6b\\x58\\x74\\x7a\\xe4\\xdd\\x56\\x41\\xd8\\x26\\xf7\\x9a\\x8a\\x31\\x5c\\x38\\x21\\x1a\\x53\\x8a\\x92\\x9e\\x5b\\x45\\x1f\\x62\\x3f\\x4f\\xcb\\xbc\\xac\\xdb\\x86\\xc8\\x75\\x2e\\xa1\\x3a\\x61\\x7a\\xb4\\x14\\xab\\x65\\x3e\\xb2\\xe6\\x8d\\x54\\x20\\xdf\\x7c\\x6d\\xf9\\x24\\x38\\x16\\x8d\\xcf\\x9c\\x06\\x65\\x81\\xdf\\xe7\\xb2\\xc4\\x68\\x19\\x4a\\x23\\x70\\x7d\\xe4\\x65\\x9b\\xd6\\x7e\\xb6\\x34\\xff\\x02\\x47\\x41\\xc5\\xfc\\x86\\x98\\xfd\\x4d\\xc4\\x1f\\xe5\\xdf\\xc6\\x29\\x9b\\x7a\\x08\\xe6\\xff\\xca\\x37\\x10\\x9c\\x02\\x10\\xc8\\xf9\\x4e\\xa2\\xd3\\xdd\\xc9\\x77\\xff\\xc0\\xb3\\x79\\x4f\\xe6\\xba\\x43\\x37\\xc7\\xaa\\xb4\\x34\\xa6\\x8a\\xc6\\x65\\x48\\x4e\\xa8\\x24\\x3a\\x84\\xb7\\x9a\\xa1\\x81\\xee\\x6a\\xb5\\xaa\\x37\\xa3\\x2d\\x87\\x97\\x25\\xed\\xc0\\x18\\xf8\\x55\\x21\\x81\\x81\\x6d\\x7d\\x27\\x2c\\xa8\\x81\\x8a\\x7b\\x92\\xe6\\xee\\x44\\x54\\xd1\\xf7\\x82\\x8d\\xd8\\xaf\\xba\\x1a\\x79\\x03\\x64\\xb4\\xff\\x28\\xd8\\x4e\\x02\\x85\\x97\\x35\\x3e\\xbb\\xef\\x24\\x83\\x7b\\xc3\\x19\\xe1\\xae\\x8f\\x2b\\x0b\\x6a\\x85\\x1b\\x48\\x9c\\x3e\\x17\\x0e\\xef\\x53\\xe0\\x65\\xf7\\x03\\x26\\x53\\xcd\\x6b\\x46\\xd8\\xe5\\x7e\\x4e\\x11\\x1b\\x78\\x9b\\xa9\\x50\\xc4\\x23\\x0a\\xba\\x35\\xe5\\x69\\xe0\\x66\\x15\\x40\\x34\\x07\\xbc\\xe0\\x36\\x9a\\xaa\\xb4\\xea\\xfa\\xef\\x0c\\xae\\x10\\x9a\\xc4\\xcb\\x83\\x8f\\xb6\\xc1\"},\n{{0xde,0x16,0x34,0xf3,0x46,0x0e,0x02,0x89,0x8d,0xb5,0x32,0x98,0xd6,0xd3,0x82,0x1c,0x60,0x85,0x3a,0xde,0xe2,0xd7,0xf3,0xe8,0xed,0xd8,0xb0,0x23,0x9a,0x48,0xcf,0xaf,},{0x9d,0xc1,0x46,0x5b,0x33,0x83,0xf3,0x7d,0xe0,0x0e,0xa2,0xd3,0xc7,0x0f,0x2c,0x8f,0xac,0x81,0x5f,0x01,0x72,0x02,0x9c,0x3f,0x57,0x95,0x79,0xc9,0x84,0xa5,0x89,0x5e,},{0xd2,0x05,0x06,0xeb,0x84,0x69,0x23,0xa0,0xb1,0x6f,0xf8,0x2f,0xb2,0xc3,0x92,0x3b,0x00,0xc1,0xb3,0xbc,0xc6,0xe2,0xf6,0x48,0x2f,0xba,0x24,0x80,0x75,0x21,0xe8,0xe0,0x22,0x3f,0x69,0x2e,0x62,0xea,0xc9,0x93,0xf4,0x98,0xf6,0x71,0x02,0xa0,0x4f,0xd1,0xac,0xf9,0xc7,0xe3,0x88,0x8d,0x85,0x7c,0x9a,0x08,0x0b,0x8a,0xf6,0x36,0x10,0x06,},\"\\xd1\\x0c\\x3e\\x4d\\xe7\\xfa\\x29\\x89\\xdb\\xa8\\x75\\x37\\xe0\\x05\\x93\\xd0\\xee\\xd4\\xd7\\x5e\\xe6\\x58\\x46\\xda\\xb1\\x49\\x8b\\x47\\x49\\xd6\\x4f\\x40\\xe3\\x4b\\x59\\x11\\xc5\\xce\\x3b\\x53\\xa7\\xe3\\x7d\\x2d\\x02\\xbb\\x0d\\xae\\x38\\xed\\x96\\x2a\\x4e\\xdc\\x86\\xc0\\x02\\x07\\xbe\\xe9\\xa8\\xe4\\x56\\xec\\xca\\xe8\\xbd\\xf4\\xd8\\x7a\\x76\\x74\\x60\\x14\\x20\\x1a\\xf6\\xca\\xff\\xe1\\x05\\x66\\xf0\\x8d\\x10\\xda\\xaf\\x07\\x71\\x60\\xf0\\x11\\xfe\\xac\\xa2\\x5b\\x9c\\x1f\\x6e\\xca\\x9f\\xc5\\x33\\x14\\xa8\\x05\\x47\\x95\\x17\\x54\\x35\\x55\\x25\\x25\\x7d\\x09\\xa7\\xfd\\xad\\x5b\\xc3\\x21\\xb7\\x2a\\xa2\\x8d\\x1e\\x02\\xd8\\x69\\x6d\\x4f\\x9e\\xb0\\xad\\x3b\\x21\\x96\\xf8\\xbc\\xfa\\xeb\\x1d\\x61\\x48\\x28\\x7a\\x3f\\xae\\xfe\\xf9\\x1a\\x7a\\x3e\\x06\\x09\\xc2\\x8c\\xe5\\x9d\\x0c\\xa1\\x4d\\x0b\\x30\\x50\\xdd\\x4f\\x09\\x6b\\x7b\\xc2\\x51\\x39\\x88\\xba\\x21\\x21\\x28\\xd5\\x02\\x6d\\xaa\\xa7\\x18\\x88\\x46\\xdb\\x21\\xc5\\xc1\\xd1\\x79\\xab\\x94\\x87\\xc1\\xa5\\xbd\\x34\\x65\\x88\\x12\\x7c\\x20\\x39\\x8d\\x36\\x2d\\x4c\\x75\\x9c\\xfa\\xb2\\xa6\\x77\\x75\\x0b\\x9e\\x45\\x67\\x6a\\x1e\\x7e\\x09\\x2e\\xf0\\x2e\\xdb\\xf2\\x78\\xfb\\x19\\xa5\\x8e\\x9b\\xf6\\xc9\\xe9\\x96\\xe2\\x4e\\xda\\xd7\\x3f\\x3c\\xe3\\x1f\\xa0\\x4b\\x6d\\x85\\x33\\x43\\x6b\\xf8\\x0b\\x4b\\x2f\\x80\\x5e\\xd9\\x1e\\x7f\\xcd\\xa3\\xbc\\x2b\\xab\\x3b\\x2b\\xb1\\x57\\x15\\x8a\\xf0\\xea\\x8e\\x3f\\x07\\x31\\xdf\\xad\\x45\\x9d\\x2e\\x79\\xb6\\xd3\\x71\\x5f\\xe7\\xbf\\x1e\\xaf\\xc5\\x39\\x75\\x93\\x20\\x88\\x57\\xe5\\x7b\\x7f\\xeb\\x2f\\x73\\x87\\x94\\x3a\\x8e\\x09\\x13\\x47\\x0c\\x16\\x1a\\xef\\x4f\\xe2\\x05\\xd3\\x63\\x7f\\x23\\x17\\x7f\\xf2\\x63\\x04\\xa4\\xf6\\x4e\\xba\\x3f\\xe6\\xf7\\xf2\\x72\\xd2\\x34\\xa6\\x72\\x06\\xa3\\x88\\xdd\\xd0\\x36\\x6e\\x89\\x4e\\xaa\\x4b\\xb0\\x5d\\x73\\xa4\\x75\\xf1\\xb3\\x4c\\xa2\\x22\\xbb\\xce\\x16\\x85\\xb1\\xb5\\x6e\\x03\\x4e\\x43\\xb3\\xc4\\x0e\\x81\\xff\\xf7\\x96\\x82\\xc1\\x9f\\x32\\xaa\\x3f\\x2a\\x89\\x5c\\x07\\x09\\xf9\\xf7\\x4a\\x4d\\x59\\xd3\\xa4\\x90\\x29\\xec\\xfc\\xb2\\x83\\x08\\x2b\\x06\\x7f\\x1a\\x0d\\x95\\x05\\x75\\x0f\\xd8\\x67\\x32\\x19\\x99\\x48\\x42\\x49\\xef\\xa7\\x25\\xf5\\x2c\\x94\\xc7\\x59\\x62\\x06\\xa9\\x11\\xf3\\xf5\\x05\\xd6\\x3f\\x03\\x13\\x25\\x4b\\xd4\\x45\\xf0\\x5b\\xe3\\x99\\x6b\\x58\\xfe\\x18\\x19\\xaf\\x87\\x35\\x2e\\x7f\\x0a\\x2c\\xa3\\x20\\xd9\\xcc\\x00\\xa5\\xfe\\x77\\xad\\x41\\x64\\x0d\\x50\\xbe\\x84\\x36\"},\n{{0xc7,0x38,0xef,0x5f,0x09,0x35,0x28,0x1b,0xa6,0x25,0xfa,0x40,0x14,0xd4,0xa4,0xd0,0xbe,0x7e,0x28,0xfe,0xd7,0x79,0xa9,0xcf,0x65,0x8e,0x21,0xdb,0xa4,0x3c,0xeb,0xc1,},{0x95,0x79,0x9f,0xaf,0x70,0x6d,0x19,0x5e,0x54,0x4c,0x76,0xca,0xfd,0xdf,0x09,0xd0,0x2d,0x1b,0xea,0xfc,0x42,0xc9,0xd6,0xc9,0xea,0xd4,0xc1,0x84,0x55,0x87,0xd3,0x9e,},{0xf4,0x43,0x71,0xe6,0xc3,0x39,0x16,0x39,0xd4,0x57,0xed,0x14,0x64,0x81,0x84,0x80,0x94,0x11,0xe8,0x0a,0x32,0x01,0xf8,0x81,0x16,0x70,0xe5,0x00,0xfc,0xad,0x92,0xf3,0x00,0xaa,0xbf,0x7f,0xc6,0x8e,0x44,0x01,0x91,0xe8,0x81,0xd6,0xc3,0x47,0x4e,0xfd,0x6d,0x28,0xf0,0x9d,0xc4,0x43,0x12,0xfc,0xfc,0xb8,0x27,0x01,0xba,0x3c,0x29,0x0a,},\"\\x16\\x8d\\x0b\\xc5\\x59\\x8b\\xe0\\x2f\\x54\\x43\\xbf\\xe7\\xdf\\xb8\\x82\\x99\\x85\\xca\\x5d\\x28\\x2a\\xf9\\xcf\\x1b\\x14\\x82\\x60\\x2f\\x24\\x3d\\x48\\x6b\\xd8\\x2b\\xa0\\x39\\xa0\\x75\\x09\\x09\\xe9\\xb3\\xc7\\xd4\\xd5\\xf8\\xb8\\xba\\xf4\\x57\\x18\\xaf\\x03\\x11\\x85\\x4f\\x4d\\x1c\\x78\\x37\\xf3\\x1d\\x8e\\xe6\\x8d\\x35\\x58\\xe7\\xe5\\x1e\\x0c\\x64\\x6a\\x4a\\x63\\x75\\x96\\xee\\x90\\x05\\x7b\\x01\\xed\\x0a\\x17\\xda\\xa3\\x95\\x0b\\x81\\xab\\x47\\xae\\x8b\\x94\\xc1\\x7d\\x40\\x74\\x69\\x13\\xc4\\x6b\\xa1\\x47\\x8b\\xfc\\xa5\\x1b\\x16\\x76\\x28\\xfc\\x3e\\xe1\\xe2\\x2f\\x2f\\x19\\xd6\\xd8\\xda\\xf9\\x3d\\xf6\\x54\\x0c\\xed\\xb7\\xa8\\x59\\xd1\\xa2\\xba\\x59\\x11\\xba\\x71\\x76\\x6e\\x8b\\x7f\\xce\\x0c\\x0e\\x86\\x63\\x61\\x6d\\x01\\x80\\x69\\x7d\\x78\\xce\\x30\\x40\\xd4\\x38\\x13\\x19\\x82\\xf3\\xf8\\x11\\x2a\\xcc\\xa2\\x9a\\xe5\\x3e\\x53\\x9f\\xf8\\xc9\\xec\\x41\\x06\\xd1\\x32\\xf4\\x02\\x01\\x85\\x18\\x30\\x84\\x85\\xf2\\xaa\\x6c\\x9e\\x8d\\x1e\\x62\\xfe\\xd6\\x0c\\xb2\\x49\\x45\\x7d\\xb3\\x3c\\x6f\\xd1\\xfe\\x07\\x44\\x53\\x61\\xf0\\x81\\x94\\xa2\\xb5\\xa0\\x57\\xcb\\x03\\xcc\\x75\\x4e\\x5c\\x7d\\x4a\\x7e\\xea\\x53\\xa7\\xf7\\xd2\\x07\\xca\\xcc\\xa5\\xe6\\x8c\\xaf\\xa9\\x69\\xa3\\x52\\x1d\\xbb\\x81\\x03\\x99\\xa1\\x7f\\x32\\x8e\\xe7\\x67\\xcf\\x55\\x92\\x6b\\x2b\\xd5\\xf0\\x29\\x54\\x9d\\x3b\\x46\\x45\\x79\\xc4\\x26\\x55\\x26\\x53\\x98\\x47\\x2e\\x1c\\x77\\xcc\\x8d\\xd9\\xaf\\xf1\\x87\\xf7\\xac\\x34\\xdd\\x45\\x6a\\xce\\x99\\x9a\\x73\\x6e\\xcc\\xa6\\xd4\\x05\\xd4\\x92\\x2c\\x77\\x9c\\x60\\x0c\\x47\\xb8\\x4c\\x9c\\x1d\\xf5\\xe5\\xf8\\xed\\x3b\\x28\\x11\\xd3\\x51\\x33\\x91\\x13\\xf8\\x45\\x3c\\xca\\x4c\\x44\\x11\\x68\\x8c\\xb0\\x38\\x82\\x58\\xeb\\xbd\\x18\\x72\\xb8\\x36\\x10\\x04\\x22\\x49\\x49\\x4e\\xd5\\x60\\xd4\\xcd\\xa6\\xa6\\x84\\x55\\xd9\\x57\\xe8\\x06\\xdd\\x0b\\xdd\\x83\\x00\\x4c\\x4c\\xa8\\x07\\x74\\xb8\\xa0\\xa1\\x66\\x58\\x66\\xf1\\x70\\x85\\x01\\x4e\\xad\\xb3\\xea\\xe7\\x38\\x2f\\xa8\\x70\\xde\\xb2\\x9d\\xd8\\xc9\\x31\\xb5\\x30\\x19\\x62\\x57\\x40\\xe2\\x83\\x92\\xf3\\x85\\x75\\xc0\\xe2\\xa9\\xe5\\x04\\xfc\\x35\\xbd\\x95\\xdf\\x56\\x43\\x9a\\x89\\x82\\x30\\xa2\\x39\\x8c\\xd2\\x22\\x5c\\x76\\x6e\\xf3\\x6f\\x12\\xae\\x7e\\x49\\xb3\\x0a\\x9c\\x0a\\xad\\x46\\x9d\\x58\\x95\\xbb\\xf7\\x21\\xcc\\x0f\\xf5\\x1d\\x84\\x0c\\x80\\x2d\\x4a\\x7e\\xef\\xba\\x84\\xfe\\x52\\x05\\xa2\\xc2\\xf1\\x40\\x11\\x92\\x2d\\xde\\x56\\x14\\x56\\xf7\\x9e\\x61\\x61\"},\n{{0x5f,0xea,0x38,0x73,0x9c,0x61,0xca,0x83,0xbf,0x7b,0x4a,0xd1,0x75,0xa2,0x11,0x76,0x27,0xb9,0x71,0xa6,0x34,0xa3,0x05,0xa8,0x4f,0xa5,0x7f,0xec,0xb8,0x03,0x56,0x24,},{0xdd,0xd1,0x4b,0x0f,0xc0,0x67,0x68,0xd5,0x10,0x4c,0x50,0x76,0x4b,0xfd,0x3b,0x95,0x23,0x52,0xa3,0x40,0x07,0xc5,0x0d,0x5d,0xdd,0x22,0x4f,0xf5,0x1a,0xfc,0xdf,0x9c,},{0xf4,0xe2,0x74,0x82,0x3f,0x2c,0x39,0x6f,0x3a,0x32,0x94,0x86,0xaa,0x64,0x10,0xc5,0xff,0x19,0x26,0x6f,0x07,0x70,0xfd,0x04,0xfb,0x14,0xa7,0x60,0x2d,0x2b,0x69,0xa4,0xa2,0xb0,0x09,0x28,0xe9,0xe1,0xd9,0x23,0x89,0xf8,0x03,0x33,0x59,0xed,0x6f,0xb2,0x14,0x64,0x67,0xaa,0x15,0x4c,0xba,0x59,0x7d,0xec,0x6a,0x84,0x17,0x3f,0x8d,0x07,},\"\\x10\\x13\\xc6\\x0a\\x73\\x95\\x35\\x49\\xe5\\xed\\x10\\x5b\\xde\\xa1\\x50\\xb9\\x1e\\x60\\xec\\x39\\x20\\x0d\\x43\\x72\\x13\\x04\\xbf\\xc8\\xec\\x43\\x9d\\x39\\x60\\x96\\x13\\xc2\\xd8\\x78\\x04\\x4a\\x9d\\xa0\\x1b\\x26\\xd8\\x6d\\x6d\\x65\\xdb\\x93\\xd9\\x1a\\x13\\x7e\\x9c\\x48\\x08\\xa9\\x7d\\x4e\\xf2\\x86\\xa9\\x03\\xf3\\xf1\\x38\\x2c\\xc6\\xd1\\x29\\x42\\x16\\xb9\\xfa\\xfc\\x01\\x3c\\x86\\xb9\\xff\\x68\\xb5\\x5a\\x50\\xea\\x37\\x66\\xe6\\x1d\\xc1\\xce\\x38\\x34\\x8e\\x91\\xd6\\x2c\\xe7\\x32\\xc1\\x52\\xd7\\x66\\xb9\\x33\\x5c\\x68\\xd6\\xca\\xd7\\x7b\\xe2\\xb4\\xa0\\xcd\\x50\\xb9\\xa1\\xec\\x63\\x2b\\xa5\\x56\\x48\\xa6\\xe7\\xe1\\x1a\\x14\\xc0\\x68\\x53\\xc0\\x2a\\xec\\x48\\x09\\xbd\\x14\\x7a\\x5d\\xdd\\x9f\\xbc\\x3b\\xe9\\xf0\\xc8\\x15\\x8d\\x84\\xab\\x67\\x95\\xd7\\x71\\xb4\\x2b\\x18\\x14\\xa1\\x7a\\x3c\\x7a\\x6c\\xa0\\xf4\\xa8\\xf7\\xb3\\xa0\\xdb\\x1c\\x73\\xba\\x13\\xb1\\x64\\x00\\xdf\\xec\\xbd\\x03\\xd2\\x16\\x65\\x0e\\x4d\\x69\\x70\\x4a\\x70\\x72\\x46\\x44\\x4d\\x57\\x91\\xfa\\x27\\x37\\x52\\xf5\\x9c\\xb5\\xae\\x9f\\xd4\\x16\\xa5\\x18\\x66\\x13\\xd6\\x6a\\xfd\\xbd\\x1c\\xe6\\x91\\xa8\\x7b\\xd7\\xd8\\xb6\\x71\\x90\\xe9\\xac\\x68\\x70\\x62\\xa0\\x80\\xd2\\xec\\x39\\xfe\\x76\\xed\\x83\\x35\\x05\\x82\\x51\\x87\\x28\\x39\\xe8\\x5e\\xb6\\x2f\\x18\\xec\\xe1\\x87\\xca\\xba\\x55\\xb5\\xf7\\xd5\\xed\\xca\\xde\\x01\\xcd\\xc5\\x43\\xcc\\x67\\x7e\\x50\\x23\\x8b\\x89\\xc5\\x63\\x5a\\xd5\\xc8\\xfc\\x22\\x0f\\x5e\\x0b\\xe1\\xbc\\x66\\x7d\\x20\\x98\\x97\\x53\\xa6\\xd6\\x16\\xfa\\x69\\xf8\\xb1\\x29\\x40\\xb8\\xca\\x9e\\x2c\\x48\\x57\\x71\\x32\\xd8\\x69\\x1b\\x05\\x37\\x79\\xa1\\x52\\xcb\\xac\\xff\\x3b\\x8b\\x1b\\xd7\\xaf\\x69\\x2e\\x56\\xc7\\x3b\\xba\\xe4\\x63\\x47\\x76\\xcf\\xc2\\x13\\xc9\\x9b\\x9a\\xe4\\x58\\xdf\\x1b\\xef\\xc8\\xc8\\x77\\x74\\x26\\x64\\xb0\\xa0\\xbb\\x1f\\x69\\x15\\xc8\\xda\\xe3\\xb3\\xf5\\x5d\\xd7\\x5a\\xba\\x6a\\x3b\\xcc\\x41\\x76\\xb4\\xe3\\xba\\x03\\xd0\\xc1\\xc0\\x4c\\x3c\\x64\\x08\\x77\\x8b\\x2b\\x8e\\x5a\\x8a\\x3e\\xb5\\x2e\\xd3\\x2a\\x74\\x28\\xc0\\x0a\\x98\\xa5\\x89\\xd8\\xca\\x93\\x90\\xa2\\x10\\xf4\\xa7\\xac\\x00\\x4f\\xa1\\xfe\\x4c\\x6d\\xa6\\x94\\xf1\\x22\\x76\\xe3\\x20\\xb4\\x1b\\x0b\\x59\\xf7\\x5d\\x26\\x4a\\x39\\x6d\\x45\\x0b\\x63\\x1a\\xb3\\x53\\xf1\\x61\\x27\\x09\\xe7\\xa2\\xe6\\xa5\\x0d\\x01\\xcb\\x11\\x0e\\x53\\x04\\x05\\x46\\xdd\\x3b\\x1e\\x11\\xd2\\x57\\x32\\x81\\x3a\\xa7\\x6b\\xe5\\xe8\\x1f\\xcf\\x7a\\x57\\x73\\xf6\\x81\\x5b\\xbd\"},\n{{0x60,0xf9,0xa1,0x4c,0xce,0x5d,0x43,0xfd,0x9a,0xab,0x4e,0xe8,0xcc,0x83,0x79,0xd5,0x75,0x94,0x91,0x52,0x69,0x3b,0xf2,0x9a,0x67,0x90,0xb0,0x35,0xe4,0x2a,0x44,0xde,},{0xbd,0x4a,0x70,0x74,0x0d,0x5a,0xca,0xbe,0x49,0xf9,0xa2,0x15,0x20,0x82,0xfa,0x20,0x25,0x33,0x0e,0x64,0x40,0x43,0x7f,0x1d,0x04,0x7f,0x31,0x3d,0xe4,0x90,0xdc,0xa5,},{0x72,0xf5,0x4b,0xb8,0xbd,0xd1,0x7e,0x9e,0x42,0x2c,0xd3,0x39,0x63,0x1d,0xd3,0x9f,0x57,0x35,0x50,0x15,0xd4,0xcb,0xd1,0x5a,0xca,0xb7,0x54,0x2e,0xfd,0x78,0x4a,0x32,0x1c,0x1f,0x61,0x25,0x76,0x4c,0x0d,0x15,0x40,0x45,0xb3,0x2e,0x70,0xdc,0x2e,0x03,0xfb,0xfe,0x11,0x17,0x46,0x8a,0xc3,0xe7,0x31,0x27,0xb5,0xfa,0xc8,0xd4,0x21,0x02,},\"\\xdd\\x7f\\x44\\xf9\\xeb\\x72\\x8a\\xb4\\x8d\\xe5\\x4e\\xcd\\xe6\\xb6\\x18\\x4b\\xd5\\xdd\\xd8\\x70\\x75\\x45\\xa0\\x12\\x9f\\x2e\\x90\\x59\\x05\\xb5\\x5d\\x3e\\x7f\\xd5\\x7e\\x28\\x48\\x5d\\x25\\x81\\x48\\xf6\\x60\\x5e\\x23\\x77\\xd5\\xb2\\x67\\xd2\\xea\\xf4\\xcd\\x4b\\x46\\xe4\\x54\\x96\\x22\\x19\\x86\\x82\\x32\\xb6\\xf4\\x1f\\x88\\xa7\\x97\\xf9\\xcd\\xd5\\xc3\\x9a\\xda\\x51\\xa6\\x41\\x21\\x4f\\xb9\\xdb\\x2c\\x2a\\x9b\\x5a\\x5b\\x16\\xe3\\x03\\x57\\x53\\x18\\xb6\\x25\\xcc\\xa9\\x70\\xb7\\x43\\x48\\x72\\x79\\x02\\xa1\\xcf\\x26\\x8b\\xd1\\x6e\\x10\\x71\\x13\\x16\\x1c\\x8c\\xbc\\x99\\x30\\x3c\\x2b\\x9f\\x23\\x55\\x41\\xa7\\xb3\\x1e\\x43\\x31\\x20\\xfe\\xba\\x14\\xfe\\xbe\\x4b\\xcb\\x0f\\x5b\\x93\\x6c\\x7e\\xdd\\xdd\\x0e\\xcf\\xc7\\x2c\\x8d\\x38\\xf6\\x4c\\xdb\\x6c\\xfc\\x29\\x10\\xbc\\x29\\xa5\\x21\\xc5\\x0a\\x51\\xab\\xcb\\xc2\\xaa\\xbf\\x78\\x9d\\xe8\\x22\\xcb\\x04\\xf5\\x72\\x8f\\xee\\x15\\x3d\\xd5\\x50\\x1b\\x2d\\xb5\\x9c\\x59\\xf5\\x0c\\xab\\x17\\xc2\\x92\\x16\\xd6\\x69\\x51\\x01\\x9e\\x14\\x5b\\x36\\xfd\\x7e\\x84\\x1b\\xfb\\xb0\\xa3\\x28\\x55\\x4b\\x44\\xdd\\x7e\\xf5\\x14\\x68\\xc3\\xd5\\xb7\\xd3\\xa1\\xf7\\xb9\\xde\\xf5\\x8d\\x8c\\xf9\\xd9\\xbc\\xaf\\xe9\\x2c\\x86\\xcf\\x6d\\x61\\x19\\xe9\\x8d\\xba\\x6f\\x38\\xea\\x57\\xe3\\x22\\xdd\\xc9\\xc2\\x19\\x8d\\x4b\\xbc\\x3b\\x94\\xea\\x13\\x29\\xdb\\x0d\\x45\\x8e\\x01\\xc7\\x08\\x1b\\x33\\x92\\x5a\\x3e\\x28\\x7f\\x59\\x9a\\x85\\x8c\\x50\\xc3\\xa8\\xf1\\x8c\\xc2\\xaa\\x63\\x4d\\xf6\\x3e\\x7f\\x10\\xe4\\x03\\xad\\xea\\xb2\\xf4\\x1d\\xb5\\x57\\x87\\x90\\xc3\\xb4\\xf0\\x41\\xa8\\xb7\\xa4\\xf6\\x9c\\xd6\\xe0\\x62\\x15\\xdf\\x82\\x01\\xae\\x5b\\x3e\\x1d\\x1d\\x25\\xa0\\xa3\\x9b\\xfc\\x3d\\x04\\x1a\\x2f\\x98\\x21\\x3e\\xf4\\x14\\x12\\x45\\x79\\x2a\\x76\\xf0\\x6d\\x4d\\xe2\\x5f\\x64\\x67\\xa0\\xe5\\x6f\\x2f\\x5c\\xf6\\x94\\x00\\xd2\\x21\\x17\\xde\\x7b\\x46\\x14\\x95\\x54\\xb7\\x0c\\x75\\xb9\\xf9\\x94\\x84\\xa4\\xf6\\xf0\\x35\\xad\\x3f\\x10\\xe3\\x75\\x3c\\xb1\\x4f\\x4f\\x39\\x8d\\xcf\\x6a\\x64\\xd1\\x0c\\xf6\\xc4\\xfa\\xc0\\x7c\\x91\\x19\\x3c\\xc0\\xf5\\x4f\\x0d\\xe5\\x8c\\x63\\x43\\xe9\\xca\\xaa\\x6b\\x4f\\x47\\x5e\\xf9\\x1a\\x59\\xe0\\x83\\xf9\\xf2\\x11\\xf5\\xbc\\x8e\\x7e\\x45\\x16\\xb4\\x5c\\xf0\\x6b\\xf5\\x0b\\xeb\\x8f\\xc4\\xab\\x57\\x9d\\x86\\xd4\\xa4\\x19\\x0e\\xea\\xc7\\x48\\xd0\\x6e\\x08\\x52\\xc4\\xb9\\xba\\x8c\\xfc\\x50\\xdd\\x0a\\x03\\x7a\\x7b\\xad\\x7f\\xad\\x55\\xaf\\x30\\x9a\\x5f\\x13\\xd4\\xc9\\x1e\\xd3\\xe0\"},\n{{0xa3,0x90,0x53,0xc5,0xc5,0x8b,0xf3,0x1d,0x46,0x2b,0x27,0xa6,0x20,0xb0,0xb3,0x7b,0x80,0x52,0xc6,0xb1,0xc4,0x10,0x2b,0x61,0x45,0x66,0x3a,0xa1,0x5e,0x97,0x87,0x18,},{0x36,0x42,0xac,0x2a,0x32,0x80,0xdc,0xe5,0x2a,0xd8,0xdf,0xcf,0xd3,0x70,0x94,0x36,0xed,0xc4,0xe7,0xe4,0xae,0x1b,0x45,0x2d,0x9b,0x22,0x07,0x80,0xb0,0x86,0x79,0xfa,},{0xf7,0x38,0x3e,0x96,0x6c,0xb2,0x30,0x9d,0xee,0xdf,0x86,0x01,0x00,0x18,0x3a,0xae,0xfa,0xc6,0x72,0xca,0x16,0xd5,0x41,0x9c,0xd6,0x42,0x2c,0xa7,0x0e,0x16,0xb3,0x97,0x6f,0x5f,0x16,0x5a,0xfc,0x27,0x86,0x11,0x7c,0x86,0x82,0x34,0xba,0x11,0x09,0xed,0xe0,0x31,0xf8,0x97,0x9b,0x50,0xe5,0x67,0x35,0x8b,0xd4,0xf8,0xbd,0x95,0x82,0x02,},\"\\xf6\\x55\\x40\\xd3\\xab\\xeb\\x1e\\xe5\\xea\\x98\\x70\\x62\\xc1\\xb5\\x79\\x51\\x6d\\x3c\\x29\\xc3\\x9c\\xbc\\x6b\\x09\\xd6\\x0e\\x18\\xfe\\x27\\x4c\\x2b\\xef\\xe0\\xf5\\xfe\\x7d\\xbd\\x57\\xc2\\xd5\\x83\\x52\\x29\\xbb\\x75\\x4e\\xc4\\x34\\x13\\x94\\x76\\x57\\x76\\xd6\\xa9\\x17\\x8c\\x4e\\x6a\\x31\\x2c\\xd7\\x4b\\xdb\\xac\\xa0\\xe8\\x82\\x70\\x62\\x8c\\xd8\\x41\\x00\\xf4\\x72\\xb0\\x75\\xf9\\x36\\x92\\x83\\x01\\x22\\xf0\\x0f\\x9b\\xd9\\x1a\\xc5\\x82\\x83\\x6c\\x8b\\xfa\\x71\\x4a\\xa4\\x8e\\x97\\x70\\x03\\x55\\x6e\\x1b\\x69\\x6d\\xf3\\x28\\xef\\x58\\x4f\\x41\\x3f\\x8a\\xb6\\x14\\x76\\x06\\x99\\xc4\\xd1\\x47\\xc3\\xee\\xa1\\xda\\x04\\x35\\x83\\x5c\\x9b\\xf7\\xad\\x54\\x60\\x6f\\x02\\x13\\xeb\\x74\\xa1\\xb4\\x76\\x14\\x15\\x06\\xae\\x2c\\xd1\\x24\\xcd\\x51\\xd6\\x6e\\x7e\\x7e\\x57\\x95\\x60\\x57\\x63\\x05\\xc5\\xfb\\xe8\\x43\\x0b\\xe3\\xeb\\xeb\\xaa\\xcb\\xa3\\xf9\\x98\\x9d\\xd7\\xd1\\x99\\xf5\\xa4\\x55\\xa5\\x0c\\xdb\\x37\\x55\\x03\\x7e\\x1a\\x70\\x67\\x4a\\x4f\\xef\\x40\\xb4\\xa3\\xaa\\xf7\\xbd\\x3c\\x95\\xb1\\xab\\x41\\xbb\\x20\\x62\\x11\\xc3\\xa1\\x27\\x6d\\x3e\\x37\\xd8\\xa3\\xa5\\xc3\\xd5\\xd0\\xf3\\x6e\\xf5\\xb4\\xf3\\xde\\x26\\xb7\\xf2\\x0f\\x6b\\x29\\x00\\x71\\x6d\\xcc\\x22\\xab\\x73\\x4e\\xba\\xf1\\xe8\\xd0\\x00\\x20\\xe5\\xf0\\x19\\x55\\x16\\x53\\xb9\\xc2\\xf7\\x0a\\x40\\x38\\xdf\\xb2\\xf1\\x2d\\x25\\xd6\\xd8\\x4e\\x79\\x07\\x3a\\x65\\x48\\xfe\\x15\\xe4\\x82\\x8f\\xe5\\xde\\x83\\xac\\x3d\\x8d\\x98\\xb7\\xda\\xf9\\x27\\x10\\x48\\x2c\\x37\\xf7\\xbd\\x24\\x31\\xa8\\x11\\x4c\\x61\\x37\\x65\\x7b\\xb1\\x77\\x88\\x2d\\x8a\\x3c\\x76\\xba\\xbf\\x1c\\x67\\x1a\\x70\\x55\\x36\\x5f\\xe9\\x08\\x66\\x16\\x7a\\x2d\\x1d\\xbc\\x87\\x0b\\xe8\\x3b\\x36\\x01\\xf0\\x9d\\x4a\\x31\\x7a\\xe2\\x54\\xca\\xc9\\xf9\\x8d\\xcc\\x7a\\xea\\xd9\\x22\\x4c\\xd9\\xc9\\xd8\\xa2\\x00\\xab\\xc8\\x0a\\x2d\\xd1\\x08\\xaf\\x28\\xfd\\x46\\xad\\x70\\x80\\xae\\x74\\x1b\\x50\\x05\\x4b\\x9b\\x9a\\x92\\x01\\xef\\xb7\\x83\\x8b\\xc4\\xc5\\xc2\\xcc\\x3d\\x76\\xba\\x0f\\xcc\\x49\\xc4\\x6e\\x79\\x2c\\x26\\x29\\x2b\\x7d\\x03\\x12\\xaf\\xf9\\x55\\xa9\\xf8\\xed\\xf0\\xc6\\x96\\xa7\\x0a\\x61\\x4f\\x35\\x53\\xad\\x38\\x69\\xbf\\xde\\x48\\xd2\\x6a\\x4d\\x36\\x7b\\x6c\\xec\\x05\\x7e\\x62\\xa4\\xe5\\x48\\x55\\x4b\\x48\\xb5\\x3e\\xcd\\xa7\\x90\\xba\\x7a\\x0a\\xb2\\xe3\\xde\\x58\\x7b\\xdc\\x22\\xb0\\x2f\\x59\\x47\\x63\\x4d\\x73\\x09\\x9f\\x54\\x7d\\xb2\\x2e\\xc1\\xbb\\xf8\\x23\\x43\\xf9\\xa2\\xca\\x38\\xbc\\xe4\\xeb\\x59\\xbe\"},\n{{0xe0,0xc2,0x9d,0xf4,0xde,0x45,0xc4,0x75,0x39,0xe0,0x89,0x6b,0x3a,0x59,0xbc,0x3d,0xe6,0xb8,0x02,0xfd,0x14,0xdb,0xdc,0x9f,0x25,0xe7,0x17,0xac,0x82,0xc3,0x28,0xf3,},{0xa6,0x90,0x02,0xb0,0xf5,0xef,0x35,0x4c,0xe3,0xb2,0xd6,0xb8,0xd8,0xba,0x70,0xab,0x77,0x84,0x32,0xb2,0x2f,0x14,0x4d,0xc9,0xc2,0xeb,0x92,0xd9,0x9d,0x99,0xdd,0x2a,},{0xbb,0x3b,0x8c,0x5c,0x27,0x59,0x1f,0xd8,0xb9,0xc5,0xba,0x48,0x9d,0x6b,0x6e,0xe5,0xb0,0xfb,0x4a,0x7b,0x0d,0xe5,0x1f,0x16,0x39,0xaf,0xc6,0x73,0xd0,0xe5,0xf7,0x5e,0x31,0x3a,0xa7,0xe1,0xd0,0x00,0x90,0x81,0xdb,0xca,0x74,0x35,0xb6,0x87,0xcc,0xd1,0x2f,0x64,0xf7,0x4a,0x38,0x6e,0x77,0x2b,0x9e,0x24,0x78,0x1b,0x92,0x5c,0x8c,0x0c,},\"\\x6a\\x37\\xcb\\x4c\\x74\\x9c\\x58\\x35\\x90\\xc8\\xd8\\x49\\xbc\\xe3\\xfa\\x65\\x7f\\x10\\x00\\x91\\x90\\xca\\xd9\\xbe\\x41\\xed\\xe1\\x9b\\xf2\\xfd\\xb3\\xc5\\x62\\xa6\\x10\\x1f\\x27\\xbd\\x37\\xf2\\x23\\xca\\xb1\\x3c\\xed\\x24\\x5a\\x1c\\xed\\xf8\\x52\\xf5\\x51\\xf8\\x57\\xaa\\xd9\\x72\\x7f\\x62\\xc9\\x67\\xc0\\xa9\\x21\\xdf\\x11\\x6f\\x48\\xa8\\x0a\\x60\\x40\\xb3\\xc7\\x23\\xab\\x5c\\xb5\\x94\\xc4\\x50\\x7a\\x3d\\x20\\xcd\\x60\\x51\\x4e\\x22\\x16\\x4a\\x82\\xb7\\x4f\\x19\\xdc\\xfd\\xd8\\x3c\\x57\\xbc\\x36\\x52\\x37\\x55\\x17\\x41\\x4a\\xf5\\xd1\\x8e\\x0a\\x64\\xcc\\xab\\x36\\x69\\x97\\x68\\xd0\\x7c\\xf4\\x0b\\x70\\x63\\xa8\\x3e\\x43\\xd5\\xf6\\x07\\x96\\x4b\\x1b\\xf0\\x84\\x0a\\x45\\xad\\x50\\xab\\xf8\\x3d\\xbc\\x84\\x9f\\x40\\xe5\\xb4\\xcf\\xb6\\xa3\\x34\\x7b\\x29\\xfe\\xc5\\x07\\x74\\x04\\x6a\\x4b\\x50\\x04\\x10\\x32\\xaa\\x4d\\x56\\x7e\\x85\\x64\\xb3\\xee\\xd1\\x64\\x20\\x40\\x68\\x2d\\xd8\\xae\\x7d\\x71\\x79\\x28\\x6c\\xf6\\xe1\\x85\\x3d\\xc8\\x7d\\x27\\xc3\\xe9\\xe6\\x0f\\xa4\\x7c\\xf8\\xcb\\x2d\\xa0\\x18\\x1d\\x53\\xee\\xc4\\x06\\x14\\xb0\\x73\\x31\\xa4\\xfb\\x70\\x28\\x08\\x6d\\x0b\\x1c\\xe2\\xe1\\x11\\x5b\\x73\\xa1\\x62\\xc5\\x27\\xbd\\xd7\\xca\\xb5\\x33\\x5b\\x86\\x3d\\x10\\x8b\\xe0\\x47\\xbd\\xbc\\xa1\\x12\\xcc\\x6e\\x77\\x6b\\xb4\\x53\\xc3\\x17\\x31\\x43\\x88\\xbb\\x96\\x53\\xef\\xb4\\x44\\x4b\\xf5\\xcf\\x1e\\xc8\\xda\\x23\\xb7\\x11\\xba\\x71\\x79\\x6c\\x0a\\xe0\\x2b\\xa1\\xdc\\xc8\\x38\\x45\\x50\\x78\\xc3\\x89\\x7f\\x07\\xe9\\xe1\\x3b\\x76\\xe4\\x92\\x74\\xc2\\xe2\\x07\\x50\\x6b\\x00\\xa0\\xb5\\x58\\x88\\x3a\\xa1\\x22\\xb6\\x67\\xdb\\x9d\\x67\\x05\\x08\\x60\\x6a\\x3f\\x54\\x32\\x06\\x36\\xcd\\x19\\xf9\\x73\\x91\\x7f\\xb1\\x87\\x5f\\x43\\x63\\xe2\\x20\\xf1\\xe1\\x23\\x98\\xcc\\x6a\\xfd\\x79\\x09\\x47\\x43\\x33\\x84\\x56\\x81\\x3a\\x58\\x26\\xad\\x3f\\x1a\\xba\\x7c\\xd7\\xbe\\xab\\x1f\\xe1\\x83\\x85\\x9c\\x0c\\xc9\\xef\\x40\\xa5\\xea\\xb9\\x12\\xca\\xf5\\x15\\xa8\\xd4\\xc3\\xb9\\x3d\\x64\\x1b\\x7a\\xb3\\xe7\\x6b\\x16\\xc1\\x29\\x71\\xac\\xe8\\x8f\\xf3\\x3e\\x5a\\x1e\\xd9\\xb4\\x4e\\x45\\xdb\\x8f\\x30\\x85\\xdb\\xf0\\x70\\xb2\\x56\\xb0\\xd7\\x51\\x2e\\xe1\\x06\\x94\\x32\\x60\\x3d\\x73\\x09\\x5d\\xb8\\x74\\x9c\\xa5\\x47\\x96\\x3b\\xd7\\x1a\\x8a\\x68\\x4a\\xb8\\x51\\x6b\\x14\\x6c\\x41\\x87\\x17\\x63\\x86\\xaf\\xdf\\x6c\\xb1\\x36\\x8a\\x3d\\xd8\\xfc\\xb2\\xcf\\xff\\x77\\x05\\x6a\\xaf\\x78\\x23\\xf8\\x00\\xb2\\x66\\xac\\xce\\x72\\xbf\\x64\\x3c\\x6d\\x0c\\x28\\xf0\\xab\"},\n{{0x19,0x8b,0x5f,0xd1,0xc0,0x38,0x27,0xe0,0x99,0x4a,0xd5,0xbf,0xee,0x9b,0x5b,0x7b,0xe9,0x96,0x6c,0x9c,0x3a,0x26,0x7e,0x4d,0x74,0x30,0x34,0x37,0x67,0x40,0x3c,0x67,},{0x66,0x82,0xc6,0xf1,0xa8,0x66,0xb4,0x9b,0x2f,0x8e,0xe9,0x7f,0x2e,0x53,0x2f,0xa9,0x16,0x66,0xbf,0x38,0xda,0x1b,0x4d,0xd6,0x55,0x43,0xa1,0x77,0x77,0x94,0xcb,0xee,},{0xf4,0x54,0xf3,0x5b,0x18,0x53,0x8f,0x87,0x7e,0x5d,0x61,0x4a,0x76,0xb5,0x27,0x6a,0x27,0xfc,0x0b,0x43,0x3f,0x21,0x5d,0xc4,0xe9,0x63,0xb3,0xf0,0x47,0x69,0x4c,0x78,0x0c,0x51,0x5c,0x6e,0xf6,0xfe,0x2d,0xb4,0xb0,0x09,0x00,0x9b,0xc2,0x73,0x3a,0xec,0x4f,0xd4,0x6e,0x61,0x53,0x57,0xcc,0x0b,0xcc,0x9f,0x1f,0x7f,0xc2,0x1e,0x3c,0x02,},\"\\x3f\\xda\\xa1\\x5c\\x46\\xf2\\x51\\x43\\xdb\\x97\\x20\\x79\\xd7\\x01\\x3c\\x7f\\x69\\xa1\\x36\\xf4\\x5f\\x3f\\x6b\\xa2\\xce\\xd8\\xb8\\x28\\x46\\x8e\\xb3\\xda\\xa6\\xb5\\x0b\\x4f\\x8d\\x33\\x80\\xfe\\xc6\\x4a\\x03\\x43\\xbe\\x11\\x6f\\x6f\\x83\\xb6\\xee\\x64\\xcc\\x4c\\x1b\\x1d\\x08\\xd5\\x4f\\xd4\\x20\\x29\\xe4\\x28\\x5c\\xfc\\x6c\\x6d\\xd5\\xcd\\x18\\x1a\\xb5\\x33\\xff\\xcd\\x41\\x1f\\x23\\xa1\\x00\\x3d\\xa9\\x4e\\xc9\\x34\\x0e\\x2e\\xc7\\x11\\x99\\xd6\\x78\\x54\\x0d\\x51\\x82\\xe1\\x39\\xff\\xcb\\xc5\\x05\\xa1\\x70\\xb8\\xf0\\x7f\\x4a\\x7e\\x69\\x4c\\xa9\\x2f\\x58\\x32\\x0c\\x0a\\x07\\x85\\x64\\xce\\x9d\\xe9\\x9b\\x0f\\xa8\\xe6\\x6b\\x0d\\x82\\x2e\\x46\\x7a\\x5a\\xeb\\x83\\x56\\x79\\x96\\xa4\\x8b\\x89\\xdb\\x25\\xca\\xde\\x64\\x57\\x79\\x4e\\x54\\x14\\xd6\\x7e\\x9d\\x4a\\xb7\\xcd\\x6c\\xc2\\x05\\x8b\\xb7\\xa5\\x13\\xab\\xd7\\x09\\xf4\\xca\\xf2\\x4b\\xb6\\x7c\\xe1\\xc0\\x3a\\xb6\\x2d\\xbd\\xfe\\x30\\x9e\\xc7\\xdb\\x0f\\xa3\\xea\\x7a\\xae\\x82\\x36\\xf2\\x59\\xb9\\x22\\xd4\\x53\\x61\\x15\\xa6\\x3b\\xc8\\x9a\\xcb\\x20\\x51\\xd0\\x9e\\x73\\x1c\\xbb\\x0d\\xf1\\x57\\xd9\\xd3\\x45\\xbd\\x91\\x09\\x97\\x3c\\x2b\\x59\\x4f\\x14\\x8e\\xfc\\x6f\\x33\\x77\\xde\\x51\\x63\\xb7\\xf6\\x98\\x69\\xff\\xef\\x85\\x3e\\xae\\xfe\\xb4\\x02\\xe2\\x35\\x29\\x59\\x4f\\xbd\\x65\\xca\\x05\\xfe\\x40\\x62\\xc5\\x29\\xd8\\xe3\\x21\\xab\\xc0\\x52\\x00\\xca\\xc1\\xe8\\x39\\xe8\\x7b\\x1f\\xd3\\xfd\\xf0\\x21\\xd6\\x8c\\xbb\\x3a\\x41\\x42\\xb6\\x9c\\xc3\\xaf\\x6f\\x63\\x2e\\xdd\\x65\\xb8\\x3f\\x5a\\xa4\\xcb\\x17\\xda\\x5b\\x6b\\xa3\\xfc\\x03\\xed\\xb1\\x7c\\x2a\\x3c\\xb5\\xb0\\x48\\x36\\xe7\\x66\\x0e\\x63\\xc8\\xa0\\x48\\x3e\\x24\\x39\\x83\\x37\\x1d\\xfa\\x98\\x39\\xf9\\x16\\x4a\\xd4\\xda\\x0d\\x59\\x53\\x65\\x5e\\x3a\\x95\\x18\\xe1\\x36\\xda\\x74\\x57\\x37\\xc7\\x92\\x43\\xc3\\x55\\xfc\\x12\\x5c\\xbd\\xcc\\x76\\xae\\xc9\\x22\\x16\\x84\\x6c\\x45\\x74\\xf4\\xf7\\xf2\\x98\\xbc\\xde\\x54\\xfd\\x24\\x44\\xad\\x30\\x25\\x95\\x5c\\x10\\x03\\x15\\xde\\x5a\\x4e\\x27\\xc3\\x33\\xa0\\x02\\x84\\xb2\\xf7\\x02\\xfd\\xd3\\xde\\x22\\xac\\x6c\\x24\\x0d\\xbc\\x14\\xbf\\x71\\xe6\\x2d\\x13\\x1b\\x62\\xf2\\xdb\\x99\\x24\\x73\\xf2\\xf9\\x13\\xf6\\x0c\\x91\\x6e\\xcf\\x57\\xdf\\x5f\\x3f\\x02\\x1f\\xb3\\x30\\x83\\x43\\x95\\xb7\\x94\\x72\\xca\\xff\\x19\\xfc\\xfa\\x0a\\x27\\x17\\x95\\xc7\\x6d\\x69\\xb4\\xdb\\x3f\\x85\\xb8\\xd2\\xe5\\xc3\\x44\\x19\\x65\\x48\\x4d\\xcc\\x39\\xab\\xa5\\x9b\\x70\\x12\\x74\\xf7\\xfc\\x42\\x52\\x46\\x85\\x60\\x69\"},\n{{0x43,0x92,0xf7,0xd4,0xfb,0xd6,0x8f,0xe1,0x54,0xe4,0xba,0x38,0xad,0x52,0x07,0x61,0x2a,0x06,0x48,0x55,0x60,0x56,0xc3,0x9a,0xc1,0x16,0xad,0x46,0x8f,0x89,0xbd,0x2d,},{0xcb,0xea,0xef,0x41,0xac,0xac,0x02,0xbf,0x1f,0x78,0x0c,0xe9,0x34,0xaa,0xbd,0x63,0x13,0x64,0xb3,0x69,0x56,0x7b,0xe1,0xbe,0x28,0xe3,0x90,0x6f,0x9d,0xb1,0x20,0xfa,},{0x86,0xe7,0xcc,0xf0,0x6e,0x79,0x36,0x2d,0x40,0xcd,0xb7,0xfb,0x75,0xa9,0x89,0x78,0xbb,0xd3,0x34,0xa1,0xdb,0x75,0x90,0x36,0x7d,0x60,0x84,0x9b,0xd5,0x3e,0x2f,0xb1,0xa4,0xbd,0xae,0x59,0x0d,0x1f,0x47,0xb5,0x49,0x0d,0x87,0x02,0xe7,0xc1,0xa8,0x72,0x68,0xb8,0xee,0x9d,0xb6,0x12,0xde,0x7b,0xdc,0x2e,0x38,0xfa,0x6d,0xeb,0x7e,0x05,},\"\\xcf\\x17\\x09\\xdc\\x9a\\x08\\x67\\xee\\x90\\x87\\x21\\xb1\\x36\\xcb\\x93\\xa8\\x42\\x29\\xe8\\x3b\\x46\\x20\\x47\\x77\\xca\\x81\\x94\\xd0\\x8b\\x7a\\x3c\\xa9\\xc9\\x12\\xeb\\x24\\x3e\\x5b\\xda\\xbf\\xee\\xd3\\x52\\x34\\x9d\\x20\\xbe\\x80\\x1b\\x72\\x2a\\xf0\\x89\\x22\\x38\\xe7\\x2e\\xdf\\x19\\x0e\\x63\\x61\\xf5\\x75\\x72\\x78\\x1a\\xd3\\xc2\\x59\\x0b\\x19\\x73\\x57\\x64\\x1c\\x80\\x53\\x83\\xba\\xa1\\xd4\\x97\\x2f\\x76\\xc6\\x54\\x48\\x53\\x2c\\x11\\x08\\x34\\xa0\\xba\\xa8\\xf4\\x88\\x63\\xe1\\x66\\xb7\\x06\\x65\\x37\\x08\\xcd\\x40\\x57\\xd3\\xa4\\xf9\\xfc\\xb2\\xce\\xb4\\x12\\x00\\x01\\x27\\x7d\\x38\\xc4\\x38\\x47\\xd8\\x22\\x82\\x2b\\x77\\x7c\\x2b\\xb4\\xda\\x40\\x15\\xa1\\xc2\\x4d\\x41\\x6d\\x50\\x62\\xa8\\x71\\x84\\x91\\xd8\\x55\\xaa\\xa5\\xdb\\xf5\\x57\\x9c\\x16\\x4d\\x8e\\x52\\x4a\\x9f\\x2f\\xa3\\xf2\\x2e\\xb0\\x98\\x61\\xff\\xe6\\xad\\x65\\x9f\\xe3\\x6e\\xb4\\x04\\x31\\x22\\x2c\\x22\\xd7\\x13\\x7a\\x6c\\xab\\xca\\x8d\\xb7\\x86\\xe3\\x9d\\x81\\xf6\\x61\\xaf\\xde\\x4e\\x39\\x58\\x9b\\x4d\\xb4\\xd3\\xc5\\x1c\\xa5\\x35\\x90\\xa1\\x4e\\x11\\x5d\\x0a\\xfc\\x3a\\x87\\x7b\\x83\\x9a\\x96\\x38\\xbe\\xce\\x80\\xc3\\x2c\\x19\\xe5\\x1b\\x75\\x32\\x02\\x48\\x45\\xf7\\x6c\\xfe\\x9b\\xfb\\x2a\\xc0\\x51\\x30\\xf6\\x75\\x8b\\xf7\\xfe\\x99\\x3a\\xa9\\x3a\\xa2\\x72\\xe4\\xe6\\xbd\\x0c\\x75\\xc1\\x40\\x99\\xd4\\x3e\\x65\\x2a\\x22\\x3e\\x5b\\xcd\\x64\\xc3\\x62\\xd4\\xb8\\xf4\\xb9\\x5e\\x01\\x6f\\x93\\x50\\xc7\\xfa\\x74\\xe6\\x53\\x52\\x5d\\x08\\x01\\x15\\x58\\xb2\\xc6\\xe9\\xbf\\x4f\\xdf\\x9d\\xbd\\x5e\\xf9\\xb0\\x9b\\xbc\\x84\\x6a\\xfc\\x2b\\xcb\\xc8\\x6c\\x4c\\xcc\\x31\\x5f\\x6d\\x1c\\xcd\\x48\\x9b\\x0c\\xf8\\xed\\x0d\\x93\\xf2\\xf5\\x32\\xa4\\x26\\x26\\x5c\\x59\\x0b\\xa3\\xa5\\x90\\x23\\x34\\x7d\\x81\\x9d\\x9b\\x28\\x1e\\xf8\\x53\\x10\\xb0\\x53\\x16\\xd4\\x6c\\x8a\\x8c\\x03\\x65\\xd0\\x68\\xa8\\x70\\x86\\x64\\xea\\x4d\\x77\\xac\\x0c\\xd1\\x50\\xa6\\x5a\\x56\\x58\\x6b\\xab\\xd3\\x4b\\x74\\x36\\x5b\\xb8\\xfe\\x3e\\x61\\x87\\x26\\x22\\x84\\xd6\\x44\\x32\\xe4\\xc8\\x1e\\xa4\\xc0\\xe5\\x7c\\x1d\\x71\\xae\\x98\\x0c\\x7f\\x4d\\x1d\\x87\\x10\\x32\\xe1\\x88\\xbb\\xf9\\xd1\\x75\\x8c\\xdc\\x1d\\xff\\x98\\x9f\\x2d\\x12\\x88\\xfe\\xf4\\xe2\\x05\\xe9\\x9e\\x7c\\xbf\\x2c\\xc3\\x24\\xb8\\xc9\\x30\\x46\\xf4\\x76\\xc5\\x9d\\x3d\\x0a\\x59\\xdb\\x6f\\xe3\\x73\\x82\\xdc\\x79\\xc5\\xec\\x16\\x05\\x6a\\xb3\\x93\\x4a\\x52\\xf7\\xd2\\x88\\x0d\\x04\\x71\\xa3\\x77\\xb6\\xa8\\xae\\x84\\xd5\\x6a\\xc2\\x2d\\x1d\\x54\\x55\\x1c\"},\n{{0x0b,0xea,0x98,0xab,0xe7,0xd6,0x3f,0x15,0x83,0x90,0xee,0x66,0x8a,0xa0,0x50,0xe8,0x4a,0x25,0xd2,0x89,0x3e,0x49,0xfc,0x83,0xf0,0x79,0xf9,0xbb,0xa6,0xa5,0x5a,0x75,},{0x22,0x19,0x2e,0xc0,0xd3,0x2e,0xf9,0x83,0x56,0x65,0xa6,0x1b,0xc8,0x8b,0xcf,0x4e,0x16,0x04,0x63,0x79,0x21,0x15,0x2c,0x11,0x6a,0xf5,0x03,0x36,0x5b,0xf6,0xbe,0x42,},{0x7e,0xb3,0x13,0x9b,0x88,0x0f,0xdf,0x66,0x37,0x6a,0x20,0x90,0x81,0x88,0x40,0x04,0x97,0x67,0xc8,0x37,0xf3,0xad,0x00,0x36,0xb1,0x41,0x66,0x70,0x52,0xb3,0x36,0x09,0x81,0x7c,0xa5,0xe2,0x40,0xed,0x8c,0xdf,0x3c,0xcf,0x3a,0xee,0x29,0x27,0x45,0x34,0x59,0x4d,0xb0,0xb4,0xcc,0xc5,0xc6,0xe5,0xbb,0xa3,0x28,0x0b,0x87,0x3f,0x29,0x01,},\"\\xc1\\x78\\xe3\\x8d\\x4e\\x83\\xed\\x2b\\xe5\\x7c\\xe1\\xc3\\xab\\x64\\x25\\x3a\\x81\\x71\\xe6\\x10\\x00\\x81\\x81\\xfb\\xfc\\x6d\\x75\\x22\\x69\\xf7\\xf1\\xc5\\xa9\\xec\\x62\\xcb\\x27\\xf1\\x9a\\xd9\\x9c\\xe1\\xf5\\x11\\x6a\\x36\\x3d\\x96\\xfd\\xc5\\xa4\\x2f\\x35\\x8b\\x6d\\xbe\\x7c\\xab\\xdf\\xc9\\xf6\\x07\\x18\\xe4\\x01\\x2c\\x1b\\xb1\\xf8\\x42\\xc5\\x56\\x08\\x11\\xba\\x83\\x74\\xa0\\x63\\x77\\x47\\xff\\x92\\xea\\xc2\\x1c\\xa6\\x5d\\xde\\xaf\\x43\\xe9\\x98\\x9b\\x7d\\xe2\\xd4\\x32\\x52\\x0a\\xfe\\xe3\\x64\\xec\\xfb\\xa4\\xda\\x66\\x9a\\xd4\\x89\\x3d\\x0b\\xf6\\x9f\\x9f\\x81\\xe7\\xdf\\x69\\x65\\x7b\\xe2\\x2b\\x92\\x06\\x97\\x45\\xf2\\x16\\xc2\\x42\\xcc\\xd4\\x6d\\x02\\xd3\\x56\\x16\\xe1\\x6c\\x75\\x5e\\x0e\\x37\\xf9\\x61\\xa6\\xf3\\x63\\x77\\x52\\x53\\x4f\\x6d\\xfa\\xb8\\x80\\x5a\\xb7\\x59\\xa0\\x32\\xa4\\xe7\\xe4\\xc8\\x19\\x53\\x32\\x5a\\x2f\\x68\\x6b\\xb6\\x9a\\x02\\x9c\\xe4\\xe0\\x3b\\xec\\xb3\\x60\\x56\\x37\\xc5\\xa6\\x5b\\x52\\xe3\\x31\\xc2\\x6c\\x92\\x6e\\xd4\\x71\\x1a\\x50\\x4d\\x37\\x33\\xbb\\x53\\xc9\\x7b\\x80\\xea\\xfe\\x4e\\x75\\xdd\\xd9\\xf4\\x15\\x36\\x28\\x88\\xc3\\xd4\\xd3\\x7b\\xae\\x0e\\x63\\xfa\\x11\\xbf\\x75\\x56\\x66\\x43\\x7d\\x72\\xf5\\x8c\\x91\\xd7\\xa2\\xf8\\xcb\\x61\\x9b\\x76\\x20\\xa0\\x70\\xb2\\x6b\\x18\\xb4\\xd5\\x01\\x84\\xc5\\x81\\x87\\x12\\x11\\x0e\\x36\\xd3\\xe2\\x83\\x0f\\x6a\\x85\\x76\\xba\\x57\\xf9\\xcc\\xcb\\x8f\\xff\\x40\\x28\\xbf\\x8e\\xf9\\xcb\\x81\\x48\\x25\\xbb\\xca\\x82\\x7d\\x64\\x95\\x47\\xbf\\x6f\\x2b\\xef\\x93\\x17\\x04\\xca\\x7f\\x6d\\xf1\\x5f\\x78\\x01\\x55\\xed\\x46\\xea\\xa7\\xca\\x7d\\x72\\xe2\\x24\\x34\\xca\\x04\\x83\\xbf\\xb2\\xf7\\x90\\x2d\\xc7\\x87\\xf6\\x17\\xeb\\x9b\\xd4\\x1e\\xd4\\x52\\x0a\\xdf\\xd4\\x30\\x94\\x8c\\x71\\x08\\x05\\xa7\\x3c\\x1b\\xa5\\x49\\x2e\\x96\\x48\\x4c\\x4b\\xaa\\x7d\\xa2\\x4c\\x74\\x35\\xc4\\x6a\\x05\\x2b\\xf3\\x51\\x5d\\x33\\xe4\\x2d\\xce\\xf5\\x17\\xca\\xa4\\x5f\\x36\\xc8\\x79\\x12\\x10\\x78\\xc6\\x88\\xdd\\x10\\xd7\\x66\\x56\\xa1\\x19\\x76\\x2b\\x6a\\x83\\x41\\x36\\xfa\\x1f\\x8a\\x64\\x32\\x24\\xb9\\x22\\x4c\\x54\\x3c\\xf0\\x47\\x0b\\x3f\\x8e\\xe0\\x17\\xd6\\x20\\xdb\\xdc\\xc8\\x4d\\x98\\x51\\x54\\xe9\\xd1\\xae\\x80\\xe5\\xf1\\x43\\x87\\xb8\\x8a\\x0f\\x6a\\x5c\\x35\\x90\\x5a\\xa5\\x7f\\xb3\\xab\\xeb\\x0e\\xa6\\xec\\xcd\\xdb\\x00\\x44\\x74\\x63\\x3c\\xc4\\x83\\xb5\\x6b\\x8a\\x8e\\x20\\xe8\\xf2\\xe0\\x9e\\x97\\x9a\\xa0\\x98\\x93\\x08\\x78\\x75\\xc6\\xb1\\x17\\xb5\\xf1\\x38\\x47\\xad\\x8f\\xc0\\x56\\x04\\xc4\"},\n{{0xc2,0x58,0x78,0xb0,0xd1,0xe0,0x92,0x5c,0x8f,0x5f,0x04,0xa1,0xe5,0x79,0x90,0x80,0x96,0x3c,0x41,0x3a,0x13,0x99,0xc1,0x18,0xaf,0xb1,0x68,0x7c,0x79,0x7f,0x48,0x39,},{0x13,0xac,0x2c,0xad,0x41,0x90,0x8c,0x25,0x5f,0x67,0x1f,0x93,0x93,0x4a,0xe5,0xd7,0xbe,0x32,0x53,0x46,0x72,0x5c,0x8b,0x40,0xdc,0x39,0xea,0x80,0xd7,0x0d,0xdf,0x34,},{0x06,0xf5,0x51,0x98,0xb4,0x19,0x19,0x14,0xb7,0x43,0x06,0xf3,0x8e,0x38,0x13,0x16,0xea,0xc4,0x0b,0x5b,0x5a,0xdb,0x8a,0x31,0x24,0x64,0xf6,0x71,0x75,0xec,0xf6,0x12,0xe0,0x14,0x7b,0x1c,0xef,0x46,0xc2,0x51,0x87,0x50,0xa5,0x60,0x6b,0xb0,0x3b,0xc6,0x46,0x7b,0xb9,0x32,0x15,0x14,0xf6,0x9d,0xcb,0xeb,0xce,0x8f,0x69,0x05,0x80,0x02,},\"\\x68\\x56\\xcc\\x71\\x44\\xb6\\xbd\\xdc\\xc4\\xb5\\x89\\x54\\xd1\\xa2\\xe7\\x10\\x1d\\x65\\x84\\xb5\\xd5\\xe7\\x19\\xa0\\xae\\xa0\\xfb\\xbd\\xf2\\x21\\xc2\\xa2\\xaa\\xcb\\xac\\xdc\\x40\\x20\\xc5\\xc8\\xce\\x68\\x1f\\xf7\\x38\\x1a\\xcd\\x60\\x7b\\x0f\\x52\\x39\\x69\\x23\\x35\\x70\\x06\\x55\\xbe\\x2d\\x94\\xc5\\x3d\\x7b\\x51\\x48\\xe9\\x2a\\x2b\\xc1\\x63\\x38\\xc2\\xf4\\xc1\\xa7\\xd1\\xc5\\x95\\xaf\\x62\\x2c\\x24\\x0c\\xe5\\x79\\xa5\\xe0\\xf5\\xb6\\x51\\xbf\\x56\\x25\\x18\\xce\\xc8\\xaa\\x2c\\xe4\\xb4\\xaa\\xdb\\x1f\\x2f\\xda\\x6c\\xf6\\x29\\x5b\\xc3\\x78\\x03\\xb5\\x37\\x7d\\xab\\x65\\xc9\\xb9\\xa2\\x94\\x9f\\xdd\\x49\\xbf\\x9d\\xdc\\x8f\\x96\\xd2\\x60\\xff\\x95\\x1b\\xf8\\xe8\\xcc\\xf9\\x82\\x7e\\x68\\x69\\xc4\\x4b\\xfd\\x97\\x33\\x58\\xce\\xfd\\xb0\\x10\\xdb\\x5e\\x1f\\xe5\\xdb\\xd9\\xf5\\xd2\\xb2\\xca\\x39\\x3c\\x17\\xd4\\x46\\xf6\\x37\\x05\\x9e\\x69\\x2d\\x7a\\x91\\xaa\\xdc\\xc7\\x68\\x9f\\x5f\\x9e\\x1b\\x30\\x52\\x17\\x5d\\x9b\\x6b\\x20\\x8f\\x90\\x26\\x78\\x7f\\xdb\\x66\\x78\\x3f\\x45\\x37\\x2a\\x24\\x94\\x6b\\x1b\\xd1\\x68\\x7b\\xf0\\xcf\\xcc\\x81\\x74\\xeb\\xe4\\xd3\\x2e\\x43\\x28\\x4f\\xc7\\x8d\\x78\\x44\\xde\\x0f\\xa2\\x2e\\x20\\x65\\xe0\\x75\\x28\\xba\\xab\\xaf\\x01\\x5c\\xb3\\x4d\\x62\\x9c\\x35\\x96\\xad\\x04\\x0d\\xe3\\x1c\\x56\\x20\\xeb\\x26\\x6d\\xef\\xa7\\x53\\x3a\\xc0\\x40\\x19\\x98\\xe5\\x67\\x3a\\x75\\x43\\x65\\x04\\x7d\\xeb\\xfc\\xf7\\xe1\\x37\\xa2\\x0d\\x16\\xcd\\xd6\\xa5\\x52\\x19\\x82\\xf4\\x44\\xcf\\xc3\\x42\\x93\\x97\\xc6\\x41\\xbd\\x7e\\x74\\xa7\\x70\\xbb\\x11\\xfc\\xb2\\x94\\x83\\xe3\\x37\\xba\\xe5\\x16\\x9e\\xe8\\x2d\\xa9\\xa9\\x1a\\xdf\\x3a\\xf6\\x7c\\xd8\\x14\\xc2\\x82\\x5d\\x29\\x01\\x8e\\xf0\\x35\\xea\\x86\\xf8\\xde\\x4c\\x75\\x63\\xaa\\xf6\\x6e\\x0c\\x75\\xd1\\x7c\\xa6\\x8f\\x49\\xf0\\x75\\x8e\\xc2\\xd9\\xc5\\x17\\x9d\\x01\\xaa\\xed\\x7d\\x45\\x15\\xe9\\x1a\\x22\\x2b\\x0b\\x06\\xfb\\xde\\x4f\\x07\\xa7\\xd9\\xdf\\x2d\\xe3\\xbc\\xae\\x37\\xca\\x2c\\x84\\x60\\xc2\\xa6\\xb3\\x74\\x9e\\x9b\\xda\\x36\\xd0\\x8e\\x66\\xbc\\xc3\\x56\\xb3\\x90\\x43\\x4b\\x4a\\x18\\xcf\\xa4\\x5a\\xf5\\x57\\xdc\\xa3\\xd8\\x57\\xff\\x3a\\xd3\\x47\\xcf\\xb0\\x7e\\x23\\x58\\xc2\\xac\\xfd\\x5c\\xd5\\x3b\\x3b\\x0e\\xa2\\xa4\\x1e\\xe5\\xc0\\x80\\x2f\\xd4\\x73\\xdb\\x5f\\x30\\x52\\x63\\x34\\xda\\x41\\xeb\\x4b\\xc7\\x51\\x83\\x83\\x89\\x8a\\x0b\\x75\\x07\\xad\\x4c\\xa2\\x89\\xd6\\x6c\\x5e\\x2e\\xb7\\x5c\\xf2\\x55\\xdf\\xf3\\x12\\xcb\\x1e\\x04\\xee\\xbe\\xb4\\x7f\\x29\\x30\\xb9\\x0d\\x5e\\x00\\x2e\\xb0\"},\n{{0x0b,0x2e,0xc6,0x27,0x63,0xf6,0x87,0x59,0x31,0x35,0xda,0x19,0x61,0xef,0x29,0xa2,0x88,0x08,0x96,0x96,0xd9,0x44,0xb2,0x65,0xa5,0xf9,0x68,0x93,0xcd,0x2d,0x82,0x25,},{0xc1,0xe2,0x34,0xfa,0x8b,0xc9,0x6d,0x26,0x8e,0x7a,0xad,0x02,0x8b,0x03,0xf0,0xa9,0x11,0xb6,0x97,0x71,0x5d,0xb3,0xa2,0x1c,0x2f,0xc7,0xdf,0x48,0xec,0xda,0x88,0x75,},{0xff,0x70,0x1f,0x34,0xb3,0x59,0x4d,0xe3,0xb8,0x00,0x45,0xf4,0x29,0xe5,0xe3,0x2d,0xd8,0x8d,0x60,0x51,0xd4,0x19,0x5f,0x16,0x85,0xbe,0x78,0x37,0x66,0xe8,0x01,0x19,0x36,0x8f,0x56,0xb3,0x74,0x97,0x25,0xb9,0x13,0xf1,0x22,0x3f,0x87,0xfb,0x0f,0xb2,0x4d,0x9d,0xfa,0x08,0x41,0xd6,0xa0,0xe2,0xeb,0x1f,0xdd,0xf7,0x75,0xc2,0xd2,0x05,},\"\\xa8\\x34\\x34\\xc6\\x86\\x93\\xd5\\xfc\\xed\\x91\\xbd\\xa1\\x02\\x13\\xfc\\xd5\\x0c\\x48\\x92\\x0b\\x90\\xce\\xe9\\xb7\\x3a\\x9c\\x61\\x08\\x1a\\x09\\x74\\x93\\x3f\\x4f\\xdb\\x0a\\x67\\xe6\\x71\\xf8\\x35\\x1b\\x0e\\xd5\\xec\\x0f\\xe7\\xb5\\xfb\\x0c\\x87\\x58\\x6f\\xe5\\x82\\xff\\xb1\\xbf\\xa2\\xdb\\x5f\\xce\\xdd\\x33\\x02\\x42\\x82\\x34\\xb2\\xbb\\x0e\\x72\\x6d\\xed\\xf4\\x5b\\x13\\xa7\\x0c\\xd3\\x5a\\xb3\\xe2\\x99\\xd1\\x3f\\x34\\x50\\x35\\x08\\x27\\x8c\\x44\\x58\\xee\\xa5\\xb7\\x35\\x1b\\x05\\x83\\x6b\\xda\\xd5\\xb0\\x5f\\x60\\xe4\\x45\\xfc\\x65\\x73\\x7a\\xe2\\x7d\\x2e\\x52\\xdf\\x9c\\x39\\xe5\\xda\\x02\\x86\\x39\\x2d\\x08\\xff\\xf7\\xec\\xb7\\x06\\x68\\x20\\xfc\\x90\\xfc\\x8a\\x44\\xd5\\x61\\x65\\x61\\xc5\\x0b\\x52\\x71\\x47\\x02\\x30\\x2b\\xca\\x58\\x74\\xde\\x85\\xdb\\xa0\\x45\\x04\\x5f\\x9f\\x0e\\x60\\x4e\\xb8\\x6d\\x6d\\x7f\\xbd\\x77\\x5f\\x72\\xea\\x49\\x3b\\x2c\\x4e\\xf7\\xc3\\xbe\\x16\\xdb\\x2c\\xa7\\xe4\\xd8\\xbd\\x79\\xeb\\x20\\xcf\\xb5\\xf0\\xf6\\xf0\\x53\\x36\\xb7\\x5c\\xc8\\x6d\\x21\\x9f\\x3b\\x8f\\x2e\\x91\\xba\\x7d\\x52\\xb6\\x4f\\xdd\\x6a\\x66\\x64\\xf0\\x4f\\x2f\\xba\\xb7\\x58\\xcd\\xf9\\x84\\x16\\x86\\x91\\xc3\\x2f\\x53\\xe8\\x61\\x6b\\x49\\xf7\\x6a\\xb7\\xb1\\x92\\xb9\\x00\\x90\\x30\\x82\\xcc\\x89\\x65\\x6a\\x97\\x05\\x80\\x4c\\xc9\\xb9\\x28\\x8a\\x3e\\x42\\x17\\x09\\x84\\xf8\\xdc\\x45\\x4e\\x08\\x64\\xb9\\x34\\x16\\x72\\x68\\x6a\\x17\\x8c\\x06\\x00\\x50\\x17\\x8a\\x36\\xc6\\xd9\\x06\\xb2\\xce\\x07\\x0d\\x8f\\xaa\\xac\\xd9\\xa5\\x8c\\x79\\x4a\\x5e\\xa4\\x10\\x8b\\x4a\\x48\\x5c\\x65\\x81\\x1c\\x2d\\xca\\x2e\\xe7\\xbb\\x10\\xbf\\xff\\xf7\\x5d\\x45\\x86\\xb9\\x90\\xf4\\x37\\x63\\xa1\\x6f\\xbc\\x0b\\x48\\xae\\x1f\\xaf\\xb0\\x8a\\x9a\\x36\\xfa\\x43\\x26\\x84\\x5d\\xba\\x5b\\xa2\\xfb\\xd3\\x2b\\xbf\\x66\\x50\\x5c\\x5e\\x86\\x57\\xed\\x01\\x07\\xe3\\xe1\\x61\\x44\\xef\\x31\\xfa\\x6a\\xae\\x72\\xe7\\x74\\x09\\x74\\x83\\xf5\\x48\\x0a\\xa4\\x55\\x40\\x56\\x8f\\xd0\\x8c\\xba\\x0d\\x57\\x77\\x68\\x00\\x4f\\x58\\xae\\x9b\\x95\\xbe\\x37\\x4e\\xd7\\xf0\\x29\\x9f\\xe7\\x21\\x27\\x5e\\x47\\x6e\\x0b\\x9a\\xb7\\x2d\\xc0\\x6e\\xa3\\x28\\x38\\x4e\\x39\\xbf\\x3a\\xc3\\x31\\xc6\\x25\\x48\\x43\\x12\\xcd\\x9b\\x06\\xb1\\x5a\\x29\\x54\\xd3\\x3e\\x7a\\xab\\xa6\\xbe\\x22\\x61\\x88\\x6c\\xa8\\x11\\xdb\\x96\\xb1\\x14\\x3d\\x06\\xdd\\x6e\\x0f\\x3c\\xba\\x7a\\x1a\\xe9\\xb9\\x4e\\xaf\\x67\\x77\\x1b\\xb2\\xd2\\x4e\\x2f\\x94\\xde\\x9c\\x47\\x0f\\xcd\\xe7\\xbf\\xdb\\x32\\xf4\\x10\\x19\\x8b\\x5a\\xa9\\x69\\x8e\\x32\"},\n{{0x89,0x60,0xd7,0xbe,0xe8,0xc6,0xb3,0x9c,0xa5,0x93,0x4d,0x7c,0xdd,0xd1,0x6f,0x16,0xb3,0x66,0x3e,0x6e,0x03,0xe8,0x33,0xc0,0x57,0xe2,0x18,0x1e,0x45,0x97,0xcb,0x68,},{0x43,0x40,0x90,0x95,0xd4,0xf5,0x0f,0x5e,0xdd,0xbd,0x5c,0xd4,0xd2,0x01,0x22,0x98,0xcb,0x41,0xa4,0x0e,0x99,0x49,0x2d,0x5a,0x2d,0xb0,0x8b,0xe5,0x37,0x7e,0xa1,0x83,},{0x72,0x13,0xdd,0x4a,0x79,0xfd,0x54,0xde,0xc0,0xc5,0x48,0xef,0x42,0xe6,0xca,0xe0,0x15,0xbe,0x77,0x80,0x2b,0xf5,0x15,0xcd,0x25,0x82,0x76,0x8f,0x72,0xf5,0x63,0xeb,0xb2,0xda,0x36,0xaf,0x4a,0xae,0xac,0x56,0xbb,0xff,0xc9,0x93,0x2c,0x2e,0x24,0xec,0x95,0xda,0xff,0x00,0xa5,0xf7,0xa0,0xac,0xab,0x9c,0x8b,0xd3,0xc2,0x3b,0xb4,0x0c,},\"\\x30\\x8d\\x84\\xc7\\xa5\\xf7\\x86\\xe5\\x63\\xe5\\xc1\\xea\\x57\\xaa\\xb5\\xe5\\x55\\xc0\\x09\\x97\\x74\\x9d\\x15\\xae\\xe3\\x54\\x39\\xef\\xa6\\x45\\xda\\x2c\\x39\\x67\\x70\\x31\\x15\\xc6\\xc6\\x3e\\xd7\\xf9\\x47\\x85\\xc5\\x47\\x8f\\x38\\x46\\x7b\\x86\\xe7\\x62\\x6e\\x8f\\xff\\xa4\\xd5\\x1a\\x2d\\xc4\\x5e\\x6d\\xf2\\xa3\\x5c\\xec\\x99\\x55\\x5e\\xab\\xc9\\xf7\\xa9\\x3e\\x2e\\x2b\\x68\\x94\\x59\\xb4\\xe0\\xc9\\x2b\\x35\\x15\\x62\\xc4\\x17\\xb1\\x99\\x71\\x13\\x75\\x4e\\xa5\\x9e\\x4a\\x91\\x51\\x07\\x28\\xff\\x30\\x71\\xa2\\xbb\\xd1\\xf4\\x65\\xa6\\x87\\xf6\\x7d\\xae\\x95\\x56\\x15\\x03\\x1a\\x8a\\xd5\\x51\\xfe\\x73\\x8a\\x26\\x0b\\xbc\\x44\\x6b\\x48\\xdc\\xa1\\xd9\\x79\\x05\\x1a\\xb5\\x84\\x08\\x32\\xe1\\x9d\\x47\\x3b\\x66\\x62\\x17\\xa9\\x18\\x39\\x80\\xd6\\xb2\\x7e\\x3d\\x3c\\x76\\xd9\\x36\\x65\\xba\\x23\\x93\\xe6\\xab\\x1a\\x42\\xc3\\x90\\x4d\\x40\\x25\\x93\\x2d\\x60\\x1a\\x20\\x2a\\x59\\xa4\\xc4\\x9f\\xdb\\x77\\xf0\\xe0\\x28\\x68\\x24\\x7d\\xe5\\xaf\\xdf\\xaa\\x1b\\x89\\x42\\x08\\xac\\x00\\xd7\\x7c\\x6b\\xb5\\x4c\\x6b\\x2a\\x73\\xa4\\x76\\x57\\xe4\\x4c\\x85\\x13\\x79\\x63\\xb5\\x75\\x21\\xaf\\x20\\x97\\x62\\x48\\xeb\\x26\\x14\\x82\\x14\\x7c\\xdf\\x7a\\x14\\x5c\\x36\\x43\\xe2\\x9e\\x05\\x88\\xbf\\xda\\xe6\\xa0\\x82\\x90\\x48\\x53\\xce\\x5a\\x10\\xd2\\x49\\x70\\xeb\\xdf\\xb7\\xf5\\x9d\\x5e\\xfd\\xd6\\xa5\\xe7\\xe0\\xd2\\x87\\x97\\x1c\\x84\\x6a\\xcd\\x54\\xd8\\x4d\\xd4\\x54\\x68\\xa4\\x11\\x0b\\xab\\x6e\\xf8\\xd9\\xa5\\xb4\\xb2\\x42\\x67\\x88\\x90\\x0b\\x7e\\x1a\\xdf\\xe0\\x62\\x43\\x44\\xf9\\x8f\\xe5\\x9e\\xf8\\xa1\\xe6\\xc4\\x05\\xb3\\x44\\xeb\\x97\\xbb\\x20\\x47\\x73\\x74\\x4b\\x6a\\x2d\\x8c\\x6e\\x65\\xd1\\x7c\\xea\\x07\\xde\\x03\\xb7\\xf0\\xfe\\x49\\xf1\\xa5\\x5c\\x33\\xd5\\xf1\\x5c\\xe5\\x5d\\xf7\\xc9\\x56\\x1b\\x25\\x1c\\x6a\\xc8\\x07\\xa9\\x25\\x53\\xe1\\xce\\x91\\x70\\x12\\xdc\\xcf\\xd6\\x9e\\x7d\\xbd\\x03\\x8c\\x7e\\xee\\xca\\xe9\\x86\\x23\\xf1\\x8f\\xbb\\x65\\x0e\\x22\\x18\\xa0\\xbc\\x0f\\xff\\x43\\xa7\\x5a\\x11\\x64\\x48\\xbb\\x73\\x62\\xf5\\x27\\xee\\x6b\\xc8\\xe1\\x07\\x61\\xcc\\xcf\\x9b\\xcf\\xc0\\xd0\\x00\\xf2\\x12\\x7b\\x4c\\xc1\\x92\\x11\\xd0\\x95\\xa0\\xbd\\xaa\\x4e\\x4b\\xe4\\x51\\x9e\\x6c\\x84\\x45\\xea\\xb9\\xb3\\x14\\x4a\\x45\\xca\\xb9\\x99\\x61\\x35\\xbf\\x7f\\x75\\xa7\\x8d\\x22\\x27\\x59\\x00\\xf4\\xce\\x1f\\x0a\\x9e\\xac\\x13\\x63\\x64\\x10\\x30\\x62\\x89\\x3d\\xad\\x43\\x90\\x42\\x2b\\x77\\xe5\\xf5\\xd1\\xd9\\x4d\\x70\\x29\\xc6\\x09\\x7b\\x35\\xca\\x64\\xa7\\xa4\\x76\\xfc\\xc7\"},\n{{0xef,0x6b,0x9b,0x51,0xfd,0x4f,0x85,0x86,0xca,0x62,0x65,0x8e,0x04,0x2f,0xc0,0x9a,0x83,0xb9,0x43,0x03,0x35,0x26,0xff,0xc3,0x26,0xc6,0x5e,0xb3,0xa5,0xfb,0x59,0x4b,},{0x1d,0x6e,0xec,0xe8,0x05,0xe0,0x88,0x78,0x21,0x87,0x6b,0x7e,0xd6,0xed,0x5b,0x07,0x14,0xd6,0x46,0xfb,0xec,0xda,0x38,0x76,0x4f,0x94,0xc8,0x15,0x5e,0x61,0xd0,0x04,},{0x71,0xd1,0x71,0x07,0x1c,0xd0,0xfe,0xa1,0xc6,0xa9,0xcf,0xad,0x1f,0x7f,0xd8,0x35,0xe8,0x5f,0xf9,0x06,0x77,0x8b,0xc6,0x34,0x5a,0x4d,0xec,0x43,0x13,0xec,0xc2,0xbf,0xf7,0x55,0xa7,0x17,0xeb,0xd9,0x12,0xa5,0xe0,0x28,0x40,0xac,0x07,0x38,0x42,0xf9,0xbf,0xca,0xa5,0x89,0x13,0xe2,0x60,0xe3,0xc7,0x33,0x93,0xd3,0x66,0x85,0xc7,0x0e,},\"\\xa8\\xf3\\xf1\\x96\\x65\\xde\\x23\\x90\\xd5\\xcc\\x52\\xb0\\x64\\xb4\\x85\\x12\\x73\\x67\\x74\\x86\\xd8\\xf5\\x56\\x3b\\xb7\\xc9\\x5f\\xa9\\x4d\\xb3\\x35\\x61\\x61\\xee\\x62\\x22\\x21\\xf1\\x0c\\xbb\\x1f\\xa1\\x95\\xaa\\xc7\\x23\\x1e\\xa7\\x16\\xd7\\x4b\\x46\\xb3\\x7b\\xc8\\x5a\\x70\\xdb\\xa3\\xdf\\xaa\\x16\\x75\\x21\\x7b\\x35\\x11\\x99\\xe7\\x4a\\x97\\x10\\x28\\xf7\\x29\\xb7\\xae\\x2b\\x74\\xae\\x8c\\x6b\\x3a\\x06\\x79\\xc3\\xe3\\x29\\x68\\x02\\x84\\x4a\\xd5\\xbb\\xa3\\x43\\xf6\\xf9\\xf7\\xc4\\x66\\x1b\\x4a\\x29\\xb4\\x4f\\x17\\xe8\\x9e\\x11\\x4f\\xb2\\x20\\xe9\\x84\\xcd\\x98\\x0e\\x94\\xc3\\xd2\\xbf\\x98\\x73\\xe0\\x60\\x5c\\x92\\x30\\x17\\x44\\xa3\\x03\\x5e\\xf0\\x46\\xba\\xd2\\x66\\x6b\\x5c\\x63\\xeb\\xec\\xf9\\x3c\\xc1\\x40\\x29\\x19\\x46\\xc0\\xfa\\x17\\x03\\x40\\xce\\x39\\x50\\x92\\xde\\xed\\x79\\x84\\x13\\x52\\xfb\\xfe\\xe0\\x3a\\x92\\x7e\\xb4\\x58\\xf2\\xa6\\x33\\xed\\x32\\x71\\x65\\x2f\\x5b\\x0f\\x99\\x60\\xcd\\xf9\\x01\\x5d\\x56\\xfd\\xab\\xd8\\x9e\\xe7\\x1e\\x25\\x9a\\xf6\\xeb\\x51\\x4b\\x4c\\x1b\\xd4\\xa6\\x66\\xf5\\xb5\\xa3\\x5c\\x90\\xf3\\x5b\\x14\\x94\\x57\\xaf\\x29\\x44\\xdd\\x0a\\xa8\\xd9\\xb5\\x42\\x28\\x3a\\x7e\\x54\\x12\\xb7\\x75\\xe4\\x21\\xd2\\x12\\x6f\\x89\\xbe\\xbc\\x3c\\xa3\\x7f\\x73\\x07\\x16\\x21\\xf1\\x32\\x1e\\xee\\x52\\xe9\\x69\\x04\\x86\\xa3\\x3c\\xd7\\xff\\x9c\\x99\\x67\\xfb\\x65\\xee\\x4e\\x90\\x7b\\x6b\\x85\\x22\\x11\\x47\\x3d\\x21\\xe9\\xd9\\x1a\\x93\\x36\\x2a\\xc7\\x61\\x76\\x0e\\x8c\\x7b\\xbe\\xa4\\x86\\xc3\\xd6\\x05\\xf9\\xe1\\x1b\\x86\\x13\\x68\\x19\\xa7\\xab\\x3f\\x32\\xf1\\x3f\\xfc\\xa1\\x68\\x17\\xfe\\xd1\\x97\\xff\\x88\\x0b\\x4d\\x6d\\x9a\\x80\\x8f\\x7f\\x87\\x87\\x63\\xa0\\x45\\x72\\x8d\\xf7\\x2f\\xaa\\xa9\\x63\\xe4\\xcb\\x1c\\x09\\xcc\\x2b\\x2d\\xa9\\x20\\x28\\x0c\\x83\\x66\\xb7\\xd1\\x8b\\xf8\\x97\\x2d\\xf1\\x6c\\xc2\\x34\\x48\\xfb\\xe6\\xb2\\xe6\\xe1\\x6c\\xbb\\xf0\\x74\\x51\\x29\\x85\\x40\\x53\\x18\\x96\\x37\\xce\\x11\\x5d\\x23\\x98\\x43\\x3c\\x15\\xd6\\xf1\\x16\\xa2\\x05\\x33\\x48\\x24\\xaf\\x28\\x2f\\xa7\\x58\\x49\\x4c\\x47\\x86\\x8e\\xa8\\xf4\\xdf\\xad\\xc7\\x05\\xe8\\x61\\xaa\\xd2\\xeb\\x8e\\xf3\\xdb\\xbe\\xd2\\xa4\\x56\\x9e\\x15\\x83\\x4a\\x76\\x0c\\xce\\x0c\\xbb\\xc8\\x4b\\x28\\x9e\\x77\\x9b\\x98\\x83\\x46\\xb9\\x06\\x9c\\x74\\x4c\\x97\\xab\\x2b\\xf4\\x2b\\x08\\x6d\\x2f\\xb0\\xa4\\x11\\xf5\\xce\\x99\\xf0\\x81\\x9a\\x30\\x86\\xb4\\xfe\\x9d\\x96\\xc7\\xc9\\x90\\x8d\\xce\\x28\\xdf\\x1d\\xdd\\x30\\xf3\\x50\\x1d\\xda\\xf7\\x81\\x10\\x73\\x4f\\x9d\\xcd\\xfe\\xc3\"},\n{{0xba,0xd4,0x7c,0xd4,0xbd,0x89,0x84,0x90,0x67,0xcc,0xe1,0xe6,0x3c,0x3d,0x91,0xe9,0xb7,0x87,0xae,0xa8,0x58,0x4e,0xdb,0x07,0xf3,0x45,0x1e,0xf6,0x7e,0x7b,0xd7,0x9b,},{0xab,0x0c,0xe9,0xba,0x1d,0x29,0xbd,0xfb,0x85,0xa0,0xe6,0x6b,0x76,0xb5,0xe2,0xe0,0x5f,0xf7,0x32,0x56,0x9e,0x43,0x75,0xcc,0xd7,0x50,0x98,0xe9,0xe7,0x1d,0x17,0xbf,},{0xe5,0x72,0x4a,0x1d,0xd4,0x63,0xa9,0x7d,0x12,0x22,0xc5,0x18,0xc4,0x92,0x5d,0x32,0x22,0x02,0xd1,0x0f,0x04,0xcd,0x07,0x8e,0x77,0x1e,0x0f,0xb3,0x95,0x1d,0xbc,0x14,0x93,0xa2,0x34,0x46,0x07,0x54,0xc3,0xaa,0xe3,0xdf,0x93,0x00,0x8d,0xbb,0xfb,0x31,0x0c,0x99,0x59,0x2b,0xed,0xe7,0x35,0xa4,0xae,0xab,0x03,0x23,0xa1,0x21,0x0d,0x0e,},\"\\xb5\\xa6\\x1e\\x19\\xe4\\x86\\x3e\\x0b\\xb5\\xf3\\xfa\\xb6\\xc4\\x97\\x0d\\x87\\x85\\x96\\x89\\x55\\x21\\xfa\\x1e\\x7f\\x67\\x8c\\xaf\\xa2\\xde\\x53\\x32\\x2f\\xd4\\x58\\xa9\\x8a\\xa6\\xe3\\x58\\x05\\x42\\x9f\\x65\\x12\\x91\\xb9\\x5b\\xd9\\x95\\x0e\\x15\\x5f\\x3a\\xda\\x0b\\x60\\x91\\x59\\xa4\\xab\\xda\\x59\\x90\\xc0\\x4b\\xc2\\xe7\\x64\\x42\\x2f\\xb4\\x9e\\xf4\\x2f\\x12\\x52\\x9f\\xf6\\xf6\\xa8\\x20\\x29\\xff\\x01\\x85\\x66\\x2e\\x65\\x8f\\x83\\xc5\\x46\\xee\\xd0\\x9f\\x06\\xb5\\xa6\\x8e\\x85\\x7c\\xda\\xd0\\xeb\\x9e\\xc4\\xee\\xcb\\xfd\\x88\\xf3\\x4b\\xc8\\x09\\x90\\xf8\\x64\\x4a\\x9b\\xfd\\xde\\x1d\\x9f\\x3a\\x90\\xd5\\x57\\xa8\\xb8\\x28\\xd5\\xce\\x06\\xa6\\x4e\\x3b\\x23\\x85\\x82\\xbb\\x4c\\xbe\\xba\\x30\\xed\\xc4\\x9e\\x81\\x22\\xc5\\x5e\\x95\\xba\\xdc\\xf5\\x02\\xcc\\x56\\x78\\x69\\xc0\\x9e\\x9f\\x46\\xc6\\xff\\x3f\\x68\\x78\\x98\\x6b\\x1d\\xe0\\x0b\\x72\\xa1\\x85\\x80\\x46\\xfc\\xd3\\xa6\\xe9\\xcd\\xaf\\x5b\\x07\\x3c\\x56\\xf2\\x02\\x50\\x63\\xa2\\xd1\\x78\\xbd\\x4c\\x1e\\x8c\\xbc\\x1e\\x6e\\x67\\x1a\\xa9\\x7f\\xb2\\xcb\\x4c\\xc8\\xa6\\x2c\\x20\\xbe\\x41\\xc7\\x76\\x37\\x2c\\x8e\\x7b\\xe6\\x3b\\x48\\x2e\\x6c\\x63\\xfa\\x85\\xd7\\xcf\\xfb\\xc1\\xb2\\x82\\x0b\\xae\\x1f\\xc1\\x28\\x34\\x3a\\x1e\\x20\\xfc\\xf1\\xbc\\x35\\x02\\xee\\xe8\\x13\\x58\\xcc\\x9a\\x74\\xc7\\x2a\\xf6\\x35\\x30\\xf9\\x6a\\x25\\xa6\\x04\\x64\\x8f\\xf5\\x70\\xdf\\x1e\\xb8\\x9d\\x1f\\xdd\\xba\\xb2\\x86\\x79\\xba\\x2e\\x9b\\x41\\x97\\x7e\\x9a\\x9c\\x1c\\xae\\xcd\\xbf\\xc3\\x61\\xa1\\xdd\\x05\\x5e\\xc5\\x16\\x20\\xa9\\xbb\\xdb\\xba\\xf7\\x18\\xc9\\xcc\\x13\\x6d\\x20\\x07\\x71\\x03\\x99\\x53\\x6d\\x13\\x33\\x24\\x85\\xec\\x38\\x87\\x97\\x85\\xe0\\xc9\\xce\\x99\\x15\\xa8\\x02\\x51\\x37\\x39\\x90\\xa5\\x9b\\xce\\x44\\x03\\x26\\x03\\x1a\\xb1\\xb4\\x58\\xbf\\xa5\\xb8\\xa4\\x79\\x3d\\xa4\\xee\\x11\\xab\\x7a\\xf2\\x0d\\xe2\\xa1\\x18\\xc9\\xae\\x52\\x1a\\x41\\x7b\\x68\\x20\\x7f\\xc8\\x85\\xe1\\x09\\xd8\\x46\\x3e\\x9f\\x02\\x27\\x87\\xcc\\x73\\x0d\\xb0\\xb1\\xfa\\xae\\xd2\\x57\\xbe\\xd9\\x01\\x71\\x08\\x85\\xb7\\x4e\\x99\\x4f\\x54\\xf6\\xf2\\xae\\xb6\\x4f\\x0f\\x60\\xb5\\x9e\\xfb\\xf2\\xe3\\xbb\\x65\\x15\\x42\\x46\\x03\\xa1\\x13\\xc0\\xb8\\xa3\\x1b\\xa3\\xc1\\xe9\\xa9\\xb8\\x11\\x8c\\x87\\xec\\x69\\x49\\xb7\\x5f\\x49\\x62\\x7e\\xa7\\xb1\\x32\\x88\\x89\\x39\\x11\\x04\\xd4\\xf4\\xa3\\x89\\x2c\\xf0\\x0f\\x26\\xa7\\x3c\\xda\\x2a\\x40\\xf9\\xb7\\x15\\x7a\\xfc\\x40\\x66\\x7f\\x4a\\x04\\xf6\\x47\\xdb\\xf9\\x39\\x06\\xb8\\x4c\\x9a\\x35\\x16\\x4e\\x1b\\xc9\\x02\"},\n{{0xca,0xba,0x8e,0x05,0x33,0x11,0x3a,0x4b,0xe1,0x73,0x40,0x8b,0xa8,0x3c,0x0d,0xb7,0x42,0x60,0x80,0x2f,0x91,0x86,0xc3,0x91,0x40,0x26,0x55,0xac,0xde,0x60,0x15,0xcb,},{0x2d,0x7b,0xef,0x61,0x64,0xc2,0x79,0xfa,0x10,0x28,0xa9,0x78,0x8e,0x3e,0x8e,0xe8,0xac,0x15,0xed,0xcf,0x92,0xa5,0x85,0x50,0x62,0x95,0x23,0x10,0xb4,0x68,0x45,0x47,},{0xec,0x35,0xec,0x32,0xc8,0xa4,0x00,0x88,0x27,0xe1,0x78,0x49,0x2b,0x3b,0x8b,0xee,0x22,0xa4,0x95,0x4f,0xc6,0xb2,0x5f,0x4f,0x22,0x5d,0xd7,0xed,0x23,0x69,0x89,0x00,0xde,0x81,0x56,0x75,0x6a,0x8e,0xdc,0x35,0xc5,0x1d,0x10,0xf8,0x2b,0x83,0x0a,0x2a,0x65,0x96,0x76,0xea,0xc9,0x11,0xf9,0x60,0x24,0x47,0x66,0xe0,0xc3,0xc6,0x07,0x05,},\"\\x24\\x13\\xa3\\x2b\\xca\\x5c\\xe6\\xe2\\x30\\xe5\\x65\\xeb\\x85\\x84\\x93\\xd5\\xd0\\x4e\\x6d\\x2e\\x2a\\x7a\\xb1\\xf8\\x9a\\x3b\\x42\\x33\\x11\\x67\\x6b\\xfa\\x93\\xc6\\x7d\\xaa\\xfd\\x1c\\xfc\\x71\\x09\\xe0\\x40\\xba\\xc5\\x2c\\xbf\\xe0\\x7c\\x28\\x28\\x0b\\xb6\\xac\\xf6\\xe3\\xa3\\x10\\x73\\xda\\xb2\\x96\\x53\\x78\\xdd\\x77\\xf6\\x1f\\xe9\\x24\\x71\\x35\\xc1\\xa6\\x31\\xb7\\x9a\\xd6\\x68\\xc9\\xea\\x1c\\xd4\\x11\\x2d\\x8d\\x3a\\x06\\x4c\\xc2\\x1d\\xf3\\x2a\\xea\\xc7\\xdd\\x71\\x8b\\x09\\x1f\\xb6\\x91\\x5b\\x8b\\xc0\\x63\\xbb\\x58\\x15\\xc3\\x76\\xe0\\x14\\x76\\x31\\x2a\\x2e\\x54\\x33\\x41\\x7a\\x7a\\x93\\x15\\xd6\\x59\\x99\\xb0\\x2f\\xf4\\x64\\xa4\\x74\\xa5\\x97\\xe5\\x39\\x88\\x77\\x36\\x70\\xec\\xa4\\x6a\\x6e\\x26\\xcf\\x96\\xe9\\x48\\x8e\\x9e\\x63\\x44\\xbc\\x78\\x3d\\xdf\\xb5\\x35\\xe7\\x6b\\xb3\\xb9\\xa6\\x03\\xff\\x4c\\x59\\xc7\\xdb\\xe2\\xd8\\xb6\\x19\\x8d\\x5b\\x24\\x49\\x0b\\x4e\\xa9\\x6c\\x95\\x95\\x9f\\xfb\\xf3\\xd8\\x21\\x8e\\x76\\x0d\\xaf\\x20\\xe0\\x1e\\x2f\\x36\\xc8\\x4b\\xb0\\x97\\x11\\x5a\\xbd\\xde\\xe9\\x2b\\xed\\x82\\xd1\\x6b\\x15\\xa9\\xe1\\x92\\xe9\\x89\\x3a\\xc6\\x38\\x46\\x1d\\xf5\\x07\\x20\\x7b\\x0c\\xf5\\x95\\x88\\x4d\\x8a\\x99\\xfb\\x9c\\x70\\x45\\xf9\\xbf\\xf7\\xb7\\x3f\\x00\\xca\\x3f\\xd5\\x95\\xa5\\xce\\xc2\\x92\\xad\\xb4\\x58\\xbd\\x94\\x63\\xbe\\x12\\x04\\xd0\\x16\\x78\\xd2\\xf4\\x38\\x9b\\x87\\x20\\x11\\x5f\\xa5\\x97\\xc4\\x02\\xb4\\xff\\x69\\x4b\\x71\\xce\\x4f\\x3d\\x33\\x0d\\x5e\\x2f\\x3c\\x3a\\xd6\\xd9\\x6a\\x9b\\x34\\x39\\x23\\x0f\\xc5\\x3a\\x44\\x79\\x4c\\xda\\x59\\x55\\x57\\xc4\\x06\\xca\\x15\\x89\\xbc\\x7b\\xe8\\x1e\\x2d\\x79\\x63\\x60\\x33\\x25\\x3f\\xa7\\xbd\\xd6\\x00\\xc6\\x7f\\xc5\\x59\\x36\\xbd\\x96\\xce\\x04\\x28\\xc3\\xeb\\x97\\xba\\xd1\\xde\\x0a\\x5f\\xbb\\x9b\\x67\\x51\\x57\\xde\\x5f\\x18\\xbc\\x62\\xa7\\xc2\\x2c\\x94\\x83\\xe2\\x80\\x2e\\x67\\x9b\\x5b\\x8f\\x89\\xdb\\x0f\\xc3\\x7f\\x7c\\x71\\x50\\xad\\x5a\\xc8\\x72\\x2c\\xeb\\x99\\x9b\\x24\\x35\\xe6\\x99\\x72\\x17\\x09\\x23\\x36\\xef\\x1c\\x8a\\x22\\x92\\xda\\xb9\\xa4\\x6f\\xf8\\xa9\\xe1\\x0d\\x33\\x55\\x76\\x5c\\xac\\x9d\\x65\\x98\\x77\\x0f\\x4f\\x01\\xea\\x63\\x91\\x25\\xfd\\x03\\x16\\x09\\xdd\\x1a\\x50\\x7d\\x96\\x28\\x0c\\x7d\\x01\\xa3\\xee\\x98\\x7e\\x9b\\x21\\x0e\\xc8\\x74\\x4c\\xd4\\x8c\\x74\\xf8\\xaf\\xee\\x96\\x1e\\x8e\\xf2\\x21\\xf8\\x26\\xa1\\xfe\\x6e\\x7d\\xf0\\xcb\\x15\\xad\\x7c\\x7e\\xf4\\xa9\\x1f\\x9d\\x0f\\x4c\\x2e\\x1b\\xde\\xa6\\x35\\xd2\\x75\\xfa\\xc8\\xc4\\xbc\\x06\\x01\\xf4\\x90\\xdb\\xdb\\xc7\\x34\"},\n{{0x9b,0xf3,0xfb,0xc7,0x30,0x8b,0x46,0xf6,0x03,0x6b,0xad,0xe0,0xc3,0xca,0x19,0x9f,0xac,0x66,0x2b,0x07,0xf1,0x03,0xbf,0x75,0x18,0x1d,0x52,0xba,0x6a,0x58,0xbe,0x05,},{0x2f,0x6a,0xc6,0xfc,0x33,0xbc,0x06,0x0c,0x1d,0xc3,0xcb,0x9d,0x1a,0x2b,0x91,0x15,0x84,0x5a,0xdd,0xb1,0x6c,0x4b,0x84,0xbe,0x37,0xed,0x33,0xad,0xb3,0xb3,0xd3,0xa8,},{0x0c,0x31,0x36,0xe0,0x1f,0x9b,0xcd,0x99,0xe1,0x0d,0x3d,0x12,0x4b,0x0c,0xdb,0x07,0x72,0xbe,0xc1,0x8a,0x86,0x4b,0xe8,0x1b,0xd1,0xda,0xa4,0x4d,0x81,0x8c,0x3d,0x47,0x0d,0xfa,0xa8,0xab,0x6e,0x9a,0x76,0x1c,0xf0,0x3f,0x93,0xef,0x9c,0xc7,0x82,0x91,0x09,0x6e,0xd6,0xd1,0x0c,0x08,0xfa,0x2f,0xba,0x3b,0xac,0x04,0xdd,0xe2,0x0f,0x0c,},\"\\xd6\\x5e\\x36\\xa6\\xa3\\x81\\x95\\xec\\xb9\\x1d\\xe3\\xc8\\x48\\xb5\\x1f\\x63\\x92\\x45\\xfa\\x2b\\xab\\xa8\\xa6\\xf8\\x59\\x47\\x15\\x9d\\xec\\x0e\\xd3\\xfa\\xe8\\x0c\\x5a\\x0f\\x8c\\x66\\xff\\x24\\x79\\x3c\\x89\\xc0\\xc6\\x87\\x54\\x3b\\xc6\\x33\\x54\\x7a\\x1f\\x37\\xf7\\x30\\xd9\\x70\\x12\\xeb\\xbd\\xc7\\xac\\x33\\x9c\\x48\\x90\\xc0\\x85\\x6b\\xbf\\xe2\\xba\\x29\\xb2\\x5a\\x7a\\xa6\\xb0\\x89\\xc0\\x33\\xfe\\xcb\\x76\\xdb\\x62\\xdd\\x3c\\x00\\xf6\\x42\\x1b\\x9e\\x76\\xdd\\x0e\\xa3\\x66\\xeb\\x2d\\x4a\\x05\\x2e\\xe6\\xcc\\x73\\x6e\\x38\\x19\\x19\\x1d\\x5a\\xd7\\xa6\\x6d\\x2b\\xe0\\x42\\xcc\\x65\\x39\\xe5\\xf3\\x56\\x52\\xb1\\x55\\xa7\\x27\\xf3\\x88\\x8d\\x93\\xf9\\x3a\\x91\\x02\\x59\\x8f\\x75\\x38\\xa9\\xab\\x7c\\x77\\x7e\\xec\\x79\\x42\\x6a\\x60\\x75\\xd6\\xf3\\x8d\\x64\\xc4\\x85\\x52\\x0f\\x64\\x13\\xff\\x4d\\x35\\x8a\\x8a\\x9c\\xbd\\xab\\x01\\xad\\xf4\\xdb\\x02\\xad\\xae\\xa2\\x64\\x94\\xd1\\xf5\\xd6\\x17\\x63\\x7f\\x27\\x7f\\x8b\\x0e\\x6e\\x7e\\x61\\xe2\\xee\\xcc\\xdd\\x33\\x7d\\xe2\\xba\\xf0\\xca\\x26\\x4c\\x14\\xc8\\xcb\\x83\\x68\\x00\\x0b\\x9c\\x71\\x43\\x85\\xf4\\x13\\x73\\x7d\\x68\\x16\\xe2\\x12\\xca\\xe2\\xae\\xcf\\xff\\xc3\\x2f\\xd1\\x6d\\x46\\xc3\\xec\\xee\\x6a\\xb0\\x74\\xc0\\xd7\\x68\\xbd\\xfe\\x99\\xb8\\x6c\\xbb\\xc8\\xdf\\x9c\\x47\\xcd\\x58\\x6d\\x46\\x58\\x71\\x26\\x8d\\x4a\\x9d\\x1c\\x87\\x72\\x36\\xab\\x78\\xf8\\x85\\x9c\\x11\\x4e\\x25\\x1c\\xab\\xc4\\xbe\\x0f\\x8b\\xc2\\x5d\\x14\\x8c\\x5f\\x54\\x3e\\x29\\x07\\x45\\xd1\\x18\\x03\\xe4\\x9f\\x5b\\x53\\x19\\x3f\\xe3\\x99\\x69\\xc0\\x39\\xb3\\xf2\\x49\\xb3\\x2f\\x2b\\x85\\x98\\xb6\\xac\\xf4\\xed\\x64\\xd5\\x75\\x2b\\xb7\\x72\\xff\\x4e\\xe0\\x0c\\xe0\\xf8\\x5e\\xcb\\xb4\\xcf\\xc4\\xce\\x07\\xda\\xf2\\x80\\x98\\x68\\xc2\\x90\\x3b\\x78\\x1e\\x12\\xa2\\x74\\x10\\x5f\\x06\\x18\\x10\\x29\\xe4\\x7f\\x2b\\xfb\\x21\\xf4\\x94\\x80\\xaa\\x1e\\x44\\x47\\x15\\xc0\\xb9\\xff\\x07\\xea\\xd8\\x89\\x75\\xd9\\x35\\x85\\xd2\\xff\\x42\\x48\\x32\\xa9\\x78\\x3d\\x94\\x90\\x6a\\x60\\xf8\\x77\\xae\\x1c\\x85\\xff\\x15\\x31\\x7b\\xad\\xca\\x1e\\x61\\x31\\x74\\x33\\xc7\\xce\\x96\\x27\\x9b\\x67\\x8e\\xc9\\xd1\\x74\\xdd\\x08\\x70\\x08\\x0b\\x23\\x41\\x54\\xf6\\x26\\xa5\\x34\\x62\\xcf\\xd5\\x47\\x84\\x2e\\xab\\x87\\x05\\x60\\x5b\\x8e\\xe8\\x85\\x72\\x9e\\xe7\\x8d\\x18\\x33\\xaa\\x43\\xf5\\x5a\\xc2\\x27\\x31\\x98\\x9f\\xde\\xda\\x7d\\xc5\\xfa\\x9c\\x01\\x98\\x5f\\x26\\x61\\xe6\\xc7\\x32\\x6d\\x34\\x6e\\x6d\\xb2\\x7e\\x6f\\x92\\x1f\\xae\\x7c\\x93\\xa2\\x17\\x0e\\x10\\xdd\\x0c\\x46\\x0b\\xdc\"},\n{{0x64,0xe8,0x93,0x04,0xa3,0x35,0xe9,0x03,0xcb,0x36,0xc0,0xbd,0xf1,0xa6,0x41,0x2e,0xf3,0x68,0x46,0x80,0x06,0xb7,0x3d,0x3d,0x2d,0x61,0xcb,0x03,0x0c,0xc5,0xf8,0xd1,},{0xa1,0x80,0xef,0x3a,0x66,0x1c,0x3c,0x47,0x9d,0x5f,0x69,0x80,0x7c,0x90,0x27,0x48,0xe3,0x5e,0x7f,0x72,0x51,0x21,0xe3,0x7a,0x5d,0x91,0xb8,0xbe,0xc8,0x8d,0x83,0xa6,},{0x92,0xeb,0x44,0x54,0x81,0x40,0x01,0xec,0xfc,0x18,0x02,0x5d,0x64,0x21,0xf6,0x46,0x45,0xa5,0xbc,0xbb,0x5c,0xb8,0xfd,0x85,0xc1,0x4d,0x77,0x26,0x17,0xc5,0x03,0xe8,0xbe,0x7d,0x3b,0xcf,0x11,0x7f,0x5e,0x68,0x01,0xd1,0xc3,0xb9,0x6f,0x90,0x90,0xa6,0x6d,0xdc,0x67,0xf8,0xcf,0x8f,0xf0,0xf1,0xc1,0x25,0xb1,0x6b,0x15,0xe2,0xce,0x07,},\"\\x2f\\x51\\x07\\x4d\\x98\\x1b\\xda\\xfa\\xfb\\x02\\xa4\\x0f\\xe8\\x26\\xc4\\x5f\\x31\\x71\\xc1\\xb3\\x18\\x4d\\x8c\\x26\\x0b\\x82\\xb8\\x41\\x1f\\xc6\\x25\\xcb\\x02\\xcc\\xfe\\x75\\x5d\\xc2\\x9d\\xc7\\x89\\x5b\\xf7\\x59\\xe6\\x1b\\x24\\x50\\xda\\x1a\\x65\\x6a\\x38\\xd4\\xf7\\x0d\\x2e\\xe7\\x48\\xc5\\x18\\xc6\\x42\\x03\\x06\\xe5\\xf0\\x1e\\xc7\\xa0\\xff\\xe0\\xe9\\xdc\\xeb\\x93\\xf6\\xc0\\x77\\xb1\\x26\\x62\\x88\\x15\\x84\\xf9\\x8c\\xe6\\xab\\x94\\x5f\\x87\\xfc\\x6d\\x12\\x3c\\x45\\xd6\\xcd\\xfd\\x82\\x37\\xa1\\xce\\x36\\x35\\xb6\\x23\\xa7\\x9d\\x02\\x0d\\xf4\\x4c\\x74\\xb8\\x9a\\xc1\\x4a\\x32\\x1f\\xbf\\x33\\xa8\\xc0\\xa2\\x55\\x9f\\xea\\x1c\\x2b\\x15\\x60\\x76\\xb8\\x13\\x90\\x8f\\x84\\x2e\\xbe\\x4c\\x2b\\x94\\x90\\x89\\xe5\\x2b\\x1a\\xe4\\x0d\\xc6\\xe4\\xb2\\xab\\xbc\\x43\\x9a\\x0b\\xf7\\x23\\x69\\x67\\x9a\\xab\\x6f\\x4c\\x00\\x01\\x8b\\xe1\\x47\\xf7\\xc0\\xa6\\x7b\\x96\\x79\\xee\\x88\\xa5\\x38\\x19\\xc4\\x9f\\x7b\\x67\\x5e\\x30\\xa8\\xb5\\xaf\\x39\\x66\\x1e\\xe8\\xdb\\x21\\x01\\x04\\x11\\x29\\x49\\x68\\xf8\\x8e\\x5d\\x60\\x4d\\x0d\\x88\\xd7\\x6a\\x7e\\x48\\x64\\xfa\\xd3\\xa5\\x6f\\x5f\\x62\\x4b\\xa1\\xb3\\x4e\\xa9\\xcb\\x72\\x08\\x50\\xaa\\xd3\\xbd\\x4f\\x0a\\x88\\x2a\\x7d\\x25\\xfb\\xec\\x2b\\xb7\\xca\\x86\\xda\\x61\\x6d\\xa9\\x6c\\x15\\x62\\xc6\\xd6\\xa1\\xab\\xcc\\x64\\x1e\\x1b\\x58\\xb2\\xc1\\x78\\xe1\\xc3\\xbc\\x8a\\x3b\\x36\\xec\\x9e\\x14\\x4d\\xd2\\xe7\\x5b\\x0b\\xc8\\xc0\\x8c\\xcb\\x0d\\x6e\\x34\\x27\\xb0\\x32\\x2b\\x3d\\x6a\\xb9\\x3f\\x3f\\x60\\xb9\\xcc\\x5b\\x61\\xda\\xd0\\x23\\x85\\xa1\\x49\\x49\\xf9\\xb8\\x7a\\x8e\\x3a\\xf1\\xe0\\xe0\\xfa\\xb7\\xa9\\xa9\\x28\\xc7\\x53\\xfc\\x61\\x10\\x44\\x4a\\xf7\\xcc\\xaf\\x80\\x27\\xed\\x64\\x1b\\x9e\\xd8\\x7f\\xa5\\xd8\\xe1\\xf7\\x6c\\xae\\x46\\x5d\\x57\\xa7\\x0d\\xad\\x9e\\xbf\\xdd\\x3c\\xe7\\x57\\x6a\\xc4\\xde\\x89\\xd9\\x8f\\x42\\xe2\\x82\\xad\\x87\\xad\\x6a\\x50\\x42\\x57\\x7c\\xbb\\xbc\\x4d\\x95\\x1e\\x2a\\x86\\x76\\xfe\\xdc\\x8c\\xb1\\xb1\\xbd\\xf7\\x6c\\x3a\\x38\\x84\\x63\\x85\\xa8\\x5a\\xa2\\x47\\x06\\xc2\\x0a\\x8b\\x38\\x46\\x5f\\xe2\\xae\\x0e\\x41\\xf7\\x8e\\x61\\x4b\\x8e\\x96\\x42\\xfe\\x24\\x71\\xa9\\x01\\x57\\x47\\xdb\\x97\\x6e\\x0c\\x78\\x48\\xc2\\x3f\\xf3\\xf4\\x17\\xcb\\x05\\xa8\\xd5\\xef\\x40\\x13\\x0a\\xdf\\x85\\x5c\\x99\\x8a\\x62\\x10\\x4d\\x7e\\x2f\\xb7\\xc0\\xf9\\xaa\\x2a\\x49\\x60\\x75\\x62\\x3c\\xed\\x2c\\x0f\\x7e\\xec\\x10\\x14\\x7f\\xf9\\x60\\x8a\\x8a\\x04\\x2e\\xf9\\x81\\x17\\x45\\x9b\\x93\\x83\\x7f\\xd1\\xb8\\xd5\\xef\\x03\\x97\\x8e\\xad\\xa7\\x4c\\xac\"},\n{{0x6f,0x63,0x43,0x87,0xca,0x2c,0x0c,0xb1,0x67,0xa7,0x40,0xd6,0xaf,0xd8,0x9e,0x2a,0x28,0xf5,0x30,0x71,0x84,0xe8,0x1c,0xba,0x3c,0x03,0x70,0x46,0xa5,0xed,0xe2,0x3c,},{0x01,0x1f,0x2a,0x9a,0x11,0x1c,0x38,0xf3,0x49,0x0c,0xad,0x16,0x85,0xbe,0x78,0xec,0xee,0xdc,0x6f,0xac,0x4a,0x32,0x21,0x30,0x1c,0x69,0xc8,0x4b,0x1e,0xc7,0xb3,0xa7,},{0xfd,0x17,0xc6,0x18,0xcd,0xbb,0x5d,0x45,0x9e,0xa2,0xac,0xa8,0x86,0xf0,0x51,0x2c,0x62,0x32,0x51,0x28,0x4a,0xae,0x3a,0x83,0xeb,0x5d,0x7f,0x60,0xda,0x1d,0x9b,0x2b,0xa0,0x83,0xc4,0x55,0xa5,0xe2,0x58,0x3a,0x3c,0xba,0x73,0x6e,0x7b,0x96,0x1b,0xa1,0x9c,0x1c,0xc8,0xdd,0x90,0x74,0x5d,0xa8,0x2a,0x15,0xdf,0xc6,0x62,0xe8,0xe1,0x0d,},\"\\x86\\x5c\\x20\\xa9\\x4a\\xc3\\xf2\\xe3\\xbd\\x5c\\xb8\\x5b\\xec\\x9d\\x33\\x72\\x66\\x71\\xfe\\x01\\xf9\\xc5\\x37\\x01\\x7d\\x59\\xc8\\xd5\\x10\\x6e\\x43\\x36\\x0b\\xf7\\x6f\\xc0\\x61\\x86\\x70\\x59\\x80\\xc8\\xa8\\x7b\\xa3\\x63\\x3a\\x4a\\x17\\x04\\x26\\xec\\xc0\\xde\\xfb\\x6d\\xb2\\x67\\x0f\\x5f\\x59\\x25\\x33\\x77\\x4c\\xda\\x50\\x05\\x2a\\xe5\\x97\\xd4\\x8d\\xea\\xcc\\x26\\x37\\x06\\x3b\\xfd\\x51\\x9f\\x2e\\x79\\xba\\xc8\\x17\\x75\\xbe\\xcc\\xb1\\xab\\x2f\\x5b\\x39\\x71\\x2e\\x2e\\x82\\x94\\x69\\xb7\\x5a\\x2d\\x2d\\xbd\\x08\\xaa\\x6d\\x24\\x72\\x34\\x04\\xb2\\x5e\\xb9\\x48\\xa4\\x83\\x4c\\x55\\x24\\x6c\\x80\\x79\\xa8\\x2e\\xc6\\x43\\x54\\xe8\\xc2\\x38\\x8f\\x8c\\x5a\\x61\\x6b\\x3c\\xdc\\x37\\x1e\\x62\\x63\\xfa\\xbc\\x9f\\x60\\x99\\x21\\x9e\\x86\\x15\\x85\\xfe\\x82\\xa6\\x7d\\x61\\x0d\\xd1\\xeb\\x5c\\x81\\xc9\\x6b\\x5c\\xb3\\x54\\xa6\\x89\\xfd\\x8a\\xac\\x8d\\xb7\\x6c\\x43\\x3f\\x0c\\xb0\\xb3\\x1c\\xf1\\xd8\\x55\\xb6\\xa3\\x0a\\x3d\\x2a\\x21\\x2e\\x9b\\x4f\\x7d\\x7a\\xfe\\x61\\x99\\x51\\xf9\\x8d\\x2f\\x1b\\xa2\\xc1\\x01\\x08\\x5b\\xa8\\x1f\\x49\\xb3\\x60\\x37\\xcd\\x64\\x57\\xa7\\xea\\xa8\\xf4\\xf3\\xbe\\xdf\\x68\\xd0\\x9f\\xc9\\xfa\\x25\\xa9\\xd7\\x54\\xdb\\x65\\x36\\x02\\x85\\x41\\x2d\\x1a\\x6d\\xa5\\x37\\x88\\x90\\x5f\\xcf\\x4e\\xfa\\x8a\\x80\\xcd\\x86\\xca\\x48\\xb8\\x45\\x63\\x3d\\x8c\\x31\\xc2\\xae\\x06\\xf1\\x6c\\x4c\\x6b\\xbb\\xe9\\xcd\\x1a\\xfb\\x59\\xe1\\x01\\xbe\\x50\\xe0\\x35\\x35\\xdd\\x8a\\x65\\xe4\\x5b\\xba\\x46\\xd4\\x5c\\xb1\\x4b\\xad\\xfc\\x8e\\x93\\xab\\x52\\x67\\xf4\\xe4\\x92\\xab\\x1f\\x9a\\x95\\xe6\\x1f\\xca\\xb8\\x1c\\xbf\\x2b\\xd8\\x67\\xa3\\xec\\x7b\\x4b\\xaa\\x18\\x9a\\x0f\\x08\\x56\\x70\\x75\\x59\\x61\\x29\\xdc\\xf9\\xff\\x1c\\x50\\x2d\\x32\\x79\\xe8\\xaa\\x6c\\xe5\\x6e\\xaf\\x13\\x45\\x82\\xa9\\xe4\\x30\\xa5\\xaa\\x8c\\xa1\\x0c\\x3d\\xa8\\xbc\\x79\\x3d\\x02\\x56\\xad\\x19\\xae\\xa7\\x14\\x9f\\x0e\\xa7\\xea\\x95\\xfa\\xcf\\xac\\x1c\\x5c\\xfd\\x29\\xd7\\xa3\\xfe\\x1a\\x41\\x79\\x75\\x73\\x9e\\x14\\xda\\x8e\\xdc\\x81\\x99\\x00\\x47\\x2c\\xa8\\xc6\\x97\\x16\\x32\\x8e\\x8a\\x29\\x9f\\x97\\x4e\\xdf\\xf7\\x41\\xaa\\xbc\\x1c\\x07\\x4a\\x76\\x1b\\x3e\\xc8\\x76\\x1d\\xda\\x2e\\x7e\\xed\\x7a\\xf3\\x3e\\xf0\\x04\\x09\\x84\\x9d\\x41\\x54\\x97\\xc5\\xed\\x5d\\xfa\\xa2\\x25\\x9a\\x31\\xd0\\x76\\x39\\x81\\x70\\xb2\\xd9\\xd2\\x10\\x20\\x8b\\x4a\\x4c\\x7d\\xb8\\xc6\\x26\\xd1\\xc5\\x33\\x56\\x2a\\x1f\\x95\\x48\\x9f\\x98\\x19\\xe4\\x98\\x5f\\xc4\\xe1\\xd1\\xa7\\x07\\xbe\\x5e\\x82\\xb0\\x05\\x48\\x1d\\x86\\x37\\x7f\\x42\\x4e\"},\n{{0x4b,0x2e,0x1a,0xe6,0x0f,0xa5,0xd3,0x83,0xba,0xba,0x54,0xed,0xc1,0x68,0xb9,0xb0,0x5e,0x0d,0x05,0xee,0x9c,0x18,0x13,0x21,0xdb,0xfd,0xdd,0x19,0x83,0x95,0x91,0x54,},{0x36,0xc0,0x20,0xb1,0x85,0x52,0x34,0x56,0x19,0xef,0x88,0x37,0xeb,0x8d,0x54,0x94,0x84,0x0e,0x85,0xf4,0x68,0x09,0x34,0x3b,0x4d,0x6f,0x40,0x61,0x25,0xda,0x55,0x7d,},{0x22,0x20,0x11,0x9e,0x83,0xd6,0x9a,0x6a,0x3e,0xed,0x95,0xfa,0x16,0x6d,0x1d,0x11,0x28,0xa3,0xf2,0x32,0xca,0x1b,0x78,0xbc,0x94,0xb4,0xd4,0x76,0xc4,0x77,0x94,0x43,0x61,0x4b,0x87,0x72,0xaa,0x22,0x32,0xcb,0x07,0x20,0xa0,0x55,0xeb,0x71,0xd8,0x40,0x7f,0x3a,0xb1,0x9b,0xaa,0x1d,0x96,0x2c,0x05,0x2c,0x84,0xc0,0xbd,0x58,0x96,0x08,},\"\\xfa\\xb9\\x8b\\x2b\\xbf\\x86\\xae\\xb0\\x50\\x86\\x81\\x2a\\x4b\\x00\\x49\\xa1\\x04\\x2a\\xbb\\x76\\xdf\\x9c\\xd2\\x90\\x87\\x55\\x70\\x63\\x03\\xef\\xed\\xb1\\xad\\x21\\xe8\\xbc\\x8d\\x75\\x62\\x34\\x9e\\x1e\\x98\\xce\\x0d\\x75\\x2f\\x4b\\x3d\\x99\\xe6\\x77\\x36\\x8b\\xd0\\x8c\\x78\\xfe\\x74\\x25\\xec\\x3b\\x56\\x0e\\x38\\x3b\\xd4\\x2a\\xf6\\x49\\x98\\x86\\xc3\\x5a\\xdd\\x80\\xa5\\x82\\x8b\\x61\\xd6\\x64\\x4d\\x7d\\xc4\\x43\\xba\\x2c\\x06\\xf9\\xba\\xd2\\xec\\xcb\\x98\\x3d\\x24\\x45\\x8f\\x6a\\xda\\x1b\\x10\\xbb\\x5b\\x77\\x17\\x2c\\x5c\\xdd\\x56\\xd2\\x73\\xd1\\xe4\\x10\\x10\\xb2\\x5c\\xf4\\x8a\\x7d\\x58\\xd7\\x25\\x57\\x02\\xac\\x12\\xf2\\xa6\\xfe\\x29\\x18\\x46\\x63\\x95\\xf4\\x60\\xd1\\x52\\x36\\xd0\\x35\\xae\\x94\\x10\\xca\\x86\\xc4\\x60\\x51\\x28\\x29\\x9f\\xaa\\xf0\\x90\\x15\\xf1\\xad\\xee\\x77\\x68\\xee\\x1a\\x8f\\x8c\\xa0\\x6d\\x10\\xdd\\x7f\\x95\\xc4\\x6f\\xa1\\x02\\x53\\x06\\x5f\\x9d\\x6f\\x90\\x29\\x59\\x08\\x80\\x9f\\xd7\\x79\\x57\\x1b\\xe2\\x9e\\x0a\\xe6\\x6e\\x0b\\xcb\\xde\\xb7\\x91\\x3d\\x2b\\xbb\\x76\\xac\\x30\\x2f\\x34\\x52\\xc5\\x5e\\xf1\\x99\\xa4\\x8e\\xce\\xb0\\xe3\\x59\\x6c\\x7b\\x4c\\x03\\x86\\xda\\xe7\\x10\\x1e\\xa2\\x44\\xa3\\x3c\\x4c\\xdc\\x83\\x06\\x72\\xdf\\x83\\x65\\x5b\\x35\\x33\\x80\\x52\\x30\\x7b\\x94\\xd2\\x23\\xca\\xb1\\xaf\\x69\\xe0\\x7f\\x78\\xe5\\x8c\\xbb\\x0c\\xb3\\xc5\\x35\\x1e\\x3a\\x6b\\x0c\\x4a\\x92\\x7f\\x75\\x62\\xc5\\x98\\xd2\\xd3\\xdf\\x90\\x56\\x9f\\x61\\xdb\\x1a\\x3c\\xb0\\x14\\x0b\\x56\\xea\\x02\\xcf\\x77\\x45\\xfb\\xee\\xc2\\x02\\x86\\x73\\xd6\\x7f\\x1e\\xc5\\xf7\\xda\\xf9\\x71\\x5f\\x75\\x4a\\x9d\\x8e\\xd4\\x6a\\x7a\\x63\\xef\\x72\\x2e\\xe0\\xd5\\x89\\x93\\x31\\xb6\\x3c\\x97\\x4f\\xa8\\x80\\x42\\x94\\x35\\x76\\x7f\\x96\\x25\\x4e\\xf4\\x6c\\x99\\x68\\xf3\\xfe\\xda\\xaf\\xea\\xf3\\xe8\\xf4\\x56\\x34\\xb5\\x4f\\x5e\\x0a\\x5f\\xc2\\xd2\\x37\\x3a\\xb9\\xe9\\x8d\\x9a\\xcf\\xe3\\x69\\x7e\\x64\\x2a\\x18\\xe0\\xdf\\xd9\\xfb\\xc2\\xf0\\x94\\x86\\x6d\\x40\\x1f\\x0a\\x4c\\xa2\\xa4\\x56\\xed\\xf6\\xa1\\xa7\\x7b\\x9c\\x29\\x6c\\x39\\x22\\x06\\x7e\\xb3\\xd5\\xa5\\xca\\x0a\\x77\\xf4\\x30\\xe4\\xc8\\x61\\x1d\\x8f\\x05\\xa1\\xba\\xac\\x16\\x35\\xef\\x7b\\xa8\\x3d\\xfc\\x69\\xd3\\x01\\x94\\x98\\x56\\xbe\\x4d\\x2c\\x8a\\xb6\\x1d\\xe2\\x9c\\xf3\\x92\\x50\\xc5\\x79\\x4c\\xbf\\x57\\x50\\xcd\\xa9\\x5d\\x04\\x68\\xaf\\xa2\\xb7\\xf2\\x3d\\xba\\x4e\\xf5\\xf5\\x29\\x5a\\x3b\\xf4\\x14\\x00\\x18\\xb7\\xed\\x06\\x18\\x84\\x44\\x4f\\x5b\\xb1\\xb7\\xd2\\x39\\x31\\x2d\\xd7\\x39\\x99\\x95\\x36\\xc6\\x84\\x45\\x6e\\xa0\\x6b\"},\n{{0xb2,0x16,0xce,0xbf,0x87,0x80,0x24,0xc2,0x0d,0xfc,0x86,0xce,0x4b,0x37,0xbd,0xc4,0x7a,0xa2,0x8f,0x29,0x20,0x3b,0x5b,0x44,0x92,0x50,0x65,0xd9,0x93,0xa2,0x59,0xfe,},{0xc3,0x6e,0xdb,0xb6,0x25,0x4a,0x91,0x3f,0x08,0xfe,0x25,0x9e,0x23,0x87,0x80,0x63,0x8f,0x72,0xec,0x0b,0x30,0x07,0x26,0x4b,0xcc,0x60,0xa9,0xe8,0x1e,0xe9,0x29,0x8f,},{0xb7,0x38,0x9e,0xe7,0x8d,0xd9,0x76,0x3f,0x9d,0x28,0x92,0x91,0x2e,0xdc,0xbe,0x3e,0x8a,0x23,0x6b,0x8b,0xdc,0x25,0xf4,0x4b,0x9c,0xfd,0xc8,0xc4,0x7c,0xd5,0x81,0x68,0xab,0x56,0xeb,0x04,0x02,0xa5,0xbd,0x75,0x2a,0xc8,0xf4,0x97,0x8d,0x2e,0xa2,0xb6,0x5d,0x2f,0xa8,0x52,0x65,0x96,0x6b,0x9f,0x57,0x22,0x7e,0xf4,0xa5,0x9a,0xe0,0x09,},\"\\x9c\\x87\\x17\\xcc\\x86\\xfe\\x02\\x48\\x0b\\xfd\\x9e\\x92\\x2b\\xd7\\x6b\\xff\\xee\\x21\\x70\\xc4\\xcb\\x1b\\x13\\xdf\\x83\\x4a\\xc0\\x1d\\x45\\x00\\x60\\x86\\x29\\x7f\\x1b\\x8a\\x26\\xf2\\xba\\x67\\x4d\\x33\\xe1\\xd1\\x62\\xf1\\x93\\x67\\xfe\\xba\\x97\\x35\\x2b\\x7d\\xf2\\xe7\\x5b\\x30\\x9d\\x4b\\x6f\\x8b\\x07\\xcc\\x0e\\xb6\\x77\\x7e\\x81\\xe2\\x68\\xe0\\x2d\\x07\\xf2\\xa0\\x8f\\x8f\\x39\\xd5\\xa8\\x32\\x0b\\xfc\\x01\\xfc\\x8c\\x92\\x27\\xd2\\xcf\\x05\\xe1\\x28\\x91\\xff\\x4d\\xe8\\x85\\xa1\\xc9\\x33\\x71\\xa0\\x91\\x0b\\xa5\\x33\\x92\\xaf\\xf9\\xba\\x2e\\xed\\x9a\\x20\\x55\\x97\\x7e\\xc4\\x15\\x7b\\xd6\\x5b\\x34\\xdf\\x79\\x37\\x2f\\x4d\\x50\\xed\\xbc\\x48\\x92\\x43\\x53\\xcf\\xa1\\x69\\x23\\x19\\xd8\\x8a\\x7a\\x5b\\xb7\\x26\\x25\\x4c\\x20\\x92\\x91\\xe9\\xb1\\xd2\\xc1\\xa6\\xc8\\x23\\x63\\x98\\x10\\x9c\\x59\\xed\\x42\\xa0\\xac\\x9e\\x76\\x33\\xc5\\x20\\x73\\x4e\\xcc\\xfe\\xa4\\xfe\\xa9\\x5a\\x47\\xa8\\xf0\\xa0\\x68\\xb4\\x27\\x50\\x00\\x43\\x9c\\xc9\\x7c\\x57\\x87\\x1e\\x10\\x5c\\xc0\\x79\\x0e\\x9d\\xcc\\x9c\\x25\\xd5\\xaf\\x70\\x63\\xff\\xd0\\x5c\\x4f\\x37\\x80\\xe7\\xbc\\xa4\\xc4\\x56\\xd0\\x17\\x0d\\xa7\\x09\\xfc\\x6c\\xb3\\xfa\\xa7\\x2b\\xdc\\xf5\\x62\\x90\\x8a\\xe9\\x34\\x0a\\xef\\x4d\\x0c\\x8b\\x91\\xf0\\xfb\\xcc\\xbc\\xf1\\xcd\\x89\\x8b\\x1c\\x71\\x6f\\x4f\\x14\\x74\\xc3\\xaa\\x31\\x62\\x42\\xab\\xdf\\x63\\x68\\xe5\\x7a\\x24\\x7f\\xf2\\xfd\\x5c\\xe2\\x3d\\x18\\x7f\\x69\\x4f\\x11\\xe3\\x8d\\xfb\\xfb\\xc3\\xd9\\xdb\\x20\\x90\\x3b\\x4e\\xbb\\x44\\x9b\\x90\\x49\\xee\\x02\\x0f\\x6e\\x2f\\x50\\x8e\\x8b\\x2b\\x16\\x5b\\xad\\x74\\x64\\xdb\\xdd\\x17\\x8c\\xbd\\x42\\x32\\x33\\x76\\x5d\\x37\\x1e\\x7a\\xe1\\xc3\\xe8\\x78\\xcd\\xb5\\xb8\\x24\\xb2\\x0c\\xb3\\x09\\x86\\x7c\\x0e\\x47\\x3c\\x06\\x7e\\x67\\x44\\x00\\x85\\x27\\xb6\\xbc\\x07\\x6d\\x07\\x7f\\x48\\x67\\x62\\x2a\\xee\\xd1\\xc2\\x53\\xdb\\xde\\x7c\\x6a\\x76\\xc7\\x01\\x59\\x62\\xfb\\x73\\x39\\x16\\x98\\x60\\x0b\\xb3\\x18\\xff\\xa7\\xb0\\x13\\x6e\\xe4\\xcc\\xb0\\x7d\\xaa\\xf0\\x1f\\x40\\xff\\x9c\\x19\\x4f\\x98\\x68\\x1f\\x9f\\xae\\xf8\\xb6\\xf9\\xe9\\x9f\\x95\\xdf\\x00\\x80\\xda\\x89\\x66\\xa8\\xba\\x7a\\x94\\x74\\xc5\\x37\\xb9\\x2d\\xf9\\x79\\x9e\\x2f\\xd1\\x6f\\x78\\x8d\\xad\\x7a\\x7b\\xcc\\x74\\x52\\x26\\xe1\\xe6\\x37\\x1f\\x52\\xeb\\xcd\\xbd\\x14\\x40\\x44\\xdd\\xfe\\x63\\x2d\\xfc\\x0a\\x43\\xd3\\xa4\\x50\\x92\\x31\\x70\\xeb\\xc7\\xae\\x21\\x9e\\x50\\xe0\\x78\\xa5\\x11\\xbc\\x12\\xef\\x14\\xcd\\x14\\xb5\\x30\\x9f\\x38\\xab\\xd6\\x5d\\xb2\\xb2\\xa7\\xaf\\x22\\x43\\xb2\\x29\\xc9\\xfd\\x2e\"},\n{{0xaf,0xce,0xce,0xa9,0x24,0x39,0xe4,0x4a,0x43,0xed,0x61,0xb6,0x73,0x04,0x3d,0xcb,0xc4,0xe3,0x60,0xf2,0xf3,0x0c,0xd0,0x78,0x96,0xcd,0xa2,0x0c,0xb9,0x88,0xd4,0xe3,},{0xd2,0x31,0xf6,0x92,0x35,0xa2,0xe3,0xa1,0xdd,0x5f,0x6c,0x2a,0x9a,0xaf,0x20,0xc0,0x34,0x54,0xb9,0xa2,0x9f,0x4e,0x3a,0x29,0xab,0x94,0x68,0x9d,0x0d,0x72,0x3e,0x50,},{0xa6,0x55,0x45,0xcf,0x3d,0xf4,0x56,0xb2,0x8d,0x83,0xa6,0xd9,0x4c,0x03,0x6a,0x19,0xd0,0xd2,0x9f,0xb0,0x65,0xed,0xc2,0x7e,0x5e,0x93,0xa1,0xf4,0x02,0x79,0x89,0x7e,0x1c,0x6f,0x25,0x95,0x9a,0x72,0x5a,0xba,0xbc,0x87,0xcf,0x2a,0xe7,0x27,0xf3,0x46,0x7b,0x79,0x57,0x0e,0x90,0x27,0x11,0x91,0x71,0x91,0xd9,0xcb,0x0d,0x2d,0x66,0x0c,},\"\\x0b\\x05\\xf8\\x9e\\xbb\\x33\\x97\\x94\\x76\\x87\\xaf\\xbe\\xf0\\xed\\xe8\\x7c\\xf3\\x81\\x06\\x76\\x27\\x70\\x37\\x52\\x1d\\x95\\x2a\\x3b\\xbb\\xbd\\xc8\\x56\\x59\\x88\\xa0\\x95\\xd8\\xd4\\xf6\\xf5\\x9b\\xe5\\x72\\xd3\\xd8\\x21\\xdd\\x78\\x99\\x77\\xef\\x77\\xa2\\xfd\\x71\\x10\\xce\\xee\\xd9\\xf3\\x75\\x6e\\xd8\\xe1\\x88\\x26\\x7b\\x97\\xa3\\x0e\\xf8\\x95\\x7c\\x78\\xae\\xa3\\xa2\\x96\\x3d\\xec\\xa6\\x18\\x60\\x54\\x5e\\x0c\\x40\\x82\\x48\\x81\\xeb\\xb1\\xdb\\x10\\xf6\\x07\\xe1\\x0d\\xdb\\xdd\\xce\\x40\\x0e\\xa2\\x36\\xba\\x47\\x45\\xaa\\x99\\xa0\\x56\\x41\\x97\\x67\\x66\\x78\\x9e\\xd0\\xda\\x7d\\xb5\\x5f\\xda\\xb4\\x59\\xeb\\xd4\\xb4\\x41\\xa6\\x28\\x2f\\x7c\\xfd\\x5a\\x20\\xea\\x06\\xef\\xfa\\x33\\x59\\x55\\xe5\\xfd\\x29\\x18\\x16\\x71\\xbc\\x92\\xc0\\x00\\x52\\xf7\\xf7\\x5c\\x39\\x27\\x7c\\x9a\\x43\\xb7\\x87\\xac\\x9f\\xb1\\x51\\x6e\\x99\\x62\\x32\\xa5\\x09\\x77\\x4d\\x1d\\xc2\\x1d\\x8c\\x05\\x13\\xf7\\x84\\x4b\\x0a\\x5b\\x5f\\x18\\x95\\x75\\x81\\xf9\\x90\\x44\\xa1\\x42\\x23\\xcc\\xda\\x8a\\x28\\x4d\\xe1\\x2f\\xd4\\x24\\x26\\x5f\\xe5\\x7b\\x27\\x02\\x15\\xf8\\xfa\\x9f\\xf2\\xbe\\xa5\\x17\\x93\\x4e\\x48\\x00\\xa4\\x7d\\x34\\x6f\\xb6\\xc3\\x61\\xcf\\xba\\xbe\\xff\\xab\\xd9\\xc4\\x16\\x4f\\x45\\x15\\x6e\\x24\\x5c\\x97\\x7e\\xdb\\x47\\x36\\x42\\xc3\\x94\\x0b\\xe5\\xad\\x6f\\xd1\\xa7\\x11\\x9a\\x7b\\x18\\xe9\\x8d\\x6d\\xc8\\x43\\xe0\\xd2\\x54\\xc9\\x3d\\x01\\x46\\xd1\\x8e\\x5c\\x62\\xed\\xe1\\x49\\x0f\\x89\\xa6\\x05\\xeb\\x45\\x4f\\x97\\x47\\x78\\xcf\\xae\\x20\\x93\\x2e\\x95\\x47\\x7b\\xd0\\x3b\\xcd\\xb9\\x7d\\x5b\\xcb\\x76\\x33\\x59\\x42\\xe9\\x2e\\xe6\\x68\\xf2\\x31\\xe6\\x9c\\x57\\x0a\\xc5\\x44\\x6d\\x0f\\x77\\x40\\x66\\x73\\x7f\\xdf\\x49\\xf1\\x0c\\xeb\\x1b\\x52\\xd6\\xd8\\xa4\\x63\\x98\\x46\\xa3\\x37\\x3a\\x7c\\x6f\\x3b\\x4b\\x31\\x59\\xfe\\x2e\\x7a\\xf7\\xee\\xe2\\xf0\\xdf\\x17\\x2d\\x94\\xd2\\x55\\xd0\\x17\\x65\\x1d\\xa3\\x00\\x90\\x05\\xe5\\xea\\xc3\\x17\\x6c\\x09\\x38\\x9e\\xe4\\x0d\\x70\\x38\\x3b\\xd3\\x71\\x17\\xec\\xa0\\x83\\x59\\x8a\\x18\\x01\\xf5\\x92\\xd0\\x57\\x18\\x6e\\x56\\x8e\\x24\\x7c\\x25\\x2b\\xe4\\xb1\\x4f\\x72\\x3a\\xb7\\xdd\\xb9\\x7a\\xe9\\x76\\x8c\\x26\\x82\\xfd\\x63\\xac\\xc3\\x00\\x77\\x9f\\xe0\\x4e\\x2b\\x88\\x87\\x47\\x51\\x34\\x6c\\x9e\\x0f\\x97\\xa2\\xa2\\x16\\x77\\x2f\\xf9\\x62\\x5c\\x33\\xbd\\x7e\\x29\\xfe\\xd8\\x00\\x3a\\x08\\xdb\\xd3\\x3b\\x5d\\x17\\x89\\x9c\\x94\\x3c\\x25\\xe9\\x5a\\xd7\\x54\\xfb\\x63\\x2e\\x04\\x7c\\x11\\x2a\\xf7\\xf7\\xce\\xba\\x72\\x36\\x2e\\x1a\\x3d\\xdd\\x29\\x35\\xaa\\xf7\\xf8\\x18\\xa2\\x7c\"},\n{{0xb8,0x34,0xc6,0xe0,0xfa,0xcb,0xff,0x58,0x0d,0xd3,0xb2,0x37,0x53,0x95,0x9a,0x4c,0x21,0x54,0xc2,0x19,0x52,0x1b,0x3d,0x27,0x03,0x5d,0x07,0x1f,0x65,0x99,0xbd,0x02,},{0xd1,0xc3,0x84,0x71,0x5e,0x3b,0x3d,0x02,0xc1,0x3e,0x09,0x06,0x05,0x53,0x4c,0x7d,0xb7,0x40,0xda,0x2a,0xa5,0x60,0xf5,0x32,0x00,0xa3,0xce,0xd8,0xbe,0xae,0x8c,0xf8,},{0x0f,0x19,0xb7,0x06,0x6d,0x57,0x92,0x32,0x8a,0x98,0x00,0xd9,0xd4,0xf8,0xf6,0x7d,0x5b,0x08,0x9b,0x54,0x12,0x26,0xa1,0x67,0xda,0xcd,0x43,0x9f,0xa4,0x85,0xb0,0x02,0x5a,0x5d,0xc7,0xf2,0xc7,0xe2,0x3f,0xc4,0xa5,0xc6,0x86,0x9e,0x76,0x19,0xd3,0x56,0x39,0x97,0x00,0xc9,0x36,0x50,0xe8,0x9c,0xd2,0x5b,0x90,0xfb,0x99,0x25,0xe3,0x04,},\"\\x6c\\xf1\\x47\\xb1\\x60\\x55\\x28\\xa3\\x6b\\xe7\\x57\\x16\\xa1\\x4b\\x42\\x0b\\xcf\\x06\\x7c\\x03\\xf1\\xcf\\xe9\\xc4\\x40\\x2f\\x14\\x98\\x7f\\xbf\\xc9\\xd3\\xec\\xc3\\xcc\\xf4\\xf8\\xd2\\xd0\\x3a\\x55\\x90\\x0b\\x8d\\xc7\\x9a\\xf3\\xb6\\xe7\\x74\\x36\\xf6\\x9b\\x14\\x17\\xad\\x4b\\x68\\xfd\\x44\\xe5\\xe3\\x33\\xed\\x90\\xea\\x79\\x43\\xfb\\xd1\\x12\\x26\\x09\\xec\\x8f\\xf6\\xbb\\x25\\xe4\\x2e\\x99\\x14\\xf5\\x92\\x0f\\xc7\\x2c\\x4d\\x01\\x3b\\x6a\\x96\\x85\\xc9\\x96\\xfb\\xd8\\x35\\x2a\\xaf\\xb1\\x84\\xc2\\x2d\\x9e\\x47\\x87\\x1a\\x52\\x80\\xe4\\xab\\x7d\\xd6\\xa5\\xcf\\xd1\\x0a\\x59\\x94\\xa2\\x00\\xf6\\x70\\xe0\\xb6\\x22\\xa9\\x39\\x4d\\x47\\x93\\xd0\\xa4\\x20\\xe7\\xd8\\x80\\x6c\\xb1\\x27\\xc7\\xac\\x69\\x0d\\x45\\xa2\\xe9\\x41\\x66\\xce\\xa6\\x72\\xbc\\xd9\\x82\\xb0\\xe9\\xba\\xad\\x56\\x31\\x2d\\x25\\x70\\xdd\\xde\\x7e\\x0b\\x9e\\x7f\\x47\\x13\\x6f\\x04\\x81\\xd0\\x0f\\x66\\xa2\\xaa\\xca\\x4d\\x1b\\x09\\xd7\\xce\\x6c\\x5a\\x98\\xa7\\x6b\\x68\\xcd\\x97\\xd5\\x79\\x39\\x68\\xd6\\x67\\x07\\x3f\\x82\\x17\\xf9\\x05\\x47\\x35\\x34\\x0f\\x9b\\x14\\x9c\\x0d\\xce\\x84\\x5b\\x09\\x9e\\x88\\xd0\\x70\\x96\\x80\\xf0\\xf7\\x76\\x03\\xff\\x0a\\x23\\x31\\xc5\\x58\\xfc\\x36\\xd5\\xf2\\x4d\\xa9\\xa6\\x2d\\x69\\xaf\\x51\\x90\\xd2\\x1b\\x5c\\x85\\x7a\\x1e\\x08\\xf0\\x14\\xc6\\xd4\\x56\\x46\\x86\\x65\\xa7\\xf8\\x45\\xc6\\x6f\\x91\\x11\\xf9\\xc0\\x98\\xc6\\x89\\x40\\xef\\xcd\\x87\\xb6\\x57\\x07\\x0c\\xb9\\x16\\x4b\\xc9\\x74\\x3a\\xce\\xb7\\x43\\x9a\\x0d\\x01\\xc0\\x06\\x2a\\x11\\xaf\\x2e\\x11\\x34\\x93\\x97\\xf5\\xd1\\x52\\x87\\x2b\\x13\\xc5\\xab\\x32\\xf5\\x1c\\xc5\\x8f\\x14\\x75\\xec\\x82\\xac\\x67\\x15\\x61\\xdc\\xbd\\x34\\x3c\\xfb\\x3c\\x5f\\x78\\xd0\\xfc\\x73\\x05\\x3c\\x60\\x04\\xb0\\xa4\\xca\\x3f\\x20\\x43\\xff\\x4b\\x0c\\x54\\x27\\x5c\\x4f\\xcb\\x9c\\xad\\xc6\\xba\\xab\\xe5\\x7b\\x1d\\x5a\\xcd\\x53\\x1e\\x97\\x2e\\xf9\\x33\\x51\\x36\\xcd\\x1d\\x65\\x51\\x2b\\xa1\\xf5\\xb6\\xcc\\xc4\\xb6\\x6b\\x42\\x50\\xaa\\xfa\\x29\\x67\\xdd\\x42\\x11\\xa2\\x74\\x2e\\x0f\\x17\\x7d\\x8f\\x40\\x63\\x89\\x9f\\x61\\x81\\x5c\\xbe\\x6d\\x8f\\xbf\\xcd\\xf7\\x48\\x12\\xbd\\x40\\xcc\\x10\\x08\\x4e\\x46\\xa9\\x9a\\xc1\\x28\\x05\\x8e\\xaf\\x16\\xa4\\x9a\\x24\\xb6\\xae\\x22\\x8e\\xcf\\x01\\x09\\xc5\\x2d\\xfc\\x06\\xe3\\x7d\\x6a\\x33\\x3b\\xcb\\x24\\xab\\xa3\\x12\\x16\\x4c\\x6c\\x02\\x90\\x48\\x5d\\x25\\x12\\x80\\x53\\x8c\\xe9\\x54\\x1c\\x09\\x16\\x64\\x0e\\x36\\xd6\\x92\\x9d\\xcd\\x95\\x88\\xeb\\x99\\x57\\x7f\\x5f\\x6d\\x82\\xbc\\xbb\\x19\\x88\\x26\\x26\\x7e\\x49\\xf5\\xda\\xff\\x2c\\x0d\"},\n{{0x22,0x69,0xa5,0xd8,0xf7,0xac,0x2c,0xd9,0x04,0x8f,0x5f,0x49,0xe3,0x49,0xe5,0xc4,0x35,0xa1,0x59,0xb3,0x19,0xfe,0x3b,0x30,0xbf,0xac,0x8d,0x0d,0x50,0x59,0x43,0xf4,},{0x1c,0x81,0x79,0x43,0xdc,0x39,0xc2,0x4b,0x01,0xda,0x38,0xa4,0x87,0xb1,0x75,0x48,0x24,0x60,0xc6,0x09,0xe4,0x72,0x63,0x49,0xa9,0xaa,0x7a,0xea,0x9b,0xc0,0xfb,0x34,},{0xbe,0x0f,0xb3,0x30,0x8a,0x07,0x6a,0x61,0xa4,0xa9,0x2a,0x97,0xf6,0xac,0x55,0x32,0x71,0x90,0xe1,0x34,0x1d,0x6d,0xd4,0x10,0xd8,0x6b,0x41,0xbd,0xaf,0x2d,0x33,0x74,0x09,0x3e,0xf7,0x20,0xbd,0xb7,0x7f,0xeb,0x70,0x14,0xe0,0xf7,0x7d,0x3b,0x80,0x96,0x23,0xc7,0xca,0x53,0xe2,0xae,0x4b,0x09,0x71,0x13,0xe9,0x6d,0xb7,0x7a,0x2d,0x08,},\"\\x71\\x53\\xd4\\xd9\\xe6\\x41\\xaa\\x61\\x92\\x0d\\xb0\\xff\\x4b\\xd5\\x37\\xa6\\xd6\\x13\\x0a\\x39\\x65\\x54\\xcc\\x94\\x53\\x76\\x98\\xf9\\xca\\xd1\\x6b\\x99\\xee\\xbe\\xfa\\x5f\\x27\\x76\\xf2\\xfe\\xaf\\xf6\\xbd\\x9a\\x69\\x04\\x12\\x0c\\x67\\xe0\\x88\\x3f\\x6b\\x96\\xbb\\xbb\\x19\\x5e\\x95\\xae\\xc7\\x53\\xb6\\x99\\xba\\xb3\\xd0\\x39\\x44\\xc1\\x3c\\x72\\xfc\\x84\\xe3\\xf2\\xcb\\xf6\\x29\\x6f\\x64\\x55\\x49\\x11\\x1c\\x93\\xfa\\xe1\\xa7\\x59\\xbf\\xcd\\x16\\xfc\\x09\\xe6\\x0b\\xb9\\x78\\x55\\x35\\xad\\x27\\xda\\x24\\x4e\\xf2\\xf8\\x57\\xf2\\xde\\x99\\xa6\\xe9\\x21\\x88\\x89\\x0e\\x45\\x2c\\x7f\\x5b\\x9e\\x3a\\x4b\\x96\\x8e\\x11\\x74\\x3b\\x6f\\xc7\\xfa\\xf1\\x27\\x5e\\x53\\x60\\xa5\\x46\\x89\\x41\\x79\\x78\\x94\\xd7\\x70\\xfa\\x7d\\xa3\\x64\\xa3\\x37\\x30\\x22\\x39\\xfe\\x83\\xae\\x0b\\x0d\\x08\\x4a\\xa1\\x2a\\xcd\\xc6\\x34\\x62\\x52\\x4e\\x0e\\xb1\\x0f\\xef\\xe8\\x1b\\xa9\\x6f\\x71\\xf2\\x75\\xf3\\x44\\x9a\\x3f\\x8d\\xb2\\x1d\\x58\\x74\\x9a\\x38\\x85\\x3d\\x39\\xb0\\xad\\x8e\\x69\\x89\\x1b\\xd2\\x04\\xdf\\xca\\x8f\\x6c\\x23\\x9d\\xc9\\xa0\\xac\\x27\\xf5\\x4d\\xb4\\x23\\x8d\\x47\\x06\\xdf\\x11\\xd6\\x07\\x36\\x9d\\xc7\\xf7\\x04\\xda\\x1d\\x39\\xf2\\xe8\\x2a\\xf8\\xc2\\x83\\xd2\\x20\\xc1\\x24\\x31\\xf5\\x6d\\x80\\x30\\x69\\xb4\\xac\\xb7\\x70\\x81\\xc0\\x31\\xae\\x33\\x19\\xfc\\x77\\xfc\\xa7\\x84\\x50\\x97\\xfd\\x72\\x7a\\xd0\\xd0\\x80\\x89\\x5b\\xba\\x23\\xe8\\x73\\xd2\\xde\\xf8\\xcd\\xc2\\x16\\xc3\\xee\\xd6\\x1b\\x08\\x76\\x1b\\xb9\\xeb\\xce\\x02\\x82\\xcf\\x50\\x2a\\xaf\\x6c\\xe7\\xe8\\xc0\\x58\\x63\\x79\\x58\\xc3\\xea\\x1b\\x72\\xfe\\x6e\\x8d\\xf8\\xd3\\x7a\\xc0\\x55\\xdb\\x69\\x92\\x58\\x7f\\xab\\xbd\\xc4\\x67\\xf5\\x24\\x75\\x64\\x4f\\x91\\x88\\x63\\xaf\\x62\\x04\\x92\\xf3\\x46\\x80\\xf2\\x05\\x6c\\xbc\\xab\\x75\\xe2\\x32\\x36\\x26\\xc0\\x94\\x75\\x9c\\x0e\\x0e\\x99\\xef\\x19\\x75\\x95\\x27\\x25\\x06\\x46\\xad\\x76\\x01\\x20\\xba\\x38\\x66\\x99\\xd5\\x39\\x34\\xf9\\x56\\xb8\\xbb\\xc7\\x39\\x5b\\xb4\\x96\\xce\\xb2\\xdd\\x22\\x3c\\x7b\\x50\\x1b\\x92\\xd3\\x6a\\x95\\xf8\\xf0\\xa0\\x2e\\xb5\\xba\\x4d\\xdd\\xf1\\x66\\xb9\\xb9\\x5b\\x4a\\x59\\xe7\\x2a\\x30\\xc6\\x3c\\xf2\\x1e\\x60\\x85\\x75\\x19\\x23\\xd5\\x4b\\x30\\x28\\x1e\\x52\\xa0\\x96\\x18\\xe6\\xf0\\x23\\xba\\x0a\\x21\\x67\\x5e\\x7f\\x98\\x9b\\x89\\x91\\x58\\x8c\\x96\\xc2\\xb5\\x6a\\x78\\xf5\\xd2\\x94\\x5a\\x7b\\xae\\xb6\\xa0\\xc1\\xbb\\xd5\\xd9\\x5a\\xf3\\xee\\x83\\x0f\\x58\\x09\\xc7\\x94\\xa1\\x5a\\xb4\\xb5\\xf8\\x9d\\xd2\\xbe\\x2d\\xfd\\xcd\\x8f\\xe0\\x52\\x0f\\xda\\x2b\\x3f\\x02\\xa1\\xac\\x01\\x55\"},\n{{0xe9,0x65,0xb3,0xf2,0x57,0x35,0x66,0x85,0xc9,0x8b,0x42,0xb9,0x64,0xa2,0x53,0xfc,0x49,0x53,0x99,0xcc,0x94,0xb0,0x99,0xc2,0x44,0x5f,0xc8,0x1c,0x75,0x9c,0x68,0xe5,},{0x68,0x9f,0x54,0x10,0xc8,0xe0,0xf4,0xd3,0x7b,0xc0,0x7c,0x85,0xd7,0xcc,0xe6,0xc9,0xb6,0x36,0x01,0xf9,0xbd,0xaf,0xec,0xaa,0x44,0x8a,0x5e,0xed,0x64,0xaf,0xc8,0xc6,},{0x8d,0x2b,0xc4,0xe1,0xcd,0x25,0x6a,0xad,0x8a,0x15,0x1d,0xec,0x01,0x0d,0xc9,0x3a,0x5e,0x5c,0xca,0x58,0x29,0x8d,0xec,0x49,0xcb,0xc9,0xc4,0x71,0x7b,0x5c,0xfb,0x54,0x60,0xd4,0x30,0xbe,0x72,0x6b,0x0f,0x30,0x2c,0xbd,0x92,0x6b,0xee,0xa1,0x9a,0xa3,0xc9,0x3a,0xeb,0x45,0x2a,0x44,0xf6,0x00,0x7a,0xf4,0x9a,0xdf,0x2f,0x05,0xbb,0x04,},\"\\x6f\\x20\\xa9\\xad\\x27\\xe3\\x0d\\xac\\x76\\xb3\\x0d\\x4c\\x19\\xa5\\xbd\\x6d\\xfd\\x6d\\x04\\x92\\x13\\xf4\\xbe\\xcd\\xd9\\x63\\xd7\\x2b\\x8b\\x2d\\xad\\x68\\x7b\\x00\\x38\\x08\\x20\\x1d\\x50\\xf7\\xdd\\x6e\\x59\\x9e\\xf5\\x8c\\xeb\\x60\\x68\\xc5\\x45\\xed\\x99\\xb9\\xe7\\x63\\xf9\\xb0\\xec\\x1d\\xb5\\xfc\\xbd\\x7d\\x49\\x0a\\x12\\x1e\\xce\\xc6\\xbb\\xa1\\xeb\\x5e\\xdb\\xd6\\xde\\x85\\x36\\x47\\x07\\xc5\\x5e\\x30\\x0c\\x8b\\x16\\xbb\\x25\\x30\\xf7\\x08\\x98\\x13\\x66\\x89\\xc9\\x88\\x59\\x1d\\x53\\x91\\xd9\\xcc\\x34\\x7d\\x79\\x31\\x06\\x1a\\x9b\\x76\\x96\\xe2\\xc9\\xf3\\x5b\\xc0\\xd3\\x04\\xa8\\x1c\\x2c\\xf9\\x54\\xd9\\xc3\\xa8\\x8a\\x22\\xe1\\xd6\\x7b\\xbe\\x0a\\x85\\x30\\x84\\x77\\xf6\\x29\\x18\\xc2\\x5d\\xb5\\x04\\xe4\\x76\\x2f\\x0e\\x3b\\x42\\x46\\x00\\x79\\x08\\xac\\x70\\x17\\x79\\x00\\x6b\\x77\\xd7\\x25\\x10\\xed\\xc6\\x9e\\x17\\xd0\\xf6\\x39\\x4c\\x77\\xe5\\x55\\x18\\x75\\xa4\\x46\\xf8\\x12\\x33\\x41\\x5d\\x0a\\x91\\xa0\\x46\\x0b\\x51\\xc4\\x13\\xd6\\x44\\xe8\\x50\\xf8\\x55\\x72\\x81\\xc4\\x66\\x99\\xe5\\x3b\\x22\\xa7\\xc7\\x3b\\x06\\x8e\\xa3\\x86\\x52\\xcf\\xf3\\xb0\\xa7\\xb8\\xba\\x30\\x97\\x1e\\xab\\x18\\xfd\\xbb\\xd8\\x73\\x9e\\xe1\\xee\\x0c\\xd5\\xcb\\xfb\\x7d\\x5d\\x41\\x75\\x7b\\x63\\x31\\x27\\x1f\\xb7\\x80\\x97\\x51\\xe2\\x03\\x51\\x3c\\x99\\x70\\xf6\\x6d\\x91\\xbc\\x0c\\xe0\\x62\\xf4\\xfc\\xb2\\x8b\\xe0\\xa6\\x99\\x86\\x7b\\x79\\x59\\x4c\\x64\\x58\\xa0\\xd3\\x07\\xac\\xac\\x91\\xf4\\x13\\xc4\\x61\\x58\\x77\\xdc\\x53\\xe1\\xb0\\x18\\xda\\x5c\\xfc\\xe1\\xb6\\x3f\\x40\\xbe\\x1e\\x55\\x27\\x4c\\x43\\x74\\xcd\\xfc\\x21\\x52\\x44\\x99\\xa6\\x83\\xa2\\x31\\xad\\xef\\x77\\x9d\\x19\\x21\\x44\\x0e\\x5d\\x3f\\xdb\\xd5\\x03\\x3d\\xc9\\x83\\xcf\\xc9\\x31\\xab\\xe6\\x38\\xc3\\x5d\\x5a\\x95\\x86\\x9e\\x9f\\xe3\\xd9\\x3e\\xb9\\x0b\\xd1\\x86\\x1f\\x85\\x5c\\xe1\\xf6\\x08\\xb7\\xbc\\xad\\x6b\\x5e\\x1b\\xd9\\x7e\\xdc\\x95\\xed\\x5d\\xdc\\xbc\\xb7\\x15\\xd9\\x19\\xf5\\xff\\x77\\xdf\\x2d\\xa4\\x38\\xf7\\xa3\\xa9\\x82\\x86\\xdb\\xd5\\xb6\\xe0\\x43\\xfc\\x73\\x72\\xf6\\x97\\x04\\xf0\\x9d\\x86\\x55\\x30\\xf4\\xf0\\xed\\xd3\\x30\\x0f\\x18\\x5b\\x6d\\x73\\xd8\\x71\\x6d\\x32\\xd3\\x2b\\x1c\\x9a\\xc2\\xdd\\xf4\\xf9\\x02\\xd3\\xf2\\x16\\xd3\\x5a\\x33\\xf3\\x68\\x09\\x5d\\xed\\x10\\xbe\\x94\\xbb\\x53\\xd6\\xf2\\x56\\x56\\x0f\\xac\\x2f\\x4a\\xf0\\xed\\xf5\\xc5\\xc7\\x02\\x14\\x37\\x77\\x12\\x6e\\x7d\\xe3\\x2d\\x07\\x49\\x39\\x32\\x66\\x21\\x29\\xba\\x0e\\x7f\\xc7\\xcf\\xb3\\x6f\\xd2\\xca\\x53\\x16\\x46\\xe8\\xcd\\x22\\x11\\x85\\x4f\\xc5\\x10\\xaf\\x3b\\x1e\\x8c\\xaf\\xde\\x7a\"},\n{{0xbc,0x3b,0x1e,0x0b,0xf8,0xd6,0x9e,0xa5,0xb4,0xcb,0xbf,0x10,0xbb,0x33,0xfc,0x95,0x5a,0xdc,0xbe,0x13,0xfc,0x20,0xaf,0x8a,0x10,0x87,0x2c,0xe9,0xdf,0x39,0xd6,0xbd,},{0xac,0xcd,0x26,0x28,0x15,0x59,0x19,0xbb,0xc7,0xf9,0xd8,0x6f,0x91,0xda,0xfe,0xc3,0x5c,0x71,0x1a,0x78,0xc7,0x9a,0xd3,0x60,0xed,0xdb,0x88,0xfa,0x8a,0x18,0x0b,0x2d,},{0x6e,0xf7,0xf0,0xe9,0x1f,0x2c,0xc6,0x71,0x5f,0x8e,0x5a,0x98,0x57,0x4b,0x44,0x00,0xc2,0x61,0xa6,0x43,0xe0,0x54,0x5f,0xf2,0x67,0x47,0xf8,0xe1,0x73,0x98,0x99,0xd7,0x66,0x40,0xb6,0x45,0x1c,0x43,0xc1,0xd0,0x3a,0x47,0x75,0xb5,0x4f,0xcf,0x9b,0xce,0x18,0xed,0x3f,0xcc,0xad,0x33,0x8b,0x77,0x64,0x02,0x4f,0xdf,0xa2,0xde,0x82,0x01,},\"\\x4c\\x73\\xe0\\x4a\\xbe\\x08\\x19\\xde\\x1f\\x84\\xd7\\x05\\x41\\xeb\\x1b\\xb6\\x1c\\x4f\\x42\\x92\\x0e\\x1f\\x2d\\x1d\\x9e\\x62\\x81\\xa8\\xa2\\xe8\\xb3\\xeb\\x45\\x53\\x7d\\x83\\x96\\x90\\x27\\xf9\\x9e\\xf0\\xea\\x27\\xca\\x08\\x5b\\x13\\xf9\\xdb\\x48\\x0f\\x00\\xc0\\x2f\\x3f\\xd7\\x42\\x9d\\xd5\\x67\\x70\\x89\\x53\\xbb\\xf3\\xb9\\xe8\\xe2\\xc6\\xac\\x4d\\x32\\x1f\\xf8\\xf9\\xe4\\xa3\\x15\\x47\\x23\\x08\\x5a\\x54\\xe9\\xc9\\x57\\x3c\\xc7\\x35\\x0c\\x09\\xf8\\x97\\x3f\\x94\\x8b\\x08\\x73\\x03\\x73\\x59\\x7a\\x5f\\xd0\\x34\\x98\\x21\\xae\\x0a\\x3c\\xd6\\xc8\\x49\\x92\\xb1\\x89\\x12\\x8f\\x34\\x90\\x98\\x7e\\x1e\\x9a\\xd4\\xf6\\x57\\x4c\\xa5\\x38\\xfd\\xfd\\x83\\x28\\x4c\\x1e\\xb0\\x95\\x3f\\x24\\xc0\\x8f\\x74\\x93\\x2d\\x43\\x64\\xdb\\xbe\\xf9\\x22\\x54\\x24\\x40\\xda\\xe8\\x04\\x24\\xa9\\x2e\\xae\\xf2\\x7c\\x18\\x89\\xbd\\x08\\xc4\\x4f\\x9d\\xf0\\x3a\\x3a\\xf3\\x0d\\xff\\xb4\\x8f\\xae\\x44\\x5e\\x62\\x5f\\x4d\\x92\\x65\\xcf\\x38\\x7a\\x1d\\xa3\\x5f\\xe4\\xc2\\x31\\x50\\x45\\x35\\xdb\\x72\\xea\\x81\\xa1\\x86\\x80\\x5f\\x85\\x6e\\xbe\\x6a\\x6a\\x65\\x24\\x14\\x32\\x53\\x0f\\xe6\\xc9\\x60\\xc5\\xf9\\xbe\\x6c\\x22\\x95\\x70\\x60\\x30\\x4e\\x9d\\xd8\\xef\\xbc\\x1e\\x48\\x2e\\x7d\\xdb\\xd8\\xaf\\x03\\xbf\\x23\\x82\\x89\\x9c\\x98\\x6d\\x91\\x66\\x11\\xe4\\xf2\\x7a\\xe5\\x2f\\x81\\x7e\\xf0\\x1b\\x6a\\x14\\x1f\\xe4\\xf6\\x85\\xd9\\x4d\\xc8\\xcd\\x52\\x83\\x00\\x43\\x93\\x45\\x87\\x70\\x4c\\x1e\\x64\\x2e\\x8f\\xe5\\x6b\\xe6\\xd6\\xb8\\x5b\\xf4\\xa6\\xfe\\xb2\\xb6\\x85\\x8f\\x1f\\x00\\x7f\\x99\\xd3\\x9e\\xa0\\x4c\\x9f\\xe5\\xfa\\x7e\\xf1\\xb9\\x1f\\x49\\x5e\\xd0\\xe7\\xfa\\x42\\x13\\xdd\\x68\\xce\\xa4\\x2b\\x67\\x29\\xf9\\x50\\x31\\x90\\x7e\\x27\\xc4\\x40\\x98\\x09\\x43\\x86\\xfa\\xbf\\xb0\\x4a\\xb9\\xb4\\xde\\x3d\\x68\\x61\\xde\\x46\\x23\\x12\\xc5\\x9b\\x27\\xc7\\x6f\\x7b\\x6a\\x4f\\xc7\\x1e\\xa0\\xd5\\xda\\xf6\\xb7\\x32\\x05\\x21\\xa6\\x7e\\x5c\\xb3\\x75\\x04\\x97\\x6a\\xd7\\x3d\\xae\\x2d\\x64\\x9f\\xeb\\x75\\xe2\\xea\\xdd\\x34\\x01\\xa7\\xf2\\xf3\\x6e\\x16\\xdf\\xbf\\xbd\\xb2\\xaf\\x57\\x16\\xcb\\xa1\\xbc\\xe2\\x0c\\xd4\\x7c\\xe1\\xc1\\xd7\\xbe\\x00\\x69\\x70\\x01\\xfb\\xbe\\xb4\\x91\\x5a\\xa6\\xe5\\x39\\x3b\\x5a\\xb2\\x0e\\x0f\\x31\\xf5\\x11\\x91\\x49\\xa2\\xcb\\x4c\\x4d\\x45\\x2c\\x81\\x56\\x11\\x3a\\xc7\\x82\\x4f\\x84\\xf0\\x9a\\xeb\\x81\\x20\\x2e\\x8d\\xd3\\xda\\xc0\\xaa\\x89\\x39\\x9b\\x5a\\x38\\xb1\\xe2\\x18\\x30\\x19\\x60\\xa3\\x7d\\x52\\x63\\x2e\\xea\\xef\\xe3\\x68\\x74\\x55\\x46\\x42\\x88\\xeb\\x17\\xd9\\xe1\\x9a\\x3a\\x72\\xed\\x9d\\xe3\\x2c\\x17\\xbe\\x79\\xa3\\xb9\"},\n{{0x10,0x71,0x8f,0xa6,0xe2,0xd7,0xf6,0xed,0x38,0xfd,0x66,0xcb,0x6d,0xbf,0xa0,0x87,0xe8,0xf1,0xe8,0xa8,0xa2,0x4f,0xab,0x58,0xd7,0x9d,0x79,0x54,0xb8,0x72,0x0c,0x3e,},{0x87,0x0d,0x4f,0x66,0x6d,0x06,0xfd,0xa9,0xf9,0x51,0x1b,0x58,0x60,0x2e,0xec,0x05,0x0d,0x75,0x4e,0xa6,0xd8,0xe7,0x9c,0xdd,0x19,0xf6,0x01,0xc4,0x77,0xdf,0x1a,0xa0,},{0xe1,0x65,0x91,0x86,0xf1,0xf7,0x6f,0xe4,0x3a,0xc8,0xa1,0x17,0x03,0x36,0x0f,0xbe,0xff,0x53,0xb5,0xe5,0x7b,0x59,0x74,0xaa,0xa0,0x8e,0x25,0x75,0x57,0x9c,0x27,0x08,0x4c,0xf6,0x80,0x2e,0x7c,0x20,0x63,0x47,0x31,0x44,0x75,0xb6,0x03,0x19,0x74,0x94,0xe7,0xd6,0x1f,0xe4,0xb1,0xee,0x7b,0x78,0xe1,0x8d,0x94,0x46,0x93,0x52,0xdf,0x0c,},\"\\x41\\x25\\x9b\\x6e\\xef\\x13\\xd6\\xff\\xe3\\x3c\\xdd\\xe7\\x99\\xb9\\x95\\xc4\\x0b\\xe7\\x82\\xcf\\x97\\x84\\x40\\xb6\\x6b\\xe5\\x1c\\x44\\x05\\x82\\xab\\xd4\\x2f\\x52\\x66\\x96\\xbb\\x3c\\xb9\\x22\\x65\\xb1\\xed\\x0e\\x4b\\xba\\x76\\x4c\\xae\\x28\\x39\\x83\\x0a\\x25\\x26\\x35\\xdc\\x80\\xce\\x5f\\x73\\xd5\\x21\\xb3\\xd6\\xff\\x03\\xac\\x30\\xe1\\x98\\xad\\x20\\x56\\x7e\\x75\\xa3\\x4f\\xa8\\x25\\xeb\\xf9\\x84\\x15\\x08\\xda\\x84\\xcd\\x67\\x42\\x36\\xca\\x7b\\x43\\xde\\x35\\x64\\xc9\\x4a\\xb0\\x79\\x40\\x8f\\xd9\\x41\\x37\\xce\\x3f\\x90\\xa5\\xdd\\x5d\\x3a\\xc3\\x9a\\x05\\xec\\x86\\x71\\x5a\\x8f\\x02\\x5e\\x45\\x39\\xa7\\x64\\x0a\\xb8\\x88\\x36\\xf4\\xef\\xba\\xbd\\x5e\\x16\\x52\\xc4\\x9e\\xa2\\x16\\x13\\xac\\xfe\\x34\\x3a\\x88\\x0e\\xe5\\xa4\\x2f\\x2f\\x91\\x34\\xef\\x4e\\x37\\x16\\xb1\\x6d\\x13\\x4a\\x9c\\x4c\\x71\\xc3\\x9b\\x3c\\x1a\\x85\\x7d\\x3c\\x89\\x43\\x97\\x83\\xee\\xf1\\xed\\xd7\\x1b\\xf4\\x49\\x2d\\x05\\xfd\\x18\\x67\\x3a\\x52\\x42\\xff\\x41\\x87\\xb9\\xde\\x47\\xad\\x49\\x68\\xda\\x49\\xdb\\xa5\\xa6\\x09\\x2e\\x95\\xea\\x27\\xdd\\xfc\\x74\\x48\\xdc\\xf5\\x97\\x2d\\x9d\\x22\\x8d\\x63\\xe5\\x29\\x1b\\xa6\\xe6\\xfb\\xd0\\x7e\\x32\\x41\\xf9\\x36\\x6c\\xa4\\x97\\x6b\\xb0\\x4b\\x22\\xd0\\x1f\\x0d\\xba\\xe7\\x94\\xfa\\x9c\\x1d\\x90\\x29\\xf8\\x8a\\x83\\x60\\x2b\\x0e\\x0e\\xc5\\x5e\\x22\\xc3\\x7b\\x20\\x11\\x25\\xca\\xdb\\x53\\x41\\xef\\x73\\xf6\\xda\\x1a\\xbb\\xe2\\xb1\\xc4\\x75\\xf0\\x75\\x03\\x45\\xb1\\xbe\\x42\\x59\\xd8\\xc2\\x85\\x31\\xff\\xe7\\x78\\x86\\x67\\xc4\\x10\\xda\\xc3\\x39\\x91\\x8c\\x86\\x9b\\x00\\xab\\x80\\xf2\\x0b\\xf7\\x99\\x0d\\x36\\x6f\\x9b\\x3d\\x5e\\x8e\\xb2\\xf4\\x8d\\x7e\\xd0\\xe6\\x4b\\x85\\xdc\\x9f\\xe3\\xbb\\x99\\x8b\\x1e\\xec\\xd1\\x23\\x1e\\x90\\x2d\\x2d\\x15\\x2e\\x09\\xda\\x2d\\x25\\x92\\xbd\\xb3\\x2c\\x8c\\xd2\\xe2\\xc4\\x89\\x49\\x6b\\x29\\x80\\xc0\\x3d\\xbb\\x09\\xec\\x7f\\x8a\\x4e\\xa2\\xc7\\x02\\x0f\\x2a\\x0f\\xaa\\x65\\x7c\\xd6\\xce\\xd4\\x8d\\x6d\\xa2\\x78\\x64\\xcf\\x5e\\x97\\xee\\xa9\\xb3\\xc2\\xf0\\xf3\\x4a\\xbf\\x8d\\x87\\xbd\\x2a\\xde\\xb6\\x0c\\x72\\x72\\xfc\\x43\\x06\\xd9\\x55\\xbd\\xc8\\x02\\x3d\\x7d\\x3d\\xc2\\xf3\\xda\\xfe\\x9e\\xbe\\x8a\\x8d\\x13\\x89\\x65\\xa7\\xf6\\xce\\x93\\x51\\x7c\\xd2\\x09\\x96\\x63\\xf6\\x7c\\x34\\x55\\x21\\x76\\xdd\\xb5\\x95\\xac\\x6e\\xa5\\x60\\x9f\\xeb\\xcf\\x24\\xc7\\xd6\\x9d\\x41\\x27\\x09\\xe5\\x78\\x67\\x0a\\x21\\xac\\x8a\\xfc\\xcb\\x8b\\xf2\\xb1\\x8f\\xf3\\xaf\\x7d\\xe2\\x1d\\xc7\\x1d\\x50\\xd6\\x0d\\x37\\xb6\\xed\\x72\\x9d\\xb0\\x4b\\xef\\xf7\\xd3\\x4b\\x29\\x20\\xd8\\x75\\x51\\xce\\x15\"},\n{{0xc1,0xd4,0x72,0x4c,0x6c,0xb1,0xbc,0x67,0x23,0xb2,0xb4,0x30,0x34,0x27,0x8b,0x3c,0x5b,0x48,0xfe,0xd7,0xf8,0xa3,0xcc,0x23,0x18,0x03,0x3e,0x75,0x52,0x04,0x73,0x51,},{0xc2,0x7e,0x39,0x2e,0x7c,0x36,0x64,0xb9,0x06,0x1e,0xa7,0x6d,0x25,0x75,0xdd,0x7c,0x41,0xea,0xf1,0xda,0x3a,0x65,0xf3,0xa9,0x86,0xe0,0xa5,0x7f,0x6c,0x40,0xc1,0x7e,},{0xd3,0x7a,0x6e,0xc8,0x2e,0xd4,0x5c,0xa9,0xb4,0x85,0x5d,0xe9,0xcb,0x94,0x25,0x64,0xe8,0x83,0xff,0x70,0xa7,0x9b,0x8e,0x71,0x2d,0x5f,0x60,0x4e,0xc8,0x97,0x4d,0xe5,0x36,0x3a,0xc8,0x49,0xcb,0xab,0x28,0xe7,0xae,0xef,0xf2,0x8e,0xd3,0xf2,0xd1,0x4b,0x60,0x8b,0x31,0x46,0xc2,0xef,0xe0,0x73,0x5a,0xd8,0x15,0xc7,0xd7,0x5a,0x1a,0x01,},\"\\xde\\xee\\x99\\xd7\\xa7\\x7d\\x43\\x00\\xc1\\x7a\\xec\\x1a\\xb3\\x23\\xc5\\x71\\xc6\\xe9\\xe7\\x3a\\x43\\x49\\x1a\\x3c\\x78\\x88\\xb7\\x6f\\xc0\\x3e\\xc4\\x3d\\x07\\xaf\\x42\\xa0\\x5a\\x2a\\xa3\\x22\\xd0\\x0c\\x85\\x60\\xac\\xef\\x31\\x41\\x06\\xb1\\x0b\\x9b\\xd1\\x26\\x54\\x35\\x7f\\xfa\\x26\\xf2\\x39\\x00\\x50\\xda\\x63\\xd6\\x68\\xc9\\xe2\\xdf\\x54\\x8f\\x87\\x63\\x9e\\x09\\x6a\\x35\\x85\\x3f\\x82\\xe7\\x61\\xfd\\x71\\x1d\\x2a\\x26\\x54\\x38\\xf5\\xd4\\xdb\\x5e\\x32\\x77\\x57\\x08\\x15\\x0d\\xa6\\xcb\\x68\\x6a\\x2b\\x4c\\xa2\\x11\\xd7\\xf0\\x0d\\xc0\\xab\\xcb\\x2c\\xa1\\x50\\xe7\\x91\\x11\\x6a\\x10\\xa5\\xef\\xcf\\xf3\\x51\\x4d\\xab\\x8e\\xd8\\x0a\\x70\\x92\\xc3\\xa0\\x15\\x15\\x2c\\xb2\\x5d\\x9f\\x86\\xec\\x0d\\x1c\\xa6\\x7d\\xda\\xb4\\x4d\\x64\\xee\\xb1\\xf9\\x31\\xbf\\xab\\x2a\\xb1\\x88\\x95\\x6c\\x74\\x3d\\xb4\\x81\\x48\\x08\\xc5\\xcd\\xe1\\xb0\\x74\\x5b\\x3e\\xdd\\x34\\x0e\\xb0\\x3f\\xfc\\xc8\\x0a\\x78\\xf3\\xdb\\x31\\x0f\\x4f\\x5c\\x20\\x00\\x9f\\xc0\\x27\\x9c\\x2c\\x1b\\xcb\\x3c\\xed\\xf9\\x90\\xbd\\x0e\\x20\\xc6\\xf9\\xfb\\x75\\x15\\xad\\x6e\\x93\\x3b\\x07\\xe9\\x9d\\xa6\\xac\\x32\\xb9\\x71\\x41\\x18\\x7e\\xf6\\x3b\\xdb\\x10\\x62\\xe3\\x72\\x20\\xa4\\xdc\\xd4\\x19\\xd6\\x24\\x4c\\xdc\\xc3\\x4e\\xa4\\x1d\\x0b\\xcb\\xc3\\x13\\x8b\\x1d\\x54\\xae\\xfc\\x01\\x90\\xe3\\x0b\\x18\\x7d\\xb0\\x73\\xaa\\x7d\\x6c\\xfe\\x04\\xbd\\x3f\\xd2\\xac\\x00\\x31\\x3e\\x3d\\xdd\\x64\\xa1\\x81\\x93\\x5c\\xa4\\xb8\\xb2\\xa8\\x5d\\x36\\xbc\\x27\\xd9\\x7b\\x76\\x26\\x76\\x7b\\x93\\xee\\x38\\xde\\xf8\\xb6\\xb2\\xc8\\xda\\x9b\\x00\\x26\\x36\\x14\\x34\\x2f\\xaa\\x9d\\x3e\\x73\\x8d\\x27\\x13\\xc4\\x5f\\xfb\\xee\\xf8\\xc8\\x4b\\xcd\\xbc\\x8d\\xa4\\x30\\x9c\\x84\\x45\\x53\\x0f\\x5c\\x61\\x7d\\xc8\\x66\\x25\\x1f\\x54\\x89\\x50\\xa1\\x4f\\x07\\x5a\\xa3\\x11\\x7f\\x96\\xe4\\x1f\\x89\\x9d\\xbe\\x73\\x40\\xb1\\xd9\\x0a\\x13\\x52\\xd3\\xb8\\xfb\\x41\\xb7\\x9f\\x16\\xa8\\x2b\\xc2\\xe4\\xa1\\x93\\xb8\\xa7\\x23\\x24\\x00\\x99\\x6b\\x73\\xb1\\xfc\\x00\\xb2\\xec\\x1c\\x66\\x75\\x77\\xf8\\x28\\x24\\xd3\\x9f\\xb7\\xf6\\xe7\\x69\\x2d\\xcd\\x97\\xb1\\xd8\\xce\\x94\\x08\\x3c\\xa1\\x97\\xe9\\xa5\\xd4\\x0f\\xad\\xff\\x0b\\x9a\\xc5\\x7e\\x9d\\xe7\\x61\\xc1\\x56\\xe6\\xd3\\x1d\\x52\\xc3\\x32\\xd5\\x13\\xe9\\xf5\\x86\\x97\\xdc\\xbd\\xd8\\x0a\\x5e\\x42\\xc5\\x51\\x70\\x2c\\x3d\\xe7\\xbe\\xcc\\xc3\\xdb\\x84\\x5b\\x1a\\x04\\xc8\\xcb\\xd4\\x16\\x95\\xea\\x74\\x28\\xab\\xba\\x89\\xe0\\xdc\\xe3\\xe3\\xd9\\xe7\\x02\\x30\\xae\\x91\\x47\\xc2\\xb8\\x85\\x59\\xdc\\x69\\x5d\\x68\\x09\\xa5\\x1c\\xcb\\xc1\\xdd\\x9e\\x08\\x9c\\x58\\x5f\"},\n{{0x37,0xc0,0x70,0xd4,0xa5,0x3b,0x13,0xbe,0x76,0x06,0x35,0x11,0x0d,0x1b,0xd4,0xf0,0x19,0x20,0x22,0x5a,0xfa,0xbe,0xc5,0x76,0xfa,0xae,0xc9,0x10,0xf2,0x92,0x6d,0x1a,},{0x0a,0xa8,0x5f,0x2a,0xb1,0xdf,0xf8,0x95,0xd1,0xfa,0xd0,0xc1,0x19,0xf2,0xbf,0x57,0x12,0x6a,0xab,0x60,0x1c,0x52,0x8d,0x37,0x69,0x8e,0x97,0x70,0x2d,0x35,0xf5,0x25,},{0x9d,0xa6,0x0c,0xc4,0xa6,0x4d,0x07,0xde,0xe1,0x34,0x6b,0xd3,0xd3,0x01,0x09,0x95,0xce,0x27,0x38,0x20,0x8a,0xb3,0x5b,0x34,0xc2,0xa8,0xfd,0x17,0x87,0xae,0x3a,0x1e,0x20,0x7f,0xe7,0x84,0x52,0x51,0x54,0xfa,0xe4,0xf5,0x79,0x4c,0xd8,0x50,0x30,0x45,0xfe,0xa8,0x5c,0xf7,0x7f,0xd9,0x2f,0x6a,0x70,0xcd,0x0c,0x5a,0x52,0xc0,0x81,0x0e,},\"\\x10\\xc6\\x46\\x44\\x7f\\x81\\xad\\x94\\xd0\\x15\\xd8\\x6d\\x0d\\x98\\xb2\\x45\\x2d\\xca\\x60\\xa4\\x7a\\xb3\\x52\\x64\\x03\\x5e\\x33\\xa0\\x94\\x2b\\x95\\x4e\\x3e\\x23\\xb9\\x1d\\x81\\x23\\xb8\\x59\\x3c\\x6a\\xf7\\xc8\\xd3\\xec\\xd2\\x90\\xe0\\xe5\\xee\\x36\\xfd\\x4e\\x53\\xb7\\xbe\\x63\\x3a\\x6c\\xf0\\x27\\xa5\\xac\\x3f\\x0f\\x67\\x9e\\xb1\\xbd\\xd2\\x10\\xa3\\x8e\\xa6\\xe4\\x8b\\x05\\x58\\xe3\\x03\\x01\\x0a\\xf4\\x74\\xe7\\xf6\\xdf\\x2a\\x4e\\x45\\x76\\x99\\xfc\\x38\\xe3\\x69\\x38\\xb0\\x5f\\xfc\\xaa\\x1b\\x69\\x4e\\x32\\xf3\\xd1\\xb2\\xcc\\x5d\\x00\\xcf\\x25\\x6f\\x12\\x18\\x4c\\x87\\x3e\\x51\\x90\\x89\\xec\\x1d\\xf1\\x5b\\x0d\\xc7\\x6e\\x7b\\xfe\\x90\\x78\\x0d\\xf5\\x81\\x36\\xfe\\x59\\x7f\\xce\\x89\\x4c\\xa5\\x63\\xe0\\x8e\\xfa\\x0f\\x2d\\x4d\\x20\\x8b\\xed\\xe9\\xa8\\x74\\x88\\x28\\x73\\xd2\\x51\\xba\\xf0\\x19\\xfe\\x46\\xd1\\xd6\\x50\\x4b\\x3b\\xcd\\x24\\x3b\\x79\\x53\\x51\\xf3\\x4d\\x2e\\x76\\x06\\xaa\\x97\\x55\\x28\\xee\\x50\\xd5\\x9e\\xfb\\x6e\\xe6\\x99\\x2a\\x89\\xb2\\x42\\x69\\x56\\xc2\\xca\\x42\\x47\\xe0\\xdf\\x01\\x29\\x85\\x29\\x83\\xe9\\x76\\x7a\\x8e\\xed\\x1b\\xc7\\x33\\x5f\\xfc\\xa8\\xd0\\x28\\x9f\\x04\\x80\\x7f\\x67\\xca\\x7d\\xa9\\x71\\xf5\\x8d\\xb8\\xb9\\xbc\\x9f\\xdb\\xe4\\xf8\\x3c\\xfe\\x9a\\x00\\xf1\\xca\\x58\\x47\\x98\\xbc\\x71\\xd8\\x51\\xff\\x7c\\xd6\\xc5\\x1b\\x89\\x90\\xaa\\xba\\x4d\\x38\\xb4\\x16\\xb9\\x22\\x40\\xdf\\xb7\\x0e\\xe3\\xc1\\x2b\\x5e\\x73\\x10\\x57\\x76\\x2e\\xf9\\x08\\x23\\xfb\\xf6\\x83\\xca\\x06\\xd0\\x5c\\x20\\xd3\\xae\\x2b\\x97\\xa8\\x3e\\xbe\\x70\\xae\\x17\\xaf\\xff\\x9d\\x16\\x60\\x9d\\x54\\x6d\\x8d\\x3c\\x74\\xbc\\x28\\x18\\x84\\x89\\x4f\\x3d\\x49\\xe0\\x83\\xf1\\x0a\\xe7\\xc1\\x1c\\x1d\\xca\\x0e\\xff\\xef\\xcf\\xa6\\xe0\\xf1\\x53\\x50\\x81\\xfa\\xc3\\xa2\\x81\\x9f\\xd2\\xe3\\x26\\x55\\x27\\x18\\x2a\\xe9\\xd3\\x91\\xb2\\x32\\xbb\\x75\\x42\\xe6\\x84\\x55\\xcd\\x26\\x77\\x60\\xdb\\x65\\x2d\\x19\\xe2\\x2f\\xb2\\xed\\x11\\xcd\\x13\\x05\\xba\\x8d\\x98\\xc1\\xeb\\xf2\\xd1\\x96\\x9b\\x24\\xd6\\x4f\\x3e\\x31\\x9a\\xf7\\x4e\\x09\\x20\\x06\\xd2\\xa3\\xff\\x74\\x48\\x72\\xa2\\x0e\\xbf\\x18\\xd1\\x77\\x48\\xab\\x71\\x10\\x80\\x50\\x96\\xea\\x13\\x6b\\xce\\x2f\\x96\\x8b\\x20\\x5e\\x65\\x0b\\x80\\x3c\\x53\\x1d\\x06\\x77\\x5a\\xe5\\xce\\xea\\x28\\xbb\\x92\\xe9\\xa0\\xed\\xec\\x89\\x51\\xce\\x20\\x09\\xa8\\x8e\\xe1\\xb6\\x4d\\x9b\\x9e\\x89\\xf6\\x90\\x51\\x20\\x33\\x84\\x21\\x0a\\x10\\x2a\\x44\\xd2\\xd6\\x70\\x31\\x73\\xb6\\x85\\x07\\xdc\\xea\\xdd\\x3b\\xf6\\x51\\x0d\\xf2\\xa5\\xce\\xfd\\x9c\\x80\\xe4\\xf3\\x85\\xb2\\xf9\\xe6\\x21\\x58\\x13\\xed\\x32\"},\n{{0x11,0x26,0x49,0x6a,0x58,0x2c,0xe5,0x8d,0x3d,0x61,0x8d,0xd8,0xa3,0x93,0x35,0x47,0xaa,0x7a,0x8a,0x30,0xfb,0x54,0x06,0x3b,0x8d,0xfd,0xd3,0x16,0x71,0xc6,0xc7,0x3d,},{0xe1,0x02,0x29,0xc6,0x23,0xfa,0x8a,0xd8,0x98,0x2c,0x3e,0x4c,0x36,0xff,0x52,0xdf,0x0f,0x21,0x9b,0x57,0x91,0x5b,0x6e,0x98,0x0e,0x5f,0xe7,0x2e,0xa0,0x96,0x2e,0x22,},{0xb3,0x0e,0xb5,0x6c,0xa9,0xb1,0x20,0xbf,0x84,0x9a,0x3a,0x9d,0x56,0xaf,0x03,0x3d,0xe8,0xa5,0x90,0xc9,0xe1,0x24,0x0c,0x1e,0x36,0xdb,0xc6,0xcf,0x0a,0x71,0xb7,0x8a,0x11,0xec,0x14,0x3f,0xb9,0x95,0x9a,0x8f,0x25,0xb5,0x77,0x11,0xd6,0xa9,0x0a,0x67,0xe0,0x1b,0xe3,0xa4,0xda,0x2b,0x69,0x39,0x48,0x69,0xbb,0x8d,0x64,0xb8,0x7e,0x0f,},\"\\x6a\\x4b\\x52\\xd7\\x30\\xdd\\xab\\x82\\x9b\\x2a\\x17\\x95\\x90\\xcb\\xd4\\xc3\\x72\\x49\\x8e\\x9f\\x43\\x99\\x77\\xc0\\xa1\\x0d\\xc1\\x3c\\x0a\\xe1\\x73\\x6e\\xaa\\xff\\x06\\x33\\x71\\x43\\x4f\\xd0\\xda\\x80\\x36\\x0e\\xc5\\x89\\x06\\x07\\xd2\\xfa\\xe1\\xc9\\xa2\\xe1\\xab\\x0b\\x7f\\x3d\\x66\\x7f\\x5b\\x1b\\x9c\\x41\\x8f\\x18\\xb1\\x0c\\x9e\\x6f\\xd6\\x69\\xd3\\xeb\\xec\\x16\\x8e\\xfe\\xf4\\x41\\x63\\xe5\\x77\\xa2\\xeb\\xd0\\xf2\\xcb\\x76\\x8f\\x80\\xc2\\x31\\x88\\xe8\\x60\\x69\\xe4\\xd1\\x0f\\x41\\x03\\x06\\xce\\xdd\\x7a\\x34\\x1a\\x61\\xe0\\xf4\\xf3\\xbc\\x25\\x04\\x1b\\xc2\\xf9\\x22\\xed\\x07\\x3e\\x1e\\x2f\\x1b\\x70\\x9c\\x57\\x9d\\x10\\x63\\x0f\\x33\\x07\\x17\\x54\\xd7\\x07\\x89\\x4a\\x1c\\x62\\x19\\x0d\\xe1\\x88\\x82\\xc5\\x64\\xdc\\x4c\\x01\\xdc\\x54\\x5d\\xd8\\x96\\x64\\x04\\xed\\x78\\xfa\\x32\\x67\\xa9\\x46\\x9f\\x63\\xb6\\x12\\x0a\\xbb\\x65\\xf9\\xb3\\xba\\x3e\\xee\\x28\\xd7\\x9c\\x2e\\xb4\\xe7\\x02\\x0c\\xc6\\x98\\x7d\\xfc\\x5c\\x29\\x67\\x2f\\x8c\\x0f\\xa3\\xe6\\x90\\xd5\\x84\\xfe\\x00\\x0c\\x64\\xf3\\x52\\x61\\x01\\x79\\x62\\x1b\\xfd\\x5f\\xf3\\xeb\\x30\\xd1\\x8f\\x1a\\x02\\x50\\x41\\x6d\\xb9\\x3b\\x1c\\x1e\\x93\\xcf\\x8a\\x36\\x46\\x51\\x75\\x60\\xd1\\xcc\\x8f\\xff\\x82\\x2b\\x51\\xef\\x27\\xb2\\x00\\xe9\\x87\\xb5\\x92\\x39\\x07\\x53\\x45\\x3e\\xf1\\x38\\xbd\\x3d\\x29\\xdb\\x7c\\xb1\\xb5\\xf4\\x5e\\x47\\x95\\xb8\\x9c\\x53\\xf4\\x97\\x04\\x19\\x27\\x52\\x23\\x7c\\x6a\\xb2\\x74\\x84\\x9f\\x95\\x94\\xee\\x97\\x77\\xf6\\xef\\xe7\\x04\\x83\\x12\\x9d\\x06\\x7f\\x97\\x19\\x9d\\x9a\\xe3\\x60\\x90\\x70\\x38\\x64\\xf7\\xca\\x47\\x50\\xa6\\xf3\\xb6\\xff\\x83\\x82\\x4c\\x91\\x04\\x84\\x39\\x4d\\x1e\\x2e\\xce\\xba\\x18\\x44\\x6f\\xe4\\xe9\\x94\\xce\\x07\\x43\\x3a\\x74\\x0d\\xdd\\x05\\xf0\\xe3\\x96\\xd4\\x82\\x89\\x4e\\x6f\\x14\\xac\\xf7\\xb9\\x7b\\xae\\x6c\\x7e\\xb8\\x87\\x03\\x03\\x9f\\xa7\\x85\\xd6\\x0a\\x3a\\xf7\\x8b\\x13\\x24\\x3a\\x4f\\x88\\xdd\\xe1\\xd9\\x98\\x61\\x7f\\x2e\\x3f\\xa7\\xea\\xfc\\x2f\\x43\\x5d\\xd4\\xac\\x1e\\xa9\\xc2\\x38\\x40\\x7a\\xa0\\x9b\\x4e\\xea\\x8e\\xd4\\x34\\x92\\x7b\\x40\\x66\\x74\\xac\\x27\\x04\\x58\\xcf\\xb3\\xbf\\x29\\xc3\\x47\\xf9\\x45\\x59\\x61\\x31\\x79\\xb9\\x50\\x21\\x92\\x32\\x1b\\x88\\xe9\\xaf\\x0a\\x90\\xe9\\xa4\\xab\\x9e\\xdd\\xaa\\xe3\\x82\\xe3\\x73\\x4d\\x14\\x15\\xeb\\xe3\\x24\\x99\\xc3\\x4e\\x6f\\xde\\xaf\\x15\\xb0\\xd9\\x78\\x79\\x85\\xe0\\x8d\\xfe\\x49\\x54\\x60\\xc5\\x4f\\x67\\x43\\xd8\\x1f\\xf1\\x68\\x81\\xe5\\xe3\\x0c\\x51\\xf4\\xb0\\x92\\x37\\x37\\x83\\xf1\\x24\\x23\\xc3\\xe1\\xae\\x85\\x91\\x13\\x0a\\x26\\x99\\x80\\xca\\xa1\\xcb\\x5c\"},\n{{0x9c,0x16,0x7a,0xff,0x3b,0x1b,0x78,0x8f,0x13,0x3d,0x42,0x2d,0xe8,0xca,0x9a,0x64,0x31,0x64,0x09,0xf9,0xe3,0x5b,0xfe,0x22,0x03,0x2e,0xc4,0x17,0xae,0x9a,0xbc,0x6d,},{0xef,0xb5,0x34,0xf0,0xd4,0x7c,0x06,0x8e,0x77,0xb2,0x8a,0x90,0x6d,0x95,0xad,0x8d,0x21,0x3a,0x4d,0x4f,0xc1,0xc7,0x05,0x42,0xf0,0x1e,0x59,0x6d,0x57,0xb5,0xf0,0x19,},{0xc9,0xae,0x67,0xfd,0x64,0x15,0xdc,0xba,0xb2,0x92,0xfa,0xb3,0x94,0xca,0x6c,0x3b,0x7d,0x90,0xca,0x24,0x4d,0xc6,0xa7,0x76,0x4e,0x74,0xfd,0x20,0x2b,0xf4,0xb2,0x90,0x5b,0xd2,0x03,0x0e,0x6b,0xeb,0x91,0x4c,0x3c,0x23,0x8d,0xb3,0x71,0xb1,0xcb,0xa6,0xd9,0x26,0x1a,0xa3,0x92,0xec,0x87,0x1a,0x4b,0x8b,0x12,0xfe,0x9c,0x1c,0x97,0x0e,},\"\\x68\\xac\\x0f\\xc2\\xb6\\x07\\xba\\x38\\xe3\\x77\\xfa\\xe8\\x45\\xc8\\x08\\xc8\\xf9\\xfa\\x61\\x4e\\xb1\\xf3\\x11\\x58\\xa9\\x62\\x0a\\x93\\x7d\\x3e\\x30\\x1e\\x85\\xac\\xaa\\x69\\x14\\x4b\\xc3\\x49\\xa3\\x9d\\xfb\\x58\\x20\\x41\\xc4\\xa1\\x97\\xae\\x99\\xb4\\xd4\\xd5\\x9b\\x7a\\x2c\\xa3\\xd1\\x62\\x28\\xb5\\x59\\x1c\\xbf\\x57\\xc1\\x8a\\x78\\x1e\\xfd\\x19\\x19\\x3c\\x47\\xb1\\x6c\\x60\\x23\\xa3\\xa8\\xba\\x3d\\x66\\x8f\\x05\\xa3\\x7f\\x1e\\x83\\xb0\\xd7\\xfe\\xbd\\xd1\\x0f\\x63\\xe4\\x8e\\xf7\\xa2\\x0e\\x01\\x5b\\x1c\\x67\\x25\\xd4\\xc3\\x00\\xa9\\x86\\xc6\\x0e\\x3a\\x11\\x54\\x69\\xc8\\xe5\\x2b\\xa0\\x5b\\x51\\xc0\\x5d\\x0a\\xf4\\x0d\\x89\\xfd\\x9e\\xd7\\x6f\\x36\\x95\\x0a\\xee\\x3c\\x78\\x19\\x89\\x8a\\x90\\x3c\\xfe\\x03\\x61\\xa9\\x1c\\x69\\x10\\x0b\\x49\\x51\\x41\\xe8\\x6e\\xe7\\x9d\\x63\\xd1\\x74\\x03\\xfb\\x1a\\x16\\x29\\xef\\x63\\xcb\\x7e\\x9d\\x27\\x20\\xcb\\xff\\xf0\\x00\\x2b\\x19\\x0b\\xcd\\xc2\\x67\\x94\\x12\\x4d\\xd3\\x8d\\x42\\xbc\\xaa\\x71\\x75\\x40\\x5e\\xb0\\xbb\\xcf\\x8e\\x37\\xd6\\x5d\\x05\\xa3\\x71\\x95\\xb4\\x79\\x37\\x1f\\xa2\\xbb\\xbb\\x16\\x7d\\x91\\xce\\xe8\\x82\\x35\\xdd\\x72\\xea\\x88\\xfc\\x73\\xce\\x3c\\xe4\\x3d\\x33\\xb7\\x15\\xf2\\x5f\\x19\\x2e\\xc2\\x15\\xda\\xc1\\x24\\x89\\x9c\\x5e\\x75\\x86\\xe8\\x63\\x40\\xd8\\xcb\\xe5\\x37\\x35\\xde\\xfb\\xe0\\x2e\\x4c\\xc9\\xfd\\xe6\\x9f\\xb9\\x79\\x4d\\x1d\\xb7\\x2b\\x98\\xc0\\xf1\\x97\\x66\\xee\\x51\\x38\\xbb\\xfa\\x78\\x90\\x9a\\xa2\\x99\\xb4\\x91\\x3c\\x49\\x9d\\xea\\xf5\\x4b\\x48\\x41\\xd5\\x04\\x48\\x29\\x98\\x49\\x36\\x70\\x0d\\xcf\\x92\\xf3\\x65\\x42\\xb2\\xfc\\x7e\\x86\\x44\\x1b\\x99\\x25\\xf5\\xd0\\xb7\\x8c\\x17\\xa8\\x5c\\xfc\\xfc\\xb2\\x0b\\x0f\\xd7\\x51\\x34\\x9c\\x27\\x46\\x3a\\xbd\\xe4\\xd2\\x7d\\xf7\\x42\\x65\\x28\\x87\\x13\\xf9\\x6d\\xea\\x01\\x3b\\x94\\x55\\x21\\x80\\x8b\\x49\\x96\\xb1\\xb2\\xdc\\x03\\x38\\xb6\\xd2\\x36\\xef\\xd6\\xd2\\xb2\\x7d\\xaf\\xda\\x46\\xec\\x5f\\xa3\\x2b\\x96\\x5e\\x8b\\xb5\\xe8\\xbb\\x61\\xbd\\x96\\x6e\\xde\\xb7\\x74\\x68\\x1e\\x0e\\xa8\\xc1\\x7b\\x8c\\x99\\xfa\\x7d\\x66\\x0f\\x0f\\x66\\xc9\\xbc\\x6d\\x95\\xcb\\xd7\\xdc\\x09\\x47\\x24\\x09\\x8e\\xb0\\x51\\x91\\xb5\\x3a\\x3d\\xf6\\x56\\x6b\\x9c\\x90\\xe0\\xd7\\xdf\\xf2\\x94\\x38\\x48\\xb6\\x1a\\x20\\xd4\\x8c\\x22\\xb6\\xd3\\xc9\\x58\\xe2\\x93\\xd7\\x09\\xc8\\xf4\\x81\\x10\\x23\\x0f\\xf5\\x19\\x18\\x56\\x28\\x77\\xda\\xf6\\xd9\\x20\\xc8\\x5a\\x82\\xe0\\x7c\\x45\\x1f\\xe7\\xae\\x97\\x59\\xc0\\xa7\\x7e\\x97\\xbb\\x29\\x8b\\x5d\\x05\\x92\\xa4\\x1d\\x08\\xf6\\x7a\\x4e\\xd5\\xa1\\xbb\\x41\\xe9\\x37\\xb6\\xa6\\x8a\\xeb\\x38\\xfd\\x5b\\xe9\"},\n{{0xe9,0x94,0x88,0x05,0xeb,0x34,0x1b,0x28,0x67,0x47,0x9c,0x66,0x8f,0xd3,0x53,0x2c,0x30,0x99,0x41,0xc0,0xad,0x4c,0xb2,0xe5,0x42,0x31,0x75,0x6e,0x6a,0x1b,0xde,0xcb,},{0x54,0x47,0xa8,0xe3,0x4d,0x6a,0x64,0x00,0x02,0xd8,0xd6,0x0b,0xcf,0x1d,0xdc,0x71,0x1e,0x4c,0x46,0x5c,0x94,0xc3,0x4b,0x50,0xbd,0xef,0x35,0x89,0x60,0xff,0x81,0xf1,},{0xd3,0xdc,0x62,0xd6,0xce,0x9c,0x76,0x6f,0x2a,0xba,0xf9,0xa7,0xfb,0xe0,0x9d,0x6b,0xdb,0x07,0xa4,0x74,0x7b,0x56,0x08,0x0d,0xb0,0x9b,0xeb,0x4a,0x4e,0x80,0x4a,0x70,0xd7,0xdd,0xf4,0x11,0x94,0x75,0xc7,0xbe,0x83,0x4f,0x31,0x95,0x6f,0x4a,0x71,0xda,0xd0,0x29,0xcd,0xf2,0x36,0x3d,0xd0,0x36,0x5c,0xe2,0x2d,0xc2,0x7f,0x07,0x80,0x03,},\"\\x91\\xcf\\xfd\\x7e\\xb1\\xcf\\x6b\\xd4\\x75\\x6b\\xce\\x6a\\x30\\xaf\\x9d\\xfb\\xa2\\x6d\\xdd\\x1c\\xce\\x03\\x94\\xc1\\x94\\xa3\\xe3\\x9c\\xc3\\xd1\\xcb\\xc2\\x21\\xb7\\xeb\\x70\\xbe\\xa1\\x8d\\x29\\xc2\\x67\\x45\\x71\\x76\\xa3\\xc9\\xe5\\x3c\\x18\\xe4\\x7d\\x10\\xa6\\x7c\\x46\\x45\\x05\\x19\\x77\\x02\\xe6\\xb2\\x47\\x0d\\x38\\x86\\x9d\\xb5\\x17\\x4b\\x15\\x8f\\x99\\x92\\xe4\\x43\\x5d\\x02\\x24\\x6f\\x54\\x02\\x58\\xde\\xdd\\x3c\\xe3\\x3d\\xf5\\x82\\x55\\x5a\\x68\\x1f\\xb7\\x6e\\xca\\xcc\\xb1\\xc2\\x98\\x9b\\x17\\x7e\\x3b\\x7e\\x45\\x4a\\xaa\\x52\\x9d\\xe5\\x9b\\xf5\\xa0\\x31\\x23\\xd5\\x71\\xdf\\x2e\\x7f\\x7c\\xb8\\x30\\x80\\x5c\\x58\\xb7\\x4a\\x65\\x3b\\xac\\x0e\\x5a\\x88\\x8e\\x08\\xdc\\x22\\x36\\xd6\\xcd\\x49\\x6a\\xa0\\x6d\\x0d\\x67\\xcf\\x3b\\x33\\x5e\\x21\\x8c\\x49\\xde\\xda\\xd8\\x2f\\xc1\\xbe\\x9e\\xf2\\x0c\\xac\\x61\\x90\\x5c\\x30\\xeb\\x13\\x2d\\x73\\x9b\\x16\\xca\\x8a\\x8c\\x90\\x66\\x19\\xc0\\xe0\\xd8\\xb3\\x39\\x85\\x32\\x7e\\x36\\xf3\\xd4\\xb8\\xfd\\xa3\\x87\\xc1\\x86\\xcc\\x50\\x44\\x31\\x04\\xdb\\x76\\x1f\\x7f\\xf9\\x30\\x12\\x70\\x20\\x4a\\x71\\x3e\\x58\\x90\\x21\\x01\\xfa\\xd0\\x00\\xce\\x93\\x16\\x47\\xc5\\x77\\xfd\\xec\\x14\\x8d\\xca\\x95\\xcd\\xc0\\x89\\x18\\xeb\\xed\\x03\\x7c\\x60\\x33\\x2f\\xad\\xf0\\x88\\xf0\\x36\\x08\\x3e\\xbc\\x92\\xe1\\x73\\xb7\\xdd\\xcc\\x30\\xc4\\x93\\xf2\\x7e\\x69\\xcd\\x17\\xa2\\x0d\\x30\\xb7\\x8f\\x83\\xa7\\x2e\\x4f\\x5a\\x74\\x7d\\x86\\xd9\\x6c\\x5e\\x1b\\xb7\\xa4\\x38\\x16\\x62\\x04\\x01\\x3e\\x21\\x64\\xd6\\xaa\\xbc\\x0d\\x56\\x2f\\x54\\x01\\x5c\\x36\\x5c\\x80\\x44\\x56\\x07\\x14\\x5e\\x56\\x92\\xee\\x34\\xf6\\x35\\x30\\x77\\xfa\\xb7\\x45\\x2d\\x88\\xce\\x3e\\xb0\\x1d\\x2b\\x37\\x97\\xdc\\x91\\xb3\\x41\\xa3\\xa7\\x26\\x30\\x15\\x16\\xba\\xae\\x18\\xe8\\x51\\xf7\\x4d\\xfb\\xdf\\x08\\x66\\xbb\\x23\\x76\\x86\\x7d\\xe5\\x52\\x31\\xe3\\x62\\xc4\\x72\\xc5\\x21\\x16\\x54\\x4c\\xd4\\xf8\\x1e\\x93\\x57\\x1c\\x4e\\xc8\\x20\\xe7\\xe6\\x53\\xf4\\xe2\\x1b\\xe0\\xa9\\x42\\x57\\x6c\\x9d\\xe9\\x1e\\x7d\\x12\\x51\\x68\\x3d\\x85\\x9d\\xe4\\x48\\xf8\\x22\\xdc\\xf3\\xd2\\xcf\\x55\\xed\\xe2\\xf9\\xc7\\x1b\\x60\\x63\\xd1\\x37\\x30\\x61\\xf8\\xf5\\x93\\x6b\\x69\\x8d\\x13\\x84\\xe6\\x54\\x59\\xea\\x2b\\xc2\\x6e\\xc9\\x67\\x75\\xef\\x42\\x52\\x07\\x43\\x2d\\xda\\x0a\\xc1\\xfe\\x28\\x52\\x6c\\x5e\\x45\\x59\\x34\\x9c\\x3d\\x8d\\xf9\\x91\\x82\\x30\\xf4\\x04\\x46\\x83\\xcc\\x2c\\x1b\\x85\\x8d\\x14\\x1a\\xb8\\xd0\\x80\\x5b\\xb9\\x33\\x60\\x67\\x52\\x2a\\xa8\\x9c\\x81\\x0f\\x3e\\xaa\\x7a\\xc2\\xd8\\xdd\\x28\\xc3\\x75\\x12\\x25\\xa1\\x9e\\xce\\xc8\\xbc\\xca\\x52\\x43\\x99\\x46\"},\n{{0xb0,0x17,0x53,0xef,0xa7,0x3b,0xb3,0xde,0x7a,0xa7,0x78,0xbe,0x7a,0xfc,0xbf,0xf6,0x6a,0x5d,0x3e,0x2c,0x2f,0x8b,0x5a,0xa2,0xb0,0x48,0x84,0x40,0x50,0x99,0x69,0x65,},{0xd0,0xcc,0x6c,0xf1,0x09,0xc9,0x99,0xfb,0xf6,0xd1,0x6f,0x47,0x1f,0xaf,0xd0,0x23,0x2b,0x0a,0x68,0xd4,0xc4,0x64,0x06,0xec,0x75,0x45,0xdb,0xab,0xa8,0x19,0x41,0x58,},{0x16,0xb7,0x42,0x12,0x27,0xae,0x09,0x13,0x06,0x85,0xcb,0xb1,0xa0,0xc6,0x0a,0xa5,0x7a,0x5e,0x1a,0xfe,0x1b,0xbe,0x6b,0xac,0xea,0x0c,0x28,0x1b,0xcc,0x89,0x98,0xe6,0x82,0x4a,0x77,0x2c,0x32,0x08,0xa6,0xb6,0xb4,0xd2,0x36,0x69,0x55,0x05,0xc9,0xbe,0x82,0x70,0x0c,0xf9,0x3a,0x78,0x39,0x85,0xa3,0x9e,0x16,0xe3,0x77,0xa7,0x41,0x0e,},\"\\x68\\x4e\\x61\\x2f\\x27\\xee\\xad\\x0d\\x34\\x84\\x4c\\xc8\\x1b\\xa9\\x11\\xc2\\x8a\\xaf\\x6d\\x66\\xe7\\x12\\x29\\xe8\\xcc\\x34\\x62\\xf7\\xc7\\xa0\\x50\\xda\\xa3\\x0c\\xb7\\x44\\x71\\x15\\x0f\\x07\\xda\\xd4\\x59\\xb5\\xa9\\x13\\x58\\x47\\x6c\\x05\\x98\\x25\\x5d\\x8a\\x64\\x2d\\xd7\\xc0\\x80\\x28\\x11\\xbd\\x88\\xe4\\xca\\xc5\\x97\\xef\\xe4\\x1e\\xbd\\x96\\xcd\\x0f\\x3b\\x5c\\xe7\\x2d\\xb4\\xbe\\x1a\\x3d\\xbd\\x6b\\x84\\xf5\\x44\\x6e\\x3d\\xa6\\x00\\xd3\\xb1\\xd2\\xb4\\x60\\xa0\\x09\\xbd\\x31\\xca\\xcd\\x98\\xa9\\x15\\x18\\xce\\x33\\xe9\\xa7\\x03\\xd4\\x04\\x28\\x87\\x36\\xcc\\xc4\\x31\\x03\\xfc\\x69\\xe6\\x79\\x74\\xf3\\x16\\x52\\xfa\\x3d\\xad\\xef\\x33\\x37\\xf6\\xc8\\x97\\xa3\\xd2\\x01\\x30\\x3c\\x8f\\x03\\x59\\x7b\\x4a\\x87\\xc9\\x8f\\x29\\x1c\\xcd\\x58\\xa3\\xf1\\xe8\\x98\\x33\\x2a\\xa5\\x99\\x3b\\x47\\xfc\\xb5\\xdd\\xaa\\x1c\\x08\\x68\\xb6\\x43\\x74\\x2d\\x0e\\x4a\\x4b\\x9c\\xd4\\x27\\x03\\x8b\\x3b\\x74\\x99\\x9b\\xc8\\x9a\\xc3\\x48\\x4c\\x0c\\xa1\\x3f\\x25\\xaa\\xe8\\xe7\\x8a\\xe1\\xcc\\xee\\x62\\x18\\xac\\xca\\xb8\\x1a\\x4f\\x69\\x4f\\x53\\x24\\xa3\\x47\\x62\\x9d\\x49\\xb5\\x5e\\x40\\x37\\x50\\x4a\\x9a\\xcc\\x8d\\xf5\\x8c\\x68\\x41\\xdd\\xdc\\xd4\\xfc\\x43\\x47\\xf7\\xb6\\xf1\\xfd\\x9d\\xe0\\x56\\x45\\x77\\xe6\\xf3\\x29\\xed\\x95\\x1a\\x0a\\x6b\\x91\\x24\\xff\\x63\\xe2\\x2e\\xb3\\x6d\\x3a\\x88\\x63\\xbc\\x1b\\xf6\\x9c\\xea\\x24\\xc6\\x05\\x96\\x7e\\x7d\\x89\\x48\\x95\\x3f\\x27\\xd5\\xc4\\xc7\\x5f\\x08\\x49\\xf8\\x72\\xa3\\xe3\\xd1\\x6d\\x42\\x2f\\xa5\\xa1\\x1e\\x1b\\x9a\\x74\\xdf\\x6f\\x38\\xb9\\x0f\\x27\\x7d\\x81\\xfc\\xe8\\x43\\x7a\\x14\\xd9\\x9d\\x2b\\xef\\x18\\x9d\\x7c\\xac\\x83\\xdd\\xc6\\x13\\x77\\xed\\x34\\x8b\\x3c\\x4f\\xc0\\x9e\\xc2\\xb9\\x00\\x59\\x25\\xd0\\x4a\\x71\\xe2\\x6d\\x64\\x16\\x67\\xbd\\xf5\\x49\\x29\\x43\\x31\\xc6\\xea\\x01\\xcd\\x5c\\x0b\\xd1\\xb6\\xa7\\xec\\xfd\\xa2\\x0b\\x0f\\x19\\x29\\x58\\x2b\\x74\\x69\\x7c\\xb2\\x62\\xc3\\x92\\x7d\\x6b\\x22\\x3f\\x4b\\x5f\\x30\\x43\\xaa\\x6e\\xb4\\x57\\x1a\\x78\\xe9\\xda\\x11\\xc2\\xb3\\x6f\\x64\\x55\\x25\\x80\\xca\\xa7\\xb5\\xfa\\x6b\\x90\\xf9\\x29\\xe0\\x16\\x2e\\x60\\x8d\\x12\\x40\\xd7\\x24\\x2c\\xd2\\xf4\\x70\\x25\\xc0\\x3d\\xeb\\xe0\\x59\\xb1\\xdc\\x94\\x77\\x02\\x32\\xbc\\x67\\x65\\x14\\x84\\x80\\xbb\\x1d\\x9f\\x50\\xda\\x1e\\xe6\\x44\\x8c\\xf9\\xc8\\x8b\\x19\\xdd\\x45\\x99\\x32\\xc0\\x6e\\xd8\\x11\\xc4\\xa6\\x4a\\x12\\xd5\\x93\\x8b\\xd1\\xc7\\x57\\xbc\\xfa\\xea\\xee\\x89\\x33\\xfe\\x5f\\xff\\x21\\x76\\x3d\\xe7\\x40\\x48\\x2b\\xcf\\x1b\\xa5\\x9a\\xfd\\xc8\\xfc\\xf8\\x73\\xc3\\xd5\\x07\\xbb\\x39\\x4e\\x32\\xe4\\x5f\\x73\\x65\\x19\"},\n{{0x4f,0x4b,0x20,0xd8,0x99,0x36,0x6f,0x2f,0x23,0xee,0x62,0x8f,0x22,0x9b,0x23,0x6c,0xf8,0x0f,0x43,0xba,0x18,0x31,0x77,0xc9,0x7e,0xe3,0x48,0x29,0x54,0x6f,0x17,0x42,},{0xc9,0x45,0x76,0x64,0x1f,0x4a,0x89,0x3c,0xdf,0xce,0xe7,0xb3,0x9f,0xc2,0x19,0x29,0xb8,0x6b,0x34,0x99,0x76,0xd7,0xb0,0xa4,0x6d,0x39,0xa5,0x88,0xbc,0xfe,0x43,0x57,},{0x0f,0x80,0xff,0x5d,0x17,0x48,0x8f,0xe2,0x6f,0x93,0xc5,0x43,0xb0,0x4e,0xd9,0x59,0xb5,0xf0,0x64,0x3f,0xc6,0x1c,0x7f,0x2c,0x3b,0xc6,0x01,0x32,0xba,0x9c,0x62,0x10,0xc8,0xb2,0x50,0xea,0x5e,0x84,0xd0,0x7b,0x01,0xde,0x68,0xbc,0x17,0x44,0x14,0xee,0xeb,0x31,0xfd,0xc2,0xba,0x68,0x23,0xe2,0x31,0xe3,0x12,0xa9,0x1e,0xde,0xdd,0x02,},\"\\xdb\\x8e\\xf0\\x2e\\x30\\x33\\xe6\\xb9\\x6a\\x56\\xca\\xb0\\x50\\x82\\xfb\\x46\\x95\\xf4\\xa1\\xc9\\x16\\x25\\x0d\\xd7\\x51\\x73\\xf4\\x30\\xa1\\x0c\\x94\\x68\\x81\\x77\\x09\\xd3\\x76\\x23\\x34\\x6a\\xe8\\x24\\x5b\\x42\\xbd\\xa0\\xda\\x6b\\x60\\x46\\x2c\\xcf\\xdf\\xc7\\x5a\\x9a\\xb9\\x94\\xe6\\x6c\\x9a\\xb9\\xfe\\xcd\\xd8\\x59\\x96\\x10\\x91\\x0a\\xff\\xe4\\xf1\\x02\\x15\\xcb\\x28\\x0b\\xf8\\xf9\\xf2\\x70\\x0a\\x44\\x47\\x96\\xda\\xe9\\x3e\\x06\\xc6\\xbe\\xa7\\xd8\\xb4\\xfe\\x13\\x01\\xba\\xa7\\x9c\\xce\\xc7\\x69\\x36\\x8f\\xeb\\x24\\x42\\xc7\\xde\\x84\\xf0\\x95\\xe6\\xb3\\xbf\\xf6\\x3d\\x38\\x8c\\xba\\xfb\\x2b\\x98\\x09\\xdc\\x38\\xe9\\xb1\\x2e\\xbd\\x03\\x9c\\x0a\\x57\\xf4\\xd5\\x22\\xe9\\x1e\\xc8\\xd1\\xf2\\xb8\\xd2\\x3a\\x4a\\x0a\\xe0\\x59\\xaf\\x85\\x39\\x3b\\xb0\\xa1\\x5f\\x74\\x91\\x10\\xf6\\x77\\x4a\\x1f\\xd7\\x31\\xa6\\xec\\x21\\x3e\\x4f\\xf4\\x35\\xda\\xab\\x54\\x6d\\x31\\xed\\x9e\\xc3\\xb6\\xd8\\xcc\\x2e\\xda\\xce\\xbf\\x4f\\xac\\xc5\\x56\\x65\\x56\\xee\\xa9\\x2e\\x5b\\x3f\\x25\\x42\\x23\\x9b\\x25\\xe2\\x80\\x12\\xdd\\x4e\\xf4\\x00\\x72\\xee\\xbf\\x83\\xed\\x2a\\x25\\x51\\x81\\xf3\\xa4\\x42\\x18\\x9d\\x68\\xc6\\xc6\\x09\\xf4\\xdf\\xdf\\x3d\\xb7\\xd6\\x7d\\x08\\x7a\\x2f\\xcd\\x6d\\x2d\\xc5\\x0b\\xbf\\xed\\x8b\\xfb\\xbf\\xcb\\x74\\xd3\\xc4\\x1f\\x02\\xa8\\x78\\x65\\xb1\\x3b\\x8e\\xfc\\xf5\\xc3\\x58\\x12\\x57\\xbe\\x0a\\xa9\\x13\\xf6\\x0c\\x37\\x05\\x27\\xbd\\xe1\\x1a\\x47\\x5c\\x13\\x6a\\x17\\xc5\\xee\\xfe\\xb0\\x3f\\x5b\\xff\\x28\\x69\\x3e\\xd8\\x41\\xe8\\xed\\x1f\\x7c\\x29\\x10\\x2f\\x55\\x99\\xdd\\x44\\x40\\x09\\xbc\\xea\\x6a\\x92\\xd5\\x57\\x41\\x52\\x45\\x8e\\x0c\\xaf\\x8a\\x36\\xaa\\x72\\xb5\\xdc\\x49\\x08\\xa6\\x46\\x1c\\x9b\\x74\\x14\\x53\\x00\\x5c\\x8f\\xbc\\xc6\\x81\\x13\\xae\\x18\\x42\\x08\\xee\\x14\\xb8\\x35\\x48\\x0c\\x6e\\xfa\\xfe\\xd1\\x8a\\x76\\x00\\x0b\\x38\\xe5\\x85\\x82\\x90\\xf4\\xd5\\x1f\\x52\\xf0\\x96\\xcb\\xe4\\x90\\xe1\\xeb\\x5c\\xac\\xb2\\x26\\xec\\x49\\x5a\\x55\\xa7\\xfa\\x45\\x78\\x43\\xd5\\x7f\\xab\\x67\\xf8\\xbe\\x7e\\x20\\x93\\x34\\x78\\x5b\\xdd\\x66\\x5d\\x7b\\x63\\xe4\\xda\\xf5\\x7b\\x6e\\x78\\x92\\x8b\\x60\\x3c\\x8c\\x0f\\x9b\\xc8\\x54\\x64\\x73\\x3b\\x61\\x27\\x3e\\xf9\\xe2\\xb8\\xa0\\xcd\\x7c\\x3b\\xf8\\xee\\x0a\\x68\\x72\\xe3\\x4d\\x5a\\x27\\xa6\\x25\\xe3\\x5e\\xaf\\x7f\\xf5\\x44\\x0b\\x8b\\x14\\x1a\\xf7\\x04\\xdf\\x70\\xc9\\xc1\\x86\\x23\\xbd\\x11\\x20\\x95\\x13\\x19\\x25\\x05\\x10\\x5c\\xd7\\xbc\\xfa\\x5f\\x0d\\x91\\x9d\\xa7\\x06\\x94\\x8f\\xbe\\x1f\\x76\\x1f\\x31\\x58\\x46\\xaa\\x3b\\x48\\x13\\xdd\\x9b\\xa3\\xd8\\x1b\\x92\\x04\\xe5\\x40\\x9c\\x03\\x82\\xb6\\xeb\"},\n{{0xd2,0xe0,0x1d,0x25,0x78,0xb6,0x25,0xa7,0x06,0x0a,0xab,0xc2,0x57,0x65,0xf1,0x68,0xc6,0x80,0xce,0xf7,0x67,0xaa,0x97,0xca,0x0e,0x5e,0xb3,0xd6,0x67,0x47,0x4b,0x2a,},{0x19,0x1a,0xc2,0x23,0x57,0x54,0x24,0xaa,0x35,0x4b,0x25,0x5b,0x81,0x2d,0xd3,0x02,0x5d,0x70,0xed,0x82,0x9e,0x08,0x26,0xc0,0x16,0x29,0xf9,0xdf,0x35,0x45,0x08,0x2b,},{0x87,0xa0,0x10,0x39,0x4a,0x9f,0x2c,0x90,0x4e,0xff,0xef,0xca,0x9f,0xb4,0xd5,0xce,0x13,0x79,0x33,0x01,0xa4,0x92,0x5b,0xa5,0x1d,0xb1,0x19,0x12,0x3a,0x4d,0x73,0x0a,0xbf,0x76,0x4c,0xe0,0x65,0xe4,0x8d,0x90,0xa7,0x9d,0x90,0x7d,0x72,0x54,0xc4,0x0c,0xc3,0x58,0x98,0x7a,0x46,0x94,0x9e,0x92,0x8b,0xbb,0x3c,0xd0,0x85,0xdf,0xab,0x06,},\"\\x20\\xd5\\xdd\\x69\\x9b\\x28\\x53\\x30\\x2a\\x68\\x17\\x09\\x4d\\x5e\\xa5\\x12\\xbd\\xf8\\x53\\x45\\x04\\xcb\\x28\\x9c\\x60\\x24\\x67\\x41\\x07\\x40\\xec\\x7e\\xb8\\xea\\x64\\x42\\xc8\\x0f\\x14\\x59\\x35\\x06\\x8f\\x91\\x22\\xfd\\xf4\\xa3\\x9f\\x20\\x10\\xf3\\x3d\\xb5\\x5b\\x81\\x4d\\x97\\xbf\\x2e\\x58\\x72\\x32\\x9f\\x11\\x26\\xd4\\xeb\\x95\\xb8\\x06\\xca\\x19\\x73\\x11\\x31\\x65\\xb1\\x16\\xbe\\x87\\x16\\x37\\x1f\\x81\\x33\\x17\\x79\\xdc\\x79\\xa5\\xcb\\x39\\x42\\x08\\x1a\\xb5\\xf2\\x07\\xf6\\xb5\\x3d\\xb0\\xe0\\x03\\x81\\x07\\xd6\\x3c\\xa9\\x77\\x08\\x18\\x19\\x82\\xdc\\xb5\\xf3\\xb9\\x30\\x10\\xec\\x6e\\xdf\\xb2\\xcf\\xd3\\x1c\\xab\\x00\\x09\\x0b\\x3c\\x38\\x51\\x5f\\x97\\x81\\x76\\x96\\x86\\xcb\\x17\\xab\\x81\\xd5\\x4a\\x8b\\x77\\x57\\x54\\xd4\\x2f\\xba\\xd0\\x86\\xb8\\x0b\\x28\\xd6\\x36\\xf7\\x8b\\x7e\\xb7\\x7e\\xd9\\xca\\x35\\xb6\\x84\\x3a\\x51\\x0f\\x0a\\xd0\\xac\\x1b\\x20\\x26\\x7a\\x00\\x03\\x01\\xb3\\xc7\\x07\\xa2\\x0f\\x02\\x14\\xd5\\x9b\\x5b\\x81\\x99\\xc2\\xf9\\xee\\x25\\xd3\\x20\\x60\\xac\\xe3\\xe0\\xf2\\x59\\x46\\x50\\x41\\x6a\\x00\\x71\\x6c\\xd3\\xf9\\x86\\x04\\xa5\\xe1\\x04\\xb3\\x33\\x10\\xfd\\xae\\x94\\xc3\\x14\\x01\\x3c\\xdc\\xa5\\xba\\x24\\x14\\x40\\x9e\\xb7\\xf1\\x90\\x13\\x94\\xf0\\x07\\xd6\\xfa\\x0a\\x29\\xdb\\xe8\\xec\\x3d\\xf9\\x8c\\x39\\x3c\\x8d\\x72\\x69\\x58\\x77\\xcc\\x9b\\xaf\\x49\\x1e\\xf3\\x0e\\xf7\\xdb\\x33\\x71\\x60\\x8c\\xa9\\x7c\\xc6\\x21\\x56\\x25\\x20\\xee\\x58\\x1d\\x5d\\x1c\\xdb\\xc7\\x82\\x32\\xd6\\xc7\\xe4\\x39\\x37\\xb2\\xcc\\x85\\x49\\xe6\\xf1\\xe0\\x8d\\xf5\\xf2\\xea\\xc8\\x44\\xfe\\x0f\\x82\\x2b\\x24\\x83\\xad\\x0a\\x5d\\xe3\\x3b\\xe6\\x40\\x89\\x49\\x0e\\x77\\xd6\\x98\\x00\\xfa\\xe2\\x58\\x9e\\xe5\\x87\\x12\\xac\\x15\\xa3\\xf1\\x9e\\x6f\\xfd\\xbc\\xa4\\x2f\\xe1\\x89\\x4e\\x88\\x9b\\x94\\xc0\\x4b\\x04\\x24\\x0d\\xaf\\xb0\\xb2\\x73\\x0c\\x23\\x6b\\x8c\\xce\\xb2\\xcb\\x97\\xaf\\xd1\\xd5\\x15\\xdc\\x19\\xd1\\x06\\x7f\\xd4\\xab\\xa8\\xce\\x29\\x7f\\xd6\\xd1\\x10\\xb3\\x5a\\x21\\xbd\\x3c\\x07\\x5c\\x57\\x7d\\x93\\xfe\\x1d\\xf7\\x7d\\x64\\x8f\\x71\\x19\\x49\\x20\\x99\\xb0\\x17\\xaf\\x44\\xeb\\xa0\\x9c\\x80\\x7f\\x11\\xa4\\xc3\\xf4\\xa1\\x1a\\x2f\\xff\\x30\\x6a\\x72\\x8b\\xa7\\x89\\x83\\x32\\x3c\\x92\\xa2\\xfd\\x5f\\xcc\\x80\\xc1\\x8d\\x42\\x34\\x26\\xf8\\x23\\xa7\\x3f\\xe0\\x40\\x94\\x95\\x52\\x84\\x29\\x3f\\x5f\\x6b\\x3c\\xa4\\xff\\x10\\x80\\xdb\\xb1\\xe4\\xc6\\xf7\\x4c\\x1d\\x93\\x5e\\xd2\\x1e\\x30\\x09\\x4c\\x7d\\xe3\\x36\\xb8\\x2d\\xd8\\x20\\x0b\\x0d\\x65\\x95\\x83\\xc5\\xbf\\xd5\\x47\\x0f\\x9d\\xb3\\x42\\xe7\\x0e\\xc4\\x00\\x07\\x42\\xc5\\x64\\x0a\\x21\\x4e\\x3c\\x2e\"},\n{{0x7c,0xd7,0xec,0x99,0xdd,0x03,0xae,0xde,0x1f,0xf1,0x07,0x3e,0xc2,0xca,0x70,0x10,0x27,0x6e,0x94,0x7e,0x2a,0xa9,0xb0,0xe6,0x5f,0x87,0x7e,0x4c,0xcf,0x1b,0x3a,0x14,},{0xe4,0xc3,0x9d,0xbe,0x94,0x93,0x17,0x6b,0x82,0x13,0xf1,0x42,0x2a,0x9d,0xe7,0xc7,0x4f,0xb6,0xa5,0x91,0x90,0xfc,0xdb,0xf6,0x37,0xc7,0xad,0x5e,0xe1,0x65,0xc0,0x4f,},{0x6f,0x99,0x20,0x27,0x70,0x96,0x45,0x35,0xe4,0x83,0xa0,0xee,0x01,0xa5,0x29,0x44,0x2e,0xb3,0x21,0x30,0x3f,0xa8,0x05,0xd4,0x75,0x60,0x4d,0x7f,0xc7,0x28,0xa9,0x10,0x3f,0xb7,0xb5,0x58,0xb9,0x55,0xf4,0xd0,0x37,0x19,0xee,0xfa,0xa3,0xb7,0xed,0x5b,0x0d,0xa7,0x57,0x10,0xbb,0x98,0x78,0x7f,0x5c,0x22,0x82,0xed,0x66,0xe9,0xf6,0x0c,},\"\\xa6\\x03\\x4a\\xa3\\xc2\\x48\\x49\\x23\\xe8\\x0e\\x90\\xe5\\xa8\\xe1\\x74\\x83\\x50\\xb4\\xf2\\xc3\\xc8\\x31\\x9f\\xaf\\x1a\\x2e\\x32\\x95\\x15\\x0a\\x68\\xe1\\xee\\xca\\x1b\\xc8\\x49\\x54\\xcc\\x89\\xd4\\x73\\x1a\\x7f\\x65\\x12\\xaf\\x01\\x46\\x4f\\xdb\\xce\\x5d\\xf6\\x8e\\xe8\\x06\\x6a\\xd9\\xa2\\xfd\\x21\\xc0\\x83\\x5a\\x76\\x55\\x9c\\xa1\\xc7\\x44\\x9a\\x93\\x3b\\xcb\\x15\\xaf\\x90\\x22\\x3d\\x92\\x5f\\xf6\\x1c\\xd8\\x3e\\xb9\\x35\\x69\\x83\\x47\\xa5\\x70\\x72\\x70\\x9a\\x86\\xb4\\xe5\\xa7\\xa6\\x26\\xe0\\x7a\\x3f\\x2e\\x7e\\x34\\x1c\\x77\\x83\\xa5\\x40\\xf8\\x4a\\xa7\\x3e\\x91\\x7e\\x86\\x7b\\xb8\\x0b\\xac\\xe6\\x25\\x47\\x05\\xa9\\xd1\\xa1\\x18\\x5d\\xe5\\x6e\\x1a\\x4e\\x78\\xaa\\xf5\\x39\\xe7\\x49\\xb8\\xf7\\x65\\xbd\\x05\\x2c\\x4c\\xd1\\x5b\\x63\\x8b\\xf8\\xec\\xf8\\x7d\\x98\\x14\\x60\\x6f\\xed\\x5a\\x69\\xf4\\xda\\xe9\\xda\\x47\\xf3\\x80\\x6d\\xd9\\x0b\\xe6\\x4f\\xcc\\xd3\\x36\\x5c\\xbe\\x9e\\x01\\xc5\\x88\\xfe\\x65\\xd6\\xb6\\x03\\x28\\x07\\x40\\x96\\x2a\\xa8\\xdd\\xb9\\x5a\\x3f\\x4f\\x67\\x4c\\x03\\xbc\\x40\\x43\\x09\\x2c\\x54\\x45\\x95\\x56\\x82\\x70\\xa2\\xc2\\xa8\\xaa\\x06\\xe3\\xf6\\x7c\\x31\\x99\\x8c\\x50\\xb9\\xa5\\x8a\\xca\\xd0\\x06\\x90\\xd3\\x84\\x81\\x14\\xcb\\x19\\x32\\x93\\xc8\\xac\\x21\\x01\\x6f\\xd9\\x96\\xf5\\xc6\\x42\\x14\\x06\\x4f\\x82\\x16\\x7b\\x2c\\x92\\x0c\\xd8\\xa8\\x39\\x75\\x58\\x52\\xac\\x77\\xc3\\xd9\\x05\\x26\\xdd\\x3a\\xdb\\x96\\x83\\x7c\\xf4\\xe7\\x26\\xf3\\x4b\\xd0\\x29\\x55\\xcb\\xac\\x5b\\x82\\xc9\\x2c\\xf4\\xaa\\x8b\\x54\\xbb\\x6e\\x43\\x6d\\xae\\x9b\\xf8\\x93\\xef\\x05\\x0c\\x6f\\x13\\x5a\\x7e\\x62\\xfc\\xd8\\x34\\xda\\xc1\\xd2\\xbe\\x8b\\x8e\\x59\\xd6\\x96\\x13\\x18\\x11\\x70\\x1c\\x43\\x18\\xbb\\x6e\\x9b\\x5a\\x20\\xbe\\xc6\\x56\\xfd\\x2b\\xa1\\x92\\xe2\\x73\\x2f\\x42\\x29\\x63\\xbe\\xd4\\xa4\\xfd\\x1e\\xc9\\x32\\x63\\x98\\xdc\\xe2\\x90\\xe0\\x84\\x8c\\x70\\xea\\x23\\x6c\\x04\\xc7\\xdb\\xb3\\xb6\\x79\\x21\\x44\\x0c\\x98\\xd7\\x27\\x53\\xf6\\xa3\\x32\\xea\\xad\\x59\\xfd\\x0f\\x57\\x74\\x29\\x23\\xfb\\x62\\x5f\\xef\\x07\\x0f\\x34\\x22\\x5e\\xa0\\x6c\\x23\\x63\\xd1\\x23\\x66\\x6b\\x99\\xac\\x7d\\x5e\\x55\\x0d\\xa1\\xe4\\x04\\xe5\\x26\\xb5\\xb2\\x29\\xcb\\x13\\x0b\\x84\\xb1\\x90\\x3e\\x43\\x1c\\xdb\\x15\\xb3\\x37\\x70\\xf5\\x81\\x1d\\x49\\xfb\\xd5\\x0d\\x60\\xa3\\x47\\x4c\\x0c\\x35\\xfc\\x02\\x1d\\x86\\x81\\x81\\x9e\\xc7\\x94\\xcc\\x32\\xa6\\x34\\xbc\\x46\\xa9\\x55\\xaa\\x02\\x46\\xb4\\xff\\x11\\x24\\x62\\x3c\\xba\\xfb\\x3c\\xb9\\xd3\\xb9\\x2a\\x90\\xfd\\xe6\\x48\\xe4\\x14\\x63\\x61\\x92\\x95\\x2a\\x92\\x29\\x1e\\x5f\\x86\\xef\\xdd\\xb8\\x9c\\xa0\\x78\\xae\\xa7\\x71\\x7f\\xc7\"},\n{{0xe3,0xca,0x37,0x13,0xa2,0xfd,0x41,0x2a,0xd5,0x33,0x6b,0xc3,0x56,0xb7,0x7b,0xe0,0x27,0xd5,0xb7,0x08,0x15,0xb3,0xac,0x2a,0xec,0xd8,0x34,0x0e,0xf5,0xf8,0x89,0xb1,},{0x1d,0x51,0x6c,0xb8,0xbe,0xf1,0x16,0xa0,0xc1,0xb6,0x92,0x90,0x09,0x93,0x3f,0x6e,0xb6,0x2c,0x23,0x05,0x07,0x45,0xfe,0x7e,0x8d,0x3c,0x63,0x16,0x23,0x77,0x81,0x11,},{0xb3,0x85,0x7e,0xa6,0x1b,0xaa,0x9e,0x62,0x83,0x8c,0x4e,0x3a,0x99,0x65,0x02,0xd3,0x36,0x4f,0xe1,0xec,0x59,0x42,0x58,0x35,0x50,0x73,0xdd,0x10,0xe4,0x97,0xc6,0x00,0xbe,0xfb,0x1f,0x8f,0x23,0x3f,0xd6,0xe3,0xb2,0xc8,0x7f,0x10,0xdc,0xb7,0x26,0x1a,0xaf,0x34,0x81,0xbf,0xd0,0x90,0x26,0x05,0xac,0xcc,0x90,0x0f,0xef,0x84,0xd4,0x07,},\"\\xdd\\x99\\xba\\xf2\\x95\\xe0\\x13\\xee\\xd1\\x07\\xba\\x8a\\xf8\\x11\\x21\\xaa\\xf1\\x83\\x5a\\x3c\\xca\\x24\\xf8\\xe4\\x64\\xb4\\xcf\\xca\\xa3\\xc7\\xbf\\xfe\\x6f\\x95\\x36\\x01\\x6d\\x1c\\x8c\\xf3\\x75\\x03\\x8c\\x93\\x27\\xe8\\xe2\\x1b\\x00\\x40\\x66\\xf5\\xea\\xc0\\xf7\\x6a\\x3e\\x8e\\xdf\\xb0\\x7b\\xe8\\xbd\\x2f\\x6b\\xc7\\x9c\\x3b\\x45\\x6d\\xe8\\x25\\x95\\xe2\\xc2\\x10\\x5b\\xb1\\xb0\\xaa\\xba\\x5e\\xee\\xe1\\xad\\xef\\x75\\x21\\x67\\xd6\\x33\\xb3\\x22\\xeb\\xf8\\xf7\\xcd\\x5f\\xbf\\x59\\x50\\x8f\\xdb\\xdb\\xec\\xf2\\x5e\\x65\\x7a\\x9c\\x70\\x50\\xaf\\x26\\xa8\\x0a\\x08\\x5b\\x08\\x17\\xc6\\x21\\x7e\\x39\\xac\\xd5\\x4c\\xb9\\xfa\\x09\\x54\\x0f\\xc7\\xbd\\xc5\\x22\\x6d\\x6a\\x27\\x6d\\x49\\x2c\\xc8\\xa3\\xdf\\xfc\\x2a\\xbc\\x6d\\x0b\\x9f\\xb0\\x8c\\xbc\\xcd\\xd9\\x43\\x2e\\x44\\x98\\x21\\xa5\\xdc\\x98\\xcf\\xb3\\xa4\\x18\\xe5\\x39\\xc8\\x90\\xfe\\x5a\\x04\\x46\\xb9\\xf8\\x1d\\x30\\x67\\x00\\x92\\x7a\\xde\\x61\\xcf\\xdc\\xc0\\x62\\x4f\\x13\\xb5\\x84\\x07\\x48\\x77\\x46\\x04\\x80\\x57\\x31\\xd9\\x2e\\x77\\xd5\\xde\\xf6\\x6b\\xe4\\x4c\\xc8\\x17\\x94\\x6f\\x1c\\xd7\\x58\\x19\\x6c\\xf4\\x80\\xf9\\x9e\\x71\\x17\\x83\\x5c\\x4c\\x87\\xcb\\xd6\\x40\\x77\\xa5\\x62\\xa8\\x0c\\xf1\\x1d\\x8c\\xa6\\x5b\\xe7\\xa9\\x4d\\x92\\xb9\\xdd\\xae\\xa9\\x97\\xe9\\x3f\\x14\\x48\\x57\\x7e\\xd6\\xd8\\x43\\x6b\\x2f\\x31\\x44\\x69\\x2c\\x1f\\xd7\\xd2\\x8a\\x03\\xe9\\x27\\x4b\\xc9\\xe8\\x66\\x9d\\x85\\x75\\xf5\\xde\\x20\\xcf\\xbd\\xbc\\xb0\\x4e\\x9f\\x39\\xf3\\x45\\x1d\\x70\\x48\\x37\\x5e\\x26\\x98\\xe7\\x22\\x84\\x6c\\xb4\\xf2\\xd1\\x9a\\x81\\x0c\\x53\\xd4\\xc1\\xa6\\xc3\\xb7\\x70\\xfb\\x40\\x2d\\xf0\\x53\\x0e\\x7b\\x29\\x07\\x22\\x3f\\xd0\\x89\\x9e\\x00\\xcb\\x18\\x8c\\xa8\\x0c\\x15\\x31\\xb4\\xe3\\x7f\\xba\\x17\\x6c\\x17\\xa2\\xb8\\xf5\\xa3\\xdd\\xc7\\xa9\\x18\\x8d\\x48\\xff\\xc2\\xb2\\x72\\xc3\\xda\\x9c\\x9b\\x89\\xdf\\xe5\\x3f\\x2f\\xe7\\xe3\\x67\\x2f\\x91\\xd1\\x18\\x18\\x49\\x1a\\xce\\x14\\x0a\\xdc\\xae\\x98\\x50\\x2e\\x11\\x4f\\x4b\\x35\\x2b\\x90\\xe2\\xe7\\xfb\\xd3\\x33\\xb2\\x45\\x9e\\x7f\\x15\\xdd\\x07\\x64\\xc9\\xc3\\x4e\\x4c\\xb7\\xcc\\x09\\x55\\x00\\xcd\\xa0\\x35\\xe8\\xe2\\xe4\\xe3\\xc8\\xfd\\x5d\\xf5\\xf3\\xaa\\x57\\x9a\\x73\\x5d\\xd8\\xa9\\xf1\\x9e\\xf3\\x36\\xfa\\x97\\x11\\x14\\xe4\\x66\\x18\\x73\\x4a\\x4c\\x13\\xd3\\x0c\\x81\\x12\\x8c\\xa2\\x1d\\xef\\x47\\x33\\x01\\x03\\xd2\\x3d\\x80\\xff\\xe6\\x74\\x21\\xa6\\xcc\\xf9\\xf3\\x6a\\x93\\xf0\\x56\\x03\\xc5\\x99\\xee\\x10\\xb0\\x34\\x51\\xf3\\x6b\\x21\\x33\\xc1\\x87\\xa7\\x9a\\xd9\\xe6\\xfd\\xfb\\xb1\\x25\\x95\\xab\\x73\\xbb\\x3e\\x2e\\x2e\\x43\\x03\\x0f\\xd3\\x7e\\x59\\x1c\\xf5\\x5d\"},\n{{0x29,0xa6,0x3d,0xcd,0x48,0xa3,0x51,0x77,0x14,0x11,0xfd,0xdc,0xab,0x46,0xbb,0x07,0x1e,0x91,0x49,0x85,0x76,0xe8,0xd0,0x2f,0x8b,0x60,0x44,0xf5,0xbd,0xd3,0xed,0x90,},{0x39,0x23,0xfd,0xcc,0x2a,0x9f,0xe5,0xca,0xbf,0x6e,0x99,0x32,0xe4,0x6d,0xbd,0x2b,0x7f,0x36,0x32,0x50,0x0f,0x9d,0x95,0x55,0x2d,0xb2,0xb0,0x45,0xbc,0x41,0x16,0x6f,},{0x12,0xbf,0x62,0x95,0x93,0xe2,0xca,0xad,0xc9,0x10,0xec,0x40,0xbf,0xe2,0xb7,0xa6,0x25,0x14,0x12,0x6b,0x16,0xba,0x3a,0x43,0x8d,0x88,0xe2,0xd2,0x1f,0x59,0x5a,0xae,0xe8,0xab,0xfa,0x4a,0xf2,0xec,0x87,0x03,0x61,0xd0,0xea,0x04,0xdf,0xc8,0xc6,0xa3,0x30,0xfb,0x28,0x41,0xc2,0xd8,0x21,0x1a,0x64,0xfa,0x1e,0x7e,0x7d,0x27,0x38,0x00,},\"\\xff\\x18\\xca\\x0c\\x20\\x4c\\x83\\x86\\xa4\\xaa\\x74\\xec\\x45\\x73\\xc7\\xb6\\x92\\x16\\xb3\\x14\\x70\\xda\\xed\\xd9\\x6a\\x4f\\x23\\x02\\x11\\x6c\\x79\\x55\\xd7\\x2d\\xac\\xc8\\x8e\\x37\\x14\\x55\\x0c\\x09\\xe6\\xf7\\xb9\\xa8\\x58\\x62\\x60\\xdc\\x7e\\x63\\xda\\x4c\\x63\\x3b\\xae\\x01\\x62\\xe1\\x16\\xe5\\xc1\\x79\\x7b\\x78\\xd8\\x7d\\x47\\xff\\xee\\xa3\\xd7\\x81\\x9d\\xf9\\xc8\\x52\\xf0\\xff\\x30\\x93\\x6a\\x10\\x5d\\x3a\\xf5\\x53\\x1a\\x8f\\x89\\x54\\x97\\x11\\xc1\\x4c\\x2d\\x3e\\xe1\\x15\\x64\\xe7\\xc8\\x52\\x5b\\xd5\\x88\\x64\\x00\\x97\\x62\\xa0\\x55\\x41\\xd8\\xe0\\x7a\\xd8\\x41\\xa5\\x5a\\x6a\\x9a\\x00\\x7e\\xf2\\x09\\xcc\\xec\\x4b\\x56\\x40\\xba\\xbe\\x35\\x65\\x1b\\x61\\xdf\\x42\\xde\\x4d\\x91\\x0e\\xe7\\x3a\\x93\\x3c\\x0b\\x74\\xe9\\x95\\x75\\x7e\\x84\\xa9\\x9e\\xb0\\x34\\xf4\\x18\\x07\\x18\\x3c\\x90\\xca\\x4e\\xa8\\xd8\\x4c\\xdb\\xa4\\x78\\x61\\x3c\\x8e\\x58\\x7c\\xb5\\xf8\\xfb\\x6a\\x05\\x50\\x81\\xda\\x6e\\x90\\x22\\x0d\\x5d\\x86\\xe3\\x4e\\x5f\\x91\\xe4\\x88\\xbd\\x12\\xc7\\xa1\\xa6\\xb3\\xc9\\xfc\\xe5\\x30\\x5e\\x85\\x34\\x66\\x58\\xef\\xfa\\x81\\x0d\\x0e\\x8a\\x2a\\x03\\x9d\\xb4\\xa4\\xc9\\x49\\x65\\xbe\\x40\\x11\\xf9\\xd5\\xe5\\xda\\x26\\x62\\x33\\xe6\\xc4\\xe1\\x8e\\xd4\\xf8\\xa2\\x5a\\x57\\xe4\\x0a\\x59\\x1c\\x7e\\xd5\\x90\\xc0\\xf8\\xb1\\xa1\\x19\\xc7\\xc9\\x74\\x7f\\x69\\x1b\\x02\\x19\\x6c\\xd1\\x8e\\x69\\x45\\x21\\x3f\\x1d\\x4c\\x8c\\x95\\x79\\xc6\\xe0\\xa2\\xac\\x45\\x92\\x41\\x28\\xd6\\xd9\\x2c\\x8e\\x4c\\x66\\x06\\x53\\x20\\x35\\x3d\\x48\\xd1\\xd5\\xe1\\x31\\x94\\xd9\\x05\\xf8\\x37\\x07\\x8f\\x8d\\xac\\x0b\\x68\\xcf\\x96\\xae\\x9e\\x70\\x55\\x4c\\x14\\xb2\\xfa\\x29\\xb1\\x96\\x30\\xe4\\xb0\\xf5\\xd2\\xa7\\x67\\xe1\\x90\\xef\\xbc\\x59\\x92\\xc7\\x09\\xdc\\xc9\\x9a\\xa0\\xb5\\xaa\\xf4\\xc4\\x9d\\x55\\x13\\xe1\\x74\\xfd\\x60\\x42\\x36\\xb0\\x5b\\x48\\xfc\\xfb\\x55\\xc9\\xaf\\x10\\x59\\x69\\x27\\xbc\\xfa\\xd3\\x0b\\xac\\xc9\\x9b\\x2e\\x02\\x61\\xf9\\x7c\\xf2\\x97\\xc1\\x77\\xf1\\x92\\x9d\\xa1\\xf6\\x8d\\xb9\\xf9\\x9a\\xc6\\x2f\\xf2\\xde\\x3b\\xb4\\x0b\\x18\\x6a\\xa7\\xe8\\xc5\\xd6\\x12\\x39\\x80\\xd7\\x59\\x92\\x7a\\x3a\\x07\\xaa\\x20\\x8b\\xee\\xb7\\x36\\x79\\x5a\\xe5\\xb8\\x49\\xd5\\xda\\xe5\\xe3\\x57\\x37\\x10\\xaa\\xa2\\x4e\\x96\\xd5\\x79\\x1e\\x27\\x30\\xd0\\x27\\x0f\\x5b\\x0a\\x27\\x05\\xba\\x51\\x5d\\x14\\xaa\\x7e\\x6f\\xa6\\x62\\x23\\x75\\x37\\x7f\\x9a\\xba\\x64\\xd0\\x25\\x69\\xa2\\x09\\xd3\\x3d\\xe6\\x86\\xe0\\x89\\xec\\x60\\x11\\x8e\\x48\\x14\\xff\\xc6\\xc0\\x77\\x8c\\x64\\x27\\xbc\\xe2\\xb6\\xb8\\x44\\xcf\\xcd\\x5a\\x7c\\xed\\x0e\\x35\\x30\\x3f\\x50\\xa0\\xdf\\xe5\\xdf\\x5d\\xde\\x1a\\x2f\\x23\"},\n{{0xc7,0x18,0x8f,0xdd,0x80,0xf4,0xcd,0x31,0x83,0x9e,0xc9,0x58,0x67,0x1e,0x6d,0xd0,0x8b,0x21,0xf9,0xd7,0x52,0x8c,0x91,0x59,0x14,0x37,0x34,0xf9,0x4b,0x16,0x98,0x83,},{0x01,0x97,0x52,0xff,0x82,0x9b,0x68,0x59,0xb9,0x05,0x8d,0x00,0xc2,0x79,0x5e,0x83,0x56,0x55,0x44,0x06,0x75,0x75,0x3f,0x37,0xe8,0x5e,0xb7,0xbc,0x58,0x39,0xc4,0xca,},{0x35,0xc1,0x70,0xdd,0x0c,0x6d,0xc2,0x92,0x0a,0x59,0x57,0x75,0xd8,0xe2,0xdd,0x65,0x24,0x3e,0x9c,0x1b,0xf9,0x6e,0xf4,0x27,0x79,0x00,0x1e,0xd4,0x5f,0x01,0xb7,0xdf,0xeb,0xd6,0xf6,0xa7,0xdc,0x2d,0x38,0x6e,0xf4,0xd2,0xa5,0x67,0x79,0xeb,0xe7,0x7f,0x54,0xe5,0xae,0xcf,0xda,0x2d,0x54,0xa0,0x68,0x47,0x6b,0x24,0xdb,0xd7,0x8b,0x0c,},\"\\x4a\\xf5\\xdf\\xe3\\xfe\\xaa\\xbe\\x7f\\x8f\\xcd\\x38\\x30\\x8e\\x0b\\xd3\\x85\\xca\\xd3\\x81\\x1c\\xbd\\xc7\\x9c\\x94\\x4e\\xbf\\xe3\\xcd\\x67\\x5c\\xf3\\xaf\\xbe\\xf4\\x54\\x2f\\x54\\x29\\x75\\xc2\\xe2\\xa6\\xe6\\x6e\\x26\\xb3\\x2a\\xc3\\xd7\\xe1\\x9e\\xf7\\x4c\\x39\\xfa\\x2a\\x61\\xc5\\x68\\x41\\xc2\\xd8\\x21\\x2e\\x2b\\xd7\\xfb\\x49\\xcf\\xb2\\x5c\\xc3\\x60\\x9a\\x69\\x3a\\x6f\\x2b\\x9d\\x4e\\x22\\xe2\\x09\\x9f\\x80\\xb7\\x77\\xd3\\xd0\\x5f\\x33\\xba\\x7d\\xb3\\xc5\\xab\\x55\\x76\\x6c\\xeb\\x1a\\x13\\x22\\xaf\\x72\\x6c\\x56\\x55\\x16\\xce\\x56\\x63\\x29\\xb9\\x8f\\xc5\\xdc\\x4c\\xbd\\x93\\xce\\xfb\\x62\\x76\\x88\\xc9\\x77\\xaf\\x93\\x67\\xb5\\xc6\\x96\\x59\\xe4\\x3c\\xb7\\xee\\x75\\x47\\x11\\xd6\\x65\\xc0\\x03\\x2a\\xe2\\x29\\x34\\xf4\\x4c\\x71\\xd3\\x11\\x78\\xef\\x3d\\x98\\x10\\x91\\x28\\x74\\xb6\\x2f\\xa5\\xe4\\x02\\x0e\\x6d\\x5d\\x64\\x58\\x18\\x37\\x32\\xc1\\x9e\\x2e\\x89\\x68\\x5e\\x04\\x64\\xe9\\x1a\\x9b\\x1c\\x8d\\x52\\x51\\xe2\\x4e\\x5f\\x91\\x81\\x3f\\x50\\x19\\xa7\\x40\\xa0\\x4b\\x5d\\x91\\xcb\\xb8\\x30\\x9e\\x51\\x61\\xbb\\xa7\\x9d\\xca\\xb3\\x82\\x39\\xa0\\x91\\xf5\\x0e\\x09\\x9f\\xf8\\x19\\xe3\\xa7\\xb5\\x20\\x5f\\xe9\\x07\\xcd\\xfe\\x9c\\x0d\\xc3\\xee\\x85\\xe3\\x2d\\x7b\\xcd\\x3c\\xe0\\x26\\x35\\xe2\\x05\\x83\\x88\\x03\\x1e\\x31\\x7f\\xbf\\x22\\xab\\x9f\\x39\\xf7\\xf7\\xe3\\xcd\\x1a\\x11\\xa9\\xc1\\xf4\\x5f\\x4e\\x1e\\x42\\xd2\\x53\\x6c\\x12\\x2c\\x59\\x18\\x37\\x91\\x18\\x47\\x10\\x8c\\xea\\xfd\\x99\\x08\\x13\\xc2\\xb6\\x34\\x4c\\xff\\xc3\\x4b\\xe3\\x71\\x61\\xdd\\x81\\x56\\x26\\x90\\x0e\\x8f\\xcb\\x85\\xc2\\x1a\\xfb\\x4f\\x6b\\xe8\\xad\\x01\\x51\\x6a\\x31\\xc2\\xa6\\x58\\x03\\x15\\x85\\x7c\\x6a\\x21\\x67\\x35\\xca\\x99\\x10\\x09\\xdb\\xc2\\xea\\x50\\x34\\x16\\x07\\x47\\xa8\\x69\\xd5\\xca\\xdb\\x0b\\x47\\xff\\xbd\\x5d\\x3a\\xc9\\x7f\\xdd\\x05\\x26\\xca\\xe6\\xea\\xa3\\x5c\\xff\\x7a\\x16\\xea\\xf4\\xfb\\x95\\x0c\\xa3\\x15\\x11\\x34\\x6f\\xea\\x61\\x41\\x99\\x9a\\x3f\\x75\\x4e\\x62\\x81\\xcf\\xba\\x15\\xe8\\xa8\\x26\\x93\\x2c\\x58\\x9c\\x5d\\x24\\x7c\\x90\\x9d\\x94\\xb4\\xea\\xb7\\xeb\\xcb\\x09\\x07\\x76\\x48\\xaf\\x06\\x5c\\x2d\\x86\\x61\\x1e\\xb5\\x88\\x45\\x3e\\xd7\\xc2\\x47\\x80\\xd7\\x3c\\x68\\x9c\\x87\\x44\\xaf\\xd5\\x33\\xa8\\x6d\\x9e\\xe9\\xe3\\x36\\x57\\x32\\xcb\\xd0\\xc3\\x51\\xe4\\x36\\xf8\\x98\\xb7\\x04\\x32\\x92\\x09\\x7e\\x03\\xe6\\x08\\x1a\\x23\\xac\\x86\\x5e\\x19\\xdc\\x88\\x58\\x96\\x9b\\x99\\x9d\\x01\\xfa\\x65\\xef\\x20\\x0c\\x3f\\x26\\x9c\\x81\\x8e\\x30\\xb9\\x36\\x5e\\xcc\\x68\\x3b\\xcf\\xe6\\x9c\\x20\\x3b\\x4e\\x0a\\xb6\\xfe\\x0b\\xb8\\x71\\xe8\\xec\\xaa\\xae\\x82\\xd3\\xac\\xd3\\x5d\\x5b\\x50\"},\n{{0x38,0xba,0x06,0x21,0x70,0x4d,0x21,0x55,0xfc,0x2f,0x78,0x55,0x51,0x96,0x57,0x5d,0xe0,0x6d,0x80,0x25,0x5c,0x35,0xe9,0xdc,0x96,0x5b,0x6f,0xe9,0x6a,0x4d,0x53,0x89,},{0x43,0x88,0xf7,0xf6,0x8a,0x9e,0xff,0xbc,0x36,0x6e,0x42,0xd9,0x07,0x01,0x56,0x04,0xda,0xce,0xd1,0x72,0x7c,0xd1,0xd8,0x9d,0x74,0xad,0xcc,0x78,0x9f,0xd7,0xe6,0xe1,},{0x42,0xbe,0xd6,0xa9,0x87,0x86,0xf6,0x64,0x71,0x5f,0x39,0xbb,0x64,0x3c,0x40,0x5a,0xe1,0x75,0x00,0x56,0x46,0x0e,0x70,0x04,0x69,0xc8,0x10,0x38,0x95,0x04,0xc5,0x1c,0xff,0xd9,0xe1,0xa9,0x4c,0x38,0xf6,0x92,0xfb,0x31,0x62,0x65,0x31,0x6d,0x8f,0x4d,0xc3,0xad,0x1c,0xdd,0x8a,0x6d,0x59,0x91,0xef,0x01,0x0c,0xd1,0x48,0x9d,0x7c,0x09,},\"\\xed\\x4c\\x26\\x83\\xd6\\x44\\xb0\\x5b\\x39\\xb0\\x48\\xef\\x1f\\x8b\\x70\\x25\\xf2\\x80\\xca\\x7e\\x8f\\xf7\\x2c\\xb7\\xed\\xa9\\x93\\x29\\xfb\\x79\\x54\\xb7\\x00\\x40\\x07\\x05\\x27\\x5f\\x20\\xb8\\x58\\xcf\\x7e\\x34\\x9a\\x35\\x10\\x66\\x5b\\x63\\x06\\x09\\xc5\\xe2\\xe6\\x20\\x69\\x26\\x3a\\xb9\\xc5\\x5e\\x41\\x23\\xa5\\x64\\xdc\\xa6\\x34\\x8c\\x8a\\x01\\x33\\x20\\x75\\xe7\\xa5\\xbe\\xc9\\xc2\\x0a\\x03\\x80\\x79\\x57\\xfe\\xfa\\x91\\x0e\\x60\\xc3\\x5a\\xe5\\x79\\x77\\x8c\\xe2\\xce\\x42\\xe6\\xa6\\x9a\\x1b\\x64\\x76\\x81\\xe4\\x3e\\xc4\\xb6\\x3b\\xd5\\xfb\\xef\\xab\\xb3\\x17\\x12\\xcb\\x3d\\x64\\x19\\xea\\xd7\\x8d\\xd4\\x1c\\x8a\\x92\\xaa\\xce\\xb6\\x3c\\xbf\\xa8\\x9d\\x2a\\xf3\\x96\\x06\\xde\\x01\\x0a\\x39\\x7e\\x30\\x20\\x53\\xa6\\x15\\xc1\\x6e\\x5e\\x95\\xad\\x99\\x35\\xc0\\x79\\xa0\\xb8\\x10\\x31\\x25\\x78\\x94\\x71\\xa1\\xe3\\x57\\x4f\\x42\\x9b\\x29\\xe4\\xd2\\x25\\xc7\\x72\\x3f\\xbb\\x3c\\xf8\\x8c\\xbd\\x73\\x82\\x3d\\x9f\\x0b\\x6c\\x7d\\x05\\xd0\\x0b\\xde\\xb0\\xfb\\x0a\\xd3\\xd7\\x13\\x20\\x33\\x18\\x3e\\x21\\xf6\\xc1\\xe8\\xd8\\xe4\\xc0\\xa3\\xe4\\xf5\\x2f\\x50\\x01\\xda\\x68\\x71\\x71\\x34\\x5c\\x6d\\xc8\\xb4\\x2c\\x42\\xa6\\x0d\\x1f\\x1f\\xfa\\x8f\\xe3\\xe7\\xbc\\xec\\xe5\\x9a\\x03\\x58\\x78\\xf9\\xd4\\xd8\\x11\\x27\\xe2\\x24\\x96\\xa4\\x9b\\xfc\\xf6\\xbf\\x8b\\x46\\xa8\\x0b\\xd5\\x62\\xe6\\x52\\x55\\x07\\x1f\\x9d\\x11\\xa9\\xeb\\x04\\x81\\xf4\\x62\\x6d\\x4d\\x71\\xff\\xc3\\x8a\\xfe\\x6e\\x35\\x8a\\x4b\\x28\\x91\\x79\\xcb\\xce\\x97\\x64\\xd8\\x6b\\x57\\xac\\x0a\\x0c\\x82\\x7e\\x8f\\xf0\\x78\\x81\\x33\\x06\\xa1\\xd5\\xfa\\xdd\\x32\\xb4\\x6a\\x1f\\xbc\\xd7\\x89\\xff\\x87\\x54\\x06\\x3e\\xec\\xfe\\x45\\x31\\x3b\\xeb\\x66\\x01\\xc3\\xa3\\x01\\x0e\\x8e\\xb9\\x7c\\x8e\\xff\\xbd\\x14\\x0f\\x1e\\x68\\x83\\x11\\x09\\x2d\\x27\\x3c\\x4d\\xef\\xca\\x47\\xda\\x6f\\x1f\\x08\\x25\\x74\\x46\\x76\\xf9\\xa2\\x80\\xb6\\xc2\\xa8\\x14\\xfa\\x47\\xfa\\xbc\\x19\\x80\\xd0\\xb3\\x7f\\x08\\x7a\\x53\\xca\\x87\\x78\\xf3\\x9f\\xfb\\x47\\x4f\\xf5\\xf1\\x17\\x1b\\x44\\x2c\\x76\\xdd\\x00\\x8d\\x92\\x18\\x2f\\x64\\x4a\\x71\\x4a\\x0f\\x01\\x1e\\x21\\x5a\\x78\\xb9\\x7a\\xf3\\x7b\\x33\\x52\\x0e\\xbf\\x43\\x37\\x2a\\x5a\\xb0\\xcf\\x70\\xdc\\xc1\\xdc\\x2f\\x99\\xd9\\xe4\\x43\\x66\\x58\\xf8\\xe0\\x7c\\xdf\\x0b\\x9e\\xa4\\xdd\\x62\\x24\\xc2\\x09\\xe7\\x52\\x1b\\x98\\x1e\\xe3\\x51\\xc3\\xc2\\xdf\\x3a\\x50\\x04\\x05\\x27\\xfc\\xd7\\x28\\x04\\x17\\x60\\x46\\x40\\x5d\\xb7\\xf6\\x73\\x4e\\x85\\xc5\\xd3\\x90\\xf5\\x20\\xb0\\xc0\\x8d\\xcb\\xfa\\x98\\xb8\\x74\\x24\\x80\\xd5\\xe4\\x6f\\x9b\\xe8\\x93\\xf6\\xd6\\x61\\x43\\x40\\xf8\\x16\\x16\\x11\\xd5\\x05\\x3d\\xf4\\x1c\\xe4\"},\n{{0xae,0x33,0x1f,0xc2,0xa1,0x47,0x59,0xb7,0x3f,0x1c,0xd9,0x65,0xe4,0x85,0x14,0xe1,0x2b,0x29,0xf6,0x3b,0x06,0xcc,0xfc,0x0a,0xd4,0x9f,0x36,0x82,0x0e,0x57,0xec,0x72,},{0x08,0x80,0x3d,0x48,0x23,0x8e,0xda,0x3f,0x9c,0xeb,0xb6,0x28,0x53,0x01,0x21,0xde,0x00,0xf0,0xf0,0x46,0x8c,0x20,0x2d,0x88,0x52,0x8b,0x8b,0xce,0xc6,0x87,0xa9,0x03,},{0x75,0xf7,0x39,0x08,0x88,0x77,0xe0,0x6d,0xc5,0x6d,0xae,0xc8,0xf1,0xe4,0xd2,0x11,0xb7,0x54,0xe3,0xc3,0xed,0xbf,0xa7,0xed,0xa4,0x44,0xf1,0x8c,0x49,0xb6,0x9c,0x5a,0x14,0x2d,0xb4,0x5a,0x0a,0x76,0x50,0xe4,0x7d,0x10,0x55,0x0b,0xa6,0x81,0xff,0x45,0xdd,0x44,0x63,0xc4,0xac,0x48,0xbf,0x44,0xb7,0x30,0x34,0xbd,0x56,0x59,0x22,0x0e,},\"\\x57\\x16\\x00\\x33\\x90\\xe4\\xf5\\x21\\x65\\x98\\xa0\\x3d\\x7c\\x43\\x0d\\xbf\\x49\\x5e\\xe3\\xa7\\x55\\x7b\\x58\\x06\\x32\\xba\\x59\\xf1\\x51\\x98\\xb6\\x18\\x0a\\x42\\x46\\x9c\\x23\\x7d\\xb5\\xbc\\x81\\xf2\\x9c\\xfa\\xab\\x0a\\xff\\x3c\\x99\\x66\\x30\\x9a\\xb0\\x69\\x58\\xc9\\xd7\\x12\\x6a\\xdd\\x78\\xe3\\xb3\\x24\\x59\\xff\\x8a\\x0e\\x0b\\xde\\xf8\\x74\\xb5\\x8e\\x60\\x83\\x66\\x8f\\x38\\xad\\x7d\\x63\\xaa\\xe1\\xf1\\x2e\\x26\\xa6\\x13\\x34\\x8f\\x9f\\x03\\xea\\x5d\\x20\\x5f\\x04\\x5d\\x78\\xcc\\x89\\x02\\xd4\\x7f\\x81\\xe8\\xb5\\x22\\x93\\xe7\\x0e\\x86\\xc9\\x80\\x3d\\x4d\\xac\\xea\\x86\\xc3\\xb6\\x74\\x58\\xae\\x35\\x79\\xbc\\x11\\x11\\x3b\\x54\\x90\\xbc\\xf3\\xe1\\xcd\\x4e\\x79\\x79\\xc2\\x64\\xd8\\x35\\x16\\x1f\\xd5\\x5e\\xfe\\x95\\x3b\\x4c\\x26\\x39\\x5d\\xd9\\x2c\\xa4\\x93\\x09\\x20\\xe9\\x04\\xfa\\xdc\\x08\\x89\\xbb\\x78\\x22\\xb1\\xdf\\xc4\\x45\\x26\\x04\\x84\\x0d\\xf0\\x24\\xdb\\x08\\x21\\xd2\\xd5\\xe9\\x67\\x85\\xa5\\xc3\\x7d\\xbf\\xd2\\xc3\\x75\\x98\\x32\\x83\\xe9\\xb5\\xb4\\x3a\\x32\\x07\\xa6\\xa9\\xb8\\x33\\x94\\x83\\x29\\xd5\\xde\\x41\\xe4\\x50\\x08\\xbc\\xba\\xd4\\x93\\xde\\x57\\x54\\xdd\\x83\\xde\\xcc\\x44\\x0e\\x51\\x66\\xed\\xaa\\xe0\\x20\\x8f\\x00\\x0c\\x5f\\x6d\\x9c\\x37\\x21\\x53\\x20\\x9e\\x5b\\x75\\x78\\x11\\x6f\\x89\\xcf\\x2f\\x8b\\x10\\x04\\xd1\\x30\\x7e\\xa7\\x9e\\xd3\\x74\\x80\\xf3\\x19\\x4a\\x7e\\x17\\x98\\x3a\\x23\\x04\\x65\\xcc\\xc3\\x0f\\xcc\\x1a\\x62\\xd2\\x80\\xfb\\xba\\xcc\\xf0\\x06\\xdc\\x4d\\xee\\x0e\\xa7\\x96\\xb8\\x1a\\xcc\\xc6\\x1a\\x06\\x3e\\x2c\\x08\\x3d\\xae\\xc0\\x39\\xbd\\x9a\\x64\\xa7\\x70\\x24\\xaf\\x82\\xec\\x1b\\x08\\x98\\xa3\\x15\\x43\\x29\\xfd\\xf6\\x16\\x73\\xc3\\x6e\\x4c\\xc8\\x1f\\x7a\\x41\\x26\\xe5\\x62\\x90\\xe4\\xb4\\x56\\x81\\x9b\\xde\\xbf\\x48\\xcb\\x5a\\x40\\x95\\x5b\\xab\\x29\\x7c\\x2b\\xbc\\xb0\\x18\\xad\\xbf\\x24\\x82\\x86\\x60\\xa5\\xd1\\x2a\\x06\\x13\\xbf\\x3c\\xcb\\x5e\\xeb\\x9a\\x17\\xfb\\x0a\\x05\\x47\\xdb\\x8d\\xa2\\x4d\\x2e\\xfb\\x87\\xba\\x1b\\x84\\x31\\x42\\xa7\\x5e\\x4c\\xa0\\xb0\\xa3\\x33\\xe4\\xa1\\x4f\\xab\\x35\\xa6\\x26\\x69\\x32\\x9c\\xa8\\x75\\x3f\\x01\\x6a\\xc7\\x0c\\xd9\\x97\\xe8\\xbc\\x19\\xee\\x44\\x8a\\xea\\xf0\\xf4\\xbf\\x3c\\xe5\\x23\\x05\\x50\\x57\\x8a\\xb6\\x4c\\x19\\x01\\x94\\x46\\xce\\x2d\\x9c\\x01\\xa0\\x3d\\x88\\x9a\\x99\\x09\\x86\\x0a\\xef\\x76\\xf0\\x67\\xc5\\x0b\\x61\\xc3\\xd0\\xf1\\x2c\\xc8\\x68\\x6f\\x5c\\x31\\xbf\\x03\\x2a\\x84\\x10\\x15\\xcf\\xef\\xf1\\xcf\\xda\\xe9\\x4f\\x6b\\x21\\xda\\xe9\\x41\\xb3\\x35\\xdc\\x82\\x1f\\x32\\x84\\xce\\x31\\x50\\x8f\\x5d\\xb5\\xc4\\x48\\xff\\xaa\\x37\\x73\\xe9\\xbe\\x1a\\x4c\\x85\\xa1\\xc5\\x8b\\x00\\x9f\\xa3\"},\n{{0x82,0x43,0x5f,0x39,0x79,0x01,0x06,0xb3,0xaf,0x72,0xf9,0x1f,0x14,0xc9,0x28,0xd2,0x46,0x5f,0x98,0xcd,0xd1,0x00,0x84,0xc4,0xa4,0x4d,0x19,0xaf,0x71,0xa1,0x92,0x7c,},{0xc5,0x2a,0x92,0x64,0x6f,0x5a,0xdb,0x21,0xc6,0xdd,0xe0,0xde,0x58,0x78,0x68,0x37,0xf8,0xa3,0x41,0x4c,0x09,0xae,0xdf,0xc2,0x7c,0x81,0x22,0x18,0xa7,0xe7,0x23,0x9e,},{0x1d,0xaa,0x44,0xef,0x06,0xd4,0xc1,0x0d,0xdb,0x48,0x67,0x84,0x23,0xc5,0xf1,0x03,0xa1,0xb5,0x68,0xd4,0x2b,0x20,0xcc,0x64,0xaf,0x11,0x0f,0xce,0x9d,0x76,0x79,0xa2,0xde,0xe4,0x12,0xb4,0x98,0x05,0x85,0xc2,0x6c,0x32,0x0d,0xba,0xa6,0x01,0xc4,0x72,0xde,0xfc,0x3c,0x85,0x41,0x5d,0xae,0xcd,0xd6,0xd2,0xd9,0xea,0xca,0xc8,0x5e,0x07,},\"\\xf3\\xd6\\xc4\\x6a\\xc5\\x24\\x8d\\x53\\x86\\xb6\\xb6\\x84\\x62\\x59\\x7d\\x64\\x70\\x39\\xf5\\x44\\xbb\\x01\\xac\\x2d\\x10\\x67\\xda\\xaa\\xa3\\x97\\xd2\\xdb\\xaf\\x12\\x5a\\x1c\\xf8\\xfd\\xf2\\x80\\xa6\\xaf\\xec\\x32\\x4d\\x53\\x11\\xf5\\x43\\x68\\x8a\\x15\\x6c\\x84\\x98\\x19\\xbb\\x04\\x6b\\x91\\x1c\\x42\\xea\\x3c\\xa0\\x1b\\x99\\x80\\x8c\\x4d\\x1f\\x3b\\x8b\\x15\\xda\\x3e\\xfe\\x2f\\x32\\x52\\x3e\\xc3\\xb0\\x9c\\x84\\xb4\\x8c\\xff\\xd1\\x3c\\x17\\xc9\\xe2\\x6c\\x91\\x2d\\x9c\\x3e\\x93\\x46\\xdf\\xae\\x3f\\xd0\\xc5\\x6c\\x88\\x58\\x78\\x07\\x82\\xf6\\x1a\\x4c\\x4d\\xbf\\xff\\x1e\\x9c\\xb4\\xb3\\x62\\xcd\\x80\\x01\\xf9\\xcd\\xfe\\xb1\\xa7\\x20\\x82\\xdc\\xe9\\xc9\\xad\\xe5\\x2e\\xff\\xc9\\x74\\x46\\x88\\xac\\x0b\\x86\\xc8\\x82\\x66\\xb5\\x3d\\x89\\x5c\\x17\\xea\\xd9\\xe8\\x9e\\xd8\\xd2\\x4d\\x40\\x64\\x2f\\x3a\\xd3\\xb9\\xbf\\x9b\\xbc\\x4d\\xda\\x79\\x66\\xef\\x83\\x28\\x28\\x9f\\xb3\\x1e\\x17\\xc8\\x1f\\xd0\\x28\\xef\\x1b\\xd9\\xa1\\xd4\\xc7\\x92\\xe8\\x6e\\xc2\\xdb\\xdc\\xe3\\xf9\\x37\\xee\\xcc\\x3e\\xeb\\x51\\x88\\xd3\\x25\\x94\\x19\\x19\\xbb\\xf7\\x5b\\x43\\x88\\xe2\\x39\\x95\\x07\\xa3\\xd7\\xfb\\x38\\x75\\x02\\xa9\\x5f\\x42\\x1c\\x85\\x82\\x6c\\x1c\\x91\\x76\\xc9\\x23\\xe3\\x16\\x31\\x0a\\x4b\\xa4\\x5c\\x8a\\x5e\\xf7\\x55\\x7c\\xf8\\x7b\\x77\\x02\\x0b\\x24\\xf5\\xba\\x2b\\xfd\\x12\\x28\\x10\\x95\\x66\\x30\\x7f\\xea\\x65\\xec\\x01\\x50\\x19\\x69\\x12\\x17\\xbc\\xe6\\x9a\\xee\\x16\\xf7\\x62\\x49\\xc5\\x8b\\xb3\\xe5\\x21\\x71\\xcf\\xef\\xd5\\x25\\x4e\\x5e\\x0f\\x39\\x71\\x69\\x18\\x6d\\xc7\\xcd\\x9c\\x1a\\x85\\xc8\\x10\\x34\\xe0\\x37\\x18\\x3d\\x6e\\xa2\\x2a\\xee\\x8b\\xb7\\x47\\x20\\xd3\\x4a\\xc7\\xa5\\xaf\\x1e\\x92\\xfb\\x81\\x85\\xac\\xe0\\x1d\\x9b\\xf0\\xf0\\xf9\\x00\\x61\\x01\\xfc\\xfa\\xc8\\xbb\\xad\\x17\\x1b\\x43\\x70\\x36\\xef\\x16\\xcd\\xae\\x18\\x81\\xfc\\x32\\x55\\xca\\x35\\x9b\\xba\\x1e\\x94\\xf7\\x9f\\x64\\x55\\x55\\x95\\x0c\\x47\\x83\\xba\\xb0\\xa9\\x44\\xf7\\xde\\x8d\\xf6\\x92\\x58\\xb6\\xaf\\xe2\\xb5\\x93\\x22\\x17\\x19\\x5d\\xa2\\x45\\xfe\\xe1\\x2a\\xc3\\x43\\x82\\x4a\\x0b\\x64\\x03\\xdf\\xe4\\x62\\xd4\\x3d\\x28\\x8d\\xb3\\x1f\\x99\\x09\\x7e\\xc3\\xed\\xc6\\xe7\\x65\\x47\\xa3\\x74\\x2f\\x03\\xc7\\x77\\xef\\xb1\\x58\\xf5\\x8d\\x40\\x53\\xfa\\x6c\\xc8\\xd6\\x8b\\x19\\x6a\\xf4\\xf9\\xde\\x51\\x6f\\xd9\\xfb\\x7a\\x6d\\x5d\\x9e\\xe4\\xa8\\x9f\\x9b\\x9b\\xce\\x1e\\x4d\\xee\\x35\\x7a\\x1e\\x52\\xc0\\x54\\x4c\\xfb\\x35\\xb7\\x09\\x2d\\x1a\\xa5\\xa6\\xf7\\xf4\\xc7\\x60\\x26\\x10\\xe9\\xc0\\x0e\\xf5\\xb8\\x76\\x1b\\xc7\\x22\\x79\\xba\\x22\\x8a\\x18\\xb8\\x40\\x0b\\xd7\\x6d\\x5b\\x2b\\xfd\\x7c\\x3c\\x04\\xaa\\xc4\\x43\\x6d\\xae\\x2e\\x98\"},\n{{0x1b,0xea,0x77,0x26,0xd9,0x12,0xc5,0x5e,0xc7,0x8b,0x0c,0x16,0x1a,0x1a,0xd3,0xc9,0xdd,0x7b,0xc3,0x29,0xf8,0x5d,0x26,0xf6,0x2b,0x92,0xe3,0x1d,0x16,0xd8,0x3b,0x48,},{0xc9,0xdd,0xb4,0x21,0x06,0xcc,0xef,0x4e,0x0e,0xf4,0x79,0x45,0x51,0xd2,0x1d,0xf9,0x4a,0x63,0x06,0x87,0x2f,0x23,0x16,0x63,0xe4,0x7e,0x24,0x1f,0x77,0xcc,0x3e,0x82,},{0xf9,0xb0,0x45,0x17,0xbd,0x4f,0xd8,0xef,0x90,0xf2,0x14,0x0f,0xc9,0x5d,0xc1,0x66,0x20,0xd1,0x60,0x2a,0xb3,0x6c,0x9b,0x16,0x5f,0xff,0x3a,0xba,0x97,0x8d,0x59,0x76,0x71,0x10,0xbb,0x4e,0x07,0xa4,0x8f,0x45,0x12,0x14,0x47,0xac,0x0c,0x1a,0xba,0xc5,0x85,0xd3,0x91,0xd4,0x04,0x20,0x41,0x89,0x86,0x28,0xa2,0xd2,0xdc,0xc2,0x51,0x0d,},\"\\xb1\\x12\\x83\\xb1\\xf0\\xce\\x54\\x9e\\x58\\x04\\x73\\x0a\\xc3\\x20\\x7a\\xc0\\x03\\x32\\xd2\\xaa\\xcf\\x9c\\x31\\x0d\\x38\\x32\\xd8\\x79\\xf9\\x63\\x4b\\xd8\\xa5\\x8a\\xdf\\x19\\x9e\\x4b\\x86\\x3b\\xb1\\x74\\x81\\xd2\\x8a\\xcb\\x2d\\xa0\\xe1\\x55\\x7b\\x83\\x36\\xa4\\x00\\xf6\\x29\\x56\\x25\\x03\\x1d\\x09\\xe4\\xdf\\x4d\\x31\\x9b\\xbc\\x1e\\x8f\\x6e\\x92\\x32\\xd2\\x30\\x53\\xbb\\x3f\\xfa\\xc4\\xfe\\x2c\\x70\\xce\\x30\\x77\\xfc\\x00\\x60\\xa5\\xcb\\x46\\x92\\xa1\\xcf\\x0b\\x3e\\x62\\xfe\\x45\\x48\\x02\\xae\\x10\\xb8\\x3d\\xed\\x61\\xb6\\xbf\\x45\\x4c\\xa7\\x5e\\x4c\\xda\\xd5\\x53\\x2f\\x20\\xb7\\x06\\x54\\xf1\\x2b\\xa9\\x06\\xf0\\x03\\xa8\\xb9\\xe9\\x86\\xf1\\x5a\\x39\\x41\\x9d\\xeb\\x2e\\xa1\\xea\\xd7\\x59\\x82\\x90\\xee\\xeb\\xf9\\x25\\x2b\\x0c\\x27\\x60\\x5a\\x7a\\x73\\xa6\\xab\\xeb\\xb4\\x22\\x71\\xd7\\x1a\\x3c\\x19\\x7a\\x46\\xbc\\xc8\\xdb\\x11\\xd9\\x24\\x28\\x42\\xf3\\x78\\x36\\x4a\\x37\\xee\\xca\\xa3\\x4e\\x98\\x21\\x35\\xbe\\x34\\x18\\x2c\\x69\\xca\\x8e\\x6e\\x3c\\x8c\\x90\\xe1\\xb4\\xb2\\xb4\\x75\\x81\\x5a\\x17\\x83\\x77\\xae\\x01\\x65\\xa7\\x64\\xc8\\xba\\x28\\x89\\xb5\\xab\\x29\\x09\\x49\\xd8\\x48\\x7a\\x88\\xe0\\xd3\\xd2\\xbc\\x7e\\x25\\x20\\x17\\x6a\\xa6\\xff\\x9f\\xf0\\xc4\\x09\\xff\\x80\\x51\\x5f\\x4f\\x0b\\x83\\xc5\\xe8\\x2c\\x23\\xfd\\x33\\x26\\xcd\\xd6\\xb7\\x62\\x52\\xe7\\xfd\\xdc\\xd6\\xe4\\x77\\x09\\x78\\xcd\\x50\\x3e\\xd2\\xd6\\xb4\\x80\\x10\\x11\\x67\\xd3\\xf1\\x91\\xfe\\xd8\\xd6\\xd7\\x4d\\x74\\xa2\\x00\\x7d\\xb1\\x09\\x2e\\x46\\xa2\\x3d\\xde\\xcd\\xdc\\xdb\\x98\\x46\\x64\\x04\\x7b\\x8d\\xd7\\xcc\\x8a\\x57\\x6e\\x1a\\x80\\x6f\\x52\\xcb\\x02\\x7a\\x94\\x80\\xa9\\x5c\\xc4\\x4b\\x1e\\x6f\\x2e\\x28\\x6e\\x9b\\x7a\\x6b\\xf7\\xb3\\x96\\xfa\\x54\\x96\\xb7\\xa5\\xb1\\xc0\\x3d\\x9c\\x5c\\x27\\xda\\x1a\\x42\\x99\\x0d\\x10\\xb1\\x2f\\xb8\\x64\\x0e\\x15\\x96\\xf2\\x6b\\x36\\x6d\\x27\\x0b\\xa6\\x4f\\x99\\xaf\\xff\\xe3\\xfe\\xce\\x05\\xa9\\xb0\\x25\\x4b\\x20\\x8c\\x79\\x97\\xcd\\xb5\\x12\\xfc\\x77\\x52\\x79\\x54\\xa1\\xcb\\x50\\xfd\\xab\\x1c\\xc9\\xa4\\x51\\x62\\x74\\x1f\\xd6\\xf9\\xd3\\xfd\\x5f\\x2e\\x38\\x28\\x53\\xd7\\x33\\x5d\\xba\\x1e\\x6b\\x29\\x59\\xdd\\x86\\xe1\\x25\\xe6\\x7b\\x53\\xdc\\x8e\\x45\\x3c\\x81\\x0b\\xc0\\x1b\\xf2\\x0b\\xce\\x7b\\x61\\x8d\\xd5\\xd1\\xed\\x78\\x41\\x06\\xee\\x06\\xa3\\xec\\xaf\\x6b\\x3b\\xee\\x0b\\x56\\x83\\x3b\\x0b\\x81\\x31\\x39\\xc5\\xa6\\x96\\x00\\x0a\\x44\\x9c\\x97\\x90\\x6a\\x2f\\xbd\\xdc\\x2d\\x9d\\xe9\\x40\\x6e\\xa2\\x82\\xac\\x4e\\xe5\\xef\\x8b\\xf3\\x85\\x4c\\x74\\xa6\\xb7\\x17\\x3d\\xd2\\xf7\\x9c\\x7a\\x12\\x6f\\x3c\\x7b\\x04\\x33\\xfd\\x4e\\xa2\\x6e\\x87\\x7a\\x14\\x83\\x1d\\xd4\\x15\\xa1\\x9d\"},\n{{0xd0,0x1a,0x0e,0xad,0x9d,0x69,0x48,0x33,0x28,0x3b,0x9c,0xd7,0x29,0x9a,0x7b,0xd7,0x5f,0xa9,0x0b,0x1d,0x2d,0x78,0x84,0xe4,0x55,0x7b,0x33,0xc9,0x98,0x77,0x2a,0x68,},{0xa0,0xf7,0x57,0x47,0x9b,0xa6,0x27,0xef,0xef,0x95,0xd6,0xec,0x7a,0x93,0x1d,0xfa,0xc4,0x37,0x3d,0xf3,0x3d,0xaa,0xf4,0xdd,0xc4,0xec,0x68,0x94,0xc8,0x26,0x1e,0xd7,},{0x9a,0x0f,0xf7,0xf3,0x51,0x74,0xec,0x3f,0x66,0xd2,0x2a,0x6f,0x06,0xdf,0x60,0xe0,0x9c,0x8f,0x62,0x3a,0x5a,0xca,0x81,0x0e,0x23,0xa8,0x8d,0x0e,0x6a,0x31,0xcb,0x6f,0x1c,0xe1,0xc1,0xf9,0xdc,0xcc,0x9e,0x14,0x84,0xb6,0x8d,0xd0,0x04,0xac,0x53,0x59,0x7e,0x29,0xad,0x6a,0xb7,0x2e,0x8c,0xe2,0xb7,0x5a,0xd5,0xb8,0x0e,0xb8,0x48,0x03,},\"\\x76\\x27\\x53\\x4e\\x9a\\x83\\xd1\\xe4\\x06\\xab\\x94\\x8d\\x30\\xd1\\xda\\x9c\\x6a\\x5d\\xb0\\x8e\\x0f\\xeb\\x7f\\xc5\\xba\\x5c\\xbf\\x76\\x84\\x9e\\xe8\\xad\\xd4\\x84\\x7e\\xf5\\xca\\x5a\\x0d\\xae\\x41\\x1a\\xca\\x09\\x74\\x51\\xcb\\x4c\\x2b\\x49\\x8c\\x94\\x70\\x97\\x40\\x70\\x07\\x64\\x0d\\xc1\\x9e\\xd9\\x38\\xe3\\xb9\\x1b\\xf5\\x1c\\x95\\x81\\x16\\x8d\\xf8\\x60\\xbd\\x94\\x75\\x16\\x68\\xda\\xbd\\x72\\x1d\\xc7\\x39\\x98\\x40\\x0b\\xe2\\x0c\\x9a\\x56\\x3d\\x50\\x51\\xef\\x70\\xe3\\x54\\x6f\\xee\\x67\\x33\\x12\\xb5\\x2a\\x27\\x40\\x41\\x05\\x7e\\x70\\x84\\x8e\\xb7\\xc5\\xa2\\x16\\x44\\xc9\\x7e\\x44\\x8a\\xbd\\x76\\x40\\x20\\x7d\\x7c\\xda\\xfc\\xf4\\x5d\\xa6\\xdf\\x34\\x94\\xd3\\x58\\x5b\\x0e\\x18\\xac\\x5a\\xc9\\x08\\x1c\\xb7\\xa4\\x07\\xa3\\x9a\\x87\\x77\\x05\\xcb\\xaf\\x79\\xa0\\x1b\\x91\\x5f\\x73\\x6e\\xb0\\x25\\xc5\\x8b\\x4b\\x5d\\x80\\x7f\\xb7\\xb7\\x56\\x6c\\x59\\x69\\x78\\x7c\\x1d\\x6c\\xa4\\xeb\\xa9\\x7d\\x50\\x9e\\xf7\\xfb\\x35\\x50\\xd2\\x1d\\x37\\x7e\\xce\\xff\\xcf\\x0e\\xb6\\x68\\x18\\x95\\xad\\xbd\\x24\\x6e\\xe7\\xbf\\x3c\\x93\\x5a\\x00\\x64\\x78\\xb8\\x32\\xec\\xe4\\x6d\\xe6\\x11\\x8b\\x17\\xe4\\x66\\xa2\\x7f\\xc2\\xa4\\x4a\\x89\\x6b\\xaa\\xe2\\x72\\xf9\\xec\\xf0\\x18\\xc6\\x5c\\xb5\\x0c\\xfb\\xfc\\x8d\\x26\\x09\\x94\\xa1\\x8a\\x83\\x2d\\x97\\x19\\x28\\xc4\\x49\\x67\\x57\\x24\\x58\\x51\\x31\\xc8\\x71\\x53\\x3c\\x98\\x97\\xd8\\xf8\\x0f\\x9c\\x04\\x16\\xb7\\x18\\x78\\x6b\\x10\\xfe\\xa8\\xeb\\x5b\\xd8\\x13\\xa2\\x69\\xa1\\xb6\\x77\\xb7\\xa2\\x50\\x7a\\x44\\xb7\\x13\\xd7\\x05\\x08\\x65\\x30\\x99\\x5e\\x59\\x33\\x5d\\xdc\\x28\\x55\\xe8\\x47\\xe4\\xf4\\xdb\\x06\\xc9\\x1f\\x1d\\x54\\x02\\x3d\\x8a\\x10\\xf6\\x9f\\x9e\\x61\\xbd\\xce\\x4b\\x68\\x6f\\xb6\\x17\\xbd\\x50\\x30\\xe7\\x55\\xca\\xdb\\x1f\\x64\\x4e\\x1d\\xdd\\x91\\x61\\x9b\\x96\\xec\\xd6\\x05\\xb0\\x01\\x98\\xb9\\xa6\\xed\\xdb\\x5a\\x84\\xeb\\xd3\\x69\\x2b\\x66\\x59\\x79\\x76\\x66\\x37\\xc6\\x77\\x37\\x8c\\x1c\\x77\\x04\\x1f\\xd4\\xa6\\xb3\\x55\\x5c\\x1d\\xc8\\xa8\\x3f\\xe9\\x01\\x3b\\xb6\\x10\\x6c\\xc1\\x8a\\x2b\\x03\\x7c\\x93\\x77\\xb7\\xa1\\xa5\\xa5\\xd0\\xdc\\xc5\\x49\\x18\\xea\\xad\\x7e\\x32\\xc8\\x80\\x76\\x7b\\x26\\xfd\\x2e\\xa2\\xd6\\x8b\\x04\\x05\\xf5\\xe0\\x74\\xf5\\x5a\\x19\\xd8\\xa3\\x9f\\xfb\\xb7\\xdc\\x32\\xfa\\xee\\x6a\\x7f\\x95\\x32\\xae\\xc8\\xa0\\x77\\x6c\\x3f\\xf8\\x3a\\xe3\\xa4\\x62\\x77\\x38\\x49\\x6a\\x37\\x1e\\xb9\\xe0\\x90\\xb7\\x4e\\x0e\\xdd\\xec\\xfc\\xd4\\x1b\\xed\\x0c\\x0c\\xe5\\x81\\x27\\x52\\x43\\x47\\x2d\\x26\\xda\\x8c\\x99\\x8e\\x4b\\x6d\\x6b\\x44\\xfc\\x88\\xba\\x2a\\xb5\\x46\\x42\\x22\\x54\\x17\\x12\\x02\\x94\\x41\\x78\\x05\\x74\\x2b\\xdb\\x33\\xb7\\xb1\\x22\"},\n{{0xdf,0x64,0x89,0x40,0xb5,0x78,0xbc,0x31,0xd2,0xa6,0x52,0x96,0x5f,0x30,0x39,0x1c,0xaf,0x06,0xd5,0xf2,0x51,0x59,0x9a,0x73,0x7c,0xe1,0x0b,0xe5,0x5f,0x4a,0x9d,0x0d,},{0x27,0xde,0x92,0x04,0x19,0xc1,0x86,0xb0,0x1b,0xe5,0x42,0x79,0xfb,0x8f,0x9b,0xe4,0xbb,0x4b,0x2c,0xad,0x75,0xca,0x7e,0x8f,0x79,0x2b,0xfa,0x7b,0xb9,0x7c,0x7f,0x41,},{0x62,0xbc,0x99,0x1c,0x45,0xba,0x9b,0x26,0xbf,0x44,0x01,0x16,0x26,0x41,0x62,0xc3,0x4c,0x88,0x59,0x78,0x85,0xe9,0x60,0x50,0x83,0xc6,0x04,0xb5,0xf5,0xd8,0xfa,0x6f,0x66,0x2b,0xa2,0x14,0xf7,0x6e,0x6c,0xf8,0x4e,0x5e,0xc0,0x4d,0xf1,0xbe,0xef,0xc5,0xf2,0x5d,0x3a,0x3b,0x72,0xf9,0x8b,0x50,0x69,0x83,0x19,0x16,0xa6,0x32,0x96,0x01,},\"\\x1a\\xe5\\x20\\xbe\\xeb\\x4a\\xd0\\x72\\x2b\\x43\\x06\\x7f\\xa7\\xcd\\x28\\x74\\xab\\xcf\\x34\\xdd\\x92\\x37\\xb4\\x47\\x8e\\xae\\x97\\x72\\xae\\xa2\\x97\\xa6\\x7f\\xb7\\x9b\\x33\\x07\\x02\\x04\\xba\\xee\\x44\\x0b\\x9c\\x87\\xe2\\xfb\\xcb\\xeb\\x76\\x80\\x1d\\xdd\\xea\\x5e\\x45\\x30\\xd8\\x9e\\x11\\x58\\x31\\x79\\x93\\x9a\\x00\\xa3\\x2f\\x81\\x13\\x32\\xc5\\x22\\x91\\xcc\\x7a\\xc9\\x1e\\x5a\\x97\\x0c\\xd5\\xaa\\x70\\x8b\\x1d\\xa2\\x6b\\xe9\\xfe\\x43\\x2a\\x9b\\xbd\\xa1\\x31\\x9e\\x31\\xe4\\xbc\\xc9\\xf1\\x66\\x6a\\x05\\xb5\\xc0\\x5b\\x87\\x6b\\xfd\\x1f\\x76\\x66\\x87\\xcc\\xea\\x4e\\x44\\x82\\xe9\\x24\\x32\\x9a\\xfa\\xce\\x5e\\xe5\\x2e\\x98\\x79\\xfd\\x69\\xb7\\x6e\\x0f\\x7e\\x45\\x2e\\xc4\\x71\\x3b\\xff\\x21\\x6d\\x00\\xc8\\x25\\x99\\xd2\\x7c\\xa4\\x81\\xf7\\x3a\\xae\\x13\\x6f\\x08\\x75\\xc8\\x8a\\x66\\xb1\\xb6\\xf3\\x4c\\x50\\x52\\x3a\\xb6\\x02\\xe9\\xd4\\xeb\\xb7\\xee\\xb9\\xe0\\x43\\xa6\\x5e\\x41\\x89\\x9d\\x79\\x75\\x2a\\x27\\x9d\\x2e\\xd4\\x69\\x93\\x92\\x6f\\x36\\x21\\xe7\\xc3\\x2c\\x9a\\x9b\\x3b\\x59\\xd8\\xdd\\x57\\xbe\\xca\\x39\\x28\\x54\\x34\\xde\\x99\\x1c\\xbd\\x2d\\xfc\\xbc\\x5c\\xa6\\x2a\\x77\\x79\\xf4\\x75\\xd0\\xce\\xf2\\xf3\\xe5\\x62\\xf2\\x9a\\xcd\\x47\\x4f\\x3c\\x99\\xec\\x5b\\xd8\\xde\\x01\\x10\\x1b\\xed\\x2e\\x0c\\x9b\\x60\\xe2\\xd7\\x0f\\xd4\\x32\\xc8\\x92\\xfc\\x66\\xf8\\xd4\\x61\\x9a\\x91\\x1b\\x56\\x25\\x16\\x3e\\x9a\\x42\\xbf\\x9e\\xa3\\x85\\x86\\xd8\\xe7\\x64\\x00\\x15\\x64\\xd3\\x35\\x41\\x12\\x25\\xfc\\xb0\\xa0\\x6d\\xc2\\xa8\\x2d\\xa0\\x77\\x9a\\x3c\\x44\\x4e\\xb7\\x86\\x42\\x01\\xb4\\x3e\\xbb\\x72\\xb9\\x21\\xf3\\x4d\\x3c\\x13\\x08\\x9d\\xf2\\xf4\\xfa\\xc3\\x66\\xff\\x1e\\x3c\\x0b\\x96\\xf9\\x3d\\x2b\\x4d\\x72\\x6a\\x5c\\xe4\\xd6\\x91\\x6d\\x82\\xc7\\x8b\\xe3\\x54\\xa1\\x23\\x0c\\x2c\\xf0\\x41\\x8c\\x78\\xa1\\x91\\x3e\\x45\\x4f\\x64\\x8c\\xc9\\x2c\\x8d\\xd0\\xe1\\x84\\x64\\x5f\\xe3\\x78\\x1d\\x26\\x3c\\xff\\x69\\xf5\\xc6\\x0b\\x1e\\xbb\\x52\\x00\\x5a\\x8b\\x78\\xa5\\x15\\xc7\\xe8\\x88\\x6f\\xfe\\x05\\x4d\\xab\\x42\\x8e\\x2e\\x22\\x1d\\x9d\\x76\\xaf\\xf4\\x26\\x54\\x16\\x8d\\x83\\x3b\\x88\\x17\\x82\\x93\\xe1\\xfe\\xdd\\x15\\xd4\\x6c\\xd6\\x09\\x48\\x31\\x29\\xc4\\xd2\\xd8\\x44\\x32\\xa9\\x9d\\x31\\xff\\xe9\\xbd\\xb5\\x66\\xf8\\xc7\\x5c\\xe6\\x5e\\x18\\x28\\x8e\\x4d\\xf8\\xc1\\x67\\x31\\xa0\\xf3\\xfd\\xde\\x1c\\xca\\x6d\\x8e\\xde\\x04\\x35\\xff\\x74\\x36\\xca\\x17\\xd0\\xae\\xb8\\x8e\\x98\\xe8\\x06\\x5c\\xbc\\xbf\\xd0\\xff\\x83\\x04\\x3a\\x35\\x7c\\xd1\\xb0\\x82\\xd1\\x70\\x3d\\x46\\x18\\x81\\x87\\x2c\\xdf\\x74\\x1e\\x4f\\x99\\xbd\\x14\\x67\\x45\\xba\\x70\\x39\\x74\\xbe\\x40\\xf5\\x79\\xbf\\x5c\\x4d\\xba\\x5b\\xdb\\x8c\\x94\\x1b\\xce\"},\n{{0xc8,0xac,0x23,0x45,0x58,0xaa,0x69,0x81,0x6b,0x36,0x8b,0x77,0xb7,0xcc,0xcb,0x5c,0x8d,0x2a,0x33,0xec,0x53,0xae,0xef,0x2c,0xe2,0x28,0x71,0x43,0xbd,0x98,0xc1,0x75,},{0x53,0x64,0xba,0xf1,0xfd,0xb2,0xc6,0x38,0x40,0xb3,0x0d,0x40,0x31,0xcf,0x83,0xa2,0xe1,0x8e,0x62,0x07,0x93,0xba,0xe5,0x9d,0x10,0x35,0xc0,0xed,0xe5,0x5e,0x52,0x8b,},{0x32,0x25,0x03,0x61,0xdf,0x6e,0xd2,0x83,0x48,0x5f,0x95,0xf3,0xd3,0x57,0xa4,0xf1,0xc3,0x3a,0x8c,0xf9,0x16,0x58,0x32,0x7c,0xd4,0x53,0xd4,0x9c,0x95,0x36,0x65,0x51,0x08,0x70,0xaa,0x45,0x4c,0xfa,0x3b,0x83,0x24,0x52,0x20,0xa8,0x27,0xd0,0xec,0x74,0x77,0xf9,0xec,0xeb,0x79,0xc4,0xa2,0x9f,0x30,0x1f,0x95,0x3c,0xc8,0xca,0xac,0x07,},\"\\xce\\x48\\x8d\\x26\\x97\\x5c\\x1c\\x93\\x28\\xb4\\x7f\\xa9\\x2e\\x19\\x56\\x13\\x30\\x04\\x1b\\x23\\xa0\\xe5\\x7a\\x4b\\x8b\\xca\\x89\\xeb\\x5f\\x61\\x5e\\x73\\xdd\\x7f\\xae\\x69\\xc2\\x38\\x0e\\x32\\x12\\xf9\\xb7\\x33\\x41\\xc3\\x56\\xdb\\x75\\xa6\\x25\\x6d\\x7a\\x20\\xa9\\x7f\\x75\\x9d\\x4c\\xba\\x71\\x97\\x17\\x8e\\xa7\\x24\\xdd\\x93\\x29\\x49\\x36\\x0e\\x96\\xc5\\x0a\\x4b\\x3b\\xa5\\x5a\\x95\\x33\\x72\\xc3\\x97\\xb0\\x96\\x9c\\x2b\\x14\\xd3\\x60\\x9e\\x0a\\x85\\x2d\\x48\\x4d\\xf7\\x0e\\xaa\\xb1\\x12\\x49\\xeb\\xeb\\x32\\x37\\x92\\x1f\\x0a\\x39\\xa5\\x5d\\x7d\\xcc\\xfe\\xf2\\x05\\xd9\\x4e\\xc8\\x0d\\x9e\\x1f\\xd6\\xa2\\xc1\\xef\\xd2\\x98\\x44\\x10\\x1d\\xfe\\x2c\\x5f\\x66\\x8a\\xdb\\x79\\x75\\x91\\x5d\\xed\\xd0\\x86\\x50\\x0c\\xee\\x2c\\x1e\\x23\\x3e\\x8e\\x48\\x85\\x5c\\xc1\\xa6\\xf2\\x87\\xd6\\x3d\\xce\\x10\\xad\\xdd\\x13\\xca\\xc7\\xb7\\xa1\\x87\\xef\\xe4\\x7e\\x12\\xd1\\xc3\\x5b\\xb3\\x97\\x40\\x52\\xb2\\x3a\\x73\\x66\\x8d\\x3e\\x4c\\x87\\xdb\\x48\\x41\\xaf\\x84\\x6e\\x80\\x86\\x72\\xc4\\x3d\\x0a\\x15\\x22\\xe2\\x96\\x5f\\x08\\x39\\x51\\xb2\\xb2\\xb0\\xc4\\x09\\x54\\x8e\\xe6\\x18\\x2f\\x0c\\x98\\x50\\x51\\x4c\\x9e\\x6c\\x10\\x2f\\x54\\xba\\x41\\x24\\xc9\\x2a\\x90\\x27\\x4f\\x40\\x58\\x91\\xe6\\x62\\xf5\\xeb\\xb3\\x77\\x1b\\x85\\x78\\x31\\x56\\xe9\\xe5\\x83\\x67\\x34\\xd0\\x9d\\x1b\\xaf\\x5b\\x21\\x34\\xc9\\x31\\x62\\xee\\xc4\\xbe\\x03\\xbd\\x12\\xf6\\x03\\xcd\\x27\\xbe\\x8b\\x76\\xac\\xcc\\x6e\\x8b\\x8b\\xac\\x02\\x0c\\xba\\x34\\x79\\x65\\x1c\\x9f\\xfa\\x53\\xce\\x4e\\xb7\\x7a\\x77\\x31\\x3b\\xc1\\x26\\x5d\\xda\\xb8\\x03\\xef\\x7a\\x65\\x63\\xba\\x6f\\x79\\x9d\\x1e\\xf3\\x0e\\xf5\\xa0\\xb4\\x12\\x96\\x5f\\xda\\xc0\\xb9\\xda\\xb8\\x42\\xc7\\x8e\\xe2\\xcc\\x62\\x8e\\x3d\\x7d\\x40\\x61\\xe3\\x4e\\xde\\x37\\x97\\xe1\\x54\\xb0\\x6e\\x8c\\x66\\xce\\xbd\\xf2\\xde\\xd0\\xf8\\x1b\\x60\\xf9\\xf5\\xcd\\xda\\x67\\x5a\\x43\\x52\\x77\\xba\\x15\\x24\\x55\\x7e\\x67\\xf5\\xce\\xfa\\xfc\\xe9\\x29\\x29\\x1d\\xce\\x89\\xec\\xb0\\x8a\\x17\\xb6\\x7a\\x60\\xc5\\x82\\xb4\\x87\\xbf\\x2f\\x61\\x69\\x62\\x66\\x15\\xf3\\xc2\\xfe\\x3b\\x67\\x38\\x8b\\x71\\x3d\\x35\\xb9\\x06\\x66\\x69\\x96\\x0d\\xe4\\xdb\\x41\\x3c\\xd8\\x52\\x8e\\xe5\\x6e\\xd1\\x73\\xe9\\x76\\xa3\\xc9\\x74\\xac\\x63\\x3a\\x71\\x34\\xcc\\xe3\\x83\\x19\\x73\\x5f\\x85\\x7b\\x7d\\x71\\xba\\x07\\xf4\\x77\\xef\\x85\\x84\\x8a\\xa8\\xf3\\x9e\\x11\\x81\\x18\\x77\\x9e\\xd8\\x7b\\x4f\\x42\\xaa\\x35\\x8a\\x89\\xf7\\xec\\x84\\x4a\\x45\\x1e\\x7e\\x8f\\xc0\\xaf\\x41\\x8b\\x85\\xbc\\x9b\\xf2\\xf2\\x6d\\x1e\\xa1\\x37\\xd3\\x35\\xec\\x7e\\xe7\\x57\\xb7\\x0a\\xe2\\xfd\\xd9\\xcc\\x13\\x49\\x32\\xf0\\xe5\\x42\\x5b\\xf3\\x7f\\xb9\\x15\\xe7\\x9e\"},\n{{0x2c,0x47,0xf2,0xb8,0xb9,0xd2,0xce,0xe9,0xe6,0xf6,0x54,0xbc,0x24,0x65,0x8f,0x9e,0xaf,0x43,0x9c,0x23,0xbe,0xaa,0x0a,0x79,0xbf,0x35,0xcc,0x8c,0xd2,0xde,0xba,0xf4,},{0x44,0x4a,0xf2,0xf3,0x4f,0xd3,0x2e,0x5a,0x19,0xf6,0x1f,0x87,0xd0,0x3e,0x10,0x76,0x27,0xa3,0xee,0xb8,0xbd,0x94,0xd2,0xfa,0xea,0xa3,0x48,0xb0,0x5d,0xea,0x19,0x80,},{0x85,0x54,0xb0,0x1d,0x09,0xed,0x86,0xe6,0x13,0x95,0xb9,0x1a,0x2b,0x1e,0xe1,0x87,0x15,0xc4,0x2f,0x9c,0x7e,0x7f,0x07,0x00,0xd7,0x9f,0xf9,0xfb,0x57,0x81,0x29,0x3d,0x61,0xc5,0x58,0xdd,0x5b,0x43,0x1c,0x93,0x71,0x8d,0xcc,0x0f,0x98,0xfb,0x65,0x2b,0x59,0x6f,0x18,0xc3,0x0f,0x82,0x21,0x5e,0x8e,0x63,0xe4,0xf6,0x56,0x8c,0x88,0x00,},\"\\x04\\x4c\\x8f\\xaa\\x8c\\x8a\\xaf\\x9f\\x2b\\x81\\x86\\xa6\\xb9\\xb3\\x38\\x47\\xec\\x7b\\x45\\x24\\x23\\xb2\\x2a\\x91\\x74\\x3d\\x2e\\x59\\x7e\\xcc\\x1e\\x1e\\x22\\xae\\x60\\x05\\x3e\\x9e\\xe6\\x23\\x3b\\x04\\x4e\\x77\\x59\\x20\\xe4\\xe3\\xd6\\x67\\x19\\x90\\x13\\x25\\xcf\\xdd\\x39\\xbb\\x53\\x2f\\x8a\\xa4\\x69\\xaa\\xb4\\x2e\\x96\\x08\\xc2\\x12\\x60\\xc0\\x4c\\x27\\x41\\x3a\\x7a\\x94\\xe4\\x66\\xf6\\x3c\\x49\\x52\\xe9\\x0e\\xf9\\x0c\\x12\\x81\\x4b\\x34\\x51\\xb1\\xca\\xd7\\xda\\x91\\x47\\xf8\\x40\\x92\\x20\\xf6\\x49\\x8c\\xc0\\xa6\\x7f\\xef\\x4b\\xc0\\x4f\\xc0\\x6e\\x1d\\x89\\x8a\\x55\\x15\\x59\\x1e\\x8b\\xe0\\xc4\\x3d\\x75\\xa6\\xfe\\x42\\x5b\\x7c\\xbe\\xfb\\x1b\\x91\\xb1\\xbd\\x78\\xb5\\xbe\\xc7\\x82\\x90\\x56\\x98\\x2e\\xfd\\xc5\\xbe\\x24\\xaf\\x66\\x78\\x00\\x6a\\xdc\\x6f\\x04\\x46\\x20\\x2e\\x7e\\xc3\\xa2\\xd6\\x97\\x9c\\xb0\\xdf\\x7e\\x25\\xd7\\x42\\x33\\x91\\x4d\\x9c\\x58\\xb8\\x1c\\xf5\\x5b\\xe0\\x69\\x67\\xd3\\xa5\\x95\\xc1\\xb9\\x67\\x28\\x69\\x99\\x4c\\xfb\\xa6\\x71\\x62\\x83\\x3a\\x21\\x43\\xaa\\x91\\xcc\\x93\\xac\\xda\\xfa\\x5b\\x45\\x20\\x8d\\xf3\\xe8\\x8c\\xcc\\x01\\xa2\\xa4\\xd2\\x20\\xe3\\x60\\x09\\x8d\\x91\\x54\\xd2\\x25\\xa7\\xca\\x5f\\x2f\\x1e\\x52\\xb1\\x00\\x3d\\x10\\x66\\x50\\xa7\\x7b\\x28\\x3b\\x95\\xe4\\xba\\xf1\\xe7\\x33\\x6f\\xa9\\xa7\\x47\\xa2\\xb3\\x82\\x3d\\x36\\x09\\x10\\x41\\x2e\\x76\\xdb\\x72\\x5c\\xe1\\xab\\x1e\\x1d\\x18\\x9d\\x0d\\x3a\\xbe\\xf8\\x2d\\x76\\x66\\xbc\\xf1\\xb7\\x66\\x69\\xe0\\x64\\x3b\\x44\\xf7\\x4e\\x90\\xce\\xaf\\xa0\\xc8\\x37\\x1b\\x57\\xc5\\x8f\\x3b\\x37\\x0a\\x54\\x7c\\x60\\x95\\x8f\\x0f\\xcf\\x46\\x1b\\x31\\x50\\xf8\\x48\\xc4\\x70\\xfa\\x07\\xe2\\x9b\\xf5\\xf0\\xd4\\xb5\\x9e\\xfa\\x5a\\xb0\\xd0\\x34\\x1e\\x04\\x51\\xd0\\xab\\xb2\\x9d\\x74\\x14\\xcd\\xdc\\x46\\xcc\\x6d\\x74\\xcf\\x3d\\xc2\\x33\\xd0\\xd1\\x70\\x73\\x87\\xbd\\x8c\\x77\\x80\\xff\\x78\\xe5\\x46\\xfb\\x77\\x29\\x4d\\x58\\xa5\\xdd\\xa5\\xf0\\x5c\\x12\\x97\\xe3\\xd1\\x77\\x11\\x56\\xd2\\x85\\x63\\x5b\\xf7\\xec\\xed\\xb3\\x8a\\x9e\\x5e\\x77\\x44\\x98\\x04\\xf3\\x89\\x9e\\xa4\\x6a\\x50\\x26\\x6b\\x25\\x5a\\xeb\\x52\\xd1\\x8e\\x0f\\xa1\\x36\\xe5\\x35\\xcc\\x90\\x26\\xf6\\x78\\x55\\x2f\\xa3\\xee\\x21\\x46\\x08\\x1d\\x99\\x96\\x85\\xe2\\x4b\\xf7\\x80\\x7c\\xc4\\x7c\\x13\\x04\\x36\\xc5\\x44\\xd3\\x5b\\x4b\\x87\\x5b\\xd8\\xaf\\xa3\\x12\\xce\\x3a\\xe1\\x7c\\xf1\\xc7\\xf5\\xea\\x1e\\xce\\xcb\\x50\\xf9\\x53\\x44\\x72\\x0c\\xec\\xf0\\x88\\x43\\x4f\\xf8\\xe0\\xba\\x04\\x4e\\xc1\\x9c\\x98\\xad\\xa7\\x78\\x21\\x16\\x30\\x4c\\xbe\\xac\\x1c\\x3e\\x35\\xf5\\xa4\\xf4\\x43\\x13\\x35\\x4d\\xc9\\xa4\\x0e\\xce\\x5a\\x0f\\x9a\\xd3\\xa2\\x02\\x5a\\xce\\xf2\\x62\\xc5\\x67\\x9d\\x64\"},\n{{0x88,0x7f,0xdb,0x48,0x70,0x68,0x1d,0x4f,0xb0,0x6a,0x93,0x62,0x59,0xf7,0x5c,0xae,0x05,0x17,0xf5,0x01,0xaf,0x64,0x6b,0xc0,0x7a,0x4d,0x72,0xbe,0xe7,0xfb,0x1c,0x73,},{0xc7,0x62,0xeb,0xd4,0x8b,0x2c,0xe0,0x2d,0x06,0x38,0x4e,0x38,0x55,0x4b,0x82,0x5a,0xd3,0x22,0xeb,0xea,0x74,0xd2,0x59,0xdf,0x15,0x47,0xa4,0xd5,0x47,0xce,0x00,0x24,},{0x41,0x0a,0x5a,0xf3,0xc5,0x9b,0x7c,0x6b,0xdb,0x21,0x4b,0x16,0x6c,0xb7,0x9d,0x96,0xf8,0x30,0xcf,0x98,0xbf,0x52,0xda,0xd7,0xb6,0xff,0x29,0x79,0xc9,0x7f,0xea,0x4f,0xed,0x5e,0xf7,0xd3,0xd4,0x9f,0x03,0x09,0x72,0x79,0xb9,0xa0,0x99,0x22,0x6e,0x2a,0x08,0xdd,0x30,0xc6,0x07,0x86,0x25,0x4e,0x2d,0xa8,0xde,0xe2,0x40,0xbf,0xc3,0x08,},\"\\xc5\\xdc\\x77\\x9f\\x3f\\x3f\\xac\\x06\\xdd\\x28\\xe5\\xa6\\x7e\\x0e\\x52\\x4a\\xf5\\xb5\\xdc\\x3b\\x34\\x40\\x96\\x57\\xb6\\x3d\\xfa\\xce\\x94\\x71\\xe9\\xa4\\x1e\\x11\\x32\\x17\\x5a\\x0b\\x56\\x9c\\x8f\\xea\\x9d\\x2e\\xef\\x2c\\xf5\\xd5\\x96\\x2c\\x7e\\x0b\\x61\\x45\\xa9\\xe7\\xa0\\xc1\\xaa\\x33\\x77\\x20\\x44\\xf9\\xc3\\x99\\x8c\\x5a\\x8c\\x48\\x86\\x45\\x8b\\x4e\\x58\\x6f\\x93\\x07\\x60\\x83\\x61\\xf5\\x11\\xe7\\xab\\x50\\x92\\xac\\x41\\xec\\x76\\xe0\\x58\\x6e\\xf5\\xb9\\xc2\\x36\\xfc\\xf5\\xca\\x2f\\xc8\\xdd\\x6a\\xae\\xb7\\x89\\x36\\x7f\\x2e\\x7c\\x99\\x09\\x32\\x55\\x5d\\xc5\\x22\\x61\\xe4\\x4e\\x49\\x42\\x34\\x98\\xb5\\x24\\x41\\x91\\x83\\xb6\\xc1\\xf1\\xd4\\x2c\\x45\\x46\\x4e\\xcc\\xb0\\xc2\\xf7\\xe2\\x51\\x77\\xfe\\x5c\\xd4\\x63\\x50\\x2b\\x40\\x3e\\x06\\xd5\\x11\\xfc\\xf9\\xdc\\xb6\\x40\\x12\\xe0\\xf2\\x0b\\x34\\xc2\\xea\\x7c\\x00\\x4d\\x9e\\x48\\x4a\\x7e\\xd8\\x1f\\x32\\x60\\xc4\\x1c\\x8b\\x19\\x53\\x52\\x9f\\x47\\xf7\\x1e\\x86\\x78\\x43\\xcc\\x3c\\x33\\x2a\\xd0\\x36\\x6a\\x63\\x81\\x7e\\xd1\\x2d\\xd4\\x73\\x0d\\x3d\\xfd\\xbd\\x75\\x72\\xb9\\xff\\x79\\x80\\x45\\x94\\x0d\\xd1\\x9f\\xad\\x0c\\x8a\\xea\\x0b\\x4a\\xb6\\x1c\\x40\\x16\\xde\\x32\\x79\\x9c\\x73\\xaa\\x2b\\x92\\xd2\\xc2\\x5e\\xe9\\xb7\\x2d\\x46\\xfe\\x8f\\x06\\x93\\xc5\\x87\\x75\\xef\\xb0\\x5e\\x9e\\x17\\xa5\\xc3\\x46\\xa8\\x12\\x65\\xd3\\x5b\\xe6\\x9a\\x22\\xd0\\x95\\xde\\x18\\x60\\x66\\xa5\\xc6\\xd8\\xc0\\x7a\\x3d\\x38\\xd0\\x02\\xa1\\x0e\\x5e\\xfd\\xb8\\x66\\xda\\x4a\\x9b\\xdd\\x54\\xf5\\x09\\x26\\x61\\xb6\\xc2\\xd7\\x43\\xf5\\xae\\xaa\\x4c\\x6c\\x31\\x8f\\xb5\\x93\\x23\\x90\\x30\\x57\\xe4\\x9c\\x23\\x7b\\x45\\xf6\\x75\\x42\\xa4\\xf2\\x7c\\xaf\\x65\\xb5\\x7c\\xfc\\xf8\\x8b\\x71\\x20\\x3d\\x43\\xd7\\xf9\\x53\\x22\\x16\\x0f\\x95\\xc2\\x32\\xdd\\x10\\xab\\xb1\\x13\\xb7\\x21\\xdd\\xba\\x22\\x26\\xb0\\x63\\x22\\x9b\\xb4\\x41\\x02\\x33\\x6b\\x10\\xbf\\x16\\x56\\x55\\x11\\x61\\x24\\x97\\x86\\xd4\\x54\\xf4\\xe0\\x90\\x9d\\x50\\x00\\x17\\xf6\\xc7\\x56\\x4f\\x73\\x3c\\x83\\x1a\\xf4\\xe5\\xec\\x94\\xdf\\xd3\\xbf\\x8f\\xf5\\xf3\\x02\\x1b\\x70\\xa5\\xca\\x5d\\x28\\xc6\\xdf\\xb8\\xa2\\xc1\\x8a\\x1a\\x66\\x2a\\x33\\x35\\x9f\\x26\\x4d\\x16\\x96\\x98\\xc1\\xab\\x55\\x78\\x3f\\xac\\xa7\\x3b\\xd6\\x8c\\x0f\\x79\\xd1\\xd0\\x4a\\xe0\\xec\\xdb\\x52\\xae\\x76\\x18\\x92\\xc0\\x24\\x93\\xff\\x35\\xf3\\xd8\\x4f\\x66\\xe2\\x36\\xfc\\x58\\x13\\x4a\\xd6\\xa7\\x7d\\x92\\x25\\x49\\x05\\xd7\\x73\\x90\\x0d\\x9d\\xdf\\x26\\x54\\xc7\\x0b\\x46\\xf3\\x41\\xda\\xcb\\x47\\x93\\xca\\x51\\xee\\xde\\x45\\x53\\x3e\\xae\\xeb\\x6e\\x33\\x23\\xbc\\x3e\\x6c\\x85\\xa7\\x94\\x06\\x51\\xc4\\xf6\\xf9\\x81\\x91\\xc6\\x18\\xc8\\x91\\xea\\x4e\\x22\\x0e\\xa4\"},\n{{0x88,0xb3,0xb4,0x63,0xdf,0xc3,0x0d,0x01,0x5e,0xef,0xbb,0xbd,0xd5,0x0e,0x24,0xa1,0xf7,0x27,0x77,0x75,0xbc,0xef,0x14,0xa6,0xbe,0x6b,0x73,0xc8,0xc5,0xc7,0x30,0x3e,},{0xf2,0xb6,0x28,0x4c,0x93,0x0d,0x4a,0xd3,0x2d,0x0a,0xc7,0x19,0x04,0x0e,0xe7,0x88,0x6b,0x34,0x72,0x2e,0xdf,0x53,0xda,0x80,0x1a,0xcb,0x5f,0x93,0x19,0x69,0xe1,0x19,},{0x82,0x5a,0xff,0x71,0xf7,0x93,0x03,0xbf,0x45,0x92,0xbd,0x8d,0xa4,0xd7,0xd9,0x43,0x7f,0xf2,0x67,0x97,0x6f,0x74,0x64,0x37,0x65,0x59,0x88,0xdd,0xcf,0x29,0x37,0x94,0x65,0xa3,0xb4,0x8c,0x9f,0xb0,0xf3,0x1c,0xef,0x03,0xe6,0x36,0x88,0x61,0xc3,0x69,0xb4,0x36,0x4f,0xb8,0xe4,0xb0,0xc7,0x2e,0x26,0xa9,0xa9,0xdd,0xed,0x1c,0x25,0x04,},\"\\x17\\xc3\\x17\\xfa\\x6b\\xc9\\x0c\\x55\\x32\\x32\\x8f\\x02\\xcc\\xfb\\x6c\\x09\\x9e\\x6f\\xe1\\x00\\x01\\x74\\xf2\\xaf\\x3a\\x3a\\x93\\x09\\x42\\x85\\x06\\x71\\x7c\\x5c\\x43\\x35\\xbd\\xd7\\xc3\\x67\\xff\\x4e\\x44\\x8a\\x9c\\x04\\x75\\x03\\xaf\\xba\\x68\\xfd\\x8f\\x79\\x87\\x23\\x7b\\xe7\\xf7\\xfb\\xdc\\x6d\\x73\\xf2\\x4c\\x64\\x21\\xca\\xb4\\x22\\xb3\\xfb\\x25\\xf6\\x7b\\x2d\\x71\\x04\\x2e\\x71\\x57\\x0d\\xf2\\xaf\\x37\\xbf\\xe5\\xc1\\x14\\x21\\x1f\\xd5\\x52\\x4b\\x6c\\x1c\\x6c\\xc5\\x2f\\xab\\xc3\\xcd\\x7f\\xb4\\x64\\xcd\\x58\\x0b\\xb7\\x40\\x71\\xcb\\x30\\x0f\\x8c\\x9f\\x8a\\x46\\x20\\x8e\\x5a\\xa5\\xdd\\xfe\\xa5\\xfe\\x90\\x69\\x7a\\xa2\\xf1\\x4c\\x60\\x79\\x50\\xc9\\x8f\\x23\\x12\\xa9\\xe1\\x6e\\xf6\\x34\\x6a\\x8f\\xd1\\x29\\x23\\x27\\x33\\x82\\x7e\\x15\\x01\\xa6\\x60\\xc7\\x7c\\x29\\xc5\\x6d\\x2f\\xdd\\x1c\\x55\\x97\\xf8\\xbc\\x89\\xaa\\xef\\xe3\\x71\\x37\\x34\\xfe\\x82\\x85\\x82\\x01\\x89\\x1a\\x11\\x47\\xef\\xaf\\x1d\\x78\\xa4\\x71\\xf9\\x20\\xde\\xfc\\x88\\x03\\x44\\x55\\x3e\\xb7\\x16\\xcc\\xe3\\x26\\x0e\\x86\\xa1\\xbc\\x0b\\xe2\\x83\\x73\\xa6\\xa0\\x66\\x11\\x6e\\x8e\\xcb\\x10\\xa0\\xc4\\xa7\\x0c\\xa2\\xb5\\x36\\x4e\\x11\\x9f\\x84\\xae\\xc6\\x0d\\xec\\xed\\x3a\\x4e\\xff\\x1f\\xe6\\x88\\xc5\\xe3\\xe2\\x51\\x47\\x0a\\xb5\\x16\\xfa\\x96\\x4a\\x4b\\x6f\\x28\\x36\\x8d\\xd1\\xe2\\x83\\x59\\x79\\x34\\x06\\x4d\\xc0\\xc5\\xb5\\x69\\x10\\x62\\xcb\\x2e\\x26\\x7b\\xd1\\x5f\\xd4\\x22\\xbc\\xfe\\xfb\\x83\\xcc\\xef\\x7a\\xa9\\xa2\\x27\\x5e\\xf5\\x7e\\x47\\x31\\x49\\x98\\x8c\\x15\\x78\\xfd\\x18\\x70\\x8d\\x2f\\xf6\\x9f\\x8e\\x59\\x80\\xaa\\x82\\x6a\\x82\\xca\\xb7\\xd8\\xb9\\x2b\\xb5\\x3b\\xdd\\x46\\xdb\\x04\\x6e\\xcd\\xfc\\x8c\\xd7\\xae\\x5c\\xe4\\x4f\\x3c\\x5b\\x8c\\x05\\x65\\xb5\\xd3\\xc0\\x72\\xc7\\x6b\\x95\\xce\\x90\\x0a\\xc3\\xee\\x55\\x10\\xdb\\x0e\\x75\\xd3\\xa4\\x15\\x0a\\x98\\xf3\\xcc\\xcc\\xc6\\x9e\\x93\\x0c\\x6b\\xa7\\x41\\xdb\\xb0\\xeb\\x9f\\xb3\\x19\\x68\\x71\\xba\\x20\\x6a\\x58\\xe0\\xda\\xe3\\x9c\\x8d\\x6b\\xb7\\x2a\\x82\\x39\\x9c\\x4b\\x7b\\x9d\\xa3\\x85\\x77\\xac\\x17\\xff\\x15\\x24\\xd6\\x53\\xc0\\xbf\\x33\\x67\\x93\\x23\\xca\\x7e\\xef\\x4e\\x92\\x28\\x72\\x90\\x31\\x56\\x0e\\xd8\\xf2\\xe5\\x19\\x3c\\x64\\x0b\\x2f\\x5e\\x60\\x80\\x75\\xa2\\xed\\x61\\x42\\x8d\\xfc\\xcd\\xc0\\x00\\x50\\xba\\x4b\\x99\\xed\\x6d\\x15\\x36\\xd5\\xac\\x1e\\x93\\x96\\x74\\xb4\\x1d\\x16\\x31\\x2a\\xe5\\xb0\\x7d\\xef\\x1b\\xf5\\x35\\x89\\xbe\\xd4\\x40\\x06\\x02\\xee\\x11\\xb8\\x50\\x33\\x0f\\x38\\xaa\\xd3\\x3e\\xf0\\x41\\x70\\xa3\\x90\\x5c\\x28\\xb5\\x0e\\xcc\\x57\\xdc\\xcf\\x4f\\x29\\xd0\\xc0\\x0f\\x71\\x3d\\x32\\xff\\xc8\\x57\\x95\\x65\\x88\\xa6\\x32\\x6b\\x95\\x49\\xed\\xb0\\xe4\\xfe\\x61\\x85\"},\n{{0x42,0x7d,0x6e,0x42,0x39,0x17,0x89,0x68,0x31,0x60,0x1b,0x8f,0x4e,0x21,0x56,0x1d,0xb6,0x10,0x85,0x71,0xbe,0x00,0x9e,0x29,0xdc,0xa4,0x9a,0x59,0x60,0xff,0x31,0x4b,},{0x8d,0x9e,0x63,0x60,0xfd,0xef,0x24,0x99,0x75,0xdf,0x27,0xb3,0x10,0x6a,0x71,0x12,0x05,0x87,0x72,0x2d,0xf3,0x27,0x0a,0x85,0xa1,0x3a,0x8c,0x3b,0xb8,0xc9,0x80,0x9e,},{0xd1,0xc9,0xa0,0x1c,0x56,0xe3,0x39,0x60,0xf4,0x9d,0xf3,0x7e,0xab,0x96,0x3b,0xc5,0xa9,0x9f,0x25,0xc6,0x00,0x44,0x6c,0xe2,0xca,0x48,0xd9,0x13,0x9d,0xa5,0x73,0x3b,0x71,0x8f,0xbf,0x1a,0x98,0x73,0x93,0xf6,0xe5,0x82,0x3c,0x2d,0x13,0x0c,0x7c,0xe6,0x0e,0xa3,0xdb,0x35,0x43,0xc8,0x85,0x4e,0xf1,0x2b,0x98,0xd3,0x3a,0xdd,0xe7,0x05,},\"\\x9c\\x2c\\xc7\\xf2\\x46\\x2e\\x09\\xc4\\xc5\\x8c\\x27\\x09\\xab\\x42\\x59\\x88\\x5a\\x4e\\x88\\x7d\\x9f\\xa5\\x31\\x88\\x15\\x05\\xaa\\xf2\\x03\\xc1\\x63\\xfb\\x3a\\x0d\\xc0\\x28\\xf4\\xad\\xa6\\x06\\x70\\x63\\x8d\\x4a\\x97\\x27\\xa3\\x90\\x83\\xbe\\xdb\\xac\\xed\\x58\\xed\\xb7\\x79\\xe1\\xce\\x6c\\xcd\\xfb\\x42\\x8c\\x36\\x2b\\xb1\\xdb\\x0c\\x10\\x53\\x00\\x6b\\xd8\\xf4\\xbe\\xf8\\x9a\\x1a\\x9d\\xe0\\x1c\\x77\\x4e\\x35\\x7f\\x91\\x0e\\x5c\\x39\\xb2\\x24\\x77\\x55\\x5e\\x5f\\x7c\\x04\\x98\\xb5\\xb2\\x8f\\x36\\x9e\\x5d\\x3f\\xa4\\x2a\\xb3\\x60\\xe4\\xf4\\x51\\xc6\\x9f\\x81\\xba\\x0f\\x3c\\xce\\xd4\\x3a\\x55\\x9d\\xb6\\x00\\x10\\x42\\x78\\xf8\\x68\\x79\\x6b\\x2c\\x91\\x1b\\x3b\\x03\\x2b\\x72\\x9f\\x4b\\x22\\xac\\x14\\x9d\\xc4\\x67\\xa0\\xca\\xe4\\x8d\\x19\\xe9\\xd9\\x85\\xb4\\x2b\\x62\\x54\\x9d\\xe1\\x71\\xff\\x56\\x6e\\x1d\\x1e\\x9b\\xb8\\xe5\\x6c\\xfd\\x1a\\xe8\\xf7\\xbd\\xdc\\xfd\\x8a\\x23\\x41\\x82\\x7d\\xbe\\x89\\xc8\\x82\\xab\\x3e\\x49\\x83\\x39\\xff\\x68\\x1c\\x7d\\xc1\\x10\\x4d\\xe7\\x38\\xb4\\x80\\x31\\x69\\x43\\x10\\x9f\\x70\\x3d\\x47\\x1a\\xb8\\x6e\\x4c\\xa4\\x28\\x7e\\x4c\\xd7\\x4c\\x31\\x2f\\xf7\\xd0\\x37\\x39\\x56\\x06\\xfb\\x25\\xf8\\x71\\xe7\\x27\\x70\\x78\\xa7\\x87\\xd0\\x2f\\x31\\xcc\\x9e\\x81\\x5b\\xe8\\x60\\x0a\\x7c\\x47\\xc6\\xfd\\xd8\\x23\\x31\\xae\\x9c\\x49\\x6a\\x54\\x7b\\xdb\\x23\\x5b\\x8a\\x56\\xd5\\x32\\x59\\xe6\\x29\\x61\\x24\\xa3\\x2c\\x3b\\x62\\x5d\\x20\\x24\\x19\\xd0\\x64\\xb9\\xa4\\xe8\\x3e\\xfa\\x87\\xf1\\x35\\x37\\xb4\\xf5\\x13\\xb9\\x16\\xa8\\x4f\\xc8\\x66\\xd8\\xa8\\x99\\x80\\x4c\\x78\\x33\\xea\\xa0\\x19\\xe0\\xd7\\xe0\\xe8\\x07\\x5b\\xd6\\xb5\\xcb\\x6f\\xfc\\x76\\x64\\x79\\xf3\\xf6\\xe2\\x0e\\x48\\x1e\\x6a\\xb2\\x7b\\xd8\\x08\\xad\\x90\\x6c\\xdc\\xc7\\x82\\x74\\x30\\xe3\\x12\\xf7\\x40\\xf2\\x75\\xdd\\xf5\\x1d\\xd8\\x32\\x48\\xfa\\x05\\x7c\\x43\\xc9\\xcb\\x77\\x55\\x7b\\x2f\\xd9\\xc2\\xd5\\x28\\x24\\xff\\x9e\\x14\\x6d\\xea\\xc1\\xe6\\x69\\x1d\\x45\\x02\\x13\\xbc\\x59\\x0a\\x49\\xbe\\xc7\\x2d\\x52\\xe3\\x8f\\x6b\\x4d\\xc6\\xcc\\xa9\\x51\\xee\\xf2\\x18\\x4d\\x24\\x25\\x03\\x1a\\xd5\\x9b\\x24\\x2e\\xff\\xa6\\x8b\\x6c\\x72\\xc5\\x4c\\x9d\\xfd\\xb4\\x19\\xc0\\x2e\\xb4\\x3e\\xf3\\xf3\\x4d\\x33\\x8d\\x2a\\x9d\\xd0\\x3a\\x78\\xcf\\xdd\\x01\\x40\\x98\\xe2\\x49\\x25\\x9e\\x77\\x28\\x2e\\x0c\\x3f\\xc1\\x01\\x0b\\x02\\xa6\\x7f\\xf8\\x51\\xe9\\xcf\\xd9\\x74\\x9c\\x1c\\xd8\\xf0\\x6c\\xf4\\x62\\xe6\\xad\\xe9\\x95\\xac\\x46\\x6f\\xab\\x5c\\x79\\x5e\\x9e\\xff\\x13\\xe5\\x5b\\x43\\x50\\xb9\\x4c\\x73\\x16\\xaa\\x49\\x8d\\xf9\\xfd\\xee\\x99\\x58\\x04\\x77\\x93\\xe3\\xbb\\xb8\\x9f\\xb8\\x1d\\xa8\\x5f\\x4b\\x9d\\x43\\xe4\\xb0\\xd4\\x3b\\x38\\x1b\\x94\\xcd\\xc9\\xa9\\x9d\\x06\"},\n{{0xbe,0x93,0x52,0x09,0xf6,0x2d,0xea,0x60,0x12,0xec,0xda,0x6a,0x61,0x56,0xcd,0x16,0x6a,0x4d,0x76,0x11,0x50,0xde,0xed,0x45,0x68,0x16,0xea,0xf0,0xce,0x78,0xa7,0xf6,},{0xd3,0x9a,0x89,0xaf,0x72,0x29,0x39,0x48,0xb1,0x34,0x21,0xfb,0x88,0x3b,0xbe,0x37,0x2a,0xf9,0x08,0x9c,0x22,0x4d,0x42,0xb9,0x01,0x97,0x9f,0x7e,0x28,0x04,0xe1,0xc0,},{0x08,0xe0,0x98,0xa7,0x49,0xfc,0xe6,0xd1,0x23,0x54,0x39,0x58,0x78,0xa8,0xbe,0x35,0xfe,0x9e,0xdf,0x72,0x68,0x4d,0xd8,0x28,0x12,0x24,0x89,0x9b,0x1c,0xae,0xa4,0xed,0x68,0x77,0x85,0xdf,0xf5,0x5a,0x19,0x98,0x9e,0x03,0x63,0x6e,0x16,0x66,0x38,0x6f,0x22,0xc3,0xf4,0x43,0xec,0xf6,0xfd,0x34,0xd5,0x99,0xff,0x3e,0xc2,0xfa,0xf1,0x01,},\"\\x11\\x7f\\x42\\x7c\\xb6\\x81\\x50\\xca\\xfc\\xfa\\x46\\x2c\\x42\\x20\\x61\\x41\\x42\\x7c\\x4d\\xce\\xa1\\xc8\\xea\\xcc\\x2d\\x30\\xbe\\xd1\\xe9\\x02\\x07\\xd5\\xae\\x30\\x5e\\x1f\\xc1\\x6c\\x54\\xe4\\xc5\\x4c\\xc6\\x87\\x8c\\xdb\\xed\\xc9\\xf5\\x1f\\xe1\\x84\\x61\\xec\\x37\\xc5\\x57\\xb1\\x15\\xd1\\x3c\\x86\\x82\\xc4\\xe1\\x5f\\x50\\x52\\x96\\xa1\\x76\\x0e\\x1e\\x75\\xf5\\xab\\x27\\xa5\\xc1\\x5a\\x13\\x57\\xd2\\xc8\\xc4\\x0d\\xd5\\x35\\x5f\\x7c\\x82\\xfe\\xa5\\xd2\\x7e\\x28\\x87\\x63\\x58\\xc1\\x2e\\x91\\x13\\xee\\x29\\x83\\xea\\x6f\\x09\\xc6\\x4e\\x06\\xe2\\x97\\xdd\\x96\\xb3\\x4d\\x9b\\x5e\\xd4\\x9f\\xc4\\x7a\\x88\\x39\\x54\\x9c\\x66\\xb0\\x02\\xfe\\x94\\x5e\\x8f\\x94\\xe7\\xd2\\x31\\x5c\\x50\\xca\\x4d\\xc0\\x98\\xbe\\x4b\\x32\\x89\\x81\\x2f\\xbe\\xa9\\x6b\\x47\\xce\\x60\\x45\\x40\\xbd\\xe0\\xe5\\xab\\x0b\\x1b\\xc0\\x36\\xbe\\x9b\\x6a\\x95\\xe0\\x9c\\x81\\xe8\\x98\\x64\\x0c\\x8f\\x05\\xd6\\x0a\\xd9\\x42\\x18\\xd0\\xe6\\x6c\\xeb\\x85\\xa2\\x6b\\x78\\x29\\x22\\x20\\xbf\\xd0\\x61\\xdd\\x07\\x35\\x12\\x92\\x3b\\x90\\xc7\\x9d\\xcf\\x5a\\x19\\x35\\xfa\\xfe\\x8e\\x01\\xef\\x8b\\xf8\\x1b\\x4d\\x37\\xc5\\xa5\\x71\\xb5\\x0c\\x42\\x1f\\x9b\\xd2\\x19\\x4b\\xef\\x35\\x86\\xfc\\xb8\\x58\\x48\\x77\\xbb\\x7e\\x04\\x81\\x65\\x5b\\x05\\xc7\\xb6\\x43\\xb1\\xe4\\x5b\\x04\\x03\\x62\\x72\\x84\\x18\\x52\\xe3\\x19\\x40\\xef\\x8f\\x3b\\x6d\\x4f\\xeb\\x5d\\xf0\\x79\\xd1\\x76\\xf9\\x79\\xc1\\x8a\\x11\\xa6\\x6d\\x12\\x14\\xe5\\x2f\\x68\\x7e\\x90\\x63\\xc1\\xc2\\xb7\\x27\\x7b\\x68\\x5d\\x5c\\x72\\xad\\x56\\x9f\\x78\\x73\\x83\\x8f\\x91\\x02\\x57\\xa0\\x53\\x13\\x1c\\x83\\xeb\\xce\\x86\\xe6\\x9d\\x73\\x63\\x62\\xbe\\xbc\\x96\\xbb\\xfa\\x35\\xfc\\xba\\x1c\\xb5\\x27\\xe7\\x48\\xe5\\xf5\\x79\\x92\\x9f\\xd4\\x0c\\x56\\xb1\\xa5\\x1a\\x22\\x2e\\x86\\x33\\x02\\x70\\x5c\\x86\\xf7\\xb5\\x4e\\xbf\\xbb\\x94\\x82\\xf7\\xe2\\x80\\xf7\\xbe\\xc8\\xca\\xf3\\xa6\\xb5\\x67\\x1a\\xc3\\x0c\\xd1\\xbe\\x52\\x92\\x88\\x79\\x7c\\x01\\x3c\\xe5\\x6b\\xd1\\x86\\xde\\x7d\\xfc\\x18\\x28\\x69\\x14\\x25\\xc1\\x47\\xc5\\x17\\x4a\\x29\\x0d\\x80\\xcb\\xd5\\x9c\\x19\\xda\\x7a\\xdf\\x77\\x91\\x88\\x82\\xa7\\xb2\\xa9\\xa6\\x4e\\x6d\\x76\\xb4\\x8b\\x92\\xf2\\xa2\\x66\\xee\\xe6\\xe2\\x51\\xd2\\xe8\\x17\\x65\\x2b\\x88\\xb5\\x02\\xde\\x73\\x99\\x78\\x2d\\x75\\x29\\xa8\\x1d\\x0a\\x36\\x39\\x96\\xb9\\xdf\\x68\\xb1\\x5a\\x76\\x30\\x90\\x4c\\x8c\\x24\\x60\\x81\\xfa\\x4f\\x09\\x29\\x9f\\x15\\x75\\x79\\x58\\xe0\\x89\\xa9\\x01\\xc3\\x56\\x46\\x15\\xc0\\xf7\\xcf\\x27\\x52\\xb8\\xb9\\xe5\\x21\\x33\\x8d\\x83\\x6e\\x3d\\xae\\x4c\\xe2\\x37\\x46\\x42\\x25\\x3c\\x4c\\x98\\x31\\x97\\x4e\\x5d\\x8c\\x28\\x42\\xf4\\x90\\x07\\xb7\\x17\\x75\\x09\\x3d\\xfe\\x57\\xf4\\x44\\x92\\xf0\"},\n{{0x68,0x18,0xc6,0x0b,0xb6,0x43,0x9a,0xc2,0xee,0xe2,0xd4,0xe1,0x28,0xe9,0xd8,0x69,0x1d,0x4a,0xd5,0xd3,0x63,0xfe,0xd7,0xd6,0x57,0x7a,0x62,0xb6,0x56,0x99,0x94,0xa4,},{0x73,0x45,0xec,0x11,0xbc,0xcc,0x05,0x6f,0xc4,0xef,0xfa,0x3e,0x4e,0xf6,0x70,0x99,0x6a,0xa2,0x6a,0x1b,0xb1,0xb8,0x33,0x91,0xba,0xbc,0x39,0xa1,0xa5,0x96,0x01,0xf9,},{0x15,0x05,0x96,0x7a,0x27,0xb9,0xf8,0x6e,0x92,0x42,0x44,0x40,0x02,0xa1,0xe3,0x19,0x7d,0x74,0xdd,0xcd,0x89,0x65,0x9e,0xc5,0x14,0x02,0x02,0xaa,0xc7,0x94,0xb8,0xad,0xc1,0x93,0xe7,0xd3,0x0f,0x33,0x82,0x64,0x29,0x90,0xf6,0xfe,0xd7,0xa9,0x99,0xca,0xc8,0xc6,0x1e,0xaa,0x39,0xb7,0xd9,0x08,0x16,0xf1,0xd7,0x38,0x74,0x4b,0xe1,0x01,},\"\\xb2\\xae\\x65\\x8b\\x3c\\x13\\xc3\\xcd\\xeb\\x1d\\xc9\\x93\\xb0\\xf4\\x5d\\x63\\xa2\\xea\\x9a\\xbd\\x0b\\x7a\\x04\\xf1\\xf5\\xce\\x59\\x32\\x80\\x6c\\x2c\\xa9\\xb7\\xa2\\x04\\xfb\\xf8\\xd0\\x66\\xb7\\xf0\\xfe\\x6a\\xe0\\xd1\\xda\\x68\\xc8\\x85\\xee\\x11\\xf6\\xf6\\xdb\\x7e\\x83\\x20\\xa2\\xea\\x65\\x0b\\x53\\x38\\x51\\xcd\\xd9\\x9d\\x90\\x3a\\xa0\\xb3\\xfa\\xa3\\xc9\\x50\\xf7\\x02\\xf0\\x4e\\x86\\xb4\\xee\\xb3\\xa1\\xc7\\xbc\\x85\\x4b\\x25\\x14\\xfa\\x5b\\x47\\x66\\xd3\\x75\\xb4\\xf1\\xad\\x61\\x07\\x53\\x78\\xdd\\x92\\xfd\\x62\\x6c\\x2b\\x47\\xe0\\x13\\x83\\xea\\x72\\x98\\x79\\x59\\x26\\x2c\\x56\\x28\\x62\\xb4\\x5b\\x75\\x57\\x67\\x14\\x13\\xb6\\x66\\x14\\xbc\\xc9\\xf7\\xbd\\xb9\\xee\\x46\\xcb\\xed\\x89\\x65\\xbf\\xa5\\x05\\x31\\x50\\x90\\xc7\\x20\\x4b\\xea\\x89\\x17\\x5b\\xe5\\xf2\\x08\\x02\\xe3\\xde\\xdd\\xcb\\xd8\\xdd\\x64\\xcf\\xef\\x7e\\xe6\\xa6\\xe3\\x86\\x0c\\xe1\\xe5\\x79\\x9d\\xf5\\xd8\\x10\\xd5\\xec\\xf3\\x2e\\x61\\x5d\\x16\\xdf\\xf8\\x7a\\xbd\\x4a\\x63\\x6e\\xa1\\x7a\\xa4\\xec\\xe5\\xb6\\xb2\\xc0\\x46\\xb6\\x5b\\x5a\\xf7\\x49\\x86\\x2b\\x45\\x79\\x0c\\x39\\x17\\x68\\x20\\xb3\\x69\\x01\\xbe\\x64\\x9c\\xf4\\x16\\x9d\\xf7\\xe9\\x23\\x95\\x6d\\x96\\x06\\x49\\x50\\xc5\\x55\\xf4\\x5a\\xcb\\x94\\x50\\x7c\\xfd\\x0c\\x3b\\x33\\xb0\\x80\\x78\\x5e\\x35\\xc0\\xd2\\xb0\\xad\\xdc\\x4c\\x0a\\xd3\\xfb\\x21\\x6a\\xc2\\xe6\\x01\\xc9\\xc7\\xe6\\x17\\xda\\xbd\\xa3\\x33\\xda\\xe6\\x03\\xcc\\x9d\\xb1\\xfc\\x62\\xae\\x4e\\x0e\\x45\\xe3\\xcc\\xdd\\x16\\x6a\\x67\\x81\\xe2\\x43\\xb7\\xda\\xa1\\x38\\x80\\x66\\x32\\xf5\\x38\\x84\\x4e\\xe3\\xd1\\x40\\xb7\\xa8\\xbb\\x2b\\x54\\x01\\x00\\x77\\x8c\\x45\\x8e\\x06\\x61\\x70\\x70\\x5e\\x5f\\xb2\\xc8\\x80\\x29\\x09\\x8b\\x99\\x2c\\x39\\xbc\\x9f\\xf6\\x33\\x0b\\xfc\\xfe\\x77\\x52\\x32\\x0e\\x6e\\xa0\\x94\\x9d\\x2c\\x87\\x1a\\xed\\xc1\\x87\\xbe\\x27\\xfe\\xf7\\xdb\\x5f\\x72\\xa6\\xa7\\x73\\xed\\xde\\x0d\\xc5\\x2a\\xe2\\xed\\x93\\x1c\\xb2\\x68\\x17\\xb8\\x5b\\x15\\x45\\x89\\x4d\\x92\\x29\\x8a\\xaf\\x87\\xcc\\xbc\\x78\\x3e\\x8d\\xd6\\xd1\\x64\\x93\\xf5\\x6e\\xad\\x2b\\xa8\\x52\\xee\\x9c\\x7d\\x10\\x07\\x44\\x06\\x44\\x0d\\x2a\\x27\\x9a\\xbc\\x87\\x4f\\x15\\x46\\x8d\\xd6\\x6a\\x71\\x7b\\xac\\xe3\\x7b\\xe7\\xb7\\x05\\x5d\\xd9\\x68\\x1f\\x8b\\xe8\\x13\\x29\\xee\\x7a\\xf9\\x7e\\x3a\\xbc\\x43\\x4a\\xc1\\xc9\\x3a\\xec\\x58\\x2f\\x23\\xfd\\x1e\\xc0\\xfa\\x5a\\xaf\\xcf\\x7b\\xfb\\xda\\x00\\xff\\xa9\\x7a\\xe3\\x17\\xae\\x91\\x8d\\x34\\x9d\\x21\\xa7\\xf4\\x61\\x91\\x42\\xba\\x23\\xda\\xce\\xf7\\xb3\\x90\\xae\\x26\\xa1\\x7e\\x2e\\x29\\x62\\xae\\x27\\x00\\x53\\x76\\xb7\\x2d\\x4d\\xa9\\xe2\\x97\\x96\\x53\\xa6\\x63\\x25\\xa1\\x46\\x17\\x63\\x8d\\xbe\\x1a\\x55\\x40\\xb6\\x83\\xac\\x00\\x17\"},\n{{0x6d,0x1d,0xa5,0xb4,0x83,0xe6,0x4b,0x03,0x65,0x99,0x0f,0xf0,0x93,0x81,0xfb,0x17,0x02,0xfd,0x8e,0xc3,0xa1,0xa3,0x69,0xcd,0x52,0xe4,0xc5,0x67,0x13,0xa3,0x14,0xa5,},{0x08,0x05,0x5c,0x26,0x1f,0x26,0xe0,0x2a,0x65,0x8f,0x66,0xd9,0xba,0x01,0xfc,0xde,0x53,0xe9,0xad,0xe3,0xed,0xc6,0xbf,0x81,0x5e,0x4a,0x68,0x02,0xe1,0x67,0x7a,0xb3,},{0xa5,0xb8,0xb4,0x4a,0x91,0x44,0x4c,0x64,0x37,0x4b,0x52,0x3c,0xb4,0xdc,0xb0,0xce,0xf4,0xce,0x52,0x40,0x8b,0x98,0x12,0x6d,0x7e,0x1a,0xe8,0xbd,0xc2,0x8c,0xf5,0x14,0x70,0xce,0x4e,0x25,0x3e,0x0b,0xe6,0x2b,0xd6,0x8e,0xbf,0x5f,0xa6,0xbc,0xe1,0x58,0x5e,0xcc,0xfa,0x92,0x56,0xc0,0x73,0xee,0x03,0xe5,0x4c,0x52,0x5b,0xbe,0x2d,0x0a,},\"\\x79\\xa2\\xc3\\x70\\x55\\xf1\\x89\\xf3\\x24\\x7f\\x1f\\x8c\\xea\\x19\\xb2\\xea\\x40\\xd8\\x58\\xdb\\x1f\\x5d\\x13\\x92\\xee\\x6d\\x41\\x1c\\x78\\x02\\xee\\x23\\xde\\x52\\xad\\x02\\x81\\x17\\x25\\xa9\\x4d\\x76\\x67\\x5d\\xa8\\x9a\\x96\\xb5\\xd0\\x7a\\xbc\\xee\\x23\\x3a\\x1a\\x2e\\x1f\\xa3\\x24\\xff\\xf9\\xe7\\x8a\\x4c\\x19\\x61\\x47\\xf8\\x57\\x0b\\x0b\\x13\\x71\\x3d\\x96\\xaa\\x5d\\x75\\x0a\\x15\\xd7\\xcd\\x16\\x2e\\x7b\\xa2\\xe7\\x53\\x33\\x60\\x7d\\xd6\\x98\\xeb\\x47\\x73\\xc7\\xe9\\x1f\\x76\\x68\\xff\\x8b\\x62\\xf0\\x46\\x40\\xeb\\x12\\xec\\xf1\\x22\\xfc\\xe6\\xb8\\x32\\xe0\\xd0\\xdf\\x92\\x8e\\xef\\xd2\\xc2\\x00\\x23\\x64\\xaf\\x6b\\xb5\\x52\\x91\\xd3\\xf5\\x49\\x29\\x08\\x5b\\xe3\\x38\\x34\\x2f\\x09\\xda\\x73\\xe2\\x79\\xc8\\x7c\\x83\\x24\\x55\\x58\\x19\\xed\\x57\\xe7\\x8d\\x7a\\xc4\\x09\\x51\\xd3\\x3f\\x65\\xb9\\x4a\\xa1\\xe5\\x55\\xe9\\x2a\\x06\\x3d\\x11\\xf1\\xff\\x7b\\x12\\x69\\x43\\x41\\xe3\\xfe\\x44\\x49\\x33\\xd0\\x1a\\xa3\\x67\\x53\\xed\\x3c\\xdd\\xa8\\x90\\xbd\\xf9\\x5a\\x82\\x05\\xb5\\xd8\\x93\\x22\\x19\\x91\\xc7\\x95\\xad\\x0a\\x4a\\x94\\x6f\\x58\\xd4\\x0a\\x45\\x34\\x51\\xaf\\x21\\x4f\\xd4\\x65\\xe2\\x8d\\x3e\\x2f\\x0a\\x56\\xaa\\x56\\xde\\xf8\\xdc\\x04\\xaa\\xd3\\x57\\x13\\xab\\xfc\\x8b\\xd7\\x85\\x6d\\x5a\\x9d\\xc3\\xf6\\x0a\\x3f\\x2b\\xd3\\xe6\\x36\\x6f\\x1f\\x24\\x4e\\x94\\x1d\\x6a\\xea\\x89\\x2f\\x6a\\x88\\x93\\x1f\\xe1\\xc3\\x13\\xe0\\x90\\x78\\xe9\\x0b\\xc6\\x39\\x2d\\x49\\x05\\x33\\xc9\\xea\\x3f\\xf6\\xde\\xaf\\x3a\\xad\\xfa\\x8d\\xfd\\xc4\\xe9\\x0f\\x64\\xaf\\x47\\x58\\x9e\\xa6\\x5a\\x87\\xac\\xd2\\x19\\x96\\x02\\x35\\x1d\\x3a\\xfc\\x21\\x03\\x19\\x6e\\x03\\x94\\xed\\x52\\x3a\\xa7\\x99\\xd3\\x1e\\x11\\xd3\\x4f\\xff\\x54\\x6d\\x44\\xf4\\x36\\xb3\\x48\\x59\\xf9\\xcf\\xbc\\x9c\\xe4\\x03\\xde\\x5a\\x98\\x30\\xec\\x3d\\x45\\x3f\\x0d\\x45\\x97\\x0f\\x57\\x2c\\x14\\x4f\\x19\\x1b\\x2f\\xbb\\x2d\\x0e\\xa6\\xcc\\x9c\\x8e\\x24\\xd9\\xc0\\xb2\\x18\\x3b\\x27\\x80\\x72\\xeb\\xb0\\xbe\\x2d\\x70\\xd0\\x37\\xfd\\x2e\\x8e\\xc1\\x8d\\xc4\\xc9\\xb2\\x1a\\xbd\\xc6\\xa4\\xce\\x8d\\x46\\x68\\xa2\\x20\\xee\\xbd\\x69\\x34\\xf0\\x4b\\xaf\\x0e\\x88\\xa4\\x88\\xd2\\xdf\\xc7\\x35\\xa7\\xc5\\xa7\\x0d\\xbb\\x01\\x66\\xa2\\x1a\\xe0\\x11\\xfc\\x6e\\x7d\\xa1\\x0f\\xc3\\x20\\x33\\x62\\x71\\xd9\\xee\\xad\\x51\\x0a\\x6f\\x70\\x32\\xf2\\x29\\x66\\x92\\xbe\\x50\\x80\\x21\\xbc\\x98\\xc1\\x70\\xbe\\x42\\x35\\xf7\\xce\\x31\\xf2\\xbc\\xd6\\x34\\x11\\x63\\x68\\x33\\x76\\xae\\x2c\\x56\\x62\\xcb\\x47\\x70\\xc9\\x6e\\x01\\x8e\\xf1\\xbf\\x47\\x91\\x33\\x19\\xc9\\xa0\\x9b\\x9e\\x96\\x5a\\xb5\\xc3\\xe9\\x7b\\xbc\\x75\\x6a\\x56\\x66\\xb4\\x56\\x7f\\x2c\\xff\\x2d\\x0c\\x3a\\x6a\\x40\\x26\\x15\\x8c\\xb9\\xf9\\x0f\\x95\\x00\\x56\"},\n{{0x51,0x46,0xf5,0xb7,0xf1,0xba,0xa1,0x9f,0xc8,0xcd,0x78,0x5c,0x89,0x6e,0x0f,0x90,0xf9,0xf6,0x59,0xb7,0x7b,0x1b,0x9b,0xb4,0xad,0xca,0xb5,0xa6,0x26,0x72,0x05,0xe4,},{0x68,0x8a,0x8d,0xe6,0x4e,0xff,0x33,0xba,0x6b,0xbe,0x36,0xcd,0xd6,0xa3,0x84,0xbb,0x67,0xb3,0xf4,0x26,0x36,0xdb,0x23,0x4f,0xf5,0xef,0xe0,0xb3,0x17,0x43,0xc7,0xe6,},{0x4b,0xdb,0xd7,0xc6,0x4f,0x13,0xe2,0x78,0xc2,0x39,0x69,0xe7,0xeb,0x38,0x6b,0xbe,0x49,0x9d,0xbd,0xef,0xc3,0xff,0x4e,0x30,0xcf,0xac,0x5c,0xf8,0x6f,0x21,0x6c,0x24,0xc9,0xe6,0xcd,0xe2,0x0e,0x52,0x9d,0x14,0x7f,0xb7,0xea,0x08,0xf2,0x59,0x3a,0xd5,0x09,0x03,0xb5,0xed,0xbf,0x86,0xb4,0xd2,0x8f,0x2e,0xb3,0x2e,0xf1,0x37,0xf0,0x0c,},\"\\x97\\xbd\\x99\\xf5\\x18\\xee\\x07\\x88\\xd5\\x76\\xd9\\x9c\\x04\\x3b\\x44\\x9d\\xfc\\x24\\x2a\\xc5\\xee\\xae\\xc3\\x44\\xa1\\x94\\x32\\xb3\\x45\\x96\\x2e\\xc4\\x12\\xce\\x55\\x36\\x2b\\x3b\\x85\\x1d\\x98\\x11\\x9f\\xce\\xb9\\x32\\x83\\x47\\xf6\\xfc\\xc6\\x8d\\xbf\\x56\\xa2\\x81\\x4d\\xb0\\x9e\\x93\\x85\\x84\\x3a\\x93\\x11\\x89\\xea\\x3e\\x72\\xda\\x9d\\x79\\xa4\\x56\\x93\\x05\\x3c\\x03\\x57\\x01\\xdc\\x55\\x51\\x24\\x0f\\x95\\xb3\\x03\\xfb\\xa1\\x6f\\x89\\xaa\\x53\\xa4\\x38\\x82\\xb0\\xf1\\x38\\x12\\x02\\xc7\\x8f\\x9c\\x74\\x19\\x89\\x9f\\x23\\x51\\xec\\xa9\\x5e\\x20\\xbf\\xee\\x76\\x35\\x1c\\x48\\xd0\\x04\\x99\\xf5\\x91\\xda\\x56\\xa9\\x95\\x24\\xbb\\x74\\xfe\\x1c\\x83\\x4e\\xe9\\x10\\x77\\x13\\x9f\\x1e\\xdf\\x67\\x31\\x5c\\x07\\xa3\\xfd\\x97\\xf8\\x0b\\x7c\\x27\\x6b\\x6c\\xf6\\xb5\\xcc\\x36\\xbe\\x36\\x3b\\x73\\x12\\x17\\xf6\\x31\\x9f\\x51\\x29\\xba\\x7b\\x14\\xd0\\x54\\xc8\\xd8\\x1d\\x8e\\x3a\\x3f\\x3b\\xe6\\x2a\\xc3\\x1f\\xf6\\x2d\\xf6\\xa3\\xb2\\xee\\x25\\x96\\x96\\x9b\\x99\\x17\\x04\\xb3\\x1c\\x68\\x99\\x97\\xab\\x46\\x28\\xbc\\x26\\x60\\xc6\\x78\\x72\\x13\\x2e\\x85\\xda\\x0c\\x4f\\xcf\\x56\\x79\\x65\\xf1\\x25\\x4a\\x8f\\x43\\x26\\x92\\xa1\\x7b\\xb8\\x6c\\xb3\\xc1\\xdc\\xba\\xac\\x93\\x95\\x52\\xf0\\x9e\\x50\\xec\\x5b\\x0d\\xe2\\xef\\x85\\xe0\\xac\\x25\\x3a\\x41\\x65\\x65\\x5d\\xb5\\xb5\\xc4\\x98\\x03\\x82\\x1d\\x85\\x9c\\x60\\x96\\x1e\\x06\\x1d\\x58\\x27\\x8b\\x82\\x7d\\xd4\\xd3\\xbc\\x47\\xf1\\xc2\\x2d\\xe0\\x94\\x90\\x6b\\xdb\\xbf\\x3b\\xad\\xbd\\xde\\x22\\xba\\x24\\x25\\x58\\x55\\xeb\\x86\\xd1\\xd7\\xf3\\x70\\x82\\x05\\x93\\x11\\xdc\\x07\\x28\\xeb\\xea\\xf2\\x6c\\x44\\x73\\xba\\xd1\\xfa\\x9e\\x61\\x4b\\x53\\x3b\\x81\\x1b\\x6b\\xcb\\x06\\x50\\xc0\\x6d\\x87\\x9a\\x52\\x45\\x78\\x8f\\x34\\x01\\xb4\\x61\\x97\\x30\\x07\\x74\\xa9\\xaa\\x73\\xcd\\x97\\x8c\\x05\\x30\\xc8\\x1a\\x53\\xbd\\xb3\\xfc\\x93\\x24\\x14\\xb3\\xe3\\x04\\x40\\xdc\\x12\\x74\\x41\\xef\\xf1\\x60\\x5e\\x7f\\xd9\\xac\\x8c\\x63\\x2e\\x82\\xbf\\x1b\\x45\\x3d\\x4f\\x33\\xa5\\x7e\\x4b\\x67\\xb0\\xb6\\xfc\\xf6\\xed\\x55\\x55\\xb5\\xf5\\xa3\\x00\\xa1\\x4a\\x00\\xd0\\x38\\x5a\\x33\\x75\\x05\\x25\\xb0\\x0e\\xdb\\x31\\x2c\\x6b\\xfd\\xd6\\x4e\\xdd\\x3b\\x53\\x16\\xd1\\x9f\\x95\\x8c\\x51\\x76\\x34\\xf0\\x13\\xb0\\x08\\x93\\x6d\\x34\\xe9\\xb5\\xe1\\xe9\\x28\\x3a\\x5f\\x0f\\xd7\\x78\\x33\\x77\\xc0\\xe5\\x09\\x06\\x41\\xbb\\x9d\\x33\\x8c\\xf3\\x13\\x3a\\xcd\\x0b\\x97\\x1e\\x53\\x79\\x04\\xf1\\x7a\\xf9\\x29\\x11\\xaf\\xad\\x72\\xee\\x97\\xf9\\xa8\\x28\\x3a\\x16\\xa7\\xe2\\x6a\\xb4\\x28\\x41\\x6c\\x10\\x17\\xda\\xe9\\xb1\\xa9\\x9c\\x4c\\x33\\x20\\xad\\x16\\x3b\\xdc\\xfc\\x32\\x8b\\xfa\\xf9\\xb8\\xd5\\xd7\\xd2\\x6d\\x41\\xd1\\xef\\x21\\xa5\\x20\\x8f\\x01\"},\n{{0x5e,0x6f,0xda,0xc9,0x35,0x1a,0x63,0x7b,0x99,0xf3,0x3a,0x26,0x4e,0x12,0x87,0x69,0x7e,0x2a,0xba,0xb0,0xcc,0xa1,0x66,0x21,0x79,0x24,0x84,0xf5,0x60,0x6f,0x44,0xc1,},{0x57,0xe5,0xf8,0x8a,0xcd,0xdc,0x8c,0xde,0x7d,0xd0,0x7a,0x31,0x46,0xfb,0x1d,0x4f,0x7a,0x9b,0x63,0x83,0xa8,0xf6,0xb2,0xb8,0xd9,0xb0,0x7e,0xbc,0x3f,0xc4,0xdd,0x20,},{0x98,0x7e,0x32,0xe0,0x0a,0x8a,0x16,0x32,0xf4,0x7b,0x50,0x31,0x94,0x35,0x5c,0x98,0x0c,0xb2,0x2a,0xde,0xb3,0x26,0xb4,0xe3,0x11,0x5e,0xca,0xb0,0x4b,0x70,0x4d,0x18,0x6c,0xd9,0x2e,0x3c,0x3a,0xc7,0xb4,0xe2,0x93,0x6c,0xbd,0x07,0xcb,0x79,0x4e,0xc0,0xcf,0xe9,0x1a,0x97,0x87,0x2f,0xf2,0xb4,0x13,0x76,0xf5,0xf1,0x8f,0x55,0xb8,0x05,},\"\\x4d\\x6c\\xd3\\xbc\\x2f\\x86\\x26\\x6b\\x8b\\xb1\\xb6\\x1d\\x0e\\x1c\\xaa\\x9b\\xd2\\xd4\\xa1\\x80\\x36\\x1a\\xef\\x3a\\x18\\xd3\\x90\\xb1\\x0f\\x7e\\x86\\x0f\\x69\\x7e\\x24\\x7e\\xb6\\xc3\\xe5\\x1d\\x3b\\x97\\x6b\\xf0\\xca\\x18\\x3d\\x01\\xa6\\x98\\x80\\xf1\\x5c\\x94\\xb8\\x75\\x66\\x8c\\xa3\\x0d\\xad\\xa0\\x89\\x5b\\xed\\xd4\\xd7\\x05\\xa0\\xe0\\x33\\x04\\xd0\\x63\\xde\\xa8\\x7c\\x7f\\xde\\xc9\\x8b\\x89\\xc0\\x6f\\x13\\x0d\\xd5\\xbd\\x58\\x6b\\x54\\xd9\\xba\\x73\\x78\\x26\\xbb\\x40\\x5c\\xd8\\xac\\x8b\\xbc\\x95\\x00\\xac\\xda\\x3c\\x07\\x46\\x1d\\x00\\x94\\x40\\xaf\\x0b\\x25\\x31\\xe7\\x2f\\x3f\\xf5\\x01\\x6a\\xe2\\xd8\\x6d\\x69\\xb8\\x7f\\xb2\\x73\\xd1\\xe8\\xdd\\x5f\\x6a\\x26\\x4b\\xee\\xbb\\x2f\\x88\\x59\\x96\\x74\\x1f\\xfd\\xa2\\x77\\xa0\\xfb\\xf8\\xef\\x08\\xf8\\x1f\\x22\\xee\\x59\\x61\\xd9\\xd3\\xfc\\x93\\x83\\x62\\xe1\\xca\\x12\\x00\\x4a\\x91\\xd9\\xb5\\xf7\\xa6\\x83\\x3a\\x6c\\x22\\x95\\x5a\\xc0\\xcd\\xa3\\x39\\x06\\x71\\x91\\x0c\\xbd\\x51\\xe6\\x85\\xfe\\x09\\x59\\x73\\xe4\\x15\\xfc\\x2d\\xb8\\xad\\xf1\\x0b\\x14\\x7e\\xc7\\x08\\x0c\\x3b\\x8e\\xbd\\x07\\xd2\\x1b\\xb9\\x55\\x6d\\xa8\\x54\\x30\\xa2\\x68\\xee\\xd8\\x48\\x6b\\x1e\\x31\\xc9\\x43\\x13\\xb0\\x16\\x49\\xfe\\x91\\xb2\\x22\\xf8\\x5a\\xde\\xe1\\x5e\\xb7\\x77\\x07\\xd7\\x8f\\xfc\\xb6\\x60\\x92\\x65\\x44\\xd3\\x3b\\xe9\\x99\\x4a\\x29\\x76\\x20\\xdc\\x7a\\xed\\x97\\xf3\\x92\\x63\\x90\\x53\\xf3\\x88\\xb0\\xb3\\xaa\\x3b\\xd0\\xac\\x5b\\x03\\x3c\\xb4\\x14\\xbe\\x52\\x0b\\x43\\xdf\\x68\\x26\\xb9\\x76\\x89\\x0d\\x0c\\x53\\xb9\\x7b\\x6c\\x92\\xe7\\xd1\\xa1\\x57\\x3d\\x0c\\x74\\x94\\xd7\\x47\\xe0\\xca\\xd9\\xbd\\x8e\\xa5\\x38\\xd6\\x2a\\xd5\\x98\\x01\\xad\\x07\\x16\\xf1\\x70\\x19\\x3e\\x30\\x09\\xd9\\x95\\x9c\\x55\\xd2\\xff\\x64\\x79\\x9b\\xd9\\x59\\x35\\x9a\\xbb\\x94\\xca\\x97\\x23\\xb5\\xff\\xc2\\x4c\\x95\\x07\\xf8\\xc5\\xfd\\x6e\\x88\\xea\\xae\\x7a\\x70\\xad\\xd8\\x4d\\x74\\x4c\\xcf\\x8b\\x98\\x36\\x37\\x88\\xf0\\xbf\\xb1\\xa0\\x25\\x22\\x02\\x57\\x51\\xe5\\x34\\x71\\x0d\\x40\\xa2\\xd3\\x8a\\x79\\x11\\x94\\xeb\\xa2\\x93\\xfd\\x20\\x46\\xcc\\x14\\xdd\\x38\\x76\\xd1\\x68\\xfc\\x6e\\x23\\x6c\\xbe\\x14\\x6d\\x63\\x69\\xd2\\x25\\xbf\\xa6\\x7e\\x53\\x97\\x98\\x65\\xf7\\x88\\x73\\xa9\\xfc\\xf0\\x3c\\x18\\x6f\\xa8\\x52\\x1f\\x0a\\x55\\x45\\xac\\xce\\xe8\\x0d\\x1e\\x55\\x10\\x72\\x21\\xe2\\x1f\\x0f\\x22\\x91\\xc1\\x43\\xde\\x02\\x3e\\x88\\xd7\\x33\\x0c\\xc8\\x7d\\x4c\\x51\\xff\\x29\\xa3\\x09\\x06\\x05\\xe9\\x73\\x94\\x90\\xc1\\xdc\\xee\\x71\\x34\\x95\\xf2\\x31\\xc2\\xa3\\x6b\\x11\\xab\\x23\\x55\\x47\\xfb\\x63\\x28\\xf7\\x47\\x33\\x6d\\x9b\\x1e\\xf2\\x5a\\x8a\\xb9\\x9c\\xed\\xa9\\x57\\xb2\\xdc\\xce\\xe4\\x07\\x5b\\x0d\\x03\\x38\\x1b\\x94\\xae\\x18\\xd0\\x41\\xea\"},\n{{0xfc,0xff,0xf0,0x93,0x2d,0xc8,0x6e,0xa5,0x90,0x2a,0x8d,0x33,0x07,0x33,0x29,0x96,0x0c,0xd8,0x18,0x8a,0x07,0x5d,0xd0,0xbc,0xdf,0xa8,0x38,0x2c,0x20,0xb0,0xe7,0x8f,},{0x0c,0x92,0x05,0xa9,0x0b,0xbe,0x7f,0x2d,0x50,0x5e,0x17,0xfa,0x3d,0x08,0x0b,0x52,0x2a,0x1d,0x7a,0x15,0x2c,0xad,0x2d,0x85,0xd3,0x1b,0x34,0xa0,0x47,0x1c,0x0d,0x4c,},{0x37,0xdd,0xd8,0x3f,0x98,0xb0,0x57,0xb7,0xcb,0x32,0x08,0xa8,0x32,0xc5,0x8a,0xa9,0x06,0x94,0x56,0x3c,0x23,0x54,0x8d,0x43,0x22,0x91,0x38,0x0b,0x73,0x59,0x13,0x01,0xf2,0x74,0xb0,0x4c,0xee,0x2e,0xf7,0x8c,0x06,0xd9,0x6c,0x3d,0x9b,0x7c,0x17,0x52,0x1a,0xae,0x1a,0x8c,0xa5,0x0d,0x34,0x7c,0x09,0xc3,0xcf,0x70,0x3b,0xc8,0x83,0x0b,},\"\\x3d\\x4b\\x76\\x12\\x23\\x73\\xe2\\x12\\xa3\\x46\\xd1\\x9a\\x66\\xbb\\xfc\\x4b\\x62\\x32\\x92\\x64\\x9b\\xd0\\xce\\x5c\\xf6\\xbb\\x13\\x56\\x48\\xbd\\x01\\xdb\\x74\\x03\\xb3\\xd0\\xbd\\xd1\\x69\\x7f\\xf4\\xe6\\xe9\\x08\\x90\\x41\\x16\\x75\\x4d\\x37\\x0c\\x40\\xd7\\x00\\xcd\\xb6\\x64\\xc4\\x6a\\x91\\xdd\\x84\\xa3\\x58\\xb9\\xd2\\x38\\x14\\x43\\xe6\\x0f\\x2c\\x3f\\x56\\x40\\x26\\x1b\\x6b\\x85\\x8b\\xa8\\xf8\\x28\\xb0\\x97\\x1f\\x41\\x22\\xb2\\x02\\x88\\xa2\\x6b\\xa2\\x09\\x0b\\xa1\\x4f\\xd2\\x76\\x36\\x0c\\xc6\\x86\\x79\\xcd\\x84\\x19\\xae\\x19\\xc6\\xd4\\xdc\\x7b\\x66\\x14\\xc0\\x6d\\xf5\\xe5\\xc0\\x51\\x0e\\x2c\\xb6\\x86\\xde\\x0e\\xbd\\x75\\xe5\\x21\\x0a\\x21\\x55\\x62\\x58\\x9b\\x28\\xc9\\xcc\\xc7\\xd2\\x72\\xb9\\x8b\\xd4\\xbf\\x93\\x49\\x5e\\xfe\\x4f\\xc5\\xb7\\x8d\\xef\\xec\\xfb\\xca\\xa9\\xfe\\x12\\x6b\\xad\\x30\\xe8\\x9b\\x3a\\x38\\x9b\\x42\\x56\\xf6\\xa4\\x8a\\x76\\xc3\\x45\\xde\\x5a\\x36\\xa1\\x44\\x9f\\x08\\x34\\x5b\\x9a\\x5e\\x6a\\x00\\x1d\\xa1\\xff\\x9c\\xd4\\x33\\x70\\x93\\x48\\xe9\\xae\\xfb\\xc7\\x8b\\xa5\\x2d\\x3a\\xb3\\xb4\\x69\\x86\\x93\\x5e\\xba\\x8e\\xcf\\x81\\xed\\xc4\\x3c\\x5b\\x2e\\x3b\\x5e\\xb3\\x8d\\x9a\\x16\\x5e\\x9e\\x7f\\x72\\xf6\\x17\\x60\\x54\\x63\\xbe\\xdb\\xa9\\x73\\xeb\\xfd\\xcd\\xf2\\xb0\\x88\\x9c\\x71\\x41\\x2f\\x8f\\x85\\x0c\\x7a\\x3b\\x55\\x18\\xec\\xd8\\x9d\\x2e\\x25\\xc0\\xc1\\xc3\\x0f\\x08\\x5a\\x0f\\xfe\\x54\\x0e\\xf9\\xc0\\xe8\\x8f\\xc7\\xec\\x4a\\xf1\\x94\\x8a\\x4e\\x6f\\x7a\\x6e\\x25\\x6b\\x30\\x7a\\x11\\x27\\xb7\\x1b\\xa6\\x86\\xef\\xea\\xdc\\xa0\\xe4\\x86\\x09\\x47\\xcf\\x67\\x4f\\xce\\xd6\\xca\\xf7\\x31\\x0c\\xcb\\xaa\\x8d\\x90\\x47\\xda\\xed\\x30\\xfd\\x55\\x85\\xd4\\x1d\\xde\\xae\\x4d\\xf2\\xfe\\xd4\\xb6\\x22\\x80\\x32\\xc3\\xe4\\xae\\x23\\x80\\xe8\\x7e\\xc6\\xcd\\x72\\xe4\\xd7\\x4b\\x8b\\x4c\\x38\\x13\\xfb\\x04\\x33\\x89\\x39\\x1e\\x9c\\x13\\xf7\\xd3\\x3c\\x3a\\xab\\x5a\\x78\\xfc\\x4c\\x6a\\x63\\x4c\\x61\\xa7\\x0f\\x02\\xa9\\x40\\x54\\x8d\\xa1\\x77\\xc6\\x5d\\xf6\\xab\\x17\\xcd\\x96\\x83\\xf3\\x7e\\xa8\\x21\\xc7\\x40\\x88\\x9d\\x82\\xe8\\x8c\\x83\\x4e\\x7d\\x5d\\xc1\\x16\\x62\\xea\\x78\\xb1\\x3c\\x6a\\x4b\\x62\\x18\\xd3\\x17\\x84\\x21\\x9a\\x47\\x67\\x59\\x5b\\x1a\\x56\\x21\\x65\\x25\\xcd\\x68\\x93\\x8b\\x22\\xbd\\xb1\\xf8\\xc5\\xa7\\xf1\\x70\\x1a\\xfe\\xb9\\x61\\x88\\x8e\\x2e\\x0e\\xc0\\xc8\\x38\\xcd\\x62\\x0c\\xb7\\xdd\\x8a\\x14\\x93\\xa0\\x2c\\xd5\\x6b\\x54\\x51\\x25\\xe4\\x70\\x0c\\x08\\x89\\xfa\\x26\\x44\\xe6\\x44\\xa3\\xaf\\x53\\x1d\\x1c\\xd6\\xbc\\x95\\xe5\\xdf\\x91\\x75\\xf1\\x37\\xf2\\x84\\x08\\xcb\\x69\\x9c\\x7a\\xe6\\x6f\\x65\\xd1\\xd2\\x93\\x0f\\xac\\x57\\xca\\x8a\\x60\\xe6\\x31\\x1a\\x40\\x78\\x48\\x8c\\x9e\\xa4\\x04\\x94\\x8a\\x9d\\xeb\\xeb\\x9d\\x5e\\x10\"},\n{{0xa1,0xe4,0xfc,0xfd,0xe0,0x44,0xf1,0xbb,0x0e,0x7b,0xbc,0x63,0x1a,0x83,0x1a,0x8d,0x07,0xe9,0x0a,0xe0,0x8a,0x96,0x6a,0xd6,0x27,0xb6,0x20,0xb1,0xe2,0x8c,0x42,0xcf,},{0x25,0x56,0x0f,0x31,0x16,0x8b,0xd4,0xb7,0x25,0x52,0xed,0xed,0xd0,0x8b,0xb6,0xbf,0x79,0xa9,0x40,0x63,0xc1,0xf1,0xe1,0xd3,0x04,0x86,0x9d,0xd1,0xce,0x04,0x9b,0x95,},{0xc8,0x00,0x15,0x27,0xbd,0x90,0x2c,0x15,0xc3,0xdd,0x5a,0xe1,0x81,0x80,0x52,0x5b,0x5e,0x82,0x02,0xbe,0x66,0x71,0x1f,0x82,0x88,0x5c,0x82,0x22,0xa1,0x5f,0x06,0x00,0x92,0xa2,0xa6,0xe2,0xf7,0xd7,0xe9,0x80,0x31,0x12,0x09,0x19,0x1b,0x32,0xb8,0xad,0xe4,0x8d,0x3e,0xa9,0x8c,0xf2,0x45,0xf0,0xfa,0xd6,0x2c,0x00,0x9c,0x5a,0x71,0x08,},\"\\x8c\\x14\\x54\\xd4\\xe0\\x8a\\x14\\x01\\x64\\x6b\\xf7\\xa8\\x85\\x9e\\x8a\\x14\\x5e\\x85\\xee\\xeb\\x40\\xdb\\x38\\xff\\x01\\x69\\x70\\x96\\x41\\x21\\x2c\\x81\\xb6\\x73\\x90\\x74\\x9c\\x01\\xa7\\x98\\x07\\xf3\\xcc\\xad\\xbb\\xd2\\x25\\x6f\\x36\\xff\\xc1\\x80\\xcf\\x9b\\xa4\\x4b\\xf4\\xa7\\x61\\x2d\\x44\\x1c\\x23\\xb2\\xe2\\x5d\\x33\\xc4\\x8a\\x73\\xe1\\x6c\\xe3\\x57\\x56\\x27\\x58\\xad\\xb0\\x05\\x53\\xc3\\x14\\x2f\\xb8\\x17\\x6b\\x6a\\xe8\\xfb\\x61\\x0a\\x60\\xf9\\x23\\xb0\\x91\\x18\\x14\\xb1\\x0f\\x56\\x79\\x93\\x6c\\x36\\x77\\xb7\\x0e\\x84\\x6e\\x21\\x8f\\x58\\x75\\x67\\xf2\\x01\\x9c\\x7d\\x28\\x2a\\x10\\x7f\\x3c\\xc8\\x47\\x63\\xad\\xae\\xc8\\x89\\x93\\xc0\\xcc\\x50\\x03\\xe7\\x7a\\xf6\\x0d\\x67\\xdb\\x53\\xf8\\xcb\\x72\\x7a\\xa6\\x67\\x2d\\xe0\\x04\\x49\\x8c\\x3b\\x3e\\x22\\x2a\\xa7\\x08\\x2d\\x91\\xf9\\x8a\\x1a\\x06\\x83\\x74\\xc5\\x10\\xff\\x53\\xa5\\xe5\\x59\\xcb\\xe2\\xd6\\xc7\\xc3\\x44\\x2d\\x72\\x38\\x90\\x7c\\x81\\x1d\\x58\\xaa\\x7f\\x5a\\x46\\xb8\\x31\\x12\\x44\\xf0\\xdb\\xe1\\xb9\\xc0\\xe9\\x44\\xdd\\xa1\\xd8\\x01\\x08\\x64\\x94\\x9c\\x59\\x39\\x6c\\x6b\\x34\\x6a\\x11\\xf3\\xaa\\x86\\x6d\\x6b\\xce\\xad\\xfc\\x90\\x90\\x38\\xd2\\x2e\\xfb\\xc8\\xf1\\xda\\xc8\\x10\\xa9\\xf2\\xfa\\xfc\\xce\\x7c\\x03\\x89\\xeb\\x0a\\x56\\xc0\\xf6\\x8c\\xae\\x24\\xae\\x3d\\xdb\\xdf\\xf7\\x11\\x6d\\x2f\\xad\\xeb\\x9b\\x0e\\x75\\x09\\x53\\x6f\\xdc\\x3b\\x83\\xe7\\x13\\x54\\xda\\x6a\\x1a\\xed\\x16\\x88\\x74\\x90\\xdc\\x2f\\x4d\\xf5\\x7b\\xba\\xa7\\x24\\x45\\x28\\xfa\\x30\\x94\\xb9\\x9e\\x86\\x75\\x81\\xac\\xef\\x90\\x62\\x70\\xb2\\xcf\\x4d\\xed\\xa6\\xb8\\xfd\\x9d\\xbb\\x79\\xad\\xd7\\xbe\\xa8\\xf8\\x6f\\xcb\\x1f\\x64\\xdf\\xd5\\x0e\\x38\\x5b\\x42\\x09\\xec\\x0b\\x1a\\x9f\\x6d\\x2e\\x51\\x90\\x68\\x29\\x7a\\x2b\\x5c\\x40\\x5c\\x21\\x6b\\x4a\\x2e\\xd9\\x83\\xff\\x69\\xc5\\x9b\\x53\\x0e\\xff\\xa6\\x0c\\x03\\x67\\x05\\x12\\x67\\xdd\\x2b\\xbd\\x1e\\x86\\xa9\\xab\\x5a\\x11\\x4d\\xd4\\xf6\\x9b\\x54\\x0b\\xfa\\xbf\\xe9\\x7c\\x04\\x03\\xb8\\xfc\\xbb\\x27\\x62\\x57\\x61\\xed\\xa3\\xe2\\xad\\x8e\\x62\\x5c\\xfe\\x4b\\x61\\x5b\\x70\\x25\\x53\\x1a\\x49\\x89\\x18\\xc2\\x4e\\x02\\xa0\\x0e\\x79\\x7b\\xba\\xfd\\x14\\xf9\\xd3\\xf6\\x82\\x7e\\x39\\x00\\x63\\xc4\\x36\\x08\\x06\\x88\\xd0\\x37\\xa6\\xe2\\x99\\x3c\\x56\\xd3\\xa8\\xe9\\x5f\\x37\\x5c\\x10\\x04\\x0b\\xf0\\x4f\\x03\\x0c\\x97\\x26\\x23\\xd9\\xe3\\x80\\x1c\\x13\\xb4\\xec\\x8d\\x01\\xcf\\x18\\x38\\x55\\xf5\\x93\\x5f\\x10\\xdd\\xb2\\xc5\\x4c\\x51\\xc8\\x0c\\xbe\\xd0\\xc2\\x4d\\xb5\\x6e\\x1e\\xd1\\x48\\x93\\x1d\\x89\\x16\\x1c\\x5e\\xa3\\x7c\\x2f\\x97\\x87\\xf8\\x8e\\xf7\\x33\\x0e\\x5d\\xcd\\x0e\\x43\\xd8\\x1b\\xfc\\x8b\\xf2\\x3d\\xdf\\x79\\x83\\xcc\\x1d\\x73\\x38\\x43\\xa3\\x3c\\xcb\\x39\\x5d\\xfc\"},\n{{0xbe,0xd1,0xbb,0xca,0xe1,0x86,0x43,0xd6,0xf6,0xaa,0xc3,0x4f,0x3d,0x9b,0x6a,0x14,0x78,0x39,0x4d,0x02,0xb9,0x31,0xcf,0xf0,0x06,0xd8,0x5f,0x21,0xb7,0xdb,0xc7,0x47,},{0x4f,0x52,0x8b,0x38,0x18,0x5a,0x42,0x4c,0x6f,0xde,0xce,0x46,0x51,0x1a,0x0c,0x29,0xb7,0xc0,0x4b,0x32,0xeb,0x04,0x83,0xab,0xb5,0x2d,0x5f,0x8e,0xb6,0xb3,0x52,0xeb,},{0x0f,0xc9,0x9d,0xd3,0xb9,0xa0,0xe8,0xb1,0xfc,0x6e,0x63,0x5a,0xf5,0xc6,0x40,0x06,0xb6,0x72,0x00,0xfe,0x95,0x8f,0x53,0xcc,0xe1,0xb9,0xb0,0x91,0xa4,0xe7,0x06,0x69,0xb5,0x93,0xf1,0x55,0x94,0xbc,0x08,0x42,0xe5,0x57,0x62,0x59,0xf9,0xa6,0x85,0x9a,0x0d,0xb2,0x2d,0x74,0x0f,0x9f,0x80,0x24,0xb5,0xba,0xf1,0xef,0x6f,0x95,0x8c,0x05,},\"\\xff\\x7c\\x64\\x13\\xe6\\x18\\xa0\\x56\\xde\\x40\\x1e\\xe1\\x0c\\x40\\xad\\xe3\\xd7\\xc0\\xe6\\x86\\x14\\x95\\xd9\\x7c\\x26\\x89\\xec\\x6a\\xbb\\x69\\xdd\\x2a\\xe7\\x01\\xfd\\xca\\xc8\\xf0\\x83\\x31\\xea\\x5c\\x5f\\x5d\\x80\\x5b\\x57\\x89\\xee\\x5e\\x24\\x1f\\xf4\\xac\\x8b\\x96\\x0f\\x4f\\x2b\\x9f\\xef\\x6a\\x72\\x7f\\xad\\x86\\xdc\\xd4\\x32\\xde\\x9f\\xad\\x6b\\xa4\\x5e\\x00\\xaa\\x36\\x87\\xb0\\xce\\xeb\\x2c\\x0d\\x43\\x0b\\x7d\\x5f\\xde\\x63\\xb4\\xf6\\xb9\\x82\\xc4\\xf9\\xe0\\x3c\\x43\\x0a\\xba\\xd9\\x04\\x4d\\x06\\xdc\\x49\\xe8\\x9d\\xf4\\x81\\x40\\x5d\\x8f\\xeb\\xbb\\x06\\x53\\xe9\\x68\\x69\\x48\\xaa\\xd2\\xd9\\x07\\x25\\x44\\xdf\\x94\\x24\\xfd\\x48\\x7f\\x4e\\x24\\xba\\x7f\\x24\\x55\\xdd\\xec\\x41\\x05\\x82\\x8c\\x39\\x81\\xbd\\xdb\\xb1\\xb7\\xfb\\xdb\\xac\\x15\\x59\\x03\\xe9\\x60\\xfc\\xd9\\x4c\\x07\\x16\\xe7\\x36\\xf5\\x19\\x86\\x7f\\xbc\\x52\\xc5\\x12\\x60\\xf5\\x71\\xd7\\xed\\xcb\\x08\\x1a\\x23\\x55\\x0a\\xd8\\xc7\\x0b\\xb2\\x68\\x86\\x4a\\xb2\\x76\\xaa\\x2c\\xc2\\xdb\\xf6\\x23\\x83\\xbb\\x66\\x03\\x0e\\xbe\\x94\\x35\\x41\\x74\\xcc\\xec\\x2d\\x2a\\x90\\x75\\x78\\x55\\x64\\x44\\x50\\x7c\\xbf\\x84\\x88\\xbb\\x23\\xc6\\x24\\x23\\xa3\\xa9\\x8d\\xa7\\xcc\\x96\\x8f\\x59\\x9d\\x3d\\xc8\\x4d\\xca\\x3a\\xfa\\xd7\\xf1\\x4e\\xc3\\x06\\xe1\\xdb\\x53\\x41\\x43\\x21\\x6a\\xa2\\x2a\\xd1\\x80\\x74\\xc7\\x19\\x57\\x08\\x05\\xea\\x46\\xbc\\x86\\xb7\\x1a\\x8f\\xf5\\x8e\\x41\\xe7\\x3c\\xb2\\x9a\\xd5\\x75\\x0f\\xcf\\xc9\\xa1\\xc5\\x42\\x92\\xb6\\x4b\\x47\\xec\\x95\\x38\\xf5\\x38\\x16\\xe3\\x6e\\xd0\\xd0\\xc1\\xae\\x5e\\xad\\x06\\xd4\\x77\\xaa\\x97\\x5e\\xce\\xba\\xf6\\x2d\\x90\\x23\\xb7\\x7e\\x50\\xe7\\xb6\\xd4\\xab\\xda\\xa4\\x85\\xea\\x34\\xec\\x76\\x6b\\xeb\\x1d\\x9b\\xa0\\x3c\\x9c\\x06\\x71\\x86\\xe2\\xe3\\x82\\x66\\xc6\\xe2\\x53\\x1e\\x97\\x48\\x02\\x14\\x63\\x8a\\x2b\\xb3\\x14\\x31\\xac\\x20\\x86\\x79\\x71\\x55\\xfc\\x77\\x5b\\x3a\\xad\\x8d\\x5a\\x0b\\x90\\x4c\\x38\\x1e\\xdd\\x0c\\x6b\\xc2\\x3c\\x66\\xa1\\x90\\x49\\x55\\xed\\x45\\x0a\\x9c\\xbd\\x16\\x45\\x9c\\x32\\xf5\\xca\\x35\\x4b\\xbc\\x2d\\xa7\\xb1\\xa4\\xd8\\x14\\xf1\\xb8\\x71\\x0a\\xad\\xb2\\xcc\\xc4\\xf3\\x97\\x75\\x8b\\x7e\\x9d\\x91\\xf3\\xa9\\x1e\\x58\\x25\\xab\\x86\\x82\\xff\\x5e\\x41\\x70\\x2e\\x07\\x84\\x1a\\xc7\\x69\\x8c\\x3d\\xa9\\xf5\\x58\\xed\\xd0\\x1f\\x86\\xce\\x2c\\x50\\x6b\\xf4\\xc2\\x14\\x9a\\xc9\\xc1\\x95\\xa5\\x9c\\x7d\\xd7\\xd4\\xec\\xf9\\x3c\\x90\\xb4\\x42\\x3b\\x43\\x50\\x58\\x8d\\x41\\x67\\x2c\\xed\\xc8\\x51\\x0a\\x7a\\xd5\\x3b\\x4b\\x7e\\xdc\\xaf\\x23\\xe4\\x3e\\x05\\x66\\x9d\\x27\\xa1\\xfe\\x97\\xb7\\x87\\x30\\xd3\\xfc\\x06\\x0b\\xd4\\xed\\xd9\\x87\\x2c\\xff\\xb9\\x62\\x85\\x35\\x1b\\xef\\x14\\x8e\\xf7\\x83\\xab\\x39\\x21\\x16\\xbd\\x7b\\x90\\x7b\\xad\"},\n{{0xc7,0x18,0x82,0x3f,0x43,0xdb,0x22,0x17,0xc6,0x6a,0xb2,0x89,0x97,0x04,0x16,0x5d,0x20,0x85,0x73,0xde,0x60,0xf3,0x3b,0xc0,0xb9,0x33,0x8d,0x88,0x0f,0x19,0x3f,0xb5,},{0x29,0x40,0xb8,0x79,0xb6,0x3f,0x2c,0xb1,0xf6,0xe3,0xef,0x9c,0x9d,0x33,0x3b,0xa9,0x17,0x70,0xfe,0x18,0xcc,0x5a,0x34,0x7f,0xdf,0x12,0xb0,0xef,0xc5,0xca,0x2e,0xc9,},{0x4c,0x9c,0xdb,0x1a,0xd4,0x65,0x09,0x56,0x0d,0x87,0x1d,0x30,0x89,0xaf,0xb8,0x73,0x46,0x48,0x20,0x1b,0x10,0xac,0xc9,0x53,0xe8,0xb6,0x1f,0x2c,0xce,0x2d,0xba,0xe0,0xfb,0x9b,0x86,0x8a,0xc9,0x57,0x43,0x2b,0x72,0x22,0xdb,0xf7,0xe4,0xcf,0x0b,0xc7,0x53,0x09,0xbe,0xa3,0x60,0xb2,0x63,0xab,0xbd,0xe1,0x88,0x53,0x2d,0xda,0x25,0x04,},\"\\x05\\x0e\\x68\\x77\\xf6\\x5e\\xc7\\x26\\xee\\xc7\\x01\\x86\\x3f\\xab\\x14\\x0b\\x99\\x4a\\xa1\\xe9\\x2a\\x48\\x7d\\xb1\\xa1\\x87\\x01\\x31\\x20\\x57\\xdb\\x44\\xbf\\xde\\x70\\x91\\x1e\\xc2\\x6e\\xaa\\x28\\x63\\x2d\\x03\\x79\\x4d\\x54\\x5d\\xfc\\xb2\\xae\\xd4\\x34\\x0c\\xab\\x7d\\x09\\x25\\x95\\xcd\\x59\\xed\\x23\\x99\\x40\\x43\\xf5\\x0b\\xa6\\x96\\xe9\\x80\\x2b\\xd6\\x49\\x90\\x12\\x13\\x97\\x28\\x64\\x57\\xae\\x69\\xd7\\x6c\\xb8\\xe3\\x4d\\x7c\\x1a\\xb2\\x45\\xcb\\x07\\xb1\\xb4\\x08\\xf2\\xbb\\xbf\\xdf\\x33\\xa1\\xbd\\xd5\\x59\\x63\\x67\\x02\\xc9\\x18\\xf9\\x82\\xc2\\xac\\x02\\x21\\xf7\\xf9\\x4d\\xb9\\x1e\\xde\\xfc\\xe2\\x81\\x18\\x25\\x9f\\x89\\xd9\\x94\\xda\\xd5\\xbb\\x01\\x3c\\x67\\x8c\\x1c\\x33\\x8b\\x65\\x39\\x6b\\x15\\xe8\\x89\\x9c\\x16\\x99\\x21\\xf2\\x78\\x85\\x9c\\xe0\\xc8\\x56\\xd8\\x89\\xb8\\xc6\\x34\\x18\\xeb\\xc5\\x73\\xd2\\xd6\\x25\\xd5\\xb5\\x93\\x88\\x39\\xf2\\xb1\\x69\\xb6\\x91\\x6d\\x8e\\x40\\xdd\\xe7\\x0d\\x3b\\x72\\x88\\x7a\\xd2\\x47\\x8e\\xf6\\xfb\\x12\\x84\\xfa\\x0e\\x4f\\xc5\\x24\\xe3\\xc6\\xfa\\x1d\\xd2\\x2b\\xa6\\xb8\\x1d\\xef\\x82\\x79\\xf3\\x82\\xbc\\xb4\\x50\\x48\\x85\\x1b\\x17\\xcd\\x65\\x9d\\x59\\x40\\x9f\\x57\\x1f\\xa8\\xa9\\x20\\xa2\\x09\\x34\\xd9\\xdb\\xe1\\x02\\x2d\\x63\\x58\\x40\\x96\\x54\\x00\\x24\\x0f\\x87\\x0a\\xce\\xff\\xd5\\xdb\\x7c\\x7d\\xf0\\x8a\\xf8\\x9e\\x47\\xe1\\xb9\\xe2\\x0b\\xb9\\x9f\\x96\\xab\\x07\\x3e\\xdf\\x53\\x69\\x4c\\x74\\x82\\x89\\x0e\\x36\\x31\\x34\\x02\\x17\\xe6\\x87\\xab\\x27\\xc9\\x84\\xb6\\x08\\x25\\x16\\x94\\x57\\xd4\\x35\\xa5\\x40\\x9a\\xd8\\xe4\\x2d\\xa0\\xaa\\x63\\xe2\\x0c\\x2b\\xc6\\x7b\\xd8\\xb9\\xa2\\x67\\xf3\\x96\\x73\\xa7\\x7f\\x7f\\x31\\x36\\xdc\\x5c\\xb2\\xd2\\x49\\x48\\xdb\\xe7\\xbc\\xd7\\x12\\x93\\x18\\xc6\\x8c\\x6f\\xe9\\x5d\\xd4\\xdd\\x4f\\xe9\\x42\\x28\\x68\\x31\\xea\\x53\\x35\\x2f\\xbb\\x25\\x2a\\x12\\x88\\xbc\\xd8\\x38\\x92\\x13\\x56\\x78\\x5d\\x07\\x21\\x34\\xcb\\x82\\x0f\\x62\\x79\\xcc\\x71\\x46\\x1f\\x43\\x1b\\xe9\\xd3\\x01\\x47\\x24\\x32\\x1c\\x92\\xfd\\xc5\\x76\\x32\\x01\\x37\\x70\\x5c\\xff\\xb2\\xc2\\x36\\x64\\xb7\\x05\\xe9\\xbe\\x60\\xae\\x1a\\x19\\x0f\\x3e\\x34\\x84\\xf7\\x00\\x58\\xe7\\x02\\x40\\x7b\\x05\\x6d\\x7f\\xe5\\xd3\\x1c\\xee\\x9c\\x2a\\x6a\\xc6\\xea\\xda\\x35\\x16\\xab\\xc5\\x51\\x72\\x56\\xdf\\x12\\x43\\x78\\x0a\\x03\\xbb\\x00\\xba\\x00\\xce\\x24\\x80\\x76\\xee\\xca\\x6f\\xee\\x91\\xd5\\xef\\x9e\\xb9\\x07\\xb8\\x01\\xaf\\x09\\x7f\\x3e\\x9e\\xb2\\x56\\xbd\\xcd\\xe8\\x1e\\xfe\\x4b\\xaf\\x81\\x89\\xb0\\x39\\x9e\\x36\\xf1\\xea\\xa3\\xab\\x62\\x66\\x17\\xcf\\x3b\\x47\\xdd\\x89\\xca\\xf6\\x9c\\x64\\xc5\\xb8\\xf6\\x8b\\xd9\\x17\\xfe\\x03\\xe4\\x66\\x85\\x38\\x46\\x0a\\x1b\\xe8\\x8d\\x9a\\x84\\x6c\\xef\\x39\\x93\\x46\\x27\\xd4\\x74\\x73\\x4f\"},\n{{0x25,0x43,0xd1,0x66,0xc9,0xf5,0xf7,0x42,0x7f,0xf3,0x03,0x4f,0xfa,0x81,0x03,0xcb,0x11,0x7b,0xf4,0x72,0x33,0x1a,0x73,0xd9,0xa2,0xf1,0xbc,0x0a,0x02,0xa6,0xff,0x1b,},{0x42,0x67,0x8c,0xf3,0x85,0x70,0x21,0xaa,0x55,0x67,0x70,0x6d,0xb0,0x31,0xe7,0x92,0x71,0x5c,0xca,0xf8,0xab,0xb0,0x2a,0x04,0x2b,0xad,0x17,0xdb,0x3d,0x5f,0xa1,0x03,},{0x20,0xea,0x93,0x68,0xa2,0xcc,0xd0,0x8b,0xf9,0xcb,0xf4,0x8d,0x4a,0x2f,0x7d,0x03,0xf0,0xdb,0x08,0xa5,0x4b,0x87,0x67,0x9c,0xda,0x03,0xe2,0x96,0xaf,0x9e,0xf3,0x78,0xbe,0x9b,0x8f,0x04,0xb4,0x06,0x5b,0x00,0x9d,0xa6,0xdb,0x01,0x6f,0x3d,0xf9,0xdb,0x64,0x82,0x58,0x73,0xe2,0xfb,0x4d,0xe3,0x04,0x49,0x91,0x5c,0xd7,0x3c,0x46,0x09,},\"\\x74\\x6d\\x7a\\xbf\\x0b\\xfb\\x26\\x62\\xc2\\x5a\\xb5\\xc5\\xe4\\x61\\x2c\\x30\\x6f\\x16\\xd1\\x3e\\x44\\xd0\\xdb\\x39\\x4a\\x00\\x15\\x67\\x6c\\xe6\\x09\\x78\\x4f\\x03\\x23\\xda\\x1d\\xfa\\x94\\xd2\\xb2\\xf1\\xf6\\xe0\\x24\\x44\\xa9\\x36\\xd0\\x19\\xb1\\x43\\x02\\x1f\\x73\\xc7\\x9d\\xf9\\x30\\x9e\\x7b\\xdf\\xf3\\x9d\\xae\\xec\\x4c\\xac\\xa0\\x0c\\xba\\x4e\\xf3\\x1c\\x83\\x10\\xc1\\xa0\\x8e\\xf4\\xb3\\x6f\\x81\\xc3\\x77\\x84\\x6b\\x5b\\x90\\xac\\xd4\\x11\\xaa\\x67\\x1e\\xd7\\xaf\\x27\\x8a\\x24\\x22\\x9b\\x78\\x93\\xc1\\xb4\\x15\\xd7\\x98\\x88\\xd7\\x63\\x7f\\x5c\\xb5\\xc9\\xc6\\xc6\\x31\\xae\\x5f\\xfa\\x29\\xf1\\x34\\x0e\\x44\\x40\\x96\\xab\\x53\\x36\\x17\\xfd\\xcb\\x80\\xff\\x81\\xda\\x0a\\x7c\\x6c\\x14\\x2e\\xe0\\xfe\\x5e\\xa8\\x2f\\x68\\xcc\\x3e\\xa3\\x8b\\x56\\xf2\\x72\\xb0\\xd8\\x0f\\xd5\\xf4\\xf5\\x5c\\xa9\\x34\\x8c\\x16\\x18\\x81\\x43\\x58\\x13\\xc3\\xfa\\x9f\\xff\\x66\\xa2\\xee\\x6d\\x5b\\xd3\\xed\\xba\\x0d\\x2f\\x9a\\xa7\\x4b\\x1c\\x44\\xbf\\xd0\\xe6\\x46\\x78\\xd3\\x71\\x51\\x24\\x96\\x3a\\xc5\\x75\\xff\\xb0\\x9e\\xe1\\x64\\x37\\xda\\x48\\x4b\\x3b\\xa5\\x8e\\x5a\\xeb\\x8e\\xd8\\xc5\\xc0\\xf4\\x7b\\x59\\x90\\x8f\\xe5\\x80\\xf3\\x7e\\xc1\\xde\\x26\\x6b\\x29\\x5d\\x6b\\xe8\\x5e\\x62\\x35\\x8e\\x9b\\xbd\\xc7\\x89\\x64\\xfb\\x83\\x7e\\xea\\x29\\xfd\\xb7\\xde\\x86\\xcc\\x56\\xf4\\x8b\\xd9\\xa3\\xe6\\xe2\\xbe\\x51\\xd8\\xa1\\xdc\\xff\\x3c\\xa4\\xd5\\x6e\\xa9\\x34\\xc6\\x82\\x77\\x2b\\xca\\xfb\\x51\\x49\\x7b\\xe5\\xd0\\xf2\\xa2\\x3d\\xd4\\x97\\x0c\\x02\\xc4\\x4c\\x09\\xad\\x89\\x7b\\x42\\x41\\xac\\xd7\\xd6\\xab\\x12\\xd8\\xf0\\x0c\\x9a\\xad\\xc3\\x34\\xb4\\x31\\xfe\\xc5\\xbb\\x69\\xa2\\x85\\xb7\\x55\\x0a\\x63\\x9e\\xce\\x96\\x95\\x26\\x82\\xb7\\x33\\x4b\\x68\\xc6\\x51\\x52\\xe8\\x93\\xb1\\xc8\\x10\\x0c\\x69\\x4d\\x8c\\x5c\\xfe\\x26\\xac\\x03\\xc1\\xf3\\x91\\x4e\\x65\\xc8\\x4f\\x0e\\x77\\x72\\x90\\xc7\\x6f\\x6a\\xcc\\xe3\\x40\\xbf\\xf6\\x6d\\xa7\\x22\\x0f\\x73\\x17\\x5e\\x94\\xaf\\x52\\xf9\\xf1\\x9e\\x61\\xf8\\x0d\\xc1\\xf3\\x57\\x16\\xb3\\xf4\\x8d\\xfa\\x50\\x25\\xc9\\xeb\\xef\\x73\\x82\\xe0\\x55\\x83\\x0f\\x5b\\xbf\\x15\\xc6\\xf6\\xa9\\x50\\x32\\x90\\x9c\\x89\\x2c\\x0f\\x89\\xc8\\xc1\\x5f\\xc3\\xea\\x40\\xa2\\x0e\\xe1\\xa4\\x52\\x9b\\x52\\x19\\x51\\xdf\\x44\\xd9\\xd7\\x9d\\x74\\xe0\\xc4\\xc2\\xe0\\xfe\\xd8\\x49\\xb8\\x78\\x52\\x06\\xdb\\xe6\\x2b\\xfa\\x2c\\xa2\\x10\\x87\\xa9\\x12\\xe9\\xb1\\x84\\x55\\x16\\x59\\xcd\\x8a\\x58\\x7e\\x95\\xb0\\x43\\x17\\x19\\x25\\x96\\xbb\\x0b\\x7f\\xc9\\xf7\\xbb\\xb6\\xee\\x04\\x9c\\x8b\\x02\\xfd\\xd7\\x58\\xb4\\xe7\\x98\\x82\\x07\\x3b\\x71\\xea\\xab\\x18\\xaa\\x29\\x37\\x01\\xc1\\x7d\\x55\\xf9\\xec\\x46\\xc5\\x2d\\xe1\\xe8\\x86\\xb6\\x75\\x0f\\xb0\\xfb\\xcd\\x64\\xf4\\x56\\x8a\\x21\\x0a\\xe4\\x51\\xe9\"},\n{{0x85,0xe0,0xa8,0x0f,0x3b,0x30,0xc2,0x01,0x99,0xd9,0xc1,0xec,0x66,0x2e,0x39,0x2f,0xdf,0x15,0x46,0x37,0x73,0x43,0xf1,0x24,0x71,0xdb,0x2a,0x03,0x10,0xa7,0x05,0xbd,},{0x54,0x0a,0x3a,0x1d,0x83,0x67,0x2e,0x49,0x50,0x34,0xcf,0xf4,0x08,0xe1,0xfb,0xe8,0x2e,0x53,0x8f,0x09,0x17,0xe8,0xa1,0xc7,0xd1,0x7a,0xab,0x58,0xe0,0x43,0xd3,0xc6,},{0x18,0x5e,0xf2,0x24,0x6a,0xba,0x2b,0x1a,0x56,0x80,0x32,0xc7,0xdf,0x93,0xc6,0x67,0x79,0x9b,0x8a,0x52,0x1a,0x6f,0x97,0x32,0x1e,0xad,0x58,0x66,0xb4,0xcb,0x9c,0x65,0xb6,0x4a,0x1c,0x40,0xb9,0xb6,0xa9,0x10,0xe7,0x42,0xdc,0x32,0xa7,0xe6,0x6d,0x11,0xea,0x45,0xdb,0xea,0xac,0xae,0x9f,0x09,0x51,0x1b,0x81,0x01,0xf8,0xaf,0x0c,0x0c,},\"\\xd2\\x80\\x2f\\x15\\x96\\xf8\\x38\\x3b\\x64\\xed\\xbd\\xc5\\x94\\x06\\x0b\\xff\\x0e\\x70\\x13\\xd5\\xb7\\xc8\\x5d\\x83\\x0f\\xae\\x11\\xae\\xb3\\x4d\\xd5\\x94\\x95\\x9d\\xa6\\x24\\xe0\\x44\\x47\\x4c\\x54\\x09\\xc0\\x05\\x96\\x73\\xbd\\xc6\\x1a\\x67\\x1e\\xf5\\xb0\\xb8\\xa2\\x6f\\x30\\x10\\x0b\\x3b\\x73\\x96\\x8d\\x8e\\x4d\\x83\\xa7\\x2f\\x25\\xb5\\x13\\x44\\x8d\\x2f\\x6b\\x6a\\x44\\x75\\xfd\\xf8\\x9e\\x31\\xca\\x92\\x68\\xa3\\x07\\x05\\xaf\\x3f\\x64\\x9e\\x3f\\xe0\\x1d\\xde\\x0c\\xf4\\xb2\\x9e\\xc2\\xda\\x54\\x36\\x44\\x4a\\xf0\\x91\\xd6\\x27\\x30\\xac\\xd4\\xca\\xb6\\x08\\xf0\\xdf\\x26\\xf0\\x88\\xc6\\xb9\\xb9\\x67\\x37\\x94\\xf0\\x74\\x7d\\xab\\x2c\\xe1\\x90\\xf9\\x05\\x92\\x00\\x9f\\xdc\\xe5\\x46\\x4b\\x36\\x61\\xb7\\xe8\\x62\\x0b\\xad\\x65\\x50\\x9a\\x6c\\x75\\x2b\\x72\\x7a\\x8d\\xc8\\xd3\\xef\\xa5\\x84\\xfd\\xe0\\x27\\x2c\\x45\\x1d\\x65\\xa9\\x3b\\xec\\xe4\\xf5\\x9d\\x87\\xdc\\x6f\\xbe\\xb4\\x51\\x40\\x1e\\x3e\\x2e\\x00\\x3c\\x6a\\xca\\x7b\\x3d\\x3f\\x92\\x71\\x91\\x50\\xc6\\x77\\x8f\\x01\\x5a\\xff\\x2a\\x59\\xbf\\xbf\\x2e\\x91\\xb2\\x1b\\x0a\\xd6\\x87\\x75\\x36\\xeb\\x54\\x56\\x70\\x59\\xf5\\x87\\xf5\\x4d\\x4e\\x2a\\x6f\\xe1\\xfd\\xcd\\xd6\\xa7\\xfd\\xcb\\x85\\x15\\x57\\x5b\\xcc\\x37\\x05\\xd7\\x78\\x59\\x35\\x2f\\xa0\\xb0\\x44\\x16\\x6e\\x3c\\x31\\x88\\x46\\xa5\\xdf\\x33\\x56\\x30\\x03\\xcb\\x20\\xbc\\x94\\x2d\\x30\\x39\\x10\\x93\\xe8\\xd5\\x83\\xe8\\xe6\\x4d\\xec\\x57\\x0e\\xe1\\xc4\\x13\\x87\\x62\\xf6\\x48\\x38\\x98\\xd3\\x2e\\x20\\x32\\xbd\\xe9\\xbb\\xe0\\x7e\\xc2\\xc3\\xeb\\x47\\xd9\\x68\\x76\\xf0\\xfc\\x0f\\x02\\x4d\\x75\\x3c\\xeb\\x34\\xff\\x84\\x80\\xb4\\xcf\\x57\\x62\\x30\\xbb\\x82\\x63\\xdd\\x80\\xee\\xac\\x66\\x2e\\xba\\x31\\xd8\\xa6\\x1f\\x30\\x9e\\x17\\x5f\\x4c\\x01\\x43\\xe2\\x8a\\x85\\x2b\\x1c\\x30\\x61\\xce\\x78\\xef\\xbd\\x16\\xa2\\x87\\x3d\\xd2\\x81\\x98\\xa4\\x6e\\xc0\\xa8\\x00\\xb3\\x0d\\xc8\\xa9\\x3b\\x8d\\xbb\\x81\\xa7\\x30\\xde\\x45\\x0b\\x86\\x4d\\xea\\x76\\x80\\xe5\\x09\\xd8\\x00\\xe8\\x23\\x29\\xc2\\x61\\xb0\\x7e\\x72\\xaa\\x80\\xee\\x16\\xec\\x37\\x5d\\xdb\\xbb\\x6f\\xe3\\xd8\\xd4\\x7b\\x0e\\x3c\\x5a\\x9f\\x23\\xc4\\xd2\\x0b\\x72\\x4c\\x1d\\xf5\\x98\\x35\\xd8\\x30\\xdd\\x22\\xd1\\x04\\x03\\xd8\\xf1\\x5c\\x10\\x2c\\x4b\\x37\\x69\\xc4\\x16\\x66\\xc3\\xab\\x8c\\x7e\\x80\\xb9\\x40\\xd0\\xbb\\xb5\\x86\\x52\\xd1\\x0a\\x3f\\xfe\\x8d\\x44\\xdf\\x10\\x12\\xa3\\xdd\\xc4\\xe1\\xc5\\x18\\xd4\\x90\\x19\\xf7\\xc5\\xd3\\xd9\\xf9\\x5e\\xd9\\x3a\\x31\\x97\\x46\\xd1\\xe5\\x43\\xff\\xa6\\x9e\\xdb\\x49\\xbb\\x34\\x39\\xf8\\xa3\\x25\\xac\\x6a\\x0c\\xb4\\xed\\xd6\\x5b\\xa6\\x00\\x80\\xa0\\x44\\x7c\\x67\\x4f\\xaa\\x72\\xd8\\xae\\xbd\\xb5\\xd2\\x54\\x4f\\x2f\\x2d\\x84\\x7c\\x72\\xc2\\xdf\\xa6\\x05\\x7a\\x69\\x0a\\xdc\\x5c\\x44\\x1a\"},\n{{0x82,0xa2,0xc6,0x49,0x3f,0x11,0xba,0x80,0xe4,0xb8,0xb3,0xb4,0x38,0x41,0xbe,0x97,0x0e,0x2a,0x10,0xa9,0x4d,0x22,0x49,0xd8,0xac,0x6f,0x54,0x14,0xcf,0x5a,0x3c,0xb5,},{0x4c,0x2e,0xe0,0x1c,0xde,0xa0,0x7d,0xb3,0x63,0x5f,0x5d,0x4c,0x10,0x82,0xb9,0x2f,0x29,0x8d,0xeb,0x17,0xd0,0xf9,0x05,0xdf,0x71,0xb6,0x6f,0xb2,0x27,0x4e,0xae,0x99,},{0x68,0xa9,0x1d,0x4f,0x8d,0x24,0x1c,0x1d,0xef,0xbd,0x5c,0xa9,0xe9,0xe1,0xed,0x82,0x74,0x41,0x95,0x06,0x75,0x1c,0x96,0x79,0x47,0xb1,0x0d,0x50,0x11,0x8b,0xbf,0xab,0xc7,0x65,0xff,0xd7,0xb3,0x1a,0x01,0x67,0xc4,0xfd,0x8b,0x11,0x75,0x33,0x24,0x12,0xdf,0x19,0xd8,0xaa,0x1a,0x90,0x95,0x90,0x86,0x13,0x20,0x92,0x3d,0xbc,0xb2,0x04,},\"\\x09\\x85\\x4d\\x13\\x68\\x49\\x50\\x41\\x9e\\x0b\\xb1\\x64\\x64\\xe0\\x99\\x88\\x90\\x5c\\x02\\x17\\x18\\x3a\\xa1\\xe4\\x8a\\xdb\\x14\\x7b\\xfc\\xc2\\xeb\\x57\\xc2\\x30\\x0b\\x0d\\xfc\\x39\\xd4\\x89\\x66\\x55\\xa5\\x7a\\xe2\\x04\\x15\\x40\\x8b\\xb5\\xf2\\xc2\\x38\\x01\\x39\\x55\\xf0\\xa4\\xfc\\x78\\x2e\\x0c\\x99\\x3f\\xe4\\x2c\\xb0\\x8c\\xd8\\xcf\\x41\\x5c\\xcb\\xd6\\xcf\\x1c\\xee\\x2e\\x80\\x97\\xf0\\x4e\\x8f\\x09\\xae\\x5d\\xa5\\xf4\\x15\\xb1\\x6c\\x2c\\xb3\\x0c\\xb2\\xab\\x66\\x52\\xba\\x50\\xeb\\xbc\\xae\\x4a\\x59\\xe3\\x1f\\xe1\\x1e\\x7e\\xf3\\x69\\x9c\\xa9\\x0a\\xaf\\xa5\\x86\\xbb\\x24\\x2c\\x89\\xcd\\x2e\\x33\\x2b\\x2b\\xfa\\x2f\\x81\\x42\\xac\\xca\\xf4\\x36\\xf8\\x9b\\x64\\x53\\xbb\\x48\\x05\\xa1\\xe7\\xf3\\xab\\x62\\x70\\xf0\\xda\\xf8\\x93\\x89\\xe7\\x17\\xd1\\xb7\\x01\\x75\\xec\\x57\\x07\\xc8\\xf5\\x12\\xc4\\x0a\\xb9\\x24\\xc4\\x57\\xe9\\xf0\\x91\\x47\\x91\\x75\\x0d\\xc2\\x92\\xbb\\x27\\xd6\\xf6\\x3b\\xa8\\xcc\\xf5\\x4b\\x90\\xd3\\xeb\\xa7\\xf1\\x9e\\xb3\\x00\\xd9\\xeb\\x8f\\x3b\\x72\\x03\\x2b\\xa9\\x30\\x37\\xf5\\x52\\xb4\\x09\\xb5\\x80\\xa5\\xf6\\x51\\x16\\xfa\\xff\\xe0\\xfd\\xfd\\xc6\\xdb\\x38\\x81\\x38\\x6c\\x3c\\xbc\\x16\\xb6\\x7e\\xb2\\x57\\x63\\xd7\\xae\\x3a\\xac\\x0b\\x85\\xaa\\x1e\\x9a\\xa2\\x2e\\x49\\x59\\x60\\x9d\\x43\\x81\\xe4\\xb6\\xd7\\x15\\x9f\\xf3\\xe3\\xb2\\xd3\\x7b\\x64\\x0f\\x88\\xcf\\xbe\\x4f\\x8a\\x77\\xf8\\x01\\x64\\x57\\x22\\x8b\\xa6\\xd3\\xaf\\x5c\\x4e\\x33\\x12\\x5d\\x48\\xbc\\xfc\\xf3\\x67\\x8c\\x16\\x3b\\x69\\x8e\\x52\\xe8\\x56\\x17\\xab\\x1a\\x75\\xff\\x20\\xc6\\x90\\xab\\x07\\x15\\x5e\\xe7\\x57\\x59\\x85\\x78\\x07\\x2d\\x4a\\x09\\xdf\\xc6\\xc6\\xc0\\x94\\xec\\x04\\x85\\x67\\xd5\\x13\\xce\\x2b\\x18\\x34\\xe1\\x63\\xdf\\x15\\x45\\x31\\x9d\\x80\\x61\\xe0\\xe5\\x7f\\x58\\xef\\x04\\x1b\\x7b\\xff\\xc4\\x96\\x6a\\xc1\\x66\\x03\\x31\\xb9\\x7a\\xbb\\xc9\\x7b\\xe2\\x1a\\xe2\\xbc\\x58\\xc6\\xc3\\x27\\x4a\\x8a\\xda\\xd5\\xfd\\x2c\\x3b\\xc1\\x6b\\x92\\xe1\\xf8\\xde\\x87\\x7b\\x6a\\x26\\xf0\\xc6\\xab\\x71\\x62\\xe8\\xaa\\xb9\\x3a\\xf8\\xd8\\x59\\x18\\xc1\\x3d\\x3e\\x23\\x5a\\x27\\x37\\x48\\xc6\\x2f\\x0d\\x22\\xcb\\x1c\\x93\\xe1\\x34\\xa4\\x95\\xb1\\xb5\\xef\\x8f\\x1a\\x11\\x34\\x51\\x2d\\x53\\xb7\\xa2\\x11\\x26\\x31\\x77\\xf7\\xa6\\x0b\\xdf\\x47\\x46\\x91\\xf2\\x24\\xa3\\xb5\\xba\\xc4\\x00\\x6d\\xb3\\x45\\xca\\x67\\x25\\xf5\\xee\\x70\\x3e\\xca\\x0d\\xea\\x10\\xd7\\x12\\x67\\x6f\\x63\\xef\\x3e\\x53\\x7e\\x63\\xab\\xd2\\x60\\x8c\\xb4\\xfb\\xe2\\x00\\xe1\\x5f\\x18\\x20\\x91\\x53\\x49\\x60\\x72\\x90\\x80\\x44\\xc9\\x5a\\x4e\\x9c\\x53\\x56\\xaa\\xe8\\xed\\x5f\\x09\\x59\\xea\\xc0\\x91\\xe2\\x27\\xa0\\xb8\\x1f\\x58\\x03\\x27\\x6b\\x3b\\x3b\\xf4\\xb6\\x86\\x5a\\x55\\xfc\\x67\\x82\\xf6\\x2e\\xa6\\xd6\\x39\\x90\\xf9\\xbe\\xfe\\x01\"},\n{{0xe5,0x5b,0x34,0x3a,0x0f,0xa1,0xfb,0x74,0x71,0x89,0xcb,0x00,0xdb,0xc3,0xa6,0xaa,0x2d,0xcf,0x5b,0x86,0xe5,0x7d,0x76,0x93,0xf3,0x07,0x42,0x03,0x89,0x76,0x11,0x53,},{0x23,0xa1,0x44,0x60,0xea,0x98,0x3c,0xf9,0x97,0xc7,0x82,0xeb,0x45,0x82,0xab,0x3c,0x8a,0xa6,0xdd,0xe5,0x33,0x25,0xb9,0x77,0xb7,0x8e,0x33,0xd2,0xdc,0x5f,0x27,0xaa,},{0x07,0x26,0x6c,0x18,0x65,0x0e,0xcf,0x06,0x32,0xe2,0x25,0x62,0x4e,0xc4,0xc9,0x7f,0xc3,0x87,0xdc,0x37,0x46,0x87,0xa6,0x19,0x56,0xdc,0xcc,0xe7,0x28,0x94,0xee,0x13,0x8a,0xab,0xc8,0x0c,0xfc,0x90,0xc9,0xee,0xa6,0xdd,0x4c,0x59,0xaf,0x45,0x02,0xee,0x29,0x63,0x5a,0x92,0x88,0x07,0x86,0x67,0x8b,0x14,0xa3,0x93,0x1a,0x69,0xf9,0x07,},\"\\x36\\x28\\x9b\\x5e\\xaf\\xf2\\xa8\\x5a\\x7c\\x6d\\x57\\x5b\\xd1\\x5e\\xa5\\x94\\xb2\\xfd\\x85\\x10\\x87\\x4a\\x46\\x9b\\x52\\x10\\x91\\x63\\x69\\x6d\\x85\\xb6\\x8c\\x5b\\x21\\x1d\\x29\\x64\\xef\\xdc\\x66\\xe6\\x25\\xab\\xe8\\xaa\\xfe\\x4c\\xd9\\x22\\x0c\\xdb\\x34\\x11\\x07\\xff\\xa8\\x27\\x6e\\xd4\\xb3\\x70\\xfe\\x37\\x6c\\x14\\x82\\x68\\x71\\x67\\xdb\\xc8\\xf7\\xb2\\x05\\xa3\\xf3\\x30\\x1a\\x16\\x64\\xd9\\x07\\x28\\x77\\xd9\\xf9\\x8b\\x8f\\x69\\x83\\x13\\x01\\xdf\\x99\\x94\\x71\\x7f\\xc8\\x89\\x69\\x24\\x23\\x91\\xd9\\xb0\\x51\\x7d\\x6e\\xfb\\x27\\x17\\x01\\xea\\xb3\\xf4\\xa9\\xb1\\x20\\x42\\x13\\xe8\\xcd\\x13\\xf9\\xd0\\x99\\x04\\x8b\\x82\\x07\\x56\\x2f\\x2e\\x4e\\xbc\\x65\\x3c\\xc6\\x5e\\x9d\\x55\\x12\\xd6\\x5b\\x41\\x02\\x2c\\x79\\xb4\\xeb\\x37\\x29\\x87\\x69\\xae\\xaa\\x6e\\xfe\\xd6\\x9e\\x9a\\x8c\\xb4\\x45\\xc7\\x01\\x22\\x74\\xde\\x62\\xf5\\x09\\xf4\\xe4\\x81\\x4a\\xdc\\xbf\\x44\\x53\\xb4\\xfa\\xb8\\x5d\\x7c\\x8f\\xd8\\x45\\xe0\\x08\\x30\\xef\\x5b\\x7b\\x1e\\x63\\xc6\\x76\\x13\\x98\\x4c\\xae\\xfe\\x91\\x5a\\x54\\x8e\\x18\\xe5\\x05\\x62\\x2c\\xb2\\xb3\\x92\\x99\\xf4\\x27\\xf4\\xd8\\x39\\x83\\xba\\x2a\\xa0\\x0d\\x53\\xbe\\xe1\\xf5\\x9a\\xec\\x83\\x18\\xc5\\xea\\x34\\x5d\\x29\\x42\\x52\\x36\\x97\\x92\\x76\\x2a\\xdd\\x3e\\x56\\xfc\\xfa\\x6e\\x77\\x97\\xf0\\x28\\xc7\\x99\\x47\\x90\\x45\\xed\\xb2\\xe2\\x05\\xeb\\x6d\\xd6\\xca\\x04\\xee\\xe5\\x6f\\x94\\x96\\xd2\\xbf\\x26\\x09\\x93\\x57\\xc9\\x73\\x83\\x5b\\x99\\x36\\x02\\x49\\x11\\xe4\\x65\\x5d\\x3e\\x22\\xc8\\x11\\xc8\\xd4\\xdb\\xd1\\xb0\\x4f\\x78\\x97\\x3f\\x07\\x75\\x23\\xa3\\x89\\xb6\\xf2\\x8f\\x6f\\x54\\x21\\x61\\x42\\xcb\\x93\\xe3\\x3d\\x72\\xb4\\xa5\\x05\\x2d\\x27\\xe4\\x91\\x1e\\x41\\xe6\\xce\\xc7\\xbe\\xbe\\x1b\\x0a\\x51\\x13\\xe6\\xb7\\x0b\\x47\\x9d\\x2a\\xbe\\xed\\xf6\\x9b\\x75\\x64\\xe5\\xa5\\x73\\xb3\\x52\\xd1\\x6c\\xec\\x89\\x07\\x01\\xbb\\x38\\x3d\\x3f\\x66\\x56\\xed\\xa0\\x89\\x2f\\x8c\\xcc\\x70\\x94\\x0f\\x62\\xdb\\xe5\\x28\\xa6\\x5e\\x31\\xac\\x53\\x88\\x26\\xc1\\x38\\xac\\x66\\x52\\x4e\\x33\\x16\\x37\\xba\\x2d\\x37\\x73\\x03\\x58\\xe6\\xc7\\x32\\xcf\\xf8\\xfe\\xe9\\x40\\xaf\\xd2\\x2c\\x39\\xae\\x38\\x1e\\x5d\\x88\\x26\\x73\\x9b\\x23\\xfd\\xc1\\xb8\\x0a\\xea\\x5a\\x62\\xa2\\xcf\\x0f\\xf1\\x52\\x5e\\x44\\x6c\\xf3\\x10\\x46\\x19\\x50\\x51\\xd5\\x85\\x03\\xee\\xd1\\xbe\\xfd\\x79\\x3e\\xea\\xe1\\xd5\\xd1\\xb6\\x2a\\x5c\\x98\\x45\\x15\\x7a\\x09\\x5c\\xdc\\x08\\xa1\\xd7\\x7b\\xa4\\x7e\\x84\\xa5\\xa7\\x39\\x98\\x0f\\x0f\\x5b\\xe7\\xaa\\xec\\x9a\\x21\\x5b\\x20\\x4b\\x4b\\xb7\\xcb\\x1b\\x38\\x6d\\xed\\x58\\xd7\\xaa\\xf7\\x28\\x53\\x41\\x90\\x7c\\x63\\x33\\x6e\\xe3\\xe6\\xef\\x07\\x7a\\xd1\\x11\\xb9\\x74\\xe7\\x50\\x4b\\xd9\\x89\\xf5\\x66\\xfd\\xa1\\xb1\\xb5\\x9a\\xba\\xa9\\x1c\\x78\\xbb\\x40\"},\n{{0x39,0x73,0x03,0x8f,0xa2,0xef,0x6a,0x27,0x8d,0x3c,0x1c,0xff,0x9a,0x22,0x56,0x69,0xe4,0x65,0xa6,0x9d,0x07,0x50,0x50,0x3d,0xe7,0x48,0xc0,0x02,0xdb,0xf9,0x27,0x8a,},{0xc7,0x5e,0x77,0xc7,0x81,0x49,0xd9,0xd2,0xdb,0xc2,0x63,0xdd,0xf8,0xac,0x4d,0x65,0x4d,0x1f,0xf4,0x55,0xcb,0x18,0x97,0xe1,0xc3,0xce,0x31,0xb9,0x4c,0xfe,0x32,0x10,},{0xfc,0x0c,0x54,0x53,0x83,0x9e,0xa9,0x92,0x96,0xff,0xfa,0x50,0x1d,0x58,0x36,0x66,0x28,0xdf,0x89,0xf6,0x16,0x76,0x69,0x42,0xd5,0x04,0x0a,0x05,0x60,0x56,0xda,0xb1,0x8b,0x44,0x05,0xc0,0x4a,0xbf,0x90,0x59,0xc3,0x08,0x68,0xd7,0x9c,0x93,0x6c,0xcc,0xc8,0x4c,0x4f,0xbd,0x6f,0xd3,0x0b,0x60,0xf8,0xbc,0xbd,0x7a,0x66,0x40,0x42,0x02,},\"\\x33\\x92\\xe0\\x2f\\x3c\\x84\\x66\\x1e\\xaf\\x81\\xa5\\xff\\x04\\x35\\x7f\\x21\\x2e\\x92\\x36\\x1c\\x5c\\x22\\x07\\x39\\xd9\\x6b\\x4d\\x3d\\x9c\\x22\\xd1\\x8d\\xf4\\x8b\\xe6\\xb5\\x51\\x26\\xf5\\x81\\x60\\x1f\\xfe\\x0d\\xa6\\x3f\\x38\\xe1\\x9c\\xbb\\x12\\x72\\x6c\\xa0\\xa6\\xaa\\x32\\x55\\x67\\xa0\\x03\\xa7\\x84\\x9d\\x06\\x78\\x39\\x92\\xeb\\x9e\\xb9\\x28\\x53\\x29\\x7d\\x72\\x28\\xdb\\xa9\\x80\\xb2\\x50\\xbb\\x11\\x0f\\x63\\xd0\\xb8\\x46\\x70\\xe5\\xec\\xb3\\x19\\xcb\\xfd\\x61\\x27\\x8f\\x1f\\x4c\\xab\\xf1\\xfc\\xb3\\xf7\\x01\\xf1\\x2f\\x6e\\xf8\\xd3\\xcc\\x42\\x82\\xfc\\xbe\\x58\\x9e\\xb5\\x65\\x95\\x03\\xa2\\xdd\\xd8\\xbb\\xa3\\x8e\\x5e\\xff\\x09\\x2d\\xfa\\xf5\\x39\\xfd\\x80\\x4f\\x21\\xf7\\x3a\\x90\\xad\\xf5\\x69\\xa0\\x0b\\xf9\\xd2\\x5a\\x9a\\xd3\\xa6\\x33\\x09\\xcc\\x60\\x93\\x14\\x24\\x71\\xa4\\x78\\xf0\\xb8\\x99\\x22\\x86\\xde\\x02\\x3c\\x68\\xef\\xd4\\x99\\x87\\xec\\x27\\x0b\\xd9\\x46\\xf6\\xdb\\x48\\xf6\\x84\\xf1\\xc2\\xad\\xee\\xe2\\x6d\\x68\\xdc\\xe9\\x5a\\x55\\xe4\\xcb\\x27\\xbc\\x60\\x52\\x30\\x80\\xdf\\x6b\\xa2\\xb1\\x99\\x99\\x6b\\x1f\\x1d\\xa6\\x92\\x0d\\x15\\x59\\xf7\\x9b\\xfd\\xe9\\xfa\\x1a\\x02\\xde\\xae\\x14\\x80\\xc7\\x6f\\x94\\x7f\\x9d\\x21\\x3f\\xc4\\x3b\\xb2\\x88\\x0a\\x1b\\x4d\\x03\\xbb\\x14\\xf5\\xb0\\x44\\xa0\\xfd\\x83\\xce\\x04\\x92\\xf4\\x9c\\xa3\\xaf\\x25\\x21\\x1b\\x86\\xfa\\xa5\\x73\\x5a\\xd7\\xfe\\xaf\\x31\\xa1\\xa7\\x49\\x1e\\x70\\x8b\\x41\\x82\\x9d\\x68\\xe3\\x24\\x14\\xf6\\x83\\x52\\xb7\\x1d\\x1c\\xd2\\x3c\\x8e\\x12\\xfb\\x02\\xda\\x71\\x14\\x84\\xf6\\xef\\x97\\x52\\x8a\\x00\\xd2\\x4f\\xcf\\x91\\xd4\\xe0\\x6e\\x9b\\xad\\xae\\x9a\\x44\\xdb\\xdb\\x3f\\x77\\x80\\x41\\x76\\x8d\\x86\\x37\\x04\\xd7\\x36\\x81\\x04\\x00\\xe7\\xf2\\x93\\x1e\\xfb\\x85\\xc8\\x72\\x4a\\x59\\x34\\x26\\xaa\\x2a\\xf1\\xec\\x5b\\x66\\x4f\\x85\\xc2\\x25\\x48\\x96\\xfd\\xcf\\x31\\x6d\\xb0\\x92\\x4e\\x11\\xaa\\xe8\\xd6\\x83\\xe9\\xa0\\x21\\x92\\x9d\\x0a\\x9d\\x6f\\xec\\xb4\\x59\\x4b\\x1b\\x3f\\xbc\\x16\\xb1\\x76\\xd2\\x9d\\x1e\\xfb\\x18\\x19\\xa4\\xa4\\x23\\xfb\\xe0\\xca\\x05\\x59\\xc5\\x7e\\x9e\\x54\\x49\\xf1\\x4b\\xce\\x91\\x36\\x0d\\xaf\\xda\\x6a\\x42\\x7c\\xe4\\xa0\\x99\\x3d\\xd0\\x30\\x82\\xdd\\xee\\x06\\x65\\x33\\xf6\\xd3\\xbd\\xa5\\x66\\x0f\\x42\\xfd\\x77\\x57\\x69\\x0d\\x67\\x05\\x98\\xec\\x70\\x96\\xf4\\x75\\xa0\\x1a\\x51\\x99\\x50\\x34\\x1a\\x83\\x1f\\xc9\\xa2\\x81\\xc0\\x94\\x7a\\x86\\x3f\\x1f\\x6e\\x03\\xbb\\xa7\\x74\\xde\\x77\\xad\\xc2\\x3f\\xbe\\x52\\x5c\\xae\\x6c\\xcc\\xe4\\x7a\\x0e\\xc4\\x97\\x9e\\x8b\\xec\\x86\\xf3\\x32\\xfc\\x6a\\x57\\x36\\xe3\\xb9\\x8f\\xb3\\x32\\xe9\\xe8\\x24\\x4e\\x68\\xa1\\x00\\x45\\x5e\\x64\\x99\\xba\\x8d\\xba\\xe9\\x8b\\x92\\xba\\x3d\\x9c\\x6b\\x4f\\xf9\\x80\\x34\\x3e\\x4c\\x8e\\xf4\\xd5\\xa4\\xaa\\xcf\\x8b\\x1a\"},\n{{0xc7,0x1c,0xc1,0x0a,0xd2,0xd4,0x43,0xe0,0x25,0xad,0x06,0x25,0x68,0x6b,0x12,0x35,0x03,0xe5,0x90,0x19,0x3a,0x2b,0xc8,0xcc,0x57,0xa7,0xb9,0xb4,0x15,0x8d,0xe6,0xcb,},{0xfc,0x06,0xac,0xaa,0xb5,0x3a,0xd0,0x8e,0x97,0x62,0xdd,0x11,0xcd,0x21,0x22,0xb3,0x15,0x99,0xbd,0x25,0x98,0xce,0x6f,0x24,0x87,0x95,0xe7,0x32,0x21,0x9c,0x2f,0xc7,},{0x2e,0xb3,0x3b,0xc2,0xd5,0xde,0xb7,0xf3,0xa2,0xdc,0xc3,0x77,0xb0,0xc6,0xa8,0x62,0x13,0x4b,0xf3,0x19,0x1e,0xc4,0x0f,0xc1,0x28,0xac,0x28,0xab,0xf2,0x31,0x6e,0xf1,0x40,0x16,0x49,0xb8,0xf4,0xcf,0xa1,0xa9,0x36,0xde,0x79,0xb5,0x32,0xdc,0x04,0x3b,0x6d,0x36,0x02,0x4b,0x4c,0x37,0xbb,0xa2,0x92,0x90,0xac,0x9f,0x44,0x9b,0xa6,0x0d,},\"\\x2e\\x08\\x46\\x53\\x6d\\xc6\\xcc\\xe1\\x9c\\xcf\\x82\\xdc\\x2d\\x0c\\xd2\\x1b\\xd4\\xe1\\xca\\x7b\\xc3\\x17\\x06\\x7a\\xf8\\xd9\\x0e\\xe4\\x81\\x8c\\x85\\x18\\xbc\\x3e\\xf9\\x60\\xce\\x11\\x2a\\x41\\xd2\\xb9\\x97\\x9a\\x28\\x2a\\xe1\\x3d\\x70\\x6a\\x00\\x5e\\x00\\x34\\xf0\\x6b\\x39\\xff\\x4b\\x0a\\x5a\\xfa\\xed\\x70\\xb5\\x61\\xbc\\xce\\xb1\\xbb\\xd2\\xec\\x19\\xf9\\x74\\x48\\xea\\xed\\x4b\\xe6\\x20\\xe3\\x6a\\x96\\x2d\\x87\\x8c\\x6f\\x80\\x17\\x2b\\x9f\\xad\\x43\\xee\\xd0\\x7f\\xf9\\x3d\\xb9\\xb9\\xca\\x22\\x62\\xd5\\xa3\\xc2\\x29\\xc5\\x4e\\x30\\xa4\\x5e\\x73\\x66\\x08\\x92\\xf0\\x48\\xe3\\x63\\xf3\\x71\\x44\\xed\\x19\\x21\\xf7\\x29\\x92\\xb4\\xd0\\x15\\x29\\x87\\x0c\\xfe\\x37\\x3b\\x7e\\x7c\\xbe\\xda\\xf9\\x69\\x26\\x9f\\xb7\\x0a\\xa7\\x83\\xd1\\xe7\\x44\\x17\\xc7\\xba\\xe0\\xfe\\x03\\xd9\\x51\\xfd\\xb8\\xc7\\x1c\\x62\\xe9\\xbe\\x7f\\xdd\\x5d\\x23\\x3e\\x39\\xf4\\x6f\\xed\\x05\\x7e\\x49\\xb6\\xf3\\x40\\x68\\x45\\x91\\x48\\xda\\x3d\\x42\\x41\\x61\\xad\\x2c\\x86\\x95\\x08\\x60\\x2e\\x9c\\x0b\\xb3\\x0b\\xfb\\x88\\xac\\xd5\\xf4\\xdf\\xdf\\xfd\\x47\\x35\\x03\\xcd\\xfe\\xda\\xbc\\x44\\x42\\xb7\\x43\\xbe\\x07\\x5e\\x7c\\x6f\\x61\\x0e\\x64\\xff\\xc2\\xe5\\x31\\x87\\x74\\x5c\\xd7\\x19\\x65\\x8f\\xc6\\xe6\\x2a\\x5b\\xe5\\x18\\x43\\x7c\\x5b\\xd6\\xa4\\xfe\\xba\\x94\\xae\\x3f\\x44\\xf2\\xf2\\x93\\x08\\xe8\\x31\\xfe\\xef\\xed\\x67\\x69\\x09\\xce\\x5e\\x80\\xc8\\x4c\\xbd\\xca\\xc4\\x7e\\x47\\xd2\\x7c\\x97\\x12\\xa0\\x1f\\x6b\\xc5\\xda\\xed\\xc0\\x2e\\x64\\x14\\x40\\x7e\\x91\\x1c\\x0a\\x5a\\x53\\xe5\\x32\\x8a\\x5a\\x5f\\xd9\\xf0\\x40\\xaa\\x7f\\xb7\\x0b\\x79\\xb3\\x1c\\xd1\\xb6\\xfd\\x9b\\xd5\\x02\\x90\\x40\\xbd\\x22\\xae\\x22\\x2f\\xd2\\xf6\\x87\\x0d\\x07\\xf4\\x35\\x32\\x26\\x39\\xcf\\x31\\x93\\xca\\x57\\x09\\xb8\\x82\\xb0\\x7a\\x58\\xf9\\x52\\xa9\\x96\\x3e\\x56\\x8f\\x8c\\x5a\\x58\\x4a\\x6b\\x9e\\x27\\x5c\\x5c\\x07\\x95\\x7a\\x4d\\x2c\\xda\\xa9\\xf1\\xeb\\x44\\x4e\\xd1\\x22\\x4b\\xac\\x65\\x63\\xb2\\xf9\\x27\\x3e\\x80\\x30\\x1d\\x44\\xd5\\x0a\\xe3\\x83\\xb5\\x97\\x21\\x3b\\x00\\xda\\x5b\\xf2\\x7e\\x5d\\x1f\\xe2\\x40\\xcc\\x3b\\xb6\\x5a\\xa5\\x03\\x0d\\x65\\x1b\\x6b\\x5b\\x31\\x76\\x1d\\x53\\xce\\x0c\\x6d\\x74\\xa1\\x5d\\xad\\x54\\x79\\xf3\\x1c\\x91\\x5c\\xcf\\x44\\x66\\x59\\x85\\x3b\\x89\\xa5\\x1a\\x28\\xee\\x89\\x76\\x85\\x35\\x53\\xfd\\x2e\\x02\\xfe\\x72\\x43\\x53\\x8d\\x00\\xb4\\xed\\x07\\xd8\\xb8\\xa8\\x0b\\x5c\\x16\\x5c\\xd4\\x63\\x41\\xff\\xd8\\x16\\x3c\\x55\\x57\\x02\\x66\\x3a\\x4e\\x6a\\xb2\\x95\\x2b\\x7e\\x74\\x43\\xd0\\xf6\\xb1\\x23\\xb6\\x94\\x67\\x21\\xaa\\x63\\xe8\\x7b\\x11\\x55\\xec\\xa8\\xa6\\xa1\\xbc\\x9f\\xd2\\x5c\\x67\\x62\\xe5\\x27\\x42\\xc8\\x6b\\xca\\x1b\\xa9\\xd8\\x37\\x04\\x15\\x24\\x4f\\x0e\\xdf\\xdb\\xe0\\x93\\x2b\\x5c\\xa0\\x61\\x15\\x09\\xc9\"},\n{{0x0a,0x4f,0x5e,0x16,0x70,0xf1,0xe2,0x4b,0xfa,0x37,0xb7,0x3c,0x99,0x43,0x30,0xb3,0x6e,0x7d,0xaa,0xf9,0x30,0x16,0x1b,0x78,0xa4,0xa8,0x48,0x66,0xff,0x25,0xe3,0xd5,},{0x9d,0xcb,0xba,0x90,0x39,0x81,0x59,0x4c,0x7b,0x67,0x7e,0xa8,0x00,0x20,0x01,0xd6,0x64,0xcf,0xf7,0xce,0x8e,0x5c,0xfa,0xe5,0x88,0x40,0xcf,0x74,0xaf,0xf0,0xd3,0xa9,},{0xdc,0xf3,0x53,0xb2,0xb9,0x9a,0x4e,0xf4,0x5f,0x3f,0xdf,0x65,0x28,0x63,0x2e,0x8a,0xbd,0xc4,0x33,0x34,0x24,0x76,0xa8,0xc2,0xb3,0x79,0x00,0x40,0x4a,0x4e,0x33,0x3d,0x38,0x78,0x14,0x23,0x57,0x57,0xef,0x7a,0xd0,0x38,0x58,0xa0,0xf3,0x5d,0x46,0x15,0xe8,0xab,0xa4,0x84,0xfd,0x64,0xf1,0x11,0x2e,0xc1,0xb1,0xae,0xd2,0xcb,0x64,0x0e,},\"\\xf4\\xb0\\x5b\\x3e\\xfd\\xcb\\x1d\\x5c\\x07\\xda\\x95\\x0c\\x46\\x56\\x55\\x28\\x44\\x0b\\xb4\\x88\\x35\\xee\\x4c\\x13\\xf4\\x3d\\x7a\\x16\\x18\\xde\\x11\\x9e\\xbb\\xb2\\x59\\xea\\x74\\x80\\xa5\\x04\\x81\\x74\\xfa\\xec\\xc1\\x05\\x5b\\x32\\xdc\\x01\\xac\\x71\\x56\\x34\\x43\\x21\\xe8\\xeb\\xa6\\x98\\xf3\\x02\\xee\\x16\\x43\\xb5\\xf0\\x4b\\x8e\\x7e\\xcc\\xa6\\x3b\\x91\\x56\\x1c\\xe3\\x51\\x4a\\xbe\\x78\\x51\\xb6\\xfb\\x17\\xfc\\x94\\x3b\\xdc\\x94\\xda\\x30\\x8c\\x8e\\x47\\x69\\xfe\\xc2\\x0f\\xad\\xf4\\xfa\\x8e\\x7f\\x62\\xb6\\xff\\xb5\\xf1\\x70\\xd6\\x44\\xed\\x29\\x35\\x5e\\xbd\\x22\\xcb\\x3a\\xa1\\x48\\x6b\\x1e\\x36\\x7c\\x72\\x9d\\xd3\\xf7\\x9b\\xcd\\x40\\xff\\xd0\\x8a\\xf2\\x8c\\xeb\\xc8\\xd7\\x76\\xe1\\xa4\\x83\\xe9\\x11\\xd7\\x9b\\xc6\\x13\\xe0\\x9c\\xc6\\x21\\xca\\xde\\xb0\\x34\\xdd\\x6f\\x72\\x37\\x47\\x71\\x98\\x51\\x27\\xf7\\xa3\\xa1\\xaa\\x78\\x6a\\x52\\x3a\\xe6\\xe3\\x4e\\xe4\\x33\\xdc\\x30\\xc3\\x75\\x98\\x7c\\xff\\x50\\xbd\\xcb\\xc9\\x97\\xfc\\xd5\\x1c\\x94\\x56\\x7a\\x67\\xae\\xfb\\x6e\\xf5\\xed\\xf9\\xbd\\xd6\\x59\\x64\\xd4\\x64\\xbe\\x9e\\xbd\\xfb\\x88\\xc0\\xe2\\x31\\xb0\\x7f\\xf6\\x40\\x5c\\x00\\xf8\\x25\\x31\\xe9\\x61\\xbf\\xc5\\xea\\xd2\\x66\\xbc\\xc0\\x87\\x18\\x87\\x8c\\xaf\\xb1\\xd3\\x75\\x36\\xf1\\x83\\xe4\\x8b\\xf3\\x8d\\x3f\\x6b\\xe9\\x00\\x25\\x2d\\x1f\\xb4\\x19\\xe6\\xa2\\xac\\x58\\x96\\x03\\x9f\\x63\\xc3\\x14\\x01\\xff\\xf9\\x32\\xce\\x98\\x14\\xb0\\x85\\xab\\x20\\x41\\x69\\x72\\xa2\\xb3\\x51\\xc8\\x15\\xa6\\x2d\\xe5\\x09\\x67\\x46\\x28\\xb0\\xd3\\x56\\x6f\\xc9\\xc2\\xe0\\xa9\\x23\\x7b\\x93\\xf9\\xbb\\xb2\\xde\\xed\\xf0\\x2b\\xff\\x83\\xbf\\x6d\\x86\\x8b\\x63\\x99\\x32\\x6d\\x48\\x09\\xd0\\x41\\x9f\\x31\\xb2\\xf3\\xa4\\x81\\x28\\x5b\\x94\\x07\\x8b\\x47\\x06\\x1c\\xe9\\x1d\\xad\\x58\\x3d\\xd5\\xb1\\x3b\\xd0\\x10\\xfb\\x30\\xf2\\x49\\x5b\\xb7\\x04\\x20\\x18\\x3a\\x93\\x01\\x59\\xe4\\xdb\\x19\\x3d\\xf6\\xac\\xd1\\x24\\x42\\x3e\\x03\\x9a\\x67\\xf1\\x56\\x88\\xae\\xc5\\x0c\\x59\\x27\\xfb\\x27\\x18\\x22\\xaa\\xa6\\x6f\\x29\\x4b\\xc8\\x05\\xd3\\xbc\\x7c\\x83\\x41\\x87\\x8a\\x54\\x10\\x09\\xf3\\x0d\\xa9\\x9f\\xcc\\x00\\x85\\x07\\x9c\\xe7\\xfc\\x55\\xe0\\x01\\x16\\x85\\x56\\x2a\\xbd\\xb3\\xa9\\x47\\x1f\\xfd\\xe6\\x17\\x63\\x00\\xef\\x5b\\x31\\xe0\\xdf\\x60\\x9a\\x54\\xa1\\xee\\x66\\x24\\x07\\x0d\\xa9\\x9c\\x87\\x76\\x89\\x1f\\xdf\\x6a\\xa7\\x8b\\x4d\\x55\\xb1\\xf5\\xda\\xdf\\xc0\\x61\\xad\\xd5\\xaf\\x00\\xfd\\x3a\\xde\\xdb\\x44\\x8c\\x55\\x9b\\xff\\xf2\\x04\\x06\\x80\\x43\\xa5\\xd1\\xd6\\x21\\x47\\x48\\x62\\x8c\\x3e\\xbc\\x5f\\x02\\x24\\x32\\x6c\\xa1\\x8e\\xf0\\x48\\x42\\x5d\\xa9\\x30\\x01\\x33\\xfb\\x69\\x5d\\x4f\\x26\\x31\\x65\\xac\\x22\\xf3\\x61\\x9d\\x40\\x5a\\xf2\\x71\\xa7\\x1a\\x9a\\xfb\\x19\\x8b\\xf6\\x31\\x24\\x1d\\x34\\x59\\xb9\\x53\\x98\"},\n{{0xb8,0x55,0xc8,0x18,0x05,0xc7,0x08,0x74,0x10,0xe6,0x9f,0x96,0xb0,0x24,0x02,0x71,0xdc,0x76,0xc1,0xe4,0xad,0xe3,0x8c,0x6a,0x92,0x78,0xe3,0xc9,0x4f,0xbe,0xa2,0x56,},{0x6a,0xdb,0x02,0x5a,0x40,0x26,0x0f,0x56,0x98,0x84,0xb8,0xca,0xb3,0x75,0x2b,0x4f,0x25,0x5c,0x37,0x3e,0x2b,0x42,0x4b,0x62,0x87,0xeb,0xb5,0x10,0xfa,0x06,0xff,0xf0,},{0x3c,0xaa,0x81,0x32,0x73,0xe7,0x53,0x54,0x2f,0xfb,0xfe,0xb2,0x1b,0xc3,0xe2,0xcf,0x8c,0xa7,0xd9,0x20,0xfa,0xac,0x7c,0x49,0xdc,0x2a,0xa9,0x91,0x17,0x68,0xc7,0xad,0x43,0xb3,0x8b,0x02,0x36,0xdb,0x27,0xf3,0xee,0xae,0x0b,0x12,0x06,0x00,0x1e,0x66,0x5a,0x60,0x70,0x78,0xc5,0x22,0xed,0x7a,0x9d,0xc4,0x68,0x85,0x34,0x63,0x59,0x00,},\"\\x85\\xa9\\xbd\\xb7\\x0a\\x6c\\x75\\x28\\x97\\xe4\\x3a\\x91\\x10\\x6e\\xe9\\xa9\\x9c\\x2c\\xa9\\x4f\\xf7\\xb4\\x46\\x1a\\x44\\xa3\\x91\\x74\\xc1\\x7e\\xcd\\x99\\xdf\\x46\\xee\\xcd\\x81\\xc3\\xf5\\x25\\x13\\xdc\\x9d\\x54\\x7d\\xad\\x37\\x21\\xc6\\xd5\\xee\\x1f\\x8f\\xac\\x0b\\xa5\\xaf\\xb3\\x68\\x70\\x44\\x73\\x9e\\xd5\\x35\\xb8\\x44\\x00\\x87\\x04\\xc0\\x9f\\xe1\\xe5\\xd7\\x85\\xd4\\xc9\\xc3\\xd0\\xb0\\x58\\x89\\xb9\\xc2\\x0f\\xc3\\xfd\\x68\\xdf\\x12\\xdb\\xeb\\x2c\\x34\\xf6\\xf7\\xec\\x1c\\x6f\\xb7\\xfa\\x81\\x1f\\xf8\\x46\\xb5\\xa6\\x1f\\xa5\\xfe\\x55\\x37\\x9e\\xe6\\x3a\\xbc\\xd3\\x73\\xfe\\xd0\\x02\\x54\\xeb\\xd0\\x6b\\xc8\\xb2\\x2f\\x7f\\xbf\\x2f\\x72\\x7a\\x5f\\xad\\x88\\x51\\x41\\x59\\xe2\\x6d\\x78\\xdf\\xdb\\x09\\x57\\xf6\\xef\\xaf\\x51\\xa8\\xe8\\x0b\\x58\\x5e\\x83\\x8b\\x96\\x21\\xd0\\x51\\x07\\x4a\\x4f\\x58\\x67\\xb4\\xae\\x2f\\x2f\\xf6\\xd6\\x2b\\x85\\xbc\\xce\\xc0\\xb4\\xaa\\xa4\\x79\\x16\\x37\\x38\\x8c\\x09\\x01\\xfd\\x49\\xdc\\xcc\\xce\\x72\\x04\\x85\\x9f\\x81\\xee\\xfc\\x63\\x9f\\xed\\x92\\x28\\x04\\x56\\xe6\\x9a\\x15\\x09\\xb4\\xb1\\xbd\\x76\\x24\\x44\\x7d\\x86\\x2c\\x45\\xa0\\xc8\\xb0\\xc5\\xbb\\x2c\\x4c\\xa5\\x12\\xcb\\xc0\\x37\\xf5\\x1b\\x78\\x09\\x82\\xb1\\x83\\xa5\\xca\\xfa\\x15\\x29\\x75\\x85\\xc9\\x47\\xa2\\x5b\\xe8\\xc2\\x24\\x0e\\xbf\\xb6\\x86\\x8e\\xce\\x5e\\xa2\\xaa\\xb2\\xc2\\x39\\xc8\\x37\\x54\\xc7\\xd5\\x94\\xb3\\x72\\x5a\\xce\\xef\\x34\\x4b\\xa7\\xe6\\xae\\xf4\\x9f\\x7f\\x31\\x3b\\x0a\\xe8\\x2c\\xca\\xca\\xd3\\x87\\xa6\\xe9\\x33\\x7f\\x05\\xf8\\xc7\\x99\\xef\\xe7\\x82\\x9b\\x27\\xb4\\xd5\\xb2\\x01\\xfd\\x5a\\xe5\\x83\\x43\\x51\\x69\\x07\\x59\\xf3\\xea\\x17\\x5f\\xd4\\x74\\x1b\\xe2\\x28\\xd8\\x07\\xfb\\x54\\xdf\\x4a\\x74\\x10\\x38\\xfa\\xee\\x47\\xed\\xf1\\xf5\\x61\\x65\\x25\\x98\\x60\\x1f\\x27\\x15\\x5f\\xc5\\x0d\\x9d\\x50\\x11\\x43\\x37\\x11\\xc1\\x06\\xd4\\xb6\\x07\\x85\\xa5\\xcc\\x93\\xb3\\xfd\\xd1\\xda\\xd7\\x0c\\x0c\\x8e\\xaa\\x33\\xf1\\x51\\x2e\\x35\\xa5\\x41\\x74\\x5e\\x37\\x6c\\x15\\x16\\x7f\\xa8\\xf6\\xb3\\xb2\\xc4\\xc3\\xa3\\x66\\xfc\\x41\\x49\\x7d\\x29\\x73\\x57\\x81\\x6a\\xe7\\x95\\xa8\\x04\\xc9\\x80\\xe7\\xcb\\xfb\\x0c\\x74\\xd8\\x83\\x5d\\x92\\x9a\\xe3\\xbb\\x52\\xba\\xb1\\x29\\x64\\x56\\x6d\\x74\\x6b\\xd2\\xc1\\xd1\\x32\\xb6\\x23\\x3f\\xa3\\x4f\\x75\\xe2\\x68\\xed\\xee\\x77\\x5e\\xb3\\xce\\x13\\x2e\\x6b\\xeb\\x2e\\x8d\\x71\\xf0\\xc8\\x76\\x29\\x91\\xcd\\xe4\\xe2\\x6f\\x71\\x43\\x9d\\xfa\\x83\\x97\\x8f\\x99\\x56\\x03\\x86\\x1b\\xc0\\xb1\\xd9\\x06\\x0b\\xbc\\xca\\xcc\\xf8\\x6f\\x87\\x45\\xad\\x96\\x99\\x4d\\x5d\\x00\\x7d\\x52\\xe8\\x3a\\xa5\\xe6\\x94\\x12\\x96\\x4b\\xdb\\xfb\\xe4\\x78\\x0a\\xaa\\x8d\\xe4\\x1b\\xe1\\x29\\x8a\\xbb\\xe9\\x89\\x4c\\x0d\\x57\\xe9\\x7f\\xca\\xcc\\x2f\\x9b\\xbd\\x63\\x15\\xd3\\xfc\\xd0\\xea\\xf8\\x2a\"},\n{{0x95,0xb9,0xc8,0xa6,0xef,0x80,0xeb,0xd5,0xcb,0xd4,0x7a,0x04,0xca,0x54,0x38,0x73,0x73,0xdf,0x4d,0x67,0xa2,0xb4,0x75,0x59,0x77,0x65,0xac,0x89,0xfc,0xf9,0x3e,0x93,},{0xf2,0xc9,0x47,0xb1,0x8a,0xdc,0x3e,0xa6,0xa2,0x3f,0x7a,0xbc,0xa3,0x64,0xb9,0x85,0x3a,0xe8,0x5a,0x2b,0x0c,0x8c,0x26,0xf0,0xd3,0x17,0x3c,0x27,0x32,0xc3,0xc7,0xff,},{0x2c,0x8b,0xf5,0x43,0xe2,0xa3,0xe0,0x04,0x15,0xee,0x4f,0x10,0x7b,0x2f,0x5a,0x66,0x87,0x17,0x6f,0x5d,0x52,0x11,0x17,0x75,0x9c,0xeb,0x56,0x17,0x51,0xbc,0xc7,0x7d,0x9b,0x08,0xa6,0xa6,0x31,0xf6,0x44,0x7c,0xd9,0x01,0xde,0x96,0x69,0x9a,0xeb,0xb1,0x68,0xbf,0x97,0x50,0x0d,0xc5,0x4a,0x05,0x43,0xef,0x14,0xe4,0xb5,0xa0,0x81,0x06,},\"\\x78\\x55\\xbc\\x39\\x26\\x30\\xcc\\xf5\\x31\\xd3\\x06\\x16\\x06\\xdd\\xfc\\x81\\xa0\\xfd\\x92\\x94\\xc5\\x47\\x91\\xb5\\xf9\\x55\\x9b\\x68\\x27\\x25\\x4a\\xa1\\xf2\\x5c\\x54\\x0b\\x7d\\x7d\\xf3\\xec\\x9c\\xdf\\x14\\x25\\x66\\x29\\xdb\\xcf\\x9b\\x72\\x5f\\xeb\\x34\\x12\\xeb\\xf3\\x5f\\x0e\\xf9\\x37\\x9e\\x41\\x31\\xcc\\x77\\xe0\\xf0\\xfb\\x6f\\x74\\x59\\xa7\\x38\\x36\\x1a\\x99\\xae\\x4c\\xcb\\x2b\\x60\\xa9\\x9f\\xe9\\x2b\\xd6\\xc3\\xa5\\x3d\\x6f\\x45\\x4e\\xe9\\x00\\x5b\\xce\\xc5\\xae\\xdc\\xfa\\x82\\x34\\x73\\x92\\xef\\xcf\\x11\\x75\\xe5\\x78\\x39\\x6a\\x8d\\x80\\x0d\\xab\\xa0\\xf4\\xc2\\xcf\\x4d\\x49\\x13\\xb0\\x52\\x86\\x20\\xe3\\xba\\xa0\\xf6\\xd8\\x6e\\x06\\x28\\xe4\\x7c\\x0c\\xa2\\x6d\\xf3\\xb0\\xc7\\x88\\xc4\\xe1\\x65\\x57\\xf7\\xfc\\x28\\xdf\\x82\\x0c\\x12\\xfb\\xb6\\xff\\xbf\\xec\\xb9\\x82\\x9d\\xdb\\x65\\xef\\x8d\\x63\\xe9\\x0d\\x68\\xfc\\x71\\x94\\xb5\\xb8\\x85\\x91\\x3f\\x08\\xed\\xee\\x84\\x56\\x76\\x47\\xff\\xa3\\xf0\\xd0\\xd3\\x25\\xd0\\x82\\x60\\x0c\\xe7\\x1a\\x23\\x45\\xc7\\x7d\\x65\\xbd\\x96\\x25\\x20\\x03\\xe5\\xc1\\x25\\xa7\\x18\\xa0\\x73\\x70\\xc3\\x1b\\x57\\x08\\x07\\x5c\\xf1\\x83\\x7c\\x69\\x25\\x63\\x5c\\xc6\\x8d\\xd1\\xb7\\x51\\xe4\\x0a\\xb6\\x08\\xb0\\xd9\\xd8\\x85\\x2c\\x18\\xd3\\x06\\x92\\x19\\xef\\x80\\x7b\\x76\\xd2\\x88\\xf9\\x2c\\x29\\xa9\\x3e\\x3d\\x75\\xb5\\xb2\\xe5\\x36\\x81\\x67\\x1d\\x3a\\xe0\\x14\\x5a\\xc0\\x3c\\xca\\xd3\\x16\\x2e\\x44\\x70\\x3b\\x04\\x01\\xd3\\xeb\\x16\\x7c\\xd8\\xdd\\xc1\\xe1\\xa5\\xa3\\x26\\xb7\\x28\\xb1\\xe0\\xc0\\x0a\\x94\\xd8\\x6d\\xe6\\x13\\x52\\xa6\\x61\\xe4\\x08\\x97\\x17\\x5d\\x28\\xd3\\x41\\xe4\\xd1\\xd9\\x96\\x2e\\x35\\xf4\\xde\\x18\\xa5\\x40\\x17\\x61\\x1a\\xd0\\x53\\x59\\xce\\x08\\xb9\\x7b\\xfe\\xdb\\xfb\\xe3\\x99\\x2e\\xd5\\x8e\\xd4\\x0f\\x51\\x7a\\xab\\x01\\xc0\\xfe\\xfe\\x8b\\x63\\x64\\x3d\\xa1\\xa4\\x54\\x15\\x27\\x30\\xbf\\x99\\xaf\\x87\\x40\\xad\\xf9\\x8a\\x77\\xb8\\xd7\\x3a\\xdb\\x08\\xe6\\x09\\xe0\\x0c\\xe9\\xb1\\xcc\\xdf\\xef\\x3e\\x9a\\x9b\\x05\\xaa\\x56\\xe0\\xbc\\x79\\xb6\\xbb\\xba\\x80\\xdd\\x8e\\x46\\x1a\\xf7\\xcb\\x20\\x28\\x92\\xd8\\x9b\\x2d\\x05\\xa4\\x45\\x8a\\xb3\\xfa\\x54\\xb4\\x74\\xb8\\xf8\\xf5\\x81\\x79\\x5d\\x6c\\x27\\x39\\xe5\\x9d\\x0f\\xe0\\x62\\x40\\x0b\\xae\\x2d\\x2d\\x53\\x4b\\x34\\x0b\\xb8\\xe2\\x61\\x57\\x77\\xa9\\xa5\\x61\\x5b\\xb2\\xcf\\x43\\x7b\\xa5\\x25\\xe0\\x0e\\x70\\x38\\xf2\\x2a\\x57\\x88\\x2a\\xc5\\x20\\xb3\\x33\\xe7\\x5c\\x3c\\x92\\xa8\\xb9\\xf0\\xe3\\x7f\\x67\\x1c\\x94\\xb1\\x5d\\xd8\\x18\\x2a\\x08\\xd7\\xc1\\x43\\xe9\\x4e\\x92\\x62\\xb3\\xcc\\x55\\x44\\xc2\\x94\\xf5\\xf3\\x35\\xc2\\xb2\\x8a\\xc1\\x19\\xfe\\xa0\\x0f\\x96\\x34\\xdb\\x06\\x39\\x93\\x98\\x8b\\x5f\\x15\\x05\\x79\\xc7\\xcc\\x25\\xb6\\xa1\\xfb\\x0d\\xde\\x94\\x80\\x4f\\xa6\\xef\\x66\\xff\\x79\\xfb\\x91\\x07\"},\n{{0xb7,0x86,0xcc,0xfb,0x58,0x6d,0x43,0xb8,0xc4,0x6b,0xb9,0x7b,0x96,0xc9,0x18,0x73,0x1b,0xc2,0xcc,0x11,0x92,0x77,0xf1,0x23,0x67,0x1e,0x30,0x14,0x81,0x58,0xd2,0xed,},{0x90,0xc7,0x00,0x46,0x00,0xf3,0xdc,0xe4,0x09,0xfd,0xea,0xdc,0x8e,0xd0,0x18,0xf9,0xea,0x26,0x3f,0x75,0x16,0x0a,0x74,0xab,0x54,0xf4,0xc2,0x39,0x9a,0x90,0xca,0x78,},{0x52,0xba,0x96,0x58,0xa1,0xa0,0xb3,0xe9,0x8e,0xd5,0x20,0x9e,0x39,0x3e,0x42,0x00,0x66,0xa3,0x7d,0x37,0x14,0xda,0xa7,0x3d,0x5c,0x67,0x1d,0x33,0x07,0x5a,0x5f,0x57,0x27,0xfe,0x4e,0x08,0x1e,0xe0,0xfa,0x3c,0x21,0x33,0xdc,0x95,0x3a,0x2d,0xa6,0x20,0x29,0x13,0x71,0xf0,0x0c,0xcb,0x57,0xd8,0x79,0x2e,0xb5,0x96,0xa2,0xff,0x81,0x01,},\"\\xba\\xbf\\x48\\xbd\\x55\\xea\\x91\\xbd\\x0c\\x93\\xb9\\x70\\x24\\x1b\\x52\\x9d\\x9d\\xb4\\x3d\\x49\\x27\\xfe\\xa5\\xf1\\xa1\\xf7\\x08\\x2d\\xd6\\xcb\\x50\\xa5\\x2b\\x09\\x4b\\x31\\x29\\xfc\\xd9\\x03\\xa4\\x4f\\xec\\x8b\\xfd\\xb5\\xc8\\x6c\\x00\\x2a\\x2a\\x45\\x28\\x87\\xca\\x25\\xa6\\x0e\\xce\\xb5\\xe1\\xf9\\xf5\\xc9\\x3d\\xc5\\x94\\x23\\xc7\\xaf\\xe7\\x47\\xc6\\xbf\\x40\\x7c\\xac\\xad\\xec\\xcf\\x5d\\x78\\x79\\x70\\xcb\\x06\\x17\\xbb\\x3c\\xfe\\x7f\\xd1\\x75\\x63\\xd3\\xa0\\xdc\\x91\\x63\\x1f\\x71\\xb8\\x4b\\xe2\\x4a\\xe8\\x00\\x11\\x37\\x50\\xf0\\x31\\xd0\\x1f\\xd0\\x53\\x64\\xb4\\xf2\\x7f\\x86\\xf8\\xdc\\x3a\\xd7\\x40\\x7e\\x1a\\xe9\\xe7\\x68\\x15\\x4e\\x3d\\xde\\x58\\xe8\\x67\\x12\\x9e\\x24\\x74\\x54\\x7b\\x40\\x82\\x17\\x96\\x48\\x44\\x85\\x8d\\x05\\x6b\\x31\\xc3\\x74\\x99\\x1b\\x7f\\x16\\x1f\\x52\\xf0\\x88\\xb8\\x06\\xe0\\xf3\\x13\\xd6\\x8a\\x15\\xc5\\x40\\x1e\\xd5\\x5b\\x2b\\x77\\xde\\xea\\x58\\x6c\\xb0\\x54\\xdc\\xd7\\x1a\\xf2\\xab\\x6a\\xb1\\x1e\\x84\\xb3\\x0c\\x53\\x93\\x45\\xde\\x3e\\xb4\\x3f\\xb7\\xb3\\xa3\\xb4\\x89\\x87\\xc3\\xbf\\xa7\\x06\\x55\\xd5\\x99\\xf2\\xe3\\x1d\\x12\\xad\\x23\\xcc\\x96\\xe8\\x6d\\x38\\x0b\\xfd\\xa8\\x12\\xfe\\xff\\x3d\\xd3\\x02\\x42\\x92\\x91\\x69\\x07\\x02\\x28\\x91\\xe1\\x19\\xbf\\xc3\\xed\\x9c\\x25\\x54\\x6c\\xd1\\x9f\\xc9\\x92\\xd8\\xa6\\x1e\\x60\\x59\\xca\\x3c\\xe7\\x80\\x2a\\xf1\\x11\\x87\\x56\\x62\\x0b\\x87\\xa7\\x24\\x2b\\xd8\\x38\\x97\\xc9\\x4d\\xd5\\xa3\\x6e\\xd4\\x0f\\xc0\\xf3\\x4c\\x2c\\x93\\x11\\x0b\\x37\\xd1\\x7d\\xd9\\x6a\\x22\\x06\\x25\\x90\\xbc\\xdb\\x54\\x67\\x42\\xef\\x72\\x18\\xad\\xcc\\xc5\\xad\\x28\\xf4\\xfc\\xe6\\xec\\xf7\\x05\\x83\\x5f\\x41\\x13\\xd8\\x2e\\xa5\\x33\\x90\\x3a\\xec\\x8c\\x38\\x20\\xfe\\x4b\\x47\\x15\\xf3\\x7e\\x20\\xce\\xbc\\x1e\\x71\\x51\\x9a\\xa0\\xb2\\x40\\xb4\\x84\\x0a\\xa4\\xfd\\xcf\\xb5\\x24\\x67\\xfe\\xdd\\x8f\\x4d\\x1f\\x9b\\xc3\\x3e\\xe1\\x14\\xf3\\xef\\x85\\xf5\\xfd\\xb0\\x9c\\xa8\\x84\\xaf\\x38\\x8a\\xd3\\xad\\xf8\\x4c\\x79\\x3f\\x38\\x6e\\xfe\\x6f\\xf8\\xa4\\x6e\\xd8\\x1e\\x5d\\x45\\xa3\\x7c\\x25\\xcd\\x80\\xf2\\xd7\\x36\\x3f\\x43\\xae\\x45\\xe3\\x77\\x2c\\x0d\\xf8\\x9f\\x11\\x44\\x79\\x39\\x80\\x6c\\x09\\x6e\\xf9\\x33\\xa1\\x39\\x44\\xf0\\x89\\x0d\\x88\\x7c\\x2e\\x5b\\xbb\\x6b\\x12\\xea\\x95\\x0b\\x09\\xb8\\xfe\\x42\\x52\\x89\\x37\\x73\\x52\\xf3\\x5f\\x84\\xcc\\x4d\\xcd\\x4d\\x7a\\x44\\x94\\x89\\xfa\\x92\\x51\\xc0\\x31\\x13\\x48\\x92\\x25\\x80\\x9c\\xdf\\x3c\\xb6\\x34\\x75\\xf1\\x0d\\x34\\x17\\x09\\x37\\x1c\\x6f\\xd4\\xbb\\x7a\\x94\\x94\\x83\\xd1\\xbc\\x2b\\x31\\xdd\\xf4\\xd9\\x63\\xa0\\x7d\\xe7\\xea\\x5c\\x3f\\xee\\x9a\\x0e\\x33\\xf0\\x76\\x9f\\x2f\\xaa\\x40\\x61\\x2a\\x54\\x69\\x74\\xbd\\xe0\\xb7\\x33\\x91\\x79\\xe4\\x12\\x4a\\x44\\x7b\\xd4\\x28\\x79\\xcc\\xda\\x5c\\x8a\\xd1\\x81\\x9c\\x53\"},\n{{0xdd,0x1a,0x97,0x74,0xf7,0x58,0x4d,0x85,0x89,0xb1,0x9f,0x92,0xab,0x69,0x39,0xac,0x48,0x56,0x02,0xfe,0x16,0x44,0xce,0xe2,0xf6,0xf3,0xcd,0x60,0xfb,0xd5,0x84,0x00,},{0x4b,0xea,0x7d,0x0b,0x0f,0x4b,0xd5,0x90,0xf9,0xe3,0x57,0x9f,0x0c,0x5f,0xa4,0xce,0xf4,0xd6,0x0a,0x49,0xd2,0xc4,0x37,0xa0,0xaa,0xea,0xd9,0xd4,0x3a,0x73,0xd4,0xa3,},{0x19,0x59,0xbd,0xe0,0xa6,0x97,0xa6,0x39,0x93,0xec,0x47,0xd1,0x58,0x22,0x37,0x39,0xfe,0x65,0x87,0x1f,0xa0,0x58,0x70,0xd7,0xde,0x0d,0x38,0x08,0x65,0x91,0x20,0x2a,0x51,0xb1,0x74,0xd1,0xc6,0x18,0x28,0x08,0xc6,0xce,0x62,0x63,0x1d,0x81,0xdb,0xa3,0x4e,0xbe,0xd4,0xaf,0x2f,0x29,0xb0,0x6c,0x00,0xa5,0x7a,0x3c,0xb6,0x66,0x36,0x06,},\"\\xe5\\xdc\\x3e\\xd2\\x6c\\x1f\\x69\\x3c\\xf8\\x52\\x46\\x5a\\x05\\xe3\\x04\\x8b\\x50\\x5d\\xb5\\x11\\x6d\\x9e\\x31\\x59\\x22\\x05\\xa9\\xc3\\xd4\\x72\\x0b\\xc1\\x0b\\x6c\\x20\\x63\\x9a\\x0e\\xe2\\xf0\\xe1\\x47\\x22\\x5b\\x5b\\x19\\xea\\x51\\x1c\\xfb\\xa0\\xc2\\x1a\\xac\\x10\\x71\\x5a\\x2f\\x23\\x2f\\x10\\xc2\\xc8\\xaa\\xd4\\x11\\x12\\xb6\\xb0\\x12\\xe7\\x5a\\x41\\x55\\xf8\\xc6\\x92\\x62\\x53\\xca\\x2b\\x4d\\xdb\\x7b\\xfe\\x7f\\x86\\xe9\\x0a\\x53\\xdb\\xc0\\xcb\\xa8\\x9e\\x48\\x5c\\xec\\xa8\\xfd\\x26\\xe5\\x0c\\x7f\\x28\\x2a\\x25\\x35\\x73\\xcb\\x0a\\x8f\\xa8\\x8c\\xc4\\x46\\x23\\xe8\\x2e\\x8f\\xa2\\xed\\xb6\\xcb\\xc7\\x53\\x8a\\xc9\\x2c\\x11\\xe4\\xc5\\xb1\\xea\\x5f\\x68\\x96\\x6d\\x15\\xd9\\x3c\\x34\\xf3\\x96\\xd2\\x75\\x72\\xf8\\x64\\x38\\x2a\\xb7\\x6a\\x7b\\xe6\\x5a\\x55\\x7b\\x13\\x97\\x66\\x36\\x8a\\x20\\x7d\\x98\\xbc\\x0c\\x20\\x92\\x63\\x70\\xde\\xa2\\x70\\x48\\x16\\x03\\x63\\xed\\x85\\xf4\\x09\\x9e\\x7c\\xd6\\x6d\\x12\\xd0\\x98\\x8c\\xfc\\x9e\\x2f\\x16\\xaa\\x56\\x5f\\x8f\\x33\\xb3\\x9e\\x97\\x8c\\x05\\x87\\x37\\x1f\\x92\\xdb\\x50\\x56\\x31\\x75\\x64\\x41\\x1b\\xd8\\xa3\\xb6\\xfe\\xa0\\x9d\\x34\\x87\\xaa\\xf7\\x34\\x03\\x49\\x18\\xff\\xed\\x1c\\x9f\\xba\\x7b\\xde\\xc6\\xfe\\x68\\x87\\x6f\\xc7\\x36\\x0c\\xc5\\x62\\x9b\\x92\\x10\\x40\\x27\\xfe\\x57\\x59\\xc5\\xab\\x36\\x53\\x54\\x75\\x1e\\x79\\x69\\x11\\x6c\\x3b\\x9a\\x21\\xb1\\x52\\x33\\x0a\\x96\\xa9\\x38\\x1a\\xf7\\x30\\xd1\\x78\\x22\\xd7\\x8a\\xd6\\xea\\x86\\x00\\x06\\x91\\x5b\\x5c\\xab\\x44\\x7a\\x75\\x93\\x72\\xe0\\x5d\\x49\\x5e\\xbb\\x32\\x8e\\x75\\xd2\\x48\\xda\\xa0\\x2f\\x5d\\x2e\\xb9\\x78\\xd2\\x71\\x0c\\xf1\\xc5\\xfb\\x82\\x48\\x76\\x77\\x0e\\x32\\xca\\x6d\\xe2\\xc7\\x30\\x56\\x48\\x92\\x41\\x5b\\xcb\\x53\\xe5\\x98\\x1d\\x70\\x7a\\xdd\\x96\\x1c\\x5f\\x37\\xfd\\xaf\\xa1\\x39\\x9a\\xf8\\xae\\xa9\\x60\\x45\\x8d\\x2c\\xa3\\x10\\x55\\x3f\\x7c\\x98\\x66\\xcc\\xbe\\x8e\\x9d\\x88\\xe0\\x8a\\x44\\x68\\x72\\xea\\x66\\xfc\\x30\\x8c\\x82\\x45\\x14\\xb7\\xda\\xce\\x03\\x34\\xdb\\x73\\x5e\\x6f\\x14\\xc8\\x5b\\x5e\\x61\\x9a\\x5d\\x60\\x56\\x48\\xa8\\x81\\xe8\\x76\\xc7\\x8d\\xbe\\x06\\x57\\x23\\x3d\\x4f\\x7f\\x3b\\xfd\\xdf\\x63\\xb4\\x45\\x31\\x1d\\x6a\\xbc\\x47\\x63\\x47\\xec\\x4f\\xb4\\x3c\\x89\\x46\\xf9\\xd1\\x7c\\x36\\x93\\x81\\xd1\\xc5\\x64\\xff\\xcf\\xe2\\xdc\\x7b\\x47\\x26\\xfd\\x57\\x38\\x7f\\x0b\\x44\\xdb\\x8e\\xf9\\x5a\\x0b\\x4e\\x32\\xa7\\xbe\\xdf\\x31\\x9e\\x53\\xa9\\xe7\\x12\\x6c\\x28\\x11\\xf9\\x82\\x9d\\x1f\\x4a\\xe9\\xab\\xd9\\xd5\\xf4\\x2e\\xfe\\xf2\\x07\\x5f\\x47\\x05\\x1c\\x63\\xa4\\xf8\\x20\\x20\\x40\\xec\\x47\\x23\\x68\\x63\\x82\\xc6\\x03\\x31\\x27\\xc1\\xfb\\xff\\xf4\\xbc\\x82\\x37\\x35\\x08\\x75\\x2d\\x43\\x1d\\xc4\\x73\\xf5\\x2d\\xde\\xab\\x03\\x42\\xdc\\x4f\\x54\\x47\\xf8\\xf2\\x57\\x38\\xef\\x65\\xd7\\x85\\x56\"},\n{{0x66,0xf5,0xea,0x8c,0xdb,0x95,0xee,0x1a,0x75,0xe3,0x24,0x67,0xd7,0xc8,0x3c,0x59,0x44,0x77,0x42,0xc8,0x5d,0xdd,0x49,0x9c,0x43,0xc0,0x86,0x73,0xe1,0x49,0x05,0x3a,},{0xa8,0xad,0x04,0xb9,0xc1,0x44,0xb9,0x7f,0xe8,0x67,0x37,0x4d,0x4f,0xe5,0x7d,0x7e,0xc0,0xc2,0x49,0x18,0x3e,0x43,0xbd,0xfb,0x5d,0x52,0x64,0x4e,0x7f,0xbe,0x1d,0xf3,},{0xec,0x5c,0x7e,0x83,0x92,0xfa,0x8b,0x61,0xbc,0x82,0x96,0x81,0x86,0x6e,0x45,0xac,0x8b,0xe4,0xb5,0xb7,0xb6,0xa8,0x22,0xc1,0xbc,0xd0,0xf2,0xcc,0x2c,0x8c,0x44,0xc3,0x3c,0xf8,0x3f,0xa4,0x2d,0x43,0xa2,0xf1,0x88,0x41,0x41,0xb4,0xa5,0x9a,0xaf,0xf4,0x7f,0x9b,0xe0,0x7e,0x63,0x2e,0x20,0x18,0x75,0x93,0x24,0xea,0xc9,0xd1,0x49,0x00,},\"\\xc0\\xd0\\x1d\\xce\\xb0\\xa2\\xd1\\x71\\x91\\x10\\x18\\x79\\xab\\xb0\\x93\\xfb\\x07\\x75\\x71\\xb5\\x21\\xbe\\x7b\\x93\\xa1\\x17\\xc6\\x96\\xc0\\x87\\x2f\\x70\\xea\\x11\\x39\\xab\\x62\\x83\\x29\\xee\\x56\\x55\\xfc\\x0a\\xa7\\x7e\\x81\\x11\\xd2\\xfc\\x88\\x47\\x48\\xc1\\xf2\\x67\\xb9\\xeb\\x09\\xdc\\x26\\xf5\\x7f\\xc4\\x02\\xd6\\x1b\\xa3\\x6f\\x63\\xf4\\xd5\\x89\\xaa\\xe6\\x3c\\x76\\xee\\xee\\x15\\xbf\\x0f\\x9e\\x2d\\xcd\\xe4\\xe4\\xe3\\xe7\\x8f\\xc6\\xc2\\x9e\\x3a\\x93\\xf3\\xff\\x0e\\x9a\\x6e\\x0b\\x35\\x66\\x45\\x95\\x38\\x90\\xde\\xbf\\x62\\xdb\\xea\\xf4\\x90\\x51\\x78\\xd4\\xf0\\xa5\\xa5\\x92\\xc1\\x92\\x94\\xee\\xba\\x7c\\x21\\xcf\\x8f\\x1b\\xb3\\xf4\\x51\\x21\\x87\\x37\\x6d\\xe7\\x2f\\x11\\x36\\xa4\\x8a\\xc2\\xdf\\xaf\\x32\\xd0\\xf3\\x7d\\xe0\\x64\\x59\\x25\\x92\\xb6\\xe1\\xbc\\x0c\\x51\\x2c\\xf4\\xd2\\xd8\\x5d\\x16\\x79\\x78\\x53\\xa8\\x09\\x33\\xb0\\x9c\\x2f\\x7b\\xfb\\x9e\\x54\\xa6\\x9e\\x51\\xa8\\xe4\\x23\\xa9\\x1c\\x3e\\x5f\\xde\\xb4\\x79\\x05\\x33\\xe8\\x7a\\x4b\\x1c\\x0e\\x0e\\x23\\xa9\\xdb\\x95\\x73\\xac\\x17\\xab\\x6e\\xc7\\x01\\x4d\\x8b\\x7c\\x44\\x86\\xe1\\x57\\x25\\xf8\\xd2\\x64\\xee\\xa3\\x05\\x0e\\x83\\x5a\\xe0\\xac\\x44\\x9d\\xb3\\x34\\x50\\x2a\\x6d\\x97\\x35\\x8f\\xa8\\x59\\x10\\x6a\\xd0\\xf6\\xf4\\x29\\x5f\\x23\\x44\\x92\\x0a\\xdf\\x93\\x55\\xa6\\x94\\x9d\\x8d\\x14\\x5c\\x25\\x62\\x8a\\x46\\xa1\\x04\\xca\\x09\\x9b\\xd9\\xdd\\xe9\\x41\\x11\\x9c\\x83\\x82\\x0c\\xdc\\x2c\\xb2\\xd0\\x97\\x22\\x69\\x49\\x01\\x04\\x3c\\x37\\xcf\\x0a\\xe8\\x79\\xbe\\x20\\x30\\xd0\\x37\\x31\\x58\\xb9\\xc4\\xb0\\x71\\x82\\x98\\xbe\\x45\\xf6\\x30\\xf6\\xfc\\xdc\\x19\\x0f\\x7b\\x29\\x26\\xd8\\x76\\x55\\xa1\\x8b\\xb7\\x97\\xac\\x50\\x75\\x7f\\xcd\\x36\\x55\\xc9\\xe4\\x1d\\x51\\x63\\x29\\x3d\\x9a\\x13\\xd9\\x84\\xf5\\x91\\xf7\\x5b\\x7e\\x4e\\x5c\\xad\\xb6\\x4c\\x4c\\x9f\\xdf\\xef\\x76\\xca\\xb6\\x93\\x81\\xd0\\xf6\\x0b\\x48\\x3f\\x80\\x4b\\xb3\\xb3\\x33\\x64\\xdf\\x8c\\xff\\xac\\xb3\\xc9\\xb1\\x3f\\xf4\\xc8\\xd8\\xd4\\xea\\x40\\x76\\x6a\\x7d\\x42\\xd8\\x25\\x6c\\x6b\\x1c\\x11\\xc1\\x91\\xda\\xba\\x1b\\x8e\\xf2\\x15\\x93\\xe4\\x7b\\x18\\x85\\x8e\\xc1\\x9d\\x81\\x73\\x58\\x67\\x8d\\x85\\x48\\xff\\x15\\x35\\xd5\\xfc\\xf4\\x41\\x4b\\x6a\\x11\\xd3\\x4a\\x37\\x42\\xf8\\xd7\\x14\\x9f\\xa6\\x81\\x38\\x3a\\x94\\x08\\x88\\x7f\\x1c\\x0a\\x98\\xed\\x52\\x1e\\x72\\x79\\x32\\x77\\x82\\x4d\\x6f\\x74\\x6d\\x49\\xb6\\x3d\\x44\\x4e\\x31\\x2e\\x6d\\x9b\\x98\\x66\\x11\\x25\\x81\\x96\\xa5\\xb0\\x12\\xb8\\x8f\\xaa\\x29\\xf9\\xa6\\xc6\\x7e\\xd2\\x5d\\xf8\\x7b\\x2d\\xbf\\x0d\\xbd\\x2d\\xc3\\x08\\x0c\\x5b\\x8d\\x15\\xa3\\x7d\\x34\\x72\\x90\\x98\\xed\\x0d\\xe9\\x2d\\x75\\x80\\x74\\x29\\xb2\\xca\\xe5\\xd7\\x28\\x3c\\x4e\\x5c\\x9b\\xd1\\x96\\xd1\\xad\\x43\\x6c\\x7c\\x34\\xf3\\xc9\\x46\\x6e\\x5c\\xb3\\x19\\x6b\\x44\\x3f\\x4b\"},\n{{0xed,0x25,0x58,0xe5,0xc5,0x67,0x84,0xbc,0xfb,0x4f,0x4d,0xde,0xa3,0xc0,0xdf,0xbe,0xf8,0xd9,0x6f,0xf1,0xca,0xbf,0x15,0x8e,0xc4,0xab,0xe6,0x0a,0xff,0x66,0x99,0x9e,},{0x1e,0xdc,0x99,0x10,0x12,0xac,0x6f,0x88,0x8f,0xa7,0xe6,0x04,0x57,0x77,0xe9,0xba,0x1d,0x4c,0x03,0xc4,0x02,0x92,0xd2,0xda,0x6b,0x72,0x2b,0x4a,0xd0,0xa3,0xed,0x74,},{0xab,0x9e,0x01,0x16,0x65,0x24,0xfd,0x28,0x8e,0x5c,0x68,0x9e,0x56,0xd7,0x30,0xd4,0x98,0x30,0x00,0x55,0x10,0x30,0x49,0x33,0x34,0xa3,0x98,0x4e,0x22,0x23,0xdc,0x9f,0x7a,0x5b,0x91,0x0c,0x61,0x76,0x0c,0x61,0x57,0x99,0x0a,0x4c,0x33,0x5e,0x34,0x8e,0x3a,0x7b,0xc8,0x22,0x3e,0x09,0xc1,0x0c,0x5e,0x52,0x0c,0x8d,0x61,0xaf,0xf5,0x00,},\"\\x2c\\x64\\x33\\xe9\\xbf\\xbf\\x4c\\xfd\\x4e\\x07\\x1f\\x15\\xce\\x6b\\x12\\x9d\\x78\\x0a\\x4b\\x3d\\xe0\\x14\\xfa\\xc0\\x34\\xe0\\xd4\\x4e\\xf7\\x72\\xe2\\xc8\\xb0\\xd6\\xa3\\x48\\x1d\\x7b\\x3d\\xde\\xb2\\x37\\x63\\x26\\x73\\x55\\x33\\x13\\xde\\xac\\x1e\\xfa\\xfe\\x37\\x02\\xa7\\xa4\\x41\\x1e\\x12\\xbd\\x34\\x1e\\x8d\\x8e\\x96\\xc5\\x9c\\x5e\\x30\\xc3\\x68\\x07\\xa8\\x38\\x5a\\x53\\x8e\\x9b\\x66\\x90\\x7d\\x6a\\x52\\x84\\x00\\xbd\\x9f\\x95\\xee\\xdc\\x52\\x16\\xb2\\x8f\\xd7\\x43\\x7d\\x8f\\x4a\\x02\\x9f\\xdb\\xdc\\x7c\\x93\\x8e\\x4e\\xb9\\x81\\x2f\\xec\\x05\\xea\\x69\\x32\\x29\\x62\\x9a\\xce\\x6a\\xcc\\x7a\\xf6\\xba\\x4c\\x23\\x8e\\x77\\x22\\xf3\\x12\\xf7\\x89\\x6b\\x00\\x49\\x22\\xf7\\x06\\x7e\\xde\\x10\\x6f\\x8e\\x70\\x15\\x4d\\x78\\x3f\\xb4\\x12\\x91\\xf3\\xc7\\xe2\\xe4\\x82\\x60\\x45\\xb5\\x74\\x1b\\xcb\\x4a\\x88\\x38\\xf8\\x7a\\x32\\xe0\\x04\\x97\\x04\\xe9\\xb5\\x32\\x34\\xc2\\x24\\xff\\x89\\x8a\\x75\\x6e\\x52\\x91\\x34\\xc1\\xa9\\xbf\\x50\\xfd\\x02\\x98\\x19\\xb2\\x23\\x8b\\x60\\xb2\\xae\\xc1\\x12\\x8f\\x34\\xd2\\x1f\\x9d\\x66\\x98\\x3b\\xed\\x39\\x86\\x59\\xd8\\x08\\xb6\\x7a\\x2e\\x50\\x1b\\x5a\\x1f\\x25\\xf7\\x1f\\x0f\\x0c\\x1e\\xb2\\xfe\\xa0\\xab\\x42\\xd8\\x2f\\xf3\\xbc\\x93\\x58\\xbb\\x20\\xc2\\x75\\x20\\xc1\\x44\\xcf\\x21\\x16\\xf4\\xa4\\x9c\\xbc\\x61\\x99\\x4d\\x2d\\x71\\x05\\x46\\x69\\x4c\\x4f\\x60\\x2d\\xc4\\x06\\xe0\\xb0\\xc2\\x7e\\x5f\\x5e\\x64\\x66\\x7e\\x95\\xc2\\xec\\x9d\\xf2\\xd6\\x52\\x9c\\xf5\\x36\\x22\\xea\\x10\\xb9\\x56\\xb3\\x45\\xec\\x55\\xb6\\xc3\\x9a\\x1e\\x6e\\xd8\\x8a\\xe6\\x6e\\x5b\\x45\\x71\\x79\\x42\\x5d\\x1a\\x84\\x90\\x37\\xb0\\x7c\\x46\\xcf\\x5f\\x36\\x33\\x01\\x09\\x58\\x37\\xce\\x81\\x1b\\xff\\x49\\x60\\xbf\\x9c\\xbd\\x15\\x20\\x1c\\x1b\\x67\\x40\\xbd\\x70\\x10\\x21\\x40\\x74\\x4c\\x33\\x27\\xac\\xa9\\xd6\\xd6\\xd1\\x54\\x93\\x67\\x98\\xac\\x38\\x1f\\xa6\\x39\\xdb\\x43\\x6e\\xe8\\x16\\x56\\x67\\xd5\\x38\\xa6\\xc7\\x4a\\x23\\x3c\\x12\\x4b\\xf6\\x04\\xfd\\xad\\x51\\x98\\x4c\\x41\\x70\\xb8\\x20\\x0d\\x2d\\xf7\\x3c\\x29\\xbb\\x1e\\x37\\x6a\\xff\\xc3\\x14\\xdd\\xe3\\xe8\\x6a\\xf9\\xd2\\xc2\\xe6\\xc3\\xa6\\x52\\x4d\\x32\\x1b\\xce\\x93\\xe2\\x1f\\xc9\\x65\\x56\\x4f\\xaf\\x77\\xd0\\xcd\\x1a\\xcc\\xb4\\xd7\\x62\\x94\\x85\\xf5\\x64\\xc7\\x9f\\x4d\\x8a\\x2f\\xde\\xfb\\x46\\x54\\x54\\x02\\x8c\\x6d\\xd1\\x42\\x80\\x42\\x80\\x53\\x70\\x74\\x33\\x63\\xbb\\x18\\x47\\x6a\\x3f\\x23\\x20\\xdb\\x25\\x89\\xc7\\x21\\x33\\xcf\\x5e\\x29\\xda\\xfb\\x7d\\x07\\xaa\\x69\\xa9\\xb5\\x81\\xba\\xb5\\xa8\\x3f\\x40\\x3e\\xef\\x91\\x7a\\xfa\\x14\\xb7\\x64\\xc3\\x9a\\x13\\xc0\\xc5\\xea\\x70\\x19\\xd2\\xfd\\xfb\\xd7\\xf3\\xf7\\xd4\\x0e\\xb6\\x3b\\x2a\\x08\\x4d\\xa9\\x21\\x89\\x5f\\xe4\\x8f\\x4f\\xd5\\x94\\x01\\x7f\\x82\\x56\\x9b\\x46\\x7a\\xb9\\x01\\x16\\x9e\\xb5\\xda\\x9c\\x40\\x17\\x1d\\x5f\"},\n{{0xb7,0x27,0x98,0xb8,0x11,0xe2,0x33,0x84,0x31,0x25,0x6d,0x24,0x80,0xfe,0x7a,0x36,0x63,0xac,0xec,0xbb,0xe6,0xe6,0xc1,0xb9,0x19,0x1e,0x9d,0x9a,0x22,0x44,0x79,0x40,},{0xce,0x49,0x1d,0xaa,0xd2,0x96,0xb5,0x57,0x27,0xb0,0x95,0x13,0xdf,0x02,0xba,0x59,0x28,0xa3,0x71,0x73,0x7c,0xd3,0x58,0x41,0xe5,0xf7,0x35,0xac,0xab,0x7c,0x5d,0xf8,},{0xdc,0xfc,0x6f,0xd4,0x77,0x99,0xfe,0xc7,0x72,0xc2,0x09,0x9b,0x3c,0x64,0x37,0x24,0x6c,0x3a,0xd0,0x72,0x29,0xfc,0x74,0x0e,0x05,0x31,0x1a,0x20,0x6b,0x18,0xb0,0x2e,0xcd,0xb0,0x26,0xc9,0x26,0xf4,0x9c,0x65,0x52,0xe3,0x47,0xfd,0x35,0xdf,0xde,0x06,0xcb,0x63,0x9a,0x79,0x7c,0x50,0x61,0x2f,0x98,0xe2,0x47,0x8a,0x92,0xaa,0xf6,0x09,},\"\\xa5\\xd4\\x62\\x98\\xb0\\x79\\x06\\x10\\xae\\xdc\\x09\\x70\\xfe\\xa2\\xa7\\x07\\x50\\x81\\x84\\x72\\x66\\xf2\\x2f\\x12\\x47\\x8b\\x93\\xd7\\xe6\\x74\\xc6\\xc5\\x17\\xf3\\xc1\\x4e\\xd0\\x61\\x26\\x9d\\x17\\x0a\\xc3\\x1e\\x2a\\x64\\xf9\\x75\\x4a\\x56\\x5b\\xac\\x1d\\xd9\\x75\\x73\\x22\\xc1\\x11\\x32\\xe7\\xbb\\xee\\x5f\\x32\\x81\\x8e\\x0e\\x30\\x63\\xab\\x64\\xe5\\x52\\xd0\\x9b\\x0f\\xd1\\x75\\x76\\x39\\xb9\\xb9\\xd1\\xc7\\x70\\x01\\x6b\\x67\\x74\\x65\\x87\\x2b\\x66\\x9d\\xd4\\x8b\\xe0\\x38\\x66\\x57\\x51\\x67\\x4d\\xd2\\xf4\\x0a\\x96\\x6a\\x26\\x74\\x8f\\xd3\\xe5\\xdb\\xfd\\x92\\x26\\x5e\\xb9\\x36\\xf5\\x5b\\x09\\x42\\x86\\xc0\\x10\\x62\\x99\\x04\\x34\\x7c\\xb4\\xc5\\x26\\xe3\\x77\\x47\\x0a\\xa9\\x6e\\x81\\x69\\xa6\\xf2\\x11\\x63\\x38\\x07\\xa5\\x00\\x30\\xe7\\xff\\x68\\xe3\\x89\\x11\\xb3\\x55\\x5e\\x72\\x8e\\xd8\\x59\\x0b\\x2d\\xc4\\x5f\\xea\\x69\\x94\\x5c\\xc0\\xc9\\xa3\\xd3\\xe6\\xc9\\x54\\xb3\\xe8\\x01\\x06\\xa5\\xc9\\x1d\\x3d\\x22\\xe8\\x9e\\x8c\\x0e\\x1d\\xe9\\x02\\x05\\x8e\\x9c\\xd0\\xf8\\xce\\x80\\x6e\\xac\\x4f\\x89\\x3e\\xe0\\x42\\x99\\x00\\xfb\\x54\\x87\\xb8\\xfd\\x36\\xdb\\xdc\\xb3\\x4f\\x2d\\x54\\xfc\\x6c\\xc7\\x4a\\x92\\x39\\x51\\xb8\\x63\\xda\\x70\\xf1\\xb6\\x92\\xbf\\x04\\x38\\x48\\x43\\x66\\xcd\\x85\\xee\\xb8\\x80\\xb2\\x79\\xf8\\xfc\\xa9\\xd3\\x24\\x2c\\x55\\x83\\x30\\xf1\\xca\\x57\\xc6\\xa5\\x86\\x08\\xcd\\xbc\\x07\\x73\\xe1\\x60\\x82\\xbc\\xa9\\x64\\xdd\\xc4\\x03\\x47\\xda\\x8a\\x36\\xb2\\xa9\\x32\\x8c\\x2f\\x46\\x60\\x9e\\x09\\x2f\\xd6\\x4b\\x41\\x34\\xee\\xe1\\xd0\\x99\\x81\\x3e\\x12\\x46\\x48\\x9e\\x8e\\xe5\\xb1\\x9b\\x3d\\x3b\\x89\\x1c\\x28\\xf3\\x0b\\x38\\xb6\\xa2\\x8e\\xc1\\xd3\\xe9\\xb0\\x05\\xde\\xc9\\xc6\\x3f\\x8b\\x98\\x13\\xbc\\x1d\\xe4\\xaa\\xf9\\x95\\xf1\\x77\\x9d\\xde\\xd1\\x5c\\x7a\\x43\\x0d\\x70\\xca\\x46\\xe7\\xca\\xfd\\x4e\\x9a\\x54\\x38\\x04\\x44\\x6a\\xb0\\x80\\x7d\\x64\\xf2\\x55\\xe2\\x01\\xef\\x42\\x8a\\x47\\x4d\\xae\\x8a\\x0a\\x75\\x02\\x1b\\x62\\xad\\x39\\x88\\xff\\xb8\\x1c\\xd8\\x22\\x1b\\x24\\x30\\x85\\xa0\\xad\\x04\\x6f\\xdc\\x16\\xc6\\x7f\\x17\\xb9\\xf8\\x18\\x20\\x09\\x59\\x53\\xa5\\xb9\\x8a\\xcb\\xdf\\x93\\xeb\\xcf\\x80\\xbc\\x9c\\x99\\xaf\\x5f\\xbf\\xfa\\xcb\\x61\\xa9\\x25\\x1c\\x5a\\xaf\\xdb\\x22\\xb1\\x12\\x9b\\xfc\\x60\\xc9\\x8e\\x0f\\x17\\x52\\x63\\xbd\\xf9\\x3d\\xc9\\xa0\\x8b\\x8e\\xfc\\x2e\\x8c\\xda\\xf0\\xf8\\x3d\\x6c\\x49\\xec\\x90\\x16\\x45\\xea\\xc5\\xa4\\xff\\x63\\x38\\x5a\\x6f\\x1a\\xf2\\x07\\x18\\x97\\x66\\x2a\\x37\\x22\\x19\\xc9\\x30\\x1f\\x54\\x5a\\x2e\\xbb\\x8f\\x59\\x17\\xdb\\x7f\\x29\\xca\\x13\\xfc\\x86\\x1a\\xf3\\x8d\\x90\\xc3\\x5c\\x03\\xac\\x91\\x84\\xc1\\x22\\xe5\\x7b\\x05\\x7c\\xde\\x42\\x6f\\xd7\\x6d\\xca\\x79\\xe2\\x5e\\x64\\xdb\\xb4\\x1c\\x84\\x14\\xa0\\x45\\x0d\\xa4\\x90\\x5b\\x90\\x2a\\xe9\\x8d\\x2d\\xa4\\xba\\x79\\x28\\x01\"},\n{{0x1f,0xe7,0x32,0x7e,0xa9,0x07,0xd3,0xff,0x17,0x9b,0x11,0x78,0x11,0xd3,0x01,0x93,0xfc,0xba,0x4c,0x34,0x7b,0x90,0x65,0x7f,0xee,0xd9,0x8d,0xee,0xec,0xda,0x9a,0xc9,},{0xee,0xf3,0x01,0xb1,0x6f,0xd7,0xbf,0x3c,0x7b,0x64,0x0b,0xf5,0xee,0x87,0x00,0xac,0x5a,0x87,0x16,0x9e,0xab,0x5f,0x56,0x01,0x5b,0x3f,0x49,0x9d,0x95,0x5e,0x07,0xeb,},{0x9c,0x7f,0xdb,0x53,0xfd,0x60,0x6b,0xc7,0xc9,0xc2,0x23,0xfe,0x94,0x31,0xe1,0xad,0x00,0x95,0x46,0xd0,0x00,0x98,0x81,0x2a,0x49,0x51,0x97,0xf2,0x54,0x1e,0x87,0xf8,0xd6,0xf5,0xda,0x22,0xec,0xef,0xcb,0xb7,0xda,0x56,0x66,0x2a,0x73,0x09,0xd1,0x0a,0x6c,0x4a,0x4f,0x7f,0x29,0x92,0x78,0xd5,0x1b,0xbd,0x11,0xe0,0xcc,0x1b,0x87,0x09,},\"\\x19\\xa8\\x32\\xf2\\x6f\\xbb\\x02\\x39\\xf0\\xd9\\xd2\\x6a\\x2e\\xbd\\xed\\x24\\x03\\xc2\\xa4\\x06\\xdd\\x1f\\x68\\x31\\x8d\\x67\\x7a\\xfa\\x64\\xf3\\x50\\x43\\x31\\x6a\\x5e\\xfd\\x72\\x97\\x83\\xc7\\xf9\\xd1\\x8c\\x09\\x82\\x46\\x14\\x65\\x20\\x91\\x88\\x6c\\xc9\\x54\\xbe\\x9f\\x93\\x12\\xd4\\x58\\x6b\\xf3\\x6f\\x30\\x35\\xac\\x70\\x34\\x38\\xb0\\xcf\\xe3\\xde\\xc5\\x07\\x78\\x13\\xc7\\x10\\xd1\\x44\\x75\\x61\\xab\\x61\\x57\\xbc\\x7a\\xd5\\xea\\xb5\\xb0\\xc0\\xaf\\xdc\\xc9\\xdb\\x77\\xe6\\x6f\\xa8\\x07\\x13\\x66\\x82\\x9c\\x50\\x10\\x96\\xc3\\xd3\\xa9\\x38\\x21\\x8a\\x6e\\x42\\x07\\x10\\x9d\\x1e\\xb8\\x1f\\x7d\\x88\\xbd\\x6f\\xbb\\x2a\\xef\\xb1\\xad\\xef\\x35\\x94\\xaa\\xe5\\x7c\\x46\\xb7\\xb9\\x84\\xdb\\x94\\x68\\xcd\\x96\\x2c\\x61\\x84\\xfb\\x97\\x6f\\x0e\\x2a\\xa8\\x41\\x52\\xde\\xb1\\xc7\\x6a\\xea\\x75\\xae\\x48\\x84\\x42\\x94\\x3a\\x80\\xba\\x7d\\x98\\xa2\\x8c\\xb8\\x64\\xb5\\xe8\\x7c\\xdb\\x28\\x4a\\xd6\\xe8\\xd7\\xaa\\xdc\\x6b\\x75\\xd6\\x9d\\x3b\\xd3\\x45\\x78\\x3b\\x3e\\xbb\\x67\\x6f\\xf9\\x5d\\x7b\\x41\\x91\\xe5\\x99\\x85\\x1c\\x96\\x28\\x83\\x5c\\x7c\\x01\\x19\\x7e\\x7c\\x8f\\x86\\xf9\\xc8\\xfb\\x49\\xfe\\x3e\\x28\\x45\\x8b\\xa9\\xb0\\x23\\x62\\x19\\xbd\\x46\\xc2\\x8d\\xf6\\x53\\x24\\x96\\x99\\x4a\\xc9\\xba\\x73\\x3c\\x01\\x05\\xa0\\x2a\\x26\\x9a\\x2b\\xe8\\xb7\\xcb\\x40\\x07\\x4b\\x88\\x16\\x02\\xef\\x92\\x47\\x05\\x2d\\xe9\\xd6\\x37\\x08\\x91\\x88\\xbd\\x4c\\x18\\x5c\\xca\\xe2\\x58\\xa2\\xae\\x98\\x56\\xa2\\xcb\\xf8\\x45\\x11\\x17\\x68\\x3c\\xe3\\x41\\xf8\\x09\\x6e\\x1d\\x91\\xe8\\x74\\xc5\\xcb\\x8a\\x4e\\x09\\x39\\xeb\\x77\\x37\\x3a\\x9a\\x0e\\xb7\\x91\\x64\\x5b\\x8f\\x54\\x60\\x47\\x2d\\x66\\x9d\\x80\\x14\\x68\\x1a\\x5e\\x77\\x87\\x06\\xcb\\x55\\x66\\xbb\\xd4\\x72\\x7d\\x17\\x16\\xb2\\x3c\\x62\\x0d\\x22\\x8b\\x5d\\x4d\\xc2\\xb3\\x52\\xb4\\x23\\x93\\x1f\\x8a\\x7e\\x8f\\xb5\\x9e\\xda\\xd8\\xae\\x42\\x45\\x87\\x29\\x86\\x1a\\x98\\xe0\\xc8\\x50\\xa7\\x7e\\xd6\\x55\\xe7\\xfc\\xfe\\x4f\\xe3\\x6f\\x97\\x72\\xdf\\x1a\\xc3\\xc6\\x43\\xad\\x31\\xdb\\x56\\x30\\xd5\\x71\\xdf\\x9f\\xcc\\x9c\\x50\\xde\\x76\\x22\\x10\\x84\\x11\\x96\\x2b\\xbf\\x72\\xde\\xfb\\xf4\\x9e\\x99\\x70\\x59\\xc7\\x31\\x1b\\xd9\\xdd\\xd5\\xb3\\x38\\xa9\\x85\\x19\\x38\\xd3\\x7e\\x7a\\x26\\x21\\x08\\xa2\\x91\\xe2\\x01\\x68\\x03\\xbb\\xef\\xf4\\xf9\\xc7\\x76\\x12\\x5c\\xeb\\x7e\\x72\\x72\\xb5\\x1c\\x7c\\x33\\x46\\x1d\\x80\\x89\\xf8\\x40\\x8d\\x8d\\xda\\x92\\x50\\x6d\\x50\\x02\\x08\\x4d\\x4f\\x41\\x4d\\x8a\\x4d\\x28\\xd3\\x69\\x4c\\x88\\x63\\x0e\\x31\\x80\\x19\\x90\\xd9\\x52\\x71\\xce\\xf4\\x7a\\xa5\\xc2\\x63\\xf9\\x7b\\x7d\\xac\\xa1\\x78\\x87\\x01\\x43\\x63\\x29\\xb5\\xbf\\xaf\\x72\\x65\\x3c\\x16\\x6d\\xb0\\x87\\x70\\x81\\x30\\xc5\\xc0\\xd7\\x8c\\xc4\\xe9\\x06\\x4f\\x86\\x06\\x80\\x27\\x1a\\xfe\\x4c\\x40\\x98\\x53\\xc2\\xfa\\xd6\\x75\"},\n{{0x5f,0x9d,0xcd,0x93,0xfb,0x14,0x06,0x10,0xb0,0xe2,0x11,0xb3,0x9a,0xdd,0xb1,0xeb,0x87,0xba,0x97,0x80,0x48,0x77,0xaf,0xbc,0xc3,0x81,0x38,0x8c,0xad,0x65,0x08,0x45,},{0x18,0x2a,0x23,0x7d,0x87,0x8c,0x58,0x19,0x33,0x33,0x2b,0x41,0x78,0xb6,0x7e,0xc4,0x08,0xb3,0x19,0x4d,0x44,0xe4,0xe6,0x93,0x92,0xef,0x80,0x0b,0x26,0x7c,0x29,0x49,},{0xc1,0x91,0x5e,0x05,0x2b,0x66,0x47,0x97,0xe0,0xd5,0xfa,0xad,0xc7,0x8f,0x2a,0x00,0x9d,0x6f,0xbc,0xfd,0xe0,0x3f,0x3a,0xaa,0xd5,0x9b,0x9f,0x45,0x88,0xe7,0xfc,0x3b,0x21,0x99,0x0c,0x52,0x08,0xd3,0xd7,0x6b,0x4a,0xa9,0x5b,0xd9,0x34,0xe8,0x8d,0x3c,0x98,0xc5,0x91,0x93,0x0a,0x59,0xde,0x2a,0x05,0x67,0x01,0xd9,0xf7,0x57,0x74,0x00,},\"\\xc3\\x8b\\x87\\x4d\\x3f\\xf0\\x10\\xff\\xf1\\xa6\\x61\\x3b\\xfa\\x13\\x42\\x57\\xb2\\x48\\x33\\xcb\\x53\\x6d\\xe3\\xe7\\x49\\x92\\xc3\\xcb\\x01\\xfe\\x3b\\xbd\\xee\\xd9\\x7d\\xc3\\xc4\\x59\\x6f\\xa4\\x40\\x61\\x44\\x2b\\xd3\\x1a\\x9d\\x4a\\xa8\\xc8\\x1e\\x34\\xad\\x98\\x88\\x71\\x82\\x06\\x63\\x55\\x09\\xb1\\x33\\xb1\\xba\\x69\\xcb\\x1a\\xa0\\xe7\\x5c\\x7a\\x18\\x93\\xc0\\x80\\x16\\x1d\\x26\\x15\\x2a\\xce\\xf4\\x0f\\x6e\\xf4\\x21\\x0e\\x95\\x2a\\x49\\x82\\x8b\\x5c\\xdd\\xe8\\x04\\xbc\\xb5\\x36\\xcd\\xc3\\x49\\xa8\\xe8\\x31\\xb4\\xb6\\x9d\\x37\\x85\\xa7\\x6b\\xd9\\xfb\\x27\\x08\\x05\\x65\\x97\\x2d\\x0b\\x8f\\xbd\\x16\\xf3\\xf9\\x60\\xa6\\xbf\\x3b\\xa0\\xc5\\xb9\\xc4\\x04\\x96\\x7e\\xc1\\xaf\\xfe\\x59\\xb8\\xc4\\xec\\xc6\\x50\\xfd\\xde\\x1c\\xb0\\x6b\\x70\\x59\\x5a\\xd4\\xd3\\x25\\xda\\x0f\\xab\\x4c\\x55\\x40\\xa7\\xa8\\xd5\\xeb\\xea\\xcc\\x4e\\x99\\xbd\\x0d\\xc9\\x6b\\xde\\x82\\xf2\\xbd\\x7d\\x95\\x86\\x30\\x84\\x65\\xe5\\x5b\\x1c\\xc3\\x88\\xd7\\x50\\x48\\x6b\\xdd\\x5c\\x72\\x64\\xd5\\x4f\\x56\\x14\\xd4\\x87\\x26\\xd9\\x9e\\x44\\xd7\\x77\\x8d\\x9e\\xd0\\x32\\x39\\x58\\xab\\x98\\x58\\xe2\\xb2\\x5d\\xf2\\xbf\\x99\\x4b\\xa3\\xe6\\x25\\xe2\\x80\\x3b\\x6c\\x69\\x31\\xe7\\xa9\\x92\\x6f\\x1e\\x61\\xed\\x86\\x24\\x03\\xce\\x39\\x2a\\xb8\\x3b\\x7d\\x1b\\x66\\x08\\x5d\\xcc\\x06\\xd8\\x2d\\xbf\\x17\\x6d\\x01\\x6d\\x9f\\x44\\xcd\\xcb\\x50\\x72\\xd0\\x04\\x59\\x1e\\x92\\xd0\\x45\\x9e\\xf0\\x5a\\x51\\xb8\\xf5\\x4b\\xa1\\x72\\x51\\xe1\\x66\\x21\\xeb\\xb7\\x53\\xe5\\xb1\\x59\\x0c\\x02\\xd2\\x1e\\x40\\xf4\\xb7\\x5e\\xee\\x46\\x02\\x86\\x0b\\x97\\x41\\xfb\\xbc\\x0d\\x2e\\x38\\x5b\\x8d\\xac\\xa8\\x3c\\xce\\x68\\xc3\\x4a\\x99\\xbd\\xe6\\xa6\\x0d\\x13\\xba\\x64\\x34\\x7d\\x0a\\x38\\xd6\\x4b\\x2a\\xde\\x25\\x0f\\x38\\x85\\x2c\\x4e\\xda\\x2e\\x2e\\x4f\\x30\\x3c\\x3d\\xe1\\xa8\\xa9\\xd4\\xab\\x33\\x00\\xc9\\xe6\\x36\\x22\\x87\\x9f\\xc8\\x53\\x7f\\xfc\\x63\\xb1\\x85\\x61\\xfa\\x1f\\xff\\x65\\x53\\x12\\x41\\x51\\x5a\\x62\\xbb\\x9b\\x08\\xb8\\x0a\\xf3\\x76\\x67\\xa6\\x01\\xae\\x04\\x17\\x17\\x93\\xcc\\x83\\xb1\\x1a\\xdf\\x9c\\x30\\xca\\x9f\\x4d\\xab\\xc7\\xb4\\x01\\xe1\\x6a\\x18\\x14\\xcf\\xc7\\x50\\x24\\x8c\\xc2\\xf7\\x7e\\x03\\xf9\\xc4\\x33\\x44\\x65\\xff\\x6a\\x2c\\x83\\xcb\\xb5\\x6d\\xb4\\xb7\\x34\\x75\\x10\\x43\\x83\\x2c\\x40\\x00\\x97\\x2e\\xe3\\x23\\x2f\\x92\\x9f\\x23\\x33\\x7e\\xba\\x5e\\x65\\x1e\\x34\\xcb\\xdd\\xfe\\x68\\xba\\x21\\x9b\\x63\\x2e\\x7a\\xcd\\xbd\\x46\\x30\\xa0\\x31\\xbf\\x16\\x89\\xfb\\xbc\\x7f\\xbb\\xb2\\x10\\xdb\\xf2\\x5e\\xe8\\x7e\\x2e\\xf2\\xb3\\xcb\\xaf\\x8d\\x9e\\xbd\\x8f\\xc9\\x2c\\x3a\\x58\\xd3\\xc0\\x5b\\x13\\x85\\xa7\\x6c\\x87\\x79\\x1d\\x7c\\xd3\\x74\\x1b\\x71\\xb6\\xc3\\x29\\xde\\x9a\\x9d\\x75\\x08\\xa0\\xc1\\x56\\xa9\\x52\\x1a\\x90\\x20\\x56\\x30\\x99\\xa8\\x2b\\x87\\x70\\xae\\x9a\\x94\\x4a\\x7e\\x94\"},\n{{0x92,0x5e,0xbe,0x04,0xc6,0xea,0xc4,0x9b,0x26,0x73,0x8d,0x6c,0x13,0x00,0xf3,0x1f,0xd4,0x82,0x84,0x78,0xcb,0xe9,0x7d,0xab,0x18,0xbb,0x88,0x96,0x42,0xe1,0xe1,0x10,},{0xcd,0x72,0x31,0xb6,0xeb,0x74,0xe1,0xfe,0x9f,0x92,0x6f,0x00,0xd8,0xde,0x2c,0x51,0x3d,0x49,0x64,0x05,0x25,0xb0,0x79,0x5c,0xab,0x89,0x3d,0x0c,0x89,0x29,0xe3,0xe0,},{0x2c,0x4d,0x69,0xbe,0xd5,0xad,0x8b,0x95,0x84,0xd8,0x49,0xcf,0x3d,0xf2,0xba,0xc7,0x22,0x82,0xb5,0xf3,0x0d,0xe2,0x66,0xb1,0x4f,0x53,0x3c,0xa9,0x6e,0x95,0x50,0xc4,0xb8,0x54,0xc1,0x54,0xbd,0xc1,0x7a,0xa8,0x80,0xcf,0x00,0x1a,0x64,0x54,0xff,0xaf,0xaa,0x2e,0x50,0x17,0x8d,0xe2,0x12,0x16,0xed,0x12,0x6b,0x63,0xf7,0x7f,0x2d,0x02,},\"\\xe6\\xc0\\xba\\xd2\\x3a\\x92\\xae\\x8b\\x1d\\x85\\x77\\x82\\x88\\x15\\x7a\\xc6\\xc6\\x17\\xc6\\x33\\x63\\x34\\x1d\\x77\\x78\\x70\\x34\\x1b\\xb1\\x0a\\x8d\\x3d\\xfc\\x89\\xbe\\x4f\\x55\\xad\\x4f\\x64\\xe8\\x3b\\xf2\\x49\\x9b\\x69\\xfd\\xf7\\x21\\x74\\xd2\\x84\\x4e\\x6b\\xd2\\x89\\xda\\xaa\\x03\\x5f\\xec\\x5b\\xf7\\xcf\\x45\\x52\\x21\\x19\\xdc\\x7a\\x8c\\x81\\x1d\\x79\\x57\\x8c\\x5b\\xb0\\xf6\\xd3\\x4d\\xb5\\x07\\xad\\x1f\\xb6\\xdb\\xff\\xf9\\x97\\xb7\\x9d\\xac\\xfb\\x3d\\xa5\\x0a\\x41\\x5e\\x35\\x0c\\x99\\x8c\\x0a\\x02\\x80\\x0a\\xa5\\x0f\\xfd\\xfe\\x5f\\x42\\x76\\xd8\\xe6\\xbb\\x82\\xeb\\xf0\\x47\\xfe\\x48\\x71\\x1d\\xaf\\x7a\\x89\\x3b\\xdc\\x75\\x37\\xbd\\xae\\xdf\\x3d\\xcb\\x4d\\xec\\x5d\\x24\\x58\\x68\\x11\\xf5\\x9b\\x25\\xb1\\x9e\\x83\\xca\\x61\\xe5\\x59\\x2f\\xed\\xc0\\x8c\\xa5\\x44\\x73\\xce\\xa2\\xec\\x12\\x1b\\xaa\\x0e\\x77\\xfb\\x2d\\x9d\\x76\\x56\\x57\\xde\\x67\\x98\\x0e\\xd5\\x7f\\x2f\\x17\\x78\\x58\\xb6\\xde\\xcf\\x84\\xff\\x90\\x21\\x2d\\x96\\x47\\xf4\\x1e\\xed\\x9b\\x9d\\x0e\\xa3\\xd8\\xd6\\x21\\xe4\\xbb\\x40\\x41\\xac\\xc5\\x14\\x6e\\x96\\xdf\\xcf\\x14\\xea\\x96\\x2d\\x30\\xc8\\xcc\\xb3\\x9e\\xa2\\xbe\\x95\\x8c\\x9b\\x87\\x74\\x45\\x1b\\xfe\\xb7\\xdd\\xce\\x71\\x6e\\x94\\x92\\x3c\\xc8\\x5f\\xbd\\x3a\\x31\\x30\\x78\\x0e\\x2b\\x3b\\x2b\\xb7\\x6d\\xa5\\x34\\x19\\x12\\xa4\\xe9\\x94\\xca\\xfa\\x19\\xbb\\xa1\\x97\\x32\\xf2\\xea\\x40\\x2d\\x71\\xd3\\xd8\\xa9\\x69\\x67\\x9b\\x9d\\x10\\x42\\x43\\xd9\\x83\\x9c\\x69\\xee\\x9e\\x95\\x5e\\x1c\\x60\\x44\\x97\\x88\\xd1\\xf4\\xf6\\x65\\x1f\\x4b\\xc9\\xb9\\x4d\\x73\\x52\\x2e\\xc0\\xcf\\x72\\xca\\xcf\\xcf\\x19\\xf1\\xf0\\x3a\\xd6\\x23\\x21\\x04\\xb5\\x5c\\xbb\\x8b\\x5b\\xb1\\xe2\\x13\\x44\\x71\\x3d\\x48\\x27\\x42\\xd6\\xab\\xc5\\xa9\\x57\\x17\\x4f\\x62\\x3b\\x84\\x95\\x27\\x2c\\xc1\\xe2\\xb8\\x31\\x5e\\x5c\\x80\\xf9\\x47\\xf5\\x00\\xc8\\x3d\\x85\\x44\\xf7\\xcd\\x4f\\x65\\x34\\x89\\x49\\xef\\x44\\x20\\xd7\\xfc\\x83\\x1f\\xa4\\xae\\x2e\\xe1\\x8d\\xbb\\xa6\\x14\\x92\\x5c\\xe1\\xd7\\x67\\xc1\\x77\\xa6\\x26\\xc4\\x52\\x7a\\x81\\x54\\xb5\\x72\\x92\\x18\\x6b\\x04\\x4c\\xbf\\x92\\x89\\x42\\x53\\xb0\\x0f\\xd9\\x34\\x3f\\x9e\\x69\\x7b\\x14\\x12\\xeb\\xa4\\x35\\x97\\xeb\\x72\\xa6\\x69\\xaa\\xa2\\xd7\\x7e\\xac\\xb9\\x68\\xc2\\x0f\\xe1\\x95\\x05\\xa3\\x80\\x74\\x15\\x86\\x21\\xb6\\x06\\xf7\\x7d\\x97\\xbc\\x6e\\xbe\\x50\\xe7\\x58\\x92\\x93\\xdb\\x27\\xfc\\x7d\\xfe\\x63\\x1a\\x4b\\xee\\x83\\xb2\\x26\\x82\\xa7\\x73\\x28\\xc3\\x6d\\x9d\\x7d\\x1d\\x89\\x1d\\x65\\x21\\x7c\\xc4\\x78\\x64\\xf6\\x80\\xdc\\x8b\\x5f\\xd1\\xa0\\x1a\\x0f\\x7c\\x34\\x43\\x0f\\x77\\x06\\x0b\\x69\\x1a\\x1a\\xd2\\x13\\xd2\\x28\\x68\\xe6\\x1b\\xbd\\x38\\xf4\\x3f\\x0c\\x8b\\x4d\\xa6\\x8a\\x58\\x31\\x86\\x66\\xc0\\x99\\x76\\x61\\x70\\xc2\\xdb\\x76\\x6a\\xaf\\x41\\x7f\\x55\\x6c\\xc9\\xa0\\xa3\\x93\\x4e\\x9f\\xce\\xf1\"},\n{{0x4d,0xd3,0xb4,0x78,0xeb,0xdc,0x59,0x47,0x2b,0xab,0x14,0xa8,0xcd,0xd0,0xc2,0xfd,0xac,0x57,0x23,0xee,0x04,0xdd,0x89,0x17,0xc7,0xcf,0xe7,0xa5,0x36,0x48,0x5c,0x77,},{0x5b,0xcc,0xb3,0x7e,0x68,0xc2,0x34,0xbe,0xad,0x49,0x33,0x7d,0xe2,0x08,0xaf,0xba,0xf6,0x11,0x81,0x1d,0x96,0x58,0x59,0xa0,0x6d,0x31,0x30,0x12,0x47,0xd6,0x6a,0xcf,},{0x57,0x88,0xe7,0x9e,0x84,0x3b,0xde,0x9e,0xf1,0x1a,0x9d,0xfa,0xc9,0x70,0x19,0x6a,0x56,0x7c,0x63,0x08,0xc3,0x48,0xe5,0x17,0x4b,0x38,0x77,0x95,0x04,0x6d,0x59,0x0a,0x47,0x49,0x1f,0xd7,0x1d,0x97,0xae,0xaa,0x78,0xc1,0x61,0x59,0x71,0xb8,0x34,0x90,0xe8,0x59,0x28,0x20,0xf9,0x59,0x2a,0xc7,0x62,0x69,0xb9,0xd2,0xba,0x70,0x29,0x01,},\"\\x1c\\xdb\\xd2\\x85\\x56\\xec\\x44\\xe8\\x70\\x5a\\xfd\\xa9\\x2b\\xd5\\xa5\\x3f\\x95\\xd8\\xfe\\x8b\\x0f\\xfe\\x46\\x33\\x73\\x63\\x33\\x16\\xc5\\x22\\x74\\xc1\\x1e\\xdc\\xd6\\x15\\x51\\xe3\\x19\\x9e\\x49\\x4d\\xff\\x6d\\x90\\x6a\\x73\\x9e\\x7b\\x32\\x43\\x03\\xfc\\x47\\x82\\x7e\\x56\\xde\\xf0\\xbd\\xcc\\x46\\xb8\\x16\\x01\\x7c\\x71\\x23\\x05\\x37\\x02\\x63\\xba\\xbd\\x2c\\x71\\xbe\\x47\\x8f\\x41\\xce\\x30\\xb1\\xdf\\x63\\xbe\\xdd\\x3b\\x2e\\x6a\\x51\\x9c\\x53\\xdf\\x51\\x58\\x52\\xc4\\x13\\x7b\\xc1\\xac\\xa4\\x9b\\xf4\\xc4\\x63\\x1f\\xd6\\x56\\x46\\x57\\xd1\\x1c\\xd8\\x3e\\xa7\\x3c\\xc3\\xd0\\xcf\\x9e\\x3b\\x3c\\x3e\\x7c\\xa9\\x9b\\x4f\\x12\\xa9\\xc9\\xb6\\x7c\\x87\\x98\\x14\\x8e\\x0a\\x0d\\xc1\\xef\\x8b\\xf5\\x86\\x42\\xa1\\x4f\\x97\\xa5\\x72\\x13\\x55\\x14\\xc1\\x0b\\x19\\xaa\\xbe\\xc2\\x5a\\x9c\\x6b\\x35\\xaa\\x40\\x34\\xa5\\x7a\\xae\\x1b\\x6d\\x05\\xbd\\xe2\\xb6\\x33\\x0f\\x25\\x1d\\x78\\xdb\\x09\\x93\\xf0\\xca\\x4c\\x26\\x38\\x6e\\x34\\x89\\xa2\\x09\\x28\\x33\\xb8\\xac\\xbb\\xc4\\xf4\\x91\\x7f\\xd3\\x09\\x3d\\xf5\\x82\\xff\\xf7\\x1e\\xce\\x21\\x9d\\x36\\x72\\x45\\x55\\x82\\x60\\x9c\\x0d\\xb8\\xd9\\x6a\\x70\\xfc\\x8a\\xed\\x67\\x98\\xde\\x54\\xbf\\xb2\\xb3\\xee\\x6c\\x5d\\x32\\x8d\\xb1\\x63\\x59\\x3f\\x58\\x01\\x9f\\x38\\xf3\\x39\\xfd\\x37\\x53\\xf8\\x96\\xa4\\xa2\\xcc\\xa8\\xc1\\x40\\x0a\\x77\\xea\\x39\\x19\\x35\\xf3\\x4e\\x26\\x39\\xc5\\x60\\x86\\x08\\x10\\xbb\\xbe\\x4b\\xe1\\xd1\\x6e\\x01\\x2c\\x11\\x49\\x0a\\xa8\\x4f\\x29\\x64\\xc8\\x77\\xc2\\x93\\xb3\\x00\\xf4\\x3d\\x37\\x9f\\x3e\\xba\\x9a\\xf3\\x91\\xde\\xe5\\x10\\x85\\x6a\\x4d\\xdc\\xf7\\x6e\\x0a\\x0a\\xe0\\x6a\\x6a\\x7c\\x0f\\x9c\\x5e\\x3f\\xa1\\xb8\\x35\\x4f\\xe8\\x97\\x7b\\x4e\\xa3\\xb2\\x06\\x61\\x49\\x1f\\xa4\\x61\\x3b\\xa6\\x2f\\x55\\x6d\\x5d\\x5d\\xa8\\x21\\x3d\\x01\\x21\\xde\\x2c\\x87\\x25\\xdf\\x0a\\xae\\x04\\x8a\\xc8\\x91\\xab\\xbc\\x06\\xbd\\xce\\xf3\\xc3\\xef\\xfd\\xf5\\xa3\\x17\\x49\\x47\\x6f\\x81\\x4d\\xb9\\x45\\x79\\x45\\xf0\\xd9\\x1e\\x14\\x08\\x00\\x56\\xbe\\x92\\x1a\\x16\\xaa\\x96\\x4a\\x92\\x98\\x22\\x1b\\x15\\x75\\x94\\x97\\x3e\\x32\\x96\\x99\\x93\\x31\\x0c\\x87\\x07\\xe1\\x9f\\x31\\x43\\xab\\xc4\\xfd\\xa7\\xc8\\xad\\x01\\x60\\xac\\xf0\\x31\\xab\\xa6\\x52\\x80\\x1a\\xa8\\x1a\\x01\\x6b\\x31\\x37\\x03\\x9e\\x27\\xd6\\x73\\x8d\\x02\\x80\\x0a\\x93\\xa8\\x6f\\x9f\\x55\\x85\\xc5\\x18\\xdf\\xa9\\xe7\\xd8\\xac\\x72\\x7f\\x37\\x43\\x7e\\x56\\xd2\\x78\\x83\\x86\\xe1\\x16\\x53\\xa0\\x4e\\x16\\x51\\x69\\xf9\\x03\\x97\\x2a\\x01\\x48\\x47\\x51\\xe7\\xcb\\x38\\x63\\x25\\x90\\xec\\x80\\xd5\\xfc\\xe4\\x54\\x16\\x01\\xa0\\xe0\\x95\\x78\\x5a\\x9e\\xe8\\xd3\\x59\\xed\\xf2\\x6b\\x99\\x46\\xe7\\x98\\xda\\x59\\x98\\xcb\\xb7\\x36\\xf9\\x4e\\xb7\\x13\\x46\\x3f\\x79\\xf5\\x61\\x75\\x9b\\xbc\\xb4\\xc4\\xac\\x69\\x3c\\xab\\xf2\\xe1\\xe0\\x36\\xb2\\xd0\\xb0\\x87\\x9a\"},\n{{0x07,0x4d,0x92,0x18,0xc1,0x21,0x7e,0x75,0x82,0x3c,0x90,0xe0,0x10,0x48,0x4c,0x2a,0xdb,0x88,0xec,0xcc,0xd2,0xbd,0xf0,0x12,0x0a,0xa3,0xed,0xff,0xcf,0xcb,0xd4,0xbf,},{0x37,0x35,0xad,0x19,0x19,0x03,0x3d,0x16,0x17,0xb8,0x5b,0xda,0x04,0xb1,0x61,0x21,0xda,0x1d,0x86,0x1b,0x40,0x41,0x54,0xfa,0x96,0x1d,0x49,0x46,0xe5,0x5e,0xcd,0x83,},{0xb1,0xf7,0x1c,0x3b,0xd1,0xb6,0xbe,0xc4,0x33,0x37,0xe2,0x6d,0xee,0x65,0x5a,0x8d,0x5f,0x4a,0x8d,0xad,0x84,0xa5,0x11,0x84,0xb7,0x75,0xb6,0x86,0xfa,0xd3,0x1d,0x80,0x29,0xe3,0x87,0x69,0x27,0xf9,0x57,0x6e,0x90,0xc3,0x62,0x48,0x75,0xfc,0x00,0x29,0xa5,0xc1,0x0a,0x8a,0x0a,0xf7,0x5d,0x7a,0x88,0x0c,0x68,0x44,0xa4,0xa8,0x3a,0x00,},\"\\x6b\\x5a\\xa4\\x0e\\x91\\x67\\xbf\\xdb\\x84\\x7d\\xaa\\x7d\\x27\\x86\\xe2\\x8e\\x75\\x33\\xe1\\xd6\\xac\\x53\\xbe\\xb6\\xf6\\x9b\\x59\\x53\\x79\\x5a\\x2b\\xf5\\x9b\\xbf\\x7d\\x14\\x19\\x26\\x96\\x8f\\x50\\x96\\x9b\\xad\\x74\\x2a\\x4f\\xb5\\x79\\xd3\\x25\\x0f\\xb1\\xbe\\x4c\\x57\\xeb\\xf4\\xf9\\x11\\x2c\\x70\\xcd\\x9f\\x72\\xa0\\x0d\\xb1\\xc8\\x89\\x6f\\xe2\\xb5\\xbd\\xa7\\xc7\\x03\\x0f\\x49\\x7c\\x0b\\x00\\x1e\\xa2\\x5b\\xa0\\xd4\\x47\\xf0\\x8c\\x36\\xdb\\x8b\\x90\\x7c\\x2f\\x2a\\xbb\\xbb\\x62\\x0d\\x3e\\x8a\\x2c\\x66\\xe4\\x17\\x12\\x85\\xad\\xca\\xad\\xd1\\xc1\\x4f\\xe2\\x39\\xbc\\x59\\x5f\\x09\\x83\\x96\\xaa\\x87\\x80\\xff\\xb8\\x0f\\xe1\\x44\\x6a\\x07\\x00\\x1e\\xc2\\x34\\xd8\\x2a\\xbd\\xcd\\x81\\x00\\x79\\x39\\x15\\xb0\\xb3\\xf8\\x0d\\x84\\xe2\\x0e\\x51\\xea\\xbc\\x79\\x78\\x06\\xf3\\xbe\\x81\\x08\\xa4\\xf4\\x37\\x55\\x0b\\x06\\x69\\x40\\x50\\xa8\\x29\\x31\\xac\\x40\\xc0\\xa4\\x89\\x77\\xed\\xf6\\xce\\xd2\\x42\\x8d\\x7c\\xfe\\xa8\\x20\\x55\\x06\\xde\\x86\\x40\\x80\\x65\\xd1\\xa1\\x98\\x70\\xfa\\x33\\xa7\\x08\\x10\\x37\\xb3\\xee\\x44\\x91\\xb6\\xe7\\xf3\\xd1\\x0b\\x14\\xa3\\x0c\\x20\\x91\\x59\\xa1\\xc8\\x12\\x31\\xa3\\x5f\\x03\\x65\\xb4\\x7d\\x3e\\x0d\\xa0\\x4a\\x32\\xc9\\x5d\\x98\\x33\\x3c\\x44\\xf5\\x72\\xcd\\xaa\\xa9\\x05\\xd0\\x69\\x19\\x7f\\x6e\\x86\\x1b\\x5d\\xfc\\xdf\\xb9\\xdb\\x6c\\x7b\\x0d\\x0c\\xb0\\x0f\\x37\\xc9\\x16\\xa1\\xc4\\xc0\\xb8\\x98\\x5b\\x09\\xf3\\x34\\x09\\x5e\\x12\\x83\\xed\\xfd\\xd4\\xe6\\x2a\\x29\\x41\\x09\\x9a\\x2b\\x69\\x36\\x96\\x60\\x4d\\x99\\x43\\x11\\xe3\\xd5\\xf6\\x10\\x66\\x83\\xe1\\xd7\\xa1\\xc7\\xe5\\x3d\\xf7\\xb7\\x90\\x94\\x7a\\x9a\\x80\\x1a\\x0c\\xcd\\x48\\x43\\x95\\xf6\\xcb\\xfd\\x9c\\xa4\\xd9\\x80\\x4f\\x18\\xd5\\x2b\\xb0\\xf9\\x46\\xd1\\xa8\\x9f\\x97\\xa6\\xfb\\x06\\x80\\xa8\\xc4\\xc0\\x57\\xb6\\x06\\x2b\\x2b\\x9d\\xe7\\xc0\\x37\\x48\\x79\\xb8\\xa6\\xa6\\xd2\\xc1\\x0a\\xef\\x78\\x05\\x08\\xeb\\x28\\xbb\\x56\\x9a\\x08\\x35\\x09\\x44\\xc8\\x2f\\x6e\\xf2\\x8d\\xb2\\x30\\x4d\\xb6\\x97\\xc3\\xae\\x1a\\xf4\\x3a\\x50\\x0b\\x0b\\x97\\x48\\x03\\xe9\\xf4\\x6e\\xa2\\xa0\\x2e\\x85\\xed\\x27\\xdd\\xa6\\x16\\xd2\\x4d\\x6d\\xb3\\xcc\\x4f\\x5a\\xed\\x82\\x40\\xb1\\xae\\xa3\\xdc\\xf6\\x9d\\xee\\x5f\\x14\\xf9\\x5e\\x6e\\x72\\x98\\x7b\\xbe\\x61\\x89\\xbc\\x20\\x45\\xf0\\xd7\\x83\\xa7\\xb4\\x7b\\xfc\\x19\\x83\\x0b\\xc7\\xf4\\xe7\\x98\\xab\\xe9\\x02\\x45\\xfb\\xd4\\x3f\\x37\\xc3\\xf0\\x36\\xd1\\xcb\\xf1\\xe7\\x3d\\xcb\\x1d\\x9d\\xaa\\x87\\x37\\x9b\\x11\\x06\\x97\\x34\\x81\\xa2\\x15\\xc1\\xf4\\xf4\\x6c\\x16\\x03\\xa5\\xd5\\xcd\\x97\\xb7\\x07\\x6f\\x1f\\x5d\\xc7\\x89\\xaa\\x6a\\x71\\xe7\\x2e\\xf5\\x4e\\xd3\\x28\\xa4\\xab\\x64\\x34\\x05\\x39\\xff\\xd1\\x64\\xd0\\xec\\x64\\x5f\\x32\\x2d\\x1b\\xc3\\x71\\x12\\xdc\\x08\\xd8\\xc8\\x07\\x9d\\x19\\xd3\\x7a\\xbb\\x23\\x53\\xf4\\x8b\\x5c\\x49\\x2f\\x80\\x6e\\xd2\"},\n{{0xd2,0xea,0x2d,0xff,0x7a,0xf0,0xba,0x2a,0x6b,0xed,0x7f,0x6c,0xc6,0x8c,0x0d,0xf6,0x64,0xa6,0xb1,0x0c,0xe8,0x01,0xc4,0x2e,0xd5,0xbb,0xe6,0x17,0xbc,0xc8,0xb8,0x4a,},{0xab,0x44,0x70,0x63,0x44,0x02,0x6e,0xd3,0x5e,0x21,0x98,0x29,0x64,0xf7,0xb4,0xdb,0xbb,0xe2,0x07,0xfd,0x27,0xc4,0x67,0x99,0x70,0x1c,0x19,0xa4,0xd8,0x8d,0x1d,0x72,},{0x9a,0xbd,0xb9,0xdd,0x2a,0xb7,0x7b,0x6f,0x5e,0x1b,0x91,0xba,0x0b,0x61,0x3f,0x5f,0x36,0x0e,0xfb,0x50,0x0d,0x3f,0xe9,0x92,0x90,0xef,0x7c,0xa1,0x4b,0xd2,0xb3,0x30,0xf4,0x05,0xa4,0xf7,0xdc,0xda,0xef,0x49,0x23,0xd3,0x11,0x1d,0x40,0xbf,0x03,0x20,0x35,0x33,0x86,0xf6,0x34,0xb4,0x0d,0xe6,0xf0,0x4d,0xe9,0x19,0x0a,0xd5,0x1c,0x08,},\"\\x03\\xab\\x5d\\xae\\xbc\\x6e\\x70\\xd3\\x52\\x97\\x79\\x32\\xa0\\x31\\x07\\x87\\x9b\\xd5\\x5d\\xaf\\xd0\\xc6\\xba\\x7a\\xd9\\x69\\x7a\\x17\\xb1\\x27\\xb3\\xa7\\x4a\\x3e\\xae\\xba\\xbd\\x0f\\x8e\\xee\\xbf\\xc0\\x48\\x3d\\x63\\xfe\\xdd\\xe5\\x2d\\xeb\\x46\\xa3\\x75\\x24\\x49\\xc9\\xc4\\x49\\x5c\\x51\\xa1\\xc9\\x1f\\x57\\xe3\\xad\\x2e\\x6d\\x01\\xa1\\x3d\\x0c\\x47\\x0c\\x52\\x91\\xb8\\xe9\\x12\\x28\\x83\\x40\\x97\\x0f\\xbb\\x85\\x78\\x7b\\x8b\\x37\\x6d\\x72\\x17\\x52\\x50\\xe8\\xcd\\x90\\xc0\\x78\\x88\\xbf\\xef\\x5e\\xbf\\x50\\x86\\xc8\\xff\\x2a\\xbc\\xdd\\x12\\xd2\\x14\\xb9\\xc4\\x5d\\x12\\x08\\x73\\xb4\\x60\\x2e\\x57\\xa6\\xaa\\xb0\\xb8\\x28\\xd1\\x08\\x4d\\xff\\xaa\\x36\\x51\\xee\\x35\\x66\\x26\\x95\\xb7\\xf3\\x43\\x3f\\x4a\\xb5\\x30\\xc2\\x9a\\xc6\\xcc\\x5b\\xb4\\x3e\\xcc\\xd1\\xb6\\x89\\x8b\\x9e\\xf7\\xae\\xc6\\xd5\\xae\\xc6\\x8d\\x5c\\x11\\x14\\xbb\\x5d\\xf7\\x82\\x09\\x66\\x59\\x4c\\x99\\x4d\\x64\\x08\\x91\\xb8\\xf2\\xdc\\x5d\\x25\\x63\\x8d\\xe4\\x35\\x49\\xd8\\x6d\\x34\\x30\\x6f\\xf3\\xf5\\x74\\x57\\x51\\x16\\x40\\x5b\\x9e\\x8e\\x28\\x6e\\xe0\\xcd\\x97\\x8a\\x76\\x00\\x2c\\x44\\x35\\xfe\\xaa\\xc6\\xe8\\x4e\\xae\\x16\\x54\\xf3\\x39\\xa5\\x67\\xd8\\xd0\\x4f\\xcf\\xa3\\xeb\\x6a\\x04\\xb9\\xad\\xc6\\x66\\x02\\x13\\x00\\xe9\\xee\\x59\\x72\\xb3\\xdf\\x5d\\x4d\\x0d\\xd4\\xbf\\x79\\x21\\xdc\\x98\\xde\\x82\\xce\\xf2\\xd1\\xb1\\xd6\\x1b\\x79\\x7f\\xc9\\x96\\x8e\\x11\\x84\\x84\\xc4\\x13\\x42\\x41\\x6d\\xdc\\x6a\\xdc\\x4e\\xe5\\xd6\\x87\\xd9\\x4a\\x40\\xce\\x57\\x2f\\x42\\xa2\\x04\\x86\\x68\\xc1\\x75\\xcf\\x7b\\x1f\\x24\\xc4\\xef\\xd0\\x20\\x55\\x4f\\xc6\\xf6\\x42\\xe1\\x4a\\x57\\xba\\xec\\x23\\xe9\\x5c\\x25\\x14\\x30\\x6d\\x0a\\x6d\\x33\\x64\\x88\\x41\\x49\\x7e\\xac\\x48\\xea\\xbd\\x96\\xd0\\x47\\x31\\xba\\xb0\\x8b\\xf5\\xea\\x9d\\x43\\xe0\\xcf\\x9a\\x37\\xfa\\xaf\\xa7\\x32\\x86\\x9d\\x68\\xe7\\xd5\\xfe\\x69\\x54\\xf8\\xa3\\x19\\xef\\x55\\xda\\x1e\\x17\\x8e\\x43\\xe8\\x4a\\x3b\\x9a\\xa3\\xad\\x00\\xc2\\x9b\\x1d\\x16\\x11\\x63\\xdf\\x4b\\x79\\xf2\\x88\\xe9\\x39\\x1d\\x70\\xa2\\xf8\\x81\\x3d\\x66\\x62\\x2e\\x8a\\xc3\\x33\\xfa\\x6a\\xa5\\x31\\x1e\\xab\\xec\\x38\\x3b\\xa4\\xcc\\x12\\x28\\x15\\xde\\x00\\x88\\x77\\xef\\xbe\\x6e\\x12\\xc3\\x22\\xc9\\x75\\x43\\x4a\\xfa\\xd1\\x73\\xeb\\xe2\\x42\\x03\\xd9\\x16\\xd5\\x75\\x78\\xbd\\x2b\\xca\\xcc\\x78\\xf6\\xe2\\x56\\x45\\x13\\xf8\\xd1\\x13\\xa8\\x33\\xc2\\xc2\\x26\\xeb\\x97\\xba\\x2e\\x23\\x36\\x1a\\x5d\\x02\\x66\\x4a\\xb3\\x77\\xf9\\x64\\xc4\\x30\\x0b\\xe2\\xd7\\x7b\\x62\\xd9\\x24\\x08\\x23\\xa0\\x98\\x84\\xdf\\x30\\x7e\\xff\\x3b\\xe5\\x66\\x4d\\x72\\xd1\\x1a\\xd5\\x13\\xe1\\xbc\\x56\\x10\\xdb\\xfd\\x10\\x09\\xdb\\x39\\xf0\\xcb\\xfe\\x47\\x05\\x55\\xec\\x1b\\x56\\xb8\\x71\\x67\\x07\\x93\\xd3\\xb7\\x04\\xfb\\x06\\xee\\x95\\x0b\\x1a\\xd2\\xa4\\xd7\\x29\\x7c\\xa5\\x8b\\xba\\xd8\\x10\\xc3\\xfa\\xd4\"},\n{{0x7a,0x60,0xcd,0xf1,0x87,0x04,0x60,0xde,0x8a,0xe7,0x78,0x11,0x76,0xd5,0x12,0x7e,0x71,0x20,0x7f,0xaf,0x2f,0x21,0x0b,0xd4,0xdc,0x54,0x73,0x85,0xb6,0x67,0xf2,0xf2,},{0xea,0xd6,0x7a,0x9c,0xf3,0x4d,0x0f,0xf1,0x4e,0x79,0xaf,0xa4,0x6f,0x2d,0xc9,0x96,0xe9,0xac,0x0e,0x3e,0x07,0x63,0x22,0xfb,0xb4,0x00,0x97,0x67,0xb1,0x33,0xf0,0x1b,},{0xb2,0xe0,0x81,0x42,0xbd,0xd6,0x2b,0x78,0x65,0x92,0xc0,0x91,0xf5,0xfe,0x6a,0x9b,0x7f,0x30,0xce,0x13,0x4c,0x3b,0x23,0x6f,0xbc,0x6d,0xfe,0x67,0x34,0xf8,0x82,0x70,0xac,0x58,0xf6,0xd7,0x4b,0x4f,0xd9,0x9c,0x22,0x45,0x1c,0xa4,0x65,0xa4,0x2c,0x00,0x6d,0xb2,0x5a,0xf2,0x15,0xed,0x24,0x1a,0xf1,0x18,0x96,0x27,0xc6,0x05,0x0f,0x00,},\"\\x9d\\xc0\\x23\\xa5\\x25\\xd0\\x1b\\xa3\\x51\\x37\\x98\\xb7\\x38\\xc7\\x91\\x62\\x92\\x6e\\xbc\\xcc\\x0a\\xdf\\x1e\\x57\\xac\\x47\\xc2\\x0d\\xea\\x6c\\xe1\\x37\\x5c\\x3d\\x2a\\xaa\\x17\\x33\\xb7\\xf0\\xc3\\xbd\\x94\\x5c\\x33\\x5f\\xf3\\x57\\x61\\x12\\xbb\\xdc\\x10\\xb6\\x78\\x3b\\xa6\\x54\\xe8\\xc6\\x10\\x47\\xf2\\x77\\x3a\\xa2\\x29\\xbf\\x84\\x69\\x22\\xa8\\x9c\\x6a\\x73\\xd5\\xf1\\x05\\x1e\\x8d\\x96\\xed\\x36\\xd7\\xd6\\x74\\x7e\\x06\\x3a\\x7a\\xc6\\x02\\xf1\\x9f\\xc5\\x2e\\x02\\x1a\\x4b\\xbc\\x28\\xb0\\x35\\x14\\xfb\\xd5\\x1c\\x7b\\x3f\\xd6\\x59\\xf1\\x2d\\x54\\x7d\\x05\\x92\\xdd\\x09\\xf8\\x73\\xc9\\xec\\xc6\\x43\\x9c\\x7e\\x93\\x1a\\xd0\\xe4\\x85\\x6b\\xe3\\x1c\\x60\\x5d\\xef\\x2e\\xd9\\xb5\\xd1\\x3c\\x59\\x42\\xb2\\xf3\\x25\\x39\\x7d\\xac\\x6c\\x97\\x60\\xe9\\xb1\\xbb\\x0c\\x06\\xf7\\x13\\xcb\\x92\\x0c\\x23\\x4b\\xcc\\xfe\\xe9\\xf0\\xb8\\x5d\\xd0\\x20\\xf7\\x98\\x8f\\x3b\\xe1\\xcc\\x66\\xe9\\xe5\\x1b\\xab\\xe2\\xfe\\xe2\\x37\\xeb\\x84\\xec\\x7e\\xff\\x94\\x09\\xaa\\x91\\xc1\\x94\\xe3\\x0d\\xb1\\xe0\\x65\\x01\\x59\\x55\\xde\\x97\\x46\\xbb\\xa0\\x3f\\x7e\\xdf\\x9a\\x58\\x75\\x12\\x40\\x9a\\x41\\x61\\xfa\\x77\\xea\\x62\\xcc\\xf4\\x31\\x60\\x2d\\xcd\\xcf\\x36\\x5e\\xd6\\xbf\\x0a\\xed\\xdd\\x32\\xf7\\xc8\\x44\\xe3\\xa3\\x4d\\x26\\x6e\\x28\\x38\\x2f\\x40\\x62\\xfd\\x4d\\x6f\\x82\\x14\\x25\\x21\\x04\\xd6\\x43\\xa9\\xbf\\xd8\\x07\\x17\\x16\\x37\\x1c\\xcb\\xb5\\x4c\\x8c\\xc8\\xdb\\x79\\xad\\xd6\\x5b\\xcb\\xce\\xa0\\xd0\\x80\\xd8\\x40\\x28\\x03\\xfe\\x23\\x2d\\xf7\\x0f\\x76\\x57\\x72\\x47\\xa6\\x3d\\x55\\x83\\xbb\\xd5\\x64\\x27\\x67\\xbc\\x63\\xf3\\xc5\\xa7\\xbb\\x3a\\x47\\xeb\\x12\\x98\\x4e\\x45\\x41\\xf4\\x1f\\xdb\\x55\\x86\\x9a\\x08\\xfa\\xde\\x66\\xc2\\x0f\\x69\\xa5\\xa9\\xde\\x25\\xf6\\xb3\\x6b\\xa1\\x8a\\xce\\x5b\\x4a\\xc3\\x36\\xbb\\x2a\\x8e\\xbf\\x63\\x0a\\xd0\\x3e\\x8b\\xb8\\x73\\x1d\\x01\\xe8\\x4b\\x91\\xd0\\x24\\xd1\\x17\\x45\\x9a\\x74\\x89\\x2e\\x93\\xd5\\x3b\\x61\\xe6\\xb8\\x06\\x8e\\x4f\\x04\\xb4\\x18\\x1f\\x03\\x87\\xb4\\x56\\x7c\\xcd\\x45\\xe1\\xb8\\x71\\x8a\\x2d\\x7d\\x78\\x78\\x72\\xf3\\xdc\\xf8\\x7a\\x15\\x93\\x5a\\xd7\\xda\\xaa\\x74\\x4e\\xd6\\x8a\\x28\\x66\\x6a\\x51\\xa1\\x0d\\x39\\xfc\\x13\\x9c\\xdf\\xe9\\xa6\\x87\\x30\\x76\\xf7\\xc4\\x25\\x00\\x9c\\x38\\xfa\\xee\\x13\\x5e\\x51\\x32\\x07\\xb0\\x6e\\x7b\\xa3\\x56\\x85\\xf5\\x07\\x2d\\xa3\\x4b\\x60\\x45\\xb5\\x7c\\xd5\\xd1\\xb1\\xa1\\xfd\\xf0\\x17\\xb8\\xaa\\x8e\\xbd\\x27\\x52\\x2b\\xc9\\x5e\\x47\\x90\\x87\\x34\\xe4\\x17\\x22\\xa7\\x67\\x90\\x5c\\x5e\\xcc\\x30\\xc7\\x24\\x81\\xb6\\xc1\\x2b\\xf4\\xac\\xe9\\x4d\\x5b\\xb3\\xa3\\x15\\x56\\x91\\xb7\\x07\\x5b\\x40\\xeb\\xf5\\x96\\x8f\\xdd\\x90\\x3d\\x8f\\xd3\\xcc\\x50\\xb8\\xd6\\x46\\x48\\x59\\xb1\\x0f\\x75\\x51\\x32\\xc6\\xd9\\xb6\\xda\\xd1\\xd6\\xf1\\x4c\\x41\\x85\\xb2\\x64\\xd3\\x49\\x7a\\x4e\\x54\\x98\\x77\\xfe\\x94\\x6e\"},\n{{0x33,0x79,0xd2,0x5c,0x11,0x17,0xcf,0x80,0x2e,0xc7,0x9c,0x06,0x57,0x5d,0x18,0xe6,0xbe,0xce,0x4c,0x70,0x93,0xdd,0x43,0xfd,0xee,0x03,0x68,0x5c,0x70,0xb2,0xfa,0x9f,},{0x85,0x25,0x15,0x6f,0xe2,0x9f,0xc2,0xfb,0xf6,0x61,0xba,0x50,0x18,0x2b,0xe2,0x0c,0x89,0x98,0xd9,0x41,0x49,0x3d,0x59,0x33,0xdc,0xa4,0xd8,0xb4,0x1f,0xb4,0x42,0xd5,},{0x4c,0x36,0xbf,0xc8,0x1e,0xef,0x00,0xb9,0xcb,0x3a,0xb5,0x14,0xc6,0xd4,0x51,0xb9,0x93,0x36,0x1e,0x09,0xa4,0xbe,0x4b,0x50,0x40,0x92,0x6f,0xeb,0x0e,0x0d,0x9b,0x52,0xf0,0x3d,0xe4,0x68,0xe7,0xba,0xd8,0x3f,0x37,0x91,0x54,0xbf,0x2c,0x43,0x7a,0x71,0xf7,0x54,0xf3,0xf4,0x07,0x98,0xee,0xeb,0xd6,0x2e,0x55,0xf2,0xbe,0x77,0x14,0x03,},\"\\x7a\\xcd\\xb3\\x9f\\x12\\x26\\xbd\\x3a\\xbf\\xfa\\x50\\x35\\x0a\\x14\\x97\\xd7\\x61\\xf8\\xf0\\xaa\\xef\\xbf\\xbb\\xbb\\x92\\x5f\\xf5\\x63\\xe3\\x89\\x76\\xaa\\x17\\x2d\\x40\\x7b\\x61\\xff\\xdf\\xb1\\xcd\\x53\\x8a\\x4c\\xd0\\x00\\xb5\\x78\\x18\\xa0\\xbc\\x92\\xc0\\xe0\\xcd\\x0a\\x5a\\xbf\\xcf\\x57\\x83\\x00\\xf5\\xf4\\xe6\\xce\\xfa\\x26\\x72\\x75\\xd1\\x78\\x45\\xda\\x70\\x66\\xfd\\x4e\\x18\\x01\\x00\\x27\\x96\\x0c\\xd3\\x95\\xe6\\x82\\xad\\x71\\xaf\\x34\\x9b\\xbd\\xad\\x5e\\xba\\xa0\\xf1\\x1a\\x77\\x61\\xe1\\x9e\\xa1\\xbe\\xf6\\x61\\x07\\x43\\x16\\x4b\\x17\\x14\\x14\\x53\\xb4\\x72\\xae\\x2c\\x8f\\x36\\xce\\x6b\\x08\\x0f\\x1c\\x07\\x45\\x35\\x24\\x54\\xce\\x5a\\xea\\xe1\\x1c\\x9d\\x75\\xde\\x3c\\x08\\x00\\x42\\x65\\xfc\\x4c\\xa8\\x0d\\x33\\xb2\\x6e\\xae\\x14\\x00\\xdf\\xd8\\x97\\x7b\\xf7\\x23\\xa6\\x16\\xda\\xeb\\x6d\\x42\\x19\\x90\\x10\\xb7\\x3e\\x19\\x3a\\xb7\\x2a\\x58\\xbd\\xd2\\x48\\xa7\\xf4\\x11\\x1c\\xa5\\x0c\\x1d\\xe6\\x46\\xbf\\xea\\x7b\\x4d\\x5b\\xaf\\x0f\\x93\\xdd\\x97\\x3e\\xe9\\x36\\x49\\xe2\\x1e\\xc0\\xc6\\xc4\\xfc\\xca\\x8c\\xd6\\xff\\x69\\xdf\\x76\\x16\\x12\\x02\\x1d\\x85\\xff\\x1f\\xb2\\xa9\\x53\\x37\\xda\\x48\\x05\\xa7\\x6d\\x34\\x7e\\xe7\\x1e\\xf1\\x9c\\x0d\\xff\\xb5\\x9f\\x15\\xf6\\x50\\x29\\x3a\\xbb\\x97\\x21\\x05\\x3f\\x74\\x06\\x90\\x5a\\xe6\\x83\\xf9\\x6c\\x83\\xa3\\xa7\\x44\\x7b\\x1a\\xfb\\x14\\xe1\\x20\\x8c\\x63\\x9f\\x37\\xa9\\x75\\x0b\\xa2\\x1d\\xa5\\x55\\x2c\\xc2\\x04\\xea\\xc4\\x53\\xca\\x03\\x62\\x82\\xf7\\xe0\\x96\\x10\\x93\\xc3\\x9e\\xc1\\x18\\x13\\x8d\\xcf\\x71\\xcf\\x2d\\x28\\xfb\\x96\\xa2\\x49\\x62\\xb5\\x2d\\x33\\x93\\xf8\\x80\\x65\\x3b\\xcb\\xa2\\xc9\\xb9\\xd5\\x7b\\x77\\xc5\\x22\\xf4\\x21\\xfc\\xf5\\xad\\x75\\xfb\\xa9\\xcf\\x33\\x89\\xb1\\x23\\xaa\\x97\\x52\\x17\\x13\\xff\\xf8\\x84\\x67\\xde\\xb8\\xc8\\x99\\x1d\\x4b\\x57\\xc1\\x43\\x81\\x70\\x53\\x7c\\xb5\\x0c\\xdc\\xc6\\x57\\xe5\\x0e\\x5c\\x48\\x0e\\x12\\xc0\\xd4\\x49\\x39\\xb6\\x39\\x99\\x44\\xe7\\xc7\\x1e\\x18\\x6c\\x2a\\xbb\\x81\\xfc\\x57\\x34\\x88\\x36\\xd5\\xe5\\x7b\\x72\\xb2\\x24\\xa6\\xb7\\x1b\\x6c\\xaf\\x72\\x1a\\xca\\x73\\x47\\x8c\\xb6\\xcf\\x5f\\xb8\\x90\\x71\\xae\\x3a\\x39\\x82\\x02\\xdb\\xb3\\x8c\\x30\\x81\\x25\\x63\\xbb\\x9a\\x23\\x40\\x66\\x57\\xa9\\x56\\xd3\\x05\\xa3\\x44\\x9a\\x60\\xcc\\x86\\x41\\xb6\\x21\\x75\\xa7\\x17\\x0c\\x23\\xbd\\x5a\\x25\\xf0\\xf1\\x2e\\x15\\xa7\\xed\\x91\\xfa\\xda\\x6a\\x4a\\x2f\\x0e\\x7b\\x15\\x5a\\x3d\\x64\\x85\\xec\\x03\\xce\\x6e\\x34\\xdf\\x7e\\x21\\x62\\x40\\xbb\\x28\\xa2\\xdd\\x73\\x2f\\xf7\\x90\\xd2\\x28\\x6e\\x20\\x0b\\x33\\xc2\\x9a\\x31\\xa5\\xe1\\x9a\\xd2\\xcd\\x02\\x97\\x4b\\xad\\xc4\\xbc\\x22\\xde\\xb7\\x50\\x4c\\x15\\x24\\x1f\\xc1\\x06\\x0c\\x8a\\xce\\xf4\\xfb\\xb2\\x5e\\xc7\\x60\\x2f\\xce\\x36\\xa2\\x7b\\xb8\\x7b\\x6e\\x64\\x23\\xe6\\xb4\\xf6\\xe3\\x6f\\xc7\\x6d\\x12\\x5d\\xe6\\xbe\\x7a\\xef\\x5a\"},\n{{0xef,0x38,0xc3,0xfc,0x74,0xf0,0x54,0xae,0x43,0xe8,0xd2,0x9d,0x6b,0xa6,0xdc,0x80,0xb5,0xaf,0x84,0x82,0x70,0xd4,0xaf,0x58,0x84,0x4d,0x24,0xbc,0xf9,0x87,0x41,0x4e,},{0x0a,0xe1,0x47,0x8b,0x05,0xfb,0x32,0x99,0x65,0xea,0x0f,0xa9,0x28,0xdc,0xbe,0x81,0xa0,0xbd,0xbb,0x6f,0xf6,0x6c,0x81,0x16,0x71,0x63,0x5e,0x43,0x88,0x88,0x80,0x51,},{0x1d,0x3a,0xc6,0xb6,0xbf,0x18,0xab,0x53,0x09,0x14,0x87,0x99,0x48,0x5b,0x27,0x6d,0x20,0x40,0x1c,0x6a,0xf5,0xf9,0xb2,0xf6,0x03,0x23,0x95,0xa3,0xc2,0xf4,0xb6,0x73,0xb7,0x14,0x0c,0x07,0xcc,0x26,0xf4,0xfc,0x56,0xa5,0xee,0x00,0xb0,0x74,0x6b,0x2a,0x80,0xda,0x6f,0xda,0xd1,0x7e,0xdd,0x11,0x49,0x20,0x10,0x1d,0x2c,0x89,0xc3,0x0e,},\"\\xbf\\x29\\x0d\\xb3\\xdd\\xa8\\x76\\x39\\x37\\xae\\x4c\\x83\\x74\\x67\\x05\\x32\\x72\\x95\\xc2\\xc2\\x48\\x06\\x8f\\x5a\\xb8\\x5c\\x8b\\x5d\\x75\\x6f\\x4e\\x3e\\x34\\x06\\x2b\\x55\\x49\\x38\\x72\\x61\\x47\\x6b\\xcb\\xd1\\xe7\\x33\\x19\\x90\\xf1\\x19\\x10\\xd1\\x1f\\x94\\x60\\x7c\\x2b\\x71\\xf6\\x5b\\x77\\x1a\\xac\\xab\\xdc\\x10\\xf4\\x2a\\xe9\\x18\\xdd\\x25\\x94\\xac\\x71\\x05\\x1c\\x85\\xb3\\x30\\x77\\x9c\\x47\\xaf\\x00\\xa5\\xb9\\x81\\x91\\xb5\\x6c\\xbc\\xf7\\xef\\xe4\\x1a\\x27\\xe8\\x7c\\x67\\x71\\x68\\xc8\\xab\\xe9\\x49\\x6e\\xb2\\xe7\\xab\\xbd\\x0b\\x16\\x04\\x28\\x6e\\xd1\\xa1\\xb1\\x8d\\x26\\x4d\\x73\\x3d\\xe8\\x7d\\x0d\\x3f\\x80\\x55\\x52\\x8c\\x4d\\x42\\x6d\\x7f\\x8e\\x6e\\xd0\\x24\\xa7\\x41\\x40\\xab\\xd3\\x54\\x00\\x79\\x62\\xa2\\xa9\\x7a\\x5c\\x2f\\xf9\\x76\\x54\\x6a\\x8d\\x1a\\xc4\\x92\\x4c\\x09\\x22\\x3d\\x34\\x8d\\xdc\\xd8\\x71\\x0a\\x37\\x99\\xf9\\x1b\\xb8\\x70\\xb3\\xf4\\x6d\\x51\\xf1\\xe7\\xf6\\x89\\x2d\\x6b\\x08\\xb9\\x91\\x74\\x8a\\x03\\x7a\\x86\\x7e\\xcc\\x39\\xee\\x8d\\x64\\x62\\xa7\\x61\\x44\\x88\\xed\\xd3\\xc2\\xba\\x61\\x5c\\xa2\\xe3\\x78\\x54\\x88\\x94\\x41\\xb1\\x3d\\xc8\\x35\\xc3\\x6b\\x38\\x65\\x3f\\x65\\x98\\x61\\x6f\\x35\\x78\\x3e\\x2e\\x15\\x83\\x84\\xbb\\x93\\x1c\\x90\\x1b\\x70\\x3a\\xcb\\x39\\x91\\xfb\\x7a\\xa5\\xba\\x69\\xd9\\xa5\\xbd\\x05\\x70\\x24\\x29\\x61\\xa7\\x1a\\x52\\x47\\x03\\x15\\xe9\\x82\\xe3\\x41\\xa6\\x1c\\x64\\xa6\\x19\\xbd\\x16\\xfe\\x81\\x19\\xaa\\xe0\\xd7\\x50\\x3c\\xe7\\xd7\\xe9\\x26\\x14\\x6b\\x91\\xc2\\x89\\x2f\\x13\\x16\\x69\\xd1\\xe3\\x9e\\x5b\\x75\\xe9\\xc7\\x24\\x52\\x61\\x80\\x99\\xa5\\x7d\\xc2\\xee\\x37\\x7b\\xe6\\x58\\x75\\xee\\x01\\xbb\\x88\\xed\\x52\\x6f\\xc3\\x94\\xe2\\xf5\\xc8\\x12\\x7a\\x5f\\x69\\x12\\x5e\\x67\\x38\\x5e\\xf9\\x4b\\x1f\\x33\\xad\\x52\\x62\\x9d\\x72\\x0e\\x31\\xc0\\x2a\\xe0\\xb5\\x82\\x33\\x9f\\xf0\\xf0\\xbb\\x07\\xff\\x2b\\x03\\x0f\\x48\\xfa\\x7b\\x69\\x27\\x16\\x50\\x1a\\xd7\\x77\\x3a\\xd3\\x15\\x12\\x04\\xa2\\xa5\\x40\\xfa\\x94\\x36\\xbd\\xd4\\x20\\x2a\\x15\\x73\\x09\\xec\\x36\\xce\\xcb\\xe5\\x8b\\x33\\xef\\xf5\\x57\\xfd\\x33\\xe0\\x3f\\xd3\\xeb\\x19\\x00\\x9b\\xd7\\xa2\\xde\\xa9\\xef\\xee\\xf8\\x78\\x55\\x67\\xaa\\xb2\\xa4\\xc9\\x8b\\xd1\\xf2\\xa8\\x10\\x11\\xb3\\x43\\xa9\\xf2\\x0c\\x44\\xc5\\x77\\xa4\\x52\\xfd\\x54\\xba\\x21\\x02\\x9d\\x47\\x06\\x81\\x3b\\x29\\x87\\xc7\\x6b\\xb2\\x42\\xab\\x26\\x20\\x84\\x3c\\x22\\x60\\xb6\\x69\\xad\\x35\\x8e\\xfe\\xe7\\xf9\\x83\\x0d\\xc9\\xc7\\xd4\\x78\\xa2\\xde\\x4a\\x2c\\xf8\\xc4\\x3d\\xa7\\x70\\xe2\\x88\\xe2\\xed\\xbb\\x6d\\x73\\xbc\\xf2\\xec\\xb0\\x23\\xde\\x6b\\x2d\\xcc\\x6b\\x16\\x6e\\x87\\xa3\\x85\\xeb\\x0a\\xdc\\x30\\x56\\x65\\xc5\\xbf\\xa5\\x7f\\x25\\x0f\\xe2\\x23\\xad\\x7f\\xf4\\x51\\x8d\\xe3\\x9c\\x79\\xe8\\x7d\\xc1\\x01\\xa9\\xfa\\xa6\\x82\\x1a\\x74\\x44\\x2b\\xfc\\xfd\\xf0\\xa9\\xe6\\x3a\\x50\\x9e\\x2a\\x2e\\x76\"},\n{{0x7e,0x7b,0x39,0xaf,0x69,0x38,0x0c,0xf4,0x46,0x60,0xe2,0xc1,0xff,0x30,0x83,0x34,0xe8,0x25,0x0f,0xee,0xb8,0x8b,0xe0,0xd4,0x3a,0xab,0xe5,0xe6,0x8b,0x8e,0xf1,0x71,},{0xcc,0xef,0x9d,0xae,0xd9,0x25,0x23,0x53,0x3d,0x4a,0x2d,0xab,0x6d,0x24,0x19,0xf6,0xd0,0x86,0x04,0xdb,0x64,0xce,0x37,0xe3,0x29,0x04,0xac,0x77,0xb9,0xb4,0xa0,0x1c,},{0x10,0x62,0xa2,0xdc,0x9c,0xd5,0x37,0x96,0x75,0xc0,0x4f,0x5e,0x21,0x33,0x8d,0xcf,0xb7,0x7d,0xfb,0xab,0xce,0xdd,0x62,0xb2,0x60,0x71,0x00,0xd7,0x64,0x9a,0x05,0xe8,0x08,0x71,0xe9,0x61,0x23,0x21,0x4f,0x80,0xf4,0xf7,0x3b,0x0d,0x9b,0x06,0xe2,0xd3,0x1f,0x56,0x11,0x9c,0xea,0x69,0xda,0x23,0x47,0xda,0x84,0xa2,0x75,0xb7,0xb2,0x07,},\"\\xd4\\xa3\\x97\\x6d\\xbf\\x83\\x20\\x18\\x56\\x67\\xb5\\xa8\\x23\\x66\\x40\\xf2\\xeb\\xc9\\xe4\\x5e\\x6d\\x5f\\x2a\\x8d\\x92\\x99\\x79\\x27\\xdd\\x9b\\xc5\\xdb\\x95\\xf4\\x46\\x34\\xbd\\x65\\x4e\\xef\\xec\\xe1\\x0d\\x99\\xd9\\x2b\\x46\\x71\\x57\\x91\\x64\\x50\\x04\\xac\\xcc\\x6d\\x14\\x0f\\x32\\xa1\\xc8\\x72\\xe5\\x4a\\xa9\\xa7\\x49\\x3a\\xf9\\x45\\x88\\xb7\\xbb\\x40\\x0d\\x94\\xd4\\x58\\xd4\\x32\\x92\\x30\\x7c\\x5a\\x1a\\x38\\x82\\xa1\\xc8\\xa6\\xa7\\x8d\\x9a\\x94\\x5f\\x79\\xd6\\x4b\\x32\\x94\\xa2\\x8c\\x3d\\x59\\xd8\\x20\\x22\\xb0\\x09\\xcc\\x4d\\x2d\\xa9\\x3a\\x16\\xb0\\x71\\xc9\\xab\\x8e\\xe9\\xa3\\x66\\x3d\\x72\\xed\\x34\\x4f\\x15\\x1d\\x68\\xc6\\x66\\xa4\\xb4\\x96\\x52\\xd9\\x7a\\x46\\xd1\\x42\\xa4\\x74\\x11\\x27\\xf3\\xc5\\x7f\\x15\\x51\\xc4\\x09\\x76\\xcd\\x13\\x81\\xa8\\x2a\\xea\\xe7\\xbc\\x5a\\xdb\\x39\\x87\\x20\\xeb\\x43\\x3f\\x08\\x99\\x48\\x7e\\xd2\\x37\\x84\\x46\\xb1\\xa8\\xdc\\x6a\\x33\\xfc\\xd4\\x53\\x7a\\x05\\xfb\\x60\\x3e\\xc0\\xa9\\x0a\\x27\\x53\\x23\\x00\\x24\\x2b\\x20\\x00\\x10\\x86\\x21\\xb6\\x5a\\xb0\\x00\\xbc\\x06\\x38\\x15\\x30\\xf6\\x90\\xd7\\xe5\\x6f\\x81\\x60\\x4d\\xac\\xff\\x19\\x10\\x71\\x50\\x40\\x41\\x0a\\xa1\\xf9\\x44\\xc9\\x2d\\xd9\\xbb\\xaa\\x5b\\xd0\\x8e\\xa0\\x0c\\x84\\x42\\xdf\\x94\\xf0\\x85\\xeb\\x3d\\xe9\\x73\\x35\\xb6\\x00\\x5e\\x6f\\x84\\xf8\\x23\\xd4\\x34\\x70\\xab\\x1c\\x67\\xda\\x12\\xad\\x44\\x99\\x36\\xc6\\xb5\\x5f\\x9f\\xfd\\x20\\x3d\\xfd\\x6e\\x3f\\x33\\x30\\x9e\\x8a\\x99\\x45\\xa5\\x93\\x20\\xe6\\x67\\x34\\xc7\\x9c\\x48\\x14\\xdb\\xa5\\xa1\\xc1\\x40\\x95\\xc6\\x29\\x25\\xa1\\xe1\\x73\\x3e\\xfd\\x94\\x81\\x7a\\x25\\xef\\x9e\\x47\\x9d\\xd9\\xcc\\xde\\x6c\\xa8\\xad\\xb7\\xa8\\x05\\x3c\\x1b\\x55\\x13\\x46\\x97\\x50\\x4a\\xf8\\x05\\x3d\\x59\\x5b\\x84\\x46\\x40\\xb6\\x1e\\x93\\x16\\x80\\x75\\x46\\x84\\x50\\xeb\\x5d\\xe0\\x35\\x86\\x97\\xc1\\x04\\xaf\\xa6\\xa3\\x79\\x6a\\x50\\x9c\\x26\\xb4\\xc2\\x77\\xc2\\x3f\\xff\\x42\\xdf\\x14\\x6d\\xe5\\x5e\\x95\\xd0\\xd4\\xb8\\x0a\\x7a\\xa1\\x77\\xd9\\x92\\x27\\xec\\xb2\\xa0\\x59\\x4d\\xee\\xde\\xbb\\x9c\\xaf\\xb1\\xa4\\x58\\xac\\xa8\\x07\\x2c\\xc7\\xd7\\x7c\\x71\\x75\\xf6\\x10\\xca\\x30\\x0e\\xfd\\x7a\\xf9\\x38\\x83\\x46\\x49\\x8c\\x22\\x99\\x15\\x64\\x50\\x0e\\x0b\\x0a\\xa4\\xd2\\x94\\x6f\\x18\\xe6\\xf5\\x37\\x5a\\x84\\x82\\x86\\xf3\\x69\\x54\\xc1\\xca\\x22\\x68\\x4c\\x69\\x28\\xc2\\xa2\\x5c\\x7f\\xe2\\x1a\\xba\\x4a\\x71\\x11\\xd7\\xe0\\x5b\\xc8\\xd7\\x0b\\x3d\\xcb\\x4f\\x6a\\xae\\xc0\\x64\\x84\\x5e\\xef\\x55\\x25\\xf8\\x50\\x24\\xc2\\x57\\x0f\\x3b\\x78\\x69\\x8c\\x4b\\xce\\xc0\\xd7\\x1a\\xad\\x53\\x78\\xd8\\x81\\x9e\\x1f\\xac\\x44\\xee\\x41\\x63\\x70\\x21\\x2d\\xba\\xaa\\xe5\\x4d\\x2a\\xf2\\x93\\x9b\\x82\\xcb\\xaa\\xe7\\xf4\\x2f\\xf4\\x85\\xd4\\x5b\\x3a\\xcc\\x21\\x09\\x0f\\x5b\\xa4\\x1e\\xc0\\xda\\x30\\x9e\\x52\\xef\\x28\\x38\\xd1\\xde\\x47\\x1e\\x0b\\x7c\\xf9\\x85\"},\n{{0xa9,0x04,0x8a,0xf0,0xc2,0x0a,0x12,0x5f,0x5d,0x39,0xc5,0x0f,0x22,0xb8,0x05,0xae,0x74,0x2c,0xf6,0x4f,0x1f,0xe8,0xdf,0xbe,0x8d,0xfd,0xaa,0x51,0x1a,0xaa,0x57,0x6f,},{0x15,0x86,0x55,0xdb,0x94,0xb1,0x5c,0xa7,0x29,0x83,0x87,0x7b,0x6d,0xb2,0x31,0xa5,0x84,0x3d,0xf5,0xdb,0xca,0x28,0x10,0xa7,0xe4,0x96,0xfb,0x59,0xab,0x71,0x04,0xca,},{0x18,0xa3,0x12,0xb2,0x0d,0x86,0xac,0x33,0x9a,0x58,0xef,0x2b,0x85,0x2d,0x46,0x7c,0x23,0xbb,0x2c,0xb1,0x22,0x7c,0xb1,0x53,0x38,0xaf,0x07,0xfd,0x04,0xb9,0xa7,0x11,0xe8,0x56,0xee,0x5b,0x2c,0x82,0xe3,0x66,0xc1,0x7f,0x86,0x17,0x13,0xd1,0x08,0x8c,0x1b,0x21,0x44,0xd1,0xc3,0x7d,0x05,0xbd,0xc0,0x0d,0x73,0x96,0x73,0x85,0x20,0x00,},\"\\x8e\\xef\\x2d\\x9f\\x5d\\x59\\x70\\x99\\x59\\xc9\\x24\\xf8\\x7c\\x22\\x78\\x97\\x67\\x39\\x3a\\x15\\x5d\\x5c\\x87\\xde\\x48\\x8c\\xef\\x50\\xb7\\xbf\\x7d\\xa8\\x70\\xe3\\xad\\xc3\\x00\\xae\\xe6\\x60\\x3b\\x2e\\xf0\\x87\\x64\\xd9\\x9d\\x9e\\x77\\x51\\xe5\\xdc\\xe9\\x2a\\xaa\\x71\\xaa\\x18\\xa6\\x9c\\xc8\\x23\\x13\\x4e\\x85\\x52\\xd9\\x59\\xa0\\xdb\\xb4\\x11\\x17\\xe0\\xa5\\x93\\xc3\\x18\\x33\\xb6\\xec\\x21\\x72\\xdd\\xaf\\xaf\\x78\\x48\\xdd\\xd1\\x8d\\x28\\xd0\\xd4\\xed\\x33\\x23\\x7e\\xc8\\x04\\xf6\\x59\\x38\\xae\\xd8\\xe8\\xa3\\x28\\x0d\\x42\\xe3\\x53\\xd0\\x1b\\xe0\\x18\\x7b\\x13\\x01\\xf8\\x3d\\x89\\x84\\x90\\x67\\xb0\\x4a\\x90\\x31\\xf7\\xe0\\xf3\\x3e\\x34\\x16\\x24\\x0c\\x53\\xd9\\x26\\x5e\\xd0\\x66\\x39\\x59\\x97\\x1f\\x41\\x7c\\xb5\\xf2\\x10\\xcd\\xc5\\xae\\xbc\\xb5\\xe1\\xdb\\x7d\\xfb\\x82\\xdf\\x43\\x58\\x76\\xa6\\xe9\\x8f\\x41\\x5b\\x0d\\xf8\\x69\\xf0\\xd8\\x85\\x15\\x35\\x37\\x56\\x45\\xee\\xf7\\x0f\\xae\\xc7\\x44\\xee\\x0d\\xc3\\xac\\xbc\\xb0\\x40\\xf6\\x8d\\x50\\x2c\\x2c\\x62\\xc8\\xdb\\x45\\xeb\\xe5\\x48\\x54\\xa4\\xb3\\x6f\\x43\\xfe\\xb4\\x9a\\x6d\\x1c\\x2c\\x2e\\xa7\\x99\\x14\\xa7\\xc2\\x3c\\x60\\xba\\xaa\\x67\\xcb\\x47\\xb2\\x17\\x8e\\x12\\xdc\\xe7\\x6b\\x00\\x4c\\x87\\xb7\\xb8\\x34\\x6e\\xfa\\xdf\\x38\\x0b\\x9e\\x1e\\x41\\xf6\\x31\\x48\\xda\\x51\\x78\\x1d\\x75\\xce\\xc0\\x40\\xe4\\x26\\x88\\x20\\x21\\x1f\\x3c\\x46\\x25\\x01\\xd8\\x08\\x99\\x89\\x4e\\x79\\xd6\\x18\\xde\\x42\\x46\\x1d\\x78\\x5a\\xea\\xce\\x53\\xae\\x14\\xb7\\x9d\\x33\\x50\\x1e\\xd5\\x62\\x9b\\xbd\\xd0\\x71\\x28\\x15\\x6d\\xb0\\x72\\x5f\\x5b\\x4b\\xed\\x59\\x3a\\x95\\x29\\x47\\x83\\x03\\x84\\xf6\\x1d\\xf0\\x0e\\xe0\\xaa\\x09\\x90\\x99\\xc3\\xcd\\x97\\x65\\xa9\\xc1\\xc7\\xe8\\xa6\\xa8\\x34\\x30\\xb8\\xd9\\x86\\x7c\\x8e\\x17\\x92\\x0a\\xd0\\xff\\x64\\xd8\\xcd\\x2f\\xf5\\xf1\\x14\\x38\\x8c\\xe6\\xd4\\x3e\\xec\\x17\\x15\\xd0\\x35\\xf0\\x22\\xfa\\x97\\x96\\x9e\\x1a\\x5d\\xd9\\xf5\\x8d\\x89\\x6b\\x17\\xc1\\x22\\x1c\\x9e\\x6c\\x85\\x55\\x59\\x72\\x35\\xee\\xda\\x6e\\xc4\\x1b\\x0c\\x11\\x76\\x12\\xb0\\x0c\\x5f\\x0e\\xd1\\x81\\x6b\\x05\\x73\\x63\\x58\\x27\\x07\\xa8\\xaa\\x0d\\x98\\xd4\\xd4\\xbe\\x5e\\x8f\\xa3\\x2d\\x6c\\x9d\\x27\\x82\\x21\\xef\\x30\\x67\\xb8\\xba\\x15\\x16\\xd9\\xe0\\x51\\xd2\\xf6\\x8b\\x7d\\x1b\\x15\\x1f\\x74\\xa3\\x53\\x4e\\x78\\x12\\xc0\\x51\\xe5\\xf2\\xb6\\x3b\\x30\\x35\\xf8\\xe5\\x70\\x3b\\x5f\\x68\\xfd\\x2d\\x65\\xbb\\x75\\x65\\xe8\\xaa\\x67\\xbf\\xd2\\xa1\\x2c\\xaf\\x0b\\xc5\\x48\\x11\\x97\\xa9\\xff\\x89\\xd7\\x7d\\xf7\\xa0\\xe9\\x65\\x5e\\xf0\\x29\\xb4\\x3d\\xd9\\x06\\xd0\\xb8\\x88\\xe3\\x13\\xae\\x9d\\x1c\\x7e\\x93\\x68\\xa0\\x13\\x52\\xd0\\x0c\\x66\\x80\\xdd\\x0f\\x1f\\x57\\x4a\\x58\\x77\\x34\\x8a\\x7e\\xa2\\xc0\\xb9\\xe8\\xe2\\x72\\x75\\x10\\xbf\\x0c\\x9e\\xf7\\x44\\xf3\\x69\\xeb\\x3c\\x6c\\x4f\\xc1\\x6a\\xde\\xb6\\xe1\\x94\\x5b\\xe8\\x28\\x7d\\x0f\\x30\"},\n{{0xf8,0xc9,0x18,0x3f,0x23,0x10,0x5f,0xad,0x0c,0x6e,0x51,0x03,0x35,0x8b,0x58,0x32,0x88,0xf9,0xff,0x6c,0x7d,0xfc,0x91,0x10,0x6d,0x07,0x98,0x7f,0xf6,0x9c,0xe1,0xeb,},{0x4c,0x79,0x62,0x8c,0x95,0x8c,0xde,0x0c,0xc3,0xcf,0x68,0x60,0x95,0xb8,0xa2,0xf4,0x4b,0x71,0x93,0xc6,0x16,0xf5,0x1b,0x21,0xb6,0x70,0xb0,0x38,0xce,0x6f,0x67,0xff,},{0xc6,0xa8,0xbc,0x7a,0x0d,0x5c,0x61,0x85,0xb6,0xec,0xd6,0x03,0x3e,0x42,0x32,0x1d,0x5c,0x87,0x1b,0xf8,0x89,0xbe,0x72,0xbd,0x54,0xcc,0x00,0x83,0xed,0x60,0xa4,0x70,0xb2,0xcc,0x0f,0xb4,0x68,0x2c,0x89,0x4c,0x75,0xb0,0xdf,0x95,0xf1,0xec,0xfb,0xba,0x2d,0x5a,0xce,0xf3,0xe1,0xaa,0xfe,0x54,0xb9,0xf7,0xe8,0x03,0xa1,0xd0,0x15,0x0a,},\"\\xb1\\xd6\\x05\\x95\\x32\\x3f\\xf3\\xc8\\x44\\x87\\x41\\x90\\xe1\\x83\\x6e\\x41\\x01\\x40\\x9c\\xbc\\xea\\xe2\\x8d\\x5d\\xa8\\x1f\\xad\\x29\\x8f\\xe4\\x7f\\x6b\\xdf\\x44\\x74\\x5b\\x7c\\xd0\\xd3\\x71\\x31\\xc3\\xec\\x36\\x5b\\x92\\xf5\\xa1\\xa6\\x9c\\x09\\xfe\\x2d\\x9e\\x81\\xda\\x10\\xcf\\x19\\xd8\\x5f\\xf5\\xff\\x26\\xf9\\xe7\\xdb\\x9f\\x07\\x93\\xb2\\x5a\\xb2\\x6e\\x6a\\x74\\xf4\\x4e\\xb8\\xc4\\xf0\\x78\\xeb\\x7a\\xd1\\x8e\\x65\\xa1\\x62\\x10\\xd5\\xc8\\x44\\xd3\\xce\\xf7\\x5f\\x1d\\xaf\\x44\\xee\\xe5\\x58\\xf9\\x0e\\x52\\x4a\\x03\\x2b\\x6c\\xae\\x6c\\x8d\\x23\\x36\\x7c\\x28\\xce\\x1c\\x75\\xfc\\x25\\xac\\x87\\x43\\x39\\x77\\xd5\\x97\\x53\\x3c\\x92\\xae\\x65\\xf2\\x91\\x3a\\x18\\x90\\x7a\\xc7\\xd9\\x54\\x3d\\xf2\\x41\\x27\\x74\\x39\\x43\\xfe\\xfd\\x9c\\xf8\\x3e\\xd8\\x33\\xf6\\x3e\\xc8\\x36\\x72\\x33\\xd8\\x97\\xbf\\xa1\\x2d\\x46\\x6d\\x2c\\x4a\\x9a\\xd7\\x0d\\x5a\\x67\\x2f\\xc1\\x07\\x75\\xea\\x2d\\x20\\x4e\\x63\\x6d\\xe7\\x01\\x07\\x88\\xda\\x27\\x1d\\xf0\\x38\\x81\\xa2\\x5c\\x8d\\xfa\\x5a\\xf7\\x3e\\xe5\\x59\\xf8\\x1b\\x52\\x9b\\x35\\xaa\\x12\\x7f\\xdc\\x0e\\xe8\\xfd\\x36\\x9c\\x7a\\x04\\x36\\x62\\x39\\x86\\xaa\\x64\\x07\\xfa\\x67\\xa1\\x42\\x0c\\x46\\xf3\\x21\\x1a\\xb8\\x4f\\x84\\x46\\x6d\\xd5\\x8b\\xb7\\x95\\x08\\xa1\\xfe\\xb0\\xa5\\xa5\\xdc\\x3b\\xb0\\xc1\\xb2\\x48\\x09\\x82\\x62\\xa0\\x64\\xf3\\x7b\\xb2\\xf0\\x19\\xe2\\x90\\xc6\\x0a\\xfa\\xa1\\x20\\x66\\x51\\xa2\\x69\\x7c\\xaa\\xcc\\x3e\\xcc\\x02\\xec\\xfc\\x07\\x7f\\x27\\x2e\\x8f\\x75\\xce\\xa7\\x1c\\x3b\\xc3\\x35\\x6d\\x2b\\x58\\x07\\x27\\x6f\\x19\\x55\\x00\\x1c\\xfe\\x10\\xa6\\x17\\x16\\xb4\\x08\\x2b\\xd6\\xf8\\x4c\\xae\\x4b\\xb0\\xd9\\xa4\\xb7\\x5a\\x4b\\x57\\x62\\xf8\\x10\\x79\\xf1\\x9d\\x7d\\x19\\xea\\xff\\x86\\x31\\xc9\\x24\\x88\\x5b\\xd3\\xa6\\x4e\\x12\\x9f\\x4c\\xf6\\xb7\\x9c\\x7a\\x98\\x29\\x66\\x55\\x11\\xe9\\xd8\\x5c\\x74\\x5e\\xb2\\x2c\\x1b\\x7c\\xb2\\xa1\\x7a\\x49\\xb6\\x28\\x5c\\xce\\x37\\xb3\\xde\\x41\\x59\\x40\\x32\\x83\\x23\\xef\\xe2\\x4a\\x1a\\x07\\xee\\x87\\x46\\x8f\\x65\\x10\\xe4\\x2d\\xd2\\x06\\xfe\\x7f\\x09\\xe3\\xd4\\x33\\xfb\\x52\\x15\\x6a\\xe3\\x48\\x38\\x31\\x15\\x64\\x88\\x63\\xe4\\x5b\\xf6\\xa3\\x71\\xb1\\x7e\\x70\\xe1\\x9f\\x96\\x27\\xd7\\xf0\\xa5\\x8b\\x95\\xc6\\xa4\\x78\\x8d\\x5f\\xd7\\x86\\x2f\\x16\\x12\\xc0\\x34\\x73\\x25\\xb7\\x97\\x65\\x1b\\xe3\\x0c\\x3e\\x1e\\x60\\xea\\x4a\\xe6\\x0b\\x57\\x45\\xa3\\x8b\\x6a\\x9d\\x4e\\xb4\\x93\\x5d\\x6f\\x3c\\xb8\\xd7\\x1a\\xd3\\xf3\\x9a\\xdd\\xa5\\xe4\\x2e\\x22\\x19\\xde\\x0d\\x38\\x19\\x09\\xc9\\xcd\\x31\\x7d\\xd4\\x37\\x94\\x21\\xa2\\xa8\\x42\\x68\\xa7\\xea\\x71\\x80\\xa6\\x4c\\x12\\x9b\\xe1\\xe5\\xe8\\xfc\\xbb\\xf5\\xed\\x65\\x9e\\x9f\\x7e\\x76\\x3c\\xe8\\x4f\\x63\\x0d\\x54\\x07\\x95\\x4f\\x9f\\x75\\x57\\x50\\xa6\\xdb\\xf9\\xf7\\x66\\x07\\x17\\xde\\x8e\\x2a\\xdc\\x1e\\x9a\\xc9\\xee\\x31\\x65\\x4d\\x18\\x37\\xce\\xe3\\x97\\x95\"},\n{{0x16,0x08,0x9a,0x1b,0x93,0x2f,0x8d,0x14,0x99,0x56,0x88,0xb4,0x8d,0xd8,0x41,0xed,0xae,0x3d,0xa5,0xcf,0xd2,0xcb,0x16,0x55,0x53,0x06,0xf3,0xfe,0x8b,0xd3,0xed,0xb9,},{0x9e,0xcd,0x9f,0xdd,0x7e,0x0b,0x92,0x3d,0xef,0xf5,0xd8,0x87,0xb2,0x42,0x58,0x5d,0x9d,0x41,0xcd,0x2c,0x7c,0x10,0xf9,0xc3,0x45,0xb3,0x9f,0x63,0x3f,0x4a,0xb9,0x03,},{0x78,0x78,0xab,0x74,0x1e,0xba,0xe2,0x74,0x7c,0x78,0x97,0xcb,0xb1,0xd1,0x05,0x48,0x2f,0x37,0xbe,0x2f,0x5f,0x91,0x79,0x52,0x32,0xcd,0xfb,0xcc,0xc5,0x26,0x60,0x89,0x18,0xe2,0x75,0x6d,0xdb,0x75,0x36,0xb3,0x68,0x0c,0x16,0x2c,0xf8,0xa1,0xef,0x38,0xa3,0x41,0xb9,0x36,0x2b,0xfe,0x5d,0x46,0x8b,0x4b,0xce,0x21,0xdf,0x23,0x4f,0x0f,},\"\\x58\\x50\\x02\\x32\\x38\\x8d\\x9a\\xa4\\xb5\\xfa\\xf8\\x5b\\x02\\x33\\x24\\x7e\\x71\\x7f\\xd1\\x68\\x40\\xde\\x9b\\xfd\\x0e\\xf8\\x6e\\x01\\xe6\\x13\\x02\\x77\\x55\\x13\\xe2\\x24\\x12\\x5e\\x0d\\x20\\x42\\x0e\\xa9\\x49\\xf6\\xc2\\x64\\x25\\xf7\\x00\\x77\\x91\\x1f\\x97\\x11\\x31\\x0c\\xd6\\xfd\\x8b\\xff\\x27\\xcd\\xea\\x11\\x48\\x0c\\x73\\xe8\\xf8\\xb3\\xc3\\x76\\x41\\xe7\\xe8\\xdd\\x86\\x07\\xc1\\x64\\x02\\x18\\xfe\\xc8\\x0a\\x02\\x09\\x28\\xb9\\x3d\\x4d\\x55\\x7e\\xbe\\x82\\xec\\x0b\\xb1\\x75\\x38\\x86\\x7d\\x2c\\xb1\\x4d\\x44\\xd3\\xea\\x72\\x7f\\xdd\\x52\\x82\\x0b\\x0d\\xa9\\x44\\xde\\x21\\xcd\\x5d\\xa3\\x03\\xd7\\x76\\xfe\\x99\\xcb\\xc2\\x64\\x83\\x65\\xe6\\xa0\\xa9\\x8d\\x4d\\xb1\\x50\\x84\\x26\\x61\\x76\\x8b\\xe8\\x4c\\x68\\x50\\x7a\\x5c\\x45\\xd2\\x07\\x84\\x0b\\x03\\x35\\x37\\x78\\x6c\\xb2\\x1d\\xad\\xad\\x5f\\xba\\xb9\\xc5\\xcf\\xc1\\xe3\\x54\\x7d\\xe5\\x50\\xd3\\x13\\x63\\x1d\\xd4\\xfb\\xb7\\xca\\x8f\\x71\\x93\\x86\\x27\\x60\\x8d\\x2e\\xbf\\x65\\x5d\\xb4\\x32\\x5a\\xbf\\x3e\\xd5\\x04\\xdc\\x18\\x30\\x58\\xf9\\xde\\x1e\\x44\\x93\\x12\\xd9\\x04\\xc8\\x46\\xa1\\x84\\xa0\\x28\\xf3\\x64\\xc0\\x28\\xb2\\x7e\\xb4\\x94\\x64\\x27\\xe3\\x1c\\x21\\xe1\\x05\\x1d\\xf3\\x64\\xd4\\x99\\xf4\\x77\\xbf\\x51\\xe7\\xa8\\x89\\x31\\x83\\xe5\\xec\\xf7\\x7d\\x51\\x3a\\x1a\\x76\\xb1\\xa6\\xfd\\xfb\\x16\\xbe\\x90\\xd7\\x4b\\xe4\\xc4\\x34\\x5a\\x4f\\x9f\\x87\\xee\\x44\\x1a\\x10\\x22\\xd6\\x7e\\xe8\\x44\\x78\\x9f\\x21\\xb0\\xc3\\x1a\\xdc\\xc0\\xd9\\x56\\x63\\xcd\\xfb\\x40\\xa8\\x95\\xb9\\x22\\xdc\\xe8\\x06\\x9b\\x93\\x2c\\x80\\x2f\\xd3\\xab\\x1e\\xf0\\xce\\x6b\\xff\\xdc\\xc5\\x65\\x3b\\x1c\\xd5\\x25\\x7e\\x19\\xa0\\x95\\x16\\x87\\xe5\\x45\\xfa\\xf4\\xaa\\x66\\x06\\x5a\\x55\\xc4\\xb4\\x19\\x1e\\x34\\xe8\\x04\\x7d\\x6a\\x4a\\xb5\\x2d\\x1b\\x06\\xc3\\x69\\xa4\\x26\\xca\\x2d\\x16\\xb5\\x1a\\x02\\x71\\xf2\\x7f\\x8d\\x74\\x4c\\x71\\x1f\\xce\\x3a\\xad\\x9d\\x4a\\xc0\\x38\\xee\\x70\\x0e\\x4e\\x97\\x1b\\x21\\xca\\x48\\x9f\\xf2\\xb8\\xc7\\x78\\xa3\\x72\\x1a\\xdf\\x47\\xc1\\xae\\x5a\\x41\\xb9\\xa2\\x7f\\xa7\\x42\\xfd\\x0f\\x18\\x16\\x4e\\xf3\\xc2\\x6b\\x8a\\xe7\\xd1\\xfa\\x29\\xb7\\xc0\\xcc\\x46\\x83\\xbe\\x65\\x02\\x5c\\x96\\x53\\x7a\\x12\\xd5\\xfc\\xeb\\xbd\\x05\\xe9\\x30\\xc3\\x69\\x3e\\xbb\\xba\\x0a\\x78\\xad\\xf5\\x9d\\x8a\\x3b\\x59\\x8a\\x34\\x8e\\xaa\\x9f\\x47\\xca\\xf5\\x31\\xfe\\x44\\x96\\x52\\xdb\\x5b\\x20\\xd6\\x89\\x94\\xe3\\x5a\\xfe\\xc2\\xc2\\x57\\x09\\x05\\x5a\\x1d\\xe2\\x60\\x82\\xe3\\x91\\x2d\\x49\\x7c\\x64\\x77\\x20\\xa3\\xf8\\x73\\x62\\x14\\x56\\xe6\\xa5\\xb9\\xeb\\x61\\x3a\\xcb\\x43\\xb6\\x6d\\x47\\xd0\\xb9\\x54\\xc6\\x9e\\x8f\\xbf\\x2c\\x5e\\x63\\x4c\\x48\\x6e\\x57\\x24\\x93\\x0e\\x0b\\x56\\xa5\\x16\\x94\\x0c\\x8c\\xb0\\xe7\\x75\\x27\\x4d\\xef\\xf9\\x7c\\xbb\\x77\\x59\\xce\\x90\\xa2\\xb9\\x3e\\x9e\\xfa\\xa6\\x24\\xe6\\xb3\\x8a\\x39\\x84\\x9d\\xca\\x1d\\xf6\\x12\\x73\\x6f\"},\n{{0x94,0xd5,0x09,0x15,0x14,0x4c,0x7e,0x7d,0xd0,0xf8,0x5f,0xef,0x87,0xed,0xdc,0x22,0x06,0xc1,0x56,0x9e,0xd1,0x43,0x1c,0x8c,0x5a,0x15,0x3e,0x32,0xe1,0xcb,0x2f,0xb7,},{0x3b,0xb0,0x98,0xcf,0x16,0x0f,0x3a,0xec,0x31,0x70,0xb5,0x7d,0x6a,0xdd,0x4f,0x56,0x73,0x92,0x70,0xe4,0xb3,0xa8,0xef,0x79,0x66,0xec,0x30,0x61,0x9b,0x29,0x91,0x02,},{0x59,0xa1,0xce,0x55,0xf5,0xa6,0xba,0xdc,0x1b,0x93,0x91,0x26,0x36,0x20,0x54,0x2c,0xfc,0xae,0x87,0xa0,0xf2,0xb9,0x50,0x22,0x50,0xcf,0xe4,0xbd,0xcb,0xf7,0x6c,0x46,0x19,0x77,0xc3,0x34,0xa4,0x8d,0x91,0x6e,0xde,0xbd,0x56,0xc2,0x1c,0xe2,0x17,0xc3,0x5a,0x64,0x44,0xcf,0xbf,0xd3,0xb1,0x1a,0x3d,0x48,0xfa,0x2e,0xdb,0x6e,0xb4,0x0f,},\"\\x4d\\x91\\x5f\\x27\\x33\\x2d\\xd7\\x50\\x51\\x71\\x9a\\x24\\xae\\x8d\\x0e\\x9c\\x30\\xda\\x79\\x09\\x99\\xe2\\x2d\\x9b\\x58\\x7e\\xf2\\x03\\x21\\xbe\\xe4\\xc0\\x7d\\x0a\\x12\\x49\\x4f\\xfe\\x59\\x9f\\x47\\xf9\\x69\\x25\\xf5\\xd9\\x25\\x17\\xfc\\x3e\\x5f\\x04\\x1d\\x0c\\x70\\x9f\\x2a\\x97\\x83\\x12\\x5e\\xec\\xa6\\x65\\x29\\x97\\x20\\x1c\\x42\\x9a\\xa6\\xf1\\xce\\x2f\\x07\\xa0\\xd4\\xa0\\xa1\\x8c\\xf2\\x0b\\x3e\\x9a\\x4f\\x76\\x63\\xea\\x52\\x62\\xca\\xd8\\xf9\\x49\\x41\\x1b\\x05\\xff\\x5c\\x5e\\xdd\\x7b\\x30\\xb2\\x17\\xd7\\x5d\\x8c\\x86\\xc9\\x4e\\x5f\\x92\\xc1\\x67\\x34\\x37\\x4e\\x8c\\xea\\xd6\\x1b\\x0b\\x27\\xbb\\x4b\\xf5\\xf4\\x3a\\x31\\x3c\\x1d\\xd5\\xb8\\x3e\\x0e\\xa9\\x33\\xb6\\xca\\xdf\\xed\\xd7\\xa6\\x4a\\xa5\\xdd\\x5b\\x5d\\x02\\xc6\\x95\\xea\\x20\\xe0\\x91\\xfd\\xaa\\x72\\xef\\x4e\\x7c\\xa4\\x0f\\x38\\x39\\x5b\\xe8\\xbf\\x7a\\x25\\x5c\\x6d\\x06\\xa6\\x32\\xd7\\xd7\\x85\\xd9\\xe0\\x47\\xf2\\x32\\xaa\\x50\\xfa\\x14\\x52\\x9f\\x98\\x6f\\x9e\\xf9\\xd7\\xb5\\x80\\xa0\\x39\\x65\\xb0\\x15\\x47\\x88\\x82\\x2a\\x22\\x5b\\xb5\\xab\\x34\\x38\\xb8\\x9a\\x5c\\x28\\x74\\x4a\\xb0\\xbc\\x0b\\x20\\x14\\xe5\\x79\\x6a\\xcb\\x49\\x35\\xa8\\x1b\\x02\\xa0\\x46\\x32\\xac\\xb8\\x8c\\xaa\\x7e\\x39\\xe0\\x69\\xc7\\xc8\\xe1\\x75\\x82\\x91\\x09\\x4a\\x53\\xe3\\x62\\xfc\\xed\\xaa\\xa5\\x83\\xec\\xa7\\x66\\xef\\xeb\\xf6\\x9b\\x38\\xe8\\xcd\\xe9\\xce\\x58\\xe0\\x12\\xc6\\x0e\\xc8\\x8e\\x8c\\x42\\xbe\\xad\\xfa\\x83\\x8c\\xfe\\x44\\x0f\\xa0\\xc0\\x1d\\x65\\x9c\\x96\\x34\\x57\\x6d\\x7d\\x7a\\x2d\\x3a\\x04\\x4f\\x99\\xc6\\xe4\\x26\\x3d\\x4c\\x0b\\x37\\x4a\\x38\\x8a\\x2a\\xcf\\x38\\xef\\xf2\\x9c\\x77\\x7e\\x9d\\xaa\\x60\\xd5\\x98\\x03\\x5a\\x7d\\x9e\\xdf\\x67\\xa5\\x02\\xc3\\xf5\\x73\\x20\\x7b\\x11\\x9c\\xac\\xac\\x3f\\xa7\\x1e\\x2a\\x02\\x07\\xc6\\x01\\xcc\\x0d\\xd6\\x37\\xef\\x56\\x2b\\xac\\xc3\\x5c\\x57\\x04\\x27\\x38\\xf1\\xf5\\x58\\x15\\xa5\\x26\\x80\\x82\\xcd\\x6a\\x50\\x82\\x92\\xfa\\x29\\xe3\\x4e\\x96\\x45\\xd8\\x7a\\x1a\\x2b\\x6e\\x58\\xad\\xb7\\xf4\\xa5\\x7f\\xbb\\x53\\xe9\\x21\\x3e\\xf3\\xdc\\x87\\x3f\\x29\\x39\\x62\\x58\\xa1\\xea\\x54\\x6f\\xb5\\x95\\x2c\\xe3\\x43\\xce\\xe9\\xbb\\xb9\\x0c\\x1c\\xda\\x72\\xc6\\x5a\\x7c\\x8e\\x40\\x31\\x2b\\x32\\x8e\\x23\\x19\\x20\\xc2\\x33\\x07\\x7d\\xca\\x34\\xd0\\x4f\\x9d\\x89\\xda\\xa9\\xa2\\xf4\\x34\\x59\\x16\\x5f\\xd1\\x02\\xff\\x56\\x43\\xc7\\x17\\x52\\x30\\xb3\\x9e\\xc7\\xc3\\xc4\\x75\\x65\\x0e\\xf1\\x31\\x60\\x9d\\x32\\x20\\xf5\\xa2\\x94\\xa4\\x03\\xb1\\xe1\\xc4\\x2c\\xfa\\x16\\x2c\\xd4\\x26\\xf0\\xae\\x43\\xfd\\x6b\\x7a\\xb5\\x47\\xa6\\x2b\\x7d\\x5f\\x84\\x74\\x03\\xc4\\xe5\\x98\\x79\\x53\\x87\\x71\\x58\\xcf\\xde\\xe2\\x3c\\x04\\xf7\\x51\\xc7\\xc8\\x6d\\x07\\x8e\\x82\\x4c\\xa6\\x3b\\x5e\\x65\\x54\\x3e\\x97\\x8b\\x6b\\x0c\\xc6\\x89\\xef\\x66\\x44\\x12\\xb0\\x1b\\x8f\\xf1\\x65\\xe7\\xdb\\xde\\x3c\\x09\\x9b\\xf4\\xf3\\x4e\\xbd\\xdc\\xb4\\xc4\"},\n{{0x0d,0x81,0x92,0x6f,0x51,0x3d,0xb4,0xb2,0x5d,0xfa,0x1e,0x52,0xb5,0xdc,0xa6,0x78,0xf8,0x28,0xa6,0x1c,0x7c,0x91,0x3c,0x82,0x82,0x47,0xc2,0xeb,0x04,0x22,0xb7,0xd1,},{0x0f,0x32,0x41,0x1e,0xf9,0x1d,0x4e,0x4b,0x69,0x41,0xdf,0xca,0xab,0x14,0x2e,0xf3,0xbe,0xc1,0x60,0x98,0x39,0x93,0xa5,0x26,0x2c,0xcf,0x27,0xfa,0xdd,0x2a,0xf8,0x90,},{0xe0,0xcb,0x6c,0x71,0xeb,0xf8,0xd7,0x05,0xe5,0x0c,0xad,0x9f,0x0b,0x8c,0xba,0x3e,0xcf,0x4b,0x9e,0x37,0x93,0x40,0x00,0x92,0xaa,0x5b,0x12,0x1e,0x7d,0xbb,0xc8,0xbe,0xa7,0x1d,0xf2,0x95,0x28,0xca,0x9b,0x47,0xab,0xf8,0x7c,0x19,0x8a,0x8d,0xc4,0xe1,0x4d,0x51,0x80,0xce,0x93,0x2d,0xd2,0x11,0x4a,0x3c,0xda,0xa5,0x55,0x2c,0xc2,0x05,},\"\\xa9\\x38\\x37\\x52\\x2f\\x7e\\xc2\\xe9\\x3a\\x2e\\x4b\\x4c\\x8b\\x46\\xde\\x92\\x6a\\x81\\xad\\xa2\\xd2\\x48\\xbc\\xd3\\x3b\\x39\\xb6\\xc9\\x5f\\xb6\\x2a\\x61\\xdb\\xbe\\xda\\x1a\\xa8\\x5a\\x21\\xd9\\xb9\\x6a\\x08\\x51\\x0d\\x8d\\x3a\\x65\\x8c\\xf3\\x20\\xa1\\x09\\x28\\x69\\x59\\x99\\xd2\\xc0\\xd6\\x05\\xc7\\xf9\\x5a\\x12\\xf5\\x6a\\x87\\x18\\x50\\x7d\\xb0\\xf4\\x97\\xe3\\xea\\xd6\\x13\\x13\\x2a\\xb0\\x92\\xcb\\xf1\\x9d\\x22\\x60\\x35\\x86\\x30\\x35\\x8d\\x9b\\x26\\xe6\\x8d\\x50\\xdd\\xae\\x37\\xc8\\xaf\\x0b\\xb7\\xd2\\x74\\x1f\\xd2\\x92\\x9c\\x21\\x27\\x9a\\x78\\xd1\\x0e\\x2c\\x5f\\x3c\\x5b\\xf4\\xa4\\x2a\\x36\\x17\\x03\\x6d\\x54\\x74\\x36\\x47\\x76\\x5a\\xfd\\x8c\\xd9\\x10\\xf8\\x1b\\x38\\xce\\xd7\\x23\\x90\\x63\\x0e\\xe6\\x89\\x44\\xa3\\x7d\\x29\\xc2\\xfe\\xca\\xda\\x1c\\xc5\\x9e\\xc5\\x44\\x07\\x5b\\xdb\\xc1\\x4c\\x63\\xc6\\x23\\x4b\\x88\\x40\\x49\\x00\\x0c\\x27\\xc7\\x34\\x06\\x03\\x56\\x04\\xfc\\xa8\\x76\\x0b\\x49\\xa5\\xe2\\x10\\x9e\\xf9\\x12\\x85\\xad\\xc4\\xec\\x48\\xc8\\x19\\xd6\\x2d\\x94\\x8f\\xac\\xa9\\x0f\\x62\\xcf\\xae\\xf0\\xb0\\x7d\\x6f\\xe5\\x76\\xd7\\x62\\xbf\\xd0\\xee\\xf9\\x4c\\xf6\\xb5\\x33\\x2c\\x4d\\x42\\x25\\x11\\x60\\x7f\\x2f\\xac\\xc7\\xac\\x04\\x6a\\x59\\xb9\\x61\\x7e\\x83\\x83\\xd1\\x02\\x9c\\xc9\\x1a\\xc5\\x92\\xb5\\x20\\x84\\x41\\x30\\x32\\xbe\\x84\\x1b\\xaa\\x9b\\xf9\\x62\\x51\\xa6\\xbd\\xa6\\x71\\xd4\\xcd\\x4b\\x12\\x5d\\xa6\\x58\\xa4\\xe5\\xa5\\x0f\\x44\\x28\\xee\\xbf\\x26\\x14\\xfb\\x0c\\xe5\\xfe\\xbe\\x80\\xf7\\x21\\xa5\\xf4\\xc0\\x32\\x55\\x06\\xd2\\x7a\\x8d\\x31\\xe3\\x3d\\x86\\x25\\x38\\x70\\xdd\\x63\\xc0\\x8e\\xdc\\x73\\x02\\xb2\\x80\\xe9\\xb9\\xbd\\xc2\\x8b\\xee\\xf0\\x5c\\x7d\\xcb\\x30\\xd4\\xc1\\x62\\xe9\\xbe\\x83\\x2e\\x1c\\x78\\x5e\\x37\\x55\\x12\\x18\\x42\\x1e\\xec\\x85\\x2c\\x42\\x98\\x21\\x3b\\x2f\\x27\\xf8\\xf8\\xc7\\x06\\xd3\\x91\\xb9\\xc6\\x9a\\x56\\xdb\\x7c\\xe5\\xd8\\x15\\x48\\xfc\\xa5\\xfe\\xd4\\x56\\xf2\\xd8\\xaf\\xd0\\xb7\\x5f\\x79\\xf8\\x58\\x68\\x31\\x6f\\x4a\\x09\\x21\\xf0\\xc6\\x63\\x99\\x26\\x51\\x6b\\x3c\\x3e\\x52\\xa9\\xcb\\x22\\x55\\x45\\x46\\xef\\x70\\xe1\\x4c\\x77\\xec\\xbd\\xcd\\x5c\\x0d\\x59\\xa8\\x17\\x69\\xb3\\x0d\\x5d\\x13\\x1f\\x2f\\xb4\\x49\\xc9\\x96\\xb8\\xde\\x8a\\xc7\\xf8\\x08\\x4f\\x84\\x99\\xe1\\xa5\\x6f\\x7c\\xd2\\x9d\\xb6\\xaa\\xef\\xcc\\xae\\x8a\\x60\\xe7\\x56\\x16\\xa1\\xf7\\x02\\xc3\\xbc\\x8d\\xea\\xa1\\x00\\x4a\\x8d\\xae\\x03\\x92\\xa5\\x9c\\xee\\x54\\x81\\x0c\\x6e\\x94\\x0e\\xee\\x25\\xfb\\x2e\\x5d\\x57\\x32\\x67\\x04\\x4b\\x89\\x3f\\xfd\\xe3\\x78\\xfe\\x75\\xac\\x26\\x13\\x37\\x3d\\x84\\xa0\\xca\\x81\\x87\\xaf\\x4a\\x33\\x58\\xe5\\x0a\\x99\\x4e\\xd0\\x33\\x67\\xde\\x64\\x5e\\x10\\x39\\x0f\\xea\\x4c\\x33\\xbb\\x1a\\x6c\\x0c\\x39\\x85\\x8b\\x8d\\xb4\\xa6\\x9f\\xe8\\x94\\xa4\\x22\\x3d\\x45\\xaf\\x69\\xb3\\x6c\\x61\\x17\\xc4\\xdc\\x25\\xde\\x49\\xa6\\x30\\x17\\x00\\x2b\\xa9\\xae\\x55\\x1e\\xf9\"},\n{{0x6c,0x8c,0x53,0xb5,0x6b,0xbc,0xb4,0xc0,0xa2,0x5d,0xc4,0x0c,0x18,0x24,0x0b,0x6a,0x5c,0x75,0x76,0xb8,0x9d,0xde,0x45,0xef,0x13,0xfb,0x15,0x8e,0xa1,0x7f,0x8e,0xd9,},{0x23,0x8e,0x51,0xd6,0xa4,0x4f,0xa7,0xac,0x64,0x26,0x88,0x01,0x26,0x1e,0xa3,0x5b,0x62,0x63,0x8a,0x00,0x6c,0xc4,0x52,0xbd,0xdb,0x9f,0x16,0xfc,0x58,0x03,0x06,0x0c,},{0x4b,0xf1,0xe7,0xd4,0x9c,0xd4,0xd5,0xc3,0xc1,0xfd,0x4a,0x4b,0xc4,0x8f,0xf6,0xb6,0xe5,0x2f,0xd9,0x51,0x0a,0x41,0x18,0x12,0x29,0x69,0x96,0xe4,0xfe,0xc5,0x6b,0xe4,0x45,0x14,0xc5,0x67,0xd1,0xd3,0x34,0x77,0xbd,0x5d,0xc0,0x83,0xc3,0x95,0x8b,0xd9,0x5b,0xfe,0x59,0x9c,0x15,0x3f,0x21,0xae,0x26,0x25,0x29,0x67,0xb7,0x32,0x60,0x03,},\"\\xb6\\x0d\\xf2\\x94\\x4b\\xa0\\x15\\x75\\x98\\x02\\xd3\\xc5\\x87\\xbc\\xfe\\xbe\\x52\\x1a\\x7e\\x77\\xb9\\x98\\x5b\\x76\\x1c\\x96\\x76\\x45\\x4d\\x24\\xa6\\x64\\xaf\\x0b\\x0d\\x44\\x22\\x5a\\x55\\x75\\x12\\xe1\\xc1\\xcd\\x7d\\xd8\\x33\\x5c\\x8f\\x6a\\xdf\\x92\\x8e\\x18\\xf8\\x9f\\xd5\\xee\\xdf\\x6f\\x41\\x1d\\xcd\\xaf\\x99\\x69\\x12\\xe8\\xc3\\xe2\\x3d\\x1c\\xb9\\x5e\\xca\\x4b\\x9e\\x24\\xe7\\x53\\x9c\\x3b\\x98\\xbf\\x3d\\x07\\xec\\x25\\x13\\x92\\x09\\x6c\\x19\\xac\\x53\\x74\\xdc\\xba\\x52\\x61\\x32\\xb6\\xd9\\xbb\\x8f\\x6c\\x85\\x9c\\xe9\\x85\\xd5\\x84\\xc7\\xbb\\xa5\\xb0\\x2a\\x81\\x03\\x4b\\x6d\\x8b\\x52\\x1b\\xd2\\x80\\xe5\\x0d\\x77\\xda\\xa2\\xb2\\x41\\x3e\\xd6\\x79\\x83\\x4f\\x81\\x61\\xd5\\xd0\\x57\\x3b\\xdd\\x47\\x6a\\xc3\\xcd\\x0a\\x3a\\x7d\\x8d\\xb4\\x53\\x34\\xe8\\x9c\\x00\\xab\\x66\\xbc\\x36\\x8a\\x07\\xb4\\x23\\xe2\\x46\\x43\\x46\\x36\\x27\\x2a\\xa4\\xe4\\x63\\x7a\\x53\\x06\\xb2\\xc3\\x39\\x79\\x92\\x78\\x1f\\x30\\x23\\x8d\\xe7\\x9e\\xc1\\x04\\xac\\xc7\\x20\\x0d\\xef\\xad\\x96\\x08\\x83\\xd3\\x91\\x44\\x3e\\x70\\xef\\xbd\\x22\\xf1\\xcf\\xce\\xec\\x51\\x12\\xfe\\x9e\\x8e\\x13\\xbb\\x94\\x1c\\x08\\x34\\x68\\xdd\\x71\\xff\\xca\\x97\\x6c\\xd5\\x1c\\xe1\\x61\\x79\\x31\\x10\\xef\\x00\\xaf\\xf5\\xee\\x2c\\xcb\\x77\\x06\\xa5\\x12\\xb8\\x5b\\xeb\\x94\\xac\\x49\\xd1\\x9a\\xfb\\x63\\x33\\x65\\x5c\\xf3\\xae\\xa5\\x35\\xa6\\xf9\\xc7\\x5e\\x03\\x48\\x41\\xe7\\x63\\xc5\\xa2\\x49\\xb4\\x70\\x4e\\x1b\\xe7\\x8b\\x0e\\xca\\xc6\\x80\\x2c\\x34\\x3c\\x1b\\x7e\\x7b\\x57\\x70\\xde\\x4c\\x93\\xa3\\xa7\\x9c\\x46\\xe6\\x83\\x5d\\xa8\\xae\\x5d\\xb3\\x83\\x8e\\x17\\x96\\xb5\\x64\\xa4\\x80\\xa4\\xf2\\x90\\xb6\\x0a\\x1c\\x63\\xa7\\x25\\xff\\x3f\\xef\\x43\\x4d\\x2a\\x0b\\x3d\\x89\\x31\\x97\\x87\\x42\\xb5\\x25\\xc8\\x3b\\xae\\x67\\x94\\xae\\x64\\x19\\x37\\x94\\xb3\\x70\\xc2\\x89\\xba\\x35\\xed\\x79\\xd3\\x70\\x72\\xa8\\xdc\\xfc\\xad\\xb4\\x6d\\x5f\\xfa\\xee\\xba\\x1b\\xfd\\x4f\\x87\\xd7\\x66\\xb5\\x04\\xe6\\x2b\\x4a\\xcd\\xd7\\x74\\x46\\xe7\\x9b\\xa9\\x94\\xd6\\xdb\\xf4\\x76\\x5e\\xbd\\x74\\xb0\\x36\\x51\\x00\\xda\\x56\\x16\\x2c\\x36\\xfe\\x5a\\x95\\x07\\x7f\\x6b\\x42\\x65\\xe8\\x17\\x96\\xb4\\xa5\\x74\\x43\\x78\\x29\\x70\\xb9\\x6c\\xb4\\x56\\x9b\\xa9\\x85\\xc5\\x5f\\xe3\\xa7\\x18\\x38\\x0b\\xca\\x39\\xf1\\x66\\x24\\xf8\\xe4\\x7c\\xc6\\x3c\\x1b\\x6f\\xa1\\xbd\\xe1\\xae\\xba\\x9c\\x51\\xf9\\x4b\\x70\\x2b\\x13\\x10\\x8c\\xc1\\x48\\x1d\\x42\\xe6\\xfa\\x98\\x1e\\x3e\\xbf\\xe0\\x64\\xd2\\xdc\\xa7\\x42\\x0c\\x74\\x59\\x57\\x92\\x31\\x2a\\xe3\\xfb\\x91\\x01\\xd4\\xb6\\x6d\\x99\\x16\\xdf\\xd6\\xc1\\x3a\\xe8\\x83\\xe6\\x61\\xc6\\x28\\x22\\x8b\\xe9\\x79\\x4c\\xf6\\x03\\x45\\x07\\x6d\\xb2\\x61\\x84\\xb6\\x17\\xe2\\x72\\x29\\x8c\\xd4\\x18\\x3f\\x27\\xbd\\x52\\xd4\\x05\\x10\\xbb\\x01\\x5d\\x20\\x97\\xd4\\xcc\\x76\\xe7\\x6c\\x0a\\x62\\xbb\\xfd\\xaf\\x53\\xc7\\x26\\x87\\x75\\xbb\\xfb\\xdb\\x88\\x70\\xeb\\x9b\\xab\"},\n{{0x69,0xb3,0x20,0xfb,0xd4,0x77,0x40,0x30,0xa2,0x97,0x67,0xa0,0xcc,0x15,0x50,0xd1,0x0b,0x74,0x9b,0x44,0xd6,0x19,0xd4,0x1d,0xce,0x11,0x46,0xf7,0xac,0x80,0xa7,0x55,},{0xdc,0x50,0x8a,0x79,0xc6,0xb8,0xab,0x86,0x6c,0xd1,0x17,0xa5,0xa8,0x4d,0xd9,0xd9,0x31,0xfd,0xa4,0x50,0xbe,0xc2,0x93,0x35,0x34,0x4d,0x0d,0x21,0x92,0x16,0xd6,0x5e,},{0x69,0x7d,0x4d,0x89,0x7e,0x0e,0x2c,0xc0,0x2b,0xc1,0xc2,0xdd,0xa5,0x7f,0x0d,0xda,0x62,0x0b,0x37,0xe8,0x61,0x82,0x2b,0xb7,0xf1,0xa7,0x01,0x93,0x5e,0x95,0x9e,0xa0,0xd8,0x45,0x3f,0x74,0x6f,0xb9,0x2c,0x08,0x7e,0xd6,0x5d,0x98,0x0e,0xea,0x1d,0x6f,0xdb,0xf2,0x3e,0x99,0xb2,0x89,0xaa,0xe0,0xdc,0xbb,0x12,0x8e,0xf8,0x36,0x64,0x0a,},\"\\x21\\x7e\\x33\\xf8\\x86\\x22\\xc9\\x6f\\x8d\\x09\\x2c\\x9e\\x26\\x66\\x4f\\xe9\\xef\\xc0\\xd8\\xd2\\xeb\\x59\\xa0\\x36\\xfa\\x46\\x4c\\xee\\x65\\xce\\x44\\x89\\xca\\xf9\\x03\\xdc\\xe1\\x7a\\xfa\\xfb\\xc4\\xf1\\x8d\\xc9\\xbb\\xfd\\x6c\\x1a\\x4b\\xe7\\xb8\\x34\\x85\\xa6\\xca\\x94\\x7d\\xef\\xb1\\xd3\\x51\\x25\\xd0\\x77\\x39\\x62\\xa3\\x44\\xa3\\x8b\\x6d\\xca\\x9a\\x40\\xc3\\x1c\\x1c\\x4e\\xb2\\xd7\\xf6\\x81\\x8f\\x97\\x8e\\x57\\x3d\\x66\\xb9\\x90\\x92\\x1b\\x92\\xb7\\x77\\x47\\x1a\\x4f\\x6f\\x05\\x47\\x7e\\xbc\\x35\\x3a\\xce\\x1d\\x86\\xb0\\x0c\\xc2\\x51\\x77\\x7a\\xaf\\x6a\\xf3\\xaa\\x11\\x79\\xbf\\xf7\\x8d\\xf5\\x04\\x8e\\x5e\\xf2\\x99\\x68\\x67\\x0e\\x53\\x54\\x83\\x56\\x8d\\x6b\\xb1\\x6d\\xa8\\x29\\x56\\x8f\\x81\\xc7\\x99\\xb9\\xaf\\xd4\\xaa\\xd6\\xef\\x08\\x52\\x52\\xc0\\xce\\x3a\\xc0\\x1a\\xc2\\x1a\\x9e\\xa6\\x9b\\xd5\\x8e\\xad\\xc6\\x69\\x68\\xf5\\x5d\\xee\\x38\\x6b\\x65\\x3f\\x33\\x34\\xef\\xc3\\x98\\xef\\x3c\\x37\\xa3\\x8c\\xe9\\x3b\\x21\\xf1\\x07\\xcc\\x54\\xde\\xc2\\x6f\\x53\\xfe\\xe5\\x60\\x4e\\xb0\\x9a\\x36\\xaf\\xe6\\xb6\\x65\\xb6\\x32\\x4a\\x84\\xc7\\xda\\x7b\\x7d\\xd0\\x1d\\x92\\x78\\xe4\\x72\\xf1\\x5a\\x5c\\xe9\\xff\\x0f\\xd9\\x3d\\x0a\\xa0\\x60\\x4d\\xd2\\xdf\\x8d\\x5b\\xf6\\xa9\\x12\\x73\\x4e\\xc5\\x1d\\xe7\\x7f\\x0c\\xe0\\x99\\xba\\x11\\x67\\x02\\x10\\xa6\\xa2\\x06\\x10\\x6b\\x0e\\xde\\x2d\\xed\\x85\\x8a\\x6b\\xc4\\x11\\xe7\\x61\\x3e\\x6f\\x80\\xe1\\xaa\\x52\\xc3\\x23\\xe3\\x0f\\xa8\\x49\\x95\\x1c\\xc9\\xb7\\x76\\xe4\\xcc\\x58\\xc9\\x0c\\xfc\\x8f\\x44\\x2d\\xf6\\x41\\x51\\xa7\\xfd\\x4a\\x3d\\xd6\\x1a\\x43\\x36\\xda\\x21\\xd0\\x39\\x44\\x63\\x5d\\x3f\\xd6\\x67\\xbe\\x74\\x1e\\xf4\\x5b\\x1f\\x7c\\xb2\\x76\\xd9\\xf4\\xde\\x81\\x07\\xde\\x64\\x58\\x2f\\x79\\x17\\xc6\\xea\\xb3\\x8e\\x0a\\x88\\x90\\xa4\\xbe\\xe4\\x8b\\xc9\\x26\\x17\\xa3\\x61\\xcc\\x7b\\x1d\\x25\\xe0\\x89\\x45\\x3c\\xe0\\xa5\\x25\\x44\\xf8\\x68\\xdc\\xb3\\x24\\x9d\\xe7\\x61\\xe7\\x9d\\xf6\\x3e\\xfa\\x07\\x94\\xe3\\xc4\\x61\\x8c\\x55\\x47\\x53\\xee\\x28\\x1c\\x52\\xac\\x8a\\xd7\\x8d\\x53\\x38\\xf0\\xda\\xc3\\x60\\xa7\\x69\\x38\\x1b\\xb4\\xa3\\x9f\\x19\\x0b\\x88\\x7b\\x47\\x23\\x80\\x6a\\xc4\\xa4\\xf2\\xff\\x30\\x4b\\xc6\\xf9\\x33\\x7a\\xb5\\x4c\\x86\\x6e\\x6b\\xa5\\x1d\\xf5\\x0c\\x43\\xea\\xb5\\x2e\\x2b\\x39\\x79\\x4c\\x99\\x17\\xe0\\xc3\\x14\\x33\\xf0\\x36\\x81\\xd2\\xf1\\xd9\\x3a\\x04\\x36\\x01\\x8c\\xaa\\xae\\x20\\x20\\x6a\\x34\\x58\\xad\\x6c\\x03\\x7a\\xcb\\x51\\x1e\\xf1\\x28\\xf6\\xdc\\xd0\\x53\\x05\\xf0\\x70\\x49\\xa1\\x3b\\x6c\\x6c\\x3c\\x5b\\x81\\x70\\xf1\\x58\\xc8\\xf1\\x2d\\x46\\xe1\\x60\\x93\\x1b\\xa1\\x8b\\xd5\\x9a\\xe1\\x29\\xec\\x07\\xa0\\x65\\x5f\\xa4\\x82\\xeb\\xbd\\x3b\\x85\\x0d\\x36\\xb8\\x32\\xbb\\xb7\\x75\\xf5\\x38\\xe3\\xc1\\xb3\\xa4\\x3e\\xcf\\x94\\xca\\x63\\x0c\\xa1\\x5d\\x50\\x28\\x13\\xee\\xd3\\xe3\\x5e\\x8f\\xd2\\x3d\\x2a\\xb6\\x38\\x60\\x04\\x27\\xd1\\x59\\x7c\\xb2\\x9d\\xa2\\xa5\"},\n{{0x66,0xda,0x8b,0x25,0x4a,0x37,0x06,0x73,0x78,0xf6,0x81,0x38,0xaf,0xed,0xd6,0x64,0x96,0x59,0x6a,0x05,0x85,0x52,0x4c,0x71,0x6b,0xde,0x2b,0x31,0x24,0xc3,0xe7,0xd1,},{0x85,0xbd,0xe2,0x8a,0x92,0x2a,0xb5,0xee,0xaa,0x4a,0x62,0x94,0x52,0x1a,0x2c,0xca,0xc0,0xef,0x23,0x03,0xdc,0xdf,0x8c,0x7f,0xee,0x22,0x8f,0xb4,0x55,0x20,0x12,0xe7,},{0x40,0x82,0xa5,0xbc,0x73,0x0f,0xb5,0x4b,0x6b,0xd0,0xbc,0xd2,0xa0,0x44,0xed,0x5d,0x3d,0x32,0x7d,0xc1,0x9c,0xea,0xc8,0x82,0x5e,0x62,0x9b,0x9e,0x64,0x23,0xcb,0x1c,0x61,0x42,0x36,0xf0,0x97,0xa6,0xb7,0x3d,0x47,0x39,0x47,0xcb,0x81,0xc4,0xe2,0x70,0x85,0x2e,0xe5,0xf1,0x3a,0x5b,0x03,0xdc,0x18,0xe1,0xc9,0xc2,0x7a,0x9a,0x68,0x02,},\"\\x3f\\xae\\x36\\x63\\x88\\x37\\xd0\\xed\\xc8\\xdc\\xee\\x51\\x7e\\x43\\xc4\\x88\\xed\\x57\\xfa\\x6c\\x98\\x53\\xa7\\x45\\xaa\\xed\\xfb\\x10\\x9e\\xc1\\x40\\x9f\\xb8\\xa2\\xfe\\x51\\xd2\\x3e\\x0d\\xd9\\xfb\\xfd\\x94\\xf9\\x1c\\x18\\xe6\\x11\\x4d\\x80\\x89\\x01\\xbf\\x61\\x7d\\x26\\x67\\xce\\xeb\\xd2\\x05\\xc5\\xc6\\x6f\\x5d\\x75\\x34\\xfd\\x2e\\xc3\\x3d\\xbf\\xe5\\x80\\xad\\x91\\x9f\\x50\\x42\\x04\\xea\\xf2\\x42\\xaf\\x87\\x00\\xb1\\x38\\xcf\\xbe\\x0f\\x37\\x29\\x19\\xc0\\x6b\\x86\\x1a\\x27\\xd7\\x20\\xd0\\x9d\\xf2\\x0f\\x4f\\xb7\\xb7\\x48\\xe7\\x18\\xb0\\xfc\\x48\\x6d\\xbd\\xfc\\xb6\\x94\\xcb\\x3f\\x14\\x20\\x03\\x5a\\xc1\\xbe\\x55\\xd3\\x1f\\x30\\xf9\\x97\\xa0\\x43\\xd0\\x47\\x08\\xa5\\xc5\\x42\\xee\\x37\\xc0\\xf7\\xfe\\x0b\\x32\\x11\\xd1\\x8a\\x87\\x03\\x3d\\xcb\\x15\\xc7\\x9e\\x66\\x81\\xc4\\x97\\x05\\x93\\xd3\\x2a\\x13\\xc4\\x8f\\x0a\\x3a\\xf8\\xbf\\xc1\\x36\\xe0\\xf9\\xb5\\x6a\\x12\\x3b\\x86\\xc4\\xc6\\x40\\xb6\\x50\\xcb\\x7d\\xee\\x9a\\x89\\xe8\\x2a\\xee\\xee\\x77\\x3b\\x5c\\xb0\\x32\\xfc\\xa4\\x1c\\x20\\xc4\\x07\\x32\\x8b\\xfe\\xd2\\x92\\x44\\xe4\\x60\\x55\\xa8\\x31\\x14\\x61\\x4d\\x3d\\xb5\\x65\\x81\\x60\\x4b\\x11\\x5f\\xba\\x14\\xf6\\x18\\xe1\\x02\\xa1\\xe1\\x6c\\xb0\\x36\\xea\\x69\\xdf\\x92\\x75\\xb9\\x77\\xa0\\x85\\x81\\x18\\xc9\\x1a\\x34\\xb9\\xa8\\x51\\x9b\\xd0\\xda\\xc3\\xb6\\x14\\x34\\xea\\x08\\x8f\\x38\\x1b\\xa0\\x8b\\xc1\\x58\\x31\\x89\\xa4\\xa7\\xc8\\xb6\\xad\\x18\\xf7\\x32\\xd7\\x4e\\xff\\x3a\\xce\\xf4\\xb6\\x90\\x4d\\xf5\\x8c\\x64\\x69\\x43\\x21\\x51\\x37\\x2d\\xf9\\x32\\x7a\\xe7\\x1a\\x0f\\x35\\x6c\\x94\\x46\\x8d\\xcf\\xc2\\xe4\\xa5\\xc0\\xe4\\xec\\x0b\\x16\\x6d\\x90\\xcd\\x46\\x5f\\x92\\x60\\xeb\\xd6\\xa7\\xa6\\x2c\\xe6\\xc7\\x15\\xbc\\xc7\\x15\\xbe\\x0c\\x7e\\x1f\\x28\\xc4\\x45\\x60\\x12\\xd3\\x31\\x77\\xa7\\xd4\\x11\\x3c\\x9a\\x5a\\x22\\xac\\xfa\\xf2\\xd6\\xb6\\x33\\x09\\x07\\x8f\\xc1\\xb1\\xba\\xa8\\xf3\\x6c\\x7e\\x86\\x6c\\x1f\\x97\\x2a\\x65\\x00\\xa5\\xee\\xa7\\x92\\x01\\x65\\x1a\\x73\\x05\\x20\\x8b\\x6c\\x93\\xc4\\x92\\xbc\\x77\\xca\\xcb\\xc9\\x9c\\x9c\\xde\\xd1\\x79\\xe6\\x64\\xa2\\xf4\\xe1\\x69\\x38\\xcc\\x26\\xfc\\xa8\\xb4\\x33\\xeb\\x80\\x12\\xf7\\xb3\\xad\\x19\\xba\\x1f\\xb8\\x58\\xfe\\x4a\\x00\\xfb\\x3d\\x1f\\x8f\\xd0\\xed\\xdf\\x0c\\x37\\xdc\\xdb\\x2e\\x5d\\x35\\xc2\\x54\\x6f\\x22\\xe8\\xc0\\xf8\\xce\\x90\\xe2\\xdf\\x8a\\xbf\\x24\\x82\\x7a\\x01\\x9b\\x2c\\x33\\xfc\\x59\\x0b\\xbe\\x71\\x2f\\x01\\x92\\x87\\x00\\x2b\\xc2\\x21\\x7c\\x0d\\xc0\\x93\\x1d\\xc8\\xed\\x8f\\x50\\xbb\\x44\\x2f\\x8b\\x2d\\xe2\\x78\\x57\\x36\\x2c\\xe5\\xa9\\xfd\\x97\\xf0\\xfd\\x1b\\x2b\\x92\\x51\\xca\\xd2\\xa4\\xac\\xa1\\xa9\\x4d\\xe2\\xe9\\x53\\x90\\x2d\\x72\\x28\\x14\\x24\\x07\\x44\\x3b\\x1d\\x51\\x71\\x07\\x64\\x8a\\x7b\\xab\\x83\\x07\\x49\\x87\\xd0\\x97\\x8b\\xc6\\x1d\\x41\\x9b\\xc8\\x45\\x91\\xc9\\x69\\xc3\\xd6\\xf4\\xe8\\x6f\\xc4\\x73\\x87\\x37\\xbc\\x05\\x58\\x75\\x5c\\x11\\x0a\"},\n{{0x27,0x65,0x48,0x29,0x0f,0x3e,0x0f,0x90,0x05,0x15,0xdc,0x63,0x36,0x6c,0x03,0xfe,0x0f,0xc6,0xee,0x13,0x0c,0x21,0xfb,0x60,0xa4,0xdf,0x9c,0xf4,0x64,0x79,0x7c,0xda,},{0x7e,0x2a,0x35,0x78,0x00,0x0a,0x08,0x7e,0xdc,0xc9,0xe9,0x4f,0xde,0x50,0x9f,0xc4,0xbe,0x05,0xca,0x0d,0xd0,0x90,0xdf,0x01,0xae,0x11,0x21,0x12,0x35,0x36,0xf7,0x2a,},{0x88,0xa1,0x46,0x26,0x1a,0xd1,0x11,0xc8,0x0f,0xa4,0x29,0x95,0x77,0xe7,0x10,0xf6,0x85,0x9c,0xf0,0xd1,0xca,0x80,0xe5,0x12,0xa5,0x52,0xc7,0x25,0xb8,0x38,0x40,0x37,0xee,0xcf,0x64,0x65,0xce,0x97,0x58,0x5c,0x9d,0x66,0x0a,0x41,0xab,0x91,0x04,0xe5,0xf7,0xc9,0xb2,0xf8,0xec,0x6f,0xb2,0x1f,0x1d,0xdd,0x50,0xd6,0x5b,0x9b,0x66,0x0e,},\"\\xf0\\xdb\\x44\\x2d\\xe2\\x9a\\x7a\\x1d\\xed\\x55\\x0d\\x12\\x00\\x02\\xcc\\x12\\xab\\xff\\xf9\\x8b\\x1f\\x57\\x6d\\x65\\xbd\\xe1\\x6d\\xea\\xba\\x68\\x7e\\x4e\\x0b\\x0d\\x5a\\x87\\x48\\xd7\\x50\\x3d\\xa2\\x96\\x9c\\x64\\xd6\\xa7\\xc2\\x8d\\x27\\xb6\\xc9\\x3a\\xd2\\x57\\xce\\x32\\xec\\xda\\xee\\x37\\x5f\\x43\\xff\\xf9\\x7c\\x43\\x2d\\x45\\x3f\\x71\\x96\\xc7\\x09\\xc3\\xbd\\xfb\\x73\\x88\\xd4\\xd8\\xea\\xf1\\x39\\xf1\\x82\\x94\\x0c\\xe1\\x7b\\x45\\x52\\xe2\\xd2\\x0a\\xed\\x55\\x57\\xba\\x4d\\x2a\\xcb\\xf8\\x45\\x73\\x0c\\x0a\\x66\\xb4\\x5b\\x40\\x95\\x0b\\xaf\\x6a\\x94\\x64\\x37\\xaf\\x6c\\x9e\\x3b\\x33\\xa7\\x9e\\x04\\xdc\\xea\\xe5\\x7c\\x2a\\x54\\x95\\x42\\xea\\xbd\\x21\\x6b\\xf1\\x39\\x48\\xd4\\x1f\\xfb\\x94\\x83\\xfe\\x29\\x80\\x1f\\xc8\\xc1\\x78\\x28\\x40\\xde\\xeb\\x3f\\xb4\\xda\\x31\\x92\\x78\\x5b\\xca\\x13\\xed\\x0a\\x9e\\xff\\x57\\xd6\\x13\\x6b\\xaf\\xbf\\x9d\\xec\\x69\\x7b\\x83\\x24\\x47\\xb2\\xb6\\xe7\\x30\\xfa\\x7f\\x99\\x95\\xba\\xc6\\xb7\\x83\\x2e\\xaa\\x09\\x90\\x5e\\xe4\\x9d\\x46\\x5a\\x5e\\xe4\\x50\\xf5\\x2d\\x1a\\x6d\\x36\\x4c\\x61\\x81\\x44\\xe8\\x86\\xe8\\xef\\x63\\x3d\\xc7\\x9d\\x0a\\xf8\\x93\\xd1\\x6b\\x3e\\xed\\xa0\\xfe\\xfe\\xfd\\x87\\x59\\xf2\\xa0\\xda\\x19\\x30\\x17\\x0d\\xd1\\x9e\\xb7\\x8f\\x0d\\x7a\\x7b\\x74\\x51\\x54\\x03\\x37\\x5a\\x95\\xbd\\xbc\\xce\\x01\\x8b\\xc1\\xed\\xb0\\x8d\\x89\\x7b\\xb7\\x98\\xa9\\x5e\\x7e\\x86\\xa5\\x2a\\xf3\\xd9\\xb8\\xa4\\xa1\\x4b\\x03\\x71\\xd6\\x34\\x98\\xdc\\xb2\\x01\\x62\\x48\\xeb\\xd0\\xbe\\x80\\x0e\\x9f\\x21\\xd5\\x49\\xe5\\xe0\\xe7\\xb4\\x89\\x5c\\xa5\\xcb\\x72\\x5a\\x0c\\xab\\x27\\xda\\x8a\\x8b\\x12\\x99\\xbe\\x38\\xa4\\x26\\x09\\x00\\xae\\x10\\xdf\\x5b\\xab\\xa1\\x1a\\xe2\\xba\\xb7\\x17\\x9d\\xd8\\x45\\x39\\x69\\x42\\x9c\\xcc\\x4d\\x41\\x60\\x55\\xf2\\xbc\\xb9\\x3c\\x1c\\xac\\x6d\\x7e\\x80\\x4c\\xf8\\x12\\xdf\\x14\\x62\\xf2\\x2e\\xe9\\xe8\\x33\\xa9\\x76\\x9e\\x8e\\x67\\x75\\x50\\x40\\x2c\\x40\\x94\\xdf\\x21\\x2f\\xd2\\xc5\\xfc\\xc0\\x9a\\x72\\xc7\\xce\\x00\\x77\\x51\\x00\\x73\\x09\\x0d\\x0e\\x63\\xdb\\x63\\x7d\\x43\\xd4\\xc2\\x1f\\x86\\x19\\xd3\\x4d\\xa5\\xdb\\x08\\x03\\x3f\\x68\\x6c\\xe8\\xb8\\xa0\\x82\\x12\\x22\\xf9\\x54\\x34\\xac\\x4e\\x6f\\x70\\x30\\x94\\xed\\xde\\xd6\\xfb\\x1b\\x84\\x6e\\x97\\x96\\x50\\x97\\x9d\\x3c\\x77\\x45\\x3f\\x40\\xf7\\xfe\\xe7\\xc3\\xe8\\x8a\\x96\\xfd\\x1d\\x70\\x2e\\x81\\xc2\\xa4\\xf3\\xf3\\x75\\x3c\\x79\\x64\\x84\\x2d\\xfd\\x9d\\x39\\x58\\xa7\\x43\\xda\\x06\\x3d\\x1d\\x64\\x8e\\x51\\xb2\\x10\\xa2\\x8e\\xd2\\x48\\x7f\\x14\\xd5\\xf1\\xbc\\x6f\\x33\\x9b\\x2d\\xd1\\x7a\\x66\\x1c\\x39\\x73\\x6d\\xa9\\x9e\\x4a\\x4f\\x07\\x36\\x03\\x42\\xd2\\x37\\xe3\\x81\\x3e\\xa3\\x99\\x8d\\x66\\xeb\\x31\\xa2\\xd7\\x08\\xaf\\x06\\x5c\\x32\\xb9\\x27\\xf7\\x57\\xc3\\x7a\\x80\\x06\\x60\\x67\\x4e\\x97\\x17\\xba\\x58\\xf2\\x80\\xeb\\x2a\\xa4\\x64\\xfa\\x74\\x40\\x21\\x08\\xa5\\xd5\\x66\\x2e\\x8d\\x0f\\xea\\xf3\\x29\\x68\\x7a\"},\n{{0x97,0x2c,0x06,0x16,0x55,0x6e,0xf2,0x2c,0x21,0x48,0x68,0xfd,0xd8,0x22,0xc5,0x57,0x39,0xe1,0xf9,0x6a,0x93,0xae,0x83,0x51,0x2a,0xfd,0xa9,0xca,0x7a,0xa7,0x4c,0xd2,},{0x9e,0x1c,0x6d,0x41,0x07,0xf8,0xab,0x81,0x61,0xc5,0xdb,0x5b,0x88,0xa3,0x7c,0xa1,0xde,0x9f,0x4e,0x29,0x13,0x67,0xab,0xb1,0xef,0xc8,0x4f,0x83,0xf7,0x07,0x69,0x53,},{0x54,0xdd,0x06,0xfb,0xb3,0xd7,0xc6,0x3f,0x8c,0xda,0xf7,0x83,0xc2,0xd7,0xba,0xc1,0x6b,0x4c,0x82,0x6e,0x2d,0x1b,0x18,0x07,0xc8,0x4e,0x04,0x9f,0x64,0xe2,0x71,0xb2,0x1c,0xfa,0x3e,0x37,0xc3,0x44,0x26,0x02,0x87,0x80,0x5d,0x71,0x88,0x06,0xb6,0x2c,0x56,0xb4,0x7f,0x6d,0x5c,0x50,0x81,0x25,0xc9,0xfb,0x5d,0x5e,0xa3,0x5f,0xd5,0x01,},\"\\x86\\x89\\xe2\\xf9\\x5c\\x8f\\xd5\\x0d\\xc4\\x46\\x64\\xa1\\x8f\\xb1\\xa9\\xf2\\xc8\\xf3\\xee\\x73\\xc0\\xf9\\x58\\x7e\\xe2\\x8b\\xfa\\x35\\xc9\\x23\\x1c\\x75\\xbf\\xd3\\xd9\\x53\\x41\\x74\\xe5\\xad\\x3f\\xa9\\xf0\\x92\\xf2\\x59\\x94\\x2a\\x0f\\xf0\\xba\\x2c\\xa2\\xcb\\x59\\x04\\x3d\\x19\\x2c\\xa8\\xe3\\xc8\\x86\\x9b\\xed\\xd2\\x35\\x4c\\xbc\\x5a\\xc7\\x82\\xd7\\x27\\xc0\\xb6\\x94\\x07\\xf6\\x8d\\x13\\x26\\xdf\\x65\\xa6\\x0c\\x4d\\x32\\xf8\\x7f\\x19\\xa1\\x0f\\x3d\\x76\\x5f\\xf9\\x23\\x43\\x4f\\x55\\x11\\xd1\\x34\\xd3\\x97\\xc4\\xfe\\xf6\\xbb\\x19\\x53\\xab\\xfc\\xe6\\x08\\x27\\xc3\\x59\\xaa\\x4b\\x54\\xf9\\x12\\xaa\\x8b\\x17\\xb8\\x3d\\xcc\\x7e\\x3b\\xcb\\xc5\\x05\\xba\\x04\\x6f\\xe5\\x7c\\x16\\xda\\xcf\\x4e\\xe2\\xfa\\xd5\\x38\\xbc\\x06\\x81\\x7c\\x9b\\x9d\\x8d\\xbc\\x5f\\x9d\\x9b\\xbf\\x9f\\x4a\\x93\\x4f\\x14\\xa4\\x2c\\x29\\xe0\\xe2\\xf3\\xa4\\x9f\\x46\\xb2\\x0e\\xe7\\x6c\\xfe\\x20\\xde\\xa1\\xe9\\x74\\x50\\xeb\\x6a\\x8f\\xda\\x04\\x81\\x68\\xdd\\x82\\x78\\x10\\x20\\x7f\\x00\\x5a\\x3c\\xaa\\x93\\xca\\x11\\xf4\\xee\\x60\\x8a\\x7a\\x93\\x55\\x49\\x43\\x13\\xae\\xc8\\xd7\\x07\\x5a\\xfc\\x94\\xc7\\xcc\\xcc\\x75\\xc2\\x31\\x9b\\xb4\\x58\\xc0\\xce\\x37\\x3e\\x9d\\x00\\x7f\\x75\\x3b\\x33\\xb5\\x27\\x93\\xd5\\x84\\x96\\xb2\\xd2\\x5c\\xd1\\xdc\\xd7\\x83\\x2a\\xac\\x5d\\xdb\\x38\\xf4\\xdb\\x19\\xc4\\x27\\x21\\x9e\\x1a\\x04\\x20\\xea\\xd4\\x7b\\xa9\\x5a\\xb6\\xd8\\x9c\\x65\\x93\\x90\\x41\\xcc\\x73\\x4c\\x08\\xeb\\x6b\\x47\\x6c\\xaf\\x7f\\xc7\\x6c\\x59\\x8d\\x94\\x7f\\xf4\\x44\\xb1\\x07\\x70\\xf6\\x29\\x45\\xae\\x65\\x04\\x4f\\x78\\x09\\x82\\x99\\xe2\\x62\\x6b\\x63\\x8a\\x73\\x28\\xd1\\xb7\\xda\\xa5\\x88\\x9e\\x8d\\xb9\\x4b\\xbf\\xf2\\xde\\xd6\\x2e\\x14\\x46\\x37\\x60\\x22\\x7c\\x3f\\x32\\x6e\\xd4\\x93\\x56\\x5d\\xdf\\x0a\\x17\\x61\\xb8\\xe4\\xbb\\x7d\\x24\\x10\\xfa\\x0f\\xdb\\xf3\\x56\\x84\\x39\\x7e\\xef\\xea\\x95\\x89\\x58\\x89\\xa0\\xa9\\xdf\\xfc\\x5e\\x02\\xc0\\x92\\x38\\x3b\\x7c\\xe7\\x4d\\x2d\\x90\\x93\\x99\\x16\\xf2\\x6b\\x71\\xaf\\xd2\\x65\\xf8\\xbe\\xc7\\x4f\\x0d\\xe2\\x47\\xc9\\x64\\x39\\x05\\x58\\x3d\\xf3\\xce\\xe2\\x35\\x37\\xd6\\xb5\\x68\\xc8\\x33\\x8c\\xe5\\xfe\\xe4\\x2f\\x7d\\xd1\\x5d\\xad\\x52\\x47\\xf0\\x09\\xac\\xbf\\xd5\\xd7\\x69\\xb6\\x36\\x69\\x59\\xcd\\x0a\\xe1\\x50\\xf5\\x8f\\x7c\\x80\\xfa\\x10\\xd9\\x89\\xed\\x90\\x11\\x93\\x72\\xe5\\xfe\\xa5\\xda\\x48\\xa4\\xe8\\xea\\x9c\\x72\\x78\\x75\\xdc\\x4a\\x20\\x05\\xb0\\xdc\\x2e\\x3f\\x69\\x7c\\x0c\\xe0\\xa4\\xbd\\xb2\\xf7\\x50\\xc0\\x4f\\xbc\\x0c\\x27\\xd0\\x2d\\xd8\\x28\\x6e\\x54\\xc9\\xc3\\x95\\x9b\\x6f\\xfb\\xdb\\x1d\\xe2\\xaf\\xfe\\x9e\\x78\\x26\\x51\\xe5\\x16\\x8a\\x50\\x0a\\xfe\\xd0\\x37\\xb3\\xe1\\x79\\x0d\\xdd\\x59\\x38\\x51\\xa6\\xa6\\xcc\\xca\\x9f\\xff\\xb4\\xa9\\x9e\\x27\\xdf\\x43\\x81\\x88\\x71\\x53\\x6a\\xb0\\x4f\\x14\\xa0\\x6a\\x1c\\x7c\\xb4\\x7b\\xed\\x62\\x41\\xce\\x74\\x30\\xad\\x3e\\x64\\x0a\\x72\\x67\\x52\\xfa\\x06\\xa9\"},\n{{0xe0,0x40,0x5d,0x37,0x89,0x3e,0x89,0xf5,0x38,0x11,0xd6,0xd4,0x46,0xe1,0xf1,0x93,0xf5,0x1a,0xfa,0x1b,0xbb,0xa7,0x25,0xf9,0x5e,0xb4,0x80,0x33,0x42,0x4a,0x25,0x09,},{0x45,0x10,0x4d,0x59,0x5e,0x44,0x3e,0x8c,0xe6,0x54,0xde,0x9d,0x65,0x50,0x54,0xbf,0x0a,0x99,0xd3,0x56,0x13,0xd7,0x7d,0x57,0x45,0x4c,0xa2,0xd1,0xc8,0x99,0xb5,0x17,},{0x77,0xdd,0xd4,0x91,0xca,0x66,0x2e,0xbf,0xfb,0x12,0xf7,0xf4,0x92,0xd7,0xfb,0xc1,0xa1,0xb4,0x47,0xf6,0xc8,0x59,0x98,0xf2,0xf7,0xcc,0x9a,0xdc,0xe6,0x7d,0xe6,0x3b,0x6e,0xeb,0xd0,0x81,0x17,0x84,0x5a,0x03,0x02,0xf7,0x34,0x97,0x14,0xba,0x9d,0xb2,0xaf,0x58,0x04,0x8b,0x85,0x83,0x7d,0x76,0x60,0xec,0x3d,0xeb,0xee,0xe2,0xd0,0x0f,},\"\\xdf\\x58\\xc4\\xfd\\x07\\x02\\xa2\\x0f\\xaf\\xa3\\xd1\\xd4\\xfe\\x7d\\x85\\x93\\x8b\\x12\\x0f\\xc1\\x1e\\x8d\\x41\\xb6\\x01\\xf0\\xe6\\x0e\\x42\\x23\\x6a\\x49\\xf1\\x26\\x81\\x3b\\xd5\\x12\\xee\\x71\\x35\\x90\\x61\\xe1\\x3e\\xb3\\x14\\xd4\\x17\\xf5\\x6d\\x6d\\x56\\x02\\x85\\xfa\\x89\\x91\\x21\\x32\\x84\\xc4\\x2b\\xc2\\xce\\xf2\\xdc\\x93\\x7b\\xdc\\x0b\\x5e\\x9d\\xc2\\x26\\x9a\\xfa\\xb3\\x2d\\xb3\\x0e\\x68\\x49\\x85\\x59\\x51\\xcf\\xbc\\x53\\xec\\xfa\\x01\\x64\\x38\\x63\\xe0\\x32\\x89\\x95\\xfe\\x85\\x0c\\x0d\\xb5\\x54\\x21\\xbf\\xa5\\x64\\x60\\x1b\\x8c\\x9d\\xb7\\x55\\x2c\\x7e\\x6a\\xa7\\xad\\xfa\\x15\\xa5\\x80\\x21\\xa8\\x42\\x66\\xe9\\x59\\x5c\\x65\\xfc\\xa4\\xa1\\x5f\\xa7\\x0f\\x55\\xf5\\xd2\\x12\\xc9\\xe2\\x77\\xff\\xb8\\x30\\xf4\\xca\\xd1\\x86\\x1f\\x3f\\x49\\x5a\\x9d\\x67\\x2f\\x56\\x91\\x31\\x06\\x39\\xc1\\x2d\\xcd\\x07\\xe3\\xef\\x17\\xa2\\x37\\x50\\xbc\\xb4\\x6b\\x7a\\xd7\\xea\\xc4\\x62\\xeb\\x51\\x22\\x25\\xf3\\xbe\\x7e\\x32\\xf8\\xf4\\x98\\x7a\\x11\\xdf\\x34\\x11\\x66\\x06\\x2b\\x43\\xc6\\x3a\\xb8\\x58\\xa6\\x00\\x49\\x76\\x67\\xfb\\xb8\\x8e\\x93\\xc7\\xe2\\xe0\\xaa\\xb4\\x1c\\x09\\xc0\\x23\\xeb\\x90\\x2e\\xc3\\xba\\xf6\\x79\\xe2\\x5b\\x96\\xe1\\x06\\x92\\x1a\\x91\\x4f\\xd5\\xde\\x20\\x0a\\x47\\x88\\x9d\\xe2\\x3e\\x7b\\x65\\xd0\\xcc\\xdf\\x0c\\x29\\x03\\x64\\x67\\xa1\\x21\\x0c\\x00\\x30\\x30\\x9a\\x2d\\x04\\xec\\x25\\x6d\\x5a\\x4d\\x8b\\x97\\xd4\\x6a\\x3e\\x15\\xf3\\x45\\xb6\\x67\\x17\\x08\\x03\\xcd\\xac\\xf6\\xcb\\x48\\xad\\xd0\\xa1\\x34\\x62\\xdd\\x30\\xfa\\x06\\x2b\\xd4\\x56\\x66\\x41\\xda\\x07\\xd7\\xf6\\x1e\\x06\\x36\\x86\\xed\\xd9\\x6b\\xfe\\x8f\\x97\\xb9\\x86\\xb7\\xc0\\xe4\\x42\\x49\\xcd\\x2d\\x73\\x17\\x47\\x29\\x99\\xb8\\xee\\x4e\\xa8\\x0c\\x90\\x2f\\x3b\\x18\\x89\\x36\\x71\\x2e\\x89\\xd8\\xbf\\x02\\xce\\x8a\\xe7\\x7b\\x6b\\x31\\xab\\xb0\\x63\\x20\\x65\\x45\\x5d\\xdd\\x9f\\x9d\\x1c\\xd9\\x53\\xa4\\xa4\\x9a\\xac\\x1a\\x15\\x16\\x9e\\x68\\x7d\\x4f\\xd3\\xf7\\xc2\\xed\\xfb\\x3a\\xab\\xc3\\xb6\\x61\\x55\\xf7\\xd3\\x15\\xf8\\xa2\\x94\\xfa\\xdd\\xff\\xdb\\x49\\x51\\x36\\x7a\\x0c\\xb8\\x70\\x75\\x9e\\x85\\xa8\\x38\\xaf\\x66\\xba\\x3f\\xc1\\x03\\xda\\x2b\\xab\\xc3\\xf3\\x81\\x69\\x6e\\xf8\\x88\\x2d\\x85\\xa8\\x27\\x8d\\x5f\\xac\\x3a\\x72\\xf1\\x6e\\xb1\\x19\\xee\\x99\\x00\\xb1\\xfd\\x98\\x6c\\x2a\\x9f\\x94\\xee\\xd8\\xe0\\xd4\\xf2\\x73\\x69\\x7e\\x43\\x63\\xa9\\x75\\xff\\x6a\\x7b\\x80\\xd5\\xb4\\xec\\x53\\x55\\xbf\\x63\\xb4\\x2b\\x71\\xcd\\x48\\x42\\x40\\x1d\\x38\\xb5\\xe0\\x0c\\xc9\\x7b\\xfd\\xa4\\x0e\\x45\\x66\\x53\\x68\\x3b\\xc8\\xe6\\xda\\xde\\x7d\\xcf\\x98\\x5a\\x97\\xb0\\xb5\\x77\\x6c\\x4d\\x72\\xca\\x13\\xa1\\x47\\x4e\\x4e\\xb2\\xec\\xcf\\xcd\\x42\\x87\\x86\\xdd\\xd0\\x24\\x6d\\x73\\xa6\\x37\\x7a\\x79\\xcb\\x8d\\xa7\\x20\\xe2\\x26\\xc1\\x94\\x89\\xbd\\x10\\xce\\xdd\\xe7\\x4b\\x49\\xfa\\xc2\\xcf\\xa2\\x07\\x12\\x9c\\x6a\\x10\\x8a\\xa1\\x64\\xbe\\x9d\\x80\\x9c\\x4d\\x31\\x14\\x73\\x60\"},\n{{0x57,0x56,0xe7,0x52,0xdf,0xf6,0x9e,0x3e,0xed,0x84,0x8e,0x4a,0x49,0xc7,0xa8,0xba,0xca,0x12,0x15,0x4f,0x94,0x31,0xde,0xc3,0x56,0x26,0xef,0x8d,0x75,0xa4,0x45,0x14,},{0x59,0x10,0xef,0x00,0xa5,0xb3,0x54,0x14,0x3c,0x46,0x56,0x1d,0xa6,0x2c,0x41,0xaa,0x13,0xd2,0x9c,0x18,0xdc,0x61,0x53,0xbf,0x8e,0x50,0x2e,0x01,0x14,0x00,0x77,0x28,},{0x81,0x57,0xd8,0x33,0x4d,0xed,0x1a,0x32,0x69,0x9b,0x35,0x0a,0xc0,0xd4,0x12,0x00,0x28,0xcd,0x8e,0xf8,0x18,0x94,0x48,0x93,0x48,0x50,0xe5,0x0e,0xe4,0x99,0x9d,0x8f,0xa2,0xcd,0x25,0x76,0x46,0xd9,0x2f,0xba,0x5d,0x66,0x2a,0x82,0x3e,0x62,0x20,0x8a,0xb4,0xfb,0xe0,0x17,0x14,0xa8,0x48,0xa0,0xb9,0x0b,0x55,0xad,0xcd,0x24,0x69,0x02,},\"\\xeb\\x21\\x90\\xa3\\x21\\x9c\\x79\\x2b\\x66\\x66\\xb2\\x75\\x27\\x33\\xad\\x9f\\x86\\xfc\\x39\\x01\\x55\\xc4\\xb4\\x38\\xbe\\x19\\x69\\x59\\x38\\x3b\\x25\\xf3\\xa7\\x49\\x53\\x0d\\x5a\\x4b\\x15\\xeb\\xe2\\xc1\\x8d\\x99\\x17\\x8e\\x6d\\x45\\xbb\\x4a\\xa2\\x12\\x0f\\x95\\xa3\\x52\\xe0\\x40\\x6c\\x63\\xac\\x86\\x72\\x48\\xd9\\xef\\xba\\x12\\x42\\x31\\x06\\x48\\x73\\xc8\\x2f\\xe9\\x95\\xdd\\x03\\x1c\\x7c\\xbc\\x7d\\x15\\xec\\x19\\x1f\\xbb\\x6c\\x47\\x4d\\xc4\\xc7\\x77\\xe8\\xf4\\x57\\x84\\x1e\\xb4\\x62\\x48\\x41\\xc1\\x52\\xd1\\x5e\\xde\\x26\\xe7\\x84\\x79\\xa6\\xa2\\x5f\\xfa\\x33\\x55\\x63\\xf1\\x06\\x4e\\xf0\\x95\\x58\\xb9\\x10\\xe2\\x60\\x84\\x18\\x82\\x0f\\x49\\x55\\x4b\\x67\\x0c\\x6b\\xab\\x34\\xd1\\xd6\\x09\\x84\\xde\\xa5\\x0e\\xd6\\xa3\\x75\\xf4\\x5a\\x74\\xbe\\xad\\xfb\\x04\\xbd\\x93\\x00\\xbd\\x59\\x4e\\x2e\\x20\\xea\\x5d\\x30\\x52\\xbb\\x7d\\xdc\\x51\\xa9\\x49\\xa0\\x04\\x79\\x72\\x68\\x2e\\xbe\\x66\\xd3\\x8a\\xac\\x62\\x92\\x72\\x70\\xde\\x42\\x15\\x0d\\x58\\x22\\x1d\\x03\\xb8\\xac\\xe3\\x58\\x99\\x33\\x48\\x7b\\xf2\\x3d\\x29\\xc5\\xc2\\xc8\\x43\\xae\\xfa\\x2e\\x1c\\xa2\\x2f\\x9d\\x16\\x80\\xf8\\x0c\\x76\\x6d\\x14\\x3c\\xe5\\xec\\xef\\x25\\x3a\\x74\\x5c\\xb7\\x1e\\x72\\xf6\\x50\\x4a\\xd9\\x11\\xf7\\xcb\\x4a\\x81\\x9c\\xd0\\x74\\x86\\x3a\\x92\\x70\\x69\\x29\\xa3\\x14\\x2f\\x8d\\xb7\\xac\\x16\\x41\\x02\\xac\\x2c\\xa0\\xd2\\xe1\\x9a\\x72\\x5e\\x1b\\x5f\\x81\\xf4\\x43\\xc7\\x3e\\x04\\x84\\xf2\\x6a\\x45\\xa3\\xae\\xf8\\x4f\\x1f\\x3f\\xa0\\x4a\\x4a\\xc6\\x95\\xd2\\xda\\xb6\\xef\\xba\\x45\\x6a\\x28\\x1a\\x39\\x73\\xcc\\x18\\x6e\\x68\\x0a\\x66\\xdf\\x52\\x1a\\x4d\\x1f\\x9e\\xdf\\x4d\\xfb\\x27\\x4a\\x42\\x70\\x97\\xbf\\x86\\x32\\x81\\xcf\\xb0\\xed\\x80\\xf8\\xd7\\x67\\x66\\x38\\xd6\\xcd\\xac\\x93\\x78\\x43\\xef\\xbc\\xfc\\xe9\\x1d\\xe1\\xdf\\x6c\\x52\\xb5\\x94\\x57\\x1b\\x93\\x15\\x60\\x0e\\x4b\\x65\\x52\\xde\\xfb\\x84\\x37\\xa8\\x07\\xba\\x21\\x29\\x8e\\x3d\\x97\\x22\\x12\\xba\\x31\\x46\\x92\\x91\\x7f\\x40\\x07\\x53\\x11\\xac\\xd0\\x09\\x39\\x52\\x41\\xb9\\xf1\\xb2\\x56\\xc5\\x15\\x73\\x5d\\xc6\\x74\\xf8\\xe8\\x66\\xd1\\xee\\xb4\\xc3\\x28\\x54\\x8a\\xee\\x71\\x23\\x1c\\x4c\\x9d\\x5b\\xd2\\x2e\\x39\\xde\\x88\\xd1\\x9f\\xab\\xf4\\x9f\\x0b\\x98\\x69\\xcb\\xf8\\x35\\x21\\x4b\\x15\\x52\\x2a\\x93\\xd3\\xa5\\x00\\x7b\\x11\\xf0\\xb5\\x0e\\x52\\x28\\xd4\\xee\\xbb\\x45\\x71\\xb3\\x5d\\xa8\\x4f\\x4f\\x68\\x7e\\x3f\\x43\\x79\\x3d\\x54\\xf3\\x82\\x5b\\x37\\xa5\\x09\\xea\\x56\\x4b\\xdf\\x21\\x7f\\xf4\\xad\\xf6\\x84\\x7b\\xbe\\xa4\\x31\\x6a\\x1d\\xbc\\xc7\\x44\\x8e\\xcd\\x53\\x63\\xea\\xab\\xc1\\x28\\xde\\xcf\\x05\\x4e\\xe1\\xa0\\xee\\x2d\\x87\\x19\\x79\\xf8\\xa6\\x3b\\x26\\x92\\xb0\\x9f\\x6e\\x98\\x6a\\x13\\x8e\\x7f\\x68\\xf6\\x0a\\xa4\\x26\\xa1\\xc9\\xb0\\x1a\\x49\\x02\\xe1\\x3b\\x17\\xbc\\x83\\x12\\x41\\x0c\\x28\\xbe\\xd2\\x9b\\x60\\x1b\\x0f\\xc9\\xf3\\xbc\\x2d\\x22\\x3f\\x87\\x52\\x51\\x10\\x0f\\x86\\x9c\\x6b\\x58\\x44\"},\n{{0xb9,0x04,0xac,0xb1,0x9e,0x5c,0xf8,0x72,0xd3,0x64,0x0c,0xd1,0x8d,0xdf,0x3c,0x0b,0x66,0x57,0xe0,0x11,0x7c,0xe6,0x59,0xdb,0xf5,0x02,0x59,0x01,0x5d,0x3f,0xbf,0x32,},{0xe0,0x4a,0x8a,0xa5,0x6d,0x18,0x18,0x48,0x3b,0x10,0xd0,0xa7,0xc9,0x19,0xe1,0xd5,0xd8,0x00,0x1e,0x35,0x51,0x0e,0x1e,0xc6,0x2f,0x71,0x14,0xdb,0xe8,0x1a,0xe0,0xbe,},{0x9a,0xaf,0x8a,0xc9,0x71,0x40,0xd5,0x50,0x8d,0x58,0xf5,0xac,0x82,0xb7,0xfd,0x47,0xe6,0xb1,0xf6,0x8a,0x7c,0x78,0xa2,0xac,0x06,0xf0,0x41,0x6e,0xf8,0xe9,0x91,0x95,0x3f,0x62,0xc4,0x7f,0xd5,0xfb,0xc6,0xc1,0xe0,0x1b,0xae,0x1c,0x92,0xa3,0x3e,0xf5,0x2b,0x7e,0xfa,0x5f,0x17,0xbb,0x86,0x33,0xbd,0xc1,0xae,0xeb,0xce,0x31,0x8f,0x0f,},\"\\x83\\xf4\\x12\\x4d\\x5a\\xf9\\x55\\x13\\x9b\\x1b\\xc5\\x44\\x1e\\x97\\xc5\\xfa\\xc4\\x91\\xb4\\xea\\x91\\x14\\x07\\xe1\\x54\\x20\\xa0\\x34\\x7e\\xd7\\xfa\\x1f\\x88\\x19\\xe3\\x6c\\x8e\\xd5\\x74\\x0c\\x99\\xd4\\x50\\x5a\\x78\\xb6\\x19\\xd5\\x60\\x74\\x9a\\xf5\\x0b\\x05\\x73\\x51\\x08\\x16\\xd6\\x13\\x22\\xcd\\xa9\\x76\\xa5\\xd4\\xca\\x32\\x05\\xf5\\xf0\\xe6\\x0e\\x75\\x9a\\x5d\\xf1\\xa0\\xbd\\xf3\\x6d\\xfe\\x97\\x17\\x90\\x6a\\xc5\\x7c\\xbf\\xc9\\x70\\xab\\x43\\xb6\\xfa\\x18\\xe6\\xc0\\x00\\x6c\\x84\\xfc\\x72\\x54\\x47\\x0a\\x0b\\x77\\x47\\x27\\xbf\\x5f\\x8e\\x67\\x94\\x23\\xa5\\x31\\xe4\\x1c\\xb5\\x31\\x0f\\x9b\\xcb\\xf5\\xa5\\x44\\x5e\\xbc\\x39\\xfb\\xd9\\x09\\xce\\x11\\xe9\\x7b\\xc2\\xf6\\x6a\\x4a\\x1b\\xb6\\xc2\\xf1\\x67\\xf2\\xc6\\xe8\\x0e\\xb9\\xb8\\xb7\\x2d\\xf3\\xe8\\xcf\\xd4\\xe5\\x14\\x48\\xdc\\x14\\xc0\\xb8\\x37\\xf2\\x94\\x96\\x93\\xd1\\xd0\\x54\\xc8\\xf9\\x5b\\xff\\x7f\\x1e\\x36\\x45\\x67\\xd0\\x34\\xf2\\x22\\x3e\\x15\\x94\\x77\\x2a\\x43\\xdc\\xfe\\x05\\x97\\xfd\\x6d\\x13\\x3b\\x3f\\x2e\\x96\\xff\\xc5\\x66\\x7d\\xd5\\x92\\x8f\\x23\\xec\\x3c\\x75\\x0f\\x84\\x59\\x93\\xa3\\x4e\\x97\\x76\\x15\\x9a\\x68\\x30\\xd6\\xfd\\x90\\x13\\xee\\x7a\\xea\\xa1\\xfc\\xcd\\x69\\xb9\\x6d\\xf2\\x84\\x70\\x4f\\xd0\\x88\\x88\\xb1\\x5b\\x64\\xe2\\xe9\\x0d\\x57\\x8c\\x5c\\xfc\\x0f\\x95\\x69\\x3f\\x6a\\xb6\\x5c\\x69\\x47\\x44\\x6a\\x85\\x7c\\x02\\x9c\\x7c\\xa6\\x60\\x80\\xb7\\x54\\xc7\\x73\\x4b\\x78\\x99\\x8a\\xbe\\x9b\\x7c\\xc6\\xef\\xd0\\x9a\\x44\\x18\\x19\\x4d\\x88\\xb3\\x4e\\xc6\\xc3\\x3a\\xf6\\x30\\xdb\\x81\\xde\\x5b\\x99\\xfe\\x65\\xaa\\xc8\\xb7\\x33\\x62\\x37\\x91\\x19\\xc7\\x00\\xd1\\x07\\xed\\xfc\\x19\\xf2\\x70\\x76\\x04\\x68\\xee\\x8e\\x5f\\x15\\x5d\\x9a\\x34\\x7e\\x57\\xb5\\x93\\x0f\\x32\\x7a\\x8d\\x11\\xc6\\x67\\x4d\\xdd\\x02\\x0f\\x9e\\x7d\\x9b\\x76\\x1d\\xba\\x5b\\x83\\xa8\\x73\\x02\\xf1\\x83\\x3e\\x5a\\xbd\\x49\\x52\\x6d\\x66\\x39\\x1e\\x5b\\xf0\\xe3\\x5b\\x44\\x53\\xd6\\x30\\xbf\\x7d\\x0a\\xdb\\xfe\\x50\\x1a\\xef\\x81\\xe6\\xc5\\x93\\x8f\\x92\\xcb\\x75\\x2f\\x5f\\x14\\xd2\\x80\\x6f\\x90\\xae\\x15\\x46\\x05\\x1c\\xcc\\x7f\\x91\\x3c\\x5d\\x6a\\x38\\xff\\x3b\\x7b\\x9a\\x23\\x66\\x2e\\xf1\\xf0\\x08\\x08\\xed\\xb2\\xfa\\x31\\xec\\xba\\x5c\\x8d\\x33\\x87\\xe8\\x75\\x41\\xcd\\x06\\x16\\xed\\xbf\\x3a\\xaa\\x35\\xa5\\x37\\x92\\x28\\x61\\xf4\\x4c\\xbd\\x9f\\x99\\x2b\\x82\\x46\\xd9\\xc6\\x4c\\x41\\x98\\x81\\x70\\x1a\\xb4\\x3f\\x7f\\xd4\\x64\\x21\\x0d\\x80\\x2b\\xa6\\x56\\xd9\\x5c\\x0f\\x24\\xa3\\x45\\x99\\xb2\\x0b\\x1e\\xc2\\x00\\x11\\x48\\x5c\\xfc\\xb3\\x18\\x6b\\x7b\\xcf\\x69\\xd7\\x45\\x81\\xa7\\xa3\\xee\\xd6\\x13\\x4c\\x4e\\xec\\xd6\\x55\\x74\\xa4\\x32\\x0d\\x9c\\x57\\xa8\\x49\\xc4\\xe7\\x8c\\x8a\\x5c\\xe8\\x25\\x05\\x00\\x4a\\x54\\xf1\\x9d\\x4b\\xdc\\x82\\x23\\x40\\x1b\\x34\\x94\\x6b\\x7d\\x66\\xe4\\x7e\\x63\\xcf\\x9d\\x0f\\x57\\xd0\\x94\\x54\\x91\\x38\\x4b\\xc6\\x86\\x8c\\x4b\\x47\\x86\\x90\\xe5\\x50\\x02\\x1d\\xf1\"},\n{{0x8a,0x35,0x01,0xb7,0x69,0x53,0x60,0x3c,0x90,0x33,0xe3,0xbc,0xbf,0x3e,0xc3,0x78,0xd2,0x57,0x01,0x1a,0x6c,0x50,0xb8,0x97,0x62,0xd4,0x91,0xea,0xa7,0x2c,0x5e,0x0d,},{0x77,0x8f,0x20,0x19,0xdc,0xd8,0xdb,0xb8,0x6c,0x67,0x37,0xcc,0x8d,0xc1,0x90,0xc5,0xa0,0x4c,0x50,0xb5,0xbf,0x45,0x88,0xbc,0x29,0xfa,0x2a,0x47,0xaf,0x25,0x26,0x72,},{0xa8,0xa3,0x09,0xba,0x52,0x12,0x5e,0x76,0xa4,0xa6,0x1e,0xb4,0x3f,0xd4,0x13,0x5c,0x41,0xab,0x11,0x79,0x9b,0x91,0xcc,0x54,0xff,0xc9,0xc6,0xa2,0x0f,0x05,0x0c,0xc5,0x95,0xb2,0x81,0x43,0xc8,0x74,0xbd,0xb9,0x28,0xbe,0xed,0x26,0x1d,0x9c,0x0f,0x12,0xaa,0x19,0x2e,0x66,0x40,0xbf,0xda,0xd5,0x4b,0xa0,0xd4,0x78,0x42,0x6b,0xce,0x09,},\"\\xe6\\x09\\xf1\\x22\\x4a\\x6a\\x45\\x11\\x40\\xcb\\xc0\\x25\\x4d\\x43\\x2c\\xe5\\xfd\\xdd\\x08\\xa8\\xe9\\x12\\xf8\\x1c\\x41\\x2f\\xdf\\xd5\\x18\\x2f\\xf6\\xac\\x2f\\x13\\xc5\\x76\\xc8\\x14\\x5b\\x15\\xf2\\x5b\\x40\\x9d\\x85\\x3f\\x91\\x44\\x09\\xe4\\xe0\\x2c\\xef\\xc3\\x9d\\x9b\\xef\\x4a\\x2a\\x06\\x04\\x98\\x57\\x0b\\x2d\\x3a\\x28\\x38\\xc9\\xb0\\xb8\\xe3\\xaf\\x4f\\xc3\\x7e\\x19\\x15\\xf8\\x04\\xa8\\x01\\x88\\x58\\x5b\\x30\\xb6\\x8a\\x3f\\xfb\\x2e\\x96\\x0c\\x73\\x20\\xe8\\x27\\xd2\\xfe\\x36\\xe6\\xa3\\x28\\xcc\\x6e\\x78\\x06\\x34\\x8a\\xdb\\x0b\\x77\\x3b\\x78\\x4d\\xe5\\x29\\xbb\\x6f\\x64\\x75\\x1b\\x21\\x05\\x85\\x94\\x94\\xfd\\x49\\xdb\\x0b\\xc7\\xf6\\x2d\\xf4\\x6b\\x9d\\x7c\\xe6\\x76\\x97\\x5c\\xc5\\xf4\\x38\\x56\\x49\\x84\\x36\\x81\\x2e\\x04\\xf2\\x6f\\xb8\\xb8\\xab\\x7e\\xba\\x12\\xf1\\xd5\\x67\\x22\\xeb\\x82\\xeb\\xfa\\xfa\\x47\\x35\\x97\\x7a\\x26\\x68\\x1c\\xb0\\x3f\\xa4\\xbc\\x69\\x51\\xab\\x9c\\xbd\\xf7\\x87\\xe3\\x27\\x8f\\x2f\\x57\\xf2\\x9e\\x12\\x09\\x5f\\x8c\\xa2\\xa1\\x78\\xcf\\xa7\\x57\\x13\\x37\\xf0\\x27\\x42\\x37\\x66\\x9f\\x97\\x65\\x7d\\x4b\\xad\\xb3\\x94\\x36\\xd7\\x86\\x49\\x25\\x80\\xfd\\x55\\xd8\\x6b\\xe3\\xa0\\xcd\\x17\\xd1\\x60\\x57\\x01\\x7b\\xaa\\xae\\xa0\\x0c\\x1e\\x14\\x55\\x21\\x59\\xbc\\xab\\xc0\\xe6\\x66\\xba\\xd3\\x41\\x8e\\x4e\\xc1\\x3b\\xfe\\x16\\x3b\\xe2\\x56\\xf0\\xc8\\x9b\\xc2\\x34\\x4a\\x8d\\xdf\\x99\\xca\\x81\\x60\\xb1\\x89\\x87\\x5a\\xd3\\x22\\xd9\\x0f\\x58\\x13\\x25\\x28\\x1d\\x53\\x89\\x96\\x5c\\x0a\\x7b\\x7b\\xca\\xe2\\x29\\x4a\\x3c\\xbe\\x35\\xa4\\xe4\\xe8\\x3b\\x54\\xc4\\x27\\x63\\x53\\x96\\x0f\\xad\\x11\\x85\\x32\\xd4\\x9b\\x70\\x76\\xf2\\x5a\\xd1\\x90\\xab\\x56\\x94\\x91\\x4f\\x71\\x08\\xb0\\xab\\x69\\x69\\xa1\\x91\\x28\\xfb\\x0a\\xef\\x00\\xe6\\x5a\\x04\\xfc\\x83\\x2d\\x07\\x69\\x61\\x67\\xb9\\x34\\x2b\\x35\\x5e\\xc5\\x77\\x37\\xca\\x37\\xcb\\xff\\x3b\\xb3\\x19\\x31\\xcb\\x58\\x71\\x2a\\x4c\\x46\\x89\\x52\\xc6\\x45\\x9d\\x56\\x7a\\x26\\xe7\\x95\\x01\\xe4\\xe3\\x1b\\x1b\\x09\\x53\\x53\\x76\\x32\\x02\\x9e\\x9b\\x49\\x0f\\x72\\xe5\\xa6\\xe0\\x57\\xdd\\xb4\\xb3\\x17\\x56\\xfd\\x97\\x04\\x21\\x8b\\x1b\\x8f\\x4d\\xcb\\x54\\x30\\xc0\\x25\\x04\\x2f\\x47\\x16\\x9b\\xfc\\x7c\\x80\\xd7\\x1c\\xab\\x8c\\xa0\\x7f\\x34\\x0a\\xfa\\x00\\x8a\\xbb\\xe2\\xe3\\xa0\\xab\\xe1\\x41\\xda\\x8d\\x41\\xca\\x6b\\xd6\\x9d\\x36\\xfd\\xb1\\x1a\\x41\\xce\\x0b\\x72\\xfa\\xbc\\x00\\xd9\\x7e\\xa6\\x05\\x27\\x00\\x10\\xb2\\x59\\xdf\\x8e\\x10\\xdd\\x22\\xdc\\x17\\xc1\\x39\\x90\\xa0\\x5f\\x02\\x33\\xe3\\xca\\x85\\x6b\\x40\\x97\\x1c\\xb3\\xe2\\x1c\\x8b\\x39\\x50\\xb1\\x3f\\xc8\\x4e\\x1f\\x26\\x6c\\x2a\\x6f\\xbe\\xce\\x88\\xd5\\x97\\x25\\xc3\\xcf\\xb2\\x22\\x5d\\xbc\\x1e\\xe9\\x5b\\x68\\x6d\\xb7\\x04\\xfc\\x93\\x7b\\x76\\x6f\\x0a\\x9b\\xfe\\x95\\xa4\\x2b\\x90\\x10\\xf1\\x22\\x9c\\x61\\x0d\\x7e\\xde\\x09\\x57\\x12\\xc8\\xf0\\xf1\\xfb\\x00\\x47\\xc0\\x40\\xa8\\x70\\x30\\x6c\\xd8\\xdc\\x74\\xc4\\xda\\x51\\xbf\"},\n{{0x42,0xb5,0x36,0x52,0xd0,0x8b,0x5d,0x76,0x6e,0x66,0xad,0x8f,0x3e,0xbf,0x69,0x3c,0xfd,0x77,0x90,0x7c,0xad,0xd9,0x8b,0x54,0x66,0xdf,0x77,0xdf,0xa2,0xc6,0x37,0xad,},{0x88,0x46,0x3b,0xb8,0xa4,0xb6,0x38,0x8d,0x92,0x4c,0xb8,0x62,0x09,0x83,0x41,0x95,0x43,0x5d,0x79,0xd7,0x7f,0x8c,0x02,0xf4,0x6b,0xbd,0x16,0xd8,0x2e,0xfe,0x42,0xb3,},{0x30,0xc4,0xb9,0x9e,0x68,0xec,0x33,0x51,0x30,0x8f,0xbc,0x76,0xd9,0xca,0xf0,0xaf,0x62,0x21,0xb5,0x96,0xb7,0x01,0x7f,0xe1,0x0c,0xc6,0x33,0x02,0x3b,0xa9,0x7f,0x02,0x38,0x96,0xfe,0x32,0x2b,0xaa,0x34,0x76,0x60,0x61,0x0e,0x05,0xfa,0x49,0x3d,0x21,0x8f,0xa3,0x60,0xf1,0x8d,0x93,0xe2,0x75,0xd1,0xef,0xf6,0x66,0xb6,0x3d,0xb2,0x04,},\"\\x9e\\xe9\\x13\\xc7\\x4e\\xe3\\xc5\\xe8\\xc9\\x0d\\x64\\xb8\\xae\\x3a\\x60\\x04\\x9f\\xc7\\x65\\xe1\\x76\\x06\\x0b\\xcd\\x1c\\xd0\\x9f\\x0e\\xda\\x60\\xbf\\x23\\xba\\xdb\\x8a\\x1c\\xaa\\xc3\\xd6\\x6e\\xbc\\x52\\x68\\x14\\x6e\\xe4\\xa5\\x4e\\x1e\\xb2\\x31\\xed\\x25\\xef\\xf9\\x5b\\x90\\xa6\\xe9\\x83\\x37\\xa5\\x40\\xa3\\xf4\\x84\\x49\\x79\\x4a\\x48\\x73\\xbf\\xc2\\xe8\\x47\\x28\\x96\\x6b\\xb7\\xc6\\xff\\x67\\x6a\\x2f\\xf5\\x73\\x11\\xc1\\xc2\\x5e\\x15\\xfb\\xf3\\xd4\\x0e\\x9f\\x25\\xab\\x5d\\xb9\\x1f\\xdd\\xb7\\xa0\\xae\\x43\\x6c\\x8e\\xc0\\x70\\x75\\x4b\\x6d\\x74\\x3a\\xa1\\xd6\\x04\\x8f\\xb5\\xbd\\x7f\\x5b\\x8e\\x4c\\xca\\xd2\\x03\\x28\\x38\\x95\\x30\\xf1\\x13\\x74\\xa4\\x89\\xb1\\xd5\\x05\\x31\\xa3\\x9c\\x9b\\x32\\xb4\\x03\\x69\\x62\\x60\\x06\\xd2\\x64\\xa9\\x9e\\xec\\x4f\\xac\\x13\\x41\\xf4\\xe7\\x46\\x79\\x45\\x7b\\x41\\x8e\\x6b\\xbf\\xba\\x23\\x3f\\x1c\\xa1\\x58\\xf7\\xb2\\x9d\\x40\\xd5\\x03\\x01\\xf9\\xd9\\x25\\x36\\xfd\\xc5\\xc2\\x3f\\xe5\\xde\\xe4\\xd6\\xdf\\x0e\\xbf\\x13\\xdf\\xa3\\x75\\x4a\\x14\\xc8\\x56\\x00\\x9a\\xde\\xa1\\xdd\\xa4\\x09\\x30\\x4c\\x1f\\x60\\xd2\\x53\\x30\\xfb\\x10\\x95\\x79\\x47\\xa0\\x05\\x08\\xf2\\xfd\\x76\\x42\\x2e\\xac\\x69\\x4c\\xc3\\x9f\\xa8\\xae\\x7f\\xcc\\x77\\xa0\\x2f\\xd9\\xee\\x5f\\x91\\x0d\\x93\\xe8\\xaa\\xc6\\x8f\\x14\\x5d\\xd8\\x78\\x87\\x6b\\xa8\\xed\\xa0\\xa4\\x9f\\xcb\\x20\\x9c\\x34\\xea\\x22\\x0d\\x4d\\x06\\x05\\x54\\x6f\\xc4\\xa8\\x09\\xba\\xf0\\x10\\xd5\\x33\\xe4\\x5d\\x17\\xb0\\xe1\\x6a\\x46\\xe9\\x1e\\xa6\\xfe\\xc2\\xcd\\xc5\\xa8\\xb3\\xec\\x50\\x14\\xb2\\x5e\\x92\\xd8\\xe5\\xc9\\x28\\xab\\x06\\x99\\x3d\\x4f\\xe2\\x3a\\xc8\\xd4\\x5c\\x89\\x03\\x78\\xdd\\x13\\x3f\\x00\\xed\\xb9\\x37\\xc0\\x71\\xf7\\x5c\\xfc\\x13\\xa4\\x02\\xe3\\xe4\\x29\\xa8\\x48\\x65\\x2a\\x17\\x5c\\x9b\\x6f\\x6e\\xac\\x86\\xf6\\x18\\x8a\\x44\\x48\\xa9\\x6c\\xe2\\x87\\x2e\\x5f\\x65\\xf9\\xbd\\xb8\\x71\\x66\\xc9\\xb8\\x7a\\x7e\\x95\\x8e\\x80\\xbb\\x65\\x66\\xe3\\xfc\\xf8\\x71\\x19\\x0c\\xf4\\xa8\\x67\\xe6\\x12\\xcf\\xc1\\xe4\\x37\\x1d\\x2b\\x73\\xd2\\xa0\\xad\\x0a\\xa4\\x00\\xba\\x69\\xe6\\x63\\x36\\x23\\x3b\\x0f\\x3c\\x52\\xb8\\xa6\\x8b\\xca\\x05\\x12\\x56\\x01\\x25\\x50\\x46\\xe6\\xf4\\x9d\\x68\\x8d\\x2d\\xb8\\x5c\\x7b\\x82\\x12\\x70\\x51\\x6e\\x3c\\x06\\x13\\xf3\\xf2\\x3f\\x9c\\x57\\xcb\\x4c\\x87\\x14\\x28\\x5c\\xdf\\x95\\xe1\\x06\\xa3\\xb5\\xaf\\xca\\xeb\\x81\\xb7\\x2f\\x34\\x3e\\x87\\xbd\\x92\\xf1\\x58\\x1d\\xcf\\x9a\\xa9\\x0a\\x02\\x4f\\xa4\\xa1\\x04\\x80\\x59\\xe3\\x0d\\xe8\\xff\\x0d\\x16\\x79\\x4d\\xcd\\x74\\x5d\\x2b\\x2d\\x53\\x4c\\x52\\x0f\\x82\\x78\\x53\\x86\\x74\\xa9\\x34\\xc6\\xf1\\x4a\\x84\\x28\\xe3\\xda\\x01\\x8a\\x36\\xe4\\x5a\\xa5\\x82\\x7c\\xf4\\xb1\\x52\\x84\\x34\\x6f\\xd6\\x93\\x63\\x14\\x92\\x19\\xbb\\x0d\\x1b\\xc9\\x27\\xd8\\xd1\\x93\\xc4\\x82\\x69\\x2f\\x97\\xdc\\x88\\xd8\\xed\\x33\\x7d\\x0c\\x9d\\xc9\\x9c\\x7a\\x5e\\x11\\x1d\\xce\\xd4\\x22\\x50\\xd5\\x80\\xe2\\x06\\x92\\xbb\\x7b\\x88\"},\n{{0x14,0xcf,0xe0,0x0f,0xa7,0x19,0x0a,0xe8,0x10,0x88,0x8a,0xe2,0xbb,0xd0,0xff,0x64,0x12,0xcf,0x1f,0xd4,0x08,0xa3,0x08,0x29,0x43,0x83,0xa1,0x94,0x53,0xb5,0x90,0x73,},{0x4e,0x61,0xaf,0xe8,0xc1,0x74,0xb6,0xee,0x1a,0x29,0xfa,0x09,0xcf,0x87,0xb4,0x00,0x81,0x39,0xf1,0x07,0x0b,0xc8,0x53,0x1b,0x6d,0x06,0xf5,0x4c,0x95,0x62,0xa4,0xf3,},{0xf7,0x85,0xa4,0x6f,0x69,0xbb,0xd0,0x99,0xfa,0x01,0x11,0x24,0xba,0x90,0x32,0xc1,0x89,0x74,0x2c,0x9e,0x00,0x1d,0xbb,0x87,0x81,0xd8,0x22,0x33,0x45,0xa9,0x56,0x9d,0xc1,0x44,0xca,0x69,0x4d,0x90,0x24,0x5e,0x0e,0x51,0x3e,0x88,0xab,0x02,0x3f,0x7f,0x0f,0x99,0xb7,0x41,0x61,0x59,0x75,0x8d,0xd0,0x34,0xe7,0xa8,0x9c,0xff,0x36,0x00,},\"\\xbc\\x66\\xf8\\x01\\xda\\xa8\\x29\\x85\\x8e\\x74\\x02\\x93\\xd4\\xd2\\x18\\x7b\\x8e\\x1a\\x5a\\xfb\\xa5\\xfd\\x67\\xb1\\x09\\x56\\xc6\\x53\\x46\\xac\\xa9\\x44\\x29\\xd3\\x2e\\x4c\\xfb\\x35\\x84\\xab\\x0e\\x00\\x5d\\x0d\\xd7\\x42\\x78\\x1d\\x47\\xe8\\x94\\x47\\xc4\\xe1\\xd8\\x1b\\xf7\\xe6\\x15\\x4f\\x8f\\x73\\xaf\\x03\\x36\\x1a\\xd5\\x6e\\xa3\\xc0\\x60\\x00\\x75\\x4b\\x9f\\x32\\x7d\\x4e\\xde\\xac\\xc4\\xd3\\x48\\xaf\\xb5\\x48\\x23\\xe1\\xc9\\xd4\\x9c\\xd8\\xff\\x2b\\x19\\xf4\\x20\\x21\\xb4\\x0d\\x58\\x0c\\x39\\xce\\x3d\\x24\\x36\\x61\\xb8\\x54\\x21\\xfe\\xc9\\x15\\xba\\x9d\\xd2\\x76\\x2f\\x85\\x0b\\xd2\\x08\\xfd\\xbf\\x20\\xff\\xab\\xa5\\x6a\\x46\\x86\\x60\\xf1\\x7c\\x00\\xfb\\x1c\\x0f\\x4e\\x85\\x27\\xa5\\x09\\xdd\\x4e\\xec\\x13\\x36\\x0c\\xf6\\xe3\\xca\\xc5\\x42\\xb8\\x75\\x18\\x2f\\x2a\\x7c\\xe7\\xbe\\x0a\\x33\\x30\\x2f\\xe2\\x6d\\x36\\x29\\x62\\x93\\x84\\xe3\\x5c\\x06\\x78\\x9d\\xe6\\x34\\xe9\\x0e\\x96\\x4f\\xbd\\xa8\\xcb\\xba\\x98\\x11\\x1e\\x22\\xe8\\xd0\\x76\\x26\\x84\\x26\\x6a\\xab\\x76\\xae\\xba\\x4a\\x38\\x07\\x78\\x69\\x68\\x14\\xa1\\xe3\\x11\\x94\\x3c\\xb3\\x50\\x58\\x92\\x64\\x0c\\x44\\xe3\\xaa\\xc4\\x53\\x0c\\x50\\xac\\x60\\x4a\\x8d\\x2c\\xcc\\x7c\\xea\\xbf\\xfe\\xa4\\xaa\\x3d\\x7f\\x48\\xa6\\x6d\\xcd\\x75\\x88\\xb8\\x02\\x09\\xdb\\xc1\\x73\\xf0\\xc6\\x63\\xe8\\xfc\\x87\\xa3\\x6e\\x89\\x2e\\xc9\\xa3\\xff\\x8f\\x60\\xd2\\xe0\\xd8\\x70\\x4e\\x5b\\x6c\\xbb\\x87\\x32\\x75\\x15\\x1a\\xd4\\xcc\\x00\\x57\\x16\\x50\\x31\\x90\\x50\\x39\\x65\\x1c\\xa1\\x0a\\x95\\xc6\\xfd\\xa3\\xb2\\x78\\x27\\xa6\\x57\\xef\\x9a\\x5f\\xc3\\xeb\\x5b\\x53\\xca\\xc6\\x1d\\xda\\xf5\\xa4\\x17\\x04\\xc8\\x78\\x57\\x0c\\xbc\\x3c\\x41\\xc4\\x75\\xb1\\x17\\xc0\\x5e\\xab\\x0b\\xb1\\x96\\xbc\\xb7\\xc4\\x33\\x34\\xde\\xbd\\x64\\xb9\\xe3\\x74\\x50\\xd2\\x3f\\x5c\\x10\\x16\\x1e\\xc5\\xab\\x4f\\xcc\\xd7\\xcf\\x30\\x8e\\x2a\\x99\\x95\\xcc\\x9e\\x57\\x8b\\x85\\xe8\\x28\\x5a\\x52\\x08\\xb9\\xef\\xd4\\x2a\\xf9\\xcf\\x2a\\xc2\\xb3\\xb7\\x46\\x42\\x54\\x88\\x9a\\x21\\x87\\x31\\x7e\\x32\\x49\\x97\\x09\\xb9\\x13\\x95\\x3a\\xd4\\x6f\\x1c\\x23\\xe1\\xb6\\xb5\\x6f\\x02\\x4c\\x4a\\x7d\\x48\\x46\\x11\\x92\\xc0\\x1c\\x56\\xc5\\x4c\\x56\\x47\\x91\\xec\\x0a\\x67\\xb6\\x1a\\xcb\\xf9\\x57\\xe6\\xd0\\xd7\\xda\\x80\\x53\\xed\\x13\\xa4\\x18\\x93\\xd7\\x67\\xfc\\x57\\x37\\xcd\\x19\\x55\\x53\\xda\\x5d\\x5b\\x07\\x06\\x5f\\x47\\xd7\\x2a\\x35\\xc4\\x2b\\x00\\x1e\\xb6\\xdb\\xd0\\xf8\\xe7\\x7a\\x4b\\x76\\xa6\\x26\\x61\\x92\\x64\\x7f\\x41\\x55\\xea\\x11\\xbd\\x12\\x37\\xba\\x77\\xc8\\x7c\\x62\\xbf\\x4b\\x01\\x14\\x9f\\xc5\\x8b\\xc2\\x8f\\x0b\\x5a\\x28\\x64\\x85\\xd3\\x71\\x7d\\x32\\x39\\x64\\x04\\x62\\x18\\xe7\\x0c\\x7e\\x38\\xb7\\xd5\\xe7\\x4b\\xa6\\xb1\\x2b\\x02\\x2f\\x18\\x19\\x7d\\x92\\xc1\\x3b\\xca\\x89\\x33\\x5c\\x85\\x6c\\xbc\\x57\\x56\\xaa\\x3b\\x64\\xec\\x1f\\x46\\xe3\\x96\\xb1\\x16\\x1c\\x87\\x1c\\xd2\\xdf\\xde\\xd1\\xa4\\xec\\x91\\x92\\x74\\x29\\x37\\xc0\\x70\\x45\\x31\\xc7\"},\n{{0xac,0x0f,0x7f,0x04,0x18,0xde,0x67,0xe3,0x48,0xfa,0x6d,0x56,0x86,0xc4,0x6d,0x21,0xca,0x72,0x62,0x2e,0xe6,0x9e,0xaa,0xbe,0x00,0xd5,0xc9,0x07,0x5a,0x34,0xf1,0x79,},{0xfe,0xab,0xde,0x08,0xf0,0x0a,0x2b,0x68,0x2b,0xce,0x9d,0x45,0x99,0x0b,0xf4,0x5a,0xfc,0x95,0x83,0x39,0xdc,0x44,0x10,0x6d,0xad,0x33,0xb2,0xc4,0x90,0xef,0x70,0x90,},{0x75,0x91,0xcf,0x82,0x57,0xbe,0xad,0x39,0xa1,0xad,0x3b,0xa1,0x91,0x8d,0x51,0x8e,0x67,0x24,0x35,0x6b,0xf6,0x25,0xa5,0x73,0xea,0xe5,0x01,0xd1,0xaf,0x94,0x6c,0x13,0xc2,0x90,0xcb,0x63,0x15,0x6e,0xc9,0xd3,0x62,0x72,0x6e,0xe5,0x0b,0x39,0xfc,0x0a,0x7a,0x2b,0xbd,0x69,0xd4,0xa8,0x1b,0x75,0x93,0x2a,0x90,0xf8,0xc7,0xac,0x7d,0x03,},\"\\xe8\\xd0\\xe8\\x32\\x53\\x35\\xe0\\xf3\\x5a\\x85\\x46\\x7b\\xee\\xd1\\xe1\\x1c\\x6a\\x20\\x78\\xc3\\x5a\\xe4\\xa4\\xa1\\x05\\x43\\xed\\xe4\\x0c\\x17\\x12\\xbc\\x95\\x20\\x12\\xd2\\xf8\\xfe\\xc1\\x05\\xae\\xf7\\xc6\\xc6\\x5b\\x36\\x34\\xb4\\xa7\\x4b\\x22\\xb4\\x98\\xb9\\x13\\x50\\x7d\\x1f\\x6c\\xfd\\xe8\\x38\\x58\\xe6\\x83\\x0c\\x0a\\xf4\\xf4\\x64\\xa6\\x89\\x9d\\x5c\\x4e\\x27\\x9a\\xff\\x36\\x75\\x4c\\x21\\xda\\x80\\xa1\\xbb\\xd1\\xdc\\xf4\\x62\\x20\\x37\\x5b\\x1e\\x11\\x2a\\x5a\\x72\\xf1\\xab\\x6e\\x8f\\x64\\x19\\x42\\xf6\\x6d\\x9b\\xbd\\xbb\\x17\\x9c\\xf0\\x13\\x9e\\xa8\\xde\\xb0\\xf4\\xb8\\x14\\xf5\\x0c\\x51\\x33\\x29\\xa1\\xa0\\xe2\\x67\\xc4\\x43\\x3a\\x23\\x31\\x82\\xbc\\x4a\\x2a\\xcb\\x2c\\x6d\\x4f\\x00\\xb2\\x40\\x94\\xd3\\xbd\\xc0\\xeb\\x81\\xcf\\x37\\xd3\\x82\\x60\\xc2\\x10\\x7d\\xd9\\x49\\x06\\x13\\xd2\\x76\\xee\\x1f\\x72\\x26\\x6c\\x6e\\x4a\\xcc\\xa5\\x24\\x98\\x11\\xa0\\xf8\\xa7\\xda\\xe6\\x6a\\xed\\xb7\\x5c\\x3d\\xf4\\xc8\\xca\\x3c\\xb5\\xd9\\xc5\\x67\\xba\\x54\\x1e\\xe5\\xa9\\x14\\x0c\\x50\\x58\\x72\\x72\\xaf\\x34\\x53\\x0a\\xb8\\xb0\\x8b\\x9e\\xc0\\x32\\xea\\xc0\\x60\\x39\\xe6\\x92\\x63\\x0e\\x2d\\x55\\x4d\\xf7\\x7c\\x1a\\x03\\x88\\xb3\\xca\\xaa\\x3b\\xe3\\x75\\x4a\\x84\\x96\\x1f\\xb2\\x99\\xe4\\x02\\x22\\x71\\x58\\xce\\x36\\x3e\\xac\\x26\\x47\\x8d\\x47\\x97\\x75\\xe5\\x68\\x5a\\xdb\\xf8\\x28\\xbb\\x35\\x5e\\x3c\\x89\\xcc\\xe2\\x41\\x50\\x3c\\x15\\x36\\x64\\x32\\xba\\x94\\xcd\\x3c\\xd9\\x54\\x79\\x14\\x4b\\x63\\x6e\\x0d\\xe7\\x0b\\x3f\\x16\\xd1\\xa3\\xca\\x51\\x8e\\x39\\x90\\x09\\xa4\\xc2\\x47\\xa7\\xf9\\x63\\x67\\xc7\\x14\\x66\\x08\\xaa\\xcc\\x00\\x14\\xfc\\x35\\xb8\\x4a\\xf9\\x93\\x3f\\x09\\xba\\xbb\\x89\\x93\\x7a\\xbb\\x8c\\xed\\x11\\x18\\x91\\x34\\x3d\\xdb\\x79\\xf6\\x0b\\x78\\x89\\x8a\\xb5\\x93\\x8f\\x8b\\xa3\\x81\\x4b\\xd8\\x00\\x26\\x05\\xb1\\xdf\\xd2\\x97\\xfa\\x07\\xc4\\x75\\xa0\\xd4\\xf8\\xf4\\x45\\x1a\\xcd\\x70\\x7d\\xe8\\xaf\\x6c\\x0e\\x88\\x18\\x83\\x3a\\x3a\\xbe\\x5c\\x96\\xd1\\xa8\\xc6\\xc9\\x6e\\x2c\\xb6\\x33\\x28\\xeb\\xa4\\x4d\\xd1\\xd3\\x46\\x84\\xe4\\x12\\xf2\\x88\\xe0\\x65\\x20\\x9d\\x11\\xeb\\x80\\x94\\xd2\\x2e\\x4c\\xc8\\x02\\x62\\x9c\\xcb\\xa3\\x39\\x26\\xbf\\x1a\\xd3\\x6a\\x62\\x85\\x13\\x8a\\xbe\\xe0\\x5c\\x5a\\x39\\xa4\\x75\\xf3\\xfd\\xd0\\xb3\\xec\\x8c\\x37\\x0c\\xd9\\x57\\xa8\\x37\\x9e\\xc2\\xcd\\xaf\\x03\\xe8\\x95\\xc1\\xba\\x12\\xb4\\x49\\xd6\\xcd\\x8b\\xe0\\xf3\\x5d\\x99\\xe2\\xb7\\xfb\\xaa\\x92\\xdd\\x54\\xe6\\x4e\\x7c\\x35\\xce\\xb8\\x8a\\x71\\xa6\\x80\\x52\\x7c\\xb3\\x73\\xaf\\xe1\\x4c\\xdd\\x15\\x8a\\x0b\\x90\\xbf\\x2d\\xae\\xc8\\x0d\\x2e\\xdb\\xdc\\x31\\x28\\xcd\\x6b\\x63\\xfa\\x53\\x2a\\x1c\\x27\\x8c\\xdf\\xe0\\xf8\\xeb\\xb4\\xab\\xba\\x5e\\x1a\\x82\\xbc\\x5c\\x3f\\xed\\x15\\xc5\\x79\\x5b\\xd9\\xff\\xb5\\x76\\x08\\x2c\\xc4\\x79\\xfa\\x1b\\x04\\xc5\\xc5\\xaf\\xca\\xd2\\x69\\xa0\\xf1\\xad\\xdf\\xe7\\x60\\x42\\xc3\\xa8\\xf1\\xf2\\x53\\x77\\xb6\\xcb\\x72\\xec\\x16\\x14\\xeb\\x63\\x83\"},\n{{0xb5,0xa7,0xc7,0x67,0x93,0x63,0x80,0xb3,0xe9,0x87,0x51,0xca,0xfd,0x3e,0xa8,0x9b,0x38,0x8a,0x32,0xcf,0x82,0x8b,0x32,0x1c,0x5b,0xd0,0xcc,0x8d,0xd8,0x5b,0xaf,0x00,},{0xbe,0x7f,0xa6,0x5f,0x1f,0x6b,0xe5,0x10,0x27,0xf8,0xb8,0x48,0xdb,0x7a,0x8c,0x40,0x49,0x61,0xbf,0x1e,0x21,0xa2,0x3d,0xf2,0x3b,0xb8,0xce,0x05,0x85,0x0c,0xda,0xa1,},{0x60,0xe4,0xd2,0x3f,0x1f,0x08,0xfc,0xe4,0x66,0xc9,0x91,0x5d,0xde,0xd9,0x32,0x56,0xb5,0x2b,0x32,0x7e,0x5f,0x81,0xfb,0xb3,0x1d,0x1d,0x10,0xd3,0x21,0xc3,0x90,0x36,0x6e,0xf0,0x01,0xfd,0x75,0x9a,0xa9,0xd0,0xa5,0x51,0x62,0xd5,0x36,0x4d,0x91,0x8b,0x48,0xc7,0x32,0x7e,0x77,0xcf,0x53,0x58,0xbc,0x43,0x19,0xe3,0x25,0xcd,0xd6,0x08,},\"\\x6b\\x67\\xc7\\x95\\xd6\\x6f\\xac\\x7b\\xac\\x84\\x42\\xa6\\xc0\\x99\\x2c\\xb5\\x75\\x88\\x43\\xb3\\xe3\\x93\\x9e\\x3c\\x27\\x6c\\x6e\\x90\\x08\\xda\\x82\\x00\\x76\\x77\\xbf\\x9e\\x67\\xe9\\xac\\x5a\\x1a\\x0f\\x48\\x6b\\xea\\xc0\\xd8\\x56\\x19\\x1f\\xae\\x25\\xa1\\x27\\x39\\x2b\\xed\\x46\\x9b\\xc7\\x8d\\xeb\\x0c\\x4b\\x89\\x3f\\x67\\xf1\\x71\\x6d\\x83\\x50\\x90\\x77\\xe4\\xa1\\xbf\\xd4\\x13\\x6d\\x03\\x15\\x2d\\xcc\\x3b\\x76\\xd9\\x52\\x49\\x40\\xa6\\x06\\x4c\\x66\\x9f\\xbf\\x51\\xf6\\xb9\\x10\\x34\\xb6\\xd5\\xf2\\x89\\x86\\x78\\xa1\\x3a\\x24\\x70\\xf6\\x64\\x1e\\xc8\\x02\\x45\\x7c\\x01\\x02\\xc3\\xeb\\xf6\\x34\\x5c\\x32\\x7e\\x74\\x1b\\x80\\x64\\x4b\\x3a\\x99\\xbf\\x72\\xb5\\x9a\\xb8\\x01\\x6f\\x35\\xd2\\x51\\x88\\xa0\\x85\\x75\\x0d\\xc0\\x60\\xe5\\xa8\\xd5\\x24\\xae\\x21\\x3f\\x07\\x8f\\x28\\x8c\\x7b\\x34\\xbc\\x41\\xf3\\xce\\x35\\x6b\\xf2\\xda\\xfd\\xd2\\xe0\\xdb\\x4f\\xb8\\xd7\\xc2\\xc3\\x19\\xf9\\x90\\x60\\x05\\x97\\x17\\x02\\xe4\\x9c\\xa6\\x2e\\x80\\x50\\x54\\x0d\\x41\\x21\\xd2\\x42\\xf2\\xee\\xab\\x1b\\xd1\\x34\\xe6\\x0b\\xf1\\x1b\\x3e\\xc7\\x1f\\x77\\x65\\xa9\\x7c\\x0e\\x09\\x84\\x55\\xe5\\x9d\\x22\\x35\\xd6\\xb3\\x7e\\x7c\\x9f\\x5b\\x21\\xfa\\x11\\x2c\\x3b\\xa3\\x9e\\x4e\\xa2\\x00\\x61\\x4f\\x58\\xdf\\xb3\\xeb\\x7b\\x83\\x6f\\x0b\\xec\\x1d\\xdd\\x43\\x8d\\x14\\x22\\x45\\x0a\\xe7\\xde\\xd1\\xdf\\x9d\\x71\\xe5\\xd9\\xbc\\x8f\\xa3\\xb6\\xe6\\xf7\\x84\\x46\\xce\\x7c\\x79\\xd0\\xbc\\xfb\\x1c\\x2d\\x26\\xc6\\xfe\\xce\\x68\\x68\\x2d\\xff\\xc6\\x0a\\x9c\\x6e\\x0a\\xd0\\x5f\\x2a\\x09\\xf2\\x1d\\x75\\x23\\x25\\x1c\\xb0\\xc3\\xd0\\x8e\\xfb\\xbf\\x8a\\xc1\\x63\\x39\\xd7\\x17\\x02\\x4d\\x67\\x60\\x24\\xc1\\xee\\x3c\\x1f\\x62\\xc5\\xae\\xab\\x7f\\xff\\x93\\x7c\\x57\\x45\\x4d\\xf7\\xbd\\x96\\xf9\\x84\\x4a\\x2a\\x39\\x99\\x58\\x41\\x8a\\xaa\\x6f\\x18\\x48\\xbe\\xbf\\x7b\\xf1\\x29\\x2c\\x24\\xeb\\x5c\\xd8\\xea\\x56\\x34\\x0c\\x5b\\xeb\\x26\\x88\\x02\\x4a\\x69\\x53\\x27\\x5b\\xe6\\xef\\xd1\\xb7\\x1b\\xa8\\xbe\\x6e\\xb7\\x7f\\x0c\\x65\\xa7\\xc5\\x11\\x1b\\x96\\xc4\\xc1\\xf3\\x9c\\xb7\\xaa\\xf8\\x3f\\xda\\xae\\x8d\\x14\\x8d\\x7a\\x8a\\xf4\\x0a\\xe9\\xe6\\x51\\x91\\x9f\\x7c\\xe2\\x8c\\x8b\\x2b\\x6e\\x45\\xe4\\xd3\\xd5\\x6f\\xdd\\x54\\xd0\\x0c\\x24\\x12\\x79\\x0c\\xbd\\x6f\\x80\\xe1\\x08\\x19\\xe0\\xb8\\xf3\\x7c\\x84\\xfa\\x00\\x49\\x88\\xad\\xaf\\xcc\\xbb\\xc2\\x1c\\x63\\xd6\\xbf\\x2e\\x73\\x2d\\x9d\\xd6\\x3b\\xd4\\x9b\\x04\\x12\\xb9\\x67\\x4e\\x1e\\x88\\xf6\\x14\\x2f\\x7f\\x86\\x7f\\x1f\\x26\\x89\\x1b\\x22\\x43\\x04\\x23\\xce\\xc4\\xdb\\x91\\xb6\\x1c\\x2a\\xbc\\x5c\\x8f\\xbd\\x46\\xb8\\xb9\\x35\\x96\\xfc\\x51\\x60\\x68\\x31\\x36\\xe2\\x11\\x29\\x82\\x27\\x96\\xeb\\x5e\\xa0\\x88\\xe0\\xa7\\xd8\\x12\\x1b\\x25\\x57\\x2e\\x3e\\xc3\\x77\\x43\\xd1\\xff\\x6d\\x8d\\x1c\\x35\\x36\\x43\\x9a\\x10\\xe8\\x4a\\x66\\x5f\\x2c\\x75\\xee\\x73\\xcd\\xc6\\xff\\xac\\x4c\\xc2\\x87\\x24\\x46\\x9f\\x79\\x70\\xb4\\x75\\x07\\xdf\\x3e\\x1b\\x14\\xd4\\x77\\xae\\xc2\\xbb\\x20\"},\n{{0xe1,0x36,0xf3,0x98,0xa6,0x05,0xd1,0x34,0x57,0x84,0x8c,0xea,0xd0,0x7c,0x72,0x86,0xf4,0x2e,0x2f,0x28,0xdf,0x8c,0x12,0x8a,0x3d,0x0b,0xb7,0x2b,0x29,0xaa,0xcc,0x19,},{0x6a,0xa5,0x04,0x5a,0x66,0xf7,0x72,0xa5,0x71,0xfe,0x3e,0x42,0xd1,0x17,0xef,0xcd,0xf6,0xc4,0x95,0x91,0x99,0x61,0x86,0x01,0x2f,0xa9,0x8f,0x7c,0x48,0xe0,0xcd,0xa7,},{0x75,0xa4,0x5c,0x6b,0x95,0x66,0x89,0x98,0x29,0xb4,0x1e,0xe5,0x17,0xb7,0x04,0x5a,0x47,0x3a,0x4f,0x7a,0x26,0x41,0x43,0x9b,0x5d,0x7c,0x56,0x73,0xe0,0x0d,0x8f,0x5c,0x06,0x6f,0x12,0x91,0xf8,0x5d,0xea,0xda,0x05,0x02,0xbd,0x16,0xe9,0x70,0x9f,0x82,0x7d,0x47,0x51,0xf2,0x87,0x38,0x62,0xe8,0x21,0x9e,0x57,0x74,0x6a,0x19,0xa9,0x00,},\"\\xd3\\x28\\x57\\x9d\\xe4\\xc5\\x37\\x2f\\x3b\\x38\\x2c\\x48\\x01\\x1b\\x2d\\x4c\\x60\\x29\\xf9\\x04\\xf3\\xa3\\x3e\\x07\\xd0\\x83\\xd7\\xe2\\xb0\\x37\\x56\\xaf\\x2c\\x4c\\x97\\xa2\\xd6\\x6c\\x10\\xec\\x41\\x54\\xd8\\x74\\x79\\x20\\x42\\xb6\\x46\\xe4\\xaa\\xe5\\x10\\x1d\\x50\\x1b\\xd1\\xbf\\x6f\\x51\\x17\\x51\\xd0\\xaa\\xf8\\x21\\xcd\\x7c\\x0b\\x3e\\xe6\\xd0\\xd7\\xc6\\x90\\xa2\\x77\\x7f\\xe1\\x6b\\xdc\\x7e\\x49\\xb7\\xda\\x4b\\xbb\\x4c\\xce\\x3b\\x61\\x8e\\xe9\\xb6\\xf2\\xe3\\xa1\\x92\\x40\\xcd\\xb7\\x07\\x33\\xb9\\x84\\xb1\\xc9\\x40\\xec\\x66\\x96\\x0b\\x72\\x8c\\xbb\\x87\\x4b\\x80\\x64\\x31\\x23\\x72\\x2d\\xb9\\xdb\\xbe\\x88\\x32\\x20\\x08\\x93\\x1b\\x1c\\x89\\x4e\\xf5\\xd2\\x10\\x99\\xe6\\x3e\\x7c\\x65\\x00\\x7a\\xcd\\x61\\x78\\x4d\\xb4\\x99\\x4a\\x2f\\xb4\\x0c\\x3e\\xfe\\x9c\\x47\\xfa\\xd6\\x37\\x63\\xdd\\xe0\\x6f\\xa0\\x17\\xa2\\x6b\\x82\\xe7\\x1b\\x9d\\xaa\\xbc\\x4f\\xf0\\xf6\\xc7\\x9b\\x8c\\xa7\\xcc\\xb4\\xdc\\x20\\x31\\xbe\\xf1\\x08\\x73\\x67\\xc7\\x08\\x69\\x74\\xa0\\x05\\x66\\xde\\x41\\xa7\\x1e\\x11\\xd9\\x93\\xab\\xe4\\x33\\x56\\x98\\x92\\xb8\\xf7\\x5d\\x76\\x37\\x99\\x32\\x45\\xc8\\x84\\x47\\x8a\\xbe\\x3f\\x95\\xf4\\x4b\\x0a\\x4b\\xbe\\xde\\xfe\\xf8\\x90\\x6b\\x75\\xe0\\xd3\\x40\\x20\\xae\\x53\\x64\\x55\\xb0\\xe0\\x6f\\x9b\\xfe\\xe1\\x1e\\xc9\\xb8\\x60\\x4b\\xac\\x2c\\xc6\\xeb\\xe0\\x8c\\x8f\\xd5\\xf5\\xcc\\xcc\\xcb\\xc1\\x61\\x7b\\x7c\\xf6\\x9a\\x3c\\x51\\x2e\\x1f\\x0b\\xdb\\x58\\x5d\\xf5\\xe1\\x27\\x43\\x06\\x1f\\x7c\\x20\\x53\\xbc\\x37\\x14\\x43\\x61\\xc0\\xb3\\x5f\\xd3\\x9d\\x56\\xb1\\xef\\xaf\\x92\\xc6\\x10\\x36\\x01\\x93\\xec\\x20\\x59\\x8b\\x82\\x85\\x80\\x50\\xa6\\xd9\\x9e\\x08\\x2b\\xce\\xfd\\xbd\\x53\\x18\\xee\\x5e\\xfb\\x3b\\x26\\x0f\\x32\\x76\\xf3\\xc7\\x3f\\x9c\\x24\\xce\\x0c\\xda\\x33\\xc7\\xac\\xc5\\x0c\\xa5\\xdd\\x61\\xbd\\xb8\\x5d\\x79\\x38\\x25\\xf6\\x73\\x2a\\x6e\\x33\\x0c\\xe6\\x72\\xac\\x44\\xfe\\x6b\\x2b\\x9a\\xfe\\x6e\\x2e\\x96\\x5c\\x02\\xd2\\xa1\\xfe\\x0b\\x57\\xcb\\x1b\\x31\\x7c\\x1d\\x31\\x3e\\xfd\\xc3\\x56\\x49\\x2f\\xe8\\x96\\xfd\\x14\\x9d\\xae\\x51\\xc9\\x5c\\xcd\\xbb\\x7d\\x11\\xf7\\xd6\\x10\\xe0\\xc6\\xe2\\xfd\\x3e\\x57\\xfc\\xfe\\xf1\\xc5\\x7c\\x71\\x19\\xa0\\xaf\\x6c\\x78\\x21\\xfe\\xcd\\xb8\\x9d\\x80\\x30\\x2b\\x49\\xfa\\xd4\\x17\\x43\\xf3\\xd2\\xd7\\xa0\\x75\\x15\\x4b\\x31\\x43\\xe5\\x1a\\xeb\\x94\\x7d\\x4b\\x5e\\x8b\\x7e\\x4c\\xa8\\x6f\\xec\\x3e\\x80\\xbd\\x9a\\x78\\x6e\\x4e\\x46\\xed\\x1e\\x6e\\x9f\\x7e\\x0b\\x63\\x52\\x66\\xd9\\xfa\\x09\\x7a\\xa9\\xe2\\x0f\\x32\\xe3\\xd2\\x77\\x2d\\x7c\\x1f\\x00\\x8b\\xcd\\xd3\\xf9\\x2c\\x72\\x83\\xc5\\x77\\x90\\xc3\\x62\\x2c\\xba\\xd3\\xca\\x35\\x80\\x3c\\x45\\xc8\\x69\\xdc\\x37\\x7f\\xf3\\x6b\\xd7\\xc0\\xe6\\xf1\\xbb\\x89\\x2f\\x73\\x29\\xa6\\xe0\\x8d\\xf1\\xdb\\xeb\\xc8\\x1d\\xc7\\xb1\\x15\\xf8\\x52\\xe3\\x6a\\xe5\\xd9\\x28\\x72\\x5f\\xa7\\xc6\\xfb\\x9f\\x28\\xb0\\xfb\\x39\\x4f\\x9e\\x38\\xfd\\x87\\x62\\x5c\\x5f\\xa2\\x3a\\xab\\xa4\\x70\\x54\\xe8\\xcf\\xea\"},\n{{0x97,0xb6,0x70,0x2e,0x24,0x68,0x05,0xdb,0xcf,0xc7,0xfa,0x42,0x4a,0x8c,0xaa,0xbc,0xf2,0x62,0xd4,0x66,0xa0,0x5e,0x0d,0xd2,0xd4,0xe7,0xc3,0x74,0xd5,0x7d,0x52,0x51,},{0xa7,0x16,0xc3,0xd5,0xce,0x78,0xf4,0xd9,0xc5,0xbe,0xe3,0x44,0x7d,0xda,0xf4,0x88,0x1c,0x98,0x6e,0xfd,0xf6,0x67,0xac,0x89,0x77,0xb4,0xfb,0x69,0xb5,0xa7,0x11,0x0a,},{0x90,0x00,0x55,0x41,0xdc,0xc1,0xd7,0xab,0x83,0x7f,0x4d,0xe5,0x39,0x3f,0xad,0xd6,0xa9,0x2b,0x26,0xa7,0xd9,0x3a,0xf3,0xf6,0x69,0xe0,0xf1,0xbf,0xd6,0x21,0xcb,0xd0,0x0c,0x8a,0x23,0x05,0x6d,0x2d,0xa6,0x78,0x65,0x57,0xc8,0x28,0xa4,0x9b,0xe1,0xe4,0x02,0x1d,0x99,0x31,0x12,0x35,0xac,0x0d,0x4d,0x56,0xee,0xfc,0x7c,0x95,0x36,0x05,},\"\\xea\\xa8\\x6c\\xf7\\x6f\\xcb\\x65\\xc6\\xf9\\xfc\\x20\\x8a\\xc3\\x6f\\x28\\xb2\\x00\\xd3\\xb4\\x03\\xac\\xa7\\x32\\x07\\x46\\x1d\\x8d\\x96\\xaf\\xa2\\x46\\xd7\\xc6\\x9d\\x17\\xa7\\xa9\\xbf\\x77\\xf0\\x55\\x43\\x56\\x3a\\x7d\\x3e\\xca\\x1d\\x40\\x79\\xe2\\x29\\x38\\xab\\xa1\\xf6\\xe9\\xe0\\x4b\\x49\\xfb\\xc8\\xed\\x6f\\x63\\xb5\\x99\\x73\\x0d\\xe9\\x97\\x98\\x31\\xc0\\x2f\\x8c\\xba\\x61\\xe5\\x55\\x60\\xd7\\x11\\x0d\\x4c\\x6e\\x61\\x67\\x97\\x06\\xa7\\x15\\x5d\\x5a\\x67\\x3c\\x54\\xd1\\x6f\\xe4\\xd2\\x28\\xc2\\xec\\xa7\\x54\\x6f\\xaa\\x13\\x39\\xf2\\x6d\\x7a\\x0b\\xb4\\xee\\x33\\x96\\x11\\xaf\\xde\\xc9\\xa6\\x8f\\x5f\\xf5\\xb5\\xd2\\x03\\xb6\\x00\\x53\\x3a\\xd5\\xa3\\xb3\\x68\\xc8\\x5d\\xa1\\x15\\x63\\xf0\\x98\\xcc\\x26\\x87\\x1e\\x7f\\xa9\\x9a\\xef\\xd3\\x8c\\xc2\\x61\\x51\\xdb\\x3b\\x0b\\xae\\x38\\xdb\\x6a\\x87\\xb6\\x78\\x9e\\x58\\x40\\xb1\\x08\\x84\\xaf\\x51\\x1f\\x3e\\xcb\\x3e\\xcb\\xf9\\x4f\\xf8\\x6f\\xdb\\x90\\x55\\x05\\xa8\\xc3\\x4b\\x2a\\xa6\\x1f\\xf2\\xec\\x9e\\xc8\\xfe\\xbd\\x1d\\xfe\\xd0\\x96\\x5b\\x6f\\xc5\\xb9\\xf8\\x86\\x9d\\xc3\\xa4\\x75\\x59\\x97\\x4a\\x88\\x22\\x99\\x67\\x06\\xda\\xef\\xbc\\x6c\\x5b\\xf9\\x84\\xce\\x06\\xb0\\xd3\\x2b\\x31\\xcf\\x9d\\x8a\\xd1\\x36\\xae\\xd4\\xb0\\x52\\x58\\x6d\\xce\\x70\\x73\\xb7\\x67\\xb2\\x34\\xe4\\xa3\\x7b\\xeb\\xbc\\x39\\x3d\\xd2\\xe0\\xf7\\xd1\\x55\\x17\\x35\\x48\\xc3\\x8a\\x15\\x83\\xef\\x94\\xe0\\xaa\\x84\\xe7\\xfc\\xe0\\x4f\\xcc\\x9b\\x4e\\x30\\x0a\\xd0\\x99\\x44\\x9a\\x49\\x23\\x2a\\xbd\\xcf\\x3d\\x1a\\x6e\\x6f\\xca\\xb6\\x96\\xf5\\x99\\x6f\\x9b\\xd1\\xb9\\x48\\x5d\\x07\\x47\\x55\\xac\\x5b\\x42\\x97\\xfe\\xe3\\x12\\x4c\\x7c\\x03\\x97\\x6a\\x40\\xd5\\x70\\xbe\\xae\\xc2\\xfa\\xc9\\x92\\x33\\x9f\\x88\\x5f\\x74\\xd4\\x0e\\xd4\\xac\\x87\\xa4\\xf4\\x0c\\xef\\xbc\\x48\\x64\\xf4\\x4c\\x36\\x83\\xaa\\x8f\\x10\\x26\\xe2\\xc3\\x7a\\xef\\xfc\\xeb\\xfd\\xfe\\x24\\xdd\\x0b\\x01\\x9c\\x36\\xa7\\x98\\x88\\x20\\x30\\x04\\xb2\\xad\\x83\\xe8\\x92\\x21\\xf3\\xf6\\x36\\xf4\\x55\\xbb\\x64\\xe1\\x7d\\x17\\x54\\xc7\\xc6\\xdd\\x7f\\xc0\\x9a\\x0d\\x65\\xdd\\xdd\\xed\\x46\\x22\\xfc\\x4f\\x9f\\xba\\x07\\x2b\\x45\\x10\\x34\\x35\\xe1\\x02\\x20\\xa5\\x86\\xf1\\x52\\x26\\xd2\\xeb\\x37\\x7f\\x40\\x64\\xd3\\xff\\x37\\xcb\\xb4\\x70\\x5a\\x1f\\xaa\\xf5\\xb3\\x48\\xf8\\xc0\\xef\\x7f\\xd1\\x56\\x4d\\x42\\x86\\x88\\xf5\\x8f\\x33\\x92\\x96\\x7c\\xf3\\x96\\xa8\\xff\\x2f\\xd9\\xe7\\xb5\\x17\\xb7\\xd6\\xa5\\xed\\xe7\\x44\\x03\\x73\\xd8\\xcc\\x1a\\x83\\x99\\x00\\xe8\\x4d\\x42\\x25\\x42\\x83\\xd9\\x69\\x9c\\x7c\\xa3\\x7e\\x47\\x76\\x92\\xa3\\x49\\x40\\x08\\xb8\\x04\\x44\\xc5\\xcf\\x61\\x4c\\xbb\\xc1\\x69\\xbf\\xb9\\x29\\x63\\x03\\xc6\\x45\\xe2\\xce\\x28\\xd1\\x68\\xdc\\x6c\\xba\\xef\\xae\\x9c\\x73\\x19\\x1f\\x57\\x15\\x1a\\xa4\\x73\\x00\\x9d\\x29\\xe1\\x80\\x0b\\x10\\xf4\\xc4\\x98\\x60\\x9b\\xa1\\x15\\x20\\x98\\x5c\\x78\\x09\\x20\\x58\\x69\\x6f\\xdb\\xca\\x9c\\x02\\x0e\\x2d\\xfb\\x8a\\x04\\x3a\\x3d\\xe8\\xe4\\x52\\xd5\\x8c\\xd1\\xad\"},\n{{0xd1,0x52,0x8c,0x14,0x06,0xa6,0xe4,0x94,0xa0,0x2f,0x63,0x53,0x05,0xfa,0x74,0xd7,0x45,0xc6,0x93,0x27,0xfd,0x31,0xb7,0xd2,0xc2,0x62,0x3d,0xe2,0xc0,0x30,0xed,0x85,},{0x0c,0xfe,0x36,0x9c,0xf9,0x3d,0xaf,0x6d,0x53,0xef,0x02,0x8d,0xdb,0x9f,0x00,0x04,0x43,0xb0,0x97,0x2f,0xe2,0x53,0x2f,0x83,0xa4,0x1c,0xe6,0x57,0xc1,0x83,0x6c,0xa3,},{0xb8,0x39,0x9b,0xc3,0x32,0x6c,0xba,0x0a,0x93,0xa4,0x24,0x97,0x16,0x8b,0xf5,0x7f,0x91,0x06,0xee,0x43,0xd3,0x9b,0xf0,0xfc,0x86,0x68,0x51,0x99,0xdc,0x6e,0x0a,0x13,0xb9,0xc7,0x24,0xef,0x17,0xe7,0x88,0x2a,0xf8,0xc2,0xeb,0x70,0xf6,0xc9,0xe4,0x2d,0xfa,0x2f,0xbf,0x0c,0x1c,0xb5,0x00,0x2b,0x58,0xf1,0x08,0x66,0x19,0x73,0x3e,0x02,},\"\\xab\\xb3\\x67\\x3f\\x3f\\xa1\\x7a\\x33\\xa7\\xaf\\xf7\\x6e\\xac\\x54\\xe7\\x68\\x7c\\x04\\xbc\\x84\\xf7\\x66\\x65\\x1a\\x8b\\x24\\xba\\x22\\x94\\x79\\x08\\xb0\\x4c\\xa4\\x59\\xfe\\xb9\\x8a\\xce\\x7c\\xab\\x1e\\x74\\x33\\xa6\\xa6\\xbe\\xff\\xd8\\xd9\\x50\\x4e\\x29\\x91\\xda\\xa0\\x64\\x4d\\x61\\xb8\\xb2\\xe4\\x54\\x48\\xf5\\x4d\\xf8\\x81\\x3f\\x50\\xc4\\x18\\xb4\\x8f\\x49\\xe1\\x03\\x4e\\x85\\x1c\\xbe\\xc3\\xef\\x0a\\x18\\x50\\xef\\x72\\x67\\x33\\xaf\\xaf\\x68\\xe1\\xa4\\x61\\x04\\x16\\x51\\xc1\\x38\\xd5\\x4e\\x4e\\xf7\\x81\\x87\\xaf\\x9a\\x73\\x42\\xf7\\x12\\x87\\x27\\xf9\\x03\\xbf\\x4f\\xc5\\xef\\x3e\\x40\\xc6\\x4e\\xc2\\x6f\\x89\\x2f\\x59\\xad\\xd9\\x8f\\xe3\\x94\\x76\\x5a\\xaa\\x7d\\x09\\xca\\xe8\\x1b\\x9f\\x69\\x9a\\x9d\\xd8\\xbf\\x2e\\x2f\\xe8\\xe1\\xec\\x78\\xfc\\x88\\x4e\\xaa\\x0d\\x2d\\xbd\\xbf\\xb8\\xc1\\x68\\x83\\x3e\\xe0\\xd2\\x18\\x03\\xcc\\x35\\xdc\\x62\\x8d\\x7c\\x07\\xe0\\x44\\x04\\xfb\\x60\\xe8\\xc4\\x90\\xa8\\xdd\\x34\\xed\\xbc\\xba\\xaf\\x80\\xcc\\xda\\xe3\\xf7\\xd3\\x73\\x9e\\x0e\\x89\\x70\\x23\\xee\\xb5\\xb1\\xa8\\xc0\\x0a\\x96\\x73\\xc5\\x92\\x58\\x24\\x0d\\xdd\\x44\\x20\\x65\\x0f\\xe5\\x77\\x1f\\x7e\\x28\\xcb\\x23\\x99\\xf5\\xe1\\xe0\\x2a\\xd0\\xb6\\x43\\x2d\\x9b\\x49\\x60\\x8f\\xcf\\x0b\\x1c\\x0d\\x7c\\x41\\x2a\\x44\\x52\\x55\\xb8\\xba\\xdc\\x53\\x21\\xc2\\x4c\\x1a\\xc9\\x2c\\x79\\xa0\\xba\\xcc\\xb9\\xde\\xff\\xed\\x02\\xd1\\x2f\\x55\\x36\\xcd\\x59\\x5d\\xc6\\x60\\x83\\xb3\\x3a\\x36\\x03\\xa9\\xd1\\x6e\\xce\\xa2\\xbf\\x38\\xc4\\xf2\\xaa\\xf5\\x70\\xf3\\x0d\\x21\\x16\\x2b\\x2e\\xfd\\x7e\\x4d\\x5e\\xbf\\x1e\\xca\\xe9\\x58\\x8e\\xee\\x36\\xdd\\x9d\\x3d\\x8e\\x3b\\xe7\\xbc\\x6d\\x4b\\xc2\\x18\\x56\\x22\\xf1\\x1d\\x1d\\xa7\\xc4\\x9c\\x93\\xe6\\x23\\xac\\x56\\xfe\\xe7\\xe3\\x70\\x6d\\xb8\\x31\\x3c\\xf9\\x26\\xbe\\x92\\xe5\\xc8\\xa5\\x39\\xfd\\x16\\xb0\\xf4\\x38\\xda\\x8e\\x51\\xa5\\x1f\\x2d\\x27\\x64\\x03\\x56\\x12\\x4e\\xf7\\xbe\\x2f\\x91\\xff\\xa1\\x79\\x6a\\x91\\xb1\\x23\\x01\\x93\\x4d\\xde\\xf0\\xc7\\x93\\x8a\\x7a\\x45\\xf3\\x6f\\x53\\xb6\\x32\\x2d\\x9c\\x8f\\x9d\\x27\\x5e\\x1c\\xd2\\xc0\\xf1\\x29\\xf8\\xab\\x8d\\x74\\x15\\x5b\\x5d\\x9e\\x5c\\x15\\xc0\\x15\\xb0\\xb0\\x00\\x03\\xb2\\xbd\\xdf\\xa0\\xbc\\xfc\\xc6\\x93\\xa1\\xdf\\xcb\\x4f\\x53\\xda\\xec\\x12\\x6d\\x16\\x69\\xf3\\x3f\\x39\\xad\\x05\\x51\\x9e\\xf7\\xc5\\xce\\x40\\xe6\\xf4\\x57\\x3c\\x24\\x7a\\x32\\xc4\\xa0\\x16\\x28\\x31\\x35\\x2f\\x6d\\x55\\x8f\\xf5\\x83\\x6a\\x53\\x17\\xdb\\xc4\\x51\\x5b\\x3d\\xf2\\x69\\xa8\\xac\\x76\\xd6\\x43\\x6f\\x26\\x4b\\x64\\x56\\x1e\\x79\\x68\\xb5\\x82\\x21\\x08\\x48\\x7b\\x04\\x5c\\x92\\xd6\\xc6\\x14\\x2a\\x1c\\x28\\x55\\xb3\\x8b\\xee\\xbd\\x64\\x25\\x65\\x12\\x3c\\xc8\\x27\\xcb\\x18\\x31\\x19\\x9e\\x6f\\x12\\xa7\\xe4\\x23\\x68\\x56\\xb9\\x4d\\xad\\x73\\x8f\\x69\\xd1\\x10\\x6e\\x77\\x35\\xd7\\x11\\xf7\\xc6\\xa3\\xa3\\x37\\x80\\x41\\xfc\\x7a\\x21\\x10\\x3b\\xbf\\x86\\x69\\x07\\xd4\\xed\\xdd\\xaf\\xa0\\xe7\\xf1\\xbb\\x5f\\xfd\\x41\\xa6\\x0d\\x64\"},\n{{0x51,0x23,0x40,0xf9,0x61,0xf1,0x42,0xd1,0x91,0x5e,0x85,0xfe,0x4f,0xa0,0xf5,0x51,0xf8,0x08,0x92,0xe7,0x5a,0xcc,0xce,0x7c,0xd1,0x86,0x9e,0x6e,0x2c,0x9e,0x80,0x15,},{0x0c,0xa0,0x26,0x04,0xfa,0x87,0xe2,0xc2,0x05,0x06,0x25,0x1f,0x07,0x92,0xcd,0x21,0x25,0x85,0x6f,0x0a,0xb1,0x6d,0x66,0x3f,0x28,0x11,0x96,0x3b,0x1f,0x2d,0x81,0x72,},{0x6b,0xb4,0xd9,0x75,0xaf,0xae,0xf4,0x1e,0xa9,0xef,0x08,0x5a,0x68,0xc5,0x68,0xa0,0x5d,0xa3,0x7e,0xf2,0x1d,0xad,0x46,0x4e,0xd8,0x6a,0xc0,0xd4,0x08,0x0e,0x7d,0x01,0x29,0xfb,0x02,0x31,0x31,0xec,0xa5,0xf7,0xad,0xb2,0x58,0x6a,0x18,0xbe,0x40,0x56,0x2f,0xa2,0x76,0x4c,0xa8,0x07,0xe6,0x70,0xa0,0x59,0x6a,0x5c,0x54,0x7b,0xc0,0x01,},\"\\xaf\\x37\\xb2\\xc7\\x58\\x7a\\x8d\\x5b\\xc8\\x95\\xcd\\x35\\x77\\x46\\xab\\x03\\x55\\x2a\\x0a\\x56\\x1a\\x29\\x3d\\xc7\\x16\\x4e\\x39\\xb6\\xa1\\x33\\x3a\\x92\\x0b\\xb6\\xda\\xca\\x60\\x06\\x67\\x6e\\x99\\xbb\\x7e\\x92\\x8f\\x9e\\xa3\\x91\\xe5\\x48\\x02\\xa8\\xd3\\x15\\x96\\x28\\x9f\\xb9\\xbf\\xe3\\x00\\x00\\xcf\\x52\\xeb\\xf0\\xc1\\x24\\xa5\\x89\\x5b\\xce\\x33\\x98\\xc1\\xbf\\x53\\x56\\xbe\\x82\\x61\\x9b\\x8d\\xdc\\x15\\xa7\\x7c\\xa9\\x22\\x49\\x4b\\xdb\\x04\\xf5\\xc2\\xe1\\xb6\\xe8\\xff\\x77\\xae\\x74\\x9f\\xaf\\x2b\\x8a\\x41\\xd8\\x22\\xc1\\x7c\\x06\\xdf\\xb7\\xa5\\xf9\\x43\\x4d\\x8b\\xd7\\x15\\xec\\x87\\x78\\xe8\\x0b\\x81\\xd2\\xe8\\xd0\\x62\\x98\\x74\\x86\\x90\\xc6\\x55\\x52\\x83\\xc9\\x8b\\xb9\\xb1\\x9b\\x92\\x46\\x66\\x7b\\xc4\\x10\\x46\\xff\\x98\\xc2\\xc3\\x5d\\x16\\x1e\\x1f\\x4d\\x69\\xd2\\x54\\xec\\x5a\\x07\\x6f\\x25\\xbd\\x5c\\x7e\\x2c\\x98\\xca\\x3c\\x09\\xd8\\x08\\x33\\x96\\x2c\\xf9\\x66\\x02\\x87\\x88\\x40\\x96\\xeb\\x30\\xc4\\x6c\\x54\\x17\\x41\\x06\\xaf\\x4e\\x29\\x79\\xa1\\x12\\xf3\\xe8\\x94\\x4e\\xaa\\xf7\\x66\\x9c\\x40\\xd5\\xaf\\xb9\\x1a\\x02\\x4a\\xbb\\xeb\\x14\\x66\\x4e\\x30\\x89\\x03\\xe4\\xd2\\x6d\\x70\\x09\\x44\\x6e\\xe2\\xe8\\x30\\xab\\x5e\\xca\\x0d\\xbb\\xc5\\x13\\xfb\\x4e\\x04\\x35\\x1d\\xf2\\xf6\\x74\\x18\\x64\\xfb\\x23\\x71\\xb2\\x50\\x2b\\xe4\\x3d\\xc1\\x5f\\xc0\\x44\\x31\\xff\\xf5\\xeb\\x8d\\x4b\\x68\\xd7\\x24\\x62\\xae\\x32\\x2e\\x57\\xba\\x2d\\x4a\\xdd\\xdf\\x15\\xa1\\x90\\x2c\\x21\\x13\\xae\\xbd\\x3b\\x5d\\x61\\x29\\x17\\xc1\\xbb\\x73\\xe7\\x08\\xad\\x54\\x18\\xe7\\xd4\\x5e\\x4b\\x72\\x80\\xfc\\x88\\x96\\xab\\x80\\x85\\x3f\\xf5\\xf8\\xe9\\x8f\\x26\\x55\\x3f\\xc7\\x8e\\x30\\xb3\\xb0\\xd7\\x27\\xbf\\x6d\\x06\\x4a\\x8f\\x32\\x88\\x87\\x68\\xc5\\x1e\\xbb\\x61\\xb2\\xc6\\x00\\xb4\\x02\\x8a\\x77\\x06\\x0f\\xeb\\xbb\\x02\\xeb\\x3d\\x20\\x17\\x80\\xe7\\x45\\x66\\xc8\\x6a\\x34\\x03\\x18\\x36\\xbc\\xe9\\xea\\xda\\x81\\xe5\\xd0\\xf3\\x39\\x60\\xcb\\x2d\\xf0\\x8a\\xff\\x3c\\x97\\x49\\x21\\xfc\\x9b\\x7d\\x3a\\xa7\\xc8\\x1e\\x9c\\x67\\x1e\\xd6\\xd3\\x3e\\x7a\\xe5\\xed\\x03\\xa5\\x41\\x7d\\x7e\\x5c\\xd6\\xfa\\xac\\x91\\xb5\\x4b\\x8f\\x79\\x2f\\x48\\x28\\x3c\\x60\\x64\\x7d\\xe3\\xda\\x81\\x6c\\xa9\\x75\\x6c\\x5b\\xfe\\x1b\\xb8\\xb5\\x97\\x9e\\x57\\x54\\x01\\xbd\\xa3\\x4e\\x9c\\xbc\\x4d\\x77\\xe7\\x11\\xd6\\xb7\\x3b\\x82\\xda\\x19\\xda\\x47\\x3b\\x55\\xe8\\xe7\\x2d\\x34\\x1b\\x2d\\x85\\x03\\xe4\\x86\\x09\\xbe\\x0f\\xe2\\x91\\x44\\x4c\\x28\\x36\\x69\\xe5\\xde\\xad\\xea\\xf5\\x2a\\xa8\\xec\\x48\\xda\\x83\\xf5\\x32\\x8c\\xc0\\x99\\xfb\\x41\\xf8\\x2b\\xec\\xdd\\x58\\xd0\\x4b\\x1d\\x66\\x20\\x3d\\x73\\x7b\\xed\\x06\\xcf\\x21\\xc9\\x78\\x19\\xac\\x13\\xed\\x71\\x1c\\xa2\\x17\\xa5\\x7c\\xf7\\xd8\\x0f\\xf0\\x82\\xaa\\x1a\\x1c\\xf8\\xfe\\xa5\\x55\\xcd\\x2e\\x47\\xe4\\xdd\\xab\\x5e\\x3f\\x99\\x41\\xad\\x4f\\x77\\x5f\\x49\\x41\\x9d\\xca\\xdb\\x5b\\x00\\x4b\\x68\\xca\\xf4\\x5b\\x27\\xef\\x49\\xba\\x14\\xfb\\x52\\xb0\\x9f\\x1b\\x18\\x5b\\xe9\\xf9\\xc7\"},\n{{0xb1,0xb6,0x36,0xe9,0x57,0x57,0x4c,0x21,0xa9,0x57,0xa4,0x5b,0xd1,0x95,0xc6,0xf9,0xfe,0x4c,0xc1,0xc5,0x7e,0x84,0x13,0x4d,0x39,0xb4,0x2e,0x1a,0x84,0x32,0x9e,0xdb,},{0x95,0xe7,0x7b,0x15,0xdd,0xa4,0x7c,0xaf,0x69,0xb7,0x28,0x88,0xdd,0x69,0x96,0x1b,0xac,0xbe,0xc3,0xbc,0x75,0x35,0x30,0x03,0xe8,0xbf,0xf0,0xa4,0x3d,0xdf,0x4b,0x7a,},{0x76,0x3c,0x7d,0x0d,0x46,0x87,0x8e,0x5c,0x7e,0xcf,0x71,0x04,0xfc,0x1f,0x22,0x30,0xe4,0x61,0x78,0xa2,0x7c,0x75,0xf1,0x96,0x16,0x9c,0x02,0x79,0xed,0xb0,0x1c,0x28,0xfc,0xde,0x3b,0x0d,0x5b,0x86,0x35,0xcf,0xe3,0x39,0xfb,0x23,0x27,0x74,0xb2,0x20,0x6d,0xab,0x8a,0x46,0x0c,0xe4,0x17,0xab,0xf4,0x90,0xbb,0xfa,0x78,0x5c,0x02,0x05,},\"\\xe2\\x5d\\x32\\x9c\\xad\\x83\\x64\\xd2\\xde\\xc2\\x43\\x73\\xe9\\x2d\\x9d\\x50\\xfc\\x7a\\xbe\\x8f\\xdc\\x3d\\x0b\\x4e\\xe5\\x7e\\x1c\\xfa\\x5b\\x7c\\xd5\\x8c\\x23\\xbe\\x91\\x8f\\x05\\x17\\x9b\\xa8\\x41\\xb6\\x1e\\x18\\x00\\x34\\xca\\x7e\\x74\\xd4\\x9b\\x0a\\x1a\\x2c\\xeb\\xb4\\xbe\\x65\\x34\\x4c\\x91\\x3c\\x46\\xd3\\x26\\x52\\x33\\x6e\\x6b\\xda\\x4e\\xfa\\x3f\\x58\\x73\\x0d\\x39\\xa6\\x33\\xa1\\x4c\\xa3\\xd9\\xa6\\x2a\\xbb\\x0a\\x73\\x98\\xcc\\x29\\xaf\\xf9\\x16\\xee\\xea\\x2e\\x7c\\xaa\\xc8\\x08\\x45\\x56\\x2f\\x73\\xd4\\x03\\x0f\\x9c\\xab\\x0b\\xf1\\xc6\\x40\\x7f\\x54\\x01\\x51\\x3e\\xf8\\x7f\\xe6\\xdc\\x09\\x9d\\xbc\\x5d\\xfc\\x33\\x52\\x91\\x1c\\x07\\xaf\\x6c\\x52\\x3b\\xef\\x4c\\xca\\x78\\x37\\x96\\x59\\xe8\\x80\\x3f\\x58\\x59\\x04\\xee\\x6e\\xf6\\xfd\\xe7\\x73\\x66\\xd9\\x6d\\x2c\\xcf\\x24\\x8a\\x53\\x20\\xd9\\xb8\\x29\\x8b\\x2a\\x73\\x36\\x38\\x79\\x10\\x7a\\x02\\xb4\\x7f\\x57\\x21\\x3a\\x85\\x20\\x3a\\xbb\\xca\\x5a\\x41\\x95\\xf8\\xaf\\x3e\\x35\\x93\\xed\\x2f\\xa3\\x50\\x4b\\xb7\\x6a\\x3e\\x1b\\xe2\\x4b\\x66\\xd3\\x55\\x66\\x29\\x32\\xcb\\x67\\xdc\\x88\\x50\\x3a\\xfa\\xf7\\x62\\xbf\\xf7\\x41\\xba\\x1c\\xac\\xe9\\x7a\\xc5\\x8b\\xaf\\xad\\x5d\\x36\\xc3\\xaa\\x02\\xe0\\xcb\\xe2\\x0e\\x5f\\x3d\\xc8\\x09\\x2c\\x51\\x2e\\xaa\\x9c\\x49\\x43\\x47\\x4a\\xad\\x41\\x99\\x00\\x76\\x72\\x1a\\xd3\\xf5\\x3f\\xb0\\x8a\\xc2\\x29\\x82\\xed\\x9b\\x15\\xc7\\x51\\xa9\\xe2\\x33\\x82\\xf6\\xa6\\x9c\\x72\\xe6\\xe2\\x44\\xe0\\xeb\\x68\\x1e\\x6d\\xd2\\x28\\xd3\\x77\\x4f\\xcc\\xb3\\x7e\\xb6\\x23\\x2f\\x82\\x5d\\x16\\x9a\\x2a\\xc8\\xb7\\xe1\\x8a\\x42\\xcd\\xaa\\x4f\\x2c\\xf0\\x58\\x90\\xbb\\x0c\\x59\\x8c\\xf8\\xc3\\x1f\\x82\\x9e\\xf8\\xca\\x24\\x35\\xbd\\xcc\\xeb\\x0e\\x61\\x93\\xad\\xa7\\x84\\x1e\\xe6\\x92\\xf3\\x0a\\xed\\xf8\\x8b\\x62\\x73\\x11\\xb1\\x38\\xac\\x78\\xb3\\x91\\x3e\\x06\\xf7\\xc3\\x21\\xca\\xfb\\x39\\xd9\\x01\\xdf\\xe1\\x74\\x30\\xb1\\xa2\\x0b\\xc4\\x37\\xa5\\x55\\xa5\\x78\\xfa\\x31\\xe4\\xb6\\x80\\x79\\x54\\x45\\x6b\\xd4\\xb0\\x4d\\x5d\\x88\\x79\\x87\\xbd\\xf0\\x4e\\x0f\\x14\\xaf\\x31\\x41\\xb2\\x4c\\x3a\\x7b\\x9a\\xc7\\x5a\\xa3\\x2e\\x2f\\xcd\\x21\\x71\\xa1\\x26\\x09\\xe1\\x5e\\x73\\x09\\x4f\\xd0\\x92\\x21\\xb4\\xd2\\x70\\x90\\xe7\\x32\\x19\\xb6\\x48\\xbc\\xaa\\xbf\\x38\\x07\\xc9\\x28\\x0b\\x6c\\x4a\\xd7\\x50\\xa4\\x68\\xbe\\x0e\\x1a\\xd3\\xe6\\xe6\\x30\\x16\\xcb\\x5c\\xec\\x3a\\xad\\xdc\\x56\\x89\\xc2\\x95\\x5a\\x2a\\x8d\\x5b\\x89\\x84\\xd7\\xc4\\x43\\x76\\xfd\\xd9\\x4d\\x3f\\x5f\\xf1\\x29\\x8f\\x78\\x17\\x2b\\x56\\x59\\x13\\x70\\x4e\\x90\\xe5\\xac\\x03\\x8c\\xb1\\x72\\x0e\\x19\\xb0\\x80\\xf8\\x1b\\x53\\xd6\\xa4\\x5d\\x45\\x28\\x53\\x07\\x11\\xb6\\x3d\\xfe\\x1e\\x47\\x81\\xc2\\x4d\\x74\\xae\\xb2\\xbd\\x8a\\x73\\xfd\\x2a\\x99\\x3c\\x5b\\x08\\x91\\x39\\x21\\x96\\xac\\x32\\xc5\\x23\\x69\\x99\\x60\\xd8\\xb2\\x3e\\x01\\x66\\x4c\\xf9\\x02\\x1d\\x93\\x92\\x80\\x50\\xca\\xf9\\x7f\\xb9\\x85\\x55\\x45\\x80\\xe3\\x33\\x36\\xa4\\x56\\x32\\x47\\xdf\\x59\\xef\\x6c\\xae\\x53\"},\n{{0x10,0xca,0x41,0x3d,0x70,0xeb,0x3d,0xb6,0xe3,0x37,0xf0,0xf1,0x1a,0xbc,0x07,0x5c,0x95,0x85,0x9e,0x82,0x5f,0x87,0x61,0x76,0x07,0x69,0x52,0xd2,0xf1,0x88,0x80,0x30,},{0x50,0x28,0xba,0x38,0xaf,0xec,0xc2,0x42,0x63,0x5f,0x6e,0x35,0x3d,0x5f,0x4a,0xfd,0x12,0x3f,0x86,0x0a,0x04,0x25,0x22,0x0e,0x96,0x65,0x52,0xa0,0x57,0x88,0x08,0x23,},{0x6a,0xec,0x02,0xdc,0x6b,0xdf,0xcb,0x67,0xf0,0xef,0xc1,0xfd,0x31,0xe2,0x3e,0x69,0xe3,0x71,0xab,0x38,0x02,0x50,0x5b,0x32,0x01,0xa9,0x5d,0xd5,0x25,0x41,0x7e,0xd1,0xa1,0x28,0xdb,0x4e,0x18,0x2c,0xb3,0x7c,0x28,0xf6,0x28,0x06,0x66,0x70,0x99,0xa8,0xad,0x48,0x0b,0x0a,0xc9,0xe9,0x4c,0x2a,0x7d,0x5a,0x0e,0x96,0xe2,0xa7,0x36,0x0d,},\"\\xea\\x7f\\xaf\\x79\\xf6\\xff\\x5d\\x78\\xa8\\x23\\xa7\\x54\\x34\\x71\\x34\\xf1\\xb3\\xc3\\xe9\\x1c\\xe5\\x18\\xfd\\xd6\\x33\\xfe\\xb4\\xf0\\x5d\\x12\\x5f\\x05\\xcb\\x54\\x33\\x6e\\xf5\\x60\\xe9\\x2d\\xeb\\x68\\x51\\x12\\xa5\\xff\\xcd\\x3d\\xfd\\x39\\x64\\xb2\\x75\\x8c\\xe4\\x78\\x5f\\x6a\\x34\\xbf\\xeb\\x39\\x78\\x4f\\x0a\\xee\\x55\\x95\\x5a\\xeb\\xd1\\x2d\\xdd\\xa6\\x41\\xd0\\x57\\x69\\xf7\\x44\\x02\\xf7\\x06\\xda\\xd2\\x01\\xc4\\x4c\\x91\\x08\\x1c\\x7d\\x7f\\x65\\xe7\\xaa\\x42\\x46\\xde\\x6d\\xc3\\xed\\x64\\x96\\xd1\\x0f\\x4a\\x41\\x20\\x60\\xd4\\x93\\xba\\xc9\\xae\\xd5\\xbe\\x4f\\x6d\\x74\\x22\\x9e\\x3c\\x55\\xeb\\x68\\x76\\xe3\\xbb\\x2e\\xd4\\x1f\\xa4\\x50\\x4b\\x66\\x70\\xdd\\xa8\\xc7\\x98\\xf6\\xda\\xa2\\x80\\xd1\\xaa\\x72\\x02\\x11\\x74\\xf6\\xc0\\x1a\\xec\\x49\\xb3\\x21\\xd8\\x7f\\x53\\xac\\xbc\\xad\\xcc\\x46\\x07\\xd5\\xb1\\xe4\\x5d\\x63\\xfc\\x48\\x1a\\x6d\\x90\\x57\\x6c\\x87\\xc1\\x88\\x0b\\x2e\\x8f\\xf3\\xe5\\x90\\xa9\\x6b\\xee\\xe1\\x80\\x47\\x68\\xc7\\x56\\xbe\\xb8\\x6b\\xf1\\xde\\x8a\\xdc\\x40\\x8b\\x1b\\x8d\\x66\\x6f\\x74\\xba\\x28\\x63\\x08\\x22\\xf9\\x2d\\x18\\xb0\\x56\\xae\\x37\\xce\\x02\\x93\\xee\\x61\\xb9\\xe8\\x0f\\x33\\xac\\x26\\x96\\x71\\xbd\\x62\\xa4\\x05\\x9b\\x24\\xf7\\xc1\\xa4\\x40\\x80\\x74\\x40\\xd5\\xd5\\x38\\xa6\\x54\\x58\\xad\\xc8\\x15\\x87\\x24\\xb2\\x5c\\x12\\x12\\x7a\\xa0\\x34\\x9e\\x55\\xf6\\xe5\\x5b\\xc9\\x20\\x78\\xfd\\x1e\\xf2\\x74\\xc2\\xaa\\x79\\x19\\x05\\x76\\x6b\\xe3\\x94\\xa2\\x62\\x8f\\x7b\\xbd\\x1a\\x32\\xda\\x5e\\x48\\x74\\x46\\xbb\\xef\\xae\\x88\\xfa\\x6c\\xf3\\xf7\\xb4\\x99\\xf1\\x31\\xfa\\x19\\x31\\x3d\\x13\\xb2\\x80\\xad\\xca\\x50\\xf7\\x78\\x02\\xd1\\x73\\x31\\xb3\\x81\\x68\\x3b\\x5e\\x7e\\xda\\xb9\\x94\\x73\\xed\\xd3\\x1d\\x77\\x44\\x34\\x88\\x21\\x41\\x35\\xfd\\x6f\\x26\\x44\\x50\\x93\\xe9\\xe2\\xaf\\xf7\\xd7\\xe8\\x92\\x33\\x7f\\xdc\\x87\\x79\\x06\\x5d\\x4d\\x97\\xd6\\xd6\\x73\\x57\\x67\\x94\\x95\\x8d\\xbf\\xa6\\xc5\\x0b\\x1b\\x13\\xac\\x39\\x60\\x7c\\x1e\\x66\\xef\\x96\\x29\\x76\\x10\\x71\\x15\\x5f\\xbc\\xa6\\xf3\\x6e\\xb0\\x2c\\xee\\xae\\x16\\x36\\x7f\\xea\\xc0\\x74\\x76\\x90\\x8c\\x84\\x7c\\x9a\\x53\\x3e\\xf6\\x8c\\x94\\x31\\x1f\\xa0\\x89\\xff\\x28\\xfb\\xd8\\x78\\x09\\xb0\\xd3\\x87\\x6b\\x43\\x1d\\x9a\\x18\\xb2\\x02\\xf9\\xa4\\x04\\x9a\\x05\\x77\\xb8\\x17\\x76\\x10\\xdd\\x02\\xe5\\xc5\\x20\\xec\\xa9\\x55\\xe8\\x03\\xc3\\xad\\x4f\\x50\\x97\\x6f\\x7c\\x2e\\xa8\\xaa\\x3e\\xe4\\x83\\x6a\\x19\\x85\\xdf\\x0a\\x4f\\x16\\xef\\x46\\x98\\x15\\x95\\x41\\x98\\x97\\x99\\x35\\x60\\xaf\\x82\\x65\\x1c\\x2b\\x49\\x4e\\x68\\x0b\\x37\\x80\\x2e\\x75\\x37\\xef\\x68\\xa5\\x75\\xc3\\x4f\\x85\\x88\\x06\\x3e\\xe0\\x19\\x72\\x06\\xd9\\xa3\\x2b\\xb4\\x89\\x0e\\x7c\\x21\\x6a\\x4d\\x33\\xfe\\xca\\x36\\xb5\\x49\\xe5\\x32\\xfe\\xa6\\x85\\x56\\xe7\\x54\\x0a\\x4f\\xb1\\x69\\xd4\\x9f\\xc5\\x53\\xb2\\xe6\\x70\\x0a\\xe4\\x2d\\x9a\\x51\\x6e\\x68\\x16\\x0a\\xcf\\x6b\\x27\\x0c\\x77\\xca\\x5e\\xc2\\x6e\\x5a\\xd5\\xdc\\x75\\xc2\\xc3\\x93\\xe2\\x99\"},\n{{0x1f,0x0a,0x10,0xa2,0xcb,0x11,0x19,0x17,0xb9,0xa6,0x7a,0x2a,0x1f,0x38,0xfb,0x86,0xf8,0xed,0x52,0x60,0x7d,0x1d,0x65,0x3a,0x45,0x7d,0x7f,0x47,0x18,0xd9,0xa7,0xde,},{0x70,0xc0,0x75,0xb2,0xe9,0x4c,0x4c,0x02,0xf4,0x5e,0x73,0x04,0x4f,0x24,0x39,0x97,0x41,0xb1,0x61,0xfe,0xb6,0xf6,0x9e,0xab,0x63,0x54,0x17,0x28,0x2a,0x4a,0x93,0x68,},{0xa4,0x24,0x5a,0xa3,0x39,0x5e,0x7b,0xad,0xa2,0xbc,0xdf,0x16,0x03,0x14,0x7c,0xc5,0xf3,0xf0,0xba,0x91,0xf4,0x0f,0xda,0xd8,0xf6,0xd3,0x71,0xc3,0xeb,0xef,0xb4,0xc1,0x50,0x1d,0x07,0x87,0x5b,0x57,0x6f,0x40,0x79,0x78,0x06,0xa4,0x84,0xc7,0xa3,0xf7,0x05,0x69,0xe2,0x32,0xb0,0xc9,0x9d,0x29,0xca,0x23,0xa2,0x33,0xb6,0x8e,0xdb,0x0c,},\"\\x4f\\x6a\\x43\\x4b\\xd5\\xfc\\x77\\xf0\\xf1\\xb7\\x04\\x9c\\x91\\x85\\x3c\\xcb\\xd8\\x94\\x39\\x96\\x2a\\x60\\x78\\xa6\\x74\\xb8\\x67\\x54\\x3b\\x6b\\x7d\\x10\\x55\\x2e\\xc1\\x75\\x8c\\x52\\x83\\x04\\x2b\\xd6\\xb4\\xce\\xa8\\x8c\\x95\\x20\\xdb\\x04\\x74\\x6f\\x08\\x9c\\xf3\\xa2\\x60\\xfb\\x0f\\x33\\x85\\x8e\\xfd\\x6f\\x68\\x0d\\xe5\\xb7\\x2d\\x98\\x76\\x32\\x4b\\xa5\\x90\\x29\\x91\\x38\\xf8\\x5a\\x76\\xf5\\xbe\\x0e\\x05\\xe8\\x85\\x9c\\x02\\xb2\\x35\\x12\\x55\\x9c\\x8b\\xea\\xfc\\x9c\\xfe\\x90\\x1b\\x28\\x3e\\x15\\xd1\\x6c\\x79\\x2e\\xb0\\x3b\\x92\\x88\\x0f\\x6f\\xf9\\x7a\\xa3\\x8e\\xee\\xad\\x3f\\x4f\\xd6\\xc0\\xa9\\x21\\x43\\x23\\xaa\\x39\\xa1\\xc1\\x65\\x15\\xe3\\x0d\\xbd\\x08\\xb8\\x33\\xee\\x40\\xa8\\x14\\xa2\\x88\\x09\\xc8\\x70\\xe1\\xd0\\xa6\\x2c\\x37\\x93\\x2d\\x54\\x08\\xfc\\x6a\\xfc\\x63\\xe7\\x9a\\x65\\x5c\\x5f\\xe3\\xd4\\x02\\x6e\\xf0\\x9e\\x02\\x99\\xfb\\xde\\x5a\\xb3\\x4f\\xce\\xab\\x14\\x13\\x0d\\xc4\\xbe\\x00\\x7e\\x8e\\x64\\x44\\xd7\\xaa\\xae\\xc6\\x2c\\x87\\x3d\\xf7\\x7e\\x80\\x10\\x74\\x3c\\x31\\xe8\\x75\\x7f\\x1e\\xae\\x9e\\xdb\\x55\\x97\\xa1\\xb5\\xd8\\x4b\\xd7\\x7a\\xe7\\x64\\x2e\\x1a\\xca\\x99\\x87\\x3a\\x15\\x2f\\xfd\\xe0\\x68\\xa8\\xe4\\xad\\x92\\x40\\xb9\\x03\\x33\\x27\\x95\\xe4\\x0b\\xb3\\x28\\x65\\xe5\\xce\\x03\\x43\\x07\\xa6\\xc9\\xfe\\x33\\x9a\\x1c\\x93\\x77\\x0d\\xf5\\xca\\x46\\x32\\x9f\\x6b\\x09\\x41\\x97\\x85\\xcb\\xf2\\x84\\x7b\\x0c\\x68\\x32\\x83\\x71\\x23\\x85\\x3a\\xd9\\x52\\x65\\x32\\x65\\xc5\\xb5\\x74\\x0d\\x19\\x4e\\x00\\xf2\\x3f\\x9e\\x96\\x67\\x91\\xf0\\x05\\xf8\\xbf\\x55\\xc3\\x88\\xc2\\xbe\\x9e\\x21\\x53\\x89\\x25\\xf8\\x55\\x5e\\x0d\\xbd\\x83\\xbe\\x07\\x3d\\xf7\\x65\\xaf\\x49\\x40\\xe5\\x9a\\x37\\x90\\xb9\\x83\\x6b\\xab\\x79\\x09\\xe5\\x67\\x6f\\xbf\\x1c\\x21\\x26\\xfe\\x22\\x6d\\x78\\x1a\\x44\\x33\\x0c\\xc0\\x1d\\x32\\x83\\x0f\\xf8\\xae\\x00\\xb9\\x79\\x2e\\x39\\x8c\\x2c\\xbb\\x4f\\xb8\\x3a\\x10\\x05\\xc2\\x45\\x54\\x9a\\x89\\x06\\x3f\\xbe\\x06\\xc6\\x2a\\x48\\xda\\xc4\\x3c\\x51\\x01\\x24\\x99\\x94\\xe9\\x5e\\x37\\xf2\\x4c\\x1d\\x8b\\x3b\\xc6\\x73\\x53\\x8c\\x46\\x05\\x5f\\x80\\x0d\\xb1\\xc0\\xf9\\x56\\x86\\x9b\\x6b\\x29\\x7d\\x99\\x0f\\x44\\xf0\\x5b\\x50\\xc7\\xad\\x6b\\x85\\x6f\\x46\\x21\\x28\\x58\\x47\\x1d\\xd0\\xd3\\x93\\x72\\xb0\\xdb\\x75\\x15\\x73\\xdd\\xb6\\xb5\\xb5\\x6b\\xa0\\x1e\\x37\\x1c\\x78\\xfe\\x58\\xdc\\xd1\\xbe\\x53\\x11\\x2a\\x6a\\x73\\xda\\x9a\\x6b\\xac\\x75\\xd3\\xc3\\x9a\\x1a\\x70\\x5a\\x36\\xf6\\x40\\xfc\\xfa\\xd8\\xcd\\x04\\x07\\x75\\x94\\xd5\\x96\\x85\\xf6\\xe3\\x0d\\xe7\\x1d\\xfd\\x4a\\x44\\xc4\\xe7\\xc0\\x4d\\x6e\\xc7\\xc2\\xe8\\xbe\\x12\\x78\\x5b\\xb0\\x5b\\x29\\xb3\\x91\\x51\\xd3\\x29\\xf5\\x87\\xfd\\xc3\\x81\\xc2\\xdf\\x0c\\xef\\x73\\xfe\\x0e\\x3f\\xd9\\x20\\x8d\\x7c\\xcb\\x6e\\x08\\xd0\\x2f\\x42\\xd1\\xfe\\xed\\x27\\x56\\x1d\\x5e\\x32\\x3a\\xa1\\x48\\x62\\x4e\\x55\\x2a\\xbe\\x87\\x53\\x2d\\xe1\\x5b\\x7f\\x42\\xc2\\x2c\\x98\\xe4\\x05\\x25\\xb1\\x74\\x7c\\xbd\\x75\\x8b\\xfb\\x26\\xfd\\x3e\\xed\\x3b\"},\n{{0x7f,0x05,0xba,0xac,0xf1,0x67,0x58,0x3c,0xf2,0xfe,0x95,0x62,0xa5,0x06,0x99,0x1e,0xd9,0x87,0xf6,0x8f,0xfb,0x71,0x56,0x7c,0x7c,0xcc,0xe3,0xfc,0xc5,0x9b,0x78,0xb0,},{0x0d,0xec,0x39,0x52,0x85,0x2b,0x96,0xfd,0x75,0x58,0x7e,0x97,0x74,0x3f,0x9e,0x41,0xc0,0x9f,0xbe,0x6b,0xa9,0x81,0xbf,0xce,0xb4,0xeb,0xb8,0x89,0x2d,0x98,0x6a,0x16,},{0x0d,0xee,0xd2,0xdf,0x82,0xac,0xf4,0x52,0x9c,0x40,0x8a,0x02,0x93,0x1f,0x67,0x6b,0xec,0x5c,0xb7,0xad,0xe8,0x4e,0xbd,0xcd,0x57,0x8f,0x70,0xf9,0x71,0x38,0x2c,0xf3,0x11,0xbb,0x83,0x09,0x73,0x00,0x45,0x6a,0x55,0x8b,0xc4,0xc0,0x9d,0x89,0x83,0xff,0x13,0x49,0x3f,0xd6,0x11,0xeb,0x66,0xc0,0x43,0xbf,0x01,0x9b,0xad,0x6f,0x33,0x02,},\"\\xa2\\x7d\\x1e\\xab\\x05\\x15\\x09\\x20\\xde\\xd1\\xb1\\xc2\\x57\\x8a\\xf5\\x82\\xb2\\x94\\xf7\\x83\\x7f\\xe4\\xfb\\x1a\\x31\\x69\\xc2\\x5e\\xfb\\x70\\x63\\x4b\\xa6\\x6c\\x7e\\x29\\x91\\xb3\\xe7\\x5c\\xc5\\x12\\x48\\x26\\xa0\\x3e\\x05\\x72\\x59\\xb5\\xcb\\x70\\x62\\x28\\x78\\x0c\\xbc\\x82\\x75\\xc3\\x39\\xf8\\x34\\x0e\\x40\\x2a\\x66\\x50\\x32\\xa4\\xab\\x65\\x78\\x27\\xb1\\xc3\\x48\\x1f\\x75\\x66\\xd3\\x69\\x73\\x5b\\x82\\xdb\\x76\\x28\\xc0\\x22\\xb2\\x12\\x73\\x0d\\xb1\\xe4\\x7c\\x9b\\x2d\\x9b\\xc4\\xd8\\x1b\\x23\\x42\\xd8\\x9c\\x6e\\xaf\\xc3\\xe0\\xb6\\xde\\x50\\xd4\\x84\\xcc\\xef\\x11\\x23\\x8c\\x8e\\x2d\\x24\\x0d\\xd5\\x95\\xdc\\xef\\x8b\\x2f\\xc5\\x7b\\x54\\xff\\x9a\\x8a\\x74\\x11\\x1f\\x61\\xf8\\xa6\\x52\\xf2\\x0e\\xa0\\x12\\xc1\\xad\\xe3\\xe2\\x80\\xec\\xde\\x29\\x4c\\x0e\\x35\\x71\\x71\\x90\\x16\\x2e\\xc6\\xa2\\x26\\x5e\\x7e\\x6f\\x3f\\x07\\x04\\xcf\\x8a\\xb1\\xa0\\x3e\\x5c\\xc9\\x53\\xe2\\x92\\x62\\x91\\xcc\\xd4\\xb0\\x59\\x0d\\x5c\\x20\\x56\\x8f\\x94\\xf9\\xff\\x0f\\xe2\\xab\\x78\\xcf\\x9a\\xe2\\xc3\\x8b\\xcd\\x49\\x1e\\x51\\x8f\\x23\\xe9\\xb6\\x36\\xf8\\x80\\x61\\x5f\\xc5\\x60\\x78\\xe5\\x12\\xd7\\x57\\x7e\\x09\\x49\\x7c\\x11\\x83\\x45\\x3d\\x50\\x81\\xfd\\x47\\x37\\xf2\\x80\\xec\\x5e\\x26\\x7c\\x45\\x86\\xb7\\x8b\\x70\\xff\\xfd\\xfd\\x73\\x0d\\x80\\x9d\\xf5\\x60\\xf2\\xe3\\x77\\x21\\x91\\x84\\x7b\\xbc\\x3f\\x60\\x4f\\xb7\\xf8\\xca\\x49\\xee\\xd3\\x18\\xb5\\xe7\\xd1\\xf2\\xb8\\x3a\\x10\\xda\\x0c\\x85\\x94\\xb3\\x39\\xb6\\x87\\x1a\\x57\\x72\\xdd\\x64\\x16\\x8e\\xcc\\x27\\xe2\\x40\\xa4\\x5c\\x76\\x72\\x5e\\x7d\\x55\\xbe\\xf3\\x7e\\x13\\x5e\\x3d\\x9e\\x0e\\x34\\xe3\\x6c\\x16\\xe3\\x4d\\x77\\x45\\x9a\\x55\\x2f\\x40\\x74\\xd0\\x67\\xa3\\x1a\\x3e\\xd2\\xa4\\x8c\\xde\\xa4\\x89\\x5b\\x10\\xbd\\xf1\\x65\\x6f\\x4b\\x7a\\x41\\x3c\\x6a\\x08\\x8c\\x64\\x9f\\xc9\\xd7\\xbc\\x56\\xab\\xf6\\x44\\x35\\x49\\x12\\x14\\x19\\x2a\\x66\\x70\\xcb\\x8b\\x9c\\x91\\x7f\\x8e\\x1b\\xc7\\xb2\\xcf\\xce\\x78\\xd2\\x8f\\xbc\\x3a\\xfc\\x2a\\x50\\xe9\\x82\\x13\\xe7\\xe0\\x26\\x37\\x8e\\x4e\\xa7\\x11\\xd1\\x51\\xad\\xaa\\xa7\\x19\\xbe\\xb8\\x97\\x46\\x56\\xc1\\x0e\\xbc\\x7d\\xe4\\x6b\\x19\\xec\\x82\\x95\\x1e\\xf4\\x6a\\x8c\\x68\\xe7\\xf4\\x36\\xe1\\xb3\\xeb\\xed\\xb2\\xd0\\x9b\\x05\\x75\\xc9\\x91\\x4e\\xad\\x27\\x96\\xb5\\x3e\\x00\\x61\\xe2\\x12\\x99\\x4a\\xc5\\x02\\x6a\\xea\\x81\\xec\\x37\\xc8\\x13\\x78\\xf4\\xcc\\xfc\\x46\\x77\\x00\\x08\\x79\\x68\\x59\\x7d\\xa3\\x8f\\xed\\x52\\xfa\\x48\\x09\\x3a\\xe4\\xba\\x10\\x66\\xc3\\x1e\\x3c\\x7d\\x85\\x08\\x09\\x5b\\xb4\\x5c\\x28\\x01\\x20\\xf4\\xaa\\x69\\xa2\\x4f\\x3e\\xfe\\xf1\\xf7\\x67\\x98\\x5a\\xa1\\xa3\\x0e\\x14\\x08\\x56\\xf7\\x6d\\x15\\x20\\x73\\x28\\x78\\x48\\x7b\\xe5\\x3f\\x71\\x2d\\xbd\\x7d\\x77\\x9e\\x31\\x51\\x01\\x58\\x8f\\xd7\\xdb\\xdb\\x13\\x2f\\x92\\xc2\\x75\\x75\\xac\\x14\\x86\\xf1\\x76\\xc7\\x90\\x66\\x1b\\x01\\x48\\x39\\x4e\\x92\\xff\\xa3\\xae\\x6f\\x8a\\xfb\\x2f\\xaa\\x2b\\x7f\\x4f\\xbd\\x0a\\xd9\\x1e\\x75\\x9a\\x70\\x2b\\x3c\\x70\\x2b\\x4d\"},\n{{0xd0,0x0c,0x21,0x64,0x26,0x71,0x0d,0x19,0x4a,0x3d,0x11,0xcf,0xc9,0x0a,0x17,0xa8,0x62,0x12,0xe7,0xa0,0xe5,0x4b,0xaa,0x49,0xb0,0x16,0x9e,0x57,0xff,0xf8,0x3d,0x61,},{0xcf,0xe6,0xae,0x89,0x03,0xc6,0xc7,0x01,0xaa,0x30,0x46,0x95,0xc6,0x51,0xbf,0xd8,0x50,0x33,0x1f,0x9a,0xd4,0x81,0x63,0x3a,0xe3,0x70,0xc8,0x6d,0x7b,0xd1,0x3f,0xb9,},{0x15,0xc4,0x5c,0x19,0x42,0x97,0xe8,0x87,0x02,0x9f,0x49,0xd8,0xbd,0xf9,0xd6,0x10,0xdd,0x8c,0x34,0x79,0x9e,0x1e,0x92,0x30,0x26,0x9e,0x7a,0x58,0x92,0x89,0x38,0xcf,0x39,0x6a,0x02,0xcd,0x42,0x20,0x54,0x90,0x39,0x1e,0x1c,0x64,0x35,0x3f,0xb0,0x6b,0x9f,0x8e,0x9b,0x81,0x8a,0x9a,0x36,0x1c,0x20,0x4a,0x38,0x69,0x95,0xbf,0x3b,0x03,},\"\\x82\\xf9\\x78\\x41\\xb3\\xba\\x22\\xdd\\x9a\\x44\\x50\\x83\\x7e\\xa7\\xbf\\x8d\\x27\\xa9\\x73\\x14\\x70\\xca\\xbb\\x0c\\x20\\x78\\x03\\x4b\\xf2\\x4e\\x4c\\x1a\\x62\\x90\\xc0\\x3f\\x40\\x02\\xb8\\x6f\\xa0\\x9f\\x07\\xb5\\x20\\x9f\\x1f\\x53\\xd0\\xec\\xf4\\xd9\\xe9\\x22\\x3b\\xec\\x12\\x5a\\x95\\x45\\x51\\xfe\\x8b\\xff\\x71\\x8f\\x5e\\x26\\x48\\x68\\xe2\\x07\\xf7\\x01\\x19\\x4e\\x41\\xde\\x39\\x97\\x1f\\xd3\\x85\\xf4\\x9a\\x4b\\x4a\\xdd\\xa9\\x11\\xeb\\xa5\\x52\\x59\\xfc\\x68\\x36\\x65\\x32\\x73\\xf6\\x56\\xf4\\xaf\\x60\\xb2\\x06\\x64\\x95\\x6d\\x4f\\x21\\x35\\xd9\\x0d\\x09\\xe9\\x03\\x7d\\x53\\x66\\xa0\\x25\\x34\\x44\\xe0\\x22\\xc7\\x21\\x2a\\xf5\\xfd\\x4f\\xcc\\xd7\\x42\\x37\\xd2\\x88\\x53\\x38\\xe2\\xfd\\x72\\x15\\x22\\xde\\x67\\x63\\xc2\\x54\\x90\\x28\\xc6\\x23\\xb9\\xcf\\x38\\x7d\\x23\\x4a\\xb5\\xe7\\xfc\\xbe\\x5a\\x47\\xc6\\x85\\xb7\\x9e\\x75\\xa5\\x7b\\x09\\x57\\x40\\x82\\xa0\\x22\\x21\\xdf\\x64\\xa2\\xe8\\x41\\x61\\x80\\x87\\xe7\\x22\\xa2\\x1b\\xac\\x1b\\xa4\\xf0\\xd7\\xd8\\x7b\\xdc\\x51\\x0a\\xaa\\x8f\\xbd\\x10\\x75\\x7f\\x6c\\x02\\x9c\\xa8\\x20\\x37\\x1f\\xc7\\x4c\\x3b\\xc5\\x0b\\xd8\\x98\\xc5\\x5d\\x81\\x67\\xf7\\x3a\\xda\\x37\\x7a\\xec\\xc9\\x16\\x29\\xd6\\x4c\\x36\\x0c\\x2c\\x24\\x1c\\x5c\\xb4\\x2e\\x3a\\x51\\x8c\\x5d\\xab\\xf0\\xf4\\x18\\xb2\\xa7\\xf3\\xd8\\x2e\\xef\\xd9\\x20\\x26\\xd3\\x1e\\x8b\\x81\\x60\\x35\\x8e\\xae\\x82\\x1f\\x73\\x0e\\xca\\xfe\\x7a\\xce\\x64\\x7b\\xff\\x87\\x41\\xde\\x2f\\x6a\\x13\\x1d\\x11\\xc9\\x69\\xe9\\x78\\x7c\\xfe\\x6a\\x2f\\xab\\x37\\xbf\\x8d\\x1c\\x7f\\x4a\\x2f\\x36\\x4d\\x2f\\x1a\\x76\\xef\\x04\\x6c\\x18\\x43\\xe6\\x3e\\xc0\\x0c\\xf7\\x92\\x0f\\xfa\\xae\\x56\\x1e\\x73\\x70\\xb7\\x19\\xfc\\x16\\xfc\\xeb\\xca\\x3c\\xfd\\xfa\\xba\\x43\\xf4\\xf0\\x90\\xc4\\x6f\\x47\\x73\\x03\\xa6\\x60\\xee\\x88\\xdd\\x4e\\x89\\xbf\\x14\\xb9\\xf8\\x04\\xb6\\xfd\\x49\\x5c\\xb1\\x41\\x27\\x53\\x47\\x4a\\x05\\x6a\\x0d\\x89\\x31\\xcd\\x9c\\xcb\\xd6\\x4f\\x8f\\xcc\\x7a\\x31\\x23\\x46\\x7c\\x5d\\x47\\xf6\\x90\\x67\\x9e\\x88\\x71\\x28\\x80\\x93\\x73\\x4f\\xd6\\xa1\\x32\\x60\\x38\\x65\\x81\\x56\\x41\\x36\\x96\\x59\\x4c\\x13\\x4d\\x73\\x88\\x7f\\x34\\xee\\x67\\x60\\x9a\\xe8\\xff\\xb3\\x26\\x6c\\x16\\xd8\\x7f\\x15\\x34\\x5a\\x47\\x6f\\x72\\x95\\x0c\\x15\\x87\\x96\\xa8\\x8b\\xbb\\x44\\x4f\\x1a\\xa8\\x09\\xca\\xd8\\x75\\xb8\\x5f\\xb9\\x15\\x1a\\x0e\\x2e\\xef\\x2e\\x00\\xe8\\x0d\\x6b\\x7a\\x9b\\xa4\\x06\\xc0\\x51\\x9e\\xff\\xdd\\x94\\x12\\x62\\x32\\xfd\\xf6\\xf1\\xe7\\xb9\\xbb\\xc0\\x36\\x2a\\xa7\\x75\\x16\\xfd\\xf9\\x39\\xe7\\x90\\x6a\\xab\\x01\\x30\\x71\\x28\\xcf\\x82\\x4c\\x10\\x2c\\x09\\xb9\\x29\\xc9\\xb2\\xd7\\xaf\\x8f\\x85\\xb7\\xd7\\xf9\\xa8\\x38\\xb2\\xae\\xd0\\xc6\\x97\\xe8\\xbd\\xfe\\xe6\\x6e\\xe0\\x16\\xbb\\x1b\\xf3\\x5e\\xff\\x6b\\x2f\\x7e\\xf4\\xb9\\x1b\\x1f\\xc0\\x4f\\xac\\x9f\\x11\\x6e\\x2e\\xdf\\xf4\\x0f\\x95\\xc1\\x5b\\x77\\xc3\\x1e\\xe5\\x22\\xf3\\x93\\x7c\\x7f\\xa0\\x04\\x7d\\x62\\x25\\xe0\\xc8\\xe5\\x5e\\x27\\x8c\\x81\\x03\\x91\\x1f\\xea\\xb2\\xb7\\xf4\"},\n{{0xdd,0x12,0x39,0x72,0xe6,0x28,0x58,0x4a,0xcc,0x46,0x29,0x3b,0x8e,0x4c,0xe2,0xb2,0xdd,0x46,0x9c,0xc4,0xed,0xe1,0x4e,0xf3,0x95,0x21,0xcf,0x08,0x37,0x35,0x85,0xb3,},{0x35,0x22,0xf7,0xae,0x59,0x6e,0xed,0xb2,0x17,0x03,0x5d,0x95,0x39,0x5e,0x44,0x8d,0xbd,0x6f,0xfb,0xf4,0x25,0x85,0xea,0xeb,0x30,0x70,0x26,0x54,0x1c,0x78,0xa6,0x51,},{0x89,0x65,0xa8,0x89,0xd5,0x4c,0xd8,0x07,0x6d,0x35,0xbc,0x2e,0x12,0xb0,0x09,0xd5,0x6b,0x07,0x04,0xc8,0x94,0xf9,0x12,0xa0,0xd1,0xd3,0x07,0x20,0xc2,0x32,0xfe,0x44,0x04,0xbf,0x30,0x09,0x54,0x1e,0x8f,0x32,0x83,0xe8,0x9e,0xa8,0x6f,0x67,0x8a,0xfb,0xdf,0x1c,0x21,0xc9,0x24,0xb2,0x3a,0x52,0xb4,0xca,0x6d,0x63,0xf4,0x8f,0xc2,0x03,},\"\\x2b\\x28\\x57\\xf4\\x52\\x80\\x17\\x3e\\x2e\\x0e\\xf9\\xd5\\x94\\xe6\\x08\\x3f\\x1d\\xc7\\xa6\\x54\\x92\\x97\\x5b\\x83\\x7d\\xef\\x6c\\xad\\xd8\\xc8\\x54\\x50\\x31\\xee\\x9d\\x68\\x36\\x9a\\x93\\x93\\xcc\\x7b\\x79\\x2f\\xeb\\x98\\x04\\x0b\\x21\\xf1\\xeb\\x84\\x66\\x5f\\x87\\x85\\x37\\xce\\x41\\x2e\\x9d\\xb6\\x80\\xd2\\x9f\\xbd\\x8f\\xfc\\x77\\x31\\xea\\xe9\\x1a\\x20\\xb4\\x75\\x48\\x99\\x62\\x04\\xfb\\x06\\xad\\x74\\x0e\\x78\\xf0\\xfc\\x59\\x0b\\x67\\x91\\xdc\\x7a\\x0f\\x26\\x59\\x28\\x6c\\xc1\\x6d\\x02\\xc5\\x11\\x7b\\x56\\x58\\x36\\xb4\\xb8\\x73\\x8c\\xf4\\x0e\\x28\\x5c\\x69\\xc5\\x0e\\x41\\x29\\x11\\x29\\x23\\x67\\x35\\x2d\\xfd\\xae\\xd9\\x98\\x2d\\x0f\\x89\\x9a\\x23\\xc0\\xab\\x51\\x81\\x2b\\x3e\\xc6\\x78\\xf6\\x88\\x2e\\xa4\\x27\\xcd\\xc9\\x3a\\xb4\\xb2\\x48\\x24\\x37\\x70\\x54\\xaa\\x25\\xd8\\x22\\x46\\x65\\x33\\x40\\x07\\x8c\\xf1\\x1d\\x14\\xa5\\x1f\\x0e\\x68\\x6d\\x7e\\x01\\x8b\\x36\\x74\\x16\\x68\\xfc\\xe7\\x45\\x8d\\x16\\x92\\x93\\x36\\x1d\\xd1\\x6b\\x3d\\xeb\\xbe\\xd1\\x9e\\x1b\\xef\\x7c\\x36\\x93\\x4e\\x20\\xf3\\x3a\\x09\\xad\\x3e\\x82\\xb5\\x3a\\xb4\\xe9\\x4c\\x25\\x5d\\x04\\x18\\x98\\xb9\\x77\\x37\\xdf\\x99\\x58\\x4a\\xf1\\x4e\\x40\\x40\\x58\\xd0\\xc9\\x3b\\xca\\xe7\\xbb\\xbc\\x06\\x39\\x5a\\x2a\\xef\\xbd\\xef\\xa7\\xb2\\xed\\x17\\xce\\xbd\\x15\\x13\\xfa\\x39\\x0f\\xe9\\xa9\\xb0\\xce\\x68\\xce\\xcc\\x2b\\x9e\\x12\\x9b\\x7a\\x29\\xf4\\x9b\\x6d\\x18\\xc2\\x8b\\xac\\xd3\\xaf\\x39\\xdc\\x39\\xca\\x97\\x2f\\x0e\\x0d\\x06\\x85\\x5d\\x57\\xc2\\xb5\\xfc\\xac\\x2f\\x79\\xcb\\x8c\\x05\\x79\\x9e\\x4f\\x65\\x73\\x46\\x68\\xda\\xd6\\xaa\\x7a\\x43\\xa1\\x18\\x56\\xe2\\x3b\\x1e\\x73\\x2d\\x00\\xe5\\xfe\\x38\\x85\\xb7\\xda\\xd4\\x2e\\xc1\\x8a\\xc8\\xe0\\x96\\xa0\\x80\\xf7\\xd5\\x50\\x70\\xfd\\xcf\\xf6\\x07\\xbc\\x0b\\x85\\x2d\\x8a\\x08\\x0d\\x2a\\x74\\x05\\xd5\\x94\\x14\\x69\\x5f\\x2e\\xb7\\xfb\\x0a\\xca\\x23\\xc8\\x63\\x57\\x42\\xf8\\xae\\x57\\xf1\\x37\\x80\\x31\\x6e\\x28\\x08\\x72\\x37\\x4e\\x69\\x29\\x59\\x8d\\x02\\x8a\\x33\\xc0\\x5d\\x83\\x1c\\xda\\xbd\\x02\\x94\\x93\\xc3\\xcc\\x85\\x9f\\xff\\x1a\\x67\\xd5\\x62\\x16\\xf0\\x2a\\x22\\x95\\x66\\x53\\x65\\x88\\x7a\\x35\\x0a\\x80\\xaf\\xaa\\x0c\\x36\\x7a\\x74\\xd3\\x70\\x1a\\xe8\\x8f\\x59\\xd8\\xa9\\xd3\\xa1\\xdc\\xe0\\xcf\\xd2\\xea\\xbe\\x2a\\xf5\\x06\\x5a\\x1c\\x7f\\xca\\x4a\\xad\\xcf\\x8e\\x51\\xe7\\x56\\x12\\xa1\\x37\\x1b\\x4d\\xc8\\xff\\xc0\\xc0\\xb9\\xc4\\xfa\\xdb\\x2f\\x08\\x1e\\x2e\\x03\\x2d\\x96\\x81\\x8e\\x55\\x73\\x7a\\xdd\\xe3\\xe1\\xac\\x12\\x1f\\x56\\xcc\\x86\\xfb\\x58\\xa0\\xa5\\x82\\x69\\x2f\\x62\\xce\\x58\\xac\\xce\\x17\\xaa\\xfe\\xc7\\xbc\\xb7\\xe4\\x4f\\x83\\x92\\x58\\xcd\\x4a\\x85\\x1f\\xc0\\x13\\x44\\xee\\x9f\\x1b\\xd0\\x3e\\xb9\\x43\\x44\\xf4\\x77\\x86\\x93\\xc1\\x71\\xdd\\x28\\x92\\xb2\\x42\\x6a\\x88\\x29\\xab\\x0c\\xfe\\x33\\xa7\\xd4\\xa3\\x6e\\xb4\\x01\\x7f\\x7f\\xcf\\xd2\\x41\\x34\\xab\\x8a\\x45\\xf2\\x37\\x17\\xcd\\x13\\x8a\\xa6\\x00\\x01\\x72\\xe3\\x7b\\x40\\x64\\xdc\\x9b\\x6d\\x1e\\x1e\\xf3\\xaf\\x84\\x97\\x1d\"},\n{{0x33,0x35,0xea,0x92,0x81,0x17,0xcf,0xee,0xfb,0xee,0xae,0x14,0x60,0x03,0x88,0x1b,0xdc,0x88,0x89,0xd6,0x58,0x0e,0xed,0x13,0x52,0x37,0x08,0x20,0xad,0x1f,0x58,0x4f,},{0xcb,0x20,0xd4,0xfd,0x75,0x61,0x84,0x80,0x13,0x11,0x1c,0x3e,0x97,0x61,0x7f,0x34,0x18,0x1d,0x2e,0x7f,0xbc,0xf1,0xbb,0x2a,0x2c,0xd2,0xe8,0xc1,0x77,0x5b,0x8b,0x03,},{0xf7,0xc3,0x9f,0x92,0x47,0xd2,0x2f,0x01,0x89,0x99,0x24,0x7f,0x0e,0x00,0x05,0xcd,0x63,0x07,0x6c,0xcf,0x2f,0xee,0x41,0x63,0x42,0x1f,0x86,0x40,0x7a,0x41,0x69,0x8c,0x40,0x58,0x16,0x64,0x73,0x51,0xc0,0x4e,0x93,0xb5,0x44,0x15,0xb6,0x2f,0xc0,0x3f,0xc8,0xc2,0x5e,0x20,0xf7,0x54,0x1d,0xab,0x03,0x19,0x7d,0xc9,0x00,0xb2,0x9c,0x0c,},\"\\x0f\\xa7\\xf6\\xa6\\xfc\\xa9\\x81\\x42\\x9b\\x57\\x2a\\x67\\x04\\x87\\x1b\\xed\\x14\\x0d\\xab\\x93\\xee\\x19\\x92\\x00\\x6e\\x9a\\x3b\\xb2\\xe6\\xcc\\x9a\\x09\\xd4\\xc9\\xcf\\x17\\x06\\x6b\\x32\\xff\\x7e\\xf5\\xb6\\xb2\\xe7\\x91\\x11\\x78\\xed\\x74\\x62\\xc4\\xc1\\x75\\x60\\x31\\x71\\xca\\x61\\x36\\x68\\xb3\\xbe\\x19\\x3d\\x94\\xc3\\x52\\x1e\\x58\\x89\\x13\\xb5\\x94\\x8b\\x55\\x0b\\xe9\\x9d\\x82\\xd9\\x66\\x19\\x7d\\x71\\x0a\\xcf\\xd9\\x59\\x14\\xcf\\x3e\\x19\\x75\\x36\\xe8\\x3e\\x68\\x23\\x0d\\xc3\\xd6\\x7e\\x67\\xdc\\xdb\\xde\\xe0\\x4f\\x0d\\x9c\\x48\\x02\\x37\\xec\\xd2\\x8f\\x74\\x33\\x8d\\xb5\\xf3\\xf6\\x97\\xd3\\xd0\\x7f\\xf3\\x36\\x13\\xbb\\xce\\x54\\x2a\\xcc\\x9a\\x7f\\xed\\x5d\\x12\\x49\\x0b\\x9b\\xfe\\x1d\\x10\\x95\\x40\\xf8\\x63\\x80\\x0d\\xd3\\x56\\xda\\x84\\x1a\\x45\\xa3\\xcd\\x8a\\x08\\xa9\\x45\\xbf\\xa3\\xaa\\x98\\xe1\\x71\\x23\\x12\\xc4\\xc0\\xf0\\xd9\\xdd\\x64\\xf6\\xef\\xcf\\x73\\x6b\\xd9\\x7d\\xea\\xfc\\xa9\\xdc\\xaa\\x3f\\x06\\xd8\\x7f\\x2e\\xd7\\x2a\\xeb\\x6a\\x94\\xf3\\x28\\x00\\x00\\xc4\\xbf\\x72\\x8a\\x01\\xc1\\x86\\x2d\\xaf\\xd9\\xfc\\x5c\\x7d\\x5a\\x46\\xec\\x7d\\x3a\\x87\\xaf\\x59\\xa1\\x1d\\x87\\xf7\\xff\\x84\\x40\\x7d\\x37\\x01\\x0e\\x1d\\x94\\x6c\\xf2\\x25\\xd6\\xb3\\xb1\\xed\\xee\\x2e\\x8b\\xbf\\x1e\\x07\\x9e\\x47\\xfb\\x1f\\x66\\x66\\x93\\x94\\xfb\\xf2\\xfa\\x68\\xfc\\x56\\xfc\\x89\\x82\\x0a\\x68\\x09\\xc2\\x51\\xdd\\x62\\xf5\\xb8\\x65\\xc5\\x47\\xb1\\x4f\\xbd\\x3a\\x19\\x50\\x42\\x44\\xff\\xbc\\x7e\\x52\\x40\\xf8\\x8d\\x43\\x60\\xf9\\xca\\xca\\xaf\\x5f\\x82\\x43\\x3d\\x33\\x44\\xfc\\xae\\xe0\\xac\\xde\\xb7\\xbe\\xb9\\xc0\\xb3\\xc7\\x69\\xea\\xc9\\x20\\xef\\x4f\\x09\\xab\\xc2\\xa2\\x09\\x55\\x12\\x04\\x59\\x43\\xec\\xcc\\x53\\xb1\\xc0\\x3e\\xd2\\x4e\\x56\\x7f\\x3d\\x7a\\x71\\x97\\x7c\\xab\\x98\\x40\\xce\\x89\\x8e\\xe5\\x8e\\xd5\\xc7\\x3f\\x6a\\xde\\xa8\\x23\\x39\\x4c\\x5c\\x8e\\x36\\x58\\xa6\\xbf\\x5a\\xcb\\xbf\\x00\\x55\\x99\\x2c\\x31\\x2c\\x26\\xc7\\x9c\\x5c\\xfb\\xea\\x38\\x60\\xb8\\x76\\x4a\\x6d\\x8f\\xfe\\x44\\x91\\xf8\\xa5\\xb8\\xa2\\x15\\xe0\\x11\\x7a\\x9a\\x68\\x16\\x4a\\xee\\x25\\xf8\\xc0\\xbb\\x38\\x11\\x95\\xb2\\x40\\x0b\\xcb\\x46\\x44\\xeb\\xce\\x1c\\xde\\x5a\\x9a\\x26\\x58\\x2c\\xab\\x9d\\xc7\\xf4\\x3c\\x33\\xea\\xe3\\x50\\xdb\\x65\\xaa\\x7d\\xd2\\x2a\\x07\\x9b\\xdd\\xdc\\xf5\\x6d\\x84\\x8d\\xeb\\x0c\\xfa\\x50\\xb3\\xbd\\x73\\x2d\\x9d\\xa9\\xe8\\xd8\\xab\\x79\\xe9\\x34\\x69\\xde\\x58\\x02\\xb6\\xdf\\xf5\\xac\\x2a\\xa8\\x48\\x2b\\xb0\\xb0\\x36\\xd8\\xf9\\xd5\\x95\\xb8\\xea\\xd9\\x4b\\xb8\\xd7\\x41\\x8e\\x2e\\xa4\\x31\\x92\\xef\\xcb\\xfc\\x05\\xc4\\x67\\xbd\\xe0\\xa8\\x68\\xa5\\x16\\xa7\\xc1\\x4a\\x88\\x9b\\x72\\xc5\\xb7\\x3e\\x7d\\x85\\xc2\\xba\\xe9\\x02\\xe4\\xe6\\x8d\\x1f\\x3c\\xea\\xb2\\xb2\\x77\\x3a\\xf5\\xbb\\xae\\xe6\\xa0\\x0d\\x08\\x06\\x3e\\x78\\x33\\xcd\\x4e\\x29\\x53\\x47\\xe5\\x8f\\x5d\\x1b\\x33\\x97\\xf6\\x40\\xc1\\x59\\xcc\\x60\\xa6\\x74\\xa2\\x27\\xb4\\xcd\\x8c\\x10\\xf1\\xdb\\xae\\xd5\\x16\\xcc\\xac\\xdd\\x29\\x5f\\x11\\xb0\\x81\\x47\"},\n{{0x32,0xa1,0x88,0x3e,0xff,0x57,0xa3,0xa7,0xec,0xdb,0x31,0x02,0x21,0xee,0x83,0xc4,0xde,0x92,0xb7,0x22,0x15,0x96,0x13,0xec,0xf8,0x16,0xe3,0x82,0x43,0x7b,0x60,0xb9,},{0x82,0xdd,0x1a,0x03,0xe5,0x85,0x20,0x62,0xba,0x4a,0x8b,0x6b,0x3b,0x93,0xc5,0xe9,0xc4,0x3f,0xf6,0x99,0x5b,0xd2,0xaa,0xc7,0x26,0x06,0xfa,0xc8,0x58,0x02,0xc6,0x82,},{0x83,0x09,0xcb,0xe7,0x2f,0x80,0x4b,0xd9,0x52,0x1d,0xef,0x5d,0xad,0x4d,0x8b,0xc1,0x38,0x86,0xb1,0xd4,0xf6,0x62,0xc9,0xbb,0x5b,0x97,0xba,0x47,0x90,0xf4,0x4b,0x80,0x1f,0x31,0x95,0xea,0xd0,0xd4,0xdd,0xb6,0x60,0x81,0x8e,0xcb,0xf9,0xa6,0x83,0xca,0xcf,0x85,0xf1,0xdc,0xc9,0xe8,0x2c,0x09,0x11,0x6d,0x73,0x36,0x58,0x09,0x1a,0x00,},\"\\xed\\x2b\\x12\\x3b\\x5d\\xd7\\xf5\\xe7\\x18\\xe0\\x26\\xc7\\x9c\\xfa\\x61\\x11\\x92\\x49\\x02\\xd1\\x89\\xa4\\x06\\xef\\x2b\\x2e\\x56\\xa9\\xee\\x55\\x73\\xa7\\x6d\\xdd\\x1d\\x06\\x29\\xeb\\xcd\\xec\\xf2\\xaa\\xa7\\x4e\\x84\\xfc\\xd0\\x20\\x8f\\x14\\xee\\xa2\\xe1\\x71\\xe7\\xc8\\x60\\x8b\\x81\\x8f\\xef\\xf4\\xdb\\xea\\x52\\xdb\\x35\\x42\\x27\\xd0\\x23\\x25\\x0b\\x1f\\x01\\xcb\\x4c\\xc8\\xc5\\x21\\x32\\xa9\\x8d\\x4a\\xcf\\x55\\xa5\\x4f\\xee\\x81\\xe0\\x94\\xae\\xd6\\x6f\\xa0\\xd6\\xb6\\xa2\\x00\\xb6\\xb8\\x74\\x14\\x40\\x22\\x78\\x53\\x8b\\x90\\x52\\x9a\\x8c\\x60\\x3d\\x92\\x7e\\xdd\\xda\\x97\\xbc\\x4b\\x8c\\xb9\\x5d\\x04\\xb5\\x33\\x7f\\xa2\\x2c\\xea\\xfc\\x8b\\x34\\x0c\\x46\\xfe\\xf6\\x71\\x98\\xd1\\xfd\\x98\\xd8\\x9c\\x65\\xcd\\x08\\x9e\\x23\\xf5\\x3d\\xbd\\xca\\x96\\x77\\x98\\xb5\\xcd\\x92\\x32\\x05\\xad\\x51\\x1e\\xdf\\x70\\x6f\\x12\\x25\\xf4\\x64\\x8c\\x98\\x5e\\x00\\x9e\\xf8\\xa2\\xf6\\xa0\\x11\\x7c\\xdb\\xe1\\x4e\\x75\\x31\\x2d\\x8a\\xc1\\xf0\\x3d\\x04\\x6b\\x37\\xcd\\xee\\x7d\\x69\\xc0\\xf2\\x5c\\xcf\\x18\\x14\\x5a\\x68\\x8a\\x8b\\x3c\\xa8\\x87\\x5f\\xe8\\xd9\\x0b\\xaf\\x86\\xd4\\x39\\x69\\xe4\\xd6\\x10\\x21\\x4f\\x1a\\xc5\\xdb\\xba\\x87\\xa1\\xef\\x10\\x37\\x7e\\x40\\xd7\\x80\\x6f\\xd9\\xd2\\x34\\x57\\xfc\\x9d\\xf2\\x98\\x99\\x23\\x9f\\xd1\\xd2\\x78\\x84\\x96\\x81\\xa9\\x43\\xad\\x9c\\x91\\xfd\\x1b\\xbd\\x92\\xb7\\x3c\\xb1\\x77\\xa8\\x78\\xf9\\x05\\x9e\\xe0\\x7a\\xf7\\xa8\\x73\\x16\\x13\\xe3\\x3d\\x59\\xdf\\x3d\\x97\\x79\\x60\\x79\\xd5\\x63\\x1e\\xd8\\x5e\\xb2\\x24\\x51\\x06\\xa5\\xff\\x6a\\x2b\\xca\\x40\\xdf\\x5c\\x6e\\x87\\x47\\x3b\\x2c\\x08\\xc2\\x21\\x2f\\x56\\xfc\\x29\\x33\\xa9\\x69\\xa3\\xc9\\x58\\xd3\\x7c\\x53\\x43\\xba\\x27\\x60\\xc8\\x13\\xa7\\xa5\\x16\\x5d\\x23\\x1c\\x5f\\xea\\xae\\x62\\xb7\\x55\\xdf\\x49\\xfe\\xca\\x80\\x04\\x1a\\x65\\x35\\xf7\\xe0\\x3b\\xc4\\x8e\\x5f\\x27\\xf9\\xbe\\x26\\xef\\x53\\x67\\x3e\\xb7\\xc3\\x7a\\x2b\\x64\\x74\\x4a\\x6c\\xf1\\x7e\\x88\\x77\\x34\\xae\\x01\\x0b\\xf4\\x0e\\xea\\x03\\xcd\\xa2\\x12\\xf5\\x12\\xfb\\xa0\\x58\\x59\\x47\\x17\\x96\\x40\\xbc\\xc4\\x54\\x4b\\x8d\\xeb\\x4e\\xad\\x12\\x9b\\xc3\\x32\\x28\\x00\\xad\\xf9\\x88\\x18\\xf9\\x95\\x74\\xbe\\xfd\\x9b\\x00\\x16\\xd4\\xee\\xc8\\x1a\\x8e\\x78\\xdc\\x3a\\x2a\\xf1\\x3c\\xab\\x01\\x64\\x9a\\xe2\\xe3\\x3d\\x51\\x6b\\x9d\\x42\\x08\\xad\\x66\\x13\\xd8\\xe2\\x78\\xc3\\x93\\xba\\xa8\\x82\\x34\\x0e\\xf4\\x61\\xff\\x4f\\x94\\x42\\x3d\\x55\\xcf\\x3c\\xed\\xd2\\xa6\\xb5\\x6e\\x88\\x36\\x55\\x31\\xdd\\x29\\xd6\\x82\\x73\\xad\\xbf\\xe3\\x69\\x40\\x2e\\x6a\\x7c\\xee\\x05\\x3d\\xa1\\xf1\\x00\\x54\\x00\\x91\\xa0\\x09\\x29\\x25\\x29\\x83\\x44\\x90\\x24\\xb1\\xc3\\x39\\x11\\x10\\x65\\x00\\x82\\xf0\\xe7\\xdf\\xdd\\xb8\\xed\\xc2\\x04\\x2f\\x3c\\x17\\x13\\xc6\\x94\\x4b\\xa5\\x14\\xee\\x74\\x07\\xd3\\x2b\\xf0\\x6c\\x85\\x8e\\xfe\\xc4\\x2a\\x78\\xbe\\xe9\\x77\\x46\\xe5\\xb4\\x87\\x91\\x41\\xa1\\x3d\\x9f\\xc5\\xcb\\x12\\x3b\\x78\\x32\\x73\\xb8\\x4d\\x57\\xad\\x35\\x26\\xb7\\xda\\x3c\\x68\\xb8\\x39\\xef\\xd2\\x3f\\x5f\"},\n{{0x22,0xec,0xef,0x6d,0xab,0xe5,0x8c,0x06,0x69,0xb8,0x04,0x66,0x49,0x73,0xe4,0x57,0xc0,0x5e,0x47,0x77,0xf7,0x81,0xc5,0x25,0x22,0xaf,0x76,0xb9,0x54,0x81,0xa9,0x14,},{0xd4,0x78,0x40,0x10,0xef,0x04,0x03,0xed,0xdc,0x5a,0x62,0xd5,0xd4,0x5b,0xb2,0x43,0xb8,0x0b,0x4b,0x9d,0x69,0xc3,0x9c,0xa3,0x87,0xc6,0xf5,0xcb,0xa0,0x28,0x64,0x0f,},{0x5d,0x0d,0x2a,0xf6,0x78,0xb3,0xd1,0xb6,0x77,0x51,0x6d,0x08,0xa7,0x9a,0xaf,0xd3,0x6e,0xc6,0x7c,0x14,0xca,0xf5,0xbc,0xda,0xae,0xaa,0xcc,0x51,0xa1,0x4f,0xb8,0x05,0xcf,0x29,0x04,0xe8,0x72,0x1d,0xb2,0x71,0xb2,0x0d,0xf7,0x09,0xbe,0xe1,0xa4,0xfb,0xfe,0x62,0x56,0x50,0x73,0xb2,0xa7,0xe9,0x42,0x72,0x44,0x61,0xf9,0x27,0x93,0x0d,},\"\\xc5\\x35\\xc1\\x3d\\x77\\x9f\\xc0\\x98\\x59\\x73\\xd6\\xbc\\xd5\\x52\\xd8\\x17\\x34\\xe9\\x2b\\xdf\\x10\\x99\\x4b\\x00\\xcd\\x4d\\x53\\xce\\x36\\x5f\\xad\\x8c\\x7c\\xfa\\x96\\x20\\x6a\\xdb\\x62\\xd4\\x56\\x7b\\xe5\\xe4\\x66\\x31\\x32\\x38\\x53\\xe3\\x8c\\xe4\\xbd\\xc1\\x6d\\x7b\\x8f\\x63\\x2a\\x3a\\xd9\\xe0\\x26\\x19\\xef\\xf3\\x71\\x74\\xea\\xc3\\xf0\\xbf\\x2f\\x7a\\x75\\x17\\xd4\\xb8\\x2d\\xe6\\xaa\\x1a\\xf0\\x06\\x38\\x19\\xd5\\xe1\\xf9\\x27\\x8f\\xb4\\xf2\\x4c\\x8c\\xc0\\x02\\xaf\\xb1\\x5f\\x33\\x4c\\x04\\xfa\\xdb\\x00\\x30\\x30\\x13\\xc0\\x16\\x67\\xf4\\x93\\x2a\\x6c\\x4b\\x97\\xd3\\x9c\\xd4\\xa4\\x59\\x85\\x06\\xc0\\xbd\\x74\\x0e\\xa9\\xf1\\x16\\x96\\x35\\x7d\\x7d\\x17\\xfe\\x4d\\x75\\xf9\\xd7\\x42\\x41\\xa7\\xaf\\x71\\xf9\\xd8\\x69\\xef\\x6c\\xd6\\x95\\x68\\x7c\\x03\\xfc\\x34\\xad\\x65\\xa6\\x8a\\x48\\x88\\xa1\\xa7\\x41\\x26\\xcb\\x55\\xcf\\x7d\\xa9\\xcb\\x4a\\x67\\x17\\xf6\\xeb\\x88\\x48\\x40\\x89\\xd2\\xc5\\x18\\x9a\\xe3\\x81\\xf2\\x5e\\x7b\\x3b\\xc3\\xb2\\x3d\\x0c\\x9d\\x9f\\x9c\\xdb\\xbe\\xec\\xfd\\x1e\\x72\\xa0\\x5e\\x67\\xbb\\x48\\x3a\\x97\\x64\\xd9\\xfc\\x75\\xad\\x69\\xe4\\xab\\x12\\x70\\xfb\\x40\\xf3\\x95\\x8f\\xea\\x4d\\xa5\\x59\\xb4\\x39\\x80\\xb2\\x46\\x81\\x31\\x3e\\x85\\x91\\xe6\\x85\\x46\\xa3\\xbf\\x76\\xee\\x34\\xb3\\x39\\x70\\x92\\x95\\xa8\\xd4\\x6f\\xb2\\x43\\x2d\\xda\\x2f\\x22\\x18\\x12\\xdf\\x69\\x28\\x95\\xe6\\x7c\\xb2\\x9c\\xbf\\x6f\\xf4\\x50\\x2b\\x43\\x9a\\x4e\\x9e\\x43\\x63\\x9e\\xc0\\x67\\xbc\\x90\\xae\\x81\\x4a\\x29\\x3a\\x7b\\xd4\\x69\\x68\\xe6\\x56\\x78\\x76\\x42\\x30\\x0a\\x0f\\xf2\\x69\\x7e\\x33\\x13\\xf6\\xa4\\x18\\xd3\\xd1\\x2a\\x5f\\x7c\\x51\\xa4\\xc5\\x7b\\x63\\x38\\x5f\\x2d\\x2a\\x21\\xd5\\xd1\\xd7\\x63\\xfc\\x8d\\x1b\\x93\\xc1\\x34\\x35\\xf9\\xe4\\x7e\\xe7\\xa4\\x25\\x98\\x0a\\x6a\\xe6\\xf1\\xa9\\xd0\\x07\\x60\\x74\\x76\\x78\\x3c\\x6d\\x0c\\x78\\x87\\x38\\x0f\\x86\\x8c\\x65\\xb3\\x82\\xd4\\xcc\\x8c\\x04\\x47\\x8b\\xbd\\x79\\xa1\\xd9\\xa9\\x64\\xb7\\x81\\x71\\xd6\\xbc\\xf0\\xb8\\xee\\xc5\\x0a\\x06\\xa4\\xea\\x23\\x4d\\x1c\\x23\\x46\\x5d\\x3e\\x75\\xb8\\x8b\\xc5\\x40\\xda\\xde\\x74\\xed\\x42\\x67\\x5b\\x07\\xf7\\xcf\\x07\\x82\\x11\\xe9\\x07\\xf8\\x6d\\x0d\\xc4\\xb9\\x78\\x62\\x3d\\x9f\\x08\\x73\\x8a\\xf9\\x28\\x69\\x5e\\x54\\x2e\\xc2\\x98\\x0e\\x55\\xa1\\xde\\x49\\xe2\\x52\\x47\\xfa\\x0a\\x09\\x67\\x81\\x18\\xe3\\x93\\x0b\\xc4\\xd2\\x4b\\x32\\x14\\xd6\\xdc\\xfb\\x6e\\xbd\\xf4\\x90\\x6c\\x92\\x8d\\xeb\\x37\\xbb\\x9b\\xa2\\x9c\\x8d\\xe1\\xbb\\x94\\x18\\xdb\\x71\\x8b\\x28\\x53\\xba\\x57\\xad\\x8c\\xae\\x46\\x77\\xad\\xdf\\xd1\\x8b\\x6c\\x7e\\x8c\\x24\\x26\\x21\\xb3\\x5c\\x7f\\x0e\\xfe\\x8d\\xd5\\xeb\\x26\\xff\\x75\\xfd\\x57\\x48\\xb1\\xd7\\x83\\xf6\\xd6\\x8a\\x7d\\x9d\\x56\\xda\\x2c\\x1a\\x97\\x8a\\xc2\\x5f\\x84\\xfb\\xb2\\xbe\\x55\\x68\\xd9\\x1e\\x70\\x93\\x82\\x21\\xc1\\x02\\xae\\xe6\\x04\\x09\\xbc\\xbe\\xc0\\xc8\\x2e\\x12\\xdd\\xb4\\x25\\xee\\xb6\\xec\\xd1\\x15\\x51\\xec\\xd1\\xd3\\x3d\\xda\\xe8\\x71\\xae\\x0c\\x8f\\x24\\xd0\\xd1\\x80\\x18\\x73\\x2b\\x5e\\x0e\"},\n{{0x8d,0xe8,0x63,0x30,0xb2,0x56,0x09,0x5e,0x11,0x14,0xb6,0x52,0x9b,0xed,0xce,0x18,0x2c,0x16,0x6f,0x67,0xa9,0x15,0x39,0xce,0xbc,0x4b,0xec,0x25,0xad,0xd7,0xa4,0xa9,},{0x33,0xcb,0x05,0x4b,0x55,0xbb,0x79,0x0a,0xc0,0xf3,0xaf,0xdd,0x9a,0x6e,0x7c,0x05,0x0e,0xfe,0x90,0x06,0xc2,0x4f,0x60,0xb8,0x04,0x4f,0xd0,0x8a,0x5c,0x10,0x6c,0x11,},{0x6d,0x01,0xd2,0x37,0xdd,0x2b,0xb4,0x18,0x8d,0x29,0xbf,0xde,0xc3,0x87,0x97,0x6a,0x71,0xbe,0x7a,0xdf,0xbf,0x9e,0x23,0x63,0x9b,0x21,0x6d,0x0a,0xa0,0xc1,0x19,0x32,0x23,0x5e,0xdc,0xcb,0x3b,0x42,0xad,0xcd,0xb6,0x29,0x1a,0x0d,0x29,0x9a,0xed,0x64,0x8d,0xe8,0xb1,0x95,0x79,0x49,0xb9,0xd1,0xcf,0x2e,0x50,0x49,0x30,0x30,0xa4,0x0f,},\"\\x39\\xe6\\x1e\\x0e\\xcc\\xec\\x92\\x9c\\x87\\xb8\\xb2\\x2d\\x4f\\xd1\\x8a\\xea\\xbf\\x42\\xe9\\xce\\x7b\\x01\\x5f\\x2a\\x8c\\xac\\x92\\xa5\\x24\\x48\\xa4\\x2f\\xed\\x4c\\xba\\xdc\\x08\\x5b\\xbb\\x4c\\x03\\x71\\x2a\\xe7\\x2c\\xfc\\xb8\\x00\\xb9\\x78\\x35\\x06\\x69\\xb0\\x99\\x00\\x84\\xf2\\xda\\xb7\\x6e\\xca\\x60\\x6d\\x1a\\x49\\xfc\\x55\\xc5\\x29\\xe1\\xe7\\xda\\xdf\\x39\\x12\\x2d\\xd5\\xbd\\x73\\x38\\x93\\x85\\x8b\\x05\\x23\\xef\\x62\\xdf\\x4f\\x13\\x4c\\xf6\\xc2\\x6e\\xed\\x02\\xfd\\xbc\\xb3\\x0c\\xe4\\x74\\xb1\\xad\\xa3\\xf0\\x60\\x76\\x9f\\x93\\x4b\\xbe\\x68\\x6c\\xce\\xbd\\x60\\x88\\x3e\\xce\\xc9\\xce\\x3f\\xfb\\x8a\\xc4\\xa0\\x67\\x8c\\xdc\\x5b\\x00\\x5a\\xe3\\xdb\\xa7\\xe4\\xfe\\x8b\\xc0\\x45\\x73\\x99\\x57\\xd8\\x49\\xf6\\x9c\\x14\\x74\\x05\\x7b\\x42\\x8c\\x54\\x25\\xf3\\xcc\\x25\\x16\\xe8\\xbb\\xe3\\xbe\\x81\\xaf\\xd4\\xe7\\xb5\\x75\\xab\\xe8\\x8c\\x87\\xf2\\xf0\\x3b\\x56\\xf6\\x9f\\x9e\\x3b\\x61\\xb3\\x78\\x81\\x20\\xda\\xa4\\x95\\xef\\x0e\\x50\\xeb\\x97\\x0a\\x64\\x5c\\x13\\xd2\\x13\\xc7\\xcf\\xb7\\xd0\\xad\\x55\\x5c\\x92\\x0a\\x1e\\x5d\\xbc\\xb4\\x67\\x97\\xd9\\x39\\xfe\\x04\\x01\\xf5\\x47\\xbf\\xd1\\x75\\x43\\x22\\x1a\\x53\\x01\\x0d\\xe0\\x1f\\x25\\xb6\\x45\\x19\\xc8\\xf0\\x39\\x63\\xe4\\xb9\\xca\\x58\\xb0\\x11\\x36\\x27\\xc0\\x5b\\x96\\x08\\xee\\xaa\\x7b\\x9a\\xe6\\x30\\x5c\\x96\\x18\\x81\\x60\\x00\\x0e\\xe3\\xa7\\xad\\xe9\\x6e\\x0b\\x4b\\xde\\x9d\\x0e\\xd6\\xa0\\xce\\xd7\\x65\\xd7\\x86\\x84\\x0a\\x48\\x17\\x5a\\x6e\\x09\\x0a\\x38\\xaf\\x6a\\xde\\xaa\\x14\\x86\\xa9\\xcb\\x5c\\x8c\\x8c\\x92\\x23\\xee\\x0a\\xe4\\xc6\\xc0\\x26\\x91\\xa3\\x54\\x7e\\x32\\x58\\x2a\\x5b\\x70\\x59\\xd2\\xee\\x66\\xfa\\x9c\\xd9\\x65\\x61\\x5c\\x31\\x5b\\x47\\x6f\\xd8\\x61\\x27\\x9c\\xd1\\xdd\\x76\\x07\\x74\\x3f\\xc5\\x56\\x12\\x96\\x31\\x2f\\x11\\xe4\\x65\\xca\\x40\\xbc\\xe3\\xcf\\x0b\\x1f\\x1d\\x5a\\x30\\xaf\\x60\\x87\\xde\\x4d\\xe9\\x6c\\xe4\\x39\\x65\\xa4\\x6c\\x4f\\xcc\\xa1\\x5f\\x28\\x11\\x49\\xb5\\xc1\\xa0\\xc8\\x8f\\xdb\\xf2\\x74\\x09\\xa1\\x34\\xed\\x4f\\x1f\\xb7\\x30\\xfa\\x19\\x18\\x16\\xea\\x78\\x4d\\x98\\x6c\\xc9\\xec\\x4b\\x69\\x44\\x02\\xde\\x1d\\xcc\\xa9\\xcc\\xc6\\x4f\\xbd\\x07\\xb0\\x7e\\x54\\xe9\\x31\\xde\\x82\\x7a\\x84\\x24\\x60\\xca\\x0b\\xf6\\xb0\\x4e\\xbb\\x57\\x1f\\xa7\\x77\\x87\\xe3\\x88\\x4b\\xe2\\x2f\\x1e\\x40\\x2c\\xf2\\xb8\\xa9\\x6a\\x5d\\x39\\x77\\x0e\\xc4\\xa8\\x43\\x03\\x61\\x42\\xa0\\xbe\\x97\\x0b\\xb1\\xab\\x16\\x5a\\x63\\x74\\xdc\\xf4\\x3d\\xeb\\x8b\\x98\\x30\\xb2\\xc4\\x9d\\xb9\\xcd\\xfe\\x4b\\x52\\x42\\xe3\\x6f\\x95\\xe0\\xc3\\xe0\\x77\\xe8\\xd2\\x38\\xfa\\x6a\\x8a\\xc0\\xd5\\x86\\xbf\\x61\\xb8\\x24\\x8f\\xb3\\xa7\\x9a\\x27\\x0a\\xb2\\x2b\\xe8\\xa9\\xda\\x05\\x5f\\xf3\\xd5\\xbb\\x2d\\x1c\\xa9\\xbc\\x25\\xf7\\x01\\x4b\\x96\\x40\\x77\\x19\\xde\\x34\\x4c\\x3e\\x73\\xb8\\xc1\\x14\\xf7\\x92\\x07\\x5a\\x5c\\x22\\xfd\\xd4\\x16\\x15\\x4d\\x34\\x94\\xec\\x3f\\x02\\xfb\\x11\\x2e\\xe5\\x73\\x7f\\x70\\x70\\x4c\\x1b\\x6b\\x07\\xea\\xcb\\xf9\\x45\\x62\\xca\\x7b\\x90\\xdd\\x84\\xd9\\x8c\\x3e\\xdf\"},\n{{0xba,0xb5,0xfa,0x49,0x18,0x7d,0xa1,0xca,0xb1,0xd2,0x91,0x90,0x00,0x19,0xe6,0xcb,0xaf,0xec,0xcd,0x27,0xbf,0x7e,0xcb,0xf1,0x26,0x2a,0x70,0x05,0x16,0xe7,0xc2,0x9f,},{0xf6,0xfb,0x19,0x85,0xec,0x59,0x1f,0x69,0xe3,0xba,0xc8,0x07,0xb2,0xea,0xbf,0x26,0x39,0x90,0xcd,0xfa,0x09,0xb1,0x78,0x09,0xe4,0x8e,0x38,0x5d,0xa0,0x65,0xec,0x21,},{0xe3,0x16,0x03,0x8d,0x6a,0xa1,0x5b,0x1c,0x1b,0x61,0xc1,0xa1,0x6b,0x36,0x90,0x4f,0xe8,0xa2,0x89,0xc8,0xd6,0x02,0xbe,0xcc,0x51,0x4d,0x99,0x22,0x00,0x86,0xb2,0x67,0x85,0x9f,0x5b,0xf6,0xe9,0xc0,0x86,0x35,0x59,0xac,0x62,0x3a,0x56,0xd7,0x53,0x23,0x44,0xe8,0xd2,0xf2,0x8b,0x3f,0x9d,0xf9,0x20,0x89,0x70,0x8b,0x1b,0x05,0x90,0x08,},\"\\x5c\\xf8\\xff\\x58\\x7e\\x52\\xcc\\xcd\\x29\\x84\\xf3\\x47\\x91\\xee\\x68\\x43\\xe7\\x70\\x17\\xc3\\xb5\\x5a\\xd4\\x5c\\x44\\x45\\x09\\x65\\xb7\\x5d\\x83\\x6e\\x78\\xfb\\xd7\\xa1\\xd1\\x72\\x9e\\xff\\x6d\\x6d\\x34\\x0a\\x90\\x3f\\x3c\\xf1\\x7d\\x9e\\x2a\\xec\\xaa\\xff\\x2a\\x32\\x1f\\xcd\\xde\\x0a\\xbc\\xfb\\xbc\\xbc\\xc0\\x9f\\x40\\x86\\xf8\\x12\\xc4\\x6e\\xfb\\x01\\xb7\\x83\\x43\\xaf\\xbe\\x48\\x30\\x9f\\x91\\x74\\x78\\x45\\x5f\\x32\\x00\\x0c\\x6a\\x69\\xf7\\x9f\\xe2\\x11\\xb9\\x9f\\x03\\x7f\\x59\\x56\\xd7\\x22\\x75\\xa7\\xfe\\x7b\\x45\\x29\\x6b\\x5f\\x73\\x9a\\xa4\\x51\\xff\\x05\\x75\\xbc\\x70\\x58\\x85\\xaa\\x56\\x31\\xb0\\xd0\\x85\\x0b\\xc2\\xb1\\x2c\\x41\\x92\\x43\\x5a\\xe5\\xd2\\xf5\\x2b\\xc5\\x43\\x86\\x49\\x7c\\x4a\\x24\\xb8\\xb6\\xdb\\x51\\x6b\\xe0\\x9d\\x8c\\xcf\\x1e\\xca\\x78\\x5b\\xde\\x97\\xe9\\xbe\\x1a\\xc0\\x64\\xf0\\x94\\xe2\\xaf\\xcc\\x30\\x7c\\x0e\\x06\\xb4\\xc5\\x64\\xcd\\x9a\\x9a\\x95\\x30\\x5b\\x37\\xb8\\x1f\\x43\\x46\\x11\\xdc\\xa5\\x5c\\xaa\\xa0\\x31\\xe8\\x84\\x95\\xd5\\xdc\\x5a\\x04\\xff\\x5f\\xaf\\xdf\\x0a\\x82\\xa0\\xc0\\x3a\\xff\\x1b\\xfb\\xf4\\xff\\xeb\\xae\\x71\\x82\\x4e\\x35\\xe7\\x51\\xb0\\x92\\x70\\x00\\x76\\x69\\x86\\x0b\\x58\\x00\\x35\\x65\\x9e\\x23\\xac\\xe7\\x6b\\x3b\\x36\\x9f\\xa3\\x06\\xf2\\xbe\\xd9\\x57\\x99\\xfa\\xfa\\xbc\\x2e\\x69\\xc1\\x41\\xbe\\xb0\\xba\\xca\\xc7\\xea\\xa3\\x47\\xe7\\x7b\\xe5\\xaf\\x3f\\xcd\\xbe\\x7b\\x36\\x4a\\x7f\\x9a\\x66\\xd5\\xe1\\x7a\\x07\\xdf\\x62\\x02\\xfd\\x98\\xc1\\x4b\\xfe\\xe2\\xca\\x6f\\x07\\x45\\x65\\x1f\\x0c\\x85\\x50\\xf9\\xff\\xff\\xca\\xfb\\x96\\xff\\xb3\\xf1\\x03\\xe6\\x52\\xe7\\x8f\\x53\\x91\\x6c\\xd6\\xf1\\xdd\\x05\\xb3\\xfe\\x99\\xb3\\x42\\x01\\xb0\\x7e\\xac\\x26\\x52\\xf5\\x25\\x35\\x71\\xfd\\x38\\x22\\xc6\\x95\\xd2\\x65\\xc7\\xdf\\xdd\\x6c\\x6b\\x14\\xa8\\x0b\\x6e\\x87\\x18\\x3e\\x6e\\x03\\x2e\\x5f\\x24\\x01\\xcd\\x23\\x8c\\xdd\\x37\\x69\\xbb\\x6e\\x39\\x08\\x23\\x43\\x8f\\x56\\x73\\xea\\x9a\\x47\\x9e\\x5c\\x63\\xfe\\x07\\xa0\\x7f\\x4e\\x14\\xf5\\x77\\x57\\xc4\\xd7\\xd2\\x2b\\x35\\xd7\\x1c\\x44\\xea\\xad\\x48\\x73\\xc8\\xec\\xa6\\xf6\\xb2\\x1d\\xcf\\xa9\\x55\\x20\\xff\\x96\\x14\\xab\\xf7\\xa0\\xe1\\x88\\x53\\x09\\xf2\\xce\\xd3\\xbc\\xdf\\xc3\\x19\\x36\\x3a\\x2d\\xa4\\x6d\\xed\\x79\\xa5\\xcc\\x7b\\x6f\\x69\\x38\\x3f\\x94\\xab\\x35\\xc2\\x50\\x62\\x9c\\xb9\\x15\\xd6\\x67\\xb6\\x28\\x11\\x86\\x75\\x48\\x95\\x80\\x3e\\x4b\\x95\\xe7\\x41\\x82\\x89\\xa6\\xac\\x3b\\xcd\\xb6\\xe1\\xe7\\xf6\\xf1\\xdc\\x38\\xe7\\x7d\\x28\\x19\\x14\\xcc\\x40\\x4f\\x97\\xcf\\xf1\\x4f\\xb2\\xc4\\xfd\\x81\\x41\\x2d\\x10\\x1c\\x1b\\xfb\\x36\\x8c\\xe5\\x93\\x11\\xe8\\x92\\xa8\\xb9\\xcd\\xca\\x86\\x93\\x6f\\x3b\\xca\\x7e\\xc7\\x91\\x63\\xed\\xdf\\x1c\\xee\\x68\\xf4\\x9f\\x1e\\xba\\xa2\\x7e\\xc5\\x0f\\x49\\x0d\\x61\\x60\\x1c\\xa3\\x5f\\x8d\\x6e\\xd2\\x66\\x05\\x4a\\xeb\\x9b\\x19\\x9f\\x93\\x3b\\xff\\xd6\\xe0\\x05\\x0f\\x26\\x1b\\x4e\\x13\\xd5\\xeb\\xfe\\x2c\\xaa\\x65\\x57\\xc3\\x2d\\xde\\xae\\xeb\\xc2\\xa1\\x1f\\x0a\\xa2\\x33\\x24\\x0d\\xa1\\xc7\\xe4\\x0f\\x76\"},\n{{0x74,0xca,0x12,0x2a,0xb6,0x0d,0xe5,0x0c,0xdc,0x04,0xa8,0xe2,0xed,0xa4,0x5d,0x96,0x31,0x06,0x1b,0xf1,0x87,0xd3,0x16,0xbe,0x5b,0x7c,0xc0,0x6f,0x02,0x0c,0x48,0x3e,},{0x78,0x7d,0xef,0xd4,0xfb,0x24,0xa3,0x99,0xbd,0x2a,0x4e,0x76,0xdf,0xf7,0xd6,0x03,0xed,0x0a,0xcb,0x32,0x69,0x81,0x3e,0x4d,0xf6,0x90,0xbb,0xf5,0xb2,0xbc,0x69,0x6e,},{0xbc,0xb4,0xb8,0x50,0x69,0x60,0x11,0x99,0x7e,0xb5,0xdf,0xe1,0x43,0xf1,0xa3,0xd5,0x62,0x8e,0xf1,0xa5,0x40,0x76,0x91,0xee,0x48,0xc7,0x9d,0x69,0xab,0xe4,0xd5,0x33,0xf8,0x17,0xad,0x73,0x13,0xb5,0x79,0x5e,0x46,0xe5,0x95,0xf3,0xae,0x3a,0x91,0x65,0xb1,0xb6,0xfd,0xda,0xe8,0x61,0x64,0xff,0xcb,0xa3,0x76,0x24,0x98,0x37,0xf6,0x09,},\"\\xa8\\x0b\\x46\\x07\\x9f\\xa7\\x75\\xf8\\xc1\\xa1\\x9f\\xa0\\x82\\x9b\\xe6\\x66\\xbd\\xfd\\xca\\x07\\x9c\\xad\\x43\\xd7\\x0e\\x08\\x42\\x18\\x3b\\xc0\\xdb\\x95\\x46\\x8a\\x53\\x9f\\x0d\\xb2\\xae\\xa3\\xab\\x9c\\x70\\x73\\xb4\\x5d\\x22\\x8a\\x9b\\xde\\x23\\x28\\x97\\xa6\\xeb\\x6f\\xc9\\xed\\xf7\\x36\\x5e\\x71\\x01\\xba\\x97\\xc4\\x46\\xa5\\x19\\xa3\\x64\\x9c\\xf5\\x27\\xc8\\xa6\\xde\\x72\\x51\\xb9\\x28\\x06\\x81\\x5a\\xc2\\xfa\\x00\\x82\\xef\\xf7\\x5e\\x25\\x82\\xcb\\xca\\x7e\\x1e\\x4d\\xa2\\xa4\\x46\\xea\\x23\\x3e\\x7c\\xf7\\xce\\xdf\\xb0\\xe2\\x39\\x8e\\xb6\\xe1\\x1b\\xba\\xef\\xe3\\xf7\\xec\\x89\\xf5\\xd7\\x3d\\xd3\\x4b\\xd4\\x7f\\xbc\\xb4\\xd7\\xb2\\x2f\\x2a\\xae\\xe3\\x73\\x78\\x56\\x51\\x84\\x11\\x35\\xcd\\x86\\x61\\xa7\\x01\\xb2\\x10\\x84\\xa3\\x16\\xde\\xac\\x30\\x74\\xe2\\x4a\\x2e\\x35\\xa0\\x33\\x0f\\x7d\\x14\\x79\\xb9\\x32\\xf2\\x85\\x27\\x7c\\x18\\xa4\\x41\\x78\\x72\\x24\\xfb\\xbe\\x46\\xc6\\x2e\\x83\\x4a\\x18\\x51\\xed\\x23\\x79\\x98\\xd4\\x8d\\xce\\x20\\xba\\x11\\x4d\\x11\\xe9\\x41\\xbe\\x29\\xd5\\x6d\\x02\\xf7\\x37\\x0c\\x8f\\x6d\\x6d\\x7e\\x50\\x24\\x8d\\xcd\\x8e\\xc8\\x9d\\x3b\\x22\\xf4\\xf5\\x87\\x78\\x12\\x9f\\xaf\\xd4\\xbb\\x92\\xed\\xe1\\x77\\x14\\xbf\\x02\\x2a\\x5b\\xf9\\x2b\\xe4\\x79\\xf1\\x8e\\x63\\x85\\x2e\\xcd\\xcf\\x8c\\x42\\x11\\xf5\\x30\\xdd\\x30\\xf7\\x9c\\xbf\\x4b\\xfa\\x57\\x37\\xf0\\xba\\xd3\\xb0\\x10\\x60\\x67\\xf4\\x13\\x27\\xc3\\x18\\x9e\\x6f\\x20\\x6f\\x0d\\x4f\\x3c\\x70\\x4b\\xf2\\xbd\\x0b\\x16\\x1f\\x01\\x8f\\xd2\\x1c\\xdd\\xfb\\x41\\x8b\\xac\\x4d\\x52\\xef\\x02\\xc4\\x1c\\x87\\x92\\xe4\\x13\\xb0\\x4f\\x08\\x36\\xce\\xa1\\xf8\\x6c\\x92\\xe5\\xd5\\x70\\x3b\\xee\\x2b\\x5c\\x58\\x99\\xe2\\x85\\x99\\x20\\x24\\xf6\\x4e\\x0d\\x16\\xc6\\x0a\\xd0\\xfd\\x92\\x54\\x79\\x32\\xd0\\xc5\\xcb\\x98\\xd8\\xda\\x22\\xfe\\xeb\\xdb\\xba\\x8d\\x1d\\xe1\\xe7\\xe9\\xbb\\x21\\x9a\\x92\\xeb\\x6c\\x1c\\x69\\x8d\\x3b\\x33\\xa3\\x7f\\x9b\\x81\\x97\\xd2\\x6b\\x55\\x0f\\xeb\\xd2\\x60\\x1e\\x7a\\x64\\x3e\\xa7\\xe1\\xd9\\xe4\\x48\\xae\\x03\\x7f\\x62\\x9a\\x30\\x6c\\xe4\\x17\\xae\\xb7\\x9f\\x2e\\x3c\\xa4\\x4d\\x8d\\xb3\\x84\\x8a\\x81\\x1f\\x18\\x46\\x81\\x1c\\xbc\\xb8\\x74\\xf8\\xaf\\x09\\xe0\\xfd\\x01\\x73\\xcf\\x17\\x5f\\x30\\x41\\x15\\x47\\x6b\\xf2\\xc6\\xc2\\xd2\\xf3\\x32\\xeb\\xa5\\x34\\xf4\\x6a\\xae\\x80\\x1c\\x26\\x92\\xc2\\xd2\\xfa\\xdd\\xfe\\xac\\xc0\\xf1\\xda\\xce\\x44\\x0a\\xbc\\x2a\\xe5\\xe5\\xa4\\x9d\\x57\\x8f\\xd7\\xf9\\xde\\x2a\\x84\\x1a\\xd6\\xb6\\x76\\x9c\\x32\\xb1\\x44\\xce\\xea\\x16\\xd0\\xf3\\xc0\\xcb\\x3a\\x8e\\xe6\\x94\\xc3\\x8c\\x28\\x07\\x35\\x95\\x09\\x6c\\x81\\x37\\x62\\xcc\\x2c\\x5e\\xc4\\xb0\\xd8\\xd7\\x23\\xdd\\x66\\x08\\x53\\x27\\x8f\\xc7\\x2f\\xd6\\xbd\\x9d\\x12\\x72\\x93\\x3d\\xd2\\xa3\\x8e\\xd9\\xd0\\x4b\\x13\\x90\\xff\\xe4\\xb2\\x94\\xa6\\xff\\xfa\\x72\\x1e\\xe3\\xbb\\xa3\\x3a\\x03\\xa1\\x49\\xc4\\xa0\\x34\\x52\\x65\\xc0\\x1c\\xe0\\x15\\xe9\\x4d\\xb4\\x19\\xcf\\xf7\\x04\\x98\\x52\\xee\\x00\\x00\\x48\\xa8\\x57\\x58\\xf6\\xd7\\xb1\\xc5\\x9c\\x50\\x89\\xee\\x01\\x8e\\xd0\\x9b\\x52\"},\n{{0x65,0xee,0xa9,0xff,0xb7,0x56,0x12,0xbd,0xe1,0xd9,0xba,0x3e,0xa4,0xfb,0x5e,0xda,0x0a,0xa6,0xf2,0x55,0x6a,0xb1,0x5b,0xf1,0x81,0x7c,0xee,0x3b,0x95,0xbb,0xba,0x12,},{0x5b,0x39,0x36,0xdc,0x74,0x9b,0x6b,0x92,0x39,0xf1,0x57,0x98,0xac,0xca,0xfd,0x88,0x4c,0x36,0x59,0xee,0x01,0xb2,0xd1,0x7d,0x74,0xfc,0x7d,0xa7,0x82,0x74,0xe7,0xe6,},{0xba,0xa7,0x11,0x31,0x55,0x35,0x8c,0x92,0x4f,0xed,0x57,0x48,0x8a,0x65,0x67,0xf8,0x72,0x38,0x50,0xa9,0xf5,0xc0,0x3a,0x0d,0x7d,0xe8,0x5f,0xcc,0xd8,0xfb,0x4d,0x17,0xd7,0x75,0x35,0x23,0xb0,0x0c,0x0d,0x8a,0xdb,0x88,0x4d,0xc0,0xc8,0xa7,0xa4,0x4d,0xc2,0xa6,0x00,0x83,0xaa,0x5b,0x3c,0x5b,0x94,0xa8,0xd8,0x80,0xf2,0xa9,0x4d,0x09,},\"\\xc0\\x69\\x36\\x32\\x3c\\xe3\\x25\\x3c\\xac\\x5a\\xb4\\xf6\\xb8\\x32\\x70\\xcd\\x4c\\xfe\\x85\\xd0\\xbf\\x8b\\xac\\x1e\\x1b\\x8d\\x5f\\x0b\\x15\\x3f\\x54\\x1c\\x8e\\x8e\\xd9\\x5f\\x28\\xd5\\xc8\\x5a\\x23\\x15\\xcd\\x93\\x1b\\x7c\\xf3\\xed\\xae\\x50\\xf9\\x28\\x30\\x59\\x91\\x62\\x80\\x4b\\x13\\x63\\xd3\\xac\\x0d\\xa0\\xab\\xd0\\x97\\x51\\x02\\x3b\\xdd\\xc1\\x62\\x88\\x94\\x4e\\x61\\x6d\\x21\\xd9\\x12\\x71\\x97\\x8b\\xb7\\x82\\xd3\\xeb\\xed\\x7f\\xa6\\x12\\x84\\xc7\\x49\\x0d\\x27\\x59\\x3c\\xa8\\xa3\\xd5\\xb4\\x75\\x62\\x33\\x07\\x01\\x0a\\xbc\\x1f\\xbf\\x79\\x3a\\x81\\x6a\\xaa\\xb5\\xe0\\x92\\x4d\\xec\\x79\\xd6\\x04\\x98\\x96\\x5c\\xf7\\xf8\\x0a\\xb5\\x9f\\xc0\\x29\\xf7\\x82\\x16\\x67\\x55\\xb7\\x2b\\x86\\x90\\x75\\x43\\x4a\\xb6\\x06\\xcc\\x87\\x0a\\x7c\\x0b\\xc8\\xbf\\x29\\xae\\xe0\\x33\\xfa\\x9c\\xc1\\x22\\xed\\x7c\\x8e\\x06\\x9b\\x54\\x7d\\xba\\xe2\\x59\\x01\\xb9\\xe2\\x49\\xb4\\x1f\\xea\\x0b\\xf8\\xda\\xf3\\x82\\x68\\x66\\xbc\\xae\\xd2\\x75\\x3b\\x5e\\x91\\xae\\x93\\x7e\\x71\\x7b\\x50\\x8a\\x0a\\xcf\\x4c\\x3b\\x06\\x1f\\xf0\\xcb\\x9c\\xfd\\x38\\x0e\\x24\\x94\\x50\\x09\\x51\\xa6\\x62\\xfd\\x49\\x28\\xfc\\x5f\\xca\\xf6\\xc1\\x8e\\x84\\xb1\\xd3\\x78\\xe4\\x9b\\xd9\\xd5\\x96\\x86\\xd0\\x87\\xeb\\xd5\\x52\\xd0\\x7f\\xa9\\xba\\x81\\x6f\\xa5\\x40\\x2c\\xa9\\xe7\\x25\\x2a\\x64\\x8d\\x10\\x6c\\xfe\\x6c\\x43\\x1c\\xc2\\xa0\\x53\\xe2\\x29\\x46\\x37\\xcd\\xb9\\x9d\\x96\\xab\\xe6\\x89\\xed\\xab\\xc5\\xca\\x07\\x0f\\x77\\xc1\\xec\\xd1\\xd5\\x2d\\x53\\x85\\x28\\x9f\\x17\\xce\\xd7\\x68\\xc3\\x97\\x16\\x71\\xb9\\xc0\\xb2\\xf8\\x55\\xb8\\x46\\x1c\\x1e\\x74\\x6c\\x7b\\x38\\xf7\\x78\\x96\\xb8\\x5a\\xfb\\xbe\\xdd\\x08\\x37\\x5f\\xe9\\x22\\x98\\x46\\x14\\xdd\\x84\\x9f\\xe2\\xcb\\x89\\xae\\x71\\x49\\xdc\\xd1\\xd3\\x7f\\x49\\x36\\xe6\\x7b\\x14\\x40\\xbe\\x72\\xe0\\x09\\x39\\x8b\\xe6\\xf0\\x83\\xbf\\x96\\x11\\x48\\x0b\\x59\\x2f\\xe2\\xf0\\x11\\x8e\\x25\\x3d\\xb5\\xd2\\xe9\\xe4\\xb4\\x54\\x1c\\x11\\xda\\x00\\xf7\\x16\\x1a\\x73\\x6e\\x5f\\x0b\\xb9\\x34\\x20\\x8e\\x3e\\xf4\\xe0\\xb9\\xa5\\x22\\x58\\x20\\x3f\\x06\\x0d\\x18\\xa1\\x95\\x15\\x9e\\x5e\\x26\\x8a\\xa2\\x80\\x53\\xc8\\x34\\xf7\\xbd\\x5d\\xb9\\xbd\\x71\\xf5\\x07\\xd9\\x13\\x70\\xb3\\xff\\xca\\xbb\\xd4\\xac\\xb3\\x07\\x1d\\x3f\\x6d\\x52\\xc3\\x49\\xac\\xf3\\x50\\x95\\x34\\x8c\\xeb\\xf5\\xa8\\x6f\\x8c\\x59\\xdd\\xc9\\x65\\xef\\xf6\\x10\\xac\\x42\\x58\\x04\\xc0\\xe2\\xf6\\xbe\\x42\\x85\\x3f\\x5b\\x46\\x43\\x4a\\x2c\\x31\\xd9\\xac\\x99\\x53\\x9b\\xfd\\xc0\\x4e\\xcf\\x2f\\xef\\xd0\\x45\\x98\\xfa\\x63\\xc1\\x39\\xff\\x6c\\x6d\\x88\\x41\\x0e\\x73\\xbd\\x32\\x8c\\xc4\\x34\\x9a\\xb4\\xbb\\x86\\xf2\\xe2\\xed\\x7c\\x73\\xde\\x96\\x52\\x0e\\xf7\\x73\\x0e\\xf3\\x83\\x45\\xe0\\xf9\\x72\\xa8\\x4c\\x53\\x88\\x10\\x36\\x87\\xe6\\x8c\\x50\\xf9\\xd8\\xc9\\xaf\\x90\\x3b\\xc6\\x32\\xd4\\x32\\x04\\x06\\x2a\\x4f\\x50\\x2e\\x21\\x4c\\x07\\x05\\x9c\\x2c\\xbe\\xf7\\x2a\\x54\\x11\\x0d\\xbf\\x73\\xe4\\x25\\x40\\x2d\\x17\\xe9\\x78\\xec\\x19\\x9b\\x51\\x8c\\xec\\x03\\x10\\xbf\\xbf\\x7d\\x9a\\xd3\\x00\\x43\\x4a\\x4a\"},\n{{0x08,0xda,0xbd,0x4e,0x5c,0x11,0x9e,0xa9,0x07,0xce,0x45,0xf0,0xa7,0xaf,0x9e,0x62,0xc0,0xc3,0xf1,0xc9,0xec,0x61,0xad,0x10,0x56,0x7d,0x79,0x36,0x28,0x54,0xc5,0x57,},{0x94,0x54,0x06,0xb8,0x5d,0x7b,0x32,0xe0,0xb1,0xab,0x12,0x00,0xb9,0x42,0x22,0xde,0x1a,0xaa,0x68,0x62,0x4c,0x60,0xbb,0x47,0x16,0xb0,0xbc,0xe9,0xdf,0x00,0x57,0x71,},{0x33,0xad,0xbf,0xcd,0x4e,0xd4,0xfa,0x67,0xc5,0x8b,0x5c,0xb5,0x9e,0x16,0x98,0x71,0x48,0x69,0x78,0x12,0x66,0x0b,0x35,0x31,0xff,0x6a,0x21,0xc7,0x49,0xb9,0x60,0x16,0x60,0xba,0xee,0xe2,0x48,0x9b,0x82,0xb4,0xcd,0xe1,0x32,0xb6,0xe6,0x2f,0x2f,0x90,0xd8,0xf9,0x92,0x78,0x60,0xaa,0xad,0x25,0x28,0x1d,0x03,0xeb,0x17,0xa9,0x52,0x0f,},\"\\x6c\\x47\\x19\\xa5\\xa2\\xa6\\x89\\x48\\x35\\xc4\\xac\\x1e\\xd6\\x91\\x59\\xe5\\xeb\\xb5\\x69\\x2a\\xd8\\xea\\xad\\xa4\\x39\\xf7\\x9e\\x96\\x68\\x4b\\x36\\xce\\xcf\\xb4\\x4b\\x89\\x01\\x56\\x31\\x66\\x3e\\x06\\x44\\xf6\\xc7\\xab\\x71\\x39\\x89\\xd7\\x42\\xda\\x27\\x42\\x72\\x53\\x31\\x8a\\x52\\x43\\x2d\\xfa\\xb2\\x12\\x1d\\x1e\\x92\\x33\\xea\\xd7\\x19\\xe2\\xc8\\x6a\\x6b\\xe0\\x73\\x63\\xd0\\x02\\x17\\x3f\\x20\\x54\\x46\\xca\\x95\\xfc\\x17\\xb2\\x46\\x35\\x82\\x7f\\xe3\\x15\\xf2\\x22\\x40\\x8e\\x45\\xe8\\x33\\xf2\\x9f\\xf0\\x8f\\xf3\\x1d\\xac\\x58\\x3a\\x4b\\xec\\x70\\x76\\xd5\\xcc\\x78\\xcf\\xc9\\x44\\x51\\xcb\\xf4\\xf7\\xe2\\xfc\\x5b\\x5e\\xd8\\x07\\x0f\\x4e\\xf8\\x08\\xbe\\x1d\\x8a\\x68\\x0e\\xcd\\xff\\x59\\x01\\x0f\\x39\\xb1\\xde\\x80\\xbe\\xf1\\x71\\x9f\\x1e\\x21\\x8e\\x0c\\xe0\\xa1\\xe3\\x93\\xa5\\x66\\xc5\\x17\\x64\\xd2\\x37\\x0d\\x95\\xa6\\x11\\x91\\xd8\\xf7\\xaf\\x74\\x0d\\xc2\\x08\\xfa\\x78\\x31\\xb2\\x10\\x67\\x05\\x12\\xcd\\x73\\x76\\x6e\\x60\\x9e\\x9b\\x78\\x00\\x21\\xeb\\xb2\\x0c\\xc8\\x79\\x0d\\x8d\\xa5\\xf1\\x0f\\x5b\\x6a\\x11\\x4a\\x1d\\xb8\\x8f\\x66\\x76\\x65\\x01\\x80\\x2d\\x9c\\x36\\x6e\\xa3\\xfa\\x6f\\x1b\\x1e\\x1e\\x8b\\x04\\x20\\x94\\x34\\x13\\xcc\\x6f\\xea\\xb2\\x8c\\x6b\\x68\\x3c\\xd2\\xb3\\x33\\x06\\x9c\\x89\\x51\\xbc\\x45\\xe8\\xa1\\x3b\\xd5\\x22\\x57\\x83\\x51\\xc8\\x82\\xf7\\xc3\\x42\\xfe\\x43\\x31\\xb9\\x21\\xf5\\x33\\xc9\\x2e\\xc0\\x4a\\x49\\xb2\\x92\\xbc\\x56\\x9d\\xdc\\xef\\xca\\xb5\\x72\\x7f\\x9b\\x56\\x25\\xb1\\x67\\xa9\\x02\\xdc\\x89\\x6d\\x8b\\xc7\\xd8\\xe9\\x99\\x20\\xf5\\xdb\\x8d\\xd7\\x67\\x83\\x9c\\x43\\xe3\\xcd\\xf9\\x47\\x08\\x0d\\xec\\x95\\x42\\x14\\xa6\\xfb\\xbe\\x04\\x87\\xa2\\xf3\\x2c\\xd1\\x7a\\x6b\\x00\\x03\\x70\\xbd\\x41\\x44\\x84\\xfb\\x73\\xc5\\x10\\xea\\x01\\x24\\xc6\\xcf\\x0f\\xe5\\x6c\\x08\\x46\\xa7\\x9b\\xfc\\x59\\x77\\x9d\\x3b\\x07\\xa1\\xbd\\x2c\\x7f\\xb7\\xe2\\xd0\\x03\\x9f\\x0b\\xd2\\x1c\\x8a\\x30\\x8f\\xb0\\xf5\\x8f\\xdb\\xf9\\x4e\\xfa\\x08\\x57\\xac\\x3b\\xdd\\xdd\\x86\\xd5\\x76\\x3e\\x20\\x5e\\xe1\\xb2\\x21\\xf0\\x60\\xce\\xdb\\x8b\\xc0\\x5f\\x03\\x1b\\x60\\x6c\\xc7\\x4d\\xad\\xc5\\xdb\\x04\\x23\\x27\\x48\\x86\\x5a\\x73\\xd6\\xcc\\xdd\\xb4\\xd5\\xe9\\x30\\xd5\\x28\\x34\\x8c\\x5b\\xe9\\x08\\x8b\\xfe\\x34\\x45\\x84\\x87\\xa6\\x7b\\x19\\xa1\\x8e\\xca\\x25\\xc0\\xd3\\xfb\\xe2\\x19\\x5e\\xb9\\x17\\x07\\xb6\\x5d\\x91\\x61\\xea\\x93\\xed\\xdd\\x64\\xa6\\x34\\xb2\\x32\\x80\\x19\\x5f\\xdb\\x0d\\x13\\x88\\xf6\\x99\\x8e\\x18\\x58\\xa4\\x5b\\x88\\x69\\x99\\xb8\\x44\\xe6\\x79\\x5d\\x83\\xd3\\x18\\x37\\xe4\\x41\\x1f\\x71\\x69\\x92\\x26\\xde\\x1b\\xa0\\x24\\x56\\x08\\x00\\x0d\\xcf\\x22\\x3d\\xd1\\x83\\x59\\xb7\\xc6\\xd4\\x59\\xa6\\x5d\\xbe\\x66\\xc9\\x0f\\x5c\\xb8\\xc0\\x91\\x22\\x18\\x7a\\x30\\x46\\xa1\\x6d\\xd1\\x79\\xc3\\xf4\\x37\\x3e\\x57\\xcf\\x5e\\xe0\\xea\\xb6\\xa2\\x12\\xcc\\x9e\\xd8\\xb5\\x4b\\xf3\\x7f\\x1d\\x27\\xfb\\xd7\\x98\\x48\\xe4\\xec\\x1f\\x56\\x72\\x43\\xab\\x87\\x40\\xa0\\x51\\x49\\xd9\\x60\\x2e\\xad\\xa9\\x20\\xa4\\x6d\\x61\\x0d\\x3c\\xc8\\x23\\xb5\\x64\\x98\"},\n{{0xe0,0xf7,0xd0,0x08,0x24,0xc5,0xf3,0x70,0x1e,0x55,0x17,0xa4,0xab,0xc1,0x3e,0x2f,0x2c,0x0b,0x13,0x8c,0x83,0x69,0x77,0x84,0x3b,0xbd,0x1e,0xef,0xfa,0xbd,0x96,0x8a,},{0x52,0xfd,0xda,0xe3,0xe0,0x18,0xa6,0x84,0x73,0xb3,0x16,0x8d,0x07,0x64,0xcf,0xe2,0x74,0xdc,0xc8,0x34,0xc9,0x0a,0x91,0xfb,0x4f,0xe7,0x4b,0x93,0x9d,0xd2,0x38,0xb1,},{0xcc,0xdf,0xe1,0x8a,0xd6,0xd0,0xb6,0x5d,0x08,0x6d,0x63,0x2f,0x83,0xcc,0x46,0xff,0x3b,0x3f,0x2c,0x07,0xbb,0x8e,0x76,0x9d,0x0f,0xb4,0xe8,0x2d,0xf8,0xa3,0x87,0x3f,0x9a,0xee,0x35,0xfd,0xd1,0x8a,0x57,0x83,0x60,0x31,0x80,0xa9,0x5c,0x9f,0x74,0xce,0xd9,0xdb,0x51,0x46,0xaf,0xcf,0xbb,0xdd,0x40,0xdf,0x29,0xe0,0x42,0x01,0x20,0x0c,},\"\\xb3\\x9e\\x3a\\xc7\\x5a\\x22\\x1a\\xdc\\xce\\xd0\\x9a\\x85\\x91\\xac\\x5e\\x2f\\xe1\\x5d\\xfe\\xd5\\xb9\\x19\\xcb\\xaf\\x14\\xc6\\x5e\\xb7\\xcd\\x93\\x08\\x6d\\xde\\xe3\\xf7\\x47\\x25\\x47\\xe6\\x6d\\xdc\\x70\\x06\\x2b\\x97\\x62\\x97\\xd1\\xa3\\xc1\\x70\\xee\\x52\\x5c\\x9c\\x53\\xba\\x93\\xa4\\xc4\\xfd\\xb2\\x35\\x72\\xb7\\xca\\x6e\\xd1\\x38\\x53\\xe7\\x0d\\xb1\\xd7\\x2e\\xde\\xb9\\x94\\x4b\\xbc\\x35\\x4a\\x52\\x0e\\x77\\xae\\x59\\x1f\\x31\\x80\\x92\\xef\\xd5\\xe6\\x6d\\x9c\\x09\\x81\\xc4\\xa4\\xbd\\xa9\\x8a\\xa4\\xe5\\x90\\x45\\xff\\x9c\\x4b\\x4c\\xa3\\xac\\xb2\\xff\\xd8\\x93\\x20\\x1c\\x70\\xb3\\x4a\\x77\\xf2\\x4e\\xda\\x54\\x54\\x9d\\xc8\\x4a\\xd1\\x34\\xa3\\x55\\x32\\x55\\x38\\x15\\x88\\x8a\\xe3\\xdd\\x9e\\x24\\x1e\\xc4\\xeb\\xbf\\xf8\\x6f\\x8c\\x1e\\x8a\\xdb\\xaa\\xc4\\xb9\\x1a\\xfd\\x18\\x22\\x8c\\xbb\\xd5\\xdd\\x80\\x5a\\xca\\xbf\\x0a\\x1e\\x29\\x0c\\xe5\\xdd\\xa0\\x25\\x1a\\xdf\\xb3\\x7c\\xb7\\x14\\xc1\\x39\\xb5\\xa3\\x24\\x2d\\x88\\xc6\\x44\\x84\\xa3\\x76\\x55\\xcc\\x8f\\xcb\\xec\\xff\\xa9\\x7f\\xbd\\x14\\xd6\\x4d\\x51\\x2b\\xf8\\xf6\\x30\\x5f\\x89\\xc5\\x09\\x22\\xde\\x54\\x16\\x92\\x15\\x8f\\xb5\\x47\\xfd\\x53\\x9f\\x1e\\x58\\x77\\xcc\\x64\\x94\\x95\\x16\\x63\\x32\\xea\\x2b\\x68\\x5c\\xfa\\x3f\\x60\\x20\\x19\\xdf\\x2a\\xb2\\xc2\\x5e\\xd9\\x6b\\x68\\x74\\x5e\\x9a\\xe8\\x9c\\x94\\x8d\\xa1\\x1a\\xd8\\xa8\\x30\\xdf\\x8b\\x00\\xf2\\xe6\\x68\\x19\\x2d\\xad\\xf2\\xc5\\x62\\x0d\\x35\\xc6\\xe8\\x1a\\x28\\x53\\xf8\\x41\\xe3\\x75\\xa0\\xd9\\xfc\\xa2\\xd2\\x96\\xef\\xce\\x2a\\xc3\\x8d\\x40\\xb0\\x30\\xb5\\x75\\x60\\xae\\x6e\\x83\\x41\\x33\\x9b\\x3d\\x3c\\x2d\\x06\\x11\\x64\\x12\\x43\\x19\\x59\\x86\\x88\\xfc\\xa6\\x18\\xfc\\x64\\xc9\\xe8\\xf5\\xf8\\x31\\x09\\x7a\\x05\\x3a\\xf1\\x9d\\x7d\\xbd\\x61\\x21\\x8d\\x92\\x67\\x42\\xc2\\xe9\\xa4\\x2a\\x79\\xcc\\x1b\\x14\\x89\\x12\\x72\\x2d\\x8c\\xd5\\xca\\x79\\x3a\\x1a\\xd7\\x3b\\x5f\\x14\\x1b\\x41\\x80\\x9c\\x2f\\xc0\\x53\\x0b\\x76\\x30\\xe8\\x03\\x90\\xc6\\xb3\\x38\\xc7\\x18\\x68\\xda\\xcc\\x59\\xbf\\x46\\x3f\\xfc\\x48\\x90\\x16\\xbf\\x67\\xf9\\xc9\\xd5\\x55\\x3c\\x1e\\xde\\x17\\x15\\x28\\x13\\xfe\\x0b\\x26\\x4b\\x65\\xdc\\xa1\\xb2\\xb3\\x8e\\x4b\\x80\\x9f\\x8c\\x97\\x25\\xac\\x5b\\x1d\\x8d\\x2e\\x56\\xbe\\xc9\\x64\\x9f\\xe5\\x5c\\x75\\x83\\xff\\x23\\xb0\\x43\\xd6\\xf3\\x76\\x86\\x28\\xf1\\xf0\\x51\\x63\\x37\\x82\\x4a\\x5a\\x56\\xb4\\x09\\x52\\x0a\\x6a\\x6c\\xb7\\x7e\\x4f\\x5f\\xc2\\x0b\\x9f\\x68\\x99\\xe0\\x0a\\xb2\\x2d\\xb1\\x0d\\x18\\x2f\\x09\\xb8\\x1e\\x94\\xf3\\xad\\x56\\x8a\\x0b\\x81\\x24\\x4d\\xf3\\xf1\\x85\\x5c\\x6e\\xf2\\x22\\xa4\\x1a\\x51\\xb6\\x2a\\x46\\x49\\xbb\\x82\\x69\\x0a\\xb6\\x5f\\xac\\xac\\x0d\\x81\\xd6\\xfe\\x02\\x60\\x11\\x70\\xa8\\xdb\\x62\\xcb\\xc5\\xec\\x99\\x55\\xd7\\x71\\x1a\\x1c\\x39\\x65\\x6a\\x9f\\x6e\\x1f\\xb6\\xbc\\x18\\x3d\\x9b\\xea\\x15\\x03\\x53\\x1f\\x17\\x36\\x27\\x68\\xbb\\x84\\x1f\\x9d\\x21\\xf1\\x3a\\x2c\\x99\\x1e\\x55\\xdf\\xf7\\xf2\\xb3\\x36\\xe2\\x9e\\xb2\\x95\\x07\\x63\\x8b\\xdc\\xad\\x7b\\xb3\\x1c\\x69\\xe9\\x09\\x20\\x7e\\xba\\xbc\\xc6\\x53\\xff\"},\n{{0x6a,0xcd,0x93,0x9e,0x42,0x22,0x26,0xcc,0x54,0x43,0xd4,0xaa,0xbf,0x58,0xc1,0x1a,0xf6,0x50,0xcb,0x40,0xb9,0x64,0x8b,0x4d,0xa3,0x8b,0x92,0x7b,0xff,0x9a,0x58,0xdb,},{0x4c,0x0b,0x91,0x75,0x6b,0x9e,0x20,0x6f,0x78,0x63,0xb1,0x55,0xff,0xc5,0x50,0x9b,0xb5,0x24,0x77,0xce,0xac,0xd0,0x1c,0xa0,0x11,0x43,0x51,0x53,0x67,0x86,0x46,0xcc,},{0x79,0x99,0x58,0x77,0xed,0x24,0xc7,0x91,0x68,0x4f,0x29,0x84,0xbd,0xf9,0x60,0x9c,0x3f,0x7b,0x57,0x6c,0x57,0xd1,0x62,0xee,0x62,0x2d,0x4c,0xe8,0xf3,0x6d,0x9c,0x55,0x73,0x16,0x9d,0x88,0x01,0x21,0x6f,0x1c,0x46,0xff,0xe2,0xf6,0xe2,0xc0,0x90,0x48,0xe4,0x7d,0x4b,0xeb,0x99,0x7e,0x9a,0xbc,0x4a,0xbb,0x12,0x9f,0x9b,0x79,0x69,0x0a,},\"\\x82\\x50\\xd5\\x31\\xcf\\x2b\\x66\\xaa\\xc2\\xb3\\x78\\xd5\\x4b\\xc5\\x7f\\xd3\\x29\\xad\\x5a\\x41\\x4a\\x59\\x92\\x55\\x89\\x8b\\x3c\\x3b\\x45\\xbf\\x9c\\x0d\\x2c\\x77\\x54\\x75\\x66\\xb6\\x60\\xee\\xcc\\x76\\xa6\\x95\\xa2\\xd6\\x08\\xab\\xf1\\x1a\\x5f\\x6d\\xb3\\xe6\\x07\\xfd\\x5a\\x21\\x71\\x4b\\x0f\\xad\\x5d\\x81\\x4c\\x01\\x5e\\xbf\\x48\\xbb\\x73\\xad\\x75\\xda\\x9c\\x03\\xc4\\xaf\\x54\\x89\\xe7\\x82\\xb6\\xbf\\x79\\x08\\xa1\\xbd\\x52\\x8d\\x7c\\xe7\\x88\\xa1\\x8b\\xa3\\x52\\x8e\\x35\\x37\\xaa\\x7b\\xbf\\x75\\xf6\\x52\\x4b\\xbd\\x19\\xa5\\x30\\x4b\\xa2\\xa4\\xa3\\xee\\x58\\xc4\\x1f\\xec\\x31\\x32\\xee\\x65\\x01\\x64\\x12\\x15\\xef\\xf7\\x46\\xd7\\x80\\x0c\\x4d\\x33\\xf5\\x2b\\xe8\\x35\\x7e\\x0e\\xe7\\x58\\x04\\x1d\\x91\\xcf\\xe4\\x3c\\x60\\xc3\\xce\\xdc\\x09\\xb0\\xd4\\x6d\\x4c\\xfb\\x9a\\xe2\\xa0\\x23\\x9b\\x6f\\x33\\xc6\\x94\\x1c\\xff\\x35\\x37\\x26\\x70\\xee\\xf5\\xc8\\x85\\x9a\\xb6\\x5b\\x6e\\x9f\\x7e\\xbc\\xe3\\x2f\\xa1\\x5a\\x9a\\x47\\x7a\\xec\\xdc\\x96\\x83\\xa1\\xe3\\x3a\\x1e\\xdc\\xdc\\x90\\xd4\\x20\\xa3\\x1e\\x78\\xc1\\x53\\xd2\\x60\\x20\\x87\\x1d\\xaa\\x4f\\xff\\x28\\xac\\xc3\\xf1\\x1a\\x72\\x06\\x78\\x88\\x06\\xb6\\xfa\\x02\\x34\\x68\\xea\\x5a\\x3d\\x18\\x6d\\x10\\xf0\\xdd\\x56\\x77\\x96\\x66\\x3b\\xa3\\x7c\\x83\\x2f\\xe7\\x5a\\xae\\x7d\\xcc\\xeb\\xf3\\x19\\xf9\\x36\\x00\\xc4\\x6a\\x22\\xf5\\x72\\x23\\x81\\x2d\\xdd\\x0a\\x68\\xd7\\x6b\\xaf\\x5e\\x27\\xa9\\xfc\\x8b\\xd6\\x8c\\xc1\\x0b\\x5b\\x51\\x51\\xd6\\x2b\\x41\\xf9\\x34\\x8e\\x21\\xb7\\x15\\x35\\x2f\\x26\\x30\\xb6\\x17\\xf8\\x13\\xb0\\xc2\\x89\\x96\\x28\\x59\\x04\\xcf\\x29\\x4e\\x9c\\x28\\x56\\xb1\\x7b\\xa3\\x5f\\x9a\\x82\\x19\\x8b\\x82\\x14\\xa0\\x35\\xe2\\x89\\x6d\\x65\\x68\\xbe\\x42\\x39\\x2c\\xce\\xf3\\x2c\\xd4\\xeb\\xfe\\xeb\\xf1\\x2b\\xe0\\x12\\x52\\x06\\xbb\\xe8\\x93\\x36\\xd3\\xe7\\x62\\x99\\x1d\\xfa\\xb6\\x8f\\xc9\\x9d\\xc1\\x64\\x9b\\x89\\x13\\x83\\xdb\\x31\\xfa\\xb6\\x49\\xe6\\x28\\x82\\x3f\\x45\\x98\\xcb\\x63\\x6a\\x38\\xfe\\x1d\\xf7\\x3e\\x68\\xd7\\x42\\x5f\\xc5\\xd2\\xeb\\x55\\xa0\\xfd\\x1b\\xc9\\xf5\\xce\\xaa\\xbd\\x6d\\xd4\\x1f\\x23\\xe4\\xf0\\x86\\xc6\\x92\\x63\\x3d\\xc3\\xc4\\x61\\x9a\\x97\\xab\\x0e\\xad\\xa1\\x71\\xf8\\x4a\\xdf\\x20\\xec\\xc8\\xec\\xd4\\x7c\\x51\\xcc\\xa3\\xe5\\x9d\\xd8\\x09\\xb0\\xae\\xaa\\x73\\x0d\\xf9\\x4b\\xe3\\xba\\xcf\\xd8\\xee\\x88\\x8b\\xba\\x9d\\x57\\x08\\x50\\x65\\x2c\\xd4\\xd5\\xe6\\xc5\\x52\\xa5\\x7e\\x9f\\x48\\xa2\\xb0\\x6a\\xac\\xdc\\x70\\x8d\\x84\\xa3\\x76\\xfb\\xc6\\xc9\\x4b\\xa6\\xbf\\x64\\xa5\\xf0\\x18\\x80\\x0a\\x7c\\xc8\\x51\\x24\\x5a\\xed\\xb2\\x03\\x78\\xb3\\x29\\xac\\xeb\\xb2\\x97\\x7c\\x13\\x98\\x08\\x2b\\x3a\\x0e\\x5e\\x2a\\x9c\\x24\\x84\\xfa\\x30\\x1d\\x30\\x37\\xa8\\x22\\x4d\\xdc\\xc0\\x95\\xb1\\xdb\\xd8\\xa2\\x31\\x5b\\x55\\xbf\\x33\\x18\\xc2\\x78\\x10\\xef\\xc3\\xd8\\xe2\\x5f\\xa7\\xa8\\x78\\x9b\\x73\\xa4\\xf5\\x50\\x59\\x08\\x0b\\x08\\xab\\xb3\\x69\\x9b\\x7b\\x86\\x26\\xcb\\x2a\\x78\\x0d\\x97\\xcc\\x1c\\xa8\\x03\\x28\\x51\\xba\\xf4\\xed\\x8b\\x64\\xfc\\x43\\x30\\x86\\x5f\\x84\\xcc\\xb1\\x2a\\x3d\\xae\"},\n{{0x4d,0xef,0xf6,0x47,0xcb,0xc4,0x5e,0xca,0xed,0xc3,0xf7,0xdd,0xf2,0x2c,0x16,0x7a,0xf2,0x4e,0x3d,0x63,0xda,0x22,0xb0,0xe6,0xa5,0xb8,0x43,0x9c,0x0f,0x3b,0x19,0x34,},{0x0c,0x27,0xc9,0xd7,0x7a,0xc8,0xc7,0x25,0xbb,0x06,0x63,0x93,0x3a,0xb3,0x0d,0x1a,0xad,0x09,0xcb,0xcf,0x2c,0xd7,0x11,0x6c,0x60,0x85,0xa8,0x49,0x9f,0x70,0x14,0x02,},{0xdd,0x54,0x89,0xfd,0xe4,0xba,0x87,0xd1,0x17,0x3d,0x4c,0xee,0x06,0x82,0xaf,0xdd,0x4b,0xad,0x80,0xdd,0x77,0x0e,0xa7,0xd0,0xdc,0xeb,0xaf,0x21,0xac,0xc6,0x1d,0xd6,0x32,0x4a,0xca,0x29,0x5e,0xd0,0xe2,0x3a,0x91,0x5e,0xcf,0xda,0xd5,0x0f,0x17,0x5e,0xbc,0x51,0x6f,0x1b,0xe5,0xb6,0xd8,0x7d,0x90,0xbb,0xe3,0x86,0x22,0x49,0x53,0x02,},\"\\xd6\\x20\\x1e\\xbc\\x21\\xce\\xc1\\xe9\\xbc\\x28\\xf9\\x57\\xc9\\xd0\\x29\\xcc\\x38\\xf9\\xe8\\x5e\\x06\\xdf\\xc9\\x0b\\xf2\\x97\\xe6\\x1f\\x2b\\x73\\xb4\\x07\\xd9\\x82\\xa6\\x6b\\x91\\xe9\\x4a\\x24\\xe9\\x1d\\x06\\xab\\x8a\\x5c\\x07\\x9d\\x0f\\x69\\xbe\\x57\\x88\\xea\\x8f\\xea\\xce\\xbd\\x91\\x72\\x91\\x19\\x22\\x33\\x86\\x2e\\x6a\\xcd\\xa1\\xe8\\xcf\\x9a\\x48\\xbf\\xfb\\x54\\x91\\xdd\\x65\\xaf\\x54\\x1b\\x6c\\x72\\xaf\\x68\\x1a\\x81\\x82\\x3d\\x98\\xa0\\xab\\xee\\xb6\\xba\\x9f\\x95\\x46\\x5b\\x84\\x11\\xf9\\x9e\\x11\\x9c\\xd2\\x84\\x79\\xda\\x98\\x42\\x59\\xbd\\xf8\\x6c\\x9f\\xef\\x3c\\xca\\x34\\xe2\\x24\\x69\\x1f\\x18\\x3c\\xf0\\x95\\x03\\x77\\x27\\xda\\x9c\\xad\\x29\\xf2\\x42\\xf8\\x3e\\xb4\\xf7\\x36\\xe2\\x7f\\xdf\\x67\\x01\\x8d\\x71\\x1b\\x74\\xc4\\x5b\\x29\\x55\\xa6\\xa7\\x6e\\xc1\\x53\\x30\\xdf\\x5b\\xad\\x80\\x30\\xc6\\xb3\\xa8\\x8d\\x72\\xf2\\x84\\x47\\x65\\x2a\\xc8\\x90\\x2b\\x5b\\x76\\xcb\\xf6\\xb9\\x45\\xce\\xab\\xfe\\xc0\\x4a\\x9b\\x8c\\xb3\\x0f\\x43\\xd9\\xeb\\x77\\x3e\\x67\\x05\\x59\\x4f\\x0d\\xe1\\xb7\\x0f\\x1a\\x20\\xc9\\x9f\\xc4\\xb1\\x22\\x1f\\x8c\\x81\\xb0\\xbc\\x30\\xda\\x12\\xcd\\x5d\\xea\\x8f\\x4d\\x90\\xf1\\x3a\\x81\\x1a\\x2c\\xc1\\x1a\\x96\\x84\\x6a\\xaf\\xb4\\xc4\\x2a\\x00\\xe9\\xae\\x7d\\xa2\\x56\\xa0\\xd2\\x2b\\x19\\x8a\\xfc\\x25\\xcc\\x10\\x41\\xd2\\x4e\\x05\\x6c\\xf3\\x87\\x60\\x1d\\x7b\\xf7\\xeb\\x31\\x82\\xd6\\x05\\xfe\\x5e\\x63\\xb1\\x8d\\x53\\x1a\\x5f\\x84\\xe5\\xdb\\xd0\\x18\\x4a\\x76\\xc6\\xc4\\x67\\xa8\\x26\\x3a\\x98\\xb5\\xc0\\x05\\xfc\\xb2\\xaa\\xf9\\x89\\xf5\\xcb\\xd0\\xa9\\xd9\\x03\\xfc\\xfc\\x60\\x9d\\x6e\\x57\\xd9\\xc4\\x39\\x02\\x1c\\xea\\x93\\xe4\\xc4\\xe9\\x91\\xf1\\x93\\xca\\xf3\\x24\\x37\\x70\\xb3\\x25\\x78\\x74\\x80\\x76\\xb7\\xf4\\xcb\\x97\\xf1\\x7c\\x17\\xa7\\x9b\\x82\\x25\\x3c\\x24\\x23\\xdb\\x69\\x8c\\xd0\\xa3\\x3a\\xb3\\x3b\\xb0\\x9b\\x0b\\x08\\xcb\\x8c\\xea\\xdc\\xa1\\xe2\\x9c\\x5d\\xe2\\xfc\\x12\\xb2\\x40\\x7b\\x6c\\xc5\\xaf\\x5a\\xe9\\x76\\xdd\\x3e\\xc6\\x30\\xd8\\x33\\x9b\\x7d\\xd1\\x1f\\xa3\\x4c\\xaa\\xc1\\x50\\xc7\\xc4\\x79\\x1d\\x8c\\x42\\x7b\\x0a\\xd9\\x2e\\x05\\x29\\x06\\x7a\\x88\\xd5\\x20\\x11\\xe1\\xe0\\xa1\\x82\\x99\\xb9\\x69\\x89\\x6f\\x8b\\x83\\x60\\xf7\\x5c\\x45\\xc4\\x96\\xda\\x47\\xb0\\x9b\\x45\\x0f\\x98\\x22\\xbc\\xbc\\xd4\\x3f\\x42\\x93\\xc5\\x16\\x80\\x2b\\xf7\\x47\\xc4\\xab\\xee\\xdf\\xaa\\x3e\\x79\\xcb\\x91\\x03\\xd3\\x77\\x0f\\x56\\x07\\xb7\\x75\\x16\\xe5\\xb1\\xce\\x0f\\x64\\xb6\\xee\\xc7\\xbe\\xc3\\xc6\\x47\\xc0\\x06\\x95\\x6d\\xc5\\x5b\\x6c\\x79\\xf6\\xaf\\xb3\\x9d\\x1f\\xc3\\xec\\xf1\\x1b\\x97\\x4b\\x44\\xae\\xdb\\x72\\xae\\xd1\\x31\\x66\\x35\\x08\\x3c\\x21\\x24\\x50\\x2e\\x5c\\x72\\xd8\\x6e\\xca\\xb6\\xac\\x90\\x24\\x3e\\xb3\\x9a\\x6a\\xa9\\xcb\\x94\\x80\\xda\\x38\\xe1\\xed\\xb8\\xd2\\x8f\\xf9\\x09\\x24\\xc0\\x5d\\x5d\\x21\\xaf\\x5a\\xf9\\x59\\x57\\xb8\\x02\\x07\\x81\\x37\\x87\\x11\\xa2\\x9d\\x09\\x20\\xac\\xad\\x8c\\xcb\\x39\\xa3\\x11\\x69\\x32\\x78\\xc9\\x90\\x0b\\x47\\x0d\\xa2\\xbd\\x4c\\x12\\xa0\\x1d\\x73\\x96\\x26\\x44\\x01\\x7b\\x60\\x34\\x71\\x3b\\x2a\"},\n{{0x5a,0x19,0xbf,0x6c,0x94,0x1f,0x39,0x4e,0x93,0xbd,0x36,0x25,0xfb,0x81,0xcd,0x9d,0xa8,0x1c,0x90,0x20,0xb1,0xc5,0x31,0x25,0x7a,0x7b,0x59,0x57,0xbb,0x07,0x92,0x11,},{0x20,0xe8,0x69,0x9d,0x08,0x7c,0xe5,0xe8,0x15,0x1d,0x28,0x05,0x3d,0xce,0x66,0xc2,0x3f,0x28,0x08,0x1f,0x35,0xbd,0x26,0x81,0x9b,0xbe,0x85,0xd3,0x8a,0x09,0xd7,0x02,},{0x2a,0x2f,0xd6,0x05,0x4e,0xf4,0xe7,0x9b,0x72,0x19,0x1a,0x0c,0xcb,0xd2,0xb1,0x8a,0xeb,0xab,0xe8,0xb9,0xa7,0x18,0x61,0xde,0xd9,0x8b,0x7c,0xdc,0xb6,0xa6,0x25,0x53,0x28,0xbc,0x1a,0xec,0xb0,0xc9,0x33,0x57,0x21,0xa9,0xa9,0x6e,0xe4,0xb5,0xb4,0x3f,0x90,0xd3,0x22,0xec,0xf8,0x35,0xf7,0x8b,0x26,0x4d,0xae,0x6e,0x38,0x7b,0xfb,0x04,},\"\\xf7\\x21\\xca\\x3a\\x32\\xc1\\xe8\\x1c\\x9c\\x6f\\x46\\xd5\\xe1\\xfb\\x50\\xe7\\xce\\x2f\\x4e\\x70\\x93\\x33\\xca\\x2b\\x55\\x0d\\x52\\x13\\xb6\\x77\\x3d\\x67\\x0c\\xa5\\x9a\\x2b\\x50\\x86\\xa4\\x43\\x84\\x3a\\xc5\\x08\\x13\\xb2\\x44\\xc9\\xc9\\xfa\\xc6\\xd1\\x19\\x69\\x89\\x27\\x81\\x35\\x12\\xc8\\x4f\\xe3\\x0a\\x89\\x55\\x30\\x10\\x13\\x8f\\x91\\xe8\\x17\\x6f\\x5c\\xf2\\x57\\x89\\xd7\\x28\\x1d\\xdb\\x83\\xa2\\x46\\x70\\x5d\\xcc\\xb9\\x99\\xc4\\xcd\\x0a\\xe2\\x19\\xc6\\x45\\xf6\\xd7\\x1d\\x45\\x1a\\xe1\\xf8\\xd2\\xf9\\x89\\x1a\\xf8\\xcc\\xce\\x03\\xf4\\x38\\x55\\x9f\\xb8\\x36\\x67\\xb8\\x07\\x7f\\xbe\\x43\\x5a\\x74\\x4a\\xf0\\x19\\xd6\\xd1\\x39\\x9f\\xd2\\x13\\x7f\\x5a\\xfb\\x8e\\xf3\\xf4\\x7b\\xcf\\x73\\x5e\\x7c\\x9e\\xd8\\xa5\\x4b\\xa0\\xc1\\xc6\\x56\\xb6\\x65\\x0b\\xb3\\x0a\\xdb\\x1d\\x57\\xec\\xd2\\x07\\x46\\x39\\x49\\x42\\x31\\xa2\\xe9\\xe2\\xf9\\x85\\xed\\x84\\x22\\xee\\x03\\xcb\\x3f\\xd7\\x38\\xc7\\x35\\xa1\\xb8\\x28\\x06\\x04\\x74\\x60\\xed\\x84\\xf7\\x46\\x8c\\x3c\\x64\\xb3\\x5d\\xb0\\x6b\\xc5\\x8d\\xe4\\xbb\\xa4\\x63\\xe6\\x38\\xa9\\x41\\x33\\xdf\\x10\\x6a\\xc4\\xf4\\x70\\x36\\x1c\\xcd\\xe4\\x41\\x57\\x29\\x9d\\x22\\x5b\\x17\\x79\\x88\\x91\\xba\\xf5\\x92\\x19\\x86\\xa2\\xba\\xe3\\x26\\xdd\\xa0\\xb8\\x96\\x17\\xc6\\x77\\xbd\\x14\\x08\\xba\\x27\\x48\\xba\\xa6\\x7c\\x8a\\x2c\\x5a\\x96\\x9b\\xc0\\x0c\\xb4\\x0d\\xbf\\x49\\x0e\\x07\\xe2\\x2c\\x91\\x3a\\xfd\\xde\\x63\\x04\\xa0\\x7f\\xc9\\xe6\\x08\\x46\\x99\\x24\\x56\\xbf\\xb0\\x66\\x3a\\x09\\xde\\xf6\\x8d\\xef\\x67\\xa1\\x6d\\x29\\xe9\\x8c\\x7b\\x55\\x35\\x18\\x48\\xa8\\xcf\\x92\\x31\\x0c\\x74\\x63\\xc4\\x75\\xf2\\x49\\xc6\\xf7\\x55\\x7f\\xd0\\xd7\\x55\\xca\\x88\\xf8\\x77\\x84\\x7f\\xe0\\x76\\x57\\x56\\xac\\x34\\xa2\\x3f\\x78\\x40\\xd9\\x5c\\x3d\\x29\\x4e\\x66\\x3b\\xb1\\x51\\x8b\\x75\\x92\\x7c\\x41\\x07\\x57\\xe0\\xf5\\xc0\\x7c\\x5a\\x7f\\xb2\\x15\\xdc\\x72\\x07\\x43\\x3e\\xbf\\x79\\x1e\\xdf\\xce\\xc9\\x0e\\x93\\x0f\\x8e\\x3b\\xa9\\xdb\\xbb\\x98\\x54\\x13\\xc2\\x23\\xbe\\x87\\x87\\x3b\\xd3\\x23\\x99\\x75\\x81\\x80\\x4d\\x88\\x96\\xda\\x38\\x6a\\x6e\\x91\\x20\\x05\\x0a\\x0e\\xae\\xd3\\x12\\x40\\xaa\\x17\\xc7\\xb6\\x69\\x4c\\x30\\xcb\\xcc\\x3c\\x69\\x56\\xa6\\x82\\x0f\\xc9\\xab\\x21\\x87\\x55\\x33\\x96\\x3d\\xc3\\xb0\\xd8\\x83\\x58\\x27\\x12\\x76\\xc6\\x05\\x65\\x28\\x91\\x0d\\xd9\\x89\\xae\\x0c\\x33\\x0d\\x17\\x98\\xf7\\xd8\\xe7\\xd1\\x18\\x4b\\x84\\xa8\\x14\\x34\\x32\\x5b\\x8c\\x30\\x2e\\xdf\\x60\\x1d\\xc5\\xe6\\xf8\\x47\\xfb\\xac\\xbd\\xee\\xff\\x78\\xc6\\x62\\x1d\\x1d\\xaf\\xdc\\x23\\x9b\\x18\\xb8\\xc1\\xaf\\xdc\\xb4\\xb9\\xda\\xbd\\x5d\\x3a\\x92\\xa9\\x32\\xea\\x15\\x99\\x54\\x6e\\x62\\x5f\\x96\\xd6\\xec\\x6f\\xb1\\xcc\\xcb\\x76\\xb4\\x76\\xb3\\x30\\xac\\x59\\x25\\x9c\\x63\\x4f\\xac\\x9b\\x3f\\xa7\\xde\\x7a\\xe7\\x05\\x37\\x73\\xb5\\xbe\\xfa\\x00\\x1b\\x04\\x92\\x9f\\x74\\xb7\\x12\\x41\\xe1\\xb2\\x57\\x69\\x6d\\x65\\xa2\\x6c\\x1b\\x4a\\xc8\\x6b\\x7b\\x1f\\xbd\\x69\\x57\\xfb\\x9b\\x95\\x08\\x4c\\xe7\\xd7\\x00\\x90\\xf5\\x5d\\x44\\x53\\x46\\x94\\x30\\x5e\\x91\\x76\\x9a\\x82\\x94\\x13\\x04\"},\n{{0xb5,0x06,0xc0,0x1d,0x69,0x74,0x6e,0xb4,0xbc,0x63,0x58,0x72,0x0e,0x43,0x8a,0xd3,0x30,0xc8,0x8b,0x60,0x5a,0xad,0x65,0x2f,0x47,0x99,0x57,0x3a,0xb0,0xa1,0xaa,0xf9,},{0x7a,0xc8,0xb6,0x88,0x63,0xbd,0x69,0x15,0x15,0x83,0x78,0x9d,0x86,0x4a,0x73,0x57,0xe3,0xa0,0x45,0xfa,0x86,0x52,0x2a,0x9d,0xaa,0x6e,0x26,0xfb,0x79,0xed,0x6d,0x23,},{0x17,0xa1,0x9d,0x26,0x91,0xb7,0xb0,0x46,0xd7,0xb1,0x96,0x69,0xad,0x73,0x14,0x0d,0xb9,0x2f,0x0c,0x97,0x8c,0x7f,0x61,0xbc,0x38,0x67,0xd9,0x2c,0xa9,0xd4,0x75,0x80,0xa0,0x38,0x0b,0x59,0x01,0xba,0xd8,0x2a,0xf4,0x5f,0x67,0x6f,0x74,0x28,0x73,0x01,0x98,0x0f,0x71,0x87,0x1a,0x42,0x26,0x1d,0xbe,0x08,0x02,0x95,0x03,0x36,0xe6,0x0b,},\"\\xf7\\xfc\\x18\\x06\\x6e\\xd0\\x4b\\x30\\xe6\\x33\\xd9\\x86\\x5d\\xa3\\x21\\x4b\\xec\\xa6\\x0b\\xd7\\x96\\x01\\x9c\\xd7\\xec\\xc9\\x18\\x66\\xf9\\xef\\x24\\x46\\xc1\\xfa\\xb0\\x6d\\x86\\x51\\xbe\\x7f\\x10\\x1a\\xec\\x7b\\xb8\\x4e\\xe2\\x1e\\x71\\xad\\x02\\x02\\x15\\xfc\\xfb\\x36\\xf2\\xd1\\x1e\\x45\\x79\\xac\\x39\\xf8\\xe2\\xb1\\x29\\x0e\\x38\\x96\\xd5\\x22\\xbc\\xf5\\x13\\xaa\\xa0\\x67\\x71\\xf8\\x6e\\xe2\\x28\\xcf\\xf3\\xa2\\x0a\\x1f\\x10\\xc5\\x64\\x33\\x95\\x89\\xbb\\xa9\\x60\\x53\\x44\\xc0\\xa6\\xe6\\x82\\xad\\x5b\\xa4\\x0d\\x10\\x41\\x94\\x1b\\xc4\\x6f\\x98\\xb9\\xd0\\x9c\\xa1\\x7f\\x8f\\x04\\x4e\\x98\\x3b\\x8a\\x49\\x08\\x93\\x3d\\xf2\\x26\\x3c\\xf7\\x88\\x11\\xc2\\x4c\\x8f\\x48\\x14\\x35\\x4f\\x6f\\x4c\\x68\\xb7\\xee\\x7b\\x78\\x30\\x82\\x93\\xbf\\x78\\xfd\\x0f\\xf1\\x22\\xf0\\x95\\xc1\\x4a\\x73\\xa5\\x97\\x97\\x17\\x2a\\xe0\\x5c\\xfc\\xec\\x19\\x56\\x3e\\xb1\\x8d\\x2b\\xc5\\x30\\x0e\\xd4\\xbf\\x6b\\xdc\\x44\\x3e\\xa9\\xb8\\xbc\\x1c\\xbe\\xde\\x94\\xca\\xb9\\x05\\xed\\xa5\\xa6\\xa9\\x31\\x59\\x7d\\xe4\\x02\\x14\\x6f\\xac\\x9c\\xf8\\xcd\\x6a\\x8d\\x10\\x46\\x69\\xf9\\x13\\xfa\\x83\\x40\\x01\\xca\\x4d\\x09\\x0f\\xb7\\x94\\x9d\\x31\\x09\\xa6\\x3c\\x05\\x49\\xb0\\x3f\\x15\\x1b\\x71\\x17\\xc4\\xf4\\x69\\x74\\xba\\x59\\xc6\\x82\\x96\\xed\\xfd\\xde\\x76\\x92\\xee\\x43\\x2a\\xce\\xf7\\x61\\x06\\x47\\xe0\\x95\\x78\\x65\\xe6\\x2c\\x1a\\x0c\\xf0\\x56\\x59\\x82\\x3a\\x55\\x45\\x2d\\xd5\\xe4\\x71\\xb3\\x1c\\x5a\\x49\\xab\\x05\\xb5\\xaa\\xfd\\x5a\\x0e\\x53\\x0e\\x89\\x6b\\x58\\xcc\\x52\\x2e\\xcf\\x19\\xe5\\x2e\\xc8\\x2f\\xa1\\x47\\xf9\\xe3\\x85\\x17\\x4c\\x7e\\xc3\\x3d\\x1d\\x9b\\x86\\x93\\x4a\\xeb\\x4f\\x6c\\x57\\x00\\xf7\\xd5\\xeb\\x33\\xff\\x73\\xc9\\xfc\\x6a\\xa4\\x7d\\xf5\\x1e\\x09\\x22\\x9e\\x6a\\xe8\\x94\\xe8\\x6c\\x81\\x8b\\xef\\x06\\x5f\\x82\\x59\\x71\\xa4\\xcb\\x90\\xad\\xfe\\xfb\\x31\\xeb\\xd9\\xd1\\xb7\\x94\\x22\\xdc\\x98\\x68\\xf9\\xf7\\x4e\\x7a\\x32\\xcd\\x40\\x71\\xef\\xb6\\x9b\\x27\\x23\\x3e\\x6e\\x5c\\x60\\xde\\xdc\\xd5\\x32\\x1c\\x03\\x0a\\x46\\xcd\\x26\\xf5\\x60\\x2c\\xac\\x74\\x7e\\xe4\\xb5\\x22\\xd8\\x57\\xa3\\x32\\x1a\\x03\\xf4\\x03\\xa6\\x00\\x62\\x50\\x40\\x63\\x61\\xe4\\x88\\x15\\xaf\\xba\\x77\\xce\\x08\\x90\\x34\\x41\\x84\\x5b\\xa8\\x72\\x25\\xd8\\xb2\\x40\\x46\\x74\\x5d\\x40\\x65\\x64\\x5a\\x1b\\x98\\x41\\x0c\\xac\\x48\\xd1\\x37\\xcb\\xbb\\x8a\\xb1\\xeb\\xa5\\x0d\\xa9\\xc2\\x31\\xe9\\xac\\xf3\\x22\\xa6\\xdb\\xec\\x0e\\xf4\\x16\\xa4\\x46\\xc3\\xb6\\x10\\xd9\\x35\\x69\\xfd\\xf4\\x5a\\xa6\\xcd\\xc1\\xb6\\x40\\xd8\\xf3\\x01\\xd7\\x86\\x93\\xb2\\x82\\x6c\\xc6\\xed\\x46\\x85\\x68\\xad\\x9a\\x0f\\x94\\xaa\\x9b\\x9f\\xb9\\x2f\\x7e\\x78\\xd4\\x84\\xfd\\xf5\\xd8\\xd4\\x5c\\x99\\x1e\\x28\\x07\\x4d\\xcd\\xd6\\x80\\xd3\\xb1\\xf1\\x89\\xef\\x6b\\xdc\\x32\\x0e\\xe6\\xe6\\x4d\\xd1\\xf8\\x0d\\x92\\x64\\xd8\\x30\\x42\\xd2\\xc4\\x3d\\x83\\x58\\x1e\\xf0\\x39\\x4b\\x1b\\x5d\\x1f\\x69\\xf3\\xbb\\xbf\\x04\\xb7\\xc8\\x08\\xba\\x34\\xc1\\x58\\x0f\\x16\\xf7\\x65\\x37\\xb6\\xa7\\xeb\\xd0\\xa1\\x90\\x8b\\xe9\\x49\\x4d\\x3f\\xca\\xa9\\x87\\x1d\\xb1\\x57\\x50\"},\n{{0xe1,0xcc,0xb8,0x0a,0x26,0x2f,0xf8,0xaf,0x1e,0xda,0x07,0x5c,0x97,0x2c,0x8e,0x94,0x1e,0x77,0xce,0xf5,0x7b,0xdb,0x0a,0x82,0x57,0x2c,0x28,0x20,0x0b,0x49,0x3c,0xa3,},{0x3d,0x37,0xe2,0xa5,0x02,0x7e,0xff,0xde,0xe0,0x7f,0xa5,0x11,0xe4,0x23,0xb2,0xbc,0x56,0xed,0xce,0xa0,0x75,0xb4,0x16,0x49,0x76,0x67,0x25,0xc6,0xb3,0x0a,0x10,0xf4,},{0xfd,0xa3,0x4b,0x65,0x2b,0x79,0x74,0x6f,0x89,0x7e,0x22,0x2d,0x37,0xb7,0x7a,0xa2,0x50,0xd0,0x2c,0x52,0x7c,0x48,0x33,0xdf,0x80,0xea,0x41,0xd5,0x21,0x89,0xd5,0x07,0x00,0xe1,0x28,0xb7,0x8e,0xe8,0x14,0x9c,0x9b,0x19,0xf3,0xab,0xf7,0x55,0xac,0xef,0x53,0x48,0xf5,0xfb,0xaf,0x1c,0xeb,0x41,0xc0,0x38,0x90,0x6a,0xc5,0x94,0x60,0x01,},\"\\xcf\\xdc\\x54\\x97\\xb0\\x23\\xaf\\xa6\\x2a\\x7f\\xe5\\x92\\xca\\xa9\\x2b\\x87\\x5c\\x77\\x05\\x74\\x78\\x34\\x00\\x2f\\x77\\x84\\xff\\x16\\x61\\x89\\x39\\x88\\x15\\xd4\\xe8\\xa7\\xa0\\x03\\x8e\\x1f\\xda\\xdd\\xde\\xba\\x51\\x05\\x73\\x27\\xad\\x19\\x60\\xe8\\x59\\xce\\xe5\\x65\\x26\\xbb\\xb4\\x12\\x7b\\x6a\\x5f\\x90\\xd0\\x4d\\x08\\xb1\\x5e\\xee\\x66\\xc9\\xcc\\xf8\\x8b\\x4b\\x7d\\x1e\\xe9\\xd3\\xb8\\xb8\\xc6\\xf4\\x2d\\xb3\\xc3\\x4e\\x59\\x04\\x8a\\x15\\xc6\\x04\\x1f\\x14\\x2c\\x40\\x79\\x36\\x8b\\x7b\\x11\\xe2\\x99\\x70\\x11\\x8b\\x99\\xe5\\x67\\x0a\\xe3\\x1f\\xcc\\xfd\\xff\\x13\\x99\\x14\\x2e\\xe0\\x6b\\x2e\\x3e\\x2b\\x3c\\x97\\x07\\xdd\\x64\\x11\\x97\\x86\\xe2\\xfa\\xb4\\x7e\\x0b\\xad\\x2c\\xc8\\xb5\\x58\\xd9\\x63\\xbb\\x48\\xa4\\x9a\\xd2\\xc6\\x37\\xdd\\x35\\xb2\\x5d\\xb5\\x4b\\xc5\\xa2\\x63\\x02\\x22\\xfa\\x2a\\xce\\xce\\x9c\\xe1\\x2a\\xb0\\x81\\x30\\x77\\xf7\\x65\\x9f\\x50\\x74\\x42\\x9c\\xa6\\xb4\\x94\\x33\\x10\\x32\\xae\\x79\\x2a\\x59\\x9c\\x42\\x5e\\xe2\\x97\\x45\\x1d\\xcf\\x5e\\xe1\\x95\\x29\\x03\\x12\\x74\\x2e\\x64\\x7a\\x77\\x95\\xb8\\x4d\\xcc\\x66\\x4d\\xda\\xe2\\xa1\\xfb\\xf8\\xc4\\x54\\x8a\\x37\\xfd\\x82\\xd8\\x10\\xe2\\x14\\x5f\\x01\\xdf\\x1a\\x6d\\x3b\\xcc\\x42\\xa9\\x1a\\x10\\x76\\x8e\\x09\\x1f\\x3d\\x69\\x32\\x9a\\x7b\\xad\\x6c\\x07\\x2c\\xac\\x6d\\x89\\xaf\\xa3\\x1c\\x02\\x90\\x56\\xd6\\xb6\\x22\\x12\\x16\\x5c\\xeb\\xcd\\x49\\xac\\x67\\x2e\\x38\\x30\\x26\\x7a\\xf9\\xf2\\x8e\\xa3\\x19\\xbd\\x04\\x2f\\x6c\\x59\\xde\\x47\\x01\\xe5\\x82\\x48\\x73\\x6c\\x8d\\x97\\x6a\\xcf\\x93\\xb9\\x9d\\x2f\\x46\\x47\\xa5\\x47\\xd3\\x92\\x44\\x7a\\x48\\xda\\xc1\\x11\\x81\\xe1\\x6b\\x15\\x01\\xa9\\x4c\\x93\\x16\\xe5\\xa6\\x7c\\x99\\x0b\\x35\\x81\\x0b\\x4c\\xda\\x04\\x73\\xa6\\xa4\\xe5\\x76\\x14\\x21\\x58\\x68\\xe2\\xe0\\x02\\xc6\\x05\\x8b\\x42\\xe4\\xee\\xec\\x84\\x13\\x9d\\xc1\\x9e\\xdf\\x5f\\x80\\xae\\xef\\xfa\\x4f\\x5b\\x07\\xe8\\xfd\\x23\\x13\\x9e\\xdd\\xa3\\x18\\x99\\xeb\\xe6\\xfe\\xe7\\x86\\x43\\xce\\x68\\x6b\\x29\\x63\\xa3\\x20\\x72\\xbd\\x3b\\x3b\\xba\\x68\\x48\\x5a\\x05\\xc2\\xcc\\x04\\x56\\xc3\\xda\\x50\\xc7\\xc8\\xc6\\x51\\xa3\\x06\\x6d\\x13\\xa3\\x66\\x0b\\xd4\\x7a\\xb6\\xdf\\xec\\x49\\xe0\\x15\\x57\\xa6\\x74\\x28\\x96\\xaa\\x4b\\xc6\\x36\\x3a\\x79\\x7d\\xba\\xd1\\xa4\\x09\\xcd\\x4a\\x50\\x91\\x1e\\x70\\xea\\x00\\x7a\\xf8\\xe9\\xb1\\xbb\\x7e\\x3a\\xb5\\x62\\x15\\xa5\\x75\\xc9\\x0f\\x73\\x9c\\x2d\\x48\\xb3\\xb3\\x46\\x94\\xb5\\xac\\xdf\\x07\\x98\\x0a\\xe5\\x28\\xde\\x06\\x21\\xed\\xfa\\xc8\\xb8\\xfa\\x84\\x95\\x4d\\x56\\xdb\\xb4\\xd0\\x30\\x82\\xb9\\x84\\xf1\\x3e\\x5d\\xbe\\x9c\\x71\\x12\\xff\\x97\\x16\\xf5\\x50\\x53\\x06\\x46\\x62\\xce\\x0f\\xb8\\x1e\\xa3\\x5f\\x98\\xfd\\x2c\\xd5\\x11\\x37\\xa4\\x6f\\x64\\xe0\\xc1\\xca\\xf4\\x4e\\x54\\x07\\xdc\\x96\\x17\\x60\\xb2\\x59\\x7f\\x7f\\x92\\x00\\x61\\x7d\\x47\\x13\\x40\\xcf\\x15\\x17\\x6c\\x3d\\xa8\\x80\\xfe\\x4e\\x0e\\x93\\xa7\\x2f\\xb9\\x49\\x26\\xfa\\xed\\x86\\x5d\\xfd\\xc7\\x72\\xe1\\x85\\x29\\x2c\\x1e\\x36\\xb1\\x21\\x17\\x81\\xc3\\xe9\\x38\\xe3\\xd4\\xf2\\x4e\\x29\\xaf\\x51\\x7a\\x37\\x96\\x83\"},\n{{0x4f,0xc5,0x12,0xef,0xd8,0x6e,0x3a,0x63,0xb3,0x95,0xea,0xff,0x1b,0xa0,0x11,0xe1,0x59,0x0f,0xb9,0x32,0x6a,0xd3,0xff,0xed,0xe7,0x87,0x6d,0xcc,0x3e,0x9f,0xab,0xdc,},{0x26,0xc2,0xa2,0x2f,0x9b,0xfa,0xd9,0x06,0x06,0xdc,0x61,0x3f,0xf1,0x07,0x02,0x1f,0xcd,0xdb,0xec,0x72,0x37,0x06,0x66,0x60,0xb4,0x88,0x96,0x43,0x49,0xe0,0xc8,0x28,},{0x82,0xc8,0x24,0xa7,0xd1,0x13,0x9e,0xc7,0x3a,0xe1,0xd0,0x23,0xad,0xf6,0x28,0x11,0x44,0x1e,0x96,0x82,0x87,0xf1,0xa5,0x80,0xb8,0x59,0xcd,0x66,0xcb,0x33,0xb5,0x8e,0x40,0x9b,0xde,0xb2,0xa8,0x74,0xbf,0x4c,0x23,0x61,0x0b,0xd4,0x4f,0x69,0x31,0x47,0xf2,0xf7,0xc2,0x9d,0x44,0x3a,0x90,0x50,0x84,0xf3,0xea,0xaf,0xd9,0x33,0x0e,0x04,},\"\\x07\\xcd\\x1e\\x9b\\xfa\\x38\\xa7\\xd8\\x85\\x34\\x65\\xa9\\x3c\\x77\\xab\\x4f\\x30\\xfa\\xf9\\x14\\xe4\\x8b\\xc4\\x76\\x3b\\xa0\\x7b\\xf9\\x6b\\xa8\\x08\\xc1\\xf5\\x9a\\xd4\\xce\\x9b\\x7d\\x92\\x1f\\xbb\\xc7\\x79\\x65\\x9d\\x7c\\xa3\\x6e\\xdb\\x7d\\xd3\\xac\\xf7\\xa2\\x94\\x52\\xa8\\x45\\xb4\\x9f\\xb6\\x54\\x3a\\x3b\\x6c\\x5c\\x1c\\x29\\x3a\\xff\\x61\\x84\\x85\\xa1\\x0e\\xea\\x60\\xee\\x96\\x49\\xac\\x9d\\x48\\x1e\\x69\\x49\\x96\\x7d\\x39\\x38\\xb5\\x2f\\xe0\\x9c\\x36\\xb9\\xad\\xe0\\x75\\x81\\xdb\\x4e\\xb5\\x42\\xa9\\x7f\\x5a\\xc8\\xac\\x73\\xd3\\xee\\xa1\\x84\\x72\\x25\\x56\\x76\\x0c\\xf4\\x83\\x09\\x05\\x64\\x55\\x30\\x61\\xb9\\x0a\\x0b\\x6d\\x2d\\xff\\x47\\x07\\xbe\\x76\\x39\\x37\\xa1\\x05\\x94\\xa8\\x2b\\x76\\x6b\\xb2\\xcf\\x6d\\xaa\\x52\\xfa\\x8d\\x7b\\x48\\xf3\\x21\\x27\\xc4\\x31\\xad\\x9a\\xae\\xd3\\xbf\\xde\\xb9\\x9a\\xd4\\x21\\x18\\xa1\\xb4\\xde\\x7b\\x99\\x21\\x34\\xed\\x9c\\xda\\xd0\\xb5\\x29\\x6d\\x19\\x7a\\x48\\x5e\\x49\\x3e\\xcf\\xec\\xa3\\x65\\x3a\\xd2\\xce\\x0f\\x92\\x41\\xaa\\xbc\\x09\\x6d\\x7c\\x4b\\xa6\\x03\\xba\\x7d\\xdd\\x07\\xa8\\xb2\\x57\\xfe\\x52\\x32\\x76\\x41\\x70\\x73\\xa6\\x5f\\xa4\\x43\\x42\\x56\\xfd\\x1f\\x23\\x9e\\xc1\\xde\\x5d\\xa1\\xa0\\xa8\\xc5\\xe6\\x86\\xee\\x14\\xd9\\xdf\\xa4\\x38\\xc5\\x3b\\x99\\xc9\\x54\\xaf\\xab\\x2f\\x79\\xe6\\x0b\\x71\\x26\\xf2\\xcb\\x58\\xa2\\x6e\\x29\\x0d\\xa1\\xdc\\xcf\\xc3\\x01\\xf2\\x39\\x74\\x8e\\xde\\x7b\\xcf\\x1b\\xb7\\xcc\\xb4\\x72\\x0e\\x69\\x2f\\x57\\xe5\\x3e\\x6f\\x59\\x07\\x53\\x99\\xe1\\x08\\x0a\\xc8\\xaa\\x9a\\x61\\xa5\\x68\\xc4\\xc5\\x69\\xd3\\x6e\\x76\\xa2\\xd7\\x27\\x1f\\x2c\\x44\\xde\\x4e\\x36\\x3a\\x8c\\x91\\x6a\\x4e\\x44\\x6b\\x02\\x7b\\x64\\x39\\x2e\\x90\\xce\\xab\\xf6\\xb6\\x07\\x1b\\xc4\\x7a\\x13\\x79\\xb6\\xaa\\x63\\x44\\x76\\x3b\\x2a\\x0e\\x7f\\xf7\\xc4\\xa2\\x7b\\xff\\x31\\x06\\x72\\x1c\\x25\\x3e\\x4c\\x1d\\x67\\xc3\\x7f\\xa3\\xd7\\xc1\\xec\\xd0\\x55\\xb8\\xe9\\x29\\xd5\\x2a\\x8e\\x45\\xed\\x89\\xfb\\x18\\x0f\\x74\\xb5\\x52\\xfe\\x06\\xf0\\x66\\xc7\\xe4\\x31\\x8c\\xa2\\xf9\\x15\\x94\\x6e\\x83\\x20\\xd5\\x80\\x65\\x61\\x47\\x2f\\xb8\\xff\\x7f\\xa8\\x07\\x2d\\x8e\\x6f\\xd1\\xce\\x63\\xcf\\x87\\x38\\x2f\\x7b\\x94\\x04\\x54\\x0c\\x1d\\x40\\x6c\\x70\\xb2\\x26\\x85\\x36\\x77\\x09\\x26\\x45\\xce\\x99\\x69\\x22\\xe7\\x34\\x5d\\xc0\\x7f\\xb7\\x33\\x9f\\x9a\\x54\\xff\\x07\\x35\\x2d\\xd2\\xb9\\x93\\x06\\x3c\\x2c\\x83\\xd1\\x28\\x1a\\x4f\\xd1\\x78\\xe5\\xa5\\xf8\\x0a\\x5b\\x33\\xc2\\x29\\xd0\\x57\\x83\\x67\\xd4\\x41\\x92\\xe9\\xa4\\xd2\\x1e\\x97\\x34\\xd3\\xbd\\xa0\\x83\\xb7\\x0f\\x47\\x10\\x3f\\xd1\\x25\\x17\\x70\\x21\\xdf\\x3e\\x53\\xd7\\x99\\x86\\xef\\xea\\x2d\\xc0\\x4f\\x02\\xc0\\xac\\x27\\x87\\x88\\x31\\x9e\\xf3\\xa9\\x13\\x2e\\x62\\x32\\xea\\x6d\\xb3\\x9c\\xa5\\x87\\x08\\x55\\xf9\\x59\\x2f\\xff\\x6c\\x20\\x9a\\xd2\\xf1\\xc2\\x9d\\xd1\\x68\\x55\\x28\\x98\\x97\\x9e\\xcf\\xf8\\xc8\\x11\\x27\\x24\\x8f\\x83\\x10\\x51\\x53\\x00\\x65\\x61\\x29\\xd9\\xb7\\xac\\xbb\\x7e\\xd1\\xe4\\x6b\\xc9\\x8c\\x04\\xd1\\xa3\\x5b\\x18\\x91\\x37\\x38\\xe9\\xdd\\xe4\\xd2\\xb0\\x65\\xf4\\x18\\x42\\x42\\xd8\"},\n{{0x0b,0x7d,0xfa,0xd0,0x5b,0xa6,0x65,0x11,0x1e,0x16,0x81,0xbd,0xc0,0xbc,0x8b,0xa9,0x73,0x76,0x7c,0xb8,0x58,0x77,0x02,0x0a,0x2d,0xbf,0x91,0x83,0x25,0x57,0x1d,0x9f,},{0x95,0x05,0xd9,0xe8,0x6d,0xce,0xf5,0x6c,0x9d,0xb7,0x6f,0x28,0x62,0xb9,0x0e,0x1f,0x27,0x73,0x20,0x2f,0x17,0x50,0x40,0x5e,0x7e,0xe5,0xae,0xd0,0xfc,0x54,0xf8,0xb9,},{0x41,0x5a,0xdb,0xb2,0xf2,0xb9,0x84,0x05,0x77,0xfd,0x18,0x41,0xf9,0xaa,0xe2,0x52,0xaf,0xe8,0xf5,0xa7,0x22,0x36,0x01,0x7d,0x50,0xdb,0x22,0xd2,0x28,0xcd,0xee,0x9f,0x5b,0x3e,0x8f,0xe9,0xa1,0x7a,0x4d,0x4e,0x98,0xb7,0x34,0x13,0x81,0xe8,0xd8,0x62,0x5c,0xdc,0xea,0x95,0x6d,0x25,0x3b,0x74,0xe0,0x2d,0xac,0xb8,0x49,0x20,0xa0,0x09,},\"\\xc4\\x3f\\xd3\\x4b\\xb1\\x42\\x4c\\xca\\x4e\\x4d\\xfb\\xa7\\x5c\\x28\\xbe\\x80\\x18\\x44\\x44\\x6c\\xa0\\x89\\x02\\x08\\x85\\xc7\\x48\\x38\\x25\\x47\\x16\\x4a\\x9d\\x4a\\x7f\\x95\\x70\\xd3\\xd1\\x71\\xad\\x69\\x81\\xab\\x50\\xee\\xee\\x08\\xa4\\xa6\\xc6\\x6d\\x76\\x99\\xd2\\x3e\\xdb\\xe1\\xfa\\xaf\\x44\\x66\\x0c\\x72\\xf4\\x55\\x2d\\x87\\xd2\\x65\\xac\\xe8\\x79\\x28\\x23\\x47\\x4b\\x90\\xa5\\xd7\\xf7\\x40\\x1d\\xeb\\x93\\x77\\x62\\x7f\\x60\\xb0\\x36\\xb3\\x6e\\x04\\x4e\\xb7\\x6b\\xf1\\x32\\xfd\\xdf\\xcc\\x0e\\xf5\\x70\\x4a\\x63\\x3d\\x84\\x5e\\x96\\x2b\\x47\\x51\\x7f\\x0b\\xaa\\x34\\xd3\\xd6\\xe9\\xa8\\xb9\\xf8\\x16\\x8b\\xcd\\xc8\\x4c\\x6d\\x2b\\x30\\xc6\\xf3\\x43\\xe7\\x53\\x57\\xf7\\xf2\\xc0\\x03\\x9b\\xd2\\x54\\xb2\\x44\\xd3\\x6c\\xd6\\x16\\x75\\x58\\x1f\\xb8\\x34\\x57\\x0e\\xd4\\x11\\x3a\\x78\\xe6\\x06\\xf1\\x45\\xa1\\x11\\x99\\x2c\\x2c\\x6b\\x61\\xc4\\x26\\x76\\x28\\xec\\x87\\xcd\\x88\\xc3\\x6a\\x3c\\x84\\x70\\x6e\\x44\\xae\\x96\\xa9\\x6e\\x0c\\x84\\x80\\x31\\x85\\x46\\xd6\\xea\\x6a\\x6d\\xf1\\x8a\\x2b\\x4f\\x19\\xf8\\x36\\x0c\\xfb\\xce\\x4e\\x9d\\x1c\\xf1\\x01\\x1f\\xfe\\xa5\\x63\\x3a\\x66\\x61\\x9a\\xa4\\xa6\\x5c\\xf6\\x9b\\xe4\\x45\\x96\\x17\\x94\\x5e\\x43\\x59\\xa9\\xd4\\x32\\x60\\xca\\x1a\\x20\\xf4\\xed\\x7c\\x1a\\xe5\\xff\\xff\\x3b\\xd9\\x22\\x94\\xea\\x70\\xab\\xba\\xe0\\x38\\x5b\\x09\\x35\\xcd\\x1c\\x0e\\xb5\\x18\\x30\\x29\\xc5\\x85\\xa0\\x29\\x4b\\x79\\x99\\xe3\\x2e\\xf7\\xa2\\x90\\xfc\\xb0\\x95\\x67\\x5d\\xc4\\xf6\\x01\\xe8\\xf2\\xc9\\x6f\\x35\\xb7\\x34\\x9a\\x37\\x05\\x75\\x09\\xf4\\xec\\x70\\xc9\\xf5\\x0f\\x60\\x11\\xf1\\xf5\\xe6\\xb0\\x61\\xc0\\x91\\xd1\\x1c\\x0e\\xd5\\xde\\xc8\\xec\\xe8\\x81\\xaa\\x34\\x05\\x08\\xf6\\x96\\xd9\\xe9\\xcc\\x72\\x98\\xe6\\xbc\\xcd\\x7c\\x21\\x0e\\x2c\\xe0\\xde\\xd8\\x35\\x92\\xa3\\xcf\\xa1\\x3e\\x80\\x78\\xfd\\xb3\\x25\\x8b\\x39\\xf1\\xd1\\x1c\\xdf\\xe0\\x96\\x70\\xc1\\xe6\\x0a\\x39\\x10\\xa4\\xff\\xf5\\x1c\\x6c\\x7f\\x7d\\x66\\x24\\xf4\\xc9\\x3d\\xf8\\x88\\x8c\\x52\\x6f\\x48\\x4f\\x9b\\x13\\xe0\\xa7\\xf6\\x29\\x64\\x78\\x39\\x78\\x68\\x4e\\x29\\x26\\x79\\x80\\x0e\\xd5\\xeb\\x28\\x0e\\x28\\x7c\\x7e\\x63\\x9e\\x85\\xfa\\xa5\\x3f\\xba\\x2f\\xa2\\x04\\x5c\\xe2\\x7d\\x8f\\xb3\\x08\\x36\\x07\\x26\\x55\\x0d\\xf9\\x75\\x2d\\xb3\\x05\\xf8\\xf0\\x66\\x47\\x97\\x0d\\x01\\x46\\x91\\x99\\x9a\\xfa\\x97\\xb6\\x19\\x3f\\xfc\\xc6\\xd5\\x32\\xf4\\xfa\\x69\\xe1\\x33\\xa1\\xd1\\x0f\\x30\\x47\\xfc\\x00\\x38\\x1f\\x49\\x97\\xbb\\x84\\xe5\\xb6\\xcd\\x60\\x28\\xc6\\x21\\x32\\xcf\\xc0\\x24\\xbf\\xeb\\x98\\x03\\x01\\xf2\\x95\\x12\\xbb\\xd1\\x09\\xd0\\x89\\xac\\xe1\\x82\\xcf\\x9c\\x2f\\xfa\\xb1\\xb1\\x7e\\xb0\\x0b\\x6e\\xb4\\x6a\\xe1\\x98\\xda\\x99\\x3f\\x5e\\xfe\\x7c\\x1d\\xc2\\x2d\\x25\\x04\\x7c\\x1e\\xe5\\x24\\x65\\x17\\xe7\\xf5\\x75\\x8f\\x99\\x6a\\xbd\\x83\\xf1\\x3d\\xa2\\x2c\\x13\\xdd\\x20\\x5e\\xe1\\x91\\xb5\\x5a\\xfd\\x48\\x31\\xef\\x07\\x8b\\xb6\\xea\\x07\\x3a\\x62\\x5b\\xc9\\x7c\\x81\\x29\\x61\\x60\\xbb\\xf2\\x55\\x9b\\x27\\x5c\\xc3\\x7c\\xcf\\x01\\xb9\\x1f\\xd8\\x7d\\x4d\\x99\\xa3\\x67\\xaa\\x99\\x78\\xda\\xdd\\x06\\x89\\xf8\\xa6\"},\n{{0x78,0x18,0x8d,0xf8,0xc7,0x54,0x78,0x56,0x21,0xe2,0x7a,0xe5,0x8e,0x10,0x0d,0x50,0x80,0xe1,0x6e,0x0a,0x15,0xe2,0x77,0x05,0x1f,0x95,0xf0,0x80,0x90,0x0e,0xc0,0xd3,},{0xa1,0xbd,0xee,0xe9,0x8b,0x07,0x57,0xba,0x9c,0x2d,0x84,0x09,0xb8,0x74,0x24,0xe6,0x4e,0x42,0xf9,0x93,0x2a,0xcf,0xa9,0xbc,0x71,0xfb,0x3f,0x8c,0xa0,0xe1,0x1d,0x52,},{0xb9,0x41,0x14,0xed,0xa4,0x6c,0xcf,0xc2,0x2a,0x44,0x71,0xa6,0x4d,0x79,0x08,0x92,0xe5,0x9c,0x5d,0x50,0x56,0x18,0xeb,0x0e,0x70,0x13,0x92,0xc7,0x09,0x61,0x3e,0x2d,0x50,0x3a,0x5c,0x2b,0x66,0x60,0x1e,0x63,0x6a,0x3c,0x1c,0x7d,0x49,0xb1,0xac,0x79,0x8d,0x90,0x89,0xb0,0xf9,0xcc,0xd0,0x57,0x9b,0xb9,0x06,0x34,0xd0,0xbd,0x75,0x0e,},\"\\xcf\\x70\\xcc\\xa5\\x7f\\xeb\\x1b\\xee\\xfe\\x98\\x5a\\xd5\\xaf\\x9d\\x43\\x48\\xd3\\xa4\\x6a\\x63\\xde\\x10\\x75\\x38\\x1f\\xb3\\x63\\x9a\\x04\\x4f\\xd6\\xe6\\x09\\x1f\\x5d\\xb9\\xc9\\x4d\\x39\\xbe\\x0f\\x13\\xad\\xe6\\xd9\\xa0\\x74\\xe6\\x7b\\xa7\\x06\\xb3\\xa8\\x80\\x62\\x95\\xf6\\xb6\\x54\\x86\\x57\\x28\\xc5\\x8c\\xa6\\xe9\\x41\\x9d\\x5d\\x04\\x3f\\x21\\x10\\x81\\x4b\\xbf\\x36\\xfc\\x40\\x70\\xe4\\xd9\\x45\\x49\\x65\\xc2\\x51\\x20\\x2c\\xa3\\x95\\xef\\xe3\\xfd\\xbd\\x54\\x4f\\xeb\\x18\\x7e\\x34\\xca\\x3c\\x80\\x79\\x51\\x79\\x55\\x2f\\xce\\x9a\\xa8\\x04\\x43\\x0e\\x5b\\x6c\\x86\\x85\\x34\\x1e\\x91\\xd5\\x88\\x9f\\xbf\\x3f\\x98\\x19\\x04\\x62\\x0f\\xfe\\x70\\x13\\xf5\\x3b\\x93\\x9e\\x17\\x44\\x3d\\x61\\x4e\\x7e\\x6b\\xb5\\x7a\\xd6\\x74\\xf3\\xb4\\xb0\\x01\\x63\\x05\\x26\\xcf\\x73\\x02\\xa7\\xd0\\xaf\\xe7\\xdc\\x24\\xd6\\xda\\xde\\xf6\\xfe\\xba\\x3f\\x96\\x97\\x3a\\xa5\\xb8\\xd6\\x27\\x52\\x62\\xe4\\x30\\xa8\\x2f\\x67\\x86\\x96\\x97\\x1a\\x8b\\x60\\xe3\\x8d\\x3b\\x2b\\xcc\\x17\\x0d\\x5b\\xc2\\x03\\x02\\xa3\\x9c\\x59\\x6d\\x27\\xfe\\xe3\\x9e\\x5d\\xa5\\xb1\\x0e\\xa9\\xf3\\x82\\x29\\x9e\\x19\\x81\\x97\\x17\\xa7\\x18\\xd3\\x7d\\x15\\x5f\\x13\\x92\\x31\\x82\\xb5\\xb7\\xa1\\xc5\\x4c\\xa1\\x09\\xb2\\x2c\\xa8\\xe8\\xb2\\x6c\\xa5\\xca\\x3f\\x3b\\x90\\x62\\x21\\x94\\x61\\xba\\xce\\x97\\xe8\\x90\\xc9\\x4e\\x41\\xca\\x3d\\x84\\x58\\x7f\\xbd\\xf6\\xe2\\x40\\xc3\\x5c\\xca\\xb7\\x1d\\x58\\x47\\x7d\\x28\\x16\\x8e\\x93\\x37\\x26\\x86\\xd4\\x2a\\xad\\x32\\x4a\\x3f\\x16\\xaf\\xe0\\xe9\\xb8\\x9e\\xe2\\x0e\\x48\\x5f\\xe6\\xc8\\x64\\xb5\\x01\\x3b\\xa8\\x83\\x99\\xee\\xaa\\x15\\x98\\x35\\xa8\\xb2\\xbb\\x2f\\x25\\xf5\\x79\\xca\\x3b\\xae\\x67\\x5c\\x63\\xda\\x1b\\x50\\xd9\\x9d\\x4e\\xd9\\x78\\x69\\x2e\\x56\\x00\\x23\\x3f\\x38\\xab\\x7e\\x7a\\x5a\\xe0\\xfb\\xf8\\xc0\\xb6\\x9c\\xc3\\x8b\\xd3\\x0e\\xab\\xd9\\x77\\xef\\xa0\\x5e\\xe2\\xc8\\x35\\x14\\x30\\x2b\\xd4\\x0c\\x4b\\xdc\\xe7\\xa4\\x11\\x0a\\xfb\\xb6\\x57\\x9c\\x62\\x0e\\x97\\xf8\\xcf\\x2e\\x9b\\xab\\x2d\\xcc\\x7c\\x33\\xf1\\x96\\xe5\\x7f\\xe7\\x61\\xa0\\x50\\x12\\x28\\x94\\xb7\\xa7\\x5a\\x92\\x95\\x31\\x99\\x6d\\xda\\xad\\x78\\xde\\x1d\\x4d\\x92\\x4c\\xd9\\x3a\\x61\\xdf\\x22\\x77\\x76\\xbc\\x1c\\x39\\xfb\\xb8\\xde\\x1c\\x44\\x38\\x86\\x8b\\x6a\\x3a\\x2c\\xd9\\x4c\\x07\\xb2\\x9e\\x3f\\x6b\\x23\\xcc\\x7e\\x0b\\x63\\x68\\x90\\x09\\xd9\\xd0\\xba\\xe1\\x60\\x6b\\xaf\\xc7\\xa8\\x08\\xf2\\xd2\\xfa\\x25\\x62\\xb8\\xdc\\x09\\x38\\x42\\xc0\\x1f\\xdb\\x84\\x0d\\xa4\\x86\\x0a\\xce\\xd3\\xfc\\x52\\x5c\\xa3\\x34\\xed\\xcf\\x65\\x94\\x8b\\xc4\\x16\\xf9\\x8c\\x45\\x0f\\x00\\x12\\xa6\\x10\\x7d\\xd7\\xf8\\xed\\xe4\\x0e\\x1c\\x48\\xc9\\xe8\\xa5\\x65\\xa8\\x10\\xb9\\xcf\\xd2\\x03\\x56\\xdb\\x19\\xf1\\xdb\\xde\\x59\\x89\\x21\\x33\\x2e\\x0d\\x81\\x3f\\x0c\\xb8\\x76\\x84\\x37\\x03\\x88\\x77\\x2f\\xf3\\xcb\\xfc\\xbf\\xa2\\x99\\xc1\\x98\\xc9\\x7b\\xfb\\x96\\x17\\x76\\x8a\\x05\\x16\\x1f\\x41\\x69\\xff\\x5d\\xe5\\xd9\\xf4\\x00\\x62\\x09\\x0f\\xb8\\x82\\x98\\x4d\\x9d\\x5c\\x7a\\xa7\\x8e\\xdd\\xcb\\x96\\x34\\xe4\\x66\\xb8\\x85\\x3d\\x51\\x2b\\x4a\\x54\\x6d\\x74\\x23\"},\n{{0x73,0xcb,0x02,0xb0,0xbf,0x26,0xa0,0x15,0xda,0x1d,0xc3,0x01,0xfc,0x12,0x5d,0x7e,0x6c,0x30,0xb6,0x3c,0x9e,0x6e,0xee,0x9e,0x06,0x5d,0x4e,0x84,0x71,0x32,0xc3,0x25,},{0xac,0x9e,0x3d,0xd2,0xce,0xb9,0xb2,0x3e,0x74,0x8c,0x04,0xba,0x75,0x77,0xfe,0xdf,0x7c,0xea,0xb9,0xed,0x87,0xdc,0x43,0x0b,0x5f,0xe2,0x2e,0xac,0x50,0x95,0x0e,0x0d,},{0x1a,0x5d,0xd4,0xc8,0x91,0xc8,0xe1,0x32,0x57,0x01,0x87,0xc2,0x3b,0x9a,0x1e,0x4b,0x26,0xf0,0x54,0x60,0xe8,0x75,0x67,0x38,0x19,0x39,0x6d,0xf5,0x61,0xc8,0xaf,0x0e,0x48,0x33,0x3b,0x62,0xc7,0x77,0x29,0xd4,0x9f,0xc4,0x0e,0x17,0x4a,0x7f,0x3c,0x21,0xf8,0x5e,0xf4,0xd3,0x39,0xce,0xb8,0x0b,0xd2,0xe0,0x37,0xd8,0x03,0xaf,0x56,0x0e,},\"\\x0a\\x2b\\x61\\xba\\x35\\xe9\\x6e\\x58\\x19\\xb8\\x8b\\xfd\\xb2\\x8b\\x7c\\xe0\\x2e\\x64\\xae\\x9c\\xf5\\x72\\xb2\\x1f\\x13\\x55\\x2c\\x0d\\xb1\\x0f\\x39\\x60\\xd4\\x4b\\xa3\\x47\\x2f\\x43\\xab\\xc4\\xe6\\x29\\x5b\\xdf\\x79\\x0b\\xd9\\x33\\xba\\x39\\x75\\xfd\\x44\\x65\\xfa\\x3e\\x2f\\xe2\\xdb\\x02\\xb6\\x37\\x77\\x52\\x22\\x3d\\xec\\x98\\xfc\\xb2\\x40\\x4f\\x3a\\xba\\x43\\x26\\x5a\\x6f\\xa7\\x97\\x6b\\x6c\\x6c\\xb6\\x86\\x8b\\x88\\x1b\\xd6\\xf3\\xd2\\x5c\\xd9\\xd6\\xf7\\x0e\\x51\\x2f\\x80\\x89\\xc8\\xef\\x26\\xfd\\x58\\x24\\x50\\x53\\x77\\x9e\\x59\\xc4\\x72\\x5a\\xef\\xa2\\x64\\x67\\xc9\\xf5\\x00\\xe1\\x7f\\x3e\\x15\\x73\\xf1\\xa8\\x55\\xe9\\xb8\\xb2\\x19\\x25\\xea\\x05\\x27\\xf3\\xce\\x8d\\x88\\xfb\\x54\\xa4\\x7a\\xbe\\xed\\x14\\xf3\\x99\\xcc\\x2d\\x9f\\x1f\\xe5\\x46\\x65\\xfa\\xe0\\xa8\\xf0\\xc6\\x88\\x72\\xa6\\x00\\x04\\x6d\\x1d\\xc3\\x63\\x97\\xd3\\x10\\xce\\x39\\x3f\\xce\\xaf\\xe8\\x7c\\x17\\xeb\\xe1\\x22\\xfd\\xb5\\x43\\xae\\xa7\\x10\\x85\\xba\\xec\\x98\\x27\\x3f\\x41\\xac\\x96\\x69\\x8c\\x15\\x0c\\xf9\\x11\\xd0\\xe5\\xde\\x23\\x92\\xd8\\x48\\x41\\xd0\\x12\\x76\\xae\\xfb\\xfe\\x99\\x95\\xe1\\x0a\\x6d\\x46\\xef\\xdc\\x26\\x78\\xd4\\x56\\xc9\\xf3\\x6b\\x2e\\x10\\x11\\x4d\\x11\\x87\\xe7\\xac\\xa7\\x39\\x03\\x7e\\xa5\\x1f\\x85\\xfd\\x62\\xa2\\x94\\x29\\xba\\x52\\x9c\\xdd\\x8a\\xd9\\x13\\x47\\x49\\x74\\x87\\xed\\x7e\\x87\\x09\\xd4\\x77\\x6e\\xf6\\x86\\x70\\x79\\x2d\\x06\\x15\\xbc\\x96\\xda\\x51\\x78\\xd6\\x06\\xdb\\x63\\xe4\\xe5\\xcb\\x17\\x2a\\xcf\\xbc\\x1c\\xbe\\x20\\x26\\x93\\x50\\xf1\\xb6\\x05\\xf3\\x5d\\xcd\\x47\\x91\\x35\\xbd\\x30\\xfb\\x4b\\x5a\\x39\\x17\\x6c\\xff\\x74\\x4d\\xdb\\xb3\\x06\\xc9\\xe7\\xb4\\x16\\x7d\\xe0\\x37\\x9a\\x61\\x66\\xbe\\x5a\\xaa\\x74\\xd7\\x15\\x7f\\xac\\x95\\x7d\\x88\\xdc\\x57\\x59\\x7c\\xfe\\xf2\\x3e\\xb5\\x10\\x8b\\x3c\\xe5\\x3f\\xc6\\x32\\xda\\xd1\\xb9\\x72\\xa2\\x9d\\xa5\\xde\\x32\\xd2\\x0d\\x8e\\xce\\xde\\x67\\xff\\x00\\xda\\x4a\\x08\\xa0\\xcc\\x1a\\x98\\xbe\\xe7\\xa9\\x4e\\x3c\\xb3\\x2f\\xee\\x94\\xae\\x25\\xa4\\x13\\x54\\x47\\x02\\xc3\\x7b\\x3e\\x17\\x78\\xa0\\x70\\xcd\\xd4\\x84\\x0b\\xd3\\x9f\\x5f\\x45\\x79\\x51\\x92\\xa8\\x67\\x86\\x38\\x76\\xed\\x0d\\x13\\x0d\\x46\\xe2\\x91\\x39\\x35\\x08\\x28\\x09\\xf7\\xe1\\x5a\\x49\\x67\\x10\\xf2\\x55\\xd7\\x83\\xda\\x3d\\x01\\x6a\\x65\\x4c\\x15\\xff\\x5d\\xf9\\x07\\xa3\\xcc\\xaf\\x37\\xcf\\xe1\\x1c\\x8c\\x3d\\x49\\x65\\x07\\xd6\\x76\\x0c\\x05\\x38\\x20\\xf0\\xf5\\x94\\xc3\\xd0\\x1c\\xa2\\x69\\x17\\x8a\\xca\\x52\\x5a\\xb2\\x82\\x1e\\xf5\\x5f\\x92\\xd8\\x5f\\xe6\\x85\\xea\\x34\\x47\\x2e\\xd1\\x39\\x81\\x71\\x06\\x4d\\x74\\xa4\\x22\\xec\\x91\\xd1\\xa6\\x70\\x61\\x8f\\xc9\\xf3\\x24\\x24\\xbc\\xb1\\x1a\\x77\\xf6\\xfb\\x4e\\x2f\\xef\\xd2\\xc4\\xe8\\xa7\\x3c\\x45\\x28\\x86\\xe9\\x31\\x66\\x4d\\x1a\\x83\\xbd\\x92\\x73\\x29\\xc0\\x4d\\x25\\x0b\\x83\\x52\\x1d\\x7d\\xc1\\x3c\\x91\\xce\\xe1\\xec\\x05\\x0e\\x11\\xd4\\x2a\\x4b\\x0c\\x8c\\x06\\x9b\\x61\\xc4\\x42\\x2d\\x3a\\x49\\xc0\\x7e\\xff\\x29\\x05\\xb7\\xbc\\x7f\\x4a\\x5b\\x43\\xe6\\xb0\\xd6\\x1d\\xfb\\x50\\xe4\\xee\\xa2\\xe9\\x0d\\x29\\x8a\\x78\\x1d\\x05\"},\n{{0xdb,0x05,0x60,0x63,0x56,0xba,0xcf,0x23,0xaf,0xf6,0xcd,0xdd,0x42,0xb2,0xc6,0x94,0x35,0x2b,0x5a,0x0f,0xec,0x56,0x0a,0xff,0x54,0xd9,0xbd,0x97,0x10,0xef,0xe0,0x6a,},{0x32,0xa5,0xc7,0xcc,0x49,0x09,0x78,0x6b,0x48,0xa5,0x3f,0x31,0x09,0x3f,0x54,0x9a,0x9f,0x17,0x30,0xca,0x66,0x90,0x38,0x3f,0xdb,0x5f,0x14,0xc2,0x66,0x6e,0x31,0x32,},{0x53,0x09,0x9b,0x76,0x6a,0xdf,0x29,0x44,0xb6,0x82,0x13,0x74,0x84,0x2c,0x25,0xd6,0xe6,0x7b,0x0c,0xcd,0xe9,0xc6,0x37,0xfe,0xcb,0x11,0xb8,0xb8,0xb0,0x72,0x03,0xe3,0x07,0x57,0x32,0x80,0x5f,0x4f,0x14,0xae,0xae,0x73,0xbd,0x62,0xe3,0x08,0xb5,0x88,0x7d,0x68,0x9e,0x29,0xcd,0x89,0xb2,0x3a,0x47,0x69,0x43,0x11,0x07,0x17,0xb1,0x00,},\"\\x1b\\xc9\\xc2\\x83\\x3f\\x37\\xcd\\xf1\\x35\\x6f\\xad\\x16\\x67\\x68\\x64\\x27\\x17\\x70\\x1b\\x38\\xa0\\xab\\x0c\\x2f\\x58\\x1a\\x26\\xd2\\x22\\xd6\\x5c\\xce\\xe4\\xbf\\x0f\\x6d\\xfe\\x64\\xd3\\x3b\\xc0\\x23\\x9f\\x71\\xd4\\xb8\\x26\\x44\\xb0\\x16\\x25\\xa1\\xa3\\x5f\\xe7\\x98\\x67\\x62\\x39\\xe0\\xca\\x77\\x9e\\xf2\\x31\\x38\\xee\\xbe\\x3b\\xd1\\x9d\\xe2\\xd8\\xf7\\xc1\\x5b\\x4d\\x96\\xf1\\x3e\\x51\\xbc\\x63\\x3b\\xea\\x5d\\x61\\x22\\x5b\\xca\\x1d\\x63\\x39\\xba\\x53\\xe8\\x1f\\x7d\\x8d\\x24\\xc5\\xd6\\x0f\\x04\\xce\\x8c\\x72\\x67\\x61\\xd2\\x64\\x58\\x4f\\x1c\\x7e\\x5b\\x5b\\x69\\x92\\x45\\x6c\\x1c\\x76\\x89\\x2d\\x63\\x52\\x11\\x1e\\x3b\\x92\\x6f\\xe0\\x25\\xc0\\x00\\x9d\\xb6\\x7c\\xe0\\xdd\\xc7\\xf7\\x64\\xe0\\xc9\\xad\\xb0\\x48\\x1b\\xc2\\x79\\x54\\x84\\xd9\\x63\\x73\\xa9\\x62\\xa7\\xb7\\x4a\\x55\\x96\\xf5\\x27\\xa7\\x34\\x76\\x49\\x8c\\x78\\x23\\xdf\\xfa\\x6c\\x85\\x43\\xb0\\x79\\x71\\xb5\\xaa\\x27\\x1c\\x12\\x25\\x5e\\x09\\x18\\xdd\\x73\\xf5\\x0c\\x30\\xc9\\xa8\\x5a\\xc7\\xc2\\x99\\x3d\\xd6\\x55\\xda\\x59\\x43\\x12\\x63\\xf5\\x91\\x4b\\xe7\\x06\\x37\\x4b\\xe9\\xc0\\x75\\x85\\xc2\\x87\\x13\\x28\\xb4\\xdb\\xc3\\x94\\x01\\xc9\\x57\\x07\\x38\\x7e\\x6e\\x06\\x9d\\x44\\xb9\\xd8\\xfb\\x05\\x8f\\x22\\xe3\\x15\\xaa\\x0d\\x5b\\x4f\\x11\\x68\\xfc\\x10\\x79\\x62\\xb0\\x64\\xf7\\xd8\\x45\\xaf\\x8e\\x21\\x31\\x95\\x1d\\x1c\\xd6\\x6d\\xc8\\x4d\\xba\\x46\\xd2\\x00\\xaf\\x4f\\x4c\\x5f\\x51\\x22\\x1b\\xc9\\xb2\\x19\\x69\\x42\\xf8\\xb4\\x0e\\x7d\\xdb\\xc9\\xae\\xb3\\xd9\\xaf\\xc0\\x71\\x25\\x95\\x13\\x13\\x5a\\x01\\x6f\\x28\\x66\\x09\\x9f\\xa1\\x0f\\x4c\\x3b\\x73\\x50\\x0b\\xd5\\x5c\\x47\\x7b\\x24\\x15\\xe1\\x0a\\x27\\x9b\\xa1\\x10\\xd2\\x94\\xf3\\xdd\\x18\\x42\\x17\\x7d\\x0b\\x4b\\xfb\\x17\\x34\\xdd\\x0c\\xcb\\x7e\\x39\\x4b\\x43\\xd1\\x6f\\x0b\\x75\\x48\\x36\\x22\\x80\\xf4\\x34\\x76\\x4d\\xa5\\x7f\\x19\\xed\\x3e\\x30\\x2e\\x53\\x70\\xfb\\xa4\\x96\\x64\\xc2\\x30\\x05\\x74\\x33\\xcc\\x64\\x7e\\xb2\\x7c\\xd2\\xc7\\xc1\\x8c\\x7d\\x66\\x90\\x6f\\x08\\x82\\x46\\xc2\\x2f\\x7f\\x79\\x03\\x99\\xde\\xb4\\xc5\\xfb\\xb9\\x06\\x18\\x17\\x69\\xbe\\xf5\\xaf\\xbe\\x8a\\xd1\\xf5\\xde\\x55\\xbe\\x58\\x8f\\x52\\xf6\\x9c\\x54\\xd4\\xef\\x5a\\x96\\x9a\\x0d\\x99\\x5c\\x27\\x40\\x7b\\x23\\xed\\xd9\\x24\\x3d\\x24\\x99\\xfd\\xf2\\x94\\x73\\xb1\\x95\\x5c\\x84\\xb3\\xf7\\xcb\\xdc\\xd8\\x1b\\x76\\x56\\xec\\x0b\\xe9\\xe0\\xfd\\xb3\\x38\\x13\\x56\\x96\\x0f\\xd0\\xca\\x70\\xe7\\xea\\x74\\xb6\\x46\\xfc\\xd3\\x13\\x94\\x8e\\x6d\\xdb\\x47\\x60\\x94\\x76\\xfb\\x6f\\xa4\\x84\\x2f\\xa7\\x88\\xa0\\xd5\\x7b\\xe3\\xb0\\xa6\\xca\\x18\\x19\\xf7\\x16\\x14\\x76\\x00\\x43\\xec\\x49\\x04\\x88\\x19\\x39\\x96\\x8a\\x43\\xb5\\xd1\\x92\\x8f\\x84\\xa5\\x91\\x90\\x93\\xbc\\x38\\x41\\x58\\x81\\x71\\xa9\\xcd\\x39\\x0f\\x8f\\xcd\\x61\\x53\\x8b\\x54\\xe6\\xef\\x99\\x77\\x05\\x73\\xe1\\x98\\x6d\\x15\\x0f\\xa9\\x6b\\x7a\\x07\\xe1\\xd1\\x94\\xaf\\x1c\\x0b\\x40\\x55\\x00\\xac\\xb3\\xd1\\x0e\\x3b\\xe6\\x47\\xc8\\x98\\x62\\x00\\x6f\\xa7\\x85\\x83\\xe7\\x61\\x66\\x84\\x29\\x20\\x16\\x0e\\xb5\\x7f\\x0b\\x2a\\x6e\\xdf\\x19\\x3c\\x44\\xc5\\xee\\xac\\xf4\"},\n{{0x1d,0x13,0x9b,0x1a,0xd0,0xc3,0xaf,0x1d,0x5b,0x8b,0xe3,0x1a,0x4e,0xcb,0x87,0x8e,0xc6,0x67,0x73,0x6f,0x7d,0x4f,0xa8,0x36,0x3a,0x98,0x09,0xb6,0xd1,0xda,0xbf,0xe3,},{0x24,0x28,0xcf,0x1d,0xeb,0x20,0xfb,0xad,0x1f,0xdc,0x66,0x5d,0x82,0x5b,0x61,0x41,0x22,0xdf,0x10,0x1f,0xbe,0x14,0x73,0xa7,0x99,0x96,0xba,0xf6,0x96,0x74,0x34,0xb8,},{0xdd,0x64,0x5e,0x51,0xed,0xab,0x04,0xdb,0x31,0xe3,0x31,0x72,0xcf,0x27,0xac,0xee,0xed,0xcc,0x04,0x63,0xa9,0x63,0x91,0x4a,0x0e,0xac,0x8e,0xfd,0x5a,0x34,0x34,0x1f,0x6b,0xbc,0x52,0xe0,0x42,0xba,0xaf,0x3b,0x40,0xc8,0x9a,0x57,0xef,0xb6,0x45,0x74,0xe6,0x96,0x77,0xfc,0xe9,0x55,0x24,0x6c,0x1f,0xc0,0xf2,0x69,0xef,0x81,0x90,0x00,},\"\\x8d\\xf2\\xd2\\xdf\\x9b\\x98\\x4d\\xa8\\x44\\x33\\x48\\x6a\\x81\\x3c\\x98\\xc5\\x97\\x3a\\x69\\x6c\\x11\\x62\\x46\\x10\\xb2\\x3a\\xa4\\x38\\x08\\x34\\x64\\xf6\\x5a\\x76\\x79\\x66\\x15\\xb7\\x28\\xc2\\xed\\x4e\\x60\\x71\\x58\\x55\\xaf\\xc2\\x39\\x45\\x0d\\x5b\\xc0\\x91\\x1f\\xf2\\xa8\\x52\\x30\\x20\\x5c\\x6f\\x13\\x49\\xba\\x5b\\xd8\\x7e\\xa6\\xf7\\x20\\xdb\\x6b\\xa7\\x0b\\x77\\x42\\x17\\x88\\xe0\\xc6\\x54\\xae\\xbc\\x23\\x07\\x4c\\x5f\\x41\\xd2\\x29\\x07\\x72\\x14\\x0d\\x98\\x1a\\x6b\\xc4\\xfe\\x70\\x9a\\x26\\x8e\\x64\\x17\\x2a\\x02\\x6b\\x27\\x01\\x18\\xb4\\xdb\\x51\\xab\\x6a\\x13\\xc9\\x9b\\x06\\x31\\x86\\xd8\\xd5\\xb3\\x38\\xe9\\x77\\xed\\xdc\\x6b\\xb5\\xfd\\x7d\\xd5\\x7d\\x98\\x45\\xa3\\xc3\\xfe\\x76\\x17\\x7d\\x57\\x38\\xdc\\xa1\\x6a\\x8f\\x91\\x02\\x85\\x75\\x00\\x17\\x4f\\x23\\xff\\x4c\\x3b\\xf3\\xc8\\x53\\x6f\\x11\\x58\\x0e\\xf8\\x51\\x4a\\x40\\x9f\\x5b\\xbc\\x9c\\x02\\x96\\xf1\\x2e\\x34\\x78\\xd4\\x08\\x7f\\x95\\xef\\xaa\\x6c\\x63\\x60\\x71\\xd2\\x11\\x57\\xbf\\x11\\x77\\x4b\\xbf\\xe7\\x69\\x33\\x06\\xca\\x72\\x13\\xda\\x47\\x13\\xeb\\xaa\\xab\\x35\\x54\\xed\\xf0\\x80\\x11\\xa5\\xff\\x73\\xda\\x12\\x03\\x75\\xae\\xd1\\x96\\x28\\x67\\x0f\\x28\\xab\\x24\\xb6\\xf5\\xd5\\xa1\\xd5\\x70\\x48\\x0f\\x65\\xd3\\xc1\\x52\\xbf\\xf1\\xb4\\x7b\\xf0\\x66\\x69\\x29\\xcb\\x7c\\x99\\xd9\\x03\\x3f\\xaa\\xe8\\x53\\x4f\\xc3\\x5d\\xa7\\x30\\xb8\\x11\\xeb\\xcc\\x25\\xae\\x10\\xa1\\x95\\xaa\\xb1\\x2c\\x32\\x6a\\xa4\\x5b\\xf8\\x05\\xc6\\x2d\\xd4\\xcd\\x5f\\x86\\x86\\x23\\xc0\\x4a\\x8e\\x1c\\x6a\\xa7\\x2f\\x1e\\xa4\\x40\\x0c\\x60\\x86\\x7d\\xff\\x62\\x2f\\x31\\x64\\x34\\xf1\\xec\\x89\\x50\\x3c\\x6f\\x9f\\x65\\xc1\\x37\\xb4\\x94\\x4c\\xbc\\xb3\\x5f\\x08\\x6c\\x74\\xcc\\xea\\xfa\\x22\\x42\\xac\\xca\\x6f\\xfe\\x61\\x1c\\x4b\\x55\\x87\\xf5\\xb7\\x5f\\xfa\\xd3\\x49\\xf0\\x0b\\xf9\\x6e\\x4a\\x58\\x0a\\x87\\x5b\\x92\\x65\\x40\\x69\\xb6\\x2e\\xea\\xc0\\xbf\\x78\\xe5\\xae\\xdd\\x71\\x86\\x9e\\xe0\\x5b\\x9a\\x94\\xe1\\xc9\\x8e\\x35\\xa9\\x78\\x00\\xa4\\xa2\\x12\\x20\\xb0\\x39\\xcd\\x5e\\xbb\\xb7\\x56\\xd4\\x0b\\x40\\x42\\xe2\\xc8\\x4a\\x2a\\xe9\\x81\\x82\\x51\\x1d\\xae\\x8e\\xd3\\xb8\\x9f\\x4f\\xa0\\x0f\\xb8\\xed\\x94\\x63\\x16\\x45\\x97\\x10\\x05\\x2a\\xd4\\xc0\\x2f\\x63\\xdf\\x05\\xd3\\xbb\\x1a\\xce\\x33\\x67\\x21\\x51\\xbd\\xf5\\xda\\xb4\\x6c\\x7b\\x58\\x3d\\xb3\\x73\\x89\\x9d\\x4f\\x03\\x5b\\x6c\\x11\\x12\\x58\\xb4\\xe5\\xa9\\xe7\\x07\\xa1\\x1d\\x21\\x5e\\x44\\xe6\\x8e\\xf1\\xa6\\xf0\\x53\\x80\\x9a\\xa5\\x1b\\xd9\\x02\\xe1\\x3c\\xa9\\x9c\\x1b\\x1c\\xec\\xc8\\x3b\\x9c\\x23\\x5c\\x71\\x0e\\x79\\x7d\\x2b\\x1a\\x24\\x9b\\x2e\\xa0\\x79\\xb5\\xc1\\x67\\x4e\\xd7\\x16\\x9f\\x1b\\x6e\\x67\\xf1\\xac\\x77\\xf8\\x6b\\x74\\x32\\x98\\x96\\x93\\x35\\xa7\\x72\\x44\\x0f\\x7f\\xbf\\xa7\\x25\\x13\\x50\\x0d\\x84\\x16\\x61\\x14\\xa8\\xfd\\x54\\x13\\x94\\x64\\xd4\\x2b\\x99\\x55\\x30\\xd3\\x23\\x70\\xb6\\x9b\\xff\\xc7\\x58\\x9d\\x6d\\xcc\\x97\\xe0\\xbf\\x17\\x85\\x6c\\xc3\\xbf\\x41\\x64\\xdb\\xec\\xcc\\x8a\\x88\\x1d\\x41\\x4d\\x6a\\x62\\x02\\x92\\x76\\xc5\\xf8\\x13\\x7c\\x0b\\x3c\\x68\\xbc\\x8f\\x4b\\xd4\\xe7\\xcf\\xf6\\x5e\\xf2\"},\n{{0x4d,0x22,0xe3,0x31,0xe0,0xcf,0x6f,0x6a,0x27,0x2d,0xb4,0xd2,0x06,0x87,0xff,0xb0,0x59,0xf1,0x22,0x5d,0x81,0xe4,0x11,0x23,0xb8,0xc8,0x9b,0x07,0x4d,0xe7,0x6a,0x3b,},{0xb1,0xe4,0xcf,0xae,0xad,0xd6,0x7b,0x12,0xd7,0xb9,0xdb,0xfc,0x0f,0x88,0xed,0xd0,0x37,0x3f,0x9a,0x88,0xc7,0xfa,0x33,0xfb,0x7f,0x2b,0x1e,0x47,0x5e,0xcc,0xb6,0x1b,},{0xc3,0x66,0xb8,0x02,0xf6,0x82,0xfc,0xd7,0x05,0x25,0x26,0x4f,0xb1,0xa3,0xcb,0xcd,0x0e,0xe3,0x5e,0xcf,0xf5,0x97,0x7c,0x2a,0x55,0x4d,0xa9,0x39,0x22,0x9f,0x17,0x81,0x9a,0x96,0x1e,0xa7,0x4c,0x3d,0x7a,0x78,0x81,0xac,0x5c,0x1f,0xa1,0x6b,0xf9,0x84,0xd9,0x45,0x6a,0x13,0x88,0xd3,0x46,0x3c,0x44,0x94,0x42,0x9b,0x1d,0xc4,0x54,0x02,},\"\\x9c\\x8e\\x3f\\x5b\\x4d\\x70\\x40\\x30\\xe1\\xba\\x71\\xf0\\x2e\\xfc\\x4b\\x87\\xd6\\xff\\xfb\\x55\\xbc\\x3d\\x8d\\x03\\x81\\x8f\\x91\\x56\\x24\\xfc\\xf7\\x01\\xc5\\x4a\\xdf\\xaf\\xa2\\xb6\\x94\\xb8\\x77\\x51\\xcb\\x9f\\x69\\x91\\x8c\\x0f\\x05\\x0f\\x4c\\x10\\x5d\\x5c\\xcb\\x40\\x10\\x0b\\x28\\xdf\\xd4\\xf4\\x11\\xd5\\x91\\xc1\\x20\\x19\\x17\\x6a\\xc2\\x01\\x6b\\xfb\\xfd\\xf0\\xdd\\xf1\\x1d\\xb8\\xa7\\xe3\\x9a\\xa7\\xb9\\xe2\\x16\\xf6\\x67\\xc0\\xa1\\x5f\\xb9\\x77\\xea\\xa9\\xba\\x3b\\xc4\\x55\\xcc\\x58\\x94\\x5f\\x3e\\x94\\x4b\\x8a\\xc2\\xfb\\xf4\\xd2\\x4f\\xe7\\xe1\\xe6\\x19\\xcd\\xbe\\xee\\x3e\\x5e\\x12\\xa9\\xa5\\x27\\xd2\\x8f\\x5f\\xd7\\xcf\\xd9\\x22\\x0f\\x13\\x08\\xd8\\x97\\xb6\\xd4\\x31\\x4a\\x5a\\x01\\x87\\x86\\x4a\\x2d\\x62\\x1c\\xf1\\xb2\\x84\\x42\\x61\\x24\\x7b\\xf5\\x20\\xba\\xfa\\x9b\\xf2\\x26\\xe1\\x15\\x68\\x1e\\xcd\\x77\\x42\\x79\\x80\\xcd\\x12\\xb0\\x8c\\x35\\x9c\\xec\\xd1\\xde\\x3f\\x55\\x45\\xf8\\x07\\xf8\\x1e\\xd7\\x63\\x02\\xff\\xd6\\x47\\x7f\\x89\\xb9\\x58\\xcd\\xf1\\x29\\x54\\xcf\\x70\\xc1\\x42\\x53\\x29\\x93\\x83\\x16\\x47\\xea\\xca\\xb0\\xb4\\x80\\x7b\\xfd\\xad\\xb4\\x38\\x9d\\x7d\\xff\\x2c\\x4e\\xf0\\xef\\x5a\\x5c\\x61\\xd0\\xdf\\x76\\x2e\\x2e\\x90\\x80\\xa7\\x18\\x1c\\xec\\xd0\\x6a\\x53\\x19\\x9f\\x0d\\xfe\\xf7\\x02\\x62\\x7a\\xde\\xcf\\x5f\\xcd\\x9b\\x3e\\x68\\xc7\\x23\\x33\\x16\\x17\\x27\\xf8\\x71\\xc7\\xd1\\xc4\\x30\\x51\\xff\\x1c\\x92\\x1f\\xd5\\x3b\\x64\\x22\\x38\\xb9\\x78\\x80\\xd6\\x4e\\x25\\xfa\\xc5\\x12\\xab\\x95\\x4b\\xed\\xbc\\xa5\\x40\\xf5\\xb2\\x00\\x91\\xec\\x72\\xe6\\x7f\\x88\\x77\\x0a\\xfc\\x32\\xf2\\x12\\x5c\\xa0\\xda\\x4f\\xe8\\x7b\\x56\\xaa\\xc9\\x17\\x7f\\x1f\\x4f\\x67\\xc8\\x51\\x72\\x5c\\x5e\\x8a\\xfe\\x64\\xf6\\x64\\x79\\x98\\x33\\xfd\\x79\\x10\\x0b\\x77\\xea\\xd2\\x58\\x38\\x87\\x9f\\xff\\x47\\x47\\xaa\\x0d\\x56\\x72\\xec\\x0a\\x94\\x34\\x81\\x34\\xbd\\xbd\\x4b\\xb3\\x9b\\x0c\\x67\\xa0\\xcd\\x30\\x60\\x2e\\xdf\\x4f\\xec\\x6f\\x7a\\xf0\\xcc\\x2b\\xda\\xe1\\x26\\xce\\xa8\\x42\\xdf\\xaa\\x43\\x91\\xdc\\x5d\\xde\\xa9\\x38\\xe1\\x79\\x21\\x68\\x24\\x0c\\x2d\\x8b\\x25\\x35\\x2f\\x9f\\x3a\\x64\\x42\\x35\\xce\\x36\\xfe\\xfe\\xb6\\x99\\x2a\\xd8\\x8e\\x28\\x7a\\xd2\\xd8\\x5b\\xd8\\x50\\x39\\x6f\\xc2\\xe5\\x17\\xa1\\x52\\x09\\xf5\\x92\\x0a\\xc9\\x8c\\x53\\x2b\\x1f\\x4d\\x86\\x9b\\xeb\\x08\\xbb\\x03\\xcf\\x7c\\x91\\xaf\\x3f\\xfc\\xed\\x68\\xd5\\xfb\\xfe\\xf8\\x6f\\xf9\\x4e\\xce\\x6e\\x2e\\xad\\x34\\x84\\xce\\x08\\x0d\\xb1\\x7b\\xbe\\x40\\xf1\\xdb\\x43\\x2e\\xc1\\x65\\x0e\\xd2\\x4f\\xdd\\x25\\x0f\\x33\\x45\\x74\\x5c\\x9b\\x7b\\x91\\x98\\xc9\\x10\\x9a\\x37\\x26\\x1f\\xc5\\xec\\xbb\\xb1\\x2f\\x83\\xa0\\xe1\\x22\\x0a\\x18\\x67\\xd4\\x5f\\xdd\\xfe\\xa8\\x1d\\xcf\\x75\\xf4\\xec\\x7f\\xdb\\x52\\x50\\xe5\\x77\\x54\\xd6\\xde\\xa2\\x70\\xb6\\x28\\xa7\\x95\\x30\\xec\\x28\\xb6\\x19\\xbc\\xa9\\x49\\x3e\\x63\\x05\\xcf\\xc4\\x41\\x4c\\x1c\\x1d\\xe3\\x38\\x9e\\x89\\x01\\x97\\xc8\\x5f\\x28\\x40\\x4f\\x3f\\xa9\\x6a\\x1e\\x2f\\xd9\\x20\\x6b\\x47\\x2e\\x8a\\x0a\\x0d\\x32\\xaf\\x55\\x60\\x6b\\xb0\\x83\\xf7\\x6a\\x19\\xb8\\xea\\xe3\\x47\\x9a\\xe5\\x1d\\x98\\xa9\\x9a\\x62\"},\n{{0xa5,0x22,0x8f,0xf9,0xbb,0xb6,0xf2,0x32,0x32,0x7e,0xb8,0xd8,0x79,0xd7,0xf8,0xb2,0x77,0xca,0x72,0xba,0xe1,0xf9,0xa9,0xd0,0xe2,0x60,0xdd,0x90,0x57,0x1d,0xb4,0xf9,},{0xd8,0x2f,0x6a,0x69,0x74,0xf5,0x1c,0x88,0x08,0xd9,0xd6,0x17,0xf4,0xce,0xc2,0xd8,0xa3,0x7e,0xb1,0x1a,0x14,0x23,0x7c,0x9a,0xb9,0xcf,0x11,0xeb,0xc8,0x0f,0xf6,0xc0,},{0x97,0x65,0x0f,0xae,0x3f,0x59,0xca,0x76,0x47,0x7f,0x25,0x47,0x16,0x77,0x49,0xc5,0x83,0x02,0x48,0x88,0x32,0x25,0xe3,0x54,0xff,0x46,0xc7,0xe3,0x81,0x96,0x52,0x20,0xd9,0xbe,0xf2,0xc2,0x05,0x7c,0x7d,0x19,0x90,0xf0,0x8b,0xca,0x4c,0xfd,0xe8,0x77,0xff,0xf2,0xb4,0xaa,0x81,0x3d,0x9c,0x4b,0x84,0xfb,0x79,0xec,0xed,0x81,0xef,0x05,},\"\\x1d\\xf7\\xa6\\x83\\x5e\\x33\\x10\\x98\\x3e\\xe7\\xec\\x73\\x11\\x25\\xf5\\xb5\\xcf\\x11\\x7a\\xf0\\xe3\\x6b\\x36\\x85\\xbf\\x54\\xac\\xe1\\xc4\\x8c\\x46\\x30\\x05\\x60\\xa4\\x5e\\x9f\\x9b\\xdd\\x96\\xa0\\xbc\\x4d\\x14\\xe8\\x9d\\x4b\\x57\\x21\\xa2\\xca\\xff\\x66\\x18\\xb1\\x82\\xed\\xb1\\x20\\x2f\\x3d\\x0c\\x5d\\x11\\x8d\\x09\\xb6\\x18\\x12\\xc0\\x10\\xe8\\xb1\\x96\\x34\\x45\\x41\\xcd\\xee\\xfe\\x5f\\xd1\\xf9\\x61\\xc5\\xdd\\x75\\x45\\x95\\x55\\xab\\x72\\xef\\x2a\\xa7\\xa7\\x59\\xa4\\xf3\\xad\\x3c\\xae\\xd4\\x4f\\x4c\\x9a\\x8e\\xf9\\x5b\\x76\\xed\\x9a\\x99\\xb5\\x5d\\xd8\\xa2\\x60\\xba\\x08\\x01\\x0d\\x29\\xff\\x81\\x9f\\x2a\\xf3\\x51\\x3c\\x1a\\x64\\x0d\\x6c\\xcd\\xde\\x49\\x99\\x20\\x5f\\x9f\\xca\\x88\\x57\\x11\\x5d\\x8b\\x5d\\xb9\\xf7\\x0a\\x62\\xe5\\xee\\xa0\\xd5\\xaf\\x06\\x5d\\xe1\\x53\\xf2\\xed\\xed\\xee\\xc6\\x3e\\x15\\xc8\\xe0\\x9a\\x92\\x58\\x21\\x82\\xac\\x07\\xd8\\x1c\\xa6\\x3c\\xa4\\xaa\\x59\\x7a\\x22\\x20\\xe7\\x04\\x81\\x95\\x7d\\x41\\x52\\x64\\xe2\\x58\\xbc\\x26\\x3e\\x1c\\xc3\\x6e\\x53\\x47\\x8a\\xac\\x5c\\xa0\\x16\\x94\\xcc\\xb0\\x9b\\x4f\\xfd\\x84\\x73\\x99\\x72\\xc7\\xdc\\xcf\\x3d\\xef\\xea\\xfd\\xed\\xe1\\x62\\xab\\x6c\\x58\\xa1\\xdf\\x27\\x37\\x1e\\x3f\\x54\\x93\\x06\\x7f\\xc9\\xe2\\x06\\x7e\\x57\\x96\\x23\\xc0\\x09\\xfc\\x82\\x5e\\xef\\x0e\\x01\\x0f\\xd1\\xcc\\xf2\\xa8\\xd3\\xfb\\xbb\\x31\\x56\\xf9\\xdf\\xde\\x0c\\x7c\\xbb\\xaf\\x84\\x33\\x09\\x85\\x17\\x49\\x1b\\x78\\xdb\\x96\\x98\\x61\\x4e\\xa4\\x0e\\x0b\\x1e\\x6a\\x1e\\x36\\xb9\\x00\\x45\\x3a\\x16\\xea\\x27\\x6f\\x34\\x42\\xbb\\xd2\\x7a\\x7e\\xcb\\x98\\x15\\x11\\xf5\\xc9\\x20\\x9e\\xb0\\x96\\xe2\\x85\\x88\\xb6\\x5b\\x96\\xb5\\x01\\x88\\xc0\\x38\\x1f\\xf7\\x12\\xbc\\x06\\xb2\\xc6\\x55\\xcc\\xa0\\x75\\x1c\\x09\\x5d\\x80\\x16\\x25\\x15\\x85\\x85\\x1e\\x67\\x74\\x34\\xdc\\x3e\\xfd\\x08\\x7a\\x12\\x68\\x0f\\xc2\\x2e\\x5b\\x83\\x10\\xa1\\x0e\\x32\\xca\\xac\\x9b\\x71\\xc8\\x76\\xee\\xd3\\x1e\\xf0\\x9f\\x7f\\xa0\\x12\\xba\\x08\\xdf\\xd2\\xad\\x68\\xc1\\xe1\\x47\\xf5\\x05\\x98\\xe5\\x50\\x46\\x7e\\xf9\\x9f\\x29\\x5a\\x31\\x8f\\xaa\\x50\\x7e\\xbe\\x77\\x6c\\xe5\\x5c\\x4d\\xa1\\x64\\x32\\x3c\\x30\\xa5\\xe7\\x2d\\xbe\\x02\\x7c\\x3c\\xcf\\x96\\xc7\\x01\\x97\\xa6\\xfb\\x1b\\x74\\xaf\\x13\\x3a\\x8b\\xe2\\xb0\\x3c\\x1b\\x99\\xfd\\x25\\xb3\\xce\\xd5\\x1f\\xe3\\x88\\x20\\x21\\xa3\\xaf\\xd9\\x22\\x9f\\x64\\x1b\\xc6\\xca\\xd4\\xe1\\xd3\\xcb\\x6e\\xd9\\xb6\\xb6\\x8a\\x25\\xf1\\xe1\\x39\\x72\\x89\\x98\\x1f\\x78\\x92\\x4b\\xff\\x24\\xc8\\xde\\xe6\\xa1\\x8a\\x04\\x21\\xfa\\x32\\xae\\x3a\\xb6\\x0a\\x0d\\x93\\x3a\\x6a\\xf4\\xff\\x70\\x48\\x74\\xb0\\x9b\\x07\\x39\\xe2\\xf2\\x9d\\x8f\\x25\\x2d\\x79\\x05\\x5f\\x89\\xd3\\xbf\\xf1\\x0a\\x22\\xc5\\x4a\\xc3\\xd8\\xaf\\xee\\xce\\x81\\x83\\x53\\xa6\\xab\\xe2\\xb7\\xfb\\x8e\\x8e\\x0d\\xa5\\xb7\\xac\\x1c\\xfc\\x98\\x5d\\xf9\\x75\\x80\\xb1\\x82\\x11\\xa4\\xe3\\xed\\xff\\x95\\xaf\\xdd\\xa0\\x61\\x54\\x7d\\x3a\\xe0\\x40\\x6d\\x32\\x86\\xcd\\x30\\x5b\\xdf\\xd2\\xc3\\xab\\xf8\\xf7\\x4a\\xf9\\xa0\\x34\\x20\\xe5\\xb0\\x3f\\x82\\x5e\\x9c\\x53\\x90\\x7e\\x13\\xa5\\x81\\x21\\x74\\xbe\\x42\\x89\\x86\\x45\\x14\\x9d\"},\n{{0xc0,0x4d,0xc0,0x9f,0x11,0x9d,0x67,0x0f,0xb1,0xea,0xe0,0x13,0x6f,0xcc,0x06,0x08,0x5f,0x29,0x0f,0x4a,0xd1,0xaa,0x1f,0xfc,0x9c,0x16,0x0e,0xa5,0xcf,0x47,0xf0,0x9d,},{0xff,0x49,0x8c,0xe8,0xc9,0xdb,0x78,0x67,0xf6,0xd0,0x27,0x64,0x52,0xa4,0x66,0x72,0x48,0x87,0xe6,0x17,0x2f,0x66,0x81,0x67,0x1b,0x8a,0xe0,0x35,0xf5,0x86,0x5e,0xa3,},{0x4b,0xd1,0x9f,0x3d,0x9c,0x51,0x16,0xec,0x6a,0xe0,0x02,0x4d,0x0f,0x24,0x6d,0x2c,0xe2,0x50,0xd9,0xe0,0x63,0x4a,0x23,0x2b,0xa0,0x6f,0xd3,0x56,0x6a,0xed,0x55,0xcb,0xe5,0x9f,0x12,0x33,0x2c,0xba,0xd6,0x5d,0x43,0x49,0xa9,0xd2,0x2e,0x7d,0x6e,0x46,0xd2,0xfb,0xdc,0x71,0xd5,0xc8,0xf9,0xda,0x15,0xdf,0xbf,0x17,0xba,0x22,0x51,0x07,},\"\\x1e\\x42\\x29\\x7f\\x8a\\xee\\xf2\\x9a\\x84\\x2e\\x0e\\x21\\xf5\\xdb\\xae\\x06\\x8e\\x2c\\x9d\\xda\\xa6\\xfd\\x34\\x8e\\x48\\x88\\x1f\\x0d\\x42\\xc5\\x0b\\xf0\\xec\\xf1\\x70\\x6b\\x94\\xa5\\xd1\\x98\\x17\\xca\\x02\\xd8\\x3e\\x9a\\xb2\\xf9\\x9d\\x8b\\xfa\\xaa\\x5c\\x85\\xad\\x39\\xa1\\x50\\xb2\\x25\\xad\\x3e\\xaf\\xa0\\x67\\x81\\x5b\\x74\\x67\\x2f\\xe0\\x26\\xc3\\xcc\\xc6\\x77\\x25\\x54\\x40\\xb6\\x84\\xa7\\x6e\\x12\\x8c\\xa2\\xcc\\xc4\\x29\\xf1\\x52\\x57\\x7d\\x25\\xb6\\x9f\\x40\\xdb\\x58\\x2d\\x49\\x47\\x9a\\xfa\\xe6\\x80\\x71\\x2d\\xc0\\xfd\\x1f\\xe1\\x41\\x88\\x39\\x68\\x7c\\xa6\\x0c\\xdd\\xe9\\x74\\x14\\x04\\x62\\xf9\\x61\\x48\\x29\\x5d\\xf1\\xce\\x43\\xa9\\x77\\x35\\x1c\\x77\\xf2\\xf0\\xb0\\x9a\\x6b\\x26\\xd6\\xfe\\x96\\x5f\\xce\\xae\\x17\\xd7\\xb8\\x62\\x03\\x71\\x40\\x24\\x28\\x54\\x4f\\xdf\\x91\\x69\\x0b\\x44\\xe9\\xaf\\xc2\\xe9\\x08\\x8c\\x83\\xca\\x48\\xdc\\x85\\x76\\xf6\\x28\\x72\\x47\\x98\\xdc\\x90\\x32\\x31\\x74\\xc4\\x49\\x96\\x59\\x65\\x02\\xa3\\x5d\\xf8\\xb9\\x82\\xc5\\x70\\xa6\\xcb\\x51\\xb9\\xa1\\x97\\xd4\\x31\\xaf\\x33\\xf0\\x2b\\x80\\x01\\x15\\x67\\xfe\\x50\\xcf\\x45\\xac\\x11\\x1b\\x3d\\x55\\x6f\\x8c\\x8c\\xe5\\xae\\x8c\\x99\\x72\\xf2\\xa9\\x93\\x6b\\x1a\\x01\\x2b\\x9c\\x33\\x9e\\x30\\xc9\\x73\\x12\\xb6\\x5e\\xa5\\x9c\\x10\\x0f\\x79\\xd7\\x95\\xb8\\xa2\\x4b\\x31\\xa0\\xa9\\x7d\\xc2\\x5c\\xce\\xd6\\xb8\\xff\\x5a\\xe1\\x45\\x33\\x9a\\x04\\x8c\\xa1\\x2a\\x57\\x90\\x17\\xfa\\xe8\\xd5\\xcb\\xcb\\x61\\xd5\\x2e\\x31\\x4d\\xd7\\xc2\\xe7\\x20\\x10\\xc4\\x72\\x17\\xb1\\xd0\\x68\\x78\\xbf\\x28\\x18\\xca\\x18\\x8e\\x8e\\x30\\x79\\x60\\xc1\\x68\\x9d\\x7d\\xfc\\x02\\x02\\x97\\x3c\\xd2\\x9f\\x2f\\x7b\\xa7\\x43\\x46\\x9e\\x68\\x5e\\x0e\\x70\\x4b\\x04\\xba\\xca\\x4f\\xab\\x54\\x88\\x44\\x8a\\x92\\x2e\\xab\\xf4\\x0b\\xe5\\x81\\xc1\\x99\\x4d\\x74\\xd1\\x3a\\x36\\x6c\\xe8\\x57\\xfb\\x40\\xa6\\xe0\\x5d\\xa8\\x55\\x36\\x94\\x17\\x2c\\xc3\\xfd\\x28\\x06\\x2f\\x53\\x82\\x50\\xaa\\x8c\\x11\\xf6\\x81\\x39\\xe7\\x9c\\xd1\\x19\\x1b\\xa3\\x31\\x4b\\x5c\\xea\\x08\\x64\\x43\\x7e\\xd2\\xe4\\xb6\\xfb\\xd7\\x5b\\x9d\\xed\\x09\\x87\\xb4\\x1c\\x20\\x2a\\x58\\xec\\x02\\x54\\xd9\\xd3\\x71\\xa7\\x95\\xf1\\xdb\\xec\\xdd\\xac\\x11\\x2b\\xe8\\xd0\\x9e\\x2d\\x7b\\x9c\\xa5\\x75\\x2f\\x40\\x6c\\xff\\xb9\\x11\\xca\\x36\\x45\\x0b\\xc0\\x5f\\x1e\\xc1\\xca\\x3c\\xa8\\xd3\\x51\\x24\\xd1\\x28\\x6c\\x55\\xf1\\x0f\\x61\\x33\\x4e\\x46\\xec\\xe4\\x18\\x3b\\x92\\x21\\x9a\\x9d\\xcd\\x0e\\x5e\\x78\\xef\\x2a\\x76\\xcf\\xe9\\xa9\\xab\\x37\\x95\\xdf\\xdc\\xb4\\x4f\\x63\\xd4\\x5f\\x5f\\x48\\xff\\xb4\\x15\\x61\\x33\\xad\\x2e\\x99\\x50\\x88\\x4c\\x5b\\xbd\\x2c\\x1c\\xb8\\x72\\x9e\\x40\\xa8\\x78\\x7f\\x78\\x49\\x69\\xfa\\x88\\x0c\\x07\\xff\\xcc\\x97\\xd5\\xc0\\xd2\\xd4\\x88\\x08\\x5e\\x91\\x16\\xd7\\x10\\x7c\\xd5\\xdb\\x16\\xce\\xcc\\xde\\xad\\x55\\x02\\x5e\\xea\\x2e\\xde\\xe9\\x3c\\x1b\\x10\\x64\\x27\\x61\\x8e\\xe0\\x9d\\xc3\\xda\\xd1\\xe0\\x56\\x76\\xa2\\x36\\x80\\x69\\xc8\\x04\\x5c\\x3e\\xbc\\x6c\\x67\\xaf\\xa5\\x2d\\x59\\x39\\x82\\x48\\xef\\xcf\\x15\\xe9\\x04\\xc7\\x14\\x23\\x04\\xff\\x61\\x97\\x1f\\x4d\\x9b\\xf6\\x46\\x0c\\x1d\\x64\\x17\"},\n{{0x67,0x91,0xbd,0x74,0xd3,0xb4,0x62,0x0e,0xf5,0xf1,0xff,0x56,0x40,0x64,0x32,0xc2,0x6a,0xb6,0x46,0xf6,0xd5,0xe9,0xdd,0xa6,0x84,0x2e,0xd6,0x90,0x52,0x27,0x53,0x92,},{0xda,0x99,0x15,0xa7,0x55,0x2f,0x11,0x0f,0xae,0xa1,0x2d,0x47,0x92,0x0a,0x09,0x60,0x14,0x43,0xd4,0x00,0x0a,0x9c,0x7e,0x21,0x8d,0x5b,0xa7,0x2b,0x74,0x98,0x9f,0xa6,},{0xb1,0xe8,0xd4,0x81,0x06,0x5b,0xd5,0x12,0x1b,0xb3,0xbf,0x56,0x96,0x00,0xbc,0xc2,0x6d,0xf4,0x0c,0x49,0x9f,0xba,0xa9,0x54,0xb3,0x9a,0x61,0x9d,0xc4,0x0b,0x95,0x90,0xc3,0x17,0x56,0xb8,0xb6,0x3f,0x86,0x01,0x51,0x69,0x4b,0x95,0x76,0x5d,0x69,0x7b,0x2e,0x1a,0xde,0x08,0x06,0xe9,0x2a,0x06,0xc4,0xa5,0x59,0xe9,0x0f,0xcf,0xa5,0x06,},\"\\x36\\xa2\\x0e\\x66\\xbb\\x29\\x15\\x51\\x61\\xad\\x85\\xee\\xfe\\x89\\x3b\\x53\\xac\\x5a\\xde\\x16\\x5f\\x08\\x9a\\x77\\x19\\x0b\\x0c\\x23\\x9d\\xec\\x8a\\x20\\x16\\x85\\xb0\\x76\\xb4\\xde\\xd4\\xa1\\x0a\\xa4\\x59\\xb9\\x80\\xa8\\xcc\\xa4\\x7d\\x5f\\x8d\\xe4\\xd2\\xa6\\x62\\xe4\\x46\\xd5\\xf7\\xfb\\x70\\xed\\x9b\\xe0\\x5d\\xb1\\xcc\\xea\\xdd\\x13\\x0b\\x33\\x46\\xd9\\x40\\x9f\\x9d\\x6e\\xf5\\x28\\x24\\xc7\\x64\\xac\\x6f\\xb1\\xcd\\x15\\x6d\\xbd\\x6a\\x47\\x3a\\xe7\\x22\\xd0\\xeb\\xb2\\x56\\x38\\xc5\\x12\\x65\\xa2\\x2f\\xeb\\xbb\\x14\\x96\\x7d\\x6d\\xd8\\x25\\x3c\\x1d\\x03\\x88\\x95\\xc6\\x73\\x7f\\x06\\x7c\\x8f\\x73\\xc3\\xc1\\xcb\\xe6\\xcd\\xa4\\x36\\x96\\x32\\xd7\\xf4\\xc9\\xac\\xeb\\xe8\\x7d\\x05\\x71\\xc8\\x1a\\x58\\xcf\\xd7\\x2c\\xce\\x4a\\x5c\\xf5\\x3a\\x1e\\x75\\x25\\x9f\\x4c\\x99\\x3e\\x67\\xef\\xc8\\xd9\\xc3\\x57\\x6c\\x43\\xaf\\x04\\xa5\\xca\\xf3\\x3d\\x85\\x6f\\x7f\\x27\\x55\\xd3\\xa9\\x75\\xab\\x2b\\x68\\x5c\\x6f\\x65\\x68\\x0c\\xba\\x9a\\xc8\\x79\\xf3\\xa8\\xc9\\xa4\\x76\\x5b\\x87\\x9c\\x0a\\xde\\x1e\\x4b\\xd0\\xd4\\xa7\\x0b\\xb6\\xf9\\x2b\\x24\\xd4\\x29\\xdc\\x74\\x6c\\xc7\\x8f\\x84\\x81\\x1f\\x07\\x6f\\x32\\xc6\\x1e\\x35\\x85\\xcc\\x8a\\xad\\xe9\\xb0\\xca\\x15\\x22\\x4b\\xfb\\xfe\\x18\\xbe\\x10\\xa3\\x36\\x43\\x60\\x0f\\x66\\x12\\xbf\\x01\\x3f\\x0e\\xfc\\xca\\x83\\x72\\x46\\xa0\\xee\\x5b\\x03\\xc0\\x2f\\x15\\x73\\x62\\x4c\\x4a\\x44\\xa9\\x0f\\x9e\\x42\\x3d\\x4e\\x56\\x06\\x1a\\x71\\xd0\\x14\\x4f\\x5a\\x88\\x7a\\x8c\\xd4\\xa9\\xd6\\xf2\\x47\\x90\\x4e\\x26\\x79\\x59\\x51\\x95\\x9d\\xa1\\x21\\xc8\\x3c\\x6c\\x94\\x1e\\x2b\\x6b\\x9a\\xb7\\x62\\x09\\xff\\xe9\\x17\\x85\\x91\\xea\\xd6\\x82\\x30\\xb9\\x4a\\xe9\\x7d\\xf5\\x8f\\x9f\\x17\\x24\\x28\\xc9\\x50\\x67\\x59\\x8a\\xc5\\x82\\xff\\xb9\\x50\\x84\\x0d\\x82\\x66\\x30\\xc4\\x62\\x5f\\x5d\\xea\\xdd\\xec\\x13\\x05\\x20\\x3b\\x4d\\xb6\\xb9\\x45\\xf9\\x91\\xed\\x7c\\xd3\\xd6\\xfa\\xbc\\xa5\\x1e\\x21\\x66\\xad\\xad\\x0a\\xad\\x51\\x17\\x33\\x6d\\x52\\xd5\\x94\\x22\\xf0\\x13\\x5c\\x8f\\xa8\\xcd\\xd0\\x88\\x4b\\xe7\\x35\\x86\\xbf\\x28\\x4e\\x5d\\xdd\\xdb\\xcb\\x95\\xb4\\x11\\xf9\\x85\\x68\\x52\\x6f\\xbe\\x71\\xa5\\x59\\x2b\\x56\\xad\\x5a\\x73\\x45\\xf2\\x87\\x4d\\xb1\\xd5\\x7b\\xea\\xb4\\x3e\\x8c\\xc6\\x95\\x47\\x52\\x06\\x29\\xf0\\xee\\x76\\xdb\\xf4\\x32\\xa3\\x76\\xfa\\xd2\\x8b\\xfc\\x77\\xe1\\x4d\\x84\\x0f\\x0c\\x02\\xd4\\x78\\xf1\\xe2\\x33\\x7c\\x23\\xb8\\x9e\\x73\\xe5\\x27\\x91\\x08\\xb5\\x60\\x9b\\x18\\xe8\\x0d\\xb0\\xde\\x11\\xcf\\xa9\\x4e\\xcf\\x72\\x39\\xbc\\xff\\x59\\xc5\\x41\\x18\\xe4\\xed\\xe4\\xfb\\xfc\\x08\\x23\\xae\\x54\\x60\\x16\\xf7\\x74\\xc5\\x21\\x98\\xa9\\x63\\xb5\\x54\\x5a\\x34\\x89\\xb8\\x9d\\xf7\\x62\\x6f\\xd1\\x1e\\xd4\\x65\\x8d\\x71\\x5a\\x46\\x57\\x99\\x40\\x35\\xd4\\x03\\xb3\\x37\\x0d\\x14\\xee\\xd9\\x71\\x8d\\x59\\x8d\\xb6\\x75\\xf0\\x42\\x59\\x2f\\xea\\x89\\x05\\x65\\x44\\xb3\\x2e\\x5b\\x9c\\x80\\x62\\x82\\x8a\\xaa\\x3c\\xf5\\x9c\\xb4\\x76\\xad\\x36\\xdb\\x1d\\xaa\\x24\\x82\\x22\\x7a\\x9b\\x7a\\xfb\\xc1\\x53\\xce\\x93\\x25\\x3d\\x1b\\x39\\xda\\x95\\xeb\\x96\\xf8\\x31\\x28\\xff\\x25\\x54\\xa5\\x47\\xe3\\x4e\\xea\\x4a\\x00\\x00\"},\n{{0x23,0x4c,0xe4,0xd3,0x9b,0x5e,0xba,0xbe,0x9a,0x2c,0x1e,0x71,0x97,0x0d,0x71,0x81,0x38,0xdc,0xb5,0x30,0xcf,0xd2,0x96,0x02,0x34,0x27,0xd8,0x92,0xbf,0x88,0xf8,0xa4,},{0xcb,0x73,0x93,0x0d,0xb4,0x21,0xf6,0xd2,0x45,0x36,0x83,0x7b,0xd0,0xbf,0xf6,0xfa,0x75,0xbb,0xd1,0x41,0xc9,0x8a,0x40,0x5d,0x42,0x44,0xa3,0xc4,0x24,0x55,0x07,0x79,},{0xf6,0xd0,0x60,0xed,0x7d,0x18,0x27,0x3f,0x18,0xf7,0xa6,0x9c,0xd1,0xd8,0x12,0x6e,0x47,0x8e,0x88,0xa1,0xd7,0x29,0x4f,0xf6,0x04,0x08,0x46,0xd4,0x61,0x07,0xc3,0xe4,0x1a,0x42,0x3b,0xab,0xb2,0x41,0x71,0x39,0xfe,0x58,0x7d,0x29,0x10,0x27,0x1a,0x35,0x7f,0xe5,0xbf,0x57,0xc9,0x2e,0xe3,0xa7,0xb7,0x75,0x33,0x72,0x9d,0x0a,0xc2,0x0d,},\"\\x77\\x73\\x0c\\xf8\\xc8\\xf9\\x6b\\x91\\x87\\x90\\x2a\\xcf\\xf9\\xff\\x0b\\x21\\x74\\x6c\\xca\\xf0\\xa3\\x82\\xa7\\xb3\\x43\\xd1\\xc7\\x20\\x27\\xae\\x3c\\x31\\x68\\xa7\\x3a\\x6b\\x8f\\x49\\xbc\\x87\\x98\\x14\\x1e\\x15\\xc2\\x73\\x2b\\x6a\\x6b\\x3f\\x75\\x7f\\x8a\\x8e\\x86\\xc7\\xa4\\xba\\xcb\\x39\\x55\\x1c\\x54\\x87\\x4d\\x6b\\xf7\\x16\\x89\\x7e\\xe4\\xaf\\x13\\x25\\x3a\\xa5\\xbb\\x79\\xa1\\x92\\x10\\x4f\\x44\\xdc\\xb3\\xde\\x96\\x07\\x45\\xa8\\xe6\\xaa\\x98\\x80\\x52\\x4a\\x62\\x9f\\xb5\\x10\\xa4\\xce\\x4c\\xbd\\xa7\\xe2\\x95\\x7d\\xff\\x1d\\x62\\xe7\\x05\\x60\\x6a\\x2c\\xc8\\x4f\\x91\\x85\\x0b\\xea\\xac\\x5e\\x58\\x46\\xe1\\x42\\x0b\\xc9\\x1d\\xcd\\xd2\\x42\\x7b\\x69\\xcf\\xa4\\x6a\\xe3\\x8a\\x4f\\xef\\x41\\x46\\xea\\xe3\\x5f\\x9c\\x22\\xe9\\x67\\xcb\\x14\\xa1\\xaf\\x9c\\xab\\xf8\\x3b\\x18\\x04\\x65\\xbe\\xd6\\xef\\x2c\\xda\\x38\\x2a\\x84\\xd9\\x99\\x4a\\xad\\x65\\x5d\\x89\\x52\\xe0\\xfb\\xb0\\xf9\\x6f\\xc8\\x08\\x9f\\x2e\\x74\\x89\\x49\\x7f\\xac\\xdc\\xd6\\x56\\xa8\\xa4\\x51\\xb9\\x28\\xc1\\x1e\\x7a\\x40\\x75\\x07\\x2a\\xaf\\xbf\\x17\\xd8\\xf1\\x05\\x4c\\x91\\x96\\x28\\x8d\\xed\\x3a\\xe2\\x1f\\x9a\\xfd\\x58\\x10\\xa1\\x00\\xd8\\xe4\\xd8\\x4c\\x4a\\x35\\xa9\\x8b\\x30\\xd3\\xe1\\x85\\x24\\x43\\x8d\\xd4\\x40\\x2d\\xfd\\x8e\\x76\\x75\\xf0\\x9d\\x08\\x0c\\xd9\\x15\\xf1\\x4a\\xf4\\x37\\x2f\\x7c\\xe5\\x83\\x84\\x97\\x2d\\x5d\\x11\\x10\\x79\\x65\\x1b\\x2a\\xcf\\x39\\xd2\\xa1\\x67\\xc6\\xa0\\x0b\\x2b\\x17\\xce\\x0b\\x26\\x87\\x91\\xbd\\x2b\\xe5\\x17\\x8f\\xe0\\xf8\\x2d\\x64\\xda\\xcd\\xde\\x37\\x7a\\x1e\\x8b\\xe9\\xe7\\xd8\\xdf\\xc8\\x2b\\x08\\x64\\x45\\x37\\xbd\\xc8\\x70\\xc5\\x81\\x92\\x86\\xfd\\x51\\xf6\\x79\\x2d\\xc5\\xf6\\x7b\\x54\\xbe\\x33\\x6d\\x44\\xd5\\x4f\\xeb\\xf8\\x1b\\x8d\\xf8\\xde\\xc5\\xd8\\x68\\x6d\\xb1\\x2f\\x16\\x4d\\x0e\\x8f\\xf1\\xaa\\x2c\\x16\\xba\\xcc\\x98\\x06\\x01\\x0e\\xc8\\xe9\\x11\\x96\\x59\\x7e\\xf0\\x6a\\x4c\\xf1\\x70\\x7d\\xef\\x50\\x67\\xa0\\x48\\x89\\xd8\\xe4\\x8a\\x9b\\xc2\\xc0\\xbe\\xf6\\x64\\xf5\\xac\\xd1\\xb4\\xf5\\xbc\\x2d\\xa7\\xda\\x43\\xdc\\xb5\\xf9\\x63\\x24\\x5b\\xa5\\x52\\xfd\\x49\\x30\\x01\\xd8\\x70\\xa9\\x51\\x7a\\x17\\x9c\\x2f\\x0d\\xe8\\x5b\\xe0\\xc6\\x82\\xd0\\x57\\x48\\x8e\\x35\\xc7\\x81\\x6f\\xf4\\xba\\x52\\x9a\\xef\\xd7\\xc6\\x60\\x91\\xf2\\x06\\xf5\\xf4\\xd7\\x5c\\xac\\x8b\\xd2\\x09\\xec\\x2f\\xa5\\x5b\\xe7\\x4a\\xf2\\x31\\xe2\\xf3\\x89\\xdc\\xc2\\xd6\\x68\\xbf\\x69\\x5e\\xd2\\x67\\xc3\\x59\\x4b\\xad\\x9e\\xfc\\x00\\x21\\x7c\\x7a\\x0e\\x9e\\x7b\\x6a\\x56\\xa3\\x30\\x79\\xa3\\x0e\\x73\\xc3\\x73\\x3f\\x2d\\x24\\xef\\xec\\xdd\\xe8\\x7f\\x72\\xf9\\x48\\xd2\\x77\\xd6\\xb6\\xd5\\xb0\\x35\\xb4\\xc5\\x31\\x80\\xd2\\x3d\\x66\\xcc\\x0f\\xf1\\x7c\\x15\\xdd\\x46\\x85\\x85\\xe3\\x89\\xd9\\x1a\\x4c\\x97\\xfd\\x80\\x11\\x0b\\x21\\x8a\\x0b\\xf7\\xa5\\xe0\\x35\\x3f\\x46\\x09\\xd2\\xcf\\x01\\x8a\\x06\\x55\\x71\\x00\\x1c\\x78\\x88\\x55\\x5e\\xed\\xbd\\x36\\x22\\xc3\\xb1\\x76\\x9c\\xd1\\x3f\\x33\\x37\\x47\\x72\\xaa\\x6c\\x8a\\x8f\\x58\\x81\\x02\\x01\\x7d\\x4e\\xe4\\xe5\\x0d\\xcb\\xbd\\xb1\\xd6\\x10\\xc3\\x26\\x70\\x93\\x4a\\x6d\\x9e\\x6d\\x9b\\x78\\x4b\\xbf\\xe7\\x18\\x62\\xbb\\x38\"},\n{{0x10,0x3d,0x11,0x8c,0x7d,0xd6,0x5d,0x07,0xe8,0xd5,0x58,0x2e,0x45,0x04,0x2a,0x75,0x79,0x24,0x17,0xc6,0x92,0x00,0x1e,0xe6,0xbd,0x9a,0x92,0x7b,0x2b,0x3d,0x90,0x16,},{0xb4,0x5c,0xc9,0x45,0x14,0xa6,0xad,0x67,0x24,0x96,0xcd,0x4e,0xb9,0xfd,0xaf,0xc1,0xd4,0xa1,0x67,0x07,0x2c,0x68,0x74,0xdc,0x8f,0xf1,0x6d,0x76,0x1f,0xb6,0x69,0x86,},{0x2f,0xaf,0xc1,0x3c,0x43,0xaf,0xe5,0x05,0x43,0x72,0xb9,0x23,0xd2,0x4f,0x29,0x2b,0x28,0x3a,0xfc,0xa3,0xac,0xa3,0xb3,0xe4,0x32,0x38,0x06,0x84,0x96,0x17,0x13,0xc8,0xd2,0x3e,0x86,0xb3,0x58,0x04,0x95,0xdf,0xba,0xe4,0x24,0xb7,0x67,0xe4,0x79,0x5a,0x0f,0x92,0x2f,0x71,0xb5,0x0f,0x5d,0x7a,0x36,0x9a,0xb8,0xc6,0xe8,0x80,0x42,0x0c,},\"\\x5a\\x8e\\xe0\\x79\\x18\\x6b\\x51\\xcf\\x46\\x29\\x83\\x4d\\xe0\\xc6\\xbd\\x73\\x34\\x85\\x50\\x39\\xa7\\x63\\x1d\\x68\\x87\\x65\\x2a\\x77\\x28\\x99\\x59\\x72\\xe3\\x62\\xc1\\xc4\\x09\\xf0\\x84\\xf5\\xaa\\xf2\\x98\\x6a\\xe3\\xf5\\x36\\xbe\\x00\\x70\\xc4\\xba\\xf4\\x59\\xef\\x60\\xa0\\x15\\xef\\x9d\\x70\\xdf\\xa3\\xea\\x96\\x71\\x1c\\xbb\\x18\\xe9\\x2a\\xf5\\x0c\\x52\\x7d\\x7e\\xd4\\x57\\x87\\x7a\\x07\\xab\\x83\\x72\\x15\\x18\\xc8\\x9f\\x7a\\x86\\x41\\x91\\xb1\\xe9\\x74\\x33\\xb7\\xc6\\xcd\\x63\\x4a\\x83\\x2e\\x19\\x89\\x1e\\x76\\xc6\\x21\\x22\\xa4\\x9d\\xbf\\xfd\\x83\\x49\\x8a\\xa4\\x16\\xac\\xcc\\xb7\\x73\\x7f\\xe7\\x5f\\x4f\\xb2\\xc3\\x53\\x28\\xe6\\xf6\\xec\\xec\\xaa\\xa4\\x2e\\x43\\xdb\\xa5\\xbc\\x96\\x89\\x67\\x3d\\xab\\x96\\xf0\\xbe\\xfa\\x3c\\x83\\xeb\\x41\\xd4\\xd8\\x87\\xb3\\xa1\\x17\\xd0\\x55\\xe3\\x0b\\xb8\\x7f\\xbe\\x7c\\x71\\x94\\x72\\xf6\\xc7\\xa4\\xcc\\x45\\xf6\\x28\\xf5\\xfa\\xdd\\xc4\\x8c\\xa3\\x44\\xf7\\x7b\\x73\\x3c\\x0e\\x3b\\x9f\\x50\\x79\\xdb\\xd0\\x7a\\xf3\\xa3\\x84\\x7a\\xf1\\x41\\x71\\x9c\\xca\\x2f\\x6a\\x76\\x65\\x52\\xb4\\x5d\\x0f\\xdc\\xdb\\x98\\x68\\xf2\\xc7\\x62\\xb6\\xd4\\x93\\x3b\\xa1\\x08\\x36\\xf9\\x5b\\xff\\x71\\xcb\\x88\\x04\\x00\\x24\\xc9\\x05\\x34\\xc4\\xd7\\xa9\\x5a\\x23\\x03\\xb0\\x4c\\x29\\x61\\x01\\x2a\\xf5\\x8b\\xc7\\x84\\xa9\\x63\\x27\\xbb\\xfe\\xd0\\x39\\xd0\\x80\\x2a\\x05\\x26\\x2d\\x8e\\x66\\x3b\\x78\\x50\\x8e\\x92\\x50\\x8b\\xc1\\xf2\\xea\\x2b\\x9b\\xe7\\x58\\x0b\\xde\\x10\\xa4\\xd6\\x63\\xd0\\xd2\\x5b\\x0e\\x97\\x3b\\x8c\\x5d\\xed\\x59\\xde\\xbf\\x19\\xbb\\x04\\x4a\\xff\\x1c\\x60\\xc7\\x0e\\xa1\\xae\\xfe\\x85\\xf6\\xd1\\x5c\\x2c\\x1b\\x84\\x75\\x3b\\x59\\x57\\x6a\\x49\\x47\\x3d\\x65\\xaf\\x3e\\xd9\\x41\\xa3\\xd5\\x14\\xb5\\xc4\\x52\\x2c\\x14\\x1b\\xdb\\xee\\xd9\\xcb\\x33\\x96\\x95\\xb2\\xe0\\x2d\\xc0\\x70\\x00\\x86\\x7f\\x1b\\xf8\\xed\\x8c\\xfd\\x3b\\x1a\\xfe\\x68\\x8f\\xbc\\xa8\\x0e\\x2f\\x9b\\xa5\\xc0\\xb1\\x88\\xa1\\x9a\\xda\\xff\\x66\\x86\\xca\\x0f\\xf0\\xed\\xd4\\x44\\x66\\x12\\x91\\xfa\\x27\\xca\\x1f\\xc5\\x29\\x42\\x9a\\x5d\\x8f\\xf7\\x9e\\xd2\\x02\\x7c\\x60\\xff\\xe3\\xb2\\xc0\\x3f\\xb8\\xa6\\x6a\\x39\\x85\\x41\\x7b\\xa4\\xac\\xe7\\xd1\\x4f\\xd0\\xe2\\x37\\x1e\\xdf\\x5d\\x71\\xbc\\x02\\xb9\\x05\\x27\\x67\\xc7\\xf7\\x2c\\x4e\\x6f\\x3f\\x30\\xe0\\x63\\x82\\x76\\xb9\\xc4\\x20\\xaa\\x43\\x33\\x09\\x5d\\x31\\x31\\x30\\x33\\x09\\x05\\x82\\xe3\\xac\\x4d\\x9f\\xd3\\x20\\x31\\x20\\xba\\x25\\x14\\x97\\x3a\\xb9\\xd1\\xc7\\xfc\\x42\\x29\\x01\\x16\\xb5\\x1d\\xae\\x9f\\xd5\\x79\\x41\\x0a\\xe0\\x78\\xed\\x32\\x0a\\x5a\\x1b\\x49\\xaa\\x7b\\x5f\\xef\\xcd\\x75\\x63\\x95\\x21\\x3a\\xf8\\x64\\x1e\\x29\\xb0\\xeb\\xb5\\xb8\\x3e\\x37\\x80\\xe5\\xd1\\x0e\\x9d\\x3d\\x11\\x99\\x81\\x48\\xf6\\xc6\\xf8\\x6c\\x4d\\x4e\\xb2\\x52\\xe2\\x8c\\x70\\xfa\\x3a\\x55\\xc4\\x3d\\x4d\\x7f\\xaa\\xfc\\xbc\\xdd\\x45\\xad\\x26\\x37\\xf2\\x15\\xe8\\x15\\x49\\xeb\\x8a\\x4c\\xde\\x47\\x15\\xb7\\x10\\x72\\x07\\x50\\x3a\\x79\\x59\\x50\\x60\\xb8\\x3a\\xce\\x8f\\xeb\\x67\\x3b\\x99\\x79\\x68\\x46\\x9d\\xd9\\xb4\\xad\\x6a\\x7e\\xa8\\x1c\\x6e\\x61\\x81\\x00\\x33\\xf3\\xed\\xfc\\x13\\x7d\\x97\\x42\\x09\\x57\\x5c\"},\n{{0x47,0xee,0xe2,0x02,0x4d,0xbe,0x09,0x95,0x3e,0x98,0x1f,0x69,0x86,0x52,0x0f,0x66,0x60,0x82,0xaa,0x9e,0xf4,0x89,0x2d,0xfd,0xfb,0xdb,0xd2,0x50,0xd2,0xa1,0xdf,0x28,},{0x9f,0x13,0xcd,0x8e,0xbf,0x50,0x80,0x34,0x79,0x75,0x15,0x9f,0x36,0x02,0x96,0xa7,0x16,0x40,0x14,0xd8,0xd0,0x69,0xe8,0x31,0xda,0xb0,0x33,0x26,0x07,0x99,0x7c,0xde,},{0x5d,0xef,0xae,0x0e,0x17,0x3e,0xcc,0x18,0xd5,0xf0,0x1e,0xc9,0x29,0x1b,0xe1,0x60,0xd5,0xea,0xbf,0xf6,0x3f,0xd5,0x42,0x3f,0x2b,0xc6,0x6e,0x3f,0x64,0x08,0xc1,0x96,0x35,0x35,0x02,0xdc,0xef,0x21,0xef,0xfa,0x4b,0x9c,0x14,0xbf,0x27,0xb6,0x87,0xd1,0xb6,0xe8,0x6b,0x2a,0x20,0x5a,0x89,0xeb,0x35,0xc3,0x76,0xa3,0xa3,0x25,0x69,0x0d,},\"\\xc1\\x33\\xf0\\x33\\xcf\\x3b\\xec\\x6c\\xd1\\x92\\x12\\xea\\x47\\xdb\\xec\\xb1\\x3f\\x2c\\x60\\x18\\xf9\\xe0\\x87\\x8a\\xc8\\x84\\xbf\\xb5\\x75\\xc0\\xf5\\xd3\\xfc\\x5b\\x49\\x99\\x58\\x0e\\xb8\\xac\\xbc\\xaa\\xc8\\x3a\\xe9\\xac\\x9b\\x44\\x3e\\x6d\\x1c\\xff\\x44\\x9c\\x36\\x89\\xb4\\x33\\xd5\\x09\\x00\\xb2\\xe8\\xb7\\x1d\\x00\\xe1\\x19\\xc8\\xb8\\x75\\x09\\x4b\\xda\\xb9\\x16\\xad\\xaa\\xb7\\x5b\\xcc\\x85\\x29\\x59\\xd8\\xd7\\x59\\x79\\x5b\\xbd\\x6b\\x36\\x0e\\xe4\\x84\\xaf\\xe4\\x7b\\x1a\\xd2\\x83\\x91\\xf2\\x5a\\xfb\\x8d\\x4e\\x3a\\xfe\\x0c\\x5b\\x60\\x04\\x98\\xa1\\x28\\x33\\xfe\\x2a\\x1a\\x54\\x83\\xdf\\x94\\x0b\\x17\\x3b\\xa0\\xd9\\xd8\\xc4\\xd1\\x32\\x1f\\xa4\\xb7\\x33\\x33\\x4b\\x0f\\x6d\\x87\\x8a\\x0e\\x5a\\x76\\xf4\\xf1\\x80\\xac\\x11\\x9a\\x82\\x08\\x2a\\xcb\\x14\\x88\\xe4\\x9b\\xbc\\xa7\\xa0\\x36\\x9c\\x19\\x1b\\xd6\\xd0\\xc5\\xd4\\x45\\x65\\x68\\x21\\xa9\\x9c\\xcb\\xc9\\x45\\x94\\x9e\\xca\\x81\\x36\\xcc\\x6e\\x12\\x7d\\x9d\\xe9\\x2e\\xf6\\x4f\\x17\\x4a\\x6c\\x04\\xc8\\xb5\\xe5\\x24\\x95\\xf0\\xdd\\x67\\x4b\\xb5\\xca\\x12\\x8a\\x92\\x09\\x96\\x8f\\xd4\\x50\\xdc\\xe3\\x19\\x91\\x3f\\xd6\\xa3\\x0c\\x33\\x82\\x79\\x81\\x63\\xe6\\x58\\x5f\\x58\\xef\\x20\\x8b\\xe4\\xd0\\xc6\\xa2\\x51\\x3a\\x75\\x23\\x88\\x39\\x7a\\x4a\\xe4\\x44\\x83\\x8c\\x84\\x66\\xdb\\xc3\\x6f\\xbc\\x36\\xae\\x08\\xbe\\xc8\\x8e\\xed\\xa1\\x31\\xc1\\x4d\\x06\\x36\\x6b\\x67\\x31\\x51\\x45\\x41\\x00\\xde\\xa1\\x11\\x81\\x50\\xfb\\xe4\\x41\\xb1\\xe7\\x82\\x6e\\x54\\x5d\\x98\\x68\\x24\\x2e\\x89\\x9f\\x5e\\xa5\\x3e\\x43\\x4c\\x37\\x93\\x6c\\xe6\\xfd\\x06\\x14\\x62\\x83\\xe8\\xfb\\xd5\\x36\\x48\\x0d\\xe5\\x5a\\x16\\x10\\x2c\\x44\\x75\\x4b\\xc5\\x54\\xd5\\xbc\\x2d\\xe2\\xf2\\x5e\\x19\\xe5\\x67\\xa0\\x23\\xdf\\x46\\x40\\xe7\\x4f\\xf3\\xa4\\x9e\\x4d\\xd3\\x0e\\x0e\\x25\\x58\\xb3\\xdb\\xc2\\xaa\\xb9\\x2f\\xdd\\x5e\\x79\\x42\\x5e\\xcb\\xc4\\xc6\\x99\\xfe\\x1f\\x16\\x19\\x65\\xf1\\xd0\\xb4\\x5d\\x8b\\xda\\xb5\\x2e\\xc9\\xbf\\x7a\\x69\\xd8\\xaa\\x0b\\xd1\\x71\\xe7\\x55\\xce\\x7b\\x8d\\x07\\x18\\xf7\\x26\\x7a\\xfb\\x73\\x3e\\xfc\\xa5\\x4b\\x21\\x3e\\x6f\\x5a\\xda\\xb4\\xc9\\xd7\\x6c\\x86\\x7f\\xcb\\x69\\xae\\x05\\xc7\\x4b\\xd2\\x15\\x16\\xcf\\x34\\x2c\\x61\\x61\\xf6\\xfc\\x9e\\xcc\\xac\\xf9\\x70\\xeb\\xce\\x54\\x0c\\xd8\\x92\\xbc\\x10\\x6c\\x6b\\xd5\\x63\\x61\\x02\\x98\\xb7\\x09\\x68\\xf0\\x91\\xbc\\xc6\\xe1\\xf7\\xab\\x4a\\x5b\\x2c\\x63\\x74\\xa1\\x90\\x3f\\x4d\\x3a\\xd5\\xe1\\xbd\\x86\\x43\\xa9\\xc2\\xf8\\x78\\xc3\\xd7\\xa4\\xdc\\x49\\xef\\x31\\x97\\xed\\xbc\\xda\\x7b\\xb9\\x1e\\x7e\\x06\\x60\\x60\\x87\\xd4\\xe9\\x81\\xbf\\xab\\x93\\xa6\\x02\\x49\\x77\\x96\\x2e\\x45\\x26\\x25\\x17\\xf3\\x38\\xb6\\x85\\x7e\\xec\\x21\\x58\\xa2\\x97\\xb2\\xaa\\x91\\x52\\x4b\\x67\\x7a\\x21\\xaa\\xc5\\x7b\\xe0\\xb6\\x3a\\x80\\x74\\xfe\\x54\\xe7\\xa9\\xdc\\x70\\xc5\\xa5\\xc3\\xde\\x72\\x8b\\x9c\\x17\\xec\\x12\\x12\\xab\\x11\\x30\\xeb\\x17\\x62\\x2c\\xd7\\xb2\\x2a\\xb6\\xeb\\xa9\\x18\\x5e\\x8d\\x67\\xbe\\x6c\\x47\\xa2\\xe5\\xad\\xc6\\x63\\xd4\\x64\\x2c\\xc1\\x20\\x22\\x2e\\x29\\x9f\\xe1\\x34\\xfd\\x7f\\xcd\\x00\\xad\\xab\\xcf\\xaa\\x64\\x2f\\xe2\\xe0\\x8d\\xd5\\x2e\\x2c\\x3f\\x32\"},\n{{0xb6,0xc8,0x8b,0x4c,0x90,0xfd,0x19,0xa1,0x49,0xd3,0x81,0x67,0x19,0x53,0xb9,0xb1,0x6d,0x42,0x8f,0x63,0x61,0xcf,0x50,0x3a,0x11,0x04,0x77,0xe2,0x97,0xf8,0xd2,0xf8,},{0x8e,0xbf,0xb0,0x84,0xf9,0x97,0xb2,0xea,0x79,0x32,0xa2,0x35,0x3b,0x2c,0x8b,0x16,0xbd,0x82,0x5e,0x1a,0xf5,0x87,0xa8,0xeb,0xc5,0x1a,0x6c,0x45,0xae,0xa3,0x43,0xae,},{0x74,0x47,0xa2,0x01,0x81,0xb0,0x2c,0xf1,0xb6,0xad,0x52,0x95,0x69,0xce,0x43,0x7c,0x2a,0x05,0x08,0x11,0x6f,0x50,0x20,0x5c,0x41,0xe6,0x37,0x8b,0x74,0xfe,0x2f,0xc5,0x36,0x30,0xaa,0x0d,0xc4,0xb8,0x0c,0x31,0xcb,0x26,0xc8,0xf0,0x9b,0xf8,0xfa,0xb2,0x7e,0x3a,0xbc,0x8f,0x1f,0x60,0x4a,0x5e,0xc0,0x66,0x31,0xa8,0x4f,0x6f,0x2e,0x06,},\"\\x7f\\x4b\\xf4\\xf5\\x21\\x73\\xef\\xf0\\x72\\xf8\\x18\\xd0\\xaa\\x97\\xe6\\x93\\x5d\\x8b\\xac\\xcf\\x48\\x39\\x66\\x32\\x53\\xb2\\x41\\x4f\\xe6\\xb1\\xf3\\x4c\\xf4\\x3a\\xb1\\x20\\x15\\x5a\\x1a\\x3a\\xea\\x7b\\x48\\x19\\xdd\\xd1\\x03\\x16\\x73\\xb8\\xa7\\xa6\\xbd\\x0b\\x9d\\xda\\x4a\\xde\\xfe\\x69\\x2a\\x56\\x16\\x2c\\x64\\x61\\x80\\x79\\x42\\x64\\xc5\\x12\\x21\\x15\\xeb\\x90\\xa6\\xd3\\x05\\x4f\\x08\\x43\\x02\\xdc\\xe3\\xd8\\x36\\xac\\x3d\\xe8\\x20\\x63\\x8b\\xd8\\x9a\\x86\\xbf\\x0a\\x4c\\x01\\x54\\x7c\\xfd\\xc5\\x43\\xd6\\x76\\xfe\\x16\\x39\\xef\\x72\\xc5\\xb8\\x45\\xc4\\x94\\xe0\\x78\\x14\\xce\\xc8\\xa4\\x7d\\x03\\xdf\\x73\\xbe\\x4e\\x33\\xc0\\x5a\\xfe\\x9a\\x19\\x0d\\xda\\x04\\x33\\x60\\x49\\x6b\\xe4\\xcf\\x3a\\x63\\x19\\xda\\x9a\\xb0\\x64\\x81\\x67\\x7f\\x1a\\x43\\x74\\xd6\\x0d\\x3d\\x3b\\x63\\x94\\xf8\\x84\\x3c\\x86\\x9b\\x0f\\x41\\xa1\\xe8\\x1c\\x2b\\x1a\\x54\\xbf\\x5a\\xac\\xbd\\x98\\x20\\x7c\\x8d\\xba\\xcb\\x36\\x42\\x2a\\x3a\\xa0\\x13\\xd5\\xe8\\x49\\xe0\\x44\\xaf\\x92\\x85\\x45\\xc0\\x46\\x09\\x7c\\xaf\\x14\\x9d\\x97\\x02\\x15\\x11\\x5d\\xea\\x0b\\x5a\\x85\\x40\\x1f\\xf6\\x72\\xe0\\x2e\\xd4\\x0b\\xd0\\xf5\\xa4\\x40\\xcd\\x56\\x49\\x40\\x53\\xc8\\x96\\xc3\\xbd\\x32\\x60\\x63\\x49\\xf7\\xcb\\xe7\\xec\\xe2\\xa2\\x23\\x0c\\xf2\\x36\\xda\\xc5\\x9f\\x78\\x17\\x96\\x5f\\x3f\\xa8\\x0f\\xb4\\x8a\\xa3\\x0b\\x0b\\x19\\xef\\xa9\\xa9\\x65\\x91\\x64\\x6b\\xd2\\x5e\\x67\\xc1\\x85\\xf7\\x7e\\x21\\xd6\\x63\\x0b\\x28\\x8d\\x4e\\x55\\x14\\x6b\\x2a\\xbc\\x15\\xe9\\x50\\x88\\xd9\\x36\\x08\\x07\\x75\\x61\\x81\\x54\\xbb\\xdd\\xa1\\x15\\x70\\x2a\\x2a\\xfd\\x6f\\xd5\\xf5\\x6b\\x92\\x3e\\x18\\x88\\x33\\xec\\x44\\x89\\x44\\xd3\\x02\\x83\\xe3\\x37\\x25\\x42\\x42\\xc5\\x81\\x2d\\x72\\x45\\xa4\\xe9\\x26\\x70\\xbc\\xe3\\x54\\x6e\\xfa\\xed\\x22\\xd2\\x74\\xe1\\xe6\\x04\\x8b\\x5a\\x0f\\x01\\xef\\xbf\\x89\\x5d\\xc4\\x24\\x94\\xba\\xf1\\x74\\x71\\x85\\xcb\\x1a\\x4b\\x88\\xfd\\xf1\\xe6\\x09\\x9b\\xaa\\xbc\\x6a\\x5a\\xb5\\xa2\\x72\\x7b\\x1e\\x24\\x87\\x89\\xd1\\x70\\xca\\xa2\\x44\\x96\\x71\\xa8\\xf6\\xe0\\x94\\xc1\\x13\\x32\\xea\\x0a\\xc2\\xaf\\xe8\\x81\\x32\\xc6\\x44\\xff\\x88\\x3d\\x0c\\x49\\x9a\\xd7\\x6a\\x93\\xdf\\x47\\x2f\\xa0\\x13\\xea\\xa2\\x7a\\xb4\\xda\\xd6\\x79\\xd2\\x51\\x1b\\x50\\x49\\xc4\\xe9\\x8b\\xaa\\x2e\\x7b\\x00\\xa5\\x34\\x89\\x1e\\x29\\x02\\x65\\xed\\xb0\\x76\\xf7\\xdc\\xa8\\xe6\\xfe\\xf3\\xf4\\x33\\x03\\x4a\\x16\\x57\\x5f\\x0e\\x53\\xda\\x45\\x77\\xe6\\xb1\\x3f\\x0c\\xb0\\xd7\\x85\\x87\\x0d\\x0d\\x09\\x8d\\x5d\\x80\\xf4\\x13\\xa2\\x68\\xba\\x84\\xe0\\x43\\x1a\\x78\\x69\\x23\\x77\\x13\\x78\\xcd\\x57\\xb8\\x19\\x22\\x58\\xe2\\x63\\x3c\\xdb\\xe0\\x3c\\xc3\\x16\\xa0\\x95\\x09\\x70\\x52\\x6f\\xd3\\xe0\\x93\\x76\\xbc\\xef\\x0d\\x03\\xb7\\x07\\x4e\\x59\\xa5\\xa8\\x4f\\xc6\\x4e\\x79\\x5a\\x81\\x21\\x56\\xd9\\x60\\x56\\x76\\x50\\xbb\\x1e\\x14\\x24\\xb3\\xcc\\x9a\\x4d\\x99\\xd5\\x7b\\xa8\\x58\\xdd\\x1a\\x0c\\xad\\x35\\x32\\xe9\\x98\\x14\\x6e\\x79\\x26\\x40\\x45\\xe2\\x8e\\xbb\\xfd\\x75\\xa4\\x26\\xb0\\xbb\\x85\\x1a\\x24\\x4a\\xd6\\xbe\\x7b\\xd5\\x76\\x5a\\xf4\\x93\\xdf\\xc4\\x4e\\xe3\\x78\\xcd\\x04\\xda\\xf3\\x91\\x7e\\xef\\x2a\\x62\\x06\"},\n{{0x79,0x49,0xa9,0x47,0x2f,0x72,0x5c,0xe7,0xc6,0x8d,0x7e,0xa8,0xfc,0x16,0xe1,0x3d,0x9e,0x0e,0x0a,0x58,0xf5,0x8c,0x24,0xf9,0x22,0x8c,0x88,0xe8,0x02,0x64,0x09,0x0d,},{0xa3,0x70,0xf8,0x28,0x33,0xf8,0x8b,0x4f,0x5f,0x53,0x10,0xb9,0x18,0xe6,0xaf,0x93,0xbb,0x72,0x4b,0xfb,0xdf,0x3c,0x02,0xc5,0x03,0x78,0x0b,0x2c,0x83,0xab,0x6c,0xc6,},{0xe0,0x28,0x98,0xcc,0x7c,0x30,0xee,0x01,0x64,0x82,0x47,0x49,0x7b,0xe8,0xa9,0xc6,0x37,0x85,0x93,0xdc,0x88,0x20,0xbf,0x7c,0x17,0xff,0xcd,0x18,0x11,0x8a,0xf0,0x98,0x79,0xa7,0x69,0xf5,0x39,0xdd,0x92,0x37,0xe9,0x68,0x21,0x16,0x66,0x34,0x99,0x8f,0x94,0x6d,0xa6,0x5e,0x6d,0xba,0xd8,0x27,0x15,0x11,0x66,0x9e,0x2d,0x6c,0xad,0x02,},\"\\x95\\x53\\x86\\xb9\\x2d\\xd6\\xbf\\x92\\x60\\x1b\\xf8\\x1e\\x84\\xd2\\x51\\x44\\xb5\\xfc\\x0b\\xcd\\x7d\\x23\\xc7\\x6e\\x7d\\xeb\\x5f\\x5b\\xa6\\x31\\x6b\\xb6\\x1a\\x5d\\x8e\\x74\\x18\\x5b\\x01\\x29\\x67\\xf0\\xa4\\x43\\x8b\\x53\\x16\\x96\\xde\\xb4\\xb8\\x10\\x10\\x89\\xe0\\xc0\\x48\\x2a\\xdf\\x13\\xc0\\x61\\x31\\x91\\xb9\\x77\\xf7\\x7b\\x04\\x19\\x81\\x41\\x47\\xf5\\xda\\x64\\xa1\\xd3\\xbe\\xb1\\x27\\x5b\\x98\\x49\\xd1\\x29\\x7b\\xa8\\x53\\x2a\\xe0\\xa6\\x47\\xa8\\xac\\xe3\\x95\\xae\\x0e\\xd0\\x0f\\x67\\x34\\x8c\\x5e\\xe5\\xea\\x19\\xb5\\xf1\\xc5\\xbd\\x2e\\x62\\x28\\x18\\xe8\\xad\\xcb\\xa3\\xc1\\x7c\\x27\\x98\\x7e\\x4e\\x3d\\x6d\\x91\\x0a\\x56\\xc7\\xe5\\x14\\x9d\\x3f\\x55\\x74\\xfc\\x06\\x00\\x9b\\xf4\\xdd\\x3e\\x37\\xcf\\xe3\\xeb\\xda\\x2c\\x21\\x16\\xd3\\x66\\xdd\\x88\\xce\\x5e\\xa7\\x2a\\xb3\\x87\\x49\\x05\\x85\\x44\\x3b\\x08\\x6e\\x8a\\xa3\\x8d\\x11\\xd3\\x82\\x0b\\x72\\xc6\\x58\\xe4\\x63\\xcd\\xb5\\x9c\\x53\\x93\\x01\\x1d\\x4a\\x8f\\x4c\\xb6\\xa1\\x95\\x22\\x93\\x04\\xe7\\x62\\x39\\xfa\\x5e\\x8c\\x2c\\xbe\\x0f\\x39\\xdc\\xad\\x13\\x8a\\x0e\\xcb\\x3c\\x51\\x57\\x9e\\xc9\\xa1\\x20\\xa5\\x16\\x07\\xee\\xfe\\xbf\\xa5\\x9a\\x44\\x62\\x0e\\xa5\\xb1\\x91\\x60\\x87\\xea\\x33\\x85\\x33\\xfc\\x13\\x2f\\xf2\\xe4\\xa4\\x3d\\x05\\x2f\\xd0\\x8b\\x6b\\x1b\\x24\\xfb\\x67\\x2f\\x73\\xc9\\xb9\\xba\\x20\\xb7\\xc1\\xc4\\x1e\\xa2\\x4d\\x91\\x2d\\xe9\\xb5\\x55\\xb6\\xe5\\x68\\x2b\\x97\\x06\\x08\\xff\\x22\\x9a\\xd3\\x08\\x6f\\x43\\x1f\\x9b\\xe1\\x90\\xec\\x39\\x22\\x4b\\xa2\\xed\\x8a\\xcb\\x4c\\x8e\\xac\\x85\\x82\\xe2\\x3a\\xaa\\x79\\x82\\x7c\\x44\\xe2\\x48\\xc5\\xba\\x09\\x2d\\xda\\xc0\\xf2\\xf7\\x96\\x84\\xaa\\x93\\xfc\\x06\\x10\\x73\\xe1\\x82\\x1a\\x56\\xaf\\xb9\\xbf\\xec\\x95\\x2d\\xf2\\x71\\x9a\\x9c\\x7a\\x40\\x3e\\x6a\\x93\\xf7\\xa6\\x56\\xd7\\x4b\\x61\\xc1\\xd1\\x90\\x83\\xf8\\xd3\\xf1\\x9e\\x65\\x9f\\xa2\\xb7\\x18\\xe0\\xbd\\x04\\xb6\\x93\\xd6\\x3d\\xaf\\xb8\\x6a\\xdb\\xee\\x5d\\x87\\xc7\\x5b\\x7d\\x12\\x91\\x22\\xf1\\x78\\xa0\\xe6\\x69\\xeb\\x03\\x5c\\xa4\\xd8\\xeb\\x45\\x39\\x7f\\x18\\x51\\x26\\x4e\\x2c\\xf0\\xa0\\xcd\\xd3\\x07\\x20\\xc5\\xe1\\x39\\xcd\\x6a\\x57\\x3f\\x1f\\xa2\\x41\\xca\\xe9\\x42\\x58\\x05\\xac\\x79\\x60\\x3e\\x8d\\xe3\\x50\\xef\\xdb\\x0b\\x9b\\xc9\\x5b\\xa7\\xb0\\x85\\xc1\\xed\\x92\\xc1\\x2a\\xcf\\x53\\xf5\\xd4\\xa1\\x13\\x75\\x98\\x00\\x8f\\x2a\\x36\\x72\\xc8\\x4e\\x5f\\x76\\x9a\\x25\\xc7\\xa4\\xa1\\x65\\x79\\xd8\\x62\\x88\\x77\\x49\\x72\\x60\\x6e\\x4e\\x7d\\x85\\x26\\x3a\\xd2\\x17\\xe0\\xdb\\xcf\\x34\\x3f\\xe5\\x54\\xc1\\x09\\xc5\\xd9\\x40\\x9b\\x79\\x39\\x07\\x3a\\xc5\\x5a\\x03\\x42\\x0f\\xec\\x28\\x9b\\x11\\x4a\\x5c\\x54\\xc2\\x0b\\x45\\xea\\x69\\x93\\x85\\x33\\xad\\xe7\\xb3\\xae\\x85\\xe1\\xa7\\x83\\xdd\\x97\\x89\\x7c\\x3a\\xe8\\x25\\x41\\x83\\xcc\\x54\\x04\\x5c\\x2a\\x18\\xec\\xbe\\x52\\x16\\x91\\xf2\\x61\\x9d\\x9b\\x8f\\x1f\\xb3\\x47\\xca\\x05\\x5a\\x7b\\x0b\\x4c\\x24\\xf6\\x4d\\x17\\x73\\xe0\\x14\\x16\\x44\\x1e\\xfe\\x15\\x99\\x23\\x21\\x7a\\x84\\x87\\x4b\\x9c\\x4e\\xc2\\x65\\xcd\\xaa\\xb6\\x43\\x90\\x80\\x68\\x49\\x78\\x12\\xc1\\xaf\\x15\\xc1\\x88\\x07\\x1e\\x78\\xf5\\x97\\xfe\\xdf\\xce\\x91\\xc5\\xd4\\xc6\"},\n{{0xd6,0x8a,0x5e,0x3c,0x47,0xee,0xdb,0x30,0x99,0xdf,0xfc,0x80,0x4c,0xf1,0x9c,0x5e,0x74,0xbf,0x7b,0xf5,0xf0,0x1f,0x54,0xd4,0xd9,0x1d,0x75,0x74,0xf3,0xd3,0xdc,0x7c,},{0x46,0x46,0x7f,0xe9,0xce,0x3a,0xcf,0xd0,0xd7,0x43,0x46,0xbe,0x21,0xc4,0x62,0x16,0xdb,0x81,0xae,0xce,0x6c,0xe0,0x30,0x8f,0xb8,0xdc,0x63,0x86,0xfc,0x34,0x46,0xcf,},{0x89,0x6f,0xc3,0xca,0xba,0x7f,0xd3,0xfc,0x28,0x5d,0x5e,0xdd,0xdd,0xc0,0x12,0x0c,0xd4,0x6d,0xa7,0xc6,0xef,0xab,0xe6,0x6b,0x15,0x0b,0x00,0x27,0x60,0xb8,0x41,0x4a,0x89,0xac,0x9e,0x7f,0x1f,0x7b,0x7c,0x7b,0x33,0x59,0x8f,0x61,0xf4,0x57,0x18,0xe4,0xff,0x4a,0xc3,0x68,0xff,0x12,0x96,0x14,0xb4,0xfe,0x92,0x19,0xf2,0x37,0xb0,0x09,},\"\\x59\\x6c\\x03\\xd0\\x87\\x3f\\x57\\x2f\\x45\\xc3\\xb1\\x6f\\x0e\\xf4\\xb5\\x2a\\xd2\\xbf\\x59\\xec\\x76\\xd3\\xc0\\xe5\\x34\\xd6\\x2c\\x1f\\x84\\x16\\x4d\\xda\\xa4\\x25\\xfb\\x85\\xc9\\x54\\x84\\x85\\xb7\\x06\\x46\\x77\\xe9\\x9d\\x04\\xc3\\x9b\\x6e\\xba\\x04\\xc9\\x66\\x39\\x7b\\xa6\\xa5\\xf4\\xeb\\xaa\\x69\\xa2\\x41\\xdf\\x95\\xa6\\xe4\\x45\\x02\\x50\\x9d\\x63\\x50\\x55\\x7e\\xbf\\xea\\x60\\x26\\x4b\\x62\\xad\\x7f\\x74\\xd1\\x6e\\x5d\\x25\\xd4\\x59\\x70\\xcf\\xeb\\xeb\\x33\\xe7\\xb1\\xba\\xc3\\x34\\x8d\\xd0\\x3a\\x8e\\x99\\x13\\x3b\\x26\\xbb\\xfd\\x7a\\xa7\\x22\\xc2\\x58\\x7f\\x72\\xd5\\x52\\x6e\\x98\\x0d\\xa9\\xee\\xbd\\xf1\\x08\\x21\\x1d\\xae\\x50\\xbb\\xe8\\xc6\\x5f\\x9a\\xbe\\xe6\\x9a\\x1b\\xbf\\x84\\xc0\\x3e\\x40\\x44\\x8b\\xab\\xad\\x03\\xd3\\xcf\\x3b\\x7d\\xe4\\x88\\x7d\\x2b\\x47\\x73\\x77\\x02\\x79\\x64\\x82\\xd2\\x26\\x5c\\x56\\x6b\\x0f\\x62\\x3b\\x53\\xc8\\x67\\x1b\\xd3\\x71\\x9e\\xde\\xc0\\xff\\xd5\\xf4\\x9b\\x49\\xb0\\x72\\xc1\\x56\\x4a\\x57\\xf9\\xba\\xb6\\xb9\\x2d\\x1f\\x06\\x8d\\x75\\x66\\x39\\xa4\\x33\\x14\\x52\\xe6\\x1a\\xa7\\xb2\\x18\\xa8\\x8b\\x9d\\xb7\\x7a\\x19\\xfb\\x82\\xf1\\x3e\\x98\\x68\\xed\\xb7\\x98\\xd5\\xbe\\xec\\xa5\\x5d\\x1a\\xb0\\x95\\xb3\\x16\\x22\\x5f\\x3f\\x63\\x90\\xf8\\x95\\x78\\xf0\\x16\\x04\\x28\\x74\\x7b\\xcd\\x21\\xbe\\x6a\\xe1\\xd8\\x69\\x91\\xb4\\x8e\\xf8\\x0d\\x56\\x92\\x50\\x85\\x8f\\xeb\\xf3\\x27\\x6b\\xd5\\xde\\x3d\\xb6\\x5a\\x24\\x5c\\x8b\\xdc\\xf1\\x48\\x8c\\x48\\x25\\x96\\x89\\x45\\x78\\x6b\\xed\\x63\\xf3\\xd1\\x3f\\x14\\x09\\x36\\x3b\\x94\\x85\\x60\\x47\\x68\\x58\\xb3\\x96\\xbc\\xe5\\x88\\xe4\\x0b\\x31\\x1d\\xdf\\xc2\\x2a\\xd6\\x22\\xca\\x7d\\x1e\\x69\\x56\\x14\\x64\\xdd\\xa5\\x00\\x9e\\x63\\x8a\\xa5\\xec\\x9f\\x4c\\x03\\x92\\x93\\xaa\\xec\\x75\\x00\\x1f\\xfc\\x68\\xa7\\xcb\\x3a\\xe0\\x18\\x74\\xdc\\x7f\\x39\\xd7\\x50\\x27\\xf5\\x9a\\x28\\x96\\x5f\\xc1\\x95\\x30\\xc0\\x75\\x2f\\xe9\\x9b\\x15\\x3d\\xa7\\xc0\\xe5\\x42\\xbd\\xa7\\x6c\\xa1\\xe1\\x0b\\x7e\\xa1\\x58\\xef\\xb4\\xd8\\x21\\xfb\\xc6\\x5e\\x72\\x71\\xad\\x99\\x41\\x09\\x53\\x15\\x44\\x7a\\xbc\\xad\\x08\\x80\\xa0\\x07\\x5d\\xd0\\x4b\\x13\\x25\\xc7\\x26\\x33\\xac\\xbc\\xb2\\x61\\xfc\\xb4\\x07\\xc2\\x64\\xa3\\x4d\\x70\\xbf\\x1f\\x04\\x4f\\xee\\xad\\x06\\x9a\\xf5\\xa8\\x7d\\xd3\\x52\\xf4\\xbd\\x81\\x10\\xfa\\x17\\x8a\\xdb\\xd8\\xdb\\xf2\\x3c\\x6b\\x57\\x5c\\xdd\\x5d\\xf2\\x2c\\xc9\\xa5\\xcd\\xd3\\x7d\\x9c\\x8f\\xaa\\xb8\\x1a\\x4c\\xb3\\xfb\\x5c\\x4f\\xe7\\xff\\x62\\x9d\\xba\\xa9\\xfc\\x06\\xb8\\x0c\\x1f\\xb6\\x91\\xc2\\x86\\x55\\x95\\x5c\\xfe\\x5c\\xa4\\x41\\x49\\xb1\\x50\\xb3\\xcf\\x14\\x0d\\x9a\\xca\\xcb\\x14\\x31\\x3a\\x72\\xc8\\x40\\x98\\xde\\x72\\xba\\xcc\\x02\\x72\\xd7\\x9e\\xd6\\x61\\x7f\\x72\\xde\\xc8\\x8e\\x19\\xb8\\x44\\x25\\x49\\x2a\\x42\\x9e\\xc6\\xd2\\xec\\x08\\xb8\\x63\\x46\\xdf\\xbf\\x20\\xea\\x2a\\x36\\x19\\xe7\\x7b\\x6a\\xc6\\x42\\x30\\xeb\\xe2\\x5f\\xa0\\x06\\x7a\\xbb\\x5f\\x33\\xee\\x49\\xad\\xc7\\xc4\\x4b\\xda\\x70\\x46\\xd7\\xf2\\x24\\xf2\\xe7\\xa4\\x89\\x56\\x83\\xfc\\xa8\\x68\\x4e\\xd6\\xa0\\x31\\x84\\x4f\\x57\\x86\\xbc\\xda\\x48\\xb5\\x04\\x23\\x94\\x48\\x7b\\x52\\x40\\x2a\\x09\\x90\\x77\\x88\\xa1\\xe1\\x40\"},\n{{0x31,0xe8,0x2b,0xc1,0xcc,0x5c,0xed,0x21,0xcd,0xc8,0xbf,0xc2,0xdb,0xbb,0x97,0x6b,0x08,0x78,0x0a,0xfc,0x69,0x44,0xaf,0x7e,0x88,0xe5,0x0e,0x67,0x87,0x4d,0x84,0xf1,},{0x8d,0xf9,0x77,0xe2,0xb0,0x40,0xac,0xeb,0xd3,0xda,0xfd,0x67,0xb8,0x7f,0x92,0x16,0xe8,0xc3,0x71,0xbe,0xce,0xd6,0x18,0xfe,0xf3,0xa4,0x96,0xd6,0x51,0xa5,0xd7,0xb5,},{0x24,0x07,0x02,0xac,0x6c,0x68,0xd5,0x97,0xd2,0x22,0xda,0x94,0x9d,0x0c,0x47,0xd1,0x6b,0x39,0x0a,0x47,0x7d,0x1f,0xb5,0x79,0xe9,0xd8,0x94,0x8a,0xdf,0x9b,0x3b,0x6a,0x7f,0xd4,0x45,0x8a,0xe6,0x38,0x5b,0x7e,0x2b,0x68,0x4a,0x05,0xb5,0x5c,0x63,0xfa,0x6c,0xd0,0x87,0xbb,0x90,0x11,0x3c,0xba,0xb8,0xe4,0xaf,0x14,0x2f,0xcf,0x81,0x0e,},\"\\x69\\xd4\\x61\\xb6\\xb7\\xa8\\x66\\xe9\\x4c\\xd5\\x9a\\x5a\\x23\\xbb\\xa4\\xa1\\x27\\x66\\x02\\xf0\\x42\\xba\\xa8\\x50\\xd5\\xb2\\x92\\x49\\xd6\\x74\\x3a\\xda\\x04\\xd3\\xd9\\x38\\x21\\x9a\\xbb\\xc2\\x2a\\xda\\x66\\xa1\\x77\\x81\\x97\\xf7\\x0b\\xf8\\x0b\\x59\\x7a\\x8b\\x4a\\xe0\\x0b\\xdb\\x87\\x68\\x12\\xd3\\xab\\x4e\\xc0\\x11\\xdf\\x73\\x34\\x1c\\x85\\x05\\x3e\\xeb\\xcc\\x2d\\xf0\\xac\\xfc\\x21\\x54\\x82\\x83\\xb5\\x53\\xec\\xde\\x01\\x54\\x82\\x8e\\xd5\\xaf\\x47\\x57\\x19\\x85\\xf8\\x97\\x67\\xb0\\x05\\xb6\\x22\\xc9\\xe7\\xc0\\x79\\xdd\\xe6\\x94\\xe4\\x9d\\xc0\\x55\\x0c\\x79\\x18\\xcc\\x51\\x5c\\x27\\x4d\\xbd\\x9c\\x54\\x69\\xd2\\xf1\\x8e\\xcd\\x90\\xde\\x66\\x4e\\x03\\xca\\x41\\xe5\\x3b\\xe2\\x0b\\x96\\xe2\\x5a\\xf4\\x0c\\x54\\xab\\x0f\\x7c\\xbe\\x9e\\x05\\xca\\x3f\\xa5\\xa3\\x7c\\x1a\\xa8\\xeb\\xfb\\x64\\x44\\xa3\\x2c\\x49\\x6e\\xfc\\x68\\x15\\x7c\\x69\\xf3\\x58\\xc1\\x5f\\x6a\\xc0\\x9d\\x46\\xef\\xef\\x9a\\x68\\x5d\\xf7\\xe8\\xdd\\x63\\xb3\\x04\\xbd\\x3c\\x63\\x8c\\xcf\\x53\\x2f\\xe9\\x01\\xf1\\x1c\\xf9\\x7c\\x5b\\x1c\\xbe\\xd3\\x3c\\x70\\x63\\x7c\\x72\\x1b\\x02\\x89\\xad\\xf6\\xbb\\x6d\\x87\\xc3\\x04\\x79\\xfa\\x92\\x6e\\x04\\x30\\x74\\x30\\x2b\\x76\\xf1\\x15\\x7d\\x0a\\x81\\xde\\xc4\\x93\\xe8\\x7a\\x3c\\x64\\x3e\\x7a\\x20\\xb7\\xa4\\x15\\x25\\xa3\\x8d\\xb0\\x4e\\x78\\xda\\xe5\\xe7\\x79\\x70\\x66\\xbf\\xae\\x2c\\xf4\\x48\\xa4\\x47\\xe9\\x00\\x4c\\xce\\x8e\\x41\\xf0\\x98\\x79\\x91\\xfa\\xd3\\x03\\x11\\xdd\\xaa\\x45\\x9a\\x26\\x44\\xf4\\xb9\\x41\\xc0\\x68\\xc0\\xd6\\xc0\\x77\\x1a\\xfc\\xf4\\x2b\\xf9\\x13\\x9a\\x68\\x4d\\xa2\\x98\\x48\\x6e\\xcf\\x67\\x52\\x3b\\xf8\\x50\\x9a\\x45\\xba\\x5c\\xb8\\xb3\\x86\\x4a\\xd2\\x2c\\x0c\\x6a\\x82\\x8c\\x6d\\xb7\\x2e\\x37\\x1d\\xe4\\x10\\xb4\\x7d\\xac\\x49\\xae\\x9d\\x3b\\x57\\x02\\xb1\\x73\\x9b\\x8d\\x76\\x0c\\xe9\\x86\\x11\\xc0\\x7d\\x88\\xdf\\x5f\\x04\\x68\\x38\\x08\\xa2\\x1a\\xfc\\x2e\\x61\\x71\\x3f\\xc2\\xc0\\x25\\xcb\\x25\\xfc\\xc4\\xee\\x94\\x18\\x41\\x08\\x3b\\x22\\xf6\\x1e\\x26\\x56\\xfb\\x3b\\x8d\\xad\\x41\\xc2\\x62\\xc8\\x9d\\x2f\\x17\\x61\\x03\\x09\\xf2\\xd5\\xc2\\x95\\x89\\xa2\\xdf\\x61\\xe5\\x51\\x49\\x89\\x50\\x32\\xca\\x98\\x1e\\x45\\x57\\xe1\\x30\\xa2\\x37\\xfc\\x08\\x26\\xfc\\x87\\x25\\x29\\x86\\x1b\\xbb\\x83\\x28\\xd6\\x73\\xf3\\x9b\\x58\\xb7\\x3d\\x06\\x0e\\xc5\\x96\\xbf\\x22\\xe7\\xee\\x08\\x1f\\x44\\xe9\\x2c\\x02\\xa5\\x67\\x76\\x79\\x52\\x0e\\x2a\\x2b\\x4d\\x22\\xc7\\x7f\\x2b\\x21\\x2d\\x5a\\xaf\\x05\\x0b\\xf2\\xc1\\x41\\xe3\\xe2\\x8b\\x85\\x71\\xd4\\x32\\x19\\x37\\x42\\x62\\x35\\xc7\\xa6\\x46\\xd6\\x47\\xe3\\xef\\xe1\\x83\\xc2\\x7b\\x74\\x92\\x56\\x5e\\xca\\xcd\\x7f\\x43\\xc6\\x7a\\x74\\x45\\x3f\\x47\\x80\\xe8\\x87\\x11\\xba\\x2d\\xd4\\xa3\\x94\\x1b\\x12\\xdd\\xd3\\x90\\x92\\x70\\xfb\\x3d\\xeb\\xd4\\x22\\x43\\x6a\\xb6\\x16\\x6f\\x08\\xc9\\x9c\\x88\\x6c\\xc0\\xe8\\xe3\\xce\\xcd\\x06\\x42\\xe4\\x42\\x85\\xb8\\x86\\x4a\\xa4\\x16\\x94\\x3c\\x5a\\x18\\x69\\x74\\xf4\\x64\\x53\\x5a\\x87\\x0a\\x01\\x28\\x61\\xbc\\x2e\\x58\\x71\\x49\\xca\\xe9\\x71\\x62\\x4e\\x61\\xc3\\x1d\\x8a\\x50\\x7e\\x3a\\xd8\\x27\\x73\\xe7\\x23\\xbc\\xb7\\x5d\\xf5\\x4b\\xef\\x84\\x7a\\x40\\x7b\\xcb\\x7b\\x1d\\x57\"},\n{{0xcc,0x56,0xbc,0x7c,0xdf,0xa6,0x11,0x92,0x4e,0x72,0xb0,0x7f,0x68,0xab,0xc6,0xca,0x5b,0x85,0xff,0x8b,0xba,0xcd,0xff,0x40,0x6e,0x51,0xba,0x72,0x0d,0x09,0xa8,0x66,},{0x5f,0xfe,0xe2,0x21,0xab,0x4d,0x0f,0xe6,0xf4,0xc9,0x34,0x6c,0x5e,0x5a,0x4b,0x8a,0x63,0x6a,0x6a,0x0b,0xad,0xce,0x96,0x67,0xbe,0x73,0x9f,0x4c,0x9e,0x67,0x33,0xc1,},{0x9b,0x86,0xa1,0x92,0xb6,0x4f,0x4f,0x04,0x4f,0xfb,0xf8,0x7b,0x41,0xc7,0xee,0x52,0xf7,0xa7,0x21,0xaa,0x32,0x0e,0x7b,0xad,0x64,0x25,0x99,0x59,0x90,0x31,0x5c,0xdd,0x50,0x2b,0xe4,0xe1,0x11,0x60,0x19,0xd1,0x31,0xa9,0x21,0x8d,0x19,0x61,0x4a,0xd9,0x55,0x43,0xb1,0x88,0x9a,0xf0,0xa9,0x7e,0xd4,0xd2,0x56,0xdc,0x33,0xd7,0x6e,0x08,},\"\\x08\\x83\\x04\\xf2\\x2e\\x1a\\x28\\x60\\x62\\xde\\xfb\\xeb\\xb1\\x82\\x7a\\x64\\xb7\\x6a\\x14\\xe8\\x70\\x15\\xe7\\xf6\\x46\\x17\\x87\\x77\\xab\\xa7\\x97\\x04\\x68\\x8d\\x7b\\xf3\\x2e\\x1e\\xfa\\xc9\\x7a\\x9f\\xc3\\x39\\x81\\x0e\\xbd\\x3d\\xf9\\x3e\\x4e\\xa0\\x24\\x68\\x69\\x53\\xed\\x91\\xfa\\x6d\\x2a\\xb6\\xe0\\x7e\\xc7\\x81\\x1a\\x6d\\x91\\xca\\x91\\xb0\\x98\\xdb\\x47\\x25\\xdf\\x65\\x84\\x6a\\x95\\xb8\\x08\\x63\\x5a\\x8d\\x0c\\x5f\\xe5\\xac\\xe2\\x5f\\x07\\x80\\xe8\\x96\\x17\\x7b\\xc1\\xbb\\xa1\\xcd\\xb4\\x44\\x92\\x51\\xc0\\x1b\\x48\\x2f\\x02\\x38\\x62\\xf8\\x8e\\x07\\x2e\\x79\\xcd\\xe5\\xdb\\xd6\\xc1\\xd9\\xad\\x9c\\x07\\xc6\\x06\\xf5\\xdf\\x85\\xa6\\xec\\xa2\\x96\\x6c\\xbf\\xe0\\xa1\\x67\\x39\\x68\\x11\\x2f\\x26\\xa3\\x17\\x05\\x3f\\x16\\x7f\\x61\\x1a\\xf2\\x97\\xef\\xa8\\x02\\xe0\\xa9\\x4b\\x3e\\x1f\\x33\\xa2\\x7b\\x73\\xe5\\x59\\x7a\\xbb\\x22\\x41\\x15\\xeb\\xe7\\x5e\\x29\\x4a\\x1b\\xcd\\xcd\\x97\\x92\\x55\\xb0\\xa8\\x02\\x65\\xc0\\x89\\xaa\\xa7\\xd6\\xbe\\xd2\\xe3\\xd0\\xc9\\x18\\xf5\\x6f\\x4a\\x55\\xf4\\x48\\xd8\\x63\\x36\\x5c\\x6c\\x58\\x46\\xfb\\x9b\\x2b\\x9b\\xb5\\x5f\\x6b\\x7c\\x6d\\xff\\x58\\x47\\xb7\\x1b\\xfd\\xd4\\xbb\\x5b\\x9b\\xb2\\xe4\\x24\\x9b\\xc0\\x24\\x3a\\x02\\xab\\x4d\\x22\\xba\\x78\\xa4\\x3d\\x18\\x21\\x95\\xae\\xd7\\x8f\\xec\\xe8\\x4c\\xb1\\xdd\\xae\\xb9\\xef\\xf6\\x81\\x56\\x04\\x5b\\x29\\x32\\xe6\\x38\\xd7\\x73\\x1d\\x0e\\x8b\\x4c\\x9c\\x8c\\x38\\x3b\\x0d\\x6d\\x39\\x2d\\x21\\xfc\\x64\\x07\\x62\\xc8\\x7d\\x36\\x92\\xb1\\x81\\x0b\\xcc\\x4a\\x42\\x39\\x2f\\xf1\\x3d\\x45\\x16\\x9e\\xcb\\xf0\\x13\\x50\\x55\\x09\\x31\\x05\\x09\\x8c\\x86\\x9b\\x68\\x88\\x7e\\x93\\x4e\\x2b\\x9d\\xa5\\x23\\x2a\\xc6\\xc9\\x37\\x38\\x00\\xf7\\x0b\\x64\\xec\\x64\\xa4\\xaa\\x0c\\xa0\\x44\\xc0\\x77\\x7c\\xa3\\xa3\\xac\\xaa\\x13\\x8c\\x14\\x24\\x96\\x72\\xa5\\x5b\\x24\\xdd\\xfe\\x4d\\xc3\\x57\\x57\\x32\\x41\\xe1\\x4a\\xd0\\xac\\x16\\x47\\x5a\\x8e\\x38\\x67\\x88\\x6d\\x41\\xee\\xa3\\x5f\\xe7\\x93\\x2b\\xa9\\xae\\xaa\\x0c\\x86\\xc9\\xeb\\x6d\\xb7\\x80\\x80\\x49\\xad\\xe7\\xb5\\xcc\\x1a\\x40\\x82\\x2c\\x66\\xde\\xa9\\x3a\\xd2\\x2d\\x44\\xb9\\xe4\\x29\\x04\\xb5\\xb8\\x36\\x84\\xae\\x29\\x31\\xfe\\x36\\xc6\\x08\\xff\\x70\\x96\\xf1\\xb0\\x9f\\x81\\x1b\\x02\\x67\\x28\\x04\\x40\\x6e\\x08\\xed\\x9e\\x77\\x45\\x67\\x6c\\xe0\\x47\\xf0\\xf7\\xf6\\x47\\x08\\xe4\\x9b\\xb7\\x87\\x54\\x72\\x0b\\x8a\\xa2\\x26\\xf5\\x55\\x6a\\xbf\\x05\\xb5\\x65\\x84\\x64\\x52\\x92\\xda\\xd0\\x8e\\x24\\x73\\x63\\x9a\\x8c\\xe5\\x47\\x5e\\x0c\\xe9\\x19\\x2f\\x8b\\xa2\\xdd\\x32\\xce\\x14\\xc9\\x19\\x75\\xab\\x60\\x2f\\x7c\\x13\\x53\\x8c\\x52\\x95\\x2d\\x03\\x96\\x15\\x8c\\x7c\\xc6\\xb9\\x42\\xbe\\x7d\\x92\\x3e\\xeb\\x52\\x3a\\x73\\xb5\\xb4\\x11\\x96\\x6d\\x14\\xac\\x96\\xe5\\xb0\\x96\\xa5\\x29\\x32\\xa4\\x16\\x29\\x2e\\xcc\\xdd\\xb9\\x10\\x71\\xc8\\x85\\x60\\xe7\\x0e\\xcd\\x4f\\xe2\\xfe\\x24\\xd5\\x23\\xfa\\xfc\\xb9\\x8e\\x40\\x21\\x50\\x2f\\x41\\x90\\xa0\\x51\\x5e\\xdc\\xb2\\x40\\x19\\xea\\xca\\x09\\xec\\x26\\x15\\xa9\\xbf\\xde\\xb6\\x0e\\xb3\\x54\\xc8\\x4a\\x1f\\x3c\\xec\\x7f\\xfd\\x7e\\x65\\xa5\\x51\\x5d\\x47\\x95\\x9a\\x4c\\x4e\\xc4\\x8d\\x80\\x21\\xb1\\x75\\x4a\\xe2\\xbf\\x84\"},\n{{0x7a,0x57,0xf2,0xdd,0xa0,0xad,0x03,0x38,0xab,0x9a,0x13,0xc9,0xa3,0x49,0x7e,0x9c,0x75,0x23,0x8c,0x15,0x31,0x58,0x97,0x89,0x22,0x7c,0xd2,0x74,0x9b,0xc6,0xe9,0x50,},{0x6f,0x73,0x8d,0xc5,0xe7,0xd9,0xe2,0x40,0xc9,0xf4,0xd0,0xc0,0x6a,0x5e,0x02,0x17,0x47,0x56,0x8b,0x69,0xa7,0x5d,0x50,0x7a,0x2e,0x0b,0xe7,0xea,0x61,0x35,0x26,0xc5,},{0x98,0x91,0x23,0x76,0x1d,0x93,0x56,0x32,0x78,0xfd,0x0a,0x78,0xae,0xd6,0x4e,0x2d,0xe6,0xf4,0xa7,0x00,0xfc,0x9a,0x70,0xd2,0x18,0x77,0x48,0xac,0x06,0xd9,0xc2,0xc3,0x77,0xd1,0x99,0x5f,0x89,0xc7,0x72,0x7f,0xe2,0xf1,0x20,0x78,0x4e,0x41,0x71,0xc4,0x2d,0x63,0x53,0xac,0x3d,0x4e,0x3f,0x62,0x0c,0x63,0x9c,0x75,0x78,0x6c,0x46,0x0a,},\"\\x8c\\x85\\x75\\xa1\\x1d\\x2f\\xf2\\xc2\\x38\\xe4\\x19\\xcc\\xb0\\x06\\x33\\xd0\\x4e\\x8b\\x8b\\xd7\\x74\\x29\\x01\\xd5\\x88\\xdd\\x6a\\x2f\\x00\\xaa\\x12\\xf0\\x8a\\xe4\\x1d\\xca\\xa9\\x33\\x8f\\x8c\\x47\\xe9\\x53\\x12\\x19\\x2c\\xf6\\xb2\\x45\\xa0\\x0c\\xe6\\x88\\xa0\\x29\\xda\\x56\\xdd\\x1b\\x1d\\xeb\\x0d\\x34\\xb5\\x41\\x4f\\xe1\\xc2\\x1d\\x6b\\x63\\xd0\\x6b\\x85\\x34\\xac\\xe8\\xe8\\x66\\xc9\\x33\\xfd\\x7c\\x5a\\x65\\xed\\xa9\\x5a\\x17\\x37\\xa9\\xec\\xdb\\x17\\x85\\x91\\x49\\xac\\x69\\x69\\x51\\xb8\\x2c\\x23\\x0e\\x82\\x75\\xe9\\x6d\\xd0\\x2f\\xd4\\x55\\xea\\x67\\x53\\x79\\xe6\\x7b\\xa6\\x34\\x84\\xb6\\x28\\x38\\x31\\xfe\\x3f\\xfe\\x52\\xd6\\xec\\x49\\xb7\\x09\\x10\\x67\\x05\\xc9\\xd1\\x9b\\x85\\x9d\\xe9\\xfd\\x20\\x08\\x87\\xcb\\x44\\xd8\\xfd\\xfe\\x69\\x61\\xfa\\x4c\\xa2\\x34\\x09\\x44\\xc7\\x64\\xc7\\x04\\x49\\x12\\x08\\x25\\x7e\\x73\\x54\\x82\\xaf\\x8c\\xb6\\x90\\x41\\xdd\\xe6\\x85\\x24\\x1d\\x3f\\xbf\\x46\\xfd\\xa0\\x57\\x24\\x8b\\x89\\x87\\xbe\\x1f\\x80\\xb5\\x4e\\xb5\\x40\\x09\\xf3\\x24\\xdc\\x45\\x0e\\x88\\x6e\\x79\\xf9\\x12\\x58\\x5b\\x91\\xc9\\xdf\\xaf\\xe9\\x01\\x22\\x62\\xc4\\x71\\x40\\x3b\\x1e\\x8b\\x5c\\x31\\xfc\\x53\\x75\\xa1\\xdd\\xf9\\x9b\\x68\\xed\\xf9\\xed\\x70\\xaf\\x85\\x94\\xf7\\xd8\\x4b\\x2c\\xc4\\x91\\x1f\\xe9\\x05\\x00\\xc6\\xee\\xbf\\xba\\xc0\\x85\\x55\\x35\\x50\\xe3\\x5b\\xd2\\xe5\\x25\\x14\\xe9\\x79\\xe7\\x24\\x1e\\x9f\\x8e\\x34\\xcd\\xf8\\x51\\x3a\\xbe\\x72\\x51\\x0d\\xff\\x3c\\xfe\\xc7\\xe2\\xbc\\x64\\x88\\x64\\x1c\\xfd\\x0a\\x65\\xae\\x0e\\x09\\xeb\\xe9\\x9b\\x15\\xb2\\x9d\\x45\\xea\\x67\\xa5\\x7a\\xad\\x55\\x4d\\x4f\\x8b\\xfc\\xe1\\x38\\x6a\\xce\\x22\\x88\\x39\\xe3\\xa8\\xa5\\x34\\x14\\x0e\\xec\\x3d\\x37\\xd5\\x1b\\xe3\\x61\\xf5\\xea\\x18\\x83\\x73\\x9f\\x56\\x61\\x5f\\x75\\xb0\\x55\\xa0\\x6a\\x91\\x47\\x1b\\xe9\\x8b\\xc9\\x45\\x37\\x83\\xc3\\x58\\x38\\x2b\\xd0\\x55\\x5a\\xe9\\xeb\\x0b\\xdc\\xd6\\x66\\x29\\xa6\\x11\\xfc\\x1a\\x11\\xc6\\x53\\xc8\\x22\\x14\\x58\\x7d\\xec\\x12\\xba\\x12\\x0e\\x25\\x13\\x07\\x0f\\xe6\\x9e\\x98\\x2f\\x7a\\x80\\xad\\x15\\x9f\\x6a\\x32\\x5d\\x97\\x7d\\x01\\xd0\\x50\\xd1\\x16\\xa6\\x2a\\x4f\\x8a\\xca\\xb6\\xc3\\xd6\\x9f\\xf6\\xc8\\x78\\x21\\x3c\\x60\\xa9\\x48\\x45\\xca\\xe1\\x06\\xde\\x6c\\x5d\\x6f\\xe2\\x50\\x8d\\x94\\x56\\x5b\\x7b\\xa7\\x5d\\x58\\xd1\\xad\\x47\\xd7\\x6a\\x20\\xde\\xfa\\x75\\x68\\xcb\\x7f\\xd6\\x6f\\x57\\xcf\\x37\\x74\\xa2\\x1d\\x3f\\xfa\\x7d\\x8a\\xa6\\xd8\\x6d\\xc2\\x84\\xb7\\x0e\\x0f\\x17\\xe7\\x63\\x0b\\xfc\\x10\\xcd\\x1f\\xc9\\xa8\\xd9\\xc5\\x92\\xd3\\x9f\\x24\\xa7\\xb5\\xc8\\xe8\\xaf\\xf3\\x53\\x57\\x7e\\x6a\\xc9\\x00\\x86\\x90\\xc7\\xa1\\x59\\xa7\\xe8\\x3b\\xe5\\xa6\\xae\\x8f\\xca\\x96\\x44\\xbd\\xdf\\xa3\\x7a\\x92\\xb0\\x70\\x55\\xf9\\xfa\\xc9\\xfa\\x97\\xfb\\x3e\\x8f\\x5f\\x4d\\x91\\x7d\\xda\\x5c\\x6d\\xc6\\xea\\x34\\xb6\\x4d\\x30\\x24\\x05\\xbc\\x38\\x06\\x2e\\x07\\xce\\x93\\xa1\\xa8\\x8a\\xed\\x5f\\xba\\xf9\\x95\\xa0\\x9b\\x45\\xb2\\x8a\\xd4\\xa6\\xb2\\x73\\xde\\xc1\\x41\\x3c\\x54\\x04\\x52\\x9d\\x82\\x5b\\x5e\\xdc\\x2e\\x27\\xa3\\x90\\xeb\\x7e\\x8c\\x2b\\x43\\x90\\x5e\\x11\\x6d\\x88\\x7a\\xb5\\xfb\\x99\\x3d\\xfe\\x15\\x0e\\xbd\\xcf\\x81\\x7a\\xe6\\x2e\\x03\"},\n{{0x32,0xef,0x6d,0x78,0x9a,0x1e,0xa3,0x93,0xf1,0xbf,0x9f,0x11,0xde,0x34,0xf5,0x7d,0x65,0x3c,0x4e,0x77,0xd5,0x1e,0x60,0x50,0xfe,0xf4,0xe8,0xd7,0xbf,0x18,0x3d,0xb5,},{0xc1,0xaa,0x18,0x1e,0x62,0x0f,0x60,0x52,0x5c,0x2b,0x17,0xda,0x8d,0x29,0x0b,0xae,0x5d,0x33,0x9e,0x17,0xea,0xbc,0xea,0xb5,0x8c,0xd7,0x6a,0xe0,0x66,0xf4,0x11,0x79,},{0x88,0xf3,0xa6,0xe0,0xbb,0xaa,0x3e,0x06,0x0b,0xc9,0xd9,0x1f,0xe2,0x96,0x8c,0x61,0x12,0x6b,0x20,0x31,0x7f,0x59,0x84,0x2e,0x4a,0xe4,0x87,0x11,0xcd,0xba,0xf6,0x2c,0x6c,0x02,0x07,0x40,0x5d,0x1c,0x48,0x49,0x95,0x02,0x71,0xf0,0xaa,0xa7,0x59,0x30,0x91,0x10,0x9e,0x47,0x8d,0x13,0xf3,0x56,0x96,0x4f,0x7d,0xba,0xb7,0x29,0xaf,0x00,},\"\\x11\\xa9\\xc3\\xc1\\xba\\x7c\\xfb\\x61\\xad\\x10\\x33\\x05\\xc2\\x58\\x86\\xde\\x9f\\x88\\x15\\xc6\\xc2\\x1f\\x17\\xa8\\x73\\x3a\\x02\\x4f\\x94\\x97\\xda\\x05\\x40\\xdb\\x36\\x03\\xa6\\x71\\xaa\\xe8\\x37\\xdb\\xbb\\xa1\\x9e\\x19\\xf8\\x2d\\xdf\\xc8\\xaf\\x85\\x59\\x80\\xa7\\x01\\x25\\xfc\\x61\\xcd\\x7f\\xfd\\x10\\x77\\x7e\\x36\\x6e\\x5e\\x95\\x69\\x92\\x7a\\xf0\\xf2\\x45\\xd4\\xf3\\x9b\\x3f\\xd0\\xf4\\x58\\x79\\xc2\\x53\\x40\\x14\\x12\\x85\\x5e\\x57\\x61\\x90\\x5e\\xd6\\xef\\x31\\x8b\\x6a\\x06\\xea\\x6e\\x9f\\x90\\x6f\\x9b\\xd0\\x16\\xbc\\xb6\\x94\\xa0\\xdf\\x65\\xa0\\x16\\xbd\\xfe\\x84\\x5a\\x09\\xf2\\x3e\\x50\\x86\\xc5\\xaa\\xf3\\x75\\xef\\xeb\\x86\\xda\\x51\\x23\\x9d\\xdc\\x35\\x0b\\xac\\x0c\\xdb\\x03\\xb8\\x74\\xdb\\x15\\x07\\xe6\\xad\\x4e\\x2c\\x9f\\x46\\x02\\x8c\\xa2\\x38\\x83\\x63\\x54\\x14\\x93\\xb6\\xcb\\x92\\xc1\\xdf\\xca\\xa3\\xef\\xd6\\x8c\\x6b\\x4e\\x91\\xef\\xb4\\x67\\x51\\xd2\\x3f\\x4c\\x48\\xa9\\x73\\xf0\\xa5\\xc7\\xc6\\xfe\\x2a\\x12\\x69\\xd2\\xa6\\x9e\\x9f\\xc4\\xab\\x8b\\xa3\\xb9\\x2f\\x79\\x64\\x49\\xba\\x3d\\xc7\\x02\\x45\\xed\\x50\\x5c\\xc0\\xee\\xee\\x16\\x36\\x64\\x7a\\x68\\xc7\\x67\\x9d\\x0b\\x6d\\x65\\x1b\\xba\\x35\\xc2\\x9b\\x81\\x47\\x8d\\x17\\xca\\x36\\x85\\x70\\x7a\\xd6\\x16\\xe6\\xe5\\x60\\x43\\x81\\xf8\\x4e\\xe5\\x2b\\x25\\xad\\x02\\xfc\\x0d\\xfb\\x85\\x43\\x2e\\xfb\\x1f\\xec\\xd0\\x90\\xc0\\x2a\\xd0\\x02\\xc1\\x85\\x7f\\xce\\xd8\\x8f\\xdf\\xb2\\xff\\x26\\xdd\\x0f\\x50\\x18\\xfb\\x47\\xd8\\x13\\x58\\x1f\\x65\\x08\\xca\\x63\\x7c\\x73\\x65\\x17\\x7c\\x51\\x3d\\x1e\\xe0\\x58\\x79\\xa6\\x5c\\x5b\\x67\\x6b\\x3a\\xa8\\x73\\xa1\\x93\\x5c\\x54\\x37\\xea\\xdc\\xb6\\x6d\\xfb\\x05\\x2a\\x5e\\x7c\\x3e\\x81\\xd4\\x4b\\x3d\\xaf\\x69\\x8f\\x42\\x24\\x4e\\xe2\\xee\\x4b\\x6e\\xd2\\xb7\\xe6\\xe5\\x6e\\x61\\xff\\x9c\\xb4\\x5e\\x71\\x9f\\xd7\\x46\\x19\\x8b\\xf2\\xa7\\xde\\x6d\\x25\\xaf\\x3b\\xc6\\xc7\\xb0\\xed\\x8a\\xbe\\x3c\\xb3\\x89\\xaf\\xd8\\x4f\\xfa\\x2a\\x23\\x0d\\x93\\xbc\\x0c\\x29\\xd5\\xa9\\x41\\x9c\\xbf\\xf1\\x1b\\x78\\x83\\x32\\x99\\x21\\x48\\x0b\\x58\\x44\\x65\\x5d\\x99\\x6c\\x7c\\xab\\x29\\xdf\\xb2\\xa3\\x92\\x7b\\x82\\xba\\x7c\\x30\\x6c\\x45\\x77\\xb6\\xf8\\xb5\\xdb\\xe2\\xaf\\xaf\\x9b\\xf1\\x4a\\x8f\\x95\\x54\\xcd\\x01\\xa6\\x9a\\x99\\x1b\\xf2\\x12\\x82\\x8d\\xe1\\xe6\\x31\\x72\\xe8\\x33\\xde\\x06\\x69\\x8c\\xdb\\x3b\\x28\\x71\\x63\\x80\\x31\\x45\\x72\\xbf\\x5b\\xcf\\xd3\\x4e\\xf5\\x2a\\x6f\\xad\\xda\\x87\\xba\\xbe\\x6b\\xac\\xdb\\x20\\xce\\x63\\xc7\\x25\\xcb\\x0f\\xf6\\x1f\\xe3\\x0c\\x1b\\x51\\xdb\\xda\\x2c\\x26\\x25\\xf9\\x9d\\xfe\\xb0\\x29\\xa3\\xe5\\x8c\\xba\\x7d\\x01\\x90\\x51\\x11\\xca\\xf4\\x2f\\x27\\x02\\x5e\\x72\\x0e\\x18\\xee\\xb0\\x7d\\xae\\x91\\x55\\xc5\\x5a\\xa3\\x00\\xe2\\x2e\\xb5\\xe9\\x4d\\xc7\\xa0\\xa8\\x4e\\xe6\\x7d\\x91\\xa9\\x60\\xae\\x08\\xca\\x63\\x2d\\xbb\\x17\\x37\\xfc\\x9a\\x43\\xdb\\xcf\\xb3\\xa8\\x79\\xeb\\x9f\\xbf\\xfd\\x72\\x99\\x33\\x8e\\x26\\x4b\\xc1\\x23\\x7a\\xb6\\xa5\\xbc\\x2a\\x26\\x3c\\xfa\\x99\\xe8\\x54\\x44\\x39\\xd9\\x63\\x31\\x63\\x9f\\xe9\\x40\\x8e\\x54\\xa3\\x50\\x61\\x0f\\xf0\\x1d\\xe3\\xf8\\x57\\x99\\xad\\xeb\\x73\\xd8\\x2b\\xe9\\x38\\x07\\x4d\\xea\\x85\\x8e\\xa6\\x36\\xb6\\x3a\\xbd\"},\n{{0x0a,0x55,0x25,0xa4,0x59,0x8f,0x60,0x99,0x2f,0x86,0xba,0x1a,0xb9,0xee,0xe6,0xe2,0x67,0x56,0x22,0xf9,0x43,0x28,0x4f,0xc0,0x55,0x3e,0x44,0x46,0xac,0x5a,0x4c,0x53,},{0xdb,0x60,0xd7,0xea,0x29,0xf8,0xd6,0x0d,0xad,0x33,0xd0,0x2e,0xc5,0xf4,0x22,0x32,0x05,0x7b,0xd1,0xc4,0xbd,0x61,0x80,0xa2,0x42,0xcb,0x7a,0xb6,0xf4,0x42,0x67,0x81,},{0x8f,0xa6,0xb0,0xae,0xac,0x71,0x13,0x2a,0xd8,0x82,0x97,0x58,0x68,0xf1,0xbd,0xb8,0xc1,0x1f,0x1a,0x6c,0x1b,0x9c,0x54,0x59,0x4e,0x0e,0x46,0x28,0x6e,0xa6,0xc9,0xa5,0xd6,0xd5,0xb0,0xea,0xea,0xca,0x9a,0xe3,0xaf,0x74,0xe7,0x23,0x26,0xb3,0xb6,0xf2,0xea,0xa8,0x93,0xc0,0xec,0x42,0xa4,0x9c,0x56,0xef,0x51,0x4f,0x75,0xc7,0x7f,0x01,},\"\\xf7\\x87\\x32\\x1b\\x42\\xc0\\x8d\\x40\\x52\\x44\\x9a\\x48\\x85\\x93\\xd8\\x85\\xb4\\xe0\\xc3\\x4a\\x5d\\x64\\x14\\x9f\\xa8\\xb9\\xc8\\x5e\\xe5\\x4b\\xcb\\xec\\xb5\\x09\\x09\\xb2\\xa8\\x6b\\x88\\x25\\x8a\\x10\\xe0\\x7e\\x8f\\x8c\\x2d\\x06\\x8a\\x89\\xfb\\x16\\x5a\\x6a\\xce\\x7e\\x64\\x99\\x8b\\xa5\\x7d\\x89\\xd9\\xbf\\x2b\\x8b\\x38\\xa1\\xf6\\xd8\\x36\\x4a\\xee\\x05\\xce\\x33\\x48\\xbe\\xd4\\x8b\\x88\\xc2\\x47\\x3b\\xf5\\xf2\\x66\\x5f\\x51\\xca\\x07\\x3a\\x53\\x05\\x35\\x8e\\xaa\\xd4\\x36\\x5d\\x58\\xb8\\x3b\\xc9\\x81\\x4e\\x25\\xf5\\x4c\\x37\\xcd\\x9b\\x68\\xa8\\x08\\xa5\\x7d\\x6c\\x2d\\x7d\\x7b\\x6d\\xeb\\x5f\\xe2\\x0f\\x4f\\x96\\xfe\\x72\\x5f\\x8d\\xe6\\x5c\\x29\\xa4\\xf1\\xcc\\xef\\xd7\\xc2\\xc6\\xf2\\xfc\\x01\\x16\\xd5\\x86\\x76\\xac\\xbc\\x58\\x69\\x1c\\x79\\xc2\\xb0\\x06\\x78\\x5a\\x09\\x75\\xa3\\x1d\\x8d\\x3c\\x94\\x91\\x61\\x59\\x6a\\x06\\x8a\\xaf\\x22\\x26\\xab\\x84\\x25\\x50\\xe9\\xc0\\xb2\\x61\\x0a\\x29\\x53\\x1d\\x1f\\x3f\\x7f\\x00\\x82\\x6b\\xb6\\xc7\\xdb\\xe0\\x4e\\x28\\xae\\x1b\\x9f\\xf6\\xf8\\x88\\xa4\\x9d\\x82\\x81\\x2f\\x45\\x2e\\x1b\\x32\\x74\\x0b\\x23\\x4d\\xdd\\x96\\x42\\xe1\\x8f\\x32\\xad\\x9a\\x9a\\xf7\\xf8\\x95\\x25\\x28\\x67\\x4a\\x2c\\xda\\x25\\xb4\\xf7\\xba\\x86\\x70\\x07\\xff\\xa7\\xf7\\x8f\\x16\\x3d\\xb8\\xf3\\x69\\x14\\x95\\x6b\\xfa\\xec\\xd5\\x0f\\x6d\\x1a\\xf4\\xee\\x13\\x32\\x75\\xa8\\xea\\xab\\x94\\xbb\\xc0\\xae\\x52\\xb6\\xd9\\xb2\\x83\\x26\\x34\\x23\\x2e\\xc0\\xe8\\xb5\\xf8\\x02\\x2d\\x3e\\xf1\\xea\\xd9\\xb7\\x9e\\xf9\\xa1\\x65\\x64\\x27\\x71\\x94\\xf2\\x38\\x0d\\x90\\x21\\xe1\\xf1\\x7b\\x18\\x4b\\x8d\\x3a\\x7a\\x34\\xd1\\x51\\x39\\xa3\\x9c\\x77\\x28\\xc2\\x2e\\x1a\\x3a\\x67\\xa2\\x7a\\x6c\\xa4\\xb8\\xa8\\xa0\\x63\\x6c\\x60\\x54\\xd0\\xf7\\x41\\xf0\\x46\\x67\\x36\\x19\\xfc\\x6b\\x07\\x0e\\x62\\xff\\x48\\x62\\xf5\\x9d\\x26\\x90\\x07\\xf3\\x43\\x13\\x39\\x63\\x7a\\x89\\xf5\\x64\\xc0\\xdb\\x3d\\x9b\\xcf\\xcd\\x19\\xfc\\x25\\x13\\x8a\\xc6\\x6d\\x47\\x4d\\x80\\xf4\\xad\\x79\\xf6\\xd1\\xe7\\x84\\x44\\x08\\xe8\\x80\\x34\\xee\\xaf\\xf4\\xa7\\x90\\x33\\x8d\\x54\\x6b\\xfc\\xd7\\x42\\x4c\\x11\\x9e\\x21\\x1f\\x36\\x3c\\xb8\\x9c\\x88\\x87\\x49\\x34\\x6a\\x89\\xd3\\x2f\\x02\\x3b\\xb6\\xb0\\x36\\x6a\\x1e\\xde\\x43\\x25\\x03\\x2a\\xa3\\x5f\\x52\\xe9\\xdf\\x93\\x8a\\x50\\x27\\xeb\\xee\\x96\\x88\\xae\\x48\\x0d\\xde\\x1a\\x9c\\x9b\\x42\\xd1\\xa9\\xc0\\x8f\\x71\\x92\\x23\\xdf\\xae\\x1c\\xfc\\xd4\\x9d\\xd1\\x05\\x3a\\xaa\\x38\\x1c\\x24\\xcc\\x9c\\x7a\\xbf\\xcf\\x8f\\x6d\\x86\\xd6\\xaf\\x72\\xee\\xf0\\x53\\x04\\x41\\x2f\\x3d\\xb2\\x58\\x5a\\xa9\\xe0\\xf3\\xa4\\xf1\\xb6\\xd7\\x10\\xd0\\x2a\\xb1\\x1d\\xb1\\xfc\\x90\\xad\\x4d\\xe2\\x5d\\x04\\x29\\x9f\\x31\\x29\\xc2\\x12\\xe9\\xcb\\x73\\xc0\\x04\\x79\\x53\\x45\\x5b\\xf9\\x8e\\xc8\\xfd\\x26\\x74\\xe4\\x7b\\x94\\x99\\x57\\xde\\xed\\xa0\\x18\\xba\\xdc\\x9f\\x2f\\x68\\xa1\\xb1\\x8e\\xf5\\xc5\\x83\\xb0\\x95\\xe0\\x8d\\xd9\\x06\\xda\\x5f\\x22\\x0d\\xa0\\x29\\xb9\\xc4\\x00\\xe3\\xca\\x91\\xc7\\xcb\\xd8\\x7f\\x34\\x30\\xc7\\x42\\x33\\x7f\\x61\\xcf\\x54\\x74\\x5b\\x06\\x22\\xbc\\xb9\\x07\\x62\\xc6\\xba\\xfe\\xf8\\x7e\\x1e\\xc8\\x88\\xc3\\x64\\xfa\\xd6\\x46\\xc3\\x3a\\xcc\\x22\\xaf\\x54\\x38\\xb8\\x4c\\xd5\"},\n{{0x2d,0x5d,0xdf,0xfa,0x2e,0x58,0xc9,0x04,0x51,0xea,0x05,0xde,0x47,0xb8,0xc4,0x92,0x34,0xe2,0x6c,0xed,0x54,0x85,0x4e,0x3a,0xce,0xf1,0x1d,0x8e,0xe6,0x85,0x2d,0xa7,},{0x7b,0xfd,0x1c,0x8a,0x4a,0x0b,0xbb,0x46,0x06,0xd2,0xe5,0xbc,0x09,0x0f,0x56,0xb2,0x0d,0x58,0xf2,0x20,0x4b,0x6a,0xed,0x83,0x1d,0x3d,0xf4,0xd4,0x06,0xb4,0x76,0x05,},{0xce,0xd9,0xd6,0x10,0x10,0x33,0x9c,0x47,0x1d,0xdf,0x9f,0xef,0xca,0xa8,0x2d,0x1e,0xab,0x3a,0x2e,0x0e,0x60,0x27,0x85,0x53,0xb4,0xdd,0x9f,0x39,0x5b,0xe5,0x81,0x49,0xc9,0x15,0x94,0xe5,0x61,0x8b,0x0b,0x10,0xbf,0x3a,0xab,0x94,0xf1,0x59,0xb5,0x30,0xf6,0x44,0x63,0xee,0xd6,0x6f,0xa2,0xac,0xe5,0x4f,0xd9,0x25,0x72,0xa0,0x6a,0x0e,},\"\\x4f\\x1c\\x5b\\x4e\\x6f\\xac\\x3b\\xaa\\x3e\\x90\\x10\\xf3\\xbf\\x29\\x3c\\x77\\x9e\\x61\\xfd\\x7b\\xbe\\x05\\xa5\\x86\\xf5\\xaa\\xf0\\x80\\x26\\x37\\x16\\x27\\xa2\\x09\\xac\\xd1\\x88\\xaf\\xb2\\xdb\\xe0\\x31\\x15\\x47\\x94\\x05\\x59\\x71\\x16\\x40\\xf7\\x8a\\xea\\x9a\\x62\\x81\\x89\\x62\\xf4\\x45\\xa8\\xe7\\xed\\x6f\\xe6\\xc5\\xf4\\x91\\x62\\xe7\\x43\\x5d\\x1b\\x62\\x5b\\x88\\xba\\x39\\xda\\xb0\\xad\\x56\\xfd\\x2c\\x0a\\xd6\\x51\\x26\\x61\\x36\\x2b\\xf7\\x8a\\xfe\\x5a\\x14\\x16\\xb6\\x47\\xf3\\xb8\\x8a\\x05\\x6c\\x9e\\x72\\x89\\xc9\\xb0\\xcc\\x3a\\xfb\\x43\\x40\\x21\\x98\\x56\\x34\\x93\\xe7\\x37\\xb1\\xda\\x05\\x25\\x06\\xb6\\xc9\\x30\\x6d\\x75\\xad\\x66\\x93\\xdb\\x6d\\x15\\x71\\xf9\\x6f\\x6f\\x52\\x99\\x0c\\x4d\\xf1\\x96\\x65\\xa6\\xbb\\x63\\x07\\x3f\\xdd\\x9f\\x55\\x59\\x68\\x96\\xa2\\xe9\\xc2\\x62\\x2f\\x2b\\x0c\\x2c\\xc9\\x9d\\xdd\\x1b\\x64\\x9f\\xb0\\x31\\x80\\x58\\xd7\\x47\\x94\\xe3\\x8e\\xc6\\x57\\xeb\\xc8\\x2a\\xbd\\x5b\\xed\\xf8\\xb3\\xf4\\xbb\\xa3\\xbb\\x6c\\x99\\x35\\xfd\\xf6\\x82\\x65\\x02\\xb7\\x69\\x04\\x6b\\x36\\xd9\\x6d\\xc6\\x95\\xd7\\xc8\\x54\\x04\\x28\\x4d\\x2a\\x2a\\xb7\\xfc\\xf3\\xb0\\x2f\\x68\\xa1\\x49\\x3d\\xd3\\x83\\xca\\x63\\x39\\xfa\\xc1\\xcd\\xe4\\x7f\\x53\\xc5\\xe0\\x26\\xd0\\x86\\x9f\\xaf\\xfe\\x40\\xab\\xdb\\x98\\x19\\x52\\x30\\xf1\\x7d\\x0c\\xfa\\xa5\\x33\\x31\\x5a\\xfd\\xbf\\xe7\\xd1\\xaf\\xc3\\xa6\\x15\\xb4\\xf7\\x50\\x90\\x23\\x3a\\x50\\x3f\\x88\\x61\\xe3\\x23\\x74\\xe1\\xea\\x95\\x57\\x67\\x42\\x31\\xd9\\xd7\\x37\\xd4\\x77\\xb3\\x3f\\xf8\\x2a\\xc0\\xb2\\xc0\\xba\\x93\\xc1\\x1f\\xb5\\x23\\xe6\\x13\\x61\\x8e\\xd3\\x70\\x52\\x4a\\x60\\xf4\\xd4\\xc8\\x36\\x94\\xc0\\x33\\x60\\x6d\\x1d\\x06\\x9d\\x54\\x4d\\xcc\\xd3\\x90\\x0c\\x37\\xa3\\xb3\\x36\\x3e\\xfb\\xcf\\x66\\x97\\xf9\\xf7\\x62\\xb3\\x3b\\x12\\x94\\x58\\x39\\x53\\xfc\\x53\\x77\\x3e\\xf5\\x67\\x26\\xee\\xb4\\x70\\xeb\\xe9\\x21\\x49\\xb7\\x36\\x48\\xa1\\x61\\x61\\xd4\\x94\\x12\\x0a\\x31\\x8b\\xfb\\x08\\x0c\\xc3\\x8e\\x49\\x96\\xf4\\xb2\\x63\\xff\\xe7\\x8c\\x78\\x77\\xfe\\x13\\xc2\\xfc\\x55\\x21\\x9f\\x44\\x26\\x0e\\x8f\\x25\\x3b\\xdd\\x37\\x9d\\x87\\x0e\\x6c\\x91\\x04\\x8b\\x1d\\x8d\\x4e\\x88\\xb8\\x82\\x18\\xb2\\xb0\\x49\\xfe\\xf5\\x3b\\x2a\\xe1\\xf8\\xc9\\x21\\xed\\x2b\\xcb\\x43\\x46\\x69\\xe3\\x97\\x5d\\xcc\\x3f\\xe4\\x52\\x0c\\xa8\\x02\\x48\\x42\\xf7\\xff\\x2b\\xa1\\xe2\\x2c\\xfe\\xb5\\xd4\\xc9\\xe4\\x35\\xea\\xda\\x60\\x1f\\xf1\\x83\\xb2\\x63\\x64\\xee\\xe1\\xfa\\xa5\\x9d\\x19\\xe6\\xaa\\x4f\\x09\\x75\\x23\\x84\\x96\\xa7\\x09\\xe4\\x6b\\xf6\\x83\\x36\\xb0\\x68\\xbd\\x80\\xb3\\x46\\xf1\\x1f\\xaa\\x38\\x17\\xa0\\x7d\\x1c\\xbd\\x84\\x38\\x2b\\x21\\x02\\x98\\x6f\\x29\\x5a\\x13\\x98\\x07\\x7b\\xa2\\x91\\xd6\\xb5\\xf5\\xbd\\x86\\x0e\\xc6\\x17\\x72\\x73\\x46\\x8f\\x0e\\xe0\\xf2\\x59\\x1b\\x57\\x5c\\x43\\x66\\xe1\\x89\\xb2\\x24\\xe9\\xff\\xa3\\x5b\\xc7\\x8a\\x4a\\xa8\\xc0\\x69\\x54\\xfe\\x33\\xd0\\x80\\xff\\xc0\\xb2\\x3e\\x20\\x9f\\xd0\\xe7\\x94\\x21\\xf1\\xbd\\xe8\\x18\\xa8\\x68\\x90\\xcf\\x17\\x22\\x36\\xdb\\x21\\x16\\x57\\xd1\\x00\\x31\\x19\\xfe\\x91\\xd4\\xe2\\x7c\\x52\\x4c\\xcc\\x11\\xfa\\xde\\x0a\\x25\\xf5\\x7a\\x7a\\x1d\\x67\\x7e\\x1d\\xa0\\xb9\\xc0\\x43\\xd0\\x2f\\xca\\x38\"},\n{{0x4d,0xf5,0xe1,0x1d,0xec,0x80,0xec,0xd8,0x82,0x83,0x75,0x54,0xfa,0x31,0x35,0xb9,0xd5,0x02,0x9d,0xf4,0x20,0x27,0xaa,0x3b,0x3c,0x92,0x92,0x46,0x32,0x9f,0xee,0x96,},{0xef,0xd9,0x28,0x89,0x8f,0xa1,0x44,0xc2,0xd1,0xc8,0x33,0x4f,0xa2,0xe6,0xb5,0xb6,0xa3,0x25,0xa7,0x10,0x2a,0x2c,0x34,0x4a,0x14,0x55,0x41,0xee,0x9a,0x6c,0x04,0x6d,},{0x62,0x54,0x5e,0x6c,0x07,0x80,0x1f,0xde,0x95,0xb4,0x61,0xe2,0xe7,0x53,0xc4,0xb6,0xc8,0x4c,0x25,0x12,0x4e,0xb3,0x30,0xa2,0x72,0x59,0x89,0xd5,0xe3,0x40,0xdc,0xef,0x0c,0x74,0x56,0xd4,0xc7,0xc6,0xa1,0x78,0xa2,0x21,0xb6,0x32,0x83,0x48,0x25,0x3d,0xb7,0x87,0xa9,0xe5,0x51,0x0a,0xb9,0xcc,0x27,0x85,0x15,0xae,0x3e,0x58,0xfb,0x01,},\"\\xfb\\xd6\\xf3\\x71\\xb4\\xc8\\xb1\\x52\\xc9\\xce\\x0c\\x63\\x96\\xa7\\x7c\\x0f\\xe4\\x80\\xbc\\x02\\x00\\x7f\\x33\\x6a\\xc5\\x8f\\xd4\\xad\\xdd\\xa9\\xd6\\x98\\x55\\xac\\x9e\\x93\\xa4\\x5d\\x3e\\x35\\x0f\\x41\\xff\\x50\\x2a\\xa1\\xd8\\xfe\\x15\\x9c\\xe8\\x9b\\x06\\x48\\x02\\xa0\\xa1\\x89\\x0f\\x6a\\x40\\xa7\\xef\\x57\\xc6\\xe5\\xe5\\xed\\x04\\x02\\x80\\xdf\\x07\\xe7\\xf4\\x8f\\xe8\\x19\\xbe\\x63\\x17\\x67\\x10\\x75\\x7c\\xb6\\xe4\\x40\\xb4\\xf7\\x8b\\x57\\x59\\xdc\\xe0\\x28\\xbf\\x58\\x5b\\x3c\\x3f\\xec\\xa1\\xcf\\x59\\x81\\xda\\xda\\xdf\\xd2\\x7e\\xa1\\x24\\xaf\\x45\\xef\\x63\\x85\\x42\\xa8\\x61\\x7f\\xf4\\x9f\\x94\\x70\\xac\\x22\\x85\\x94\\x3c\\x7c\\x3b\\x11\\x63\\xb9\\x03\\x95\\x5a\\xb9\\x9b\\x6e\\xab\\x17\\xf4\\xd4\\x9f\\xfa\\x87\\x20\\x7a\\xbb\\xfc\\x11\\x1c\\x4b\\x91\\xf5\\x41\\x3d\\xfc\\x9b\\xea\\x31\\x84\\x3d\\x11\\x5d\\xde\\xb1\\xda\\x40\\xb4\\x5f\\x58\\xf4\\x7c\\x41\\x7b\\x5e\\x77\\xd5\\x81\\x89\\x34\\xe7\\x30\\xeb\\xa9\\xc4\\x55\\x7b\\xbf\\x48\\xcb\\x7f\\xd4\\xe6\\x64\\x55\\x8a\\xf4\\xfb\\x44\\xee\\x3d\\x94\\xc1\\x6e\\x88\\x36\\x31\\xf3\\x84\\x76\\xf4\\x83\\x7d\\xb9\\x4d\\x54\\x12\\x2f\\xa1\\x34\\xca\\x51\\xa5\\x25\\xaa\\xd5\\xe2\\x4b\\x76\\x01\\x8f\\xee\\x9a\\x2e\\x8f\\x60\\xe2\\xbb\\x48\\xd2\\x4a\\xb8\\xb1\\x46\\xf8\\x4f\\xfa\\x98\\x20\\x12\\x0e\\x7c\\x50\\xd4\\x5c\\x0c\\xfb\\xe3\\x5c\\x8c\\x31\\x41\\x9b\\x07\\x8e\\x90\\x71\\x2c\\xfe\\x93\\x4c\\x3b\\xe3\\xa9\\x4f\\xf2\\x15\\x88\\x73\\xae\\xfe\\x34\\xdc\\x6e\\x36\\x90\\x2b\\x16\\x75\\xe1\\xa4\\x7c\\xb6\\x08\\xdf\\xe9\\x60\\xfb\\x4d\\xa8\\xd2\\xa8\\x49\\x0c\\xc3\\x8e\\xba\\xdc\\x73\\xa1\\x00\\x3c\\x49\\x41\\xfd\\xa8\\xfa\\xe9\\x44\\xa1\\xde\\x8e\\x3b\\x10\\xef\\x6d\\x9e\\x67\\xce\\xec\\x74\\x59\\x77\\xd3\\x33\\xac\\x9e\\x71\\x21\\x41\\x21\\xed\\xe8\\x89\\x22\\x95\\xe2\\x77\\x99\\xf2\\x06\\x67\\x5a\\x9d\\x54\\xac\\x12\\x15\\x9d\\x3a\\x1f\\x95\\x4f\\xd0\\xee\\xff\\xbd\\x30\\xa3\\x19\\x04\\xfb\\x2e\\xee\\x77\\xa8\\xaa\\x9d\\xc4\\xcc\\xbb\\xe2\\x85\\x10\\x96\\x14\\x6a\\x4c\\xe0\\xe8\\x1f\\xb9\\xc6\\x24\\x98\\xdb\\xd8\\x3b\\xf8\\x3b\\x55\\x02\\x9a\\x5e\\x90\\x00\\x86\\xb9\\x53\\x1c\\xe3\\x24\\x7a\\x98\\xf8\\x65\\x4e\\xfd\\x8f\\xe7\\xa8\\x36\\x43\\x1f\\x75\\xda\\xf0\\x86\\x8f\\x01\\x08\\x32\\x6e\\x23\\x02\\x6d\\x2d\\xb4\\xa7\\x21\\x24\\xec\\x4e\\x39\\xd4\\xbb\\xf3\\xd8\\x46\\xc9\\xf5\\x1c\\xa3\\xcc\\x31\\xeb\\x1d\\x02\\xc2\\xba\\x32\\x1e\\x46\\x19\\xf2\\xb6\\x59\\xc0\\xbf\\x0f\\xe5\\xc1\\x9b\\x21\\x3f\\x3c\\x79\\x12\\x4f\\x36\\x43\\xf7\\x4d\\xd0\\xff\\x9c\\xe5\\xd2\\x77\\x27\\xbe\\x6c\\x69\\x58\\x15\\x9c\\x16\\x44\\x04\\xf4\\x33\\x01\\xfe\\x17\\x42\\xe2\\x79\\xde\\x9e\\xfd\\x44\\x1e\\x73\\xe4\\xea\\x7a\\x84\\x25\\x87\\xa7\\x9d\\x11\\x5d\\x36\\xec\\xa9\\xc0\\x3c\\x90\\xff\\x0d\\x14\\x74\\x74\\x10\\x9f\\xc2\\x0a\\x91\\xd7\\xb3\\xcc\\x22\\xeb\\xcb\\xb8\\xc7\\xf7\\x1b\\xd6\\x1e\\x8c\\xae\\x47\\xc5\\x05\\x0c\\xec\\x1d\\x48\\x49\\xa1\\xd4\\xa8\\xe7\\xa6\\xf8\\x45\\x54\\x84\\x37\\x70\\x6c\\x25\\x33\\x1c\\x9e\\x57\\xc2\\xcc\\x6d\\xa1\\x17\\xf2\\xe5\\xa0\\xf4\\xb3\\x68\\xc4\\xcb\\x20\\x62\\x65\\xc4\\x17\\x8e\\x06\\x55\\xff\\x67\\x5f\\xfc\\x1d\\x4c\\x58\\xec\\xeb\\x9e\\xdb\\x4d\\xa3\\xad\\x2c\\x5f\\x62\\xcd\\x13\\xab\\x48\"},\n{{0x85,0xd3,0x23,0x30,0xe2,0xe0,0x73,0xa4,0x60,0x30,0xca,0x0e,0xe2,0xdf,0x2f,0x8e,0xb8,0x74,0xa9,0xfd,0xdf,0x56,0x24,0xc8,0x03,0x17,0x75,0x11,0x1f,0x11,0xee,0xa2,},{0x6e,0xa7,0xde,0x2e,0xd5,0xea,0x5c,0xdf,0x50,0xbf,0xff,0xee,0x77,0xf7,0xbd,0x2f,0xcc,0x21,0xd4,0x86,0x66,0xbb,0x1f,0x48,0x90,0xc7,0x6a,0x69,0xcc,0x7b,0xa4,0xe8,},{0x41,0x43,0x63,0xfe,0xad,0x6e,0x59,0xa3,0x43,0x8c,0xe5,0xa3,0xa2,0x77,0xd6,0x2b,0xdd,0x00,0xfa,0x2e,0xfa,0xc6,0x46,0x3d,0xd1,0x3f,0xcd,0xde,0xd9,0x3a,0x7f,0x10,0x8a,0xe1,0xf5,0x28,0xff,0xc8,0xff,0x4e,0xca,0x33,0x1d,0xab,0x91,0xae,0x5b,0x14,0x16,0xe2,0xdd,0xb7,0x3b,0x6d,0xaf,0x85,0x3b,0x03,0xc8,0x1e,0x99,0x36,0x56,0x0a,},\"\\xae\\x61\\x07\\xf3\\x8f\\xf9\\x4e\\xd0\\x32\\x79\\x03\\xcb\\xaf\\x6c\\x3e\\x3a\\x34\\x98\\xc4\\x7a\\xbb\\x29\\x89\\xa8\\xb3\\x7b\\x3a\\x19\\xdf\\x88\\xc6\\xde\\x79\\x0a\\xcc\\xb4\\xb7\\x25\\x81\\x77\\xb9\\x15\\x1d\\x1f\\xe0\\x40\\x63\\x57\\x7d\\x3c\\x3a\\xcd\\xb4\\xc9\\x29\\x96\\x8a\\xfd\\xad\\x6f\\x25\\x2a\\x67\\xed\\x4c\\xa8\\x9d\\x06\\x0f\\x1a\\x46\\x53\\x98\\x3f\\x7a\\xb5\\x8d\\xdb\\x93\\xe2\\x87\\x8f\\xba\\xb0\\x63\\x7d\\xbb\\xeb\\x95\\xd2\\x5c\\x59\\x86\\x83\\x9d\\xe2\\x74\\x8d\\x9f\\x34\\x02\\x7a\\xee\\xbf\\x1d\\x9e\\xb9\\x36\\xcb\\x67\\x70\\xe0\\x8d\\x45\\xb8\\x09\\x5b\\xac\\x9c\\xbb\\x71\\xdb\\x14\\xe8\\xa3\\x42\\x22\\xb1\\xf2\\x23\\x7b\\x9f\\x0b\\xc9\\x76\\x6a\\x23\\x1a\\x6d\\x10\\x27\\x99\\xf7\\xc0\\x81\\xd5\\x00\\xfb\\xea\\xde\\x60\\x3c\\xdc\\xdd\\x7d\\x5b\\x96\\x5f\\xba\\xce\\x4b\\xe5\\xc2\\xcd\\x93\\x2d\\xcf\\x5f\\x6e\\xd3\\x17\\x22\\xf4\\x1d\\x5a\\x36\\x3b\\x34\\xba\\xbf\\x3f\\x63\\x6f\\xb3\\x03\\x82\\x4a\\xa7\\x01\\xdf\\xe1\\xd3\\xe4\\x12\\x63\\x07\\x8c\\x1e\\xbb\\xdc\\xb1\\xf7\\x3f\\x12\\x45\\xb8\\x3e\\x3f\\xa7\\x0a\\xb8\\xe3\\xf1\\x41\\x3e\\x6b\\x06\\xbd\\xae\\x02\\x2b\\x71\\x4d\\x60\\xa4\\x01\\xd5\\x74\\x80\\xdc\\x64\\xe7\\xaa\\xc6\\xd3\\xde\\x85\\xfc\\x94\\xd8\\x53\\xca\\x13\\xb7\\xe6\\x74\\x15\\x57\\x9d\\x5c\\x67\\x21\\x23\\xa5\\xaf\\x19\\x4b\\xee\\x14\\xae\\x35\\xdc\\x27\\x24\\xff\\x20\\x9f\\x11\\x66\\x63\\x86\\x61\\xf8\\x81\\xb1\\x19\\x4a\\xa4\\xe3\\x1b\\x42\\xa5\\x27\\x96\\x47\\x81\\x59\\x15\\x04\\xba\\x76\\x10\\x3f\\x97\\xb7\\xf5\\x52\\x03\\x15\\x47\\x3e\\xc9\\x4b\\xb0\\x17\\xa1\\x66\\x67\\xb2\\x2a\\x85\\x76\\xa7\\xcc\\x2a\\xc0\\xb7\\x75\\x63\\x03\\xc7\\x56\\xf0\\xdd\\xaa\\xe9\\xd0\\x18\\x9e\\x6c\\x8d\\xe3\\x49\\xf9\\x19\\x57\\xc7\\x2a\\x52\\x9e\\x9f\\x7e\\x9b\\x94\\x56\\x52\\x48\\x40\\xba\\x02\\x34\\x4f\\x55\\xad\\x3c\\x11\\xa0\\xb2\\x59\\x90\\x14\\x39\\xf2\\x65\\x5a\\xb9\\xf8\\xc6\\xc8\\xe8\\xe9\\x60\\xc0\\x57\\xd9\\xc7\\xda\\xfe\\x42\\x5c\\x75\\xd4\\xa3\\x3b\\x80\\x1d\\x45\\x47\\xcd\\x05\\x51\\xa6\\x80\\x2a\\x80\\x05\\xdd\\x72\\x42\\x47\\x64\\xdc\\xf5\\x7e\\x4a\\xa2\\x22\\x90\\xea\\x4f\\x5b\\xaa\\xc5\\x1d\\x79\\x39\\xc0\\x53\\x42\\x88\\x2e\\xe1\\x43\\x80\\xef\\x2d\\x47\\x04\\xb4\\x19\\x49\\xb2\\x28\\x2a\\x1e\\x1a\\x3f\\xa7\\xdd\\xea\\x9f\\xe8\\x3b\\x9f\\xc5\\x1d\\x4e\\xef\\xa2\\xeb\\xac\\x72\\x2e\\x4c\\x0a\\x7c\\x59\\x9b\\x69\\x25\\xf0\\x1b\\x8a\\x20\\x66\\xdc\\x0c\\x26\\xf9\\x21\\x96\\xf4\\xf5\\x03\\xe8\\x87\\xc1\\xe6\\xef\\xb0\\x93\\xf1\\x53\\x13\\x87\\xbd\\x88\\xc6\\x91\\x99\\x7b\\x9b\\x89\\xe3\\xcd\\xf7\\xda\\x12\\xd3\\x73\\x41\\x83\\xa4\\xb6\\x12\\x6b\\xe9\\xe0\\x77\\x47\\x04\\xb5\\x29\\x65\\x9b\\x55\\x48\\xf1\\xb8\\x75\\x12\\xcc\\x18\\x78\\xca\\x4e\\xf5\\x59\\x90\\xb4\\x83\\xc9\\xaf\\x6a\\xa9\\x76\\x35\\xf4\\xf0\\x79\\x49\\x72\\x70\\x65\\xab\\xf2\\x1e\\x21\\xe3\\x29\\x90\\xb1\\xa7\\xd0\\x7d\\x74\\xe0\\x2d\\x9b\\x07\\xec\\x63\\x99\\x31\\xbf\\x9e\\x2c\\xa3\\x94\\x1f\\x2b\\xa6\\xb5\\xef\\x14\\xdc\\xc2\\xa2\\x47\\xd2\\x11\\x7e\\x9c\\xb4\\x1e\\xfa\\x3f\\xcc\\xa2\\x47\\x16\\x64\\x14\\x52\\xbe\\xed\\x2f\\x92\\x65\\x7c\\x2f\\xb7\\x31\\xf0\\xb9\\x4e\\x8c\\x89\\x2a\\x81\\xbb\\xa9\\x1f\\x63\\x9d\\xf4\\x37\\x96\\xac\\xd3\\x01\\x3a\\xc0\\x44\\xf6\\x08\"},\n{{0x66,0x59,0x0d,0x36,0x99,0x84,0xc6,0xf5,0xad,0x3a,0x89,0xc7,0x8d,0xdf,0xca,0x10,0xa0,0xa7,0x65,0x79,0x95,0xdc,0x01,0x88,0xb6,0xb5,0x7a,0xc3,0x16,0x47,0x31,0xa4,},{0x98,0x87,0x3a,0xb1,0x33,0x46,0xee,0x48,0x67,0x7c,0x4f,0x86,0x12,0xdb,0x31,0xeb,0xd1,0x3d,0xb5,0x8b,0x2b,0x03,0x4f,0xd1,0x55,0xaf,0xa8,0x72,0x0f,0x4e,0x93,0xe8,},{0xf0,0xdb,0x63,0xa1,0xbc,0x76,0x24,0x16,0x1c,0xa0,0x06,0x38,0x53,0xb2,0xde,0xe4,0x5f,0xcc,0xd2,0x24,0x71,0xe0,0x12,0x36,0x6f,0x86,0x8a,0x4a,0x9c,0x74,0x65,0x4e,0x13,0xf1,0xa3,0x15,0xad,0x83,0x91,0x6e,0xbf,0xb8,0xdc,0x31,0xa4,0x20,0xf8,0x3c,0xf6,0x45,0xc4,0xc9,0xd1,0x6b,0xb4,0xd5,0xd9,0x9d,0x23,0xc7,0xb4,0x3e,0x23,0x00,},\"\\x2e\\xc1\\xc6\\xb0\\x82\\x97\\x37\\x83\\x2c\\x9c\\x79\\x8a\\x92\\xeb\\x49\\x0b\\x23\\xd3\\x34\\xc3\\xbb\\xe6\\x27\\xcb\\x58\\x2d\\x17\\xa9\\xe4\\x29\\x60\\xef\\xcd\\xc7\\xd3\\x47\\x50\\xe0\\xb4\\xaa\\x86\\x4c\\x20\\x4f\\xb8\\xd6\\x2b\\x47\\x99\\x2e\\x91\\xdb\\xfc\\xfd\\x69\\xf5\\x1d\\x93\\x7d\\xc0\\x6c\\x48\\xc0\\xad\\x43\\xe8\\x59\\x83\\x71\\xcd\\x0e\\x3b\\xbc\\xe4\\x16\\xbf\\xd4\\x4b\\x09\\x44\\xb9\\x93\\xaa\\x29\\x93\\xfd\\xea\\x48\\x71\\x34\\xcd\\xe4\\x22\\x77\\x72\\x3e\\x06\\x83\\xec\\x98\\xe6\\x95\\x95\\xe9\\xb7\\xb1\\x4c\\x8c\\xf9\\x61\\x7a\\x1e\\x30\\xdd\\xb8\\x06\\x0e\\xac\\xba\\x48\\xd8\\x82\\x53\\xb1\\x65\\x33\\x61\\x08\\xde\\x0c\\xb0\\x2f\\xf2\\x0f\\x54\\x24\\xb5\\x67\\x83\\x08\\x69\\xc9\\xb4\\x32\\x9c\\x99\\x45\\xf0\\xbf\\x2f\\x3c\\x7a\\xcd\\x1e\\x77\\x43\\x58\\x93\\x0c\\xd8\\x90\\xfd\\x9c\\xb8\\x64\\xd9\\x50\\x93\\x5a\\xd8\\xa4\\xa3\\xbe\\xcc\\xae\\x8f\\x83\\x3f\\x63\\x56\\x19\\x13\\x71\\xc3\\x26\\x33\\xdc\\xf8\\x82\\x70\\x9b\\x0d\\x98\\xbd\\x80\\x7b\\x38\\x3a\\xed\\x8d\\x7b\\xb0\\x97\\xb6\\xe2\\x62\\xef\\x70\\x0c\\x9d\\x76\\x8f\\x4b\\x56\\x90\\xe3\\xa1\\xa8\\xf2\\x17\\x55\\xd6\\x58\\xdb\\x2d\\x1b\\xfd\\x2f\\x70\\x71\\xe0\\xca\\xec\\x7c\\x2c\\x53\\x81\\xc5\\xef\\x5c\\x2c\\x22\\x81\\xc6\\xbc\\xed\\xc8\\x67\\x39\\x0b\\x90\\xf3\\xb2\\x7b\\x0f\\x0f\\x64\\xa3\\x36\\x58\\x57\\x8a\\x5c\\x0d\\x66\\xe2\\x11\\xe6\\xff\\xf6\\xe8\\x64\\x88\\xac\\xf8\\x2b\\xc0\\xf5\\xe2\\x66\\x4b\\x83\\x69\\x90\\x46\\x03\\x7c\\x0d\\x33\\xd3\\x40\\xff\\x98\\xed\\x62\\x63\\x35\\x4c\\x24\\x27\\x31\\x36\\xff\\x0e\\x4f\\x0f\\x23\\x3a\\x6c\\x82\\x54\\xfc\\x0c\\x90\\x76\\x43\\x30\\xe3\\xb1\\x05\\x7b\\x1e\\x66\\x6d\\x5e\\xcd\\x5a\\x2e\\xfe\\xaa\\x6a\\x10\\x5b\\xfc\\x85\\x84\\x31\\xb8\\x8e\\xd7\\xfe\\x55\\x1e\\xb3\\x2a\\xc0\\xaf\\x27\\xc6\\x6a\\x98\\x03\\xa3\\xbc\\xf8\\x76\\x34\\xc6\\x6c\\x70\\x66\\xdd\\x01\\x97\\xa3\\xcb\\xd2\\xd6\\xf4\\xe6\\x5c\\xfd\\xb8\\xf3\\xda\\xf9\\xf3\\xca\\x5c\\x4f\\x4e\\x0a\\xdd\\x45\\xf5\\x54\\x1a\\xa1\\x8d\\x04\\x1f\\x70\\x6e\\x4f\\xa8\\x7c\\x34\\xe9\\xa2\\x23\\xd8\\x85\\x72\\xeb\\x50\\x08\\x3e\\xe8\\xc7\\xc4\\x75\\xdf\\x56\\x8b\\xc7\\x3b\\xd0\\x8c\\x0f\\x0d\\xea\\xa3\\x74\\xaf\\xb1\\xc1\\x78\\xd0\\xdd\\xdb\\x23\\x6e\\x15\\xa8\\xbc\\x23\\x85\\xed\\x3f\\x52\\xb8\\x76\\x1e\\x63\\x78\\x87\\x40\\x7a\\x20\\xae\\xc3\\xe9\\x9e\\xc8\\x30\\xda\\xe3\\x16\\x7e\\xf0\\xcd\\xb3\\xf3\\xff\\xd2\\x00\\xd8\\x3b\\x75\\xb7\\x49\\x69\\x0b\\x9e\\x25\\xe2\\x17\\x1d\\x07\\x2c\\xa5\\x6f\\x71\\xba\\xec\\xd2\\x1f\\x7d\\x45\\xa1\\x2c\\x91\\xb2\\xc0\\xfb\\x3f\\xea\\x3b\\x15\\x8e\\x54\\x64\\x82\\x84\\xbb\\x00\\x95\\xb3\\x62\\x44\\xb0\\xb1\\x21\\xf9\\xf1\\x38\\x4c\\xe9\\x00\\x43\\x65\\xe7\\x77\\x2f\\xa3\\x08\\x28\\x25\\x0f\\x51\\x98\\x5f\\x1b\\x17\\xb2\\xd2\\xf8\\x0a\\x33\\xe8\\xfc\\x6d\\x85\\x65\\xea\\x15\\xcd\\xaa\\xcd\\x42\\xa8\\x7b\\xd7\\xc9\\x40\\x8b\\x1f\\xe1\\xc7\\x70\\x66\\x5b\\xdd\\xed\\x75\\x4b\\xc2\\xff\\x2e\\xf9\\x1b\\x97\\x3a\\x86\\xb9\\x9f\\x10\\x59\\xc6\\xf2\\x27\\x24\\x6a\\x69\\x8b\\x38\\x54\\x15\\x09\\xdd\\x54\\x49\\xfc\\xe6\\x0d\\x38\\x62\\x24\\x18\\x3b\\x7d\\xce\\x1b\\x38\\x84\\xf7\\xba\\xe1\\xc2\\xe4\\xeb\\x59\\x45\\x10\\xb5\\xca\\x58\\x52\\x79\\xd9\\x04\\x1d\\xf8\\x81\\x7b\\x06\\x19\"},\n{{0x41,0xcf,0x07,0x1f,0x48,0x42,0xec,0xd4,0x94,0x19,0x1b,0x8c,0xf2,0x8c,0xc0,0x92,0x31,0x85,0xef,0x1b,0x07,0x45,0x8a,0x79,0xa5,0x9a,0x29,0x6d,0x35,0x49,0x82,0x2e,},{0x6d,0xc8,0xe4,0x46,0xdb,0x1d,0xa3,0x53,0xb5,0x8d,0x0c,0x45,0xd8,0xb4,0xd8,0x16,0xba,0x59,0xe2,0x5b,0xb6,0x80,0x71,0x2d,0x62,0xd6,0xd3,0xdb,0xf7,0x8d,0x06,0x98,},{0x41,0x05,0x2b,0xc4,0x17,0xb2,0x4d,0xc4,0x83,0x83,0x96,0x6a,0xf0,0x14,0x3f,0x9c,0x0b,0xa8,0x5b,0xbe,0xfb,0xda,0xf7,0x91,0xb1,0x6a,0x4d,0xad,0x1f,0x57,0x0e,0xb8,0x07,0x03,0xc0,0xa2,0xcd,0xeb,0x2f,0x7a,0xd6,0xdc,0xd3,0xfa,0x7b,0xdb,0x5c,0x22,0x5e,0x86,0x9c,0xd8,0xfb,0x27,0x8d,0xff,0x06,0x67,0xd3,0x8a,0xcc,0xf3,0xdb,0x08,},\"\\xda\\xeb\\x5f\\x0e\\x84\\xf1\\x59\\x0b\\xca\\x2b\\x9d\\x97\\x19\\xef\\x5d\\x1c\\xfa\\x79\\xe0\\x58\\x34\\x46\\x33\\x2f\\x18\\xe9\\xe4\\xfe\\xb0\\xb1\\xf1\\x53\\x40\\x29\\x7a\\xc9\\xad\\x67\\x24\\xc8\\x5b\\xb1\\x65\\x58\\xea\\x54\\xeb\\x5d\\x70\\x2a\\x47\\x24\\x8b\\xad\\xc6\\x25\\x2a\\x80\\x43\\x71\\xb7\\x4c\\xfe\\x10\\x62\\xd1\\xdb\\xa1\\xec\\x68\\xfd\\x1d\\x4d\\xd0\\x29\\xcb\\x55\\x03\\x4b\\xbf\\x61\\x06\\x82\\x51\\xef\\xf3\\x98\\x36\\x36\\xf6\\xde\\xbd\\x57\\x27\\xbe\\x91\\x99\\x3b\\x3e\\x4d\\x0a\\xbc\\x96\\xec\\x19\\x64\\x21\\xa4\\x7b\\x78\\x93\\xf8\\x39\\x86\\xd6\\xc0\\x32\\x3f\\x0d\\x19\\xaa\\xf2\\xcd\\xe9\\xd3\\x56\\x5c\\x10\\x4c\\x9d\\x31\\x76\\xec\\xb5\\xed\\x5e\\x17\\x3f\\xee\\x52\\xb5\\xa0\\xc4\\x2b\\x6a\\xb2\\xfc\\xb1\\xcc\\xba\\x96\\x49\\xc2\\xc6\\x7c\\x52\\x0e\\x9b\\x96\\xce\\xa6\\x93\\xdf\\x3e\\x58\\x60\\x9a\\xd6\\xa0\\xbd\\x52\\x2e\\xfa\\xaf\\x03\\x85\\x8d\\x24\\x5d\\xd0\\xa3\\x8f\\x84\\xa2\\xfb\\x10\\x20\\xf4\\xdd\\x97\\xc3\\xae\\xef\\x0e\\x24\\x47\\x7d\\x30\\xd2\\x56\\x70\\x1e\\x90\\x0b\\xef\\x26\\xa8\\xa6\\x26\\x9a\\xb6\\x60\\xd7\\x42\\x93\\xa2\\xbf\\x1d\\x20\\xc2\\xcf\\xae\\xbb\\x7c\\x28\\x20\\xf5\\xf5\\xb0\\x74\\x53\\xbb\\x69\\xee\\x76\\x9b\\x52\\x39\\x15\\x39\\xf0\\xc6\\x06\\xd2\\x2e\\xb3\\x92\\x3e\\xe6\\xf5\\xa1\\xd4\\x60\\x50\\xaf\\x90\\xf0\\x11\\xf8\\x51\\xac\\xe7\\x63\\x27\\xd3\\xd1\\x8c\\x48\\x17\\x0a\\x9a\\x25\\xb0\\x4b\\x77\\x0f\\xd9\\x38\\xef\\x8a\\x30\\xb7\\xbd\\x03\\x39\\x1d\\xd3\\x6c\\x51\\x6b\\x62\\xf0\\xcb\\x78\\x67\\x07\\x40\\xe0\\x0e\\x69\\x59\\x5c\\x41\\x8d\\x96\\x72\\x53\\x82\\x0b\\x75\\x4c\\x4f\\xd6\\x66\\xe3\\xcc\\xe1\\x6e\\xe0\\xc9\\x41\\x83\\xbb\\xea\\x70\\x6f\\xe2\\x98\\xe1\\xc9\\x9d\\xdb\\x82\\x12\\x17\\xed\\x90\\x08\\xcc\\x8e\\x8b\\x83\\xbc\\x8b\\x81\\x99\\x15\\xb0\\x7b\\x14\\x6f\\xe7\\x45\\x02\\x4a\\xc3\\xc4\\x61\\x16\\xcb\\x4c\\xce\\x5e\\x32\\xec\\x5d\\x75\\x24\\xa2\\x38\\x8d\\x9f\\xe2\\x97\\xeb\\x02\\x81\\x1a\\xf4\\x54\\x6f\\xcd\\x58\\x60\\xe1\\x4c\\x0d\\x13\\xf0\\x3d\\xd7\\x5a\\x42\\x49\\x61\\x59\\x00\\x07\\x8a\\x3c\\x35\\x8c\\x53\\x42\\x96\\x2b\\xc1\\xbe\\xac\\xf6\\x8c\\x24\\x68\\x21\\xa4\\x59\\xab\\x53\\x21\\xec\\x9f\\x57\\x4f\\x49\\xd1\\x03\\x89\\xf4\\x0f\\x14\\xdd\\xfc\\x85\\x13\\xff\\xe3\\xde\\xaa\\x73\\x36\\x03\\x5a\\x67\\x5f\\xa5\\x85\\x8b\\x49\\x0c\\x5d\\x24\\x77\\x80\\x06\\x4a\\xdb\\xaf\\x75\\xa7\\x63\\x35\\xee\\xc9\\xab\\x91\\x87\\x71\\xb0\\xb1\\xdf\\x51\\x47\\x64\\x2a\\xef\\x4a\\x16\\x6a\\xb1\\x72\\xed\\x60\\x1f\\xed\\x21\\x0f\\x6c\\x0c\\xff\\xd9\\x18\\x69\\xf7\\x49\\x0b\\x57\\xe7\\xc6\\x52\\x41\\x86\\x3e\\x7e\\x8c\\x0a\\x26\\xeb\\xa6\\x3b\\x53\\x42\\xd0\\xfd\\x82\\x14\\xac\\x73\\x1e\\x1c\\x43\\x8d\\x01\\x77\\x11\\x5f\\x6a\\x19\\xe0\\x93\\x5c\\x7a\\xf6\\xbc\\x7d\\xbe\\xb7\\x55\\x11\\xd9\\xbd\\x8e\\x63\\xe3\\xe2\\xf4\\x7a\\xb0\\xdd\\x1c\\xed\\xd7\\xb1\\x80\\xd7\\x4a\\x4b\\x44\\xd4\\x61\\x19\\x7a\\xef\\xdd\\x36\\x20\\x46\\x51\\x66\\xa3\\x9b\\x45\\x39\\x50\\x43\\xce\\x88\\x74\\xcd\\xd7\\x2c\\x60\\x2b\\xd3\\xd2\\xee\\xcb\\xad\\x34\\x66\\xb5\\xcb\\x1a\\xa4\\x1a\\xe9\\x2a\\x8a\\xfe\\xf2\\xd7\\x64\\xce\\xc0\\xc4\\x49\\xd2\\x7e\\xfa\\xc4\\x37\\x93\\x8f\\x28\\x0b\\xea\\x9c\\x50\\xa5\\x82\\xe5\\x7c\\x27\\xf9\\xb3\\xde\\x87\\x2f\\x0c\"},\n{{0xa2,0xc8,0xe1,0x61,0xa8,0xd9,0xd6,0xe8,0x88,0xc3,0xd0,0x9b,0x0b,0x97,0x27,0x37,0x30,0x7a,0x2c,0xbd,0x2a,0xcd,0x7c,0xcd,0x80,0x4d,0x24,0x31,0xac,0x6c,0x58,0xd2,},{0x3a,0x32,0x57,0x75,0x88,0x67,0x32,0xde,0xca,0x40,0x68,0x57,0xa8,0x05,0x60,0x10,0xaa,0xea,0x28,0x75,0x54,0x5b,0xa6,0xf3,0xdf,0x30,0x75,0x45,0x71,0x38,0x69,0x92,},{0x56,0x0d,0x01,0xb9,0x4d,0xf1,0x1d,0x83,0x34,0x77,0x52,0xff,0x51,0xb3,0x54,0x5e,0xf5,0x5c,0x56,0x32,0xae,0x7c,0x8e,0xfb,0x11,0xaa,0xdd,0x83,0x12,0xde,0xf7,0x25,0x62,0xe8,0xf5,0xd7,0x5e,0xce,0x10,0xad,0x46,0xbc,0x96,0xc8,0x60,0xde,0xec,0xe3,0x9e,0x63,0x4a,0x5f,0x50,0x65,0x4d,0x4c,0xdb,0xa8,0x4a,0x8e,0x6f,0x70,0x24,0x0a,},\"\\x83\\xa3\\xbe\\xbc\\xac\\x5f\\x28\\xc5\\x43\\x3e\\x3c\\x4f\\x1e\\x7b\\xf5\\xd2\\xe4\\xdc\\xd2\\xf5\\xe5\\x9d\\xbe\\xe0\\xa8\\x3b\\x07\\x02\\x57\\x15\\x35\\x07\\x46\\xf8\\x56\\x75\\xf1\\xdf\\xea\\x37\\x4a\\xa7\\xd7\\x94\\x28\\x7b\\x89\\x2e\\xf9\\x09\\x7f\\xf6\\xd2\\xe1\\x22\\xf0\\xa6\\x56\\xfb\\xa0\\x79\\x8c\\xdc\\xfc\\xb3\\x64\\x5d\\xfc\\xfd\\x78\\x8c\\x74\\x0c\\x0f\\xd0\\x45\\x20\\xe7\\xa0\\x6a\\x02\\xa0\\x58\\x29\\x63\\x0a\\x2b\\xf0\\xcd\\xfe\\x2e\\xcc\\xa0\\x09\\xec\\x44\\x04\\x99\\x46\\xbb\\x1d\\x23\\x26\\xdd\\xd6\\x1d\\x7e\\xc6\\x40\\xbf\\x69\\xeb\\x44\\xfb\\x23\\xcc\\x1f\\xf4\\x78\\xc5\\x70\\xc7\\x5d\\xb7\\xe7\\x66\\xe3\\x5b\\x7c\\x43\\xdb\\x73\\x68\\x0d\\x14\\x07\\xa9\\x43\\x99\\xfb\\x62\\x1b\\xaf\\x38\\x45\\x74\\x5c\\x1c\\x4e\\xd0\\xb9\\xf0\\xb4\\x85\\xbe\\x2d\\x53\\xc5\\x68\\x54\\x5d\\xdf\\x18\\x77\\x5a\\x83\\x7a\\x05\\xd9\\xc9\\x15\\x7b\\x08\\x4e\\x8c\\xd0\\x1f\\xc3\\x24\\xf0\\x7f\\x11\\x68\\x77\\xe4\\x07\\x5d\\xba\\x24\\x32\\xc8\\xa7\\x75\\x2e\\x9e\\x93\\x95\\x86\\xad\\x93\\xf0\\xc0\\xaa\\x5e\\xda\\xc9\\x4b\\x8d\\x82\\xe5\\x44\\x99\\x97\\xb1\\x5b\\x8c\\x89\\x61\\x58\\x9c\\x44\\x28\\x21\\xaa\\x83\\xb6\\x02\\x39\\xec\\x5f\\x15\\x8c\\x3f\\x5e\\x9e\\xc5\\xbe\\xa5\\x11\\x5d\\x5f\\xed\\x61\\x91\\x8e\\x8f\\xcd\\x5b\\xce\\x61\\xc7\\x77\\xf2\\x0b\\x6b\\xfe\\x80\\x3a\\x69\\xc6\\xfc\\x79\\x4a\\xb8\\xc5\\x7d\\xf2\\x71\\xda\\x86\\x38\\x72\\xa6\\x13\\x35\\xb1\\xfa\\x29\\xf4\\x60\\x8f\\xf0\\x37\\xf7\\x12\\x06\\x98\\x09\\xca\\x64\\x2a\\x03\\x07\\xc7\\x9a\\xa9\\x2e\\x10\\xcb\\x89\\x3a\\x29\\xd1\\x72\\x01\\xa0\\xb6\\xd1\\xb4\\x6a\\x72\\x12\\xb3\\xba\\xec\\x97\\x03\\xc0\\xb0\\x39\\x2b\\xa6\\xb7\\x6e\\x5c\\x9c\\x10\\xf8\\x35\\x99\\xb8\\x1e\\xa2\\x22\\x83\\xf9\\x54\\x7a\\xac\\xda\\xa7\\xf3\\x08\\x96\\xd1\\xff\\x73\\x1e\\x11\\xfb\\x9e\\x56\\xad\\x06\\x03\\x04\\x17\\x11\\x98\\x05\\xba\\xb6\\x35\\x21\\x49\\x6c\\x3b\\xb9\\x2a\\x12\\xf5\\xe5\\x5a\\xfc\\xf6\\x0e\\xd4\\x21\\x77\\x37\\xf3\\x04\\x6b\\x16\\xca\\x50\\x66\\x57\\xa6\\xd6\\x96\\xd7\\x5a\\x6d\\x8e\\x18\\xe9\\xef\\xe2\\xb0\\x8c\\x8b\\x1f\\xa0\\x72\\x82\\x38\\xe2\\x7c\\xfb\\x32\\x21\\x66\\xee\\xe4\\xee\\x76\\x96\\x8b\\x77\\x7b\\x50\\xee\\x6a\\x2b\\x80\\x4e\\x1e\\x9b\\x46\\x01\\x66\\x20\\x13\\x2b\\x65\\x88\\x71\\x8d\\x97\\x8c\\xa2\\xc0\\x02\\x69\\x79\\xc4\\x00\\xd3\\xc5\\x33\\x67\\x51\\x21\\x0f\\x0b\\x00\\xd2\\x69\\xec\\x8f\\x4e\\x2f\\x95\\x59\\xe1\\x80\\x33\\x2d\\xd2\\x70\\xe5\\x0c\\xc9\\x46\\x5c\\x55\\x58\\x93\\x63\\x55\\x52\\x1b\\xc3\\xc9\\x56\\x0f\\xc1\\x9e\\xc1\\x42\\x42\\x12\\x1e\\x6b\\xb2\\xff\\xf8\\xf5\\x03\\x37\\xfc\\x26\\x4a\\xcf\\x1a\\xc1\\x70\\x43\\x28\\x33\\x4b\\x3b\\x52\\xcb\\xa9\\x6d\\x93\\x03\\xb1\\xb5\\xdb\\x85\\x9d\\xae\\x31\\xd8\\x0f\\x17\\x11\\xfb\\xa2\\x51\\xe1\\x0b\\x4d\\x12\\x21\\x28\\xf9\\xfa\\xff\\x68\\x72\\xd0\\xc0\\xb8\\x1e\\xef\\x59\\x54\\x1f\\x83\\x2b\\x0a\\x9d\\xf3\\xa4\\xcd\\xd5\\x91\\xc8\\x77\\x36\\xb1\\xae\\xcf\\x24\\x2c\\x27\\x5a\\x10\\xc3\\xfd\\x67\\x83\\x9d\\xad\\x4e\\xf3\\x99\\xb9\\x49\\x4e\\xcd\\x77\\xf7\\xba\\x5b\\x5d\\x4f\\x2c\\xa3\\x04\\xe5\\xb2\\x29\\x21\\x30\\x7c\\xb1\\x8f\\xa6\\x4a\\xa3\\xd0\\x1c\\x44\\x11\\xc8\\x36\\x9c\\xce\\xde\\x46\\x5e\\xe3\\x69\\xee\\x63\\x7d\\x43\\xd2\\x88\\x26\\xbf\\x60\\xdd\\xde\"},\n{{0xd3,0xd1,0x88,0xb3,0x90,0xba,0xcc,0xd9,0x50,0x24,0x52,0x61,0x46,0xb8,0x2b,0x91,0x84,0xe1,0x97,0xe4,0x6a,0x93,0x40,0xa0,0xe6,0xec,0x18,0xbf,0x75,0xbe,0x7f,0xc5,},{0xd8,0xf7,0x94,0x94,0x8a,0xa6,0x98,0x61,0x00,0x21,0x4e,0x9b,0x7b,0x90,0x24,0x42,0x08,0x06,0xb4,0xc6,0x78,0x46,0xd5,0xbd,0x50,0x61,0x13,0xb3,0x53,0xa2,0xea,0x3d,},{0x16,0x97,0x6b,0x26,0x7d,0xe9,0x6e,0x38,0xdd,0xdc,0x84,0x78,0x07,0x5f,0x6b,0xdd,0x71,0x59,0xe5,0x63,0x34,0xb2,0xd2,0xd1,0x92,0x09,0x46,0x29,0x4f,0x33,0xcd,0x6b,0x7f,0x9c,0x50,0xf8,0x05,0x7f,0x49,0x6c,0xab,0x5d,0x94,0xbb,0x4d,0xca,0x26,0x2f,0x9f,0x0f,0xdf,0x9b,0x1b,0x64,0x74,0x1f,0x4b,0x72,0x2d,0x32,0xef,0xa8,0x22,0x03,},\"\\x5e\\x65\\x65\\x8e\\x42\\x03\\x75\\x43\\x3f\\xd7\\xc1\\xf6\\xbe\\x67\\x88\\x41\\xe5\\x81\\x04\\xf1\\x0b\\x4c\\x67\\x63\\x59\\xd8\\x4f\\xce\\x79\\x92\\xf5\\xc5\\x75\\x57\\xd7\\x38\\xf8\\x30\\xb5\\x05\\xfa\\x0c\\x2b\\x9e\\xab\\xf8\\xd1\\xa9\\xf8\\x1f\\xe8\\xf3\\x15\\xd6\\x62\\xe2\\xb8\\x4c\\xe9\\x52\\x99\\xeb\\xf4\\xe5\\x03\\xb5\\xe1\\xf7\\xf8\\xcd\\xb6\\x68\\xae\\x73\\x3f\\x3d\\x0c\\xdd\\x4c\\x74\\x2a\\xb5\\xf2\\x72\\xbe\\xa4\\xf1\\x8d\\x18\\x3e\\x89\\x23\\x84\\x76\\x62\\xf9\\xa3\\x9c\\xd4\\xb1\\x4e\\xc7\\x6d\\x11\\x03\\x2f\\xe5\\x73\\xc2\\x62\\x01\\xae\\xf6\\x66\\x01\\xce\\xc6\\x83\\xe3\\x4b\\x89\\xaf\\xd9\\x64\\xe9\\x87\\x80\\x1c\\x70\\x6a\\x85\\xe2\\x7b\\xab\\x33\\x70\\x1c\\xd1\\x09\\xbc\\xf0\\x7b\\x27\\xca\\x67\\xf0\\x22\\xc4\\x94\\xa0\\x4c\\xbe\\x5a\\x9c\\x6d\\x63\\xaa\\xd9\\x36\\xcd\\xf1\\xa1\\x80\\xfd\\x05\\x86\\x51\\x98\\xb9\\x6f\\x06\\xa7\\x8d\\xa9\\x57\\x99\\xd3\\xaa\\x4d\\xf3\\xb1\\x70\\x03\\x3c\\x69\\xe8\\xfb\\x04\\x28\\x8c\\x35\\x46\\x55\\x3b\\x57\\x9c\\x0a\\xe3\\x93\\x80\\x62\\xd3\\xd8\\x42\\x1c\\xfa\\x66\\x26\\x85\\x29\\xbe\\xc0\\x27\\x1e\\x53\\xb4\\xee\\x7d\\x09\\x9e\\x71\\x48\\xa8\\x02\\xdf\\x80\\xfe\\x5e\\xed\\xee\\x1c\\x90\\x3a\\xe8\\xed\\x4d\\x64\\x0e\\xad\\x76\\x12\\x62\\xdd\\x40\\x14\\xf2\\x5f\\x93\\x97\\xba\\x3f\\x1c\\x08\\xd8\\x3a\\x3c\\x48\\x5c\\xfb\\x55\\xf8\\x99\\x19\\xaa\\x97\\x2d\\x6b\\x7e\\x77\\x11\\xbe\\x9e\\x30\\xc1\\xeb\\x96\\xa0\\xc3\\x84\\x53\\x09\\xfb\\x23\\xdb\\xc7\\x5b\\x69\\x91\\xdd\\x6e\\x48\\xcd\\xde\\x90\\xe0\\x4f\\x22\\x8e\\x8c\\xcf\\x3b\\xa2\\x3f\\x27\\x47\\xcf\\xb9\\xd3\\x38\\x1a\\x93\\x05\\xf8\\x16\\xf2\\x6c\\xdd\\xe4\\x1c\\x02\\x20\\xfa\\xd2\\x28\\xff\\x6a\\x8b\\x09\\x5c\\x77\\xb6\\xba\\xe8\\xfa\\x33\\x68\\x14\\x27\\x24\\xbf\\x1f\\x5e\\x0f\\x6f\\xbc\\xa5\\x32\\x0c\\x21\\x5b\\x6b\\xa8\\x6b\\x91\\xe3\\xa8\\xac\\xf7\\x50\\xe9\\x3f\\xa7\\xea\\xa6\\x5c\\x4f\\x78\\x5e\\xf8\\x42\\x1a\\x19\\xc1\\xe2\\x7b\\xc2\\x4b\\x42\\x8e\\x08\\xa9\\x02\\x42\\xab\\xac\\x9b\\xd4\\xaa\\x03\\xc6\\x56\\xf8\\xf4\\x6d\\xc4\\x0b\\x36\\x15\\x2c\\x1b\\xd0\\xde\\xf1\\xac\\xfc\\x0d\\xa1\\x0a\\x2f\\xa1\\xdc\\x3d\\xa7\\xac\\xe5\\xa8\\xfd\\x76\\x22\\x7b\\xb1\\xa6\\x02\\x39\\x0f\\xe5\\x7a\\xfd\\x32\\xef\\xe2\\x81\\xf2\\xea\\x6b\\x2e\\x4d\\x25\\x45\\xcb\\x88\\xd2\\x30\\x8d\\x72\\x69\\x1c\\x9a\\x52\\xb4\\xca\\x25\\x23\\x1a\\x01\\x07\\xf2\\x5d\\x11\\x7c\\xc9\\x35\\x39\\x76\\x21\\xc6\\x83\\xbd\\xc8\\xf2\\x2e\\x81\\x03\\x40\\xf2\\xcb\\xac\\x4c\\xea\\xa3\\x46\\x86\\x65\\x26\\x18\\x79\\xf0\\x07\\x42\\x00\\x74\\x3e\\x0d\\xe5\\xf3\\xe5\\x83\\x08\\xb9\\x8b\\x04\\xb8\\xc7\\x14\\x8a\\x4e\\x00\\x4e\\x66\\x7e\\x83\\x2b\\x00\\x84\\xb5\\xf2\\xbd\\xc6\\xfd\\xc9\\x59\\xf2\\xfc\\x28\\xa8\\xd3\\x1d\\x9a\\x9e\\x78\\xe5\\xd5\\xf9\\xc0\\xb1\\x19\\xe5\\xff\\x1f\\x68\\xf7\\xc0\\xda\\xf0\\xc0\\xf1\\x69\\x47\\xcc\\xa5\\xb7\\xce\\xd0\\x96\\x01\\xe2\\xeb\\xed\\x28\\x2e\\xf2\\xbf\\x8f\\xe9\\xa2\\x7e\\xd2\\x7f\\xc5\\xbc\\xda\\x8a\\xed\\x6c\\x71\\xbe\\xe3\\xe7\\x75\\x10\\x04\\x47\\x26\\x89\\xbb\\xf6\\xd9\\xd0\\x79\\x52\\xa2\\x42\\xff\\x87\\x0d\\x7c\\x3f\\x5e\\x1f\\xfc\\x2c\\x1f\\x40\\xfc\\x9a\\xb7\\x57\\x9b\\x39\\x2b\\x55\\x4f\\x3d\\xc5\\x88\\xc0\\x3a\\xb9\\x57\\x43\\x1f\\xe5\\xd0\\x2c\\xbc\\x71\\x1a\\xd4\\x89\\xfe\"},\n{{0x61,0x91,0x7a,0x97,0x5c,0xb7,0xec,0x56,0x4c,0x70,0x8a,0x56,0x53,0x88,0xc5,0x72,0x36,0xa6,0x6b,0x69,0x7d,0xcd,0x5a,0x7f,0x10,0xba,0xe6,0x71,0x57,0x2a,0xc7,0xf0,},{0xec,0xc0,0xf0,0xb9,0x92,0x76,0xe5,0x28,0xf8,0x2b,0x42,0xf2,0xef,0xce,0x85,0x79,0xf8,0x3e,0x63,0x8c,0x6a,0xce,0xfd,0x07,0x28,0x28,0xc0,0x4e,0x43,0x4f,0x55,0xaf,},{0x6a,0xbb,0x3e,0x37,0x7b,0x5c,0x80,0xb7,0x4f,0x77,0x21,0x9c,0x1a,0x9e,0x09,0x6f,0xba,0x0e,0xb6,0x89,0x90,0x81,0x7a,0xcf,0xf1,0x2d,0xba,0x7f,0x61,0xc7,0x7c,0xcf,0x59,0x5f,0xb6,0x60,0x85,0x52,0x00,0x3c,0xea,0xd0,0x6c,0xa1,0x31,0x7c,0x9c,0xd5,0x1a,0xc4,0x72,0x4b,0x29,0xf4,0x09,0x21,0xfb,0x92,0x84,0x33,0x76,0x87,0x64,0x01,},\"\\x6e\\x97\\x0e\\x0b\\x1c\\x92\\xa7\\xf4\\x96\\xa8\\x2d\\x8a\\xe8\\x0c\\xfd\\x0c\\xce\\xf1\\xd2\\xc7\\x99\\xd4\\x17\\x28\\xf3\\x5d\\xdc\\xd6\\x03\\xb4\\x21\\xc2\\xa5\\xab\\x3b\\x48\\x9e\\x78\\xf4\\xb6\\x22\\x97\\xde\\x43\\x7c\\x5a\\xd1\\xa9\\x68\\x3f\\xf8\\x7f\\xa2\\x8e\\xb3\\xcc\\x38\\xce\\x24\\x2a\\xf5\\x94\\x19\\xf9\\xfd\\x43\\xfc\\xaa\\x54\\xfc\\x39\\x89\\x92\\xf8\\xc8\\xe3\\x1f\\x2b\\x33\\xdc\\xcc\\xd0\\xee\\x11\\xba\\x7b\\x38\\x8e\\x8d\\x2a\\x36\\xea\\xd0\\x67\\xc6\\xbe\\xce\\xd5\\x89\\x0a\\xb7\\xd4\\xa9\\x4f\\x55\\xda\\xb9\\x21\\x28\\xa0\\xf8\\x14\\xc0\\xe6\\x89\\x71\\xdf\\x57\\xbd\\x50\\x78\\xa7\\x40\\x31\\x75\\xc7\\xc2\\xfd\\xd4\\xa5\\x24\\x47\\x15\\x3a\\xb3\\x74\\x56\\x72\\x9a\\xee\\x33\\xe5\\xfc\\x93\\xdb\\x8e\\x7f\\x48\\x03\\x09\\x87\\x5e\\xcf\\x6d\\xb0\\x7c\\xe7\\xf3\\xca\\xc5\\xde\\x49\\xe3\\x61\\x27\\x5c\\xa5\\x0b\\x6b\\x71\\x9f\\x4b\\x71\\x5b\\x3e\\x30\\x86\\x3c\\xbb\\x3b\\x71\\x64\\xba\\x9e\\xb9\\x6e\\xf3\\x30\\x4b\\x19\\xad\\x4d\\x74\\xdc\\xe4\\xbd\\x25\\xe7\\x7b\\xbb\\xbe\\xff\\x1e\\xe7\\xd1\\xfb\\x55\\xb9\\xc4\\xf7\\xfc\\x4c\\xd9\\xbd\\x55\\x10\\x8a\\xfc\\xf9\\x9c\\x1a\\x41\\xcd\\x6f\\x6b\\x1a\\xdb\\x29\\x7b\\x10\\x6c\\x8b\\xa2\\x4e\\x31\\x34\\xf8\\x7d\\xd8\\xef\\xe5\\xcf\\x85\\x49\\x22\\x91\\xb9\\x4d\\x66\\x00\\x95\\x8c\\x28\\xb9\\x12\\x2f\\xe6\\xe0\\x1b\\xd3\\xe3\\x29\\xe4\\x2d\\x19\\x26\\xb8\\x9f\\x7a\\x8c\\x40\\xa4\\x98\\x67\\xe5\\xaa\\x3a\\xd7\\x49\\xbd\\x98\\xda\\xe7\\xd0\\x06\\xb4\\x53\\x60\\x9e\\x7d\\xae\\x26\\x36\\x4d\\x91\\x72\\xbe\\x72\\x83\\x33\\x01\\x21\\xed\\x2b\\x40\\x27\\xe0\\x88\\x51\\x18\\x74\\x3a\\x6e\\xa0\\xcb\\x7d\\xc2\\x74\\x09\\xa9\\xb2\\x82\\x0b\\xcc\\x24\\x2e\\xa1\\x0a\\x00\\x93\\x7b\\xf8\\x49\\x20\\x1e\\x0f\\xb6\\x19\\x94\\x21\\xf1\\x63\\xe9\\x79\\x4f\\x2d\\xd4\\xb3\\x32\\x01\\x4a\\x09\\xd3\\xee\\x80\\x71\\xda\\x78\\x77\\x47\\xf9\\x90\\xf5\\x17\\x99\\x19\\x02\\x7d\\xdf\\xf7\\xca\\xb0\\xf5\\x5e\\x9a\\xfa\\x8e\\xcc\\xb1\\x6c\\xc2\\xdd\\x3c\\xbb\\xea\\xd7\\xff\\x7e\\xc8\\x18\\xc2\\x53\\x39\\x3f\\x74\\x87\\x41\\xf5\\x54\\x07\\xf7\\x40\\x8e\\xe3\\x3a\\x42\\xae\\x2d\\x6e\\xcb\\x3f\\xb6\\x00\\xa7\\x1f\\x30\\xab\\x63\\x06\\x06\\xe5\\x53\\xb4\\x36\\x78\\xe5\\x98\\x54\\xf3\\xa2\\x94\\x7b\\xcf\\x4e\\xa0\\xfc\\xfe\\xdc\\x31\\x4d\\x83\\x70\\xd1\\x26\\x63\\x95\\xfd\\xa3\\xc9\\x10\\x5e\\x97\\x59\\x52\\xf6\\x0e\\x30\\x86\\xbb\\x82\\x48\\x15\\x13\\xd6\\xfe\\x8a\\xdb\\x4f\\x95\\xef\\xb9\\xa9\\x5b\\x66\\xd4\\x80\\xd2\\xbb\\x17\\x10\\x78\\xcf\\x40\\x68\\x4a\\xc6\\x9a\\x78\\x9c\\x7f\\xb7\\xfa\\x42\\x53\\x33\\xd7\\x05\\xdb\\x00\\x06\\x67\\x55\\xdf\\x72\\x8d\\xe0\\x2d\\xf2\\x5b\\xae\\x34\\xf1\\xd7\\xd4\\x9c\\xaf\\xfc\\x51\\xe9\\xba\\x2b\\x10\\xb9\\x8f\\xe4\\xcd\\x9d\\x22\\xb7\\x76\\x4e\\xd9\\x31\\xed\\xb5\\xf0\\xb5\\x54\\x49\\x6e\\x99\\x53\\x91\\xe0\\xaf\\x0b\\x8d\\x1c\\x7a\\x82\\x95\\xa8\\xd1\\x5a\\x7c\\x65\\x56\\xd2\\x9c\\xb1\\x9e\\x08\\x55\\xca\\x50\\x5a\\xd0\\x1d\\x2a\\xa3\\x09\\x28\\xa8\\x4b\\xc4\\x89\\x59\\x57\\x6d\\x81\\x2d\\x9b\\x27\\xb8\\xe8\\x88\\x79\\xfa\\xa2\\x80\\x6c\\x08\\x41\\x36\\x0e\\xcd\\x0f\\xe8\\x3f\\x5b\\x84\\x8f\\xc1\\x2f\\x65\\x8f\\x1e\\x7f\\x40\\xe5\\x61\\xc2\\xe7\\x8d\\x3b\\x01\\x25\\x21\\x0a\\x92\\x06\\x1c\\x2d\\xb2\\x1b\\xa6\\x60\\xe8\\x60\\x8f\\xf5\"},\n{{0x7b,0xa2,0x5f,0x27,0x97,0xa2,0x83,0x6f,0x37,0x9d,0x6b,0xbc,0xbe,0x9a,0xbf,0x4f,0x2d,0xef,0x5e,0x52,0xf7,0x2b,0xd9,0xe0,0xb0,0x06,0x57,0x10,0x22,0xfa,0xc2,0xf3,},{0x6c,0x2e,0xd4,0xe8,0xc0,0x12,0x4d,0x5d,0x05,0x40,0x79,0x6d,0x39,0x45,0xd1,0xde,0x71,0xaa,0x69,0x69,0xe6,0xab,0xea,0x0f,0x1b,0x0e,0x6f,0xc4,0x29,0xc7,0x04,0x6f,},{0xf1,0xf5,0x90,0xa9,0x07,0xba,0x98,0x0e,0xb0,0xd6,0x48,0xab,0x4d,0xed,0x5f,0x92,0xfa,0xf7,0xcb,0x85,0x1d,0x81,0xd8,0x58,0xa7,0x8f,0xa6,0xb7,0x7c,0xbb,0xe1,0x2f,0x64,0xd2,0x0d,0xf5,0x27,0x71,0xa7,0xd5,0xe5,0x39,0xa1,0x52,0xd7,0x31,0xe1,0x90,0x3d,0x42,0x11,0xfd,0xcf,0xef,0x9a,0x48,0xb4,0x6c,0x8f,0xd5,0x39,0x4c,0xa0,0x09,},\"\\x17\\x1a\\x34\\x09\\x87\\x80\\x97\\xb3\\xb2\\x2b\\x2c\\x00\\x66\\x0b\\x46\\xe5\\x42\\xc2\\x16\\x4c\\x00\\xbb\\xee\\x54\\x55\\x48\\x37\\x94\\x0e\\x70\\xf0\\x3d\\xa9\\x91\\x6a\\x40\\xf9\\xbd\\xe8\\x28\\x8f\\x45\\xe4\\x7b\\xef\\x7f\\xfe\\x4e\\x55\\x7c\\xd4\\x47\\x40\\x45\\xe7\\x40\\xfd\\x95\\x9d\\x98\\x4f\\x4e\\xc8\\x1d\\xa8\\x8d\\x44\\xa3\\x73\\xc1\\xed\\xa0\\xcf\\xc6\\xb0\\x8e\\x35\\x13\\x73\\xd3\\xb8\\x2a\\xb0\\x90\\x2d\\xf8\\x06\\x3f\\xd9\\x08\\xe7\\x03\\xe0\\xcb\\xec\\x41\\x0a\\xb5\\xcd\\xfe\\xaa\\xe0\\x01\\x88\\xce\\x2a\\xd4\\x2b\\x8b\\xf0\\x4f\\x7d\\xaa\\x5f\\x0e\\xe3\\x33\\xa6\\xf9\\x31\\x1b\\x4a\\xd9\\x81\\x09\\x52\\xd5\\xd5\\xa6\\x4b\\x20\\xf3\\x7e\\x84\\x54\\x15\\xfc\\x3c\\xdd\\x61\\x6f\\xeb\\xec\\x50\\xdb\\x29\\x6f\\xb3\\xf3\\xbb\\x7f\\x6b\\x36\\x6b\\xbe\\x52\\xe4\\x89\\x7a\\x05\\x61\\x7b\\xf7\\xc9\\x81\\xa6\\x2e\\xdc\\xbb\\xbe\\x5d\\xa4\\xc3\\x9c\\xaf\\xa8\\x69\\xaa\\x2b\\x27\\x34\\xe6\\xcf\\xed\\x90\\xed\\x8b\\xe7\\x59\\x49\\x39\\x0e\\xe4\\x45\\x66\\x89\\x24\\x55\\xb8\\x90\\xcf\\x56\\x8b\\x94\\x5a\\xab\\xb7\\x58\\xd3\\x85\\x4b\\xe6\\x53\\x9f\\x3b\\x86\\xbf\\x01\\xd1\\x88\\xe4\\x8c\\xf2\\x62\\x6a\\x0d\\x7d\\x38\\x17\\x03\\xbe\\x6e\\xd1\\x29\\x0d\\xfb\\x94\\x7b\\xc2\\xe0\\xf8\\x3d\\xbc\\x58\\x70\\x30\\x80\\xd7\\xf5\\xb9\\xef\\x19\\xae\\xf9\\x30\\x90\\x8f\\x68\\xf0\\xc8\\x00\\x10\\xa9\\x40\\x1b\\x30\\x3a\\x9f\\x6d\\xa8\\x05\\xbb\\x8a\\x0e\\xd0\\xf3\\x94\\x13\\xee\\xfe\\xdf\\x91\\x9f\\xfd\\x8e\\xa6\\x39\\x1b\\xf9\\x5d\\x42\\x29\\x60\\x4e\\x49\\x45\\x7b\\x8e\\x23\\xbe\\xc6\\x11\\x48\\x4c\\xc7\\xf9\\x83\\x2d\\xd9\\x5b\\xdc\\x3a\\xd1\\x77\\xc0\\x50\\xf4\\xab\\x63\\x3d\\xcd\\xb3\\xe6\\x91\\xf5\\x90\\x28\\x73\\xb3\\x8c\\xb0\\x72\\x0b\\x91\\x13\\x35\\x7f\\xe0\\xcf\\xb9\\x8a\\x68\\xcc\\xcb\\x5d\\x5f\\x08\\x09\\xd5\\x9a\\x37\\x5c\\xf7\\xb5\\xa2\\x75\\xd4\\x3c\\x4c\\x34\\xff\\x68\\xe4\\x48\\x52\\x6e\\x8e\\x1a\\xad\\x44\\xe2\\x00\\x08\\xa2\\x32\\xaf\\xbc\\xf5\\x32\\xa4\\x2b\\x50\\xa0\\x25\\xa1\\xb2\\xee\\x4e\\x07\\x7e\\xb0\\x12\\x5a\\x59\\x3d\\x51\\xa2\\x00\\xec\\x20\\xd8\\x72\\xc0\\x58\\x38\\xad\\x36\\xaa\\xae\\xec\\xcc\\x3e\\xd9\\xef\\x41\\xf6\\xd1\\x22\\x67\\x02\\x17\\xd5\\xc0\\x8f\\x6e\\x13\\xc1\\x72\\x19\\x45\\x89\\xac\\xc3\\xc5\\x9f\\x7e\\xf7\\x90\\xc7\\xc8\\x5a\\xa6\\xd5\\xeb\\x69\\xd4\\xc8\\x9a\\x72\\xf5\\xe7\\xc9\\x24\\x69\\x85\\xc1\\xac\\x0c\\x5d\\x19\\x7f\\x76\\xa7\\x3e\\x37\\x74\\x83\\x9d\\x4a\\xa2\\x09\\x6a\\xca\\x19\\x0a\\x30\\xf4\\xaa\\xc5\\x40\\x57\\xb6\\x4f\\x35\\x8e\\x0e\\x06\\x40\\x0c\\x0d\\xf2\\xf8\\x76\\x41\\x2d\\x34\\x48\\x4c\\x43\\x44\\xf4\\xd7\\xc8\\x66\\x51\\x7d\\x3e\\xfb\\xa4\\xa9\\x0f\\xa7\\x14\\x4c\\x9b\\xa5\\xdb\\x33\\x61\\xdb\\x57\\x69\\x40\\x3e\\xc8\\x16\\x26\\xa5\\x11\\xf9\\x3e\\x30\\xf8\\x58\\x6e\\xad\\xfc\\xaf\\xd9\\xa3\\x6e\\xcf\\xf8\\xd2\\x4b\\x42\\x07\\x9a\\xda\\x8e\\x57\\x9a\\xc3\\x08\\x51\\x17\\x7b\\xce\\x90\\x38\\xb0\\xe1\\x30\\x00\\x72\\xd6\\x8e\\xfd\\xd7\\x23\\xf6\\x35\\x50\\x64\\x84\\x32\\x75\\x81\\x5a\\x66\\xb9\\xd7\\x3a\\x12\\x99\\xaa\\x59\\xa1\\x81\\x2f\\x64\\x52\\xfb\\x41\\x15\\xea\\x2b\\x1f\\x9f\\xf4\\xa9\\x96\\x90\\x59\\x6e\\x3f\\x20\\x22\\xd8\\x1e\\xd8\\x74\\xdd\\x67\\xe6\\x18\\x9c\\xa0\\xe6\\x8b\\x93\\x04\\xe9\\x93\\xa9\\x5b\\x66\\x66\\x5e\\x0d\\x07\\x4c\"},\n{{0xd1,0xe1,0xb2,0x2d,0xe5,0xe0,0x4c,0x9b,0xe4,0x65,0x1d,0xd7,0x39,0x95,0xa3,0x66,0x6c,0xb5,0x35,0x2c,0x65,0xac,0x7b,0x70,0x51,0xb3,0x66,0xfe,0x1a,0xc0,0xc3,0x10,},{0x12,0xfe,0x56,0xf1,0x01,0x2d,0x5c,0x12,0xf1,0x35,0xed,0x59,0x82,0xf3,0x82,0xae,0x5f,0x11,0x43,0xbc,0x90,0xe8,0xcb,0x8c,0x93,0x05,0x17,0x54,0x55,0x1e,0xe9,0x0a,},{0xab,0xaa,0xb4,0xfa,0x6a,0xeb,0x0a,0x0b,0x34,0xee,0x0d,0x61,0x3a,0x0a,0xf0,0x49,0xed,0xb4,0xce,0xdb,0xfe,0x9d,0x3b,0xeb,0xe9,0xc0,0x06,0x18,0xb1,0x15,0xb9,0xd1,0xfa,0x52,0x4e,0xc3,0x49,0x5e,0x13,0x30,0xb0,0x93,0x61,0x81,0xea,0xbb,0x14,0x29,0x9f,0xac,0xcc,0x40,0xea,0xa8,0xcc,0xa5,0x7e,0xd3,0x24,0xb7,0xa6,0x42,0x0c,0x0e,},\"\\xc7\\xf2\\x18\\xb5\\xaa\\x7a\\xae\\x17\\x99\\x62\\x5a\\x56\\xc4\\xd7\\xd7\\xb0\\x26\\x37\\xe5\\x72\\xf1\\x41\\x1a\\x61\\x22\\xf1\\x13\\x79\\x1a\\xa3\\xc6\\x28\\xe8\\x19\\x60\\x2f\\xb4\\xf0\\x33\\x5a\\x61\\x23\\x01\\x3f\\xa6\\x4e\\x9f\\xdc\\x4e\\x4a\\xe4\\x97\\xbd\\x16\\x9c\\x2f\\xa7\\x7b\\xc2\\x36\\x12\\x97\\x17\\xf4\\x62\\x88\\x6b\\x41\\x08\\x93\\xfa\\x78\\x09\\xcb\\xfd\\xc8\\x92\\x22\\x3b\\x40\\xee\\x04\\x1e\\xbd\\x4e\\xc7\\xdd\\xab\\x55\\xbe\\x60\\x81\\xa1\\x64\\x66\\x43\\xa9\\x12\\x0b\\xaa\\x46\\x28\\x9a\\xcb\\xa1\\x5b\\x3b\\x48\\xaf\\x3b\\x7a\\xde\\xcd\\x69\\xf4\\x3e\\xed\\xe7\\x9d\\x9b\\x19\\x57\\xe1\\xd8\\xc3\\x12\\x9e\\x0f\\xa0\\x57\\x9d\\x3d\\x39\\x53\\x70\\x46\\x1b\\x0e\\x12\\x55\\xc9\\xca\\xa9\\x4e\\x47\\x25\\x60\\x1c\\xb9\\xd0\\xe2\\xd6\\x02\\x44\\xd1\\x5b\\x64\\xe1\\xf7\\xbc\\x90\\x15\\x59\\x0a\\xd0\\x99\\x1f\\x12\\xf8\\x26\\x73\\x11\\x20\\x6e\\x9e\\xb5\\xd1\\x6a\\xdd\\x0b\\xa5\\x21\\x8f\\xce\\x5f\\xff\\xe1\\xc9\\xce\\x5f\\xfe\\x1f\\x73\\x11\\x32\\xf4\\xb1\\x2c\\xac\\xb0\\x2f\\x97\\x45\\x17\\x10\\x84\\x6b\\x7f\\x82\\x4f\\x4f\\xa9\\xe0\\x89\\x19\\x26\\x64\\x69\\x78\\x9c\\x00\\xce\\x0d\\x94\\xd3\\x8f\\xa8\\xfe\\xc3\\xf5\\x1f\\x2f\\x88\\x6e\\x9d\\xb0\\x9b\\x80\\x44\\x70\\xb1\\x9e\\xc9\\xe8\\x06\\x63\\xf1\\x55\\xb4\\x98\\x4d\\x2b\\xbd\\x0b\\x2c\\xe9\\x93\\x02\\xe0\\x6c\\x64\\x44\\x4b\\x69\\x6e\\x31\\x29\\xfc\\xef\\x34\\xc3\\xdd\\x00\\xf7\\xab\\x5b\\xed\\xa7\\x47\\xa3\\xfc\\x63\\x39\\x19\\x2b\\x74\\x0f\\x35\\x69\\xb6\\x7d\\xbd\\x6f\\xfa\\x39\\xe2\\x71\\xfa\\xa4\\x00\\xd9\\x61\\x6b\\xff\\x86\\xec\\x49\\xa6\\x59\\xde\\xf2\\xe7\\xf5\\xd4\\x51\\xf2\\xa2\\xb3\\x5e\\x66\\x2a\\x6e\\x7c\\xc2\\x2f\\x1e\\x5c\\xdc\\xde\\x8a\\x59\\x98\\x81\\x35\\xb7\\xe7\\x65\\x62\\x74\\x3c\\x1e\\x6a\\x09\\x99\\x01\\xb3\\xef\\x97\\xcb\\xff\\x23\\xf2\\x09\\xbd\\x70\\x88\\xc2\\xf0\\x32\\x45\\x27\\x9a\\x1d\\xc7\\x8d\\xdd\\xc1\\xbb\\x0c\\x1d\\x35\\x10\\x03\\x57\\x88\\x21\\x26\\xb3\\x28\\xd3\\xd9\\x4e\\x08\\x71\\xb6\\x0b\\xe2\\x53\\xfd\\x1b\\x6e\\xcf\\x03\\xc1\\xdb\\x73\\x1d\\x9e\\xed\\x0e\\xdf\\x2b\\x26\\x43\\x23\\x07\\x80\\xa4\\xd6\\x6e\\x99\\x17\\x9a\\xad\\x1b\\x82\\x40\\x2e\\x55\\xf6\\xd7\\x85\\xeb\\xc8\\x0f\\x8d\\xd2\\xfd\\x2b\\xeb\\x09\\xf3\\x10\\x35\\xdf\\x62\\xc1\\x7f\\x42\\x8e\\xd0\\xb2\\xd5\\x65\\x08\\xdb\\x31\\xe6\\xd2\\xdd\\x5f\\xb6\\x9e\\xbe\\xee\\xa3\\x25\\x70\\x70\\xcf\\x2f\\xe6\\x7d\\x42\\xd2\\x88\\x16\\xa5\\x5d\\xba\\xe0\\xb1\\x85\\xdb\\x44\\x21\\xbb\\xfd\\xae\\xfc\\x79\\xc0\\x8c\\xdc\\x1a\\xcc\\xf7\\x16\\x42\\x56\\x2e\\xc7\\x00\\x36\\xda\\x2b\\xba\\xfa\\x4a\\x89\\x19\\x54\\xc4\\xee\\x40\\x49\\xb5\\x5c\\x64\\x0e\\x91\\x93\\x0e\\x39\\xe3\\xef\\x10\\x18\\xdc\\x16\\x47\\xf2\\x69\\x42\\xc6\\xdb\\xdf\\x4d\\x56\\xe4\\x1e\\xb2\\xc8\\x98\\xc8\\x21\\xfa\\xc1\\x7c\\xc2\\x73\\xe8\\xe4\\xaa\\x56\\x08\\xa8\\x12\\xcf\\x4b\\x82\\xf9\\x60\\x19\\xc2\\x52\\xd5\\x6e\\x78\\x05\\x29\\x8c\\xcb\\xe8\\xce\\x40\\xb0\\xbd\\x0f\\x93\\x3b\\x88\\x4c\\x0f\\xaf\\x97\\xa9\\x58\\xb2\\x04\\x08\\xb8\\xa5\\x29\\x7c\\xce\\x55\\x27\\xb2\\xca\\x21\\x28\\x06\\xe7\\x2a\\x32\\x64\\x45\\x7a\\x7f\\xac\\x86\\x62\\xb8\\x2c\\xa2\\x33\\xe1\\xc7\\x75\\x8d\\xc6\\xe4\\xf1\\xb9\\x99\\x58\\x63\\xf2\\x5f\\x74\\x7b\\xce\\xe4\\x3b\\x63\\x9b\\x1f\\x8f\\x20\\x26\\xd2\\xd2\"},\n{{0xdf,0x29,0x4e,0x47,0x7b,0x1b,0x91,0xc5,0xac,0x5b,0x98,0xc3,0x30,0xd2,0x22,0xd7,0xcd,0x2d,0x53,0xe7,0xd0,0xbc,0x0c,0xa4,0x03,0xdf,0x4e,0xc7,0x53,0x27,0xa2,0x74,},{0x5f,0x0b,0xd2,0x2f,0x2f,0x18,0x96,0xd1,0x56,0x3b,0x4f,0x69,0x40,0xc7,0xdf,0x89,0xef,0xc2,0x58,0xc0,0xff,0x6c,0x2f,0xcd,0x67,0x4d,0xaf,0x4f,0x59,0xfc,0xdb,0x60,},{0x99,0x45,0xab,0x73,0xb5,0x85,0x62,0xb3,0x55,0xda,0xbc,0x4e,0x2b,0x6b,0xe7,0xe0,0x5f,0x37,0xf8,0x95,0x71,0x44,0x0c,0xcc,0x32,0xc1,0xa9,0x47,0x37,0x09,0x5b,0x78,0x66,0x74,0x7d,0x21,0x00,0x70,0x00,0xa0,0xf0,0xe3,0x51,0x11,0x4b,0x88,0xe0,0x13,0x8b,0x55,0xdf,0x44,0xfe,0x72,0xeb,0xe9,0x59,0x14,0x10,0xe7,0x07,0xfa,0x9d,0x02,},\"\\x3e\\x42\\xd6\\x68\\x40\\x96\\x30\\xcb\\xb8\\x48\\x12\\xac\\x7f\\xf1\\x15\\x4f\\x70\\xfc\\xa8\\xbd\\xff\\x3f\\x1a\\x04\\x0f\\xa3\\xaf\\x86\\x8a\\xa1\\xc4\\xe9\\x15\\x08\\xb1\\xae\\xfd\\xf5\\xc3\\xa8\\xb4\\xb0\\x77\\xa4\\xd1\\x62\\xd2\\xc0\\x5b\\xd3\\x64\\xfb\\xbe\\x8c\\x5a\\x08\\x31\\x4c\\x2e\\x07\\xdf\\xfb\\xd6\\xe8\\xdd\\x2e\\x08\\xa0\\xdc\\xc9\\x6e\\xa9\\x2d\\xdd\\x4c\\x97\\xf7\\x9d\\xb9\\x42\\x5a\\x6c\\x6b\\x34\\xc4\\x60\\x43\\xd0\\x9a\\x68\\xb7\\x68\\x72\\x36\\xa9\\x18\\xd2\\x1a\\x56\\x16\\x10\\xa1\\x3a\\xc5\\xe4\\x46\\xe0\\x88\\x1b\\xb2\\x6c\\xc8\\xe2\\x8a\\xad\\x16\\x54\\xf8\\x67\\xad\\x82\\xae\\x33\\xf8\\xf7\\xa7\\x8a\\x65\\xbe\\x57\\x69\\x94\\x75\\x51\\x6a\\x1a\\x87\\x46\\x84\\x3e\\x93\\xa1\\xa2\\x94\\x35\\x46\\x24\\xfa\\xc0\\x4d\\x45\\x2c\\xcf\\xbe\\x4f\\xdd\\x92\\xa9\\x51\\xaa\\xa0\\x7d\\x26\\x67\\x6d\\x5c\\xb0\\x77\\xa5\\x00\\x0d\\x43\\x9c\\x12\\x42\\x76\\xc0\\xdb\\xcf\\x86\\xe7\\xaa\\x15\\x3c\\xc2\\x4b\\x5a\\xff\\x67\\x7c\\x6b\\xad\\xc2\\x61\\xc2\\x89\\xf4\\xa4\\xae\\x51\\x9b\\x2e\\x2f\\xff\\x31\\x2f\\xbf\\x0f\\x5b\\x4c\\x46\\x98\\xf6\\xae\\xdd\\x8f\\xcb\\x1d\\x23\\x48\\x94\\x2d\\xe3\\xfb\\x73\\xba\\x27\\xf6\\xdb\\x14\\xc2\\xf0\\x91\\x80\\x35\\x6e\\x5f\\xca\\xe1\\xad\\xf6\\x5e\\x22\\x42\\x5f\\x8c\\x27\\xf1\\x9e\\x98\\x94\\x83\\x50\\x6e\\x5d\\xf5\\x7a\\x1b\\x61\\x3a\\x22\\xe3\\x45\\x03\\x8b\\x3e\\xa9\\x1c\\x0f\\x78\\xff\\xff\\x46\\x38\\x3f\\x38\\xc7\\x22\\x25\\x35\\x8a\\x34\\x57\\x0d\\x6f\\x66\\x4a\\x17\\x45\\x4a\\x15\\x16\\x13\\xf0\\x1c\\xba\\x77\\x7f\\x62\\xec\\x83\\x18\\x75\\xec\\x5e\\x27\\xd2\\x57\\xf1\\x80\\xb6\\x36\\x6c\\xb1\\x83\\x10\\x7c\\x40\\xf5\\x0b\\x01\\xb2\\xb9\\xbf\\x91\\xb3\\xb5\\x54\\x9e\\xd9\\x31\\xa3\\x53\\x7a\\xa4\\x16\\x89\\xf7\\x2b\\x25\\x7a\\x6a\\xa3\\x9c\\xdc\\x6f\\xce\\xdf\\x14\\x39\\x83\\xbe\\x5b\\xff\\xe3\\xae\\x2b\\x29\\xf8\\x2f\\x88\\x21\\x22\\xd6\\x6a\\x79\\x25\\xf5\\xa7\\x10\\x82\\x6c\\x0d\\xad\\xb7\\xe4\\xfa\\x4e\\xc0\\x79\\xba\\x2e\\x76\\xda\\xda\\x43\\x3f\\x30\\x77\\xcb\\x1e\\xf7\\x46\\x13\\xfc\\x5d\\xbf\\x82\\x58\\xb6\\xda\\x7c\\x73\\xc8\\x66\\x37\\x24\\x57\\xed\\x50\\x0f\\x97\\xf9\\x90\\x7e\\x1f\\xc2\\x63\\x53\\xc7\\x0b\\xa3\\xbd\\x9c\\x36\\x15\\x1d\\x46\\x86\\x5d\\x2c\\x65\\x98\\x65\\x62\\x48\\x5c\\xf8\\x42\\x1f\\xeb\\xbe\\x77\\x7c\\x73\\xe6\\xcd\\x00\\x26\\xd6\\x6d\\x35\\x12\\x8b\\x9f\\x8f\\x33\\x26\\x4a\\xeb\\x56\\xbd\\x3e\\x4b\\x8d\\x1f\\x52\\x66\\x41\\x1e\\xf3\\xb2\\x3b\\x76\\xb3\\x6d\\x4c\\x9d\\xf3\\xc5\\x12\\xfd\\x56\\x0c\\x2b\\xe5\\x2a\\xc5\\x23\\xc1\\x93\\x77\\xad\\x2a\\xdc\\x0e\\x8c\\x30\\x9c\\xf5\\xbb\\xf7\\x2d\\x9e\\xb8\\x5d\\x65\\xa9\\x48\\x47\\xd4\\x97\\xd8\\xd1\\x02\\x42\\x4f\\xb8\\x43\\x81\\x66\\x6e\\xcb\\x1c\\x35\\xa3\\x72\\x5d\\x7d\\x9e\\x92\\x84\\xfd\\xeb\\xb6\\xb3\\x62\\xaa\\x6a\\x9c\\x6f\\xb3\\x7a\\xba\\x87\\x35\\x7f\\x57\\x4c\\x0e\\x63\\xb4\\x49\\x7d\\x49\\x8f\\xfb\\xb7\\xd0\\x69\\x2d\\x78\\x4b\\x4b\\x18\\xce\\x9f\\x91\\x50\\xc1\\x46\\xd3\\xd1\\x8c\\x38\\x2e\\xda\\x04\\x93\\x8c\\x69\\xd0\\x77\\x8f\\x29\\x02\\xd5\\x23\\x5a\\x56\\x52\\xb9\\x7c\\xef\\x6d\\x5f\\x60\\xda\\x6b\\xd7\\xed\\x4f\\xf9\\x7c\\xd9\\x4d\\x49\\x39\\xca\\xca\\x3b\\x6b\\xaa\\x3c\\xfd\\xac\\x04\\xcd\\xa9\\x55\\x96\\xf4\\x67\\xcb\\xc6\\xcb\\xcd\\x92\\x64\\x16\\x77\\x43\\xea\\xc1\"},\n{{0x70,0xc6,0x85,0x9f,0x08,0xcf,0x42,0xb4,0xbd,0xa9,0xeb,0x62,0x97,0x9d,0xff,0xb7,0xcb,0x08,0xeb,0x3d,0xab,0xe9,0x3f,0xe9,0x4b,0x01,0x38,0x46,0x17,0xcf,0x67,0x30,},{0x40,0x1c,0x9e,0x20,0x33,0xe2,0x25,0x9f,0xb6,0x38,0x3b,0x3e,0x8b,0x9e,0x17,0xb3,0xf2,0x06,0x27,0x46,0xbb,0xe6,0x48,0xcf,0x48,0x45,0x16,0xdb,0x0f,0x2f,0x1b,0x06,},{0x0f,0x03,0xa4,0xf1,0x5c,0x33,0x9b,0x4f,0x7b,0x88,0xb4,0xe2,0x1a,0xd9,0xe3,0xd6,0xbb,0xf3,0xef,0xfb,0x7b,0x67,0x8f,0xfa,0x50,0x0d,0x47,0x38,0x3b,0x71,0xa7,0x45,0x4f,0x62,0x90,0x7b,0x56,0xf5,0x9f,0x9b,0x9a,0xf6,0xd5,0xb2,0xa0,0xfc,0x1c,0x73,0x7a,0x64,0x10,0x51,0x95,0x08,0x98,0x99,0xf5,0x7a,0x2c,0x9d,0xba,0x50,0x9e,0x0a,},\"\\xdd\\x06\\x09\\xea\\x15\\x99\\x21\\x39\\x5d\\x11\\xfb\\x2d\\xa8\\xea\\x4f\\x74\\x7d\\x7f\\x74\\xb5\\x80\\x52\\xe0\\x1c\\xad\\x40\\xa2\\x71\\xfa\\x0b\\xbe\\xed\\x91\\x02\\x0f\\x4f\\x0c\\x08\\x46\\xc4\\xf0\\x77\\x78\\xa6\\xaa\\x76\\x8e\\xb5\\x17\\x12\\x29\\x4e\\x9e\\x1f\\x32\\xa6\\x02\\xb1\\x52\\x51\\x4f\\x5e\\x6d\\x39\\xf9\\xe0\\x8f\\x7a\\x78\\x12\\xbd\\x90\\x0c\\x10\\xa9\\x14\\x69\\xe4\\x7e\\x8a\\x78\\xe5\\x4c\\xd4\\xbd\\x7c\\xfe\\xde\\xde\\xc1\\x71\\xef\\x37\\x3f\\x1c\\x4f\\x9b\\xbc\\x2c\\x81\\x40\\x2f\\xb1\\x4e\\xd0\\xbf\\xac\\x8d\\x04\\x3f\\x11\\x7d\\x61\\x24\\x52\\x1a\\xfa\\xe0\\x91\\x6a\\x51\\x0d\\x56\\x8a\\xcf\\xa3\\xaa\\x33\\x01\\xbc\\x97\\x9a\\xc2\\x8d\\x55\\x1d\\xbb\\xea\\x6c\\xea\\xc4\\xc2\\x12\\xaa\\x8c\\x84\\x92\\xb3\\x61\\x3a\\xe7\\x39\\x5d\\xd4\\x12\\x5f\\xc4\\xc2\\x5d\\x5b\\x4d\\x99\\x23\\x08\\x21\\xd4\\xb1\\x7e\\xc2\\xee\\x6b\\xe7\\xd6\\x04\\x19\\x5a\\x21\\x54\\x33\\x3b\\x97\\x35\\x26\\x58\\x0c\\xa7\\xef\\x9e\\x30\\xc6\\xc1\\xdd\\x42\\xef\\x2a\\xfe\\x42\\xb1\\x1b\\x1a\\xa4\\x9b\\x9c\\xca\\xba\\xca\\x17\\x09\\x1e\\xeb\\x38\\x0e\\xc5\\xe3\\x4a\\xd1\\xe3\\x82\\x7c\\xc6\\x0d\\xac\\xf1\\x44\\x28\\x6c\\x78\\x92\\x59\\x0b\\xd2\\x67\\x1a\\x8d\\xc5\\xf3\\xa7\\x02\\xc1\\xde\\x7c\\xd3\\xb4\\x2c\\x1b\\x15\\x0b\\x09\\xc3\\xe5\\x8e\\xf6\\x94\\x3b\\x45\\xd8\\x9d\\x41\\xdf\\x36\\x1f\\x1d\\x5c\\x25\\x56\\x55\\x91\\xb6\\xac\\x8d\\xea\\xa7\\x36\\x76\\x53\\x1f\\x6e\\x5a\\xbe\\x58\\x04\\xb0\\x09\\x7f\\x8d\\x45\\xea\\x29\\x39\\x17\\x73\\x33\\xca\\xce\\xf1\\x2e\\x4b\\x71\\xfe\\x49\\x36\\xba\\xfe\\x00\\x74\\x7a\\x89\\x30\\xbc\\xea\\x55\\xb8\\xfd\\x84\\xa0\\x1f\\x6d\\xf8\\x4e\\x7a\\xcb\\x93\\x1f\\xc7\\xc0\\x1d\\xdf\\xd6\\x3d\\xee\\xc3\\xad\\x3e\\x69\\xdf\\xa2\\xb7\\x35\\x50\\x58\\x3d\\x57\\x47\\xee\\xe9\\x6c\\x55\\x36\\x36\\x87\\x97\\xe2\\x47\\xf2\\x3f\\x53\\x7d\\x79\\x07\\x9a\\xb6\\xda\\x31\\x41\\x02\\xc7\\x44\\x3d\\x41\\x96\\x0e\\x3a\\x3d\\x8c\\x35\\x9c\\x4a\\x4e\\xc6\\x26\\xfc\\xc4\\x4e\\x11\\x0e\\xa7\\x44\\xd4\\x17\\xaa\\x85\\x0d\\xb8\\xec\\xdb\\xfe\\x34\\x0a\\x96\\x2d\\xb0\\xd8\\xc5\\x7d\\xc5\\x17\\xbe\\x8b\\x40\\xd1\\x4d\\xe9\\x7b\\x1e\\x9e\\x04\\x26\\x44\\x7f\\xde\\x0a\\x04\\xe5\\x06\\x79\\xc5\\x3b\\xa1\\xaa\\x3c\\xdc\\x38\\xc7\\xed\\xe6\\xdb\\x6c\\x05\\x4b\\x1e\\x9c\\xe7\\xde\\xad\\xaf\\x93\\xeb\\xdd\\x47\\x07\\x91\\x53\\x5f\\x3e\\xcf\\xab\\xf3\\x41\\x63\\x55\\xf7\\xa1\\x8a\\x38\\xaf\\xe6\\xbf\\xe5\\x07\\xef\\x08\\xc4\\x37\\x3a\\x4a\\x69\\xde\\xe1\\xfc\\xb6\\x5b\\x16\\x31\\xa0\\xde\\x14\\x88\\x64\\x9d\\x0b\\xb2\\x67\\x9a\\x9a\\x45\\xf6\\x78\\x20\\xb2\\xa4\\xa1\\xe5\\xa5\\x48\\x07\\x2d\\xa7\\x03\\x2d\\x17\\x25\\x55\\xe7\\x88\\xcc\\x98\\x60\\xeb\\xb3\\xc0\\xc3\\x59\\x49\\x37\\x51\\xb0\\xc2\\xc9\\x50\\xa7\\xfc\\xf4\\x80\\x3c\\x14\\x7f\\x93\\x40\\xfc\\x93\\xd8\\x5f\\x1e\\xfa\\x57\\xb3\\x90\\x81\\xb9\\x2d\\x93\\x47\\x3f\\xd2\\x35\\x16\\xc4\\x95\\x0e\\xd4\\xb2\\x9a\\x2e\\xd3\\xa0\\x42\\xae\\x3d\\x92\\xa1\\xe5\\x2c\\xb7\\x09\\x63\\x6f\\xc7\\x27\\x2f\\xd7\\x47\\x20\\x8b\\xee\\x2b\\x16\\xd1\\x91\\xe4\\xc6\\xde\\xb2\\x76\\x72\\xaa\\x34\\xe4\\x39\\x14\\xcf\\xf2\\x05\\x5c\\xa4\\xee\\x8b\\xa3\\xe1\\xdc\\x58\\xa6\\x79\\xc7\\xf7\\xde\\xe2\\xc1\\xd5\\x3e\\x28\\x75\\x09\\x70\\xf5\\x7d\\x85\\xea\\xb1\\xc2\\x6b\\x89\\xbb\\x73\\xe0\\xb1\"},\n{{0xc5,0x96,0x29,0x61,0x81,0x5b,0x57,0xcd,0x16,0x24,0x03,0xce,0x08,0xe4,0x10,0x5d,0xdb,0x8a,0xae,0x2d,0x3f,0x53,0x3f,0xb4,0x9c,0xc2,0x36,0xb5,0xff,0x50,0x4d,0x6e,},{0xdb,0xad,0xe7,0x22,0x36,0xba,0x12,0xd4,0x97,0x7b,0xa4,0x6c,0x36,0x4b,0xb6,0x9a,0x88,0x7f,0xf4,0x02,0xde,0x91,0xd4,0x7a,0xfa,0x9b,0x93,0xc9,0x5b,0xe7,0x1e,0x7e,},{0x81,0x01,0xba,0xef,0x00,0x4e,0xb6,0xf5,0xad,0x4d,0xe0,0x97,0x9f,0xf3,0x6d,0x34,0x39,0xb8,0x21,0x2b,0xdc,0x92,0x89,0x42,0xe4,0x31,0x91,0x5b,0x3f,0xd1,0x8b,0xc2,0xad,0x67,0xb2,0x6f,0x18,0x94,0x1d,0xcb,0x16,0xd2,0xc2,0x91,0x91,0x42,0x1e,0x77,0x9f,0xed,0x62,0x2f,0xd9,0xf5,0x82,0x64,0x4e,0xaa,0xdb,0x3f,0xe5,0xc0,0x98,0x03,},\"\\x4a\\xe4\\x14\\x8d\\x79\\xca\\x94\\x25\\x59\\x2a\\xa2\\x40\\xbd\\x15\\x34\\x24\\xa3\\xbf\\x4a\\xe2\\x73\\x95\\x87\\x2c\\xe5\\x72\\x8a\\xc7\\x61\\x35\\x96\\xa7\\x7d\\x5c\\xe8\\x56\\x5d\\x8d\\x6e\\x1b\\x59\\x35\\xb3\\x90\\x6c\\xaf\\xe1\\xff\\x88\\x8e\\xbc\\x98\\x15\\xe0\\x4a\\x62\\x4d\\xfc\\x4c\\x69\\x07\\xb8\\x5f\\x6f\\x1a\\x0d\\xbd\\xdf\\xf6\\x2e\\x91\\x51\\x22\\x0d\\x47\\x44\\x62\\xcb\\x9f\\x13\\xd8\\x9d\\x3a\\x93\\xa0\\x0b\\xa2\\xb6\\x0f\\x7e\\x7c\\xa6\\x3d\\xa1\\x7a\\x63\\x79\\xd6\\x73\\x55\\x1e\\x79\\x0b\\x59\\x11\\x72\\x7c\\x90\\x6d\\xc9\\x4f\\x86\\xd8\\x27\\x75\\x46\\xc1\\x56\\x4a\\x45\\x57\\x3a\\x77\\x43\\xbb\\x8a\\x13\\x8c\\xde\\x87\\xb3\\xb2\\xf2\\x8e\\x5e\\x24\\x59\\x40\\xa5\\x1e\\x7c\\x45\\x8c\\xf8\\xc5\\xf0\\xa7\\x02\\x75\\x96\\x25\\x53\\xe0\\xd2\\x39\\x0d\\x17\\x1d\\xb4\\x4c\\x2f\\x7a\\x5c\\x9e\\x9f\\x93\\xb9\\x0f\\x7a\\x5f\\x54\\xf1\\x91\\xb0\\xd8\\x75\\xba\\xd7\\xe0\\xbe\\xb9\\x80\\xc2\\xa3\\x36\\x5c\\xd7\\xb9\\x20\\x87\\x24\\xf4\\x65\\x44\\x18\\x11\\x7e\\x16\\xef\\x71\\x34\\xe3\\xe2\\x79\\x4b\\x6f\\x9e\\x80\\xec\\xab\\xec\\xa3\\x25\\x4e\\x70\\x4c\\x21\\xb7\\xad\\x30\\xc5\\xde\\xe0\\x17\\xea\\x25\\x33\\xfc\\xd9\\x42\\x51\\xe5\\x5a\\xe7\\x5a\\x8c\\xc6\\xdb\\x66\\x74\\xb3\\x9c\\x88\\xca\\x42\\x00\\x60\\x43\\xd6\\xbd\\x9b\\x00\\xec\\xf6\\x4c\\xea\\xfe\\xeb\\x40\\x2b\\x1f\\x22\\xfd\\x89\\x1f\\x2d\\x11\\xc5\\x15\\xc1\\xab\\xa6\\xa2\\xd4\\xc0\\xbd\\x21\\x81\\xa4\\x8e\\x43\\xfd\\x1c\\x0a\\xf9\\x1f\\x9b\\x7b\\x7d\\x37\\xf3\\xdc\\xd9\\xe4\\xc0\\xa7\\x59\\x74\\x84\\x67\\xd3\\x48\\xa8\\xb1\\x16\\xdf\\x6a\\x4e\\xac\\xf1\\x78\\xae\\xcc\\xcd\\x30\\x66\\xe9\\x2d\\xca\\x45\\xda\\x7a\\x3e\\x31\\x9f\\x37\\x71\\xeb\\x34\\x90\\x02\\x21\\x93\\xc5\\xb6\\x52\\xf0\\x45\\x68\\x7e\\x17\\x05\\xf2\\xe5\\x69\\x1c\\x13\\x4b\\xe4\\x00\\x63\\x53\\xd7\\xec\\xd0\\xe9\\x18\\xd5\\xde\\x0f\\x3b\\x87\\x80\\x9f\\xca\\x4a\\xcf\\xab\\x94\\xe1\\x14\\x8f\\xf7\\xcf\\x07\\xf7\\xcf\\xd0\\xc7\\x45\\xdd\\x2b\\xe0\\x1a\\x24\\xa5\\xe0\\x69\\x28\\x06\\x98\\xbc\\x3f\\x54\\x00\\xa6\\xdc\\xd0\\x8e\\x44\\x59\\x5c\\x03\\x88\\xe4\\x48\\x33\\x76\\x8f\\xc4\\x91\\x04\\xee\\x11\\x5b\\xdc\\xb0\\x2b\\xfb\\xda\\x17\\x9d\\x16\\x4c\\xe9\\x69\\x93\\x66\\x29\\xf2\\x33\\x56\\x01\\xb5\\x6f\\xe8\\xf7\\x85\\xcc\\xa3\\x80\\x5f\\x04\\x03\\x87\\x2c\\x62\\xf7\\x3c\\x3c\\xe8\\x05\\x63\\xd0\\x70\\xe9\\x76\\xd8\\xec\\xc5\\x11\\x24\\xe2\\xca\\xce\\x7e\\xe1\\x86\\x99\\x04\\x7c\\xb0\\xf8\\xfb\\x8d\\x9c\\x59\\xb8\\xa6\\x0d\\x12\\xc0\\x8a\\x09\\xfc\\xe5\\x8f\\xd9\\x2c\\xd3\\x6d\\xb6\\xa8\\xe8\\x9d\\x11\\x8c\\xf8\\x8a\\x92\\xdc\\x8a\\x26\\x00\\xbd\\x95\\xf5\\xa8\\xe8\\x5d\\xb5\\xcd\\xbb\\x24\\x9c\\xa8\\x12\\xca\\x20\\x9c\\x76\\x18\\x05\\x1c\\x45\\x64\\xa3\\xa0\\xe1\\x92\\xb7\\xe4\\x59\\x92\\x45\\x6c\\x87\\xd1\\x74\\x12\\xc1\\x1a\\xde\\xad\\x52\\x6a\\xb8\\xdb\\x21\\x45\\x2f\\x74\\x71\\xd1\\x7f\\x2e\\xbc\\x90\\x01\\x54\\x50\\xed\\xf4\\xf0\\xa4\\x4f\\xb2\\xf4\\x90\\x5f\\x74\\xd7\\x02\\x75\\xcc\\xd8\\x9b\\x93\\xa6\\x50\\x47\\x3c\\x02\\xa7\\xda\\x0c\\xbc\\x67\\x91\\x5c\\xeb\\x7a\\x1e\\xa5\\x9f\\xa8\\x88\\x44\\x72\\xdc\\x91\\x7e\\xe9\\xd2\\x46\\x33\\x9c\\x59\\x26\\x84\\x3e\\xcf\\x53\\xfa\\xfd\\xc5\\x6a\\x69\\x56\\x01\\xa2\\x76\\xc2\\x3a\\x84\\x3e\\x4d\\x30\\xf8\\x9c\\x97\\xc9\\xee\\xe6\\xdf\\xc7\"},\n{{0xde,0xe6,0x86,0x6c,0x78,0x74,0xc1,0x27,0x02,0x9e,0x96,0xe0,0x25,0xbf,0xfd,0x35,0xfc,0xfd,0xf4,0xdc,0x36,0x96,0x6c,0x15,0xee,0x62,0x93,0x36,0x80,0x13,0xd3,0x79,},{0x08,0xc9,0x4d,0xa3,0x51,0xbb,0x2b,0xee,0x72,0xe6,0xe1,0x96,0xbe,0x74,0x88,0x07,0x58,0x37,0x62,0xc5,0x29,0x6e,0x05,0xb1,0xe5,0x29,0xc4,0x7c,0x6b,0xba,0xce,0xc6,},{0xb7,0x8e,0xbd,0x6d,0x65,0xb1,0x75,0xd4,0xbb,0xd3,0xd9,0xa2,0x08,0x2a,0x0e,0xfe,0x6e,0x99,0x1c,0xb2,0xe4,0x03,0x52,0x1e,0xec,0xe0,0x0f,0x41,0x8f,0x2e,0x95,0x6b,0x66,0x90,0x78,0x80,0x65,0x8b,0x9e,0x8e,0x47,0x69,0x96,0x53,0xd1,0x59,0x13,0x23,0x80,0xd9,0xce,0x11,0x09,0xaf,0x9c,0x27,0x57,0xda,0xf4,0xcd,0xf1,0x8c,0x9c,0x0a,},\"\\xf1\\xaa\\x19\\x77\\xf5\\x31\\x1b\\x53\\x8b\\x94\\x0a\\xe4\\x42\\xa3\\xab\\xc8\\x9a\\xac\\xcd\\xcd\\x0a\\x79\\x38\\x0a\\x24\\x25\\x8d\\x4a\\x9f\\x1c\\xe6\\x38\\xfc\\x2f\\x5b\\xa2\\xe5\\x3f\\x8e\\x1f\\xa6\\x17\\x6f\\x17\\x8d\\x90\\x24\\xa7\\x78\\x94\\xc2\\x8c\\xad\\x42\\xd6\\x29\\xc7\\x93\\xd6\\x8a\\x02\\xbe\\x94\\x11\\xb5\\x27\\xac\\xad\\xae\\x7e\\x5c\\x38\\x51\\xba\\xbb\\x45\\xb5\\xfe\\xce\\x32\\x9e\\x29\\x03\\x4c\\xd4\\x25\\x71\\x08\\x37\\x27\\xf3\\x5a\\xec\\xad\\x7c\\x9b\\xe5\\x95\\x4e\\xc6\\x4e\\x8f\\x6e\\xca\\xb7\\xcc\\x05\\x90\\xe5\\x41\\x56\\xa4\\xe1\\xa4\\x53\\x03\\x84\\x9f\\x78\\x97\\xe7\\x2c\\xf2\\xfb\\xcd\\x84\\xf5\\x6c\\x72\\xf9\\x41\\xdb\\xb0\\xb0\\x9a\\x32\\xe6\\x38\\x6f\\xbe\\x18\\xa4\\x3b\\xb9\\xbd\\x8b\\x79\\x3e\\x4b\\x9e\\xdd\\x53\\x21\\x03\\xea\\xb5\\x4d\\x62\\x71\\x17\\xd2\\x81\\x39\\xb6\\x4e\\x60\\xfb\\x0b\\x81\\xd0\\x90\\x01\\xbb\\x24\\x04\\xd9\\x25\\xe2\\x65\\xba\\xbd\\xc6\\x9f\\x96\\xb1\\x35\\xe9\\xe6\\xab\\x7f\\xeb\\xb1\\xed\\x30\\x75\\xd6\\xaa\\x2a\\xbd\\x2b\\xbf\\x9b\\x65\\xfa\\x9b\\x3b\\x71\\x91\\xef\\x37\\xb6\\x33\\x60\\x59\\x10\\xee\\x88\\xf6\\x6e\\xad\\xa7\\x9f\\x00\\xf5\\x36\\xd3\\x80\\xb8\\x2f\\x2f\\x4b\\x59\\x85\\x11\\x2d\\xe0\\x04\\xa5\\x66\\x03\\xf4\\x43\\x6d\\x8f\\xf3\\x00\\xf4\\x2b\\xf5\\xac\\xdc\\x7a\\x4b\\xf1\\xea\\x9d\\x41\\x96\\xc4\\x80\\x49\\x5b\\xac\\xb0\\x06\\x76\\x30\\xfc\\xc0\\x00\\xb4\\xf2\\x79\\xdd\\x3f\\x30\\xf3\\x53\\x27\\x60\\x92\\xd1\\x52\\xc3\\xf4\\x3e\\xfd\\xc0\\x41\\xde\\xaa\\x0b\\xc5\\xaa\\xab\\xa7\\xf8\\xbb\\xd8\\x5e\\x69\\xc1\\x37\\x42\\xd6\\x78\\xdb\\xb6\\x53\\x60\\xaa\\xf7\\xb5\\x48\\xa0\\x44\\xc0\\xec\\x60\\xa5\\x7a\\xf6\\x50\\xbc\\x31\\x97\\x3f\\x83\\x2f\\x96\\x12\\x65\\xbc\\x23\\x18\\xf8\\x07\\x75\\xaf\\xd5\\x1f\\x55\\x19\\x4c\\x42\\x42\\x3f\\x7b\\xf4\\xe0\\x05\\x2f\\x98\\xcb\\x20\\x69\\x13\\xff\\xea\\x48\\x86\\xec\\xd2\\x7a\\x41\\x79\\xb1\\x37\\x73\\xf9\\x47\\x50\\x2e\\x18\\x1b\\xf1\\xa1\\xf2\\xc6\\x2c\\x6f\\x08\\xc2\\x03\\x59\\xf0\\x6d\\xf2\\xb1\\x81\\x27\\x04\\x3b\\x10\\x70\\xd0\\x19\\x4e\\xf5\\xe5\\xbf\\xd3\\x7d\\x22\\x79\\x84\\xcf\\xb1\\x09\\x89\\xf2\\x1c\\x71\\xad\\x0f\\xe3\\xb8\\x12\\x27\\xd3\\xa7\\x17\\x89\\x45\\x5e\\xda\\x38\\x3c\\x22\\xf4\\xd2\\xfc\\xc7\\x25\\x79\\xf4\\x65\\xe0\\x66\\xf3\\xd3\\x8b\\xef\\xc0\\x24\\xef\\xef\\x6c\\x2e\\x32\\x96\\x49\\xce\\x43\\x4d\\x62\\x73\\x67\\xa9\\x00\\xd0\\x7f\\xe6\\x23\\x42\\x35\\xc8\\x46\\x56\\xea\\xc5\\xdd\\x0d\\x78\\x8c\\xf4\\xcb\\x31\\x87\\x18\\x24\\xd6\\x6a\\xe4\\xbc\\x89\\xed\\xeb\\xa1\\xb3\\x67\\x01\\x29\\x84\\x53\\xe8\\xda\\x1e\\x69\\xcf\\xb8\\x68\\x09\\x5c\\x3b\\xe6\\xed\\x21\\x82\\xda\\x1c\\xff\\x49\\x05\\xaf\\xd2\\x07\\x31\\xac\\x1e\\xd9\\x84\\x16\\x47\\x37\\x90\\x3c\\x7d\\x8b\\xb0\\xad\\x16\\xae\\xcf\\x2f\\xae\\x33\\x74\\x04\\xfe\\x35\\x66\\x45\\x15\\xd9\\x3b\\x70\\x1e\\x2f\\x87\\x86\\x64\\x45\\x4c\\x0d\\xec\\xd1\\xc6\\x55\\x8a\\xda\\xce\\x3c\\xdb\\x22\\x75\\x07\\xa5\\x16\\x06\\xf0\\xa5\\x4d\\xf8\\xdf\\xaa\\x42\\x02\\x05\\xdd\\x57\\xc6\\x52\\x42\\xff\\x24\\xa4\\x05\\xef\\x85\\xc9\\x2d\\x60\\x28\\x86\\x93\\x2b\\x35\\xfa\\xbe\\x9c\\x3b\\xce\\xbf\\xc6\\x23\\x56\\x39\\xe8\\x73\\xfc\\x2d\\xd0\\x84\\xc5\\x2c\\xd6\\xa7\\x41\\x3b\\x83\\x1d\\x1c\\xc9\\x99\\x31\\x37\\x3a\\xab\\xd8\\x47\\x62\\x0e\\xb6\\x9b\\xb0\\xfa\"},\n{{0x52,0x36,0x23,0x55,0x59,0x95,0xba,0xaf,0x2a,0x27,0xad,0xcb,0x1e,0xba,0xfa,0xa8,0x02,0xd2,0x3e,0xf7,0xab,0xfa,0x97,0x75,0xf2,0xc9,0xbf,0xa0,0x7d,0x64,0xe0,0xac,},{0xd3,0x4d,0xea,0xe6,0x52,0x3e,0x61,0x9d,0xd1,0xbf,0xc8,0xf3,0xc4,0xca,0x4b,0x78,0xb3,0x68,0xc0,0xf7,0x20,0x03,0x5e,0x14,0x4c,0x3f,0x2f,0xc1,0x05,0xd4,0xce,0x21,},{0xb1,0x87,0x17,0x29,0xfe,0xc8,0x3a,0xea,0x0a,0xaa,0x47,0x2b,0x70,0x0a,0xcd,0x09,0x48,0x13,0xfb,0x7d,0x57,0xb9,0x09,0xe0,0xea,0xaf,0x21,0xee,0x93,0x18,0x47,0xad,0xde,0xdd,0x2b,0xe8,0x53,0x3d,0x0c,0x30,0x5c,0xb9,0xcf,0xe5,0x08,0x0e,0x76,0xc2,0x80,0x8b,0x6e,0x51,0xc9,0x82,0x62,0x90,0xdd,0xb7,0xb9,0x4b,0x6f,0x7d,0x58,0x0b,},\"\\x05\\x53\\xe6\\x9e\\xf2\\x11\\x65\\x2d\\x62\\xbf\\x28\\x1b\\xfb\\xdd\\x37\\xbe\\x22\\x76\\x9d\\x81\\x97\\x46\\x36\\x1c\\x7d\\x65\\xdd\\xd0\\xfa\\xd6\\x77\\xcc\\x04\\x38\\xb3\\x01\\xd1\\x51\\x45\\x78\\xe0\\xda\\x58\\xe5\\x5f\\x72\\x9f\\xa8\\xe6\\x6d\\xde\\xb7\\xf9\\x73\\xa8\\x18\\xd2\\x4e\\xd8\\xfe\\x02\\x7b\\x84\\x91\\x17\\x9d\\x07\\x77\\x3f\\xb5\\xd2\\xbb\\x96\\xaa\\x85\\xd6\\xb3\\x75\\x04\\x54\\xe5\\x0d\\xe9\\x1f\\x9b\\x88\\xae\\xe8\\xaa\\x68\\xe6\\xbb\\x53\\xed\\xc6\\x66\\x77\\xb4\\x1e\\x60\\x1a\\x46\\xab\\x4b\\xb1\\xe6\\x56\\xe7\\xfa\\x5f\\x01\\x79\\x93\\x36\\x80\\xa6\\xec\\x95\\x04\\x27\\x5e\\x7a\\xdf\\x7a\\x32\\x48\\xe6\\x3a\\x0f\\xc9\\xc1\\xea\\x5a\\xe9\\x6c\\xd0\\xc6\\x5a\\x89\\xa7\\x7c\\xec\\x2b\\x1f\\xd8\\xf4\\x53\\x7e\\x82\\xc1\\xc4\\x88\\xa6\\x9a\\x0e\\xf6\\x4f\\x58\\x73\\x4d\\x9e\\x73\\x47\\x8e\\x1d\\x1f\\x12\\x31\\x14\\xef\\x66\\x08\\x5e\\x0b\\xa3\\x19\\xcb\\x81\\x0b\\x66\\xaf\\x96\\xd1\\x30\\x8b\\x1a\\x2b\\xd9\\x2b\\xa2\\xc2\\x65\\xaa\\x30\\x9e\\xcd\\x55\\x57\\xd4\\x02\\xc3\\x80\\x2c\\xae\\x8d\\x7e\\x95\\x00\\x7f\\xe6\\x10\\xc2\\xaa\\x75\\xfc\\x66\\x19\\x6c\\x3f\\xad\\xfe\\x99\\x7d\\x6d\\x59\\x98\\xe1\\x8d\\x26\\x0e\\x9d\\xa3\\x1d\\xa9\\x21\\x8c\\xba\\xd1\\x03\\xcb\\xfc\\x2c\\x75\\x47\\x76\\x5d\\x67\\xe8\\x1f\\x24\\xac\\x83\\x02\\x2e\\xf5\\x1c\\x6c\\xc5\\x08\\x64\\x36\\x6a\\x35\\xf6\\xb9\\xb9\\xaf\\x94\\xe8\\x4c\\xaa\\x9f\\xd3\\xd7\\x67\\xc8\\x31\\xf0\\x96\\x7a\\x61\\x46\\x2f\\xbc\\xfc\\xc8\\x03\\xf1\\x2e\\x37\\x39\\x03\\x9a\\xcd\\x5d\\xbe\\x93\\x66\\xf0\\x5a\\x33\\xdb\\xea\\xf3\\x60\\xe2\\xdd\\xcb\\xe5\\xc4\\x43\\xf8\\x0e\\xf2\\xad\\x62\\xe0\\x3c\\x1d\\x5b\\x70\\xcd\\xea\\xb4\\xa7\\xdd\\x41\\x55\\x30\\x64\\xc8\\xd1\\x52\\x70\\x9d\\xef\\xf8\\x20\\x76\\xb9\\x07\\x11\\x92\\x37\\x6f\\x51\\xd4\\xc2\\xc7\\x1a\\x84\\xe8\\x9f\\x2d\\x94\\x01\\x32\\x0c\\x2e\\x45\\x9b\\x3e\\x24\\x3c\\xca\\x7c\\x26\\xfd\\x09\\x8c\\x26\\x4a\\xc8\\x8e\\xf6\\x38\\x92\\x1d\\x98\\x0b\\x0a\\xe9\\xe5\\x12\\xd3\\x72\\x03\\x7d\\x81\\xad\\xc4\\x81\\x26\\xd7\\xc9\\xe4\\xb5\\xaf\\xa5\\x7e\\xc2\\x65\\xd4\\x01\\xb9\\x65\\x3e\\x92\\x8a\\xfb\\x7d\\xff\\x9b\\x48\\xe2\\x95\\xe4\\x70\\xd6\\xb5\\x2e\\x88\\xb3\\x9d\\x0a\\x40\\xcb\\x8e\\xba\\x24\\x9f\\x8b\\x13\\xd8\\x11\\x13\\xdb\\x1d\\x3e\\x01\\xef\\x75\\xc7\\x22\\xf2\\x69\\x48\\x8e\\x96\\x3c\\xc8\\x18\\x27\\x04\\xf8\\xca\\x01\\x8e\\x73\\xdc\\x07\\x14\\xe9\\xa9\\xfc\\x79\\xbc\\x43\\x63\\xc2\\x8c\\xb3\\x98\\x43\\x74\\xf7\\x3b\\x2a\\xa8\\x78\\x6e\\x74\\xe0\\x15\\x95\\x07\\xa2\\x98\\x83\\xfe\\x0e\\xd1\\xc6\\x00\\xf5\\x25\\x88\\x5f\\x2f\\x10\\xea\\x00\\x6c\\x39\\xe5\\x9b\\x92\\x5b\\x76\\x5b\\x1e\\xde\\x53\\x42\\x57\\xa1\\xf4\\x0f\\x28\\x46\\x58\\x4f\\x06\\x97\\x46\\xb5\\x2f\\x56\\x00\\x43\\x0a\\x28\\x63\\xd7\\x93\\x60\\x95\\xfb\\xc2\\x2a\\x6a\\xda\\x67\\x4d\\x41\\xb3\\x74\\xe2\\xb8\\xb9\\xa1\\x9f\\xa7\\x12\\xb5\\x94\\x45\\x33\\xbb\\x6d\\x6e\\xc4\\x3b\\x89\\xd4\\x97\\x1b\\x70\\x20\\x5a\\x6a\\xcd\\x72\\xa8\\x99\\xda\\x12\\x61\\x82\\x04\\xdb\\x0c\\x3e\\x82\\x67\\xb8\\x45\\x79\\x16\\x93\\xe0\\xae\\x6a\\x35\\xf1\\x4d\\xa1\\xf8\\xf4\\xdd\\x17\\x4b\\xce\\x03\\x18\\xfb\\x5a\\x00\\xf6\\x72\\xed\\xe4\\x23\\x04\\xcf\\x04\\xa6\\x27\\x60\\x57\\x75\\x90\\xf2\\x7e\\x2d\\xfa\\x6e\\x5e\\x27\\x95\\xd6\\x60\\x53\\xb3\\x0a\\xf7\\xf1\\xbf\"},\n{{0x57,0x5f,0x8f,0xb6,0xc7,0x46,0x5e,0x92,0xc2,0x50,0xca,0xee,0xc1,0x78,0x62,0x24,0xbc,0x3e,0xed,0x72,0x9e,0x46,0x39,0x53,0xa3,0x94,0xc9,0x84,0x9c,0xba,0x90,0x8f,},{0x71,0xbf,0xa9,0x8f,0x5b,0xea,0x79,0x0f,0xf1,0x83,0xd9,0x24,0xe6,0x65,0x5c,0xea,0x08,0xd0,0xaa,0xfb,0x61,0x7f,0x46,0xd2,0x3a,0x17,0xa6,0x57,0xf0,0xa9,0xb8,0xb2,},{0x90,0x3b,0x48,0x4c,0xb2,0x4b,0xc5,0x03,0xcd,0xce,0xd8,0x44,0x61,0x40,0x73,0x25,0x6c,0x6d,0x5a,0xa4,0x5f,0x1f,0x9f,0x62,0xc7,0xf2,0x2e,0x56,0x49,0x21,0x2b,0xc1,0xd6,0xef,0x9e,0xaa,0x61,0x7b,0x6b,0x83,0x5a,0x6d,0xe2,0xbe,0xff,0x2f,0xaa,0xc8,0x3d,0x37,0xa4,0xa5,0xfc,0x5c,0xc3,0xb5,0x56,0xf5,0x6e,0xdd,0xe2,0x65,0x1f,0x02,},\"\\x2c\\xc3\\x72\\xe2\\x5e\\x53\\xa1\\x38\\x79\\x30\\x64\\x61\\x0e\\x7e\\xf2\\x5d\\x9d\\x74\\x22\\xe1\\x8e\\x24\\x96\\x75\\xa7\\x2e\\x79\\x16\\x7f\\x43\\xba\\xf4\\x52\\xcb\\xac\\xb5\\x01\\x82\\xfa\\xf8\\x07\\x98\\xcc\\x38\\x59\\x7a\\x44\\xb3\\x07\\xa5\\x36\\x36\\x0b\\x0b\\xc1\\x03\\x0f\\x83\\x97\\xb9\\x4c\\xbf\\x14\\x73\\x53\\xdd\\x2d\\x67\\x1c\\xb8\\xca\\xb2\\x19\\xa2\\xd7\\xb9\\xeb\\x82\\x8e\\x96\\x35\\xd2\\xea\\xb6\\xeb\\x08\\x18\\x2c\\xb0\\x35\\x57\\x78\\x3f\\xd2\\x82\\xaa\\xf7\\xb4\\x71\\x74\\x7c\\x84\\xac\\xf7\\x2d\\xeb\\xe4\\x51\\x45\\x24\\xf8\\x44\\x7b\\xaf\\xcc\\xcc\\xec\\x0a\\x84\\x0f\\xec\\xa9\\x75\\x5f\\xf9\\xad\\xb6\\x03\\x01\\xc2\\xf2\\x5d\\x4e\\x3b\\xa6\\x21\\xdf\\x5a\\xd7\\x21\\x00\\xc4\\x5d\\x7a\\x4b\\x91\\x55\\x9c\\x72\\x5a\\xb5\\x6b\\xb2\\x98\\x30\\xe3\\x5f\\x5a\\x6f\\xaf\\x87\\xdb\\x23\\x00\\x1f\\x11\\xff\\xba\\x9c\\x0c\\x15\\x44\\x03\\x02\\x06\\x58\\x27\\xa7\\xd7\\xaa\\xae\\xab\\x7b\\x44\\x6a\\xbc\\xe3\\x33\\xc0\\xd3\\x0c\\x3e\\xae\\x9c\\x9d\\xa6\\x3e\\xb1\\xc0\\x39\\x1d\\x42\\x69\\xb1\\x2c\\x45\\xb6\\x60\\x29\\x06\\x11\\xac\\x29\\xc9\\x1d\\xbd\\x80\\xdc\\x6e\\xd3\\x02\\xa4\\xd1\\x91\\xf2\\x92\\x39\\x22\\xf0\\x32\\xab\\x1a\\xc1\\x0c\\xa7\\x32\\x3b\\x52\\x41\\xc5\\x75\\x1c\\x3c\\x00\\x4a\\xc3\\x9e\\xb1\\x26\\x7a\\xa1\\x00\\x17\\xed\\x2d\\xac\\x6c\\x93\\x4a\\x25\\x0d\\xda\\x8c\\xb0\\x6d\\x5b\\xe9\\xf5\\x63\\xb8\\x27\\xbf\\x3c\\x8d\\x95\\xfd\\x7d\\x2a\\x7e\\x7c\\xc3\\xac\\xbe\\xe9\\x25\\x38\\xbd\\x7d\\xdf\\xba\\x3a\\xb2\\xdc\\x9f\\x79\\x1f\\xac\\x76\\xcd\\xf9\\xcd\\x6a\\x69\\x23\\x53\\x4c\\xf3\\xe0\\x67\\x10\\x8f\\x6a\\xa0\\x3e\\x32\\x0d\\x95\\x40\\x85\\xc2\\x18\\x03\\x8a\\x70\\xcc\\x76\\x8b\\x97\\x2e\\x49\\x95\\x2b\\x9f\\xe1\\x71\\xee\\x1b\\xe2\\xa5\\x2c\\xd4\\x69\\xb8\\xd3\\x6b\\x84\\xee\\x90\\x2c\\xd9\\x41\\x0d\\xb2\\x77\\x71\\x92\\xe9\\x00\\x70\\xd2\\xe7\\xc5\\x6c\\xb6\\xa4\\x5f\\x0a\\x83\\x9c\\x78\\xc2\\x19\\x20\\x3b\\x6f\\x1b\\x33\\xcb\\x45\\x04\\xc6\\xa7\\x99\\x64\\x27\\x74\\x1e\\x68\\x74\\xcf\\x45\\xc5\\xfa\\x5a\\x38\\x76\\x5a\\x1e\\xbf\\x17\\x96\\xce\\x16\\xe6\\x3e\\xe5\\x09\\x61\\x2c\\x40\\xf0\\x88\\xcb\\xce\\xff\\xa3\\xaf\\xfb\\xc1\\x3b\\x75\\xa1\\xb9\\xc0\\x2c\\x61\\xa1\\x80\\xa7\\xe8\\x3b\\x17\\x88\\x4f\\xe0\\xec\\x0f\\x2f\\xe5\\x7c\\x47\\xe7\\x3a\\x22\\xf7\\x53\\xea\\xf5\\x0f\\xca\\x65\\x5e\\xbb\\x19\\x89\\x6b\\x82\\x7a\\x34\\x74\\x91\\x1c\\x67\\x85\\x3c\\x58\\xb4\\xa7\\x8f\\xd0\\x85\\xa2\\x32\\x39\\xb9\\x73\\x7e\\xf8\\xa7\\xba\\xff\\x11\\xdd\\xce\\x5f\\x2c\\xae\\x05\\x43\\xf8\\xb4\\x5d\\x14\\x4a\\xe6\\x91\\x8b\\x9a\\x75\\x29\\x3e\\xc7\\x8e\\xa6\\x18\\xcd\\x2c\\xd0\\x8c\\x97\\x13\\x01\\xcd\\xfa\\x0a\\x92\\x75\\xc1\\xbf\\x44\\x1d\\x4c\\x1f\\x87\\x8a\\x2e\\x73\\x3c\\xe0\\xa3\\x3b\\x6e\\xcd\\xac\\xbb\\xf0\\xbd\\xb5\\xc3\\x64\\x3f\\xa4\\x5a\\x01\\x39\\x79\\xcd\\x01\\x39\\x69\\x62\\x89\\x74\\x21\\x12\\x9a\\x88\\x75\\x7c\\x0d\\x88\\xb5\\xac\\x7e\\x44\\xfd\\xbd\\x93\\x8b\\xa4\\xbc\\x37\\xde\\x49\\x29\\xd5\\x37\\x51\\xfb\\xb4\\x3d\\x4e\\x09\\xa8\\x0e\\x73\\x52\\x44\\xac\\xad\\xa8\\xe6\\x74\\x9f\\x77\\x78\\x7f\\x33\\x76\\x3c\\x74\\x72\\xdf\\x52\\x93\\x45\\x91\\x59\\x1f\\xb2\\x26\\xc5\\x03\\xc8\\xbe\\x61\\xa9\\x20\\xa7\\xd3\\x7e\\xb1\\x68\\x6b\\x62\\x21\\x69\\x57\\x84\\x4c\\x43\\xc4\\x84\\xe5\\x87\\x45\\x77\\x55\\x53\"},\n{{0x03,0x74,0x9c,0xa2,0x04,0x58,0xa3,0x5a,0x37,0xa8,0xd7,0xa2,0x6f,0x95,0x9f,0x0d,0x59,0xf6,0xdc,0x99,0x73,0xfa,0x36,0x3c,0x1f,0xf8,0xca,0x4e,0x63,0x8c,0x2c,0xd3,},{0xea,0xeb,0x94,0xf4,0x06,0xbd,0xe6,0xa7,0xcf,0x8b,0xde,0x2a,0xdf,0x30,0x81,0xf8,0x37,0x5b,0x87,0xd9,0x33,0x5d,0x49,0x6c,0x71,0xd0,0x42,0xcd,0x2e,0xaa,0x16,0x6c,},{0x78,0xa3,0x87,0x7e,0x02,0xbd,0xfd,0x01,0x5e,0x7f,0x86,0xa3,0x27,0xa4,0x8c,0xc3,0xa5,0x23,0x0b,0xbd,0xb1,0x24,0x3f,0x1a,0x8c,0xf2,0x27,0xf7,0x8a,0xb5,0xe7,0x68,0x0d,0xe3,0x01,0xa9,0x15,0xdc,0x11,0xb3,0x36,0xfb,0x5f,0x65,0x66,0x84,0x8b,0x42,0x50,0x0a,0xdb,0x5d,0x67,0x39,0x69,0x12,0x2b,0xa8,0xf0,0x05,0x3c,0xd3,0x06,0x0b,},\"\\xee\\xf5\\xce\\xeb\\xd0\\x44\\x5e\\x9c\\x91\\x81\\xaf\\xf9\\xc6\\xf2\\x66\\x01\\x28\\xfc\\xfb\\x63\\x69\\x1a\\x42\\xcf\\xa4\\x43\\xd6\\xa6\\x49\\xef\\xc5\\xfa\\xd8\\xc2\\x08\\x03\\x76\\x3e\\xe9\\x7d\\x1d\\xba\\x08\\xe6\\x3e\\x08\\xa2\\x61\\x6d\\xa0\\x50\\x77\\x48\\x9f\\x2f\\xa2\\xc5\\x6b\\x75\\x34\\xf9\\x40\\x26\\x19\\x25\\x1f\\xdf\\x9c\\x32\\x0d\\xe7\\xaf\\x10\\x9e\\x2f\\xd8\\xb2\\x56\\x5c\\xe8\\xa7\\x52\\x4c\\x94\\x05\\xec\\x0f\\x8f\\xca\\xa7\\x14\\x9a\\x6d\\x21\\x0e\\xfd\\xe8\\x3b\\x11\\x1c\\xf8\\x2d\\xc0\\x83\\x5c\\xf9\\x4f\\x20\\xcd\\xb0\\x21\\xb7\\x3b\\xd2\\x62\\x66\\x65\\x55\\xe6\\xd6\\x27\\x07\\xb4\\x6e\\xe4\\x2f\\xa9\\x00\\xb4\\xf4\\xf7\\x05\\xde\\x33\\xd3\\xdb\\xdc\\x68\\xa8\\x8d\\x1a\\x4d\\x0a\\xe9\\x33\\x56\\x6d\\xb6\\xc6\\x23\\x7e\\xc8\\xab\\xe1\\x02\\x4d\\xac\\x4b\\x7f\\x46\\xd4\\x07\\xbe\\x16\\x59\\x4d\\x90\\x46\\xc7\\x31\\x2d\\xda\\x66\\x14\\xd9\\xbc\\xdb\\x01\\xfb\\x83\\x24\\xfc\\x62\\xb8\\xee\\xaf\\x0a\\xbc\\x23\\xcd\\x57\\x0e\\x30\\x4f\\xca\\x08\\xe8\\x8c\\x73\\x5e\\x5d\\x31\\x59\\x24\\x09\\xce\\xb5\\x83\\x86\\x2e\\x6b\\x0a\\x76\\x77\\x29\\xf7\\x55\\x6f\\xa2\\xc0\\x53\\x64\\x4d\\x36\\xc8\\x33\\x7c\\x02\\x74\\xe7\\x49\\x20\\x29\\x82\\xfb\\x4a\\x17\\x1a\\xca\\xc1\\x96\\xc0\\x2b\\x7f\\x16\\xa8\\xda\\x49\\x07\\x1c\\x8a\\xb8\\x07\\x6d\\xd5\\xd3\\xab\\xad\\xfe\\x3a\\xf8\\x2c\\xa8\\x5d\\xa0\\x2d\\xcc\\x1c\\x4a\\x6f\\x2e\\x19\\x30\\xbe\\xe2\\x00\\x9e\\xee\\x0d\\x97\\x1e\\x40\\xdd\\x12\\x17\\x5c\\x8d\\x00\\x69\\x4f\\x03\\x25\\xa3\\xb3\\x13\\x3c\\x0d\\x0b\\xd3\\x82\\xa5\\x19\\x4f\\xb2\\x14\\x22\\xce\\x67\\xc7\\x8a\\x5a\\x6e\\x15\\x37\\xe3\\xb9\\x7d\\x5e\\x20\\x4e\\x5d\\x19\\x56\\x96\\x39\\x0f\\x77\\xd1\\x90\\x24\\xc1\\xbf\\x6b\\x51\\x25\\xa0\\xcd\\xbf\\x7b\\x98\\x80\\x03\\x61\\x81\\xc9\\x8e\\x1a\\xc2\\xe5\\x16\\x5b\\xd4\\x96\\xcf\\x99\\x74\\x51\\xa1\\xc1\\x21\\x02\\xe6\\x69\\x46\\xb1\\x67\\x6a\\xbd\\x4c\\xbd\\xd2\\xc1\\x16\\x73\\xf4\\xf2\\xcd\\x5f\\x3c\\x9a\\x43\\x4d\\x74\\x7f\\xa0\\x5b\\x40\\xfb\\xc7\\x22\\x68\\xb4\\xeb\\x28\\x42\\xe4\\x74\\x1f\\x51\\xb7\\x70\\x9b\\x6a\\xcc\\xc4\\x7f\\xca\\xf7\\x0d\\x9c\\x1c\\x4c\\x35\\x86\\x71\\x19\\xd8\\x1c\\xb3\\xff\\x1f\\x16\\x08\\x11\\x33\\xf1\\x65\\x9a\\xed\\x85\\xf6\\x3b\\xc9\\x01\\x98\\x9e\\x26\\x17\\xfc\\xce\\x15\\x3c\\x29\\x78\\xd7\\x08\\xfd\\x02\\x44\\x9a\\xe4\\xd5\\x38\\xd1\\x22\\xdd\\xb8\\x52\\x7c\\x0a\\x76\\xa1\\x02\\xee\\xff\\x6e\\xdb\\x65\\xdb\\xa2\\x98\\xd3\\xc2\\x17\\xf6\\x55\\x18\\x14\\xed\\xde\\xec\\xe1\\xae\\xf5\\xf3\\x71\\xa5\\x4f\\x12\\xbf\\xfd\\x6b\\x49\\x61\\x81\\x9a\\x0f\\x24\\x4f\\xf0\\xd7\\xd8\\x69\\x4c\\x14\\x42\\x2d\\xe9\\x82\\x2c\\x13\\x17\\x9e\\x4e\\xeb\\x81\\x59\\x50\\x79\\xb9\\xdd\\x2a\\xd1\\xe7\\xc3\\x9b\\xd3\\x03\\xcc\\x44\\xae\\x3f\\x36\\x34\\x88\\x15\\x77\\xa2\\x66\\xfd\\x6b\\xb7\\x91\\x78\\x12\\xb9\\x99\\xdc\\x80\\x9d\\xc0\\x9c\\x3d\\x70\\x19\\xda\\xcd\\x28\\xe4\\x30\\x13\\xa2\\xf9\\xe4\\xf9\\x4b\\xb0\\xbf\\x71\\x24\\xef\\x09\\x17\\x83\\xf7\\x96\\x39\\x7f\\x64\\x63\\xbf\\x1e\\xfb\\x39\\xcd\\x46\\xf3\\x79\\x0a\\x1d\\x9b\\x6a\\x7c\\x30\\xf1\\x49\\xb5\\xe6\\x6c\\x29\\x37\\xe3\\x9c\\xb9\\x74\\x4d\\xdc\\x66\\xab\\x56\\x1b\\xad\\x4e\\x6f\\xa8\\x53\\x4d\\x69\\x88\\x38\\x22\\x64\\x3d\\x63\\xd8\\xbd\\x7b\\x18\\x16\\x21\\xa2\\x67\\xe9\\x55\\xe7\\x58\\xd1\\x79\\x2b\\x44\"},\n{{0x53,0xcb,0xd6,0xf6,0x8c,0xee,0x27,0xb9,0xf7,0xbc,0x05,0x9b,0x80,0x3b,0x44,0x79,0x49,0xbb,0xc9,0xc5,0xd5,0xa3,0x86,0x52,0xd7,0x78,0x9c,0xa1,0x54,0x20,0xde,0xa1,},{0x61,0x16,0x99,0x0b,0x53,0x31,0xe2,0x16,0x5f,0x82,0x74,0x3f,0x01,0xd8,0xe7,0xbd,0x5d,0x70,0x88,0xb3,0x01,0x59,0x83,0x3f,0xa7,0xb9,0x39,0xcf,0xb1,0xcc,0x04,0xd7,},{0xd8,0x25,0x04,0x40,0x5f,0xf1,0x6b,0xa6,0x44,0x3d,0xc4,0x82,0x36,0x72,0x63,0xa8,0xe2,0x00,0x36,0x0a,0xca,0xaa,0x83,0xfc,0x4e,0x4b,0x72,0xbd,0x24,0x9f,0x16,0x10,0x3e,0xc7,0xe5,0xa7,0xe9,0xca,0x17,0x19,0x8f,0x88,0x8e,0xac,0xa1,0x6b,0x74,0x0c,0xc3,0xf5,0xc3,0xb7,0xb6,0x17,0xa3,0x4b,0x94,0x91,0xc3,0xed,0x76,0xaa,0xb3,0x0d,},\"\\x30\\x6f\\x8e\\x1d\\xf0\\xa4\\xca\\x78\\xbd\\x77\\xe8\\xe1\\x19\\x1c\\x94\\xde\\xaa\\x82\\x64\\x83\\x55\\xc2\\xae\\xcb\\x7e\\x82\\xfc\\x56\\xd6\\x4c\\x50\\x46\\x19\\x24\\x7e\\x7c\\xf8\\x94\\x33\\x28\\xd1\\x1f\\x3d\\xb4\\xb1\\xdc\\x14\\x8e\\x8e\\xf6\\xf6\\xc3\\xbc\\x35\\x59\\x69\\x66\\x2a\\x28\\x1a\\x65\\x57\\x63\\x91\\x24\\x2b\\x7b\\xd5\\xa6\\x2f\\x8f\\xa7\\xac\\xb6\\x04\\xe3\\xa3\\x44\\xae\\x1a\\x9d\\x73\\x2a\\x25\\x43\\x15\\xf3\\x1a\\x04\\x64\\xc1\\xe6\\x58\\x74\\x62\\xd2\\x92\\x12\\xc4\\x0e\\x5e\\xcf\\x06\\x1e\\x26\\x9a\\xa0\\xb9\\x03\\x90\\xba\\x41\\x04\\x07\\x21\\x68\\x4b\\xf2\\xaa\\x95\\x82\\xd8\\x30\\x66\\x22\\x1d\\xb6\\x0d\\x0f\\x7a\\xe2\\xf1\\x49\\xa3\\x6e\\x16\\x95\\x27\\x04\\xfb\\x1f\\x3a\\x98\\x2e\\xac\\x6b\\x45\\x83\\x66\\x5c\\x63\\xe5\\xa8\\x99\\x6f\\x24\\xa5\\x66\\xdd\\x50\\x6a\\x33\\xd4\\xec\\x8a\\x02\\xb2\\xbd\\x34\\xb7\\x14\\xc7\\x45\\x00\\x0c\\x01\\x28\\xa3\\xc8\\x9d\\x94\\x25\\x06\\xd1\\x2f\\x4b\\xeb\\x90\\x0e\\x29\\x03\\xcd\\xb3\\x4b\\x35\\xca\\x9b\\x6d\\x3a\\xd9\\xb3\\x50\\xac\\x99\\xf4\\x1d\\xb3\\xac\\xfe\\x7f\\xe5\\x5a\\x28\\xc0\\xf0\\x06\\xb8\\x44\\xc9\\xdc\\x48\\x53\\xfd\\x98\\x53\\x5a\\xda\\x79\\x41\\x6d\\xca\\x5f\\xee\\x58\\x03\\xa2\\xd9\\xf5\\xd6\\x8e\\x6b\\x80\\x53\\x9f\\xf3\\x02\\xe9\\x73\\xf2\\x4e\\x9b\\xc8\\x8b\\x7c\\x41\\x94\\x11\\x7d\\xdb\\x9f\\x93\\x2b\\x32\\xd5\\xec\\x74\\x86\\x8a\\x13\\x63\\x1e\\xce\\x68\\x81\\x4b\\x93\\x14\\x21\\xdc\\x89\\x02\\x49\\x57\\x03\\x41\\xf4\\xb4\\x23\\xe8\\x6e\\x8e\\xe0\\x81\\xb2\\x27\\x02\\xf6\\x49\\xa6\\xc7\\xa0\\xb7\\xbd\\xf5\\xfb\\x75\\x62\\x02\\xbd\\x10\\xb0\\xbb\\x22\\x15\\xc7\\xd6\\x59\\x7e\\xff\\xd8\\x52\\xf0\\xb8\\x9a\\xbe\\xc1\\x5e\\xa8\\x22\\x57\\x68\\x9d\\xf8\\x1e\\x33\\x82\\x54\\xf9\\x3e\\x81\\xcb\\xf0\\x61\\x72\\x9d\\x48\\x3e\\xb5\\xcf\\x64\\x98\\x05\\xd7\\x8e\\xd8\\x92\\xdd\\x0b\\xd2\\x48\\xca\\x1e\\x25\\x2b\\xea\\x51\\x84\\x7e\\x1e\\x82\\xd3\\x9a\\xf5\\x80\\x50\\xdc\\x4a\\xfb\\xf9\\x11\\x5a\\x3a\\x60\\x49\\x3e\\x8c\\x0b\\xa2\\xe8\\x6e\\x08\\x98\\xcd\\x0d\\x43\\x08\\x91\\xb9\\xeb\\x0a\\x40\\xf8\\x74\\x31\\xe2\\x5f\\x41\\x53\\x8a\\x03\\x0f\\x88\\x4f\\xab\\x36\\xad\\x11\\x16\\x5d\\x26\\x7e\\x8d\\xd9\\x4d\\xcb\\x05\\xb9\\x3a\\x5a\\xe7\\x79\\x69\\x43\\x0e\\x18\\x10\\x13\\x4e\\x15\\x72\\x51\\xb9\\x82\\xdf\\x34\\x3d\\xff\\xae\\x61\\x23\\xa9\\x9a\\xa0\\x56\\x2d\\x5d\\xf7\\x24\\x08\\xf1\\xa6\\xe2\\x9c\\x40\\x59\\xa5\\xa8\\xaa\\xa4\\xe6\\x21\\x52\\x8f\\xc6\\x3a\\x9c\\xbe\\x1f\\x4c\\x0f\\xef\\x25\\xfe\\x3f\\x8e\\x18\\x15\\x77\\x74\\x09\\x7a\\x9d\\x91\\x02\\x0a\\x90\\x06\\xb6\\xc8\\x60\\xec\\x1e\\xe1\\x0d\\x52\\x1d\\x20\\x3a\\x1f\\x8b\\xb8\\x25\\x61\\x29\\x6f\\xaa\\xd4\\xb2\\x20\\x3d\\xa5\\x3b\\x20\\x7a\\x45\\x9b\\x29\\xc1\\x8b\\xc0\\x64\\x93\\x32\\xb1\\x80\\x7c\\x13\\xca\\x61\\xac\\xfa\\xf9\\x07\\x79\\xfe\\xbb\\xc7\\xf3\\x24\\x21\\x64\\x79\\x7e\\x6f\\x57\\x2c\\xb1\\x5a\\x9b\\xe5\\x88\\x73\\x43\\x45\\x5e\\x26\\xb9\\x10\\xc8\\xbe\\xfe\\xe4\\x2a\\xeb\\x04\\x7f\\x9a\\xbe\\x6b\\x37\\x50\\xdb\\xd7\\xde\\x99\\x20\\x2a\\x0b\\xb5\\x76\\xce\\x14\\x89\\xe6\\x1c\\x1f\\x5d\\x27\\xc6\\x79\\x2e\\x63\\x21\\x8e\\xdb\\xfd\\xb9\\xb3\\xdc\\x51\\x5b\\x42\\x54\\xd8\\x2c\\x85\\x9e\\x52\\xce\\x6b\\xd7\\xad\\x29\\x6d\\xd0\\xe3\\x70\\x9d\\x4c\\x46\\x63\\x62\\xf9\\x02\\x65\\xe9\\x9d\\xa7\\xd0\\xb7\\x01\"},\n{{0x8b,0x65,0x74,0xf6,0xd7,0x39,0x69,0x81,0xe2,0x23,0xa4,0x83,0x7b,0xc3,0x39,0xc3,0xfd,0x65,0x94,0x19,0x84,0x5a,0x21,0x21,0xbf,0x85,0xbe,0x2e,0x69,0x5d,0x86,0x0d,},{0xe3,0x81,0x1a,0xca,0x70,0x63,0x4f,0x5a,0x9c,0xe4,0xb5,0x92,0xa1,0x7b,0xb5,0xcf,0xda,0x53,0x44,0x24,0x22,0xe2,0x03,0xcd,0xa9,0x50,0x4c,0x9d,0x65,0xb2,0x63,0xe8,},{0x2f,0xd0,0x90,0x54,0x75,0xa2,0xce,0xc3,0xe7,0x6f,0x99,0x09,0xb8,0xaf,0xd8,0x3b,0xeb,0x8d,0xae,0xfa,0x77,0xaf,0xcd,0xa3,0x4c,0xb4,0xf1,0x17,0x28,0xef,0x15,0xfc,0x9c,0x1d,0x7f,0x6f,0x6a,0xff,0xfc,0x28,0xf3,0x87,0x4f,0x91,0x3e,0x17,0x98,0x0f,0x0e,0x8e,0x3d,0x5a,0xd2,0x39,0x51,0xdf,0x2b,0x32,0xef,0xaf,0x62,0x19,0xce,0x0d,},\"\\xa4\\x8a\\xac\\xc0\\x49\\x5f\\xa0\\xf1\\x25\\x9b\\x27\\x86\\x5d\\x3d\\x75\\xdc\\x52\\xc2\\xc8\\x28\\xea\\x8c\\x4c\\x2a\\xd7\\x85\\x77\\x07\\x2f\\xef\\x72\\x70\\xf6\\xa4\\xd5\\x82\\xbb\\x7b\\x96\\x2f\\x4c\\x3f\\xd1\\x49\\xa6\\x0a\\x06\\xbc\\x8e\\xfd\\x29\\x70\\xef\\x03\\x14\\x8d\\xdf\\x61\\x98\\xb9\\xb6\\x95\\xa6\\x9f\\xad\\xb5\\x34\\x09\\x51\\xcb\\x75\\x39\\x8a\\xc5\\x1a\\x4f\\xd5\\x54\\x30\\x37\\x8c\\xd5\\xda\\x88\\x85\\x21\\x0b\\xfd\\x21\\x46\\xf9\\x5c\\x62\\x76\\x32\\xfe\\x8b\\xe0\\x6d\\xe0\\x1a\\x7c\\x27\\xb8\\x9d\\xee\\xfd\\x67\\xef\\xc6\\x9c\\x9b\\x5c\\x62\\xb3\\x81\\x08\\xf7\\x76\\x22\\x91\\x43\\xda\\xe6\\x60\\xc1\\x0c\\xbe\\xa3\\xcd\\x4f\\x7e\\xe5\\x3d\\xc3\\x69\\x2e\\xd0\\x11\\x77\\xe4\\xa6\\xf7\\xe4\\x24\\xb5\\x66\\x6f\\x7f\\x49\\x5f\\x2a\\x65\\x60\\x2c\\x7d\\x08\\xc5\\xd5\\x72\\x23\\x4a\\x56\\x7c\\xb6\\xc3\\x8a\\xfd\\x79\\xca\\xb5\\xc4\\x03\\x6d\\x62\\x63\\x7a\\xef\\xab\\x55\\x88\\x76\\x9a\\x44\\x8a\\xb4\\xc6\\x5e\\x24\\x55\\x4b\\xd4\\x15\\x80\\x50\\xe0\\x9e\\xb5\\x8f\\x99\\xab\\x40\\x77\\x7b\\x03\\x56\\x70\\x9b\\x7c\\x02\\x5a\\xe5\\xae\\x54\\x22\\xac\\xf8\\x74\\x44\\x93\\x1a\\xe4\\xd9\\xa8\\xb3\\xd9\\x44\\x76\\x88\\x11\\x28\\xba\\x1e\\xb7\\x32\\x8f\\xaf\\xc7\\x5f\\x6b\\x9d\\xac\\xc9\\x6d\\x3b\\x64\\x87\\xdd\\xef\\x7c\\x59\\x26\\x2d\\xca\\xda\\x42\\x6a\\xac\\xb1\\x39\\x22\\x93\\x54\\x11\\x56\\x62\\x35\\xe0\\x58\\x37\\x26\\x22\\xd8\\x85\\xbd\\x0c\\xc0\\x49\\x58\\xdc\\xfb\\x17\\xe0\\x8f\\xcd\\x7f\\x14\\x7e\\x20\\x15\\x6c\\x8e\\x26\\xaf\\x85\\x53\\x0f\\x55\\x11\\xa6\\x8d\\xb4\\x3d\\xaf\\xc4\\xe6\\xa2\\x3f\\x66\\x7d\\xf3\\x74\\x3e\\xed\\xd7\\x1a\\x3f\\x07\\xf7\\x6f\\x94\\xd1\\x68\\x8a\\xfc\\x84\\x63\\xbf\\xa5\\xa4\\x39\\xae\\x31\\x14\\x69\\x94\\x8e\\x74\\x47\\x06\\x4f\\x0b\\x05\\x06\\xf3\\x67\\x19\\xc1\\x34\\x66\\xa1\\xb9\\x87\\x76\\xd9\\x67\\xec\\x58\\x20\\x8b\\xa6\\x74\\x03\\x73\\x03\\xdf\\xc6\\x19\\x0d\\xa7\\x83\\xff\\x27\\x30\\x3b\\x86\\xb5\\xfc\\x32\\x11\\xf0\\x1c\\x91\\x5e\\x83\\xa6\\xad\\x01\\x21\\x44\\x79\\x11\\xcb\\xe1\\xcf\\x69\\x6f\\x61\\x8f\\x60\\x23\\x66\\x43\\xf2\\xe9\\x4e\\x15\\x5d\\xb6\\x57\\x18\\x29\\x44\\xc1\\xa4\\x3b\\xdc\\x7b\\xd5\\xea\\xf3\\x48\\x1f\\xe1\\x28\\x40\\x92\\xcb\\x37\\x89\\xa8\\x92\\xbd\\x79\\xa1\\x11\\xfd\\x41\\x01\\x43\\xcf\\x91\\xae\\x33\\x28\\x60\\xb1\\xd2\\x9a\\xa0\\x41\\xd1\\x77\\xb5\\x0d\\x6c\\xc2\\xb9\\x66\\x0d\\x32\\x8c\\x0f\\x23\\x0a\\x35\\x15\\xe6\\xa0\\xd6\\x88\\x70\\x9c\\x0c\\xd3\\x47\\xad\\x2f\\xf3\\x2d\\x61\\xd1\\xe1\\xe9\\xba\\x76\\xf8\\x1e\\x87\\x3a\\x6c\\x42\\x0f\\x17\\x07\\xf3\\x84\\x1d\\xb5\\x19\\x6c\\xb5\\x3f\\x50\\x6f\\x00\\x06\\x35\\x2c\\x7c\\x44\\xc0\\x80\\xf3\\x09\\x68\\x01\\xa5\\x7a\\x49\\xcf\\xe8\\x42\\x05\\xbd\\xd7\\xa9\\x80\\x1f\\x84\\x3c\\xf2\\x6b\\x95\\x58\\xa2\\xdb\\x78\\x8e\\xf1\\xb2\\x37\\x91\\x5d\\x58\\x7b\\x9b\\xa9\\x77\\x98\\x90\\xf6\\x1f\\xdc\\x91\\xe0\\x3e\\x4f\\x4c\\xdb\\xef\\xe4\\x17\\xcc\\x22\\xd5\\x22\\xa8\\x6a\\xdd\\xdb\\x53\\xf3\\x74\\x74\\x50\\xab\\x62\\xb5\\x76\\x56\\x5d\\xb3\\x2e\\x0c\\xd4\\x42\\x76\\x54\\x7d\\x9a\\x16\\x65\\x3c\\x27\\x96\\x59\\xdd\\x4d\\x17\\xec\\x04\\x82\\x7c\\x53\\x3e\\x33\\x39\\x0f\\xe9\\x4f\\x79\\x35\\x09\\x25\\x6d\\xb6\\x75\\x31\\x73\\x6a\\xb3\\xfc\\xee\\x2a\\x30\\x1a\\xc3\\xf0\\xa2\\x4d\\x3b\\x10\\x8d\\x7e\\x75\\xc3\\x2a\\x5a\\xba\\x36\\xd6\"},\n{{0x29,0xb2,0x88,0x1b,0x8c,0xaa,0xdb,0x33,0x6e,0x78,0x80,0xc5,0x10,0xb8,0x00,0x85,0xf4,0xb1,0x22,0x18,0x60,0xb3,0x01,0xeb,0x45,0x25,0x65,0x07,0x52,0xa6,0xd2,0x89,},{0x0c,0x5c,0x44,0xed,0x29,0xd2,0x1b,0xca,0xde,0xe2,0x1c,0xbd,0xe6,0x1a,0x9c,0xdb,0x6d,0x59,0x36,0x00,0x9b,0xa2,0xf5,0xb2,0xe7,0x77,0xc9,0x24,0xdd,0xfb,0x67,0x51,},{0x99,0xe9,0x96,0xe8,0x5a,0x49,0x4f,0x19,0x80,0xcb,0x07,0xde,0x9c,0xa6,0x16,0x5e,0x7d,0xe1,0x04,0xd3,0x9f,0xe3,0xc3,0x22,0x67,0x35,0xc5,0xda,0xa5,0x69,0x51,0x6f,0xca,0xf1,0xb6,0xe4,0xdf,0xad,0x0d,0x38,0x9b,0x6d,0xb0,0xec,0x8a,0x8f,0x20,0xdd,0x2c,0x60,0x26,0x56,0xb5,0xe7,0x61,0xc8,0xf3,0xa6,0x55,0x83,0x82,0x15,0x19,0x09,},\"\\x19\\x74\\xa2\\xe2\\xb4\\x79\\x49\\xf4\\x67\\xa9\\x31\\xd1\\xd9\\xdd\\x5c\\xe1\\x16\\xe9\\xf5\\x03\\x0a\\xd0\\x9a\\x8c\\xc7\\x28\\xd1\\xae\\xb1\\x48\\xbb\\xf9\\xac\\xf5\\x98\\x74\\xda\\x80\\xe7\\x08\\xd5\\x3c\\x66\\x8f\\x2f\\x14\\xd7\\x52\\x20\\x71\\xe9\\x09\\x80\\x84\\x27\\xb2\\xab\\x5a\\x05\\xf8\\xb9\\x4f\\x21\\x50\\x5c\\xd2\\x6a\\xbc\\x53\\x45\\x89\\x78\\xc7\\x84\\xd4\\x79\\xea\\x6d\\xab\\x10\\x5c\\x4f\\x79\\x84\\xa0\\xfb\\x97\\x90\\xe5\\x06\\x24\\xf4\\x73\\x4b\\x55\\x19\\x05\\xaa\\x5f\\xfa\\x60\\x18\\x4c\\xd2\\x01\\xcf\\x2b\\x26\\xc9\\x79\\x5d\\xa6\\xe7\\xe0\\x8d\\x6a\\x0b\\xc7\\x72\\x24\\x00\\xfe\\xf9\\x4f\\xc2\\x10\\x38\\xbe\\x89\\xd3\\x4b\\xcd\\x14\\xc4\\x27\\xb8\\x5b\\x68\\x66\\x73\\x71\\x96\\x15\\x2d\\x4e\\xeb\\x66\\xd0\\x5b\\x24\\x5a\\xe8\\x4b\\xdc\\x77\\x87\\xc1\\x4a\\x8b\\xec\\x2e\\xea\\x53\\x60\\xf0\\x42\\x43\\x3d\\x70\\x79\\x44\\x67\\xd4\\x73\\x93\\xb9\\x37\\x57\\xf3\\x31\\xcf\\x2b\\x53\\xc6\\x60\\xd7\\x1c\\x29\\x58\\x2a\\xee\\xa7\\x9b\\x12\\x52\\x7a\\x28\\xb0\\xc5\\xe1\\x10\\xdf\\x6f\\x85\\x4e\\xea\\xd9\\xa2\\xb0\\x0d\\x42\\x54\\x2c\\xa8\\x27\\x6b\\xb8\\xbf\\x98\\x8b\\xaa\\xb8\\x56\\x59\\x96\\xfe\\xe5\\x0c\\xf3\\x1b\\x24\\x59\\xc4\\xc5\\x0a\\xb4\\x75\\x26\\x5e\\x83\\xe2\\x28\\x5d\\x43\\xfe\\x1f\\x75\\x2a\\x55\\xb2\\xdb\\xc4\\x9f\\xca\\x04\\xa8\\x10\\xf0\\x41\\x3b\\xf6\\xbd\\x81\\xb7\\x9a\\xc6\\x4e\\xe1\\xf8\\x9b\\x97\\xbd\\x7d\\x26\\xd6\\x25\\x12\\x27\\x3e\\x24\\xa6\\xba\\xb2\\xd5\\xf7\\xd2\\x22\\x6b\\xaa\\xab\\x7b\\x11\\x12\\x09\\xbb\\x03\\x73\\x3d\\x8a\\x60\\xdf\\xa3\\x1a\\x51\\x6f\\x4a\\x8c\\x76\\x99\\xd8\\x28\\x5c\\x10\\x65\\x15\\x9a\\x6c\\x73\\x31\\xc1\\xde\\xfb\\x47\\xa3\\x0e\\xf5\\x85\\x8c\\x50\\xb7\\xd0\\x45\\x12\\x4a\\x09\\x81\\x3d\\x1c\\xfd\\xa5\\xc9\\xcc\\x3b\\xb5\\xbf\\xae\\x73\\xc9\\x84\\x19\\x7f\\x8f\\x85\\x7f\\x18\\x6c\\x41\\xab\\x87\\xfb\\x79\\x62\\xb6\\x31\\xf4\\xd0\\x07\\xcf\\xbe\\xe2\\x21\\xfc\\x65\\x72\\x78\\x4a\\x55\\x11\\x94\\xc1\\x97\\x77\\xb0\\x8e\\x6b\\x59\\x67\\x57\\xe7\\xcb\\xa7\\xa0\\xe2\\x7f\\xe4\\x53\\xf9\\x0d\\xc5\\x9c\\xc0\\x8c\\x64\\x72\\x43\\x1c\\x02\\x0e\\x8d\\xd0\\x91\\x75\\x90\\xe7\\x9c\\x1f\\x20\\x73\\x83\\xaf\\xb3\\x90\\x76\\xad\\x24\\xda\\x8e\\xe5\\x24\\x86\\x73\\x94\\x53\\xa2\\x59\\x0e\\x51\\xbf\\xc8\\x9b\\x13\\xc2\\x03\\x3c\\xfa\\x5f\\x89\\x03\\xcb\\xe9\\x96\\x1a\\x85\\x98\\xba\\x55\\x62\\x32\\x86\\x9d\\xfa\\xb4\\xd5\\x6e\\xdf\\x4f\\x05\\xe8\\xb7\\x7d\\x05\\x87\\x18\\x95\\xe6\\x3b\\x53\\x51\\xf7\\x6c\\xb2\\xd2\\xc8\\x38\\x5c\\x10\\x9d\\x73\\x06\\x19\\x2a\\x25\\x44\\x6e\\x4d\\x62\\xdc\\x7d\\x62\\x4f\\x0c\\x66\\x73\\x98\\x6b\\xe0\\x62\\x8b\\x2c\\x2d\\x73\\xeb\\x94\\x1d\\x35\\xa3\\x43\\x30\\x90\\xf5\\x9b\\x28\\xa5\\x97\\x9d\\x56\\xdb\\xc9\\xfd\\x69\\x73\\xf6\\x36\\x47\\x64\\x2c\\xd9\\x03\\xb0\\xcf\\x7a\\x6a\\xcd\\x33\\x0d\\x87\\xe2\\x29\\x27\\x10\\xde\\x99\\xe0\\xc1\\x79\\xca\\x78\\x92\\x9c\\xca\\xec\\xfa\\xed\\xbf\\x27\\x42\\x41\\x4f\\x17\\x6b\\x60\\x90\\xc0\\xd5\\x9a\\x9d\\xb7\\x81\\xc9\\x96\\x7e\\x28\\xfa\\x4e\\x77\\xd2\\xa0\\x82\\xe4\\x2f\\x52\\x16\\x91\\x67\\xe9\\x2d\\x4f\\xdd\\x82\\xe2\\xcc\\x05\\xdd\\x91\\x84\\xc7\\xdf\\xee\\x49\\x0a\\x23\\x7f\\xda\\xd4\\xdf\\xeb\\xc0\\x18\\x68\\xe0\\xa4\\x35\\x3a\\x29\\x54\\xd0\\x90\\x92\\x84\\x61\\x82\\x1a\\x7a\\x84\\x8d\\x1b\\x60\\x81\\x7f\\xc3\\xbd\\xef\\xa1\"},\n{{0x42,0xaf,0xe8,0x9d,0xac,0x83,0xe7,0xd3,0x89,0x96,0xc0,0xdb,0xce,0x0c,0x98,0x74,0xc0,0x09,0x27,0xba,0xbd,0x77,0xca,0x8c,0xea,0xc3,0x4e,0x56,0x44,0x74,0x28,0x2b,},{0xa4,0xc5,0xf5,0xe3,0x80,0x3f,0x0a,0x03,0xd5,0xc1,0xc9,0x06,0xca,0xec,0x9c,0xc6,0xd2,0x85,0x14,0x07,0xf1,0xca,0x29,0xf7,0x2a,0x45,0xf2,0x33,0xe6,0x65,0x62,0x44,},{0x4f,0xba,0x2d,0x6c,0xc1,0xb7,0x19,0x3d,0x35,0x62,0xf8,0xc8,0xbf,0xe6,0x90,0x5c,0x82,0x9d,0xb2,0x65,0xa5,0x42,0x7c,0x5c,0x26,0x57,0x14,0x78,0x5b,0x83,0xf6,0x95,0x14,0xc5,0xe3,0x0e,0x28,0xb5,0x66,0x84,0xc8,0x2d,0xae,0x26,0x37,0x58,0x1b,0xf3,0xf4,0xef,0x27,0x14,0x20,0xbc,0x7e,0x60,0x10,0x61,0x3a,0x38,0xfa,0x10,0x1a,0x0d,},\"\\xe7\\x10\\xa1\\x63\\xad\\x28\\x85\\xae\\xb7\\x65\\x8e\\xb3\\x74\\xf1\\x18\\xb7\\x68\\x42\\xec\\x36\\xef\\x3b\\x01\\x0c\\x3c\\x6b\\x95\\x59\\xe8\\xb1\\x60\\xc2\\x62\\x8d\\xed\\x0b\\x85\\x11\\xeb\\x49\\x07\\x18\\x0d\\xa4\\xb6\\x21\\xe9\\xaa\\x4a\\x32\\x22\\x88\\x88\\x8a\\x1c\\x09\\x13\\x0f\\x69\\xf8\\x90\\x59\\x7a\\x92\\x93\\xe7\\x4f\\x92\\x89\\xbd\\xaa\\x5c\\x91\\xb6\\xfd\\x24\\xaa\\x04\\x4a\\xb9\\xfc\\xb3\\x40\\x2f\\x7a\\xbc\\x48\\xd2\\xab\\x7b\\x38\\x80\\xa0\\x48\\xda\\xa4\\x48\\x64\\x5a\\xd2\\xec\\xb5\\x5b\\x3c\\xae\\xe2\\xd6\\x8a\\x8b\\xed\\xb5\\xd1\\x86\\x5d\\x5e\\x21\\x1d\\xe3\\x9b\\x0e\\xaf\\x22\\xe5\\xda\\xf1\\x0f\\x71\\x68\\x20\\x3a\\xa1\\x5b\\x85\\xaa\\x47\\xbb\\xd3\\xcc\\x41\\x69\\xcb\\xc1\\xfe\\x80\\xb4\\x70\\x0b\\x62\\x58\\x71\\xed\\xab\\xcd\\x4f\\xe7\\x4a\\x3e\\x96\\x55\\x69\\xce\\x24\\x5c\\xfc\\xde\\x42\\x09\\xcc\\x8a\\xbc\\xd6\\x79\\x7d\\x44\\x18\\x5b\\x4f\\x96\\xc0\\x18\\x1b\\xbd\\x27\\x00\\x87\\x83\\xe9\\x35\\x8a\\x53\\x94\\xfe\\x3a\\x34\\xa0\\x68\\x71\\xd3\\x79\\xda\\x35\\xb2\\x0b\\xb5\\x7e\\xef\\x9e\\x55\\x24\\xee\\x79\\x12\\xa6\\xf4\\x1b\\x4a\\x1f\\x68\\x4c\\x39\\x19\\xcf\\xcd\\xc0\\x0f\\x45\\x80\\xba\\xf9\\xe0\\x9d\\x31\\x6c\\xef\\xa0\\xf4\\x65\\xdc\\xa5\\xd8\\xee\\xc5\\x14\\xe9\\x5e\\x5a\\x57\\xbb\\xcd\\x27\\xe4\\x1f\\x81\\x19\\xb2\\x64\\xae\\x14\\xa3\\x19\\xd8\\xc3\\x85\\x9b\\xab\\xf1\\xf4\\xa6\\xb6\\xb7\\x7e\\x44\\x2c\\x86\\x1d\\x6e\\xe2\\x8a\\xd1\\x2b\\x82\\x36\\x2e\\x90\\xdb\\x0c\\x36\\x72\\xb0\\xe0\\xd9\\xff\\x58\\x14\\x6f\\xd1\\x59\\xaa\\x8f\\xa9\\x9d\\xc7\\x55\\xfc\\x85\\xb9\\x0c\\xf9\\x41\\x92\\x79\\xc0\\x62\\x4b\\x93\\xe7\\x5e\\xda\\x0e\\xf7\\xc0\\x96\\x95\\xae\\x93\\xbd\\x72\\x82\\x41\\x93\\x77\\xb7\\x6c\\xa8\\xbd\\xc0\\x52\\x1c\\xfe\\xe6\\xf6\\xd7\\x29\\xc3\\xad\\xff\\x89\\x46\\x87\\xb1\\x77\\xef\\x19\\x52\\x9a\\x6b\\xda\\xce\\x70\\xb6\\x85\\xc6\\xd7\\xa5\\xd7\\x4a\\x08\\xe2\\xa9\\xe7\\x24\\x03\\x59\\x75\\xc8\\x0d\\x18\\xcb\\x36\\x94\\x70\\xde\\x72\\x99\\xcb\\xd6\\xb0\\xa2\\x7c\\x92\\x32\\xc7\\xea\\xba\\xc8\\x6d\\x50\\x93\\xa6\\x5f\\xfe\\x0b\\x40\\xd4\\x0b\\xef\\xe8\\x0b\\x68\\xcd\\x9d\\xce\\x1e\\xa1\\xe6\\x57\\xe4\\x5e\\x9c\\x49\\x9d\\x0b\\x69\\x0f\\x74\\x45\\x5f\\xb4\\x70\\x96\\xed\\x8c\\x18\\xd1\\x51\\x7f\\x90\\x44\\x29\\x01\\xa6\\xc4\\x10\\xb7\\xf6\\x41\\x5f\\x20\\xae\\x48\\xc5\\x8a\\xde\\x8d\\x67\\x5b\\x6c\\x05\\x8d\\xf1\\x6a\\xe7\\x69\\x8f\\xce\\xae\\x95\\xaa\\x77\\x1b\\x4c\\xd8\\x8a\\x0b\\x3f\\x22\\xc5\\x1f\\x98\\xc7\\x1c\\x1e\\xb4\\x6b\\x26\\x4b\\xf9\\x7a\\x30\\x0e\\xcb\\x1f\\xd2\\x62\\x26\\xad\\x8e\\x87\\xa0\\x58\\xcf\\x3e\\x70\\x8e\\x26\\x0f\\x56\\x6b\\x68\\x53\\x14\\x04\\x51\\x33\\xf4\\xa5\\xe8\\xfb\\xc3\\x45\\x61\\xb9\\xa0\\xf1\\xff\\x93\\x39\\xf5\\x52\\x31\\x07\\x6b\\x73\\x6b\\x6e\\x11\\x52\\x43\\x19\\xa2\\x72\\xbd\\x44\\x53\\xa0\\xaf\\x14\\x93\\xda\\xa0\\x91\\x67\\xe8\\x46\\x43\\xd2\\x07\\xa0\\x2f\\xee\\x98\\xfb\\x22\\x3b\\x01\\xa9\\x9a\\xa5\\xce\\xf2\\xb7\\x00\\x1e\\x47\\x0f\\x6f\\x94\\xa5\\xdc\\x20\\x8e\\xdf\\xc0\\xcb\\x8c\\xf3\\x11\\x4a\\x91\\x96\\x00\\xf0\\x61\\x17\\x2f\\x0e\\xfe\\x03\\x90\\x36\\xbf\\x4d\\xdd\\xbf\\xd0\\xd4\\x5f\\x91\\x44\\x3b\\xf2\\x6f\\x8e\\x15\\xed\\x7d\\xb8\\xe5\\x5f\\x08\\x6a\\x4a\\x45\\x83\\xf4\\xbd\\xa0\\xf5\\x56\\x28\\x4d\\xcf\\x71\\x29\\x2f\\xe7\\x0f\\xca\\xa8\\x25\\x9b\\x9f\\xaf\\xf3\"},\n{{0x10,0xf0,0x09,0xaa,0x88,0x7d,0x91,0xce,0xd8,0x09,0xaf,0xe1,0x92,0xd7,0x8e,0x47,0x99,0xd9,0x03,0x77,0x62,0xf4,0xa9,0xd3,0xa4,0x29,0xfd,0xe0,0xf3,0x9f,0x7b,0x7a,},{0xcf,0x51,0x16,0xb9,0x21,0x21,0x2e,0x9b,0x78,0x82,0x9a,0x02,0x63,0x46,0x36,0x91,0xc6,0xfb,0xcc,0xdc,0x0c,0x11,0x8b,0xe1,0x41,0xc9,0x6f,0x8c,0x88,0x05,0x3d,0xd3,},{0xc3,0x7b,0xb7,0xb7,0x3b,0x11,0x05,0xbe,0x08,0x6f,0xf3,0x07,0x69,0x72,0x07,0x72,0x62,0xdf,0x4d,0x73,0x32,0xf6,0x08,0xc7,0xb2,0xb9,0xd9,0x78,0xd4,0x74,0xcb,0xbc,0x27,0x10,0x46,0x08,0x00,0x35,0xf3,0x96,0xee,0x36,0x47,0x9b,0x7a,0x67,0x11,0xc6,0x8e,0x25,0x61,0xc7,0x41,0xc0,0xec,0x5f,0xc9,0xec,0xa1,0x73,0x4e,0x81,0x1f,0x04,},\"\\x2e\\xdf\\x14\\xd6\\xcd\\x56\\x89\\x6e\\xea\\xa7\\x70\\x21\\x1c\\x49\\x84\\xbe\\xd8\\x0e\\xca\\x8d\\x65\\x34\\xd5\\xd5\\x10\\x88\\x4f\\x55\\xf1\\x1f\\x99\\xff\\xa9\\xf8\\x9b\\x58\\x6f\\xfe\\x7b\\x1e\\xc7\\xea\\xab\\x6a\\x9d\\xc1\\xa2\\x4a\\x3e\\xe3\\xc7\\xa6\\xab\\x44\\xad\\xe9\\x91\\x78\\x83\\x26\\x4e\\xde\\x2f\\x13\\x61\\xbe\\x7d\\x7a\\x38\\x17\\xf2\\x9d\\xec\\x95\\x81\\xc3\\x19\\xf1\\x8f\\x95\\xd5\\xbe\\x26\\xd9\\x11\\x8b\\xe6\\x78\\x34\\x00\\x37\\xa6\\x8a\\xbf\\xc5\\xef\\xbb\\x9a\\x3f\\x3f\\x38\\x78\\xaa\\xe3\\x72\\x1f\\xfe\\xf5\\xbb\\x6a\\x26\\xc7\\xb1\\xa3\\xa5\\x6d\\x2b\\xda\\x6c\\x6e\\x86\\x0e\\xb4\\x1f\\xd8\\xd8\\x37\\x11\\x74\\xd9\\x1c\\x74\\xc5\\xeb\\x67\\xc3\\x85\\x5c\\x63\\x0d\\x64\\x1d\\x2e\\x57\\x1a\\x9a\\x51\\xc6\\x40\\x2c\\xfe\\x18\\x42\\xce\\xf3\\x89\\x80\\xcb\\x8d\\x0a\\x64\\xbc\\xc8\\x9b\\xe3\\x18\\x9e\\x68\\x11\\xf4\\x7e\\x8f\\x4d\\x00\\x63\\xa5\\xb1\\x60\\x1f\\x44\\xfd\\xa2\\x0c\\x1c\\x4c\\x2f\\xc4\\x9c\\xbe\\x27\\xa4\\x13\\x7d\\xc4\\x63\\x8c\\x2a\\xd2\\xd0\\xa5\\x47\\x47\\x47\\x22\\x9c\\x56\\x8e\\x38\\x05\\x43\\x1f\\xa3\\x6e\\xeb\\xa7\\x85\\xf7\\xb9\\x78\\x44\\xb5\\xe3\\x19\\xfa\\x6a\\x09\\xcc\\x5a\\xe8\\x40\\x34\\x74\\xbb\\x91\\xdd\\x89\\x6c\\x1e\\xc2\\xba\\xc7\\x3d\\x2e\\x50\\x5e\\xfc\\x62\\xbd\\x50\\x2b\\x5c\\xeb\\x08\\xd1\\x6e\\x83\\x2e\\xc5\\xdc\\x4f\\x98\\xb5\\x1b\\x9d\\x07\\x38\\xb9\\xfb\\x28\\xf3\\xab\\xe8\\x96\\x6b\\xf2\\x23\\x75\\xa0\\xb2\\x2c\\x47\\x1a\\x9e\\x58\\xe3\\xfd\\x70\\x0d\\xe1\\x5c\\x52\\x96\\x37\\x3c\\x1b\\xc9\\xd4\\x64\\x0e\\xb7\\x81\\x6e\\x1d\\xc9\\xc8\\xce\\x86\\x19\\xa8\\x11\\x83\\x00\\x9e\\xc9\\x74\\x87\\x1e\\x8f\\x0a\\x97\\x72\\xed\\xe0\\xa6\\x38\\xb3\\x57\\x4b\\xf7\\x5d\\x8f\\x55\\x98\\x7f\\x3c\\xfa\\x6f\\xec\\x68\\x97\\x0b\\xfe\\x00\\xb2\\x3b\\x59\\xfb\\x5b\\xf4\\x99\\x6e\\xa5\\xd7\\x70\\x4f\\xcf\\x2e\\xff\\xcc\\x0f\\xd7\\xf3\\xd8\\xe6\\x05\\x60\\x08\\x09\\x7f\\x26\\xca\\xff\\xd5\\x41\\x5a\\x28\\x2a\\x27\\x6a\\x9b\\x26\\x45\\xe5\\xca\\xb1\\x29\\x68\\x87\\x2e\\xb0\\x52\\xf4\\xd7\\xc1\\x0c\\xc7\\xc2\\x1d\\x51\\x61\\x81\\x8b\\xb4\\x4c\\xc8\\x56\\xb0\\xde\\x76\\x9d\\x55\\x9c\\x55\\xdf\\x64\\xad\\x9a\\xdc\\x16\\xc0\\xac\\x65\\x83\\x8f\\x66\\x0d\\xa8\\x13\\x86\\xb7\\x0b\\x93\\x52\\x5e\\xc2\\xf4\\x0f\\x6f\\x63\\xf8\\xea\\x5d\\x48\\x30\\xb9\\x64\\x6c\\x46\\x18\\x3b\\xb4\\xe6\\xf2\\x70\\x47\\xbd\\xa2\\xa5\\x46\\xbd\\x34\\xbd\\x4d\\xb5\\xfb\\x88\\xfd\\x8a\\xb7\\xc7\\x5f\\x65\\x2e\\x15\\xd5\\xaa\\xa6\\xb4\\x6a\\x8a\\xcf\\x6e\\x44\\x8b\\xf2\\xdd\\x64\\xde\\xe3\\xc1\\x05\\x64\\x7c\\x7f\\x83\\xad\\x20\\x0d\\x80\\x97\\xc4\\x44\\xa1\\x58\\xd8\\x5a\\x54\\xf0\\xe5\\xdb\\xb1\\x2b\\x43\\xde\\x94\\x3a\\xf1\\xa8\\x18\\x56\\xac\\x96\\x9f\\x52\\xa0\\xbd\\x45\\x43\\x81\\xbd\\x26\\x50\\x41\\xa2\\x69\\x1d\\x1a\\x4a\\x0d\\x81\\x9f\\xa7\\x90\\x92\\xc8\\x80\\x35\\x21\\xfa\\x53\\x68\\x9a\\xb8\\x52\\xf1\\xfb\\xab\\xe0\\x0c\\x94\\xb7\\xf6\\x82\\xd1\\x21\\xcf\\xf5\\x43\\x91\\x32\\x25\\x29\\xc8\\xd5\\xad\\x7b\\xbb\\x98\\xea\\xfe\\x30\\x0a\\xb9\\x22\\xf1\\xc8\\x92\\x40\\xa1\\xe6\\x33\\xcf\\x56\\xa7\\xb0\\x2f\\x74\\xa2\\x92\\x14\\xe5\\x69\\xa0\\x57\\xbd\\x58\\x5e\\x40\\x4d\\x7c\\xd5\\x35\\x20\\x41\\x45\\x6e\\x6c\\xf9\\x0c\\x15\\x34\\x2e\\x02\\x56\\x70\\xf4\\xfc\\xcd\\xf9\\x87\\x83\\xb6\\x85\\x32\\x14\\xca\\xc3\\xfa\\x80\\x8a\\x66\\xc2\\x7b\\x65\\x3c\"},\n{{0x45,0x78,0xc6,0x5a,0x7c,0xa4,0x8f,0x27,0x74,0x05,0x0a,0x7b,0x0c,0xe7,0xa4,0xfd,0x5a,0xd4,0xe6,0x96,0xb2,0xb8,0xaf,0x23,0x96,0x16,0x4a,0x1c,0x7e,0x1b,0x7b,0xd7,},{0x15,0xbf,0x9d,0xbd,0x3b,0x81,0x73,0xe6,0xf0,0x3d,0xcf,0xd5,0x75,0xd9,0x09,0x84,0x5f,0x03,0x8e,0xaa,0x09,0xc5,0xd9,0x08,0xfe,0xf9,0x08,0xa9,0x74,0x58,0xb3,0xef,},{0xa1,0xc2,0x42,0xb4,0x5e,0x94,0xfd,0x18,0x0f,0x05,0x4c,0x71,0x01,0xe5,0x5b,0x39,0x65,0x68,0xf4,0x83,0xdb,0x6f,0x0d,0xfc,0x41,0x68,0xb6,0x9b,0x59,0xd3,0x85,0x81,0x4c,0x19,0xeb,0x30,0x75,0x23,0x7d,0x1f,0xbb,0x1f,0xee,0xbb,0xfe,0xa5,0x0c,0x56,0x81,0x3c,0x8c,0x39,0xc2,0x27,0x52,0xe0,0x2d,0xb7,0xe5,0x7f,0x3e,0x3f,0xbf,0x0d,},\"\\x50\\x6f\\x32\\xb9\\x68\\x14\\x24\\x3e\\x4d\\xd8\\x87\\x0a\\x8f\\xd6\\x0d\\xde\\xf0\\x9b\\xb8\\xc5\\x63\\x15\\x10\\x70\\xd9\\xbc\\xb2\\xb1\\x60\\xa3\\xea\\xbd\\x71\\xa0\\x44\\xd7\\x1e\\xc9\\x3f\\xba\\x95\\x28\\x8e\\xd6\\xfe\\x1a\\x7b\\x92\\x16\\x51\\x60\\x43\\x07\\xd6\\x5a\\x45\\xec\\x5d\\x3f\\x26\\x31\\xac\\xe4\\x0e\\x58\\xd5\\x3c\\x72\\xe5\\x26\\x88\\x6e\\x16\\x97\\x2f\\x6e\\x0d\\xb9\\x4d\\x57\\xb5\\x56\\x34\\xfd\\x39\\xd5\\x5e\\x9b\\xb7\\xf2\\x12\\xaf\\xab\\x00\\xf7\\x74\\x64\\x09\\x26\\x7e\\x8d\\x56\\x5f\\xf5\\xc2\\x25\\x73\\x33\\xc3\\xd0\\x41\\x52\\x17\\x4f\\xe1\\x2d\\xe6\\xa5\\x7b\\xea\\x05\\x7d\\xc2\\x19\\xe2\\xfb\\xa5\\xf1\\x91\\xed\\x81\\x41\\xc0\\x18\\x96\\x9d\\xe1\\x94\\x72\\xd6\\xaa\\xf7\\x63\\xf1\\x9e\\xc5\\x54\\x70\\x2b\\xb3\\xdc\\xbe\\x13\\xca\\x9b\\x23\\xb2\\x41\\x8c\\x99\\xe7\\x18\\x38\\xa8\\x8c\\xf4\\x54\\x72\\x8c\\xf9\\x20\\x8a\\x16\\xc8\\x4e\\xa3\\x98\\x29\\xb4\\xba\\x9b\\x4c\\x77\\xe1\\x76\\x11\\x2b\\xfe\\x1b\\xf3\\x5f\\x95\\xc4\\x02\\x8c\\x7d\\xb8\\x0b\\x36\\xfa\\xa2\\x9d\\x2b\\x89\\xe9\\xe8\\x62\\xf3\\x10\\x00\\x06\\x5f\\x13\\x9b\\x3d\\xa7\\x7d\\x9d\\x86\\x85\\x30\\x57\\x4b\\x7e\\x39\\x1e\\xd9\\x7b\\x34\\xf8\\x78\\x16\\x4f\\x6b\\x8d\\x87\\xb4\\x06\\xc7\\xdc\\x78\\x60\\xa5\\x17\\x5f\\x92\\x0e\\x5a\\x62\\xdc\\x1f\\xc8\\x2e\\xd8\\x45\\x25\\x43\\xb1\\x07\\x36\\x0d\\x35\\xd2\\xb4\\xc4\\x23\\x9e\\xab\\x46\\x6d\\x32\\xbf\\xda\\x34\\xf5\\x10\\x37\\xa6\\xfa\\xe7\\x6f\\x6d\\x8b\\x83\\xe8\\xf7\\xf4\\x89\\xdd\\x4c\\x1b\\x49\\xc3\\x8f\\x53\\x57\\x6e\\x62\\x17\\x2c\\x17\\xde\\xe3\\x66\\x5f\\xde\\x8c\\xbf\\x01\\x5a\\xf9\\x66\\x5b\\x0f\\x1d\\xa2\\xfb\\x77\\xb1\\x34\\xf0\\x4b\\xe2\\x71\\xe4\\x02\\xf3\\x15\\x37\\xc2\\xfc\\x05\\xc2\\xf9\\xb6\\xfc\\x3f\\xfe\\x47\\xde\\x33\\x69\\x13\\x38\\x67\\xc6\\x9d\\x10\\xe7\\xf5\\x37\\xba\\xe4\\x56\\x7d\\x46\\x8e\\x0f\\x2e\\xd8\\x06\\xfe\\x33\\x5f\\x93\\x9c\\x75\\x99\\x4f\\x36\\x3c\\xe3\\xb7\\x0d\\xaa\\x7d\\x5b\\xd2\\x31\\x7c\\x83\\x38\\x51\\xfd\\x8c\\xc9\\x72\\x51\\xec\\x41\\x90\\x23\\xd9\\xd0\\x17\\x4d\\x84\\xd5\\x60\\x9a\\x69\\x18\\xa1\\x74\\x0e\\xb1\\xe3\\x09\\xbd\\x12\\x73\\x66\\xde\\xb9\\xc5\\xab\\x12\\x99\\x2e\\x99\\x02\\xe0\\x15\\xfe\\x58\\xd6\\xad\\xbf\\x52\\xd2\\x2a\\x76\\x0a\\xcd\\x63\\xe1\\xed\\xd8\\xf1\\x38\\xe9\\xfb\\x01\\x37\\x18\\x86\\x01\\xe1\\x97\\x8e\\x7d\\x04\\xfb\\x2a\\xda\\x2b\\x2a\\xee\\x12\\xf4\\x9f\\x28\\x36\\xc6\\x84\\x2d\\x88\\xcf\\x48\\xc8\\x66\\xe3\\xd3\\x3f\\xcd\\x26\\x9c\\x27\\x5c\\x89\\xc2\\x5e\\x36\\x69\\xca\\x90\\xde\\x7b\\x67\\xa7\\xe7\\xa3\\x82\\xcb\\x7e\\xfa\\x47\\xe9\\xc2\\xbf\\x76\\x57\\x1c\\x79\\xa2\\x50\\x85\\xef\\x02\\x04\\x87\\x15\\x2f\\x06\\xbf\\xa1\\x33\\x01\\x5a\\x1b\\x8f\\x1c\\x0f\\x6a\\x9f\\x0e\\xae\\x1b\\xa6\\x2b\\xf1\\x04\\xf1\\xc1\\x6a\\xc1\\x4e\\x1e\\x96\\xc4\\xeb\\xdf\\x06\\x1e\\x0c\\xc7\\x10\\x1d\\x38\\xda\\x7e\\x9e\\x09\\x94\\xda\\xf0\\xf3\\x22\\xaa\\x3c\\xfe\\xf9\\x1b\\x61\\x6c\\x2d\\x00\\x06\\x89\\xab\\x18\\xed\\x45\\x26\\x8d\\xcd\\x27\\x50\\x94\\xf6\\x56\\xba\\x3c\\xf5\\x15\\x26\\x10\\x24\\x74\\x1f\\x74\\x44\\xab\\x7f\\xc4\\xde\\xcc\\xe1\\x67\\x56\\x03\\x2a\\x1b\\xe2\\x70\\xff\\x0b\\x03\\x17\\x54\\x2b\\xa0\\x26\\x62\\x26\\x0a\\x37\\x6f\\xc9\\x12\\xcb\\xb0\\x29\\xca\\xc5\\x45\\x15\\xf5\\xa5\\x51\\x36\\x4f\\x6a\\x99\\xff\\xad\\x0b\\x9c\\xbc\\xd0\\xe6\\x93\\xb7\\xa5\\x21\\xcb\"},\n{{0xc2,0x1e,0x70,0xc4,0x6e,0xde,0x66,0xe6,0x8a,0x88,0x73,0xbb,0xc6,0x4b,0xa5,0x12,0x09,0x30,0x3a,0x0a,0xc4,0xfc,0x49,0xb1,0xd8,0x3e,0x81,0x93,0xad,0x46,0xc0,0x37,},{0x9f,0xbf,0x80,0xa4,0x25,0x05,0xd2,0xc9,0x52,0xf8,0x9f,0x45,0x58,0xc3,0xe6,0xd1,0x87,0xa7,0xbc,0x1e,0xf4,0x46,0xb2,0xe3,0x73,0x23,0x43,0xc1,0x3b,0x33,0xd2,0x00,},{0x0a,0xe3,0x43,0xbb,0x84,0xe3,0xa2,0x99,0x07,0x8e,0x24,0x34,0xba,0x22,0x00,0x22,0xf3,0x16,0x0f,0x96,0x8a,0xc0,0x44,0x82,0xbf,0x8c,0xad,0x13,0xb4,0x23,0xf2,0x67,0x0f,0x01,0xfb,0x5f,0x7b,0x32,0xc5,0x97,0x52,0x0f,0x84,0x60,0x7e,0x0f,0x79,0xc0,0x75,0xfa,0x70,0x78,0xe6,0xe6,0x9d,0x3c,0xec,0x31,0x92,0x65,0xd4,0x66,0x08,0x0b,},\"\\xf5\\x5a\\xa5\\x70\\xce\\x4f\\xc9\\x5f\\x73\\xf5\\x17\\x20\\xd2\\x54\\xe4\\x69\\x5f\\xcd\\xc8\\x1a\\xaa\\x04\\x01\\x30\\xc7\\x68\\x7f\\x03\\x9b\\x8b\\xa5\\x9e\\xd8\\x57\\xce\\xb2\\x9c\\x12\\x10\\x25\\xa8\\x57\\xfe\\xac\\xb4\\xa0\\x1f\\x38\\xe0\\x11\\x78\\x31\\x0a\\xe6\\xe3\\x5c\\x99\\x8e\\xbf\\x89\\xdd\\x79\\x05\\x7b\\x4a\\xfc\\x6d\\xb3\\x40\\x60\\x1c\\x81\\x70\\x3c\\x87\\xa8\\xc4\\x0e\\x5c\\xeb\\xb0\\x44\\x1d\\xf7\\x8a\\x6d\\xe1\\x3a\\x44\\x7c\\xb0\\x16\\xc6\\x5e\\x74\\x1b\\xb7\\xdf\\x30\\x4d\\x83\\x05\\x6b\\x72\\xc6\\x82\\xc7\\x31\\xfa\\xc0\\xa0\\xc7\\x0b\\x78\\x11\\xca\\x14\\xa5\\x01\\x54\\x61\\x30\\x99\\xc2\\xc4\\x37\\x52\\x1c\\x40\\x4b\\x63\\x61\\xde\\x36\\x21\\xf8\\xea\\x56\\xb0\\x8e\\xbf\\xdb\\x07\\xb4\\xf2\\xbb\\x8b\\xa2\\xec\\xc1\\x64\\x33\\x6d\\xa8\\xef\\xc9\\x42\\x76\\x6e\\xf0\\xc7\\x4d\\xfd\\x3b\\x49\\xe0\\x87\\xe9\\xa2\\x7a\\xe5\\x4a\\x7a\\x2b\\x98\\x28\\x1b\\x9a\\xf9\\x3d\\xc1\\x1a\\xa2\\xf0\\x92\\x24\\xab\\x5a\\x73\\x0f\\x02\\x18\\xf4\\xa6\\xe1\\xea\\x48\\x85\\xa7\\x7f\\xbd\\x93\\xa1\\xc5\\x82\\x77\\xd9\\xe0\\x1b\\xe7\\x3a\\x25\\xcd\\xa9\\x18\\xfc\\x27\\xdd\\xdb\\x45\\x3a\\x5d\\xa6\\x90\\x2a\\xd0\\x2b\\xa0\\x57\\x75\\xc6\\x7e\\x07\\xbe\\xa4\\xdf\\x86\\x91\\x34\\x66\\x74\\x43\\x65\\xc1\\x32\\x6e\\x0a\\xb5\\xe1\\x25\\x4c\\x17\\x96\\x74\\x47\\xd5\\x91\\xba\\x5e\\xd1\\xb6\\x3a\\x42\\x54\\x3b\\x87\\xfe\\xd4\\x14\\x59\\xa0\\x89\\xbc\\xea\\xff\\x21\\x98\\x02\\xa8\\x7a\\x87\\x2a\\x76\\x3e\\x69\\x23\\x33\\xce\\x1c\\xc7\\x39\\x78\\x25\\x08\\x4b\\x2b\\x83\\x1e\\x93\\xd8\\x0d\\x67\\x37\\xf3\\x29\\x80\\xf2\\xf3\\xae\\x82\\xc6\\x21\\x90\\xfe\\x3f\\xa7\\x00\\xc5\\xb7\\x32\\x9d\\x6d\\x50\\x04\\x2b\\xdf\\x83\\x1f\\x37\\x54\\x8f\\xcc\\x80\\xb1\\x1f\\x57\\xcf\\x20\\xf6\\x7a\\x3b\\xb6\\x51\\xa7\\xbe\\xff\\xcc\\x48\\xb7\\x0d\\x17\\xeb\\x60\\xf7\\x25\\x9c\\xc5\\x3b\\xf7\\xff\\x60\\x80\\xeb\\x2b\\xd0\\x92\\x3b\\x04\\x83\\xaa\\x30\\x65\\xa8\\x95\\x5f\\x01\\xd2\\x3b\\xa8\\x09\\x51\\xe0\\xae\\xfd\\x2a\\x93\\x72\\x19\\x15\\x72\\xbc\\x52\\x91\\x6a\\xa2\\x2a\\x2a\\xec\\x39\\x37\\x67\\xfa\\xfd\\x08\\x68\\x39\\xe2\\x36\\xfe\\x04\\x60\\xce\\x6d\\x63\\x9c\\x7c\\xe6\\x9f\\xe7\\xf9\\xd3\\xaa\\xd2\\x13\\x05\\x73\\x44\\x35\\x70\\x44\\x3b\\xe6\\xba\\xb9\\x3a\\x06\\xa5\\x4b\\x8a\\xc2\\x9b\\xf3\\x3f\\xf9\\x94\\x9b\\xc9\\x21\\x58\\xe6\\x92\\x4b\\x6b\\x68\\xec\\xda\\x5f\\x6f\\x3a\\xaf\\x42\\xb3\\xd2\\x2d\\xf6\\xd5\\xe6\\x7d\\x5c\\xb3\\xab\\x71\\xeb\\x8e\\xe0\\xb0\\xe6\\x67\\x32\\xe1\\xda\\xca\\x6c\\xd6\\x0d\\x9a\\xa7\\x43\\x05\\xfc\\xd5\\x70\\x07\\x6d\\x22\\x8d\\x44\\x6d\\x5e\\xe5\\x42\\xb1\\x04\\x88\\xbf\\x8a\\xa9\\x88\\xf4\\x51\\xfa\\xeb\\xe7\\x4a\\xb6\\x69\\xd6\\x04\\xd9\\xdd\\xb1\\x51\\x06\\x62\\x0e\\xa0\\x2e\\x8d\\xb3\\x8c\\xe6\\x39\\xb5\\x74\\x78\\x12\\xbb\\x90\\x48\\xee\\x8b\\xf7\\x2b\\x1a\\x95\\x1a\\x05\\xdf\\xfa\\xc9\\x54\\x17\\xcb\\x43\\xb0\\x6d\\xce\\x61\\xee\\x3d\\xa6\\xf2\\x83\\x2e\\xe8\\x3b\\x2e\\x72\\x88\\xdd\\xd6\\x2e\\xeb\\x58\\x93\\xf7\\xf2\\xf6\\xc8\\x09\\x0d\\x99\\xe3\\x36\\xc9\\xf9\\x06\\x9e\\x18\\x15\\x98\\x58\\x41\\xbd\\xd5\\x05\\xb5\\xf8\\x3d\\x89\\x5e\\x87\\x95\\x93\\xda\\xde\\xe7\\x2c\\xeb\\x97\\x65\\x69\\x9b\\xf8\\x0b\\xd0\\x6a\\x5c\\x55\\x33\\x1b\\x25\\x45\\x52\\x7d\\x0c\\x7c\\xae\\xce\\x96\\x58\\x4c\\xe3\\xec\\x7f\\xe0\\x22\\x60\\xf2\\x0b\\x8a\\x1c\\x06\\x35\\x76\\x3f\\xf4\"},\n{{0xf2,0xc1,0x05,0x77,0xf7,0xdf,0x77,0xf0,0xc1,0x15,0x7a,0x8c,0x33,0x1a,0x7b,0xd2,0xae,0x63,0x86,0x67,0x0e,0xb6,0x5f,0x0f,0xae,0x12,0x23,0x31,0x69,0x0f,0x82,0x8a,},{0x0d,0x4c,0x34,0x0f,0xc2,0x31,0xaa,0xfb,0x3b,0x6f,0x74,0xb8,0x9b,0xce,0xf7,0xee,0xaa,0x0b,0x04,0xf2,0x93,0xec,0x85,0x44,0x24,0x7b,0xfc,0x3f,0x2d,0x57,0xc1,0xe0,},{0x60,0xb7,0x03,0x11,0x5a,0x32,0x2a,0xb8,0x92,0xc2,0x76,0xbf,0xd1,0x8f,0x70,0xa9,0xeb,0x0c,0x73,0x23,0xe2,0xc0,0xa6,0xeb,0x5f,0xc7,0xe3,0x30,0xb0,0xbc,0x3b,0x07,0xa5,0x78,0xa0,0x82,0x84,0x62,0x64,0xf0,0x32,0xc6,0x19,0x1d,0x04,0x0b,0xd9,0x8e,0x5d,0x5a,0x4d,0x4f,0x07,0x6f,0xb9,0x06,0x2a,0xcd,0x36,0xbe,0xa4,0x0c,0x91,0x02,},\"\\x38\\xea\\x1e\\x02\\x8a\\x49\\x3d\\x1c\\x60\\xec\\x70\\x74\\x9f\\x14\\xd4\\x36\\xeb\\x3a\\x2b\\x2d\\xe5\\x4f\\x21\\x3d\\x01\\xa6\\x45\\xb5\\x80\\x43\\x0e\\xcd\\x8e\\xce\\x6b\\x55\\x69\\xcc\\x01\\x7a\\x49\\x43\\xe5\\x59\\x5c\\x5e\\xd6\\xe4\\x8c\\x94\\x43\\xf2\\xfa\\x5e\\xb2\\x22\\x7f\\xfe\\x56\\xd2\\x11\\xf2\\x69\\xbc\\x8f\\x6f\\xa9\\xee\\x8c\\xd5\\x6f\\x6b\\x84\\x70\\x53\\x92\\x08\\xaf\\xe2\\x9a\\xb0\\xa1\\x95\\x04\\x4d\\x95\\x7b\\x31\\xf9\\x3e\\x18\\x4a\\x9c\\xbe\\xf1\\xa1\\x4e\\x14\\xf8\\x08\\xbb\\xf5\\x89\\xac\\x77\\x70\\x08\\x4f\\x99\\x8e\\x1b\\x25\\x4d\\xa5\\x9c\\xa6\\xd3\\xe6\\x2e\\x7b\\xe1\\x79\\x07\\x16\\xd2\\x56\\x0f\\x01\\x5f\\x39\\x9c\\xbb\\xce\\x48\\xcf\\xd0\\x39\\x1e\\xad\\x19\\x93\\x44\\x6f\\x6b\\x24\\x93\\x97\\x7d\\x93\\xd7\\xb0\\x9a\\x07\\xa7\\x9a\\x59\\xce\\x15\\xdc\\xe7\\xa1\\xda\\x9c\\x64\\x6f\\x45\\xaf\\x2c\\xca\\xd5\\x5b\\xa1\\x58\\xe6\\x38\\xc4\\xa3\\x0c\\x5d\\x30\\xe9\\xac\\x6e\\x3a\\x33\\x39\\xc2\\x43\\x42\\x6d\\x86\\x49\\x1b\\x2d\\x92\\xda\\xc1\\x47\\x8e\\x8d\\x74\\xff\\x0b\\xf1\\x49\\xbd\\xb5\\xe0\\x9e\\x3f\\xb6\\xb8\\x26\\x2e\\xb0\\x68\\x79\\x81\\x55\\x4a\\xe2\\xcb\\x47\\x19\\x63\\x39\\x07\\x9d\\xa0\\xa1\\xa5\\x72\\x39\\xc1\\x9b\\xf7\\x81\\xf6\\x2f\\xda\\xf4\\xe3\\x15\\x60\\xa8\\x43\\x17\\xef\\x03\\x04\\x92\\xcf\\x1b\\xb1\\x30\\x5b\\xa8\\x51\\x8e\\xba\\xf2\\xb4\\x34\\xd3\\x64\\x16\\x72\\xc8\\xf6\\xea\\x2d\\xef\\xa6\\x96\\xdc\\x7e\\x4f\\x39\\xef\\xc0\\x8d\\x28\\x8d\\x1c\\x96\\x6a\\x6c\\x71\\x48\\xc0\\x12\\xee\\xc4\\x39\\xf7\\xe1\\x2d\\xba\\xb5\\xb8\\x7c\\xfa\\x44\\xc9\\xae\\x19\\x00\\xf8\\x38\\x6f\\x24\\x44\\x4e\\x10\\x92\\xb2\\x3a\\x27\\x4c\\x13\\x8e\\x95\\xc6\\x61\\xe9\\x37\\x7e\\x8a\\xd2\\xd1\\xfc\\xaf\\x19\\x39\\xec\\x9a\\x63\\x2a\\x87\\x3f\\x7e\\xad\\xbe\\x68\\x7b\\x4a\\x03\\x3b\\x92\\xa4\\x77\\xf2\\xe0\\x2e\\x9e\\xd9\\x2c\\xe4\\xf9\\x5c\\xf1\\x70\\xb3\\x90\\x15\\x18\\xa0\\x62\\x14\\x3e\\x56\\xdb\\x05\\x4d\\xf4\\xe4\\x43\\x15\\x44\\x78\\x5a\\x6d\\xfa\\x24\\xee\\xc0\\xf0\\xde\\x7a\\x69\\x9c\\xcf\\x28\\x6d\\xad\\xfa\\xd8\\x59\\x03\\x61\\x22\\x50\\x76\\x4f\\x25\\xcd\\xea\\x81\\x27\\xd0\\x07\\x8d\\x55\\x48\\x25\\xea\\x6e\\x73\\x71\\xc4\\x38\\xbc\\x46\\xf2\\x9f\\xb8\\x93\\x7f\\x8d\\x9a\\x39\\xcf\\x88\\x49\\x05\\x2d\\x43\\xec\\xbf\\xf6\\xc4\\xa3\\x76\\x2a\\x5f\\x40\\x0c\\x15\\x14\\xe8\\x5e\\x91\\x38\\x4f\\xef\\x9b\\x40\\xf4\\x31\\x4e\\x22\\x3a\\x9d\\x68\\xc5\\x26\\xac\\xc7\\x02\\x27\\xd6\\x2b\\x8b\\x63\\x7a\\x34\\x2d\\xf1\\x13\\xd3\\x18\\x20\\x2c\\x51\\xed\\xd3\\xc1\\xef\\xd1\\xff\\x20\\xb1\\xff\\x07\\x8b\\x32\\x06\\x8e\\x79\\x4d\\x92\\x81\\x33\\x03\\x7f\\x1e\\x3a\\x34\\x68\\x9e\\x62\\x9e\\x43\\xfd\\x2b\\x8e\\x88\\xea\\xb5\\x0d\\x7e\\x7a\\xb0\\x64\\x70\\x14\\xab\\x5e\\x4a\\xd5\\x82\\x00\\x65\\x67\\xef\\xf7\\x2b\\x5a\\xf2\\xda\\xc5\\x36\\x89\\x2c\\xcc\\x87\\x1f\\x8a\\x80\\xb5\\xcb\\x79\\xd9\\x0b\\xcc\\x6b\\x77\\xd4\\xcd\\x08\\xf8\\x76\\x18\\x4e\\xf5\\x8c\\x06\\x4a\\xe4\\x30\\xbb\\x79\\xa6\\xb9\\xe9\\x6b\\x0a\\xd8\\x73\\x68\\xaa\\x83\\x8a\\x8d\\xcc\\xff\\xac\\x0c\\xd8\\xce\\x9e\\xa0\\xd0\\xec\\x4c\\x4b\\x0f\\x42\\x67\\x34\\x16\\x65\\x9c\\x98\\x49\\x92\\xcf\\x53\\xb1\\xe4\\x45\\x43\\x10\\x07\\x64\\x0d\\x47\\xec\\xe2\\x6d\\xee\\x4a\\x29\\x43\\xaa\\x70\\x97\\xdd\\x35\\x6c\\xff\\x47\\x54\\xf2\\x1a\\xc0\\x7f\\x6b\\x3f\\x73\\xc4\\x69\\x05\\x55\\x12\\xf3\\x7a\\xba\"},\n{{0x04,0x1a,0x97,0x90,0x6b,0x59,0x56,0xb9,0xd3,0x40,0xf2,0xe0,0xd7,0xa1,0xdc,0xbf,0xef,0xe6,0x63,0xe9,0xbb,0x40,0x26,0xf8,0xcc,0x1a,0xe7,0xe2,0xa1,0x4d,0xe2,0x7e,},{0xf3,0x82,0xd3,0x2e,0x88,0xc3,0xa7,0x2c,0x7c,0xad,0xda,0xfc,0xf8,0xaa,0x69,0x9e,0x21,0xdb,0x7a,0x6b,0xf4,0xed,0xd6,0xe4,0x9a,0x00,0x5a,0xad,0x70,0x2e,0x6a,0x79,},{0xa2,0x3f,0x03,0x2e,0x66,0x92,0xa0,0xe8,0xbf,0xee,0x5b,0x2d,0x30,0xb4,0x14,0xcb,0x16,0xc3,0x5a,0xd0,0x8d,0xa3,0x1f,0x69,0x6d,0x46,0x1a,0x02,0x85,0x78,0x22,0xc4,0xef,0x35,0x7f,0x0c,0xcf,0x31,0x02,0x5a,0x4d,0xc9,0x5c,0xed,0x30,0xa9,0x94,0xf4,0x1e,0xdd,0x1d,0x08,0x7a,0xfc,0xaa,0xf3,0xe8,0xe8,0x75,0x70,0x83,0x20,0xf8,0x0c,},\"\\x71\\xa7\\x59\\x57\\x41\\x15\\x44\\x97\\x5a\\x48\\xcf\\x10\\x3a\\xa1\\xf8\\xe2\\xad\\x15\\x24\\x44\\x59\\xcd\\xc0\\xe3\\x36\\x96\\x6e\\xb8\\xb2\\x6c\\x97\\xf2\\x16\\x9e\\x5d\\x78\\x53\\x70\\x37\\xef\\xc0\\x77\\xe8\\x6f\\x06\\xe0\\x5e\\x9c\\x1d\\xc3\\x41\\x82\\x88\\xc0\\xa2\\xbe\\x6b\\xa3\\x4b\\x3a\\x04\\xab\\x20\\xba\\xe7\\xf3\\x62\\x10\\x94\\xb8\\x7d\\x78\\xa7\\xea\\xcb\\x86\\x4d\\x40\\x78\\xcb\\x4e\\xfc\\xba\\xc5\\xad\\xd9\\x37\\xa2\\xc6\\x01\\x2e\\xe1\\xa8\\xb2\\x56\\xcc\\x27\\x6b\\x65\\xd5\\xe9\\x2b\\x4d\\x00\\xb9\\xb1\\x1f\\xad\\x88\\x49\\x91\\xde\\xc4\\xc1\\xcb\\x9d\\xce\\x18\\x63\\xc8\\xb0\\xa2\\x10\\x16\\x1a\\xe6\\xb3\\xf8\\xbf\\x9c\\xc4\\xdc\\xe4\\xad\\xfd\\xc8\\xed\\x57\\xd8\\x3e\\x95\\xab\\x9d\\xd2\\xd9\\x26\\x58\\xdf\\xbd\\x3a\\xfa\\x99\\xe3\\xf8\\x95\\x1e\\x2a\\xd7\\x4a\\x14\\x8f\\x6f\\x59\\x7e\\xb2\\xc9\\x45\\xc1\\xf1\\xb9\\x44\\x61\\xae\\x07\\x45\\x48\\x1f\\xd0\\xed\\xf8\\x38\\xc6\\x28\\x60\\x35\\xe3\\x6f\\x01\\x12\\x38\\x87\\x5d\\xbb\\xa2\\x28\\x9d\\x3d\\x6a\\x39\\x42\\xa7\\xf9\\x55\\x4c\\x64\\x43\\x05\\x24\\x4d\\xdb\\x77\\xc1\\x17\\xcb\\x4b\\x56\\x23\\x77\\x29\\xdd\\xe4\\x28\\xb8\\xbb\\x42\\xdf\\x9c\\xe2\\x9e\\x14\\x4d\\xfc\\x96\\xcf\\x6c\\x67\\x67\\xb1\\xee\\x6d\\x05\\x3c\\xe4\\xf8\\xbb\\x20\\x56\\xab\\x78\\x10\\xaa\\x13\\x68\\xa8\\x91\\x0f\\x2f\\x69\\xe0\\x61\\xc1\\x9d\\x88\\x47\\x18\\x4f\\xed\\x53\\x4f\\x98\\x75\\x8d\\x70\\x3a\\x76\\x88\\x5f\\x91\\xeb\\x75\\x2a\\x21\\x95\\x4a\\x10\\xc6\\xf6\\xb4\\xda\\x10\\x46\\x4d\\xed\\x36\\xb0\\x00\\x89\\xf6\\x62\\x91\\x54\\x21\\xbf\\xda\\xd4\\x96\\x75\\x36\\x89\\xcc\\xd0\\x3b\\x62\\x40\\x21\\x08\\x07\\x61\\xe6\\x81\\x76\\xb1\\x06\\x97\\xda\\xc8\\x78\\xe4\\xc3\\xdb\\x2f\\xd0\\xb2\\x8c\\x65\\x53\\x35\\xd9\\x80\\x16\\xf1\\x9f\\x26\\x5b\\xb0\\xb2\\x43\\x4c\\xb4\\x63\\x78\\x44\\xd9\\x1e\\xd0\\xce\\x05\\xed\\x25\\x91\\xfd\\x99\\x89\\x65\\xf8\\x3f\\x31\\x97\\xd1\\x0e\\xef\\x44\\x88\\x50\\xe7\\x92\\x03\\x27\\x24\\x70\\x1d\\xa3\\x05\\xcb\\x6d\\x79\\x46\\x69\\x48\\x3f\\xc3\\xdc\\x6f\\x68\\x6b\\x18\\x3e\\x29\\x99\\x13\\x0c\\x8f\\xc0\\x05\\x8d\\xca\\xbb\\xc9\\x18\\x8f\\x26\\xb2\\xd6\\x3e\\xbd\\x6c\\xb1\\xe1\\x8a\\x09\\x7c\\x77\\x04\\xa5\\x9b\\x5e\\x18\\x7e\\x01\\x42\\x59\\x3b\\x70\\x83\\xf7\\x40\\x0a\\xfa\\x9b\\x1b\\xf0\\xc1\\xcc\\x6c\\x35\\x6b\\xc4\\x33\\x4a\\xf7\\x72\\xe6\\x71\\x53\\xb4\\x5b\\x33\\x1b\\x99\\x09\\x20\\xc2\\x4e\\xed\\xe2\\xc6\\xe3\\x23\\x70\\x3f\\x52\\xec\\xd6\\x07\\x35\\xb2\\x3b\\xf2\\x2b\\x81\\xee\\x77\\x59\\x27\\xc3\\x7e\\x53\\xda\\xd7\\x59\\x6e\\xa6\\x5a\\x73\\xbb\\x96\\x77\\x5f\\x3b\\x87\\xc8\\xb3\\xc0\\x88\\xec\\x69\\x5b\\xc3\\xa7\\x50\\x2c\\x0c\\x51\\x0f\\x02\\x0b\\xf9\\xac\\xa3\\xcb\\xb7\\xa2\\xc0\\x11\\xc6\\x7f\\xf2\\x7d\\x63\\x4c\\xaf\\x1d\\xcf\\xc5\\x8e\\x5e\\x39\\x7e\\x66\\x58\\x25\\x22\\x72\\x01\\x1c\\x8f\\xfd\\xd6\\x42\\x30\\xa9\\x32\\x41\\xff\\xf6\\x83\\x72\\xc4\\xba\\x85\\x38\\x2b\\xbb\\x22\\x93\\x09\\x65\\x29\\x22\\xdb\\x68\\x83\\x66\\x31\\xe5\\x5b\\xe6\\x9a\\xb6\\xad\\xb8\\xe4\\x33\\x53\\x57\\xfc\\x92\\x3e\\xfe\\x15\\x4a\\xfc\\xc2\\x22\\xd6\\x0d\\x07\\xf5\\x69\\x90\\xa3\\xe5\\xa2\\x14\\xb2\\x27\\xae\\xcf\\xf2\\xcd\\x1b\\xb6\\xf0\\xc7\\x9f\\xf5\\x45\\xf7\\x0a\\x61\\x61\\x41\\xa9\\xd5\\x3f\\x92\\x2a\\x02\\x44\\x3f\\x7d\\x2a\\x46\\x89\\xc3\\x5b\\x09\\x5d\\xd3\\x94\\xd5\\x0b\\xf4\\x9f\\x96\\x80\\xa5\\xf7\\xd9\"},\n{{0x4b,0xc5,0xe0,0x5a,0xa0,0x03,0xa4,0x49,0x2f,0x4b,0xad,0x10,0x2a,0x53,0x90,0xf7,0xce,0xba,0xb3,0xd3,0xec,0xa9,0x15,0x21,0x42,0xad,0x5e,0xf7,0xd8,0x40,0x30,0xae,},{0x67,0x51,0xd3,0xad,0x8b,0xb6,0xc6,0x4d,0x6a,0x17,0xd7,0xe4,0x47,0xa2,0x7d,0xa2,0x2f,0x5f,0x04,0x03,0xf4,0x37,0xba,0xc9,0x44,0x9f,0x13,0xcc,0x85,0x3d,0xd8,0x40,},{0xa2,0x4f,0xee,0x11,0xf7,0xec,0x6d,0xa3,0xe9,0xdf,0xaf,0x6c,0x85,0x8a,0xc0,0x04,0xb4,0x53,0x1a,0xbd,0x1c,0x9d,0x3b,0xb6,0x4f,0x40,0xdd,0x24,0x7f,0x00,0x35,0x93,0x50,0xe4,0x3b,0x2d,0x4b,0x8f,0xbe,0xc5,0xf6,0xb2,0x41,0xec,0xf9,0xf1,0x10,0x14,0x85,0xcf,0x41,0x87,0x35,0xb0,0x5f,0x71,0x20,0x18,0x33,0x5b,0x20,0x06,0x83,0x08,},\"\\xa8\\xf7\\x94\\xdb\\x17\\x95\\x66\\x7d\\x28\\xd2\\x4b\\x70\\xac\\x22\\x00\\xa6\\x23\\x9a\\x34\\xe2\\x43\\x8c\\xed\\x1d\\x03\\xf9\\x7e\\xd4\\x8b\\xeb\\x4d\\x6b\\xea\\x67\\xc1\\x43\\x38\\xf7\\x73\\x64\\x19\\xdc\\xd2\\xa2\\xa7\\x97\\x37\\x26\\x57\\x2e\\x6a\\xfe\\x7e\\xdf\\xef\\x22\\xc9\\x9b\\xe8\\xb0\\x69\\xf0\\x4f\\x6d\\xc6\\x1a\\x13\\xb3\\x43\\xc6\\xe5\\x85\\xab\\xad\\x22\\x14\\xd8\\x5c\\x36\\xf0\\x29\\x96\\xfa\\xbb\\x46\\xbb\\x91\\xb5\\x17\\x6a\\xc7\\x08\\xe4\\x9a\\x0b\\x05\\x30\\x17\\x04\\x8f\\xbb\\x55\\x45\\x3f\\x2b\\x82\\x08\\xd6\\x67\\x8d\\x1a\\x8c\\xf6\\xa1\\xee\\x9a\\xd7\\xa9\\x1e\\x38\\x03\\x25\\x63\\x5d\\x1e\\x23\\x6a\\x6c\\xa1\\xd6\\xcc\\x7f\\x6b\\x59\\xf2\\xa2\\xbf\\x18\\x4f\\x5e\\xe4\\x51\\xd6\\x79\\x9f\\x69\\xba\\x11\\xa0\\xcd\\x6b\\xc0\\x4b\\xe8\\xa3\\x51\\xa8\\x0e\\x72\\x5b\\x5f\\xc4\\x56\\x3e\\x45\\xbd\\x47\\x49\\xec\\xbc\\x45\\x20\\x52\\x29\\x10\\x5b\\x9d\\xe7\\x32\\x61\\x49\\x85\\x27\\xf3\\xd4\\xec\\xfb\\xb5\\x83\\xff\\x53\\x27\\x53\\xd0\\x7c\\x38\\x52\\x6b\\xb4\\x82\\xd1\\x71\\xa2\\x61\\xb9\\xcf\\x89\\x90\\x6a\\x7d\\xea\\x8c\\xbd\\x7e\\x72\\x6b\\xa3\\x1e\\xa6\\x88\\x03\\xa6\\xb0\\x04\\xf6\\xdc\\xd1\\x9e\\x67\\x19\\x50\\x46\\x37\\x38\\xcc\\xa7\\x8b\\xb0\\xdf\\xfa\\x3d\\x64\\x57\\xe4\\xae\\xca\\x65\\x7e\\xc6\\x49\\xb9\\x7e\\xe3\\x0e\\x97\\xc8\\xcb\\xe6\\xce\\x43\\xc2\\xaa\\x9a\\x69\\x95\\x8e\\x9d\\xc8\\x81\\xe4\\xaa\\x7b\\x32\\x78\\x07\\x4e\\x78\\x7a\\xce\\x5f\\xb6\\x01\\xd7\\xfa\\xf7\\xca\\x51\\x03\\xec\\xbb\\xd3\\xbd\\x55\\x4e\\xb1\\xb0\\x66\\xf8\\x29\\x6d\\x2c\\xc5\\x7e\\x8c\\x8a\\x32\\xe9\\xc0\\xe6\\xa9\\x26\\x96\\x4d\\x6d\\xf2\\xd8\\x64\\x58\\x64\\xb3\\x22\\xc3\\x22\\xf1\\xca\\x80\\x73\\xce\\xdf\\x2b\\x55\\x67\\x11\\xa7\\xa2\\x0b\\x77\\xc0\\xa1\\xed\\x27\\x7a\\x9a\\x6c\\xa2\\xc0\\x71\\x54\\xe8\\x63\\xfe\\xf5\\xa4\\x04\\xe3\\xe8\\x9f\\x0d\\x7f\\x30\\xf2\\x18\\xec\\x4d\\xe7\\xa5\\x3a\\xeb\\x9c\\x41\\xee\\xaa\\xf6\\xce\\x74\\x96\\x49\\xc9\\x99\\x8f\\xd6\\x2b\\xcb\\xa2\\x87\\x23\\x38\\xe1\\x9c\\x94\\xe5\\x9d\\xd5\\xe2\\xdd\\x77\\x6f\\x53\\x71\\x9d\\x21\\x74\\x69\\x76\\x93\\x2e\\xf1\\x1a\\xbf\\x7a\\x32\\xae\\x6b\\x07\\x44\\x66\\x5d\\x0e\\x0c\\xe5\\x13\\x95\\x5a\\x9e\\x68\\x53\\x1d\\x8e\\xe4\\xde\\x9a\\x8d\\x35\\xdd\\xfb\\x88\\xeb\\x5a\\x48\\x6a\\xd6\\x31\\x37\\xe8\\x89\\x2f\\xd7\\xc6\\x89\\xd4\\xf9\\xe7\\x02\\x1b\\x11\\x73\\xbb\\x37\\x52\\xa5\\xee\\xcf\\x29\\x92\\xe3\\xfd\\x46\\x42\\x26\\x3c\\x7b\\x3d\\x81\\x5c\\x29\\xb4\\x66\\xab\\x69\\x28\\x5f\\xfe\\x4b\\x8d\\xaf\\xcb\\xf3\\xd0\\x1d\\x63\\x55\\x53\\xab\\x75\\x75\\xa7\\xa3\\x47\\x1e\\xdc\\x7b\\xe4\\x12\\xd3\\xd0\\x1e\\x6f\\xe8\\xe3\\xcd\\xc3\\xfa\\x04\\xd2\\xa7\\x59\\x93\\x81\\xe2\\x2b\\xba\\x49\\xc5\\x53\\x9d\\x79\\xc6\\x2b\\x52\\xbb\\x0e\\xca\\x33\\xf7\\x42\\x55\\xe4\\x1a\\x95\\x26\\xa8\\x92\\x89\\xb1\\x5f\\x18\\x50\\xd9\\xaf\\xa8\\x7e\\x6b\\x6f\\xa1\\x27\\x10\\x1c\\x1a\\x6d\\x88\\xd4\\x33\\xe0\\xc8\\x6a\\xa6\\x0b\\xba\\x8f\\xe7\\x10\\x0e\\xd6\\x1d\\x5a\\x9d\\x00\\xa0\\x07\\x64\\x51\\x3e\\xb1\\xc7\\xf5\\xf5\\xc3\\xb3\\xef\\xc4\\x53\\x2a\\x36\\xb4\\x07\\xfe\\x2d\\x17\\xcf\\xb4\\xe6\\xfc\\xd6\\x04\\x9c\\xff\\x3a\\x35\\x56\\x23\\xa3\\xa4\\x13\\x90\\xea\\x48\\xf4\\x21\\x20\\xd8\\x97\\x94\\x91\\x11\\xbe\\x3d\\x16\\x9b\\x2d\\x2e\\xf4\\x5b\\xdb\\x89\\x4f\\xe2\\x0b\\x1a\\x95\\xef\\x66\\x14\\x94\\x27\\xa9\\xd8\\xf8\\x0a\\x9b\\x2e\"},\n{{0xa3,0xbe,0xd9,0xfe,0x23,0x54,0xbd,0x28,0x60,0x14,0x9a,0x3d,0xb7,0x5a,0x85,0xb1,0x29,0xcf,0x83,0xe9,0xd7,0x3e,0x63,0x17,0xba,0x70,0x54,0x52,0x19,0x33,0xf8,0x96,},{0x5a,0xc0,0x3b,0x4f,0x13,0xd9,0x1d,0x06,0x6b,0x2c,0xe3,0x59,0xe9,0xbb,0x1d,0xfb,0x6b,0xfa,0x5a,0xfa,0x38,0x2f,0xd1,0xcc,0xd7,0x2a,0xef,0x11,0x76,0x07,0x9f,0x89,},{0x33,0xbc,0x1e,0x0b,0xf1,0xb4,0x93,0xe0,0xcf,0xb7,0xea,0x40,0x48,0x0a,0x14,0x23,0xe0,0x91,0xf7,0x14,0x57,0x45,0x01,0x31,0x73,0x78,0x7d,0xf4,0x7a,0x10,0xdb,0x24,0xc1,0x65,0xd0,0x05,0x96,0xfa,0xb7,0x0e,0x68,0xc9,0x4c,0x10,0x4e,0x8a,0x74,0x07,0xcf,0x69,0x5c,0xd3,0xfb,0xe5,0x85,0xb5,0xb1,0x76,0xb8,0x5c,0xcc,0xa4,0xfd,0x08,},\"\\xdb\\x85\\x38\\x08\\x68\\x6d\\x6d\\x21\\xf4\\xc5\\x7b\\x54\\x1e\\x5a\\xd6\\x33\\x94\\xd4\\x65\\xe6\\x00\\x78\\x64\\x3c\\xab\\x1e\\x06\\x5c\\x9f\\x30\\x6c\\x50\\x00\\x78\\xf0\\xcc\\x41\\xef\\x0f\\x95\\x42\\xb5\\xfe\\x35\\x6a\\xec\\x47\\x77\\xef\\x8a\\x95\\x55\\x4c\\x97\\xb6\\xa4\\x40\\x99\\xe9\\xbd\\x64\\x04\\xfb\\x0b\\x2e\\x41\\xf9\\x19\\x14\\xb0\\x74\\xd1\\x22\\x37\\xcd\\x44\\x2e\\xbd\\x40\\xb5\\x1b\\x8b\\xc8\\xbb\\xe4\\x37\\xa2\\xc5\\x33\\x32\\xd2\\xbe\\xb2\\x28\\x1b\\xf7\\x32\\x4a\\x0c\\xf5\\xb7\\x41\\xbb\\xf9\\x8d\\x1e\\xb9\\x85\\x8b\\xe9\\x26\\xe9\\x15\\xa7\\x8e\\x8d\\x31\\x4b\\x41\\x44\\xf3\\xd2\\x0d\\xfc\\x6c\\xb7\\xf4\\x8c\\x23\\xaf\\x90\\xf8\\x71\\xc6\\xcd\\xa9\\x08\\x45\\xa4\\x1a\\xff\\x17\\x07\\xa8\\x7b\\x4e\\x55\\x16\\xf1\\x8e\\x8b\\xd7\\x68\\x3c\\xfd\\x74\\x07\\x08\\x03\\xe8\\x88\\x33\\x8c\\x9a\\x18\\xf7\\x92\\xc8\\xd3\\xa7\\x04\\x17\\x0f\\xf9\\x82\\xbf\\xfc\\x9e\\x8e\\xc9\\xea\\x5d\\x1a\\x62\\x59\\x2f\\x16\\x88\\xd4\\xf2\\xb0\\x1e\\x11\\xf9\\xf8\\x87\\x74\\xc4\\x7a\\xc1\\xd5\\x8f\\x69\\x0b\\xcf\\x28\\x8c\\xf8\\xa4\\x73\\xd3\\x50\\xa8\\x23\\x9d\\xf9\\xd3\\xa6\\x28\\x81\\xda\\xdd\\x33\\x85\\x31\\xfd\\xce\\x76\\x15\\x80\\x7c\\xe9\\x65\\x49\\x6d\\x6f\\x35\\xd6\\xc0\\x42\\xf0\\xce\\x7f\\x21\\xef\\xe5\\xce\\x64\\x25\\x18\\x59\\x41\\xed\\x56\\x36\\xb8\\xae\\x91\\x3a\\x75\\xd2\\x1a\\xb9\\xdb\\xdb\\x3c\\x3b\\x66\\x87\\xa4\\x5e\\x04\\x49\\x38\\xa9\\xf1\\xc1\\x3a\\x33\\x0e\\xa9\\x76\\x1e\\x28\\x3e\\x61\\xd4\\xa3\\x20\\xe1\\xf5\\x59\\x88\\x2f\\x34\\xb6\\x07\\xfe\\xfe\\x32\\xc3\\x43\\x17\\x4a\\xbc\\xdc\\x77\\xb0\\x65\\xa9\\x29\\x04\\xb4\\x2d\\x96\\x1d\\xb8\\xed\\x91\\x6c\\x01\\x46\\x4f\\xfd\\x43\\xf9\\x3c\\x10\\x77\\xf1\\xdf\\x7e\\xe6\\x50\\x31\\xcf\\xe0\\x5d\\x78\\x0d\\x01\\xd0\\x8e\\xe0\\x36\\xf2\\x2a\\x2b\\x05\\x12\\x19\\x3b\\x0c\\x0f\\x38\\x01\\xe0\\xa0\\x20\\x8e\\xef\\x24\\x5c\\x9e\\x51\\x93\\x52\\xd2\\xb0\\x09\\x63\\x82\\xf2\\xcb\\xa0\\x6e\\xb2\\xa0\\x1d\\xac\\xf6\\x19\\xea\\xbb\\xc8\\x83\\xc5\\xd4\\xf2\\xfd\\x7c\\x34\\x23\\x17\\x9c\\x0f\\x5f\\xfd\\xaf\\x8c\\xaf\\xff\\x5c\\x46\\xb3\\x4a\\x09\\xc3\\xc5\\x0e\\x29\\x49\\xc0\\x60\\x00\\x20\\x7d\\x70\\xd3\\x7d\\x65\\xa7\\x43\\x07\\x5f\\xdc\\x2b\\xe6\\x2d\\x41\\x2a\\xa6\\x3e\\x36\\x37\\x06\\xca\\x90\\xe6\\xef\\x44\\xe1\\x52\\xea\\x4d\\xc5\\xc2\\x89\\x3e\\xcd\\x08\\xd7\\x96\\xd4\\x1f\\x17\\x22\\x54\\xc3\\xd1\\xd1\\x4b\\xb0\\x67\\xb5\\x3a\\x08\\x97\\xbb\\xd7\\x3c\\x99\\x54\\xd9\\x64\\x8b\\x2a\\xf1\\x0d\\x9c\\x27\\x03\\xe3\\x8b\\x6c\\x62\\x46\\x9f\\x6f\\x95\\x8a\\x1c\\xa0\\xa3\\x20\\xc1\\x23\\x39\\xe9\\x0c\\xf7\\x68\\xc8\\x7b\\x47\\x38\\xc2\\x19\\xf8\\x09\\x3b\\xff\\x4c\\x2c\\xfd\\x29\\x45\\x9f\\x6d\\x32\\x81\\x34\\x93\\x78\\xe9\\x15\\xa3\\xb0\\xe7\\x24\\xc7\\x4d\\x2b\\xd7\\xa8\\x51\\xac\\x7c\\x6b\\x48\\xe8\\xaf\\xc7\\x12\\x4f\\xdc\\xbc\\xab\\x5f\\xf8\\x0d\\x1d\\xee\\x30\\xa6\\xc0\\x24\\xcb\\x43\\x31\\x97\\x23\\x66\\xeb\\xab\\x26\\xbb\\xb9\\xf6\\x08\\xca\\xac\\x7e\\x51\\x91\\x4d\\xf0\\x58\\xb9\\xb3\\x74\\x5d\\x98\\xc5\\xd2\\x7e\\x97\\x10\\x54\\x75\\xec\\x01\\x73\\x77\\xe6\\x31\\x61\\x98\\xec\\xe4\\xec\\x59\\x09\\xf0\\x4f\\xc2\\x7e\\x7b\\x38\\x2e\\x66\\xad\\xb6\\x2a\\xc8\\xa9\\x77\\xf3\\x76\\xfd\\x5d\\xae\\x43\\x4f\\xb5\\x51\\x75\\x24\\x9c\\xa1\\xab\\x6b\\xb0\\x2d\\xec\\x06\\x96\\xf0\\x89\\xbe\\x34\\x54\\x88\\x7a\\x0c\\x32\\x36\\x1d\\x17\\x2b\\xd2\"},\n{{0x88,0xa2,0x4f,0x0d,0xf3,0xae,0x29,0x14,0xdf,0x79,0xda,0x50,0xec,0xf8,0xec,0xb4,0x2f,0x68,0xc7,0xba,0xad,0x3b,0x6c,0x3a,0x2e,0x0c,0xc9,0xc2,0x5d,0x09,0xd1,0x42,},{0x12,0xe6,0x60,0x3f,0x71,0x3b,0x23,0x05,0x35,0x85,0x68,0x71,0x00,0x18,0x68,0x5e,0x14,0x15,0x53,0xc4,0x75,0x91,0x39,0x6f,0xb4,0x25,0x9e,0x42,0xdc,0x53,0xb9,0xc9,},{0x17,0x07,0xcc,0x00,0x91,0x86,0xbf,0x3f,0x03,0xf7,0xbb,0x9e,0x3c,0xd4,0xcf,0x6b,0x73,0x7b,0x7a,0x6b,0xaa,0xde,0x7f,0xc6,0xc3,0xff,0x5c,0x12,0x25,0xdb,0xb2,0xba,0xf5,0x4f,0x47,0xc8,0x5e,0xaf,0xa1,0x32,0xc3,0x1e,0xac,0xa0,0x3e,0x6a,0xec,0x14,0x47,0x73,0x3f,0xac,0xd3,0x71,0x49,0xb7,0xc6,0xcf,0x0c,0xd4,0x1f,0x61,0x14,0x04,},\"\\x65\\x4e\\x9e\\xdc\\x69\\xfe\\x63\\x4c\\x23\\x08\\xba\\x8c\\x46\\xa9\\x55\\xe8\\x82\\x45\\x62\\x86\\xea\\xe3\\x59\\x3c\\xae\\x73\\x9c\\x44\\x86\\x6c\\x0d\\xe9\\xed\\xcb\\xbf\\x0d\\xb1\\xc4\\x41\\x49\\x66\\x84\\x67\\x70\\x9d\\xc9\\x70\\x62\\x98\\xdd\\x2e\\xac\\x33\\x01\\xda\\xba\\xd5\\xbd\\x8e\\x93\\xc5\\xe8\\xa9\\x3f\\x19\\x4e\\x0f\\xc1\\xd9\\xf3\\x76\\xc1\\x44\\xc2\\x93\\xae\\xfd\\xa0\\x86\\xb2\\x21\\x8f\\x2e\\x9d\\xfd\\x7c\\x2d\\xc5\\x2b\\xa3\\x3e\\xb2\\x29\\xdc\\xf7\\xbb\\x68\\xce\\x0f\\x87\\x6c\\x5f\\xd4\\xe8\\x1a\\xfd\\x80\\x16\\x9f\\x73\\xcf\\x26\\x4e\\x5d\\xc0\\xce\\x16\\xe1\\xb8\\x76\\xcd\\x11\\xc7\\xad\\x89\\x05\\x8e\\xe0\\x82\\x0c\\x40\\x00\\x5d\\x01\\xf1\\x19\\xf8\\xbe\\x6f\\x1a\\xfb\\xe2\\x4c\\xa4\\xae\\xdc\\x18\\xe9\\x78\\x96\\x82\\x7c\\x3e\\xd6\\x7f\\xc4\\x56\\x30\\xe7\\x90\\x3b\\x7f\\xee\\x9c\\x99\\x0e\\x36\\x19\\x37\\xbf\\x4e\\xa0\\xa4\\xd8\\xd1\\x6c\\xf6\\xd9\\xcf\\x03\\x81\\xe9\\x06\\x5e\\x36\\x25\\x14\\x8f\\x8a\\xe0\\x49\\x1a\\x03\\x41\\xd0\\xff\\x9f\\x72\\x7b\\xe1\\xf3\\x10\\xca\\x1e\\xc3\\xf0\\x10\\x4a\\xa0\\x54\\x32\\x17\\x84\\xdd\\x24\\xd5\\x3c\\x98\\x5b\\x28\\xd4\\x40\\x82\\xf8\\xe1\\xc1\\x08\\xa4\\x41\\x09\\x63\\x8f\\xf5\\x11\\x6e\\xdd\\x85\\xae\\xb8\\x6b\\x6e\\xa5\\x12\\xa1\\x9b\\x60\\x2e\\xdd\\x9d\\x21\\x10\\x70\\xd0\\x44\\xaf\\x5b\\xed\\xb6\\xc8\\x52\\x7b\\xa3\\x49\\x1e\\x34\\x5b\\xac\\xc1\\x30\\xb3\\x69\\x60\\x28\\x2a\\xe7\\x37\\xb8\\x5c\\x76\\x92\\x74\\xf0\\xf7\\xc5\\x88\\xf4\\x0e\\x66\\x25\\xb2\\x36\\xbd\\xc1\\xa3\\xb8\\x73\\x20\\x46\\x0e\\xee\\xad\\xa2\\x78\\x12\\x4b\\x56\\x68\\x87\\x4f\\x39\\xf5\\x9c\\x2e\\x6a\\xa2\\x08\\xc3\\xb6\\xa9\\xb8\\x45\\xc4\\xd0\\xa2\\x7a\\x05\\x46\\x78\\x6f\\xa1\\x3e\\x51\\xcc\\x98\\xb7\\x3f\\xd7\\xee\\x32\\x7b\\x62\\x15\\xec\\x6b\\x62\\x9f\\x4c\\xc7\\xe4\\xbd\\x3c\\x0a\\x3d\\xb7\\x8a\\x21\\xff\\xfe\\x24\\xc7\\x04\\x38\\x71\\x6b\\xc3\\x7b\\x8d\\xa7\\xc5\\xff\\x7c\\x36\\x88\\xa9\\x03\\x39\\xc2\\x2e\\xb5\\x0b\\x7c\\x2c\\xd3\\x6b\\x68\\x83\\x1f\\xd5\\x93\\x91\\x75\\x68\\x9b\\xd3\\xe2\\x2c\\x38\\x81\\xaf\\x33\\x7e\\xe1\\x44\\x35\\x70\\x9e\\x35\\x10\\x40\\xef\\x3d\\xa9\\x55\\x72\\x4e\\x51\\xc2\\x4a\\x5e\\x2c\\x09\\xf8\\x91\\x80\\x83\\x93\\xfb\\xf8\\xef\\x7f\\x1f\\x5f\\x02\\x98\\xde\\xeb\\xdc\\xd8\\xd6\\x66\\xcb\\xcf\\x3e\\x86\\x6c\\x71\\x89\\x99\\xab\\x6b\\x1f\\xee\\xc9\\xc4\\x7e\\x02\\xe7\\xd6\\x35\\x40\\xf8\\x99\\x63\\xd5\\x42\\xc5\\xd0\\x1f\\xb6\\xfc\\x30\\x76\\x89\\x68\\xae\\x81\\xb2\\x0c\\x35\\x4b\\x40\\x00\\xc1\\x32\\x77\\x47\\x64\\xd6\\xd4\\x43\\xad\\xd6\\x4f\\x6d\\xd7\\x48\\xf5\\xfb\\x5b\\x7f\\x6e\\xba\\x40\\x1d\\xb4\\x31\\x8b\\xe9\\x93\\x98\\x9f\\xcc\\x25\\x77\\x96\\x1f\\xa5\\xad\\x31\\xf6\\xa2\\xa9\\xd6\\xa7\\x55\\x28\\x58\\x65\\xcd\\x5d\\xc3\\xa8\\x8c\\xfb\\x5a\\xba\\x7d\\x92\\x3b\\xaf\\x78\\xb5\\xd1\\x31\\xb4\\xc2\\x14\\xdf\\x55\\xb6\\x17\\x1f\\x45\\x20\\x9e\\x21\\xca\\x66\\x45\\x49\\x0d\\x3a\\x36\\x44\\xdd\\xa6\\xdc\\x92\\x9c\\x7c\\x40\\x95\\x76\\xd3\\x71\\x64\\x75\\x5e\\xf8\\xaa\\xf3\\xdc\\xd4\\xd2\\x27\\x75\\xee\\x7d\\xea\\x0e\\x56\\x5b\\xd5\\x47\\x27\\x92\\x1c\\x64\\x9b\\xc5\\x1f\\x20\\xc1\\xf6\\x8c\\x1f\\xde\\xac\\x45\\x5c\\x67\\xd7\\x1a\\x1c\\xb8\\x83\\x7f\\x46\\x91\\x44\\x8b\\xf0\\xbf\\x04\\x4a\\x46\\xf1\\x68\\x5f\\xbe\\x22\\xb1\\xe0\\x18\\x77\\xf7\\x47\\x7d\\x34\\x99\\x40\\x8c\\x4c\\x31\\x65\\x10\\xce\\x2e\\x55\\xb9\\x80\\x05\"},\n{{0x18,0x4d,0x0c,0xe2,0xe9,0xdb,0x7f,0x25,0x7a,0x8b,0xf4,0x64,0x6d,0x16,0xd2,0xc5,0xef,0xc2,0x70,0x2c,0xed,0x02,0x6b,0x69,0x06,0xd3,0xc8,0xc0,0x11,0x8f,0x22,0x61,},{0xe9,0xda,0xb8,0xfd,0x9d,0x94,0xdc,0x9b,0x24,0xcc,0x79,0xc6,0x35,0xcc,0x57,0xce,0x66,0x51,0x89,0x82,0xba,0x3e,0x24,0x47,0x24,0x07,0x41,0xba,0xc0,0x73,0x0e,0xc5,},{0xb1,0xe3,0xbf,0x5f,0xa7,0x4d,0x7e,0x44,0x2c,0xed,0x9a,0x98,0xd9,0x27,0xd8,0xc4,0x5e,0x0e,0x64,0xd8,0x74,0xf8,0xea,0x59,0x20,0xa3,0x60,0xa4,0xbf,0x42,0xd8,0x3c,0xe1,0x8a,0x92,0x4a,0xc7,0x96,0xe1,0xa7,0x7d,0x1b,0x02,0x08,0x29,0x4b,0x50,0xf8,0x22,0x17,0x7f,0xdb,0xdd,0x45,0x8c,0x74,0x35,0x6f,0xcf,0x6b,0xd7,0x94,0x51,0x06,},\"\\x6a\\x9b\\x87\\x6b\\x0b\\xf4\\x18\\x9b\\x3c\\xc1\\x5f\\x9e\\xb4\\xfb\\xe7\\x93\\x2b\\x55\\x77\\x89\\x2a\\x22\\x20\\x0c\\xe1\\x07\\x15\\x68\\x53\\xd6\\xd3\\xca\\x36\\x3f\\x02\\x5a\\xd7\\xa2\\xd8\\x62\\xaa\\xdc\\x74\\x2d\\x94\\x15\\xbd\\x8d\\x1f\\xca\\x13\\xc9\\xdc\\xa3\\x58\\x60\\x44\\xe5\\x5a\\x8c\\xf5\\xde\\xe1\\xce\\x56\\x45\\x76\\xe3\\xe8\\xe3\\x65\\x54\\x05\\x46\\x50\\x1b\\x34\\xca\\x67\\x5c\\xf2\\x00\\xe0\\x77\\x1a\\x81\\x8c\\x73\\xd3\\x7f\\xcd\\xa8\\xcb\\x15\\xe4\\x8d\\x5a\\x0b\\x9e\\xa3\\xbe\\xec\\x0f\\xf6\\x61\\x0b\\x2a\\x8a\\x21\\x4c\\xa4\\xf7\\xef\\xac\\x0e\\x71\\x38\\x10\\x52\\xd9\\xbf\\x3c\\x00\\xc3\\x29\\x59\\x34\\x74\\xeb\\xd0\\xa6\\x87\\xa0\\xb4\\x1d\\x14\\x4b\\x5e\\x7a\\xb1\\x41\\x2b\\x97\\x0a\\x74\\xba\\xba\\x4d\\x27\\x4b\\xb0\\xdb\\xfd\\xb0\\x2b\\x11\\xf7\\xf6\\x39\\x64\\xba\\x6f\\x3b\\xa0\\xad\\x23\\x34\\x1d\\x08\\x3b\\x91\\xa4\\x30\\x82\\x39\\xe3\\x3d\\x50\\x82\\x43\\x96\\x12\\x65\\x88\\xde\\x72\\xa2\\x39\\x0c\\x1c\\x0f\\xc0\\x67\\x47\\xc2\\x87\\x72\\xf6\\x30\\xbf\\x4d\\x14\\x3f\\x7a\\x11\\x59\\xf0\\x28\\xc0\\x93\\x40\\x48\\x94\\xe6\\xd1\\x6f\\x63\\x46\\x35\\xd4\\xfc\\x33\\x0f\\x3d\\x7a\\x73\\x13\\xef\\x75\\x6f\\x5d\\x49\\xd8\\xf6\\x20\\x5e\\xb1\\xc7\\x92\\xa9\\x49\\x5d\\xa1\\x31\\xb4\\x33\\x45\\xa0\\x09\\x0c\\x12\\xca\\x56\\xe6\\xad\\xac\\x5b\\xe0\\xcb\\xca\\xc3\\x60\\x9d\\x69\\xf7\\x24\\x15\\xf6\\xc3\\x7f\\x3c\\xfb\\x2c\\xf7\\x6b\\x3e\\x65\\xf3\\xc9\\x3a\\xc9\\x2b\\x63\\xf2\\xba\\xa4\\x66\\x24\\x90\\x75\\xbc\\xa6\\x9d\\x4c\\x1d\\x1f\\x3a\\xde\\x24\\xab\\x31\\xef\\xfc\\xb9\\x04\\x69\\xc2\\x4b\\xb4\\x10\\xab\\x47\\x23\\xe1\\xb7\\xe1\\xc8\\x8b\\x3a\\x36\\x43\\x35\\x63\\xf7\\x1a\\x99\\xaa\\xd5\\x8f\\xe8\\x05\\x68\\xf9\\xc1\\x02\\xda\\x89\\xba\\xd9\\x79\\x63\\xe7\\x7d\\x66\\x22\\x48\\x31\\x66\\xf3\\xae\\x26\\x1f\\x32\\xa5\\x2a\\x86\\x10\\x1e\\xbd\\x64\\x5f\\x61\\x42\\xc9\\x82\\xe2\\xcd\\x36\\x25\\xcf\\x8b\\x46\\xb9\\xb2\\x89\\x12\\x46\\x92\\x0f\\x69\\x7f\\xca\\xed\\x39\\x7c\\xb9\\x22\\xc2\\x74\\x94\\x51\\x67\\xa0\\xe6\\x19\\xb0\\xb5\\x06\\x37\\x76\\x06\\xdb\\x04\\x57\\x83\\xb0\\xb8\\x8e\\xa0\\x4e\\x93\\x2d\\x21\\xff\\xc0\\x64\\xa1\\x2a\\x40\\xeb\\xe9\\xb4\\x80\\xf1\\xa2\\xc7\\xdd\\xd3\\x95\\xa9\\xb1\\x5e\\xfd\\xc4\\x95\\xc9\\x71\\x4f\\x36\\xfa\\x99\\x6f\\x79\\xf8\\xeb\\x8e\\xfa\\x52\\xd9\\x9a\\x24\\xab\\xfe\\xf4\\x3b\\x32\\xa2\\x37\\xc5\\xbc\\x00\\x18\\xda\\x3b\\x16\\x2f\\x59\\xb8\\xd3\\xd4\\x74\\xe2\\xce\\x08\\xfa\\x80\\x24\\xc5\\x8a\\xcc\\x0a\\x99\\xff\\x61\\x4e\\x6c\\xd7\\xfd\\xd9\\xca\\x4e\\x8f\\x41\\xa1\\x44\\x9a\\xa6\\x18\\xd0\\x33\\x37\\xe8\\xa3\\x74\\xd5\\x60\\x55\\xb2\\x07\\xa9\\xdb\\xe6\\x9f\\x59\\x48\\xf9\\x01\\xca\\x7d\\xb0\\x41\\x0f\\x01\\xaa\\x37\\x3d\\x9e\\x02\\x27\\x62\\x35\\x99\\xbc\\x21\\x28\\x45\\xb0\\x06\\xe9\\x42\\xfa\\xbc\\x58\\x2c\\xd7\\x26\\xdb\\x5c\\x44\\x3e\\xb2\\xdf\\xfb\\xc9\\xe3\\xe7\\xf0\\xe5\\xcb\\x67\\x44\\xf7\\xad\\x71\\x60\\x50\\xfd\\xf2\\xc6\\x0c\\x7c\\x77\\xc2\\x53\\xab\\x74\\x5d\\xb9\\xc8\\x55\\x26\\x55\\x68\\x3e\\xa7\\xea\\x68\\x0a\\xa4\\xaf\\x34\\xdf\\x13\\x25\\xc2\\x9b\\x88\\x74\\xb6\\x1b\\xe2\\x3d\\xe4\\xff\\xba\\x25\\x42\\x4f\\x46\\x19\\xec\\x68\\x2c\\x26\\xb3\\xa6\\x7b\\xda\\x9b\\xc4\\xc9\\x4b\\x79\\xa9\\xfc\\x4d\\x82\\xd3\\x40\\x49\\x5b\\x43\\x7a\\x1c\\xbd\\x6b\\x60\\x30\\x7c\\xfc\\xb1\\x00\\x26\\xf9\\x64\\xa0\\x17\\x62\\x3e\\x33\\xdb\\xf2\\x33\"},\n{{0xd0,0x2b,0xbf,0x70,0xd5,0x13,0x51,0xe3,0xb4,0x7a,0xd8,0xe5,0xed,0x26,0x3d,0xbf,0x55,0x6d,0x14,0x98,0xfa,0x9b,0xd5,0xdb,0xd9,0x9f,0xb4,0x26,0x90,0x09,0xdc,0xed,},{0x8c,0xe4,0xb5,0x9f,0x94,0xce,0xd6,0xec,0x96,0x14,0xd6,0x7d,0x30,0x66,0xd9,0xd3,0xa0,0xdf,0x7a,0x46,0xb3,0x7b,0x4c,0x17,0x25,0xef,0x1e,0x57,0xbc,0x68,0xa0,0xd1,},{0x6e,0x7c,0x66,0xac,0xc9,0x54,0xff,0xd9,0xdd,0x4c,0x1c,0x63,0x35,0xab,0x4f,0xe7,0x9d,0xbb,0xed,0x78,0x2c,0x4a,0x47,0xec,0x30,0xd8,0x48,0xd8,0xbb,0x2b,0x4f,0x10,0x69,0xdc,0x62,0xe5,0x22,0xa1,0xe8,0x01,0x7f,0x54,0xa6,0x34,0x5e,0x17,0x28,0xc0,0x73,0xaf,0x64,0x47,0x85,0x6d,0x8c,0x1e,0xd3,0x58,0x78,0xb5,0x71,0xe5,0x23,0x0d,},\"\\x55\\x45\\x60\\xf7\\xa7\\xfd\\x1a\\xe7\\x75\\x8a\\x2f\\xce\\x7d\\x78\\x0f\\x6b\\x3f\\x04\\x3d\\x3a\\xf8\\x9d\\x4f\\x19\\xef\\x57\\x3c\\x34\\x99\\x75\\x54\\xdf\\x24\\x3f\\xaf\\x2a\\xaa\\xb6\\x5b\\x2a\\xfd\\xd2\\x86\\x10\\xd4\\xa5\\x1e\\x9a\\x4b\\x46\\x4d\\xb6\\xdb\\x09\\xeb\\xf7\\x3b\\x7d\\x24\\x05\\x4c\\xc9\\xb1\\x28\\x14\\xbb\\x29\\xee\\x99\\xe1\\xa7\\x3b\\xd6\\x03\\x89\\x83\\x60\\xf9\\xdc\\xf0\\x1e\\x67\\x08\\x36\\x28\\x6f\\x82\\x36\\xed\\x8c\\xef\\x07\\x5f\\x3d\\x56\\x33\\x12\\xc1\\x6c\\x73\\xfc\\x37\\xee\\xdf\\x25\\x2f\\x8f\\x42\\xd3\\x0a\\x13\\xe7\\xfb\\xa3\\xb1\\x65\\x23\\x8c\\x7f\\x81\\xea\\xae\\xb5\\x31\\x90\\xf3\\xec\\x3b\\x5d\\x63\\xf0\\xee\\x03\\xe3\\x98\\x7e\\x39\\x0d\\x1d\\x81\\xe8\\x27\\x7e\\x9f\\x6c\\x1e\\xe6\\xec\\x4e\\xc3\\xfa\\x0d\\x72\\x0e\\x9f\\x53\\xf9\\xc2\\x6f\\x04\\xaa\\x2e\\xd2\\xb5\\xef\\x31\\x60\\x89\\x59\\x99\\xea\\xce\\x29\\xcf\\x5d\\xc2\\x54\\xad\\x71\\x10\\x6b\\xb7\\xe8\\xbc\\x29\\xa5\\xb1\\xd2\\x41\\x25\\x93\\xd0\\x81\\x94\\xe8\\x8e\\x16\\x59\\xa7\\x31\\x59\\xa2\\xa2\\x20\\x33\\xab\\x06\\x6e\\x8d\\x3d\\x8c\\x3b\\xc8\\x6b\\x7b\\x01\\xde\\x81\\xa8\\xc6\\x60\\x47\\xb0\\x7f\\xe2\\x4e\\xd2\\x40\\x31\\x8b\\xa3\\x7b\\xa3\\xef\\xb6\\xcf\\x63\\x26\\x04\\xca\\x4f\\x44\\x6a\\x75\\xfd\\x8e\\x70\\xc4\\x53\\xf0\\xc6\\x0e\\xe1\\x6e\\xca\\xf5\\x24\\xe7\\x03\\xf4\\x7d\\xf5\\xc2\\x82\\xca\\x32\\x89\\xb3\\xaf\\x61\\xde\\xe4\\x70\\x9e\\xe0\\x85\\x32\\x3b\\x1e\\x5c\\x8a\\x6b\\xc0\\x76\\x62\\x01\\xc6\\x35\\x03\\x14\\x46\\x89\\x1f\\x34\\x94\\xe9\\xdb\\x20\\xdd\\x4e\\x9e\\x08\\x38\\x24\\x9a\\x67\\xe1\\x38\\xd1\\x3e\\xe2\\xc9\\x6f\\x61\\xe7\\x71\\x06\\x15\\x42\\xaa\\x16\\xef\\x20\\xd8\\x1e\\x3a\\x0f\\x4e\\x45\\x21\\xa6\\xcd\\x6c\\x92\\xfc\\x26\\xfe\\xef\\x03\\xb6\\x6c\\x70\\xe0\\x35\\xca\\xfc\\xc1\\x9c\\x96\\xfb\\x9d\\x82\\x91\\x8f\\xe1\\x97\\x78\\x0e\\xff\\x0e\\xda\\x6e\\x25\\x12\\xc5\\x6e\\x2a\\x73\\xd7\\x70\\x32\\xb7\\x68\\x91\\x9b\\xea\\x97\\x72\\xf5\\x98\\x9c\\x8b\\x6c\\x65\\xc3\\xd1\\xe9\\x7a\\x21\\x80\\xcc\\x3a\\x37\\x57\\x9d\\xa7\\x0c\\xe9\\x80\\x6a\\xc1\\x28\\x5a\\x3e\\xab\\x41\\x5c\\x06\\x07\\xd8\\x8c\\xb8\\x65\\x42\\xea\\xb9\\x0b\\x9d\\x2d\\x67\\xfa\\xff\\xfc\\xad\\x23\\xa7\\x14\\x00\\x0e\\xe5\\x9e\\xd6\\x8c\\x95\\x6e\\x81\\xc4\\x45\\x42\\x88\\x82\\xf9\\x7a\\xf7\\x4d\\xb3\\x62\\xe4\\x5c\\x0d\\x1b\\xd8\\x85\\x6e\\xed\\x16\\x6e\\x4a\\xec\\x4b\\xfd\\xf9\\x5e\\xad\\xb2\\x51\\xe2\\xa1\\xef\\x80\\x48\\x52\\xa9\\xea\\x77\\xd3\\x45\\x77\\xfe\\x70\\x83\\x1a\\x92\\x8b\\x10\\x1b\\x60\\xac\\x61\\x3e\\x7b\\xa2\\xe6\\xba\\x0a\\x94\\x01\\x3a\\x64\\xc2\\xf8\\x21\\x9f\\xd3\\x0b\\xff\\x40\\x90\\x99\\x66\\x7a\\x78\\x6f\\x99\\x32\\x7b\\xb0\\x3e\\x2f\\x21\\x87\\xf4\\x45\\xb4\\x6b\\xee\\xda\\xb6\\xd3\\x25\\xaf\\xd9\\x04\\xe3\\x95\\x43\\xe9\\x3f\\x4b\\x6c\\x54\\x43\\x24\\x9d\\x74\\x4b\\x2d\\x1a\\x43\\xe1\\x41\\xe4\\x76\\x8b\\xd4\\x0a\\xab\\xe4\\x05\\x72\\x44\\xe1\\xea\\xdd\\x9d\\xae\\xc1\\x75\\x71\\x9e\\x51\\xa0\\x93\\xac\\xe3\\x2f\\xe8\\x2b\\x2e\\xac\\xb5\\xec\\xb0\\xda\\x6c\\x1f\\xfe\\x98\\xc8\\xce\\xe7\\x88\\x6e\\x30\\x16\\x70\\xdf\\xf8\\x71\\x13\\xef\\xed\\x42\\x82\\x47\\x1a\\xfb\\x6b\\x8a\\x0f\\xdb\\x50\\x5e\\x2e\\x8e\\x7d\\xbc\\x1a\\x08\\xa2\\x2e\\x96\\x80\\xbd\\x09\\x8b\\xf1\\x27\\x58\\x02\\xbd\\xb4\\x59\\x41\\x3a\\x3b\\x23\\x7d\\x77\\x13\\xa1\\xbb\\xf5\\x97\\xe6\\xad\\xf2\\xb6\\x0e\\xaf\\x82\\x37\\x91\\xb3\"},\n{{0xaa,0x0f,0xda,0xe2,0xa5,0xa4,0xc9,0xc0,0x45,0x21,0x91,0x30,0x04,0xcd,0x89,0xef,0xbc,0x88,0xb2,0xda,0xdf,0x5a,0xbb,0x24,0x6f,0x3c,0xa7,0xf6,0x92,0x35,0x44,0xaf,},{0xbf,0xfc,0xb1,0x7c,0x35,0xc1,0x30,0x4c,0xdd,0x9d,0x62,0x4f,0xf6,0x9b,0xee,0x60,0xec,0x7c,0x9e,0xc3,0x27,0xd1,0x23,0x50,0xd7,0x0f,0xac,0x12,0xb4,0x7c,0xc2,0x5c,},{0xf9,0x37,0x29,0x89,0x69,0xca,0x34,0xd9,0x75,0x84,0x44,0x89,0x07,0x35,0x8b,0x0f,0x47,0x84,0x1f,0x30,0x23,0xaf,0xc7,0xef,0x76,0x81,0x52,0x1c,0x5b,0xe0,0xf5,0xe5,0x62,0x8a,0x8f,0x60,0x7e,0x2f,0x31,0x63,0x6e,0xf6,0x36,0x46,0xb0,0xe9,0x89,0x8a,0x72,0xad,0x35,0x57,0x06,0xd2,0xc8,0x06,0x0f,0xbc,0x64,0x0e,0xfb,0x3d,0x66,0x05,},\"\\xb1\\x41\\x84\\xcf\\xdc\\x4a\\x5f\\x0c\\x7f\\x83\\xf9\\x4a\\x83\\x2f\\x58\\x85\\x07\\xe2\\xd7\\x2a\\x89\\x32\\x98\\x70\\x07\\x85\\x71\\xd2\\x08\\xa0\\xc4\\x96\\x0c\\x2f\\xdc\\x4c\\x23\\x6c\\xf8\\x82\\x29\\x98\\x1d\\x12\\xb1\\x0a\\x1b\\x68\\x84\\xc8\\x65\\x0d\\xda\\xf1\\xd4\\xb2\\xeb\\x98\\x15\\x75\\xb1\\xe0\\x19\\xfe\\x3f\\x60\\x42\\x36\\x76\\xf8\\x85\\x6a\\x99\\x2c\\xce\\x36\\xd6\\xd0\\xa3\\xd0\\x26\\x63\\x1c\\x8c\\x1e\\x1f\\xfe\\x34\\x13\\x4b\\x29\\x6f\\x40\\x84\\x2b\\x6d\\xf4\\xf8\\x6f\\x83\\x3e\\x01\\x75\\xba\\xe5\\x0e\\x86\\xbf\\x85\\x6d\\x1e\\xe7\\x99\\x25\\xf4\\x34\\xb8\\xbf\\x2c\\x84\\x51\\x9f\\x1f\\x5d\\x25\\x38\\x60\\x49\\xce\\x3c\\xa6\\x17\\x77\\xe3\\x0b\\x70\\x0a\\x60\\x2d\\x39\\x52\\x50\\xb6\\x0f\\xc6\\x4a\\xc6\\xf8\\xdb\\x02\\x7e\\x8d\\xa8\\xb9\\x55\\x0f\\x24\\xed\\x11\\xa1\\x1d\\x9f\\x9f\\x9c\\x5e\\x0a\\xf1\\x45\\xb8\\x65\\x97\\x51\\xac\\x6b\\x55\\x86\\x1f\\x63\\x88\\xa6\\x43\\x36\\xb3\\x1e\\xfe\\x45\\xc0\\x80\\x2d\\x76\\xa5\\x34\\x86\\xa8\\x1e\\xba\\x07\\x31\\x4b\\x4d\\x96\\x1c\\x14\\x1a\\xb3\\x4e\\x2f\\x76\\xed\\xac\\x0e\\x6d\\xe3\\x14\\x22\\xdf\\x79\\x2a\\xf0\\x81\\xe7\\x69\\xc7\\xed\\x05\\xda\\x9a\\x5a\\xf2\\xfd\\xf3\\x6f\\x14\\x17\\x69\\x90\\x8b\\x70\\x09\\x37\\xf0\\xe1\\x06\\x8c\\x13\\x1f\\x17\\x6e\\xb9\\x6c\\x67\\xaf\\xdb\\xe7\\x8f\\x40\\xd8\\x60\\x07\\xfb\\xcd\\x47\\xe4\\x9e\\x2e\\x4c\\x4c\\xe0\\x49\\x93\\x6a\\xdf\\xf1\\xce\\x3e\\xac\\x42\\xb9\\x6b\\x34\\x29\\xb5\\x62\\x6b\\x1a\\xa6\\x2a\\xcd\\xe0\\x7f\\x45\\xa1\\x3c\\xe1\\xbd\\x21\\x1f\\x32\\xbd\\x7e\\xfe\\x47\\x90\\xc8\\x37\\x1e\\xbf\\x87\\xc1\\x64\\x47\\x7a\\x5c\\x9f\\xa3\\xe7\\x8c\\x2f\\x88\\x07\\x7b\\x09\\x73\\x44\\xcf\\xfa\\x03\\x1c\\x44\\x29\\xc7\\xf4\\x2d\\xca\\x07\\x73\\x78\\x50\\xee\\x7a\\x76\\x9b\\x36\\xd0\\xf0\\x62\\x5a\\xdf\\x12\\x0e\\xa2\\x3f\\xf4\\xe3\\x93\\xa4\\xfd\\xcb\\x65\\x58\\xdb\\xf9\\xb2\\x66\\xa0\\x32\\xe3\\xb0\\x59\\x9b\\x9d\\x66\\x92\\xfc\\xeb\\xd8\\x15\\xa3\\x89\\x76\\x07\\x85\\x63\\x25\\xfc\\xd0\\x11\\x5d\\xc3\\x10\\xdb\\x3a\\x87\\x92\\xfb\\xeb\\xd3\\x99\\x49\\x4c\\x83\\x71\\xe5\\x85\\x72\\x7b\\x3d\\x63\\x24\\x14\\x49\\x68\\x93\\xd0\\x38\\x13\\xba\\x1f\\x99\\x66\\x1b\\xce\\xb9\\xdc\\x18\\xec\\x5d\\xc2\\x7f\\x52\\x67\\x03\\x18\\x68\\x77\\x69\\xfc\\x67\\x8d\\xdc\\x7e\\x40\\x22\\x7c\\x20\\x05\\x22\\x01\\x3f\\x5c\\x0e\\xec\\x0e\\x47\\x81\\xe6\\xfc\\x15\\x3a\\x0c\\x2f\\x4f\\x3f\\x95\\xe5\\x17\\xc8\\x41\\x99\\x24\\xab\\x39\\x99\\x2a\\xf8\\xc1\\x94\\x65\\x05\\x7f\\x13\\x44\\x86\\x69\\x6b\\xa7\\xfd\\x46\\x51\\x76\\x8b\\x4e\\x74\\x9e\\xf3\\x6f\\x02\\x44\\x46\\x17\\xcf\\x97\\xf0\\xa4\\x23\\xe4\\xc1\\x3b\\x7b\\x66\\xba\\x2b\\x6c\\x45\\x68\\x78\\xb0\\xb5\\x0c\\xe2\\xee\\x5e\\xc5\\x64\\xed\\x88\\x54\\xf7\\x82\\xaa\\x1d\\x1c\\x6a\\xa7\\x60\\xf2\\x52\\x2c\\x7d\\x97\\xb9\\xb1\\xab\\xe0\\xba\\x81\\x09\\x59\\xd7\\xaa\\x40\\x3a\\x99\\x37\\x5a\\xa3\\xe3\\x9a\\x11\\x5d\\x1f\\xc6\\xfe\\xdd\\x00\\x2f\\x38\\x30\\xa5\\x0a\\x83\\x7d\\xc7\\x20\\x32\\x9e\\xc0\\xc7\\x3d\\x5b\\xfd\\x50\\x03\\x85\\xc7\\x36\\x83\\x82\\x87\\xe1\\x92\\x01\\x52\\x5d\\x18\\x9c\\x3a\\x08\\x4c\\xd5\\xa3\\xf3\\x59\\x87\\x5e\\x3b\\x83\\x25\\x28\\x9c\\xed\\x18\\xb6\\x3b\\x00\\xff\\x9c\\xd0\\x70\\xc3\\xe6\\x74\\x44\\xbd\\x3d\\x83\\x46\\x17\\x40\\x85\\xcc\\x45\\x13\\x5c\\xaa\\x0c\\x67\\xb3\\x22\\x6e\\x4a\\x52\\xe9\\xa1\\xc5\\x5a\\xed\\x7e\\xc5\\xfa\\xde\\x6b\\xf1\\x6c\\x19\"},\n{{0x71,0x62,0xfe,0xf0,0xac,0xa4,0x97,0x4b,0x09,0x4a,0x6a,0x08,0x05,0x43,0x95,0xf8,0x77,0xff,0x94,0x33,0xf1,0xe3,0x3e,0x20,0xe8,0x8e,0xaa,0x90,0xf9,0x38,0x99,0x7d,},{0xa2,0x80,0x64,0x0f,0x13,0x9f,0x45,0xc3,0x5a,0x48,0x71,0x53,0x7e,0xef,0xe6,0xef,0x9d,0xb0,0x2d,0xe7,0x85,0xee,0x9f,0xd5,0x4f,0x80,0x5f,0xb5,0x7d,0x37,0x46,0xef,},{0xae,0x16,0x1c,0xce,0x95,0x40,0x33,0x84,0xb6,0x5c,0x6b,0xc9,0xb3,0x93,0xeb,0x07,0x25,0x64,0xc3,0x5f,0x3a,0x6c,0x04,0xfa,0x51,0x7a,0xb0,0x68,0xbc,0xd2,0x37,0x67,0xcc,0x0c,0x8e,0xdd,0x92,0xb1,0xa1,0x3a,0xe9,0xa9,0xce,0x48,0x64,0x13,0x7f,0xb8,0x9c,0x1f,0x37,0xb7,0x48,0xcf,0xc9,0x13,0x4b,0x67,0x41,0xba,0x1b,0x22,0x28,0x0d,},\"\\xc9\\x0f\\x45\\x0b\\xda\\x1c\\x6e\\xfd\\x8d\\x12\\x78\\xde\\xbd\\x7a\\xe0\\x3e\\x2e\\xac\\x27\\x40\\xa5\\xa9\\x63\\xfc\\xf9\\x6c\\x50\\x4e\\x31\\xd4\\xd6\\xfc\\xc5\\xe2\\xb5\\x2a\\x25\\x18\\xd2\\x74\\x1c\\x55\\xe9\\x59\\x18\\x67\\xb2\\x42\\x32\\x28\\xf9\\xc1\\x9f\\x33\\xc6\\xf3\\x87\\x05\\xc6\\x20\\x36\\xd4\\x80\\xff\\x53\\xdf\\x12\\x07\\x7e\\x38\\xfd\\xb0\\x73\\xc6\\x73\\x10\\x5d\\xa1\\xe1\\x16\\x19\\xba\\x53\\x21\\xa7\\x1b\\x5f\\x49\\x93\\x23\\x4a\\x11\\x94\\x8e\\xa1\\x10\\xcf\\xa2\\x42\\xbc\\x23\\xfa\\xc9\\xaa\\xe4\\x62\\x60\\x6e\\x39\\x64\\x1c\\xa7\\x14\\x7e\\xeb\\xba\\x1e\\xec\\x55\\x3f\\xce\\x94\\xe5\\x3e\\x4e\\x01\\xb0\\x73\\xdd\\x78\\x0a\\x2f\\xf6\\x78\\xb3\\x15\\x72\\xca\\x11\\xee\\x08\\x77\\xe7\\x56\\xbc\\xdb\\x66\\x53\\xe5\\xe1\\xb4\\xcb\\xfb\\x56\\x9a\\x9d\\x60\\xe3\\xee\\x33\\x61\\x82\\xdc\\xb9\\xb2\\x5d\\x1b\\xe6\\xdb\\xf9\\xb5\\xc7\\x14\\x6d\\x77\\x55\\x85\\x83\\x4c\\xab\\xde\\x02\\x78\\xae\\xe5\\xd5\\x7c\\x85\\xe9\\x83\\xf8\\x4d\\x88\\x33\\xa9\\xe1\\x5b\\xcc\\x11\\x19\\x8e\\x1c\\x1d\\xa6\\xba\\x59\\x28\\x21\\x29\\xf1\\xdb\\x96\\x6f\\x54\\x60\\xc8\\xfb\\x65\\x30\\xfb\\xc3\\xa9\\x8a\\x31\\xfc\\x0f\\x4e\\x9b\\x33\\x73\\x66\\xee\\xc1\\xdc\\xe1\\x08\\xc8\\x26\\xd4\\x90\\x45\\xab\\xfa\\x12\\xee\\x88\\x79\\x7f\\x08\\xf0\\x68\\x3f\\xef\\x77\\xed\\xaa\\x35\\x43\\xb9\\x1c\\xb1\\x18\\xe4\\x24\\xd9\\xc4\\x08\\xda\\x54\\x74\\x31\\x12\\x51\\x07\\xd9\\xb0\\x74\\x4c\\x24\\x43\\xce\\x99\\x17\\xe1\\xe3\\x28\\xd8\\x18\\x50\\xba\\xbb\\xc9\\x4d\\x92\\x0a\\x1d\\x06\\xe5\\x24\\xdb\\xb6\\xc2\\x3d\\xd8\\x2e\\x17\\x87\\x82\\x2d\\x71\\xc4\\xcd\\xc4\\x09\\xae\\x85\\xba\\x4d\\xeb\\x58\\x1f\\x93\\x47\\x48\\xf7\\x5e\\x7a\\x76\\x9b\\x9d\\x68\\xc4\\x58\\x9e\\x59\\x4e\\x65\\xcb\\x6c\\x8f\\x49\\x03\\xff\\xba\\xbd\\x5a\\x32\\x6e\\x89\\x44\\x1a\\x54\\x2f\\x8a\\xc2\\x64\\xcc\\xc6\\x4e\\x95\\xa8\\x98\\x2a\\x71\\x0b\\x6c\\x56\\xff\\x7d\\x10\\x91\\x6a\\xfc\\x40\\x9e\\xa8\\xa4\\x1b\\x74\\x67\\x9d\\xd6\\xa7\\x66\\xf5\\x9c\\x52\\xb9\\x30\\x5b\\xa7\\x33\\xb1\\x3c\\x9e\\x81\\x1e\\xe1\\x30\\x83\\x92\\x5f\\x42\\x00\\x68\\x2b\\xd0\\x5d\\xea\\x33\\x95\\x32\\x52\\x29\\x70\\xaa\\x14\\x9d\\x00\\x4a\\x2e\\xa2\\x0f\\xf4\\x61\\xe9\\xec\\x0f\\x3b\\x62\\x56\\x5c\\x1a\\x10\\x62\\x59\\xc8\\x36\\x60\\x5c\\xc2\\x7c\\xad\\xc9\\x51\\x5c\\xb9\\x97\\x9e\\x89\\xaf\\x28\\x7c\\x02\\x7d\\x75\\xed\\xbf\\x87\\xd5\\xcf\\xf6\\x3a\\x7f\\xec\\x9b\\xd1\\x0e\\x78\\x77\\xab\\x9b\\xf8\\x68\\xd7\\x34\\xbd\\x3a\\x23\\x74\\xce\\xf7\\x02\\x5c\\xc4\\xda\\xb7\\x10\\xe2\\x54\\x80\\x66\\x85\\xa1\\x36\\xec\\xd0\\x3e\\x36\\x77\\x03\\x46\\x51\\x3a\\x15\\x14\\x5b\\x89\\x0e\\xee\\xf4\\x7b\\x80\\xea\\x08\\xe4\\x6c\\x81\\xd2\\x02\\xe5\\x33\\xe9\\xa0\\x6a\\x38\\xa6\\xf7\\x6e\\xf5\\x7a\\x9c\\x73\\x6e\\xc7\\x8d\\x00\\xb8\\x08\\xe3\\xff\\xd9\\xc7\\x9b\\x9d\\xc7\\xa2\\xe5\\x89\\x90\\x76\\x56\\xc9\\x32\\xab\\x8a\\x8b\\x57\\xda\\x1a\\x49\\x5b\\xa7\\x45\\x20\\x15\\xe7\\x92\\x4b\\x52\\x69\\xab\\x1f\\x67\\xbd\\xb4\\x3a\\x35\\x83\\x14\\x87\\xab\\x90\\x02\\xf5\\x2d\\x78\\xb1\\x34\\xcd\\x37\\x51\\x92\\x5a\\xaa\\xb0\\xb4\\x5c\\x8e\\x6b\\x0f\\x2b\\xf0\\xcc\\x9a\\x46\\x59\\x31\\x71\\x08\\xfb\\xa9\\x13\\x6a\\xab\\xb0\\x92\\x1a\\x58\\xfb\\xb9\\xb5\\x0e\\x51\\x24\\x3f\\x9b\\x53\\x18\\x47\\xdc\\x96\\x57\\xe9\\x6f\\xba\\xf7\\xaa\\x69\\x8f\\xe6\\xfe\\x44\\xf9\\x05\\x90\\x14\\x4c\\x70\\x33\\x72\\x50\\xc5\\x8b\\xc5\\xdd\"},\n{{0xde,0xa1,0x80,0xc9,0x1b,0x53,0x3a,0xaf,0x73,0x6b,0xc5,0xd3,0xc8,0xe4,0x74,0xd5,0xe5,0xd4,0x75,0xb7,0x5b,0x92,0xcd,0xe6,0xbd,0x1d,0x10,0xf3,0xb8,0xf5,0x5a,0xd4,},{0x30,0xb2,0x0f,0xb3,0x20,0xb0,0x0e,0x77,0xc4,0xe0,0xa8,0xeb,0x37,0x30,0xaf,0x3c,0x0b,0x1c,0x5f,0x5e,0xd9,0xee,0x2b,0x05,0x62,0x70,0x7e,0x4f,0x55,0xc4,0x93,0x8b,},{0xd0,0x83,0x33,0x3f,0xb8,0x4e,0x79,0xc9,0xb3,0x3e,0x55,0xe8,0x19,0x2d,0x57,0x1f,0xfc,0x8d,0xc5,0x07,0x45,0xb6,0xb5,0xfd,0xd8,0xc4,0x4d,0x92,0xa6,0x3f,0xd1,0x78,0xc4,0xe5,0x7c,0x2a,0xb3,0xa1,0x21,0x1c,0x0b,0xa2,0xd3,0x9d,0xa3,0x0b,0x06,0x62,0x9d,0x8d,0x1c,0xc1,0xd9,0xf2,0x59,0x32,0x63,0xd5,0x24,0xfa,0x5a,0x2e,0xbc,0x03,},\"\\x60\\x61\\x44\\xb7\\xd4\\xf9\\x6b\\xef\\x7f\\x11\\x2b\\x6d\\x41\\xbc\\xb5\\x00\\xd2\\x13\\x6c\\x13\\x4c\\xed\\xa2\\x20\\xe2\\x4d\\x0f\\x15\\x24\\xec\\xa1\\x2c\\x30\\xf2\\xb1\\x02\\xc7\\xf3\\x78\\xd6\\xbb\\xa2\\x59\\xc5\\xb4\\xa5\\xef\\x8e\\xc9\\x30\\x9d\\x5c\\x8d\\xa7\\xe8\\xd2\\xde\\xd3\\x79\\x2a\\xee\\xea\\x21\\x08\\xf7\\x7d\\x66\\xb2\\x30\\x45\\x93\\x8e\\xd6\\x47\\x51\\xf2\\x0d\\x48\\x32\\x6b\\xe2\\xfb\\x99\\x62\\x8c\\xfb\\x18\\x73\\xd7\\xdd\\x27\\x58\\x1c\\x10\\x5e\\xc1\\x32\\x49\\xa9\\x52\\xa5\\x07\\x84\\xb8\\xb3\\x4c\\xb3\\xb2\\xc1\\xa0\\x04\\xfa\\x8b\\x62\\x8a\\x07\\x67\\xfa\\x9a\\xbf\\x05\\x8d\\x95\\x5d\\xf8\\x5d\\x13\\x4a\\x0f\\xc7\\xf4\\xb7\\xd7\\xfb\\x0c\\x8d\\x31\\xbc\\xe3\\x45\\xdd\\x0a\\x42\\x82\\x14\\x5a\\xfb\\x2f\\xf1\\x97\\x51\\xf2\\xcc\\x3a\\x1c\\xae\\xa2\\x42\\xba\\xaf\\x53\\x87\\x49\\xbf\\x38\\x80\\x00\\xe3\\xdc\\x1d\\x73\\x93\\x59\\xdf\\xeb\\xae\\x64\\xae\\x1e\\x10\\xfb\\x6f\\xc1\\x7c\\xc9\\xfb\\x95\\x05\\x35\\xc2\\xde\\x12\\x95\\x87\\xa8\\x68\\x59\\xb7\\xbe\\x36\\xdf\\xe9\\xb6\\xc1\\x14\\x1b\\x25\\xe0\\x91\\x5c\\x8d\\x4a\\xa1\\xcc\\xea\\xe7\\x04\\x6b\\x3d\\x7c\\xfa\\x94\\x0b\\xc9\\x8d\\x4d\\x69\\xfc\\x5a\\x30\\xdd\\xe1\\xde\\xe4\\x2f\\xb5\\x27\\x22\\x81\\xbf\\x8f\\x8e\\x7f\\x3e\\x1a\\x04\\x39\\x7f\\xb4\\xf3\\xad\\xef\\xc5\\x75\\x32\\xdd\\xbd\\xe3\\x68\\x33\\xa6\\x76\\xe6\\xf3\\x9c\\x82\\xaf\\xf6\\xbf\\x48\\x32\\xec\\x97\\x1e\\x03\\xbe\\x38\\x29\\xc0\\x2a\\x20\\x3c\\x82\\xd9\\xeb\\x8c\\x16\\x30\\xee\\x96\\x93\\xf4\\x5d\\x26\\xf5\\xf5\\x1a\\x31\\x03\\xca\\x64\\xd4\\x68\\xec\\xea\\xc1\\xb2\\x9a\\xf4\\xc4\\x2e\\xb2\\x16\\xd7\\x6e\\xc8\\x99\\x48\\x36\\xb4\\xbe\\xc7\\x64\\x89\\xca\\x50\\x70\\x68\\x0c\\x2c\\x2e\\xb4\\x57\\x21\\x0a\\x77\\xc4\\x7f\\xdc\\xbf\\x60\\x01\\x72\\x07\\x3a\\x53\\xf1\\x45\\x3b\\xb5\\xc8\\x04\\x39\\xc8\\x82\\xf0\\x73\\x6d\\xe4\\x06\\x37\\xb4\\xf5\\xab\\x1f\\x76\\x1f\\xf3\\x55\\xc6\\xe9\\xbd\\x4a\\xbd\\xe7\\x56\\x0d\\x5f\\xc1\\x13\\xc8\\x30\\x15\\x9a\\x1b\\x77\\xc4\\xe8\\x7b\\xc2\\xc6\\x98\\x80\\xa4\\x0c\\x58\\x05\\xec\\xc8\\xaa\\xaf\\x57\\x57\\x5b\\xcc\\xd8\\x17\\x7f\\xc6\\xb8\\x35\\x69\\x23\\x3c\\x0f\\x5c\\xa2\\x23\\xac\\x40\\x13\\xca\\x10\\x6c\\xac\\x28\\x54\\x70\\x6a\\xea\\xd7\\x14\\xfa\\x29\\xf2\\x86\\x0a\\x5f\\x97\\x53\\x26\\x8a\\x36\\x71\\xd9\\xf5\\x9c\\xde\\x60\\x48\\xcf\\x0b\\x89\\x86\\x05\\x0f\\x7f\\x54\\x9e\\x4f\\xd7\\x55\\x7f\\x2f\\xc3\\xfc\\xdc\\xcd\\xdc\\xef\\xda\\x58\\x6a\\x64\\xb3\\x00\\x6e\\x58\\x25\\xf2\\x7c\\xa3\\x16\\x87\\xca\\xf6\\x63\\xbd\\x90\\xa0\\x5b\\x11\\x52\\xd7\\xc8\\x8d\\x7f\\x10\\x51\\xa9\\xd7\\x91\\x74\\x86\\x51\\xd8\\x88\\xa6\\xa1\\x2f\\x22\\xd6\\xc8\\xc3\\xf7\\x8c\\x2b\\x86\\xea\\xf5\\x39\\x4b\\x4e\\xf7\\xee\\xfb\\x89\\x79\\x7b\\x25\\xe5\\x42\\xdc\\x93\\x10\\x2d\\x02\\x1a\\x1d\\x0b\\xed\\x6a\\x7d\\xcd\\xd8\\x10\\x2b\\x8f\\x04\\x30\\xa0\\xbc\\x21\\xd9\\x04\\xa3\\xc9\\x34\\x6c\\x01\\x83\\x43\\xdd\\x99\\x37\\xcb\\x35\\x25\\x00\\x07\\xa2\\x84\\x82\\x5d\\xb0\\x8e\\x9a\\x11\\xfe\\xe3\\x1c\\xff\\x7a\\x31\\x4c\\x48\\xc4\\x2d\\x8b\\x31\\x4a\\xcc\\x27\\x82\\x2a\\xf0\\x3d\\x19\\x54\\xc7\\xcc\\x8b\\xf9\\xad\\x4e\\x9e\\x98\\xf4\\xad\\x4e\\xfb\\x35\\x52\\x88\\xda\\xa8\\xc9\\x0d\\xe9\\x03\\x7e\\x64\\xa7\\x86\\x1f\\x5e\\xe4\\x3a\\xda\\x9f\\x0f\\xcc\\xde\\x34\\xd0\\xbc\\xf5\\x02\\x88\\x55\\x0f\\x70\\x0f\\x21\\x5a\\x79\\x44\\xa5\\x38\\x0e\\x2a\\x8e\\x3f\\x04\\xf2\\xb4\\xf5\"},\n{{0x9d,0xaf,0x6d,0xbb,0x7f,0x76,0x29,0x66,0xe7,0xa5,0x7c,0x2e,0xc1,0x99,0x6e,0x9f,0x5b,0x55,0x5b,0x98,0x66,0xb8,0xe3,0x1d,0xea,0xab,0x43,0x56,0xeb,0x13,0x81,0x6e,},{0xf0,0x21,0xb5,0x5a,0x36,0xd9,0xfb,0xfb,0xf2,0x97,0x8b,0xc0,0xdf,0x73,0x6b,0x28,0x9c,0x82,0x41,0xd6,0x43,0x53,0x09,0x84,0x1a,0x13,0x4b,0x07,0xd4,0x7c,0xe4,0xed,},{0x49,0xb6,0xbc,0x46,0xb7,0xab,0xb5,0x69,0x4d,0xa9,0x42,0x15,0xef,0xc4,0xb3,0x0e,0xea,0x04,0xae,0x2e,0x73,0xeb,0x2d,0xa8,0xe8,0xc9,0xef,0x9b,0xe2,0x22,0x24,0x98,0xb1,0x7e,0x13,0x93,0x96,0x46,0xc2,0x9e,0x32,0xd6,0x45,0x58,0x46,0x40,0x64,0x15,0x90,0xb1,0xbb,0xdb,0xfe,0x24,0xf3,0x6c,0x6f,0x69,0x4b,0xf8,0x72,0x38,0xee,0x04,},\"\\x54\\x45\\x23\\x90\\x0d\\xaa\\x67\\x78\\xc0\\x39\\x1a\\xe4\\x04\\x4a\\x51\\xc0\\xc4\\xa5\\xe4\\x44\\x13\\x3f\\xbd\\x77\\x47\\xd5\\x39\\xa7\\x44\\xfa\\x60\\xab\\x5d\\xc5\\x4e\\x18\\x19\\xdc\\x8e\\x56\\x89\\x9c\\x56\\xef\\xd7\\xef\\x3d\\xa3\\x41\\x79\\x0e\\xcc\\x49\\x64\\x5e\\xf3\\x25\\xc6\\x56\\x8a\\xe9\\x71\\xd3\\x0d\\x21\\xbb\\x7f\\x23\\x46\\x4f\\x46\\xa2\\x4b\\x80\\xd4\\x9b\\xb9\\x3c\\x6e\\x91\\xde\\x79\\xb2\\x43\\x31\\xd0\\x70\\x7f\\x43\\xd0\\x66\\x5d\\x01\\x97\\x74\\x3a\\xdf\\xf6\\x90\\xd6\\x15\\xa1\\xc9\\x25\\x87\\x77\\xfc\\x47\\xd0\\x21\\x71\\x42\\x42\\x6a\\x47\\x34\\x89\\x2e\\xb6\\x22\\xab\\x8e\\x50\\xbb\\x12\\x8e\\xc3\\xa8\\x95\\x26\\x6a\\x38\\x61\\xa3\\x97\\x68\\xbc\\x76\\x09\\x6f\\x58\\x1f\\xd0\\x82\\xdf\\x9b\\x72\\x23\\xe8\\x5a\\x8a\\xfb\\xdb\\x5c\\xaa\\x49\\x22\\xaf\\x2a\\x01\\x4b\\xf8\\xa5\\xcd\\x11\\xe5\\xc5\\xea\\x93\\xe9\\x1c\\xd4\\x6d\\x5a\\x1b\\x99\\xb8\\x5a\\x26\\x70\\xe3\\x21\\xde\\x2e\\x32\\x25\\x5a\\xfd\\x67\\xfe\\x2c\\x37\\xfd\\x93\\x2c\\xac\\xa2\\x2d\\x24\\x1f\\xaf\\x4c\\xce\\xfe\\xff\\x58\\xd6\\xbd\\x04\\xcf\\xaf\\x11\\xde\\xdd\\x29\\xc8\\x71\\x9f\\xfc\\xb0\\x2e\\xf6\\x5c\\x5d\\x3e\\xb7\\x8b\\x4f\\xc0\\xd1\\x70\\xa2\\xe3\\x43\\x2c\\xc8\\x12\\xf0\\xd0\\x41\\xd9\\x76\\x0c\\x13\\xc1\\x2f\\x7c\\x7f\\x2f\\x84\\xfe\\x5e\\x0f\\x70\\x0c\\x10\\xb1\\xa6\\x9c\\xa4\\x66\\xa7\\x0b\\xde\\xff\\x8d\\xbe\\xc7\\xd3\\x18\\xfb\\x09\\xdd\\xd8\\x27\\xef\\x61\\xca\\xa6\\x91\\x0b\\xbc\\x06\\x1c\\xbd\\xa2\\xb5\\x27\\xef\\x2e\\x59\\xed\\x4c\\x17\\x22\\x99\\x72\\xf8\\x95\\x67\\xd7\\x05\\xde\\x92\\x31\\x92\\x4b\\x41\\xbb\\x6e\\x7c\\x01\\xfe\\x85\\x42\\x64\\x47\\x4f\\xa7\\x6b\\x1f\\x88\\xcd\\x57\\xea\\xc3\\x11\\x17\\x1a\\xf1\\x03\\xd2\\x30\\x78\\x42\\x4a\\x12\\x67\\x5f\\x2f\\xa3\\x6c\\x2d\\xe0\\xbf\\x53\\xc2\\x95\\xfe\\xeb\\x31\\x57\\xde\\x95\\x89\\x22\\x98\\x6e\\x32\\x51\\x3d\\xfa\\x33\\xb3\\x5e\\x15\\xc3\\x94\\xa1\\x1c\\x0f\\xcc\\x55\\xb8\\x2d\\x6d\\xd0\\x59\\x7c\\xdd\\xd2\\x7e\\xde\\x7d\\xe1\\x29\\x85\\xa6\\x16\\xe6\\x40\\x26\\xbe\\xfb\\x5d\\x69\\x04\\x82\\xb3\\xff\\x22\\xc0\\xdd\\x21\\xf2\\x7a\\x08\\x6d\\x37\\xa0\\x49\\x9e\\xa3\\x6f\\xe2\\xc4\\xb5\\xa9\\x59\\xd1\\x0e\\x9a\\x61\\x0c\\xab\\x1f\\xe0\\xd2\\x8c\\xf1\\x01\\x3d\\xca\\xe6\\x3d\\x8f\\xde\\xe0\\xec\\xbd\\x8b\\x4e\\x19\\xd5\\xd0\\x40\\xe2\\xfa\\xd7\\xd0\\x41\\x3a\\x38\\xe8\\xc4\\xe7\\x35\\x52\\xad\\x46\\x04\\x7b\\x5b\\xbd\\xd1\\x5c\\x09\\xcc\\x0d\\x34\\xe4\\x8b\\x91\\xfd\\xba\\xe2\\xa9\\xd1\\x62\\xd4\\xb2\\x1e\\xe2\\x0a\\x1e\\xf5\\x35\\xea\\x88\\x35\\x95\\xbc\\x49\\x51\\x69\\x2a\\x67\\x16\\x34\\x54\\xc7\\x36\\x7f\\x13\\x4b\\xf6\\x45\\xd4\\x8f\\x99\\x69\\xe3\\xd4\\xf0\\xf9\\xea\\xf4\\x14\\x4c\\xe9\\x80\\xa0\\xa2\\xe3\\x34\\x2c\\x74\\x6c\\x2b\\xdc\\x3c\\xcd\\xc2\\xf8\\xa7\\xda\\x57\\xa0\\xe8\\x02\\x87\\x82\\xd3\\x0a\\xf5\\x85\\x7d\\x9e\\xfb\\x37\\x66\\x6d\\xf6\\x5d\\x7c\\xc3\\x84\\x71\\x66\\x61\\xe6\\x1f\\xf5\\xc0\\x97\\x52\\x59\\x5e\\x94\\x11\\x2c\\xa1\\xa8\\x40\\xd6\\xe4\\xf6\\xec\\x0e\\x55\\x49\\x4c\\x5b\\x44\\xf7\\xc0\\xf0\\xd4\\xa9\\x9c\\xd7\\x09\\x05\\xbf\\x84\\x85\\x56\\x17\\x48\\xf4\\xdc\\x0f\\xd7\\xa4\\x4a\\x1b\\x13\\x91\\x13\\xc3\\x8a\\x1e\\x8e\\xb5\\xc7\\xa2\\x0f\\x3e\\x95\\x2e\\xae\\xa8\\xce\\x38\\xb2\\x07\\xc2\\x8e\\xd9\\x72\\x71\\x8f\\x03\\x1f\\x47\\x7c\\x62\\x07\\xce\\x43\\x3c\\x51\\x5f\\x5a\\xc2\\x84\\x0f\\x49\\x74\\xf1\\xf1\\x69\\x89\\x62\\x6c\\x76\\xbc\\x98\"},\n{{0x71,0x86,0xf8,0xd1,0x68,0xd9,0xdd,0xf1,0x7e,0xdb,0xaf,0x0e,0x7b,0x1a,0xbc,0xb2,0x6d,0xa3,0xe4,0xc0,0x27,0x2d,0x98,0x79,0xc7,0xfd,0xff,0x64,0x21,0xc4,0xea,0x50,},{0x96,0xb4,0xa6,0x56,0x23,0x20,0x29,0xfc,0x1b,0x83,0x64,0x70,0x3c,0xbe,0xa7,0xa5,0xd7,0x38,0x75,0x18,0xa8,0x8c,0xed,0x1a,0x91,0x5e,0xc8,0xd8,0x86,0x84,0x81,0x32,},{0xa9,0xc0,0x49,0x9f,0xc2,0x16,0xa1,0x45,0x32,0xd7,0x36,0x36,0x5c,0x63,0x55,0xf9,0x38,0xf8,0xd8,0x19,0x4f,0xa1,0x13,0x28,0x48,0xf8,0x3e,0x49,0x04,0x54,0xd4,0xbb,0xf6,0x92,0x69,0xf1,0x22,0x59,0xfc,0x6c,0x07,0x4c,0x10,0x15,0xe4,0x25,0xe4,0xf4,0xf2,0x7c,0x02,0x9c,0x93,0x33,0x49,0x51,0x36,0x1a,0x35,0xad,0x11,0x76,0x54,0x0e,},\"\\xa3\\xe6\\xcb\\x6b\\x84\\xcc\\x5c\\xf1\\xfb\\x1a\\x84\\x8b\\x4b\\x8e\\xa7\\xcb\\x7c\\x87\\xe0\\x44\\x57\\x50\\xc6\\x1f\\x9a\\xa5\\xd7\\x7d\\xed\\xdf\\x94\\x94\\x63\\xec\\xd3\\x9b\\xfc\\x71\\xf2\\x61\\x0c\\x2a\\x94\\x24\\x84\\x7f\\xb7\\x6f\\x84\\xc5\\xda\\x1f\\xa1\\x0e\\xf7\\x18\\xa3\\x45\\x66\\xce\\xc1\\xb3\\xe8\\x99\\xe7\\x25\\x2e\\x8d\\x4d\\x34\\x60\\x16\\x49\\x8f\\xf1\\x19\\x97\\x27\\x50\\x06\\x16\\x60\\xba\\xed\\x31\\x28\\x27\\x58\\x31\\x81\\x07\\x3d\\x1d\\xc7\\x4b\\x76\\xc4\\x30\\xca\\x30\\xd4\\x09\\xe4\\xe8\\x43\\x9c\\x0f\\xc4\\x8c\\x00\\x68\\x06\\x29\\xd4\\x3a\\xe2\\xa7\\x7d\\x69\\x22\\x8f\\x7f\\x8a\\x12\\x53\\xaf\\x15\\xbd\\x2c\\xb6\\xbb\\x1c\\x16\\x96\\x55\\x0c\\x4c\\x79\\x0f\\x44\\x98\\x69\\x63\\x0a\\xb9\\x2b\\x9c\\x11\\xcd\\xe1\\xf9\\x61\\xaa\\x21\\x03\\xec\\x23\\xf7\\xd9\\xf0\\xfe\\x9c\\x3c\\x41\\x32\\x58\\x2e\\xfa\\x79\\xa6\\x6a\\xe3\\x42\\x6e\\x51\\x05\\xb8\\x0b\\xfe\\x5e\\x04\\xdc\\x8b\\xb1\\xe3\\x8a\\x31\\x10\\xcd\\x72\\x98\\x4b\\x3e\\xf0\\x2a\\x0c\\xa6\\x2a\\xb6\\x38\\xcb\\xcf\\xbc\\x8a\\x6b\\x59\\x3d\\x26\\x13\\xdc\\x06\\xec\\x86\\xfe\\xe3\\x4f\\x65\\x18\\xd4\\xa3\\xfb\\xdc\\x15\\x72\\x37\\x17\\x45\\x64\\xda\\xeb\\x66\\x74\\xcd\\xc3\\x4f\\x4d\\x65\\x37\\xcf\\x81\\xd8\\xaa\\x9b\\xdd\\xbf\\x3a\\xed\\xa3\\x12\\xda\\xae\\xee\\x33\\x6f\\x9e\\xd8\\xbf\\xf8\\x1e\\x29\\x4b\\xc7\\xd4\\x4d\\x25\\xcd\\x78\\x70\\x72\\xe6\\xcb\\x41\\x4b\\x65\\xfb\\x7a\\x84\\x6f\\xc0\\x65\\x36\\x7b\\xa8\\xe3\\x7b\\xef\\xfd\\xf0\\xb7\\xba\\x8f\\x98\\xcd\\xf1\\xeb\\x87\\x0f\\x4e\\x8b\\x71\\x30\\xfa\\x34\\x29\\xd2\\xe2\\x4b\\xce\\x59\\x94\\xda\\xf1\\xaa\\x65\\xe5\\xf6\\x03\\xb6\\x31\\x05\\x3d\\xc5\\x10\\xb2\\xf0\\x97\\xe8\\x6e\\x9b\\x9b\\x55\\x23\\x02\\x75\\x79\\x68\\xd0\\x13\\x6e\\xe6\\x75\\x4c\\x42\\xa3\\x2c\\x99\\x0a\\xdd\\x9c\\xb5\\x29\\xbc\\x89\\x75\\x1d\\xfa\\x4e\\x5e\\x3a\\x0b\\xad\\xaf\\x4c\\xc4\\x0b\\x6a\\x09\\x50\\x7f\\x9f\\xcd\\x24\\xc3\\xca\\x72\\x25\\x95\\x99\\xc6\\xee\\x58\\xd8\\x57\\xb3\\xa1\\x89\\xe0\\x48\\x90\\x2e\\x88\\x5a\\x36\\x07\\x42\\x60\\x93\\xcb\\x0f\\xab\\x43\\x7c\\x0f\\xb0\\xed\\x2f\\x1e\\x96\\xe9\\x44\\x1a\\x7e\\x95\\x4f\\xe3\\xef\\x76\\x46\\xe2\\x6a\\x39\\xa0\\x70\\x33\\xd0\\xa1\\x55\\x5d\\xfe\\xed\\x9a\\x6f\\x57\\x79\\x4a\\xf3\\xa2\\xab\\xf0\\x05\\x7e\\x9f\\x85\\x3a\\xe5\\xc3\\x01\\x38\\xfd\\x80\\xe2\\xf2\\x9c\\x2f\\x4a\\x93\\xad\\x31\\x45\\xda\\x10\\xa3\\xe3\\x1c\\xe9\\xff\\x97\\x86\\xac\\x65\\xd8\\x60\\x37\\xd9\\x8b\\x7a\\xa6\\xd1\\x1d\\xe8\\x80\\x00\\x10\\xe1\\x33\\x86\\x9e\\xb6\\x7a\\x50\\x39\\xb9\\xb8\\xfe\\xb6\\xef\\x90\\x3d\\x0c\\xc7\\x46\\x41\\x26\\x07\\xda\\x72\\x5c\\xe2\\xdc\\x6a\\x35\\x21\\x09\\xdb\\xc6\\xa5\\xe4\\x0b\\x17\\x0c\\x23\\x05\\x0b\\xc4\\xfb\\x1e\\xfa\\x0c\\x34\\xfe\\xc0\\x0e\\xae\\x32\\x19\\xc2\\x90\\x40\\xe8\\xf5\\x97\\x8c\\x93\\x84\\xee\\x91\\x5d\\x8c\\x93\\x98\\xdd\\x12\\x0d\\x5c\\x3c\\xba\\x38\\xf8\\x52\\x6b\\x06\\x19\\x7c\\xb2\\xc2\\x61\\xde\\xc7\\xd7\\x26\\xae\\x13\\x0f\\x9b\\xee\\x17\\x26\\x17\\x00\\xe9\\x99\\x31\\xfa\\xc4\\xb4\\xdc\\xa0\\xf7\\x58\\x70\\x1a\\xcb\\xf3\\x70\\x7d\\x47\\xdf\\x53\\x21\\x13\\x0e\\xc1\\x0b\\xb3\\xb1\\x30\\x78\\xc4\\xdc\\x5d\\xe3\\x47\\x0f\\x15\\x8b\\x57\\xdb\\xeb\\x87\\x8b\\x3a\\x85\\x24\\xe0\\xed\\x2c\\x95\\x47\\x54\\x5f\\x0f\\xdd\\xf1\\x31\\x25\\xe4\\x5b\\xb2\\x3d\\x6a\\x7b\\x38\\x3a\\x18\\x7f\\x4c\\x5d\\x54\\xa7\\xb4\\xc8\\x3d\\x59\\x57\\xf2\\xcd\\x7e\\x6f\\xbc\"},\n{{0xe8,0x6e,0x8c,0x62,0x56,0x6e,0x15,0x75,0x3b,0xd5,0x57,0x7e,0xaa,0xe7,0xf2,0x41,0x05,0xb7,0x40,0x55,0xa2,0x56,0x29,0x58,0x07,0x08,0xbf,0xc8,0x3a,0xeb,0xf0,0x6c,},{0x8c,0x8c,0xe8,0x82,0xd5,0xf7,0x65,0x86,0xd8,0xdd,0xcc,0xc5,0x57,0x9b,0xcc,0x1c,0xdf,0x4c,0xfd,0x71,0x62,0x30,0x4c,0xb1,0x0e,0x76,0x96,0x02,0x6e,0x70,0x7f,0x17,},{0x54,0xd2,0xfd,0x44,0xac,0xf9,0xe2,0x09,0xbc,0x7e,0x43,0x33,0x72,0xbd,0x73,0x07,0x4d,0x07,0x80,0x6a,0x77,0xc6,0xce,0x22,0x8e,0x9b,0xe9,0x94,0x41,0x8b,0x00,0xc7,0xec,0xbc,0xb7,0xac,0x00,0x6c,0x29,0x4a,0xec,0x9d,0xe6,0x68,0x57,0x2a,0xdd,0x51,0x7c,0x06,0xb4,0xeb,0x4f,0xe2,0xff,0x35,0x23,0xbf,0x04,0x3d,0xf4,0x4d,0x3d,0x0d,},\"\\x12\\xfa\\x63\\x1b\\x0e\\x48\\x2e\\x9b\\x9d\\x63\\x3e\\x94\\xb8\\x2d\\x8a\\xb4\\x36\\xfe\\x54\\x8e\\x5b\\x95\\xda\\x92\\x62\\x46\\x23\\xd1\\x3f\\x2c\\x70\\xda\\x77\\x5b\\xa1\\x36\\xc5\\x22\\x9c\\x16\\xa0\\xc7\\xa6\\xfa\\x91\\x4b\\x2f\\xed\\xa5\\x64\\xe1\\x72\\x19\\xe4\\x73\\x70\\xf9\\x51\\x5b\\xb1\\xd5\\x9d\\xe6\\xe9\\x58\\x62\\x04\\xd9\\x43\\xdc\\x56\\x0d\\x73\\xe2\\xe7\\x57\\xf7\\xeb\\x39\\xbb\\xc7\\x11\\x1b\\xb4\\x6b\\xc6\\x43\\xc1\\x3f\\x60\\x21\\x12\\x73\\x9b\\xec\\x77\\x8d\\x7d\\x4f\\x49\\xd0\\x92\\x56\\x3d\\x68\\xf5\\x77\\x6e\\x43\\x0e\\x3b\\x0b\\xf2\\xdc\\x1b\\x01\\xbe\\xb3\\x04\\x01\\x96\\xda\\x63\\x02\\x90\\x8b\\xfe\\x91\\xe0\\xfc\\x38\\xe0\\x4c\\x15\\x0e\\xf9\\x07\\xdc\\x73\\x6c\\x44\\x5f\\xf2\\x1f\\xdb\\xd2\\xdc\\x1e\\xac\\x0a\\x0f\\x5d\\x00\\xa3\\x0a\\xf0\\x28\\xaf\\xe2\\xff\\x61\\x16\\x2b\\x75\\x8c\\x7d\\xa9\\xa7\\x76\\x66\\x6a\\x11\\x23\\x59\\x43\\x1c\\x48\\x85\\x6a\\x87\\xca\\x82\\xd3\\xdd\\x1c\\x8a\\xf3\\x76\\x59\\x86\\x35\\x43\\x2b\\xf8\\x91\\xbe\\xcb\\xc3\\x3a\\x8f\\xda\\x44\\xce\\x88\\x3e\\xa8\\xaf\\x4a\\xd8\\xb9\\x1a\\x92\\x61\\xce\\x76\\xb9\\xe9\\x39\\xc4\\x61\\xfa\\xc5\\x3a\\xe0\\xf0\\x76\\xe8\\x2d\\x87\\x9a\\xac\\xe8\\xf3\\x8f\\x12\\x0b\\xc9\\xb0\\x4d\\x81\\x25\\xed\\x24\\xbc\\xd7\\x79\\xd9\\xd2\\x43\\x86\\xb1\\xdd\\x20\\x17\\xeb\\xee\\x81\\x97\\x37\\x6e\\x8c\\x36\\xfa\\x3a\\xef\\x8c\\x1e\\x71\\x3e\\x2b\\x8b\\xce\\x49\\x66\\xd8\\x48\\x88\\x68\\x1b\\xa7\\x84\\x95\\xfb\\xd1\\xd6\\xcc\\xa5\\x86\\x26\\xe6\\x85\\x4c\\xda\\x60\\x6b\\x83\\xd6\\x29\\x3d\\x01\\xe8\\xe3\\xe1\\x3b\\xbf\\x4a\\xac\\x85\\x1d\\x9a\\x1e\\x00\\xd0\\x02\\x4e\\x26\\x99\\x3b\\x0b\\x30\\x91\\xbe\\x7e\\x80\\x61\\xbc\\xbb\\x3c\\xbb\\x23\\x02\\xce\\xab\\x96\\x89\\x7a\\x8e\\x1f\\xf3\\x67\\xec\\x86\\x25\\x69\\x3c\\xf3\\x15\\x34\\x12\\x4a\\x9d\\x5d\\x72\\x5b\\xca\\xe0\\x01\\xd6\\x7b\\xc2\\x11\\x1d\\x0a\\xb8\\x11\\x1f\\xa1\\xd2\\x4e\\x4e\\xd0\\x6d\\x63\\x58\\x3c\\xe6\\x90\\xf2\\xa0\\x46\\x26\\xd7\\x91\\xd2\\x9e\\x3e\\x31\\x5a\\x41\\x5b\\xf2\\xe8\\x53\\xa5\\xf2\\x97\\x4c\\x83\\x3a\\x3f\\xe2\\xe2\\x90\\x9c\\xf6\\x69\\xc7\\x3c\\x1f\\x59\\x39\\x2d\\x30\\xc3\\x7f\\x3b\\x9c\\x5a\\x3d\\xdc\\xfd\\x75\\x62\\x1f\\xda\\x36\\xe4\\xba\\x2f\\x16\\x14\\x78\\x58\\xf6\\xf2\\x06\\xb9\\xa1\\x40\\xf1\\xdd\\xc1\\x46\\x6c\\x9a\\x53\\xed\\x73\\xf8\\x24\\x90\\xbc\\x95\\x32\\x2c\\x95\\x5f\\x61\\xd1\\x1c\\xb5\\x1d\\x5e\\x8a\\x58\\xc6\\xb3\\xcb\\x0f\\xdf\\x04\\x19\\x76\\x32\\x01\\xbe\\xea\\x93\\xa8\\x51\\x2b\\x14\\x05\\x24\\x5b\\xfc\\x38\\x41\\x55\\xad\\xc5\\xce\\x77\\x8a\\xa7\\x4d\\x00\\xa3\\x22\\x72\\x64\\x65\\x11\\x9a\\xf7\\x95\\x01\\xf0\\x40\\xdd\\x0a\\x7a\\x84\\x06\\x00\\x01\\xca\\x89\\xd2\\xfe\\x5e\\x9c\\xf9\\x77\\x9a\\x54\\x7e\\x3e\\xbd\\x3b\\xf8\\x64\\x29\\x90\\xa3\\x69\\x0e\\x2b\\x2c\\x3e\\x54\\xcb\\x7e\\xee\\xea\\xbc\\x24\\x2b\\x4d\\xd9\\x92\\x74\\xc4\\x25\\xa8\\x67\\x93\\x1c\\x92\\x9c\\xa7\\x08\\x08\\x60\\x1c\\x39\\x08\\xcf\\xd7\\x88\\x86\\x7d\\x68\\x7d\\xc3\\x66\\xe9\\x76\\x35\\x0c\\x9e\\x70\\x58\\x4b\\xd3\\x90\\xd6\\x7e\\xeb\\x7c\\xfe\\xa2\\x6c\\x42\\x68\\x6d\\x3d\\x96\\x20\\xf6\\x2f\\x64\\x10\\x4e\\xf4\\x1e\\xd1\\xd1\\x30\\xd7\\x9e\\x32\\x59\\x38\\x48\\x62\\x96\\xb7\\xab\\x2d\\x2a\\xdb\\x78\\x52\\x67\\x43\\xe4\\x00\\xac\\xb2\\xb7\\xaf\\x09\\x62\\x8d\\x68\\xcf\\x94\\x75\\x10\\x16\\x25\\xc2\\x0e\\x1d\\xc0\\x51\\xd7\\x3c\\x99\\x7c\\x95\\x2e\\x12\\x81\\x2c\\x80\\x5b\\x68\\xff\"},\n{{0xa5,0xca,0xb2,0x72,0x7e,0x2f,0x13,0x1a,0x4d,0x63,0xfa,0xce,0xe7,0x99,0x33,0x66,0x63,0x93,0x0a,0xa0,0x7a,0xfd,0xa6,0xbd,0x5a,0x8e,0x98,0x5a,0x02,0xde,0xb1,0xea,},{0xac,0x35,0x5f,0x95,0x26,0x0f,0xbf,0xea,0x77,0x8c,0x55,0xb5,0xaf,0x8b,0x3f,0xd1,0xf2,0x4d,0x26,0x93,0xda,0x35,0xde,0x4e,0xe5,0x08,0xa2,0x7e,0xd3,0x50,0x39,0x1f,},{0x13,0x8c,0x7a,0x8e,0xca,0x5b,0x5c,0x37,0x15,0x88,0x13,0x84,0x3c,0x9a,0x90,0x4e,0x5f,0x53,0x0a,0xd9,0x71,0xee,0x43,0x2a,0x44,0xf3,0x44,0xf8,0xc6,0x4b,0xbf,0xaf,0x10,0x2f,0xf4,0x1d,0xaa,0x5c,0xf7,0x22,0xa4,0xbc,0x66,0x40,0x58,0x87,0x59,0xb8,0xf3,0x6f,0x9c,0x05,0x9e,0xab,0x93,0x6c,0xc4,0x5e,0xd4,0x79,0x63,0x94,0xa0,0x02,},\"\\x48\\x34\\x39\\x15\\x4d\\xd5\\xe5\\xd1\\x09\\x85\\x7c\\x24\\xd1\\xc4\\xe7\\xfb\\xbe\\xfd\\x2f\\x38\\x65\\x1d\\xa8\\x12\\x89\\xf2\\xad\\x3d\\x61\\x54\\x30\\x65\\x38\\xb8\\x2a\\xc7\\xdb\\xa9\\x21\\x0e\\x74\\x07\\x76\\xed\\xe4\\xcc\\xf5\\x1d\\x4f\\x63\\x09\\x4b\\x03\\xe4\\x6a\\xd3\\xaa\\x3c\\x31\\x94\\x7d\\x8c\\x36\\xce\\x6f\\x94\\xe8\\x52\\x96\\xbd\\xed\\xcc\\x1e\\xad\\x62\\xea\\xa1\\x44\\x1e\\xcd\\xe0\\xa2\\x25\\xd0\\xbf\\x02\\xed\\xca\\xcf\\x86\\x50\\x14\\x89\\x9a\\xf6\\x6d\\x98\\x08\\x04\\x0c\\x2d\\x02\\x00\\x0a\\x0f\\x5c\\xe4\\xf1\\x68\\x3c\\x1a\\x49\\x52\\x76\\xd9\\xc4\\xd7\\x28\\xc9\\xec\\xd6\\xf0\\x78\\xdb\\x8a\\x0c\\xfc\\x26\\x71\\x87\\x23\\x85\\x62\\xab\\x1a\\x1e\\xa2\\x81\\x3f\\xb4\\xf1\\x2e\\x87\\x8e\\x1b\\xa1\\x43\\xf4\\xd0\\x6a\\x3b\\xc8\\x10\\x0c\\x35\\x50\\x11\\x8d\\x69\\xda\\xe6\\x7b\\x55\\xed\\x69\\x2a\\xcf\\x94\\x44\\xda\\xa5\\xc3\\xe3\\xc0\\xa9\\x8e\\xe2\\x8c\\xf1\\x72\\xde\\x0c\\x58\\x4c\\x9f\\x2e\\xc9\\xbb\\x6e\\x9b\\x57\\xf5\\x72\\xa8\\x6f\\xf8\\x72\\x9f\\x65\\xf4\\xc6\\x5b\\x7f\\xea\\xcc\\xaa\\x21\\x72\\x0e\\xd7\\x9e\\x90\\x61\\x8b\\xca\\xfb\\xfd\\x95\\x33\\xda\\x85\\x23\\x2b\\x45\\x08\\x83\\xaa\\x91\\x9f\\x82\\x7f\\x04\\xc4\\xa9\\x7b\\xf5\\x13\\x90\\xd4\\xf8\\x56\\x9c\\x19\\x17\\x26\\xf4\\x4f\\x7e\\x39\\xfb\\x3d\\xb7\\x3b\\xfc\\x41\\x5b\\x6f\\xfc\\xa8\\xb9\\x1a\\xca\\xad\\x69\\x23\\x85\\x72\\xf1\\x4b\\x49\\x98\\x5e\\xa0\\x3c\\x98\\xd7\\xb1\\xd4\\x4b\\x3a\\x65\\x54\\x76\\x5b\\x19\\xab\\xf9\\xb2\\x52\\x74\\xe9\\x7e\\x46\\x34\\xe4\\xb0\\xf9\\xe8\\x02\\xeb\\x6f\\x74\\x3f\\xff\\x95\\x07\\x57\\xee\\x01\\x3a\\x69\\x88\\x22\\x18\\x81\\xa7\\x44\\x3f\\x1f\\x32\\xbc\\xcb\\x00\\x7e\\x99\\x37\\x9c\\x7c\\xa4\\xf9\\x06\\xd5\\xfe\\x11\\xcb\\x12\\xf6\\x6b\\x53\\xa3\\xd2\\x1a\\xc9\\x47\\xbe\\x0c\\x81\\x50\\xbc\\xd0\\x4f\\x1c\\x81\\x6b\\x3f\\x0c\\x07\\xc5\\xfb\\xc0\\x90\\x5a\\x71\\x36\\x95\\x68\\x49\\xda\\x03\\x83\\x6d\\xae\\xc2\\x5c\\x3e\\x1a\\x06\\xec\\x3a\\xeb\\x20\\x56\\x48\\x17\\x6f\\x89\\xf4\\xa2\\x91\\xfa\\xc4\\xf1\\xd3\\x89\\x9f\\x56\\xc9\\x06\\x5e\\xeb\\xb8\\x76\\x8b\\x84\\xb3\\x1b\\x7c\\xc0\\x31\\x08\\xbd\\x08\\x88\\x33\\x8d\\x17\\x74\\x99\\x49\\x70\\x29\\x2d\\x93\\x50\\x31\\xfe\\xa3\\x35\\xd9\\xe7\\x90\\x8f\\xe0\\x25\\x48\\x89\\xc0\\xb1\\x71\\xcf\\xe0\\xaf\\x2e\\x6f\\xde\\x7a\\x5e\\xa3\\xde\\x1f\\xdc\\xda\\xe5\\x37\\xb6\\x31\\x31\\x19\\xc2\\x7f\\x77\\x20\\x24\\xef\\x36\\xe4\\x5c\\x8b\\x89\\xf2\\x6c\\x93\\xd9\\xee\\xa1\\x37\\x25\\xe1\\x2d\\x81\\x0c\\xf9\\x82\\x4a\\xea\\x04\\xcb\\x80\\x2d\\xa7\\xe4\\x58\\xe8\\x42\\xca\\x37\\x5e\\x36\\x71\\x34\\x6e\\x00\\x89\\xde\\xc5\\x71\\xbe\\x16\\x9b\\x0d\\x90\\x96\\x6b\\xf3\\x68\\xfe\\x36\\x98\\xfd\\x3e\\x72\\xbf\\x16\\x24\\x9d\\xd9\\x00\\xaf\\x6d\\x29\\xff\\xa4\\x83\\x51\\x36\\x0f\\x12\\x24\\x17\\x14\\x58\\x5f\\x7a\\x9b\\x4c\\x7b\\xaf\\xc9\\x52\\x22\\x67\\x35\\xde\\x14\\x62\\x74\\x3d\\x78\\xab\\xad\\x0f\\x67\\x11\\xf2\\x49\\x5f\\x33\\x13\\xad\\x4e\\x0b\\xa2\\x16\\xb0\\xde\\xa5\\xdc\\x15\\x16\\xa9\\x54\\x9f\\x7d\\xfc\\xfe\\xb9\\x3e\\x59\\x1a\\xbe\\xda\\x5e\\xa3\\xc7\\x04\\x59\\x06\\x52\\x3b\\x40\\x86\\x8c\\xa5\\x73\\x5d\\x6a\\x33\\x71\\xc3\\xc2\\x94\\xc1\\x11\\x26\\xd0\\x97\\xf4\\xc7\\x08\\xe9\\x04\\x64\\xc1\\xad\\x91\\x42\\xfa\\x0b\\xed\\xf0\\x7d\\xfc\\x5f\\x4c\\xb6\\x7d\\x6e\\xd8\\x0f\\x1b\\xfe\\x72\\x68\\x3c\\xfb\\x2a\\xd6\\x65\\x30\\xdc\\x43\\xd7\\x02\\x3f\\x37\\x90\\xff\\x42\\xd9\\x5b\\xd8\"},\n{{0xcb,0x63,0x19,0x61,0x37,0x79,0xa4,0xef,0x66,0xbe,0x14,0x14,0x4b,0x28,0x40,0xad,0x01,0x67,0xc0,0x3f,0x3b,0x8d,0x04,0xff,0x59,0x2c,0xd1,0xd2,0xd7,0x22,0xe3,0x30,},{0x18,0xeb,0x03,0xf0,0xa3,0x34,0xb0,0x80,0xe1,0xaf,0x43,0x99,0xd8,0x37,0x6d,0x83,0xc5,0x33,0x31,0x6d,0xc6,0x87,0xcf,0x34,0x1f,0x0a,0xfa,0xb4,0x50,0x96,0x52,0x99,},{0xc1,0xb3,0x99,0xcd,0xc1,0x98,0xe9,0xa1,0x59,0xe6,0x84,0xfc,0x26,0x68,0x6d,0xe6,0x60,0xda,0x54,0xcf,0xe3,0x12,0xca,0x73,0x45,0xdf,0x0c,0x7d,0x15,0xa3,0x57,0x43,0x01,0x44,0x10,0xbd,0x2f,0x6c,0xd1,0x1e,0xef,0x33,0xa8,0x9b,0x3d,0x15,0xcb,0xc1,0x7c,0x7a,0x35,0x89,0x37,0xfd,0x99,0x72,0x05,0x05,0x1f,0x92,0x57,0xc2,0x56,0x09,},\"\\x87\\x4a\\x6c\\x81\\xd6\\xdb\\x71\\x33\\xa7\\x91\\x69\\x76\\x0c\\x84\\xd3\\x6e\\xea\\x3d\\x42\\xea\\x08\\x92\\xb7\\xc8\\xdd\\xe8\\x44\\xa3\\xa6\\xb6\\x0a\\xa9\\xf2\\x66\\x07\\x26\\xc9\\xc4\\xdd\\x26\\xa0\\x1f\\x4e\\xd0\\xdc\\x1c\\x53\\xba\\x60\\x05\\x46\\x3f\\x7e\\xa6\\x4a\\x1e\\xc6\\x39\\x53\\xbc\\x3d\\x81\\x05\\x2a\\x2f\\x10\\x84\\x38\\x9a\\x77\\x06\\xdf\\x74\\xed\\x41\\x36\\x08\\x2a\\xb5\\xc6\\xe8\\xc7\\xf4\\x11\\xdf\\x9d\\x3a\\x0f\\x3c\\x40\\xf5\\xa6\\x0e\\x2d\\x21\\xa8\\x54\\x8e\\x7a\\x25\\xde\\xe3\\x40\\x30\\xb3\\xc3\\xe7\\x5c\\xaa\\x93\\xdd\\xaa\\x9c\\x19\\x0c\\xb6\\xde\\xda\\x24\\x13\\xd5\\x4e\\x37\\x3d\\x43\\x53\\xdb\\xa4\\x3d\\x39\\x49\\x1a\\x2f\\x56\\xc8\\xb3\\x6d\\x45\\x01\\x6f\\x77\\xd7\\x47\\x16\\x91\\x63\\x45\\x39\\xe7\\x6c\\x4f\\xb4\\x19\\x13\\x47\\x2b\\x0a\\x23\\x05\\x4f\\x54\\x8f\\x54\\xb1\\xe7\\x10\\x9c\\x8b\\x65\\x21\\xb5\\x7a\\xe9\\x81\\xd0\\x50\\x31\\x6a\\x33\\xc4\\x9c\\x71\\x16\\x26\\x8d\\xcc\\x4b\\x78\\xc2\\xba\\xe5\\x3a\\x3a\\xe4\\xdd\\x17\\x8b\\xb8\\xb7\\x6b\\xb3\\xbe\\xfe\\x19\\xe4\\x1a\\x2c\\xf1\\x2c\\xeb\\xb7\\x11\\x68\\xf9\\x71\\xf2\\x02\\x46\\x1c\\x63\\xf7\\xd6\\xee\\xf1\\x07\\xf5\\xb1\\x03\\x0e\\xdd\\x4e\\x75\\x00\\x9e\\x91\\x16\\xc3\\xcd\\x0e\\x8b\\xdd\\xc2\\x99\\xb4\\x1f\\x1a\\x45\\xe7\\x84\\xef\\xa6\\x46\\xda\\xda\\x64\\x06\\x8e\\x92\\x48\\xec\\x98\\x8f\\x23\\x26\\x34\\xad\\x3d\\x5a\\xab\\x19\\x56\\x0e\\x83\\x0a\\x5b\\xd6\\x65\\x45\\x7c\\x94\\x29\\x5e\\x1a\\xf0\\x16\\x0f\\xbc\\xe2\\x72\\xef\\x48\\x45\\xdd\\xf0\\xc4\\xf2\\x4d\\x97\\x6f\\x51\\x86\\x90\\xea\\x1f\\x82\\xff\\x4d\\xfa\\x48\\x13\\x64\\x1a\\x67\\x59\\x8e\\xa9\\x84\\x01\\xe0\\xff\\x10\\xa0\\xe5\\x82\\xe2\\xb9\\x08\\x67\\xb4\\xe6\\x23\\x2c\\x34\\xea\\x49\\x9c\\x16\\x99\\x09\\xa4\\x41\\x26\\xf3\\x77\\xd8\\xcc\\x1c\\x11\\x90\\x58\\x66\\x34\\x0e\\xfd\\x1e\\x7b\\x07\\x7d\\xc7\\x45\\x6d\\x59\\xc9\\xb9\\x6a\\x12\\x4a\\xac\\x3b\\x33\\xbb\\x22\\x74\\x41\\xbb\\x7a\\x52\\xe6\\xc3\\x14\\x0d\\x7a\\x4f\\x67\\xca\\x05\\xbb\\xc9\\x3c\\x93\\x77\\x5b\\x92\\x91\\x19\\xa2\\x24\\xed\\x8f\\x39\\x00\\x58\\x20\\xf4\\x20\\xcc\\x6c\\x53\\x0e\\x61\\xe2\\x0a\\xdc\\xa0\\x1e\\x93\\x9c\\xc0\\x31\\xdf\\x49\\xcd\\xb1\\xec\\x8f\\xf4\\x93\\xc9\\xef\\xbc\\xad\\x34\\xc5\\x71\\x08\\xef\\xd7\\x64\\x55\\x89\\x66\\xfb\\x14\\x70\\xb0\\x74\\x5e\\x69\\x66\\x19\\x1a\\x9a\\x9e\\x44\\x58\\x1b\\x09\\xfa\\xf4\\x69\\xf9\\x51\\x53\\x72\\x03\\xd9\\x26\\xbc\\x8a\\x55\\xd0\\x80\\xa8\\x05\\x18\\x1d\\xd7\\x29\\x6e\\xd2\\x0a\\x81\\x82\\x68\\xf7\\x55\\xea\\xa6\\x6b\\x08\\x22\\x42\\xf4\\xd0\\x20\\xf7\\xcd\\x67\\x20\\x89\\x04\\x84\\xc0\\x1c\\x75\\x7f\\xe3\\x5d\\x87\\xb5\\xbc\\x90\\x6d\\xea\\xcc\\x2e\\x30\\x71\\xde\\x46\\x01\\xbc\\xf0\\xdd\\x6b\\x83\\x7c\\x43\\x31\\x06\\x04\\x7f\\xd8\\xec\\x9b\\xd0\\xe9\\x8c\\x9e\\xe8\\x06\\xf7\\xec\\x8c\\x5a\\x10\\xea\\x21\\x36\\xf1\\xf9\\x0f\\x90\\x0b\\x85\\x3f\\x95\\x3f\\x00\\xb0\\x76\\xbd\\x1e\\xbd\\x92\\x9d\\x08\\xa3\\x8b\\xec\\x68\\xd8\\x66\\x43\\x50\\x47\\xbc\\xb6\\x72\\x1e\\x06\\xb6\\x40\\x85\\xdc\\x05\\x58\\xc1\\xfa\\x85\\xa2\\xc8\\x3b\\x0c\\xaf\\x4c\\x81\\x60\\x84\\xf1\\x0a\\x4c\\x58\\x85\\x29\\x5b\\xca\\x15\\xff\\x7c\\x18\\xe5\\x96\\xc6\\x2c\\x92\\xee\\x99\\x21\\xa2\\x7c\\x29\\xd1\\x95\\xbd\\x28\\x22\\x13\\xff\\x36\\x60\\xb6\\xe7\\x54\\x6b\\x4e\\xaa\\x77\\x7c\\xe3\\x9f\\xc5\\xd2\\x04\\x84\\xc7\\x1e\\xd6\\xca\\x06\\xf9\\xb7\\x7a\\xb1\\xd8\\x72\\x39\\x3a\\xb2\\xd1\\x02\\x55\"},\n{{0xb2,0x98,0xad,0xf3,0x8a,0x67,0x08,0xf8,0xd1,0x8f,0xf1,0xed,0x96,0xbf,0xba,0xb4,0x21,0x54,0x0d,0x09,0x6c,0x4e,0x43,0x51,0xb9,0x22,0x09,0xb5,0xe6,0xaa,0xab,0x65,},{0x77,0x0e,0xdf,0x42,0xb8,0xa0,0x39,0xc6,0xca,0xb9,0xba,0x65,0xeb,0xfb,0x13,0x5a,0xbc,0x2d,0xa3,0x14,0xa4,0xc3,0x09,0xf4,0x6a,0x8f,0x32,0x5b,0x52,0xd0,0x65,0x93,},{0xe5,0x5f,0x8d,0x30,0x41,0x22,0xdc,0x17,0x5c,0xf0,0x27,0x46,0x74,0xfc,0x9d,0xed,0xfe,0xc2,0xb5,0xf8,0xa2,0xee,0xb1,0xe3,0xe7,0xf8,0xe0,0xdf,0xba,0x0d,0xac,0x2d,0x32,0xf4,0xe7,0x04,0xce,0x91,0xcd,0x59,0x91,0x84,0x13,0x3c,0x3b,0xf1,0x06,0x3d,0x2f,0xae,0x63,0xd7,0x3a,0xcc,0x57,0x72,0xd7,0x18,0xd8,0x11,0x83,0x31,0x86,0x02,},\"\\x9d\\xf4\\xd5\\xd7\\x56\\x5d\\x2c\\x05\\x22\\x62\\xdd\\x34\\xd6\\x00\\x7d\\x86\\xd9\\xc0\\xf0\\x7c\\x70\\x89\\xaf\\x61\\x19\\xe3\\x04\\xf4\\xd8\\x01\\x1d\\x7e\\xaa\\xd7\\x7b\\x3e\\xf7\\x0c\\xc2\\x80\\x84\\x7d\\x59\\xf2\\x97\\x20\\x2b\\x7e\\x18\\x61\\xae\\xf3\\x34\\xbf\\x38\\xde\\x14\\x74\\x0e\\x80\\x73\\xc9\\x55\\xa8\\x51\\xd2\\xcf\\x3d\\xad\\xc3\\xed\\xce\\x15\\xbe\\x49\\x0e\\xaa\\x84\\x5b\\xa5\\x53\\xfc\\x6e\\x87\\x46\\xe5\\x29\\x15\\xe6\\x55\\xaf\\x4b\\x86\\xc6\\x29\\xd4\\xc5\\x22\\x78\\x36\\x35\\xd4\\x64\\xa2\\x82\\x57\\x77\\xd8\\x9d\\x70\\x97\\x67\\x7e\\xf0\\xe5\\xee\\xae\\x38\\x53\\x7e\\xcb\\x65\\x6e\\x3b\\x28\\xdd\\x07\\x35\\x8f\\xd9\\xfb\\x2c\\xd4\\x62\\x51\\x72\\x86\\x65\\x9a\\xef\\xc7\\x9d\\x37\\x4d\\x1d\\x13\\xed\\x93\\x96\\x7c\\x53\\x0c\\xde\\xa4\\xf3\\x14\\xa0\\xf9\\x1d\\x62\\x89\\xb4\\xc7\\xa4\\x27\\x9b\\x6f\\x4c\\x4a\\xbc\\xa3\\x33\\x57\\xf6\\x9e\\xd8\\x4b\\x91\\x19\\x63\\x7a\\xdb\\x7c\\x18\\xe6\\x94\\xcb\\x3c\\x56\\xe7\\x36\\x37\\xda\\x91\\x07\\x35\\xd4\\x3c\\x38\\xaa\\x80\\x86\\x67\\x5a\\x06\\xad\\x37\\x0e\\x57\\x26\\x88\\x1d\\xa5\\xe1\\xa1\\xdc\\x61\\x44\\xd6\\xa6\\x2a\\xff\\x7f\\xb0\\xc3\\x52\\xd8\\x8d\\xc9\\x71\\xa3\\xd7\\x2d\\x30\\x71\\xe1\\x4b\\x47\\x42\\x53\\x56\\xaf\\x1b\\x01\\x92\\x33\\x53\\x82\\x61\\x45\\x1a\\x99\\xa6\\xcf\\x4a\\x07\\xce\\x9a\\xb1\\xc3\\x99\\x0d\\xe6\\xab\\x8d\\xe2\\x11\\x6c\\x75\\x61\\x05\\xc5\\x12\\xb7\\xa3\\xee\\xb3\\x15\\x7b\\x15\\x8b\\x32\\x1e\\x44\\x4e\\x80\\x6d\\x89\\x0b\\x38\\x90\\xed\\x9d\\xdc\\x86\\x9f\\x17\\x11\\x72\\x3b\\xb9\\x9a\\x72\\xbd\\xb9\\x23\\xd1\\x31\\xba\\x4e\\xdb\\xfb\\xb6\\xda\\xe9\\x9a\\x5c\\x7b\\x32\\x8d\\x31\\x0d\\xf9\\xa6\\xd1\\xdc\\xd8\\x59\\x18\\x96\\x28\\x33\\xe8\\x9e\\x20\\xf5\\xc5\\xe6\\x33\\x3a\\xc8\\x61\\x09\\x4a\\xe9\\xe7\\x99\\xc8\\x64\\x1b\\x9b\\xae\\xa1\\x1a\\x2e\\x0e\\xc2\\x34\\xbe\\x59\\x30\\xe0\\x28\\x80\\x85\\x9c\\xde\\xc0\\xd9\\x78\\x23\\x7c\\xbe\\xa5\\xc7\\xc3\\x2c\\x11\\x1b\\xaf\\xdd\\x4b\\xfb\\xff\\xe4\\xfb\\x34\\x85\\xef\\xfe\\xcd\\x51\\xbd\\x19\\x5a\\x71\\x40\\x4c\\xa5\\xb5\\x9a\\xfa\\x25\\x2d\\x7b\\x5f\\xf9\\xd0\\x30\\xf4\\x8c\\x6f\\xaa\\xdb\\xdb\\xa9\\x18\\xf2\\x1a\\x0c\\xd3\\x9a\\xf5\\x69\\x66\\xdc\\xcf\\xa2\\x5f\\xb5\\xa5\\xcf\\x9a\\x4b\\x26\\xa7\\xf5\\x44\\x1d\\xf6\\xe3\\x20\\xe3\\x4b\\x27\\x39\\x3d\\xe2\\xec\\xfb\\xd6\\x9a\\x15\\x94\\x90\\x9a\\x6c\\x68\\x5e\\xc6\\x45\\xfc\\xf3\\x04\\x8d\\x01\\x48\\xfa\\x38\\xd3\\xe8\\xa6\\x4d\\xc3\\xc2\\x1a\\xe4\\x4d\\xa7\\xe4\\x6a\\x5e\\xa7\\x93\\x6c\\x2b\\xa0\\x83\\x68\\x9a\\x78\\xca\\x3a\\xc6\\x0b\\x87\\xbe\\x6d\\x23\\xea\\x40\\xf5\\x96\\x15\\x83\\x74\\x28\\x42\\xe3\\x75\\x25\\xa4\\x9c\\x5f\\xe8\\xfd\\x15\\xd7\\xb0\\xc9\\xe8\\xfc\\xcd\\x07\\x93\\x6d\\x19\\x53\\x82\\x12\\xf7\\x37\\x3d\\xbb\\xf3\\xdf\\x7d\\x46\\xad\\xf9\\xd9\\xf5\\xdb\\x09\\x52\\x4c\\x65\\xb8\\x83\\xae\\x6f\\x6c\\xef\\xa2\\x4b\\x19\\xec\\x48\\xce\\x28\\xcf\\xa7\\x34\\xd9\\xbd\\x6e\\x77\\x83\\x7d\\x1a\\x14\\xd6\\xa1\\x9d\\x34\\x5b\\xfb\\xea\\x55\\x9e\\x7e\\x6b\\xfb\\x71\\xdd\\xad\\x83\\xcd\\x8d\\xee\\xab\\x68\\x7f\\xe7\\x3c\\x05\\x74\\x88\\xf8\\xf2\\xb3\\xe2\\xe2\\x6d\\x13\\x00\\x9f\\x4d\\x23\\xe6\\x61\\x9a\\x23\\xc0\\x69\\x2a\\xf7\\x66\\x69\\x21\\x7d\\x5e\\xbd\\x46\\x08\\x5b\\x39\\x88\\x90\\xe5\\xc9\\x1f\\xdb\\x4d\\xb5\\xba\\x40\\xe7\\x77\\x3d\\x51\\x8d\\x3c\\xf0\\x0c\\x0a\\x5b\\x5a\\x4b\\x0f\\x1b\\x85\\xd6\\x29\\x16\\xa5\\x9e\\x56\\x07\\xb7\\xb1\\xeb\\x80\"},\n{{0xe9,0xcf,0x16,0xd6,0x96,0xf6,0x3b,0x59,0xe5,0xe2,0x5c,0x9e,0xe2,0xd7,0x5b,0xb0,0x5e,0xd2,0xba,0xa5,0x91,0xa7,0x55,0x7f,0x9f,0xb1,0x29,0xcf,0x98,0x3d,0xe0,0xba,},{0x6d,0x1a,0xe3,0x85,0xe8,0x0a,0x39,0x55,0xe8,0xd0,0xc5,0x93,0xa8,0x1f,0x43,0x1c,0xd4,0x32,0x67,0x1e,0x78,0xcd,0xba,0xfe,0x83,0xfe,0x58,0xdb,0xcd,0xb9,0x85,0x60,},{0x81,0x12,0xac,0x37,0xea,0xfb,0x74,0x9d,0x3f,0x4a,0x1e,0xa1,0x48,0x43,0x79,0xdf,0x3e,0x38,0x3b,0x01,0x9c,0x12,0xde,0x85,0x15,0xe3,0x49,0xe4,0xf6,0xf9,0x98,0x63,0x2e,0x30,0x96,0x83,0x47,0xa1,0xd1,0x5b,0x09,0xda,0x2e,0xb8,0x00,0xb0,0x3d,0x81,0x9d,0x20,0x2b,0xd1,0x0a,0x6a,0x46,0x3b,0xb0,0x2b,0x36,0x6d,0x68,0x55,0xfe,0x0e,},\"\\xa1\\x0f\\xea\\x8f\\xc9\\x3e\\xcc\\xfe\\x2a\\x6b\\x78\\x26\\x07\\x95\\x63\\xad\\xf8\\xaa\\x9a\\x66\\x64\\x44\\x93\\x22\\x00\\xcc\\xa9\\x44\\x7d\\xd0\\x27\\xc5\\xc7\\x20\\x4e\\xa6\\x2b\\xf8\\xf5\\xe2\\xe3\\x91\\x45\\xac\\x39\\x48\\xab\\x3f\\x31\\x86\\x88\\x7b\\x30\\xbc\\x60\\x23\\x30\\x24\\xb4\\x83\\xf3\\xf5\\x19\\x03\\x6a\\x3e\\x94\\xc8\\xd7\\x51\\x0a\\x85\\x3a\\xc6\\xe2\\x0c\\x6e\\x52\\x6e\\xe3\\xcd\\xb7\\x6d\\xe6\\x63\\xf6\\x73\\x05\\xad\\x80\\xdf\\x23\\x42\\xc8\\x50\\x1b\\x4f\\x4a\\x8e\\xe3\\x66\\x5a\\x79\\x8f\\xc4\\x37\\xdd\\x81\\x4e\\x4e\\x47\\xe7\\xa4\\x66\\x89\\x0e\\x0f\\xfa\\x8f\\x51\\x0f\\x3e\\x6e\\x19\\xc9\\xc9\\x69\\xf7\\x0a\\x76\\xe5\\xcf\\x30\\x54\\xd1\\x7d\\xe4\\x59\\xac\\x8e\\xe9\\x95\\x50\\xbd\\x38\\x31\\x9f\\x36\\xe4\\x33\\x43\\x4a\\x92\\x6a\\xd6\\x8b\\x96\\x1e\\x0c\\xa1\\x0a\\xdd\\x4b\\xa9\\x92\\xb3\\x65\\x06\\x60\\xa2\\xc3\\xc2\\x6f\\x5d\\x74\\x0a\\x31\\xaf\\xb7\\x76\\x3f\\x54\\x2f\\x72\\x3b\\x8a\\x3c\\x92\\xd8\\xae\\x92\\xa5\\x67\\x76\\x4e\\xfc\\x70\\x53\\x03\\x12\\xba\\xab\\xdd\\x3f\\xbb\\xd5\\x27\\xfe\\x0f\\xcb\\xca\\x3f\\x6a\\x70\\x64\\xcd\\xde\\x18\\x56\\xe9\\x7a\\xb7\\x86\\xaf\\x7d\\x70\\x22\\xa9\\xd4\\x6a\\x33\\x8e\\x8e\\x17\\x54\\xaf\\xd9\\xad\\xac\\x85\\x6a\\x38\\xde\\x2a\\x4c\\x97\\x66\\xde\\xe8\\xdb\\xc7\\x09\\xb0\\x67\\x1a\\x6a\\x6e\\x6e\\x1e\\x5d\\x12\\x07\\x4d\\x22\\x24\\x5c\\xd7\\x3b\\xee\\xeb\\x1b\\xd8\\xec\\xfc\\x1e\\x85\\xa2\\x1b\\xde\\x25\\x3f\\x7c\\x46\\x5a\\xbc\\x1f\\xea\\xa9\\x61\\xc0\\xff\\x5c\\xff\\x2d\\x89\\x64\\x72\\xae\\x17\\xab\\x84\\x88\\xe3\\x3f\\xfe\\xfd\\xb7\\x2c\\x10\\x5e\\x20\\x4f\\x94\\x4a\\xda\\x51\\xee\\x13\\x98\\x1a\\x13\\x6c\\x0f\\x38\\x42\\x6e\\x3e\\x49\\xb0\\xe9\\x18\\x41\\xc3\\x27\\x94\\xd5\\x2f\\x13\\x35\\xdf\\xa6\\x37\\xf1\\x51\\xc7\\xe4\\x0f\\x9b\\x83\\x0a\\xed\\x53\\x9a\\xc5\\x73\\x1b\\x81\\xcd\\xe3\\x26\\x4d\\x22\\xbe\\xad\\x31\\xa6\\xcc\\x68\\xd1\\xa7\\x31\\x43\\xb5\\xba\\x48\\x16\\x13\\x92\\x32\\xf3\\xf7\\xf9\\x79\\x83\\xf4\\xec\\xba\\x64\\xc4\\x95\\x53\\xbe\\x9d\\x6d\\x94\\x3f\\x91\\xdf\\xe0\\x3d\\x1e\\xe8\\x61\\x8c\\xd4\\x0d\\x2f\\xb7\\x23\\x8a\\x31\\xd1\\xbc\\x38\\xe7\\x6a\\x55\\x1f\\x9e\\xee\\x22\\xe7\\x3a\\x27\\xd7\\xa4\\x8b\\x40\\x87\\x72\\xea\\x72\\xc3\\xed\\x63\\x7b\\xb4\\xb1\\x68\\xf9\\xd7\\xae\\xad\\x94\\xea\\x03\\xbc\\x11\\x10\\x99\\x01\\xc8\\x89\\x92\\x7d\\x51\\xcd\\xac\\xf9\\x62\\x12\\x59\\x62\\x55\\x99\\x79\\xd3\\xe4\\xc8\\xe3\\xb5\\xae\\x58\\x2f\\x2d\\xba\\xd4\\x99\\x88\\x02\\x85\\x6c\\x4d\\xf6\\x9e\\x8f\\xb5\\x49\\x17\\xe2\\xf3\\x6b\\xb6\\x7a\\x19\\xa2\\x6e\\x9a\\x9a\\x94\\x85\\xbc\\xe9\\x8d\\xbf\\xff\\x0d\\x2b\\x02\\xb9\\x37\\x7a\\x91\\x37\\xa7\\x34\\xe5\\x7b\\x5c\\xe6\\x65\\x05\\x30\\x17\\xe9\\x92\\x67\\x7a\\x1a\\xa0\\x79\\x24\\x0d\\x2c\\xf9\\x63\\xcd\\xf9\\xbf\\xea\\x8d\\x46\\x00\\x91\\x23\\x2d\\xaf\\x89\\x80\\x1f\\xd7\\x51\\x71\\xa6\\x19\\x5a\\x5c\\x04\\x68\\x15\\x91\\x4b\\xe1\\xf6\\x28\\x68\\x78\\x3d\\x6f\\x2c\\xf2\\x8a\\xf9\\x37\\x8d\\x6c\\x68\\x93\\xe7\\x5d\\xe6\\x41\\x11\\x1c\\x68\\x47\\x27\\xef\\xfa\\x31\\xb8\\xbc\\x9b\\x0a\\x01\\xdb\\x9c\\x9e\\x81\\xcc\\xd8\\xf4\\xd4\\xe8\\x75\\xd4\\xbd\\x90\\xd2\\x53\\xf5\\x89\\x89\\xa8\\xa5\\x2a\\x20\\x3a\\x77\\xa4\\x96\\xd6\\x97\\x98\\x6b\\x03\\x1e\\x9f\\x69\\x9b\\xc6\\xa1\\x6c\\xd5\\xf9\\xc3\\x60\\x18\\xeb\\xda\\xa3\\x6b\\xad\\x0e\\x01\\x4f\\x4c\\xf3\\xb4\\xb7\\x46\\x17\\x1b\\xf8\\x93\\x14\\xe8\\xb7\\x2c\\xbd\\x47\\xcc\\x61\\x6a\"},\n{{0x23,0x8a,0x6d,0x49,0x79,0x32,0x1a,0x14,0xa9,0x97,0x23,0x6f,0x45,0x85,0x04,0x6c,0xf7,0xa0,0x5c,0x0a,0xdc,0x6b,0xa1,0xfd,0xb1,0x9e,0xc2,0xa3,0x2f,0x62,0xbe,0xeb,},{0x0b,0x4b,0xa6,0x74,0xe4,0x01,0x66,0x5b,0x67,0x90,0xcf,0xda,0x08,0x07,0x04,0xcd,0x90,0xe2,0xf3,0xd3,0xef,0xab,0x25,0x3e,0xd8,0xdc,0xfb,0xd1,0x8e,0x40,0x67,0x89,},{0x29,0x42,0xf7,0x08,0xc0,0xed,0xe4,0xcb,0x0d,0xde,0xf1,0x3b,0x85,0xd7,0x1d,0x72,0x13,0xe0,0x38,0x3d,0xd2,0x94,0xf5,0x34,0x13,0x5f,0xd6,0x9c,0xaf,0xbc,0xfc,0x0e,0x33,0x09,0x0a,0x2a,0x0c,0xa3,0xfa,0x57,0x2c,0x72,0xcd,0xf5,0x59,0x2d,0xe9,0x03,0xb1,0x58,0x44,0x95,0xab,0x63,0x99,0x81,0x50,0xf2,0xb3,0x93,0xa3,0xb3,0x40,0x0c,},\"\\x97\\xcd\\x61\\x9a\\x22\\x51\\xed\\xa9\\x16\\x64\\x64\\x31\\xd4\\xcd\\x15\\x98\\xc2\\xd4\\x4d\\x06\\xaf\\x3e\\x48\\xbd\\x18\\xe3\\xde\\x7f\\xb4\\xbd\\x4f\\x78\\xe0\\x0a\\x69\\xee\\xab\\xde\\x3f\\x82\\x06\\x5c\\xfe\\xe6\\xcd\\x71\\x1f\\x07\\xd2\\x26\\x37\\x16\\x1f\\xf6\\x85\\xf6\\x5a\\x7d\\xdf\\x54\\x55\\x31\\x97\\xfd\\x31\\xc5\\xc6\\xb7\\x1d\\x9e\\x36\\x5a\\x94\\x1d\\xce\\x4c\\x3e\\x22\\x5d\\x19\\xcc\\x63\\x3a\\x7e\\x12\\x86\\x2c\\xd2\\x3e\\xbb\\x7c\\x74\\xa7\\x04\\x85\\x0f\\x76\\x1a\\xc0\\x24\\x1b\\xe5\\x17\\xce\\x7c\\x36\\x09\\x36\\xce\\x07\\x25\\x0d\\x9f\\x2e\\xb2\\x78\\x71\\x15\\xee\\xc3\\x77\\xe1\\x13\\x4d\\xc0\\x8f\\x44\\xeb\\x0a\\x2a\\x2a\\x27\\x16\\xf0\\x01\\x44\\xa4\\x9f\\x01\\x2a\\x57\\xb3\\xcd\\x06\\xef\\xeb\\x3f\\xae\\x92\\x0f\\x28\\x5c\\xff\\xd9\\xa4\\x01\\xa0\\xb9\\x86\\x59\\x4e\\x17\\xb2\\xc9\\xc8\\xfd\\xab\\x83\\x5d\\x9f\\x3f\\x5d\\x47\\x4b\\xe7\\x33\\xc1\\x92\\x5e\\xe6\\xf0\\x93\\x86\\x71\\x10\\x66\\xc3\\xfc\\xd6\\x45\\xee\\xb0\\xfb\\xe7\\x05\\x41\\x69\\xeb\\x70\\x9d\\x4a\\x3f\\x0d\\x16\\xf2\\x8a\\x1f\\xf5\\x06\\x6c\\x84\\x2b\\xc6\\x3e\\x35\\x9e\\x92\\x48\\x5b\\x38\\x75\\x7f\\xf4\\x6c\\x27\\xf7\\x9d\\x0c\\xdc\\xf0\\xe1\\x6e\\x97\\xe3\\xc7\\xb7\\xe2\\x17\\x8d\\xff\\xd2\\x70\\x28\\x2d\\xd6\\x12\\x05\\xd5\\x85\\x4d\\x84\\x1f\\x0e\\x3f\\xc0\\xe4\\x82\\xcc\\x1e\\xe4\\x85\\x52\\xcf\\xe6\\x58\\x93\\x5b\\x54\\x27\\xc3\\x66\\x23\\x0a\\xef\\x79\\xae\\xf4\\x02\\x1d\\x6f\\xab\\x5f\\x18\\x75\\xcc\\x84\\x9e\\x32\\x1a\\x75\\x50\\x0e\\x9e\\x1b\\xa5\\xdd\\x59\\x6b\\x43\\x8c\\xf8\\x8b\\x23\\x5b\\x01\\xa6\\x76\\x25\\xc4\\xbf\\x84\\xd0\\x72\\x4a\\xe6\\x88\\x0a\\x37\\x85\\xe3\\x3b\\xd9\\x23\\x5f\\xd0\\xf5\\x98\\x18\\x04\\xd2\\x1c\\xbd\\x63\\x3c\\xb1\\x80\\xf3\\x44\\x56\\x46\\x02\\x07\\xa2\\x90\\xa2\\x54\\xd9\\xfe\\x61\\x06\\x3d\\x40\\x63\\x4c\\xa3\\x87\\x2f\\x09\\x35\\xfa\\x28\\x32\\x87\\x95\\xca\\x41\\xb0\\x06\\xa2\\x11\\x1f\\xc5\\x93\\x2b\\x1e\\x77\\x9c\\xe9\\x66\\xcc\\x47\\xad\\xb7\\xc0\\xdd\\x98\\x73\\x33\\xba\\x75\\x29\\xa1\\xa4\\x99\\x6c\\xe9\\xf5\\x6e\\x05\\x19\\x81\\xfe\\x1f\\x55\\x3e\\x57\\x8f\\x43\\xc3\\xba\\x94\\xbe\\xac\\xc9\\x3c\\x3e\\x73\\x96\\x67\\xc7\\xa7\\xc6\\xfa\\x27\\xe1\\xe0\\x81\\x69\\x5d\\x20\\xba\\x70\\x5c\\x3f\\x10\\xb2\\x0d\\xf5\\x30\\xcb\\xb0\\xec\\xb8\\x74\\x56\\x50\\x11\\x09\\x68\\x70\\x19\\x31\\x84\\x52\\x78\\x5d\\x38\\xe7\\x66\\xb3\\xcd\\x35\\xb0\\x07\\xd7\\xe3\\xcf\\xe0\\xb2\\xcc\\xa8\\xaa\\x6e\\xf7\\x39\\x55\\x99\\xdc\\xb9\\xc4\\xd2\\x8b\\xcc\\x35\\xc7\\x6d\\xfc\\x35\\x34\\x3c\\xb1\\x34\\x8b\\xa3\\xe9\\x62\\xf1\\x0e\\xe8\\x6f\\x86\\xf5\\xb6\\xd4\\xca\\xe2\\xe8\\xc2\\xb1\\x85\\xe3\\xea\\xa1\\xae\\xb8\\x7b\\xcf\\xcf\\x2f\\xb7\\x6c\\xc7\\xfc\\xc6\\x89\\x50\\x71\\xb1\\x68\\xe8\\xb7\\xf6\\xca\\xa0\\xfd\\x63\\x98\\xe7\\x78\\xcc\\x07\\x91\\x2f\\xf5\\xd6\\xe6\\x10\\x21\\xa8\\xa5\\x9a\\xe0\\x35\\x21\\x60\\xf5\\x6d\\x54\\x88\\xfe\\x2f\\x2a\\xcc\\x94\\x03\\xda\\x9a\\x9f\\xfc\\x66\\x1c\\x1e\\x9d\\xc5\\xbe\\x88\\xc4\\x20\\xdb\\x0f\\xd7\\x7d\\x84\\x5d\\xc8\\xdd\\x9d\\x8e\\x58\\xf9\\x96\\x1b\\x79\\xaf\\xc6\\x86\\x24\\xba\\xa8\\x6a\\xa6\\x43\\xa8\\xa3\\xc7\\xed\\xf7\\x1d\\x55\\x3c\\xc0\\xd3\\x22\\x4a\\x60\\x69\\xec\\x67\\x4f\\x52\\xda\\x29\\xa1\\xcb\\x60\\xc4\\x19\\x23\\x01\\xa2\\x43\\x47\\xa8\\xaa\\x83\\x26\\x26\\x9e\\x0a\\x14\\x78\\x0c\\x95\\x83\\xcd\\xff\\x51\\x59\\x27\\xfd\\x5b\\xef\\x52\\x8f\\x9d\\x23\\x78\\x7a\\xeb\\x80\\x3d\\x70\\xeb\\x91\\x6b\"},\n{{0x59,0xd5,0x01,0x39,0x3d,0xc5,0x99,0x97,0x23,0x81,0x07,0x06,0xfa,0xd7,0xd6,0xef,0xd1,0x63,0xc4,0x47,0x10,0xc7,0x41,0xc1,0x85,0xc2,0x7e,0x04,0x25,0xe3,0xc0,0x5b,},{0x82,0x65,0xd4,0x3c,0xfb,0x07,0x35,0xb5,0xd7,0x25,0x0f,0xcf,0x0f,0xcb,0xd1,0x54,0xbf,0xc0,0xee,0xcb,0x13,0xb7,0xad,0x93,0xb6,0xb0,0x29,0x40,0x58,0x8b,0x84,0x3b,},{0xe6,0x46,0xf1,0x64,0xcf,0xed,0x8c,0x2e,0x06,0x07,0x10,0xdc,0xfb,0xc3,0xe9,0xfa,0x5e,0xb3,0x96,0x37,0x68,0x13,0x19,0x01,0x84,0xe3,0x46,0xf5,0x2b,0xb0,0xba,0x57,0x46,0xcc,0xb6,0xb5,0x95,0x22,0xb1,0xaf,0xf9,0x83,0x0f,0x2f,0x98,0xb9,0xe5,0xda,0xfc,0xd8,0x32,0x07,0x78,0x83,0xc4,0x4e,0x8a,0x35,0x38,0x8f,0x71,0x8b,0xf4,0x0c,},\"\\x56\\x4e\\xd2\\x2c\\x17\\x2f\\x5c\\x3a\\xfb\\xb0\\xb9\\x5a\\xd2\\xfc\\x64\\xe4\\xbe\\x6d\\x4d\\xb1\\xeb\\xb8\\xd3\\x99\\xc4\\x3a\\x5e\\x16\\x04\\x8e\\x7f\\x87\\x32\\x18\\x1e\\x5d\\x0e\\xed\\x8e\\x63\\x8e\\xf2\\xa5\\x5a\\xa0\\xd7\\xb6\\x81\\xfe\\x02\\xbb\\x54\\x23\\xaf\\x94\\xbd\\x35\\x2d\\x3c\\x2d\\xde\\xc0\\xf8\\x47\\x60\\xa4\\x11\\x2b\\x4f\\xe0\\x17\\xcf\\xbc\\x50\\x2f\\x95\\x43\\xcf\\xa4\\x1f\\xb2\\xaa\\xe7\\x5a\\x3a\\x08\\x1f\\x8c\\x49\\x90\\x33\\xd1\\xfa\\xe5\\xd9\\xc5\\x0c\\xb4\\x4d\\xbc\\x63\\x60\\x5a\\x54\\x39\\x8f\\xbf\\x07\\x98\\x52\\xeb\\xa8\\x6f\\x2f\\xdf\\xc2\\x72\\xd0\\xc4\\x17\\x9d\\x7c\\x13\\xcb\\xc1\\xc2\\xa3\\xda\\x0b\\x82\\x84\\x5c\\xf1\\xa4\\x6e\\xbb\\xe3\\x1e\\x79\\xb6\\x00\\x97\\x33\\xc7\\xbf\\xe7\\xaa\\x4f\\x9f\\xfd\\x71\\x9c\\x77\\xdc\\x7d\\x74\\x8e\\x49\\x2e\\x14\\xee\\x5e\\x41\\x79\\xbf\\xa9\\xe6\\x49\\xcf\\x0d\\x89\\x53\\x41\\x86\\x38\\x5e\\xe9\\x94\\x10\\x05\\x1d\\x66\\x56\\xe6\\x23\\x43\\x8c\\xc7\\xb2\\xe7\\x07\\xe4\\x8c\\x84\\x91\\x55\\x49\\xae\\x8d\\x67\\xa3\\x06\\xc6\\x7b\\x10\\x6b\\x7a\\x25\\xf4\\x5f\\x8e\\x10\\xdd\\x7d\\xd3\\xea\\xac\\x31\\xf1\\x05\\x22\\x57\\xeb\\x6a\\x75\\x76\\xb6\\x85\\xcb\\x9e\\x6c\\x1c\\xd0\\xd7\\x3c\\x7a\\x3c\\xed\\x5a\\x8d\\xd2\\x73\\x08\\xae\\x00\\xf9\\x5e\\xab\\xda\\xe9\\xd1\\xc4\\xaa\\x89\\x34\\xe2\\x42\\x4c\\x93\\x28\\xa5\\x22\\x8f\\x4f\\x82\\xdd\\x4a\\x66\\x55\\x6d\\x82\\x17\\xc5\\xa2\\x2b\\x2b\\xeb\\x86\\xa2\\xa4\\x34\\x13\\xee\\x5e\\x10\\xf8\\x83\\xf2\\xcd\\x6c\\x2e\\x87\\x49\\xb5\\x50\\x88\\x42\\xec\\xae\\x5f\\xfc\\xcb\\x79\\x6d\\x96\\x33\\xe8\\x7e\\xf4\\xa9\\x6c\\x0d\\xf7\\xef\\x47\\xb2\\x83\\xd0\\x96\\x72\\x3b\\xa3\\x13\\x5b\\xad\\x75\\xb2\\xe1\\x9e\\xc0\\x4f\\x70\\xa4\\x78\\x42\\x8a\\xd5\\xd0\\xaa\\xc0\\xdd\\x2a\\xb9\\x90\\x59\\x13\\xe7\\xe5\\xad\\xe4\\x08\\x80\\x1d\\x5d\\x3c\\x54\\xd9\\xcf\\x7b\\x8f\\x0f\\x0c\\x5e\\xb0\\x54\\xc1\\x47\\x5c\\xc2\\x10\\xa2\\xc7\\x98\\xd8\\xbd\\x89\\x93\\x2f\\xf9\\xf3\\x60\\x42\\x18\\x58\\x05\\x3a\\x70\\x7b\\x8b\\xbd\\x32\\x05\\x5c\\x44\\xb2\\x07\\x12\\xa2\\x67\\x8a\\x9a\\x6a\\xf9\\xe3\\x6d\\x04\\xdc\\xff\\x44\\xf4\\x31\\xcf\\x19\\x30\\xcd\\x18\\xfc\\x93\\x5d\\x22\\x67\\x77\\x5c\\x69\\x09\\x67\\x25\\xed\\x89\\xa2\\x91\\xdd\\x60\\xe2\\x1a\\xc0\\xb0\\x12\\x87\\x34\\x07\\x29\\x92\\x82\\x3e\\xf8\\x7b\\x5e\\xfa\\x6c\\xc5\\xb0\\x50\\x17\\x7f\\x55\\xf4\\xce\\xc9\\x2a\\x08\\xa6\\x5b\\xca\\xdc\\xab\\x9a\\x41\\xc3\\x60\\x86\\x37\\x0b\\x7b\\x9d\\xd6\\x29\\x8a\\xc7\\xb0\\xae\\x6a\\x09\\xc9\\x71\\x0a\\xbb\\x46\\x76\\xa8\\xfc\\x87\\xa3\\x65\\x12\\x90\\x14\\x4b\\x6b\\x30\\xef\\x4f\\x6f\\xbe\\x5b\\x9a\\xd2\\x52\\x37\\xfe\\x06\\x05\\xe3\\xb9\\xf1\\x8a\\x77\\x18\\xac\\x9f\\xca\\x6f\\x32\\x5e\\xa5\\x5f\\x49\\xa8\\x07\\xfb\\x80\\xa2\\x40\\x2a\\xe1\\x34\\x23\\x08\\x0d\\x32\\x77\\x58\\x64\\x90\\x23\\x79\\x8d\\x57\\x28\\xe0\\xdc\\x64\\xac\\x88\\xa6\\xe2\\x94\\x5d\\xbb\\x3e\\x3f\\xfa\\x9f\\xdb\\x4c\\x7b\\x58\\xfb\\xa3\\xf5\\xfb\\xd6\\x7c\\x68\\x6b\\x29\\x71\\xbb\\xd8\\xba\\x4d\\x27\\x5d\\x57\\x3e\\xb7\\x96\\xeb\\x91\\x46\\x77\\x5d\\x8c\\xdc\\xd5\\xfd\\x3e\\xb5\\xa8\\x8e\\xa5\\xa9\\x30\\xec\\x32\\x44\\xe6\\xa3\\x7c\\x81\\xf6\\xa2\\x55\\x4e\\x5b\\xa7\\x87\\xf0\\xe4\\x53\\x19\\xfe\\x4b\\x8a\\x2f\\xfb\\xfe\\xd5\\x07\\x70\\xe7\\x82\\x7b\\x3e\\x7b\\xc2\\xb4\\x4c\\xe5\\x12\\xae\\x60\\x51\\xb6\\xf9\\xf1\\x39\\x31\\xea\\x6a\\xcc\\x09\\x6b\\x8d\\xcb\\x01\\x96\\xbe\\x42\\x24\\x84\\xdb\\x5f\\xcb\\x29\\x9d\"},\n{{0x83,0x9f,0xb1,0x32,0xe6,0x92,0x50,0xca,0x1a,0xd9,0x45,0x10,0x08,0x7f,0x92,0xce,0x06,0x87,0x69,0x21,0x3a,0x19,0xb2,0xa6,0xc8,0x94,0x90,0xf1,0xf5,0x78,0x80,0x7a,},{0xeb,0x58,0x66,0x19,0xb4,0x4a,0x15,0x37,0x9a,0xcc,0x46,0x21,0xa2,0xac,0x71,0xea,0x58,0x97,0x00,0x26,0xc2,0x8e,0x24,0x09,0xfc,0x1b,0xa2,0xbd,0x8b,0x23,0x6d,0x1d,},{0x66,0x43,0x7b,0x6b,0xc0,0x5e,0x75,0xdd,0x16,0x26,0xc3,0xc4,0xff,0x1f,0x72,0xe6,0xdb,0x38,0x1b,0xa1,0x59,0x09,0x48,0xf8,0xf1,0x6a,0xd4,0xd6,0x6e,0x59,0x91,0x65,0x9a,0xa8,0x44,0x05,0x56,0x8c,0xfb,0xc0,0xa7,0x7c,0x02,0x5e,0x59,0xe4,0x3f,0xd5,0x3a,0xb9,0xff,0xab,0xba,0x7b,0x25,0x8f,0x78,0x79,0x62,0x39,0xf9,0x0d,0x45,0x01,},\"\\xc5\\x72\\x32\\xfe\\x32\\xf1\\x1e\\x89\\x4b\\x43\\x7d\\x40\\x45\\x62\\x07\\xcc\\x30\\x6d\\xb4\\x81\\x69\\xb2\\x0e\\x07\\x81\\x10\\x3a\\xff\\xe8\\x02\\xf5\\xaa\\xbe\\x85\\x82\\x95\\x2c\\xa8\\xe9\\x57\\x45\\xe9\\x94\\x0d\\x53\\x5e\\x00\\xff\\x65\\xab\\x3c\\x64\\xbe\\xd3\\xd1\\x17\\x3a\\x0f\\x3d\\x70\\xce\\x4e\\xbe\\x2b\\x50\\xd0\\x48\\xbb\\x47\\x16\\x4d\\x2a\\x2c\\xd9\\xd9\\x5a\\x10\\xcf\\x0d\\x07\\x3e\\xd1\\xc4\\x1b\\x3d\\xe3\\x33\\x52\\x8e\\xe3\\x29\\x68\\x22\\x3a\\x0d\\x84\\x7c\\xad\\xbb\\x5b\\x69\\xf3\\x82\\x16\\x4e\\x9a\\x28\\xd2\\x3e\\xc9\\xbd\\xe9\\xa8\\x28\\xe8\\x77\\x1c\\x9e\\xb4\\x92\\x20\\xaf\\x54\\x18\\x55\\x08\\xaa\\x07\\x3a\\x83\\x91\\x95\\xf1\\x03\\xbc\\x2f\\x32\\xfe\\x04\\xf9\\x51\\xca\\x45\\xbf\\xbf\\x30\\xd2\\xfb\\x81\\x14\\x05\\x6a\\x73\\x6a\\xdd\\xf2\\x7e\\xcd\\x9a\\xf0\\xf6\\xe5\\xe9\\x7e\\x57\\x73\\xc4\\xfa\\x90\\x22\\x68\\xc3\\x2a\\x15\\x14\\x10\\x95\\x5f\\x3c\\x76\\xaa\\xe2\\x55\\x54\\x9e\\x0f\\x03\\x3f\\x89\\xe1\\xa7\\x8f\\x26\\x5c\\xba\\xb6\\xbe\\xb7\\x51\\x6d\\x4b\\xad\\xc4\\x9c\\xda\\x45\\x88\\x31\\x62\\x25\\xb4\\xc8\\x5e\\xa9\\xfa\\x99\\xc7\\xd6\\x76\\x6e\\x94\\x90\\xc4\\x9d\\xe5\\x9d\\xa7\\x17\\xf6\\x67\\x65\\x35\\x30\\x07\\x1d\\xd2\\xf0\\xc5\\x3e\\x31\\xd8\\x76\\x81\\x56\\xfe\\xb0\\x8f\\xaf\\x00\\xdb\\x0a\\x04\\x53\\x3d\\xf9\\x79\\x57\\xa8\\x4a\\xa4\\x6a\\xeb\\x7e\\x36\\xc0\\xb0\\xbe\\x69\\x01\\x89\\x46\\xf1\\x53\\x8a\\x6a\\xea\\x71\\xdf\\x53\\x6f\\x14\\x42\\xc2\\x44\\x4a\\x43\\xa0\\x43\\xd0\\x46\\xab\\xde\\x1a\\x78\\x2b\\x0f\\x4f\\x5c\\x6a\\xa7\\x20\\xaa\\x60\\xaf\\xed\\x94\\x7c\\x0c\\xee\\x47\\x7d\\xbe\\xc0\\x05\\x57\\xb3\\x72\\x12\\xd9\\x33\\x57\\xca\\x2b\\x6b\\x6f\\x82\\x71\\x5b\\xa0\\xe4\\x84\\xf6\\xda\\xf2\\xd0\\xb7\\xa9\\x8c\\x03\\x35\\x19\\xce\\x38\\x26\\x35\\x86\\x79\\x6d\\x5d\\x31\\xcb\\x2b\\xc3\\xd1\\x12\\x5b\\xc0\\xcc\\xd3\\x29\\xa5\\xc2\\x1f\\xd2\\x7a\\x21\\x8d\\xed\\x60\\x7a\\x0e\\x75\\x15\\xb5\\x71\\xf1\\x92\\xc3\\x3f\\x5f\\xba\\x51\\x4a\\xfe\\x4d\\x45\\x81\\x00\\xf3\\xcc\\xba\\x3f\\x38\\xeb\\x43\\x0b\\x4f\\xc8\\x8f\\xae\\xf9\\x99\\xfa\\x71\\xee\\xe4\\x88\\x22\\x89\\x03\\xbe\\x29\\xf2\\x4d\\xf8\\x1d\\xc9\\x11\\x04\\x4e\\x92\\x4c\\xda\\xa0\\x17\\xcc\\x7d\\x87\\xe5\\x6a\\x6c\\xba\\x87\\x60\\x85\\x9b\\xd6\\x3d\\xd2\\xd4\\xf5\\x81\\xb9\\x55\\xec\\x92\\x4a\\x49\\xaf\\xb4\\x7c\\xa0\\xd6\\x3e\\x78\\x26\\xfd\\xc7\\x12\\xb4\\x94\\x3b\\x73\\x9e\\x18\\x57\\x75\\x5a\\x33\\xc6\\x50\\x36\\x75\\xfd\\xde\\xae\\x06\\x27\\x06\\xe3\\x4f\\x74\\x4f\\xd9\\x32\\x64\\x8a\\x56\\x08\\xce\\x60\\x8a\\x61\\x99\\x57\\x83\\xf3\\x33\\x9c\\xa3\\xfe\\x10\\x7e\\x19\\x72\\x74\\x4b\\xf6\\xd4\\xed\\xaf\\xbf\\x47\\xce\\x02\\x1e\\x05\\x82\\x1f\\xb1\\x24\\xc7\\x08\\x39\\x30\\xe6\\x8e\\x6f\\x5c\\x32\\xd2\\xd9\\xfc\\x4a\\x88\\x4c\\x0b\\xc8\\x84\\x04\\xe4\\xcf\\xe3\\xc1\\xa2\\x42\\x0d\\x41\\x82\\x3a\\x38\\x5f\\xb3\\x28\\x8d\\xb6\\x5c\\x89\\x54\\x5f\\x6e\\x73\\xf0\\xd8\\x00\\x4b\\x2b\\xa1\\x2a\\x4e\\x07\\x72\\x75\\x23\\xef\\x08\\x56\\x70\\xda\\xff\\xaf\\x41\\xc2\\x8a\\x4c\\x11\\x57\\xbd\\xd2\\x45\\xe6\\x87\\x50\\xdd\\x20\\x0e\\x02\\x3a\\xf9\\x0c\\x67\\x56\\x1e\\x0f\\xe4\\xba\\x34\\x0c\\x43\\x3f\\x75\\x5e\\xef\\xab\\xd4\\xb0\\x39\\xbf\\xc3\\x23\\xdc\\x11\\xad\\xb7\\x5a\\xec\\xc4\\x48\\xa8\\x69\\xc7\\xf2\\xa5\\x8b\\x9d\\x86\\x17\\xc6\\x4b\\x8f\\x89\\xfc\\x58\\x3f\\x8c\\x94\\x8e\\x2d\\xf0\\x25\\x1a\\x6c\\x7d\\x8c\\x73\\x8c\\x3b\\x5a\\x42\\xb7\\x49\\xad\\x5e\\x8e\\x98\\x6b\\xd8\"},\n{{0xad,0xc1,0xe5,0x6c,0x3a,0xc9,0x4e,0x6c,0xda,0x04,0x11,0xcb,0xc3,0xce,0x2a,0xf1,0x28,0xd1,0x85,0xa2,0xa2,0x73,0xbd,0xb2,0xaf,0x8d,0x7e,0x50,0xfb,0x96,0xb5,0x26,},{0x5d,0xcf,0xec,0x1f,0x91,0x12,0x75,0x15,0x64,0xec,0xb6,0x07,0x15,0xeb,0xb2,0xc5,0x17,0xb5,0xec,0x37,0xb2,0x53,0x4f,0xd6,0x32,0x99,0x24,0x42,0x9b,0x7f,0xd5,0xc5,},{0xf0,0x2e,0x5d,0xbc,0xb6,0x87,0x04,0xaf,0xad,0x03,0xac,0xa8,0x10,0x61,0xdb,0xdb,0x99,0x85,0x70,0x04,0x9f,0x10,0xce,0x65,0x0e,0xc7,0xa2,0xef,0xf1,0x5c,0x79,0x3d,0xdf,0x5a,0x27,0x2c,0xb6,0x83,0xc2,0x2c,0x87,0x25,0x7c,0x59,0xbd,0xef,0x39,0xef,0xea,0x79,0xbd,0x67,0x95,0x56,0xea,0x15,0x05,0xed,0x00,0x36,0xcb,0x46,0x04,0x0c,},\"\\xd4\\xf9\\x59\\x47\\x4e\\x0b\\x89\\xe2\\xdc\\xd0\\x20\\x66\\x98\\x4f\\x88\\xd7\\x39\\xdd\\x11\\x34\\xa3\\x33\\x09\\xf0\\xa8\\xb7\\x80\\x2e\\xaf\\x01\\x33\\x03\\xc1\\x35\\x15\\xdf\\xeb\\x46\\x1e\\xa3\\xd2\\x48\\xe9\\x98\\xb9\\xa4\\xe5\\x4d\\xae\\x5b\\x00\\x19\\x0a\\x45\\xe7\\x0d\\xc6\\x7e\\x98\\xf3\\xd4\\xcf\\x90\\x6c\\x21\\x4d\\x4f\\x63\\x6d\\x29\\x52\\x92\\x5e\\x22\\xb1\\xa8\\x6a\\x1a\\xab\\xb3\\xa8\\x92\\xa9\\xf8\\xed\\x45\\x4f\\x39\\xc6\\x3d\\x35\\xb7\\x1e\\x87\\xa2\\xda\\x55\\xa8\\xe1\\x67\\xac\\x83\\xa8\\x66\\xad\\x16\\x7a\\x17\\xae\\xd1\\x83\\xc0\\x85\\x18\\xc1\\x5e\\x6b\\xe3\\x48\\x58\\xb4\\xce\\xe2\\xb8\\x42\\x73\\x14\\x76\\x0f\\xff\\xdd\\xd5\\x92\\x38\\x54\\xb1\\x74\\x7f\\x79\\x6e\\x1a\\x52\\x49\\xfb\\x30\\x44\\x89\\x4e\\xd6\\x46\\x82\\x9f\\x65\\x43\\x16\\xee\\x52\\xf4\\x01\\x0c\\x8d\\xd3\\x21\\xfa\\x1d\\xec\\x39\\x7e\\x50\\x14\\x5e\\xd9\\xe3\\x16\\x86\\xfd\\x52\\x03\\xf7\\x23\\x3b\\x8d\\xa7\\x80\\xac\\xaa\\x91\\xee\\x0b\\x5b\\x47\\x20\\x78\\x66\\xaa\\xd8\\x5f\\x83\\x7e\\x03\\xb4\\xe6\\xf6\\xde\\x8c\\x04\\xac\\xaf\\xd7\\x07\\xbd\\xc1\\xdd\\x45\\x50\\x0a\\xb5\\x64\\x80\\x1b\\xee\\x9a\\x58\\xec\\xe3\\x60\\xd0\\x04\\x82\\x8b\\xaa\\xf5\\x23\\xe2\\xf5\\xab\\x69\\x32\\x6a\\x03\\xaa\\xbe\\x01\\x08\\x78\\xfd\\x43\\xff\\xaa\\x56\\x87\\x22\\x44\\xd7\\x68\\x1f\\x16\\x18\\xe6\\x23\\xe3\\xd4\\x74\\xc7\\x3a\\xf8\\xb0\\x80\\xa6\\x18\\x21\\xa5\\x74\\xef\\x2f\\xd7\\x52\\xd2\\x3b\\x60\\x5e\\xc5\\x21\\xc1\\x9c\\x15\\x50\\xde\\x98\\x0c\\x09\\x4d\\x05\\xe0\\x23\\x8f\\x3e\\x00\\x8e\\x6b\\x19\\x5a\\xbf\\xdd\\x40\\x28\\xee\\x1e\\xe1\\xd6\\xc6\\x6a\\x76\\xf1\\x78\\xf0\\xb4\\x31\\xe4\\xaf\\x44\\xdd\\xcc\\xfc\\x52\\x90\\xed\\xff\\x36\\xec\\xe6\\x3e\\x83\\x85\\x56\\x70\\x13\\xf4\\x3a\\x2a\\xeb\\xb6\\x7e\\x3e\\xf4\\x06\\x30\\x8c\\x20\\x48\\x8a\\x76\\xd5\\x8a\\x21\\x4f\\x31\\x39\\xd9\\x83\\xb1\\x9a\\xfb\\x12\\xe3\\x28\\x36\\x07\\xfd\\x75\\x10\\x7b\\xd3\\x1f\\xeb\\x62\\x56\\x17\\x4b\\x7a\\x18\\xae\\xca\\xc9\\xf8\\x56\\x25\\x82\\x01\\x8b\\x0e\\x6d\\xe4\\x05\\x35\\xe3\\x5b\\xef\\x2b\\x56\\x25\\x53\\x88\\x51\\x29\\x39\\x75\\x62\\x90\\x0d\\x34\\x17\\xf9\\x8c\\xdd\\x1e\\x29\\xd7\\x31\\xff\\x48\\x93\\x3f\\x29\\x52\\x95\\x81\\x63\\xba\\x67\\xd5\\x95\\x61\\x81\\x1b\\x83\\x77\\x2b\\xd0\\x57\\x10\\xb6\\xe3\\xcc\\x04\\x34\\x60\\x99\\x37\\x50\\x72\\x23\\xab\\xb7\\x1a\\x6a\\x8c\\x83\\x8f\\xec\\xdb\\x1d\\x2d\\x37\\xc9\\x5d\\xc8\\x06\\xf6\\x5f\\x3f\\x96\\x63\\xd9\\x9f\\x06\\xe6\\xc0\\xf3\\xc3\\x2e\\x95\\xaf\\x1d\\xd7\\x08\\xe8\\x11\\x08\\x63\\x6a\\x26\\xb9\\x68\\xe9\\x83\\x39\\xc7\\x41\\x28\\xb6\\xcf\\x67\\x13\\x35\\x88\\x4a\\xc7\\x2f\\x75\\xb6\\x37\\x19\\x5e\\xa9\\xec\\xa0\\x53\\x60\\x89\\x96\\xc3\\x2e\\xd4\\x45\\x41\\x0f\\x67\\xfa\\x10\\x4b\\x39\\xf0\\xfd\\xf3\\xc9\\xb5\\xc6\\x15\\x7b\\x76\\x80\\x37\\x56\\xb2\\x7f\\x4c\\x3b\\xa1\\xb4\\x7f\\x32\\x85\\x76\\x24\\x8e\\x9b\\xc5\\x3e\\x7b\\x8a\\xb0\\xb2\\xed\\x97\\xc2\\xf9\\x99\\x8b\\xcc\\x7d\\xfe\\x39\\xe2\\x64\\xaa\\xd3\\x0c\\x6c\\xfe\\xf2\\xb5\\x55\\x3f\\xfb\\x5a\\x69\\x9a\\xa4\\xbd\\x0e\\xab\\xe4\\x38\\xce\\x05\\x22\\xcc\\x91\\xfe\\x4e\\x72\\xbf\\x7e\\xac\\xba\\x47\\x71\\xcc\\xf6\\x3a\\x37\\xaa\\xfc\\xad\\xbf\\xbf\\x99\\xdd\\x76\\xb8\\x5b\\x80\\xee\\x07\\x5d\\x3a\\x7d\\x1a\\x90\\xa5\\x5b\\x77\\x29\\xa5\\x41\\x6e\\x5b\\xe6\\x96\\xbf\\x9f\\xb7\\xf3\\x15\\x8c\\xfd\\xb5\\xcf\\xda\\xcd\\xde\\x81\\x72\\xee\\x1a\\xb9\\x48\\x6e\\x24\\xcc\\xea\\xd2\\x9b\\x45\\x7a\\xcf\\x43\"},\n{{0xdb,0x89,0xdf,0x6a,0x23,0xd8,0x90,0xb7,0xf0,0x02,0x60,0xe8,0x1f,0x4a,0xd9,0x8f,0xd0,0x94,0x40,0x36,0x51,0x31,0xe8,0x5e,0x22,0xc7,0x95,0x1a,0x18,0x7b,0x02,0x18,},{0xc9,0x67,0x63,0x67,0x2e,0xe4,0xa2,0xcc,0x5a,0x93,0xb6,0xa6,0x83,0xdf,0x9b,0x5d,0xe4,0xd9,0x38,0x6a,0x79,0x08,0x35,0x68,0x1d,0x12,0x17,0xd1,0x92,0x96,0xbd,0xc8,},{0x80,0xb7,0xfc,0x8b,0x6a,0xe6,0xee,0xce,0x81,0x66,0xb7,0xea,0x53,0x4c,0xb5,0xb2,0x14,0xc9,0xea,0x99,0x73,0x92,0x1e,0xd0,0x5d,0xe4,0x0c,0x78,0xe1,0x4f,0x16,0x2b,0x09,0xe9,0x78,0xca,0x6d,0x86,0xee,0x43,0x4d,0x98,0x4b,0x8b,0x00,0x70,0x40,0x9d,0xd2,0xad,0x11,0xb5,0x31,0x78,0xe2,0x39,0xda,0xb5,0xbc,0x39,0xc7,0xba,0x46,0x0d,},\"\\x54\\xc1\\xc5\\x11\\x1e\\x08\\xc9\\x82\\x45\\xba\\x4f\\x13\\x18\\xba\\x1d\\xb1\\xdc\\xc7\\x4d\\x14\\xa5\\xc9\\x8a\\xb9\\x68\\x9c\\xba\\x1c\\x80\\x2c\\x68\\xbc\\xfc\\x81\\xfd\\x87\\xff\\xc6\\x1c\\xaa\\x94\\x2f\\x66\\xd7\\xe5\\x15\\x7f\\x65\\x53\\x8c\\x7e\\x7b\\x33\\x17\\x04\\x84\\xb4\\xb6\\x54\\x3f\\x36\\x20\\xff\\x29\\x63\\x8b\\x64\\xd4\\xda\\xe7\\xb0\\x22\\x21\\xcf\\x77\\x83\\xf1\\x87\\xec\\x42\\x31\\xe6\\xb6\\x94\\x6d\\x82\\x76\\x20\\x74\\xf0\\x9c\\x32\\x78\\x1c\\x2f\\x38\\x46\\xde\\x3e\\x82\\x17\\xf6\\xe1\\xb6\\xe0\\xd2\\xb5\\x59\\x5d\\x74\\x2e\\x2c\\x4e\\x32\\x5a\\x28\\x41\\x92\\x40\\x44\\xdf\\xcf\\x12\\xb4\\x79\\xeb\\x69\\xf1\\xbb\\xd4\\x0e\\xab\\xdd\\xd1\\xff\\x54\\xa9\\x18\\x4d\\x36\\x6d\\xff\\x9d\\x8f\\x2d\\x86\\x3e\\x37\\x8a\\x41\\xf1\\x0c\\xd1\\xda\\xe9\\x22\\xcd\\x7f\\xbb\\x2a\\x54\\x4e\\x47\\xea\\xbf\\x47\\xca\\x0a\\x38\\xab\\xba\\x34\\x45\\x49\\x19\\xbb\\x9a\\x4e\\xf0\\x44\\xbf\\xb9\\x7b\\x70\\x8c\\x2f\\x74\\x28\\xd6\\x8f\\x9c\\x57\\xc0\\xee\\x7e\\x79\\x25\\xf7\\xa2\\xb5\\xc6\\xe7\\xdf\\x82\\xbb\\x26\\x80\\xc8\\x62\\xdc\\x7c\\xc6\\x8b\\x0f\\x54\\x53\\x0e\\x64\\xaf\\xe2\\x76\\x3d\\x9c\\x7b\\xaf\\x45\\xcc\\x6f\\xe6\\x12\\xd1\\xf7\\x82\\x77\\x39\\xc4\\x41\\x13\\x98\\x88\\x8f\\x73\\x67\\xc3\\xd4\\x37\\x79\\x07\\xac\\xc0\\x6a\\x06\\xf9\\x3f\\x88\\x72\\x26\\x79\\x8f\\x48\\xaa\\x54\\x64\\xf6\\x01\\xc2\\xc1\\xed\\xda\\x77\\xed\\xfe\\xb9\\xb9\\xb5\\xd5\\xf9\\xcb\\x6f\\xed\\x37\\x90\\x05\\x47\\x47\\x7f\\xca\\x1d\\x09\\xab\\x52\\xd6\\x3e\\x49\\x1f\\xeb\\x12\\xfd\\x6d\\xc8\\x05\\xa7\\x8c\\xee\\x3b\\xaa\\xde\\x43\\x52\\x98\\x20\\x61\\xde\\xa5\\xa2\\x65\\x3d\\xb8\\xe7\\x60\\x77\\x72\\xe8\\x34\\xb3\\xa5\\x05\\xc1\\x6d\\xd6\\xe7\\xc7\\x1b\\x91\\x1e\\x84\\x2e\\xba\\x92\\x5d\\x77\\xa3\\x3c\\x5c\\x57\\xce\\x11\\x84\\x09\\x80\\x78\\xca\\x2e\\x6a\\x3f\\x69\\xaa\\x6a\\x14\\x63\\x9d\\xc9\\x7b\\x4b\\x30\\xc9\\x9d\\xc4\\xfa\\x3e\\x2c\\xf6\\x3c\\x70\\x1c\\x30\\x6c\\x5e\\x25\\x3c\\x51\\x13\\x85\\x4c\\x18\\x5e\\xbc\\x8b\\x47\\x98\\xf6\\x8d\\x1f\\xd7\\x80\\x05\\x4d\\x3e\\xed\\x2f\\x39\\x4c\\x45\\x43\\x04\\x96\\x6b\\xdd\\xbd\\x12\\x28\\x08\\x34\\xec\\x9b\\x40\\xc1\\xe9\\x8b\\xc2\\xd9\\x8f\\x48\\x45\\xf6\\xeb\\x44\\xf2\\x53\\x15\\xee\\xdb\\x3b\\x79\\xff\\xca\\x41\\x80\\xc1\\xbd\\xdd\\x97\\xd0\\xc9\\xaf\\xfb\\xac\\x58\\x81\\x49\\x37\\x68\\x26\\x80\\x07\\x6f\\xe5\\xa3\\xba\\xbb\\x65\\xd2\\x8f\\x25\\x17\\x03\\x6c\\x0c\\xfb\\x42\\xf0\\x29\\x3e\\xb2\\xac\\xb1\\x39\\x49\\xfe\\x91\\xe0\\xad\\x06\\x78\\xaa\\x24\\x3d\\x77\\x34\\xa8\\x9d\\x99\\x78\\x70\\xbf\\x9a\\x6a\\x58\\x4e\\xd6\\xe6\\x28\\x16\\x3e\\x39\\xd8\\xaa\\x61\\x0d\\x46\\xb9\\x28\\x5b\\x9e\\x1d\\xd7\\xe8\\xf8\\x07\\xfd\\xf5\\xca\\x2b\\xbf\\x6d\\xe5\\xe5\\xe6\\x8a\\xf7\\xcb\\x7e\\xbd\\x43\\xec\\xce\\x22\\x7c\\xd7\\x0c\\x7b\\xf4\\xee\\x14\\x33\\xed\\xfc\\xfe\\x88\\x66\\x14\\x67\\x0c\\xdd\\x19\\x63\\x43\\xfb\\x91\\xe1\\x54\\x16\\xd2\\xf6\\xac\\xba\\xe3\\xea\\xdc\\x03\\x02\\x31\\xee\\x9d\\x2e\\xcc\\x52\\xa8\\x8c\\xe8\\xdc\\x7d\\x09\\x8e\\x7f\\xac\\x77\\x68\\x5b\\x4e\\xb5\\x40\\xe3\\x01\\x93\\x07\\x14\\x32\\x21\\xb8\\xef\\x77\\xf3\\x63\\x2c\\x89\\x3d\\x55\\x6e\\x0b\\xb7\\x43\\xa1\\x96\\x3e\\xc1\\x58\\x86\\xc8\\x54\\x5e\\x87\\xc9\\x5c\\xc8\\x25\\xf2\\x00\\xd0\\xf3\\xcf\\x4f\\x55\\xa3\\xd6\\x60\\xa5\\x36\\xa2\\x3a\\xef\\xcc\\x42\\x8a\\x43\\x20\\x34\\x85\\xee\\x84\\x34\\x2f\\x5c\\x00\\x1e\\xe8\\x40\\x4e\\x75\\x90\\x17\\x00\\x62\\x82\\xab\\x8b\\xa8\\x90\\x3e\"},\n{{0x00,0xe6,0xbb,0x17,0xaf,0x3c,0x2d,0xf6,0x52,0xb3,0x4f,0x9a,0xbe,0x19,0xf9,0x90,0x19,0x07,0x42,0x33,0x68,0x6c,0x71,0x14,0xe3,0xa0,0xed,0xf0,0x83,0x09,0x93,0x4f,},{0x7b,0x82,0x32,0xa6,0x6c,0xec,0x2f,0x91,0x5a,0xaa,0x79,0x51,0xd2,0x9d,0x2b,0x9e,0xe9,0x3d,0x32,0x1d,0x15,0xb2,0x03,0xc5,0x1e,0x61,0xe8,0xce,0x83,0xd1,0x87,0xf8,},{0x04,0xb3,0xb8,0x50,0x1e,0x39,0x6c,0x4a,0x78,0x8e,0x14,0xac,0x49,0xf6,0x17,0x4c,0xdb,0x5c,0x85,0x5e,0x65,0x12,0x03,0xcf,0x68,0xd1,0xef,0xa8,0x9a,0xa5,0x86,0x78,0xd4,0xd1,0xf3,0x03,0xa9,0x87,0x7a,0x37,0x86,0xd2,0x03,0xc3,0x55,0xb0,0x9d,0x52,0x86,0xc1,0xca,0x0d,0xf0,0x4a,0x89,0xaa,0x06,0xcc,0x3f,0x9d,0x0f,0xd3,0x05,0x04,},\"\\x06\\x32\\x81\\xe4\\x1e\\x8b\\xa9\\x70\\x3e\\xd0\\x9e\\xf3\\xbf\\x0e\\xa4\\x6e\\x4c\\xab\\xdd\\x6e\\xbd\\x76\\x9d\\x05\\xdc\\x04\\x5d\\x4f\\x99\\x0d\\x69\\xfc\\x55\\x41\\x30\\xa4\\xe6\\x1a\\xa2\\x1e\\x2d\\xe4\\xc9\\x2d\\xb4\\x8a\\x20\\xa3\\x7b\\x17\\x47\\xa7\\xea\\xc5\\xeb\\xb2\\x73\\x5a\\x89\\x38\\x19\\x7f\\x13\\x9f\\xad\\x14\\x97\\xb3\\x51\\xad\\x06\\x4c\\x0f\\x18\\xf8\\xfa\\xf1\\xfe\\x11\\xf6\\x39\\x79\\xa6\\x99\\x68\\xe2\\x4c\\xf9\\x1e\\x58\\xa3\\xab\\x03\\x26\\x69\\xe4\\xef\\xee\\x27\\x4f\\x96\\xb5\\x8b\\xe7\\xd9\\xe3\\x91\\xf3\\x6f\\xcf\\x07\\x09\\xb2\\xcb\\x2d\\x22\\x69\\x4a\\x6c\\xeb\\x17\\x24\\x69\\x45\\xeb\\xb3\\xbc\\x7f\\x0f\\x03\\xbf\\x0b\\x08\\xdc\\x96\\x26\\xe3\\xe7\\x15\\xc9\\x91\\x67\\x1d\\x53\\xeb\\xb9\\xae\\x83\\xa7\\xd0\\x8d\\x44\\xf6\\x36\\x35\\xc4\\x0f\\x8d\\x48\\x17\\xf5\\x8d\\xe9\\xeb\\x77\\xcb\\x25\\xb2\\xac\\xd6\\xde\\xf9\\x69\\xab\\x56\\x9e\\x97\\x4a\\x8a\\xda\\xc1\\x1a\\x86\\xb5\\x8f\\xe6\\xc1\\x00\\x67\\x49\\x9f\\xc9\\x14\\xdf\\xf5\\x69\\x02\\xcb\\xc3\\x93\\xa7\\x1c\\xc2\\x5e\\x8f\\x05\\xc0\\x3c\\x94\\xf1\\x3b\\x84\\xa2\\xb0\\x1a\\x58\\xc1\\x0d\\xbc\\xbb\\x60\\xeb\\xce\\xe4\\x87\\xf5\\x29\\x17\\x74\\x66\\x29\\x99\\x25\\xda\\x50\\xe2\\xda\\x5b\\x55\\x57\\xf0\\xae\\xee\\x3f\\xd7\\xf4\\x7b\\x5c\\x2e\\x3f\\x84\\xce\\xfa\\xb4\\x67\\x96\\x91\\x39\\x4d\\xd1\\x22\\x30\\x3b\\xb7\\x69\\xaf\\xb3\\xad\\xfe\\x83\\x58\\xb0\\x2b\\x67\\x92\\x73\\xb3\\x5a\\xbd\\xc6\\x40\\x25\\x76\\xcc\\xce\\x5e\\x10\\x44\\x2a\\x13\\x7e\\xf9\\x45\\x69\\x39\\xb2\\x89\\xef\\x4e\\x41\\x7b\\x1c\\xc6\\x23\\x9f\\x7c\\xee\\xdd\\x68\\xf1\\xa8\\x26\\x41\\x80\\xe0\\x68\\xb4\\x96\\x6f\\xd6\\x7f\\x2b\\xad\\x6e\\xdd\\x8b\\x4a\\x1e\\x8d\\x2b\\x54\\x2d\\xaf\\x26\\xdb\\x83\\x1f\\x1f\\xb5\\x1e\\xb8\\x6f\\xfa\\xde\\xcc\\xd9\\xac\\x3d\\x66\\x4f\\x34\\x6e\\x7d\\x04\\x6c\\x33\\xa5\\x72\\x84\\x1e\\xa8\\x33\\x4e\\x7f\\x2f\\x41\\x7a\\x05\\x71\\x2a\\x9e\\x33\\x4e\\x48\\x7f\\xd3\\xae\\x17\\x54\\x55\\x16\\x2f\\xe8\\xf4\\x9c\\xc0\\x26\\xa6\\x40\\xc6\\xcf\\x93\\xcf\\x58\\x87\\x50\\x52\\xf4\\x1c\\xc9\\x82\\x06\\x15\\x65\\x3e\\xa2\\xd0\\x84\\xc8\\x96\\xea\\xfe\\x5a\\xd4\\x72\\x55\\x79\\x65\\x30\\x84\\x99\\x4f\\x95\\x6d\\x5c\\x94\\x59\\x0a\\x24\\x09\\x58\\x1b\\x6f\\xc8\\x6e\\x40\\xaa\\x58\\xbf\\x6e\\x60\\x57\\xa6\\xf9\\x0a\\xf3\\xb8\\x7a\\xea\\xf3\\x29\\x94\\xa5\\x5a\\x54\\xf7\\x9b\\xdf\\x3d\\xbb\\xf5\\xce\\x0f\\xf8\\x12\\xe4\\x86\\xb0\\x54\\x5d\\x9e\\x9c\\x2b\\x0b\\xce\\x0d\\x4c\\x36\\x47\\xb1\\x82\\x72\\x62\\x49\\x88\\x34\\xe1\\x98\\xa3\\xec\\x70\\xf3\\xb0\\x3d\\x6a\\xad\\x2c\\x49\\xeb\\x80\\xb5\\xe2\\x05\\x14\\x39\\x22\\x5f\\xd9\\xce\\x94\\x68\\xd6\\x9a\\xf7\\x0a\\x26\\x2e\\xe3\\xb8\\xb6\\x2a\\x8e\\x5b\\x41\\x34\\x6d\\xa3\\x01\\x2f\\xfb\\x45\\x81\\x6b\\x7b\\xec\\xb0\\xe7\\x9a\\x60\\xbf\\xf7\\x16\\x36\\xa3\\xe4\\xbb\\x1b\\x35\\xca\\xf1\\x95\\xf5\\x51\\x17\\x28\\x0f\\x78\\x72\\x17\\xb3\\xca\\xa2\\xe7\\x93\\x72\\x6f\\xc5\\xa7\\x4d\\x11\\x60\\xdc\\xad\\x86\\x89\\x04\\xc1\\x97\\x38\\x11\\x34\\xed\\x8c\\x3d\\xb3\\x75\\x0b\\x75\\x56\\xf6\\x9c\\xcc\\xe1\\x8b\\x77\\x38\\x8b\\x58\\xc5\\xb8\\x11\\x3e\\x59\\x0a\\xd6\\xea\\xc5\\xb9\\x1e\\xce\\x5a\\x67\\x05\\x02\\x5c\\x80\\x35\\x3c\\xeb\\x1e\\xd8\\x4a\\xaa\\x1c\\xc4\\x8a\\x41\\x6b\\xc0\\x16\\xae\\xf1\\x73\\xbb\\x80\\xb2\\xba\\x28\\xc5\\x79\\x60\\xc6\\xb0\\x11\\xb6\\xb4\\x95\\xa3\\xf3\\x31\\x1e\\x79\\xfe\\x46\\xbd\\xb6\\xa4\\xc3\\x81\\xfb\\x9d\\xc4\\x62\\x8b\\x0a\\x83\\x02\\x35\\x58\\xf1\"},\n{{0xfb,0xdd,0xf6,0xe6,0x1e,0x20,0xd8,0x06,0xe5,0x59,0x17,0x75,0x6d,0xe6,0x0d,0x0c,0x9a,0x99,0x97,0x6f,0x64,0x67,0x16,0xff,0x2f,0xf1,0x31,0x2c,0x54,0xdd,0x97,0x1d,},{0xac,0x53,0x8f,0xab,0xad,0x43,0x80,0xe6,0x0e,0x97,0x71,0x26,0xe7,0x69,0x5e,0xed,0xa5,0x41,0x7d,0x85,0xf7,0xd2,0x3d,0xb2,0x1b,0xd0,0xad,0x11,0x11,0x16,0xf0,0x5d,},{0x8c,0x9b,0x77,0xaa,0x0f,0x1c,0xf5,0x2e,0x8f,0x7a,0x91,0x8b,0x21,0xb4,0x68,0xe6,0x23,0x35,0x91,0x1b,0xc5,0x93,0x06,0xb3,0x0c,0xe7,0x7b,0xf6,0x92,0xc1,0x10,0x59,0xb0,0xee,0x9c,0x5d,0xaa,0xf6,0x83,0x9b,0xb8,0x13,0x73,0xc6,0x1d,0x28,0xd0,0x72,0x70,0x2b,0x59,0x5e,0x4d,0xce,0x28,0xcb,0x99,0x38,0x22,0xb2,0x48,0x13,0x04,0x0b,},\"\\x3e\\x99\\x53\\xca\\x55\\xd0\\xcd\\x23\\x3b\\x98\\x83\\x3e\\xb1\\xbc\\x79\\xd3\\xb5\\x5f\\x18\\xc8\\xfa\\x1c\\x42\\x02\\x7b\\xca\\x25\\x57\\x91\\x53\\xb5\\x5d\\xa0\\xc5\\xa1\\x78\\xb8\\x38\\x69\\x56\\xd9\\xa5\\x41\\x83\\xb2\\x4c\\x91\\xdc\\x4b\\xe9\\x94\\x84\\x72\\x37\\xd3\\x66\\x6a\\x0a\\x01\\x30\\xfe\\x19\\x92\\x4b\\xc0\\xee\\x50\\x89\\x6c\\x35\\xa2\\xe1\\x6a\\x29\\xe2\\xe2\\xac\\xf1\\x80\\xbd\\xd9\\x37\\x93\\x54\\x68\\x7f\\x0e\\xce\\x68\\x82\\xd2\\x6e\\x98\\x0e\\x68\\x66\\x98\\x04\\x3b\\xb1\\xb0\\x12\\x13\\xaa\\x64\\x4a\\x4f\\x8d\\x61\\xf9\\xb6\\x13\\xe6\\x2e\\xaa\\x35\\x76\\xce\\xa0\\xb0\\xb8\\x3f\\x05\\xce\\x25\\x58\\xff\\x63\\x56\\x49\\x5c\\x45\\xed\\xe4\\xa8\\xf6\\x5b\\x81\\x4a\\xb8\\xa7\\x30\\x94\\x03\\xdf\\xd4\\x3c\\xbe\\xa9\\x08\\x93\\x93\\x9b\\x78\\x00\\xaa\\x00\\x23\\x2b\\x5f\\x6b\\x77\\x14\\xeb\\xdc\\xd8\\xbc\\xf3\\x4a\\x5a\\x7e\\x82\\x2a\\xc7\\xb1\\xb0\\x99\\xac\\x61\\x5f\\x13\\x5f\\x8c\\x35\\x1d\\xc4\\x1a\\xe5\\xf6\\x6d\\x5f\\x9c\\x26\\x00\\x45\\x4c\\xa0\\x1c\\x00\\x9b\\xa6\\xde\\x04\\x16\\x2a\\xe5\\xf1\\xf2\\x70\\x89\\x3c\\xa3\\x90\\x7a\\xff\\x7f\\x78\\xe0\\x33\\x96\\xe3\\x2b\\x62\\x2f\\xf3\\x40\\x53\\x7b\\xf1\\x23\\xe5\\x59\\x95\\xe9\\x20\\x96\\x09\\x33\\x0b\\x2e\\xee\\x51\\x12\\x74\\x84\\xa4\\x0e\\x25\\x07\\x00\\x82\\x3f\\xeb\\x0b\\xc9\\x7b\\xb5\\x09\\xff\\x73\\x26\\x75\\xde\\xc3\\x2e\\xcb\\x63\\x5e\\xd9\\x2c\\x7d\\x78\\xfe\\x30\\x50\\x20\\x0c\\xf1\\xd9\\x41\\xd6\\xb3\\x88\\x80\\x0a\\x84\\x19\\xd9\\x6a\\x59\\x5e\\xce\\xd5\\xec\\x4e\\xfd\\xcb\\x6f\\x98\\x7f\\x54\\x72\\xa5\\xc4\\x30\\x58\\xd3\\xa3\\xa7\\xbb\\x56\\xd7\\x98\\x03\\x65\\xed\\x43\\xdb\\xc2\\xbe\\x48\\xf1\\xd1\\x8c\\xe7\\x6a\\x89\\x18\\x54\\x26\\xfd\\x5c\\x69\\xdf\\x7e\\x92\\x91\\xab\\x78\\x23\\xc2\\x3a\\x76\\x94\\x1e\\xd3\\x83\\x6a\\xac\\x7b\\x58\\xc0\\xd5\\xfb\\x6b\\x63\\x6c\\x42\\x47\\x1a\\x4d\\x17\\x03\\x51\\x6f\\x03\\xe9\\x35\\xf3\\x1f\\x19\\x54\\x50\\xe5\\x37\\xb2\\xa0\\x7d\\x54\\x5b\\xa4\\xb6\\x8a\\xfb\\x06\\x38\\xc6\\x5b\\xb0\\xff\\xaa\\x0c\\xfd\\x69\\xd7\\x10\\x48\\x19\\x79\\x66\\x19\\xd4\\x83\\xa0\\x24\\x5b\\x4f\\xd9\\x01\\x7f\\x62\\xa7\\xd3\\xa5\\xfc\\x3b\\x72\\x89\\xd7\\x57\\x35\\xf2\\x87\\xca\\x0a\\x95\\x1a\\xd5\\x83\\x44\\xb2\\xab\\x7d\\x7d\\xf8\\xdb\\xd7\\x92\\x2a\\x5a\\xbb\\x8d\\x7c\\x2e\\x79\\x14\\x7e\\x6d\\x36\\xee\\x31\\xf9\\x30\\x47\\x3b\\x07\\x27\\xdc\\xfd\\x58\\xd6\\x44\\xd7\\xd7\\x0a\\x0e\\xd3\\x1c\\xa6\\xa1\\x3e\\xd9\\xdb\\xd2\\x24\\x49\\x2e\\xfd\\xa1\\x9e\\x4f\\x8e\\xed\\x46\\x18\\x0f\\xe7\\x50\\xf0\\x7b\\xbe\\x8e\\x99\\x85\\x4d\\x13\\xf5\\x8b\\xa9\\x68\\xce\\x38\\x59\\xd6\\x11\\x89\\xcd\\x2b\\x66\\x7f\\x3b\\x2d\\x06\\x65\\xb5\\x74\\xc4\\xba\\xc1\\x9d\\x9e\\x37\\xe5\\xb7\\xa8\\x0e\\xb3\\x34\\xe3\\x68\\x10\\x53\\x0a\\xa5\\xd1\\x76\\x63\\x93\\xf8\\x11\\x5a\\x52\\x09\\x0c\\x91\\x82\\x34\\x28\\xc8\\x97\\xa5\\xf3\\x5e\\x12\\xa8\\xaf\\x2c\\xd4\\xfb\\x13\\x90\\x7c\\xa6\\x60\\x3a\\x4f\\x76\\xf5\\xc2\\xe0\\x23\\x74\\xa8\\xdc\\x3a\\x47\\xc1\\xbe\\x6f\\x1d\\x1c\\x8e\\xbc\\x59\\xb3\\x6d\\x1c\\xfa\\x0a\\xb2\\x3e\\x9b\\x0a\\xe9\\xb0\\xe6\\x37\\xee\\xed\\xb9\\xc6\\x6b\\xea\\x62\\xdc\\x63\\x0c\\xde\\xfa\\x71\\x82\\x39\\x61\\x7e\\x31\\x18\\xe5\\xb6\\xde\\xb7\\xc2\\x94\\x47\\x52\\x82\\xe8\\xab\\xe2\\x4f\\xd5\\xa5\\x4b\\x78\\x6f\\xff\\x90\\x28\\xc5\\xa0\\x33\\x38\\x4e\\x4b\\xc8\\x01\\x4d\\xec\\x8d\\xa1\\x00\\xa9\\x4b\\x17\\x8e\\xf8\\x8e\\xc3\\x57\\xb6\\x6d\\x2b\\x90\\x98\\xab\\x64\\x79\\x16\\x96\\xb1\\xa6\\x6b\"},\n{{0x8a,0x55,0xe7,0x7b,0xb0,0xc8,0x74,0x0b,0x8c,0x2e,0x8d,0xdf,0xdf,0xdb,0x40,0xf2,0x7e,0x45,0xfe,0x81,0xfe,0x45,0x71,0x11,0xbf,0x1c,0x87,0x30,0xea,0xb6,0x16,0xb4,},{0x9f,0xf1,0xfd,0x0c,0x50,0xeb,0x24,0xf9,0x9f,0xe2,0xf7,0x71,0x1d,0x52,0x87,0x2d,0xfc,0x90,0x03,0x80,0xdd,0xdc,0xdb,0x86,0xfe,0x6f,0x4a,0x5f,0x35,0x0a,0x87,0x43,},{0x8a,0xae,0xba,0x53,0x5c,0x51,0x1c,0x31,0xd3,0xf8,0xe9,0x5c,0xb0,0x77,0xa9,0xa7,0xec,0x7d,0x08,0x44,0x1e,0x53,0x42,0xa6,0xab,0xe0,0xbf,0x2a,0x5d,0x7f,0xc9,0x30,0xb4,0x3d,0xac,0x3d,0x1e,0x8e,0xf2,0xcb,0x03,0x45,0x52,0xeb,0x4d,0x08,0x39,0xbc,0x8b,0xf2,0x94,0x55,0x1d,0xd2,0xd8,0x0c,0x53,0xfd,0x62,0x79,0x35,0x1a,0xc2,0x0c,},\"\\x20\\xfb\\x41\\x4e\\x26\\x4a\\x95\\x47\\x84\\xf1\\x12\\xba\\xce\\x7e\\x04\\x74\\xb3\\x9c\\xb3\\xc9\\xe5\\x3d\\xee\\x0a\\x21\\xf4\\xcf\\x6d\\x4a\\x99\\xb9\\x34\\x7d\\xdf\\xfb\\xe2\\x81\\xa6\\xc2\\x30\\xa7\\x5d\\x63\\xa7\\x2f\\xd0\\x5f\\x6d\\xb5\\x3e\\xa7\\x01\\x4e\\xf7\\x70\\x9d\\x18\\xff\\x97\\x0f\\x48\\x5f\\xe8\\x3b\\xa1\\xd3\\x71\\x47\\x33\\x8a\\xde\\xd6\\xda\\x4c\\xfd\\xac\\xc1\\xe6\\x9d\\x2f\\x3e\\x0e\\xf3\\x62\\xf4\\x7b\\x5b\\xcf\\xb7\\x8a\\x1e\\x17\\x9e\\xb5\\xc5\\xb1\\x06\\xc8\\xd8\\x2a\\x0a\\x0b\\x29\\x0d\\xf0\\x75\\xab\\x27\\x43\\x69\\x29\\xcd\\xe6\\x56\\xf0\\x23\\x09\\xf9\\x57\\x50\\xeb\\x67\\x65\\x83\\x26\\x2e\\x5f\\x2f\\x69\\xf0\\xff\\x72\\xa8\\xe0\\x57\\x26\\x63\\x82\\x26\\x92\\x05\\x31\\x87\\x40\\xbf\\xe0\\x6b\\xf5\\xc2\\xcb\\x45\\x33\\x90\\x8e\\xf9\\xf9\\xf2\\x86\\x9a\\x75\\xb9\\x53\\x35\\x79\\x82\\x0e\\x3b\\xc0\\xca\\xff\\xd6\\x46\\x17\\x1c\\x82\\x86\\xc3\\xa4\\xab\\xa1\\xff\\x09\\x15\\xd9\\x36\\x11\\x20\\x5e\\x23\\x0f\\x39\\xff\\x4c\\x4c\\xaf\\x3f\\x33\\x3e\\x75\\x3f\\xce\\x2b\\x71\\x21\\x3e\\x53\\xd6\\x08\\x41\\x5e\\xe1\\x7f\\xd4\\x82\\x12\\xee\\xdd\\x88\\x40\\xf3\\x37\\x10\\x1e\\xf0\\xd0\\xb6\\xf7\\xbe\\x4b\\xff\\xc0\\x6e\\xee\\xfe\\x80\\x66\\xdd\\x27\\xa0\\x54\\x1a\\x46\\x88\\x31\\xac\\xdd\\xc4\\x90\\x2e\\x2f\\xef\\xef\\xbe\\xd1\\x9c\\x30\\x8e\\x56\\x21\\xe0\\xbf\\x46\\xbc\\xd5\\x38\\xaa\\x13\\xfa\\xf0\\x4d\\x38\\x07\\x59\\xc0\\xe1\\x07\\xe9\\x12\\x00\\x18\\x39\\xdf\\xd0\\xb6\\x35\\x44\\x0e\\x96\\x38\\xf5\\x37\\x7c\\xa8\\x45\\x0f\\x35\\x0c\\x01\\x12\\x9e\\xe3\\x37\\x64\\x41\\x5c\\x53\\xcb\\x2f\\xfb\\xf9\\x68\\xdf\\x78\\xb7\\x42\\xfd\\x06\\x65\\xe7\\x8a\\x34\\xab\\xf4\\xde\\xcd\\x1f\\xd3\\x86\\x28\\x9a\\x13\\x64\\xe6\\x45\\x55\\xee\\xc5\\x8b\\x0a\\xf9\\xa4\\xcd\\x6b\\x36\\xd1\\xd5\\xc6\\x11\\xa2\\x84\\x6d\\xfb\\x55\\x89\\x34\\x4b\\xbb\\xb0\\x25\\x60\\x24\\x1b\\x74\\xb9\\x93\\xa2\\x5b\\xef\\x50\\xfb\\x1e\\x73\\x19\\x08\\x6e\\x6a\\x23\\x98\\x63\\x00\\x83\\x4e\\xd2\\xdb\\xa9\\x8a\\x16\\x87\\x21\\xc2\\xf7\\x84\\xdf\\xb8\\xd3\\x80\\x0d\\x06\\xa0\\x54\\xae\\xf1\\x4d\\x17\\x72\\xb6\\xc5\\x74\\xaf\\x25\\x63\\xd1\\x93\\xef\\x2e\\x51\\xbd\\xc6\\x2d\\x2a\\xbc\\xe2\\xee\\xbe\\xad\\xa7\\x92\\x03\\x49\\x8e\\x66\\x86\\xc2\\x87\\xf3\\x7b\\xd8\\x8a\\xeb\\x16\\x6f\\x7d\\xff\\xc3\\xe6\\xad\\x02\\x94\\x11\\x7e\\xf6\\xee\\x9d\\xa8\\x47\\x9e\\xd8\\xa1\\x6f\\xe9\\xbe\\x24\\x6d\\x26\\x68\\x04\\xf2\\x96\\x58\\xdb\\x75\\xe7\\xa0\\x87\\x3b\\xe7\\x1d\\xc7\\xd4\\x07\\xe3\\x9f\\xab\\xd6\\x6f\\x98\\x8b\\x45\\x74\\x77\\x42\\x7f\\xad\\x81\\x30\\xf0\\x9a\\xb6\\x65\\xf1\\x59\\x7c\\x90\\x46\\xe7\\x37\\x3a\\xf9\\xa8\\x35\\x2a\\x86\\x83\\x0c\\xb9\\x2a\\x80\\x44\\x88\\x70\\x0f\\xe6\\x89\\x19\\x24\\xfe\\x2a\\x72\\x01\\x73\\x3d\\x95\\xe5\\x91\\xee\\x0a\\x1f\\xef\\x1c\\x26\\x36\\x07\\x8d\\x37\\x0e\\x7a\\xd3\\xb6\\xa9\\x44\\xfe\\xd2\\xcf\\x2b\\x30\\xab\\xa2\\xd5\\x6f\\x34\\x95\\xb2\\x84\\x9c\\x03\\xbb\\x61\\x4f\\x48\\xbc\\x4e\\x50\\x7c\\x39\\x5a\\x6c\\x35\\xd3\\xee\\xd4\\xc7\\xbe\\x8e\\x68\\x0f\\x2d\\x45\\xa3\\x10\\xb1\\x87\\xeb\\x88\\xcf\\x0e\\x8e\\xd4\\xde\\x7d\\x37\\x24\\x6a\\x50\\xa6\\x36\\x7b\\x97\\xee\\x37\\x84\\x32\\x2c\\x0b\\x71\\x13\\x1a\\x28\\x31\\x98\\xda\\x48\\x04\\xde\\x75\\x1d\\xcf\\x70\\xc4\\xba\\xd0\\x0d\\xd9\\x8d\\x87\\x3a\\x69\\xdd\\x1a\\x09\\xcf\\x69\\xdd\\xfa\\xd7\\xae\\x60\\x35\\x00\\xb6\\xa4\\x62\\x25\\x80\\x98\\xd8\\xb6\\x6b\\x85\\x29\\x35\\x94\\xe2\\x08\\x82\\x9b\\x52\\x28\\xfa\\xe2\\xfa\\xfc\\x39\"},\n{{0x16,0x3b,0x0c,0xb6,0xa1,0x2e,0x8f,0x07,0xb0,0xc2,0x9d,0x6a,0x63,0xf6,0xa6,0x52,0xce,0x49,0x72,0x70,0xb5,0xe4,0x6f,0xcf,0x83,0x3c,0x99,0xbd,0x84,0x3f,0x8c,0x64,},{0x68,0xa3,0x5d,0xe4,0xba,0x6f,0x0f,0x82,0xec,0xf4,0xb1,0xe0,0xdf,0x8e,0x24,0xcb,0x4f,0x18,0xf2,0x10,0x3f,0xf0,0x4d,0xc1,0xb5,0x33,0x39,0x91,0xb6,0xd3,0x14,0xba,},{0x17,0x73,0x8f,0x57,0x26,0x55,0x07,0x80,0x65,0x1d,0x60,0x19,0x9f,0xda,0x39,0xd9,0xc4,0x76,0x8d,0xb5,0x91,0x7e,0x32,0x39,0x36,0x31,0xc5,0x4a,0x41,0x9d,0x59,0xf1,0x8e,0xf9,0x60,0xdd,0xd4,0x39,0x38,0x0d,0xab,0xc3,0x14,0x76,0x1b,0xd0,0xcd,0xb5,0x7c,0xce,0x48,0x1e,0x61,0x09,0xfe,0xd0,0x95,0xde,0xa6,0xe8,0x65,0xaa,0x67,0x0b,},\"\\x56\\xa1\\x60\\x3f\\x72\\x5b\\xe0\\x76\\x13\\x05\\x8c\\xdb\\x3a\\xcd\\xc5\\x23\\x54\\xe3\\xbb\\x1f\\xf2\\xbe\\xd1\\x3f\\x89\\x51\\x75\\xb1\\x5c\\x8c\\x5a\\x90\\xff\\xbe\\x46\\xb1\\x1a\\x06\\xcf\\xe3\\x62\\xda\\xdf\\x73\\x23\\xc9\\x40\\x41\\x72\\x55\\xaa\\x7a\\xa5\\x43\\x12\\x10\\x3e\\x71\\x46\\x3d\\xaa\\x0b\\x5c\\xda\\xeb\\xd0\\xbe\\x72\\x3c\\x73\\x22\\x73\\xe3\\xc3\\xf5\\xbf\\x7a\\xa3\\x51\\x9d\\x69\\xdf\\x6f\\x47\\x70\\xda\\xa1\\xdf\\x82\\x80\\xbb\\x3c\\xd2\\xc7\\x14\\xac\\x03\\x02\\x00\\x54\\x65\\x79\\xf5\\x6c\\x60\\xb9\\x1a\\xe1\\x1f\\x4c\\xf8\\x74\\xa3\\x5f\\xc5\\x9b\\x35\\x4b\\xed\\x80\\xf5\\x6e\\x11\\xa6\\xcd\\x62\\xa8\\x8c\\xe6\\xb4\\xf6\\xbf\\x39\\xd6\\x4c\\xe3\\xd8\\x04\\x09\\x82\\x5f\\x90\\x16\\x2c\\x3d\\x96\\xd1\\x0e\\x47\\x86\\x07\\x36\\x5f\\x7a\\x24\\x1e\\x71\\xaf\\x98\\x00\\x42\\xfe\\xc2\\xd6\\x88\\x91\\xe0\\xc8\\xa3\\x7c\\x58\\xec\\x4e\\x60\\x0f\\xd5\\x81\\xe7\\x90\\xb0\\xaa\\xe8\\xe0\\x9f\\x35\\xd4\\xcc\\x18\\x76\\xdf\\x43\\x4b\\x80\\xee\\xe0\\x53\\x69\\xf8\\x48\\xfc\\x49\\x30\\x57\\x7d\\x16\\x84\\x27\\x58\\x88\\xf3\\x25\\x9c\\xb4\\x73\\x76\\xc5\\x16\\x9c\\x99\\x37\\xf8\\x55\\xa9\\x6a\\x9e\\x74\\x8a\\xd0\\xa6\\x9a\\xe4\\xab\\x2f\\x2f\\x17\\x44\\xa3\\x92\\xf9\\xac\\xc6\\x20\\x99\\x75\\xb7\\x84\\x98\\x4c\\xb1\\x2f\\x98\\x29\\x2c\\x36\\xa5\\x32\\x21\\x99\\x4a\\xbc\\x56\\xf9\\xa6\\x6d\\xae\\x45\\x60\\xb7\\x93\\x56\\xff\\x47\\xe1\\x28\\xc0\\x79\\x6a\\x7f\\xb0\\xe0\\xbb\\xc9\\x60\\x0a\\xf4\\x8e\\x49\\xea\\xa9\\x42\\x7c\\xf6\\xeb\\x66\\x20\\xb1\\x0c\\xd2\\xc0\\x85\\xb0\\xb3\\x42\\x00\\x4d\\x5b\\x0d\\x3e\\xdc\\x11\\xd2\\x92\\x42\\xa4\\x63\\x87\\x80\\x76\\x2c\\x9d\\xc6\\x06\\x9b\\x66\\xbd\\x84\\x97\\x3b\\x50\\x11\\x96\\x1c\\xe5\\x6d\\xb5\\x8b\\xda\\xf4\\x8e\\x6b\\xe1\\x2a\\xb9\\xad\\x24\\x41\\x62\\x97\\x00\\x4d\\x02\\x91\\x4b\\x95\\x9f\\x54\\xe0\\x92\\xf8\\xcd\\x43\\x65\\xfa\\x6a\\xb7\\x8d\\xdb\\xff\\x4c\\xe8\\xda\\xd4\\xe2\\xf5\\x3a\\x05\\xc0\\xcc\\x49\\x9b\\xfb\\x47\\x81\\x4a\\x27\\x13\\x55\\x1d\\xcd\\x19\\xd4\\x47\\xf6\\x27\\x57\\x6e\\xa4\\xea\\x4b\\xbd\\xa8\\xba\\xe1\\x8a\\x64\\x65\\xce\\xd7\\x47\\xea\\x17\\x18\\x0b\\x00\\x9f\\x01\\x21\\x21\\x60\\x48\\x2b\\x04\\x33\\xaa\\xc6\\x8e\\x67\\x64\\x4d\\x00\\xf4\\x1f\\xdf\\x99\\x90\\xb9\\xe1\\x11\\x17\\x63\\x4d\\xeb\\x13\\x9b\\x1a\\x40\\xad\\x3f\\xce\\x42\\x99\\xa1\\x7f\\xe1\\xdd\\x22\\x53\\x01\\xc7\\xf8\\xd8\\x01\\x0a\\x79\\x6d\\xc7\\x9c\\x13\\x30\\x7d\\x3f\\xf9\\x92\\xa8\\x8b\\xe6\\x64\\xd4\\xc8\\x86\\xd6\\x8c\\xa9\\xe4\\x47\\x0c\\xfb\\xe6\\x3e\\xbf\\xfc\\x42\\x40\\x10\\xe3\\x72\\xb6\\x92\\x2a\\xa9\\x5c\\x80\\x1d\\x1e\\x94\\x06\\xda\\x4b\\xc1\\x88\\xca\\x82\\x06\\x64\\x05\\xbc\\xdb\\x3e\\xaf\\xc9\\x37\\x62\\x9b\\x32\\x63\\xdc\\x7d\\x50\\xee\\x52\\x78\\xcc\\xec\\x6f\\x11\\xd5\\x51\\x7f\\x56\\xbc\\x26\\x9c\\x87\\x36\\x91\\xe7\\xeb\\x53\\xfa\\xef\\xf0\\x75\\x64\\xab\\x46\\xb4\\x03\\xf1\\x5d\\x9e\\x0e\\x69\\x24\\x86\\xee\\x09\\x8e\\x7b\\x51\\xb4\\x28\\x13\\x46\\x9b\\x82\\x35\\x04\\x22\\x33\\xca\\x3f\\x9c\\x4f\\x8f\\xf2\\x4a\\x57\\x1f\\x47\\xe0\\xad\\xf9\\x14\\x4a\\xea\\x48\\x8a\\x2d\\x2d\\xd0\\x01\\xe3\\x1f\\xc9\\x61\\xe0\\x5c\\x3e\\x85\\xf0\\xd9\\x81\\x40\\x7c\\x87\\x31\\x58\\xbb\\x0d\\x35\\xba\\xfe\\x4b\\x60\\x42\\x2e\\x67\\x55\\x1e\\x97\\x01\\x65\\xce\\x3f\\xc5\\x99\\xd0\\xfc\\xc9\\x2b\\x16\\xac\\x36\\xa9\\x2b\\x2c\\x1d\\xc6\\xb3\\xf0\\x33\\xfe\\x31\\x0c\\xd1\\x96\\xda\\x04\\xa4\\xe6\\x39\\x03\\x11\\x77\\xcd\\x27\\xd7\\xc2\\xfb\\xec\\x65\\xa0\\x0b\"},\n{{0x8c,0x83,0x93,0x81,0xb6,0xa7,0xce,0x26,0x49,0xc1,0xea,0x46,0x4a,0xe3,0xc2,0xd3,0xfd,0xb1,0xec,0x66,0x6d,0x7b,0x4b,0xe4,0xe2,0xa9,0x41,0xab,0x6d,0x65,0x57,0xa7,},{0x5c,0x72,0x4a,0x30,0xc6,0xfb,0x32,0x81,0x53,0x43,0xa8,0x0d,0xde,0xe6,0xee,0xe5,0x44,0x51,0x64,0x18,0xea,0x95,0xe1,0xba,0xc8,0x0a,0xfc,0x80,0x40,0xd6,0x3f,0xc6,},{0x5d,0x21,0x10,0xd1,0xd2,0xf3,0xed,0xd6,0x83,0xbd,0xfd,0xbe,0xa3,0xff,0xa7,0xcf,0x55,0x28,0xa4,0x0b,0x8b,0x3d,0x8d,0x8c,0x9b,0xfd,0x22,0xae,0xac,0x28,0xba,0xd4,0x71,0x66,0x6e,0x06,0x2f,0x7d,0x38,0xce,0xda,0x8b,0xb3,0x73,0x97,0xa1,0xc5,0xc3,0xf7,0x33,0xb5,0x37,0x96,0x70,0x45,0x70,0x64,0x78,0x43,0x7d,0x4d,0x18,0x7a,0x0a,},\"\\xcb\\xcf\\x89\\xc3\\x54\\x89\\x64\\xc3\\x8d\\x70\\xfd\\x8f\\x68\\xe8\\xec\\xe3\\x6c\\xc3\\x97\\x55\\xc9\\x71\\xd1\\x4d\\x7e\\x05\\x6f\\x39\\xb0\\x23\\xef\\x16\\x6d\\x17\\xf2\\x43\\x85\\x22\\xf0\\x10\\xd6\\xd8\\x35\\xd8\\x86\\xe7\\x1f\\x47\\x4c\\x67\\x27\\xa4\\x22\\x1f\\xd0\\x3a\\x75\\x74\\x57\\x82\\x89\\xed\\x54\\x93\\xac\\x4c\\x09\\x47\\xe3\\xf4\\x28\\xd8\\xfe\\x06\\x40\\x06\\xa2\\x56\\xce\\xf2\\x18\\x11\\xd7\\x26\\x78\\xf5\\xdf\\xc6\\xba\\x66\\xac\\x29\\xec\\xd1\\xb3\\x2f\\xf5\\x55\\x7c\\xb0\\x8c\\x5f\\x13\\x05\\x59\\x21\\x7a\\x04\\x13\\xb7\\x59\\xc2\\x4d\\x83\\x38\\x8a\\x2b\\xb9\\xb2\\x9b\\x6b\\x91\\xd1\\xf3\\x10\\x1e\\xd6\\x25\\x21\\x1e\\x4d\\x73\\x80\\x51\\x93\\x47\\x8c\\xf9\\x95\\x39\\x6c\\x10\\xb1\\xc5\\xaf\\xfa\\xcb\\x00\\x89\\x9d\\xa0\\x4e\\x3c\\xce\\x19\\x3b\\x49\\x4e\\x2a\\x93\\x3c\\x4e\\xeb\\xe0\\xa3\\x7b\\xfb\\x8f\\x1b\\x83\\x71\\xbd\\xe5\\xfd\\xa0\\x9e\\x80\\x4e\\x94\\x0f\\x34\\x48\\x96\\xa5\\x29\\x46\\x7a\\xde\\xe4\\x5a\\x8f\\xeb\\xf8\\x5a\\xb0\\x36\\xca\\xb8\\x80\\x14\\x3b\\xe4\\xf5\\x9b\\x77\\x41\\xd8\\xe4\\x50\\x27\\x8b\\x06\\x36\\x55\\x78\\xd4\\x0b\\x19\\xdc\\xec\\xc6\\xe1\\xee\\x3d\\xa3\\x4a\\xb2\\x90\\x13\\xfa\\x3a\\xf7\\x72\\x92\\x72\\x96\\x21\\x10\\xe3\\x85\\xab\\x9a\\x02\\x2f\\xae\\x41\\x46\\xf8\\x97\\x16\\xf7\\xba\\xb9\\xd3\\xdc\\x68\\x2f\\x4f\\xac\\x77\\x36\\xd3\\xe0\\x89\\x73\\xc6\\x85\\xbb\\xb2\\x75\\xbb\\xf8\\xf2\\x17\\x41\\x9e\\x5c\\xae\\x02\\x19\\xeb\\xa5\\x16\\x6a\\x5d\\xe1\\xb1\\x1e\\x3f\\x9a\\x90\\x8b\\x8a\\xc7\\xe6\\x5b\\xcd\\x62\\x3f\\x8c\\x18\\xbb\\x02\\x4f\\x60\\x5d\\xcb\\xac\\xda\\x79\\x0d\\x83\\x62\\x95\\x74\\x44\\xa9\\x5c\\x13\\x0a\\x37\\xee\\x9d\\x56\\x3d\\x0c\\xbb\\x4c\\xb2\\xb0\\xff\\x71\\x59\\x1d\\x93\\x90\\xb6\\xc8\\xfc\\x28\\x75\\x3a\\x0e\\x40\\x2d\\x64\\x87\\xcf\\xac\\x60\\x71\\x35\\x92\\x7d\\x89\\x26\\x75\\x12\\xb3\\x4f\\x87\\x70\\x57\\xd9\\x27\\x1b\\xcc\\xc0\\x24\\xdf\\xed\\xcc\\xc6\\xc3\\x2e\\xdf\\x75\\xc8\\xb7\\x55\\x1c\\xdf\\x80\\x15\\x4e\\xe8\\xe0\\x8a\\x0c\\xc4\\x30\\x44\\xe1\\x03\\x6b\\xae\\x01\\x7e\\xb4\\x8b\\x65\\x02\\xc7\\xa9\\xd6\\x0c\\x8b\\x37\\x0c\\xf3\\x79\\x9c\\x46\\x4f\\x96\\x4a\\x69\\xee\\x65\\x95\\x01\\x22\\x3e\\x78\\x9a\\x64\\x97\\xb6\\x34\\x96\\xdf\\x1a\\xda\\x2e\\x80\\x8d\\x24\\x34\\xfc\\x8b\\xb9\\x79\\x4e\\x5e\\x2a\\x20\\xbb\\xf4\\xd6\\x92\\x5c\\xb3\\xc5\\xbb\\x14\\x84\\x2f\\x19\\x20\\x09\\x05\\xba\\x93\\x54\\xe0\\x0d\\xc3\\x3c\\xff\\x5b\\x42\\xd4\\xe9\\xd9\\x66\\x8b\\x34\\xe6\\x61\\xd4\\x4b\\xef\\x76\\xfe\\xfe\\x2e\\xd5\\x1f\\x94\\x42\\x3a\\x93\\x3a\\xc9\\x4f\\x15\\x23\\xbf\\x37\\x82\\x3a\\x23\\x8d\\x61\\x6c\\x6b\\x17\\x97\\x34\\x41\\xe3\\x5f\\x94\\x05\\xa0\\x4d\\x99\\xea\\xa8\\xf5\\x04\\x53\\x4c\\x8b\\x5f\\xa5\\xe8\\xe3\\x35\\xc7\\x43\\xbc\\xf2\\x1f\\x5d\\x49\\x2b\\x71\\x12\\xe0\\x0f\\xd8\\x64\\x2c\\xb1\\x2b\\xfe\\xc8\\x49\\xdf\\x62\\x12\\x0d\\xbb\\x06\\xbf\\xc2\\x94\\x6a\\x56\\x01\\xe2\\x5b\\xe7\\x50\\x11\\xc6\\xf0\\x0c\\x65\\xd3\\x5f\\x44\\xa4\\x6a\\xf9\\xe4\\xf7\\x80\\x9e\\x57\\x89\\xa3\\xa6\\x1b\\xa0\\xa3\\xb2\\x13\\x89\\x04\\x97\\x29\\x6c\\x81\\xe4\\x2e\\x88\\xf0\\xec\\x0f\\x5d\\xef\\xc1\\xf5\\xd3\\x9f\\xf2\\xa4\\x8b\\x7e\\x30\\x26\\xc9\\xe5\\x47\\x20\\x2e\\xdc\\x7e\\xb7\\x38\\xc3\\x4a\\xd3\\xa1\\x5d\\x37\\x3e\\xf8\\x2a\\x4c\\x1d\\x18\\x1f\\x28\\x5a\\x98\\xbd\\x33\\x14\\xc2\\xc1\\x94\\x7c\\x9e\\x2c\\x60\\xac\\xa5\\x17\\x50\\xee\\x7f\\x94\\x3c\\xaf\\x0c\\x4e\\x1e\\x5c\\x7d\\xf7\\x29\\x1e\\x97\\x3b\\x1f\\x93\\x6b\\x73\\x70\\x76\\x19\"},\n{{0xaa,0xbb,0xb2,0xef,0xed,0xb5,0x99,0x42,0x4a,0x5f,0x3e,0x08,0xf9,0x0f,0xa8,0x82,0x6c,0x5c,0x92,0x17,0x0b,0xe5,0x01,0xa1,0x18,0x1f,0xe8,0xe8,0xdf,0x97,0x4e,0x0e,},{0xce,0x73,0x19,0xef,0x88,0xb2,0x42,0x42,0x06,0x66,0xca,0x69,0x7b,0xa8,0x50,0x1d,0x27,0x4e,0xc4,0xa5,0xdc,0xf8,0x44,0x59,0x66,0x08,0xb9,0xdd,0x5a,0x8a,0x3a,0xcd,},{0xa0,0xb1,0x9c,0xfa,0x6c,0x80,0xde,0x77,0xbf,0xcd,0x32,0x10,0x30,0xbf,0x8c,0x03,0x89,0x3e,0x2b,0x21,0xac,0xe6,0xc6,0xba,0x1f,0xf7,0x40,0x8e,0x6f,0xf0,0x7d,0x84,0x7e,0x6b,0x2b,0x68,0x8d,0x4f,0xd5,0x1a,0xa9,0x32,0x70,0x1d,0xb6,0x40,0x2e,0xf2,0x23,0x22,0xe6,0xe9,0xfc,0x7e,0x32,0x0a,0xbb,0x4d,0x24,0xe1,0xac,0xc6,0xcf,0x06,},\"\\xfc\\xc1\\x5c\\xc5\\x79\\x70\\x56\\x9e\\x9c\\xcf\\xa5\\xa7\\x78\\xfc\\x7a\\xed\\x71\\x97\\x8a\\x3f\\x56\\x24\\x57\\x7b\\x6f\\x57\\xfa\\x3f\\x16\\x7e\\xa2\\x23\\xef\\x31\\x76\\x4c\\x48\\x8d\\x05\\x9d\\x06\\x53\\x1d\\x01\\x6b\\xcb\\x17\\xd5\\x44\\xd4\\x69\\x77\\xaa\\x24\\x1f\\x8e\\x07\\xaf\\x47\\x87\\xa0\\x81\\x0f\\x98\\xd7\\x66\\x46\\x0c\\x08\\x41\\xad\\x81\\xb8\\x8f\\x4d\\x5d\\x81\\x64\\x48\\x5a\\x12\\x58\\xa9\\x46\\x22\\xc5\\x49\\x24\\x28\\xd6\\xd5\\x75\\x94\\x37\\x15\\x76\\x6c\\x2b\\x0a\\x86\\x5b\\xed\\xba\\x16\\x7d\\x5d\\x34\\x0e\\xdb\\x57\\x9c\\x47\\xaa\\x32\\x45\\x9b\\x8f\\xc9\\x8a\\x79\\xbb\\x0b\\xed\\x1c\\x96\\x0b\\x4c\\xcb\\x7f\\x2d\\x4b\\x56\\x81\\xa2\\xa7\\x0d\\x50\\x5b\\x85\\xb8\\x1e\\x3d\\x99\\x67\\x27\\x14\\xe4\\xea\\xb4\\x1f\\x3a\\xb0\\xca\\x87\\x4f\\x41\\x71\\x86\\xfe\\xb6\\x9e\\xd1\\x3f\\xb9\\x11\\xf4\\x9d\\x15\\x84\\x75\\x8b\\x2d\\x18\\xb4\\x67\\x3e\\xdf\\xae\\x49\\x5e\\x68\\xda\\xd5\\x13\\xa7\\xac\\x0d\\x47\\xb2\\x75\\x3c\\xb4\\xed\\xa7\\x8f\\xb4\\x31\\xf0\\x4d\\xda\\x8f\\xe8\\x03\\x0d\\x7b\\xb4\\xe8\\xdb\\xcc\\xb9\\x69\\xd7\\xf5\\x80\\xd9\\xc1\\xef\\x93\\x5d\\x07\\x4d\\x7a\\x41\\xd1\\xf8\\xb9\\xdc\\x45\\xc9\\xa2\\xe4\\x10\\x6a\\x55\\x29\\xa9\\x8b\\x95\\x52\\x9a\\xb0\\xed\\xea\\x0b\\x57\\x22\\xdd\\x68\\x6f\\x5a\\x7f\\x3c\\xd8\\xfb\\x26\\x24\\xab\\x26\\xc4\\x2d\\xf1\\x1f\\x51\\x0a\\x10\\x3d\\x8a\\x92\\x98\\x30\\xad\\x85\\xf5\\x21\\x24\\xe3\\xd5\\x82\\x7b\\xa6\\x0b\\xfb\\xcd\\x73\\x6c\\xb6\\xc5\\x90\\xee\\x77\\x7e\\xad\\x7a\\xa2\\x22\\x4d\\x7a\\xe4\\x6d\\x25\\x7a\\x90\\x40\\x72\\x47\\x96\\x0c\\x9c\\xb0\\x38\\x60\\xae\\xaa\\x7f\\x54\\xc1\\xa8\\xe1\\x11\\x60\\xd1\\x1b\\xb4\\x73\\x06\\x5e\\x19\\xb7\\x07\\x21\\xc8\\xf0\\x72\\xe1\\x90\\x9d\\x53\\x9e\\x9a\\xc9\\x41\\x85\\x90\\x4b\\xbb\\xfe\\x54\\x87\\x37\\x54\\xae\\x1c\\xa7\\xbc\\xed\\x6f\\x40\\x56\\x1a\\xf4\\xb5\\x05\\xf0\\x3a\\xc9\\x72\\xa6\\xf0\\xbf\\xa7\\x3b\\x5f\\x83\\x2f\\xe2\\x3b\\x89\\x8b\\x2b\\xbb\\x05\\x74\\xa6\\x66\\x2e\\xe9\\x3b\\x3b\\x36\\x0d\\xa1\\xec\\x7e\\x83\\x8e\\xb2\\xc7\\x7c\\x7c\\xb7\\xfc\\x16\\x4f\\x7c\\x46\\x27\\x01\\x04\\x89\\xc8\\x58\\x90\\x07\\x52\\xc9\\x2d\\x9d\\x75\\xad\\x54\\x71\\x67\\xe4\\xbd\\xd1\\x1a\\x07\\xd2\\x8b\\x65\\x1a\\xa3\\x0f\\x16\\xa8\\x50\\xe0\\x60\\xdd\\x28\\x82\\xfb\\x82\\x09\\x19\\xa3\\x98\\xe8\\x05\\xeb\\x63\\x69\\x9f\\x4f\\xf5\\x95\\xf9\\x91\\x52\\x47\\x31\\x64\\x1e\\xce\\x25\\xfb\\x3f\\x8e\\x89\\xad\\xa5\\x01\\x19\\x2b\\x1e\\xdd\\xae\\xcb\\xac\\xc8\\xb8\\x98\\x52\\x8f\\x2d\\x5b\\x33\\x12\\x69\\x4f\\x5e\\xc2\\xdc\\x91\\x42\\xe1\\x51\\x3f\\x77\\x7a\\x5c\\x83\\x34\\x09\\xc1\\x71\\x63\\x3f\\xf9\\xfa\\x26\\x09\\xd0\\x49\\x7f\\x5d\\xf4\\xfb\\xf4\\x8e\\xf2\\xb7\\x7d\\x55\\xe2\\x55\\x19\\xd2\\xee\\x79\\xb5\\xfe\\x9d\\x8f\\xa4\\x60\\x00\\xde\\xcd\\xb4\\xf2\\x5d\\xfb\\x3f\\x2b\\xaf\\xb1\\x9f\\xbe\\x2c\\xbd\\xac\\x00\\x2a\\x35\\x9a\\x95\\x4b\\xc6\\x9b\\xdf\\xe2\\xfb\\x36\\xad\\xfd\\x9a\\x15\\x09\\xf3\\xe3\\xa4\\xc6\\xb1\\xf3\\xf3\\x6e\\x7c\\xf8\\x0d\\x58\\x3d\\x44\\x0f\\xf2\\xa1\\x44\\x64\\x30\\x98\\x97\\x4d\\x71\\x49\\x3e\\xcb\\x64\\x17\\xc0\\xb8\\x06\\x5b\\xd2\\xc2\\x1c\\x1e\\x34\\xaf\\x09\\x24\\x3f\\xb4\\x9e\\x9d\\x35\\x29\\x7e\\xb0\\xa5\\x2d\\x56\\xdd\\x27\\x0f\\xea\\x6d\\xc5\\xc0\\x80\\xa0\\x55\\x99\\xf7\\x85\\x81\\xe9\\x0f\\xd8\\xcc\\x4c\\xd1\\x1a\\x50\\x5e\\xdd\\xe8\\x4b\\x89\\x2d\\x89\\x53\\xbd\\xbb\\x23\\x79\\xd3\\x3a\\xad\\x64\\x65\\x8a\\xe2\\x06\\x07\\xdd\\x35\\xb0\\xbf\\x3a\\x26\\x37\\xd2\\x0c\\x3f\\x86\"},\n{{0xc2,0xe0,0x74,0xfa,0xa2,0x34,0xe9,0x9a,0xb2,0x0a,0xdb,0xbe,0xae,0x11,0xb8,0x10,0x97,0x23,0xb7,0x08,0xc5,0x45,0x86,0xdf,0x65,0x2b,0x40,0x2c,0x35,0xcd,0xd1,0x27,},{0x5e,0x52,0x4e,0xce,0x1c,0x69,0x6e,0x70,0x5a,0x35,0x14,0xdd,0x00,0x82,0xb8,0x40,0x79,0x5a,0x59,0xc3,0x6a,0x96,0xcb,0xc4,0x82,0xbf,0xf5,0xab,0x4e,0xf5,0x15,0xd1,},{0x65,0x7c,0x38,0x26,0xb3,0x48,0x3f,0xd4,0x2a,0xb6,0xdf,0x86,0x9d,0x1b,0x77,0xa8,0xc4,0xdf,0x67,0xa6,0xa5,0x90,0xc7,0xc6,0x77,0x29,0x69,0xe3,0xdf,0x33,0x12,0xae,0x06,0x54,0xfb,0x83,0x84,0x7a,0xf2,0x21,0x93,0x5a,0x05,0x12,0x29,0x16,0x36,0xec,0x05,0x95,0x70,0x08,0x79,0xeb,0xdb,0xa8,0xa1,0x46,0x7c,0x53,0xd4,0x0c,0x23,0x06,},\"\\x31\\x29\\x03\\x38\\xe4\\x6d\\x1c\\xc2\\x5c\\xe9\\x9c\\xba\\xcc\\x40\\x16\\x03\\x41\\xb7\\x85\\x82\\x3c\\x82\\x3c\\x4a\\xb9\\xba\\xee\\x3b\\x61\\x25\\x79\\xf1\\xc0\\x11\\x71\\x67\\x96\\xe5\\x6e\\x26\\x93\\xf6\\xdd\\xad\\x43\\x92\\x2a\\xa7\\x84\\x7c\\xbb\\x41\\x48\\x10\\x16\\x51\\xbb\\xe6\\x2d\\x50\\xbe\\x90\\x82\\x5e\\x8e\\xab\\x77\\x7a\\xa4\\xb8\\x02\\x6d\\xc5\\x38\\x5a\\x97\\xd3\\xdf\\x76\\x16\\x01\\x91\\xf9\\x22\\xcd\\xd2\\xf0\\x7b\\xa5\\xf8\\x5e\\x95\\xf4\\x5d\\xb2\\x29\\x28\\xf9\\x07\\x34\\xff\\x52\\x0c\\x44\\xdc\\x8f\\xe3\\x90\\x3b\\x4c\\x51\\xcd\\x23\\xe0\\x64\\xf0\\x1c\\x82\\x9e\\xc7\\x4f\\xbf\\xfe\\x25\\xfd\\x0d\\x36\\x9d\\x27\\x65\\x74\\x0f\\x43\\x85\\x6b\\xd7\\x39\\x8a\\x19\\x11\\xad\\x74\\x98\\x36\\x16\\x0f\\xd9\\x8d\\x04\\xb2\\x8e\\xe8\\x7e\\x11\\x1d\\x40\\x71\\x8b\\x5a\\x16\\x6f\\x05\\xc9\\xa4\\x71\\xa4\\x15\\x66\\x55\\x70\\x69\\xf7\\xa1\\x4d\\xe9\\x88\\xbb\\xbf\\x67\\x77\\x52\\x1f\\xcb\\xa6\\xdd\\x65\\xde\\x4c\\x06\\x67\\x4a\\x11\\x85\\x3a\\xf8\\x3a\\xcc\\xb7\\x0f\\xb3\\x28\\xdd\\x8f\\xd6\\x10\\x5a\\x7d\\xf5\\x26\\x9c\\x9f\\xae\\xc8\\xd9\\x00\\x14\\x7e\\x92\\x8d\\x97\\x0c\\x36\\xcd\\x83\\x4b\\xd6\\x05\\x4f\\x70\\x65\\x0d\\xfa\\xce\\x94\\xb7\\x62\\x9d\\x16\\xe3\\x70\\x3d\\x76\\x6c\\xe7\\x63\\x8d\\x0a\\xd1\\xe1\\x7b\\x77\\x46\\x9b\\x95\\x8d\\x2b\\xa2\\xa1\\xe6\\x31\\xa1\\x63\\x5e\\xfd\\xcb\\x00\\x6e\\xbc\\x6e\\x5d\\x8b\\x9f\\xaf\\x7e\\x5f\\xb9\\x89\\xdc\\x08\\x96\\xc5\\x61\\xa2\\x6f\\x3c\\x25\\xf0\\x55\\x71\\x6b\\x36\\x71\\x38\\xea\\x5d\\xa1\\xf8\\x1d\\xc7\\x2c\\xff\\x7a\\x55\\xaf\\xae\\xe5\\x83\\x9e\\xf5\\xaa\\x82\\x2b\\x29\\x70\\xaa\\x18\\xa8\\x98\\x21\\x63\\xbf\\x5e\\xed\\x1b\\x67\\x7c\\xca\\xac\\x12\\x24\\xff\\x6c\\x6c\\xf2\\x56\\x37\\x47\\x80\\xae\\x65\\x80\\x3b\\xf5\\xc6\\xe2\\x3c\\x80\\xba\\xcd\\x76\\xec\\x3e\\x2d\\xdd\\x3a\\xb7\\x19\\x97\\x50\\x64\\x48\\xe1\\x9d\\xb1\\x98\\xef\\xad\\xc9\\xf7\\x57\\x49\\x1f\\x1b\\x09\\x72\\xc8\\x2d\\xb2\\x94\\x10\\xe1\\xe8\\xbb\\x67\\xbb\\xb2\\x3d\\x53\\x56\\x3b\\x88\\x07\\xe5\\xe0\\xc2\\xe3\\x2e\\xe5\\x96\\xb5\\xb4\\x40\\x23\\x28\\xf9\\xe1\\x79\\xe9\\xce\\x85\\x6d\\x3b\\xd1\\x99\\xd5\\x8d\\xe6\\xc5\\xc2\\x52\\xe7\\xa6\\x12\\x4d\\x81\\xfc\\x9e\\xea\\xf2\\x3d\\x34\\x7d\\x2a\\xb8\\x89\\x17\\xaa\\x68\\x44\\x50\\xdd\\x58\\x30\\x35\\x16\\xc1\\xa4\\xd2\\xbd\\xcd\\xde\\x22\\x0c\\x9a\\xe3\\x79\\x0f\\x29\\x8d\\x7d\\x38\\x4b\\x70\\xc2\\xfe\\x25\\x88\\x07\\x84\\x8f\\xc3\\x53\\x20\\xb5\\x78\\xb3\\x35\\x03\\xb7\\x5f\\x38\\xa1\\xdf\\x63\\x0b\\xd3\\x3e\\x6a\\x85\\xa4\\xdd\\x4d\\xf9\\xf6\\xe5\\x5a\\x6e\\x68\\x67\\xc7\\x38\\x01\\xe5\\x93\\xe1\\xd5\\x91\\xdb\\x89\\xba\\x9a\\x9a\\xf0\\xfc\\x29\\x2e\\x06\\xfb\\x51\\x5a\\xc8\\xa5\\xe8\\xe3\\x43\\xa8\\x21\\x33\\x55\\x75\\xba\\x48\\xfb\\xaa\\xe3\\xfb\\x12\\xde\\xea\\xae\\xe6\\x0f\\x4b\\x3d\\x31\\x7e\\xc0\\xa5\\x54\\xdd\\xd4\\x25\\xc8\\x49\\x32\\xc2\\x7a\\x7a\\x12\\xf2\\x9d\\x63\\x71\\x51\\x07\\x83\\xbd\\x75\\xe6\\x0e\\x2f\\x6d\\xa2\\x00\\x52\\x06\\x9e\\xd7\\x1e\\x69\\x5a\\x94\\x31\\x82\\x19\\x3c\\xb6\\x85\\x1a\\x7d\\x2f\\xa3\\xc6\\x66\\xc1\\x93\\x02\\x80\\x15\\xac\\x8b\\x7e\\x7d\\xaa\\x6c\\x52\\x04\\xf7\\x7a\\x62\\x32\\xb8\\x8b\\x4a\\xbf\\xfc\\x53\\x62\\xfd\\xe7\\xde\\xc3\\x6b\\x9d\\x45\\x48\\x80\\x84\\x92\\x83\\xb1\\x15\\x63\\x39\\xea\\x2e\\x8c\\x3b\\x10\\xe5\\x1b\\xfa\\xbd\\xf7\\x25\\x78\\xc7\\x26\\x41\\x9a\\x38\\x54\\x2c\\xf8\\x64\\x9d\\xf9\\xa0\\x90\\x9f\\x58\\x2d\\xeb\\xad\\x5f\\xd8\\x9d\\x8c\\x81\\xf8\\x3d\\x9e\\x42\\x3e\\x75\\x03\"},\n{{0xb9,0xda,0x4e,0x6a,0xf0,0x7e,0x39,0x8a,0xb4,0xd2,0x17,0x52,0xa3,0x2c,0x8f,0xfa,0x9b,0xe0,0xc3,0x10,0xd3,0x50,0x59,0xfb,0x66,0x1b,0xd7,0x3a,0xfa,0x97,0xe2,0xa8,},{0xf8,0x62,0x80,0x3c,0x96,0xcc,0x42,0xad,0xc8,0x25,0x28,0x84,0x54,0x72,0x30,0xb9,0x70,0x04,0x7b,0x7e,0x5d,0xa9,0x96,0x26,0x0c,0xcc,0x02,0x40,0xab,0x71,0xa6,0xec,},{0x62,0x5e,0x1f,0x42,0xc8,0x74,0x34,0xa2,0x5d,0x62,0x2d,0x80,0xd1,0x25,0x32,0x80,0x6a,0xfb,0x25,0x09,0x33,0x24,0x49,0xe6,0x96,0xb6,0x5e,0x1e,0x58,0x88,0x50,0x8f,0x11,0xc4,0xac,0x25,0xf5,0x9b,0x8d,0x94,0xd0,0xbf,0x27,0xe4,0xc8,0xd1,0x86,0x70,0x07,0xc4,0x08,0xda,0x57,0x30,0x82,0xdc,0xf1,0x9d,0x15,0xa9,0xd5,0xcc,0xcb,0x0c,},\"\\x6b\\x95\\xaf\\x0e\\xeb\\xb6\\xa0\\x8a\\xfa\\xda\\xa1\\x96\\x21\\xf7\\x6a\\x83\\x9b\\xe8\\x08\\x51\\xc6\\xdd\\x31\\x5e\\x82\\x76\\xf5\\x01\\x99\\x5d\\x4c\\xe6\\xd1\\x34\\xdf\\x5e\\x79\\x8e\\xd5\\x17\\xa2\\xf0\\xe6\\x2a\\xa1\\xd6\\xc9\\x8c\\x36\\xef\\x14\\xbb\\x1e\\x5d\\xdf\\xc9\\x8d\\x5a\\x7f\\xcc\\x81\\x14\\x0a\\x13\\xc2\\x0d\\x2c\\xa0\\xc4\\xb4\\x0e\\x6e\\x6a\\x03\\xee\\xd8\\xc8\\x99\\xf9\\xd1\\xf7\\x92\\x46\\x81\\x52\\x19\\x9f\\x4b\\x95\\xa4\\x32\\x66\\x89\\x47\\xa5\\x1d\\x7b\\x8e\\x10\\x4d\\x8d\\x1f\\x12\\xaa\\xcd\\x96\\x7e\\x08\\xb0\\x8c\\x41\\xc3\\xc8\\xca\\x3f\\xee\\xda\\xa5\\xb8\\xb6\\x3b\\xce\\xc0\\x61\\x38\\x64\\xd9\\x53\\xd8\\x11\\x43\\xec\\x81\\x42\\x5b\\xde\\x29\\x16\\x4a\\x08\\x76\\xf2\\x3f\\x37\\xac\\x9a\\xc9\\x47\\x36\\x72\\xce\\x11\\xa0\\x8b\\xd5\\x47\\x6f\\x6f\\x66\\xd6\\x65\\xe9\\xad\\x61\\x7e\\x34\\xeb\\x32\\xee\\x56\\xff\\xa4\\x59\\xf2\\x0d\\x1b\\x93\\x53\\xd7\\x82\\x12\\x98\\x54\\x57\\x50\\xc6\\xef\\xf3\\xe7\\xd4\\x07\\x3d\\xc3\\x18\\x5e\\xde\\x03\\x91\\xcc\\xe0\\x57\\x5f\\x8b\\xa6\\x37\\xd8\\x00\\x06\\x8d\\x9d\\x7e\\x54\\x03\\xba\\x70\\x38\\xd2\\xdb\\x77\\xda\\x14\\x47\\x84\\xf2\\xe8\\xea\\x76\\xae\\xdf\\xe5\\x21\\xe7\\xdc\\x6a\\x67\\x4e\\xde\\x35\\x57\\x95\\x95\\x99\\x3f\\xb2\\x0d\\x44\\xb4\\x05\\x27\\x83\\xf5\\x6c\\x8c\\x0b\\xbd\\x04\\x40\\xb6\\x9e\\xab\\xde\\x84\\x46\\x8d\\xd1\\x3c\\x67\\x1f\\xb1\\xbb\\xd5\\xcb\\x02\\x2c\\x2a\\x4f\\xcf\\x35\\x42\\xd8\\xb3\\xbb\\x51\\x8e\\x5a\\xde\\xbd\\xdc\\x84\\xe7\\x14\\xb1\\x3b\\xe5\\x2c\\x56\\xb2\\x82\\xb4\\x2a\\xc0\\x89\\x2a\\x54\\x59\\x28\\x1b\\xe7\\x16\\x07\\x29\\xf4\\x11\\x2c\\x7d\\x99\\xdf\\x9b\\xe5\\x43\\x4f\\x82\\x3a\\x9c\\xe0\\x50\\x17\\x89\\xde\\x1d\\x55\\x0a\\xd5\\x0b\\xb1\\x8c\\x8d\\x89\\xa3\\x36\\x68\\x27\\x0b\\xff\\x7b\\x91\\xff\\x11\\x8f\\x5c\\xd9\\x90\\x9a\\xdd\\xde\\x90\\xc0\\x24\\xa3\\xad\\x71\\x39\\x15\\x17\\x46\\x74\\xf2\\x8a\\xaa\\x9f\\x94\\xa3\\x22\\xba\\xa5\\x43\\x73\\x8e\\xda\\xb4\\x97\\x33\\x12\\xb5\\xbf\\xa1\\x21\\x55\\xde\\xbc\\xee\\x16\\x3c\\xfe\\x2b\\x04\\xac\\x9c\\x12\\x2a\\xc8\\xa4\\xe1\\xbc\\x41\\x8c\\x14\\x95\\x5d\\x96\\x10\\x45\\x5b\\xd9\\x45\\xe9\\x79\\x3b\\x91\\x62\\x67\\xc9\\xc5\\xf9\\xe5\\x3a\\xc0\\x45\\x18\\x92\\x6e\\xc9\\x8e\\xcb\\x84\\xa4\\xf0\\x44\\x5d\\xcb\\x12\\x36\\xc7\\x6c\\x3a\\x67\\x8c\\x69\\xab\\xe4\\xe9\\x2c\\x22\\x97\\x1d\\x62\\x21\\x72\\x01\\xa1\\xbd\\xf0\\x5c\\x04\\xdf\\x84\\x20\\xa3\\xde\\x6a\\x91\\x7a\\x85\\xe7\\x1e\\x2b\\x97\\x25\\xe7\\x7b\\x52\\x29\\x15\\xd4\\xc9\\x94\\x60\\x77\\x63\\x7c\\x2d\\x88\\x13\\xf0\\x10\\xb9\\x49\\x1c\\xf0\\xed\\xdc\\x3d\\x46\\x68\\xcc\\x0f\\x8b\\xc8\\xa6\\x83\\x57\\x9b\\xe5\\x43\\x93\\x4d\\xa2\\x85\\x3a\\x16\\xf5\\x71\\x57\\x24\\xf7\\x79\\x81\\x9f\\x44\\x43\\x9e\\x1d\\xeb\\xca\\xa4\\x27\\x0d\\x9b\\x85\\x94\\xba\\x4c\\x86\\xe1\\x06\\x3b\\x3c\\xe4\\x79\\xd7\\x1a\\x54\\x09\\xbe\\xf2\\x7e\\xf4\\xe5\\xc1\\xd1\\xc9\\x6e\\x8b\\xe1\\x38\\x65\\xaf\\x7b\\xb4\\x3f\\x09\\x16\\x2c\\xcb\\xc8\\x3a\\x2c\\xa9\\xe9\\xb8\\xa2\\x32\\x4e\\x6d\\x99\\x65\\x75\\xee\\xfe\\xd3\\x7e\\xf4\\x99\\x08\\x18\\x57\\x38\\xb8\\xea\\xe4\\x3f\\x8a\\xdc\\xa3\\x30\\xc9\\x9b\\xc6\\x6c\\xc1\\xfd\\x52\\xc5\\x30\\xd7\\x37\\x1c\\x60\\x86\\x9c\\xe4\\x2c\\x19\\x7d\\xca\\x0a\\xd1\\x28\\xb8\\x5f\\x61\\xc8\\x75\\x8f\\x0d\\x54\\x2f\\x3d\\x32\\x98\\xb6\\x5e\\x93\\xc6\\xe8\\xa6\\x8f\\xa0\\xe9\\xa1\\xd5\\xe8\\xc5\\xfe\\xc8\\x05\\xb8\\x3a\\xff\\x43\\x90\\xe1\\x15\\xeb\\x64\\xf3\\xf0\\x78\\xa0\\xb9\\xb6\\x6c\\x27\\x38\\x43\\xfc\\x6c\"},\n{{0x14,0x3f,0x7b,0x42,0x47,0xd5,0x49,0xf6,0xb7,0xc0,0x91,0x72,0x66,0xc5,0x0f,0x96,0x2c,0x28,0xa2,0xea,0x24,0x76,0x2f,0x53,0x7a,0xa0,0x6a,0xd1,0x5e,0x40,0xb3,0x5a,},{0xc9,0x95,0x9f,0x90,0xa2,0xd5,0xfe,0xac,0xba,0xe2,0xc4,0xc8,0x03,0xde,0xd5,0xde,0xab,0x86,0x98,0x76,0x37,0x06,0x43,0x37,0xaa,0x2a,0x0b,0x0d,0xde,0xf2,0xfd,0x86,},{0xc1,0xcf,0xae,0x58,0x51,0x57,0x13,0xea,0x72,0x8c,0xfa,0x09,0x09,0x0e,0x89,0x42,0xf8,0xdf,0x18,0x62,0x1b,0xa7,0x09,0x0e,0x3a,0x33,0x76,0xc3,0x80,0x27,0x75,0xa1,0xec,0xaf,0x43,0x6b,0x18,0x49,0x78,0x04,0x1e,0xbb,0x75,0x22,0x6f,0x97,0x0d,0xf7,0x1d,0x6a,0xd3,0x53,0xc0,0xfb,0x46,0x50,0x23,0xf9,0xe2,0x98,0xf6,0x4a,0x70,0x02,},\"\\xe2\\x74\\x20\\x23\\x47\\xa0\\xd0\\x57\\xa4\\x8b\\xf2\\xa1\\xf6\\xe9\\xf6\\xcb\\x42\\x56\\x07\\x9d\\x80\\x03\\x74\\x09\\x3c\\x02\\x0c\\xbf\\x52\\x0e\\x5f\\xa2\\x7f\\xe9\\x96\\xff\\x07\\xf3\\x3a\\xd3\\xb2\\x1f\\x74\\xab\\x0c\\xd9\\x3c\\x86\\x47\\x5f\\xf3\\x7c\\xf6\\x22\\xd3\\xf9\\xfa\\x4d\\x13\\xbc\\x99\\xf0\\x13\\xe8\\x50\\x2b\\x24\\xe4\\x6c\\xc8\\x7c\\x47\\xe6\\xb2\\xc3\\x66\\x2b\\x50\\xe9\\x79\\xa0\\xf3\\x45\\xb7\\x84\\xff\\x21\\xa8\\xa4\\xd9\\x2a\\xdc\\x65\\xe8\\x6e\\x33\\xb4\\xdb\\xe1\\x7f\\x52\\x8c\\xcd\\xf5\\xb4\\x86\\x46\\x64\\xba\\x94\\xff\\xdb\\x7c\\x7d\\x24\\x12\\xb4\\x38\\xe6\\xe4\\x3f\\xa9\\x66\\x81\\x47\\xee\\x33\\x28\\x22\\x4d\\x1f\\x52\\xa3\\xf5\\xb5\\x43\\x59\\xb4\\xf7\\xfe\\xf6\\x9a\\xf8\\xf8\\x67\\xb4\\x78\\xf1\\x30\\xa1\\x47\\xbe\\xa4\\x2e\\xd3\\x98\\x03\\xbc\\xbc\\x25\\x57\\xbc\\xa8\\xc3\\x99\\x9f\\x1d\\x24\\xf0\\xa6\\xb0\\x3c\\x98\\x84\\x60\\x11\\xf9\\xec\\x74\\xf6\\x66\\x41\\x7b\\x95\\x02\\x0e\\xb1\\xfb\\x2f\\xb8\\x8b\\x63\\x12\\xe5\\x00\\x8c\\xff\\x03\\xe2\\xd7\\x7a\\x26\\xaa\\x53\\x2d\\x17\\x80\\xb5\\x07\\x7f\\x9e\\x8b\\x82\\x86\\x74\\x45\\x5d\\x6b\\xc9\\x57\\x97\\x5f\\x7b\\x2a\\x50\\xe7\\xfd\\x7c\\x16\\x12\\xce\\x02\\x36\\x2e\\xfa\\x4c\\x55\\x5a\\x1e\\xef\\x68\\xec\\x34\\xa5\\xc0\\x06\\xa6\\xda\\x00\\x8a\\x31\\xd4\\x19\\x3d\\xc2\\xcc\\x64\\x76\\x85\\xad\\x3c\\xfa\\x3b\\xd7\\xc5\\x60\\xb7\\xae\\xd4\\x5f\\x0f\\x1a\\x3d\\x1b\\x5b\\x36\\x22\\x68\\xde\\x53\\x28\\x57\\x05\\x5a\\xb9\\xd1\\xd5\\xd8\\x58\\xd9\\xae\\x9a\\x75\\x9a\\x51\\xbb\\x94\\x78\\xe8\\xf0\\xee\\x93\\xc9\\x84\\xb5\\x76\\xb8\\xb4\\xab\\x46\\x02\\x80\\xbe\\x3d\\xe2\\x05\\xa3\\x2f\\x1d\\xc3\\xd5\\x72\\x92\\x3f\\xb2\\x13\\xac\\x15\\x12\\xd8\\x0e\\xb5\\xad\\x5c\\x18\\x94\\x4b\\xe7\\x7f\\xc1\\x7d\\xef\\x13\\xa6\\x1b\\xbd\\x31\\xbc\\x71\\xac\\xc2\\x3d\\x25\\x0e\\xc5\\x89\\x4e\\xbc\\x21\\x4c\\xfe\\xc0\\xc1\\xb9\\x06\\x51\\x6d\\x32\\xd8\\x36\\xad\\xc8\\x38\\x80\\x2e\\x8d\\xe3\\x0d\\xd7\\x6d\\xf6\\xe6\\x1c\\x1b\\xc4\\x38\\xb6\\x8d\\x2b\\x02\\x5a\\x84\\xf2\\x11\\xfa\\xcf\\x3f\\x13\\x84\\xd2\\x61\\x2d\\x0f\\xae\\xf5\\xd1\\x71\\x31\\xcf\\xe0\\xcf\\xe8\\x33\\xfe\\x95\\x0e\\x47\\x9b\\xc2\\x9c\\xbe\\x7f\\xd6\\xda\\x0c\\xce\\x30\\x7c\\xf0\\xb1\\xbd\\x92\\xc8\\x0e\\x87\\x8e\\x43\\x2f\\x63\\x6e\\xa0\\xcd\\x42\\x48\\x0c\\x07\\xe8\\xb8\\xe5\\x7e\\x69\\xb2\\xf9\\x38\\xb7\\x81\\x20\\xf6\\xaf\\x4a\\xbe\\xbf\\x7d\\x4b\\x05\\xca\\xcd\\x6e\\xed\\x85\\x44\\x91\\xc0\\x29\\x75\\x5c\\x4e\\x66\\x33\\x89\\x93\\xed\\x2a\\xc2\\x5d\\x19\\xa0\\xc5\\xb4\\x0f\\x5e\\x32\\xc8\\xa8\\xb1\\xbc\\xe3\\x69\\x71\\x81\\x86\\xc9\\x1d\\x60\\xed\\xff\\x24\\xa8\\x37\\x7a\\x99\\x69\\x75\\x75\\x99\\x06\\x7d\\xd3\\x12\\x63\\xa0\\x6d\\x6a\\x61\\x15\\x47\\x81\\xf2\\x96\\x11\\xab\\x81\\x2f\\xf8\\x2e\\x81\\x37\\x39\\x64\\x62\\x63\\x70\\x4c\\xd6\\x04\\x63\\x57\\xa2\\x3c\\x04\\x5e\\x24\\x07\\xb7\\xa8\\x95\\x08\\x25\\x93\\x91\\x31\\x4f\\x2f\\xbe\\xe4\\x9a\\xef\\x08\\x55\\xc6\\xe5\\xe6\\x3d\\x91\\x2a\\x19\\xdf\\x15\\xb1\\x1e\\xce\\x34\\xe2\\x76\\xdc\\xb8\\x8b\\xf2\\xf2\\xe4\\x75\\x63\\x58\\xf3\\x4a\\x0e\\xe3\\x95\\x2b\\x68\\x6f\\xcd\\x17\\x57\\x8a\\x88\\x41\\x76\\xd3\\x4e\\xa2\\x91\\x6c\\x5d\\x9f\\xcd\\x00\\xeb\\x9e\\x0a\\xa9\\xf2\\xcf\\x0f\\x16\\xe2\\x56\\x4b\\xfd\\x28\\xb6\\xab\\x59\\x68\\xb8\\x44\\x8f\\x06\\x83\\x20\\xe4\\x18\\x71\\x60\\xf8\\x66\\x57\\x81\\xb1\\xe2\\xed\\x9d\\x04\\x9e\\x1b\\x54\\xa7\\xd7\\x27\\x20\\xff\\x9d\\x4f\\x07\\x30\\x51\\x99\\x6a\\x9d\\xb6\\xf0\\xc6\\x82\\x1c\\x42\\x4f\\xa5\\x1d\"},\n{{0x0d,0x1f,0xe9,0xd8,0xb9,0xa2,0xf0,0x4c,0x22,0xbb,0xb0,0xed,0xea,0x38,0x33,0xa0,0xce,0x43,0x33,0x93,0x47,0x53,0x1f,0xdb,0x67,0xed,0x51,0x3a,0x13,0xd3,0x6b,0x39,},{0x67,0xc4,0x9f,0x41,0x0f,0x48,0x53,0x29,0x3d,0x0c,0x4d,0x39,0xf4,0xc1,0xb3,0xd6,0xc6,0x10,0x3c,0x5c,0xfe,0x20,0xa9,0xa5,0x9b,0x53,0x93,0x20,0x43,0x51,0x73,0x69,},{0xb0,0x57,0x25,0xe7,0x37,0x1e,0xd0,0xa9,0x1e,0xbc,0x89,0xf3,0xc3,0x0b,0xaa,0x99,0x18,0x37,0x63,0xed,0xb4,0xce,0x34,0xfe,0x90,0x1a,0xf3,0x73,0x1e,0x00,0x1c,0xc5,0x4f,0x28,0x71,0x18,0x91,0x5e,0x90,0x36,0x5d,0x91,0xac,0xa8,0xfe,0xb1,0x70,0x87,0x69,0xf9,0xf1,0xd6,0xee,0xf5,0xaa,0x11,0x3b,0xee,0x00,0xb5,0xef,0xab,0x27,0x04,},\"\\x64\\x21\\x7a\\xc8\\x41\\xfd\\x4d\\x64\\x59\\xbf\\xc4\\xa4\\x9b\\x88\\x01\\xd6\\x92\\x9b\\xf1\\x9b\\x40\\x8e\\x8a\\x53\\x79\\x0c\\xeb\\x51\\xec\\x34\\x1f\\x9b\\x46\\xa3\\x51\\xe8\\xc2\\xe5\\x9d\\x88\\x7e\\x1e\\xac\\xcb\\x91\\x42\\x31\\xcd\\xca\\x1d\\x3e\\x5c\\x47\\xd1\\x66\\xb4\\xcd\\xb9\\xb5\\x8c\\x01\\x3c\\x59\\xa3\\xbd\\x28\\x3a\\xd1\\x0f\\x6b\\xd6\\x2c\\x0f\\x15\\xf7\\x64\\xce\\x14\\xf3\\xb2\\x65\\xf5\\x37\\xc6\\x3e\\x73\\xb6\\xc4\\xfa\\x65\\xe0\\x6c\\xe1\\xe1\\xf4\\xae\\x0d\\x11\\x48\\x9d\\xd2\\x60\\x2f\\x95\\xfc\\x40\\x2b\\x77\\x12\\x05\\x2a\\xbc\\x84\\xbd\\xc7\\x78\\xc1\\x9f\\x10\\x00\\x1b\\x4e\\x0d\\x5f\\xbe\\x46\\x30\\x90\\xe8\\x3e\\xf4\\x38\\xfe\\x06\\x8f\\x3b\\xb6\\xfb\\xc2\\xc1\\x39\\xaf\\x06\\x78\\xed\\x2a\\x11\\xfa\\xa1\\xb9\\xe4\\x9a\\xaa\\x46\\x20\\xab\\xfc\\x08\\x43\\x9f\\xbf\\xe2\\xc6\\x18\\x40\\x76\\x9e\\x5f\\xda\\x26\\x77\\xf8\\xe2\\xf0\\xa1\\x45\\x64\\xf9\\xf5\\x04\\x23\\x2a\\x9f\\xc0\\xd9\\xda\\x47\\x1e\\x67\\xfb\\xc5\\x74\\xc3\\xd5\\x6d\\x2a\\xeb\\x93\\x7a\\x58\\x6e\\xd5\\x58\\x35\\x56\\x30\\x8a\\x99\\x8e\\xb1\\xdc\\x47\\x6a\\x01\\x4f\\x5a\\x08\\x22\\x8d\\xbe\\xd9\\x5a\\x12\\x08\\xbc\\x1d\\x1f\\x5d\\x76\\xb4\\xe8\\xd0\\xb2\\x43\\x4b\\x99\\x5a\\xd4\\x58\\xe4\\x29\\xee\\x61\\x42\\xa0\\xc9\\x71\\x76\\x8c\\xc4\\x0c\\x40\\xbc\\xb0\\x8e\\x96\\x03\\xf0\\x96\\x11\\x47\\x44\\x71\\xb3\\x85\\x9d\\x7f\\xd5\\x84\\x21\\x9f\\x02\\x65\\x7b\\x43\\x0e\\x9e\\x56\\x95\\x5b\\x34\\x67\\xac\\x56\\xff\\x2e\\xab\\x22\\xcc\\x49\\x84\\x89\\x03\\x6a\\x57\\x41\\x20\\xe2\\xdb\\x76\\x9a\\x3b\\x21\\x50\\x03\\x89\\x14\\x2c\\x78\\xa8\\x7d\\x06\\x9f\\x0e\\x25\\x76\\xca\\xfd\\xa8\\xcd\\xdd\\x79\\x15\\xa9\\x22\\x87\\x73\\xd2\\xac\\x9a\\x07\\x5c\\xb3\\x87\\xf2\\xa8\\x98\\x61\\x72\\x13\\xb2\\xcc\\x50\\x59\\xd1\\x19\\x41\\xbc\\x4f\\xe5\\x86\\x41\\xe7\\xc1\\x75\\x02\\x67\\xe5\\x3e\\x99\\xc4\\x21\\xcb\\x4c\\xf2\\x1d\\x09\\x8c\\xa2\\xd1\\xf4\\x16\\x44\\xf7\\x90\\x89\\x83\\xeb\\x17\\x4a\\x23\\xa7\\x81\\xcf\\x15\\xef\\x38\\xeb\\x91\\x16\\xed\\xa4\\x12\\x3a\\x15\\x22\\xf5\\x3b\\x81\\xfb\\x73\\x68\\xe8\\x07\\x5f\\xb8\\x38\\x59\\xd2\\xcf\\x98\\xd9\\x21\\x53\\x5a\\x70\\x9f\\xaf\\xa9\\x87\\x3c\\x4a\\x03\\x9a\\xae\\x68\\x2f\\x7e\\x62\\x86\\xb8\\x99\\x25\\x7c\\x09\\x24\\x01\\x6c\\xa5\\xbf\\x6d\\x31\\x69\\x09\\x92\\x11\\xa9\\xa4\\xa6\\x74\\x5c\\xdd\\x31\\x98\\xf1\\x33\\x7f\\x60\\x92\\x82\\x27\\xce\\x3c\\x7d\\x60\\x96\\x0b\\x53\\xde\\xdf\\x01\\x1a\\x89\\x40\\xf5\\xc4\\x68\\x20\\x7a\\x38\\x94\\xbb\\x08\\x72\\xb3\\x33\\xcc\\xde\\xc9\\xd5\\xec\\xd9\\x11\\xec\\xbb\\xb9\\x6c\\x9b\\xc4\\xbd\\x48\\x75\\x32\\x0e\\x4d\\x3e\\x9c\\x02\\xd9\\xdc\\x76\\x10\\x9e\\xc4\\x5e\\x61\\xd1\\xcf\\x5a\\xc7\\x29\\xf2\\xe3\\x4a\\x96\\x47\\xb9\\x5b\\xce\\x70\\xb0\\xc6\\x33\\x17\\x1a\\xda\\xf0\\xdf\\xdb\\x5a\\xfb\\xa4\\x03\\x5b\\x3c\\xce\\x8c\\xb7\\x14\\x1a\\xd1\\x42\\xbb\\x7a\\xdd\\x4f\\xc3\\xf9\\x61\\xd4\\x2d\\x72\\x03\\x75\\x4a\\x4e\\x31\\x32\\x21\\xd4\\x87\\x83\\x1e\\x32\\x94\\x7d\\xa9\\x11\\x38\\xab\\x64\\x8b\\x59\\x52\\xef\\x69\\x56\\xe2\\x7a\\xa5\\xd2\\xc1\\x75\\x79\\x4b\\xf8\\x1e\\xf2\\x77\\xfa\\xa6\\xb9\\x05\\xe1\\x45\\x02\\x86\\x68\\x87\\xd8\\x78\\x80\\x60\\x6e\\x81\\xb2\\x7a\\xf0\\x1b\\xb2\\x63\\xec\\xf2\\xc5\\x82\\x05\\x85\\xea\\x6c\\xe8\\xd8\\xb3\\x91\\xd8\\x6f\\xce\\xda\\xdc\\xd1\\x1f\\xdb\\xb5\\x66\\xfd\\xf1\\x47\\xf4\\x02\\x01\\x0f\\xc3\\x5f\\x51\\x57\\xe0\\x36\\x14\\x6b\\x37\\x36\\xc8\\xa4\\x33\\x59\\x12\\x7c\\x26\\x1f\\x6b\\xf0\\xca\\xd3\\xbd\\x8a\\x34\\xcb\\x15\\x09\\xf7\"},\n{{0xc1,0x0b,0x5a,0xc6,0x05,0x5a,0x1d,0xdb,0xca,0x28,0x55,0x2e,0x5c,0x72,0xeb,0xd0,0x52,0x78,0xc9,0x22,0x39,0xb2,0xfc,0xd0,0xc1,0x35,0x36,0x51,0xa8,0xe5,0x59,0xa0,},{0xb2,0x18,0x3e,0x1b,0x00,0x81,0x6d,0x29,0x30,0x5f,0x74,0x68,0xe7,0xe4,0x5e,0xed,0x3f,0xd8,0xf2,0x3c,0x15,0xb3,0x05,0xf9,0xfd,0xa9,0x3e,0x81,0x2d,0x65,0xbc,0x27,},{0x8a,0x9a,0x32,0x17,0xfd,0xf0,0x64,0x3a,0xaa,0xa5,0xc8,0xfb,0x2a,0x88,0xa5,0x56,0x39,0x88,0x59,0xb8,0xfe,0xef,0xbc,0xb4,0x8c,0xcd,0x88,0xe5,0x85,0xa1,0x67,0xc9,0x4d,0xbb,0x5c,0x0c,0xad,0x24,0xd1,0x5b,0xca,0xbb,0xc1,0xed,0xb2,0x1f,0x02,0xa8,0xc4,0x57,0xc5,0x61,0x20,0xa3,0x23,0x4a,0xc3,0x35,0x77,0xb9,0xaf,0x2d,0xdc,0x01,},\"\\x35\\x94\\x90\\x5f\\x9e\\xa4\\x64\\x61\\x5f\\x41\\xb8\\x7a\\xbb\\x9d\\x16\\x73\\x37\\xf2\\x9d\\x45\\xd9\\x7f\\x7a\\x14\\x64\\xec\\x9f\\x2e\\xe5\\x0f\\x90\\xf2\\xe6\\x73\\x39\\x87\\x4d\\x3f\\x20\\x93\\xbe\\x92\\x26\\x10\\x77\\x01\\xec\\x1a\\xab\\x94\\x1c\\x4e\\x05\\x9f\\x1b\\xb2\\x6c\\xe8\\x6e\\x14\\x8d\\x1d\\x9f\\x0d\\xa2\\xa2\\xa0\\xf9\\x82\\x9a\\x36\\x4f\\xb4\\xf1\\x3f\\x58\\xb9\\x60\\xd0\\xf8\\xd7\\x23\\x23\\x28\\x3c\\x44\\x90\\xef\\xdf\\x57\\x87\\x86\\x45\\x89\\x0f\\xf7\\xbc\\x50\\x65\\xda\\xd6\\xe5\\x1d\\xd1\\xe5\\xb9\\xa5\\x07\\x51\\x50\\x97\\x8b\\x33\\x67\\xf1\\xba\\x84\\xe4\\x5f\\xf1\\xf1\\x27\\x6c\\x57\\x6e\\x4b\\xc7\\x2b\\xe8\\xaa\\x8e\\x40\\x5f\\xc2\\xb2\\x7f\\x81\\x46\\xb9\\x99\\x84\\x5f\\xaa\\xa0\\x59\\x5d\\x3c\\xb7\\x0e\\x5d\\x37\\x12\\xed\\x54\\xa0\\xfb\\x3e\\x32\\x2d\\x45\\x38\\x0b\\x5d\\xe3\\x60\\x9b\\x96\\x7b\\x95\\x9b\\xca\\x5a\\x58\\x3c\\xc5\\x20\\xcd\\xcb\\x7b\\xcb\\xb8\\x29\\xaa\\x25\\xd7\\x93\\x20\\x95\\xec\\xb3\\x03\\x92\\x3c\\x25\\x60\\xaf\\xc3\\xfd\\x73\\x24\\xb7\\xb7\\xac\\xd0\\x89\\xa9\\xf0\\x0c\\x03\\xa7\\x3d\\x04\\x3d\\xc0\\xcf\\x0b\\xa0\\xd8\\x41\\x1e\\x2b\\x1b\\x18\\xd2\\x1d\\x2a\\x32\\xa7\\x26\\xa5\\x30\\x59\\x14\\x0f\\x78\\x4f\\x7c\\xed\\xf2\\xf3\\x3c\\xec\\x66\\xfe\\x4a\\xd5\\xcc\\x9e\\xac\\xcb\\xe4\\xae\\x10\\x03\\x6a\\xc3\\x52\\x3b\\xac\\x70\\x0a\\x11\\x3a\\x98\\xb5\\x98\\xe6\\xdf\\x03\\x04\\xc6\\xfa\\x32\\x12\\xac\\xc0\\x4c\\x4e\\x3c\\x7f\\x66\\x87\\x36\\x2e\\xf8\\x6d\\x61\\x7c\\x6d\\xd4\\x83\\xf8\\xd8\\x0c\\xea\\x66\\xd1\\x95\\x11\\x27\\x42\\x8a\\x61\\xc1\\xe1\\x55\\xa6\\x85\\x0b\\xb2\\xaf\\xb7\\xf9\\x1c\\x82\\xd7\\x3e\\xb2\\xb0\\x54\\x3e\\xe8\\xfc\\x1f\\x38\\xe1\\xdc\\xdb\\x3c\\x50\\x3d\\xdc\\x9b\\xa0\\x81\\x24\\x56\\xa5\\xce\\x2e\\x11\\xd5\\x56\\x48\\x7a\\x64\\x69\\x74\\xa7\\xbb\\xf8\\x6e\\x80\\x6c\\x58\\xc6\\x8c\\x42\\x69\\xa7\\xc9\\xbb\\xca\\xc0\\xff\\xef\\x98\\x35\\xb3\\x3d\\xc4\\x49\\xa7\\x54\\x79\\xec\\xd2\\x3f\\x6d\\x14\\x9c\\x1e\\x5e\\xa8\\xb6\\x92\\x08\\xff\\x36\\xe5\\xfb\\xd6\\x82\\x95\\x55\\x03\\x18\\xbf\\xa0\\xd3\\xb1\\xd6\\xc1\\xad\\x42\\x70\\xbc\\xab\\x09\\x04\\xae\\x53\\x49\\x1f\\x9b\\x1c\\xa5\\x02\\xe0\\x12\\xee\\xd7\\x7c\\x42\\x7d\\x49\\xa0\\x96\\x2f\\x10\\x55\\x12\\x5d\\xd7\\xb5\\x37\\x33\\xd8\\x52\\x89\\x34\\xb5\\x58\\x0d\\xd5\\xfd\\x5b\\xbe\\x85\\x49\\x78\\xba\\xe3\\xd2\\x5b\\xb4\\xae\\x94\\x4e\\x90\\x65\\xe8\\xe2\\xe0\\x79\\x46\\x51\\x8a\\x6f\\x54\\x8e\\x36\\xe0\\x56\\xbe\\x82\\x4d\\x9e\\x02\\xa7\\xa3\\xea\\xad\\xd3\\x79\\x29\\xf5\\x81\\x01\\xcb\\x18\\x53\\xbe\\x3d\\x75\\x47\\xf5\\x8f\\x49\\xe3\\x8b\\x01\\x8a\\x74\\x8d\\x3f\\x19\\xc4\\x85\\x82\\xab\\xbd\\xbe\\x95\\x3a\\x8a\\x25\\xba\\x9d\\x36\\x5d\\xea\\x83\\x59\\x35\\x89\\x9c\\x19\\xfb\\x0b\\x51\\x90\\x6a\\xa9\\x72\\xc5\\xac\\x45\\xe9\\x9c\\x40\\xb3\\xb7\\x6e\\x35\\xd3\\x27\\xe3\\x21\\xe8\\xae\\x23\\x06\\xa6\\xeb\\x3d\\x8c\\xb6\\xec\\x2f\\xa5\\x39\\x9a\\xdd\\x19\\xea\\x00\\x28\\xa0\\x17\\x92\\xc0\\x8e\\x27\\xc1\\x6c\\xf4\\xf8\\x5a\\xaa\\xae\\x72\\xf9\\x86\\xb0\\x99\\xf9\\xeb\\xe4\\xad\\x0b\\x25\\xd0\\x6d\\x3d\\xe4\\x4a\\x8b\\xfa\\x52\\x84\\x4b\\xe4\\xa9\\x39\\x44\\x83\\x3c\\xe2\\xad\\xd5\\x1b\\xb5\\x54\\xb3\\x56\\xa7\\xdc\\x49\\x74\\x8d\\xd4\\x5a\\xe7\\xec\\x9e\\x8d\\xb4\\x26\\xc9\\x7a\\x25\\xda\\x5e\\xdd\\x3b\\x62\\x1e\\x4a\\xdb\\xde\\x48\\x19\\x7a\\x33\\x14\\xde\\x1c\\x50\\xf4\\xd6\\x00\\x20\\x27\\xdd\\x75\\x19\\xdd\\xe3\\xe1\\x57\\x29\\xe4\\x86\\x95\\x5a\\xc4\\x0d\\x9d\\x66\\x87\\x6f\\x90\\x66\\x8c\\x68\\x9d\\x8a\\xb5\\x98\"},\n{{0x06,0x1b,0xdd,0xab,0x28,0x0b,0x0f,0xdc,0xb2,0x6b,0xfd,0x9a,0x0f,0xc7,0x21,0xf6,0x8f,0x88,0x34,0x3b,0x5d,0x39,0x83,0xa1,0x6b,0x6d,0xfa,0xa5,0xe7,0x69,0x69,0xf3,},{0x81,0x55,0x78,0xbb,0xa6,0xe7,0x07,0x0e,0xbd,0xec,0xa1,0x17,0x56,0x8b,0xd7,0x7e,0xbf,0xf9,0xe1,0x4c,0xb8,0xbc,0x20,0x0c,0x32,0xbd,0x87,0xdb,0x1f,0xb3,0x7d,0x6c,},{0xb8,0x32,0x97,0xcc,0xdd,0x6d,0x00,0x98,0xeb,0xf5,0xd1,0x32,0xd1,0x74,0xde,0x19,0x58,0x31,0x1a,0x76,0x6b,0xcc,0x4d,0xa1,0x5f,0x86,0x4d,0x80,0x1f,0x38,0xe0,0x9d,0x61,0x3e,0x7a,0xa8,0xc3,0x36,0x30,0x27,0x35,0xd7,0x5b,0xe4,0x16,0x6d,0x73,0xb0,0x18,0x4b,0x0e,0x0b,0xc5,0xef,0x39,0xed,0xbc,0xcb,0x6e,0x0e,0x61,0xaf,0xeb,0x0c,},\"\\xee\\x76\\xb4\\x0c\\xd4\\x29\\xea\\xc7\\xbc\\x12\\x83\\x9c\\xa2\\xf7\\xcd\\x31\\xf1\\xe0\\x09\\x8a\\x39\\xc5\\xfc\\x19\\x80\\x5b\\xe0\\x33\\x1f\\x44\\x79\\x9e\\x31\\x8d\\x12\\x57\\x1f\\x06\\xe2\\x99\\x37\\x53\\xa3\\x68\\x5c\\xd2\\xa9\\x6b\\x23\\x01\\xe2\\x00\\x24\\x20\\x9a\\xdc\\x5a\\xdf\\x74\\x79\\xff\\x90\\xc4\\x77\\xc3\\x69\\x5a\\xbb\\x99\\xbd\\x28\\x57\\x9d\\xbc\\x78\\x31\\xa1\\x92\\xbe\\xed\\x0c\\xe1\\x7b\\x03\\x8b\\x20\\x76\\x48\\x00\\x65\\x3a\\xf7\\xaf\\x02\\x4e\\x2a\\x10\\x4e\\xd0\\xf3\\xe5\\x2d\\x4b\\xbd\\x3e\\x10\\x9c\\xf1\\x26\\x29\\x1f\\x49\\xb0\\xa2\\x1b\\xe4\\x33\\xc1\\xc5\\xa2\\x58\\x9e\\xa5\\x72\\x99\\x7f\\x63\\xd2\\xbb\\x39\\x72\\xd5\\x32\\xbe\\x35\\xa0\\x47\\x1e\\xf0\\x57\\x3d\\x79\\x5c\\x07\\x2b\\x6a\\x86\\x85\\xb9\\x5e\\x47\\xb0\\x9e\\xa9\\xf4\\x75\\xd9\\x3b\\xf1\\x2b\\xbd\\x77\\xb7\\xd2\\xbf\\x5d\\x5b\\xdd\\xf0\\xae\\x02\\x37\\x53\\x71\\xd1\\xd7\\x99\\xea\\x92\\x04\\xbe\\x38\\x9e\\x6a\\x8e\\x5d\\xee\\xdc\\xd4\\x92\\x02\\xe9\\x2d\\xf7\\xc3\\xe7\\x61\\xf9\\x2e\\xf8\\xd7\\x9f\\xa7\\x38\\xd2\\xc5\\xbc\\x28\\x0e\\xd3\\x28\\x79\\x83\\x2f\\xf2\\xb0\\x26\\x42\\x45\\x89\\xcd\\xbd\\x52\\xd1\\x5b\\x60\\xf2\\xaa\\x35\\x26\\xb8\\x98\\x84\\x9a\\x34\\xa8\\x5f\\xf1\\xc4\\x7d\\xc6\\x55\\x4b\\x85\\xac\\x76\\xaa\\x79\\x35\\xcb\\xf3\\xf7\\xbc\\x80\\xad\\x00\\x91\\x92\\xa8\\x75\\xca\\x20\\x9b\\x40\\xfe\\xb0\\x47\\xcc\\x44\\x69\\x68\\xf9\\x70\\xda\\x47\\xb8\\xcd\\x67\\xda\\x7e\\xb4\\xe5\\x4a\\x0e\\x5a\\xb2\\x0c\\xb3\\x5b\\xc6\\xfb\\x7f\\x13\\x30\\x7c\\xe6\\x7e\\xb6\\x20\\x4a\\x67\\xce\\x9b\\xb1\\xd1\\x39\\xc1\\xb4\\xbd\\x5d\\xbe\\xd5\\x80\\x10\\xc8\\x7b\\xf8\\x31\\xe6\\x52\\x2e\\xe1\\x82\\xda\\xd9\\x45\\x80\\x4b\\x76\\x7c\\x4d\\xf2\\x55\\x4f\\x15\\xb9\\xe9\\xaf\\xd2\\x59\\x9e\\xf2\\x58\\xc6\\x7a\\x22\\xca\\xeb\\x92\\xa5\\x79\\x88\\x00\\x6b\\xbc\\x72\\xc1\\x04\\xfa\\xc7\\xe5\\x41\\x3c\\xd3\\xd3\\xb8\\x02\\xc8\\x3e\\x63\\x9e\\xaf\\xe2\\x12\\xa3\\x8b\\xb7\\xef\\x77\\x9a\\xf1\\xa9\\x4e\\xe1\\x37\\xf6\\xc6\\x06\\x67\\xbc\\x48\\xf2\\x7b\\xf4\\xa2\\x22\\x41\\xbc\\x44\\xbb\\x60\\x33\\x83\\x62\\x39\\xbd\\x6e\\xaf\\x3e\\x2e\\x22\\x31\\x87\\x84\\x1e\\x46\\x41\\xb0\\xf4\\xe9\\xff\\x8d\\x5a\\x41\\xdd\\xbe\\xab\\xb4\\x13\\x8f\\x6b\\x58\\x5a\\xce\\x0f\\xb6\\xb5\\x3d\\xc3\\xc9\\xed\\xc0\\x37\\x3b\\x60\\x47\\xf2\\x7d\\x83\\x5e\\x8e\\x24\\x66\\x44\\xfd\\x83\\x2c\\xcf\\xe0\\xdf\\x25\\xc3\\xd7\\xda\\x18\\x7c\\x9f\\xa0\\x54\\x20\\xd4\\x34\\x55\\xf2\\xd0\\x8b\\x57\\x19\\x29\\x38\\x6b\\x59\\xc6\\xe0\\xe1\\x0a\\x35\\x60\\x1d\\xa8\\x99\\xb1\\xb4\\xdc\\x3d\\x95\\xb6\\x7d\\xd9\\xa8\\x38\\x18\\xb0\\xa3\\x18\\xbf\\xdd\\xa0\\x64\\x64\\xb4\\xa4\\x2d\\x3c\\xb9\\x85\\xf3\\x0e\\xc9\\x7d\\x6a\\x2a\\xf1\\x32\\x91\\x15\\x5d\\x60\\xce\\xc5\\x7c\\xbd\\x58\\xd5\\xcf\\xcb\\x35\\xc1\\x85\\x35\\xe8\\xd2\\x99\\xb5\\xb0\\x07\\x59\\x08\\x92\\xea\\x94\\x9d\\x1b\\x13\\x7a\\x62\\xb3\\x9a\\x43\\x6c\\xd7\\xe5\\xb9\\xf8\\xd1\\xb6\\x93\\x8d\\xba\\xa6\\x2c\\x22\\x68\\xd4\\x59\\xc6\\x22\\x0a\\x3e\\x6f\\xcb\\xf8\\x0b\\xa0\\x11\\x8a\\xcd\\x23\\x42\\x56\\x3f\\xbd\\xbc\\x1f\\x7c\\x9d\\xba\\x7e\\xa2\\xc0\\x72\\xaf\\xc8\\xae\\x21\\x28\\xe3\\xeb\\xca\\x06\\x44\\xff\\xd8\\x16\\x3e\\x80\\xa1\\xa5\\x57\\xd9\\xd3\\x90\\x34\\xcc\\xd9\\xdb\\xd1\\x2c\\x88\\x55\\xa6\\xf9\\x16\\x5b\\x08\\x01\\x83\\x9c\\xf6\\xe0\\x7a\\x9f\\xba\\x4c\\x64\\xd9\\xc0\\x99\\xe1\\x54\\x10\\xe2\\x90\\xe6\\x77\\x03\\x1b\\x65\\xcf\\x7d\\xeb\\x00\\x79\\xbd\\xad\\xc5\\x73\\xcc\\x05\\x6d\\x76\\x66\\xd9\\x5d\\x03\\x3a\\x0b\\x6b\\xdb\\xa7\\xec\"},\n{{0x2c,0xab,0x5b,0xf5,0x5f,0xfa,0x91,0x4e,0x9a,0xd0,0x76,0x22,0x19,0x0d,0x34,0x3e,0xc5,0x5c,0x13,0xcd,0x91,0xb3,0x88,0xcb,0x75,0x00,0xff,0xe0,0x6d,0xf7,0xc1,0x80,},{0xb6,0x1e,0x43,0x2b,0xb9,0x7c,0xba,0xe3,0x88,0xa2,0x57,0x8a,0x74,0x84,0x99,0x8e,0x00,0xe9,0xad,0x3d,0xdf,0xd6,0xca,0xb8,0xd3,0xa5,0xfc,0x5b,0xa0,0x43,0x07,0xc8,},{0x4c,0xf0,0x8f,0x4f,0xab,0xbd,0x06,0xdc,0xcb,0xcc,0xe2,0xa7,0xa5,0x94,0x1f,0xe9,0xaf,0xdd,0xc4,0xd2,0xd0,0xbc,0x80,0x80,0x2e,0x93,0xb1,0x2c,0xb1,0x35,0xd3,0xac,0xf6,0x51,0x1e,0x0f,0xe4,0x11,0x3c,0x5e,0x3c,0x55,0x41,0xb2,0x7d,0x3a,0x21,0x50,0xa7,0x57,0x74,0x2a,0xc6,0x5f,0x95,0xa9,0xce,0x66,0x73,0xff,0x0c,0xd2,0x1c,0x0f,},\"\\x2c\\x2d\\x04\\xdc\\x3a\\xd1\\x98\\x23\\x59\\xec\\xd5\\xbc\\x3e\\xe0\\x35\\xf3\\x49\\x8e\\xed\\xff\\x61\\x04\\xa9\\x3c\\x60\\x2a\\xf2\\x17\\x9a\\xeb\\x2c\\xb1\\xf4\\x1c\\x5c\\xdb\\x0a\\x77\\xb1\\x24\\xf9\\x46\\xaa\\x8a\\x82\\x4a\\xa3\\x07\\x6c\\x2e\\x1a\\xcf\\xd4\\x8f\\x68\\x07\\x0b\\x26\\x27\\x6a\\x65\\x6b\\x4a\\x47\\x58\\xab\\x15\\x1a\\x6a\\x9c\\x41\\xbd\\x74\\xe0\\x9b\\xbd\\x9a\\xdc\\xce\\x1e\\x87\\xa0\\xa8\\x0d\\x17\\xfd\\x92\\xe8\\x5e\\x4b\\xda\\x47\\x2c\\x98\\x8b\\x6b\\xb1\\x18\\x3b\\x7e\\xe5\\x9a\\x09\\xd8\\x05\\x70\\x46\\x6d\\xb9\\x0d\\xd3\\x74\\x95\\x79\\xc4\\xeb\\x19\\xab\\x75\\xfc\\x15\\x2e\\xcd\\xcd\\x68\\xcd\\x10\\x78\\xef\\x06\\xe5\\x93\\xc7\\x35\\x16\\xfa\\x82\\x91\\x48\\x1a\\x66\\x7d\\x3f\\x95\\xbf\\xeb\\x14\\x4b\\xab\\x59\\xd6\\xdd\\xc7\\x3a\\x27\\x95\\xc1\\x01\\x7e\\x09\\x53\\x6b\\x31\\x62\\xe4\\xbc\\x58\\xf8\\xea\\xd3\\x89\\x57\\x01\\x8c\\xfe\\xc7\\x2b\\xad\\xbf\\x22\\x81\\x9a\\xb0\\xb4\\x06\\xc6\\x47\\x30\\xfc\\x73\\xfd\\x9e\\xe6\\x1f\\x74\\x18\\x7e\\xda\\x91\\xed\\x4e\\x79\\x93\\xe6\\x68\\x84\\xaf\\x43\\xef\\x4c\\x6b\\xf7\\xf7\\xc3\\x79\\xe8\\xf0\\xf6\\x3d\\xcb\\x80\\x41\\xe2\\x6b\\x8b\\x82\\x92\\xb6\\xb6\\xd1\\x90\\xe4\\xad\\xf4\\x30\\xfa\\x82\\xdd\\x74\\xc5\\x73\\x85\\xb9\\x19\\xc4\\x46\\xdb\\x37\\xb5\\xe8\\x76\\x7e\\x4a\\x0c\\x95\\x01\\x3b\\xe8\\x9b\\x2b\\xc4\\xe9\\xfd\\x62\\x75\\x4a\\x84\\x44\\x18\\x40\\x09\\x68\\xae\\xd2\\xdd\\x32\\x8d\\x7b\\x1d\\xc9\\x1e\\x1a\\x2b\\x30\\x09\\xdc\\x7a\\xd1\\x40\\xa0\\x68\\x6f\\x67\\x31\\x68\\xa6\\x0e\\x88\\xd8\\x0c\\x52\\x0f\\xc2\\xdc\\xfc\\x56\\xca\\x9d\\x4b\\x0c\\x88\\x85\\x90\\x99\\x23\\x07\\x14\\xde\\xc8\\x3d\\x26\\xb4\\x63\\x05\\x54\\xdc\\xb9\\xc4\\x90\\x18\\x95\\xf7\\x8f\\x38\\x34\\xb0\\x97\\x66\\xb6\\x7a\\x46\\x5d\\xe8\\xc9\\x49\\x00\\x65\\xbf\\x56\\x83\\x39\\x24\\x33\\x99\\xfd\\xc9\\xd5\\x10\\x03\\x24\\x66\\x7c\\x5a\\xb2\\x8f\\x35\\xc0\\x0f\\x61\\x25\\x63\\x8e\\x61\\xda\\xb7\\x0d\\x1e\\xec\\x48\\x95\\x1d\\xe0\\xfb\\x3f\\x7b\\x23\\xd3\\xcd\\x98\\x24\\x37\\xc6\\x34\\x73\\x41\\x5b\\xef\\x37\\x4a\\x66\\x32\\x96\\xf2\\x98\\x6b\\x1a\\xe9\\x57\\x9b\\x9f\\xfc\\xe7\\x1e\\xc3\\x5e\\xec\\xa1\\x16\\xd1\\x94\\xf8\\xfb\\xa9\\xa4\\x5a\\x91\\xba\\xe2\\x7a\\xc4\\x55\\xdb\\x71\\xa6\\xb0\\x1a\\x72\\x9d\\x0c\\x13\\x5f\\xcd\\xcb\\xc2\\x3e\\x50\\x4a\\x29\\x43\\xc0\\x0a\\xa4\\x20\\x70\\x51\\x9d\\x9c\\xd7\\x7a\\xe6\\x75\\x4f\\x31\\xeb\\x46\\xa3\\xe5\\xbe\\x9e\\xeb\\x3f\\xc8\\xd3\\x1f\\xf1\\x82\\xda\\x9b\\x08\\x7b\\xe3\\x46\\x2c\\x84\\x59\\x12\\x6e\\x86\\x29\\x09\\x23\\x2f\\xd5\\xf2\\xd8\\x9c\\x01\\x81\\x59\\x57\\x61\\x1e\\x6a\\xe7\\xca\\xa9\\x8b\\x60\\x53\\x77\\x6a\\x77\\x15\\xc2\\xf9\\x3c\\xcf\\x03\\x08\\x87\\x03\\x0c\\x56\\xc2\\xb8\\x22\\x6d\\xae\\x29\\x77\\x99\\x5a\\x6d\\x3f\\x1e\\x9d\\x79\\x11\\xa9\\xc9\\xd2\\xa3\\x03\\xf0\\xe0\\x1f\\x32\\x33\\x8e\\xfd\\xaf\\x8e\\xe6\\x3f\\xc4\\x1b\\x25\\x39\\x9c\\xff\\xd0\\xb3\\x5f\\x7e\\xe5\\x67\\x6b\\xd8\\xfd\\x3d\\xa2\\xcb\\xee\\x4a\\xe2\\xea\\x98\\x08\\xd7\\xe7\\x35\\x83\\xd9\\x94\\x33\\x99\\x31\\x46\\x67\\x4a\\x40\\x40\\xf4\\x2f\\x63\\xd1\\xb3\\x13\\x5c\\xc7\\x97\\xa8\\xd8\\xf0\\xb8\\x85\\x73\\xa3\\x28\\x90\\x69\\x6c\\xac\\x94\\x39\\xd1\\xe1\\x5d\\x19\\x6d\\x90\\x90\\xb6\\x2b\\x6d\\xb7\\xe6\\x3c\\x96\\x47\\x2d\\x94\\x6e\\x66\\x8c\\xbd\\xa1\\xf4\\xdb\\x88\\x93\\x00\\xcd\\xcc\\x25\\xe8\\x4c\\x9f\\x38\\x57\\xd1\\xd9\\xe5\\x32\\x41\\xcf\\x62\\x5f\\x39\\x09\\xaf\\x1c\\x8a\\xaf\\xf4\\x30\\x9f\\x68\\xf6\\x54\\xb7\\xa1\\x5b\\x67\\x71\\x1c\\x5b\\x7f\\x9d\\xe7\\x67\\x75\"},\n{{0xdd,0x7b,0x59,0xa3,0x3d,0x97,0x0b,0xef,0x62,0xe0,0xe2,0x1a,0x7b,0x6e,0x4c,0x30,0x96,0x06,0x86,0xf1,0x7f,0x49,0xaf,0xdb,0x4a,0x9f,0x4e,0x80,0x8e,0x35,0x5c,0x7f,},{0x53,0xa0,0xe5,0x72,0x77,0xd9,0xbb,0xee,0xcf,0x99,0xc4,0xd1,0x38,0xfd,0x66,0xfa,0xfc,0xae,0xc7,0xbc,0x5f,0x56,0x7f,0x83,0x20,0x80,0x0c,0x4e,0x58,0x4f,0xf8,0x2e,},{0x87,0x29,0x4d,0x22,0xd4,0xad,0x0d,0x08,0x14,0xe2,0xd6,0xd5,0xfa,0xf5,0x57,0x49,0xe9,0xb3,0x98,0x03,0xb4,0xd4,0xb7,0x87,0x9e,0x60,0xb7,0x77,0xc1,0xfc,0x41,0x58,0x4f,0xe1,0x51,0x35,0xba,0x11,0x23,0xff,0x5f,0x20,0x0d,0xb3,0x5a,0x34,0x68,0xdd,0x4d,0x58,0xda,0xd7,0x7b,0xd9,0x6e,0xe2,0xb8,0x88,0xa5,0xa8,0xb1,0x8c,0x32,0x04,},\"\\x75\\x58\\x03\\x67\\x93\\x05\\x18\\x16\\x8b\\x0a\\x76\\x4d\\x09\\x58\\xbe\\xc4\\xfc\\x46\\xcf\\x59\\x19\\x99\\xeb\\x37\\x37\\xe4\\x2a\\x02\\xea\\x72\\xd2\\x10\\xda\\xad\\x53\\xe5\\x4a\\x7c\\x2c\\x13\\x4a\\x6d\\x47\\x83\\x37\\xd2\\x63\\x33\\x68\\x54\\x81\\x70\\xed\\xef\\x0d\\x85\\x17\\x9f\\x30\\x23\\xe1\\x50\\x38\\x68\\xa6\\xe5\\xe2\\x77\\x5e\\x41\\x2a\\xc0\\x5f\\x05\\x89\\xd4\\x2a\\x37\\x7e\\x75\\xaa\\x6b\\x8f\\x52\\x20\\xa7\\x69\\x9a\\xe8\\xaf\\xf0\\x10\\x94\\xec\\x46\\x9d\\x63\\x61\\xd3\\xe8\\xf3\\x86\\x15\\xed\\xcd\\xa4\\xd2\\xd5\\x28\\x9a\\xcf\\x73\\xdb\\x64\\x56\\x98\\x57\\x80\\xc9\\x2e\\x07\\xf6\\x2c\\x77\\xa9\\x09\\xfb\\x6e\\xf5\\x98\\x82\\x20\\x62\\xbd\\x57\\x2b\\xf7\\x05\\x8d\\xcb\\x83\\x5e\\xf3\\x44\\x3d\\x3e\\x47\\xb5\\xc6\\x03\\xd9\\x27\\x36\\xdd\\x1d\\xf2\\x6b\\xe4\\xb9\\x28\\x3b\\x76\\xe3\\x21\\xd5\\x5c\\xe2\\xb6\\x38\\xcd\\xe2\\x25\\x77\\xca\\x59\\xc9\\x63\\xc2\\x47\\x95\\x56\\xc5\\x75\\xcc\\xb0\\xd6\\xd1\\x8c\\x80\\x4e\\x2e\\xb0\\x1f\\xf5\\x35\\x81\\xeb\\x04\\x0f\\xfd\\x2c\\xc4\\x67\\x60\\x73\\x7a\\x74\\x67\\x2e\\xa6\\xbf\\x78\\x05\\x8a\\x6a\\x0a\\x1f\\x5e\\xbf\\x56\\xde\\xcb\\xf9\\x4b\\x54\\xaf\\xb2\\x3c\\x11\\xd3\\x41\\x79\\xbf\\x09\\x76\\xb4\\x15\\x80\\x17\\xd4\\x07\\xc9\\x5a\\x40\\x1f\\xa6\\xf9\\x62\\x4d\\x77\\x13\\x5e\\xae\\x81\\x41\\xeb\\xea\\x9f\\x35\\xd5\\xf5\\x1b\\x3d\\xed\\x99\\x5c\\x7f\\x70\\xc0\\x25\\xb0\\x94\\xad\\xef\\x2b\\x07\\x1f\\x97\\x11\\x55\\xd7\\x79\\x6d\\x61\\x3a\\x55\\x0d\\x09\\xe7\\xf4\\xdf\\xc3\\x45\\x17\\xb3\\xf8\\xfa\\x43\\x93\\x28\\x6a\\x2b\\x22\\x80\\x17\\xda\\xf2\\xe0\\x15\\x38\\x7e\\x13\\x52\\x7f\\x63\\x66\\x1d\\x3c\\x13\\xe7\\x8e\\x90\\xfb\\x29\\x55\\xee\\xe3\\x45\\x73\\x91\\x19\\xb7\\x91\\xf0\\x5b\\x07\\xc8\\xf4\\x2a\\x43\\x6e\\xfc\\xad\\x1e\\xc5\\xea\\x10\\xf3\\x08\\xf8\\xe2\\x3c\\xa9\\x8b\\xc6\\x5a\\x5f\\xd9\\x39\\x3e\\xfa\\xaf\\xe5\\xcd\\xef\\xba\\x81\\x05\\x81\\x70\\xcc\\x54\\x93\\xc0\\x0c\\xed\\xf2\\x54\\x09\\x74\\x35\\xd2\\xe2\\xfd\\xe5\\x5f\\x86\\x6b\\xb8\\x2d\\xbd\\xfb\\x91\\x54\\x34\\x49\\x74\\x86\\x63\\x59\\x16\\x7b\\x46\\x6c\\xaa\\x90\\x9b\\x91\\x53\\x0c\\x9c\\x7e\\xe8\\xc5\\x3f\\xa9\\x01\\x64\\xbb\\xd0\\xb1\\xfa\\xdb\\xdc\\xd0\\x81\\x27\\xf1\\x9b\\xe5\\x03\\x30\\x71\\x51\\x8d\\x3c\\xf1\\x0a\\xe6\\xbd\\x6f\\x98\\x27\\xe1\\x20\\x6f\\x5e\\xc0\\x95\\xc1\\x98\\x61\\x70\\xe8\\xd5\\xd8\\xe7\\x2e\\x57\\xd4\\x22\\x87\\x01\\xdf\\x2a\\x48\\xc9\\x54\\x87\\x30\\x56\\xcf\\xdf\\xba\\xaf\\xb1\\x0e\\x46\\xa0\\xc1\\xf1\\x44\\xb1\\xa0\\xea\\xcd\\xd2\\xcb\\x66\\xbb\\x91\\x2a\\xc4\\x71\\x78\\x7d\\xab\\xe4\\x83\\x53\\x85\\x91\\x20\\xb0\\x34\\x03\\x56\\x7c\\x41\\x5d\\xdb\\x88\\xfc\\x0d\\x7f\\xba\\x40\\x69\\xbb\\xfe\\xf4\\x06\\xee\\xd7\\x24\\xa1\\x1a\\xbc\\x04\\x1e\\x8e\\x7b\\xeb\\x66\\x3d\\x0d\\xc9\\x9d\\xce\\xf3\\xac\\x6a\\x14\\x90\\x07\\xb4\\x2d\\xd1\\xf2\\x2a\\x77\\xdd\\x52\\x90\\x18\\x14\\x32\\x51\\x72\\x22\\x4a\\x27\\x78\\xf3\\x66\\xfb\\x9e\\xb0\\x2c\\x81\\x2b\\x84\\x2a\\x42\\x84\\x25\\x61\\xc6\\x8f\\x2a\\xc2\\x31\\xc2\\x6c\\xe9\\xe8\\xb1\\x9a\\xe9\\x1e\\xbf\\xad\\x3c\\x0e\\x9f\\x66\\x36\\x3a\\x13\\xec\\xd8\\xb8\\x97\\xa3\\xd0\\x0a\\x26\\xd2\\x57\\x64\\x8d\\x56\\xc6\\x74\\x74\\x41\\xca\\x1c\\x6e\\xe9\\x9f\\x08\\xdd\\xad\\x25\\xd1\\x16\\xdf\\xad\\xab\\x03\\x83\\x00\\x0d\\x3d\\x72\\x25\\xcf\\x2e\\xff\\x70\\x76\\xb2\\xad\\xab\\x95\\x22\\x29\\x25\\x55\\xf3\\x19\\x32\\x06\\x78\\x60\\x00\\xd4\\x2c\\xa3\\x4d\\x70\\x8d\\xc0\\x42\\x84\\xa9\\x4d\\x17\\x4c\\xc9\\x2f\\x10\\x2e\\xfd\\xdf\\x31\\x48\\xc2\\x99\\x69\\x16\\xd4\"},\n{{0xd8,0x80,0xd2,0xfb,0x06,0x26,0x2f,0x57,0xab,0x87,0x78,0xe3,0x3d,0x16,0xb4,0x73,0x06,0x09,0x78,0xa6,0x54,0x9c,0xdb,0xcd,0x55,0x86,0xba,0x81,0x05,0xf5,0xac,0xa8,},{0x0d,0xe4,0x86,0xd2,0x11,0x5f,0xaf,0x2d,0x54,0x72,0x66,0x77,0x2e,0x43,0x0f,0xd9,0x72,0x7b,0xdc,0xac,0xe6,0xec,0xbf,0x2f,0xe2,0x3a,0xb6,0x0f,0x7b,0x52,0x54,0xb1,},{0x4c,0x00,0xa7,0x16,0x68,0xd3,0x21,0x3c,0x29,0xc7,0x04,0x1c,0x5a,0x03,0x7e,0xdf,0x13,0xc6,0x51,0x4b,0xd0,0xeb,0xc8,0x80,0xc9,0x09,0xca,0xff,0x15,0x06,0xa4,0x5d,0x27,0x80,0x9f,0xb7,0x4e,0x66,0x02,0xea,0x2a,0xad,0x0f,0x84,0x28,0x31,0xb7,0x4f,0xb3,0xd6,0x90,0x0c,0xcc,0x52,0x06,0x52,0xda,0x28,0x36,0x8f,0xd9,0x0c,0xa3,0x0e,},\"\\x11\\x47\\x43\\xe8\\x2a\\x09\\x93\\xce\\xc9\\x70\\x50\\x67\\xab\\xd7\\x7c\\x16\\x8b\\x53\\x67\\x7e\\xde\\x5c\\x15\\x9f\\xad\\x36\\xf0\\x6f\\xc1\\xa1\\x4a\\xcd\\x77\\xf8\\x83\\x79\\x9e\\xd9\\x88\\x3f\\x99\\x15\\xae\\xa6\\x38\\xec\\x17\\x41\\xf3\\xf4\\x21\\x58\\x55\\xfb\\x5b\\x07\\xdf\\x37\\x93\\xbb\\xe5\\xb5\\x68\\xeb\\x35\\x94\\x39\\x1a\\x9e\\xf5\\x72\\x7f\\xab\\x93\\xe5\\x74\\x69\\xb3\\x7d\\xe1\\x25\\xb1\\xe9\\xf2\\xe6\\xfe\\x2c\\x3d\\x1a\\x10\\xec\\xf8\\x7b\\x6c\\x0a\\x66\\x5c\\x6d\\x46\\x0a\\x17\\x0e\\xef\\xb9\\xbf\\x71\\x6c\\xd8\\xfa\\xea\\x97\\x64\\xf5\\x79\\xff\\x34\\xeb\\xfa\\x9c\\x4c\\xfb\\x34\\x70\\x6d\\x8d\\xd7\\xc9\\xeb\\x1d\\x10\\xb2\\xdf\\x46\\x0a\\x46\\xbb\\x57\\x89\\x43\\x0b\\xf4\\x49\\x15\\x8b\\x58\\x24\\xf2\\xa3\\xa7\\xb9\\x18\\xb3\\x3a\\xcf\\x2d\\x9e\\xbe\\x90\\x21\\x6d\\x1b\\x7c\\xbf\\x4a\\xf7\\x70\\xc5\\xdb\\x95\\xfc\\x62\\xff\\x3a\\x3c\\x38\\x5c\\x3a\\x82\\x17\\x85\\x3b\\x73\\x46\\x63\\x4a\\xaf\\x30\\x60\\x72\\x88\\xdb\\x0c\\x48\\x3b\\xd4\\xc2\\x22\\xeb\\x33\\x2c\\xb8\\x9d\\xc4\\xa2\\x17\\xe6\\x33\\x4a\\x26\\x84\\x13\\xa3\\x90\\xbb\\x37\\x1a\\xec\\x35\\x5f\\xbe\\x4c\\x73\\x6f\\x7d\\xa7\\x5f\\x9c\\x88\\x75\\x41\\xa2\\xb7\\xd0\\xda\\xc0\\x18\\xb6\\x13\\x8f\\x02\\x1e\\x77\\x26\\x6d\\xde\\xce\\x84\\x68\\x45\\x2a\\xda\\x39\\xf5\\xe6\\x3d\\x02\\x09\\xb9\\xd6\\xda\\xbf\\x97\\x54\\x13\\x25\\x6d\\xca\\xa1\\x5a\\xc1\\x4b\\x60\\x68\\xe1\\x77\\x05\\x6c\\x7b\\xf0\\xf0\\xf7\\xc8\\x84\\xa3\\x40\\x20\\x32\\x29\\x8c\\xd5\\x59\\xa6\\x31\\x20\\x39\\x40\\x06\\x32\\x32\\x7f\\x9c\\x0e\\x76\\x3e\\x52\\x79\\x8c\\xb1\\x77\\xda\\x44\\x75\\xe4\\xb2\\x40\\x5c\\x15\\x7c\\xa4\\x27\\x74\\x11\\x08\\xd3\\x3e\\xd0\\xb7\\xa3\\xf5\\x34\\x38\\xce\\x6b\\x72\\x5c\\x6d\\xd5\\x81\\x4a\\xf5\\x1c\\xfa\\x45\\xdb\\xce\\xd5\\x57\\xf7\\x26\\xdb\\x13\\x0d\\x55\\xcd\\xe7\\x53\\x3b\\xc2\\x09\\x2d\\x6b\\x69\\x9c\\x2c\\x87\\x0a\\xf2\\x82\\x73\\x1e\\x18\\xd6\\x51\\xae\\x85\\xb3\\xdb\\x4b\\xa0\\x28\\x53\\xf8\\xc8\\x7f\\xd5\\xe3\\xab\\x69\\xbc\\x57\\xb0\\x8b\\x81\\xf8\\x3c\\x23\\x9c\\xcf\\x22\\xe8\\x17\\xe2\\xad\\xa4\\xd0\\xad\\x14\\x48\\x7e\\xd1\\x46\\x12\\xc8\\xb0\\x97\\x3e\\xc0\\x65\\x0a\\x55\\xf6\\xbf\\x9a\\xf4\\xae\\x92\\x56\\xad\\x35\\x46\\xa3\\xf6\\x7d\\xd3\\x5d\\x98\\x7e\\xf2\\x19\\x09\\xa9\\x4c\\x50\\xf0\\xef\\x06\\x40\\xe7\\x55\\xb1\\xc4\\xe1\\xa0\\x12\\xaf\\x0d\\x31\\x76\\x6e\\xeb\\x5d\\xf3\\x1c\\xd1\\x04\\xc6\\x4e\\xb6\\x2e\\xb4\\xef\\xb1\\x39\\xcf\\x30\\x57\\x69\\x40\\x1d\\x21\\x3f\\x96\\xa4\\x88\\xd5\\xee\\x7e\\x3c\\xe3\\x2b\\x01\\x92\\xee\\x8f\\x08\\x31\\xbf\\xbe\\x8f\\xe9\\x5d\\xe9\\x56\\x88\\x6b\\x52\\x4d\\x33\\x19\\xb7\\x3f\\xd5\\x6d\\xc6\\x0e\\x9f\\x1c\\x72\\xd7\\x81\\x55\\xa9\\x7c\\x6f\\x43\\x69\\x7b\\x20\\x46\\x6b\\x3e\\x7a\\xeb\\xd3\\x57\\xb9\\x16\\x96\\xe7\\x34\\x8f\\x45\\x99\\xb3\\x4f\\x35\\x91\\xed\\xdf\\xce\\x2a\\x7b\\xd8\\x49\\xab\\x16\\xf7\\xb4\\x3e\\xbb\\x16\\xe2\\x3d\\x6f\\x52\\x10\\xef\\xa3\\x0a\\xb3\\xba\\x8d\\x32\\xc4\\x06\\x62\\xb8\\x66\\x2f\\xd9\\x11\\x54\\x4b\\xc2\\x45\\x8c\\x65\\x69\\xef\\x75\\xa9\\xb9\\xdf\\x6a\\x0f\\x6d\\x80\\xd6\\x58\\xba\\x86\\xb2\\x41\\xca\\x19\\xce\\x9a\\x6f\\xcf\\x01\\xd3\\xda\\xa9\\x5a\\xfb\\x59\\xc3\\xd8\\x9a\\x18\\xb9\\x48\\x62\\x13\\x94\\x32\\x7f\\xc5\\xe9\\x20\\xa7\\x5f\\x98\\xf5\\xe2\\xb3\\xd6\\xc9\\x5f\\xd8\\x52\\xad\\xf5\\x67\\xb6\\xd3\\x7c\\x54\\xd2\\x97\\x08\\x56\\xa5\\x99\\xf7\\x49\\xe2\\xc5\\x5d\\xac\\x7c\\x23\\xe3\\xfb\\x1a\\x63\\xbb\\x4c\\xc4\\x7b\\x8b\\x94\\xf3\\xd5\\x89\\xac\\x4b\\xee\\xf0\\xaa\\xd4\\xe6\\x29\\x2f\"},\n{{0x58,0x58,0x71,0x94,0x1c,0xc2,0x82,0xe3,0x33,0xd5,0x7b,0xbf,0xc3,0xd4,0xae,0xda,0x86,0x2c,0xfa,0x0a,0x37,0x50,0x30,0xcd,0x59,0x4b,0x36,0x92,0x84,0x8c,0x5f,0x00,},{0x4f,0x34,0x38,0x16,0xcd,0x48,0x05,0x0b,0x67,0x8d,0x3a,0xdf,0x70,0x00,0x88,0x77,0xc9,0xfc,0xf5,0xcb,0x66,0x2c,0xc4,0xad,0x2b,0x93,0x86,0x4c,0x02,0x09,0x07,0x07,},{0x29,0x88,0x56,0xe5,0x70,0x18,0x8a,0xef,0xca,0xd8,0x1b,0xb9,0x70,0xf0,0x76,0x96,0x57,0x70,0xc2,0x67,0x62,0xfe,0x29,0xe6,0x55,0x4d,0xc7,0xaf,0xcd,0xb8,0x01,0x72,0x3b,0xf6,0xc7,0x63,0xb4,0xcc,0xd6,0x5f,0x4e,0x15,0xd7,0xd8,0xea,0x38,0xfc,0xf6,0x7e,0xa9,0xd2,0x85,0x90,0xc7,0x92,0x55,0xc1,0xcf,0xeb,0xa7,0xb5,0xe4,0x5a,0x00,},\"\\x65\\x1c\\x10\\x1b\\x3e\\x2d\\xfe\\xf0\\x78\\x3c\\xe9\\xf6\\x1b\\xd0\\xa8\\xbd\\xc9\\x30\\x7a\\xc0\\x48\\x8b\\x9d\\xd7\\x0c\\xd9\\x0a\\x7e\\xd8\\xf1\\x79\\xa7\\x89\\x35\\x55\\x62\\x95\\xb9\\x1c\\xc2\\xb9\\x72\\x11\\xe3\\xb9\\x81\\xb8\\xda\\xfc\\xb3\\xd0\\x6b\\x76\\xd0\\xb6\\xed\\xa7\\xfc\\x61\\x94\\x5c\\x0e\\xe2\\x65\\x2c\\x5a\\xc4\\x54\\x25\\x64\\x96\\xcb\\x82\\xf9\\x8c\\xc1\\xcc\\x92\\xd8\\x18\\x93\\xb1\\x08\\x2b\\x31\\xb4\\x7e\\x6d\\x22\\xa2\\xde\\x60\\x9d\\xe4\\xce\\x8d\\x7c\\xc4\\xf4\\xa1\\x52\\xc4\\x7f\\x41\\x0d\\x7f\\xc3\\x7d\\x38\\xcc\\xd6\\x29\\xa4\\xb3\\x3e\\x62\\x21\\x89\\x60\\x81\\x79\\x7d\\x07\\x53\\xdd\\x4f\\xaa\\x8a\\x8b\\x44\\xd6\\xc4\\x67\\x71\\x66\\xdf\\xb4\\xd5\\x21\\x54\\x46\\x36\\x0a\\x3c\\x28\\xd8\\xf6\\x8e\\x38\\xab\\x54\\x60\\x8b\\x98\\x82\\x1b\\x83\\xc1\\x87\\xb5\\x39\\x3a\\xd8\\x74\\xa7\\x6f\\x4f\\x5d\\x72\\x94\\x93\\xa1\\xfd\\x74\\xcc\\x77\\x19\\xca\\xea\\x99\\x1d\\x22\\x9c\\x5d\\x0c\\x8c\\x4c\\x5f\\x89\\xd8\\xe4\\x34\\x5f\\x4f\\x52\\x21\\x43\\x13\\x41\\x0b\\x8c\\x06\\xb3\\x31\\x5f\\x45\\xed\\x0c\\x2f\\x91\\x38\\xab\\x96\\x6a\\xec\\x0a\\x64\\x5b\\x6d\\xba\\x76\\x38\\x0a\\x53\\x91\\x23\\xe0\\xf3\\x3b\\x97\\xf3\\xd0\\x60\\x39\\x4a\\x30\\x53\\x58\\x1f\\xfd\\xef\\x3e\\x6d\\x36\\x53\\x11\\x66\\xb5\\x53\\xa9\\xdd\\xe0\\x31\\x05\\xc0\\x4a\\xf6\\x97\\xd9\\x5e\\x95\\x21\\x7f\\xd6\\xdc\\x96\\x8b\\xf3\\xb4\\x48\\xd5\\xf3\\xa8\\xe4\\xf5\\xae\\x7e\\xdc\\x30\\xec\\x78\\xb1\\xae\\xa4\\xf0\\xdb\\x18\\x9a\\x94\\x9a\\x12\\x21\\x38\\xcd\\xfb\\x5f\\x96\\x93\\xdb\\x00\\x4b\\xae\\xd1\\xa4\\x21\\xdc\\x44\\x12\\x2f\\x32\\x72\\x87\\xf7\\x27\\xcf\\x98\\x9f\\xca\\xe3\\xcf\\x3b\\xe3\\xe3\\xdd\\x9b\\x9f\\x53\\x50\\x2c\\xf5\\xd9\\xfb\\x18\\x6d\\xe7\\x91\\xd3\\x10\\xd1\\x22\\x86\\x9c\\x9f\\xc3\\xb6\\x95\\xde\\xc1\\x60\\x74\\x77\\xf3\\xe1\\x49\\xe5\\x2b\\x63\\xcf\\xdf\\xb0\\xd9\\x83\\xe8\\x9a\\xf2\\xf7\\x5a\\x8f\\x48\\x98\\x43\\xec\\x05\\xc5\\xea\\x5f\\x0e\\x72\\x1a\\xca\\xb3\\x87\\xc6\\x80\\x25\\xf2\\x0a\\xbe\\x0d\\x27\\xb4\\xce\\x29\\xf4\\xa6\\x4f\\xb7\\xf8\\xe8\\xa3\\x32\\x87\\x3d\\x3e\\xd1\\x21\\xfb\\x49\\x34\\x14\\xb8\\xcb\\x0c\\x00\\xad\\x3a\\xb6\\x16\\xc5\\xbe\\x52\\x41\\x47\\x1a\\xde\\xe9\\xf8\\xf4\\x69\\x74\\xea\\xe8\\x4a\\x4a\\x8c\\xe6\\xfa\\xbb\\x7f\\x5d\\x9a\\x6b\\x75\\xa7\\xe6\\x70\\x45\\x6f\\xcd\\xcd\\x1d\\x98\\x2e\\x8f\\x82\\x7a\\x4b\\xbb\\x69\\xde\\xc7\\xe3\\x05\\x3d\\xfe\\x83\\x5b\\x70\\x30\\x1b\\x7b\\x76\\x3f\\x00\\x04\\xbc\\x90\\x6e\\x14\\x55\\x42\\xf4\\x87\\xb4\\xdb\\xa2\\xed\\x56\\x1b\\xd1\\xa2\\x03\\x06\\x23\\x6a\\xf4\\xb3\\x6e\\x40\\x68\\xe8\\xc0\\x07\\xb9\\x45\\x4f\\x87\\x41\\xa5\\xf8\\xf0\\x79\\xec\\x1d\\xb8\\x83\\x5e\\xb6\\x54\\x42\\x90\\xd6\\xad\\xb5\\x2a\\x70\\xd7\\x67\\x5d\\x85\\xdf\\x4a\\x9a\\x12\\x55\\xbf\\xd9\\x36\\xc3\\x31\\xfe\\x51\\xc0\\x97\\x7d\\x12\\x4b\\x5a\\x50\\x6d\\x29\\xc6\\xee\\xc3\\x3c\\xaa\\x25\\xd8\\xeb\\x28\\x95\\x2d\\x6f\\xfb\\x9d\\x6e\\x3d\\xa8\\x90\\x38\\x2d\\x88\\x87\\x96\\xd3\\x74\\x60\\x7f\\x66\\x43\\xb8\\x9e\\x73\\x26\\xd9\\xed\\xc4\\x9a\\x0f\\x53\\xbd\\xcb\\x8c\\xc7\\x6f\\xfd\\x39\\x3a\\x77\\x06\\x52\\x2d\\x04\\x17\\x00\\x36\\xcc\\xb6\\x63\\x30\\xdb\\xac\\x9d\\xa7\\xe6\\x16\\x8c\\xaa\\x88\\xcb\\x62\\x18\\x1e\\x55\\xa7\\xb6\\xd5\\x21\\xa2\\x11\\x5e\\x23\\xe2\\x02\\xee\\x24\\x80\\xb5\\x87\\xbe\\x45\\x01\\x44\\x79\\x79\\xa8\\xd7\\x36\\xf9\\x01\\x2e\\xcf\\x00\\xe6\\x7b\\x31\\xe8\\x10\\x4f\\x6e\\x7d\\xf0\\x8a\\x96\\x83\\xcd\\xc8\\x9c\\x03\\xa4\\xe3\\x7e\\xe2\\x29\\x28\\xd4\\x5f\\xa1\\x90\\x94\\xe0\\xd6\\xe7\\xb4\\x0b\"},\n{{0x05,0x88,0xac,0xd4,0xe0,0x9b,0xa9,0x02,0x74,0xc8,0xf3,0xd1,0x57,0x5b,0x2b,0xf3,0x64,0xa7,0x76,0x88,0x4a,0x9a,0xeb,0x41,0x03,0x41,0x5e,0x16,0x3b,0xa0,0xbf,0x81,},{0x3e,0xca,0xe6,0x97,0xb4,0x25,0xd8,0x7e,0x34,0xa1,0xd9,0x44,0x09,0x8e,0x3d,0x32,0xe2,0xc1,0xec,0x56,0xc3,0x62,0x7d,0xf8,0x0b,0xa2,0xb8,0xa4,0x3d,0xdc,0x19,0x03,},{0xa1,0x11,0xb9,0x70,0x6d,0x24,0x2c,0xd3,0x6d,0x6e,0x87,0x41,0xcb,0xb0,0x97,0xb9,0xe2,0xff,0xfa,0x40,0xf4,0x3f,0xd6,0xf2,0xd3,0xd9,0x16,0x93,0x66,0x73,0x32,0xb5,0xf2,0xdb,0x5e,0xe3,0xea,0x20,0xb8,0x32,0x91,0xb8,0x40,0x57,0x95,0xb7,0x4d,0x63,0x3d,0x46,0xf4,0x75,0xab,0x7c,0x47,0x61,0x71,0x18,0x53,0x5b,0x80,0x51,0xd9,0x07,},\"\\xf8\\x28\\xf8\\xc9\\xda\\xd2\\x98\\xc5\\xb7\\x19\\xda\\xa8\\x52\\xb1\\x7e\\x76\\x25\\x98\\xa7\\x0f\\x4e\\xcd\\x16\\xa2\\xfc\\x59\\x6e\\xb0\\x26\\x38\\x99\\xe9\\x83\\xd4\\x4e\\xdc\\xc7\\xbd\\x24\\x0c\\xb0\\x76\\x10\\x60\\x0a\\xe9\\x6a\\xac\\x0d\\xfc\\x3b\\xe3\\x87\\xb6\\x16\\x85\\x08\\x99\\xb5\\xcf\\x44\\xe1\\x76\\x7f\\xfa\\xca\\x3d\\xf3\\x81\\x58\\x59\\x84\\x24\\xf8\\x07\\x14\\x14\\xc7\\x04\\xe6\\x0b\\x42\\x2a\\xd7\\x73\\x77\\xfa\\x7f\\x6a\\x8c\\x5d\\x0e\\xbc\\x02\\x35\\xe2\\xd4\\x3a\\x98\\x4f\\x3a\\xdf\\x75\\x9e\\xb1\\x04\\x47\\xf3\\xc2\\xf6\\xb8\\x0d\\x5a\\x11\\xef\\x41\\xd3\\xa0\\x98\\x52\\xc0\\x93\\x2a\\x1b\\x9a\\xc2\\x3e\\x6f\\x40\\xa1\\x67\\xde\\x21\\x04\\x1b\\xec\\x88\\x85\\xf9\\x43\\x3e\\xb8\\x0b\\x95\\xc9\\x78\\x59\\x58\\x04\\x6c\\xdb\\x7b\\xf1\\x47\\xa7\\x99\\x47\\x82\\x3b\\x41\\x49\\xae\\x05\\x21\\xd7\\xe5\\xaa\\xbc\\x15\\x64\\xfa\\x40\\x44\\x10\\x6e\\x2e\\x39\\x2e\\x9c\\x34\\x44\\x57\\xe9\\x92\\x93\\x76\\xea\\x9b\\x42\\x29\\xc6\\xe7\\x73\\x8f\\xe7\\x90\\x08\\xd5\\x54\\xc4\\x29\\x39\\x69\\x14\\xc3\\x63\\x87\\xf5\\x79\\xb4\\x6b\\xab\\x14\\x6f\\x6a\\x95\\x10\\xeb\\x6f\\x8c\\x85\\x55\\x1c\\xbd\\x84\\xc7\\xdc\\x0d\\x0b\\x1c\\x01\\x0c\\xcb\\xa5\\x96\\x3a\\x7f\\x39\\xf1\\x81\\xe4\\x4d\\xbc\\x98\\xe4\\x95\\xaa\\x63\\xc0\\x10\\x59\\xcb\\xe6\\xa9\\x9b\\x07\\xb4\\x49\\xe7\\x75\\x9c\\x9a\\xf9\\xe0\\xf8\\xd9\\x05\\x4a\\x67\\xa3\\x48\\xfa\\x19\\xd7\\xf9\\x1e\\xc0\\xa4\\xd4\\xf2\\xc7\\x02\\x6c\\x3b\\x84\\x92\\x59\\xa3\\x50\\x41\\x7f\\xd8\\x6c\\xab\\x21\\x42\\xe4\\xcf\\xe3\\xc0\\xaf\\xbf\\x25\\x18\\x2a\\x2d\\x52\\xbd\\x2e\\x0b\\xc9\\x20\\xe8\\x50\\x80\\x83\\x2b\\x91\\xb9\\x27\\xb6\\x29\\x48\\xa6\\x7c\\x31\\x7e\\xb0\\x90\\x91\\x46\\x1d\\x49\\x3e\\xea\\x5f\\xfc\\x47\\xbf\\x08\\x55\\x82\\x96\\x82\\x58\\xa3\\xc8\\xdd\\x81\\xa8\\x58\\x27\\x0b\\xdd\\xaf\\xe7\\x92\\x56\\x84\\xa1\\x5f\\xfb\\x51\\xbc\\xfa\\xab\\x93\\x1a\\xfa\\x46\\x5e\\x30\\x90\\xe8\\x6b\\xe4\\x1e\\x35\\x47\\xcb\\xa2\\x34\\xb8\\x5f\\xe7\\xdb\\x70\\x04\\x96\\xa5\\x05\\x00\\x2d\\xf3\\xca\\x4e\\xae\\xc7\\xb9\\x62\\x78\\xc7\\xd1\\xa7\\x7d\\xb8\\x34\\xa9\\x17\\x97\\xbb\\xb8\\x26\\xd0\\x92\\xaa\\x28\\xb4\\x95\\x45\\xed\\x3b\\x1e\\xda\\x23\\xbe\\x11\\xa3\\xf5\\x28\\xb9\\x55\\xcb\\x0c\\x4f\\xa6\\x6e\\x16\\xe9\\x57\\xe5\\x70\\x4c\\xf3\\x19\\xe5\\xf7\\x9c\\xc0\\x9f\\x2d\\x05\\x4e\\x6d\\xaf\\x19\\xe2\\x92\\x6b\\x11\\xe1\\xe4\\x13\\xff\\x82\\x2c\\xa1\\x41\\xf7\\xc3\\xd3\\x85\\xae\\x95\\xdd\\x20\\xb3\\x46\\xe5\\x83\\xcf\\xb0\\xc2\\x29\\xec\\x39\\xcf\\x88\\x9a\\x54\\x19\\xcd\\x37\\xbc\\x18\\x4e\\xf5\\xfb\\x14\\x46\\x22\\x08\\x0a\\x30\\x2d\\x9d\\x77\\x45\\xc4\\x51\\xf7\\xd8\\x82\\x42\\xcc\\x26\\xb9\\x16\\xa3\\x56\\x9a\\xbc\\x7d\\x1f\\x21\\x6d\\x57\\x79\\x7a\\x47\\x2b\\xc6\\x21\\x76\\x17\\x58\\xe8\\x40\\xeb\\x8e\\x29\\xbc\\x8e\\xfc\\xb7\\xaa\\xfc\\x7c\\xf8\\xf4\\xe5\\x93\\x30\\xd3\\x5e\\xe1\\x07\\x49\\x6d\\xec\\x6e\\x71\\x4b\\x1f\\xa4\\x30\\x98\\x37\\xbb\\x47\\xeb\\x3a\\x06\\xb4\\x60\\x4d\\xd2\\x07\\x33\\xcc\\x0e\\xaa\\xc2\\x64\\x9e\\x18\\xc0\\x73\\x42\\xef\\x55\\xd1\\x9b\\x8d\\x03\\x95\\x91\\xac\\x28\\x69\\xac\\xc3\\x4b\\x6c\\x3c\\x1c\\xa3\\xcf\\x26\\x3f\\xf8\\x4c\\xa4\\x3a\\x5f\\x64\\x65\\xba\\x34\\x88\\x8c\\x10\\x90\\x13\\xb3\\x2b\\xfc\\x0d\\x0d\\x15\\xf5\\xa7\\x6c\\xec\\x27\\x0a\\xb3\\xac\\x9a\\x10\\x63\\x31\\x31\\x2f\\x5a\\x0a\\x84\\x28\\x2c\\x3a\\x3d\\x4a\\xea\\x1e\\x7c\\xf5\\x3d\\xbf\\x8b\\x24\\x0b\\xdd\\x11\\x1c\\x34\\xd2\\xa9\\x3d\\xfd\\x12\\x58\\xfe\\x92\\x67\\x13\\x3f\\x75\\x54\\xdc\\xc2\\x1a\\x8f\\x43\\x9c\\x16\\x5d\"},\n{{0x7d,0x14,0x02,0x3e,0xb4,0x8b,0xbd,0x43,0x76,0x49,0xa2,0x41,0x87,0x79,0x05,0xa3,0xc9,0x32,0xf1,0x46,0x40,0xf2,0x9a,0x0f,0xb1,0x34,0x11,0x4e,0x8f,0x33,0xf5,0x82,},{0xea,0x5c,0x11,0xb4,0xb2,0xc5,0xef,0x4a,0xb7,0x06,0xcc,0xa3,0x47,0x50,0x43,0xc9,0x58,0x18,0xeb,0x56,0x5a,0x79,0x7e,0x33,0x68,0x8a,0xfe,0xac,0xd6,0x8a,0xdc,0xca,},{0x31,0x33,0x9d,0xce,0x23,0x33,0x6d,0xf5,0xb2,0xb1,0x93,0x52,0x2a,0xa3,0xdd,0x2d,0x41,0x14,0xa6,0x6a,0xf1,0x65,0x62,0x89,0xc9,0x52,0xbc,0x11,0xc9,0xb2,0x10,0xf7,0x7a,0x54,0xd4,0x61,0x61,0xf4,0xe0,0xc5,0x2b,0x30,0x13,0xe4,0x0b,0x9e,0x9e,0x84,0x27,0xd8,0x51,0x32,0x5b,0xd7,0x1c,0x4d,0x99,0x35,0x3e,0xee,0xd7,0x51,0x08,0x0d,},\"\\x90\\x01\\xdb\\x31\\xf2\\x79\\xbe\\x50\\x53\\x19\\xb8\\xe7\\x2b\\xde\\x11\\x99\\x51\\x29\\x80\\xdf\\x65\\xf0\\xd8\\xa9\\xb4\\x93\\x04\\x67\\x41\\x3a\\x99\\x7b\\x97\\xa3\\x62\\xb5\\x72\\xa4\\xb4\\x4b\\xc9\\x40\\x48\\x7f\\x18\\xb2\\x08\\xce\\x6a\\xc5\\xc6\\x87\\x16\\xd3\\xaf\\x1b\\xce\\xf1\\x70\\x38\\x3b\\x5c\\x4b\\x5c\\x47\\xe4\\x47\\x37\\x72\\x6f\\x93\\x83\\xbc\\x4f\\x14\\x47\\x68\\xbf\\x5c\\xaf\\xb4\\xe9\\xdf\\xe3\\x97\\x61\\xe6\\xed\\x47\\x89\\x71\\xd1\\xc7\\x0e\\x6d\\xab\\x2f\\xd0\\x49\\x9d\\xff\\x92\\x93\\xb2\\x39\\xd1\\x6c\\x96\\x02\\x61\\xc6\\x82\\x18\\xb9\\xf5\\xb1\\xbe\\xe6\\x90\\xf0\\xd2\\x40\\xc1\\xb3\\xdb\\x71\\x1f\\x9e\\x82\\x1f\\x08\\x09\\xbb\\xeb\\x9a\\xaf\\x24\\x9c\\xcb\\x16\\x8c\\x67\\xd9\\x65\\x56\\x2d\\x24\\xf8\\x48\\x51\\x61\\x40\\xbf\\xd9\\xfc\\x05\\x0d\\x4f\\x20\\xda\\x5a\\x17\\x94\\x46\\x8a\\x9c\\x07\\x25\\xea\\x5c\\x66\\x9d\\x5c\\x63\\x0d\\x93\\x10\\xe5\\x74\\x51\\x07\\xda\\xd3\\x72\\x61\\xb5\\xd9\\x1e\\x38\\xe0\\x85\\x12\\xe6\\xf3\\x73\\xec\\x5d\\xca\\xd5\\xca\\x09\\x07\\x29\\x07\\xc8\\xfb\\x7b\\xf3\\xb9\\x26\\xc3\\x33\\x94\\x90\\xb3\\xf5\\x1f\\x76\\x44\\xe7\\x3a\\xe2\\xec\\x01\\xd6\\x1b\\xe7\\xc6\\x52\\x65\\x36\\xb4\\xff\\xd1\\xab\\x68\\x49\\xfe\\x0c\\x2f\\x40\\xd3\\xbd\\xa2\\xa4\\x9e\\x55\\x50\\xb8\\xdf\\x97\\x90\\x81\\xda\\x85\\x16\\x8d\\x0f\\x71\\x58\\x2b\\x90\\x36\\x77\\x52\\x6d\\x1f\\x1b\\x15\\x11\\xe1\\x38\\xb6\\x84\\xfc\\x46\\xaa\\xc8\\xbd\\x80\\xc3\\xde\\xf7\\xee\\x81\\x38\\x19\\x04\\x61\\x80\\x7c\\x55\\x36\\x12\\x5c\\xb0\\xe2\\xc3\\xd0\\x83\\xa1\\x87\\xc7\\x26\\x9c\\xb5\\x31\\xec\\x36\\x78\\x78\\x7b\\x32\\x55\\x5c\\xf0\\x4a\\xb0\\x93\\xc9\\x00\\x2e\\x7d\\x79\\x2b\\x4d\\x93\\x3f\\x2e\\x30\\x70\\xf3\\x9a\\xc8\\xcc\\xf8\\xd5\\xf5\\x45\\x5f\\x12\\x10\\x9d\\x8a\\x8a\\xeb\\x4e\\x21\\x2f\\xad\\x4a\\x70\\xb1\\x47\\xc0\\x4a\\x7b\\x91\\x84\\x60\\xb1\\x31\\x63\\x76\\xe6\\x40\\x20\\x85\\x95\\x17\\xeb\\x7e\\xe3\\x0c\\x29\\x0b\\xe8\\xb8\\xd6\\xf9\\x67\\x39\\x15\\x25\\x6c\\x3b\\x04\\xb9\\xd9\\x05\\x4b\\x52\\x33\\x8e\\x0d\\x36\\x07\\x85\\xe4\\x6a\\x18\\x28\\x44\\xc5\\xc3\\x76\\x6a\\xea\\x8e\\xd3\\x11\\xb2\\xd4\\x81\\xc0\\xb7\\xb2\\x11\\x4e\\x41\\x8e\\xd1\\x7f\\x8d\\xeb\\xf0\\x1a\\x83\\xff\\x37\\x51\\x70\\x24\\xee\\x9e\\x28\\xe0\\xc9\\x0d\\xce\\x6d\\x05\\x9f\\xfe\\xe4\\x13\\xd2\\x7c\\xd6\\x27\\x83\\xa8\\xb8\\xb5\\x01\\x6a\\xd2\\x76\\xe3\\x9d\\xfd\\x8f\\x8f\\x3d\\xdf\\xc4\\x28\\x10\\x18\\x18\\xce\\x50\\x7f\\x00\\x3e\\xb5\\x8c\\x9a\\x5c\\xc8\\xb1\\xaf\\xf0\\x5a\\xab\\x8f\\x0d\\x7f\\x1d\\x1f\\x6d\\x4b\\x87\\x1d\\xbc\\xed\\x1f\\x3d\\x28\\x66\\x23\\x97\\x52\\xfb\\x13\\xf6\\xe1\\x80\\x34\\xbb\\x2b\\x5a\\x66\\x35\\xca\\xa6\\xec\\xc4\\x62\\xe0\\x58\\xeb\\xe2\\xfa\\x65\\x1d\\x3d\\x0f\\x36\\xe2\\x0a\\x31\\xf7\\x65\\xe4\\xb9\\x58\\x27\\x0b\\xd8\\x25\\xc6\\x81\\x8a\\xac\\x1a\\xd7\\x56\\x31\\x35\\xae\\xed\\xf1\\x4a\\x2b\\x6d\\x39\\x8b\\x6e\\x34\\x00\\x84\\x01\\xb2\\x18\\x46\\x18\\x20\\x07\\x1c\\x5a\\xf7\\x78\\x46\\xcb\\x9c\\x32\\x81\\x90\\xc0\\x61\\xd5\\xaa\\x6e\\x0e\\xcd\\xe7\\xef\\x58\\x56\\xb0\\xe6\\x81\\x4f\\x83\\x3f\\x70\\x40\\x96\\xdf\\x08\\x25\\xfa\\x4b\\x46\\xdc\\xda\\xcf\\xa2\\x7c\\xd8\\x7b\\xd7\\xbf\\xef\\xf7\\xf8\\xca\\xe1\\x66\\xa3\\xa0\\x4d\\x43\\x7c\\x7b\\xe7\\x16\\xc4\\x90\\x45\\xc7\\xbd\\x3d\\x13\\x49\\x62\\x7c\\x9c\\xbd\\x04\\xc1\\x5f\\x00\\xa6\\x96\\xe3\\xcf\\xfb\\xb4\\x5a\\xf2\\x91\\x22\\x62\\x7e\\x7e\\xd3\\x3b\\x42\\x49\\x91\\x3b\\xec\\x00\\xf0\\xe2\\x8a\\xa1\\x12\\x98\\xcc\\xe8\\xb6\\x49\\x08\\x1f\\xe3\\xb1\\x69\\xb4\\xaa\\xea\\xca\\x48\\x5b\\xda\"},\n{{0xe8,0x30,0x6b,0xad,0xa6,0xd5,0x5e,0xb1,0x88,0xd9,0xf7,0x5c,0x81,0x5c,0xc9,0x14,0xe9,0x3c,0x9c,0x72,0x22,0x39,0x1c,0x15,0xbb,0xae,0xaf,0x93,0x54,0x43,0x79,0x35,},{0xbf,0x27,0x98,0xb8,0xe5,0x54,0xf5,0x1e,0x22,0x86,0xc3,0x03,0x4a,0x88,0xe5,0x77,0xff,0x23,0xfa,0x32,0xa6,0x72,0x44,0xea,0x82,0x45,0x91,0x2e,0x8b,0xf4,0x6d,0xa4,},{0xcc,0x66,0x27,0x30,0x8e,0x2f,0x42,0x43,0x83,0xfa,0x70,0x59,0x4f,0x57,0x57,0x91,0x60,0x05,0x40,0x02,0x7a,0x27,0x51,0x61,0x9b,0x28,0x3a,0xff,0xea,0xeb,0xc9,0xc9,0xd2,0x9a,0xc6,0xdb,0x28,0x6d,0xd2,0xc1,0xb5,0x96,0x58,0x7b,0x87,0x8d,0x1d,0xf4,0x78,0x1d,0x43,0x6b,0xb5,0x70,0xc1,0xc0,0xf0,0xd3,0x33,0x68,0xdc,0x66,0x52,0x0b,},\"\\xd7\\x04\\x38\\x09\\xc3\\xe3\\xdc\\x00\\xb1\\x7e\\xfd\\x52\\xc9\\x13\\x0b\\x11\\xb7\\x86\\xf1\\xe2\\x57\\xb5\\xe2\\x2f\\x81\\xa7\\xfa\\xae\\x60\\x0b\\xbc\\xdf\\xd5\\x18\\x53\\x7f\\xe8\\x52\\xc6\\x42\\x35\\x97\\x62\\xfb\\x75\\xe8\\xad\\x85\\x92\\x49\\xe6\\xab\\x49\\xce\\x1b\\xb0\\x4f\\x24\\x92\\xf2\\xaa\\xc3\\x54\\x46\\xba\\x6e\\xb0\\x3e\\x76\\xde\\x3a\\xbd\\x2d\\x5f\\xc7\\xe6\\x14\\x68\\x43\\xad\\xd0\\x42\\x86\\x0a\\x4a\\x16\\xb5\\x9b\\xdd\\x7d\\x03\\x83\\x78\\xa3\\x5e\\x1a\\x04\\xb1\\x21\\x7a\\x55\\x71\\x0d\\x93\\x7e\\x2c\\x90\\x32\\x23\\x2e\\xa2\\xcd\\xd1\\xd2\\x5a\\x0b\\xff\\x71\\xef\\x5d\\x3e\\x0c\\x05\\x6b\\x29\\xcb\\x92\\xf6\\xdf\\x69\\x2b\\xde\\x14\\xdf\\xa5\\x0e\\x13\\x2b\\xeb\\xd8\\x9e\\x9f\\x18\\x33\\x88\\x0b\\x65\\x7a\\x78\\x1e\\x94\\xec\\xb6\\x03\\x04\\x17\\x56\\xe5\\x51\\x7d\\x44\\x23\\xc5\\x6f\\xad\\xc1\\x3e\\x2b\\x31\\x80\\x88\\xfe\\xdd\\xf3\\xb5\\xc8\\x3c\\x20\\xb4\\x6f\\xdd\\xbb\\xa9\\x23\\x05\\xe4\\x86\\x06\\xda\\xb7\\x48\\xce\\x38\\x48\\xb8\\x43\\xf4\\x71\\x1f\\x37\\x0c\\x3e\\xc7\\xd5\\xe1\\x9a\\xb4\\xc0\\xac\\x1a\\xe1\\x5a\\xaa\\xf2\\x3d\\x65\\xfe\\xce\\xda\\xbc\\x08\\x04\\x9b\\x9e\\x29\\x11\\x3e\\x57\\x61\\xed\\x9d\\x1c\\x62\\xeb\\x07\\x5c\\xab\\xb2\\x67\\x4c\\xdb\\xe1\\xe3\\xa8\\x89\\xba\\xe4\\xb1\\xdd\\x31\\xb6\\xa5\\xb2\\xea\\x1b\\x8d\\xed\\xcc\\x3c\\x51\\x5e\\xdc\\x44\\x67\\xc3\\x02\\x31\\x17\\x6c\\xd4\\x4b\\xec\\x8a\\x05\\x79\\x51\\xab\\x5c\\xd3\\x9a\\x96\\x23\\xf8\\xaf\\x84\\x73\\xcd\\x27\\xd9\\x33\\x02\\xbf\\x8a\\xa6\\x24\\xc9\\xc3\\xc5\\x79\\x9d\\xa1\\xdc\\x49\\x44\\x94\\xef\\x8f\\xf1\\xdb\\xe0\\x18\\x7e\\xa5\\x16\\x26\\x70\\xb8\\xd0\\x98\\xc3\\xa9\\x49\\x19\\x39\\x8d\\xad\\xf7\\x9e\\x6c\\x24\\x91\\xc4\\x44\\x39\\x2c\\x29\\xcd\\x50\\xd5\\x74\\x35\\x06\\x32\\x90\\x84\\x2b\\xfa\\x0e\\x85\\x30\\xfa\\xeb\\xc0\\x06\\xd6\\xea\\x78\\x01\\x11\\x7e\\x0a\\x3f\\x01\\x9e\\xe2\\x8f\\xb3\\x79\\x22\\x35\\x40\\x2e\\x2f\\x69\\xb8\\x7a\\x43\\xdc\\x22\\x7f\\x9d\\xe3\\x16\\x02\\x97\\x56\\xc3\\x16\\x7d\\x64\\xa3\\xa3\\xf6\\xd7\\x31\\x60\\x33\\x1d\\x5a\\x18\\xee\\xe5\\xb0\\xe6\\xe2\\x2a\\x66\\x3e\\xfd\\xcc\\x8d\\x67\\xaf\\x3b\\xce\\xd0\\x41\\xea\\x84\\x3a\\x56\\x41\\x60\\x3e\\xc7\\x2e\\xfd\\x64\\x4e\\x17\\x3d\\x19\\x9a\\x8c\\x83\\x0b\\x2e\\xa5\\xfe\\xc0\\x37\\x80\\x27\\xc3\\x72\\x25\\xaf\\xcb\\x60\\x4c\\x4c\\xdc\\xf4\\x09\\xbe\\x1c\\x50\\x9c\\x9a\\x37\\x7b\\xe0\\xd0\\x52\\x41\\x07\\xc6\\xd9\\x2b\\x5f\\x09\\xa2\\x9e\\xfb\\x71\\x09\\x29\\x56\\x70\\xbb\\x1a\\x1d\\xd3\\xea\\x00\\x8b\\xb7\\x91\\x85\\xf0\\x9b\\x98\\xf0\\x20\\xc4\\x3f\\x14\\x39\\x68\\x5b\\x96\\xf6\\x19\\x93\\x11\\xa0\\x90\\x87\\x0f\\x0d\\x9b\\x10\\xd4\\x95\\xcd\\x41\\x0a\\xa9\\x5b\\x7e\\x53\\x74\\x9b\\xe3\\xa6\\xc0\\xfb\\xc7\\x29\\xf9\\x6c\\xf8\\x56\\x43\\x97\\xb0\\x9c\\x13\\x51\\x40\\x16\\x82\\x5f\\x72\\xf1\\x4e\\xb9\\x32\\x94\\xd7\\x01\\x0a\\xcc\\xfd\\x11\\xf1\\x7a\\x6a\\xc8\\xf5\\x44\\x26\\x3d\\x60\\x38\\xd5\\xc7\\xdb\\x29\\x48\\x62\\x91\\xb3\\x0e\\xa4\\x9b\\x6b\\x54\\xcf\\x88\\x82\\x6d\\xd2\\x52\\xcd\\x9d\\xbb\\x57\\xd8\\x41\\xb5\\xa4\\xcf\\x70\\x2a\\x32\\x64\\xfa\\xa4\\xdc\\xcc\\x86\\xab\\x14\\xda\\xf1\\x24\\xef\\x3d\\x53\\x35\\xa6\\x87\\x8d\\x06\\x5c\\x6b\\xa2\\x99\\x91\\x04\\x57\\x65\\xee\\x55\\x42\\xcc\\x9f\\x5d\\x9f\\x35\\x4d\\xcd\\x2c\\x6e\\x0c\\xf7\\xff\\x3a\\x30\\xf6\\x49\\xb5\\x91\\x2d\\x97\\x1d\\x63\\x35\\x78\\xf1\\xe9\\xf2\\x63\\x87\\x4d\\x05\\x65\\xc2\\x47\\x30\\x1d\\xcb\\xd1\\x5d\\x76\\x21\\x1a\\xe2\\xd3\\xd5\\x06\\xfc\\x64\\xde\\xb7\\xe0\\x42\\x56\\x5d\\x43\\x8e\\x2b\\xfb\\x24\\x92\\x43\\xb7\"},\n{{0x36,0x3c,0x1e,0xa7,0xc3,0x2e,0xa3,0x28,0xa0,0x55,0xaf,0x7b,0xd8,0xb3,0xbf,0xd2,0x04,0xfb,0x0b,0xbd,0x4b,0xf4,0x2f,0xfe,0x26,0x2f,0x3a,0x5e,0xbd,0x54,0xda,0x55,},{0x7a,0x83,0xec,0xca,0x51,0xef,0x6e,0x5a,0xa0,0x43,0xa5,0xce,0x04,0xd9,0x28,0x8a,0xdd,0x49,0xa2,0x77,0x54,0x8b,0xd3,0x01,0x6b,0x69,0x3f,0xfa,0x79,0xa2,0x2e,0xdc,},{0x5f,0xd1,0xe5,0xf9,0x92,0x2a,0x12,0xf6,0x36,0xb7,0x2a,0x7d,0x62,0x17,0x09,0x1f,0x94,0x8a,0x55,0xbc,0xb1,0x82,0x6b,0x8f,0xca,0xf9,0x9d,0x26,0x41,0x6c,0x7a,0xb1,0x35,0x1c,0x10,0xf4,0x09,0x3f,0xfd,0x8a,0x2a,0xf8,0x69,0x14,0xa0,0xa9,0x81,0x84,0xec,0x7e,0x06,0xd2,0xde,0xe8,0x7f,0xdc,0x0f,0x4a,0x47,0xf8,0xc6,0x3c,0xf5,0x01,},\"\\xc4\\x1c\\x1e\\x1f\\xb7\\x59\\x54\\xa0\\xae\\x0e\\xbc\\x29\\x09\\x0b\\x9f\\xc5\\x33\\xe6\\x93\\xe7\\xc7\\x10\\x5c\\xfe\\x40\\xef\\x52\\x6e\\x4e\\x12\\xa7\\x40\\x52\\x21\\xf2\\x18\\xc7\\xac\\x01\\x9e\\x1d\\x4c\\x92\\xda\\x28\\x53\\xf2\\xd7\\x26\\xaa\\x62\\x27\\x79\\x24\\xdf\\x0c\\x34\\x3f\\xc3\\xd4\\x7c\\xd5\\xa9\\x9a\\x3e\\x27\\x9b\\x26\\xa1\\xb1\\x3b\\x1f\\x2a\\xa3\\x6f\\x7c\\xcb\\x4b\\x54\\xfb\\xef\\x18\\xbd\\x87\\xa5\\x5f\\x1b\\xc4\\x0c\\xe7\\xb2\\x02\\x91\\x45\\xee\\x7a\\xab\\x39\\x17\\x95\\xac\\x68\\xde\\x61\\x99\\xf5\\x05\\x94\\xfc\\x79\\x61\\x1b\\x85\\x13\\x1c\\x14\\x30\\x21\\xf2\\x6f\\xa3\\x58\\xda\\x0c\\x7c\\x6a\\x65\\xdd\\xe0\\x76\\xda\\xb4\\x88\\x67\\x5b\\x72\\x23\\x09\\xe5\\xed\\x97\\x46\\xd1\\x8a\\x89\\x30\\x99\\x06\\xa7\\xa9\\xdf\\x23\\x7d\\xd2\\x7b\\xd5\\x90\\xcc\\xc7\\x7c\\x40\\x2e\\xf6\\xe1\\x9c\\xa6\\x3c\\xc8\\x6b\\x85\\x16\\x03\\x30\\xee\\x6e\\x1f\\x1f\\x47\\xa2\\xff\\x80\\x7e\\xef\\xad\\xc0\\x09\\x63\\x52\\x0a\\x1c\\x60\\x0a\\x3e\\x45\\xaa\\x7f\\xb2\\x55\\x4f\\x47\\xd8\\x97\\xbd\\x86\\xd8\\x1c\\x3b\\x08\\x77\\x10\\x12\\x22\\xfa\\x78\\x50\\xb8\\x0c\\xe3\\xbc\\x06\\xc9\\xe5\\x8c\\x0c\\x96\\xe3\\x2f\\xec\\x85\\x30\\xc9\\xfa\\x1e\\x41\\x63\\xf0\\xef\\x84\\x56\\x95\\x2b\\xf6\\xdd\\x58\\x04\\x5a\\x36\\x3d\\x61\\x88\\x0e\\x9a\\xc9\\x76\\xa3\\x60\\x3e\\xf7\\x7a\\x4c\\x39\\x5e\\x6a\\x07\\xe3\\x42\\xf6\\x02\\x3b\\x8a\\xf1\\x02\\x25\\xcf\\xf2\\x40\\xef\\xc0\\x36\\x6a\\x79\\x9f\\xd8\\x6e\\x9d\\x06\\x20\\x60\\xd8\\x72\\x40\\x33\\xbd\\xf6\\x75\\x88\\xcd\\x73\\xac\\x28\\x4d\\xe4\\xc6\\x94\\x3c\\xf4\\x5e\\xe4\\xf7\\x5f\\x59\\x37\\xd9\\x7d\\x78\\x10\\x5f\\x0b\\xbe\\xce\\x04\\xd3\\xdc\\xb5\\xe4\\x24\\xef\\xf8\\x9b\\x77\\x3e\\x5d\\x6b\\x4f\\x37\\xef\\xa9\\xa0\\x65\\x4c\\xb3\\xef\\x34\\x52\\x78\\xa6\\x2d\\x87\\x6c\\xfe\\xf9\\xa3\\xdc\\xdc\\xeb\\x70\\x81\\x44\\x18\\x77\\xeb\\xd5\\xfa\\x30\\xc9\\xd9\\x54\\xe3\\x68\\x4f\\xa4\\x76\\xa4\\xf4\\x85\\xd4\\x26\\xfd\\x3c\\x8c\\x32\\xbe\\xa0\\xf9\\xcc\\x20\\xb1\\x5e\\x8f\\xdf\\xc3\\xca\\x4b\\x30\\x2c\\x07\\x4f\\x50\\x81\\x32\\xd1\\x5d\\xe6\\x25\\xc1\\x0a\\xe0\\x73\\x78\\x11\\x46\\x3d\\xcc\\x55\\xfc\\xc4\\x01\\x4b\\x20\\x20\\x8f\\xff\\xce\\xfa\\x9d\\xd4\\x52\\x11\\x9b\\x16\\x52\\xde\\x41\\x34\\x8f\\x69\\xf2\\xc4\\x88\\xf5\\xcc\\x18\\x56\\xd6\\xe7\\x8a\\x5c\\xbe\\x3e\\x37\\x3d\\xd4\\x59\\x8e\\x2d\\x39\\xf8\\x76\\xeb\\x94\\xe0\\xb0\\x1b\\x21\\xfa\\x91\\x29\\xef\\x41\\xb6\\x39\\xf4\\xe0\\x5e\\x69\\xde\\xb1\\x83\\x5e\\xd4\\x4b\\x91\\x12\\xa6\\x86\\x2a\\x5b\\xce\\xa0\\x72\\xc6\\xe1\\xb8\\xf0\\xf0\\x58\\xf4\\x6b\\xac\\x2a\\x84\\x5a\\x58\\x2d\\x14\\x8f\\x17\\x76\\x0b\\x9e\\x0a\\x2b\\xa6\\x0b\\xbb\\xf3\\x88\\x4a\\xf9\\x4d\\xd4\\xc7\\xec\\x9d\\xb0\\x8e\\x9a\\x5b\\xcc\\x6d\\xde\\x13\\x46\\x44\\x2e\\xe1\\xf4\\x70\\x7d\\x1f\\x79\\xb6\\x9b\\xa8\\x67\\xf4\\x18\\xdc\\x27\\x91\\x73\\xf7\\x7a\\xdb\\xc5\\x8a\\xb8\\x5e\\xa3\\x93\\xb9\\xdc\\x68\\x26\\x19\\x00\\xc1\\xca\\xa8\\x2d\\x2f\\x50\\x47\\x4c\\x42\\xae\\xc9\\x11\\x31\\x42\\x78\\xc0\\xaf\\xfa\\x2a\\x6b\\x6c\\x36\\xd1\\xff\\x88\\xf3\\xb4\\x9f\\xb2\\xb7\\xc3\\x39\\xd2\\xa7\\xc2\\xb3\\x04\\x9f\\x8c\\x0a\\x08\\xd1\\x6a\\x9e\\x8d\\xf9\\x3d\\x13\\x0d\\xa4\\x84\\xbd\\xba\\x6d\\xbe\\xc5\\x34\\xcd\\x51\\x09\\x7a\\x04\\x82\\x21\\x10\\x6b\\xab\\x48\\xd6\\x7f\\x95\\x1b\\x75\\x05\\xa1\\x48\\x48\\x92\\xb8\\x57\\x79\\xc5\\xa3\\x11\\x17\\x02\\x12\\x4d\\x95\\x7a\\xcf\\x2d\\xc3\\x52\\xef\\x9b\\xa2\\x47\\xbc\\x80\\xe2\\xce\\x96\\x26\\x9c\\xe8\\x5e\\x78\\xb9\\xeb\\xda\\x98\\x90\\x76\\xdd\\x5f\\xf7\\x3e\\x1e\\xb2\\x75\\xe5\\xd7\"},\n{{0xdb,0x22,0x28,0xff,0xff,0xa9,0xd2,0x53,0x4a,0xef,0x91,0x8f,0xb8,0x5b,0x82,0x1a,0xd3,0x60,0xe2,0xd3,0x9d,0xec,0x5a,0xeb,0x2d,0xb0,0xdf,0x02,0x49,0x7f,0x94,0x16,},{0x6d,0x01,0x95,0x77,0x7f,0x81,0x05,0xff,0x52,0x3b,0x79,0xc5,0x9e,0x3c,0x30,0x81,0xfe,0x89,0xdb,0x6f,0x87,0x03,0x3f,0x09,0x4f,0xa5,0xa9,0x40,0xce,0xf8,0x4b,0xb4,},{0x82,0x18,0x9d,0x34,0x0b,0xc1,0x1c,0xea,0xa4,0x00,0x41,0x0e,0x08,0xba,0xe9,0xd9,0x01,0xaf,0x05,0x91,0x25,0xe9,0x53,0x78,0x6f,0x8a,0x04,0x3d,0xdf,0x11,0xf7,0xb2,0xf8,0xe3,0xb6,0x17,0xac,0xcd,0x78,0xe2,0x93,0x9a,0xdf,0xab,0xf2,0xd2,0x47,0x1f,0xaf,0xd6,0xf5,0xbc,0x45,0xb1,0x40,0x75,0xb3,0x28,0xe3,0x4d,0x80,0x75,0xb2,0x07,},\"\\xfc\\x07\\xcd\\x99\\x04\\x0f\\x13\\xe5\\xa8\\x4f\\x94\\x74\\x6d\\x6b\\xb8\\x68\\xf7\\x52\\xb4\\x48\\xb6\\x2d\\x99\\x59\\x3e\\xf2\\x9e\\x43\\xcc\\x82\\x45\\xf0\\x47\\x0f\\x65\\x55\\x2d\\x64\\x32\\x20\\xf6\\x71\\x92\\x85\\xe1\\x5c\\x37\\xa6\\xd1\\x74\\xae\\xf7\\x60\\x88\\xcc\\xda\\x5f\\x88\\x68\\x5b\\x52\\xda\\xe2\\x84\\xc6\\x5b\\x38\\x0d\\xa3\\x45\\xa2\\xe1\\xaf\\x2e\\xd7\\x64\\x80\\xd2\\x69\\xcb\\x93\\x4b\\x43\\x17\\x62\\x0b\\x79\\x2e\\xbb\\x39\\xb2\\xa6\\x78\\x24\\x7d\\x6d\\x81\\x5f\\x2a\\x5c\\xb9\\xaa\\x56\\x0e\\x4b\\xf6\\xde\\xba\\x4c\\x0a\\x0d\\xdc\\x82\\xd0\\xe5\\xa5\\xa6\\x5a\\xcb\\xc4\\x78\\xe1\\xec\\x6b\\x06\\x4d\\x7b\\xb7\\x38\\x8a\\x73\\xf6\\xed\\xa3\\x0b\\x0b\\x6b\\x73\\xdd\\x8f\\x87\\x92\\x63\\xad\\x1a\\x03\\x48\\x67\\x1d\\xcf\\x21\\x1c\\xb9\\x6e\\xd0\\x8e\\xd5\\x2f\\x33\\x17\\xda\\x68\\x18\\x5d\\x6b\\xb2\\x58\\x9d\\xc1\\x1d\\x75\\x5d\\x47\\xa3\\xb6\\xf6\\xa0\\x38\\x6a\\x85\\x94\\xd9\\x57\\x0b\\x2e\\x9b\\x0d\\x4b\\x5e\\x13\\xdc\\xcd\\x9b\\xb7\\xac\\xbe\\xf0\\xab\\x27\\x6a\\x7a\\xeb\\xe1\\x29\\x31\\xbe\\x67\\xf1\\x0d\\xe2\\x67\\xa0\\x29\\x89\\x53\\x01\\xf5\\x66\\x25\\x30\\xad\\x8a\\xb3\\xd2\\x30\\xb3\\xb6\\xd7\\x09\\x3a\\xcd\\xfb\\xf2\\x74\\x75\\x7a\\x90\\x78\\xe2\\x0c\\x23\\xbc\\x82\\x2d\\xef\\xfa\\x61\\x00\\x54\\x86\\x10\\x2c\\x01\\xab\\x82\\xbd\\xc8\\xcd\\xcf\\x1b\\xb3\\x7f\\x9b\\x56\\xd3\\x9e\\x50\\xfd\\x5a\\x68\\x95\\x41\\x6e\\x76\\x7f\\x4e\\x36\\xc1\\xa4\\x17\\x78\\x90\\x81\\x25\\xb5\\xca\\x3f\\x92\\xa9\\x0d\\xa9\\xad\\xdf\\xf1\\x55\\xfb\\x1f\\xd7\\x76\\x88\\x08\\xa8\\x0f\\x20\\x3e\\xd7\\x37\\xef\\x00\\x77\\x63\\xbd\\x2f\\xea\\x9f\\xf2\\x8c\\x84\\xb4\\x35\\x51\\xc9\\xfc\\x43\\x8f\\xfc\\x47\\xfc\\xfc\\xf6\\x4d\\xc7\\x70\\x06\\x13\\xaa\\x8b\\x3a\\xf8\\x63\\x3a\\xe8\\xb6\\x98\\x74\\x37\\xc0\\xaa\\x47\\x81\\xbe\\x1e\\x82\\x13\\x96\\xc5\\x36\\xcb\\x30\\x05\\xd0\\x55\\x49\\xb1\\xcb\\xa7\\x01\\x35\\xaf\\xb7\\xfe\\x30\\x68\\x96\\x1c\\xad\\x3a\\x14\\x63\\xcc\\x0b\\x55\\x60\\x68\\x4e\\x27\\xbb\\xa7\\x7a\\xef\\x41\\x9d\\x82\\x38\\x68\\xe0\\xce\\xba\\xd1\\xf1\\xce\\x0a\\xe9\\x02\\x74\\x4a\\x15\\x2d\\xd2\\x94\\x51\\xa1\\x7e\\x28\\xa8\\x9a\\x71\\x58\\xa1\\x83\\x6e\\xfc\\xe4\\xa3\\xe5\\xc7\\xd1\\xfa\\xa4\\xc3\\x87\\x5b\\xc4\\x6c\\x4d\\x9b\\xe2\\x2d\\x66\\xd3\\x66\\xac\\x6f\\x59\\x53\\x8a\\x00\\xb2\\x75\\xb0\\x2f\\xac\\x6d\\xa7\\x55\\xa8\\x54\\x08\\x19\\x97\\xd5\\xd1\\xd0\\xe6\\xe5\\x68\\xa5\\x95\\x8c\\xf3\\x34\\xc5\\x18\\xcd\\x51\\x7a\\xb9\\xd7\\x3c\\x48\\xd6\\xcb\\xc4\\xae\\x4e\\xea\\x43\\x53\\x11\\x3e\\x7e\\x4a\\x7c\\x05\\x92\\x0e\\x68\\x6b\\xf0\\x7a\\xfb\\xfb\\x8d\\xd2\\xec\\x4f\\x18\\xfa\\x71\\x38\\xe5\\x7d\\x33\\x2c\\xd7\\xa4\\x22\\x8f\\xea\\x73\\xbc\\x09\\x25\\x2f\\x24\\x42\\x72\\x94\\xeb\\xd3\\x64\\x5e\\xe0\\x99\\x6c\\x2e\\x85\\x1a\\x8a\\xa5\\x1a\\x7c\\xd9\\xfc\\x2e\\xab\\x47\\xc0\\xab\\x21\\x3f\\x4f\\x51\\xd2\\x16\\x09\\x1e\\xd0\\x89\\xe4\\x59\\x2e\\x9b\\xb0\\x82\\x8b\\x85\\x8f\\x84\\xf6\\x0b\\x93\\xad\\x84\\xa0\\xa2\\x28\\x27\\xcb\\xd2\\x74\\x14\\xb7\\x81\\x32\\x2a\\x04\\xd3\\x96\\x08\\x28\\xf6\\x38\\xdf\\x28\\x34\\xc7\\xf7\\x83\\x9d\\x70\\xdb\\x12\\x6b\\xee\\x5a\\xf2\\xee\\x75\\x59\\xa8\\xac\\x4c\\x01\\xa6\\xc3\\x91\\x39\\x6a\\xf9\\x3f\\xa0\\x60\\x89\\x40\\x29\\x7d\\xdf\\x89\\x00\\xc5\\xdd\\xb4\\x66\\x34\\x0a\\xe5\\x1c\\x60\\xc7\\xea\\xd7\\x62\\x44\\x7e\\x76\\xd8\\xbc\\xcb\\x57\\x39\\x97\\xcf\\x66\\x14\\xd1\\x88\\xa0\\xb9\\xa2\\xf5\\x6e\\xed\\x9b\\x0f\\x9d\\x46\\x3a\\x19\\x78\\x7f\\x40\\x92\\x58\\x1a\\x65\\xc6\\xbf\\x78\\x1b\\x93\\xc5\\x60\\x87\\xe5\\x4e\\xe1\\x34\\x3a\\xab\"},\n{{0x66,0xb5,0x0f,0x69,0x2e,0x39,0x5e,0xb8,0x33,0x86,0xe0,0x27,0xc8,0x2c,0xe3,0xfd,0xee,0x3b,0xd8,0x99,0xb0,0xd3,0x17,0x9d,0xb0,0x86,0xfb,0xf5,0x24,0xf5,0x74,0x59,},{0x44,0x85,0x36,0xe9,0x82,0x40,0x84,0x37,0xce,0x89,0x67,0x40,0x53,0xe3,0xc5,0x89,0xc9,0x8c,0x09,0x5c,0x60,0x02,0x1a,0x11,0x81,0x78,0xc6,0x26,0x1d,0x88,0x10,0xfe,},{0xbd,0x13,0xf6,0x36,0x2c,0x07,0x07,0x89,0x22,0xf3,0x0c,0x63,0x30,0x75,0x1b,0xf6,0xe7,0xcf,0x42,0xa7,0x69,0x16,0xee,0x65,0x3e,0xb1,0x7a,0xcc,0xff,0x1f,0xbb,0xca,0x35,0x25,0x8c,0x4c,0xbc,0x58,0x2a,0x5e,0x8c,0xc9,0x4f,0xd2,0xc7,0xed,0xeb,0x53,0x76,0x2f,0x1f,0xc2,0x31,0x23,0xd7,0xf4,0xf1,0x45,0x40,0x9b,0x31,0xcd,0x38,0x02,},\"\\x74\\x28\\xa9\\x64\\x21\\x2b\\xcb\\xe8\\xdf\\x7d\\x59\\xe4\\x8e\\x92\\x34\\x80\\xaa\\x0e\\xe0\\x9b\\x91\\x0d\\x04\\xef\\xb6\\x90\\x36\\x62\\xef\\xc3\\x10\\x7a\\xc8\\xfd\\xc0\\xc5\\xf3\\x92\\x72\\x74\\x0c\\xd8\\x77\\xe1\\x6c\\xd7\\x1c\\x54\\x92\\x38\\xc3\\x37\\x22\\x0c\\xe2\\xf6\\xb5\\xa1\\xfc\\x6f\\x7b\\x0a\\x1c\\xd4\\xed\\x21\\xd9\\x38\\x89\\x08\\x1e\\x34\\xfb\\x7f\\xde\\xcf\\x41\\x78\\xbb\\xd4\\x31\\xe6\\x11\\xe5\\x39\\xd9\\x00\\xc3\\xd0\\xac\\x3d\\xc7\\x10\\x7b\\x36\\xb4\\x1d\\x6d\\x0d\\x5d\\x32\\xc1\\x97\\x27\\xf9\\x08\\xb6\\xeb\\x36\\x7f\\xeb\\xb3\\x52\\xa4\\x93\\x58\\x1f\\xf1\\x28\\xb5\\x6c\\x4c\\xaf\\x6f\\xb8\\xe0\\x99\\x81\\xf0\\xd3\\x79\\x57\\xd1\\x28\\x20\\x17\\xfb\\xb8\\x07\\x61\\x4c\\x20\\xf4\\x65\\xdc\\x02\\xb0\\xcd\\x96\\x99\\x83\\xbd\\x5a\\xe1\\xeb\\xf6\\x57\\x8d\\x7f\\xf3\\xce\\xff\\x32\\x0e\\x25\\x56\\x21\\x99\\xde\\xe9\\x34\\x75\\x7c\\xc1\\xf5\\x8d\\x55\\x40\\xc4\\x1a\\xac\\x1c\\xe4\\xf2\\x11\\xf0\\xb8\\xec\\x41\\x07\\x17\\x40\\x30\\xe7\\x02\\xbc\\x6a\\x8a\\x9c\\x85\\xc5\\x05\\xc9\\x31\\x6a\\xef\\xea\\x3e\\x43\\x72\\x24\\x2d\\xe0\\x19\\xb3\\x5e\\x2b\\xd3\\xc5\\xa9\\x56\\x52\\x19\\x71\\xc1\\x06\\xa3\\xad\\xbb\\xc1\\x3c\\xdc\\x4f\\x7f\\x9d\\x3c\\x58\\xb9\\x6a\\x34\\x4b\\x4a\\xc3\\xef\\x6b\\xd8\\xac\\xa6\\xed\\x98\\x76\\xb4\\x3e\\x64\\x97\\xfa\\xf7\\xfa\\x4c\\xf2\\x7f\\xbc\\xb6\\x65\\x73\\x0c\\x09\\x1e\\x13\\xaa\\xf7\\xe9\\xef\\xe7\\xdd\\x10\\xe1\\x4e\\xb1\\x9a\\x92\\x00\\x42\\x42\\x10\\xec\\x8b\\x8f\\xba\\x7e\\x69\\x44\\x4c\\xe1\\xa9\\xe3\\xa7\\xb2\\x6c\\x11\\xf6\\xb7\\x14\\x5b\\x69\\x83\\xa7\\x80\\x57\\x76\\x48\\x40\\x31\\xbf\\xf5\\x2e\\x81\\xae\\x76\\x9b\\x70\\xa2\\x82\\xb0\\x94\\xff\\xb5\\xfb\\x55\\x25\\xdc\\x1a\\x87\\x2e\\x20\\x7e\\x82\\x7a\\x2e\\x11\\xf4\\xec\\xf7\\xb5\\x30\\x8c\\x74\\x8a\\x92\\x78\\xea\\x7b\\xd6\\x61\\x88\\x19\\x44\\x00\\x43\\x0c\\x8c\\xd5\\x96\\xeb\\xb8\\x72\\x21\\xe5\\x36\\xf6\\xaf\\xe1\\xf1\\x50\\x5d\\x6a\\x59\\xf4\\x1d\\x16\\xa2\\xf0\\x14\\xe1\\xcf\\xa5\\x13\\xf7\\xa6\\x97\\x31\\xd7\\xbf\\xdb\\x2a\\xff\\xce\\xfe\\x05\\x37\\xd4\\x2c\\x79\\x6e\\x3f\\xd2\\x7e\\x41\\xb7\\xca\\x72\\x05\\x1b\\xef\\x28\\xbb\\x7b\\xde\\x70\\x10\\xdc\\xfe\\xd8\\xaa\\x16\\xef\\x67\\x6d\\xb6\\xe5\\x20\\xc3\\xce\\xf8\\xd6\\xf5\\x8a\\x9a\\x28\\x13\\xcf\\xf0\\xf7\\x04\\x1f\\x87\\xfb\\xfb\\x84\\x31\\xe0\\x20\\xed\\xe1\\xd4\\xea\\xf1\\x9e\\x23\\xb9\\x83\\x44\\x5c\\x59\\x15\\xb5\\x4a\\xdf\\xb5\\x57\\xfc\\x20\\xd0\\x05\\x8f\\x40\\xf5\\xe0\\x98\\x25\\xdb\\xa8\\xd8\\xf2\\x0c\\x00\\xf4\\x3b\\x3a\\xee\\xbb\\x61\\x57\\xbe\\x32\\xec\\x54\\x62\\x7d\\x5d\\x42\\xab\\x81\\x3c\\xf9\\x7f\\x09\\x5d\\x26\\xdb\\x80\\x36\\xc1\\x2e\\x82\\xcb\\x96\\x3e\\x80\\x01\\x16\\x7e\\x61\\xab\\x39\\x3b\\x4c\\xca\\x75\\x5e\\xce\\xa8\\x69\\x95\\x4e\\x32\\x3f\\xa5\\x26\\x2c\\x5f\\xda\\x3e\\x0b\\xe9\\xa5\\x1e\\x5a\\xf5\\x1f\\xa6\\x44\\x48\\x24\\xfb\\x83\\x7c\\xc6\\x7b\\xe5\\x37\\xa8\\x75\\x69\\xc3\\x0c\\xf0\\x11\\x4d\\x39\\xa0\\x39\\x42\\xde\\x4e\\x1c\\xd5\\x23\\x35\\x5d\\xab\\x1a\\xf3\\x60\\x80\\xa9\\xa9\\xa5\\x48\\xbe\\x1c\\x2a\\x7f\\xbe\\x54\\x33\\x77\\x23\\x15\\xd2\\x83\\xe5\\x15\\x6d\\xf6\\x48\\xbe\\xe4\\xb7\\xdc\\xda\\x74\\xf1\\x59\\x05\\xd5\\x42\\xbe\\x54\\x87\\x3c\\x15\\xc5\\x3f\\xf4\\x2a\\xca\\xbf\\x8c\\x56\\xf2\\x57\\xd7\\x64\\x72\\x2d\\xb4\\xe9\\xc7\\x18\\xe1\\x20\\x98\\xa3\\x45\\x74\\x86\\xa6\\xc9\\x47\\xac\\x2d\\xe0\\xaf\\x53\\xe8\\x2c\\xf9\\x50\\xbb\\x37\\xca\\x29\\xc8\\xda\\xdf\\xa3\\x64\\x6d\\xb4\\x98\\x2a\\xf5\\x72\\xd3\\x9b\\x26\\x8c\\x7f\\x96\\xb0\\x3e\\xf6\\xb6\\x53\\xc8\\x79\\x45\\xf2\\x9b\\xc5\"},\n{{0x55,0x32,0x8b,0xe4,0xb3,0x70,0x82,0x27,0x33,0xff,0x39,0x89,0xa6,0xa3,0x28,0x2d,0x65,0xfe,0x8f,0x20,0x7a,0xb7,0x27,0x0d,0x7c,0x2e,0x72,0x7c,0xa3,0xcf,0xaa,0xc4,},{0x51,0x8e,0x02,0xee,0xf5,0x2f,0x5a,0xae,0xbd,0xe3,0xd1,0x08,0xea,0x79,0xec,0xad,0xfc,0x4d,0x99,0x4c,0xe1,0x95,0x36,0x21,0xe5,0x4b,0x7b,0x3b,0x12,0x1f,0xf8,0xff,},{0xf5,0x8d,0xb1,0x9f,0xd8,0x34,0xe1,0x51,0x94,0xc3,0xc0,0xf8,0xa6,0xa5,0x0e,0xbc,0x4c,0xf0,0x74,0xe8,0x0e,0xa2,0xe7,0x0c,0xda,0xf1,0xe1,0x69,0xbd,0x51,0xeb,0xd0,0x99,0x0b,0xad,0x77,0xc4,0xfa,0x20,0x8b,0x8d,0xd1,0xe2,0xc8,0x57,0x4c,0x01,0xb5,0xf5,0x96,0xc8,0xdf,0xa6,0xbb,0x8e,0x6a,0xe3,0xa4,0x7f,0xf4,0x12,0xe7,0xe2,0x09,},\"\\x6c\\x24\\xc9\\xaf\\xbb\\xf1\\x2d\\xca\\xee\\x6f\\x10\\xe4\\x08\\x92\\x52\\xf2\\xc6\\x0b\\x2a\\xb9\\x3a\\x02\\xc1\\x60\\x2f\\xb5\\xde\\x4c\\xe3\\xbd\\x92\\x3e\\xb0\\x2f\\xe1\\x03\\x9f\\xdc\\x15\\x99\\x6a\\x44\\x69\\x15\\xe7\\x67\\xde\\xe0\\x17\\x6d\\xdd\\xb7\\x8e\\x9d\\x6b\\xbf\\x06\\x96\\x75\\x77\\x5a\\x82\\x9d\\xd8\\x08\\xd3\\x76\\xb0\\xcf\\x79\\x20\\xbf\\x1a\\x66\\xe1\\x30\\x3b\\xa5\\x24\\x19\\x78\\x5f\\x25\\xf2\\x8b\\xb3\\x38\\x99\\xeb\\xde\\x84\\x0c\\x0a\\xb1\\x4b\\x91\\x9a\\x65\\x80\\xcb\\xaa\\xc3\\xa8\\x05\\x62\\x7b\\x9c\\x4a\\x77\\xba\\xa1\\x6f\\x82\\x5a\\x9e\\xac\\x2d\\x6d\\x36\\x41\\x65\\x14\\x93\\x37\\x0e\\x50\\xee\\xe9\\x4c\\x74\\x04\\x97\\x64\\x36\\x56\\x05\\xab\\x4d\\xac\\x1a\\x03\\x02\\x27\\xa3\\x30\\xaa\\x17\\x8f\\x2f\\x8d\\xa3\\x77\\xaf\\x73\\xf0\\xbb\\x04\\x0b\\xac\\x12\\x36\\x6e\\x65\\xe0\\x59\\x10\\x55\\xf9\\xf2\\x3e\\xac\\xa3\\x5e\\x96\\x88\\xd8\\x37\\xa3\\xc0\\xd9\\x9c\\x16\\x8f\\xd8\\x86\\xac\\xc9\\x22\\xcf\\x37\\xa7\\x11\\x8e\\xf8\\xa4\\x4b\\xb0\\xa4\\xfa\\x42\\x88\\x04\\x93\\x09\\xa7\\xdc\\x1b\\xed\\x80\\x62\\x1e\\x10\\x63\\xe3\\xe5\\x92\\xc0\\xfb\\xa4\\x2d\\x73\\x98\\xeb\\x15\\xf7\\x40\\x28\\xac\\x15\\xd7\\xed\\x65\\xa6\\x36\\x8a\\x13\\xb7\\xf9\\x56\\xd1\\x95\\x47\\xeb\\x50\\x6c\\xe7\\xec\\x90\\x73\\x4e\\xb9\\x49\\xcf\\xf1\\xd9\\x8c\\xe4\\x14\\xf1\\x0a\\xdc\\xba\\x8c\\x00\\x73\\x20\\x01\\x87\\x50\\xa7\\x1b\\xd3\\x6d\\x3b\\x6b\\xfd\\x61\\x27\\x05\\x45\\x08\\xe3\\xef\\x65\\xd9\\x98\\x48\\x51\\x4d\\x33\\xd6\\x8b\\x58\\xe3\\xa4\\xb2\\x24\\xf7\\x9b\\x6e\\x34\\xdd\\x48\\x03\\x40\\x46\\x7f\\xe7\\xf0\\x25\\xcc\\x88\\x21\\x3d\\x80\\x8f\\xbb\\x5b\\x91\\xe2\\xe4\\x3c\\xf9\\xd9\\x50\\x64\\x07\\x98\\x65\\x92\\x73\\xd4\\x7a\\x25\\xf1\\xf0\\x13\\x2f\\x68\\x82\\xfa\\xad\\xba\\xfb\\xa2\\x8f\\xee\\x5f\\xa1\\x72\\x72\\xc1\\xa9\\x00\\x11\\x72\\xb3\\xab\\x6f\\xf2\\xc3\\x15\\xf2\\x6c\\x07\\x73\\x44\\x05\\xb5\\xee\\x8b\\x5e\\x4f\\x08\\xe1\\xe3\\xb8\\xae\\xa0\\x19\\x46\\x7f\\xb0\\x71\\x88\\x7f\\x19\\x19\\x01\\xa2\\x1c\\x59\\x76\\xc1\\xca\\x8a\\xaf\\x0a\\x1d\\x4a\\x2e\\x69\\x8e\\x76\\x23\\xe9\\xbb\\xe9\\xca\\x2a\\x67\\xa1\\x53\\xa1\\x6f\\x89\\x5e\\x6d\\xd9\\xea\\x92\\x44\\x41\\xb4\\xbd\\x0b\\x67\\x45\\x52\\xe3\\x98\\xb8\\xd9\\x70\\x34\\x3a\\x9b\\xc7\\x76\\xa3\\xa3\\xfc\\x1a\\x86\\x60\\xc5\\x62\\x5d\\x60\\x81\\xb5\\xd8\\x7f\\x0f\\x8a\\xc9\\xf0\\x7a\\xb5\\xab\\xe7\\x7c\\xdb\\x8e\\x30\\xd2\\xfd\\x1f\\x6f\\x46\\x52\\x5c\\x75\\xdd\\x0d\\xd1\\xca\\x32\\x81\\xcc\\x89\\x34\\x6f\\xb3\\xe6\\xd7\\x38\\x8e\\xbe\\xe1\\x54\\xcb\\x59\\xbd\\x9e\\x95\\xed\\x6a\\x41\\xd5\\xdf\\x66\\x8b\\x59\\xea\\x13\\x78\\x68\\xeb\\x12\\x0b\\x8a\\x2c\\xfd\\xf4\\x67\\x44\\x14\\xfd\\x27\\x96\\x99\\xf2\\x8b\\x5a\\x5c\\xcc\\x2e\\x2f\\xc8\\x02\\xa4\\xc9\\xe0\\xb8\\x5b\\x76\\xf2\\x0f\\x6b\\xce\\x2a\\x49\\x54\\x88\\x6f\\xc4\\x02\\x67\\x0a\\x71\\xef\\xd2\\x61\\xf5\\xdd\\x7b\\xca\\x16\\x88\\x4a\\x28\\x7c\\x62\\x2f\\xd4\\x45\\xf6\\x8d\\x44\\x15\\x1c\\xc0\\x13\\x4b\\x22\\x9d\\xa3\\x8d\\xaa\\xab\\x81\\xb5\\xc9\\x60\\xd5\\x77\\x00\\xca\\x92\\xb2\\x6d\\x0b\\x14\\x21\\x34\\xce\\x94\\xb7\\xbe\\x6c\\x18\\x61\\x0e\\xa2\\x13\\x6f\\x8b\\xa8\\x32\\x9a\\x2e\\x8c\\x00\\x0b\\x8f\\x02\\xfe\\x05\\xbc\\xf7\\x2c\\xb7\\x1f\\x8c\\x72\\x53\\x5f\\xfc\\xd8\\x18\\xe3\\x8e\\x79\\x92\\xa8\\xf0\\xc3\\x2a\\xc6\\x21\\x77\\xd1\\x52\\x2a\\xe5\\x52\\xc6\\x0c\\x1e\\xe6\\x16\\xb7\\x5e\\x4b\\x34\\x42\\xe7\\x96\\x57\\xe4\\xa3\\x33\\xc0\\xb3\\xd7\\x44\\xea\\xf2\\x60\\xd0\\xc3\\x36\\x93\\x16\\x86\\xa6\\xd6\\x68\\xc6\\x4f\\xef\\x44\\x00\\x52\\x35\\x2c\\x2b\\x25\\x8c\\xfb\\x65\"},\n{{0x7d,0xa0,0x5f,0x04,0xe5,0xd3,0x8b,0x98,0x9b,0x83,0xf7,0x2f,0x7a,0xb2,0x6c,0x13,0x87,0x76,0x75,0x8f,0x4f,0x57,0x7e,0x49,0xdc,0x73,0xd6,0x01,0x3f,0xf4,0x37,0x59,},{0xb1,0xde,0x51,0x67,0xf4,0xd3,0x30,0x80,0x4e,0xec,0x9e,0xb5,0x65,0xef,0x40,0x55,0xf1,0xb6,0x4d,0xd9,0x5e,0x1c,0x9b,0x27,0xc6,0x7f,0xfe,0xf9,0x14,0x82,0xcc,0xa8,},{0x05,0xf1,0x17,0xf9,0xbc,0x3e,0xa5,0x5d,0x45,0x5e,0x9e,0xf1,0x35,0xe9,0x2e,0x76,0x65,0xd1,0x80,0x70,0xd8,0xf5,0xe3,0x75,0xdf,0x67,0xbe,0x18,0x17,0xce,0x14,0x35,0x7a,0x55,0xe7,0x01,0x66,0xf3,0x26,0xb7,0x7d,0x85,0x24,0x32,0x27,0xcf,0x67,0xd8,0xf2,0xe0,0xbf,0x84,0x40,0xca,0xbf,0xb0,0x52,0x75,0xb3,0x73,0xf1,0xe1,0x19,0x0e,},\"\\xa6\\xa8\\x61\\xd8\\x94\\x7c\\x5c\\xd6\\xad\\x08\\x19\\x60\\x2e\\x32\\xea\\x76\\x81\\xc8\\xf7\\x30\\x10\\xee\\xe5\\x53\\xe5\\xde\\xfb\\xf7\\x98\\x20\\x98\\xb5\\xf7\\xb3\\x99\\x24\\xbb\\x79\\x59\\xad\\x64\\xc3\\x03\\x26\\xbe\\xd5\\x60\\xbf\\x51\\xe9\\x98\\x3c\\xda\\x5d\\xff\\x4f\\x31\\x1e\\xea\\x24\\xcb\\xe6\\x8c\\x61\\x06\\xce\\xac\\x9b\\x84\\x3a\\xa4\\xe2\\xad\\x1b\\x6f\\x8a\\xe1\\xe4\\xf9\\x68\\x71\\xfc\\x02\\x5b\\xe4\\xa6\\x16\\x38\\x5f\\xf2\\xd4\\xb7\\xf5\\x68\\x29\\xab\\xef\\xaf\\x6a\\xac\\xbb\\x78\\x0d\\x6c\\xbb\\xc9\\x51\\xb6\\xe0\\x5a\\x78\\x7f\\x88\\x5e\\x33\\x25\\x61\\x16\\x65\\xec\\xc9\\x24\\x27\\x4a\\xa5\\x31\\xbc\\x13\\x3f\\x62\\xc7\\x6c\\xb3\\xad\\x14\\x8f\\x3c\\x95\\x79\\xa8\\x15\\xa1\\x42\\x00\\xb7\\x64\\x8d\\xae\\x0b\\x07\\xb3\\x27\\xd3\\xbf\\xcc\\xdb\\x6f\\xe3\\xb6\\xcb\\xd7\\x0e\\xa6\\x5e\\x6c\\x0c\\xc2\\x51\\x6a\\x89\\x66\\x96\\xd0\\x7b\\x2e\\x77\\x71\\x3b\\x0b\\xee\\x3b\\x92\\xfb\\x1b\\x6f\\x75\\xb0\\x82\\x0a\\x5c\\xb6\\x2c\\x5f\\xe6\\x20\\x40\\x03\\x94\\x3e\\x24\\x85\\x71\\x66\\xfb\\xdf\\x57\\x1f\\x11\\x5d\\x45\\xf4\\x2e\\x75\\x90\\x1d\\xf8\\xb1\\x2c\\x32\\x61\\x8a\\xac\\xb0\\xd2\\x42\\x86\\xc8\\xd3\\x03\\x96\\x05\\x1f\\xc2\\x72\\xaa\\x17\\xf4\\xd2\\xd4\\x74\\x61\\x15\\x2a\\xac\\xd3\\xfa\\xa2\\xb7\\xb2\\x08\\x31\\x22\\x78\\xe8\\x09\\x24\\x05\\x92\\xd1\\xd1\\xaa\\x58\\x5c\\x56\\x28\\x0e\\x66\\xff\\xd9\\x2b\\x57\\x17\\xd0\\xcd\\x1e\\xb9\\xfb\\x74\\x01\\xde\\xf8\\x79\\x48\\x7c\\x37\\x4e\\x5c\\x53\\x0b\\x6f\\xeb\\xf9\\x11\\x12\\x25\\x74\\xd2\\x4f\\xe1\\x04\\xb4\\xf4\\x5c\\x7c\\x60\\x1e\\x6c\\x91\\x7d\\x3c\\x18\\x82\\xc1\\xad\\x3c\\x55\\x5d\\x8f\\x2c\\xe9\\x55\\xb5\\xa1\\x0d\\xb0\\xd5\\xa8\\xb8\\xac\\x7a\\x62\\x66\\xb2\\xe6\\xb2\\x7a\\xd0\\xee\\x34\\xf4\\x7a\\xd8\\x57\\x36\\x7d\\x52\\xf7\\x09\\x6d\\x4b\\xac\\xef\\x0e\\x46\\x72\\x54\\x88\\x42\\x4b\\x93\\xb8\\x9a\\xcd\\x42\\x9f\\xfb\\x5e\\xf3\\x3a\\x0b\\x08\\x1d\\xd0\\x94\\x79\\x67\\x91\\x96\\x02\\x3c\\x39\\x67\\xf4\\x4a\\xd4\\x1e\\xb1\\xa2\\x39\\x55\\x27\\xfd\\x3b\\x79\\x76\\x8f\\x1b\\x88\\x5f\\x04\\x29\\xb4\\x95\\xab\\x60\\x52\\x56\\x91\\xbe\\x84\\x65\\x06\\x32\\xa2\\xf6\\x6c\\xb6\\x3a\\xd5\\xbf\\x2f\\x6a\\xe7\\x0b\\x66\\x8c\\x5a\\x19\\x3f\\x74\\x99\\xfc\\x4f\\xc4\\x2c\\xf8\\xcb\\x30\\x8c\\xe5\\x02\\x9a\\x50\\x27\\xba\\xbe\\xf5\\x5d\\x19\\x25\\xec\\xfb\\xa9\\xf2\\x7e\\xb6\\x08\\x16\\x19\\xed\\x0d\\xf8\\x56\\x9f\\xd8\\x0e\\x9d\\xa1\\x04\\xdb\\x39\\xb5\\xb8\\x14\\x0b\\xfe\\xbe\\xbd\\x29\\x08\\x54\\x40\\x06\\x58\\x19\\xde\\xba\\x8d\\x46\\x9a\\xe8\\xb3\\xea\\x6d\\x3b\\xac\\x58\\x91\\xf9\\xa4\\xdd\\xfb\\x7f\\x1f\\x06\\xd1\\x3c\\x31\\xa0\\x7e\\xe5\\x3f\\xb5\\x4b\\xc9\\x7b\\xd0\\x86\\x96\\x39\\x4c\\x38\\xe7\\xf3\\x68\\x0c\\x0f\\x02\\xf9\\x75\\xf4\\x69\\x92\\x11\\x47\\xa4\\x09\\x85\\x90\\x97\\x81\\x3b\\x4c\\x3f\\xa4\\x3d\\x17\\x4a\\xc4\\x02\\xf1\\xa5\\x28\\xcb\\x5f\\xc4\\xb8\\x07\\x51\\x84\\x32\\xef\\xf3\\x34\\x07\\xa1\\x11\\xca\\x3a\\x3d\\x7e\\x9e\\x84\\x13\\x5a\\xba\\xc8\\xa8\\xf5\\x2e\\xa6\\x31\\xc8\\x6d\\x74\\xa1\\xc6\\xe5\\x74\\x9e\\xdd\\x14\\x91\\xc0\\x02\\x4e\\x7d\\xe7\\xfe\\x52\\x85\\x68\\x29\\xb7\\x2f\\xd1\\x3d\\xa6\\x3a\\x1a\\x23\\x43\\x34\\x9d\\xf6\\x62\\xab\\x31\\x63\\x53\\x60\\x32\\x34\\x6e\\x53\\x47\\xf0\\x43\\xff\\xf5\\x28\\xbf\\x67\\x15\\x09\\x22\\xff\\xf2\\x02\\x6b\\xab\\x74\\x2d\\xb9\\xca\\xe7\\xcb\\x2e\\x3c\\x74\\x58\\x07\\x19\\x65\\x2c\\x28\\x44\\x7c\\x5e\\x20\\x98\\x23\\x17\\x97\\xee\\x6e\\xf1\\x23\\x1f\\x57\\x92\\x05\\x4b\\xc3\\x35\\x9a\\x32\\xc8\\x6d\\x2f\\x94\\xf8\\x5f\\xa7\\xd4\\xa7\\x41\\x9d\\xd2\\x41\\xff\\x66\\x2a\"},\n{{0x1b,0x8e,0xc6,0x58,0x80,0xed,0xbf,0x03,0x9a,0x13,0xe9,0x70,0xb1,0x5a,0xa6,0x7e,0x19,0x2a,0xa0,0x2c,0xa6,0x5c,0xff,0x9a,0xda,0x17,0xd4,0x55,0x8f,0x40,0x13,0x7d,},{0x12,0xc1,0x19,0x1e,0x4d,0xe3,0xbd,0x44,0xd0,0x39,0x07,0x01,0x53,0xad,0xb7,0xb5,0x81,0xf6,0x00,0xe9,0xa1,0xdd,0x69,0xaa,0x89,0xf2,0x77,0xc7,0x06,0x9e,0x76,0xf8,},{0xbf,0xf2,0x69,0xa3,0x5d,0x6c,0x8e,0x55,0x2c,0xe7,0x16,0xd1,0x63,0x81,0x81,0xce,0x85,0x83,0xb4,0x5c,0x0e,0xc5,0x93,0xb4,0xe5,0x8c,0x40,0xac,0x76,0xe7,0xf8,0x5c,0xa1,0xda,0xff,0xfd,0x68,0x54,0x1e,0x62,0x3a,0x1e,0x35,0xa7,0xc0,0x97,0x26,0x88,0xb2,0x5e,0xed,0x72,0xf4,0xda,0x57,0xec,0xa1,0x68,0x57,0xa8,0x26,0x3c,0xaa,0x0b,},\"\\x37\\xf1\\x8b\\x7f\\x64\\xc5\\x13\\x34\\x79\\xd6\\xda\\xe3\\xbe\\xf6\\x79\\xcd\\xc2\\x1e\\xce\\x3f\\x5b\\x57\\x9a\\x6a\\x9c\\x3f\\xa2\\xe5\\x9e\\x9b\\xe8\\x7d\\x20\\x09\\xf7\\x4e\\x1c\\xfd\\xac\\xcb\\x1c\\xe3\\x7d\\x00\\x70\\x23\\x69\\xbd\\x16\\x9d\\x94\\xfd\\xcf\\x85\\xaf\\x9f\\xa3\\x21\\x7d\\x27\\xe6\\xed\\x6d\\x1d\\x8e\\x5d\\xf7\\x61\\x5e\\x8e\\x37\\xea\\x55\\xde\\x1f\\xd0\\xb0\\x6d\\x77\\xb4\\xc8\\x3b\\x92\\x9d\\x80\\x58\\x6f\\xa0\\x69\\x4b\\xe7\\x2e\\xc8\\xb3\\x65\\xad\\x2c\\xbc\\xdd\\x2b\\x1a\\xd8\\xcf\\x7f\\x03\\x6d\\xfa\\x4d\\xaa\\x1a\\x90\\x36\\xcd\\xb1\\x20\\x43\\x22\\x27\\xb1\\xf0\\x7b\\x88\\x66\\xb1\\x22\\x12\\x03\\x09\\xeb\\x91\\x4a\\xb8\\x4c\\xdd\\xeb\\xa1\\xde\\xc4\\x8a\\xb9\\x26\\x36\\x72\\x85\\x88\\xfe\\xdb\\x3a\\xaa\\xd7\\xe7\\xdb\\xb2\\xac\\x30\\xe6\\x3c\\x6f\\x5f\\x90\\xfc\\x6c\\xe6\\x2d\\x6d\\x3b\\xd8\\x8b\\x0d\\x5a\\xac\\xfa\\x61\\xde\\x9f\\x32\\x67\\xb3\\x00\\x91\\x7b\\x57\\xa4\\x80\\x36\\xab\\x20\\xc9\\xa0\\x54\\x46\\xb8\\x76\\x74\\x94\\xaf\\x24\\x9e\\x7d\\xe7\\xbc\\x50\\x7a\\x22\\x07\\xcc\\x95\\x6f\\x71\\x84\\x55\\x5a\\x7d\\x5d\\x88\\x83\\xbb\\x4b\\x3e\\x93\\xf2\\xdc\\xfc\\x57\\xb0\\xda\\x86\\x38\\x65\\x8d\\xcd\\xce\\x88\\x5d\\x44\\xd9\\xcc\\x68\\xb1\\xd8\\x17\\x0a\\x36\\x77\\xcc\\x5e\\x50\\xcb\\xf3\\x3d\\x54\\x3e\\xba\\xe4\\x47\\x7d\\x92\\x39\\xcf\\x83\\x38\\x4e\\xc5\\x9b\\x42\\x33\\xe8\\xff\\x33\\x43\\xf0\\x6f\\x30\\x18\\x77\\x72\\x9a\\x53\\xd4\\x20\\xbf\\x01\\xc6\\x2e\\x66\\xab\\x7f\\xe5\\x5d\\xd8\\x7e\\xe8\\x23\\xa5\\x8f\\xcb\\x87\\x87\\x0e\\x1f\\x52\\xe8\\x79\\x17\\x7c\\xd4\\x39\\xc5\\x33\\xf5\\xa2\\x23\\xe5\\xa3\\x43\\x6f\\xe9\\xd6\\x42\\x65\\x48\\xda\\xcf\\xc8\\x6a\\x08\\x46\\xd3\\xed\\x23\\xac\\x04\\x25\\x63\\xe8\\x87\\xff\\x46\\xaa\\xd0\\x05\\xf4\\xe1\\xde\\xe3\\xee\\x0e\\xe4\\xc2\\x7a\\x72\\x51\\x70\\x9a\\xe4\\x0a\\xbc\\x5e\\x25\\x68\\x64\\xe4\\x78\\x5a\\x4e\\xdd\\x8b\\x2a\\xdf\\x1b\\xc5\\xb4\\x01\\x8e\\x28\\xd0\\xb1\\x75\\x86\\x7b\\x02\\xd0\\x52\\xa6\\xe1\\x7e\\x41\\x1a\\x3d\\x8b\\xeb\\x2a\\x42\\x08\\xb7\\x6c\\xc6\\x21\\xfd\\x18\\xbe\\x14\\x8e\\x23\\x5d\\x55\\xaa\\x71\\x27\\x70\\x65\\x57\\xde\\xc0\\x53\\xa1\\x3f\\x1a\\x47\\xdf\\xda\\x40\\x5b\\x3f\\xe5\\xbd\\x28\\xef\\x5d\\x34\\x86\\x19\\xf5\\x1e\\x59\\x5e\\xf5\\x05\\x5f\\x83\\x9e\\xfa\\xf1\\x10\\xe4\\x90\\x16\\x31\\xac\\x31\\xa0\\x2f\\x4f\\x7e\\xe4\\x24\\xa3\\xa2\\xc3\\xe0\\x0d\\x26\\x02\\xd2\\xcc\\x1e\\x49\\x29\\x06\\xee\\xa4\\x20\\xa9\\x26\\x82\\x38\\xac\\x66\\x22\\xa0\\x89\\x74\\xe5\\x73\\x02\\x92\\xe6\\xed\\x51\\x02\\x56\\xef\\xde\\x66\\x7e\\x0d\\x9a\\x0f\\xf2\\x21\\x3f\\x54\\x12\\x0c\\xcd\\x81\\xff\\xaa\\x6b\\x7c\\xc4\\x81\\x41\\xa2\\xb7\\x29\\x85\\x2a\\xf5\\x83\\xd2\\x6a\\xa5\\x1f\\xbd\\xe6\\x7b\\xe4\\xdf\\x14\\xe5\\x20\\xc2\\x25\\x7a\\x73\\xc5\\xc2\\xe3\\xc3\\xd8\\x7d\\xfb\\x25\\x36\\x11\\x75\\xfd\\x18\\xab\\xd7\\xe9\\x9a\\xa0\\x9b\\x85\\xf8\\x8f\\x19\\xc8\\xd8\\x2d\\x45\\x85\\x8f\\x31\\x44\\xc5\\xdf\\xb7\\xa4\\x9e\\xde\\x45\\xb4\\xef\\xd8\\x71\\x05\\x92\\xa3\\x72\\x06\\x36\\xe7\\xe8\\x89\\xc7\\xe2\\x2a\\xd1\\x3b\\x2d\\x44\\xbb\\x7e\\x2b\\x47\\xb2\\x96\\x3a\\x5f\\xa3\\xf2\\x55\\x7b\\x85\\xbc\\x0c\\x69\\x3d\\xe3\\xd2\\x2e\\xf9\\x46\\x4f\\x7b\\x81\\x4a\\x20\\xa4\\x67\\x6a\\xd2\\x6f\\xca\\xa0\\x35\\x44\\xc6\\xaa\\xd4\\x12\\x83\\x09\\x5f\\xcd\\x12\\x10\\xaa\\x8c\\xc0\\x29\\xff\\x5a\\x26\\x00\\x5a\\x89\\x12\\x26\\xc2\\x98\\xe9\\x4a\\x52\\xaa\\x71\\x33\\x91\\x3e\\xc9\\xd2\\x2a\\x5b\\x2a\\xc0\\xbc\\x6f\\x15\\xb2\\x51\\xd0\\xb9\\x38\\x89\\x21\\x3c\\xd1\\xb1\\xe5\\xc6\\xfd\\x08\\xf1\\xa8\\xf5\\xcb\\xd4\\x21\\x53\\x29\\xa3\"},\n{{0xe7,0x53,0x88,0x02,0x6a,0x6a,0x6d,0x6c,0x6d,0x19,0x9e,0x36,0x29,0x93,0xa5,0xb1,0x04,0x49,0x01,0xe1,0x8a,0x76,0xc2,0xfa,0xc7,0x26,0x1a,0x6d,0x1c,0x19,0xa4,0xf3,},{0xb9,0xce,0x14,0x25,0x1c,0x0c,0xdf,0x3b,0xdd,0xb2,0x06,0xdc,0x6b,0x8b,0x2b,0x7f,0x5b,0x7e,0x4d,0xd1,0xbe,0x2c,0xe1,0x86,0x3f,0xf1,0x88,0x06,0xae,0x00,0xf1,0xee,},{0x6d,0x0f,0x83,0xd9,0xc5,0x5d,0x84,0xbc,0xf9,0xa8,0x61,0x47,0xd9,0xb6,0xba,0x9a,0xd5,0x37,0x83,0x2f,0xd0,0xf9,0x9d,0xae,0x7e,0x72,0xc8,0x13,0x9a,0xfc,0xb3,0x0c,0x7b,0x24,0xf6,0xb2,0x92,0xe3,0x2f,0x98,0x47,0x09,0x75,0x51,0xb7,0xfb,0xfd,0x51,0x0c,0x84,0xe8,0x9b,0xe9,0x82,0x54,0x44,0x14,0x57,0xbd,0x08,0xe5,0xf0,0x53,0x02,},\"\\xb9\\x9c\\xdc\\x84\\x72\\x11\\xc0\\x66\\x42\\xdd\\x11\\x1b\\xc5\\xe0\\xbe\\xca\\x53\\xa7\\x4f\\xfb\\xa2\\xe3\\xac\\x93\\xaf\\xb4\\xb0\\x94\\x75\\x18\\xe8\\x32\\x35\\x27\\x33\\x0a\\x4e\\xfe\\xfb\\xe4\\xba\\xfa\\x00\\xba\\xfe\\xcb\\x43\\x4a\\xb1\\xe5\\xb7\\xce\\x65\\x65\\x6f\\x7a\\x4f\\xd8\\x56\\xaa\\x6c\\x38\\x5e\\xd8\\xd7\\xbd\\x62\\x85\\x58\\x0d\\x7d\\xd6\\x08\\x82\\xe6\\x9c\\x19\\xda\\x07\\x69\\x09\\xd6\\x47\\xde\\x09\\x5a\\x80\\xe9\\x8a\\xd8\\x9b\\x81\\x4a\\xad\\xcb\\xbf\\x6f\\x03\\x3c\\x49\\x20\\x2f\\x65\\x6c\\x09\\x10\\x50\\x39\\x59\\xcf\\x97\\xcd\\x0f\\xa8\\x2d\\x5f\\x6d\\x22\\xfb\\xa3\\x38\\x99\\x51\\x29\\x4c\\x4f\\x7c\\xdc\\x21\\xeb\\x82\\x44\\xbd\\x65\\x60\\x63\\x7a\\x5e\\xca\\x62\\xa8\\xeb\\xa1\\xf4\\xa9\\x33\\xd1\\x87\\xa7\\x5f\\x86\\x71\\x16\\x43\\xaf\\x35\\x88\\x31\\xc8\\xc1\\x6a\\x9a\\x0f\\x09\\xe2\\x53\\xb2\\x39\\x5e\\x9c\\xb3\\x71\\x61\\x1e\\xec\\xdd\\x66\\xb4\\xab\\x52\\x1a\\xa9\\x4b\\x3f\\x20\\x23\\x7e\\xae\\x41\\xcd\\x10\\xc5\\xe2\\x1a\\x45\\x2d\\x48\\xe7\\x48\\x18\\x7f\\x35\\x4a\\x67\\xad\\xf6\\x81\\xb0\\xfe\\x61\\xcd\\xae\\xc9\\x4a\\x5e\\xaf\\x01\\x26\\x9f\\xce\\xb5\\x70\\xd5\\x14\\xff\\x3c\\x55\\xff\\x1d\\xba\\x2f\\xd2\\xdf\\x17\\xf8\\x6a\\x8a\\xeb\\x74\\x78\\x38\\x11\\x3d\\xee\\x94\\xa4\\x3b\\x13\\x84\\xcb\\xe1\\x33\\xcd\\xf6\\x42\\x7e\\x8d\\x12\\x2e\\x4e\\x93\\x37\\x04\\xda\\x6e\\x26\\xcf\\xce\\xe9\\x7f\\xe3\\xf6\\x29\\xb6\\x0b\\x91\\xb2\\xdd\\x86\\x38\\x67\\xfa\\x79\\x80\\x1e\\x2b\\x91\\x6e\\xc4\\xc0\\xfb\\x62\\xe0\\x71\\x59\\x42\\x1e\\x65\\x79\\x74\\x30\\x7a\\x1d\\x02\\xf7\\xf2\\xed\\x47\\x24\\xa8\\xb5\\x21\\xa8\\x61\\xf5\\x5f\\x35\\x52\\x1e\\x8b\\x2e\\x1a\\x84\\x90\\x4c\\x42\\x8c\\xfc\\x5b\\x60\\x14\\xbb\\x0f\\x8b\\xa8\\x43\\x4c\\x22\\x09\\xbd\\x40\\xac\\xa3\\x11\\x30\\xdb\\x97\\x74\\x33\\x33\\x59\\x7d\\x23\\x51\\xd5\\xf6\\x81\\x17\\x41\\xf6\\x26\\x88\\x97\\x3b\\xd7\\x73\\xd3\\x02\\x66\\xfd\\x1e\\xfb\\xd8\\x9d\\x47\\xa9\\x64\\xf9\\xd0\\x19\\x97\\x15\\x3d\\x08\\x7d\\x92\\x69\\x66\\x16\\xdd\\x10\\x3a\\x93\\x4c\\xcb\\xac\\x4c\\x1d\\x14\\x2f\\x20\\x75\\xd4\\xe2\\x2c\\x3d\\xa4\\xa0\\xe9\\x73\\xb2\\x38\\x63\\x19\\x62\\x87\\xb7\\x91\\x74\\xfa\\x29\\x75\\x5f\\xc6\\xd9\\xb5\\xe1\\x00\\xac\\xe0\\xa4\\x59\\x75\\xe5\\x03\\xb2\\x54\\xd3\\xf1\\x95\\xc2\\x61\\x71\\x09\\x10\\xfe\\xf1\\x06\\x89\\x2c\\x08\\xbb\\x29\\x6d\\x23\\x0c\\xde\\xa9\\xf5\\xa1\\x1f\\x91\\xac\\xaa\\x6e\\x7c\\x05\\xe9\\x2c\\x28\\x1d\\x2b\\x31\\x55\\xfe\\x44\\x80\\xb0\\xaa\\x5e\\x0d\\xb4\\x1d\\x10\\xe0\\x5c\\xfd\\xef\\xa4\\x36\\x40\\x51\\xcb\\x75\\x5d\\xc7\\x2f\\xfa\\x97\\x8c\\x00\\xb9\\x4a\\x5f\\x21\\x2d\\xc6\\x91\\xf8\\x39\\xb4\\x9d\\xe9\\x7e\\x01\\x39\\xd6\\x5e\\x8d\\x73\\xb2\\xb2\\x89\\xb2\\x6a\\x12\\xc6\\xcc\\xd8\\xed\\xc0\\x4a\\xdb\\x45\\x2a\\xf7\\xff\\x09\\x4a\\xa9\\x01\\xea\\xf5\\x76\\x51\\xeb\\x1b\\x87\\xb8\\x33\\xd0\\xa0\\x9b\\x4a\\x4a\\x64\\x62\\xf4\\x06\\x64\\x62\\x37\\x69\\xe9\\x50\\x79\\xf3\\xc9\\x62\\x85\\x0c\\xc3\\xb4\\x01\\xbb\\x00\\x58\\xb8\\x47\\x5b\\x10\\xc8\\x62\\xf3\\x2f\\x30\\x0a\\x2b\\x14\\x3b\\x3d\\xea\\x26\\x9d\\xdc\\xbe\\xa7\\xbe\\x7d\\xd2\\x42\\x6d\\x0d\\x42\\x04\\xeb\\x66\\xa3\\x9f\\x13\\x18\\x82\\x2d\\xcb\\x9c\\x56\\x13\\x98\\x63\\x7f\\x4a\\xb8\\xde\\x19\\x67\\x68\\xac\\xe7\\x4f\\x34\\x8c\\x01\\x2d\\xd1\\xba\\xbe\\xc1\\x7f\\x53\\x00\\xff\\xe0\\xd7\\xaa\\xae\\xaf\\xef\\x7d\\xb6\\x50\\xa8\\xf2\\xf3\\x09\\xa9\\x79\\x3f\\x52\\xc6\\x85\\xc7\\xe1\\xd5\\x13\\x32\\x74\\x91\\x57\\x84\\x89\\x9c\\x48\\x1d\\x48\\x5c\\x9b\\xd3\\x0e\\x99\\xfc\\xdc\\x97\\xd9\\x6e\\xf0\\x74\\x87\\xda\\x66\\x3b\\xef\\xe6\\x82\\x99\\xdf\"},\n{{0x5b,0x32,0x3f,0xc0,0x1a,0x16,0xc4,0x5d,0x10,0x64,0x66,0x7d,0x2e,0xa4,0xa7,0xea,0x59,0xd2,0x03,0x42,0x56,0x2d,0x12,0xfb,0xc5,0x98,0xd5,0xaa,0x73,0x00,0x68,0x8e,},{0xd4,0x14,0x1b,0x45,0x5d,0x30,0x16,0x42,0xba,0xda,0x28,0x14,0xaf,0xcb,0x16,0x20,0xd5,0xeb,0x56,0xd9,0x2b,0x11,0x85,0xfe,0x5d,0xad,0xef,0x55,0x96,0x25,0xfa,0x71,},{0xe2,0xef,0xf6,0x07,0xf0,0x22,0x7a,0x29,0xd5,0x82,0xd6,0x9f,0x34,0x58,0xac,0xad,0xd3,0x22,0x6f,0xce,0xaa,0xc0,0xab,0xbd,0xae,0xd5,0x26,0x75,0xc5,0x16,0x30,0x07,0x3c,0xd3,0xa9,0x01,0x70,0x7e,0xcf,0x05,0xe8,0x93,0xf2,0xc3,0x6d,0xaa,0xf0,0xcc,0x49,0x01,0x11,0x69,0x46,0xb5,0x77,0x0d,0xc0,0x38,0x12,0x5f,0x6d,0x13,0x1b,0x09,},\"\\xad\\x24\\x66\\x9e\\xf5\\x5c\\x54\\x0a\\x8e\\xd1\\x62\\xce\\x1d\\x28\\xf0\\x17\\x60\\xa6\\x07\\x19\\xa0\\x37\\x73\\x36\\xeb\\x00\\xb1\\xec\\xbe\\x6f\\x61\\x60\\x1c\\xd5\\x64\\xf9\\x2c\\x95\\x68\\x04\\xf9\\xbe\\xd4\\xe1\\x47\\x6b\\x94\\xe5\\xea\\x8c\\xca\\x80\\xcb\\x49\\xa3\\x04\\xef\\x85\\x1f\\x7f\\x67\\x5a\\xbe\\x58\\xe6\\x68\\x1d\\xc0\\x12\\xad\\x55\\xe5\\x1b\\x02\\x1d\\x98\\x28\\x56\\x9d\\x0b\\xcc\\x9e\\x05\\x27\\xa3\\xfc\\x03\\xc8\\x91\\xd1\\x7a\\x90\\xe6\\x33\\x7a\\x1e\\xa6\\x7f\\x2f\\x08\\x81\\x05\\x87\\x69\\x38\\x37\\x08\\x1e\\x4c\\x08\\xa3\\xd7\\x2c\\x53\\x6c\\x21\\x40\\xda\\x20\\x0b\\xa4\\x56\\xc3\\x76\\xf6\\x1d\\x05\\x65\\x1f\\x0c\\x5f\\x39\\x57\\x11\\xf4\\x1c\\x0d\\x6e\\xae\\x98\\xc9\\x06\\x76\\x4d\\x1e\\xbe\\xf3\\xf9\\x04\\x6c\\xb7\\xc8\\x62\\x26\\x40\\xfc\\xaf\\xaf\\xbf\\xb8\\xf6\\x2e\\x1c\\xd3\\x2c\\x66\\xee\\x1c\\x55\\x50\\x94\\x89\\xa5\\x38\\xab\\x61\\x29\\x99\\xe7\\x99\\x7b\\x77\\x9c\\x64\\x22\\xef\\xf1\\x09\\xda\\x4d\\xf8\\x29\\x20\\x93\\x0d\\x8d\\x36\\x3d\\x78\\x30\\x90\\x87\\x95\\xa3\\x88\\x8f\\x25\\xd6\\x67\\xe1\\x4d\\x15\\x5e\\xd4\\x45\\x81\\xbe\\x43\\x0f\\x79\\x73\\xb5\\x74\\xe2\\xbc\\x0b\\x13\\x4c\\xf1\\x39\\xfb\\x4b\\xb0\\x1d\\xbd\\xa4\\x1b\\x67\\xb9\\x81\\x47\\xd8\\x01\\x2f\\x40\\x67\\x7f\\x4b\\x80\\xce\\x4a\\x53\\x4c\\x90\\xad\\xea\\xbf\\x48\\x4b\\x21\\xfa\\x99\\x4b\\x7a\\x17\\x5f\\x8a\\x8b\\x8a\\x40\\x75\\x56\\x44\\x78\\xdd\\xb0\\x50\\x24\\x58\\x0b\\xab\\x03\\x8c\\xd9\\xea\\xa1\\xdf\\xda\\x55\\x2f\\xb3\\x12\\x29\\x42\\x9b\\x61\\x4f\\xa1\\xd8\\x0c\\x52\\x61\\x4e\\x84\\xfa\\xa2\\x21\\x7f\\x26\\x0f\\xf7\\xcc\\xea\\x8c\\x7b\\x06\\xe3\\xd7\\x7f\\xf8\\x74\\xeb\\x81\\xfc\\x85\\x97\\xe5\\xfc\\xdc\\xec\\x95\\x1b\\x5f\\xe6\\x4a\\x1a\\xf8\\x6e\\x73\\x19\\x3a\\x88\\x24\\x69\\xeb\\x3b\\xa3\\xc3\\x82\\x73\\x4b\\x28\\x87\\xb4\\x19\\x31\\x6e\\xa4\\x48\\xaf\\xc2\\x82\\x47\\x8c\\x25\\xf7\\xbc\\xa1\\x84\\x29\\xcb\\xbf\\xfd\\x88\\x71\\x17\\x7c\\x5e\\xcc\\x7d\\x8a\\xa9\\xa1\\xb9\\xec\\x87\\x19\\x2d\\x29\\xa5\\x25\\x39\\xc0\\x81\\xc3\\x59\\x33\\x32\\x44\\x4c\\xbe\\x66\\x87\\x2c\\xf3\\xd0\\xe1\\x97\\x29\\x2b\\x82\\xb0\\xbe\\x5f\\xcd\\x85\\x8c\\xd6\\xca\\x48\\xb5\\x3e\\xe5\\xb6\\x16\\x41\\xbc\\xaa\\xf3\\x1d\\x81\\x9c\\x7e\\x1c\\xed\\xaf\\x9e\\xe6\\xb0\\x7e\\x09\\xca\\xed\\xfb\\x30\\xb9\\x20\\x4a\\x1d\\x4d\\xdb\\x70\\x56\\x0c\\xbe\\x1e\\xb0\\xc0\\xec\\x43\\xf1\\xd1\\x78\\x20\\x1b\\x29\\x08\\x19\\xfc\\xdc\\x92\\xc6\\x3e\\x0d\\xb6\\x0f\\xb8\\x7d\\xff\\x00\\xe5\\x12\\x64\\x8c\\x89\\x58\\xa8\\x47\\xef\\xc3\\x63\\x46\\x07\\x3f\\x1a\\x4f\\x1f\\x23\\x17\\x06\\x0f\\x1c\\x54\\x3e\\x6f\\x01\\xb4\\x24\\x85\\xbe\\xeb\\x56\\xca\\xb3\\xba\\xb2\\x6e\\x6a\\x0c\\xa6\\x93\\x58\\x02\\xc7\\x62\\xb7\\x99\\x15\\x9e\\x32\\x0f\\x36\\xb5\\xe8\\x3d\\x4a\\xca\\x89\\x62\\xaa\\x2c\\x3c\\x2b\\x7a\\x38\\x70\\xe9\\xe0\\x47\\x31\\xf3\\x94\\x8c\\xf9\\x41\\xe2\\x1d\\x50\\x96\\x4e\\x5d\\x63\\x5a\\x35\\xa5\\x3e\\x29\\x98\\x11\\xb8\\xca\\xdf\\xcb\\x44\\x16\\xc5\\x75\\x98\\xa3\\xfd\\x05\\x41\\x09\\x10\\xdb\\xc0\\xea\\x2c\\x78\\xfd\\xb9\\x25\\x74\\x99\\x7d\\x58\\x79\\x62\\x79\\xea\\xaa\\x78\\xb3\\x6d\\xce\\xf1\\xc9\\xa1\\x29\\xee\\xff\\x82\\x39\\x9a\\x26\\xd0\\x08\\xff\\xa3\\xbf\\x04\\x18\\xff\\x7d\\x39\\xb6\\x42\\x7f\\x34\\x18\\x95\\x02\\x4d\\x16\\xe2\\x2a\\x0c\\x62\\xa8\\x2b\\xeb\\xa2\\xe2\\xba\\xc2\\x3d\\xee\\x18\\xcf\\xcd\\x5d\\xb2\\x39\\x7f\\x37\\x8c\\x53\\x67\\x30\\x90\\x82\\xc4\\x4e\\xb4\\x3c\\xed\\xc1\\x52\\x20\\x25\\x3a\\x62\\x32\\x03\\x99\\x66\\x5f\\x71\\x34\\x9c\\xc1\\xb9\\x44\\xf5\\x8c\\x73\\xa1\\x0a\\x0b\\xbf\\xd4\\xca\\xf1\\x28\\x91\\xe3\"},\n{{0xbe,0x1c,0x11,0x2f,0x78,0xcf,0x13,0xae,0xfc,0x5c,0xe7,0xe3,0x37,0x64,0xac,0xa4,0x48,0x1f,0x9f,0x88,0xb0,0x18,0xe1,0x22,0xdb,0x9f,0x8d,0xac,0x14,0x62,0x46,0x05,},{0xae,0x38,0x99,0x36,0xbb,0xf6,0xd1,0x6e,0x3c,0x1e,0xeb,0x64,0x74,0x29,0x89,0x70,0x86,0x6e,0x12,0xec,0x9c,0x1d,0x6a,0xea,0x2f,0xd9,0xdb,0x6b,0x56,0xaa,0x59,0xc4,},{0xf5,0xfc,0x5a,0xcb,0x17,0xe9,0x95,0x7e,0xa3,0x04,0xf1,0x23,0xb6,0x50,0xe1,0x44,0xc9,0xe4,0x37,0x72,0x83,0x50,0x9d,0x43,0x1d,0xa6,0xa2,0xbb,0xd5,0x27,0xbe,0xb3,0x82,0xc9,0xf5,0x87,0x45,0xa3,0xe5,0x6d,0xcc,0x65,0x5b,0xd2,0xeb,0xb7,0xae,0xef,0xc9,0x3e,0xdc,0x3f,0x20,0xd8,0xd3,0xc3,0x79,0x23,0x03,0x1e,0xec,0x0c,0xb4,0x07,},\"\\xd7\\x7f\\x9a\\xee\\xa0\\xfe\\x98\\xed\\x7f\\xb7\\x4d\\x58\\x2a\\x40\\x2b\\xcb\\x79\\x31\\x47\\x4b\\x4a\\x95\\xd5\\x23\\xf3\\xfb\\x76\\x9f\\xb7\\x09\\x7d\\x2b\\xe4\\xc6\\xec\\x10\\x52\\x14\\x01\\x63\\x22\\x25\\x53\\xaa\\x8f\\x4f\\x89\\xe4\\x21\\x73\\x00\\x14\\xec\\x73\\x46\\x97\\x20\\xce\\xa9\\x67\\xf8\\x8b\\x6a\\x48\\xd0\\x2a\\x2d\\xdc\\x1a\\x12\\x1f\\xdf\\xfb\\x8a\\xe1\\x27\\x73\\x8e\\x29\\x3c\\x4d\\x6b\\x1b\\x74\\xad\\x03\\x84\\x4d\\xe6\\xbf\\xe8\\x21\\x50\\x6b\\x3a\\x7a\\x81\\xd1\\x9c\\x37\\xa7\\xf0\\x1c\\xa4\\x81\\x47\\x12\\x19\\xef\\xe2\\xa7\\xb9\\x2c\\x4b\\xd2\\xac\\x07\\x74\\x3b\\x49\\x75\\x69\\x64\\x41\\x71\\x4b\\x84\\xd6\\x3c\\x54\\x9d\\x7a\\x6f\\xb6\\x1f\\x16\\xfb\\xcd\\xb7\\x2b\\x91\\x4d\\x78\\x82\\xd0\\x91\\xf9\\x70\\x6d\\xa3\\x8c\\x1a\\x81\\xa1\\xc6\\xa4\\x0f\\xbe\\xc0\\xd8\\xe2\\x38\\xb5\\xd5\\x6d\\x46\\x0e\\x90\\x9f\\x85\\x47\\x9f\\x7a\\xd8\\xb1\\x19\\xf3\\x54\\x55\\xe3\\x40\\x10\\xca\\xa7\\xe5\\xd0\\x1f\\x38\\xe3\\x01\\xad\\x37\\xe8\\x00\\x5f\\x6e\\xd2\\x9e\\x4a\\x10\\x2d\\xb3\\xf6\\x1d\\x84\\x09\\x3f\\x78\\xc4\\x9a\\x96\\x48\\xc9\\x77\\xbf\\x4d\\x5b\\x68\\x9f\\x71\\xf4\\x06\\xf8\\xad\\x7b\\x9a\\xeb\\x1a\\xe2\\x21\\x33\\xa8\\x4c\\xe1\\xb2\\x78\\xb2\\xcd\\xde\\x46\\x59\\x01\\xb2\\x3a\\x17\\x9d\\x07\\x2a\\x80\\x87\\x9d\\x0a\\x24\\xd2\\xaf\\x19\\x7b\\x32\\x2a\\x07\\xbf\\x5d\\x40\\xee\\xab\\x3a\\xf1\\x21\\x17\\xf1\\x30\\x21\\xdf\\xc1\\x68\\x1a\\xba\\x5c\\x08\\x3f\\x25\\x96\\xe3\\x7f\\x11\\x23\\x42\\x2b\\xbd\\xca\\x3b\\x2c\\x32\\xcb\\x59\\x4f\\x56\\xc3\\x25\\xe0\\xc5\\x64\\xa1\\x73\\x32\\x88\\x05\\x34\\x59\\xc6\\x24\\x88\\x92\\x5c\\xd8\\x0e\\x7c\\x94\\x4d\\xb9\\x98\\xc3\\xc7\\xbe\\x54\\x6b\\xf8\\x9d\\x7a\\x51\\x1c\\xcd\\xba\\x4b\\x80\\x9e\\xee\\x0f\\xc2\\x87\\x3d\\xad\\x72\\xb4\\xcf\\x3b\\xa0\\x51\\x28\\x9b\\xb3\\xf4\\xe9\\x92\\x57\\x32\\xe4\\x5a\\xe7\\x74\\x10\\x58\\xc8\\xfd\\x11\\x59\\x9d\\xd8\\x43\\x92\\x7e\\x3d\\x14\\x59\\x8b\\xb8\\x30\\x52\\xd3\\x35\\x69\\xcf\\xb0\\x2a\\xf0\\xc8\\x8f\\xa7\\xae\\xa4\\xbb\\x46\\x84\\x1c\\xd2\\xdd\\xbd\\xf5\\x98\\x8f\\xcf\\x32\\x5f\\xf1\\x04\\xa5\\xdf\\xc4\\xa3\\x0d\\x26\\x9d\\x2a\\x94\\x97\\x30\\xc3\\x61\\x3b\\xdd\\xd3\\x67\\x3b\\x42\\xf6\\x09\\x0e\\x6a\\x60\\xe4\\xa2\\x53\\x06\\x24\\x63\\xa6\\x5d\\x7e\\x7f\\xc0\\x03\\x0b\\xba\\x76\\x9c\\xa3\\x44\\xbf\\xa9\\xac\\x82\\x3f\\x58\\xcb\\x5c\\xee\\x8a\\x5f\\xc0\\xca\\x37\\x22\\x8d\\xe5\\xa4\\xd9\\x3e\\x0e\\xcf\\x7f\\x10\\x82\\x16\\x59\\xa2\\x26\\x1f\\x7e\\xf1\\x59\\x6e\\xda\\x4e\\x41\\x1c\\xf3\\xc9\\x66\\x9d\\x81\\xde\\x74\\x54\\x7c\\xe4\\xbf\\x83\\x3e\\xb4\\x32\\xf3\\x85\\xce\\x90\\x38\\xfe\\x84\\x8a\\x8c\\x96\\xda\\x7f\\x01\\xfd\\x95\\xbe\\xa0\\x6d\\x1d\\x74\\x7c\\x8a\\xe7\\x36\\x49\\x5b\\xba\\x22\\x85\\xbe\\x5c\\x32\\xaf\\xea\\x44\\x95\\x20\\xcf\\xe8\\xe1\\xce\\x25\\xf9\\x07\\x7e\\xd0\\xec\\x0f\\x65\\x98\\xa9\\xb8\\xf7\\x38\\x6f\\x15\\x35\\x81\\x70\\xcc\\xef\\xc3\\xd5\\xff\\xb0\\x09\\x28\\x81\\x54\\xde\\x87\\x7c\\x24\\x09\\xae\\x5f\\xd8\\xfe\\xf0\\x09\\x3f\\x1c\\x36\\xb3\\xa8\\xf5\\x47\\x43\\x2c\\xd0\\xf6\\x2c\\x40\\x33\\x24\\x2a\\xd9\\x92\\x1a\\x8f\\x11\\xc0\\x0f\\x36\\x6d\\xa9\\x39\\x69\\x30\\xa8\\x0c\\x99\\x7d\\xf4\\x29\\xa4\\xf5\\xf4\\xe4\\x5c\\x7a\\x6d\\x7e\\x02\\xaf\\x03\\x31\\x86\\x75\\x7c\\x73\\xcb\\xe6\\x4d\\x2d\\x4e\\x78\\xea\\xaf\\xe2\\x75\\x39\\x52\\x80\\x35\\xf2\\xcf\\xcf\\x8e\\xaf\\x0a\\x42\\xbd\\x25\\xf8\\x8b\\x2f\\xc6\\x9e\\x42\\x66\\x8f\\xae\\x66\\x77\\xc9\\xac\\x90\\x91\\xd9\\xd1\\x5a\\x41\\xf3\\xac\\xe6\\x5d\\x90\\xa0\\x22\\x98\\x73\\xdc\\xf2\\x54\\x25\\x6c\\xca\\x44\\x9e\\xd4\\xc1\\x7d\\x54\\x35\\xba\\xe4\"},\n{{0xbd,0x85,0x23,0xed,0xa8,0x99,0xb9,0x84,0x23,0x0e,0x32,0x88,0x75,0xb9,0x67,0x2e,0xdc,0x9f,0xcd,0x24,0xea,0x5c,0xc1,0x2d,0x7b,0x57,0x2d,0xa4,0xbe,0x01,0xfb,0x7b,},{0x02,0xb7,0x34,0xeb,0xbe,0x88,0xc1,0x3b,0xfa,0x95,0xa5,0xd9,0x64,0xfc,0x7e,0xf9,0xd3,0x95,0xbd,0x63,0x03,0xf0,0x65,0xdc,0x4e,0xe1,0x7b,0x3a,0xc1,0x54,0x8b,0x7b,},{0xfc,0xfc,0xdb,0x08,0x8d,0xcb,0xd0,0xa5,0x1b,0xd3,0x01,0xe3,0xe1,0x56,0x16,0x71,0x93,0x5d,0x8b,0x6f,0x71,0x9c,0x5d,0x92,0x69,0x06,0x40,0xd3,0xc9,0x1e,0x77,0x5b,0xf4,0x05,0x41,0x32,0xef,0xc0,0x5a,0x21,0x22,0xfc,0x20,0x9d,0xb3,0xc3,0x34,0x32,0x33,0xff,0x8a,0xec,0xeb,0xd5,0x2d,0xaa,0x2b,0x3b,0x21,0xee,0xb1,0x5f,0xd1,0x02,},\"\\x16\\xc2\\x16\\xc9\\xbe\\x9f\\x0d\\x4b\\x11\\x54\\x10\\xbd\\xfd\\x15\\x93\\xc8\\xe2\\x62\\x22\\x1a\\xb9\\x7a\\x2a\\x39\\x5a\\x12\\x19\\x8f\\x95\\xc3\\x02\\x05\\xb0\\x89\\x62\\xd4\\x89\\x31\\x18\\xba\\x9f\\xf9\\x9a\\xb1\\xc7\\xa6\\xe1\\xf2\\xf1\\x75\\x19\\x10\\x70\\xac\\x94\\x53\\x27\\xad\\x6c\\x47\\x0b\\xab\\xf7\\x92\\x8b\\x07\\xdd\\x78\\x8c\\x85\\xb6\\x4b\\x71\\x2e\\x0a\\xae\\x6c\\x0e\\xa2\\x02\\x81\\xe4\\x2f\\xd5\\x61\\xe8\\x3e\\x3f\\xba\\xc6\\x7f\\x14\\x00\\x0e\\xe5\\x6d\\x98\\x1d\\x2a\\x2f\\x0b\\x9c\\xa0\\x0a\\x9e\\xa4\\x7c\\xa2\\xf6\\xfc\\x8d\\xca\\x10\\x35\\xfc\\xeb\\x14\\x2c\\x3f\\x26\\xf2\\x0e\\x3c\\x73\\x22\\x07\\xff\\xff\\x11\\xb7\\x96\\x95\\xbd\\xaf\\xa4\\x15\\x21\\x4a\\x44\\x99\\x30\\x23\\x26\\x60\\x5c\\xf0\\xb8\\xc8\\x2f\\x2b\\x11\\x39\\x2e\\xcc\\x90\\xcd\\x74\\xa7\\xb4\\x11\\xb6\\xd9\\x07\\xa3\\xd5\\xc1\\x30\\xc8\\x79\\xb7\\xcf\\x88\\x0f\\x22\\xbb\\xd7\\xf0\\xe9\\x59\\x33\\x71\\x8e\\x96\\xd7\\xd1\\x6c\\xae\\xa9\\xf2\\xc3\\x9e\\x89\\xb1\\x3c\\xd5\\x22\\x66\\x27\\x36\\x04\\xa9\\x6b\\x51\\xd6\\xe3\\x4f\\x70\\x67\\x35\\xdd\\xd9\\xfc\\xa4\\x4d\\x09\\xcd\\x86\\xbb\\x72\\x17\\x60\\x0e\\x0d\\x34\\xd4\\x16\\xac\\x24\\x9f\\x2e\\x41\\xbd\\x0f\\x4a\\xbc\\xbd\\x25\\x80\\xad\\xae\\x21\\xd7\\xeb\\xa5\\xfa\\x44\\xf3\\x9d\\x78\\x0f\\x17\\xeb\\x85\\xcc\\xbe\\xf5\\x8f\\xef\\x90\\x3a\\x28\\x0d\\x95\\xf8\\xf3\\x21\\x07\\x89\\xfa\\x12\\xe1\\x20\\xe2\\x1b\\x6e\\x8c\\xad\\x91\\x78\\x35\\xbb\\xdc\\xc3\\xb0\\x7e\\x84\\x69\\x39\\x54\\xe2\\x3a\\x94\\xf9\\x9f\\x93\\x7d\\xdb\\x0d\\x4a\\x18\\xd4\\x2c\\x3e\\xa8\\xfc\\xa7\\xd1\\xea\\x6e\\xd5\\x3a\\x00\\x24\\x6f\\x99\\xea\\x52\\x0e\\x64\\x05\\xbd\\x2a\\xa5\\x49\\xb0\\x6e\\x7d\\xa7\\x22\\xc1\\xba\\x74\\xaa\\x1c\\x13\\x6e\\x8e\\xa5\\x8b\\xaa\\xf8\\xd3\\x76\\x58\\x69\\x3f\\x3e\\x0b\\x44\\xf6\\x31\\xdd\\x6d\\x08\\xff\\xdf\\x4f\\x09\\x18\\x9d\\x30\\x35\\xa3\\xf0\\x34\\x68\\xe2\\x96\\x96\\xef\\x05\\xe0\\x2c\\xc1\\xaa\\xbf\\xec\\xbd\\xa2\\x30\\x1b\\x54\\x0c\\xb0\\xeb\\x0a\\x75\\xbc\\xce\\x73\\xdb\\x92\\x73\\xa9\\x16\\x1a\\x98\\xad\\x89\\x8f\\xcd\\x65\\x79\\xfb\\x7e\\x4b\\x32\\x79\\x54\\x4f\\x2e\\x0b\\xd7\\x74\\xdd\\x1a\\x81\\x57\\xda\\xa8\\x8a\\x70\\x32\\x11\\x67\\x70\\x3c\\x60\\xa6\\x08\\xa4\\xb5\\x42\\x16\\x59\\x03\\x75\\xe5\\x97\\xfe\\x21\\xae\\xa9\\x7b\\x52\\x18\\x5d\\x0e\\x37\\xa5\\x3b\\x63\\x88\\xa7\\x07\\xa2\\xbc\\x24\\xac\\xf9\\x44\\x25\\xf8\\x4f\\x3d\\x56\\xbc\\x9f\\x7e\\xe7\\x41\\x2a\\x9e\\x18\\x33\\xad\\x55\\xb7\\xea\\xe6\\xda\\x58\\x16\\x98\\x16\\x63\\x83\\xa2\\xeb\\xa8\\xb6\\xf5\\x39\\x20\\xf5\\x17\\xa5\\xc8\\x0b\\xd3\\xe0\\x3f\\xaa\\xd4\\x08\\x7e\\x3e\\xe8\\xfe\\xc9\\xa7\\x9a\\x01\\xc7\\x79\\x51\\x21\\x33\\xd7\\xb6\\xe5\\xf1\\xde\\xc7\\x66\\x30\\x0d\\xc4\\x05\\xcc\\x21\\xa8\\xc5\\x83\\xfb\\x73\\xbc\\x90\\xcf\\x24\\x38\\x5b\\x08\\x60\\x49\\xd3\\xbf\\x20\\xc3\\x00\\x98\\x3c\\x0b\\x35\\x15\\x38\\xdc\\xcb\\x22\\x7a\\x14\\xfa\\xfd\\x23\\xac\\x4b\\x26\\xbe\\x81\\xa2\\xb1\\x20\\xcf\\x21\\x6f\\xc5\\x83\\x54\\xf9\\xdc\\xbf\\x05\\xf6\\x63\\x39\\xad\\x6d\\xdc\\x2c\\xac\\x14\\x67\\x7b\\x90\\xe2\\x47\\xeb\\xb6\\xc5\\xc2\\x29\\x00\\x7d\\xc6\\x0f\\x37\\x4a\\x06\\xd4\\x04\\xeb\\x23\\xeb\\x1e\\xc4\\x99\\x07\\xc6\\xe8\\x81\\x62\\x9e\\x18\\x67\\x26\\x8c\\xa6\\xff\\xfa\\x59\\xaa\\x3c\\xa8\\xf6\\xc2\\x95\\x16\\x2b\\x95\\x36\\xc2\\xbe\\x22\\xbb\\xe3\\xb7\\x23\\x80\\xef\\x11\\xb6\\x1b\\x35\\x7a\\x62\\x53\\x10\\x0e\\x30\\xa5\\x86\\x81\\x8b\\xa0\\x03\\xfa\\x3f\\xfd\\x1f\\xc9\\x19\\x88\\x1c\\x05\\x02\\x2f\\x94\\x84\\x85\\x98\\xf2\\x17\\xfe\\xa2\\x22\\x50\\x72\\x20\\xd1\\x08\\xa2\\x8f\\xc7\\xbc\\x39\\xa8\\xa1\\x1c\"},\n{{0x33,0xa8,0x5a,0xe1,0x50,0xbb,0xf5,0x52,0xf4,0x16,0x63,0xb2,0x15,0x21,0xc2,0x96,0xd2,0x46,0xdd,0x6c,0xf8,0x19,0x5d,0xf8,0x51,0xc6,0x95,0xbd,0x15,0xf4,0xa5,0x02,},{0xc8,0xc9,0xc4,0x25,0x21,0x00,0x8d,0x5e,0xff,0xf5,0x76,0xc7,0xe4,0xa5,0x60,0x83,0xce,0xd9,0xa9,0x28,0xda,0x6f,0xd5,0xcf,0x93,0xfd,0xa5,0x72,0xa5,0xa2,0xd0,0xc0,},{0xbb,0xe4,0xcd,0x63,0x67,0x6e,0x26,0xd6,0x75,0xa1,0x91,0x15,0x1d,0x30,0xdb,0x72,0xb5,0xb8,0x4d,0x46,0x1e,0xec,0x65,0x64,0xaf,0x86,0x7a,0xb4,0x1b,0xae,0x99,0x31,0x14,0x78,0x85,0x51,0x9e,0xc9,0xd7,0xe6,0xc8,0x18,0x74,0x3c,0x8e,0xf6,0xd5,0x16,0x7b,0x35,0xb4,0x21,0x36,0x3c,0x09,0xb3,0x57,0x36,0x7f,0xe8,0xde,0x44,0x3a,0x06,},\"\\x93\\x7e\\x05\\xf2\\xf1\\xfd\\xbd\\x41\\x73\\x15\\x53\\xe7\\x7c\\xf1\\x81\\xb5\\x07\\x97\\x58\\x94\\x0a\\xee\\x8e\\x92\\x62\\x3f\\xb1\\xd5\\xf0\\x71\\x28\\xb7\\xd7\\xf1\\x7e\\x48\\x42\\x70\\x7a\\x56\\x2c\\x45\\xba\\x69\\x26\\x4c\\x0f\\x73\\x0a\\x82\\x1c\\x7d\\xb6\\xbf\\x82\\x99\\x0d\\xc6\\x51\\x26\\x9b\\x29\\x6c\\x33\\x51\\x79\\x11\\x30\\x53\\xd6\\xf8\\x5b\\xb0\\x96\\xb2\\x91\\x11\\x65\\xfa\\x39\\x00\\xcb\\x10\\x24\\x16\\x48\\x7b\\xa8\\x07\\x86\\x79\\xc6\\xb3\\x36\\xdf\\xf3\\x87\\x63\\xc0\\x8d\\xcd\\x20\\xfa\\x66\\xdd\\xa4\\x5c\\x57\\x5d\\xf1\\x50\\xd8\\x51\\x16\\x5a\\x48\\x04\\x97\\x38\\x30\\xf4\\x36\\xdf\\x60\\xb8\\x13\\x19\\xf9\\xcf\\xb5\\x64\\xc0\\x65\\x28\\x96\\xed\\x5f\\x18\\x49\\xcb\\x33\\x54\\xf5\\x0f\\x00\\x12\\xf2\\x86\\xe8\\xa3\\x0c\\x21\\x35\\x28\\x69\\x34\\x74\\x00\\x4e\\x85\\x04\\x01\\x2b\\x94\\x55\\x60\\xc0\\x74\\xa6\\xa1\\x63\\x43\\x2c\\xf4\\xac\\x4b\\xa7\\x17\\x5c\\xf2\\x60\\x05\\xdb\\x71\\x99\\xee\\x96\\xd8\\x93\\xcd\\x1a\\xad\\x3f\\xdf\\x5d\\x57\\x46\\x0e\\xf0\\x2d\\xda\\x6d\\x3a\\x14\\x08\\x25\\x19\\x6f\\x3f\\x8e\\x2f\\x37\\xda\\x36\\xb6\\xfd\\xad\\x18\\x4f\\x27\\x40\\xf1\\x16\\xde\\x75\\x8a\\x92\\x91\\x70\\x30\\xc5\\xfb\\x80\\xf0\\x26\\x24\\x96\\xd2\\xdf\\x93\\xc7\\xe2\\x76\\xf2\\x5d\\xa7\\xdb\\xed\\x8e\\xb8\\xdd\\x4c\\x56\\x3a\\xba\\x55\\xb8\\x2a\\xf6\\xba\\x3a\\x70\\xca\\x5f\\x85\\x8b\\x44\\xa0\\x33\\xcf\\xb7\\x95\\x60\\x4d\\xde\\xe7\\x46\\xe7\\xc8\\xae\\x79\\xd2\\x72\\xfb\\x9a\\x23\\x41\\xa2\\xa2\\x02\\xdf\\x5e\\xac\\x08\\xde\\x75\\xad\\x80\\xc6\\x58\\x0d\\x92\\xb1\\x69\\xf2\\xe1\\x31\\x88\\x57\\xb1\\xb1\\x42\\x1c\\x30\\xf3\\xdd\\x46\\x10\\x93\\xde\\x2d\\x34\\x5e\\xde\\x74\\x04\\xb7\\x2a\\x45\\x0d\\xe0\\x7b\\x16\\xee\\xe6\\x8c\\xe6\\x28\\x87\\xb6\\xea\\xa4\\x36\\xee\\xe6\\x84\\xbe\\x75\\xce\\x0e\\x1f\\x96\\x26\\x3e\\x8d\\x87\\x36\\xf9\\xba\\x00\\x0d\\x88\\xe9\\xe5\\x86\\x0f\\x32\\x8a\\xe1\\xe2\\xdc\\x73\\x09\\x9d\\x32\\xfc\\xeb\\x1b\\xd2\\xc0\\x12\\x36\\x98\\xa4\\x9b\\xea\\xd1\\x90\\xa0\\x0e\\xc9\\xa6\\xf8\\x71\\x33\\xed\\xdd\\x45\\x31\\x6f\\x65\\xeb\\x0d\\x32\\x9b\\x07\\xb9\\xa6\\x6b\\xb9\\xfe\\x42\\x58\\x8b\\xf7\\xb8\\xd0\\x6e\\xfe\\xc1\\x98\\x6b\\x82\\xa0\\x81\\xed\\x3f\\x68\\x02\\xe9\\xbe\\x73\\x46\\x47\\x84\\x55\\x9a\\x4f\\x2c\\x09\\x7b\\xa1\\x4b\\x0b\\xfd\\x5d\\x7e\\x0a\\xff\\x65\\xcb\\x69\\xab\\xd0\\x3f\\x86\\x16\\xcd\\x7e\\xdf\\x7e\\xc3\\x68\\x21\\x9e\\xdc\\xf8\\x93\\xe9\\xee\\x71\\xda\\xd9\\xf1\\x8d\\x79\\xe5\\x68\\x26\\x5d\\xdc\\x67\\x16\\x22\\x32\\x13\\x23\\x5b\\xb9\\x28\\xe9\\x08\\xde\\xa8\\x27\\x78\\x4c\\xd1\\xaf\\x39\\x6d\\x59\\x0c\\x81\\xf4\\xea\\xcd\\xfc\\xf8\\x9c\\x5c\\xac\\x96\\xfa\\x05\\x00\\x64\\xa2\\x28\\x41\\xea\\x71\\x5f\\x8c\\x89\\xd6\\xd5\\xaf\\xbf\\x59\\x7a\\x4d\\x00\\x5d\\xbc\\x6b\\x13\\x85\\x6d\\x33\\x5b\\x42\\xa9\\xa8\\x2e\\xdc\\xb9\\x49\\x83\\x5c\\xca\\x20\\xb0\\xa2\\x3d\\xe5\\x1c\\xc3\\xae\\xc3\\x55\\x66\\xef\\xf0\\xc5\\xae\\x1a\\xb3\\x75\\x13\\x20\\xd2\\xc3\\x10\\x49\\x52\\x38\\xed\\xa3\\x83\\xc3\\x8a\\x41\\x63\\x15\\x2b\\x88\\x15\\x69\\x0b\\x8f\\xf0\\x15\\x03\\x5d\\x1d\\x00\\xea\\x4a\\x0d\\x6c\\xaf\\x32\\x4b\\xb7\\x1a\\x66\\x4a\\x1b\\xed\\x31\\x48\\x07\\x84\\xa6\\x8f\\x43\\x8c\\xaa\\x35\\x9e\\x8d\\x26\\x73\\xc8\\x57\\xd4\\xb8\\xc0\\xb6\\xc6\\x95\\x84\\x7b\\x86\\x80\\x0e\\xa3\\xd7\\x34\\xb5\\xec\\xc4\\xd5\\x2b\\x50\\x7a\\xc6\\x9b\\x3a\\x67\\x78\\x91\\x60\\x16\\xeb\\xc2\\x31\\x5f\\x44\\xc9\\x0b\\xf0\\xc3\\xe7\\xda\\xe0\\x1d\\x49\\xcb\\xc3\\x03\\x40\\x2b\\xbc\\x63\\x4a\\xe1\\x19\\x1f\\x3f\\x6f\\xd6\\x3d\\x30\\x3b\\x0c\\x0b\\xe0\\x33\\xa4\\x7b\\x90\\xf8\\xd3\\xa7\\x7f\\x0a\\x44\"},\n{{0xba,0x9e,0x68,0x62,0x04,0x97,0x5c,0x3b,0xde,0xd4,0xc1,0xe9,0xf7,0x4c,0x7e,0x4c,0x7a,0x7e,0x3c,0x99,0x81,0xd0,0x1b,0xfc,0xa0,0xad,0x01,0x15,0xc3,0xf0,0xf5,0xc3,},{0x49,0x90,0xfc,0xe6,0x95,0x2e,0x8b,0x7d,0x0a,0xfc,0xf4,0xbf,0x9d,0xba,0x9b,0xce,0x1b,0xc4,0x81,0x5e,0x37,0x51,0x1d,0xa7,0xc2,0xad,0x48,0x92,0x58,0x1d,0xe0,0x3a,},{0xc7,0xd2,0x3a,0x58,0xe2,0xfb,0x2a,0x8d,0x4b,0x8e,0xd1,0xe9,0xea,0xe9,0x1e,0x11,0x29,0xc2,0xaf,0x8b,0xd0,0x5f,0x0b,0xd5,0x72,0xab,0xeb,0xbe,0x0f,0x30,0x82,0x59,0x25,0xf0,0xdf,0x71,0xcf,0xb7,0x21,0x8c,0x68,0x6e,0x55,0x48,0xd9,0x42,0x77,0x10,0xa6,0x90,0x36,0x6b,0xa8,0x55,0x41,0xc7,0x91,0x01,0xa5,0x8a,0x10,0xe8,0xaf,0x0a,},\"\\x46\\xbb\\x48\\x95\\x2a\\xe5\\x8f\\x2b\\xf5\\x8f\\x5b\\xe8\\xdf\\x4f\\x31\\x6b\\x50\\xf3\\x63\\xec\\x84\\xee\\xd8\\xf8\\x2f\\xf4\\xc0\\x4b\\x06\\x92\\xd0\\x3a\\xef\\x26\\xe8\\xe1\\xe6\\xc9\\x54\\x9a\\x22\\x47\\xd5\\x40\\xa6\\xe2\\x2f\\xeb\\x11\\xe5\\x7f\\x4b\\x80\\x8a\\x20\\x97\\xe8\\xa7\\xb6\\xb3\\xb7\\xaf\\x37\\x69\\xe6\\xd8\\x1d\\x64\\x88\\x6e\\x69\\x62\\x37\\x2f\\x4f\\x39\\xe4\\x9c\\xd4\\x6c\\x1b\\x5f\\x73\\x5f\\x38\\x0f\\x7c\\x27\\x7d\\x09\\x97\\x76\\xed\\x1a\\xea\\xa5\\x7a\\x35\\x9c\\x0a\\xa8\\xc7\\x2f\\x40\\xeb\\x91\\xa1\\xbf\\x07\\xea\\x15\\x7f\\x5d\\xdb\\x30\\x40\\x9d\\x6e\\x3a\\xf9\\x89\\x90\\xce\\x7f\\x30\\xaf\\xfd\\xac\\x5e\\x22\\x01\\x06\\x46\\xdc\\xa9\\x6a\\x54\\x00\\x60\\xfc\\x90\\x8a\\x31\\x25\\xb0\\x00\\xad\\x1e\\xd3\\xa0\\xf2\\x55\\xcd\\x34\\xf1\\x5d\\x7d\\xd1\\xfd\\x68\\x1c\\x3c\\x35\\xa1\\xcd\\x65\\x20\\x56\\xec\\xc5\\x26\\x4d\\x39\\xaa\\xf7\\x2a\\x9b\\xb8\\x3a\\x55\\x1c\\xc9\\x34\\x88\\x7a\\xe1\\x07\\xaf\\xdf\\xef\\x06\\x32\\x17\\x27\\x0d\\x95\\x96\\x89\\x14\\x18\\xbd\\x46\\x1b\\xba\\x63\\xde\\x65\\xbe\\x06\\x7b\\x1b\\x78\\x64\\xfe\\x46\\x48\\x4c\\x7c\\x9e\\x96\\x34\\x9a\\x7c\\x03\\xa8\\x0f\\xa0\\x55\\x05\\x0a\\xa1\\x8a\\xce\\x2a\\x44\\xb4\\xa0\\x3c\\x94\\x78\\x24\\x17\\x2b\\x30\\xe2\\x10\\x11\\x15\\x94\\x43\\xca\\x3c\\xef\\xaf\\x69\\x6a\\x7a\\xa8\\xf9\\x80\\x11\\x26\\x0c\\x94\\x36\\xbf\\x48\\x99\\x1f\\x41\\xd4\\xd5\\x07\\xb9\\x6c\\xe7\\x32\\x3e\\x53\\x1a\\xdc\\xf6\\x63\\x47\\xc5\\x5c\\x88\\x55\\x67\\x3a\\x9f\\x2e\\xc8\\x9b\\x5c\\x80\\x24\\x46\\x06\\x17\\xec\\x72\\x71\\x77\\x3b\\x36\\xd6\\x4f\\xc1\\x4e\\xb5\\xd8\\x26\\x52\\xc5\\x3a\\x30\\x31\\x45\\x72\\x27\\x09\\x3d\\x11\\x8f\\xd8\\xeb\\x93\\x84\\xe8\\x02\\x29\\x04\\x1a\\x96\\xa6\\x49\\x34\\x50\\xf9\\x7e\\x67\\x36\\x26\\x3a\\xbf\\x1e\\xcd\\x9e\\x9f\\xb9\\xa4\\xf0\\xf6\\xd6\\x67\\xfa\\x82\\x41\\x51\\x48\\x5e\\xdc\\x37\\xb3\\x4a\\xcf\\x3d\\x8c\\x35\\xf9\\xc1\\xbe\\x48\\xb5\\xe9\\x6a\\x12\\xaf\\x8e\\x2d\\x35\\xc2\\x3a\\x03\\x58\\x0f\\x21\\x1d\\xa6\\x31\\x6b\\x34\\xc5\\x6b\\xee\\x87\\x2d\\x47\\x64\\x1b\\xca\\x77\\xda\\x64\\x0f\\xdb\\xba\\xd5\\xa9\\xad\\x8a\\xb9\\xdc\\x79\\x57\\x91\\x3d\\xa7\\x34\\xad\\x37\\x49\\x2b\\xa4\\xde\\x8c\\xf1\\x36\\xcc\\xcd\\xeb\\x6b\\xa3\\xf1\\xbd\\x3f\\x00\\x3b\\xe7\\x26\\x3c\\x4f\\x2a\\x40\\xc3\\x3f\\x24\\xca\\x33\\x39\\x59\\x6e\\x6c\\x34\\x28\\x33\\x81\\x00\\xeb\\xcc\\x07\\x22\\xd4\\xf5\\x0d\\x30\\xb3\\x3b\\x91\\x2d\\x4e\\x7c\\x1a\\x9f\\xe6\\x5f\\x66\\x58\\xa6\\xf2\\x39\\x14\\x0a\\x62\\xc3\\x26\\x1e\\x10\\x39\\x2e\\xd1\\x93\\x0a\\xa9\\x17\\x65\\x2d\\x3b\\xd2\\xbe\\x4e\\x8a\\x08\\xab\\x97\\xe1\\x45\\xb9\\x20\\xab\\xb3\\x1e\\xe4\\xbc\\xd5\\xa0\\xd7\\x1f\\x63\\x81\\x80\\xf6\\x1c\\x24\\x58\\x23\\xa3\\x99\\xa7\\x34\\xa4\\xdc\\xde\\x09\\x97\\x88\\x02\\x45\\xed\\x71\\xeb\\x9b\\xc6\\x5e\\x3c\\x6f\\xc9\\x5a\\xb9\\x20\\xb8\\x02\\x4c\\x17\\xd4\\x4c\\xed\\x00\\x37\\xd0\\x4a\\x13\\x3c\\x26\\x41\\x78\\x2f\\x1d\\x62\\x2d\\xf4\\x52\\x69\\xb4\\x91\\xd3\\xfa\\x2a\\x12\\x27\\x57\\x9e\\xaa\\x38\\x6d\\xe3\\xe7\\xde\\x7b\\xc4\\x55\\xc6\\xa1\\x54\\xee\\xe5\\x72\\x7f\\xff\\x04\\x37\\xa2\\x00\\x76\\xc5\\xc3\\xb0\\x57\\x7c\\xac\\x5b\\x4b\\x69\\x34\\xe2\\x69\\x38\\x02\\x22\\x46\\x1a\\x60\\xf9\\x54\\xe4\\x89\\x79\\xc0\\x67\\x12\\x17\\xf1\\x6f\\x70\\x27\\x98\\x30\\x34\\x12\\x10\\x93\\x18\\x6c\\x78\\x70\\x5f\\xc2\\x7d\\xc9\\x2e\\x2e\\xda\\x41\\x16\\xa6\\xbf\\x7d\\x23\\xe0\\x54\\x8d\\x62\\xb6\\x7b\\x25\\xc4\\x1e\\xd0\\x61\\x92\\xbc\\x26\\xef\\x13\\x97\\xbf\\x16\\x01\\xf3\\xa6\\xe2\\xa0\\xe7\\xf6\\x61\\xfb\\x05\\x05\\xee\\x38\\x2f\\x27\\xae\\xc2\\x80\\x5a\\x3e\\x21\\x17\"},\n{{0x59,0x07,0xa8,0xc0,0x84,0x04,0x38,0x75,0x23,0x8e,0xdb,0xdc,0xb7,0x83,0x2f,0xbb,0xa4,0xc0,0x5e,0xa3,0xc5,0xf8,0x8a,0x96,0xf1,0xfb,0xf9,0x50,0x40,0x1e,0xc1,0x64,},{0xe2,0xf4,0x95,0x09,0xd1,0x00,0x7f,0x61,0x8e,0xfe,0x4f,0x1f,0xd6,0x7e,0xaa,0x6e,0x2a,0xb1,0x8a,0xfb,0x2d,0xec,0xce,0xd5,0xa0,0xb2,0xba,0x83,0x63,0x78,0x92,0x60,},{0x8c,0x49,0x12,0xc0,0xf8,0x85,0xd7,0x6c,0x91,0x40,0x59,0x50,0x53,0x73,0xa6,0x4b,0xdd,0xd6,0x7d,0xd4,0x68,0x36,0x9a,0xb9,0x18,0xf2,0x3e,0xa2,0x8e,0x04,0xc1,0x91,0x77,0xa8,0xd4,0x61,0x14,0x4f,0x0a,0x8b,0x51,0xd2,0x15,0x17,0x6c,0xb0,0x8b,0xd6,0x53,0x01,0xc3,0xc4,0x62,0x37,0xb6,0x1b,0xb1,0x49,0x8c,0xa7,0x9d,0x4b,0xe7,0x0e,},\"\\x43\\x3b\\x24\\x78\\xe1\\x8f\\xad\\x5c\\xb8\\x10\\x67\\x06\\x1d\\x22\\x55\\x28\\x22\\x97\\x78\\x30\\x78\\x85\\x47\\x54\\x60\\xfb\\xe3\\x13\\x7a\\x5b\\x44\\x02\\x48\\x94\\xdd\\xbe\\x56\\xfa\\x6e\\xd0\\x21\\x49\\x6f\\x07\\x86\\xe4\\x2b\\xc6\\xc2\\xd2\\x79\\x7e\\xa0\\xa6\\xbf\\x35\\x5e\\x88\\x11\\x5f\\xaa\\x55\\xcd\\x92\\xed\\x42\\x13\\x3d\\x9d\\xcd\\xa6\\xb9\\xeb\\xf6\\x3c\\xe4\\xa9\\x94\\xd1\\xa8\\x2d\\x2a\\x49\\x26\\x75\\x58\\xbe\\x54\\x18\\x2a\\x6f\\x85\\x11\\x2b\\xd1\\x2b\\x24\\x7a\\xda\\xcf\\x14\\x05\\xfc\\x7e\\xc7\\xa0\\x15\\xd4\\x3a\\xb4\\x0b\\x82\\xc6\\x77\\xf7\\xf8\\x5a\\x0e\\x48\\x19\\x7c\\x5b\\x96\\x57\\x61\\x99\\xf4\\xc3\\x34\\x3f\\xf7\\x65\\x4d\\x52\\x3a\\x30\\xc4\\x3a\\x05\\x4c\\x3e\\x46\\x44\\x51\\x27\\x80\\x34\\xb7\\xf1\\x96\\xc3\\x66\\x76\\x8c\\x62\\x8a\\xf9\\x4f\\xc0\\xcc\\xfc\\x9a\\x29\\x55\\xf9\\xd3\\x23\\x38\\xb9\\x44\\x78\\x0f\\x8e\\x32\\x70\\x85\\xb1\\x03\\x78\\x18\\x68\\xe4\\xfb\\x79\\xd5\\x61\\x22\\xd7\\xf3\\xf5\\xab\\x30\\x9e\\x5d\\x63\\x4a\\xdd\\x15\\xda\\x38\\x2c\\x0d\\x23\\x58\\xe6\\x47\\x18\\x2b\\xe4\\xde\\x6e\\x9a\\x9e\\x43\\xe6\\xa3\\xa3\\xb8\\x21\\x5b\\x20\\x4d\\x95\\x07\\x61\\x0d\\x46\\x16\\x21\\x00\\x0f\\xb1\\x89\\x37\\x07\\xaf\\x7d\\x25\\x95\\xbf\\xef\\x8a\\x8c\\x5c\\x5c\\xd0\\x8f\\x30\\x9a\\x5f\\xb5\\x5e\\x45\\x51\\x9a\\xea\\x9b\\x84\\x74\\x8c\\xa5\\xc6\\x72\\xbf\\xec\\xd3\\x0d\\x25\\x65\\x12\\x34\\xa3\\xcc\\x31\\x9b\\x43\\xdf\\xce\\xfc\\x1a\\x07\\xb5\\x5b\\x4a\\xca\\x71\\x4c\\x2e\\x7e\\xf9\\x63\\x8f\\xe7\\x88\\x4a\\x77\\xb2\\x22\\x53\\xa0\\x1a\\x22\\x29\\x50\\x0e\\x9c\\xe1\\x0f\\xda\\x73\\xa8\\x43\\xc1\\x9c\\xc0\\x96\\x26\\xd2\\x45\\x6c\\x22\\xa9\\xc9\\x01\\x88\\x1d\\x52\\x1f\\x4b\\x15\\xd2\\xf6\\x13\\xcb\\x46\\x9d\\x30\\x4d\\x57\\x92\\x23\\xbc\\x5f\\xf7\\x38\\x04\\xdf\\x63\\x71\\x51\\x7e\\xba\\xa5\\xb6\\x77\\xea\\x91\\x0f\\xf1\\xa0\\x2a\\x26\\xfa\\xfe\\x48\\xfe\\xf4\\x69\\xed\\x79\\x9b\\xed\\x6d\\x56\\xce\\x96\\x18\\x34\\xa2\\xed\\xc2\\xe2\\x3c\\x0d\\x94\\x26\\xec\\xcd\\xcc\\x93\\x4f\\x4c\\x22\\x0e\\x37\\x81\\x5f\\x7c\\x33\\x4b\\x73\\x83\\x60\\x7d\\x43\\x05\\x20\\x94\\x6a\\x88\\x1a\\x08\\x32\\x5b\\x41\\x64\\x97\\x9d\\x5e\\x82\\xcd\\x81\\x34\\xd7\\x8c\\xec\\x48\\x61\\xc0\\x19\\xf6\\xde\\x30\\x1c\\x1b\\x9a\\xec\\x52\\xbb\\x98\\x20\\x33\\xfb\\x79\\xb2\\xe9\\x73\\x1b\\xab\\x29\\x68\\xbc\\x3f\\x93\\xfa\\x56\\x04\\xb8\\x93\\xc6\\x02\\x8c\\x20\\x4c\\x36\\xbb\\x8c\\x6b\\x07\\x4b\\xe2\\x8c\\x96\\x4d\\x28\\x49\\xb5\\xbb\\x19\\xd7\\xe0\\xba\\x24\\xe2\\x2a\\x20\\x4d\\x4f\\xda\\x83\\xb1\\x01\\x31\\xd3\\x83\\xf1\\x0b\\x13\\x6b\\xd0\\xdb\\xa3\\x9e\\xc2\\x6a\\xf3\\x0e\\x3f\\xfb\\x4d\\xbc\\x0c\\x92\\x1f\\x0c\\xc9\\x91\\x07\\x15\\xd5\\x1c\\x81\\xfe\\x4c\\x62\\x95\\x0e\\x85\\x55\\x49\\xa1\\x7c\\xd7\\x3a\\x09\\xac\\x91\\xe0\\x6d\\x46\\x15\\x18\\x37\\x6d\\x0f\\xcf\\xa1\\x23\\xdf\\x0a\\x83\\x71\\x03\\x45\\x8d\\x9c\\xe2\\x21\\x80\\x8d\\x1f\\x9e\\xf2\\xed\\xc5\\xcd\\x2e\\x68\\x23\\x14\\x5b\\x52\\x48\\x94\\xea\\x48\\x52\\x6d\\x98\\x5e\\xef\\xd3\\xf6\\x06\\x79\\x39\\x95\\x48\\xe1\\xed\\xea\\xdb\\x53\\x95\\xb4\\x3d\\x87\\x04\\x4b\\x2b\\xfe\\x7c\\x60\\x37\\x02\\x9b\\x34\\x6a\\x40\\x22\\x27\\xea\\xb8\\x1f\\x33\\x3e\\x10\\xe7\\x7f\\x1d\\xbc\\x06\\xa2\\x11\\xd4\\x3b\\x82\\x55\\x86\\x76\\xc2\\xdc\\xff\\x90\\x82\\xb1\\xdd\\x53\\x36\\x8d\\xf0\\x02\\xde\\x13\\x29\\xaf\\x30\\x00\\xb1\\x71\\xa6\\x91\\x43\\x89\\xbb\\x80\\xec\\x0c\\x9f\\x3e\\x41\\x2a\\x44\\x1b\\x80\\x0a\\xfc\\xeb\\x04\\x86\\x70\\x9a\\xda\\xc6\\x6c\\xaf\\xee\\xf2\\x48\\x83\\x93\\x31\\xf5\\xd8\\x92\\x19\\x7e\\x25\\x42\\x0f\\x1e\\x37\\xd7\\xc0\\x24\\x7f\\x66\\x9f\\x5f\\xcb\\xf0\"},\n{{0x60,0x20,0xae,0x27,0x3e,0x0e,0x05,0x37,0xba,0xc8,0x81,0xd7,0x54,0x9d,0x92,0x3e,0xb1,0xcc,0x20,0x0d,0x49,0xca,0x65,0xd4,0xbe,0x63,0x5e,0x39,0x17,0x3d,0xf9,0xda,},{0xda,0xaf,0x0e,0x69,0x9a,0x12,0xa9,0x2c,0x16,0xe0,0xde,0xd3,0xeb,0x34,0x50,0xa3,0x63,0x11,0x82,0x45,0x77,0xe3,0x61,0xf0,0x56,0x96,0x60,0x33,0x00,0x16,0x62,0x97,},{0xb1,0xba,0x88,0xfe,0xd7,0xe5,0xf4,0xb7,0x57,0xf3,0xfa,0x4d,0x1e,0xd9,0xb1,0x9e,0x49,0x8e,0x5d,0x2f,0x5e,0x6c,0xd4,0x6e,0x42,0x6f,0xe8,0xf0,0x39,0x88,0x2f,0x1b,0xe7,0x7a,0xc9,0xe5,0xa9,0x26,0x5c,0xbf,0x7e,0x3c,0xd2,0xa9,0xe9,0x92,0x6c,0x18,0x19,0x91,0x43,0x79,0x8d,0xa5,0xbe,0x47,0xa4,0x08,0x64,0x40,0x49,0x6b,0xa0,0x0f,},\"\\x6a\\x80\\x11\\xde\\x09\\xaa\\xc0\\x0d\\xb1\\x6f\\xf7\\xe5\\x5c\\x2d\\xe6\\x7d\\x8c\\x98\\x83\\xfc\\xb2\\x04\\x0d\\xed\\xbc\\x1e\\x32\\x1c\\xab\\xa7\\xbb\\x03\\x69\\x71\\x53\\x01\\x76\\xd1\\xdb\\xba\\xa9\\x27\\x52\\x0b\\xdf\\xcc\\xbe\\xd8\\x84\\x01\\x26\\x04\\x3e\\xdc\\x44\\xcb\\xb7\\xfa\\x35\\x28\\x68\\x0e\\x5f\\x1b\\x56\\x64\\x95\\x1d\\xc9\\x01\\x09\\xae\\xa4\\xb9\\xc3\\x36\\xca\\x04\\x3d\\x82\\x21\\xa4\\xc8\\xd2\\x01\\x16\\x56\\xbf\\x94\\x4e\\xfd\\x36\\xba\\x0a\\x10\\xa4\\xb3\\x89\\x19\\x60\\x55\\x75\\x0b\\x0e\\x38\\x8f\\xb5\\x28\\x70\\xbb\\xec\\x8c\\x55\\x19\\x81\\x31\\x44\\x39\\x45\\xc0\\x9f\\x3a\\xac\\xe3\\xe6\\x91\\x50\\x14\\x37\\x40\\x73\\x26\\x6f\\x34\\x88\\x74\\x42\\xd7\\x4f\\x46\\x8f\\x8d\\x70\\x78\\xbb\\xa0\\xbd\\x81\\x4c\\xd6\\xdd\\x42\\x3c\\x97\\xb5\\x69\\x05\\x58\\x7b\\x15\\x2d\\x1f\\xcf\\xba\\x0e\\xb9\\xfd\\xe2\\x11\\x26\\x91\\xda\\xfa\\xf4\\xf9\\x21\\x56\\x2f\\x24\\x1b\\x62\\x84\\x10\\x01\\x83\\x4f\\x6c\\xe3\\x66\\x85\\xf8\\x2a\\x8f\\xaa\\x3b\\x7a\\xfa\\xd7\\x3a\\x5e\\x59\\xbf\\x5f\\x9e\\x71\\x3e\\x59\\x16\\x3f\\x31\\xdb\\xe6\\x96\\x11\\x8a\\xf3\\x35\\x06\\xd2\\xff\\xea\\x3d\\x9c\\x15\\x56\\xfb\\x15\\x2f\\xd2\\xb3\\x21\\xc3\\x17\\x57\\xd0\\xc3\\xc0\\xf6\\x0e\\xe1\\x13\\xed\\xac\\x02\\xd6\\x7e\\xfb\\xb3\\x03\\xdc\\xe6\\xfa\\x88\\xf7\\xb9\\x74\\x6c\\xa1\\x10\\xe6\\xa0\\xcd\\x09\\x9c\\x08\\x31\\xf5\\x3c\\x55\\xc2\\x8b\\x6c\\x82\\xaf\\x44\\x64\\x56\\xb8\\x42\\xb2\\xc9\\x50\\xa5\\x53\\xee\\x2c\\x76\\x5e\\x97\\x29\\xe6\\xb0\\xc5\\x46\\xbf\\xc2\\x6b\\xd6\\xd4\\x2d\\x06\\xb2\\xed\\x5d\\x4c\\x8c\\xbb\\xc7\\x5f\\x2a\\x3a\\xd8\\x12\\x93\\x95\\x79\\x3d\\x97\\x9c\\x03\\x1f\\xce\\x7e\\x20\\xb3\\x8b\\xd8\\x9c\\x9b\\x62\\x47\\x48\\xb2\\x01\\x34\\x23\\xce\\xba\\xda\\x02\\xcd\\xe2\\x05\\x2d\\xa5\\x66\\x4c\\x6c\\x64\\x26\\xcb\\xfc\\x88\\xf8\\x4f\\xf6\\x02\\xe2\\xe2\\x0d\\xf9\\x67\\x8f\\xbb\\xa5\\x77\\xa4\\xc1\\x34\\x51\\x7e\\xe0\\x50\\x68\\x11\\x51\\x58\\x0f\\x7c\\x5c\\x97\\x87\\xb9\\x6e\\x55\\xc4\\x07\\x5a\\x26\\xf4\\xf8\\xcc\\xff\\xbb\\xb6\\xea\\x18\\xde\\x1b\\x2c\\xc8\\xc4\\x49\\x6b\\x16\\x04\\x27\\x70\\xb7\\xec\\x6e\\xb5\\x42\\x9e\\x7a\\xc1\\x89\\x12\\x32\\xaa\\x4e\\x47\\x46\\x7f\\x4e\\x9a\\x98\\x5d\\x80\\x54\\x7e\\xcc\\x4c\\x6f\\xd9\\xf5\\x97\\x63\\xed\\xe9\\x16\\x71\\xf2\\xaa\\x57\\x36\\xa5\\xd1\\x48\\xe3\\xa8\\xff\\xc8\\x8e\\x61\\x25\\x3a\\x85\\xb0\\x95\\x36\\x54\\x95\\x8e\\xb2\\xd6\\x94\\x01\\xcb\\xea\\xe7\\x75\\xf8\\xcb\\x8c\\x3c\\xa4\\x2d\\x21\\x69\\x3e\\xbe\\x29\\x88\\x38\\xdf\\x94\\xc1\\xd7\\x7b\\x12\\x6a\\x12\\x05\\xcc\\x47\\xd5\\x0d\\x53\\x67\\xb6\\xf2\\x76\\xec\\x8d\\xb6\\xb9\\x53\\x24\\xa3\\x1e\\x8f\\xd2\\xed\\x2e\\x43\\x42\\x0c\\x4a\\xd0\\x2e\\xa2\\x77\\xdd\\x94\\x8a\\x55\\x19\\x3d\\x0f\\x0b\\x4d\\x1c\\xf2\\x83\\x86\\xc7\\x25\\x97\\x5c\\xe5\\xc1\\x2d\\x2a\\x6f\\x35\\x67\\x3c\\xc2\\x2a\\x06\\x94\\xcc\\xa4\\xda\\xf6\\xaf\\xbf\\xd3\\x26\\xd8\\x8c\\x18\\x50\\xf8\\x34\\xc4\\x2f\\xf0\\xe2\\x92\\xba\\x4f\\x13\\xe5\\xef\\x07\\x74\\xa5\\x96\\xd3\\x39\\x04\\xc0\\x26\\x2d\\x31\\xdf\\x2c\\x58\\x4a\\x0a\\x4f\\x45\\x3f\\x6a\\xe4\\xa8\\x8a\\x27\\x5f\\x7d\\xe7\\x9c\\x13\\xae\\x1a\\x73\\x11\\x5b\\xe0\\x2f\\x42\\x5c\\x6f\\x17\\x7a\\x1e\\xc4\\x63\\x9c\\x42\\xa7\\x92\\x80\\x9a\\x2b\\x09\\x19\\xeb\\xd3\\x21\\xe3\\x16\\x00\\x1d\\x5b\\x2f\\x84\\x89\\x4f\\xce\\xbd\\x50\\xa1\\xdc\\xf4\\x4d\\x70\\x2b\\x92\\x45\\x32\\xfc\\x0e\\x4d\\x3f\\x9f\\xf8\\x48\\x6c\\x0e\\xd1\\x80\\xee\\xcc\\x3e\\x09\\xe2\\x27\\x2a\\x94\\xdc\\x7d\\x24\\xa4\\xe8\\x7a\\x93\\x1f\\xe2\\x49\\x5c\\xbf\\x99\\x2c\\x0a\\xae\\x92\\x01\\xe0\\x79\\x62\\x98\\xf9\\x36\\x3d\\xba\\xc4\\x75\\xe8\\xed\"},\n{{0x93,0x2a,0x20,0x0e,0xce,0xe7,0x22,0x3f,0x24,0x14,0x62,0x83,0xa4,0x04,0x8c,0x67,0xa6,0xa2,0xd2,0xfc,0x4b,0xa0,0xf9,0x24,0x8b,0xdf,0xfd,0x82,0xc6,0xcc,0xe3,0xcb,},{0xec,0x9b,0xfb,0x7a,0x6d,0x04,0xe7,0x26,0xfc,0x1e,0xa0,0xc4,0x24,0x61,0x0d,0xcb,0x79,0x67,0xbf,0x15,0xd6,0xd6,0x62,0x68,0x58,0xd4,0x11,0x19,0x8d,0x40,0xe2,0x39,},{0xcd,0x1e,0x4b,0xdf,0x4a,0x3e,0x4a,0x31,0xd6,0x52,0x54,0x33,0x3c,0x8c,0xc4,0x08,0x7e,0x4c,0xc4,0x0b,0x02,0xe2,0xa3,0x47,0xd0,0x9a,0x3d,0xde,0x69,0x84,0x90,0xc0,0x87,0xd7,0x10,0x9a,0xd0,0x20,0x9c,0x53,0xe9,0x87,0x58,0x9c,0xbf,0x3c,0xe2,0x64,0x12,0xa2,0xb0,0x2c,0xb8,0xa3,0xbc,0x93,0xfe,0xc7,0x5a,0xb5,0xd2,0xc3,0x87,0x03,},\"\\xdf\\x95\\x32\\x07\\x04\\x82\\x13\\xaf\\xb8\\xe2\\xaf\\x45\\x2c\\x88\\x9a\\x21\\xca\\x13\\x6a\\x68\\xc9\\x29\\xbd\\xc8\\x24\\xf9\\xa8\\x9a\\xc5\\x96\\xdc\\xb9\\x00\\x19\\xa4\\x6f\\xb6\\x82\\xbc\\xfd\\x96\\x2f\\xcc\\xb2\\x7d\\x00\\xba\\xf8\\xec\\xca\\xf9\\xd9\\xa7\\xd8\\x18\\x3c\\xab\\xd7\\xdf\\xa5\\x06\\xf7\\xba\\xfb\\x49\\x35\\xab\\x04\\x59\\x31\\xff\\x8f\\xae\\xb7\\x16\\x31\\xf9\\xed\\x6b\\xb8\\xf8\\x47\\x3a\\xd6\\x29\\x0d\\x7c\\xf5\\x19\\xdb\\x31\\x0a\\x44\\x42\\xc4\\x61\\x11\\x8f\\x67\\xd1\\xa6\\xd1\\x03\\xba\\xe6\\xf2\\x69\\x7c\\x94\\xb7\\x42\\x6d\\x9e\\x02\\xe3\\xcb\\x95\\x22\\xfd\\x0b\\x44\\xae\\xf6\\x00\\xc9\\x62\\xfe\\xff\\x58\\x73\\xd9\\x8c\\x27\\x90\\x88\\x7b\\x8e\\x88\\xd1\\x60\\x82\\x4f\\x1b\\xba\\x22\\x01\\x76\\x39\\xf8\\xdc\\xe6\\x8f\\x74\\x34\\x80\\xde\\xea\\x1f\\x92\\xaa\\x1f\\xd4\\x13\\x5d\\xd0\\x64\\x57\\xa6\\x0f\\x36\\xb7\\xd7\\xf5\\x17\\xd4\\x0c\\x94\\xc0\\xdd\\xdc\\x2e\\x46\\x58\\x47\\xd9\\x09\\xb9\\xf6\\x82\\x45\\xff\\x2b\\x42\\x1d\\x59\\x19\\x00\\x1a\\xae\\x5a\\xef\\x24\\xe0\\x2c\\x00\\x2d\\xa9\\x07\\xe8\\x60\\x5f\\x16\\x0e\\xa6\\x09\\x6b\\x58\\x0b\\x75\\xce\\xa0\\x22\\xd4\\x02\\xf7\\xf5\\xfd\\xc4\\x64\\xf8\\x7f\\x78\\xc7\\x90\\x6a\\x01\\xe8\\xe4\\x8f\\xb5\\xb3\\x51\\x74\\x61\\x2b\\x48\\xac\\x8b\\xc7\\x50\\xe0\\xf3\\xae\\xb0\\xa1\\x2f\\x7d\\xfc\\x09\\xb0\\x84\\x2c\\x17\\x80\\xa5\\xfd\\x9c\\x54\\xaf\\xb9\\x39\\x9b\\x94\\x08\\xba\\xac\\xcd\\xa2\\x0a\\xfb\\xe3\\xd6\\x82\\x24\\x8d\\x7b\\xf1\\xef\\xde\\xf4\\x90\\x5a\\x31\\x9b\\x0f\\xfb\\x10\\x8b\\x75\\x3b\\x71\\xcc\\x97\\xe9\\xe2\\x1e\\xc9\\xb3\\xdd\\x28\\xce\\xe0\\x39\\xd9\\x41\\x8a\\x11\\x35\\xf0\\xad\\xd0\\x92\\xaa\\x66\\x31\\x2e\\xa2\\x91\\x33\\x00\\xd1\\xcc\\x89\\x16\\x52\\x43\\x02\\xbd\\x3d\\x1b\\x09\\xe6\\xb2\\x9c\\x68\\x57\\xcb\\xdc\\x56\\xef\\x4b\\x3f\\x35\\xd8\\xee\\x67\\x72\\x08\\xef\\xfa\\x84\\x6f\\xdb\\x06\\x6b\\x05\\xeb\\x71\\x7b\\x4d\\x45\\x12\\x0c\\xab\\x72\\xa7\\xdb\\x7a\\x7c\\xa8\\x46\\xe8\\x7b\\x16\\xb6\\x90\\x47\\xeb\\x76\\xd8\\xf1\\x8d\\xa8\\xe1\\x39\\x9e\\xc0\\xa8\\xc9\\xc3\\x28\\xcb\\xe6\\x0e\\x0b\\xf4\\x20\\x44\\xd2\\xeb\\xf2\\x81\\x8b\\x3c\\x04\\x75\\x88\\x45\\x2f\\xcd\\x2b\\x3e\\xfc\\x1e\\x10\\x09\\xae\\x07\\x68\\x87\\x27\\xdb\\x8f\\xb6\\xdf\\x2a\\x2f\\xe7\\x5d\\x1c\\xf2\\x2f\\x32\\xba\\xc0\\x9c\\x82\\xa6\\xa3\\xd7\\xee\\xd7\\xd0\\x05\\x08\\xcb\\xe5\\xb7\\x24\\x60\\xec\\xfc\\xdd\\x3e\\xe9\\x11\\xef\\xe5\\x89\\x8d\\xbd\\x8e\\x4c\\xe8\\x59\\x13\\x26\\xdd\\x15\\x22\\xf9\\xd2\\x55\\xda\\x86\\x1b\\xf9\\xeb\\x2a\\x1d\\x57\\x25\\xd7\\xd5\\xd4\\x27\\x34\\x03\\x41\\x94\\x5e\\x7b\\xca\\x8c\\xf2\\xff\\x8a\\x99\\x74\\x50\\x95\\x3e\\x77\\xd2\\x03\\x68\\x3e\\x4b\\x0d\\xaf\\xc3\\x30\\xe0\\x56\\x72\\xd2\\xec\\xd1\\x3a\\x3f\\x44\\x2d\\xf1\\x37\\x04\\x4e\\x0f\\x55\\x6f\\xfb\\xce\\xff\\xea\\x26\\xcb\\xae\\x26\\xcb\\xa6\\xf2\\x56\\x8c\\xf3\\x9f\\x90\\x84\\x89\\xe1\\xa9\\x2e\\x76\\xaf\\xbf\\x29\\x79\\x95\\xda\\x4b\\x2c\\xb1\\xab\\xc9\\xee\\x1f\\xe4\\xdc\\xa5\\xaa\\x83\\x8b\\x2f\\xbd\\xc1\\x09\\xe8\\x9b\\xef\\x3c\\xe5\\xa3\\x6e\\x5b\\x2f\\x71\\x2a\\xc4\\xc8\\x89\\x43\\x82\\x48\\xfa\\x5a\\x21\\x50\\xca\\xc6\\xc9\\x77\\xb5\\xe0\\x54\\x3f\\x40\\x10\\xb7\\x31\\x47\\x32\\xfd\\x18\\xe7\\xfd\\x59\\x82\\xe8\\x32\\x76\\x51\\x9e\\x78\\x72\\x5e\\x5a\\x5e\\xeb\\x86\\xf4\\x89\\x20\\x84\\xae\\x52\\xda\\x38\\x49\\xc2\\x28\\xc8\\x09\\xed\\xbf\\x69\\xa2\\xcc\\x47\\xc4\\x78\\xd1\\x87\\x19\\xf1\\x11\\xd7\\x37\\x88\\x7c\\x7a\\x2e\\xb3\\x25\\x08\\x98\\xdb\\x34\\xe5\\xe5\\x07\\x6f\\xab\\x9f\\x4a\\x9e\\x6e\\x19\\x29\\xa3\\x48\\x08\\x36\\xde\\xa0\\x7b\\xa4\\xd6\\x3f\\xce\\xfc\\xe5\\x54\\x34\\x30\\xa8\"},\n{{0x5c,0x48,0x3e,0x83,0x7e,0xb0,0x1e,0xd5,0xa4,0xad,0x5d,0xb3,0x79,0x26,0x99,0x82,0x4d,0xf1,0x3e,0x57,0x6b,0xe9,0x67,0xd1,0x21,0x15,0xc8,0x5e,0x02,0x86,0xe6,0x28,},{0xfe,0x1a,0xa8,0xb0,0x69,0xda,0x56,0xe6,0x76,0xef,0x3a,0x57,0xd9,0xbb,0xa8,0x83,0x05,0xea,0x03,0x28,0x08,0xee,0x63,0x52,0x73,0xb3,0x7c,0x5c,0x63,0x5d,0xef,0x4e,},{0xc1,0x7c,0x2f,0xbf,0x8c,0x00,0xbc,0xea,0x30,0x35,0xbf,0x0a,0x62,0xd3,0x02,0x29,0xdb,0x74,0x2c,0xab,0x11,0x99,0x67,0x7c,0x7e,0xb4,0xeb,0x0e,0xf5,0xc7,0xb5,0x1a,0xd4,0x87,0xa4,0x97,0x1b,0x63,0x1e,0x79,0x4a,0x58,0xbb,0x08,0x23,0xcc,0x0f,0xe6,0x26,0x10,0xfd,0xa6,0xa9,0xe0,0x3f,0x8c,0x4c,0x33,0x81,0xcb,0x15,0x4c,0xef,0x0b,},\"\\x58\\xd5\\xe2\\xcd\\x89\\x9b\\xa9\\x85\\x37\\x8b\\x3e\\xc3\\x3e\\x9a\\x86\\x98\\x22\\xb2\\x3d\\x5d\\x89\\x6a\\x28\\xf4\\x24\\xfc\\xd6\\xe4\\xcc\\x28\\xb8\\x0d\\x4a\\xaf\\x2d\\xe8\\x04\\x36\\x7e\\xfd\\xf5\\xe4\\x23\\xb1\\x23\\x4d\\x82\\x1d\\x63\\xac\\x05\\xea\\xed\\x12\\xc7\\x3e\\x8e\\x36\\x08\\xaf\\x0d\\xdc\\xcc\\x83\\x86\\xb7\\xd8\\x42\\xb1\\x2e\\x60\\xd3\\x0c\\xed\\xe3\\x25\\x53\\x94\\x5e\\x78\\x29\\xe9\\xb2\\x3f\\x5c\\xcc\\x2e\\x71\\x03\\xa0\\x8f\\x2c\\xdd\\x9e\\x75\\xa7\\xb3\\x6f\\x5e\\x63\\x72\\x0e\\xf0\\xd4\\x9b\\x25\\x92\\xbe\\xf3\\x74\\x02\\x68\\xc8\\x9c\\x86\\xa6\\xcb\\xdf\\xe2\\x01\\xde\\x0d\\xb9\\x98\\x5c\\xeb\\x19\\x39\\x9c\\x9a\\x1d\\x5b\\xb0\\x58\\x6a\\xf3\\xc8\\xcd\\xf2\\x71\\x32\\x99\\xeb\\x04\\x43\\xa5\\x41\\xa4\\x73\\x84\\x60\\x72\\x43\\xc5\\x4a\\x05\\x91\\x50\\x58\\x36\\x7d\\x3f\\x2d\\xb3\\x80\\xed\\x31\\x7a\\x8c\\x12\\xc7\\xa6\\x3e\\x80\\x9c\\x2e\\x84\\xd4\\xac\\xb9\\xd9\\xee\\xf5\\x4c\\x6f\\x5a\\xf7\\xab\\x59\\xcb\\x91\\x68\\xb1\\x06\\x8f\\x9d\\x2c\\xcd\\x97\\x8f\\xe7\\x21\\xba\\xd6\\x8a\\x66\\x9f\\xfe\\xde\\xa3\\xe9\\x2c\\x76\\xb3\\x2e\\x31\\x66\\x65\\x8e\\xe3\\xbd\\x0d\\xeb\\x1b\\x08\\x41\\x94\\xce\\x35\\xd9\\xa7\\x41\\xc5\\x7f\\xc2\\x24\\x1e\\x68\\xef\\xaa\\x65\\x32\\x0b\\x23\\xa1\\xdd\\x19\\xea\\x8b\\x7e\\xc8\\x1e\\x76\\xf1\\xe9\\x16\\x3f\\x95\\x92\\xee\\xee\\x5a\\xf8\\xec\\xed\\x02\\x72\\xf3\\x35\\x12\\xd0\\xd4\\xca\\x06\\x7f\\x05\\x55\\x1b\\x26\\x53\\x96\\xe1\\x00\\x14\\x78\\x3c\\xac\\xac\\x79\\x43\\x7b\\x19\\x84\\x2d\\xe6\\xab\\x91\\xb9\\xd9\\x23\\xbb\\xeb\\x50\\x33\\x25\\xbc\\x54\\x86\\x9f\\x66\\x3e\\x6e\\xa4\\xae\\x68\\x97\\x70\\x1b\\xe7\\xe1\\x1d\\x16\\xcd\\xfa\\xe0\\xee\\xe8\\x61\\x86\\x20\\x00\\xe7\\xa4\\x16\\x07\\x81\\x54\\x7e\\x42\\x52\\x6a\\xf5\\x1b\\xa9\\x69\\x8d\\x23\\x4a\\xaf\\x51\\x0d\\xa8\\x1a\\x0d\\xbf\\x26\\x43\\x66\\x15\\x3d\\x7a\\x6d\\x5e\\xb3\\xfb\\x08\\xb9\\xbb\\x5e\\xa0\\x65\\xc2\\xf5\\xe5\\xb6\\xbb\\x67\\x9d\\x2e\\x21\\x0b\\x5b\\x40\\xe2\\xbc\\x82\\xf7\\x8d\\xc9\\xab\\x58\\x24\\xb7\\x4a\\xad\\xad\\xd8\\x9b\\xf8\\xa8\\xb7\\x3a\\x0a\\x2f\\x43\\xac\\x74\\x83\\x78\\x92\\x1a\\x73\\xa2\\x52\\x70\\x4a\\x4a\\xdb\\xf7\\x40\\xcb\\x99\\xc1\\xe1\\x59\\x4c\\x37\\xac\\x9a\\xcc\\x19\\xf5\\x23\\x15\\xc6\\xa8\\x46\\xa5\\x7b\\x36\\x12\\x8c\\x64\\xd7\\x67\\xaf\\x44\\xe9\\xc8\\x63\\x05\\xbf\\x18\\xba\\x7c\\xd5\\x26\\x80\\x52\\x3a\\x3b\\x10\\x2f\\xba\\x6f\\xe5\\x55\\x67\\x06\\x9d\\x20\\x47\\xcb\\xdd\\x96\\x05\\xea\\x12\\xc8\\x87\\x7d\\x39\\x9c\\x1e\\x66\\xe3\\x38\\x17\\x73\\x1f\\x50\\xb8\\x4f\\x81\\x7d\\x1f\\x07\\x60\\xa4\\x0f\\x97\\x46\\x86\\x18\\x93\\x41\\x05\\xeb\\x00\\xec\\x50\\xc7\\x6d\\xb3\\xc5\\x3f\\xcf\\x43\\xfe\\x17\\x02\\x90\\x7d\\x9a\\x75\\x6b\\xcf\\x43\\x9f\\x88\\x31\\xd0\\xbf\\xac\\x92\\xe7\\x05\\x8f\\xb1\\x57\\xbe\\x3e\\x59\\x1d\\x37\\xeb\\x34\\x16\\x5e\\x3c\\x6f\\xc6\\x0e\\x72\\x29\\x4c\\x08\\x3e\\x47\\x76\\x26\\xf9\\x00\\x1c\\x1d\\x73\\x7c\\x29\\x03\\x77\\xdf\\xa5\\x8e\\xa4\\xea\\xd3\\x02\\x8f\\xc7\\x62\\xce\\x8a\\x3a\\xfe\\xc2\\xe6\\xe1\\x32\\xc6\\x62\\xdf\\x60\\x34\\xab\\x55\\x4f\\x93\\xef\\xac\\x65\\x7a\\xd3\\x4f\\x61\\x07\\xd3\\x47\\xfc\\x5c\\x5e\\x53\\xf3\\x73\\x3e\\x17\\x8b\\x76\\x01\\x4d\\x2f\\x9b\\xbd\\x06\\xef\\x2d\\xfe\\x60\\xe2\\x08\\x3d\\x88\\x65\\xf7\\xf5\\xb2\\xac\\xc0\\x25\\xd9\\x12\\xe5\\xcf\\x6c\\xda\\x6e\\x79\\x81\\x43\\xe9\\xdb\\xbc\\x70\\xa0\\x21\\x1d\\x8e\\x40\\x03\\xd7\\x8b\\x38\\x3d\\x66\\xa6\\xad\\x29\\x71\\x7c\\xa2\\x4e\\xdd\\xef\\x7d\\xf7\\xcd\\x3a\\x7e\\xf6\\x52\\xab\\xa5\\x48\\x7a\\xfe\\x5d\\x02\\x6c\\x9b\\x10\\x28\\x07\\x29\\x4e\\xb2\\x7d\\x98\\x24\\xee\\xb6\\xb4\\x0f\\x08\\x3d\\xe7\"},\n{{0xb0,0xd0,0xab,0xdd,0x84,0x44,0xe1,0x0f,0x29,0x37,0x54,0xac,0x9f,0x16,0xe3,0x1b,0xdc,0xdd,0x97,0xb7,0x06,0x71,0x28,0xaa,0xe8,0xe4,0xd7,0xf1,0x12,0x89,0xe2,0xcd,},{0x1c,0x78,0xcc,0x01,0xbe,0xa1,0x53,0x52,0xb6,0x3c,0x56,0x97,0xf1,0xcf,0xe1,0x2f,0xfd,0xd1,0x6d,0xdc,0x1d,0x59,0xe7,0x79,0x51,0xb6,0xe9,0x40,0x8e,0xe2,0x28,0xad,},{0x64,0x40,0x8b,0xdd,0x2d,0x0f,0xc8,0x92,0xa5,0xb6,0x2b,0x5a,0xcf,0x8e,0x3b,0x3c,0x73,0xc0,0xb5,0xc4,0xfa,0x2a,0x72,0xe3,0x9d,0xd6,0x08,0xd4,0x93,0x7f,0x93,0x32,0xf7,0x3e,0x14,0xd0,0x8b,0xad,0xc6,0x27,0x01,0x14,0xd1,0xf1,0xa5,0x56,0xcc,0x6e,0xe8,0x48,0x8a,0xbb,0x90,0x7f,0x79,0xae,0x17,0x5c,0x35,0x2e,0x9f,0x11,0xee,0x05,},\"\\xaa\\x27\\x6c\\xc5\\x43\\xfc\\xc6\\x2d\\x70\\xa7\\x04\\x60\\x8d\\x98\\xce\\x51\\xb6\\x45\\xb5\\xc2\\x4a\\x64\\x0a\\x5d\\xf1\\x0a\\x55\\x91\\x41\\x7d\\x10\\x89\\x26\\xdf\\x3f\\x0c\\xe1\\xb9\\x21\\x03\\x33\\x09\\xeb\\x8d\\x86\\x59\\xf4\\x89\\xfd\\x6f\\x79\\xaa\\x1b\\xf4\\x88\\x2d\\x72\\xac\\x69\\xcc\\x58\\xd3\\xbc\\xe0\\xfa\\x89\\xb1\\x64\\x11\\xe9\\x75\\x3e\\xb4\\x0c\\x6c\\x4d\\x59\\x8d\\xc8\\xf4\\xab\\xb0\\xbc\\x48\\xf1\\x37\\x03\\x71\\x32\\x6c\\x9a\\x86\\xbb\\xc2\\xac\\x62\\x14\\x47\\x8e\\x78\\xa3\\x84\\x08\\xbd\\xda\\xfa\\xa9\\x59\\x26\\x00\\xc4\\x9a\\x12\\x9c\\x05\\x39\\x2f\\x8a\\x7d\\x64\\x2b\\x49\\x13\\x7a\\x20\\xf3\\xfe\\x9f\\x11\\xee\\x17\\xcf\\xa3\\xaf\\xd2\\xaf\\x71\\x56\\x5e\\x9c\\x40\\x08\\x0b\\x60\\xcd\\x0d\\xbc\\x37\\x8e\\xda\\x06\\x2c\\x7c\\xbc\\x7f\\xe9\\x72\\xbd\\xe4\\x50\\x9a\\x1d\\xe9\\x5f\\x14\\xdf\\x48\\x2f\\x48\\xaa\\xcc\\x46\\x3c\\xd5\\x94\\xf6\\x6d\\x64\\x8d\\x37\\x94\\x73\\x8a\\xd6\\xab\\x49\\x6e\\x2d\\xa5\\x0b\\x0d\\xb2\\xba\\x7b\\x65\\x91\\x85\\xe4\\x58\\x7f\\x18\\x2e\\x83\\x3d\\xe7\\x50\\xfa\\xac\\xdd\\xf2\\x1a\\xf5\\xe0\\xcf\\x4c\\x9a\\xf3\\x85\\xb0\\x4f\\x7b\\xe2\\x31\\x49\\x8a\\xd0\\xb7\\x42\\xd5\\xa8\\x7c\\x06\\x11\\x5d\\xb2\\x30\\x97\\x3a\\x51\\x42\\x7f\\x20\\x2f\\xa3\\x9a\\xfb\\x98\\x28\\xb5\\xf0\\x3f\\xa3\\x27\\xcb\\xd5\\x2d\\xfe\\xc6\\x6d\\x71\\xea\\x31\\x98\\x65\\xdc\\xf6\\x81\\x0f\\x18\\x58\\x47\\x2d\\x8b\\xea\\x3e\\x44\\x7a\\xdf\\xb4\\xb6\\x07\\x58\\xe8\\x6b\\x48\\x13\\x37\\x09\\x73\\x2d\\x2b\\xcf\\x51\\xc7\\x6c\\xaa\\x84\\x7b\\x65\\x37\\xfc\\xb0\\x5b\\xb8\\xc8\\x7d\\xc5\\xe9\\xfb\\x02\\x2b\\x32\\x60\\xc1\\xd7\\x1b\\x14\\x98\\x59\\xc9\\x66\\x3d\\xbd\\xae\\x6a\\x7b\\xbf\\xd6\\xde\\xb9\\xd1\\x23\\x80\\x9c\\x24\\x14\\x01\\xaf\\x10\\x71\\x9c\\xf9\\x1a\\x6b\\xed\\x16\\x08\\x4c\\x44\\x46\\x07\\x35\\x9e\\xd8\\xf0\\x18\\xdb\\x11\\x15\\x11\\x89\\x2b\\x46\\xbd\\xac\\x6c\\x9c\\x61\\x38\\x41\\xde\\xd8\\x86\\xb9\\xde\\xc0\\x6c\\x01\\xe8\\x04\\x87\\xe4\\x8f\\xbe\\x77\\x8e\\x9e\\x97\\x50\\x8f\\xfd\\xa0\\x57\\x78\\x53\\xaa\\xbd\\xca\\xca\\x8b\\x0b\\xab\\x6c\\xe4\\x15\\x57\\xaa\\xb9\\x63\\x1c\\x96\\xd6\\x09\\x77\\xe3\\x57\\x18\\xb6\\x05\\x95\\x27\\x3f\\xdb\\xa1\\x40\\xf5\\x50\\x0a\\x8d\\x35\\x76\\xf5\\xa9\\xfc\\x8f\\x3c\\xa4\\xc0\\x2c\\x16\\x7a\\xf2\\xe0\\x3d\\x25\\x75\\x0b\\x42\\xad\\xb0\\x3b\\x14\\x17\\xf2\\xb6\\xd2\\x19\\xbe\\x5f\\x84\\x29\\x33\\x1a\\x26\\xa4\\x49\\xb5\\xd4\\xdb\\x2b\\x1a\\x09\\x15\\x2e\\xea\\x2b\\x25\\xd2\\xdf\\x7e\\xf6\\xfe\\x0a\\x32\\xe2\\x5f\\xae\\x79\\x36\\x0a\\x9a\\xee\\x15\\x11\\xfd\\xa8\\x06\\x45\\x50\\x93\\x7a\\x71\\x30\\x97\\x19\\x30\\xc6\\x73\\xbb\\x35\\x8e\\x5f\\x55\\x95\\x1f\\x50\\xb1\\x46\\xd8\\x5d\\x38\\x3f\\x3e\\x01\\xc1\\x51\\xec\\xe6\\xc0\\x6d\\x83\\x67\\x01\\x25\\x32\\x80\\xfd\\xcf\\xf4\\xe1\\x39\\xd3\\x31\\x9a\\xb2\\xe2\\xca\\x71\\xbc\\xc3\\xfa\\x0f\\xaf\\x7c\\x70\\x2c\\x9c\\x60\\x4e\\x56\\x51\\xde\\x4a\\xf5\\x70\\x0e\\x9e\\xde\\x72\\x58\\xb9\\xbc\\x14\\x8d\\x55\\x95\\xcd\\x34\\x17\\x0e\\x3e\\x5c\\xf2\\x92\\x82\\x83\\x90\\x90\\x8f\\xda\\x96\\x1f\\x22\\x30\\xac\\x0b\\x8c\\xac\\x64\\x73\\x97\\x32\\x70\\x6c\\xe2\\xd5\\xe5\\x9a\\xbd\\x6d\\x5e\\x20\\x7b\\xda\\xfe\\xa7\\x4d\\x28\\xd7\\xa7\\x58\\xf2\\x20\\x0e\\x4e\\x00\\xa0\\xbc\\xf0\\x30\\x6a\\x3c\\xab\\xda\\x47\\x02\\x4f\\xab\\xea\\xe4\\x88\\xab\\x5c\\x32\\x37\\x15\\xcf\\x3c\\xa7\\x72\\x0a\\xf9\\xeb\\xbf\\x85\\x82\\xe1\\x15\\x8a\\x09\\x9d\\x73\\x6b\\x56\\x9b\\x9d\\x40\\x29\\x58\\x17\\xea\\x25\\x54\\x06\\x8b\\xef\\x32\\x44\\x2c\\x11\\x1e\\xc8\\x14\\xc6\\xed\\x41\\x59\\x19\\xba\\x73\\x52\\x63\\x34\\xdf\\x30\\xba\\xc6\\x66\\x08\\x4e\\x56\\x01\\xc2\\x28\\x1c\"},\n{{0x49,0x84,0x97,0xfd,0xcc,0x6a,0x10,0x58,0x91,0xe0,0x23,0xff,0x32,0xd7,0x5f,0x7c,0x37,0x48,0xd8,0xc5,0x2d,0x87,0xdd,0x3b,0x27,0x75,0xae,0xfd,0x81,0x60,0xa1,0x43,},{0x2d,0x79,0xae,0x9c,0xee,0x4a,0xc6,0x27,0x5b,0x05,0x74,0x9c,0x43,0x8e,0xbe,0x55,0x2b,0x41,0x3d,0x87,0x3c,0xc0,0x7f,0x14,0xf5,0xfa,0x13,0x01,0x77,0x21,0x4c,0x54,},{0xb0,0xa3,0x6a,0x2c,0x93,0x47,0x56,0x34,0x8e,0xb4,0x7c,0x25,0xa3,0x2c,0x3f,0x2a,0x5d,0xdb,0xd5,0x8f,0xcc,0x72,0xa0,0x8c,0x3c,0xea,0xd1,0xa2,0xd9,0x00,0x33,0x5c,0x30,0x01,0xe3,0x5b,0xfe,0x1f,0x3f,0xb5,0xa5,0x55,0x00,0x9b,0xa8,0xe9,0x68,0x74,0x49,0x4b,0x97,0xe8,0xb0,0x97,0x00,0xed,0xcb,0x1f,0x25,0x84,0xb9,0xd0,0xfe,0x03,},\"\\xbe\\x38\\xbc\\x8c\\xdf\\x46\\x19\\x0e\\x30\\x4a\\xb5\\x3d\\xd2\\x9c\\x2b\\xc4\\x09\\x54\\xfd\\x4c\\x6d\\x2b\\xb9\\x90\\xf9\\x3b\\x2b\\x5c\\x69\\x1f\\xdf\\x05\\x27\\xc2\\x60\\xf5\\x06\\x61\\x87\\xf2\\xd0\\xf3\\x1f\\x43\\xa0\\x8b\\x36\\x0e\\xa1\\xed\\x82\\x00\\x65\\x17\\x64\\xb8\\xfa\\x49\\x59\\x5a\\x15\\x94\\x10\\x9e\\x49\\x67\\x59\\xab\\x66\\x23\\xfa\\x33\\x37\\x8d\\x80\\x0e\\x61\\x17\\xe0\\x79\\xe1\\x3f\\xe8\\x5c\\x81\\xb6\\x3e\\xbe\\x24\\x7b\\x3d\\xf6\\xc1\\x58\\x4b\\xc7\\xcf\\xfb\\xdf\\xa4\\x5f\\x2a\\x2c\\xe7\\xc2\\x37\\xaa\\xaf\\xef\\x8c\\xbc\\xa7\\x0b\\xca\\xbc\\xe0\\xb8\\x47\\xd5\\x51\\xf4\\x6a\\x7d\\x15\\xce\\x2a\\x0d\\x3d\\x54\\x5a\\xba\\xcc\\x59\\x30\\x01\\x0c\\x53\\x64\\x88\\x87\\xd4\\x76\\xe0\\xd1\\x3a\\x34\\xfc\\x1c\\x54\\xdf\\x09\\xd1\\x06\\xed\\x75\\x8d\\xee\\xdc\\x76\\x1d\\x55\\x7a\\x73\\xb2\\xbc\\xdd\\xde\\xfb\\xa4\\xed\\x00\\x59\\x97\\xb1\\x92\\x79\\xb9\\xd2\\xde\\x37\\xd0\\x41\\xfe\\x01\\x3e\\xef\\x05\\xa2\\xe1\\x1c\\x9a\\x23\\x4e\\x87\\xcc\\x0e\\x16\\xc0\\xc6\\xda\\x42\\xaa\\xa5\\xbf\\x99\\x64\\x17\\xbf\\x64\\xe5\\xb7\\x85\\xd6\\x7d\\xc3\\x25\\x47\\xc1\\xf0\\x52\\x17\\x8d\\x69\\x4c\\xf2\\x0f\\x16\\x98\\x58\\x9e\\x7e\\xd4\\x9b\\xe2\\x9d\\xd5\\x9f\\xd5\\xc0\\x1b\\xa1\\xd9\\xf5\\xfb\\x06\\xa7\\x58\\x95\\xb7\\xb1\\xe1\\x58\\x95\\x09\\x7e\\xbd\\xe8\\x4c\\xad\\x63\\x03\\xaa\\x0a\\x86\\xdb\\xc3\\x24\\x74\\x7d\\x97\\x24\\x5d\\x70\\xc5\\x20\\x3b\\xe0\\x1b\\x06\\xcb\\xde\\x06\\xae\\x03\\x72\\x04\\xd2\\x37\\x30\\xcd\\x69\\x61\\x89\\xf7\\xac\\x26\\x7c\\xf2\\x02\\x17\\x99\\x29\\xce\\x54\\x10\\xe0\\xe3\\xad\\xe5\\x13\\xd2\\x20\\x1b\\xfd\\x20\\xfe\\xfa\\x40\\xb4\\x47\\x6f\\x27\\xbf\\x90\\x7c\\x76\\x2e\\xb7\\x26\\x2a\\x5b\\xe1\\x3c\\xfc\\x04\\x7a\\x84\\x6d\\x20\\xa9\\xf2\\x31\\x1b\\x64\\x69\\xb0\\x6a\\xb5\\x45\\xf0\\xec\\x9f\\xc4\\x46\\xea\\x25\\x0c\\xd3\\xb7\\x3a\\x7b\\x6b\\x96\\x0c\\x10\\xca\\x4c\\x2d\\x6c\\x64\\xa1\\x56\\xa1\\x8c\\x9f\\xb8\\x10\\xe4\\x9a\\xfd\\x0c\\x36\\xda\\xab\\x8b\\x8b\\x85\\x66\\x43\\xa4\\xcc\\xaf\\xa9\\xad\\x88\\x6e\\x91\\xe5\\x44\\x53\\x5b\\x8e\\xdd\\xa2\\x7c\\x90\\xc0\\x6a\\xb6\\xbc\\xc5\\x36\\x28\\xbe\\x18\\xd7\\xd6\\x36\\x9c\\xa1\\x80\\x1f\\x91\\xc2\\xe0\\xb9\\x5f\\x36\\xd7\\x02\\xf7\\x72\\x34\\xb4\\x10\\x07\\x19\\xc0\\x59\\x95\\x1e\\x45\\xb1\\xf9\\x16\\x98\\x39\\x34\\xe3\\x2b\\x4d\\x4d\\x8f\\x29\\xc0\\xa3\\x73\\xf8\\xd8\\xf0\\x91\\x8b\\x96\\x78\\x65\\xcd\\x0e\\x4b\\xec\\xa0\\x13\\x27\\xc9\\x9d\\x5f\\xde\\xd4\\xc1\\xa6\\x9a\\xc2\\xd4\\xd9\\xb7\\x8f\\xfb\\x83\\x05\\x67\\x00\\x21\\x04\\x02\\x50\\xcc\\x27\\x73\\x7e\\x75\\xdf\\x75\\x76\\x0f\\xec\\x8b\\x8d\\x30\\xb2\\x45\\x65\\x4f\\x3c\\x12\\xf1\\xf7\\xce\\xa0\\xbc\\xe7\\x8a\\xb3\\x69\\x35\\x78\\xaf\\x3e\\xa6\\x1f\\xfc\\xcd\\xf9\\xba\\xf7\\xc3\\xea\\x65\\xb8\\x8f\\xc8\\x54\\x12\\x81\\x26\\x47\\x67\\x96\\x89\\x2c\\x66\\x3b\\xd1\\x45\\x18\\xc9\\x91\\x86\\x29\\xa1\\x09\\x5f\\x61\\x4e\\x04\\x92\\x44\\x6c\\x3d\\x84\\xb1\\x6e\\xc9\\x4f\\x7e\\xca\\xda\\xeb\\x6b\\x65\\x9b\\xbb\\x48\\x67\\xb5\\x79\\x06\\x17\\x14\\xfd\\x5b\\xb0\\xfa\\xa4\\xad\\x6b\\xe0\\xff\\xb3\\x88\\x8b\\xea\\x44\\x7e\\x4e\\x34\\x38\\xc8\\xf0\\xea\\xe6\\x44\\xfb\\xd4\\x5a\\x38\\x02\\xdc\\x40\\xec\\x45\\x1b\\x21\\x2b\\xd5\\x92\\xda\\xcd\\x4d\\xa9\\x66\\x86\\xdc\\x8b\\x20\\x24\\x25\\x7f\\x25\\xe9\\xc8\\x30\\xbf\\xf7\\x95\\xee\\xe8\\x5d\\x87\\xa0\\x90\\xc1\\xa4\\x23\\x21\\xe7\\x10\\x55\\x57\\x64\\xed\\x82\\x57\\xc9\\x41\\x5c\\x7f\\x22\\x4b\\x53\\x75\\x58\\xce\\xfd\\xc6\\x15\\x12\\x9f\\x28\\x35\\x02\\x67\\xc0\\x1b\\xa0\\x40\\x3e\\x07\\xf5\\xc6\\x06\\x7f\\x91\\xc8\\x5a\\x2c\\x50\\xc8\\x66\\xdc\\x43\\x88\\xaf\\x38\\xd2\\x16\\x02\\x03\"},\n{{0xd9,0x62,0xa6,0x71,0x9e,0x5c,0xc7,0x72,0x4c,0xa4,0xa1,0xd5,0x59,0x53,0x68,0x12,0xb4,0xe2,0x2a,0xa7,0xbc,0xb1,0x3e,0x4f,0xb1,0x72,0x2d,0x28,0xe0,0x45,0x21,0x7c,},{0xa9,0x44,0x59,0x2d,0xbc,0x7d,0x77,0x03,0x9d,0x72,0x02,0x56,0xc3,0xfd,0x34,0x0d,0x34,0xdb,0x89,0x2a,0xb1,0x3e,0x48,0x12,0xd6,0x62,0xe2,0x84,0x0c,0x28,0xb6,0xd0,},{0xdf,0xb9,0xb6,0x35,0xac,0x0e,0xdf,0x83,0xb7,0xb5,0x9d,0x0b,0x84,0x09,0xaf,0x47,0x5f,0x66,0xfc,0x99,0x46,0xaf,0x0b,0x7c,0x63,0xab,0x8c,0xf5,0x92,0x9d,0x47,0x01,0xa1,0xbf,0x66,0x95,0x9c,0xde,0x62,0xfb,0xcf,0x59,0xa4,0x8a,0xb3,0xbb,0xaf,0x0b,0x9a,0x61,0xb6,0xe0,0x0b,0x21,0x81,0xeb,0x93,0x42,0x82,0x07,0x0a,0x5d,0x53,0x00,},\"\\xa6\\xaa\\x7a\\x19\\x0d\\x00\\x3a\\xb1\\x75\\x33\\x2b\\x8f\\x58\\xe7\\xca\\xeb\\x69\\x08\\x54\\xd9\\xdb\\x56\\xdb\\xb6\\x95\\x7b\\x3f\\xb6\\x54\\xe2\\xe0\\xda\\x99\\x1f\\x31\\x54\\x21\\x42\\x04\\x13\\x5d\\xf1\\xe1\\x10\\x43\\x17\\xc9\\xe3\\xc5\\x8e\\xed\\xff\\x1f\\xc6\\x1a\\xba\\x57\\x74\\x4c\\x0c\\x7e\\xf4\\x86\\x00\\x0a\\x70\\xb2\\xc1\\x42\\xeb\\xad\\xdc\\x07\\xab\\x06\\x5e\\x2a\\x85\\x5d\\xaf\\x19\\x8a\\x68\\x03\\xac\\x24\\xef\\x37\\x24\\x48\\x7c\\x13\\x51\\xdd\\xed\\xa0\\x51\\x39\\x13\\x45\\x7d\\x76\\x86\\x0d\\x78\\xa9\\xb6\\xbc\\x3d\\xba\\x66\\xc4\\x0e\\x5f\\xc3\\x49\\xa8\\x73\\xad\\x60\\x65\\xce\\x7d\\x7f\\xdc\\x2c\\xc4\\x83\\xb3\\xae\\xfb\\xf2\\xf0\\x3d\\xd6\\x69\\xbd\\x9c\\xb8\\xf6\\x3c\\xee\\x47\\x78\\x5c\\xac\\xb0\\x9d\\x87\\x2c\\x9a\\xeb\\x83\\xe9\\x86\\x84\\x05\\x25\\x43\\x24\\x03\\x79\\x82\\xe0\\x86\\x13\\x45\\x5d\\x95\\x21\\xd8\\x8e\\xa2\\xfd\\xa0\\x20\\xbe\\x73\\x0c\\xfc\\x8c\\x07\\xcb\\x0b\\x37\\x61\\x4c\\xcb\\xa2\\xfa\\x3e\\xc4\\x98\\xb8\\x15\\xbb\\x5a\\xdb\\x99\\x6e\\x84\\x8b\\x38\\xc0\\x15\\xa6\\xa5\\xc7\\x52\\xeb\\xda\\xc7\\xb9\\xee\\xd8\\xb6\\x96\\x19\\xd8\\xc8\\x46\\xb6\\x6f\\x78\\x16\\xd1\\xdf\\x1e\\xbc\\x21\\x07\\x1c\\xef\\x0b\\x25\\x1e\\x2e\\xab\\x59\\x82\\x7f\\x6d\\x60\\x55\\x08\\x43\\x70\\xfd\\x27\\xc2\\x03\\xe8\\x6a\\x18\\x9f\\x1e\\xe1\\x1e\\x84\\x03\\xab\\xdc\\xbd\\x1f\\x45\\x34\\x1a\\x82\\x05\\x25\\xd8\\x63\\x7d\\xc4\\x84\\xa5\\x18\\x5d\\x65\\x51\\xcb\\x88\\x2a\\x96\\xb9\\x98\\x1a\\x5f\\x1a\\x82\\x1f\\x27\\xb6\\x56\\xff\\xf9\\x0e\\x7f\\x69\\xbf\\x28\\x6f\\x75\\x2f\\x97\\x0f\\xfc\\xa5\\xc5\\x3e\\x08\\x50\\xb2\\x0b\\x94\\xf9\\x43\\x16\\x27\\x09\\x4a\\xce\\xa9\\x12\\xa8\\x80\\xb7\\x49\\xa6\\xf8\\x0b\\xb2\\x06\\xcc\\xaa\\x74\\x6f\\xa7\\x0c\\x83\\x3c\\x9f\\x32\\x30\\x89\\xce\\x05\\x58\\xc9\\xdc\\x20\\x0d\\x57\\x39\\xd1\\xe4\\x99\\x63\\x4f\\x2c\\x16\\xe5\\x4b\\x7f\\x6d\\x78\\x19\\xc4\\x70\\x71\\xb6\\x0b\\xd5\\x4d\\xd0\\xf2\\x73\\xa3\\x19\\x75\\x0f\\xd3\\xc5\\x10\\xa4\\x9a\\xb5\\x6f\\x63\\x0c\\x7c\\xe6\\xd8\\x02\\x3d\\x97\\x86\\x23\\x46\\x85\\x9b\\xc0\\xb4\\xd6\\x05\\x22\\x49\\x69\\x70\\x89\\x03\\x76\\x03\\x01\\x40\\x9c\\x60\\xab\\x25\\x17\\x56\\x11\\xf0\\xbe\\x98\\xb2\\x3a\\x8c\\xd8\\xac\\x53\\x5e\\x35\\x13\\xbc\\x77\\xe1\\x45\\x21\\x93\\xda\\xdf\\x44\\x35\\xe6\\x3c\\x36\\x29\\xb6\\x66\\xa5\\xea\\x4c\\x4b\\xad\\x36\\xea\\xca\\xd2\\x60\\x14\\x04\\xea\\xbd\\x8d\\x9a\\x07\\x95\\x6e\\xc2\\xb4\\xb7\\xbb\\x63\\x36\\xed\\x75\\xb8\\xdf\\x8f\\x16\\xde\\x42\\xc0\\xfc\\xae\\x93\\x65\\x2e\\x3c\\x40\\x7c\\xbd\\x45\\xe8\\xd4\\x13\\xef\\x51\\xe8\\x54\\x2d\\xf6\\x25\\x12\\xee\\x79\\x3e\\x41\\x35\\x8a\\x1d\\xe1\\x92\\x46\\xc6\\x58\\x6b\\x3c\\x14\\x07\\x41\\x04\\x21\\xf6\\xe8\\x65\\xc7\\x5a\\x9f\\x4a\\x6a\\x47\\x88\\xf8\\x4a\\x9c\\x78\\x1d\\x8f\\x80\\x24\\xbf\\xdb\\xe2\\x5b\\xdc\\x7d\\x4b\\x69\\xcb\\xaa\\x77\\x19\\x62\\x8c\\x0b\\x07\\xec\\x2c\\x4a\\x23\\x4f\\xff\\x4a\\xc3\\xd4\\x93\\x5b\\x9c\\xe4\\xc8\\xa1\\x69\\x47\\xab\\xe7\\x95\\x1f\\xf8\\xd9\\xac\\x92\\x15\\xe3\\x38\\xfa\\x0f\\xe9\\x12\\x41\\x76\\xd1\\x7b\\xac\\x1e\\x05\\x59\\x2c\\x43\\x98\\x68\\xae\\x5a\\x4f\\x75\\xfd\\x1e\\xa8\\x2a\\xa4\\x54\\xc2\\x0a\\x93\\x9d\\xed\\xa7\\x29\\xa0\\xe1\\x96\\x46\\xce\\xbd\\x82\\x20\\x49\\xc8\\x25\\xc7\\xe3\\x1c\\x6e\\xfa\\xd4\\x5e\\x30\\x6f\\x2d\\x9f\\x05\\x69\\xe0\\x71\\x73\\x31\\xf4\\x80\\x04\\xc2\\x6e\\xbf\\xe6\\x8f\\x38\\x43\\xe9\\x0f\\x80\\x67\\x03\\x2d\\x21\\xe7\\x86\\xc8\\x53\\x9e\\x01\\xbe\\x3c\\xea\\xc5\\x95\\x4a\\x05\\x46\\xc8\\x4b\\x73\\x4d\\x99\\x94\\x56\\xa7\\xc4\\x5f\\x8c\\xeb\\xaa\\x47\\x8e\\x54\\x80\\x07\\xf9\\xd3\\xaf\\x83\\x6f\\x75\\x4d\\xe4\\x12\\x3f\\x2f\"},\n{{0xe1,0xd1,0x41,0x65,0x18,0x92,0x1d,0x07,0xc8,0xc3,0x9e,0x29,0x73,0xd8,0xea,0x12,0x49,0xca,0xa8,0xbf,0x65,0x9c,0xc3,0x6c,0x79,0x37,0xf8,0x4e,0xce,0x7a,0xd4,0xfc,},{0x48,0xbd,0xcc,0x3f,0x1a,0x5b,0x80,0x58,0xed,0x9a,0x32,0xef,0x1c,0xc4,0x8c,0xf7,0xa8,0xab,0x76,0xa6,0xe4,0x51,0x9e,0x5a,0x82,0x85,0x52,0x41,0xad,0x6f,0xff,0x8a,},{0x42,0x32,0xd2,0xa4,0x81,0x08,0x4d,0x11,0x96,0xdb,0x62,0xf2,0x2d,0xc7,0x4c,0xf2,0xea,0xf2,0xdb,0x0d,0xf0,0x5a,0xd7,0xcd,0xde,0x67,0xbf,0xc2,0x9b,0xff,0x56,0xcd,0xe0,0x19,0xac,0x9f,0x03,0xd8,0x1f,0x18,0x27,0xeb,0x1e,0x3b,0x0a,0xbe,0x02,0x04,0xca,0x7f,0x77,0xfa,0x87,0x4a,0xb5,0x26,0x83,0x54,0xff,0x08,0xbb,0x7f,0x48,0x00,},\"\\x3d\\x26\\x3d\\xe1\\xab\\x91\\xe8\\xdd\\x7b\\x31\\x7f\\x7a\\x27\\xfb\\x60\\xa6\\xe1\\x83\\x8c\\x0c\\x79\\x3b\\x03\\xab\\xbe\\x70\\x82\\xb6\\xbd\\xa0\\xc7\\xc4\\x60\\x62\\x26\\x21\\x92\\xc8\\x8b\\x65\\xc0\\x26\\xc1\\x74\\x58\\x4d\\x29\\x64\\x97\\x10\\x42\\x9a\\xe4\\x4a\\x46\\x14\\x0b\\x4c\\x82\\xc8\\xa0\\xb7\\x4d\\x56\\xa0\\x04\\xf8\\xe2\\xf5\\xc1\\x8f\\x84\\xf0\\x46\\x41\\x53\\x77\\x2f\\x83\\x12\\x63\\x3f\\xc6\\xad\\x28\\xa7\\xd9\\xfb\\x55\\xf7\\xd7\\x8c\\xd6\\x48\\x8c\\xa5\\x81\\x17\\xea\\xf9\\x23\\xfa\\x28\\x87\\x5e\\x2b\\x31\\x89\\x89\\x31\\x85\\xaa\\x3c\\xcd\\x04\\x4d\\x3f\\x11\\x0e\\x2e\\x7c\\xab\\xdf\\x6f\\x81\\x4b\\x9f\\xdd\\x67\\x33\\xbd\\x5f\\x30\\x7a\\x87\\xbc\\x73\\xb6\\x25\\x0d\\x58\\x83\\x93\\x6d\\xeb\\x1d\\xb0\\xe0\\xaf\\x1b\\xe7\\xab\\x32\\x9b\\x5c\\x6b\\xd9\\x35\\xbd\\x8f\\x8d\\xc8\\x88\\xf0\\xd1\\xc4\\x64\\xed\\xbc\\x02\\x3c\\xbc\\x08\\x07\\x53\\xee\\x8f\\x79\\x9f\\x10\\x72\\xba\\xd1\\x14\\x4d\\xfa\\xa6\\x15\\xa5\\x9e\\x2a\\xed\\xc6\\x62\\xe8\\x3c\\xb1\\xf8\\xe5\\x20\\x96\\xa7\\xee\\x48\\x3b\\xf8\\x73\\xb2\\x5a\\x0c\\x04\\xc1\\x85\\x1a\\x0e\\x87\\x37\\x50\\x63\\xaa\\x1a\\x94\\xfa\\x83\\x5c\\x05\\x26\\x40\\x36\\x6b\\x79\\xf7\\x35\\xd3\\x28\\x61\\x97\\xab\\x32\\xeb\\xdb\\x51\\x23\\xf6\\xb4\\x7a\\xd3\\xf4\\x42\\xc4\\x4c\\x53\\x0a\\x68\\xf8\\x51\\x27\\x59\\xe9\\xcf\\x38\\x6f\\xba\\x07\\xb8\\x06\\x4b\\xc8\\xfe\\x83\\xe2\\x45\\x49\\x5e\\xc4\\x5f\\x89\\x38\\xf8\\x25\\x9d\\xc8\\x01\\x62\\x05\\xf7\\x8d\\x39\\x54\\x44\\x2e\\xc1\\xb4\\x45\\xd8\\x3d\\x95\\xad\\x18\\x05\\xa5\\xe0\\xe8\\xb3\\xd5\\x6b\\x87\\x0a\\x20\\xda\\x18\\xd7\\x4f\\x26\\xf5\\x50\\xa9\\xc7\\x53\\x4a\\x41\\x44\\xdc\\xbc\\x1c\\x3c\\xdb\\xbe\\x47\\x0c\\xc1\\x53\\x90\\x50\\x43\\x08\\x8f\\xac\\xf1\\xd3\\x03\\x55\\x9d\\xe4\\x1e\\x96\\xc0\\xab\\x40\\x9b\\xb3\\x6d\\xcf\\x38\\xcc\\x90\\x38\\xa6\\xa4\\x90\\x8d\\xea\\x82\\xa6\\x53\\x19\\x5c\\x16\\xf2\\x90\\xa7\\xc3\\xac\\x48\\x76\\x36\\xcc\\x5b\\xcb\\x18\\xd1\\x5a\\x14\\xac\\x62\\x4c\\x70\\xb6\\xf6\\x46\\x2b\\xf2\\x49\\xe0\\x00\\xce\\xe9\\x24\\x01\\x8b\\xdf\\x7d\\xde\\x39\\x11\\x4c\\xb4\\xf6\\x52\\xe1\\x22\\xe8\\x74\\x4d\\xa2\\x8b\\x05\\x89\\xe1\\x28\\x4d\\x70\\xd9\\xf1\\x06\\xde\\x16\\xd0\\x73\\x64\\x80\\x80\\xe6\\x43\\x7f\\xf3\\x84\\xe6\\x81\\x77\\xd5\\xcb\\x71\\x8e\\x2c\\xe3\\xf1\\x7b\\xa1\\xe9\\x90\\xae\\x3c\\xe9\\x40\\x66\\x01\\x30\\xe9\\x37\\x50\\xb8\\x2e\\x2f\\xb4\\x1a\\xa3\\x69\\x77\\x45\\x68\\xd7\\xcf\\x28\\x67\\x25\\xe3\\xc5\\x8f\\x63\\xe7\\x3f\\x86\\x97\\xae\\xec\\xc7\\x17\\xc5\\xcf\\x1a\\xf7\\xad\\x74\\xf4\\x46\\x29\\x2c\\x90\\x5d\\x84\\xe2\\x2b\\x23\\xd4\\xe0\\xd2\\x60\\x4b\\xff\\x48\\xfe\\xfc\\x40\\xc6\\x20\\x4b\\x5e\\x34\\xc0\\x42\\x29\\x2e\\x53\\xbe\\xc9\\x36\\x01\\x59\\xa5\\xcd\\x97\\xb2\\xdf\\x57\\x86\\xb8\\xf5\\xa2\\x92\\xc0\\xb3\\x9d\\x14\\xa8\\x70\\xa4\\x58\\x8e\\x67\\xbd\\x12\\xb2\\xc2\\xf7\\xa4\\x40\\x84\\x62\\x85\\x1d\\x2a\\xa7\\x87\\x97\\x1d\\x93\\x15\\x19\\x0f\\x42\\xcc\\x58\\x8a\\xf0\\xd2\\xdc\\xd9\\x1f\\x31\\xbb\\x71\\x5e\\x92\\x50\\xf1\\x19\\x28\\x14\\xf7\\xb8\\xa2\\x1f\\xef\\x45\\x17\\xb0\\xcf\\x8b\\xb8\\xa1\\xa1\\xa5\\xf5\\x00\\xee\\x21\\x9d\\xfb\\x46\\x13\\x2e\\xfe\\x8e\\x90\\xbc\\x49\\x09\\x3a\\x55\\x59\\xf9\\x68\\x1b\\x4f\\xb5\\x9e\\x5b\\xa9\\xef\\x3f\\x05\\xd3\\x4e\\xed\\x03\\x4c\\x14\\xd7\\x7e\\xe9\\x5e\\xbd\\x76\\xff\\xa5\\xaf\\x0b\\xef\\xcb\\xa1\\x8f\\xdf\\x93\\x2a\\xf4\\x85\\x45\\x10\\xb7\\x5d\\xb0\\x0a\\x72\\x57\\xb2\\x34\\x88\\x7d\\x49\\x60\\x7d\\xfd\\x16\\x18\\x0d\\xb5\\x16\\xc7\\xa2\\x0c\\xcf\\xca\\xed\\xa6\\xae\\xdf\\xb6\\xa2\\x37\\x7f\\xbf\\x31\\xe6\\x7b\\x51\\x76\\x55\\xdb\\x73\\xca\\x29\\xe1\\x18\\x62\\x4d\\x60\\x80\"},\n{{0x2b,0xf7,0x4f,0x00,0x4d,0x7d,0x0a,0xf7,0x3a,0x83,0xea,0x20,0x8c,0xc2,0x06,0x72,0x3d,0x18,0x8f,0x4c,0xf6,0x07,0xbc,0xad,0x4b,0x69,0x80,0x26,0x8f,0xf2,0x1f,0xa7,},{0x8f,0xdc,0xd9,0x93,0x52,0x43,0x8b,0xeb,0x52,0xf0,0xd1,0x74,0x2b,0xae,0x71,0x84,0x45,0x12,0xdd,0x06,0x85,0xaa,0xf1,0xc9,0x09,0xe3,0x8f,0xc4,0xb5,0xaa,0xb6,0xcc,},{0x3e,0xb5,0xb3,0x39,0xe1,0x91,0xa3,0xb6,0x16,0x85,0x45,0xda,0x5f,0xb0,0xca,0x9b,0xe2,0x09,0x04,0x39,0x19,0xb9,0xc7,0x0a,0x07,0xb4,0xa7,0xa3,0xbf,0x64,0xb1,0x02,0xf6,0xff,0xd6,0xd2,0xb0,0x25,0x59,0xdc,0x68,0x1e,0xd3,0xb9,0xc8,0x22,0x97,0xb2,0x01,0xdc,0x25,0xc4,0x97,0x38,0x80,0xe1,0x55,0xe1,0x3a,0x29,0x42,0x6e,0xb4,0x0d,},\"\\x89\\x8e\\x43\\x03\\xea\\x5b\\xeb\\xd2\\x00\\xa5\\xf7\\x56\\x2b\\xe5\\xf5\\x03\\x26\\x40\\xa3\\xf5\\xcc\\xfa\\x76\\x42\\x92\\x04\\x5a\\x1a\\x36\\x8d\\x02\\xaa\\x59\\x10\\x77\\xd8\\xf3\\x04\\xf7\\x4d\\xbd\\xfc\\x28\\x07\\x34\\x45\\x4e\\xd8\\xc2\\x72\\x7a\\xff\\x39\\x2c\\x10\\x8c\\x52\\x6e\\x52\\x7e\\x67\\x2c\\x53\\x97\\xb2\\xd7\\x7c\\x01\\xf7\\x74\\x1e\\xf8\\xdc\\xc2\\x51\\x0e\\xe8\\x41\\xb5\\x9d\\xd1\\x0f\\x4e\\x1d\\x3a\\xc5\\x01\\xaf\\x7c\\xbd\\xb8\\x5b\\xa3\\x11\\x29\\xc2\\x62\\xfd\\xe1\\xa0\\xc8\\xbc\\x83\\xd6\\xff\\x94\\x4b\\x6b\\xae\\x3f\\xa7\\xfb\\x62\\x58\\x7c\\x68\\x1d\\x8e\\x34\\x29\\x65\\xc5\\x70\\x5f\\xd1\\xa6\\xab\\x39\\xe5\\xa0\\x77\\x0e\\xe7\\x79\\x8d\\x9f\\xb6\\xc0\\x01\\x8a\\x51\\x4d\\x53\\xaf\\x84\\x8d\\xb6\\x04\\x7c\\xd0\\x2d\\xb3\\x52\\xd5\\x56\\x3b\\x53\\x66\\x23\\x73\\xb9\\x71\\x93\\x5a\\x1a\\xc2\\xb7\\xb6\\x36\\x1d\\xac\\x67\\x48\\x77\\x18\\x13\\xf7\\x74\\x93\\x16\\x69\\x49\\x61\\xb9\\x40\\xff\\x38\\x05\\x81\\x1a\\x49\\xfa\\x27\\xa9\\xba\\x45\\x7a\\xd2\\x88\\x48\\xc6\\x97\\x05\\x0e\\x01\\x88\\xd0\\x77\\x3e\\x17\\xfb\\x52\\x19\\x4e\\x19\\x0a\\x78\\x72\\xa3\\x98\\xf3\\x1c\\x0f\\x0a\\xe0\\x65\\x37\\xa2\\x73\\xff\\xb5\\x0c\\x2c\\x81\\x64\\x45\\xab\\x88\\x28\\x11\\x92\\x2c\\x06\\x21\\x55\\x6c\\x46\\xa3\\xa0\\xec\\x40\\xbf\\xed\\xb4\\x11\\xe9\\x0b\\x6d\\xb1\\xdd\\xd4\\xbb\\xeb\\xb5\\x7d\\x10\\xdf\\x56\\x6a\\x63\\xd7\\x26\\xa3\\x33\\x08\\x51\\x4c\\xe3\\xb4\\x99\\xd5\\xe5\\x26\\xc2\\x2b\\x95\\x6d\\x8b\\x99\\x91\\x3d\\xcb\\x13\\xe4\\x37\\xe9\\x47\\xb6\\x66\\xc4\\x1c\\x54\\xd8\\xb3\\xae\\x23\\x56\\x64\\x7e\\x80\\x17\\xab\\x67\\x83\\x86\\xc9\\x27\\x21\\x9a\\xe7\\xbd\\xdc\\x0d\\x82\\x12\\x65\\xf9\\xdc\\x4f\\xf3\\xf8\\xce\\x5b\\xe6\\x0f\\x8e\\x9d\\xef\\xc5\\xca\\x33\\x50\\x68\\xee\\x29\\xfe\\x83\\x04\\x91\\x7b\\x78\\x87\\x84\\xa2\\x38\\x8a\\x32\\x01\\x92\\xf9\\x32\\x5d\\x0e\\x6c\\xff\\xfe\\xa2\\x1e\\x6e\\xaa\\x29\\xe7\\x70\\x7f\\x63\\xa9\\xea\\x4f\\xbb\\x25\\x58\\xe3\\xd0\\x83\\x5b\\xab\\x1f\\x52\\x36\\x10\\x37\\xae\\x59\\xe5\\x03\\xee\\x96\\xb9\\xd7\\x08\\xa4\\x7a\\x3a\\xe4\\xba\\xd1\\x13\\xe2\\xa4\\x60\\xa2\\x69\\xcc\\xf2\\x5a\\x00\\x03\\xcb\\x3e\\x68\\xa5\\x51\\x86\\x4e\\x59\\x84\\x09\\x14\\x79\\x11\\x26\\xf9\\x54\\x78\\x8b\\x25\\xb5\\xaf\\x5a\\xaf\\x58\\x6e\\xbb\\x87\\xfa\\x5f\\x37\\x7b\\x4d\\x7d\\x7f\\x84\\xc0\\x00\\xdd\\x2c\\xb4\\x40\\xe2\\x14\\xd3\\x8d\\x5e\\xcf\\x70\\xf2\\x0e\\x98\\x81\\x82\\x8e\\xda\\xa1\\xdb\\xec\\x37\\x09\\x3d\\xb9\\x60\\x68\\x6c\\xa1\\x23\\xf1\\xec\\xba\\x63\\x36\\xb3\\x7f\\x46\\xcf\\x76\\x5b\\xe2\\x81\\x4b\\x9e\\x67\\x05\\xbc\\x9d\\x6a\\x49\\x31\\x81\\x18\\xc7\\x52\\x9b\\x37\\xc8\\x4e\\xc8\\x8d\\x58\\xa8\\x45\\x3d\\xcb\\x69\\x2c\\x9a\\x36\\x01\\x6b\\x94\\x8e\\xbe\\x6f\\xb2\\xc1\\xd0\\xad\\xf5\\xf1\\x98\\xee\\x30\\x97\\xa6\\xff\\x0b\\x8e\\xeb\\xba\\xd8\\xb0\\x76\\x93\\x30\\xb1\\x86\\x89\\x51\\x6b\\xc0\\xfe\\x66\\x8b\\x0d\\x05\\xe3\\xa5\\x84\\xfc\\xf8\\x9c\\x49\\xdb\\x50\\x1d\\x61\\xc2\\xde\\xf7\\xed\\x37\\x22\\x07\\x01\\x93\\xa5\\xb6\\x83\\xc5\\x08\\x7e\\xf2\\x74\\xce\\x6a\\x19\\x3d\\xd4\\xa3\\x03\\x53\\x6c\\x67\\x93\\x4b\\x46\\x60\\xa8\\x41\\xee\\x1b\\x44\\x6a\\x68\\x92\\xb1\\x4d\\x0b\\x0a\\xa3\\xe9\\x8f\\xdf\\xfd\\x43\\xc7\\x97\\xad\\xd3\\x65\\x83\\xf7\\x4c\\x94\\xd0\\xe2\\xd6\\x8e\\x2d\\xe8\\x18\\xd9\\xaf\\x20\\x05\\x98\\xf0\\xb2\\xbe\\xae\\x16\\x9c\\x8d\\xfb\\xc4\\xd3\\x97\\xe6\\xd1\\xce\\xb6\\xda\\xa6\\xc9\\xf6\\xbb\\xf4\\xf8\\x31\\x1b\\xa2\\x6f\\xfb\\x19\\x4d\\x44\\x21\\x6c\\x51\\x30\\x52\\x67\\x07\\x4e\\x85\\x6a\\x1d\\x6e\\x92\\x27\\x80\\xf4\\x79\\x8e\\x2f\\x22\\x02\\x23\\xff\\xf1\\xdc\\x37\\x0c\\x8e\\x34\\x51\\x4a\\xba\\x42\\xdf\\x51\"},\n{{0xf5,0xf7,0xd5,0xb7,0x3c,0x5a,0x65,0x30,0x1b,0x5b,0x4c,0x67,0x10,0xed,0x12,0xc1,0x6e,0x79,0x03,0x17,0x7d,0xb7,0x92,0xca,0x71,0x5e,0x23,0x38,0x9d,0x05,0xd8,0x3e,},{0x7c,0x47,0x62,0xe9,0x79,0xf0,0xc7,0xe2,0x07,0xbe,0x18,0x43,0xe2,0x66,0x6a,0xca,0x27,0xea,0x89,0xbf,0xf5,0xb6,0x1d,0x57,0x3c,0x98,0x5f,0xc7,0x02,0x5e,0x1e,0x28,},{0x58,0xfb,0x39,0x2f,0x82,0xd5,0xe5,0x2f,0xf0,0x72,0xcc,0x77,0xef,0xe0,0x48,0xf2,0x23,0x52,0x50,0xc7,0x11,0x25,0xee,0x82,0x1c,0x5f,0x3b,0x39,0x3b,0xcf,0x2f,0xa4,0x6b,0xe4,0xc5,0xd8,0xca,0xf1,0x3c,0xb5,0x19,0xef,0xe0,0xc2,0xfa,0xd9,0xee,0x23,0x1a,0xe9,0xb6,0xfd,0x1f,0xd5,0x09,0xc9,0x8c,0x69,0xc2,0xd3,0x6c,0x75,0x3e,0x0e,},\"\\x7c\\x93\\x18\\xd5\\x6e\\x63\\xf1\\x65\\x35\\x43\\x6f\\xa4\\x5a\\xfe\\x27\\x8e\\x74\\xe6\\x18\\x81\\xbb\\x46\\x89\\x97\\xd0\\x41\\x8b\\xc7\\x20\\xb6\\x30\\xda\\xdb\\x81\\x28\\xb4\\xb6\\x5c\\xa6\\xe9\\x21\\xe5\\x01\\x81\\x3d\\xf9\\xfe\\x03\\xb4\\xef\\x0a\\xae\\x80\\x35\\xdd\\x08\\xc5\\xf8\\x20\\xce\\x5d\\xf1\\x2e\\xe1\\x18\\xd9\\xc3\\x6d\\x3b\\x15\\x1a\\x52\\xc3\\xf9\\x6a\\xe1\\xca\\x4c\\x82\\xfd\\x19\\xda\\x66\\x9d\\xdb\\xa9\\x4f\\xeb\\xf8\\xea\\xc8\\xc4\\x2b\\x44\\x7b\\xab\\xc8\\xa6\\x0b\\x36\\xe8\\x03\\x62\\x4f\\x7d\\x20\\x47\\xbd\\x8d\\x8a\\x15\\x36\\x87\\xf1\\x0d\\xc1\\xca\\x82\\x10\\x0b\\x7c\\x87\\xd3\\x23\\x70\\xec\\x8f\\x26\\x71\\xed\\x7d\\x06\\x7c\\xc8\\x05\\x87\\xca\\xb8\\xdb\\x3a\\x71\\xce\\x5e\\x40\\x63\\x27\\xf7\\x63\\xec\\x1b\\x3c\\x16\\x67\\x70\\xa7\\x55\\x36\\x63\\x0c\\x81\\x5f\\xd8\\x26\\x75\\x82\\xd1\\xb5\\x05\\x1f\\x0f\\x82\\x1c\\x02\\x15\\x0b\\x2e\\xef\\x34\\x9b\\x50\\x59\\x03\\x14\\xaa\\x25\\x70\\x79\\x3f\\xa6\\x4a\\x76\\xed\\x2e\\xd8\\x3d\\x2b\\xa1\\xf9\\xb9\\xf1\\x16\\x31\\x54\\x61\\x2b\\x49\\xa6\\x4a\\xd8\\xd5\\x57\\x3c\\x25\\xb1\\xcd\\x37\\xc4\\x1a\\x44\\xe3\\xdf\\x78\\xf1\\x05\\x3d\\x90\\xb0\\x68\\xf0\\xd3\\x7a\\xe0\\x0c\\x4a\\x32\\xb1\\xa3\\xff\\x87\\x4c\\x41\\xda\\x4a\\x70\\x43\\x39\\x2f\\x18\\xef\\xe5\\x51\\x8d\\x76\\xe8\\x8b\\x41\\xce\\xd6\\x9e\\x6f\\x4c\\x01\\x4f\\x06\\xeb\\xc5\\x14\\x6e\\x61\\xe8\\x2f\\xae\\x1c\\x49\\xc3\\x7c\\x39\\x4f\\xea\\x34\\x19\\x9a\\xb8\\x6c\\x11\\xa4\\x46\\x7a\\x37\\x4e\\x40\\x25\\x5a\\x05\\xd4\\x26\\x97\\x14\\x30\\xd5\\x6c\\xdb\\xa2\\x5a\\x21\\xad\\x77\\x9c\\xc7\\xf6\\x2d\\x22\\xcd\\x87\\xb6\\x0f\\x08\\x91\\xbd\\x85\\x6a\\x51\\x7e\\x14\\xb7\\x2a\\x9a\\xc7\\x67\\x2e\\x4e\\x8f\\xb3\\x74\\xa9\\x75\\x8a\\xb0\\xc4\\xe5\\x96\\x4a\\xae\\x03\\x22\\x89\\x73\\xf1\\x73\\xa5\\xd4\\x2a\\xef\\x9d\\xb3\\x37\\x36\\xc3\\xe1\\x8d\\x8e\\xec\\x20\\x4a\\x1a\\x17\\xb9\\xd0\\x45\\x93\\xde\\xa4\\xd8\\x04\\xcb\\xc8\\x1b\\x9a\\xc5\\x45\\x80\\x50\\x49\\x55\\x39\\x99\\x9a\\x99\\x85\\x48\\x7e\\x7c\\xa1\\x1c\\x37\\x58\\x2e\\xf8\\x5c\\x84\\x1e\\x8f\\x06\\x5e\\xa9\\x8f\\xdd\\x6b\\x1c\\x60\\xde\\xa1\\xec\\x28\\x83\\x52\\x15\\x68\\x85\\x6a\\x6e\\xbb\\x27\\x49\\xf2\\x07\\x2e\\xb4\\x34\\x48\\xbe\\x07\\x05\\xed\\x47\\x7c\\xf4\\xb2\\x00\\x48\\x65\\x21\\x7d\\xe5\\xfa\\xdb\\xe2\\xa0\\xf9\\xd6\\xb8\\x4b\\x3f\\xe7\\xf7\\xbf\\x6c\\x77\\x53\\x74\\x96\\x24\\x6e\\xc7\\x96\\xb8\\xef\\x2c\\x04\\xf6\\x8a\\xb5\\xb1\\x4f\\xce\\x0c\\x6d\\x28\\x7b\\x83\\x62\\x27\\xd9\\xf0\\x8f\\xa0\\xee\\x19\\x72\\x2f\\x67\\x98\\xa5\\xd8\\x28\\x0d\\x10\\x7c\\xfc\\x1b\\xd5\\x92\\xd9\\xdd\\xc7\\x24\\xea\\x86\\xfc\\x39\\xdc\\x94\\xa3\\x94\\x01\\x9e\\x3a\\x3d\\xe9\\xe0\\xd1\\xc7\\x35\\xe8\\x62\\xde\\x2b\\xb9\\x52\\x5b\\x5f\\xb4\\xbd\\x12\\x12\\x12\\xbf\\xaf\\xf9\\xff\\x58\\x6a\\xc3\\xc7\\x5c\\x5a\\xce\\x74\\x6d\\x9c\\xa3\\x07\\xf7\\x95\\xff\\x26\\x97\\xf2\\xb4\\x1a\\x63\\x46\\xed\\x23\\x39\\x7e\\xb3\\x88\\x98\\x69\\x1e\\x6f\\x66\\x84\\x16\\x37\\xd0\\xab\\x0d\\x96\\x83\\x09\\xe0\\x19\\x40\\x02\\x30\\x90\\x15\\x41\\x6e\\x74\\x47\\x2f\\xe3\\x24\\x25\\xd4\\x5f\\x07\\xc7\\x71\\x19\\x18\\xb1\\xe5\\x79\\x0f\\x57\\x2c\\xe4\\x44\\x10\\x42\\xd4\\x26\\x03\\x37\\x92\\x29\\x7b\\x5f\\x81\\xe0\\x80\\x9b\\xd9\\x69\\x1f\\x0a\\x50\\x5e\\x32\\x59\\xfc\\x03\\xc9\\xff\\x10\\x7e\\xb9\\xb4\\x87\\x95\\xf4\\x9f\\xb0\\x9c\\x1b\\xab\\x56\\x59\\xd3\\x9f\\xfe\\xcb\\xdc\\xc4\\x03\\xe3\\x80\\x3d\\xc0\\x12\\x43\\x8c\\x2f\\xb3\\x6f\\x68\\x30\\x15\\xc5\\xdf\\x04\\x82\\xcb\\x7d\\x7f\\xc5\\x75\\x73\\x64\\xa0\\xa3\\xc1\\x0d\\x0e\\x12\\x59\\xc0\\x1f\\xcc\\x4d\\xd5\\x49\\x4b\\x52\\x90\\xa6\\x94\\xae\\xa3\\xf6\\xfa\\xe5\\x47\\xac\\x57\\x6f\"},\n{{0x43,0xd4,0xbe,0x6d,0xe9,0xcb,0x00,0x89,0x8e,0x99,0xdd,0xcc,0x2e,0x15,0x30,0x11,0x0f,0xa2,0xcb,0xc4,0x37,0x6c,0x48,0x5e,0x9c,0xa5,0x7f,0xd6,0x55,0x86,0xd8,0xa3,},{0x36,0x32,0xad,0x38,0x9b,0xe2,0xfa,0xb3,0xfb,0xa0,0xd8,0x04,0xbf,0x63,0x45,0xcd,0x32,0x2e,0xdd,0xd6,0xa7,0x5d,0x8c,0x37,0xfd,0x4b,0x5b,0xa1,0xc9,0xc2,0x5e,0x8f,},{0x86,0xae,0x93,0x25,0xf8,0x0b,0x98,0x86,0xc8,0x38,0x1f,0x96,0xa1,0x8c,0x21,0x20,0xe6,0xdb,0x01,0x6a,0x0d,0x6c,0xa2,0x82,0xed,0x93,0xba,0x9b,0x61,0xca,0xec,0x02,0xde,0x88,0xef,0xca,0x8b,0x8e,0x91,0x6a,0x4b,0x16,0xa5,0x85,0x25,0xa2,0xf6,0x8d,0x21,0xe5,0xfb,0xe6,0x7d,0xb4,0xc4,0xd6,0x20,0x95,0x95,0xc4,0xab,0xc3,0x2b,0x09,},\"\\xd9\\xd5\\x5d\\xab\\x0f\\xa6\\xda\\x76\\xb6\\x8e\\x84\\x1c\\x24\\xd9\\x71\\xba\\xc1\\xf7\\x9a\\xf5\\x13\\xd8\\x34\\xe4\\x26\\xa5\\xd0\\x81\\x14\\xce\\x8b\\x54\\xce\\x8b\\x7a\\xfe\\x01\\x6b\\x0f\\xad\\x03\\xee\\x74\\x50\\xc6\\xc3\\x09\\x71\\x73\\x68\\x1a\\x4b\\x2e\\xb9\\xf9\\xc1\\x79\\xa8\\x8e\\x7c\\xc3\\x68\\x13\\xf2\\xf5\\xd1\\x5f\\x79\\x98\\xaf\\xa9\\xfd\\x4e\\x54\\x6c\\x73\\xbb\\x42\\xe7\\xf9\\x52\\x2b\\xe6\\xaf\\xab\\xca\\x8c\\x7b\\x64\\xfe\\xd0\\xe2\\x92\\xe4\\x37\\x5f\\x3e\\x1e\\x5f\\xd9\\xfc\\xb5\\x39\\xf4\\xe5\\xe5\\x43\\xfb\\x6a\\x11\\xa0\\xdf\\x32\\x1e\\x70\\x08\\x4a\\xaa\\xbb\\x70\\xa9\\x95\\x0c\\xee\\xe3\\xd8\\x79\\xc3\\x86\\xef\\xca\\x1e\\x59\\xc3\\xcb\\x7c\\x45\\xb5\\x60\\x09\\x5e\\x7a\\xf0\\x0f\\xf5\\x2f\\x8a\\x1a\\xaa\\x9c\\xcf\\x09\\x2f\\x0b\\xb8\\x06\\xd9\\x76\\x10\\x74\\x2a\\xc5\\x82\\xa3\\xab\\xbe\\xdd\\xf3\\x9f\\x49\\xd2\\x29\\xd3\\x2a\\x11\\x86\\xd0\\x21\\x51\\x8d\\x74\\x72\\x8d\\x13\\xd9\\x62\\x63\\x5d\\x63\\xba\\xa6\\x74\\x3b\\x12\\x6b\\xf4\\x58\\xfa\\x2a\\xc7\\x56\\xfb\\xf8\\x80\\x96\\xc8\\xd3\\x34\\x0c\\x62\\x23\\x90\\x53\\x4a\\x74\\x3f\\x18\\x64\\xd5\\x4d\\xea\\xb5\\xe5\\x53\\x63\\x72\\xce\\x5a\\xc9\\x37\\x62\\x28\\x74\\x14\\xea\\xe1\\x58\\xa7\\x6b\\xf8\\x1d\\xf5\\x41\\x7c\\xf4\\xc0\\x47\\xbe\\x3a\\xc1\\x47\\x5c\\x51\\x7e\\xbd\\x3a\\xc1\\xd1\\xd1\\xbd\\xda\\x11\\xb3\\xf9\\x9c\\x18\\x17\\x3e\\x03\\x0a\\xcd\\x51\\xd2\\xb5\\xcf\\x79\\x51\\x65\\x09\\x41\\x54\\x05\\x07\\x75\\x11\\xbd\\xd9\\xcb\\xe1\\x7d\\x04\\xf4\\x78\\x05\\xe9\\x8d\\x0d\\x14\\x5e\\x60\\xa5\\xd0\\xe0\\xf4\\x53\\xcd\\x9b\\x5c\\x1a\\x24\\xf1\\x2b\\x75\\xe8\\xcc\\x34\\xd5\\xe0\\x06\\x91\\xff\\xac\\xbf\\xf7\\x88\\xfe\\xa8\\x34\\xd9\\xd7\\x79\\xc1\\xe6\\x10\\x29\\x4d\\xce\\x19\\x17\\x0d\\x28\\x16\\x0c\\xff\\x90\\x9b\\xea\\x5a\\x0a\\xa7\\x49\\x40\\x17\\x40\\xea\\x3a\\xf5\\x1e\\x48\\xb2\\x7c\\x2b\\x09\\xf0\\x25\\x44\\x42\\x76\\xc1\\x88\\xc0\\x67\\x1a\\x6d\\xa9\\x4b\\x43\\xd1\\xe5\\x25\\xe6\\xa4\\xa8\\xa1\\xa7\\x3d\\xfe\\xdf\\x12\\x40\\x18\\x46\\xba\\x43\\x06\\x8a\\x04\\x09\\x2b\\x12\\x91\\x22\\x70\\xd2\\xb6\\x0d\\xf6\\x09\\x97\\x79\\x75\\x6b\\x8b\\xbb\\x49\\xec\\xe8\\x2d\\x55\\xf0\\xf8\\xdb\\x1b\\x80\\xfb\\x4b\\x59\\xbb\\xa8\\x60\\xbd\\x18\\xc7\\x5d\\x6c\\x83\\x4d\\x69\\x44\\x2a\\xe0\\x31\\x4c\\xf2\\x39\\x9f\\x53\\x92\\xa3\\xc6\\x72\\x8c\\x63\\xe5\\xc5\\x16\\xc4\\x22\\x2a\\xac\\x60\\xf9\\x16\\xdd\\x63\\xd1\\xd0\\x51\\x7e\\x8e\\xb1\\x0b\\xd0\\xe1\\x5e\\xb9\\x06\\x14\\xde\\xb2\\x96\\x40\\x3a\\xd1\\x5b\\x8c\\x12\\xb9\\xe9\\x71\\xef\\x2f\\x01\\xe5\\x9f\\xc3\\x5d\\x90\\xc5\\x5a\\x8e\\x20\\xe9\\x43\\x7d\\xd4\\x34\\xb2\\x6d\\x5c\\x2c\\x6e\\xc2\\xd5\\x3a\\xce\\xc1\\x7e\\x81\\xe4\\x78\\x31\\xdc\\x2d\\xe8\\x21\\x83\\xd7\\x13\\xb5\\x9a\\x4d\\x1f\\x46\\x96\\x9d\\xdc\\xdd\\xaf\\x27\\xf4\\x4e\\x5a\\x31\\x1a\\xaa\\xc3\\x9c\\x3d\\x5a\\x97\\xbc\\x90\\xca\\xd7\\x12\\xf4\\x6f\\x85\\xe6\\xc8\\xfb\\xf5\\xd5\\x8d\\x8b\\xc3\\xec\\x27\\xd3\\x10\\xa9\\xea\\xf2\\xc3\\x69\\xcb\\x00\\x64\\x97\\x70\\x39\\x0a\\x3f\\x98\\x8f\\x36\\x2e\\xfc\\x15\\x5f\\x56\\xa1\\x46\\xa6\\x26\\x50\\x54\\x7e\\x91\\x53\\x25\\x07\\x01\\xee\\xad\\x1b\\xd0\\x1c\\x89\\x46\\x22\\x72\\xdf\\xaf\\x0a\\x43\\x1a\\xf4\\xbd\\x7c\\x3d\\xb4\\x51\\xad\\xa6\\x03\\x23\\x3f\\xda\\xd3\\xaa\\x89\\x99\\xaa\\x21\\xe2\\xd3\\xa4\\x3b\\x0b\\x56\\xfc\\x6a\\x91\\x24\\xd3\\x35\\x98\\xb3\\x73\\x7f\\x4e\\x5c\\xb2\\x58\\xbe\\xda\\x75\\x6a\\xd2\\xe1\\x7d\\x06\\x91\\xd1\\x5d\\x41\\x6b\\xb7\\xcb\\x07\\xec\\x8d\\x8c\\x7a\\xf5\\xde\\x80\\xe5\\xb9\\x39\\x4e\\x32\\x0c\\x4c\\x6e\\x43\\xef\\xaa\\xe6\\x84\\xad\\x00\\xf6\\xdd\\x20\\xa8\\x75\\x0e\\x95\\x9c\\x2f\\x04\\x20\\x6f\\xc0\\x23\\xaa\\x19\\x0c\"},\n{{0x7d,0x01,0x0d,0x76,0x0f,0x24,0xe5,0xa2,0xde,0x34,0x08,0x9c,0x9f,0xdb,0x19,0xc3,0x3b,0x15,0x5b,0x0a,0x37,0xca,0x45,0x5a,0x5e,0x5b,0x1d,0xae,0x7a,0x07,0x31,0x76,},{0x4c,0x87,0x7b,0x3c,0x49,0x71,0xfb,0xb5,0x51,0x16,0x6e,0x21,0x4d,0x1c,0x76,0x24,0xc5,0x22,0x77,0x90,0x3c,0x59,0xa5,0x62,0xa8,0x0b,0x91,0xa8,0x54,0x83,0xfb,0x47,},{0x55,0x70,0x61,0x38,0x79,0xae,0x22,0x77,0x8b,0xd5,0x4f,0x14,0xfb,0x6e,0x8c,0x02,0x56,0xa7,0x1f,0x3d,0x79,0xc3,0xe5,0xcd,0x8e,0x41,0xae,0xa8,0xcf,0x77,0x3e,0x24,0xd2,0x9f,0x1f,0x1b,0x24,0xf8,0xc8,0x0d,0x29,0x49,0xe8,0x20,0x14,0x65,0xdb,0xde,0x89,0x40,0xb1,0xfa,0xb6,0x48,0x3b,0x08,0x5d,0x41,0x8e,0x25,0x10,0x14,0x20,0x0c,},\"\\x86\\xe2\\x11\\x55\\x72\\xbf\\x4c\\x01\\x3e\\x6b\\x4b\\x04\\xd0\\xb0\\x3e\\x60\\x6e\\xe7\\x0d\\x92\\x9c\\xb8\\xec\\x36\\xf4\\xe2\\xf3\\x55\\xdb\\x3b\\x5e\\x15\\x73\\xd6\\x58\\xd1\\x7b\\xb1\\xa3\\x10\\xc1\\x69\\x89\\xa1\\x6b\\x95\\x58\\x92\\x2e\\xe4\\x93\\xf3\\x59\\x04\\x21\\x03\\xc4\\xdc\\x1b\\x40\\xdf\\xf7\\x70\\x99\\x01\\xfd\\x58\\x30\\x13\\x3f\\x42\\xc4\\x65\\x1e\\xca\\x00\\x8b\\x49\\x9e\\xe4\\xf8\\x4c\\xd4\\xec\\x1e\\xda\\xa7\\x82\\x56\\xed\\xb6\\x2f\\x24\\x02\\x1a\\x00\\x76\\x25\\x69\\x19\\xe4\\xe2\\xce\\x0a\\x5a\\x20\\xf9\\x21\\xc2\\x78\\xcc\\x29\\x91\\x59\\x64\\x4b\\x5e\\x3a\\x3b\\xbd\\x08\\x9d\\xcb\\xbe\\xba\\xd3\\x76\\x6a\\xea\\x77\\xe9\\xf0\\x8e\\xe5\\xf7\\xd4\\xc1\\x9d\\x81\\x70\\xbc\\x3d\\xe1\\xba\\x77\\x9a\\x76\\x99\\x14\\xf9\\x65\\xdb\\xde\\x2b\\x61\\xba\\xd2\\x14\\xc5\\x08\\x18\\x60\\x41\\xf7\\x6c\\x25\\xbe\\x95\\x76\\x56\\xf5\\xcf\\xb7\\x33\\x4e\\xb8\\x38\\xa3\\xcf\\xbc\\x55\\xcf\\xba\\xb6\\x7a\\xdf\\x15\\x52\\x61\\x99\\x41\\xb8\\x35\\xcd\\x3e\\x34\\x10\\x3b\\x18\\xb4\\x91\\x31\\xe8\\x20\\x96\\xf0\\x5f\\x57\\x0b\\x89\\x98\\x04\\xba\\xb8\\xb6\\xcb\\xad\\xdb\\xbc\\x02\\xf9\\xf3\\xb5\\x59\\x73\\x6d\\x99\\xca\\x7b\\x02\\xd3\\x26\\x8f\\xa2\\x73\\x99\\x6f\\xcf\\x05\\x71\\x97\\x7d\\x1c\\xc3\\x00\\x8c\\x4e\\xf8\\x48\\x97\\x0e\\xe3\\x50\\xb1\\x58\\xc4\\x7e\\xc2\\x77\\xad\\xd4\\x74\\x2f\\xa2\\xbc\\xbe\\xa9\\xbd\\x55\\x49\\xc7\\xbc\\xa0\\x38\\x02\\x0e\\xce\\x68\\xf1\\x88\\xc1\\xea\\x3a\\x62\\xdd\\x9a\\x07\\x3d\\x4c\\x13\\x8c\\xa8\\xa9\\xac\\x04\\x08\\xdc\\xfd\\x46\\xe3\\x6b\\xdf\\xf7\\x39\\x88\\xa5\\x8b\\x96\\x17\\xca\\xa0\\x8b\\xd4\\x1b\\xf3\\xe8\\x12\\xe7\\x82\\x4f\\x0f\\x7e\\x81\\x46\\xa4\\x44\\xf3\\x6b\\xf5\\x3a\\x1c\\xd8\\x92\\x03\\x9c\\xcd\\x33\\x5f\\x5a\\x2e\\x79\\x74\\x5e\\xac\\x96\\x14\\x8c\\x2a\\x29\\x99\\x47\\xf1\\xb2\\xe3\\x28\\xa3\\x78\\x9b\\xf1\\x3c\\x6d\\x73\\x50\\x6f\\x3b\\xdc\\x68\\xea\\x48\\xab\\xf0\\x02\\x27\\x0f\\xe4\\xee\\x9e\\xf9\\xed\\x6b\\x10\\xc2\\xfb\\xb4\\xff\\x12\\x75\\xb9\\xd7\\xdd\\x35\\xd8\\xa5\\x2e\\x37\\x17\\x58\\x57\\x4c\\xb4\\x66\\xc5\\x7b\\x5a\\xbc\\x24\\x29\\x76\\xbe\\xfc\\x8d\\x98\\xa0\\x13\\x1b\\x9b\\xb8\\x46\\xb2\\x19\\xe4\\x66\\x91\\x86\\xa8\\x3c\\x05\\x6c\\xd8\\x08\\x06\\x61\\xde\\x16\\xb5\\x1c\\xe5\\x76\\x7b\\x22\\xe9\\xa9\\x32\\x42\\xbf\\x8d\\x32\\x05\\xc6\\x6a\\x67\\x3c\\xe7\\x83\\xd1\\xc0\\xd3\\x7b\\x63\\x00\\xfb\\xf0\\xd6\\x12\\x79\\x40\\xf8\\x8f\\x18\\x19\\xc4\\x50\\xdc\\xc9\\x05\\x43\\xed\\x79\\x4f\\x1f\\xd4\\x4e\\x65\\x39\\xfe\\xba\\xf1\\x9a\\x4c\\xc9\\x88\\x70\\x01\\x4d\\x7c\\xca\\xd7\\x4d\\x18\\x76\\xa1\\x23\\xec\\xd1\\x45\\x51\\x6c\\x74\\x3b\\x4b\\xba\\x62\\xd8\\x21\\xca\\x9a\\x79\\x51\\xe0\\xdf\\xb2\\x3f\\x38\\xd9\\xe3\\xa3\\x65\\xfd\\x83\\x22\\xf2\\xee\\x47\\x99\\xe9\\xff\\x11\\xe1\\xc5\\xc3\\x0b\\x55\\xa3\\x55\\xc8\\xa5\\xde\\xea\\x81\\xa5\\x45\\xe3\\x47\\x05\\xab\\x56\\xd1\\x7b\\x1f\\xa0\\x6e\\xd7\\x64\\x15\\x55\\x67\\x02\\xf3\\x64\\x80\\x82\\x46\\xf8\\x63\\xc3\\x19\\xf7\\x5c\\xdf\\x6b\\xd7\\x48\\x43\\x8d\\x1a\\x2e\\xaf\\x42\\x06\\xc5\\x60\\xbf\\xaf\\xc2\\x35\\x67\\x9a\\xd6\\x04\\x9c\\x1a\\x01\\x52\\x6f\\xcb\\x9a\\x3c\\xe1\\xb1\\xd3\\x9b\\xe4\\xdf\\x18\\xb1\\x5f\\xa0\\xea\\x55\\x27\\x2b\\x17\\xeb\\xde\\xdf\\x6c\\x30\\x49\\x8a\\x8a\\x14\\xf2\\x04\\x2b\\xe1\\xc2\\xcd\\xb0\\x9e\\x9e\\xf3\\x84\\x6d\\x66\\x59\\xa9\\xf6\\xd6\\x73\\xdf\\x9a\\xfb\\x7e\\xde\\xd0\\x4b\\x79\\x3d\\x97\\x31\\xf0\\xac\\xcc\\x41\\x46\\x8d\\xc1\\xf3\\x23\\x6c\\x99\\xac\\xad\\xee\\x62\\x39\\xc3\\x61\\xb8\\xbd\\x7e\\x2d\\x0c\\xfe\\x8b\\xb7\\xc0\\x66\\x87\\xe0\\x8e\\x76\\xb7\\x1a\\xd5\\x7a\\x03\\x61\\x79\\xf2\\x91\\xd0\\x96\\xae\\x2f\\xa0\\x81\\x8e\\xf4\\xbf\\x48\\x66\"},\n{{0xaa,0xaa,0xbb,0x7c,0xe4,0xff,0xfe,0x4d,0xc3,0x57,0x47,0xba,0xea,0x2b,0xc5,0xf0,0x50,0xbe,0xf0,0x6e,0xe0,0xc1,0xfd,0x63,0x2a,0x06,0x7f,0xec,0xe1,0xef,0x4f,0xb5,},{0x82,0x0a,0x24,0x42,0xd5,0xf4,0x5f,0x3c,0x79,0x14,0x78,0xe0,0x98,0xfb,0x3b,0x06,0x8d,0xa5,0x2e,0xc4,0xe8,0xda,0xde,0xc8,0x50,0x65,0xc3,0x56,0x59,0xf4,0x37,0xe0,},{0x05,0x0a,0xe8,0xae,0xce,0xec,0x96,0x27,0xb8,0x01,0x37,0x35,0x7a,0x22,0x96,0x2a,0xc8,0xb4,0x50,0x48,0x66,0x17,0x08,0xd3,0x94,0xd0,0xa5,0x1a,0xad,0xc3,0x81,0xfe,0x85,0x35,0x02,0x3d,0x6e,0x1b,0xda,0x0e,0x72,0xb3,0x49,0xb5,0x0b,0x26,0xda,0x7c,0x3a,0x30,0x85,0xe8,0x1e,0x9d,0xd6,0xcf,0x12,0x78,0x68,0xfc,0x5b,0xae,0xab,0x01,},\"\\xf9\\xd2\\x85\\x97\\xa3\\xe2\\xb6\\x4b\\xa3\\x27\\xac\\x5c\\xd2\\x9f\\x08\\x1e\\x74\\xbf\\x46\\x1b\\x2e\\xb2\\xd3\\xcf\\xd9\\xd5\\xe9\\x21\\x58\\xd2\\x1d\\x1d\\x2a\\x47\\xab\\x50\\x98\\x1c\\xb1\\x9f\\xe3\\xf8\\xc6\\xfe\\x48\\x82\\x49\\xb1\\xc4\\x9f\\xb8\\x97\\xa0\\xfe\\x21\\xab\\x54\\x04\\x41\\x4f\\xd9\\x14\\x87\\x5c\\x22\\x0f\\x1c\\xbc\\x12\\xf5\\xc3\\x8c\\xfb\\xa7\\x9f\\x7a\\xc3\\x03\\xa5\\x23\\x1a\\x37\\x2b\\x02\\xfa\\xd6\\xc8\\x46\\x2f\\x8c\\xc4\\x9f\\x0f\\x64\\x96\\x5b\\x65\\x1d\\xcc\\xef\\x0b\\xb9\\x60\\x82\\x15\\x09\\x08\\x49\\x17\\x7b\\xe4\\x7b\\x2d\\x30\\x72\\x94\\x4d\\x36\\xe8\\x56\\xda\\x18\\x5c\\x7b\\x3a\\x68\\x9f\\x7e\\xde\\xf9\\x88\\x33\\x8e\\x09\\x63\\xed\\x31\\xa6\\xb0\\xa8\\x0d\\x5c\\xb0\\xb1\\xcc\\xcf\\x6f\\x39\\x48\\x37\\xaa\\x6f\\x8b\\x2f\\x3d\\xa5\\xef\\xbd\\xf4\\xd3\\x60\\xd4\\xbf\\x4d\\xd7\\x08\\xce\\x64\\x45\\x58\\x7d\\x94\\x2b\\x79\\x76\\x1c\\xe9\\x51\\xb1\\xbb\\x4d\\x90\\x50\\x70\\x36\\x18\\xa6\\xd9\\x30\\xa8\\x0c\\x69\\x57\\x6f\\xc4\\xaf\\x30\\x6a\\x2a\\x56\\xdb\\xd8\\x84\\xa0\\x5a\\x1e\\x4e\\x9f\\x31\\x36\\xcd\\x0b\\x55\\xae\\x47\\x4b\\xb5\\xd3\\xd0\\xfb\\xc9\\xb0\\x33\\x9c\\xec\\x34\\x4f\\xdd\\x08\\x5c\\x19\\x28\\x10\\x14\\x81\\xc6\\x87\\x94\\xf5\\xc8\\x90\\x13\\x71\\x08\\xce\\xa7\\x91\\xd2\\x1f\\x81\\x68\\x3d\\x3e\\x1a\\x9e\\xec\\x66\\xac\\xe5\\xc0\\x14\\xd8\\x9e\\x69\\x80\\x8e\\x5f\\xa8\\x3d\\x38\\x12\\xee\\x68\\x0f\\x5a\\x99\\x71\\x68\\x1b\\x8a\\xdc\\xd4\\xa1\\x6e\\x9a\\x4c\\x16\\x5b\\x5e\\xf9\\x93\\x2c\\x5e\\xd8\\x25\\x23\\x7f\\xd5\\x03\\x7b\\xcb\\xef\\xe4\\xcb\\x11\\x56\\x4f\\xa7\\x07\\xc8\\xa9\\x32\\x90\\x75\\x14\\x14\\x89\\x1b\\x1e\\xdd\\x33\\x13\\xc6\\x5f\\x8b\\x91\\xc2\\xe9\\x25\\xa3\\xc1\\x2a\\x9d\\x3a\\xa4\\x5f\\xd5\\xa6\\x67\\xb7\\x83\\x93\\xc3\\xe3\\x9d\\xf8\\x8a\\x8f\\x0d\\x11\\x48\\xb5\\x31\\x1e\\x3d\\x87\\xc4\\xa9\\x2e\\x0a\\x3f\\xb9\\x15\\xbc\\x90\\xd5\\x55\\x8d\\x05\\xb4\\x75\\xa8\\x83\\x47\\x78\\xaa\\x94\\x3e\\xa3\\x9b\\x8e\\xaa\\x95\\xad\\x18\\x32\\xe5\\x91\\x6e\\xa3\\x10\\x2d\\x7d\\xe0\\xb8\\x36\\xcd\\xe8\\xf3\\x75\\x9d\\xbb\\x3b\\x9d\\x56\\xea\\x81\\x7b\\x3e\\x49\\xc9\\x83\\x21\\x02\\x77\\xc2\\xc7\\xc5\\xb0\\xdb\\x18\\x74\\x22\\x53\\x2f\\xca\\x98\\xa2\\x8b\\x3b\\x65\\x9c\\x6b\\x81\\x5a\\xc1\\x26\\xfa\\xdb\\xe2\\xf4\\x00\\xc7\\x3e\\x9d\\x2d\\xed\\xcb\\xbd\\x2d\\x3a\\x36\\x5f\\xfa\\xd7\\xe6\\x66\\xc8\\x96\\xe3\\x1e\\x61\\xb3\\x84\\xed\\x3a\\x9f\\xcf\\x12\\x90\\x53\\x8d\\xf1\\x1b\\x94\\x74\\xc6\\x28\\x1c\\xc5\\x92\\xc7\\x1c\\x88\\x08\\x86\\x8b\\x42\\x92\\xc1\\x7e\\xce\\x6b\\x3e\\xdf\\x5e\\x35\\x42\\xa7\\x0b\\x91\\x15\\x93\\xe9\\x3f\\x35\\xec\\xd9\\x72\\x9b\\xd8\\x88\\x0a\\x24\\xea\\xf4\\x1f\\xbc\\x65\\x74\\xdf\\xe1\\x67\\xec\\x2d\\x0e\\x7a\\xb3\\xdf\\x5e\\xc3\\x4b\\x8b\\x55\\xd5\\x48\\xab\\x93\\x73\\x8a\\x2e\\xea\\xf2\\x1c\\x88\\x4c\\x5c\\x85\\x51\\xdb\\x2e\\xdf\\x2b\\x04\\x9f\\x1a\\x2a\\x84\\xfa\\x72\\xac\\x89\\x78\\xa4\\xc2\\x78\\x09\\xf2\\x09\\xc1\\xb2\\x19\\x5a\\xff\\x50\\x4f\\x69\\x98\\x56\\xcc\\x4f\\x22\\xd4\\x4e\\xbd\\xd0\\xfe\\x50\\x37\\x44\\x68\\xd0\\xb1\\x79\\x2e\\x57\\x4b\\x51\\x10\\xa1\\xf4\\xcd\\x0e\\x22\\x1e\\x82\\x4a\\x78\\xdd\\xc4\\x84\\x5f\\xeb\\x46\\xd6\\x6d\\x63\\x3d\\x23\\xcd\\x23\\xf4\\xb6\\xfb\\xe4\\xc8\\xce\\x16\\xcd\\x1a\\xf6\\x15\\x36\\xda\\x5f\\xa6\\x7b\\x10\\xac\\x75\\x55\\xa6\\x8c\\x0e\\x0b\\xdb\\xf2\\xf8\\xd7\\x23\\x09\\xd9\\x95\\x51\\x6b\\x81\\x18\\xbf\\x43\\x83\\x5d\\x0a\\x01\\xc0\\x8f\\xfe\\xba\\x3e\\xa3\\xed\\x05\\xcd\\x2d\\x54\\xf0\\xea\\xbc\\xda\\x05\\xd0\\x03\\x7d\\x52\\xca\\xed\\x3b\\x19\\x37\\x4f\\xaf\\x73\\x99\\x90\\x94\\xf7\\x90\\x55\\x92\\x4b\\xea\\x9a\\xec\\x44\\x70\\x13\\x5f\\x5e\\x8b\\xf1\\x83\\xc9\\xd1\\xc9\"},\n{{0xe9,0x5c,0xc2,0xa4,0xd1,0x19,0x3b,0x75,0x39,0xfc,0xbb,0xea,0xae,0xed,0x98,0x5b,0x6f,0xb9,0x02,0xdd,0x0e,0xfb,0xd6,0x38,0x74,0x57,0x55,0x0d,0x0d,0x6a,0x2f,0xea,},{0x72,0xa1,0xff,0x1e,0x9b,0xb1,0x1c,0x8d,0x88,0x96,0x8a,0x7b,0x16,0x96,0x37,0xad,0xee,0x43,0x8e,0x22,0x63,0xf0,0x06,0xdc,0xa4,0xfe,0x02,0xfe,0x06,0x6c,0xba,0xd3,},{0x1b,0x8d,0x7c,0xc2,0xad,0xf3,0x6c,0xae,0x16,0x31,0x25,0x0c,0x82,0x43,0x1b,0xd8,0x84,0x37,0x16,0x3a,0x63,0x49,0xad,0x96,0xe7,0xa8,0x64,0x44,0x7e,0x9f,0xee,0x75,0x3a,0xc3,0x65,0x5c,0x98,0x35,0xb4,0xd1,0xec,0xbb,0x30,0x6c,0x63,0x8b,0xa5,0x40,0x2a,0xd0,0x2b,0xa6,0xd2,0x25,0xd9,0x68,0x82,0x88,0x9f,0xe8,0xd2,0x04,0xa6,0x04,},\"\\x84\\x26\\x74\\x39\\x20\\x1b\\x05\\x91\\xdb\\x60\\xc0\\xf1\\x7a\\x9c\\x15\\xe4\\x54\\x09\\x29\\x56\\x52\\xd5\\xf5\\x5b\\x87\\xfb\\x35\\x19\\x67\\xc8\\x46\\xa5\\x67\\xf5\\xce\\xba\\xae\\xd1\\x76\\x2b\\xff\\x54\\x85\\xf0\\x48\\x53\\xca\\x92\\x69\\xf4\\x64\\x09\\x4e\\x51\\x2d\\xf1\\xf0\\x2e\\x13\\xe5\\x17\\xb1\\xda\\xa5\\x8d\\x34\\xca\\xa2\\xd5\\xff\\x9f\\x9e\\x79\\xbc\\xaf\\xb4\\xce\\x96\\xe8\\xa0\\x89\\x25\\x8a\\xd6\\x13\\x43\\xb4\\x46\\x62\\x8e\\xbc\\x4f\\x5b\\x2a\\x84\\xd0\\x3b\\x72\\xef\\x3f\\x73\\x85\\x89\\xfa\\x13\\xc4\\x25\\x19\\xa8\\x28\\x29\\x9a\\x3f\\xae\\xc0\\x35\\x03\\x7b\\xc1\\x0b\\x44\\xe3\\xbd\\xfe\\xd9\\xe0\\x87\\x07\\x17\\xcb\\xaf\\x31\\xbe\\xf8\\xb2\\x2c\\x4e\\xa1\\x6e\\x81\\x57\\xfc\\xbc\\x63\\xee\\xfa\\x39\\xed\\x82\\x2e\\xfd\\x42\\x15\\xc2\\x47\\xdd\\xa4\\x87\\x86\\x27\\x7e\\xc0\\x30\\xa8\\x6c\\x0e\\xf4\\x85\\x1d\\x67\\x3c\\xfe\\x75\\x2d\\x06\\x77\\x88\\x3c\\x2c\\x45\\x20\\x38\\x97\\x0c\\x09\\xbd\\x48\\x17\\x14\\xbc\\x3f\\xbe\\xcf\\xa4\\xff\\x2a\\x3c\\x24\\x56\\x95\\xd7\\xec\\xc2\\xf4\\xde\\xc7\\xf5\\xed\\xe0\\x4f\\xf6\\xdb\\x43\\xe2\\xbb\\x91\\xc0\\x66\\xb6\\x49\\xef\\x73\\xfd\\x3b\\xe8\\x60\\xcb\\x83\\xfa\\x80\\xb0\\x74\\x14\\x9f\\x43\\x1e\\xeb\\xb9\\x17\\xec\\x84\\x78\\xda\\x87\\x0c\\x11\\xe3\\x17\\x70\\x38\\x59\\xf9\\xf2\\xf4\\x00\\x8a\\x6c\\x7c\\x75\\x4b\\x06\\xe1\\xf7\\xd2\\x47\\x96\\x89\\xda\\x84\\xe8\\x89\\x22\\xf3\\x82\\x74\\x98\\x5e\\x11\\xce\\x13\\xcd\\xbd\\xb0\\xf2\\xec\\xe6\\x8f\\xb6\\x02\\xad\\xe0\\x3d\\xd5\\x49\\xa3\\x62\\x49\\x1f\\x4a\\x20\\x3f\\xf8\\x07\\x44\\xf6\\x63\\xc5\\x23\\xa0\\x26\\xb4\\x31\\xaa\\xd4\\x5c\\x58\\x29\\xe0\\x29\\xad\\x62\\x56\\xd1\\x27\\x6f\\xd7\\xb7\\xa1\\x2d\\xdb\\xf1\\x72\\x7d\\x9e\\x23\\x3f\\xb5\\x34\\x45\\x73\\x70\\xa4\\x26\\xe5\\x6f\\xb3\\x9c\\xf4\\x04\\xa3\\xec\\xbf\\x0c\\x4b\\x50\\xbb\\x52\\x2d\\xce\\x98\\x1e\\x08\\x30\\xfd\\x84\\x06\\xe6\\xd9\\x72\\x5c\\xeb\\x1d\\xdd\\x3a\\x19\\x47\\x93\\x7d\\x90\\xe0\\x4d\\x76\\x8a\\xe1\\xd1\\x26\\xe2\\xae\\xac\\x21\\xb8\\xc9\\xef\\xc5\\x4c\\x40\\x96\\x1b\\x7f\\x4e\\x9e\\x88\\x02\\x5f\\x7e\\x0b\\x9d\\xe9\\x01\\xeb\\xf0\\x04\\x9e\\x74\\x1b\\x79\\x79\\x97\\xd8\\xdb\\x78\\xe9\\x28\\x3b\\xbb\\x5f\\x90\\xf3\\x5a\\x2c\\x4d\\xee\\x27\\x31\\x42\\xec\\x25\\x8c\\x02\\xad\\x0e\\xcc\\x61\\xcc\\x5c\\x9f\\x12\\x13\\x2d\\xb2\\x8a\\xf4\\x1c\\x1f\\xb7\\x8e\\x52\\x4b\\xe5\\x32\\x7b\\x5f\\xfc\\x35\\x96\\x27\\x79\\xfb\\x11\\xff\\x0c\\x5d\\x3e\\xe0\\xa3\\x1f\\xf4\\x7e\\x73\\xb1\\x72\\x9d\\xfa\\x46\\xe8\\x98\\x6b\\x1b\\x89\\xab\\xc8\\x8a\\xd0\\x6a\\xbd\\x5b\\x6f\\x76\\x6d\\x23\\xab\\xf6\\x42\\x25\\x78\\x94\\xeb\\xdf\\xa7\\x9e\\x63\\x09\\xf1\\x27\\x23\\x74\\xee\\x94\\x33\\x67\\x7b\\xa1\\x3e\\x45\\x1b\\xaa\\x95\\x33\\x0e\\x66\\x0c\\x80\\x52\\xae\\x87\\x2e\\x0e\\x32\\xe2\\xb2\\xd1\\x28\\x6d\\x01\\xa0\\xab\\x58\\x10\\x42\\x4e\\xd8\\xb9\\x40\\x54\\x65\\xbd\\xeb\\xa0\\x3b\\x69\\x83\\x84\\x67\\x6f\\xe5\\xea\\x46\\x4a\\x03\\x44\\x6c\\x4f\\x7c\\xd7\\xb4\\x33\\x12\\xec\\xf1\\x51\\x36\\x04\\x64\\x57\\x1a\\xd2\\x86\\x10\\x58\\x1f\\xba\\xdb\\x94\\x5a\\x1d\\x68\\x18\\x1d\\xeb\\x40\\x3a\\xa5\\x6e\\xba\\x0b\\xb8\\x40\\x32\\x8e\\xee\\x36\\x10\\x3c\\x7d\\xe0\\x73\\xa6\\x87\\x9c\\x94\\x1c\\x75\\x54\\xc6\\xf6\\xf2\\xa0\\x80\\x80\\x9e\\xb0\\xe5\\xbd\\x0e\\x13\\x0f\\x29\\xa2\\x29\\xe9\\x30\\xdb\\x01\\xfe\\xca\\xc2\\xe0\\x36\\xbd\\xf0\\xe0\\x01\\xe2\\xa8\\xea\\x32\\x64\\xf8\\x64\\x9d\\x5b\\x60\\xc2\\x91\\x03\\xf0\\xb4\\x9c\\x24\\xc9\\x7f\\xac\\xaf\\x7e\\x81\\x06\\x9a\\x2b\\x26\\xab\\x3f\\x93\\x3f\\x42\\x7d\\x81\\x27\\x2c\\x6c\\x8b\\x7c\\xd0\\xdf\\xb7\\xc6\\xbb\\xe9\\xc0\\xea\\xab\\x32\\xbb\\xda\\x22\\x18\\xb9\\x62\\x3a\\x21\\x19\\xaa\\xb1\\xf3\\xeb\"},\n{{0x77,0xad,0x0f,0x94,0x2c,0x37,0xf0,0x31,0x3e,0x6b,0x04,0x56,0xda,0xba,0xec,0x81,0xb2,0xd6,0x1f,0x6c,0x11,0x8d,0xdb,0x29,0xea,0xf3,0xac,0x5b,0xf1,0x95,0x04,0xd4,},{0x69,0x2d,0x2d,0xa5,0xa9,0x5f,0x48,0x61,0x1a,0x6d,0xa8,0x9c,0xfb,0x3b,0x35,0x40,0xf6,0xaa,0x0c,0x85,0x0d,0x6d,0x98,0xde,0xea,0x87,0x0e,0x39,0x7f,0xed,0xe3,0x28,},{0x69,0x6b,0xd5,0x52,0xdd,0x01,0xdb,0x80,0xb3,0xd6,0x7d,0x61,0xee,0xb7,0xec,0xc5,0x68,0x78,0x40,0x4a,0xb1,0x19,0x44,0x2a,0x1c,0x74,0x22,0x99,0x2c,0xfa,0x35,0xae,0xa9,0x20,0x82,0x5d,0x2d,0xaf,0xd8,0x92,0xad,0x7e,0xb6,0x82,0x5a,0xd9,0x99,0xae,0xe5,0xc8,0x3b,0x7b,0x50,0x79,0x06,0x53,0x4f,0x91,0xac,0xe7,0x59,0xc5,0x51,0x0c,},\"\\x87\\xe6\\xde\\xad\\x2c\\x85\\x54\\x9e\\x3d\\x8d\\x25\\x88\\xa0\\xa3\\x36\\x06\\x03\\xa6\\x24\\xfb\\x65\\xae\\xbb\\xc1\\x01\\xbf\\x7f\\x1f\\xec\\x18\\xd0\\xb2\\x8f\\xbd\\x5d\\xba\\xee\\xd3\\x87\\x52\\xcd\\xf6\\x35\\x5c\\xe8\\xdc\\x84\\xe1\\x8a\\xc1\\xa4\\x39\\x3d\\x2a\\xb8\\x88\\x88\\x2c\\x4f\\xf1\\xc9\\xc8\\x13\\x7f\\x83\\xbe\\xe3\\x63\\x36\\xbc\\xbf\\xbb\\x72\\xd5\\x04\\x9e\\x0a\\x40\\x08\\x74\\x51\\x4f\\xdc\\x36\\x33\\x04\\x6e\\x89\\x38\\x3d\\xde\\xd9\\x3c\\xa3\\x1f\\xde\\x0d\\x89\\x8e\\x11\\xe9\\x26\\x8d\\x3d\\x5c\\x24\\x06\\x66\\xed\\x55\\x27\\x61\\x3d\\xa7\\x9f\\xb7\\xe4\\x96\\x25\\xb4\\x4c\\xde\\x78\\xb4\\x1c\\x67\\x90\\x2e\\xb0\\x21\\x6b\\x3a\\x7a\\x3e\\x56\\x0e\\x26\\x1d\\x71\\xd7\\x64\\xaa\\xcf\\x15\\x95\\x9c\\x17\\xfc\\xd6\\x17\\x6f\\xb2\\x5e\\x24\\x9e\\xe6\\xbb\\x1b\\x3b\\xd7\\xbd\\x90\\xf6\\x0b\\x0b\\x0f\\xfa\\x03\\x15\\xa0\\x65\\xa2\\x4b\\xba\\xe8\\xf2\\x55\\xbf\\x29\\x8d\\x7e\\x4d\\x44\\xf0\\xb4\\x30\\xc4\\x15\\xb4\\xfb\\x36\\xcf\\xa6\\x62\\x6a\\x83\\xf4\\x9a\\x25\\x67\\xf6\\x24\\x4f\\x40\\xe9\\x23\\xad\\xd1\\xd4\\x9a\\x72\\xf5\\x7b\\x15\\x30\\xf5\\xb3\\x79\\xde\\x3a\\x91\\xc2\\xe9\\xa1\\xac\\x79\\xab\\x37\\xbc\\x3b\\x9b\\xa7\\x3d\\x88\\x28\\x13\\x6b\\xcc\\x87\\xd2\\xc0\\x11\\x90\\xde\\x54\\x57\\xfa\\xcd\\x90\\xf3\\x69\\x55\\x3f\\x7a\\xc5\\x21\\xc5\\x67\\x2b\\x08\\x67\\xdf\\xa8\\xda\\x3b\\x95\\x2a\\xd9\\x5b\\x67\\xda\\xb9\\x9b\\x48\\x20\\x57\\x2f\\x2d\\x4a\\x29\\x8e\\x95\\x18\\x63\\x77\\x79\\x28\\x9c\\x03\\x1b\\x79\\x3d\\xee\\x85\\x9c\\xde\\x7b\\x24\\xad\\xd6\\x49\\xff\\xf8\\x71\\x24\\x8a\\x66\\x02\\xd2\\x51\\x62\\x79\\xda\\x60\\x58\\xcb\\xb6\\x96\\xfa\\x8b\\x1d\\x89\\xa2\\x0d\\x20\\x99\\xe6\\x46\\x44\\x32\\x10\\x48\\x3e\\x5d\\x41\\x34\\xe9\\x28\\xfa\\xeb\\x38\\xa3\\xb5\\x08\\x19\\x9e\\x0d\\x69\\xbb\\x55\\xee\\x34\\x77\\x42\\x05\\xc0\\xa6\\x12\\x05\\xb5\\x0b\\x08\\xfe\\xbe\\xaa\\x40\\x1e\\x6e\\x3a\\x51\\xa2\\xbf\\x98\\xef\\xac\\x78\\xb7\\xae\\x2b\\x85\\x2c\\x53\\x95\\xa1\\x2c\\x40\\xe2\\xc7\\xdd\\x1b\\x20\\x25\\x04\\xb5\\xa7\\xd2\\xf7\\xe4\\xfd\\x4f\\x86\\x10\\x93\\x0d\\x28\\x68\\xcb\\xa8\\x86\\x43\\x39\\xe0\\x41\\xda\\x21\\xc0\\x71\\x5f\\x41\\xb2\\xb2\\x3d\\x14\\xd0\\xb5\\x45\\x48\\x0b\\xc3\\xbd\\x7d\\x72\\x15\\xcf\\x2f\\x81\\x6a\\x33\\x32\\x08\\x1e\\xca\\xa0\\x8c\\x0f\\x8b\\x99\\x52\\x52\\x51\\xf5\\x72\\x31\\xb6\\x75\\x0c\\x2d\\xbd\\x11\\x09\\xac\\x41\\x60\\x48\\x6b\\x76\\x83\\x24\\xb6\\xba\\xc8\\x7e\\xf5\\xa2\\x26\\x44\\x8c\\x43\\x12\\x40\\x32\\x8f\\x42\\xcc\\xa5\\x86\\xbe\\x7a\\xff\\x3c\\xbe\\x76\\x05\\xfa\\x34\\x15\\x14\\xfc\\xcf\\xb9\\x66\\xaf\\x3d\\x45\\x30\\xe8\\xcd\\x90\\x37\\xa1\\x1c\\xe5\\x93\\xc2\\xd3\\x83\\xe1\\x03\\x5a\\x0c\\x2e\\xda\\x09\\x8d\\xe9\\x0d\\x50\\xc5\\x18\\x4a\\x9c\\x01\\xb5\\x7f\\x26\\xb9\\x4d\\xed\\xd1\\x45\\x4c\\x34\\x06\\x37\\xec\\xcc\\xee\\x70\\x62\\x57\\x54\\xa3\\x28\\xc6\\x5f\\x42\\x64\\x5b\\x5e\\x1a\\x56\\x55\\xee\\xf9\\x7d\\xfb\\x1c\\x63\\x08\\xed\\xf4\\x9f\\xa3\\x68\\xd1\\x7d\\x17\\xe0\\x6a\\xdc\\x51\\x2b\\x39\\x73\\xea\\x65\\x2a\\xc4\\x0a\\x99\\x78\\xe1\\xbb\\x1b\\x2f\\x86\\xc5\\xa9\\xff\\xbf\\x60\\xdc\\xc4\\xf6\\xbb\\xc9\\x8a\\x64\\xf4\\xde\\x65\\xe7\\xec\\x61\\x72\\x1e\\xde\\xb0\\xe5\\x23\\x84\\x56\\xf7\\x61\\xd2\\xd1\\x29\\x3a\\xf0\\xde\\x9f\\x79\\x3b\\x11\\xd8\\xca\\xdf\\x01\\xa9\\x43\\x19\\xa0\\x2a\\x42\\x73\\xff\\xc4\\xd3\\xff\\xa7\\xb3\\x4d\\x74\\xfd\\x2e\\x0b\\x10\\x0f\\xca\\x58\\xb5\\x32\\x5f\\x90\\x7a\\x74\\x91\\x93\\xe7\\x51\\xd6\\xc1\\x16\\x68\\x7a\\xee\\x37\\x47\\xb5\\x94\\x60\\xd4\\xef\\x15\\x6e\\x72\\x47\\x6e\\xae\\x1b\\x84\\x55\\xd7\\x6e\\x71\\xb3\\x06\\xb9\\x81\\x29\\xb7\\x2f\\xe1\\xcb\\x5e\\xb4\\x05\\xa7\\xc2\\xf4\\x32\\x7f\\x38\\x62\\xd4\"},\n{{0x29,0x32,0x14,0x69,0xee,0x9f,0x2b,0xb1,0x65,0xa0,0x69,0x64,0x03,0x32,0xb4,0x89,0xbf,0x5c,0x3f,0xab,0x68,0x2e,0x93,0xda,0xe9,0xd8,0x63,0x17,0xbf,0x50,0xc5,0x2c,},{0x96,0xf7,0x30,0xf8,0xef,0x89,0x70,0x26,0x8d,0xba,0x0f,0x75,0x70,0x41,0x0b,0x61,0x88,0xa1,0xa3,0xc8,0x63,0x97,0x74,0x09,0x13,0xd5,0x3a,0xda,0x26,0x2a,0xb8,0x7e,},{0x4e,0x1a,0xff,0x84,0x63,0xbc,0xa1,0xb7,0xde,0xb1,0xd3,0x77,0x3d,0xf2,0xe7,0xa0,0x68,0x64,0x11,0x1b,0x6d,0xc4,0x2a,0x62,0xae,0x98,0xde,0xb2,0x31,0x39,0x43,0xb3,0x15,0x3e,0xe4,0x66,0x96,0xb1,0x5c,0x24,0xef,0xc2,0xa8,0x08,0xaa,0xba,0x81,0xc7,0x8e,0x3d,0xfa,0x4d,0xfb,0x50,0xca,0x9f,0xe8,0x44,0x45,0xea,0x68,0xbc,0x8e,0x0a,},\"\\x9c\\x71\\x2c\\x83\\xd5\\x4f\\x2e\\x99\\x3c\\xa6\\x8a\\x96\\x32\\x84\\x60\\x04\\x49\\x9c\\x51\\x95\\x44\\x8d\\xdc\\x49\\x1c\\x3a\\x0d\\x2e\\x3a\\x66\\x6d\\x6b\\x33\\x09\\x8e\\x48\\x64\\xfd\\xf8\\x6e\\x61\\x9d\\x50\\xf1\\x0b\\x7c\\xc6\\xc3\\x9b\\x3f\\xf2\\x80\\x1a\\x94\\x91\\xf6\\xfa\\x97\\xc5\\xf1\\xc4\\xaf\\xa7\\xae\\xff\\x31\\xd7\\x38\\xf9\\xa7\\x68\\xa7\\x9c\\x73\\xb2\\x55\\x77\\x31\\x0f\\xb0\\xad\\x4f\\xaf\\x85\\x43\\xa0\\x98\\xf8\\x59\\x57\\x1b\\x61\\x48\\xe8\\xb5\\x29\\x26\\x44\\x57\\x57\\xd5\\x54\\x9f\\xd2\\x5a\\x26\\x51\\x85\\x31\\x56\\x63\\x79\\xd1\\xc2\\x74\\xe6\\xc6\\xa9\\xd6\\x41\\x32\\xe4\\xac\\x25\\xac\\x9a\\xf9\\x38\\x1b\\xcb\\x88\\x53\\x32\\x11\\x3f\\x43\\x01\\x4a\\x13\\x9a\\x81\\xf8\\xd4\\x3c\\x8a\\x6a\\xb5\\x4c\\x11\\xa5\\xc9\\x2e\\x06\\x19\\x1c\\x1e\\x51\\xb7\\x57\\xac\\x9f\\x11\\xe3\\xdc\\x15\\xdb\\x44\\x86\\xd1\\x67\\xff\\x9f\\x2d\\x65\\xe2\\x3e\\x6c\\x96\\x22\\x3d\\x9a\\xff\\x8d\\x10\\xd1\\x50\\x2c\\xf3\\xdb\\xce\\x5e\\x35\\x7e\\x6b\\x12\\xdb\\xe9\\xb7\\xe9\\x97\\xc3\\xd0\\xa5\\x07\\xd3\\xba\\xe3\\xcf\\xef\\x1f\\xfc\\x8d\\x05\\x6e\\xf7\\xdc\\x72\\xdd\\xc1\\xc8\\x1e\\x31\\x0a\\xd2\\x05\\xbe\\x16\\xe7\\x7f\\x27\\x38\\x35\\x4b\\x10\\xb4\\x84\\xd3\\x07\\x6c\\x27\\xe6\\xb4\\xf1\\x66\\x38\\x85\\x81\\xf3\\x50\\xbe\\xfe\\x22\\xfb\\xb0\\x82\\xb5\\x41\\x21\\xee\\x59\\xec\\xc7\\xae\\x5d\\xec\\xe8\\x98\\x82\\xac\\xf2\\x6c\\xb7\\x47\\xff\\xaa\\x3e\\x2d\\x05\\xa6\\x96\\xf6\\x0f\\xd9\\xe8\\x29\\xc7\\x09\\xd8\\xf0\\x2d\\xaf\\x53\\x7b\\x23\\x69\\xb8\\x91\\xfe\\x6c\\xcb\\xf8\\xdf\\xcd\\xd7\\xf4\\xa3\\x64\\xb1\\x99\\x85\\xbe\\x7e\\xde\\xc6\\x7d\\xdc\\x1d\\xb7\\x13\\xc0\\xa9\\x0f\\xaf\\xa4\\x88\\x37\\x77\\x25\\x62\\xde\\xac\\xc2\\xd2\\xa0\\xe7\\x89\\xe1\\x8a\\x8b\\x5b\\x3b\\xd9\\xe0\\x83\\xea\\x92\\xff\\xfc\\x31\\x83\\xd5\\xd4\\x14\\x15\\x32\\x59\\xb3\\x3a\\x43\\x29\\xcf\\xc8\\x08\\x24\\xeb\\xcb\\xe0\\x44\\xa7\\xe3\\x3a\\xb8\\xa2\\x4f\\xde\\x54\\xbd\\x95\\x20\\xae\\xa2\\x84\\xb0\\xc4\\xc4\\xfa\\x94\\x27\\xd2\\x51\\xc0\\xdd\\xd0\\x13\\xec\\xdd\\x82\\x90\\xef\\x55\\x65\\xf6\\x08\\x50\\x8e\\x36\\x35\\x89\\xe5\\x29\\xd8\\x4f\\xf0\\xf2\\x6f\\x9e\\xcb\\x03\\x05\\x2d\\x58\\x97\\xfa\\xbc\\x91\\x7e\\x56\\xe6\\x01\\xb6\\x4a\\xbf\\xe5\\xa1\\x7c\\x39\\x50\\x28\\x9d\\x0c\\xdc\\xaf\\x1f\\x60\\x05\\xa9\\xf8\\x10\\x6f\\x43\\xe1\\x7a\\xdc\\xaa\\x2d\\x1e\\x26\\x91\\x66\\x76\\x2f\\x80\\x54\\xde\\x05\\x13\\x5d\\x5d\\x13\\x93\\xd7\\x00\\x0a\\x15\\xb8\\x7b\\xd6\\x88\\x46\\xa8\\x9d\\x5b\\xc2\\x28\\x63\\x32\\x51\\x51\\xaa\\xc8\\x43\\xf7\\x22\\x78\\xae\\x6f\\x4a\\xf7\\x2a\\x4e\\x44\\x9a\\xdb\\x7e\\xae\\x6d\\x43\\x6a\\x1e\\xc7\\xe5\\x8e\\x59\\xb7\\xb8\\xbb\\x9e\\xf0\\xdd\\xaa\\xa0\\x01\\x82\\x6f\\x8d\\xcb\\x44\\x64\\x79\\xde\\xaf\\xd8\\xb8\\xd5\\x42\\x04\\x1c\\x19\\xa0\\x5b\\x1e\\x0e\\xe4\\x7b\\x46\\x40\\x91\\x0c\\x31\\x93\\x0c\\xa4\\xe2\\x0b\\x10\\x57\\x58\\xec\\x75\\xf1\\x95\\x03\\x56\\x94\\x7f\\x62\\x61\\xd0\\x03\\x7f\\xe3\\x07\\x73\\xa3\\xec\\xe6\\xa9\\x6c\\x8d\\x54\\x33\\x33\\x3d\\x82\\x2c\\x27\\x77\\xef\\x7f\\xf8\\xbe\\x60\\x33\\x34\\x5b\\x50\\x55\\xd5\\x8f\\x5e\\xb3\\x72\\x9a\\xf5\\xae\\x88\\x24\\xf3\\x31\\xee\\x07\\x31\\xc8\\x9b\\x20\\xac\\x11\\x8f\\x55\\x04\\x27\\xcd\\x95\\x8a\\x55\\xf6\\xb1\\xa2\\x88\\x8a\\x08\\x7b\\xb7\\xdb\\x55\\xbf\\xc7\\x3b\\x29\\x42\\x9b\\x44\\x48\\xdb\\xe9\\x11\\x9c\\x45\\xa8\\x73\\x39\\xb4\\x49\\x7a\\x69\\xa4\\xcf\\x83\\x3e\\x8f\\x37\\x70\\xcc\\xe5\\xe0\\x1f\\xaf\\x5e\\x73\\xbb\\xaf\\x62\\x76\\x83\\xc0\\xa2\\x8c\\x73\\x05\\x2f\\xbe\\xce\\x20\\x30\\x43\\x38\\x9d\\xfb\\xfd\\x45\\x49\\x5e\\x51\\xda\\xb8\\x6a\\x25\\x2e\\x5b\\xc1\\xb4\\xb7\\xfe\\x28\\x07\\xe3\\xd0\\xe2\\x36\\x3b\\xea\\xb5\\x1c\\x67\\xfb\\x31\"},\n{{0x04,0x65,0x77,0x50,0x49,0x7e,0x68,0x15,0x2c,0x43,0xce,0x34,0xa5,0x8d,0x21,0x06,0xe6,0x4c,0x55,0x7c,0xd7,0xa8,0x4e,0xf0,0x5d,0x9e,0xb8,0x2e,0x6b,0xcb,0x05,0xf5,},{0x3b,0x3a,0x19,0x47,0xb4,0xcb,0xf6,0x0b,0x82,0x6d,0x60,0x9f,0x19,0x2d,0xc2,0x30,0xaa,0x9b,0x9b,0xaf,0x4c,0xd6,0xa6,0x09,0x2e,0x49,0x5f,0x1d,0x2e,0x47,0xad,0x62,},{0x7e,0x2e,0xae,0x5a,0x29,0x3f,0x41,0x83,0x91,0xf6,0xd8,0x5a,0x79,0x94,0xb0,0x7c,0x45,0x22,0x80,0x01,0x7e,0xe6,0x53,0xbf,0x61,0x7a,0x8d,0x5b,0xe2,0x4c,0xbb,0x5d,0x0e,0xfd,0xfb,0x7f,0x7f,0x00,0x13,0x12,0x26,0x0f,0x34,0x4e,0x6f,0xb9,0x15,0xad,0x8d,0x7d,0xe9,0xc0,0x51,0x98,0x27,0xc0,0x57,0x26,0xf9,0xce,0x25,0x45,0xdd,0x0b,},\"\\x29\\x48\\x22\\x7a\\x89\\x0f\\x6f\\x84\\x5b\\x77\\x5e\\x62\\xc5\\x3a\\xf3\\x80\\x50\\x64\\xa1\\x57\\x64\\x46\\xf0\\x85\\xd9\\x0f\\x8b\\x9a\\x5e\\xd6\\x8d\\xf1\\xea\\x39\\x3c\\xe4\\x79\\xc4\\x41\\x41\\x49\\xa9\\xec\\x5a\\x17\\x10\\x36\\x42\\x4d\\xff\\x03\\x44\\xb4\\x95\\x8f\\x61\\x32\\x29\\x8d\\x0e\\x24\\xc9\\x26\\xd2\\x8a\\xd9\\xd7\\x9f\\x98\\xc6\\xe6\\xbc\\xf1\\xc5\\x76\\x76\\x06\\xec\\xd2\\x91\\xc6\\xad\\x47\\xb4\\xf9\\xfb\\x2b\\x02\\x01\\x15\\x5a\\xda\\x62\\x7b\\x7a\\x1f\\xd5\\xb0\\x74\\x19\\x87\\x40\\x83\\x05\\x9e\\xb5\\x2b\\x2f\\x6e\\xc2\\x28\\x18\\xb7\\x82\\x46\\x22\\x8f\\x3f\\xe6\\x35\\x5d\\xfd\\xa7\\x0e\\xbb\\x9b\\xbe\\x73\\x22\\x93\\x78\\x73\\x63\\x99\\x55\\x7c\\xe2\\x4b\\x30\\xbf\\x64\\x5a\\x14\\xe2\\x25\\x6f\\x70\\x01\\x9b\\x33\\x36\\xb2\\x03\\xfb\\x77\\xc6\\xec\\x94\\xa7\\xa2\\x63\\x48\\x88\\xfe\\xea\\xd4\\xd7\\x2c\\x23\\x91\\xe9\\x9e\\x8c\\x8d\\x53\\x3f\\xd8\\xa4\\x2b\\x08\\xc1\\x1f\\x88\\x7a\\xb2\\xde\\xb6\\xeb\\xbf\\xe3\\xd2\\x51\\xde\\x63\\x53\\x6c\\x36\\xcd\\x53\\x42\\x23\\x98\\xe5\\x44\\xcf\\xf8\\x7b\\x07\\xa6\\x33\\x49\\xfc\\x50\\x85\\xdd\\xe9\\x3a\\x1b\\xfd\\x71\\x71\\x13\\x3a\\x20\\x43\\x98\\x1f\\x60\\x75\\x22\\xc8\\x13\\x3c\\x63\\x42\\x8d\\x1b\\x92\\x62\\x6c\\x79\\xb7\\x35\\x8e\\x70\\x21\\xcf\\x1f\\x41\\x2a\\x78\\xaf\\xa7\\xcb\\x3f\\x59\\xff\\xef\\x92\\x79\\x88\\x5a\\x5b\\xdb\\x24\\x66\\xac\\xd3\\x4c\\xd5\\x15\\x80\\x83\\x0b\\x83\\x51\\xeb\\xd4\\x40\\xa9\\x66\\x23\\x90\\x7a\\xd1\\xf4\\xb5\\x62\\x03\\xf5\\xe1\\x59\\xa4\\x29\\xe3\\x54\\x6e\\xad\\x0c\\x01\\x1d\\xbe\\xd0\\x90\\x28\\x71\\x7e\\x3c\\x3d\\xfe\\xd3\\x91\\x97\\x76\\x4d\\x4d\\x24\\x5e\\xf2\\x28\\xb9\\x80\\x44\\x71\\x8e\\xf4\\xd8\\x82\\x2f\\x21\\xb2\\xc5\\x68\\x50\\x38\\x47\\x3b\\xf9\\x3d\\xc0\\x93\\x74\\x51\\xeb\\x02\\xd3\\x1a\\x46\\xc8\\xdc\\x7e\\x94\\xc3\\xe8\\x67\\x8c\\x83\\xb9\\x8a\\x43\\x81\\x8f\\x12\\x5b\\x52\\x8b\\x47\\x6a\\xad\\x31\\xd1\\x58\\x4f\\xfd\\x48\\xf1\\x49\\xe5\\x73\\x6e\\x58\\xf9\\x42\\x05\\xd3\\x88\\x9e\\x56\\x7e\\x4d\\xd1\\xea\\xc2\\xfa\\xc1\\xf8\\xf4\\xdc\\x54\\x0e\\x53\\x22\\x46\\x0f\\xb9\\x40\\xe1\\x2e\\x93\\xc4\\xc9\\x8d\\xed\\x19\\x41\\xc1\\x90\\x4f\\x96\\x7f\\xb4\\x64\\x36\\x84\\xc1\\x9a\\x4d\\x5c\\x44\\x1d\\x60\\xb0\\xe9\\xf4\\x08\\x55\\xe5\\x23\\xfe\\x7f\\x99\\x10\\x76\\x57\\xa6\\x80\\x76\\x27\\x5b\\xf8\\x4b\\x7c\\x69\\xa3\\xf2\\xb3\\x85\\x5b\\xc8\\x02\\x6b\\xa9\\xb0\\x0b\\xc6\\xfe\\x34\\xb9\\x9d\\xa0\\x63\\x17\\x00\\xa6\\x7f\\x52\\xb3\\x4e\\x17\\x96\\x33\\x98\\x87\\xa4\\x83\\x05\\x12\\x1d\\x53\\xab\\x44\\x40\\xfc\\x4b\\x5c\\x9b\\xf7\\x23\\x94\\xd5\\xed\\x37\\x2f\\xf1\\x8c\\xa3\\xf0\\x07\\xbd\\x02\\xdf\\x65\\x1d\\xc3\\xac\\x43\\x82\\x75\\xf1\\xa3\\xe5\\x24\\x22\\xb8\\x6c\\x45\\x86\\x76\\x6a\\x21\\xcd\\x89\\xf8\\x05\\x80\\x5d\\xbb\\x44\\xfd\\x89\\xfe\\x24\\xfb\\x2c\\x0b\\x40\\xd1\\xb7\\x54\\xc3\\x35\\xdb\\xaf\\xfc\\x3b\\x3b\\xb8\\xbb\\x46\\xc7\\x4c\\x36\\x37\\x45\\x04\\x04\\x2d\\x86\\x78\\x92\\x27\\x59\\x98\\x62\\x31\\x2e\\x99\\xca\\x89\\xeb\\x50\\x4c\\xc3\\xd7\\x5d\\x19\\x49\\x5a\\xa8\\x6b\\x20\\xb2\\x73\\x6b\\x12\\x1b\\xb2\\x07\\x5c\\x88\\xed\\x4a\\x3f\\xbd\\xaa\\x6b\\x2c\\x3f\\x76\\xd1\\xff\\x55\\x25\\xd3\\xa2\\x86\\x3e\\x4d\\x83\\xc7\\x2b\\xfe\\x01\\xe1\\x02\\x78\\x80\\x94\\x74\\xe1\\x82\\x2d\\xe2\\xd9\\x62\\x83\\x48\\x93\\x20\\x02\\x96\\x11\\xaa\\x9d\\xff\\xc4\\x82\\x9d\\x66\\x86\\x9e\\x63\\x49\\x4f\\x9a\\xad\\xe7\\x0b\\x77\\xa7\\xb8\\x0f\\xbc\\x93\\xe3\\xde\\x4d\\x93\\x59\\x13\\x75\\x2d\\x04\\x5e\\x13\\xb3\\x12\\xc5\\xd0\\x82\\xf6\\x24\\x2d\\x49\\x85\\xb0\\x53\\xb3\\x78\\x3e\\xb0\\x2c\\x66\\x14\\x96\\x3d\\xc0\\xd5\\x5d\\x4c\\xbe\\x88\\x7b\\xae\\x29\\xcc\\x18\\x97\\x9e\\x5e\\x2e\\xa9\\x45\\xbc\\xd4\\x0d\\x89\"},\n{{0x8b,0xd9,0x90,0x70,0xc5,0x0a,0x9f,0xa4,0x18,0xef,0x7f,0x75,0xc0,0x01,0x29,0x91,0x6a,0x41,0xc8,0x60,0x70,0x96,0x1c,0xcb,0x2b,0x20,0x2b,0xe1,0x8c,0x2d,0x10,0xd7,},{0xdd,0xd7,0x33,0x08,0xfc,0xe8,0xca,0x65,0x52,0xd0,0x39,0x42,0x8c,0x7a,0x1a,0x94,0x92,0x33,0x20,0xa3,0x1c,0x0f,0x58,0x0d,0x3c,0x23,0x52,0x80,0xf0,0x3c,0x18,0x30,},{0xb1,0x4a,0x7b,0x26,0x20,0x12,0xc5,0x90,0x9e,0x21,0xd5,0x87,0xfb,0x4f,0x29,0xa9,0x09,0x3c,0x8e,0x1c,0x29,0x99,0x81,0x6a,0x82,0x11,0x8f,0xef,0xbf,0x10,0xe6,0x8e,0xa8,0x98,0xbf,0x0d,0xa1,0x8e,0xbf,0xd0,0x34,0x1e,0xa8,0xf8,0x2a,0x18,0x44,0xc8,0xe0,0xdd,0x53,0x06,0xe5,0x09,0xb9,0xd0,0xc3,0x5b,0x47,0x3a,0x7d,0x20,0x95,0x07,},\"\\x48\\x5f\\x8d\\x68\\x0f\\x79\\xee\\x2d\\x82\\x8b\\xe7\\xd0\\x18\\xa6\\x5e\\x0b\\x64\\xb0\\xf0\\x18\\x48\\x19\\x86\\x3e\\x71\\x10\\xee\\xa8\\xf2\\x99\\xa7\\x2c\\x4d\\xc8\\x7f\\x8e\\xe8\\xa8\\xae\\xaa\\x81\\xaf\\x91\\xdc\\x71\\xad\\xea\\x79\\xfc\\x97\\x97\\x42\\x1c\\xcc\\x64\\x6e\\x6c\\xd5\\xdd\\x48\\xb4\\xde\\xc1\\xde\\x96\\x86\\x93\\xfb\\xce\\x0d\\x00\\x21\\xa3\\xd9\\x8d\\x38\\xa8\\xbb\\xc5\\x81\\x95\\xe6\\xdf\\xc3\\xb5\\xe1\\x46\\x1b\\x2a\\x59\\x41\\x03\\xe8\\x0a\\x29\\x44\\x1d\\x5a\\xaa\\xf8\\x89\\xe3\\x1c\\xc8\\x65\\x14\\x1f\\x0c\\x6b\\x2c\\x8c\\x81\\xf7\\x21\\x67\\x9e\\xa2\\x39\\x4e\\xc6\\xe4\\x08\\x1e\\xc2\\x03\\xc2\\xea\\x39\\x7d\\x94\\x84\\x75\\x7a\\x7a\\x0e\\xcd\\x53\\xe6\\x52\\xdb\\x9d\\xf1\\x7b\\xea\\x0e\\x32\\xfe\\x8b\\x2c\\xbc\\xe0\\xd1\\xd9\\x7b\\x96\\x1e\\xd7\\x4e\\x8e\\x62\\x2b\\xcd\\xd3\\x55\\x8b\\x7c\\x48\\x69\\x5a\\xdf\\x18\\xaa\\xe6\\x11\\x0e\\xa9\\xa3\\x39\\xb9\\xda\\x40\\x7a\\x9e\\xda\\xf2\\xab\\x08\\x1a\\x68\\x1e\\x18\\x32\\xcc\\x21\\x5b\\x1f\\x08\\xa6\\x7d\\x55\\x9a\\x47\\x44\\xaf\\x7c\\xd5\\x03\\x18\\xc2\\x06\\xee\\x91\\x15\\x75\\x82\\xf8\\x2e\\xb6\\xc0\\xfc\\x29\\x02\\x7b\\x44\\x61\\xc3\\x07\\x33\\xb8\\x16\\x9d\\x14\\x81\\x32\\x2c\\x48\\x60\\x50\\x9b\\xa0\\x96\\xba\\xcb\\x71\\xa5\\x79\\x24\\x67\\x51\\xd5\\x67\\x54\\x0e\\x41\\x43\\x1e\\x14\\xf1\\xb4\\x6e\\xf1\\x6e\\xba\\x27\\x61\\x04\\xbc\\x01\\x65\\x0d\\x5c\\x49\\x26\\xe4\\x7c\\x9c\\x60\\x40\\x78\\x4b\\x04\\x3c\\xd0\\xaa\\x48\\x54\\xef\\xe8\\x79\\x7f\\xd0\\x46\\x2d\\x45\\x39\\xf3\\x80\\x35\\xae\\xf0\\x8b\\x45\\x77\\xc1\\xa9\\x11\\x8d\\x00\\x4b\\x6d\\x01\\x86\\x2f\\x52\\x76\\x77\\x6d\\xfe\\xf1\\x37\\x18\\x64\\xf1\\x55\\xac\\x0f\\x07\\x83\\x89\\xc2\\x05\\xcf\\x05\\x38\\xd8\\x5f\\xa3\\x48\\x24\\x4d\\x7a\\x42\\x29\\x11\\x31\\x0f\\xf6\\xc1\\x01\\x32\\xb1\\x59\\x8b\\xb4\\x45\\xc7\\xe2\\x07\\x7b\\x76\\x3c\\x47\\x3d\\x1e\\x7a\\x61\\xa3\\x8b\\x64\\x92\\x9a\\x64\\x8b\\x60\\xb2\\xe5\\x43\\x54\\x37\\x39\\x22\\x4b\\x40\\xfb\\xf6\\xd8\\x7f\\x10\\x79\\xc3\\x0b\\xc8\\x73\\xac\\x38\\x99\\x1d\\x51\\xb8\\x9e\\x9d\\x26\\x1c\\x4b\\xcc\\xb3\\x75\\x35\\x5c\\x07\\x2c\\x1e\\xa2\\x0e\\x4f\\xf9\\x1d\\x55\\xd9\\xf7\\x54\\x4e\\x90\\xd1\\xc6\\x64\\x6c\\x59\\xaf\\x72\\x42\\x4d\\x8a\\xaa\\x8e\\x0a\\xed\\x07\\xb3\\x88\\x9d\\x4e\\x45\\x0c\\x12\\x09\\x68\\x4c\\xe1\\x38\\xd0\\xc9\\xda\\x07\\x95\\x25\\xf5\\xaa\\x02\\x05\\x0a\\xf5\\x70\\xe4\\x31\\x5c\\x2f\\xa8\\xb0\\x99\\xb7\\x76\\x5b\\xfb\\xb8\\x94\\xfa\\xd3\\x59\\xb8\\xe2\\x48\\x04\\xec\\xe0\\x52\\xac\\x22\\xa1\\x91\\x70\\x53\\x35\\xe9\\x88\\x40\\xa6\\x24\\xe4\\xcb\\xf3\\xa1\\xa1\\xa3\\x27\\x81\\x27\\x85\\xb2\\xc0\\xf5\\xd6\\x38\\x14\\x57\\xb7\\x2f\\xdb\\x63\\x3e\\x81\\x93\\x8b\\xbb\\x54\\xb8\\xc3\\x7c\\xcc\\xb5\\xd5\\x9c\\x58\\x27\\xc7\\x68\\x3a\\x52\\x47\\x54\\x49\\x77\\xe9\\x84\\x44\\x21\\x78\\xd0\\x85\\x29\\x06\\xca\\x6f\\x94\\x5c\\x42\\x29\\xeb\\x08\\xad\\x27\\xe6\\xc2\\x75\\xd7\\xb4\\xec\\x8d\\xc2\\x5f\\xb2\\x81\\x93\\x37\\xe5\\x3e\\xad\\x6c\\x7a\\xa7\\x87\\xf9\\x1a\\x7d\\xc6\\xdd\\xaf\\xd5\\x36\\xee\\xfc\\xbd\\xec\\x2c\\x50\\x16\\x7b\\xe3\\x43\\x06\\xa8\\x2e\\x16\\xd5\\xd5\\x2b\\x3b\\x1b\\xe0\\x08\\xa7\\xa6\\x11\\x27\\x4c\\xe2\\xcf\\x8d\\x62\\xe3\\xb9\\x00\\xc0\\x99\\x43\\xbe\\x70\\xcc\\xc7\\x7b\\x07\\x06\\x37\\xc2\\x50\\x61\\xd6\\x1b\\xe9\\x10\\xee\\xf5\\x0d\\xf1\\x87\\x44\\xc3\\x3e\\x76\\xf6\\x70\\x1e\\x0a\\x8f\\xf6\\x29\\x7f\\xa6\\x7e\\x4b\\x41\\x08\\xc1\\x37\\x56\\x72\\x7a\\x9d\\x74\\xbc\\x9e\\x17\\x98\\x3e\\xec\\x08\\xf8\\x66\\xb7\\xc7\\xff\\xb3\\x7f\\x3c\\xcb\\x01\\x41\\xa8\\x0f\\xef\\xf6\\x32\\x2b\\x2a\\xc6\\x2b\\x84\\xce\\x27\\x97\\xfd\\x98\\xd6\\xff\\x26\\x9a\\x41\\xa0\\xc3\\x84\\x82\\xdb\\x67\\x98\\x62\\xa3\\x8c\\xd2\"},\n{{0x1a,0xf4,0xcf,0x6d,0x24,0xab,0x37,0x82,0x86,0x7d,0x96,0xa1,0xc2,0x75,0xce,0xeb,0x02,0x2c,0x69,0x1a,0x30,0x8e,0x62,0x45,0x66,0x5d,0x61,0x6b,0xf6,0x7c,0x2c,0x32,},{0x19,0xd3,0x17,0xea,0x98,0xd3,0x5b,0xa5,0xfa,0x67,0xc1,0x2e,0xcf,0xb3,0x27,0x50,0xdf,0x27,0x5d,0x7a,0x45,0xb8,0xe2,0x11,0xa7,0xac,0x47,0xed,0xe7,0x71,0x2d,0x9f,},{0x7e,0xb4,0x6c,0xd0,0xde,0x31,0x55,0xb4,0x37,0x47,0xd7,0x32,0xf1,0x04,0x5d,0x8e,0xf7,0x44,0x92,0xad,0x82,0x7a,0x22,0x45,0xbd,0x17,0x10,0x28,0x28,0x44,0x2e,0x43,0xa0,0xce,0x7e,0x8b,0x26,0x8e,0xd7,0xfd,0x8d,0x3e,0x7b,0x28,0xf0,0x72,0x79,0x5d,0xa3,0xe0,0x70,0xf1,0x2b,0xc4,0xe2,0x3e,0xae,0xf5,0x7b,0x85,0x3c,0xee,0x88,0x0a,},\"\\xf4\\x45\\xfd\\xcf\\xe2\\x8c\\x17\\xbd\\x44\\x27\\xae\\xa5\\x67\\x6c\\x0e\\x12\\x80\\x84\\x15\\x97\\xe9\\xd6\\x6d\\xe7\\xd7\\xa7\\x17\\x23\\x11\\x09\\x39\\xbe\\xd0\\x0f\\x4e\\xba\\xf9\\x60\\x3d\\x53\\xc9\\xcb\\xf6\\x27\\x1b\\xe5\\x47\\xaf\\x29\\xb2\\xa0\\x45\\xec\\x41\\x28\\x8a\\x7b\\xb7\\x9d\\x66\\x2d\\xc2\\x10\\xe2\\x15\\x95\\x7f\\xa8\\x46\\x88\\xc9\\x16\\x54\\x3e\\x56\\x17\\xf5\\x60\\xe4\\xd3\\x8f\\x73\\xba\\xef\\xc3\\x7e\\x11\\x91\\x4e\\x47\\xc5\\x15\\x06\\x78\\x51\\xe8\\xed\\x21\\x39\\x3e\\x13\\xdd\\x19\\xed\\x9b\\x73\\xd9\\x89\\x45\\xfc\\x82\\x6a\\x25\\x8e\\x95\\x7d\\xc0\\x83\\xdd\\x8e\\x53\\x5c\\x30\\xa5\\x4b\\x42\\x66\\xdd\\x71\\xd1\\x13\\xce\\x85\\x6b\\x46\\x28\\x2a\\x18\\x03\\x36\\x27\\xa9\\x8e\\x64\\x72\\xcc\\xb4\\x63\\xed\\x3d\\x96\\xfa\\x7b\\x35\\x5d\\x3b\\x2c\\x2a\\x2b\\x60\\x10\\xdd\\x14\\xf4\\xea\\x39\\x65\\xdd\\x87\\xbe\\x1c\\x42\\x9b\\xde\\xa8\\x30\\x0b\\x4b\\x0b\\x44\\x45\\x86\\x35\\xb4\\x97\\x9f\\x5e\\x3e\\x8e\\xb5\\xc6\\x18\\xd4\\xe1\\x3e\\x1d\\x68\\x8b\\xf8\\x8c\\x7e\\x4a\\x3d\\x93\\x8e\\x84\\x33\\x6d\\x67\\xbe\\x68\\xdf\\x34\\x35\\xc5\\xc9\\x90\\x86\\x32\\x1c\\x02\\xe1\\x3b\\x4a\\x12\\x52\\x4b\\x34\\xe4\\x6a\\x0b\\x4d\\x27\\xf3\\x0d\\x7e\\xd4\\xf5\\xce\\xcb\\x36\\xde\\xad\\xf0\\x9e\\x7e\\xfc\\xc7\\x55\\xca\\x66\\x75\\x68\\x29\\x79\\x14\\xc6\\xbc\\x24\\x06\\x27\\xd9\\xd0\\x9a\\xac\\xf8\\x54\\x15\\x41\\x2c\\x06\\x35\\x62\\x34\\x53\\x27\\x8d\\x9b\\xf0\\xe1\\x0e\\xec\\x65\\xfc\\x72\\xaf\\xff\\xfa\\x93\\x92\\xdc\\x78\\x81\\xd1\\xe5\\xc7\\x60\\xa4\\x02\\x80\\xf1\\x6b\\x14\\x75\\x12\\x7b\\x91\\xb6\\x9c\\xcb\\x65\\xdc\\x4b\\x35\\xde\\x10\\xf9\\x43\\x25\\xc0\\xcb\\xe1\\xc4\\x70\\x19\\xa2\\xea\\xf2\\xb4\\xba\\x92\\xd7\\x85\\x22\\x9a\\xac\\xfa\\xd1\\x82\\x6e\\xbb\\xde\\xbe\\xfb\\x7d\\xad\\x4b\\x05\\xf8\\x82\\x43\\xe1\\x5f\\x27\\x97\\x66\\xe3\\x32\\x1d\\xd8\\xdb\\xa6\\x50\\x44\\x4d\\x81\\xfb\\x08\\x78\\x76\\x7a\\x9c\\x63\\x53\\x4b\\xb4\\xba\\x21\\x28\\x5a\\x24\\x16\\xcb\\x8f\\x85\\x6d\\x11\\xa9\\x6e\\x0a\\x8c\\x8d\\xe1\\xe1\\xa7\\x51\\x32\\xf1\\x56\\x4c\\xd9\\x94\\x99\\x56\\x90\\xbb\\xed\\x2e\\xe1\\x54\\x53\\x7f\\xb6\\xf2\\x79\\xfb\\x09\\xc8\\xde\\xa6\\xf6\\xaf\\xab\\xc6\\x28\\x56\\xe3\\xd1\\x28\\xfd\\xfa\\x79\\xfc\\x49\\x76\\x19\\x3b\\xb9\\xb3\\x36\\x86\\x1e\\x47\\xb5\\x6d\\xc2\\x58\\x23\\x93\\xd2\\xe5\\x44\\x65\\x1a\\xc8\\x5b\\xc5\\x8e\\x9e\\x6a\\x94\\xdc\\x4c\\x39\\xc4\\xef\\x72\\x53\\x8a\\x14\\xf8\\x56\\xcd\\x95\\xc3\\xe2\\x79\\x0a\\xde\\xe0\\x3a\\xb2\\xe5\\x2c\\xa0\\xae\\x47\\x1d\\xe5\\x02\\xcb\\x19\\xe6\\x76\\xaf\\x35\\xf5\\xf9\\x3d\\x84\\x0f\\xef\\x96\\x06\\xcb\\xe9\\x2d\\x8b\\xc2\\x50\\x06\\x10\\x5d\\x92\\x34\\x45\\x88\\x83\\x88\\x42\\xc3\\xbe\\x50\\x5c\\x73\\x50\\xe3\\x51\\xb7\\x35\\xe6\\xcc\\x6f\\xb7\\x92\\x75\\xb2\\x7b\\xd9\\xeb\\xd3\\x6b\\xa4\\xd0\\x60\\xac\\xee\\x73\\xb5\\xa3\\x15\\xce\\xff\\xab\\x86\\xd0\\x6f\\x21\\x68\\xa6\\x70\\x65\\x57\\x81\\x96\\xa0\\xed\\x04\\xa4\\xdd\\x71\\xd6\\x73\\x48\\x37\\xdb\\x08\\x38\\x57\\xab\\x1e\\xb5\\xe0\\xee\\xc4\\xff\\xba\\xc9\\x54\\x4f\\x4e\\xc1\\x9b\\xde\\x19\\x4d\\xf8\\x4b\\x1c\\x84\\x83\\x41\\x57\\x4b\\xf1\\x0d\\xae\\xe8\\x5b\\x81\\x78\\x19\\x6f\\xb6\\x08\\x12\\x3a\\x80\\x81\\x71\\xd7\\x3c\\xe4\\x20\\x6a\\xd6\\x52\\x16\\xad\\x1a\\x5c\\xbd\\xe4\\x0b\\x19\\xd6\\xae\\x7f\\x40\\xdf\\x97\\xab\\x84\\x32\\xe2\\xc5\\x3a\\x50\\x4e\\xd1\\x22\\xe2\\x5f\\xb7\\xa5\\x1c\\x14\\x35\\x4a\\xb3\\x92\\x8e\\xde\\xb3\\x9c\\x29\\xeb\\x24\\x6b\\x74\\xa0\\x76\\xf8\\x9d\\x03\\x50\\x4f\\x40\\x1b\\xd1\\x76\\xb5\\xcf\\xfe\\xe4\\xb9\\xdb\\x09\\x7c\\x45\\x76\\x4f\\x51\\xaa\\x37\\x67\\x04\\xb5\\xa7\\xf2\\x10\\xb3\\xf1\\xa9\\x05\\xe2\\x5d\\x67\\x00\\x2f\\x65\\x57\\xeb\\xb7\\x49\\x73\\x7c\\xda\\x31\"},\n{{0x2a,0xac,0xc8,0x19,0x7f,0xf8,0xfa,0xe1,0xc1,0xcf,0x38,0x62,0xe3,0xc0,0x4a,0x21,0x78,0x29,0x51,0xf8,0xe4,0x8e,0x40,0xb5,0x88,0xf8,0xbc,0x74,0x60,0xc3,0x0a,0x03,},{0x9a,0x1b,0x01,0xe2,0x15,0x4f,0x1c,0x36,0xa8,0xe1,0x6b,0x79,0xee,0x7d,0x2d,0x05,0xb8,0x71,0x2e,0x0d,0x27,0xa0,0x61,0xa6,0xd4,0x1d,0x47,0x57,0x78,0xb0,0xdf,0x8c,},{0x64,0x7c,0xdd,0x6c,0x1a,0x67,0x29,0x0e,0x57,0x67,0x6a,0x78,0x11,0x3a,0xaa,0xdc,0xa6,0x9a,0xc5,0x7b,0x99,0x77,0x15,0xc5,0x09,0x89,0x5b,0x8c,0x5c,0x94,0xe8,0x2c,0x0b,0x6a,0xce,0xcc,0xf3,0xba,0x8b,0xd7,0xcf,0x61,0x75,0x2b,0x1b,0x19,0xd1,0x3b,0x49,0xf1,0x5f,0x8b,0xfa,0x04,0x6e,0xb4,0x42,0xa5,0x5c,0xd5,0xba,0xb1,0x42,0x02,},\"\\x5d\\x82\\x75\\x2c\\xe5\\xda\\x31\\x80\\xfa\\xf4\\x78\\x7a\\xed\\xfb\\x19\\x29\\x4b\\x43\\x48\\xa1\\xd9\\x20\\x2c\\x85\\x39\\x83\\x31\\x32\\x3e\\x0f\\x42\\xb0\\x83\\x52\\x27\\xe6\\x8e\\x11\\x56\\xf2\\xd4\\xba\\x2f\\xe4\\x50\\xe6\\xd6\\xef\\x2b\\x92\\xd8\\x9b\\xbb\\xe4\\x09\\x6e\\x12\\xca\\x83\\x97\\xeb\\x2f\\x45\\xe6\\x76\\xf1\\x67\\x3a\\xa4\\x1c\\x95\\x9f\\xcd\\x30\\xd5\\x57\\x88\\x53\\xb5\\xdb\\xd1\\xc0\\xd5\\xb3\\xa0\\xf0\\xd8\\x70\\xec\\xa7\\x1e\\xa1\\x33\\x90\\x11\\x1b\\x25\\x8f\\x65\\x48\\xb3\\x2f\\x37\\xa0\\x5e\\x97\\x44\\xa6\\x56\\xfd\\x77\\x8d\\x65\\x72\\x19\\x65\\xc6\\xd9\\xb3\\x28\\x60\\x0b\\x45\\x70\\x47\\x70\\xe0\\x4b\\x09\\x97\\x90\\xaa\\x78\\x84\\xf0\\x0d\\x7b\\xb7\\x65\\x9e\\x33\\x72\\x10\\xbd\\xc2\\x3e\\xaa\\x71\\xd7\\xb0\\x16\\x03\\x0a\\xca\\x62\\x23\\xb5\\x56\\x9b\\xdf\\xc2\\x90\\x81\\x1a\\xac\\x40\\x95\\x24\\xdc\\xcb\\xf9\\xba\\xbc\\xbe\\x4b\\xf2\\x09\\x46\\xb5\\x44\\x31\\x7c\\xa6\\xf2\\xf9\\x18\\x31\\xc7\\x9f\\xb2\\x73\\xb6\\x40\\x4e\\xb4\\xe6\\x1e\\x1f\\x7b\\x10\\x6e\\xbd\\x0d\\xb9\\xf2\\xb1\\x97\\x4d\\x2f\\x03\\x1b\\xce\\x25\\x80\\x36\\x06\\x55\\x2c\\x34\\x41\\x65\\x5e\\xfc\\xf2\\xc7\\xea\\x52\\xad\\xcb\\x30\\x99\\x3d\\x85\\xf2\\xdd\\xa7\\x96\\x03\\xe9\\x41\\x5a\\x02\\x32\\x45\\xa6\\x6c\\x07\\xa9\\x56\\x93\\x31\\x46\\xf5\\x3c\\x99\\x3c\\x08\\x89\\x18\\x08\\xb8\\x16\\x6b\\x30\\x72\\x1f\\xbd\\x1f\\x8a\\x1b\\x93\\x7d\\x14\\x07\\x0d\\x78\\x6e\\x9e\\xb4\\x51\\xf2\\xab\\x51\\x42\\xf8\\x3a\\x60\\xf3\\x5d\\x76\\xad\\x8b\\x81\\xd6\\xa5\\x7c\\xf3\\x68\\xfc\\x6f\\xca\\xcc\\x0c\\x47\\x58\\x44\\x0d\\x9c\\xd5\\x95\\xb1\\xb0\\x94\\x2a\\x36\\x55\\xe2\\x50\\xda\\x98\\x3b\\x72\\x41\\x54\\x6d\\xcf\\xbe\\x0a\\xe8\\x10\\x77\\x65\\x02\\x95\\x40\\x9f\\xf9\\xe9\\x09\\x77\\xfb\\x99\\x60\\xcb\\xf4\\x0a\\x2a\\xf5\\x17\\x74\\x02\\xba\\x2f\\xaf\\x50\\xdb\\x6f\\x1a\\x73\\x65\\xcf\\x99\\xe9\\x92\\x42\\x9e\\x38\\xdb\\x43\\xea\\x83\\xfd\\xdc\\x95\\xa6\\x48\\x67\\x6c\\x0b\\x16\\xbc\\x95\\x2b\\x15\\xde\\x99\\xd5\\x2f\\x6b\\x52\\x33\\xda\\x4e\\xae\\x19\\x78\\xe8\\xba\\x25\\xe6\\x23\\x5a\\xfb\\xc5\\x11\\xc7\\x6c\\x4c\\x87\\x4c\\x92\\x37\\x92\\x2b\\x1c\\xef\\x08\\x47\\xd0\\x7a\\x80\\x20\\x0c\\xba\\xe3\\xc7\\xc8\\x1f\\xcb\\xd0\\xd1\\x72\\x52\\xed\\x8c\\x61\\xad\\x19\\x54\\xfc\\x86\\x2e\\x1e\\x04\\x44\\x4c\\x32\\x08\\x6f\\xee\\x38\\x0d\\x1c\\x17\\x54\\x13\\x22\\xb9\\xa6\\x0d\\xa6\\x62\\x35\\x2e\\x21\\x0e\\x9a\\xe2\\x15\\xe3\\x53\\x29\\x6d\\xb9\\x22\\x33\\x9a\\xa1\\x7d\\x21\\x73\\xec\\x31\\xf1\\xc5\\x30\\xa2\\x4b\\x1f\\x34\\x8a\\x31\\x57\\x2e\\x14\\x69\\xca\\xac\\x80\\x8f\\x9c\\x76\\xec\\x27\\x31\\x87\\x3b\\x80\\x3e\\xad\\x3e\\x54\\xea\\x24\\xbc\\x24\\x49\\x9b\\x97\\x04\\xb3\\xbd\\xce\\x81\\x38\\x9b\\x9d\\x14\\xd4\\x95\\x27\\xc0\\x4b\\x3b\\xb9\\xe3\\xba\\x6d\\x94\\x6c\\xea\\x58\\xcf\\x78\\x6d\\x4d\\x28\\xb8\\x9b\\x41\\xc5\\x82\\x74\\x03\\x5a\\x86\\x90\\x5a\\xd9\\x57\\x58\\xc3\\x16\\x13\\x66\\xab\\x93\\xda\\x81\\xe6\\xb4\\xc8\\x08\\x36\\x4e\\x08\\x7d\\xae\\xea\\x4c\\x4c\\x5c\\x2a\\xa6\\x87\\x19\\x37\\xc5\\xfe\\xab\\xa2\\x14\\x9f\\x01\\xf7\\x38\\xf4\\x53\\x96\\xe6\\x6e\\xa8\\x06\\x32\\x21\\xe1\\xc8\\x1c\\x05\\x25\\x5b\\xa5\\x64\\xad\\x44\\x0c\\xb5\\xd0\\x7c\\xbd\\x4b\\xab\\x94\\x1e\\xa5\\x93\\x24\\x49\\x30\\xbc\\x5c\\x28\\x9b\\x31\\x65\\xd3\\xec\\x88\\x47\\xeb\\xc4\\xb6\\x74\\xc0\\xa4\\x9f\\x91\\x69\\xad\\xef\\x78\\x6d\\x77\\x67\\xbc\\x8f\\x21\\x3d\\xb7\\xd9\\x5c\\x06\\xe9\\x9b\\xc1\\x1e\\x20\\x00\\x55\\xb6\\x5e\\xb7\\x9a\\xda\\xa0\\x1b\\xcd\\x2c\\x85\\xda\\x43\\xce\\x63\\x70\\xe1\\x2e\\x34\\x9b\\xf6\\xd4\\x75\\x48\\x7a\\xff\\xdf\\x92\\xe2\\x0a\\x3a\\xcd\\xed\\x1d\\x76\\xf9\\xe8\\x3e\\x91\\x9e\\x98\\xde\\xf1\\x95\\x07\\x2a\\x50\\xd0\\xc5\\x71\\xdd\\x25\"},\n{{0xff,0x86,0x21,0x56,0xc7,0xea,0xb6,0x81,0xc9,0x5e,0xff,0xf8,0x00,0x3e,0x00,0xa1,0x4f,0x1f,0x0d,0x50,0x5d,0x55,0x07,0xe6,0xe5,0xb3,0x91,0x79,0xdf,0x9b,0x1c,0xda,},{0xe1,0xb8,0x9f,0xb3,0x11,0x14,0xea,0x46,0x10,0x7f,0xfd,0x03,0x29,0xf1,0x06,0x64,0x28,0xde,0x54,0x70,0x8e,0xdb,0xec,0xf3,0xed,0x9d,0x47,0x08,0xcd,0x14,0x3f,0xe2,},{0x4b,0x81,0x37,0x04,0x2d,0x67,0x84,0x75,0x7d,0x4a,0x9c,0x06,0xbc,0x74,0x32,0xf4,0x80,0x9b,0x1c,0x6a,0x90,0x35,0x42,0x73,0x6d,0x9a,0x57,0x66,0x8c,0x20,0x84,0x5c,0x17,0xd4,0x68,0x55,0x70,0x85,0xc5,0x7f,0xb6,0x32,0x13,0xda,0xd3,0xbe,0x0f,0xa3,0x6a,0x11,0x8f,0x7c,0x1a,0xef,0xf2,0x56,0x2f,0xf4,0xb8,0x88,0x8c,0x26,0x90,0x0e,},\"\\xb3\\xd1\\xdb\\x72\\xa6\\xa9\\x85\\xec\\xd7\\x0a\\x2c\\xff\\x6c\\x18\\xc1\\x79\\xe2\\x17\\xd4\\xf4\\x10\\xfd\\x39\\x34\\x96\\x96\\x85\\x90\\x1b\\xd0\\x71\\xbc\\xe6\\xc2\\xfb\\x67\\x63\\xe1\\x0c\\x6f\\xa1\\x6e\\x75\\xa1\\x17\\x60\\x66\\xb8\\xec\\x81\\xae\\x3a\\x80\\x39\\xe7\\x1d\\xc2\\xcd\\xc6\\x4a\\x40\\xfd\\x62\\xb7\\xce\\xe7\\xbe\\x4b\\xa0\\x33\\x2f\\xe4\\x5d\\x0b\\x60\\x15\\x86\\x52\\xe3\\x3f\\x8d\\x3a\\xff\\x3c\\xb4\\xd6\\xb0\\x21\\x74\\x4d\\x0d\\xd1\\x78\\xb1\\xbf\\x0a\\x1c\\xc1\\xd3\\xfe\\x93\\x21\\xbe\\x28\\x42\\x1e\\xb8\\x82\\x63\\xa1\\x24\\xf4\\x97\\x92\\xd0\\x79\\x47\\x5a\\x8c\\x55\\x5f\\xf5\\x69\\x08\\x73\\x51\\x4b\\x5d\\x48\\x3e\\x53\\x21\\x7e\\x0c\\xbb\\x12\\x86\\x2b\\x85\\x0f\\xe3\\x90\\xc8\\xf8\\x30\\x08\\x08\\x6e\\x64\\x9a\\xc9\\x04\\xb0\\x18\\x35\\x0a\\xb4\\x91\\x57\\xee\\x9b\\xca\\xe6\\xc0\\x7a\\x4b\\x87\\x8b\\x48\\xe2\\x5e\\x98\\x4f\\xbb\\x4d\\x36\\xb6\\x1d\\x68\\x9b\\x13\\x46\\x8a\\x28\\xd1\\xe3\\x87\\xe0\\xe8\\x86\\x57\\xf8\\xc8\\xac\\x95\\x86\\xa6\\xe2\\x6c\\xf9\\x4d\\xff\\x6f\\x82\\x64\\xe3\\xff\\x62\\x58\\x86\\x5c\\x6d\\xcf\\x85\\x7b\\x00\\x14\\x78\\x86\\xe1\\x75\\xdf\\x04\\x32\\xe3\\x2f\\x04\\x40\\x0e\\x29\\x9f\\x21\\x18\\x83\\x12\\xb3\\x2d\\xfc\\x05\\x0e\\x7b\\x7e\\x87\\xee\\xaa\\x0c\\xba\\xac\\x6b\\xe9\\x93\\x7a\\x5e\\x0c\\xc3\\x11\\x13\\xde\\x7c\\x8b\\x23\\x3e\\x1c\\xe8\\xe5\\xd9\\xc5\\x64\\xfb\\xe9\\xf3\\x7b\\xbd\\x41\\x1d\\xf7\\xa5\\xe4\\x4e\\x6c\\x7e\\xbb\\x67\\x6d\\x85\\x89\\x4d\\xcc\\xf4\\x86\\x5e\\x4d\\xda\\x0c\\xad\\xef\\x2b\\xbc\\x55\\x00\\x0b\\x3a\\x29\\xf1\\xf7\\x1e\\xf4\\x46\\x1d\\xdc\\x3b\\x33\\x1d\\x91\\x56\\x65\\x34\\xc5\\xd6\\xd8\\x4c\\x73\\x13\\x76\\x29\\x53\\x20\\xf8\\x0a\\xdc\\x90\\x28\\x8f\\x99\\x53\\x55\\x4f\\xcd\\xf9\\x21\\x3d\\xe6\\xa9\\x05\\x21\\x0d\\x4c\\x80\\x64\\xaf\\x91\\xcd\\x98\\x32\\x5e\\xf9\\x18\\x98\\xd3\\x3d\\x70\\x03\\x82\\x02\\xe3\\x2f\\xb6\\x70\\x9c\\xa3\\xd7\\x88\\xfe\\xcb\\xd1\\xb8\\x41\\xfa\\x4e\\x5e\\x90\\x62\\xd6\\x42\\x67\\xc3\\x5c\\xfd\\x44\\x4f\\xb6\\x9e\\x2f\\x60\\x47\\xf5\\x8b\\x1c\\x2a\\xf4\\xcc\\x7e\\x4c\\xac\\x2f\\x89\\x08\\x88\\x36\\x05\\x92\\x11\\x3e\\x96\\xad\\x3a\\x85\\x7e\\xd0\\x5e\\xaa\\xba\\x6f\\x91\\x53\\xef\\x89\\xb9\\x3e\\x00\\xe8\\x74\\x37\\x33\\xec\\x47\\x2d\\x9b\\x0e\\xec\\x1c\\xd8\\xfa\\x52\\x42\\x5c\\x4a\\x26\\xbd\\x7d\\xf7\\x3a\\x27\\x12\\xbe\\xbe\\x51\\xae\\x3b\\x25\\xeb\\x78\\xdb\\x82\\x14\\x90\\x31\\xfe\\x7b\\x28\\x1a\\xf6\\xcb\\x77\\x14\\xed\\xf8\\x9d\\xe9\\x15\\xf3\\x47\\x0f\\x15\\x3e\\xed\\x7f\\x45\\x62\\x43\\xbb\\x90\\x34\\x2e\\x19\\x0e\\x64\\x7f\\x39\\xe0\\x46\\x88\\x3c\\xe2\\x8a\\x89\\x20\\x03\\x31\\x5e\\xa3\\x79\\x42\\x9e\\x95\\x82\\xa9\\x35\\xeb\\x78\\x96\\x33\\x96\\xd1\\x36\\x84\\x5f\\x86\\xc4\\x66\\xe8\\xfa\\xf2\\x27\\x2f\\x43\\xff\\xef\\xc2\\xad\\xa5\\x60\\x1f\\x8a\\x6b\\x2a\\xc4\\xcc\\x6b\\x92\\x82\\x09\\x17\\xf2\\xe0\\x39\\x3c\\x8f\\xaf\\x98\\x2d\\x6c\\x5f\\x4f\\x23\\x0e\\x27\\xce\\x22\\x78\\xa7\\x23\\x77\\x47\\xfa\\x85\\xa9\\xc8\\x57\\xbf\\x18\\x02\\xc3\\xea\\xe0\\xd2\\x35\\xb5\\xad\\x58\\x49\\x7d\\x66\\xa0\\xd3\\xa9\\xba\\xeb\\xcc\\x41\\x7f\\x18\\x33\\xe9\\xcc\\x44\\x60\\xf9\\x75\\xd7\\x28\\x58\\xcd\\x11\\x8d\\x7a\\xaf\\xaf\\x1c\\x87\\x82\\x97\\xca\\xcf\\x71\\xac\\x75\\x67\\x6d\\xc1\\xb4\\xfb\\x51\\xc1\\x77\\x58\\x10\\xd0\\x35\\x37\\xf2\\xd7\\x66\\x27\\x8b\\x99\\x71\\xbb\\x97\\xd3\\xc4\\x9b\\x51\\xfe\\xb2\\x6d\\x37\\x5e\\x0c\\xb9\\x10\\x95\\x74\\xa8\\x16\\xf8\\x4e\\x76\\xfc\\x7e\\xf0\\x72\\xd5\\x79\\x3c\\x2f\\x65\\xab\\x2e\\xfd\\x90\\x52\\xe6\\xb8\\x56\\x9f\\x28\\x05\\x86\\x1c\\x31\\xa7\\x34\\x4a\\x3c\\x44\\x06\\x9a\\x94\\x32\\x0d\\x27\\x4e\\x27\\x12\\x71\\xea\\xfa\\x3b\\xfe\\x64\\xde\\x75\\x37\\x84\\x6a\\x01\\xe5\\x1f\\xda\\xe0\"},\n{{0x58,0x26,0x19,0xab,0x3c,0xf5,0xa3,0xae,0x77,0x66,0x88,0xbf,0x6d,0xba,0xcb,0x36,0x33,0x0a,0x35,0xad,0x75,0x24,0xe4,0x9e,0xf6,0x63,0x68,0x77,0x64,0xcf,0x6e,0xc7,},{0x20,0x02,0xea,0x0a,0x38,0xa3,0x27,0xe0,0x38,0x4a,0xea,0xe4,0x68,0xdb,0x0f,0x6c,0x85,0x16,0xa6,0x96,0x09,0xaf,0x9e,0xee,0x93,0xe9,0xec,0xb9,0x4b,0x44,0x9c,0x66,},{0xfe,0x97,0x01,0xda,0x1a,0xa8,0x1c,0x55,0xba,0xc3,0x36,0x38,0xf7,0x75,0x54,0x2b,0x80,0x44,0x80,0xf3,0x4b,0x7b,0xfc,0x78,0xda,0x99,0x16,0xe5,0x24,0x6a,0x60,0x4d,0x39,0x0b,0xf9,0x20,0xc8,0x72,0xa7,0x79,0x24,0x24,0x6e,0xe8,0xd0,0x39,0x3b,0x20,0x2e,0x7b,0x25,0xb2,0x48,0x4f,0x65,0x4a,0xc3,0x67,0xcb,0x09,0x25,0xec,0xe3,0x05,},\"\\xca\\x74\\x28\\x4f\\x11\\xc5\\x6e\\x25\\x98\\xd7\\x8a\\x4e\\xcd\\x03\\xb4\\x0e\\x01\\x7a\\x55\\x81\\x76\\x01\\x2b\\x26\\xfd\\xf6\\x95\\xc3\\xde\\x98\\xa7\\x4f\\x8f\\x40\\xa4\\x7d\\x79\\x78\\xed\\xc2\\x4e\\xe8\\x09\\x2b\\xfe\\x5e\\x61\\x59\\x68\\x34\\xde\\xed\\x1d\\x9d\\x34\\xa0\\xf5\\xcd\\xae\\xbe\\x34\\x21\\xaa\\x19\\xe0\\x12\\xde\\x86\\x5b\\x9e\\xe1\\xb7\\x34\\x79\\xb2\\xbd\\x1a\\xc9\\x82\\xf9\\x7e\\xd9\\xc7\\xcd\\x20\\x45\\x9c\\x60\\xfb\\xb1\\x1e\\x1e\\x2b\\x4e\\xac\\x5d\\xb6\\x84\\x4c\\x71\\xd7\\x29\\x49\\x50\\x2b\\xba\\x50\\x3a\\xce\\xc9\\x05\\xad\\xba\\x25\\xf6\\xb1\\x19\\xea\\xf9\\x63\\x9f\\xa8\\xab\\xb3\\x02\\xdf\\xf9\\x93\\x2d\\x85\\x0c\\xc4\\x4c\\x57\\xcf\\x90\\xb2\\xe5\\x8a\\x8b\\x52\\x51\\xc1\\x26\\xa9\\xe2\\x8f\\x5c\\x76\\x1b\\x62\\x80\\xe2\\xcd\\xdd\\x79\\xcb\\xd6\\x8e\\x53\\xff\\x4a\\x62\\x26\\xd3\\xbd\\x4c\\x96\\x1b\\x9b\\x9e\\x43\\x45\\xa2\\x54\\x58\\x62\\xc7\\x97\\x38\\x66\\xf0\\x42\\x0b\\x89\\x8e\\x7b\\xae\\xa9\\x0e\\xa4\\xee\\x00\\x40\\x42\\xef\\x38\\xa1\\xfd\\x95\\x6a\\x72\\xfd\\xf6\\xfd\\x43\\x25\\x7d\\xa9\\xfd\\xb9\\x66\\x80\\xef\\x4f\\xdf\\x9e\\x94\\x3d\\x26\\x5c\\xdc\\xf2\\xe5\\x2e\\x32\\x01\\xd5\\x40\\x8b\\xc6\\xce\\x10\\xe5\\x70\\x0a\\xdf\\x12\\xb5\\x5b\\xa1\\x4a\\xa8\\x29\\xd8\\x69\\x1c\\x31\\xf2\\x4f\\xc4\\xa5\\x1c\\xe6\\xfa\\xa1\\xf3\\xef\\x2e\\xad\\x78\\xe5\\xe7\\x53\\x44\\x6a\\xd3\\xfa\\x4a\\x84\\xc1\\x93\\x97\\x9a\\xeb\\xc8\\x30\\x9b\\xad\\x60\\x81\\x4f\\x48\\x59\\xb9\\x31\\xd7\\x04\\x14\\x76\\x44\\x91\\xc6\\xc9\\xed\\x8d\\xb6\\x73\\xc5\\x43\\xd3\\x51\\x85\\xcd\\x28\\x88\\xaa\\x21\\xc1\\xa9\\x20\\x34\\x27\\xe0\\xac\\x0b\\x1f\\xe3\\x4c\\x0e\\x4a\\x40\\x01\\xe0\\x95\\x6c\\x13\\xcb\\x59\\xa3\\xba\\xf8\\x7c\\x21\\x09\\xa8\\x88\\xa4\\xc9\\xe7\\xaa\\x48\\x17\\x67\\xd8\\x02\\x0f\\xf3\\x5d\\xd7\\xc5\\xcc\\xec\\x7c\\x08\\xe9\\x71\\xa7\\xe2\\x18\\x13\\x8c\\x90\\x54\\x6a\\x7d\\xdf\\x36\\xad\\x11\\x4b\\xe5\\x85\\x57\\x43\\x2c\\x2d\\xdf\\x34\\xce\\xd3\\x37\\x9f\\x70\\xd4\\x40\\x7e\\x58\\x79\\xf9\\x84\\x2f\\x38\\x17\\x17\\x05\\x1b\\x16\\x85\\xaa\\x7a\\xb0\\xad\\x38\\x54\\x1e\\xc1\\x68\\xf5\\x1c\\xb6\\x88\\xf3\\xcd\\x1a\\x01\\x9a\\x33\\x6c\\x9f\\x4f\\x3f\\x82\\xde\\x78\\x5c\\x07\\x48\\x67\\xfd\\xc8\\x80\\x0f\\xc7\\x6f\\xba\\x04\\xc8\\xad\\x8d\\xe1\\x0d\\x2e\\x9b\\x43\\x05\\x81\\xbe\\x44\\xc4\\x1e\\xcc\\x8f\\xc8\\xa6\\x16\\x31\\x43\\x99\\xd1\\x8c\\x64\\x79\\xf5\\x7e\\x57\\x3b\\x22\\xa6\\xee\\x5c\\xe2\\xdc\\xc0\\x89\\x48\\xa0\\xde\\x1f\\x0d\\xd2\\x5b\\x65\\x71\\x5a\\xb1\\x8c\\x70\\xc7\\x62\\xfc\\x3d\\x7d\\x60\\x0c\\xad\\x63\\x22\\x60\\x38\\x50\\x9c\\x19\\xab\\x35\\xb5\\x49\\x3e\\xee\\x73\\xa7\\x03\\x73\\x1e\\xc5\\x35\\xc9\\x0c\\x6f\\x06\\xd9\\x4d\\x3e\\x5f\\x7e\\x51\\xa0\\x9f\\x9f\\x8f\\x42\\xc5\\x01\\xb8\\x50\\x46\\x86\\x36\\x5c\\xee\\xe9\\xe0\\xfe\\x00\\x13\\x29\\xf3\\x03\\x52\\x21\\x46\\x71\\x7c\\x6a\\x12\\x58\\xd0\\xf1\\x57\\xcb\\xea\\x4b\\x5a\\x5e\\x3d\\x13\\xbc\\x90\\x7e\\x95\\xfd\\x6e\\x8a\\x71\\x89\\x6a\\x02\\xc3\\x10\\x6b\\xd2\\x6a\\x51\\x00\\x51\\xf1\\xb3\\x02\\x58\\xab\\x27\\xf8\\x75\\x67\\x3b\\x13\\x37\\xee\\x36\\xb7\\x1a\\x37\\x6e\\x0f\\x9e\\x78\\x09\\xa6\\x7c\\x67\\xd9\\xac\\xc1\\x6c\\x25\\x1d\\xcb\\x8c\\x92\\x6c\\x8e\\x93\\x25\\x16\\xd3\\x8b\\x72\\x33\\xea\\xc6\\x15\\x9c\\x59\\xca\\xd0\\x30\\x7c\\x59\\x0e\\x71\\x31\\xb6\\x22\\x19\\x14\\x5a\\xaa\\x35\\x5b\\xfb\\x4a\\xcb\\x6a\\xf0\\xa5\\x50\\x00\\x06\\xcd\\xd8\\xb8\\x13\\xfe\\x19\\x08\\x60\\x2e\\x08\\x74\\xc9\\x62\\x2b\\xb3\\x76\\x73\\xba\\x1a\\xcb\\xa4\\x14\\x23\\x16\\x67\\xbc\\xc4\\x90\\x7a\\xc8\\x71\\xf8\\x7e\\x6c\\xe3\\xf5\\x91\\xc1\\x91\\x71\\x05\\x7a\\x9f\\x45\\x7f\\x53\\x62\\xae\\xda\\x10\\x5d\\x18\\xfb\\x84\\xf7\\xd0\\xf0\\xa7\\xda\\x7e\\xf8\\xda\\x91\\x14\"},\n{{0x2b,0xbd,0x83,0x0c,0xe7,0xde,0xf3,0xfe,0xce,0xa1,0xec,0xd6,0xea,0x0a,0xe9,0xc9,0xf4,0xfa,0x8f,0xfc,0x3b,0x1f,0x19,0x38,0xc5,0x05,0x05,0x1b,0xab,0x40,0xcf,0x7a,},{0x0f,0xdf,0xed,0x8d,0xe3,0xc1,0xea,0xf8,0x91,0xce,0x37,0xe3,0x4c,0xb4,0xa2,0x44,0x1c,0xbb,0xae,0x08,0x83,0x38,0x3d,0x70,0xde,0x24,0x64,0x85,0x0b,0x4a,0x64,0x2a,},{0x13,0xeb,0xc9,0x79,0xa8,0x87,0x10,0xe3,0xc5,0xf3,0x45,0xcf,0xbb,0x82,0x48,0x13,0xb3,0x08,0xa9,0xd5,0xc6,0xde,0xe3,0x28,0xbf,0xd2,0x35,0xa9,0x7d,0xe7,0xb3,0x26,0xde,0x6c,0x73,0x8f,0x96,0xf6,0x98,0x31,0x94,0x92,0x09,0x99,0x68,0x52,0xdd,0x9c,0x09,0x8d,0x58,0x08,0x41,0x87,0x09,0xf2,0xbf,0x51,0x0d,0x46,0xb7,0xf0,0x36,0x06,},\"\\x5f\\x1e\\xde\\xaa\\x3c\\x0b\\x2a\\x63\\x31\\x1d\\x97\\xf1\\xc5\\x4e\\x7e\\x2f\\x68\\x71\\x70\\xe6\\xb4\\x6e\\x21\\x69\\xcb\\xf5\\x6c\\x66\\xf2\\x31\\xbf\\xc4\\xa5\\x76\\xbd\\x2b\\x84\\x20\\xbf\\x35\\x7d\\x3a\\x90\\xf8\\xf3\\x2e\\xa1\\xad\\x99\\x39\\xb4\\x67\\x25\\x4b\\x66\\xa1\\xdf\\x1f\\x5b\\x4c\\xba\\xc6\\x3a\\x5c\\x27\\x24\\x26\\x0d\\x24\\xd8\\xdf\\x8e\\xdb\\x58\\xae\\x24\\x7a\\x25\\x91\\xe9\\x20\\xb1\\xa4\\x20\\xcf\\x8d\\x85\\x39\\xea\\x57\\xdb\\x0d\\xad\\xff\\x1a\\xd3\\xe9\\x8c\\x31\\x72\\xd0\\x33\\x16\\x3c\\xb4\\x34\\xa7\\x66\\xb0\\xc1\\x18\\xa5\\x6a\\xbd\\xcc\\xe7\\x9c\\x82\\xaf\\x7b\\xac\\x74\\xed\\x0e\\xa0\\x24\\xac\\x4c\\xe0\\x22\\x2d\\x0a\\xa9\\x14\\xf4\\x32\\x09\\x2b\\x1b\\x51\\x78\\x04\\xdb\\x59\\x18\\xa8\\x45\\xe9\\xcc\\xa5\\x5a\\x87\\xdb\\x7c\\x28\\x52\\xf7\\xdd\\x2e\\x48\\x36\\x01\\x85\\xcc\\x44\\x2c\\x79\\x30\\xaf\\xe1\\x5d\\xd6\\x22\\xcc\\x02\\xbc\\xd1\\xee\\x77\\x8b\\x59\\x70\\x5f\\x14\\x33\\x32\\x41\\x58\\x8a\\x52\\x2d\\xe2\\x44\\x07\\xe8\\xe6\\xe1\\x0d\\x5e\\xf3\\xa8\\x8e\\x3a\\x3c\\x44\\x38\\xc1\\x7f\\x75\\x04\\x67\\x4f\\xd7\\xe4\\x18\\xcb\\x2f\\x77\\xad\\x0a\\x56\\xd2\\x38\\x67\\x03\\x15\\x5e\\x9a\\x40\\x1c\\x43\\xdd\\xb5\\x1e\\xad\\x55\\x20\\xaa\\x7b\\xa0\\x38\\xe7\\xde\\x53\\x31\\x41\\x8a\\xd5\\x52\\xbd\\xcd\\x18\\x5f\\x50\\x3a\\x85\\x48\\xf5\\x5b\\x63\\x86\\xe4\\x68\\x7c\\xa5\\x15\\xf7\\xc0\\xee\\xa5\\x70\\x98\\x3b\\xfb\\x24\\xbe\\x16\\xf7\\xb3\\x00\\x3f\\xb7\\x56\\xe3\\x26\\x56\\x2f\\x2a\\x32\\xfe\\x65\\xff\\x84\\x4c\\x39\\x84\\xc7\\x2e\\x40\\xdd\\x49\\xe4\\xf3\\xae\\x8c\\x0f\\x81\\x9a\\x79\\x39\\xb2\\xe7\\x36\\xe3\\x81\\xf5\\x82\\x3c\\xbc\\x61\\xb2\\xed\\x01\\xd9\\xb0\\x5c\\xf8\\xb1\\x46\\x48\\xa4\\x8b\\x0d\\x7c\\xbe\\x88\\x2a\\xc1\\x6c\\xad\\xd8\\xc4\\x2a\\xa2\\xc7\\x02\\x46\\x34\\x7b\\x4d\\x84\\x95\\x36\\xa7\\xac\\x22\\xc7\\x20\\xda\\x3c\\xf1\\x78\\x72\\x5e\\xe5\\x57\\xa9\\x2c\\x25\\xb1\\x2b\\x8b\\x95\\x6d\\x3b\\xf4\\x80\\x2e\\x9e\\x8a\\x15\\xb5\\xab\\x75\\x42\\x35\\xcc\\xa0\\xe5\\xb7\\xe5\\x5e\\x4a\\xec\\xe4\\x5a\\x47\\xe0\\x84\\xce\\x14\\x47\\x44\\x05\\x98\\xef\\x5d\\x4f\\x5f\\xdc\\x2c\\x98\\xa5\\xad\\x13\\x6c\\xff\\xbf\\x87\\xd3\\xcf\\x52\\xf6\\x73\\x8c\\xca\\x79\\x48\\x35\\x60\\x92\\x07\\x8f\\xdf\\x25\\x45\\x77\\xf5\\x59\\x69\\xa0\\xc6\\x52\\x46\\xda\\xc8\\x09\\xa2\\xfc\\xa1\\xf6\\x0a\\x1d\\x92\\x98\\x77\\xb9\\xa6\\x54\\x0e\\x88\\xa9\\xe6\\xe9\\x15\\x59\\x38\\xd2\\x2c\\x68\\x7e\\x63\\xb3\\x87\\x53\\x4d\\x38\\x5e\\x89\\x61\\xe5\\x88\\x67\\x43\\xf9\\x5f\\x4a\\x70\\x80\\xd9\\x16\\x62\\x45\\x17\\xb1\\x53\\x36\\x03\\x0a\\x46\\x71\\x4b\\x16\\x8b\\x83\\xd6\\xf9\\xcc\\xe0\\x60\\x66\\x49\\xc0\\x1f\\x0a\\x1d\\x0a\\x2a\\x53\\xf5\\xe3\\x78\\xf6\\xaa\\x98\\xc3\\x84\\xaa\\xfb\\x3e\\xef\\xdb\\x34\\x21\\xfa\\x3a\\xc9\\x8a\\x0d\\x3a\\x9c\\x02\\x9c\\x23\\x00\\xae\\x02\\x41\\x06\\x7d\\x1a\\x4f\\xc9\\x2e\\x43\\x86\\x88\\xea\\x88\\x9f\\xcb\\x1a\\x1a\\x9e\\x86\\x34\\xb9\\x16\\xc6\\x0b\\xaa\\x0c\\x18\\xbf\\xcd\\x13\\x9b\\xfe\\x30\\x17\\xbf\\xbe\\x16\\x29\\x13\\x43\\xce\\x86\\x05\\xbb\\x78\\x72\\x55\\x8c\\x6b\\x5f\\xd5\\x6d\\xfd\\x22\\x15\\x77\\xed\\xcf\\xfa\\xa8\\xbd\\xa3\\x4d\\x7a\\x11\\xab\\x8c\\xb2\\x78\\x28\\x8e\\x58\\x34\\x84\\x26\\x76\\xfc\\xcf\\xfa\\xa9\\x11\\x1b\\xce\\xd2\\xb3\\x57\\x5f\\xdd\\x49\\x62\\x1b\\x76\\xe8\\xd1\\x29\\xb6\\x17\\x00\\xee\\xab\\x03\\x14\\xef\\x94\\xd5\\x50\\x50\\x6a\\x4b\\x8d\\x1e\\xe6\\x55\\x08\\xd8\\x9d\\x0e\\x99\\xe9\\x33\\x6b\\x41\\xd9\\xf7\\x4a\\xa4\\xd7\\x22\\x11\\x4d\\xe0\\xf3\\x1e\\xcf\\x00\\xb0\\x97\\xf5\\x3c\\x9a\\xca\\x9c\\x7a\\x28\\x5b\\x58\\xa3\\x5d\\x70\\x29\\x8c\\x5c\\x34\\xf7\\x4b\\x4a\\x70\\x53\\x08\\x03\\x31\\x00\\x34\\x9f\\x0c\\x62\\xf9\\xc2\\xeb\\xf7\\xde\\xad\\x0a\\x77\\xb2\\x98\\xeb\"},\n{{0x1a,0x7a,0x3c,0x2f,0x54,0x81,0x13,0x1b,0xe5,0xf8,0x68,0x45,0x6a,0xa2,0xfa,0x90,0xe5,0x6d,0x52,0xcb,0x72,0x1c,0x71,0x84,0xeb,0xff,0x06,0xfe,0xd2,0xfe,0x68,0x5d,},{0x7c,0x2a,0xd0,0xf2,0xa5,0x70,0x55,0x03,0x26,0xfb,0x50,0xa8,0x50,0x83,0x58,0x21,0x67,0x6d,0xe1,0xde,0x12,0x7f,0x6d,0xe1,0x67,0x02,0x99,0xd8,0x14,0xf6,0xe3,0xce,},{0x97,0x61,0x60,0xfb,0x5b,0xbd,0xab,0xe5,0xc8,0x96,0x2f,0x23,0xba,0xba,0xcf,0x0b,0x0a,0xb4,0x1c,0x2b,0xb1,0x3e,0x9c,0x0d,0x44,0x90,0x67,0xb7,0xde,0xcc,0x7d,0xb4,0xe9,0x4e,0x76,0xa7,0x1b,0x9c,0x0a,0xc4,0xd6,0xaf,0x38,0x7a,0x72,0xa8,0xcd,0x73,0xe3,0xbc,0x63,0xb7,0xed,0x65,0x0b,0xee,0xbf,0x17,0x42,0x4c,0x49,0x0b,0xd6,0x0d,},\"\\xc6\\x28\\x34\\xd9\\xd5\\x5d\\x1a\\x44\\x03\\xe9\\x25\\xd0\\xa5\\xb5\\x52\\xda\\x17\\x4c\\x02\\xf4\\xe9\\x45\\xde\\xc3\\x38\\xc1\\xbb\\xb2\\xae\\xb4\\xff\\x40\\x02\\x0e\\xf7\\x0f\\xf5\\x05\\x20\\x5c\\xf8\\x81\\xb6\\x29\\x96\\x0a\\xbd\\x62\\x76\\x4e\\x5a\\x54\\xf2\\xb5\\x10\\x56\\x67\\xb1\\x1c\\x7d\\x5b\\x7a\\x4c\\xcc\\x3f\\x48\\x8b\\xdd\\xdb\\x95\\x8a\\x7b\\xe9\\x54\\x62\\x07\\xe6\\xc4\\x67\\x18\\x97\\xc0\\x53\\x50\\x8e\\x1f\\xd8\\x32\\x22\\x13\\x0a\\x79\\x33\\x97\\x6d\\x2b\\xec\\x61\\x4e\\xd8\\xf9\\xb6\\xa6\\xb9\\xf4\\xef\\xb2\\xa5\\x8b\\x9d\\x00\\x5b\\x94\\x3e\\x42\\xf1\\x71\\xb7\\x09\\xa7\\x31\\x30\\x70\\xcb\\x2e\\x06\\x8d\\xa3\\x9c\\xf9\\x99\\x22\\xb6\\x9e\\x28\\x5c\\x82\\xad\\x97\\xf2\\xd6\\xc7\\x79\\x22\\xca\\xe2\\xb5\\xe3\\x20\\xe8\\x35\\x77\\xc0\\xd0\\x88\\x76\\x1e\\xc8\\x81\\x52\\xc2\\x97\\x49\\x29\\x78\\xa9\\xd7\\xa3\\xff\\x67\\xed\\xe4\\x4c\\x2a\\x70\\x7c\\xf3\\xe2\\x35\\x2e\\x23\\x2f\\x53\\xc8\\x78\\x2b\\xa4\\x89\\x28\\xa9\\x7f\\x8a\\x36\\xb2\\x0a\\x41\\x68\\x16\\xe9\\x45\\x79\\xb9\\xd7\\x25\\x0a\\x29\\xdc\\x84\\x70\\xf6\\x3a\\x70\\x58\\xe2\\xd2\\xa9\\x9d\\x6f\\x0c\\xcb\\x53\\x0d\\xf5\\x96\\x95\\x05\\xef\\x5c\\x78\\x44\\xeb\\x16\\x7d\\x20\\xf4\\x12\\xa5\\x08\\xfa\\xb1\\xf8\\xcd\\x9c\\x20\\xc5\\xeb\\x9a\\x41\\x7a\\x54\\x12\\xb5\\xda\\x6a\\x57\\x13\\x57\\x59\\xfa\\xb1\\x7f\\x63\\x14\\xf6\\x8d\\xf3\\x5b\\x17\\x72\\x42\\x14\\x43\\x67\\x6f\\x31\\x25\\x79\\xaf\\x6b\\x14\\x11\\x53\\x5a\\xda\\x8f\\x76\\x01\\x2b\\x69\\xbb\\xeb\\x60\\xb2\\x89\\x7e\\xe6\\x60\\x7c\\xb3\\x69\\xcd\\xf5\\x2f\\x4f\\x6d\\xdf\\x88\\xcd\\xb2\\x63\\x0d\\x78\\x89\\x6f\\x13\\x61\\xfe\\xa2\\x2a\\xe6\\x34\\x21\\x76\\x96\\xff\\x11\\x4f\\xb4\\x2d\\xbe\\x4f\\x43\\x46\\xf1\\xbe\\x5b\\x57\\xad\\xb3\\x84\\xae\\x7e\\x49\\xb4\\x1f\\x74\\xb3\\x1b\\x9a\\x62\\xbc\\x69\\xdc\\xa1\\x65\\x89\\xc6\\x34\\xeb\\x9d\\x7c\\x6c\\x94\\xf8\\xec\\xe4\\x4b\\x60\\x62\\x8f\\x98\\xe1\\x02\\x4c\\xf3\\x2e\\x3e\\x3d\\xd6\\xdc\\xe5\\x5a\\x12\\x22\\x53\\x2f\\x49\\x0d\\x63\\xe6\\xa2\\x75\\x28\\x1c\\x0f\\x3a\\x6c\\x10\\x18\\x91\\xb8\\xd5\\x7a\\x45\\xde\\x11\\xde\\x35\\xeb\\xb1\\x51\\xc0\\xdc\\xd7\\x5e\\x6c\\x05\\x0b\\x3c\\xd8\\xba\\xba\\xe8\\x45\\xc3\\x9f\\x66\\xc3\\x6c\\x77\\xcd\\xe0\\x5b\\x68\\x3e\\x4f\\xb0\\x10\\x3d\\x93\\xe7\\x65\\x93\\x35\\xc8\\x7f\\xc0\\xe3\\x23\\x5b\\x2e\\x82\\x48\\x8c\\xda\\xbe\\xb5\\xc5\\xc8\\x75\\x80\\x87\\x45\\xee\\xa9\\x2d\\xe8\\x6b\\x8e\\xfc\\xb6\\x3e\\x16\\xd0\\x82\\x91\\x9a\\xee\\x2e\\x92\\x89\\x9c\\xb0\\xbc\\xf1\\xc1\\x42\\x15\\x77\\xa4\\xa0\\xd9\\xdb\\x09\\xee\\x1f\\x9f\\xeb\\x92\\xa5\\x38\\x21\\x03\\xcf\\x7c\\x32\\xcf\\xe4\\x63\\x72\\x5a\\xe4\\x86\\x6d\\xaa\\xfe\\xda\\x05\\x34\\xc1\\x69\\xf8\\xf9\\xbe\\x40\\x4f\\x3b\\xaa\\xe1\\x23\\xfa\\x76\\x8a\\xce\\x46\\x17\\x8d\\x4b\\x9b\\xbc\\x5b\\xd7\\xae\\xec\\x79\\x03\\xb0\\xa5\\xbc\\x57\\x53\\x89\\x86\\xee\\x09\\xe0\\x7e\\x32\\x07\\x7b\\x3b\\x9d\\xe5\\x0d\\xd1\\x96\\x7a\\x37\\x2c\\x38\\x5a\\xc8\\x86\\x28\\x7c\\x18\\x45\\x1a\\x64\\xef\\xb3\\x7d\\x05\\x6f\\x9f\\x41\\x94\\xc0\\x8b\\x1e\\x3e\\xc9\\x70\\x22\\x26\\x7b\\xf0\\x04\\x3c\\x13\\xd2\\x6b\\x9c\\xe1\\xf5\\x39\\x05\\xf6\\xe4\\x1b\\x3d\\x99\\xdc\\x81\\xb3\\x31\\x90\\x9b\\x72\\x26\\x66\\xef\\x24\\x32\\xe6\\xaf\\x8a\\x45\\x31\\x07\\x53\\x12\\x30\\xce\\x4a\\x1a\\xf8\\xee\\xd6\\x26\\xda\\x22\\x3d\\xa7\\x6b\\x46\\x50\\x7e\\x33\\xd7\\xcd\\xbd\\xe0\\x2d\\x41\\x10\\x40\\xc8\\x9a\\x11\\xd9\\x51\\x56\\xed\\x4a\\xc2\\x60\\x5b\\x82\\x69\\x39\\xc6\\xcf\\x87\\x7b\\x4e\\xe7\\x36\\xc5\\xda\\x77\\xcf\\x46\\x50\\xa9\\x99\\x7a\\x3b\\x9c\\xf4\\x6a\\x82\\xba\\x2b\\xc0\\x13\\x33\\xc0\\x44\\x78\\xb5\\xc9\\x2e\\x24\\x98\\xbd\\x00\\x2f\\x01\\x31\\x40\\xae\\xdb\\x30\\x1b\\x95\\x99\\x3d\\x1d\\x75\\x08\\x70\\xd9\\x88\"},\n{{0x19,0x1a,0x1d,0x90,0x32,0x1c,0x7f,0x4e,0x74,0x94,0xbb,0x98,0x29,0x09,0xa9,0xeb,0x40,0xc3,0x34,0x1d,0xd3,0x2a,0xe4,0xd9,0x67,0x50,0xb7,0xd0,0x29,0x66,0xb4,0x0f,},{0x95,0x62,0xd9,0xe2,0x13,0xf1,0x45,0xc4,0x56,0x93,0x5b,0x70,0x31,0xc6,0x80,0x66,0x9f,0x8b,0xbd,0x31,0xa4,0xc2,0xed,0x3c,0x91,0xc4,0x00,0x2a,0x56,0x29,0xe9,0x7b,},{0x74,0xcb,0x02,0x8d,0xc6,0xb7,0x5b,0x37,0xa1,0xda,0xea,0x1c,0xf8,0x84,0x65,0xdb,0x83,0xa0,0x09,0x3f,0xec,0xb2,0x2d,0x99,0xba,0x85,0x5e,0x9a,0xb5,0x9d,0x05,0xcb,0x22,0xc8,0x7d,0x0b,0x09,0xdf,0x7c,0x11,0x62,0x13,0xba,0xa8,0xf1,0x89,0xb2,0x70,0x3f,0xf9,0x53,0xcd,0x20,0x2e,0xb9,0xde,0xa3,0x97,0x6e,0xe8,0x8f,0x5f,0xa7,0x03,},\"\\x85\\x89\\x0d\\xb4\\xe2\\xfb\\xce\\x09\\x3d\\xde\\x5a\\x80\\xbf\\x8f\\xe0\\x9a\\x98\\x4b\\x83\\xa4\\x9b\\x7c\\xcb\\x5d\\x4b\\x06\\xcd\\xaf\\xdd\\xd3\\x82\\xe4\\xb8\\xa8\\xa5\\x05\\x30\\xe8\\x2c\\x20\\x06\\x12\\xc9\\xd7\\xd8\\xa0\\x89\\xbc\\x8a\\xa8\\x45\\xc3\\xcf\\xcc\\x38\\xa6\\x19\\x5d\\x21\\xc2\\x61\\x8c\\x3d\\xba\\x2b\\x57\\x09\\x20\\xec\\xcf\\xcd\\x23\\x6f\\x17\\xf0\\x8d\\x81\\x42\\x68\\xf8\\x82\\x24\\x2d\\xdf\\x07\\x02\\xda\\x87\\x85\\xf4\\x07\\xaa\\x8f\\x86\\xfe\\xcf\\xa9\\x03\\xc4\\x8d\\xa8\\x3f\\x83\\x97\\x77\\xeb\\x6b\\x4a\\x2b\\xbf\\x5d\\xf7\\xa4\\xda\\x53\\x47\\x5a\\xf1\\xff\\xe4\\x4b\\x5f\\xe0\\x07\\x2b\\x8f\\xbf\\x3d\\x26\\xe6\\xd8\\x9e\\xa6\\x7d\\x8a\\xc8\\x45\\x94\\x92\\x89\\x0a\\xda\\x65\\x7e\\xb3\\xdc\\x24\\x92\\xb8\\x8d\\xe1\\x75\\xb4\\xbb\\xa1\\xa5\\x08\\x06\\x4d\\x61\\x96\\x74\\xaa\\xae\\x2a\\xf0\\x9d\\x31\\xa5\\xc2\\x7c\\x8d\\x5d\\x5a\\x29\\xb0\\x37\\x79\\xf4\\x28\\x6b\\x89\\x66\\xce\\x40\\x7e\\x6f\\xf6\\x92\\xfb\\x94\\x25\\x20\\xa9\\x93\\x8d\\x69\\xcc\\x70\\xac\\xb0\\x6b\\x01\\x4b\\x6d\\xfc\\x19\\x83\\x42\\x06\\xcf\\x1a\\xc6\\xc4\\x48\\xae\\x6f\\x07\\x80\\x25\\xb5\\x5f\\x3d\\x82\\x72\\x01\\x26\\x8a\\x92\\xad\\xd9\\xad\\x17\\x8e\\xf7\\x6a\\x29\\x89\\xfe\\xdc\\x6e\\x39\\xf4\\xeb\\xb9\\xf9\\x6c\\x9b\\x83\\x52\\x69\\x4f\\xa5\\x4f\\xa0\\x22\\x01\\x9c\\x0e\\xc0\\x01\\x2d\\x0d\\x76\\x9e\\x23\\x67\\x80\\x3f\\x92\\x5f\\x17\\x5f\\x9f\\xb9\\xcb\\xec\\x4a\\x0c\\x9c\\x1e\\x2c\\x83\\xea\\x57\\xe6\\xa9\\x2a\\x17\\xf5\\x55\\xca\\xb9\\x34\\x27\\x1e\\x72\\xc8\\xcc\\x32\\x15\\xfc\\xb8\\x7c\\x20\\x53\\x9b\\xf1\\x42\\x77\\xb1\\xbf\\xbd\\x6e\\x58\\x80\\xef\\x95\\x3f\\xc7\\x5f\\x23\\xc0\\xdd\\x4f\\xcc\\x1e\\x0b\\xe3\\x40\\xaf\\x94\\x7d\\xe0\\x2e\\x87\\x7f\\xd5\\xc7\\x7d\\xd1\\xdf\\x7b\\x41\\x4b\\x5c\\x0b\\x40\\xc7\\x49\\x56\\xa5\\x45\\xa1\\x15\\xb0\\xc6\\x99\\x3a\\xb2\\x33\\xb7\\xe7\\x2c\\x82\\x2b\\x6b\\x33\\x81\\xbb\\x1f\\xc1\\x08\\x75\\xbf\\xfe\\x3e\\x2e\\xd1\\x19\\x0f\\xa3\\x3f\\xc1\\x5d\\xa0\\x83\\x79\\x4f\\xcc\\x2c\\x5b\\xf5\\xa0\\x79\\x09\\x06\\x3c\\xb2\\x89\\xa0\\x8a\\x2c\\x8a\\x33\\xd3\\x43\\x84\\x2c\\x2d\\x6a\\x3c\\xfa\\x2a\\x16\\xca\\x2e\\xaf\\xca\\xb7\\xea\\x10\\x0d\\x1c\\x71\\x4b\\xaa\\xbb\\x71\\x49\\xf0\\x7e\\x25\\xde\\xe3\\x23\\xe7\\x80\\x75\\x7d\\xfa\\x80\\x16\\xfa\\xa7\\xc0\\x62\\x62\\x22\\xc3\\x65\\xf8\\xf2\\xf6\\x68\\x7d\\x1d\\xed\\x23\\x4f\\x79\\x9c\\xc5\\x0d\\x1c\\xd2\\x6b\\x4c\\xfa\\x40\\x45\\x91\\x70\\x56\\xfc\\x79\\xc3\\xb8\\x8b\\x2b\\x19\\x08\\xe3\\x72\\xdf\\x66\\xda\\xc8\\x73\\x46\\x31\\x64\\x83\\x49\\xbc\\x37\\xfa\\x34\\xb2\\x5f\\xff\\x3b\\x07\\x47\\xb6\\xbc\\x16\\xb9\\x4e\\x3e\\x58\\x95\\xe4\\xbb\\xd9\\x3d\\x47\\x8a\\x6c\\x1f\\x75\\xe4\\xfa\\x30\\xfa\\xa9\\x22\\x04\\x9e\\xd4\\xc5\\x0f\\x12\\xf4\\xb3\\x12\\xa8\\x97\\x4d\\x0f\\xed\\x8d\\x44\\x25\\x5d\\xcb\\x2b\\xf0\\xfe\\xbe\\x47\\xfb\\x3f\\xb8\\xed\\x99\\x03\\xb5\\xba\\x4c\\xa1\\x8e\\x3c\\xc6\\x76\\x2c\\xfa\\x1e\\xaf\\x04\\xdf\\xa9\\x44\\xd4\\x96\\xe0\\xfe\\x8b\\xb7\\xdc\\x04\\x54\\x51\\x39\\x6b\\xfa\\xba\\x54\\x85\\xd9\\xd5\\xf3\\x91\\xa9\\x54\\xc3\\x71\\x42\\x53\\xcc\\xd9\\xb1\\x99\\x64\\xd4\\x28\\x06\\x80\\x72\\x07\\x83\\x03\\x6b\\x3a\\xbf\\xaf\\x28\\x84\\x58\\x3e\\xa5\\xbd\\xbc\\xf6\\x9d\\x08\\x89\\x7a\\xb2\\x88\\x31\\x46\\x35\\xab\\xb4\\xc2\\x96\\x4b\\x71\\xad\\x92\\x91\\xfe\\xb5\\xb6\\x1f\\x80\\xe9\\xb0\\xcc\\x07\\xf9\\x12\\xa8\\xe5\\x59\\x8d\\x55\\x48\\xde\\xfe\\x0e\\xea\\x1c\\x44\\x85\\x73\\x71\\x0a\\xac\\xdd\\xb1\\x52\\xf9\\x3c\\x7c\\x6f\\xd3\\xf7\\xe4\\xed\\x9f\\x74\\x42\\xa6\\xb9\\x00\\xf2\\x3c\\x3c\\x54\\x4c\\xe5\\xc9\\xba\\x5f\\x5e\\x92\\xaa\\xfd\\x11\\xc9\\xff\\x5f\\x79\\xc0\\x8b\\x9d\\x04\\x5f\\xef\\x07\\x97\\x06\\x25\\xf6\\x2e\\x2f\\x43\\x34\\xa4\\xd6\\x64\\xca\\xf7\"},\n{{0x62,0x85,0x63,0xaa,0x3e,0xe2,0xfc,0x61,0x1b,0xcf,0xf7,0x8b,0xfb,0x2a,0x75,0xe9,0xfd,0x87,0x80,0xe8,0x7a,0x93,0x94,0x99,0xa6,0x1b,0xea,0xa6,0xa4,0xb7,0x19,0x13,},{0xda,0x20,0x61,0x6e,0xe4,0xa4,0x1c,0x2e,0xbf,0xdc,0x50,0xab,0x54,0x95,0x3b,0x6d,0x38,0x7b,0x06,0xc6,0xde,0xf7,0x57,0x96,0xb0,0x88,0x09,0x56,0x5c,0x6c,0xf8,0x05,},{0xc9,0xa6,0xaa,0xa9,0xb4,0xe1,0xcc,0xe1,0xb5,0x84,0x45,0x72,0x5f,0x61,0xf5,0x52,0xc8,0xfb,0x45,0x83,0x1f,0x03,0x48,0x27,0x98,0xf0,0x1f,0x66,0x3e,0x99,0x83,0xdb,0x1a,0x82,0xfd,0x33,0xab,0xa3,0xec,0xcb,0x96,0x22,0x64,0x26,0xd5,0x0a,0xe1,0x7c,0xc5,0x12,0x74,0xce,0x18,0xa3,0x88,0x60,0xf4,0x0b,0x2f,0x82,0x36,0x1b,0x5c,0x03,},\"\\x05\\x6f\\xb9\\x54\\xfb\\xe6\\xa6\\x01\\x4f\\xad\\xac\\x1e\\x1a\\x9f\\x56\\xcc\\x08\\xaf\\x37\\x34\\x8e\\xba\\xf6\\x92\\x06\\x83\\x38\\x4e\\xfa\\x47\\x62\\x6c\\xcd\\xdf\\xea\\xd2\\xd5\\xe9\\xe8\\xcf\\xff\\x45\\xf7\\xac\\x63\\xde\\x63\\xf6\\x9d\\x12\\x84\\x8c\\xe3\\xc0\\xef\\x1f\\x53\\x0a\\xde\\x43\\x0f\\x0a\\xfd\\x5d\\x8e\\xcf\\xd9\\xff\\xd6\\x0a\\x79\\x74\\x6a\\x2c\\x5b\\xee\\xdd\\x3e\\x67\\x24\\x99\\x82\\xf8\\xb6\\x09\\x2e\\xe2\\xd3\\x40\\x47\\xaf\\x88\\xa8\\x1f\\xea\\xb5\\xd5\\x2b\\x47\\xd5\\xb3\\xf7\\x6c\\x20\\x41\\x72\\x5f\\x6f\\x81\\x32\\x93\\x05\\x0a\\xaa\\x83\\x4b\\x01\\xa3\\xa5\\x8f\\x69\\xaa\\x4a\\x8c\\xa6\\x1f\\x5b\\x74\\x6f\\x60\\x0f\\x3d\\x45\\x2c\\x62\\x82\\xff\\xdc\\xa4\\x42\\x9b\\x93\\x38\\x96\\x7b\\xa3\\xa7\\x26\\x66\\x90\\xae\\xc7\\x5e\\xbf\\xbf\\x7b\\xe9\\x8d\\x99\\x9b\\x03\\xed\\xdc\\x72\\x92\\x58\\x1b\\x0d\\x69\\xe3\\x0a\\x03\\x51\\xa1\\x51\\xdb\\x70\\x41\\x2b\\x0b\\xfd\\x43\\xd3\\xba\\xa9\\xd4\\x56\\xcb\\x3e\\x0b\\x4f\\xc1\\x9c\\xb0\\x9e\\x6c\\xad\\xcb\\x6d\\x3f\\x3b\\xe5\\x13\\x7c\\xc7\\xa8\\xd3\\x21\\x9e\\xc2\\x03\\x6e\\xc6\\x70\\xed\\x7e\\xc5\\x23\\xb1\\xb1\\xc6\\x87\\xb5\\x46\\x53\\x07\\x88\\x2f\\xe3\\x8d\\x74\\x72\\xd0\\xba\\x87\\xa4\\x71\\x86\\x83\\x09\\xd2\\xf7\\x73\\xff\\x24\\xc8\\x7d\\x39\\xc1\\x6b\\x70\\x8a\\x4e\\xd9\\xaf\\x43\\xf7\\x4c\\x8d\\x85\\xcf\\xe8\\xab\\x54\\x06\\x90\\x7e\\x94\\x1a\\x14\\x97\\x0e\\x20\\x9c\\x29\\xff\\x7e\\xd8\\xa2\\xf9\\x35\\xae\\x41\\x70\\x9f\\x27\\x0d\\x0d\\x08\\x55\\x5e\\xf7\\xaf\\x2e\\xdf\\xe4\\x0d\\xf3\\x99\\x22\\x3c\\x78\\x5a\\x43\\xe7\\xf3\\x69\\x15\\x89\\xe2\\xea\\x4c\\x03\\x6f\\x11\\xd0\\x3d\\x7d\\x1e\\xea\\x14\\xf6\\x20\\x03\\x53\\x25\\xcf\\x2b\\x33\\xba\\xf3\\x86\\x39\\x3e\\x8a\\x97\\x2a\\x7a\\xf6\\xcd\\x9b\\x85\\x43\\xb3\\x2e\\x25\\x33\\xd1\\xfc\\xc3\\x17\\x7f\\xd9\\x6d\\x1e\\x13\\xbf\\x8b\\x68\\xde\\xb2\\x22\\xf9\\x44\\x97\\x26\\x5d\\x3c\\xcb\\x34\\x57\\x51\\xbd\\x5b\\x66\\x90\\x78\\x08\\x19\\x98\\xd6\\x08\\xca\\x5f\\xdc\\x13\\x48\\x39\\xd4\\xed\\x2b\\xeb\\xb2\\x95\\x2f\\xea\\x5a\\x39\\xc6\\xf0\\x33\\xc1\\x55\\x8f\\x69\\x8c\\xe4\\x94\\x6e\\x4f\\x6c\\x08\\xaf\\x87\\x4f\\x27\\x35\\x7f\\x87\\x0e\\xbe\\xeb\\x21\\x99\\x97\\x6f\\xfa\\xef\\xac\\x95\\x1f\\x8e\\x17\\xfe\\x7d\\x08\\x21\\xe1\\xb9\\x2a\\x90\\xaa\\x4e\\x9d\\xef\\xd3\\xfa\\xfd\\xa0\\x52\\xa4\\x44\\x47\\x6d\\xb1\\xce\\x38\\xa9\\xe1\\x76\\xe8\\x41\\x18\\x9a\\xbd\\x8f\\xec\\xde\\x0f\\xbc\\x5c\\xb5\\x5f\\x51\\x1f\\x5f\\xde\\x07\\xea\\x97\\xde\\xb3\\x9b\\x7a\\xa8\\xdc\\x84\\xa3\\x94\\x6a\\x6c\\xf9\\x26\\xd3\\x9b\\x95\\xc1\\x1a\\xf9\\xd6\\x4d\\x98\\xb8\\x07\\xf4\\x70\\x4d\\x0a\\x2b\\xda\\x97\\xda\\xd9\\x88\\x1a\\xda\\x1b\\xf6\\x63\\x63\\x66\\xe6\\x0a\\x52\\x2b\\x48\\x21\\x04\\x78\\x61\\xc7\\xaa\\xe2\\x14\\x6a\\x02\\xee\\xf6\\xb2\\x5d\\x51\\x37\\x1a\\x0f\\x17\\xd2\\x4b\\xc1\\x87\\xdc\\xdd\\x05\\xd5\\x41\\xc2\\xf7\\x22\\x01\\x42\\x79\\x15\\xa3\\x92\\x8c\\xd3\\x78\\x68\\x91\\x03\\xac\\x50\\xb3\\x3f\\x87\\xa4\\x7e\\x8c\\xdf\\xa6\\x87\\xa5\\xf0\\xaf\\x8a\\x56\\x73\\x1d\\xab\\xe6\\x62\\xf4\\xf2\\x83\\x6d\\xe0\\xba\\x8f\\xaf\\xd8\\x6a\\x38\\x54\\xbc\\xa0\\x12\\xd7\\x08\\x8a\\x00\\xb9\\x85\\x4c\\x2d\\x3c\\x70\\x8d\\xdf\\x58\\xfa\\xa3\\x55\\xa8\\x9a\\xfc\\x2c\\x80\\xf3\\xf5\\x33\\x6d\\xa0\\x1d\\x72\\xa2\\x77\\x1a\\x05\\x58\\x13\\xfb\\x35\\x33\\x0f\\x7d\\x2e\\x01\\xb1\\xd1\\x2d\\xaa\\x95\\xed\\x55\\xd3\\xbd\\xc5\\xdf\\x77\\x39\\xcb\\xc3\\xca\\x09\\x7a\\x41\\xb6\\xb2\\xbd\\x7f\\x0f\\xf9\\xdd\\x1d\\x86\\x58\\x98\\x3b\\xa3\\xff\\x79\\x20\\xc1\\x5f\\x29\\x2a\\x1e\\xf9\\xfc\\xad\\xa1\\xc6\\x07\\xec\\xb4\\x5d\\x3a\\x73\\xc9\\xff\\xd4\\x2f\\x3e\\x16\\x02\\x2f\\xdf\\xe1\\x27\\x44\\x92\\x63\\x95\\xf7\\x4f\\xb3\\x11\\x17\\x93\\xfa\\x92\\x81\\x82\\x1a\\x66\\xa0\\x1d\"},\n{{0x91,0x41,0xf7,0x9e,0xd3,0x0b,0xf6,0x00,0x61,0x1a,0x13,0xf3,0x67,0xb4,0x03,0x96,0xf2,0xec,0x83,0x9c,0x56,0x12,0xbb,0xf1,0xe6,0xe4,0x97,0xf8,0x39,0x54,0xbc,0x88,},{0xf1,0x4e,0xda,0x96,0x26,0x40,0xbe,0xcb,0x66,0xc4,0xd1,0xf1,0xa0,0x21,0x11,0x02,0x51,0x91,0x7b,0x8b,0x1d,0x34,0x82,0x82,0x98,0xd3,0x21,0x45,0xba,0xf6,0xe5,0xd9,},{0xcf,0x20,0x2d,0x7f,0x2f,0x9e,0xd1,0x17,0xf4,0x29,0x50,0x2b,0x2a,0x5a,0xff,0x54,0xa7,0xf7,0x51,0xd2,0x17,0x15,0x15,0xa4,0xd2,0x03,0x75,0x34,0x46,0xdf,0x0e,0xba,0xc8,0x69,0x84,0xc8,0x8b,0xd4,0x2b,0xd1,0xfb,0x8d,0xcb,0x40,0x87,0x76,0x72,0x2a,0x38,0xf3,0x2c,0xce,0xb2,0x5f,0x32,0xa2,0x5d,0x73,0x93,0xf1,0x38,0xee,0xdf,0x0a,},\"\\x8f\\xec\\xaa\\x7a\\xe9\\xa3\\xd4\\xa4\\x85\\x1a\\x66\\x36\\x2b\\x36\\x6e\\x16\\x7b\\x9f\\x43\\x00\\xfd\\xab\\x20\\x56\\x54\\x75\\x19\\x87\\xf0\\x85\\xde\\x61\\xbe\\xc9\\x34\\x4a\\xa8\\x6f\\x5e\\x5c\\x64\\x77\\x51\\x4c\\x28\\x04\\xce\\xd7\\xac\\x0c\\xd0\\x62\\x85\\x29\\xa3\\xa1\\x59\\x92\\x36\\xed\\x67\\xbe\\xbe\\x1f\\x2e\\x95\\xaa\\x15\\x1f\\xe0\\xf3\\xb3\\x01\\x1a\\x1d\\x4b\\xe9\\x90\\x1c\\xaf\\xab\\x2f\\x18\\x91\\x90\\x4d\\x4b\\xff\\x01\\x28\\xc1\\xd3\\x5e\\xce\\xcb\\x32\\x2b\\x3c\\xc0\\x1d\\xac\\xc5\\xae\\x3d\\xca\\x69\\x14\\xa7\\xd3\\x4d\\xa8\\xc9\\x65\\x7b\\x95\\x0f\\x89\\xd1\\xd6\\xae\\xc3\\x29\\x9b\\xb6\\x90\\x11\\x10\\x71\\xfa\\x87\\x28\\x27\\x74\\x94\\x3d\\x96\\xa4\\xab\\x7c\\x3d\\x6d\\xe7\\xd1\\xbf\\x11\\x93\\x63\\x06\\x8c\\xc8\\x2d\\x45\\xe4\\xb7\\x64\\x54\\xc6\\x08\\xbc\\x35\\x66\\xb7\\xf9\\xb3\\x85\\xcc\\x7e\\xb3\\x8e\\xe4\\x29\\xaf\\xc2\\xda\\x99\\x66\\x9f\\xc5\\xc1\\xbe\\x82\\x16\\x1a\\x1b\\x0c\\x33\\xf7\\xba\\x9a\\xd4\\x41\\x9d\\x20\\x62\\x97\\x19\\x01\\xdb\\x00\\x3b\\xfa\\x23\\xc4\\x47\\x14\\x99\\x5c\\xb0\\x6b\\xfa\\x96\\x6e\\x50\\x23\\xaa\\x93\\x46\\xfd\\x37\\x5a\\xe2\\xa1\\xe8\\x40\\x84\\x31\\x4d\\xf3\\xf0\\x8c\\xe2\\x08\\x00\\xc2\\xc2\\xad\\xfb\\xb8\\x13\\x66\\xf6\\xb1\\x04\\x24\\x3d\\x62\\xd5\\x04\\x1e\\x72\\x73\\x43\\x3f\\x17\\x58\\x1b\\xf9\\x3f\\x4c\\x61\\x46\\xfa\\x96\\x6f\\x63\\x8a\\xb0\\x7e\\xa1\\x66\\x94\\xa7\\xce\\x30\\x5c\\xc6\\x09\\xa6\\xe1\\x06\\x23\\xff\\x7f\\x6c\\x79\\x16\\xb6\\xe4\\xdb\\xde\\xbb\\x7b\\x52\\xec\\xa7\\xf0\\xd5\\x18\\x7f\\xf6\\x64\\xd7\\xc3\\x70\\xed\\x22\\x88\\x6a\\xa2\\x67\\x13\\x29\\xd9\\x28\\xe0\\xa3\\xbe\\xa3\\xb4\\x71\\x1a\\x12\\x8b\\x9a\\xab\\x90\\x26\\x6f\\x86\\x51\\xd2\\x20\\xb9\\xcc\\x1c\\xbf\\x5b\\x1c\\xe7\\x26\\x59\\x31\\x80\\x36\\x90\\xd3\\x29\\x1c\\x01\\xea\\xd4\\xdb\\xc3\\x32\\x9a\\x97\\xe8\\x5c\\x4f\\xe1\\xd3\\x56\\x60\\x8c\\xc9\\xe6\\x0b\\x05\\xbc\\x14\\x83\\x8a\\x86\\x08\\x27\\x9a\\x00\\x61\\xde\\x28\\xff\\x7b\\x8e\\x81\\xf5\\x9c\\x8a\\x8c\\x55\\x23\\x92\\x4c\\x4c\\x48\\x5e\\x6e\\xa8\\x0a\\xc8\\x17\\x50\\xbb\\x0e\\x41\\x9e\\xfc\\x78\\x58\\xcd\\x4a\\xf5\\x0c\\x8b\\x8c\\x80\\x65\\x0f\\xac\\xab\\x4d\\x82\\x58\\xf9\\xca\\xfa\\x03\\x10\\xa0\\x07\\xcc\\xcb\\xc4\\x18\\x5c\\x82\\xfd\\x14\\x6d\\xf1\\xd8\\x11\\x87\\x9d\\xa3\\x65\\x0d\\x57\\x16\\xf1\\x00\\x4b\\x71\\xd2\\xc7\\xf2\\xbd\\x65\\x03\\xc3\\x54\\x58\\x9f\\x86\\x02\\xc9\\x50\\xa1\\xf5\\x13\\x9f\\x81\\x14\\x60\\x75\\x28\\x80\\xa3\\x41\\x11\\x66\\x30\\xe4\\xff\\x84\\x94\\x8e\\x74\\xa9\\xeb\\x35\\x0d\\x64\\xd8\\x29\\x30\\x02\\x20\\x02\\x33\\xf2\\x09\\xb1\\x7d\\x78\\x89\\x7c\\x7c\\xe6\\xce\\x29\\xe2\\x9f\\x82\\xd4\\xad\\x6c\\x61\\xeb\\x79\\xf5\\x73\\x9c\\xb6\\x68\\xb2\\x1a\\x74\\x55\\x55\\xc9\\x6e\\x19\\x52\\x68\\x45\\xe8\\x2c\\x6e\\xd2\\xb1\\xc6\\xbd\\xd6\\x36\\x4b\\x8f\\xc7\\x9b\\xa9\\xa3\\x2d\\xbd\\x3f\\x8b\\x97\\x5e\\xb9\\x23\\x62\\x39\\x58\\xae\\x0d\\xaa\\x4f\\xfa\\x13\\x92\\x17\\xc0\\x0e\\x02\\x1f\\x93\\x7e\\x9b\\x79\\x1c\\x37\\x99\\x1a\\x35\\xe5\\x23\\x1a\\x19\\x14\\xc0\\x45\\xa7\\x87\\x43\\x2f\\x97\\xb8\\xe2\\x06\\x3d\\xb1\\x05\\xe1\\x4d\\xa9\\x79\\xc1\\xc4\\xcb\\xa7\\x85\\x21\\x0e\\xb0\\x20\\x11\\x33\\x4b\\x23\\x0c\\xfb\\x68\\x31\\x99\\x8c\\xcc\\xe2\\x53\\x86\\xf4\\xf3\\xba\\x0d\\xce\\x20\\x06\\xe9\\xc3\\x94\\x0b\\x4d\\x5a\\x56\\xaa\\xcc\\xdc\\xab\\x02\\x71\\x86\\x89\\x81\\x63\\x60\\xf1\\x88\\x52\\xfd\\x19\\x98\\xa9\\x9f\\xce\\x9a\\x04\\xda\\x3f\\x5e\\x23\\xaf\\x94\\xc6\\xe8\\xa5\\xba\\xdf\\xd3\\x93\\x04\\xb9\\xe2\\xa3\\x76\\xa1\\xf9\\xba\\xc0\\x9a\\x85\\xbd\\x04\\x24\\x76\\xe2\\x6b\\x58\\xec\\x73\\xf1\\x23\\x6d\\x41\\xab\\x4b\\x4e\\x7a\\x54\\xde\\xf9\\xd6\\x6a\\x38\\xf8\\xe5\\x46\\xde\\x7b\\x38\\x8e\\x1e\\x7d\\x66\\x81\\xe5\\xe2\\xa0\\x96\\xf1\\x60\"},\n{{0x69,0x5c,0x96,0x0b,0xbb,0x0d,0xd5,0x7f,0xfa,0x36,0x15,0x1c,0x85,0xde,0x73,0x51,0x54,0xfe,0x5a,0xd5,0xf5,0xfc,0x77,0xd0,0x05,0xa0,0xa3,0x20,0x11,0xde,0xb3,0x0c,},{0x34,0x12,0x5e,0x4e,0x21,0xf7,0x89,0xed,0x0e,0x11,0x80,0xc1,0xf6,0x36,0x9c,0x72,0x1d,0xca,0xe9,0x85,0x9b,0x6f,0x7b,0x04,0xf9,0x57,0xe5,0x10,0x01,0xee,0xde,0x8a,},{0x4a,0xf4,0x1c,0x55,0x4d,0x99,0x08,0x12,0x68,0x6c,0x32,0x9a,0x87,0x5c,0x41,0xee,0x24,0xb4,0xa7,0xfd,0x7b,0x3d,0x4f,0x8c,0x8d,0x52,0x75,0xf2,0xe7,0xcb,0x24,0x2b,0x25,0x8b,0x58,0x58,0xa4,0x66,0xde,0x59,0x5c,0xe2,0xa2,0x17,0x7e,0x35,0x1c,0x7f,0x08,0xc7,0xfc,0x4e,0x0b,0xf9,0x7e,0xc5,0xfb,0x2d,0xcb,0x82,0x52,0xd2,0xc9,0x0a,},\"\\x37\\x06\\x69\\x6c\\x7a\\x90\\x66\\x90\\xd0\\xd3\\xb7\\x1e\\x7e\\x21\\x1c\\x7b\\x06\\x71\\x68\\xf3\\xa8\\xf1\\xed\\x98\\x4a\\x0a\\x5e\\x60\\x78\\x59\\x76\\x62\\xe4\\xe7\\x88\\x9d\\x52\\xdb\\x0f\\x78\\xe0\\xd5\\xef\\x0e\\x5f\\x7a\\x0a\\x0f\\x42\\x63\\xb6\\x84\\x8b\\x07\\x25\\xca\\xa4\\xb1\\xce\\xa6\\x98\\x74\\x09\\x51\\x1c\\x8e\\x5e\\x98\\x2d\\x3f\\x5b\\x82\\xbb\\x56\\xa4\\xa7\\x94\\x71\\x21\\x93\\x7f\\x8e\\x10\\x5c\\x5a\\x14\\xb5\\x3e\\x6c\\x37\\xcc\\x71\\x6b\\x1e\\xba\\x92\\x24\\x21\\x82\\x8b\\x04\\x6f\\x68\\x56\\xc4\\x4f\\xab\\xf1\\x3a\\x75\\x16\\xc6\\x2a\\x5f\\xf9\\x85\\x68\\x45\\x0c\\xee\\x78\\xb1\\x40\\x33\\x50\\x47\\xbf\\x1c\\xa7\\x7e\\x15\\x49\\xa8\\x94\\xfe\\xeb\\x07\\x80\\x45\\xe4\\x64\\x18\\x32\\x25\\x3b\\xf6\\x95\\x48\\x54\\x52\\xec\\x36\\x90\\x65\\xa6\\x00\\x29\\xa6\\xc9\\x07\\x7a\\x37\\x9d\\xb2\\x04\\x85\\xea\\x2e\\xdb\\x6c\\x96\\x95\\x47\\xbb\\x26\\x53\\x28\\x9b\\xc6\\xe8\\x1f\\xfc\\xb8\\x4b\\xdb\\xf7\\x73\\xdd\\xea\\x4b\\x37\\x50\\xe9\\xa7\\x23\\x95\\xd1\\x17\\xf6\\x44\\xb0\\xe2\\x20\\x61\\xd4\\xf3\\xbb\\x7c\\x5b\\x61\\x2e\\x4b\\x70\\x39\\x5e\\x07\\x79\\x51\\x6b\\x46\\x65\\x91\\x16\\x90\\x2f\\xd0\\xfb\\xcd\\x23\\x40\\xee\\xa4\\x5e\\x9c\\x23\\xdb\\x25\\x64\\xa5\\xe1\\x1d\\xc7\\x9e\\x8f\\x4b\\x33\\x2a\\x44\\x3e\\xc3\\x5a\\xad\\x96\\x04\\xfe\\x79\\x12\\x52\\x08\\x82\\x95\\xe8\\x4f\\x65\\xa3\\x07\\x31\\x25\\x50\\xd9\\xeb\\xf6\\x1f\\x36\\x7e\\x4a\\x0f\\x2b\\x56\\x23\\xe5\\x3e\\xf6\\xbc\\x13\\x28\\x25\\xfc\\x24\\xeb\\xee\\x4e\\xbf\\x33\\x8c\\xbf\\xb5\\xdf\\x69\\xb3\\x2d\\x03\\x0d\\x44\\x7c\\x44\\xf3\\x13\\xba\\x96\\xfe\\x07\\xbb\\xfe\\x5b\\x01\\x66\\xea\\xec\\xbc\\x61\\x9b\\xb6\\xb2\\xe5\\x92\\x40\\x10\\xba\\x3e\\xc1\\x50\\xff\\x6a\\x69\\xfe\\xc4\\xde\\xd9\\xc4\\x42\\xf9\\x8c\\x15\\xe7\\x7f\\x31\\x9b\\x48\\x43\\xb3\\xb7\\x48\\xb5\\xd2\\x60\\x89\\xa7\\x6c\\x2b\\x83\\x4f\\xf9\\x3c\\x41\\x3e\\x04\\xca\\x95\\x50\\xcd\\x21\\x1c\\xe2\\xd6\\xa5\\x83\\xd7\\x82\\x57\\x50\\x66\\xdb\\x6d\\xd3\\x3e\\x8d\\x5e\\x83\\x74\\x35\\x5d\\x06\\x8a\\x5e\\xb9\\x6f\\x8b\\x3d\\xa8\\xdd\\xdf\\xb5\\xba\\xf5\\xc5\\x96\\xda\\xaf\\x55\\x6a\\x8f\\x2c\\xb5\\x78\\x1e\\x50\\x42\\x32\\x7f\\x92\\xae\\x06\\x21\\xea\\xe0\\x88\\xb5\\xf0\\x13\\x59\\x2e\\x77\\x87\\x3a\\x81\\xd7\\xe0\\x68\\xd7\\xb8\\x33\\x7d\\xb9\\xf1\\x09\\xa8\\x35\\xb4\\x75\\xe5\\xca\\xf7\\xce\\xa5\\xaf\\x3b\\x4a\\xd6\\xd9\\x0b\\xaa\\xf1\\xc7\\x36\\x55\\xec\\x67\\x67\\x47\\xfc\\xdd\\x41\\x77\\x5b\\x4f\\xbe\\x39\\x24\\xc3\\xf4\\x1d\\x8a\\x73\\x75\\x28\\xd1\\x2d\\x61\\x56\\x65\\x3a\\x22\\x35\\x8c\\x68\\x21\\x42\\x6b\\x2c\\x0a\\x33\\xe1\\x63\\x4c\\x62\\xc7\\xc8\\x38\\x56\\x49\\xbc\\x23\\x3e\\x7d\\xaf\\x94\\x39\\xf0\\x9d\\xb9\\xbd\\x11\\xea\\x01\\xe2\\x8b\\x77\\xec\\xbb\\xc4\\x59\\x0e\\x29\\xfd\\xcf\\x0f\\xdd\\xe1\\x52\\xf6\\x47\\x81\\x32\\xfe\\x4c\\x3a\\x5b\\x45\\xa7\\x30\\x5a\\xf6\\xe3\\x81\\xca\\xdd\\x72\\x49\\x6e\\x66\\xbb\\xb8\\x66\\xce\\xa4\\x7f\\x7e\\x7d\\x7e\\x63\\x34\\x16\\x00\\xaf\\x3f\\x49\\xce\\x9c\\x9e\\x4e\\x37\\x39\\x4d\\xf5\\xdf\\x71\\xdc\\x10\\xcd\\x39\\x1f\\xdc\\xb8\\xa1\\x93\\xdc\\x98\\xfc\\x19\\x05\\x9f\\xa3\\xac\\x23\\x0e\\xc5\\x47\\x6b\\xf9\\x4d\\x85\\x55\\x6a\\xce\\x6e\\x1b\\xa3\\x24\\x21\\xbf\\x59\\xdc\\xbe\\x05\\xc5\\xe1\\x5d\\x34\\xc6\\x64\\x4e\\x27\\xd0\\xa0\\x2b\\xe9\\x7f\\xa8\\x38\\x7e\\xe0\\x37\\x06\\xf2\\x2a\\x8f\\x4b\\x3b\\x40\\x40\\xad\\x7d\\x3f\\x8a\\x86\\x97\\x1a\\x20\\xa0\\x9e\\xc8\\x1b\\x76\\x96\\xd8\\x34\\xc5\\x26\\xb8\\xe5\\x1c\\xb9\\x7d\\x27\\x64\\x3f\\x9a\\xbf\\x5e\\x29\\xff\\xd0\\x33\\x3f\\x95\\xde\\x15\\xd1\\x10\\xc2\\x06\\x4c\\xa4\\x94\\x67\\xc1\\x4e\\xf2\\x27\\xf4\\xba\\xbf\\x1a\\x55\\xe7\\xb1\\xcd\\xa0\\x42\\x9c\\xff\\x25\\x6b\\xe3\\x1c\\xf1\\x16\\x71\\x9a\\x81\\xb9\\xc5\\xfb\\x75\\xfd\\xf6\\x4e\"},\n{{0x25,0xcb,0x17,0xfc,0x33,0xd2,0xbf,0x83,0x84,0xae,0x4d,0xf2,0x0c,0x1f,0xad,0x5c,0x35,0xfd,0x76,0x5a,0xff,0xde,0x04,0xb5,0x25,0x6d,0x4d,0xe0,0x1c,0xa8,0xde,0x14,},{0xb8,0x6c,0xa3,0x12,0xfe,0x59,0x85,0x20,0xc6,0x4b,0xe5,0xc7,0x2f,0x5b,0x23,0x81,0x65,0x07,0xf6,0x9e,0x07,0x0f,0x82,0x8e,0x02,0xd2,0xaf,0xcf,0xe1,0x1b,0xfa,0x01,},{0x8c,0xcb,0x0d,0xbc,0xf7,0xcc,0x03,0xe8,0x3e,0x21,0xc5,0x74,0x74,0xaf,0xd3,0xad,0x88,0x98,0x09,0x7b,0x97,0x2e,0xde,0x17,0x5a,0xca,0xae,0x48,0xe3,0xec,0x17,0xb2,0xdb,0x06,0xfc,0x82,0x77,0x6b,0x07,0x51,0xc0,0xf9,0x56,0xfd,0x71,0x96,0xf3,0xd1,0xc9,0x63,0x21,0xa6,0xcf,0x3d,0x89,0x24,0x15,0xd8,0xf8,0xee,0xb4,0xa1,0x41,0x08,},\"\\x4b\\x4a\\x71\\xcb\\xf8\\xcb\\xaf\\x57\\xa7\\x7d\\x4e\\xa1\\x88\\xa6\\xf9\\x64\\x84\\x0f\\x0d\\x71\\x4a\\x5f\\x38\\xa0\\x95\\xa1\\x3b\\x4e\\x57\\x12\\x97\\xa8\\x8b\\x79\\x24\\x17\\xd1\\x61\\x84\\x42\\x7f\\x90\\xe0\\x43\\xdd\\x8a\\x55\\xb7\\xf1\\xc1\\x3e\\x00\\xdf\\xa6\\x05\\x16\\x44\\x5c\\xbe\\x77\\x06\\x8c\\x79\\xc8\\xc3\\x5e\\xbe\\xac\\x33\\x0c\\x33\\xf1\\x12\\x1d\\x05\\x73\\x1a\\x8f\\x51\\x32\\xd6\\x48\\x00\\x73\\x27\\x46\\x41\\x19\\x5a\\x75\\x20\\x21\\x16\\xff\\xf1\\xc3\\x18\\x81\\x71\\x78\\xfd\\xd7\\x68\\xbb\\xdf\\x10\\x5f\\xa0\\x69\\xc7\\xa3\\xd1\\x43\\xfd\\xf5\\xd1\\x7b\\xfa\\xd7\\xc0\\x62\\x4e\\x52\\x92\\x06\\x8f\\xd7\\xbb\\x6d\\x30\\x3b\\x4a\\x27\\xcb\\x20\\xa4\\xe6\\x18\\x75\\x07\\x67\\x87\\xd1\\x9f\\xa6\\xf7\\x29\\xc9\\x4d\\xc0\\xba\\x9b\\x8c\\x0b\\xfd\\x98\\x66\\xda\\x5c\\xb2\\xe7\\xa2\\xcd\\x2e\\xdb\\xdc\\x95\\xac\\x34\\x9e\\x5e\\x5c\\x21\\x72\\xe5\\xa4\\xcf\\x7b\\xd9\\x0c\\xab\\xe2\\xc6\\xe2\\x24\\x59\\x80\\xbd\\x72\\xd0\\xf6\\xf5\\x47\\x98\\x81\\xe8\\xc4\\xc3\\x54\\xf6\\x8a\\xa7\\x28\\x41\\xd0\\xc7\\x3b\\x98\\x6b\\xa5\\x10\\x21\\x20\\x31\\x61\\x02\\x6e\\xe3\\xd7\\x29\\xdd\\xf1\\xa0\\x49\\xff\\xe9\\xeb\\x25\\x43\\x98\\x02\\xf0\\x30\\x11\\xd1\\x44\\xe5\\x0b\\x02\\xbd\\x4a\\xca\\x5e\\x55\\x06\\xd3\\x2f\\xcf\\x69\\xe3\\x2f\\x54\\x25\\x44\\x79\\x8f\\x4e\\x87\\xf7\\x2b\\xdf\\x24\\x33\\xb1\\xff\\x32\\x59\\x29\\x2e\\x1d\\x90\\x81\\x2c\\xff\\xd7\\x9f\\x6a\\x54\\x32\\x70\\xba\\xf2\\x4a\\x3c\\x39\\xdd\\x35\\x98\\xe1\\xc6\\x61\\x61\\x29\\x22\\x52\\x2f\\x38\\x7d\\x51\\x59\\x76\\x92\\xf3\\x14\\xc4\\xd5\\xac\\x4b\\xf1\\x88\\x3a\\x61\\x46\\x36\\x33\\x6a\\x55\\x44\\xd5\\x9f\\xf4\\x1d\\x1e\\x0d\\xbc\\xf8\\xe6\\x62\\x7e\\x7c\\x80\\x85\\x64\\x63\\x22\\xdf\\xc2\\x0c\\x33\\x2c\\xbd\\xf3\\x53\\x70\\xd4\\x7d\\xca\\xbb\\x80\\x2e\\x17\\xca\\x84\\x78\\x0e\\xec\\x66\\x1c\\x90\\x4d\\x5b\\xfb\\xc2\\x40\\xad\\x6a\\x14\\xa7\\x53\\x3f\\x71\\xa2\\x75\\x00\\xc6\\x1d\\xd3\\xe4\\x73\\x98\\x38\\x87\\xa8\\x68\\x35\\x18\\x7a\\xbb\\x0d\\xf0\\x8f\\xa6\\x2c\\xda\\x69\\xdc\\xe8\\x6e\\x21\\xfa\\x5a\\xe9\\x54\\xc2\\x2e\\xdd\\xb6\\x0e\\xe3\\x13\\x15\\x04\\xa6\\x9b\\x50\\x48\\x6a\\x17\\x76\\x70\\x91\\x88\\x37\\x60\\x63\\x8a\\x29\\xc3\\x80\\x30\\xe1\\xe0\\x5f\\xdb\\x28\\xe1\\x58\\x63\\x30\\x10\\x38\\x5a\\x62\\x06\\x13\\xcc\\x10\\xd5\\xa5\\xf3\\x50\\x95\\x5f\\x4a\\x34\\x7c\\x65\\xed\\xdd\\xb7\\xe2\\x51\\x59\\xda\\x8d\\xcc\\x26\\x55\\x92\\x8a\\xd6\\xf6\\xd8\\xc4\\xc1\\xab\\xb8\\x17\\xd7\\xfe\\xf3\\xba\\xe5\\xde\\x04\\x02\\xed\\xde\\xe7\\xb5\\x15\\x21\\xce\\x28\\x0a\\x66\\xb7\\x96\\x14\\x0f\\x56\\xaf\\x9b\\xc2\\x0e\\x46\\x58\\x75\\xce\\x26\\x28\\xa8\\xa1\\x04\\x77\\xce\\x9b\\x2e\\xac\\xc7\\xd8\\x6f\\x88\\x27\\x24\\x57\\xbf\\xd4\\x43\\xe7\\x12\\x52\\x69\\x96\\x25\\x43\\x80\\xf0\\x13\\x52\\x27\\xe9\\xfc\\x15\\x1c\\x86\\x95\\xe9\\xcc\\x64\\xd2\\x72\\xb2\\x56\\xab\\x95\\xc9\\xa9\\xf5\\x68\\xe9\\x37\\x16\\xe0\\xe5\\x3d\\x29\\x88\\x2e\\x3c\\xe7\\x42\\x61\\x25\\x7a\\x02\\xcd\\x49\\x7c\\x37\\xd7\\x64\\xd9\\x0f\\x7f\\xd4\\x78\\xa1\\x7a\\x89\\x0a\\x8b\\x2e\\xa6\\x1a\\xb8\\x1f\\x68\\x69\\xb1\\x20\\xa2\\xf6\\x48\\x4a\\x88\\xc1\\x51\\x95\\x33\\x91\\xec\\xa4\\x45\\x01\\x53\\x77\\xb3\\xa5\\xdf\\xfe\\x4c\\xfb\\xac\\xfb\\x5b\\xab\\x2c\\x47\\xf6\\x54\\xf7\\x2a\\x9d\\x19\\xcb\\xc4\\xd2\\x95\\x37\\x19\\x84\\x05\\xe3\\xa0\\x4b\\x4b\\xfe\\x11\\xbc\\xdb\\x5c\\x1f\\x30\\xd9\\xac\\x02\\xf5\\x48\\x49\\xc5\\x7a\\xa9\\x6f\\x7b\\x56\\x63\\x61\\x16\\xf2\\xbb\\x6f\\x25\\x83\\xd9\\xaf\\x94\\xc8\\x6a\\xff\\x5c\\x13\\x7f\\x63\\xce\\x54\\xe8\\xf0\\xc2\\x1b\\x6c\\x25\\xc1\\xf0\\x47\\x2a\\x22\\x9c\\x90\\x81\\x7e\\x61\\x62\\xea\\xc7\\x1c\\xcd\\xa3\\x09\\xa1\\x64\\x3b\\xd6\\x31\\x2a\\x52\\x63\\xa2\\xef\\xe6\\x46\\xdf\\xfe\\x79\\xeb\\xd8\\x15\\x7a\\x28\"},\n{{0x49,0xe2,0x4d,0x16,0x99,0x83,0x37,0x26,0xb1,0x8c,0x78,0xea,0x65,0x68,0x40,0x1a,0x97,0x1e,0x1c,0xa3,0x9d,0xd0,0x6d,0x75,0x63,0xac,0x8b,0x42,0x50,0xd4,0xa9,0xf5,},{0x71,0xcf,0x05,0xe9,0x0d,0x30,0x1a,0x6d,0x9f,0xad,0x7f,0x0b,0x38,0xec,0x8b,0xb0,0x44,0xfc,0xfd,0x97,0xc8,0x49,0xb0,0x4c,0x00,0x36,0x25,0xde,0x29,0xbe,0x86,0xbb,},{0xa0,0xb6,0xa2,0xaf,0x15,0xb6,0xbe,0x9e,0x95,0x1e,0xf3,0xf3,0x2c,0xbd,0x1c,0x67,0x02,0xe8,0xe0,0x17,0xfb,0xd3,0x15,0xa3,0xf2,0x59,0x9c,0x3f,0x1a,0x11,0x86,0x5d,0x46,0xe7,0x84,0x59,0xa0,0xd7,0xf7,0xbe,0x04,0x6a,0xae,0x29,0x3c,0xad,0x09,0x13,0x7e,0xc8,0x47,0xe2,0x69,0x28,0x10,0x6d,0x9a,0xa3,0x5e,0x09,0x82,0xb9,0x92,0x02,},\"\\x6d\\x26\\x05\\xf6\\x1e\\x1a\\x04\\xb6\\xae\\x18\\xc2\\xc2\\x5a\\xe1\\x00\\xdd\\x42\\xa6\\x1e\\x66\\x4e\\x2d\\xb5\\xc3\\x4d\\x7a\\xd1\\xf8\\x4a\\xc5\\x07\\x55\\x2b\\x74\\x1c\\x20\\x86\\xc1\\x7c\\x85\\x2b\\xab\\xe0\\x7a\\x91\\xe1\\x29\\xa5\\x06\\xee\\x59\\xed\\xb9\\xce\\x73\\xbe\\x1b\\x1d\\x06\\xd1\\x20\\xec\\x36\\xa1\\xe9\\x4c\\x62\\x81\\x05\\x4e\\x78\\xce\\xb1\\xbd\\xef\\xfb\\xcb\\xf4\\xf0\\x10\\x51\\xed\\x38\\x1b\\xfc\\x8a\\xd1\\x76\\x9f\\x41\\xe2\\x40\\xbf\\x60\\x59\\xd9\\x70\\x4c\\xac\\xec\\x66\\x66\\x11\\xf4\\x1e\\x4d\\xd4\\x38\\xb7\\xf5\\x02\\x42\\xea\\x86\\x75\\x6b\\xb1\\xf8\\x1e\\x59\\x42\\xc0\\x92\\x12\\x9f\\xbc\\x6d\\xe4\\x95\\x5d\\x28\\xdf\\xf3\\x52\\x37\\xdb\\x30\\xe4\\xa5\\x03\\x6a\\x99\\x14\\xc9\\xf8\\x4d\\xbd\\x8c\\xcf\\x82\\xba\\x2b\\x1b\\x3b\\x55\\x54\\xa2\\xb7\\xa7\\x4c\\xb0\\xb2\\xa1\\xe1\\x96\\x33\\x45\\x28\\x6e\\x25\\x8d\\xc8\\xe7\\xd5\\x67\\x18\\x03\\x5f\\x95\\xf3\\x13\\x81\\x1c\\xfb\\xd8\\x52\\xa0\\xf8\\xf4\\x9a\\x29\\xef\\x93\\x3e\\x7c\\xda\\x7e\\xd9\\xc7\\xe8\\xb1\\x62\\xcd\\xba\\x1a\\x82\\x26\\x2c\\xd4\\xdf\\x7c\\xf8\\xea\\x4b\\x58\\x6d\\xb4\\x3d\\xcc\\x1e\\x37\\x64\\x59\\x8e\\x9c\\xa4\\x66\\x73\\x82\\x2b\\xaa\\x2a\\xd8\\x7f\\xb1\\x4b\\x6f\\xdb\\x9e\\x20\\x32\\xd0\\xca\\x51\\xc2\\x6c\\x5e\\xf3\\xd9\\xf7\\x97\\x85\\xfa\\xc2\\x49\\x1c\\xdb\\xf7\\xc3\\x99\\xf3\\xcd\\x17\\x74\\xc1\\xa6\\xb1\\xe4\\xa6\\x7f\\x54\\x36\\xd8\\x0d\\xb0\\x25\\xf8\\xfb\\x64\\x09\\xe2\\x75\\xbd\\x0e\\xd5\\x08\\xb5\\xe0\\x39\\xed\\x2e\\x4e\\xec\\x8b\\x0f\\x4d\\x5b\\xe9\\x9d\\xca\\xfa\\x6a\\x14\\x01\\x25\\x27\\x32\\xa6\\x5b\\x37\\xc9\\x43\\xc0\\x7e\\xf3\\xac\\xbc\\xfb\\xb3\\xdc\\x06\\xda\\xd0\\xa8\\x8f\\x2f\\x5e\\xb5\\x51\\xa3\\x99\\x7a\\xd6\\xc6\\xee\\xd9\\x5e\\xdd\\x9a\\x0a\\xf4\\xa2\\x88\\xd5\\xe4\\x32\\x86\\xb2\\xac\\x07\\x29\\x77\\xc4\\x36\\xb7\\xc5\\xff\\x7a\\xb6\\x1c\\x94\\x84\\xf2\\x57\\xf5\\x8e\\x01\\x0c\\x9b\\x6a\\xd4\\x15\\x81\\xd7\\x42\\xcd\\x19\\x75\\x2c\\xde\\x54\\xd2\\xb4\\x20\\xd6\\x43\\x65\\x4e\\x90\\x96\\xa8\\x1e\\xb9\\xdc\\xf8\\x04\\xc7\\xc2\\xed\\x0e\\x38\\xd1\\x3a\\x5c\\xe3\\x99\\x78\\xcd\\xd0\\x2b\\x25\\x35\\x09\\x45\\xde\\x78\\xfe\\xec\\xc0\\xc2\\xc2\\x2f\\xfd\\x70\\x5c\\x3b\\xa8\\x11\\x32\\x65\\xc7\\xb9\\xa7\\xc8\\xdd\\xb5\\x91\\x78\\xbd\\x21\\xd7\\xf6\\xc3\\x1c\\x6b\\xe2\\xc3\\x67\\x49\\xee\\x0f\\x9a\\xb8\\xbc\\x1d\\xcf\\x5d\\xa5\\xcb\\x2d\\x2d\\x59\\x62\\x35\\x8f\\x71\\xf9\\x6a\\xb3\\x79\\x2a\\x25\\x2a\\x51\\x9e\\x41\\x53\\x51\\xf4\\x3e\\x7e\\x12\\x03\\x5b\\x03\\x28\\xf2\\x82\\x08\\xcf\\x4b\\xe5\\x29\\xd2\\x99\\xaa\\x5c\\x12\\x8c\\x9d\\x5e\\xd5\\x75\\xbf\\x90\\xc5\\x35\\x05\\x69\\xea\\xa6\\xf2\\xd5\\x52\\x1d\\xe1\\x18\\x03\\x09\\xf6\\x86\\xc9\\x7e\\x9a\\xd6\\xfa\\x1e\\xc1\\xdd\\x86\\x27\\xae\\x89\\x51\\x58\\x1c\\xf6\\x04\\xb8\\xb9\\x17\\xc5\\xba\\x43\\x4a\\x63\\x7b\\xe1\\xbc\\x8b\\x79\\xf4\\xac\\xaf\\x77\\x95\\xf4\\xe5\\x1a\\xab\\xdb\\x88\\x50\\x77\\xbc\\x4f\\x3c\\x68\\xfc\\x33\\x18\\xde\\x58\\x23\\xd7\\xe0\\x80\\x4e\\xe9\\x95\\xb7\\x03\\x87\\x95\\x0f\\x79\\x93\\x53\\x68\\x23\\x00\\xd4\\xe7\\x97\\xf3\\xca\\xd6\\x11\\xb4\\xc5\\x62\\xc8\\x64\\x0f\\xf2\\xb3\\xfe\\x29\\x29\\x16\\xa9\\x70\\xfb\\x98\\xc1\\x47\\x5c\\x1f\\x4e\\x27\\xb9\\xb3\\x3c\\xfe\\x0d\\x3a\\xd9\\x32\\xa1\\xeb\\xe6\\xa2\\x7f\\xc3\\xb4\\x46\\x62\\x29\\x54\\xae\\xe1\\x68\\x36\\x68\\xc8\\xbd\\x4a\\x3f\\x90\\x3b\\xe5\\xc7\\x7d\\xfd\\xb8\\xe8\\x91\\x4c\\xed\\xc5\\x1f\\x65\\xfe\\xd2\\xd9\\xc4\\xd0\\x3e\\x13\\xa6\\x68\\xd4\\xc7\\xea\\x5e\\x31\\x88\\x3e\\x1b\\x3d\\xb6\\x43\\x63\\xe2\\xac\\x5c\\xc5\\x4b\\x54\\xce\\x69\\xc6\\xad\\x52\\xf8\\x74\\x99\\x9b\\x5d\\xd2\\xc5\\x78\\x2f\\x03\\xc3\\xd5\\x15\\x05\\xdf\\x53\\x6a\\x1f\\xe0\\xd8\\x60\\xd3\\x3e\\xab\\xed\\x64\\x1a\\x94\\x00\\x89\\xf1\\x29\\x7d\\xd0\\xf5\\x7f\"},\n{{0xf8,0xff,0x97,0x03,0x2a,0x34,0xcf,0x99,0x99,0x08,0x80,0x58,0xaf,0x56,0xff,0x70,0xb6,0xac,0xb2,0xed,0xf7,0x59,0xe1,0x31,0xfa,0xec,0x84,0x40,0xfd,0xec,0xf6,0xc4,},{0x54,0x38,0xb4,0xe3,0x3f,0x1c,0x5e,0xa1,0x12,0xfb,0x1b,0xaf,0xef,0x40,0x59,0xbf,0x09,0x5a,0x11,0x40,0x9b,0x64,0xd4,0x6b,0xfb,0x4d,0x25,0x47,0x3c,0x1c,0x08,0x74,},{0x50,0x9e,0x9e,0xad,0xfe,0x8d,0xde,0x79,0x14,0xac,0x20,0xca,0xfc,0x0b,0x0a,0xf2,0x2b,0x84,0xdd,0x8a,0x21,0x0a,0x48,0x12,0xcd,0x8c,0xae,0x39,0xb0,0xa2,0x72,0xe5,0x3e,0x02,0x24,0x6d,0xc8,0x93,0x9e,0x92,0x26,0x92,0x03,0x36,0xe1,0x40,0xb3,0x15,0x32,0xd0,0x68,0x13,0x7a,0x34,0x16,0x1e,0x59,0x9a,0x86,0x94,0xa9,0x5d,0xdf,0x01,},\"\\xdf\\xb4\\x1f\\xb9\\xd5\\x37\\x02\\xcb\\x2b\\x9e\\x3f\\xfc\\xad\\x4e\\xa6\\x02\\x71\\x6f\\x71\\x8a\\x7e\\xa3\\x3e\\x21\\x84\\x3e\\x2a\\x6c\\x05\\x2c\\x70\\xc6\\xc5\\x14\\x85\\xd7\\x2b\\x53\\xa5\\xbb\\x4e\\x34\\xe0\\x3e\\x3e\\x1d\\x1a\\x52\\x51\\x8e\\xb3\\xe7\\xf1\\x8f\\x2a\\x1e\\x1c\\xaf\\x78\\xac\\xb2\\x11\\x60\\x89\\xbe\\xd4\\xc6\\x17\\x13\\x8e\\x71\\x6a\\x91\\x43\\x1f\\x2c\\xf6\\x44\\xa1\\x21\\x0f\\x6d\\x19\\x20\\xd2\\x85\\x99\\x42\\x64\\xd6\\x46\\x6b\\x0d\\x8d\\x2c\\x62\\x63\\x80\\x44\\x61\\x6f\\x57\\x6e\\xdc\\x7d\\x0d\\x93\\xcb\\x66\\x01\\x31\\xd4\\xbb\\x50\\x87\\x5e\\x15\\x36\\x40\\x12\\x3a\\x96\\xf1\\x5b\\x75\\xa5\\xbc\\xee\\x46\\xd5\\xcc\\x5e\\xb1\\xa4\\x31\\xc5\\x9d\\x2e\\xad\\xdf\\xd5\\x53\\x15\\x02\\xfe\\xb1\\x55\\x1b\\xf7\\x79\\x1c\\xd5\\x98\\x9d\\x17\\xd1\\x02\\x96\\xd0\\x1b\\xa3\\xae\\x3e\\x38\\x4c\\x67\\x45\\x26\\xca\\xb6\\x2a\\x7c\\x24\\xc0\\xff\\x67\\x7d\\xe7\\x1c\\xa1\\x72\\x62\\x1a\\x28\\xa8\\x5e\\x01\\xee\\xfe\\x07\\xf6\\xee\\xf9\\xc3\\xec\\xfd\\x7f\\x94\\x98\\xac\\x42\\xf4\\x6a\\x43\\x71\\x6f\\x61\\x53\\x18\\xa3\\xb2\\x87\\x57\\xc3\\xa1\\x5f\\x4f\\x1c\\x38\\x22\\xae\\x7a\\x75\\xc2\\x03\\xa2\\x98\\x25\\x8d\\x75\\x36\\x38\\xcf\\x42\\x5e\\x15\\xbb\\xc4\\x62\\x02\\xb0\\x93\\xb8\\xe4\\xf3\\xe6\\x70\\xfb\\xb6\\x63\\xdb\\x2b\\x69\\xc8\\xfb\\x0f\\x62\\x50\\x74\\xd8\\x5a\\x44\\xd3\\x50\\xe0\\x42\\xbb\\x1b\\x74\\x02\\x1d\\x19\\x29\\x97\\xa2\\xc2\\x7d\\xd6\\xc8\\x63\\x48\\x41\\xd1\\x00\\xa0\\x34\\x4b\\xae\\xd7\\x50\\xa3\\x9f\\xf5\\xdc\\xd9\\x84\\x8d\\xfc\\xf0\\x9e\\x5c\\x8c\\x47\\x96\\x7b\\x96\\x55\\x6e\\x23\\x32\\xca\\x17\\xd8\\xe4\\x2d\\xd8\\xf3\\x93\\xa5\\x44\\x5a\\x37\\x22\\x44\\x60\\x0b\\x30\\x01\\xb8\\xfe\\x86\\xc4\\x5e\\xaf\\xc6\\xe7\\x38\\xaa\\x7e\\x11\\x7b\\x4a\\x79\\xfa\\x2e\\x6b\\x00\\xf4\\x64\\x92\\x8d\\x18\\x56\\xc8\\x3e\\xcf\\xe8\\x7d\\xd3\\x4d\\x15\\x8f\\x5c\\xb4\\xe4\\xf4\\xd6\\x10\\xf5\\x97\\x17\\xec\\x79\\x0b\\xd3\\xff\\x87\\x20\\x40\\xb6\\x7e\\x8d\\x39\\x39\\xe8\\x04\\xe3\\xb5\\xdb\\x98\\x5a\\x09\\x56\\x21\\xcb\\xcc\\xd6\\x86\\xc0\\x93\\x4e\\xce\\x3e\\x27\\xab\\x2c\\x6c\\xe3\\x3f\\xb5\\x2b\\x11\\x1f\\x48\\xe4\\xf2\\x74\\xbd\\xf3\\x20\\xd0\\xb0\\x23\\x84\\xc8\\x3c\\x49\\xe1\\xa0\\x41\\xbd\\x23\\x19\\x10\\x9c\\x85\\xa0\\x6d\\x80\\x48\\xa9\\x93\\x35\\x7a\\xbf\\xd8\\x11\\xac\\x2f\\x38\\x05\\x9d\\x07\\x7a\\xcb\\xc3\\x6a\\xa9\\x66\\xc0\\x28\\x90\\x37\\x48\\x62\\x5f\\x92\\xe8\\xf7\\x9d\\x51\\xbd\\xa1\\x0f\\x78\\x52\\x29\\x77\\xf7\\x6e\\xc4\\xe8\\x85\\xe4\\x9a\\x46\\xc6\\x8d\\xe0\\x9f\\x3d\\xa8\\xf8\\x6b\\x71\\xae\\x64\\x23\\xbd\\x29\\xde\\xef\\x1c\\xc6\\xa1\\x13\\xea\\xc1\\x15\\xa6\\xcd\\xe2\\xcc\\xd0\\x11\\xfc\\x1c\\x0f\\x0e\\x34\\x27\\xf4\\x3c\\x3e\\x96\\xfc\\x41\\x56\\xed\\xf6\\x2d\\xdf\\xb7\\xb0\\x83\\x6b\\x88\\x8b\\xab\\x3c\\x43\\x45\\x05\\x5a\\x6c\\x41\\x78\\xe9\\xe2\\x28\\x29\\xfd\\x8c\\xfc\\xe3\\x9b\\x0b\\x84\\x44\\xeb\\x26\\x48\\x7c\\xc9\\xdc\\x82\\x60\\x6f\\xea\\xad\\xaf\\x49\\x78\\x69\\x4e\\x65\\x64\\xf2\\x72\\x9c\\x1b\\x13\\xab\\x37\\xc9\\x07\\x2d\\xb4\\xe9\\xde\\x94\\x0e\\xe5\\xf1\\xd0\\x58\\x84\\xae\\x7f\\xd9\\xd9\\xec\\x9c\\xb7\\xde\\x56\\x34\\x76\\x00\\xa8\\x8d\\xea\\x92\\x08\\xa6\\x34\\x19\\xfc\\xe2\\x9e\\xe5\\x00\\x55\\xa3\\x74\\xa8\\xf2\\x2f\\x9a\\xe2\\xbe\\x98\\x05\\xa9\\xf4\\x76\\x15\\xaa\\x59\\x57\\x6b\\x44\\x04\\x2f\\xf1\\x26\\xa8\\x98\\x24\\xe3\\x6a\\xd6\\xbc\\x58\\xe0\\x6b\\xb9\\x0f\\xbe\\xef\\xba\\xe5\\xd6\\xd7\\xd6\\x24\\x30\\xf3\\x73\\xb6\\x29\\x6f\\xbf\\xcd\\x4d\\x66\\x20\\x16\\x83\\x53\\x58\\x3f\\xbd\\x3d\\x5a\\x29\\x2b\\x95\\x72\\x51\\x75\\x34\\xe2\\xfb\\x0b\\xee\\xf2\\xfa\\x98\\xa4\\x64\\xe5\\x91\\x03\\xe7\\xa0\\x42\\x87\\xf1\\x5d\\xad\\x0f\\xac\\x54\\x97\\x0e\\x77\\x15\\x07\\x8d\\x63\\xec\\x26\\x36\\x2f\\x6f\\xba\\xbc\\xdd\\xea\\xf7\"},\n{{0x2e,0x4c,0x39,0x21,0x9f,0xc9,0x2a,0x53,0x8e,0x48,0xe9,0x5f,0xbf,0xcf,0xef,0x30,0xf5,0xa2,0x1b,0x78,0x94,0x0b,0x81,0x05,0x3b,0xda,0xd4,0x60,0x2b,0x4c,0x96,0x90,},{0xf8,0xee,0xd8,0x92,0x17,0x66,0x20,0x43,0x4c,0x7f,0x0e,0xc5,0x3d,0xcf,0xf3,0x98,0x63,0x10,0x9e,0x7c,0xa4,0xd0,0xb3,0xc6,0xc4,0xb5,0x64,0x10,0xbe,0x01,0xe5,0x37,},{0x39,0x45,0x20,0x12,0x2b,0xb0,0xa5,0x64,0x64,0x8a,0x7a,0x8b,0xc8,0xdc,0x73,0x63,0x6c,0x51,0x77,0x46,0xa3,0xc8,0xa0,0x5b,0x90,0x1e,0x72,0x52,0xfe,0xf0,0xe5,0x02,0x3d,0x90,0x99,0x1e,0x31,0x1b,0x53,0x82,0xd4,0x91,0x00,0xe5,0x26,0x33,0xc7,0x0f,0xe9,0xc2,0x6c,0x14,0x50,0xe0,0x60,0x3e,0x6d,0x45,0x22,0x99,0xaf,0x4d,0xae,0x07,},\"\\xc8\\x7d\\x1f\\xba\\x9d\\x94\\xa6\\xa5\\x40\\x89\\x80\\xfc\\x80\\x83\\x98\\x0f\\xd2\\xd2\\x52\\xfa\\xe5\\x40\\xf6\\xee\\xc1\\x9e\\xd6\\x74\\x6c\\x29\\xe3\\x39\\xa1\\xc2\\x9f\\x6f\\x53\\xbc\\x23\\xfd\\x6b\\xfa\\x43\\x85\\x07\\xef\\xf5\\xda\\xf9\\x03\\x40\\x3c\\xda\\x70\\x7b\\x4d\\xc5\\xe8\\x44\\x80\\x5d\\x6b\\x1c\\xeb\\x4a\\xff\\xf4\\xb2\\x32\\xe8\\xe6\\x9d\\x7d\\x27\\x1f\\x3c\\x06\\x7c\\x48\\x54\\xf3\\xd9\\x4f\\x27\\xfe\\x32\\x55\\x81\\xfa\\xca\\x79\\xd1\\xf0\\x2a\\x26\\x29\\x0a\\xd2\\x3a\\xf7\\x11\\x00\\xc1\\x2c\\x09\\x15\\x76\\x47\\xca\\x9d\\xa4\\x3d\\x76\\x90\\xdd\\xcd\\x94\\xdb\\x65\\xe0\\x00\\x98\\x9c\\x87\\x8b\\x75\\xa0\\xff\\x22\\xd2\\xc7\\x09\\x62\\x59\\x4c\\x9b\\x08\\x08\\xf2\\x78\\x46\\xcc\\xac\\x85\\x67\\xbc\\xe5\\xd2\\xe3\\xb7\\x60\\x28\\x09\\xf2\\x3b\\x59\\xcd\\x71\\x8a\\x08\\x05\\xd1\\x08\\xf3\\x1a\\x63\\x2a\\x05\\xb8\\xdf\\xa5\\x03\\x5a\\xb9\\x46\\x1a\\xeb\\xa4\\x16\\x00\\x9d\\x74\\xfd\\xf9\\xe0\\x07\\x20\\x28\\x56\\x89\\x0d\\x2c\\xff\\x80\\xfa\\x24\\x0b\\x97\\x8a\\x48\\x27\\x0f\\xcb\\x2f\\x47\\x36\\x97\\xbc\\xba\\x8e\\x73\\x0a\\x55\\xc2\\x87\\x61\\x91\\x9a\\x23\\xbe\\x41\\xda\\x27\\xff\\xea\\x09\\xe3\\x55\\x9c\\xaa\\xab\\xf9\\x51\\x9e\\xc0\\x8e\\x1f\\xfa\\x86\\x81\\x7a\\xa3\\xe8\\x87\\x4f\\xa8\\x16\\xe7\\x71\\x8c\\x5b\\x2f\\x34\\x49\\x67\\xba\\x1b\\xc2\\x81\\x9c\\x4f\\x04\\x5a\\x97\\xb4\\x05\\x44\\xea\\x61\\xd7\\x17\\x08\\x3c\\xca\\xf1\\x1e\\x9d\\xdc\\x04\\xa3\\x59\\x8e\\xf1\\x81\\xe7\\xbe\\xf4\\xac\\xef\\x45\\xb6\\x55\\x1b\\x47\\x8a\\x0d\\x77\\x31\\xc4\\xf0\\x8c\\xe5\\x80\\x2f\\x78\\x25\\x8d\\x41\\x90\\x17\\x66\\x10\\x76\\xd7\\xd6\\xd2\\xef\\x39\\xe5\\x7c\\xf9\\xcd\\x93\\x97\\xdc\\xc5\\xde\\xbf\\x64\\xab\\x82\\xb6\\x61\\x59\\xf5\\x78\\x31\\x6e\\x74\\xcd\\x49\\xf5\\xad\\x2c\\x6f\\xef\\x83\\xcf\\x08\\x68\\x3b\\x95\\x70\\xa9\\x46\\xad\\x49\\x03\\xdf\\x4e\\x96\\xec\\x00\\x8e\\x14\\xa5\\x01\\xfa\\x93\\x86\\xbd\\xaf\\x2a\\x63\\x99\\x3c\\x6c\\x9b\\xdf\\x23\\x1f\\xd0\\x9e\\xa6\\xf9\\x6e\\xf4\\xd4\\xe2\\x9a\\x3a\\x33\\x27\\xcb\\xf7\\x4e\\xa8\\x31\\x05\\x4e\\x66\\xca\\x86\\x68\\x0c\\x6c\\xe5\\x3b\\x66\\xf9\\x46\\x5d\\x06\\xb3\\xfa\\x07\\x98\\xbb\\x69\\x05\\xae\\x38\\x45\\x59\\x34\\xf2\\xfb\\x7e\\x0b\\xa4\\x72\\x32\\x89\\x89\\xf0\\x01\\x30\\x86\\x71\\xcc\\xcb\\x56\\x6d\\x22\\x2c\\x72\\x16\\x5b\\xb3\\xa7\\x44\\xfb\\x98\\xe2\\x21\\x0f\\x96\\x20\\x68\\x0d\\xf3\\xe3\\xcd\\x14\\xa8\\xbd\\x94\\xb5\\x74\\x5c\\x00\\x16\\xdd\\xa7\\x7f\\x05\\x9f\\x26\\x05\\x3b\\x64\\xcf\\x45\\x23\\xc3\\xd4\\x29\\x11\\x2f\\xb6\\xb3\\x28\\x39\\x8b\\xc6\\x30\\xa2\\xe9\\x06\\xb9\\x5a\\x6c\\x57\\x80\\xcf\\xdc\\x06\\x41\\xbe\\x47\\x51\\xbe\\xbd\\xdf\\x77\\x24\\xdc\\x9c\\x27\\xe7\\x8d\\x60\\xed\\x0f\\xd7\\x36\\xd5\\xab\\xd8\\x89\\x29\\xc1\\x79\\x5d\\x47\\x3a\\xbd\\x2b\\x03\\x20\\xc5\\x40\\x47\\x57\\x28\\x82\\x18\\x67\\xa4\\x09\\xa2\\xff\\x13\\xcc\\x44\\xce\\x35\\xe5\\x98\\x1e\\x9f\\x6b\\x87\\xa2\\x8d\\x4f\\xa8\\xb8\\x67\\x5e\\x50\\x3f\\xae\\xfc\\xa7\\xc1\\xd7\\x98\\x47\\x37\\x87\\x1f\\xe9\\x19\\xac\\x41\\x4e\\xea\\x26\\x5e\\xe3\\x1f\\x9f\\x78\\xf5\\x21\\xf3\\xf4\\xf8\\xd0\\x0c\\x3f\\xb7\\x91\\x71\\xf3\\xc6\\xa5\\xdb\\xf5\\xe1\\xac\\x8b\\xf6\\x3b\\x4c\\x3d\\x8d\\x8b\\xc1\\x21\\x03\\x6e\\x9e\\x55\\xbb\\x70\\x2e\\xa6\\xc8\\x6e\\x92\\x5e\\xc0\\xb9\\x84\\xde\\xd2\\xc7\\x1f\\x3b\\xfd\\x49\\x32\\xe6\\xc4\\x1b\\x58\\x2f\\xd0\\x2c\\xa5\\x9f\\x53\\xce\\x29\\x74\\x45\\x78\\x5c\\xc4\\xca\\xc2\\x47\\xb0\\xb8\\x4e\\x7f\\xa0\\xbc\\xdc\\xf7\\x9b\\x3e\\x4a\\x15\\x5f\\x98\\x78\\xc1\\xf6\\x43\\xbe\\x9c\\x42\\xf7\\xa4\\xf2\\x72\\x60\\x44\\x45\\x05\\xc1\\x84\\x5b\\xd5\\x3b\\x55\\x0a\\x31\\xd7\\x95\\x3c\\xc7\\x38\\x86\\x1f\\x46\\xbd\\xf4\\x87\\x0f\\x3a\\x77\\xac\\xe1\\x91\\xab\\xd6\\x3c\\x45\\xad\\xb1\\x53\\x90\\x9f\\xb5\\x9a\\xb5\\xdb\\x9b\"},\n{{0xf0,0x92,0xe6,0xbe,0x8d,0x2d,0x9a,0xd0,0x69,0xa3,0xe2,0xb9,0x76,0xd2,0x44,0xe3,0x4c,0x15,0xc2,0x8c,0x48,0xd3,0x2f,0x55,0x60,0xa5,0x41,0x85,0xd1,0x50,0x15,0x02,},{0xcf,0xeb,0x3e,0x74,0xe4,0xb5,0xc8,0x35,0x6a,0x81,0x75,0x7b,0x8f,0x1b,0xe4,0xb4,0x29,0xfc,0x18,0xfc,0xaf,0x49,0x7c,0xbf,0x8d,0x8b,0xc0,0x48,0x0f,0xf9,0x78,0xf9,},{0x63,0xcd,0x4c,0x0b,0xa3,0xbe,0x93,0x97,0xcc,0x0f,0x3c,0x1a,0xf3,0x48,0xec,0x4b,0x8a,0x91,0xe4,0x2f,0xee,0x67,0x5d,0xa1,0xd0,0x59,0x00,0xb9,0xa8,0x6c,0x13,0x8f,0x91,0x74,0xeb,0x99,0x6b,0xbd,0xf3,0x1c,0x42,0x95,0xe0,0xc5,0x78,0xac,0x0f,0x9d,0x53,0x76,0x41,0xa2,0xaf,0xd5,0xdf,0xf9,0x3a,0x39,0xc5,0xcd,0x9d,0x3c,0x48,0x0b,},\"\\x2c\\x25\\x5f\\xb2\\x5d\\x45\\xb0\\x86\\xc0\\x71\\xe0\\x3e\\x52\\x5b\\x4d\\x72\\x85\\x78\\xfb\\xb6\\xb0\\xc6\\x0d\\xa9\\x41\\xe6\\xbf\\x2a\\x48\\x98\\xb2\\xd5\\xb6\\x98\\x8c\\x53\\x30\\x27\\x85\\xab\\x7a\\x3b\\xc4\\xbb\\x2c\\x20\\x5a\\xcd\\x27\\xd6\\xa4\\xcb\\xdd\\x1a\\x0c\\x08\\x89\\xde\\xd7\\x84\\x26\\x4c\\xb7\\xc0\\x28\\x89\\xc5\\xc7\\x11\\x3f\\xc9\\x0b\\xbb\\xcd\\x31\\xff\\x00\\x14\\x32\\xc0\\x53\\xf9\\x71\\x07\\x3c\\xf6\\x71\\x2f\\x66\\x7f\\xce\\x46\\x98\\x77\\x6b\\x98\\xcc\\x54\\x44\\xc6\\x92\\xab\\xd1\\x28\\x81\\x98\\xbe\\x5a\\xd5\\x67\\x46\\x09\\xf7\\xe1\\x39\\xad\\x1b\\x9c\\xcb\\x94\\x3f\\x8d\\xfd\\x9d\\x12\\xc5\\x4e\\xce\\xe2\\x78\\x34\\x1b\\x2e\\xe1\\x27\\x79\\x91\\xca\\x62\\xcd\\x3b\\xfe\\x12\\x8d\\x13\\x92\\x96\\x4e\\x95\\x88\\xe2\\xf9\\x7c\\x32\\x17\\x04\\xa3\\xde\\x10\\x61\\x88\\xc5\\xeb\\x33\\x5a\\xa5\\xa1\\x9a\\xcc\\x90\\x67\\xb4\\xa9\\x41\\x29\\xb9\\xd1\\xa6\\x16\\x7c\\x4b\\xbf\\xb5\\x6f\\xb9\\x76\\x84\\xcb\\xbd\\x72\\x0c\\x86\\x86\\x9e\\x00\\x20\\xab\\x07\\x76\\xcd\\xc9\\x95\\x4f\\xeb\\xa8\\x62\\x12\\x4b\\x07\\x3f\\xba\\x8d\\xe9\\xea\\x9a\\x38\\xea\\xcf\\xa0\\x03\\xae\\x4f\\x1c\\xdc\\xbf\\x15\\xc3\\x2f\\xb6\\xb9\\x70\\xc7\\x31\\x15\\xdd\\xff\\xcd\\x4f\\xa3\\xb7\\x18\\x46\\x11\\x0e\\xde\\xc2\\x57\\xfc\\xae\\xd6\\x11\\x36\\x04\\xf7\\x19\\x25\\x72\\x57\\x72\\x64\\xb9\\x90\\x5c\\xa6\\xae\\xd8\\xda\\xec\\x13\\x84\\x03\\xca\\x41\\xaa\\x95\\x42\\x78\\xa5\\x72\\x0b\\x26\\x7b\\x90\\xca\\x16\\x3a\\x9b\\xdf\\x44\\x7e\\xad\\xe8\\xde\\xb7\\x69\\xa3\\xb4\\x92\\x37\\xa7\\x35\\x16\\x97\\x7c\\x28\\x73\\x45\\x55\\xdd\\x23\\x4c\\xa7\\xde\\x49\\x99\\x26\\x1b\\xc7\\x96\\x0f\\x53\\x6b\\xa8\\xa3\\x5a\\xd3\\xd0\\x2c\\x75\\xf1\\xc2\\xbe\\xa0\\xa0\\x61\\x2e\\x7d\\x49\\xc4\\x03\\x97\\xdd\\x6a\\xf5\\xff\\x58\\xba\\xe6\\xa6\\x4b\\x6a\\x77\\xe9\\x81\\xf9\\x2d\\x15\\x9e\\x0b\\x2b\\xd2\\x05\\xab\\x15\\x70\\x52\\xf4\\x70\\x17\\xa3\\xe1\\x8a\\xec\\x94\\x4d\\x04\\x65\\xee\\x00\\x17\\xe9\\x61\\x48\\xa6\\x12\\x9f\\x74\\xd3\\xcc\\xb4\\x89\\xfe\\xa1\\x3a\\x15\\xa9\\xb9\\xac\\xed\\x58\\xc6\\xee\\x0e\\x6e\\x84\\xe0\\x5f\\xda\\xdf\\xae\\x07\\xb3\\x34\\xa9\\x8f\\xc3\\x7f\\x7e\\x51\\x1c\\xd5\\xa4\\x4e\\x9c\\x74\\xe4\\x78\\xd3\\x49\\xe3\\x0e\\x29\\xae\\xb4\\x6a\\x4d\\xf0\\x1e\\x43\\x07\\xfe\\x65\\xe1\\x39\\x4a\\x75\\x8f\\x6a\\xda\\x2f\\xb1\\x20\\x22\\x5c\\xcd\\x50\\xa4\\x90\\x13\\xe6\\xc9\\xf1\\x75\\xaf\\x90\\xf3\\xfc\\x8c\\x57\\xe7\\xa6\\xa9\\x69\\xa9\\x16\\xc3\\xf1\\xaa\\xcc\\x22\\xf3\\xe0\\x1a\\x07\\x0c\\xc4\\x8e\\x6f\\xd8\\x78\\xe2\\xbd\\x07\\x3d\\xf9\\xee\\x6f\\x05\\x9b\\x98\\x56\\x84\\x04\\xfc\\x7e\\xae\\x7d\\x4b\\xf6\\xfa\\x16\\xc0\\xc8\\x03\\xc6\\xbe\\x84\\xe8\\xb7\\x9c\\x67\\xaf\\xfc\\x8c\\x88\\xca\\xbd\\xee\\xbc\\x11\\x34\\xbb\\x23\\x86\\xe2\\x2b\\xa4\\xd2\\xe9\\xe0\\xf3\\xe1\\xab\\x3a\\x0d\\xac\\x7c\\x80\\xdd\\xee\\xd7\\x73\\xcd\\xa0\\xc4\\x1d\\xc9\\xde\\xfa\\x67\\xfe\\xa3\\x77\\x69\\xcb\\x4a\\x1e\\x15\\x22\\xd7\\xe0\\xb3\\xd7\\xc4\\x63\\x8b\\xcd\\x98\\x31\\x53\\xd4\\x78\\xbe\\x5e\\xcf\\x2b\\x6a\\xb1\\xb4\\x01\\x24\\xe4\\x22\\x2b\\x8c\\xaa\\x46\\x47\\xbd\\x50\\xd7\\x4d\\x20\\x39\\x43\\xab\\x20\\x93\\x8d\\x5f\\x27\\xd9\\x08\\xa6\\x73\\x67\\x40\\x46\\xce\\x2e\\xf1\\x8e\\x85\\x8b\\x0a\\x01\\xa7\\xe7\\x53\\x0d\\xed\\x0f\\x8c\\xc8\\x9e\\xf0\\x9b\\x73\\xca\\x59\\x7c\\xf7\\x3a\\xfb\\xc9\\xa2\\x71\\xa4\\xd2\\x3c\\x92\\xfe\\x59\\x18\\x83\\xc4\\x40\\x10\\x9c\\x4e\\xf4\\x16\\x67\\x0b\\x7f\\x2c\\x59\\x05\\xb7\\x7f\\x65\\xf5\\x6d\\x09\\xd4\\x02\\x50\\x35\\x6f\\x9b\\x1d\\xbc\\xaf\\x1e\\xe2\\xc0\\xb6\\x36\\x96\\xf8\\x4d\\x68\\xdd\\xbe\\xa1\\x60\\x08\\x51\\x51\\xa9\\x52\\x62\\x74\\xd7\\xb8\\x46\\xcc\\xeb\\x6c\\x43\\x48\\x09\\x84\\x84\\xde\\x3b\\xb7\\x23\\xae\\x5e\\x85\\x27\\x6d\\xf4\\x9f\\x56\\x34\\x13\\x0f\\xf9\\x05\\x75\\x4f\"},\n{{0x01,0xa2,0x47,0x94,0x3a,0xfe,0x83,0xf0,0x36,0xb6,0xb6,0x0f,0x23,0xd9,0x77,0x74,0xfd,0x23,0x20,0x8e,0xdc,0x31,0xcf,0x3d,0x88,0x20,0xe9,0xdc,0x63,0x66,0x11,0x03,},{0x8c,0x97,0xa5,0x8b,0xe0,0xe8,0x47,0xc4,0x8a,0x6a,0x39,0x87,0xcf,0xe2,0x50,0xa8,0xd7,0xb0,0x7d,0x97,0xf9,0x61,0xf6,0xb7,0xb7,0x9e,0x7d,0x80,0x42,0xb8,0xbd,0x7b,},{0xed,0x2c,0xed,0x1a,0x4f,0xdd,0xb3,0x44,0x2a,0x63,0x73,0x48,0x17,0x9a,0x6a,0x5b,0xee,0xdc,0xb4,0x4c,0x8e,0x98,0x8c,0xa2,0x6f,0x78,0x93,0x6d,0x2c,0x8d,0xb5,0xc5,0x16,0xd5,0x4b,0x8c,0x4f,0x08,0xd9,0x1d,0xd7,0x04,0x2a,0xb6,0xab,0x26,0xd8,0x7f,0x23,0x0e,0xb2,0xb2,0x15,0x6f,0x3c,0xe2,0x99,0x4f,0xce,0x7c,0x2b,0x0f,0x10,0x0e,},\"\\x08\\xd8\\x14\\x95\\xda\\x77\\xf4\\x07\\x25\\x5c\\xc4\\x1a\\x81\\x8e\\xef\\xa7\\x27\\xe2\\xc4\\x7a\\xe4\\x11\\xf4\\xb5\\x41\\xf0\\x1f\\x81\\x1d\\x90\\x6d\\x55\\xfb\\x1e\\x3c\\x9c\\x48\\x4d\\xf3\\x05\\x65\\x36\\x4d\\xe9\\xdc\\xb9\\xfe\\xa0\\xaf\\x66\\x11\\x2f\\xe7\\x5f\\xd1\\x1a\\xe8\\x1d\\x26\\x41\\xb5\\x47\\x58\\x9f\\x8b\\x97\\x4a\\x97\\xe7\\x97\\x6e\\xd6\\x92\\xaa\\xd6\\x40\\xed\\xd2\\x88\\xbd\\x86\\x3d\\x11\\xc4\\xca\\x98\\x36\\xf9\\xd7\\xc1\\x15\\xc3\\xd9\\x88\\x30\\xd6\\x42\\x47\\xcb\\x6f\\x8f\\xb6\\x03\\xc6\\x98\\x11\\x33\\x55\\x2a\\x32\\x04\\x04\\x19\\x61\\xbd\\xd8\\x3e\\x2f\\x9d\\xeb\\xa7\\x70\\xc0\\x39\\x4f\\x9b\\x60\\x2a\\x45\\x35\\x51\\x07\\x49\\x21\\xa3\\xde\\x28\\x32\\x13\\x69\\xd7\\xf8\\xca\\x64\\x0c\\x45\\x10\\x9e\\x8f\\x52\\x2c\\x97\\xed\\x9f\\x35\\xb9\\x27\\x7a\\x35\\x0e\\x29\\x59\\x31\\xb4\\x2e\\x01\\x35\\xe9\\x4a\\x92\\xfe\\xd3\\x63\\xd6\\xca\\xe3\\x92\\xf7\\xc4\\x51\\x99\\x32\\x7e\\x24\\xb4\\xcf\\xa5\\x89\\x8a\\xb5\\x99\\xae\\x7b\\xd5\\x0b\\xd3\\xa0\\x0c\\x0d\\x00\\x7e\\x95\\xfa\\xf8\\xf2\\xae\\x10\\x38\\x02\\xca\\x7e\\x53\\xb2\\x79\\x18\\x4d\\x06\\x90\\x5f\\x57\\x48\\xca\\x8b\\xe1\\xf7\\x2e\\x66\\x8c\\xb8\\x32\\x83\\xdd\\x00\\x40\\x64\\x91\\xf8\\xb9\\xb4\\xe5\\xa9\\xd4\\xa5\\x43\\x8b\\x2f\\xa4\\x37\\x1e\\x0b\\x05\\x68\\x6f\\x87\\x57\\x5b\\xaa\\x79\\x6e\\x30\\x2f\\x08\\xff\\xc4\\x25\\x66\\x27\\x50\\xa3\\x3a\\x0c\\x9c\\xfa\\xa4\\xb4\\xd7\\x04\\x1f\\x92\\x64\\xfe\\xd7\\xbe\\x4f\\x9f\\xde\\x2c\\xac\\x68\\xa2\\x15\\x82\\x36\\xf6\\xac\\x43\\x04\\x7e\\x91\\x1f\\x4c\\x4e\\x8b\\xc6\\x63\\xfd\\xd5\\x05\\x17\\xdf\\xaa\\x8f\\xbc\\xd2\\x19\\xdd\\x7a\\x0e\\x93\\x69\\xf4\\x3d\\x0d\\xd2\\x5b\\x4f\\x0c\\xf9\\x30\\xf2\\x0b\\x7b\\x7c\\x6d\\xb9\\xd5\\xbe\\x0c\\x6e\\x19\\x60\\x94\\x1a\\x3e\\x04\\xd1\\x41\\xc0\\x3e\\x59\\x61\\xaa\\x33\\xe9\\x02\\x44\\x77\\xd5\\x33\\xc9\\x95\\x37\\x87\\x96\\xbf\\x22\\x92\\xad\\xe9\\x22\\x69\\x5b\\x14\\x56\\x9f\\xc3\\x39\\xb3\\xd9\\x08\\x5c\\x63\\xfc\\x6e\\x5b\\xef\\x4d\\x99\\x0c\\x80\\x33\\x3a\\x6b\\x57\\xaf\\x47\\x8f\\x93\\x8e\\x3e\\xe7\\x38\\xb1\\xd1\\x29\\xbd\\x97\\x6a\\xfe\\x68\\x61\\x28\\xbc\\xac\\x08\\xcc\\xbe\\xb0\\x34\\x9b\\x9b\\x53\\x73\\x13\\xbc\\x7b\\xf5\\x91\\xc6\\x5d\\x4a\\x71\\x23\\xad\\x30\\xbd\\xbe\\x14\\x86\\xb4\\x28\\x08\\x47\\x48\\xb6\\x50\\x7f\\x6f\\x5e\\xf6\\x7c\\x26\\xca\\x86\\x2c\\xf7\\x26\\xaa\\xc1\\x40\\xb8\\x61\\xae\\x0d\\xc7\\x4b\\xb3\\xc0\\xb4\\x89\\x78\\x9f\\x17\\x14\\x5e\\x9a\\x85\\x5a\\x3e\\x2b\\x5d\\xaa\\xc4\\x18\\xd8\\x35\\x37\\x33\\x23\\x9e\\xf6\\x9c\\x7b\\x56\\x5b\\x53\\x03\\xeb\\x87\\xbd\\x7f\\x64\\x9a\\xbf\\x40\\xa2\\xf1\\x35\\xa2\\x9e\\xd2\\x7e\\x3b\\xe4\\xc1\\x2c\\xd6\\xdd\\xd2\\xe5\\x41\\x8a\\x99\\x97\\x43\\x83\\x66\\x3f\\x58\\x49\\xbf\\x3c\\xe5\\x53\\x2b\\xf6\\x4a\\x80\\xaa\\x52\\x11\\x91\\xd2\\x53\\x90\\xbc\\x19\\xa4\\x5e\\xed\\x1d\\x3f\\xec\\xa1\\xd9\\xfc\\xc0\\xdb\\x03\\x1b\\xfb\\x48\\xe4\\x50\\xbe\\x3d\\x45\\x93\\x35\\x6d\\x5b\\xa0\\xf3\\x10\\x47\\xb4\\x57\\x74\\x5f\\x21\\xe3\\x2e\\xbe\\xa3\\xca\\x6c\\x35\\xf0\\x5d\\x78\\xd8\\xc3\\x16\\x40\\xb0\\xfe\\xcb\\x94\\x01\\x16\\x56\\x75\\xc7\\xf9\\xcb\\xb1\\x9b\\xc4\\xb5\\x67\\x7c\\x2c\\xce\\xdc\\x4e\\x7a\\xaf\\xb8\\x41\\x84\\xc1\\x91\\x99\\xac\\xa0\\xdb\\x21\\xcf\\x50\\x67\\xdc\\x3a\\xf7\\x69\\xbc\\xc6\\x29\\x35\\x5f\\xf7\\x25\\x7a\\x9e\\xfd\\x71\\xa6\\xa9\\x2d\\x13\\x0d\\x35\\xab\\xee\\x6e\\x70\\x60\\x5b\\x5c\\xab\\x93\\xc0\\x28\\xfa\\xc3\\xaa\\x23\\x44\\xba\\x86\\x1a\\xc1\\xe8\\xce\\x9a\\x4b\\x07\\x0c\\x3d\\xf7\\x40\\xd2\\x8c\\x5e\\xce\\x0f\\x1b\\xc3\\x1c\\x2d\\x7d\\x1e\\x5e\\xcc\\x76\\x10\\x44\\x80\\x93\\x91\\x33\\xa1\\x86\\x60\\xe4\\xa3\\xe4\\x84\\x6b\\x25\\x17\\xbe\\x3b\\x8e\\x7a\\xfa\\xfe\\x07\\x83\\x91\\xd8\\xaa\\x8e\\x5c\\x30\\x13\\x7e\\x85\\xd9\\x4d\\x64\\xa2\\x79\\xfb\\xee\"},\n{{0x91,0xfd,0xef,0xcd,0xbc,0x99,0x0d,0x3e,0x8e,0xeb,0x60,0x17,0x04,0x34,0xda,0x10,0x83,0x1b,0x03,0x08,0x1f,0x6a,0xfd,0x0d,0x7e,0x12,0xb1,0x00,0x11,0xe0,0x2a,0xef,},{0xc5,0x8d,0x3e,0x20,0xb8,0xd4,0x7b,0xa4,0x55,0xb9,0x12,0x57,0x2d,0xc8,0x40,0x81,0x5e,0x3d,0x88,0x5f,0xa5,0x91,0x7d,0x1d,0xa4,0x84,0x08,0xb9,0xa9,0x56,0x40,0x98,},{0x51,0x01,0x12,0x22,0x3b,0x33,0xa5,0xab,0x15,0x64,0xf7,0x53,0x71,0x91,0xcd,0x29,0x2a,0x9d,0xbd,0x5a,0x32,0x3d,0x7a,0xdd,0x05,0x84,0xc1,0xb0,0xad,0x00,0xd0,0xac,0x71,0x99,0xc3,0xfb,0x75,0x8e,0x91,0x3f,0xf3,0xd7,0x16,0xc2,0xe9,0x0d,0xd9,0x0d,0x4e,0x8f,0x59,0x95,0x1e,0x87,0xef,0x8b,0x78,0x21,0x4a,0x51,0x75,0xc4,0xe6,0x08,},\"\\x5b\\x0c\\x1a\\x3a\\x95\\xe0\\xba\\x74\\x74\\x76\\x6c\\x9b\\xad\\xfa\\xe3\\x4a\\xb8\\x60\\xe0\\xa6\\xc0\\x33\\xa2\\x2f\\xba\\x72\\x11\\x27\\xf5\\xbb\\xee\\xe8\\xe2\\xcb\\xde\\x1a\\x1d\\xfe\\xb1\\x8d\\x55\\x1c\\x95\\x99\\x4d\\x21\\xe3\\xeb\\xc6\\x8a\\xfa\\xe6\\x85\\x44\\x4a\\x3a\\x41\\x95\\xbc\\x75\\x55\\x38\\x90\\x3a\\xcf\\xa6\\x71\\x55\\x92\\xdd\\xe2\\x56\\xe7\\xa1\\xb4\\xc3\\x63\\xec\\xa7\\x1e\\xf0\\xf3\\xa4\\x8a\\xe3\\x44\\x2d\\x50\\xd5\\x66\\x1b\\x39\\x40\\x96\\xb7\\xec\\x27\\xbb\\xf5\\x29\\x53\\xf3\\x04\\x0c\\xd2\\x5b\\x78\\xce\\x47\\x55\\x27\\xe0\\xcc\\x59\\xf1\\xef\\x9a\\xe2\\xe0\\x59\\x04\\x31\\x58\\x2b\\x2d\\xf8\\x14\\x14\\x99\\x82\\x9a\\x2c\\x5f\\x7b\\xbe\\x35\\x98\\xe4\\xc9\\x6c\\xc0\\x1e\\xde\\x2f\\x43\\xb6\\x56\\x05\\xb4\\x88\\x59\\x37\\x09\\xc0\\x94\\xb5\\xa0\\x42\\xb2\\x85\\x55\\xfb\\x52\\x27\\xa6\\xd1\\x56\\x37\\x6f\\x3f\\xf0\\x7b\\xd5\\xc8\\xbc\\x68\\x04\\xd3\\x9a\\x32\\x82\\xac\\x59\\x70\\xba\\x08\\xae\\xbf\\x75\\x42\\xb8\\x45\\xf6\\xb5\\xc2\\x38\\xc2\\xce\\x20\\x44\\x3f\\x7f\\x77\\x55\\xd7\\x5f\\xe4\\xfa\\x16\\xb9\\x64\\x4c\\xa3\\xe2\\x1d\\x91\\xa9\\xa8\\x7c\\x68\\x61\\x15\\x74\\x8a\\x16\\xc0\\xae\\x4a\\xe4\\xe1\\x6d\\x1c\\x71\\xae\\x60\\x0b\\x39\\xcd\\x25\\xe5\\x63\\x3b\\x39\\x9f\\xee\\x7f\\xf2\\xe3\\x62\\xbe\\xd2\\x51\\x25\\xc6\\xfd\\x5c\\x7f\\x5f\\xfa\\x2d\\xa2\\x35\\x3f\\xd3\\x5b\\x78\\x4a\\x1b\\x1b\\x03\\x19\\x77\\x47\\x58\\xb7\\x39\\x0c\\x44\\xdc\\xc9\\x2f\\xca\\x42\\x01\\xdf\\xe1\\xa3\\x75\\x69\\xde\\x05\\xf0\\x66\\x4d\\x08\\xb9\\x0d\\x6e\\x2b\\xad\\xc2\\x1b\\x92\\xf9\\xce\\x87\\x21\\x42\\x35\\x7b\\x96\\x15\\x08\\x0a\\xb7\\x65\\x9a\\x24\\x6f\\xf0\\x85\\x2a\\xdb\\x17\\xdf\\xda\\x70\\xcf\\x17\\x54\\x15\\x7b\\x13\\xbc\\x03\\x2b\\x4c\\x5d\\xeb\\x8e\\x10\\x68\\xb4\\x69\\x2b\\x93\\x16\\x5d\\xa3\\x5e\\xfc\\x9d\\xa8\\x6a\\xcb\\xe6\\xf8\\x0f\\x01\\xbb\\xc2\\x6f\\x57\\x5e\\xc5\\xaf\\x5b\\x05\\x0e\\x98\\x28\\xaf\\xde\\x6c\\x3b\\x78\\xe7\\x33\\xeb\\x5a\\x91\\x24\\x92\\xf7\\x65\\xbc\\xad\\x73\\x1b\\x95\\xe3\\xab\\x88\\x96\\xb6\\x17\\x58\\xbf\\x91\\x3b\\x9a\\x15\\x68\\xf9\\xc5\\xb4\\x60\\x33\\xcf\\x45\\xdc\\xc1\\x75\\x0d\\xa2\\x06\\x6c\\x60\\x8d\\xc3\\xd3\\x43\\x73\\x8e\\x84\\x8d\\xc3\\x90\\xcd\\x47\\x44\\x32\\xe9\\x91\\xd7\\xaa\\x2c\\x5b\\x27\\x81\\x42\\x1e\\xfe\\x55\\xe3\\x6b\\x0b\\x42\\xc1\\xf4\\x9a\\xe2\\x77\\x48\\x0b\\x0f\\xc5\\xff\\x68\\x5b\\xb5\\xa3\\x1b\\xe3\\xa0\\xfa\\x44\\x82\\x38\\x16\\x07\\x70\\x37\\x54\\x8a\\x5c\\x9b\\x0e\\x1c\\xc6\\xc6\\x35\\x04\\xa4\\x07\\x57\\x9a\\x36\\x32\\xb3\\xc9\\x6f\\xcd\\x0d\\xe5\\xea\\x1e\\x4d\\x6e\\x87\\xc0\\xca\\xf7\\xb6\\xca\\xe3\\x12\\x0d\\xb8\\xb1\\xf4\\x61\\x5c\\xe6\\xa7\\x5a\\x81\\x65\\x4f\\x39\\x04\\x28\\xb6\\x4c\\x21\\x3e\\x72\\x7e\\xec\\x3a\\xe7\\xf9\\xf4\\x2d\\xb9\\x06\\xf4\\xde\\x1f\\xda\\xdd\\x34\\xa3\\xda\\x2a\\xeb\\x12\\xb4\\xd9\\xa1\\x85\\xf4\\xa6\\x0c\\xb0\\xc2\\x67\\x45\\xf5\\x30\\xb4\\x81\\xfc\\x97\\x6a\\x09\\x3c\\xe2\\x4a\\x30\\x91\\x6a\\xf6\\x05\\xee\\x94\\xb0\\x87\\x85\\x19\\x3a\\x94\\x9d\\x56\\x9c\\x4b\\x7e\\xf5\\x96\\x03\\xbb\\x62\\x43\\x60\\xe7\\xb4\\x08\\xd9\\x8c\\xa5\\x09\\xda\\xf5\\xa9\\x2a\\x6d\\x40\\x15\\xbd\\xb6\\xf9\\x7a\\xd4\\xff\\x0c\\xf0\\x5c\\x8f\\x0c\\xd5\\x47\\x6a\\x93\\x44\\x26\\xa0\\x59\\xf2\\x44\\x44\\x46\\xe5\\x86\\x4f\\x08\\x9e\\x0f\\x06\\x75\\x61\\x59\\x10\\x66\\x2d\\x7c\\x1e\\x79\\xa6\\xc7\\x5f\\xa3\\x14\\xb7\\xba\\x2c\\x64\\x3b\\x0d\\x37\\x65\\x3e\\xef\\xe5\\x93\\x17\\x2d\\x1d\\x33\\x2c\\x8d\\xd6\\x44\\x92\\xea\\xf1\\x04\\xfb\\x19\\x57\\xba\\xa5\\x20\\x49\\x44\\x2d\\x10\\xb5\\x6a\\xf8\\xea\\xe8\\xff\\x82\\xcd\\x8f\\x46\\xa0\\x49\\x4b\\xec\\x2f\\xcb\\x9f\\xad\\xf1\\x0c\\xf7\\x1a\\x6e\\xec\\xd0\\x54\\x7d\\xaf\\xdc\\x7a\\xdb\\xaa\\x45\\x03\\x78\\x3f\\x94\\x3a\\x46\\xb4\\xad\\x0e\\x6d\\xd7\\xf2\\xca\\xb5\\x56\\x17\"},\n{{0xef,0x00,0xb3,0xc1,0x81,0xf6,0x32,0x7d,0x02,0x25,0x67,0x51,0xcb,0x51,0xc2,0xc3,0x6c,0x0c,0x0a,0x78,0x07,0x63,0x40,0x54,0x8f,0x5b,0xc0,0x70,0xd8,0x6d,0x9e,0x26,},{0xdb,0x14,0xcd,0x32,0x58,0x8f,0xd7,0x41,0xe8,0xf4,0x2e,0x51,0x21,0xcc,0x81,0x1a,0xd4,0x50,0x63,0xf2,0x81,0x41,0xe8,0x3c,0x66,0x8f,0x07,0xd9,0x12,0x28,0xf0,0x49,},{0x13,0x9f,0x9c,0xb9,0x9b,0x99,0x5b,0xe6,0x58,0x8c,0xdd,0xb5,0x05,0x16,0x94,0x83,0x8f,0x9d,0x82,0xa6,0x07,0x61,0xfd,0xe3,0x04,0xb0,0x02,0x7f,0xf8,0x65,0x84,0xbf,0x65,0xc7,0x3c,0xc6,0xd2,0x53,0xe5,0x60,0xf6,0x55,0x25,0xdf,0x04,0xbf,0xe1,0x46,0xc8,0x3b,0x42,0x26,0x9c,0xf3,0x78,0x0f,0x8b,0xc3,0x92,0x43,0x78,0x94,0xae,0x01,},\"\\x7d\\x6a\\xbe\\xc7\\xa1\\x1a\\xf6\\x73\\x24\\xce\\x17\\xb1\\xd2\\x0b\\xb4\\x0c\\x66\\x8a\\x21\\x9b\\xc9\\x5d\\xf0\\x5e\\x32\\x5d\\x86\\xf8\\x87\\x95\\xe2\\x64\\xd4\\x54\\xfc\\x5f\\xa7\\xd9\\xc8\\xaa\\xfe\\x77\\xe9\\x0a\\x6a\\xf6\\xb5\\x74\\x53\\xd8\\x5b\\x97\\x0b\\x55\\x2a\\x85\\x6b\\xa6\\x59\\xab\\x31\\xbd\\x8a\\x66\\x0e\\xb7\\xd3\\x58\\x7b\\x45\\x3e\\x5c\\x5f\\xc6\\xb7\\x94\\x72\\xb2\\x6e\\x8f\\xf7\\xdd\\x6d\\xb6\\xbe\\x35\\x72\\x54\\x8b\\x0d\\x75\\x4e\\xd4\\xd9\\x85\\xb8\\xd9\\x96\\x5f\\x88\\xb9\\x52\\xfc\\x4f\\xa3\\xb7\\x61\\xcc\\xff\\xc3\\x53\\x54\\xdb\\x0e\\xb9\\xc5\\xa1\\x71\\x71\\x8a\\x8a\\x55\\x92\\x87\\x02\\x13\\x82\\x7d\\x36\\x91\\xba\\xe7\\xfd\\x9c\\x63\\xf2\\x05\\x03\\xe0\\x43\\x19\\xb5\\xe9\\x53\\x57\\x9d\\xe4\\x7e\\x3e\\xf8\\xe1\\x62\\x85\\x49\\x50\\x3c\\xb4\\xf6\\x87\\x1b\\xa2\\x5d\\xb8\\x73\\x47\\x08\\x0e\\x53\\x1a\\x51\\x7a\\x8b\\x72\\x21\\xe6\\xad\\x84\\xdf\\xf8\\x32\\x56\\xd9\\xab\\x9a\\x43\\x3d\\xe8\\x71\\xb9\\xcb\\x9c\\x50\\x44\\x58\\x9e\\x67\\x20\\x6b\\x31\\x7a\\x52\\x06\\xae\\xba\\x96\\xc9\\x2f\\xd6\\x09\\x40\\x71\\xc6\\x44\\xfe\\x52\\x65\\x8d\\xed\\x92\\x20\\xcf\\x6a\\xbd\\x50\\xe2\\x30\\x5a\\x1c\\x90\\xfd\\x66\\xaa\\xcf\\xb3\\x8e\\xb0\\x5e\\xaf\\xf6\\xca\\x5f\\x85\\xf4\\x29\\xcd\\x57\\x71\\x6e\\xb8\\x77\\x39\\xa0\\x2b\\x64\\xcf\\xfa\\x08\\xc4\\xf6\\x85\\xb0\\x03\\x10\\xb5\\xb4\\x84\\x49\\x20\\xdf\\x21\\x5a\\x9f\\x24\\xa1\\x76\\x13\\xae\\xf8\\x5f\\xec\\x94\\xf5\\x11\\xdc\\x8a\\x42\\x94\\xed\\xdc\\xea\\x11\\xc0\\x8c\\x0b\\x39\\x9a\\x23\\xd9\\x16\\x38\\x3e\\x29\\xad\\xeb\\x98\\xc6\\x5d\\x41\\xc7\\x05\\xa5\\x7f\\x84\\x05\\x20\\xfa\\x80\\x8d\\x7f\\xd2\\x5f\\xdc\\xe1\\x59\\xf7\\xa0\\x84\\xd0\\x62\\x97\\x4b\\x30\\x13\\x2a\\x57\\x12\\x42\\xba\\xff\\x41\\x96\\x24\\x6d\\x6d\\x75\\x7b\\x31\\x2e\\x9d\\x60\\x85\\x53\\xd2\\xdc\\x53\\xb6\\x23\\xb2\\xe9\\x5c\\x75\\x38\\xfb\\xc5\\xde\\xb6\\x2b\\xa7\\x37\\x76\\xd8\\x5e\\x51\\x18\\xfa\\x1a\\x30\\x2d\\x4d\\x07\\x6d\\x99\\xe1\\x00\\xf0\\xdf\\x11\\x9c\\x33\\xfc\\x66\\xcd\\xfe\\x6f\\xd4\\x4d\\x71\\x99\\x7b\\x78\\xc8\\xf7\\x89\\x0c\\x70\\x73\\x46\\x05\\x62\\x20\\xd1\\xe9\\xde\\x88\\xbc\\x17\\x3c\\xf0\\xb7\\x6c\\xb3\\x02\\x87\\x7e\\xc1\\x6a\\xf4\\x6e\\x4c\\x31\\x63\\x9f\\x54\\xee\\xdc\\x16\\xda\\x9d\\x9e\\xb0\\xad\\x95\\xbd\\xa5\\x45\\xdf\\xc4\\xa7\\x32\\xb6\\xda\\x98\\x14\\x13\\x6a\\xb1\\xb9\\x39\\x2a\\x07\\x1b\\x02\\x24\\x73\\xb3\\x49\\x05\\x57\\x69\\x8b\\x77\\xe7\\x44\\x7a\\xc8\\x59\\x0d\\xca\\xf4\\xf2\\x42\\xad\\x3d\\xfb\\xc0\\xdf\\x71\\x6c\\xc0\\xea\\x75\\x36\\x26\\x97\\x3d\\xf0\\x8d\\x93\\x5d\\x17\\x8e\\x33\\x12\\xfb\\xe2\\xa7\\xba\\x9c\\x50\\x93\\xc5\\x3b\\x92\\x55\\xea\\xca\\x29\\xb7\\x25\\x78\\xe3\\xba\\x1b\\xdf\\xaf\\x0c\\x9e\\xce\\x21\\xa5\\xdf\\xf6\\xea\\x42\\x15\\x24\\xf7\\x0f\\xc1\\x90\\x4e\\x9a\\x2c\\xf7\\xc5\\x18\\xbf\\xcc\\x7e\\x36\\x73\\xee\\x87\\xff\\x27\\xe1\\xca\\x2a\\xc3\\x2b\\xcb\\x40\\x91\\xcb\\x34\\xa8\\x2a\\x71\\x56\\x3f\\xf6\\xa6\\xa1\\x5d\\xa0\\xeb\\xd5\\xbd\\x10\\x25\\x6c\\xe9\\x60\\xf4\\xea\\xa7\\xfe\\x35\\xe1\\x28\\x88\\x60\\x50\\xd0\\x49\\xfe\\xc3\\xa4\\xab\\x16\\xd5\\xb0\\xc1\\x07\\x26\\x7e\\xae\\x1a\\xb8\\x01\\xea\\x5b\\x91\\x98\\x38\\x39\\xda\\x1c\\x48\\x8c\\x12\\xf8\\x64\\xd7\\xc3\\xa7\\x7f\\x2b\\x6a\\xe2\\x7d\\x54\\x01\\x09\\xf6\\x8d\\x78\\x36\\x4b\\xb6\\x27\\x18\\x3b\\xd5\\x03\\x91\\x75\\x47\\xaa\\xf3\\xb3\\xa1\\x80\\x9d\\xa0\\x25\\x77\\xb3\\xf0\\x3a\\x9a\\x3f\\x5a\\xf4\\x8c\\x88\\x02\\xe2\\x97\\xc8\\xbb\\x63\\xdb\\x6a\\x86\\xd3\\xea\\x72\\x7a\\x6d\\x71\\x48\\xb3\\xaa\\x44\\x4b\\x8d\\x16\\x8f\\x38\\xc6\\xc8\\xf2\\x40\\x88\\xa4\\x9a\\xf3\\x31\\x77\\xa3\\x44\\xad\\xab\\x2c\\xf6\\xe0\\x8e\\x0c\\xb0\\x37\\x1e\\xd5\\x2b\\xde\\xad\\x13\\x2f\\x77\\xe7\\xae\\x3e\\xe5\\xd8\\xfb\\x17\\xaf\\xc0\\xa0\\xbb\\x73\\x11\\xb9\\x56\\x0b\\x67\"},\n{{0xd0,0x71,0xd8,0xc5,0x57,0x8d,0x02,0x59,0x49,0x93,0x2a,0xa6,0xbf,0x6a,0x80,0xb1,0xcc,0x41,0x2f,0x10,0x6f,0x91,0x57,0x4e,0xe2,0x46,0x54,0xb4,0x45,0xee,0x9a,0x97,},{0x9b,0xcb,0xf7,0xd2,0x21,0x2f,0xb6,0x2c,0xcc,0xf8,0xb6,0xc7,0x68,0x03,0xa5,0xea,0x24,0x40,0x9d,0xa6,0x28,0x7e,0xfb,0xb8,0xb1,0xf0,0xc7,0xb3,0x0e,0xbd,0xd9,0x3e,},{0x0c,0x29,0x7a,0xbe,0x0f,0xd8,0xeb,0xcc,0x6b,0x77,0x19,0x98,0x75,0x5e,0x2c,0x6b,0xe0,0x7c,0x81,0x2b,0x5a,0x80,0x54,0x49,0x57,0x06,0x31,0x70,0xca,0x69,0x43,0x2e,0x72,0xb6,0x0d,0xaa,0xe3,0x22,0x95,0x8a,0x22,0x38,0xcd,0x6a,0x46,0x28,0x94,0xa3,0x87,0xee,0xf6,0x5b,0xf9,0x6f,0x63,0xf5,0x4c,0x08,0x56,0x87,0xa5,0x02,0x75,0x0e,},\"\\x3e\\x8e\\xe7\\x0e\\x51\\xe5\\x6e\\xf5\\x7f\\x6e\\x66\\xb3\\xa8\\x84\\xaa\\x04\\xa7\\xb4\\xd4\\x59\\x9f\\xb9\\xb4\\x39\\x96\\xb3\\x93\\xa8\\x68\\x09\\x35\\x12\\xea\\x74\\x1a\\x0c\\x6a\\x94\\xf4\\x0c\\xe4\\x98\\x62\\xd2\\xfd\\x1f\\x75\\x51\\xf4\\x64\\x7a\\xbd\\x80\\x75\\xbc\\x1b\\x74\\x2a\\xd4\\x0e\\x29\\xa6\\x04\\x61\\x30\\x12\\x24\\xfe\\x8f\\x76\\x92\\xb1\\x47\\x72\\x78\\x2b\\x4e\\x89\\x6b\\x63\\xfe\\x05\\xab\\xd5\\xff\\x53\\x14\\xf9\\xec\\x80\\x75\\xf2\\x8d\\x90\\x8c\\xca\\xaa\\xce\\x5e\\x90\\x5e\\xa7\\xf5\\x7a\\x49\\x1b\\x99\\xb3\\x59\\x1e\\xea\\x54\\xa6\\xb7\\x81\\x91\\x67\\x74\\x9d\\x38\\xa0\\x47\\x62\\x06\\x76\\xa1\\xa7\\xaf\\x11\\xf4\\x85\\xa5\\x5b\\x7c\\x87\\x9e\\x68\\x50\\x38\\x08\\x58\\xc8\\xf4\\x5c\\x0c\\x1c\\xcb\\xd7\\x40\\x6e\\xd0\\x99\\xd8\\x4a\\x74\\x71\\xb9\\x35\\x0c\\x4d\\xdb\\x28\\x47\\x0b\\xf5\\xbf\\x32\\x7d\\x5b\\x3c\\x22\\xd8\\x99\\xb4\\xc6\\x60\\x83\\x9e\\x10\\x4a\\x06\\x22\\xae\\x85\\xc8\\x4a\\xa9\\xfc\\x7f\\x0a\\x2c\\x7c\\xeb\\x6e\\x69\\x1c\\x49\\xc0\\x64\\xb5\\x31\\x34\\x99\\x68\\x3e\\x8e\\x03\\xb2\\x11\\x5e\\xda\\x7d\\xda\\xd5\\x5a\\x49\\xf9\\xfb\\xe6\\x25\\x44\\xf9\\x14\\x51\\x1c\\xfb\\xec\\x6b\\x84\\xdb\\xde\\x7e\\x80\\x90\\x9b\\x45\\xfb\\x10\\x50\\x2e\\x2c\\xaa\\xa7\\x21\\x24\\xfd\\x94\\x56\\xa3\\x87\\x2f\\x95\\x92\\x70\\x7e\\x9a\\x4c\\x50\\x12\\xda\\xa9\\x72\\xea\\xf6\\x5f\\xab\\xe5\\x53\\xde\\xbe\\x82\\x57\\x01\\xef\\xef\\x5c\\x75\\x6b\\xb4\\x65\\xe9\\x66\\xab\\x68\\xdd\\x52\\xf3\\xdd\\x00\\xa4\\x5c\\xf6\\xdc\\x3f\\x19\\xb8\\x6b\\xb0\\xdb\\x4a\\x86\\xe4\\x66\\x98\\x85\\xa0\\x74\\x69\\x6a\\x67\\xd8\\xea\\x21\\x18\\xc7\\x66\\xef\\x62\\x5f\\x8a\\x98\\x02\\x6f\\x9f\\x4a\\x3c\\x5c\\xcc\\xf9\\x84\\x6f\\xdc\\x90\\xed\\x93\\xec\\x7c\\x1f\\x3c\\x70\\x86\\x95\\x4f\\xa2\\xf0\\xa4\\xca\\x96\\xd4\\x01\\x84\\xaa\\x57\\x54\\x55\\x27\\xa1\\xf9\\x65\\xc1\\x1d\\x84\\x3c\\x90\\xc5\\xa5\\xe0\\x8d\\x7c\\x11\\xf2\\xd5\\x61\\x00\\x4e\\x90\\x57\\x48\\x52\\xeb\\x50\\x46\\xaa\\x1e\\xa7\\xb6\\x10\\x09\\xfd\\x5d\\xd7\\xd6\\x24\\x2a\\x8d\\xf5\\x8a\\x9e\\x8e\\x55\\x5c\\x7f\\x4c\\xdc\\x13\\x0d\\x69\\x01\\xbf\\xe6\\x79\\x7f\\xdc\\x6c\\x39\\xbe\\xec\\xfb\\xba\\xb6\\x62\\x5b\\x2e\\x4f\\xb9\\xd8\\x00\\x02\\x76\\xd4\\xa9\\x4f\\xc6\\xfc\\x10\\x51\\xfe\\xff\\xf5\\xad\\xeb\\x72\\x4b\\x87\\x09\\x0d\\xb0\\xa2\\xc6\\x97\\xd0\\x56\\x66\\x4d\\x99\\x1f\\xad\\x80\\xdc\\x80\\xfa\\xb7\\x00\\xb1\\xf1\\xf2\\xee\\x27\\x73\\x4e\\xbc\\x26\\xb2\\xa6\\x41\\xc3\\x2a\\x0c\\x91\\x1b\\x27\\x0a\\xc7\\x6b\\x0d\\xa5\\xc0\\x89\\x14\\x97\\x1c\\x91\\x12\\x46\\x3a\\x70\\x70\\x9c\\x0d\\xda\\xc7\\x91\\x00\\x16\\xf9\\x13\\xf6\\x21\\x00\\x86\\xd7\\x25\\x5c\\xef\\x11\\x95\\x57\\x10\\xf6\\x51\\x88\\x9c\\x83\\x62\\x1d\\xd8\\xa4\\xfc\\xd5\\x36\\x63\\x02\\xd6\\xc9\\xb5\\x6e\\xef\\xcf\\xac\\x85\\xc1\\x4a\\x94\\x78\\xb6\\xd7\\x18\\x07\\x54\\x28\\x80\\x07\\x60\\x51\\x5c\\xab\\x5f\\x3d\\x44\\x55\\xe2\\xb9\\x70\\xdf\\x9f\\xe4\\xbe\\x83\\x83\\xd7\\x04\\x83\\xbb\\xdd\\x75\\x60\\x71\\xf5\\x3b\\x2f\\x9c\\x27\\x5c\\x7c\\x85\\x12\\xd1\\x63\\x51\\x8f\\xe5\\x55\\x83\\x75\\x14\\xc8\\x67\\x76\\xc9\\x47\\xf2\\x9a\\x77\\x57\\x02\\x87\\x44\\x6b\\x69\\xbe\\x40\\xc8\\xd4\\xab\\xbd\\x65\\xef\\x25\\x07\\x24\\x9b\\x5a\\xec\\x33\\xac\\xb7\\xb8\\xbd\\x3f\\x35\\xbc\\x85\\x9b\\xa4\\xe3\\x7b\\xdb\\x49\\xcf\\x91\\x3d\\x93\\x98\\x9c\\x44\\x38\\xd2\\xab\\xcf\\xa3\\x88\\xcc\\x89\\xd7\\x8a\\xc0\\x62\\x70\\x65\\x64\\x92\\xe7\\x52\\x8f\\x29\\xbd\\xfe\\x8c\\xbb\\x9b\\xfa\\x9e\\x73\\xc1\\xda\\x01\\x3f\\xc3\\xce\\x21\\x05\\x65\\x76\\x13\\xff\\x62\\xbb\\x0c\\x3b\\xf4\\xde\\xe3\\xb0\\xd2\\x65\\x9c\\x72\\x6e\\x7b\\xcd\\x9e\\x97\\xec\\xce\\x92\\x47\\xd4\\x60\\x0d\\xfe\\xaf\\x60\\x44\\x4e\\xd8\\x62\\xb0\\x0b\\xa1\\x1e\\x70\\xea\\x88\\xd4\\xf0\\xb6\\xb5\\x39\\xfc\\x9f\\x36\\xbb\\x2a\\x1a\\x9e\\xd2\\xb3\"},\n{{0xe9,0xd4,0x86,0xc2,0x9a,0xe8,0x11,0xb9,0x42,0xe1,0x0d,0x81,0xf0,0xa6,0x71,0x63,0x17,0xb8,0x42,0xc2,0xc5,0xbf,0xde,0xf5,0x5c,0xc4,0x32,0xb7,0xfc,0xae,0xb8,0x18,},{0x43,0xa5,0x2d,0x15,0xb9,0xf7,0x31,0xd7,0x37,0xb1,0xc4,0xdb,0xc3,0x22,0x27,0xa4,0x80,0x96,0x30,0x91,0xd2,0xc6,0x28,0x6f,0x48,0x2e,0xf1,0xe8,0x36,0x70,0x54,0xe5,},{0x65,0x19,0x1a,0xa8,0x85,0xdd,0xab,0x9f,0x67,0x27,0x18,0x79,0x95,0x2f,0xc6,0xaf,0xfe,0x41,0xca,0x20,0xeb,0x3b,0xcd,0x86,0x67,0x31,0x61,0xb0,0x3b,0x53,0x26,0x94,0xd6,0xdd,0x88,0x90,0x8e,0xb1,0xb1,0xee,0xc0,0x03,0xcf,0xcb,0xe6,0x14,0x6b,0x45,0x38,0xe2,0x1d,0xf5,0x59,0x69,0x91,0x2a,0x0d,0x7d,0x88,0x18,0xad,0x79,0x59,0x0d,},\"\\x14\\xfe\\x1e\\xd5\\xbb\\xbd\\x76\\xcc\\x73\\xdc\\x56\\x50\\xbd\\xa9\\x2d\\xe8\\x63\\x26\\xe2\\x4d\\x2f\\x1f\\x62\\x24\\xba\\x85\\x68\\x94\\x4d\\x6f\\xe3\\x44\\x26\\x75\\xdb\\x96\\xf1\\xd8\\x49\\x8f\\x16\\x34\\xff\\x9b\\x6e\\x50\\xcb\\xa9\\xdb\\x4e\\xb0\\xb0\\xb0\\x21\\xb2\\xbe\\xcf\\xce\\x4b\\xef\\x33\\xc4\\xce\\x0e\\x32\\xc8\\xa9\\x83\\x89\\xec\\xa9\\xe0\\x59\\xa6\\x62\\xd6\\xf0\\x37\\xc5\\x4a\\xa4\\x0c\\x76\\xcd\\xee\\xe8\\x56\\x50\\xf0\\x89\\xea\\x56\\xe1\\x38\\x3a\\xb0\\xf5\\xc3\\x6f\\x6d\\x66\\x45\\xff\\x7e\\x87\\x66\\x73\\x01\\xf9\\x44\\xfd\\xc2\\xed\\x35\\xb0\\xd2\\xc3\\x5c\\xb2\\xe4\\xb4\\x56\\x36\\xe7\\x49\\x8e\\x92\\x7f\\x58\\x46\\xb3\\xe1\\xed\\xfb\\xd1\\x60\\xa4\\xae\\xf3\\x32\\x0c\\x34\\x28\\x49\\x6b\\xda\\xaf\\x7d\\x3e\\xd5\\x6e\\xf0\\xb7\\x25\\x4a\\xc5\\x97\\xbe\\x58\\x9a\\x70\\x58\\x44\\x16\\x30\\x0c\\x1a\\xdc\\xfb\\xa4\\xf2\\x2c\\xfd\\x4c\\xd6\\x61\\xe1\\xf5\\x0f\\x15\\x5d\\x17\\x2f\\xa5\\x74\\x8d\\x29\\x6b\\x29\\xcd\\xd7\\xeb\\x81\\x21\\x48\\x3f\\xf1\\xd9\\xfe\\x95\\x3f\\x94\\x51\\xc7\\xc7\\xa5\\x42\\x00\\x72\\x85\\xee\\x72\\x46\\xbc\\x0f\\xde\\xa9\\x38\\x81\\x40\\x29\\xab\\xce\\x05\\x7a\\x0e\\xcb\\x97\\x4b\\x12\\xd3\\x60\\xea\\xb6\\xaf\\xd3\\x07\\x97\\xd6\\x14\\x45\\xad\\x2b\\xac\\x7e\\x52\\xbc\\xe4\\x34\\x63\\x15\\xf7\\x8e\\xb8\\x75\\x42\\xd5\\x95\\x28\\xb2\\xf6\\xc5\\x6d\\x66\\x24\\x1c\\xb4\\x42\\x03\\x3f\\x64\\x3d\\x3d\\x2a\\x67\\xcb\\x63\\x7d\\x8d\\xa9\\x5d\\x4f\\xd1\\x23\\x4b\\x03\\x1a\\x3e\\x51\\x72\\x3a\\x1d\\x26\\xe6\\xf5\\xca\\x07\\x98\\x73\\x21\\xad\\x11\\xa9\\x0f\\xcc\\x1d\\x4e\\x2b\\x0b\\x89\\x66\\x50\\xc3\\xa7\\x51\\x8d\\x56\\x55\\x29\\xbe\\xa8\\x06\\xa0\\x5d\\x44\\x7e\\x08\\xd2\\xa6\\xa3\\xdb\\xf1\\xa3\\x69\\x15\\xb2\\x95\\x7c\\xa5\\xb4\\x0e\\x58\\xb9\\x7a\\xd0\\x36\\x97\\x35\\xc4\\x28\\xbd\\x6d\\x69\\xbd\\x21\\x00\\x44\\xb6\\x51\\x41\\x8d\\x98\\xb0\\x59\\xd9\\x0c\\x83\\xe4\\x60\\x11\\xf4\\x1c\\x03\\x2c\\x56\\x55\\xa5\\xef\\x21\\xac\\x2c\\x8c\\x2b\\xc9\\x4b\\xe0\\x7e\\x45\\x42\\x6a\\x7a\\xe5\\xd4\\x7b\\x45\\xf2\\x7c\\xf4\\x28\\x9c\\xa4\\xdd\\xab\\xe0\\x8a\\x12\\xb9\\x10\\x20\\x7d\\xab\\xb3\\x4a\\x46\\xab\\x75\\xce\\x69\\xb5\\x8e\\x7e\\x17\\x66\\x4b\\xf3\\x35\\x9a\\x8f\\xb6\\x8e\\xb0\\x32\\xc9\\xea\\xa6\\xdf\\x87\\x38\\x29\\xf0\\xe0\\x84\\x85\\x53\\xf7\\x32\\xe1\\xc3\\xc0\\x84\\xb3\\x2b\\x7a\\xf7\\x50\\x74\\xe7\\xbb\\xaa\\x4e\\xb5\\xd7\\xea\\xd7\\xaf\\xf9\\x75\\x80\\x10\\x9b\\x60\\xf4\\xc7\\x92\\xf9\\xe2\\xa6\\x51\\x37\\xb0\\xaa\\x48\\x17\\x5b\\x81\\x15\\xd9\\x13\\x05\\xf4\\xc7\\x7e\\x2d\\x08\\xe7\\xe8\\xd7\\xe7\\x78\\x5c\\x96\\x68\\x42\\xc2\\xe3\\x50\\xfe\\xd4\\xf9\\xe3\\x3b\\xf6\\xe1\\x84\\xc5\\x50\\xb4\\xb0\\x6e\\x95\\x74\\x14\\xed\\xf5\\x2f\\xa0\\x79\\xe8\\x19\\x73\\x45\\x84\\x61\\xfb\\xb9\\xb7\\xd7\\xd3\\x4b\\xef\\x15\\x03\\x57\\xf4\\x32\\xca\\xac\\x3a\\xe9\\xf3\\xdc\\x96\\xeb\\x5a\\x2d\\x12\\x3e\\x09\\xed\\xa1\\x70\\x2e\\x1d\\x10\\x70\\x17\\x7b\\xb2\\x20\\xc4\\x23\\xc0\\x96\\xec\\x24\\x42\\x43\\x85\\xc6\\x79\\xbe\\x02\\xef\\x84\\xd0\\x9e\\xd1\\x02\\xf4\\x9c\\xad\\x3b\\x1f\\xd6\\x70\\x67\\x9a\\x39\\x71\\x4f\\xf1\\xd6\\xe4\\x22\\x8d\\x8d\\x7d\\x0e\\x19\\xed\\x0e\\xba\\x13\\x2f\\x21\\x28\\xd4\\x7b\\xaa\\x56\\x9a\\x8e\\xcb\\x7b\\xd4\\x8a\\x82\\x62\\x82\\xf9\\xcf\\xcb\\xf6\\x0d\\xde\\xce\\xaf\\x1d\\x02\\x13\\x2c\\x8a\\xff\\xed\\x3a\\x03\\xd2\\x34\\x0d\\xeb\\x78\\x7c\\xd6\\x49\\xc5\\x1c\\x6e\\xcb\\x9f\\xf7\\x5d\\x7a\\x7b\\x4e\\xf9\\xb1\\x51\\x39\\xcf\\xea\\x27\\x62\\xab\\x18\\x61\\x51\\x97\\xa6\\xb5\\x1f\\x6e\\x75\\xdb\\xd0\\x45\\x73\\xa2\\x44\\x80\\x94\\xd0\\xcd\\xeb\\x0f\\xe4\\x58\\x58\\x83\\xff\\x9b\\x68\\x82\\x4a\\x04\\xb8\\x3e\\xc9\\x1c\\xf8\\x4a\\xcd\\x6a\\x74\\x46\\xcb\\x1f\\x5e\\xe3\\x7d\\x5d\\xf8\\x0f\\x17\\xcb\\x2b\\xdc\\x3f\\x31\\x22\\xa8\\xfa\\xf7\\x6e\\xbd\\x06\\xcf\\xe8\\x17\"},\n{{0xe6,0xfa,0x10,0xdb,0xb4,0x78,0xe1,0xe3,0x6b,0x35,0xdf,0xeb,0x02,0x50,0xf6,0x3c,0x08,0x51,0x50,0x70,0xae,0x79,0xb2,0x2f,0x04,0x7e,0x27,0x17,0x08,0xd6,0x4f,0x5c,},{0xe0,0x2e,0x1f,0x2b,0xd8,0x79,0x2e,0xf4,0x83,0x48,0x1c,0x6d,0x11,0xf7,0xc7,0xc9,0xdb,0xde,0xec,0xc9,0x85,0x94,0x32,0xe7,0xf2,0x79,0xe9,0xd1,0x73,0xd3,0x11,0x64,},{0xc0,0x3c,0x47,0x03,0x59,0x12,0x7e,0x9d,0xe3,0xaf,0x0e,0x0e,0xd7,0xd3,0xb1,0x9f,0xae,0xe0,0xec,0x14,0x0b,0x79,0xc2,0x99,0xe2,0xcb,0x6d,0xac,0x0a,0x3e,0x7e,0x31,0x41,0x41,0xcc,0x85,0x4b,0x45,0x96,0xce,0x4c,0x51,0xc7,0xb0,0xde,0xc8,0xa5,0xc8,0xcf,0x09,0x36,0x20,0x53,0x61,0xd5,0x36,0x5f,0x4b,0xcc,0x07,0xc4,0x28,0x7c,0x07,},\"\\xad\\x31\\x60\\x75\\x8d\\x8c\\x08\\xa6\\x61\\x52\\x5c\\x95\\x28\\x0a\\x37\\x18\\x87\\x49\\x69\\x85\\x9f\\x1c\\xc9\\x18\\xe3\\x4f\\xec\\x00\\x8a\\xcf\\x23\\xb8\\x89\\x6e\\x8d\\x50\\xc3\\xc0\\x51\\x23\\x31\\xdc\\x89\\x78\\x0f\\x8b\\x10\\xfc\\x34\\x9c\\x67\\x5c\\x4c\\xd8\\x2a\\x5d\\xf8\\x58\\x6b\\x43\\xc8\\x64\\x44\\x8f\\xac\\x00\\xb8\\x47\\xb9\\xc9\\x80\\x54\\xab\\x79\\x3f\\x63\\xc7\\x1a\\xa5\\xe5\\x24\\x8e\\x22\\xd0\\x69\\xbd\\x3f\\x85\\x2a\\x3b\\x8c\\x6e\\x2a\\xc8\\xef\\x86\\x1d\\x90\\xbc\\xd9\\x84\\xbf\\xca\\x87\\x58\\x3e\\x59\\xe9\\xa7\\x46\\x8f\\x29\\xb8\\x08\\xdc\\x2f\\xe5\\x30\\x2a\\x98\\x9d\\x6f\\x2e\\xcd\\xe7\\x58\\x5c\\xd9\\xbe\\x4e\\x4c\\x76\\x1c\\x4d\\x4b\\x3e\\xea\\xf4\\x69\\x9f\\x65\\x56\\xef\\x03\\x9a\\xf2\\xb8\\x0f\\x94\\x07\\x60\\x5a\\xc3\\x97\\x35\\x1d\\xd8\\x55\\x95\\x58\\x44\\x95\\xba\\xa1\\x77\\xb0\\x8c\\x88\\xd2\\xec\\x1f\\xc4\\xe3\\x2d\\x1c\\x0b\\x8d\\x7e\\x7a\\xc5\\x83\\x9d\\xfb\\x92\\x3f\\x09\\xb3\\x23\\xe7\\x8e\\xce\\xb7\\xe9\\x6c\\x06\\x04\\xb0\\x1a\\x19\\xe4\\x9c\\x9b\\xea\\xf4\\xf2\\x5e\\xc4\\xa8\\x4c\\x1a\\x08\\xf2\\x38\\x0e\\xdd\\xc3\\xa7\\xf0\\x12\\x18\\x49\\x59\\xcc\\xd1\\x9e\\xcb\\xba\\xc6\\x5e\\xac\\xa1\\x55\\xce\\xe9\\xec\\xfe\\xc1\\x1e\\x7f\\xee\\x05\\x8e\\x17\\x4f\\xc4\\xed\\x7c\\x67\\x9f\\x2c\\x15\\x63\\x1d\\x4e\\x15\\x27\\xbc\\xdb\\x0e\\x3b\\xb0\\x81\\x5f\\xfd\\xff\\xc0\\xc8\\x56\\xbe\\xf0\\xdc\\x0f\\x5c\\x82\\x37\\xf7\\x09\\x8e\\x26\\xbd\\xb6\\x9e\\x87\\x82\\xd1\\xca\\x51\\x11\\xec\\x3c\\x7e\\xdb\\x42\\x5d\\xff\\x80\\x32\\x02\\x6c\\xba\\x3d\\x2e\\x08\\x1b\\x71\\x31\\x0d\\xb9\\xba\\xda\\xd1\\xad\\x02\\xf1\\xec\\xcc\\x53\\x7d\\x87\\x4c\\xd1\\x8c\\x6b\\xb0\\x12\\x21\\xf7\\x1e\\xe6\\x62\\x50\\xd9\\x4c\\xf8\\xec\\xce\\xaa\\x96\\xd3\\xc5\\x7e\\xea\\x2b\\x0a\\x8e\\xc7\\x24\\x29\\xd7\\x60\\x64\\x88\\xbd\\xf1\\x9e\\xc3\\xbb\\x16\\xe5\\x08\\x67\\xc7\\x93\\x7d\\xef\\x09\\xfc\\x78\\x3f\\x20\\xa2\\xa5\\xec\\x99\\x25\\x3d\\x6b\\x24\\x0d\\xf4\\x67\\x7d\\xd2\\xd5\\x27\\x7b\\x01\\xc5\\xb8\\xe5\\xbd\\x6c\\x7d\\xf0\\x87\\x42\\x05\\xbc\\x8c\\x2f\\xff\\xdb\\xa1\\x31\\x46\\x74\\xd3\\x1c\\x9b\\x2c\\x91\\x99\\x22\\x8e\\x19\\xe0\\x42\\x18\\x34\\xc1\\x65\\x7d\\x06\\x98\\x28\\x69\\x16\\xc7\\xe3\\x92\\xf0\\xab\\xd5\\x54\\x5b\\x96\\x3a\\xc1\\xff\\xa9\\x97\\x21\\x61\\x6c\\x23\\x79\\x6f\\x85\\xc3\\x4a\\x5c\\x66\\x4a\\xe8\\x1d\\x16\\xb2\\x16\\xa5\\xb0\\xcf\\x5b\\xc6\\xb5\\xa9\\x08\\x29\\x72\\x85\\xd6\\x16\\x44\\x12\\x8f\\x88\\x6f\\x38\\xaf\\x9e\\xdd\\x25\\x19\\x3d\\x7e\\xcc\\x77\\xa7\\x99\\x94\\x27\\x8d\\xa0\\x71\\xf5\\x44\\x95\\x93\\x7f\\xee\\xf5\\xa5\\x19\\x57\\x52\\x7c\\x3e\\xec\\x7c\\xb0\\xb4\\xe8\\xaa\\x7a\\x4e\\x85\\x6d\\xef\\xd5\\x7d\\xd9\\x23\\x34\\x15\\x1b\\x98\\x6a\\xa6\\x9c\\xa6\\x92\\x60\\xd1\\xe2\\xd7\\xb5\\x3c\\x05\\x67\\x7e\\xe0\\xd2\\x16\\xb2\\x8d\\x03\\x62\\x52\\xdd\\x30\\x06\\xde\\xbe\\x1b\\x65\\x74\\xa2\\x5e\\x6b\\x19\\xdf\\xb4\\x8f\\xa6\\x43\\x16\\xaf\\x8f\\xd6\\x8d\\x78\\x93\\xb3\\x97\\xe7\\xdb\\x57\\x80\\xab\\x27\\xbf\\x87\\x26\\xff\\xf6\\x05\\xd3\\xb4\\x6d\\x80\\x05\\x95\\xb4\\x62\\x4b\\xee\\x30\\x2c\\x96\\x43\\x26\\x03\\x4b\\x52\\x34\\xd1\\x75\\xdf\\xdc\\xc2\\xce\\x88\\x2e\\x65\\xb3\\xd9\\x3a\\x04\\x38\\xf6\\x92\\xe9\\x69\\x5d\\xe1\\xf2\\x4c\\x70\\xa7\\x9b\\xee\\xd2\\x54\\x15\\xec\\x5a\\xae\\xcf\\x33\\x91\\x95\\x3b\\x2f\\xfd\\x45\\x3a\\x8f\\x04\\x67\\x56\\x1a\\x4a\\x47\\xee\\x14\\x4a\\x43\\xfd\\xff\\x83\\xdf\\x2b\\xea\\x5f\\x66\\xa7\\x22\\xb5\\x2a\\xbe\\x86\\x13\\xf2\\x0c\\x59\\x4a\\xf0\\x98\\x2e\\xb3\\xf0\\x45\\x05\\xa5\\x24\\x61\\xdd\\x03\\x4d\\xa8\\x6c\\x36\\xca\\x16\\x21\\x77\\x05\\xc0\\x48\\x23\\x91\\x1d\\x72\\xa2\\x47\\x69\\x51\\x76\\x33\\x56\\x28\\x86\\xf2\\x50\\xf2\\xcf\\x78\\x8b\\x8f\\x32\\x86\\x4a\\x94\\x74\\xf5\\x7e\\x62\\xe5\\x7d\\xe8\\xfd\\xaf\\x95\\x9a\\x6b\\x72\\x28\\x74\\x40\\xa8\"},\n{{0x05,0x8e,0x36,0x80,0xb8,0xfc,0xc0,0xaa,0x14,0x90,0x08,0x9c,0x11,0x24,0x67,0x7f,0x98,0xd7,0x4b,0x1b,0xfb,0x71,0xee,0x86,0x63,0xf0,0x25,0xf0,0xd9,0x46,0xcd,0x20,},{0xec,0x72,0xce,0x0e,0x82,0xc6,0xa3,0xb2,0x12,0x43,0xd2,0xf0,0x0e,0x9e,0x88,0x3a,0xdb,0xc5,0xcb,0x63,0xb3,0xd9,0x36,0xef,0xa5,0x0c,0x07,0xcb,0x92,0x91,0x48,0xe2,},{0x57,0x34,0xec,0x50,0xa7,0xf8,0x2e,0x48,0x53,0x6b,0xdc,0x43,0x70,0xcf,0xef,0x2e,0x15,0x0a,0x63,0x1d,0xab,0xaf,0x89,0xed,0xcf,0x0f,0xda,0xbe,0x4f,0x58,0x39,0xf4,0xf5,0xfb,0xd8,0xdf,0x8e,0xc4,0xa3,0xac,0xd4,0x0a,0x8b,0xfb,0x96,0x3d,0x18,0x55,0xff,0x92,0x74,0xdb,0xc3,0x31,0x65,0xb5,0xe6,0xd3,0x7a,0x23,0x9d,0xac,0xe9,0x03,},\"\\xe6\\x3d\\x14\\xf5\\xbe\\xa7\\xa1\\xab\\xb8\\xfe\\xe6\\x97\\x74\\x6c\\x22\\x80\\xdf\\xd0\\x62\\x2d\\xe7\\x35\\x72\\x26\\xcc\\x07\\x42\\x72\\x2a\\x32\\x29\\xbe\\x12\\x6b\\x08\\x3e\\x86\\x8a\\xea\\xf0\\x7d\\x2f\\xc9\\x7a\\xdc\\x33\\x42\\x70\\x96\\x74\\x19\\x3c\\xa2\\x81\\x74\\x4e\\x85\\x0e\\xa1\\x54\\x40\\x05\\x0a\\xec\\x93\\x0e\\x45\\xd7\\xa8\\x7b\\x8a\\xc8\\x01\\x5c\\x89\\x67\\xc2\\x00\\x33\\xa5\\x32\\xd2\\x95\\x91\\xb1\\x35\\x58\\x6c\\xe0\\xfd\\xd2\\xe6\\x68\\xb5\\xc8\\x64\\xb3\\xbd\\xe7\\x0c\\x7e\\x71\\x9a\\xd2\\x41\\x93\\x12\\x51\\x86\\x19\\x33\\xff\\xbf\\xa9\\x64\\x83\\xff\\x82\\x85\\x67\\x48\\xc5\\x6d\\xc2\\x6e\\x25\\x7d\\x69\\x2e\\x51\\x34\\xd8\\x2f\\xc7\\x19\\x1c\\x11\\x0d\\x95\\x90\\xd3\\xfc\\x75\\x1c\\xd6\\x36\\xb0\\xc4\\x6f\\x44\\xf8\\x80\\x3e\\x59\\xe2\\xf9\\x3f\\xa0\\xcb\\xe2\\x47\\xa1\\xa6\\x25\\xb4\\xbc\\x2c\\x7b\\x1f\\xdc\\xeb\\x5a\\x2b\\x22\\x59\\x1f\\xa6\\x13\\x7c\\x54\\x04\\xdf\\xec\\x6a\\x69\\x63\\x9e\\x3f\\x63\\x2b\\x59\\x76\\xab\\x9f\\xe1\\xc6\\x3a\\xa3\\xda\\x9d\\x52\\xb0\\x44\\x00\\x8f\\x3a\\xe4\\x4b\\x7c\\x36\\x4f\\x08\\x56\\x64\\x32\\x3a\\x88\\xeb\\x45\\x83\\xe8\\x71\\x40\\xf7\\x63\\x78\\x2b\\xff\\x88\\x19\\xcf\\x74\\x1a\\x87\\x5d\\x50\\x6c\\x92\\x9d\\x34\\xbb\\xd4\\x30\\x07\\xde\\x4b\\x18\\xf6\\x87\\xa7\\x58\\x11\\x11\\x28\\xb1\\xdb\\x86\\xfc\\x5a\\xd2\\xfb\\x9f\\xca\\xd1\\x2c\\x9d\\xd2\\x8f\\xee\\x5a\\xd1\\x0d\\xe0\\x73\\x9f\\x8e\\xfd\\x9b\\xff\\x66\\xf8\\x40\\xb1\\x1b\\x3f\\x91\\xc5\\xe0\\x7c\\x21\\x45\\x2c\\xab\\x24\\x24\\x2b\\x6e\\x32\\x16\\x5c\\xd1\\xe6\\x95\\x72\\xbf\\x21\\x6e\\x86\\x04\\x53\\xda\\xd2\\xfd\\x12\\x9c\\x33\\x37\\x58\\x58\\x0b\\xb7\\xd0\\xf1\\x95\\x09\\x74\\x5e\\x85\\x14\\x63\\xd1\\x27\\xa5\\xf9\\xbe\\x21\\xfe\\x54\\x9c\\xae\\x55\\xd5\\x6b\\x8b\\xea\\x80\\xbf\\xaf\\xda\\xc1\\x0a\\xcd\\x83\\x8e\\xa8\\xaf\\x31\\xc0\\x07\\xdc\\x32\\xbf\\xd7\\x40\\x82\\xd9\\x11\\x0a\\x3e\\x91\\xe6\\x1e\\x03\\x57\\x58\\x7e\\x4e\\xd3\\x28\\x27\\xad\\xe9\\xb6\\x91\\x0a\\x98\\x8c\\x1d\\x3b\\x2d\\xd2\\x2c\\x0e\\xe7\\x6e\\xf3\\x5f\\xe1\\x5e\\x09\\x94\\x04\\xa4\\x5d\\x4b\\x2a\\xca\\xb9\\x12\\x3e\\xcc\\x45\\x55\\x0a\\x40\\xfa\\xf8\\x33\\x6b\\x46\\xc6\\x30\\xa9\\x08\\x03\\x58\\xff\\x8b\\x8e\\x58\\xaf\\x0b\\xcc\\xbd\\x35\\x01\\x0c\\x1e\\xcc\\x12\\x81\\x66\\x55\\xa5\\xec\\xeb\\xa9\\x5a\\xd3\\xf5\\x03\\xa1\\x8e\\xc5\\xbe\\xce\\x3a\\x33\\xf4\\x69\\xdf\\xe9\\x17\\xe1\\xc5\\x5e\\xf1\\xd8\\x1e\\x5a\\x75\\x56\\x1e\\x6b\\xbd\\x99\\xc6\\x53\\xa6\\xd0\\x95\\xb9\\xf3\\x87\\x91\\x1e\\x40\\x33\\x2f\\x62\\x16\\xf9\\x56\\xa3\\x5c\\xf7\\xd9\\x9a\\x9f\\xdd\\x0c\\x44\\xc5\\x1e\\x90\\xa5\\x64\\xf1\\xc3\\x6b\\xf3\\xd4\\x0a\\x7f\\xaf\\x4b\\xa2\\x8b\\x1a\\x12\\x0b\\x32\\x05\\xfb\\xac\\x1a\\x98\\x56\\x92\\x90\\xbe\\x37\\xc5\\x8b\\xbd\\x74\\x5c\\xe0\\xfb\\x74\\x83\\x52\\x70\\xab\\xa2\\x25\\x2a\\xda\\xec\\x15\\x7d\\xc4\\x24\\x61\\x22\\x1a\\x2c\\xff\\x68\\x7b\\x9e\\x65\\xce\\xb5\\x7c\\x2d\\x77\\x70\\x0a\\xea\\x63\\x20\\x48\\x6c\\x5b\\x1b\\xec\\x9c\\xc5\\x3e\\x7e\\xf9\\xe4\\x8f\\xcd\\x1b\\x77\\x83\\xac\\xbe\\x75\\xa6\\xbe\\x02\\x67\\x27\\x88\\x12\\xdb\\xf3\\xd2\\x57\\x6c\\xf7\\xad\\x39\\x11\\x27\\x1a\\xce\\xbe\\x0f\\x2c\\x04\\x60\\x2a\\x08\\x0c\\x8b\\x96\\xc1\\x20\\xfd\\x86\\xfd\\xa2\\x82\\xaa\\x4e\\x1c\\x13\\x1f\\xe9\\x7c\\x90\\x7c\\x15\\x85\\x5f\\x87\\x75\\x5f\\x51\\x1c\\x03\\x7b\\xef\\xad\\x0f\\x56\\xb3\\x9f\\x32\\xa2\\x13\\x3a\\x22\\xf3\\xd5\\xa9\\xbe\\xc3\\x44\\x3f\\x29\\xa6\\x94\\xe9\\x7f\\xe0\\x5e\\x10\\xfb\\x8e\\xf9\\x99\\x13\\x02\\xb9\\xe0\\xd8\\x4d\\x92\\x9a\\x19\\xeb\\x03\\x47\\x1f\\x3a\\x86\\x13\\xd3\\x93\\x68\\xe1\\x58\\x83\\xa7\\xe4\\x97\\x0b\\x53\\xcb\\xaf\\x29\\x29\\xd8\\xde\\x43\\x1b\\x48\\xb4\\x35\\xd7\\x53\\x3c\\xaa\\x2e\\x36\\xce\\xab\\x6c\\xdd\\xb3\\x46\\xe5\\x35\\xe5\\x15\\xc4\\xb3\\xdb\\x76\\xde\\x07\\xd9\\x85\\x54\\x14\"},\n{{0x51,0xba,0x3a,0x4f,0x3d,0x85,0xd1,0x54,0x8c,0x2f,0x24,0x94,0xa3,0x51,0x1f,0x3b,0x95,0x15,0x66,0x3d,0x7e,0x85,0x37,0x0f,0xb6,0x15,0x02,0x37,0xe9,0xbc,0x98,0x0b,},{0x77,0x49,0xde,0x02,0x10,0xbc,0xe0,0x6d,0x48,0xf5,0x9b,0x95,0xae,0xb1,0x52,0x8f,0xd9,0xb4,0xe5,0x2c,0xdd,0xe2,0x2f,0xb8,0x19,0x3b,0xed,0xd5,0xdf,0x12,0x81,0x7c,},{0x16,0xfb,0x29,0x0c,0x91,0x3b,0x20,0xeb,0x1c,0x3d,0x7b,0x79,0x82,0x49,0xeb,0x84,0x59,0xd4,0xbe,0xe8,0x12,0x5d,0xb2,0xb3,0xf1,0xda,0xab,0x8a,0xf9,0xd9,0xa7,0x00,0xed,0x79,0x8a,0xdd,0xd8,0x02,0xdf,0xcd,0x29,0x7a,0x41,0x25,0x93,0xcd,0xa7,0xbe,0x99,0x79,0xa1,0xf0,0x93,0x50,0xe8,0x6f,0x69,0x8a,0xc3,0x38,0x0e,0x34,0x1d,0x07,},\"\\xd1\\x8d\\x0c\\xbf\\xc1\\x6d\\x0f\\x9b\\x67\\xf2\\x53\\x9a\\xd6\\x20\\x7c\\xd9\\x21\\x7a\\xd5\\xed\\x03\\x33\\xcd\\xdb\\x10\\x41\\xe0\\xac\\x2b\\xdd\\x92\\x02\\x76\\x62\\x96\\x52\\xb4\\x9c\\xbc\\x98\\x02\\x59\\x3e\\xc3\\x64\\xea\\x79\\x5a\\xbc\\xd1\\x58\\x20\\x85\\xf5\\x5b\\xc6\\x6c\\x48\\xfd\\x3e\\xed\\xe6\\x18\\xd6\\x36\\x96\\x17\\x10\\x0e\\xae\\xcc\\xc1\\x5f\\x24\\x9d\\x6e\\xee\\x5b\\xb2\\xc4\\x3c\\x01\\xb0\\x62\\x3f\\xe6\\x03\\xce\\xee\\xe4\\x9b\\x40\\xfb\\x7c\\x53\\xfc\\x68\\x47\\x36\\x73\\xc0\\x9b\\x1a\\xc7\\x7e\\xa9\\xbe\\xb7\\xe8\\x53\\x03\\x79\\xa8\\x6d\\x69\\xec\\xd1\\xff\\x11\\x81\\x3f\\xbb\\x88\\xf6\\x92\\xf0\\x5e\\xf1\\x32\\x07\\x42\\xb4\\xfe\\x7e\\x06\\xd5\\xba\\x71\\x65\\x66\\x46\\xcd\\x75\\x00\\xde\\x19\\xbb\\x93\\xd8\\x44\\x53\\x66\\x03\\xf4\\x0b\\xd4\\xae\\xea\\xf0\\xc4\\xdb\\xc0\\xac\\xfd\\x20\\x2b\\x28\\x6b\\x64\\xaf\\xb8\\x3d\\x4a\\x37\\x8d\\xd4\\x5e\\xe3\\xc1\\xdf\\x6b\\x3e\\xf1\\x6b\\x8b\\x1a\\xcc\\xbc\\x04\\x06\\x32\\x50\\xec\\x47\\xb8\\x6a\\xe5\\xa7\\x1d\\x1d\\xab\\x38\\xb5\\xeb\\x80\\xd6\\x63\\xfa\\xa7\\x88\\xf8\\xb5\\x9a\\x75\\x4c\\x0f\\x9c\\x9f\\x6d\\x90\\x62\\x52\\xaf\\x46\\xab\\x1f\\xff\\xed\\x27\\x6d\\x23\\x88\\xdb\\xe7\\x0d\\x96\\xba\\x67\\x47\\xd1\\xfe\\xd4\\xfc\\x0b\\x55\\x29\\x3d\\x5f\\x78\\x7b\\xda\\x0c\\x0d\\xf4\\x6a\\x73\\xf4\\xaa\\x7d\\x29\\xe1\\xc9\\xcc\\x85\\xcd\\x04\\x3e\\x3d\\xff\\xe0\\x57\\x46\\x2c\\xa5\\xfe\\x5c\\x64\\x70\\xe7\\x39\\x27\\x6f\\x8b\\x53\\x4c\\x01\\x72\\xe4\\x60\\xf3\\x40\\x48\\x7a\\x56\\x94\\x68\\xaa\\x58\\x90\\xcc\\x14\\xf2\\x0d\\x67\\xd7\\x9c\\x66\\x1e\\x87\\xfe\\xba\\xc6\\x27\\x59\\x71\\xc3\\x73\\x08\\x07\\xeb\\xf1\\x75\\xe0\\xde\\x10\\x49\\xbe\\xe6\\x7c\\x89\\x5e\\x57\\xb7\\x1a\\xb8\\xa2\\xf3\\xcf\\x36\\x41\\xfd\\x54\\x8d\\x09\\x41\\x4f\\x5f\\xc3\\x02\\x6a\\x0a\\x35\\xf6\\xba\\x95\\x16\\x73\\x94\\x49\\x41\\xcb\\x23\\x6f\\x3d\\x19\\x76\\xdc\\x69\\x07\\x7d\\x95\\x14\\x50\\xe7\\x66\\x03\\x16\\x98\\x8f\\x6f\\x2a\\x6f\\xbb\\xff\\x3b\\x37\\xce\\xaa\\x02\\xfd\\x6f\\x02\\x73\\xbd\\x80\\x31\\x85\\xa1\\x09\\x03\\x9c\\x63\\xf2\\x51\\x9b\\x98\\x3d\\xaf\\x65\\x54\\x25\\x3b\\xed\\x54\\x97\\xc0\\xb0\\xbd\\xaa\\x0b\\xd4\\xa1\\xfa\\xc9\\x00\\x26\\xad\\xe3\\xe4\\x0c\\x55\\x4c\\xff\\x2c\\xcb\\x36\\x99\\x0e\\x71\\x55\\x67\\x08\\xc5\\xc4\\x03\\x92\\x56\\xff\\xc7\\x33\\x7e\\x5f\\xea\\x11\\xf5\\xe9\\x0d\\x3e\\x4d\\x93\\x35\\x91\\x79\\x11\\x6a\\x85\\xc2\\x41\\x36\\xca\\x34\\x83\\x5c\\xd3\\x40\\x12\\xe4\\xd7\\xdd\\xc7\\xb7\\x21\\xc2\\x46\\xc7\\x37\\x00\\xe2\\x76\\xdc\\x2f\\xf9\\xf2\\x77\\x0b\\x43\\xc8\\xe8\\x0a\\x17\\xf0\\x1d\\x32\\x68\\x0b\\xae\\x22\\x8e\\x64\\x23\\xa8\\x80\\xc3\\xfb\\x99\\x6a\\xb8\\xd2\\x21\\xbc\\x62\\x74\\xac\\x5f\\xa7\\x70\\xd2\\x05\\xfc\\x87\\x8f\\xba\\x9b\\xbd\\x77\\x6a\\x3d\\x79\\xed\\x77\\x04\\x89\\x50\\xf3\\x6d\\xc0\\xaa\\x3c\\xcd\\x28\\xe4\\x75\\x6a\\x99\\x19\\x04\\xae\\x05\\x1b\\x8a\\x4b\\x7d\\xe3\\xa1\\xf2\\xad\\x0f\\xb4\\x5a\\x33\\xd0\\xc6\\x82\\x25\\x84\\x1f\\x8e\\xb6\\x5b\\x6a\\x16\\xe9\\x5f\\x89\\x35\\x91\\xe1\\xaa\\x73\\xa6\\x4f\\x0d\\x2e\\xe9\\x38\\xab\\x69\\xad\\xcc\\x8c\\x59\\x51\\x8b\\xec\\x50\\x1c\\x39\\xf1\\x39\\x17\\x4b\\xbb\\x00\\x69\\x9e\\x1a\\x0f\\x0e\\x0d\\x88\\x9a\\xae\\x54\\x3a\\x55\\xe6\\xac\\x56\\xd5\\x20\\x4c\\x1a\\xde\\x1f\\x27\\xd8\\x2a\\x6a\\x95\\xe1\\x4b\\x2d\\x69\\x09\\xdd\\xa7\\xbf\\xaa\\x7f\\x48\\x7f\\xb6\\x19\\x59\\x01\\x4b\\x78\\x79\\x5c\\xb4\\x63\\x9f\\x09\\xf0\\xd3\\x29\\xfe\\xb3\\x5c\\xcf\\x52\\xed\\xc2\\xdb\\x72\\x19\\x14\\xe4\\x23\\x30\\x68\\x89\\xa4\\x83\\xfe\\xe8\\x76\\x36\\x0e\\xe3\\x26\\x33\\x53\\x19\\x07\\x0c\\x56\\x4f\\x3a\\x8b\\x95\\x3f\\x52\\xf4\\x15\\x13\\xa2\\x26\\x08\\x83\\xc3\\x8d\\xd9\\x78\\xa2\\x48\\x60\\x4a\\x41\\xbd\\x4b\\xfc\\x9e\\x84\\x18\\x4d\\xc9\\xe8\\x4d\\x25\\x89\\xf4\\xaf\\xff\\x84\\x17\\x82\\x4c\\xe5\\xad\\xba\"},\n{{0x7d,0xde,0xc5,0x26,0xa4,0x97,0x1d,0x89,0x12,0xa6,0xbd,0x43,0xc6,0x9f,0x92,0xed,0x86,0x44,0x2b,0x15,0xf4,0x2f,0xba,0xbb,0xf2,0xd1,0x7e,0xff,0x98,0x99,0x31,0x61,},{0x0d,0xfe,0xff,0xb2,0x76,0x23,0x09,0xb4,0x73,0x4e,0x4c,0xe2,0x52,0x3c,0xf1,0x86,0x31,0x49,0xf7,0xe1,0x9a,0x7c,0x14,0x7e,0xc0,0x89,0x9e,0x11,0x0c,0xa9,0xd8,0x7d,},{0x9e,0x60,0x3b,0x01,0x5f,0x42,0x87,0x1b,0x78,0xeb,0x27,0x52,0x3f,0xbb,0x7c,0xe9,0x62,0xfc,0xa3,0x2a,0xe2,0x70,0xe8,0xe1,0x2d,0xca,0xdd,0x25,0xaa,0x85,0x2b,0x89,0x1f,0x6f,0xef,0x77,0xb5,0x9a,0x54,0x6c,0x9a,0x7a,0x7c,0xac,0xb5,0x5e,0x1d,0x32,0xad,0xc8,0x05,0xae,0x5f,0x61,0xa6,0x9e,0x67,0x64,0xc7,0xc0,0x82,0x92,0xeb,0x03,},\"\\xe8\\x77\\x4a\\x45\\xd4\\xd8\\xf8\\x6d\\xda\\x5c\\x08\\x80\\x2b\\xa2\\x47\\x2e\\xf3\\xc8\\xd3\\x6c\\x7f\\x38\\x3a\\xc0\\x46\\x12\\xa4\\x64\\x38\\x2e\\x9d\\x6c\\x07\\xd8\\xd3\\x58\\x22\\xc5\\x3f\\x43\\x88\\xf5\\x15\\x36\\x14\\xfe\\xfa\\xf4\\x63\\x74\\x74\\x7b\\x9d\\x4f\\xd4\\x46\\xa8\\x64\\x76\\x9a\\x4c\\xad\\xe8\\x43\\xc1\\xea\\xb8\\x57\\x43\\x19\\x11\\x2f\\x01\\x79\\xd2\\xea\\x9e\\x3c\\x19\\x5d\\xc0\\x68\\xf0\\x69\\x74\\x62\\xb9\\xe0\\x7c\\x87\\x94\\x87\\x0f\\x8f\\xb8\\xff\\xc0\\x81\\xe4\\x58\\x6a\\xfb\\xcd\\xba\\x7a\\x4f\\x59\\x25\\xe9\\xfd\\x9e\\xc9\\x42\\xd8\\x43\\x47\\x33\\xc2\\xdd\\xd5\\xe2\\x9b\\xbd\\xfc\\x73\\x42\\xb9\\x28\\x68\\x71\\x9b\\x54\\x40\\x88\\xa4\\x8e\\xba\\x4c\\x82\\xf1\\x87\\xdd\\xca\\x8f\\x47\\x46\\x25\\xa7\\x1c\\xf6\\xb7\\xaa\\x5f\\x08\\x1c\\x74\\xf7\\x40\\x8f\\x53\\xb7\\x81\\x63\\x6e\\x7e\\x9d\\x29\\xb0\\x7f\\xdb\\x6d\\x9c\\x35\\xe5\\xeb\\x38\\x2d\\xb7\\xa3\\x1a\\x8b\\xa5\\x16\\x91\\x5d\\xf8\\xde\\xe9\\xe1\\xad\\x3f\\x18\\x28\\x43\\x68\\x3e\\x8d\\x1d\\xc5\\xd8\\x66\\x9d\\xbf\\xcf\\x09\\x54\\x1a\\x43\\xc0\\xa0\\x46\\x13\\x38\\x1a\\x5b\\x5e\\x4e\\x71\\xb2\\x3c\\x5a\\xd0\\x9b\\x8e\\xaa\\x51\\xcb\\x93\\x8d\\x0c\\x75\\x2c\\xc3\\xd3\\xa1\\x0f\\x10\\xb4\\x2b\\xe8\\xee\\x7f\\x6b\\xda\\xc8\\x07\\x85\\x68\\x43\\x49\\x46\\xbb\\xf5\\x6d\\xa7\\x0e\\x7d\\x54\\x15\\x7a\\x6e\\xfd\\x48\\x46\\xeb\\x15\\x52\\x78\\xc9\\x4c\\x38\\x88\\x65\\x8a\\x7a\\x2f\\x8e\\xa3\\xba\\xc1\\x47\\xaa\\x89\\x16\\x92\\xae\\x8b\\x23\\xf1\\xaf\\xe7\\x1e\\xcf\\xde\\xca\\xa6\\xc1\\x13\\xb5\\xca\\xaa\\xa1\\x93\\x98\\xc7\\xdf\\xe7\\x3f\\xac\\xb4\\x15\\x5f\\xd6\\xba\\xc1\\x8d\\x5d\\xf2\\x12\\x9e\\x8b\\x29\\x07\\xec\\xee\\x15\\x1b\\xdd\\x14\\x7a\\x7c\\x3e\\x46\\xea\\x72\\x75\\x4d\\xe3\\x2c\\xeb\\x06\\x6d\\x9d\\xb1\\xc2\\x6e\\x80\\xdf\\x36\\x31\\x29\\x2b\\x16\\x17\\x4c\\xfa\\x6f\\x1d\\x9c\\x08\\x28\\xb8\\x49\\xc2\\x2d\\x29\\x65\\x1a\\x73\\xe9\\x10\\xd9\\x27\\x58\\x77\\xf4\\x64\\xce\\x93\\x26\\xc6\\xe4\\xed\\x6b\\x07\\xdc\\xb3\\xa3\\x53\\x63\\xc1\\xaa\\x64\\x72\\xe0\\x2c\\x5c\\xd8\\x55\\xe3\\x8a\\xab\\xe9\\x65\\xac\\xe9\\xf3\\xf5\\xa4\\xf5\\xde\\x03\\x00\\x86\\x94\\xcb\\x90\\xaf\\xe4\\x16\\xc9\\xd4\\x86\\x88\\xde\\x7f\\x75\\xcf\\xe2\\x43\\xff\\x7f\\x41\\xe0\\x59\\x31\\x09\\x34\\x90\\x3d\\xb5\\x68\\x84\\x45\\x08\\x26\\x2c\\x89\\x9d\\xfa\\x75\\x0c\\xd6\\xa2\\x82\\x98\\x24\\xba\\x02\\x7a\\xea\\x1b\\x6d\\x01\\x77\\x72\\x6a\\x34\\x3a\\xdd\\x4e\\xcd\\xc5\\xf7\\xe6\\xe9\\x09\\xab\\x7d\\xe6\\x15\\xef\\x28\\x07\\xf9\\xe7\\xd7\\x1c\\xe2\\xf7\\x8a\\xcf\\xf5\\x7e\\xba\\x79\\xc3\\xf5\\xe0\\x7c\\x8b\\x66\\x1c\\x1e\\x30\\x27\\xf8\\x17\\x6d\\x28\\xbf\\xef\\x76\\x7d\\xd6\\x8d\\x4e\\x5d\\x62\\x8f\\xec\\x0b\\xfe\\x88\\x79\\x93\\x41\\xf3\\x06\\x12\\x87\\x34\\xfa\\xd2\\x02\\xaa\\xfc\\x9f\\x11\\x12\\x3f\\xb3\\xe3\\x63\\xd1\\x0a\\xee\\x0d\\xb5\\xe2\\x7a\\x15\\x70\\xdf\\xae\\xe4\\x7e\\x24\\xda\\x47\\x3b\\x07\\xfe\\xe5\\x9a\\x6c\\x93\\xf0\\x98\\x1d\\xbe\\x32\\x5c\\xd8\\xcc\\x2d\\x2e\\xd7\\xdc\\x17\\x16\\x6b\\x26\\x7c\\x1b\\x11\\x05\\x36\\xf2\\x63\\x6b\\xba\\x34\\x75\\x1a\\x78\\xf7\\xf6\\x29\\x81\\x82\\x44\\x2d\\x83\\xc1\\x23\\xbb\\xee\\x4f\\x50\\xc5\\xb0\\xfa\\xcf\\xf0\\x3e\\x7c\\x55\\x6e\\xd9\\xe6\\x4c\\xa2\\x7c\\x4b\\xca\\x5a\\xb0\\xde\\x0d\\x5f\\x9c\\x2c\\xbb\\x54\\xcc\\x2d\\x94\\x73\\xa3\\x2d\\xf9\\x99\\x39\\x0a\\xc2\\xff\\xee\\xd3\\xd4\\xcb\\xa3\\x49\\x73\\xdc\\xec\\x3f\\xba\\xba\\xfc\\x4d\\x54\\xca\\xe4\\xe7\\xe8\\x5d\\x4a\\x6e\\x8a\\xfe\\x45\\xca\\xcd\\x71\\xe0\\xf2\\xe6\\xd0\\x4b\\x4f\\x9d\\x3b\\xcf\\x43\\xd3\\xfa\\x41\\xe9\\x98\\xcc\\xbe\\xd0\\xf1\\x50\\xd5\\xca\\x1d\\x52\\x72\\x93\\x2d\\x93\\xec\\xa1\\x04\\x95\\xc6\\x83\\x34\\xfa\\x32\\x68\\xf3\\x1d\\xe5\\x22\\xcb\\x12\\xa7\\x44\\x9f\\xfb\\x5c\\xb5\\xe8\\xf1\\x46\\x2c\\xd9\\xb5\\x17\\x70\\xcc\\xaf\\x58\\xb1\\xe0\\xd8\\x2e\\xf9\\x29\"},\n{{0x0b,0x65,0x90,0xdd,0x7c,0x2f,0x15,0xf9,0x4a,0x56,0xe2,0x40,0x16,0x93,0x63,0xc2,0x67,0x32,0x30,0x2b,0x9d,0x44,0x0b,0x53,0x27,0x23,0x00,0x2e,0x15,0x5d,0x02,0xd9,},{0xcd,0x18,0xe0,0x32,0x57,0x7c,0x55,0x76,0xf2,0x23,0xf3,0xe3,0xd8,0xa1,0xfa,0x8e,0x9a,0x87,0x0f,0xef,0x09,0xe9,0x40,0x9f,0xaf,0x40,0xd7,0x14,0x3e,0x52,0xfc,0x44,},{0x64,0x2d,0x81,0xac,0xf3,0x8c,0xf0,0x99,0xa8,0x33,0xa7,0x4f,0x2d,0x80,0xb8,0x54,0x48,0xec,0x2b,0x1a,0x5d,0xdc,0x64,0x47,0x0b,0x21,0x3d,0x54,0xb7,0xbe,0x61,0x33,0x68,0x9a,0x71,0x94,0xf5,0xd8,0x97,0x92,0xe1,0x6e,0x5d,0xf7,0x55,0xa4,0xfd,0x9e,0xf4,0x68,0x9e,0xa9,0x52,0x92,0x6e,0x0e,0x4e,0xcb,0x3b,0xd4,0x81,0xfd,0x91,0x02,},\"\\x71\\xfe\\x0f\\xd5\\x5d\\x5e\\xd1\\x20\\x6f\\x28\\xee\\x16\\xe4\\x19\\xfa\\xb6\\xfa\\x66\\xa2\\x51\\xfa\\x6b\\x06\\x01\\xda\\x26\\x1e\\x42\\x9f\\x55\\xb8\\xd5\\xae\\x3f\\x3c\\x52\\xa1\\x7f\\xe1\\xec\\x73\\x4b\\x81\\x0a\\xb6\\x3a\\xad\\xe4\\x44\\x70\\x39\\xca\\x0a\\xe4\\x68\\x7c\\x24\\x35\\xf5\\x61\\xe4\\x6c\\x5b\\x30\\x97\\x17\\xab\\x31\\xe0\\xf6\\x40\\x76\\xb2\\x16\\x92\\x11\\x57\\x2b\\x74\\xe1\\x8a\\x1f\\x45\\x25\\xa6\\x4f\\xa7\\x17\\xa5\\xed\\xf1\\x49\\x75\\x81\\x29\\xcb\\x04\\x03\\x5e\\x7e\\x20\\xba\\x40\\x05\\xb7\\x48\\x09\\xde\\xc6\\x44\\x50\\x4c\\x24\\x54\\xa7\\x7f\\x99\\xb2\\x0c\\x53\\x74\\xf3\\xce\\xe7\\xd8\\xc6\\xb6\\x8b\\x24\\x3c\\xaf\\xb3\\x00\\x98\\xdc\\xe9\\x04\\x90\\xfd\\xc3\\xb9\\x2f\\x54\\x94\\x8f\\x42\\x46\\x39\\xe1\\x9f\\x8f\\x20\\x20\\xd1\\x55\\x13\\xda\\xef\\xad\\xd9\\xe9\\xb1\\x2a\\x84\\x76\\x1e\\x5e\\xce\\xa0\\x88\\xad\\x56\\x1f\\x06\\x20\\x9f\\xd4\\x42\\x3f\\xcd\\x00\\x3f\\xbc\\xd1\\x87\\x3e\\xa5\\x49\\x63\\xa2\\xfa\\x07\\xc7\\x47\\x6b\\x13\\x88\\xf9\\x01\\x5d\\x9e\\xac\\x30\\x5b\\xea\\x5a\\x3d\\xe1\\x94\\xf5\\x5a\\x17\\xb4\\x2d\\x59\\x9e\\x5c\\xe6\\x2c\\x8b\\x7c\\x19\\xe7\\xe7\\x09\\x61\\x37\\xb9\\xd0\\xa6\\x5e\\x63\\xc1\\xa3\\xb8\\x45\\x38\\xca\\x65\\x36\\x9a\\x20\\xe8\\x82\\x2f\\xff\\x5e\\xcb\\x57\\xfc\\x09\\xb4\\xe6\\x84\\x5b\\x4f\\x24\\xd4\\x88\\x69\\x71\\xac\\x1a\\xc2\\x8c\\x77\\x58\\x0e\\xa5\\x67\\x2a\\xd1\\x4c\\xe4\\x44\\x17\\x19\\xc2\\x14\\x54\\x6d\\x07\\x36\\xcb\\x7a\\xd0\\xbd\\x9f\\xb5\\xb2\\x6c\\x6d\\x9c\\x53\\x6b\\xf8\\xc8\\x57\\xae\\x42\\x57\\x7b\\x36\\x34\\x1d\\x39\\x2b\\x43\\x32\\x3b\\xda\\xe7\\xdf\\xaa\\x49\\x19\\x86\\x87\\x2a\\x23\\xd8\\x27\\xc6\\xef\\x8b\\x57\\xe7\\xd0\\x0f\\xea\\xe3\\x83\\x4c\\x46\\x64\\x00\\xaa\\xd1\\xd3\\x67\\x82\\x39\\x84\\xaa\\x02\\xd2\\xef\\x49\\x29\\x14\\xae\\x11\\x27\\xe7\\x55\\x1b\\x81\\x25\\x59\\x37\\x83\\x05\\xe4\\xfd\\x52\\xd8\\xbc\\x7e\\x41\\x57\\xec\\xca\\x45\\x1f\\x43\\xee\\x9f\\x54\\xc8\\x21\\x53\\xc7\\xdb\\xfa\\xf7\\xec\\x35\\x23\\x87\\x73\\x05\\x1b\\x4e\\x58\\x7d\\xb1\\x36\\x95\\x7e\\xc5\\x71\\x38\\x2b\\x90\\x59\\x0b\\x5d\\x10\\x26\\x02\\x45\\x80\\x96\\x6b\\x72\\x52\\xd2\\xcd\\x3f\\x4f\\x16\\x25\\xc4\\x85\\xba\\x90\\x6b\\xff\\x17\\x59\\x92\\x18\\x89\\x78\\xf2\\xd6\\x27\\x4f\\x3a\\x03\\x17\\x49\\xba\\x7e\\x70\\x2f\\x56\\x54\\x7e\\xdc\\x96\\xec\\x26\\x7b\\x84\\x89\\x28\\x80\\xd7\\x50\\xd7\\x31\\x0e\\xbf\\x6d\\xb2\\x41\\x25\\x3c\\xab\\xe4\\xb2\\x5a\\x97\\x74\\x58\\xc6\\xff\\xc9\\xe3\\x53\\xe6\\x2a\\xdf\\x05\\xe6\\xef\\xc0\\xfc\\x1e\\xbe\\x89\\xf5\\x27\\x70\\x5b\\xcc\\x26\\xb7\\x01\\x28\\x56\\x10\\xd9\\x8a\\xa3\\xbf\\x23\\x87\\x2b\\x69\\x96\\xd3\\xde\\x48\\x0e\\x8d\\x09\\xd7\\x83\\xc4\\xa0\\x8c\\xd3\\x83\\xc9\\x01\\x26\\x35\\xaa\\x68\\x97\\x8b\\x50\\x06\\x81\\x8b\\xbd\\xe4\\x4f\\x29\\x87\\x47\\x9b\\xcb\\x2b\\x71\\x1c\\x1b\\xee\\xed\\x27\\xcf\\x09\\x97\\x0a\\x16\\x4e\\x45\\x4f\\x71\\x08\\x22\\xee\\xf5\\x55\\xc1\\xc7\\xbf\\x9f\\x76\\xd5\\x25\\x4c\\xe2\\x20\\xc9\\xaa\\xa7\\x16\\x84\\x7a\\x24\\x94\\x88\\xf9\\xcd\\xb4\\x4c\\x48\\xf4\\x52\\xab\\x52\\xc4\\x0f\\x6d\\x03\\xad\\xc8\\xbf\\x3f\\x19\\x7b\\x25\\xe3\\xd1\\x27\\x83\\x0e\\x74\\xfd\\x81\\xeb\\x14\\xf7\\x54\\x20\\x5b\\x3a\\x48\\x44\\xc5\\x96\\xb6\\xe3\\xa9\\x93\\x6a\\xd6\\xfd\\x9e\\x80\\xa1\\x63\\x20\\xb3\\x81\\xc3\\xff\\xc7\\xb6\\x9e\\xab\\x54\\x53\\x6f\\x55\\xab\\xe2\\x2c\\x91\\xd8\\x98\\x40\\x8e\\x88\\x0c\\x6d\\xbf\\x0f\\xa5\\x64\\x8d\\x51\\x77\\x72\\xca\\xa5\\x35\\x3b\\x25\\xdb\\x60\\x50\\xd7\\x53\\xfa\\xf1\\x98\\xec\\x1d\\x37\\x5d\\xe0\\xfa\\x72\\x18\\x0a\\x93\\xba\\xb0\\x3d\\xed\\x77\\x16\\xcb\\x87\\x50\\x5b\\x68\\xac\\x6a\\x35\\xe7\\x3d\\x0f\\xcf\\x34\\x45\\x7e\\xff\\x82\\x17\\x89\\x52\\x14\\x2c\\x7b\\xac\\x9d\\xfd\\x87\\x2a\\x9a\\x82\\xf8\\x5b\\x24\\xb8\\x8f\\xa4\\x2d\\x4b\\xe0\\xa0\\xca\\x0b\\x2c\\x70\\xf4\\xc6\\x22\"},\n{{0xc6,0xd9,0xac,0xc5,0x17,0x5f,0xa2,0xb8,0x96,0x5c,0x15,0x8c,0x56,0xba,0x0a,0x5a,0x66,0x6a,0xd2,0xc7,0x40,0xcd,0x5b,0xb6,0x79,0xbb,0xa9,0xb1,0xdc,0x50,0x92,0x84,},{0xf5,0xcf,0xca,0x21,0x1b,0x02,0xfb,0xa7,0x72,0x03,0x47,0x70,0x3b,0xf1,0x63,0x1c,0xb3,0x08,0xfa,0xbc,0xda,0xa6,0x74,0x29,0x52,0x7c,0x5b,0x7b,0x67,0x6d,0xba,0xef,},{0x4d,0x2c,0xe7,0x07,0x09,0x0b,0x0f,0x3f,0x41,0x46,0x2f,0xd7,0x5b,0xd6,0x09,0xa2,0x72,0x4f,0xad,0xfe,0x5c,0xa3,0x90,0xe3,0x13,0xa4,0x2c,0xab,0x42,0x86,0x8e,0xd6,0xe9,0xa8,0x91,0x4d,0xc1,0x39,0x09,0xc0,0xd6,0xf6,0x1e,0x63,0x71,0x29,0x57,0xc7,0x6f,0x3b,0xd8,0xb7,0xf5,0x53,0x49,0x71,0x5a,0x3a,0x31,0x75,0x15,0xc0,0x71,0x08,},\"\\xf2\\x45\\x10\\x0c\\xd2\\xd3\\x16\\x48\\xf5\\xf3\\x51\\xbd\\xa5\\x64\\xc9\\xdb\\x4a\\x35\\x82\\x0c\\xc3\\x0e\\xf6\\x51\\x33\\x7c\\x4c\\xd8\\x88\\x07\\x05\\x69\\xd1\\x17\\xa9\\x34\\xb9\\xc9\\x18\\xe5\\xdf\\x8b\\x37\\x44\\xdd\\x66\\x20\\xcc\\xbc\\x49\\xf6\\xb3\\xe5\\x78\\x2a\\x30\\x33\\x9d\\xbb\\x9c\\xbe\\xd0\\x5d\\xd2\\xb3\\xb8\\xc5\\xbf\\x15\\x46\\xe7\\x0a\\xf6\\x36\\xe6\\x61\\x5c\\x48\\xb2\\xc3\\xc2\\xd1\\x9f\\xe3\\x54\\x20\\xdf\\x53\\x14\\xf6\\x3c\\x48\\x12\\xb5\\x8e\\x82\\xa2\\xa6\\x0b\\x18\\x02\\xf3\\x8e\\x50\\x5c\\xe7\\x48\\x01\\x7a\\xfa\\x97\\x7d\\x3f\\x9b\\x1b\\x6b\\xea\\x21\\x92\\xac\\xec\\x73\\xbd\\xce\\x12\\xd6\\x5e\\x68\\x4d\\xa4\\xd8\\xb4\\x1f\\xa9\\xa8\\x6f\\x11\\x08\\x6e\\xdc\\x2d\\x52\\x96\\xf6\\x7e\\xfc\\x53\\xac\\x84\\x07\\x0f\\xde\\x13\\x69\\x3e\\xb2\\x31\\x8f\\x5a\\x8c\\x3b\\x11\\x7c\\x23\\x34\\x22\\xad\\xcd\\xd3\\x52\\xf3\\x28\\xf0\\xec\\x69\\x9a\\x46\\x50\\xc9\\x3f\\x9b\\x4a\\x7d\\x79\\x5d\\x7f\\xc2\\x62\\x2a\\x03\\xd9\\x9b\\x64\\xf7\\xb3\\xdc\\x31\\x94\\xf6\\xc3\\xb1\\xb6\\x9d\\x99\\x07\\xce\\x09\\x24\\x01\\x07\\x3f\\x47\\xa2\\x8f\\x47\\x99\\xd2\\x29\\x09\\x2a\\x1b\\x07\\x41\\x29\\x95\\x4b\\xe8\\x0c\\xa4\\xa3\\xe6\\x58\\x2e\\xe0\\x5c\\x30\\x2c\\xac\\xb7\\x43\\x1d\\x1c\\xa6\\xa4\\x51\\xaa\\xed\\x72\\x78\\xab\\xc7\\xf7\\x85\\x75\\x24\\x1c\\x2a\\x2e\\xea\\x2e\\x84\\xcb\\xf9\\xa3\\x34\\xdf\\x40\\x21\\x09\\xc0\\x28\\xe3\\x45\\x47\\x3a\\x13\\xaf\\x9b\\x00\\x8e\\x20\\xbc\\x8c\\xf0\\xbc\\xef\\xbb\\x7a\\xa7\\x27\\xec\\x85\\x6e\\x99\\x25\\xb4\\xdd\\xd9\\x9d\\xeb\\xa8\\xf2\\x52\\x91\\x1a\\x59\\x01\\x54\\xb5\\x79\\xa8\\xaa\\xa3\\x1f\\x07\\xdd\\x50\\x25\\xdf\\x5c\\xd8\\xa0\\x9f\\x74\\x29\\x64\\xcc\\x8c\\x36\\x5d\\x8a\\xff\\x4e\\xb1\\xd7\\x9f\\x6e\\x5a\\x07\\xda\\xc5\\xf4\\xed\\xe9\\x2b\\x4e\\x2e\\x61\\xd3\\x4c\\xc2\\xd4\\xf0\\xaa\\xaa\\xb0\\x37\\xad\\x5f\\xdb\\x95\\xde\\x6c\\xd5\\x98\\x4e\\xba\\xf7\\xcc\\xe7\\xf0\\x8d\\x0c\\xa0\\xdb\\xbe\\x48\\x3c\\xe3\\xcb\\x35\\xcd\\x79\\x0c\\xa0\\x42\\x70\\x65\\xa3\\x4d\\xf7\\xf4\\xc2\\xaf\\x86\\xef\\xe9\\xb7\\x65\\x71\\x3a\\xff\\x25\\x7f\\x5c\\x1d\\x54\\x70\\x95\\x27\\xad\\x18\\xac\\x33\\xab\\xcd\\xee\\xdb\\x20\\x80\\x64\\xeb\\xae\\xa4\\x83\\x5b\\xe4\\x94\\x2b\\x8f\\xc6\\x66\\xad\\x1b\\x79\\xb6\\x65\\x13\\x09\\xe5\\xea\\x1d\\xa3\\x02\\xd7\\xfb\\xa2\\xe9\\x9f\\x0e\\x63\\x19\\xe8\\x2b\\x99\\x05\\xa1\\xea\\x48\\x2b\\xa0\\x43\\xb6\\x80\\x0b\\x33\\x0d\\xc4\\x8b\\x33\\x13\\xf5\\x9b\\xb2\\xf9\\xe8\\xa7\\xf0\\x7e\\xb1\\x80\\x0a\\x70\\x27\\x45\\xdb\\x14\\xc6\\x29\\x9a\\x98\\x2d\\xad\\x89\\x79\\x54\\x44\\x5b\\x7d\\x98\\xeb\\x58\\x37\\xfd\\x70\\xbf\\x19\\x0c\\x64\\x95\\x52\\xc8\\xe8\\x6f\\xeb\\x7f\\xf5\\xb3\\xed\\x8e\\x0a\\x06\\x70\\x4d\\x45\\x53\\xa3\\xc2\\xdd\\x74\\xf1\\x8e\\xa8\\x23\\x3a\\xe0\\xa5\\x0d\\x91\\x4f\\xe0\\x8f\\xbc\\xd3\\xa1\\x43\\x5f\\xed\\x56\\xa9\\xf3\\xa7\\xef\\xfa\\x14\\x0f\\xb5\\x52\\xdd\\xd2\\x1d\\xff\\xff\\x7f\\xa4\\x73\\x32\\xdd\\xfc\\x1e\\x53\\x17\\xf4\\x17\\x7d\\x5e\\x2f\\x11\\xa0\\x6e\\xc8\\x4c\\xcf\\xb8\\x9b\\x65\\x4e\\xa8\\x1b\\xd4\\x2d\\x7e\\x07\\xa3\\x87\\x30\\x1d\\x0f\\x40\\x26\\x4a\\xbb\\xf9\\xf9\\x10\\x7b\\x30\\xed\\xe8\\x64\\xcc\\x76\\x90\\xc0\\x6d\\x2e\\x24\\x7a\\x06\\x0b\\xb2\\x24\\x4a\\xd7\\x8e\\xd5\\xc5\\x51\\x5a\\x1a\\x2a\\x61\\x2d\\x61\\xe3\\xd9\\x31\\xe2\\x8b\\xc9\\x39\\xb4\\xd3\\x43\\x5e\\xee\\x4f\\x73\\x31\\xb1\\xf0\\xf8\\x53\\x75\\xd8\\x2a\\xc9\\xa7\\x7c\\x43\\x74\\x00\\x32\\x05\\x17\\x46\\xdc\\x92\\x69\\x45\\x8c\\x14\\x7d\\x18\\x8d\\x84\\x40\\x19\\x54\\xa4\\x89\\xcb\\x4f\\xbf\\x9b\\xf8\\x4b\\xa7\\xd8\\xf1\\x00\\x90\\x3c\\xe6\\x78\\x31\\xb4\\x05\\x4d\\x0f\\x58\\xcd\\x88\\x3d\\x54\\x2c\\x49\\x33\\x10\\x3f\\xf0\\x70\\xcd\\xfc\\x9d\\xbb\\x0f\\xcc\\x31\\xef\\xca\\x46\\x6e\\x77\\xa3\\x3f\\x1a\\x81\\x3d\\xa6\\xdc\\x0c\\x7c\\x31\\x58\\x5e\\x8f\\x4f\\xef\\x1e\\xbf\\x42\\xfb\\xd1\"},\n{{0x7d,0xfa,0xe4,0x16,0x41,0x9d,0x7b,0x0d,0x4f,0xc1,0xf8,0x23,0x84,0x0c,0x3e,0x4b,0xd4,0xad,0xcd,0x4d,0xc2,0xdc,0x17,0xb3,0x86,0x37,0xac,0xed,0xac,0xbd,0xbb,0x45,},{0xbc,0x51,0xd7,0x74,0x59,0x31,0x31,0x7e,0x1e,0x34,0x6e,0x2e,0x7c,0x92,0x03,0x91,0x81,0xb6,0xbf,0x38,0xee,0x2f,0x5a,0x44,0xfb,0xe2,0x33,0x9c,0x4f,0x95,0x2a,0xb9,},{0xda,0x34,0xb1,0x98,0x3e,0x8c,0x55,0xe4,0x1f,0xda,0x8e,0xc8,0xab,0xf2,0x3b,0x36,0x7a,0x0d,0xa6,0x06,0xc8,0xcd,0xbb,0x1e,0x8b,0x57,0xe0,0x34,0x3c,0x05,0x57,0xa5,0xf0,0xe8,0x15,0xe7,0xf2,0x2f,0x86,0x05,0xae,0x93,0xb2,0x7d,0x03,0x77,0x6a,0xc1,0xf7,0xde,0x3d,0x79,0x2e,0xa2,0x93,0x3a,0xc2,0x2d,0x2d,0xc2,0x3b,0x32,0x3d,0x0c,},\"\\xec\\x84\\x3d\\xc4\\xdd\\xa6\\xe9\\x02\\xe9\\xbe\\x31\\xb7\\x0f\\x11\\x76\\x3b\\x75\\x7a\\xb6\\xce\\x73\\x34\\xdc\\x00\\x76\\x4b\\x2d\\x08\\x4e\\x9d\\xaf\\x24\\x84\\x48\\x59\\x84\\xee\\x28\\xa2\\x83\\x0f\\xcb\\x94\\xc5\\x41\\xcb\\x46\\x94\\x40\\x03\\x67\\x31\\xde\\x80\\xff\\x56\\x0f\\x53\\x0c\\x9d\\x9e\\x6e\\x1f\\x7d\\x9c\\x4c\\x5b\\xdf\\x50\\xb0\\x4f\\x54\\x03\\xc2\\x9f\\x76\\xd7\\xe3\\x6e\\x00\\xbb\\xea\\x35\\xdb\\x1c\\xc6\\x0d\\xa8\\xd7\\x76\\x52\\x62\\x66\\xc3\\x32\\x4c\\xe7\\xef\\xec\\x64\\x50\\x85\\x96\\x09\\x26\\x68\\x56\\xd7\\x01\\xa4\\x7a\\x48\\xde\\xe8\\xbf\\x37\\x40\\x95\\x65\\xc7\\xfb\\xfa\\x99\\xa2\\x04\\xe5\\x53\\x0c\\x97\\x1c\\x60\\x5b\\x44\\x30\\x5d\\x5c\\x74\\x67\\x89\\x41\\x14\\x25\\x3c\\xf4\\x3c\\xdd\\xf1\\x8b\\x62\\x96\\xdd\\x25\\x4a\\x4d\\x96\\xac\\x70\\x00\\x91\\x81\\x86\\xdf\\xd4\\xbf\\x45\\x4e\\xd3\\x09\\x74\\xc5\\x53\\xd0\\xae\\x15\\x1a\\xd4\\xcf\\x54\\x0c\\xec\\xaa\\xa0\\xb5\\x94\\x8b\\x09\\x85\\xa9\\xc7\\xb6\\xe7\\x81\\x59\\x32\\xba\\xc1\\x17\\x32\\xfc\\x7d\\x10\\x26\\x7f\\x6b\\xf8\\xf1\\xe7\\xc0\\x8d\\x65\\x0e\\x56\\x7b\\x4e\\xdd\\x15\\xae\\x79\\x58\\x41\\x0e\\x42\\xf1\\xf5\\x37\\xfa\\x73\\x2f\\x72\\x7a\\x26\\x83\\x88\\x32\\x1d\\x53\\x44\\xc4\\xe7\\x8b\\xb9\\xa7\\x4e\\xab\\x9d\\x6a\\xbf\\x96\\x89\\x65\\xc6\\x66\\x93\\xd5\\xf1\\x12\\xdd\\x4c\\x14\\xfd\\xfd\\xd9\\x60\\x05\\xea\\xa6\\x75\\x7f\\xa2\\xcc\\x10\\x13\\xfe\\x43\\x27\\xab\\x09\\x99\\xd1\\x17\\xf3\\xdb\\xf3\\x25\\xb0\\x7c\\xd4\\x54\\xd4\\xb1\\x41\\x99\\x1e\\xf7\\xe2\\x3d\\xb5\\xee\\x24\\xbe\\xda\\x35\\x88\\x4a\\xa3\\x70\\x48\\x08\\x64\\x8a\\xa4\\x3c\\xd6\\x25\\x62\\x59\\xf7\\xd3\\xdb\\x5e\\x05\\x53\\x11\\xf2\\x53\\xe8\\xb5\\x7a\\x4c\\xda\\x5a\\xfe\\x0b\\x0a\\xdf\\xc3\\x64\\xe1\\x60\\xca\\x37\\xe8\\xde\\xc6\\xb9\\x5a\\xa6\\x15\\x2e\\x5d\\x5d\\xa6\\xeb\\x91\\xbe\\x0e\\x44\\xff\\xe8\\xe4\\x95\\x33\\x26\\x7b\\x7e\\xb7\\x95\\xf5\\xf8\\xe0\\xb2\\xc3\\x5b\\x29\\xdf\\xbc\\x87\\x58\\x5f\\x22\\xbd\\x5b\\x90\\x9d\\xfd\\x6a\\x5e\\xdc\\x0e\\x3a\\x9d\\x97\\xb0\\xc4\\xf3\\xad\\xc5\\x1e\\x96\\x99\\x37\\xc0\\x8f\\xd6\\x5f\\x53\\x7a\\xac\\xda\\x8f\\x11\\x27\\x5a\\xf0\\x2c\\x33\\x54\\x54\\x26\\x30\\xf3\\x92\\x0c\\x39\\x3f\\x5c\\x42\\xb9\\xfc\\x63\\x3d\\xe9\\xd9\\x4c\\x72\\xe3\\xf2\\x00\\x02\\x34\\x9a\\xd0\\x41\\x80\\x35\\xb3\\xf2\\x5f\\x02\\xca\\x92\\x8e\\x5b\\x2d\\x40\\xa7\\x7a\\x1c\\x3e\\x56\\x22\\x1f\\x4b\\x9d\\xb0\\xc2\\x5b\\x09\\x6d\\x6e\\x5d\\x0f\\xe7\\x58\\xda\\x2c\\x69\\x05\\x3e\\x8d\\x08\\x6d\\xef\\x4e\\xdc\\x6e\\x34\\x53\\x78\\x3f\\xfc\\x63\\xa4\\x96\\x01\\x22\\xd9\\x23\\x67\\x1a\\x90\\x60\\x08\\xba\\xc1\\x05\\x61\\xae\\x62\\x19\\xd2\\xb5\\x1d\\x53\\x67\\xbf\\x13\\xcc\\xab\\xf5\\x93\\x1b\\x9f\\x18\\x6e\\xb1\\x09\\xba\\xcd\\xe4\\x0e\\x1a\\xf2\\xb5\\x64\\x81\\xe0\\xc6\\xdc\\x6f\\x5c\\x54\\x73\\xf8\\x00\\x1c\\xf3\\x71\\x91\\x9a\\xcb\\x40\\xce\\xc5\\xb9\\x62\\xeb\\xba\\x80\\xe3\\x2d\\x6e\\xba\\xc4\\x80\\x6d\\x04\\xd2\\x47\\x68\\xc2\\xad\\x2e\\x3f\\x92\\xa8\\xcb\\xe4\\x77\\x54\\xf9\\xbf\\x61\\x59\\x53\\x52\\x2b\\x26\\x3d\\xc2\\x49\\x37\\xfb\\xd9\\x32\\xc8\\xc4\\x59\\xeb\\x8b\\x10\\x94\\x43\\xaf\\x6c\\x19\\x5a\\x59\\xfd\\x27\\x21\\xb0\\x12\\x56\\x28\\xf2\\xb8\\x14\\x3c\\xf3\\xc1\\x28\\xbc\\xec\\x13\\x92\\xef\\xd1\\x6b\\x73\\x4c\\x10\\x71\\x6d\\x96\\xba\\x7d\\x1f\\x41\\x39\\x17\\xcc\\xaf\\xa5\\xbf\\x5f\\x83\\xf5\\x24\\xfe\\x84\\x06\\xa1\\x52\\x11\\x5e\\xa7\\x70\\xe1\\x74\\x5e\\x82\\xe8\\xb5\\x1d\\x75\\x2b\\x8b\\xd7\\x85\\xdf\\x48\\xbf\\xc1\\x20\\x41\\xbf\\x87\\x4f\\xc7\\x3a\\xfb\\x42\\xca\\x5d\\x69\\xc6\\x41\\x64\\x79\\xce\\xb4\\xaa\\xa0\\x49\\x2b\\x6f\\xf2\\x1e\\xe1\\x2d\\xb2\\x21\\x3a\\x42\\x86\\xfd\\x56\\x05\\xc9\\x3a\\x7b\\xb8\\xa3\\xb0\\x71\\xb0\\xb2\\x5f\\xb0\\x1d\\x77\\xab\\xbc\\x87\\x71\\x48\\x94\\x70\\xa1\\x07\\xaa\\xda\\xe9\\xf6\\x40\\xc2\\x4d\\xfd\\x53\\x28\\xf6\\x0f\\x4b\\x7d\"},\n{{0x70,0x94,0x16,0x07,0x49,0x97,0xb9,0xc9,0xaf,0x4d,0x37,0xa0,0x11,0x39,0xe8,0xa3,0xf9,0xf2,0xce,0x5d,0x72,0xa5,0x7d,0x80,0x5e,0x82,0x2a,0x81,0x18,0x6d,0x01,0x7e,},{0xae,0xe1,0x10,0xf1,0xf4,0xd4,0x6e,0xa6,0x06,0x49,0xd7,0x86,0xb1,0x50,0x05,0x2e,0x28,0x7a,0x9d,0xa6,0x01,0x22,0xc4,0x7b,0x09,0x08,0xfa,0x8b,0x2c,0xa2,0x8a,0x80,},{0x8e,0x4b,0x41,0xf0,0x97,0xd8,0x36,0x14,0x18,0x4b,0xa7,0xf5,0x2b,0xa2,0xfd,0x9f,0x05,0x65,0xf8,0xa6,0x37,0x21,0xef,0x55,0xf9,0x31,0x62,0x82,0x6b,0x9f,0x0a,0xc0,0x70,0xc0,0xe2,0x86,0x4b,0x5f,0xfd,0x8e,0xcc,0xc1,0x8e,0xfa,0xd1,0x8b,0x2c,0xe8,0x4b,0xe5,0x7c,0x0b,0x4a,0x41,0xc5,0x2e,0x20,0xef,0x37,0x72,0x23,0x77,0xc6,0x0f,},\"\\xed\\xda\\xa3\\x69\\xc0\\xe3\\x1a\\x1f\\xcc\\x1d\\xa4\\x6f\\x65\\x36\\x24\\x42\\xa0\\xcc\\x21\\xc7\\xdc\\xdd\\x5c\\xd9\\x0e\\x0a\\x2e\\xe9\\xf2\\x51\\x10\\x81\\x2b\\xa1\\x14\\x93\\x1c\\x86\\x8a\\x70\\x86\\x07\\xac\\x16\\x08\\x4d\\x79\\x71\\x5d\\x13\\xb3\\x38\\xc0\\x5c\\x6a\\xef\\x73\\x43\\xe7\\xda\\xd2\\x82\\xf9\\x6f\\xe2\\x81\\x93\\x18\\x8f\\x0c\\xc8\\x93\\xc7\\xdc\\xe8\\x05\\xfd\\x3a\\x7c\\xd2\\x68\\xb7\\x28\\x94\\x16\\x0b\\x52\\x45\\xfe\\xd9\\xfa\\x99\\x43\\xb7\\xc8\\x0a\\xdb\\x3c\\x2d\\x1a\\x35\\x3d\\x8f\\x12\\xdf\\x25\\xa3\\x1d\\xde\\x7f\\xa3\\x85\\xbb\\xec\\x35\\x1d\\xa6\\x6f\\x15\\x30\\x32\\xe1\\x77\\x56\\x27\\x3f\\x8d\\x54\\xe9\\xa3\\xb9\\xea\\x25\\xae\\x67\\xd1\\xe9\\xc1\\x8c\\xc6\\x8b\\xe6\\x01\\xe3\\xd6\\x82\\x82\\x81\\x8c\\xe0\\xe7\\xcf\\x88\\xa4\\xd1\\x33\\x64\\x53\\x02\\x17\\x32\\xf0\\x8d\\x9e\\x76\\xcd\\x23\\x63\\x79\\x29\\xb0\\x91\\x1d\\x5f\\x86\\x14\\xf4\\x84\\x2e\\x67\\x0c\\x14\\x28\\x60\\xaf\\xc2\\x65\\xc5\\x01\\x72\\xb1\\x3b\\xfd\\x35\\xad\\x8f\\xc5\\x4b\\x28\\x65\\x7d\\xa3\\x2b\\xac\\x15\\x3b\\xa9\\xaf\\xfc\\x89\\x7a\\xfb\\x3c\\x72\\x1f\\x48\\xca\\xa4\\x62\\x40\\x58\\x57\\x10\\xb0\\xf2\\xd2\\x4d\\x5f\\xf4\\x96\\x5d\\x1d\\x10\\xf1\\xa0\\x7b\\x06\\xab\\xea\\x6a\\x08\\xe1\\xd6\\xf1\\x50\\x0d\\xa1\\x2c\\x43\\x4a\\x6d\\x77\\x8c\\x94\\x10\\x67\\x10\\x80\\x00\\x47\\x5c\\xe8\\x31\\xbc\\xfe\\x2d\\x0a\\xfe\\x40\\xb7\\x41\\x9d\\x07\\x05\\x9b\\xc0\\xcd\\x8d\\xce\\x4b\\xe9\\x58\\x7f\\xf2\\x9a\\xd8\\xbf\\x0b\\x26\\x8a\\xe2\\x3c\\xe0\\xda\\x5b\\xb5\\xbf\\x74\\xff\\x0b\\x2b\\x31\\xb8\\x21\\x12\\xa9\\xfd\\x5a\\xbd\\x9b\\xfd\\x0a\\x90\\xe6\\xf4\\x72\\x35\\x48\\xc6\\xbb\\x2f\\x99\\xdc\\x06\\x1b\\xa3\\x2e\\xba\\x2d\\x53\\xe6\\xbc\\x79\\xbf\\x44\\x1b\\x23\\xfb\\x74\\x60\\xde\\x04\\xe8\\xe8\\xef\\xbc\\xd4\\xd4\\xcc\\x73\\x55\\xde\\x9e\\x3b\\x08\\x61\\xa6\\x81\\xb9\\x83\\x83\\x9d\\x44\\x88\\xe5\\x51\\x75\\x1f\\x23\\xe9\\xa6\\xe2\\xe4\\xd4\\x43\\x27\\x3b\\x9e\\x0f\\xe6\\x4d\\x8a\\xcd\\x1c\\x74\\x8b\\x55\\x59\\x43\\x82\\x23\\xdd\\x21\\xb5\\x18\\x31\\x89\\xe0\\xf3\\xc0\\xe8\\xed\\x41\\x4c\\x03\\x56\\xba\\xb7\\x7a\\x65\\x4d\\xe1\\xa5\\x77\\x14\\x62\\xef\\x14\\x34\\x49\\x70\\xa4\\x91\\x51\\x1a\\x72\\x29\\x14\\xf4\\xa8\\x9f\\x4f\\x1a\\x82\\x7e\\x18\\xcd\\x84\\x47\\x9c\\xc9\\x25\\x92\\xea\\xdf\\x8d\\xe2\\xdf\\x82\\x4b\\x97\\x6d\\xcb\\xd2\\x84\\xa3\\xba\\x64\\xbc\\xdb\\x0d\\xf1\\x5e\\x8f\\x41\\xc0\\xb2\\x47\\x15\\x86\\xb2\\x6a\\x06\\x35\\x3d\\x90\\x50\\x28\\x23\\x5c\\x1c\\x6e\\x5c\\x45\\x87\\x22\\x27\\x25\\xaf\\x08\\x3e\\x11\\xe7\\x9c\\x94\\x3a\\xa4\\x44\\xd4\\xaa\\x41\\x21\\x8d\\x3e\\x97\\x43\\x36\\xe3\\x72\\x81\\x3e\\x99\\xe2\\xb0\\xc5\\xf0\\xae\\x81\\x0f\\xfe\\xd9\\xa7\\xa3\\xd6\\xcb\\x74\\xc5\\x47\\x3d\\x99\\x0a\\x59\\x11\\x32\\x9b\\x8e\\x82\\xec\\x6b\\xf2\\xbd\\x43\\x21\\xbb\\x48\\x73\\x70\\xf8\\x73\\x9e\\x7a\\x2a\\x4a\\x53\\x43\\x08\\x33\\xd4\\x5b\\x9f\\xe3\\xde\\xb9\\x3f\\x79\\xfc\\x6a\\x51\\xd5\\x63\\x69\\x5e\\xcd\\xb9\\x78\\x58\\xd2\\x13\\xda\\x58\\x44\\x34\\xb7\\xc7\\x15\\x46\\xaa\\xe8\\xd9\\x67\\xe1\\xc6\\xd0\\x08\\x2b\\x10\\xd4\\xa7\\x2d\\xe1\\x74\\x2e\\x53\\xc4\\xb2\\xf9\\x2e\\xb8\\xb5\\xc8\\xc3\\x5a\\xb6\\x53\\x5e\\xa8\\x10\\x0b\\x37\\x92\\x4a\\x0a\\x91\\xd2\\xa7\\x28\\xd0\\xf5\\x64\\x24\\x37\\xaa\\x66\\xc8\\x2a\\xb7\\x4b\\x5d\\x07\\x45\\xec\\x08\\xf7\\x70\\x5c\\xb8\\x1f\\xa0\\x79\\xd8\\x9e\\xcd\\xc9\\xaa\\x1f\\x8d\\x7d\\x82\\xdc\\x77\\x46\\xd3\\x46\\x15\\x34\\x3a\\x69\\x25\\xdc\\x31\\x8f\\x35\\x2a\\x2b\\x45\\x01\\x24\\x38\\x42\\x4f\\x90\\x98\\xfd\\xdf\\x6e\\x61\\xfd\\x1f\\x8f\\xb4\\x9d\\xa4\\x0b\\x3e\\xec\\xe8\\x9a\\x1a\\xf1\\x99\\x6d\\xe7\\x0c\\xd1\\x69\\x6c\\xbf\\xd9\\xe3\\x01\\xea\\x5f\\x44\\x37\\xc7\\x1a\\xc2\\xa0\\x32\\x25\\x4c\\x14\\x0a\\x90\\xe8\\x5f\\xb8\\xff\\xc4\\x66\\x7f\\xa1\\x39\\xc1\\xee\\x9b\\xbf\\x12\\xee\\xd9\\x06\\xa9\\x67\\xbc\\x09\\x21\"},\n{{0x3d,0xcb,0x7a,0xe7,0xd9,0xf0,0xf1,0x41,0xf1,0xd9,0xf0,0x78,0x83,0x63,0x5b,0x91,0x3e,0xd2,0x9f,0xb6,0x1d,0x0f,0x74,0x1c,0x9a,0xfd,0x05,0xa2,0x7b,0x04,0x5b,0x06,},{0xae,0x62,0xb7,0xee,0x1b,0x8d,0xb5,0x76,0x4d,0xaf,0xdd,0xd9,0x72,0x4a,0xcc,0x10,0x6d,0x6c,0x0a,0x4d,0x1e,0x85,0xd8,0x90,0x6f,0x75,0x84,0xb5,0x58,0xf5,0x77,0xdf,},{0x09,0xa1,0xe6,0xfe,0xdf,0x97,0x1b,0x3e,0xdb,0xfa,0xef,0xbe,0xb8,0x9a,0xa5,0x39,0xca,0x0b,0x02,0xb3,0x7e,0x7a,0xc4,0xea,0x89,0x20,0xd6,0xd4,0x34,0x8e,0xe0,0xcf,0x9a,0x2d,0x5e,0x96,0xfc,0xe5,0x17,0xc6,0x65,0xe7,0xc3,0x83,0x68,0xba,0xf2,0x49,0x79,0x24,0x9a,0x95,0xb7,0x0e,0xa7,0x43,0x6c,0x00,0x78,0x5f,0x16,0xa3,0xae,0x09,},\"\\x38\\x11\\x6a\\x57\\x26\\x69\\x07\\x0d\\xd5\\x86\\x32\\x18\\xc9\\x1a\\x77\\xa4\\xab\\x47\\x55\\x36\\x88\\x48\\x8c\\x79\\x28\\x38\\x50\\x9e\\x9a\\xba\\x25\\x06\\x7a\\xdb\\x7e\\xa4\\x24\\x98\\x48\\x00\\x9d\\x91\\x4a\\xe9\\x87\\xa6\\x03\\x23\\x48\\xc1\\xc0\\x68\\x1c\\xf9\\x77\\xa9\\x55\\x2d\\xd6\\xbb\\xf4\\xe6\\xff\\x32\\xac\\xc9\\xfa\\x61\\xcb\\xee\\x25\\xa3\\x93\\x07\\x65\\x0f\\x8b\\xa6\\xa7\\xce\\x42\\x1e\\xf2\\xf7\\x1b\\xcc\\xc0\\x95\\x81\\x38\\xf9\\x32\\x4c\\x86\\xbf\\x2e\\x52\\x8f\\xa3\\xe4\\xd1\\xb1\\x9f\\x9f\\x2c\\xa5\\x26\\x84\\x09\\xb8\\xcc\\x19\\xc6\\x2d\\xd9\\x79\\xb8\\x96\\x97\\xe4\\x57\\xed\\x2d\\x98\\xbd\\x20\\x96\\xf6\\x2d\\x3d\\x9e\\x24\\x73\\x88\\x79\\x59\\x27\\x80\\x3e\\x79\\xab\\x71\\xd4\\xf7\\x2f\\x56\\x8e\\x94\\x5a\\x8a\\x16\\x21\\x59\\xd9\\xb8\\x48\\x36\\xe4\\x58\\x56\\x44\\xd4\\x97\\x9f\\x61\\x4a\\xad\\xa7\\x3a\\xd4\\x13\\xa8\\x33\\x91\\xe9\\xcf\\x88\\x0c\\x42\\xac\\x2a\\x98\\x34\\x3b\\x6a\\x82\\xcd\\x2b\\x61\\x58\\x14\\x56\\xf6\\xde\\x5c\\xeb\\x24\\xfe\\x46\\xb7\\x62\\x5d\\x52\\xab\\x2c\\x2c\\x32\\x4a\\xc7\\x47\\x03\\xd1\\x5e\\x15\\xf1\\xae\\xff\\x80\\x55\\xd2\\xf7\\x39\\xf7\\x36\\x3e\\x16\\xec\\x1d\\x78\\xbe\\x2c\\x62\\x99\\x43\\x6c\\x8c\\x8d\\x33\\x6b\\xd2\\x92\\x71\\xa8\\x97\\xa6\\xec\\x93\\x2e\\xd0\\x87\\x25\\xbe\\x21\\xb2\\x8f\\x9a\\xa1\\x4e\\xaf\\x4f\\x71\\x85\\x31\\x54\\xdb\\x14\\x58\\x7c\\x93\\x0a\\xb3\\xeb\\x02\\x27\\xad\\x7f\\xfb\\x45\\xb3\\xba\\xa6\\xa9\\x99\\x49\\x9c\\xc8\\xa6\\xe4\\x5b\\x1a\\xb4\\xd0\\xb3\\x39\\x78\\x2b\\xcd\\x9c\\xfb\\xcf\\x88\\xcf\\x7e\\xae\\x89\\x1c\\xc8\\x41\\xe9\\xc8\\x8a\\x1f\\x6a\\x69\\x1f\\x39\\x48\\xa6\\xbc\\x85\\xba\\x7f\\x46\\x11\\x64\\x2e\\x84\\x22\\x3c\\x3b\\x17\\x89\\x46\\xdd\\xbe\\xdd\\xcf\\xcd\\xef\\x4a\\xe4\\xc4\\xe1\\xa8\\x14\\xb9\\xb1\\xf0\\x2b\\x1e\\xaa\\x82\\x4d\\xb9\\x3f\\x44\\xb2\\x7d\\x14\\x20\\x6b\\x34\\x04\\x65\\xa1\\xce\\xfc\\xf5\\x35\\xc6\\x3e\\x55\\xc4\\x28\\x72\\x24\\x26\\x27\\x33\\xd9\\x8a\\xaa\\xa1\\x54\\xf3\\xad\\x42\\xcd\\x85\\x46\\xa4\\x61\\xce\\x0d\\x46\\xd8\\x86\\xd3\\x46\\x1a\\x21\\x50\\xcb\\x45\\xdb\\xe5\\x64\\x73\\xff\\x63\\xd3\\xdc\\x7a\\x2b\\x95\\x7b\\x82\\x39\\x69\\xf1\\x9b\\x59\\x68\\xe8\\xb4\\x24\\xc8\\x79\\x74\\x19\\x26\\xd8\\x2c\\x63\\x86\\x75\\x3b\\x0f\\xa1\\xf0\\x80\\x28\\x4e\\x55\\x78\\x94\\x23\\x63\\xaa\\xde\\xb2\\x1f\\x8e\\x1e\\x89\\x09\\xfa\\x6c\\x38\\x07\\x64\\x14\\x9b\\xc9\\x15\\xb2\\x28\\x60\\x4e\\xfc\\x56\\xd9\\x2e\\x4b\\xeb\\x72\\x0e\\xdc\\x74\\xc4\\xd7\\x8f\\x92\\x5d\\x6c\\xfd\\xf7\\xba\\x2f\\x14\\xb5\\x62\\x37\\x75\\x81\\x0d\\x2d\\x07\\xbd\\x38\\x8c\\x57\\x3e\\x36\\x52\\x3f\\x21\\x57\\x38\\xe6\\x91\\x14\\xdc\\xf8\\xd8\\x0f\\x17\\x0b\\xfa\\x67\\x6e\\x31\\xfb\\x62\\x6a\\x7d\\x44\\x9e\\xd9\\x66\\x47\\x36\\x34\\x75\\x97\\x0c\\x8c\\x47\\x80\\x97\\x09\\xbc\\xb5\\xe7\\x20\\x0f\\x2a\\x22\\x7c\\x7c\\x8e\\x7b\\x00\\x0f\\x30\\xc0\\xbd\\xe6\\x1d\\x67\\xbd\\x68\\x95\\x36\\x16\\x29\\xa3\\x6c\\x8f\\xdd\\x5a\\x56\\xb8\\x1e\\xfb\\xac\\xf1\\x5c\\x1b\\x35\\x30\\xa0\\x8c\\xde\\xd5\\xb1\\xfd\\x45\\x7f\\xbd\\x2f\\x03\\x04\\x2f\\x56\\xf1\\xb3\\x7e\\xd1\\x5c\\xdb\\x91\\x2f\\xa0\\x29\\x8c\\x27\\x67\\x25\\x08\\x7e\\xe2\\x7d\\x3c\\xf2\\x55\\x0f\\xe6\\xe8\\xa0\\x33\\x0a\\xf4\\x17\\xf4\\xf5\\xba\\xf0\\x36\\x27\\xed\\x67\\xc5\\xf8\\x32\\x33\\x63\\xab\\xac\\x5a\\x1f\\xe3\\x48\\x23\\x18\\x0e\\x3e\\x0e\\x20\\x80\\xf7\\x5b\\xfd\\x91\\xc2\\x07\\xcf\\x6b\\xaa\\x9a\\x22\\x9c\\xf4\\x43\\xdd\\x44\\x2c\\x59\\x02\\xe0\\x67\\x3f\\x32\\x52\\xb8\\x52\\x63\\x46\\x58\\x58\\x72\\xf6\\xcd\\x36\\x60\\x25\\xa5\\x69\\x92\\xb7\\x0e\\xde\\x39\\xbc\\x8d\\x32\\x2f\\x9c\\x22\\xa1\\xdc\\x59\\x9e\\x9f\\x0d\\x52\\x4c\\xb6\\xd2\\xea\\x5a\\xe2\\x87\\x8e\\xf6\\xbe\\xd4\\xb7\\x02\\x80\\x7f\\x1e\\x1e\\x73\\xeb\\xf2\\x90\\xeb\\x6c\\x0e\\xeb\\x85\\xc1\\x37\\x16\\xf6\\x26\\xaa\\x90\\xd3\\x64\\xb4\\x90\\x48\\x37\\xce\\x05\"},\n{{0x29,0x73,0x11,0xdd,0xef,0xfe,0xc9,0xd2,0xbe,0x68,0xef,0x7b,0x2a,0x20,0xfe,0x2d,0x27,0x7e,0x1d,0x8e,0x51,0x64,0x8b,0x03,0x57,0x2a,0xda,0x27,0xec,0x1f,0x9f,0x43,},{0x6a,0x6c,0x28,0xe7,0x61,0x64,0x0c,0x40,0x08,0x33,0x3a,0xae,0x5a,0x33,0x66,0x30,0x2e,0x2f,0x46,0x77,0xa9,0x53,0xba,0x48,0x2a,0xb6,0xfb,0x4a,0x1d,0x70,0xb4,0x47,},{0x4b,0xf0,0xb9,0x2c,0x6e,0xe4,0xea,0xce,0x5e,0x8e,0xb1,0x03,0x70,0xff,0x9d,0x9c,0x68,0xa5,0x74,0x9d,0x59,0x89,0x9d,0x04,0x32,0x7a,0xaa,0x38,0xf8,0xf8,0x25,0xe0,0x32,0xe5,0x97,0x42,0xb3,0x7d,0xe2,0x31,0x07,0xa3,0xec,0xdd,0x3f,0x7a,0x0d,0x08,0x12,0x26,0x14,0xb7,0x8f,0xdd,0x37,0x29,0x3c,0x8d,0x05,0xe2,0x8f,0x5f,0x71,0x08,},\"\\x26\\x52\\xac\\xfc\\x3b\\xdf\\x09\\xa5\\x99\\xec\\x67\\x86\\xbb\\xd9\\x4f\\xe5\\x77\\xcf\\x57\\x8e\\x02\\x63\\xcc\\x68\\xd9\\xf5\\x7a\\x6c\\x83\\x45\\x8f\\x80\\xac\\xd8\\xa7\\x5e\\xf0\\x30\\x40\\xa6\\x35\\x67\\x2b\\x96\\x8f\\xf2\\xaf\\xdb\\x28\\x8d\\x28\\xb9\\x99\\x6f\\x64\\x15\\xb2\\xf3\\x17\\x5e\\x9e\\xa3\\x7a\\xeb\\x05\\xdf\\x81\\x81\\x2e\\x38\\xa4\\xc9\\x76\\xeb\\x92\\x85\\x6c\\xed\\xb9\\x1a\\x26\\x9a\\x46\\xfc\\xa5\\xdf\\x9b\\xd7\\x30\\xfd\\x84\\x45\\x2b\\x4b\\xd9\\x35\\x77\\xc6\\x1f\\x42\\xc1\\x41\\x13\\x97\\x98\\x82\\xa8\\x6a\\x9f\\xe6\\x32\\xe4\\x75\\x6a\\xfd\\x89\\x81\\x6f\\xc4\\x67\\x0a\\x31\\x05\\x03\\xfd\\xaa\\xd2\\xdb\\x76\\x4c\\x37\\x21\\x21\\x3c\\x3e\\x60\\xf2\\x9c\\x26\\x68\\xd4\\xde\\x8f\\x42\\xb0\\x87\\xf2\\x5c\\xd5\\x6c\\x69\\xa4\\xe4\\x8f\\x13\\x4f\\x55\\x98\\xcf\\x14\\x5b\\xe6\\x38\\xa5\\xc2\\x31\\x88\\x63\\x32\\x90\\x61\\x72\\x9a\\xac\\x91\\xda\\x6a\\x19\\x1f\\xd7\\x74\\x88\\x0c\\xf9\\xcb\\x55\\x5e\\xec\\x15\\xb0\\x04\\x4f\\x10\\xe5\\x43\\x3f\\xb4\\x6a\\x9b\\x88\\x92\\xda\\x8f\\x6d\\x24\\xf1\\x42\\x58\\x8b\\x70\\xff\\x0b\\x49\\x20\\x0c\\x50\\x6b\\x88\\xbe\\xd4\\x49\\xad\\x10\\xd3\\xf9\\x2c\\x2b\\xae\\xda\\x6b\\xbf\\x58\\x67\\x6c\\x5b\\xbc\\x67\\xd3\\x1f\\x64\\xfb\\x12\\xe8\\xd5\\xe7\\x88\\x76\\xd5\\xc8\\x49\\xfc\\x31\\x4b\\x2c\\xf8\\x01\\x0c\\x51\\x02\\x04\\xc8\\x63\\x3d\\x0c\\xc3\\x18\\x56\\xec\\x6a\\x11\\x4e\\xa8\\xa8\\x9c\\x48\\x92\\x7b\\x07\\xa3\\x1a\\xb8\\x42\\xc9\\xb8\\x35\\x2d\\x93\\x67\\x34\\x51\\x41\\xa9\\x9b\\x40\\x04\\x9d\\x5c\\x48\\xe7\\xd2\\x7c\\xab\\x42\\x7a\\xde\\xfd\\x1f\\x0f\\xc1\\x13\\x6b\\x35\\x3c\\xb0\\x1c\\x3d\\xef\\x91\\xff\\xfe\\xe8\\xad\\x91\\xe8\\x8f\\x4b\\xb7\\xd2\\x61\\x5c\\x0d\\xcc\\x95\\x34\\x4c\\xd0\\x19\\x50\\x93\\x8e\\xcb\\x14\\xb8\\x44\\x6b\\x56\\xa0\\x6b\\xf2\\xf2\\xf6\\x5f\\xb8\\x73\\x5e\\x8a\\x7b\\xc9\\x6b\\xb4\\x6c\\xe9\\xca\\xc7\\x1a\\x88\\xeb\\x8f\\xda\\x5e\\x69\\xd6\\x9e\\xb2\\x9a\\xa4\\x2a\\x01\\x6b\\x85\\x83\\x89\\x3e\\x9d\\x72\\x77\\xcb\\x13\\x59\\xc5\\x68\\x7e\\xed\\xcd\\x59\\x9d\\x8a\\x46\\xe6\\xc1\\x49\\x63\\x63\\x7d\\xb0\\x4a\\x92\\x9f\\x4b\\xc7\\x93\\x04\\xac\\x2d\\xae\\x73\\x3b\\x3a\\x83\\x9e\\xb7\\x4f\\xbe\\x3d\\xe5\\x04\\x2f\\xd6\\x55\\xea\\xec\\xb1\\x5f\\x39\\xb2\\xfe\\x16\\xda\\xd8\\xa6\\xff\\x8d\\xbc\\x05\\x4f\\xed\\x51\\x28\\x2a\\x85\\x6e\\x9d\\xa6\\x31\\x6f\\xac\\x6d\\xb5\\xd5\\x6f\\x77\\xf1\\x8d\\xa8\\x41\\x2e\\xb3\\x77\\xe5\\xb1\\xb8\\xf4\\xcb\\x13\\x54\\xec\\xfe\\x8f\\xe8\\xfd\\x54\\xe6\\x2d\\x76\\x7a\\x80\\xde\\x04\\xcb\\x76\\x20\\x22\\x9a\\x88\\x31\\xdb\\xc9\\xec\\xd4\\x57\\x8f\\xfa\\x2f\\xf0\\x6b\\x54\\x45\\xe4\\x40\\xd6\\x9a\\xab\\xc9\\x4c\\x47\\xbd\\x17\\xf2\\x2b\\x69\\xf5\\x2e\\xea\\xe5\\xcf\\xcd\\x01\\xa5\\xca\\xfe\\x05\\x80\\x07\\x2a\\xe9\\x16\\x6b\\x95\\x74\\x3d\\x68\\xc3\\x56\\x4c\\x5a\\x7e\\x46\\xf2\\x4b\\xc4\\x8a\\x89\\x8a\\x1a\\xb2\\xeb\\xe6\\x3f\\x36\\x85\\x1d\\x2a\\xac\\xfa\\x0c\\x4f\\x32\\xd9\\x93\\x77\\x1d\\x31\\x4e\\x72\\x5a\\x43\\xd9\\x80\\x5d\\x13\\x71\\xcf\\x72\\x3e\\xf1\\x61\\xd4\\x2e\\x63\\xff\\xca\\x68\\x8d\\x7f\\x0e\\x21\\xef\\x5b\\x3f\\x9a\\x56\\x1a\\x62\\x10\\x70\\x2b\\x85\\xfb\\xd1\\xf8\\xca\\x75\\x38\\x9c\\xc7\\xa2\\x27\\x39\\xba\\xe4\\xde\\xd9\\x37\\x57\\xf1\\x52\\x0d\\xc3\\x88\\x44\\xa1\\xa8\\x8b\\xe8\\xe0\\x96\\x45\\x05\\x91\\x48\\x80\\x7b\\x93\\x37\\x70\\x87\\x8c\\xb8\\xa9\\xad\\x92\\x11\\x31\\x71\\x31\\xe6\\x93\\x24\\x53\\x2f\\xd0\\x27\\x9b\\x83\\x18\\x5b\\x62\\x8f\\xc2\\xf9\\xe2\\x15\\x00\\x38\\x46\\x93\\xfa\\x29\\xf2\\x6b\\xd1\\xb9\\xc3\\x01\\x60\\x13\\x67\\x66\\x5f\\x05\\xf3\\x72\\xda\\xb4\\xe3\\x10\\x77\\x26\\xcd\\x3f\\x63\\x9c\\xa6\\x2b\\xf6\\x3a\\x75\\xf7\\x7e\\xaa\\x75\\xf7\\x13\\x61\\x57\\xad\\xa2\\x37\\x4e\\x65\\xfb\\x4f\\xd3\\x49\\xb4\\x5e\\x25\\x44\\x1f\\xd2\\x1b\\x13\\xe6\\x91\\x13\\x66\\xb9\\x7c\\xfb\\x4d\\x6a\\xd5\\x22\\xb8\\x50\\xad\\xf4\\x0c\"},\n{{0x4d,0xb2,0xb5,0x81,0x44,0xa8,0xd2,0xd0,0xec,0x03,0xbb,0x9b,0xc2,0x9b,0x4c,0xa8,0x93,0x85,0x4c,0x80,0xb6,0x4a,0xfa,0x4a,0xf7,0xa9,0xc9,0x36,0x93,0x5e,0xcb,0x04,},{0xfc,0x5c,0xd7,0x50,0xe1,0x74,0xed,0x71,0x8b,0xd9,0x38,0xfa,0x8e,0xd9,0x9a,0x1b,0x9d,0x55,0x6b,0xa7,0x67,0x0f,0x2a,0x77,0xda,0xf1,0xc7,0x20,0x11,0x37,0x32,0xa5,},{0x42,0x45,0x17,0xaa,0xdd,0x85,0x3c,0xe3,0x98,0x57,0x59,0xa3,0x27,0xe7,0x76,0x0d,0x91,0x56,0xd3,0xb2,0x73,0x45,0x38,0x3f,0x0e,0x4a,0xd6,0x66,0x1e,0xe4,0xa3,0x72,0x4d,0x18,0xd8,0x20,0xf6,0xc5,0x57,0xf8,0x27,0x97,0xbe,0xb6,0x2d,0x2f,0x08,0x54,0x33,0x74,0x4f,0x89,0xa2,0xd8,0x52,0x93,0x79,0x64,0x81,0x86,0x2e,0xf8,0xa4,0x0f,},\"\\xc8\\xd1\\xdb\\xc9\\x36\\x91\\x1e\\x12\\x2c\\xee\\x18\\xf9\\x2b\\x16\\xa3\\x9a\\x2e\\xef\\x08\\x23\\xb2\\x27\\xf8\\x98\\xcd\\xf5\\x84\\x2b\\x93\\xd5\\x9f\\xc0\\x02\\xed\\xb5\\x49\\x8a\\x20\\x87\\x2e\\x19\\x55\\x4e\\xf7\\x39\\x99\\xeb\\x3a\\x7b\\x3e\\x2f\\xdd\\x90\\x70\\xe1\\xef\\xa9\\x22\\x8e\\x9e\\x93\\xb2\\x9a\\x86\\x8a\\xe3\\x79\\x9e\\x4e\\x57\\x23\\x24\\x83\\x6b\\x1a\\xd5\\xaa\\x81\\x2b\\xf0\\x0f\\x84\\x5b\\xc2\\x17\\xeb\\xbc\\x3f\\xab\\xdc\\x4e\\x1b\\x6e\\x51\\xef\\x9e\\xfa\\xc2\\x77\\x0a\\xa0\\xa4\\xa1\\x1e\\xe5\\x2a\\xb9\\x56\\xac\\x64\\x48\\xaa\\x26\\x29\\xcb\\x61\\xdb\\xb1\\xf1\\xed\\xb3\\xbd\\xe9\\x9b\\x48\\x76\\xda\\x39\\x2a\\x6e\\x0b\\x9a\\x0c\\x31\\x84\\x9a\\x58\\x90\\xae\\xa9\\x52\\x2f\\x56\\xd0\\x15\\xa1\\x93\\x50\\x15\\xb9\\x1b\\xf4\\xc6\\xa0\\x01\\x1d\\x23\\x77\\xd6\\x71\\xc3\\xd0\\xd7\\x53\\xc2\\x7f\\x8c\\x76\\xe4\\x05\\xd0\\x23\\x0f\\x1f\\x4b\\x9b\\x88\\xfc\\xeb\\xba\\x1e\\xaf\\x13\\x77\\x72\\x35\\xe5\\x53\\x24\\xb7\\xd3\\xf8\\x1e\\x68\\x61\\x09\\xd9\\x1c\\xe6\\x89\\x53\\x0b\\x90\\xd2\\xc5\\xc7\\x1d\\xd1\\x87\\x72\\xb3\\x85\\xd6\\x2c\\xcb\\xfd\\x2e\\x08\\x9a\\x1b\\x67\\x09\\x83\\xf6\\x0c\\x21\\xc4\\x45\\x5c\\xb9\\xd1\\xa0\\xdc\\xaa\\x74\\xc8\\x74\\xe3\\x52\\x11\\xf8\\x22\\x7f\\xf7\\xc2\\x34\\xdf\\xf8\\x5e\\xc0\\xb0\\x7e\\x36\\x8c\\xfa\\x50\\xa3\\x43\\x57\\x83\\x95\\xa1\\x4c\\x68\\xf1\\xf8\\x9b\\xd4\\xec\\xbc\\x17\\x2e\\xf8\\x05\\xe5\\x83\\x1e\\xc8\\x94\\x75\\xfc\\xc8\\xd6\\x85\\xca\\x92\\x55\\xa7\\x7e\\x3b\\xa3\\xc1\\x47\\x50\\x8e\\xc9\\x2d\\x7b\\xcc\\xe8\\x79\\xaf\\x0a\\xbd\\xd2\\x41\\x6b\\x67\\xb5\\xf5\\x05\\x07\\x33\\x79\\x14\\xf3\\x90\\xbb\\xe0\\xb4\\x50\\xb6\\xa2\\xf1\\x15\\x93\\x72\\xc4\\xbc\\xce\\xa3\\x82\\xce\\x3d\\x6d\\x9f\\xb2\\x51\\x5e\\xcf\\x79\\x30\\x05\\x9a\\x05\\x52\\xb7\\x5f\\x97\\x88\\x62\\xbf\\x97\\xe8\\x32\\x5a\\xf2\\x4d\\x1b\\x8c\\xe9\\x51\\x2b\\xfc\\x7c\\xef\\x88\\x42\\x32\\x04\\x23\\x41\\xd8\\x2f\\x9b\\x5d\\xad\\x2e\\x50\\x2a\\xc6\\xac\\x79\\x5f\\x99\\xda\\xc7\\xfc\\x60\\xe3\\xb8\\x63\\x9d\\x0e\\x15\\x00\\xde\\xad\\x4e\\x78\\xac\\xa1\\x09\\x95\\x7d\\x57\\x7a\\x13\\xc1\\x92\\x5d\\x74\\x03\\xc1\\xac\\xf9\\x89\\xa9\\xde\\x67\\x11\\xe2\\x3c\\x67\\xbf\\x87\\x22\\xf5\\x51\\xb7\\x74\\xca\\xda\\x93\\x1b\\x5f\\xd9\\x73\\x43\\x4e\\x3b\\x71\\x72\\x81\\x98\\x83\\xe7\\x0c\\x52\\x78\\x5e\\x3b\\x49\\xd3\\x23\\xd0\\x56\\x36\\x64\\x11\\x58\\x64\\x0d\\xcf\\x6a\\x4c\\x20\\x0e\\xb2\\xc1\\x3b\\x1b\\xee\\xb2\\xdc\\x36\\x03\\x52\\x47\\x0d\\x15\\x38\\x6e\\x59\\xe6\\xfa\\x60\\x36\\x7e\\x5e\\x7f\\x17\\x2b\\x21\\x15\\x9d\\x5e\\xe7\\xca\\xb0\\xd7\\xf5\\x86\\x82\\x39\\x85\\x8e\\x2a\\x93\\x55\\x04\\x80\\xfe\\x8f\\xb4\\xdc\\xaf\\x4f\\x22\\x4c\\x4b\\x2a\\xd5\\x44\\x87\\x91\\x63\\x2d\\xf3\\x0e\\x8e\\x5f\\xb9\\x98\\xb3\\x5e\\xa9\\xae\\xc8\\xc9\\x34\\xa4\\x40\\x3a\\xef\\x82\\x18\\x7c\\xa1\\xab\\xf8\\x2a\\x34\\x4d\\x00\\xff\\xb9\\x93\\xd9\\xff\\x34\\x61\\xd6\\xfe\\xcd\\xaf\\x5d\\x3b\\x48\\x1e\\x0d\\x31\\x15\\x3d\\xbf\\x6a\\xed\\x28\\x8c\\x8a\\xdd\\x06\\x4e\\x83\\x31\\x55\\x01\\x41\\xbd\\x5f\\x7a\\x7e\\x04\\x7b\\x86\\x07\\xd8\\x46\\xa6\\xbf\\xb7\\x2d\\x68\\x34\\x46\\xa4\\x45\\x11\\x46\\x06\\x25\\x0d\\x8d\\x2d\\x3a\\x8b\\x95\\x08\\xbb\\x07\\xd4\\x62\\x3c\\xdf\\x17\\x88\\xb5\\x49\\x9e\\x9c\\xb9\\xa1\\x37\\x98\\x49\\xbf\\xa1\\x9c\\x9a\\x9f\\x4c\\xd3\\xd9\\x25\\x3a\\xdf\\xfd\\xa2\\x5f\\x47\\xc8\\x11\\xbe\\x83\\x3b\\x02\\xf3\\x32\\x7e\\xbb\\xa8\\x37\\x30\\x19\\x5d\\x61\\x4b\\xae\\x6f\\xe4\\xe7\\xa3\\x83\\x08\\x15\\xd2\\xaf\\x40\\x0d\\x20\\xa9\\x41\\x7a\\x09\\x5e\\x7e\\x8e\\xea\\x10\\x44\\x91\\x7c\\xbe\\x51\\x2c\\x40\\x18\\xd6\\x56\\xe2\\xdb\\x67\\xbb\\x98\\x9c\\x00\\xe1\\xe5\\x07\\x62\\x3e\\x82\\x78\\xd7\\x29\\x92\\x5b\\x84\\xfb\\x5c\\x18\\x6a\\x7b\\xac\\x18\\x9e\\x6d\\x6a\\xb1\\x4f\\xd7\\xb6\\x2f\\xdc\\x63\\x2b\\xeb\\xb5\\xf7\\x7c\\xb5\\xcc\\x2f\\x70\\x7d\\xf4\\x05\\x30\\x99\"},\n{{0xc8,0x20,0x41,0x3c,0x24,0x56,0x74,0x71,0x04,0x66,0x2e,0xf4,0xdf,0xf3,0xac,0x23,0x3a,0xc4,0xb9,0x1a,0x76,0xd3,0xc4,0xea,0x75,0x44,0x90,0xbc,0x9b,0x1e,0x29,0x1f,},{0x89,0x93,0xce,0xa2,0xf7,0xf2,0x80,0x6c,0x77,0xb3,0x98,0x1b,0x54,0xbf,0xa9,0xbf,0x17,0x62,0x15,0x1b,0x41,0x8e,0x5e,0x72,0x53,0x71,0xca,0x2c,0x04,0xd2,0x23,0xee,},{0x7e,0xf7,0x0e,0x4a,0x14,0x95,0x4d,0x50,0x9f,0x11,0x7f,0x4b,0xd0,0x1b,0x22,0x0b,0xcc,0x19,0x2d,0x3b,0x5f,0xdf,0xc3,0x48,0x2f,0xbb,0xc3,0xb6,0x9d,0xc0,0x68,0xa7,0xc4,0x76,0x1d,0x1b,0xeb,0xc2,0x31,0x7d,0x6d,0xb7,0x4f,0x90,0x6a,0x15,0x56,0x42,0xb0,0xa3,0xc6,0x59,0x2b,0xdc,0x72,0xe6,0x4e,0xac,0x6f,0x20,0x3f,0xb7,0x4e,0x02,},\"\\xd2\\x99\\x2f\\x83\\x92\\x4a\\x59\\x48\\x87\\xe6\\xef\\x13\\xf2\\xae\\x80\\x8f\\xc8\\x63\\x9c\\x7b\\x2c\\x99\\x4f\\xaf\\x0f\\x79\\x5e\\x36\\x01\\x6d\\xab\\x77\\x00\\xa0\\xee\\x53\\x01\\x70\\xf0\\xb9\\xfe\\x98\\xab\\x75\\x88\\xce\\x03\\xbc\\x50\\xc2\\xba\\xe6\\x5e\\x05\\x26\\x47\\xe7\\x56\\x73\\x5b\\x35\\xd0\\xb5\\x9c\\x96\\x4e\\x91\\x7d\\x8c\\x83\\xe2\\xf9\\xfe\\xcc\\x4c\\xb0\\x55\\x64\\x28\\x7f\\x0e\\x34\\xc9\\x49\\x40\\x05\\xe2\\x5b\\x1a\\x8b\\x1b\\x94\\x2b\\x54\\xd8\\x90\\x35\\xf1\\xb1\\xc3\\xc9\\x45\\xfc\\xc8\\x4e\\x4a\\x39\\xef\\xa2\\xca\\x50\\x95\\x9b\\x45\\x9a\\xf7\\x4d\\x21\\xb6\\x24\\x2e\\x2f\\x56\\x51\\x8f\\x70\\xe8\\x67\\x92\\x57\\xc0\\x89\\xd2\\x6c\\x3b\\xb7\\x92\\x68\\x7c\\x92\\x33\\x55\\xb2\\xc1\\x8e\\xe2\\x13\\x6d\\x40\\xcb\\xa4\\x5a\\xcb\\x64\\x24\\x0d\\x96\\x67\\xf3\\x9d\\xba\\x36\\x39\\xb6\\x51\\x6d\\x4c\\x49\\x47\\x57\\x3e\\xf4\\xce\\xd8\\x76\\xb5\\xb2\\xea\\x34\\x89\\xea\\xea\\x53\\x9f\\x55\\x7f\\x58\\xda\\x20\\x46\\x91\\xa7\\x6e\\x29\\xc9\\x4b\\x8b\\x05\\x38\\x23\\x2c\\x5f\\x7d\\x0b\\xb0\\xfd\\xd0\\x16\\x91\\x04\\x31\\x35\\x4b\\x3e\\x1e\\x7c\\xe6\\x2a\\xd4\\x36\\x91\\x7c\\xd5\\xc3\\x15\\xa5\\xbe\\x9b\\x97\\x1c\\x80\\xf9\\x7b\\xc9\\xd5\\xc1\\x56\\xff\\xd6\\x4f\\xd4\\xe3\\x1d\\xa5\\x60\\x83\\xe0\\x2a\\x0c\\x8f\\xce\\x55\\x4d\\xb6\\x86\\x74\\xcb\\x62\\x70\\x0b\\xa9\\x51\\x75\\x2b\\x82\\x9b\\x03\\xc5\\x42\\x32\\x74\\x12\\xee\\xc9\\xcc\\xc6\\xa5\\x0a\\xdf\\x47\\xbb\\xee\\x15\\x44\\x66\\x82\\xda\\x2f\\xea\\x42\\x04\\x89\\x36\\xd7\\x63\\x06\\x0c\\xd8\\xf5\\x39\\x65\\x26\\x16\\xdf\\xa8\\x08\\xd6\\x23\\xff\\x77\\x7b\\x41\\x13\\x65\\x2e\\x78\\x9e\\xc0\\x25\\xb8\\x5e\\x04\\xef\\xe8\\xad\\x4c\\x96\\x0b\\x19\\x0b\\xf4\\xa5\\xa6\\x32\\x4d\\x6f\\x57\\xc1\\xad\\x22\\x01\\x8c\\x83\\xcd\\x7e\\x7e\\x09\\x7f\\xc6\\x7b\\x80\\x26\\x9c\\x13\\xb4\\xdd\\x97\\x01\\xca\\x98\\xf9\\x87\\x69\\x58\\xba\\x76\\x89\\xc6\\xf6\\xf1\\x0a\\x73\\x2a\\x64\\xbe\\xf2\\x2e\\x8b\\x98\\xbd\\x30\\x4d\\x5d\\xbf\\x4f\\xb1\\xf9\\xe4\\xca\\x53\\x9a\\x5c\\x4a\\xa6\\x19\\xc4\\x4d\\x6f\\x58\\xf8\\x24\\xb2\\xdb\\xae\\x77\\xb7\\xe8\\x3b\\x56\\xdb\\x5e\\x5a\\xa7\\xb0\\xae\\x9c\\xe1\\xcd\\x10\\xa6\\x9f\\x04\\xa8\\x0f\\x13\\x79\\xeb\\x0c\\x47\\x4e\\x47\\x82\\xdf\\x0e\\x3b\\xa6\\xa1\\x48\\x22\\x6b\\xd1\\xa6\\x62\\xd9\\x5e\\xe2\\xd6\\x7c\\x52\\x07\\x33\\x3c\\xb1\\xd5\\x41\\x76\\xd9\\xe5\\x06\\x45\\x94\\x79\\x02\\x9f\\x31\\xdc\\xac\\xe2\\x69\\x93\\x8f\\x6b\\xc5\\x62\\x78\\x78\\x41\\xdc\\xfe\\x10\\x1f\\x4d\\xb6\\x0b\\xd6\\x60\\x16\\xe1\\xee\\xbb\\x6b\\xfb\\xd9\\xcd\\x83\\x04\\x2d\\xd1\\x37\\x9a\\x46\\x4f\\x40\\x5a\\xaa\\xe3\\xc1\\x18\\x07\\x84\\x8c\\xc4\\xf9\\x5c\\x3c\\xc6\\xfa\\x92\\xab\\x4e\\xa5\\x30\\x58\\x34\\xeb\\x86\\xb8\\x73\\xfa\\x30\\xed\\x1f\\x7f\\x47\\x0b\\xf6\\x63\\xf1\\xa7\\x0c\\xf9\\xe6\\x0a\\xb6\\x80\\xcd\\x1d\\xbb\\xd0\\x3a\\xc0\\x43\\x3b\\x3d\\x4b\\xb4\\x82\\xf8\\xb3\\x44\\xd4\\x6b\\x3a\\xa9\\x34\\xb8\\x63\\x3f\\x57\\x09\\x0b\\xea\\x5f\\xcc\\xca\\x64\\x88\\x79\\x98\\x35\\xf1\\x33\\xf8\\xbc\\xf6\\xe8\\x87\\xca\\x59\\xd1\\x90\\x76\\xd6\\xca\\x19\\xd4\\xe2\\x83\\x49\\x05\\x1e\\x01\\x6b\\x03\\xe9\\xa9\\x20\\xf4\\x12\\x0f\\xb5\\x23\\xd1\\x37\\x1d\\x0e\\x38\\x46\\x73\\x19\\x54\\x3f\\x12\\x7e\\xd9\\x14\\xb4\\x3a\\xd0\\x62\\x22\\x6a\\x53\\x65\\x82\\xdb\\x72\\x8c\\xcd\\x76\\xe9\\x83\\xf1\\x17\\x66\\xa8\\x86\\x3c\\x2f\\x42\\x4f\\x65\\x50\\x8d\\xcb\\x26\\xfe\\x0c\\x5a\\x80\\x0c\\x35\\x09\\x39\\x60\\xa1\\x21\\x97\\x6e\\x30\\x51\\xe2\\xef\\x1a\\x2a\\x99\\xc1\\x2f\\xb7\\xbd\\x8b\\xc0\\x37\\xa4\\x39\\x68\\x68\\x06\\xeb\\x72\\x01\\x7a\\x07\\x1a\\x91\\xb3\\xe3\\x9c\\x90\\xe8\\x6b\\xc3\\x35\\xf9\\xbb\\x54\\x3b\\x12\\x7c\\x98\\x86\\x73\\x8c\\xb5\\x38\\x06\\xb9\\xcb\\x3c\\x25\\x94\\xc7\\xef\\xfc\\x2a\\x59\\x20\\xaa\\x83\\x4b\\xe6\\x5c\\x49\\xf4\\x79\\x64\\xe8\\x9e\\xec\\x74\\x72\\x8d\\xe7\\x71\\xf3\\xd6\\x75\\xde\\x9d\\x1e\"},\n{{0x67,0x69,0xcc,0x8e,0x12,0x56,0x17,0xc2,0x2c,0xe5,0x72,0x37,0xa4,0xfc,0xa1,0x50,0x7f,0x94,0x12,0x34,0x66,0x1d,0xf7,0x43,0x28,0xd0,0x4a,0xb6,0x2e,0xf8,0x6c,0x47,},{0x05,0x11,0x2c,0xa6,0x0b,0xaf,0xf7,0x9b,0x49,0x16,0xc1,0xbe,0xe2,0xb9,0x39,0x0c,0x04,0x7a,0xf0,0x8c,0x35,0xeb,0xb3,0xc3,0x81,0xb9,0x74,0x8d,0x1d,0xd4,0xc4,0xfd,},{0xd3,0x9d,0x85,0x3d,0x2c,0x2c,0x5d,0x21,0xb5,0x87,0x1e,0xa5,0xa7,0x5c,0x04,0x10,0x48,0xd9,0x3a,0x47,0xdc,0x59,0x9a,0x5f,0xdd,0xc0,0x85,0x62,0x85,0xce,0x63,0x6f,0xcd,0xfd,0x85,0x64,0x08,0x3d,0x06,0xff,0x28,0x4a,0x52,0x4b,0xc6,0x33,0xcf,0xdf,0xc3,0xb0,0x37,0x16,0x3d,0x67,0x4c,0xb9,0xbb,0x5b,0xa3,0xbc,0x25,0xbe,0xd0,0x0e,},\"\\x68\\x54\\x89\\x73\\x9b\\x98\\x56\\x47\\x49\\x58\\x7f\\xf1\\xac\\x96\\xba\\x68\\x2d\\xa3\\x0b\\x40\\xa4\\xde\\x24\\xf5\\x4e\\xc8\\xb0\\x83\\xdd\\xa4\\x53\\x33\\x16\\x21\\x67\\xcb\\x3f\\x97\\xb2\\xc7\\x31\\x4c\\xe7\\xa3\\xf3\\xf3\\xd3\\x19\\xcc\\xc3\\x5b\\xb6\\xa9\\xf0\\x07\\x7d\\x56\\x31\\x61\\xe2\\x81\\x46\\x9c\\xf0\\x89\\x68\\xd9\\xdc\\xf7\\xae\\x5f\\xff\\x83\\x0a\\x5d\\xb0\\x0b\\xc3\\x80\\x10\\xe6\\x66\\x2d\\x49\\x4f\\x3c\\x86\\x47\\xc4\\xf7\\x0c\\xe2\\xd2\\x9a\\x9d\\xa8\\x46\\x10\\xa0\\x80\\xb5\\x75\\x9a\\x3b\\x58\\x20\\x52\\xdf\\xde\\x66\\xe4\\xa7\\xfa\\x5f\\xb2\\x7f\\x06\\x50\\x73\\xfe\\x72\\x3d\\x83\\x70\\x1d\\x5b\\xac\\x06\\xca\\x43\\xb4\\x6d\\x1e\\x58\\x09\\x76\\x70\\xc1\\x94\\xa1\\x3a\\xf8\\xb5\\x73\\xa3\\x79\\x1a\\x96\\x61\\x55\\x7c\\xbc\\x04\\x27\\x57\\xab\\x8a\\xdd\\x0e\\xf7\\xcf\\x4f\\x35\\x43\\x5a\\x42\\x12\\x35\\x3f\\xcb\\x3c\\x20\\x3c\\x73\\xdb\\xc9\\xd2\\x68\\x52\\xd0\\xe9\\x17\\x32\\xe3\\x62\\x1c\\xe8\\x28\\x92\\x9c\\xdc\\xa4\\xd9\\x19\\x20\\x48\\x75\\x19\\x22\\xed\\x22\\x5e\\xab\\x29\\x00\\xcf\\xf9\\x71\\xa2\\xa2\\xd3\\x42\\x46\\x36\\x48\\xbb\\xb1\\x94\\x43\\x19\\xa8\\xef\\x6d\\x43\\xdb\\x62\\x48\\x0f\\xbf\\x1d\\x72\\x57\\xd2\\x26\\x94\\x53\\x97\\x93\\xf2\\x5c\\x92\\x79\\x17\\xca\\xab\\x25\\xc1\\x19\\x3a\\x2d\\x2b\\x23\\xbb\\x5c\\xb8\\x56\\x9a\\xef\\xff\\x4f\\x0c\\xa4\\x23\\xd1\\x9b\\xbd\\x46\\xfc\\x5e\\xf7\\x52\\x4f\\xf8\\xcb\\x70\\x6f\\xfc\\x47\\x07\\x65\\x09\\xc0\\x5a\\x81\\x58\\xaf\\x77\\xf9\\x8d\\xf6\\xa9\\xb5\\xcb\\x32\\x44\\xab\\xa4\\xb5\\xc5\\xf9\\xce\\x59\\x7e\\x7d\\x29\\xba\\x07\\x01\\x3d\\xca\\xc1\\x91\\x1b\\x6d\\xe7\\x11\\x3c\\x73\\x6a\\x40\\x05\\xc4\\x59\\x99\\x29\\x79\\x01\\x9a\\x45\\xb2\\xdd\\x80\\x2a\\x07\\x66\\x09\\x09\\xeb\\x4c\\xe2\\x05\\x40\\x81\\x70\\xd8\\x25\\x45\\xda\\xcb\\xa8\\x68\\x6d\\xbd\\xe9\\x27\\xdb\\xc9\\xc7\\xd9\\x62\\x05\\x8e\\x9a\\x95\\xea\\x66\\xb8\\xdf\\xd3\\xea\\x43\\x53\\x57\\xa9\\x3c\\x73\\x94\\x8c\\xd3\\x55\\xf6\\xac\\x65\\x52\\x32\\x3f\\x17\\xc2\\xa6\\x78\\x66\\x2b\\xc0\\xe9\\x72\\x6a\\xd5\\xa5\\x25\\x1d\\xd2\\x76\\x47\\x40\\x4c\\xbf\\xe6\\x1c\\xea\\xaf\\xdc\\xfc\\x08\\xa4\\x75\\xff\\xd8\\x7c\\xb7\\xf5\\x97\\xe5\\x6a\\xc1\\x67\\x04\\x09\\xdd\\x94\\x08\\xae\\x47\\x70\\x42\\x0c\\x6e\\x5e\\x6d\\xd8\\xe7\\x48\\xfe\\x03\\xa7\\x2d\\xc1\\x28\\x03\\xd0\\x27\\x71\\xd9\\x2f\\x47\\xe6\\xe7\\x17\\xcc\\xc1\\x44\\xfc\\x03\\x72\\x75\\xb6\\xf7\\x45\\xdd\\x30\\xda\\x1a\\x45\\xd2\\x9d\\xb6\\xd9\\x07\\x3e\\xee\\x50\\x09\\xcf\\xd5\\x46\\x27\\x33\\x41\\x4a\\x49\\x5f\\x34\\x9d\\xb0\\xb6\\xdb\\xf2\\xce\\xa9\\xcc\\xd5\\x72\\x38\\xed\\x5e\\xe9\\x1a\\xd8\\xbc\\x86\\x17\\x9a\\xd5\\x69\\x5a\\x85\\xa5\\x04\\x84\\xe6\\x17\\x75\\x1d\\xe5\\xef\\x7a\\x7d\\x8a\\x8d\\xb9\\x50\\xa9\\x8a\\x6b\\x7f\\x7d\\xee\\x9d\\x42\\xa5\\xdf\\x69\\x2f\\xcc\\xf5\\x55\\xc9\\x40\\xdc\\x39\\xcf\\x2e\\xac\\x48\\xcb\\x9d\\x15\\xcd\\xa1\\x4d\\xd2\\xa7\\xec\\xc0\\xb7\\x6e\\xbe\\xc6\\x8a\\xd4\\x17\\x7d\\x11\\x17\\xe0\\x77\\x66\\xc4\\x85\\x90\\xd4\\x3c\\xa7\\x66\\x28\\x68\\xeb\\x97\\x90\\xac\\x29\\xf4\\xf2\\x39\\x2b\\x9a\\x93\\xf8\\x97\\x59\\xe7\\xba\\x54\\x6b\\x92\\x5b\\xd8\\x6f\\x80\\x7d\\x8d\\x16\\xc7\\xe6\\x37\\xdc\\xc6\\x66\\xe9\\x05\\x90\\xbf\\x43\\x0d\\x98\\x6a\\x67\\xf1\\xb0\\xc7\\xc2\\xc9\\x49\\x30\\x84\\x58\\x69\\xed\\x8d\\x8a\\xdd\\xe1\\x8f\\xc1\\x88\\x74\\x56\\x88\\x1b\\x4b\\x26\\xb5\\x3d\\xcb\\xa7\\xa5\\x26\\xf0\\xec\\xa1\\x4e\\x8b\\xb6\\x89\\xd6\\x6f\\x0a\\xa1\\xb2\\x53\\xc3\\xdc\\xfc\\xf5\\x95\\x40\\xd5\\xd2\\xf5\\xad\\x61\\x7f\\x52\\xc3\\x09\\x38\\xa5\\xa9\\x2e\\xa3\\x85\\x07\\x7d\\x75\\xaa\\x4a\\xc0\\x7a\\xfc\\x2b\\x35\\xfb\\x8c\\x1d\\x5e\\x78\\xeb\\x29\\x5f\\xc2\\x0f\\xe3\\x7c\\x41\\xac\\x06\\x95\\x9d\\x3a\\x17\\x97\\x84\\x3a\\xd7\\x05\\x6c\\x1b\\x41\\x2d\\xd0\\xb4\\x80\\xaa\\x3b\\x39\\xbc\\xc2\\x05\\x87\\xd9\\xa0\\xfe\\xf9\\x2c\\x6c\\x95\\x0e\\xbc\\x5b\\xb8\\xe1\\x42\"},\n{{0x1d,0xf7,0xac,0xfb,0x96,0x33,0x04,0xe5,0x1e,0xc4,0x71,0xca,0xf1,0x81,0x10,0x25,0x56,0x78,0x3c,0xb7,0xd9,0x1e,0xad,0x30,0xbd,0xc2,0x53,0x4d,0x07,0x8a,0x14,0x88,},{0x05,0xa3,0x1f,0xfc,0x70,0xe4,0xe3,0x56,0x9f,0xc2,0xbe,0x11,0x0c,0x64,0x3a,0xd5,0xf0,0x87,0x91,0x3c,0x7a,0xa4,0x76,0xdc,0xd8,0xd6,0xe4,0xbc,0x7e,0xc2,0x2d,0x24,},{0xb1,0x81,0x93,0x8d,0xe1,0x01,0x42,0xf3,0x24,0x07,0xb4,0xe7,0x86,0xcd,0xdd,0xe9,0x32,0xeb,0x11,0xdb,0xc0,0xbf,0x0e,0x5a,0xc5,0x09,0xfa,0xe7,0xa5,0xbc,0xc3,0x29,0x61,0xfe,0x34,0x48,0xf9,0x12,0xc8,0x50,0x0f,0xc6,0xdb,0x4e,0x1d,0x32,0x62,0xa8,0x3c,0x9d,0xbe,0x76,0x9b,0xb8,0xc3,0xa7,0x61,0x00,0x0f,0xe3,0x6c,0x0d,0x71,0x04,},\"\\xb0\\xc3\\xee\\xb5\\x7f\\x14\\x60\\x6a\\xb7\\xab\\xea\\xb2\\xee\\x05\\x73\\x84\\x3c\\xa2\\x2e\\x6d\\xb2\\xfd\\xf2\\xc9\\x06\\x4c\\xea\\x51\\x98\\xdc\\x58\\x30\\xeb\\x15\\x8d\\xa8\\xe2\\xda\\xa8\\x88\\x57\\xaf\\x8b\\x8e\\xef\\xcc\\xf0\\xc2\\x6c\\x3e\\xc0\\xf3\\x30\\xe9\\x2c\\xff\\x06\\xbc\\x05\\xa2\\x9b\\xfc\\x99\\xf9\\x40\\xb6\\x1f\\x3c\\xfb\\x29\\x64\\xb3\\x37\\x09\\x7a\\x65\\x50\\xa3\\xe9\\xa3\\x28\\xc8\\x5b\\xe6\\xf1\\x60\\xd2\\xc0\\xa5\\x7f\\xf6\\xf1\\xb3\\xc5\\xff\\xcc\\xa8\\x90\\x89\\x42\\x5a\\xb6\\xbe\\x01\\x72\\xe1\\x75\\xba\\xf4\\x0c\\xf1\\x2b\\x24\\xa8\\x15\\xf7\\x0f\\x29\\xa3\\xa4\\xcd\\x0a\\x6a\\x13\\x2f\\x12\\x00\\x97\\x75\\x2f\\x4b\\xc7\\x43\\xed\\xe0\\x8f\\x5f\\x21\\xd4\\x2f\\x28\\x2f\\x76\\x71\\xf7\\x78\\x3e\\x27\\xb2\\xa8\\xe2\\xc1\\x46\\x92\\xf1\\xe0\\xe5\\xde\\x82\\x85\\x5d\\xab\\xf9\\x8a\\x1a\\x63\\x97\\x60\\x06\\xff\\xbf\\xe5\\xf5\\xa5\\x79\\xb4\\x60\\xe2\\x6d\\x06\\xbd\\x54\\x28\\x42\\xa5\\xf9\\x26\\x1b\\xbf\\x26\\x04\\x51\\xd2\\x32\\x1c\\x50\\x89\\x32\\x01\\x3c\\xc6\\xe9\\x04\\xf7\\x9b\\x5e\\x46\\x86\\xd0\\x33\\xe1\\x2c\\x7b\\xbd\\x7e\\xb1\\xc9\\x23\\x79\\xc5\\xec\\x34\\x1b\\xf6\\x45\\x7a\\x3f\\x17\\x26\\x4a\\x7c\\x27\\x8b\\x27\\x50\\x1e\\xca\\xed\\xc3\\x61\\xeb\\xa8\\x44\\x44\\x23\\x42\\xb4\\xb1\\x0f\\xa9\\x4d\\x26\\x58\\x65\\x11\\x6a\\xcf\\x43\\xfc\\xbe\\xc9\\x65\\xd2\\xab\\x4b\\xbb\\xe6\\x14\\xc4\\xf9\\x0a\\xb6\\xb3\\xe0\\xd5\\x38\\x3f\\xa0\\x49\\x88\\xbf\\xbb\\x26\\x03\\x07\\xdd\\xe2\\x2d\\x84\\x09\\x8b\\x63\\x31\\xd1\\x55\\x14\\x1a\\x92\\x7b\\xb7\\x8d\\x66\\x4b\\x34\\x1d\\x2f\\x2a\\x93\\xe2\\x91\\xcf\\x79\\xba\\xae\\xcd\\x26\\x12\\xf6\\xb1\\x04\\xf3\\xfc\\x81\\x37\\x3a\\x7c\\x6a\\x04\\x5b\\x59\\x24\\xbf\\x95\\x0c\\xd5\\x42\\xf7\\xb7\\xac\\xce\\xf3\\xaa\\x7d\\x72\\x5d\\xe0\\x53\\x05\\x5d\\x95\\x1b\\xd7\\x68\\x11\\x13\\x92\\x59\\x66\\x38\\xae\\x09\\x71\\x70\\xf4\\x49\\x2b\\xa5\\x0a\\x46\\x8f\\x8e\\x34\\x77\\x63\\xdb\\x61\\x2d\\x3c\\x7d\\xe7\\xe5\\x64\\x59\\xb2\\x6e\\xe0\\x29\\xc6\\x30\\x82\\x7a\\x35\\x3a\\xee\\x73\\xde\\x68\\xd6\\xd7\\x2b\\x27\\xaf\\xd7\\x5d\\x22\\x16\\x45\\x27\\x94\\x5c\\x72\\x26\\x84\\x4f\\xab\\x15\\xb8\\xdc\\xc9\\x14\\x34\\x9e\\x31\\x41\\xc6\\x13\\x16\\xad\\xc8\\x94\\xde\\xdc\\xdc\\x84\\x39\\x84\\xd9\\xc7\\xfe\\xae\\x39\\xdb\\x33\\x2d\\xc3\\x93\\xe9\\xe8\\x96\\x1b\\xbd\\xe0\\x71\\xc3\\xd2\\x85\\x8b\\x3c\\xb5\\xf3\\x3b\\x16\\x4a\\x15\\x61\\x6c\\x6f\\xe1\\xbb\\xc2\\x4a\\x35\\xf2\\x13\\x36\\xd2\\x61\\xc5\\xd8\\xcf\\x75\\x9e\\x27\\xe2\\x2c\\x91\\x01\\xc4\\xae\\xbd\\xe3\\xe1\\x26\\xcf\\x64\\x6c\\xa7\\xb2\\xe0\\x31\\x28\\x09\\x5c\\x59\\x76\\xbf\\x3f\\x6e\\x49\\x1a\\xf0\\xf0\\xb6\\x40\\xc7\\x31\\x09\\x66\\xac\\x59\\xc5\\x9f\\xbc\\x5b\\xfe\\x05\\x48\\xf8\\x8e\\xe6\\x1a\\xd9\\xec\\x40\\xc1\\xc0\\x6d\\xd2\\x9d\\x79\\x4c\\x44\\xa3\\xea\\x22\\xc3\\xd4\\x76\\x26\\x22\\xec\\x1e\\x8b\\x33\\x3e\\x45\\x07\\x4d\\xb9\\x37\\x41\\xfd\\xa1\\x93\\xc9\\x11\\xf6\\xdb\\x58\\x79\\xe5\\x5e\\xe3\\x6e\\xf6\\x02\\x61\\x4a\\xe6\\x4a\\x5c\\xde\\x9d\\x83\\x06\\xd2\\x2f\\xbc\\x4a\\xe9\\xc8\\x81\\xa5\\x94\\xbd\\xe6\\x79\\x61\\x25\\xfc\\xb6\\x28\\xb9\\xf3\\xb6\\xfb\\x3f\\xfd\\x51\\x1b\\x35\\x3f\\x14\\x6a\\x27\\x27\\x2a\\xfd\\x3e\\x5d\\x28\\xb7\\x7f\\x58\\xa6\\x7f\\x1f\\xd2\\x72\\x85\\xc2\\x5e\\xcc\\x1c\\xcf\\x64\\xe3\\x8d\\x21\\xf3\\xb9\\xff\\x22\\xe0\\x0e\\xe9\\x00\\x62\\x9e\\xf1\\xa6\\x3e\\x71\\x3f\\x25\\x88\\x83\\xdd\\x91\\x1f\\x30\\xc0\\xd3\\x98\\xb7\\x4b\\xd7\\x97\\x14\\x9b\\xe5\\xe2\\x69\\x67\\x22\\xda\\x09\\xd5\\x2d\\x4e\\xbf\\x3c\\x67\\x39\\x29\\xd2\\x98\\xaa\\xc3\\x4c\\xe0\\x5b\\xea\\x08\\xea\\x9a\\x42\\x4e\\x93\\x45\\x9c\\x2e\\xb8\\xfc\\x22\\x22\\xc3\\x1c\\xc1\\x3d\\x80\\x3b\\x90\\xa8\\xa7\\x0b\\xcd\\x0a\\x30\\xc2\\x09\\x21\\x1d\\xc2\\xcc\\xc8\\x5b\\x0b\\xcd\\x45\\x82\\xc6\\x95\\xf5\\x8d\\x80\\xbf\\x6e\\xc4\\x71\\xa2\\x50\\x5f\\x68\\x84\\x7a\\x75\\xf6\\xe9\\x11\\xfd\\x87\"},\n{{0x7e,0xd8,0x7c,0x36,0xdf,0xdb,0xae,0x60,0xc9,0x40,0xa3,0xb3,0x25,0xc1,0x9f,0xde,0xd8,0x14,0xd7,0x6a,0x54,0x48,0x20,0xa3,0x2f,0x28,0x6a,0x5c,0x0a,0xd7,0x1d,0x72,},{0x3c,0x4a,0xc5,0x10,0xb3,0x62,0x22,0xc2,0x52,0xa2,0xdc,0x1a,0xfc,0xb4,0x0f,0xb0,0xeb,0x85,0xbc,0xa9,0x03,0x91,0x19,0x6a,0x58,0x83,0xaa,0x2c,0xc9,0x12,0xb2,0xdf,},{0x57,0x9b,0x38,0x12,0x4b,0xd0,0x59,0x1a,0x59,0x7c,0xc9,0xa3,0x89,0x12,0x7c,0xea,0xf5,0x51,0x56,0x07,0x73,0x63,0xed,0xb8,0x11,0xd0,0xb6,0x55,0x52,0xac,0xfc,0xc6,0x77,0xb2,0x72,0x94,0x21,0x99,0xca,0x25,0xab,0x79,0x0d,0xe6,0xe0,0x84,0x60,0x3a,0xd1,0x05,0x2e,0xc2,0x10,0xcf,0x6f,0xcb,0x14,0x17,0x28,0x90,0x67,0xce,0x3c,0x08,},\"\\x62\\xd3\\x13\\x91\\x2a\\xbb\\xb0\\x06\\xb7\\x77\\x4a\\x67\\x37\\x71\\x4a\\x34\\x99\\x70\\xce\\x04\\x21\\x11\\x2f\\x40\\x04\\x63\\xd3\\xdb\\x0e\\x2f\\x7f\\x12\\x8d\\x7b\\x96\\x93\\x9f\\x43\\xc1\\xe7\\x10\\x7b\\x51\\x18\\xa7\\x7c\\x11\\x96\\x83\\xd8\\x66\\xb7\\xe3\\xd7\\x2a\\xc2\\x1f\\x6b\\x42\\x72\\xb4\\xbe\\x92\\x89\\xb6\\x55\\x6f\\xe3\\x1b\\x60\\x51\\xa0\\xb4\\x2e\\xd5\\xea\\x0c\\xf3\\x47\\x69\\x6d\\x30\\xfb\\x8b\\xff\\x6b\\x8b\\x57\\x27\\x19\\xde\\x19\\xa2\\x31\\xcc\\x85\\x45\\x9a\\x99\\x0c\\x37\\x80\\x1f\\x08\\x37\\x18\\x6c\\xef\\xbb\\x55\\x21\\x56\\x96\\x66\\x96\\x7c\\xd4\\x24\\x3d\\x73\\x07\\xf1\\xb0\\xb2\\x4c\\x8e\\x2b\\x9b\\x69\\x23\\x17\\x30\\x4f\\xbe\\x3d\\xd0\\xa2\\x63\\x65\\x01\\x91\\xb3\\x52\\x16\\xf5\\x29\\x16\\x57\\x3a\\xf9\\x05\\x24\\xf9\\x1d\\xb1\\xa9\\x24\\x71\\xd7\\x58\\xc9\\x2d\\xc6\\xd1\\x4d\\x1a\\x4b\\x26\\xf4\\x1b\\x40\\x40\\x3c\\xa8\\x7d\\xcf\\xab\\xdc\\xa4\\x7b\\x9f\\xc2\\x53\\x35\\x78\\xf1\\x61\\xf3\\xb0\\x19\\x9b\\x5c\\x69\\x8e\\x08\\x07\\x04\\xb2\\x1c\\x9e\\x61\\x52\\x69\\xfc\\xd0\\xd4\\x04\\x39\\xed\\x8b\\xc3\\xbd\\xfb\\xc9\\xaf\\xb4\\x4c\\x11\\xfa\\x89\\x27\\x5f\\x0e\\xaa\\xa5\\xd0\\x8f\\xa9\\x59\\xd6\\x37\\x8d\\x0d\\xb8\\x99\\x10\\xd4\\x8f\\x2d\\x86\\xa1\\xeb\\xfc\\x5c\\xbf\\x10\\xeb\\x2d\\x5a\\xad\\xf5\\x1b\\xbd\\x83\\x44\\xff\\x8b\\xbb\\x5b\\x8a\\xfe\\x05\\xa4\\x50\\x11\\xb5\\xe4\\xb7\\x2e\\xb8\\x64\\xad\\x26\\x3e\\x8a\\x03\\xa6\\xc7\\xf9\\x8a\\xee\\xb3\\x54\\xf7\\x30\\xa3\\x18\\xaa\\x30\\xfb\\x56\\xd3\\x3d\\x80\\x74\\x8c\\x98\\xeb\\xec\\x15\\x87\\x8c\\xcf\\x3c\\xe8\\x22\\xf6\\x9d\\x34\\x56\\x84\\x3c\\x40\\x0d\\xc5\\x6b\\x48\\x1a\\x95\\xe6\\x88\\xb8\\xa4\\x73\\x5b\\xf3\\x84\\x3f\\x58\\x33\\xdd\\xa0\\xef\\xe0\\x9e\\x71\\x75\\xb5\\x67\\xc6\\x61\\x38\\x7a\\xfd\\x2e\\xbc\\x07\\x9a\\x48\\xe3\\x49\\x67\\xec\\x97\\xb9\\x27\\xdf\\xa5\\x81\\x88\\x8f\\x23\\x1a\\x98\\xa7\\xed\\x33\\x10\\x3b\\xfa\\x8e\\x8f\\x9b\\xa6\\x51\\x35\\x27\\x90\\x0b\\x39\\xb8\\x62\\x31\\xda\\x79\\x11\\xa2\\xfc\\x93\\x58\\x88\\xa7\\x5f\\x11\\x29\\x58\\x4a\\xff\\xf2\\x02\\x52\\x49\\xc4\\x18\\x8f\\x09\\x05\\x2f\\x85\\x68\\x77\\x06\\xd0\\x5e\\x29\\x91\\x44\\xd4\\x0d\\xe8\\x89\\x8b\\x7c\\x8b\\x2d\\xfe\\xf0\\xc3\\x70\\x85\\x73\\xd8\\xb0\\x56\\x3a\\x6b\\xd0\\xa5\\x04\\xc0\\xb6\\x74\\x57\\x02\\xb1\\xb5\\x71\\x21\\xc6\\xf0\\x40\\xaf\\xf2\\x71\\x98\\x94\\x8b\\xa6\\x9c\\x21\\x25\\x3a\\x28\\xd3\\x9e\\xba\\x72\\x62\\x19\\xbe\\xda\\x1f\\x82\\x09\\xfb\\x83\\xe9\\xad\\xb0\\x7a\\xd4\\x09\\xfb\\xd6\\xd2\\x55\\x65\\x88\\x9a\\xb4\\x51\\x23\\xf9\\xd9\\x45\\xec\\xd7\\xd9\\xca\\x70\\x28\\xec\\xe0\\x92\\xe3\\x5f\\xbb\\x7c\\xb3\\xf3\\x28\\x12\\x6e\\xfd\\xda\\xc5\\xd8\\x59\\xf2\\xb2\\xc6\\xeb\\x09\\x01\\x33\\x69\\x0e\\x20\\xc1\\x7d\\xea\\xf3\\x88\\x26\\x85\\xf0\\x7e\\x9e\\xd2\\x65\\x3b\\x80\\x3b\\x9b\\x38\\x3b\\x70\\x74\\x8a\\x1f\\xa9\\x2c\\x86\\xf8\\x6d\\x6c\\x47\\xea\\x87\\xb1\\x0b\\x12\\xe3\\x63\\xba\\x50\\x80\\x60\\xf4\\x7c\\xe2\\xa2\\xf3\\xb6\\xa3\\xee\\xfc\\xd4\\xda\\xcf\\xc7\\x1c\\x41\\xf4\\x36\\xfe\\x0c\\x2b\\xc3\\x4d\\x4b\\xaa\\xd4\\x95\\x74\\xe7\\x44\\x3c\\x12\\x6a\\x58\\x9f\\x6e\\xf7\\xbc\\xa4\\x49\\x54\\xf0\\xbb\\x28\\xec\\x71\\x51\\xb0\\x51\\x1c\\x23\\xc6\\xbc\\x42\\xd5\\xe8\\x59\\x83\\xec\\x16\\xbb\\x5f\\x50\\xa3\\x82\\xd6\\x88\\x15\\x0a\\x49\\x60\\x9c\\xbd\\xe5\\x69\\x8e\\x86\\xdc\\xbf\\x02\\x12\\xc2\\x29\\x22\\x99\\xdc\\x4d\\xcf\\x87\\x42\\x9f\\x6c\\xd2\\xee\\xc8\\x09\\x48\\xce\\x86\\x7e\\x25\\xc9\\x45\\x84\\xcd\\xc6\\x4b\\x09\\x90\\x29\\xeb\\x85\\x4e\\xdc\\x26\\xea\\x21\\x42\\x1e\\xff\\x48\\xcf\\x4e\\x41\\xf4\\x9e\\x2d\\x89\\x47\\x8d\\xef\\x06\\xc4\\x2b\\xea\\x22\\x0a\\x13\\x3e\\x50\\xf5\\xc7\\x44\\x64\\xc7\\xe7\\x3f\\xb1\\xc1\\xa7\\x7c\\x50\\x7c\\xf6\\xcd\\xa8\\x5b\\xe4\\x02\\xb7\\xe6\\xd6\\xd2\\x1e\\x81\\x0d\\x6d\\x0b\\x59\\x72\\xb9\\xfe\\x77\\xe5\\x4e\\x74\\xae\\xe1\\xf3\\xbb\\xfd\\x6e\\x7d\\xe6\\xb5\\xc0\"},\n{{0x6a,0x29,0xf8,0x1b,0x8d,0x9a,0xa4,0x8a,0x1b,0x23,0x36,0x4e,0xac,0x8f,0x6a,0x4b,0xdd,0x60,0x7a,0x84,0xcf,0xe8,0xe8,0x8d,0x90,0x17,0x5d,0x80,0x64,0x3a,0x58,0xa8,},{0x4c,0x3b,0xe3,0xa2,0xa8,0x42,0x5f,0xf3,0x1c,0x3a,0x0d,0xb4,0xa5,0x2a,0x0c,0xb1,0x41,0x6c,0xeb,0x48,0xcc,0x3e,0x4c,0x28,0xa4,0xf2,0x28,0x4a,0xb3,0x46,0x07,0x15,},{0xdf,0x09,0xcb,0x9b,0x87,0x8d,0x3d,0xc9,0xe5,0x42,0xdb,0xac,0x28,0x94,0x3e,0x28,0xe4,0x1d,0xce,0xcb,0x92,0xcb,0x7e,0xa4,0x40,0x09,0x88,0x5e,0x46,0x49,0x97,0x43,0x33,0x05,0x61,0xba,0x1d,0x36,0xae,0xdd,0x46,0x76,0x75,0xfd,0xca,0x2b,0xaa,0xa4,0x70,0x1b,0x6f,0xad,0x97,0x9f,0xd8,0x39,0xc4,0x70,0xd1,0x3c,0x82,0xda,0xa9,0x05,},\"\\x78\\x76\\xa3\\xf4\\xeb\\x69\\xbb\\x7e\\x54\\xe9\\xff\\x95\\x4e\\xbd\\x3b\\x10\\xb9\\x3a\\x4c\\x1a\\xfe\\xae\\x92\\xfa\\x03\\xc1\\x03\\xcb\\x63\\x13\\xa2\\x01\\xc5\\xb3\\x3a\\x9a\\x72\\x23\\x75\\x5c\\xb5\\x10\\xe2\\x5e\\xc5\\x82\\xb5\\x4e\\x81\\xb8\\x49\\x56\\xf6\\xc5\\x3f\\x1f\\x08\\xa6\\x3b\\xf0\\xc4\\xa2\\x61\\xaf\\x45\\x0e\\x52\\x3f\\xe8\\xf6\\x1d\\xdb\\x3c\\x0e\\xea\\xb8\\x75\\x10\\x72\\x68\\x88\\x01\\xb2\\xa4\\x73\\xb7\\x1a\\x2e\\x38\\x70\\x8d\\xa6\\x8c\\x2f\\x37\\x92\\x5c\\xb0\\x5a\\x20\\xc4\\x28\\x3b\\x3a\\xf9\\x7b\\x6f\\x0b\\xa6\\x5a\\x54\\x03\\x55\\x43\\x75\\xe2\\x15\\xd9\\xe3\\xaa\\x1b\\x0f\\x9f\\xdb\\x0f\\x84\\x99\\x23\\xed\\xbd\\xaa\\x0a\\xb4\\x81\\xc5\\x45\\xa5\\xdf\\x8f\\x51\\xd1\\xf6\\x8b\\x22\\x35\\x07\\xea\\x0e\\xcc\\xfa\\xeb\\xb5\\xfc\\xcf\\x5e\\x3d\\xfa\\x65\\xa4\\x4e\\xea\\x50\\x45\\x68\\xa8\\x81\\x80\\xa0\\x60\\xbb\\x06\\xc5\\x15\\x57\\xb8\\x1e\\x66\\x7b\\x4b\\x04\\xe3\\x21\\x0f\\xa4\\xc3\\x79\\x87\\x6c\\x49\\xf3\\xe5\\x6b\\xf2\\xbe\\x1c\\xf5\\x19\\xa7\\x41\\x83\\x93\\xd2\\x40\\xdc\\x8a\\x22\\x4c\\x6c\\x38\\xac\\x2a\\xb9\\xd8\\xfa\\xdf\\xc5\\x36\\x20\\x30\\xc7\\x93\\x0c\\x3c\\xe7\\x79\\x5b\\x14\\x7c\\x26\\xc8\\xa2\\x8c\\x65\\x34\\x29\\xd9\\x0a\\x17\\x3a\\x86\\xa8\\xb1\\x8a\\x00\\x9e\\x62\\xae\\xf6\\xec\\xa9\\x5d\\x39\\xbd\\xbe\\x45\\x64\\x77\\x78\\xa2\\x53\\x2a\\x41\\x5a\\xe1\\x9b\\xad\\x23\\x11\\x29\\x12\\x78\\x42\\xfe\\x1d\\x0f\\x11\\xfa\\xb4\\xa1\\xcf\\x0b\\x17\\xe4\\x98\\xcd\\x59\\x52\\xc9\\x39\\xe0\\x90\\x09\\x02\\x87\\xb1\\x44\\x89\\x5d\\xff\\x00\\xce\\xc8\\xd6\\xae\\xda\\xf6\\x24\\x81\\xa4\\x17\\x83\\xe0\\x21\\x08\\x2c\\xe3\\x52\\x06\\x3e\\x62\\x81\\x1f\\xd9\\x99\\x90\\x10\\x4d\\x8a\\x46\\xcd\\xca\\xee\\x2b\\xab\\x45\\x8e\\x52\\x47\\xfb\\x02\\x3e\\x92\\x33\\x30\\xa4\\x28\\xc7\\xbc\\xfd\\x20\\xb0\\x8f\\x52\\x0e\\x89\\x46\\xdd\\x65\\x83\\x47\\x35\\x2a\\xe0\\xc4\\xbe\\x73\\xc3\\xd5\\xec\\xcd\\x11\\x14\\x9f\\x3a\\xb7\\xb8\\x05\\x2c\\xfd\\x95\\xc3\\x5d\\x41\\x64\\x54\\x6f\\x5d\\x8f\\x37\\x75\\x17\\xa7\\xf4\\x32\\xc0\\xd5\\x56\\x3a\\x7b\\xcc\\x7b\\xd1\\x19\\xd3\\x42\\x1d\\xfe\\xba\\xae\\x84\\x45\\x99\\xb2\\x9b\\x38\\x3b\\xb8\\xd5\\xdb\\xf1\\x40\\xd9\\xbd\\x47\\xa0\\x78\\xb7\\xae\\x7c\\x6a\\xa8\\x7b\\x1e\\x29\\x23\\x6c\\x9f\\xcf\\xd6\\x54\\xb7\\xf8\\x09\\x79\\x4c\\xcc\\xb2\\x61\\x58\\x8e\\x18\\xde\\xc6\\xc4\\x04\\x6a\\x93\\x40\\x67\\xd0\\xdf\\xa0\\x37\\x91\\xd0\\x3d\\x83\\xb7\\x18\\xac\\x4d\\x24\\xdc\\xe7\\x85\\xa3\\x02\\x8d\\xe0\\xc9\\x59\\x2d\\xba\\x7c\\x5c\\x58\\x45\\x18\\x4a\\xfc\\x9c\\x0d\\xfc\\xf9\\x40\\x95\\x86\\x0f\\x0e\\xb8\\x02\\xeb\\xea\\x20\\x17\\x8e\\x78\\xb5\\x64\\x2e\\x5d\\xd6\\x1c\\x33\\xb3\\x97\\x69\\x05\\x2d\\x9d\\x85\\x4d\\xce\\x90\\x2f\\x47\\x6e\\x21\\xf9\\x6c\\x65\\x0b\\x46\\x3b\\x7b\\xc3\\xd0\\xff\\x29\\x96\\xb6\\x5c\\x57\\x83\\x1f\\x8b\\x7c\\x0f\\xb9\\x15\\xf4\\xdd\\x72\\x26\\xac\\x95\\x5c\\xbc\\x7d\\xfb\\x03\\xf9\\xb7\\x58\\xdd\\x3e\\x0d\\xfc\\xe2\\xe0\\xe5\\x80\\xc9\\x1a\\x30\\xc7\\x83\\xff\\x56\\x7b\\x17\\xf1\\x2d\\xfd\\x5d\\x31\\x37\\x64\\x6e\\x20\\x01\\x1c\\xdc\\xaa\\xe1\\x11\\x02\\xdc\\x71\\x68\\x86\\xcb\\xf1\\x23\\xc0\\x94\\x88\\xb1\\x73\\x63\\x6a\\xbd\\x54\\xe9\\x62\\xca\\xee\\xc9\\x7d\\x5e\\xb9\\x40\\x68\\x2e\\x70\\x3b\\x73\\x0f\\x61\\x56\\x2c\\xd1\\x4b\\x9e\\x65\\x61\\xb5\\xe9\\x3f\\x60\\xcd\\x0e\\x1e\\x86\\xd1\\xa1\\xb4\\x71\\x9c\\x5b\\x50\\x82\\x42\\xbd\\x6b\\x2d\\x9a\\x54\\x8f\\x59\\xbb\\xb8\\x75\\x07\\x59\\x69\\xef\\x20\\x32\\xf3\\x19\\x6b\\x8a\\xec\\xcc\\x45\\xa4\\x4d\\x9d\\xbd\\xaf\\x87\\x8e\\xd1\\x6f\\x1d\\x85\\x5e\\x89\\x18\\xed\\x65\\xa4\\x5e\\xe5\\xc7\\xfa\\x32\\xa1\\xec\\x69\\x32\\xa1\\x59\\xcf\\xb5\\x0f\\xfc\\x87\\xbe\\x06\\xdf\\xcf\\x72\\x28\\xae\\x88\\x70\\xcc\\xd3\\x57\\xfc\\x65\\x6e\\x33\\xfa\\x4b\\x6b\\x8b\\x7d\\x1a\\x72\\x15\\x55\\x3c\\xab\\xac\\xc7\\x0a\\x39\\xc9\\x80\\xb9\\x71\\xe5\\x1a\\x17\\xed\\x63\\x18\\xb4\\x3b\\x29\\xbb\"},\n{{0xef,0x12,0xdf,0x47,0x9d,0x98,0x3a,0xd9,0x6e,0x8b,0xa6,0x53,0x30,0xb3,0x6d,0x49,0xaa,0xdb,0x98,0x31,0x64,0xe1,0xc0,0xb4,0x52,0xb5,0x60,0xde,0xd1,0xd0,0x8d,0x60,},{0xf7,0x61,0xcf,0x28,0x26,0x92,0x7a,0x7c,0xda,0x8c,0xb0,0x4f,0xaa,0x2c,0x59,0xf8,0x42,0x5a,0x8f,0x7d,0x39,0x8f,0x76,0xe8,0x67,0x02,0x1c,0x95,0x1f,0x07,0x38,0x09,},{0x4c,0x80,0x10,0x86,0x6d,0x91,0x15,0xf0,0x52,0x93,0xb9,0x34,0xca,0xc6,0x81,0x04,0xcc,0x2c,0x34,0x37,0x56,0x8c,0xb9,0xd5,0xc5,0x70,0xb1,0xa8,0xbe,0xe7,0x06,0x60,0x30,0x75,0x53,0x70,0x33,0xbd,0x70,0x8a,0x9c,0x9f,0x3d,0x1e,0x25,0x19,0xa9,0x15,0xb1,0xc4,0xae,0x4c,0xcd,0xdf,0xcf,0x0e,0xd0,0xc0,0x49,0xd3,0x42,0xa0,0x2e,0x02,},\"\\xe5\\x8f\\x34\\xda\\xea\\x75\\x5a\\xc4\\xe4\\x13\\x33\\xd6\\xf0\\xed\\x01\\x35\\xf7\\xdb\\xce\\x50\\x30\\x9b\\xb1\\x95\\x6b\\xc7\\x1a\\xcb\\x12\\xc7\\x70\\x67\\xa6\\x47\\xff\\xd8\\x6a\\xa5\\x87\\x0c\\x0c\\x00\\x07\\xe8\\xf9\\x95\\xa2\\x2b\\x88\\xc4\\x67\\xde\\x22\\x54\\x44\\x54\\x42\\x01\\xc5\\x57\\x49\\x5e\\x25\\x3e\\x33\\x19\\xcc\\x5c\\xa3\\x76\\xd3\\xe7\\xcc\\x1e\\xb4\\x67\\x34\\x6e\\x52\\xad\\x95\\x6a\\x6f\\xa7\\x33\\x72\\x0b\\x17\\x11\\x7b\\x5b\\x75\\x85\\xe4\\xd5\\x59\\x40\\x9a\\xae\\xfa\\x95\\x58\\x0f\\x91\\xe5\\x02\\x01\\x5f\\x49\\x7c\\x5c\\xdc\\xb7\\xd4\\xd5\\x61\\xf5\\x44\\xef\\xa3\\x5c\\x1e\\x2a\\x53\\xb7\\x2b\\xdd\\xec\\xee\\xc2\\xd1\\x05\\x0f\\x17\\x7d\\x48\\x0f\\x68\\x74\\x05\\x66\\x4d\\xfd\\xde\\xc0\\x6e\\xee\\x4b\\xd1\\x47\\xa9\\x12\\xfd\\xbf\\x74\\xf2\\xa9\\x5d\\x1f\\xd1\\xe1\\x12\\x68\\x69\\x4c\\xe4\\xd4\\xec\\x4f\\xff\\xd6\\xdd\\xb3\\x25\\x4d\\x36\\x0f\\x23\\x6f\\xab\\x4d\\x1a\\x17\\xf8\\xd0\\xd1\\xa5\\x11\\xf9\\x44\\x69\\x2f\\x23\\x96\\x39\\xae\\x03\\xd6\\x4f\\xac\\xec\\x65\\x38\\x42\\x7a\\xb7\\x1f\\x71\\x27\\xf4\\xa2\\x76\\xf9\\xbc\\x45\\xbb\\xa6\\x11\\xdf\\xcc\\xe6\\x44\\x6c\\xc1\\x39\\x68\\x97\\x6c\\x8b\\xb6\\xd6\\xfe\\x21\\x06\\xd7\\x05\\x92\\x2d\\xca\\xc9\\x56\\x96\\x6a\\x76\\xd4\\x8f\\x2a\\xff\\x4b\\x86\\x51\\x4e\\x39\\xa6\\x7e\\x16\\x43\\xfc\\xc3\\x21\\x85\\x80\\x24\\xe6\\x93\\x18\\x98\\x33\\xc8\\xad\\x59\\xb4\\xb6\\x25\\x29\\x8e\\xba\\xfe\\x64\\x62\\x6b\\x48\\x0f\\x32\\x6f\\x13\\x40\\x72\\x3c\\xb3\\xd3\\x83\\xf4\\xfc\\xcb\\xfc\\x23\\x7a\\x3f\\x4c\\x4f\\x7e\\xcf\\x0b\\xa4\\x36\\xb3\\x2c\\x2f\\xe3\\x51\\x79\\xda\\x93\\x11\\x1b\\x48\\xcc\\x9e\\xa2\\x42\\x02\\xbd\\xc1\\xb2\\xfb\\x60\\xa4\\x31\\x9d\\xfd\\x98\\x64\\x47\\x0f\\x73\\xf5\\x41\\x37\\x20\\x6e\\x0b\\xf0\\x07\\xf5\\xae\\x88\\xa8\\x87\\x47\\x00\\x8a\\x60\\xf4\\x78\\x9a\\xd1\\x67\\x72\\x4f\\x17\\x9c\\x02\\xb6\\x3a\\xed\\x00\\x25\\x73\\xd2\\x8a\\x6b\\xcf\\x88\\xe0\\x7c\\xe8\\xda\\xea\\x5d\\x5f\\x1a\\xcf\\x48\\x7b\\x4c\\x5c\\x16\\xc2\\xbf\\xe1\\x12\\x31\\xea\\x5e\\xa7\\x63\\xe8\\xf3\\x32\\xcc\\x73\\xda\\x1b\\x2f\\x8c\\x19\\x8e\\xa8\\x17\\x3f\\xd3\\x3d\\x4b\\x2a\\xe6\\x9e\\x5d\\x4d\\x1a\\xad\\xdd\\xf2\\xfd\\x82\\x1b\\x85\\xbe\\x45\\x15\\x19\\x62\\xd1\\xf9\\x9d\\xf8\\x13\\x08\\x61\\x88\\x52\\xad\\x7c\\xf4\\x1d\\x72\\xda\\x08\\xa1\\xb3\\x9d\\xf7\\xd8\\xb9\\x94\\xb4\\xdd\\xff\\x37\\xf9\\xdf\\xe8\\xf3\\x8c\\xe3\\x0e\\x91\\x06\\x1d\\x95\\xd5\\x8f\\x7a\\xe8\\x26\\xb0\\x23\\x85\\x27\\x2e\\xc0\\x9f\\x01\\xa7\\xb3\\xe4\\xb3\\x91\\xd0\\x9b\\xce\\xd6\\x65\\xda\\xd6\\x95\\x05\\xb4\\x19\\xda\\x84\\x81\\xbc\\x37\\x92\\xbf\\x8b\\x8e\\x7a\\xd6\\x4b\\x63\\xf2\\x45\\x66\\x6c\\x8c\\x32\\xfd\\x5c\\x1b\\x1b\\x48\\xc9\\x95\\x1e\\x1c\\x21\\xa1\\xeb\\x5f\\x50\\x7c\\xff\\x13\\x7c\\xfb\\x86\\x2c\\x2c\\xc9\\x87\\x66\\xe8\\x78\\xc9\\x30\\xa0\\x83\\x82\\x8c\\x9d\\x8d\\xb1\\x8b\\xf1\\x67\\x16\\x68\\x5f\\x39\\xd6\\x57\\x2a\\x8c\\xa8\\xb2\\xa5\\x14\\xf7\\x70\\x03\\xd4\\xe7\\x5b\\xc1\\x54\\xae\\xbf\\x14\\x10\\x37\\x78\\xf3\\x65\\xb1\\xc3\\xf0\\x35\\x41\\xdd\\xbd\\x07\\xd6\\xe2\\x3e\\x56\\x76\\x2d\\x97\\x1e\\xb0\\x29\\x83\\xe9\\x3c\\x4e\\x01\\xba\\x4b\\x8a\\x21\\x78\\x92\\x8c\\x43\\x37\\xd3\\x02\\xf3\\x1c\\x9c\\xcb\\x75\\xb2\\x49\\xa8\\x2d\\xc9\\x68\\x21\\xe9\\x5a\\x03\\xab\\x6b\\x77\\x0d\\xf2\\xc3\\xdf\\xdb\\xf1\\xfe\\x97\\x73\\xf8\\xbc\\x1b\\xc5\\xb3\\xaf\\xa0\\x44\\x0b\\x10\\x25\\x78\\xf3\\xd2\\x13\\xc8\\xd0\\x19\\xcf\\xf1\\x24\\xf7\\x5c\\xe4\\xac\\xcc\\x8c\\x66\\x7f\\xeb\\x27\\xc7\\x51\\xa6\\x12\\x00\\x74\\x81\\x31\\x04\\xe0\\xcd\\x07\\x0c\\x9f\\x5e\\x45\\x1d\\xcc\\xff\\x4c\\x80\\xd7\\x11\\x07\\xc9\\x75\\xab\\xfa\\xc0\\x7d\\x4d\\x27\\x0c\\x72\\x7d\\x8a\\x2f\\xec\\x34\\x9b\\x53\\x39\\x68\\xe2\\x71\\x89\\x2d\\x2b\\x62\\xc1\\x25\\xfb\\x79\\x74\\x60\\x3c\\x30\\x5e\\xa3\\xbf\\xa3\\x0f\\xb6\\x10\\xfc\\x5a\\x23\\xeb\\x68\\xa8\\x40\\x64\\x44\\x39\\x1a\\x52\\x13\\x37\"},\n{{0xf7,0x31,0x31,0x7c,0xf5,0xaf,0xfe,0x58,0x70,0x4c,0x4d,0x94,0x97,0xae,0x86,0x0b,0xbf,0x73,0x9d,0x0f,0xd9,0x6b,0x7c,0x02,0xef,0xb6,0x77,0x7b,0x3c,0x85,0x8a,0x19,},{0xd7,0xd6,0x38,0xae,0xcc,0xe1,0x46,0x1e,0x31,0x42,0x55,0xaa,0x29,0xd9,0xa6,0xb4,0x88,0xae,0xa1,0x39,0x6e,0x96,0x82,0x69,0x5a,0x47,0x0e,0xff,0x23,0xf3,0xed,0x84,},{0x2a,0x4f,0xea,0x98,0xf9,0x24,0x01,0x71,0xa1,0x82,0x3f,0x2f,0x69,0x35,0x20,0x62,0x67,0x2e,0x6c,0x6e,0x66,0x52,0xd3,0x88,0xa8,0x77,0x14,0xd6,0x47,0x99,0x5d,0xf7,0x5b,0x6e,0x1e,0xd1,0x74,0x6a,0xf2,0xad,0xf4,0xe8,0x06,0x13,0x5d,0x60,0x75,0x4e,0x60,0xfe,0xa0,0x32,0x12,0x8e,0x35,0xab,0xc1,0xf1,0x61,0x51,0x81,0x12,0x5f,0x0b,},\"\\x16\\xf5\\x1c\\x59\\xe9\\xae\\xfc\\x26\\xb0\\xda\\x5e\\x00\\x85\\xeb\\x2e\\x2f\\x1f\\x85\\x6d\\xef\\x97\\x25\\x76\\x9e\\x3a\\xf1\\x2f\\x86\\x09\\x05\\xae\\x13\\x3f\\x65\\x07\\x4d\\xa7\\x6d\\xbf\\x25\\xc6\\x7f\\x62\\x57\\xd2\\xdc\\x66\\xc0\\x5f\\x9b\\x31\\xae\\x17\\x7b\\x69\\x92\\x9f\\xc1\\x83\\xb5\\x88\\xc5\\x19\\xbc\\xa1\\x47\\x96\\xa0\\x89\\x6d\\x29\\x05\\xfd\\x94\\x2d\\x7a\\xb4\\xa3\\xfd\\x95\\x41\\xa5\\x52\\x9f\\x72\\x9c\\x58\\x51\\x41\\x9b\\x5f\\xbe\\xf7\\xb1\\x34\\xd6\\x76\\x2e\\xb9\\x7e\\x8a\\x95\\x1a\\x8f\\xf5\\x2a\\xa0\\xd7\\xe6\\x74\\x44\\xd0\\x6b\\x07\\xaa\\x55\\xe4\\xeb\\x9a\\xb8\\x92\\xf4\\x7b\\xfd\\x11\\x1d\\xf5\\xb6\\x2f\\x6f\\x3f\\xd1\\xa5\\xed\\x84\\x12\\x5f\\xee\\xbb\\x77\\xda\\x63\\x7c\\x05\\xd5\\x26\\x5c\\xed\\x11\\x3d\\xfe\\x87\\x82\\xdb\\xd1\\xce\\xcd\\x2c\\x6c\\x03\\x2b\\x8f\\xa8\\x85\\x5b\\x3a\\xe7\\x8d\\xe7\\x4f\\xaa\\x5a\\xa2\\x0a\\x76\\x14\\x63\\xc2\\xa3\\x0b\\xe6\\x6b\\xd3\\x8c\\xde\\xc7\\x5f\\x89\\x57\\xcb\\x94\\xc1\\x13\\xa4\\x5d\\x54\\x6d\\xaf\\x47\\x5d\\x89\\xaa\\x14\\x82\\xf8\\xd2\\x80\\x3a\\x23\\xc9\\x39\\x20\\x20\\x15\\xa0\\x8e\\x94\\xb1\\x32\\x72\\x8f\\xbe\\x8f\\x60\\x19\\xd7\\x16\\x8a\\x08\\xa5\\x93\\x01\\x70\\xe5\\x63\\x9d\\x11\\x0e\\x47\\x39\\xdb\\x85\\xe6\\x1e\\x64\\x49\\x59\\x44\\xb5\\x42\\x3a\\x74\\xad\\x5a\\x8a\\x0a\\x51\\x06\\x12\\xec\\xe6\\x55\\xce\\x18\\x86\\x40\\x51\\x52\\x5b\\x90\\x8e\\x0b\\x19\\x29\\x0a\\xbe\\x8b\\x11\\x82\\xc4\\x8c\\x70\\x0d\\x35\\x05\\x15\\xfd\\x34\\x99\\x56\\xe8\\x08\\x73\\x27\\xf3\\x0b\\x6f\\xc3\\xf1\\x31\\xc2\\x14\\x4a\\xbb\\x3f\\x0e\\x9c\\xa3\\x31\\x17\\x2b\\x35\\x06\\x4a\\x82\\x81\\x1a\\x68\\xe2\\xcf\\x36\\xb4\\x3e\\x3a\\xd2\\xe8\\xdf\\xa5\\xb1\\xce\\xf5\\x0e\\x2a\\x60\\x29\\x3f\\xc5\\xf6\\x35\\xc9\\xa9\\x99\\x8d\\x8c\\x1a\\xd2\\x96\\xe7\\xc7\\x8f\\xc0\\x58\\x20\\x22\\xd6\\x30\\x67\\x18\\x6b\\x65\\xe7\\x64\\x82\\x8c\\xc0\\xf5\\xf7\\x63\\x2d\\x5e\\xef\\x86\\x3e\\x6c\\x6d\\x90\\xe3\\x8c\\xcc\\x87\\xd7\\xb7\\x47\\xfa\\xc8\\x49\\x1d\\x63\\x2c\\xf7\\xf5\\x4b\\x9a\\x9e\\xed\\x16\\xee\\xbe\\xc0\\x1b\\x6c\\xc3\\x3d\\x24\\x63\\xf7\\xf9\\x50\\xd8\\x28\\xb5\\x5e\\xe3\\xf7\\x7c\\xbe\\x97\\x4f\\x48\\x94\\x8e\\xb7\\x57\\xae\\xd4\\xe0\\xdb\\xb0\\x0a\\xd9\\x5e\\xe0\\x13\\x23\\x48\\x6e\\xba\\x3c\\x8d\\xa8\\x86\\xed\\x7f\\x57\\xbb\\x40\\x0d\\x63\\xa1\\xb2\\xeb\\xea\\xa2\\xe7\\x0a\\xdf\\x03\\x79\\xe3\\x39\\x30\\x01\\xba\\x62\\x6c\\x0d\\xd5\\x4b\\x7f\\x0c\\x9a\\x25\\xaa\\xe6\\xc9\\x87\\x5d\\x4e\\x76\\x22\\xf3\\xed\\x42\\x8f\\xb3\\x12\\x4b\\x29\\xc5\\xdb\\x9a\\x7e\\xf1\\x6e\\xbd\\xdd\\x68\\x05\\xf0\\x95\\xf5\\xe7\\x69\\x82\\x3c\\x43\\xf2\\x62\\x86\\x8f\\xf4\\x3e\\x3e\\x05\\x25\\x74\\x6d\\x94\\x97\\xaf\\x12\\x4a\\x01\\xdf\\xf6\\x1e\\xc7\\x18\\xaf\\x3b\\x5b\\xb7\\x46\\xfc\\xc0\\x8a\\xeb\\xd1\\x66\\x84\\xd4\\x56\\xae\\x79\\x32\\xff\\x5e\\xd7\\xd6\\xb0\\xf1\\xb2\\x5c\\x7a\\xde\\xef\\x59\\x8b\\x5d\\x58\\x87\\x75\\x90\\xac\\x1d\\xc0\\x59\\x75\\x15\\x67\\x96\\x99\\x87\\x74\\x08\\x1e\\x5b\\x66\\x82\\x2a\\x94\\xa6\\xa8\\x02\\xc3\\xa2\\xcd\\x9f\\x48\\x9e\\x16\\x28\\xaa\\xf4\\x65\\x2b\\xe1\\x18\\x4b\\x0f\\xc7\\xc5\\xee\\x7f\\x97\\xce\\x08\\xb9\\x23\\x3b\\x4b\\x83\\xd9\\x36\\x7b\\xe5\\xf4\\xaa\\xe9\\x78\\x25\\x93\\xa3\\x52\\x65\\x15\\x4d\\xea\\x4c\\x37\\x5c\\x16\\xf0\\xca\\xf6\\xdc\\x45\\x94\\xd2\\xbd\\xbf\\xc3\\x37\\x5b\\xb2\\xa0\\x43\\x2c\\x48\\x2f\\x13\\x94\\x1c\\xe2\\xaa\\xab\\x4d\\x83\\xe7\\x4d\\x11\\x6f\\x5d\\xe4\\xab\\x28\\xf8\\xdc\\x3d\\x1c\\xd1\\x9d\\x27\\x1e\\x56\\xe1\\x03\\x98\\xbd\\x1d\\xf5\\xc8\\x70\\xfc\\xbf\\x93\\xa7\\xd1\\xdf\\x39\\x39\\x54\\x7c\\x10\\x7b\\xfd\\x90\\x64\\x3f\\x6f\\x50\\x01\\xae\\x7e\\x06\\x39\\x7a\\xe1\\xa2\\x71\\xbb\\x82\\xa1\\xf3\\x8e\\x09\\x7b\\xec\\x66\\x74\\x66\\xb8\\x0e\\xe3\\xe5\\x0d\\xd4\\xfc\\x9d\\x5d\\x54\\xf1\\x8f\\xaf\\x7a\\x5b\\x55\\xa8\\x83\\x45\\x94\\xef\\x0c\\xb7\\xe5\\x08\\xbb\\xd2\\x8f\\x71\\xfd\\x34\\x23\\x5b\\xbf\\xd3\"},\n{{0x49,0x8e,0x5a,0x21,0xa9,0xb0,0xc3,0x47,0xba,0x83,0xa4,0x7a,0xc1,0x00,0x69,0x45,0x7f,0x57,0x83,0xc2,0xe1,0xe6,0xe4,0x64,0x00,0x45,0xe5,0x94,0xb1,0xc6,0x93,0x32,},{0xfb,0x39,0x48,0xc8,0x11,0x99,0x56,0x91,0x05,0xcc,0x1b,0x7d,0x9c,0xeb,0x3b,0x41,0xa3,0x43,0xbb,0x00,0x57,0x55,0x38,0x59,0x2e,0x09,0x84,0xf4,0xf4,0x71,0x0a,0xbe,},{0x28,0x60,0x83,0x0c,0xcd,0x1d,0x41,0xd9,0x50,0x76,0x81,0x6a,0x39,0x84,0x24,0xf7,0xb7,0x39,0xc4,0x9f,0xda,0xcf,0x56,0x54,0x52,0x9d,0xa8,0x5f,0xe3,0x56,0x55,0x84,0xf6,0xaa,0xc2,0x61,0x4c,0x63,0xf7,0x74,0xb6,0x1d,0xb9,0x08,0x1f,0x14,0x10,0xfb,0xa8,0xe5,0x0a,0xb3,0xb4,0xc3,0x9d,0xc0,0x63,0x14,0x24,0x3f,0x3f,0x0d,0x8e,0x0f,},\"\\xe4\\xfb\\xea\\x86\\x4a\\xa5\\x11\\x90\\x82\\x66\\x45\\xd2\\xf7\\x72\\xcb\\x0f\\x9e\\xdd\\xd3\\x03\\x44\\x73\\xfa\\x31\\x77\\xc7\\xaf\\x9a\\x5d\\x41\\xe1\\xa7\\x3a\\xd5\\x78\\x4c\\x70\\x96\\x55\\x9f\\xcd\\xdb\\x7b\\x7c\\x85\\x89\\x1c\\xf2\\x4e\\x82\\xc5\\x88\\xd7\\x47\\x74\\xff\\xca\\xc0\\xc6\\xb4\\xee\\xbc\\x2f\\x3f\\xa4\\x3e\\x9d\\x45\\xf2\\x59\\xd6\\x75\\x64\\x03\\x0c\\xfe\\xea\\xb9\\x23\\x6c\\x66\\x5b\\x65\\x0a\\xf0\\xc9\\x2c\\x87\\x51\\x89\\xf5\\xf9\\x38\\x35\\x04\\xb1\\x53\\x60\\xa0\\xb9\\xa5\\xa0\\x0d\\xa3\\x1f\\x63\\x5b\\x96\\xf6\\xc7\\x3e\\xf4\\x7b\\x6b\\x06\\xf0\\x28\\x11\\xd1\\xd1\\x9c\\x2e\\x8e\\x53\\x55\\x0c\\xe2\\x2e\\x42\\xec\\x50\\xa1\\xeb\\x2e\\xa2\\xf4\\xcd\\x03\\xc4\\x42\\xd4\\xaa\\x43\\x68\\x94\\x23\\x8c\\xeb\\x18\\x35\\xfe\\x99\\xb2\\x40\\x35\\x8a\\xa0\\x56\\x2c\\x24\\x96\\x98\\xa3\\xf1\\x23\\xc2\\xc1\\x7e\\x59\\x10\\x10\\xbd\\x6f\\xdf\\xcb\\xd7\\xdb\\xe7\\x0b\\x04\\x52\\x05\\x02\\xec\\xe3\\x7a\\x9a\\x1d\\xfa\\x1a\\xe3\\x37\\x04\\x17\\xb0\\x04\\x21\\x7a\\x5b\\x8f\\xe9\\x90\\x3c\\x9a\\x3b\\x9f\\x4b\\x6d\\x5c\\x46\\xc0\\xed\\x0c\\x53\\x8c\\xec\\x22\\xf2\\xdf\\xcb\\x2a\\x28\\x0a\\x42\\xad\\xc4\\x89\\xcf\\x2e\\x06\\x29\\x12\\xbe\\x99\\x28\\xf0\\xc0\\x60\\x89\\x1e\\x43\\x20\\x91\\x17\\x75\\x26\\xf1\\xb3\\xa9\\x68\\x06\\x9d\\x4a\\x57\\xad\\xe8\\x28\\x55\\x98\\x10\\xae\\x03\\x60\\x68\\x1f\\xf9\\x93\\x29\\xfa\\x0f\\x59\\xe7\\xe5\\x9c\\xdf\\x87\\xf9\\xf3\\x3c\\x40\\xe9\\x70\\x31\\xb9\\xf8\\x1d\\x48\\xfc\\x12\\x28\\x6e\\xfb\\xb3\\xd4\\xe5\\xa6\\x2e\\xf5\\x7b\\xc0\\xd5\\x2d\\x53\\x3b\\x99\\xc5\\x10\\x6a\\xa7\\x9c\\xfe\\x17\\x93\\xa9\\x08\\x51\\x85\\x96\\xc3\\x83\\x48\\x3e\\xc4\\x9f\\xf9\\x8e\\xc5\\x57\\xbf\\xff\\x74\\x90\\xa4\\x6d\\xaf\\x67\\x14\\xf2\\xc2\\xc3\\x2f\\x57\\x93\\x2c\\xa0\\xd7\\x30\\xf0\\x3f\\x38\\x1d\\x69\\xde\\xcd\\xbd\\x9a\\x7a\\x6d\\x4a\\xfc\\x62\\x40\\x65\\x43\\xc8\\xeb\\xe9\\x0a\\xc7\\x6e\\x6a\\xfa\\xbd\\xb8\\x24\\x92\\xa2\\x06\\xa3\\x69\\xe0\\x42\\x86\\xd3\\x13\\xe1\\x11\\x07\\xd8\\xcd\\x9b\\x4b\\xf6\\x8f\\x81\\x5d\\xba\\x4e\\x99\\x0b\\x04\\x9d\\x79\\x21\\x6d\\x36\\x53\\x13\\x83\\x42\\xcd\\x11\\x8b\\x13\\x0f\\x66\\xb0\\x06\\xf3\\xd8\\x9a\\xc3\\xcf\\x89\\x83\\x70\\x48\\xb0\\xf8\\xa6\\x2d\\x94\\x05\\x1d\\x2e\\xab\\x89\\x1a\\xc5\\xf4\\x78\\x88\\x87\\x9d\\x88\\xe5\\x46\\x67\\x6d\\x1d\\xae\\xeb\\x4d\\x17\\x5d\\x3f\\x04\\xa9\\xd7\\x4f\\xfc\\xdd\\x47\\x74\\x60\\x16\\xf8\\x4a\\xd0\\xd1\\x12\\xaf\\xb5\\x9a\\xd1\\x21\\x87\\xe9\\x4f\\x22\\x53\\x5d\\x77\\xe9\\xe0\\x51\\x6f\\xa4\\x21\\x85\\xc1\\x97\\xba\\x77\\x4b\\x39\\x32\\x27\\xf7\\x41\\xfe\\x68\\x27\\x3f\\x42\\x3f\\xb0\\xe0\\xe0\\x47\\x4b\\xfd\\xaf\\x2d\\xa7\\x8a\\xeb\\x1c\\xd5\\xb9\\x8c\\x1d\\xc0\\x83\\x21\\x24\\x74\\x2a\\x47\\x54\\x12\\x5f\\xc7\\x8b\\x19\\xc5\\x59\\xa5\\xb3\\xf7\\x71\\x1e\\x06\\x8c\\x44\\x0c\\xc0\\x46\\x9a\\x1c\\xfa\\x5c\\x18\\x64\\xbe\\x18\\x73\\x5a\\xa8\\xbc\\xd4\\x06\\xc4\\x37\\x1e\\xb8\\x57\\x75\\x4d\\x90\\x8b\\xf3\\x79\\xb9\\x1f\\xcb\\x24\\xe3\\x43\\x96\\xbf\\x87\\xc1\\x9a\\x04\\xa8\\x3d\\x59\\xda\\xe7\\x1f\\x3f\\x38\\x39\\x82\\x9d\\x06\\x22\\x13\\x01\\xef\\x59\\x56\\x96\\xe7\\x19\\xd5\\x6b\\x79\\x52\\x0a\\x0e\\x50\\x99\\x29\\x83\\x3b\\x1d\\x80\\x4a\\x6a\\x0e\\xa4\\x04\\x00\\xbb\\x45\\x02\\x8c\\xe5\\xd3\\x69\\x33\\x88\\x3e\\x17\\x40\\x6e\\x27\\xa8\\x10\\x90\\x57\\xb1\\xa1\\xa5\\xe5\\xda\\x21\\x0a\\x69\\x21\\x99\\x4f\\x46\\x7a\\xb4\\x1a\\xa8\\xf0\\xd8\\x87\\x75\\xa8\\xa8\\xeb\\xb4\\xec\\x77\\xd7\\xc8\\x0e\\x45\\xa7\\xbb\\x42\\x2a\\x4c\\x00\\xc9\\x05\\x83\\x91\\x14\\x65\\xe6\\xb5\\xf0\\xfd\\xcd\\xea\\xb7\\x28\\x71\\xca\\x54\\x2e\\x1d\\x1a\\x2c\\xa9\\x4d\\xf4\\xed\\x2e\\xab\\xf9\\x0d\\xed\\x00\\x45\\x29\\x03\\x24\\xa9\\xff\\xfb\\x30\\x14\\x54\\x70\\x20\\x9f\\x38\\x26\\x58\\x09\\x89\\x34\\x91\\x99\\xdc\\x5a\\xb8\\xd4\\xa2\\x5d\\xf7\\xa0\\x52\\x9c\\xf9\\x14\\x71\\xe3\\x08\\x42\\xab\\xfa\\xcd\\x44\\xab\\x78\\x1d\\xfc\\x13\\x95\"},\n{{0xc2,0x4c,0xbf,0x40,0x1a,0xd0,0x3b,0xd8,0x8d,0xcc,0x7b,0x51,0x9e,0xcf,0x62,0x4d,0xb2,0x22,0x3e,0x99,0x02,0x89,0x30,0x9e,0x1e,0x9f,0x1f,0x8f,0x61,0x27,0xc6,0xc9,},{0xa7,0x46,0x66,0xf3,0x57,0x20,0x9f,0x71,0x89,0x90,0x37,0x88,0xf1,0x07,0x56,0x3e,0x50,0xc0,0x51,0xc3,0xd4,0x0c,0x3f,0x3d,0xad,0x10,0xd3,0xc3,0xcf,0xf1,0xe6,0x78,},{0x58,0x1e,0x6c,0x85,0xae,0xc6,0x23,0xb6,0x2b,0x3d,0x4c,0x9b,0xc9,0xc7,0x77,0x59,0xd5,0x49,0x27,0x22,0xe2,0x52,0xd4,0x4c,0x1f,0x8a,0xda,0x9d,0xa2,0xec,0xc6,0x7c,0x17,0x08,0x32,0x73,0xaa,0x09,0x1b,0xba,0xc0,0x46,0xae,0x63,0xc7,0x88,0x93,0x15,0x2e,0x14,0xd9,0x26,0xc4,0x1a,0xe3,0x5f,0x0e,0x6e,0x39,0x59,0x49,0x6b,0x13,0x06,},\"\\xe7\\xfa\\x35\\x9e\\x6a\\x09\\xb2\\xc5\\x4a\\xab\\xed\\x3b\\xba\\xbf\\xb7\\x28\\x53\\xa8\\x05\\xaa\\xbc\\xf4\\xd1\\x8d\\xda\\xd3\\x9f\\x03\\xf3\\x46\\x01\\xe5\\x5b\\x6c\\xe2\\x63\\xc9\\xa3\\xca\\x6a\\x3e\\x5f\\x14\\x25\\xc8\\x21\\x92\\x8c\\x61\\xe7\\xf7\\x50\\x91\\x9b\\xd3\\xaf\\x32\\xbc\\xb7\\xb9\\x4d\\x45\\x9a\\x7a\\x9a\\x35\\xf6\\x1c\\x94\\x17\\x92\\xe2\\xcc\\x2e\\x43\\x27\\xbe\\xb3\\x44\\xa8\\x41\\xa0\\x7f\\x32\\x06\\x8a\\xf1\\x02\\xb3\\xde\\x61\\xea\\xb6\\x4e\\xf6\\xd5\\xe6\\x90\\x62\\xe3\\x93\\xab\\x5e\\xdf\\x6a\\xc9\\xef\\x7b\\x38\\xd4\\x9a\\x01\\xbe\\xf0\\x00\\x3f\\x42\\x11\\x74\\xc8\\x88\\x59\\x75\\xc0\\x18\\x32\\x89\\x9c\\x31\\x35\\xe7\\xa8\\x6e\\x5b\\x55\\xd9\\xb1\\x32\\x8b\\xb4\\x28\\x9b\\x5c\\x40\\x20\\x0f\\x49\\xe5\\x52\\x3b\\x3c\\x46\\x1d\\xc7\\x17\\x5e\\x14\\x65\\x02\\x22\\x97\\xc3\\xd3\\x80\\xf2\\xb1\\xfe\\xf3\\x9c\\xb8\\x2c\\x00\\xfd\\x16\\x0f\\x44\\x7e\\xb5\\x12\\x63\\xfa\\x25\\xb4\\xdf\\x0f\\xca\\x41\\xec\\x0c\\xa2\\xec\\xe7\\x47\\x22\\x01\\xaf\\x86\\xc3\\x03\\x8c\\x49\\xdf\\x09\\x9a\\x9a\\xef\\xa1\\xf8\\x8d\\x0e\\xdf\\xd1\\x7c\\x0b\\x3c\\x86\\x04\\x66\\x29\\xc0\\x94\\x54\\x05\\x4a\\xa0\\xfb\\x2c\\x69\\x49\\xdd\\x9c\\x13\\x01\\x85\\xdf\\xa5\\xd9\\x03\\x89\\x1e\\x08\\x74\\x2c\\xd0\\x42\\x94\\x03\\xf5\\x7f\\x40\\x52\\x15\\x8b\\x2f\\x40\\x1d\\xa4\\x75\\x68\\x54\\xe4\\xaa\\xf0\\x24\\x22\\x1e\\x37\\x51\\x3c\\xf6\\x77\\xee\\x6a\\x0b\\x15\\x9f\\x50\\x1d\\x37\\x7e\\xa3\\x2e\\xb7\\x1e\\x77\\x80\\x04\\xf2\\x72\\x03\\xcd\\x6d\\x55\\x3f\\xda\\x5d\\x65\\xe1\\x87\\x94\\x77\\x04\\x6f\\x3e\\xa3\\xd1\\xd7\\x5c\\x9d\\x0d\\x30\\x31\\x14\\x56\\x70\\x9c\\xc7\\xf6\\xab\\x68\\xc7\\xb0\\xd5\\x2b\\xe4\\x0f\\x04\\xcf\\x65\\x56\\x55\\x32\\x32\\x85\\x31\\x83\\x29\\xe8\\x4c\\x6a\\x5b\\x07\\xe0\\xce\\xed\\x5f\\x78\\xf7\\xf1\\xfa\\x62\\x29\\xbe\\xf8\\x78\\x79\\x3c\\x58\\x47\\x28\\xab\\xf4\\x51\\x0b\\x7f\\x27\\x79\\x4b\\x59\\x42\\x91\\x62\\x54\\xc5\\x89\\xa0\\x9c\\x8e\\x91\\x1f\\x0b\\x95\\x42\\x11\\xa6\\x36\\x99\\xa7\\x52\\x14\\x7f\\x2a\\x4e\\x1a\\x18\\x95\\x66\\x44\\xbe\\xa2\\xca\\x26\\x92\\xba\\x18\\x22\\x80\\xe0\\x4a\\x72\\xdd\\x89\\xb0\\xd1\\x26\\x85\\x00\\x93\\x8f\\x34\\x7b\\xf4\\x3f\\x2a\\x24\\x2e\\xe9\\xb9\\xa6\\xba\\xac\\x9b\\x35\\x0d\\x65\\x6f\\xb1\\x9e\\xc8\\x34\\xab\\xe3\\x16\\x44\\x40\\xf2\\xd2\\x07\\x1f\\xe5\\xe3\\x2c\\x8e\\x4c\\xf9\\x05\\x53\\x9b\\x83\\x9c\\xee\\xca\\x26\\x20\\xfc\\xb2\\xa0\\x87\\xf7\\x80\\xe6\\xc7\\xf5\\xe0\\x5c\\x50\\x68\\x88\\x25\\x0e\\xa7\\xc8\\x56\\xfb\\x30\\x98\\x32\\x00\\xaa\\x8f\\x78\\xfc\\x17\\x71\\x05\\x4a\\xda\\x0f\\x3f\\xac\\x38\\xae\\x2f\\x33\\xdc\\x4a\\x4f\\x85\\x1b\\x76\\xed\\x74\\x0c\\x09\\x62\\xa7\\x6a\\x4d\\xe4\\x40\\x80\\xdc\\x62\\x0a\\x44\\xad\\x8f\\x23\\xd3\\x46\\x2b\\x79\\x2a\\xb3\\xaf\\xb1\\x9c\\xb8\\xa9\\xf4\\xd9\\xe5\\x9a\\xd7\\x65\\xa7\\x71\\x89\\x9d\\xa8\\xcb\\xec\\x89\\xe5\\x07\\x7e\\x85\\xc0\\xc9\\x31\\x26\\x37\\x6c\\x94\\x1b\\xef\\x1f\\x8b\\xb9\\x92\\xd3\\xa3\\x5f\\x27\\x07\\x25\\x84\\x6f\\xb2\\x52\\xf8\\xb5\\xfb\\xb7\\x56\\x7e\\x40\\x6a\\x1b\\x53\\xb6\\x19\\x76\\x9e\\x63\\x2b\\x2b\\x40\\x87\\xcd\\x4c\\x27\\x6e\\x5d\\x58\\xff\\x2b\\x56\\xe8\\x9e\\xde\\xc4\\x8c\\xe5\\x3a\\x52\\xe3\\x29\\xca\\x15\\x59\\x53\\x8f\\x10\\x90\\x2c\\x01\\xa8\\x5f\\xbb\\x3c\\xd7\\x2e\\x6b\\x82\\x91\\xe5\\xfe\\x63\\x9b\\xee\\x9d\\x47\\xd3\\x4c\\x24\\x9a\\x7a\\x07\\xd7\\xa1\\x42\\x7a\\x01\\xf6\\x3d\\x60\\x98\\x4c\\x45\\x0b\\xef\\x81\\x9b\\x19\\xf6\\x5e\\x26\\x14\\xfd\\x9c\\x2f\\xae\\x7b\\x92\\x31\\xa0\\xbc\\xa4\\x14\\xed\\x94\\xa5\\xee\\x7e\\x66\\x32\\x7d\\x2a\\x99\\xc8\\x48\\x78\\xb7\\xbe\\xe0\\x87\\xe8\\x91\\xf2\\x53\\xfa\\x1f\\xec\\xe3\\x13\\x64\\x8c\\x06\\xc4\\x5d\\xb2\\xd9\\xf3\\xbc\\x85\\x99\\x93\\x7b\\x75\\x2d\\x38\\xce\\x50\\x63\\xd0\\xed\\x9a\\x43\\xec\\x9d\\x40\\x15\\x89\\x3d\\x43\\xbf\\x5b\\x2d\\x1c\\x60\\x47\\x85\\x10\\x46\\x89\\x68\\xb7\\x96\\xf0\\x15\\x37\\x89\\x59\\x54\\x41\\x72\\x2a\"},\n{{0x8b,0x3d,0xcd,0xe4,0xab,0xbf,0x4e,0x62,0x11,0xc4,0xa5,0x1c,0x4b,0x02,0x68,0x00,0xa8,0xa2,0xa0,0x61,0xcb,0x38,0xa2,0xec,0xc7,0xc9,0xcf,0x11,0x3f,0x92,0x70,0xbf,},{0x51,0x45,0x35,0x58,0x0f,0x0d,0xe3,0x59,0xbb,0x0d,0x41,0xf2,0xef,0xdd,0xaa,0x04,0xc2,0xec,0x95,0x01,0x19,0xf3,0x16,0x34,0xb2,0xc1,0xa3,0x2f,0x19,0x5f,0x69,0x68,},{0x4f,0x3d,0x4d,0x22,0x85,0x03,0x01,0x7e,0x74,0xa6,0xbb,0x58,0xaa,0xfa,0xe3,0x5c,0x3f,0x37,0xbd,0xee,0x4f,0xf6,0xbe,0x2e,0x62,0x40,0xb5,0x08,0x2f,0xed,0xdb,0x22,0x27,0x35,0xe1,0x2f,0x31,0xe0,0x56,0xfa,0x68,0x54,0x47,0xe5,0x38,0x48,0x03,0x00,0x7e,0xa7,0x91,0x0e,0x60,0x5c,0x1b,0x78,0x11,0x8c,0xd5,0xac,0xc5,0x87,0xa6,0x06,},\"\\x48\\x14\\x25\\x02\\x7d\\xa6\\x72\\xb6\\xf2\\x6c\\x91\\xb8\\x0e\\x55\\x58\\x2c\\xae\\xf4\\x7b\\xb1\\x5a\\x2d\\xe8\\xfc\\xa8\\x52\\x22\\x17\\x85\\x18\\x0b\\x20\\xa7\\xfd\\x6d\\x49\\x07\\xb5\\x88\\x1c\\xc1\\xd6\\xe3\\x9a\\xb9\\x61\\x2c\\xc7\\x4d\\x69\\x77\\xe9\\x14\\x1f\\x70\\x87\\xbb\\x27\\xab\\x30\\x84\\xa2\\x62\\x85\\x58\\x6f\\x84\\x11\\xdb\\x1f\\x50\\x3a\\xdf\\x52\\xdc\\xb2\\x5a\\xb8\\xff\\xfd\\x2e\\xc1\\x50\\x4c\\x17\\x77\\xb9\\xd6\\xdd\\x4a\\x29\\xe2\\x01\\x9e\\x5c\\xba\\xe1\\xb7\\xeb\\x26\\xf9\\x5b\\xbe\\x07\\xd9\\x0c\\x2f\\x6f\\xb0\\x88\\x4a\\x59\\xa8\\xd5\\x8d\\xde\\x51\\x16\\xed\\xc3\\xbc\\x34\\x9d\\x37\\xc1\\x60\\xb2\\x7b\\xef\\xbe\\x5a\\x5c\\x18\\x1c\\xe7\\x25\\x63\\x92\\x35\\x4d\\x22\\x1b\\x58\\xc4\\x7e\\xb0\\xbb\\x10\\x92\\x9e\\x74\\x21\\x79\\x5f\\x4b\\x7a\\x7c\\x27\\x5e\\xdd\\x08\\xc0\\x88\\x56\\x87\\x72\\xe9\\x93\\x21\\x8d\\xd6\\xf3\\xc2\\xcb\\x4a\\xc6\\x57\\xa0\\xa3\\xf9\\x1f\\x31\\x26\\xb9\\x91\\xad\\xf6\\xcb\\xe7\\xd1\\xb1\\x9b\\x8c\\xd8\\x3b\\xe3\\x60\\x2e\\xd1\\x8f\\x03\\x96\\x33\\xfb\\xd2\\x38\\x7b\\xda\\x69\\xe2\\xcf\\x03\\x87\\xd8\\x64\\x4d\\x97\\xb3\\x03\\xfb\\x00\\x63\\x9a\\xee\\xe7\\xae\\x46\\x3f\\x6f\\xe1\\xa2\\xc4\\xb8\\x9a\\xeb\\xa3\\xe9\\x09\\x4c\\x11\\xfc\\x29\\x11\\x4b\\x20\\x28\\x3f\\x28\\x7c\\x6d\\xd2\\x8c\\xb0\\x98\\xda\\xe8\\xda\\xbc\\x48\\xe8\\x5b\\xb5\\x9c\\x0d\\xc6\\xe7\\x8c\\x95\\x66\\x05\\xcb\\x7c\\xf0\\x69\\x42\\x35\\x3e\\x7a\\x22\\xe9\\x6f\\x80\\xa3\\x7a\\x66\\xf7\\x18\\xd9\\xe4\\xdb\\x8c\\x52\\x45\\x2a\\xa0\\xa3\\x57\\x72\\xe8\\x1b\\xa2\\xb3\\x03\\x20\\x5b\\x41\\x2d\\xd2\\xbf\\xc1\\x5c\\xe9\\xb4\\x36\\xf9\\x9f\\xbb\\x32\\x12\\x6b\\x63\\xce\\x9c\\xb4\\x31\\x99\\xf1\\x57\\xd8\\x17\\x51\\xa7\\xc4\\x93\\x7d\\x13\\xaf\\x4c\\x58\\x29\\x52\\xb5\\xd6\\x06\\xb5\\x55\\xb0\\x46\\xbf\\x1d\\xe0\\x6c\\xf3\\x9b\\x63\\xa8\\x02\\x87\\x37\\x18\\x03\\x60\\x9a\\x38\\x7e\\xe8\\x0f\\x3a\\x5d\\x88\\xb9\\xd6\\x21\\x96\\x50\\xed\\x17\\xd3\\xcc\\x18\\x3b\\x2c\\x70\\xd5\\xeb\\x94\\xe3\\xbc\\x52\\xae\\xa7\\xaa\\x7f\\x53\\xbe\\x0e\\x20\\xb8\\x97\\x2f\\x14\\x3d\\x8e\\x20\\x16\\x2e\\x80\\x3e\\xdb\\x4a\\xa8\\x3d\\x55\\x53\\xfd\\xd5\\x53\\x39\\x8b\\x0f\\xa1\\x76\\xb9\\x59\\xcb\\xa1\\x40\\xd6\\xe9\\x80\\xc9\\x25\\x1b\\x0f\\xa0\\xb6\\x5e\\x90\\x84\\x17\\xf8\\x2f\\x45\\x1f\\xf9\\xf2\\xde\\x6b\\x9c\\xa5\\xe3\\xb5\\xf4\\x1b\\xa4\\x0d\\x05\\xa5\\x4f\\x3d\\xab\\x48\\x86\\xaa\\xcc\\xa0\\x5c\\x9c\\x27\\x98\\x13\\x9a\\x4c\\xb3\\x3e\\x96\\xa9\\x14\\x94\\x74\\x99\\x10\\xa1\\x7c\\xe8\\xb3\\x92\\xfc\\x0f\\xc7\\x76\\x29\\x74\\xd7\\x9d\\x33\\xdb\\x92\\x4b\\xfe\\xf8\\x65\\x5a\\x72\\x37\\x76\\xff\\x87\\xf9\\x50\\xfd\\xc5\\x68\\xb1\\xe5\\x26\\x53\\x45\\x41\\xf5\\x72\\x72\\x3b\\x84\\x06\\x63\\xc1\\x91\\x88\\xc4\\x24\\xf7\\xc4\\x89\\x23\\x5a\\x42\\x4b\\x09\\xfe\\x25\\xc3\\x07\\x27\\xea\\x1c\\xb0\\x49\\x53\\xd7\\x06\\xd6\\x8b\\xfe\\x12\\x10\\x0e\\xf6\\xf6\\x4c\\x35\\xc6\\xb8\\xde\\x67\\xed\\xf0\\xe3\\xad\\x01\\x4a\\x40\\x0e\\x82\\x1e\\xa3\\x40\\x24\\x32\\x19\\x99\\x86\\x7b\\x43\\xc8\\x2c\\x45\\x01\\x84\\xb7\\x8f\\x74\\x25\\xce\\xbd\\x73\\x19\\xdc\\x6f\\x65\\xd3\\x60\\x66\\x5d\\xfb\\xe7\\xc3\\x66\\x74\\xda\\xc3\\xa5\\x4e\\x96\\xda\\x91\\x0c\\x02\\xd3\\x64\\x07\\x80\\xb2\\x2d\\x51\\x2c\\xa0\\xe3\\xca\\x35\\x87\\xb9\\x4e\\xa9\\xfc\\xd7\\xa3\\x1b\\x4a\\xf6\\x9f\\xd6\\x20\\x7c\\x68\\xfe\\xd2\\x5f\\x89\\x92\\x1c\\x1c\\xdc\\xde\\xfd\\x1c\\x09\\x02\\x04\\x49\\x2b\\xff\\x9b\\xbb\\x52\\xe0\\x88\\x85\\x82\\x9d\\x01\\x2b\\xc2\\xdf\\xb4\\xfe\\x8c\\x35\\xe5\\x9c\\xd1\\x3b\\xcb\\x8e\\xad\\x34\\x19\\x3c\\x40\\xb0\\x3e\\xe4\\xd8\\x25\\xee\\x13\\x22\\xff\\x4e\\xf0\\x71\\x27\\x95\\x74\\xcb\\xae\\xe7\\xc0\\x7f\\x14\\xbe\\x60\\x6b\\x9c\\xd0\\xe2\\x61\\x11\\x1e\\xf2\\x0d\\x96\\x81\\xd7\\x6c\\xf7\\x8c\\x89\\xa8\\xc3\\x97\\xd6\\xb8\\xdc\\x77\\x8f\\x49\\x84\\x16\\x6a\\xd5\\xdf\\x3a\\x81\\xaa\\xf2\\xe6\\xde\\x09\\xf7\\x00\\x19\\x5a\\xe2\\xc1\\xd4\\x60\\x96\\x47\"},\n{{0xd4,0xa7,0xa9,0x52,0x4d,0x30,0xa6,0x33,0x7c,0x0a,0x0b,0xe9,0x5c,0xa9,0x05,0x91,0xde,0x98,0x88,0x03,0x8e,0x3e,0x59,0xe1,0xb2,0x5a,0x41,0x81,0xef,0x94,0x66,0x29,},{0x9f,0xc3,0xeb,0xd1,0x39,0xcc,0x5b,0x7c,0x0e,0x05,0xaf,0x47,0xbf,0xf6,0x61,0x9b,0x81,0x28,0x15,0xbb,0x01,0xce,0xec,0x39,0x2a,0x3f,0xf0,0xae,0xc3,0x81,0x1d,0x2c,},{0xd1,0x57,0x88,0xbc,0xd8,0x8d,0x1d,0x81,0xb9,0xe6,0x1d,0x4f,0xe2,0x6e,0xa4,0x9e,0x66,0x81,0x9a,0x59,0xd2,0xae,0x48,0x32,0x32,0x1b,0x81,0x4d,0x50,0x62,0xfa,0xdb,0x87,0x80,0x7d,0xb6,0x85,0x2e,0x1d,0x82,0x95,0xe3,0x1a,0x29,0x1b,0x1e,0x78,0x5d,0x01,0xd8,0x34,0x89,0x5f,0x88,0xf4,0x00,0xdf,0x88,0x32,0xc1,0x60,0x7b,0x5b,0x0c,},\"\\x17\\x19\\x80\\xc0\\x3f\\xdf\\x7a\\x72\\x7b\\xd5\\xba\\xb3\\xba\\x09\\x45\\xe6\\xad\\x5f\\xaf\\x0a\\x7f\\x50\\x6a\\x56\\xd1\\xd0\\xed\\xd9\\xa3\\x06\\xb3\\x15\\x8d\\x84\\x32\\x66\\xd3\\x09\\x1f\\xc1\\xe4\\x22\\x81\\xdf\\x97\\x55\\x9a\\x22\\x01\\xf5\\xbd\\xdd\\xfe\\x68\\x3d\\x0e\\x10\\x28\\xd1\\xd9\\x5b\\x2f\\x31\\x3b\\x48\\x4c\\x39\\x2f\\xfd\\xb1\\xcd\\xf8\\x85\\x08\\xaf\\xde\\x3d\\x6f\\xd2\\xa1\\x28\\x88\\xba\\xce\\xde\\xb7\\x9f\\xf3\\xdb\\x40\\xc9\\xac\\x0e\\xc3\\xfb\\x90\\x1b\\x22\\x86\\x98\\xad\\xf8\\xd8\\x45\\xff\\x4f\\xce\\x10\\xde\\x55\\xd4\\x24\\x36\\xdc\\xe9\\x30\\x97\\x3a\\x34\\xbe\\x05\\xd1\\x40\\x1f\\x33\\x4d\\x4c\\xe8\\xe3\\xa7\\x93\\x79\\x9e\\xaf\\xdb\\x94\\xd0\\xf2\\xab\\x09\\x50\\xb0\\x79\\xe6\\x65\\x3e\\xeb\\x49\\x9f\\xc7\\x44\\x7c\\xcb\\xee\\xed\\x8d\\xbd\\x54\\x56\\x80\\x8c\\xd7\\xa3\\x8f\\x9a\\x15\\xa2\\xa9\\xc7\\x38\\xd6\\x13\\x34\\xca\\xb8\\xce\\xeb\\xbb\\xf4\\xa4\\x81\\x4d\\x94\\xc6\\x18\\x59\\x17\\x87\\x84\\x60\\x4e\\x0c\\x21\\x54\\x59\\x7e\\x72\\xcf\\x58\\x7c\\xd1\\xf5\\xda\\xfe\\x59\\x22\\x05\\x18\\x90\\xe7\\x6d\\x61\\x6d\\x8c\\xd5\\xb0\\x5d\\x64\\x78\\xd0\\x62\\x6e\\xa8\\x3c\\xe8\\x08\\xc4\\x61\\x43\\xe6\\xfb\\x06\\xb4\\x18\\x2d\\x22\\x8d\\xa8\\xf6\\xd4\\x13\\x9e\\xca\\x5b\\x8f\\x3b\\x1b\\x98\\xaf\\x68\\xc5\\x9b\\x4b\\x5a\\x53\\xc1\\x36\\xee\\x90\\x43\\x2a\\xca\\x2b\\xb9\\x15\\x52\\x9d\\x26\\x36\\x79\\x49\\x82\\x62\\x33\\xb4\\x3e\\x55\\x80\\x4b\\x55\\xfc\\x9f\\x21\\x5e\\xb0\\xb0\\xb7\\x92\\x91\\x46\\x5b\\xb3\\x4e\\xda\\xea\\xdf\\xfa\\xbf\\xe6\\xcf\\x41\\xbc\\x07\\xb5\\xdd\\x4d\\x01\\x42\\xf0\\x36\\x1f\\x05\\x8e\\xe1\\xb3\\xb9\\xfc\\xc1\\x96\\xeb\\x9b\\x35\\xb1\\x34\\xbe\\x3d\\x1d\\x23\\x20\\x04\\x48\\x9e\\x8f\\x69\\x93\\xf6\\x25\\xa6\\x30\\x15\\xbc\\xd3\\xf1\\xe8\\x75\\x88\\x32\\x48\\x58\\xcc\\xfb\\x77\\x0d\\xdd\\xd8\\x94\\xbf\\x29\\x7b\\xd7\\x63\\xef\\x58\\x28\\xe2\\x1f\\x5c\\x89\\xaa\\x98\\xcf\\xbc\\x1c\\x08\\x2d\\xd7\\xfb\\xaa\\x43\\x07\\xbd\\xa4\\x0b\\x4a\\x75\\x8c\\xa8\\xf3\\x9f\\x4e\\x4a\\xae\\xd3\\x09\\x04\\x12\\x68\\xdb\\xcf\\x0a\\xf3\\x2d\\xe0\\xd7\\xfa\\x90\\xa5\\x23\\x96\\x3b\\x78\\x0b\\x6a\\x93\\x2c\\xf8\\x94\\x99\\x02\\x5f\\x0e\\x0d\\x04\\x74\\xc7\\x43\\x48\\x94\\x75\\x10\\xe6\\xc5\\xec\\x7c\\x9e\\x05\\x06\\x6e\\xeb\\x4a\\x73\\x52\\x0c\\x3d\\x92\\x7c\\x39\\xac\\x26\\xad\\x75\\x96\\x32\\x5b\\x2c\\xc4\\x7c\\x5e\\x82\\xa7\\x75\\x45\\x5b\\x7a\\xf0\\x31\\x20\\xb1\\xcf\\xbf\\xd6\\xec\\x3f\\xc0\\xc3\\xbe\\x60\\x78\\xb0\\x0c\\xfd\\xf8\\x34\\x2a\\xe8\\xbf\\x14\\x71\\x59\\xf5\\x0e\\x9d\\x56\\x4e\\x2f\\x68\\x30\\x6d\\xae\\x3c\\xae\\xdd\\x10\\x19\\xf3\\x23\\xc4\\x78\\xa1\\xe1\\xf6\\x75\\x98\\xdd\\x83\\x4b\\xd1\\xd1\\xa8\\x73\\x3f\\xd7\\xfd\\xd8\\xa8\\x76\\x52\\x6c\\x53\\x15\\x18\\x93\\x6e\\xdb\\x72\\xd0\\x16\\x56\\xb3\\x44\\xc7\\xd6\\x5a\\xc1\\xce\\xe3\\x7c\\xe5\\x99\\x7b\\xa4\\x8d\\x3f\\x4d\\x06\\x4d\\x88\\x05\\x7e\\xfe\\x9a\\x48\\x2d\\x9e\\x00\\xab\\x5c\\xae\\xb5\\xac\\xa2\\xd6\\x60\\xe3\\x37\\xbd\\x15\\x48\\x73\\x65\\x69\\x79\\x56\\xa5\\xe4\\x7b\\x02\\xab\\xdc\\x30\\xd8\\xe3\\x53\\xfe\\xd4\\xe1\\xac\\x41\\xd2\\xbc\\x21\\x20\\x02\\x11\\x43\\x63\\x59\\x35\\xc6\\x20\\x18\\x6a\\x52\\x2b\\xde\\x54\\xbe\\x04\\x46\\xfb\\xd2\\xdc\\x88\\xb5\\x63\\x04\\xb3\\xa6\\x42\\x27\\xd0\\xac\\xd5\\xf8\\x5a\\x6b\\x67\\x87\\xa3\\xad\\xcf\\x2d\\x7c\\xfc\\x86\\xc6\\x34\\xb4\\xd7\\xab\\x43\\x15\\xb9\\x7d\\xe9\\xe6\\x66\\xcf\\xf3\\xff\\x1b\\x88\\xf3\\x29\\x5e\\x7b\\xab\\x9e\\x9f\\xd4\\x6f\\xaf\\xdd\\xb4\\xf5\\xfa\\xc5\\x1c\\xc0\\x17\\x01\\x29\\xc6\\x51\\xb4\\xef\\x4d\\x39\\x50\\xd6\\x94\\x2f\\xf0\\x20\\xd1\\x66\\x8a\\x52\\x8b\\xde\\x1d\\xa9\\x36\\xc0\\xec\\x1a\\xe0\\x9e\\x84\\xf8\\x20\\x58\\x61\\xff\\xf4\\x91\\x50\\x2a\\x87\\x2c\\x81\\x54\\xa9\\x6e\\x7e\\xa2\\x5e\\xda\\x95\\x5a\\x7f\\xd2\\xe4\\xb4\\xc7\\xa8\\xd2\\x73\\xf6\\x0b\\xc7\\x4f\\xab\\x7b\\x49\\x68\\xca\\x6f\\x75\\xda\\xea\\x50\\x40\\xf8\\x39\\xfd\\x56\\xc2\\xa9\\x80\"},\n{{0xd0,0x8f,0x4b,0xab,0xba,0x3b,0x53,0x65,0xfa,0xf7,0x38,0x79,0x5c,0x9d,0xa4,0x5d,0xb1,0x86,0x2c,0xb2,0x8b,0x93,0xeb,0x66,0x35,0xd1,0x32,0x0d,0xa0,0xf4,0xd9,0x37,},{0xef,0x31,0xb4,0x54,0xf7,0x34,0xe5,0x2b,0x34,0x38,0xee,0x2f,0x1c,0xbc,0x35,0x63,0x1b,0x19,0x69,0xde,0x54,0xac,0x98,0xfe,0x46,0x33,0xf2,0xf5,0x00,0xac,0x87,0x12,},{0xac,0xeb,0xe4,0xc8,0x6f,0xa9,0xfe,0x2c,0x1a,0x5c,0x57,0x6a,0xc0,0x50,0x1e,0x8a,0xb0,0xf6,0x40,0xfa,0x40,0x38,0x05,0x36,0xfc,0xf9,0x50,0x59,0xd5,0x3d,0x4a,0x35,0x55,0xd2,0x20,0xac,0x36,0x35,0x87,0x17,0x5e,0x4b,0xde,0x16,0x3c,0x0d,0x00,0x65,0x0a,0x12,0x96,0x3d,0x46,0x76,0x6c,0x99,0xbb,0x62,0xbf,0x75,0x73,0xe2,0x87,0x0c,},\"\\xa3\\x94\\xd8\\x85\\x4c\\xeb\\x5c\\x43\\xaf\\xee\\x1a\\x48\\x92\\x6b\\xbd\\x66\\x85\\xaa\\x8a\\xec\\xfd\\xcf\\x85\\x41\\x33\\x33\\x39\\x74\\xd6\\x24\\xbf\\x2f\\x1f\\x9c\\x30\\xf0\\x05\\xbb\\xf3\\x4c\\xee\\x3a\\xfe\\x2b\\x29\\x06\\x00\\xee\\xae\\x6f\\x1d\\xd1\\x2a\\x0c\\x34\\x6f\\xbb\\x2a\\xb9\\xc9\\x16\\xc5\\xd5\\xd8\\x0d\\xcd\\x87\\x88\\x78\\x75\\xa0\\xac\\x84\\x76\\x78\\x03\\x9f\\xdc\\xd3\\xa9\\x79\\x35\\x41\\xf5\\xd6\\x75\\x14\\x3a\\x6a\\xba\\xdc\\x3b\\x18\\xf0\\xfe\\xf5\\x10\\x8c\\x19\\xc2\\xdb\\xfb\\x59\\x71\\x0e\\xef\\x98\\x66\\xa4\\xf3\\xf2\\x97\\xa0\\x9e\\xe4\\x8c\\x68\\x03\\x00\\x7d\\xd6\\xba\\x8f\\xd4\\xbe\\x84\\x1c\\xfb\\x10\\xff\\x05\\x14\\xc3\\x0f\\xc4\\xdd\\x49\\xa3\\xcd\\x43\\xbb\\xd1\\x6e\\x46\\x04\\x43\\xa1\\x1a\\xfe\\x64\\x9e\\x90\\x1d\\x63\\xd8\\x9a\\xf5\\x98\\xaa\\x68\\x6b\\x2f\\x60\\x7e\\xc1\\x1f\\x35\\xe1\\x7a\\x79\\x8a\\x42\\x13\\xb7\\x5a\\x38\\x78\\x8d\\xa4\\xf2\\x7c\\xf2\\xb0\\x2c\\xad\\xdf\\xe6\\x1c\\x37\\x29\\xa8\\x7e\\xc6\\xe6\\xb0\\x98\\xf6\\x8e\\x7a\\xed\\x28\\xa8\\x00\\xc4\\x84\\xdf\\xa0\\x13\\x04\\x01\\x20\\x8f\\x98\\x6d\\x79\\x2f\\x54\\x63\\x5a\\xdd\\x28\\x48\\xe1\\x51\\x26\\x2a\\x36\\x5e\\xb2\\x1e\\x27\\x27\\x19\\x1e\\x1f\\x70\\x0f\\x3b\\xf5\\xc7\\x3b\\x0f\\xb4\\xc5\\x46\\xd0\\x04\\x8a\\x15\\x5c\\x18\\x71\\x79\\x20\\xfc\\x04\\x25\\xc8\\xc8\\xfa\\x8f\\x16\\x7c\\x43\\xa2\\x77\\xbb\\x36\\x6e\\x0a\\xd7\\x02\\xc8\\x9b\\xc5\\xaa\\x06\\xfd\\x47\\x09\\x43\\xbe\\x05\\xcb\\x9e\\x32\\x59\\x78\\x72\\x29\\x71\\x4c\\x30\\xa4\\xe8\\x7b\\x00\\xa6\\x33\\xaa\\xf7\\xbe\\x6b\\x58\\x75\\x01\\x0d\\x12\\xe1\\x07\\xc9\\xa5\\x26\\x1c\\xa5\\x62\\xd6\\x70\\x25\\xbe\\xa0\\xfe\\x22\\x34\\x63\\xed\\xb9\\x2e\\xa0\\x1c\\xca\\x92\\xc4\\x4f\\xf2\\x4d\\xa9\\xd8\\xa8\\x0a\\x64\\x21\\xf3\\xd4\\x13\\x5d\\x64\\x7d\\x1b\\xb0\\xfd\\x98\\x8c\\x46\\xc8\\xa1\\x70\\xce\\xb4\\xf3\\x3f\\xff\\x9c\\x0f\\xfb\\x6a\\xba\\xd1\\x09\\x2c\\x84\\xdf\\xad\\x82\\x90\\x89\\x8b\\x24\\x95\\x16\\xa2\\x92\\xe8\\xda\\x96\\xfd\\x51\\xa8\\x10\\x05\\xee\\xcf\\xde\\xbb\\x05\\x93\\x30\\x99\\x27\\x7d\\x07\\x3a\\x48\\x0c\\x3f\\x9e\\xb8\\xaa\\x11\\x96\\x8c\\x4d\\x8d\\xc0\\x78\\x7a\\x9a\\xec\\x3e\\x05\\x27\\xb7\\xfe\\x4c\\x06\\x35\\x41\\x13\\x35\\xa1\\x81\\x16\\x89\\xe8\\x8f\\x6d\\x5c\\xed\\x0d\\x40\\xd6\\xb4\\x8b\\x7f\\x2d\\x99\\x29\\x52\\x93\\x48\\x94\\x15\\x30\\x76\\xa8\\xd3\\x73\\x72\\xfa\\x00\\xd9\\xce\\xfc\\x5c\\xf8\\xc2\\x6a\\xdb\\x5a\\xcf\\x32\\x5a\\x01\\xcd\\x00\\x5a\\xb8\\xd4\\x74\\xa5\\x2d\\x67\\x11\\x40\\x78\\xc6\\x51\\x6a\\xef\\x80\\x4b\\xba\\x19\\xb8\\x87\\xa2\\x8e\\xd5\\xe4\\x6e\\xe9\\x99\\x5e\\x5a\\xd3\\xa8\\x2f\\xb9\\xcd\\x93\\x28\\x34\\x33\\x68\\x09\\x21\\x11\\x4b\\x4d\\x9a\\xf8\\xfc\\xb6\\xb2\\xb5\\x35\\x83\\x9c\\x36\\xde\\x8d\\xf1\\x2b\\x17\\xea\\x6d\\xdc\\xfc\\xb3\\x33\\x4f\\xf4\\x0e\\x6c\\xf0\\x4c\\xcd\\x5c\\xa6\\x40\\x3b\\xa0\\xb6\\x2b\\x4c\\xb7\\x1b\\xbd\\xe9\\x1d\\x8b\\xab\\xda\\x69\\x15\\x2c\\x9c\\x93\\xae\\x76\\x9b\\x55\\x29\\xc8\\xd5\\x2f\\xd9\\xa6\\x90\\x9a\\x15\\xe1\\xa0\\x60\\x1a\\x71\\x46\\x49\\xc9\\x6e\\xc9\\x96\\xc1\\x70\\x6d\\x10\\x21\\xb9\\x74\\x87\\x98\\x0d\\x7b\\x2c\\x2a\\x39\\xbb\\xb0\\xe4\\x70\\xd8\\xe4\\x6a\\xc4\\xaa\\x60\\x9a\\x09\\x22\\xc9\\xbd\\xc0\\x16\\x12\\xea\\xde\\xac\\xcd\\x5f\\xa5\\x23\\xb2\\xa8\\xd0\\xe6\\x2f\\xfe\\x56\\x28\\x16\\x47\\xd6\\x1f\\xff\\xbb\\xc8\\x40\\x53\\x57\\x45\\xd1\\x44\\x25\\x9c\\xc8\\x13\\x00\\xfe\\x99\\xdf\\xbf\\xfe\\xa6\\xb0\\xb9\\xbc\\xd2\\x84\\x73\\x98\\x2d\\x32\\xe9\\x3e\\xd4\\x66\\x34\\xa9\\x98\\x79\\x06\\xd6\\xf4\\x89\\x39\\xd8\\xdf\\xbf\\xb3\\x7d\\x33\\xb8\\x88\\xdb\\x60\\x8c\\xb2\\xff\\xe3\\x9a\\x8c\\xf6\\x7b\\x72\\x64\\x46\\x11\\xc7\\xd3\\x2a\\x4a\\x8d\\xf6\\x12\\x46\\x8c\\xd5\\xe5\\xd7\\x5f\\xbb\\xa7\\x9e\\x63\\x8a\\xa1\\xda\\xa2\\x8c\\x4e\\x0e\\xeb\\x9a\\x63\\x7f\\xf8\\xa0\\x8b\\x65\\xf7\\xa7\\x61\\x24\\x14\\xdf\\x76\\xbc\\x7b\\x0b\\x56\\xb5\\x53\\x7d\\x66\\x6f\\xac\\xfd\\xda\\xf6\\x5a\\xf1\"},\n{{0x8f,0x47,0x4f,0x88,0xcf,0x86,0x3c,0x48,0x54,0x56,0xa5,0xa2,0x15,0x52,0x81,0xff,0x27,0xb2,0x84,0x59,0xf6,0x3b,0xc4,0xf1,0xdb,0x00,0xe0,0x03,0x10,0x64,0xf6,0x49,},{0x43,0x14,0x4a,0x32,0x9d,0x75,0x1d,0x04,0xe0,0x71,0x69,0xb7,0x79,0xee,0x92,0x0d,0xd0,0x29,0xcb,0x44,0x5b,0xf3,0x76,0xba,0x3a,0x66,0x85,0x72,0x18,0x23,0x44,0xa3,},{0xf6,0x1f,0x78,0x07,0xc3,0x3e,0x19,0x6d,0x0f,0xe1,0x82,0xef,0xa4,0xd4,0x51,0x6a,0x98,0x15,0xdd,0xd4,0x49,0x53,0x8b,0xba,0xa6,0xb8,0x6b,0x69,0x01,0xa0,0x5f,0x5d,0xdd,0xa0,0x60,0x1e,0xc9,0x0f,0x39,0xf1,0x55,0x47,0x79,0xdb,0x7a,0x09,0xa6,0x05,0x72,0xef,0xfd,0x4d,0x12,0x8d,0x0d,0x3c,0x2d,0xd4,0xe8,0x83,0x57,0x4b,0xc6,0x0b,},\"\\x84\\x08\\x91\\xd9\\x48\\xec\\x19\\xc8\\xc7\\xf7\\xc9\\xd3\\xc4\\x77\\x53\\x62\\xa5\\x44\\xa0\\xec\\x97\\x45\\x7a\\xb5\\xd1\\x4e\\x12\\x5d\\xc5\\x4b\\x59\\xc8\\xdc\\x9a\\x63\\x5e\\x7b\\xad\\xb6\\xbe\\x73\\xc3\\xa5\\x8d\\xc0\\xe9\\x92\\x9f\\x2b\\x42\\x0d\\x83\\x56\\xd6\\x17\\xc3\\xd4\\x1b\\xfe\\x69\\xb4\\xe1\\x58\\xd4\\xbf\\x08\\xfb\\x17\\xe6\\x88\\xd3\\xcf\\x3c\\x94\\x8b\\x69\\xb3\\x5f\\x0b\\x6d\\xb6\\x62\\x72\\xa8\\xeb\\x2b\\xd4\\x10\\xd6\\x50\\x9f\\x6c\\x82\\x8b\\x6a\\x20\\xd6\\x58\\x6e\\xaf\\x85\\x76\\x01\\xed\\x9d\\x60\\x54\\x79\\x9c\\x25\\x32\\x0e\\xba\\x80\\x77\\xfe\\x1a\\xe2\\x26\\x71\\xb3\\x3a\\x15\\x88\\xff\\x2b\\x23\\x5d\\x3c\\x71\\xa2\\x7c\\xe5\\xc6\\xc6\\x6e\\x18\\x88\\x91\\x98\\xd1\\x16\\x93\\x36\\x76\\xbc\\x4f\\xb0\\x71\\x0d\\xb7\\xff\\x1a\\xc2\\xf2\\x0c\\xe3\\x69\\xbe\\xf5\\x6b\\x43\\xcd\\x1d\\x40\\x6c\\xef\\xda\\xcf\\x00\\xf1\\xf3\\x48\\xb8\\xca\\x7a\\xa6\\x14\\xdb\\x11\\xa3\\xa6\\x40\\xfd\\xb5\\x93\\x89\\xd1\\xa6\\xa3\\x94\\x75\\x5c\\x13\\x3f\\x1b\\x01\\x9c\\x83\\x08\\xca\\x5a\\x95\\x1e\\x73\\xb8\\x10\\xa1\\x80\\xf6\\xff\\x25\\xb2\\x9d\\xbb\\xcc\\xef\\x4c\\x13\\xa9\\x75\\x03\\x39\\x39\\x07\\xa2\\xdb\\xa0\\x96\\xa8\\xce\\x5c\\x86\\xc0\\xee\\x6f\\x97\\xc1\\x44\\x1b\\x8d\\x63\\x31\\xcb\\xa5\\x3b\\x19\\x60\\x6b\\x42\\x1a\\xf5\\x2f\\x65\\xf9\\xc6\\x63\\xe6\\x3d\\x39\\x82\\x71\\x8f\\x94\\x8c\\x6b\\xae\\x96\\x1b\\x8e\\x4b\\xf8\\xcd\\x9e\\x31\\xcd\\x09\\x92\\x8e\\x4e\\x80\\x61\\x65\\x97\\xcc\\xfa\\xdc\\xb8\\xa6\\x14\\x15\\x49\\x33\\xbc\\x37\\x58\\x9c\\x85\\xc7\\x76\\xe3\\x4e\\x5a\\x90\\x66\\x0f\\x59\\xa6\\x5b\\x5e\\x93\\xad\\x43\\x88\\x42\\xf9\\x82\\xd0\\x2b\\x04\\x1e\\x6d\\xbd\\xdf\\x17\\x10\\x99\\xf8\\xdb\\x70\\x99\\x57\\x31\\xa0\\xdb\\x8c\\x46\\x25\\xc9\\xbc\\xa7\\x10\\x80\\x59\\x61\\xfb\\x17\\x6d\\xae\\x81\\x97\\x68\\xfc\\xad\\x7f\\xf9\\xbf\\xce\\x36\\x40\\x3c\\xa7\\xf7\\x83\\xe7\\x61\\x37\\x26\\xd7\\xdc\\x59\\xf2\\x4e\\x24\\x7c\\xf1\\x50\\x68\\xff\\x3b\\x19\\xc7\\x25\\xfa\\xd6\\x5e\\xa8\\xe8\\xa7\\xf7\\x22\\xd5\\x28\\xc9\\x5f\\xce\\xf1\\xc0\\xcc\\x79\\xd1\\x8e\\xf0\\x7c\\xee\\x8b\\x01\\x1e\\xea\\xbd\\x99\\x21\\x63\\x4d\\x76\\xa6\\x1a\\x8a\\x3c\\x89\\x31\\xb8\\x27\\xe8\\x18\\x98\\x81\\xf8\\x1f\\x7a\\x17\\x5f\\x21\\xfb\\x03\\x78\\xb8\\x18\\x8e\\x58\\xbd\\xb2\\x01\\x7b\\xef\\x39\\x0f\\x18\\x00\\xd9\\xd7\\x4f\\x26\\x3a\\x81\\xdf\\x8e\\x67\\x52\\x2d\\x09\\x2e\\x77\\x5d\\x01\\xe0\\x04\\xe7\\xf8\\xd8\\x28\\x1a\\xe2\\xc2\\xfd\\xf8\\xc3\\xa4\\x45\\xf9\\xef\\xf7\\xfd\\xf1\\x3f\\x26\\x1a\\x77\\x3d\\xdf\\x2d\\xd9\\xcc\\x6b\\xa5\\x58\\x5d\\x99\\x0c\\x99\\x5e\\x6e\\xb8\\x9d\\xff\\xd9\\xff\\x0a\\x9d\\xbb\\x76\\xce\\x5e\\x10\\xdd\\x02\\x72\\xd5\\x00\\x14\\x97\\x88\\x13\\x66\\xf5\\xd6\\x36\\xa9\\xcc\\xea\\xa2\\x83\\x22\\x8d\\x3a\\xc6\\x14\\xdb\\x21\\x7a\\xb8\\x91\\xd6\\x68\\x9d\\xbe\\xb9\\x50\\xe1\\x20\\x0c\\x3d\\xe5\\x3b\\xc5\\xda\\x07\\xf1\\xd3\\x63\\xda\\xe9\\xbe\\x6e\\xc3\\x6e\\xda\\x6e\\x68\\x7d\\x26\\x29\\x0f\\x7a\\xbc\\xa2\\x68\\xa7\\xfa\\x03\\xd9\\x31\\x88\\x64\\xed\\xa9\\xa1\\x1e\\x3b\\x26\\x14\\x06\\x05\\x92\\x0a\\xc1\\x3a\\xde\\xc1\\xb5\\x54\\x8c\\x9a\\x7a\\x32\\x15\\xa5\\x87\\x6b\\x7e\\x94\\x1a\\xfa\\x1c\\xb5\\xd7\\xf7\\xf0\\xc1\\x16\\x30\\xcd\\x42\\x9f\\x3b\\x2b\\x37\\xdc\\x76\\xc6\\xcb\\xea\\x4f\\x3b\\x72\\x6a\\xa8\\xa5\\xf8\\xb9\\xf7\\x05\\xb0\\x5d\\x7e\\x94\\x51\\x95\\x6f\\x8a\\xf1\\x3c\\xe0\\xa8\\x59\\x55\\xc7\\x13\\x5d\\x64\\xad\\xe5\\x49\\x6e\\xa5\\x42\\xe7\\x0f\\x8d\\xa5\\xb5\\x73\\xaa\\xf1\\x37\\x08\\x5d\\xc9\\x6c\\x69\\x27\\x09\\x96\\x95\\x67\\x26\\x68\\xb3\\xc7\\xc6\\xf9\\x3c\\x97\\x7a\\x4e\\x8e\\x9e\\x77\\x02\\x95\\xf2\\x0d\\x52\\xdf\\xf1\\x87\\xf8\\xdb\\xb2\\x5e\\xe7\\xe7\\x74\\x02\\x4e\\xb9\\xbe\\x08\\x12\\x1e\\xd7\\x4b\\x6d\\x54\\x62\\xf4\\xbb\\x7d\\xc2\\x00\\x38\\x74\\xca\\xa3\\x1b\\xb7\\x59\\x5c\\xd9\\x3a\\x99\\xeb\\xe1\\xef\\xf9\\x28\\xbb\\x5f\\xcb\\x9e\\x9c\\x89\\xdd\\x31\\xd4\\x87\\xfc\\x0e\\x20\\xbb\\xe1\\x50\"},\n{{0xe4,0x2b,0x30,0xd4,0x9c,0x43,0xc4,0xfa,0xd8,0x3d,0xd5,0x1f,0xdc,0x2a,0x4a,0xc5,0x90,0x13,0x27,0xad,0xd8,0x00,0xb6,0x69,0x72,0xc8,0xc7,0x0b,0xde,0x18,0x0a,0xdc,},{0xf7,0x34,0xaa,0xfa,0xa4,0xdb,0xaf,0x31,0x5c,0x25,0x8c,0xca,0x8b,0xbc,0x1d,0x4f,0x34,0xe8,0x36,0x01,0x10,0x98,0x74,0x22,0x2a,0xa0,0x55,0x89,0xf3,0xa6,0x63,0x5f,},{0xff,0x8e,0x07,0x6e,0x34,0x3c,0x8b,0x73,0xaa,0x45,0x3b,0xfe,0xe9,0xb2,0xba,0xb6,0xd5,0xc2,0xf7,0x4c,0x35,0xe1,0xba,0xd1,0xe5,0x2a,0xe7,0x77,0xd6,0x9f,0x79,0x76,0x40,0x83,0xf9,0x94,0x36,0x8a,0x1a,0xc8,0x51,0xa6,0x41,0xcd,0x24,0x70,0x08,0xa3,0x4f,0x3b,0x60,0x89,0x62,0xf4,0xdd,0x51,0x09,0xac,0x71,0xcc,0xe9,0x78,0xec,0x02,},\"\\x0d\\x49\\x70\\x51\\x86\\x1e\\x22\\xd8\\xa9\\xc6\\x0e\\x5f\\x7d\\xe6\\xc8\\x95\\xcb\\xa3\\x35\\xb2\\xe8\\x2e\\x60\\x21\\x18\\xad\\x83\\x42\\xb4\\xd4\\xed\\xaa\\x80\\xf9\\x5e\\xfb\\xb5\\x9c\\xfd\\xa1\\xfc\\xc0\\x29\\x17\\x25\\x70\\x0e\\x8a\\x81\\xbb\\x12\\xa0\\xb8\\x62\\x3b\\x1f\\xe2\\x89\\x1b\\x8d\\x98\\xf7\\xa8\\x4c\\x59\\xfd\\x92\\xf8\\xa7\\xad\\xfc\\x06\\x50\\x42\\xf7\\xf4\\xfd\\x7e\\x1a\\x79\\xf5\\x5a\\x1d\\x4d\\x5e\\x54\\xe0\\x4e\\x67\\x2f\\x1c\\x9e\\x4c\\x4c\\xd8\\xd0\\x00\\x3f\\x3c\\xd5\\x4b\\x76\\xe2\\x16\\x3d\\xd7\\x37\\xac\\xb2\\xde\\x5c\\x26\\x3a\\xc1\\x02\\xa4\\x8f\\x69\\x6b\\x60\\xca\\xf9\\xbe\\x39\\xc6\\x65\\xcc\\xe1\\xe0\\xf3\\xd4\\x98\\x55\\x3f\\x57\\x90\\x61\\x88\\x9a\\x5e\\xc5\\x60\\x3e\\x4d\\x14\\x1c\\xfd\\xed\\xe8\\xe7\\x31\\x75\\x72\\xcf\\xe7\\x6a\\x0f\\x48\\xe4\\xae\\x06\\x06\\x2c\\x91\\x57\\xb5\\xea\\xac\\x34\\x68\\x93\\x81\\x92\\xdb\\x4b\\x16\\x10\\x5c\\x73\\x64\\xa9\\x44\\x32\\xb2\\x15\\xa7\\x17\\x97\\xfe\\xe1\\x4c\\x3c\\x9c\\xe2\\xf7\\x46\\xed\\x79\\x03\\x02\\xfc\\x41\\xdc\\x49\\x2d\\x37\\xd9\\xef\\x02\\x4a\\xb5\\x1d\\xa3\\xbd\\xaf\\x0f\\x81\\xd9\\xa9\\x30\\xaa\\x0e\\x02\\x5c\\x04\\xfd\\x71\\x02\\x6b\\x6a\\xfe\\xb7\\xed\\x01\\xa9\\x1a\\x1e\\xfd\\x6c\\x39\\xf5\\xe4\\x47\\xc6\\x6d\\xd3\\x8a\\x76\\x56\\xc6\\x13\\xd0\\x21\\x26\\xf3\\x58\\x5d\\xfa\\xa0\\x2d\\xf9\\x30\\x25\\x3f\\x83\\xbd\\x42\\x19\\x64\\x63\\xeb\\xc5\\x0f\\x8c\\xfc\\x94\\x9e\\xd3\\x50\\x39\\x2e\\x61\\xce\\xec\\x13\\x09\\xda\\x15\\xa4\\x32\\xf8\\x0d\\xfe\\x94\\x8e\\x26\\x1c\\xe6\\xd8\\x42\\x1c\\x54\\x59\\xcd\\x21\\xf3\\xff\\xa2\\xed\\xb5\\x00\\x98\\x2b\\x2a\\xbf\\xa5\\x2e\\x82\\x43\\x7c\\xa2\\x30\\xf6\\x09\\x11\\x63\\x20\\xd9\\x89\\x3e\\xb8\\x2a\\x14\\xdf\\x72\\xb7\\x73\\x66\\x67\\x51\\x6f\\xc0\\x12\\xb2\\x8a\\x03\\xc9\\xdd\\x88\\xea\\x43\\x08\\xd8\\xce\\xea\\x44\\xcc\\x60\\x44\\x54\\xcd\\xfa\\x2c\\x79\\x76\\x15\\xbc\\x0a\\x6b\\x3e\\x00\\x89\\xaf\\x0a\\x81\\xbe\\x54\\xd1\\xb1\\x10\\xa1\\x3a\\xb9\\x11\\xb4\\x52\\xc3\\x42\\x80\\x0c\\xee\\x2a\\xd2\\x39\\xa2\\xb1\\x88\\xa7\\xfa\\x87\\x5e\\x94\\x1d\\xaa\\xeb\\xcf\\xc8\\x8b\\x70\\xae\\x4b\\x1c\\x57\\x5c\\xdb\\x6e\\x6d\\x89\\x44\\x81\\x36\\xf6\\x0e\\xe8\\x1c\\x70\\x3c\\x47\\x82\\x2d\\x2c\\x0e\\x50\\xc7\\xf1\\xe8\\xb7\\xfc\\x7e\\xbd\\x80\\x78\\x9f\\xcd\\x7e\\x06\\xc7\\xe5\\x0b\\x5f\\xc8\\xb7\\x76\\xe8\\xb9\\xa4\\xcd\\x59\\x05\\xa2\\x90\\x69\\xbc\\x3a\\x55\\x8d\\x7c\\xab\\xce\\x2a\\xf4\\xf3\\x10\\x76\\x7d\\x5b\\x11\\x7e\\x30\\x76\\xb3\\xa0\\xd5\\x27\\x17\\x55\\x43\\xb2\\xcc\\xea\\x28\\xd5\\xf7\\x16\\xfa\\xc3\\x2e\\xfe\\xd3\\xd2\\xe0\\x27\\x6b\\xe4\\x4a\\x89\\x56\\xfc\\x82\\x40\\xf2\\xdb\\x33\\x97\\x61\\x4f\\x2f\\x2d\\xa0\\x21\\x66\\x69\\x4e\\xc6\\xa7\\xfe\\xec\\x6e\\xce\\x39\\xd7\\x2b\\x64\\xbb\\xc6\\xb4\\x76\\xa4\\xf8\\x4f\\x8d\\x87\\x93\\x80\\xa3\\x84\\x88\\xe4\\xd6\\xe5\\x8c\\xac\\x03\\x90\\xae\\x25\\xa5\\xfc\\xb7\\x3d\\x47\\x41\\x4b\\x4c\\x26\\xbb\\xb9\\xb4\\xcc\\x66\\xe4\\x25\\x94\\xbd\\x56\\xd8\\x41\\xa3\\x60\\x92\\x34\\x91\\xd1\\x17\\xbe\\x2c\\x6e\\xb2\\x32\\x0f\\x3c\\x61\\x75\\xe4\\x4e\\x27\\xb6\\x65\\x3c\\x5d\\xac\\x6f\\xae\\x73\\x60\\x0b\\x67\\x96\\x0d\\xca\\x50\\xaa\\x85\\x5a\\x89\\xe0\\xff\\x51\\x1e\\xa0\\x4f\\x14\\x3e\\x89\\xf1\\xda\\x02\\x84\\x76\\xbe\\x4b\\xf6\\xd9\\x4c\\x80\\xff\\x72\\x63\\x39\\xe8\\xbc\\xfb\\x7d\\xd9\\xf8\\xcf\\x20\\x22\\x59\\xc0\\xac\\xb6\\x27\\x6c\\x28\\x1e\\x38\\x47\\xc2\\xcc\\x8d\\x2f\\xba\\x84\\x43\\x8d\\x2d\\x3c\\x60\\x31\\xf2\\xa7\\xb9\\x5c\\x1d\\x8f\\x9f\\x3c\\xc8\\x6a\\x5e\\xff\\x65\\xcc\\x01\\x1d\\xe9\\x5a\\xd8\\x96\\x85\\x8e\\x1f\\x7f\\x6d\\x6b\\x94\\xbf\\x49\\xdf\\xff\\x5d\\xe2\\xd7\\xfd\\x71\\xef\\x10\\x81\\x34\\x28\\x5f\\x61\\xae\\x47\\x54\\x83\\x44\\x2d\\xc9\\x0b\\xf0\\x13\\xfa\\xed\\xf3\\x77\\x1c\\x47\\xc5\\xb9\\x6d\\xc3\\xcf\\x8e\\x48\\x51\\x00\\x60\\xad\\x8d\\x45\\xfd\\x54\\x61\\x62\\x27\\x80\\xd8\\x69\\xd4\\x61\\x7b\\x57\\xfe\\x3c\\xb5\\xcc\\x02\\x03\\x15\\x3a\\xae\"},\n{{0x5c,0xb5,0x14,0x21,0x74,0x82,0xbf,0x42,0xf6,0x11,0xfc,0xec,0x36,0xa5,0x28,0x68,0x07,0xc2,0xbd,0xbb,0x56,0x96,0x76,0x91,0x35,0x3f,0x54,0x31,0x0e,0x1a,0xd5,0x53,},{0x28,0x06,0x99,0x00,0x3d,0x5d,0x3e,0x1c,0x05,0xad,0x10,0xfb,0x10,0x95,0x9b,0xbc,0x59,0x5c,0xfe,0x21,0x30,0x69,0x96,0x5c,0xd8,0xcf,0x39,0xdd,0x42,0x6a,0x05,0x68,},{0xd5,0x3e,0xe2,0xe0,0xf0,0xfd,0x65,0x7b,0x20,0x52,0x47,0x8f,0xd1,0x5d,0xf1,0xd3,0x8f,0xe0,0xe9,0x3a,0x54,0x83,0xeb,0x4a,0x6e,0x7d,0xe9,0x3d,0x02,0xa4,0xcd,0x54,0x4d,0x8f,0xdd,0xdc,0xea,0x82,0x2b,0x71,0x57,0x6e,0xd0,0x28,0x53,0xd9,0xa6,0xb1,0x4e,0x1a,0x54,0x8a,0xef,0xe9,0x0d,0x92,0xf8,0x83,0x79,0x2b,0x7f,0x1d,0x86,0x09,},\"\\x2f\\x57\\x25\\x8c\\xca\\x79\\x32\\xe5\\x8b\\xed\\x54\\x6c\\xb0\\x04\\x11\\x15\\xbb\\xad\\x23\\xd1\\x83\\x46\\xef\\x7a\\xb5\\xe3\\x11\\x00\\x82\\xb3\\xa9\\x71\\x2f\\x6c\\xbe\\x12\\x70\\xe6\\xdc\\x0c\\xea\\x33\\x64\\xa0\\x6a\\x5f\\x2f\\x28\\x3e\\xc3\\x9b\\x63\\x05\\x8d\\x34\\xd5\\x99\\x79\\x07\\x2f\\xcb\\xbd\\x7a\\x5d\\x0f\\x44\\x2b\\xbd\\xf0\\x82\\xd5\\xbf\\xe2\\x99\\x8a\\xeb\\x51\\xbd\\x26\\x12\\x78\\x03\\xe5\\xc7\\x96\\xc3\\x88\\x43\\x20\\x0a\\xe2\\xf6\\xe6\\x05\\xaf\\x31\\x2f\\x54\\xfd\\xff\\x17\\xed\\x1d\\xfa\\xa8\\x9d\\x28\\xfa\\x67\\xdc\\xe4\\x62\\xde\\x4f\\xe2\\x52\\x68\\x21\\x2b\\x28\\x2e\\x22\\x2a\\x44\\x3e\\x2f\\x31\\xe2\\x69\\x05\\x41\\x71\\xaa\\x73\\xc7\\x19\\xa8\\x96\\xcd\\xb7\\xa5\\x39\\xdf\\xd1\\xd4\\x29\\x91\\x97\\x81\\x97\\xd7\\xc4\\xf2\\xd3\\x0a\\x64\\x1b\\xe3\\x4b\\xf1\\x38\\x0a\\x4f\\x4d\\xc6\\xd9\\xb1\\x01\\x63\\x66\\x36\\xa4\\x96\\xbe\\xb3\\x57\\xe3\\x47\\xc1\\x66\\x65\\x16\\xdf\\x8e\\xb5\\x60\\xa0\\xe0\\xd1\\xe1\\x52\\x9c\\xe3\\x6a\\x60\\xe0\\x0e\\xd2\\x78\\xda\\x38\\x02\\xbe\\x19\\x23\\x42\\x98\\x9b\\xb6\\x11\\xb4\\xe3\\xcb\\xd9\\xc3\\x7e\\x8c\\xce\\x07\\xef\\xc1\\x2d\\x29\\xbe\\xfd\\x7e\\x2f\\x3a\\xdb\\x13\\xd2\\x8f\\x70\\x8d\\x97\\xb6\\x3e\\x10\\x74\\x82\\xc8\\x62\\x95\\x6d\\x7c\\xe8\\xdf\\xc2\\xaf\\x5c\\xac\\x8d\\x51\\x65\\x92\\x67\\xb0\\xbb\\xed\\xdd\\x5e\\xfa\\x41\\x4d\\xde\\xab\\xd1\\x7b\\x23\\xca\\x6e\\x84\\x3f\\xf4\\x9e\\xff\\xc8\\x2a\\x5d\\x07\\xe3\\x6a\\x83\\xb6\\x7c\\x2a\\xd7\\xe4\\x8e\\xb9\\x99\\x0b\\x42\\x1c\\x55\\x58\\x00\\x9b\\xd6\\x93\\x4e\\x86\\xd5\\x4a\\x8a\\x6a\\xc4\\x07\\x87\\x96\\xe3\\x05\\xc7\\xcc\\x81\\x0d\\x3f\\x66\\xea\\x6b\\x95\\x04\\xfe\\x0a\\xe6\\x75\\x7c\\x50\\x4c\\x55\\x52\\x53\\x0a\\x6f\\x8b\\xbb\\x52\\x40\\x9b\\xe0\\x79\\xd8\\xe4\\xa2\\x8a\\x6f\\xd7\\xdc\\x89\\x35\\xf8\\xeb\\x94\\x98\\xad\\xc0\\xf2\\x3d\\x08\\x07\\xec\\x86\\x29\\x5f\\x48\\x98\\xf5\\xd0\\x5e\\x15\\x0b\\xdc\\x43\\xaa\\x8b\\x7b\\xdc\\x89\\x3a\\x0a\\x68\\x4c\\x30\\x63\\x89\\x8b\\x6c\\x95\\xe7\\xd5\\x6a\\x4c\\x10\\x26\\x90\\x43\\x8e\\x9d\\xf9\\x97\\x58\\xa9\\x0f\\x47\\xc6\\x08\\xda\\xcc\\x4c\\xa2\\x40\\x26\\x6f\\xab\\xa3\\x5f\\xa1\\xeb\\x2e\\xaa\\xbe\\x28\\x8d\\x2c\\x2a\\xd5\\x0b\\x6c\\xbf\\x10\\x7c\\x00\\x25\\x75\\xe9\\x1f\\xf4\\x72\\xa4\\x41\\x79\\x40\\x66\\x7b\\xe8\\x18\\x01\\x73\\x85\\x4c\\x93\\xdf\\x84\\x46\\x4b\\xcd\\x31\\x2b\\x7a\\x7a\\xe4\\xdc\\x2b\\x90\\x59\\xfb\\xe6\\xf8\\x3f\\x53\\x80\\x64\\x25\\xbd\\xff\\x03\\x1c\\x6a\\xed\\x6e\\xfa\\xfd\\x9d\\xe8\\xdc\\xd0\\xdf\\xab\\xea\\x8e\\x6f\\xa6\\x81\\xe9\\x91\\x93\\xfb\\x3c\\x64\\x7e\\x44\\x21\\x12\\xc9\\xa2\\x3f\\x59\\x6e\\x65\\x41\\x1d\\x8d\\x6b\\xfc\\x39\\x23\\x00\\x4e\\xce\\x91\\xea\\x6d\\xeb\\x88\\x11\\x11\\xb1\\xdc\\x29\\x94\\x3f\\x57\\x89\\x81\\xee\\x8c\\x3b\\xce\\x85\\x25\\xf7\\x85\\x65\\xf3\\x4b\\x85\\xff\\x20\\x01\\x5f\\xea\\xe8\\x46\\xf9\\x5b\\x18\\x70\\x0b\\xc5\\xcd\\xf1\\x4b\\x2d\\xb6\\xca\\xc6\\x98\\x14\\xd6\\x3d\\x74\\xbf\\x20\\x32\\x93\\x03\\xe5\\xca\\x9f\\x04\\x73\\x1f\\x68\\x81\\xce\\xc6\\xd3\\xab\\xf8\\x7f\\x5e\\xac\\x08\\x73\\x4f\\xaa\\x34\\xcf\\xf4\\xd3\\xcd\\x9a\\x4a\\x11\\xd7\\xb1\\x2f\\x73\\x25\\x3b\\x4d\\xd0\\xa4\\x31\\x78\\xf0\\xd3\\xc1\\x9c\\x0c\\x40\\xd9\\xed\\x91\\x8d\\xd1\\x76\\x46\\xf6\\x16\\xaf\\x79\\xfd\\xf6\\x19\\x42\\x62\\xf0\\xfa\\x4f\\x71\\xb3\\x18\\x7d\\xed\\xca\\x48\\xd9\\xcb\\xcc\\x19\\x93\\x1a\\x15\\x19\\x67\\x74\\x56\\x25\\x6e\\xd3\\x83\\x54\\x56\\x7c\\x3a\\x67\\x57\\x1c\\xdf\\x82\\x17\\x0a\\x2c\\x85\\xbd\\x2c\\x5e\\x68\\xe0\\x5a\\x0f\\x3b\\x93\\x90\\x3f\\x19\\x1b\\x89\\x4f\\x84\\x94\\x6f\\x89\\x00\\x05\\x68\\x05\\x4c\\x1c\\xea\\x9f\\xd0\\xb8\\xbb\\x55\\x01\\x95\\x06\\xc5\\x43\\x41\\xc2\\x49\\x31\\x98\\x45\\x48\\xba\\x45\\x8a\\x4d\\x81\\x30\\x89\\x89\\x6e\\x86\\xa2\\xdc\\x33\\xd9\\x46\\x04\\x00\\x3f\\x35\\x4a\\x7c\\xc9\\x41\\xc7\\x54\\xaa\\xea\\x24\\x25\\x3c\\xbe\\x4c\\xf2\\x14\\x7f\\xfe\\xc5\\xe7\\xb9\\x50\\xcb\\xf2\\x8e\\x28\\x44\\x81\"},\n{{0x87,0xd3,0xba,0x95,0xc4,0x0d,0xf8,0x00,0x69,0xb1,0x79,0x7d,0xdf,0x68,0xe8,0x66,0xe6,0x6d,0x46,0xc5,0x1f,0xde,0x60,0xe7,0x68,0xa9,0xdb,0xc5,0xc9,0x2f,0x57,0xa9,},{0x2b,0x81,0x2b,0x2c,0x9b,0x60,0xff,0x31,0x97,0x5c,0x42,0x9a,0x86,0x73,0x6d,0xcc,0x17,0xa5,0x8d,0x3d,0xc1,0xda,0xa3,0x46,0x23,0xa4,0xbb,0xcb,0xe2,0xcc,0x05,0x81,},{0xfa,0x0d,0x12,0xcd,0x53,0x23,0x6c,0x41,0x08,0x6b,0xea,0x8c,0x0c,0xc6,0x0b,0x77,0x64,0xa3,0xed,0x72,0xbd,0xeb,0x9d,0x1a,0xe5,0xee,0xac,0xb4,0x88,0x11,0xfe,0x52,0x97,0x62,0xa2,0xc6,0xf2,0xbb,0x06,0xd9,0xb3,0x18,0x21,0x8d,0x96,0x8f,0x64,0x44,0x35,0x49,0x7a,0x1b,0xd0,0xd0,0xd8,0xc1,0x61,0x2a,0xb8,0x99,0x6d,0x98,0xd7,0x07,},\"\\xe1\\x12\\x56\\xf8\\x2a\\xd7\\x6f\\x3f\\x4a\\x49\\xd7\\xba\\xd3\\xce\\xd8\\x71\\x8d\\x36\\xd2\\xf2\\xbb\\x3d\\x31\\xbb\\x61\\xed\\xd1\\xec\\xbc\\xee\\x66\\x21\\xfd\\x2e\\xee\\xd3\\xe3\\xde\\xb5\\x97\\xb1\\x49\\xff\\x71\\xb8\\x51\\xf6\\x1c\\x8c\\x68\\x19\\xe1\\x31\\xf9\\xa2\\xaf\\x76\\x73\\xc3\\xf2\\x07\\x02\\xac\\xfd\\xc8\\xb8\\xf9\\x06\\x4b\\x41\\x5c\\x9a\\x3e\\x35\\x56\\x8e\\x37\\x1d\\x74\\x0a\\x38\\x12\\x7c\\x1f\\x27\\xb3\\x91\\xb4\\x5d\\x07\\x04\\x5a\\xea\\xf0\\x0a\\x54\\xe5\\xb7\\xfa\\x54\\x8a\\xfb\\x5f\\x96\\xfe\\xb5\\xf5\\xb4\\x4f\\x60\\xcd\\x17\\x07\\xe8\\xfa\\x95\\x67\\xf7\\x80\\x6e\\x15\\xf6\\xa0\\x1a\\xa0\\x20\\x77\\x73\\x3f\\xe7\\x38\\xb0\\x8f\\x21\\xef\\xbc\\xf9\\x8c\\x19\\xd5\\xb9\\x70\\xe6\\x16\\x3e\\x5f\\xe8\\xf4\\x80\\x0e\\xf9\\xed\\x22\\xa0\\xf9\\xb5\\x12\\x6f\\xf1\\xeb\\x1c\\x7d\\x65\\x01\\x9c\\x8b\\x44\\x03\\x91\\x92\\x70\\x29\\xb8\\x13\\xda\\xb7\\xc7\\xe8\\x63\\xd4\\x82\\x29\\xf8\\xdf\\x85\\x39\\x43\\x45\\xfc\\xc8\\x8a\\x30\\x0f\\x60\\xa8\\xd5\\x16\\xd8\\x77\\xa5\\xa3\\xa7\\xe3\\xc4\\x9a\\x9e\\xb0\\x6c\\xd9\\xf2\\x66\\x5c\\xe2\\xa8\\x90\\x22\\x96\\x2b\\x1d\\x49\\x59\\x2b\\x09\\xc7\\x54\\x3d\\xa8\\x35\\xce\\x63\\xbc\\x9a\\xbb\\x82\\x21\\x45\\x76\\x2b\\x71\\xcb\\xe1\\x50\\x29\\x2c\\xe5\\xc8\\x70\\x4e\\x5a\\xd3\\x4f\\xb4\\x59\\x2f\\x97\\x20\\x44\\xe4\\x3e\\x69\\xf0\\xe1\\x67\\x2d\\x6c\\x83\\xcf\\x25\\xaa\\xc6\\x8e\\xfe\\x3d\\x27\\xaf\\x2a\\xd3\\x42\\x74\\xb9\\xd2\\xb7\\x77\\x42\\xd9\\xc6\\xdf\\xbd\\x57\\xf9\\x2f\\xf6\\x4d\\x3e\\x4c\\x67\\xc5\\x41\\xd8\\x50\\x2a\\x7d\\x03\\x18\\x95\\xaf\\x85\\x31\\x9a\\x4e\\xae\\x2d\\x25\\x43\\x35\\x83\\x5e\\xff\\x11\\xe7\\xa3\\x67\\x1a\\x6a\\x0d\\x21\\xb7\\x2c\\xe1\\xfc\\x2a\\xcb\\xa1\\xa9\\x20\\x18\\x38\\x34\\xbc\\x0a\\x4b\\x73\\xf6\\x39\\xff\\xcb\\x0f\\x6b\\x81\\xcd\\x92\\x0f\\x2e\\x94\\x20\\xd6\\x12\\x16\\x6d\\x56\\x82\\xa0\\x60\\x60\\xea\\x0b\\x6f\\xa6\\x95\\xfe\\xcc\\x77\\x04\\xbb\\xe4\\xb0\\x52\\xaa\\x3e\\xc8\\xf7\\x20\\xf7\\xd4\\xf3\\x2e\\x8a\\xff\\x86\\xb8\\x0b\\x8c\\x1c\\xc1\\x27\\x64\\xa0\\x48\\x74\\x03\\x7c\\x31\\x03\\xe9\\xdf\\xec\\xb8\\xf7\\xab\\xcb\\x0e\\x07\\x3b\\x23\\xe6\\x7c\\xa0\\xa9\\xb1\\xfc\\x72\\x99\\x3a\\xbf\\x31\\xdb\\xc2\\x4a\\x8f\\xee\\x09\\x5b\\x32\\x51\\xc2\\x26\\x26\\xaf\\x5d\\xd1\\xb6\\xd3\\x4b\\xe5\\xea\\x06\\xa0\\x2a\\xe1\\x76\\xc7\\xb8\\xcb\\x9d\\x06\\x35\\x01\\xbe\\x6f\\x61\\x20\\x82\\x88\\x9f\\xdb\\xdc\\xbf\\xad\\xc3\\x3a\\x0d\\x31\\x1b\\x08\\x0b\\x8d\\x64\\xe4\\x9f\\x16\\xb1\\x6d\\xd8\\xed\\xd3\\xb2\\xed\\x11\\x93\\xa7\\x4e\\x5b\\xe5\\x07\\x60\\x9b\\x04\\x27\\x27\\xcc\\xf0\\x8a\\xfb\\x05\\xcc\\x6c\\x50\\x52\\x4e\\xf0\\xe2\\x66\\x46\\x21\\xdc\\x8b\\x05\\xb1\\x5f\\xfa\\x81\\xab\\x6f\\x7e\\x3c\\x8a\\x5b\\xb3\\xea\\xb1\\xf6\\x8e\\x36\\x56\\xc1\\x19\\xd9\\x69\\xe4\\x14\\x4c\\xf3\\x28\\x5a\\xf2\\x3c\\x04\\xdb\\xec\\xc0\\x38\\xae\\xfd\\x91\\x83\\xc4\\xe7\\x24\\x47\\xb2\\xaa\\xa8\\x31\\x5f\\x46\\x96\\xce\\x6d\\x1e\\xf4\\x29\\xba\\x0e\\x5c\\x3d\\x5f\\xfa\\x7f\\x05\\x0b\\xe3\\x9c\\x7f\\x61\\x2f\\x4e\\x10\\xf8\\xef\\x07\\x0d\\xf7\\x2f\\x8a\\xdd\\xbe\\xaf\\x33\\x39\\xc1\\xad\\x8b\\x5f\\xc3\\x9a\\x2e\\xcf\\x29\\xa8\\x7f\\x82\\xe2\\x9a\\x01\\x17\\xba\\xac\\x66\\x25\\xad\\x5c\\x80\\xcf\\xe7\\x59\\xfa\\x1d\\xbc\\xfa\\xa1\\x2b\\x37\\x44\\x77\\xd8\\x0b\\xfc\\xf0\\x67\\x96\\xc3\\x0f\\x2c\\x39\\xcf\\x03\\x03\\xd0\\x0d\\xc5\\x6a\\x32\\xd1\\xd0\\x39\\x59\\x2d\\xdb\\x06\\xc2\\x2a\\xa0\\x68\\x84\\x1c\\x0b\\x46\\xfd\\x48\\xdf\\x8f\\xbb\\x74\\x92\\xcc\\xbc\\x59\\x0c\\x56\\x3c\\x8f\\xec\\xce\\x42\\x63\\xc8\\xc7\\x53\\x92\\x18\\xbb\\x97\\xb3\\x57\\x11\\x53\\x7e\\x98\\x81\\x95\\xdb\\xf5\\xbc\\xd5\\xcc\\xaf\\x06\\xfa\\xf5\\x08\\x47\\x09\\x77\\xa5\\x35\\x8e\\x6f\\x02\\x60\\x83\\x49\\xfb\\xb9\\x9a\\x23\\xfb\\xe3\\x6b\\x8c\\x97\\x15\\x5a\\xdc\\x24\\x6a\\xd7\\xd9\\x3a\\x8c\\x20\\x3f\\x75\\x44\\x6c\\x83\\xc4\\x34\\x2c\\x35\\xba\\x10\\x4e\\xcc\\x67\\xe6\\x69\\xdb\\x4a\\x95\\x46\\x6e\\xe6\\x8f\\x45\\x8a\"},\n{{0x7c,0x27,0xae,0x47,0x07,0x2b,0x0c,0x9b,0x9c,0x2c,0x35,0x1f,0x13,0x27,0x89,0x98,0x95,0xef,0xa5,0x36,0xc9,0xc0,0x67,0xd0,0xe0,0xce,0x8e,0x82,0xe6,0x29,0x27,0x93,},{0xf9,0xfe,0xbd,0x12,0x1e,0x17,0xdb,0x72,0x29,0xb5,0x67,0x09,0x02,0x18,0x49,0xc3,0x5d,0x69,0xfa,0x08,0xb5,0x06,0x20,0xe6,0x67,0xf8,0x42,0xec,0x7a,0xc7,0x82,0xdc,},{0x32,0x71,0x96,0xdd,0xd4,0x3b,0xb6,0x02,0xd0,0x4d,0x19,0x64,0xcc,0xc0,0x59,0xed,0x62,0x7c,0xef,0x0a,0x88,0xd8,0xad,0x91,0xbe,0x49,0x31,0xf1,0x7c,0x25,0x0d,0x55,0x29,0xf5,0x52,0x79,0x4a,0x3e,0x26,0x9d,0x17,0xa6,0x3b,0xd3,0x29,0x33,0xeb,0x5e,0x51,0x9c,0x1d,0x50,0x65,0x74,0x77,0x0a,0xe4,0xa7,0x29,0x64,0xe0,0x6f,0x7d,0x00,},\"\\x15\\x47\\x87\\x6a\\x98\\x8d\\x1b\\xe7\\x14\\xa4\\x2f\\xb9\\x1c\\xb0\\x37\\x63\\xf1\\x91\\x3a\\x89\\x2e\\xcb\\xd4\\xde\\x2c\\xcf\\x83\\x44\\xd2\\x07\\x58\\xb7\\xb6\\xd0\\x02\\x59\\x10\\x1f\\xe9\\x72\\x25\\xb2\\x97\\xf8\\x7b\\xfe\\x22\\x20\\x04\\x32\\x5d\\xb7\\xf6\\x32\\xce\\xaf\\xfb\\xd1\\x34\\xc9\\x6c\\xbd\\x57\\xe9\\x85\\xbe\\xc8\\x43\\x4f\\x81\\xa4\\xee\\x6a\\xf8\\x5c\\x3f\\xad\\xe5\\x0e\\x4c\\x4e\\xf2\\x0c\\xb0\\x39\\x35\\x45\\xe4\\xd4\\xa8\\x6e\\x1f\\xa3\\x9a\\xaf\\x33\\x3f\\xe4\\xde\\xd0\\x54\\xbf\\xc0\\x50\\xa8\\x98\\x3a\\x03\\xdd\\x1e\\xcf\\x2b\\x5e\\x95\\x17\\xba\\xf9\\xe1\\x15\\x21\\x29\\xa8\\xa7\\x59\\x35\\x71\\x1e\\xdb\\x20\\xaf\\x5c\\x8c\\xf9\\xc6\\x94\\xa3\\x3c\\xee\\x45\\x1c\\xd9\\x50\\xb2\\xff\\xf0\\x8e\\x31\\x58\\xc5\\xcf\\xb7\\xb1\\x5c\\xb3\\xe9\\x0d\\x46\\xf4\\x94\\xb6\\xa1\\x08\\xd8\\x88\\x8d\\x5e\\xc2\\x9a\\x33\\xc0\\x66\\x02\\x3b\\x49\\x77\\x09\\xb2\\xd9\\x40\\x1f\\xea\\xf2\\xe7\\x4f\\xf2\\x6c\\x16\\xd3\\x6c\\x39\\xe6\\x51\\x7f\\xf9\\x54\\xbd\\x98\\xbc\\xe7\\x70\\x06\\x71\\x98\\x8f\\x66\\xe8\\x51\\x07\\x64\\x4b\\xa2\\xea\\x00\\x7a\\x13\\x01\\x8c\\x1c\\x14\\x4e\\x3c\\x5b\\xb8\\x0d\\xb9\\x51\\x1f\\xcc\\xa4\\x10\\x1b\\xf4\\x9f\\x8c\\x80\\xff\\x3c\\xa7\\xd2\\x98\\x25\\x7c\\xbf\\xea\\x62\\x9f\\x83\\xd5\\xe0\\x66\\x39\\xd3\\x1f\\x63\\x9d\\xb4\\xb8\\x72\\x6c\\xbe\\x22\\x4d\\x75\\x88\\x29\\xba\\xb1\\x09\\x05\\x17\\x1c\\x9c\\x0e\\xc3\\x70\\xd5\\x80\\x31\\xef\\xe4\\xcc\\x5a\\xe7\\x2a\\x49\\x5a\\xcf\\xf6\\xcb\\x2e\\xd9\\xee\\xc6\\x58\\xba\\x11\\x70\\x88\\xdd\\x3c\\x6e\\xd1\\xdf\\x8f\\x9c\\xb1\\x0b\\xd4\\xfe\\x0e\\x5e\\x8a\\xd9\\xf5\\x03\\x4e\\x34\\x65\\x2d\\x98\\x66\\x8d\\xb1\\x5c\\x85\\x33\\x39\\x3a\\x6e\\x9e\\xc0\\x87\\x0c\\x35\\x66\\x6c\\xe5\\x4e\\xfe\\x2b\\xcb\\x45\\xc3\\x4a\\x72\\x30\\xe6\\xa7\\x00\\x67\\x63\\x49\\xc7\\xb3\\xab\\xf3\\x1d\\xe7\\xb7\\xb0\\x52\\x1f\\x89\\xb3\\x0a\\xc4\\x03\\x4c\\x2a\\x4b\\xa8\\x21\\x8e\\xef\\xdf\\x8d\\x2a\\x5c\\x1f\\x8e\\xd9\\xb7\\x01\\x57\\x9e\\x47\\xaf\\x8a\\x52\\x9a\\x95\\xa1\\xff\\x64\\xd8\\xfd\\xb8\\x85\\xc3\\x68\\x39\\xb4\\xc5\\xf6\\xd7\\x2a\\x99\\x25\\x7e\\x86\\x78\\xdc\\xcf\\x31\\x27\\x54\\xb9\\xd4\\x61\\x9b\\xee\\xce\\xb8\\x25\\x52\\x6d\\xe6\\x22\\xbd\\x96\\x76\\xfd\\x5f\\x35\\x76\\x93\\xab\\xab\\x07\\x8b\\x9e\\x03\\xae\\x21\\xe8\\x7c\\xa1\\x61\\xe7\\x78\\xaf\\x77\\x09\\x6e\\xaa\\xc2\\xd2\\xd3\\x2b\\xfe\\xc8\\xec\\x94\\xaf\\x79\\x65\\xf6\\x1d\\x68\\xef\\x66\\xa4\\x52\\x3c\\x1c\\xc7\\x0c\\x95\\x19\\xb0\\x75\\x0b\\x3c\\x9e\\xed\\x5a\\xeb\\xa9\\xf0\\xa9\\xb7\\xef\\x52\\xcd\\x4a\\x2d\\xe2\\x9b\\x39\\x5b\\x70\\x5f\\xa5\\x3f\\x02\\x8f\\xa7\\x66\\x15\\x9f\\x20\\xe7\\x5f\\x4d\\x38\\x4e\\xc4\\xfd\\x66\\xdf\\x06\\xe7\\x44\\xc9\\x9a\\xc8\\x8c\\xb8\\x49\\xc2\\x85\\x75\\x7c\\xc5\\x57\\xe2\\xee\\xdd\\x86\\x95\\x9d\\xa2\\xc1\\xb8\\x1f\\x5b\\x27\\x15\\xa6\\x51\\x98\\x48\\x90\\x1a\\xe4\\xf8\\x9d\\x09\\x13\\xc8\\xde\\x57\\xc5\\x3d\\xad\\xf2\\xe5\\xe1\\xaa\\x2a\\x9c\\x5f\\x46\\x4f\\xc7\\x61\\x0e\\x8e\\xf5\\xf5\\xcd\\xd8\\x20\\x3a\\x67\\xa9\\x3c\\x33\\xa0\\x6d\\xab\\x35\\x8d\\xc5\\xae\\x23\\xed\\xfe\\xe6\\x33\\x42\\x62\\xf4\\x7b\\x19\\xb1\\x13\\xd6\\xca\\xfe\\xda\\xc1\\xb4\\x39\\x02\\x53\\x9d\\x74\\xfb\\xa2\\x9a\\xaa\\x7b\\xce\\x68\\x88\\x4b\\x72\\x61\\x6a\\x05\\x42\\xc9\\xfc\\x69\\x54\\x7c\\xd1\\x9a\\xe1\\xdf\\x01\\x72\\x3a\\xbd\\xda\\x65\\xe9\\xbf\\xac\\x5d\\xa0\\xd0\\x42\\x40\\xc6\\xa2\\x17\\x5c\\x00\\x62\\xe4\\xe1\\xed\\x8a\\x5b\\x39\\x7a\\xfc\\xd4\\xde\\x38\\xe8\\x62\\x09\\x27\\x2c\\x7a\\x42\\x4b\\x5a\\xe8\\xd5\\xa4\\x0b\\x48\\x4c\\xe1\\xb4\\x70\\x4a\\xf2\\x83\\x16\\x09\\xad\\x0f\\x36\\xe9\\x0e\\x07\\xb2\\xaf\\xed\\x01\\xdc\\x05\\x57\\x4a\\xd3\\x97\\x17\\x23\\xc5\\xb5\\xc1\\xdd\\xd4\\xfc\\x8b\\xd2\\x63\\xbc\\xdf\\x56\\x8a\\xf7\\x5e\\x73\\xd8\\xab\\xd1\\x00\\x8c\\x9e\\xc7\\x12\\xf8\\x0f\\xfc\\x65\\xac\\x34\\xe2\\xa7\\x93\\x04\\xea\\xde\\x1d\\x2a\\x1d\\xff\\xec\\x0e\\x4c\\x98\\xc3\\x58\\x24\\x68\\xf3\\x20\\xbf\\x8f\\x66\"},\n{{0x08,0xed,0xdc,0xb5,0x62,0x5a,0xe1,0x9f,0xfe,0x7b,0x49,0xa7,0xdc,0x82,0x9c,0x89,0x3c,0x75,0x38,0xb0,0x88,0x5e,0x18,0xf9,0x8d,0xb7,0x8c,0x8b,0xeb,0x56,0x9c,0x26,},{0x83,0x47,0x8b,0x1c,0x58,0x57,0x6a,0x0d,0x18,0x34,0xb2,0x8d,0x46,0xfb,0x80,0x51,0x6d,0x6f,0xb6,0xf9,0xf5,0x91,0x69,0x4b,0x44,0x35,0x2e,0xec,0xd1,0xe7,0xe8,0x9a,},{0xec,0xe7,0x53,0x22,0x99,0x51,0x54,0xb2,0x92,0x43,0x7e,0x47,0xd3,0x8a,0x6a,0x70,0xaf,0x37,0xe2,0x02,0x07,0x16,0xfd,0xe4,0x6b,0xfd,0x39,0x3b,0x3d,0x36,0x9b,0xdd,0xb5,0x32,0x53,0xb5,0x56,0x62,0x1c,0xfb,0x34,0xc8,0xa9,0x02,0x54,0xe1,0x32,0xfd,0x28,0xec,0xd0,0x98,0x43,0x34,0x13,0xa2,0x1b,0xd3,0xa9,0x79,0x8c,0xa1,0xf3,0x09,},\"\\x01\\x5b\\x1d\\x3e\\xeb\\x00\\x92\\x9e\\xa8\\x0b\\xd8\\x68\\x7d\\x18\\x28\\x6f\\x0a\\xdf\\xe6\\x45\\xcc\\xf2\\x5a\\x22\\xb5\\x06\\x19\\x21\\xe2\\xa0\\x30\\xfc\\x76\\xd0\\x33\\xfb\\x53\\xd0\\x93\\x7c\\x69\\xb3\\x1c\\x5b\\xe4\\x99\\x13\\xca\\x1f\\x2c\\x3d\\xca\\x12\\x1b\\x2b\\x87\\xc5\\x9b\\x3c\\x84\\xc7\\xae\\x52\\xaf\\x19\\xc6\\xb9\\xfa\\x1b\\xd6\\x75\\xfb\\x6d\\xd8\\xb3\\x29\\xd5\\x66\\x87\\x86\\xdc\\x78\\x83\\xe2\\xd2\\xe8\\x58\\x6f\\xf4\\x12\\x8b\\x90\\xde\\xe8\\x4b\\xe0\\xab\\x54\\xd6\\x81\\x3f\\x7a\\x8c\\x61\\x34\\x75\\x71\\x73\\x98\\x17\\x75\\xde\\x84\\xc4\\xdd\\x39\\xe3\\x36\\xf8\\xa4\\xef\\x8d\\xca\\xde\\xc9\\x43\\xe9\\x0d\\x42\\x1b\\x22\\x9c\\x11\\x78\\x5f\\xcd\\x3f\\xe9\\x63\\x03\\x74\\x58\\xe7\\x6c\\x82\\x0b\\x3b\\xc2\\xc9\\x47\\x60\\x01\\x26\\x2b\\x26\\x1d\\x28\\xb6\\x5b\\x48\\x9d\\x76\\xb4\\xbe\\x23\\x65\\xe4\\xa8\\x0f\\xa8\\x71\\xb0\\xa5\\x3b\\x6a\\x5f\\xb2\\x43\\x68\\x82\\x35\\xac\\xc5\\xf4\\x77\\x4d\\xb1\\x5d\\x47\\xb4\\x2d\\xd6\\xc8\\xd9\\xe1\\x2d\\xcb\\x0b\\x5d\\x98\\x0d\\xab\\x0f\\x3a\\xd8\\xa4\\x96\\xf7\\x6e\\x50\\x06\\xc2\\xca\\x82\\x67\\x5f\\xf1\\x94\\xca\\xf8\\x07\\x0d\\x04\\xbd\\x38\\x4f\\x97\\xe5\\x83\\xe7\\x3c\\xbc\\x4f\\x7f\\x25\\x73\\x10\\xa6\\x1b\\x1c\\x80\\x62\\x32\\x2d\\xce\\x81\\x15\\xf6\\xdd\\x93\\xee\\xe8\\xa9\\x3f\\xfa\\x5c\\xab\\x66\\x34\\x11\\x6e\\x1a\\xb7\\x05\\xfa\\x86\\xc4\\xa8\\xea\\xa5\\x56\\xc6\\xc8\\x9d\\xbc\\xad\\x01\\x04\\x36\\xbf\\xfe\\x45\\x18\\x22\\x49\\x1f\\x1e\\xa8\\x6c\\x20\\x20\\x7e\\x4d\\x12\\xdf\\xa3\\x62\\x61\\x6c\\x58\\x9f\\x97\\x10\\x7e\\xa5\\xd8\\xbd\\x8a\\x72\\x15\\xc6\\x00\\xff\\xc7\\x0b\\x80\\xe2\\xab\\xb1\\x5a\\xcb\\xe4\\xbe\\xcc\\xa2\\x0d\\x72\\x15\\x5a\\xbc\\x3d\\xbe\\x8e\\x37\\xcf\\xd7\\x3f\\x74\\x20\\xf2\\x1c\\x9b\\xcd\\x0c\\x32\\x73\\x51\\x3b\\x50\\x49\\x67\\x08\\x74\\xd5\\x51\\x9b\\x3b\\xc1\\xdb\\x52\\x3c\\x1d\\x7e\\x90\\xc1\\x65\\x96\\x7c\\x4c\\xb2\\x84\\x5a\\x2e\\x8b\\x47\\xb5\\x88\\x92\\x54\\xf5\\x8a\\x9b\\xbb\\x82\\x6f\\x94\\x52\\x1c\\xdb\\xd0\\x41\\x6f\\x5f\\x18\\xff\\x78\\xa3\\xfd\\x0d\\x7a\\xb8\\x97\\x90\\x62\\x64\\x48\\x3c\\xde\\x64\\x2d\\x8e\\x70\\x3f\\xd8\\x2e\\x5a\\xe7\\x0a\\x9f\\x97\\x8f\\x64\\xee\\x80\\x52\\x05\\x54\\x85\\x05\\x28\\x58\\x1c\\xa9\\xa0\\xb3\\x8c\\x19\\x6f\\xd1\\x66\\xda\\xe5\\x87\\x9b\\x3f\\x72\\xf5\\x9c\\xde\\x91\\xcc\\xa2\\xc8\\xbf\\xaa\\x47\\x8b\\x98\\xd6\\x24\\xcd\\x34\\x72\\x44\\x02\\xde\\x57\\x8e\\x57\\x54\\x82\\x5c\\xe2\\x27\\xd2\\x87\\x1b\\x45\\xa5\\x11\\x71\\x49\\x51\\x5b\\xff\\x81\\xa9\\x23\\x24\\x6f\\x3b\\x72\\xd0\\x7b\\xd4\\x58\\x12\\x5c\\x70\\xa1\\x4d\\x87\\xc3\\xfd\\x13\\x39\\x2a\\x3b\\xda\\x65\\x53\\x01\\x6e\\x8b\\x2d\\x07\\xbd\\xe9\\x03\\xcf\\x68\\x7b\\x44\\x5c\\xfd\\x6f\\x76\\x14\\x92\\xeb\\xa4\\x65\\x22\\xad\\xa8\\x4a\\x96\\x15\\xd8\\xda\\x34\\x98\\xb2\\x58\\x06\\x72\\x69\\xb7\\x88\\xe5\\x59\\xb6\\x59\\xd4\\xb4\\x8a\\x87\\xd8\\x80\\xd6\\x37\\x8b\\xe6\\xa8\\x87\\x46\\xf3\\x5b\\x32\\x2b\\x04\\x78\\x45\\xaa\\xdc\\x52\\x3b\\xea\\xff\\x30\\x70\\xf7\\x21\\xc3\\xc0\\x71\\xea\\xa3\\x19\\xb7\\xa4\\x7c\\x1b\\x20\\xd3\\x00\\xdc\\x03\\x21\\x90\\x9b\\x66\\x9e\\x57\\xd3\\x9a\\x1c\\xe2\\xfd\\xbe\\xaa\\xfa\\xc2\\x13\\x50\\xec\\x2d\\x6e\\x6d\\x5b\\x88\\x01\\x86\\xc0\\x28\\xa8\\x61\\x47\\x4d\\x50\\x76\\xa4\\xad\\xc5\\x03\\x2f\\xec\\x91\\x40\\x78\\x7c\\x36\\x80\\x6e\\xf7\\x9c\\x72\\xe3\\xa1\\x9d\\x8c\\x8b\\x70\\xbd\\xaf\\x20\\x72\\x95\\x54\\x2d\\x96\\x82\\x5a\\x5d\\xe7\\xdf\\xe1\\x08\\xef\\x57\\x45\\x99\\xb8\\xf1\\x84\\xc6\\x3a\\x5a\\x13\\x1d\\xb1\\x9b\\x3b\\xe5\\x3f\\x69\\x9c\\x10\\xfc\\x4c\\xa7\\xc6\\x3f\\x35\\x00\\x21\\x1b\\x35\\x6a\\x0a\\xc6\\x64\\xdd\\xfc\\x1a\\x92\\x52\\x59\\x00\\x26\\x39\\x5b\\x47\\x9b\\xe9\\xa5\\xe4\\x75\\x84\\x23\\x56\\x0b\\x65\\xbb\\xce\\x5b\\xba\\xde\\x49\\x3b\\x13\\xd0\\x0c\\xf8\\xc1\\xd3\\xb7\\xe9\\x22\\x13\\x67\\xe8\\xf0\\xea\\xda\\xb6\\xe6\\xd1\\xb5\\xff\\xfd\\xe7\\xb2\\xd7\\x41\\xfc\\x2c\\x83\\x02\\x24\\xff\\xf7\\xff\\x14\\xae\\x5c\\x07\"},\n{{0x22,0x73,0x94,0x2d,0xb3,0xe5,0xd3,0x22,0x1e,0x80,0xd9,0x94,0xfd,0x5e,0x11,0x63,0xaf,0x55,0xf5,0x45,0x5a,0x8e,0x52,0xbe,0x85,0x2d,0xd3,0xad,0xf7,0x62,0xb4,0x40,},{0xbc,0x58,0x67,0x4e,0x99,0x6b,0x6f,0x3e,0x32,0x20,0xb3,0xe9,0x4f,0x00,0x67,0xbb,0x0e,0x9b,0x0d,0x97,0xd9,0xe1,0x05,0x9c,0xf1,0x39,0x97,0xa1,0x93,0xac,0x03,0x2a,},{0x87,0x4d,0xde,0xce,0x08,0xf3,0x0b,0x30,0xf0,0xd4,0xc8,0xb3,0xed,0x7c,0x61,0x51,0x49,0xb8,0xaa,0x74,0x0d,0xaa,0x34,0x7b,0x55,0x95,0x8f,0x1e,0x21,0x19,0x04,0x4f,0x69,0x5a,0x21,0x06,0x96,0x90,0x50,0x64,0x48,0xd8,0xe7,0x35,0x2b,0x90,0x46,0x51,0x1d,0x7f,0x39,0xa5,0x41,0x5b,0xb9,0xc5,0x70,0x50,0xfc,0x17,0x05,0x5c,0x38,0x08,},\"\\x8a\\xa0\\x50\\x9e\\x4b\\x91\\x41\\x86\\xff\\xff\\x07\\xae\\xb9\\x7a\\x04\\xb5\\x46\\x27\\x2d\\xa2\\xf9\\xea\\x7b\\xfa\\x65\\x9a\\x24\\xcb\\x50\\x96\\x6c\\x23\\xeb\\x65\\x42\\xe4\\xf2\\x2d\\xeb\\xe3\\x3b\\x65\\x76\\x92\\x45\\xc4\\xd1\\xb5\\xdc\\xf3\\xe6\\x99\\xc7\\x0c\\x5c\\x2b\\xaa\\xd9\\x73\\x4e\\x9d\\x1e\\xfe\\x54\\x48\\xab\\x71\\xc8\\x94\\x6a\\xec\\xce\\x52\\x68\\xd2\\x6f\\x19\\xcf\\x60\\x5e\\xb3\\xbf\\x38\\xb0\\xb3\\x32\\x26\\x94\\xac\\x0d\\xcb\\x76\\xb0\\xf9\\x46\\x84\\x2f\\x6c\\x5c\\x68\\xd7\\x63\\xfc\\xe7\\x47\\x01\\xbd\\x6b\\x78\\xe7\\x1c\\x8c\\x31\\x42\\xad\\xd4\\xed\\x46\\xe0\\x96\\x9b\\xb9\\x55\\x5b\\xe0\\x36\\x02\\xd5\\x62\\xe4\\xc8\\x9f\\x3a\\x91\\x99\\x40\\xe8\\x83\\xa9\\x69\\x40\\x54\\x2f\\x27\\x79\\xfb\\xf9\\xec\\x0a\\x28\\x5d\\x9d\\x8a\\x72\\x36\\x01\\x46\\xe3\\xff\\xbd\\xb7\\x8d\\x21\\x03\\x16\\x03\\x8d\\x95\\xd6\\xab\\x75\\x71\\x65\\xaa\\x94\\x3c\\x03\\x3e\\xeb\\xb3\\x21\\xc0\\x5a\\x39\\x95\\x69\\xbc\\xf6\\x6b\\x4d\\xdb\\x0b\\x2e\\x0e\\x33\\xc4\\x79\\x3d\\x81\\x7c\\xcf\\xf5\\x7f\\x99\\xb3\\x18\\x9c\\x60\\xd5\\xd7\\xb9\\x41\\x9d\\x1e\\xbc\\x94\\x3a\\x79\\xd4\\xd8\\xc3\\x94\\x56\\x61\\x80\\x59\\x4f\\x55\\x9a\\x80\\x52\\x9c\\xc1\\xba\\x28\\x87\\x7a\\xf8\\xf5\\xc0\\x50\\x3e\\x94\\x3c\\xd3\\xaa\\xd9\\x98\\x11\\x64\\x52\\x72\\xda\\xfb\\x49\\xb9\\xb3\\xe6\\x10\\x7e\\xb5\\xe5\\x18\\x6e\\x16\\x08\\x75\\x71\\x26\\x05\\x3d\\xeb\\xce\\xc7\\x5d\\xd9\\x56\\x5c\\xee\\xa0\\x6a\\x13\\x91\\xa8\\x22\\x6d\\x1f\\x45\\x93\\x79\\x22\\x40\\xcc\\xd9\\x7c\\x67\\xa6\\xc2\\xb1\\x34\\x4c\\x22\\xc9\\x1f\\x42\\x03\\x3a\\xde\\xf5\\x28\\x61\\xf3\\x2a\\x4e\\x07\\x12\\xa9\\x17\\x87\\x9a\\x0b\\x05\\x18\\xb5\\x42\\x4b\\xcd\\xc0\\x54\\xb4\\x4e\\x97\\x2e\\xd2\\x4d\\x01\\x68\\x9f\\x4f\\x27\\xf5\\xf1\\x76\\xf0\\xa5\\x78\\xab\\x2d\\x3c\\x08\\x78\\x27\\x2e\\x8c\\x08\\xc2\\x15\\x82\\x11\\x86\\x54\\x12\\x4d\\xca\\x39\\x58\\x53\\x37\\xc1\\x3c\\x18\\x65\\x81\\x4c\\xaf\\x09\\x96\\xca\\xdf\\xa6\\x5b\\xe5\\x80\\xde\\xe3\\x22\\xeb\\xcc\\xda\\x70\\x4b\\x22\\x80\\x58\\x26\\x04\\x06\\x7d\\xc3\\xc6\\xb1\\xf7\\xd8\\xa2\\x69\\x78\\xa6\\x5c\\xff\\xd1\\xed\\x31\\x96\\xa2\\xb0\\x65\\xfb\\x3c\\xaa\\x79\\xe6\\xb5\\xb6\\x6c\\x13\\xd7\\xbd\\x7d\\x0e\\xc1\\x4a\\x3a\\x4d\\x58\\x41\\x3f\\x21\\x2f\\x47\\x1e\\xca\\xad\\x3a\\x84\\xaf\\x35\\xe5\\x98\\xa8\\x9f\\xb3\\x44\\x7d\\x33\\x24\\xf0\\x20\\xfb\\xf1\\xb7\\x3e\\x2a\\x98\\x6e\\x0d\\xa1\\x6c\\x01\\x83\\xbf\\x92\\xa3\\x98\\xc4\\x19\\xa0\\xf9\\xf3\\x05\\x37\\xbe\\xa0\\xdf\\x8d\\xf2\\xdc\\x53\\xc1\\x54\\xe8\\xea\\x16\\x06\\x89\\xe7\\xbb\\x4d\\x72\\x9d\\xd8\\xab\\x90\\x03\\x14\\x27\\xaa\\x39\\x45\\x86\\x3a\\x85\\xe8\\x96\\x52\\xb9\\x35\\x38\\x05\\x16\\x6f\\x7c\\x0a\\x18\\xc9\\x39\\x95\\x4b\\x27\\x87\\xc3\\x70\\x94\\xf9\\x25\\x12\\x72\\x2e\\x52\\xb0\\xc9\\x76\\xb9\\xe4\\x2a\\xf4\\x03\\x9d\\x2c\\x05\\x78\\xff\\x14\\xfa\\xe1\\xd8\\xc2\\xd1\\x39\\x6b\\xeb\\x2d\\x6a\\xa6\\xeb\\xd5\\x54\\x74\\xa9\\x34\\x98\\x67\\xa0\\x3f\\x3a\\x99\\xd7\\x87\\x80\\x63\\x4a\\xb4\\xb3\\x5c\\xfe\\x1b\\x87\\xa9\\x13\\x32\\x52\\xa6\\x98\\xbc\\x40\\x7d\\x63\\x84\\x28\\x70\\xe2\\x2c\\xcf\\x39\\x33\\x62\\x0a\\xc0\\x42\\x3c\\x3d\\x1f\\x68\\x1d\\xd7\\x3c\\x01\\xd0\\x6c\\x3b\\x94\\x15\\x06\\xc9\\x8e\\xed\\x9b\\x78\\x68\\xe0\\x17\\xb7\\xf9\\x97\\x16\\xb0\\xb7\\x7f\\x11\\x32\\x1e\\x5a\\xb2\\x3d\\xbf\\xcf\\xca\\x93\\x50\\x84\\x5e\\xe1\\x80\\x44\\x4c\\x50\\xff\\x0a\\x9c\\x96\\x5f\\xcb\\xf7\\x77\\x70\\x8e\\x4f\\x34\\xcc\\xc6\\x37\\xc6\\xa0\\x8d\\x85\\x43\\x84\\xf8\\xd3\\xe2\\x51\\x69\\x56\\xc1\\x51\\xd0\\x31\\xbb\\x1c\\xbe\\x71\\x2a\\x5e\\xf9\\xee\\x16\\x61\\x92\\x28\\xbd\\x29\\x6f\\x2a\\xfe\\x58\\x2d\\x99\\x53\\xd5\\x90\\xd1\\x8b\\xb2\\x05\\xf7\\x0f\\x84\\x4c\\x16\\xc0\\xa2\\xd8\\x31\\x80\\x37\\xd4\\x3d\\xd8\\x0f\\x65\\xc6\\xa7\\x53\\xf2\\xa8\\xe2\\x7c\\x89\\xc8\\x3e\\x7e\\xd7\\x0c\\x52\\xf7\\x06\\x2d\\xfb\\xb1\\xf5\\x44\\xaa\\x23\\x6b\\x5c\\x70\\x4e\\x7b\\x39\\xce\\x0a\\x55\\xfd\\x46\\x52\\x80\\x83\\xca\\x61\"},\n{{0xdb,0xfa,0x45,0xab,0xaa,0x55,0x41,0x52,0x38,0xb1,0x28,0x76,0x34,0xd5,0xee,0xc4,0x02,0xda,0xdf,0x62,0x2e,0x27,0x0c,0x04,0xa8,0x91,0x4c,0xed,0x27,0x0a,0x72,0xbe,},{0xc0,0xfe,0x32,0x35,0x81,0xea,0x29,0x67,0x50,0x79,0x7e,0xb5,0x50,0x8c,0xa1,0x9a,0x58,0x3b,0x53,0x7f,0xa7,0xdf,0x45,0x29,0xf0,0x80,0x4a,0x33,0xc1,0xa4,0xbe,0xf4,},{0xa4,0x62,0xa9,0xba,0xa5,0x6d,0xc0,0xf7,0xa7,0x1b,0xf8,0x7b,0x95,0xf4,0x8d,0x64,0x20,0x22,0xd9,0xd1,0x73,0x3e,0xe3,0x68,0x37,0x77,0xa3,0x78,0x22,0x28,0xac,0x85,0xfc,0xd8,0x30,0x26,0xbe,0x4c,0xa9,0x7a,0x34,0x5b,0x08,0x4f,0x50,0x87,0x4e,0x91,0x24,0xe1,0x6b,0xa1,0x7d,0xea,0xd4,0xad,0x85,0xc0,0xe5,0x6f,0x16,0xef,0x18,0x04,},\"\\xe2\\x6e\\x8d\\xcb\\x44\\xe6\\x41\\xfc\\x20\\x08\\x0e\\x95\\x47\\x4b\\xd3\\x9d\\x71\\x6c\\x5a\\xfe\\x5a\\x1f\\xfb\\x05\\x6d\\x1e\\xaa\\xb0\\xc4\\x9f\\x85\\x70\\x71\\x7d\\xb6\\x43\\x7a\\x03\\x22\\x8a\\x9a\\xd9\\xf4\\xbb\\x0b\\x34\\x3b\\x95\\xe1\\x60\\x23\\xc0\\x80\\x7e\\xb2\\xa1\\x51\\x06\\xa6\\xeb\\x12\\xdc\\x76\\x68\\x3e\\x69\\xdd\\xa3\\x36\\x31\\x48\\xc5\\xd7\\xdd\\x97\\x13\\xaf\\x6f\\x87\\xa0\\x94\\x10\\xea\\x8f\\x76\\xb6\\xb7\\x8a\\x11\\x44\\x29\\xbc\\x85\\xf7\\x84\\x81\\x2f\\xca\\x31\\xac\\xb0\\x30\\x95\\x52\\xcc\\x18\\x8c\\x6e\\x96\\x97\\x09\\x3c\\xf4\\x04\\xc6\\xf0\\xf4\\xab\\xe8\\xa1\\x60\\x86\\x73\\xfd\\xfa\\x5e\\xb7\\x8f\\x65\\xfc\\x1d\\x49\\xcd\\xec\\x40\\x94\\xb1\\xbd\\x23\\x4a\\x46\\xe0\\xec\\x62\\xa4\\xb6\\xd3\\x1b\\x82\\x96\\x11\\x54\\x01\\x27\\x87\\x6b\\xff\\x4c\\x17\\x3d\\xe0\\x58\\xcf\\x61\\x00\\x4b\\x01\\x4a\\x7b\\xdf\\x79\\x3d\\xfd\\x6b\\x63\\xc5\\x07\\xd2\\xb2\\x3e\\x0f\\x56\\xbc\\x2f\\xe6\\xba\\xf6\\x37\\xce\\xe4\\x0d\\x18\\x99\\x22\\x95\\xd8\\x48\\xef\\x49\\x8f\\x8a\\x16\\x1b\\xd8\\x7e\\x60\\xc9\\x1f\\x97\\xa9\\x1e\\x9e\\xf3\\xf6\\xd9\\x7f\\x2b\\x2d\\x21\\x04\\xba\\x6f\\xdd\\xd6\\xc6\\x80\\x70\\x62\\x73\\xda\\xe8\\x7e\\x6e\\xec\\x1a\\xf2\\xa4\\x59\\x84\\x98\\x50\\x69\\xe8\\x09\\xe8\\xde\\x32\\xc1\\x28\\x89\\x29\\x9a\\x32\\xd4\\x0f\\x38\\x77\\x45\\x99\\xac\\x33\\x24\\xb7\\xcb\\x0a\\x4e\\xa6\\x32\\xc5\\xf9\\x10\\xad\\x87\\xf5\\xad\\xbf\\xa5\\xc3\\xbb\\x20\\x49\\x82\\x79\\xfd\\x53\\xc1\\xc2\\x67\\xfe\\x0a\\x84\\x77\\x30\\x85\\xda\\x26\\x6b\\x25\\x3c\\xd8\\x53\\xdf\\x7e\\x96\\x35\\x58\\xcb\\x06\\x88\\x07\\x80\\x97\\x34\\x23\\xc5\\x64\\xcd\\x0b\\xcd\\x6b\\x93\\x33\\x4c\\x19\\x59\\x53\\xd7\\xcd\\x89\\x9f\\x8a\\x54\\x7d\\x1a\\x1a\\x0a\\x8d\\xef\\xf1\\x38\\x1b\\x43\\x21\\x57\\x47\\x28\\xcf\\x71\\xb9\\x6f\\xf2\\x09\\xe8\\x99\\xda\\xa8\\xf1\\x3f\\x41\\xb2\\x30\\xe1\\x7b\\xff\\xdf\\xdd\\x2a\\x89\\x43\\xaa\\x5d\\x21\\xe5\\xf3\\x6e\\x1d\\xa0\\x7e\\xdd\\x6c\\xee\\x92\\xdc\\x48\\xb5\\xb2\\xa7\\x58\\x01\\x46\\xa9\\xba\\xf7\\x13\\x95\\x0c\\xe6\\x76\\x25\\x5a\\x89\\xe3\\x4f\\x87\\x87\\x54\\x7d\\x62\\x86\\x8d\\xb1\\x4b\\xa4\\x65\\x94\\xda\\x31\\x0d\\x7e\\x2d\\x9e\\x7c\\x7d\\xbe\\x17\\xdb\\xd7\\x1e\\xb4\\x7c\\x56\\xc5\\x72\\x1d\\xc9\\x6d\\x69\\x64\\x70\\x57\\x37\\x94\\x80\\x94\\x11\\xcd\\xfa\\x27\\x6b\\x05\\x9d\\x00\\x07\\xc2\\x5d\\x74\\xb2\\xa6\\x7d\\x38\\x24\\x6d\\xe1\\x1e\\xf4\\x6d\\xfe\\x26\\x70\\x92\\x6f\\xe4\\xb6\\x36\\x56\\x23\\x1b\\xc7\\x26\\x8b\\xba\\x23\\xf3\\x78\\xe8\\x4a\\x42\\x8c\\x3c\\xbf\\x45\\xcc\\x53\\x96\\x78\\xfd\\x46\\x7c\\xd3\\x3d\\xd0\\x75\\x7c\\xfa\\x02\\x4e\\x54\\xda\\x1f\\xf5\\x4c\\xe8\\x20\\x22\\x9b\\x77\\x8b\\x18\\x4b\\xe1\\xfa\\x2e\\x84\\x68\\xcc\\x19\\x95\\x59\\x40\\x73\\x5e\\xaa\\xa8\\x84\\x02\\x2f\\x64\\x18\\xb0\\xb1\\xf2\\x6b\\xcc\\xf1\\x69\\xf1\\xbc\\xac\\x7d\\x82\\xa3\\x5a\\xb6\\xef\\x84\\x7e\\x1d\\xba\\x53\\x7d\\xca\\xff\\x57\\x25\\x0a\\x8d\\x1c\\x71\\xfa\\xcb\\x13\\x4c\\xd0\\x6b\\x01\\xc4\\x53\\x19\\x13\\x27\\x45\\xdc\\x48\\x88\\x88\\xa1\\xd7\\x76\\x1b\\x84\\x86\\xa3\\x7e\\x69\\x88\\xa1\\x12\\x0b\\xcc\\x16\\x82\\xdb\\xfc\\x89\\x14\\x3f\\xc3\\x5b\\x46\\x93\\x5d\\x8a\\xcf\\x6e\\xf3\\xc4\\x2f\\x0f\\x4b\\xf6\\x79\\xdf\\xd6\\xff\\x44\\xb6\\xad\\xa2\\x6b\\x01\\xa9\\xf8\\x9f\\x37\\x4c\\x7d\\x2e\\xe4\\x8d\\xfe\\x1a\\x41\\x0e\\x89\\x7c\\xdf\\xd9\\x7f\\x62\\x6d\\x26\\x68\\x50\\x28\\x14\\x40\\x07\\x93\\xb3\\xb0\\x7c\\x87\\x20\\xbb\\xdd\\xc5\\x9c\\xb0\\xf9\\xde\\x96\\x4a\\xe0\\x75\\xb4\\xaf\\x3d\\xd4\\xba\\xf6\\xd0\\xe4\\xf9\\x4f\\x29\\x4e\\x81\\x09\\xd6\\x57\\x7c\\x4f\\x8a\\x9c\\x7a\\x5f\\x7d\\x69\\x4b\\xf8\\x8f\\x1a\\x5e\\xa7\\xeb\\xa0\\xa6\\x6d\\xa6\\xc7\\x70\\xc0\\x8b\\x3a\\xbf\\xfc\\x53\\x4d\\xf2\\x19\\xdc\\x3e\\x33\\x23\\xb0\\x22\\xe9\\x6c\\xc8\\x60\\x02\\xb1\\x89\\x18\\x1a\\x1d\\x2b\\x52\\x7d\\x27\\x95\\x0b\\x7f\\x42\\x5a\\x47\\xda\\x40\\x13\\x77\\x8b\\xd0\\x0b\\x71\\x10\\x59\\x22\\x20\\x49\\x21\\xe9\\xdc\\x69\\x2c\\x23\\x3f\\x7b\\xaa\\x04\"},\n{{0xef,0x64,0xe1,0x7a,0x53,0xf7,0xfb,0xca,0xfe,0x3e,0xa4,0x68,0x76,0x84,0xa0,0xda,0xdb,0x18,0xd0,0x37,0x35,0xa4,0x0a,0x53,0xb3,0xed,0xb0,0x49,0x07,0xee,0x61,0x62,},{0x91,0x86,0xe6,0xbc,0x14,0x29,0x61,0xc4,0xd3,0xeb,0x36,0x9e,0x9e,0x11,0x57,0x82,0x92,0xde,0x5b,0x6a,0xf5,0x34,0xd4,0x23,0xff,0x24,0x0f,0xa2,0x6e,0x21,0xa7,0x81,},{0xf5,0x8f,0x39,0x6b,0xa2,0x7e,0x06,0x7a,0x5f,0xe0,0x03,0xe3,0x85,0x58,0x2a,0xe3,0x49,0x0e,0x05,0x95,0x77,0x15,0xd7,0x04,0xda,0x0d,0xa6,0x3a,0x64,0x19,0xd2,0xe4,0xf6,0xdc,0x66,0xb7,0xe8,0x8e,0x42,0x8a,0x6f,0x21,0xb9,0xea,0x20,0x22,0x99,0xa3,0xc3,0x6b,0x24,0x2b,0x0e,0xa0,0x64,0x76,0xff,0x12,0xd0,0xb6,0x58,0x0c,0x04,0x03,},\"\\x68\\x82\\x45\\x6c\\xc3\\xd1\\xad\\x0d\\xaa\\x9b\\x88\\xef\\xf0\\x96\\x9f\\x15\\xe9\\x7b\\x48\\xd0\\x51\\x96\\x7e\\x13\\x90\\x84\\x72\\x25\\xf2\\x6a\\xc2\\x55\\x59\\xf0\\x24\\x6b\\xf7\\xd6\\x83\\xfa\\x28\\xec\\xed\\xad\\x21\\x49\\x1d\\x77\\xbd\\x26\\x96\\xfa\\x83\\x5d\\x0f\\xd1\\x19\\x88\\x4f\\xec\\xe9\\xd8\\x03\\x69\\x1b\\x2f\\xd3\\xde\\x17\\xee\\x08\\x7c\\x74\\x00\\x7a\\x7d\\xe9\\xbc\\x65\\x34\\xbb\\xfe\\x95\\xfd\\x32\\xe9\\x7c\\x37\\x5f\\x4c\\xb6\\x57\\x31\\xaa\\x1e\\x83\\x46\\xbe\\xa2\\x1b\\xe9\\xf2\\xc3\\xdc\\x87\\x4a\\xf0\\x43\\x19\\x06\\xcc\\xbc\\x2c\\x60\\x01\\x27\\xf4\\xd3\\xb0\\x69\\xeb\\x09\\x1d\\x16\\x5e\\xc4\\x53\\xe6\\x72\\xe9\\x3c\\xae\\x8b\\x72\\xf0\\x33\\x71\\xd8\\xb8\\xa8\\x24\\x4e\\xc4\\xec\\x2e\\x09\\xf3\\x1d\\xf4\\x02\\x06\\xa2\\xb1\\xc8\\x4c\\xaa\\x1b\\x99\\x3c\\xc6\\x75\\xfd\\xe1\\xc7\\x9b\\xd4\\xa7\\xd1\\x59\\x74\\xfa\\x29\\xce\\x2e\\x89\\x2c\\x28\\x99\\xcf\\x48\\x2c\\x3d\\x96\\x63\\xf6\\xd2\\xa7\\x97\\x84\\xf4\\x1c\\x1f\\x58\\x66\\xd3\\x7c\\x85\\x46\\xf3\\x57\\xd5\\x64\\xd3\\xc4\\x21\\x8d\\xfa\\x6d\\x20\\xb6\\xc2\\x82\\xb4\\x00\\xfe\\xdd\\xe5\\x24\\x39\\xd4\\x72\\x21\\x2c\\x57\\x67\\xa3\\x5d\\xa5\\x20\\x10\\x32\\xda\\x87\\x30\\x96\\x8b\\x07\\x20\\xe8\\xa6\\x04\\xde\\x6c\\x1b\\xaa\\x3f\\x4e\\x89\\x6a\\xc2\\x61\\x4f\\xb1\\xab\\x6e\\x3f\\x6c\\xf3\\x87\\xa8\\xeb\\x2f\\xf8\\xa9\\x21\\x47\\xab\\x34\\x92\\x38\\x43\\x2e\\x50\\x9d\\x82\\x9c\\xb7\\x5b\\x2c\\x17\\x65\\xc5\\x12\\x21\\x84\\x8e\\x25\\xaf\\xff\\x5f\\x16\\xe4\\xdd\\x0c\\xd5\\xc9\\xf7\\x13\\xc4\\xaa\\xab\\x2c\\xe8\\x36\\xf8\\x49\\x45\\x06\\xb5\\x30\\x9d\\xc2\\xb0\\xae\\x74\\x5b\\xb9\\xc4\\x79\\x80\\x98\\xfb\\x86\\x41\\xd5\\x20\\xa0\\x8b\\x02\\xf7\\x5a\\xd8\\x0d\\xbc\\x2c\\xe2\\x9e\\x89\\x0b\\x4d\\x72\\xa3\\xff\\xb2\\xa1\\xcb\\xd5\\x38\\xe1\\x22\\x9f\\x57\\x9c\\x29\\xae\\x66\\xbc\\xa8\\x5e\\x0f\\xa0\\x8c\\x86\\x47\\xa1\\xab\\xcf\\xe8\\xa4\\x9f\\x5e\\x50\\x8d\\x4d\\x24\\x95\\x55\\x66\\x23\\xd9\\x26\\xce\\x49\\xef\\xa4\\x35\\x0a\\xaa\\xab\\x5c\\xec\\x2c\\xd8\\x85\\xbe\\x1d\\x63\\x47\\x5e\\x3b\\xab\\x7c\\x7c\\xdc\\x8d\\x65\\x61\\x73\\xb8\\xd4\\x56\\x02\\xf4\\xb3\\xd2\\x81\\x24\\x1d\\x17\\x19\\x03\\x27\\xb2\\x4c\\x38\\x36\\xb1\\x93\\x11\\xa1\\x93\\xaf\\x86\\xa6\\x76\\x8f\\x04\\x85\\x2a\\xb0\\x6e\\x67\\xc8\\xea\\xd5\\x91\\xcd\\xcb\\xf3\\x78\\x9c\\x61\\x32\\x09\\xcf\\xe0\\x3f\\x58\\xc0\\x30\\x5f\\x63\\x20\\x3b\\x48\\x7f\\x7c\\x5f\\xc0\\x98\\x87\\x7e\\xc9\\x8a\\x68\\x9c\\x9d\\x35\\xaf\\x81\\xe8\\x40\\x78\\xd6\\x6f\\xe9\\xe4\\xec\\xcb\\xb1\\xcc\\x6c\\x71\\x99\\x1c\\x03\\x01\\x7b\\xb8\\x11\\xf4\\x1f\\x07\\xde\\x68\\xfa\\xd1\\x94\\x14\\x60\\x61\\x32\\x4f\\x3d\\x0e\\xf2\\x17\\xa5\\x4c\\xf3\\x8f\\x7a\\x62\\x5a\\x38\\x86\\x9f\\x67\\xd0\\xb7\\x43\\x1d\\xf9\\x37\\xcd\\xe3\\x49\\xc1\\x75\\xce\\x8b\\x26\\xac\\x88\\xd3\\x9a\\x43\\xe2\\x79\\xb0\\x18\\x76\\x4e\\xfa\\x4d\\xd6\\x27\\xcb\\xf5\\x91\\xf6\\x20\\x9c\\x4a\\x5b\\xb1\\x9e\\xbf\\xa7\\xc7\\x13\\x55\\x92\\xd0\\x2e\\x50\\x1c\\xae\\x5e\\x6b\\x31\\xc9\\x0e\\x72\\xfa\\xab\\x47\\xf7\\xdc\\xed\\x2c\\x48\\xad\\xf8\\x84\\x43\\xb3\\xed\\xe6\\x0c\\xef\\xb0\\xd6\\x37\\x9d\\x69\\x22\\xec\\x43\\x7f\\x08\\x6b\\xad\\x62\\x17\\xd4\\xd4\\xff\\xef\\x18\\xe2\\x25\\x23\\x66\\x4b\\xf4\\xe9\\xca\\x1e\\x65\\xa2\\x8c\\x2a\\x7a\\x60\\xc5\\xf6\\xbc\\x90\\x6b\\x73\\x7c\\x29\\x93\\x5f\\x90\\x97\\x46\\x30\\x48\\x57\\x5b\\xef\\xd1\\xa2\\x54\\x9d\\xc4\\x74\\xb1\\x3e\\x68\\xae\\xec\\xf1\\x66\\x04\\x3e\\x07\\x5a\\xac\\x51\\x55\\x40\\xf8\\x31\\xb4\\x30\\x66\\xce\\xf9\\x32\\xe6\\x3d\\xcd\\x5b\\x37\\xb6\\x15\\x78\\xc3\\x5b\\x09\\xe4\\x5c\\xc2\\xa8\\xde\\xf5\\x71\\x03\\xed\\xfc\\x5f\\x64\\x98\\x31\\xa8\\x96\\x1f\\xe4\\xa4\\xb3\\x72\\x1f\\x1d\\x6d\\xf4\\xea\\x9f\\x03\\x38\\x81\\xb4\\x74\\x30\\x0e\\x0f\\x12\\xcb\\x9c\\xd3\\xba\\xbd\\xcf\\xfb\\xb9\\x18\\xdd\\x9b\\xb0\\xe2\\xf5\\xb2\\x10\\x33\\xe4\\x30\\x23\\xa0\\xd2\\xe6\\x6d\\xa3\\xab\\x0f\\x07\\xee\\x98\\x8b\\x16\\x88\\x9c\\xa5\\xd5\\x1a\\xbd\\xc0\\x5f\\xde\"},\n{{0x33,0x47,0xdc,0x47,0xbb,0x3d,0x2e,0x5d,0x02,0x86,0xac,0x06,0xa5,0x4f,0xd9,0x21,0xc9,0xe9,0x6b,0x68,0x99,0x86,0x2a,0x54,0xe5,0xcc,0x81,0x15,0xd3,0xd0,0xba,0x99,},{0xd0,0x0b,0x64,0x5d,0x86,0xdb,0xb7,0xe5,0x24,0x75,0x7e,0xc7,0x78,0xc6,0x2b,0x7e,0x60,0xd0,0xb6,0x57,0x68,0x83,0x33,0x8c,0x9b,0x67,0xc2,0xc7,0xe4,0x50,0x92,0x68,},{0x9a,0xb4,0x29,0x9b,0x17,0x72,0x93,0x44,0x75,0x0b,0x69,0xdc,0x60,0x37,0x36,0x8c,0x98,0xf4,0x7b,0xe6,0x27,0xfb,0xd9,0xad,0xfd,0x8d,0xb3,0x9f,0x99,0x64,0xdd,0xb7,0xbc,0x92,0xd6,0x74,0xc7,0xbe,0x74,0x07,0x56,0x39,0x6b,0xaa,0xee,0xac,0xbf,0x74,0x94,0x7b,0x61,0x91,0xc6,0xed,0x1f,0x5d,0x32,0xa6,0x3d,0xf3,0x6d,0x54,0x26,0x01,},\"\\xe2\\xf4\\x8e\\xdf\\x9d\\x64\\x33\\x20\\xab\\x99\\x1c\\x8f\\xf9\\xf6\\xaa\\x75\\xfe\\x06\\x6e\\x7d\\x88\\xff\\x1e\\x47\\x2a\\x5a\\xc9\\xc5\\x18\\xde\\x1f\\xb6\\x29\\x83\\xb1\\x00\\x7f\\x64\\x22\\x80\\x91\\x17\\xbd\\xbe\\x8a\\x0e\\x57\\x87\\xf6\\x6b\\xb0\\x57\\xd2\\x7f\\x12\\x9a\\x20\\x0b\\x40\\x57\\x6e\\x17\\x19\\xcf\\x9e\\x98\\xfc\\xb7\\x2a\\xf9\\x4b\\xb8\\x2e\\xe7\\x0f\\x37\\x19\\xa2\\xe2\\xcd\\x9b\\x64\\x77\\x7c\\xea\\x5e\\x44\\x64\\x59\\x87\\x4b\\x74\\xbf\\xbf\\x56\\xb2\\xd2\\x52\\x64\\x00\\x59\\x2a\\x9b\\x45\\xa5\\xcb\\x79\\x80\\x92\\xb6\\x0a\\x81\\xb7\\x1d\\x82\\xf0\\x68\\x5f\\xae\\x7f\\x81\\x0b\\x52\\xd2\\x26\\xad\\xac\\x7a\\xd8\\xa9\\x18\\x3f\\x09\\xfe\\xbe\\xe9\\xd2\\x50\\x46\\xc0\\xfe\\x30\\x66\\x81\\xac\\xe2\\xbf\\xf9\\x1b\\x34\\x82\\xb0\\xbc\\x30\\xb2\\x02\\x1c\\x43\\x41\\x64\\x5d\\x67\\x51\\x34\\xfe\\x30\\x81\\xc5\\x1e\\x5c\\x59\\xe4\\x0b\\x37\\x5a\\x14\\x34\\xf6\\x3b\\x42\\x6e\\x30\\x53\\x0d\\xa9\\x35\\x3b\\xb2\\xa9\\x42\\x32\\x20\\x43\\x4a\\xe5\\x9d\\x7b\\x6f\\xdc\\x14\\x3f\\x49\\x82\\xeb\\x8c\\xfa\\x77\\x51\\xb7\\x5b\\xf3\\xe9\\xc9\\x13\\xc7\\x3b\\x76\\x0b\\x07\\xd3\\x95\\x31\\x0c\\x59\\xf3\\xb7\\x7e\\xbf\\x12\\xed\\x2d\\x7b\\x03\\x59\\x0d\\x33\\x17\\xaf\\x17\\xdf\\x42\\x1e\\x78\\xb0\\x84\\x9f\\xd5\\x6d\\x94\\x5c\\x56\\x96\\xa0\\x40\\xfc\\xaa\\x78\\xa9\\x3e\\xcc\\x16\\xd5\\xac\\x34\\x45\\x06\\x36\\x11\\xf3\\x01\\x3e\\x9a\\x3a\\xe2\\xe1\\xc2\\x70\\xdd\\x01\\xa8\\xff\\xe3\\xe6\\x12\\x6b\\xc1\\xe4\\xc9\\x5f\\x65\\x47\\xa8\\x65\\x1f\\x26\\xb6\\x40\\x4e\\x39\\xee\\x4c\\xe7\\x61\\x89\\x18\\xf3\\xf9\\x37\\xa5\\x25\\x73\\xec\\x27\\x7b\\x77\\x1e\\x91\\xad\\x09\\x6f\\xa1\\x5c\\x7a\\x34\\x0a\\x80\\x9b\\x47\\x03\\x18\\xa4\\x63\\x64\\x23\\xeb\\x48\\x88\\xa1\\x21\\x60\\xc4\\x66\\x3f\\xce\\x29\\x96\\xd6\\x38\\x89\\x6c\\x83\\x9b\\x2c\\x7a\\xd4\\xb3\\xa9\\xb2\\xe6\\xcb\\x71\\xe9\\x12\\xfe\\x39\\xb8\\x43\\xc6\\xe0\\x83\\x2e\\xca\\x22\\xde\\x93\\x8b\\x50\\xae\\x86\\x3e\\x48\\x58\\x2c\\x10\\x85\\x12\\x32\\xf7\\x5e\\x52\\x25\\xb8\\x89\\x6b\\x5a\\x47\\x0f\\x81\\x8b\\x6f\\xa3\\x9e\\xb7\\xbb\\x59\\x03\\x57\\x67\\x86\\x12\\xd2\\x5f\\xe1\\xa4\\x0e\\xa1\\xb9\\xd7\\x1d\\x88\\x09\\x09\\xc1\\xbd\\x4a\\xd1\\x76\\xcc\\x0c\\xef\\xfd\\xce\\xe7\\x09\\x9e\\x78\\x82\\xa7\\xc9\\x07\\xe4\\xbe\\xc7\\x98\\x30\\xc6\\x77\\x1a\\xcb\\x89\\x94\\x4b\\xd5\\x4a\\x51\\x65\\xb3\\x18\\x70\\x91\\x69\\x21\\xb1\\x98\\xac\\xd4\\x43\\x2e\\x7e\\xed\\x8c\\xe1\\xde\\xb3\\x45\\xb1\\x07\\xed\\xa7\\x60\\x26\\x6f\\xcb\\xda\\x3b\\xa5\\x22\\x94\\x00\\xa3\\x03\\x60\\xa4\\x64\\x5c\\xa8\\xdb\\x38\\xc3\\xd5\\xf4\\xa8\\xde\\xf1\\x57\\xbb\\xdb\\xbf\\x2c\\x1f\\xa1\\xdc\\x6b\\x05\\x14\\xa4\\xf5\\xa0\\x36\\x4f\\x92\\x83\\x81\\xb4\\x0f\\x95\\x57\\x9a\\x26\\x46\\x7f\\x22\\x82\\xa8\\xa2\\x55\\x75\\x84\\x02\\xac\\x9c\\xa8\\x0e\\x89\\xb9\\xcc\\x68\\x60\\xa3\\x4b\\xb3\\xf9\\x0c\\x32\\x37\\x65\\x7c\\x21\\x29\\xea\\x48\\xc8\\x52\\xb9\\x25\\x69\\xe8\\x11\\x06\\xbc\\xe4\\x61\\xe2\\x02\\x44\\x54\\x82\\x1a\\x91\\x75\\x92\\xd1\\x99\\x1b\\x5b\\x69\\xf2\\x7b\\xbe\\x01\\x99\\x77\\x52\\x8a\\x2f\\xc0\\x11\\x92\\xc5\\x6b\\x4a\\xea\\x87\\x3c\\xf8\\xc5\\x8d\\xfd\\x7c\\xb4\\xb0\\xe9\\x17\\xe8\\x7a\\x87\\x04\\xc9\\x92\\x82\\x0f\\x98\\xd7\\x74\\x04\\xd3\\xf1\\xd2\\x05\\x0c\\x67\\x43\\xf6\\xe9\\x3c\\xdb\\x51\\xa6\\x1a\\xa6\\xf4\\x5b\\x35\\x1b\\x26\\x46\\x1d\\x13\\x29\\xf3\\x15\\x12\\x72\\xac\\x39\\x62\\x34\\xd0\\xd6\\x7c\\x17\\x8a\\xcf\\x91\\xfc\\x51\\x0d\\x86\\x42\\x9c\\x69\\xa8\\x7f\\xdf\\x10\\x11\\x55\\xda\\x8d\\x94\\xde\\x67\\x22\\x23\\x8a\\x6f\\xb1\\x70\\x16\\x86\\x2b\\x11\\xd5\\x02\\xc6\\x67\\xee\\x9c\\xa0\\xaa\\xbe\\x1c\\x20\\xb9\\x77\\x89\\xf1\\x86\\x7a\\xdd\\x78\\xb8\\xb8\\x7e\\x9a\\xb5\\x19\\x34\\xc0\\xb4\\xa1\\x6c\\x2c\\xbc\\x4d\\x2e\\xfe\\xdb\\x79\\xc0\\x5b\\x23\\xe0\\xcf\\x78\\x92\\x01\\xac\\x75\\xfe\\x07\\x6d\\x31\\x5f\\xcb\\xac\\x20\\xba\\x0d\\x31\\xe4\\xdc\\x61\\x69\\x27\\xd6\\xea\\xb1\\xb1\\xc8\\x7a\\x1c\\x9c\\x77\\x8e\\x4b\\xd2\\x85\\x29\\x58\\x74\"},\n{{0xff,0x15,0xd6,0xe7,0x4e,0x28,0xe4,0x1d,0x05,0xa8,0x66,0x3a,0x70,0x2f,0x03,0x8d,0x5b,0x85,0x78,0xc4,0x27,0x5e,0x77,0x2b,0x73,0xba,0x44,0x0b,0xc5,0xf5,0x5a,0x06,},{0x47,0x47,0xe2,0xe9,0xb8,0x26,0x37,0xb3,0x84,0x4b,0x85,0xf7,0x5b,0x59,0xf7,0x13,0x6b,0x7f,0xdb,0x1a,0x62,0xe7,0xb7,0x0d,0x6a,0xac,0x17,0xb3,0xc5,0x75,0x2f,0x2f,},{0x42,0xc1,0x29,0x5f,0xaf,0xe2,0x6d,0xe3,0xea,0x34,0x92,0x6b,0xf1,0xef,0x80,0xbc,0xaf,0xe4,0x7b,0x21,0xb9,0x0e,0xae,0xd1,0x96,0x35,0xed,0x75,0x38,0xd7,0x67,0xcb,0xf3,0xa1,0xe5,0xde,0xda,0xab,0x82,0xad,0xf7,0x51,0x20,0x37,0x3e,0x92,0x32,0x02,0xf7,0xfd,0xa0,0x82,0x67,0x84,0x29,0x2e,0xba,0x8b,0x23,0x8b,0x6c,0xb8,0x83,0x04,},\"\\xce\\x7b\\xf9\\x72\\x84\\x4f\\x51\\x84\\xae\\x8e\\xac\\x87\\xb1\\x2b\\xe9\\x20\\x2c\\x72\\x39\\x96\\x1d\\xc2\\x3c\\xd4\\x1f\\xf5\\x5b\\x9b\\xfa\\xac\\x0c\\xc0\\x6f\\x3f\\x1d\\xec\\xfa\\x95\\x71\\x09\\x5c\\x8e\\x82\\xb4\\xeb\\x6f\\x8a\\x1c\\x52\\xc8\\xd3\\xde\\xaa\\x61\\xa9\\xaa\\x94\\xe2\\xec\\xd9\\xab\\x5b\\x80\\x63\\xf2\\xda\\x6d\\x80\\x15\\xdf\\x0a\\x51\\x44\\xfa\\x3a\\x48\\xe3\\x05\\xad\\x9f\\x41\\xea\\xa1\\x1c\\x4d\\x74\\x85\\x43\\x74\\xec\\xbf\\x38\\x2e\\x30\\x02\\x57\\x9a\\x9a\\x24\\x9e\\xfa\\x1e\\x1c\\xa0\\x4d\\x33\\x84\\x47\\xd7\\xf2\\x20\\x67\\x03\\xe6\\xca\\xbf\\x5b\\xbd\\x33\\x2b\\x42\\x57\\x3b\\xcb\\xd3\\xb6\\xf7\\x1b\\x7c\\x3b\\xf7\\x3d\\x4c\\x77\\x4a\\xa0\\x1e\\x86\\x68\\x41\\x43\\x28\\x29\\xd0\\x7f\\x96\\xe1\\xf6\\x1a\\x20\\x21\\x6d\\x96\\x8c\\x90\\xe3\\xed\\x11\\xf6\\x63\\xf7\\xd6\\x27\\x16\\x22\\xfe\\xfc\\xf3\\xab\\x68\\xf3\\x44\\x32\\x85\\x15\\xd5\\xcc\\xe2\\xce\\x85\\xe8\\xbf\\x3d\\x1d\\x09\\x04\\x36\\x92\\xe1\\xfb\\x8b\\xbd\\xdc\\x07\\xa4\\xab\\x0a\\x3e\\xef\\x8c\\xa6\\xa4\\x20\\xe7\\x4b\\xff\\x8d\\x3d\\x71\\x55\\x96\\xaa\\x82\\x16\\x82\\x95\\x4f\\xe8\\x96\\x29\\xae\\x27\\xc1\\xbb\\x03\\xb6\\xaa\\x09\\xf3\\x6a\\x39\\xa3\\xe3\\x7b\\xa9\\x81\\x32\\xf4\\xe2\\x38\\x88\\xf9\\xf3\\x35\\xe7\\xbe\\xaa\\x2c\\xb2\\x72\\x7a\\xcc\\x3d\\x27\\x77\\x30\\x9b\\x85\\x29\\x52\\x32\\xe5\\x4d\\xa8\\x8e\\xbb\\x6f\\x10\\x53\\xd6\\xde\\x79\\xac\\x66\\x09\\x85\\x2e\\xb9\\x3a\\x0a\\x35\\xbc\\x1a\\x7b\\xdc\\x22\\xd6\\x28\\xbc\\x86\\x12\\x4d\\x69\\x6c\\x3f\\x98\\x28\\xb6\\xf8\\xb9\\xaa\\xde\\x1a\\x65\\x21\\x61\\x77\\x48\\x6c\\x25\\x2a\\x4b\\x42\\xd9\\x0a\\x4e\\x0f\\xea\\x20\\x93\\x48\\x9e\\x24\\x4d\\x80\\x8e\\xf7\\x02\\x1a\\x97\\xd5\\x60\\x8c\\x0a\\xe1\\xd6\\x63\\xc7\\x75\\xe8\\xbb\\x9e\\x9a\\x73\\x15\\xf1\\xfe\\xb6\\xd1\\x29\\xb5\\xa5\\x41\\xea\\x59\\x29\\xa2\\xc6\\x33\\xb6\\xd8\\xc3\\xc4\\x54\\x41\\x71\\x79\\x46\\xcf\\x87\\x3e\\x9b\\x4c\\x51\\x21\\x80\\x13\\x5d\\x54\\xf0\\x53\\xab\\xe4\\x4c\\x6d\\xf3\\x9b\\x7b\\x06\\x2e\\xf7\\x24\\x01\\x62\\xcb\\xd0\\xb8\\x51\\xaf\\xe5\\xf9\\x15\\x36\\xa9\\x49\\x94\\x18\\xe8\\xbf\\xf4\\x99\\x64\\x73\\xd8\\x05\\xeb\\xc1\\xae\\x48\\xda\\x2d\\x0b\\x12\\x9e\\x8e\\x82\\x52\\xf1\\xd5\\x3c\\x32\\x8f\\x32\\xdb\\x25\\x2d\\xe3\\xbe\\xfb\\xe5\\xf3\\x12\\x80\\x12\\x11\\x43\\xa8\\x00\\x4a\\x4c\\xae\\x63\\x1c\\x82\\x74\\x09\\xe5\\x20\\xe3\\x94\\xcd\\x0f\\x89\\x50\\xcd\\x4c\\x3c\\xf3\\xf3\\xdb\\xd4\\x95\\x2a\\x4d\\xfe\\x69\\x87\\x5f\\x56\\x53\\x89\\x06\\x1a\\xd0\\xa0\\xce\\xe6\\xb6\\xaf\\xf0\\x9c\\xec\\xa2\\x6d\\x99\\x0e\\x89\\x6a\\x2a\\xba\\x9f\\x3b\\x26\\x01\\x5b\\x63\\x42\\x37\\x68\\x68\\x4c\\x03\\xed\\x0d\\xe6\\xce\\xe7\\xac\\x5b\\xbd\\xf9\\xf4\\x85\\xc2\\x27\\x5c\\xd1\\x2a\\xef\\xa8\\xf9\\x07\\xb8\\x51\\xa0\\x2d\\x51\\xc3\\x4f\\x12\\x1b\\x77\\xf3\\xa5\\x6a\\x9e\\xbd\\x1d\\x65\\xff\\xe8\\x9b\\xee\\x38\\x1f\\xf2\\xa7\\x48\\x0e\\x89\\x68\\xcf\\xf2\\x5a\\xc8\\xd0\\x4e\\x14\\x9a\\x9d\\x50\\x27\\xd1\\x4b\\x88\\xf8\\xae\\x26\\x04\\xd2\\xac\\x22\\xac\\x67\\xd1\\x3e\\x90\\xad\\xa6\\x20\\xc2\\x04\\x6d\\x28\\x29\\x93\\x84\\xd0\\x95\\x9f\\xb7\\x6e\\x22\\x58\\x87\\x96\\xce\\x42\\x7a\\xae\\xaf\\x4e\\x2a\\x8a\\xae\\xc3\\xe8\\x7f\\x84\\xcc\\xd0\\x82\\x52\\x4c\\x96\\xd7\\x66\\xee\\xc6\\x6f\\x0b\\xec\\x3e\\x79\\x95\\x58\\x14\\x5f\\x09\\xd3\\x30\\x13\\x4f\\x1c\\x63\\xf3\\x70\\x53\\xcd\\x4b\\xdc\\x1c\\x37\\xfd\\xe9\\x72\\x91\\x85\\x75\\x51\\xf5\\x0a\\xc8\\xe1\\x5f\\x06\\xac\\x1c\\x73\\xda\\xa1\\xe8\\xc5\\xbc\\x92\\x77\\xe3\\xd6\\x9c\\xb4\\x4a\\x32\\x37\\xec\\x57\\xdb\\xbc\\xcf\\xdf\\x66\\x85\\xad\\xa2\\x0b\\x74\\xa1\\xbc\\x6b\\x74\\xab\\x05\\x69\\x0e\\xaf\\x9b\\xd0\\xc4\\xbe\\x17\\x04\\x2f\\x5c\\xd3\\x20\\xcd\\xd6\\x13\\xdc\\x08\\xd2\\x9a\\xf3\\x46\\xaa\\x41\\x91\\xce\\x0b\\x4f\\x85\\xbb\\x2a\\xd7\\xf3\\xba\\xc7\\x38\\xa9\\x37\\x7e\\xc6\\xb8\\x40\\x62\\xcc\\x70\\xfc\\xa9\\xec\\xfb\\xe1\\xf5\\x7f\\xe5\\xb2\\xce\\x7a\\x4f\\x73\\x9c\\x81\\xca\\xbc\\xde\\x04\\x64\\x51\\xdd\\x61\\xce\\x1d\\xbc\"},\n{{0x1e,0xd3,0x7b,0x61,0x0b,0x8b,0x35,0x41,0x7d,0x04,0xe5,0x9a,0xaa,0xda,0xc6,0x88,0xff,0x81,0xf1,0xe5,0x07,0xc8,0x9b,0x4f,0x40,0x01,0x60,0x94,0x19,0x08,0xcb,0x8c,},{0x48,0xe8,0xcb,0xeb,0x12,0x40,0xbd,0xeb,0xf0,0xa2,0xd9,0x29,0x53,0xaa,0x89,0xb2,0x82,0xc4,0x9a,0xab,0x2c,0x38,0xae,0x69,0x04,0x4c,0x51,0x51,0x5c,0x33,0x00,0xd5,},{0x86,0x08,0x81,0x5e,0x10,0x59,0x0d,0x55,0x04,0x87,0x4d,0x89,0x99,0xfd,0x6f,0x09,0x62,0x6f,0x95,0x0b,0xe2,0x0c,0x91,0x2c,0x27,0xc9,0xde,0x6e,0x79,0xb0,0xfa,0xf7,0x77,0xa5,0x33,0xbd,0x5b,0xb6,0x67,0xab,0x51,0x3a,0x49,0x45,0x8e,0xcd,0x67,0x87,0xa0,0x9e,0xc0,0xdf,0x6c,0x9c,0x9d,0x63,0x33,0xc5,0xe3,0xae,0x61,0xea,0x37,0x0a,},\"\\x1e\\x67\\x67\\xdf\\x97\\xdb\\x1c\\xfb\\x40\\x88\\xda\\x7b\\x20\\x0d\\x9f\\x59\\xec\\x8d\\xd4\\x53\\x3b\\x83\\xbe\\x30\\x9f\\x37\\x65\\x00\\x31\\x06\\x57\\x27\\xcd\\x52\\x02\\xce\\xf4\\x84\\x26\\xa5\\xf3\\xa1\\x1d\\x50\\xb3\\x81\\xf8\\xbc\\x22\\xff\\x10\\x18\\x27\\x35\\x9f\\x2d\\x0a\\x61\\x0a\\x4f\\x75\\x54\\x64\\xa0\\xc8\\x91\\xcb\\xd9\\x8d\\x2d\\xcb\\x41\\xd9\\x77\\x9d\\x28\\x8f\\xcf\\x1f\\xea\\x62\\xe5\\x21\\x63\\xae\\x67\\xe9\\x04\\x28\\xb8\\x63\\x98\\xef\\xa2\\x18\\xf1\\xb9\\x82\\x08\\x1f\\xc5\\x13\\x30\\x5f\\xd3\\xe8\\xec\\xe7\\xf9\\xac\\xb0\\xe1\\x0e\\x00\\x1d\\x2e\\xd2\\x99\\xa4\\x8a\\x80\\x87\\x0b\\x3d\\x5d\\x8a\\xb9\\x00\\x63\\x09\\xb3\\x15\\x91\\xca\\xf0\\x58\\x33\\x80\\x07\\x3a\\x2d\\xb6\\x1f\\x45\\x25\\x4a\\xb9\\x65\\xb5\\xe4\\x67\\x2c\\x4b\\xfa\\xa8\\x6e\\x33\\x6c\\x49\\x27\\x85\\x52\\x72\\x9f\\xb2\\xda\\x76\\xff\\xe5\\x02\\xec\\x61\\xe1\\x69\\x6c\\x7f\\xc9\\xef\\x19\\xf7\\xcc\\x2a\\x27\\x75\\xb2\\x97\\x00\\xcb\\x38\\x42\\x94\\x06\\x3a\\x17\\xfe\\xd4\\xfc\\x63\\x5b\\xc1\\x32\\x82\\xa9\\x0d\\xad\\x0c\\x00\\xaa\\xdb\\xcd\\x56\\x9f\\x15\\x6a\\x85\\x4f\\x8b\\xa9\\xe7\\xd6\\x07\\xd2\\x0f\\x2e\\x9e\\x53\\x37\\x98\\x11\\x61\\xd8\\x04\\x64\\x46\\x68\\xd0\\x64\\xfa\\x63\\xdc\\xeb\\x9f\\x58\\x01\\x35\\x3d\\x0a\\xb9\\xf4\\x1d\\x1d\\x8b\\xdc\\x76\\xc1\\x3a\\xb2\\xf0\\x23\\xea\\x01\\xad\\xbc\\x4c\\x81\\x68\\xd9\\x39\\xe9\\x8f\\x64\\xfd\\x89\\x19\\x38\\x4a\\xbe\\x76\\x70\\x92\\x63\\xc0\\xcd\\x7c\\x3e\\xfa\\xdc\\x28\\x01\\xcc\\x4a\\xbd\\x80\\xa0\\x9b\\xb3\\xed\\x6b\\xb7\\x8c\\xd6\\x20\\x96\\x9c\\xd3\\x5c\\x6a\\x3a\\x5d\\x01\\x48\\x5e\\xad\\x4c\\x45\\xeb\\xb6\\xac\\x6a\\x83\\x21\\x2a\\x7c\\x76\\x67\\x54\\x27\\xb2\\x1d\\xa8\\xa7\\xa5\\x04\\x7b\\x30\\xa6\\x10\\x0c\\xda\\x02\\x47\\x6c\\x18\\x6e\\x6c\\xe4\\x0d\\x27\\x68\\xa9\\x42\\xc9\\xf8\\x73\\x05\\xe9\\xd3\\x63\\xb5\\x24\\xc0\\x09\\x4a\\x9e\\x2e\\x29\\xf5\\x85\\x89\\x4c\\x0a\\xdb\\xfc\\xd6\\x06\\x90\\xfc\\x7f\\xb0\\xa9\\xc7\\x17\\xcf\\x43\\xb4\\x84\\xfd\\x45\\x15\\x1b\\x13\\x04\\x16\\x9c\\x26\\x92\\x1d\\xb2\\x27\\x6e\\xc0\\x5a\\xd2\\x2a\\xd1\\x66\\x85\\x4f\\xd2\\xf9\\x40\\x85\\x77\\x8c\\x47\\x0d\\xc4\\x52\\xe5\\xcf\\xa4\\xae\\xe0\\x4f\\xac\\xb7\\x70\\x52\\x6e\\x1f\\x24\\x8d\\x3d\\x15\\xc2\\x72\\x80\\xfd\\xfa\\x1f\\xd2\\xc1\\x04\\x4b\\xcb\\xc8\\x81\\xc3\\xd9\\x98\\x15\\xc9\\x7f\\xbe\\xa4\\x61\\x10\\xbe\\x02\\xda\\xb7\\x74\\xf3\\xa6\\x10\\xe5\\x80\\x2a\\xbf\\x36\\xa4\\x98\\x75\\xc6\\x82\\x63\\x8e\\x0a\\xe4\\xcc\\x82\\x77\\xc5\\xe9\\xaa\\x73\\x07\\x44\\x5e\\x6b\\xbc\\xbe\\x54\\x9e\\xec\\x2a\\x45\\xb1\\x59\\x7f\\x74\\x47\\x10\\x7b\\x62\\xe2\\xce\\xe0\\xa5\\xfc\\x51\\xbe\\xae\\x3e\\x1f\\xe9\\xbe\\xfb\\x18\\x85\\xd9\\xb3\\x0f\\x9b\\x4f\\x1f\\x56\\x20\\x6d\\xee\\x0d\\x67\\x77\\x9c\\x57\\xf4\\x84\\xc8\\xc3\\xc8\\x99\\xa5\\x15\\xa9\\xd1\\xc1\\x0f\\x60\\x59\\x84\\x0c\\x1c\\x73\\xd3\\xf0\\x5b\\xcb\\x88\\x59\\x0c\\x52\\xf7\\xda\\x39\\x18\\x38\\xdc\\x2e\\x73\\x22\\x8f\\x09\\x81\\xc2\\x89\\xa4\\xc2\\x7f\\x0c\\x75\\x7f\\xaf\\x7b\\x3b\\x89\\x14\\x6e\\x33\\xda\\xfa\\x49\\x0d\\x9e\\x0f\\x92\\x75\\xb0\\xcf\\xa6\\xa7\\x71\\x0a\\x73\\x83\\x14\\x59\\x59\\x5b\\xf7\\x32\\x11\\x2b\\x62\\xfc\\x86\\x4c\\xa4\\xc8\\x29\\x78\\x4a\\x3f\\x16\\xee\\xc4\\xe1\\x8f\\x93\\x69\\x18\\xa7\\xb9\\x89\\x16\\x69\\xe9\\x33\\x22\\x3f\\x74\\x5f\\xda\\x56\\x2b\\xc0\\xa4\\xe6\\x1e\\x3d\\x14\\xea\\x45\\xdf\\xc3\\x27\\xe2\\xfc\\x0c\\xdf\\xe6\\xf2\\xf9\\x75\\x46\\xc9\\x0f\\xce\\x82\\xf5\\x22\\x29\\x14\\x80\\x11\\x1a\\x1e\\x6b\\x93\\x88\\x27\\x2c\\x0b\\xe2\\x8d\\x20\\xed\\x84\\xbb\\x84\\xd4\\x9b\\xc1\\x99\\xcd\\x59\\x99\\x48\\xb8\\xf2\\x03\\x9d\\x07\\x82\\x7a\\x3f\\x40\\x75\\xd3\\xa6\\x7e\\xe5\\x72\\xa0\\x13\\x79\\xa3\\x62\\x13\\xfe\\x11\\x6e\\x76\\x8b\\x41\\x14\\xe8\\xa4\\xb3\\x13\\x4c\\x38\\x18\\x96\\x07\\x72\\xd7\\x27\\xb0\\xca\\x6f\\x7c\\x99\\x7c\\xa9\\x98\\x43\\xb7\\xeb\\x02\\xff\\xc0\\x13\\x97\\x1c\\xbe\\x0e\\x6e\\x60\\xd4\\x97\\x73\\xf1\\xe8\\xc0\\xb3\\x06\\x06\\x13\\x1c\\xb1\\x0c\\x3e\\x04\"},\n{{0x84,0x36,0x44,0x78,0xec,0x94,0xbd,0x25,0xc4,0xbd,0xb8,0x2d,0x29,0x62,0x29,0xe6,0xda,0xce,0x2b,0x13,0x59,0xd6,0xd2,0x1b,0xe2,0xb3,0xaf,0xcd,0x7b,0xda,0x19,0xc7,},{0xa1,0x81,0x4f,0x8c,0xe0,0xfc,0x3b,0x23,0x60,0x93,0xa5,0x0f,0x46,0x8c,0x13,0x16,0x21,0x1f,0xe6,0xc5,0x2e,0x23,0x45,0xd9,0xf0,0x76,0x6b,0x36,0x88,0xa0,0x3c,0xad,},{0xb4,0xc2,0x32,0x1a,0xde,0x3c,0x19,0xed,0x4e,0xd4,0xc6,0x39,0xd5,0xa4,0xd6,0xf2,0xbe,0x8e,0x2f,0xb1,0x3b,0xb7,0xbd,0x62,0x5a,0xd6,0xdc,0x87,0xe2,0xc2,0x0f,0x93,0xad,0x6b,0xe7,0xb7,0xe4,0x27,0x11,0xa8,0x78,0xdb,0x9d,0x76,0x05,0x4b,0xfd,0x7b,0xc2,0x5e,0x37,0x74,0xa9,0x3d,0xa1,0x54,0x3c,0x9b,0x4f,0x66,0x33,0xb0,0xbe,0x09,},\"\\x7b\\xb7\\x29\\x3d\\xe5\\x5f\\x05\\x8f\\xb2\\xec\\x22\\xb6\\x87\\x26\\x05\\x43\\xdc\\xaa\\x90\\xf1\\x40\\xb9\\xf4\\x5e\\xdd\\xd4\\xbc\\x22\\xe4\\x09\\x77\\xe0\\x0e\\xd3\\x3c\\xd1\\xef\\x1b\\xba\\x13\\xc1\\xd0\\x99\\x08\\x59\\x00\\x55\\x69\\xa8\\x07\\x67\\xe4\\x86\\x4a\\x2c\\xd2\\x88\\xc8\\x13\\x93\\xe0\\x4a\\xd9\\x71\\x78\\x2e\\x2b\\xc4\\x93\\x10\\x8c\\xbe\\x80\\xda\\xcf\\x0b\\x7b\\x9c\\xd5\\x34\\x98\\x84\\x07\\xa4\\xf9\\x32\\x7e\\xc8\\xe9\\xc4\\x04\\x32\\x84\\xef\\x6e\\xe5\\xa2\\x6a\\x5b\\x41\\x77\\x65\\xd3\\xea\\xbb\\x48\\xa0\\x07\\xe7\\xc7\\xf3\\x29\\x87\\xd7\\x0a\\x13\\x9a\\xc4\\x16\\x78\\xcd\\xf7\\xa5\\x5c\\xb8\\x0c\\xf9\\xdb\\x5e\\xaa\\x45\\xf3\\xde\\x0f\\xbf\\xba\\xdf\\xfc\\x40\\x99\\x63\\x70\\xe4\\x8b\\x1f\\xf5\\xed\\xd9\\x79\\x40\\xe7\\x50\\x79\\x21\\x64\\x83\\x6a\\x4a\\x5a\\xc2\\xe3\\xff\\x53\\xe4\\x8a\\x1e\\x55\\x6d\\xb9\\xad\\x0c\\x5c\\x0b\\x94\\x4f\\x4a\\xee\\x51\\x9a\\x2b\\x0a\\x88\\xbb\\x1c\\x1f\\xc7\\x45\\x45\\x24\\xcd\\x57\\xaa\\x53\\x50\\x98\\x62\\x43\\xd3\\x4f\\xc5\\x8e\\x24\\xe8\\x19\\xec\\x0b\\x85\\x45\\xd8\\xdf\\xcf\\x6b\\x20\\x31\\x14\\x41\\xd3\\xa3\\x5d\\x3e\\x71\\xb3\\xe3\\xec\\xd7\\x88\\x4d\\xda\\x84\\x33\\xa4\\x05\\xe3\\xd9\\x96\\x90\\x00\\xc8\\x20\\xa8\\x9b\\x95\\xd1\\x97\\x84\\x1d\\x98\\xae\\x73\\x4a\\x2e\\x81\\xda\\xf6\\xa7\\xdc\\xf5\\x6c\\xb2\\xfc\\x26\\xf2\\x16\\x5a\\x5f\\x42\\xb8\\x6c\\x7e\\x9e\\x5b\\x11\\x16\\x17\\x00\\xa1\\xab\\x98\\x31\\xf3\\xfa\\xe5\\x8e\\x14\\x20\\x8b\\xe1\\xbf\\x33\\xb5\\x8e\\xcc\\xe8\\x1b\\x0c\\x6b\\x7e\\x02\\xf8\\x8a\\xdf\\x9a\\xb0\\x30\\x26\\x3e\\x2c\\xc9\\xb6\\xe3\\x3e\\xbc\\xa3\\xf4\\x95\\x49\\x2e\\x32\\xbf\\xe3\\x72\\x53\\x7d\\xe6\\xc6\\xb8\\x76\\x44\\x82\\x8f\\x74\\x94\\x2a\\x02\\xb0\\x07\\xf1\\x4c\\x3f\\xc5\\xdb\\xde\\x76\\x33\\x3d\\x36\\xd0\\x76\\x31\\xb7\\xa9\\x92\\x4f\\x71\\x75\\x50\\x04\\x06\\x97\\x92\\x3f\\xa7\\xb9\\x54\\x6b\\xfb\\x02\\x17\\x02\\x4e\\xa3\\xf2\\x52\\xb5\\x15\\xb5\\xd6\\x4a\\x62\\xc4\\x8e\\x02\\x7c\\xef\\x67\\x50\\xbe\\xda\\x49\\xa0\\x24\\x47\\x03\\x9b\\x25\\x0a\\x0b\\xda\\x07\\xdc\\x06\\x24\\x91\\xa6\\x62\\xe2\\x68\\x74\\xc8\\xd0\\x0f\\x80\\xe6\\xcf\\xc8\\xb3\\x0f\\x2c\\x3b\\xf7\\x72\\x0b\\x57\\xf2\\x61\\x5f\\xc4\\x78\\xfe\\xfa\\xa6\\xd3\\x17\\x05\\xb4\\x3c\\x5a\\x54\\xf7\\x58\\x66\\x6b\\x30\\x2a\\x8d\\x34\\x95\\x31\\x31\\x94\\x1b\\x79\\x57\\x73\\x04\\x76\\x79\\x4d\\x0b\\xd9\\xd2\\xdf\\xa7\\x2f\\xd2\\x03\\xf2\\x2d\\xf5\\xec\\x6b\\xba\\xac\\xe8\\xb9\\x39\\x4b\\xeb\\xda\\xea\\xa5\\x61\\x46\\x10\\x11\\xb4\\xfc\\xa6\\x18\\x5c\\x9a\\x38\\x28\\x3f\\x54\\x03\\xfd\\xac\\x32\\x6d\\x1f\\x73\\x4c\\x6a\\x5d\\xed\\x67\\x24\\xd9\\xf3\\x84\\xae\\xbd\\x6c\\xab\\xfc\\xbe\\xc1\\x2a\\xba\\xb9\\x82\\x0d\\x08\\x07\\x32\\x51\\x5e\\x05\\x00\\xcf\\x5d\\x3e\\x2f\\x9e\\xf8\\x0a\\x4d\\x76\\x46\\xa7\\xda\\x9e\\xff\\x41\\x0f\\x50\\x7c\\x69\\x87\\x3b\\x32\\xd5\\x40\\xec\\x32\\xb2\\x83\\xef\\x31\\x79\\xa4\\xc6\\x32\\xb3\\x66\\x57\\x6d\\xff\\x05\\x8f\\xaf\\x8c\\x8c\\x70\\xbc\\x69\\xbe\\x80\\x89\\x82\\xec\\x14\\x97\\xae\\x89\\x11\\xb0\\x01\\x65\\xa6\\x66\\x95\\xf4\\xd3\\xb9\\x87\\xe7\\x39\\x0b\\x5c\\xf8\\x78\\xe3\\x5e\\x67\\x65\\x41\\x28\\x5e\\x4e\\x13\\xdf\\xae\\xb2\\xf3\\x68\\xcb\\x51\\x1b\\x77\\x8b\\x10\\x6a\\x42\\x87\\x78\\xa1\\xb8\\xf2\\xa7\\xd2\\xe0\\x93\\x51\\x9b\\xc9\\xb5\\x18\\x8e\\x38\\xc6\\x79\\x3e\\x96\\xbd\\x0d\\x30\\xe2\\xa3\\xdb\\x9e\\xe1\\x46\\x8c\\x3d\\xc8\\x7c\\xc3\\x65\\xc8\\x10\\xf9\\xdb\\xdf\\x01\\xa4\\xb5\\x14\\x21\\xf6\\xfc\\x8d\\xfd\\xa3\\xa1\\x6e\\x2d\\xa7\\xca\\x71\\x59\\xb6\\x86\\xa5\\xe1\\x67\\x33\\x89\\x37\\x88\\x2f\\xf7\\x15\\xd3\\xe7\\x50\\xd9\\x58\\xfc\\x9e\\x4b\\x1f\\x05\\x53\\x12\\x92\\x99\\xaa\\x84\\x30\\x18\\x3e\\x50\\x6c\\xd7\\xf2\\xb2\\x79\\x07\\x6e\\x0e\\x1c\\xca\\x97\\x49\\xcf\\x12\\x3c\\xe5\\x07\\xfe\\x07\\xdd\\xbb\\xc4\\xdc\\xca\\x6c\\xdb\\x9e\\xf1\\xb8\\x33\\xf6\\x1d\\x4b\\xff\\x00\\xbe\\xc0\\x12\\x15\\x8f\\x43\\x2c\\xeb\\x75\\xb4\\xf2\\xed\\xb1\\xbb\\x84\\xe5\\xeb\\xb9\\x25\\x9e\\x09\\xf9\\x62\\x5c\\xe3\"},\n{{0x00,0xdb,0x37,0xad,0x2a,0x19,0x5f,0x08,0xa0,0x84,0x40,0xd0,0x59,0x25,0x9e,0x53,0x9f,0xeb,0x40,0xb4,0x74,0x92,0x82,0x55,0xe7,0xc9,0x4e,0xbc,0x3b,0x05,0x03,0x8c,},{0x04,0xf8,0x8b,0xf6,0x39,0xe0,0xf7,0x1a,0x57,0xd0,0xd0,0xaf,0xff,0x5f,0xe9,0x7d,0xde,0x38,0x09,0xff,0x28,0xec,0x68,0xeb,0x6f,0xc4,0x23,0xf4,0xfa,0xff,0x43,0x90,},{0xf4,0xd1,0xc8,0x0f,0x5e,0x7b,0x91,0xc5,0xc7,0xa8,0x2a,0x68,0x2d,0x49,0xba,0x6f,0xb1,0x9d,0x40,0x0a,0x29,0x97,0x48,0xa0,0xc9,0x69,0xbb,0x99,0x81,0x69,0x98,0xbe,0x63,0x4e,0x84,0xda,0x78,0x58,0x1b,0x06,0xe3,0x47,0x0e,0xfe,0xc3,0x98,0x04,0xfe,0xd9,0x3d,0x29,0x73,0x9f,0x04,0x39,0xa8,0x09,0x5a,0xc4,0x0d,0x9d,0x38,0x5e,0x04,},\"\\x5a\\x94\\xf7\\x29\\xd3\\x0d\\xd8\\xaa\\xe2\\xa5\\xc8\\xc2\\x85\\x47\\xbf\\x45\\x06\\x29\\x5d\\xc6\\x1b\\xfe\\xad\\x97\\x27\\x74\\x60\\x82\\xd4\\x3b\\x0f\\x81\\x14\\xc8\\xc1\\x8c\\x5e\\xda\\xf2\\xfe\\xc7\\xca\\xe8\\x19\\x35\\x63\\x38\\xf0\\xbf\\x11\\x5a\\x17\\xb0\\x38\\xac\\xfd\\x7c\\x96\\xba\\x62\\x62\\xca\\xbd\\x57\\x10\\xfc\\x0e\\xfb\\x43\\xd1\\x3d\\xf4\\x06\\x5b\\xec\\xbf\\x1b\\x9e\\x27\\x9c\\x03\\xec\\x9b\\xbf\\xed\\x54\\xd9\\xa1\\x3f\\xe0\\x6a\\x55\\xa3\\xbd\\x05\\xc8\\x07\\x85\\x8b\\x41\\xe1\\x8d\\xbd\\xe1\\x3b\\x09\\x07\\xd4\\x03\\x41\\x32\\x26\\x2d\\x9c\\x2f\\x4d\\x2d\\x37\\x6e\\x16\\x09\\xad\\x28\\x0d\\xe2\\x0b\\xa7\\x09\\x84\\x4d\\xbd\\x12\\x95\\x02\\x57\\xf1\\xb0\\x7e\\xf8\\xcc\\x33\\x37\\xc0\\x1a\\x70\\x26\\x93\\xfb\\x4d\\x92\\xd0\\x47\\xe6\\x98\\xc3\\xa6\\xdd\\x46\\xc4\\xa9\\x2a\\x10\\xd4\\xc7\\x80\\xe5\\x2e\\x50\\x25\\xe0\\x9d\\x56\\x53\\x5d\\x7e\\xeb\\x9f\\xe7\\xf0\\x33\\xe6\\xe9\\x26\\x0a\\x68\\xf9\\xd5\\x4b\\x6f\\x37\\xcc\\x06\\x96\\x56\\xe3\\xbc\\xee\\x06\\x92\\x2b\\x34\\x96\\x81\\xa8\\xe7\\x75\\x1c\\xde\\xcb\\xe1\\xec\\xb6\\x63\\xfb\\xc6\\xf7\\xc8\\x61\\xf8\\x53\\xdc\\x31\\x0f\\x33\\xde\\xfa\\x98\\xee\\x34\\x3a\\x68\\x63\\x2e\\xc2\\x2c\\xaf\\xec\\xb7\\xf3\\x21\\x2f\\x81\\xe7\\x0b\\x71\\x84\\x3b\\x9f\\xe8\\xc8\\x6a\\x68\\xb5\\xc8\\x6f\\x03\\x22\\xd3\\x48\\xa7\\x6d\\xa7\\xf1\\xba\\x0c\\xa3\\xcd\\x7b\\x6f\\xd1\\x5f\\xf8\\x92\\x92\\xb3\\xf6\\x36\\xcd\\x08\\xcf\\x62\\x5c\\x74\\xd5\\x10\\x2c\\xab\\xb5\\x71\\xa3\\xdb\\xa8\\x6a\\x1c\\x92\\xf4\\x1c\\x72\\x03\\xb4\\x49\\x42\\xf5\\xa2\\x46\\x25\\xac\\x37\\xd7\\x7e\\x49\\xa5\\x7f\\x11\\x82\\x38\\x69\\x9d\\x80\\x7c\\x25\\x0d\\x5b\\xf4\\x6f\\x7a\\x3c\\xec\\x57\\x79\\xa6\\xe5\\xae\\x1a\\x6c\\xa1\\x60\\xcf\\xf3\\x7f\\xb3\\xb7\\x83\\x88\\xfe\\x9c\\x03\\x0c\\x40\\xe7\\x15\\x46\\x01\\x08\\x1a\\x51\\x7f\\xc0\\xaa\\x18\\x02\\xcd\\x3b\\x84\\x5b\\x94\\x6e\\xfe\\x94\\xaa\\x8b\\x9e\\x03\\xf6\\x8a\\x80\\xde\\xd0\\xdf\\xbf\\xad\\x4d\\xae\\xe4\\x0f\\xa8\\x38\\xc1\\x33\\x84\\x1a\\xe8\\xa3\\xce\\x0d\\x79\\xfa\\x8a\\x2b\\x94\\x34\\xba\\xc5\\xe1\\xda\\x6e\\x0c\\x71\\x93\\xe8\\xde\\xa4\\x35\\xa0\\x3a\\x85\\xf7\\x61\\x84\\xf7\\xeb\\xe2\\xaa\\x74\\x9b\\xe9\\x41\\x31\\x04\\xa1\\x78\\x68\\x9b\\xa6\\xd2\\x7e\\x94\\xfc\\xcf\\x61\\xeb\\x3a\\xba\\x0e\\x6a\\x5a\\x63\\xaf\\x0c\\xa8\\xf0\\x5a\\x35\\xcb\\x63\\x70\\x51\\x94\\xe4\\x4d\\x92\\x93\\xde\\x39\\x29\\xb0\\xd9\\x2b\\xe6\\xf8\\xe6\\x27\\xc3\\x50\\xa8\\x3f\\xc9\\x00\\x0a\\xa9\\x5b\\x93\\x82\\x0b\\xe9\\x79\\x5c\\x80\\xb5\\x66\\x2c\\xd7\\xb3\\x48\\x22\\x32\\x80\\x61\\x35\\x6d\\xc5\\x80\\x57\\x8d\\x1a\\x35\\xb1\\x01\\x40\\xdc\\xd2\\x48\\xe4\\x85\\x31\\x04\\xd2\\xc5\\xb2\\xc1\\x3f\\xf6\\x83\\xdd\\x5c\\x30\\x79\\x4b\\xe4\\xa7\\x68\\x58\\xaf\\x1c\\x0d\\x9a\\xf3\\x47\\xce\\x1d\\xcd\\x97\\x2e\\xe4\\x9a\\xac\\x12\\xbb\\xcd\\x89\\x9c\\x93\\x29\\x87\\x1d\\x3e\\x7a\\x06\\x83\\xd1\\x75\\x77\\x9a\\xfe\\x35\\xf2\\x6a\\x2d\\x24\\x8f\\xd7\\x80\\xea\\x85\\x1d\\xc4\\xba\\x6d\\x21\\xf8\\xa1\\x71\\xaa\\x6c\\xb8\\x69\\x7d\\x9d\\x11\\x21\\x61\\x54\\x03\\x07\\xcd\\x54\\xf9\\x31\\x77\\x5d\\x70\\xb3\\x3d\\x3b\\x6d\\xe1\\x09\\x1f\\xc1\\x75\\x05\\x31\\xc0\\x8f\\xa7\\x0f\\x7b\\xe3\\x8a\\xa1\\x10\\xd6\\x74\\x6b\\xb5\\x65\\xdb\\x7b\\x47\\x0f\\x90\\x08\\x50\\xfb\\xbf\\x1c\\x66\\x2f\\xd6\\x13\\xe4\\xf3\\xa5\\x68\\x95\\x49\\xe3\\x10\\x7e\\x9b\\x0f\\x17\\xde\\xf7\\xa5\\xbd\\x7f\\xd7\\x59\\x6c\\x4d\\x04\\xc7\\xf4\\x8c\\x77\\x9f\\xc3\\x5e\\x09\\x33\\x5e\\x1d\\xf7\\x84\\x08\\x4e\\x55\\xd8\\x55\\x1d\\x1f\\xf4\\x9d\\xe5\\xb3\\x11\\xcd\\x35\\x0f\\x34\\x7a\\x0b\\xd2\\x86\\x3a\\x2a\\x30\\xe6\\xea\\x18\\x3a\\xd2\\xe3\\xee\\xde\\xbc\\x18\\xdd\\x28\\xc6\\xa5\\x96\\xe6\\x93\\xdc\\x33\\x89\\xf7\\xd9\\x0b\\x71\\x3e\\x3a\\x85\\xa6\\x25\\x16\\x30\\x5a\\x70\\x66\\x7f\\xc1\\xfb\\x3c\\xb1\\x0e\\x8a\\x95\\x57\\x50\\x27\\x39\\x43\\xc5\\x68\\xe1\\x07\\x69\\xce\\xf7\\x81\\x99\\xdf\\x44\\x50\\xdb\\xc4\\x90\\xfe\\xf1\\xb3\\x04\\xb0\\x52\\x22\\x1b\\x2d\\xb9\\xc4\\x4f\\xe0\\x03\\x45\"},\n{{0x6c,0xa1,0xa1,0x48,0x2a,0x07,0xf2,0xa6,0xc5,0x7f,0x04,0x11,0x97,0xb3,0x4a,0x51,0x19,0xe6,0x89,0x03,0xcf,0x6d,0xfb,0x51,0x71,0x1d,0x95,0x50,0x97,0x31,0x63,0xc0,},{0x80,0x34,0xa5,0x5e,0x3b,0x6e,0xd7,0x99,0xf4,0x9e,0x2e,0x70,0x3a,0x81,0xf4,0xac,0x02,0x57,0x3c,0x44,0x5d,0x76,0x5e,0x30,0x69,0xbe,0x42,0xf0,0x9c,0xbd,0x18,0xad,},{0xdd,0x9b,0xdb,0xad,0xd9,0xfd,0xc8,0x1c,0xe2,0x30,0x28,0x8c,0x4a,0x06,0x8d,0xf0,0x7e,0x18,0xb4,0xc7,0xcc,0x51,0xc0,0xca,0x48,0x11,0xdf,0xbd,0x04,0x76,0x5c,0x56,0xbc,0x88,0x32,0x40,0xe4,0x6e,0x3a,0x42,0xc0,0x1d,0x8d,0x24,0x24,0xfb,0xc3,0x32,0xb7,0xc5,0xa1,0x7b,0xce,0xb1,0xf6,0xe8,0xda,0xd0,0xbf,0xe5,0x62,0xca,0xd3,0x02,},\"\\x08\\xfd\\x84\\x87\\x50\\x3c\\x3f\\x32\\x96\\xb6\\xf1\\xb6\\x4d\\x6e\\x85\\x90\\x6f\\xd5\\x98\\x6c\\xf9\\xc5\\xd9\\xfa\\x8a\\x59\\xd9\\x2f\\x44\\xe6\\x47\\x0a\\xf3\\x4b\\xcd\\xef\\x33\\x6f\\xfd\\xc8\\x64\\x56\\xec\\x7a\\x7b\\x57\\x61\\xf1\\xad\\xea\\x02\\x73\\x26\\x63\\x0e\\x68\\xab\\xc6\\xb8\\xcd\\x5d\\xdf\\x40\\xb6\\x41\\xa2\\x59\\xad\\x02\\x43\\x21\\xbf\\x3e\\xf9\\x8e\\x76\\x32\\x79\\x71\\x49\\xc4\\x92\\xd5\\x35\\x94\\x75\\x2c\\x55\\x0d\\xfb\\xc4\\xfa\\x6b\\xf4\\x71\\x76\\xf4\\x23\\xa2\\x70\\x56\\x93\\x94\\x7a\\xa9\\x0d\\x68\\xdd\\xc8\\xef\\xb6\\xcb\\x9d\\xbe\\xca\\xfd\\x28\\x30\\xd0\\x4f\\xd9\\x3b\\x1e\\x9e\\x7c\\x12\\xb9\\x3e\\x0d\\x0f\\x3e\\x26\\x34\\x90\\x0f\\x25\\x86\\x0d\\xda\\xdb\\xae\\xce\\x17\\x80\\xff\\x2d\\x3f\\x3d\\x9f\\xb8\\x38\\xfd\\x0d\\x5d\\x66\\xf8\\xaf\\xb3\\x05\\xff\\x1a\\x1a\\xed\\xca\\x2b\\x97\\x4b\\x63\\xe4\\x3f\\x5b\\x3c\\xc9\\xdf\\xed\\x1b\\xcf\\x11\\x99\\x91\\x76\\xed\\x95\\x85\\xac\\x82\\x9b\\xc6\\x79\\x4e\\xf3\\xac\\xd8\\x72\\xe8\\xd2\\xe9\\x26\\x08\\xb3\\x20\\xf8\\x94\\x99\\x6a\\x56\\x2e\\x1e\\xb1\\x77\\xe2\\x1b\\xe5\\x7c\\x22\\xc4\\x1e\\xc2\\x59\\xa3\\xdf\\xf9\\xc7\\xc9\\x49\\x1d\\xb8\\x38\\xd7\\x6c\\xf9\\xb0\\x38\\x31\\x11\\x59\\x8e\\x35\\x7f\\x44\\xba\\xbe\\xbf\\x12\\x1b\\xdb\\x24\\xee\\x9d\\x55\\x7b\\x7d\\x5a\\xf4\\x91\\xa0\\xa0\\x36\\x5c\\x90\\x36\\x1f\\xe4\\xf7\\xe3\\xd1\\x3a\\x17\\xda\\x3a\\x39\\xfd\\x43\\xf6\\x90\\xdf\\xb0\\xb2\\xd8\\x60\\xca\\xb4\\x19\\xf7\\x75\\xab\\x71\\x52\\xcd\\xc8\\xf2\\xaf\\xdc\\x50\\xe8\\xd5\\xda\\x5d\\xa0\\x17\\x06\\xee\\xa2\\xa2\\xff\\xad\\x4b\\xab\\xee\\x8b\\x03\\xda\\x33\\x6a\\x4d\\x84\\x3d\\x9d\\x7e\\x0a\\x93\\xf3\\x6a\\x92\\xe6\\x61\\x0a\\x36\\x8b\\x63\\x13\\x3f\\x05\\xa3\\xfd\\xc5\\x5e\\x3e\\x1a\\x44\\x0b\\x0f\\x87\\xa5\\x33\\x64\\xc1\\xd3\\x72\\x42\\xc5\\x7a\\x10\\x9e\\x6d\\xf6\\x93\\x45\\xb0\\x1c\\x21\\xc1\\x08\\x9e\\x79\\x0a\\x66\\xf4\\xf3\\x38\\x0d\\x3b\\x76\\xff\\xb4\\x20\\xdf\\xe1\\xe6\\x20\\x0e\\xac\\xe5\\x79\\x26\\x5a\\x42\\x7f\\xbd\\x35\\x55\\x14\\xef\\x95\\x3e\\x1a\\x6e\\x96\\x8e\\x37\\x02\\x1b\\x3c\\x6a\\x29\\x0d\\xcd\\x02\\x93\\xda\\x67\\x68\\xda\\xd7\\xc6\\x63\\x11\\x63\\x30\\x51\\xc0\\xac\\xcb\\x0b\\x91\\x65\\x46\\x4d\\xfd\\xdf\\xde\\xd2\\x3b\\xd1\\x3e\\xf9\\x08\\x74\\x4f\\x9c\\x21\\x11\\xdc\\x15\\x31\\x42\\xd2\\xf1\\x05\\x34\\xd8\\x93\\xfe\\x0b\\x54\\x5f\\xec\\x53\\xfd\\xb3\\xb3\\x5b\\x51\\x83\\x98\\xb0\\x2a\\xb2\\x17\\x91\\xfa\\x97\\x7e\\x30\\xcf\\x4b\\x40\\x4e\\x7a\\x29\\x9d\\x37\\x87\\x10\\x8b\\x83\\x6a\\xa0\\xd5\\x9c\\x11\\x4f\\x1f\\x36\\x71\\x9a\\x7a\\xcf\\x85\\xac\\x99\\x4d\\x9c\\xb7\\x23\\x06\\xf2\\x58\\xf7\\x8a\\xc0\\xa3\\xb6\\xc0\\x53\\x43\\xe0\\xb7\\xa9\\xaa\\x72\\x6e\\x52\\x26\\x7e\\xdf\\x97\\xf4\\x97\\x2f\\x76\\x64\\xf4\\x37\\x20\\xad\\x33\\xce\\x6e\\x61\\x54\\x40\\xe3\\x65\\x37\\xcb\\xc5\\x69\\xbd\\x6f\\xf9\\x4f\\xfd\\xae\\xa5\\x1e\\x06\\x02\\x9d\\xae\\x78\\xc5\\xb9\\x15\\xc5\\x37\\xca\\xea\\x6f\\x15\\x04\\x14\\x79\\x79\\xb8\\xaa\\xae\\x0b\\xcd\\x96\\x18\\x43\\x7e\\xbe\\xd0\\xb5\\x5e\\xfa\\xec\\x32\\x0e\\x84\\xc7\\x59\\x59\\xa3\\x7a\\x26\\x0a\\x02\\xd4\\xef\\x1b\\xb6\\x26\\x41\\x52\\x0f\\x1a\\x03\\xdd\\xea\\x8c\\x4c\\x1d\\xe8\\xd7\\xfa\\xc5\\x8d\\xa4\\x08\\xb0\\xab\\x47\\x57\\xa1\\x35\\xf1\\xd0\\x75\\xc9\\xf7\\xc9\\x9f\\xb9\\x9d\\xb9\\x42\\x7c\\xe9\\xb0\\xd6\\x26\\xcb\\x1a\\xc1\\x89\\xad\\x86\\x63\\xd7\\xa7\\x14\\xfb\\x5c\\xd1\\x58\\x5c\\x3b\\xf9\\x9a\\x0a\\xa4\\x6d\\x76\\x39\\x78\\xd0\\xb1\\x2d\\x65\\xc4\\x38\\xbb\\xb7\\x3f\\xea\\xa5\\x1b\\xa2\\x6a\\x45\\x9e\\x7b\\xea\\x25\\x43\\x94\\x66\\xc0\\x86\\x13\\xe4\\x25\\x40\\xc8\\xc6\\xd5\\x43\\x67\\xf2\\x21\\xfc\\xce\\x0c\\x5e\\xb6\\xaf\\x2f\\xaa\\x18\\x1e\\xa2\\x15\\x21\\x80\\x9b\\xe7\\x56\\x49\\xcf\\x8d\\xee\\x76\\x71\\xdb\\x7f\\x94\\x8f\\x34\\x6c\\xbd\\x03\\x02\\xbf\\x9a\\x06\\xea\\xbc\\x72\\xe2\\xe5\\x12\\xb3\\xdf\\x88\\x5f\\x6d\\xaa\\x39\\x8f\\x93\\xe3\\x6d\\xae\\x2d\\x6a\\x04\\x47\\x81\\x21\\xf9\\x77\\x87\\xd4\\xce\\xdf\\xf6\\xdb\\x09\\xaa\\xf1\\x0f\\x27\\xb1\"},\n{{0x27,0x84,0xdf,0x91,0xfe,0xa1,0xb2,0xd2,0x1d,0x71,0x3d,0xe2,0xed,0xc6,0x65,0x24,0x51,0xa0,0xc1,0x59,0x54,0xb8,0x65,0x60,0x62,0xea,0x1d,0xed,0xc2,0x44,0x5b,0x2a,},{0x95,0x56,0xdb,0x53,0x70,0xf8,0xfb,0x3c,0x74,0x78,0xde,0x03,0xd2,0x3d,0xf1,0xcd,0xa9,0x6f,0x27,0x40,0x11,0x8e,0xfd,0xd3,0xd1,0xa9,0xfa,0x4c,0x3b,0xfe,0x88,0x49,},{0x17,0xd1,0x71,0xd9,0x46,0xde,0x35,0x16,0x15,0x84,0x07,0xe1,0x32,0xcc,0x1a,0xce,0xca,0xef,0xd6,0xd0,0x92,0x11,0x2b,0xe6,0x53,0x99,0x95,0x23,0xe2,0x0b,0xd4,0x95,0xf7,0xb7,0xf6,0x00,0xe8,0xd5,0xa6,0x71,0x33,0x0d,0x32,0x69,0x3d,0x60,0x19,0xc0,0x8d,0x2d,0x00,0x3b,0x17,0x6e,0x63,0x19,0xc3,0x53,0x94,0x20,0x0e,0x02,0x7d,0x0e,},\"\\x2e\\x3b\\xc5\\x4d\\xf4\\x16\\x74\\x1d\\xbe\\x79\\x16\\xad\\x25\\xf0\\x4e\\x48\\xd5\\xa9\\xd7\\x7a\\x62\\x3e\\x57\\xf9\\xcd\\x61\\xec\\xb4\\x4f\\x09\\xf7\\x68\\x33\\xeb\\x2a\\x3e\\x9a\\xb7\\xaa\\x89\\xff\\x5d\\x2d\\x56\\x0c\\x07\\x17\\x7d\\x85\\x4d\\x7c\\x49\\xcb\\xef\\x49\\x2b\\x7f\\x4f\\x7e\\x56\\x7d\\xe1\\x27\\x51\\x24\\xe1\\x6c\\xa4\\xa7\\x98\\x01\\x62\\xfa\\x0f\\xd1\\x62\\xa8\\xe5\\xfd\\x6f\\x35\\x61\\x70\\x07\\x03\\x4b\\xce\\xec\\x57\\xc8\\xfa\\xf7\\x66\\x4f\\x4b\\x3b\\xaf\\xfd\\xea\\x8d\\x8f\\xc2\\xba\\x22\\xd5\\x85\\xe9\\xe2\\xd7\\x39\\xf5\\xff\\xc9\\x9b\\x4e\\x0d\\xbe\\x9c\\x36\\x86\\x54\\x7e\\xa0\\x48\\x15\\xa5\\x9c\\x4a\\x25\\xb5\\xf2\\x39\\x06\\x68\\xe4\\x18\\xba\\x0f\\xcb\\xdf\\x4c\\x4a\\x51\\xf3\\x39\\x05\\xc7\\x4f\\xbb\\x83\\x0a\\x19\\xf9\\xbc\\x86\\x36\\xdb\\xaa\\xff\\x20\\x99\\x95\\x44\\x79\\x96\\xd2\\xe5\\xb1\\xc3\\x77\\xb4\\xcb\\x87\\xa4\\xe1\\xef\\xe1\\x2d\\xe3\\x4d\\x33\\x59\\x9f\\xf3\\x97\\xb7\\x40\\x17\\xd7\\x11\\xed\\xd3\\xe7\\x72\\x15\\x5b\\xe5\\xa4\\x40\\x6e\\x74\\xcb\\xe2\\x93\\x1e\\xf5\\x13\\x59\\xaf\\xd5\\x1b\\x5b\\x1a\\x7b\\x3e\\xa2\\x2e\\xe8\\xed\\xa8\\x14\\x76\\xbc\\xc1\\x7e\\xa7\\x68\\x0f\\x6f\\x31\\x04\\x70\\x3b\\x9f\\x2a\\x35\\xcf\\x26\\x27\\xeb\\x74\\x1d\\x1a\\x30\\xaa\\x4b\\xee\\xf6\\x57\\x9e\\xc7\\xd0\\xb0\\x7a\\x4e\\xf3\\x2a\\xbc\\xb4\\xd7\\x56\\x97\\x0f\\x70\\xa3\\x67\\x8e\\x17\\xe6\\xe5\\x73\\x18\\x90\\xae\\xbc\\x8c\\x92\\xb9\\x56\\xd4\\xb3\\xb5\\xfe\\x2a\\xdf\\xd7\\x9b\\x21\\x1a\\x18\\x83\\xdf\\xc8\\xc9\\xa4\\xb1\\xb9\\xc8\\xc1\\xbb\\x26\\x5e\\x1f\\x3d\\xd3\\x92\\x44\\x5e\\xa5\\x9b\\x59\\x0a\\x01\\x95\\x51\\xf8\\x12\\x18\\x49\\xf4\\x35\\xb3\\xac\\x1b\\x29\\x90\\x2f\\xc8\\x39\\x25\\x54\\x05\\x6b\\x93\\x90\\x3d\\x5f\\x26\\x3b\\x3d\\x54\\x08\\x43\\xd6\\xaf\\xa7\\x5a\\x2a\\xd8\\x30\\x4b\\x76\\x90\\xde\\x99\\xa7\\x34\\xc3\\xd1\\x30\\xb6\\x95\\x47\\xb1\\x8b\\x09\\xe9\\x8c\\xbf\\x25\\x27\\x30\\xe4\\xae\\xdb\\x6d\\xc4\\xb5\\x8b\\x22\\x43\\xfe\\x55\\xe8\\x09\\x39\\xd3\\x7b\\x0a\\x59\\xd7\\x22\\x26\\xd8\\xa2\\xcc\\x51\\x53\\x09\\x5e\\x15\\x99\\x4a\\xd6\\x21\\x95\\xaa\\x31\\x0f\\x2a\\x64\\x26\\x67\\x6b\\x66\\x1e\\x47\\xb9\\xfc\\xff\\xfa\\x04\\xd6\\xdc\\x62\\x5f\\x29\\xf4\\x4c\\x7c\\xf6\\x20\\xb3\\x78\\xa6\\x5d\\x23\\x83\\x44\\xb3\\x80\\x44\\x8c\\xd1\\x19\\xcc\\x7f\\x37\\x3f\\x62\\xcd\\xfa\\xd6\\x41\\x49\\x90\\x63\\x53\\xf3\\xa5\\x41\\x07\\xc5\\xdb\\xa6\\x5e\\x3c\\xc4\\x94\\xb0\\x53\\x1f\\x4d\\x64\\x74\\x93\\x63\\xf2\\x30\\x73\\x8b\\x2c\\xfe\\xed\\x98\\x35\\x20\\x22\\x7d\\xd5\\xbc\\x43\\xbe\\x59\\xb3\\x26\\x8e\\x28\\x32\\x16\\xf6\\xe9\\xc7\\x5e\\x0c\\x1c\\x71\\x27\\x2e\\x54\\xfd\\xb2\\x9c\\x78\\x58\\xd2\\x87\\xd1\\xef\\xa1\\x91\\x7b\\xe3\\x7c\\x8e\\xea\\xb5\\xe4\\x4c\\x3a\\xd7\\xb3\\x6e\\x8a\\xc9\\xf6\\x69\\x91\\xeb\\x82\\xa5\\x14\\x8e\\x59\\x72\\x03\\x4a\\xd0\\x1c\\x62\\x61\\x5a\\x45\\x15\\x45\\x79\\xfa\\x50\\x86\\x9e\\x7b\\xe9\\x87\\x6b\\x56\\x56\\xea\\xad\\x2e\\x43\\x02\\x5a\\x62\\xdd\\x13\\x4b\\x61\\x2d\\x8f\\x4d\\x5e\\xbc\\xf8\\x05\\x6e\\x19\\x8b\\x71\\x34\\x38\\xe8\\xe0\\xe3\\x47\\xca\\xfb\\xfc\\xb8\\x9e\\x39\\x4a\\xa3\\x30\\xd4\\xc7\\x88\\xd4\\x9c\\x65\\x8f\\xcf\\xc8\\x0b\\x3e\\x00\\x78\\xf0\\xe8\\xe1\\x9a\\xa9\\xb8\\xfe\\x8e\\xb0\\xba\\xb9\\x3d\\xe7\\x85\\xd0\\x43\\xe0\\xf4\\x75\\xae\\xb6\\x0d\\x62\\xe3\\x8f\\xb1\\xf8\\x38\\x4a\\x00\\xb7\\xa9\\x02\\xda\\xee\\x13\\xd2\\x13\\x62\\x69\\xe5\\x08\\x01\\xb8\\x0a\\x65\\xb2\\xf9\\x13\\xcf\\xe3\\xff\\xb3\\x65\\xd9\\xaa\\x2f\\xd1\\x93\\x72\\xa0\\xb0\\x22\\x56\\x95\\x44\\x4e\\x4b\\xc5\\x48\\x71\\xd1\\x08\\xe0\\x9c\\x7e\\x1c\\x2b\\x42\\xdc\\xbb\\xac\\xce\\x24\\xea\\x5b\\xd5\\xbf\\x1f\\xcf\\x4a\\xc6\\x97\\xa3\\xfe\\x09\\xa5\\x46\\x77\\xb7\\xa8\\xdc\\x8d\\x5e\\xec\\xb8\\x6c\\xc7\\x92\\xee\\x9b\\x6f\\xea\\x2d\\xe1\\x6a\\x47\\x32\\x69\\xfd\\xc6\\x5d\\xbb\\x73\\xc2\\x58\\xc8\\x21\\x44\\x04\\x07\\xc6\\x42\\xf7\\xd3\\xd3\\xf5\\xc7\\x08\\xd5\\x53\\x32\\xda\\x83\\x43\\x10\\x6c\\x19\\xb2\\x30\\xa5\\x14\\x27\\xf3\\xb7\\x71\\x91\\x6a\\xe3\\x68\\x8b\"},\n{{0x4b,0xb7,0x92,0x36,0xfa,0xda,0x31,0x44,0xb6,0x82,0x96,0x49,0x9b,0xa4,0x4a,0xe5,0x34,0x07,0x4c,0xa9,0x4d,0x4b,0x58,0x1e,0x5e,0xdc,0xff,0xfe,0x13,0xb3,0xad,0x19,},{0x0a,0x83,0x99,0xf1,0xe5,0xa4,0x23,0xdc,0xf7,0xb2,0x5b,0x2f,0xb0,0xac,0x9e,0x1e,0x95,0x48,0x14,0x8b,0xea,0x84,0xd0,0x21,0xe0,0x42,0x87,0x60,0xe0,0x5d,0x58,0xbf,},{0x69,0x8f,0xab,0x68,0x51,0x0d,0xb8,0x12,0x1a,0x46,0x5d,0xb7,0x7e,0x4f,0x8b,0x58,0x6a,0xee,0x89,0x58,0x16,0xe6,0x3b,0xbf,0x0b,0xeb,0x24,0x2d,0xb4,0xe8,0x4c,0x15,0x7f,0x4b,0xe2,0x01,0xae,0x65,0x64,0x51,0x7a,0x87,0x0d,0x17,0xf6,0x0c,0x85,0x83,0x70,0xc0,0x1c,0xca,0x17,0x18,0x9c,0xb4,0x18,0x9e,0x81,0x43,0x91,0xd1,0x50,0x0d,},\"\\xad\\x81\\xab\\xf6\\x93\\x7a\\x7a\\xcd\\x7f\\x18\\x37\\xf0\\x4d\\x3f\\x10\\xe7\\x08\\xc6\\x1a\\x5f\\xbe\\xde\\xee\\x4d\\xb7\\x6e\\x15\\x98\\x57\\x03\\x84\\xe6\\xef\\xec\\xe9\\x7c\\x92\\x5d\\x2e\\x5c\\x34\\x88\\xca\\xb1\\x0b\\x5b\\x52\\xb8\\xa5\\x48\\x6e\\x99\\xd8\\xff\\xe8\\x6c\\x19\\x81\\xa1\\xf1\\xd5\\x32\\xdc\\xd4\\xd4\\x89\\xe5\\x54\\x6d\\x86\\x65\\x32\\x98\\xe7\\xa5\\xf9\\x6e\\x81\\x44\\x55\\x2d\\xda\\x8a\\x18\\xe7\\x5b\\x5f\\x73\\x55\\xb1\\x35\\x41\\x62\\x11\\x06\\xe4\\x97\\xe5\\x1a\\x56\\xd8\\x65\\x9d\\x19\\x8f\\xe1\\x00\\x37\\xe2\\x21\\x28\\xaf\\xc2\\x71\\x4a\\x2c\\xb5\\xa1\\x2c\\xc5\\xdb\\x09\\x68\\xa3\\x43\\xef\\x91\\x8e\\x87\\x69\\xdd\\x6a\\x3e\\x5b\\x9e\\x32\\xaa\\xb6\\x6c\\xb0\\x23\\x9e\\xbe\\x4c\\x17\\xf1\\x82\\x18\\xe2\\x52\\xeb\\xa6\\x16\\x2e\\x97\\x70\\x49\\xeb\\xac\\x0b\\x38\\x04\\x8b\\x3a\\xaf\\xb7\\xd4\\xd7\\x22\\x63\\xe9\\x21\\x28\\x99\\xa3\\xbf\\xe0\\xa6\\x9c\\x99\\xe2\\x2a\\xc6\\x1c\\x5e\\x96\\x12\\x45\\x63\\x03\\xd9\\x24\\x58\\xb5\\xc5\\x02\\x91\\x6c\\x34\\xa8\\xee\\x5c\\xd9\\xa5\\x82\\xa5\\x25\\x76\\xb6\\xdc\\x9d\\x7d\\x4c\\x64\\x2f\\x21\\x29\\x98\\xbf\\x33\\x58\\xd4\\xa8\\xc2\\xea\\x67\\x68\\x6e\\x55\\xd4\\x89\\xf6\\xa7\\x6e\\x6b\\x07\\x0e\\x6e\\x99\\x5a\\x74\\x53\\x26\\xc9\\xaa\\x63\\x63\\x0a\\x00\\x33\\xad\\x30\\x72\\x1a\\xa6\\x5f\\xac\\x60\\x4a\\x6e\\x58\\xc7\\x50\\x72\\x1a\\x56\\xca\\x67\\x60\\xc9\\x41\\x34\\xd6\\x11\\xfa\\xb4\\xd3\\x54\\xe4\\xf6\\x6a\\x29\\x67\\x7b\\x1a\\x66\\x66\\x01\\xe9\\xda\\x79\\xf2\\x13\\xf5\\x82\\x03\\x74\\x33\\xc0\\x7f\\x94\\xd5\\xf0\\xde\\x6a\\xa9\\xfa\\xa0\\xb3\\x2f\\x7b\\x02\\x3f\\xb9\\xfc\\x13\\x5a\\x26\\xf9\\x70\\x52\\xac\\x80\\xb3\\x9b\\x30\\x6a\\xed\\x13\\x92\\x6c\\x28\\x54\\x19\\xa2\\x9b\\x20\\xe2\\x37\\x0d\\x8a\\x09\\x5b\\x32\\x25\\x8f\\xa9\\x89\\x34\\x89\\xee\\x21\\x08\\x9c\\x75\\x2e\\xc0\\x62\\xe1\\x20\\x35\\x9e\\x2f\\x35\\x15\\x12\\x82\\x54\\xc8\\x09\\x8c\\xca\\x65\\xa9\\x1a\\x02\\x2d\\xd0\\x57\\xa2\\xc2\\xa1\\xb6\\xb8\\x5d\\x13\\x7c\\x3c\\x96\\x7d\\xcb\\x70\\xaa\\x17\\xa2\\xff\\x4b\\x37\\x67\\x8b\\x38\\x29\\x02\\xf0\\xf9\\x31\\xee\\x74\\x3f\\xc3\\x98\\xac\\x1b\\x8c\\x10\\x46\\x98\\x67\\x30\\x84\\x79\\xe4\\x0d\\x7f\\x2f\\x04\\xa4\\xb0\\x4c\\x44\\x89\\x15\\x84\\x88\\xdd\\xb7\\xbe\\xc5\\xa4\\x7f\\x20\\xff\\x35\\x6d\\x99\\xa1\\xb3\\xe9\\xd0\\xb7\\xfe\\x9b\\x0a\\xd9\\x49\\xf2\\x98\\x96\\x0e\\xfa\\x4d\\x97\\x28\\xf8\\x10\\x1c\\xf5\\x3d\\xa3\\xbf\\xfd\\xd9\\x52\\x4b\\xf4\\x40\\xa5\\x8b\\x32\\x73\\x8d\\x0b\\x62\\x93\\xe8\\x53\\xf4\\x66\\xff\\xd4\\x2c\\x56\\x07\\xac\\x9e\\x35\\x3b\\xa0\\x3e\\xfb\\x57\\x8c\\xc9\\x96\\x3d\\x8a\\xaa\\x9d\\x2e\\x26\\x6d\\x1d\\x2a\\xe9\\x29\\x6f\\x30\\xc9\\xef\\x44\\xec\\x69\\x10\\x30\\xd5\\x96\\xa4\\x01\\xb6\\xce\\xe7\\x2a\\x54\\x0e\\xf3\\xc4\\x2e\\xc0\\x17\\x42\\x66\\xba\\x54\\x01\\xf3\\x54\\xad\\xc8\\xe2\\x54\\x04\\x43\\x7e\\x88\\x8b\\x08\\x28\\x69\\x39\\xbe\\xde\\x30\\x8a\\xcd\\x30\\x32\\x7e\\xbf\\xf0\\x62\\x70\\x09\\x7c\\xc2\\x94\\xf0\\xa0\\xf3\\x9f\\x9a\\xa3\\xc6\\x65\\x85\\xca\\x47\\xe6\\x0c\\x4b\\x8e\\xa3\\x60\\x89\\xeb\\x8a\\x90\\x88\\xbb\\x18\\xb0\\x34\\x31\\x35\\xbb\\x6a\\x45\\x6d\\x2f\\x6a\\x3b\\xf3\\x90\\x72\\x3e\\x78\\xb4\\x2c\\x03\\x7c\\x2d\\xe2\\xe1\\x43\\x2c\\xaa\\xd3\\xa5\\x94\\x02\\x12\\x94\\xd4\\x3f\\x5b\\x15\\xa2\\xe8\\x19\\xdc\\x74\\x8e\\x45\\x1d\\xe4\\x00\\x68\\xc8\\xf0\\x32\\xf1\\x3b\\x47\\x11\\x37\\x70\\x12\\xed\\xcd\\x4f\\x11\\xde\\xc1\\x11\\x1b\\x12\\xeb\\x6e\\x1b\\x00\\x63\\x38\\x18\\x70\\x6d\\x71\\x32\\xd9\\x91\\xce\\x20\\xdf\\x3b\\x92\\x1d\\xb2\\x18\\x5e\\xe2\\x5b\\xb6\\xf5\\x82\\x75\\x76\\xec\\x01\\xad\\x89\\x0f\\x79\\x79\\x3b\\xaa\\x35\\x8c\\x2b\\xbf\\xb6\\xfa\\xad\\x11\\xd8\\xcb\\x0d\\x0d\\x2d\\x2b\\x29\\x81\\xfb\\xf4\\xe3\\x72\\x34\\x9f\\xc6\\xa0\\x1c\\x36\\x07\\x7b\\x59\\x32\\x5f\\x70\\x2b\\x38\\x00\\x59\\xa6\\x5c\\xf2\\xf5\\xea\\x98\\xd6\\xbd\\xc8\\x15\\x20\\x53\\xb8\\x5b\\x28\\xc8\\x1e\\x41\\x3c\\x4c\\xac\\x7e\\x22\\x6c\\x13\\xdb\\x32\\x67\\xd2\\x18\\x30\\xf0\\xe5\\x43\\x11\\x02\\x91\\x70\\x05\"},\n{{0xaf,0xd7,0x65,0xe6,0xaa,0xc0,0x14,0x6d,0x48,0x11,0xef,0x95,0x97,0xbc,0x3f,0x44,0x76,0x3f,0x03,0x37,0x8b,0x7b,0xe0,0x33,0xd6,0xe6,0x4c,0xa2,0x9d,0xec,0xae,0xf9,},{0x6b,0xb7,0x61,0x23,0xd9,0x25,0x89,0x22,0x68,0x6c,0x53,0xfb,0x69,0x17,0xb9,0xa4,0x59,0xca,0xbd,0x30,0xbe,0x8c,0x43,0x97,0x0d,0x80,0xf5,0x35,0x0c,0x2d,0x98,0xef,},{0x3d,0xc9,0x19,0x4d,0x50,0x81,0x14,0x19,0x04,0x9e,0xaa,0x07,0xb6,0x55,0xb7,0xd4,0x06,0x4b,0xcb,0x0e,0x7f,0xb5,0xf9,0xe5,0x32,0x6b,0x5f,0xc8,0x56,0xfc,0x0a,0xb8,0x70,0x59,0x73,0xae,0x10,0x01,0xdf,0x55,0x37,0x39,0x77,0xdd,0xe2,0xd9,0xb8,0x10,0x79,0x55,0x14,0x14,0xad,0xc7,0x1c,0xc8,0x52,0xd4,0x99,0xb0,0xcf,0x82,0x4f,0x07,},\"\\x18\\x3b\\x10\\x92\\xc7\\x90\\x4e\\x47\\xa1\\x42\\x03\\x17\\xa2\\x5d\\x0f\\x59\\x11\\x0a\\xa8\\x4d\\x6b\\x34\\x19\\xad\\x45\\x68\\x65\\xc4\\x3b\\x29\\xe9\\xd1\\xda\\xcf\\x75\\x5d\\x9e\\x5c\\xf9\\x4c\\x55\\x91\\xd5\\xd9\\x12\\xd0\\x5c\\xa9\\xa5\\x2d\\x01\\x5d\\x6e\\x8f\\x5d\\xc9\\x4e\\xfd\\xce\\x0d\\x7c\\xf5\\x65\\x12\\x03\\xb1\\x1e\\x54\\x27\\xa9\\xf6\\x79\\x42\\x9e\\x00\\x41\\x4a\\x48\\xea\\xb1\\x3f\\xd8\\xe5\\x8b\\x87\\xeb\\xa3\\x9d\\x10\\x25\\xd6\\xa1\\x8b\\x2c\\xdc\\xbe\\x14\\x74\\x36\\xdb\\xf3\\x8a\\x1c\\xe8\\x64\\x13\\xae\\x31\\x87\\x65\\xe1\\xbb\\x1d\\xf7\\xe2\\xb3\\xbe\\x97\\xe9\\x04\\x08\\xb1\\x17\\x17\\xcf\\x45\\x9b\\xcd\\x0f\\x3c\\xac\\x58\\xb4\\xa0\\xd3\\x5b\\xff\\xb5\\x33\\xe2\\x0d\\xf3\\x74\\x51\\xc1\\x14\\x01\\xce\\x1d\\xab\\x02\\x05\\x5c\\x7e\\x08\\xc5\\xec\\x46\\x39\\x0c\\xd6\\x17\\xa6\\xb5\\xf2\\x2f\\x65\\x18\\x30\\xa1\\x11\\x2a\\x06\\xed\\xe4\\xc4\\x0a\\xb7\\x95\\x78\\x51\\xd6\\xc6\\x6f\\x17\\x1c\\xd1\\x62\\x41\\x59\\x09\\x00\\xb8\\x52\\xa3\\xd0\\x19\\x95\\x7b\\xe1\\xb7\\xbb\\x7a\\xcb\\x89\\x23\\xf2\\xa3\\x57\\xc3\\x26\\x44\\x56\\xcf\\xca\\x9b\\x42\\x9d\\x71\\xfe\\xcb\\x7e\\xda\\xe3\\x9b\\x25\\x2b\\x4e\\xb6\\x10\\xe8\\xc7\\x18\\x83\\x56\\x99\\x75\\x4b\\x8d\\x41\\x24\\xb4\\x92\\x48\\x8e\\xde\\x62\\x61\\x0c\\xce\\x44\\xb5\\x92\\x18\\x66\\x3b\\x6c\\x96\\x46\\xa1\\x4a\\x84\\x17\\xed\\xdb\\xb6\\xf4\\xfb\\xe5\\xa4\\xbb\\xbb\\x48\\x2b\\x37\\xa4\\x45\\xe3\\xc1\\x6b\\x65\\xa1\\x41\\xcd\\x3e\\x12\\xa5\\xb2\\xc0\\x48\\x1d\\x61\\x4d\\x6d\\x20\\x84\\x79\\xb9\\xb2\\x09\\xb8\\x28\\x85\\x4d\\xae\\x0e\\xa1\\xed\\xed\\x50\\x65\\x55\\xfe\\x18\\xe1\\x85\\x40\\x05\\xcf\\x00\\x1a\\x80\\x77\\x08\\x34\\x98\\xd2\\x7f\\xad\\xf1\\x18\\x28\\x6b\\x53\\xb8\\x97\\x4d\\x69\\xfa\\x28\\x25\\xbe\\x8c\\xa3\\xd6\\x03\\x6a\\x92\\xca\\x52\\xf9\\x1d\\xde\\x6d\\x5b\\x1f\\xfe\\x28\\x88\\xf4\\xd6\\x07\\x79\\xfa\\xd1\\xfb\\x41\\xd8\\xc0\\x71\\x40\\x49\\xaf\\x68\\x1b\\x75\\x5f\\x2d\\x42\\x04\\xee\\xcd\\x09\\xe0\\x77\\x21\\x0a\\x48\\xa1\\x95\\xe7\\x2c\\x80\\xe1\\x27\\xc3\\xd4\\x87\\x50\\x95\\xc6\\x57\\x0a\\x1f\\x78\\x09\\x59\\x07\\x52\\x8c\\xf7\\x74\\x6f\\x31\\xd9\\x71\\x11\\xc6\\xf4\\xcb\\x25\\xb3\\x74\\x12\\x99\\xa7\\x57\\x48\\x22\\xd4\\x6b\\x6e\\x79\\xed\\x23\\xc2\\xfe\\x05\\x7b\\x3a\\xc7\\x29\\x0b\\x46\\x0b\\x16\\x6e\\xe9\\x0a\\x45\\x56\\x2e\\xff\\xed\\xcc\\x6b\\xa8\\xf4\\x79\\x5f\\x73\\x95\\x81\\x8d\\xb5\\x6b\\x6e\\xdd\\x59\\xca\\x2c\\xc4\\xae\\xa1\\x84\\x1f\\xd9\\x56\\x5b\\xec\\xd6\\xc0\\x81\\x04\\xcd\\xee\\x26\\xba\\x9d\\xe2\\x00\\x77\\x3d\\x09\\x1b\\xc7\\x7a\\x57\\xc5\\x47\\xf1\\xa6\\xba\\x0a\\x2c\\xd7\\x17\\xab\\x32\\x56\\x1d\\x74\\x22\\xea\\x72\\x35\\xad\\xb0\\xcb\\x36\\xbf\\x5c\\xbd\\xf8\\x8f\\xca\\xe0\\x66\\x30\\xa1\\x56\\x47\\xd9\\xa3\\x57\\xb4\\xe0\\xe5\\x02\\xd2\\x73\\xf3\\x79\\x6a\\x51\\xe0\\xbc\\x3f\\xed\\xbf\\x7a\\x1e\\x64\\xaa\\xd7\\x22\\xaa\\xc5\\xfd\\x02\\x2f\\xa7\\x9d\\x60\\xfc\\x70\\x73\\x25\\xf1\\x27\\xeb\\x1f\\x03\\x86\\x87\\x95\\xcc\\xdc\\x0b\\x4c\\xb2\\x6f\\x20\\x23\\xd1\\x52\\x15\\x3a\\x97\\xa2\\x60\\xbf\\xf1\\x17\\x45\\xd2\\xe2\\xcc\\x0b\\xf8\\x60\\xd4\\xa6\\xe3\\x58\\xa6\\xd8\\x17\\x6d\\x2a\\xc1\\x78\\xa9\\xae\\x1a\\x2d\\xc7\\x5e\\x8b\\x49\\x04\\x08\\xff\\x7c\\xdf\\x99\\x13\\x29\\xf3\\x3c\\xb0\\xc0\\x5e\\x1e\\x35\\x69\\x25\\x08\\x7e\\x0b\\x8d\\x96\\xa5\\x23\\x51\\xd1\\xd1\\x77\\x68\\xeb\\x13\\x4c\\xdb\\x21\\xa1\\x54\\x6a\\xae\\xdc\\xc6\\x87\\xdf\\xa1\\xb2\\x2e\\x92\\xfb\\x52\\x41\\xa8\\x36\\x77\\xa1\\x53\\x44\\x5b\\x77\\xd5\\xe7\\x03\\x50\\x8e\\x2a\\xbc\\x58\\x8a\\x9f\\x42\\xe5\\xbc\\x71\\x06\\x73\\xe4\\xdd\\x8a\\xd7\\x03\\xfa\\xb2\\xd7\\xdb\\x1e\\xb8\\x42\\x26\\xc8\\x9d\\x87\\x62\\xa7\\x09\\xe3\\xe9\\x13\\x8a\\x1f\\xa7\\x90\\xf2\\x92\\x9b\\xff\\x61\\xbc\\x1e\\xa6\\xe8\\xaa\\x1a\\xd0\\xe3\\x88\\x7d\\x70\\xa5\\x6d\\x4e\\x65\\x47\\xfc\\x60\\x6a\\x50\\xd3\\xbe\\x3b\\xd6\\xdb\\x03\\x66\\x3e\\x00\\xca\\x9e\\x4f\\x24\\xfe\\x8c\\xbf\\xd7\\xd8\\xc9\\x73\\x8d\\x63\\x67\\x55\\x4b\\x7b\\x60\\x1f\\x74\\x19\\x0b\\x59\\x70\\xa3\\x98\"},\n{{0xeb,0x34,0x71,0x45,0xf3,0x39,0xed,0xd8,0x02,0x78,0x5b,0x6f,0xbe,0xcd,0x5c,0xb8,0x08,0x89,0xac,0x7c,0xe4,0xeb,0xad,0x2f,0x67,0x07,0x67,0x65,0xdb,0x93,0x9b,0xca,},{0x99,0x4a,0x45,0x6e,0xad,0xa0,0x30,0x20,0x92,0x1c,0x3d,0x10,0x9c,0x13,0x5e,0xb9,0x61,0xfc,0xd4,0xa0,0xa4,0x00,0xba,0xfd,0x32,0xca,0x06,0x1b,0xbc,0x86,0x25,0x43,},{0xfd,0xbd,0x15,0xe1,0xe6,0x46,0x9d,0xf7,0x20,0xd9,0x55,0x2c,0xb5,0xdd,0x17,0x7b,0xcb,0xd2,0x92,0xfc,0xda,0x83,0xcd,0x93,0xc8,0x8d,0x01,0x14,0x91,0x2d,0xc8,0x70,0x31,0x09,0xba,0xc0,0xd4,0x59,0xac,0xe9,0x95,0x7d,0xf2,0x29,0x3a,0xc1,0x6d,0x40,0xd5,0x14,0x89,0x35,0x56,0x85,0x32,0x99,0xb9,0x7b,0x4f,0xd4,0x13,0x7a,0x3d,0x00,},\"\\x5b\\x8b\\x31\\xba\\xf8\\x84\\x83\\xf0\\x95\\xb5\\xd0\\x2e\\x17\\xd8\\xb7\\xb4\\x6c\\xf4\\x64\\x60\\xe6\\x4c\\x6b\\x02\\xc5\\x6d\\x8d\\xaf\\xe3\\x48\\x23\\x70\\x6c\\xb5\\xc1\\x5f\\x33\\x8a\\xd9\\xb5\\x65\\x86\\xa9\\x49\\x71\\x1a\\xa7\\x31\\x2c\\xc9\\x34\\x50\\xd2\\xfb\\x9a\\xf4\\x61\\x3f\\xc3\\x07\\x93\\xa6\\x31\\xa5\\x5c\\x14\\xe5\\x3c\\x0c\\xb1\\x5f\\x06\\x11\\x63\\x99\\x39\\x8c\\x8d\\xd6\\x18\\x76\\xc6\\x29\\x15\\xf9\\xf9\\xe4\\xcd\\xf8\\xf7\\xd8\\x9a\\xde\\x12\\x9e\\x6d\\xde\\x7d\\x63\\x67\\x1a\\x18\\x63\\xf5\\xda\\x8f\\x42\\xea\\x64\\xc0\\x79\\xec\\xb9\\xa2\\xc1\\xb1\\xdd\\x9a\\xda\\xe6\\x0e\\x96\\xb9\\xcb\\xbc\\x76\\x24\\x53\\x2a\\xa1\\x79\\x75\\xeb\\xa1\\x7a\\x7a\\xf0\\x2b\\xfb\\x21\\x9a\\xac\\x02\\xb3\\xd4\\x30\\x6c\\xd3\\x89\\x33\\xa8\\x50\\x60\\xcd\\x62\\xab\\x51\\x3a\\x39\\x65\\xb0\\x91\\x50\\xa4\\x88\\xc9\\x2b\\xf7\\xca\\xb0\\x48\\x2e\\xee\\x56\\x46\\x3f\\x01\\x39\\x00\\x9b\\x9f\\xbb\\x3f\\xf4\\xec\\xae\\x21\\x1f\\x42\\x8b\\x5b\\xfb\\x88\\x76\\xf0\\x04\\x98\\x3b\\x90\\xc4\\x47\\x84\\x6c\\xa4\\xb7\\x45\\x66\\xe9\\x79\\xbc\\x30\\xc9\\x5e\\x99\\xfa\\xab\\x69\\xa3\\xeb\\xbf\\xe4\\xda\\x60\\x34\\xc8\\x2d\\x63\\xe9\\xc5\\xcc\\xaf\\x84\\x86\\xaf\\x3b\\x5e\\x0d\\x38\\x14\\x22\\x93\\x8b\\x0c\\x22\\xf5\\x16\\x95\\x5b\\xdc\\x36\\x94\\x31\\x73\\xf5\\x83\\x27\\x08\\xa3\\x3c\\xf5\\x2d\\x88\\x75\\xd9\\x7f\\xde\\x58\\x5b\\x49\\x17\\xe4\\xad\\xec\\xdd\\x1e\\x79\\x85\\x67\\x62\\x03\\x3a\\xf2\\x2f\\x25\\x4b\\x50\\xce\\x9d\\x0c\\x70\\x0e\\x77\\xa7\\x31\\x55\\x4f\\xa0\\x11\\x3a\\x0c\\x66\\x66\\x83\\xf3\\xfd\\xb1\\x9e\\x3a\\x42\\x63\\x02\\x23\\x0b\\x63\\xe3\\x3a\\x78\\x5e\\xf2\\x4a\\x92\\x89\\x45\\x5b\\x3b\\x8f\\xc6\\x18\\xff\\xfe\\xf4\\x9c\\x2c\\x6e\\x48\\xfd\\x4b\\xb4\\x22\\xf5\\x04\\x14\\x9d\\xe2\\xb4\\xc0\\x35\\x5c\\x36\\x34\\x08\\xe6\\x6d\\xa8\\x1c\\xbb\\x58\\x15\\x52\\xa4\\x11\\xe3\\x64\\xfe\\x3e\\x4c\\xa9\\x6d\\x70\\x72\\xab\\x07\\x2e\\x75\\x68\\xc1\\x3d\\x35\\xe4\\x1c\\x78\\x25\\xa1\\x3a\\x5c\\x68\\xfb\\x9f\\xb5\\x98\\x8b\\xbb\\xfb\\x9a\\x0b\\x51\\x16\\x57\\x64\\x66\\x0c\\xdf\\xa2\\x41\\x1f\\x3d\\x42\\x16\\x5d\\xa1\\x87\\xc5\\x8e\\xde\\xf0\\x10\\x5a\\x6d\\xb1\\x77\\x42\\x05\\x43\\xe9\\x58\\xd5\\xd5\\xe8\\xa3\\x71\\xf7\\x98\\x70\\x51\\xc4\\xe1\\x78\\x6d\\x01\\x8e\\xb3\\xd7\\x32\\xc2\\x10\\xa8\\x61\\xac\\xaf\\x67\\x1b\\xe9\\x5b\\xb6\\x3f\\xbc\\x88\\xbf\\x8b\\xe7\\xbe\\x53\\x90\\x93\\x9c\\xd9\\xfb\\x2a\\xcf\\x39\\x81\\xdd\\xa6\\x1b\\x78\\x7a\\x7b\\xbd\\x78\\x46\\x8e\\x1d\\x32\\xca\\x46\\xaf\\x8f\\xb3\\x2a\\x18\\x46\\x3c\\x18\\x0f\\x52\\x4b\\xe1\\xda\\x91\\x0d\\xa5\\x50\\x8d\\x42\\xa0\\x05\\x17\\x41\\x22\\x7c\\x9b\\x62\\xde\\x6d\\x19\\xb3\\x3c\\x0b\\xd4\\x80\\x67\\xb0\\x35\\x85\\x9a\\xd9\\xbd\\xc2\\xdd\\xd9\\x7b\\xef\\xca\\x31\\xe6\\x5a\\x88\\x6c\\xfc\\x75\\x3a\\xfc\\x4f\\xf2\\xa7\\x21\\x2a\\x89\\xd3\\x7c\\x04\\x6c\\xdf\\x39\\x99\\xc0\\x51\\xff\\x13\\x96\\xbd\\x99\\xcb\\x54\\x94\\x56\\x39\\xeb\\x64\\x62\\xdb\\x9e\\xce\\x84\\x07\\x7b\\x0b\\x3d\\x6b\\x3d\\xf3\\x95\\x2d\\xd3\\x67\\x56\\xc6\\xda\\xb2\\xab\\xc2\\x5a\\x51\\xbf\\x32\\xc1\\xe9\\xcd\\xd0\\xa7\\x28\\xa7\\x98\\x5f\\x7b\\x7e\\x0d\\x9c\\x1a\\x6f\\x66\\xce\\x12\\x16\\x37\\x3d\\x25\\x2d\\xaf\\x59\\x58\\xf2\\xe8\\x97\\x3f\\xd2\\x68\\xfa\\xd0\\xef\\xe2\\x51\\xce\\x76\\xfe\\x47\\xbd\\x0a\\x4d\\x0c\\x4f\\x10\\x17\\x94\\x9d\\x4c\\x2b\\x16\\x71\\x72\\x18\\xe1\\x49\\x15\\x4e\\xd6\\xfb\\xe5\\x6f\\x86\\xd8\\x2e\\x19\\xef\\x0a\\x91\\x63\\x19\\x12\\xf2\\xa8\\xf3\\xde\\xbb\\x00\\x76\\x6b\\x61\\x77\\x80\\x2f\\x4b\\x2e\\x79\\xf6\\xe7\\xbf\\xa9\\xc6\\x2c\\xfa\\x2f\\x75\\xcd\\xb6\\x04\\x92\\x63\\x0a\\x85\\xc9\\xb4\\x31\\x77\\xd2\\xdd\\x9b\\xa8\\xd0\\x54\\x8a\\xbe\\x24\\x92\\x3a\\xe8\\x44\\x3e\\xea\\xdc\\xd0\\xf5\\x8a\\x7b\\x82\\xdf\\xf5\\x0d\\x88\\x40\\x03\\x88\\x9c\\xb5\\x60\\xf7\\xac\\x53\\xe7\\x10\\xa7\\x55\\x75\\x36\\x24\\x64\\xb1\\xaa\\x43\\xd2\\xa9\\xb2\\x2f\\x2b\\xd2\\x16\\x2d\\x30\\x2f\\xaa\\x74\\x52\\x34\\x4c\\xe7\\xad\\xe9\\x98\\x36\\x87\\xb6\\xc6\\x8e\\xca\\x47\\xdd\\xdb\\x28\\x9b\\x15\"},\n{{0x32,0x08,0x83,0x7d,0x15,0x54,0xb6,0x51,0x1a,0xdd,0xa0,0x9c,0xba,0xe5,0x65,0xda,0x78,0x43,0x9a,0x47,0x2a,0x5d,0x1b,0x10,0x7c,0xe0,0xa9,0xb1,0xd7,0x75,0x7d,0xb7,},{0x9b,0x52,0x5e,0x35,0x36,0x8a,0x92,0x1e,0x3a,0x2e,0x9a,0x35,0xa4,0xde,0x9e,0xa4,0xc4,0x36,0xca,0xba,0x27,0x12,0x3e,0x5c,0x36,0x9e,0x2a,0x6c,0xf5,0xc9,0x0a,0xb6,},{0x70,0x9d,0x1c,0xa9,0xca,0x2f,0x74,0x2a,0xb9,0xdd,0x0b,0x04,0x93,0x35,0xf5,0x44,0xcf,0xfb,0x2f,0x1a,0x36,0x93,0xd5,0xf5,0x3f,0x8b,0xa0,0x83,0xb9,0xb0,0xd8,0x6e,0x52,0x08,0xfa,0x8e,0x1e,0x81,0x56,0xc9,0xcc,0x22,0x42,0x77,0x5a,0xbb,0x7e,0x15,0xaf,0x30,0x85,0x86,0x8e,0xf4,0x57,0x63,0x4e,0x99,0x26,0xc4,0x04,0xec,0xf3,0x0f,},\"\\x43\\x6a\\x3c\\x31\\x76\\x3f\\x93\\xd4\\xd5\\x46\\xc6\\xd1\\xec\\xfb\\x7a\\xe4\\x59\\x16\\xaf\\x75\\x4f\\x83\\x9d\\xcf\\xe9\\x6d\\x6b\\x69\\xc6\\x12\\x14\\xd0\\x16\\xfc\\x84\\x2f\\x56\\x46\\x2a\\x3f\\x07\\xf6\\x61\\xb2\\xe2\\x50\\x5a\\xcf\\xaf\\x48\\x2a\\x0b\\x0f\\x4f\\x55\\x01\\xee\\xc4\\xb2\\xd2\\xd7\\xd4\\x44\\x54\\x4d\\xe0\\x00\\xb9\\x90\\xf4\\x36\\x3d\\x3f\\x98\\x3f\\x5d\\x4e\\x09\\x30\\x97\\x52\\xff\\x57\\x9c\\x73\\x20\\xc9\\x15\\x95\\x1c\\xc3\\xa1\\xe3\\x23\\x8c\\x1b\\xa7\\xa1\\x91\\x30\\xea\\xbf\\x6a\\x37\\xf5\\xf0\\xbc\\x56\\xe2\\x52\\x42\\xf7\\x52\\x06\\x1f\\x3c\\x63\\xac\\xad\\x99\\x2a\\x75\\x01\\xe9\\x67\\xde\\xb9\\x25\\xb3\\x0e\\xd1\\x05\\x43\\x1e\\x58\\x21\\x02\\xfa\\x4f\\x30\\x8c\\x2f\\x06\\x83\\x61\\x2b\\x56\\x68\\x6d\\x52\\xda\\xed\\x69\\x43\\xa7\\x21\\x9f\\x3b\\xee\\xa2\\xe0\\xa2\\x92\\x42\\xe8\\x6d\\x55\\x62\\xff\\xab\\x83\\xb5\\x6b\\x26\\x33\\x26\\x66\\x4e\\x02\\x9e\\x96\\x1e\\x70\\x17\\xd8\\xe8\\x9f\\x5e\\x3e\\x1d\\x10\\xf5\\x93\\x28\\x54\\x55\\x0c\\xe6\\xe5\\xcd\\x76\\x97\\x1f\\xd2\\x35\\xcf\\x9c\\x00\\x27\\xd0\\xcf\\xed\\x33\\x15\\xc2\\xcb\\xf1\\x85\\x08\\x62\\x4d\\x8a\\xcf\\x04\\x7f\\x9b\\x96\\x8f\\x90\\x7d\\x9e\\x6f\\x4c\\xfa\\x5e\\x45\\xc8\\x0a\\x27\\x2c\\x2d\\xbb\\x62\\xc5\\xd4\\x19\\x45\\x80\\xdf\\xab\\xed\\xd8\\x2c\\xb4\\xd7\\x64\\x92\\x34\\x4b\\xe9\\x6c\\xcf\\x5d\\xaa\\xf6\\x1e\\x6b\\x2b\\x55\\xef\\xdb\\x3f\\x65\\x21\\x0a\\x3d\\x6e\\x1f\\x36\\x98\\x87\\xca\\x0e\\xa0\\xd5\\x8c\\x3d\\x14\\x6a\\xe3\\xcf\\x9b\\x00\\x00\\x76\\x88\\x41\\x15\\xfa\\x51\\xb5\\xfd\\x66\\xbe\\xc0\\xcc\\xbf\\x0d\\x29\\x20\\x19\\x6a\\x7d\\x7a\\x38\\x44\\x5f\\xbe\\xd2\\x2d\\xfc\\x75\\x64\\xdc\\x56\\xf6\\x0d\\x6e\\x29\\xe5\\x92\\x48\\x53\\x74\\xc6\\xbd\\x1e\\x5b\\x15\\x93\\x1b\\x69\\xca\\x6e\\xe6\\xb3\\xaa\\x25\\x25\\xc2\\x35\\x85\\xf0\\x92\\x9f\\x31\\xcb\\xd1\\x1f\\xb1\\xa5\\x33\\x02\\x16\\xb9\\x0a\\xe5\\xa6\\x56\\xdf\\x7a\\x07\\x4c\\xec\\x64\\xe5\\x98\\x18\\x4f\\x50\\x3f\\xb2\\x3c\\xc0\\x5e\\x65\\xda\\x9a\\xe7\\xe8\\x44\\x1f\\x40\\xe2\\xdc\\x26\\xb8\\xb5\\x6d\\x2c\\xb5\\x23\\xa7\\xc6\\x35\\xdc\\x08\\x47\\xd1\\xcd\\x49\\x8a\\xbf\\x75\\x6f\\x5a\\x13\\xea\\x14\\xf8\\xfa\\xb2\\xc4\\x10\\xb1\\xa4\\x70\\xf4\\x9a\\xa8\\xdc\\xa4\\xac\\x02\\x56\\xb1\\x18\\x00\\xde\\x0d\\xd0\\xec\\x42\\xb1\\x42\\xc5\\x61\\x12\\x8d\\x35\\x7e\\x78\\x3b\\x12\\xf6\\x1c\\x66\\x8f\\x5e\\x6e\\x06\\xb7\\xb4\\x8b\\x7b\\x22\\x54\\xde\\x5b\\xdc\\x18\\x04\\xb7\\x23\\xd5\\xfd\\x6a\\x0f\\x4b\\xc7\\xc5\\x9e\\x7c\\x50\\x54\\x18\\x26\\x13\\xbb\\xd2\\xfa\\x92\\xb4\\xc1\\xda\\x16\\xbc\\x8c\\x97\\xe1\\x6b\\xcb\\x0d\\xbf\\x8c\\x92\\xb7\\x48\\x99\\xb3\\x7f\\x31\\x87\\x57\\x14\\x0b\\x6c\\x4f\\xd5\\x35\\xe2\\xe1\\xe0\\x57\\x0a\\x50\\x81\\x8c\\xf7\\x8f\\xb9\\x88\\xe1\\xf4\\xce\\x40\\xe7\\x6e\\x8f\\xe3\\xd6\\x97\\xd7\\xa4\\x58\\x50\\xf2\\x93\\xce\\x17\\x0f\\xd8\\xab\\x07\\xcf\\x15\\x34\\xea\\x5f\\xfa\\xd3\\x4f\\x6f\\xcf\\xa4\\x2d\\x0d\\x21\\xa9\\x1d\\xfb\\xfe\\x05\\x97\\xc7\\x3f\\xd9\\xb9\\x76\\x76\\x14\\xeb\\xdf\\xd0\\x2c\\x3a\\xc0\\xc4\\x9a\\xd1\\x0c\\x94\\xbe\\x59\\x69\\xee\\x08\\x08\\xc0\\xa3\\x0b\\x2a\\x1e\\xaa\\x90\\xea\\x43\\xb8\\x57\\x5c\\x30\\x56\\xf4\\x23\\xcd\\x4b\\x6f\\x34\\xae\\x51\\xc2\\x22\\x37\\x65\\xa9\\xea\\x21\\xf6\\x45\\x73\\xc1\\xa1\\x39\\x61\\x32\\x12\\x46\\xe3\\xb5\\x34\\x9e\\xe0\\x48\\xfb\\x62\\xd5\\xfb\\x61\\xb1\\x71\\x43\\x91\\x18\\x25\\x62\\xb9\\x15\\x98\\x36\\x0e\\x5f\\x9b\\xf4\\xac\\x80\\xdb\\x24\\x64\\x32\\xaf\\xb3\\xa4\\x3d\\x34\\x96\\x50\\xde\\x03\\xd3\\x43\\xc2\\xe9\\x7a\\x8e\\xef\\xd1\\xbf\\x30\\xc1\\x0c\\x25\\x86\\x7f\\x53\\x26\\x6b\\xd1\\xf0\\xdc\\x14\\xae\\x1a\\x6b\\xe9\\xef\\xde\\xcf\\xf6\\x7e\\x7d\\x29\\x2c\\x6c\\xdf\\xc9\\x0d\\x80\\xb8\\x86\\x66\\x8f\\x04\\xc2\\xa0\\xf5\\xad\\x7f\\xa1\\x7c\\x17\\x8b\\x6e\\x9b\\x45\\xa1\\x1f\\x4d\\xdf\\xe2\\xd6\\x69\\x60\\xa3\\xf7\\x51\\x35\\xad\\x5e\\xd1\\x54\\xe5\\x13\\xe1\\xa5\\xd1\\x38\\xe7\\x37\\x1e\\x84\\xd7\\xc9\\x24\\x53\\xe6\\xc6\\x2d\\xc5\\x9b\\x8e\\x1f\\xa9\\x3d\\x77\\x3a\\x25\\x40\\xd9\\x1c\\x25\\x7c\"},\n{{0x4e,0xc6,0x82,0x9b,0x43,0x99,0x70,0x56,0xd9,0x96,0x85,0x38,0x9b,0xd5,0x3c,0x52,0x8d,0xe7,0xe5,0xff,0x27,0x15,0xd6,0x5c,0x95,0x66,0x19,0x82,0x6e,0x3f,0xb5,0xb5,},{0x7d,0x92,0x2d,0x57,0xfd,0xb1,0x27,0x92,0x87,0x9a,0xec,0x4e,0x8c,0x65,0x14,0x63,0xec,0xe0,0x64,0x49,0x2c,0x72,0x17,0x53,0xd2,0x2e,0x11,0x55,0x09,0xfe,0xd7,0x06,},{0x15,0x9c,0xa4,0x04,0xf7,0xf7,0x41,0x17,0xc5,0x16,0x3c,0xf4,0x04,0x11,0x09,0x49,0xeb,0x57,0xae,0x2d,0x76,0x62,0xb1,0xff,0x41,0x78,0xcc,0x67,0x56,0xe9,0x0a,0xda,0xea,0xb7,0x1b,0x06,0x4c,0xe1,0xdf,0xf4,0x57,0xb2,0xdb,0xa7,0xe2,0xdc,0x13,0xc2,0x17,0xbc,0xae,0x8a,0x61,0xfc,0xf8,0xce,0x14,0x87,0xa6,0x49,0xc2,0x57,0xff,0x07,},\"\\xed\\x26\\xb4\\x13\\x0d\\x4e\\xbf\\x3f\\x38\\x61\\x49\\x1a\\xa3\\xdd\\x96\\xa4\\xeb\\x69\\x75\\x21\\x73\\xfa\\x6c\\x84\\xca\\x65\\xdf\\xc9\\x91\\xc7\\xfe\\x44\\xe0\\x2b\\xd6\\x16\\x50\\x25\\x2a\\x1d\\x23\\x78\\x66\\x82\\xec\\x38\\xc1\\xfe\\xe8\\x2c\\xc3\\x50\\xdb\\x7c\\x3c\\x39\\x49\\xa1\\xc9\\x35\\xff\\xeb\\xd7\\xba\\xa2\\x4f\\x35\\xa3\\x93\\xfb\\xd2\\x7e\\x7c\\x34\\xc2\\xf9\\xff\\xda\\x60\\xa1\\x8d\\xf6\\x6c\\x3e\\x46\\x5d\\x90\\xed\\x48\\xfb\\xba\\xd3\\xfa\\x79\\x47\\xde\\xe7\\xe6\\x59\\xa3\\xee\\xad\\xb8\\x87\\xf0\\x96\\x3f\\x6b\\xdd\\x76\\xc3\\x6c\\x11\\xae\\x46\\xd0\\x88\\xee\\x50\\xbc\\xa8\\x18\\x7a\\x0a\\x88\\x32\\xdb\\x79\\x84\\xb7\\xe2\\x7c\\xbe\\x6a\\xbf\\x12\\xd2\\xc9\\x4f\\x33\\x7e\\xc7\\x8c\\xb3\\x8b\\x26\\x24\\x1b\\xd1\\xa3\\xd2\\xf5\\xfa\\x44\\x07\\xfd\\xd8\\x02\\x27\\xd2\\xb1\\x70\\x14\\x4b\\x41\\x59\\x78\\xe3\\x72\\x01\\xd0\\xfc\\xf4\\x31\\x74\\xb9\\xd7\\xb2\\x11\\x5d\\x5e\\xb8\\xbc\\xec\\x27\\x6a\\x77\\x5a\\xea\\x93\\xf2\\x34\\x0d\\x44\\x25\\xd3\\x4d\\x20\\x47\\x49\\x4d\\x91\\x7e\\x0d\\xbe\\x37\\x85\\x7e\\x6c\\x99\\x85\\x9b\\x71\\xc9\\x14\\xaa\\xd5\\xe5\\x4f\\x7b\\x2b\\x03\\x3e\\x59\\x4e\\x27\\x2c\\xc5\\xcf\\xe9\\x19\\xf8\\x88\\xe5\\x5c\\xb6\\x15\\x7a\\xff\\xcf\\x35\\x72\\x46\\xd0\\x0b\\x53\\x2c\\xc4\\x71\\xb9\\x2e\\xae\\x0e\\xf7\\xf1\\xe9\\x15\\x94\\x4c\\x65\\x27\\x93\\x15\\x72\\x98\\x53\\xda\\x57\\x2c\\x80\\x9a\\xa0\\x9d\\x40\\x36\\x5f\\x90\\x87\\x5a\\x50\\xd3\\x1c\\xa3\\x90\\x0d\\xa7\\x70\\x47\\xc9\\x57\\xc8\\xf8\\xbf\\x20\\xec\\x86\\xbd\\x56\\xf9\\xa9\\x54\\xd9\\x98\\x8e\\x20\\x6b\\x44\\x4c\\xa5\\xa4\\x43\\x45\\x21\\xbf\\xc9\\xc5\\xf3\\xa8\\xa0\\x61\\x47\\xeb\\x07\\xd1\\x1d\\xfe\\x11\\x71\\xec\\x31\\xff\\x55\\x77\\x15\\x88\\xb3\\x33\\xee\\xe6\\x21\\x5d\\x21\\x6c\\x47\\xa8\\x56\\x6f\\xbb\\x2b\\x18\\x97\\x46\\x46\\xac\\x5a\\x92\\xc6\\x99\\xd7\\x75\\x84\\xc0\\xde\\xfe\\xfd\\x2d\\xfa\\x58\\xfc\\xa2\\x71\\x99\\xe4\\x1e\\xc5\\x8a\\x24\\x63\\x20\\xb3\\x5f\\xaa\\xb7\\x5b\\x97\\x95\\x19\\x24\\x22\\x6d\\xa4\\xab\\x28\\xf0\\x1b\\x47\\x07\\x8e\\x71\\x2e\\x4f\\xd9\\xf7\\x7b\\x25\\x1c\\x96\\x67\\x85\\x8c\\x28\\xe3\\x2e\\xf1\\xcd\\x01\\xfc\\xbe\\x43\\x5c\\x54\\x2d\\xba\\xd0\\xa8\\x4a\\x13\\xcd\\xbb\\x57\\x75\\xe6\\x2d\\x81\\x1d\\xc6\\x90\\xd9\\x55\\x5c\\x37\\xf1\\x5f\\x91\\x76\\x7a\\x56\\x13\\x57\\xdf\\x10\\x6e\\xef\\xe0\\x56\\xe7\\x36\\x06\\x70\\x65\\x0f\\xb8\\x18\\xfc\\x6a\\xdc\\x59\\x97\\x3e\\x9a\\xd5\\xcd\\xcd\\x80\\x98\\x07\\xab\\x56\\x39\\x7f\\x3c\\x13\\x94\\x87\\x32\\xd9\\x8d\\x67\\x6f\\x4a\\x44\\x70\\xa9\\x5d\\x8b\\x51\\x82\\x37\\xe2\\x26\\xf0\\xcc\\x5f\\x47\\x65\\x16\\x4a\\x5c\\x3e\\xf0\\x50\\x71\\x4b\\xe0\\x2a\\x12\\x6b\\xe8\\xf6\\x65\\x46\\x48\\x15\\x81\\xb9\\xe9\\x4a\\x26\\xaa\\xd2\\x4c\\x69\\x3b\\x7f\\xdb\\xc1\\x8a\\xcd\\x3e\\xd7\\xcf\\xc4\\x7d\\x8a\\xb2\\x67\\x45\\xd7\\x8e\\x70\\x1d\\x0c\\xf0\\x5d\\xd8\\x44\\xb5\\xb3\\x45\\xa2\\x9d\\xab\\x68\\x4c\\xbc\\x50\\x92\\xba\\x02\\x2e\\x3c\\x58\\x2d\\xfc\\x04\\x4c\\x31\\x00\\xad\\x02\\x75\\x66\\x97\\xa8\\x49\\x82\\x29\\x15\\xa1\\x6e\\x2a\\x2b\\x81\\x0e\\x68\\x15\\xf5\\x44\\x21\\xd2\\xf3\\xa6\\xff\\xf5\\x88\\xc0\\xd9\\x01\\x3c\\x76\\xf3\\x3e\\x09\\xbe\\xae\\xef\\x60\\xd8\\x77\\x42\\x30\\xe8\\xce\\x71\\x31\\x28\\x9a\\xef\\x2a\\x40\\x68\\x6c\\x81\\x9f\\xb2\\x04\\x0b\\x06\\x12\\x4d\\x3d\\x9a\\xa4\\x19\\xd5\\x67\\x88\\xf1\\x7f\\xa7\\xed\\x9b\\x9b\\x57\\xce\\xaa\\xd1\\x33\\x7a\\x01\\x01\\xbe\\xa0\\x44\\x0c\\xff\\x74\\x5d\\xdd\\x97\\x22\\x05\\x5d\\x1f\\x9b\\xcf\\xb0\\x09\\xce\\x2c\\x2f\\x41\\xa9\\xe7\\xe8\\x68\\x06\\xb8\\x72\\xcd\\xc2\\x05\\x9b\\xc8\\xec\\x68\\xf5\\xee\\x56\\xc4\\xba\\xcf\\x4b\\xbd\\x30\\xea\\x4c\\x71\\x55\\x86\\x4d\\x60\\x0c\\x0e\\x2e\\xee\\x73\\xb3\\x19\\xbd\\xa4\\x37\\x2e\\x9c\\x60\\x3c\\x77\\x2c\\x25\\x89\\x0c\\x76\\x10\\x48\\x99\\x89\\x47\\x5d\\x37\\xa7\\x7a\\x45\\x74\\xa2\\xba\\x55\\xbf\\xd9\\xc9\\xcf\\xd1\\x46\\xfb\\x97\\xe6\\x16\\x5d\\xcc\\x19\\x55\\x9f\\x4f\\x85\\xdf\\xca\\x2f\\x97\\xf3\\x70\\x2e\\xd8\\xfa\\x6b\\x3c\\x2a\\x97\\x41\\x97\\x4a\\xa0\\x7a\\xb6\"},\n{{0xb1,0x50,0xa7,0x89,0x29,0xed,0x1e,0xb9,0x32,0x69,0x21,0x3e,0x1e,0xbc,0x22,0xe2,0xe4,0x0a,0x60,0x1b,0xdb,0x00,0x54,0x99,0xb7,0xbe,0xb0,0x58,0x91,0x7c,0x53,0x40,},{0x28,0x86,0x6b,0x6d,0x1c,0x39,0x3c,0xb0,0x8e,0x46,0x4c,0xf5,0x57,0x14,0x40,0xa6,0x49,0xe5,0x06,0x42,0x38,0x0d,0xdf,0x4f,0xfb,0x7a,0xd1,0x50,0x48,0x5c,0x10,0x8e,},{0x27,0x6d,0xd0,0x96,0x2e,0x6e,0xe6,0x4f,0x05,0x92,0x44,0x1a,0x8a,0xf0,0xe5,0xef,0x8f,0x93,0xbf,0x0b,0xae,0xba,0x20,0x50,0x4b,0x9d,0xb4,0xf9,0x5a,0x00,0xb9,0x39,0xea,0x38,0xde,0xf1,0xc7,0x97,0x86,0x28,0x98,0xca,0xbe,0x9d,0xc4,0x64,0x4f,0x0e,0x67,0x7e,0x87,0xc0,0xa3,0x3b,0x87,0xb6,0xa4,0xd2,0x2a,0x80,0x7d,0x0e,0x1e,0x02,},\"\\x1b\\xf5\\x5d\\x27\\xf9\\xdd\\xe6\\xc4\\xf1\\xc0\\xdd\\xd3\\x60\\xa2\\x5d\\x94\\x93\\xc0\\xff\\xdc\\xa7\\x4a\\x7e\\xd5\\xe5\\xa5\\x14\\xe9\\x55\\x15\\xcd\\xa4\\xaa\\xd8\\xf4\\x5c\\xd6\\xed\\x79\\x01\\xf8\\xf2\\x24\\xa6\\x3b\\x38\\x12\\x1c\\xbe\\xac\\x2f\\x56\\xda\\xe2\\x10\\xdd\\x05\\x37\\x50\\xcb\\x20\\x75\\x14\\xa8\\x89\\x1e\\x24\\x5a\\x5d\\x07\\xe7\\xde\\x78\\xa2\\xe3\\x81\\x44\\x63\\xf1\\x48\\xd2\\xac\\xb7\\xdc\\x71\\xf9\\x95\\xc9\\x29\\x9a\\xd0\\xd6\\x26\\x6c\\xfe\\xfc\\x94\\x26\\x96\\x57\\xfd\\x47\\xcf\\x53\\x12\\xb9\\x2a\\xf2\\x75\\x06\\x51\\xc4\\x79\\x63\\x6c\\x9d\\x36\\xae\\xf0\\x8f\\x7d\\x11\\x95\\xe7\\xfa\\x1b\\xa3\\xab\\xb5\\xdc\\xb9\\x01\\x36\\xb0\\xfb\\x9a\\x37\\x66\\x8b\\x87\\xa2\\xdb\\x88\\xd1\\xe2\\xb6\\x44\\x0d\\x3e\\x6e\\x60\\x1e\\x6d\\x4b\\xc1\\x0c\\xf1\\xcb\\xdf\\x1d\\x61\\x69\\xc0\\xdc\\x2c\\x4a\\xec\\xde\\xb6\\xcd\\xd4\\x56\\x7d\\x42\\x50\\xb2\\xaf\\xa7\\x15\\xb1\\x66\\xc9\\x46\\x7f\\x90\\x7d\\x3f\\xa5\\xa6\\xda\\xf2\\x00\\xb3\\x09\\xc1\\x09\\x37\\x68\\x30\\x49\\x9c\\xaf\\x31\\x49\\x00\\x1c\\xf3\\x33\\x94\\x48\\xca\\x3d\\x76\\x52\\x25\\xd6\\xb3\\xc1\\xcd\\x26\\x7c\\xba\\x93\\x6e\\x7a\\xa4\\x83\\x25\\x39\\x46\\x6f\\xd2\\x0c\\xbb\\x38\\x32\\x3c\\xbb\\x22\\x28\\xa2\\x71\\xf2\\xd2\\x82\\x56\\x1c\\x73\\xed\\x79\\xa1\\xad\\x04\\x69\\x8e\\x27\\xef\\xe3\\x93\\x23\\x5f\\x34\\x56\\xc2\\x95\\x40\\x7d\\xa0\\x96\\x0f\\x00\\x34\\xd8\\xde\\xef\\xd1\\xc1\\x85\\x73\\x6f\\xd3\\xea\\xf1\\xf9\\xa1\\xe3\\x2f\\x09\\x17\\x4c\\x1f\\xe1\\x27\\x20\\xb7\\xc9\\x6f\\xeb\\xdb\\x33\\xe0\\x1b\\x1b\\x6a\\x1c\\x63\\x71\\x50\\x19\\x4b\\xe4\\xff\\xab\\x15\\x9e\\x45\\xb2\\x45\\x85\\x57\\x68\\x46\\xbb\\x64\\x27\\x4e\\xca\\x7b\\x39\\xa3\\xed\\x93\\x57\\xde\\x7b\\x08\\x42\\x13\\x02\\x4a\\x9e\\x85\\x89\\x26\\x36\\x00\\xa2\\x86\\x7c\\x2a\\x7c\\xf8\\xb9\\x90\\x76\\xa1\\x2a\\x07\\xbd\\x7d\\xf8\\xd5\\x27\\x7b\\xb0\\x4a\\xd7\\x2e\\x63\\x9b\\x77\\xea\\xca\\x1e\\xc5\\x8e\\xf9\\x63\\x7e\\x9a\\x23\\x76\\xba\\x87\\x8a\\x45\\x72\\x35\\xa0\\x6f\\x78\\xfd\\xf0\\xe0\\xd9\\x25\\xcb\\x2f\\xd2\\xa3\\x8c\\x77\\x18\\x8f\\x60\\x37\\x2e\\xf6\\x00\\x97\\x92\\x42\\x43\\x99\\xc9\\xb6\\x79\\x28\\xda\\x2e\\x3b\\xa9\\x1c\\xbd\\xe4\\x07\\xe7\\xe8\\x76\\xba\\x98\\x13\\x9e\\xd2\\x2c\\xa3\\xb9\\x83\\xbe\\xde\\x00\\x00\\x52\\x87\\x96\\x44\\x8e\\x4a\\x10\\x55\\xac\\xb2\\xde\\xaa\\x56\\xbc\\x30\\x82\\x54\\xc5\\xbd\\x49\\x8c\\x27\\x5e\\xce\\xdc\\x13\\x57\\xef\\xe1\\xfd\\xa0\\x1d\\x34\\xd9\\x16\\xdd\\x4d\\x86\\x47\\xe5\\x77\\x19\\x95\\xa6\\x53\\xe0\\xf8\\xa5\\x28\\x4c\\xc7\\xbf\\x73\\x15\\x7b\\x33\\x49\\xd5\\x9e\\x6f\\x92\\x0c\\xad\\x6c\\xdd\\x17\\x19\\xf0\\x38\\x02\\x5c\\x43\\x00\\xe0\\x21\\x0c\\xe2\\x49\\xfa\\xf3\\xc8\\x2d\\xe1\\xfd\\x1c\\xda\\xbe\\x61\\xc1\\x4e\\xcb\\x1d\\xf0\\x0c\\x5c\\x46\\x6a\\xa6\\xa0\\x12\\xa9\\xc1\\x0d\\xcf\\xe5\\x9b\\x7e\\x9d\\x3b\\x15\\x5d\\xab\\x6c\\x7b\\x7c\\x16\\x08\\xc1\\xed\\xd5\\x1d\\xbd\\xad\\xf6\\xba\\x58\\x76\\xb5\\xe6\\x0f\\xdf\\x7f\\x19\\xe6\\xef\\x71\\x2c\\xd1\\xa7\\xdd\\x3a\\x06\\x2a\\x65\\x74\\xa7\\x43\\x6b\\x31\\x9e\\xfb\\x94\\x4e\\x42\\x23\\xf5\\x42\\xb2\\x50\\x2c\\x1b\\xa9\\x76\\xbe\\x91\\xe0\\x5b\\x0f\\x85\\xa0\\x9f\\xd7\\x93\\xbe\\xca\\x88\\x33\\x75\\xfb\\x67\\xcd\\x13\\x3f\\x52\\x84\\xd8\\x99\\x84\\xff\\x3c\\xaf\\xa7\\xe1\\x1a\\x9d\\x85\\xe7\\x89\\x32\\x32\\xa5\\x24\\xec\\x54\\xb2\\x0f\\x97\\x5d\\x3c\\x0a\\x11\\x43\\xa0\\xef\\x41\\x17\\x6b\\x70\\x51\\xea\\x91\\xd4\\x0c\\x5f\\x44\\xfd\\x9e\\x10\\x05\\x58\\xbf\\x12\\x12\\xa7\\xb8\\x91\\xe6\\x8b\\x55\\xca\\x61\\xf4\\xbe\\x94\\x52\\x66\\xd9\\xa1\\x00\\x7a\\x14\\xaa\\xeb\\x68\\xc4\\x8e\\x25\\x7f\\x0f\\x46\\x31\\x0a\\xd1\\x64\\x81\\x46\\x7e\\xc1\\x77\\x35\\x35\\xd5\\xfc\\x08\\x49\\x15\\xf5\\xd0\\x04\\xba\\x0d\\xc7\\x59\\x1d\\x21\\x23\\xc6\\x22\\x07\\x90\\x9d\\x84\\xf2\\xb3\\x82\\xf5\\xef\\x12\\x75\\x9a\\x95\\xcd\\x3f\\x51\\x89\\x80\\x6e\\x27\\x39\\x60\\xae\\xe1\\x62\\xc0\\x0f\\x73\\xe7\\xfa\\x59\\x36\\x39\\x57\\x65\\x4b\\xb1\\x91\\x6b\\x57\\x09\\xbb\\x0a\\x9d\\x04\\x05\\x14\\xae\\x52\\x84\\x95\\x1e\\x6b\"},\n{{0x9f,0xc7,0xc4,0x9c,0xb8,0xc4,0xf0,0x97,0x2d,0x6e,0xd9,0x70,0xae,0x2c,0x6a,0xc3,0x37,0xe6,0x75,0x42,0x5c,0xc8,0xdc,0xe7,0x30,0xfc,0x41,0x44,0x43,0x02,0x93,0x5d,},{0x47,0x82,0x52,0x0b,0x06,0xf9,0x33,0x44,0xaa,0x76,0x67,0x80,0xe5,0x44,0x01,0x36,0x3d,0xfd,0x7d,0x96,0x7c,0xc3,0xbf,0x06,0x48,0x8a,0xf9,0x09,0x20,0xa3,0x0f,0x85,},{0x5c,0x78,0x3a,0x86,0x0a,0xa6,0x68,0x18,0x4d,0xd2,0x2c,0x4f,0x9a,0x54,0x6b,0x5e,0xc9,0x6e,0xba,0xd2,0xe4,0xaf,0x00,0xf9,0x68,0xc6,0x88,0x67,0x13,0x54,0xe0,0xcc,0x9b,0x57,0x2c,0x73,0xbc,0x6f,0x19,0x93,0x7a,0x05,0xf1,0xba,0xf3,0x43,0x47,0x63,0x96,0x5c,0x96,0xe1,0x03,0x40,0x7f,0x0e,0xb6,0x42,0xc5,0x64,0x41,0x54,0x29,0x0b,},\"\\x82\\xbc\\x2c\\x70\\x0d\\xb2\\x22\\xa4\\xac\\x91\\x4a\\xa2\\xbe\\x8f\\xa2\\x8e\\x42\\x20\\x67\\xf9\\x4f\\x33\\x44\\xf5\\x36\\x2b\\xeb\\xaa\\xbe\\xd7\\x61\\x2b\\x0e\\x46\\x4a\\x73\\xa6\\xc4\\x56\\x90\\x35\\x64\\xb1\\x53\\x93\\x48\\x51\\x40\\xdd\\x0f\\x3a\\xff\\x90\\xaa\\x6e\\x16\\x61\\xdd\\xf6\\x82\\x85\\x0d\\x04\\x90\\xaf\\xc3\\xd7\\x35\\xde\\xa0\\x5b\\xa4\\x7c\\x85\\xd9\\x7e\\x83\\x35\\x33\\x51\\x4c\\x19\\x8b\\x4c\\xf6\\xe6\\x6d\\x36\\x0e\\xe5\\xbf\\x00\\xe1\\x4a\\x3a\\xab\\x1a\\xd0\\xe7\\xb8\\xab\\x2a\\xac\\xc9\\x64\\xd4\\x28\\x30\\xc7\\x84\\x53\\xdf\\x19\\x55\\xbb\\xed\\x1c\\xd6\\x8a\\xda\\x3d\\xb0\\xec\\xdb\\x60\\x1a\\xd7\\x66\\x7d\\x5c\\x5e\\x2f\\xd4\\x9e\\x36\\xf7\\x32\\x8e\\xaa\\x33\\x7d\\xbd\\x6f\\xf7\\x0e\\x78\\x98\\xa3\\xf9\\x8c\\x15\\x9d\\x04\\x5a\\x24\\x27\\xad\\xe5\\x33\\x3c\\x88\\xfc\\x4a\\xfd\\x38\\x19\\xdc\\x82\\xf4\\xda\\xa3\\xc5\\x23\\xcb\\x57\\xe3\\x5a\\x2a\\x5a\\x72\\x5d\\x63\\xd4\\x02\\xba\\xef\\x51\\xe5\\x1f\\x1e\\xf4\\xf8\\xf9\\xa5\\x95\\xc9\\x37\\x9c\\x9a\\xba\\x87\\x3f\\xb4\\xe7\\x65\\xa9\\x31\\xda\\x09\\x14\\x8a\\xba\\x6e\\xc5\\xb4\\x48\\x59\\xb0\\xe8\\x1f\\xf9\\xfc\\x22\\x95\\x98\\xac\\x9f\\xbd\\xb0\\xbd\\xbd\\xdb\\x56\\x92\\xa5\\x22\\x22\\xdf\\x52\\xea\\x38\\x7b\\xbb\\xf3\\x6a\\xd6\\x4d\\x19\\x46\\xbd\\x28\\x2e\\x32\\x3f\\xf4\\x82\\x2a\\xd9\\xda\\x89\\x7f\\xf7\\x3f\\x01\\xb3\\x90\\xcf\\xe2\\xe6\\x4d\\xe4\\x92\\xd5\\x5d\\xe7\\x7f\\x5d\\x7d\\x00\\x60\\xa6\\x87\\x2a\\x01\\x83\\xcc\\xba\\x61\\x0f\\x53\\x27\\x4c\\xcb\\x29\\xce\\x6d\\xce\\x6a\\x03\\x6c\\x53\\x17\\xa1\\xed\\x2a\\x7c\\x10\\x68\\xc1\\xb2\\x46\\xfc\\x1d\\x58\\x81\\xd0\\x0d\\xe0\\x6e\\xb4\\x01\\xcf\\xf9\\x5e\\x6b\\x69\\x14\\x86\\x99\\xdb\\x13\\xe9\\x4b\\xb5\\xb2\\x80\\x21\\x2d\\xff\\x54\\xc7\\x0e\\x56\\xde\\x23\\x5a\\x5f\\x14\\x00\\xb5\\xbe\\xa5\\x67\\x72\\xd0\\x60\\x17\\x0f\\x1d\\x06\\x57\\x32\\x15\\x61\\xe4\\xb4\\x91\\x07\\xeb\\x96\\xd9\\xb3\\xbc\\x5a\\xdf\\x45\\x1c\\x2a\\x52\\x4e\\xba\\x4d\\xb0\\x03\\xb7\\x7b\\x63\\x2a\\x5d\\x89\\x82\\x7a\\x62\\x24\\xcc\\x79\\x8e\\x09\\x6b\\xa2\\x7f\\xb3\\x3b\\xf6\\x1e\\x3b\\x8e\\xaf\\x18\\xd0\\x01\\xae\\x8e\\xb5\\x2f\\x85\\xc9\\x0d\\x9e\\x12\\x54\\x48\\x03\\xe6\\x7f\\xf0\\x20\\x47\\xe0\\xd2\\x3c\\x22\\xe7\\xf8\\xb9\\x80\\xc0\\x1c\\x3d\\x48\\x24\\xb2\\xa9\\xa1\\x4a\\x2e\\x8f\\x67\\x2a\\x7b\\x0c\\xe0\\x3b\\xdb\\xb3\\xbd\\x56\\xd7\\x54\\xa0\\x96\\x4d\\xb0\\x1c\\xa8\\x99\\xd4\\x88\\x00\\x15\\x08\\x65\\x7b\\x7b\\x02\\x2c\\xcf\\x04\\x2c\\x38\\xfc\\x19\\x49\\xd0\\xe0\\x0a\\xf4\\xd3\\x01\\xd4\\xf0\\x0c\\x3d\\xea\\x20\\xe3\\x08\\xa0\\xf9\\xdc\\xac\\xb4\\x32\\x22\\xb3\\x82\\x41\\x44\\xaf\\x77\\xbe\\x18\\xa5\\x04\\xaa\\x8d\\x26\\x8b\\x8a\\x56\\x00\\x72\\x5e\\x7c\\xc5\\xf3\\xa2\\xe6\\x25\\x6a\\x80\\x74\\xd1\\xae\\xbc\\xa1\\x23\\xea\\x53\\xa0\\x76\\x7a\\x92\\xe1\\x78\\x3a\\x49\\x83\\xc5\\xef\\x3d\\x7d\\xd7\\xf0\\x2a\\xa9\\xd1\\xf4\\xf9\\xaa\\xc6\\xce\\x25\\x45\\x93\\xf0\\x87\\x92\\x01\\x4f\\xb8\\x67\\xea\\xf8\\x79\\xb8\\x8a\\x4e\\xfb\\x18\\xe8\\x9b\\xa1\\x10\\x06\\xad\\x09\\xd8\\x54\\x31\\xcc\\x26\\x57\\x5b\\x53\\x8d\\x8e\\x78\\x90\\x64\\x6c\\x59\\x88\\x64\\x7c\\xc1\\x05\\xd5\\x82\\x90\\x7a\\xe6\\x25\\xe0\\x9c\\xd0\\x89\\xf4\\x72\\x49\\xe8\\x18\\x14\\xda\\x14\\x04\\x4c\\x70\\x14\\xe8\\x0e\\x7a\\x8e\\x61\\x9c\\x7b\\x73\\x5f\\x70\\x16\\x16\\xb6\\xa3\\xc6\\xf4\\x92\\xcd\\xc6\\xed\\x46\\x3e\\x71\\xa3\\xd2\\x22\\x91\\x48\\x2d\\x90\\xa1\\xde\\x6f\\x09\\x7c\\x4a\\xe2\\x54\\x87\\x61\\x84\\xc5\\x62\\xb1\\x65\\x75\\xb9\\xd0\\xd1\\x93\\x13\\xed\\x98\\x86\\x4f\\x49\\xfe\\x2e\\x1d\\x07\\x4a\\x21\\x21\\x1b\\x2b\\x2a\\x6d\\x27\\xdd\\xb2\\x86\\x11\\x52\\x0d\\x5f\\x71\\x23\\x05\\x8f\\xd0\\x07\\xbb\\x01\\x00\\x1d\\xef\\x07\\xb7\\x92\\xbb\\x05\\xbb\\x74\\x1c\\x12\\x9c\\x6a\\x36\\x37\\x6c\\x38\\x53\\xb8\\xbb\\x4f\\x66\\xb5\\x76\\x0c\\x8e\\xb4\\xec\\xc7\\x30\\x6b\\xa3\\xa9\\x0c\\x70\\xda\\x47\\xc9\\x65\\xf6\\xdc\\xcb\\xdb\\x61\\xa7\\xfd\\xa1\\x8e\\xe9\\x67\\xcf\\x8c\\x5f\\x05\\x03\\x11\\x09\\x2d\\x0f\\xde\\xea\\xed\\xd1\\x26\\x5d\\xef\\xdd\\x66\\x0a\\xbe\\x70\"},\n{{0x08,0xbf,0x05,0x9b,0x4d,0xa9,0xaa,0x7f,0xfc,0x70,0x2f,0x5b,0x23,0x04,0xc4,0xf9,0x6c,0xa4,0x9b,0x7d,0xab,0xb6,0xaf,0xb4,0x1d,0xc9,0x1c,0x0f,0x00,0xc6,0x5b,0x78,},{0xa6,0x28,0x9b,0xa2,0x8e,0x80,0xe8,0xd1,0xa3,0x19,0x22,0x3e,0x41,0x65,0xdc,0x0b,0xce,0x73,0x52,0xaa,0xf2,0x42,0xf7,0x0c,0xc9,0x68,0xd2,0x1d,0x77,0x75,0x28,0x32,},{0xe2,0x47,0x65,0x86,0x01,0x37,0x68,0x9a,0xad,0x50,0xeb,0xee,0xfc,0x8d,0x6d,0xb8,0xe9,0x36,0xa4,0xcb,0xa6,0x2c,0xe8,0x7a,0x7f,0x58,0x02,0x09,0x38,0x4a,0x9d,0x7e,0xec,0x90,0x70,0x90,0x5f,0x60,0xad,0x63,0xa7,0xbe,0xfd,0x7c,0x70,0xf0,0xae,0x7c,0x81,0x09,0x16,0x9a,0xee,0x4e,0x51,0x8f,0xce,0xbf,0xac,0xa7,0x23,0xc5,0xb2,0x07,},\"\\xbd\\x4f\\xb2\\x8a\\x1d\\xd0\\x8b\\x07\\xba\\x66\\xe1\\x7f\\x0c\\x4f\\x21\\x85\\x3f\\xef\\xef\\x1c\\x9d\\x20\\xba\\x79\\x77\\xf1\\x54\\x64\\x1e\\xa1\\xa1\\x8b\\xec\\xf6\\xbb\\xb8\\x03\\x88\\x88\\x62\\x94\\xe0\\x75\\x6a\\x3c\\x50\\x8f\\xfd\\xfe\\x90\\xb5\\x1e\\x13\\x56\\xd1\\x12\\xd8\\xcd\\xe5\\xee\\x2c\\xc6\\x33\\x2e\\x61\\xd1\\x69\\xcc\\xc8\\xcc\\x93\\x49\\x94\\xf1\\xbb\\x56\\x0f\\xa4\\x66\\x0c\\x0b\\x0f\\xd4\\xe8\\x14\\x9a\\x22\\x5e\\xd4\\x88\\x3e\\x68\\xfb\\xb6\\x9d\\xa7\\xaf\\x8a\\x52\\x4b\\x17\\x14\\x1c\\xcb\\x76\\xb5\\x0c\\xd8\\xe1\\xb6\\x7d\\x3c\\xe0\\x37\\xde\\xd7\\xdf\\xa5\\x9b\\xc7\\xc2\\x67\\x42\\x26\\xec\\x7e\\x07\\xb7\\x8e\\xa3\\xf7\\x82\\xfd\\xa3\\xe5\\xf1\\xe9\\xca\\xea\\xb6\\x08\\xca\\x38\\x7c\\x30\\x46\\x54\\xf8\\x01\\xd0\\x0e\\x10\\xa7\\xc2\\x9f\\x4b\\x0d\\xa3\\xe5\\xf8\\x95\\x13\\xa9\\x80\\x37\\x71\\x9a\\x1a\\xef\\x4c\\x25\\x06\\xc1\\x77\\xaf\\x54\\x51\\xa0\\x07\\x57\\xa5\\x9f\\x16\\x22\\x9c\\x4f\\x44\\x14\\xdf\\x51\\x58\\x0d\\x48\\x21\\x0d\\xab\\xc9\\x37\\x73\\x70\\xb6\\x06\\x8a\\x88\\xe8\\x1d\\x3a\\xd1\\xbe\\xd4\\x98\\x51\\x55\\xc3\\x60\\x0f\\xf4\\x87\\x68\\xb9\\x03\\x02\\x2f\\xe0\\x2a\\xe4\\x80\\xf2\\xe6\\x32\\x9f\\x0b\\xcc\\x91\\xd7\\x5f\\x5c\\x6a\\x09\\xfd\\xf7\\x7b\\xde\\x90\\x49\\x9f\\x3c\\xa3\\x95\\xcb\\x20\\x06\\x2a\\x09\\x84\\xad\\x6a\\x01\\x41\\xfd\\x01\\xc2\\xd5\\x4d\\xfb\\xb1\\xee\\x58\\x46\\x10\\x64\\x07\\x73\\x43\\x9a\\x16\\x58\\xd2\\xc9\\xf8\\x62\\xf1\\x83\\xbf\\xef\\xb0\\x33\\xa3\\xbe\\x27\\x18\\x12\\xf1\\x3c\\x78\\x70\\x46\\x57\\xe7\\xfb\\x4f\\x85\\x01\\x75\\xfc\\xd6\\x3d\\x3e\\x44\\x05\\xd1\\x92\\x24\\x2c\\x21\\xf2\\x7c\\x51\\x47\\x7f\\x32\\x11\\xa9\\xce\\x24\\x8e\\x89\\x2b\\x42\\xfb\\x6d\\x85\\x82\\x0f\\x41\\xb8\\x97\\x83\\x6f\\x20\\xf8\\x5a\\x13\\x11\\x53\\x4b\\x5c\\x40\\x4f\\x8b\\x7a\\x4a\\x03\\x19\\xbc\\x6c\\xec\\xaa\\x57\\xfe\\x4d\\x4f\\x20\\x60\\x7c\\x99\\xc2\\xdf\\x22\\xfa\\x06\\x76\\xf9\\x9d\\x1b\\xd8\\x78\\x86\\xc9\\x28\\xc4\\x98\\x8c\\x6e\\x78\\xc5\\x7d\\x75\\x83\\x30\\xe6\\x92\\x2c\\xbe\\x03\\xc1\\x03\\x40\\x25\\x3d\\x0d\\xd4\\x83\\x79\\x2c\\xe7\\x5e\\x6c\\xd0\\x9d\\x12\\xfb\\xbb\\x04\\x1f\\x02\\x05\\xe6\\x5a\\xd2\\x5c\\xe7\\xc1\\xb2\\x4e\\x77\\xee\\x8d\\x6f\\x91\\x5e\\x3b\\xc3\\xe1\\x0d\\x09\\xfb\\xd3\\x87\\xa8\\x4b\\xda\\xab\\xfd\\x1c\\xed\\xb5\\x2c\\x0b\\x17\\x33\\xb5\\xf4\\x70\\x88\\xc0\\xd3\\x5e\\x0e\\xf4\\x58\\xc8\\x54\\x14\\xc2\\xb0\\x4c\\x2d\\x29\\xf6\\x3f\\x77\\x58\\x61\\x31\\xee\\x65\\x53\\x0f\\x20\\x9b\\x51\\x8a\\x0f\\x25\\x7a\\x07\\x46\\xbb\\xd5\\xfe\\x0a\\x2e\\x0c\\x38\\x8a\\x6c\\x48\\x0e\\x1b\\x60\\x71\\x4f\\xee\\x1c\\x59\\x41\\xbb\\x4e\\x13\\xf7\\x07\\xea\\xc4\\x87\\xa9\\x66\\x6a\\x72\\x3b\\x57\\x93\\x13\\x4a\\x26\\x8b\\x77\\x59\\x77\\x86\\xc3\\xa3\\x19\\x3b\\x46\\xd3\\x55\\xdd\\x08\\x95\\xfc\\x62\\x16\\xc5\\x36\\xa5\\x42\\xff\\xd7\\xd7\\xb0\\x80\\x10\\xc8\\x6f\\x54\\x7a\\x5d\\xaa\\x38\\x33\\x5a\\x8b\\xfa\\x26\\x55\\xd5\\xf7\\x1b\\x4d\\x88\\x07\\xf5\\x0c\\x85\\x45\\xc5\\x83\\xdd\\x0b\\x69\\x00\\x22\\xee\\x65\\x87\\x3a\\xea\\x3e\\x8f\\x1a\\x56\\x5f\\x3b\\x0e\\x4e\\x02\\x95\\xfb\\x0d\\x32\\x1f\\x5c\\x0b\\x39\\x7f\\x2f\\xd0\\x52\\x8f\\x86\\xa0\\xd1\\xb7\\x07\\xf7\\x37\\xb1\\x75\\xc6\\x9e\\x9e\\x7a\\xe3\\xc8\\x4d\\x4b\\x2c\\xf3\\xa3\\x8a\\x63\\x1a\\xa8\\x03\\x2b\\x3e\\x65\\xbb\\x45\\x28\\xf6\\x6d\\x0b\\xfd\\x34\\x47\\x3e\\xd0\\x10\\x1d\\x2a\\x61\\x25\\x5b\\x21\\x5b\\xc1\\xcb\\xab\\x9a\\x26\\xd2\\xb9\\x69\\x32\\x4b\\x77\\xc8\\xa5\\x46\\x4e\\x5b\\x23\\xdf\\x6c\\x51\\x12\\xf9\\xd1\\x7c\\x58\\x7d\\x95\\x55\\x9d\\xe2\\x12\\xad\\x24\\x1d\\x8b\\x12\\x60\\x50\\xe5\\xfd\\xdf\\xcc\\x83\\x9a\\x7e\\x5a\\xa2\\xfd\\xa1\\xca\\x20\\xc0\\x91\\x0d\\x86\\x34\\x18\\xf1\\x95\\xb3\\x8a\\xdf\\xcc\\x36\\xe9\\x2f\\x23\\x96\\xac\\x31\\x44\\xb5\\x37\\xb3\\x0f\\xbe\\x4d\\xde\\x61\\x49\\x02\\xf8\\x99\\x78\\xb7\\xfb\\x42\\xcd\\x99\\xf1\\x3d\\x99\\xc4\\x5c\\x73\\x4f\\xb8\\x2c\\x32\\x59\\xf9\\x0b\\x88\\xfd\\x52\\xbd\\xcb\\x88\\xf7\\xee\\xec\\xdd\\xe4\\xc2\\x43\\xd8\\x80\\xba\\xc7\\x61\\x4e\\x15\\xcf\\x8d\\xb5\\x99\\x3f\\xfa\"},\n{{0xdb,0xbd,0x0f,0x7e,0xcb,0x64,0x82,0xcb,0x01,0xc4,0xdb,0xdc,0x38,0x93,0xc0,0xdb,0x81,0xe8,0x31,0x35,0x3a,0x5b,0x01,0xcc,0x75,0xd3,0xb1,0x1f,0x2f,0xf3,0xc5,0x9c,},{0x2d,0x4e,0x58,0x8d,0x31,0xa3,0x84,0xb1,0x78,0x58,0xc0,0xd7,0x84,0xf6,0x71,0x2b,0xaf,0xd0,0xb4,0x12,0x04,0xcf,0x8f,0x0d,0x57,0x97,0x3e,0x59,0xc7,0x70,0xd3,0xda,},{0x96,0xc0,0x03,0x61,0xfb,0x71,0xc5,0x23,0x05,0xe1,0xab,0x77,0x07,0xe0,0x46,0x52,0x03,0xeb,0x13,0xdf,0x3e,0x06,0x55,0xf0,0x95,0xfb,0x33,0x19,0x42,0xa4,0x0b,0x15,0x58,0x41,0x43,0xb3,0x70,0xa7,0xdd,0x57,0x61,0xfb,0x03,0xc0,0x75,0xd0,0x4a,0x83,0x48,0x66,0x1c,0xce,0xa9,0xad,0xa5,0x33,0x65,0xb5,0x00,0x08,0x7d,0x57,0xec,0x0c,},\"\\xe0\\xff\\xf3\\x59\\x75\\xeb\\xa7\\x8d\\xa2\\xb0\\xff\\xcc\\x5c\\x1b\\x66\\x36\\x00\\x88\\x8e\\x82\\x55\\xcd\\x20\\x8f\\x6d\\xce\\x7e\\x88\\x95\\x3b\\x71\\x42\\x93\\x73\\x89\\xa3\\x37\\xae\\x82\\xf4\\xcf\\xe3\\x2f\\xcb\\x34\\xf5\\x52\\xa4\\x8f\\xa8\\x89\\x9e\\x1a\\x65\\x9e\\x3e\\xd3\\xd3\\xd2\\x90\\xef\\xc9\\xa0\\xf7\\xde\\xdf\\x33\\xe2\\x1d\\x04\\x8d\\x8d\\x91\\x07\\x57\\x03\\x7b\\x76\\xe8\\xa7\\xee\\x9e\\x4e\\xca\\x30\\xf5\\x29\\xdd\\xc0\\x2c\\xef\\xfc\\x26\\xd6\\x4f\\xda\\x73\\x03\\xcc\\x0d\\x89\\x40\\xe9\\xef\\x59\\xdc\\x98\\x3c\\x12\\xcc\\xd1\\xd2\\x71\\x7e\\x64\\xd3\\x00\\x6a\\xf8\\x2a\\xb1\\x5b\\xb8\\x78\\xbb\\x89\\xd1\\x75\\x8b\\xe4\\x43\\x10\\x42\\x06\\x38\\xb9\\x6a\\x0b\\x5e\\x1e\\x65\\x00\\x9d\\x69\\x39\\x5d\\x02\\x7a\\x5d\\xa4\\xa8\\x5e\\x90\\x1b\\xe9\\xaa\\x2c\\x0b\\x3a\\xcc\\x50\\x8e\\xe1\\x85\\x74\\xc1\\xb2\\xfa\\x9b\\xd5\\xd7\\xae\\x7c\\x7d\\x83\\x07\\x12\\xda\\x5c\\xbf\\x26\\xbe\\x09\\xa3\\x12\\x84\\x70\\xa1\\x2a\\x14\\x90\\x9a\\x80\\xa2\\x66\\x65\\x9b\\xef\\xda\\x54\\x8f\\xd2\\xb2\\x2f\\x24\\xc5\\xfd\\xc2\\x06\\xed\\x3a\\x4e\\x75\\xf5\\x32\\x06\\x82\\xed\\x0e\\x4c\\xe8\\x17\\xd6\\x3d\\x5c\\x7f\\x1e\\xe2\\xb4\\x40\\x64\\x33\\x55\\xbe\\x65\\x42\\xf5\\x9d\\xc6\\xc4\\x5a\\xb1\\x57\\x72\\xf2\\x21\\x9a\\x81\\x2e\\xf7\\x52\\x76\\x42\\x01\\x5b\\xc7\\x5f\\xe4\\x5b\\xa9\\x69\\xe8\\x10\\x0c\\x26\\x8e\\x24\\xce\\xef\\x92\\x05\\xa8\\x3a\\x3f\\x7b\\x5a\\xe8\\x00\\xad\\x06\\xe0\\x95\\xb9\\xb1\\x39\\x21\\x94\\x89\\x79\\x3a\\x7b\\xce\\x84\\xeb\\xeb\\x65\\x4a\\xb6\\x66\\x9e\\x28\\x55\\xcc\\xbe\\xb6\\x94\\xdd\\x48\\x65\\x15\\x05\\xb9\\x59\\xd3\\x2a\\x77\\x02\\x0b\\x86\\x95\\x33\\xe3\\x25\\x6d\\x40\\x68\\x5a\\x61\\x20\\xba\\xb7\\x94\\x48\\x5b\\x32\\xe1\\x16\\x92\\x56\\xfb\\x18\\x8f\\xe7\\x6e\\x04\\xe9\\xef\\xa6\\xd1\\x0d\\x28\\x6a\\xe8\\x6d\\x6f\\x1c\\x87\\xe8\\xfc\\x73\\xad\\x9b\\x59\\xfe\\x0c\\x27\\xee\\x92\\xa4\\x64\\x15\\xb3\\x9d\\x78\\x6d\\x66\\x32\\x5d\\x7f\\xa6\\xfd\\xa7\\x12\\xf1\\x99\\xda\\x55\\x4f\\xc1\\xc8\\x99\\x44\\xa4\\xe8\\x4c\\x19\\x6e\\x97\\x9a\\x80\\x75\\x53\\x71\\x8c\\xb8\\x1c\\x07\\x6e\\x51\\x1e\\x60\\x9d\\x5c\\xac\\x23\\xd8\\xf4\\x5b\\x38\\xb9\\x4b\\xcf\\xcf\\x15\\x8d\\x0d\\x61\\x60\\x22\\x38\\xd5\\x2e\\x3a\\xe8\\x4c\\x81\\x53\\x22\\xf5\\x34\\xf2\\x54\\xe6\\x33\\x89\\xae\\x15\\x5d\\xee\\x2f\\xa9\\x33\\x96\\xf0\\xea\\x49\\x9d\\x5d\\x08\\xc2\\x47\\x59\\x08\\xc6\\x48\\xbd\\xdc\\xee\\x59\\x1e\\x13\\x37\\xe9\\x42\\x1d\\xc5\\xa2\\x57\\xce\\x89\\xcc\\xce\\x4c\\xee\\xa8\\x09\\xd7\\xe8\\x71\\x34\\xe0\\x39\\xdb\\x1b\\xe5\\x98\\x19\\x6d\\x30\\x89\\xfd\\xcf\\xa8\\x97\\x8e\\x02\\xc1\\x55\\x58\\x32\\xda\\x0a\\x72\\xb0\\x8a\\xd0\\x7c\\xdd\\x07\\x26\\x27\\x40\\x9c\\x87\\x39\\x37\\xb0\\xe8\\x35\\x71\\x5b\\xaa\\xf2\\x60\\x8b\\x23\\x95\\x32\\x74\\x67\\xcf\\x69\\xa1\\xcd\\xcc\\xe6\\x37\\x24\\x18\\x38\\x3e\\x7b\\x89\\xc8\\xdf\\x4d\\x53\\x1f\\x58\\x51\\x49\\x50\\x9e\\xad\\x1e\\x41\\xb6\\x62\\x7f\\xea\\x81\\xc7\\x95\\x8c\\xb4\\x9d\\x2d\\x3c\\x3e\\x2f\\xc6\\x91\\xe0\\xb8\\xcf\\x72\\x67\\x9c\\x08\\xb8\\x90\\x46\\x54\\x53\\x1b\\xc4\\x36\\x8f\\xb6\\x17\\xac\\x75\\x57\\xd9\\xdb\\x8d\\x32\\x9d\\x77\\xe4\\x8d\\x8f\\xb4\\xde\\x73\\xab\\xe7\\xcb\\x93\\x88\\x27\\x4a\\xf5\\x85\\xf8\\x75\\xc0\\xda\\xb7\\x93\\xe4\\x35\\x35\\x18\\xbb\\x24\\x69\\x53\\x42\\xaf\\x0f\\x5d\\xf5\\xbe\\x4e\\x9c\\x7a\\xd2\\x15\\xbe\\x90\\xe2\\x55\\x40\\xda\\x34\\x89\\x71\\x7d\\xd3\\xd2\\x92\\x54\\x58\\x5a\\x45\\xc1\\x3e\\x6d\\xcc\\x7e\\x9c\\x8a\\x3a\\x79\\xff\\x75\\x5c\\xbe\\x46\\x5b\\x25\\xe2\\x3a\\x1d\\xa6\\x08\\xe1\\x08\\x4f\\xec\\x83\\xbf\\xf8\\x0c\\xfb\\x74\\x42\\xb1\\x46\\x01\\x87\\x30\\x7a\\xcd\\x75\\xe3\\xf2\\xd1\\x28\\x43\\xa7\\x70\\x94\\xac\\xc3\\x28\\x88\\xfb\\xe5\\xf1\\xfc\\x24\\xc6\\x15\\xd1\\x9a\\x06\\x53\\x91\\xd4\\x17\\x64\\x74\\x64\\x42\\x46\\xb5\\x34\\x3d\\xa7\\x76\\x26\\xa2\\xd4\\x83\\xfe\\x20\\x4f\\x83\\x93\\x28\\x77\\x5b\\x71\\xa4\\xcb\\x56\\x72\\x73\\xe1\\x69\\x64\\x0a\\xf9\\x3d\\xde\\x3e\\xca\\x91\\x16\\xf4\\x00\\xe2\\x3a\\x7a\\xd3\\xd8\\xfc\\x3a\\x28\\xe5\\x65\\xf1\\x25\\xd6\"},\n{{0x74,0x8b,0xb3,0xcd,0x47,0x71,0x37,0xbc,0x88,0x0e,0xa7,0xc6,0x1d,0xf2,0x5c,0x1d,0xac,0x6e,0xbe,0xc9,0xe6,0xc3,0x19,0x3d,0x81,0xff,0xa6,0xf7,0xa8,0x1e,0xc6,0x67,},{0x10,0x6f,0x28,0xcf,0xed,0xf0,0x96,0x45,0x42,0x26,0xb3,0xb0,0x1f,0xc2,0x4a,0xb1,0xc9,0xbb,0xd7,0xf2,0xb0,0x97,0x3e,0x56,0xfe,0x2f,0x4c,0x56,0xa0,0xb1,0x47,0x5b,},{0xe1,0x3c,0xa8,0xe5,0xce,0x7c,0x26,0x80,0x90,0x90,0x8d,0x61,0xcf,0x2f,0x0a,0x3e,0x45,0x72,0x41,0x2b,0xf5,0xad,0xfc,0x5a,0xdd,0xfe,0x88,0x55,0x6f,0x14,0x8b,0x5f,0xcb,0xe3,0xe1,0xbc,0x65,0xff,0x16,0x11,0x7d,0x35,0xc9,0xd5,0xdc,0x3b,0x11,0x71,0x98,0xf8,0x84,0x92,0x5b,0x40,0x35,0xb2,0xc0,0xde,0x6c,0x40,0x2e,0xd4,0x7a,0x01,},\"\\x00\\xde\\x6d\\x99\\x0c\\x84\\x33\\x8a\\x39\\x8f\\xda\\x5f\\x4a\\x2c\\xca\\x73\\x3c\\x56\\xb2\\xa2\\xea\\x39\\x6c\\x2f\\xe6\\x67\\xc2\\x68\\xe3\\x81\\x45\\x87\\x85\\x39\\xbd\\x41\\xbc\\x14\\x0a\\x2c\\xdf\\xe7\\xe1\\x83\\x60\\x41\\x10\\x48\\xcc\\xa6\\x0f\\x35\\xce\\x51\\x09\\x91\\xdf\\x26\\x1c\\xbf\\x66\\x90\\x39\\xd9\\xd2\\x56\\x87\\xa0\\x7f\\xc0\\x47\\x6a\\x41\\xf5\\x0e\\xcc\\xf3\\x81\\x53\\xee\\x6a\\xe9\\xff\\xd3\\x92\\xb2\\xbe\\xc0\\xcc\\x67\\x10\\x1e\\xc3\\x69\\x6d\\x7a\\x2e\\xc8\\xcb\\xd4\\x47\\xb6\\xa6\\xea\\x06\\x3d\\x33\\xec\\x12\\x8a\\xe8\\xb5\\x75\\x77\\xde\\xe1\\x7b\\x97\\x16\\x25\\x63\\xf1\\x5e\\x42\\xb5\\x5c\\xa4\\xbe\\xdb\\xdf\\xb6\\x31\\xa9\\xf6\\x26\\x2f\\x94\\xae\\x35\\xbb\\x35\\xf7\\x95\\xc3\\x5a\\x01\\xde\\xdb\\x46\\x45\\xa7\\x3c\\xfa\\x6e\\xd9\\xee\\x52\\x1e\\x46\\x31\\xfb\\x17\\xbb\\xc0\\x6e\\xe5\\x73\\x16\\xbe\\x52\\x74\\x27\\xc8\\xaa\\x55\\xc6\\x31\\x18\\x74\\x62\\xd4\\xb2\\xc8\\x82\\x2c\\xa4\\xe1\\x8b\\x7a\\x5d\\x4c\\x11\\x4c\\x11\\xdc\\x22\\x06\\x9b\\xc8\\x32\\x65\\x6d\\x5f\\x4d\\x39\\x54\\x87\\x18\\xc5\\x1f\\x5e\\x4f\\xc8\\x28\\xf6\\x0e\\x37\\xf0\\x13\\x07\\x50\\x52\\x65\\xac\\xb2\\x2d\\x5e\\x8d\\x76\\x7b\\x9a\\xa7\\xb8\\x66\\xa1\\x57\\xc6\\x43\\x87\\x3e\\x09\\x08\\x4a\\x1a\\x40\\x4a\\x7b\\xb5\\x8c\\xcc\\x4b\\x5a\\x39\\x0f\\xd3\\x06\\x01\\xc8\\x96\\x93\\x5e\\x35\\x56\\xf6\\x0d\\x2d\\xc6\\xbd\\xff\\xe4\\x7d\\xa0\\xa6\\x87\\xc8\\xec\\xe1\\x24\\x1f\\xf6\\xc0\\x7d\\x77\\x61\\x11\\xca\\x65\\x98\\xfc\\xa9\\x68\\xcb\\x6a\\xfa\\x0a\\x14\\xa3\\x4a\\xb8\\xf5\\x4b\\x95\\xd3\\xd8\\x47\\x3a\\x17\\x4b\\xc7\\x25\\x52\\x3f\\x86\\x74\\xdf\\xb2\\xb1\\x0f\\x87\\x42\\x07\\xfe\\xe1\\xb0\\x8b\\x42\\xda\\x1f\\x58\\x65\\x53\\x05\\xa3\\x59\\x75\\x7a\\xa0\\x25\\x1f\\x14\\x13\\x8e\\xed\\xbc\\x28\\x0c\\xbd\\x38\\x5b\\xf4\\xbb\\xf5\\x53\\x01\\x14\\xcc\\x43\\xb0\\x47\\x47\\x79\\xe2\\x04\\x96\\x2f\\x85\\x60\\xd4\\xaa\\x42\\x3e\\x17\\xe6\\xae\\xca\\xce\\x66\\xc8\\x13\\x78\\x4f\\x6c\\x89\\x8b\\x5b\\x9c\\xb7\\x46\\xa9\\xe0\\x1f\\xbc\\x6b\\xb5\\xc6\\x60\\xf3\\xe1\\x38\\x57\\x4f\\x59\\xb9\\x74\\x54\\x45\\x48\\x6c\\x42\\x2b\\xc0\\x6a\\x10\\xcc\\x8c\\xc9\\xbc\\x56\\x45\\x8e\\xf8\\x5e\\x0e\\x8a\\x02\\x7c\\xb0\\x61\\x7d\\x03\\x37\\xdd\\xda\\x50\\x22\\x0b\\x22\\xc5\\xc3\\x98\\xf5\\xce\\x05\\xec\\x32\\xf0\\x9b\\x09\\x0f\\x7c\\xf6\\xc6\\x0f\\x81\\x8c\\x6b\\x4c\\x68\\x30\\x98\\x3e\\x91\\xc6\\xea\\xdf\\x1e\\xae\\x4d\\x54\\xbd\\xe7\\x54\\xf7\\x5d\\x45\\x0a\\xe7\\x31\\x29\\xf6\\xc4\\xff\\x5c\\x4c\\x60\\x6f\\x7c\\xad\\xbf\\x4f\\x78\\xa1\\x8d\\xb2\\x96\\x1c\\xc8\\xc8\\xdd\\xab\\x05\\x78\\xcf\\xed\\xfc\\xf9\\x5e\\xf0\\x88\\x8a\\xfd\\x38\\x55\\x37\\xd1\\xd0\\xa0\\x76\\x48\\xa5\\xce\\x25\\x22\\xd0\\x63\\x35\\x07\\xd7\\x75\\x93\\xe1\\xa0\\x36\\x6d\\x1e\\xce\\x84\\x3d\\xe6\\x98\\x67\\xd7\\xac\\x44\\x2b\\xa7\\xda\\xd2\\xa9\\x0b\\x59\\xd8\\x98\\x4e\\x4a\\x94\\x6b\\xbe\\x5f\\x17\\x2d\\xa4\\x27\\x63\\x8b\\x2b\\x61\\x20\\x90\\x41\\xff\\xf5\\x0e\\x60\\xec\\x02\\xec\\x2c\\x0b\\x1d\\xc4\\xbe\\x2e\\xdd\\x13\\xe8\\x7b\\x64\\xd1\\xd1\\x66\\x31\\x14\\x57\\x3c\\xf5\\x8a\\x17\\x73\\x9f\\x46\\x3a\\x1c\\x3d\\x6b\\x21\\x23\\x39\\x01\\x83\\xb5\\x05\\xc8\\xee\\xff\\xb2\\x05\\x39\\xbd\\xfe\\xeb\\x40\\x77\\x6d\\x20\\xc4\\x59\\xba\\xc4\\x56\\x99\\x68\\xfc\\xaf\\xe4\\x4e\\xa4\\xcd\\x62\\x4a\\x84\\xbf\\xcc\\xd7\\x87\\x6d\\xd7\\xbf\\x55\\xf8\\x3a\\xc7\\x04\\x0e\\x30\\xf3\\x26\\xdc\\xe3\\x25\\x58\\x8e\\x1b\\xa5\\xbc\\x07\\x90\\x26\\x5d\\xfd\\xba\\x09\\x83\\x9e\\xef\\x57\\x16\\x41\\xe8\\xa1\\x23\\x4b\\x6c\\xfc\\x3a\\x36\\xa8\\x66\\xbd\\x6b\\x92\\xcd\\x71\\xec\\x74\\xe0\\xd4\\xde\\xb9\\xe7\\x4d\\x15\\x82\\x01\\xaa\\x50\\x2f\\x07\\xc8\\xba\\x34\\x8a\\xc2\\x6a\\xaf\\x9b\\x3d\\x07\\x0c\\x9a\\x40\\xb5\\x2a\\x44\\xe9\\x32\\x55\\x2b\\x67\\xa2\\xdf\\x05\\xa7\\xf0\\xf0\\x3c\\x61\\x7b\\x48\\xdc\\x27\\x82\\x36\\x6a\\x23\\x1e\\x0c\\x4e\\x39\\x38\\xa4\\x27\\x4b\\x36\\xaa\\x94\\x50\\xff\\x93\\x6b\\xe1\\x32\\xdc\\xb6\\x92\\x83\\x8d\\x65\\x4c\\x94\\x54\\x2c\\x6e\\x04\\x7a\\x7f\\x78\\xba\\x71\\x19\\x19\\xf9\\x08\\xa1\\x5b\\x30\\xb9\"},\n{{0x39,0x3d,0x44,0xdd,0x0d,0xed,0x71,0xfc,0x08,0x47,0x7b,0xd2,0x5e,0xd0,0xe6,0x62,0x9f,0xa7,0xf8,0x8f,0x08,0x2e,0xbc,0xef,0x09,0x18,0x98,0xe5,0xc9,0xe3,0xd5,0xb8,},{0xc5,0x2a,0x99,0x3b,0x80,0x2d,0x84,0x54,0x0d,0x27,0x54,0x79,0xa1,0xaf,0x5e,0x28,0x7d,0x19,0xea,0x13,0xb3,0x80,0xfa,0x30,0x68,0xd2,0xf2,0xc6,0x8e,0xb9,0x7a,0x09,},{0x84,0xc7,0x16,0xe6,0x0d,0xe6,0x7b,0x02,0x0c,0xc1,0xa6,0xa2,0x4e,0x65,0x49,0xfe,0x56,0xc6,0xd9,0x41,0xa8,0xed,0xea,0xe4,0x07,0x62,0x66,0x66,0xc3,0x1c,0xb6,0x0d,0xee,0x6b,0xe5,0xa7,0x1e,0xbd,0x76,0xba,0xf7,0x1b,0x75,0x11,0x4b,0xcc,0xfd,0x37,0xd1,0x63,0xa9,0x68,0xbb,0xee,0xc1,0xf7,0x69,0x72,0x15,0x12,0x96,0xc4,0x7e,0x07,},\"\\x14\\x2b\\x6e\\x82\\x50\\x13\\x62\\xd5\\x5a\\x04\\xb8\\x9d\\x54\\x1a\\x79\\x68\\x63\\xd7\\x78\\x38\\x40\\xd3\\x4c\\xbd\\xfc\\x51\\x6a\\x3c\\x84\\x77\\x2f\\x92\\x44\\x6f\\x5f\\x0d\\xf4\\xc4\\x5c\\x6e\\x0d\\xc8\\xec\\x1e\\x9b\\xb0\\xff\\x7e\\xc1\\x69\\x6a\\x09\\xcd\\x7a\\xe3\\x4c\\x10\\xf8\\xe6\\x1a\\x9a\\xca\\xbd\\x43\\x03\\xf0\\xa9\\x24\\x72\\x37\\x62\\x1c\\x49\\x0e\\x8d\\x9d\\x0f\\xe4\\x44\\x82\\xc5\\x60\\xd0\\x51\\xb8\\x2b\\x07\\x4a\\xc3\\xd8\\xe4\\x9b\\xb2\\xac\\x71\\x5a\\xc4\\xcd\\xe3\\xd4\\x70\\x9d\\x0e\\xa3\\xaf\\xc5\\x1b\\xfd\\xef\\x4b\\x65\\x67\\x71\\xfb\\xd5\\x5f\\x89\\xda\\x9f\\xa6\\xdc\\xaa\\x62\\xcb\\xae\\x56\\x12\\x08\\xd9\\x8c\\xfa\\x24\\xcb\\x81\\x25\\x2b\\x89\\x5f\\x6a\\x4a\\x92\\xc8\\xe4\\x07\\xaf\\x6c\\x1f\\x1e\\xf4\\x9d\\x8d\\xde\\x15\\x4f\\xbc\\xb1\\xca\\x45\\x7a\\x20\\x4b\\x5e\\xa5\\x43\\x2e\\x4d\\x71\\xfb\\x7e\\xb2\\x4d\\x43\\xf6\\xfe\\x25\\xe7\\xb4\\xc6\\x59\\xb0\\xee\\xbc\\x4c\\xbc\\xc8\\xb3\\xcf\\xde\\x07\\xc8\\xf0\\x7b\\x18\\xa5\\x15\\x70\\xe7\\x16\\x3e\\x33\\xb3\\x17\\xb6\\x13\\x60\\xf9\\xce\\x08\\xd9\\x5d\\xe2\\xc3\\x15\\x6a\\xf1\\xcc\\xc9\\xb5\\x5b\\xcf\\x81\\xea\\xbf\\x3c\\x40\\x43\\x40\\x46\\xbb\\xe8\\x2e\\x02\\x99\\x2a\\x2a\\xc8\\xb3\\xb4\\x25\\x68\\x0a\\x23\\xd9\\x34\\x72\\x6c\\xb1\\xb7\\xbf\\x26\\xce\\xb5\\x2a\\x39\\x02\\x2c\\x00\\xac\\xf4\\x25\\x25\\x71\\x67\\xb8\\x21\\x18\\x5f\\x68\\xe3\\xed\\x17\\x90\\x3d\\x8d\\x22\\x27\\x54\\x98\\xc3\\x9a\\x9e\\x8d\\xf8\\x84\\xec\\x00\\x55\\x8d\\xcf\\xa4\\x3b\\x8a\\x11\\x9c\\x2e\\x85\\x3b\\x9a\\x03\\x18\\xbb\\xea\\x08\\x7f\\x9c\\xec\\x17\\xca\\x49\\xb7\\x08\\x17\\xb8\\xd7\\xc1\\x70\\xa8\\x90\\x6f\\x3e\\xe9\\xe8\\xf8\\xcb\\x27\\xa1\\xd0\\xf5\\x75\\xab\\xfa\\x62\\x7e\\x88\\xf0\\x8c\\xa4\\xb9\\x3c\\x32\\x97\\xc4\\xf3\\x17\\x07\\x2f\\x42\\x1c\\x5e\\x60\\x2e\\x2f\\x83\\x1d\\xfb\\x82\\x55\\x1b\\xdc\\xe8\\xd7\\x12\\x16\\xf0\\x5c\\xf9\\xa2\\x77\\x3b\\x90\\xfc\\x93\\xb9\\xd8\\x55\\xa9\\x1e\\x35\\xad\\xe3\\x32\\xa5\\x06\\x1f\\xdb\\x82\\xb3\\x09\\xba\\xb4\\xf5\\x6e\\x2d\\x58\\x6a\\x84\\xc6\\x74\\x81\\xd1\\x90\\x2c\\x26\\x1b\\x3f\\x97\\xdc\\x30\\xb1\\x84\\x61\\x9d\\xf9\\xfd\\xfc\\x7a\\x32\\x9d\\x06\\x1a\\x41\\xdf\\x33\\x22\\x02\\x13\\x3d\\x8e\\xae\\xed\\xdb\\x4c\\xfc\\xee\\x53\\x53\\x6e\\x07\\xaa\\xd1\\x15\\x53\\xdc\\xf5\\xed\\x1e\\x94\\x9d\\x45\\x35\\x5f\\x9e\\xf4\\x2c\\x78\\x32\\xb0\\xde\\x7c\\x2f\\x15\\x26\\xfb\\xef\\x86\\xb6\\x36\\x49\\xb6\\xb8\\x5a\\xe5\\xca\\x86\\xf0\\xce\\xa6\\xdf\\x9c\\x12\\x6c\\x1d\\x79\\x48\\x9c\\xc3\\xbf\\xc6\\xe8\\xbf\\x03\\x46\\xeb\\x30\\xd0\\x16\\x43\\xc0\\x10\\x15\\x0c\\x5c\\x8d\\x0e\\xb5\\x01\\x0a\\x46\\x11\\x22\\x15\\x13\\x79\\x91\\x08\\x5e\\x57\\x49\\x3b\\x22\\xe8\\x35\\x26\\xb7\\xb1\\x72\\xc6\\xc7\\x34\\x1c\\x40\\x32\\x1e\\x9c\\xeb\\x7c\\x82\\xbf\\xba\\xa4\\x8f\\x3b\\xd8\\xf5\\x13\\x72\\xd9\\x6d\\x47\\x44\\x4f\\xf0\\xd8\\xbb\\x2e\\x5f\\xd2\\x65\\x14\\xeb\\x63\\x91\\x05\\xe3\\x38\\x95\\xfd\\xc4\\x1f\\x6d\\xf1\\xfb\\xfd\\xcb\\x08\\x46\\x6e\\xc2\\xd2\\x17\\xfc\\x99\\xfb\\x01\\x2f\\xe6\\x54\\x0c\\x0c\\x5a\\x59\\x66\\xed\\x3e\\x66\\xfa\\xb1\\x20\\x2a\\xb9\\xda\\xff\\xe8\\xe2\\x7e\\x8f\\x74\\x62\\x82\\x8d\\x66\\x26\\x59\\xea\\x3b\\x2c\\x60\\x8c\\xf6\\x8e\\x30\\xdb\\xac\\x62\\xff\\xd8\\x22\\x9f\\x4a\\x53\\xf5\\x9a\\xe1\\x68\\x33\\xb8\\x1a\\x15\\x91\\x61\\xf1\\x93\\x69\\xf6\\x0f\\x51\\xc4\\x3a\\x21\\x7e\\xfc\\x5e\\xfd\\x6a\\xb7\\xa9\\x1f\\xe2\\x49\\xc7\\xb8\\xa0\\xc1\\x4e\\x9f\\xae\\xa5\\x33\\xde\\x13\\x38\\x49\\xa9\\x24\\x47\\x67\\x6f\\x6c\\xc1\\x8b\\xef\\x4f\\xec\\x7f\\x37\\x31\\x97\\x59\\xce\\x80\\xea\\x3e\\xac\\x18\\xfa\\x2d\\x9f\\xa0\\x23\\x09\\xe1\\xce\\x93\\xac\\x6c\\xf4\\xcd\\x2c\\xb2\\xc9\\x5f\\x1e\\x2a\\xff\\x7b\\x2a\\x88\\x56\\x40\\x5a\\x7b\\x8e\\xba\\xbe\\xb4\\x90\\x6d\\x9b\\x97\\x34\\xda\\x9f\\xb5\\xe5\\xd3\\xf3\\x22\\xbb\\x5b\\x55\\x9f\\xa6\\x1e\\xc8\\xf5\\x15\\xdb\\x90\\x65\\xab\\x4b\\x91\\xa7\\xa3\\x1d\\x5c\\x62\\x50\\x61\\xc2\\xfd\\x2b\\xcf\\xe1\\x7f\\x94\\xbb\\xde\\x47\\x76\\x30\\x2b\\x8a\\xef\\x3d\\x5b\\x52\\xdb\\x3b\\xc7\\x3a\\xe4\\xa3\\x0c\\xc4\\x41\\x7a\\xcb\"},\n{{0x71,0x19,0x36,0x40,0xa0,0xa2,0xb2,0x2f,0xb2,0x2d,0x00,0xa8,0x0b,0x33,0xa5,0x51,0x4f,0x3d,0x10,0x00,0x03,0x4f,0xcc,0xd8,0x85,0xd8,0xea,0x86,0x38,0xf0,0xb0,0xf8,},{0xb1,0xd3,0x6f,0x72,0x3b,0x70,0x86,0xd9,0x23,0x11,0x9f,0x46,0x75,0x9b,0x39,0xfa,0x1e,0x40,0x38,0xc6,0x41,0x8c,0x37,0x9b,0xa9,0x8b,0x58,0x40,0xc7,0xea,0x50,0x68,},{0xa9,0x70,0x2a,0x33,0x95,0xac,0xd2,0x0d,0x75,0x43,0x73,0x09,0x5d,0xc6,0x14,0x45,0x58,0x4d,0x8e,0x57,0x10,0x80,0xe1,0x79,0xad,0xcb,0xa3,0x10,0x6b,0xb0,0x6a,0x7c,0xe4,0xd4,0x60,0xf1,0x26,0x1a,0xef,0x86,0x43,0xab,0x16,0x34,0xf4,0x7c,0x94,0x14,0xa3,0x2e,0x18,0x3a,0x32,0x76,0x91,0xe6,0x58,0x43,0xdd,0x6c,0x05,0x50,0x72,0x07,},\"\\xe0\\x28\\x79\\x48\\xbb\\x85\\xa3\\x98\\xe6\\xaf\\xfa\\x2d\\x25\\xfc\\xff\\x8b\\xdb\\x93\\x26\\xf5\\xd1\\x4f\\xde\\xb6\\x05\\x49\\xf5\\xfb\\xf0\\xc1\\x81\\x6f\\x11\\xcb\\xdd\\x4e\\x90\\xfe\\xa0\\x39\\xdc\\xa6\\x0f\\xaa\\xd1\\x69\\x60\\x03\\xf9\\x15\\x15\\xc9\\xb2\\x72\\x88\\x2c\\x95\\xc9\\xa4\\xab\\x6e\\x27\\x77\\xbd\\x92\\x7e\\x7d\\x84\\x42\\xae\\xa6\\xce\\xa6\\x19\\xc9\\xb1\\x52\\x55\\xfe\\xd6\\x12\\xb5\\xcc\\x31\\x58\\xfc\\x70\\x5b\\xb7\\xa5\\x06\\xf4\\xaf\\xec\\xf4\\xe3\\x4e\\xd5\\x17\\xb2\\xc1\\x2b\\x83\\x62\\x61\\x0e\\x5e\\xa2\\x70\\x48\\x5c\\xcc\\xb3\\xc9\\xaa\\x97\\xec\\xd6\\xcb\\x19\\x63\\x09\\x00\\xf0\\x7d\\x94\\xcb\\x29\\x3c\\xb6\\xe0\\x89\\xa9\\xa7\\x7c\\x01\\x94\\x07\\x3a\\x7f\\x71\\x77\\xb0\\x23\\x0d\\x25\\x76\\x3a\\x2e\\xf9\\x8d\\x47\\x70\\x4c\\xb2\\xc3\\xaf\\x4c\\x3c\\x1b\\x49\\x56\\x31\\xb4\\xa5\\xb2\\x1b\\x2e\\x56\\xbf\\xf2\\xed\\xe0\\x3e\\xa4\\xfe\\x7c\\xf8\\x29\\x17\\x34\\x7e\\x3a\\x9d\\x4d\\xbe\\xef\\x37\\xd1\\xcf\\x17\\x61\\x5a\\xda\\xa0\\xfd\\x17\\x05\\x79\\x69\\x91\\x7d\\x47\\x8d\\x03\\xcc\\xd8\\xf8\\xb8\\x8e\\x5e\\x5a\\xca\\xe6\\x73\\x2a\\x81\\x61\\xdf\\xb5\\xf7\\xd0\\x21\\x23\\xc8\\xd5\\xa5\\x65\\xcf\\x4d\\xd9\\x8d\\xfc\\x9a\\xaf\\x5a\\x33\\x50\\x58\\xa9\\x41\\xca\\x43\\x07\\x3f\\x26\\x59\\x61\\x5a\\x72\\xfe\\x78\\xc1\\x01\\xc4\\x1a\\xed\\x07\\xf3\\xbc\\xf9\\x80\\xb0\\xa5\\xb3\\xfb\\xaf\\xdb\\xbe\\xa9\\x2f\\xd8\\x89\\xcf\\xd5\\x3d\\x40\\x32\\x78\\xbc\\x15\\xa5\\x9a\\xa1\\x40\\xc2\\xd7\\x73\\xb8\\x88\\x9b\\x96\\x3d\\xce\\xa3\\x65\\x36\\x2e\\x42\\x6e\\xf4\\x60\\x98\\x45\\xc9\\xbc\\xe9\\xf8\\xae\\xb5\\x91\\xd1\\xa4\\x69\\xb0\\x72\\xb4\\x12\\x09\\xf5\\xa8\\xb6\\xdc\\x23\\x95\\xad\\x90\\x60\\xeb\\x2e\\x37\\x09\\x78\\xae\\x33\\x11\\xd1\\xcf\\x0a\\x8f\\x20\\x51\\x42\\xd4\\x36\\xba\\xb6\\xb9\\x59\\x43\\xa9\\x7c\\x23\\xe6\\x1b\\xd1\\x4b\\x2d\\x95\\x67\\x2c\\xb9\\x32\\x5e\\x9a\\xb1\\xfc\\x9e\\xee\\xaa\\xcc\\xd5\\x8b\\x9f\\x4a\\xc1\\x55\\x0b\\xde\\xc8\\x44\\x9b\\x03\\x60\\x39\\x49\\x6c\\x5f\\x07\\xa5\\xed\\x64\\xd5\\xd8\\x51\\x71\\x69\\x01\\x44\\xdb\\x5c\\x81\\xc8\\x1c\\xbc\\x4c\\x16\\x71\\x8d\\x52\\xc4\\xdf\\xd1\\x95\\x8c\\xa5\\xc9\\xc8\\xba\\x58\\x2c\\xd9\\xd7\\x06\\xf2\\x7a\\x74\\x74\\x4c\\x3a\\x05\\xbf\\x1c\\xcd\\x51\\xf1\\x09\\x20\\x10\\xd3\\x6f\\x15\\x78\\xb5\\x78\\xae\\x0e\\x9f\\xfa\\x47\\x07\\x90\\x55\\xef\\x94\\xfa\\xbc\\x9f\\xf7\\x2f\\x73\\x8b\\xef\\x68\\x46\\x1e\\xb3\\x40\\x4c\\xce\\xe9\\x53\\xf5\\xee\\x86\\x4c\\x97\\x4c\\xe7\\x0e\\x90\\x37\\xe3\\x38\\x8f\\xba\\xf2\\x88\\x9e\\x13\\x66\\xca\\xa0\\xf6\\x51\\xe2\\x1b\\x33\\x9e\\x3d\\x56\\xb9\\xd9\\x5a\\xc3\\x0b\\x35\\x92\\xa9\\x48\\x91\\x2c\\x90\\xbf\\x54\\x47\\x3c\\xeb\\xc4\\x67\\xb0\\x9a\\x39\\x43\\xdc\\xac\\x48\\x68\\xac\\xb5\\xb3\\x5e\\xa6\\x91\\xef\\xf4\\xd8\\xcc\\x1c\\xda\\x0c\\x6c\\x0a\\x9c\\x16\\x9a\\x4e\\xe1\\x00\\x41\\xf3\\x5f\\x43\\x3f\\xb5\\x3d\\x26\\x06\\x7b\\x29\\x10\\x56\\xb1\\xda\\x69\\xff\\x46\\xfb\\xea\\x1c\\xa7\\x21\\x36\\x59\\xa9\\x90\\xd5\\xd5\\xdf\\x14\\x06\\xb0\\x93\\xda\\x2a\\x33\\xc8\\xdf\\x95\\xab\\x3c\\xe8\\x11\\xaf\\xb9\\xc9\\x8c\\x5b\\xfd\\x7c\\x4e\\x98\\x1b\\x3e\\xa9\\x4e\\xef\\xd2\\xe2\\xfe\\x95\\x70\\x7d\\x89\\xf3\\x07\\xfa\\x76\\x82\\x8b\\x5c\\x67\\x74\\x95\\x0a\\xee\\x80\\x62\\x67\\x14\\x25\\x6e\\x19\\x7d\\xc7\\xda\\x97\\x21\\x58\\xc7\\x68\\xbb\\xee\\x7f\\xbd\\x16\\x9e\\xc1\\x5b\\x4b\\xb7\\xbe\\x72\\x97\\x6d\\xbe\\xd3\\xe5\\x12\\x76\\x6e\\xf2\\x2e\\xf3\\xb8\\x12\\xbc\\xac\\x4a\\xa3\\x11\\x5a\\xfe\\x83\\xd3\\x12\\x84\\xaf\\x8e\\xac\\xea\\x4e\\xe4\\x9a\\xfd\\x42\\xd9\\xc4\\x4f\\xff\\x2d\\x86\\x1c\\x08\\x62\\x9b\\x55\\xda\\xe0\\x0f\\xf6\\x74\\xfb\\x02\\x8e\\x73\\x8b\\x05\\xdc\\xb3\\x8a\\xea\\xa6\\x96\\x3c\\xc3\\xfa\\xaf\\xc7\\xb6\\x92\\x45\\xa2\\xa1\\x22\\xa9\\x6d\\xd2\\xf0\\x3a\\x82\\x4d\\x72\\xb0\\xfe\\x0d\\xd7\\x98\\xdf\\x5c\\x4b\\xb7\\x5a\\x87\\x32\\x4e\\x76\\x4a\\x50\\xa5\\xff\\x52\\x54\\x7a\\xda\\x8f\\x8f\\x88\\xe6\\xf3\\x8a\\xee\\x49\\xd5\\x8d\\xdb\\x01\\x26\\x48\\x85\\x4c\\xd5\\x9d\\x0e\\xc9\\x7b\\xc3\\xd5\\x8d\\x0a\\xd4\\x49\\x1f\\x08\\x59\\x07\\x67\\xce\\xb1\"},\n{{0xbf,0xc9,0x62,0x6c,0x91,0xf3,0x48,0xfd,0xaf,0x46,0x9d,0xef,0x23,0x02,0xe9,0xe3,0x8f,0x90,0x51,0xe7,0x34,0x9e,0x48,0xf8,0x50,0xcf,0x35,0x2a,0x83,0x31,0xa2,0x8b,},{0x4e,0x81,0x93,0x06,0x1c,0x9d,0x65,0xa8,0x2b,0xcb,0x25,0xda,0x08,0x9b,0x4a,0x80,0xba,0x41,0xb3,0xdd,0x2f,0x8e,0xd1,0xdc,0x81,0xe1,0xcf,0xd0,0x3c,0x84,0x91,0x15,},{0x66,0x02,0x42,0xc1,0xdc,0xf3,0x29,0x13,0x69,0xc6,0x5c,0x9d,0x7f,0x89,0x87,0x2e,0xab,0x48,0x22,0x00,0xe3,0x44,0xb2,0x96,0xe3,0x36,0xa0,0xa2,0xe6,0x31,0xfa,0x79,0x60,0x24,0xb6,0xe1,0x11,0x9c,0x27,0xd5,0x22,0x64,0xa4,0x98,0x15,0xdd,0x78,0x19,0x27,0xa7,0xdf,0x46,0x7e,0x88,0xb8,0x01,0xe6,0x84,0xfc,0x60,0x22,0x96,0x25,0x0e,},\"\\x2f\\x11\\xf4\\x0b\\x2a\\x19\\xf6\\x40\\xc0\\x04\\x4c\\x7b\\x13\\x96\\x80\\xc3\\xc3\\xb6\\x9f\\x00\\xff\\x9f\\x6a\\x41\\x86\\xfd\\x7d\\xed\\x56\\x9c\\x1d\\x8c\\x57\\x20\\xf1\\x9d\\xd3\\x5c\\x78\\x16\\xd0\\x8a\\x94\\xc0\\x82\\x04\\xe4\\x76\\x43\\xe2\\x64\\xd4\\x25\\xe2\\x1c\\xef\\xb8\\x31\\x29\\xc9\\x09\\xa3\\xd7\\x8c\\xaf\\x72\\xc4\\x6b\\xf1\\xa7\\x29\\x76\\x5e\\xf4\\xb8\\xca\\x80\\x3f\\xda\\xf8\\x05\\x2f\\xfc\\x6c\\xc4\\xa6\\xb5\\x79\\xa1\\x60\\xb7\\x03\\xb1\\x53\\x55\\xc6\\xfc\\xd3\\xb9\\xa2\\xec\\xbc\\x26\\x7e\\x60\\xdd\\x59\\xf6\\xa2\\xb1\\x94\\x20\\xe5\\x57\\x27\\xa8\\x0b\\x0b\\xb6\\x41\\x67\\xc8\\x3b\\xa0\\xc8\\x05\\xde\\xed\\x49\\x1d\\x93\\xe7\\x23\\xf3\\xb4\\x32\\x63\\xd1\\x74\\x20\\xb8\\x5b\\xe8\\x6c\\x16\\x5c\\x55\\x27\\x79\\xdb\\x96\\x0e\\x0a\\xa9\\xeb\\x4d\\x9f\\x3a\\x16\\x4a\\x5a\\x21\\xfa\\xb3\\xf5\\x09\\xa8\\xf0\\x19\\x9a\\x69\\x43\\xc4\\xb2\\x23\\xcf\\x9d\\xac\\xa7\\xe1\\x10\\xe0\\x56\\xa8\\x1d\\x9c\\xe0\\xe0\\xc0\\x2a\\xc2\\x65\\xee\\xac\\x05\\xec\\xd8\\x44\\x48\\x46\\x8a\\x4d\\x12\\x2b\\x87\\xa3\\xe0\\x4c\\x28\\x37\\xe4\\x3d\\x21\\x27\\x04\\xfd\\x41\\xe7\\xf3\\xd1\\x98\\xa2\\xe7\\x6b\\xec\\xa0\\xe7\\x02\\x9c\\x43\\x2a\\x06\\x54\\xec\\xd4\\x4f\\x98\\x4c\\x5d\\xf0\\x67\\x41\\x96\\x4d\\x83\\x72\\xc8\\x6e\\x16\\x2a\\x8c\\x54\\x18\\x84\\x9b\\x41\\xe5\\x71\\xfe\\xb8\\x3e\\xb4\\x2f\\xbb\\xcd\\xdb\\x8a\\x08\\x21\\x43\\x90\\x9e\\xaa\\x50\\x12\\xb9\\x79\\x93\\x1d\\xc7\\xe3\\xcc\\xcb\\x44\\xc7\\x91\\xe0\\x4b\\x80\\x65\\xee\\x63\\xf0\\x56\\x1d\\xa1\\xbb\\xf3\\x7b\\xf6\\x50\\x34\\x77\\x87\\x9c\\xfb\\xaf\\x6d\\x9d\\x7d\\x9a\\x74\\x75\\x55\\x3f\\x53\\x53\\x5f\\x84\\x7a\\x76\\xdc\\x3b\\x2b\\x7a\\x3d\\x1d\\x47\\x0b\\xbe\\x17\\x12\\x4a\\x88\\xe0\\x3f\\xe9\\x94\\xba\\x10\\xc2\\x42\\x21\\xe3\\x9e\\x3d\\x0f\\xf5\\x3c\\x79\\xe2\\xfa\\xaf\\xa1\\x90\\x12\\xd5\\xef\\x19\\x2b\\xc6\\xd5\\x26\\x0b\\x66\\xf9\\x97\\xb6\\x44\\xcf\\x48\\xd9\\x9f\\x38\\x99\\xd7\\xc4\\x85\\xe6\\x84\\xaa\\x1e\\x6e\\x30\\x85\\x5c\\xf7\\x5c\\x2d\\x80\\xc7\\xa3\\xee\\x43\\x54\\xfe\\x13\\xc6\\x76\\x09\\x1c\\x86\\x67\\x37\\x3d\\x30\\xe6\\x0f\\xf8\\xe0\\x9f\\xed\\xef\\x17\\x5a\\x1a\\x87\\x39\\x5f\\xef\\xa0\\x72\\x2b\\xf6\\xc0\\x1c\\x65\\x55\\xcf\\xf0\\x68\\x89\\x2a\\xfe\\x94\\x86\\xcb\\x1f\\xcc\\x5f\\xb6\\x64\\x1e\\x82\\xd8\\x70\\x79\\xba\\x5d\\x7a\\x9c\\x13\\x93\\x55\\xd6\\xc1\\x4c\\x50\\x7d\\xbd\\x59\\x47\\x24\\xb5\\x53\\x51\\x10\\x09\\x65\\xbe\\x9e\\x5d\\xbf\\xa7\\x70\\x88\\x78\\xc4\\xb2\\x9f\\x4d\\x54\\xc2\\x17\\x74\\x6e\\x32\\x6a\\xb2\\xa5\\x4f\\x99\\xb8\\x81\\xd7\\xda\\x5b\\x11\\xed\\xb0\\x8a\\x6d\\x79\\xd8\\x85\\x69\\x1b\\x1f\\x70\\x85\\x51\\x73\\x10\\xb3\\x09\\xcf\\x9b\\x1b\\x71\\x4a\\xab\\xc5\\xc1\\x7a\\x50\\x9b\\x14\\x0b\\x89\\xb3\\xf9\\xdc\\xee\\x50\\xca\\xb4\\x41\\xbf\\x5a\\xd3\\xbb\\xc2\\x99\\x90\\xf6\\x27\\x40\\x61\\x70\\xa7\\xa1\\x0f\\x2d\\x47\\xdf\\xc9\\x25\\x61\\x54\\xf9\\x62\\x30\\x8e\\x76\\x9a\\x2a\\xb1\\xb2\\xa0\\x0e\\x27\\xe3\\x27\\xf0\\xd1\\xfa\\x16\\x4d\\x1e\\x38\\xea\\xd5\\xce\\xaa\\xe2\\x38\\xba\\x52\\x6f\\x54\\xb8\\x1b\\x45\\xde\\xa6\\xc8\\x97\\x41\\x86\\xb1\\xb6\\x72\\x5f\\xa4\\xc8\\x3e\\x62\\xf3\\xe2\\x54\\xf7\\x29\\x87\\x1b\\xda\\x4d\\xc4\\x44\\xbc\\xe7\\x8f\\x09\\x03\\xfa\\x31\\x8e\\xaa\\xc8\\x22\\xa9\\x55\\x32\\xab\\x01\\x9e\\x9c\\xfc\\x56\\x19\\xe2\\xc2\\x06\\x7f\\x25\\x8f\\x43\\x75\\xd2\\xe0\\x22\\x2e\\xa5\\xbf\\x96\\xa2\\x53\\xa2\\xa3\\xfa\\x9e\\xea\\x02\\xc3\\xee\\xcc\\xb0\\x28\\xc7\\x6b\\xc6\\x0d\\x38\\x29\\x8b\\x95\\xb9\\xaf\\xe6\\x60\\x31\\xb1\\xa2\\xa2\\x61\\x52\\xfd\\xaa\\x7e\\xf4\\xf8\\x37\\xab\\xb5\\x11\\x85\\xdf\\x8b\\x2e\\xf8\\x5a\\xd2\\xc9\\xbe\\x6d\\xfb\\xa7\\x5e\\x37\\xdc\\x7d\\x12\\xe1\\x78\\x7f\\xc5\\x5f\\x86\\x6f\\xd0\\x66\\xf1\\x22\\x91\\xdf\\xf1\\x97\\x6a\\xfc\\x10\\xda\\x91\\x31\\x01\\xe7\\x04\\x95\\xd8\\x78\\x33\\x48\\xd6\\x11\\xb0\\x11\\xec\\x67\\x1c\\x0d\\xa7\\x37\\xbf\\x96\\x2c\\xdc\\xc9\\xe4\\xa8\\x00\\xb5\\x13\\x93\\x5a\\x56\\xd0\\x84\\xea\\x64\\xa7\\xd4\\xe8\\xe9\\x9e\\xe9\\x44\\x0a\\x73\\x61\\x32\\xe4\\x2c\\x90\\x95\\x03\\xc2\\x22\\x4a\\x14\\x1b\\x25\\xce\"},\n{{0x39,0x3b,0x76,0x94,0x82,0x37,0x5b,0x82,0x14,0x27,0xa6,0x6d,0x16,0xe4,0xf5,0x51,0x85,0xb7,0xa3,0xb7,0x33,0x8f,0x1a,0x06,0xf6,0x7c,0xdf,0xa7,0xe3,0x5c,0x54,0x1c,},{0x84,0xaf,0xd7,0x06,0x78,0xff,0xa8,0x5a,0x9f,0x65,0x74,0xcb,0xcf,0xe3,0xb1,0x5d,0x04,0xa9,0xfd,0x15,0x01,0x6f,0xf8,0x55,0x0a,0x98,0x7c,0x4b,0x95,0x1c,0x71,0x22,},{0x31,0xf9,0x8c,0x0a,0x08,0xfd,0xa8,0xe7,0x35,0xb5,0x73,0x66,0xaa,0x1b,0x83,0xb9,0x3d,0xae,0x63,0xb5,0x81,0x0c,0x82,0x1d,0x99,0xcb,0x39,0xdf,0x52,0x1f,0xea,0xc0,0x7f,0x3c,0x41,0x0b,0x27,0xba,0x33,0x07,0x75,0x7d,0x60,0x49,0xf2,0x24,0x54,0xfb,0x6d,0xe9,0xe2,0xc3,0xc2,0x43,0x8d,0x68,0x31,0x90,0x97,0xd1,0x12,0xcf,0xdb,0x07,},\"\\x8a\\xe8\\x05\\x3e\\x03\\xbe\\xbe\\xae\\x54\\x40\\x43\\xb8\\x41\\x4b\\x38\\x53\\x64\\xad\\xd1\\x67\\x37\\x37\\xcf\\x8a\\xb2\\x01\\x93\\xd4\\xaa\\xbc\\x8a\\x78\\xe1\\xd6\\x9b\\x9c\\x7e\\x52\\x72\\x9e\\x69\\x30\\x78\\x06\\xe9\\x27\\xce\\x38\\x07\\xb0\\x7c\\x68\\xc8\\x33\\xc4\\xfc\\xf1\\x6d\\xb1\\x5e\\x7d\\xce\\x60\\x4d\\x17\\x98\\x91\\x5f\\xd4\\x21\\x16\\x89\\xb4\\x86\\x46\\x42\\x50\\x2d\\x38\\xe9\\x1b\\x19\\x97\\xb7\\x18\\x23\\x31\\x8b\\x69\\xab\\xe5\\xbe\\xd6\\xf5\\xe3\\x01\\x5b\\xfb\\x22\\xdf\\x30\\xdb\\x37\\x1f\\x22\\x60\\xc5\\xc2\\x2e\\xba\\x60\\xdf\\x39\\xb3\\xed\\xd3\\xc4\\xd7\\xa1\\xe1\\x11\\xcd\\x9b\\x8a\\xa4\\x6f\\x67\\xbd\\x0c\\xf3\\xa7\\x17\\xaf\\x06\\xec\\x0c\\xe5\\x67\\x02\\x8e\\x06\\xe4\\x79\\x79\\x34\\xad\\x69\\xb1\\xf5\\xbe\\x44\\x0f\\xf3\\x7a\\x8a\\x03\\x4b\\x15\\x33\\xfa\\x94\\x64\\x24\\xac\\x59\\x54\\x00\\xad\\x27\\xd3\\xbe\\x76\\xdc\\x89\\xba\\x9d\\x6c\\x49\\x93\\x9a\\x09\\xf2\\xe4\\x01\\xc8\\xf2\\x0f\\x7f\\x7b\\x4b\\x9e\\x63\\xb9\\xd5\\x52\\x01\\x53\\x4a\\xb4\\xcc\\x7b\\xe8\\x85\\xf0\\x43\\x2a\\x2c\\x66\\x73\\xd2\\xe7\\x65\\x19\\x4d\\xff\\xd9\\xb6\\x09\\x6d\\xd2\\xb2\\x84\\x39\\x18\\x75\\x09\\x59\\xa8\\xdd\\xe4\\xa3\\xab\\x40\\x7e\\xb2\\xf7\\xe1\\xa4\\x9c\\x25\\x97\\xe3\\x08\\x05\\xf8\\x48\\x0d\\xd0\\xcc\\x82\\x72\\xa3\\x20\\xc0\\x0a\\xa2\\xb2\\x10\\xf5\\x76\\xe4\\x25\\x77\\xd3\\xaa\\x41\\x97\\x03\\x69\\x7c\\xa4\\x06\\xd4\\x3a\\x1a\\x4f\\x99\\xb0\\x73\\x36\\x64\\xf6\\xd6\\xb2\\x40\\x3c\\xba\\x1b\\xdc\\xc5\\x1f\\x54\\x1c\\xf2\\x42\\x36\\x07\\x05\\x70\\x54\\x07\\x55\\xc7\\xa8\\x63\\x1f\\xcc\\x2f\\x18\\x93\\x8f\\xa1\\x1b\\xc2\\x91\\x15\\x5b\\x39\\xd7\\xa7\\x62\\xa1\\xff\\x4d\\xca\\x97\\xb4\\x48\\xf7\\x0e\\x2d\\x3d\\xe4\\x47\\xcb\\x08\\xf9\\x18\\xea\\x20\\xcb\\x43\\x3f\\xa1\\x15\\xe3\\x08\\x80\\xc9\\x6c\\x8c\\xf5\\xf0\\xeb\\xbc\\xf4\\x82\\x30\\x9d\\xb6\\xdc\\x1f\\xb6\\x4e\\x17\\xc0\\x4d\\x7c\\xdf\\x7a\\x90\\xf4\\x01\\x4d\\x15\\xae\\x76\\x96\\xb4\\x44\\x23\\xb0\\xba\\x08\\x4e\\xed\\x4d\\x3f\\xb2\\x8c\\x1e\\xfb\\x39\\x82\\x8a\\xca\\x2f\\x40\\xca\\x6d\\xf3\\x42\\xc2\\x0e\\x95\\xf8\\x00\\x6b\\x27\\x67\\xa8\\x3f\\x50\\xc3\\x1f\\xcc\\x15\\x81\\xa0\\x97\\x53\\xe7\\x82\\x91\\xf0\\xd9\\x93\\x1d\\x99\\x2a\\xd3\\x60\\x44\\x73\\xce\\xb8\\x85\\xec\\xbe\\x78\\x57\\xcc\\x52\\xad\\x55\\x85\\x33\\x4d\\x14\\x85\\xd0\\x22\\xe1\\x06\\xb7\\x1c\\x29\\xbd\\xfc\\xf2\\x3e\\xe8\\xa4\\x75\\xdf\\x2c\\x09\\x05\\x32\\x35\\x6a\\x6f\\xfc\\x02\\x23\\x23\\x17\\x98\\x8a\\x2c\\xbc\\xfb\\xc2\\xa3\\x6b\\x4b\\x48\\x3c\\xb4\\x45\\x10\\xe8\\x55\\x99\\xb6\\x12\\x59\\x6b\\x62\\x65\\x72\\xb0\\x99\\x6d\\x8a\\x61\\xc0\\xee\\x3e\\xff\\xf1\\xf7\\xc7\\x1c\\x05\\xfb\\x5a\\x8d\\x8c\\x5d\\x09\\xd9\\x24\\xeb\\xaa\\xc8\\x80\\x04\\x51\\xc9\\xdb\\x24\\x56\\x71\\x0a\\x27\\x9d\\xfe\\x2d\\x22\\xf6\\xae\\xa9\\xde\\x31\\x80\\x1d\\xc7\\x42\\x53\\x43\\x62\\xb0\\xe8\\x10\\xe9\\x9e\\x84\\x1d\\xbb\\x7f\\x0c\\xf9\\xaf\\x1a\\xef\\x54\\x2a\\x52\\xc7\\x76\\xcc\\x51\\xf2\\x87\\x36\\x8f\\xbe\\x6a\\xd6\\x51\\xfa\\xd5\\x78\\x7e\\xf7\\x7c\\x73\\x53\\x5f\\x3d\\xfb\\x36\\x18\\xcc\\x8f\\x0d\\xbb\\x54\\x9d\\xdc\\xa9\\xb9\\xbf\\x91\\x13\\x5a\\x34\\x56\\x00\\x1a\\x46\\x21\\x5a\\xde\\x38\\x8e\\x7c\\xeb\\x9f\\xcd\\xfd\\x0d\\x2d\\x0a\\x03\\x56\\xaf\\xbe\\x2c\\xec\\x1c\\x2e\\x78\\xb4\\xd9\\x98\\xd4\\x55\\x4f\\x46\\x21\\xf1\\x15\\x1d\\xd3\\xff\\xd3\\xba\\x4c\\x0b\\xc8\\x52\\xf3\\x11\\x75\\x8c\\x5d\\xca\\x42\\x5d\\x18\\xba\\x15\\xa8\\xd6\\x7c\\xa4\\x01\\xd0\\xe6\\xcf\\x28\\x0c\\xb8\\x83\\x84\\xa2\\xda\\xd4\\x9f\\xae\\x39\\xba\\x2a\\x77\\xb4\\x67\\xb3\\x23\\x8a\\xa2\\x8c\\xfd\\x13\\x7e\\x5c\\x5c\\x0f\\xf9\\x00\\x0f\\x8b\\x06\\xa2\\x19\\x2e\\x16\\x29\\x20\\x69\\x22\\x65\\xdb\\x24\\xab\\x6a\\xed\\xe5\\x35\\xe3\\x1c\\x20\\x93\\xbe\\x57\\xeb\\xf8\\x80\\x5d\\xf1\\x78\\x89\\x14\\xf3\\xa8\\x84\\xf8\\x84\\x17\\x90\\x15\\x80\\x8d\\xb4\\xd3\\x02\\x0f\\x3e\\x78\\xbc\\x34\\x28\\x5d\\x23\\x37\\x62\\xe8\\x99\\xeb\\xff\\x28\\x42\\x82\\x15\\xe2\\x44\\x40\\x4d\\xe2\\x91\\x72\\x8f\\xbf\\x41\\x24\\xce\\x5b\\x24\\x35\\x26\\x0a\\x8e\\x34\\x11\\x80\\x07\\x5a\\x56\\x51\\xe6\"},\n{{0x26,0xcb,0xc2,0x51,0x0e,0xe6,0xea,0x39,0x0a,0x2c,0xb9,0x48,0xa0,0x15,0xd1,0x31,0xab,0xf4,0xc0,0x95,0x49,0x15,0x62,0x0b,0x78,0x16,0xae,0xcf,0x4e,0x11,0xda,0x6d,},{0x14,0x5e,0x8d,0xd2,0x2b,0x44,0x00,0x28,0x9d,0xaf,0xb6,0x26,0xd9,0x5a,0x94,0xc2,0xf3,0xb6,0x9c,0x65,0x19,0x77,0x17,0xcb,0xdc,0xd8,0x50,0x98,0xc5,0x49,0x21,0x07,},{0x67,0x10,0xd0,0xdd,0x00,0x54,0x5b,0x44,0x4c,0xf7,0x14,0xb7,0x91,0x44,0xfe,0x79,0xf3,0x8c,0xb1,0xc0,0xf5,0xb7,0x42,0x48,0xd4,0xf0,0x1f,0xe3,0x60,0x11,0x7a,0x26,0xff,0xed,0x4a,0x3b,0xf2,0x13,0x23,0xb2,0x8a,0x39,0x3a,0xe9,0xde,0xe0,0x7d,0x69,0xe5,0x83,0xe3,0x16,0xc6,0xa5,0x73,0xd3,0x7c,0x64,0x4a,0x8d,0x62,0xc4,0x05,0x06,},\"\\x9c\\xeb\\xe2\\x4b\\x4f\\x8a\\xde\\x86\\x43\\x0e\\x27\\x9a\\x3c\\x43\\x3e\\x4a\\xe1\\x7e\\x00\\x88\\x52\\xa2\\x4f\\x08\\x69\\x0c\\xbc\\x3d\\x75\\xe3\\xb7\\xf2\\x00\\xda\\x89\\x7c\\x25\\xf7\\x48\\x3b\\x37\\x63\\x7d\\x4b\\xc1\\x10\\x08\\xd9\\x22\\x4c\\xd5\\x81\\xfb\\xc0\\x38\\xad\\xad\\xa0\\x2d\\x27\\x1e\\xd2\\xa5\\xd2\\x85\\xd8\\x43\\xa0\\xf8\\xb7\\x9e\\x37\\x94\\x5d\\xc3\\x5b\\xc2\\x64\\xbe\\xcd\\x80\\x43\\x07\\xe1\\xd4\\x42\\x18\\xa6\\x43\\xe4\\xb5\\x9a\\x93\\x11\\xde\\x98\\x5d\\x24\\xb4\\xc2\\x6f\\xb1\\x46\\x03\\xbe\\x5d\\xba\\x18\\x39\\xee\\x0c\\x8d\\x2e\\xde\\x6c\\xb5\\x0a\\xf6\\x7c\\x80\\x45\\x19\\x03\\x7b\\x1b\\x16\\x63\\x31\\x8c\\xfc\\x6e\\x75\\xd0\\xf0\\x51\\xdb\\xb5\\xd3\\xea\\xf3\\xaa\\xd1\\xf7\\x8e\\xf0\\xcf\\xf4\\x8d\\x5c\\x55\\xb2\\xfd\\x25\\xdb\\x15\\x39\\xd0\\xf0\\x2d\\xae\\x9f\\x25\\x14\\x8a\\x8d\\x33\\x8b\\x97\\x87\\x9b\\xbd\\x39\\xdf\\x96\\x1a\\xa2\\xc3\\x96\\x31\\x5a\\x2a\\x86\\xcc\\x78\\x35\\x81\\xe6\\x7e\\xa8\\x44\\xac\\xfe\\x86\\x45\\x42\\x8a\\x27\\xb8\\xd3\\x2e\\xa3\\x06\\x4e\\x3b\\xf6\\x2d\\xcf\\x58\\x01\\x0e\\xc4\\x34\\x88\\x62\\xfa\\xc2\\x5e\\x3d\\x9f\\xcd\\x4e\\x5d\\x65\\xbe\\x59\\x90\\x5d\\x81\\x6d\\xfb\\x96\\x49\\x92\\xba\\x7a\\xce\\xef\\x8c\\x20\\x75\\xa3\\x12\\xe5\\xff\\xc4\\xf9\\x53\\x0e\\xa2\\x0f\\x77\\xf9\\x3e\\x81\\xcf\\x8a\\x01\\x9d\\xc3\\x94\\x56\\x34\\x36\\x4b\\xab\\xf7\\x97\\x72\\x04\\x5a\\x0d\\xba\\xa7\\x7c\\x47\\xa2\\x2b\\x77\\x22\\x3b\\x70\\x4d\\xeb\\xd2\\xd0\\x03\\xf6\\xa5\\xc7\\xbf\\x6b\\x19\\xcd\\x2c\\x49\\xb6\\x14\\xfd\\x4d\\x47\\xfd\\x25\\x1f\\xe6\\x22\\xcb\\x98\\x17\\x85\\xc1\\x46\\xbd\\xb7\\xc1\\xd2\\xea\\x02\\xb1\\x16\\x92\\x3b\\xf9\\x8a\\x1a\\xfb\\xb7\\x85\\x8a\\xdf\\x2d\\xf9\\x38\\xa7\\x90\\xec\\x1f\\x90\\x74\\xad\\xb8\\xd1\\xaf\\xb5\\x63\\x3f\\xa9\\x61\\xa8\\x47\\x64\\x01\\x0d\\x3b\\xde\\xd1\\xc0\\x33\\xd2\\x5a\\xbd\\xb4\\xb0\\x0f\\xb0\\x5e\\xd7\\x64\\x0f\\xae\\x61\\x87\\x9d\\xf8\\x8f\\x0b\\x09\\xe3\\xab\\xd0\\x57\\xb9\\xa5\\x21\\x08\\xa9\\xbc\\x98\\x5f\\xb7\\x3a\\x5f\\x29\\xd8\\x4d\\x1c\\xa6\\x92\\x1b\\x62\\xf1\\xb7\\x03\\xc7\\xee\\xb4\\x81\\x5d\\x9d\\xd6\\xd0\\x66\\x73\\x8d\\xb1\\x18\\xba\\xf6\\x1b\\x04\\x22\\xf3\\x88\\xf1\\xbf\\xc9\\xe3\\xa9\\xbe\\xd8\\x3a\\x1a\\x72\\x7d\\xcc\\x26\\x6a\\x99\\x88\\x36\\x48\\x46\\x80\\x7f\\x4d\\x55\\x18\\xbc\\x2e\\xdd\\x0e\\xcb\\x34\\x13\\xc2\\x6f\\xd0\\xc7\\x9b\\x75\\xd8\\xcb\\x5b\\xcd\\x85\\xc0\\x6f\\xcc\\xea\\x4d\\x03\\xfb\\x89\\x88\\xdf\\xf3\\xed\\x0c\\xc9\\xdb\\xae\\x78\\xd6\\xae\\x8d\\x5f\\xc4\\x02\\x46\\x17\\xa2\\x3f\\x52\\xbd\\x61\\x53\\x85\\xd4\\xee\\xe0\\x8f\\x91\\x34\\xeb\\x3b\\x25\\x0c\\x8f\\x82\\x2b\\x47\\xd9\\x1e\\x8c\\x4d\\x4c\\x29\\x29\\x80\\x16\\xe6\\xfc\\x81\\xf1\\xf1\\x09\\x92\\x53\\xd7\\x94\\x5e\\x07\\x98\\x95\\x5d\\xa0\\xdd\\xe1\\x4e\\xbb\\x93\\x4e\\xcf\\xae\\xea\\xba\\xe8\\x78\\x83\\xe1\\xcc\\x39\\x80\\x67\\x40\\x0f\\xe4\\x62\\xa2\\xc4\\xe9\\xf2\\x32\\xdb\\x5c\\xdd\\x61\\xeb\\xa9\\x49\\x18\\x8c\\xf0\\x1b\\x23\\x8b\\xe7\\xad\\xa9\\x38\\xf0\\x02\\xdc\\x3a\\xe3\\x1f\\xdf\\xd4\\x25\\xc8\\xd4\\x6e\\xa0\\x32\\x32\\x3a\\xaf\\x20\\xdd\\x3d\\xe2\\x50\\x7d\\x36\\xbb\\x45\\xfb\\xb9\\x1c\\x40\\x96\\x9a\\x9e\\x5d\\xa2\\x0f\\x7f\\x93\\x6b\\x0f\\x4b\\x13\\x7b\\x62\\xfe\\x2b\\xa3\\xa6\\x67\\xbc\\x03\\x62\\xd9\\x3f\\xc5\\x0d\\x3f\\x22\\x95\\xe1\\x67\\xfc\\xba\\xb0\\xfb\\x3a\\x39\\xb7\\xcb\\x02\\x4b\\x57\\x8f\\x94\\x90\\xf7\\x34\\xb2\\x8c\\x9c\\xcf\\x71\\x92\\xf1\\x83\\x94\\x7d\\x5a\\x51\\x3e\\xfa\\x49\\x16\\xe4\\xd8\\x2b\\x2a\\xb4\\xba\\x7e\\xc2\\xff\\xba\\x21\\x3c\\xe8\\x2a\\xd6\\xed\\x3b\\x10\\xe4\\x85\\x53\\xe7\\x33\\xc9\\x40\\xaa\\x9b\\x9c\\xe7\\x13\\x37\\xc6\\xc2\\x80\\x5d\\xfb\\x8d\\xd6\\x61\\x8b\\x6d\\x40\\x90\\xa3\\xd6\\xcc\\x96\\x3e\\xce\\xa2\\x6d\\x1c\\xdc\\x2b\\xf5\\xac\\x99\\x9c\\x11\\x27\\x61\\x68\\xa9\\x31\\xd8\\x16\\x46\\x9d\\x79\\x08\\x3c\\x24\\x08\\x1a\\x50\\xdc\\xbd\\x22\\x27\\x52\\x38\\x52\\x67\\xce\\x1b\\xfc\\x1d\\xb7\\x6b\\x15\\x54\\xad\\x57\\xe3\\x47\\x52\\xb7\\xf8\\x98\\x31\\x47\\xc1\\x16\\xd4\\xa3\\xfa\\xe6\\xf6\\xd5\\x7e\\x65\\x4f\\xed\\xd7\\x37\\x8d\\x2b\\x49\\x89\\xea\"},\n{{0xb1,0xf5,0x9e,0x3c,0x23,0x80,0xd7,0xaa,0x41,0x4d,0x0b,0xf9,0x08,0x93,0xa3,0x8d,0xdd,0xfc,0x29,0x38,0x59,0x30,0x3d,0x16,0xf0,0x0d,0x9e,0xae,0x6c,0xb3,0x45,0x0e,},{0x84,0xe3,0xf5,0xf7,0x2f,0x19,0x09,0x5b,0x0f,0x53,0x38,0x48,0xa5,0xa9,0x1d,0x0f,0x07,0x43,0xb8,0xe3,0xa3,0xe2,0xf5,0x2f,0xcb,0xd7,0xeb,0xe7,0xc5,0xb5,0xa9,0x98,},{0x60,0xaf,0xc1,0xe9,0x91,0xfd,0xd2,0x7c,0xc4,0x72,0xb9,0xac,0xc9,0xd4,0x05,0xb4,0xd2,0xb9,0x13,0x08,0x92,0x90,0xb3,0x11,0xc4,0xfa,0x89,0x1a,0xe2,0xee,0xa0,0x56,0x71,0xfd,0xe7,0xa0,0xef,0x86,0x55,0x7b,0xd8,0x67,0xd1,0xc0,0xb7,0x47,0xca,0xf3,0x52,0x29,0xd6,0xef,0x52,0x8f,0xe3,0xe0,0xd0,0xbc,0xf6,0x30,0x38,0x0e,0xa9,0x0e,},\"\\xc6\\x17\\x4c\\x9a\\xd3\\x68\\x5d\\xd6\\x48\\x63\\x60\\x17\\x83\\x7b\\x8d\\x99\\x22\\x00\\x31\\x9e\\x9a\\x5a\\x0d\\x26\\xd9\\x4d\\x2d\\xa7\\x5e\\x2c\\x3a\\xff\\x46\\xf4\\x2d\\x7b\\x3a\\xba\\x47\\x2b\\x7f\\x86\\x0b\\x0f\\xe1\\xf6\\x95\\x52\\x97\\x31\\xfd\\xc8\\xcf\\x0d\\xa7\\x05\\xd1\\xd0\\x9a\\xca\\xd0\\x4f\\x01\\x08\\x37\\xec\\xef\\x41\\x9d\\x57\\xe9\\xea\\x6c\\xac\\xf1\\x68\\xc5\\x21\\x56\\x96\\xf4\\x71\\xf3\\xca\\xa8\\x97\\x60\\x7c\\x62\\x9d\\x44\\x3d\\xe0\\x99\\xd3\\x17\\x53\\xc2\\x46\\x77\\xd8\\xd7\\x5f\\x4b\\xf1\\x72\\x46\\x81\\x8b\\x58\\xad\\xc0\\x42\\x4b\\x76\\x2a\\x19\\x1e\\xf3\\x9a\\x70\\x76\\xa5\\xad\\x12\\x61\\x4c\\xf5\\x4c\\x47\\xeb\\x09\\x08\\xbb\\x86\\x65\\x18\\xc5\\xfa\\xc1\\xca\\x2d\\x2e\\x5b\\x65\\x75\\x20\\xa2\\xb3\\x69\\x5c\\x6f\\xb3\\x60\\xf1\\x6f\\x4a\\xb3\\x57\\x99\\x8e\\x4c\\x0e\\x97\\x23\\x1d\\x6f\\x89\\xc9\\x68\\xdc\\x29\\xec\\xc1\\xaa\\x91\\xfa\\x0d\\x75\\x43\\xb5\\xd2\\x24\\x7b\\x0d\\x85\\xe4\\x87\\x43\\xab\\x7c\\xc8\\x15\\xcf\\xda\\xa8\\x2b\\xf6\\x8c\\xa6\\xd3\\xe2\\x25\\x0b\\xfd\\xa2\\x70\\x24\\xd6\\x1b\\x47\\x4c\\x6b\\x81\\x54\\xac\\x8d\\x1b\\x5a\\x36\\x20\\x97\\x82\\x51\\x5c\\x16\\x46\\x68\\x0d\\x37\\x06\\x9b\\x8b\\x44\\x12\\xf9\\x51\\xb0\\x25\\xa4\\xd5\\x43\\x62\\x5d\\xd0\\x22\\x90\\xbf\\x03\\xc6\\x73\\x46\\x13\\xf9\\x9b\\x7a\\x4c\\x3a\\xf5\\xc5\\xf9\\xe9\\xac\\x34\\x74\\x46\\x5e\\x64\\x84\\x23\\x01\\x8d\\x40\\xa6\\xad\\xbe\\x88\\xa3\\x30\\x1d\\x3d\\x25\\x9b\\x04\\xee\\x44\\xcc\\x05\\x62\\xee\\x0d\\xed\\x4f\\x5e\\x26\\xad\\x97\\x7a\\xb5\\x63\\x1f\\x85\\x76\\x8d\\xbc\\xe5\\x3f\\x61\\x6c\\x02\\x9a\\x8b\\x8f\\x93\\x3e\\x2a\\x92\\x64\\xb1\\xc8\\x1f\\x51\\x7e\\x9f\\xf5\\x8a\\xb9\\xf4\\x5a\\x23\\xee\\xed\\x42\\x04\\x35\\x8f\\x8f\\xff\\x0c\\x8f\\x97\\x5e\\xf1\\xdf\\xa5\\x77\\x6a\\x5f\\x77\\x93\\xba\\xe2\\xf2\\x81\\xd7\\xb0\\xcb\\xef\\x24\\x0b\\x3f\\xc6\\xbe\\x05\\x88\\x21\\xea\\x2b\\x80\\x0f\\xff\\xe5\\x5a\\x7d\\xe0\\xaf\\xc9\\x3e\\xde\\x9c\\x60\\xc8\\xde\\x00\\x5a\\xbb\\x9a\\x2c\\x88\\xf4\\xe6\\x1e\\x8d\\xeb\\x31\\x70\\xf1\\x07\\x8a\\x36\\xe2\\xd8\\xf2\\xa5\\x82\\x39\\xbd\\xee\\x49\\x6e\\x90\\xd1\\x37\\xd2\\x11\\x0f\\x0a\\xd8\\x57\\xa8\\x8b\\x35\\x27\\x66\\x4f\\x78\\x19\\x39\\xe0\\xb2\\xf7\\x66\\x34\\xff\\x9f\\x6c\\x57\\xe1\\xc4\\x3f\\x58\\x24\\x31\\x71\\xcd\\x86\\x2e\\xf4\\x28\\x45\\x76\\x17\\x2a\\xf1\\xf6\\xc3\\xbd\\x37\\xd5\\xd7\\x4b\\x28\\xa7\\xa9\\x86\\x98\\xbd\\x74\\xe5\\x7b\\xbc\\x14\\x2e\\x67\\xf7\\x03\\xf9\\xd6\\x2c\\xde\\x76\\x1a\\x02\\x26\\x8f\\xec\\xb3\\x43\\xfc\\x01\\x41\\x88\\x36\\x41\\x4f\\x12\\x22\\xca\\x24\\xbc\\xdd\\x69\\xd0\\x05\\x90\\x1d\\xa2\\xa0\\xf9\\x44\\x65\\xe4\\xd4\\xba\\x68\\x89\\x88\\x16\\xbf\\x7e\\x3e\\x4b\\xb7\\x9c\\x8c\\xa5\\x99\\x7f\\xba\\x9a\\x8d\\xf8\\x4f\\xaa\\x2d\\x24\\xb0\\x44\\xc4\\xea\\x61\\x02\\x9a\\x46\\xcb\\xa7\\x03\\x42\\x1e\\x36\\x1d\\xfa\\x52\\xca\\xaf\\xf3\\xbb\\xaa\\xb7\\xfd\\x75\\x3f\\x28\\x56\\xd7\\xc0\\x83\\xae\\xb9\\x76\\x8d\\xa1\\x1d\\x82\\x1e\\x2d\\x30\\x9f\\x7a\\x73\\x5c\\x39\\x96\\x92\\xda\\xc2\\xf2\\x62\\x84\\x6b\\x89\\x1b\\xf6\\x46\\x1a\\xf2\\x3c\\x8c\\x7c\\xe1\\xd4\\xd9\\x03\\x2c\\x3c\\x14\\x0f\\x73\\x9e\\x55\\x84\\xc3\\x6f\\x05\\xea\\xf4\\x34\\x9f\\xf4\\x54\\x5f\\x28\\x3a\\x4e\\x0f\\xea\\x49\\x43\\x0a\\x1b\\x18\\x0d\\x08\\x71\\xe3\\x74\\x2b\\x88\\xcc\\xb5\\x91\\x12\\x4f\\xc4\\x27\\xed\\x67\\x3b\\x5f\\x27\\xb0\\xb0\\xa6\\xf5\\x4a\\xf2\\x2b\\xa4\\xa6\\xd1\\xc6\\xc1\\xdb\\x2a\\x1f\\xca\\xa6\\xd8\\xa0\\x30\\x8b\\x77\\xef\\x2d\\x0c\\x61\\xbb\\xf5\\x1b\\x95\\xf1\\xe8\\xb6\\xab\\xc5\\x04\\x1d\\x97\\xb6\\xb6\\xf1\\xb5\\x69\\xb3\\xf6\\x3c\\xec\\x05\\xcb\\x56\\x7a\\xae\\xa1\\x06\\x72\\x70\\x96\\xee\\x8a\\x9e\\xa8\\x7b\\x88\\x04\\x90\\x1f\\x7e\\x88\\xa7\\x40\\x9c\\x66\\xf1\\x52\\xde\\x9d\\xbf\\xcb\\xe3\\x19\\x52\\xe6\\xfd\\x83\\xb2\\x87\\x7a\\x77\\x5f\\xae\\x42\\x5b\\x38\\x51\\xe0\\xef\\xf8\\x79\\x2f\\xfb\\x38\\x48\\xf8\\x4a\\x65\\xcc\\x31\\x72\\x53\\xb2\\x72\\x47\\x5e\\x71\\x7e\\x49\\xe9\\xc6\\xff\\x6b\\x78\\x59\\xd1\\x1b\\xba\\x7c\\x44\\x28\\xc8\\x2d\\x17\\x89\\xe0\\xdc\\xa5\\xbc\\xad\\xca\\x2f\\xdb\\x25\\x9e\\x98\"},\n{{0xdb,0x46,0x1b,0x9f,0x70,0x7e,0xb2,0xcd,0x77,0x48,0xc4,0x4c,0x99,0x56,0x2f,0x13,0x02,0x39,0x74,0x89,0x35,0x3d,0xf5,0xf3,0x03,0x79,0x7f,0xe0,0xd0,0xb5,0x8d,0xe1,},{0x63,0x51,0x16,0xda,0x8b,0xa5,0xa3,0x6a,0x37,0x77,0x28,0xe2,0x86,0x18,0xe7,0x5c,0x55,0x92,0xae,0xcc,0x18,0xe3,0x40,0x11,0xc4,0xc4,0x25,0x91,0x97,0x0b,0x73,0x66,},{0xdd,0x04,0x9c,0xa7,0x9b,0xeb,0x9e,0xac,0x32,0x5a,0xcf,0x44,0x67,0x2f,0xf5,0x78,0xa9,0x68,0x50,0x2f,0xe1,0xbc,0xf5,0xea,0x19,0xd5,0x2c,0x0f,0x67,0x78,0xc7,0xf1,0xc7,0xbb,0xf7,0x42,0x74,0x79,0x07,0x78,0x6e,0x60,0x81,0x23,0x91,0x1a,0x92,0x07,0x78,0xd2,0xf9,0x59,0x6f,0xe2,0x9b,0xe7,0xcc,0x28,0xfd,0x00,0x9d,0x7c,0x44,0x0e,},\"\\x1a\\x2a\\xc8\\xc1\\xb9\\xea\\x09\\x9b\\x83\\x1a\\x68\\x12\\xd2\\xb4\\x26\\x13\\x09\\x05\\x8e\\xa5\\x88\\x3d\\x70\\xb1\\xc6\\x07\\xb9\\xcd\\x3f\\xdf\\xdb\\x86\\xe7\\x99\\x02\\xb0\\xfe\\x89\\xe8\\x0e\\xa7\\xc4\\x78\\x20\\x76\\x74\\xb2\\xd8\\x03\\xb0\\xb9\\xca\\x14\\x7f\\xfe\\x62\\xe5\\x94\\xf5\\x06\\xc7\\x96\\xd6\\x89\\x97\\xce\\x48\\x2b\\x51\\xa4\\x6e\\x49\\xb4\\xa5\\xd8\\x58\\xcd\\xea\\xe2\\xc6\\xec\\x9b\\x69\\x41\\x98\\xe6\\x82\\x2f\\x0e\\x33\\xed\\x57\\xbe\\xdb\\x03\\x35\\xc7\\x89\\x0a\\x72\\xa7\\xee\\x3c\\x23\\x82\\x3b\\xe7\\x9b\\x7f\\x94\\x71\\xe0\\x33\\xc7\\x9a\\xee\\xd5\\x2e\\x57\\x60\\xfb\\x0c\\xcb\\xb9\\xd3\\x8f\\xde\\xd8\\xb4\\x73\\x83\\xc1\\x91\\x03\\xce\\x44\\x70\\x58\\x34\\xc5\\x9d\\xdd\\x86\\xf7\\x03\\x39\\x48\\x61\\x2d\\x66\\x62\\xf5\\x16\\xce\\x4e\\x39\\x9f\\xf2\\x03\\x63\\xcc\\x72\\x81\\xa6\\x9b\\x2d\\x5c\\x30\\x7b\\x10\\xb7\\x04\\x15\\x01\\x84\\xec\\xe3\\x2f\\x39\\x0d\\x77\\x2c\\xcf\\xa7\\x84\\x83\\xbb\\x77\\xa9\\xfb\\xa8\\x44\\x25\\x36\\x69\\x84\\x17\\x1c\\xc2\\xbb\\x60\\xb0\\xec\\x6c\\x62\\x8d\\x4e\\x90\\x30\\x74\\x6d\\xac\\x1c\\xab\\xca\\x60\\xf0\\x56\\x83\\x81\\x33\\x46\\xa1\\xa5\\xbc\\x14\\x72\\x75\\x49\\x79\\x5c\\x1c\\x92\\x68\\x69\\xe1\\xaa\\x25\\x09\\x3d\\x59\\x1b\\x43\\xe0\\x86\\xe4\\x3a\\x04\\xd1\\x70\\xd9\\x42\\xc4\\x16\\x5e\\x1c\\x5c\\xe7\\x6c\\x3e\\x64\\x97\\x3d\\x91\\x36\\xf9\\x32\\x5b\\xee\\x82\\x16\\x82\\xf1\\x04\\x3e\\x95\\x1b\\x02\\x76\\x7f\\x3f\\xb4\\x58\\xd0\\x24\\x49\\xad\\xd3\\xe8\\xa6\\x6e\\x51\\x6f\\xdb\\x1e\\xd5\\x80\\xe0\\x56\\xe0\\xf7\\x8e\\xe3\\x3f\\xd9\\xee\\x32\\x80\\x91\\x2f\\xae\\x07\\xfe\\x1e\\xa0\\x25\\x27\\xcd\\x00\\x1d\\x6f\\x6f\\x2f\\x89\\xee\\x64\\x9f\\x51\\x74\\x14\\xd5\\x6f\\x57\\x35\\x9a\\x84\\x68\\x91\\xf0\\x22\\x2c\\x32\\x1d\\x7e\\x70\\x81\\x79\\x95\\xa8\\xcd\\x8e\\x94\\x76\\x0b\\x6e\\x74\\x83\\x2b\\xab\\x68\\xd5\\x5b\\xc4\\x64\\x18\\x84\\x22\\x1f\\xd2\\x9f\\x12\\x2d\\x87\\xa9\\xa8\\x68\\xb6\\xa6\\x06\\x0c\\x87\\xb2\\x38\\x2c\\xf7\\xbb\\xdd\\xa4\\xcd\\x6a\\xaa\\x1b\\xbc\\x8e\\x6d\\x63\\x4a\\xb5\\x80\\xc8\\x65\\xf5\\xad\\xd6\\xa1\\xd5\\x4e\\x61\\xa6\\x07\\xdc\\x2c\\x37\\xb0\\x8a\\x8c\\xba\\x6e\\x61\\x0c\\x12\\xcf\\xeb\\xef\\x9c\\x98\\x9e\\xef\\x3b\\x78\\x2a\\xcb\\xd1\\xbc\\xec\\x5f\\x04\\xe8\\x35\\xca\\x10\\x12\\x98\\xb5\\xe9\\xbd\\xd8\\x81\\x3a\\x71\\xb0\\xd4\\x69\\xfc\\xf1\\x27\\x27\\xd3\\xde\\x1c\\x3f\\x97\\xdd\\xbc\\x6a\\xb2\\x65\\x84\\x40\\xdd\\x64\\x21\\x01\\x9b\\xc6\\x8f\\x35\\x6d\\x6f\\x25\\x53\\x68\\x65\\x85\\x1d\\x92\\xd9\\x0f\\xe9\\x96\\x9c\\x3b\\x7c\\x35\\xa2\\xe8\\x8c\\xe1\\x53\\x47\\x6e\\xc3\\x97\\x3a\\xf9\\x35\\x9f\\x16\\x77\\xa4\\xca\\xf1\\xcc\\x48\\x1c\\x71\\xbd\\x90\\x22\\x8f\\xf5\\xfc\\x6d\\xd8\\x3b\\x8a\\x69\\x9f\\xfe\\x51\\x49\\x29\\xf5\\xc9\\x5c\\xb4\\xf0\\x4b\\x00\\xdd\\x18\\xa2\\x87\\x2c\\x41\\x86\\x8d\\x3b\\xeb\\x76\\x49\\x8d\\xdc\\x92\\x34\\xb6\\x3f\\x59\\x9d\\x70\\x71\\x80\\x1d\\xb2\\xc2\\x87\\x8f\\x7b\\xef\\x4f\\xfd\\xdd\\x81\\x32\\x26\\xf0\\x6d\\xb8\\x4e\\xb3\\x02\\x17\\xa7\\x18\\x30\\x82\\xe3\\xc1\\x24\\x2b\\xb6\\xd0\\x1c\\xd3\\xa6\\xce\\x27\\xbf\\xf1\\x6b\\xfb\\xfd\\xd7\\x5b\\x7e\\x51\\x04\\x31\\x2c\\x49\\xc4\\x3a\\xad\\xfc\\xd5\\xb4\\xed\\xba\\x0f\\xf5\\x0d\\x28\\x90\\xca\\x3c\\xd9\\xcc\\xa3\\x3e\\x4f\\xc6\\x94\\xc0\\x57\\xc4\\x7e\\xbe\\x1c\\x20\\xa4\\xad\\x11\\x5f\\x98\\x5d\\xc7\\x44\\x2c\\x6f\\x6d\\xa7\\xbe\\x53\\x0b\\x69\\x02\\x28\\x9c\\xab\\x9c\\xa1\\x39\\xc6\\xb2\\x4c\\xb8\\x0f\\xfd\\xd7\\x82\\x32\\x4e\\x60\\x2c\\x45\\x91\\x0d\\xb6\\x3d\\x8b\\x5c\\x44\\xca\\x29\\xd2\\x7f\\x56\\xdb\\xf0\\x01\\x86\\xba\\x58\\x3c\\x34\\xe1\\x60\\x31\\xdf\\x35\\x75\\x46\\xb3\\xab\\x9a\\x3d\\xd6\\x5e\\x91\\xd7\\x12\\x8c\\x93\\x91\\x95\\xe6\\x46\\xa0\\xf0\\xb8\\x9b\\xf5\\xdf\\x04\\xba\\x23\\x3d\\x6a\\x12\\xa2\\x71\\xf7\\xe0\\x4a\\xa4\\x5c\\xda\\x99\\xb4\\xa5\\x5a\\x21\\xcb\\xbb\\x73\\x85\\x15\\xe3\\x2c\\x56\\xaa\\xc2\\x49\\x62\\x32\\xb1\\x00\\x8a\\x67\\x61\\xc8\\x04\\x5a\\x1f\\xe0\\xf9\\xa3\\x64\\x40\\x47\\xb5\\x96\\x6a\\x58\\xa6\\x00\\x46\\x6c\\x1b\\x1d\\x11\\xdd\\xad\\x5a\\xa5\\x73\\xc4\\x3e\\xbd\\xa8\\x87\\xe1\\x6a\\x05\"},\n{{0xf5,0xc0,0xa7,0xf8,0xf6,0x58,0x4c,0x5d,0x2f,0x2e,0x1d,0x08,0x10,0xe8,0xe8,0x61,0x03,0xe4,0xe2,0xd4,0x5c,0xf9,0xa7,0x21,0xd8,0xc4,0x7f,0x67,0x49,0x33,0x96,0xa4,},{0x3c,0x6d,0x6c,0xce,0x49,0x63,0x31,0x41,0x07,0x86,0x96,0x13,0x1a,0x8d,0x84,0xed,0x82,0x3f,0x30,0x66,0x4b,0x28,0x9a,0xf9,0xdd,0x30,0xc6,0x40,0x7f,0x6f,0x03,0x13,},{0xd4,0xc3,0x0a,0x48,0xc4,0x52,0x3b,0x1f,0x84,0xb1,0x4b,0x65,0x7a,0xf8,0xf8,0x59,0x75,0x5b,0xba,0x63,0x59,0x98,0x8b,0x67,0x5c,0x6d,0x85,0xdd,0xf3,0x54,0x62,0x82,0x0d,0xa4,0x76,0xd8,0x4f,0x6c,0x40,0x2e,0x65,0xb0,0x20,0xd9,0xe8,0xa2,0xc2,0x85,0xc1,0x67,0x08,0xae,0x58,0xd1,0xf8,0xdb,0xc6,0x57,0x82,0xa8,0x98,0xa6,0x65,0x08,},\"\\xd6\\x8a\\xbc\\x60\\x9a\\x7a\\x0c\\xe2\\x56\\x69\\x9e\\xb1\\x70\\x43\\xde\\xfe\\x1e\\xb8\\x22\\xc9\\x70\\x8f\\x65\\x71\\x8a\\x06\\x58\\x1f\\xab\\x21\\x10\\xec\\x2d\\xb0\\x92\\x13\\xbb\\x9e\\x0f\\x36\\x12\\xce\\x4a\\x3f\\x8f\\xdb\\xe7\\x57\\xa9\\xf0\\xeb\\x2c\\x3e\\xba\\x43\\x8a\\x90\\x88\\xb1\\x8f\\x6c\\x5c\\xaa\\xbb\\xe5\\xc8\\x2f\\x7a\\x9a\\xb2\\xfe\\xcf\\x0f\\x58\\x59\\xd1\\x75\\xe1\\x39\\x26\\x30\\x33\\x74\\x24\\x58\\xf8\\x2a\\x6f\\x38\\x75\\x6c\\xd5\\xbc\\xdf\\x9e\\x07\\x36\\xdb\\x2c\\xab\\x20\\xa0\\xcd\\x3f\\x0f\\x1c\\xdb\\xea\\x85\\x56\\xd8\\x49\\x09\\x35\\x8d\\xd8\\xf6\\x9f\\x0d\\xac\\xd4\\x9a\\xbf\\x8a\\xc1\\xbf\\xe7\\x59\\x40\\xd6\\x93\\x9e\\x6a\\x55\\x38\\x5b\\x5a\\xce\\x7c\\xe1\\xfd\\xe1\\x20\\x67\\x9a\\xb6\\xea\\x7a\\x89\\xd1\\x42\\x68\\xd2\\x9f\\xfb\\x46\\xdf\\x10\\x5b\\xf3\\x90\\x92\\x42\\xc6\\x60\\x5f\\x3e\\x3e\\x2a\\xb7\\x44\\x89\\x37\\xd6\\xdb\\x2b\\xa0\\x54\\xc7\\xb1\\x4f\\x43\\x2d\\xb4\\x1d\\xc1\\x8a\\x5b\\x95\\x73\\x36\\xb7\\xf5\\x2d\\x97\\x8e\\xc0\\x3e\\x7d\\x57\\x64\\xe9\\xbd\\x2f\\x4b\\x68\\x95\\x8d\\x93\\x7b\\xf2\\x98\\x23\\xb2\\x7e\\xfb\\x31\\xe2\\x5b\\x43\\x92\\x5c\\x4d\\xac\\xbe\\x67\\x18\\xa6\\x0f\\xea\\x3b\\x32\\x70\\xe7\\xb7\\x6b\\x0d\\xe0\\xe7\\x0f\\x7f\\xa3\\xc1\\x2c\\x21\\x5e\\xf7\\x2b\\x95\\xdc\\x1b\\x52\\x76\\x23\\x81\\x79\\xdf\\xc5\\x2f\\xc4\\x88\\x59\\x64\\x9f\\xa5\\x82\\xd0\\x5a\\x60\\xdf\\x68\\x59\\x9a\\x1c\\xee\\xa6\\x4f\\x64\\x12\\xd3\\xf8\\x49\\x8a\\xe2\\xce\\xdb\\x12\\x42\\x45\\x88\\x3a\\x24\\x0b\\xc0\\x85\\x1f\\x0e\\x32\\x49\\x65\\xbe\\x12\\x04\\x86\\xe1\\xea\\x89\\xa0\\x18\\x2d\\xfa\\x8e\\xab\\xd3\\xb8\\xfa\\x66\\xa9\\x9c\\x51\\x49\\x13\\x89\\xf3\\xc8\\x3a\\x3c\\xdb\\x42\\x67\\xf3\\xe4\\xdb\\xc9\\x8f\\x0c\\x44\\x85\\x6b\\x04\\x4d\\xc8\\x8d\\x90\\xee\\xee\\x84\\x15\\xbf\\x73\\xde\\x17\\x1a\\xfe\\x84\\xbe\\x90\\x35\\xe0\\xdc\\x4c\\x80\\xcf\\x04\\x22\\x46\\x9f\\xe0\\xc9\\xbd\\x1c\\x6a\\xa6\\x54\\xa5\\x9b\\x5e\\x34\\xee\\xd3\\x51\\xcd\\xa2\\x87\\x12\\x69\\xac\\x47\\x8e\\x8d\\x38\\x2e\\x74\\x0e\\x9a\\xc7\\xab\\x4d\\xdc\\x4c\\x0d\\xef\\x0a\\xea\\xb7\\x97\\xb6\\xf1\\xa4\\x27\\xb8\\xe4\\xa8\\x49\\x7a\\x0b\\x97\\x97\\xda\\xdc\\xd3\\x5c\\x41\\x4f\\xd5\\x5b\\x78\\x31\\x30\\xf6\\xcd\\xed\\x38\\xa4\\x4c\\x1a\\x89\\x28\\x83\\x07\\xeb\\x84\\x25\\x48\\x41\\x37\\xa8\\xae\\xdb\\x03\\x0d\\x54\\xb6\\x16\\xa8\\x2e\\x3c\\x5a\\xcf\\xfb\\x08\\xd6\\xcc\\x1a\\x61\\x74\\x5c\\x29\\xaf\\xc6\\x8a\\x0c\\x18\\x38\\xb1\\x39\\x15\\x9c\\x5f\\xa6\\x67\\x4d\\x66\\xb9\\xe3\\x38\\x11\\x5a\\xad\\x4b\\x1b\\x47\\x10\\xaa\\x5d\\x95\\x17\\xbc\\xf7\\xe1\\xcb\\x12\\xd4\\xe6\\xa5\\x1c\\x11\\x78\\x9f\\xdc\\xae\\x9d\\x9b\\xbe\\x78\\xf6\\x9a\\x33\\xe5\\x2d\\xf1\\x83\\x3c\\x87\\x6b\\x02\\x68\\x7a\\x40\\x4f\\xac\\xad\\x32\\x84\\x1c\\xb2\\xd5\\x25\\x54\\xe7\\xb8\\xe2\\x20\\x9e\\x3f\\x88\\xfd\\x94\\x8c\\x1e\\xcf\\x83\\x95\\x7c\\x96\\xf4\\x3b\\x03\\x4b\\xed\\xa6\\xc4\\x76\\x09\\x6b\\xcb\\x09\\x30\\x1a\\xd6\\x1f\\x83\\x67\\xcc\\x43\\xe1\\x56\\x13\\x18\\x62\\xb4\\x2e\\xce\\x28\\x5b\\xec\\x2d\\xcc\\x2d\\x02\\xd0\\x94\\xd0\\x42\\xa1\\x60\\x72\\xeb\\x22\\xab\\x98\\x88\\x01\\x3b\\xe8\\x23\\x71\\x56\\x94\\x00\\xec\\x1f\\x8e\\xc7\\xe7\\x91\\x08\\xc4\\x1b\\x85\\x33\\x65\\x26\\x8f\\xa4\\xcf\\xbc\\x62\\xc4\\xac\\x12\\xcc\\x98\\xd2\\xec\\x38\\xa8\\x7d\\x60\\x85\\x85\\x95\\x67\\xc0\\xf2\\x7d\\x6d\\x43\\x1a\\x04\\x6e\\x88\\xa9\\x81\\x55\\x58\\x66\\x07\\x05\\xfd\\x05\\xeb\\x06\\xc6\\xc0\\x5e\\x5b\\x7d\\x62\\x34\\x7c\\xee\\xe2\\x7d\\xff\\xed\\x71\\x41\\x54\\x0d\\x60\\x8c\\xb9\\x75\\x07\\x5a\\x96\\x44\\xac\\xc6\\x32\\x84\\x39\\xf9\\xfa\\x68\\x2b\\x22\\x6b\\x18\\x61\\x54\\x54\\x90\\x11\\xc3\\xb0\\xf0\\xff\\x4f\\x74\\xca\\xa7\\x1c\\x19\\x44\\xe4\\xcb\\x83\\x6c\\xe8\\x51\\xd9\\xb5\\xd9\\xe7\\x27\\xc5\\x53\\xe3\\xc7\\x23\\xcf\\x98\\xc2\\x73\\xe5\\x67\\x5c\\xab\\x89\\x9b\\xb6\\x6f\\x46\\x33\\xa7\\x6d\\xea\\x35\\x73\\x41\\xf9\\x83\\xc5\\x3d\\x91\\x58\\xad\\x31\\x9a\\xda\\x75\\x40\\x8b\\x41\\xc0\\x6f\\x26\\xb7\\x43\\x5b\\x80\\xdc\\x3b\\xc0\\xaa\\xf2\\x2a\\x83\\x3d\\xde\\xdc\\xd6\\x78\\x5c\\x87\\xd1\\x96\\xb0\\xaf\\x2c\\x9a\\x43\\xd1\"},\n{{0x1a,0xb9,0x46,0xc0,0xc1,0xae,0xbf,0x9c,0xa3,0x7c,0x2f,0x4e,0x2a,0x4b,0x33,0x7d,0x5b,0x1e,0xbc,0xcd,0x24,0x73,0x4c,0x9c,0xb2,0xa1,0x60,0x8c,0x88,0x1e,0x57,0x57,},{0x9a,0xfc,0x63,0xdf,0xce,0x0d,0x48,0x9b,0x40,0x90,0x7a,0xee,0xd6,0xdf,0xfe,0x4c,0xd8,0xef,0x5a,0x6f,0xfa,0x22,0x98,0x95,0x56,0x44,0x5c,0xbf,0x9b,0x35,0x19,0xc2,},{0xbf,0xab,0xde,0xa4,0x18,0x10,0xa5,0x3f,0x8e,0x52,0x7a,0xcd,0x66,0xec,0x10,0x6c,0xe2,0xae,0x1a,0x67,0xff,0x6a,0x9b,0x52,0x2e,0x0f,0x08,0xfb,0xbf,0x12,0x52,0x68,0x2c,0xb3,0xa1,0xdc,0xc8,0x75,0x60,0x19,0x44,0xcb,0x88,0x00,0x0f,0x72,0xe1,0x39,0x07,0x00,0x79,0x03,0xa7,0x7c,0xd0,0xdb,0x03,0x16,0xd4,0x19,0xac,0x38,0xc2,0x04,},\"\\x9b\\xb0\\x71\\xb6\\x2c\\x04\\x06\\x4b\\x0c\\x96\\xe2\\x43\\xdd\\x19\\x8c\\x39\\x71\\x7b\\x25\\xc9\\x94\\x48\\xc2\\xc0\\x02\\xb8\\x4a\\x99\\x20\\x4c\\x5a\\x6e\\x23\\xb4\\xb9\\x12\\x02\\x86\\x75\\xbf\\xdc\\x4d\\xf9\\x3c\\x5b\\x2f\\xb8\\x08\\x81\\xa2\\x3e\\x0d\\x44\\xba\\x18\\xbd\\xe9\\x91\\x21\\xee\\xe8\\x6a\\xdc\\x6f\\x84\\x28\\x19\\xd6\\xeb\\xc7\\xa2\\x88\\x99\\x2d\\xa3\\x28\\x58\\x05\\xa8\\xb8\\xb6\\xfb\\xcd\\x22\\x67\\xb6\\x86\\xb3\\xe1\\xbf\\x79\\x60\\xb4\\x5f\\x24\\x4f\\x85\\x2e\\x82\\x49\\x29\\x44\\xe3\\xd6\\x18\\xbc\\xc4\\x51\\x4c\\x17\\xf7\\x22\\xba\\x49\\xac\\xa7\\xf2\\xf3\\xbb\\x4e\\x91\\xf9\\x40\\xe9\\xce\\xf0\\x15\\x65\\x0c\\x3e\\x40\\xb0\\xc8\\x55\\xa1\\x7c\\x42\\xf1\\x1e\\x3a\\x34\\xac\\xc8\\x52\\x87\\xdb\\xe0\\xf9\\x09\\x3c\\x00\\x37\\x3d\\x50\\xc0\\xb3\\x06\\x4a\\x5a\\x5f\\x2b\\x1e\\x89\\x20\\x65\\x17\\x52\\x82\\x95\\xfd\\x87\\x17\\x03\\xa8\\xe7\\x62\\xb5\\xe7\\x6f\\xb9\\xb7\\x47\\x3d\\x21\\x49\\xb8\\x5b\\x94\\x61\\xf5\\x58\\x7e\\xd7\\xe7\\xfc\\x8b\\x50\\xaa\\x09\\x87\\x6d\\xee\\xb6\\xe2\\x37\\x07\\x85\\x02\\x14\\x2c\\xec\\x6b\\xdd\\xc7\\x01\\x40\\xfe\\x1d\\x1f\\x16\\x58\\xd5\\xd3\\xe9\\x10\\xfd\\x70\\x36\\xa2\\xf9\\x24\\xb4\\x99\\xdb\\x17\\x56\\xf7\\xc8\\xce\\x0d\\x5f\\x0d\\x04\\x5b\\x39\\xbc\\x81\\xc5\\xc2\\xf1\\xa7\\x61\\xf5\\x2f\\xf3\\x93\\xe0\\x64\\x9b\\x8d\\xb0\\xbd\\x88\\x54\\xbd\\x02\\x6b\\xe2\\xc7\\xc3\\xcd\\x63\\x52\\x6b\\xa5\\xa8\\x0d\\x48\\x33\\x5f\\x03\\x38\\x32\\xd6\\x33\\x76\\x07\\x1b\\x63\\x08\\xf0\\x59\\x60\\xcb\\x3f\\xc9\\xfa\\xc9\\x32\\xed\\xd8\\x37\\x6d\\xae\\x51\\xf2\\xc6\\x61\\xf7\\x5b\\x7c\\x6f\\x4a\\xc8\\x56\\x75\\x3a\\xca\\x62\\x06\\x28\\x77\\x60\\x9f\\xc4\\xa0\\xff\\x60\\x67\\x02\\x82\\xc0\\x5e\\x88\\x2d\\x1a\\x03\\x5b\\xf9\\x89\\x0c\\xab\\x29\\x6a\\xc7\\xa8\\xdf\\x24\\x4c\\x56\\xf4\\x90\\x25\\x0f\\x02\\x00\\x54\\xb8\\xaf\\x51\\xbe\\x4f\\xc3\\x18\\xbe\\xba\\x50\\x62\\x32\\xbf\\x45\\xe1\\x7f\\x5c\\x74\\x0c\\xf0\\x9d\\x37\\x51\\x5a\\x8b\\xc8\\x94\\xbc\\x95\\x5c\\x8a\\x46\\x08\\x77\\xc7\\x85\\x4f\\x8b\\xe3\\x63\\xb2\\x19\\x33\\xe1\\x62\\x87\\xae\\x0c\\xb7\\x0f\\x22\\x2d\\x4e\\x36\\xb8\\xb4\\x24\\x97\\x55\\x59\\xbb\\x4b\\xfc\\x8d\\xd1\\xd5\\x1b\\x3c\\x0f\\xaf\\x4a\\x53\\xe3\\x02\\x19\\x6f\\x9f\\xed\\xb5\\x32\\x87\\xd0\\x93\\x15\\xdf\\xff\\xa2\\xbc\\x4b\\x3a\\xcf\\xf1\\x37\\xf9\\xa7\\x6d\\x68\\x56\\x21\\x7f\\x79\\xcb\\xb2\\x54\\x33\\xfc\\x97\\x89\\x9f\\xd6\\x54\\x0f\\x18\\x08\\x8e\\x84\\x41\\x7e\\x48\\x33\\xe4\\xa9\\x1a\\xab\\xa4\\x65\\x8a\\xe9\\xad\\x7f\\x76\\x0d\\xd9\\xc5\\xb7\\x19\\x1a\\x0d\\x3c\\x05\\x54\\x1b\\x83\\xc0\\x25\\xa7\\x99\\x21\\x38\\xe6\\xd1\\x08\\x0d\\xa1\\x4c\\x2c\\x88\\x7c\\x6d\\x67\\x0a\\xab\\x37\\x4d\\x43\\x6c\\x27\\x2f\\x9e\\x96\\xf8\\x5a\\x9c\\x42\\x33\\x79\\xc0\\xd4\\x7c\\x46\\xdf\\x6d\\xe3\\x34\\xea\\x20\\x57\\x15\\x8d\\x33\\x23\\x1e\\x14\\x26\\xa6\\x6d\\x3c\\x70\\x82\\x7a\\xad\\x55\\x11\\xb8\\x46\\xe0\\x3b\\x94\\x92\\x3d\\x5f\\x94\\xba\\xf1\\xf8\\xcf\\x11\\xa8\\x61\\x37\\x3a\\x5b\\x80\\xad\\x5e\\x31\\x7e\\xc2\\xa5\\x29\\xe9\\x4e\\x63\\x6c\\xdc\\x3a\\xa2\\x9e\\x5d\\xac\\x20\\x5a\\x0c\\x13\\xf6\\x8f\\xb1\\x98\\xcf\\x94\\x56\\xe6\\x39\\x0a\\xea\\xd4\\xd9\\x78\\x2a\\x10\\x38\\xf6\\x47\\x8d\\x33\\x9a\\x81\\xba\\xe7\\xaf\\x2a\\x04\\x15\\x1c\\x2f\\x22\\xe8\\xd3\\x9f\\xe0\\x71\\xe1\\xa5\\x21\\x68\\xd5\\x7c\\x84\\xc3\\x62\\x93\\x41\\x3f\\x8e\\x6f\\xf6\\x93\\x4f\\x05\\xe7\\xef\\xad\\x6f\\xa1\\x20\\xc8\\xc1\\xc3\\x8a\\xd1\\x88\\x6a\\x3d\\x00\\xbf\\xc3\\x06\\x45\\x92\\x03\\xc0\\x2c\\xdf\\x4f\\x06\\x65\\x2b\\xc8\\xfa\\x0e\\x8b\\x9c\\xc7\\x79\\xd4\\x3f\\xbb\\x78\\x9e\\x7d\\xad\\x5d\\xc9\\x9f\\x41\\xd4\\xcc\\x58\\x8c\\x1b\\x65\\x42\\x6a\\x4e\\x77\\x38\\x9e\\xdd\\x04\\x97\\x75\\x78\\xf8\\xf3\\x16\\xbc\\xdd\\x94\\x61\\xd6\\x66\\x47\\x2c\\xdd\\x27\\x6a\\xa5\\x69\\x72\\x1c\\x65\\x23\\x22\\x56\\xba\\x1c\\xf0\\xe7\\xf5\\xea\\x55\\x32\\x17\\x29\\xbb\\x0e\\x03\\x86\\xa7\\x7b\\x86\\x55\\x32\\x02\\x46\\x96\\xed\\xde\\xf4\\x85\\xb7\\xd7\\xb2\\x8c\\x15\\x73\\xb9\\x34\\x7e\\x41\\x4d\\x42\\x61\\x99\\x54\\x82\\xe3\\xb3\\x12\\xde\\x13\\x31\\xf8\\x4e\\x75\\x48\\x60\\x7a\\x84\"},\n{{0x04,0xbb,0x88,0x7a,0x8a,0x31,0x84,0xff,0xc7,0xea,0x09,0xc9,0xbc,0x7c,0x1f,0x7c,0x34,0x11,0x55,0x6a,0x7c,0x7c,0x39,0x8c,0xb8,0xb2,0xd9,0x8f,0xfd,0x9e,0xe8,0x66,},{0x6a,0xb1,0xe4,0xae,0x4a,0xa0,0xd3,0x89,0x89,0xae,0xef,0xa8,0x05,0xb5,0x78,0x80,0x6e,0x2e,0x97,0x1a,0xc7,0xac,0x05,0x40,0x99,0x58,0xbf,0xe6,0x00,0x71,0xf4,0xa7,},{0xcd,0x84,0xf5,0x5e,0x5e,0xf4,0x53,0x19,0x24,0xc5,0xa2,0x18,0x1e,0xc8,0x7a,0x64,0x54,0x13,0x88,0xc1,0x05,0x94,0x06,0xbc,0x07,0xd5,0x31,0x57,0xa1,0x68,0xe2,0x03,0xcc,0x8a,0xa0,0xf0,0x06,0x9d,0x53,0xff,0x58,0xa9,0x5b,0x8a,0x8c,0xaa,0xfd,0xad,0x26,0x36,0x3c,0x7d,0x0f,0x80,0x45,0xc4,0x35,0x9e,0x97,0xb4,0x36,0x02,0xc6,0x06,},\"\\xb7\\xab\\x0c\\x81\\x63\\xf4\\x78\\xc6\\xca\\xbf\\x2b\\xbd\\x7c\\xa3\\x7c\\xb0\\x24\\x56\\xd7\\x6e\\x52\\x7e\\xea\\x1b\\x0d\\x26\\xdb\\x24\\x2e\\x37\\x87\\x76\\x32\\x98\\x5a\\x3e\\x3c\\xa4\\x1b\\x52\\xe2\\x1d\\x79\\x01\\x7b\\xff\\x81\\xee\\x55\\x1a\\xd7\\x2a\\xf2\\x77\\xb4\\x10\\xe4\\x2a\\xf8\\x22\\xc6\\x08\\xcd\\x69\\xd0\\x0b\\xf4\\x40\\xb7\\x5b\\x78\\x7a\\x8c\\x91\\x5d\\x70\\xb6\\xc6\\x37\\x6c\\x3f\\x67\\xfa\\x64\\xd6\\x12\\xa1\\xb4\\x49\\xa7\\xe2\\x13\\x4d\\x9c\\x23\\x23\\x01\\x57\\xd5\\x76\\xe0\\x6a\\x66\\xa8\\x42\\x2a\\x61\\x1e\\x2a\\x0f\\x09\\x72\\x86\\xc1\\x99\\xea\\x2a\\x16\\x28\\x61\\x86\\x4b\\xd0\\x35\\x07\\x6a\\xb2\\x0b\\xba\\xe2\\xb4\\x40\\x8a\\x2c\\x64\\x33\\xcb\\x23\\x43\\x3a\\x88\\x9f\\xe6\\x59\\x8f\\x47\\xbe\\x53\\xbb\\xd2\\xc8\\x0f\\x07\\xa8\\xfc\\xcb\\x8a\\xae\\x51\\x11\\x61\\xe6\\x09\\xda\\x4d\\x18\\x0a\\xce\\xa5\\x44\\x81\\x1e\\x94\\x49\\xc5\\xdc\\x22\\x50\\xe3\\xe5\\xa0\\xcd\\x41\\xda\\x33\\xa2\\xda\\x63\\x2e\\x60\\x38\\xbd\\x86\\xf1\\x6d\\x5b\\x7c\\x1b\\xe4\\x9f\\xc6\\xdb\\x49\\x90\\x76\\xca\\x91\\xf7\\xaa\\x02\\x8f\\xe3\\x85\\x29\\x70\\x0b\\x21\\xd0\\x72\\xd2\\xb7\\x5d\\xcc\\x8b\\x43\\x78\\x1d\\x4b\\xc4\\xd3\\xbb\\x58\\x4d\\x9d\\xa0\\x1c\\x3e\\xcc\\x85\\xb1\\xe9\\x3f\\xce\\x04\\x5d\\xad\\xce\\xea\\x51\\x06\\x46\\x8b\\xdf\\xe5\\xf7\\x0d\\x66\\xa4\\xfa\\xd6\\x0e\\x4f\\xb8\\x64\\xec\\x15\\xea\\x50\\xf6\\xcb\\x79\\x72\\x23\\xc8\\xc7\\x56\\xf7\\xa1\\x93\\x1a\\x39\\x46\\x4e\\xbb\\xb9\\x67\\x9f\\x6b\\x01\\x68\\x7c\\x17\\x4e\\xaa\\x32\\xb9\\x68\\xb9\\xcf\\xac\\xe8\\xc1\\x67\\x12\\x0a\\xa7\\xbd\\x02\\x42\\xf0\\x03\\xa0\\xc3\\x77\\x70\\x25\\x51\\xb3\\x0d\\xa2\\x48\\x8e\\xb2\\x94\\x40\\x52\\x93\\x4a\\xef\\x4b\\xfe\\x11\\x5f\\x0a\\xb7\\x40\\x5a\\x3d\\x5f\\xa9\\xbd\\x79\\x6b\\x37\\x17\\x42\\xbc\\x11\\x4a\\x9b\\xf2\\x8c\\x5b\\xd2\\x56\\x26\\x29\\x5c\\xe2\\x61\\xa6\\xa8\\x3e\\xf6\\x0b\\x77\\xd2\\xd3\\x2d\\xd7\\x10\\x5f\\xc8\\x36\\x64\\xaa\\x89\\x76\\x5b\\x3f\\x81\\x91\\xee\\xee\\xd8\\x78\\xf2\\xeb\\xff\\x2f\\xb9\\x76\\x63\\xa6\\x18\\x77\\xc0\\x93\\x93\\x3b\\xbd\\x07\\x31\\xe6\\x37\\x57\\x57\\x1b\\x0e\\x37\\xca\\xc9\\x9e\\xd0\\x1f\\xd2\\x14\\xcb\\xd4\\xfe\\xb9\\x77\\xe8\\x56\\xe0\\xa1\\xa7\\xef\\x0c\\x40\\x8c\\x20\\xe0\\xdd\\xaf\\x1f\\xd8\\xf0\\x28\\xcf\\xa0\\x8c\\x85\\x0f\\xa7\\x09\\x0d\\xca\\x8c\\xdd\\xe0\\xcb\\x69\\x03\\xda\\x18\\xc6\\x29\\x0c\\x66\\xa1\\xc0\\xae\\x0a\\x08\\x4b\\xf2\\x50\\xc5\\x1a\\x9d\\x03\\x5e\\x5b\\x16\\xec\\x61\\x66\\x36\\xaf\\xb9\\xb5\\xbc\\xe3\\x6a\\x77\\x5f\\xe2\\x17\\x5b\\xcc\\x2e\\xe0\\x72\\x20\\x83\\x4e\\xeb\\x31\\xca\\xee\\x50\\xe9\\xf8\\x06\\x3f\\xb1\\xfc\\x84\\x68\\xae\\x25\\xe3\\x96\\x67\\x89\\xa6\\xd8\\xdf\\xfe\\x08\\xa6\\xf7\\xa1\\xe6\\x72\\x6f\\x93\\xae\\x74\\x82\\xde\\x02\\x62\\xbb\\x1f\\x8d\\xe0\\xc9\\x5a\\x99\\xec\\xb9\\x56\\x84\\xd4\\x4b\\x3f\\x1a\\x33\\x2a\\x18\\xd2\\xcd\\x3d\\xcf\\x25\\x3c\\x33\\xd7\\x35\\x52\\x2f\\x79\\x6b\\x65\\x1c\\x9a\\x63\\x3a\\x8e\\xbe\\x95\\xd0\\x2b\\xc0\\x46\\x58\\x25\\xee\\x54\\x1a\\x7d\\x92\\x7b\\xb5\\xb9\\x0a\\x6d\\xb5\\x49\\x9f\\x8d\\x99\\x3a\\xb4\\x04\\xb1\\x65\\x0b\\x75\\xe7\\x92\\xa7\\xc8\\x34\\xeb\\x41\\xf0\\x47\\x01\\x38\\xb0\\xf5\\x78\\xa0\\x4c\\x9b\\xa5\\xad\\x95\\x0a\\xc7\\xc9\\xb5\\xd3\\x28\\xf3\\x40\\x8b\\x64\\x5a\\xd9\\xc6\\xbf\\x19\\x6d\\xd9\\x61\\x44\\x55\\x96\\xbc\\x78\\xf2\\x84\\xb8\\x91\\x4b\\x2a\\x8c\\xf9\\xb7\\xbd\\x3a\\x71\\x6d\\x8f\\x14\\x4b\\xb6\\xb1\\x5d\\x83\\x10\\x23\\x71\\x3b\\x5e\\x41\\xfd\\xa9\\xb5\\x87\\xff\\x9d\\x6c\\xc4\\x3c\\x08\\xd3\\x5a\\x70\\x7f\\x49\\x52\\x83\\xe1\\xac\\xe9\\x60\\x48\\x7e\\x7f\\x02\\xb7\\x54\\x3b\\x68\\xa7\\x31\\xa2\\x9b\\xf3\\xbe\\x14\\xb6\\xe9\\xc3\\x71\\x74\\xa9\\xf4\\x6f\\x56\\x11\\x99\\xdb\\xd2\\x7b\\x46\\xbf\\xe6\\x22\\x43\\xe0\\xc1\\x1c\\x0e\\xdf\\x13\\xb6\\x4f\\x41\\x1c\\x8e\\x8e\\xce\\xd3\\x5d\\x84\\x28\\xf7\\x9f\\x10\\xea\\xcf\\xfb\\x72\\x34\\xe5\\x46\\x41\\x3d\\x1e\\xb0\\xfa\\xd8\\x8c\\x0e\\x93\\x85\\x93\\xb4\\x3b\\x5e\\xe0\\xe4\\x28\\x5d\\x4d\\xdd\\xf5\\x29\\x5d\\xbf\\x1a\\x3d\\xdb\\xe9\\xf4\\x13\\x4d\\xd7\\x6d\\x3d\\xe7\\x04\\x62\\xc2\\xf0\\x4f\\xe0\\xae\\xbd\\xf5\\x9a\"},\n{{0x97,0x76,0xa4,0x67,0xfa,0x14,0x00,0x73,0x54,0x12,0xa7,0x9b,0x49,0x5f,0x9f,0xca,0x07,0x8c,0xe1,0xd8,0x7a,0x85,0x30,0xd8,0x5c,0x26,0x05,0x5d,0x3a,0x39,0x44,0x88,},{0xc7,0xdb,0xe0,0xe4,0x1c,0x0a,0x31,0xc0,0x94,0x27,0x93,0xff,0xd1,0x42,0xd8,0xb9,0x5c,0xc8,0x2e,0x5c,0xaa,0x92,0xa3,0x79,0xba,0x23,0xf6,0x44,0xed,0xf2,0x24,0xda,},{0xe1,0x31,0x7b,0xa2,0xa1,0x23,0xae,0x3b,0x29,0xe7,0xb6,0x0e,0x8e,0x93,0xbe,0xed,0xd7,0xa0,0x84,0x51,0xa0,0x13,0x69,0x5b,0x6d,0xcf,0x35,0x8e,0x40,0x34,0x02,0x6d,0xc7,0x40,0x37,0xaf,0xbd,0xd2,0x17,0xff,0x4b,0x14,0x8b,0x02,0x91,0x38,0xf4,0xbc,0xc8,0xf9,0x83,0x6a,0xbb,0xae,0x7e,0x62,0x76,0xe9,0xe7,0x69,0xdb,0xd8,0xf0,0x07,},\"\\xd7\\x85\\x53\\xa1\\xb7\\x05\\x5b\\x58\\xb2\\x13\\x10\\x1b\\x1c\\x84\\xc5\\x3e\\x16\\x4e\\x39\\xc6\\xe9\\xd3\\x6d\\xb4\\x3f\\x30\\xe1\\x9e\\x2a\\x12\\x5a\\x9a\\x67\\x70\\x9e\\xaf\\xef\\x96\\x4f\\xa5\\xba\\xb7\\x26\\x1d\\xdb\\x3a\\x8a\\x01\\x88\\x45\\x7d\\xfb\\xf5\\x15\\x9c\\x40\\xe5\\x1d\\xa8\\x20\\x84\\x83\\x24\\x57\\x81\\xd7\\x13\\x1e\\x23\\xa8\\xbe\\xe5\\xe5\\x06\\x33\\x18\\x16\\xb9\\xde\\xee\\xfe\\x6e\\x55\\x6e\\x3f\\x0c\\x95\\xc6\\x68\\xd1\\xbe\\xdb\\x7d\\xa6\\x35\\x06\\x54\\x58\\xad\\x20\\x46\\x70\\x12\\xf5\\x9f\\x17\\x13\\x52\\x06\\x80\\x20\\xce\\x3c\\x75\\x87\\x86\\x93\\xf6\\x43\\x7b\\xc4\\xa0\\x9f\\x13\\xb9\\xb0\\xf0\\xcd\\xda\\xf1\\x69\\x1b\\x87\\x2f\\x82\\x00\\x80\\x93\\xeb\\xfb\\xe2\\x33\\xd0\\x31\\x3e\\x72\\xc8\\x63\\x2d\\x7d\\x17\\x93\\xf0\\xb8\\x1c\\x76\\x88\\xf5\\x44\\x70\\x33\\x0f\\x04\\xe6\\x48\\x60\\xe6\\x44\\x6b\\xfc\\x6d\\x96\\xc8\\x75\\x69\\xbf\\x18\\x2f\\x0f\\x43\\x85\\xaf\\x48\\x5d\\x42\\x99\\xca\\xc0\\x4e\\x06\\xba\\x47\\x34\\x65\\x56\\x6c\\x47\\x7f\\x07\\xb9\\xdb\\x27\\x7a\\xb4\\xa9\\xde\\x2f\\xb2\\xde\\xd0\\xa5\\x01\\x1c\\xd0\\x6d\\x67\\x5c\\x08\\x00\\xb3\\x4f\\x55\\xbc\\xf3\\xec\\x72\\xd2\\x1c\\xa1\\x50\\xc8\\xbf\\x23\\x61\\x28\\x7b\\xe8\\x1e\\xfa\\xbb\\x96\\xd8\\x68\\x8a\\x1d\\xee\\x3f\\x43\\x0f\\x06\\xf6\\x37\\xdf\\xd0\\x6f\\x15\\x14\\x64\\xa0\\x5c\\x95\\xf5\\xfe\\x76\\xaf\\x2e\\x06\\xd0\\x12\\x3f\\x69\\x48\\xa2\\x6b\\x3b\\xe8\\x35\\x04\\x5a\\xa2\\x68\\xcc\\x1b\\xe9\\x76\\x69\\x71\\x07\\x77\\x02\\x08\\xa7\\x56\\x8f\\x02\\x5c\\x2d\\x53\\xc7\\x19\\xe5\\x24\\xcc\\x36\\x9d\\x9b\\x4a\\x33\\x7d\\x8f\\xd1\\xef\\x34\\x5b\\x9b\\xca\\x57\\xfb\\xd7\\xb6\\x5a\\x6b\\x99\\x7c\\xad\\x3f\\xce\\x4c\\xf0\\x6f\\x2c\\xa4\\x3e\\xbe\\x29\\x86\\xd0\\x96\\x82\\xd4\\x7c\\x92\\x2b\\x2c\\xb7\\x56\\x9d\\x98\\xde\\x97\\xa6\\x16\\x4f\\x54\\x70\\xee\\xc7\\x1c\\xed\\xa5\\x20\\xcc\\xec\\x77\\x32\\xbd\\x01\\x68\\x9e\\xf8\\x16\\x56\\xe9\\xf6\\xd0\\xc5\\x8a\\x89\\x55\\x58\\xae\\xe8\\x63\\xf5\\x46\\x9e\\x7a\\xb9\\x79\\x15\\xbf\\xe0\\xb8\\x0a\\x06\\x4c\\x65\\x9b\\x18\\x30\\x31\\xf7\\xf1\\xa8\\x6f\\xb1\\x1a\\x9d\\x52\\x8c\\x28\\x15\\xdc\\xaa\\x2f\\x0d\\xec\\x3d\\x21\\xa8\\x82\\xe1\\x06\\xe2\\x04\\x93\\xee\\x0a\\xcb\\x77\\x08\\xea\\xa2\\x91\\x25\\x74\\xae\\x97\\xbb\\x28\\x8b\\x41\\xfc\\x09\\x25\\x05\\x3a\\x29\\xb0\\xbf\\xbc\\x0e\\xba\\xe8\\xd6\\x3c\\xc0\\xb4\\x6e\\x37\\x38\\x04\\x6c\\x5a\\x20\\x25\\x30\\xbc\\xb1\\x5b\\x18\\x7a\\x72\\x85\\x4a\\xa2\\xd8\\xa7\\xa7\\x6c\\x89\\xa8\\x9a\\x5d\\xb4\\x60\\x32\\x07\\x4e\\x1b\\xd7\\xde\\x77\\xef\\x20\\x65\\xa0\\x8f\\x38\\x9d\\x78\\x3c\\xf7\\x59\\xeb\\xd5\\xa6\\x3a\\x44\\xd9\\x19\\xf9\\x48\\xf5\\x60\\xc3\\xe9\\x4c\\x42\\x39\\xe2\\x74\\xe0\\x51\\xa2\\x04\\x85\\xa4\\x30\\xcb\\xd5\\x29\\xf3\\x13\\xd9\\xf7\\xed\\x67\\x9a\\x34\\x18\\x7b\\x24\\xf8\\x41\\x30\\x87\\xa9\\x02\\x1e\\x47\\x31\\x73\\x0f\\x5f\\x46\\x1f\\xc5\\xaa\\xd6\\x65\\x4d\\xfa\\x1c\\x05\\x04\\xd2\\x61\\x24\\x70\\x7e\\x63\\xee\\x57\\xf9\\x31\\xb2\\x78\\x59\\x08\\xf8\\x6b\\x10\\x4b\\x3e\\xcb\\x96\\x00\\x02\\x51\\xd0\\x6c\\xe1\\xfa\\x45\\xe4\\xcd\\x6d\\xf9\\x1a\\xc1\\x5b\\xbf\\x7c\\xa3\\xc3\\xeb\\x8e\\xe0\\x82\\x76\\x12\\xa2\\x9e\\xcb\\x7a\\x36\\xd5\\x47\\x0c\\x40\\x50\\x51\\x82\\xfa\\x9a\\xc9\\x13\\x57\\x0d\\x0c\\x10\\x50\\xd9\\xa4\\x34\\x55\\xcb\\x7b\\xdc\\x17\\xd1\\x69\\x80\\x5f\\x01\\x89\\x56\\xf8\\x54\\xf8\\x91\\x9b\\xbf\\xb7\\x19\\xe1\\x86\\x7b\\x36\\xa6\\x4a\\xab\\xcd\\xb8\\x07\\xf4\\x8d\\xcc\\xc0\\x67\\x2f\\x67\\x88\\x74\\x50\\xb3\\xf3\\xe9\\x58\\xd7\\x84\\x99\\xe0\\xd1\\xab\\x36\\x8a\\xa4\\x94\\x42\\xe5\\xe8\\xa3\\x32\\xbf\\xfd\\x44\\xc1\\x69\\xea\\x67\\x62\\x9c\\x85\\x72\\x4d\\xb6\\xf1\\x58\\x6b\\x6c\\x6b\\x5b\\xe4\\x86\\x4d\\xfd\\x53\\xda\\x7c\\x0f\\x7b\\x8b\\xb3\\x57\\x31\\x16\\xbe\\x50\\x77\\xd3\\x32\\xbd\\x12\\xa6\\x30\\x0f\\x3a\\x68\\xa8\\x98\\x66\\xb4\\x79\\xec\\x2b\\xaa\\x27\\x7f\\x9f\\x56\\xf6\\xe1\\xd4\\x9d\\x74\\x1e\\xb3\\x22\\x03\\x5f\\xf8\\xcb\\x1d\\xe8\\x5c\\x8d\\xc8\\x7a\\xc8\\xe6\\xe4\\xc5\\xd2\\x0b\\xfb\\x6d\\x31\\x7a\\xb1\\x25\\x93\\x0c\\x42\\x60\\x9b\\xe3\\xae\\x82\\x24\\x2a\\x9e\\xf0\\x56\\x88\\x58\\xd8\"},\n{{0x09,0xd8,0x12,0x26,0x97,0x12,0x6d,0xfc,0x7e,0x11,0x68,0x5a,0x04,0x12,0x3f,0xdf,0xb4,0x7c,0xcd,0xdb,0x44,0x99,0xd8,0xa3,0xae,0xf4,0x18,0xcb,0x65,0xae,0xd7,0xa7,},{0xf8,0xdd,0xb1,0xc0,0x0f,0x6e,0x0f,0x4b,0xea,0xa6,0xfc,0x38,0xe5,0xd0,0xa5,0x77,0x5e,0xe2,0x8c,0x80,0xdb,0xde,0x3f,0x0c,0x79,0x30,0xa3,0x3a,0xad,0x71,0x50,0xf3,},{0x18,0xcf,0xaf,0x6d,0xc8,0xe4,0xe8,0x58,0x2b,0xce,0xfe,0x0c,0xdc,0x6f,0xce,0xfe,0x6a,0x4a,0x87,0xea,0x62,0x95,0x85,0xf3,0x7d,0x2f,0xba,0x44,0x6b,0x3a,0xeb,0xd4,0x52,0x42,0x63,0x82,0xda,0x0d,0x49,0x1c,0x39,0xcb,0x7d,0x54,0xd2,0x73,0x00,0x5d,0xc1,0x32,0x12,0x15,0x68,0xd2,0xab,0x67,0x45,0x20,0xad,0xda,0x75,0x23,0x84,0x0d,},\"\\xa0\\xd8\\xd8\\x79\\x8e\\xba\\x22\\xf5\\x67\\x60\\xc3\\x06\\x43\\xe9\\xfc\\x67\\x95\\x54\\x7e\\xa5\\xf2\\xf2\\xbb\\xd1\\x1c\\x03\\x92\\xb2\\xeb\\xf7\\x11\\xac\\xa2\\x2f\\x08\\x24\\x19\\x9f\\xc3\\x18\\x8a\\x45\\xbd\\xff\\xde\\x70\\xec\\xe9\\xab\\x15\\xa5\\xea\\x89\\x62\\x2a\\x58\\x71\\xe0\\xef\\x76\\x85\\xd1\\x0f\\x12\\x74\\xcc\\x19\\x5b\\x4f\\xda\\x81\\xf8\\x79\\xd1\\xe9\\xbf\\x42\\xf8\\x73\\xb2\\x0a\\x85\\x9c\\x23\\x3f\\x9e\\x49\\xad\\xbf\\x05\\x77\\x31\\xe1\\x13\\x35\\xe9\\xb6\\xd8\\xed\\x0e\\x06\\x9e\\x13\\x4e\\xc4\\x61\\xca\\x88\\x90\\xd7\\xb0\\x47\\x3c\\x40\\x5e\\x8a\\x9d\\x95\\xd1\\x57\\x11\\xb1\\x24\\x76\\x10\\x37\\x62\\xc6\\x26\\xd9\\xf2\\xaa\\x5d\\xd5\\x19\\xbd\\x82\\x5b\\x60\\xb3\\x23\\x4e\\xbf\\x65\\x1e\\x0d\\x19\\x33\\x37\\x1c\\x52\\xbf\\xd8\\xce\\x33\\xfc\\x36\\xbb\\xa3\\x28\\xf7\\xf3\\xf2\\xcc\\xc0\\x10\\x00\\xa8\\x99\\x04\\xaf\\x37\\xe4\\xe1\\xe9\\xe1\\x5f\\xff\\xab\\x5c\\x2b\\x0c\\x47\\xf3\\x7c\\xdc\\xb0\\x68\\xdb\\x33\\xac\\x36\\xa5\\xf0\\xd6\\xde\\x12\\x03\\xfb\\xf8\\x94\\x93\\x24\\xbd\\x3e\\xfd\\xa0\\xf9\\x88\\x9d\\xb0\\x0d\\xa2\\x31\\x7b\\x49\\xfd\\x18\\x69\\x99\\xdf\\x7f\\xcd\\xc3\\xcb\\x4e\\x1d\\x18\\xfa\\xa2\\x54\\x56\\x1c\\x25\\x11\\x78\\xb8\\xd3\\x3f\\xdc\\x9d\\xcc\\xd8\\xd2\\xd7\\x21\\xb9\\x3a\\x53\\x6c\\xcd\\x3c\\x0e\\x9c\\x85\\x63\\x37\\xf1\\x95\\xee\\xe7\\xda\\x9a\\x7f\\x6b\\x0a\\x42\\xb7\\xc5\\x41\\xc6\\xa6\\x8c\\x59\\x5b\\xf3\\x47\\x04\\xd9\\xfe\\x3a\\x56\\xd2\\xec\\x84\\x81\\xd5\\x77\\xc9\\x6e\\xcc\\x08\\xb8\\xe4\\x0a\\xcd\\xbf\\x05\\x0e\\x20\\xc6\\x83\\xf3\\x9c\\x41\\x4e\\x8c\\xbf\\xcf\\x4a\\x01\\x52\\x31\\x4c\\x05\\x98\\x7a\\x83\\xbd\\xe3\\x02\\x5b\\x73\\x5c\\xca\\x30\\x23\\xab\\xc5\\xfe\\xb7\\xe0\\x0d\\x02\\x36\\xb4\\xf2\\x4b\\x15\\xe6\\x79\\xdb\\x05\\x2c\\x8d\\x2f\\xdd\\xb3\\xbe\\xf8\\x66\\x3a\\x6d\\xf8\\x19\\xa9\\x81\\x55\\x27\\xa1\\xa2\\xf6\\x0a\\x0f\\xa4\\xe5\\x07\\x8d\\xdc\\x6d\\x43\\x5f\\xe8\\x92\\x87\\xb3\\x0f\\xfd\\xeb\\x5d\\x9a\\xe0\\x5d\\x1a\\x86\\x90\\xfb\\xc7\\x59\\x0a\\xad\\x57\\xd4\\x3d\\x22\\xc1\\x2a\\xce\\x2c\\x81\\x96\\x88\\x8e\\x35\\x4e\\x9f\\x78\\x2f\\x5d\\xbb\\x44\\x14\\x9e\\x83\\xfb\\x8b\\xbc\\x9d\\xa6\\xd8\\x9c\\xe2\\x06\\xc1\\xe2\\xb6\\xb2\\xb2\\x8f\\x93\\x3f\\x3e\\x5f\\xf1\\x17\\x5a\\x31\\xa8\\xff\\x5d\\x31\\xe6\\x5c\\x8b\\x00\\xc5\\xba\\x46\\x22\\x24\\xa1\\xe0\\x9d\\x4f\\x09\\xcb\\x40\\xfc\\x87\\xc3\\x6e\\x7d\\x28\\x5c\\x77\\x4a\\x96\\x97\\x62\\x03\\x65\\x18\\x28\\xe7\\x83\\x62\\x88\\x47\\xac\\x51\\x2e\\x5d\\x1c\\x35\\xb3\\x5b\\x03\\x01\\x71\\xf9\\x23\\x96\\xf5\\xff\\xaf\\xf5\\x85\\xce\\xad\\x04\\xb6\\xae\\x21\\x0d\\x80\\x70\\x7c\\xc6\\x83\\x2d\\x98\\xa2\\x0d\\x3a\\x94\\x76\\x48\\xda\\x26\\x04\\x93\\x7f\\xef\\xd2\\x5a\\x9f\\xe0\\xfc\\x5c\\xac\\x08\\x3d\\xdd\\x7d\\x20\\x75\\x30\\x7f\\x4f\\x38\\x26\\x64\\xf6\\x87\\xdc\\xe8\\xc6\\x55\\xde\\xd9\\xc1\\x2d\\x48\\xff\\x76\\x01\\xdf\\x2a\\x48\\xd3\\x7f\\xe2\\x14\\x97\\x08\\x44\\xc0\\x75\\xf2\\xea\\xb0\\x02\\x05\\x9f\\xc2\\x27\\x1e\\x61\\x7c\\x96\\x57\\xa0\\x1b\\xec\\x1d\\xd3\\x8f\\x6c\\x28\\xba\\x8a\\x61\\x7b\\xd3\\x08\\x51\\xe3\\xf9\\xdb\\xac\\x90\\x44\\x18\\xdf\\x1d\\x02\\x15\\xad\\x45\\xdf\\xc9\\xf0\\x2b\\x5c\\x5e\\x9f\\x9b\\xbc\\x6d\\xe8\\xb0\\x7a\\xf0\\xbd\\x1f\\x7f\\xa8\\x92\\x25\\x44\\xf1\\x2d\\x2a\\x3e\\x1a\\xad\\xff\\x7e\\x9c\\x6b\\x93\\x32\\x0c\\x3a\\x61\\xef\\x33\\xda\\x07\\xeb\\x87\\xb1\\x61\\x7f\\x9e\\x77\\xd7\\x70\\x2e\\x55\\x8b\\xc7\\xd8\\x12\\x2e\\x0d\\xfe\\x2a\\xe8\\x3e\\x83\\x6c\\x5b\\x1a\\x62\\xaa\\x58\\x5c\\x0d\\xff\\xe7\\x16\\xf7\\x46\\x3c\\x0b\\x33\\xda\\x5b\\x1e\\xda\\x55\\x6a\\x1e\\xf1\\xe4\\x50\\x42\\xc7\\x9b\\xdd\\x3e\\xc3\\xcb\\x88\\x63\\xa7\\xbc\\x1b\\x0f\\x7e\\x1c\\x05\\xbd\\x99\\x20\\xf0\\x5b\\x4e\\xda\\x86\\x51\\x77\\x05\\xed\\x07\\xf6\\xdc\\xa7\\xbb\\x00\\xae\\x04\\x56\\xe6\\x78\\x7d\\x9f\\xae\\x8e\\xde\\x4e\\xcd\\x0b\\xc5\\x72\\xeb\\x5c\\xc6\\xd1\\x9e\\x89\\x1f\\x1b\\xcb\\x22\\x9e\\x94\\x09\\xe0\\x65\\x74\\xc7\\xdf\\x05\\x81\\x73\\xcb\\x58\\xc3\\xfd\\xf2\\x0f\\x3f\\xf1\\x7c\\x37\\x05\\xaf\\x62\\xd9\\xb7\\x22\\x5c\\x57\\x43\\xf6\\x00\\x60\\x7f\\x77\\xcb\\xe7\\xd6\\xe7\\x61\\x8a\\xbc\\x79\"},\n{{0x10,0x20,0x1b,0xf0,0x08,0x43,0x67,0x59,0x0d,0xe6,0x74,0xcc,0x0e,0xd2,0x64,0x8e,0xc2,0x5d,0x3b,0xa8,0xdb,0x40,0xd0,0x0e,0xde,0x15,0x33,0x98,0x50,0x8b,0xc1,0x26,},{0xba,0xdb,0xd0,0x5e,0x5f,0x79,0xe3,0x11,0x69,0xf7,0x40,0xba,0x46,0xa5,0x89,0x10,0xa1,0xb7,0x77,0x05,0xaf,0x45,0x71,0x7b,0x2a,0xf8,0x08,0x56,0x45,0x7c,0x58,0xc9,},{0xf1,0xd9,0x96,0x58,0x8b,0x29,0x8f,0x27,0x1e,0x97,0x0c,0xeb,0xd2,0xa1,0xb3,0x39,0x97,0x9c,0xd2,0x9d,0xdd,0xee,0x36,0x45,0xd0,0x7f,0xab,0x8a,0xb4,0x65,0xdd,0xe3,0xe9,0x86,0x67,0xec,0x01,0xad,0x7f,0x1c,0x0a,0x65,0x92,0xe0,0x69,0x7e,0x66,0x5c,0x72,0xfd,0x38,0x14,0xdb,0xe1,0x89,0xed,0x5f,0x4e,0x76,0xc7,0x94,0xe5,0x38,0x09,},\"\\x7b\\xb1\\x47\\x06\\x17\\xd1\\x1e\\x45\\xeb\\x60\\x2a\\x82\\x9a\\xd7\\x73\\xee\\x2b\\xb7\\xe6\\xb8\\x8d\\xa4\\xc0\\x4a\\x72\\x16\\xa4\\x50\\xf8\\x49\\x93\\xa4\\x98\\xcb\\xd3\\xb9\\x25\\x40\\x28\\xf2\\xf9\\x9f\\xc2\\x1a\\x23\\x28\\x8b\\xdc\\x1e\\x15\\x1a\\x72\\xa9\\x13\\x0c\\x3d\\xed\\xda\\x1b\\xbb\\xcc\\xd4\\xe6\\xc0\\xf4\\x8a\\xe9\\xf3\\x53\\x18\\xcb\\xef\\xc9\\x59\\xf4\\x05\\x04\\x5e\\x6e\\x0b\\x5f\\xb2\\xe7\\x38\\xf2\\xb7\\x65\\xbe\\x11\\xb1\\xb6\\xa0\\xf1\\xe8\\x31\\x95\\x49\\xd9\\x5f\\xa8\\xd1\\xdf\\x81\\x67\\xcd\\x4a\\x77\\x17\\xae\\x16\\x36\\xa9\\xdf\\x54\\xd9\\x6e\\xaf\\x2d\\x63\\x23\\x69\\x00\\xfd\\x11\\x33\\x82\\x52\\xa5\\x00\\x8d\\x5d\\x48\\x0e\\x2b\\x1e\\x98\\x61\\xd1\\xf7\\x06\\x88\\xc4\\x7e\\xae\\x46\\x89\\xda\\x01\\xa4\\x7d\\xa3\\xdf\\xb6\\xd2\\xba\\xb3\\xcd\\xf5\\x05\\xee\\x5d\\x80\\x1a\\x15\\x2c\\x26\\x70\\x93\\xd1\\x7e\\x9b\\xf7\\x13\\x7a\\x6e\\xe7\\xb8\\x34\\xd0\\x08\\x55\\x00\\xe4\\x01\\xc1\\x7f\\x32\\x86\\xc1\\x57\\x5d\\x1c\\x01\\x00\\xfa\\x98\\x07\\x63\\x0c\\x4a\\x99\\x06\\x54\\xc1\\xe7\\x1a\\x8b\\x71\\x56\\x27\\xbb\\x13\\xd4\\x42\\xc8\\x4a\\x44\\x98\\x44\\xc4\\x04\\xb8\\x72\\xbf\\xba\\xc7\\x18\\xa4\\x8d\\x0e\\xa0\\x94\\x5c\\x77\\x16\\x6a\\x53\\x13\\x9b\\x0f\\xf0\\x09\\x81\\x34\\x76\\x4f\\x9e\\xcd\\xb8\\x8e\\xab\\xe0\\x7c\\xcb\\x2c\\xce\\xd4\\x95\\x5e\\x08\\x24\\x9b\\x2f\\x57\\x70\\xad\\x41\\xfc\\xcd\\x7b\\x5b\\xb3\\x72\\xe6\\xc3\\x37\\x67\\xe0\\x7f\\x5b\\xe7\\xd1\\x07\\x12\\xde\\x81\\x84\\x1b\\x13\\x4e\\x19\\x3d\\xf0\\x77\\x6a\\x0f\\xc1\\x56\\xff\\x5d\\x0e\\x96\\xf4\\x0a\\x70\\x47\\x53\\xe1\\x14\\x5e\\x9f\\xa0\\x83\\xc4\\xdd\\xee\\xf4\\x41\\x62\\x34\\xf6\\xe1\\xa2\\x38\\x2c\\x8e\\x5b\\x3a\\xd4\\x05\\x45\\x8e\\x89\\xd2\\xf4\\x93\\xa4\\xd7\\xc2\\x9a\\x23\\xde\\x21\\x07\\x48\\x5b\\x7f\\x56\\x35\\x01\\x24\\xe7\\xe0\\xd6\\x95\\xc5\\x22\\xb6\\xde\\x7a\\x92\\x47\\xa2\\x92\\x4c\\xe6\\xf2\\x86\\x32\\x36\\xc1\\x0c\\xc2\\x12\\x64\\xad\\x54\\x59\\x0d\\x31\\x47\\x63\\xea\\x1a\\x19\\xaf\\xac\\xd9\\x0e\\xba\\x95\\x58\\x70\\x40\\x7e\\x8c\\x63\\x65\\xa1\\x43\\xa5\\xc1\\xb9\\xa8\\xbe\\x5e\\x4a\\x4d\\xca\\xdb\\x72\\xe0\\xd4\\x76\\x49\\xbd\\x53\\xab\\xd4\\x6b\\x5c\\x69\\x60\\xea\\xe2\\xca\\xb7\\x73\\x75\\x3c\\xc0\\xe0\\x4e\\x99\\x41\\x4b\\xc2\\xcb\\x30\\xf4\\x8b\\xb5\\x41\\x39\\xd0\\x66\\xe4\\x3e\\x2f\\x0e\\x1a\\x4a\\xe9\\x63\\x85\\x8b\\xef\\x96\\x7d\\xf8\\xc8\\x41\\x40\\xd2\\xd0\\x92\\x02\\xb4\\x06\\xd5\\xd8\\x5c\\xb7\\xa9\\x6c\\xc5\\x7f\\x23\\x3e\\xb2\\x18\\x7f\\xfd\\x02\\xf9\\x4e\\x92\\x29\\x7b\\x5e\\x69\\xd9\\x69\\xd3\\xa5\\x93\\x6e\\xfe\\x49\\x29\\x14\\x4f\\x25\\x8b\\xfb\\x39\\xdd\\x0c\\xe2\\x63\\x59\\xc4\\x54\\x9f\\xc2\\x18\\xa0\\xaa\\x54\\xf3\\x1b\\xd5\\x51\\xb8\\x78\\x1a\\xcb\\xbf\\x61\\xcb\\x3f\\x73\\x2c\\xda\\xf6\\x22\\xc6\\xa6\\x91\\x88\\xcf\\x55\\x7a\\x3a\\x92\\xed\\x15\\x3e\\x69\\x12\\x5a\\x40\\x90\\xac\\x45\\x15\\x36\\xa0\\xe9\\xa6\\x3a\\x41\\x78\\x29\\x10\\xff\\xcc\\xb4\\xe8\\x50\\x02\\x11\\x23\\xff\\xd1\\xf3\\xbf\\x39\\xc7\\x34\\x60\\xa6\\x5c\\xcf\\xe4\\xdb\\xa9\\xbd\\xef\\xb5\\xd5\\xf4\\xda\\x6c\\x46\\x9a\\xa1\\x32\\x2f\\xa2\\x70\\x43\\x23\\x83\\x63\\xee\\x72\\x91\\x86\\x88\\xd7\\xca\\x1c\\x4c\\x29\\x52\\xe4\\x30\\xd5\\x63\\x25\\x6b\\xb8\\x6d\\x35\\x0a\\x35\\xee\\x82\\xe0\\x15\\x04\\x74\\x7f\\x31\\xd0\\x2e\\x03\\xae\\xdd\\xa5\\x46\\xd0\\xf1\\xb2\\xf4\\x51\\xb8\\x70\\x82\\x16\\x02\\xd0\\x0e\\x81\\x90\\x36\\xad\\xe5\\xa7\\xc7\\xfc\\xd2\\x1a\\x6d\\xe6\\xaf\\x35\\xb1\\xf9\\x63\\x2a\\x70\\xaf\\x65\\xdf\\x64\\x45\\xf6\\xfa\\xdf\\xbc\\x0f\\x41\\x67\\x55\\xc8\\x24\\x66\\x40\\xe5\\x6b\\x85\\x6b\\x66\\xdd\\xd9\\x2a\\x60\\xc0\\x35\\x38\\x22\\x1d\\xc8\\xfb\\x14\\x2c\\xe2\\xdb\\xac\\xdb\\x74\\x25\\xf3\\x3c\\xb8\\x5d\\x85\\x0c\\xc0\\x2c\\x31\\x5c\\xfc\\x11\\x1f\\x6f\\x65\\x1d\\xde\\x1b\\xdb\\x67\\xfb\\x20\\x8e\\x1f\\x6b\\xde\\x78\\x4d\\xdc\\xf7\\xbd\\x18\\xc8\\x05\\x1a\\x2e\\x0b\\xbf\\x10\\x18\\xb8\\xf3\\x95\\x36\\xc5\\x89\\xde\\x65\\xea\\xdc\\x6c\\xf3\\x79\\xb7\\x7c\\xad\\x13\\xf9\\x08\\x9c\\xb3\\x23\\xfb\\x2e\\x94\\x3d\\x06\\xcd\\xd1\\x07\\x05\\xc1\\x21\\x13\\x4c\\x65\\x48\\xdc\\x53\\x41\\x5f\\x8c\\x37\\x0e\\xc6\\x90\"},\n{{0xc4,0xaa,0x42,0x52,0x46,0xb5,0x17,0x3f,0x5e,0xf8,0x98,0x15,0x2e,0xca,0x3d,0x09,0x2b,0xb4,0xc2,0xdd,0x02,0x85,0x3f,0xcf,0xc7,0x17,0x83,0x99,0xf4,0xe2,0xf7,0x58,},{0x29,0xb7,0x7a,0x30,0x75,0xf4,0x19,0x24,0x3c,0x0c,0x1b,0xc3,0x96,0x59,0xd7,0x31,0x17,0xac,0x00,0xe5,0x5e,0x8d,0xe3,0x8f,0xe9,0x82,0x9a,0x87,0x9c,0xc5,0xb8,0xa0,},{0x5d,0x85,0x45,0xa4,0xbe,0x3f,0xd6,0xda,0x25,0x78,0xc2,0xec,0xcb,0x64,0x8d,0x83,0xfc,0xfe,0x58,0x71,0x33,0xfa,0x7a,0xe4,0xa1,0xcf,0xca,0x9a,0xe6,0xda,0xa4,0x92,0x59,0xc9,0x52,0x04,0x4a,0x85,0xa2,0x0b,0x6f,0x53,0x24,0xf8,0x27,0xdb,0xa2,0xd1,0xa8,0x38,0x8c,0x40,0xa9,0x28,0xb9,0x50,0x91,0x3c,0x63,0x4f,0xb3,0x09,0x27,0x07,},\"\\x7d\\xf9\\x78\\xa1\\xf4\\x97\\x68\\x38\\xff\\xed\\x74\\x49\\xa4\\xdc\\x13\\x8b\\x60\\x4f\\x4b\\x2a\\x4a\\xe6\\x89\\xce\\x75\\x01\\x8e\\xbc\\xcd\\xab\\x2e\\xaa\\x0b\\x60\\x76\\x8f\\x72\\x08\\x25\\x7f\\x2b\\x28\\xe7\\xaa\\x09\\xbf\\x6c\\x05\\x88\\x8d\\xa4\\x6f\\xd3\\x96\\xd1\\xc8\\x03\\x01\\x17\\x50\\xe3\\x0e\\xb4\\x84\\x87\\x0c\\x88\\x06\\x97\\x76\\x96\\xf1\\x2e\\xbb\\x9f\\xee\\xb4\\xca\\xf9\\x2a\\x02\\xdb\\xaa\\x22\\xbb\\xff\\x63\\xf8\\x42\\xc3\\xba\\x14\\x7b\\xca\\x7c\\x00\\x31\\x42\\x78\\xac\\xd0\\xdb\\x17\\x35\\x69\\xf4\\xe3\\x65\\x27\\x95\\x8e\\xf6\\xf1\\x00\\x2b\\xd3\\xcd\\x01\\xf4\\x07\\xa8\\x65\\x31\\xed\\xcb\\xd9\\xf3\\x1b\\x3a\\x4a\\xb8\\x80\\xa4\\xf5\\xb5\\x2b\\x42\\xd0\\xd4\\xa1\\xba\\x66\\xa2\\x09\\x86\\x51\\xae\\x3e\\x6c\\x91\\x51\\xf4\\x02\\x73\\x28\\x5f\\x7f\\x6a\\x4e\\x81\\x60\\x6b\\xf9\\x80\\xf6\\x89\\x50\\x4b\\x42\\x08\\x0f\\xdb\\x97\\xc7\\x28\\x46\\xfb\\xa9\\x04\\x7c\\x7e\\x66\\x0b\\xa5\\xc6\\xbf\\x12\\x6a\\x9a\\x59\\x9e\\x25\\x71\\xfa\\x13\\x50\\x5a\\xf7\\x58\\x1b\\xfe\\xbc\\x16\\x51\\x3f\\x5c\\x94\\xdc\\x71\\x93\\x7e\\x6e\\x61\\xb3\\xea\\x10\\x93\\x9b\\x02\\xea\\x10\\x85\\x9f\\x32\\xd7\\x91\\x2b\\x9e\\x38\\x06\\xab\\xef\\x61\\x85\\xfc\\xff\\xa6\\x88\\x21\\x47\\x80\\x05\\xcb\\xfc\\x1d\\x63\\x7d\\xd0\\x20\\x42\\x56\\x20\\xa3\\x18\\x07\\x48\\x98\\xbd\\xc3\\x09\\x31\\xc5\\x9a\\xc0\\xc6\\x6c\\x4d\\x12\\x38\\xb0\\x97\\xcd\\x5b\\x17\\x0f\\x08\\x44\\x35\\xd4\\xba\\xe4\\x8a\\x03\\xd9\\x2f\\xd4\\x8f\\xc2\\xca\\xa4\\xff\\xc5\\x05\\xf1\\xbc\\xa5\\x16\\xfb\\xd6\\xe4\\xf8\\x88\\xcc\\xed\\x98\\x2a\\xe0\\xdd\\xb8\\x8f\\xc2\\x8a\\xa6\\x97\\xb7\\x07\\x1d\\x01\\x5b\\x0a\\xcb\\x28\\x09\\xb0\\x1d\\x1d\\x9c\\x7e\\x7b\\x53\\xee\\xe6\\x82\\x4c\\xc3\\x7c\\xce\\x5b\\x69\\x93\\xd8\\x8d\\x83\\xea\\xfc\\x2e\\x92\\x8a\\x6f\\x14\\x7d\\xb6\\xeb\\x80\\xb1\\xa6\\x9f\\x01\\x60\\x5b\\x04\\x6b\\xd2\\xfd\\x1d\\x92\\xc5\\x45\\x9d\\x6d\\x33\\x98\\xa9\\xca\\xa2\\x99\\xdd\\xd0\\xc3\\xba\\x2e\\x08\\x94\\x13\\x07\\xb1\\x20\\xcc\\x13\\x99\\x2f\\x70\\x03\\xac\\xed\\x14\\xa4\\xa4\\xd9\\x23\\xbb\\xb1\\x2f\\xc3\\x93\\xff\\xcf\\x92\\x0b\\x9f\\x6d\\x47\\x75\\xe9\\x4d\\x4a\\x51\\x22\\x67\\xfd\\x26\\xa6\\x99\\x7c\\x60\\x62\\xb4\\xc9\\x90\\x0f\\x98\\x62\\xb9\\xea\\x0c\\x8d\\x7d\\xf1\\x9f\\x05\\xc2\\xb6\\x04\\xaf\\x5b\\x98\\x64\\xfb\\x27\\x54\\xa8\\x07\\x3b\\xbb\\xfb\\x18\\x23\\x3e\\x6e\\x15\\x0f\\x72\\xa5\\x25\\xe3\\xa5\\x76\\x0f\\xcd\\xa7\\xd3\\x2a\\x60\\x03\\x4f\\x95\\x6e\\x3c\\xbd\\x34\\x36\\xc2\\x00\\x83\\x0b\\x3e\\x7a\\x14\\x57\\x12\\x20\\xbc\\xb6\\x27\\xd5\\xa4\\xbe\\x72\\xc2\\x0b\\x23\\x35\\x1b\\x2d\\x92\\x06\\x02\\xa5\\x1c\\x3e\\xb3\\x2c\\x12\\x37\\x03\\x9d\\xfb\\xff\\x43\\xc9\\x87\\xfd\\x85\\x63\\x77\\x7f\\x0e\\x5a\\x39\\xf8\\x14\\x6c\\x16\\x4b\\xdf\\xfc\\xe4\\x4f\\x3b\\x13\\xee\\x74\\xd6\\x4b\\xfd\\xcf\\x98\\x03\\xf0\\x3d\\xd0\\x17\\x2a\\xc4\\xfa\\x4b\\xf6\\xc7\\x83\\x9c\\xb1\\x1f\\x3d\\x34\\xba\\xef\\x0e\\x32\\xb5\\x49\\x42\\xfc\\x4f\\xa3\\x8f\\x47\\x3e\\x29\\x66\\xf4\\x91\\x1c\\x0e\\x80\\xd7\\x69\\x37\\xb2\\x5b\\x76\\x32\\x27\\x5b\\xa8\\x83\\x09\\x63\\x5a\\x60\\xdf\\x13\\x54\\x89\\x20\\x8d\\x3e\\x73\\x4b\\x67\\x2e\\xda\\x7d\\x2b\\xa2\\x15\\x79\\xab\\xa8\\xd8\\x86\\x0e\\xa7\\x64\\xfd\\x67\\xea\\xf9\\xc3\\x8e\\xa7\\x63\\x7d\\x1b\\xad\\x57\\xb2\\xf3\\xd7\\x82\\xb9\\x1e\\x1d\\x5d\\x92\\xac\\x30\\x0b\\xdb\\xa7\\xab\\x91\\x13\\xce\\x91\\x3d\\x0c\\x79\\x3c\\x12\\xa9\\xa7\\x26\\xe3\\xfc\\xab\\x05\\xcb\\x47\\x99\\x77\\x87\\x16\\x40\\x63\\x0d\\x45\\x9e\\x69\\xe8\\x1c\\xa5\\xcf\\x56\\xdd\\xb2\\xa0\\x61\\x1d\\x61\\xd4\\x81\\xc1\\xb8\\xce\\xf3\\x80\\x4b\\xd4\\xe5\\x75\\x4a\\x61\\xeb\\x49\\xb1\\x7e\\xf2\\xb0\\x3c\\x83\\x05\\x7b\\x5d\\x20\\xd8\\x82\\x05\\x8c\\x00\\xf5\\x4b\\x6c\\xca\\x86\\xbe\\x95\\x35\\x0d\\xd7\\xbc\\xb2\\x5e\\x4c\\x1c\\x46\\x58\\xf4\\x52\\x29\\xc8\\xbb\\x9f\\x5c\\xdf\\xcc\\x44\\x79\\x5c\\x97\\x8e\\x33\\x88\\xd3\\x25\\x76\\x01\\x06\\xe5\\x2b\\xe9\\x83\\x4b\\xd8\\x1f\\xfc\\x5c\\x62\\x48\\x6b\\x6f\\x33\\xc2\\x74\\x59\\xdf\\x17\\x8e\\xb9\\x46\\xe7\\xa8\\x2d\\xb9\\xce\\x0d\\x29\\x5b\\x92\\x5b\\xb6\\x12\\x6d\\xd5\\x5c\\x31\\xf4\\x9a\\x68\\xdc\\xef\\xc7\"},\n{{0xf1,0x3c,0xaf,0xde,0x6f,0x39,0xb9,0x63,0xdc,0xa9,0x66,0x26,0x86,0x2f,0x4f,0xbc,0x5c,0x2e,0x00,0xdd,0xf0,0x8b,0xec,0xea,0xc7,0xa6,0xe2,0xfc,0xa9,0xe1,0xcc,0xf7,},{0xc1,0xb0,0x1a,0x91,0xe8,0xee,0x0b,0x9f,0x19,0xa7,0x2e,0x5e,0x7e,0x0a,0xef,0xcf,0xdc,0x44,0xa1,0x57,0x47,0x4e,0x99,0xfe,0xeb,0xd0,0xff,0x55,0x2d,0x73,0xb2,0xac,},{0x6c,0xa9,0xf8,0x0a,0x62,0x50,0x1f,0xaf,0x31,0x9f,0xb8,0x4a,0xf4,0x71,0xf6,0x76,0xae,0x3f,0xff,0x85,0x56,0x5c,0x97,0x98,0x1f,0x14,0x57,0xcb,0xb8,0xc4,0x9f,0x97,0xb2,0x66,0x31,0x6a,0x99,0x2d,0xb0,0xd4,0x2b,0xc5,0x02,0xf0,0x95,0xa5,0xf2,0xd9,0xa4,0xe1,0xcf,0xac,0x0c,0xc9,0x35,0xd3,0x88,0x2c,0x8a,0x3a,0x0e,0xa6,0xe1,0x0e,},\"\\x2b\\xee\\x73\\xb7\\x4f\\x1b\\x76\\x22\\xeb\\x09\\x6a\\x28\\xd8\\x3a\\x81\\x9b\\xce\\xc2\\x2d\\x99\\x99\\xa3\\x20\\x62\\x10\\x3d\\x60\\x4a\\xe6\\xd7\\x8e\\xdf\\x8f\\x89\\x38\\x95\\xd2\\x22\\x0a\\xb7\\x56\\x90\\x41\\x0c\\x58\\xaa\\xb5\\x90\\xa9\\x8d\\xdf\\xf2\\x3a\\x94\\xd2\\x35\\x0f\\x88\\x9e\\x53\\x46\\x42\\x00\\xa5\\x27\\xd5\\x4d\\x62\\x57\\x11\\x07\\xb2\\x7e\\x57\\x4f\\x54\\x2e\\xba\\xc2\\x49\\xb8\\xe2\\xe3\\xce\\x08\\xd1\\xbd\\x27\\xbd\\x8d\\x29\\xf2\\xe6\\x12\\x43\\xde\\xef\\x0e\\x69\\x38\\xe5\\x2e\\xe2\\x99\\x2f\\xf2\\x18\\x7d\\x7a\\x7f\\x52\\x82\\xed\\xd9\\x8f\\xc4\\x98\\x5b\\x61\\x9a\\xcb\\x80\\xaa\\x9d\\x03\\xd6\\xcb\\x84\\xb8\\x21\\x10\\x6f\\x40\\xd6\\xe5\\xf4\\xc3\\x87\\xab\\x0a\\xf6\\xf2\\x06\\x61\\x5d\\x0a\\x17\\x5f\\x7e\\x60\\xee\\x27\\x55\\xae\\xa3\\x46\\x75\\xfd\\xd8\\x23\\xeb\\x24\\x10\\x9a\\x9b\\xd8\\x18\\xea\\x2d\\x9d\\x9b\\xd1\\x99\\xcf\\x8d\\xfe\\x79\\x62\\x4b\\x03\\x72\\xae\\x85\\xe9\\x8c\\x60\\x20\\x02\\x34\\xbd\\x41\\x3f\\x4a\\x62\\xce\\x68\\xa4\\x7b\\x6c\\x9b\\x12\\x85\\x7c\\x0d\\x39\\x9a\\x44\\x8e\\x5a\\x52\\x80\\xe9\\xf2\\x2f\\x9b\\x12\\xea\\x2c\\xd3\\xc6\\x87\\x13\\xe7\\x7d\\x0a\\x11\\xf3\\x62\\x8d\\x8e\\xc5\\xe0\\x60\\x63\\x90\\x31\\xd3\\xb6\\x40\\x02\\x1c\\x9c\\x38\\x80\\x9d\\xc5\\xf4\\x2d\\x2e\\x1c\\x2e\\x23\\x46\\xc8\\x6e\\x24\\xee\\xdc\\x59\\x84\\xa1\\x15\\xa4\\x2d\\xe8\\xde\\x7e\\x35\\xc9\\x91\\x75\\x39\\xe8\\x98\\x85\\xca\\x91\\x6e\\x07\\x2a\\xfd\\x5d\\x46\\x84\\x6b\\x2a\\x93\\x59\\x61\\xc2\\xfe\\x28\\xe9\\xeb\\x3c\\x8f\\x89\\x6b\\x86\\xfc\\x12\\x0c\\xbd\\x3a\\xf2\\xaa\\x13\\x9c\\x49\\x9d\\x29\\xcf\\xc3\\x69\\x9d\\xb7\\x9c\\x14\\x48\\x4e\\x9e\\xc2\\x57\\xa5\\xf6\\x43\\x44\\xb7\\xad\\x1e\\x3d\\xfb\\x34\\xee\\xe7\\x65\\x4c\\x6b\\xf1\\x2f\\xd3\\x8f\\xbb\\xa8\\x0f\\xe1\\x76\\x2a\\xab\\x57\\x11\\x2b\\x3a\\x94\\xe2\\xbe\\xe7\\x90\\x41\\xd1\\xe8\\x84\\x40\\xf8\\x5f\\xb7\\x2d\\xde\\x68\\xd4\\x9e\\x84\\xbc\\xed\\x99\\x8a\\x2f\\x63\\x35\\x44\\x6e\\x4a\\x83\\x5e\\x70\\xc5\\xf8\\x27\\xfb\\x3a\\xd7\\x82\\x3d\\x5f\\xbe\\x3b\\xe5\\xf6\\xec\\x7e\\x43\\x4e\\xe5\\x24\\xcc\\xd9\\xff\\x5b\\x7e\\x72\\xa3\\x2d\\x09\\x1a\\x7e\\x17\\xc8\\xb1\\xae\\x41\\xa1\\xaf\\x31\\x79\\x3c\\xce\\x91\\xd8\\x4c\\x36\\x22\\x67\\x89\\x69\\xc8\\xf5\\x17\\xdc\\x26\\xe3\\xcd\\x61\\xd2\\x44\\x69\\x12\\x28\\x3f\\x93\\x53\\xbb\\x5a\\xd0\\x3c\\x11\\x1c\\x62\\x33\\xde\\x31\\x4c\\x61\\xb8\\x31\\xcb\\xf3\\x8b\\x04\\xfe\\x58\\xcf\\x44\\xf1\\xd2\\xd0\\xb4\\x5f\\x25\\xa6\\xb4\\xe0\\x25\\x68\\x59\\xcd\\x5d\\x83\\x0f\\xac\\x5e\\xc3\\xc8\\xd7\\x63\\x98\\x55\\x9e\\x9b\\x26\\x01\\x0f\\x5e\\x1d\\xa5\\xf2\\x5d\\x22\\x00\\x93\\x54\\x53\\xff\\xac\\x5a\\xea\\x51\\xf7\\xe8\\x1e\\x72\\xec\\x8e\\x5f\\x04\\xd2\\xf8\\x85\\xc7\\xb4\\x5c\\x63\\xf6\\x44\\x56\\xcf\\xe2\\x31\\xb8\\xcb\\x24\\xaa\\x16\\x20\\xa9\\x02\\x63\\x9c\\xa7\\x8d\\xd3\\x91\\xaa\\x4a\\x3d\\x03\\xe1\\x19\\x75\\xc8\\x90\\x7f\\x96\\x4f\\xd5\\x5d\\xf9\\xbb\\xb1\\x40\\xe3\\x8d\\x6d\\xb9\\x32\\x56\\xb4\\xb3\\x9c\\x2b\\x7b\\xcb\\xe3\\x5b\\x11\\x82\\x6b\\xbf\\x8c\\x08\\xf1\\xdc\\xb4\\x8e\\xdc\\x4b\\xfb\\x70\\x46\\x2a\\x35\\xea\\x8c\\xd8\\xcb\\xa7\\x9f\\xab\\x8b\\x4c\\x44\\xe7\\x3b\\xe7\\xec\\xfa\\x11\\x21\\x66\\xf6\\xdc\\xab\\x70\\xd8\\xbb\\x55\\xd8\\xb8\\x42\\x8c\\x2d\\xa7\\x1a\\xac\\xa2\\xfc\\x3d\\x90\\xf3\\xcc\\x5e\\xd0\\x15\\x51\\x35\\x8d\\x60\\x78\\x9b\\x9d\\x57\\x1e\\xfe\\x10\\x89\\x20\\x27\\xfa\\x37\\x40\\x4a\\xaf\\x59\\xec\\x1c\\x2d\\x71\\x11\\xec\\xc3\\x59\\x24\\x67\\xed\\x1d\\x9b\\x8a\\xba\\x8e\\x22\\x9e\\x32\\xd2\\xa0\\x0c\\x19\\xdb\\x71\\x87\\xfb\\xcb\\x12\\x20\\x61\\x96\\x1c\\x1f\\xda\\xca\\x30\\x7e\\x9c\\x9c\\x9d\\xe9\\x72\\xad\\x51\\x40\\x2f\\xa6\\x7d\\xc1\\xc2\\xa4\\x03\\xb3\\xc5\\xe8\\xb1\\xe2\\x46\\x86\\x2d\\x6a\\xd6\\xa4\\x98\\xdb\\x6d\\x76\\x1f\\xb5\\x66\\xf6\\x06\\x59\\x42\\xb6\\x0a\\xd4\\xb4\\x30\\x9d\\x18\\x2b\\xc5\\x15\\x4c\\xfc\\x36\\x86\\x31\\x85\\xa8\\x7e\\x23\\xab\\xaa\\x1d\\x54\\x1a\\xb7\\x63\\xa4\\xa1\\x06\\x6c\\x0a\\x7a\\x8c\\x3d\\x82\\x1a\\xe3\\x2f\\xd3\\x1c\\x88\\x92\\x40\\x10\\x46\\xd0\\xa2\\x0e\\x91\\xa6\\x47\\x79\\xf4\\xbd\\xa8\\x11\\x20\\xaf\\x3f\\xb3\\x48\\x6d\\x3f\\xc0\\xa7\"},\n{{0xc8,0x46,0x34,0x42,0x61,0xa3,0x48,0x65,0x39,0x38,0x34,0xbf,0xaa,0x3a,0x15,0xa3,0xf5,0x3a,0xc9,0xe1,0x38,0x33,0xb0,0xb2,0x87,0x12,0x27,0x81,0xb7,0x9d,0xe3,0x92,},{0xeb,0xad,0xe0,0x22,0x61,0x95,0xae,0x25,0x4b,0x61,0x15,0xe2,0x16,0x96,0xa9,0xc6,0x5a,0x19,0xd5,0xe0,0x40,0x44,0x31,0x31,0xc2,0x2b,0x89,0xf0,0x2f,0x69,0xab,0x78,},{0xd5,0xe4,0x1b,0x47,0xad,0x0f,0x34,0x00,0x70,0x97,0x70,0xed,0x43,0x91,0x9b,0xaf,0xdf,0x24,0x38,0x1b,0x66,0x15,0x44,0xe5,0x1d,0x8b,0x5c,0xee,0x9e,0x97,0xb3,0x67,0x6a,0x4c,0x0f,0xfa,0xeb,0xb2,0xcb,0xd2,0xdb,0x79,0x85,0x32,0xb6,0x5c,0xf6,0x54,0xa5,0xb6,0xc1,0x66,0xef,0x88,0x6c,0xb0,0xfb,0xbf,0x4a,0x4f,0x84,0x4c,0x44,0x0b,},\"\\x5a\\xbd\\x13\\xe9\\x5b\\x6e\\xe1\\xd5\\x51\\x47\\x68\\x28\\x22\\x00\\xa1\\x4f\\x7d\\x1a\\x57\\x1f\\x34\\x68\\xe2\\x2e\\xfe\\xc9\\x93\\x46\\x30\\x66\\xa3\\x7a\\xec\\x83\\x73\\xe5\\xfb\\x49\\x95\\x64\\x19\\x1f\\x32\\x94\\xa9\\xb3\\x0a\\xfb\\x5f\\x1a\\x34\\xd4\\xd8\\x8a\\xbc\\x3e\\x9b\\xc3\\x03\\xc1\\xab\\xa0\\x5b\\xd8\\xfa\\xca\\x90\\xee\\x35\\xd9\\x7a\\xc3\\xdd\\x91\\x06\\xf6\\xfa\\x3c\\xa8\\x1a\\x38\\x10\\xec\\xce\\xfa\\x6a\\x20\\x9e\\xa3\\xf3\\xfc\\x30\\x49\\xdc\\xb1\\xb0\\x03\\xc7\\x28\\xf7\\xf6\\x37\\x4c\\xa9\\x8c\\x58\\x2d\\xe6\\xdb\\x1a\\xf7\\x60\\xf0\\xa0\\x21\\x33\\xca\\x4a\\x01\\x03\\x24\\x30\\x4d\\x26\\xa0\\xe5\\x0a\\xf0\\xd1\\x3c\\x13\\x4d\\xa3\\x4a\\x03\\xa4\\x1e\\x83\\xec\\x8f\\x10\\xea\\x5b\\x85\\x9b\\xec\\x1f\\x51\\xb0\\x1c\\xab\\xb2\\xd1\\x6c\\x1f\\xc5\\x2b\\x05\\x8f\\x8e\\x5d\\xef\\xae\\xde\\x12\\x81\\x71\\xc2\\xe0\\x26\\x90\\x23\\x16\\xf8\\x71\\xb3\\x5e\\x32\\x92\\x65\\x6f\\x0e\\x5b\\x39\\xbb\\xbc\\x81\\xd0\\xc0\\x83\\x0e\\x6a\\xc0\\x1f\\xac\\x9b\\x45\\x39\\xf4\\x7f\\x9a\\xcf\\xbd\\x58\\xb7\\xab\\x9f\\x5a\\x12\\x56\\x00\\xf2\\x51\\xa2\\x71\\xd7\\xbf\\x16\\x7f\\x29\\x54\\xca\\x8e\\x1e\\x0c\\x96\\xe1\\x6b\\x06\\xe8\\x30\\x7d\\xf8\\x8b\\xb8\\xe9\\xd5\\x7d\\x5b\\xa0\\x44\\xf2\\x7f\\x3e\\xaf\\xf8\\x1d\\x9f\\x15\\x05\\x54\\xaa\\x71\\x22\\xfd\\x10\\xd1\\x1f\\x35\\xd2\\xbe\\x2b\\x16\\x24\\xe3\\xe1\\xa1\\xd7\\x7f\\xea\\x4c\\x5c\\x7f\\x8b\\x98\\x3e\\x94\\x5b\\xa8\\xc0\\x8d\\xc1\\x54\\x5b\\x3e\\x6b\\x29\\x73\\xad\\x04\\x1c\\x44\\xd0\\x61\\x7e\\xcc\\xc8\\x71\\xa3\\x82\\x1a\\x9f\\xfe\\xa9\\xdb\\x7c\\x2b\\x0d\\x05\\x5d\\xa5\\x5d\\xe0\\xb3\\x50\\x63\\xe4\\x22\\x5a\\xee\\x6b\\x22\\x5a\\xb2\\xa7\\x90\\x6a\\x8e\\xe3\\x29\\xd1\\xb3\\x97\\x2e\\x0d\\x1f\\x70\\x81\\x7c\\x50\\xcc\\xfe\\x94\\x03\\xd1\\x2a\\xd6\\x2c\\x94\\x92\\x3b\\x9a\\xa2\\xd7\\xf8\\x5a\\x8d\\xda\\x47\\xbe\\x4d\\xce\\xc0\\xdc\\x2b\\x0b\\x58\\xf7\\xac\\x19\\x0a\\xe0\\x57\\x9b\\x9b\\x13\\xbb\\xb8\\xb1\\x6a\\x31\\xb0\\xab\\x4d\\x6f\\x27\\x91\\x25\\x3a\\xb4\\x75\\x1b\\x53\\x6b\\x88\\xd3\\xb4\\x93\\x7c\\xc3\\xa1\\x10\\xaa\\x82\\xa6\\xff\\xed\\x68\\x53\\x52\\x4b\\x66\\xb3\\xef\\xfc\\xd2\\xf6\\x3c\\x6f\\x96\\x45\\xce\\xa1\\x3a\\xa2\\x3c\\xd1\\xc9\\x9d\\x9f\\xfd\\xa4\\xcd\\x3a\\x9c\\x5d\\xf4\\x5e\\xc7\\x47\\x26\\xc3\\x47\\x11\\x28\\xb7\\x08\\x9f\\xbd\\x82\\x69\\x4d\\x2d\\x3f\\x08\\xdc\\x93\\x06\\xc0\\xfc\\x9c\\xe7\\xc8\\x01\\x13\\x8e\\xb1\\xec\\xb7\\x56\\xe5\\x71\\xe9\\x05\\x9b\\x75\\xed\\x03\\xf9\\x2a\\x31\\x50\\x2f\\xbe\\xb5\\xfe\\xc5\\x1d\\xe9\\x35\\x90\\x10\\xc4\\x39\\x7d\\x28\\xb6\\x5e\\x35\\x6e\\x38\\x00\\x1d\\x0d\\x51\\xac\\x96\\x00\\x72\\x8c\\x78\\xb5\\x76\\x6e\\x0f\\x21\\x79\\x38\\xb4\\x10\\xe7\\x85\\xb4\\xc0\\x1e\\x86\\xa3\\x45\\x2b\\xcb\\x38\\x84\\xac\\xa4\\x75\\x40\\x85\\x9c\\xc4\\x9b\\x00\\x0f\\x0b\\x61\\xfd\\xbe\\x72\\x75\\x25\\x74\\xb2\\x7a\\x22\\xd4\\xc4\\x04\\x13\\xa4\\x3b\\x31\\x09\\x24\\xb1\\xbb\\x14\\x0f\\xc9\\xfd\\xaa\\xe2\\x66\\xd6\\x59\\x30\\xe3\\xf2\\x34\\xfe\\x84\\x1d\\x82\\xb2\\x61\\x76\\xff\\x86\\xc5\\xd2\\xbd\\x8d\\x96\\x5c\\x52\\xd7\\x28\\x06\\x4e\\xbd\\xf6\\x8d\\xc8\\xe4\\x83\\x49\\x41\\x80\\x1c\\xca\\x0b\\x2f\\x25\\x6d\\x4f\\x6c\\x3d\\xd1\\x9d\\x35\\xd5\\x36\\x2b\\xbf\\x9b\\x8a\\x3a\\x1c\\x86\\x3e\\x09\\x26\\x89\\xdd\\x28\\x52\\xad\\xd4\\x88\\xbf\\x42\\x68\\x5b\\x11\\xe1\\xe1\\xad\\x57\\x45\\xd0\\x75\\x62\\x8d\\x73\\x1f\\x91\\xcf\\xd7\\x49\\x15\\x9e\\x2e\\x1c\\x83\\x7f\\x4e\\xf8\\x3d\\x80\\xea\\x1d\\xd9\\xbd\\xed\\x5f\\x88\\x01\\x8c\\xe1\\xd4\\xb3\\x37\\x1f\\x95\\x43\\x53\\xf3\\xd8\\x94\\x37\\x00\\x62\\xc0\\x96\\x5d\\x67\\x98\\x6d\\xbc\\x48\\x17\\x15\\xf4\\x2d\\xd2\\xc9\\x16\\x07\\xab\\x8b\\x5f\\x0d\\x89\\xf6\\x6e\\x68\\xd7\\x3d\\x50\\xd6\\x40\\x52\\x4d\\x72\\xe6\\x91\\x34\\xb8\\x87\\x29\\x8e\\x5c\\xd8\\xc4\\xb9\\x05\\xba\\x5e\\xfa\\x0e\\x9d\\x68\\x52\\x14\\xb8\\x42\\xf5\\x0a\\x2a\\x39\\x83\\xa1\\xaf\\x58\\x5a\\xf2\\xca\\x43\\xdb\\xcf\\x02\\xc4\\x08\\x97\\xae\\x2e\\x1a\\xb5\\x1d\\xbc\\xe5\\x70\\x34\\x5e\\x8e\\x13\\x5f\\xb7\\xb4\\xeb\\x0a\\x1d\\x6a\\x0b\\xb5\\xa8\\xa1\\x80\\x7e\\x42\\x5b\\x2d\\x62\\x83\\x60\\x76\\x80\\x58\\xe6\\x1a\\xd1\\xcf\\xaa\\x20\\x99\"},\n{{0xfa,0xaf,0x55,0xd3,0xc2,0x97,0x14,0xb6,0x5c,0x22,0x81,0xe2,0xc2,0x2d,0x61,0x34,0x97,0x1a,0x2e,0x74,0x00,0x8f,0xb9,0x40,0x89,0xa7,0x73,0xee,0xeb,0x44,0x83,0xa6,},{0x39,0x86,0x2e,0xac,0x6d,0xd5,0x2e,0x38,0x1b,0xb3,0x4d,0xc1,0x96,0xba,0x8a,0x37,0x4d,0xcb,0x7d,0xf6,0xcb,0x14,0x0f,0xd0,0xcf,0xa6,0xcf,0xa3,0x9b,0x8c,0x75,0x3f,},{0x5b,0x00,0x83,0xf7,0xa8,0x20,0x61,0xc6,0x5c,0xf6,0xc7,0x56,0x40,0xc8,0x1c,0x28,0xe8,0xd6,0xd2,0xe8,0x7f,0x6d,0x57,0x95,0xc9,0xaa,0x3b,0xb3,0xe3,0x90,0xe9,0x19,0x90,0xe8,0x2d,0xb6,0xf0,0x7e,0x61,0x4f,0x50,0x7a,0x56,0x0a,0xba,0xa1,0xec,0xa6,0x56,0xc6,0x78,0xdd,0xca,0xe8,0x19,0x82,0x51,0xe6,0xaf,0x0b,0x76,0xb8,0x8d,0x0d,},\"\\x94\\xe6\\x61\\xc2\\x52\\x40\\xa8\\x9e\\x82\\x3d\\x7f\\x5d\\xc0\\xe6\\x92\\xed\\xdd\\x13\\x70\\xc3\\x5a\\xc4\\x4d\\x5a\\x8c\\x87\\x98\\xd0\\xc9\\xaa\\xfd\\xf0\\xbb\\xfb\\x54\\x92\\x60\\x56\\x8d\\xba\\x1c\\x69\\x08\\x6b\\xee\\x63\\x6b\\xe8\\xed\\xcc\\xd3\\xcb\\xb2\\x70\\x16\\x24\\x4d\\x54\\xd7\\xed\\x2f\\xeb\\x7f\\xa6\\x46\\x14\\xd4\\x54\\x49\\xd7\\xe0\\x58\\xe7\\x1b\\x30\\x6c\\x22\\xe6\\x91\\x1c\\x2a\\xc7\\x42\\x07\\xba\\xe5\\xa8\\x4d\\x0f\\xc2\\x47\\xbe\\x49\\xd3\\x56\\xe5\\xd4\\x35\\x3b\\xa5\\x58\\x6b\\x6e\\x4b\\x2b\\x97\\xce\\x9e\\x23\\x77\\xb6\\xee\\xd9\\x2c\\x84\\x9e\\x67\\x69\\x44\\xae\\x90\\xdc\\x42\\x08\\xe3\\x00\\xe1\\x9c\\xc9\\x1d\\xc2\\x6b\\xbd\\xd5\\xa3\\x0c\\xfa\\x92\\x81\\xa1\\x5e\\xfd\\x87\\x30\\x66\\xf8\\x5a\\xf3\\xa2\\x6f\\x31\\x06\\x23\\xe0\\x09\\x80\\x48\\x53\\xcc\\x68\\x55\\x90\\x3e\\xa6\\x4a\\x90\\x98\\x97\\xe3\\x15\\xe7\\x3d\\x31\\x29\\x48\\x98\\x0e\\xf6\\x28\\x9d\\xb2\\x1a\\x5e\\xbb\\xec\\x8c\\x8e\\xfe\\x20\\xd1\\xd5\\x3d\\xfa\\xad\\x6d\\x9f\\x42\\x96\\x53\\x2e\\x88\\x7c\\x37\\x35\\x01\\x05\\xa6\\x33\\xab\\xc7\\x73\\x18\\x87\\x51\\xb2\\x8c\\x3a\\x08\\xf1\\xb5\\xee\\x04\\x72\\xde\\x46\\x27\\xe6\\xb6\\x1b\\x68\\x27\\x8d\\xd5\\x1c\\xed\\x6a\\x61\\xec\\xf3\\x88\\x86\\xe4\\x53\\x39\\xdc\\x6c\\x60\\xc3\\x1e\\x85\\x0e\\xf8\\x29\\x6a\\xe8\\x0f\\x9d\\x31\\x70\\x17\\x76\\xeb\\x9a\\xf2\\x16\\x93\\xf4\\xc5\\x2e\\xc0\\x62\\x62\\x57\\x38\\xd4\\xe3\\xaf\\xbf\\x71\\xd1\\xc8\\x1f\\xc4\\x84\\x63\\x60\\x36\\x3e\\xa5\\x41\\xa9\\x76\\x62\\x3a\\x5e\\x4e\\x6b\\x6a\\x67\\x23\\x7e\\x92\\x37\\x17\\x3f\\x1a\\x1d\\x54\\x33\\x02\\x85\\x88\\x85\\x71\\x4c\\x2a\\x59\\x1d\\x0a\\x78\\x62\\x82\\xa0\\x28\\x5a\\x37\\x11\\xf7\\xbc\\x2b\\x63\\xca\\x79\\x87\\xe9\\xae\\x7d\\x02\\x03\\x55\\x55\\xcf\\x3b\\x6a\\xd6\\xf7\\x1c\\xa9\\x8a\\xa9\\x28\\x88\\x3b\\xf8\\x1d\\xd6\\xf8\\x64\\x93\\xea\\xab\\x56\\x37\\xb4\\xdd\\x56\\x9d\\x1e\\xe8\\xde\\x6a\\x44\\xbc\\xed\\xb6\\x2b\\x97\\x06\\xb1\\xdb\\x89\\xe3\\xf0\\x5d\\xf1\\x63\\x10\\x01\\x7d\\x89\\xef\\x3e\\x4b\\xc0\\x99\\xb7\\x21\\xa5\\xc8\\xd3\\x80\\x43\\xd6\\xe4\\xa2\\x2c\\xf0\\x40\\x09\\xc0\\xfc\\xee\\x6b\\xe6\\x99\\x37\\x82\\x99\\x54\\x94\\x1b\\x8b\\x4a\\x1e\\xbf\\x4d\\xae\\xa0\\xd7\\x74\\xd0\\x78\\x2b\\xe1\\x76\\xc8\\xe5\\x91\\x90\\x77\\x56\\xc2\\xcf\\x75\\xde\\xa6\\xf7\\x87\\x7d\\xd6\\x87\\x5b\\x8f\\xe1\\x01\\x2f\\x30\\x50\\xcf\\xb1\\x28\\x9c\\xf0\\x88\\x66\\x7e\\x15\\x22\\xee\\xed\\xc9\\x27\\xac\\x86\\xbf\\xe2\\xc4\\x07\\x43\\x2b\\x4a\\x81\\x3a\\x6a\\x7a\\x55\\x04\\xe9\\x99\\x20\\x6d\\xb1\\x82\\x7e\\x25\\xfa\\xfd\\x70\\xce\\xd3\\x6d\\xb3\\xb2\\x81\\xb6\\xf7\\xb1\\x4e\\xd5\\xba\\xa0\\x57\\x23\\x15\\xa9\\x39\\xc5\\xbf\\x4a\\xbb\\x13\\x3d\\x2e\\x7b\\x16\\xd5\\x2d\\xe2\\x08\\x17\\xaf\\x05\\x5d\\xf5\\xf1\\x41\\x20\\x77\\x34\\x61\\x0a\\x0c\\x6e\\xeb\\xed\\xaf\\xff\\xd9\\xcc\\x9f\\x06\\x9b\\x67\\xf9\\xa1\\xc0\\x45\\x4b\\xe4\\x1d\\x54\\xc1\\x38\\xbe\\x54\\x2e\\x5e\\x38\\xcf\\xe2\\xf2\\x93\\xf7\\xd2\\xd3\\xdf\\x66\\x97\\x7a\\xcb\\x36\\x6a\\x42\\xc1\\x9b\\x31\\x85\\xac\\xfa\\x1b\\x36\\x3c\\x61\\x31\\xa4\\xa8\\x11\\x1c\\x3b\\x1f\\x4f\\xd7\\xac\\x40\\x6d\\x0e\\x69\\x10\\x3b\\xa1\\x5b\\x8c\\x4b\\xf2\\x9b\\xc2\\xed\\x9c\\x45\\xcf\\xd1\\xd2\\x79\\xd8\\xd9\\x31\\x44\\x4b\\x2b\\x18\\x49\\x25\\x2b\\x8a\\x70\\xee\\xd8\\x0f\\xd2\\x60\\xed\\xf5\\xa3\\xc0\\x1b\\x96\\x90\\x16\\x0d\\x23\\x11\\x85\\x1d\\x21\\xc9\\x30\\x2d\\x98\\x59\\x86\\xea\\xee\\xb3\\xae\\x2c\\x07\\xc7\\xc7\\x67\\x20\\x94\\xf9\\x1d\\xb0\\xbd\\x50\\xbe\\x37\\x7e\\x4d\\x1e\\xb0\\x7e\\xe7\\x6a\\xf4\\x9d\\xc1\\x36\\xa1\\x45\\xa1\\x1b\\x17\\x2f\\x08\\x11\\xfe\\x73\\xd6\\x25\\x9b\\xe3\\x70\\xc4\\xdf\\xca\\xb6\\xf1\\x9e\\x4a\\x64\\xb1\\x51\\xd0\\xa6\\xdb\\x80\\x50\\xc3\\xde\\x2c\\xc3\\x25\\xf5\\xc5\\xf6\\x59\\x4c\\xf6\\x24\\x8e\\xb0\\x81\\x20\\x95\\x39\\xe0\\x8c\\xa3\\x42\\x29\\x84\\xe7\\xbf\\x80\\x3d\\xe3\\xa4\\x19\\xb1\\x44\\x23\\xf1\\xe5\\xa5\\x42\\x24\\x04\\x2c\\xe4\\xf0\\x54\\x88\\xa6\\x04\\x4f\\x40\\x42\\xbd\\x64\\x9b\\x1a\\x08\\xce\\x10\\xc2\\x00\\x6e\\xa7\\x6e\\xfa\\xb4\\x64\\x1f\\xef\\x28\\x97\\xef\\xd7\\x24\\xe6\\x05\\x4a\\x3b\\xd1\\xa6\\x9e\\x39\\xa4\\xa5\\xe2\\xd5\\x02\"},\n{{0x6d,0x78,0x55,0xe3,0x0f,0x7a,0x13,0xe2,0x37,0xb0,0x67,0x14,0x43,0x46,0x43,0x4b,0xb4,0xb0,0x51,0x78,0xc7,0xd8,0x8d,0x49,0x2e,0x79,0x02,0x7c,0x4b,0x0f,0x3c,0xdd,},{0x72,0x73,0x29,0x38,0x28,0xef,0xa3,0x49,0x82,0x23,0x92,0xdb,0xba,0xb0,0x78,0x79,0x57,0x7e,0x1a,0x77,0xa6,0xfd,0x6a,0xfe,0x33,0x75,0x3a,0x9e,0xec,0x88,0xc4,0xaf,},{0x0f,0xe2,0x8e,0xad,0xd9,0xe5,0xdd,0x57,0x4b,0x3f,0xaa,0xea,0x81,0x0d,0x44,0x52,0x2c,0x8b,0x1b,0xfb,0xb3,0xe3,0xd5,0x7e,0xd8,0x89,0xfa,0xed,0xec,0x91,0xd0,0xe1,0x4a,0x86,0xb9,0x14,0xc4,0xc7,0x66,0xf1,0xbf,0x9b,0x8f,0x18,0xb0,0xdb,0x89,0x0d,0xb6,0xc1,0xb1,0x25,0xd5,0x78,0x04,0x33,0x36,0x19,0xb1,0xe0,0x72,0x0a,0x33,0x00,},\"\\xf8\\xb9\\x36\\xe7\\x93\\xb0\\x17\\x58\\x0c\\xc0\\xe9\\xcb\\xda\\x2a\\xcb\\x64\\x74\\x50\\x7f\\x4b\\xca\\x3a\\xfc\\x87\\x83\\xec\\x46\\xee\\xb8\\x2c\\xcd\\x4d\\xd2\\x52\\x56\\x76\\xaa\\x6a\\xb5\\xc0\\xdc\\xf7\\xd7\\x5f\\x7e\\x03\\x11\\xe6\\xfe\\x6b\\xf2\\x72\\x63\\xf8\\x57\\x8f\\xeb\\x55\\xc5\\x61\\x2d\\x1f\\x28\\xe8\\x88\\xb7\\x66\\x56\\xc4\\x1c\\xcd\\x8a\\x70\\xb9\\xbc\\x60\\x4b\\x42\\x72\\x4f\\xa2\\xbc\\x41\\x1d\\x44\\xc3\\x1a\\xb6\\x8c\\xe8\\x4f\\x83\\x93\\x39\\x9e\\x34\\xd5\\x40\\x85\\x79\\xc2\\xba\\x29\\x21\\xf2\\xf8\\xd1\\x14\\x87\\xaa\\x7e\\x52\\x55\\x7f\\xee\\xd9\\x67\\x57\\x19\\x9d\\x3a\\xae\\x63\\x77\\x77\\x01\\x54\\xb1\\x7f\\x35\\x77\\xc7\\xac\\x3d\\x8c\\x76\\xcf\\x74\\x61\\xb5\\xe8\\xd4\\x2a\\x71\\x85\\x07\\x8e\\xd4\\xf8\\x62\\xfc\\x57\\x50\\x2f\\x61\\x50\\x75\\x30\\x7b\\x6e\\x10\\x3c\\x77\\xc1\\xf6\\xc8\\xbd\\xa7\\xaa\\x17\\xe4\\x35\\xe2\\x1b\\x94\\x9a\\xf4\\x4d\\xff\\x5a\\xa3\\x0a\\x62\\xda\\x71\\x2f\\xa9\\x96\\x6a\\x61\\x2f\\xfc\\xa1\\x48\\x71\\xfd\\x6f\\x86\\x0b\\x4a\\x96\\x14\\x01\\x2c\\x53\\x69\\x91\\x0e\\x0f\\xfd\\x6f\\x0f\\xbd\\x88\\x9a\\x9c\\x25\\x7c\\x32\\xbd\\xcf\\x90\\xbb\\x80\\x62\\x7c\\xb2\\x72\\xec\\xd4\\x59\\x98\\x97\\x55\\x59\\x55\\xe1\\xfe\\x08\\xcd\\x7e\\xbb\\x21\\xc0\\x71\\xbe\\x0f\\x48\\x98\\x96\\x96\\xcb\\x39\\xaa\\x82\\xad\\x11\\xba\\xa5\\xd4\\xac\\x61\\x3a\\xbf\\x1b\\x6d\\xb8\\xa2\\x0e\\x68\\x68\\x36\\x22\\x28\\x33\\xf8\\xb6\\xdd\\x2f\\x00\\x06\\x22\\x7b\\xe4\\x8e\\x85\\x80\\xdc\\xc8\\xde\\x62\\x0d\\xac\\xb2\\xf6\\x5a\\x69\\x36\\x75\\xd6\\xcb\\x45\\xba\\x5d\\xd1\\xaa\\x70\\xdb\\x76\\xbc\\x64\\x1d\\x4f\\xb5\\x67\\xec\\xbc\\x71\\x11\\x44\\x2e\\x29\\x41\\x58\\xbe\\x57\\x5c\\x71\\xdd\\xc2\\x6e\\x94\\xf4\\x12\\x66\\xa2\\xfd\\x3a\\x0d\\x43\\x57\\x81\\xfc\\x09\\x46\\x48\\xfa\\xdf\\x5f\\x17\\xcd\\x41\\xab\\x89\\x58\\x21\\x89\\x4e\\xc0\\x80\\x6b\\x26\\x2c\\x39\\x35\\x34\\xfe\\x66\\xf2\\x1e\\x37\\x83\\xc1\\x4a\\x96\\xc8\\x8f\\x2e\\x06\\x53\\xfe\\x32\\xe7\\x5d\\xce\\x8a\\x46\\x3b\\xb9\\x7e\\xed\\x6c\\x16\\xf3\\xf3\\x22\\x81\\x69\\xab\\xb5\\xb4\\xbf\\x9e\\xa3\\x27\\x8c\\x1f\\xf0\\xf8\\x6e\\xae\\x71\\x38\\x9b\\x64\\x33\\xac\\xd0\\x97\\xee\\xfa\\x9e\\x6e\\x05\\xf4\\x95\\x5c\\xd5\\x17\\x83\\x0b\\x8d\\x98\\x70\\xcc\\xb5\\x22\\x74\\x15\\xe5\\x0f\\x23\\xf6\\x47\\x32\\x17\\xa7\\x45\\x09\\x64\\x70\\xdc\\xa9\\x3d\\x2b\\x34\\x67\\x3c\\x5d\\x6a\\x57\\xed\\x02\\xc8\\xe0\\xca\\xe1\\x19\\xb3\\xf3\\x29\\xd8\\xab\\x64\\x98\\x49\\x4c\\x29\\x21\\xbb\\x6f\\x49\\x6d\\xd0\\x83\\x81\\xe7\\xd3\\x9f\\x2d\\xb5\\x76\\x3b\\x14\\xa2\\x82\\x1b\\xef\\xcc\\xa0\\xa9\\xfd\\x31\\x25\\x45\\xde\\x68\\xab\\xf2\\x06\\xd1\\x2d\\x8e\\x02\\xe7\\x3b\\xc7\\xe3\\xcb\\x79\\x6e\\x7e\\xe2\\x6c\\xc6\\x3d\\x74\\x1e\\xfa\\xfc\\x53\\x45\\xf8\\x13\\x29\\x51\\xbc\\xfb\\xfd\\xdf\\x63\\x1f\\xb7\\xcb\\x43\\xef\\x35\\xb9\\x45\\x3c\\x93\\x90\\xeb\\x23\\xb1\\xf9\\xd8\\xb1\\xc7\\x2d\\xeb\\xd2\\x4f\\x09\\xa0\\x1a\\x9d\\xc6\\x0e\\xe6\\x81\\x53\\x06\\x18\\x83\\x57\\x78\\x1a\\xf6\\xe1\\x82\\x0a\\xa3\\x5e\\x4e\\xc1\\x21\\xb7\\xca\\x34\\xd7\\xde\\x76\\x11\\xb2\\x46\\xa3\\xe7\\x03\\xed\\x48\\xc7\\xeb\\x03\\xa6\\xfe\\x8f\\x85\\x2e\\xe7\\xd3\\x25\\x45\\xc9\\xd8\\x52\\xd6\\x4d\\x5d\\x75\\x93\\x0e\\x5f\\x1e\\xbe\\x21\\xa3\\x07\\xef\\xa7\\x62\\x2e\\xda\\xce\\xd6\\xd8\\x79\\x02\\x6f\\x0f\\x85\\xa9\\x11\\x20\\x12\\x80\\x37\\x05\\x58\\x22\\x69\\xd3\\x9f\\x14\\x32\\x34\\xdf\\x89\\x09\\xab\\x3d\\x94\\x8e\\x76\\xd3\\xda\\xaa\\x24\\x22\\x6d\\x9a\\xc6\\x01\\xee\\xf2\\x77\\xfd\\x2c\\xfc\\x4a\\x19\\xae\\xdf\\x43\\x87\\xa2\\x16\\x17\\xb0\\x3e\\xc3\\xd3\\x84\\x5a\\x38\\x55\\x4f\\x5e\\x97\\x03\\x6e\\x56\\xec\\x1c\\xe6\\x60\\xdf\\x9c\\x06\\x2c\\x2c\\x99\\x3b\\x77\\xc5\\xba\\x6a\\x6d\\x05\\x23\\x1d\\xae\\x37\\x64\\x18\\x3c\\x3e\\x96\\xaa\\x53\\x9c\\xfb\\x34\\x15\\xfb\\x16\\x3c\\x64\\x5b\\x23\\x03\\xb2\\xd6\\xd4\\xbd\\xa8\\xca\\x6c\\x72\\xbc\\x03\\xd5\\x30\\x5f\\x9b\\x11\\x8e\\x92\\x5e\\x27\\xd2\\x9a\\xb7\\xdc\\xb1\\x96\\x47\\x0e\\x63\\x39\\x63\\x1b\\x23\\x80\\x74\\x4c\\x04\\xd1\\xda\\x34\\x8f\\xc0\\xfe\\x27\\x42\\x77\\xf8\\x2f\\x95\\xbd\\xfb\\x0b\\x64\\xb4\\xcf\\x3b\\x51\\xe5\\x71\\xc0\\xdd\\xb3\\xb5\\x3c\\xa6\"},\n{{0x7e,0xe4,0xe7,0xe9,0x8c,0x6a,0x40,0xf0,0xe7,0x44,0x13,0xf2,0x40,0x39,0xbd,0x22,0x0d,0xf1,0xf8,0xc7,0xf0,0x15,0x52,0x8d,0xbf,0x52,0x84,0xab,0x9f,0x7c,0x82,0xe2,},{0x4d,0x5a,0x80,0x0f,0x9b,0x22,0x07,0x0e,0x01,0x6e,0xe2,0x3a,0xf8,0xa3,0x10,0x90,0x2b,0x36,0x9d,0x58,0x9a,0x84,0x7f,0x34,0x5c,0x2e,0xa2,0x96,0x8d,0x6d,0x09,0x24,},{0xac,0x3b,0xfe,0x3a,0xdf,0x94,0x1c,0x93,0x4d,0x33,0x49,0xc4,0x92,0xde,0x70,0xd5,0x16,0x6b,0xe3,0x89,0xf9,0x55,0xbe,0x87,0xc2,0x88,0x3f,0x41,0xf2,0xda,0x14,0x6c,0x91,0x06,0x51,0xa3,0xb4,0x52,0xc2,0xd7,0x39,0xdc,0x9b,0x53,0x1c,0x57,0x45,0x56,0x5e,0x69,0xd9,0x83,0x59,0xf1,0xd7,0xd9,0x3e,0xbd,0x36,0xd7,0x0a,0xbb,0xf0,0x0d,},\"\\x8f\\xb0\\x13\\x73\\xc4\\x2e\\x69\\x61\\x4a\\xea\\x99\\xaf\\x49\\x32\\x37\\x85\\xf3\\x38\\x61\\xb9\\x4e\\x90\\xf5\\x65\\x38\\x9e\\xbf\\x70\\xe2\\x19\\xf5\\xde\\xc7\\x32\\xe0\\x01\\x0b\\x58\\xf7\\x29\\x05\\x30\\xdf\\x22\\x2a\\xc9\\xc7\\x3e\\x1c\\x2e\\x92\\xa5\\xe6\\x06\\x1d\\xe5\\x59\\x0c\\xaf\\x9c\\x0d\\x50\\x21\\xd7\\x29\\xea\\xa1\\x15\\x41\\xfa\\x1d\\x08\\x21\\x60\\xbe\\xaf\\x61\\x1e\\x7c\\xfd\\xc0\\xeb\\xb3\\x15\\xd3\\x88\\xe5\\x38\\xb4\\xb5\\x02\\x8f\\x9b\\x30\\xd3\\xd9\\x73\\x34\\x7f\\xfd\\x44\\x26\\x3e\\xef\\x08\\x3b\\x81\\xb2\\x1b\\x82\\xec\\xa5\\x75\\x6a\\x49\\x4b\\x1d\\x81\\xc0\\x7d\\xe8\\x49\\x50\\x6d\\x3e\\x3b\\x66\\x87\\x97\\xa5\\xc5\\x44\\x25\\x4d\\x4e\\xbe\\x5c\\xf8\\x17\\x1b\\x39\\xf8\\x72\\x4c\\xbc\\x41\\x89\\x29\\x1b\\x3c\\x53\\xc2\\x1e\\xce\\x49\\xa1\\xd7\\x39\\x56\\x3c\\x65\\xb4\\x90\\x25\\x93\\x56\\x47\\xa7\\x30\\x3a\\xe0\\xef\\x7f\\x6d\\x24\\x55\\x46\\x45\\xa4\\x28\\xdb\\xbb\\x42\\x44\\x9f\\x53\\x99\\xe3\\x6d\\xc7\\x87\\xb7\\xd6\\x95\\x8a\\x02\\xee\\xbb\\xb8\\x36\\xe5\\xe5\\x3e\\x26\\xe4\\x87\\x23\\x9d\\xe9\\x4d\\x1d\\x25\\x0e\\x79\\x43\\xac\\x0e\\x22\\xd9\\x27\\x50\\xa0\\xcf\\x34\\x73\\xbe\\x1a\\x62\\x25\\xcb\\xe7\\x95\\x45\\x04\\x82\\x69\\xf6\\x23\\x7e\\xc9\\xf9\\xec\\x30\\x7e\\x8a\\x34\\xb7\\xbb\\x34\\xcd\\x49\\x06\\xe4\\x31\\x62\\xa3\\x70\\x8f\\x32\\x9c\\x5b\\x98\\x9d\\x7a\\x7f\\xcd\\xe1\\x09\\x9a\\x54\\x25\\x46\\xfe\\x9c\\x33\\x18\\x2b\\xa5\\x1b\\x84\\x3e\\x96\\xd1\\x1c\\x79\\xe9\\x1a\\xd2\\x1f\\x71\\x70\\xe2\\x57\\xfd\\xc2\\x81\\x8e\\x12\\xf9\\x16\\x8a\\x97\\x4c\\x96\\x8a\\x4d\\x27\\x3f\\xa3\\xff\\xa9\\xf3\\x5f\\xf9\\x05\\x98\\x0e\\xaa\\xd3\\x72\\x1c\\xae\\x80\\x2b\\xee\\x36\\x21\\x0b\\x40\\xb9\\x93\\x19\\xbb\\x66\\x99\\x82\\xe9\\x43\\xb2\\x70\\xa4\\xc4\\xd0\\xa9\\x2e\\xcb\\x5b\\xba\\x2d\\xd8\\xb4\\x0a\\xc3\\xd2\\xf0\\x32\\x5c\\x46\\x9d\\x5e\\x9d\\x48\\x3f\\x52\\x41\\x97\\x40\\x10\\xc5\\xc0\\xda\\x33\\x5f\\x16\\xe9\\x62\\x19\\x6c\\x2e\\xf1\\x4e\\xb2\\x4a\\xaf\\xbb\\x31\\x1b\\xfd\\x5f\\xa8\\xdc\\x8d\\x2d\\x61\\xe6\\x87\\x8a\\xd2\\xcc\\xe0\\xdc\\x99\\x39\\xe4\\x45\\x22\\x72\\x3d\\x42\\x7e\\xf3\\x2f\\xb4\\x3b\\x96\\x7f\\x5e\\x44\\xfc\\x66\\x57\\x92\\x79\\x6f\\x8c\\xf9\\x34\\xf0\\x1c\\x32\\x5d\\x63\\xd5\\x83\\xdc\\x3c\\xa9\\xd4\\xfc\\xc7\\x57\\xd9\\x17\\x85\\x80\\xda\\xef\\x53\\xaa\\x3a\\xb2\\x1d\\x2c\\xe4\\x35\\x95\\x5d\\x1c\\x6d\\x47\\x63\\x8c\\x5e\\xdb\\x62\\xff\\x55\\x61\\x69\\x3d\\x1c\\xbd\\x10\\xec\\x9e\\x39\\x9a\\x71\\xbf\\x9d\\xb1\\xc9\\x96\\x9f\\xd5\\x9e\\x4e\\xeb\\x31\\xaa\\x59\\xbf\\x39\\xe9\\xf1\\x84\\x17\\x8d\\xef\\x72\\x46\\xed\\x4b\\x8f\\x4b\\xe5\\xba\\xda\\xa5\\xdb\\x4a\\xf8\\x67\\xf4\\xf2\\xec\\x39\\xa1\\x37\\x04\\x20\\x2c\\x87\\x84\\xfa\\x16\\x8c\\xe9\\x6f\\x9c\\xfa\\xc7\\x10\\x17\\x23\\x62\\x75\\xfd\\x85\\x7c\\xc3\\xc5\\x1a\\x9c\\x7a\\xc2\\x56\\x21\\x5e\\x14\\xb8\\x43\\xf7\\x21\\x4d\\xc9\\xf8\\x24\\xb9\\x1d\\x1a\\x51\\x70\\xd0\\xef\\x1d\\x37\\x69\\x6f\\x93\\xee\\x96\\x6a\\x2b\\x7d\\xec\\xe2\\x2b\\x4f\\x3a\\xfd\\x39\\xc1\\x6d\\x60\\x1e\\x5f\\xf8\\x40\\x8d\\x45\\xc1\\xa6\\xce\\x71\\xf0\\x60\\x97\\x6c\\x5b\\xe4\\xc0\\x42\\xb1\\xb7\\x38\\xdf\\x95\\x80\\xba\\x5a\\xe7\\x78\\x80\\xa7\\x0c\\x0b\\x94\\xf0\\xe1\\xc9\\xf9\\xaa\\x34\\xc0\\x90\\xd6\\x12\\xd5\\x7a\\x9b\\x93\\x1f\\x50\\xa1\\x25\\xfa\\x35\\xce\\x40\\xa2\\xcb\\x7f\\xaa\\xd5\\x30\\xf8\\x09\\x08\\xc7\\x3c\\xb7\\x82\\x58\\xaf\\xd2\\x63\\x13\\x90\\x04\\x1d\\x92\\x61\\x7e\\x9b\\xf6\\x4c\\xe9\\x6e\\x8e\\x4a\\xc7\\xf3\\x12\\x6d\\x8a\\xf8\\xa0\\x4c\\x75\\xff\\xd4\\x38\\x76\\x9d\\xe0\\x6f\\x74\\xc2\\xfc\\x20\\xcc\\x81\\x92\\xda\\x35\\x3e\\x79\\x06\\x12\\x83\\xbb\\xa0\\x8a\\x8d\\x24\\xe6\\xe4\\xe2\\xe8\\x3b\\xa5\\xb0\\x8e\\x42\\x75\\x22\\x60\\x62\\x14\\x8d\\x8a\\x02\\xaf\\xad\\x65\\xb6\\xf6\\x27\\xcf\\xbd\\x29\\xb7\\x1c\\xa1\\x8a\\xee\\x5b\\x1f\\x97\\x16\\x9b\\xf0\\x22\\x8b\\x37\\x6f\\x41\\x06\\xb5\\x0f\\xd9\\x1a\\x38\\xa6\\x62\\x11\\xd6\\x9e\\xbb\\x4a\\x7a\\xf0\\xe1\\xc2\\x21\\x7f\\x1b\\xa0\\x14\\xd1\\xe0\\xcd\\x17\\x50\\x8d\\x58\\x15\\x5d\\x16\\x3d\\xd9\\xde\\x2f\\xe1\\xc6\\x4c\\x7f\\x88\\xd5\\xb5\\x53\\xe9\\xba\\x1e\\x1f\\x25\\x43\\x0d\\x7e\\x12\\x5b\\x07\\xa8\\xc2\\xed\"},\n{{0x1f,0x28,0xd9,0x09,0x1d,0x19,0x6c,0xba,0x3d,0x45,0x52,0xe5,0xa3,0x37,0xa4,0xd8,0xaf,0x3f,0x29,0x5e,0x62,0x9e,0x4b,0xa6,0xfe,0x99,0x70,0x31,0x20,0xae,0x41,0xe0,},{0x81,0x4d,0x34,0xbf,0x28,0xee,0x6d,0x90,0xf0,0x39,0x59,0x90,0x41,0xdb,0x81,0x0f,0x7c,0x9d,0xaa,0x91,0x8e,0x03,0xe9,0x61,0x97,0x41,0x4b,0xc9,0xaa,0x31,0xec,0xdc,},{0x5b,0xe5,0x52,0xfa,0x73,0x1e,0x83,0x67,0x93,0xf6,0xdd,0xa8,0x95,0xdc,0x9b,0x1e,0x2c,0xcd,0x66,0x9d,0xe1,0xc8,0x43,0xe0,0x0e,0xa6,0xfa,0x3c,0x5e,0xbf,0x97,0xa3,0x4b,0x26,0xf1,0xf3,0xac,0x7f,0xf2,0x22,0x5e,0xe4,0xa7,0xe4,0x30,0x07,0x2c,0x13,0xda,0x40,0x66,0xdc,0xdc,0xc0,0x5b,0xa2,0xb5,0xf6,0x1a,0x6e,0x8d,0x21,0x07,0x09,},\"\\xa6\\x94\\x68\\xbc\\x33\\xeb\\xfe\\xf0\\x61\\x5c\\x64\\x3c\\x49\\xda\\xc6\\xe0\\x4f\\xdb\\x6c\\xfb\\x8e\\xc4\\x58\\x57\\xbb\\xb7\\xa2\\x7e\\x52\\x8f\\xd6\\x31\\xfc\\x34\\x11\\xba\\xee\\x65\\xcc\\x1f\\x94\\xfc\\xc9\\x4a\\xed\\x4a\\x43\\x32\\xfa\\x68\\x61\\xe0\\x65\\xe0\\x61\\x63\\x54\\x17\\x09\\xd7\\x97\\x28\\xe0\\x1b\\xe2\\xb1\\x40\\xa0\\x22\\xc8\\x3e\\x7b\\x23\\xb9\\xed\\x2a\\xd2\\x83\\x21\\x69\\xdf\\xc9\\x56\\x90\\x91\\x3c\\xf3\\x72\\x01\\x30\\x65\\x70\\x80\\xc9\\xd5\\xa7\\x82\\x7e\\x56\\x60\\x75\\x74\\x52\\xc5\\xfc\\x3d\\xcd\\x80\\xcc\\x6b\\xe0\\x98\\xc6\\x29\\x22\\x6d\\x54\\x66\\xe0\\x2b\\x97\\x12\\x6b\\xe7\\x4a\\x14\\x52\\xee\\x16\\x81\\x50\\x95\\xde\\xb4\\x2b\\xf0\\x65\\x66\\x71\\x50\\x28\\xc1\\x18\\x25\\x82\\x0a\\x8a\\x23\\xc6\\x0d\\xa2\\xb6\\x8d\\xd9\\xa5\\x5d\\xad\\x2a\\x29\\xa4\\x96\\x44\\x43\\x81\\x7c\\x07\\xd7\\x76\\xb2\\x44\\xb1\\x51\\x86\\x81\\x9a\\x3b\\xbe\\xd4\\x14\\xab\\xf4\\x57\\x9a\\x3e\\xce\\x3a\\x3d\\xc7\\xb1\\x05\\xd0\\xa9\\xdb\\xa3\\x7b\\x9e\\xaa\\x78\\xbe\\x8e\\x46\\xe1\\x69\\x8b\\x59\\xb0\\x94\\x0b\\x01\\xf3\\x8b\\x28\\x3c\\x33\\xa9\\xa4\\xb1\\xd4\\xf8\\x14\\x4b\\x16\\xee\\xb5\\xfc\\x0a\\x7a\\xf0\\xd0\\x81\\x69\\x66\\x45\\xa1\\xea\\xb3\\xa7\\x87\\xcb\\xcf\\x88\\xfa\\xd9\\x3d\\xd6\\xcd\\x46\\xd2\\x95\\xa8\\x79\\xa1\\x77\\x50\\x33\\xa9\\x85\\x63\\x82\\x2e\\xf1\\xf6\\xb6\\x9a\\x58\\x1e\\x49\\x73\\x6c\\x8d\\x70\\x1b\\x44\\x53\\x96\\x93\\x40\\x52\\x1e\\x4a\\xd4\\xbf\\x94\\xb9\\x11\\xb0\\xe2\\xd8\\x6f\\x34\\xee\\xce\\x4a\\x63\\x85\\xff\\x1f\\xe6\\x32\\x20\\xcd\\x3c\\xc5\\x92\\xf3\\x6d\\x6c\\x49\\x1f\\xa1\\x8f\\x7c\\x14\\x04\\x36\\x0d\\x2a\\x77\\x53\\xfe\\x07\\x3e\\x09\\xa2\\xfc\\x42\\xa4\\xbb\\xea\\x55\\xbc\\x96\\xd7\\xf0\\x5c\\x98\\xae\\xd2\\xcc\\x4a\\x9f\\xae\\x8f\\xd4\\xa0\\x19\\x7f\\xf0\\x1f\\xa7\\xf0\\x04\\x6e\\x3c\\x3e\\xb5\\x9a\\xaa\\xbc\\xa3\\x13\\xa4\\xdd\\xaa\\x5d\\x20\\xd2\\x7c\\x2c\\x5f\\x1a\\xc6\\xd8\\x7f\\xd3\\xcb\\x4b\\xd3\\x5a\\x1e\\xc7\\x5d\\x10\\x4f\\x7c\\x36\\x73\\x31\\xa3\\xe2\\x95\\xe5\\x3c\\x4e\\x80\\xba\\xe1\\x4b\\x97\\x92\\xd0\\xd5\\x26\\xf7\\x40\\xd4\\xff\\x03\\x6f\\xaf\\x54\\x87\\x96\\x7f\\xfa\\xbe\\x8e\\x88\\x3d\\x3f\\xb0\\xd1\\x6f\\xaa\\xdb\\x28\\xe1\\x28\\x5d\\xed\\x41\\x57\\x0c\\x0b\\x07\\xc2\\x55\\x9b\\x53\\x1e\\x0f\\x92\\x54\\xef\\x88\\xe5\\xb1\\x0f\\x64\\xf4\\x83\\x9a\\x9a\\x0b\\x6c\\x3c\\x7f\\x1b\\x78\\x50\\xf4\\xad\\x9b\\xf0\\x99\\x9a\\x7f\\x2a\\xe7\\xc4\\x5a\\x65\\x8e\\xa5\\x30\\x36\\xfc\\x70\\x19\\x98\\x42\\xb8\\xe4\\x9e\\x60\\xf9\\x67\\xde\\x1f\\xf3\\xab\\xff\\xf6\\xcd\\x73\\x5b\\x7c\\xd8\\xb8\\xf9\\xe2\\x48\\xf1\\x56\\xf6\\xc6\\x54\\x38\\x69\\xeb\\x99\\x82\\x3d\\xae\\xa8\\x8d\\xeb\\xaf\\x79\\xf0\\x1e\\x65\\x21\\xec\\x63\\xfe\\x72\\x72\\x4e\\xe3\\xc8\\x22\\xb8\\x8b\\x39\\x68\\xb2\\x48\\x52\\x09\\x15\\x83\\xc4\\x9a\\xb3\\xc1\\x5f\\xa1\\xf7\\x9b\\x18\\xd9\\x8f\\x04\\xd9\\xb6\\x84\\x1c\\x9a\\x7c\\xa0\\xde\\x2f\\xcc\\x02\\xf9\\x5d\\xd6\\x49\\x49\\x2e\\x8b\\x56\\xa3\\x1e\\xc1\\xe2\\x44\\x33\\x7a\\xf6\\xaa\\xae\\xde\\x8b\\xf9\\x9f\\xc8\\x14\\xef\\x57\\xc0\\xd5\\xe0\\x8c\\x3c\\x7e\\xcc\\x18\\x97\\x98\\x0a\\xa1\\x69\\xa9\\x92\\x6d\\x20\\x69\\x8d\\xf6\\x93\\x0e\\x21\\x10\\xcb\\x46\\x0f\\x49\\x39\\x01\\x00\\x74\\x10\\x95\\xf8\\xed\\x00\\x41\\x2a\\xe6\\x96\\xd9\\x8e\\xfe\\xfd\\x29\\x0d\\xa5\\xf7\\xd0\\xb7\\x28\\xd2\\x0a\\x1e\\xbf\\xa6\\xbd\\x7d\\x27\\x0f\\x28\\x1a\\x98\\xc7\\xb1\\xe4\\x08\\x43\\x51\\x25\\xaa\\x48\\x3c\\x6b\\x7d\\x63\\x3f\\xf7\\x58\\x8a\\x94\\x16\\x58\\xf6\\x12\\x95\\x44\\xd6\\x29\\x45\\xb9\\xb8\\xaf\\x71\\xa8\\xc6\\x2c\\x0a\\x50\\x07\\x6c\\xb8\\x54\\x1b\\xa7\\xe4\\xbd\\xe4\\xed\\xe4\\x41\\x72\\x2c\\x6e\\xb9\\xdf\\x8c\\xfd\\x06\\x56\\x33\\x9e\\x86\\xd2\\x26\\xab\\xae\\xa0\\x5e\\xa0\\x47\\xf6\\xb8\\x30\\x77\\x01\\xf6\\xc9\\xa4\\x4c\\xc9\\xcb\\x83\\x7b\\x8e\\xb6\\x24\\x45\\x92\\x5e\\x8a\\x88\\x81\\xd2\\x53\\x8f\\xcb\\x2b\\x24\\x9e\\x4e\\xe8\\xb6\\x86\\xec\\xfb\\x49\\xc4\\xdf\\x86\\x40\\x1d\\x24\\x9a\\xac\\x35\\x84\\x1e\\x91\\x40\\x04\\xf9\\x45\\x5d\\x3f\\xde\\x37\\x5d\\x20\\xa0\\x1f\\xba\\x27\\xb1\\x97\\xa6\\x98\\xd3\\x84\\xc7\\x65\\x05\\x10\\x68\\x01\\x62\\x7e\\x83\\x36\\xbd\\x2d\\x76\\xd7\\x61\\xa8\"},\n{{0xc6,0x4d,0xd2,0x0d,0x42,0x62,0x75,0x26,0x19,0x8a,0x22,0x64,0x76,0x90,0xc8,0x95,0xb5,0xb4,0x5b,0x69,0x8f,0x57,0xa6,0x9d,0xfb,0xe4,0x8d,0xbd,0x42,0x6a,0xa4,0x70,},{0x2e,0x01,0xd4,0x04,0x16,0xf7,0x8a,0xcd,0xdb,0x34,0xb8,0x44,0x5e,0xa4,0xfd,0x0a,0xb3,0xfa,0x9e,0x66,0x43,0x04,0x47,0x52,0x21,0x3f,0x07,0xc7,0xf0,0xff,0x43,0xa0,},{0xde,0xac,0xc8,0xc2,0x32,0x18,0x72,0x76,0x76,0xd5,0x40,0xa2,0x3b,0xda,0xd7,0x81,0x02,0x11,0xe6,0xd5,0x7a,0xd2,0x94,0xc3,0x7d,0x4b,0x1c,0x9a,0xf6,0xb3,0x37,0xa5,0x3f,0x78,0x80,0xd2,0xba,0xfa,0x73,0xb3,0x05,0x08,0xc0,0x08,0x42,0x6b,0xf8,0xd7,0xc9,0x65,0xa1,0xf4,0xa4,0x22,0xa1,0xbc,0x7d,0x6a,0xd6,0x22,0x6f,0xd1,0x97,0x06,},\"\\x82\\x1b\\x9f\\x7c\\x16\\x10\\x4b\\x53\\x3b\\xd1\\x27\\x18\\x4f\\xd7\\x2a\\xde\\x09\\x2b\\x13\\xbb\\xd9\\xac\\xee\\xd2\\x9b\\x8d\\x10\\xf1\\x66\\x88\\x92\\x2d\\x16\\x5f\\x89\\x31\\xd5\\x3d\\xf5\\x90\\xfb\\x71\\x3b\\x67\\x4d\\x80\\x5c\\xe0\\xc9\\xd6\\xce\\x6c\\x43\\xba\\x69\\x68\\x19\\x1d\\x12\\xbf\\xa0\\x8a\\x8c\\xe2\\x2e\\x8f\\x33\\x6b\\x2b\\x49\\x1a\\xf2\\x5d\\x1b\\x16\\x06\\xf9\\x30\\xca\\xeb\\xe5\\x22\\x39\\x2a\\x87\\xd4\\x2c\\xe7\\xbc\\x16\\x7a\\xa7\\xb6\\x10\\x59\\x72\\x20\\xaf\\x31\\xa6\\x65\\x35\\x30\\x71\\xe8\\xd9\\xe5\\xf4\\x20\\x78\\xb9\\xc3\\x88\\xbf\\x04\\x02\\x58\\xe2\\x1f\\x9c\\x3a\\xb3\\x8c\\x04\\x27\\x61\\x8b\\x2c\\x28\\xd3\\x43\\x0d\\xf2\\x79\\x21\\xbf\\xc5\\x84\\x87\\xb3\\x46\\x19\\x78\\xbf\\xa8\\xbf\\x58\\x6c\\xfe\\x83\\x58\\xe0\\x92\\xf8\\xf4\\x74\\x66\\xe7\\x62\\x45\\x1d\\x50\\x16\\x4a\\x0d\\x74\\x36\\x0f\\x66\\xb4\\xcd\\x3a\\x35\\x75\\xda\\x01\\xda\\x23\\x75\\x24\\x30\\xc0\\x35\\xda\\x85\\x9f\\x57\\x7d\\xe2\\x22\\x90\\xaa\\xb4\\xed\\x7f\\x34\\xd2\\x67\\x40\\x6a\\xb5\\x47\\xeb\\x44\\x5c\\xc6\\x4d\\xf5\\x30\\x19\\x42\\x7f\\x4e\\xb7\\x2b\\xca\\x55\\x39\\x71\\x53\\xd0\\x1c\\xcf\\x7e\\xc9\\x7d\\x7a\\x96\\x7d\\x9a\\xff\\x46\\x23\\x1d\\x2e\\x20\\x27\\xb3\\x8f\\x3b\\x41\\xbd\\x2c\\xb1\\xb7\\x98\\xa4\\xae\\x88\\xab\\xf4\\x89\\x62\\x16\\xd3\\x15\\xbd\\x53\\x83\\x02\\x42\\x59\\xe5\\x97\\x42\\x80\\x2a\\x91\\x1b\\xad\\xcf\\x84\\x73\\xdb\\x91\\xaf\\x31\\x97\\x33\\x32\\x0c\\xb9\\x52\\x1e\\xf9\\xce\\x43\\x72\\x67\\xb6\\xea\\x17\\xbc\\xaf\\xe5\\xd0\\x90\\x3b\\x12\\x3a\\x35\\xc9\\x88\\xf4\\x98\\x34\\xf6\\x1d\\xd5\\x52\\x64\\x0a\\x32\\x76\\xda\\x26\\xaf\\x17\\xec\\x21\\xa2\\x02\\x96\\x58\\x6d\\xd6\\xf4\\xb3\\x6c\\x7a\\x4f\\x0b\\x89\\x9d\\x70\\xb4\\x2a\\xf8\\x9e\\x29\\x37\\x01\\x32\\xed\\xfb\\x72\\xd6\\x83\\x41\\x94\\xa1\\x60\\x93\\x60\\xb1\\xf1\\xfe\\xab\\x89\\xb9\\x6b\\x8e\\x8f\\x0f\\x68\\x98\\x7c\\x57\\xcc\\xe0\\xba\\xb7\\x68\\x11\\x37\\x18\\xfb\\x17\\x09\\xde\\x2d\\xf3\\x21\\x77\\xd4\\x40\\x85\\xda\\x5e\\xfd\\x9d\\xa7\\x0e\\x1a\\x85\\x8c\\x92\\xf2\\x45\\xac\\xfe\\xe6\\x4b\\x71\\xf3\\xeb\\x16\\xe0\\x4f\\xc1\\x39\\x89\\xe6\\x93\\x37\\x99\\x97\\x01\\xdd\\x73\\xab\\xc2\\x66\\xc9\\xfd\\x4c\\xff\\x91\\xa0\\xfd\\x04\\xfb\\xd8\\xb1\\x3b\\x12\\xe6\\xf4\\x50\\x38\\x57\\x15\\x84\\x8e\\x00\\x7f\\xa0\\xd4\\x63\\x11\\x9f\\xd7\\xde\\x63\\x25\\xb6\\x40\\x04\\x2b\\x65\\x42\\x12\\xe0\\xdb\\x8d\\xa1\\xad\\xeb\\xd2\\xa7\\x58\\x9f\\x77\\xee\\x4f\\x75\\x2d\\x28\\x2c\\xa1\\x11\\x9c\\x43\\x1b\\x17\\xad\\x0a\\x02\\x1e\\xf2\\xbf\\x95\\xe5\\xac\\x47\\x04\\xe6\\x2d\\x70\\x39\\xd0\\xe6\\x51\\xe4\\x56\\xd6\\x0e\\x63\\xba\\xde\\x40\\x1c\\xca\\x77\\xc9\\xa8\\x91\\x63\\x17\\x4d\\x50\\x22\\xd7\\x45\\xab\\xdc\\x76\\xb9\\xff\\xe2\\x54\\x41\\x55\\x23\\x5e\\x30\\x63\\xe6\\xe4\\xae\\xec\\x44\\xed\\x5d\\x8a\\xb4\\x08\\xd9\\x66\\xfe\\xc1\\x20\\x16\\xc1\\x30\\x73\\x0b\\xbc\\x55\\x87\\x32\\x06\\x5d\\xa8\\x00\\xa7\\x0c\\xbf\\xb0\\xfc\\xcc\\xa4\\x5d\\x00\\x28\\xcb\\xfd\\x96\\x32\\xdd\\xb2\\xf0\\xed\\x12\\xed\\xae\\x7b\\x93\\x0b\\x10\\x6c\\x9d\\x12\\x85\\xa4\\xb8\\x70\\xde\\x75\\x07\\x99\\x9c\\x74\\x79\\x3d\\xd4\\x97\\x40\\x87\\x19\\xc8\\x98\\xab\\xe4\\x9f\\x7f\\x33\\xa3\\x3e\\x69\\xb5\\x0f\\xa5\\xaf\\x94\\x80\\x06\\x85\\x66\\xd1\\xfd\\xdf\\x44\\x82\\xd7\\x97\\x04\\xad\\x8e\\xf1\\x1b\\x88\\xb4\\x2c\\xc6\\x9f\\xce\\x8a\\x55\\x7b\\x5b\\xa5\\x10\\xe7\\x08\\xb9\\x37\\x51\\x23\\x03\\x85\\x68\\x27\\x0d\\xe4\\x07\\x23\\x2e\\x95\\x62\\x1e\\x2d\\x04\\x57\\x0b\\xec\\x2c\\x41\\xec\\xcf\\xd8\\x55\\xb2\\x1f\\x0c\\x9b\\xba\\xa2\\x3b\\x5c\\x58\\x15\\xfc\\x88\\x8f\\x7f\\xbe\\xd4\\x82\\xc3\\x20\\xff\\xa1\\xe0\\x63\\xe8\\x7b\\x55\\xbc\\x8f\\x7e\\xee\\xa3\\x74\\x06\\x3a\\x9b\\xe6\\x5f\\x7e\\xd9\\x22\\x5b\\xf6\\xca\\x34\\xcf\\xa3\\x11\\xb7\\x9f\\x3a\\x25\\x8c\\x25\\x2e\\x63\\x45\\xed\\x6a\\xc8\\x47\\x48\\xf4\\x68\\x07\\xa5\\x5d\\x4b\\xa4\\x12\\x66\\x16\\x9c\\xd2\\x62\\xd4\\xf7\\x22\\x79\\xef\\x0c\\xaa\\x77\\xff\\x44\\x93\\x35\\x32\\xbd\\x13\\x74\\x75\\x6c\\x23\\xec\\x85\\xf5\\x5e\\xfe\\x9f\\xc2\\x33\\x1f\\x26\\xf8\\x81\\x62\\x9f\\x80\\xc2\\x69\\x2f\\x7f\\x53\\xe4\\xbc\\x6f\\x22\\xef\\xb4\\x54\\x57\\xa2\\x23\\xf0\\xd1\\xc4\"},\n{{0x0f,0x8e,0x9f,0x35,0x26,0xb4,0xfa,0xea,0x92,0x76,0xf2,0x2a,0x17,0x79,0xe6,0xf8,0x27,0x09,0x80,0x8f,0x6d,0x0c,0x61,0x2a,0xdf,0xe3,0x2a,0x6e,0x8a,0x06,0x10,0x05,},{0xd4,0x8c,0x3f,0x0f,0xde,0xf3,0x82,0xd1,0xd8,0x03,0x13,0xe8,0x46,0xfc,0xa9,0x5e,0x41,0x81,0x76,0xbb,0x5d,0xfa,0x9d,0x39,0x8c,0x1d,0x21,0x24,0x77,0x6f,0x69,0x0a,},{0x2f,0x59,0xa2,0x93,0x60,0x73,0x91,0x38,0x34,0xeb,0x15,0xa0,0xe0,0xbc,0xb9,0xaa,0x80,0x40,0x89,0x46,0x8f,0x24,0xdd,0x1b,0x2d,0x37,0xa1,0x93,0x4a,0xe9,0xba,0x10,0x20,0xff,0x64,0xb7,0x2e,0xec,0x03,0x26,0x8d,0x0a,0x7c,0x01,0x2c,0x4e,0x79,0x63,0x00,0xf6,0xdf,0x7a,0xdd,0xa0,0x1c,0x8b,0xc5,0xe9,0x01,0x5c,0xcd,0xee,0x1a,0x00,},\"\\x0c\\xcd\\x37\\xc4\\xcf\\xd8\\xe7\\x0c\\xa3\\xbb\\x39\\x46\\xd0\\x9d\\x70\\xd0\\xf6\\xa4\\xb8\\x1d\\x6d\\xfb\\x07\\x9d\\x78\\x73\\x74\\x80\\x71\\x58\\x98\\x80\\x92\\x73\\x82\\xf7\\x43\\x6a\\x6e\\xf8\\xf5\\x1c\\x25\\x54\\x73\\xdd\\x01\\xfe\\xb5\\x2c\\x8e\\xdb\\xe4\\xd3\\x25\\x57\\x13\\xe6\\x8d\\x64\\x0f\\x3d\\xcf\\x15\\x8f\\x2b\\xfb\\x9f\\xbe\\xcf\\x71\\xf0\\x71\\x9d\\xfe\\x8c\\xe6\\xb6\\x01\\x28\\x1b\\xa6\\xc2\\x0a\\x56\\xb4\\xf8\\xe7\\xca\\xa4\\xaa\\x9f\\x86\\x8f\\xbf\\xc5\\xe4\\x32\\x1c\\x22\\xd6\\x5f\\x03\\x82\\xc4\\x89\\x6b\\xf9\\xbe\\xbe\\x35\\x46\\x94\\x9e\\x81\\x85\\xa4\\xd8\\x17\\xe4\\x5b\\x5d\\x12\\x93\\x95\\x38\\x21\\xbd\\xd9\\x8e\\xc2\\x59\\xf6\\x4a\\x3d\\xe5\\x38\\x65\\xb1\\x49\\xea\\x01\\xc8\\xf6\\x83\\xec\\xda\\x61\\xda\\x5d\\xc1\\x0e\\x7e\\xbd\\xdd\\xfe\\x74\\x84\\xf5\\xeb\\x10\\x31\\xb7\\x91\\x65\\x87\\xca\\xa3\\x99\\xa0\\x6b\\x6f\\xea\\x4c\\x5e\\x6e\\x0b\\xe6\\x50\\xfb\\xdf\\x06\\xc1\\x03\\x6d\\xf2\\xcc\\x35\\xf6\\x2e\\xa0\\xea\\x71\\x3f\\x52\\x80\\x9d\\x77\\xf4\\x7c\\x2e\\x55\\xc9\\x23\\x92\\x48\\x16\\x80\\xb6\\x33\\x20\\x56\\x22\\x69\\x13\\xb0\\xce\\x88\\xa6\\xc5\\x5a\\x26\\xbd\\xb5\\xb8\\xba\\xb3\\xcf\\x46\\x95\\xa8\\xc5\\x22\\x30\\x2c\\x4e\\xba\\x37\\xd3\\x1f\\xf7\\x7e\\x58\\x30\\x1b\\xcc\\xfc\\x7c\\x7b\\xe8\\x58\\x0c\\x63\\x42\\x68\\x79\\x95\\xf4\\x4a\\xcd\\x19\\x09\\x65\\xae\\x0d\\x7b\\xf0\\x66\\x95\\x92\\xb6\\xad\\x88\\x74\\x3e\\xbb\\x36\\x0c\\x73\\xe0\\x48\\x4a\\x23\\xd2\\xf9\\xe9\\x9e\\x9e\\xb0\\x38\\xdc\\xbd\\x87\\xca\\x9b\\x1a\\x49\\x8f\\x1b\\x2d\\x35\\xfe\\xdd\\x7f\\x8e\\x1f\\x7f\\xd8\\xca\\x52\\x64\\x86\\x91\\x1e\\x07\\x6a\\xea\\xb4\\x87\\x7b\\xba\\xcf\\x37\\x8a\\x28\\x55\\xf9\\xc5\\xac\\x03\\x91\\x30\\xdc\\x69\\x0e\\x17\\x7d\\x67\\xb2\\x44\\xcc\\x8a\\xd0\\x32\\x37\\x9e\\xf7\\x1f\\xe0\\x5e\\x9c\\x86\\x13\\xd8\\xf5\\xd6\\xea\\x3d\\x4e\\x3e\\x47\\x22\\x20\\x29\\xcc\\x00\\x42\\x53\\xbe\\x47\\xf8\\x7f\\xb5\\xe3\\x31\\x4c\\x48\\x98\\x13\\x4b\\x87\\xac\\xf1\\x0b\\x25\\x38\\xba\\xd8\\x97\\xbd\\xc5\\x01\\x2d\\x8f\\x97\\x62\\xc8\\x71\\xb6\\x53\\xd4\\x00\\xfe\\xe0\\xce\\xed\\x5e\\xf6\\xbd\\xd1\\x6f\\xaf\\x3f\\x0a\\xbd\\xbd\\x72\\xcd\\x0a\\x12\\x94\\x05\\x46\\xf0\\x99\\x5f\\xf1\\x4b\\x0f\\x1b\\xd5\\x48\\x56\\xff\\x74\\xc3\\x6e\\xb4\\xf2\\x2d\\x72\\x87\\xae\\xfd\\xc6\\x09\\x99\\x8c\\x1f\\x41\\xbc\\xc3\\xbb\\x3a\\x5f\\xa4\\x92\\x34\\xf4\\xfa\\x8e\\x92\\x9c\\xd0\\xf5\\x54\\xb3\\x15\\x39\\x5d\\xae\\x87\\x3c\\x61\\xca\\x70\\xe0\\x41\\x0c\\x2f\\xd5\\xa1\\x15\\xd2\\xa6\\xff\\x1f\\x1c\\x94\\xb2\\x7b\\xa4\\x50\\xb8\\x19\\x4b\\x21\\xf0\\x95\\xc6\\x1a\\x5f\\x21\\x5e\\x3c\\x84\\xf5\\xd4\\x3f\\x0e\\x73\\x62\\x86\\xd3\\x3b\\x8c\\x47\\x81\\x4d\\xb9\\x79\\xf9\\xdc\\x00\\x91\\x98\\x46\\xbe\\xe6\\x85\\x33\\x7d\\x99\\x55\\x5a\\x24\\x47\\x2e\\x6b\\x00\\xb3\\xf4\\xa1\\x43\\x11\\xa6\\xc7\\xc9\\x04\\xba\\x58\\x89\\xda\\x6c\\x1d\\xdc\\xc1\\x11\\x75\\x80\\xf5\\xfb\\xc4\\x1f\\x2b\\x8a\\x42\\x68\\xcf\\x0e\\x9f\\xa5\\xbf\\x41\\x25\\x34\\xc9\\xe4\\x05\\x2a\\xac\\xb5\\x04\\xcb\\x86\\xe2\\x14\\x7a\\xb8\\x02\\x3d\\x58\\x80\\x0b\\x76\\x3f\\x9a\\xbf\\x9d\\x04\\x40\\x78\\x8a\\x51\\xdf\\xe5\\xcb\\xd4\\x42\\x30\\xba\\x52\\x28\\xf1\\xf5\\x96\\x0e\\xa3\\xa4\\xe4\\x04\\x4d\\x36\\xda\\xf8\\x11\\xcb\\xdb\\xec\\x5d\\x69\\x64\\x63\\xd8\\xe9\\x41\\xf2\\x72\\x17\\x56\\x3b\\xb4\\x4a\\x21\\x18\\xa4\\xf5\\xac\\xd6\\xe7\\x94\\xde\\x17\\xe0\\x28\\xcb\\xde\\xef\\xde\\xf2\\xcb\\xf0\\x3d\\xd3\\x2e\\x78\\x99\\xe6\\x5a\\x1c\\xf8\\x39\\xf5\\xd9\\x0e\\x1f\\x8c\\x36\\x4b\\x57\\x7f\\xe3\\x10\\x53\\x53\\xf6\\x67\\x68\\xdb\\xf7\\xaf\\x0c\\x52\\x1a\\xa8\\xa4\\x9f\\x7a\\x22\\x08\\x2d\\x88\\xf9\\x01\\x49\\x8c\\x90\\xb9\\xd7\\x77\\x7e\\xd2\\xf9\\xf0\\xe8\\xa5\\x52\\xd8\\xa1\\xfa\\x5e\\x96\\x32\\xed\\x85\\x32\\x58\\xc9\\xc2\\x15\\xb6\\xdb\\xb4\\x11\\x1d\\xcf\\xca\\x55\\x4b\\xfb\\xc9\\xbb\\xa2\\x2f\\x88\\xbc\\x55\\x55\\x2c\\x6d\\x86\\x25\\x56\\xd7\\x41\\xda\\xd5\\x9f\\x21\\x5e\\x37\\x28\\x83\\x46\\xca\\x7d\\x7f\\xd8\\xc6\\x5a\\x38\\x0d\\x72\\x0c\\xaf\\xf9\\xef\\xa1\\x49\\xf3\\xfd\\xa2\\x32\\xda\\xa5\\xb1\\x2e\\xf1\\x1c\\x0a\\xf0\\x86\\x2b\\xd0\\x22\\x9e\\x07\\x5a\\x3c\\x6b\\x60\\xef\\x0b\\xbb\\x3d\\xad\\x7f\\x29\\x08\"},\n{{0xfe,0x7c,0xdc,0x79,0x66,0xd0,0xff,0xb9,0xc7,0x6f,0x4a,0x18,0xe7,0xf0,0xbf,0x90,0x69,0x0e,0xb7,0x6d,0xc3,0xd3,0xd5,0x08,0x84,0x64,0x8e,0x2e,0x39,0x37,0xd0,0x20,},{0xa1,0x2e,0xe9,0x81,0x2d,0x6a,0xf6,0xaa,0x48,0x79,0xfa,0x72,0xbc,0x0a,0x69,0x80,0x4e,0xa1,0xa8,0x5f,0x9b,0xc4,0xa2,0x6a,0x5b,0xa7,0xcf,0xbb,0x91,0x4d,0x0d,0xd9,},{0xb5,0x2d,0x03,0xfd,0xeb,0xcd,0x42,0x97,0x37,0xef,0x70,0x92,0x06,0x87,0x21,0x1f,0xbb,0x4c,0x04,0xf8,0x1e,0x35,0x5c,0xec,0x70,0x72,0xc5,0x05,0x41,0x75,0xd2,0xed,0x77,0xf3,0x8f,0x46,0x6f,0x00,0x14,0x22,0xda,0x8f,0xcd,0xf0,0x67,0xdb,0x14,0x51,0x00,0x7c,0xab,0x60,0x7f,0x04,0x9c,0x2e,0x26,0x07,0xb5,0x7d,0x44,0x71,0x3c,0x04,},\"\\xdc\\xb9\\x1c\\xf1\\x55\\x46\\x1a\\x60\\xdf\\x07\\xee\\xc2\\x9d\\x98\\x61\\x6e\\xd1\\x72\\x8b\\x34\\xef\\xa9\\xe1\\xf7\\x44\\x5a\\x91\\x58\\xa8\\xf8\\x8d\\x7f\\xaa\\xae\\x0e\\x24\\x72\\x5a\\xef\\xf2\\x63\\xc3\\xf7\\x4f\\x0c\\x68\\x4f\\x18\\x58\\xf0\\x5b\\x69\\x95\\xd2\\x84\\x6b\\x6a\\x83\\x2f\\x67\\x08\\x5a\\x42\\x76\\xd8\\x66\\x1a\\xeb\\xd3\\xbf\\xcc\\x73\\x18\\x1f\\x1f\\x51\\x02\\x93\\xb6\\xde\\x5e\\x4b\\xb2\\x3f\\xf2\\xdc\\xa1\\xdf\\x60\\x8c\\xb1\\x4a\\xe5\\x22\\xac\\x4b\\x51\\xe1\\xf9\\xb9\\x73\\xab\\x8b\\xaf\\xcd\\x53\\x4e\\x71\\xc5\\x71\\x81\\xb1\\x18\\x96\\xee\\x10\\x61\\xfb\\x36\\x9c\\xa4\\xd2\\x93\\x9d\\x1e\\x57\\x06\\x0d\\x9f\\x4d\\xb0\\xa5\\xc0\\xb0\\x7d\\x52\\x68\\x7f\\x15\\x78\\x17\\xe6\\x3e\\x2f\\xe7\\xeb\\xcc\\x3e\\x7c\\x95\\xef\\xe0\\x5b\\x85\\x99\\x10\\xc9\\x5e\\xed\\xe8\\x6d\\x14\\x39\\x9e\\x61\\x62\\x48\\xa2\\x8c\\x24\\xc4\\x14\\xdb\\xb6\\x93\\xaf\\x9b\\xe4\\x35\\xa3\\xa9\\xcd\\xc3\\x3e\\x0e\\x2a\\x58\\x69\\x18\\xd9\\x1b\\x8a\\x85\\xce\\xdd\\x16\\x12\\xd7\\xc1\\xa2\\x17\\x92\\xbd\\xd4\\x3a\\x91\\x5b\\x15\\x7e\\x04\\xbb\\x3a\\x44\\xec\\xbe\\x23\\xfa\\x49\\xcc\\x55\\xda\\xab\\xbe\\xaa\\x15\\x5a\\x73\\x7f\\x76\\x5b\\x8d\\xdb\\x0f\\x3b\\x15\\xd4\\xec\\xf2\\xce\\xf7\\x05\\x4c\\xa7\\x3e\\xc8\\x7d\\x91\\x75\\x2c\\x2e\\x99\\x19\\x5c\\xdb\\x19\\x58\\x84\\x4f\\x14\\x4e\\xda\\xb8\\x2a\\x97\\x54\\x9f\\xc9\\xce\\xc0\\x8e\\x87\\x11\\xcf\\xf8\\x63\\xb6\\x3f\\xc2\\x31\\xa7\\x7f\\x76\\x2e\\x5c\\xd9\\xda\\x9d\\x59\\x40\\x92\\x52\\xe9\\x9a\\xb0\\x4c\\x42\\xbc\\x57\\x09\\x7e\\x46\\x4e\\x3c\\x6a\\x48\\xd8\\x02\\x41\\xe6\\x32\\x5e\\x3e\\x40\\x94\\x98\\x9b\\x34\\xc0\\xe8\\xb3\\x2b\\x1a\\x78\\x29\\xd5\\x4d\\xf3\\x2a\\x05\\x0e\\xe8\\x7d\\x8f\\x7c\\x4f\\xe3\\xe4\\xf4\\xf7\\x04\\x9d\\x1f\\xee\\xcd\\xbe\\xa6\\x71\\x08\\x35\\x0d\\xb4\\xe8\\xed\\xbe\\x3c\\x3f\\xf8\\xab\\x2a\\x25\\xd1\\x47\\xb1\\xc1\\xc5\\x82\\x1b\\x0f\\x8c\\x21\\x04\\x2d\\x65\\x5d\\xb8\\x31\\x69\\x1f\\x59\\x98\\x3f\\x27\\xd2\\xed\\x1d\\x49\\x06\\xc5\\x44\\xe2\\x4e\\x79\\xbe\\x68\\x65\\x3c\\x9b\\x22\\x9a\\x7f\\xb6\\x1e\\xf5\\x45\\xba\\xb1\\x6e\\x98\\x81\\xcb\\x4d\\x92\\x65\\xe2\\x93\\x59\\x0a\\x0b\\xc2\\xdc\\x86\\xba\\xd2\\x30\\x07\\xff\\x40\\xc9\\x58\\x61\\x92\\x3b\\x49\\x82\\x41\\xc1\\x0d\\x26\\xbf\\x48\\x48\\xf6\\x2b\\xa7\\x38\\x3f\\x64\\x9d\\xc3\\x8a\\xf1\\x84\\x0d\\x0d\\xe9\\x28\\xa9\\xbf\\xee\\x5e\\x11\\xb5\\x14\\x34\\x16\\x3a\\x7a\\xb1\\xed\\x53\\x74\\x15\\xf1\\xe9\\x32\\x85\\xe3\\x69\\x92\\x05\\x72\\x01\\x58\\xf9\\x55\\x7d\\x86\\x41\\xed\\x2b\\xf4\\x85\\xb8\\x21\\x2c\\x8f\\x82\\x66\\x8b\\xac\\x3c\\x22\\x8e\\x69\\x24\\xc1\\x7d\\x0d\\x98\\xf2\\xe6\\xd9\\x23\\x43\\x71\\xc4\\x42\\x5e\\xb7\\x58\\x68\\x9f\\xdb\\x0d\\xc1\\xce\\xa1\\x39\\x4a\\x28\\x62\\xe8\\x7b\\xb3\\x8e\\x62\\x4c\\x34\\x79\\x91\\x68\\x61\\x32\\x78\\x22\\x5f\\xb5\\xe1\\x9c\\x92\\x47\\xad\\xa3\\x55\\x54\\xf2\\xc4\\xad\\xdb\\xb6\\x1d\\x5a\\x50\\x2a\\x70\\x81\\x27\\xd6\\xef\\xbc\\xa8\\xf7\\x35\\x09\\x0b\\xdf\\xdd\\x88\\xdb\\x29\\xfb\\xd1\\x4b\\x69\\xab\\x12\\x62\\xf0\\xc3\\xe2\\x6d\\x26\\x3a\\x59\\xc5\\xae\\x46\\x39\\x06\\x53\\x83\\xd5\\x25\\x0b\\x54\\xcf\\x59\\x2b\\xb7\\xad\\xfe\\xaa\\xe0\\xd2\\xfe\\x81\\x6b\\x63\\x81\\xe8\\x6e\\xa2\\xd1\\xc7\\x18\\x13\\xcb\\xc3\\xd8\\xfe\\x2d\\x31\\xde\\x7b\\x30\\xfb\\x6e\\xc2\\x29\\x4f\\xe4\\x53\\x6a\\x36\\xc6\\xa1\\x83\\x5a\\x71\\x62\\xab\\x4b\\xf8\\x9d\\x19\\x46\\x61\\x19\\x65\\x7b\\x0e\\x46\\x45\\xae\\xf5\\x03\\x50\\x5b\\x4d\\x55\\xdf\\x97\\x7b\\xd2\\xc9\\x0c\\x64\\x40\\x6f\\x49\\x70\\xd5\\xcf\\xf2\\x45\\xb8\\x35\\x32\\x2a\\x6f\\xbe\\x23\\x4e\\x5e\\xfb\\xb5\\xea\\x45\\xe8\\xf0\\xd3\\x97\\x3b\\xe4\\xaa\\xa2\\xaa\\xda\\xab\\x07\\x7d\\x6c\\x9b\\x25\\xbd\\x44\\x94\\x40\\x9e\\x93\\x47\\x9d\\x2d\\x15\\x07\\xf6\\x6b\\xc8\\xbe\\xf8\\x29\\x99\\xa1\\x3c\\x79\\x43\\xb4\\x72\\xb9\\xe6\\x1e\\xc2\\x9d\\xeb\\xef\\xbf\\x22\\x41\\x42\\x3e\\x0f\\xaa\\x42\\xc1\\xa3\\x38\\xa7\\xa6\\x13\\x1d\\xed\\x93\\x5b\\xa0\\x3a\\x28\\x66\\x2e\\x68\\x59\\x33\\x68\\xdd\\xe5\\x4b\\x46\\x2f\\x2a\\x5f\\xb7\\x46\\x18\\x5f\\xf5\\x50\\x3e\\x69\\xba\\x36\\xbf\\x16\\xf7\\x14\\x58\\xcd\\xd0\\x57\\xe5\\xc1\\x72\\x67\\xf6\\x74\\x98\\xd6\\x52\\x86\\x0b\\x46\\x5e\"},\n{{0xf6,0xc9,0xab,0x5e,0xa7,0x5f,0x29,0x4e,0x8e,0x0c,0x07,0xc4,0xc0,0x9e,0xd8,0xee,0xa3,0x11,0x3b,0xdf,0xc2,0xef,0x75,0x9e,0x20,0xa2,0x64,0x57,0x16,0x04,0x10,0x8d,},{0xb1,0x2f,0xf5,0x5b,0xd3,0xec,0x42,0x61,0x0e,0xac,0xea,0x28,0xb3,0x13,0xa1,0x6e,0x19,0xc9,0xe8,0xb4,0x7c,0x2b,0x15,0x17,0x09,0x91,0xbe,0x08,0x8d,0x65,0xcf,0x63,},{0xa7,0xf9,0xd0,0x8b,0xa1,0x41,0x83,0xef,0x24,0x7f,0x2c,0x25,0xfe,0xcc,0x2b,0x83,0xed,0xa6,0xde,0x58,0x02,0x2e,0x46,0x6c,0xe7,0x8f,0xcf,0x50,0xf7,0x1c,0xe2,0x61,0x62,0x44,0x65,0x62,0xee,0xa4,0x5d,0x63,0xa2,0x1c,0x3b,0x22,0x56,0x1f,0xd4,0x68,0x00,0x58,0xac,0xb8,0x25,0x40,0x7a,0x15,0x40,0x8f,0x27,0x13,0x61,0xa1,0x46,0x0f,},\"\\x71\\x62\\x3b\\x39\\x74\\x3e\\x39\\xc7\\xe0\\x86\\x38\\x80\\x6d\\x46\\x8a\\x1a\\x8a\\x6f\\x35\\xc2\\xae\\x38\\x8e\\xef\\xc2\\x73\\x74\\xbb\\x52\\x53\\x88\\x14\\xc4\\xb3\\x6c\\x9b\\x8e\\x38\\x9a\\xd8\\x31\\x83\\xde\\x02\\xa1\\xbb\\xd0\\x32\\x57\\x34\\xe4\\x61\\x87\\x54\\x09\\x23\\x37\\xd3\\xe7\\xdc\\x12\\x56\\x92\\x8e\\x35\\x28\\x87\\x0c\\xa7\\xf0\\x06\\x13\\xa2\\x5b\\x71\\xbb\\x15\\xd1\\xd9\\xea\\xaf\\xf9\\xf2\\x26\\x9b\\x71\\xc1\\x97\\x69\\xe0\\x03\\xce\\x84\\x56\\x14\\xb2\\xec\\x95\\xed\\x28\\xca\\x85\\x5b\\x52\\x21\\xd4\\xcb\\x80\\xa6\\xca\\x94\\x66\\xaa\\x33\\xe2\\x51\\x0d\\xdf\\xf7\\xdc\\xe1\\x86\\x15\\x9d\\xa7\\x0f\\xc8\\xb1\\xfb\\xac\\x12\\xa2\\x6e\\x1f\\xc0\\x94\\x22\\x76\\x89\\x2a\\xd6\\xe9\\xb0\\x03\\xf5\\x69\\x59\\xbd\\x31\\x3a\\xf2\\x89\\xe7\\xa0\\x53\\x2a\\x66\\x4b\\x76\\xb9\\x6b\\x91\\x98\\x54\\xe0\\x65\\x0c\\xb8\\xc5\\x2e\\xc4\\xc5\\xfb\\x50\\x53\\xaf\\x2f\\x0c\\xf8\\xc0\\xf2\\x2a\\x52\\x3f\\x9e\\x2c\\x64\\x19\\xdf\\x8d\\x0b\\x71\\x4e\\xe3\\x77\\x68\\x00\\xeb\\xfa\\x70\\x77\\x60\\x84\\x66\\x7d\\x6d\\xcf\\x54\\x1f\\x14\\xcf\\x16\\x62\\x62\\xe0\\xf6\\x4c\\x42\\x76\\xae\\x28\\x88\\x5e\\x6c\\xfd\\x09\\x7b\\x70\\xc0\\xd6\\x18\\x6e\\xa5\\xdb\\xd0\\x33\\x32\\x3c\\x98\\x76\\x13\\xda\\x08\\x64\\x5d\\xe0\\x72\\x08\\xba\\xe1\\x2a\\x17\\x8d\\x8f\\x7f\\x65\\x0a\\x25\\xaf\\xbd\\x70\\x1c\\x85\\xa1\\xba\\x63\\x9e\\xf9\\xf1\\x21\\xc4\\x0c\\x5c\\x12\\x9a\\x47\\x37\\x34\\x33\\x86\\xa4\\x81\\x83\\xff\\x3c\\x59\\x13\\x89\\xd8\\x9e\\xcd\\xa5\\x26\\xcf\\xfb\\x26\\x74\\xf1\\x7b\\xb1\\xc2\\x30\\x90\\x55\\x4b\\x13\\x40\\x84\\x97\\x96\\xa6\\xd4\\x44\\x46\\x0b\\xb4\\x19\\x42\\x7e\\x93\\xe6\\x58\\x5b\\x0f\\x4f\\x06\\x5a\\xd8\\x7e\\xe6\\xed\\xf5\\x4b\\xe6\\x18\\x8a\\x1d\\xd5\\xac\\xe1\\x36\\x4d\\xef\\xa5\\x61\\xf7\\x4e\\x26\\x76\\x9c\\x9b\\x29\\x1e\\xe7\\x55\\x52\\x76\\x50\\x1c\\x6a\\x49\\x08\\x0d\\xa0\\x92\\x4f\\x37\\x92\\xc2\\xa7\\x28\\xa5\\x20\\x07\\xb1\\xc0\\x7c\\x95\\x57\\x8f\\xed\\xaf\\x40\\x39\\x96\\x23\\x9e\\x9c\\x55\\xa9\\xa4\\x4c\\x3d\\xfc\\xc3\\x7c\\xdf\\x03\\xfb\\x48\\x5d\\xb5\\xa0\\x8d\\xff\\x15\\xa7\\xa4\\xf7\\xb7\\xf1\\x54\\x74\\x2e\\x84\\x31\\x56\\x4d\\xc1\\x7d\\xbd\\x43\\x2e\\x10\\x33\\x7c\\x22\\x76\\xfc\\xfd\\x9d\\x70\\xf7\\xc3\\xd5\\x70\\x39\\x3a\\x0c\\x19\\xf6\\x40\\x51\\xc7\\x3a\\x87\\x0e\\x20\\x55\\x84\\x10\\x65\\x31\\xd1\\xfd\\x2a\\x1d\\xd1\\xc9\\xd0\\xfc\\xe1\\x4f\\xfa\\xaa\\x07\\x7b\\xb7\\xe2\\x60\\x25\\x1e\\xed\\x6c\\x62\\xbc\\x6e\\xdc\\x24\\x22\\x51\\x94\\x40\\xc2\\x24\\x4e\\xba\\x38\\x40\\x46\\xb0\\xed\\xda\\xa6\\xcf\\x2c\\x1c\\x7e\\xee\\xbf\\xcd\\x78\\xfc\\xae\\x18\\xb8\\x22\\x90\\x55\\x2b\\x59\\xc0\\x46\\x3d\\xc4\\x50\\x61\\x8b\\xa6\\x7c\\x77\\x0d\\xec\\x0e\\x22\\x9b\\x84\\x60\\x93\\x6c\\xa8\\x19\\x56\\x2b\\xcb\\x36\\x96\\x9c\\x8f\\xf7\\x0b\\xf1\\x13\\xc1\\x16\\x71\\xe0\\x0b\\x94\\x13\\x55\\xbf\\x01\\xad\\x54\\xb0\\x5c\\xfe\\x2a\\x04\\x8b\\x38\\x72\\x8c\\xbd\\xd1\\xb4\\x98\\x09\\xe1\\xf2\\x07\\xac\\xa3\\x09\\x8d\\x99\\x42\\xee\\xc4\\x7d\\x6c\\x9d\\x41\\x3b\\x37\\xc9\\x14\\xfe\\xdd\\x38\\xac\\xd5\\xff\\xe4\\x96\\xca\\xc7\\x57\\xc2\\xef\\x8b\\x77\\xbd\\x84\\x03\\xd1\\x4b\\x1f\\xc9\\x8a\\x90\\x3f\\xe2\\xb9\\x79\\x46\\x82\\x33\\xa7\\xf2\\xae\\xd6\\xf8\\xd5\\x09\\xd8\\x74\\xe1\\xdc\\xe0\\x51\\x49\\xaf\\x9d\\xf3\\xfe\\x45\\x95\\xc7\\x1e\\x8b\\xc4\\x63\\xde\\xe9\\x38\\x4d\\x5e\\x05\\x05\\xd2\\xa6\\xb0\\xa2\\xb8\\xa1\\xed\\x62\\x16\\xaa\\xae\\x9d\\xcc\\x76\\x02\\x48\\x7a\\x4c\\x08\\x51\\xfd\\xf0\\x96\\x29\\xc1\\xe9\\x91\\x18\\x80\\x9a\\x95\\x44\\xa6\\x57\\x7a\\xf9\\xf9\\x15\\xd1\\xe6\\x5d\\x81\\x62\\x20\\xc4\\x8c\\x84\\x90\\xfa\\x9b\\x70\\xda\\x42\\x2a\\xd6\\x80\\x02\\x23\\xd6\\xd8\\xc3\\x40\\xf9\\xea\\xb2\\xcc\\x7e\\x14\\x93\\x62\\x12\\x4a\\x30\\x0b\\x40\\xcb\\xb8\\xc0\\xa6\\x5d\\xa3\\x01\\xdb\\xba\\x93\\x1b\\xa5\\x64\\xf3\\x59\\x73\\xca\\x8b\\xf2\\xd1\\xed\\xb5\\x6c\\x19\\x46\\x61\\x95\\x5b\\x3b\\x68\\x38\\x1f\\xa1\\x5d\\x4b\\x8d\\xc6\\xad\\xa1\\xa5\\xce\\xbd\\xa3\\xa4\\xcc\\xc5\\x51\\x23\\xe0\\x05\\x7f\\x4f\\x82\\x10\\x41\\x93\\x7d\\xd5\\x49\\x20\\x9c\\x82\\xe1\\x16\\x57\\x0b\\xc9\\x08\\xa2\\x8e\\x32\\x99\\xa9\\x44\\x14\\x43\\x49\\x8f\\x74\\xb3\\xcc\\x88\\xe1\\xa6\\x2d\"},\n{{0x43,0x10,0x3d,0xf0,0x1a,0x48,0xa0,0x3c,0x57,0xf3,0x2f,0x52,0xd7,0x0c,0x68,0x49,0xee,0x44,0x58,0x0b,0x2a,0xb4,0xee,0x72,0xd5,0x48,0xd8,0x48,0x13,0x4f,0x7c,0xeb,},{0xa3,0xcb,0xe0,0xd6,0x4b,0x05,0x60,0xbc,0xb5,0xae,0x00,0x90,0x01,0xe3,0x14,0xd9,0xec,0x90,0x79,0x01,0xdd,0x74,0xa8,0x04,0xa0,0x05,0x90,0x22,0xed,0x9c,0x6d,0x04,},{0x19,0x54,0x47,0xbe,0xb1,0xde,0x4a,0x7e,0x36,0xea,0x89,0xa6,0xce,0x3c,0x99,0xbc,0xc8,0x94,0x11,0xdf,0x5e,0x0b,0x15,0xf7,0xba,0x0b,0x1d,0x11,0x0c,0x45,0x6a,0xbc,0x6b,0x3f,0x5f,0x1d,0xa6,0x10,0x6e,0xd8,0x87,0x86,0x4b,0xa5,0x6a,0xab,0x46,0x6a,0x8a,0x63,0xb3,0x35,0xcf,0xcf,0x4c,0x64,0xd6,0x5c,0x0e,0x6f,0xb4,0x80,0xb4,0x01,},\"\\x73\\x8c\\xbf\\x06\\xd0\\x0d\\x4d\\xcd\\x5e\\x5f\\x24\\x3a\\x1c\\x18\\xdd\\x5e\\xc2\\x02\\x78\\x88\\x46\\x95\\xa1\\xcf\\x3b\\xea\\x67\\xbb\\x5b\\x05\\xdd\\x7e\\x60\\xa2\\xa2\\x4f\\xd3\\x25\\xbe\\x6b\\xf4\\x6b\\x46\\x28\\x73\\xec\\x90\\x7f\\x9d\\xe8\\x8d\\xc2\\xc7\\x62\\x62\\x0b\\x7e\\x0e\\xf7\\x27\\x65\\xd4\\xbd\\xa6\\x62\\x45\\x49\\x93\\xc8\\x28\\xa1\\x74\\x6e\\x9e\\xd8\\xd1\\x9d\\xff\\x43\\xc4\\xc4\\x85\\x27\\xac\\x84\\x5f\\x21\\x86\\xa4\\xad\\x7c\\x1d\\x99\\x2a\\x16\\x24\\x5c\\xd5\\x73\\x07\\x3e\\x09\\x40\\xdc\\xee\\xd3\\x68\\x11\\x0b\\xb5\\xfd\\x0a\\x4c\\x88\\x34\\xce\\x88\\xa7\\x71\\x25\\xb9\\x14\\x73\\x93\\xc8\\xb5\\x8c\\xb1\\x6e\\x5e\\xbd\\xc1\\x82\\x44\\xeb\\xfa\\x48\\xba\\xba\\x46\\x97\\x3f\\xdc\\xd4\\x85\\xb1\\xb2\\xe5\\xf3\\xb0\\xe7\\x09\\x92\\xcf\\x19\\x99\\x58\\x06\\x38\\xd8\\x7f\\x1f\\x5b\\x27\\xc4\\xd7\\xf9\\x1d\\xec\\xf3\\x7d\\xe2\\xe7\\x34\\xe3\\x19\\x55\\x35\\xc6\\x31\\x08\\x2b\\x3e\\xba\\xa8\\xce\\x30\\xa9\\xc2\\xc2\\xdb\\x01\\x6d\\x7d\\x35\\x47\\xe6\\x21\\x61\\x88\\x50\\xe2\\x20\\x40\\x03\\x8d\\x0f\\xe0\\xfa\\xea\\x2f\\x9b\\xf5\\x10\\xb6\\x82\\xc4\\xfd\\x14\\x75\\x0e\\x89\\xb4\\xc1\\x99\\xef\\x0c\\x99\\x05\\x00\\x54\\x3e\\xee\\xab\\x5f\\x0b\\x50\\x7a\\x31\\x31\\x99\\xc2\\xa2\\xa0\\x26\\x2d\\x6d\\x81\\x4c\\xbc\\x09\\x33\\xc5\\x92\\xe2\\x56\\xc3\\xe2\\x9d\\x52\\x4b\\x06\\x6e\\xa5\\xa4\\x54\\x33\\x61\\xa1\\x04\\x50\\xe0\\xaa\\x67\\x5c\\x61\\x40\\x8f\\x30\\x7f\\x26\\xee\\x58\\x96\\x9d\\x63\\x27\\x8f\\x13\\x5b\\x7d\\xcb\\x66\\x6b\\x93\\xf2\\xca\\xcf\\xd8\\x38\\x73\\x47\\x1e\\x97\\x4a\\x28\\x6b\\x09\\x02\\x3f\\x50\\x15\\xfa\\x1a\\xaf\\x18\\xbf\\xbf\\xa5\\xf7\\x43\\x85\\xd0\\xdf\\x6b\\x9a\\xdd\\x51\\x6f\\xfc\\x0c\\x31\\x13\\xe3\\x7e\\x09\\x78\\x38\\x64\\x6a\\xc9\\x30\\x54\\xff\\x4d\\x96\\x02\\x06\\x67\\x44\\xba\\x33\\x96\\x95\\x3f\\xd7\\x81\\x68\\x13\\x01\\x70\\xbb\\x27\\x5c\\x15\\x2b\\xdd\\x36\\x6f\\x73\\x06\\x5c\\x0a\\x7a\\xd7\\xad\\x00\\x75\\x8c\\xb9\\x9a\\x7a\\xc1\\xb7\\x80\\x9d\\x26\\xdf\\xaa\\xc7\\x58\\x46\\x82\\x01\\xee\\xb6\\x0d\\xea\\x36\\x8c\\x33\\xf2\\x57\\xaf\\xe2\\xf1\\xb4\\xc0\\x2e\\x37\\xba\\xfe\\x40\\xf5\\xd7\\xfd\\x40\\xc8\\x7d\\x1c\\x56\\xa0\\xcb\\x28\\xe9\\xd2\\x83\\x69\\xa3\\x92\\x4b\\xce\\xf8\\xb6\\xd9\\x99\\xdc\\xf4\\x29\\x4d\\xd8\\xc4\\x14\\x3d\\x75\\xc6\\xc2\\x5b\\x5a\\x45\\x44\\x48\\x8d\\xde\\x72\\x52\\x48\\xc7\\x8d\\x93\\xc1\\x5b\\x81\\x5b\\x01\\xcb\\xd0\\xf3\\x1d\\x1b\\x00\\xac\\x04\\x83\\x7e\\xf8\\x5b\\x40\\x03\\xfc\\x96\\xd4\\x45\\x7a\\xc5\\xa0\\x23\\x62\\x3e\\x67\\xb6\\x6d\\xa4\\x70\\x0a\\x08\\x59\\xf8\\x3f\\xdc\\xcd\\x3c\\x7a\\xae\\x09\\xde\\x09\\xa0\\x57\\xe0\\x0d\\xb4\\x4a\\x2a\\x6a\\xac\\xaa\\x21\\x74\\x6a\\x49\\xb8\\x22\\x46\\x89\\xa5\\xcc\\x18\\x54\\xba\\x3d\\xc4\\xaa\\x2a\\xa3\\x45\\x24\\xe7\\xa5\\xa8\\x9d\\x11\\xee\\xa3\\x56\\xaa\\xea\\x5e\\xf5\\xfb\\xf5\\x42\\xc9\\x9f\\x54\\x4d\\xb9\\x40\\xf5\\x08\\x68\\x38\\xee\\x2a\\xb2\\x18\\xb8\\xd3\\xf2\\xe1\\x07\\xd0\\xb2\\x9d\\x4b\\x04\\x83\\x0e\\xed\\x79\\xc0\\x76\\x8e\\x02\\xc2\\x84\\x4b\\x3c\\xba\\x32\\x68\\x95\\xf4\\xab\\x38\\xa3\\x99\\x4b\\x83\\xab\\x30\\x60\\x0f\\xf5\\x11\\xcc\\xb5\\x95\\x99\\x2f\\x8c\\xc0\\xd2\\x95\\x48\\x07\\x97\\x2d\\xa3\\x65\\xb0\\x6f\\xbd\\xab\\x53\\x9b\\x2e\\x03\\x59\\x8b\\x34\\xe5\\x3c\\xfc\\xf9\\x39\\x90\\xb9\\x7a\\xac\\x1d\\x32\\x97\\x83\\x36\\x6d\\x45\\x1f\\x97\\x2b\\x8d\\x8a\\x00\\xb6\\xb8\\xec\\xdb\\x37\\x27\\x96\\x44\\xce\\xc1\\x44\\x7c\\x09\\x98\\xee\\x4f\\x70\\x90\\xf3\\x4c\\x9c\\xc8\\x53\\x05\\x90\\xca\\xe7\\x65\\x36\\x0a\\xad\\xb0\\xab\\x31\\x35\\x00\\x49\\x41\\xc9\\x23\\x02\\xcb\\xb2\\xb3\\x50\\xa1\\x4e\\x8f\\x30\\xaf\\x53\\x25\\xc2\\xb4\\x38\\x00\\x5e\\x3a\\x9d\\x45\\x85\\xe6\\x32\\x65\\xc3\\x27\\xba\\x72\\x57\\x54\\xb3\\x32\\x56\\x91\\x7f\\xb9\\x65\\xae\\x9f\\x02\\xed\\x21\\x26\\xb4\\x81\\x47\\x3d\\xc0\\xe9\\x31\\xc2\\x52\\x2b\\xf0\\x0f\\xe6\\xa2\\xec\\x95\\xc7\\x92\\x24\\x7b\\x1e\\x03\\x39\\x61\\x12\\xf7\\x83\\x07\\x0e\\x2f\\xe6\\xc2\\xcb\\x98\\x22\\x50\\xd1\\x3f\\x2d\\x54\\x60\\xc7\\x44\\xfd\\xe4\\x53\\x23\\xe6\\x31\\xcc\\xcb\\x54\\x0c\\xd7\\x25\\xf2\\xc5\\x5a\\x70\\x58\\xf2\\x30\\xe8\\x2b\\x79\\xf3\\x66\\xaf\\xcb\\xb0\\x25\\xb4\\x92\\x55\\x43\\x95\"},\n{{0xf9,0x13,0x9e,0x57,0x9f,0xa9,0x6e,0xbd,0x62,0x87,0xdb,0x3b,0xab,0xcd,0xa6,0x0f,0x92,0xe7,0x31,0x53,0x56,0x6f,0x92,0x4c,0xb5,0xde,0x04,0xde,0x44,0x93,0x48,0x1e,},{0xc0,0x6c,0xe3,0x35,0x53,0x3a,0xf8,0xd8,0xf3,0x37,0xf2,0xb3,0x8e,0x0a,0xaf,0xa2,0xce,0x9b,0x27,0x22,0x3c,0xd9,0xdd,0xc5,0xef,0x32,0x02,0x7f,0x04,0x88,0x9b,0x7f,},{0x05,0x1d,0x8d,0x7f,0x0b,0x68,0xd2,0xee,0xc7,0x2c,0x81,0xad,0xfc,0xfb,0x31,0xae,0x85,0x58,0xf6,0x0a,0xb6,0x3c,0x9f,0x56,0x52,0xa8,0xdf,0x63,0x8f,0x66,0x6f,0x1e,0xbc,0x0c,0x6e,0x0b,0x41,0x19,0x53,0xbc,0xda,0x6b,0x51,0x51,0xb2,0xb9,0x3a,0x39,0xe3,0xc5,0x33,0x0a,0x85,0x73,0xe1,0x68,0x79,0x22,0x72,0xab,0xd3,0x6c,0x81,0x0a,},\"\\xb3\\x30\\x76\\x4d\\xdc\\x62\\x8e\\x4a\\xd6\\x7a\\xa4\\x98\\x2a\\xe8\\x6d\\x45\\x81\\x07\\x1c\\x19\\x3e\\xc3\\xc5\\x8f\\x81\\x3d\\x79\\x21\\xb8\\x4d\\x2a\\x54\\x56\\x2b\\xd8\\x74\\x17\\xae\\x1d\\xe5\\x90\\xa1\\xa4\\x8c\\x4e\\xc7\\xd5\\x56\\xad\\x93\\x1d\\x65\\xc0\\x54\\x3f\\xdf\\x06\\x07\\xc7\\x49\\x85\\x9e\\xe1\\x2f\\x99\\x52\\x02\\x0c\\x19\\x5c\\xf8\\x74\\x60\\x95\\xe1\\x08\\x7c\\xc6\\xc3\\xc8\\xef\\x9d\\x24\\x05\\x25\\x60\\xce\\x81\\x3d\\x61\\x39\\xb7\\xa7\\x5c\\x8f\\x4b\\x8e\\xa3\\x0a\\x9c\\x4a\\xb8\\x88\\xd0\\xa6\\x34\\x1c\\x99\\xab\\xd3\\x5e\\x09\\x03\\xbf\\xe5\\x6c\\x93\\x15\\x23\\x40\\xc4\\x12\\x76\\xd7\\xf2\\x4e\\x09\\x12\\xb1\\x2a\\x4d\\xb3\\xd7\\xee\\x44\\x84\\xdf\\xa5\\x3a\\xfc\\x0b\\x1a\\xea\\x14\\x09\\xd1\\xe0\\x32\\x8a\\xa1\\xc8\\x60\\x41\\x27\\xca\\x2e\\xb1\\xa5\\xe8\\x1b\\xf3\\x1f\\x8c\\x7a\\x51\\xc6\\x05\\x2c\\x53\\x4e\\xfe\\x6b\\x3d\\x0e\\xe7\\x4f\\xf5\\xa9\\xb1\\x1c\\x61\\x57\\xe3\\x64\\x77\\xef\\xa9\\x38\\x2f\\x57\\x51\\xbe\\x8c\\x8c\\x64\\x54\\xc4\\x46\\xd6\\xf8\\xdc\\x7e\\x92\\x95\\x25\\xcc\\x3d\\xe7\\x8c\\xb1\\xba\\x4a\\xba\\x9b\\xd4\\xbe\\x15\\x26\\x10\\x43\\x75\\x82\\xc9\\x65\\xee\\xa4\\x8c\\xbd\\x4c\\xaa\\x6f\\x30\\x8f\\x85\\xf4\\xf8\\xd0\\x06\\xa0\\x42\\xf6\\x19\\x20\\x07\\x62\\xe1\\xbb\\x9b\\xa4\\x22\\xe6\\x54\\x75\\xb3\\x3a\\x94\\x94\\x29\\x8c\\xfb\\xb7\\x5a\\x15\\x2b\\x36\\xd2\\xa0\\x55\\x01\\x80\\x77\\x05\\xb9\\x52\\x76\\x53\\x50\\xcd\\x14\\x14\\x1d\\x35\\xd4\\x98\\x66\\x92\\xd6\\xc3\\xbc\\xfc\\x6d\\x61\\xdf\\x00\\x52\\xa6\\x20\\xaa\\xb8\\xcc\\x13\\x20\\x5e\\x75\\x4c\\x16\\xf9\\x3e\\xca\\x79\\x20\\xbb\\xea\\x51\\x57\\xef\\x11\\x2f\\x0b\\x64\\xc1\\x05\\x4f\\x90\\xa5\\xdd\\xc1\\x75\\xa8\\x9e\\x29\\x24\\x2f\\x57\\x64\\x6e\\x74\\xcc\\x88\\x5e\\x81\\xa1\\xcc\\x14\\x4c\\x3d\\x78\\x2d\\x11\\x52\\xa9\\xe4\\xcf\\xe7\\x6c\\xb3\\xff\\xab\\xe7\\xdb\\xe6\\x03\\xfb\\x38\\x69\\xec\\xa8\\x69\\x96\\x98\\x70\\x9c\\xc8\\x7f\\xc9\\x61\\xc1\\xe2\\x99\\xcf\\xca\\x22\\xe3\\x24\\x2e\\xae\\x78\\x8c\\xff\\x11\\xbf\\xca\\x61\\x02\\x67\\x45\\xf4\\x97\\x62\\x25\\xb2\\x6e\\xe2\\x00\\xc4\\xf1\\x91\\x0c\\x4b\\x83\\xdf\\x5c\\xe4\\x6e\\xf4\\x87\\xd7\\x48\\xd9\\xc4\\xc5\\x02\\x14\\x1b\\x78\\x74\\xca\\xf4\\x1e\\x5a\\x29\\x7b\\x24\\x8c\\x2b\\xac\\x69\\x90\\xa1\\x5b\\x07\\xb4\\xcf\\x81\\x0e\\x59\\x28\\x74\\x42\\xd9\\xa3\\x69\\x6c\\x02\\xe8\\xd7\\x32\\x4d\\x3c\\xf7\\x30\\xdd\\xa5\\x40\\x53\\x6b\\xeb\\x13\\xcf\\xde\\xae\\x61\\x80\\xdd\\x74\\x84\\x83\\x2d\\xfa\\x94\\xe9\\x4a\\xa6\\xcb\\xa1\\x17\\xaa\\xe1\\x72\\x70\\xf4\\x8f\\x93\\xb2\\xf9\\x8a\\xe9\\x58\\x17\\x18\\x16\\x3f\\x44\\x63\\x54\\x6c\\x0a\\xe0\\xf2\\x79\\xc3\\x6b\\x92\\xbe\\xe6\\x6f\\x1c\\xa2\\xd6\\xa4\\xf7\\x26\\xd2\\xdf\\xee\\x0b\\xc1\\x1c\\x1d\\x8a\\x1f\\xa6\\x2c\\x3c\\xc8\\xab\\xa2\\x66\\xb9\\x87\\x59\\x28\\x6c\\x10\\x68\\x48\\x3b\\x23\\x76\\xb4\\x03\\xc8\\x87\\xfb\\xb6\\x57\\xdc\\x0f\\x25\\x5d\\xea\\x90\\xdb\\xd2\\x33\\x08\\xf7\\xe0\\xe8\\x42\\xb4\\x98\\xa8\\xdf\\xc7\\xc9\\xcd\\x5a\\xef\\x0e\\x87\\xd5\\x6b\\xe4\\x0d\\x50\\xfc\\x1d\\xd4\\xc0\\xaa\\x7d\\xee\\x55\\xae\\xbe\\x4d\\x6b\\x6a\\x52\\x05\\x39\\x62\\xb8\\x7b\\x0f\\x2e\\xe0\\x9a\\x90\\x81\\x61\\x55\\x33\\x3d\\x5c\\x57\\xa1\\x47\\x24\\xe0\\x01\\xbc\\x3d\\xed\\x17\\x84\\x3b\\x76\\xe2\\xc4\\x7a\\x17\\x63\\x39\\xc8\\xde\\xfc\\x54\\xb5\\x5b\\x23\\x58\\xae\\x7d\\x01\\xb0\\xf6\\xe0\\x8f\\x31\\x21\\x6a\\xe9\\x03\\x40\\x69\\x41\\x68\\xa5\\xa7\\x9e\\xe8\\x83\\xea\\x78\\x58\\x00\\x7d\\x17\\xc3\\x73\\x59\\xc9\\x9d\\x65\\x97\\xef\\xe4\\x60\\xc1\\xa2\\xf7\\x73\\x8a\\xc3\\x2c\\x5e\\xb5\\xe3\\x9e\\x50\\x0c\\x49\\xc0\\xdf\\xf9\\xc4\\x65\\x9e\\x8c\\x50\\xcc\\x5c\\xa7\\x9d\\x8b\\xa4\\xe5\\x97\\x2d\\x67\\x22\\x54\\x68\\xfb\\xa6\\x41\\x67\\xa6\\xb2\\xc6\\xf3\\x68\\x93\\x5c\\x7a\\x04\\x9d\\x35\\xd3\\x55\\xc7\\x67\\x25\\x20\\xd3\\xc9\\xe4\\xe4\\x3c\\x67\\x1c\\x3c\\xb8\\xde\\xe2\\x59\\x04\\x74\\x95\\xde\\x0f\\x56\\xdd\\x71\\x91\\xd5\\xbd\\x4b\\xbd\\x29\\x51\\x7e\\x36\\x47\\x92\\xff\\x89\\xd3\\x37\\x99\\xb6\\xe7\\x81\\xc2\\x01\\x93\\xf5\\xa3\\x16\\xfb\\x40\\xde\\x74\\xfe\\xe2\\xac\\xc2\\x5e\\x47\\xf5\\x12\\x21\\x4d\\xe3\\xb1\\xe9\\xb3\\x82\\xa8\\x69\\x29\\xc1\\x57\\x3d\\x37\\x24\\xc2\\x50\\x17\\xc0\\xe5\"},\n{{0xc8,0xee,0x95,0x4d,0xb5,0xa1,0x1b,0x29,0x2e,0xd9,0x77,0x64,0xfa,0xe6,0xb2,0x83,0x05,0x1d,0xb5,0x7d,0xcd,0xc0,0xaa,0x0d,0xf5,0x39,0x3b,0xb6,0x0c,0x11,0x2e,0xd3,},{0x5c,0x2f,0x81,0x82,0x4e,0x99,0x75,0xdd,0x7e,0xa3,0x53,0xbc,0x66,0x80,0x7d,0xed,0xc7,0x61,0x03,0x49,0x79,0x4e,0x2f,0xc0,0x8e,0x5a,0x31,0xe0,0x02,0xe3,0xfe,0x07,},{0xf3,0x07,0x7a,0x75,0x10,0x1e,0x12,0x1e,0x5c,0x3e,0x77,0xd8,0xed,0x97,0xb5,0x78,0xd2,0x39,0xbd,0x42,0x18,0x03,0xd3,0x45,0x5b,0x56,0x54,0x40,0x5a,0x4c,0x58,0x6a,0x60,0x92,0xe1,0x3a,0x85,0x29,0xba,0xce,0x46,0x8a,0x30,0x57,0x84,0xb3,0x73,0xe4,0x33,0xfe,0xe4,0xa3,0xdf,0x89,0x56,0xbe,0xfa,0x01,0x2f,0xd8,0xa8,0xee,0xd1,0x0c,},\"\\x7b\\xa3\\xfb\\x56\\x83\\x15\\xaa\\x81\\xe2\\x1f\\x19\\x77\\x80\\xed\\xc2\\xc6\\xea\\x26\\xd8\\xd0\\x6a\\x43\\x78\\x91\\x2f\\xca\\x23\\x01\\xcf\\x1e\\xab\\x3d\\x80\\x3c\\x84\\x69\\xde\\xdd\\xf3\\x76\\x70\\x3d\\xdb\\x7c\\xe0\\x6a\\x77\\xda\\xb2\\x0e\\x02\\x34\\x4f\\xad\\xcc\\x50\\x02\\x2a\\xb3\\xc7\\x13\\xcd\\x03\\xc1\\xda\\xa9\\x3f\\x1c\\x7e\\xa5\\x72\\x62\\x9f\\x61\\x0b\\x5e\\x3c\\x51\\x41\\x1b\\xb8\\xc1\\x96\\x94\\xbb\\xce\\x90\\x3c\\xac\\x47\\x05\\xf9\\xb5\\xdd\\x0f\\x47\\xbc\\x5d\\x0a\\xa3\\x25\\x3f\\x90\\x88\\x70\\x29\\x90\\x27\\xff\\xbd\\x34\\x49\\xee\\xba\\xd4\\x53\\x32\\xb5\\xd0\\xc4\\xf5\\x33\\xdb\\xed\\x18\\xa9\\x9a\\x24\\x98\\xb9\\x16\\x4e\\x24\\x5f\\xb6\\x5c\\x0a\\xfa\\x0b\\x05\\x37\\x03\\xa0\\xcf\\x95\\x94\\x0a\\xc7\\xa0\\x19\\x5d\\x4f\\x70\\x46\\x60\\x9c\\xf0\\x43\\x71\\x33\\x87\\x06\\xb9\\xb1\\x98\\x6c\\x0f\\x11\\x81\\x75\\xd2\\xcd\\xfc\\xe7\\x4a\\x6f\\x88\\x65\\x98\\x25\\x85\\x4e\\x94\\xec\\xe5\\x8f\\x51\\x57\\x63\\x6d\\x62\\x35\\xb7\\x6d\\x32\\x74\\x5a\\x2a\\x81\\xa9\\x67\\x1a\\x8f\\x86\\x02\\x7b\\xa9\\xe0\\x17\\x63\\x88\\x8f\\xc1\\x71\\xce\\xf7\\xc4\\x51\\xc3\\x60\\x72\\xbc\\x74\\x99\\x83\\x9d\\x43\\x1c\\xf1\\x8c\\xd7\\xc6\\xc9\\xfb\\xa3\\xaa\\x71\\x2a\\x05\\x43\\x28\\xcc\\xd6\\x2b\\xe4\\x82\\x0a\\xbd\\x5e\\x78\\x21\\x62\\x76\\x46\\x11\\xd4\\x53\\x9b\\xa2\\xce\\xbd\\xc2\\x09\\xb3\\xf4\\xe4\\xb6\\x9c\\x3d\\x64\\x07\\x3e\\x92\\x0d\\x21\\x52\\x14\\xfb\\x0f\\xda\\x44\\x18\\x5a\\xad\\xa5\\xc3\\x61\\x27\\xa1\\x5b\\xa1\\x5c\\xa2\\x8a\\x3a\\xd0\\x86\\xe9\\xd0\\x33\\x66\\x86\\x9c\\x60\\xc3\\xfb\\xce\\xbd\\x86\\x9d\\x2e\\x40\\x64\\x3e\\x83\\x3f\\x89\\x48\\x03\\xf9\\x80\\xa2\\xda\\x7e\\xa4\\xe5\\x9c\\xe4\\xd7\\xc0\\x6f\\xd2\\xaf\\xf0\\x87\\xee\\x7b\\xcf\\xdd\\xaa\\x3b\\x32\\x81\\x7c\\xe6\\x3a\\x63\\x58\\x7d\\xba\\xfe\\xf3\\x80\\x01\\x3a\\x6f\\x1e\\xe3\\x73\\x4b\\x94\\xca\\x3d\\xf9\\x64\\x4d\\xd0\\x43\\x43\\x02\\xec\\xb3\\x24\\xaf\\xe3\\x5f\\x46\\x5c\\x9c\\x1c\\x93\\x1b\\x27\\x29\\x4f\\xc6\\xee\\x02\\x72\\xde\\x22\\x42\\xae\\x90\\xd7\\xf2\\xe0\\x67\\x02\\x7e\\xf8\\x64\\x2e\\x8f\\x17\\x1e\\xd8\\x80\\xff\\xab\\xce\\x8a\\x20\\xa1\\xb3\\xe3\\x39\\xad\\x4e\\x3f\\x1a\\x90\\x01\\xf2\\x0f\\x90\\x02\\x61\\x88\\xfd\\xe3\\x4b\\x21\\x7a\\x6e\\x26\\xaa\\xff\\x18\\x42\\x2b\\x7f\\x84\\x3d\\x0f\\xdd\\xa3\\x21\\xc3\\x19\\xc7\\x78\\xf2\\x31\\x37\\xf2\\x0c\\xcc\\x1b\\xda\\x18\\x90\\xe5\\xbc\\x91\\x6a\\x54\\x56\\xd0\\x68\\xd3\\x7b\\x5a\\xcc\\x63\\x47\\x72\\x0c\\x56\\xa5\\xa4\\x91\\xbc\\x34\\x8d\\x6c\\x84\\x8a\\x9c\\x8f\\xec\\xfe\\x58\\xc9\\x2b\\x1f\\x30\\x2f\\xe1\\x49\\x19\\x71\\x8c\\xd5\\xe7\\x8b\\x7f\\xd6\\x01\\xd0\\x9d\\xc0\\x1e\\x69\\x04\\x86\\x1e\\x8d\\x68\\xb3\\xc5\\x75\\x35\\xb6\\x13\\x66\\x76\\xcb\\xc6\\xe8\\x39\\xaf\\x0d\\xd7\\x39\\xdb\\x89\\xa7\\xab\\xd9\\x13\\xfd\\xf6\\xb0\\x0e\\x9c\\xa0\\x26\\x02\\xde\\x6c\\xa0\\xaf\\xd0\\x91\\x3d\\x99\\x2f\\xba\\xa8\\xff\\x82\\x2b\\x9d\\x9b\\x09\\xdd\\xa7\\xa2\\x9b\\xe9\\x19\\x10\\xd8\\xfa\\x3c\\xaa\\x2a\\x5e\\x51\\x83\\x46\\xc1\\x67\\xc9\\xf5\\x19\\x41\\xcf\\x73\\x53\\xf3\\xf3\\x4c\\x1d\\xab\\x33\\x48\\x5d\\x0a\\x8c\\x19\\xda\\xf9\\x51\\xfd\\x3e\\xf2\\x0d\\x0b\\x11\\x9d\\x80\\x38\\xdf\\x90\\xc1\\x14\\xa2\\x5a\\x5b\\x93\\xae\\x40\\xec\\x44\\xb9\\xa5\\xd2\\xbc\\x1c\\x65\\x17\\xc6\\x82\\x50\\x0d\\x4c\\xdc\\x19\\x71\\x42\\xbe\\xc3\\xaf\\x82\\x32\\xc0\\x71\\x42\\x8d\\xc5\\x4c\\x0d\\x30\\x45\\x42\\x72\\xe7\\x33\\x6b\\x0b\\x58\\x88\\xa6\\xe8\\xfe\\xcd\\xe8\\x59\\xe2\\xac\\xcb\\x7f\\xb0\\x94\\xac\\xc5\\x4f\\xfa\\x48\\x1f\\x76\\x23\\xd9\\x44\\x69\\x1f\\x04\\xfb\\x36\\x13\\xa9\\x95\\x49\\x80\\xf1\\x7e\\x2a\\xd2\\x17\\x3d\\x68\\xcf\\x0e\\xc1\\xb6\\x7d\\x8a\\x91\\xd6\\xec\\x82\\x94\\x6b\\xcf\\x05\\xcb\\x90\\x68\\x1a\\x71\\x62\\x7b\\x59\\x02\\x38\\x33\\x4e\\x3d\\x5a\\xb9\\xda\\x6a\\x08\\x9b\\xd7\\x26\\x24\\xdf\\x90\\x74\\xcd\\xd2\\x30\\x9e\\x04\\xdf\\xca\\xe0\\x32\\x81\\x2f\\xe8\\x4f\\x9d\\xb8\\x82\\xcd\\xea\\xae\\x69\\xee\\x5d\\xaa\\x5a\\x66\\xff\\x42\\x7f\\xc4\\x52\\xed\\xd0\\x76\\x9b\\x6a\\xab\\xcc\\x13\\x9d\\x0f\\x70\\xaf\\x8b\\x97\\x43\\x0e\\x64\\x4f\\x58\\xa4\\x12\\x87\\xa9\\x3f\\x63\\x1d\\xed\\xa8\\x2c\\xa0\\x71\\x6d\\x79\\x75\\x4c\\x5c\\x50\\x3e\\x52\\xa6\\x65\\xda\"},\n{{0x6d,0xbc,0x55,0x9e,0x4a,0xb1,0x93,0xee,0xbf,0x70,0xc5,0xc3,0x2d,0x79,0x7b,0xe0,0x0b,0x73,0x11,0xe8,0xe6,0x69,0x1d,0xa9,0xaf,0xcc,0x18,0x72,0x91,0xf2,0x50,0x1c,},{0x38,0xa7,0x03,0x44,0x76,0xfb,0x93,0x82,0xf1,0x41,0x77,0x68,0xc4,0x21,0x62,0x95,0x1a,0x26,0x36,0x90,0x2c,0x38,0x98,0xc0,0x29,0xbe,0x27,0x8a,0xb4,0xc3,0x1f,0x31,},{0x31,0xf1,0x6a,0x7c,0xaf,0x2b,0x74,0xf6,0x5e,0x05,0x7c,0x93,0x33,0xa1,0xa2,0x63,0x3d,0xac,0x73,0x46,0x33,0x8f,0x79,0x85,0x10,0x73,0x0e,0xb8,0xd5,0xd3,0x25,0xfc,0x10,0x80,0xdd,0x5a,0xad,0x5f,0xce,0x05,0x34,0xe9,0x54,0x3f,0x3c,0x93,0x58,0x68,0x04,0x46,0x4a,0xf5,0x88,0x6e,0x86,0x44,0x12,0x9c,0x77,0xeb,0xaa,0x48,0x5f,0x01,},\"\\x88\\xee\\x23\\x65\\xf7\\xcf\\x9d\\xe3\\x3a\\xcd\\x53\\x56\\x49\\x68\\xb2\\xdc\\x7f\\x73\\x70\\xb7\\xe7\\x03\\x3f\\x4c\\x66\\x3a\\x88\\xc2\\x5f\\x60\\xf7\\xf7\\x11\\xd6\\x19\\x08\\xeb\\xf1\\xf5\\xbb\\x72\\x83\\x55\\x53\\xc8\\xaa\\x8c\\x8e\\x4f\\xcd\\xec\\xd3\\x79\\x78\\x23\\x82\\x89\\xbf\\x6c\\xa8\\x48\\x76\\xd2\\x28\\x21\\x7a\\x28\\xd8\\x1b\\x0b\\x45\\x7c\\x92\\x2e\\x91\\xec\\xba\\x8d\\x3e\\x1d\\x2e\\x66\\x59\\xc2\\xb0\\xae\\xa0\\x51\\xb9\\xc2\\xe0\\x9c\\x7d\\xfe\\xb5\\x1d\\x30\\xed\\xe7\\x67\\x57\\x03\\x41\\xff\\xac\\x1e\\xcf\\x0d\\xe2\\x0c\\x82\\xd1\\xe9\\xed\\x07\\x75\\xde\\xac\\x72\\xda\\x7c\\x2d\\xec\\x23\\x48\\x65\\xde\\xc8\\x3f\\x67\\x15\\xe1\\xc3\\xc5\\x9d\\xe2\\x03\\x3c\\xc2\\x4d\\x86\\xbc\\x2d\\x31\\xaa\\x16\\x64\\x96\\x86\\xed\\xe0\\xdb\\xbd\\x89\\x64\\xc3\\xa6\\x4a\\x3d\\xca\\x55\\x88\\xd7\\x24\\x8b\\x1f\\x24\\xdf\\x8d\\x75\\xf0\\x9a\\xac\\x62\\xc0\\x78\\x28\\xca\\x43\\x1a\\x3a\\x2d\\x77\\xa6\\x0c\\xc9\\x3c\\xfa\\x34\\x95\\xca\\xbe\\xb1\\x90\\x4e\\xd5\\xb5\\x63\\x98\\x4e\\x8c\\x20\\x77\\x7b\\xac\\x87\\x74\\x10\\x8a\\x64\\xed\\xa5\\x8f\\xb3\\x20\\x24\\x4a\\x3a\\xdd\\x3e\\x3e\\x7a\\x76\\xcd\\x13\\x7c\\xfa\\x4a\\x09\\xb6\\xe6\\xe9\\x30\\x11\\xea\\x0a\\xe6\\x51\\x71\\xaf\\x13\\x07\\x11\\x76\\x6c\\xd2\\x5b\\x3c\\x74\\xec\\x54\\xc0\\xbd\\xfa\\x02\\xb3\\x12\\x0a\\xc2\\x90\\x87\\xeb\\xac\\x98\\x37\\xfc\\xa6\\x5b\\xa9\\x71\\xbc\\x42\\x81\\xdd\\x55\\x7c\\x50\\x0e\\x22\\x5e\\xa6\\x6c\\x3c\\x3f\\xd5\\x22\\x06\\xc1\\x9a\\x9f\\x93\\x95\\x46\\x31\\x69\\xf8\\xc7\\xa8\\x46\\xbd\\x9f\\x83\\x4d\\x7f\\x33\\x7d\\x0b\\x61\\xfb\\x30\\xbc\\xe2\\x94\\xf4\\x78\\xae\\x1f\\x1d\\x97\\x7e\\x45\\x4e\\x43\\x3e\\xe8\\x72\\x9f\\xb0\\x65\\xcc\\xe0\\x3f\\xb2\\xe4\\x35\\xdc\\xbc\\xbf\\xba\\x01\\x53\\x7e\\x7a\\x67\\x62\\xe5\\x5e\\x7e\\xd2\\x25\\x28\\x30\\x37\\x04\\xbe\\xb5\\xae\\x38\\x1f\\x2e\\x18\\x10\\x56\\xf2\\x51\\x33\\x27\\x3c\\xf1\\x7d\\xdf\\x2b\\x06\\xe2\\xd9\\x47\\x7f\\x2c\\x09\\x75\\x5f\\xc8\\xd9\\xc7\\x3c\\xb3\\x31\\x00\\x46\\x8c\\x64\\x13\\x1c\\x68\\x6c\\xac\\x79\\xfd\\x38\\x45\\x01\\xe5\\x0f\\x8b\\x0b\\xee\\x28\\xba\\x39\\x58\\x3f\\x42\\xe4\\xfd\\x37\\x99\\xe2\\x4f\\x60\\xda\\x5f\\xd3\\xc7\\x79\\xaa\\xbf\\x69\\x9f\\xfd\\x23\\x21\\xed\\x04\\x5a\\x85\\xbc\\x64\\x24\\xf6\\x0f\\xdc\\xc4\\x9c\\x1c\\xb3\\x1f\\x24\\x9a\\x42\\x36\\xc0\\x94\\x91\\x76\\x81\\x81\\xb9\\x21\\xf5\\x86\\x02\\xfd\\x41\\x5c\\x1e\\xde\\xb2\\x6f\\x39\\x32\\x4a\\xdd\\xff\\x14\\x77\\x13\\x24\\x73\\x7c\\x67\\x20\\xcc\\x92\\x39\\x1b\\x94\\x9d\\xcb\\x42\\x12\\xbd\\x69\\x31\\xd4\\xde\\x51\\x40\\x1e\\x7f\\x95\\x3b\\x7b\\x03\\x6b\\x22\\x3f\\x0a\\xf7\\xa8\\xe4\\x08\\xb0\\x4e\\xa6\\x35\\xa2\\x3f\\xa0\\x70\\x9b\\xa0\\x42\\xa5\\xd9\\x92\\x95\\x4c\\x09\\xd8\\x58\\x1d\\xcc\\xcf\\x52\\x56\\x8a\\xd2\\x7a\\x1c\\xc7\\x1d\\x18\\xaa\\x27\\x40\\xf6\\x21\\x21\\x2e\\x7f\\x4c\\x5e\\x5e\\x5e\\x5e\\x45\\x32\\xd9\\xa6\\x7e\\xc2\\x77\\x3a\\xc2\\x1c\\x8a\\x4b\\x00\\x2d\\x65\\x24\\xf6\\x18\\x2d\\xd3\\x71\\x73\\x5d\\x2c\\x2a\\xbe\\x6c\\x95\\xc2\\x81\\xc6\\xfb\\x1e\\x97\\x6b\\xc1\\x7e\\x38\\x3f\\xd5\\x2a\\xea\\xaa\\x9f\\xbd\\x4a\\xbb\\x82\\xa2\\xcc\\x65\\x39\\x5f\\x8c\\x2c\\xc7\\xd8\\x18\\x2a\\x0d\\x25\\x0c\\x68\\x5c\\xfc\\xba\\x93\\xa9\\x51\\xee\\x7c\\x50\\x3c\\x6e\\x3e\\xec\\x23\\x6c\\xe3\\x3e\\x08\\x6c\\x61\\x07\\x28\\x73\\x7c\\x1c\\x3b\\x3a\\x24\\x25\\x2d\\xa7\\xf2\\x16\\x72\\xd9\\x28\\xeb\\xda\\x99\\x3a\\x94\\xc4\\x58\\xab\\x99\\x0f\\x5d\\x19\\xd8\\x00\\x23\\xc3\\x6a\\xa1\\x6e\\xaf\\xca\\xb1\\x43\\xf3\\x52\\xe9\\x7d\\x64\\x09\\xf3\\x24\\x99\\x41\\x11\\x9b\\xfd\\x9f\\x5f\\x90\\x84\\x72\\x4d\\x9e\\xba\\xd3\\x83\\xb1\\x0f\\x34\\xd3\\x3a\\xc8\\x30\\xcc\\xe9\\xe5\\xcb\\x8a\\xec\\xee\\x6f\\x40\\x30\\x1c\\xbb\\xe3\\x09\\xfd\\x06\\x15\\x34\\xa7\\xd0\\xc3\\xed\\xaa\\xea\\x02\\xa1\\x71\\xd8\\xb2\\x34\\x9d\\xbe\\xec\\x62\\x85\\x20\\xac\\x33\\x4a\\x5b\\xfe\\x28\\xa9\\xd5\\xf4\\xc0\\xd7\\x40\\xf7\\xc7\\x2d\\x4d\\x72\\xd8\\x9a\\x97\\x32\\x6a\\x03\\x00\\x2d\\x1e\\xf3\\x85\\x22\\xbc\\xd3\\x7b\\x42\\x84\\x7a\\x31\\x4b\\xd8\\x43\\xec\\x88\\xd1\\xf2\\xf9\\xd3\\x9f\\x57\\xf2\\xf1\\xa1\\x3d\\x01\\x40\\xa8\\x84\\x74\\x50\\x44\\x8c\\x88\\x0b\\x3a\\xe7\\x65\\x31\\xe9\\x5c\\x43\\x92\\x97\\x32\\x50\"},\n{{0xc9,0xd4,0x16,0x83,0x0a,0xe2,0x02,0x8f,0x21,0x75,0xd2,0x2b,0x61,0x4c,0x79,0x19,0x8c,0x67,0x0c,0xfa,0xa0,0xe7,0xa3,0x61,0x50,0xef,0x0f,0xee,0x21,0xa9,0x5c,0xe6,},{0x6e,0x3e,0xb4,0xd0,0x18,0x73,0x07,0x2d,0xf9,0x46,0xf1,0x79,0x2f,0x71,0x06,0x33,0x08,0x95,0xe7,0xa7,0x6d,0xd9,0xae,0x27,0xf8,0xa9,0x88,0x03,0x94,0x90,0xfd,0x4b,},{0x47,0xfa,0xad,0x4e,0x65,0x52,0x93,0xed,0xa1,0x56,0xb2,0xa1,0xfa,0xbb,0xfb,0x7e,0x00,0x9f,0xc2,0x90,0xaa,0xfe,0xdb,0xd5,0x65,0x21,0x14,0xa4,0x78,0x53,0xbc,0x77,0xa8,0x23,0x3a,0x2b,0x17,0x9f,0x60,0x54,0x77,0xd7,0x87,0x87,0x8c,0xbb,0x15,0xea,0x61,0x24,0xdf,0x8d,0xc5,0x7b,0x2c,0xe7,0xbe,0x7d,0x18,0xb7,0x16,0x2f,0xb5,0x0d,},\"\\xff\\x9a\\xd4\\x83\\x7c\\xd0\\xbb\\x77\\xd6\\x21\\x0f\\xdd\\xdc\\x75\\x5e\\x6c\\x0f\\x1a\\x73\\xc2\\xbc\\xd0\\x3f\\x7a\\x58\\x69\\xe7\\x34\\x2c\\xfd\\x73\\xcf\\x70\\x86\\xf8\\x65\\x56\\x15\\x60\\x27\\x7b\\xf6\\xc3\\x42\\x1a\\x91\\x2d\\x67\\x65\\x8b\\x1f\\xa9\\x70\\x57\\xc4\\x96\\xf4\\xbe\\x8e\\xdc\\xbe\\x18\\xb5\\xec\\xd0\\x8a\\x1e\\x7d\\xb2\\x52\\x23\\xab\\xda\\x20\\x8f\\xa5\\x31\\xf4\\xb2\\x80\\xaa\\x03\\xb0\\x4b\\x60\\x60\\x34\\x11\\xd3\\x74\\xba\\x7c\\xbb\\x02\\x0b\\xb9\\xa8\\xce\\x4c\\x0e\\x45\\xa7\\xe1\\x32\\x14\\x48\\x43\\xc3\\x1f\\x8b\\x45\\xc5\\x8e\\xb3\\xea\\x85\\x3c\\x2c\\xeb\\x61\\x37\\x6e\\x9d\\xf8\\x1d\\x97\\x78\\xe7\\x21\\xad\\xac\\x77\\xb5\\x03\\x54\\x93\\x7f\\x34\\x37\\x2f\\xcc\\xd5\\x75\\xe8\\x8d\\x9d\\x05\\x8e\\x43\\xdf\\x94\\x2f\\x2c\\x43\\xb5\\x23\\xc8\\x09\\x8e\\x6d\\xd9\\xe6\\xbd\\x21\\xd5\\xa6\\x49\\xb4\\x72\\xd4\\x1e\\x34\\x5f\\xcd\\x5e\\xfd\\xdd\\x49\\xea\\xb3\\x02\\x70\\xcd\\x87\\x88\\x40\\x4f\\x28\\x51\\x6e\\x09\\xd3\\xac\\xc4\\x00\\x48\\xb3\\x9d\\x32\\x46\\xf7\\x57\\xe4\\x82\\xe1\\x45\\x9c\\x62\\x6b\\x79\\x9e\\x04\\xd0\\x67\\x27\\x13\\x73\\x71\\xe1\\x20\\xaf\\xb9\\xfe\\xc3\\x9a\\x25\\xf4\\xe6\\x76\\x4b\\xf9\\x79\\x2f\\xe4\\x92\\xee\\x0f\\x21\\x0b\\x57\\xdb\\x9e\\xbb\\x9e\\x8e\\xf4\\x1b\\x02\\xc7\\xfe\\xe9\\xed\\xd4\\xb6\\x17\\x4c\\x57\\x0d\\xe0\\x20\\xa3\\x91\\x28\\x71\\x33\\xfe\\x8c\\xcb\\x41\\xa8\\x3f\\x91\\xbd\\x22\\x38\\x2b\\x21\\xe1\\xd7\\xeb\\xc2\\xc7\\xe5\\x01\\x8e\\xf5\\x14\\x2d\\x82\\x63\\x7d\\x02\\x62\\x0f\\xbc\\x05\\x69\\xcc\\x09\\xc4\\x4e\\x91\\x11\\x12\\xbb\\xae\\x99\\x06\\x4d\\x68\\xd1\\xc6\\x9e\\x77\\xc9\\x93\\x0b\\x0d\\xe0\\x30\\xc8\\xc1\\xd7\\x48\\xc4\\x14\\x05\\x9d\\x5e\\x29\\x9b\\x7e\\xdc\\x08\\x94\\x06\\x51\\x89\\x4b\\x30\\x3a\\x2b\\x32\\xdd\\x2c\\x36\\x5a\\x06\\x7c\\x97\\x23\\x58\\x55\\x94\\x64\\x4d\\x3e\\xe8\\xde\\x1a\\x51\\xfa\\xea\\x0e\\x65\\x0f\\x21\\x24\\x88\\x5a\\x94\\xcb\\x99\\xeb\\x90\\x3b\\x7d\\x45\\x79\\xbd\\xe5\\x91\\x49\\x7d\\x95\\x39\\x30\\xd3\\x63\\xdd\\xdb\\xda\\xc6\\x27\\xb9\\x7a\\x91\\xf4\\x96\\x82\\xdf\\x8e\\x72\\x50\\xa7\\x07\\x3d\\x38\\x3a\\x7a\\x22\\xcf\\x11\\x3f\\x28\\x58\\xce\\x6b\\x63\\x2a\\x28\\x92\\xc4\\xe8\\x8a\\xa9\\xa0\\xd2\\x89\\xeb\\x57\\x62\\x9b\\x00\\x8d\\x3b\\x1b\\x60\\x81\\xe6\\xfe\\x5d\\x3c\\x0a\\x6c\\x80\\x21\\x89\\xb5\\xf1\\x08\\xe7\\x66\\x31\\x9e\\x15\\xb3\\x3e\\xaa\\x5b\\x8c\\xed\\x40\\x27\\xea\\xec\\x83\\xb4\\xac\\x68\\xb1\\x4b\\x82\\x98\\xbc\\x51\\xcd\\x8e\\xb3\\x80\\x9b\\x7a\\x2d\\x68\\x4f\\xe3\\x2b\\xbd\\x9f\\xab\\x5c\\x91\\x8e\\xeb\\x17\\xcc\\x44\\x4d\\x73\\xf7\\x30\\xd4\\xc8\\xcc\\x05\\x7b\\xd3\\xa2\\xf1\\xf0\\xae\\xbb\\x61\\x63\\x29\\x34\\xe6\\x17\\x02\\x16\\x88\\x29\\xcd\\x7e\\x91\\xde\\x81\\x50\\x96\\x29\\xd0\\x1a\\x8c\\xde\\xfe\\x0d\\x1a\\xc4\\x9e\\x21\\xf0\\xc5\\xfb\\xe1\\xb2\\x24\\x48\\x27\\x26\\x8a\\x0a\\x27\\x35\\x7e\\x15\\x8b\\xd7\\x68\\x84\\xa2\\x1e\\x7f\\x1f\\xac\\x1b\\x62\\x72\\x16\\x6d\\x5a\\x9f\\x64\\xf9\\xb6\\x72\\x98\\x9a\\x87\\x62\\xf5\\x12\\xbf\\x1d\\xf4\\xb2\\xab\\x69\\x97\\x65\\xf2\\xcd\\x83\\x96\\xf4\\x76\\xe7\\xf5\\x99\\x95\\xde\\xe7\\xd8\\x90\\x20\\x7e\\xff\\x0f\\xd2\\x72\\x63\\xec\\x23\\x2e\\x37\\xcf\\xed\\xfe\\x7c\\x44\\x05\\x55\\xd4\\xca\\x74\\xe5\\x2d\\xa2\\x46\\xc4\\xb8\\x37\\x57\\xbe\\xaf\\xd2\\xab\\x2a\\x51\\xef\\xe1\\x60\\xbb\\x02\\xb9\\x8c\\x26\\xd6\\xb2\\xc3\\xf0\\xc1\\xaa\\xcb\\x2f\\x3c\\x34\\xa5\\xb2\\xa3\\xb6\\x6f\\xee\\x17\\x5b\\x78\\x75\\x48\\x07\\x3d\\x8b\\x57\\x77\\xc6\\xbe\\x88\\x0b\\xdc\\x19\\x6b\\x33\\x74\\xa2\\x15\\x4f\\x94\\xd9\\x36\\x0f\\x77\\x55\\xac\\x68\\x15\\xa2\\x8a\\xf2\\x96\\x27\\x1e\\x22\\xa8\\xf2\\x35\\x43\\xc7\\x49\\x55\\xa6\\x09\\x12\\x5b\\x02\\xa5\\x69\\x21\\x80\\x11\\x42\\x02\\x95\\xcc\\xf0\\xd7\\x35\\x69\\x99\\xa5\\xb8\\x95\\xcc\\x88\\x48\\x3f\\xad\\xf7\\x97\\x0c\\xec\\x6c\\x64\\x24\\x0f\\x70\\x79\\xfd\\xb1\\x5f\\xfc\\x5c\\x42\\x27\\xe5\\x39\\x26\\xd2\\x78\\xba\\x0f\\xed\\x3c\\x39\\x93\\xbc\\x86\\x82\\x28\\x23\\xdd\\x58\\x1a\\x32\\xab\\x2e\\x3a\\x07\\xf7\\x94\\x30\\x22\\x4b\\x27\\x4e\\xad\\xd8\\x45\\x59\\x8a\\x7d\\x1d\\x89\\x67\\x6a\\xaf\\x23\\x67\\x77\\x74\\xb7\\xb0\\x58\\x3b\\xcc\\x83\\x59\\x9d\\x15\\x5d\\x14\\xb0\\x9a\\xdc\\xf4\\x9e\\xd5\\x05\\xe8\"},\n{{0x2d,0x27,0x7d,0xd5,0x5f,0x57,0x19,0x5e,0xc0,0x72,0xb4,0x7c,0xb1,0x44,0x8c,0xb5,0x82,0xc8,0x35,0x73,0x9e,0x6c,0x98,0xba,0x71,0xab,0x12,0x8f,0x70,0xce,0x6b,0x79,},{0xdf,0xa9,0x25,0x93,0xef,0x0f,0x0d,0x97,0x4a,0x11,0x37,0x83,0x0a,0xd1,0x38,0x48,0xaf,0xef,0x3b,0x81,0x0c,0x2a,0x21,0xbf,0x77,0x91,0x78,0xce,0x4b,0x3a,0xb9,0x74,},{0x73,0xc1,0x06,0x06,0x49,0xa7,0xc0,0x14,0xed,0x01,0x94,0x58,0x51,0xb5,0x3e,0x28,0x53,0x24,0xe6,0x0d,0x06,0x1c,0x83,0x1d,0xda,0x41,0xf0,0x33,0xb5,0x65,0x83,0x06,0xa1,0xf1,0x12,0x32,0x7a,0xfe,0x93,0xca,0xa9,0x21,0x02,0x07,0x30,0xaa,0xe0,0x06,0x9c,0x9a,0x2b,0x45,0xee,0xf5,0x5c,0xbb,0x4a,0x5a,0x9c,0xd4,0x6c,0xda,0x80,0x08,},\"\\x14\\x54\\x9e\\xdd\\xd5\\xf2\\xb7\\x90\\x5d\\xda\\x19\\xd7\\x4a\\xb2\\x07\\xaa\\xc6\\xfb\\x3e\\x3d\\xf3\\x29\\x5d\\x84\\x52\\x31\\xef\\x3a\\xea\\x6e\\x1f\\x04\\xee\\x03\\x3c\\x90\\x38\\xdc\\xb4\\xbd\\x3d\\x5e\\x45\\x2c\\x54\\x83\\x4d\\x0f\\xf2\\xb7\\xde\\x3f\\x32\\x2e\\x56\\x26\\x94\\x9c\\xd6\\x1d\\x6e\\x89\\x01\\x38\\xff\\x0e\\xa8\\xad\\x84\\x6e\\x8f\\xe8\\x87\\xae\\xe1\\x5f\\xc4\\x8b\\xbe\\x4f\\xba\\x42\\x45\\x5f\\x5c\\x17\\x45\\x7a\\xe7\\x89\\xb4\\x05\\xaf\\x85\\x96\\x11\\xfe\\x1f\\x87\\x46\\x18\\x5a\\x65\\xae\\xf2\\x13\\x4e\\xa4\\xd8\\xf3\\x98\\xd4\\x8d\\xf7\\xc1\\xbb\\xa4\\x30\\x44\\x08\\xae\\x7e\\xfb\\x35\\x29\\x24\\x09\\xd5\\x08\\xdd\\x55\\xce\\x21\\xde\\x8c\\x28\\x16\\x0d\\xc9\\xe8\\x77\\x70\\x0c\\x76\\x3d\\x06\\xb0\\x1b\\x85\\x42\\x05\\x2d\\x7d\\xdb\\x63\\x35\\x54\\xe3\\x58\\x42\\x79\\xc7\\x96\\x93\\x70\\x23\\xc8\\xea\\xc3\\x72\\x77\\xbe\\x2b\\x82\\x04\\xff\\x3e\\x0e\\x10\\x31\\x19\\x0a\\x01\\x01\\x4c\\xf5\\xf5\\xb4\\xd7\\xad\\x99\\x67\\x27\\xf9\\x75\\x31\\xe0\\x35\\x5b\\x87\\xc9\\xe6\\x11\\x52\\x5a\\xad\\x07\\x99\\x58\\xe9\\xaf\\xe2\\xab\\x10\\xe4\\xa3\\xe7\\xa1\\xb6\\xba\\x0a\\xff\\x81\\x5d\\xa2\\xcd\\x81\\xea\\x9e\\xb9\\xf5\\x36\\x98\\x66\\x33\\xf3\\x16\\xdd\\x06\\xc2\\x50\\x3c\\x6b\\x19\\x8d\\xc5\\x93\\x04\\x80\\x7b\\x98\\xb4\\x29\\x35\\xf5\\x1f\\x63\\x7d\\xdb\\x59\\xe2\\x33\\xfe\\xd5\\x66\\x43\\x9c\\x1f\\xe9\\x6c\\xda\\xaf\\xa4\\x9f\\x44\\x12\\xd0\\xc1\\xe6\\x54\\xd8\\xc6\\x90\\x42\\x47\\x0b\\x3a\\x59\\xac\\xb6\\xbf\\x67\\xe4\\x0b\\x38\\xa7\\x70\\x67\\xd5\\x99\\x7b\\x8d\\x35\\xed\\x61\\xd6\\xeb\\x3c\\xc7\\x8b\\x8b\\xdc\\xb9\\x57\\x4b\\x1c\\xed\\x9f\\x6f\\x33\\x9e\\x9e\\x38\\xf9\\x41\\x46\\xef\\x63\\xf0\\x49\\xe6\\xb8\\x02\\xbf\\xed\\x2a\\x51\\xab\\x42\\xe7\\xd4\\x89\\xf3\\x16\\xff\\x4d\\x1c\\xd8\\x98\\xbc\\xf8\\x50\\x56\\x51\\x68\\x74\\x40\\x74\\x9c\\x0f\\xb7\\xa5\\x7d\\xbe\\xff\\x72\\xe6\\x46\\x89\\xfa\\xa4\\x1c\\x07\\xb4\\xad\\xe5\\x99\\x33\\xd2\\xfa\\xc6\\xd5\\x73\\xde\\xb7\\x39\\x54\\x9e\\xb7\\x5f\\x1e\\x6f\\x73\\x85\\xd8\\xc6\\x14\\x28\\x94\\x97\\x3e\\xd6\\x85\\xeb\\x8e\\xd0\\x80\\xc2\\xa4\\x9f\\x3a\\xc6\\x57\\x11\\x61\\xaf\\x96\\x63\\x5a\\xd0\\x57\\xdf\\x14\\x86\\xd3\\x96\\x77\\x3a\\xc8\\x98\\x32\\x10\\x97\\x89\\x86\\xe1\\xbf\\x21\\xa2\\x08\\x06\\xd6\\x67\\xa4\\x8a\\x55\\x5a\\x96\\x32\\x21\\xd5\\x06\\x14\\xa8\\x97\\x6b\\x2e\\xec\\x97\\x51\\x2d\\xb1\\x1a\\x35\\x81\\x94\\x49\\x2a\\xb5\\x45\\x58\\x01\\xba\\xa1\\x4a\\x51\\x1b\\x26\\xeb\\x0c\\x68\\x28\\x9d\\x79\\x05\\x23\\x71\\x2f\\x2f\\xf8\\x70\\x98\\x92\\x69\\x5c\\x4d\\xb9\\xad\\x31\\x0d\\xf8\\xc6\\xee\\x7b\\xd8\\x3c\\x87\\x1f\\x05\\xae\\xc3\\x3b\\x7a\\xd3\\x26\\xf4\\x46\\x69\\x2a\\x42\\xf7\\x22\\x23\\x76\\x24\\x6d\\x53\\x6a\\x32\\x6c\\x4d\\x73\\xeb\\x57\\x2f\\xea\\xda\\x11\\xb8\\xac\\x71\\x14\\xf6\\xcb\\x44\\x4c\\xa2\\x78\\xfc\\xf0\\x7b\\x97\\x0d\\x2a\\xd4\\x65\\x37\\x2a\\x68\\x7d\\x36\\xb7\\xda\\xac\\x47\\x87\\x48\\xec\\x6a\\x93\\x2d\\xa2\\x08\\x43\\x94\\x8e\\xfa\\x39\\x30\\x97\\x81\\x42\\x72\\xe5\\xca\\x1c\\x73\\xe7\\x11\\x97\\x3a\\x52\\x68\\x3f\\x98\\xc0\\x1e\\x55\\x24\\x1c\\x15\\x4d\\x28\\xe3\\x8d\\x3e\\xdf\\xad\\xe2\\x30\\x3a\\x4e\\x7c\\x45\\xc2\\xa7\\xa1\\xc9\\x96\\xee\\x11\\x37\\xaf\\x86\\x4a\\x98\\xb6\\x98\\x09\\xfc\\x92\\x14\\xee\\xa8\\xcf\\x3a\\xfe\\x84\\x2f\\xee\\x3e\\xb9\\xa9\\x32\\x2c\\x3b\\x82\\xfd\\xdb\\x05\\xd4\\xd1\\xa2\\xde\\x09\\xc1\\xce\\x72\\x73\\x44\\x53\\xa8\\xdd\\x3a\\x89\\x20\\xd0\\xd0\\xac\\x96\\xef\\x77\\x8b\\x9e\\x02\\xc6\\xa3\\xf1\\x28\\x72\\xe1\\x7d\\x3a\\x81\\xba\\x75\\xfd\\x23\\x3b\\xaa\\xdb\\xe2\\x16\\xea\\x0a\\x58\\xe9\\xdd\\xa0\\x08\\x40\\x87\\x02\\x08\\xae\\x41\\x35\\x40\\x03\\x0b\\x3c\\x05\\xe5\\xd0\\xb8\\x32\\xdf\\x87\\xc8\\xee\\x7f\\x15\\x34\\x87\\xaa\\x11\\xba\\xd9\\xf1\\x39\\xc7\\xdd\\x4b\\xcf\\x41\\x8f\\x4b\\xcb\\x95\\xbe\\xe8\\x57\\xd0\\xe9\\x60\\x84\\x47\\x23\\x87\\xcb\\x39\\x12\\x7a\\x94\\x71\\x34\\x50\\x19\\x63\\xa7\\x07\\x1b\\xdb\\x34\\xde\\x69\\x61\\xbe\\x2b\\x6b\\x06\\xe4\\x03\\xe7\\x59\\x18\\xe6\\xf6\\x9d\\x08\\x02\\x1c\\xf2\\xa8\\xac\\xb8\\x0a\\x01\\x11\\xf4\\xd5\\x06\\x10\\xc1\\x52\\xd3\\x9c\\x66\\x21\\xc0\\x57\\x8a\\xc6\\x89\\x95\\x9b\\x1c\\xe6\\xf3\\x76\\xf4\\x3d\\x18\\xaf\\x06\\x2e\\x4a\"},\n{{0x42,0x80,0x66,0xc5,0x24,0x45,0x72,0x6d,0x0e,0xa2,0x00,0x7e,0x50,0x46,0x37,0x27,0x4d,0x84,0xee,0x23,0x23,0x25,0xb5,0x05,0xf2,0xc5,0x16,0x35,0x7f,0x80,0x75,0x83,},{0xdd,0x40,0xfe,0x8f,0x67,0xc6,0x65,0x61,0x3b,0x3c,0x45,0x9f,0x6a,0xce,0x8d,0xc2,0x8d,0x34,0xe0,0xe7,0x7e,0x2f,0x6a,0xa0,0x60,0x59,0x28,0x19,0xbe,0x6a,0x9d,0x68,},{0xc9,0x38,0x82,0x9f,0x59,0x8b,0x1f,0xf1,0xb8,0x18,0x33,0x60,0xd2,0x23,0xf4,0x3c,0x59,0x47,0x30,0x60,0x68,0x76,0xa9,0x9a,0x3f,0x31,0xb2,0x06,0x5d,0x04,0xe6,0xf0,0x75,0xd1,0x39,0x6b,0x3c,0x8c,0xff,0xb0,0xe1,0xe2,0xea,0xab,0xda,0x7d,0xa5,0xe7,0x89,0xcc,0xd1,0xc0,0x20,0x83,0x5f,0xe3,0xa7,0x1d,0xcd,0xb6,0xaf,0x03,0x96,0x0c,},\"\\xe2\\x79\\x6c\\x50\\xd9\\x3d\\xf8\\x12\\xbc\\xa4\\x1b\\xf2\\xa1\\xe1\\xdd\\x73\\x7d\\x8c\\xf6\\xf6\\xb4\\xf7\\x62\\x42\\xe3\\x91\\x78\\x18\\x67\\x58\\xcb\\xae\\x08\\x84\\xe6\\x0c\\x6b\\x4a\\xaa\\xdd\\xae\\xc9\\xa8\\x99\\xa9\\x12\\xe5\\xc5\\xb9\\x80\\x4d\\x7b\\x04\\x97\\xba\\xb4\\x45\\x8c\\x58\\x5d\\x4f\\x25\\x92\\x22\\x49\\x8c\\xe9\\xe8\\x0e\\xb6\\xa7\\x97\\x9b\\xbe\\xd6\\xd5\\x2c\\xc3\\x80\\x72\\xf7\\x45\\xcb\\x2c\\x63\\xe6\\x63\\xbc\\x3b\\x9d\\x6c\\xaf\\x01\\x2a\\x60\\x7f\\x6d\\x3b\\x70\\x6e\\x15\\x57\\x57\\x87\\x17\\xec\\xbb\\x97\\x1a\\xeb\\x7c\\x48\\xe1\\xdf\\x95\\x71\\x1c\\x55\\x0e\\x00\\x69\\x93\\xbf\\xfb\\xa9\\x11\\xcb\\x64\\xad\\x52\\xd5\\x17\\xed\\x18\\xbe\\x82\\x36\\x9e\\x81\\x58\\x19\\xd3\\x17\\x59\\x47\\xd4\\xa3\\x5b\\x2c\\xc7\\xb9\\xdc\\x6c\\x10\\x05\\x13\\x26\\xb3\\xf1\\xdc\\x1e\\xdb\\x1b\\x68\\xba\\x01\\x5f\\xf7\\xca\\x1d\\xc3\\x61\\xd8\\x96\\x7a\\xbc\\xff\\xd3\\xc3\\x1f\\x7d\\x6b\\x0c\\xb1\\x39\\x6a\\xe5\\x41\\xf2\\x97\\x59\\xc4\\x13\\x0b\\xe5\\x2e\\xcc\\x11\\xd9\\x92\\x61\\xc3\\x65\\xbf\\x7c\\xde\\xc7\\x81\\x49\\x4c\\x5f\\xa0\\x52\\x6d\\xb4\\xdb\\xbe\\x66\\x0a\\x43\\x2b\\xe5\\x60\\x43\\xc6\\x6e\\xa0\\x7c\\x25\\x62\\x7a\\x5f\\x72\\xb7\\x81\\x23\\xdc\\xf9\\x86\\xff\\x71\\xed\\x1a\\xff\\xd1\\x65\\x9b\\x13\\x93\\xd9\\x62\\x1f\\x71\\x1d\\xfa\\x63\\xea\\xda\\x38\\x34\\x30\\x79\\x70\\x58\\xf1\\x56\\x6a\\x00\\x05\\x2d\\x67\\xba\\x53\\xc1\\x23\\x7b\\x56\\x91\\xde\\x3b\\x03\\x9f\\xd4\\x47\\x6f\\x11\\x51\\xe5\\xed\\x5f\\x5a\\x98\\x67\\x2f\\xa3\\x3a\\x1d\\x85\\x4f\\xa0\\x15\\x66\\xb3\\x32\\x31\\xd4\\x6a\\xcd\\x7f\\x34\\xb8\\x03\\x44\\x79\\x98\\x18\\x53\\x76\\x4d\\xab\\x87\\xf4\\x98\\x44\\xcb\\x62\\xc6\\x3d\\x53\\x6f\\xac\\xa9\\x20\\x44\\x7d\\x8c\\xd1\\xe8\\x11\\x3e\\xdb\\xc8\\x3e\\x4a\\x6b\\x78\\x15\\xe1\\x80\\xcd\\x78\\xb9\\x33\\xd9\\x68\\x7f\\xd5\\xbe\\x99\\xd0\\x51\\x8a\\x44\\x66\\x29\\x89\\xbc\\x64\\x01\\x11\\x24\\xf1\\x87\\xd4\\x39\\x79\\x99\\x4a\\x95\\xe0\\xc9\\x03\\xa0\\x06\\xc1\\xc0\\xbe\\xf1\\xc0\\xf3\\xdf\\x1e\\xb7\\x00\\xf9\\x80\\xc2\\x8c\\x3c\\x1e\\x99\\x7d\\x0c\\x56\\xd1\\x13\\xda\\xe1\\x96\\x88\\x2b\\x05\\x01\\x8f\\xca\\xb3\\x14\\xd8\\x11\\x7f\\xaf\\xba\\xbe\\x77\\x00\\xb9\\x32\\xd4\\x7c\\x57\\x36\\x2b\\x20\\x35\\xed\\xdc\\xe2\\xd2\\xef\\x33\\x64\\x1e\\xa9\\x0c\\x3e\\xa3\\xfe\\xc6\\xea\\x5b\\x87\\xe1\\x61\\x01\\x4c\\x4f\\x82\\x14\\xfd\\x03\\xce\\xbf\\x94\\xab\\xe1\\x22\\x53\\x7a\\x98\\x70\\x32\\x39\\xdf\\x58\\x21\\xc5\\xab\\x63\\x3f\\x98\\x36\\x5c\\xc6\\x36\\xe3\\xf1\\xd2\\xf7\\x4e\\x0f\\xf8\\xf1\\xfe\\xe0\\x6a\\x3f\\x73\\x90\\x7e\\xe5\\x04\\xb3\\x10\\xfd\\x52\\x24\\xad\\x4d\\x05\\xcd\\x23\\xc3\\x56\\xdf\\x8b\\x34\\x64\\x72\\x98\\xc4\\x98\\x28\\x72\\x5b\\xa5\\xfd\\x60\\x61\\x1e\\x82\\x9b\\x63\\x37\\xbc\\xc9\\xdc\\xf8\\xe8\\x97\\x1c\\xab\\x3e\\xe9\\xc2\\x63\\x37\\xd3\\x8d\\xfd\\xfa\\x03\\x6b\\xf6\\x09\\x6b\\x63\\x5a\\xc1\\xbd\\x55\\x25\\xec\\xd3\\x77\\xa1\\x52\\x72\\xa8\\xac\\x9b\\xbe\\xf1\\x33\\x10\\x7a\\x42\\x25\\x8d\\x8b\\x19\\xec\\x69\\xdc\\x42\\x61\\xbe\\x53\\x00\\xa2\\xd2\\xd5\\xca\\x99\\xf3\\x1e\\xfd\\xf2\\x59\\xf9\\xd0\\x79\\x86\\x9a\\x34\\x41\\x37\\x79\\xf3\\x02\\x88\\x24\\xd7\\x47\\x68\\x6c\\x46\\x0f\\xfc\\x49\\x6f\\x20\\x10\\xf4\\x03\\xe9\\x03\\xe2\\x7a\\x87\\xdd\\x07\\x5a\\xe0\\xa7\\xf1\\x68\\x94\\x16\\xd3\\x1b\\xcc\\x15\\xf4\\x90\\xca\\xf9\\x75\\xc4\\x0e\\x71\\x5d\\x54\\x99\\x03\\xe8\\xbc\\x0f\\x7d\\x91\\x41\\xe0\\x20\\xf4\\x10\\xf3\\xca\\x2b\\x2c\\x07\\x97\\xca\\x0d\\xc8\\xd7\\x39\\x2b\\xff\\x24\\x35\\x28\\xc7\\xf3\\xbe\\x13\\x89\\x97\\x18\\x5a\\x4b\\x36\\xf4\\x53\\x76\\xd9\\xfd\\x70\\xba\\x20\\x98\\x9d\\x2d\\x1a\\x91\\x1d\\x4b\\x98\\xd1\\x60\\xd2\\xb8\\xde\\x59\\x2d\\xe2\\xf4\\xc0\\x4f\\x35\\x86\\x0d\\xf3\\x20\\xc5\\x48\\x44\\x0d\\x5e\\x3a\\x34\\x6a\\x14\\xd3\\xa6\\x3f\\xe4\\x85\\xc2\\x88\\x91\\x26\\xb7\\xf4\\x1d\\x55\\xa6\\xeb\\x23\\xd5\\x62\\x0b\\xab\\xf8\\x56\\x4a\\xa7\\x9d\\x15\\x6e\\x98\\x3f\\x36\\xd9\\xed\\x49\\x8d\\xa9\\xca\\x88\\x8d\\x94\\x6b\\x53\\xcc\\x47\\x68\\xa5\\x89\\x2d\\x52\\xd5\\x41\\x52\\x69\\x60\\x28\\x25\\x24\\xba\\x61\\x94\\xda\\x65\\x94\\x1d\\x1e\\xa3\\x0f\\x80\\x6b\\xb6\\xd9\\x7c\\x74\\x88\\xb9\\x3f\\xd0\\xa7\\x70\\xa9\\xb1\\x5e\\xfc\\xd1\\x2c\\x5c\\x46\\x94\"},\n{{0x31,0x45,0xbc,0x68,0xd8,0x29,0x79,0x40,0x8e,0x46,0x57,0xb7,0x75,0xf1,0x50,0xc6,0xd2,0x8a,0x32,0x4d,0x74,0x6e,0xa6,0xde,0x90,0xfd,0x72,0xb1,0x7a,0x25,0x79,0x82,},{0xc7,0x76,0x18,0x6c,0xe4,0x7f,0x30,0xad,0x08,0xfa,0x1d,0x2c,0x61,0x6a,0x36,0x44,0x66,0x5b,0xa5,0x4f,0xf7,0x30,0xfc,0x2f,0x4d,0xb1,0xdb,0xa3,0x8d,0xde,0xed,0xca,},{0x24,0xa4,0x33,0x33,0x76,0x83,0xbc,0x71,0xa6,0xca,0x3b,0xcc,0xd8,0xcc,0x24,0x00,0xc2,0x44,0x64,0xfa,0x67,0x71,0x4b,0x46,0x51,0x5f,0x2a,0x14,0x32,0x71,0x27,0x05,0xd5,0x70,0x61,0x4d,0xb6,0xd2,0x6b,0xbb,0xd3,0xf0,0x26,0x7c,0x14,0x27,0xca,0x1c,0x2f,0x40,0xdc,0x9a,0x6f,0x1f,0xb0,0xf0,0xfc,0x71,0x4a,0x02,0xe2,0x4b,0x47,0x08,},\"\\x2e\\xa8\\xdc\\xe1\\x48\\x7f\\x45\\xd6\\xff\\x8e\\xb8\\x3c\\x54\\xfb\\x7e\\xdd\\x76\\xad\\x6e\\x60\\x8b\\xb8\\xda\\xf1\\xa1\\x82\\x3d\\xa4\\xf4\\xe4\\xe9\\x86\\x31\\x73\\x89\\x7c\\x19\\x7a\\xc6\\x58\\x04\\x82\\x3b\\xca\\x95\\x09\\x1f\\x59\\xe8\\x6d\\x63\\xc1\\x8d\\xbc\\xdb\\x85\\x74\\x3f\\x88\\x93\\xee\\x69\\x4d\\x81\\x56\\x01\\xf8\\xf2\\x2f\\x4d\\x7d\\xf0\\x87\\xf0\\x11\\x4b\\xb2\\x6c\\x37\\x95\\xe1\\xfe\\x4b\\x7f\\x4a\\x8f\\xa3\\x1f\\xd9\\xf4\\xff\\x10\\xfe\\x5d\\xd4\\x52\\xc5\\x4c\\x55\\x78\\xc7\\x52\\xf8\\x88\\x21\\x30\\x76\\xbe\\x46\\x7b\\xa3\\x0d\\x2e\\x2f\\xbb\\xee\\x87\\x7c\\x4b\\xe9\\xb6\\xec\\x4f\\x04\\x02\\x1c\\x00\\x6f\\x92\\x66\\x31\\x19\\x43\\xca\\xb7\\xce\\xa9\\x9a\\x2a\\xce\\xbb\\x69\\xee\\xc3\\xe6\\x18\\xc1\\x31\\xf9\\x74\\x30\\x07\\x5f\\x79\\x75\\xe3\\x9f\\x26\\xd5\\x31\\x51\\x78\\xb6\\x9a\\x1d\\xdf\\x73\\x17\\x61\\x05\\x1b\\x93\\xfb\\x8d\\xf7\\xe0\\xe8\\xb4\\x1e\\x82\\xe7\\xf4\\xf7\\x5e\\x91\\xd6\\xc8\\x90\\xb1\\x4c\\xa5\\x33\\xe0\\x94\\xeb\\x8e\\xa4\\x48\\x6d\\x38\\x71\\x85\\x96\\x6c\\x98\\x29\\x5d\\x3f\\x58\\xb1\\x7e\\xef\\x6c\\xc3\\xb4\\xd0\\x7e\\x93\\xa3\\xd9\\xf4\\x77\\x2e\\xe5\\x2f\\x18\\xa5\\xbb\\x30\\xaa\\x39\\x72\\x85\\x0e\\x65\\x81\\x70\\xbd\\xdb\\x67\\x6f\\x33\\x26\\x6c\\x9f\\xd1\\x0f\\x59\\x90\\xba\\xd8\\x91\\xf0\\xce\\xb7\\x82\\x73\\x6b\\x40\\xf0\\x1b\\xd8\\x65\\x09\\xb0\\x63\\x04\\xa9\\x6d\\x93\\xda\\x23\\x3d\\xbe\\xd1\\x8a\\xfa\\x18\\x18\\xaa\\xf5\\x7a\\xf9\\xbd\\xbc\\x86\\x7b\\x39\\x7f\\xf2\\x35\\xa8\\x3e\\x85\\x72\\x24\\xb1\\x50\\x65\\x22\\x5e\\xec\\x03\\x9d\\xd4\\xe2\\xd6\\x9a\\x04\\xee\\x10\\xbe\\xa0\\x69\\x50\\x41\\xed\\xa5\\x9b\\x05\\x8e\\xc0\\x5f\\x49\\x04\\x8e\\xe3\\x24\\xd1\\x6c\\x4d\\x61\\x07\\xb6\\xec\\xd0\\x48\\x75\\xeb\\x74\\x4e\\x93\\x65\\x47\\x1b\\x4c\\x5f\\xe6\\x61\\x1b\\x26\\x18\\x93\\xf9\\xd2\\xb1\\x28\\xe1\\x35\\xf9\\x2e\\x47\\x41\\x56\\xb2\\x71\\xb3\\xc8\\x2e\\x9a\\x76\\x63\\xda\\xd4\\x95\\x3d\\x30\\xe1\\x0e\\xda\\x08\\x62\\x60\\x7d\\xec\\x33\\x72\\xb3\\x99\\x70\\xf2\\xa8\\x4b\\x12\\xf6\\x0e\\x6d\\xae\\x7f\\x31\\x79\\x90\\x86\\xd3\\x8a\\x7e\\x34\\x94\\x84\\x19\\xc1\\xb0\\x7f\\x44\\xc2\\x15\\x9c\\x86\\xb8\\xc0\\xcf\\xe8\\x74\\x7f\\xc2\\xba\\xd5\\xbf\\x47\\x53\\x56\\xcf\\xe6\\x9d\\xe2\\xdc\\x6a\\xd5\\xa5\\x19\\xfd\\x65\\xc1\\x25\\x64\\x70\\x1c\\x05\\xf7\\xc2\\x77\\xec\\xaf\\xcf\\x4c\\x87\\xb1\\x48\\xdf\\x1f\\x98\\x79\\xa9\\xae\\x44\\x3c\\x55\\xae\\xa5\\x21\\x38\\xc6\\xfa\\x01\\xef\\x0c\\x3a\\xbb\\x5f\\x2d\\xf9\\x0a\\x57\\xab\\x66\\x24\\x17\\x8c\\x73\\x7b\\x54\\x91\\x5b\\x7a\\xa2\\x9e\\xa7\\x8e\\x8e\\x49\\xef\\x5a\\x81\\x6d\\x8a\\x92\\xc2\\xf8\\x1b\\x8a\\x19\\x63\\x27\\x79\\xc8\\x92\\xd6\\x6f\\x75\\x3d\\x51\\x8c\\x41\\xcc\\xcc\\x9e\\x59\\x3e\\x50\\x74\\x26\\x25\\xbc\\xaf\\xa4\\x68\\x80\\x5c\\x37\\xa2\\x1f\\x8e\\x29\\xa6\\x96\\x0d\\xdf\\x5c\\x5e\\x5c\\xa1\\x4a\\x7b\\x05\\x2a\\x7b\\x60\\x15\\x69\\x7a\\x02\\x10\\xed\\x6f\\x01\\x43\\xe6\\xb4\\x84\\xc3\\xf5\\xb3\\xb4\\x72\\x6c\\x60\\x7d\\x07\\xbf\\xb3\\xd5\\x4a\\x09\\xc9\\x80\\x43\\xf2\\x1d\\xcc\\x5c\\xc2\\x0b\\xb4\\x75\\x4e\\x2e\\x5a\\x73\\xb2\\xf8\\x06\\xc2\\x20\\x4b\\x72\\xf3\\x6a\\xb9\\xe9\\x6a\\x62\\xc6\\x27\\x7c\\x0a\\xd6\\x6b\\xe7\\xab\\xff\\xc1\\x63\\xb4\\xe8\\xfa\\xfc\\xef\\xf5\\xe2\\x02\\xe5\\x94\\x3f\\x4f\\x0e\\x6b\\x92\\xb4\\xdd\\xb9\\x53\\xcb\\xb7\\x91\\xf8\\x31\\x66\\x03\\x69\\x38\\xe6\\xc4\\x4a\\xd9\\x1a\\x59\\x6a\\x55\\x73\\x44\\x0f\\xb3\\x07\\x41\\xe6\\x60\\xb6\\xcd\\x5f\\x86\\xff\\xa7\\x46\\xe6\\xe9\\x72\\xb8\\x05\\xc1\\x0b\\x7b\\x7b\\x9a\\x63\\xc0\\x55\\x1d\\xb8\\xeb\\x4f\\x84\\x00\\xcd\\xe2\\x86\\x8c\\x0d\\x0d\\x4e\\xb4\\xcf\\x11\\x7f\\x8e\\xc4\\xab\\x97\\x44\\xfc\\x58\\x79\\xde\\xa7\\xf0\\xef\\x16\\xc2\\x91\\xd5\\x5c\\x17\\xf0\\x8b\\x73\\x1b\\x7c\\x65\\xd0\\xc4\\x41\\xb6\\x3b\\xc8\\xff\\x5e\\x94\\x90\\x4c\\x02\\x6a\\x13\\x61\\xda\\xcc\\x80\\xa9\\x3a\\x9b\\x9f\\xba\\x3b\\x40\\x36\\x17\\xae\\xb9\\x4a\\x56\\x85\\x41\\x84\\x80\\x11\\x95\\x42\\x34\\xae\\xad\\x70\\x0f\\x03\\x4c\\x47\\xc7\\xde\\xf8\\x77\\x90\\x52\\x55\\xf1\\x8b\\xdb\\x9a\\x25\\x7c\\xe5\\xbd\\xcf\\x0e\\x17\\x67\\x0c\\xda\\xaf\\x13\\xb1\\xc7\\xe0\\x9d\\x58\\xf9\\x2a\\x96\\x63\\xaf\\x23\\x9e\\x22\\x07\\x8e\\x18\\x0a\\x23\\xcc\\xb6\\xf6\\x4d\\x64\"},\n{{0x5a,0x25,0xea,0x5e,0x18,0x2d,0x9b,0xf8,0xe9,0x30,0xa2,0x0b,0x6c,0xf5,0x5e,0x24,0xe8,0x38,0x62,0x78,0x9b,0x38,0x39,0xb1,0xce,0x9a,0x71,0xe9,0x38,0xc4,0x2d,0x37,},{0xc9,0x81,0xfc,0x36,0xf1,0xa6,0xd5,0xf7,0xd4,0x51,0xcd,0x5e,0xf3,0x9c,0xd3,0xab,0x02,0x08,0x7f,0xcc,0x6a,0xf2,0x7d,0xd7,0x8e,0xa8,0x27,0x49,0x7e,0x77,0x9e,0x21,},{0xa4,0xf3,0x5b,0x49,0xd7,0xe1,0x98,0xe5,0xd3,0x26,0xe3,0x53,0xfb,0xb0,0x1f,0xa1,0x3b,0x6a,0xe2,0x60,0xd1,0xe4,0x8e,0x30,0xc1,0xb9,0x67,0x73,0x7a,0x5e,0x79,0x93,0x6c,0x97,0xca,0x2b,0xa7,0x99,0xca,0x34,0xe5,0xe7,0x88,0xce,0xa5,0xac,0x8e,0xd1,0x0d,0x5c,0xd1,0x5d,0xae,0x53,0xe4,0x24,0x32,0x32,0x1c,0xc2,0x6d,0xc9,0x98,0x09,},\"\\x21\\x4d\\xd1\\x92\\x7f\\x2c\\xac\\xd9\\x88\\x87\\x14\\x24\\x9b\\x85\\x43\\x46\\x02\\xac\\x78\\x45\\x3b\\x4a\\xf5\\x38\\x6e\\xee\\x39\\x29\\x5d\\x3d\\x5a\\x22\\x67\\x80\\x6e\\xb0\\xcf\\xf2\\xc1\\x32\\xd3\\x64\\xc2\\x42\\x0d\\x04\\xe3\\xf6\\xcc\\x0a\\x96\\x7b\\xf0\\x5a\\x10\\xff\\xcf\\x12\\x17\\xbb\\xf3\\x15\\xe7\\x5b\\x98\\x06\\x0f\\xd4\\x58\\xd6\\x7e\\xba\\xad\\x93\\x80\\xf4\\xad\\xc4\\xdb\\xdf\\x74\\xcb\\xf1\\xc6\\x47\\x92\\x02\\xbd\\xd7\\xfe\\xd3\\xa9\\x46\\x69\\x7d\\xc3\\x84\\x44\\xd8\\x8b\\xfe\\x51\\xd4\\x1d\\x7a\\x9b\\x38\\xda\\x60\\xb8\\x50\\xc5\\x6b\\x48\\xba\\x98\\x4f\\x6a\\x18\\x89\\x51\\x49\\x55\\xc0\\xda\\xdb\\x69\\xa8\\xc7\\x36\\xcc\\x76\\xcd\\xc4\\x9f\\x13\\xf8\\x5a\\x8b\\xfb\\x79\\x28\\xff\\x0a\\x0c\\x0c\\x03\\xf1\\x7c\\x74\\xb5\\xe1\\x06\\x2d\\x75\\x53\\xfb\\xeb\\x9d\\xd3\\xd5\\x08\\x1d\\xe1\\xdf\\xd8\\xa6\\xa9\\x97\\x66\\x97\\xc6\\xa2\\x59\\xbc\\xf7\\xd4\\xbe\\xf1\\xc2\\x1e\\x0a\\xaf\\x32\\x98\\xb0\\x42\\x1b\\x91\\x9f\\xdd\\xfc\\x1d\\xcb\\x3e\\xc6\\x83\\xd8\\x6f\\xf3\\xd4\\x23\\xd7\\x1c\\x8f\\x2d\\x72\\x3a\\x42\\xff\\x68\\xd8\\x2e\\x9f\\x39\\x17\\x49\\xb8\\x29\\x98\\xdc\\xfa\\x11\\x21\\x60\\xf5\\x2a\\x41\\x3a\\x23\\xd9\\x5f\\xc4\\x2c\\x3b\\xd2\\x23\\x84\\xba\\xd7\\x77\\x54\\xa7\\x10\\xd8\\xb9\\xf8\\x4a\\xe0\\xa8\\x02\\xfc\\x46\\x50\\x9e\\x7f\\x2b\\x07\\x07\\x90\\x12\\xb4\\x3b\\xfe\\xea\\xb7\\x19\\xbd\\xe5\\x6f\\x00\\xe5\\x9b\\x8e\\xdf\\x1c\\x47\\x28\\x83\\xb1\\x98\\x5b\\x2f\\xa6\\x99\\xa1\\xae\\x90\\xcf\\x45\\xd7\\xac\\x58\\x0c\\xeb\\x5f\\x27\\x97\\xde\\xf5\\xb8\\xbf\\x4f\\x2b\\x9b\\x35\\x19\\xa7\\x27\\xb9\\xf2\\xcd\\x12\\x56\\xa2\\xf0\\x76\\xed\\x22\\x96\\x49\\x5b\\x5c\\x2d\\xf7\\x88\\x7f\\xf8\\x9e\\x88\\xe2\\x36\\xa1\\x4c\\xde\\x63\\x24\\xf4\\x3d\\x68\\xd9\\x01\\x72\\xb0\\xb8\\x8b\\xd2\\x88\\x03\\xe9\\x99\\xdb\\xed\\xcc\\x50\\x1d\\xb6\\x54\\x54\\x4e\\x17\\x1e\\xc1\\xf9\\xf3\\x2d\\x4d\\x33\\x21\\xd5\\x89\\x39\\x2e\\x03\\xca\\x65\\x9f\\x96\\x75\\x2e\\x1f\\x08\\xa5\\x5d\\xb5\\x53\\xd8\\x66\\x98\\x55\\x41\\xf5\\xbe\\xf8\\x4c\\xe2\\xee\\x32\\x3e\\x17\\xd1\\xf7\\xdc\\x16\\x4b\\x50\\x51\\x5a\\x28\\x7d\\x53\\x05\\xfc\\x28\\xc5\\x98\\x3b\\x9e\\x53\\x98\\xb2\\x40\\x7a\\xe4\\x72\\x96\\xfe\\x4a\\x48\\x1d\\x22\\xff\\xb4\\xb8\\x65\\xa6\\x6b\\x97\\xa6\\xc2\\x79\\x35\\xdd\\x8e\\xb8\\x69\\x94\\xb7\\x9d\\x36\\x83\\x63\\x71\\x3f\\x10\\x1d\\xc3\\x7f\\x42\\x9e\\xee\\x0f\\xee\\x24\\x41\\xc2\\xdc\\x17\\xbf\\x43\\x92\\x4f\\x0c\\x04\\x4f\\x14\\x32\\x90\\xea\\xf3\\xf9\\xee\\x4d\\x94\\x6d\\xbe\\x45\\x83\\x1a\\x0d\\x83\\xc0\\x76\\xe7\\x51\\xc1\\x4f\\x3b\\x1a\\x72\\x67\\xf5\\x44\\x6c\\x18\\x86\\x98\\xd2\\xb4\\x6d\\x87\\xe6\\xf3\\xb2\\x0b\\xb3\\xfd\\xaf\\xe2\\x4c\\xc0\\x96\\xbc\\x31\\x2d\\x86\\x78\\xb3\\x8a\\x80\\xc3\\xf0\\x52\\xa0\\xc9\\x6d\\x5a\\xd8\\x7a\\x5d\\xd8\\xc1\\x33\\xcc\\x9a\\x15\\xbe\\x33\\x57\\x4c\\xd9\\x43\\x08\\xc2\\x4d\\xec\\x1a\\x9b\\xdf\\x18\\x9b\\xa6\\x87\\x19\\x9f\\x72\\xef\\x67\\x09\\x87\\x8e\\x10\\xf8\\x7b\\xd8\\xa0\\x3d\\xc8\\x4c\\x8f\\xa9\\x64\\x20\\x28\\x58\\x98\\xca\\x32\\x11\\xd8\\xb0\\xcc\\xef\\x64\\x01\\x1e\\xc2\\x4f\\x38\\xe5\\x74\\xda\\x34\\xda\\xb9\\xd2\\xf0\\x02\\x10\\x52\\x27\\x89\\x0f\\x92\\x48\\x8c\\x62\\x1e\\x57\\x13\\xe4\\x7d\\xbc\\xb1\\xa8\\x2a\\x6d\\xa6\\x0d\\x8b\\x22\\x01\\xeb\\x29\\xd4\\x94\\x49\\x33\\x60\\xed\\x5a\\x3f\\x4b\\x52\\x25\\xea\\xe7\\x70\\x7e\\xe0\\xb4\\xc0\\x40\\x73\\x05\\xc1\\x67\\x54\\xc7\\xf6\\x30\\xfc\\x85\\xc1\\x3e\\x49\\x17\\x04\\x7b\\xcf\\xf3\\xb2\\xa2\\x93\\xfe\\x95\\x55\\x06\\xc7\\x26\\x4e\\xa6\\x5b\\xf3\\xa9\\xb2\\x5a\\xcf\\x34\\x36\\x00\\xd8\\xfa\\x0c\\x7c\\x1a\\x29\\x0d\\x02\\x71\\x10\\x1b\\x7f\\x40\\xb9\\x6e\\x7f\\xda\\xf2\\x9d\\xef\\x9d\\x93\\x27\\xa5\\xae\\x05\\x44\\x6c\\xb5\\xa6\\xd3\\x22\\x45\\x3a\\x8b\\x09\\x8b\\xcf\\x3a\\xee\\x1f\\x70\\x4e\\x14\\xd0\\x0b\\xe3\\x42\\xb8\\x93\\x4d\\x19\\xe5\\x29\\x21\\x88\\x72\\xea\\x3a\\x2f\\xb2\\x12\\x4b\\x52\\x66\\x7c\\x01\\xfc\\xa5\\x84\\x1c\\x66\\xe1\\xe6\\x4a\\x1e\\x68\\x0e\\x09\\xba\\x18\\x6e\\x04\\xd1\\x05\\x18\\x6c\\xf6\\xeb\\x72\\x8b\\x9d\\x50\\x2a\\x66\\xb8\\x29\\xfb\\xc9\\x92\\xa3\\x88\\x10\\x04\\xec\\xdc\\x80\\xad\\xfd\\x04\\x4e\\xda\\x88\\x0f\\x8a\\xf7\\x2a\\x14\\xfb\\x55\\x0d\\x7c\\xc7\\x41\\x94\\xa9\\x45\\x20\\x7d\"},\n{{0x42,0x33,0x5c,0x30,0xb3,0xf6,0xb3,0x59,0xce,0xf5,0xaa,0xb6,0xa3,0xce,0x28,0x58,0xa1,0x51,0xb7,0xa4,0xfd,0x78,0xd2,0xfd,0x3e,0xe3,0x6f,0xc2,0x9d,0x24,0x94,0x04,},{0x30,0x1c,0x51,0x5a,0x02,0xa4,0xc6,0x6b,0xc6,0x40,0x10,0x80,0xc6,0xca,0x79,0x23,0xb7,0x83,0x1e,0x3c,0x9a,0x72,0xb5,0x5b,0x14,0x02,0x7e,0xb2,0xe7,0xb3,0xb1,0x52,},{0x67,0xb0,0xf1,0x74,0x49,0x03,0x9e,0x8c,0x79,0x7b,0xf9,0x13,0xaa,0xe6,0xe4,0xf0,0xbb,0x99,0xc7,0x4d,0x6d,0x10,0xc9,0x73,0xb9,0x90,0xff,0xe0,0x3e,0x7e,0xe4,0xab,0x5b,0x35,0x80,0x6d,0xb1,0x5a,0x98,0xc0,0x84,0x6a,0x82,0x7e,0x7b,0xcd,0x53,0x9c,0xd3,0xbc,0x09,0xdd,0x11,0x8a,0xb3,0xe5,0x26,0x63,0xa3,0x57,0xb1,0x29,0x91,0x07,},\"\\x6d\\xa2\\x25\\x1e\\x6f\\x55\\x95\\x36\\xb0\\x9b\\xfa\\xfb\\x81\\x60\\xa2\\xe8\\x10\\x2d\\x31\\xf8\\xb5\\x93\\x24\\x08\\x3e\\x52\\x27\\xb2\\x0c\\x3e\\x5c\\x3a\\x06\\xe2\\x39\\x67\\x68\\xdc\\xa3\\xec\\x76\\xdc\\x7f\\xc0\\xeb\\x3d\\x14\\x5e\\x62\\xed\\x07\\xfc\\x1a\\x8b\\x1b\\x2e\\x34\\x70\\x13\\xa0\\x52\\x72\\x74\\xd0\\xb2\\x34\\xfe\\x72\\x50\\x26\\xa9\\xd1\\x28\\xf8\\xdf\\x20\\xdb\\xfa\\x3b\\x65\\x03\\x81\\x8e\\xde\\xbd\\x7f\\x24\\x93\\x40\\x80\\x94\\x5a\\x7e\\x1e\\xa0\\x22\\x73\\xfe\\x48\\xb6\\xed\\x1e\\x83\\xfd\\x16\\x8d\\x79\\x73\\xfb\\xb7\\x94\\x1b\\x40\\x37\\xd3\\xcd\\xa5\\x55\\xe0\\xe8\\x9c\\x2b\\x94\\x3f\\xb1\\xe2\\x07\\x65\\xac\\x7d\\x4f\\xa3\\x77\\x7f\\x35\\xa0\\xa8\\xbc\\x11\\x8f\\x59\\x9c\\x84\\x7b\\xe3\\xfd\\xb2\\xd8\\xe2\\x01\\xae\\x12\\xa3\\x0b\\xde\\xfb\\x03\\x4f\\xf2\\x4e\\x3e\\x2e\\x70\\x1a\\x0d\\x17\\x33\\x73\\x40\\x78\\xbd\\x1f\\x9a\\x69\\xbb\\xc6\\x67\\xe4\\x61\\x21\\x1f\\x2c\\x76\\x9d\\x29\\xdb\\x7c\\x4d\\x62\\xd6\\xb1\\xb9\\x2b\\x56\\xf5\\xf1\\x8a\\x93\\x1a\\x92\\x60\\x64\\xb7\\x8d\\xa1\\x46\\xe1\\x8b\\x48\\x13\\x9b\\x9b\\x39\\x86\\x2a\\xec\\x37\\xbc\\xce\\x12\\xcb\\x78\\x94\\x29\\xe6\\x8e\\xa3\\x81\\x12\\xd0\\xb5\\xcc\\xe3\\x0b\\xd2\\xd2\\x6c\\x5f\\x7f\\xd4\\x15\\xda\\xf7\\xca\\x31\\x7b\\x33\\x68\\xb7\\x61\\x7d\\x45\\x25\\xe5\\xbc\\x97\\xd9\\x46\\x1d\\x5d\\x64\\xf6\\xb5\\xd3\\x18\\xd0\\xbc\\x3b\\x76\\xf2\\x5b\\x06\\x05\\x42\\x69\\x09\\xf2\\xaa\\x0c\\xd6\\x67\\xa4\\xf0\\xe0\\x75\\xb9\\xa9\\xfb\\x2e\\x9a\\x6c\\x82\\x70\\x4d\\x8a\\x9f\\x16\\x66\\x84\\x4e\\xdc\\x32\\xf6\\x3a\\x3d\\x4e\\x0f\\xd9\\xfd\\xba\\x30\\xb5\\x1b\\x33\\x36\\xb9\\x6e\\x9e\\xae\\x39\\x2a\\x34\\x2d\\xe4\\x9e\\x9b\\x5f\\xa0\\xf9\\xb9\\x01\\x71\\xbd\\xe0\\x9c\\xf1\\xe9\\x46\\x49\\x91\\x40\\x00\\x81\\x59\\xeb\\x18\\x65\\x56\\x3c\\x28\\x39\\x4b\\x03\\xa8\\xd7\\xa5\\x52\\x27\\x1b\\x28\\x76\\x68\\x75\\x66\\xb8\\x0f\\xd3\\xbe\\x2b\\x66\\x33\\x2f\\xca\\xd1\\x96\\xca\\xb8\\x52\\x7c\\x56\\xe2\\x15\\x36\\xa1\\x41\\x65\\x2c\\xdc\\x7f\\xa7\\x45\\xb2\\x6a\\x33\\x1d\\x78\\x7b\\x93\\xe5\\xe8\\x16\\xd8\\xd8\\x51\\xa5\\x8f\\x6a\\xc0\\x7a\\x58\\x27\\xfc\\xdf\\x47\\x2e\\x86\\x85\\x43\\x3a\\x40\\xca\\xc0\\xc4\\x9a\\xa5\\x69\\x31\\x9a\\x2e\\x57\\xb4\\x1c\\x99\\x98\\x16\\x5e\\x69\\x72\\x3b\\xa7\\x7e\\x5c\\x04\\x23\\xc4\\xb4\\xca\\x07\\x18\\x7b\\xb7\\x44\\x2e\\x7d\\x31\\xca\\xac\\xb2\\x77\\x00\\xc7\\x1a\\xe4\\x8c\\xd0\\x55\\xed\\x2f\\xe4\\xda\\x36\\x3f\\x44\\x82\\x11\\x24\\xcc\\xa1\\xbf\\x2e\\x63\\xd9\\xb8\\xab\\xd2\\xfa\\x41\\xb1\\x42\\x2f\\x52\\xd5\\x58\\xbc\\x5f\\x11\\x0c\\x86\\x3c\\xc6\\x00\\x86\\x49\\x84\\xed\\x25\\x9b\\x73\\xcd\\xdd\\x57\\x96\\xb3\\x29\\x79\\xed\\xdf\\x76\\xa0\\x7b\\xc5\\x9b\\x73\\x68\\xc4\\x8e\\x12\\x9e\\xcc\\x0d\\x45\\x35\\xdc\\xce\\xe2\\xc3\\xb8\\xe5\\x6d\\xe5\\x0e\\x6f\\x5c\\xc6\\xea\\x51\\x5c\\xd6\\xa0\\xeb\\xdf\\x1c\\xa7\\x9a\\xa2\\x79\\x48\\x21\\xad\\x2e\\x10\\x9e\\xdd\\xa4\\x50\\xc9\\xfc\\x3c\\x84\\xd8\\xc9\\x6b\\xc3\\x8d\\x4b\\x43\\x7a\\x73\\x8f\\x81\\x8b\\x4d\\xdc\\xb6\\x84\\x38\\x3c\\x09\\xb1\\x1b\\x36\\x05\\x2e\\x9d\\x2f\\x76\\xa6\\x1e\\xb4\\xd6\\x20\\x49\\xce\\xd5\\xf6\\x16\\x62\\xc4\\xb9\\xec\\xd2\\x4a\\x67\\xf4\\x51\\x9d\\x46\\x52\\x8c\\x5b\\x2e\\xb2\\x10\\x05\\xf4\\x9c\\x73\\xa3\\x37\\x0c\\x68\\xe3\\x7a\\xc2\\xb1\\x8d\\x48\\x1f\\xa1\\x0f\\x96\\x71\\x4f\\xe0\\x5c\\x16\\x8d\\xf1\\x1c\\xda\\x54\\xf1\\x4f\\x49\\x37\\xe9\\xfc\\xe1\\xf5\\x16\\xc0\\x37\\x1b\\x36\\xa2\\xc0\\xa0\\x50\\xba\\xc7\\xfa\\x51\\x22\\xa6\\xe3\\x5e\\xc9\\xc4\\x04\\x36\\x58\\x5f\\x31\\x6e\\x6c\\x91\\x1b\\xdf\\xd7\\xdb\\x4b\\x80\\xb4\\x30\\x64\\x79\\xb8\\x2a\\x2b\\x24\\x3a\\x52\\xb2\\xd2\\xb6\\x27\\x42\\xed\\x11\\x28\\x27\\x90\\xcf\\x6f\\xdc\\x7c\\x9c\\x82\\x43\\x64\\xcf\\x25\\x63\\x6a\\x85\\x51\\x50\\xbd\\xdb\\xdf\\x7e\\x64\\x0f\\x9f\\x95\\x2a\\x94\\x7e\\xc7\\x97\\x49\\x25\\xe8\\x24\\x50\\x68\\xb2\\x92\\x10\\x1b\\x1f\\x4b\\x20\\x18\\xe8\\x5d\\x07\\x8c\\x2f\\xee\\xf4\\x49\\x23\\x49\\x72\\x9a\\xd4\\xac\\xb3\\x8f\\x1c\\x7c\\x02\\x70\\xb6\\x1d\\x3d\\xfd\\x76\\x36\\xc6\\xcb\\xf1\\x81\\xe4\\xc8\\xa0\\xe6\\x4f\\xa0\\x61\\x32\\x55\\x3c\\x2b\\x9d\\xb7\\x01\\x9e\\x3b\\x3c\\x48\\x5d\\x8d\\x5b\\x7d\\xfd\\x5f\\x51\\x5e\\x4d\\x71\\xed\\xe5\\x35\\xae\\x7f\\x2a\\xae\\xdc\\x23\"},\n{{0xbe,0x6b,0x2b,0xab,0xdd,0xd2,0xdc,0xa1,0xb0,0xe1,0x0d,0x12,0xd2,0x0a,0x9c,0xe2,0x9c,0x67,0x85,0xda,0xc1,0xd6,0x0f,0x2e,0xdf,0xa9,0x4a,0xc2,0x78,0x4b,0xa7,0x66,},{0x39,0x8f,0x22,0xf0,0xef,0xbf,0x8c,0x38,0x35,0x5e,0x47,0x91,0xbf,0x67,0x08,0x98,0x95,0x1f,0xbb,0xd5,0x51,0x8f,0x0e,0x2a,0x60,0x5d,0x46,0x00,0x23,0xf6,0x13,0xf0,},{0x70,0x2a,0xb9,0xac,0xbf,0xa7,0x5e,0xa2,0xad,0xbe,0x4b,0xe2,0xb6,0x84,0x76,0x25,0xae,0xb4,0x09,0xee,0xf9,0x59,0x6f,0xab,0xe3,0x9d,0x2c,0x53,0x3a,0x03,0x43,0x1e,0x5e,0x57,0x95,0x52,0xe8,0xa6,0x4f,0xc4,0xfb,0x7d,0x92,0x6a,0xa8,0xff,0xfe,0x06,0x40,0x69,0x84,0x64,0xc4,0x45,0x4c,0xe3,0x5f,0xe8,0x3f,0xf2,0x63,0x05,0x1a,0x01,},\"\\x5c\\x92\\x95\\x88\\x1b\\x7a\\x67\\x06\\x69\\xb0\\x4c\\xbe\\x0d\\xab\\xd8\\x96\\x93\\xb7\\x7f\\x7c\\xce\\x0d\\x4a\\x33\\xf5\\x2e\\x02\\xeb\\x26\\x95\\x9e\\x71\\x3d\\x9a\\xef\\x5f\\x95\\x44\\x2b\\xdf\\x91\\x72\\x83\\x83\\x32\\x52\\x02\\xaa\\xcc\\xc0\\x37\\x47\\x7e\\x36\\x66\\xfa\\xca\\xf2\\x4e\\xac\\x95\\x34\\x87\\x9a\\xa3\\xef\\xe1\\x8f\\xfc\\x1a\\x5c\\x54\\xe3\\x9c\\x76\\x87\\xd0\\x93\\x7b\\x24\\x71\\xba\\xb3\\x89\\xb6\\x46\\xcb\\xe6\\xb3\\xe5\\xd5\\x96\\x1e\\xa6\\x3b\\xd4\\x52\\xb4\\x74\\x33\\x44\\xce\\x4c\\x79\\x33\\x74\\x52\\x37\\x95\\xc7\\x81\\xee\\x84\\xd5\\x11\\xe2\\x94\\x11\\x19\\xba\\xd1\\xf4\\xa7\\x46\\xed\\x9d\\xba\\x89\\xc8\\xd0\\x75\\x1a\\x64\\x02\\x71\\x86\\x35\\xf6\\xe3\\x1d\\x9e\\x18\\x68\\x1c\\x69\\x56\\xc5\\x37\\x32\\x51\\xd3\\x5f\\x53\\xba\\xa1\\x98\\x7c\\xd4\\x48\\xc9\\x03\\x1a\\x07\\xf3\\x2c\\x80\\x29\\x11\\x9d\\xe3\\xa9\\x16\\x31\\xde\\xde\\x1d\\x93\\x3e\\x0f\\xa3\\x26\\x29\\xaf\\xe1\\xb4\\x2e\\xb5\\x91\\xc2\\x2f\\x87\\x33\\x1e\\x93\\xcc\\x08\\x3c\\x23\\xf6\\x4a\\x6e\\x5e\\x58\\x6f\\xf3\\x1c\\xc0\\x4e\\x42\\x3c\\x56\\xae\\x3f\\x6a\\x73\\x94\\x6c\\x48\\xde\\x4d\\x85\\xab\\x00\\x17\\xba\\x24\\x45\\x6d\\x69\\xb5\\x9d\\xca\\x6d\\x40\\x3b\\x64\\xb0\\x7c\\x40\\xd3\\xb9\\x0e\\x12\\x23\\x21\\x5e\\x3f\\x7e\\x87\\x6c\\x67\\x01\\x11\\x1e\\x37\\xe5\\x17\\x77\\x08\\x87\\x31\\x0c\\xa8\\x56\\xf0\\x09\\xa0\\xd6\\x06\\x54\\x83\\x5d\\x94\\xe6\\x58\\x7a\\x43\\x9d\\xa5\\xdb\\x0a\\x0c\\x37\\xd7\\xc9\\xd3\\x7c\\xa1\\xd7\\x03\\xe1\\xb3\\x22\\x76\\x31\\xad\\xac\\xaa\\x79\\x42\\x1a\\x1c\\x43\\x9d\\x60\\x34\\x9a\\xe5\\x77\\x41\\xb7\\xa8\\xad\\x09\\xec\\x29\\x31\\x23\\x03\\x0b\\xf6\\xba\\xc0\\x68\\x9e\\x53\\x1c\\xa7\\xe7\\x27\\x18\\x22\\x3f\\x9e\\xa4\\x3b\\xec\\xb0\\xee\\x9d\\x9c\\x1a\\xb8\\x45\\xed\\x1c\\xae\\x44\\x3e\\x3c\\x5d\\x4a\\x9b\\x1e\\xde\\x6d\\xb3\\x41\\x7c\\x3a\\xce\\x28\\x11\\x43\\xf4\\x2d\\x85\\xf5\\x99\\xb3\\xb9\\xd3\\xd0\\x5f\\xa0\\xed\\x07\\xc1\\xec\\x35\\xff\\xab\\x03\\x05\\x16\\x8b\\x4e\\x56\\xe5\\x8a\\xfa\\x06\\x17\\xf9\\xa8\\x6b\\x1b\\x5b\\x20\\x1d\\xcc\\xb0\\x72\\xb4\\xce\\xf0\\xbb\\x7b\\x95\\xc5\\x2d\\xae\\xef\\x9d\\x9e\\x74\\x24\\xa5\\xc0\\xf1\\x48\\xf9\\xff\\xe6\\x0a\\x5b\\x23\\xe0\\xff\\x82\\xc7\\x30\\x99\\x2a\\xc9\\xc1\\x7f\\x97\\xf0\\x65\\xcf\\x0a\\xd5\\x37\\x7e\\xac\\xcb\\x31\\xd8\\xbb\\x92\\x3b\\xd2\\x60\\xea\\x11\\x9e\\x6f\\xa9\\xbd\\x69\\x83\\x48\\x2d\\x70\\xd9\\x21\\x91\\x02\\x40\\x2d\\xc6\\xa3\\x49\\x91\\x93\\xd0\\xc1\\xcd\\x3e\\xd2\\xa6\\x69\\x21\\xa9\\x8d\\xf6\\x9b\\x79\\x14\\x13\\xf4\\x97\\x0b\\xbc\\xe0\\x4f\\x63\\x9a\\xf9\\x09\\xc6\\x4f\\x45\\x60\\xdb\\x0a\\xf6\\x00\\x3d\\xc4\\x62\\x19\\xe8\\xad\\x2b\\x37\\x2f\\x8b\\x5f\\x81\\xcf\\xaa\\x04\\x1a\\xb7\\x1a\\x34\\x8c\\x93\\x1e\\x8d\\xfd\\xbc\\x40\\x9c\\x22\\xd7\\xee\\x6e\\x07\\x62\\x6e\\x10\\x4e\\xc6\\xcc\\x7c\\x6a\\x41\\x16\\x17\\x7f\\x93\\xaf\\x16\\xf1\\x24\\xf1\\x96\\xda\\xb6\\x19\\xb6\\xf6\\x98\\xc2\\xd1\\x91\\x85\\x8e\\x96\\x0c\\x2e\\x94\\x7b\\x51\\xf3\\xac\\x48\\x38\\x75\\x9c\\x21\\xfe\\xf7\\xeb\\xae\\x35\\xda\\x24\\xf5\\x5e\\xbd\\xa9\\xb9\\x87\\x9a\\xea\\x17\\xa6\\xd8\\xd9\\x27\\xde\\x48\\x7b\\x17\\x5f\\xd7\\xfa\\xa2\\x14\\x38\\xa2\\x09\\x23\\xdd\\xbb\\xca\\x72\\xe6\\x72\\x69\\x34\\xbd\\x6c\\x21\\xe8\\x11\\x80\\x19\\xf6\\x5b\\x38\\x10\\xa0\\x7f\\xa2\\x7b\\x1c\\xba\\x64\\xd0\\xf3\\x9f\\x0b\\xfd\\x49\\xdc\\xfa\\xfd\\xef\\xe3\\x79\\xbd\\xea\\x82\\xf3\\x1a\\x9c\\x39\\xf7\\xe8\\x1d\\x29\\x43\\x37\\xd1\\x0f\\x1e\\x9d\\x8b\\x50\\xeb\\xa4\\x58\\xce\\x7b\\x75\\x3d\\x36\\x96\\x85\\x38\\x51\\x3e\\xdd\\xb0\\xe8\\x45\\x34\\x41\\x1c\\x4a\\xf3\\xf0\\x21\\x46\\x10\\xee\\x39\\x01\\xa0\\xeb\\xf3\\x16\\x17\\x3c\\xca\\xf1\\x5c\\xd7\\xee\\x49\\x6d\\xbf\\xc2\\x46\\x5e\\xb8\\x34\\xdf\\x62\\x02\\x9d\\x62\\x1f\\xe9\\x11\\x82\\x4d\\x79\\x87\\xdf\\x2d\\x46\\x34\\x6b\\x4d\\xce\\x1e\\xce\\x7d\\x19\\xd5\\x51\\x18\\xc0\\x37\\xc9\\x95\\x51\\x11\\xd0\\x7f\\x1f\\xc3\\x62\\xc7\\x39\\xf1\\xea\\x5b\\x27\\x5c\\x71\\xc0\\xae\\xbf\\x59\\x65\\x5e\\x2d\\xef\\x16\\xe1\\x23\\xb3\\xeb\\x25\\x26\\xc3\\xca\\x5e\\x83\\xcb\\x24\\xd5\\xb6\\x8d\\x7a\\xc4\\x0a\\x67\\x59\\x33\\x84\\xc5\\x63\\xaf\\xe0\\xb5\\x52\\xad\\xaf\\x60\\x80\\x50\\x35\\xbe\\x97\\xb8\\x06\\x76\\xad\\xeb\\x15\\x76\\x52\\x08\\x33\"},\n{{0xb1,0xe4,0x7c,0xa3,0x1c,0x64,0xb6,0x8a,0xaf,0xaf,0xb4,0x43,0x51,0x2e,0x66,0x78,0x7c,0x65,0x92,0xf3,0x34,0xaa,0x78,0xfa,0x21,0x9a,0x3d,0x93,0xc3,0x3a,0x4a,0xb3,},{0x58,0x11,0x9b,0x38,0xe6,0xa1,0x48,0xa9,0x36,0xbc,0x5f,0x92,0xf4,0xf2,0x9b,0x98,0x2f,0xf2,0xcc,0xa6,0x4a,0x5a,0xff,0xa1,0x4c,0xa1,0xb6,0xa6,0x2f,0xe3,0x28,0xc4,},{0xdf,0xac,0x86,0xdf,0x58,0x6e,0xc3,0x4c,0x7c,0xfe,0xa5,0xd5,0xa6,0xcd,0x11,0x40,0xe5,0x0b,0x6b,0xf0,0x50,0xf8,0xe4,0x1a,0x19,0x0e,0xbf,0xd3,0xb1,0x43,0x2b,0x95,0xa5,0x7d,0x56,0x52,0xdb,0xae,0x8f,0x53,0xe0,0x37,0xae,0x32,0x6e,0x7f,0x18,0xcf,0xef,0x7c,0x77,0x9f,0x40,0x34,0x6f,0x7c,0x0d,0x86,0x44,0x61,0x05,0x93,0xf2,0x09,},\"\\x76\\x7e\\xc1\\xb3\\xda\\xf2\\x04\\x38\\x7f\\x3f\\xd3\\xb2\\x00\\x10\\x78\\x1a\\xfb\\x1f\\x38\\xf6\\x14\\x47\\x42\\x13\\x28\\x7f\\xff\\x11\\x30\\x7f\\x5f\\xf5\\xae\\x7e\\xc9\\x45\\xa2\\xb9\\xb4\\x87\\x00\\x49\\xd4\\x53\\x2f\\x8f\\x61\\xc1\\xa7\\xb5\\xf2\\x11\\xfc\\xa2\\xe6\\x7c\\x37\\x4d\\x96\\x21\\x9d\\x8e\\xa9\\xde\\x73\\xf0\\xe3\\x87\\x04\\xfc\\x94\\xc0\\xe9\\xe7\\x2f\\x2e\\x15\\xda\\xba\\x3f\\x88\\xf7\\x49\\xb1\\xed\\x70\\x26\\x60\\xdb\\x1a\\x35\\x2a\\x26\\x67\\xd4\\xdf\\xd4\\xe0\\x0a\\x18\\xef\\xa4\\xc6\\x60\\x9e\\xe9\\xc9\\xa8\\x8a\\xda\\xcb\\xbb\\x98\\x5d\\x3d\\xe8\\xdd\\xd1\\x7d\\x4e\\x4e\\xb7\\xcf\\x74\\xa1\\xda\\x91\\xed\\xb3\\x90\\x85\\x2e\\xa4\\xcb\\x9a\\x42\\x4f\\x7f\\xa2\\x22\\x9e\\x08\\x30\\x33\\xa3\\x40\\x59\\x11\\x7e\\x5e\\xfa\\x7b\\x66\\x13\\xd7\\x5e\\x58\\xb7\\x02\\xc6\\xce\\xe5\\xd0\\x04\\xe8\\x59\\x9b\\x97\\x50\\x3a\\x5f\\x10\\xc4\\xc4\\xe5\\xb9\\x57\\x73\\x71\\xd3\\xd0\\x5b\\x2d\\xfb\\xf7\\xcb\\xef\\xe6\\xd0\\x92\\xd6\\x5c\\xbd\\x40\\x51\\x38\\xd9\\xb0\\x4c\\x51\\x86\\x23\\x59\\x83\\xfa\\xb6\\xd4\\xce\\x85\\xb6\\x36\\x27\\x62\\x06\\xd7\\x4a\\x2e\\xe7\\xdb\\x61\\x64\\xda\\xc4\\x7c\\xce\\x78\\xf5\\x0d\\xb9\\x9a\\xf6\\xac\\x6e\\x70\\x64\\xc1\\x3a\\xab\\x79\\x3b\\xe8\\x7e\\x66\\x28\\x9c\\x94\\xa0\\x9f\\xb0\\xa3\\x1d\\x97\\x97\\x1e\\xdd\\x74\\xea\\x9c\\x0c\\xe8\\x74\\xd2\\xb7\\xd6\\xc4\\xab\\xae\\xff\\x07\\xf8\\x70\\x22\\x51\\x51\\x94\\x6a\\x5c\\x47\\x6f\\x6b\\x97\\x89\\x96\\xb8\\x7d\\x8c\\x98\\x46\\x06\\xc7\\x91\\x28\\x7d\\xa6\\xba\\xd0\\xaa\\x44\\xb0\\x13\\x0b\\xe8\\x86\\x71\\xa5\\x56\\xe2\\xde\\x35\\xc4\\xcb\\x03\\x8e\\xe7\\x81\\x27\\x35\\x30\\xac\\xe0\\xa1\\x04\\xc2\\x78\\x09\\xae\\xe0\\x33\\xc8\\xbf\\x90\\x29\\xd9\\x0f\\xe7\\xba\\x06\\xaa\\xa9\\x4e\\x16\\xa5\\x2c\\x64\\x3d\\xfd\\x92\\xa7\\x62\\x4f\\xbb\\xee\\x77\\xa7\\x15\\x8b\\x2c\\xc1\\x51\\xbd\\x3f\\x61\\xa1\\xa7\\x6f\\x32\\xb2\\x84\\x89\\x30\\x7a\\xcf\\x0d\\xd8\\xc2\\x6c\\xc4\\xad\\xbb\\xb8\\xde\\x43\\x0d\\xb4\\xe4\\xf5\\x83\\x08\\xb6\\xab\\x90\\x45\\x61\\x11\\xde\\xac\\x29\\x78\\x17\\x2f\\xe1\\xfc\\x0c\\xe4\\x98\\x08\\x8a\\xdd\\x4c\\x31\\xc2\\x1f\\x24\\x27\\x90\\x25\\xfe\\xb4\\x8c\\xbb\\x7a\\x92\\x0c\\xff\\x2d\\x28\\x71\\x05\\x87\\xaf\\x52\\xc8\\x44\\xdb\\x8a\\x7a\\xeb\\x7d\\xf1\\x0d\\x43\\x41\\x1a\\x3c\\x8e\\xee\\xbb\\x40\\x6d\\x6e\\xfc\\xb1\\x92\\x48\\x88\\x7d\\x45\\x0b\\x57\\x3d\\x90\\x30\\x5e\\x1f\\x23\\x75\\x3e\\x89\\x05\\x11\\xdc\\xc7\\x7c\\x74\\x0e\\x31\\x6a\\xd7\\xf5\\x2d\\x49\\x02\\x07\\x3d\\xb3\\x99\\x8e\\x4e\\x4a\\xcc\\x4e\\x01\\x88\\x5b\\xd1\\x18\\x8e\\xcd\\x61\\x65\\xae\\xde\\xd1\\xe7\\x78\\x70\\x2b\\x6a\\x6a\\x79\\xa9\\x49\\x99\\x10\\x2d\\xf7\\x20\\x18\\xf7\\x92\\xf8\\xf1\\x62\\x00\\x7e\\x81\\x2a\\xef\\x8f\\x95\\x6e\\x12\\x32\\x82\\xbb\\xdb\\xd0\\xc3\\x56\\x12\\xc2\\xd3\\x47\\x3f\\x94\\x4c\\x6d\\x76\\xbe\\x9e\\x86\\xff\\xfa\\x46\\xcc\\xb1\\xae\\x13\\x50\\x5a\\x4a\\x81\\xf3\\x1b\\x84\\x26\\xb8\\xb6\\x0d\\xe8\\xe8\\xa7\\xc1\\x6d\\x1e\\x16\\x65\\xb2\\x71\\x43\\x46\\x65\\xc4\\x42\\xa9\\xc6\\xa9\\x77\\xce\\x98\\x6f\\x69\\x93\\xb7\\x43\\x9a\\xf0\\x3b\\x40\\x2e\\xea\\xff\\xf1\\x45\\x6d\\x15\\x15\\x26\\xd9\\xc5\\x8f\\x51\\x5f\\xd2\\x48\\x5e\\x0c\\xbb\\x32\\x4a\\x50\\x3a\\x8d\\x49\\x13\\x44\\xcd\\xb2\\xaf\\xf4\\xc4\\x1a\\xa8\\xe2\\xed\\x66\\xe5\\x80\\x83\\xbf\\x0d\\x2f\\xbf\\x48\\x77\\xc8\\x5a\\x4b\\xcd\\x6b\\x9c\\xbb\\x82\\x12\\x42\\xc9\\x41\\x47\\xe5\\xfd\\x8b\\x7d\\xd7\\x92\\xad\\x0a\\x28\\xd4\\x9d\\x41\\x10\\x0b\\x43\\x1b\\xb4\\xd8\\xc7\\x83\\x3d\\x85\\x05\\xdd\\x9e\\x26\\x49\\xf9\\xca\\x70\\x51\\xbe\\x68\\x71\\x2e\\xf3\\x63\\x71\\x02\\x03\\x6b\\x00\\x26\\x49\\x47\\x3c\\xe2\\x59\\x67\\x7d\\x82\\xc6\\x06\\x28\\x95\\xe1\\x61\\x92\\x8b\\x75\\x2f\\x13\\xc9\\x1a\\x45\\x95\\x5e\\x80\\xf0\\x07\\xde\\x69\\x0e\\xdf\\x8a\\x0e\\x5e\\xee\\x44\\x22\\xe1\\x62\\xb9\\xd2\\xb4\\xa9\\x21\\xd3\\xa6\\x48\\x45\\x79\\x3a\\xa2\\x22\\x9e\\x9c\\x23\\x9e\\x57\\xa6\\xb1\\xa9\\x0a\\x52\\x54\\xc3\\x51\\x2f\\x99\\x34\\x53\\x15\\xac\\x7d\\x34\\x57\\xf9\\x15\\x42\\x96\\xc6\\x68\\x22\\xab\\xe1\\x84\\xd6\\x4e\\x57\\x2b\\x9c\\x38\\x49\\x29\\x58\\xe2\\x1b\\x02\\x92\\x67\\x54\\x10\\xe7\\x34\\x8b\\x2b\\x71\\x8a\\x0b\\x75\\x92\\xca\\xee\\x94\\x58\\x1a\\x94\\x8d\\x2f\\x41\\xfa\\x03\\xc6\\x1e\"},\n{{0xfb,0xd5,0x5f,0xa7,0x43,0xc3,0xa5,0x91,0x0b,0x38,0x57,0xdd,0x0b,0x6a,0xa5,0x84,0xf3,0xb2,0x38,0xde,0x05,0x6b,0x76,0xab,0x76,0x17,0xae,0xb5,0x26,0x38,0xfe,0xf6,},{0xa7,0xa1,0x63,0xc4,0x18,0x3b,0xd8,0x4b,0x75,0x6d,0xf3,0xc8,0xaf,0xdf,0xb9,0xcd,0x5b,0x24,0x23,0x52,0xd9,0x49,0x9e,0xbd,0xab,0x90,0x78,0x5c,0x3b,0xd6,0xdb,0x2d,},{0xef,0xfb,0x29,0xda,0x69,0x85,0x97,0x1c,0x20,0x2e,0x24,0x50,0x30,0x1d,0x49,0x71,0x1b,0xed,0x25,0xfa,0xd8,0x5f,0x61,0x99,0xd1,0xeb,0x1e,0x71,0x91,0x4d,0x96,0x4c,0xbe,0x18,0xe3,0x4c,0xc3,0xe3,0x28,0x72,0xcd,0xec,0x02,0x6b,0xd1,0x19,0xa4,0x1c,0x1c,0x07,0xca,0x41,0xe8,0x2a,0xcb,0xa6,0x2f,0xb0,0xa7,0xc8,0x2a,0xed,0x80,0x0c,},\"\\xbf\\x52\\x52\\xb2\\xae\\xca\\x11\\x63\\x77\\x1f\\x76\\x62\\x78\\x76\\x80\\x66\\xf2\\x19\\x71\\x35\\x7e\\xa7\\x99\\x61\\x58\\xa8\\xd6\\xe9\\x08\\xdd\\x59\\xb5\\x99\\x71\\x34\\x9f\\xa1\\x78\\x82\\xcb\\x92\\x24\\xb9\\x72\\xd0\\xff\\xab\\xe8\\x55\\x10\\xdc\\xf2\\x5a\\x9f\\x9f\\x9b\\xde\\xfa\\xd2\\xf4\\xca\\xdf\\xbb\\xda\\xcc\\x1f\\xca\\x9d\\x94\\x8c\\xb5\\x41\\x2f\\x47\\x4c\\xad\\x23\\xb5\\xb9\\x19\\x9b\\xf3\\xc7\\x37\\x06\\x41\\x33\\x9b\\x75\\x0e\\x1f\\x78\\xc2\\xad\\xb4\\x60\\xaa\\x5b\\x21\\xb1\\xfa\\x8f\\x97\\x71\\x4a\\xbb\\x4e\\xd5\\xe9\\xcb\\x51\\xd6\\xde\\x55\\x81\\x66\\x18\\xab\\xd3\\xfd\\x2b\\x28\\x6b\\xc1\\x1c\\x67\\xba\\x01\\x12\\x93\\x73\\xd4\\x35\\xb3\\xe7\\xe3\\x91\\xba\\x37\\x26\\x14\\xda\\x83\\x22\\x87\\x5e\\x46\\xa6\\x75\\xb6\\x45\\x15\\x60\\x24\\xca\\xd2\\xdd\\x13\\xf9\\xa0\\x81\\x61\\x6b\\xf1\\x31\\xa2\\x43\\x58\\x89\\x4e\\x0e\\xfa\\x1d\\x56\\x64\\x8f\\xfb\\x42\\xef\\xb5\\x40\\x31\\xda\\x7f\\x37\\xd1\\x97\\x61\\x51\\x55\\xae\\xdb\\x69\\xc4\\xe7\\x09\\xc8\\xbb\\xbe\\x7f\\xbf\\xcb\\x59\\x83\\x47\\xac\\x5d\\x0c\\x63\\x84\\x07\\x84\\x7b\\x28\\x1c\\xf1\\x16\\x43\\x30\\x97\\xf5\\x66\\x21\\x58\\x71\\x9f\\xcd\\xd3\\x7b\\xeb\\x48\\x92\\x68\\xce\\x71\\xde\\x7d\\x70\\xed\\x92\\x5f\\x74\\x3f\\xc6\\x3a\\x71\\x5f\\x7e\\xee\\x75\\x49\\xfd\\xb9\\x09\\xcc\\x45\\x4c\\x98\\x8b\\x30\\xae\\x4d\\x77\\xd6\\x2f\\x65\\xa0\\x7e\\x2c\\x8f\\x93\\x62\\x38\\x5d\\x02\\x8a\\x60\\x31\\x08\\xc9\\x45\\x87\\x2f\\x5e\\x1a\\x97\\x41\\x98\\x78\\xed\\x49\\x54\\x2e\\x28\\x8e\\xf0\\x7b\\x5c\\x90\\xf5\\xc4\\x15\\x9e\\x16\\x23\\x03\\xd0\\x80\\xf6\\xac\\x2b\\x05\\x8d\\xdc\\xac\\x60\\x74\\x6f\\x9e\\x1c\\x9e\\xc1\\xdf\\x8e\\xda\\x42\\xd6\\x27\\x38\\x58\\x6d\\x3f\\xdd\\x65\\xdf\\x55\\xf4\\x37\\x4f\\x32\\x94\\xe0\\x86\\x8d\\x41\\xef\\x0b\\xb1\\xfd\\x55\\xe0\\xcb\\xf1\\x95\\xbb\\xfc\\xfc\\xde\\x5b\\xdb\\x41\\xfa\\xd9\\xa0\\x47\\x7e\\x4c\\x90\\xca\\x27\\xfa\\x8c\\xf5\\x03\\x36\\x2a\\x33\\xfd\\xec\\xa5\\xa4\\xf0\\xff\\xea\\x26\\xe8\\xd7\\xe1\\x34\\xfa\\xd3\\xb1\\xec\\x3d\\x05\\x60\\x55\\xbb\\xa5\\xe6\\x5d\\x81\\x15\\x3e\\xe8\\x31\\x87\\x3b\\x93\\x8d\\xf7\\xd2\\xc8\\x3c\\x2a\\x52\\xb3\\xc2\\x21\\x82\\x7f\\x96\\x1b\\xd0\\x08\\x36\\x22\\x32\\xd8\\x82\\xa0\\x41\\x2a\\x04\\x7a\\xfd\\xfb\\x85\\x97\\xc8\\x65\\xa2\\xaa\\x2c\\x2c\\xf5\\x18\\x99\\x34\\xa8\\x3e\\xe6\\xb7\\x52\\xa6\\x26\\x94\\x1e\\xdc\\xe0\\xc2\\x0b\\x6f\\x7a\\x69\\xf1\\xcf\\x12\\xf9\\xa3\\x31\\xcd\\xfa\\x9e\\xda\\x24\\xc8\\xde\\xfa\\x76\\x9c\\xcc\\xe2\\xef\\x74\\x6c\\x30\\x7d\\x8b\\xb0\\x48\\x91\\xfc\\xef\\xd4\\x9a\\xf3\\xe6\\xf9\\x69\\x91\\xa7\\xa2\\x0f\\x27\\xb6\\xc0\\xaf\\x12\\x18\\xbe\\x31\\x79\\x1d\\x1d\\x02\\x93\\xe0\\x81\\xb9\\x0a\\xf3\\xb9\\x2e\\xcb\\x17\\x5e\\xc8\\xc7\\x89\\xf7\\xa8\\x64\\x2e\\x04\\x1e\\xc3\\xa6\\x1a\\xae\\xfe\\xf6\\x2a\\x80\\x7d\\x1a\\x50\\x54\\xad\\xf8\\x32\\x3b\\xed\\x94\\x22\\x41\\x62\\x37\\x32\\xa2\\x05\\x1d\\xc0\\x1f\\x9a\\x20\\xa2\\x9a\\xa4\\x8b\\x3f\\xdf\\x26\\x5d\\x0b\\xa6\\xc1\\x38\\xfb\\x57\\x93\\xe2\\x87\\x50\\x02\\xe7\\xde\\x3f\\x5c\\x3f\\xf7\\xe8\\x3a\\xd2\\x7d\\x11\\x1c\\x84\\x8b\\x7e\\x6e\\x2e\\x5a\\xd5\\xf2\\x8e\\xb7\\xc3\\x63\\xf9\\x5f\\x96\\x0c\\xbc\\x42\\x13\\x36\\xce\\x98\\x5f\\x94\\x6b\\x05\\x15\\xb1\\xbd\\xd3\\xa8\\x32\\xc3\\xfe\\x90\\x3f\\x7b\\x44\\xe2\\x0c\\x92\\xea\\x80\\x82\\x6f\\xbf\\x97\\xe2\\xa4\\xfc\\xaf\\x2d\\xb1\\xa0\\x86\\x98\\xdd\\x62\\xed\\xd0\\xa8\\x45\\x89\\xd7\\x46\\x2c\\x44\\x7b\\x4a\\x89\\x6f\\xe0\\x08\\x60\\x04\\x24\\x96\\xbd\\x51\\xb1\\x92\\x5c\\xb7\\x9c\\xc3\\xb8\\x29\\x01\\x6a\\x4c\\x7e\\x62\\x79\\x0f\\x80\\x58\\xc5\\x46\\xf2\\x14\\x5a\\xaa\\xef\\x4d\\x4b\\x1e\\x27\\x3f\\xf6\\x13\\x00\\xf8\\x00\\x8e\\x94\\x6b\\x62\\x2f\\x60\\xe5\\x05\\xf5\\xf6\\x29\\x0d\\x51\\xeb\\x99\\x7d\\x20\\xfc\\x3f\\xbb\\x3e\\x99\\xed\\xd6\\x8f\\xf5\\xcc\\xe9\\xe8\\xc2\\x83\\x88\\x1c\\x36\\x4f\\xf2\\x15\\xcb\\x50\\x04\\x5e\\x60\\xf4\\xa7\\xee\\x45\\xb6\\xc9\\xd8\\x64\\x47\\xf3\\x81\\x41\\xd3\\x42\\xdb\\xc5\\x30\\x8f\\x8c\\x66\\xef\\xc4\\x7f\\x7c\\x45\\xf6\\xd2\\x5e\\x65\\x64\\x30\\x9a\\x86\\x2d\\xb9\\x0f\\x4d\\xf3\\x31\\x78\\x7e\\xcd\\xd8\\x9d\\x3a\\xaa\\x46\\x05\\x3e\\x29\\xf1\\x02\\x62\\x4d\\xdf\\xe8\\x0e\\x8a\\x3f\\x99\\x28\\x7c\\xec\\x19\\xfa\\x83\\xe4\\x4d\\x55\\x7c\\x04\\x41\"},\n{{0x5d,0x66,0xce,0xb7,0xc6,0xe5,0x8c,0xac,0x91,0xe2,0x88,0x27,0x91,0x70,0xe8,0x18,0xe7,0x87,0x18,0x0c,0x6b,0x42,0xdf,0xa1,0x68,0x78,0x7d,0xd0,0x7f,0x80,0x9f,0xa4,},{0xef,0xc9,0xb3,0x5d,0xb8,0x1f,0x34,0x61,0x98,0xa7,0xac,0xc6,0x9f,0x65,0xfd,0xfb,0xf4,0xc2,0x2e,0x68,0xdd,0x76,0x12,0xe3,0xb8,0xec,0x68,0xd3,0x78,0x55,0x3b,0x8d,},{0x6e,0xf2,0x64,0xab,0xf8,0xb0,0xe5,0xc2,0xd7,0x93,0xb2,0xc7,0x52,0x79,0x61,0x4a,0x39,0xc7,0x75,0xeb,0x2b,0xcc,0x08,0x91,0x06,0x7a,0xbc,0x61,0xf6,0xd6,0x44,0xa6,0x9f,0xf8,0xf8,0x14,0xa3,0x05,0x22,0xcc,0xa9,0x05,0x36,0xf0,0x12,0xc6,0x28,0x3a,0x76,0xc3,0x2b,0x89,0xee,0xe1,0xbd,0x9a,0x43,0x36,0xf4,0xfd,0xda,0xc8,0xdc,0x0b,},\"\\x94\\xd7\\x2f\\x6d\\xec\\x4f\\x7c\\x92\\x06\\xb4\\x15\\x10\\xce\\x71\\xa0\\x29\\x55\\x60\\x4f\\x3c\\x5d\\xe8\\xe4\\x47\\xd5\\x87\\x18\\x65\\xa7\\x58\\x98\\xa4\\xd2\\x07\\xa2\\x6c\\xf3\\x3d\\x10\\xca\\xf0\\x5a\\x0b\\x6e\\xd0\\xd3\\x89\\xfe\\xe9\\xed\\x49\\x27\\x50\\x98\\xa8\\x8e\\x1c\\x0d\\x83\\x04\\xe8\\x1b\\x40\\x74\\x21\\x4c\\x7a\\x5c\\xe1\\x57\\xeb\\x26\\x17\\xef\\x04\\xe1\\x32\\x4b\\xa9\\x42\\x12\\x9f\\xaf\\x32\\xc3\\x1c\\xb4\\xaa\\xe4\\xa5\\x91\\x6c\\x75\\x08\\x08\\x72\\x68\\x56\\xf7\\x18\\x0e\\x57\\x97\\xed\\xe4\\x43\\x62\\xd7\\x47\\xd7\\x0c\\xec\\x15\\x9d\\x3b\\x6a\\xce\\xc6\\x3a\\x51\\x4c\\x7e\\xf3\\x1b\\x2e\\xcd\\x16\\xdb\\x7f\\xe6\\x8e\\xa9\\xc5\\xea\\xd9\\xd8\\x70\\x92\\x18\\x00\\x34\\x8f\\x69\\x54\\x12\\xf3\\x09\\x3e\\x61\\x98\\x5a\\x31\\xea\\xdb\\x79\\xb5\\x9d\\x91\\xdd\\x9a\\x37\\xf8\\xd4\\xef\\x7a\\x5d\\xdf\\x22\\x3d\\x4b\\x24\\x77\\x4c\\x2e\\x44\\xe3\\xf2\\x71\\xff\\xb8\\x50\\x0d\\x59\\x53\\x81\\xb3\\xdf\\x2e\\x8e\\x6b\\x79\\xee\\x65\\x53\\x5a\\x51\\x9a\\x43\\xea\\xa5\\xe5\\x2b\\x25\\x6c\\x26\\x43\\x30\\x5e\\x31\\x70\\xcb\\xe5\\x76\\x06\\xa0\\x54\\x5f\\x85\\x86\\x56\\x5c\\xfb\\x75\\xbf\\x5e\\x95\\x64\\xc6\\x2a\\xf0\\x5f\\x15\\xee\\x6e\\x62\\xaf\\xee\\xf8\\xc2\\xc7\\xa9\\xda\\xe2\\x35\\xc9\\xed\\xd1\\xd7\\xc2\\x5c\\xf4\\x9a\\xdc\\x03\\x3e\\xe7\\xb5\\x83\\xf5\\x18\\xbc\\x16\\x8e\\xa4\\x88\\x36\\xb5\\x0f\\xfe\\xdd\\x20\\x32\\xb3\\xf6\\x30\\xcc\\x56\\xda\\xad\\xd5\\x13\\xeb\\xda\\x86\\x48\\x23\\x61\\x0f\\xc6\\x7a\\x72\\xb9\\xa7\\xd8\\x11\\x71\\x05\\xc1\\xc7\\x1d\\x85\\xa9\\x6b\\x1d\\x27\\xa4\\x41\\xfa\\x1e\\x7c\\x6c\\xf8\\x02\\x33\\xa4\\x9f\\xe0\\xe7\\x6a\\x40\\x27\\x8d\\x06\\xe3\\x43\\x47\\xd8\\x7b\\xe7\\x7b\\x98\\xde\\xd5\\xe2\\xa3\\xea\\x1a\\xfb\\x13\\xbe\\xe1\\xe6\\xcd\\x6c\\xa6\\x3b\\xe5\\x4f\\xcf\\x88\\xa2\\x0c\\xcb\\x7a\\x9f\\xc3\\x24\\xbf\\x61\\x43\\x20\\x1b\\x44\\x48\\x3b\\xcc\\x96\\x40\\x33\\xda\\xb7\\x1c\\xf8\\xf2\\xa5\\x91\\xfc\\x05\\x0d\\x57\\x24\\xe9\\x5a\\xa5\\x0d\\x32\\x89\\x6e\\xec\\x0f\\x3b\\x34\\x31\\x1d\\x2a\\x99\\x34\\xe9\\xf8\\x52\\x97\\x7e\\x25\\x3f\\x15\\x30\\x4c\\xae\\x24\\x16\\xc2\\xc4\\xfc\\xd8\\xf1\\xfe\\xcc\\x3f\\x1f\\x64\\xbb\\x79\\x75\\x99\\x29\\xab\\xb0\\xe8\\xe8\\xf5\\xf7\\x29\\x3d\\x69\\x1a\\xf2\\x2a\\xbd\\x3b\\x2a\\x67\\x70\\xb0\\xcf\\x14\\x46\\x08\\xf2\\xd6\\x2c\\xc7\\xe5\\x2b\\xfe\\x33\\x3b\\x2e\\xd2\\xde\\x39\\xb9\\x9a\\xfd\\x37\\xe3\\xac\\xf0\\x7e\\xda\\x37\\xdd\\xf0\\xdf\\x02\\x9b\\xff\\x2e\\xc2\\x25\\x44\\xb6\\x0b\\xd7\\xdb\\x23\\x8d\\xf1\\x97\\x5f\\xfa\\x00\\x75\\xa8\\x2a\\xbd\\x8d\\x6b\\x05\\xb2\\x67\\x18\\x0b\\x87\\x0e\\x21\\xab\\xf3\\x69\\x81\\xae\\x77\\x68\\xde\\x53\\x99\\x3b\\x30\\x4f\\x1c\\x54\\x53\\x87\\x2f\\xdf\\xa8\\xed\\xad\\x45\\xf8\\x00\\x1a\\xa0\\xe7\\x34\\x2b\\x3b\\x58\\xec\\x0f\\x38\\x9d\\xcb\\xc2\\x71\\xfb\\x0f\\x90\\x00\\x62\\x87\\x57\\xab\\xba\\x58\\xc0\\x57\\xe1\\xa0\\x89\\x9f\\x6f\\xaf\\x15\\xf3\\x74\\x0f\\x31\\x43\\xf5\\xc0\\xb7\\xa9\\x15\\x96\\x80\\xde\\x8c\\x55\\x72\\x66\\x44\\x1b\\x3b\\x01\\xca\\xac\\x12\\xec\\x27\\x8f\\x5a\\x10\\x25\\xdf\\x53\\xed\\xb6\\x13\\x4c\\x96\\x66\\x3a\\x96\\x66\\xae\\x3b\\xaa\\x90\\xfc\\x83\\x51\\x11\\xef\\x05\\x1b\\xd9\\x12\\xf6\\x79\\x67\\x44\\x91\\x13\\xb6\\xa8\\x5f\\x71\\xdf\\x8c\\x60\\x37\\x72\\x4e\\xb8\\xfc\\x7d\\x83\\x19\\xbc\\x03\\x85\\xbe\\x9b\\x0e\\x99\\xe9\\x5f\\x9a\\xed\\xca\\xe8\\xd4\\x5a\\x51\\x44\\x76\\xf0\\x5b\\xcd\\x72\\x35\\xc0\\x13\\xeb\\xc3\\xae\\xa9\\x12\\x3c\\x67\\xaa\\x6f\\x3b\\x79\\xc8\\x5e\\xa5\\xdb\\x15\\x9e\\xef\\xad\\xfb\\x75\\xa5\\x0a\\xc6\\xb9\\x5b\\x49\\x6b\\x55\\x72\\x58\\x1a\\x76\\x11\\x2f\\xf6\\xdb\\x26\\x3f\\xc1\\x4c\\x58\\x18\\xaa\\xd5\\xbc\\xa3\\xb2\\xcb\\x3a\\xc8\\x11\\x6d\\x42\\x94\\x82\\x78\\x1e\\x06\\xf6\\x1e\\x75\\x63\\xe6\\x50\\x5e\\x51\\xc8\\xff\\x99\\x8b\\xf8\\x4a\\xed\\xb5\\x20\\x2e\\x2f\\x9f\\xf4\\xc2\\x68\\x98\\x20\\x29\\x6c\\xc6\\x96\\x03\\x09\\x1b\\x8b\\x81\\x8f\\xbe\\xb2\\xaf\\x5f\\x4c\\x57\\x06\\x0d\\x98\\xc1\\xa9\\x04\\x84\\x3a\\x70\\xbf\\x97\\x5b\\x3c\\x3c\\xa6\\x03\\x1a\\x4c\\xad\\x5b\\x4b\\xbf\\xba\\x7e\\x9b\\x47\\x49\\x1a\\xb7\\x40\\xd9\\xeb\\xe4\\x1d\\x76\\x88\\x10\\xcb\\x8c\\xc5\\x1a\\x93\\x7f\\x7e\\x3b\\x22\\xe3\\xcf\\x07\\xce\\xae\\x0c\\xe2\\x08\\x31\\x49\\x5a\\xfc\\xdd\\x8c\\x1a\\x98\"},\n{{0x62,0xed,0x86,0x82,0xbd,0x3a,0xb3,0x96,0x6e,0xba,0x3b,0xff,0xb7,0x75,0xa3,0x18,0xa0,0x3d,0x99,0x93,0x19,0x79,0xe9,0x9f,0xeb,0x2d,0xdb,0xd6,0x94,0x55,0xa0,0xef,},{0xd3,0x2a,0xda,0x17,0x8b,0x3e,0xc7,0x70,0x0c,0x47,0xdd,0x6d,0x36,0x53,0x22,0x03,0x3f,0xe4,0x31,0xc3,0x02,0xb4,0x6f,0x8d,0x58,0x79,0x8e,0xd8,0x33,0x71,0x56,0x6b,},{0x3d,0xa8,0xd1,0x4d,0xc4,0xe7,0x1f,0xe6,0xc3,0x2e,0xde,0x46,0x37,0x88,0xe4,0x1b,0x82,0x6b,0x4e,0x21,0x60,0xba,0x10,0xc9,0x5f,0x1c,0x8a,0x27,0x49,0xaa,0xd8,0xf1,0x2e,0x98,0xae,0x24,0x68,0x30,0x3b,0xaf,0x69,0x08,0xbd,0xb3,0x5e,0xf3,0x8a,0x5e,0xcd,0x77,0x74,0x1e,0x72,0xee,0x3a,0x42,0x7f,0xd9,0x04,0xda,0xe6,0x6f,0xcf,0x03,},\"\\x9e\\xb1\\x3b\\xc7\\xfa\\xcf\\x51\\xa1\\x80\\x54\\x1e\\xc1\\xdc\\x5f\\x5a\\xcb\\x14\\x8c\\x8d\\x5e\\xad\\xcd\\x2c\\x4e\\xf0\\x68\\xbc\\xdd\\x11\\xb3\\x49\\x25\\xea\\xbf\\xaf\\xab\\xfe\\x82\\xa2\\x84\\xbc\\xba\\xee\\x13\\x81\\x15\\x2a\\xf8\\xe5\\xe0\\x9f\\x03\\x7c\\xf1\\xbb\\x64\\x84\\xac\\x18\\xe3\\x73\\x59\\xbf\\xaa\\x4c\\x87\\xaa\\x07\\xd3\\xd1\\x4e\\xd0\\x89\\xb0\\x53\\x91\\x0d\\x1f\\xa4\\x73\\xf7\\xbc\\xe1\\x43\\xe2\\xa5\\x9c\\x4d\\xaf\\x99\\xb6\\xc6\\xe4\\xe9\\x29\\x1d\\x97\\xc8\\x64\\x71\\x2a\\xf3\\xea\\xba\\x53\\xce\\x25\\x17\\xa4\\xf7\\x5c\\xd7\\xec\\xf2\\x78\\xf3\\x4e\\x22\\xb7\\xdf\\xfd\\x08\\x8f\\xa5\\xec\\xad\\xc0\\xdd\\x22\\x13\\x5e\\x42\\xa5\\x36\\xc6\\x84\\xf2\\x19\\x5d\\x31\\x5f\\x69\\x24\\x57\\x1e\\x46\\x3f\\x5c\\xfc\\x11\\xb9\\xf9\\xd0\\x5a\\x7e\\xa1\\x1b\\x98\\xa1\\x69\\xa1\\xe3\\x93\\x60\\x97\\x3c\\x50\\xad\\x45\\xc7\\x49\\x1b\\x57\\x13\\x8e\\xc0\\x50\\xf4\\x3c\\xbd\\x5d\\x17\\xeb\\x3f\\xe0\\x01\\x3e\\x3d\\x28\\xd5\\x26\\x05\\x4e\\x07\\x63\\x31\\x52\\x24\\x6f\\x16\\x55\\x4f\\x30\\x54\\x74\\x9e\\xea\\x68\\x7b\\x9c\\x37\\x1b\\x40\\x9c\\xd3\\xec\\xef\\xb1\\x11\\xa1\\xd6\\x00\\x40\\x73\\x44\\xe6\\xd6\\xec\\x38\\xc6\\x0f\\x6e\\x54\\x5a\\x92\\x38\\x2e\\x46\\xc4\\xd1\\x13\\x12\\x5d\\xbe\\x5b\\x98\\x26\\xe1\\x27\\xf1\\x01\\x81\\xa3\\x5a\\xcf\\xff\\x28\\xab\\x37\\x64\\xca\\x7f\\x23\\x8f\\xf4\\x79\\xfd\\xbc\\x45\\xb7\\xa2\\xad\\x0f\\xf5\\x38\\xc8\\xac\\xd0\\x01\\x8d\\x44\\x70\\xfe\\xbc\\xc6\\xa3\\x07\\x65\\x1c\\xb5\\x83\\x2f\\x32\\x6b\\x19\\x24\\x1b\\xe9\\x86\\x7e\\x4e\\xca\\x6a\\xe3\\x6f\\x0e\\x2d\\x83\\xfd\\x77\\xb9\\x72\\x02\\xb3\\x64\\x71\\x6e\\x36\\xd1\\x89\\x5a\\x36\\x85\\x3e\\x7e\\x76\\xe8\\x8f\\x62\\xdb\\xbf\\x77\\x26\\xc2\\x18\\x05\\x69\\xc6\\x66\\x73\\x83\\x7a\\xd7\\x2f\\xf9\\x36\\xcf\\x0e\\x2f\\xdb\\x9e\\xc6\\xaf\\xcc\\x79\\xf8\\x82\\x9e\\x15\\x7f\\x95\\x22\\x88\\xf4\\xe0\\x0d\\x04\\x10\\xa7\\x22\\x53\\xbf\\x60\\x5e\\xdd\\xce\\xb0\\x14\\x40\\xde\\xe5\\xdd\\x32\\xb5\\xa8\\x03\\x43\\x9f\\x03\\x8c\\x06\\xaf\\x1c\\x90\\xb2\\x7b\\x5f\\xe9\\x84\\x3c\\x27\\xae\\x76\\x60\\x9c\\xbf\\x83\\x28\\x35\\xc0\\xe3\\xc4\\xbb\\x59\\x97\\x6c\\xce\\xde\\x44\\x87\\x86\\xd9\\x1e\\x43\\x8e\\x07\\x75\\xc0\\x6a\\x92\\xd0\\xf0\\xb8\\xdc\\x0e\\xf6\\x82\\x60\\xf7\\xdd\\x9e\\x68\\x71\\xc4\\xd0\\xc0\\xc0\\x94\\x63\\x85\\x26\\x15\\x21\\x85\\x16\\xf4\\xa6\\xde\\xbf\\xdb\\x46\\x27\\x3b\\x28\\x33\\x82\\xcd\\x9c\\xa7\\x44\\xab\\xf9\\xfd\\x43\\x91\\x94\\xb8\\xcf\\x1b\\xdb\\xb3\\x17\\x5c\\xa9\\xc5\\x7a\\x1c\\x37\\x3c\\x41\\xfc\\xe9\\x2b\\xd5\\xfc\\x01\\x2b\\x19\\xa0\\x69\\x8a\\xef\\x37\\xba\\xf8\\x06\\xae\\x09\\xad\\xd8\\xcb\\x97\\x2a\\x9e\\xf9\\xa7\\xa5\\xa9\\xb1\\xfd\\x9a\\x41\\xd8\\x54\\xc3\\x0c\\xca\\x13\\x96\\x14\\x0e\\x20\\xc2\\xb9\\x86\\x54\\xfe\\x6e\\x51\\x1b\\x62\\x6a\\x43\\x91\\x5b\\x22\\xfb\\x2d\\xad\\x74\\x7b\\xa7\\xfe\\x74\\x60\\xd8\\xce\\xbb\\x20\\x06\\xfe\\xa1\\x9b\\x32\\x84\\xb0\\x9c\\x06\\xa6\\xf5\\x2f\\x17\\x9a\\x32\\xbe\\xb5\\x63\\x57\\xb9\\x29\\xa6\\x59\\xf0\\xfe\\x6a\\x26\\xb6\\x97\\x03\\x3d\\xef\\x58\\xba\\x60\\x3f\\x43\\x0f\\x74\\xaa\\x35\\x07\\x09\\x81\\xdb\\x74\\xcc\\xf1\\x91\\x90\\xa1\\xfb\\x05\\x14\\x4e\\xc0\\xa0\\x9a\\x51\\xe5\\x47\\x65\\x06\\x97\\x30\\xb0\\x9a\\x7a\\x23\\x31\\xff\\xb3\\xde\\x2a\\x7e\\x02\\xc5\\xe1\\x84\\xda\\x40\\x13\\xdf\\xe9\\x37\\xc3\\x71\\x11\\x75\\x24\\xf7\\xb2\\x10\\xba\\x60\\xe2\\x69\\x2d\\xcd\\xce\\xf3\\x6a\\xb2\\x27\\xb4\\xc4\\xf0\\x2a\\x9f\\x48\\x89\\x72\\xb8\\x47\\xf0\\xd6\\xb5\\x9d\\x02\\xee\\x54\\xfe\\xde\\x88\\x21\\xdb\\x6c\\xf7\\x31\\xcc\\x8a\\xc8\\x95\\x35\\x0a\\xc5\\xcd\\x4d\\x6b\\xaa\\x3a\\xd0\\x36\\xf0\\x6f\\x20\\xd1\\x0a\\x14\\x0c\\x4a\\xd3\\xd1\\x0c\\xa9\\x85\\x53\\x2e\\x31\\x60\\x46\\x27\\x73\\x38\\x5a\\x2e\\xb5\\xe4\\x64\\xd5\\x28\\xe1\\xe5\\x9c\\x29\\xf6\\x6b\\x3d\\xe5\\x9e\\x9e\\xa2\\x8a\\xf3\\xf9\\x7b\\xfc\\x55\\x89\\x03\\x57\\x52\\xa5\\xa5\\x52\\x3d\\xec\\xd2\\xdf\\xf0\\x1f\\xc0\\x0f\\xf3\\x1b\\x30\\x15\\x2f\\xf5\\xda\\xfa\\x33\\x1c\\x6a\\xb1\\x58\\x73\\xaf\\x41\\xaa\\x96\\x0a\\xac\\xe7\\xd2\\xcb\\x4f\\x95\\xc2\\x3d\\xf4\\x4b\\x9e\\x6c\\x6e\\x2f\\x86\\x78\\x8a\\x87\\x2f\\xd3\\xa5\\xcb\\xe4\\xac\\xc9\\x58\\x10\\xda\\xa0\\x9d\\xcc\\x1d\\xf9\\x33\\x46\\x5e\\xf0\\x40\\xc5\\x3d\\x9d\\x95\\x9f\\x9d\\xad\"},\n{{0x4e,0x57,0xf0,0x31,0x1f,0xff,0x0e,0x5d,0x53,0x88,0x49,0xb1,0x21,0x6f,0x69,0x5b,0x1a,0x52,0x77,0x94,0x17,0x08,0x20,0x4d,0xb2,0xf0,0xc1,0x5b,0x3c,0x73,0xc8,0x2a,},{0xe3,0x37,0x1f,0xe2,0x36,0xad,0x2f,0x6f,0x42,0xf9,0xe1,0xfa,0x4e,0x1e,0xda,0x2c,0x3e,0x29,0xc3,0x6c,0x8a,0xd2,0x21,0x8a,0x3c,0x03,0x79,0x82,0xf0,0xb5,0x79,0xec,},{0x4f,0xdc,0x7b,0x6e,0x28,0x27,0xf6,0x4b,0xa3,0xc0,0x33,0xc7,0xfb,0x6d,0x1b,0x35,0xdd,0x68,0x0f,0x53,0x29,0x99,0xa0,0xd7,0x7a,0xeb,0x27,0x6c,0x31,0xbd,0x9e,0x39,0xc6,0x70,0x97,0x8b,0xe4,0x72,0x43,0xc1,0x13,0x22,0x3a,0x57,0xaa,0x10,0x23,0x31,0x50,0x67,0x8b,0x40,0xdb,0x78,0x59,0x1c,0x04,0xd0,0x8d,0xf5,0x7a,0x70,0xa2,0x09,},\"\\x05\\x2a\\x1f\\x41\\xeb\\xfd\\x4b\\xf6\\x5e\\xfb\\x0e\\xc8\\xe7\\x4d\\xd7\\xb3\\x06\\x5e\\x9c\\x48\\x2c\\x49\\xb9\\x92\\x62\\xe6\\xdf\\xa8\\x40\\x7d\\x9e\\x31\\xed\\x34\\xd2\\x29\\xba\\x41\\xfc\\x49\\xa9\\x4a\\x13\\x09\\xf9\\x90\\xa9\\x9c\\xb9\\x90\\x2f\\xb8\\x4f\\x4e\\xde\\x91\\xbb\\x64\\x71\\x45\\x64\\xa9\\x13\\xd5\\x74\\xd4\\xa3\\xc2\\x86\\xf0\\xa1\\x92\\xa7\\x8c\\xe2\\xd5\\x5a\\xae\\x5c\\x9f\\xb0\\x57\\xff\\x36\\x12\\x00\\x18\\xb2\\xa8\\xb5\\x4d\\x98\\x08\\x55\\x37\\xea\\x64\\xae\\xa9\\x99\\xd5\\x32\\x1c\\x78\\x80\\xb3\\x6a\\xb4\\x30\\x18\\xea\\x2c\\x92\\xa5\\xe6\\x83\\x50\\xd3\\xde\\x85\\x26\\xe2\\xc8\\xbc\\x91\\x41\\xf4\\x34\\x9a\\x18\\xa3\\x4f\\x21\\xde\\x0a\\xbb\\xf2\\x93\\x09\\x87\\x56\\x7f\\x0a\\xaf\\x8e\\xb1\\x91\\x45\\x58\\x0d\\x71\\x30\\x6c\\xe8\\xa6\\x9e\\x79\\xf8\\xee\\xa2\\x6c\\xfa\\x0b\\x8b\\xeb\\x49\\xcc\\x5a\\xa2\\xbc\\x77\\xb7\\x97\\xd4\\xf8\\xd5\\x03\\x26\\xff\\xb9\\x37\\x39\\x9e\\x94\\xfd\\xec\\x85\\xe1\\x92\\xf1\\x27\\x2a\\x80\\xe9\\xa0\\xeb\\xba\\xf5\\xd0\\x1f\\x1b\\x97\\x06\\x08\\x02\\xbd\\x4a\\xf3\\x4c\\x0f\\x7d\\x7e\\x98\\x54\\x3f\\x9d\\x66\\xd6\\x0e\\x0e\\x6b\\xc0\\xbf\\x9c\\x99\\x0b\\xe3\\x1e\\xea\\x19\\x78\\xff\\xd1\\x67\\x33\\xa8\\xab\\xe4\\x95\\x58\\xb3\\xad\\xd0\\xdc\\xe6\\xde\\xfd\\x64\\xdc\\x04\\x3f\\x15\\x19\\xb1\\xe9\\xbe\\x66\\xe0\\x6e\\x41\\xec\\xab\\x16\\x8c\\x83\\x39\\xa8\\x5e\\x0b\\x91\\x38\\x18\\x64\\x4e\\xa7\\xc5\\x33\\x44\\x68\\xfd\\x71\\x96\\xa0\\x1e\\x1d\\x4c\\xe8\\xdd\\x1e\\x7e\\xe3\\x13\\xdd\\x53\\x50\\xb8\\xdc\\xe4\\xf5\\xd7\\xa6\\xac\\x09\\x85\\x7c\\x4d\\x3d\\x0f\\x10\\xa3\\xd9\\x06\\x26\\x09\\x75\\x45\\x92\\xad\\x10\\x77\\xb2\\xe2\\x09\\x6f\\xc9\\xe5\\xb1\\x97\\x8c\\x98\\xb5\\x66\\x0d\\xdf\\x51\\xb4\\x6e\\xde\\x9f\\x9d\\xcd\\x41\\xb2\\xef\\x44\\xe7\\x9f\\x6d\\xaf\\xf7\\xd3\\x62\\x68\\x70\\xe2\\x24\\x3c\\xaf\\xb2\\xf4\\x36\\x79\\x39\\x10\\x9e\\xd9\\xc0\\x14\\x84\\xb7\\x9e\\xaa\\x30\\xa1\\x89\\x1e\\xa1\\x8f\\x98\\x4e\\x16\\x1d\\xcd\\xd1\\xbd\\xa3\\x71\\x34\\xbf\\x67\\x35\\xd2\\xb2\\x14\\x9b\\x48\\x98\\xda\\xcb\\xfd\\xa6\\x1e\\x60\\x02\\xd7\\x2a\\x6f\\xc5\\xd2\\x1f\\x10\\x98\\x21\\x32\\x31\\x13\\x2d\\x56\\xdf\\x68\\xd6\\xa9\\xbf\\xdf\\x4e\\xdd\\xc0\\x52\\x4d\\xb8\\xfd\\x8f\\x24\\x88\\x52\\x04\\x9a\\x68\\x25\\xa5\\xed\\xd2\\x36\\x0c\\x00\\x9a\\xf2\\x4f\\x0a\\x94\\xc5\\x07\\x9d\\xdf\\x6f\\xe7\\x96\\x94\\x5f\\xf9\\x84\\xaa\\xc3\\x64\\x11\\xce\\x80\\xd9\\x87\\xc6\\xed\\x67\\xb6\\xb0\\xdd\\xb6\\xd4\\x17\\xf6\\xe8\\x09\\x99\\x1e\\x72\\x9d\\x14\\x7d\\xd0\\xd2\\x1a\\x09\\x32\\x41\\x36\\x3c\\xf4\\xef\\x3b\\x8e\\x3b\\xa0\\x2d\\x48\\x66\\x33\\xb6\\xb2\\x17\\xf5\\x49\\x3e\\x2e\\x43\\x2b\\x8c\\x2e\\x27\\xd0\\x0c\\x5b\\x56\\xc9\\xb6\\x5f\\x9a\\xed\\x49\\xce\\x93\\xd7\\x7e\\x7d\\x0b\\xf5\\xf9\\x2f\\x92\\xf5\\xbb\\x4b\\x59\\x5d\\x66\\xf8\\x87\\xa4\\x88\\x01\\x33\\xf9\\x70\\x46\\x3a\\xb8\\xb7\\xf3\\xd8\\xc7\\x94\\xc0\\x40\\x6e\\x88\\xe3\\xea\\xb9\\xae\\x65\\xf1\\xa1\\x85\\xd6\\xe3\\x9e\\x2d\\xd6\\xab\\xb8\\xa9\\x3d\\x2a\\xc4\\xb9\\x20\\x83\\x98\\xda\\xb8\\x9d\\xbc\\x07\\xa4\\x1a\\x50\\x26\\x40\\x26\\x41\\x2d\\xa0\\x22\\xb5\\x8f\\x48\\x9d\\x4d\\xba\\x31\\xfb\\x88\\x2f\\xec\\xb1\\xff\\x8c\\xa1\\x82\\x0d\\xda\\x18\\x65\\xaf\\x15\\x51\\xe4\\x6c\\xd6\\x18\\xb4\\x4c\\x4e\\x6e\\xb3\\x03\\x7a\\x93\\x33\\xfd\\xcc\\xef\\x4b\\x89\\x51\\x89\\xe4\\x39\\x0e\\x93\\x14\\x5d\\x26\\x4c\\xa5\\xf4\\x52\\x02\\xa3\\xeb\\x28\\x53\\x59\\x3f\\xee\\xd6\\xc6\\x6d\\xbb\\x28\\x8f\\xf3\\xa3\\xc0\\xfa\\x83\\x2b\\x2a\\xa7\\xe5\\x29\\xb5\\x56\\x88\\x97\\xb3\\x14\\x94\\x02\\xa9\\x07\\xe7\\x41\\xe1\\x01\\x1c\\xe0\\x73\\x1c\\x91\\x5f\\x91\\x44\\x6a\\xa0\\xd5\\xca\\xf0\\x59\\x5f\\x18\\x16\\x43\\x4f\\xa4\\x57\\x6d\\xb3\\xbc\\x31\\xe1\\x0c\\xc2\\xaf\\x33\\xf6\\x13\\xf0\\x3c\\xa7\\xb9\\x49\\x1a\\x0a\\x34\\x05\\x25\\x27\\x1a\\xb5\\x37\\xf6\\x2a\\x11\\xa8\\x4d\\xa0\\x1c\\x7f\\x55\\x81\\xad\\x57\\x38\\xc3\\x72\\xb5\\x33\\x5b\\xab\\x9b\\x2b\\x9d\\xc2\\xfe\\x91\\xe9\\x33\\x30\\x4d\\x94\\x01\\xba\\x8e\\x1c\\xe8\\xdc\\x55\\xc4\\xfb\\x46\\x6b\\x3a\\x8e\\xd7\\xf5\\x3a\\x12\\x2b\\x83\\x81\\xd8\\xf2\\x90\\x47\\xd7\\x26\\x4d\\x06\\xfb\\x51\\xec\\x3e\\x70\\x07\\x1f\\x27\\x36\\xa4\\xe7\\xe1\\x53\\x7a\\x52\\xfa\\x25\\x6a\\x04\\xee\\x86\\xfa\\xd2\\x7a\\xd2\\xd2\\x8a\\x9b\\x36\\x29\"},\n{{0x39,0xf0,0x55,0x6b,0x1c,0x5d,0xca,0xb3,0x87,0x10,0x41,0x81,0xbb,0x30,0x4d,0xe0,0xcf,0x81,0x59,0x20,0xb9,0x72,0xe8,0x71,0xd5,0xf0,0xfb,0x41,0x6d,0x8e,0x61,0x6a,},{0xd8,0x5f,0xb7,0x6e,0x78,0xc3,0xd5,0xbb,0x7c,0xa6,0xb0,0x5b,0x31,0x01,0x91,0x82,0x1a,0x4a,0x7d,0x2d,0x9b,0xdf,0x02,0x29,0x2c,0xc7,0xae,0xa5,0x64,0x2e,0x48,0x19,},{0x01,0x66,0xaf,0xed,0x5a,0x8f,0x7c,0x3f,0x7a,0xd6,0xf3,0xfd,0xd2,0x93,0x8e,0xff,0x00,0x89,0x8e,0xab,0x81,0x5c,0x54,0x55,0xac,0x90,0xfb,0x51,0xf6,0xe1,0x85,0x4f,0x0c,0x07,0x53,0x19,0x4b,0x76,0x29,0x59,0x4c,0xc1,0x27,0x1b,0x00,0x34,0x31,0x22,0x1c,0x57,0x4b,0x0c,0x0d,0x19,0x08,0x2f,0xee,0xda,0x51,0xb0,0x84,0xae,0x5e,0x03,},\"\\xa8\\xd0\\x34\\xe1\\x70\\xfc\\x22\\xb5\\x7a\\x44\\xaa\\x62\\x69\\xed\\x1f\\x01\\xcb\\xa8\\x01\\xf3\\x98\\xdf\\x1a\\xdf\\xe7\\xdf\\x04\\x4d\\x5f\\xa4\\x68\\xbb\\xfa\\x8a\\xf4\\x74\\x9a\\xb5\\x0d\\x24\\xd6\\x2e\\x31\\x3a\\xc0\\xe7\\x3a\\x64\\xb4\\x28\\x2b\\x74\\x62\\x6a\\xf2\\xb4\\xa4\\xb5\\x4c\\x27\\x4e\\x5a\\x6b\\xc2\\x80\\xb6\\xdc\\x25\\xdc\\xfe\\x07\\x81\\x4c\\x9c\\x81\\x6d\\x2f\\x9e\\x36\\xc0\\x5b\\x9b\\xfe\\xdf\\xf7\\xc6\\xb0\\x3c\\xdd\\xeb\\xd4\\x73\\x5e\\x09\\x93\\xd3\\xc3\\xfd\\xc6\\x54\\x04\\x43\\xc6\\x00\\x5e\\x90\\x0b\\x40\\x35\\xe1\\x40\\x8a\\x85\\x01\\x6a\\xa1\\xb8\\x92\\x02\\x99\\x0e\\x5d\\x84\\xed\\x99\\x81\\xc2\\x9b\\x77\\x20\\x6d\\x7c\\x11\\x30\\x52\\xa2\\x02\\x98\\x12\\xc6\\xea\\x13\\xaa\\xe8\\xbe\\x0a\\xca\\x7a\\x33\\x06\\xbf\\x61\\x72\\x42\\x29\\x8e\\x68\\xbe\\xcd\\x0d\\x5d\\x16\\xc8\\x88\\x7f\\xd1\\x95\\x0b\\x77\\x85\\xa4\\x6b\\xb0\\x22\\xb3\\x9f\\x76\\x07\\xcd\\x89\\x13\\x71\\x8b\\x30\\x17\\xfc\\x3f\\x86\\xd6\\x93\\x3f\\x75\\xee\\xc5\\x19\\x1a\\xd1\\xf1\\x98\\x9a\\x8d\\x26\\x17\\x86\\xf5\\x6b\\xe4\\xa9\\x88\\x37\\x0d\\xb8\\x29\\x61\\xa9\\xfc\\xc9\\x53\\x54\\x2e\\x51\\xc2\\xe0\\x86\\xdb\\x0e\\x02\\xb4\\xfc\\x34\\x66\\x94\\xab\\xd9\\x05\\x9d\\x5b\\x11\\x72\\x26\\x47\\x66\\x9e\\x7f\\x17\\xb7\\x45\\xa6\\x0b\\x02\\xf7\\x33\\x9f\\xcc\\x99\\xbc\\x35\\xd5\\x9f\\xd0\\xb9\\x8b\\x60\\xc3\\x14\\xab\\xd4\\xbf\\x8a\\xa4\\xb7\\xea\\xe0\\x9d\\xd0\\x09\\x7a\\xcb\\x91\\x89\\xf0\\x2c\\xf8\\x5a\\x25\\x1a\\xc9\\x2a\\xaf\\x69\\x1b\\x15\\xcd\\x4a\\x33\\xb5\\x8d\\x76\\x63\\xab\\xd0\\xb0\\x44\\x43\\x33\\x04\\x4a\\xf5\\xce\\x20\\xfd\\x71\\xcb\\xaf\\xfc\\x0d\\x29\\x83\\x58\\x19\\xf4\\x92\\x93\\xfc\\x26\\xe7\\xf9\\x78\\x7f\\xc3\\x68\\xc4\\xd3\\x5c\\xae\\x92\\x74\\x7f\\x21\\xca\\x1f\\x3e\\xfd\\x87\\xa0\\xd8\\x10\\x41\\x99\\x41\\x64\\x82\\xd0\\x7b\\xfe\\xc1\\x28\\x1c\\x66\\xf5\\x65\\x28\\x5b\\xf6\\x72\\xd5\\xe7\\x48\\x64\\x00\\x66\\x0c\\x01\\x75\\x55\\xe9\\xfa\\x2b\\xf6\\xa4\\xe7\\x02\\x7f\\x0e\\x7e\\x5f\\x44\\x3e\\xd6\\x58\\xb7\\x5b\\x59\\x06\\x12\\xab\\xde\\x0d\\x80\\xd1\\xa2\\x6c\\xb8\\xbd\\xe7\\x6b\\x99\\x6e\\xff\\x6a\\x74\\xe3\\xda\\xfc\\x59\\xeb\\x1b\\x58\\x4f\\x45\\x97\\xa2\\x39\\xcd\\x83\\x9f\\xa1\\xf1\\xb7\\xbd\\xa1\\xa2\\x4d\\x15\\x0c\\x4e\\x24\\xb9\\x1c\\xec\\x01\\xee\\x53\\xa3\\xac\\x85\\x2a\\x91\\x2d\\xe1\\x95\\xa3\\xc2\\x9d\\xd7\\x07\\x9a\\xa7\\xe8\\x8a\\xa8\\x1e\\x9d\\x31\\xb8\\xfc\\xcd\\x43\\x5e\\xda\\x11\\x3c\\x3f\\x82\\x45\\x8b\\x7f\\x79\\x33\\x57\\x2b\\x77\\x67\\x53\\xc9\\x22\\x40\\xcc\\x03\\x61\\x58\\xa4\\xba\\x0e\\x56\\xef\\xed\\x53\\xec\\xb5\\x3f\\xc0\\x93\\xfe\\xad\\x14\\x34\\x34\\x85\\xae\\x5d\\x91\\x05\\xbb\\x16\\x3f\\x26\\x25\\x14\\xe4\\x8b\\xe7\\x41\\x59\\xc9\\xfa\\xbc\\xb7\\x1d\\x1a\\x42\\x80\\xd9\\xed\\x70\\xd7\\xe4\\x2b\\x75\\xf7\\xfd\\xad\\xd0\\x2d\\x69\\x19\\x8f\\x5f\\x46\\x5b\\xf6\\x04\\xcb\\x42\\x54\\x41\\x7b\\xac\\x37\\x14\\xb3\\xa9\\x9e\\x6f\\x1a\\xce\\xc9\\xe3\\xb3\\xd0\\x97\\xf9\\x72\\xfb\\xc3\\x6f\\x2e\\xda\\x39\\x26\\xd5\\x61\\x12\\xd4\\xe9\\x09\\x7d\\x89\\xbd\\xc3\\x59\\x37\\xb9\\xa3\\x15\\x8e\\x7c\\xdd\\x5d\\xa4\\x01\\xe1\\x80\\xd3\\xed\\xe6\\xb1\\xff\\x02\\x86\\x41\\x92\\xeb\\x72\\x97\\x81\\x53\\x4f\\x49\\x64\\xdd\\xf2\\xaf\\x11\\x80\\x0d\\x8b\\x5b\\x6d\\x01\\xb2\\x09\\xaa\\x33\\x69\\x36\\x6c\\x19\\xa2\\x8c\\x79\\xa8\\x7d\\x21\\x74\\xec\\x22\\xfb\\x14\\x89\\xa6\\x75\\x5c\\x34\\x8a\\x99\\x6d\\x0a\\xa5\\x6e\\x0f\\x60\\xd5\\x8e\\x26\\xbe\\xfa\\x23\\xa8\\x6b\\xef\\x4e\\x35\\x29\\x51\\x2e\\x30\\xa9\\xd1\\xc5\\xe4\\x88\\x50\\x18\\xcb\\x97\\xae\\xb7\\xc9\\x3c\\x5c\\x41\\xca\\xa3\\x42\\x36\\x57\\x5c\\x22\\x6f\\x3b\\x23\\x5e\\xdd\\xba\\x36\\x4e\\x28\\x5b\\x6e\\x35\\x27\\x07\\xbb\\xb3\\xb3\\x39\\xbb\\xf2\\xa6\\x3a\\x9c\\xb9\\xbd\\x33\\x3a\\x77\\xe7\\x9b\\xd5\\x8a\\x48\\xe1\\x4c\\xe5\\x88\\x6e\\xd0\\xcd\\x07\\xc2\\xd1\\x65\\xa8\\x1b\\x5e\\x6a\\x31\\xa8\\xae\\x78\\x06\\xbc\\xf2\\xe0\\xc4\\xec\\x29\\xa9\\x67\\x72\\x5e\\x57\\x7f\\x17\\x41\\xee\\x68\\xf3\\x45\\xf5\\xf7\\xab\\x0f\\xad\\x31\\xc8\\xb4\\xb1\\x8b\\x43\\x1c\\x49\\x77\\xd5\\xc5\\x84\\x00\\x4b\\x45\\xf7\\xcd\\x19\\x61\\xaf\\xfe\\x87\\x38\\xe2\\x4c\\x38\\x26\\x10\\xef\\xe9\\x98\\x35\\x3d\\x7e\\xba\\xf9\\x19\\xb2\\x79\\xbb\\xb6\\x91\\xc3\\x05\\x2b\\x8b\\x2c\\x5f\\x09\\x80\\x8e\\xf3\\xa6\"},\n{{0xba,0xb3,0xff,0x7a,0x44,0x48,0xd8,0xa0,0x3d,0x8a,0xcf,0xdb,0x91,0x3f,0x77,0xfe,0x77,0x80,0x43,0x95,0xc3,0xe5,0x4e,0xc2,0x35,0x11,0x79,0x27,0xe3,0x2b,0x50,0xd5,},{0x54,0x97,0x5e,0x35,0xe5,0xb1,0xd0,0x32,0x3f,0x2d,0x6f,0xb5,0xc6,0x15,0x8b,0xf6,0x65,0x4b,0x08,0x4f,0x76,0xbb,0xdc,0xfd,0x72,0x34,0x92,0x29,0xe8,0xe4,0xa6,0xe8,},{0xd6,0xb4,0x13,0x5f,0xc7,0xac,0xb3,0xd7,0xcd,0xf9,0x87,0x89,0x6d,0x91,0xb8,0xa9,0x0d,0xb5,0x84,0xd8,0x93,0x3a,0x6f,0x30,0x29,0xe3,0x26,0x1e,0xc1,0xc3,0x90,0xcb,0xac,0xfa,0xaf,0xef,0xf4,0x43,0xb6,0xda,0x4f,0xdb,0x1d,0x84,0xc6,0x4a,0x54,0x56,0x0f,0xef,0xfa,0x2f,0x1c,0x7a,0x91,0xbd,0xe9,0x73,0x02,0x22,0x92,0x3b,0x67,0x03,},\"\\xb6\\x47\\xb6\\x7c\\xf0\\x1c\\x2c\\xac\\xc3\\x9d\\xe5\\x96\\x9e\\x19\\x9b\\xe6\\xd9\\x32\\x01\\x67\\xa4\\xce\\xbb\\xf1\\x62\\x59\\x50\\xb1\\xe6\\xb7\\xad\\xf5\\xca\\x24\\xd1\\x34\\x95\\x68\\x86\\x5f\\xbb\\xfd\\x90\\xf5\\x13\\xf0\\x5f\\x79\\xf7\\x0a\\x63\\xa2\\x38\\x73\\xdc\\x7a\\x19\\x5d\\x4b\\x28\\x5a\\x08\\xf3\\x0e\\xe0\\x61\\xd0\\xb8\\xe6\\xb4\\xd6\\xbf\\x9b\\x2e\\xcf\\x2c\\x69\\xf3\\xd5\\xa0\\x7a\\x67\\x30\\x53\\x7c\\xca\\x4a\\x4e\\x4c\\x7e\\xe6\\x84\\x70\\x2b\\xff\\x88\\x3f\\xab\\x8b\\xca\\xf8\\x93\\x11\\xc5\\x49\\x8b\\xcc\\xb5\\xa0\\xf7\\xc8\\xd4\\x9b\\x54\\xf4\\x82\\xff\\xfb\\xca\\x6e\\x7d\\xa2\\x62\\x45\\x2b\\xa5\\x9a\\x57\\xa6\\x87\\x9d\\x81\\xb7\\x3c\\xd7\\xad\\xf7\\x2a\\x3b\\xe2\\x8a\\x37\\x3c\\xd6\\x33\\x10\\x40\\x84\\x61\\xc2\\x1b\\x90\\x7f\\x63\\xe0\\x86\\xb2\\x92\\xff\\x02\\x83\\x3e\\x8a\\x2f\\x46\\xad\\xbd\\x67\\x1d\\x02\\xb0\\x3a\\x69\\xac\\xa2\\xe1\\x1d\\x28\\x7c\\x52\\x2a\\x95\\x45\\x20\\x44\\x2e\\xce\\xfa\\xa9\\x05\\xdb\\xfc\\xc8\\x25\\x4c\\x58\\xc3\\x95\\x4a\\x89\\xbf\\x56\\xcb\\xe0\\x1a\\xd5\\x63\\x19\\x71\\xeb\\x39\\xeb\\x43\\x2a\\x85\\x4e\\x69\\x19\\x29\\xdf\\x7e\\x48\\xb9\\x00\\xca\\x6e\\x74\\x0a\\xcc\\xf5\\x78\\xb3\\x17\\x95\\xb4\\x9a\\x6c\\xa7\\x74\\xbd\\x8b\\x99\\x31\\x06\\xa9\\xc4\\x94\\x8c\\x18\\x71\\x49\\x48\\x31\\x59\\x90\\xa5\\xf1\\x91\\x69\\x24\\x20\\xf2\\x89\\x32\\x8a\\xb7\\x13\\xec\\x19\\xb7\\xea\\x89\\x4d\\x16\\xe6\\x47\\x61\\x00\\x87\\x1c\\xf3\\x16\\x8e\\x4f\\x93\\x5b\\x55\\x05\\xd1\\xed\\x5b\\x0a\\xa2\\x9b\\xe3\\x6f\\xa3\\xa3\\x46\\xac\\x3e\\x76\\xf1\\x43\\xc4\\x6c\\xa6\\x91\\x23\\xb7\\x9c\\x36\\x39\\x9a\\x0d\\x2e\\xd3\\x02\\x77\\x24\\x94\\xad\\xf4\\x42\\xbb\\xaf\\xbc\\x4d\\x01\\x53\\x26\\x92\\xc7\\x85\\x9d\\xf0\\x4d\\x2c\\xa7\\x8b\\xa5\\x5d\\x77\\xfd\\xf3\\xe5\\xad\\x99\\x37\\x86\\xa2\\x4c\\xff\\x21\\x99\\xbb\\x49\\x38\\x78\\x73\\xcc\\x41\\x4b\\x4c\\xf1\\x13\\x7a\\xbb\\x7e\\x94\\xae\\x3d\\xdb\\xf9\\x7f\\x53\\x4a\\x18\\xfc\\x5a\\xe5\\x85\\x23\\xa3\\xcc\\x52\\x28\\x3d\\xc7\\xb0\\x16\\xf3\\x1c\\xd6\\x55\\x79\\x81\\xc5\\x07\\x6c\\x77\\x4f\\x30\\x3a\\x47\\xc4\\x27\\x87\\x0e\\x20\\x7e\\xd8\\xbd\\x66\\x64\\x0f\\xf0\\x92\\xdb\\x50\\x3f\\xa1\\x24\\xbf\\xdc\\xf0\\x20\\x05\\x1d\\xad\\xd1\\x06\\xdd\\x24\\x58\\x40\\xb3\\x19\\x10\\xb8\\xa9\\x06\\x0d\\x59\\x86\\xf0\\x2b\\x60\\xaa\\x5e\\x33\\xb4\\xd7\\x55\\x09\\x12\\xcd\\xc5\\x77\\x6c\\x77\\x2a\\xac\\x93\\xae\\x19\\xc7\\x3b\\x7e\\xcf\\xca\\x38\\x9e\\x62\\x76\\x81\\xa8\\x78\\x1e\\xb4\\x7d\\x84\\xe9\\x34\\x60\\xba\\x89\\x1d\\x3f\\xf6\\xea\\xdf\\x8f\\x2a\\x90\\x3c\\x38\\x34\\x74\\xbe\\xaa\\x42\\xb9\\x0e\\x03\\x22\\x36\\xdc\\xd8\\x98\\xd0\\x2a\\x40\\xef\\xb4\\x4e\\x47\\xea\\xd5\\x2b\\x75\\xb0\\x9c\\x7d\\xa1\\xcd\\x6a\\x2d\\xfd\\x4d\\x1c\\x04\\x52\\xde\\x69\\xf6\\xac\\xac\\x1a\\x68\\xdd\\x78\\xda\\xf9\\x72\\xae\\x26\\x08\\x21\\xe2\\xec\\x52\\x2f\\xb5\\x74\\x9b\\xeb\\xe0\\xad\\xb4\\x52\\xbf\\xa4\\xfa\\xa1\\xe9\\x79\\x11\\xc1\\x29\\x9f\\x16\\x56\\x8d\\x68\\xee\\xf4\\x05\\xf4\\xb1\\xcd\\xac\\xab\\xed\\x59\\xf7\\xb0\\xfb\\xce\\xab\\x71\\x9a\\x34\\xb2\\x99\\xf5\\x8a\\x4a\\xe8\\x15\\x4f\\x98\\xf4\\xd9\\xf4\\xf1\\x40\\xb1\\xf0\\x85\\x00\\x69\\x46\\x72\\x5e\\x7c\\x29\\xbb\\x0b\\xc6\\xcc\\xf2\\x53\\x44\\x97\\xc6\\x1d\\x4c\\x16\\x12\\x62\\x4a\\x61\\xd7\\x0d\\x26\\xc3\\xef\\xb7\\xd7\\xc3\\x51\\x84\\x86\\x57\\xf7\\xf8\\xee\\xbf\\x8b\\x99\\x07\\x47\\x74\\x0e\\x6f\\x91\\x0c\\x97\\xce\\xf1\\x50\\x37\\x57\\x65\\xc8\\xc0\\xb3\\xb4\\x49\\xc0\\xd0\\x9d\\x66\\xf0\\x08\\xe6\\x7c\\xfa\\x76\\xea\\x2b\\x68\\x08\\xb6\\xfe\\x63\\x2e\\xaf\\xe0\\x58\\x7f\\x37\\xe3\\x6b\\xe9\\x8d\\xcb\\x17\\xa3\\xf4\\xa1\\x5b\\x65\\xa9\\xf6\\xfc\\xf9\\x64\\x2b\\x52\\x52\\x20\\x77\\xb1\\xfb\\x4c\\xc3\\xc0\\x8d\\xf4\\xb4\\x67\\xca\\x71\\x6d\\xb1\\x6b\\x73\\x7f\\x78\\x2c\\xdf\\x38\\x71\\x70\\xa5\\xf1\\xf6\\xa7\\xae\\x0a\\xb3\\xf5\\xb7\\xc5\\x85\\xe3\\xb0\\x65\\x5a\\x64\\x56\\xa5\\x03\\x59\\x5c\\xe8\\xea\\xea\\x25\\x37\\x85\\x5e\\x7f\\x0d\\x50\\x61\\xbc\\x29\\xb4\\xe6\\x7d\\xaa\\x82\\x46\\x3c\\x19\\x0e\\x9f\\xdd\\xd5\\x2f\\x83\\x22\\xdd\\xb4\\xe0\\xf2\\x6b\\x68\\x77\\x82\\x28\\xeb\\x57\\xe1\\xa1\\x85\\xb7\\x02\\x5d\\xa1\\x49\\x87\\xd4\\x4b\\xaa\\x76\\x7b\\x22\\xee\\x7f\\x4c\\x84\\x59\\x10\\x32\\xe8\\x8e\\xc1\\x2e\\xb8\\xc5\\xa4\\xb9\\xe1\\x57\\xec\"},\n{{0x48,0x6c,0x7b,0x43,0x6c,0x1d,0x43,0xd6,0xb7,0x03,0x51,0x22,0x83,0xc1,0x66,0xdc,0x86,0x3e,0x5a,0x33,0x80,0x2f,0x4e,0xa6,0x5f,0xc7,0x38,0x77,0x89,0x02,0xd0,0x14,},{0xb5,0xdc,0x94,0x7d,0x64,0x33,0x7c,0xae,0x82,0x12,0x2b,0xd6,0x8c,0xc8,0x08,0x40,0x59,0x6d,0xe3,0xbe,0x56,0xcb,0xd0,0xc8,0x33,0xaf,0x3f,0xaa,0x3a,0xdc,0x37,0x76,},{0x31,0xf9,0x5c,0xbb,0x74,0x63,0xb8,0x75,0x28,0x65,0x42,0x27,0xbb,0x13,0x97,0xbf,0x10,0x65,0xb4,0xf5,0x76,0x80,0x80,0x78,0x20,0x7d,0xfa,0xf0,0x6d,0x12,0x4b,0x41,0xf4,0xc3,0x18,0xf4,0xa9,0x31,0x5a,0x66,0x08,0x5b,0x9e,0x56,0x8a,0x71,0xe4,0x14,0xed,0x94,0x14,0x51,0x73,0x10,0xc6,0x99,0x94,0x6d,0xb0,0xc9,0x76,0x28,0x52,0x07,},\"\\xaf\\x03\\x60\\x53\\x67\\x2d\\xcf\\x3a\\xa2\\x6e\\x28\\xec\\x6a\\xa6\\x42\\xce\\x28\\x4b\\x89\\x6c\\x69\\x88\\x7d\\xfd\\xcf\\x08\\x24\\x51\\x5e\\xb0\\x84\\x8d\\x9d\\x97\\x0c\\xa2\\x72\\xdf\\x77\\xa8\\x6b\\x3f\\xf6\\xdd\\xaf\\x3c\\xba\\xdd\\x3a\\xb6\\x28\\x3b\\xc3\\x7c\\xdf\\x7a\\x56\\x07\\xd5\\xdf\\xc7\\xcf\\x96\\x32\\x92\\x99\\xcc\\x53\\xed\\xbb\\xe6\\x57\\xfd\\xfa\\x2c\\xa2\\x44\\x67\\x05\\x0a\\x0a\\xeb\\x8c\\xff\\xd7\\xd3\\x3d\\x54\\x3e\\xc2\\xc1\\x91\\xcc\\x0b\\xce\\x89\\xac\\x37\\xd3\\x32\\x93\\xb1\\x88\\x8c\\xcb\\x76\\xc2\\x8a\\xdc\\x67\\x1a\\x49\\x35\\xa8\\x46\\xd9\\x07\\xe4\\xad\\xd0\\x11\\x0f\\xeb\\xbe\\xe5\\xae\\xc8\\x0f\\x9d\\x2f\\xf7\\x4e\\x2a\\xf4\\xfd\\xbe\\xbb\\xcf\\x49\\x10\\x5a\\x64\\x69\\xd7\\x38\\x00\\x06\\xb2\\xca\\x44\\x36\\x48\\x14\\x45\\x4e\\x44\\x5e\\x36\\xdc\\x00\\x12\\xf3\\x39\\xc9\\x68\\x54\\xf8\\x36\\x44\\x2a\\x05\\xa5\\x0b\\xec\\x90\\x73\\x27\\xf7\\x4b\\xa9\\xf6\\xfd\\x79\\x0f\\xf0\\xad\\x37\\x83\\xd2\\x97\\xbd\\xcc\\xa7\\x64\\x60\\x78\\x37\\x03\\xeb\\x5f\\x2b\\x1f\\x51\\xb0\\xa7\\x40\\xce\\x7a\\x8f\\x00\\xa3\\x87\\xe3\\x63\\x62\\x70\\xa9\\x71\\xfa\\x8f\\x15\\xb4\\x49\\x67\\x30\\xd8\\x8a\\xdd\\x80\\x7a\\x7f\\x7e\\x98\\x7c\\xd4\\x15\\x95\\xa2\\xe7\\x43\\x5d\\xf5\\x19\\x55\\x76\\xa3\\x5f\\x5e\\x91\\xb2\\xfc\\xfa\\xc9\\x4e\\xd5\\xd7\\x76\\x63\\x78\\x3b\\x61\\xe6\\x67\\x1d\\x34\\x83\\x8b\\x6b\\x56\\x44\\xfb\\xc1\\xc5\\x39\\xfe\\x15\\x9b\\x77\\x92\\xdb\\x96\\x7e\\x83\\x52\\x61\\x8d\\xda\\xca\\x0c\\xde\\x73\\x43\\x7b\\x59\\xe7\\x80\\x1b\\x49\\xeb\\x46\\x09\\xb1\\x05\\x77\\xca\\x26\\x92\\xdd\\x6f\\x9d\\x5e\\x9d\\x4b\\x5e\\x5e\\x62\\xc5\\x91\\x3e\\x7b\\x87\\xe6\\xb3\\x47\\xbe\\x61\\x53\\xb1\\x71\\x99\\xc9\\x16\\xa1\\x3f\\x8a\\x88\\x5b\\x37\\x8e\\xf0\\x9e\\x13\\xca\\xe4\\xd8\\xb0\\x79\\xd7\\xd5\\xcb\\x90\\x94\\x19\\x9b\\x0f\\x20\\x53\\x3c\\x90\\x08\\x3b\\xc3\\xac\\xb2\\x66\\x76\\x97\\xee\\xd2\\x2e\\x36\\x70\\xab\\xb4\\xa5\\x53\\xe9\\x95\\xc9\\xdd\\x95\\x94\\xe5\\x92\\x39\\x1a\\x00\\x04\\xb6\\x55\\x65\\x44\\xf3\\x56\\x12\\xc4\\x97\\x13\\x59\\x57\\x7c\\x47\\x63\\x82\\xca\\x53\\xb3\\xf2\\x62\\xa5\\xe3\\x3e\\xd2\\x6e\\xec\\x80\\x9f\\x4f\\xdb\\xa4\\x89\\x8a\\x11\\x36\\x75\\xcb\\x6a\\xf7\\x17\\xdb\\x62\\x57\\x9f\\x39\\x80\\xb2\\x14\\x63\\xbe\\x02\\x9c\\xb4\\x16\\x0f\\xe5\\xd2\\x57\\xc4\\x6c\\xd6\\x66\\x4f\\x98\\x61\\xac\\x50\\xfe\\x05\\xc1\\x44\\x05\\x7d\\xce\\x2f\\x8d\\xf1\\x53\\x2a\\xa7\\xaf\\x58\\x9f\\x41\\x27\\x06\\x01\\xce\\xf0\\x6b\\xbe\\x4f\\x35\\xc3\\x1c\\x78\\x2b\\xb3\\xcf\\xff\\x7d\\x5a\\xb6\\x4a\\x14\\xec\\x41\\x73\\x61\\xf1\\xd3\\x2c\\xbd\\x38\\xb6\\xbd\\x0e\\x02\\x50\\x5d\\x14\\x16\\x30\\x2b\\x85\\x05\\xae\\x2a\\x96\\xe8\\xd5\\x33\\x9c\\x34\\x6c\\x2b\\x06\\x62\\xd3\\x50\\x25\\x9c\\x50\\xc5\\xe4\\x87\\x95\\x91\\x4e\\x6f\\x88\\xe9\\x7c\\x81\\x1c\\x39\\x3b\\xdf\\x9a\\xec\\x7e\\xf8\\x20\\x47\\xca\\x28\\xee\\x97\\x1c\\x17\\x5c\\x27\\xe3\\x6e\\x10\\x97\\x27\\x96\\x0d\\xdf\\x1a\\x1b\\x97\\x6a\\xb4\\x4f\\x48\\x51\\x60\\x7b\\xd9\\x66\\x80\\x8a\\xc4\\x6d\\x54\\x00\\x31\\x28\\x29\\x7f\\x5f\\x44\\x87\\x10\\x8d\\x6a\\x02\\xe7\\xa1\\x64\\x13\\xd2\\xb7\\x5e\\xcb\\x42\\xfd\\xdf\\xb6\\x69\\xc8\\x01\\xd2\\x3d\\xe5\\x0a\\x6f\\x7b\\xf6\\x58\\xf7\\x53\\xc6\\xb2\\xb3\\xb4\\x7c\\x06\\x40\\x10\\x5d\\x0a\\x80\\x1b\\x32\\xa1\\x94\\x3c\\xdc\\x15\\xc8\\x86\\x55\\x5e\\xb7\\x5b\\xb7\\x92\\x7b\\x93\\xc3\\x5c\\x5b\\xe1\\xf9\\x8b\\x19\\x6c\\xaa\\xc2\\xda\\xd9\\x91\\xb1\\x04\\x4e\\xa8\\x63\\x94\\x4d\\x54\\xd8\\x83\\xab\\xc3\\xc6\\xde\\x66\\xed\\x86\\x8e\\xe8\\x4b\\xcf\\x9c\\x34\\xcc\\xdb\\x80\\xfc\\xd9\\xcc\\x04\\x02\\x74\\x77\\x32\\xcd\\x63\\x0b\\xbf\\xa3\\xbb\\xe8\\xb0\\x38\\xdc\\x1d\\xbd\\xaf\\x43\\x6d\\x9a\\xc0\\x0c\\x02\\xd5\\x28\\xec\\xe2\\xe7\\x91\\xee\\x31\\x2a\\x86\\x8f\\xeb\\x2f\\x58\\x7c\\xa4\\x4d\\xb5\\x73\\x13\\x84\\xfa\\x18\\x31\\x14\\x20\\x61\\xb2\\xea\\xd2\\xb8\\x0c\\x66\\xbd\\x2f\\xa5\\xdc\\xca\\xbe\\x6a\\x25\\xf2\\xa4\\x93\\xfe\\xaa\\xcd\\x23\\x1d\\x2f\\x40\\x96\\x46\\xb9\\x42\\xa5\\x78\\x54\\x5e\\xa4\\xfe\\xea\\x9a\\x73\\x47\\x3f\\x79\\xdc\\xf1\\x3e\\x0c\\x9f\\x1b\\x49\\xfd\\x89\\x12\\xec\\x48\\x73\\x28\\x04\\x5b\\xd0\\xfa\\x22\\x89\\x22\\xee\\x6e\\x97\\x3e\\x61\\xf6\\xe9\\x33\\x65\\x29\\x65\\x78\\xdc\\xc2\\x1c\\x36\\x14\\x79\\xee\\x2d\\x24\\x87\\x9f\\x2e\\x9b\"},\n{{0xa6,0xe6,0xad,0x2c,0x37,0x9c,0x6f,0xcc,0xad,0xb4,0xa4,0x9b,0x23,0x2a,0x91,0x42,0x61,0x8e,0xa3,0x01,0x03,0xc3,0x3c,0x22,0x6f,0xf6,0x28,0xbc,0xfd,0x81,0xf4,0x26,},{0xf7,0xc4,0x32,0x3f,0x5c,0x41,0x9d,0x9b,0x3f,0x34,0xa8,0xeb,0x42,0xae,0x7f,0x1f,0xaa,0x23,0x33,0x07,0x90,0x30,0xc5,0xd6,0x4f,0x9f,0xfb,0x1e,0x9b,0x16,0x00,0x2d,},{0x07,0xd9,0xfc,0x24,0x4f,0xda,0xb0,0x01,0x59,0xeb,0xec,0xc5,0xa0,0x08,0x83,0x45,0x3f,0x08,0x31,0x01,0x71,0x76,0x9d,0x29,0x70,0x01,0xe8,0x77,0x01,0x0e,0x3e,0xce,0xd9,0xfb,0x60,0xec,0x91,0xcb,0x4d,0x88,0xe7,0xba,0x40,0xc5,0x30,0xb1,0xf9,0x23,0x79,0x78,0xcc,0xd9,0x6d,0x5c,0xba,0x9e,0x4f,0xa2,0x7e,0x2a,0x0a,0xd9,0xd6,0x0c,},\"\\x2e\\x85\\x76\\x76\\xa5\\xbb\\x1c\\x6e\\x9e\\x94\\x50\\x7f\\x83\\xc6\\x0a\\x67\\xf5\\x47\\xc5\\xde\\x9e\\x94\\x56\\x6b\\x19\\x7a\\x6a\\xf6\\xcf\\x47\\x52\\xe9\\x3d\\xbd\\xef\\x6b\\x9f\\x66\\xd1\\xfe\\xbd\\x95\\x7e\\x42\\xa7\\xf5\\xad\\x64\\xef\\x1d\\xbc\\xc4\\xfe\\x69\\xae\\x95\\x25\\xd1\\xa4\\xde\\x67\\x05\\x4c\\x88\\xf2\\x9c\\x06\\x47\\xba\\xcf\\x8b\\x82\\xf3\\x21\\xff\\x99\\xfe\\x9e\\xed\\xc9\\x92\\xed\\x34\\xc1\\x17\\x7f\\xc5\\x42\\x12\\x27\\xcc\\xac\\x10\\xfe\\xb9\\xce\\xd4\\x08\\x2f\\x56\\x58\\xda\\x63\\x71\\x47\\x23\\x97\\x97\\x37\\xe7\\xdc\\xbf\\xe2\\xe8\\xb5\\xd5\\x0f\\x91\\xdf\\xca\\x83\\xe7\\xf9\\x5f\\x35\\xd1\\xad\\x8d\\xd5\\x11\\x44\\x50\\x2f\\x3d\\xf6\\x72\\x43\\x26\\x11\\xf0\\xe7\\x66\\xa9\\x0d\\xcc\\x2a\\x57\\x39\\xc8\\x05\\xd9\\x5f\\xe5\\xb0\\x41\\xde\\x9d\\x7f\\xb4\\x7b\\x44\\x04\\xaf\\xc8\\x03\\xa3\\xbd\\x48\\x04\\xc7\\x81\\x7e\\xbc\\x5b\\xdf\\xef\\x8a\\xdd\\x9e\\x25\\x0b\\x50\\x96\\x6c\\xa8\\x93\\x9b\\x22\\xb3\\xc6\\xff\\x93\\x6e\\xaa\\x65\\x9a\\x24\\x0c\\x0c\\x84\\x8b\\x81\\x0a\\xce\\xcf\\x61\\x81\\xe0\\xe4\\xdb\\x8e\\x4c\\xf8\\xfc\\xce\\x7d\\xe5\\x59\\xcb\\xe8\\xaf\\xa9\\xdb\\x84\\x99\\x57\\x09\\x11\\xa3\\x88\\x7e\\x85\\x0e\\x50\\x9c\\xdb\\x70\\xde\\xbc\\x34\\x77\\xd1\\x21\\x75\\x01\\x4f\\x79\\xf8\\x1b\\xa1\\x13\\xd0\\xb7\\xb3\\x35\\x11\\x8f\\x85\\xcf\\x59\\x99\\x6f\\x80\\x67\\x58\\xeb\\x90\\x3c\\xc4\\x50\\xf5\\x2f\\xee\\x10\\x2e\\xfc\\x01\\x44\\x1e\\x9a\\xe5\\xfa\\xe7\\x4c\\x23\\x1d\\xfd\\x85\\xeb\\x6b\\xad\\x17\\xd6\\xb7\\x0e\\x93\\x85\\x84\\xfa\\xcb\\x21\\x72\\xcb\\x03\\xbd\\x5e\\xa0\\x7b\\x7f\\x0d\\x37\\x1f\\xfa\\x35\\x1c\\x0e\\xe4\\xef\\xe9\\xba\\x4a\\x3f\\xd5\\x43\\x87\\x46\\x55\\xe7\\xd3\\x9c\\x53\\xae\\x86\\x32\\x98\\x02\\xe5\\xc3\\x85\\xe9\\x28\\x3a\\x29\\x73\\xca\\xb8\\xcf\\x7a\\xc7\\xff\\x0f\\x91\\xd1\\xd4\\x8b\\x58\\xab\\xfd\\xad\\x65\\x8d\\x81\\x2f\\x07\\x88\\x16\\x76\\xbd\\x22\\x6b\\xfe\\x95\\x7d\\x7d\\xf3\\x0c\\x41\\x30\\xa4\\x48\\x35\\x4a\\x6b\\x94\\x40\\x5a\\x41\\x16\\x50\\xa9\\xc8\\xfc\\x85\\x11\\x55\\xec\\x5a\\x8a\\x3e\\x3b\\x67\\xae\\x0c\\x4b\\x5c\\xb8\\x9b\\xb7\\x3f\\xc8\\x29\\x74\\xbe\\x62\\xda\\x73\\xf0\\xe2\\x30\\x92\\x93\\x7d\\x40\\x5b\\xa4\\xaf\\x6c\\xab\\x94\\x65\\xea\\x43\\xa6\\x25\\x3f\\x44\\x57\\x08\\x2a\\x06\\xac\\x12\\xb7\\x5e\\x88\\xec\\x68\\x44\\x87\\xf9\\x07\\x63\\x73\\xfa\\xb8\\x89\\x28\\x59\\xd8\\xe8\\xba\\x43\\x14\\x23\\xaa\\x80\\x5a\\x22\\x0c\\xbf\\xda\\x43\\x1b\\x32\\xb1\\xe0\\x31\\x21\\xf7\\xfd\\x4d\\xe1\\x85\\x91\\xf2\\x50\\x5c\\xc0\\xf5\\xb2\\xb1\\xa7\\x60\\x5f\\xbc\\xc6\\x37\\x57\\xb0\\x7e\\x29\\x9f\\xef\\x5a\\x2b\\x73\\x65\\x23\\x0c\\x2e\\x92\\xa2\\x59\\x62\\xc2\\xe8\\x01\\x2a\\xd3\\xfa\\x9e\\xe9\\x48\\x82\\x70\\x96\\x25\\xba\\x68\\xc7\\xb2\\x13\\x66\\x4a\\xe2\\x53\\x2b\\x60\\x9d\\x7c\\x9a\\xa0\\xe8\\x3d\\x49\\x3d\\xbc\\xe7\\x63\\x2f\\x35\\x58\\x0e\\x06\\xd3\\x11\\x1c\\xed\\x32\\x0d\\xd0\\x19\\x04\\x41\\xf6\\x2d\\x9e\\x35\\xf5\\x0d\\xe5\\x9c\\x27\\x2f\\xb0\\x0f\\x56\\x8a\\x00\\xb0\\x74\\x6c\\x33\\xa9\\xbd\\x24\\x90\\xc0\\x74\\xb9\\x1c\\xdd\\xc4\\x87\\xef\\x2e\\x45\\xa0\\xf0\\x30\\xe0\\x8f\\xdc\\x18\\x17\\xbc\\xa8\\xa9\\xce\\x29\\xd2\\x92\\x79\\xe7\\x55\\xde\\xbc\\x28\\xdf\\xad\\xc3\\xc4\\xd1\\xb4\\x58\\x48\\x6e\\x3c\\x8d\\x0c\\x43\\x18\\xe7\\xe6\\xf9\\xeb\\x5a\\x36\\x53\\xb3\\xf7\\xc4\\x95\\x07\\x07\\x7c\\xd5\\xeb\\x81\\xf1\\x0b\\x88\\x10\\x7c\\xc0\\xf9\\x31\\x69\\x32\\xab\\xe9\\xb6\\x4e\\x88\\x86\\xd0\\x68\\x56\\xa8\\x5b\\xe6\\x3b\\x0c\\x2b\\x47\\x5c\\x0a\\xfc\\xb0\\x69\\x44\\x26\\x86\\x0f\\xb2\\x4b\\x5c\\x17\\xab\\x6a\\xb7\\x73\\x3d\\x5e\\x64\\x1b\\xe7\\x4f\\xd5\\xf6\\xa1\\xff\\x18\\xd2\\xf9\\xa4\\x27\\x70\\xfb\\x30\\x75\\x0f\\x56\\xf4\\x85\\x4e\\x38\\xd5\\x8a\\xef\\x18\\xa2\\xa6\\x1c\\xbf\\xb4\\x9e\\xe5\\x76\\xed\\x97\\x73\\x7b\\xc2\\x8d\\xf3\\x26\\x8a\\x33\\x41\\x75\\x51\\x3d\\x97\\xaf\\x00\\x9c\\xbb\\xcf\\xdf\\xad\\x50\\x39\\xd6\\x9b\\xb4\\x6f\\x70\\x88\\x67\\xd9\\xb3\\xce\\x0b\\xf2\\xf5\\x69\\xe3\\xcf\\xbc\\xf6\\x13\\x6f\\x88\\x70\\xd2\\x52\\x08\\xb2\\x1a\\x3e\\xdc\\xb7\\x33\\x93\\xdf\\xcd\\x41\\x72\\xc1\\x40\\x2c\\x41\\xf3\\x6e\\x3f\\x82\\xa4\\xea\\x6d\\xcd\\x89\\x16\\x86\\xba\\x66\\xe1\\x43\\x20\\xaa\\x0e\\x22\\xba\\x0c\\x1e\\xf0\\x33\\xd6\\x62\\xcd\\xb8\\x60\\xcd\\xfa\\x3a\\x40\\xf6\\xcc\\x53\\x2a\\x08\"},\n{{0x9b,0x6d,0x7e,0x28,0xeb,0x05,0x15,0x97,0x32,0x4d,0xce,0xb7,0xa1,0x89,0x41,0x24,0x67,0x25,0xe8,0x8d,0x53,0xab,0x2c,0x34,0x77,0x11,0x05,0x33,0x0c,0xf1,0xf4,0xae,},{0x88,0x72,0xa5,0x0b,0x5f,0xe3,0x62,0xf8,0xea,0xd1,0xd4,0x0e,0x20,0x45,0xf0,0xd4,0x0b,0x2e,0x7b,0x50,0xb5,0x9d,0x80,0x90,0xbc,0x47,0xad,0x68,0xeb,0xee,0x09,0xed,},{0xc6,0xdc,0x5c,0xa1,0xe8,0x56,0x00,0x15,0xb4,0x93,0xaf,0xe2,0x66,0x6c,0xcf,0x6f,0xef,0xa8,0x03,0xd8,0x52,0x6c,0x83,0x7f,0xe7,0xf1,0x23,0xc7,0x99,0x14,0x27,0xab,0x03,0x0d,0x7c,0x77,0x0e,0x45,0xf6,0xde,0x84,0x81,0x52,0x3b,0x94,0xec,0xe9,0x7f,0x3f,0x16,0x1c,0xf5,0xb8,0xc7,0xae,0xa3,0x9f,0x5a,0xd8,0x26,0xbf,0x8d,0x0a,0x02,},\"\\xd1\\xe1\\x98\\x7b\\xff\\x65\\xf6\\x2a\\xd6\\x76\\x24\\xc6\\x65\\x79\\x24\\xf5\\xd6\\x73\\xb7\\x82\\x4e\\xbe\\x40\\x40\\x26\\xc0\\x56\\x2d\\xed\\x31\\x43\\x44\\x0b\\xe6\\x37\\xf9\\x8c\\x9e\\x01\\xa6\\xaf\\xdf\\xa9\\xa4\\x7d\\xd4\\x9c\\x7c\\xba\\x6e\\x3f\\xd2\\x3e\\x45\\x52\\xf7\\x63\\x2b\\x14\\x38\\x0b\\x27\\xcd\\x3e\\x96\\x06\\xcc\\xe3\\x50\\xf1\\x52\\xab\\x12\\x6b\\xea\\xd0\\xa5\\xd3\\xbc\\xe4\\xd4\\x20\\x92\\xd9\\x34\\xc8\\xca\\x33\\x7e\\x98\\x7e\\x11\\xd8\\x6c\\xfb\\xfb\\xd2\\xac\\xc3\\x22\\x3b\\xd1\\x67\\x44\\xa9\\x27\\x72\\x8f\\x48\\x53\\x72\\x17\\x5c\\xc6\\x94\\xdf\\x30\\xa7\\x3f\\x9d\\x33\\x76\\x5f\\xf0\\x14\\xef\\x00\\x8d\\x58\\x63\\x21\\x03\\x38\\xcc\\x34\\x82\\xcc\\x27\\xea\\x31\\x7e\\xec\\x92\\x1b\\x0c\\x56\\x8c\\x38\\xab\\x27\\xc4\\xa5\\x64\\xe8\\x02\\xb1\\xb9\\x46\\x68\\xc6\\x51\\xe2\\x0a\\x0b\\x55\\xf3\\xa7\\x9d\\x21\\x5f\\xc3\\xa0\\xd0\\x49\\x04\\x01\\x09\\x32\\xc4\\xcc\\x68\\xc2\\xa9\\xe7\\xd0\\x0e\\x5d\\x38\\xd8\\x2d\\xf5\\x52\\x06\\xba\\xb9\\x5c\\xf6\\x97\\xbe\\xbc\\x72\\x06\\xee\\xde\\xf6\\xfd\\x18\\xd9\\xa2\\x0c\\x2c\\xbb\\x28\\x5b\\x00\\xef\\xa7\\x69\\xa0\\x8d\\xab\\x2b\\x3a\\xba\\xdf\\x00\\xd1\\x98\\xb4\\xf1\\x92\\xdd\\x44\\xbc\\xb9\\x14\\x31\\x82\\x3a\\xe6\\xfd\\xf9\\x84\\x58\\xec\\xa3\\x9c\\xd2\\x92\\x63\\xf0\\x99\\x93\\x03\\xe7\\x0d\\xc6\\x94\\xfe\\x01\\xc5\\x3a\\x11\\xc1\\xd1\\xc3\\x4c\\x1e\\xe5\\x06\\x8a\\x20\\x1d\\xbe\\x7e\\x10\\x08\\xd7\\x64\\x35\\x89\\x68\\xb4\\x02\\xaa\\x39\\x85\\x49\\x50\\x7f\\x7b\\xd1\\x85\\x08\\x00\\xe4\\x11\\xb1\\xc4\\xe2\\x8d\\xdc\\x04\\xa8\\x59\\xe1\\x79\\xbe\\x8a\\xd7\\xe6\\x67\\x0e\\x50\\x9d\\xb0\\x27\\xad\\x7e\\x51\\x7e\\x44\\x25\\x95\\x4f\\x5a\\x80\\x74\\x14\\xa6\\xda\\x26\\x7a\\x76\\x4e\\x71\\x2a\\x99\\x84\\x65\\x06\\x49\\x82\\xd8\\x51\\xa2\\x65\\xea\\x3c\\x4d\\xfb\\x74\\xf9\\x92\\xa7\\xcc\\xcd\\x9a\\x82\\x68\\x7f\\xa6\\x1c\\x32\\x2c\\x4f\\x58\\x9e\\x86\\xb8\\x82\\x52\\x13\\xbf\\xa9\\x51\\xda\\xe6\\xaf\\x35\\x4a\\xce\\x18\\xf0\\x73\\x99\\x5a\\xdc\\x95\\x83\\x9d\\xac\\x01\\x65\\x51\\x1d\\x61\\x75\\x37\\x91\\xa5\\x3e\\x48\\xe3\\xa8\\x27\\x3d\\x44\\x82\\x3d\\x25\\x96\\xf2\\xa2\\xdb\\x2e\\x5f\\x1a\\xe5\\x97\\x22\\x1b\\xa7\\xf3\\xeb\\xaf\\x4a\\x7b\\x28\\x88\\x39\\x50\\x02\\xbd\\xaf\\xf5\\x1f\\xa5\\x4b\\xfb\\x97\\x9d\\xe1\\x03\\x14\\x04\\xca\\x77\\x89\\xfe\\x09\\x5d\\x4d\\x17\\xf0\\x7a\\x35\\x55\\x6b\\x10\\xfe\\x8e\\x14\\x17\\xc8\\xa6\\xa6\\x31\\xc2\\xed\\x36\\xcb\\x7a\\x0e\\x61\\x81\\x77\\x62\\x89\\xc3\\x44\\x81\\x4d\\x42\\x13\\x1a\\x73\\xb1\\x2f\\xaa\\x35\\xd7\\x78\\x14\\xc6\\x81\\xa6\\x01\\x37\\x4b\\xa7\\x1c\\xb9\\xad\\x53\\x15\\xfa\\xd4\\x2d\\x3a\\xcf\\xc7\\xc1\\xd6\\x28\\x81\\x02\\x56\\xda\\xf7\\xd8\\xc3\\xc9\\xa2\\xe5\\xbd\\xcf\\xb7\\x70\\x08\\x2f\\xa6\\x38\\x16\\x89\\x58\\x52\\x3a\\x1c\\x3b\\x03\\x5d\\xbc\\x6d\\x5a\\xdf\\x26\\xdf\\x89\\xa7\\xcc\\xab\\xed\\x3e\\x7d\\xd3\\x77\\xc1\\x6d\\xa8\\x41\\xf1\\x3c\\x68\\x94\\xd4\\x3c\\xeb\\xb4\\xe3\\x90\\x22\\xf1\\xcc\\xec\\x22\\x74\\x44\\x5c\\x78\\xb3\\xad\\xc7\\xbb\\xf7\\x0d\\x89\\x0b\\x80\\x23\\x6c\\xc4\\x46\\x8f\\x95\\x69\\xc5\\x9a\\x7e\\x33\\xb5\\x70\\xe6\\x70\\x38\\x0d\\x24\\x4e\\x4e\\x31\\x0e\\x11\\xc3\\x92\\xf1\\xe3\\x34\\x05\\x4b\\x92\\xc8\\x38\\x6c\\x16\\x1c\\xe0\\x41\\x09\\xb0\\x37\\xbd\\x62\\x8d\\x91\\x9d\\xcb\\x62\\xda\\x14\\x35\\xbf\\x94\\xe8\\x8b\\x0a\\x88\\x46\\xd4\\x86\\xd1\\x67\\x78\\xf7\\xa3\\xb8\\x80\\xe6\\x60\\xf4\\x41\\xfd\\xf8\\x6e\\x56\\xb8\\xaa\\x06\\x61\\xf5\\x5a\\xae\\xce\\x27\\xf9\\xdd\\xaa\\x0e\\x2a\\x22\\xc2\\x15\\xb0\\x40\\x53\\x97\\x26\\xb9\\x85\\x39\\x15\\xa1\\x59\\x2d\\xff\\xea\\xe3\\x2d\\x7b\\x5b\\x67\\xeb\\x62\\x05\\xbb\\x0b\\xd7\\x27\\x9f\\x78\\x8d\\x5f\\x83\\x3c\\x40\\x66\\x78\\x0c\\xa0\\xa4\\x2d\\x3e\\x4e\\x1a\\xa2\\x2b\\xd0\\x6b\\xb5\\xee\\xd8\\x9b\\x94\\x13\\x77\\x1e\\xca\\xb6\\x44\\xca\\x72\\xd1\\x29\\x1d\\x00\\xf7\\x40\\x90\\x1a\\x73\\x11\\xdc\\x03\\x67\\x15\\xd2\\x3e\\xbd\\x9a\\x59\\x89\\x16\\x28\\xf0\\xd8\\x7e\\xd4\\x89\\x50\\x2f\\x06\\xd7\\x5b\\xbd\\x11\\xcd\\x16\\x02\\xa3\\x5e\\xe7\\xe1\\x33\\x35\\xd6\\xa1\\x44\\xb0\\x88\\x30\\xe6\\x69\\xc0\\x2e\\x65\\x2f\\x3f\\x10\\x0d\\x39\\x3e\\xf9\\xb4\\xac\\x05\\x32\\x14\\x39\\xbc\\xe6\\xce\\x36\\xff\\xc5\\xab\\xca\\x89\\x0b\\x87\\x96\\xcc\\xb5\\xe1\\x63\\x03\\x55\\x9c\\x5d\\x91\\x17\\xf0\\xf3\\x1d\"},\n{{0x70,0x09,0xed,0xd0,0x79,0x50,0x96,0xed,0xc4,0xfe,0xd5,0x5a,0x17,0xcc,0xf4,0x84,0x13,0x1e,0x60,0x8c,0x6d,0x5d,0x66,0x96,0xbf,0x33,0x76,0xe2,0x69,0x24,0x95,0x9b,},{0x77,0x57,0x4b,0xf0,0x69,0x52,0x71,0x45,0xe7,0x2d,0x3e,0x85,0xce,0x7d,0x4f,0xcd,0x67,0x1a,0x33,0xe0,0xa7,0x1e,0x6b,0xf0,0xda,0x7e,0xa4,0x71,0xdd,0x6e,0x86,0xa4,},{0xb7,0x01,0xb8,0xf9,0xa4,0x34,0xe0,0x6d,0x71,0x9a,0xd2,0x5d,0xcc,0x54,0x06,0x0c,0x79,0x86,0x64,0x7f,0x44,0xf3,0x88,0x4b,0xcb,0x6e,0x5e,0xe1,0xd7,0xa4,0x46,0xcc,0x26,0x5c,0xec,0x02,0x9b,0x53,0x7d,0xa7,0xf2,0x52,0x33,0x26,0x55,0x8a,0xc9,0xba,0x34,0xf4,0xcc,0x2a,0x97,0xcc,0xa3,0x45,0x2e,0x70,0x56,0x2e,0x7a,0x8f,0x55,0x04,},\"\\xb1\\x2c\\x12\\x47\\x05\\x39\\x54\\x7c\\x2d\\xe6\\xbc\\x4e\\xea\\xc7\\xb6\\x3e\\x50\\x8e\\xd7\\x10\\xf3\\x56\\x37\\xd9\\xfd\\xd2\\xdc\\xca\\x32\\x2a\\x7a\\x50\\x71\\xda\\xb2\\xb2\\x84\\x5e\\x30\\x79\\x28\\x06\\x03\\x5c\\x9f\\xcd\\xaf\\xe2\\x78\\x3e\\x3b\\x67\\x7d\\x6b\\xe5\\xaa\\xc7\\x0b\\x33\\x91\\x0a\\x2b\\x95\\xe8\\xb5\\xd5\\x9b\\xda\\x61\\x59\\x35\\xa4\\x17\\xb7\\xae\\x19\\xa7\\x85\\x37\\x74\\xe8\\x9a\\x12\\xaa\\x54\\x7b\\x41\\x92\\x97\\x9a\\x01\\xef\\x6e\\xf3\\x2a\\x40\\xde\\x79\\xd6\\x80\\x05\\x7a\\x83\\xa0\\x74\\x61\\x7c\\xa6\\x50\\x1f\\x59\\xe7\\x35\\x64\\x92\\x7c\\x38\\xb5\\x8c\\x19\\x58\\x5a\\x2c\\x03\\x65\\x9c\\x02\\x6e\\x4d\\xe3\\x80\\x6d\\x6c\\x1c\\xa8\\x95\\x8d\\xee\\x47\\xbc\\xb8\\x89\\xe7\\x6d\\x2c\\x3a\\x9a\\xb5\\xb8\\xb6\\xaf\\xb2\\xe8\\x42\\x29\\x80\\x56\\x56\\x7b\\xf9\\xb5\\x89\\x57\\x41\\x54\\x83\\x33\\x62\\x33\\xef\\x49\\x20\\xfa\\x57\\xf4\\x96\\xe1\\xf0\\x34\\x8c\\xca\\x20\\x36\\x64\\x96\\xfa\\xb3\\xa7\\x5b\\xf4\\x21\\x4e\\xce\\x47\\xa4\\x5f\\xea\\xa1\\x39\\x2d\\xb3\\xf2\\x54\\xd9\\x6a\\x7f\\x37\\x40\\x2c\\x98\\x11\\x14\\x0d\\x73\\x58\\xb4\\xef\\x8f\\x20\\xa2\\x98\\xee\\xef\\x90\\x4e\\x37\\xd6\\x8f\\x37\\x8d\\x33\\xcb\\x96\\xd0\\x0c\\x03\\x10\\x9f\\xc8\\x3f\\xd0\\x6a\\x87\\x6c\\x92\\x48\\x2f\\x61\\xab\\x79\\x14\\xeb\\x7c\\x2e\\x5e\\x84\\x06\\x6e\\x0e\\x91\\xe2\\x1e\\x42\\xe9\\xbe\\x23\\xdf\\x12\\xb5\\xc7\\x47\\x97\\x3c\\xb8\\x64\\x42\\xc3\\x22\\x91\\xd3\\xd1\\xae\\x71\\x9b\\x36\\xa6\\x2f\\xaf\\x3a\\xba\\xa2\\x05\\x3a\\x31\\x3f\\x62\\x5d\\x85\\xc5\\x1a\\x51\\x98\\x57\\x19\\x15\\xef\\x8a\\x2b\\x19\\x9b\\xa3\\x7d\\x25\\x88\\x45\\x75\\xba\\x1b\\x72\\x84\\x4c\\xab\\x43\\x28\\xb5\\x7f\\xab\\x1e\\xc9\\x74\\xee\\x8e\\xa1\\xdf\\x7c\\xa9\\xc7\\x8a\\x4d\\x3a\\x03\\xbc\\xb0\\xab\\x41\\x69\\xbf\\x06\\xa3\\xa4\\x38\\xd9\\x56\\x6c\\x6c\\x50\\x1d\\x8d\\x9c\\xcc\\xcb\\x1a\\xc2\\x6b\\x4d\\xa4\\xae\\x1a\\x9d\\x8e\\x8b\\x9d\\xf6\\x62\\x82\\x1a\\xd9\\x75\\xc9\\xb0\\x15\\xfe\\x26\\xf6\\x89\\x8d\\x22\\xab\\x91\\x2f\\x0e\\x40\\x5a\\x5b\\x27\\xcf\\xd3\\x9d\\x65\\x7d\\xcd\\x92\\xcd\\xeb\\xe6\\x79\\x19\\x02\\x71\\x34\\x84\\x40\\x6d\\xdd\\xce\\x71\\x18\\x87\\x31\\xe4\\x43\\x19\\x38\\x1a\\xf2\\x7d\\xaf\\x76\\x79\\x22\\x73\\xb8\\xc3\\x52\\x51\\xd1\\x1b\\x83\\x6a\\xfe\\x8b\\x3c\\xe9\\xb4\\x02\\x73\\xf6\\x91\\x5e\\xbe\\x6b\\xc9\\x5a\\x75\\xbb\\x94\\x1a\\x42\\x92\\x09\\x86\\x7f\\xba\\x87\\x64\\xbf\\x6c\\x40\\xdb\\x6e\\xec\\xb4\\xf2\\x17\\x47\\x83\\x7c\\xf6\\xae\\x7f\\xbf\\xe3\\x6d\\x50\\x23\\xdf\\x7f\\xce\\x2c\\x0c\\x3c\\x57\\xaf\\x28\\x98\\x88\\x53\\x13\\xc5\\xc4\\xbd\\xa3\\x5c\\x7d\\xa6\\xcb\\x29\\x93\\x2f\\xb1\\x99\\x1f\\x62\\xbb\\xb0\\x80\\xb3\\x2e\\x20\\x50\\x61\\x93\\x11\\xae\\x69\\xab\\xb3\\x02\\x2d\\x91\\x3f\\xa9\\xea\\xbd\\x5d\\x5c\\xb4\\xdc\\x54\\xd7\\x5d\\xca\\x63\\x8c\\xda\\x9a\\xf3\\x31\\xc0\\xcf\\x4d\\x20\\x07\\xb6\\xca\\x39\\xf6\\x55\\xa6\\x1c\\x01\\x03\\x9f\\x12\\xa4\\xb9\\x78\\x2b\\xc3\\x9a\\xec\\x4d\\x22\\xef\\x00\\x93\\x38\\x8d\\xd7\\xd5\\xb5\\x6d\\xfb\\x8a\\x7f\\x9d\\x86\\x69\\x00\\x4e\\x28\\x78\\xdd\\x8a\\x6d\\x76\\x85\\x7c\\x08\\x45\\x24\\x50\\x68\\xfe\\xe1\\xc5\\x31\\x96\\x31\\xe7\\x8d\\x37\\x85\\x16\\x5c\\x70\\xaf\\xd6\\x52\\x99\\x30\\x13\\x78\\x55\\x1e\\xbf\\x61\\x35\\x84\\xc6\\xa7\\x62\\x0a\\x0e\\x3b\\x67\\x79\\xf3\\x8c\\x09\\x40\\x06\\x24\\x97\\x00\\x8e\\xb2\\x33\\x87\\x08\\x68\\xc2\\x1c\\xcc\\xac\\x23\\x95\\x01\\xb6\\x3b\\x74\\x9a\\x85\\x60\\x2c\\x28\\xa0\\x95\\xca\\xfc\\x74\\x9b\\x05\\x11\\xa6\\xc8\\x78\\xed\\xb3\\xb7\\x80\\xea\\x17\\x4d\\x07\\xb1\\x21\\xe3\\x15\\xa8\\x26\\xdd\\xa6\\xec\\x8d\\xc5\\x43\\x63\\xe2\\xcd\\x2e\\x63\\x05\\xa1\\x94\\x82\\x5c\\x0e\\xa9\\x0e\\xfd\\x7a\\x9f\\xd8\\x9c\\xd9\\x7b\\x99\\xc4\\x30\\x0b\\xd3\\xbf\\x93\\x53\\xd8\\x2f\\xbc\\xce\\xea\\x71\\xb4\\xee\\x3f\\x1a\\xae\\x95\\x39\\xb4\\xcc\\xe9\\x0c\\xa4\\x77\\x59\\x7c\\x17\\x4e\\xf2\\x0f\\x4b\\x9f\\x4e\\x62\\xd0\\x9a\\x57\\x0d\\x31\\x35\\xaa\\xbe\\xe9\\x55\\x1f\\xa6\\x09\\x83\\x95\\x8c\\x0b\\x7b\\x8c\\x37\\x44\\x55\\x3e\\xe1\\x4e\\x7f\\x3c\\xd1\\x03\\xa1\\x92\\x51\\xc9\\x9b\\xf6\\x38\\x4a\\xbb\\x60\\xa7\\x6a\\xfc\\x66\\x58\\xb8\\x0d\\xfc\\x51\\x10\\xad\\xc4\\xc7\\x32\\xfe\\x0e\\xe3\\x29\\x33\\xfb\\x28\\x48\\x28\\xe0\\x08\\x88\\x7a\\xef\\x80\\xf6\\xf8\\x13\\x34\\x04\\x46\\xc0\\x21\\x7c\\x12\\xee\"},\n{{0x12,0xfe,0x8e,0x5c,0xe2,0x0c,0xaf,0xaa,0x32,0x79,0xda,0x7b,0x34,0xaa,0x87,0x75,0x2e,0xad,0x67,0x9f,0x15,0x61,0x28,0xaa,0xef,0xb4,0xaf,0xa5,0xdb,0x4f,0x2a,0x6f,},{0xe7,0x7f,0x44,0x20,0x6b,0xb0,0xc4,0xc5,0x9a,0x28,0x70,0xcf,0xc2,0xec,0xac,0x63,0x36,0x2d,0xee,0xcb,0xe8,0x11,0x5d,0xe5,0xcb,0x1a,0xfc,0x2d,0x9a,0x3d,0x47,0xf1,},{0x04,0xea,0xf9,0x00,0x96,0x6e,0x09,0x92,0xd3,0x6e,0x3c,0x22,0x0a,0x4b,0xd4,0xd8,0x2b,0xcc,0x6e,0xb9,0x98,0xed,0x05,0x1d,0xbc,0xb9,0x16,0x0b,0xcd,0x35,0x74,0x09,0x73,0x6b,0xcf,0xf7,0xe6,0x63,0x0e,0x96,0xf5,0x53,0x8a,0xec,0xa6,0xab,0x8b,0x0d,0x0b,0xd8,0x2c,0x0c,0xd7,0xc4,0x54,0x99,0x17,0xfe,0xbb,0x9c,0xba,0xda,0x08,0x0c,},\"\\x6b\\x80\\xcc\\x6f\\xbb\\xd3\\x32\\xf8\\xc6\\x19\\x7c\\xdf\\x2e\\x6d\\xc1\\x9a\\x21\\x30\\xfa\\xa2\\xec\\x93\\x8e\\xf5\\x58\\xb8\\x84\\xba\\x4f\\xa5\\xe1\\x13\\xe5\\xb3\\xe4\\xb1\\xaa\\xf5\\x1b\\x69\\x5f\\x13\\xef\\xfe\\x13\\xf7\\x7d\\x39\\xca\\xb3\\xc0\\x7d\\x04\\xd6\\x6d\\x43\\x0d\\x99\\x74\\xb1\\xda\\x3d\\x39\\xdf\\x12\\x78\\xc0\\x0d\\x6b\\xcb\\xfd\\x4b\\xae\\x75\\xb8\\xc0\\x76\\x40\\x4d\\xbb\\xb8\\x34\\x48\\xfb\\x49\\x3d\\xf6\\x70\\x00\\xf9\\x7d\\x24\\x7e\\x8f\\x23\\xdc\\x08\\x1f\\xce\\x99\\x2b\\x65\\xa2\\x1b\\x35\\xd7\\xbd\\x7f\\xa7\\xdc\\xcc\\x54\\xa5\\x60\\xaf\\xd1\\x4b\\x1e\\xc4\\x36\\xc1\\x09\\x46\\xf6\\xaa\\x59\\xea\\xe1\\xbe\\x3e\\xcf\\x31\\x1d\\xef\\x51\\xe4\\x6b\\x6b\\x4d\\x1d\\x08\\x0d\\x17\\x84\\xb2\\x33\\x4b\\x80\\xcf\\xba\\x72\\xcd\\x93\\x1f\\x55\\xec\\xd2\\x98\\xb0\\x5d\\xc8\\x36\\xab\\x12\\xd0\\xad\\x8b\\x5d\\x6e\\x9b\\x1e\\x3c\\xea\\x3d\\x84\\x33\\x68\\xee\\xf1\\x9f\\x5c\\x14\\xc6\\xbb\\xad\\x94\\x14\\xcc\\x7a\\x4d\\xb6\\xa7\\x26\\xe4\\xfc\\xae\\xd4\\x44\\x40\\xa0\\x19\\xfe\\x12\\xa6\\x05\\x73\\x40\\x3c\\x0e\\x66\\x2d\\xc9\\x02\\xd1\\xc8\\x73\\xff\\x30\\xc9\\x31\\xba\\x7e\\x43\\xa3\\xb3\\xbf\\x71\\xd5\\xb0\\x94\\xea\\x50\\x49\\x71\\x64\\x7c\\xa9\\x43\\x56\\xf0\\xa5\\x3e\\x44\\x4b\\x4c\\x00\\x8e\\xe5\\x97\\x72\\x04\\x22\\x1b\\x40\\x0d\\xee\\xc3\\x7f\\xc2\\x73\\x45\\x25\\x45\\xf8\\xf2\\x18\\xbe\\x98\\x87\\x25\\xbc\\x38\\xc8\\x5d\\xf2\\x12\\xea\\x73\\xdc\\x0b\\xc7\\xcb\\xba\\xc9\\x07\\x98\\x2f\\xef\\xad\\x68\\x0f\\xbd\\x97\\x5c\\x20\\x93\\xa7\\xfe\\x8e\\x6b\\x37\\xc1\\xcc\\xed\\x87\\xf8\\x1d\\xaa\\x57\\x29\\x1a\\x5a\\x18\\x47\\x6d\\x11\\xa1\\x8e\\xc4\\xb5\\xcb\\xce\\x5d\\x55\\xac\\x9b\\x62\\x4b\\x04\\x84\\x30\\xf2\\x54\\xf6\\x71\\x07\\x85\\x06\\xe6\\x98\\x9d\\xf7\\xc0\\x92\\x56\\x52\\x50\\x39\\x08\\x5a\\xb7\\xc1\\x30\\xc2\\x40\\x00\\x4a\\xbb\\xb3\\xaf\\x6b\\x48\\x1c\\xc1\\xa0\\x61\\x7e\\x57\\xe3\\x88\\xee\\x4b\\x1f\\x05\\x2f\\x34\\xa0\\x03\\xfe\\x6b\\xb2\\x02\\xcb\\x87\\xd2\\x74\\x1b\\xd8\\xe3\\x45\\x4c\\xa7\\x3d\\x2f\\x61\\x20\\x11\\xec\\xc7\\x4d\\x88\\x34\\x35\\x10\\xa6\\x3c\\x93\\x13\\xdd\\xc3\\x6c\\x25\\xd3\\xfb\\x03\\xe1\\x88\\xf5\\x60\\xbd\\x02\\x9c\\x80\\x15\\x85\\xce\\x55\\x29\\x88\\xdc\\x55\\xb7\\xd8\\x52\\x2a\\x33\\x96\\xc0\\x1d\\x5e\\x71\\x5a\\xe2\\x6c\\x62\\x2c\\x64\\xfe\\xd5\\xb9\\x8e\\x9c\\x55\\x9e\\x4a\\xa7\\x8d\\x1e\\xd3\\xb7\\xb8\\x90\\xd4\\x77\\xec\\x8c\\x50\\xa0\\xff\\x10\\x7a\\x3f\\x83\\xb0\\x7b\\xd3\\x5e\\x9c\\xe9\\xa0\\x8b\\xcf\\xc0\\xf1\\x68\\xee\\xc7\\xaa\\x31\\x1f\\x71\\xc6\\x6a\\x71\\xce\\xb9\\xd5\\xa2\\x19\\x9a\\x14\\xbe\\x36\\x86\\x5c\\xa8\\xd0\\x7e\\x18\\x6b\\x13\\x92\\xb9\\x29\\x0c\\x57\\x80\\x04\\xd5\\x84\\xf1\\x91\\xc8\\x2a\\x53\\xd8\\x50\\x89\\x0b\\xcc\\x0d\\x12\\xdf\\xf8\\x40\\xe0\\x43\\xdd\\xdc\\x2e\\x67\\x0c\\x83\\x60\\x20\\x92\\x4f\\x58\\xc0\\x44\\xb2\\x18\\x76\\x3c\\xa6\\x19\\x82\\xbc\\x33\\x2d\\x24\\x7b\\x2a\\x00\\x8a\\xb5\\x70\\xb6\\x56\\x5a\\x06\\x89\\x2a\\x26\\xcf\\xb0\\x85\\x3d\\x79\\xda\\x28\\xef\\x8b\\x91\\x0a\\x93\\x29\\x54\\x4b\\x79\\x2a\\xe4\\x45\\x6b\\xa7\\x76\\x50\\x66\\xb9\\xd1\\xb4\\xa3\\x00\\x21\\x04\\x48\\x66\\x0a\\xe4\\x8b\\x50\\x44\\x41\\x01\\x7c\\xdd\\xd1\\xf6\\xf0\\x09\\x38\\xb1\\x07\\x2c\\x8a\\xb8\\x24\\xad\\xfe\\x8a\\xe3\\x49\\x23\\xc8\\x2e\\xec\\x75\\x4b\\xee\\x1a\\x65\\x50\\xab\\x1d\\x3d\\xa0\\x86\\xe3\\xae\\xbb\\xf2\\x11\\x69\\xc4\\x44\\x69\\xe0\\x3b\\xba\\xe0\\xd7\\x2c\\xe8\\x63\\x45\\x77\\x84\\xcf\\xe1\\xdf\\xc2\\x76\\xf1\\xaf\\xad\\x9e\\xe5\\x3e\\xba\\xb5\\xa3\\xc6\\x57\\x2e\\xb1\\xca\\xe0\\x99\\xa4\\xa5\\xfe\\x19\\x31\\x92\\x90\\xe6\\xa1\\xb8\\xb0\\xe7\\x54\\x1e\\xd7\\x35\\xb3\\xf2\\x1b\\x1e\\x2c\\x75\\x09\\xf8\\x7f\\xd1\\xfe\\xd0\\x00\\x07\\x47\\x9b\\x3c\\x1b\\xb7\\x84\\x32\\x46\\x63\\x02\\xd2\\x46\\xd8\\xd0\\x31\\x99\\x63\\x07\\x26\\x0a\\x0c\\x41\\xa0\\xe3\\xec\\xd1\\xe7\\xfd\\x83\\x4d\\xac\\x11\\xa1\\x3e\\xb0\\x36\\xb3\\x9c\\x36\\x99\\x66\\xfd\\xef\\x39\\x4c\\x18\\x3e\\x54\\xe7\\xb0\\xcb\\x3d\\x0c\\xeb\\x19\\x8b\\xd0\\xe6\\x6c\\x00\\xd3\\x8d\\xb7\\x03\\xaa\\xce\\x30\\xcb\\xbd\\xab\\x36\\x9d\\xfd\\x1d\\x9e\\x51\\x4d\\x09\\x68\\xf1\\x00\\xc9\\xf0\\x7c\\x31\\x50\\x89\\xad\\xb3\\xad\\x02\\xe5\\x9c\\x04\\xb9\\xbe\\x46\\xe9\\x9f\\xbf\\x5a\\x62\\xc6\\xbb\\xec\\xdf\\xf5\\xb3\\x81\\xe5\\x51\\x27\\x82\\x4d\\xdb\\x18\"},\n{{0xee,0x9b,0x6c,0x2e,0x0c,0x9b,0x01,0x47,0x2c,0xe3,0x2d,0x54,0xd1,0x76,0x2a,0xb0,0x30,0x33,0x17,0xd7,0x6d,0x3a,0xa7,0x8f,0x5e,0x08,0xa9,0x02,0x4c,0xa1,0xe0,0x83,},{0x01,0x6d,0xf0,0xf7,0x17,0xbc,0xb7,0xad,0xf6,0x26,0x95,0x8d,0x83,0xbf,0x8a,0xa3,0x25,0xc7,0x05,0x18,0xc6,0x8b,0xc7,0xef,0xd8,0x42,0x53,0xb7,0x5d,0xb0,0x87,0x88,},{0x4b,0x00,0x1d,0x96,0x42,0x83,0x5d,0x72,0x13,0x8d,0x68,0x01,0x98,0xe6,0xaf,0x70,0xb5,0xde,0x7a,0xf0,0x15,0x13,0x1e,0xa7,0x26,0xf4,0xe5,0x1b,0x5e,0x8b,0x6d,0x48,0xc2,0xa6,0xca,0x8e,0x87,0x09,0xcc,0x82,0x22,0xa5,0x04,0x7c,0x09,0xa6,0x6e,0x51,0x8a,0xc5,0xe8,0xb6,0xe5,0x35,0x48,0x94,0x82,0x61,0xf0,0x70,0x1f,0x68,0x73,0x08,},\"\\x77\\x2c\\xc2\\x5c\\x3b\\x69\\xbb\\x3f\\xf5\\x65\\x56\\x64\\xef\\xa4\\x78\\xac\\x41\\x4a\\xdf\\xae\\xa7\\x0a\\xc4\\xa2\\xa8\\x87\\xed\\x39\\x68\\xc5\\x4d\\x34\\xdb\\xf1\\xbe\\x32\\xcc\\x9a\\x9b\\x54\\x20\\xa4\\xad\\x3c\\x9a\\x87\\x7b\\xc8\\xcc\\xec\\x94\\xad\\x47\\x3a\\xa7\\xa3\\xc7\\xde\\x08\\xa0\\xfd\\xb5\\xed\\x1e\\x89\\x87\\x2b\\xe7\\x81\\x70\\xbe\\x22\\x1d\\x27\\x97\\x76\\xbb\\xc6\\xed\\x9c\\x5a\\x67\\x16\\x89\\x80\\xd5\\xea\\xf8\\x95\\xe1\\x34\\x0f\\x5d\\xfa\\xa3\\xdf\\x62\\x2d\\x65\\x44\\xb3\\x99\\xd7\\x49\\x45\\xfd\\x13\\xbb\\x11\\x73\\x62\\x1e\\x05\\x61\\x51\\x46\\x40\\x13\\x7a\\xa7\\xbc\\x9c\\xb7\\xde\\xbe\\xff\\x2c\\x62\\x69\\x77\\xd4\\x47\\x26\\x3b\\x7e\\x57\\xd4\\x3d\\x69\\xef\\xb2\\x30\\xcd\\x25\\x86\\x5e\\x4d\\x92\\x48\\x28\\xf5\\xe3\\x6f\\x96\\x4e\\x40\\x3e\\x34\\x93\\xf3\\x0d\\x6d\\xfe\\xa6\\xca\\x3b\\x78\\x10\\x75\\xb5\\xe3\\xb2\\x5c\\x05\\xac\\x50\\xe5\\x55\\xf1\\x5b\\xa1\\x2b\\x0e\\x05\\x9b\\xff\\x99\\x64\\x84\\x12\\x9d\\xb6\\xea\\xfd\\x88\\x99\\x3d\\x6f\\x0b\\x7e\\xcd\\x15\\xdc\\xe2\\xfc\\x99\\xf8\\xb8\\xe4\\x35\\x16\\x35\\x2d\\xdb\\x46\\x1a\\x04\\xb9\\xff\\x34\\x86\\x45\\x2e\\x6a\\xa6\\xa5\\x4b\\x2d\\x10\\x62\\xa7\\x71\\x42\\x50\\xcd\\x2a\\x88\\xff\\x6c\\x4c\\x17\\xb6\\xcc\\x66\\x52\\xd8\\xc5\\xac\\x27\\xd4\\x44\\x3a\\xeb\\xf3\\xd5\\xfb\\xaa\\xee\\x45\\x21\\xec\\x76\\xf0\\x41\\x3d\\xb6\\x44\\x21\\xec\\x8d\\x69\\x49\\x62\\x67\\x25\\xfe\\x56\\x16\\x0a\\xb3\\x07\\xc0\\xe7\\x39\\x06\\xc4\\x51\\x55\\xef\\xab\\xb4\\x72\\x22\\x02\\x1f\\x22\\x0d\\x32\\xbd\\x3d\\xb0\\x71\\x2a\\xbd\\xe2\\x59\\x9e\\xa4\\xff\\x79\\x97\\x17\\x81\\x1d\\xcd\\xf8\\x18\\x2d\\xf6\\x71\\x6d\\x2a\\x03\\x8a\\xee\\x15\\xd7\\x78\\xda\\x55\\xac\\x20\\xf0\\x1f\\x25\\x30\\x9c\\xea\\xd5\\xb5\\xb7\\xb2\\x23\\x22\\xe1\\x82\\x8e\\xa7\\xc9\\x1a\\xe6\\x66\\xf2\\xdc\\xd6\\x84\\x07\\x31\\x48\\xe3\\x1b\\xb2\\x24\\x7d\\x5f\\x93\\x50\\x6e\\xa8\\x08\\x52\\x27\\xad\\xc9\\xae\\x19\\x82\\xe9\\x50\\xf0\\x06\\xa9\\xda\\x15\\x8b\\x9c\\xec\\xff\\x89\\x29\\x76\\x1c\\x84\\xf9\\xd9\\x76\\xfd\\xcd\\x31\\x7f\\xfe\\xd3\\x6c\\xbf\\x6a\\xcd\\xa3\\xe5\\x0c\\x9b\\x73\\xbd\\x2c\\x80\\x85\\x40\\x9d\\x11\\x9b\\x64\\xce\\xd7\\x34\\x9a\\x26\\x74\\x26\\x2a\\x83\\x2b\\xec\\xb0\\x3c\\x2e\\xdc\\xca\\xc0\\xec\\x54\\x12\\x4e\\x82\\xf8\\x10\\x18\\x17\\x92\\xda\\x49\\xea\\x10\\xbd\\x94\\x1f\\x98\\x95\\xa0\\x69\\x59\\xfd\\xe0\\xd3\\xb0\\xae\\x84\\xc3\\x9d\\xf0\\x53\\x90\\xab\\x33\\xc3\\x6c\\x79\\xca\\x22\\xe6\\x59\\x4d\\x7f\\xc6\\xe3\\xf8\\x69\\x22\\xd7\\x8e\\xb7\\xf5\\xc2\\x54\\x95\\xd8\\x22\\xa3\\xb4\\x10\\x51\\xb2\\x4e\\x57\\xa7\\x6f\\xcf\\xc1\\x65\\xcd\\xe6\\xd0\\x96\\xcc\\x7b\\x7e\\x9d\\x05\\x5f\\xe8\\x64\\xd5\\x29\\x42\\xd6\\x29\\xa8\\xac\\x26\\x1b\\xe1\\xdc\\xd3\\xa2\\x1f\\x89\\x5f\\x49\\xb6\\x7e\\xe4\\x7e\\xab\\x7c\\xf1\\x64\\x4d\\x57\\x1d\\x5f\\xf3\\x8c\\x17\\x9f\\x5c\\x6a\\x54\\xa3\\x61\\x2f\\xb3\\x47\\x53\\x41\\x2a\\x1b\\x95\\xbf\\x62\\xff\\x31\\x79\\x80\\x4f\\xfb\\xb9\\x90\\x51\\xf2\\xb0\\x80\\x56\\x3a\\x4a\\xe0\\xf2\\x7c\\xf9\\x96\\xea\\x8b\\xe3\\xba\\xe0\\xa4\\x33\\x9d\\xcc\\xdf\\xf6\\xb6\\x67\\x15\\x59\\x26\\x6e\\xaf\\xf4\\xef\\xf6\\x82\\xb8\\xde\\xe8\\x9c\\x9d\\x2d\\x45\\xac\\xdb\\xec\\x4a\\xa6\\xce\\xcd\\xbd\\xb1\\xd2\\x84\\x60\\x9e\\x65\\xef\\xb7\\x7b\\xb8\\xf1\\xa5\\x1f\\xc4\\xd4\\x56\\x8a\\x70\\x5f\\xb9\\xc9\\x7b\\x23\\x03\\xc1\\x46\\x7d\\xff\\x8c\\x8c\\x5e\\xe2\\x75\\x59\\xb9\\x3a\\xd1\\xc5\\xb9\\xc5\\xc6\\xc7\\xc5\\x29\\xfa\\x8c\\x55\\xc7\\x5e\\xbb\\x59\\xb2\\xa8\\x18\\xaa\\x9b\\xda\\x1e\\x9e\\x79\\xbc\\x66\\x02\\x97\\x72\\xf8\\xae\\xa1\\x1b\\xad\\xd3\\x22\\x65\\x65\\xd5\\x4f\\xd0\\x1b\\xda\\x8c\\xb2\\x70\\xe7\\x0d\\xc9\\x33\\x9b\\x46\\x90\\x0b\\x58\\x18\\xe9\\x32\\x07\\x5b\\xe6\\xc2\\x8e\\x73\\xa1\\x91\\xd0\\x2c\\xbd\\xc7\\x45\\x4b\\xe1\\x23\\x87\\xb0\\xd4\\x7a\\x1a\\xb1\\x42\\x32\\xd2\\x34\\x2a\\x6f\\x15\\x18\\xea\\x97\\x09\\x8b\\x81\\x5a\\x1c\\xa3\\xf9\\xc7\\x0b\\x25\\x72\\x2b\\x1b\\xcd\\x7d\\xac\\xda\\x63\\x56\\x22\\xfc\\x8e\\x72\\x95\\x9f\\x57\\xf7\\x67\\xea\\x56\\x3d\\xa4\\xc1\\x58\\xee\\xf7\\x20\\x01\\x09\\xf6\\x14\\x16\\xc2\\xe7\\x04\\x39\\x92\\x30\\x62\\x43\\x7b\\x1d\\x08\\x2a\\x8c\\x7f\\x43\\x94\\x71\\x3c\\x1b\\x7b\\xa0\\x58\\x7b\\x84\\x1c\\x11\\x44\\x75\\xee\\x3f\\xf0\\x59\\xdf\\x8c\\xfa\\x12\\xa3\\x21\\xd9\\x01\\xcb\\x47\\xf5\"},\n{{0xa3,0xd2,0x35,0x05,0xd0,0x7c,0x5f,0x93,0x7f,0x13,0x63,0x9d,0xbd,0x81,0x8e,0x85,0x14,0x52,0x34,0xee,0x70,0x17,0xec,0xee,0x86,0x36,0xc7,0xba,0x76,0xeb,0xef,0x5b,},{0xfd,0x7f,0xdb,0x3d,0x02,0x2b,0xa3,0x6e,0xad,0xfe,0xd0,0xda,0xaa,0xe5,0xbf,0xf0,0x45,0x05,0x40,0x3f,0x17,0x14,0x73,0xe4,0xd3,0x61,0xee,0x8d,0x15,0x0a,0x0e,0xb4,},{0x67,0xa6,0x67,0xee,0x0d,0x62,0x54,0xca,0x0a,0x8f,0x21,0x25,0x82,0xc0,0xcb,0x8b,0x6e,0xd9,0x7c,0xc9,0x67,0xdb,0x02,0x12,0x96,0xad,0x6a,0xa9,0x9f,0x0a,0xd3,0xa9,0x44,0x97,0x8c,0xfd,0xaf,0xf1,0x3f,0xe5,0xf8,0xc6,0xe8,0x8c,0xbd,0x83,0x1a,0x54,0x73,0xd0,0x74,0x2e,0x37,0x34,0xb3,0xe2,0xdf,0x00,0xff,0x32,0x40,0xa5,0xde,0x02,},\"\\xbc\\x29\\x8e\\xd6\\x98\\x92\\x90\\x40\\x28\\x72\\x5e\\x21\\xb1\\x14\\x46\\x2d\\x89\\xd8\\xc0\\x06\\xdc\\x88\\x4b\\x17\\x87\\x56\\x83\\x8a\\xf4\\x95\\x4f\\xf0\\xf1\\xb7\\x95\\x17\\x30\\x7a\\x25\\x8a\\x0e\\x76\\x81\\xe8\\x79\\xac\\x47\\xd7\\x92\\x02\\x30\\xb0\\xcc\\x1d\\x66\\x17\\x1e\\xb2\\x14\\xd7\\x7c\\xd9\\x7f\\x61\\x7c\\x40\\x5e\\x6c\\x21\\x72\\xfc\\x58\\x9f\\x16\\x25\\xcc\\x5e\\x1b\\x59\\x31\\x10\\x53\\x1f\\x6e\\xb5\\x3f\\x1e\\x6f\\x48\\x6d\\x19\\x64\\x61\\x24\\x47\\x75\\x0a\\x04\\x1f\\xe5\\x1b\\x33\\x2e\\xb3\\xfb\\xc7\\x11\\x61\\x6c\\xe3\\x5f\\x04\\x04\\x42\\xb4\\x31\\x63\\xb8\\x0b\\x75\\x1e\\x21\\xec\\x12\\x45\\xf1\\x2e\\x48\\x83\\xc7\\x9d\\x3b\\x41\\x32\\x82\\xc6\\x9b\\xfc\\x6a\\x46\\x5d\\x1e\\x78\\x96\\xba\\xb0\\x38\\xdc\\x89\\xb4\\xcf\\xc0\\x32\\xfc\\xcd\\xfc\\x87\\xb0\\x7f\\x06\\x11\\x0e\\x1f\\x50\\x6a\\xcc\\xa8\\x15\\x7a\\x32\\x25\\x43\\xbf\\x1e\\xd8\\x90\\x67\\x27\\xf2\\x8d\\x0d\\x68\\x9b\\xcd\\x7d\\xd3\\xdf\\x85\\x93\\x52\\x04\\xa9\\x04\\xab\\x3f\\x7a\\x0d\\x99\\xc1\\x6e\\x5a\\x54\\x2c\\xc2\\xbc\\xde\\xbf\\x5b\\x50\\x2d\\xba\\xbe\\x33\\xb9\\x72\\x48\\x0e\\x02\\xe7\\x1a\\x43\\x8a\\x19\\x80\\xa8\\x76\\x6f\\x10\\x8b\\xd8\\xad\\x51\\x10\\x42\\x23\\x99\\x4d\\x9b\\xfb\\x3c\\x3a\\x4b\\x7a\\x59\\x23\\x8c\\xe2\\xef\\x7d\\x72\\x88\\x38\\x3f\\xfb\\xf2\\x91\\xe1\\x60\\x2b\\x38\\x4a\\xf6\\x07\\x00\\xd7\\xda\\xf0\\xe8\\xfe\\x60\\xf8\\xca\\xed\\xe4\\x3d\\xb0\\x6b\\x3f\\x4c\\x8c\\xff\\xf7\\x49\\xae\\xaf\\xa4\\x6f\\xc6\\x1c\\x49\\xb2\\xd5\\xa4\\x12\\x04\\xcf\\x86\\xf0\\x49\\x25\\x4d\\x80\\x9e\\x94\\x98\\xaa\\x9d\\x4c\\xfd\\xb9\\x4a\\xcb\\x2b\\xab\\xfc\\xf7\\x86\\xdd\\xfb\\x03\\x69\\x15\\x16\\xb3\\x83\\x8b\\x0d\\x4f\\x20\\x1c\\xb2\\x59\\x1e\\xdb\\xb0\\xb0\\xf6\\x74\\xe1\\xe2\\x82\\x03\\x16\\xb7\\x2e\\x81\\xb4\\x8c\\xc5\\xa6\\xb2\\x93\\x38\\xbc\\x36\\x68\\x1f\\x8f\\x7d\\xca\\x43\\xee\\x6c\\x0b\\xd2\\xe4\\x02\\xaf\\xbf\\x96\\x77\\x97\\x51\\x64\\x53\\xbc\\x01\\xbe\\x86\\xbf\\x42\\x29\\x9d\\x1b\\x73\\x6a\\x0d\\x97\\xbb\\xc9\\x22\\xf5\\xa7\\x8a\\xf2\\xdf\\x42\\xe6\\xf8\\xc2\\x8e\\x95\\x3f\\x2c\\xea\\xda\\xff\\xc5\\xe9\\x30\\x64\\x04\\x1e\\x42\\x5a\\xd6\\x97\\x5f\\x88\\xc7\\xaa\\xdf\\x81\\xc3\\x68\\x69\\x1a\\x58\\x1e\\x88\\x5f\\x2a\\x6b\\xa7\\x2e\\xd6\\x8b\\x8f\\xef\\xbc\\xd6\\xce\\x36\\x86\\x26\\xd4\\x48\\x92\\xa2\\x02\\x70\\xb5\\xf7\\x09\\xc2\\xe3\\x4b\\x83\\x35\\xd4\\x2e\\xeb\\xd6\\x7a\\x24\\xdf\\x73\\xf4\\x54\\x55\\xc4\\x19\\x44\\x18\\x7b\\x66\\x92\\xf0\\x54\\xb2\\xfc\\x95\\x91\\x37\\x3f\\x19\\xfc\\x71\\xaa\\x7f\\xa2\\x7d\\xf6\\x00\\x6a\\x1d\\x54\\x9b\\xbf\\xae\\x7d\\x3c\\x3e\\xb3\\x6e\\x5a\\xb2\\xaa\\xa1\\x0a\\xa5\\x53\\x8d\\xa7\\xef\\x36\\xc8\\xff\\x35\\x4b\\x60\\x58\\x13\\x40\\x04\\xd6\\x60\\xa4\\x03\\x63\\x21\\xca\\xad\\x00\\xa3\\x0b\\x1c\\x49\\x8b\\xa3\\xd8\\x08\\xc4\\x40\\x5e\\xf7\\x96\\x18\\xfc\\x22\\x12\\xa7\\xb8\\x33\\x96\\xa3\\xd7\\xce\\xdc\\xeb\\x86\\x3c\\x66\\x37\\x4d\\xc4\\x69\\xae\\x18\\x3c\\x7e\\xd7\\x4b\\x3e\\x70\\xd6\\x37\\x4a\\x06\\x2d\\xe0\\x37\\x9b\\x21\\xcf\\x25\\xd3\\xc4\\xc5\\x76\\x21\\x15\\xcd\\xfe\\x75\\x55\\x45\\xe8\\x9a\\xd4\\x05\\x2b\\xb0\\x27\\x9d\\x93\\x8e\\x90\\xde\\x3a\\xbf\\x50\\x44\\x10\\xca\\xad\\x72\\xb7\\xc2\\x9f\\x53\\xd0\\x1d\\x9d\\xd7\\xf2\\xec\\x5e\\x45\\x9a\\x04\\x59\\x2b\\xdd\\x66\\x41\\x66\\x13\\xe6\\xed\\xd0\\x04\\x56\\x9e\\x0e\\x6c\\x98\\x82\\x7b\\x8c\\x1d\\x70\\x02\\xa6\\xd1\\xbf\\x30\\x3e\\x18\\x25\\x95\\x01\\xdd\\x89\\xf6\\xee\\x94\\x76\\x6d\\x18\\xaf\\x81\\x04\\x63\\xeb\\x13\\xb2\\xef\\xdd\\xf1\\x72\\x3a\\xf7\\x35\\xa8\\x87\\x16\\xe1\\xfc\\xb4\\xb7\\xb4\\x3c\\xb9\\x7e\\x1c\\xc9\\x03\\xb2\\x40\\x8e\\xf4\\x53\\xad\\xa4\\x16\\x47\\x86\\xf0\\x08\\x45\\xfb\\xfa\\x1f\\xfc\\xa5\\xcc\\x3e\\x1c\\x4b\\xd9\\x94\\x0e\\x7d\\x99\\xae\\xf9\\x19\\x16\\x6d\\x05\\x8b\\x51\\x45\\x3c\\x9c\\x14\\xfb\\x9f\\x32\\x51\\xec\\x5f\\xe4\\xf1\\x53\\xc7\\x0a\\x44\\x92\\xdc\\x34\\x96\\x29\\x61\\x86\\xf2\\x3a\\xd4\\x7e\\xba\\xd1\\x3c\\x66\\xe6\\x87\\x27\\xce\\x50\\xba\\x94\\x87\\xf1\\x80\\x18\\x90\\xb6\\x93\\xef\\xeb\\xfc\\x37\\xbb\\x5d\\x95\\xf8\\xaf\\x54\\x8e\\xc8\\xd6\\x49\\x82\\x89\\xe5\\x5f\\x98\\x83\\xfc\\x5b\\xe8\\x4c\\x25\\x6d\\x2b\\xc5\\x48\\x49\\x38\\xc7\\x09\\x82\\x0d\\x9b\\x6b\\x80\\x59\\xc0\\xaa\\x42\\x67\\xdd\\xe6\\x90\\x78\\xe4\\x87\\xc8\\x86\\x5c\\x0b\\x13\\x0a\\x0c\\xa8\\xca\"},\n{{0x6e,0x26,0x51,0x05,0xee,0x71,0x71,0xd1,0xbd,0x79,0x3e,0xff,0xd8,0x7d,0x1e,0x2c,0x79,0x45,0x0d,0x5e,0x18,0x8b,0x57,0xbe,0x3a,0xa1,0x62,0xe2,0xa5,0x25,0x28,0xad,},{0x1f,0x40,0x3c,0x7a,0x75,0x50,0x31,0xc1,0x3c,0xa6,0x3a,0xf5,0x76,0x35,0xdc,0x6e,0x2c,0x4f,0x23,0xbd,0x6b,0x1d,0x67,0xca,0x65,0xda,0x68,0xb0,0x99,0x43,0xc5,0x54,},{0xb5,0xa8,0x3a,0x11,0x7a,0x60,0x34,0x5a,0x67,0xe4,0xa6,0x65,0xf3,0x7d,0xe7,0x22,0xa6,0xec,0x03,0x91,0x38,0x29,0x38,0x99,0x59,0xf3,0x76,0xee,0x62,0x64,0x77,0xe6,0x54,0xac,0x8d,0x72,0x0f,0xc7,0x27,0xd4,0xbb,0x8f,0xe1,0x54,0x4f,0x5d,0x0b,0x0b,0x85,0x05,0x14,0x29,0x0b,0x24,0x27,0x3c,0x4c,0xd4,0xb7,0x3a,0xca,0x4a,0x53,0x00,},\"\\xf8\\xb9\\xd4\\xb0\\x27\\xeb\\xb1\\x0e\\xe5\\x11\\x81\\x9e\\x6e\\x56\\xfb\\x1b\\xa9\\x58\\x40\\x18\\x41\\x8d\\x82\\x88\\x5a\\x38\\xa4\\x49\\x08\\x60\\x07\\xb8\\x78\\x5b\\x51\\x05\\xca\\xf7\\x82\\xbf\\x9b\\x36\\xda\\x03\\x9c\\xc6\\x0e\\x22\\x7c\\x7e\\x16\\x14\\xf2\\x9b\\x64\\x0b\\x1e\\x9b\\x22\\x74\\x7e\\xea\\x7a\\x67\\x25\\x61\\x4e\\x89\\xe0\\x78\\x3e\\xbe\\xbb\\xb7\\xee\\x55\\x7e\\xf3\\x6b\\x2b\\x46\\xcf\\x64\\x61\\xe5\\xbe\\x2a\\xd1\\xd7\\xa7\\xc2\\x71\\x1a\\x47\\x5c\\xa4\\xfb\\xc3\\x30\\x92\\xba\\x42\\x56\\x67\\xe3\\x4d\\x09\\x00\\x60\\x51\\x8f\\x2f\\xec\\x63\\x6b\\x04\\x91\\x23\\x87\\x6a\\xb2\\x1c\\x8b\\xd9\\xc5\\x0d\\xcc\\xb9\\x84\\xca\\x01\\x1a\\x02\\xee\\xa0\\x20\\x56\\x4f\\xa8\\x21\\xfc\\x36\\x2b\\xfe\\x39\\x2a\\xab\\x50\\xc2\\x73\\xfc\\x7b\\x5a\\x04\\x21\\x88\\xe3\\x31\\x62\\x1b\\x9d\\x2f\\x74\\x3e\\x5c\\x8c\\xf3\\xab\\x1f\\xaf\\xfa\\xfe\\x2a\\x00\\x04\\xc8\\xef\\x7c\\xdf\\x5e\\x6d\\xbb\\x5e\\xb5\\x44\\xe4\\x28\\x9f\\x71\\xa6\\xfd\\x15\\xc6\\x38\\xce\\x29\\xd2\\x8e\\xfb\\x9c\\x03\\x9e\\x47\\x74\\x29\\xa3\\x49\\x7a\\x83\\x82\\x7e\\x76\\xce\\x77\\xa4\\x98\\x16\\xd9\\x0b\\x41\\xa8\\xe1\\x52\\xf3\\x7a\\x09\\xe6\\x34\\x0d\\xfe\\x06\\x9a\\x4a\\xc6\\xf2\\x7d\\xd2\\xea\\xc7\\x47\\xfd\\x21\\xe3\\x15\\x20\\x88\\xc1\\xb1\\xec\\xd3\\x2a\\xc6\\x79\\x92\\x74\\x90\\x75\\x04\\x88\\xc2\\x91\\x78\\x51\\x47\\xb6\\x3b\\x0b\\x8f\\xf1\\x1d\\x18\\x9b\\x90\\x49\\xb8\\xa3\\x96\\xb6\\x93\\x2f\\x85\\xbd\\x6a\\x15\\xef\\xf9\\xf0\\xce\\x18\\x08\\x41\\x1a\\xf0\\xf9\\xc8\\xe6\\xe9\\x7b\\x81\\x4f\\x11\\x0b\\xd4\\xdf\\x13\\x86\\xa9\\x79\\x7d\\xc5\\x11\\xf0\\xaa\\xb6\\xab\\x65\\x07\\x1d\\x9e\\xa8\\x36\\x53\\x2c\\xec\\x51\\xb9\\x2c\\xa7\\xfb\\xdb\\x8d\\xe1\\xc8\\x43\\x66\\x58\\xde\\x2e\\xb6\\x5e\\xdd\\x86\\x04\\x4f\\x6c\\x1a\\xba\\x31\\x78\\x64\\x7a\\xd6\\x78\\x61\\x2e\\xe7\\x4f\\x04\\x6c\\xa3\\xc7\\xfe\\x2f\\x39\\xc0\\x9d\\xd2\\xe0\\x7d\\xf2\\xb4\\x22\\x70\\x85\\xfe\\x93\\x6e\\x79\\x4d\\x22\\xfd\\x5f\\x40\\xa2\\x5f\\x08\\x77\\x15\\x80\\xac\\x80\\x1d\\x98\\x89\\xf5\\xa7\\x6a\\xea\\xe1\\xf0\\xcc\\x4a\\x9e\\x1e\\xdb\\xdd\\xa3\\x75\\x0c\\x74\\xc8\\x50\\x52\\x4b\\x32\\xf4\\x49\\x33\\xfd\\x88\\x3b\\x53\\x72\\xbf\\xb7\\xe7\\x61\\xe0\\x69\\xfe\\x7c\\x1c\\x0e\\x7f\\xbd\\x4a\\x7f\\x58\\x46\\x7e\\xa6\\x88\\x3f\\x9d\\x5b\\x7f\\x66\\xd3\\x86\\xb0\\x49\\x9b\\xb6\\xfb\\x5e\\xad\\x89\\xc9\\xa1\\xfd\\x2c\\xce\\xb9\\x73\\xe2\\x87\\x9b\\x5d\\x03\\xea\\xa4\\x52\\xe1\\x60\\x22\\xd5\\x96\\x17\\xda\\xa0\\x48\\x6f\\x4d\\x4c\\x11\\x78\\x07\\xfd\\xa8\\x49\\x9d\\xfb\\x7a\\x28\\x6f\\xd2\\xf7\\x1a\\x8e\\xb5\\xfe\\x64\\x06\\x5c\\x41\\xe4\\xe1\\xe2\\x36\\x2a\\xb4\\xe4\\x77\\x96\\x9e\\x3a\\x40\\x8a\\x24\\x7e\\x3a\\x56\\xfc\\x86\\xf2\\xb0\\x1e\\xf8\\xd3\\xcd\\xda\\x87\\x25\\x82\\x34\\xbc\\x7f\\x25\\xb6\\x69\\x07\\xf3\\x64\\xb3\\x7b\\x62\\x45\\x29\\x6c\\x4f\\xdf\\x49\\x9f\\x20\\x23\\x7f\\x48\\x64\\x85\\x2f\\xc5\\xd8\\xcd\\x5d\\x05\\x41\\x8b\\xe8\\xb1\\x38\\x59\\xee\\x9a\\x43\\xe1\\x7e\\x1f\\x57\\xa4\\xc3\\x5e\\xa2\\x82\\xed\\x68\\xeb\\xcd\\xa6\\x82\\x81\\x74\\x24\\x5a\\x49\\xc6\\xcb\\x65\\x90\\xeb\\x1f\\x2d\\xcf\\xb0\\x07\\xbf\\xa1\\xc3\\x20\\x77\\x95\\x6d\\xa9\\xac\\xbe\\x3e\\xf0\\x72\\x37\\x99\\xfd\\xb8\\x69\\xd8\\xde\\x30\\x70\\x6a\\x9c\\x02\\x68\\x14\\xd1\\x6a\\x01\\xe0\\x33\\xc9\\x1b\\x59\\x07\\x0d\\xfe\\x44\\x5c\\x5b\\x84\\x8a\\x51\\x66\\x12\\xe5\\x13\\x1f\\xe8\\x48\\x69\\x21\\xe3\\x6b\\x8e\\x7e\\xf1\\x57\\xa8\\x88\\x22\\x88\\x6c\\x68\\x1b\\x5d\\xa7\\x1f\\xea\\x94\\xd9\\x57\\xda\\xfe\\xc2\\x6f\\x41\\x47\\xa3\\xb2\\xac\\x38\\x3a\\x5f\\x47\\xc8\\x58\\x5e\\xb1\\x7a\\x8a\\xc6\\x57\\x90\\x64\\x1b\\x42\\x18\\xd7\\x55\\xf8\\xbe\\xa4\\xd9\\x7a\\xe2\\xa4\\x5b\\xdc\\xdc\\x23\\x23\\x62\\x94\\xd8\\x52\\xc9\\x5d\\x08\\x40\\x6d\\x2e\\x9b\\xd3\\x0c\\x32\\x64\\x52\\x53\\x8c\\x1f\\x5e\\x50\\x04\\xd4\\xa1\\xa8\\x27\\x20\\xda\\x32\\xe5\\x9d\\xc3\\xab\\x18\\xea\\x08\\xa0\\x58\\xf7\\x91\\xd2\\x44\\x18\\x55\\x60\\x86\\xc1\\xe4\\xed\\xce\\x89\\x82\\xaa\\x23\\xb1\\x18\\xfb\\x26\\x6e\\x60\\xb5\\x42\\x78\\x0a\\x69\\x33\\xad\\xd9\\x13\\x26\\x55\\x12\\xc0\\x7b\\x11\\x49\\x78\\xd4\\x4a\\xf7\\x3b\\x20\\x30\\xec\\x47\\xb0\\x6f\\xd0\\x9d\\xda\\x8c\\x4f\\x1d\\x4e\\x31\\x37\\x75\\x46\\x8c\\x45\\x1f\\x9e\\xe6\\x11\\xe9\\xcd\\x4c\\x08\\x45\\xc2\\x50\\x19\\x48\\xa7\\xb1\\x4e\\xf1\\xd4\\xb5\\xcf\"},\n{{0xc4,0x37,0x0d,0x2a,0xaf,0x35,0xac,0xd1,0x58,0xfc,0x0d,0x16,0x22,0xa3,0x99,0xc9,0x9f,0x41,0xb9,0xda,0x4e,0x97,0x0b,0x35,0x4e,0x5b,0xa0,0x5c,0xbe,0x84,0x4c,0xa8,},{0x35,0x45,0xd7,0xd4,0xc9,0x5c,0x3d,0xb6,0xa5,0x45,0x30,0x53,0x7a,0xfa,0xfa,0x4d,0x86,0xdd,0xec,0xf9,0xcc,0x7e,0x66,0xc3,0x19,0xba,0x9f,0x7d,0xd7,0xd0,0x7e,0xe7,},{0x9f,0xeb,0xab,0x5a,0xe1,0x61,0xd6,0x92,0xa6,0xa3,0x94,0x50,0x0a,0x28,0x90,0xd2,0x1c,0x7f,0x0e,0xe2,0x6f,0x46,0x40,0xaa,0xba,0x4f,0xe6,0x6b,0x90,0xb8,0x9e,0xdc,0xb8,0x0e,0xa4,0xcd,0xca,0xbb,0x4d,0x2c,0x3a,0x5c,0x41,0x54,0xe8,0xff,0x20,0xd0,0xe2,0x37,0xfe,0xfd,0x00,0xc7,0xba,0x97,0x82,0xe1,0x74,0x8f,0x64,0x88,0xac,0x01,},\"\\x61\\x9f\\x57\\xde\\x2b\\x1d\\xba\\xee\\x20\\x9a\\x82\\x5d\\x8c\\xa9\\x7f\\x84\\xee\\x49\\xeb\\x12\\xa0\\xb1\\x3d\\xcd\\xd2\\xb3\\xa4\\xee\\x45\\xe0\\x17\\x6d\\x47\\x4c\\xf0\\x94\\x60\\xc8\\x31\\xa8\\xae\\x1d\\x3f\\x39\\xbe\\xeb\\xd0\\x88\\x08\\xb3\\xed\\x17\\x61\\x21\\x3b\\xa9\\x53\\x42\\x18\\x60\\xcc\\x07\\xe2\\xdb\\x31\\x2e\\x68\\x0d\\xf0\\x3e\\x60\\xa6\\x87\\x02\\x64\\xab\\xca\\x8f\\xd5\\x13\\x01\\xe1\\xc1\\x56\\x20\\x23\\xd8\\x02\\xcc\\xd5\\xc7\\xd1\\x96\\xdb\\x39\\xfb\\xb8\\x30\\x4b\\x0e\\x59\\xe3\\x33\\x16\\x41\\x92\\xec\\xc3\\x33\\x38\\x7e\\xef\\x69\\xc7\\xa7\\x8a\\x5d\\x11\\x25\\x88\\x62\\xd6\\xc2\\x81\\xb1\\x9c\\x0b\\xd3\\x36\\xcd\\x3e\\xdb\\x2f\\x9f\\xaa\\xd4\\x02\\x1a\\xc2\\xf2\\x05\\xc1\\x68\\x14\\xb3\\x85\\x48\\x43\\x3f\\xf9\\xed\\xdf\\xd6\\x11\\x33\\x77\\x97\\x69\\xdc\\x69\\xaf\\xac\\x65\\x8a\\xfc\\x1d\\x1b\\x41\\x6d\\x39\\x0a\\xd5\\xb4\\x5a\\x1a\\xd5\\xcc\\x4b\\x00\\xb4\\xb2\\x78\\xfb\\xe4\\xb5\\x9d\\x52\\xe6\\x1a\\x6a\\x5f\\xd0\\x02\\x41\\xc6\\xcb\\xc3\\x82\\xd2\\xd6\\x21\\xa3\\xde\\xd0\\x02\\x01\\x9b\\x33\\x05\\x60\\xe3\\x61\\xfa\\xab\\x28\\xf4\\x1d\\x1a\\xf9\\xc9\\xc0\\x02\\x0f\\x2b\\xaf\\x99\\xe8\\xd8\\xee\\x58\\xe3\\x12\\x22\\x02\\x14\\x7c\\x0a\\xdc\\x57\\xd6\\x70\\xc5\\xb3\\x80\\xaf\\x59\\x4c\\xc7\\xed\\x57\\xb8\\x7e\\xc6\\x67\\x4a\\xb6\\x3f\\x3a\\x98\\x49\\x75\\x3b\\x94\\x62\\xaa\\xb5\\xde\\x88\\xc9\\x48\\xa8\\xb1\\x09\\xaf\\x4d\\x49\\x54\\x92\\x7a\\xac\\x58\\xbe\\xe9\\x53\\xbe\\x0d\\x8d\\x7d\\x71\\xaa\\x11\\xd1\\x1f\\x1a\\x87\\xb1\\x47\\x7b\\x91\\x70\\xbd\\x73\\x5c\\xfc\\x24\\x49\\xf0\\x51\\xb8\\x2b\\xc5\\x9b\\x0b\\xee\\x76\\xa1\\x72\\xe8\\xd3\\x26\\x70\\xf5\\x1d\\xdd\\xdb\\x80\\x4a\\xd1\\x10\\xa5\\x65\\xe3\\x84\\xcd\\xb7\\x6f\\xad\\x04\\xcf\\xf6\\x78\\x93\\x09\\x1e\\x41\\xe6\\x9c\\xfd\\xf7\\x0e\\xa9\\x26\\xc2\\x63\\x69\\xa5\\xb6\\x19\\x3b\\x19\\xab\\x0a\\x62\\x55\\x8d\\xa5\\x5f\\xfa\\xfe\\xb8\\x78\\x97\\x57\\x71\\x06\\x44\\xaa\\x19\\xf4\\x74\\xbe\\x4a\\xda\\x9d\\xc1\\x84\\x9b\\x07\\xd5\\xe1\\x7b\\x85\\xf9\\x21\\xe1\\x01\\x6a\\x54\\xaa\\x60\\x95\\x77\\x72\\x53\\xa7\\x34\\x26\\xfc\\x78\\x64\\xb9\\x95\\x5f\\x04\\x90\\x70\\x23\\xdb\\x20\\x7f\\x85\\xdd\\x21\\xa6\\x51\\x06\\xcf\\x0d\\x62\\x23\\x85\\x87\\x0c\\x34\\xc2\\xda\\x9a\\x11\\xe4\\x72\\x63\\x95\\x12\\x1e\\x4a\\x67\\x61\\xfb\\x52\\x22\\x29\\xd9\\xe5\\xcc\\x9d\\xab\\x35\\xae\\xb8\\x7d\\x0d\\x79\\x69\\x3c\\x00\\x6f\\xde\\x1c\\xfa\\xf1\\x16\\x20\\x8b\\xba\\x96\\x20\\x59\\xcf\\xc0\\xd2\\xd6\\x37\\x0a\\xac\\x77\\x48\\x36\\x2e\\xe6\\xa0\\xa3\\xca\\x7b\\xf1\\x33\\xeb\\xcf\\xa2\\x0f\\x1c\\x4e\\xd8\\x30\\x7f\\x80\\x0c\\xca\\x7e\\x6c\\x4b\\xea\\xa3\\xfb\\x2a\\xb0\\x86\\x12\\x53\\x64\\x28\\x5c\\x44\\xed\\x1a\\x73\\x7a\\x67\\xcb\\xf3\\xb7\\x63\\xc9\\xf8\\xb1\\x42\\x7e\\x89\\xdf\\xa9\\x6d\\x29\\x0e\\x9d\\x48\\x42\\xfe\\x63\\x16\\xaf\\xef\\x83\\x4c\\xd8\\xcd\\x1f\\xdc\\x1f\\x12\\x4c\\xa3\\xfe\\x26\\x26\\x6d\\xa6\\x2e\\x27\\x5c\\x0b\\xf7\\xfc\\xc8\\xe5\\xf9\\xbb\\xa6\\xc0\\xd3\\x8e\\x23\\xfa\\xfa\\xb1\\xe0\\x49\\x48\\x17\\x94\\xc1\\x4f\\x4a\\x8c\\x53\\xbe\\x1c\\x96\\xf7\\x69\\xc9\\xb1\\x3e\\xac\\xa3\\x9a\\x0e\\x49\\x36\\x6d\\x2c\\x9f\\xfe\\x8f\\x20\\x63\\x60\\xa9\\xd5\\x03\\xde\\xc5\\x98\\x62\\x11\\x12\\xe3\\x77\\x67\\x13\\xe7\\xfc\\x06\\x49\\x43\\x3e\\x25\\x7e\\x50\\x3a\\x54\\x60\\x59\\xa9\\x89\\xda\\x89\\x15\\x7d\\x76\\x47\\x60\\x05\\xfd\\x90\\xe4\\xb0\\x7a\\xaf\\x0d\\xb0\\xbc\\x0b\\xc0\\xb6\\x7d\\xb8\\xdc\\xba\\xdf\\xf3\\x93\\x74\\xe1\\xaf\\xae\\x55\\x16\\x34\\xe0\\xe3\\x28\\x31\\xad\\x0e\\x5f\\xa7\\xd5\\x21\\x6f\\xa7\\xc6\\x44\\xf7\\x3e\\x1e\\x8e\\x07\\x23\\x83\\x94\\xa4\\x16\\xc1\\x69\\xaa\\x9d\\x53\\x03\\xf4\\x69\\xa5\\xd4\\x07\\x43\\x08\\x72\\x1f\\xfd\\xde\\xff\\x65\\x59\\xe5\\xad\\xf0\\xc2\\x77\\x3b\\x3f\\x52\\x64\\xe7\\xaa\\xa8\\xc2\\xdb\\x88\\x8e\\x28\\xe8\\x15\\xc7\\x10\\x69\\xc3\\xb4\\xce\\x6c\\x29\\x03\\x4c\\x0a\\xb3\\xb5\\xc1\\x9a\\x80\\xa9\\xd8\\xc2\\xe8\\x74\\x81\\x35\\x31\\xc4\\x22\\x75\\x2a\\xd6\\x2b\\x3c\\x5a\\x1a\\x3d\\x6c\\x5a\\x5d\\xb5\\x87\\x27\\x06\\x93\\xaa\\x75\\xd5\\xf1\\x72\\xee\\xdd\\xf4\\xeb\\x83\\x9b\\xd7\\x93\\xaf\\xfb\\x1c\\x79\\x6a\\x1d\\xf0\\xe4\\x42\\xdd\\xf9\\x9b\\x78\\x0a\\xa4\\x1e\\xea\\x0f\\xe6\\xf8\\x65\\xbb\\x53\\x9c\\xa5\\x3a\\xa4\\x5d\\xb9\\xa8\\x56\\xcb\\x75\\xd0\\x15\\x1d\\x35\\xed\\xea\\x80\\xf2\\x94\\x6d\"},\n{{0xbd,0x3d,0xe1,0xa1,0xd1,0x64,0xbd,0x6e,0x9b,0xe0,0xa6,0xd1,0x07,0xf7,0x03,0xa6,0xdd,0x91,0x4c,0x86,0x67,0xcd,0x34,0x1d,0x13,0x9f,0x19,0x57,0x8d,0x93,0x3b,0x16,},{0x9b,0x02,0x49,0x64,0xbd,0xfa,0x85,0x2e,0xb2,0xd4,0x14,0x4f,0x35,0xb7,0xcd,0xc2,0x67,0x81,0x14,0x3c,0x2b,0xd7,0xf6,0x60,0x23,0x3f,0x8b,0x8a,0xa3,0x60,0x71,0xee,},{0x13,0xcc,0x15,0x8f,0xd0,0x61,0x79,0x2f,0xce,0xd1,0x56,0x87,0x95,0x98,0x25,0x1d,0xd0,0x1d,0x57,0x5b,0x40,0x0f,0xe3,0xe3,0x9a,0x70,0x08,0x63,0xaa,0xe8,0xdb,0x1f,0x91,0x97,0xfa,0x50,0x1c,0x0c,0xf9,0x93,0xe4,0x4d,0x6a,0xc5,0x51,0x80,0xb8,0x69,0x83,0x8e,0x8a,0xe2,0x4b,0x21,0x4f,0xa3,0x5e,0x24,0x4b,0x7a,0x6c,0xff,0x6d,0x0d,},\"\\x17\\x69\\xfc\\xdb\\xf5\\x12\\x47\\xed\\x4c\\x83\\xa0\\x0b\\xbb\\xf0\\x2f\\x44\\x28\\xda\\x6f\\xce\\xdd\\xd0\\x16\\x1a\\x02\\xfc\\xcd\\x15\\x00\\x97\\x06\\x65\\xe1\\xc7\\x63\\x0a\\xd2\\x2e\\x3d\\x97\\x49\\xc7\\x92\\xe7\\x1a\\x26\\x0c\\xff\\xf6\\x05\\x32\\x56\\xe0\\x2f\\x5b\\x47\\xbb\\xa1\\x4b\\x76\\x1a\\xe5\\x3c\\xa7\\x21\\x9e\\xd2\\x80\\x1d\\x2d\\x78\\x8e\\x26\\x41\\x9f\\x36\\xc8\\x1e\\xf9\\x2c\\x23\\x03\\x68\\x37\\x35\\xc8\\xa1\\x75\\x6a\\xda\\xb6\\xa4\\x87\\x92\\x31\\x53\\xe4\\x35\\x60\\x3c\\x96\\xb2\\x39\\x55\\x3e\\xdf\\xde\\xb0\\x93\\x29\\x8f\\x7a\\xe7\\xdc\\x90\\xf1\\x6a\\x7e\\x56\\x64\\xb9\\xe4\\xc0\\x2b\\xa7\\x31\\xa2\\x3c\\xf2\\x23\\x4e\\x25\\x0a\\xc9\\x74\\x26\\x33\\xa9\\x32\\xa9\\x48\\xbb\\x83\\xdc\\x3d\\x79\\x4d\\x05\\x9f\\xed\\xf4\\xec\\x86\\x18\\xc7\\x43\\x3c\\x5d\\x8f\\xe5\\xe6\\x2c\\xf0\\x7b\\x57\\x68\\xc4\\xd9\\xb2\\x61\\xc7\\x15\\x36\\x80\\x4f\\xe2\\xe7\\xca\\x70\\x98\\x87\\x65\\x21\\xd5\\x76\\x77\\x36\\x14\\x24\\xe4\\x7f\\x1b\\x95\\x92\\x37\\xf9\\x07\\x10\\x42\\x1f\\x5b\\xc4\\xf1\\x09\\xf7\\xd4\\x89\\xc7\\x55\\xe9\\x4e\\xef\\xdf\\xb3\\xc8\\x5b\\x90\\xec\\x01\\x31\\x81\\xa2\\x3b\\xb9\\x53\\x5f\\xee\\xa4\\x94\\x1d\\x0a\\x06\\xa5\\x40\\xbd\\x6b\\x58\\x8e\\x55\\xb7\\xf3\\x57\\x57\\x14\\x9c\\xa3\\xe6\\x40\\x96\\x5e\\x1a\\x0f\\xf7\\xf3\\xc8\\x25\\x92\\x59\\x95\\x7f\\xf5\\xda\\xb9\\xfb\\x87\\x32\\xea\\xe7\\x19\\xb6\\x24\\xa4\\x49\\x28\\x78\\x17\\x9b\\x5a\\x83\\xab\\xe5\\x1c\\xaf\\x02\\x08\\x3d\\x73\\x7c\\xeb\\x4f\\xcf\\x04\\x2f\\x2e\\x60\\xba\\x02\\x97\\xac\\x72\\xb8\\x7f\\xe3\\xe1\\x4b\\xa5\\xfb\\xc5\\x4b\\x48\\x09\\x10\\x73\\x89\\x68\\x23\\xbf\\xa2\\x89\\xce\\x8e\\x16\\x87\\x3b\\x48\\x81\\x2c\\x32\\xbf\\xea\\x5f\\xf6\\xbb\\x22\\x1d\\x1e\\xa5\\x46\\x3d\\x32\\x5b\\xbe\\x31\\x1e\\x7f\\xd1\\xe7\\x83\\xde\\x65\\x0b\\x79\\x52\\xea\\xe4\\x61\\xd6\\x3b\\xc7\\x47\\x05\\x22\\xaf\\x5b\\x77\\x89\\xf8\\xfc\\x2e\\xb1\\x92\\xd2\\xcf\\x77\\x6c\\x5c\\x24\\xb4\\x4e\\x29\\xcd\\xb0\\xcc\\xcb\\x1d\\x90\\x36\\x14\\x38\\xe4\\x95\\x0f\\xf3\\x4d\\xbc\\xb3\\xcb\\x0e\\x81\\xcc\\x45\\xf8\\xd0\\xff\\x57\\x09\\x49\\xf7\\x80\\x84\\xe1\\x06\\x0f\\xf5\\x59\\x4a\\xd5\\x16\\xf5\\x0f\\x1c\\xb0\\xa7\\x65\\xe1\\xc0\\xe0\\x38\\xd5\\x94\\x3b\\x93\\x6e\\x4a\\x8b\\x49\\x33\\x54\\xe7\\x9a\\xbc\\x91\\x7b\\xb9\\x27\\x12\\x66\\xee\\xba\\x77\\xa9\\x3a\\x65\\x7f\\x9a\\xd8\\x7b\\x29\\x1a\\xc7\\xea\\x38\\x6f\\x5d\\x4f\\xcb\\xc5\\x82\\xe7\\x2d\\x5c\\x23\\xd9\\x2b\\xa9\\x44\\xb0\\x06\\x4c\\x20\\xe3\\xe2\\xdc\\xf5\\x04\\xbc\\xc7\\xc6\\x96\\x6c\\x63\\xf2\\x08\\x08\\x43\\x60\\x0b\\xa3\\x13\\xec\\x27\\xcb\\xa9\\x5e\\x7e\\xf3\\x18\\x16\\x8c\\x90\\x67\\xdc\\xe8\\x6c\\x1e\\xf0\\xd5\\xd9\\xeb\\x7a\\x61\\x58\\x48\\x9d\\xf3\\x2e\\xd5\\x8b\\x69\\x31\\x03\\x08\\x18\\xf0\\x07\\x05\\xa0\\xdc\\x55\\xd3\\xdb\\xf8\\x00\\x6a\\x85\\x46\\x64\\x1b\\x18\\x65\\xd9\\x19\\xbc\\x24\\x22\\x02\\xcb\\x3a\\xe3\\x00\\xbf\\x86\\x53\\xe3\\xb3\\x78\\x94\\xc3\\xdc\\x0e\\x47\\x7b\\x9d\\x7c\\x41\\xba\\xf8\\xd3\\x88\\x7c\\x2e\\xb5\\x9b\\x1e\\x4d\\x50\\xbb\\xb6\\xf1\\x79\\x2a\\x1c\\x93\\x67\\xc6\\x5c\\xdb\\x45\\x0c\\x2d\\xfa\\x21\\x45\\xe6\\x11\\xa9\\x7a\\xd8\\x1c\\xff\\x1f\\xd8\\x3c\\x6c\\xf7\\x23\\x09\\x47\\xea\\xff\\x4c\\x21\\xdc\\x1b\\xaf\\xb7\\x1e\\xc4\\x1e\\x5b\\xc7\\x2b\\x37\\x45\\xec\\x3e\\x38\\xbf\\x59\\x30\\xc1\\x26\\xd0\\x60\\xf0\\xc5\\x0a\\x89\\x5f\\x00\\x9a\\xa1\\x8e\\x87\\xf2\\x17\\x4f\\x58\\xab\\x53\\x79\\xa7\\x21\\xfd\\x83\\xaa\\xd5\\x51\\x7f\\xd9\\x9d\\xff\\x14\\x6e\\xde\\xea\\x61\\x52\\x12\\x35\\xe2\\xf1\\xa1\\x6e\\xe5\\x83\\x03\\xe0\\x91\\xbe\\x8d\\x57\\x90\\x94\\xc1\\xd8\\xa2\\x0b\\xc7\\x4a\\x55\\x0d\\x77\\xc0\\x0d\\x08\\x75\\x71\\x51\\x7a\\x63\\xcd\\x41\\x26\\x93\\x3a\\x4f\\x09\\xa0\\x70\\xbf\\x8e\\xa4\\xff\\xb8\\x46\\xa9\\x78\\x0e\\x97\\x34\\x04\\x3b\\xac\\x4c\\x0f\\xf4\\x7b\\x1a\\xfc\\xcf\\x52\\x93\\xac\\x14\\xbc\\x73\\xeb\\xf6\\x71\\x29\\x65\\x7e\\x4b\\x8a\\x8b\\x33\\xdd\\xac\\x7b\\x0f\\x4d\\x71\\x9d\\x2d\\xc6\\x5d\\xf6\\xea\\x0a\\x3f\\x24\\xcf\\x44\\xc8\\x33\\x8e\\xd6\\x01\\xa3\\x93\\x9c\\xa3\\x58\\xfc\\x4b\\xe1\\x3e\\x8e\\xde\\x02\\x75\\x39\\x71\\x2c\\xa2\\x3e\\x3f\\xfb\\xa7\\x06\\xe8\\xfd\\xd6\\x2a\\x07\\x4e\\xe0\\xad\\x74\\x20\\xf7\\x80\\x60\\xcc\\x96\\xfb\\x2a\\xbf\\x30\\xe9\\xea\\xa2\\x41\\xc0\\xf8\\x7e\\xbb\\xe3\\xec\\x73\\x51\\x75\\x96\\xf7\\xc3\\xc5\\xa8\\x0c\"},\n{{0xf6,0xae,0x51,0x6a,0x51,0x29,0x6f,0xc5,0x23,0xce,0xa5,0xf0,0x08,0xcf,0xbd,0x09,0xe7,0x3f,0x78,0xb6,0xfd,0xd3,0xb6,0x94,0x26,0x12,0x80,0x41,0xa5,0x60,0x4c,0xf9,},{0x37,0x6c,0x82,0xba,0x7b,0x87,0xaa,0x77,0x41,0x87,0x27,0xdb,0x33,0xd3,0x26,0xae,0x75,0x8b,0xf7,0xa1,0x35,0xc1,0x04,0x60,0xcd,0x8b,0xf8,0xfe,0xb8,0x3c,0x2b,0x10,},{0x0f,0xe4,0xdd,0x7e,0x1f,0x60,0x8e,0xe8,0x2b,0x7f,0xe8,0x63,0xd1,0xb0,0x3a,0x81,0x84,0x3c,0xe2,0x0c,0x76,0x2c,0xd8,0xbb,0x24,0xef,0xd4,0x6b,0xa0,0x25,0xff,0xf3,0x33,0x1d,0x87,0x57,0x52,0xca,0x72,0x20,0xc5,0x3d,0xd3,0xc7,0x1f,0x2b,0xc1,0xe2,0xc6,0x4a,0x2f,0x9c,0x58,0x86,0x5a,0x2a,0x24,0x48,0x09,0xf4,0x13,0x4e,0x53,0x07,},\"\\x83\\x42\\xf2\\x5a\\xc4\\xb1\\x7e\\xba\\xd6\\xf7\\x9b\\x9a\\x03\\x31\\x75\\xc7\\xf2\\x8a\\xf0\\x9e\\x65\\x8e\\x8c\\xb9\\x8c\\x29\\x4f\\x15\\xc3\\xc8\\x34\\x26\\x29\\xcb\\x2a\\x32\\x47\\xdf\\xc8\\x75\\xb8\\x2f\\x5b\\x38\\x0c\\x5d\\x11\\x42\\x6a\\x2e\\xeb\\x62\\x45\\x0b\\xd8\\x85\\x65\\x01\\x07\\xc6\\x83\\x62\\xa3\\xb7\\x2c\\xe8\\x23\\xf2\\xd1\\x59\\x42\\xb7\\xdd\\xa3\\x01\\xd2\\xfb\\x63\\x8f\\x30\\x2a\\xa9\\x57\\x0b\\x47\\x91\\x1d\\xad\\xd3\\xbd\\xdb\\xfe\\xd5\\x54\\xc1\\xc8\\x0b\\xd7\\x18\\x07\\x8b\\x8b\\xd2\\xc9\\xc3\\x14\\xa5\\x16\\x6f\\x26\\x5e\\x82\\x66\\xee\\x2d\\xb3\\x57\\x56\\x1a\\x55\\x85\\xc4\\x14\\xa7\\x84\\x0b\\xfa\\xe6\\x09\\xd7\\xcd\\xdd\\xe1\\xfa\\xde\\x85\\x56\\x0f\\x23\\xd6\\x38\\xef\\x3d\\x52\\xe5\\x1f\\x5c\\xf3\\x13\\xa0\\x72\\xc5\\xea\\x0f\\x81\\x7f\\x72\\x81\\xe2\\xcb\\xa5\\xc5\\xc8\\xd2\\x6c\\x92\\x85\\x92\\xb8\\x1f\\x0f\\xf8\\xcd\\x18\\xdb\\x5a\\x2c\\x41\\xd8\\x80\\xd7\\x44\\x73\\x86\\x3c\\x7b\\xbd\\x00\\x56\\xfa\\x4d\\x4a\\xfa\\xbd\\x17\\xa3\\xb8\\x9d\\x97\\xd3\\xfe\\x5d\\xc0\\x6b\\x0f\\x61\\x2a\\x1d\\x66\\x42\\x39\\x23\\xba\\x8d\\xfb\\xb8\\xec\\x82\\x46\\x62\\x4d\\x83\\x78\\x4e\\xba\\x4f\\x57\\x36\\xba\\x38\\x5e\\x44\\x22\\x96\\xc8\\xcb\\x0f\\x1b\\x68\\xe0\\x33\\x42\\xb2\\xc6\\xc1\\x03\\x34\\x6f\\x6d\\xd7\\x40\\xe2\\x6c\\x3d\\x13\\xca\\xef\\x80\\x1d\\x1b\\x26\\x21\\xd8\\x9f\\x06\\x93\\x91\\xa0\\x78\\xd4\\x3a\\xe6\\xff\\x12\\xee\\xca\\x66\\xbc\\x32\\x63\\x7b\\x45\\xf0\\xac\\x62\\x7c\\x2d\\x7b\\xbf\\x8a\\x49\\xd9\\x46\\x81\\x75\\xe2\\x68\\x85\\xe0\\x28\\x21\\xd3\\xa3\\xba\\xa2\\xc3\\xe3\\xa6\\xbb\\x96\\xb5\\x75\\x26\\xe2\\x24\\xcf\\x3d\\x85\\x9f\\x66\\x95\\x73\\xcb\\xd5\\xc8\\x73\\x93\\x74\\x61\\x56\\xf3\\xd1\\xc7\\xa8\\x03\\x08\\xdc\\x1f\\x24\\x05\\xbf\\x0d\\x40\\xbe\\x1c\\xa7\\x3b\\x76\\x7d\\xed\\xf4\\x03\\x13\\x37\\xc0\\x81\\xbf\\xa3\\xae\\x6e\\x54\\xf6\\x02\\x3f\\x42\\xf0\\xcb\\xd8\\x77\\x62\\xdb\\x55\\x91\\x3c\\x70\\x72\\x06\\x03\\x40\\x10\\xdf\\x2a\\xa8\\x75\\x3d\\x03\\x0f\\x03\\xc2\\x67\\xe7\\x1a\\x9d\\xd2\\xc6\\xc1\\x9d\\xe3\\xe1\\x85\\x1a\\xbf\\xac\\xbb\\xd5\\xdd\\x5b\\xf8\\x96\\xfa\\xb8\\xe4\\x15\\x31\\x7b\\x49\\xf1\\xe4\\x09\\x6e\\x3d\\xa9\\x9a\\x5b\\x5d\\x0a\\x3c\\x42\\xda\\xf9\\xde\\x94\\x84\\x7c\\x1e\\x53\\xc8\\x81\\x8a\\x5b\\x84\\x33\\x23\\xf5\\x01\\xe3\\xa7\\xfa\\x68\\xdf\\x89\\xa5\\xf4\\x1f\\x2c\\x62\\xc3\\x8d\\x17\\xf2\\x50\\xb0\\x2a\\x67\\xfa\\xe4\\x7d\\xaf\\x06\\x3f\\x55\\x89\\x42\\x37\\x7e\\xf8\\xa8\\x90\\x52\\xf1\\xa2\\x15\\xd7\\x68\\xf7\\x91\\x3a\\x7e\\xc1\\x4e\\x98\\xb8\\x1e\\x4b\\x2c\\xcf\\x26\\xba\\xca\\xd6\\xf3\\x96\\x64\\xaf\\xc0\\xe9\\x1a\\x3c\\xad\\x69\\x1d\\xb2\\xbf\\x56\\xa7\\xab\\x66\\x77\\xb4\\x95\\x96\\xdb\\x88\\x7c\\x97\\xde\\xf4\\x35\\x08\\xa7\\xa2\\xec\\x2a\\xb7\\x55\\xec\\x36\\x8e\\x2e\\x53\\xd1\\xe1\\x6b\\x60\\xff\\xf0\\x9c\\x3b\\x52\\x26\\x3f\\x0f\\x7c\\x1e\\xa9\\xcc\\x35\\x37\\x31\\x97\\xe9\\x5c\\x11\\xe6\\xd2\\x2f\\xa9\\xd8\\x29\\x9c\\x42\\x37\\x36\\xf5\\x81\\x4f\\x1e\\x79\\x8d\\x22\\x75\\x18\\x60\\x0d\\xf6\\xa7\\x90\\x35\\x8d\\xea\\xe3\\x8d\\x56\\x39\\xe1\\x98\\x3f\\xe0\\x18\\x43\\x6e\\xa5\\x8b\\xa8\\x46\\x75\\x48\\xc9\\x29\\xef\\xbb\\x16\\xdf\\xea\\x41\\x02\\x25\\x3a\\x35\\x0f\\xb8\\x4d\\x98\\x31\\xc4\\xc2\\xcb\\xcb\\x76\\xe1\\x8d\\x7f\\x3e\\x95\\x36\\x41\\xad\\xa4\\x14\\x21\\x39\\x30\\x91\\xe6\\x3d\\xfe\\x66\\xde\\x24\\xc9\\x92\\x32\\xc7\\xd6\\xa2\\x83\\x7a\\x48\\x98\\x3c\\xf5\\xb1\\x63\\x31\\xce\\x00\\x05\\x0d\\x1c\\x71\\x39\\x58\\xff\\xce\\x5f\\x2e\\x93\\x48\\xc5\\x2f\\x53\\x12\\x05\\x79\\xa7\\xc9\\xa1\\x60\\x08\\xd1\\x34\\x83\\x8e\\x59\\x61\\x29\\xc7\\x02\\xfc\\xd2\\x11\\x48\\xbd\\xf9\\x17\\x4d\\x48\\xe2\\xda\\x0a\\x8a\\x66\\x35\\x9e\\xde\\xe0\\x1c\\x50\\x09\\xef\\x67\\x42\\xfe\\xc4\\x1c\\x1a\\xce\\xcd\\x03\\xef\\xe1\\xcc\\xc9\\xb1\\x30\\xd6\\xe5\\xac\\x92\\x57\\x6a\\x85\\xcc\\xb7\\xcf\\xc7\\xd0\\xe4\\x23\\x31\\x06\\x17\\x29\\x31\\xa0\\x86\\x99\\x79\\x0b\\xc4\\x1a\\xcf\\xbb\\x73\\x1a\\xdb\\xb2\\x6d\\x56\\xb3\\x9a\\xaa\\x5b\\x33\\x3b\\xc1\\xa1\\x0e\\x2c\\x70\\x64\\xca\\x86\\x11\\x9d\\x8c\\x71\\x71\\x48\\xf9\\x24\\x41\\xaf\\x24\\xcd\\x2a\\xa8\\xf5\\x7c\\x86\\xba\\x38\\xa5\\x9a\\x10\\x0b\\x92\\x76\\xdf\\x38\\x27\\xec\\x7f\\xb4\\xd3\\xfa\\xf5\\x8b\\xe3\\x1c\\x6e\\xca\\xfd\\x69\\xcf\\x1c\\x64\\x10\\xa4\\x9c\\xd7\\x08\\x1f\\xf6\\xe9\\xfc\\x39\\x7c\\x2d\\x20\"},\n{{0x83,0xf7,0x89,0x90,0x0f,0x04,0x0d,0xc6,0x2f,0x4d,0x18,0x78,0x4c,0xb6,0x4b,0x63,0xc8,0x8e,0x8d,0x18,0x00,0x16,0x96,0xbb,0xeb,0x47,0x07,0xc4,0x69,0xd1,0x1a,0x5b,},{0xed,0xfc,0x2b,0xab,0x7e,0x79,0xf4,0x00,0x37,0xfe,0x4d,0x90,0x41,0xde,0x48,0xda,0x9a,0xee,0x8f,0x97,0x80,0x98,0xd7,0xb0,0xae,0x17,0x92,0x90,0x25,0xe4,0x27,0x3d,},{0xea,0x65,0x82,0xcc,0x23,0xe0,0x46,0x09,0x17,0xf7,0x82,0xd9,0x64,0xe3,0xbb,0x6d,0xcd,0xe0,0xae,0xea,0xc4,0x2c,0xc1,0x49,0x19,0xd3,0x6c,0xe7,0x8a,0xa0,0xaf,0xd9,0x80,0x72,0xf5,0x4c,0x79,0x5f,0xbf,0xd7,0xa4,0x1d,0x99,0xd7,0x06,0x06,0xc2,0x8a,0x5d,0xcf,0x19,0xbe,0x38,0xa0,0xce,0x2d,0x09,0xbb,0x8f,0x84,0x4c,0x31,0xbf,0x00,},\"\\x6c\\x11\\x2a\\x20\\xd3\\x06\\x57\\xab\\x5f\\x8c\\x5c\\x04\\x47\\x8d\\x6c\\x42\\xd1\\xc6\\xbd\\xef\\x38\\xcd\\x4f\\xe0\\x06\\xac\\x2a\\x57\\xe2\\x90\\xff\\x29\\x28\\x78\\x96\\xee\\xa8\\xc3\\x0a\\x01\\x39\\xc1\\x8f\\xc8\\xc9\\x75\\x64\\x56\\x3e\\x86\\xc8\\xd3\\x40\\x56\\xa6\\x71\\x9b\\xfe\\x47\\x9d\\x9e\\x87\\xe8\\x1b\\x19\\x45\\x23\\x31\\xbf\\xa1\\x54\\x80\\x68\\x82\\xe5\\x03\\x9a\\x20\\xc9\\xe9\\x54\\xb1\\xfc\\x7c\\x01\\x5d\\xcf\\x58\\x15\\xbd\\x7c\\xf7\\xb6\\x35\\x7d\\xf9\\x28\\x0b\\x9b\\xd4\\x3f\\x89\\xff\\xc9\\x19\\x45\\x32\\x3b\\x5a\\xcb\\x2a\\xe0\\x02\\x54\\xd4\\x16\\x28\\x68\\xd1\\xc8\\x3e\\xc6\\xe0\\xfc\\xbe\\x7a\\x8a\\xb9\\x25\\x41\\x92\\x14\\x9c\\x6b\\xc9\\xe5\\xfe\\x35\\x06\\x94\\x16\\x5d\\x66\\x38\\x33\\x1e\\xb2\\x4e\\x3b\\x13\\x90\\xc6\\x98\\xc4\\x83\\x83\\x78\\xc0\\x1b\\x2c\\x61\\xa3\\xeb\\xe2\\xc0\\x60\\xb9\\x8b\\xa6\\xee\\x02\\xb5\\x19\\xb4\\xea\\xc1\\xe0\\xbc\\xc0\\x9b\\x23\\x24\\xcc\\xf5\\xb1\\xa7\\xfe\\x8f\\xd0\\xb1\\x54\\x5a\\x94\\x27\\x83\\x2a\\xbb\\x25\\x74\\x4e\\xeb\\x36\\x32\\x6b\\xe6\\x4e\\xfe\\xd3\\xa7\\xb0\\x7d\\x63\\x0a\\x21\\xc3\\x08\\x1b\\x55\\x26\\x1c\\x35\\x32\\x87\\xc6\\x6c\\x57\\x66\\x3a\\x99\\xdb\\x46\\x6a\\x5d\\xee\\x22\\x74\\x6b\\x81\\xc7\\x50\\xef\\x85\\xbe\\x51\\x14\\x3e\\x22\\x1e\\xcd\\xf1\\x14\\xfe\\xf1\\xb3\\x08\\x2f\\xf5\\x4f\\xd0\\x44\\xbc\\x88\\x4b\\xfb\\x3c\\xc5\\xc5\\x33\\x59\\x97\\x00\\x98\\x67\\xce\\x94\\x91\\xa8\\x0f\\xe6\\x96\\x82\\x5f\\x99\\x42\\x6d\\xef\\xab\\x6a\\x49\\xba\\xdc\\xde\\x40\\x3f\\x58\\xe8\\x31\\x79\\x66\\x21\\x07\\x47\\xb5\\x67\\x75\\x4d\\xe5\\x30\\x76\\xb3\\xec\\xbf\\x65\\x34\\x6c\\xb8\\x39\\x05\\x83\\x2e\\x16\\xd0\\x1b\\x50\\xb9\\x3d\\x37\\xeb\\x9b\\xfe\\x20\\x17\\x2a\\x31\\x63\\x0d\\x25\\xf3\\x21\\x7d\\x87\\xd9\\x34\\x65\\xfd\\x8a\\xc5\\x54\\xcb\\xbb\\x39\\xd9\\x82\\xea\\xd7\\x21\\x93\\x91\\x23\\x4c\\x88\\x9f\\x0b\\x92\\xa2\\xe0\\x41\\x3d\\x86\\x6c\\xac\\x08\\x7d\\x62\\x8c\\xe3\\x1c\\x61\\xc6\\x32\\x3e\\xcb\\x8e\\x68\\x95\\x55\\xaf\\x10\\xde\\x2b\\x65\\x6e\\x6a\\xea\\x2c\\xde\\x93\\x2e\\x24\\x1f\\x6d\\x1f\\x8a\\x9e\\x33\\x16\\xcf\\x13\\xf1\\x35\\xac\\xef\\x83\\xa0\\xc0\\xcf\\x22\\xf9\\x5c\\xa8\\x18\\xe6\\x1f\\x92\\x76\\x87\\x74\\xc6\\x30\\xe0\\x92\\x5b\\xe9\\x9d\\xbd\\x32\\xb4\\x99\\xc0\\xfe\\x7d\\x84\\xa4\\x2e\\x39\\x32\\x87\\xf6\\xf5\\xce\\x3d\\x0b\\x27\\x1f\\x17\\x00\\x45\\xa6\\xd4\\x8e\\xab\\x31\\x6f\\xe1\\x7b\\x18\\x58\\xb1\\xff\\xee\\xe9\\x08\\x88\\xf3\\xa3\\x7a\\x24\\x80\\xdf\\xd0\\x4a\\x4a\\x86\\x29\\xf8\\x68\\xb5\\xc0\\xa8\\x0e\\xe1\\xf0\\x37\\x19\\xf3\\xa4\\x7d\\x40\\x95\\xbe\\xf1\\x0e\\x02\\x34\\xfc\\x30\\x0e\\x2a\\xf4\\x82\\x28\\x5d\\x78\\x93\\x79\\x68\\x31\\x9d\\xa9\\x4b\\xeb\\x6c\\x40\\xe0\\x78\\x57\\x7c\\x02\\x4f\\x3a\\x5c\\xda\\x00\\x84\\xe2\\xf8\\x55\\xa9\\x39\\x6a\\xaa\\x9e\\xe9\\xbf\\xaf\\x2c\\xc7\\x71\\xfe\\x68\\xc4\\x0b\\x62\\x9e\\x8d\\xcf\\x11\\x5e\\xf0\\x3e\\x75\\x7a\\x2a\\xc9\\xee\\xf0\\x73\\xf1\\xbd\\xf9\\xc5\\xa4\\x41\\x00\\x31\\x55\\x8a\\x6d\\x38\\x2b\\x5f\\x16\\x02\\x4b\\x15\\x1b\\x1c\\x01\\xee\\x78\\x17\\x41\\x3a\\x3c\\x4d\\xe9\\xdd\\x64\\x78\\x78\\x5b\\x81\\x10\\x1d\\xf5\\x52\\x24\\x30\\x05\\x87\\x80\\x20\\x7e\\x79\\x0f\\x61\\x2d\\x78\\xe5\\x70\\x5c\\xee\\xd4\\x6b\\x0e\\xc0\\x75\\xe7\\xc1\\xdc\\x07\\x3b\\x17\\xb2\\xb4\\x3d\\x72\\x53\\x59\\x27\\xbf\\xd2\\x71\\xe9\\x2e\\x3c\\x93\\x63\\x8e\\x40\\xa9\\x60\\x1d\\xc2\\xc1\\xab\\x76\\xd9\\x1a\\x41\\x03\\xdf\\x65\\x7d\\x91\\x1c\\x82\\x9e\\xe8\\xa5\\xf7\\x47\\xf7\\x64\\x2f\\x5a\\x91\\x5a\\x5f\\x40\\xf6\\x30\\xb4\\x30\\x39\\xc7\\xd4\\xbd\\x2a\\xd2\\xb3\\x21\\x29\\xd9\\x4e\\x5b\\x2f\\x03\\xad\\x4a\\x3d\\x45\\x57\\x7e\\xb8\\x1f\\x36\\x9c\\x9e\\x3e\\x2a\\x4f\\x6a\\x8e\\x41\\xac\\xf8\\x28\\x3b\\xe5\\x84\\x25\\xea\\x99\\x3b\\x8e\\x98\\xee\\xa6\\x33\\x05\\x56\\x64\\x86\\x18\\xda\\xd9\\x8f\\xa2\\x55\\x62\\x0d\\x83\\x6d\\x3c\\x7f\\x29\\xb9\\x07\\x89\\x58\\x49\\x28\\x61\\x67\\xc7\\x18\\x1e\\x2c\\xaf\\x55\\xc2\\xc1\\x84\\xa9\\xa9\\x11\\xf8\\xe4\\x1c\\xb0\\x42\\xe2\\xcd\\x48\\xb0\\x54\\x4e\\xa7\\x9f\\xe2\\xef\\x38\\x1e\\xbc\\x5b\\x15\\xe3\\x9a\\x9b\\x5c\\x6d\\x99\\x8f\\xae\\xaa\\xa7\\x77\\x3c\\xfe\\xc0\\x84\\xc0\\xbf\\xae\\xd1\\xbc\\xab\\x96\\x3a\\x4e\\xf3\\xd9\\x4d\\xbb\\x3d\\xfe\\x72\\x4c\\x04\\x0c\\xe4\\xd1\\xe2\\xee\\x7f\\xc2\\xda\\x4b\\x25\\x12\\x7c\\xe3\\xa5\\xdf\\x69\\x3f\\xcf\\x5a\\x6e\\xd1\"},\n{{0x43,0xbf,0xf3,0xcd,0xd5,0x30,0x7e,0xd7,0xd2,0x5c,0xf9,0x6f,0xdb,0xba,0x64,0xab,0x18,0x11,0xc8,0xbb,0x93,0x4e,0x21,0x87,0xea,0x7f,0xfc,0x01,0x8d,0x85,0xe0,0xf2,},{0x00,0xf1,0xb5,0xd3,0xca,0xc6,0xe5,0x6c,0xa5,0xf8,0x94,0xd4,0xcd,0xbf,0x9b,0xeb,0xd9,0x68,0xd2,0x4d,0x5e,0xff,0xa5,0x05,0x8b,0x0e,0x20,0xbb,0x08,0x98,0xf6,0xf1,},{0xa6,0xb5,0x6b,0x76,0x86,0xdf,0x1d,0xc5,0xf4,0xed,0x54,0x4a,0x4d,0x97,0xe6,0x70,0x36,0x19,0x5a,0x32,0xb2,0x2e,0xcd,0x5d,0x31,0xea,0x17,0x30,0xe6,0xed,0x8f,0x81,0x0d,0x25,0x8b,0x44,0xc0,0x8e,0xa4,0x5f,0x03,0x2b,0x93,0x74,0x41,0xb7,0x2c,0xd0,0xdc,0x37,0x55,0x6f,0xd7,0x87,0x4e,0x9f,0xe6,0x4f,0x15,0x76,0x5c,0x52,0x10,0x03,},\"\\x64\\x6f\\x8b\\x34\\x18\\x2d\\x5e\\x60\\x2b\\x51\\xca\\x73\\x29\\x34\\x7c\\x0e\\x19\\x8c\\xb7\\x47\\xe4\\xda\\x0a\\x6b\\x80\\xf3\\xf6\\xf9\\xf3\\x36\\xf6\\x70\\x8d\\x85\\xcb\\x42\\x9a\\xb2\\xd6\\xbe\\xd3\\x5d\\x50\\x13\\x12\\x9c\\xd1\\x00\\x14\\x2c\\xdd\\xce\\xe8\\x63\\x51\\x79\\x02\\x1b\\x3e\\x24\\x92\\x2b\\x81\\xae\\xf1\\x3c\\x13\\x70\\x28\\x69\\x39\\xd6\\x3d\\x6b\\x6a\\x41\\x95\\xed\\xa1\\xd8\\x12\\xca\\x51\\x82\\x04\\x76\\x8f\\x87\\x34\\x8c\\x68\\x89\\x55\\x2c\\x63\\xd1\\x37\\x2c\\xde\\x6a\\x5e\\x9d\\xaa\\x7f\\x84\\x45\\xec\\x8d\\x61\\x30\\xa3\\xf5\\xae\\xf0\\xed\\xea\\xce\\x01\\x0b\\x6c\\x7f\\x0b\\x9d\\x24\\x16\\x2a\\x8d\\x04\\x45\\x4b\\x81\\xd4\\x8e\\xa9\\x09\\x7b\\xd8\\xdf\\x09\\x34\\x59\\x71\\x9c\\xcb\\x54\\xaa\\x10\\xf5\\x1c\\x24\\x6a\\xa9\\x9c\\x58\\x0b\\xea\\xf9\\xc9\\xc5\\xbc\\x60\\xfa\\xf0\\xae\\x5c\\xec\\x7f\\x51\\x37\\xf6\\xc5\\xc1\\x44\\xdf\\x45\\xd1\\x2e\\xe9\\x95\\xad\\xcc\\xf2\\x5a\\x9d\\xb8\\x1b\\x85\\x58\\xbd\\xfb\\x65\\x83\\x01\\x86\\xe7\\xb9\\xd4\\xee\\xd9\\xf6\\xb4\\xd7\\x32\\xb1\\xb5\\x82\\x2d\\x03\\xeb\\x01\\x7c\\x07\\x24\\xf4\\x8f\\x87\\xba\\xaa\\xe1\\x04\\x5d\\x6f\\xdb\\x12\\x5c\\x91\\x34\\x06\\x4f\\xaf\\x18\\xdb\\xed\\x58\\xd8\\xfb\\xac\\xea\\xcd\\x4f\\x09\\x7d\\xf9\\xb3\\x42\\xe5\\xc4\\xa5\\xbc\\x85\\xb2\\x95\\x97\\xd4\\xb6\\x40\\xf1\\x55\\x1c\\x5b\\x62\\x4a\\xb2\\x1b\\x48\\xe9\\x4a\\x90\\x30\\x04\\x9b\\xe1\\xf0\\x5a\\xa8\\x51\\xd0\\x82\\x7e\\xaf\\x87\\x00\\xdf\\xe1\\x47\\xfd\\xcd\\xee\\xdb\\xc9\\x8c\\x4f\\x15\\x77\\x4f\\x01\\x20\\xfb\\x59\\x70\\xa2\\xf8\\xb2\\x17\\x94\\x34\\x0b\\x62\\x83\\x79\\xa8\\x02\\xb9\\xf7\\xc0\\x68\\xb0\\xdf\\x63\\x19\\x3e\\x51\\x0f\\xc7\\xb2\\xaf\\x97\\xee\\x38\\xde\\x47\\x92\\x97\\x85\\x53\\x55\\x28\\xd3\\x50\\xd8\\x86\\x20\\x61\\x0c\\xfd\\xb5\\x5d\\x24\\x9e\\x38\\xfb\\x73\\xc8\\x28\\x71\\x13\\x91\\x9c\\xe3\\x32\\x67\\xd7\\xdb\\x92\\x4e\\x49\\x19\\xa4\\x4e\\x6e\\x29\\xa9\\x0d\\xbe\\x3b\\x7b\\x0d\\x39\\x21\\x16\\x3f\\xeb\\x5a\\xc1\\x05\\x62\\x4e\\xd8\\x52\\xbe\\xce\\x35\\x38\\xe9\\x91\\x93\\x30\\x0c\\x89\\x33\\x45\\x69\\x93\\x50\\xa8\\xf9\\x9e\\x8c\\x6a\\x41\\x09\\x5f\\xc9\\xfc\\x08\\xda\\x07\\xf7\\x57\\x11\\xf7\\xdf\\x03\\x44\\x06\\xde\\x14\\xed\\xd8\\xe2\\x2a\\x63\\x3a\\x86\\xe4\\xa5\\xa5\\xc9\\x75\\xac\\x5d\\x34\\x89\\x1c\\xcc\\xfc\\x85\\x43\\x77\\x1f\\xfa\\x08\\x0e\\x0b\\x45\\xd6\\x5a\\xb8\\x30\\xa3\\x61\\xac\\x4c\\x42\\x62\\x94\\xd3\\x68\\x5e\\xa8\\xc2\\x60\\x39\\xc7\\x1c\\x90\\xfc\\x3f\\xb5\\x12\\xbe\\x9f\\xc9\\x48\\x07\\xd7\\x6d\\xbd\\xaf\\x8f\\xfa\\xa4\\xfb\\xf9\\x84\\x9d\\x68\\xe8\\xa5\\x7d\\x30\\xc4\\xa0\\xb9\\x73\\x5c\\x23\\xf0\\x8e\\xf2\\xe2\\x84\\x45\\x84\\x67\\xe1\\x5d\\x66\\x53\\x62\\xcb\\x64\\x6f\\xde\\x69\\x37\\xec\\xba\\x53\\x09\\x12\\x64\\x63\\x83\\x57\\xa7\\x22\\x42\\x5b\\xc6\\x2d\\x1e\\x30\\xec\\x5f\\x0d\\xd8\\xfe\\xa2\\x6b\\x2e\\xa4\\xa8\\x49\\x00\\x35\\xde\\x43\\xf2\\x74\\x84\\x6f\\xb0\\xcf\\x02\\x09\\xec\\x74\\x37\\xf3\\xc3\\xd0\\xa5\\x60\\x37\\x3d\\x03\\x4e\\x5f\\xd7\\x9e\\x25\\xb6\\x42\\x4d\\x9b\\x2c\\x17\\x61\\x63\\x2b\\x35\\xa1\\x21\\x32\\x52\\x18\\x27\\x34\\x5c\\x55\\xe4\\xe7\\x14\\x2d\\xd6\\xfe\\x94\\xd6\\x20\\xfe\\x51\\x5c\\x15\\x3e\\x83\\x95\\xb5\\xd1\\x30\\xc7\\x44\\x13\\x9b\\x6a\\x92\\xef\\xd3\\x7f\\x22\\xba\\x13\\xfe\\x4c\\x09\\x53\\x73\\x55\\x0e\\x2e\\x4f\\xcb\\xa0\\x32\\x5b\\x3e\\xa3\\xb9\\xfe\\x25\\xcc\\x7d\\xd9\\x2c\\xbf\\x42\\xe1\\x5f\\x45\\x54\\xb7\\x7a\\xc2\\x7a\\x4a\\x34\\x63\\x82\\xff\\x61\\x00\\x45\\x15\\x08\\xd6\\x02\\xcf\\x64\\x3f\\x60\\xb6\\xca\\x42\\x86\\x35\\x6f\\x21\\xa3\\x11\\x0d\\x4e\\x2c\\x8a\\x89\\x62\\xa7\\x80\\xfc\\xff\\x43\\x9b\\x3a\\xa8\\x04\\x99\\xdf\\x27\\x0f\\xc3\\xe6\\xca\\xd8\\x89\\x33\\x48\\x87\\x2f\\x0f\\x70\\x2f\\x93\\x90\\x00\\x0c\\x7f\\x6e\\x06\\x27\\xd2\\xbb\\xb7\\xb7\\xce\\xf5\\xc4\\xda\\x25\\xda\\xdf\\xea\\x80\\x32\\xe5\\x02\\x32\\x97\\xa7\\x0a\\x65\\x8e\\x9a\\xe7\\x3b\\xdd\\xc3\\xb2\\x27\\xa1\\xc1\\x17\\x41\\x13\\x3f\\x01\\x2f\\x0f\\x48\\xfe\\x26\\x44\\x6f\\xa6\\x7e\\x64\\x72\\x0f\\xc8\\xdc\\x97\\xf3\\x0d\\x0d\\xd0\\x26\\xf6\\xdc\\x21\\x64\\xea\\xd8\\x57\\x82\\x4a\\x0a\\x7a\\xeb\\x20\\xf1\\x15\\xd5\\x0d\\x1b\\x65\\xdd\\x5d\\x82\\xe0\\x9a\\xbe\\x83\\x4e\\x8c\\xa8\\x89\\x57\\xe3\\x99\\x84\\x82\\x49\\x55\\xa1\\xa1\\x3e\\x3b\\x94\\xa0\\x01\\x57\\x18\\x6d\\xcd\\xc2\\x89\\xe3\\x4b\\x67\\x8c\\x91\\xcb\\x2a\\x1a\"},\n{{0x06,0x3b,0x90,0x25,0xe3,0x21,0xe9,0x72,0xd6,0x53,0xa0,0x62,0xbe,0x34,0xf9,0x93,0x65,0xaf,0xfd,0xcc,0x98,0xec,0x9f,0xf4,0x3e,0xf4,0x22,0xbe,0x0f,0x80,0x44,0x60,},{0x10,0xd0,0x1a,0x63,0x01,0x2a,0xc0,0x99,0x56,0xba,0x9e,0xd6,0x1d,0xf3,0x5b,0xb7,0xaf,0xe3,0x65,0x8b,0xb3,0x00,0x48,0x52,0xe4,0x71,0x74,0xbd,0x07,0xdd,0x4d,0xe7,},{0x85,0xc8,0x1d,0x6b,0x0d,0x85,0x78,0xfa,0x58,0xe1,0x3a,0xb3,0x91,0x00,0x15,0x28,0xb4,0x6a,0x1d,0x63,0xa0,0x32,0x7c,0x7a,0x4a,0x04,0x08,0x7f,0xc6,0x68,0x75,0x8a,0xa6,0x5c,0x01,0xd5,0xa1,0x50,0xf9,0x35,0x67,0x4e,0xf3,0x07,0x50,0x7e,0x6f,0x4c,0x91,0xe1,0xfc,0x35,0x00,0xb2,0x6f,0x64,0x9b,0xee,0xa8,0x7d,0x27,0x56,0x37,0x04,},\"\\xa7\\xee\\xd2\\x96\\x52\\x84\\x4e\\xe0\\x04\\x9b\\xaf\\xb2\\xcf\\x63\\x40\\x29\\x71\\x02\\x0d\\x7e\\x65\\xc1\\x0b\\x91\\xac\\x57\\x26\\xee\\xa8\\x6f\\x40\\xdb\\xc5\\x3c\\x3f\\x0a\\xbe\\xde\\xba\\xf6\\xcc\\x44\\x9b\\x4f\\xea\\x48\\xc0\\x15\\xfe\\x4d\\x90\\x7b\\x3e\\x55\\x05\\xcf\\xf5\\x0a\\x12\\x18\\x19\\xa2\\xe4\\xa8\\xa2\\x96\\xd5\\x75\\x10\\x15\\xbb\\xcd\\x7e\\xf6\\xfb\\x7c\\x27\\x27\\xbb\\x00\\x0b\\xe1\\x34\\x2a\\x7d\\x14\\xbc\\xa9\\x79\\x04\\xed\\xfe\\x8b\\x18\\xdd\\xb6\\x39\\x33\\x41\\x83\\x27\\xa5\\xaf\\x81\\x7e\\x95\\xba\\xd7\\x4e\\xb7\\x90\\x20\\x36\\x15\\xd0\\x82\\xe7\\x14\\x93\\xea\\xd4\\x7c\\xcc\\x09\\x01\\xa2\\xca\\x9f\\x50\\x13\\x3c\\x44\\xef\\x85\\x08\\xd5\\x1f\\xb7\\x3c\\x61\\x6f\\x01\\x47\\x53\\x22\\x45\\x82\\x2d\\xd1\\x02\\xb3\\x37\\xa1\\xb2\\xaa\\xe2\\xef\\xc7\\x2d\\xca\\x7a\\x94\\x19\\xd5\\x98\\xa6\\x47\\x52\\x33\\xdc\\x1a\\x4e\\xe0\\xec\\x6d\\x05\\xda\\x12\\xa2\\xb2\\x87\\xcb\\x77\\xff\\xaf\\xdd\\xe2\\xd0\\xac\\xc2\\x81\\x99\\x93\\x3e\\x66\\x21\\xee\\xc1\\x6a\\xb4\\x24\\x51\\x70\\xcf\\x02\\xda\\x80\\xd4\\x92\\x26\\x31\\xa2\\x32\\x72\\x91\\x51\\x65\\xad\\x88\\x72\\x27\\x50\\x03\\x5d\\x2a\\x09\\x77\\xbc\\x79\\x1d\\x14\\xfb\\x3d\\x8c\\xb0\\x2b\\xc7\\x7f\\x7c\\x71\\xbe\\x52\\x42\\x62\\x9a\\x4c\\x9a\\x58\\x8d\\xfd\\xde\\x95\\x78\\x49\\x4d\\x8b\\xaa\\x4e\\x68\\xf5\\x19\\x4b\\x80\\x02\\xc8\\xe3\\x78\\xa0\\xe8\\x33\\xb7\\xc1\\xa9\\x69\\x81\\xc4\\xfb\\x05\\xe4\\x57\\xff\\x48\\x26\\x0b\\x72\\x49\\x3c\\xbc\\xb8\\x2a\\xe1\\x16\\x73\\xd1\\x4c\\xee\\x85\\x28\\x8f\\x63\\x70\\xbd\\x4b\\xca\\x92\\x51\\xa7\\xe2\\x14\\xc3\\xeb\\x79\\xe7\\xbb\\x6f\\xce\\xbb\\x16\\xc9\\xe0\\x56\\xf2\\x9b\\x62\\x72\\x74\\x3e\\xfa\\x6f\\xe8\\xbf\\xd2\\x55\\x97\\xce\\x86\\x89\\x8a\\xb3\\x05\\x9e\\xb0\\x23\\x1c\\x73\\xb5\\x30\\x59\\x03\\xfd\\x13\\x19\\xbd\\xf4\\x9e\\x59\\x9d\\x8b\\xbc\\xd7\\x4a\\x8b\\x97\\x67\\x30\\x8b\\x61\\x56\\x3c\\xcb\\xac\\xd3\\x8f\\xc5\\x0c\\x83\\xab\\x44\\xca\\x75\\x9d\\xc9\\xb6\\x5b\\x2a\\x4b\\x54\\x7c\\x50\\x97\\xf2\\x20\\xc1\\xc8\\x8b\\x2b\\x0a\\x48\\xf6\\x5f\\x91\\xfe\\x78\\xb1\\x50\\x12\\x78\\xe1\\xe3\\x04\\xde\\x58\\xb4\\xc8\\x2a\\x5c\\x39\\x99\\x81\\x09\\x8a\\x17\\x84\\xeb\\x90\\x42\\x50\\x18\\x59\\xf2\\xa9\\x3f\\x31\\x7e\\x41\\x77\\x2f\\xd5\\x2f\\x97\\x2e\\x51\\xb0\\x7e\\xd9\\x4d\\x31\\x4e\\x1d\\x1a\\xf4\\xed\\x82\\x90\\x9a\\x0b\\xef\\x67\\x1f\\x54\\xb5\\x5d\\xb7\\xb7\\x0d\\xa1\\xf7\\x18\\xc8\\xe6\\x48\\xae\\xdd\\x6d\\xa6\\x4b\\x05\\x77\\x05\\x26\\xf1\\x2b\\xc4\\x3f\\x68\\xb9\\x55\\x48\\xda\\xc5\\x08\\x09\\xa6\\x87\\xdb\\x97\\xd7\\x3f\\x06\\xf4\\x7e\\xd0\\x88\\x31\\xb6\\x0a\\x28\\xe9\\x82\\x92\\x06\\x32\\x05\\x8f\\x0e\\x6c\\x90\\xc0\\x18\\x7f\\xf4\\x45\\x64\\xf8\\x1e\\xfd\\x8f\\xd9\\x3e\\x32\\x7b\\xc6\\xd8\\x0b\\x49\\x0e\\x08\\x8b\\x9a\\x10\\x03\\x6c\\x80\\xdc\\xda\\xd4\\x9d\\x2b\\xe0\\x74\\xfb\\xba\\x31\\xe0\\x6f\\x71\\x80\\xe5\\xad\\x1c\\x88\\x23\\xd6\\x09\\x66\\xa9\\xce\\x15\\x50\\x3c\\xe6\\x0d\\xd4\\x0e\\x91\\xee\\xf2\\x35\\x9d\\x83\\xd7\\x0d\\x98\\x40\\x1d\\xde\\x7b\\xe3\\xc6\\xb0\\x7e\\x57\\xd4\\xe4\\x7d\\x04\\x21\\x76\\x33\\xd8\\xe2\\x63\\xca\\x34\\x8f\\x81\\xfb\\xe9\\xa4\\xa6\\x2f\\x45\\xd7\\x7c\\x84\\x3b\\x6b\\x1a\\xd2\\x84\\x66\\xd9\\xda\\xfb\\x1b\\x91\\x0b\\x34\\x8e\\xd8\\x7c\\x68\\x6c\\xab\\x29\\x2d\\x48\\x0c\\x19\\x1d\\x18\\x7b\\x40\\x4a\\x9b\\x1d\\x13\\x2b\\xa4\\xe2\\x93\\xd3\\xad\\xa9\\x91\\x72\\xac\\xc1\\x21\\xfe\\x66\\xb8\\x45\\xb9\\x8b\\x16\\x0c\\x58\\x23\\xf6\\x01\\xc7\\x75\\x8f\\xb2\\x6c\\xae\\xe8\\x57\\x01\\x59\\x5b\\x2d\\x52\\xca\\xa2\\xf5\\x68\\x8a\\xa2\\xbf\\x2f\\x6c\\x4b\\xb6\\x37\\xf8\\xe0\\x0f\\x49\\xab\\x6c\\x26\\xbc\\x6a\\xd8\\x9e\\x13\\x67\\xfd\\x28\\xe4\\x91\\x7d\\x25\\x08\\x93\\xa7\\xb3\\x2d\\x39\\x66\\x0b\\xde\\x8d\\xb4\\x9f\\x08\\x6f\\xb7\\x39\\xe5\\x60\\x12\\xc3\\x6b\\xea\\x0b\\x26\\xcf\\x6d\\x93\\x57\\x94\\x0b\\x00\\xd5\\xa4\\x52\\x8f\\x90\\x59\\xaa\\xf0\\x86\\x69\\xe5\\xf4\\x6c\\x99\\x5e\\x60\\xf8\\x87\\xb5\\xc4\\xab\\x88\\xac\\x74\\x42\\xed\\x01\\xa1\\x4c\\x6a\\x42\\x00\\x6b\\xaf\\x1f\\x34\\x3f\\xef\\xe3\\xe4\\xac\\xa8\\x43\\xa3\\x24\\xe1\\x76\\xb2\\xfe\\x7e\\xc7\\x88\\x3d\\x1c\\xbd\\x06\\x8b\\xc2\\xfc\\x96\\x2f\\xfa\\x60\\x24\\x4f\\x65\\x4c\\x77\\xac\\x56\\x50\\x81\\x7d\\xc0\\x84\\x46\\x55\\x45\\xa9\\x23\\x0a\\x74\\x82\\x6b\\x0c\\x50\\xeb\\x85\\x25\\x2a\\x88\\x6f\\xf2\\xb1\\xaf\\xea\\xf8\"},\n{{0x88,0x3c,0xc1,0x38,0x17,0x57,0xb0,0xfe,0x04,0x55,0xb7,0x7b,0xc9,0xcd,0x0d,0xd4,0x64,0xd2,0xb4,0xbf,0x0c,0x7a,0x3c,0x0c,0x2d,0xc7,0x75,0xfb,0x78,0xaa,0x37,0x32,},{0x83,0xa8,0xb6,0x69,0xcc,0xd0,0x12,0x45,0xce,0x3b,0x81,0x8d,0xcb,0x1b,0x58,0x8f,0x86,0x53,0x58,0x50,0xe6,0xc7,0x10,0xc7,0x92,0x17,0xfe,0x43,0x98,0x24,0xf3,0xfa,},{0xc7,0xcf,0xd5,0xc9,0xfe,0x93,0x0d,0x15,0xa1,0x1e,0xbb,0x34,0xe3,0x43,0x1f,0x48,0x9d,0xa0,0x10,0xeb,0x19,0x3e,0xdb,0xfa,0x6f,0x23,0xd5,0xd1,0x4d,0xd8,0xfe,0xab,0xd7,0x88,0x0d,0x2d,0x5a,0x56,0x00,0xd3,0x85,0x46,0xce,0x3b,0xc6,0x4a,0x86,0x29,0x1a,0x1c,0xe3,0x1f,0x27,0x2f,0xf0,0x20,0xdf,0x8c,0xb6,0xa0,0xfd,0x4d,0x3a,0x0d,},\"\\xff\\xec\\x29\\x3d\\x12\\xea\\x63\\x6c\\xa4\\xc4\\xa0\\xa5\\xe2\\xdb\\x15\\x34\\x26\\x39\\xc4\\x76\\x67\\x4d\\x2e\\xbd\\xab\\x4a\\xef\\xd4\\x04\\x6b\\x5d\\xdb\\x56\\xae\\xb2\\x10\\xc1\\x19\\xaf\\xdf\\xb8\\xa8\\x91\\x28\\xa3\\x4f\\x6d\\x77\\xf2\\x61\\xed\\xea\\x07\\x72\\xa2\\xf8\\xdb\\x14\\x0a\\x26\\x40\\xfd\\x8e\\xca\\xdb\\x0b\\x47\\x92\\x16\\x9b\\x6b\\x28\\x10\\xae\\xe2\\xc5\\xcd\\x83\\x52\\x88\\xbf\\xf4\\x93\\xbc\\xeb\\xee\\xea\\x28\\xa7\\xa2\\x48\\xc3\\x61\\x16\\x54\\x0f\\xa7\\x17\\x36\\xd6\\x6b\\x0a\\x47\\x5b\\x5f\\xa9\\x2c\\x0d\\x46\\x00\\x2f\\xca\\x7a\\x1e\\x69\\xd1\\xb5\\x9e\\x81\\xa3\\xa6\\xd4\\xf3\\x39\\x76\\x9d\\xae\\xb2\\x0b\\x5f\\x9d\\x75\\xc4\\xc2\\x8f\\x69\\x21\\x32\\xd2\\x8d\\x3c\\x56\\x4c\\x09\\xfe\\x3d\\xcc\\xa0\\x35\\x9c\\x3c\\x63\\xec\\x37\\x7a\\x33\\xf9\\xee\\x87\\x4d\\x8a\\x78\\x9d\\x77\\xc9\\x6a\\xc0\\x5f\\xdf\\x3a\\xb3\\x8b\\x2c\\x82\\x74\\xa9\\x02\\xef\\x8b\\xb7\\xf4\\x67\\xfc\\x7e\\x07\\x3c\\x77\\xb1\\xdb\\x5f\\xc8\\xef\\x96\\x6c\\x12\\x0c\\x4d\\xae\\x3f\\xb7\\xf5\\xb7\\x4a\\xbb\\x99\\x01\\x66\\xc8\\x12\\xa5\\x25\\xd1\\x23\\xf7\\x6e\\xd5\\x12\\x12\\x50\\x80\\xa1\\x53\\x4f\\x3d\\x8b\\xdc\\xcc\\x54\\x1f\\xc9\\x75\\x90\\x28\\x75\\x46\\x09\\x6f\\xc8\\x80\\xbf\\xcf\\xdd\\x00\\xe6\\x5c\\x0e\\xbf\\x4a\\x09\\xfd\\x64\\x76\\xce\\x1b\\x7c\\x8f\\xaa\\xa5\\xa1\\xcc\\x27\\x86\\x71\\x9a\\x30\\xd8\\x25\\x58\\x11\\x18\\x47\\x52\\xa8\\x8b\\x08\\xac\\x9f\\x0f\\xf1\\xd6\\x26\\x2f\\x25\\x86\\x94\\x0a\\xfe\\x1f\\xe4\\x5e\\x0b\\x56\\x34\\x48\\xa5\\x5f\\x30\\x30\\xe4\\xc3\\x9c\\x1f\\x3f\\x86\\xa7\\x33\\x67\\x03\\x80\\xea\\xb0\\x88\\xe3\\x93\\xde\\x09\\xd1\\xf5\\x08\\xd2\\xfb\\xca\\xfc\\x64\\x9a\\xea\\xe6\\xb8\\xc3\\x0e\\x32\\x9e\\xc3\\xfd\\x28\\x29\\xbe\\x6d\\xb0\\xab\\x8e\\x63\\x7e\\xa1\\x09\\x5b\\xdc\\x3d\\xf3\\xac\\xc2\\x3d\\x3c\\xf7\\x05\\xa9\\x54\\x2c\\x19\\xe5\\x90\\x92\\xec\\x41\\x3a\\x4e\\x2b\\xd5\\xde\\xd2\\x8c\\xd3\\x4d\\xdb\\x3d\\x32\\x94\\x9a\\xa4\\x87\\xf1\\xc3\\x37\\xd6\\x97\\x9c\\xf5\\x12\\x62\\x2d\\xbf\\xb7\\xda\\x1c\\xbb\\x1c\\x7e\\x5a\\xbe\\xea\\x70\\x09\\xe2\\x94\\x3f\\xfb\\xa2\\x25\\x2e\\x1d\\x86\\xec\\xa9\\xd6\\xd5\\xc2\\x46\\xcd\\x2e\\x13\\x4a\\x3e\\x5d\\xad\\x37\\xef\\xef\\x71\\xce\\x39\\x7a\\xda\\xfb\\xd9\\xe7\\x2b\\x3f\\x9a\\x86\\xff\\x0f\\x5d\\x81\\x2c\\x46\\x22\\x5b\\xeb\\xd0\\x70\\x3b\\xc5\\xcc\\xe9\\xc6\\x45\\x82\\x00\\x8f\\x7e\\x55\\x8c\\x40\\xa3\\xb3\\x52\\x20\\x96\\xd1\\xaa\\x2b\\x61\\xbc\\x90\\xcd\\x88\\xc6\\x28\\x5d\\x94\\x20\\x87\\xd8\\xa4\\x66\\x5a\\x0e\\x64\\xd3\\x57\\x2f\\x74\\x68\\x9b\\x4f\\x24\\xef\\x40\\x0d\\x74\\x1b\\x57\\x14\\x06\\x13\\x47\\x14\\x44\\xde\\xcc\\x65\\x4a\\xf0\\xff\\xb2\\xed\\xfd\\xf9\\xfd\\xd0\\x75\\x09\\x81\\x90\\xb3\\x4c\\xde\\x28\\xdd\\x16\\x68\\x72\\xc6\\x08\\x65\\x67\\xa6\\x87\\x61\\xce\\xf2\\x5d\\xa4\\x0b\\xd4\\xc3\\xd3\\x4f\\xdd\\xd7\\x2e\\xe5\\x65\\xb0\\xb9\\x37\\x67\\x8e\\xe8\\x43\\x49\\xd1\\x16\\x0f\\x5f\\x07\\x05\\xf8\\x95\\xd0\\xf1\\x41\\xce\\x8f\\x51\\xa1\\xe4\\xfd\\x2d\\xc4\\x70\\x4b\\x52\\x7a\\x40\\x25\\xa9\\x39\\xcb\\x2b\\xb7\\x88\\x57\\xeb\\x18\\xd7\\x88\\x72\\xed\\xc9\\xee\\x70\\xe6\\x0b\\x2a\\x42\\x70\\x0a\\x19\\x8f\\x4f\\xff\\x6c\\x31\\x92\\x51\\x68\\xbe\\x07\\x7d\\xc2\\x3c\\x32\\x2a\\xbb\\xca\\x97\\x36\\x1f\\xec\\xaa\\x3f\\xcb\\x19\\x6e\\x65\\x6c\\x12\\x8f\\x39\\x82\\xfe\\x11\\xe5\\x51\\xa4\\xa0\\x88\\x5d\\xa6\\x0d\\x39\\x7d\\x0e\\x40\\xd0\\xd8\\x97\\x26\\x2f\\x1b\\x4b\\x67\\x2f\\x78\\xa2\\xd2\\xad\\xfc\\xdd\\x6e\\x15\\x25\\xc2\\x6e\\x71\\x95\\xfb\\x9a\\xc6\\x06\\xbb\\x1b\\xa4\\xa9\\x89\\x08\\x03\\xb4\\xbd\\x84\\x34\\x6a\\xe8\\xd8\\xc7\\x19\\x6c\\x90\\xae\\xcc\\xb2\\x96\\xa4\\xc3\\xeb\\x4e\\xfa\\xcb\\xfc\\xb6\\x2e\\x38\\x3b\\x8a\\x49\\x4a\\xc7\\x23\\x56\\x2d\\x0d\\x8c\\x37\\x91\\x87\\xa9\\x2e\\x3b\\xda\\x6b\\x15\\x69\\x47\\x6a\\xed\\x21\\xae\\xd7\\xa0\\x56\\xb4\\xa5\\x82\\x67\\x44\\x01\\x7c\\xc0\\x06\\x0b\\x4d\\x55\\xfa\\x87\\x72\\xb5\\xb1\\xc1\\x5f\\x57\\x48\\xad\\x72\\x98\\x00\\x5a\\xec\\xbc\\xbd\\x90\\xa3\\xe5\\xc6\\x15\\x9a\\x86\\x74\\xab\\xbb\\xa3\\x79\\x14\\x41\\x50\\x02\\xb5\\xa6\\xef\\x5d\\xf3\\xc6\\x49\\x42\\x6e\\xa1\\x27\\x5a\\x01\\xd8\\x0a\\xdf\\x49\\x0a\\xc5\\x46\\x06\\x2d\\x93\\x99\\x9a\\x6d\\xcc\\xac\\xb9\\x6a\\x09\\x04\\xad\\x33\\xd9\\x05\\x76\\xdc\\x6a\\x21\\xb6\\x72\\xe8\\xff\\xb0\\x66\\x13\\xfb\\x3f\\x14\\xe6\\xcb\\xdd\\xe8\\x8c\\x24\\x37\\xc9\"},\n{{0x5e,0x40,0xa7,0xaa,0xbb,0xb0,0x83,0x0a,0x9a,0xb0,0xfd,0x79,0x69,0x0e,0xe0,0x43,0x39,0x01,0xc6,0xcb,0x06,0x76,0xab,0xe4,0xbb,0xa0,0x6f,0x5b,0xbe,0x58,0xfa,0xc2,},{0x4d,0x4f,0x28,0xfe,0x09,0xc4,0xaa,0xbf,0xca,0x01,0xef,0x6e,0xe7,0xfd,0x63,0x72,0xfb,0x62,0xdb,0x61,0xaa,0xee,0x82,0x7c,0x43,0xfd,0x1a,0x6d,0x1c,0x25,0x90,0x32,},{0x59,0x76,0x72,0xab,0x8d,0x3a,0x60,0xde,0x54,0x56,0xfc,0xc9,0xc3,0x82,0x53,0xf5,0xf3,0x7b,0x80,0xe7,0x4a,0x00,0x7c,0x9f,0x6d,0xb9,0x09,0xd2,0x7d,0x0e,0xad,0x16,0x27,0x89,0x24,0x49,0x94,0xf3,0x5b,0x80,0xd6,0x1b,0xe1,0x99,0xc4,0x17,0xc7,0xea,0x90,0x1b,0x98,0xcc,0x63,0xfe,0x3c,0x50,0xfc,0x3c,0x63,0x38,0x49,0x0f,0xa2,0x06,},\"\\xfd\\x4e\\xc8\\xb3\\x4f\\xc6\\xb7\\x43\\x81\\x3f\\x59\\xe2\\xfd\\x1f\\xef\\xa8\\x70\\xf5\\xa9\\x70\\xe2\\xeb\\x75\\x16\\xef\\x7c\\x30\\x6f\\x4b\\x82\\x3f\\xfe\\xe9\\x2d\\x60\\x1f\\x76\\x5d\\x79\\xca\\x14\\x6a\\xba\\x8b\\xc6\\xe7\\x98\\x44\\x55\\x99\\x35\\xcd\\xdc\\x24\\x26\\x49\\xc0\\x59\\xec\\xf2\\xdb\\x84\\xfd\\xc2\\x19\\x36\\x66\\x88\\xa8\\x8f\\xc2\\x5b\\x85\\x1c\\x36\\x61\\xe5\\x19\\x88\\xc2\\xbf\\x73\\xbb\\x8e\\x3d\\xc1\\x6d\\x22\\x41\\x5a\\xb1\\xa7\\xb3\\x55\\x79\\xda\\xac\\x73\\x25\\xe3\\x19\\x15\\x7d\\x7d\\xa5\\xfe\\xe8\\x7c\\x93\\xa4\\xdf\\xcb\\xaf\\xc9\\x2f\\xba\\x7e\\x17\\xcc\\x68\\xe3\\x90\\x37\\x33\\xc6\\xc8\\x01\\x57\\x2d\\x90\\x73\\x20\\xb2\\xfe\\xb5\\x17\\x10\\xe8\\x56\\xa1\\xf7\\x6f\\x85\\xa7\\xee\\x1a\\x11\\xe6\\x2d\\x2e\\x45\\xa3\\x52\\x93\\x8d\\xd8\\xcf\\xc2\\xbc\\xcb\\x90\\x2d\\xea\\x44\\x4f\\xaa\\xae\\x6d\\x84\\xc5\\xf3\\x91\\xe1\\x0a\\xef\\x76\\x92\\x8a\\x45\\x15\\x3d\\xb6\\xcd\\x25\\xa2\\xbf\\x35\\x3d\\x80\\xd9\\x7b\\xf4\\xb3\\x80\\x86\\x05\\xe8\\x98\\x00\\xd2\\x98\\x40\\xea\\x60\\x97\\x8d\\x9e\\xc9\\xb2\\xc3\\x02\\x74\\x98\\x88\\xf9\\xde\\xbc\\x84\\xdd\\x1e\\x2a\\x79\\xaa\\x0b\\x6b\\xa0\\x2a\\x03\\x91\\x93\\x08\\x1b\\xdb\\xff\\x05\\x99\\xa1\\x4d\\x91\\x8c\\x0c\\x8d\\xea\\xc4\\xf6\\x0b\\x6e\\x99\\x47\\x4a\\xb5\\x30\\x11\\x74\\x10\\x34\\xfe\\x2a\\x20\\xcf\\xf4\\xe0\\xf0\\x23\\x42\\x4c\\x8e\\x57\\x97\\x76\\x8a\\xd5\\x3d\\xf6\\xd0\\x1a\\x24\\x01\\x1f\\xa9\\x0f\\x0b\\xb1\\xd5\\x06\\x9c\\xdb\\x36\\xb4\\x50\\xf4\\x33\\x11\\x0c\\x2c\\x56\\xf3\\x4a\\x1d\\xe4\\x26\\x09\\x14\\xcd\\x46\\x96\\xb1\\x4a\\x09\\xc0\\x26\\x8b\\x2a\\xe2\\xe9\\x8e\\x6b\\x4e\\x99\\x2b\\x91\\x25\\xf8\\x78\\xf1\\xac\\x09\\x82\\x31\\x70\\x62\\x83\\x88\\xf0\\xf6\\xe2\\x56\\x25\\x9c\\xa7\\x86\\xbb\\xe1\\x44\\x88\\x4c\\xb2\\x98\\xcc\\x04\\x3d\\x02\\xf5\\xc3\\xdc\\x68\\x4f\\x78\\x7f\\xaf\\x16\\xc1\\x0f\\xdd\\x84\\x37\\xa8\\xc3\\x09\\x74\\x63\\xbd\\xb9\\x9b\\x78\\x03\\x0f\\x94\\x74\\xfc\\x5c\\x99\\x51\\xdc\\x75\\x26\\x49\\x05\\x86\\xfe\\x1c\\x2d\\xb0\\x54\\x11\\x34\\x14\\x60\\x23\\x9d\\x5e\\x8b\\xc5\\x30\\x65\\x90\\x2b\\x95\\xfb\\xa2\\x82\\xc2\\x76\\x65\\xe8\\x69\\xa1\\x9d\\xae\\x84\\x60\\x6d\\x17\\x26\\x67\\x51\\x55\\xd3\\x80\\x39\\xb9\\xe5\\x5d\\xb4\\xd5\\xce\\xec\\x95\\xcd\\x6d\\x87\\xf8\\x5e\\x99\\xdd\\xe5\\x4a\\x04\\x76\\x1e\\x6e\\xad\\xa6\\x61\\x9d\\xa8\\x95\\xb6\\x54\\xfe\\x38\\x45\\xe8\\xa6\\x0f\\x3a\\x3b\\x32\\x48\\x3d\\x6d\\x27\\x97\\x8a\\xf5\\x45\\x02\\xb2\\x20\\xe4\\x78\\xdb\\x78\\xcf\\xf7\\x7a\\x9c\\x97\\xfb\\x79\\xfb\\x5a\\xcf\\x56\\x28\\x9f\\x38\\x1a\\xcb\\x10\\xde\\x64\\xc3\\xf2\\x38\\x42\\xb1\\x2b\\xf5\\xf1\\xb2\\x83\\xbd\\x25\\xd4\\x8d\\x09\\x12\\x8f\\xb5\\x5d\\xda\\xe2\\x55\\xbe\\xb7\\xc6\\x6a\\x74\\xcf\\x6f\\x06\\x95\\xa4\\xf8\\x28\\xcb\\x29\\xe4\\xaf\\xdb\\xb3\\xb4\\x2a\\x23\\x5d\\x4f\\xdb\\x66\\xb9\\x63\\xac\\x8f\\x68\\xe8\\x2b\\x00\\xa1\\xc4\\x50\\x08\\x63\\x29\\x62\\x47\\x17\\x8c\\xfd\\xef\\x80\\x3b\\xb7\\xb1\\x14\\xf0\\xc0\\x32\\x76\\xf6\\x71\\x66\\x9a\\x08\\x7d\\x92\\x28\\xa3\\x7a\\xe7\\xb9\\x9b\\x06\\x15\\x49\\xc1\\xcf\\x8e\\xc1\\x72\\x46\\xea\\x1e\\xe0\\x3d\\xbc\\x88\\xbf\\x42\\x64\\x16\\xd5\\x86\\x57\\x2f\\xf1\\x0a\\x31\\x45\\x60\\x6f\\x27\\x84\\xe4\\x35\\x7b\\xe4\\xed\\xee\\xc6\\xc3\\xa7\\xbf\\x11\\xbb\\x5b\\x0e\\x90\\xcf\\x50\\xed\\xaf\\x89\\x1e\\x51\\xd2\\x63\\x57\\xbf\\xc8\\x53\\xce\\x23\\xb2\\x99\\x15\\x5c\\x82\\xc1\\x03\\x1d\\xfa\\x64\\x07\\x4d\\x72\\xa0\\x9d\\x29\\x72\\x0e\\xad\\x6e\\xbb\\xbf\\x75\\xd5\\x73\\x8e\\x32\\xcd\\xa6\\xb6\\x46\\x6a\\x8d\\xef\\x6b\\x50\\xa1\\xed\\x9b\\x86\\x5a\\x9a\\x88\\xa0\\x80\\x18\\xac\\xb5\\x01\\xa4\\xde\\x9d\\xb5\\x4d\\x05\\x22\\xce\\x9c\\xec\\x7a\\x06\\xbd\\x9a\\x5f\\x86\\xb0\\xb4\\x6c\\x07\\xbf\\x3e\\x7f\\x5a\\x42\\x6f\\xf6\\xb4\\xbb\\xe1\\xe0\\x03\\x13\\xa5\\xac\\x27\\x19\\xa9\\x59\\xed\\x44\\xee\\x0a\\x44\\xbd\\x97\\xda\\x6d\\xb2\\xcb\\x97\\x1b\\xd6\\x83\\x34\\x90\\x89\\x49\\xed\\x85\\x0f\\xbf\\x73\\xd0\\xe0\\x20\\x49\\xda\\x18\\x1c\\xce\\x9c\\x2d\\x9c\\xa1\\xb6\\x24\\xc8\\xd8\\x7c\\xf9\\x04\\xeb\\x82\\x1d\\xc7\\x95\\x92\\x95\\xda\\x57\\x77\\x92\\x06\\x60\\xb4\\x3c\\xcc\\x25\\xcd\\x38\\x9f\\x15\\x7f\\x67\\xfa\\x03\\x90\\xfe\\xac\\x97\\xa7\\x52\\xc1\\xac\\x20\\x4c\\x21\\xdf\\x56\\xbb\\x0f\\x4f\\xc0\\x16\\x41\\xb4\\x80\\xaf\\x2b\\x89\\xb5\\xd1\\x6d\\x4a\\x0b\\xcb\\x0a\\x50\\xb8\\x2b\\x0e\\x04\\x84\"},\n{{0x3a,0x34,0x13,0x6a,0x97,0x34,0x80,0xd9,0x70,0x06,0xdc,0x27,0x93,0x58,0xe6,0x60,0x62,0x93,0xd8,0xcb,0xc1,0xa4,0x4e,0xe5,0x52,0x33,0xaf,0x2b,0x52,0x64,0xb9,0x0c,},{0xe5,0xef,0xfd,0x92,0x1b,0xe8,0xee,0xc5,0x30,0x75,0x2f,0xcc,0xc5,0x76,0xef,0x0d,0x9b,0xcd,0xe4,0xb3,0x2c,0xc6,0x49,0xd3,0xf7,0x95,0x47,0x17,0x56,0x28,0x60,0xcc,},{0x42,0x5f,0x27,0x22,0x12,0x83,0x57,0x55,0xad,0xcc,0x05,0x22,0xc6,0xf6,0xe0,0x5f,0x68,0x00,0x8a,0x3b,0xe9,0xba,0x59,0x74,0xe4,0x20,0xc4,0xc5,0xcb,0x56,0xe6,0xc5,0x5d,0xec,0x0d,0xe3,0x47,0xb1,0x6c,0xae,0xf8,0xbd,0x33,0xb7,0x1b,0x44,0xc8,0x35,0x7d,0x05,0xb6,0x32,0x1d,0x7b,0xf4,0x93,0xd2,0x58,0x61,0xdb,0x48,0x7b,0xd6,0x03,},\"\\x98\\x1c\\x8e\\x10\\x90\\xe3\\x96\\x95\\x1b\\x07\\x2e\\xf8\\x49\\x70\\x62\\x02\\x08\\x97\\xbf\\x7d\\xd7\\xad\\x50\\x5b\\x4d\\x6d\\xc1\\x1b\\x3e\\x1d\\xbc\\xb0\\xda\\x24\\x99\\x84\\xa1\\x40\\xe1\\x64\\xfc\\x2e\\x02\\xb3\\x1d\\xa3\\x98\\x46\\x55\\x4a\\xa8\\x90\\x5b\\xc8\\xb3\\xdf\\x8a\\x76\\xbf\\x60\\xeb\\x5f\\xfc\\xf2\\x2c\\x97\\xb6\\x71\\x22\\x7d\\x24\\x90\\x71\\xda\\x8f\\xf6\\xbb\\xa7\\x5b\\x2f\\x76\\x68\\xce\\xc1\\x9a\\x89\\xe6\\x47\\x5a\\x12\\x46\\x3d\\xab\\xf3\\x68\\xb3\\xca\\x24\\x45\\xbb\\x30\\x35\\xcc\\x00\\xfa\\xe8\\x5b\\x70\\x72\\xfb\\xcf\\x59\\x54\\x01\\x75\\x5b\\x80\\x51\\xe6\\x09\\x70\\x65\\xae\\x42\\x9f\\x18\\xee\\xb1\\x3f\\xfa\\x6d\\xde\\x59\\xdf\\x6f\\x3c\\x20\\x6b\\xfd\\x9c\\xe1\\xf8\\xa8\\x00\\xc8\\x59\\x0a\\x40\\x21\\xd1\\x60\\xf6\\x6d\\x67\\x40\\xa3\\x69\\xae\\x83\\x56\\x17\\x53\\x8b\\x58\\x90\\x23\\x1f\\x13\\xc5\\x66\\x7b\\xaf\\x51\\x0a\\x60\\x6b\\xda\\xa8\\x4b\\x8d\\x10\\xee\\x60\\x15\\xe1\\x2a\\x4c\\x1e\\xc0\\xbd\\x04\\x21\\xa2\\x94\\xc5\\x1c\\xf6\\x3b\\x5d\\x1f\\x05\\x8e\\x11\\x53\\xdc\\x42\\x5d\\x10\\xce\\xe8\\xb1\\xb0\\x84\\xd6\\xc2\\x93\\x47\\xe9\\x6f\\x0f\\x31\\xb8\\x39\\x60\\x7d\\x07\\x8b\\x79\\xa9\\x0c\\xa3\\xd1\\xf0\\x63\\x80\\x7a\\x46\\x3b\\x7c\\x32\\xf4\\x5a\\x53\\x44\\x98\\xd7\\x1d\\x47\\xed\\xc3\\xb1\\x7a\\x4d\\xff\\x27\\xfe\\xdc\\xff\\xab\\x30\\x1f\\x34\\xf1\\xa6\\x4c\\x02\\x78\\xa5\\x35\\x89\\x34\\x9a\\x23\\x3a\\xf3\\x0b\\x1e\\xc1\\xae\\x41\\x0f\\x7b\\x16\\x30\\xc7\\x14\\x5c\\xa4\\x2c\\x96\\x63\\xf5\\x12\\xe8\\xa5\\x78\\x26\\x7d\\xc9\\x5e\\x83\\x28\\x9c\\x17\\x03\\x2e\\x09\\x78\\x2e\\x2f\\xe8\\xe1\\x6e\\xfb\\x87\\xf0\\x3c\\xa0\\x3b\\x11\\x95\\x61\\x4f\\x89\\x96\\x1c\\xa3\\x93\\x9d\\x3b\\xdf\\x73\\x72\\x21\\xa2\\x2d\\x7a\\x18\\xec\\x30\\xfc\\x12\\x6d\\x0c\\xa6\\x63\\xe8\\x8d\\x60\\x60\\xd0\\x4c\\x6a\\x44\\xe5\\x61\\x6e\\x55\\x6e\\x07\\xd6\\xd4\\xa8\\x47\\xf1\\x71\\x1c\\xf4\\x37\\x17\\x81\\x0c\\x70\\xaa\\x4b\\xe7\\x30\\x27\\x8b\\x3b\\xd6\\x55\\x5c\\x95\\x4d\\xc6\\xed\\xb0\\x9d\\xb0\\x8f\\x0e\\x21\\x18\\x03\\x59\\x62\\x80\\xf3\\xc7\\x86\\x8d\\x23\\x42\\xcc\\x23\\x08\\xea\\xae\\x4d\\xa1\\x91\\x35\\x14\\x66\\x4b\\x1d\\xb9\\x62\\xe9\\x9c\\x8a\\x8c\\xff\\xe5\\x79\\x31\\xf5\\xdf\\xcd\\xdb\\xc1\\xcb\\xb3\\x6c\\xe1\\xc8\\x42\\xe2\\xdd\\xde\\xad\\xfd\\x7e\\x7d\\x0a\\x50\\x48\\xcd\\xcb\\x96\\x1b\\x14\\xf3\\x5f\\x43\\x5e\\x73\\xa6\\x83\\xc8\\xce\\x25\\xc8\\x16\\x81\\x25\\x66\\xfd\\xf8\\x17\\xe0\\xd3\\x36\\xae\\x0b\\xd2\\x47\\x32\\x85\\x12\\xb2\\xa8\\x56\\x76\\x32\\xbf\\x20\\x55\\x3d\\x9b\\xd6\\xfe\\x15\\x7f\\x22\\x0f\\xfb\\x0b\\x46\\xeb\\xae\\x89\\xa7\\x04\\x59\\x72\\x8a\\x57\\xee\\xd1\\x79\\x62\\x56\\xf1\\xbd\\x50\\xb6\\xd5\\x47\\xea\\x3e\\x25\\xfa\\x59\\x13\\xd3\\x89\\xa2\\x25\\x83\\xe9\\x15\\xeb\\x49\\xde\\x35\\xa9\\x7b\\x5a\\xcc\\x52\\x1d\\xb0\\xd0\\x05\\xc2\\x95\\x75\\xe1\\x66\\x11\\xa7\\x55\\xf2\\x1a\\x3a\\x5a\\x82\\xa2\\x0a\\xa9\\x00\\xa7\\x07\\xce\\x36\\x82\\x54\\x92\\xc3\\xca\\x15\\x39\\x5f\\x17\\x00\\xb4\\xaf\\xab\\x94\\xda\\xa7\\xa0\\x2f\\x14\\x53\\xb1\\xf9\\xa6\\xbd\\x36\\xef\\xb2\\x04\\xd9\\x28\\xee\\x1f\\x4d\\xcc\\x86\\x0f\\x3a\\x85\\x9b\\xad\\xc0\\x06\\xfb\\x30\\x5f\\xa1\\x23\\xd4\\xc7\\x9b\\x23\\xa2\\x0e\\x32\\x29\\x5d\\x04\\x0a\\x7f\\x8f\\x6c\\xac\\xa2\\x5d\\x83\\xf7\\x1c\\x62\\xe3\\xaf\\x78\\x36\\xef\\x76\\xb9\\x3a\\x83\\xd3\\xc3\\xb4\\x93\\xaf\\x14\\x17\\x53\\xda\\x19\\xe4\\xcd\\xcb\\xa5\\x66\\x17\\x27\\x10\\x34\\xb4\\xf4\\xf3\\x94\\xc7\\xc6\\xb7\\xd7\\x96\\x66\\xf3\\xaf\\xb6\\x92\\x24\\x4f\\x06\\x1c\\x69\\xa8\\x88\\x1d\\x1b\\x52\\xb8\\x84\\x9f\\xb5\\x34\\x99\\x0a\\xc2\\x39\\x19\\x09\\x47\\x1e\\xbb\\xb7\\x28\\xe2\\x9c\\xd2\\x0f\\x42\\x23\\x54\\xc4\\x30\\x97\\x17\\xeb\\xff\\x3e\\xfd\\x18\\x33\\x37\\x08\\x06\\xd5\\xbf\\xb5\\x3c\\xa2\\xda\\x31\\x6d\\xac\\xb5\\x0a\\xb7\\xfb\\x73\\x96\\x73\\x23\\x5a\\x1d\\xc5\\x3a\\xa8\\x89\\x30\\x72\\xd5\\xb9\\x1c\\x9f\\x6d\\xb8\\x3f\\xc4\\xea\\x41\\xd1\\xee\\xf4\\x9a\\xc2\\x8a\\xfc\\x1c\\xed\\x8f\\x36\\x18\\x90\\xab\\x9f\\x77\\x9d\\x19\\x30\\x82\\x83\\x1c\\xb8\\xc4\\x2f\\xb2\\x79\\x2b\\xee\\x3b\\x26\\x29\\x6b\\x62\\x95\\xeb\\x78\\xa8\\xd8\\x53\\x11\\x76\\x61\\x62\\x4e\\x11\\xf7\\xf5\\x7a\\xfd\\x60\\x85\\xa7\\xb9\\x12\\x36\\x79\\xfd\\xac\\xa1\\xcf\\x2a\\x78\\xd3\\x80\\xbc\\x4c\\x36\\x0a\\xa7\\xc3\\xcb\\xfd\\xe0\\xc0\\x09\\x1f\\xe5\\x3e\\x22\\x19\\xc0\\x70\\xf2\\xf0\\x2f\\x14\\x83\"},\n{{0xcf,0x33,0xe7,0x97,0x4d,0x8f,0x0b,0xf8,0x99,0xac,0x5b,0x83,0x4c,0x7c,0xf9,0x64,0x79,0xce,0x1c,0xfd,0x45,0x3a,0xf0,0x7f,0x97,0x05,0x27,0xf3,0x6a,0xa8,0x5c,0x1f,},{0x57,0x8f,0x60,0x33,0x8b,0x1f,0x04,0x1a,0x97,0xd3,0x19,0xfe,0xcf,0xa3,0x0c,0xfa,0xed,0x36,0x93,0x03,0xcc,0x00,0xb3,0xec,0x8c,0x5c,0x99,0x04,0x11,0x58,0xe2,0x0c,},{0x97,0xa5,0xb6,0xd2,0x68,0xa5,0xb4,0x17,0x5f,0xb0,0x6f,0x1f,0x37,0xd0,0xa6,0x33,0x51,0x92,0x96,0xed,0xc3,0x00,0x11,0xc9,0x54,0xd8,0xf0,0xb9,0xbb,0xe2,0x64,0x18,0x00,0x39,0x6c,0x4b,0x35,0xd4,0xb0,0xd7,0xd2,0xa1,0xd1,0x7c,0xbb,0xeb,0xdc,0x55,0xa8,0x09,0x46,0x2d,0x6c,0xc1,0x9a,0x6f,0xad,0xbe,0x1b,0xd1,0xba,0xe8,0x8a,0x01,},\"\\xe8\\x13\\x14\\x4b\\xd1\\x16\\xf6\\xac\\x36\\x38\\x92\\x17\\xb5\\x17\\x1a\\x90\\x2f\\x06\\xb7\\xdd\\x7b\\x14\\x4d\\xf4\\xf9\\x09\\x15\\x53\\xc7\\xc7\\x83\\x57\\x53\\xa2\\x96\\xcb\\xb0\\xd7\\xfa\\xb9\\x9c\\xef\\x77\\xb6\\x1f\\x34\\xa0\\x4c\\x8a\\xf0\\x4e\\x7d\\x5d\\x1f\\x96\\x13\\x02\\xde\\x89\\xe2\\x00\\x5f\\x29\\x9f\\x5a\\x4a\\xa1\\x79\\x24\\x61\\x7d\\x00\\x66\\x93\\x93\\x77\\x45\\x53\\x9c\\x30\\x48\\xee\\x36\\xb8\\xc2\\x3a\\xfe\\xc0\\xaf\\x9f\\xea\\xa0\\x06\\x6c\\x8a\\xf8\\xe0\\xa7\\xf0\\x90\\x93\\x49\\x82\\x10\\xf6\\xd8\\xdc\\xc0\\xaa\\xad\\xa5\\x66\\x87\\x86\\x91\\x0f\\xf7\\xc5\\xb3\\x48\\xd4\\xcc\\xd6\\xee\\xef\\xfa\\x3a\\xcd\\x18\\x16\\xd9\\x01\\x1a\\x4c\\x40\\x25\\xf6\\xc2\\xfd\\x2c\\x02\\x0a\\x10\\x59\\x36\\x27\\x52\\x0d\\x4d\\xd9\\x9e\\x07\\xc6\\x2d\\x2d\\xbe\\xbe\\x84\\x13\\x9e\\x1c\\x7d\\x86\\x7c\\x09\\x35\\x74\\xfa\\x60\\x1e\\x4e\\xe3\\x07\\xac\\x92\\x6e\\x5d\\x36\\xb6\\x2d\\x7e\\xd8\\x4a\\x26\\x15\\x88\\xb7\\xe2\\x88\\x3c\\x79\\x26\\x61\\x2b\\x4c\\xc6\\x7e\\x2b\\xb7\\x25\\x44\\xa1\\x0d\\x6b\\x49\\x29\\xc8\\x8e\\xf6\\xc4\\x7c\\x26\\x25\\xd2\\xf6\\x81\\x6b\\xd7\\x3c\\x3b\\xae\\x89\\xd2\\xe0\\xc8\\x61\\x71\\xac\\x4b\\xd0\\x80\\xae\\x55\\x5d\\x62\\x74\\x0d\\x1d\\x2a\\x76\\x1c\\xed\\x86\\xdf\\xc3\\x28\\xec\\xc2\\x7e\\xe3\\xdb\\x6d\\x40\\x41\\x08\\xef\\x4e\\x0b\\x64\\x90\\x62\\x53\\xb4\\xc0\\xa7\\x71\\xad\\xef\\xed\\xc8\\xa2\\xc5\\xb5\\x3c\\x42\\x5a\\x70\\xcd\\x6f\\x63\\x95\\x6f\\x7a\\x0a\\x61\\x9f\\xdf\\xbf\\xd0\\x0a\\xa0\\x78\\x41\\x8e\\xb4\\x65\\x2f\\x8b\\xc6\\xf3\\xc2\\x53\\xbe\\xec\\x98\\x38\\xb7\\x7f\\x9c\\xbe\\x2e\\xf2\\xb8\\x05\\x5c\\x57\\x73\\x53\\x9e\\x35\\x6b\\xd8\\x19\\x26\\x06\\xec\\x10\\x1e\\x3f\\x60\\x58\\xb1\\xdd\\x08\\xa6\\x8f\\xdb\\xc5\\x49\\xdf\\xe6\\xb7\\x72\\x5d\\xc2\\x54\\x9e\\x8e\\x3f\\x90\\xdc\\x5b\\xe3\\xcc\\xfb\\x0a\\x38\\xba\\xf9\\x37\\x7c\\xb3\\xf6\\x50\\x1d\\x2e\\x15\\xcc\\xb3\\x55\\x6a\\x89\\x5c\\xcb\\x23\\xf0\\xb6\\xdf\\x9f\\xe5\\x93\\x11\\xcf\\xf5\\x53\\x74\\xc3\\xfb\\x3a\\x32\\x98\\x1c\\xa2\\x6a\\xb4\\x26\\xf3\\x66\\x3d\\x04\\xe3\\x16\\x7e\\x53\\xa5\\x37\\xb7\\x58\\x9a\\x9f\\xb7\\x36\\x79\\x09\\x0a\\x20\\x55\\x32\\xc1\\x32\\x90\\x66\\x34\\x33\\x4a\\x7e\\x87\\x49\\x79\\x3f\\x8c\\x59\\x3f\\x3f\\xd6\\x27\\x8c\\xe0\\x05\\x03\\x83\\x48\\x7f\\x3b\\x24\\x50\\x67\\xaf\\x94\\x88\\x1a\\xa1\\xae\\x96\\x8d\\x0c\\xae\\xba\\x5f\\xa5\\xc7\\xbe\\x5f\\x4e\\x4b\\x72\\x57\\x51\\x86\\x95\\xd8\\x9b\\xcc\\xde\\xc5\\x07\\xb9\\x67\\xb4\\xfd\\x64\\xb6\\x89\\x3b\\x3e\\xe7\\x80\\x3c\\x1d\\x36\\xea\\x8a\\x02\\xfc\\x42\\x6f\\x9a\\xfc\\x8e\\x9f\\x24\\x32\\x15\\x27\\xec\\x98\\x44\\xbc\\x3c\\x54\\xa0\\xf7\\x66\\x7e\\x03\\x43\\x00\\xbb\\xb4\\xfb\\x02\\x0f\\x6d\\x5b\\xb9\\x54\\xe7\\xb5\\xa3\\xa7\\x06\\xa4\\x93\\x9d\\xb3\\x3c\\x15\\x48\\x92\\x64\\x34\\x76\\xa2\\x91\\xd4\\x7d\\xc1\\xe6\\xf7\\x2c\\xe9\\x1d\\x13\\x6f\\x11\\xdb\\x26\\xb9\\xc9\\xba\\x73\\x6e\\x40\\xdf\\x0a\\x15\\xc1\\xa8\\x91\\x49\\x99\\x6b\\x25\\x1d\\xd9\\x88\\xb3\\x90\\x04\\xe6\\xef\\x41\\xbd\\xc0\\x61\\xdb\\x58\\x0b\\x7b\\x74\\xde\\x2a\\x65\\x18\\x10\\xbd\\x89\\x17\\x53\\xb9\\x73\\x86\\xd7\\xf8\\xcb\\xdb\\xb6\\xec\\x38\\x6f\\xa2\\xc3\\x42\\xf5\\xef\\x20\\xe6\\xe3\\xa8\\xbb\\x4d\\x51\\x49\\xa7\\xd4\\xde\\x12\\x24\\xdf\\xf1\\xd1\\x72\\xc8\\x75\\x70\\xf7\\x76\\xd5\\xef\\x45\\x95\\x9b\\xe0\\x93\\x8a\\xd7\\x9f\\x5d\\x33\\x95\\xcb\\x27\\x21\\x62\\x71\\x22\\x88\\x7b\\xd7\\xa8\\x98\\x3b\\x64\\x77\\x97\\xbd\\x41\\xd8\\x82\\x64\\x1c\\x81\\x43\\x1c\\xe8\\xd9\\xb3\\x06\\x7a\\xde\\xc4\\xcd\\xe9\\x26\\xc5\\x13\\x13\\xf0\\xcf\\x84\\xc5\\x29\\x25\\x62\\xdd\\x49\\x08\\x64\\x2d\\xd2\\x45\\x28\\x84\\x84\\xc5\\x56\\x8a\\x78\\x7d\\x0c\\xed\\x36\\xa3\\x52\\xf0\\x32\\xda\\x4f\\x7e\\x4d\\xe0\\x6b\\x11\\x47\\x3f\\x65\\x0e\\xec\\x65\\xdd\\xa9\\x96\\x39\\xaf\\x2d\\x42\\xd8\\x4e\\xe2\\x30\\xf4\\xf8\\x36\\x23\\xd9\\xc9\\xaa\\xa3\\xb1\\x6b\\xda\\x10\\xdd\\xaa\\xd2\\x5a\\xf5\\xc1\\xc1\\x0f\\x81\\xc8\\xc5\\x1c\\x81\\x1a\\x3a\\xa3\\xe3\\xdb\\x58\\xa7\\x02\\x5e\\x43\\x80\\xe2\\x85\\xda\\x47\\x4a\\x61\\xba\\x59\\x17\\x3f\\xf0\\x42\\xa4\\x6a\\x79\\xab\\x18\\x4b\\x07\\x01\\x08\\x41\\x6f\\x9d\\x61\\x58\\xcf\\x96\\xd0\\xe6\\xdb\\x44\\x76\\x14\\xa0\\xd9\\x08\\x9e\\xbb\\x6a\\xee\\x4e\\xf1\\x07\\xbe\\x45\\x93\\xd7\\x1e\\x79\\xf6\\x79\\x86\\x68\\xa7\\x40\\xae\\x4b\\xac\\x5a\\xc7\\x59\\x4e\\xcb\\xd5\\xdc\\x82\\xe7\\xd0\\xf9\\xcb\"},\n{{0x51,0xb1,0xad,0x0f,0xfc,0x21,0x49,0x7a,0x33,0xdb,0xdb,0x85,0xea,0x2b,0xc1,0xce,0x3d,0x0c,0x2d,0x95,0xd9,0x46,0x1a,0x39,0x09,0x73,0xfe,0xe3,0x77,0xfc,0x75,0xf4,},{0xba,0xd0,0x41,0x25,0x75,0xd3,0x80,0x13,0x01,0xed,0xee,0x6b,0xc0,0xf2,0x76,0xe7,0x87,0x35,0x7b,0x41,0x22,0xf5,0x2d,0xe9,0x81,0x88,0x58,0x51,0x88,0x42,0x49,0xcb,},{0xcf,0xb6,0x5b,0x6f,0xf0,0x37,0x7c,0xef,0x51,0x1f,0xd9,0x7b,0x90,0xc3,0xec,0xb8,0x08,0x33,0xf1,0x42,0xa7,0xcf,0x50,0x22,0xce,0xd3,0x0b,0x3f,0xb7,0x86,0x20,0x86,0xd0,0x13,0x39,0xb8,0x86,0x6a,0x23,0x8c,0xb0,0x70,0x27,0x6e,0x19,0x44,0xb5,0xfe,0x32,0xcc,0x40,0x99,0x47,0xcb,0x91,0xde,0xb1,0x43,0x2c,0x29,0x1b,0x60,0xfb,0x0d,},\"\\x78\\x82\\xe8\\x6e\\xf3\\x40\\x2f\\x6d\\xbc\\x65\\xcc\\xe8\\x31\\x5b\\x39\\x76\\x5f\\xaa\\x4b\\x1f\\xc8\\x76\\xfa\\xd5\\xf8\\x22\\x0c\\xb2\\x2a\\x7d\\xf2\\xe3\\x58\\x0e\\xab\\x3a\\x7e\\x8f\\xa7\\xfb\\xb6\\xb5\\x94\\x82\\xca\\x0e\\x36\\x4a\\x13\\x13\\x96\\xdf\\x79\\x2a\\x32\\x41\\xa0\\x60\\xe4\\x41\\x43\\xb6\\x76\\x74\\x93\\xc6\\xbf\\x75\\xf1\\x87\\xa9\\x64\\x3a\\xa1\\x1e\\x11\\xeb\\xa7\\xb0\\xa8\\x0f\\x0a\\x68\\xb9\\xf1\\xb7\\x9f\\x75\\xb6\\x6c\\xc5\\x9d\\x9d\\xa7\\x79\\x55\\xfd\\x7e\\x87\\x99\\xf9\\x9d\\x6e\\xb0\\x8f\\x90\\xd3\\x18\\xf4\\xef\\xcb\\xfe\\x71\\x15\\x9b\\x10\\xa8\\x3a\\xa5\\xfd\\x69\\xbb\\x75\\x33\\x6f\\x5d\\xf2\\x96\\xea\\x06\\x0a\\x42\\x6c\\x95\\x45\\xdf\\x94\\x0b\\xc1\\x45\\x4e\\xfc\\x1f\\x9d\\xc9\\x65\\xf1\\xf2\\x2d\\x94\\x73\\x03\\xfb\\x8e\\xc1\\x24\\x07\\xff\\xf6\\xb1\\xdb\\xe4\\x7e\\x34\\x21\\xc3\\x17\\x64\\xfd\\x90\\xc8\\x3a\\xc7\\x11\\xd1\\x99\\x26\\xe2\\x29\\xa0\\x64\\xc6\\x1f\\xe3\\x67\\x6a\\xf3\\x00\\xa1\\x71\\x6f\\xab\\xe4\\xe3\\x84\\x22\\x64\\xad\\xb3\\x2e\\x0d\\x9c\\x9f\\x5d\\x4a\\x65\\xd0\\xd7\\xb5\\xc3\\x77\\x0d\\x73\\x7e\\xe1\\x3c\\xbe\\xd2\\x1d\\x7a\\x1d\\xa3\\x6a\\xaf\\x7e\\xc0\\xf3\\x6f\\xcc\\x47\\x6f\\x65\\x96\\x81\\xe5\\x16\\x0a\\x5a\\x1f\\x49\\xe7\\x59\\xb9\\xd0\\xfc\\xd4\\xfd\\xb8\\x54\\xec\\xcd\\x99\\x17\\x2a\\x47\\xd2\\xc4\\xef\\xbe\\x0b\\x37\\x57\\x63\\x1d\\xf1\\xba\\xe1\\x75\\xf0\\xfa\\x74\\xdd\\x04\\x8b\\xb6\\xa5\\xfe\\xd8\\x43\\x02\\x84\\x34\\x9d\\xa3\\xd6\\x7d\\xf2\\xa6\\xf7\\xe8\\x26\\x9b\\xc7\\x9f\\xb2\\xc5\\xd5\\xed\\x60\\x84\\xe9\\x07\\x6f\\x45\\x5a\\xb6\\x38\\x91\\x90\\x46\\x36\\x9a\\x44\\x6d\\x57\\xfc\\xad\\xa7\\x01\\x1c\\xc7\\x71\\xbf\\x6d\\x87\\x4a\\x8e\\x5d\\x23\\xc6\\x87\\x74\\x7d\\xe4\\x1d\\xd0\\x4b\\xff\\xc7\\x17\\xd6\\x12\\x81\\x83\\x84\\x6e\\xb5\\x94\\xb3\\xcb\\x1c\\x1a\\x8a\\xa0\\x4f\\x0d\\x7e\\xba\\x53\\xaf\\x39\\xcb\\x1d\\x4e\\x6f\\xec\\xf3\\x11\\x3b\\xd8\\x42\\x24\\x16\\xf4\\xc4\\x40\\x37\\xae\\xee\\x9e\\x0f\\xdc\\x51\\x7c\\x48\\x73\\x1f\\xd0\\x4e\\xe9\\xc9\\x9f\\x5d\\xbc\\xa3\\xd5\\x74\\x50\\x9d\\x7b\\xaf\\x32\\x88\\xf2\\xc2\\x30\\xa0\\x2d\\x17\\x03\\xbd\\xb1\\x61\\x1c\\xde\\x2a\\x76\\x6d\\xac\\x19\\x3d\\xe1\\x67\\x44\\x3d\\x20\\x09\\x0d\\xc3\\x4d\\x29\\x27\\x7a\\x86\\xb1\\xe9\\x98\\xb2\\x45\\x64\\x51\\x17\\xe5\\x11\\x1f\\x12\\xf1\\x46\\x06\\xc5\\x54\\x46\\xdd\\x91\\x2d\\x34\\x75\\xc1\\x98\\x76\\xe1\\x9a\\xc5\\x36\\xd3\\x17\\x87\\x6c\\x4b\\x0a\\x2e\\x0f\\x98\\x61\\x61\\x29\\xa5\\x68\\x37\\x32\\xa4\\x23\\x17\\xc5\\xe8\\x09\\xdc\\xa9\\x56\\xb2\\xab\\xb4\\x84\\xad\\xa8\\x10\\xa1\\x5c\\x81\\xcc\\x85\\x62\\xb5\\x55\\xda\\x94\\x58\\xf9\\xb4\\x43\\x38\\x49\\x02\\x30\\xc7\\x40\\x4f\\x3d\\x48\\x61\\x1f\\x84\\x12\\x7e\\x73\\xe2\\x77\\xd8\\x8c\\x62\\x21\\x2d\\x2a\\x3a\\x35\\x1f\\xc6\\x76\\x65\\xb1\\x8d\\x77\\x21\\x62\\x30\\x63\\x2c\\xbc\\x78\\x12\\x88\\xe1\\x5c\\xeb\\xf3\\xec\\x33\\xa7\\x20\\x5e\\xb2\\x2b\\x9a\\xbe\\x4c\\xdb\\xc7\\xdd\\xba\\xaa\\x53\\x64\\x08\\x75\\xeb\\x76\\x3f\\x52\\x2c\\x36\\xcf\\xff\\x2e\\xb2\\x3e\\xe5\\x86\\xd7\\x75\\x28\\x62\\x59\\xfa\\x94\\xa4\\x4f\\xa7\\xec\\x01\\x50\\x96\\xa2\\xa4\\x46\\xb6\\x73\\x2b\\x80\\x02\\x42\\x67\\xfe\\x3d\\x5d\\x39\\xd1\\xc4\\x85\\x09\\xb3\\xec\\xaa\\x2e\\x24\\xe5\\x4d\\xe4\\xd6\\x1c\\x09\\x7b\\x70\\xf7\\x53\\xb5\\xaf\\x9a\\x6d\\xb6\\xf9\\x75\\xd2\\x5f\\x4f\\x83\\xd0\\x6f\\x87\\x9e\\x17\\xef\\x7c\\x50\\x9a\\x54\\x14\\x44\\xba\\x3e\\xb6\\x86\\x78\\x38\\x09\\x0e\\x22\\xda\\xfd\\xbb\\x0e\\xb3\\xb0\\x56\\x5b\\xe1\\x57\\x9c\\xee\\xcd\\xed\\x20\\xf5\\x44\\x25\\x6c\\x7c\\x4e\\xde\\x3b\\x62\\x84\\x3c\\x65\\xb0\\x46\\x6b\\xe6\\xb7\\xe2\\x73\\x05\\xb9\\x63\\xca\\x91\\x4e\\x3b\\x7d\\x21\\x73\\x61\\x18\\xed\\xb3\\xd6\\x58\\xd9\\xd7\\x6f\\x50\\x9d\\xb3\\xb9\\xca\\x2e\\xae\\x28\\x96\\x4a\\x4b\\x3b\\x3c\\x38\\x4a\\x81\\xa4\\x89\\x0e\\xe9\\x6f\\xbe\\x93\\x4a\\x6f\\x2a\\xec\\x8e\\xeb\\x6c\\xfe\\x59\\xac\\x9d\\x3b\\xbc\\x16\\x46\\xba\\x32\\xa1\\x14\\x2f\\xee\\x59\\xfe\\xd6\\xfb\\x7b\\xbc\\x04\\x98\\xcc\\x27\\xde\\xad\\x41\\x3b\\x7b\\x43\\x51\\xec\\x20\\x63\\x43\\xc0\\xab\\x89\\xfc\\xf8\\x72\\x43\\xb1\\xab\\x45\\x0e\\x58\\xff\\x11\\xa1\\x14\\x0a\\x38\\x3f\\x19\\x6a\\xa3\\x97\\x6c\\xe1\\x7c\\xf3\\x45\\x30\\xf0\\x49\\xa1\\xde\\x90\\xe3\\x17\\x53\\xcd\\x85\\xe7\\xf1\\xfd\\x5c\\xf2\\x04\\x26\\xc9\\x37\\x9f\\xeb\\x8c\\x31\\xb4\\xbf\\xec\\x35\\xea\\x5a\\x78\\x95\\x3d\\x75\\xc5\\xcf\"},\n{{0xfa,0x2f,0x46,0x1c,0xe8,0xc7,0x12,0x62,0x18,0xc4,0x7c,0x91,0x56,0x9e,0x87,0x99,0x79,0x7c,0x83,0x36,0x8f,0xc8,0x42,0xb6,0xe1,0xc2,0x2f,0xd5,0x2a,0xec,0x70,0xbf,},{0x6b,0x89,0xb2,0x3f,0x1e,0x11,0xa7,0x5a,0x53,0xf9,0x92,0xf6,0xca,0x57,0x75,0x00,0x8c,0x6e,0x9e,0x7e,0x49,0xc0,0xd8,0x51,0x0b,0x0e,0x83,0x69,0xb7,0xa2,0x0b,0xcc,},{0x84,0xf7,0x9d,0x9e,0x8f,0x30,0xe5,0xbb,0x63,0x62,0x23,0x97,0x14,0x55,0x6b,0x04,0x73,0x6f,0xa4,0x44,0x65,0xca,0xba,0xad,0x23,0xbe,0xaf,0x5a,0x99,0xfc,0x45,0x1a,0xd4,0xae,0x5a,0x18,0xc7,0xf6,0xf9,0x64,0xfa,0x41,0x03,0x92,0x16,0x01,0x8e,0xc5,0xa2,0xac,0xca,0xe1,0x07,0x5a,0x6b,0xb3,0xa6,0xec,0xbc,0x1f,0xca,0x02,0xb9,0x04,},\"\\x79\\x9b\\x39\\x80\\x2a\\x18\\x27\\xe4\\x5c\\x41\\x12\\xfe\\xe0\\x26\\x03\\x4c\\x0e\\x59\\x8a\\xff\\xce\\x2c\\x55\\x0c\\x19\\x3f\\xee\\x73\\xf1\\xdf\\x8c\\x30\\xc8\\xd3\\x87\\x33\\x40\\x08\\x8c\\xe8\\x59\\xde\\x34\\x71\\xe9\\xd0\\x57\\x68\\x6c\\x82\\x9b\\x54\\x08\\x79\\x5e\\x08\\xb3\\xdc\\x7a\\xa3\\xb6\\x37\\xc7\\xde\\x9d\\x21\\x72\\xad\\x03\\x33\\xc1\\xbe\\xa8\\x61\\xa6\\x23\\x2f\\x47\\xf0\\x5a\\x10\\xbf\\x5d\\xf8\\x08\\x15\\xa2\\x71\\x25\\x6e\\x37\\xe8\\x08\\xa0\\xe6\\x2f\\x1f\\x07\\xd9\\xe1\\x0e\\xbb\\x94\\x7d\\x3e\\xfa\\xbf\\x8a\\x28\\xfa\\x9d\\xcc\\xd9\\xa1\\xd5\\x99\\xf5\\xfd\\x61\\x65\\x50\\x8e\\xfd\\x67\\x9c\\xf3\\x56\\x01\\x50\\x58\\xbf\\x4b\\x34\\x11\\x8f\\x83\\xaa\\x3e\\x5b\\xc2\\xce\\x19\\xec\\xa8\\x4f\\x71\\x83\\x98\\xad\\xbc\\x0a\\x52\\x76\\xcf\\x9d\\x8c\\xaf\\xfc\\x27\\xe3\\xe6\\xab\\xbe\\x34\\x5b\\x0e\\x9e\\xcf\\x89\\xc6\\x77\\x1b\\x0e\\x75\\xd4\\x08\\xba\\x2f\\xbb\\x90\\xfc\\xfd\\x70\\xc5\\x3f\\x2e\\x4d\\x52\\xba\\x54\\xd9\\x78\\x4c\\xf7\\x1c\\x34\\x9e\\xf6\\xf1\\x4a\\xe4\\x97\\x0d\\xef\\x6e\\xfb\\x5f\\x30\\xe9\\x84\\xd6\\x01\\x6a\\x19\\x6d\\xea\\xec\\x7e\\x04\\xb4\\x76\\x19\\xc4\\x8b\\xf4\\x9d\\xc0\\x2f\\x7f\\xef\\x3e\\x13\\xb7\\x56\\x17\\x4e\\x90\\xd0\\x5f\\xcb\\xdd\\x5e\\x13\\xf0\\xe4\\x34\\xef\\xd5\\x42\\x1b\\x09\\x1d\\x51\\x79\\x00\\xed\\x0d\\x57\\x85\\x96\\x88\\x62\\xb4\\xbf\\xe5\\x09\\x3a\\xb6\\x72\\x17\\x18\\x0d\\x97\\x55\\x4c\\xcd\\x9c\\xc3\\x14\\x29\\x32\\x6c\\xab\\x42\\xf3\\xf8\\x39\\x80\\x60\\xc1\\x9d\\xb4\\x88\\xb5\\xd1\\xc8\\x0b\\x29\\x09\\x0a\\xfd\\x1c\\x6b\\xac\\x36\\x42\\x26\\x48\\x00\\x21\\x1b\\xc2\\x78\\xfc\\xb9\\x9d\\xae\\x9d\\xbf\\x49\\xda\\xf1\\xb2\\x4a\\xb5\\x69\\xdc\\xbb\\x87\\xd4\\xd3\\x54\\x73\\x35\\xe3\\x5d\\xb9\\x84\\x00\\xcd\\xfc\\xe6\\x79\\x06\\x82\\xe9\\x36\\x00\\x22\\x0e\\xc4\\x99\\x24\\x5f\\xa4\\xee\\x15\\xd8\\x43\\x83\\x1b\\x56\\xcc\\x26\\x41\\x80\\x25\\xbf\\x87\\x00\\x16\\x05\\xc6\\x69\\x1c\\xa6\\xbd\\x40\\xa4\\xe2\\x48\\xc3\\x09\\x80\\x1b\\x76\\xa7\\x95\\xed\\xe8\\xad\\x53\\x08\\xbc\\xb6\\xd1\\x75\\x4a\\xb3\\x37\\x1f\\x00\\x03\\xbb\\x8c\\x4e\\x4e\\x47\\x19\\x54\\xe2\\x8b\\x1e\\x98\\x66\\x37\\x9f\\x82\\xe1\\xfb\\xac\\xb7\\x9d\\x50\\xad\\xdd\\xad\\x5b\\x97\\x78\\xb5\\x58\\xcd\\xdb\\xb0\\x03\\x8a\\x5f\\xf3\\xd5\\xc9\\x55\\x7b\\x96\\x5d\\xe3\\xa7\\x08\\x2c\\x45\\xa8\\xec\\xf3\\xe7\\x72\\x1e\\xb6\\x90\\xb6\\xc7\\x1f\\x3d\\x89\\x75\\xd5\\x30\\x0f\\x67\\xc4\\xdc\\x4a\\x73\\x68\\x46\\xe4\\xcc\\xd2\\x6f\\x93\\x46\\x3d\\x5b\\xc6\\xf4\\x6e\\xdc\\x48\\x86\\x64\\xbe\\x96\\x96\\xbe\\x12\\xb0\\x2d\\xd1\\x04\\xd1\\x0c\\xc6\\xb1\\xd8\\x2e\\x81\\x17\\x81\\x12\\x14\\xa6\\x48\\x7d\\x17\\x36\\x7e\\x39\\x5a\\xde\\x2e\\xf6\\xb2\\x6a\\x17\\x83\\xa7\\xe2\\xf2\\x45\\x21\\x3b\\xc0\\x3a\\x75\\x5d\\xf3\\xee\\x8e\\xf9\\xf1\\xef\\xf9\\x72\\xc6\\x91\\x90\\x65\\xcb\\x7b\\x75\\x66\\x78\\xd4\\xdd\\xfd\\x19\\x3e\\xdd\\xc0\\xb4\\x2e\\x86\\x89\\x61\\x36\\x43\\x14\\x6d\\x74\\x28\\xca\\x37\\xbf\\x31\\xbd\\xf1\\x4e\\x31\\x86\\x78\\x58\\xf3\\x9d\\x23\\x23\\x70\\x9e\\xb3\\xb7\\xd7\\xf4\\xe3\\x97\\x02\\x23\\x78\\x42\\x4b\\xde\\xe9\\xbc\\xb7\\x4e\\x9d\\x5d\\xfd\\x37\\x1f\\x47\\x34\\x99\\x8f\\xc1\\x8d\\xf4\\xcd\\xfb\\x4b\\x5c\\x21\\xc2\\xe5\\x0f\\x8d\\x6c\\x15\\xbc\\x14\\xbf\\x4f\\xda\\x6c\\xeb\\x9d\\x80\\x82\\xca\\xe4\\x32\\xdf\\xc9\\x8b\\xfb\\x3e\\xcd\\x16\\xb8\\xd7\\x4f\\x83\\x0b\\x64\\x2b\\x04\\x28\\x75\\xe9\\x21\\xb0\\x54\\xbd\\x1a\\xaa\\x58\\x1f\\x60\\xd7\\x18\\xdf\\x66\\x9f\\x56\\xdc\\x2f\\x10\\xd4\\x78\\x99\\x77\\x22\\x16\\x2e\\x83\\x94\\x0e\\x61\\xa1\\xb6\\xe4\\x2d\\xf2\\xa4\\xa3\\xa7\\xcb\\xcd\\xd6\\x11\\xce\\x96\\xcb\\xcf\\xb5\\xa9\\x5c\\xc4\\x73\\x23\\x1c\\xa1\\x3c\\x06\\x09\\xd0\\xce\\x1a\\xe5\\xdd\\xb5\\x46\\x6d\\x6d\\x65\\xee\\xfa\\xd9\\xda\\xf2\\xa3\\x69\\x01\\xbc\\xc9\\x45\\x84\\x7d\\xa1\\xed\\x6e\\x2e\\x24\\x0e\\x84\\x8b\\x23\\x1b\\x7d\\x0e\\x1a\\xcd\\x06\\x54\\x3e\\xc9\\x3e\\x76\\x8e\\x59\\x98\\x5d\\x7e\\x96\\xc8\\xc3\\x1f\\xcd\\x12\\x10\\xf0\\x96\\x42\\x71\\xe2\\x18\\x77\\x52\\x5c\\xb1\\x34\\xbc\\x35\\x36\\x25\\x7d\\xbb\\x11\\xd3\\x0a\\x3c\\x4f\\x94\\x9f\\xb8\\x2a\\xe0\\xc3\\x1c\\xcd\\xfe\\x41\\x94\\x32\\x51\\xe5\\x0a\\xa4\\x35\\x53\\x92\\xac\\x30\\x9e\\xf6\\x0f\\xc1\\x74\\x32\\xa2\\xbe\\x4b\\xdb\\x2f\\xcb\\x28\\x60\\x7c\\xc4\\x5a\\x52\\xb6\\x00\\x16\\xbb\\x1d\\x2e\\x23\\x97\\x2f\\xf2\\xc2\\xa2\\x47\\xd7\\x25\\x58\\x5b\\x1e\\xf2\\xb1\\x5f\"},\n{{0x1b,0xe2,0x94,0x9d,0x51,0xe7,0x20,0x81,0x75,0x82,0x62,0x13,0xee,0x6a,0xe3,0xc0,0x91,0x17,0x27,0x42,0xe8,0x8c,0xaa,0x02,0xed,0x0f,0x31,0x3e,0xcb,0xe5,0xd9,0x10,},{0xd7,0xbf,0x47,0x48,0xd6,0xdd,0xed,0x5b,0x57,0xa2,0xab,0xf7,0x97,0xfa,0xcc,0x56,0x0b,0x48,0x56,0x3d,0xfd,0x9d,0xcf,0xf4,0xbe,0x52,0x2c,0x71,0x7a,0x6c,0xfd,0xa9,},{0xf4,0x1f,0x2e,0xf6,0x59,0x5f,0x17,0x66,0x0b,0xb2,0xfe,0x93,0xe5,0x1f,0xc6,0xfa,0x9c,0x31,0xda,0xdc,0x9d,0xb9,0x0c,0x3f,0x46,0x60,0x7a,0x7f,0xb4,0x80,0x0b,0xb7,0x5a,0xd9,0x63,0x25,0xdc,0x7e,0xab,0x78,0x24,0x72,0xb0,0x4d,0xa6,0xd8,0xe6,0xfe,0x64,0x65,0x5d,0xea,0x55,0x1f,0xbd,0x50,0x49,0xe8,0x76,0xce,0x5a,0x40,0x5f,0x02,},\"\\x04\\x5e\\x2b\\x0e\\xc7\\xbb\\x20\\x3a\\x49\\xbd\\xcb\\xa9\\x41\\xe2\\xb7\\x3c\\x23\\xc1\\xfe\\x59\\xa1\\x7d\\x21\\xa0\\x12\\x4e\\xa2\\x4b\\x33\\x7f\\x92\\xab\\x9c\\x92\\x3a\\x20\\x57\\x6b\\x62\\xd5\\xd0\\xf6\\x24\\xe7\\x93\\x2c\\x11\\x5b\\x54\\x74\\xe0\\xa4\\x6a\\x4d\\xc9\\xec\\x51\\xf6\\xa0\\xce\\x8d\\x54\\x74\\x4d\\x1d\\x52\\x09\\x33\\x20\\xe3\\x9b\\xe2\\x03\\xf7\\x4a\\x0f\\x5d\\xfa\\xc5\\x2c\\xf0\\xf9\\x95\\xc6\\x6d\\xf2\\x91\\x4b\\x68\\xad\\x87\\x1f\\xbe\\x81\\x52\\x5a\\xd2\\xd8\\x8a\\xc6\\x99\\x33\\xa7\\x5a\\xea\\x74\\xac\\xe4\\xe3\\x63\\x43\\xdd\\xc0\\x6d\\x32\\x08\\xf1\\x6d\\x80\\x5f\\x5d\\xd7\\x86\\xb4\\xda\\xaa\\x16\\x67\\x48\\xcf\\xee\\xc5\\x71\\x4c\\x85\\xc1\\x04\\x78\\xb5\\x97\\xac\\x7f\\x6a\\xe2\\xc9\\x88\\x91\\xe3\\x8f\\xd4\\x14\\xaa\\x81\\x1b\\x76\\x21\\xd8\\x05\\xeb\\x8f\\xcc\\x46\\xcf\\x4d\\x56\\x8a\\x8a\\x92\\x58\\x7c\\xbb\\xc1\\xae\\xcc\\x12\\xf1\\x0d\\x90\\xac\\x1e\\x01\\xae\\x98\\x6d\\x14\\xfe\\x82\\x95\\x1c\\x68\\x2c\\xea\\xc8\\xc9\\x25\\xfc\\x66\\x54\\xd8\\x38\\xac\\x93\\x53\\xae\\x2f\\x93\\xf3\\xc8\\x8b\\xf7\\xb8\\x2c\\xbc\\x43\\xb1\\xe4\\x9e\\x5c\\xeb\\xfb\\x19\\x49\\xad\\xe4\\xb2\\x2e\\x4b\\xcf\\x1b\\x40\\x0c\\x0a\\x8f\\xa8\\xa6\\xfe\\x76\\x70\\xf6\\x9f\\xc3\\xfa\\xec\\xd4\\x80\\x5b\\x8c\\x95\\x4c\\x01\\xa5\\x40\\xd1\\xa1\\xe7\\x88\\x43\\x6e\\xae\\x07\\x3a\\xe9\\x56\\xda\\xe3\\x17\\x69\\x05\\xa8\\xf0\\xa3\\xc6\\x0f\\xd9\\x80\\xda\\xb4\\x19\\xd4\\x1e\\xc0\\x6e\\x52\\x73\\xfb\\xb1\\x3d\\xb9\\x38\\x1f\\x89\\xb6\\x63\\xcc\\xc4\\xbd\\x75\\x3f\\xd9\\x0f\\x14\\xa7\\x7b\\x3d\\x81\\xc4\\x5d\\xd3\\x56\\x1c\\xd1\\xfa\\x0e\\x94\\xd2\\x34\\xce\\xf9\\xd7\\x85\\x9a\\x2e\\xc9\\x42\\xbf\\xc1\\x88\\x49\\xd7\\xf2\\xad\\xa3\\xa5\\xd6\\x57\\xbc\\x19\\x3d\\x2e\\x14\\x91\\x68\\x2f\\x16\\x65\\xa5\\x34\\xb1\\xac\\x20\\x83\\xb7\\x38\\xbe\\x8f\\x9e\\x96\\x3f\\x59\\x41\\xed\\x48\\x3c\\x6a\\xcc\\x82\\xe9\\x59\\xb8\\x1b\\x8a\\xf0\\x2f\\x47\\x1c\\x08\\xf5\\xf8\\xb1\\x2e\\x10\\xe0\\x08\\x19\\x28\\x98\\xa4\\x45\\x02\\x02\\xaf\\x73\\x15\\x92\\xe7\\x4e\\xfe\\x2a\\x94\\x8e\\x51\\xd0\\x6e\\x44\\xde\\x9b\\x95\\x6b\\x7b\\xc9\\xa6\\x9b\\x6e\\x74\\x68\\x7a\\xb2\\x06\\xde\\xc4\\xd3\\x5b\\x31\\x73\\xfb\\xc4\\x38\\x82\\x9d\\x50\\x64\\xbf\\xbc\\xf7\\x43\\xc1\\xe2\\xd4\\x6f\\x62\\x8f\\x2e\\x51\\xc6\\x26\\xd8\\xe4\\x16\\xd7\\xbe\\x6e\\x55\\x5a\\x24\\x96\\x91\\xab\\xb1\\x67\\xf1\\xd9\\x2f\\x4f\\xa3\\x39\\x2f\\xde\\x24\\xe9\\x93\\xce\\x7f\\xf5\\xc1\\xb8\\xe1\\x57\\x7a\\x7c\\x0e\\x73\\x02\\x5c\\xc6\\xfc\\xd7\\x27\\xa8\\x2e\\xf0\\xc1\\x29\\xe9\\x1e\\x55\\x33\\xe0\\x21\\xa3\\xcd\\xbb\\x99\\xd5\\x4b\\xf7\\xcd\\xcd\\x3f\\xf1\\x19\\x15\\x4f\\x3f\\xad\\x92\\x42\\xb6\\xed\\x35\\x0d\\x10\\x37\\x2c\\x97\\x6f\\xf3\\xa4\\x37\\xd0\\x97\\x86\\x7d\\x9b\\xfb\\xa9\\x1d\\x84\\xbd\\xa5\\x5a\\x6b\\xcd\\x6e\\x36\\x41\\xb2\\x13\\xa2\\x18\\xb3\\x04\\x15\\x89\\xc5\\x5a\\xfb\\xb3\\x44\\xde\\x6e\\x97\\xd8\\xc3\\x5b\\x5c\\x86\\xcf\\x3b\\xe0\\x63\\xf9\\x01\\xff\\xee\\xa8\\xcc\\x91\\x06\\x99\\x67\\xd2\\x34\\x60\\x35\\xa9\\x1e\\xb5\\x70\\x6a\\x3b\\x53\\xf6\\xd1\\xc3\\x4d\\x4d\\x21\\x16\\x70\\x6b\\x65\\xc2\\x98\\xec\\x57\\xde\\x82\\xab\\xc4\\x00\\x3c\\xe8\\xcc\\x5e\\x0b\\x88\\xff\\x71\\x0d\\xda\\x1d\\xce\\xf6\\xf1\\x54\\x27\\x71\\x06\\xb8\\x3e\\xb4\\x6c\\x04\\x5b\\x08\\x2d\\x11\\x3b\\x36\\x1d\\x6a\\x62\\x58\\x08\\xc9\\x13\\x05\\x84\\xdf\\xc9\\x67\\x07\\xef\\x89\\x55\\x90\\x7b\\xaa\\x61\\xcf\\x88\\xc6\\x6b\\x6d\\x1f\\x60\\x58\\x11\\x19\\xcb\\x62\\x17\\xa8\\x52\\x15\\x73\\x36\\x17\\x8c\\x68\\x5e\\x6e\\xd4\\x85\\x26\\xed\\x5c\\x4e\\x3b\\x79\\x67\\xd5\\x1f\\x99\\xdf\\x68\\x76\\xa1\\xac\\xfb\\x84\\x5c\\x57\\x1b\\x89\\x86\\x56\\xe5\\xe3\\xbc\\x73\\x98\\x0b\\x9b\\xed\\x11\\x98\\x86\\x63\\x59\\xc9\\xe9\\xb1\\xef\\xa9\\x15\\xf8\\x10\\xd1\\xef\\x8a\\xd6\\xcb\\x3f\\xc2\\x1f\\xbf\\xe6\\x54\\x30\\x6d\\xe6\\xca\\x13\\xa3\\xa6\\xa4\\x8e\\x7a\\x13\\xed\\x87\\x46\\xac\\xbd\\x07\\xf4\\x8e\\xb0\\x0c\\x36\\x37\\x4b\\x1e\\xb4\\xf3\\xf0\\x1c\\x19\\xe2\\xe8\\xd3\\x7e\\x9f\\xc0\\x64\\xb3\\x3c\\x0d\\x66\\x9b\\xba\\x55\\x4d\\xdc\\x68\\x21\\xa7\\x7b\\x40\\x89\\xca\\xbd\\xca\\xfc\\x97\\xf6\\x0e\\x60\\x50\\xbc\\xa4\\x44\\xae\\x8c\\xfc\\x44\\xd9\\x3c\\x40\\xef\\x53\\x18\\xbe\\xe6\\xf8\\xcf\\x0c\\x06\\x7b\\x85\\xcd\\xdd\\xc4\\x59\\x74\\xa4\\xea\\xcf\\xc3\\xef\\x51\\x31\\x5b\\xa0\\xf3\\xf6\\x29\\x68\\xc7\\x00\\x3a\\x7f\\xf4\\x44\\x61\\x24\\x00\\xb1\\x59\"},\n{{0x3b,0x6b,0xa6,0xd5,0xcc,0x9c,0xd6,0x24,0x1d,0x8b,0x00,0x97,0xa3,0x72,0x2e,0x4d,0x06,0x6f,0xea,0x3d,0x56,0x0a,0xea,0xb4,0x67,0x3e,0x86,0xf1,0xf8,0xec,0x60,0x26,},{0x8c,0xa6,0x52,0x07,0x17,0xcf,0x36,0x3c,0x4c,0xef,0xfa,0x76,0x32,0x8a,0x0a,0x16,0x6f,0xf8,0x3e,0x45,0xca,0x7d,0x19,0x1c,0xc8,0xef,0x6c,0xa6,0xe5,0x24,0x33,0x67,},{0x78,0x8c,0x9f,0x45,0x54,0xdd,0xba,0x5c,0x7d,0x64,0xba,0x75,0x9e,0xc4,0x56,0x94,0xec,0x79,0xfb,0x85,0xe8,0x23,0x68,0xa0,0x74,0xbd,0xd8,0xdf,0x34,0x42,0x13,0xa5,0x6d,0xd0,0x9f,0x33,0x4c,0xd9,0xac,0xb9,0x41,0xbe,0x28,0x3d,0x98,0xc4,0xb1,0x5d,0xcf,0xec,0xd1,0x4e,0x93,0xf6,0xa2,0xe3,0xcb,0x0c,0x1a,0xa2,0xde,0xe7,0xd9,0x0b,},\"\\x36\\xde\\x93\\x0c\\xc8\\xe1\\x88\\x60\\x83\\x6a\\x0c\\x82\\x9d\\x89\\xe9\\x63\\xa5\\x8b\\xdd\\x9c\\x6b\\x6e\\xf5\\xbc\\x61\\xf7\\x59\\x92\\xd2\\x07\\x52\\x42\\xdc\\xa2\\x3e\\x28\\xde\\x20\\x5a\\x33\\xdf\\xea\\x86\\x1f\\xc4\\x4a\\x32\\x62\\x8e\\x8e\\x7c\\xdd\\x3e\\xd7\\xff\\x49\\xea\\x6a\\x70\\x97\\xe0\\x09\\x0c\\xfd\\x9f\\xf5\\xec\\xab\\x1d\\xe8\\x22\\xfc\\x0a\\x4c\\x37\\x76\\xdd\\x56\\xc1\\x91\\x92\\x04\\x51\\x6a\\x94\\xce\\xc5\\x63\\x8d\\xa1\\xd9\\x9e\\x52\\xb8\\x66\\xf5\\xec\\x41\\x62\\xa9\\x12\\xed\\xb4\\x1c\\x1e\\x92\\xed\\xfc\\x35\\x3f\\x67\\x05\\xe1\\xc1\\x2c\\xd4\\x1c\\xb6\\x2d\\xed\\x4a\\xd8\\x15\\x79\\x40\\x05\\x9b\\xfc\\xf5\\x07\\x19\\xd3\\xf2\\xad\\x00\\x84\\x85\\x40\\xce\\x89\\xf3\\xf9\\xaf\\xa6\\x10\\xcc\\xba\\x5e\\xcc\\x37\\xe3\\xe2\\xc1\\x53\\x4f\\xcb\\x38\\xfc\\xd3\\x9a\\x2d\\x14\\xd5\\xb5\\xda\\x6f\\xea\\x24\\xe0\\x06\\x65\\x4e\\x30\\x90\\x47\\xa2\\x9c\\xad\\x0a\\xe4\\xda\\x8e\\x70\\x8f\\x97\\xa1\\x8c\\xad\\x5f\\xbd\\xc9\\xac\\x84\\x40\\x0c\\x53\\x2c\\xed\\x54\\x88\\x86\\x53\\x9e\\xdd\\x6c\\x54\\x10\\x74\\x79\\x0a\\xe4\\x50\\x2f\\xdf\\xe9\\xf3\\x27\\x3a\\x87\\x6a\\x21\\x86\\x23\\xa2\\x57\\x06\\xa1\\x52\\x5e\\x67\\xe5\\x7a\\x16\\xd2\\x2c\\x21\\xb6\\xa4\\x5e\\x23\\x84\\xe2\\x87\\xac\\x44\\x52\\xae\\xc4\\xe0\\x63\\x05\\x6b\\x4c\\x17\\x8a\\xb0\\xe5\\xb2\\xa5\\xba\\xd3\\xf4\\x63\\xc4\\x72\\xc4\\xea\\x1f\\x9c\\x1a\\x66\\xe5\\x27\\x04\\x73\\xa8\\x35\\x09\\x4e\\x8f\\x0e\\xef\\x68\\x0c\\xd7\\xb2\\x0d\\x0e\\x70\\xf4\\xd6\\xc9\\x58\\xfe\\xe0\\x8a\\x93\\x60\\xaa\\x60\\x66\\x88\\x8f\\x4d\\xd7\\xce\\x5e\\xc2\\x22\\x59\\xfa\\x0b\\x53\\xfe\\x92\\x71\\xc0\\x83\\xc6\\xfc\\xdb\\x72\\x83\\xb0\\x90\\x61\\x08\\x8c\\x52\\xf7\\x1b\\xfd\\xd2\\x77\\x7c\\xe0\\x80\\x1f\\x41\\xa6\\xc4\\xce\\x90\\xef\\x13\\x1d\\xe1\\xe1\\x83\\xcb\\x89\\x49\\xce\\x32\\x3c\\x9e\\xb1\\x3a\\x4b\\x0c\\xac\\xf9\\x9d\\xef\\xdf\\xdb\\x68\\xd5\\xed\\x1f\\x68\\x91\\xb4\\x8e\\x21\\x04\\x76\\x68\\xd6\\x9d\\xe8\\xa8\\x0f\\x8e\\x56\\x34\\xde\\xd0\\x87\\x36\\xa4\\xfb\\x54\\x10\\xcd\\xea\\x9c\\x72\\x59\\x6e\\x36\\xdf\\x68\\x41\\xf2\\xee\\xa4\\x68\\x50\\xc8\\x74\\x73\\xc8\\x95\\x54\\x02\\x05\\xb0\\x92\\x19\\x60\\xff\\xa5\\xd9\\xd8\\xff\\xb8\\xe2\\x9c\\xde\\x96\\xa3\\xed\\xe0\\x15\\xac\\xbc\\x26\\x97\\x40\\x04\\xd3\\xe4\\x38\\xa8\\x5b\\x2e\\x33\\x85\\xf6\\x4d\\x18\\x14\\x00\\x39\\x41\\xff\\xd3\\x63\\x99\\x2d\\x39\\x40\\xc6\\xe6\\xd8\\x1f\\xf8\\xe4\\x5f\\xce\\xd6\\xd3\\x6c\\xe1\\x98\\xd8\\xcc\\xbe\\xfe\\xe4\\x32\\xa7\\x7d\\x8f\\xca\\xdd\\x73\\xfb\\x79\\x9f\\x6b\\xaf\\xef\\xb5\\x1a\\x2d\\xa7\\x98\\x72\\x1c\\x3d\\x46\\x5b\\x16\\x3e\\xf1\\x3e\\x6e\\xcc\\x65\\xe6\\x03\\xb2\\x89\\x3e\\xe4\\xcc\\x9e\\x1c\\x6d\\x1d\\xe7\\xa6\\x5c\\xab\\x5c\\xbd\\xf5\\x36\\x85\\x5e\\x28\\x8c\\x3c\\xcd\\xa8\\xd2\\xfa\\x3c\\xe1\\x0c\\xf4\\x93\\x58\\xa2\\xef\\x4e\\xf0\\x76\\xe5\\xbf\\xa9\\x1b\\xbc\\xf3\\xd9\\x66\\xdf\\xa3\\xdc\\x6e\\x71\\x2f\\x19\\x56\\xd4\\xe5\\x8a\\xa3\\x6e\\x71\\x2d\\xd3\\x34\\x71\\x69\\xb1\\x9c\\x8d\\x44\\xbe\\xc5\\xbc\\xb7\\x30\\x77\\x8f\\xcc\\xcc\\x58\\x9e\\xd5\\xd3\\x50\\xd4\\x4c\\x17\\xbd\\xe2\\xee\\xbb\\x6f\\x5e\\xc5\\x9f\\xb2\\x40\\xd6\\x7d\\x81\\xae\\xa9\\x26\\x7f\\x34\\xf1\\x5e\\xee\\x2d\\xe3\\xf4\\xfa\\x67\\x39\\x14\\x79\\xbd\\xbb\\x43\\x0f\\x48\\x43\\x70\\xfb\\x0e\\x08\\x95\\xb9\\xae\\x06\\x5b\\xbd\\xd4\\x3e\\x23\\x0c\\x62\\xac\\x07\\x18\\x4e\\x8b\\x06\\xb2\\x4b\\x8b\\x97\\xec\\x02\\xdc\\x6f\\x37\\xef\\x61\\x64\\x1e\\xd5\\x6e\\x3f\\x5e\\xb8\\xd2\\x08\\x0b\\x51\\x44\\xef\\x76\\x0b\\x51\\x87\\x52\\xe1\\x97\\x54\\x79\\x2e\\x19\\x34\\x3a\\x38\\x55\\xe1\\xe2\\xf7\\xa7\\xdc\\x62\\x35\\x17\\xee\\xd2\\xf5\\xd2\\x65\\x48\\xa6\\x8e\\xb8\\xff\\xd7\\xbf\\x70\\xf7\\x8f\\xd1\\x86\\xdb\\x63\\x49\\x28\\xbb\\x98\\x13\\x8f\\x2b\\x8f\\xe8\\x44\\x81\\xcc\\x53\\xf5\\xaa\\x35\\xe2\\x66\\x6c\\x63\\x25\\xe1\\xd2\\xb8\\xac\\x5e\\x2d\\xf2\\x93\\x5b\\x7f\\x64\\x13\\x95\\x2d\\x10\\xd6\\x07\\x6f\\xfc\\x75\\xbb\\x6a\\xf6\\x3b\\x29\\xb0\\xb9\\x66\\x3b\\xec\\x37\\x24\\x7b\\x66\\xb5\\x08\\xdd\\xe4\\x1f\\x2f\\x11\\xb8\\x43\\x33\\x55\\x9d\\xfa\\xc7\\x3f\\x76\\x1b\\xcd\\xa8\\x4a\\x48\\xd2\\x66\\x07\\x3a\\xef\\x16\\x38\\x46\\x08\\x49\\xe7\\xa1\\x72\\x06\\xa2\\x5f\\x68\\x00\\x77\\x0b\\x91\\x4c\\xc0\\x26\\xba\\xf9\\xe3\\x25\\x59\\x14\\xe1\\x32\\x58\\x44\\x1c\\xef\\x35\\xad\\x1d\\x66\\x83\\x3e\\x98\\x7e\\xbe\\x44\\x31\\xe6\\xa6\\xbb\\x22\\x2c\\xbb\\x65\\xaf\"},\n{{0xdd,0x99,0x87,0xb1,0x8f,0x9a,0x92,0x2c,0x0f,0x6f,0xea,0x18,0xeb,0x00,0xb8,0x96,0xc7,0xa2,0xd3,0x09,0x3d,0xb3,0xea,0x31,0xd3,0x84,0x21,0xda,0x0d,0xe5,0x12,0x31,},{0x57,0x39,0x21,0xa9,0x55,0xfe,0xb6,0xdd,0xe4,0x1b,0x05,0x5c,0x8d,0xac,0xac,0xcd,0x1d,0xb7,0xfe,0x9e,0x36,0xb5,0x09,0xd3,0xc9,0xe3,0x6f,0x97,0x35,0x75,0x23,0x24,},{0x3e,0x9f,0x2b,0x00,0x7c,0x0e,0x29,0xec,0x87,0x59,0x95,0xa6,0x30,0x9b,0x97,0x3d,0xeb,0x8b,0xaf,0x11,0x3d,0xed,0x13,0xf1,0xe0,0x00,0x3e,0x9b,0x9b,0xf9,0x39,0x16,0xa4,0xdf,0xe4,0x79,0x37,0xda,0xdf,0xc7,0x8a,0xa6,0x63,0xc5,0x5f,0x67,0x4e,0xc3,0x5c,0x38,0x46,0x25,0x8f,0x18,0xe7,0xbb,0x93,0xfb,0xba,0x3e,0x82,0x6a,0x1f,0x0d,},\"\\x48\\x16\\x2f\\xdc\\x3a\\xbf\\x73\\x19\\xc6\\xca\\xab\\x60\\xcb\\x8d\\x05\\x20\\x87\\x5c\\xb4\\xee\\x8a\\x07\\x09\\x27\\x83\\x16\\x7d\\x47\\x33\\xff\\xe5\\x20\\x4e\\x5f\\xeb\\xe7\\xd2\\x91\\xe9\\x53\\x6b\\xde\\xa3\\xdf\\x06\\x37\\x15\\x9a\\x65\\x3e\\x09\\xfd\\x99\\xaf\\x66\\x1d\\x83\\x00\\xae\\x74\\x1a\\x3e\\x91\\xa8\\xbd\\x85\\xea\\xd0\\x5d\\xc7\\xd9\\xe6\\xf9\\x29\\x32\\x33\\x16\\xed\\xc4\\xca\\x62\\x4e\\xa7\\x81\\x8b\\x25\\xbd\\xc0\\x61\\xf7\\x14\\x92\\xfd\\x22\\xd4\\x65\\xab\\x22\\x6f\\xd9\\xa1\\x0d\\x8b\\xab\\xfc\\x07\\x4c\\x68\\x6c\\x43\\x6c\\x24\\xa3\\xa5\\x3f\\x8f\\xf3\\x89\\xce\\x9c\\xa1\\xdb\\xc8\\x90\\x74\\x45\\x88\\x92\\x41\\xf8\\xfd\\xa3\\xa7\\xa3\\xf5\\x02\\x4f\\xa8\\xcb\\x0d\\x04\\x4b\\xda\\xf6\\x71\\x6d\\x98\\x3a\\x6d\\x83\\x98\\x14\\xff\\xe7\\x0d\\xdc\\x55\\xbb\\xba\\x11\\xac\\x97\\x88\\x7b\\xdb\\x4d\\xad\\xa9\\x65\\x65\\xbb\\x07\\x5d\\x5f\\xc1\\xd3\\xc5\\x24\\x4b\\x9f\\xff\\x77\\xde\\x58\\x72\\x9a\\x05\\x9a\\x91\\x1f\\xb3\\xe0\\xeb\\x16\\x4f\\xb8\\x42\\x9e\\x26\\x56\\x85\\xd1\\x4a\\x63\\x23\\x30\\x46\\xd2\\x0e\\xcf\\x28\\x9c\\x55\\x72\\x31\\x69\\xa9\\xd6\\x3d\\xda\\x0d\\x52\\x55\\x15\\x3d\\x9e\\xf4\\xa6\\x1b\\x92\\x12\\xf4\\xb8\\x20\\x69\\x7a\\xe7\\xc3\\x08\\xcf\\xab\\x40\\x3b\\x2c\\x34\\x31\\x90\\x62\\x26\\xe4\\x5c\\xe2\\x19\\x20\\xdf\\x52\\x01\\x60\\x9d\\xaf\\x83\\x0f\\x28\\xad\\x79\\x60\\x05\\xa9\\xbd\\x8e\\xba\\x62\\x0c\\xf8\\x39\\xc3\\xba\\x22\\x7b\\x96\\x3c\\x7b\\xd0\\x91\\x48\\x22\\xdf\\x2c\\xa0\\x3c\\x22\\x54\\xd0\\xcb\\x8a\\xca\\xe0\\xd5\\x9e\\x4c\\x3e\\x0e\\xc2\\x15\\xc8\\x36\\x96\\x9d\\xcd\\x1d\\x49\\xbf\\xe1\\x97\\xe2\\xf3\\xee\\xa3\\xfa\\x8a\\x37\\x3b\\x55\\x8d\\x0f\\xb9\\x06\\x3c\\xf1\\x56\\x8e\\x73\\x9a\\xad\\x8f\\x09\\xfb\\x43\\x7c\\xaf\\xb5\\xa2\\x72\\x37\\x5f\\x43\\x60\\x64\\xee\\xe1\\x1b\\xd9\\x03\\xd3\\xaa\\xea\\xb4\\xe3\\xfd\\xcd\\x36\\xbd\\x20\\x76\\xee\\xa1\\x79\\xa4\\xf0\\xd4\\xfb\\xc8\\xdf\\x42\\xbf\\x26\\x60\\xf0\\x8d\\xe7\\xd5\\xc6\\x39\\x7c\\xae\\x10\\xb7\\x27\\x74\\x58\\xaa\\x6c\\xfa\\x01\\xe8\\xa6\\x73\\x7e\\xb1\\x26\\x22\\x78\\x56\\x64\\x66\\x91\\x68\\x1c\\x10\\x6a\\x15\\x7a\\x26\\xae\\xd2\\x1b\\x1a\\xaf\\x0e\\xd2\\x76\\x64\\x21\\xcf\\xc3\\xd1\\xc7\\xdd\\xfb\\x72\\xfc\\xdf\\x4b\\x8b\\x49\\x0f\\xc0\\x9a\\xce\\x49\\xae\\xdd\\x77\\x12\\xb2\\x1a\\xc5\\x6f\\x86\\x01\\xf6\\x25\\x56\\x3c\\x78\\x43\\x06\\xf3\\xb9\\x17\\x4a\\xdd\\xf7\\x64\\xe0\\x51\\xaa\\xdf\\xe1\\x28\\x31\\xaf\\x96\\x69\\xe6\\x2c\\xab\\x12\\x1c\\x74\\xdf\\x34\\x37\\x24\\x42\\x9d\\x6c\\x26\\x66\\x02\\x71\\xc3\\x2f\\x40\\xcf\\x7c\\x2d\\x08\\xbd\\x0a\\xfc\\xc7\\x28\\xde\\xf4\\x13\\x5d\\x4e\\xb5\\x5b\\x6a\\x3e\\x76\\x29\\xd8\\x06\\x86\\x4a\\x85\\xb3\\x6a\\x32\\xb9\\xb2\\x1a\\xc0\\xd3\\x96\\x80\\xa2\\xae\\x4e\\xc4\\x18\\x97\\x09\\x17\\x8e\\x34\\x94\\x97\\xf3\\x93\\x99\\xfb\\xc7\\x8b\\x3c\\x6c\\xfa\\xca\\x6e\\xde\\xa7\\xc3\\x3d\\xda\\x3c\\xc1\\x1e\\x43\\x84\\xf1\\x58\\x3d\\x6c\\xfc\\x6b\\x58\\xf4\\xea\\xa2\\xbc\\x56\\xab\\xa4\\x2f\\x73\\x8a\\x42\\x9b\\x93\\x58\\x08\\x50\\xde\\xe3\\xfd\\x25\\x39\\x94\\xf8\\xb0\\xfa\\x66\\xee\\x8e\\x27\\x3d\\xec\\xab\\xd5\\x32\\x09\\x5f\\xb0\\x4a\\x4a\\x3c\\x34\\x0a\\xf0\\xe5\\x5b\\x57\\xef\\xab\\x43\\x63\\x0f\\xc0\\x2e\\xf2\\x0b\\x42\\x5c\\xa2\\x18\\x7e\\x3c\\x6c\\x5e\\x10\\xf1\\x2d\\x61\\x8f\\xd2\\x43\\xa2\\x24\\xf6\\x50\\x1e\\xbe\\xb9\\xd3\\x21\\xc6\\x38\\x5b\\x81\\x27\\xef\\x9c\\xdc\\xd0\\x97\\xce\\x7f\\xa0\\x21\\xcf\\x40\\xd2\\x1c\\x39\\x91\\x23\\x43\\xf6\\x7a\\xcc\\xe1\\x82\\x5e\\x3a\\x51\\xb8\\xa7\\x18\\xe8\\xc3\\x40\\x62\\x2f\\xff\\x65\\xfe\\x00\\x53\\xd2\\x4a\\xa3\\x35\\x1b\\x6a\\x24\\x00\\x18\\x5d\\x7a\\xeb\\x88\\xe8\\x7a\\xc4\\xa1\\xd3\\x94\\x90\\x9d\\x49\\x41\\x4a\\xef\\xc2\\x2b\\xa0\\x09\\xaf\\xf6\\x96\\x2c\\x92\\x17\\xd7\\x55\\x69\\x4e\\x4d\\x6a\\xa8\\xa5\\xd6\\xa8\\x03\\xce\\xbb\\x15\\xde\\x8f\\x54\\x16\\x34\\xb6\\xfc\\xeb\\x0c\\xac\\x79\\xdd\\xa8\\xa1\\x8e\\xef\\xbb\\x53\\x7e\\x70\\xff\\xe9\\xaa\\x5a\\x6a\\x6a\\xaf\\x92\\x40\\xfa\\xc2\\xea\\xcb\\xfb\\xef\\x01\\xad\\x6b\\xdf\\x50\\x75\\x87\\x80\\xf8\\x6a\\x4e\\x48\\x89\\x85\\x36\\x2d\\x58\\x25\\x01\\x1f\\x5e\\x8b\\x66\\x42\\x5a\\x61\\x6b\\x7e\\x10\\x4e\\xb2\\x3f\\xe8\\xf1\\x00\\xcb\\x02\\x49\\x82\\x36\\x62\\xbd\\xa3\\xda\\x47\\xa4\\xc3\\xc1\\xca\\x2f\\x91\\x4b\\x25\\xb9\\x73\\x85\\x34\\x02\\x60\\x47\\xdf\\x6d\\x7f\\xf6\\x31\\xdf\\x2c\\x41\\x31\\xf6\\x80\\xe1\\x37\\x43\\xc9\\xcc\\xf2\"},\n{{0x38,0xd2,0xef,0x50,0x9f,0x93,0x05,0x1f,0x14,0x51,0x67,0x73,0x7c,0x22,0xe1,0xa5,0xbf,0xe8,0xf4,0xa9,0x1e,0xba,0x0b,0xb8,0x7c,0x39,0xce,0x04,0xa8,0x9b,0xae,0xc6,},{0x01,0x11,0x5f,0x6d,0x89,0xa5,0xda,0xab,0x54,0xf8,0x92,0xbb,0x4a,0x4b,0xda,0x1c,0xe5,0xd8,0xf6,0xc9,0xc8,0x8a,0x50,0xce,0xe8,0x3b,0xd9,0x87,0xa2,0xc0,0xdd,0xf7,},{0xde,0xc4,0x62,0x53,0x50,0x9b,0x11,0xe4,0xb5,0x2a,0x6a,0xe4,0xf3,0x66,0xb6,0x80,0xdf,0xfc,0x28,0x0d,0x0a,0x04,0x4f,0xc0,0xcb,0x79,0x0b,0x6e,0x75,0x13,0x81,0x46,0x1e,0x1e,0x60,0x2a,0x89,0xe3,0xb3,0xd3,0x06,0x4c,0x40,0x7f,0x60,0x2f,0x1c,0x22,0x40,0x4b,0x68,0x23,0xbd,0x24,0x67,0x54,0x93,0x14,0xa0,0x00,0x01,0x66,0x4a,0x08,},\"\\x42\\x7b\\x5a\\x01\\xe8\\x59\\x7f\\x04\\xfd\\x42\\x2f\\x0a\\x66\\x2d\\x0b\\xe2\\xdf\\xa8\\x53\\xed\\x5f\\x9d\\x3f\\x60\\xff\\x90\\xf2\\xc5\\xee\\x08\\xbb\\x59\\xfd\\x03\\xd4\\x02\\xb7\\x54\\xca\\xf5\\x4d\\x00\\x58\\xf5\\xa2\\xcf\\x87\\xaf\\x4f\\xef\\x21\\x77\\xd5\\x9e\\x18\\x22\\x62\\x93\\xfd\\x2a\\xf3\\x76\\xbc\\x98\\x7b\\xf7\\xb3\\x20\\xb9\\xd1\\xe2\\x49\\xab\\x9e\\xfb\\x75\\x07\\x8e\\x6d\\x3d\\xf2\\x9e\\x03\\x50\\x47\\x76\\x35\\x43\\x44\\xaa\\x69\\xe7\\x2e\\x1e\\xbc\\x52\\xa3\\xc3\\x8a\\x4c\\x2a\\x16\\x73\\xb4\\xe9\\x74\\xa2\\xe4\\xe1\\x2a\\x2e\\x78\\xea\\x3e\\x3f\\xe5\\x0c\\x53\\x63\\x0d\\x09\\x6d\\xa3\\xe2\\xfe\\x82\\x99\\xf7\\x1a\\x1b\\x44\\x1b\\x4c\\xf0\\xca\\xeb\\x93\\x7a\\xfa\\x4a\\x0e\\x39\\x15\\xcc\\xab\\x39\\x96\\xc9\\xf6\\xa8\\xf4\\xfd\\x37\\x54\\x3e\\x8f\\x75\\x90\\x0c\\xfd\\x47\\x17\\x53\\x70\\xef\\xb8\\x52\\xa5\\xf6\\x9d\\x67\\x36\\x83\\xf9\\x98\\xfd\\xcf\\xf8\\x5f\\xf8\\xf3\\x2b\\xaa\\x80\\x70\\x66\\x60\\x44\\x22\\x02\\x7d\\x51\\xa4\\x35\\xdd\\xf9\\x88\\xed\\x2f\\xd8\\xeb\\x19\\x1f\\x10\\xb4\\x68\\x07\\x42\\x00\\x08\\x75\\x6e\\xb4\\xe3\\x00\\xc4\\x09\\x9c\\x2d\\x64\\x50\\xbc\\xc6\\xa4\\xe7\\xd0\\x67\\x31\\x56\\xb8\\x37\\xf0\\x50\\x63\\x38\\xf3\\xd1\\xb5\\x73\\x4b\\x16\\x6c\\xa5\\xcc\\x2f\\x24\\xa4\\xef\\x02\\x6c\\xda\\x2c\\x4a\\xe3\\x10\\x5b\\x63\\xca\\x85\\x70\\xd1\\x85\\x46\\xcf\\xac\\xb8\\x60\\x42\\x96\\x6a\\x00\\xef\\x52\\xc7\\x29\\x90\\x19\\xf6\\x8a\\x2d\\xf0\\x8c\\x8b\\x70\\x4e\\x85\\xe7\\x13\\xc3\\x48\\xd7\\xf1\\x67\\x76\\x60\\xe1\\x8e\\xba\\xb5\\x9b\\xf4\\xe1\\x2e\\x6f\\xf2\\xd7\\x83\\xd8\\xd5\\xd4\\x2a\\xab\\x6e\\xf0\\x17\\xb7\\xa1\\x96\\x6a\\xee\\x8d\\xc1\\x4d\\xda\\xbe\\xd4\\x9b\\x4b\\x64\\x3d\\xf4\\xe9\\xb0\\xb6\\x03\\x83\\xc7\\xd8\\xb4\\xb8\\x8c\\x65\\xa8\\x98\\xc1\\xc7\\x7d\\x43\\xd6\\xbd\\x68\\xb2\\xa5\\x74\\x3f\\x1f\\xed\\xd6\\x54\\xdc\\x84\\x49\\x6d\\xa0\\x2c\\xeb\\x69\\xb9\\xb4\\xd3\\xa8\\xe0\\x0c\\xcd\\x72\\xe7\\xc7\\x5f\\xc5\\x0a\\x8d\\xd0\\x87\\xe1\\x83\\xe6\\xc1\\xf5\\x79\\xba\\xeb\\xc5\\xc6\\x3f\\x28\\x07\\x93\\x67\\x91\\xb5\\xfe\\x48\\x47\\xcd\\xcf\\x15\\x17\\x74\\x23\\x52\\x05\\xcd\\x2d\\x7b\\x8b\\xf4\\xae\\x88\\x19\\x22\\x5e\\xa7\\x08\\xb7\\xba\\xac\\x66\\x99\\x8f\\x0c\\xba\\xb2\\xc7\\xdd\\xf2\\x51\\xf3\\xb1\\xde\\x10\\x17\\xd3\\x97\\x69\\x22\\x05\\xee\\xa6\\x39\\xf1\\x2d\\x77\\xbe\\xef\\x6c\\x13\\xbb\\x12\\x10\\x0f\\xf8\\x90\\x64\\x70\\xbc\\x7b\\x21\\x29\\x80\\x53\\xbe\\x1a\\x61\\xb7\\xb3\\xa4\\x99\\xed\\xc3\\x10\\x99\\x6c\\x8b\\xc0\\x87\\x19\\x07\\xca\\x46\\x8e\\x89\\xed\\x31\\x1a\\xdc\\xa2\\xe2\\xb8\\x29\\x30\\x97\\x5b\\x3e\\xfb\\xbf\\xc0\\x3c\\xdd\\xf4\\xd9\\x48\\xc4\\x76\\x5e\\x8c\\x10\\x59\\x08\\x82\\x16\\x9a\\xcd\\xdb\\x8f\\x8c\\x36\\xd8\\x4c\\x2d\\xac\\x3b\\x79\\x8e\\x7a\\xbf\\x84\\x47\\x12\\xfa\\x45\\x8d\\x27\\x7c\\x24\\xe8\\x14\\x04\\x7d\\x74\\x23\\x19\\xa8\\x34\\xdd\\x9f\\x92\\x7a\\x2b\\x44\\x85\\xef\\x13\\x74\\x5f\\x7a\\x60\\xdd\\x6b\\xb3\\x37\\x93\\x63\\x04\\xc9\\x7d\\x3f\\x9f\\x14\\x4e\\xb2\\x9b\\xb6\\x95\\xb8\\xdc\\x31\\xb9\\xd8\\x49\\x10\\x61\\x1d\\x28\\xd5\\x81\\xca\\xa9\\x36\\x5d\\x6d\\xff\\x52\\xd4\\x10\\xa4\\xad\\x52\\xbd\\x12\\x17\\x29\\xff\\xf5\\x28\\x88\\xf4\\xda\\xae\\x17\\x07\\xf6\\xf5\\x6d\\xac\\x61\\xff\\xb9\\x96\\x1c\\xda\\x71\\x76\\xaf\\x44\\x60\\xa6\\xd5\\x54\\x2a\\x20\\x44\\x6f\\xb5\\x14\\x7f\\xce\\x72\\x72\\x04\\xce\\xc6\\x89\\x9b\\x9a\\x3d\\x4f\\xf6\\x22\\x6b\\xb8\\xa1\\xc7\\x8e\\x36\\xfc\\xdd\\x9e\\x50\\xc0\\x40\\xd7\\x2d\\x0f\\x40\\x07\\xd3\\xfa\\x9a\\xa7\\x67\\xe4\\xab\\xd0\\xad\\xd6\\x2f\\xdb\\xcc\\xde\\xff\\x67\\x21\\xeb\\x25\\x9e\\x00\\xa7\\x21\\x63\\x20\\x06\\xbe\\xde\\x0d\\x17\\x3d\\x38\\x34\\x4d\\xea\\x44\\xf9\\x6b\\x67\\xd9\\xa2\\xee\\xa1\\xd2\\xaf\\x5f\\x74\\x8e\\x8e\\xbd\\xb4\\x41\\xbf\\xb4\\xe5\\x8e\\x2d\\x42\\xfe\\xc7\\x40\\x56\\x6a\\xcf\\x73\\xa3\\x03\\x35\\x8f\\x7d\\x89\\xc8\\x15\\x8c\\xf2\\x1f\\xe8\\x5b\\x0d\\x4a\\x41\\x7e\\xbd\\xc8\\x6d\\x04\\x69\\xf6\\xb9\\x1c\\x24\\xad\\x61\\x0d\\x48\\x6d\\xed\\xc2\\x18\\xb2\\xce\\x7a\\x8b\\x96\\x75\\x47\\x23\\x15\\x1f\\x0d\\x00\\x76\\xff\\xf9\\xf1\\x9d\\x11\\x2d\\x9c\\x05\\x92\\xfb\\x8d\\x92\\xc9\\x9d\\xcb\\x8d\\xdf\\xaa\\x46\\xfb\\xe0\\xd9\\x2d\\xf4\\x6b\\x8c\\x00\\xca\\x43\\x45\\xad\\xb6\\x9a\\x5a\\xca\\x69\\x4a\\x86\\xcf\\x30\\x64\\x64\\x51\\xbb\\x17\\xba\\x6e\\x60\\x7a\\x91\\x2b\\xf1\\x09\\xd5\\xfc\\x2d\\x3e\\x27\\xd0\\x0d\\x94\\x56\\x00\\xa8\\xa5\\x7c\"},\n{{0x43,0xbf,0xb3,0xdb,0xe4,0xd9,0xbd,0xaa,0x82,0xb3,0x54,0xdd,0x59,0x63,0x34,0xe6,0x60,0xd7,0x6f,0xc0,0xb2,0xeb,0x69,0x89,0x93,0xae,0xf3,0x76,0x7f,0x1c,0x7c,0x7f,},{0xd0,0x0a,0xec,0xef,0xf0,0xce,0xb8,0x32,0xc2,0x51,0xd1,0xfe,0x6b,0xcb,0xea,0xea,0xcb,0xb4,0x11,0x3f,0x52,0x81,0xba,0xba,0x4e,0x87,0x8f,0x7b,0x95,0xf9,0x3f,0x07,},{0xa9,0x99,0x55,0x23,0x02,0x0a,0x0d,0x22,0x2b,0xc4,0x8f,0x98,0xd0,0x55,0x04,0xe3,0x06,0x8f,0x30,0x4a,0x6d,0x19,0x70,0x06,0xcc,0x9c,0x03,0x5e,0xea,0xde,0x09,0x9e,0x7a,0xa9,0x7e,0x90,0x89,0x4e,0xad,0x17,0xe8,0xc3,0x0b,0x0a,0xa4,0xa9,0x80,0x88,0xf0,0x38,0xb9,0x22,0x44,0xc4,0xb2,0x0f,0xde,0x96,0x4f,0x85,0x34,0xe8,0xfb,0x03,},\"\\x3f\\x3e\\xed\\xdc\\xae\\xf4\\xe1\\x66\\x2a\\xdb\\x66\\xbb\\x1b\\x20\\x7d\\x79\\x3f\\xcb\\xef\\x81\\x50\\x05\\xe8\\x26\\x43\\xed\\x70\\xc9\\x85\\x54\\x03\\xda\\xc2\\x8b\\x52\\x07\\x27\\xa9\\x01\\xa5\\x32\\xd2\\x8b\\x9b\\xd1\\x34\\x8d\\xb2\\xf8\\x96\\x7b\\xbb\\x8c\\x90\\x98\\xb0\\x7f\\x57\\x0a\\x2e\\xae\\x1e\\xe4\\x82\\x64\\x0c\\x0b\\x67\\xa5\\x2a\\x38\\x61\\x21\\x33\\xa1\\x5e\\x25\\x8e\\xde\\x38\\xcd\\xa8\\x78\\xff\\x36\\xed\\x32\\x1d\\xff\\x87\\xcc\\x6a\\x01\\x38\\x3b\\xa8\\x40\\x67\\xd6\\x0a\\xf4\\x17\\x76\\xac\\xf8\\x0a\\x8a\\x4e\\xac\\x77\\xf7\\xd8\\x7c\\x37\\xa7\\x04\\xa3\\xe2\\xac\\xa1\\xe8\\x81\\x5e\\x49\\xfb\\xca\\xb7\\x97\\xc8\\x56\\x52\\x95\\x38\\xbe\\x07\\xd5\\x16\\x96\\x32\\x1f\\x69\\xb0\\x9b\\x5d\\xc5\\xa1\\x5e\\x5f\\x0e\\x4c\\x22\\xd2\\x28\\x37\\xf6\\x2e\\xe4\\xc8\\xbc\\x7f\\x25\\xa9\\x48\\x7b\\x96\\x2c\\xc2\\x0f\\x13\\x3f\\xcb\\x87\\x0e\\xd1\\x25\\xcc\\xa5\\x85\\xd1\\x81\\xbd\\x39\\xf9\\xdf\\xa6\\x61\\xf1\\x9b\\xe7\\x6d\\xa7\\xf6\\x5f\\x22\\xfb\\xbc\\x80\\x75\\x2a\\xeb\\x39\\xe8\\xd5\\x9e\\xd9\\x6e\\x14\\xf5\\x95\\xd0\\x49\\x29\\x40\\x2b\\x50\\x29\\xc6\\x0c\\xee\\x37\\xc0\\x21\\x7b\\xc5\\x31\\xd8\\x0d\\xb3\\x41\\xda\\xce\\x3c\\xce\\x76\\xe6\\x43\\xaa\\xc5\\x38\\x87\\x47\\x3e\\xdc\\x6e\\x19\\xcb\\x39\\xfe\\xcf\\x6a\\xf4\\x24\\xa2\\x06\\x63\\x93\\xd1\\xc3\\x3f\\xc7\\xb9\\x36\\x76\\xd7\\xe6\\x10\\x5b\\x9b\\xfc\\x96\\x7d\\x1e\\x29\\xaf\\xdc\\x4c\\xf1\\x5b\\xca\\xfa\\x09\\xc2\\x95\\xa6\\xf9\\xde\\xee\\x33\\x1a\\xb3\\xb0\\xd4\\x93\\x12\\x6e\\x2b\\x2f\\xff\\xb4\\x2a\\x6b\\x68\\xe7\\x9e\\x13\\x8d\\xb5\\x50\\x82\\x72\\x62\\xe4\\x87\\xa8\\x3f\\x37\\xf0\\x1d\\xd7\\x92\\x2b\\xe7\\x5e\\x92\\xfc\\xf5\\xd9\\xd4\\x80\\x3b\\x3a\\xc2\\xf3\\x5d\\xa2\\x10\\xfb\\x38\\xb2\\x63\\xb0\\xff\\xb6\\xc2\\x70\\x8d\\x4b\\x55\\xb7\\x57\\xaf\\x52\\x07\\x7a\\x7e\\x31\\x84\\xd0\\x1e\\x82\\xf6\\x4d\\x32\\xcc\\xe4\\xfd\\xee\\x0f\\x8d\\x4e\\x36\\x4b\\xcf\\xb9\\x58\\xeb\\xbf\\xdb\\xb6\\x22\\xb3\\x8b\\x51\\xe9\\x30\\x27\\x1c\\x7b\\x1b\\x70\\xaa\\x9d\\x4b\\xb3\\xaa\\x4b\\x99\\x7c\\x52\\x14\\x4d\\x3a\\xa6\\x21\\x62\\x57\\x3a\\x3a\\x1d\\x9c\\xe4\\x6c\\xdb\\xee\\xb8\\x44\\x9f\\x12\\x25\\xc4\\x49\\x63\\x1e\\x88\\x97\\x52\\x1c\\xd0\\xf6\\x37\\xb7\\x21\\xa1\\x25\\x2b\\x8a\\x10\\xab\\x0b\\xe8\\x70\\xaf\\xbc\\xd8\\x9d\\x58\\xb2\\xeb\\xb6\\x32\\x11\\x95\\x0c\\xad\\x7a\\xb8\\x2c\\x81\\x95\\x02\\x6b\\x50\\xea\\x8b\\x77\\xb9\\xe9\\x0e\\xd5\\x59\\xaf\\x44\\x84\\x30\\x88\\x51\\xa3\\xa1\\x56\\x71\\x68\\x53\\xa8\\xac\\x4e\\xcb\\x8c\\x5c\\xc7\\xd9\\x35\\xb0\\xf4\\x66\\x12\\x41\\x43\\xb1\\x17\\x7f\\x05\\xd0\\x8b\\x97\\xd1\\xad\\x54\\x2e\\xd2\\xc2\\x46\\x5a\\xf1\\x85\\xe7\\xdb\\x42\\xb6\\x9c\\xb8\\x02\\xa7\\x17\\x94\\xa3\\x13\\x98\\x83\\x02\\x96\\x70\\xc9\\x56\\x74\\x2a\\xaa\\xd7\\x90\\x7a\\x71\\xd9\\x59\\x85\\xfc\\x1d\\x45\\xb6\\x59\\x97\\xb4\\xec\\x6c\\xe8\\x25\\x5d\\xe9\\x59\\x27\\x0a\\xfa\\x7d\\xe9\\x0f\\x29\\x29\\xde\\x63\\xf9\\xb1\\x72\\x11\\xd7\\xf1\\xae\\x82\\x0a\\xda\\x9c\\xe3\\xe4\\x86\\x49\\x17\\x9d\\x60\\xb0\\x14\\x94\\x93\\x48\\x1f\\x01\\xd4\\x59\\xdb\\x7d\\xad\\x05\\x26\\xb5\\xbd\\x9f\\x4b\\x33\\x80\\xd2\\x5b\\xa2\\xc5\\x02\\xba\\x8f\\xa3\\xc4\\xd4\\x13\\x1b\\x46\\x62\\xad\\xde\\xfb\\x41\\x82\\x7f\\x75\\x9f\\xa7\\x1d\\x44\\x7d\\x5f\\x02\\x92\\x45\\xf4\\x8c\\x62\\x2e\\xb7\\xc6\\x8c\\x8e\\x71\\x08\\x1f\\x7f\\x78\\x9d\\xe7\\xa2\\x83\\xd2\\xed\\xa8\\x3a\\x7d\\x17\\x22\\xa0\\x5f\\xb7\\x2e\\x17\\x60\\xc2\\x40\\x40\\xc4\\xd8\\x34\\xde\\xf5\\xdf\\x5f\\x74\\x2e\\x02\\xb3\\x04\\x51\\xc8\\x93\\xbc\\xf7\\xd7\\x71\\xdb\\x78\\x4c\\xbb\\xda\\xec\\x87\\x6d\\x8a\\xc8\\x67\\x43\\xb5\\x29\\xa2\\x92\\x00\\x7a\\xc7\\x53\\xc9\\x9a\\x57\\x99\\xcc\\x32\\x4f\\xe5\\xeb\\xb5\\x44\\x8a\\xb5\\x54\\xb1\\x0d\\x41\\x36\\x97\\x4a\\x12\\x54\\x2d\\x25\\xc6\\x14\\x7c\\x67\\xc5\\xd2\\x33\\x6c\\x9d\\xb7\\x5c\\xba\\x2f\\xd6\\x08\\xcd\\x43\\xab\\x95\\xbe\\xac\\xd0\\x43\\xa1\\x34\\x9c\\xef\\xa8\\x28\\xe2\\x3b\\x5f\\x0b\\x6e\\x0e\\x29\\x51\\xf3\\x35\\x3b\\xb9\\x2b\\xfd\\x1f\\x0a\\x49\\xc3\\x3f\\xb3\\xcf\\x37\\x99\\xa0\\xb5\\x43\\x19\\x8a\\xd5\\xd0\\x3d\\x26\\x3c\\x1a\\x06\\xc3\\x5a\\x26\\xad\\xe1\\x51\\x84\\x91\\xc8\\xc1\\xd2\\x7a\\x2d\\xb0\\x33\\x80\\x89\\x32\\xcd\\x1c\\x47\\xb5\\xa1\\x26\\x98\\x5a\\xcb\\x8d\\x88\\x83\\x60\\xee\\xcc\\xfe\\xb3\\xbf\\x51\\xb0\\xd1\\x89\\xb4\\x19\\x04\\x40\\x40\\x4d\\x12\\xfb\\xa6\\x5d\\x0a\\x7a\\x14\\xc6\\x20\\xc5\\x55\\xf8\\x22\"},\n{{0x51,0x4e,0x07,0x0b,0x01,0x90,0xd1,0x8c,0xbe,0x98,0x1a,0x5a,0x15,0x1e,0x77,0x53,0x39,0x8a,0x27,0x2b,0xcf,0x01,0x48,0x13,0xad,0x37,0x97,0x22,0xc3,0x6e,0x13,0x3d,},{0x6f,0xbd,0xe0,0x47,0x4c,0xc4,0x81,0x0e,0xff,0xa5,0x0a,0x07,0x82,0x0c,0x96,0x5a,0xa0,0x03,0x95,0xff,0x3a,0x5b,0x3e,0x2e,0xdd,0x7d,0x35,0x6b,0x7d,0x6a,0xef,0x2b,},{0xb6,0xc3,0x55,0xc9,0x58,0xb5,0xba,0xa7,0xeb,0xe9,0x77,0xa9,0x3f,0xcf,0x53,0x95,0x89,0xa3,0x66,0xd4,0x01,0x60,0xe4,0xe0,0x31,0xb8,0x8a,0xb9,0x64,0x02,0xc7,0xbd,0x57,0x7f,0xf6,0x35,0xfc,0x07,0x78,0x24,0x23,0x59,0x8d,0xca,0x43,0x66,0x81,0x24,0xa8,0xb2,0x87,0x51,0x0e,0x2c,0xfd,0x07,0xa1,0xe8,0xf6,0x19,0xf6,0xc8,0x54,0x0a,},\"\\x83\\x14\\x55\\x76\\x2a\\x5d\\x80\\x09\\x7b\\xb2\\x84\\x50\\x42\\xf4\\xc8\\x76\\xe7\\x10\\x85\\x35\\xbe\\xd6\\x83\\xe8\\xc4\\x46\\x19\\xd0\\x81\\x54\\xa2\\x29\\x44\\x4b\\x10\\x1e\\x3e\\xd7\\xc0\\x15\\x07\\xe8\\x70\\x94\\x14\\x46\\xaf\\x97\\x8c\\x0f\\x53\\x41\\xd1\\xac\\x1d\\xd1\\x5b\\x14\\xe8\\x96\\x67\\x12\\xdf\\x19\\xf5\\x2f\\xeb\\x51\\x03\\xcf\\x62\\xb6\\x63\\x27\\x56\\x44\\x6c\\xc7\\x54\\xdf\\x00\\xa3\\xf6\\xdd\\x71\\x99\\x68\\xa2\\xce\\xf6\\x6c\\x3a\\xdf\\xb7\\xd1\\xfc\\x49\\x1f\\xbb\\xf3\\xd5\\x92\\x94\\xab\\x34\\x61\\x9e\\x17\\x6d\\xb0\\xd4\\x46\\x15\\x1e\\x37\\xea\\xa3\\xda\\xf1\\x72\\x40\\x6e\\x98\\x3d\\x9d\\x23\\xa6\\xb6\\x9e\\x92\\x97\\x60\\x30\\xf5\\xac\\x70\\x40\\xad\\x51\\x14\\x12\\x9f\\xea\\xf9\\x7a\\xf1\\x5b\\x22\\x96\\xfa\\xe7\\x04\\x92\\xdb\\xbe\\xb2\\xb4\\x82\\x76\\x87\\xfb\\x79\\x87\\x15\\xc9\\xbb\\x2c\\x32\\x55\\x7a\\x81\\xd8\\x91\\xb8\\x97\\x05\\x29\\x00\\x70\\x71\\x59\\x75\\x1f\\x07\\xdb\\x07\\x4c\\x77\\xf0\\x71\\x96\\x71\\xf1\\x76\\x66\\x89\\x02\\x9a\\x3c\\xdd\\xf3\\x9d\\xf3\\x48\\x3c\\xf2\\xb0\\x4f\\x71\\xc2\\x5d\\xe0\\x5f\\xc2\\xd0\\x2b\\xb4\\x8e\\x53\\x9e\\xaf\\x1a\\x32\\x16\\x46\\xcd\\x80\\xef\\x2f\\x0a\\xc7\\x03\\xf4\\x5e\\x73\\x89\\x53\\x08\\x00\\xe5\\xd4\\x17\\xcc\\xea\\x8a\\x5c\\x08\\x66\\x82\\xf0\\x47\\x45\\xd5\\x0b\\x5d\\xfc\\x8f\\x6e\\xdc\\x87\\xa9\\x5c\\x7d\\x20\\x2a\\x9c\\xfd\\x99\\x87\\x14\\xb7\\x46\\x92\\x0e\\xbb\\xe2\\x33\\x5b\\xca\\x1a\\x01\\x71\\x76\\x20\\x16\\xf5\\xe4\\xbd\\xa8\\x9c\\x57\\xd0\\xed\\xc6\\x91\\x0c\\x6d\\x22\\xc8\\xf9\\x09\\xda\\x3d\\xb1\\x35\\x2f\\x0c\\x8b\\xd1\\x8f\\x3b\\x5a\\xac\\x25\\xf1\\x93\\xb8\\x94\\x70\\xf9\\x76\\xbc\\x4f\\x1a\\xff\\xb3\\xc6\\x6b\\xc5\\x87\\x6c\\x6f\\xe2\\xac\\x75\\x08\\x53\\x3d\\x97\\xbb\\xcf\\x77\\x11\\x9d\\x9a\\xae\\x19\\x3f\\x07\\xe0\\xb6\\x4b\\x46\\x1c\\x9c\\x6c\\x3b\\x9d\\x29\\x3b\\xd3\\x7d\\xe3\\xd8\\xe1\\xab\\x1e\\x8d\\x87\\x2c\\xd9\\x4e\\x6c\\xf0\\xeb\\x68\\x43\\x9f\\xdc\\xd3\\xb2\\x5c\\xe8\\x48\\x34\\x60\\xbd\\x8b\\x7c\\xce\\x88\\x9f\\xb7\\x22\\xb4\\x36\\x1e\\x11\\x8d\\xa9\\x83\\xef\\x4a\\x9e\\x45\\xce\\xbc\\x0c\\x1b\\x82\\x29\\xea\\x53\\xe6\\xf5\\x55\\x05\\xf6\\x44\\xe0\\x9a\\xca\\xa4\\xc4\\xb8\\xcc\\x64\\x0b\\x2c\\xd2\\xb3\\x12\\xe1\\xc3\\xa2\\xc0\\x26\\x69\\xe1\\xf9\\xc0\\x63\\x11\\xc7\\x8d\\x36\\x00\\x09\\xdb\\x9e\\x67\\xc3\\x9b\\x49\\xd1\\xe5\\xd7\\x70\\xc0\\x1d\\x28\\x4b\\x0a\\x17\\xa4\\x1b\\x4e\\x7c\\xa7\\x45\\xd6\\x65\\xec\\x07\\x50\\x0e\\x4d\\x9f\\xc8\\xeb\\xc1\\xcc\\x6a\\xf5\\x3a\\x3f\\xc7\\x6b\\x0c\\x3f\\x14\\x31\\xd4\\x98\\x43\\xf2\\x0e\\x18\\x27\\x82\\xc8\\x2b\\x3b\\x5a\\xae\\x36\\xfe\\x20\\xca\\x64\\x26\\x18\\x06\\x8b\\xe2\\x33\\xd4\\xb5\\xef\\x9e\\xae\\xff\\x40\\x15\\x36\\xdc\\x59\\x3a\\x2b\\xc1\\x83\\x44\\xf5\\x5a\\xc5\\xd5\\xfc\\x7b\\x3e\\xb5\\x06\\xd1\\x1c\\xb3\\x75\\x33\\x00\\x63\\xc6\\x20\\xc5\\x33\\x4d\\x72\\x3c\\x7d\\x1f\\x04\\x28\\x16\\xbc\\x47\\x85\\xb3\\x5a\\xc0\\xe6\\xf1\\x74\\xf7\\x36\\x87\\x8b\\x7b\\x49\\x16\\x58\\xca\\x67\\xd8\\xfc\\xab\\x53\\x8f\\xc6\\xec\\xd2\\x77\\xea\\xd9\\x0d\\x95\\x4b\\x46\\x0d\\xa4\\x25\\x3a\\x1c\\x3a\\x30\\xb3\\xd8\\x92\\x8f\\x69\\xac\\x98\\x76\\xa2\\x89\\x19\\x69\\xfc\\x2d\\x06\\xa6\\x68\\x99\\x2b\\x8e\\x21\\x15\\xdf\\xe5\\x35\\x8a\\x71\\x24\\xba\\x7c\\xcf\\x42\\x1d\\x80\\x54\\xea\\x04\\x34\\x44\\xcd\\xeb\\x40\\xb7\\x16\\xdc\\x7a\\x36\\x59\\xa3\\xca\\x94\\x34\\x72\\x93\\x48\\x90\\x60\\xe2\\xcf\\x67\\x12\\xa2\\xa6\\xc7\\xb8\\xad\\x14\\x67\\x85\\xfc\\x40\\xcc\\xb9\\xda\\x28\\x78\\x30\\xd0\\x11\\xd0\\xd2\\x4d\\xf3\\xe7\\xaf\\xbe\\x97\\x2d\\x6f\\x41\\x7d\\xe5\\xcd\\x75\\xf2\\x59\\xea\\x07\\xca\\xfd\\xde\\x20\\x5f\\xc0\\xa3\\x65\\x13\\x5c\\x23\\x2c\\xbd\\x7c\\x1b\\xc5\\x39\\xfa\\x4b\\x7e\\x1c\\xce\\x35\\x18\\x52\\x37\\xc2\\x3f\\x80\\xae\\x97\\xc1\\x86\\xd0\\xd3\\xb1\\x05\\x03\\xd5\\x98\\x4a\\x20\\xec\\x41\\xc3\\xcd\\x04\\x2c\\x28\\xa4\\xc3\\x1f\\x95\\x74\\xb0\\x6a\\x87\\x2b\\xf9\\x59\\xab\\x0a\\xdd\\x1f\\x5d\\xee\\x14\\xa1\\xe7\\x41\\xef\\x23\\x8d\\xfc\\xde\\xc0\\x85\\xaa\\x08\\x8d\\xcf\\x39\\xa3\\x6d\\xda\\x8f\\x2a\\x85\\xed\\x0d\\x36\\x2c\\xcb\\x00\\x5d\\x02\\xe5\\xac\\xcc\\x09\\x2a\\x37\\x6d\\xc1\\x1a\\x56\\x61\\x70\\xd5\\x83\\xdb\\x35\\xf1\\xde\\x0b\\xe3\\xf1\\x59\\x08\\x59\\x6e\\x9b\\x78\\x1a\\xc8\\x1b\\xe0\\x7b\\x9b\\xd2\\xaf\\x46\\xc5\\x6f\\xb4\\xd9\\xd8\\x42\\x76\\x01\\x1e\\x46\\x18\\xb7\\xf7\\x6f\\x96\\x79\\x4c\\xd0\\xfd\\x57\\xed\\x41\\x4b\\x63\"},\n{{0xbc,0x79,0x0a,0x73,0x85,0xdd,0x1d,0xdd,0xc7,0x62,0xe3,0xb2,0x02,0x21,0xdc,0x07,0x8b,0x6c,0x3d,0xa8,0x98,0x6d,0x41,0x80,0x94,0x07,0x27,0x25,0x7c,0xfd,0xcd,0xf1,},{0xc9,0x26,0x46,0x26,0xf6,0x8f,0xed,0xb5,0xb3,0x9c,0x28,0xf0,0x30,0x45,0x3b,0x54,0xd0,0xd5,0x1a,0x98,0xb1,0x77,0x21,0xf2,0x61,0x1d,0x7f,0x27,0x7e,0xf4,0x8b,0x81,},{0x6d,0x6b,0xd6,0x5f,0x37,0x26,0x79,0xfe,0x9d,0x94,0x5f,0xf5,0x65,0x16,0x33,0x3e,0xce,0x0b,0x7a,0x25,0xb1,0x5a,0xd2,0x48,0x73,0x81,0x67,0x0e,0x53,0x6f,0x52,0x46,0x77,0x5e,0xb3,0x9a,0x11,0x4d,0xb2,0xb9,0xcd,0x50,0xf3,0x12,0xb3,0x60,0xd9,0xd0,0xbe,0xa2,0x95,0xdc,0x37,0xb8,0x17,0xb3,0x32,0x89,0x0a,0xdb,0x65,0xe4,0xc4,0x01,},\"\\x14\\x3d\\xd7\\xbf\\xbf\\xf2\\xad\\xc7\\x1f\\x5d\\x12\\x3d\\x47\\x4e\\xa0\\x69\\xdf\\x14\\xae\\x92\\x3e\\xd9\\xbf\\x8f\\x98\\x91\\xe6\\x0b\\xae\\x43\\xf0\\xc9\\xf5\\x55\\x37\\xac\\x9d\\x1a\\xe5\\x23\\xce\\x4e\\xcf\\xd3\\x3b\\x20\\xae\\x44\\x5e\\x9c\\x42\\x63\\x72\\x05\\x0f\\xa5\\x21\\x7c\\x1e\\x4f\\xb0\\x13\\x53\\xeb\\xf2\\xe3\\x29\\x04\\xef\\x7e\\xef\\xcf\\x72\\xe8\\x02\\x3b\\xae\\x06\\xbb\\xb6\\x40\\xcf\\x77\\x7d\\x5b\\x0e\\x11\\x52\\x7b\\xc8\\x35\\x49\\x3a\\xd6\\x98\\x0a\\x15\\x7b\\xb2\\xd5\\x0b\\xe2\\x33\\x65\\xe7\\x2c\\xbf\\x0b\\x3f\\x20\\x9e\\xf0\\xc4\\x4a\\x00\\xb4\\x1a\\x62\\x26\\x24\\x88\\x09\\x6c\\xae\\x5a\\x69\\x6b\\x4d\\x64\\xcb\\xad\\x34\\x50\\x0d\\x41\\xfb\\x4e\\x4b\\xc7\\x0f\\x8b\\xf6\\x21\\x44\\xd0\\x1c\\x22\\x75\\xd6\\xd2\\x9f\\x5d\\xe7\\x5b\\x17\\x21\\xd5\\x04\\x6b\\x68\\x29\\x16\\x44\\x43\\xeb\\xfd\\x9c\\x17\\x81\\x31\\x9d\\x88\\xf5\\x40\\x10\\xed\\xc2\\x96\\xab\\xbe\\xd0\\x2b\\x7d\\xad\\x9b\\xa5\\x85\\xb5\\x52\\xe0\\x00\\x5d\\xcc\\xa4\\x00\\xbf\\x4f\\x45\\x9e\\xed\\x7d\\xb8\\x6e\\xa8\\x61\\x2b\\xe9\\xe9\\x18\\xdf\\xd4\\xe2\\x70\\x0c\\x47\\x10\\x08\\x32\\x83\\x62\\x6f\\xac\\x75\\x44\\x17\\xe0\\x08\\x7d\\x26\\xba\\x14\\x5d\\xfc\\x45\\xb1\\xc9\\xbf\\x7b\\x4d\\xd7\\x0e\\x6c\\x50\\x87\\x47\\xef\\x80\\x5c\\x9a\\x02\\x42\\x5a\\xeb\\xc6\\x42\\x1e\\x0d\\xeb\\x6a\\x79\\xd8\\x9a\\xce\\xee\\xe0\\x1e\\xce\\xcc\\x9f\\x3c\\xa3\\x65\\x38\\x38\\x26\\x58\\x4c\\x43\\x0e\\xbd\\x39\\xec\\xf0\\xa7\\x28\\x66\\xae\\x0a\\xce\\xca\\x5a\\xd4\\xf0\\x40\\x5b\\x67\\x77\\x9c\\x04\\xc5\\xde\\x03\\x30\\x61\\x4d\\xa3\\x47\\x0b\\x80\\x5d\\x78\\x7c\\xe7\\x9a\\xc5\\xa6\\x96\\xdd\\x6f\\x6b\\x55\\x39\\xb1\\xa6\\x51\\xb4\\x24\\xce\\xfb\\x19\\x49\\x1d\\xa6\\xe0\\x88\\x92\\x23\\xcc\\x98\\x39\\x8b\\x42\\xc0\\x04\\x14\\xff\\x8d\\x6c\\x06\\x27\\xeb\\x97\\xcf\\xf2\\x0a\\x8c\\xbe\\x7f\\xcc\\xb4\\x1d\\x81\\x0f\\xcf\\xe8\\x58\\xca\\x74\\x75\\x24\\x7e\\xf6\\x28\\xe8\\x4a\\x09\\xd0\\x12\\xfe\\x12\\x23\\x5b\\x38\\xc1\\xcc\\x9d\\x82\\xe2\\xb6\\x9d\\x01\\xd6\\x21\\x8c\\xfd\\x48\\xe8\\x5f\\x26\\xae\\xad\\xd1\\x95\\x40\\x8c\\xdd\\x4c\\x2f\\x80\\x6a\\x89\\x04\\x1f\\xd0\\x31\\x7f\\xb1\\xa7\\xb6\\x20\\x9f\\x90\\x42\\x70\\xd3\\x4e\\x60\\x61\\x95\\x04\\x72\\x88\\xb0\\xfb\\x11\\xa5\\x72\\x29\\x38\\xf6\\x7c\\x22\\xb3\\x13\\xf7\\xf7\\x4b\\x20\\x25\\xc7\\x5b\\xcd\\x1e\\xcc\\x5a\\x9a\\xdd\\x4a\\x64\\x0a\\x41\\xf2\\x99\\x6e\\xb6\\x6e\\x5a\\xf1\\x96\\x19\\x8d\\xb5\\x8a\\x3f\\xb9\\x93\\x8f\\x34\\x9f\\x92\\x2a\\x24\\xd8\\x6f\\x4e\\xd8\\xa9\\x6a\\x09\\xa1\\x96\\xc2\\x4d\\x6d\\x01\\xed\\x76\\xf3\\x81\\x6c\\x05\\xc4\\xf2\\x6b\\xac\\xa9\\xb9\\xd6\\xdc\\xc7\\x9b\\x58\\x0d\\xfb\\x75\\xd6\\xc9\\x05\\xd4\\x80\\xda\\xd7\\x69\\x51\\x85\\x4b\\xda\\x1c\\xaa\\x7f\\x4a\\x81\\x95\\x43\\xae\\xd0\\x1a\\xe9\\x56\\xbf\\x30\\x58\\xfe\\x8b\\x3c\\x7d\\x5d\\x72\\x49\\x62\\xf1\\xa6\\xa8\\x31\\x43\\xdd\\xad\\x27\\x4f\\xda\\x3a\\xd5\\x78\\xe9\\x8a\\xa9\\x67\\xc4\\x10\\xee\\x57\\x57\\x5e\\xf0\\x1c\\x02\\x58\\x56\\x0f\\x0a\\x1f\\xa4\\xb7\\x93\\x27\\x79\\x6d\\xe9\\x94\\x20\\xcf\\xd0\\xa4\\x15\\x50\\x63\\x60\\xf1\\x24\\x2c\\xcc\\x58\\xa6\\x88\\x09\\x27\\x75\\x0d\\xbb\\xff\\x13\\xd7\\xc1\\xb4\\xed\\x51\\x9c\\xda\\x35\\x72\\x10\\xf1\\x2f\\xb0\\xd1\\xc4\\xd4\\x8f\\x04\\x11\\xbd\\x7e\\x05\\x8c\\xc4\\xcb\\x93\\xd3\\xc7\\x75\\x97\\xe2\\x65\\x3f\\xfa\\x28\\x2d\\x3c\\x2f\\x12\\x8a\\xc3\\x3a\\x23\\x7a\\xf2\\xfc\\xbc\\x9e\\xf9\\xc8\\x11\\xf3\\x78\\x14\\xba\\x2b\\x0b\\x85\\x09\\x3d\\x0f\\xd1\\x8b\\x8c\\x6f\\xb0\\x9a\\x43\\xce\\x52\\x25\\x4d\\x23\\xd5\\x5f\\x32\\xe1\\xd3\\x24\\x2a\\xed\\x1f\\x23\\xd9\\xcf\\x20\\x4a\\xa0\\xdf\\xd4\\x4a\\x34\\x6f\\xe0\\x9e\\x55\\xa4\\xa0\\x6c\\xf1\\xbe\\xf8\\xbb\\xf3\\x7b\\xa1\\xf1\\x59\\x8a\\x58\\xae\\xf8\\x95\\x01\\xec\\xba\\xc0\\x45\\x35\\x43\\xe4\\x80\\xed\\x0a\\xdd\\xe9\\x0c\\x84\\x1d\\x95\\xeb\\xd6\\xeb\\x23\\xba\\xa9\\xf7\\x0f\\x83\\xc1\\x49\\xea\\xb3\\x2d\\x09\\x13\\xc7\\x9b\\x09\\x93\\xd0\\xe1\\xd3\\x57\\x4f\\x0f\\x54\\x2e\\x56\\xa2\\x06\\x16\\xcf\\xe4\\xa8\\xbd\\x7a\\xae\\xeb\\xe0\\xb0\\x83\\xdc\\x2c\\xe0\\x14\\x61\\x78\\xc0\\x74\\x82\\xa0\\x11\\x29\\xbc\\x6f\\xef\\xdc\\x81\\x41\\xc1\\x38\\x48\\x94\\xb6\\x9c\\xbe\\x2f\\x29\\xda\\x18\\x8f\\x7f\\xd4\\xac\\x34\\x1a\\x2d\\xf6\\xfd\\x90\\xde\\xe6\\xa4\\x46\\xd2\\x74\\x63\\x24\\xc7\\x5c\\x1e\\xf5\\xb1\\xac\\xe1\\x87\\xd3\\xbc\\x16\\xd7\\x05\\x59\\x89\\x29\\x75\\xd7\\xe4\\x71\\x38\\xf0\\x40\\x63\\x85\\xea\"},\n{{0xdb,0x3a,0x44,0xdf,0x40,0xd2,0x55,0xa2,0x5c,0xf2,0x3f,0x53,0xc4,0x52,0x23,0xb7,0xd8,0xf1,0xf1,0xf1,0x11,0xba,0x07,0x40,0x6b,0x71,0xe1,0x84,0xa8,0xcd,0x06,0x12,},{0x6b,0x12,0xbd,0x95,0x80,0xae,0x20,0x7a,0x9b,0x0b,0xaa,0x82,0x87,0xb8,0xbb,0x86,0x66,0x93,0x73,0xee,0x5e,0x5a,0x62,0x5a,0xb4,0xa6,0xef,0x2d,0x08,0x71,0x25,0x97,},{0xcc,0x28,0xb5,0xef,0x4b,0x97,0x73,0x63,0x7f,0xae,0x7e,0x5f,0x08,0x4b,0x69,0x94,0xaa,0x35,0x98,0xf8,0xf4,0xa6,0x5d,0x0b,0xb2,0x01,0xd1,0x72,0xd8,0x61,0xa3,0x01,0x49,0xb3,0x33,0x8d,0x3c,0x3a,0xb7,0x5b,0x32,0xb2,0x55,0x95,0xcd,0x8b,0x28,0x96,0x30,0xc3,0x37,0x6a,0xcd,0x10,0xba,0x2a,0xb2,0x6b,0xc1,0xab,0xa9,0x00,0x84,0x0e,},\"\\x52\\xdd\\x8b\\xa4\\xff\\xfa\\x34\\x4d\\x1e\\x08\\x11\\xd9\\x67\\x5c\\x31\\x3f\\x9c\\xc0\\xe5\\xa1\\x38\\x47\\x86\\x91\\x98\\x9d\\x2b\\x7f\\x73\\x89\\x02\\x50\\x68\\xfa\\x35\\xf7\\x4f\\x9a\\xea\\xf1\\xe9\\x56\\x65\\xec\\xf8\\xd5\\x70\\x7f\\x75\\xf6\\x5f\\x22\\x56\\xee\\xa9\\x33\\x98\\xbe\\x59\\xc0\\xd5\\x38\\xf5\\xe8\\x58\\x4b\\xfb\\xb3\\xa2\\x40\\xf5\\x01\\x6d\\x79\\x27\\x23\\x4c\\xb3\\xea\\xc3\\x5b\\x39\\x1b\\x8b\\x53\\xf2\\x0e\\xd8\\xba\\xe0\\xba\\x11\\x08\\x96\\x94\\xbf\\xea\\xde\\x11\\x07\\x16\\x56\\xd4\\xcf\\x18\\xef\\x2d\\x36\\x81\\x92\\xe0\\x4e\\x08\\xe3\\x02\\x4f\\xc1\\xd2\\xfd\\xa6\\x31\\x2a\\xfc\\xa6\\x8d\\x10\\xc9\\xc3\\x36\\xa0\\xe3\\x68\\x50\\xbe\\x1a\\x4f\\x35\\xb0\\x33\\xa8\\x5a\\x2a\\x95\\x49\\xf2\\x67\\x3a\\x99\\x5f\\x2a\\x9a\\xb4\\xbd\\x46\\xc8\\xfd\\x2d\\x83\\x8e\\x64\\xf7\\x61\\x71\\x34\\x27\\x32\\x9c\\x9a\\xf5\\xe4\\x21\\x1a\\x22\\xab\\x20\\x8a\\xaa\\xb8\\x0e\\x19\\x4c\\xd0\\xf6\\xa5\\x02\\xb3\\x08\\xfe\\xd6\\xc5\\x83\\x51\\x78\\x01\\xa4\\x8e\\xd4\\x33\\x0e\\x2f\\xad\\xdc\\xd4\\x18\\x09\\xc3\\x91\\x9b\\x30\\xe8\\x4d\\xb3\\xc6\\x87\\x31\\x03\\x1e\\x79\\x85\\x7d\\xd9\\xf9\\x7f\\xfd\\x12\\x54\\x7d\\xa7\\x06\\x67\\x98\\x07\\x41\\x51\\xec\\x88\\xa5\\xfa\\x96\\x3b\\x9d\\x9d\\x83\\xba\\x2f\\xee\\x13\\x58\\x33\\x95\\x0e\\xf7\\xbc\\x62\\xb3\\x40\\x1e\\xa1\\x1b\\xb3\\x6f\\x25\\x56\\x1b\\xc0\\x52\\x2b\\xb0\\x2d\\x8d\\xad\\x05\\x43\\xf6\\x3d\\x54\\x7b\\xe7\\x7d\\x0a\\x4c\\x9b\\xf6\\x5d\\x42\\xf3\\xa2\\x76\\x14\\x4d\\x2e\\x47\\x4e\\x29\\x42\\xf3\\x79\\x02\\x21\\xe2\\x6f\\xba\\xe7\\xca\\x91\\xef\\xd8\\x59\\x21\\x99\\x08\\x35\\xfa\\xfb\\x6d\\xc6\\x74\\x63\\x5c\\x96\\x01\\x82\\x10\\x38\\xb5\\x27\\x11\\x34\\x3d\\x1a\\xa2\\x5f\\x1c\\x46\\xba\\x4e\\x3c\\x6e\\x71\\x2b\\xac\\x19\\xe5\\x3e\\xae\\x30\\xe5\\x24\\x6e\\x4f\\x04\\xdd\\xf2\\xac\\xdb\\xb3\\x41\\x63\\xc2\\x43\\x67\\x76\\x90\\xbe\\x0b\\xf2\\xe3\\xfa\\x16\\x48\\x70\\xb5\\xe6\\xf5\\x36\\xb2\\x2f\\xb8\\x9e\\x5e\\x8e\\x1d\\x87\\xcd\\xb3\\x40\\x44\\x97\\x7e\\xd2\\x83\\x6e\\x54\\x4d\\x7b\\xa4\\x93\\xdd\\x42\\xa2\\xb6\\x49\\xbc\\xf3\\x13\\xc5\\xb3\\x9a\\x1d\\xbf\\xff\\x3e\\x7f\\x2a\\x59\\xad\\xe8\\x7d\\x3e\\x7b\\x25\\x8f\\x58\\xe5\\x65\\xfd\\xba\\x3e\\x4d\\x92\\xb1\\xed\\xb8\\xbf\\xf5\\x4d\\xc4\\x9d\\x86\\xc5\\x3c\\x03\\x0c\\xf5\\x8b\\x97\\xef\\x06\\x6d\\x24\\x1b\\x54\\x05\\x30\\x21\\x39\\x05\\x73\\x9d\\x8e\\x1a\\xa7\\x2e\\xd9\\x0f\\x68\\x5d\\x39\\x58\\xea\\xa2\\x42\\xb0\\xcb\\xf7\\xa2\\xeb\\x97\\x6e\\xe9\\x6a\\x63\\xe6\\x67\\x86\\x46\\x41\\x69\\xa7\\x42\\xd4\\x57\\xe4\\xd9\\x11\\x7c\\x7d\\x66\\x42\\x84\\x45\\xa4\\x69\\x30\\xc2\\x8b\\xa7\\xa2\\x65\\x82\\x41\\x80\\x5e\\xbe\\x72\\xc7\\x8e\\x02\\x03\\x5d\\x26\\x3a\\x21\\x1e\\x59\\x0b\\x49\\x0c\\xdb\\x84\\x41\\x50\\x62\\xee\\xd1\\x4f\\x13\\xb8\\xa1\\xa9\\xe7\\x7c\\x8d\\x7b\\x75\\x51\\x5b\\x18\\xfb\\x85\\x38\\x6e\\x4a\\x7e\\x05\\x39\\x80\\xd3\\x0f\\x48\\x99\\xe8\\x38\\x63\\xbe\\xe8\\x75\\x58\\x58\\x87\\xc5\\xf4\\x8b\\x51\\x6c\\xcb\\x73\\x1c\\x4b\\xca\\xa3\\xdf\\x07\\xd0\\x47\\x95\\x81\\x40\\x96\\xc7\\x9d\\x7c\\x5f\\xdc\\x4d\\xab\\xf5\\xe2\\x6a\\x4c\\xa1\\x83\\x8e\\x0e\\x5d\\x87\\xdb\\x71\\x30\\x9b\\x81\\xea\\x7c\\xe4\\x61\\xe5\\xe4\\x4c\\x7a\\xb2\\xf1\\x05\\xad\\x75\\xc5\\x43\\xc1\\xe9\\x17\\x9c\\x36\\xa5\\xfa\\x55\\x5e\\xc9\\x22\\xff\\xed\\x1b\\x76\\xd2\\x58\\x01\\xdd\\x74\\xf8\\x0c\\xd0\\xa6\\xba\\x7b\\xc2\\x0d\\xb0\\xad\\x58\\x0b\\x7b\\xbb\\x9d\\xdc\\xfd\\x93\\xad\\x1c\\x5f\\x20\\xf3\\xe2\\x7c\\x3e\\xa3\\xa1\\xe7\\x1e\\xb7\\x4f\\xf5\\xf9\\x44\\xcd\\x3b\\x98\\xf6\\xd0\\x45\\x29\\x59\\x30\\x11\\xc4\\xae\\xce\\xf6\\xdc\\xaa\\x60\\xfb\\x18\\x36\\x8c\\xb1\\x2b\\x6e\\x39\\x1b\\x3f\\x5d\\xf7\\x65\\xcb\\xab\\xff\\x15\\x89\\x8c\\x84\\x79\\x6f\\xc2\\xb5\\x3f\\xa4\\x90\\x0d\\xad\\x03\\x4a\\x13\\xb0\\xce\\x14\\x45\\xad\\xda\\x4e\\xf7\\x19\\xbe\\x74\\x14\\x19\\xe2\\x31\\xe9\\x2f\\x1f\\x66\\x7a\\x32\\x84\\x2a\\x42\\xdb\\x79\\xbd\\x7a\\x01\\x4a\\x80\\x9c\\x81\\x59\\x6e\\x82\\x62\\x73\\xd1\\x6f\\xe5\\xd4\\x04\\x58\\x24\\x2a\\xe1\\x0e\\x12\\xe6\\x0b\\x34\\x89\\x53\\x0c\\x66\\x22\\xb5\\xbb\\x44\\x45\\x4f\\x29\\x61\\x6e\\x47\\xe9\\xa2\\x97\\xce\\x1c\\xa0\\x74\\x13\\x7f\\xd9\\xae\\x13\\xe3\\xee\\x8e\\xdb\\xcf\\x78\\xaf\\x26\\x54\\x59\\xdb\\x1a\\xf3\\x42\\xdc\\x0b\\x2f\\xc8\\x09\\xbd\\xa0\\x15\\xb5\\xa8\\x2b\\x2b\\x7c\\x54\\xef\\xe4\\xe5\\xfc\\x25\\x2e\\xb1\\x3d\\x66\\xe8\\x08\\x93\\x6f\\x19\\x10\\xf4\\xc4\\x8b\\xe0\\xef\\x7a\"},\n{{0x77,0x96,0x4d,0xad,0x52,0xb5,0x79,0xb8,0x96,0x67,0x53,0xda,0x31,0x86,0xd1,0xc5,0xe9,0xd3,0x3d,0x33,0xa4,0xdb,0x38,0xbc,0x0d,0x7a,0x1a,0x6c,0x11,0x2c,0x13,0xc2,},{0xfc,0x25,0x12,0x5e,0x78,0x29,0xf6,0x42,0x34,0x37,0x5e,0x52,0xae,0x9f,0x77,0xae,0x10,0x13,0xf9,0x9d,0xf5,0xf9,0x96,0x5a,0xd2,0xaa,0x16,0x58,0x95,0x96,0xd0,0x91,},{0x3d,0x1b,0x4b,0x4e,0x82,0x0d,0x25,0x0b,0xe2,0xa8,0xfa,0x97,0x1e,0x59,0x9e,0x1e,0x98,0x97,0x75,0x28,0xb2,0xf9,0x30,0x18,0x96,0x81,0xa9,0x3b,0x05,0xe1,0xa7,0x06,0xfc,0x80,0xef,0xfa,0x94,0xe9,0x29,0xbc,0x43,0x92,0x16,0x56,0x89,0x73,0x88,0x28,0x8a,0x9b,0x29,0x27,0x1f,0x37,0xa1,0x4b,0xe0,0x14,0xb8,0x73,0xc6,0x8f,0xc9,0x04,},\"\\xc3\\x39\\xe7\\x18\\xa7\\x57\\xf3\\xf3\\xbd\\x1b\\xab\\xdd\\x2e\\x00\\xaa\\xa5\\xcd\\x7f\\xc9\\x00\\x5e\\xe3\\x4b\\x6f\\xdc\\x09\\xd7\\x1f\\xbd\\x9c\\x92\\x89\\xab\\x1d\\xd1\\x4d\\xba\\x2c\\xad\\x58\\xcb\\x80\\x51\\x16\\x77\\x7b\\xd8\\x0c\\x85\\x96\\x64\\x33\\xad\\x46\\xf9\\xca\\x6e\\x54\\xf1\\x3d\\xd3\\xca\\x7e\\x56\\xe4\\x7f\\xea\\x41\\xe5\\x48\\x8a\\x45\\xad\\x53\\xbc\\x5d\\x65\\x74\\x27\\xe1\\xd7\\x93\\x8f\\x55\\x19\\xf1\\xb0\\x9f\\x5b\\xdd\\x98\\xaa\\xe5\\xac\\x96\\x43\\xef\\x78\\xeb\\xa4\\x93\\x49\\x25\\x33\\x9a\\x15\\x5d\\xc6\\x68\\x28\\x57\\x10\\x02\\x09\\x7a\\x11\\xa5\\xce\\xe7\\xb5\\x1a\\x44\\x1b\\x75\\x6b\\x0c\\xe6\\x5b\\x77\\x9a\\xfe\\x19\\xda\\x6a\\x18\\xef\\xc1\\x45\\xf6\\x09\\x0c\\xe7\\x70\\xde\\x9e\\x0e\\x91\\xf5\\x43\\x27\\x0a\\x09\\x85\\xea\\xb4\\x75\\x29\\x3c\\xcf\\xdd\\x31\\x41\\xc4\\x14\\x2e\\x47\\x22\\x23\\x3b\\x26\\x74\\x99\\x44\\x76\\x41\\x23\\x5d\\x72\\x8b\\xd7\\x5c\\xd1\\xad\\xc0\\xdb\\x14\\x2f\\x73\\x31\\xad\\xdd\\xf8\\xc5\\xee\\xa3\\xd5\\x76\\x40\\x5d\\x86\\x99\\x15\\xb5\\x60\\xf9\\x64\\xe3\\xe0\\x00\\x3c\\x91\\xf5\\xe9\\x6b\\xff\\xbe\\xee\\xc7\\x3e\\x51\\x02\\x4e\\xf5\\x2c\\x55\\xc6\\xdc\\xb5\\x4d\\x58\\x20\\x3e\\x62\\xf4\\xdd\\xb6\\xe1\\x37\\xeb\\x08\\xe1\\xbf\\x13\\x26\\x01\\x8a\\xfd\\x1a\\x86\\xca\\xb6\\xc8\\x41\\xe0\\x66\\x1c\\xe0\\xa1\\xa7\\xae\\x96\\x7f\\x24\\xc1\\xa7\\x7f\\xc7\\xca\\x50\\x5f\\x72\\xe5\\xf7\\x93\\x6e\\x39\\xc6\\xf4\\x83\\x7e\\x25\\x95\\x19\\x5a\\x69\\xcd\\x67\\x65\\x10\\xa7\\x16\\x1a\\x4d\\xc5\\xe3\\x18\\xf3\\xd4\\xf3\\xac\\x0a\\xf0\\x3f\\x8c\\x4a\\xe5\\xbc\\xe3\\x93\\x24\\xe9\\x73\\x8a\\xea\\x49\\xf0\\x02\\xd3\\x2d\\x16\\xde\\x23\\x17\\xe9\\x5a\\x9f\\x32\\xee\\x60\\x4e\\x13\\xdb\\x80\\x38\\xb2\\x64\\xcf\\xc1\\x7a\\xed\\x29\\xc9\\xde\\xbf\\x81\\x91\\xde\\x9e\\x0e\\xfc\\x95\\x1a\\xd6\\xd5\\x48\\x67\\x06\\x8c\\xf5\\x0a\\x26\\x9c\\x37\\xa2\\x41\\xf8\\x52\\x06\\x78\\x8d\\x23\\x14\\x31\\x77\\xf6\\x59\\xcc\\xa6\\x6c\\xfc\\xe0\\x3b\\xc0\\x50\\x22\\x55\\x33\\x7f\\x16\\xb3\\xda\\xd6\\xf7\\x91\\x32\\xab\\xf8\\x0f\\xf1\\x2b\\x6d\\x22\\x81\\xe6\\x37\\xeb\\x6c\\x71\\xf7\\x6e\\x26\\x33\\xa1\\x14\\x56\\x52\\x40\\xee\\xd0\\x0f\\xab\\xea\\x9e\\xd8\\xde\\x28\\xc8\\x32\\x21\\xf8\\xcb\\x48\\x5f\\x51\\x2d\\x90\\x08\\xbf\\xc7\\x4a\\x36\\x6d\\x4c\\x2b\\x4e\\xd1\\x72\\xd3\\x67\\xe0\\x24\\x7c\\xb6\\x50\\x98\\xc1\\x10\\x28\\x2e\\x83\\x1d\\xf8\\xe9\\xbd\\x4f\\xbd\\x5f\\x4d\\xd2\\xb7\\xf2\\x42\\x0c\\x23\\xb8\\x5a\\x63\\x7a\\xa2\\x26\\x2c\\x3c\\xb8\\x84\\x05\\xf7\\x07\\x30\\xc9\\xab\\x4c\\x9d\\x0f\\x22\\x7e\\xe4\\xfa\\x4e\\xf9\\x1e\\xfe\\x9a\\x59\\xb3\\xe6\\xd8\\x43\\xdb\\x87\\x9f\\x56\\x50\\x05\\x9e\\x99\\xf0\\xe4\\xa0\\x38\\x68\\x38\\xe6\\xf9\\x87\\x6f\\x67\\xd5\\x0f\\x89\\x83\\x2d\\xda\\x5f\\x30\\xa9\\xcb\\xfd\\x71\\x01\\x34\\xf9\\xb5\\xb5\\x46\\x27\\x49\\x6a\\xa3\\xa4\\x32\\x12\\xb0\\x7f\\x03\\xdb\\x11\\xd3\\xd4\\xf8\\x75\\xd4\\x1d\\x1f\\x4a\\xc4\\x59\\x69\\xdd\\xef\\x69\\xf8\\x1a\\x06\\xd2\\xb0\\xc6\\x46\\xc9\\xcd\\x93\\x1c\\xf2\\x50\\x2f\\xef\\x0d\\xd3\\x2a\\xbb\\xf0\\x95\\x1e\\xd3\\x03\\xf5\\x28\\x48\\x25\\x93\\x43\\x97\\xfc\\x22\\xe7\\x86\\x98\\xd3\\x5a\\xd8\\x1d\\x82\\x25\\x6b\\xf9\\xe1\\x54\\x00\\xa1\\x09\\x16\\x23\\xa9\\x82\\x6f\\x1e\\x57\\x79\\x23\\x67\\x41\\x7e\\xf0\\x25\\x86\\xd6\\x4e\\x65\\x0d\\xa9\\xac\\xe2\\xf1\\x8a\\xa0\\xa1\\x26\\xd8\\x67\\xca\\xc4\\xb5\\xd4\\xc9\\x1b\\xf5\\x20\\x9e\\x53\\x59\\x55\\x63\\x86\\xf8\\x27\\x08\\x3e\\xb5\\x3e\\x8b\\x47\\x09\\xff\\xfa\\xbe\\x92\\xc6\\x1d\\x78\\xff\\xb5\\xda\\xf1\\x02\\x74\\xe2\\x42\\xa7\\x00\\x91\\xf3\\xf9\\xb9\\xd5\\x96\\xc1\\x25\\x8c\\x9a\\x63\\x38\\x4f\\x4b\\x05\\xb0\\x28\\x66\\x12\\x22\\x18\\x1c\\x0f\\xca\\x96\\x5f\\x0a\\x2c\\xb5\\x6e\\x4b\\x55\\x6d\\x6f\\xbf\\xf7\\x1b\\x64\\xd9\\xb3\\x58\\xda\\x31\\xaa\\x37\\xc7\\x4f\\xf5\\x96\\x2f\\xb8\\xd9\\x6a\\x38\\x3d\\x04\\x97\\x24\\xc1\\x9e\\x24\\x9c\\x9e\\xdb\\xb2\\xa3\\x75\\xb2\\x3c\\xe3\\x10\\x4d\\xa0\\xec\\x58\\xd2\\x63\\x5b\\xa0\\x3b\\x55\\x42\\x3f\\xa2\\xdb\\x7e\\xb3\\x49\\xa4\\xfc\\x58\\xa1\\xef\\x54\\x0e\\xe9\\xa0\\x2c\\x2e\\x70\\x3c\\x68\\xd7\\xf8\\x47\\x5f\\x43\\x4d\\xdd\\x32\\x00\\xdb\\x1f\\x06\\x74\\x57\\x91\\xa3\\xac\\xc3\\x16\\x0d\\xba\\x50\\xa3\\x93\\x44\\x7f\\xfe\\xef\\x6d\\xc7\\xb9\\x8f\\xb0\\x66\\x84\\xcc\\x90\\xfd\\x85\\x20\\x3d\\x11\\x9d\\xcd\\x81\\x99\\xe4\\xd9\\xa8\\x9a\\xe3\\x46\\x7a\\xe4\\xbb\\x19\\xfb\\x71\\xcf\\x74\\x70\\x29\\xc2\\x40\\x96\\xf9\\xa5\\x0e\"},\n{{0x5c,0xaf,0xd8,0x17,0xa4,0x41,0x0c,0xcb,0x27,0x12,0x17,0x23,0xef,0x32,0x07,0xc1,0x73,0x1a,0x08,0x61,0x94,0x5b,0xe9,0x62,0x71,0x4c,0x0e,0xd9,0x50,0x38,0xa1,0x95,},{0x4e,0xa0,0x86,0xbe,0x43,0xec,0xe1,0xc3,0x2d,0x08,0x05,0x9b,0xba,0xdc,0x9e,0x9a,0x2b,0x2f,0x4f,0x3f,0xe3,0x70,0xf1,0xf5,0xcc,0xd7,0xdb,0xde,0xc0,0xaa,0xf3,0x03,},{0x28,0x85,0x15,0xfa,0x72,0x59,0xf1,0xeb,0x58,0x7f,0xe8,0xa2,0xc4,0x03,0x43,0x4c,0x46,0xf8,0xd7,0xe7,0x5b,0x6d,0x22,0xbb,0x38,0x96,0x56,0x6c,0x01,0x7d,0x09,0xb6,0x98,0xc2,0xc8,0x07,0x79,0x9c,0x2f,0x65,0xf9,0xcd,0xb4,0xeb,0x58,0x15,0x1c,0xcf,0xc4,0x8d,0x10,0x80,0x61,0xa6,0xb3,0x14,0x84,0x32,0xb2,0xbf,0xc1,0xcd,0xab,0x05,},\"\\x50\\xb2\\xf0\\x53\\x42\\x41\\x80\\x46\\xd1\\x6a\\x30\\xbe\\x4f\\xc6\\x2b\\x67\\xda\\xf6\\xc1\\x8d\\x2a\\x74\\x24\\x2b\\x7c\\xb5\\x5b\\xa9\\x0a\\xd2\\x0b\\x6c\\xaf\\xdd\\x60\\x15\\x57\\x37\\xc2\\x9d\\xe4\\x8a\\xa5\\xd7\\x99\\xfe\\x54\\x95\\xfe\\x59\\xdf\\x5a\\x9b\\x8c\\x0a\\x8e\\x54\\x18\\x90\\x47\\x63\\xfb\\xad\\x83\\xea\\x69\\x86\\x65\\x1b\\xac\\x31\\x11\\x79\\x39\\xce\\xf4\\xe0\\xc7\\x99\\x30\\xd5\\x2d\\xfd\\x7d\\xb4\\x3c\\x31\\xad\\xda\\xe3\\xcf\\x93\\xe3\\xef\\xc5\\xa9\\x16\\xef\\xd0\\xd6\\x5f\\xdc\\x30\\x90\\x9f\\xa3\\x56\\xcc\\xbc\\x52\\x47\\xd7\\xaa\\xa0\\x67\\x13\\x1b\\x6b\\x48\\x20\\xfd\\x02\\xf8\\xe3\\x95\\xf5\\xa9\\x70\\x4c\\x9b\\xdd\\x75\\x60\\xa6\\x11\\xd6\\x25\\x59\\xa8\\xdf\\xe1\\xd2\\x85\\x9c\\x52\\x48\\x6c\\xc1\\x1e\\xd3\\x33\\x19\\x92\\x48\\x8f\\x41\\x75\\x20\\xd9\\x20\\xdc\\x73\\xa3\\x2d\\x4f\\x08\\x11\\x00\\x82\\x50\\x0f\\x5a\\x96\\x2a\\x30\\x69\\x32\\xc6\\xa7\\x80\\x29\\x55\\xce\\xda\\xd7\\xab\\xf5\\x3b\\x0f\\x19\\xfe\\x47\\x94\\xa3\\x1d\\x6b\\x85\\x53\\x80\\x28\\x43\\x06\\xcc\\xff\\x71\\xa4\\x00\\x78\\x59\\xa2\\x32\\x8b\\xb1\\x90\\x24\\xc4\\x3e\\x10\\xd7\\x70\\x64\\xd8\\x66\\xd9\\x62\\x2d\\x14\\x2c\\x27\\x35\\x4b\\x84\\xac\\x3b\\x4f\\x82\\x32\\xf7\\xa2\\xf8\\xaf\\x64\\x09\\xd5\\xcc\\x75\\x7a\\x18\\xef\\x81\\x3d\\xfa\\xf4\\xb9\\xbc\\x04\\x0c\\xb0\\x06\\xd7\\x7f\\x14\\x36\\x41\\xaa\\x20\\x36\\xac\\x7b\\xc9\\x28\\xdc\\x96\\x58\\x5d\\x9e\\x36\\xc7\\xbc\\x9c\\x56\\x4d\\x25\\xf1\\xc2\\xcc\\x0b\\xea\\xb9\\xd5\\xf2\\x07\\xe8\\x4b\\x21\\x5f\\x1e\\x7a\\xa6\\xfc\\x32\\x82\\x37\\xb7\\x9c\\x39\\x92\\x3a\\x4e\\x09\\xc7\\xc7\\x3d\\xc6\\xb2\\x4b\\x14\\x16\\x29\\x4d\\x79\\x8a\\x4e\\xd5\\xf7\\x58\\x33\\x6d\\x91\\x5a\\x87\\x0a\\x7d\\x6b\\x75\\x92\\xb5\\xb8\\x8a\\xac\\xe2\\xdc\\x5f\\x26\\x7b\\xdb\\x49\\x11\\x41\\xcb\\xba\\xe2\\xa6\\x77\\x40\\x7c\\xc0\\x95\\x5f\\x96\\x19\\x62\\x59\\x93\\x04\\xba\\x0b\\x83\\x96\\x71\\xa5\\xc0\\x00\\xe9\\x20\\x10\\x8a\\x05\\x29\\x80\\x87\\xe4\\x97\\x70\\xae\\xee\\xaa\\xb3\\x63\\x27\\x24\\xcb\\x0f\\xc2\\x28\\x57\\x96\\xdc\\x41\\x48\\x14\\xfd\\xa7\\x8a\\x54\\xe6\\x7f\\x00\\xa0\\x2f\\x77\\xd3\\xcc\\xde\\x1e\\xd9\\xd7\\xb1\\xde\\xf1\\x4e\\xa1\\xf6\\x19\\x10\\xbd\\xf3\\x0a\\x11\\x96\\xfc\\x63\\x51\\xb6\\x22\\x54\\xd6\\x44\\x5e\\x6c\\x90\\x44\\x5b\\x16\\xef\\xaf\\xe2\\x89\\xa2\\x78\\x4b\\x92\\xe4\\x2b\\x78\\xa4\\xa9\\x00\\xc3\\x5f\\x55\\x63\\x0b\\xbb\\x77\\x62\\xff\\x9e\\xb7\\xfe\\xf7\\xd0\\x4c\\x90\\xb9\\x57\\x1c\\x4f\\xc7\\x60\\xa4\\x10\\xdb\\xfc\\x25\\x29\\x91\\xd0\\xba\\x27\\xf2\\xd4\\x14\\xfe\\x64\\xee\\xfd\\xff\\x4a\\xbc\\x18\\x81\\x7c\\x97\\x06\\xc6\\x31\\xbf\\xa2\\x03\\x82\\x1d\\x3b\\x92\\xcb\\x33\\x8b\\xaa\\xf5\\xd1\\x23\\x2b\\x46\\x26\\x47\\x95\\x4d\\x09\\x02\\x46\\x2f\\xb1\\x69\\x6e\\x99\\x1f\\x07\\xfa\\x9c\\x3d\\xbc\\xf2\\x87\\x29\\x60\\x83\\x1b\\x4d\\xed\\x92\\xa4\\x21\\xcf\\x21\\xb7\\x53\\x16\\x5f\\xf3\\x09\\xef\\xe2\\xef\\x54\\x38\\xc0\\x12\\x70\\xd1\\x0c\\x6a\\x03\\xd3\\x4f\\x71\\xeb\\xc2\\xda\\xb1\\xda\\x90\\xda\\xa3\\x57\\x98\\x4d\\x24\\x62\\xbc\\xb3\\x5e\\xe3\\xde\\x55\\xc3\\xa5\\x5f\\x8b\\x98\\xae\\xc2\\x11\\x4f\\x74\\xc8\\x43\\x41\\xa6\\x41\\x27\\x86\\x3c\\x12\\x0b\\x5e\\xca\\xd9\\xe3\\x29\\xa5\\x75\\x6a\\xe4\\xa2\\x55\\x5d\\x84\\x92\\xcd\\xa8\\x35\\x22\\x5a\\x8d\\xeb\\x3f\\x9c\\x15\\x58\\xf0\\xd4\\x25\\xbc\\x17\\x2f\\xf7\\x64\\x0c\\xc7\\x9d\\x97\\x80\\x04\\x16\\xfd\\x62\\x94\\xcc\\xcc\\x70\\xcd\\x1c\\xf5\\xb6\\xa8\\xe2\\xaa\\x07\\x28\\x9b\\xd5\\x22\\xbf\\x99\\xdc\\x96\\xc3\\x6b\\xfe\\xe8\\x0e\\x84\\x6f\\x5d\\xd7\\x46\\xdd\\x4c\\x50\\x03\\xe4\\xbf\\x7d\\x29\\xef\\xee\\xa7\\x50\\x8a\\x01\\x61\\x23\\x68\\x82\\xc9\\xa8\\x2a\\x56\\xaa\\x2c\\x25\\x74\\x66\\x96\\x52\\xc6\\x30\\x92\\x3a\\xb4\\x70\\xdd\\xb9\\x5d\\x45\\x6f\\x7b\\x8e\\x8f\\x07\\x59\\x9b\\xa0\\xd1\\xd3\\x8b\\xc7\\xf8\\x17\\x6e\\x3f\\xdf\\x02\\x09\\xbd\\x6f\\x75\\xd4\\xcc\\x11\\x80\\x3a\\xfb\\x18\\x56\\xcb\\xc0\\xe9\\x1c\\x73\\x73\\x0e\\x4f\\xb9\\x8f\\x3c\\x94\\x8a\\x87\\xd5\\xa7\\xed\\xcc\\x0a\\x6a\\x8a\\xc8\\x10\\xea\\x3e\\xaa\\x6e\\x06\\x3c\\xec\\x5f\\x55\\x66\\xcd\\x6d\\xed\\xc5\\x37\\xdb\\x6d\\x68\\x6b\\x80\\x21\\xf6\\xea\\x82\\x5a\\xd7\\x47\\x5e\\xc7\\xf1\\xc5\\xdb\\xde\\x45\\xd3\\xff\\x4b\\x5e\\xe5\\x1c\\x0d\\x04\\xf1\\xd7\\x40\\x18\\xeb\\x91\\xe5\\x04\\x0d\\x01\\xc8\\xb7\\x1a\\x4a\\xab\\xbd\\xe6\\x09\\x4d\\x4a\\xfe\\xcc\\xb1\\x8d\\xfc\\xde\\xd7\\x3e\\xa7\\x5e\\x3b\\x9f\\x8c\\xe1\\x67\\xdf\\x62\\x09\\xae\"},\n{{0xd5,0xca,0xc8,0x55,0x21,0xaf,0x78,0x1f,0x3d,0x5f,0x66,0x86,0x2a,0x04,0xb0,0x87,0xd0,0xcc,0xdc,0xac,0x92,0x6c,0xfe,0x9e,0x74,0x7b,0xe8,0xd5,0xc2,0x63,0x3f,0x78,},{0x10,0x0d,0xcc,0x53,0x03,0x9b,0xf0,0x5e,0xa0,0xa9,0xf5,0x88,0x82,0x12,0x69,0x3d,0x4f,0x9e,0x0e,0x75,0x25,0x95,0xbb,0xcd,0x02,0x06,0x10,0xe0,0xae,0x21,0x35,0x96,},{0x5d,0xc0,0x33,0x63,0x41,0x4e,0xea,0xc0,0x08,0x6f,0xb6,0xfe,0xba,0x44,0x21,0x7c,0xef,0x4c,0x52,0x0d,0xb6,0x19,0x26,0xdf,0x68,0x0c,0xa6,0x02,0xdc,0x11,0x00,0x3c,0xe6,0xaf,0xbf,0x3d,0x13,0xc8,0xc5,0xb0,0x52,0x73,0xd2,0x14,0x15,0xe6,0x7c,0x14,0xa2,0xee,0x5d,0x0b,0x1d,0x53,0x52,0x41,0x9a,0xb9,0xb3,0x9c,0x00,0x3a,0x51,0x0c,},\"\\xd5\\xe7\\xdd\\x59\\x49\\x09\\x37\\x5a\\x4b\\xe0\\x8e\\x74\\x82\\x5d\\x59\\x8d\\x53\\x5b\\xf4\\x6e\\xc0\\x84\\xde\\x52\\xb5\\x73\\x91\\xc1\\x27\\xef\\xf5\\x22\\x4a\\xb2\\xd1\\x94\\xdf\\xb2\\x66\\x33\\x47\\x8d\\x02\\xfb\\xda\\x74\\xd1\\xdc\\x58\\x21\\xf7\\x91\\xbf\\x96\\x2d\\x8d\\xad\\x9e\\x4e\\xf2\\x42\\x24\\x89\\x19\\x07\\xb0\\x18\\x9c\\xcc\\xc8\\xb1\\x33\\xd3\\xaa\\x20\\x78\\x92\\x6d\\xae\\xf2\\x89\\x8c\\x19\\xc2\\xe0\\xbf\\xe0\\x20\\x41\\xa9\\x04\\xb9\\xf0\\x4b\\xe7\\xcb\\x50\\xae\\xd0\\xd9\\x62\\xd1\\xad\\xd2\\x0b\\x40\\xa8\\x8a\\xb7\\xab\\xad\\x62\\x6c\\xf4\\xda\\x0a\\x78\\xf9\\xf5\\x36\\x85\\x50\\x1f\\xdf\\xa5\\x85\\x43\\xdd\\xf2\\xea\\x0e\\xea\\x69\\xe7\\xba\\x16\\x0f\\x8a\\x17\\x7a\\x25\\xfc\\x21\\xe8\\xa2\\x9c\\x66\\x16\\x33\\xe3\\x0e\\x52\\x3b\\x0e\\xc0\\x1b\\x2a\\xee\\xe2\\xd4\\x26\\xe4\\xae\\xad\\x45\\x74\\x88\\x10\\x8f\\xe5\\xf5\\x69\\xcf\\x6e\\x2f\\xdb\\x68\\xc2\\x8f\\x2b\\x30\\x52\\x82\\x35\\x77\\xcd\\x93\\x4e\\x7b\\x06\\x2c\\x8a\\x34\\x24\\xcd\\x43\\x67\\xfb\\x31\\x5b\\x74\\x4c\\xa3\\x52\\x55\\xd7\\xf1\\xaf\\x4e\\xdc\\x9b\\xc9\\xd8\\x83\\x71\\x23\\xd9\\x79\\x03\\xb4\\x3d\\xf3\\x67\\xc7\\xd4\\x18\\xc7\\x93\\x47\\xff\\xaf\\xe7\\xc7\\xb1\\x72\\x4b\\xba\\x34\\xed\\xe8\\xd3\\x56\\x8d\\xb5\\x05\\x98\\x3e\\xad\\x47\\xf6\\x2b\\x56\\xe3\\x61\\x8c\\x11\\xdb\\x8f\\xf0\\xbf\\x49\\x2a\\xc6\\x75\\x97\\xd2\\xf9\\x6a\\x6f\\x42\\x0f\\xf9\\x85\\x34\\x1b\\x78\\x6a\\xd6\\xce\\xae\\xdd\\x10\\x5d\\x0d\\x15\\x63\\xb2\\xd5\\x35\\x43\\xd7\\x8e\\x72\\x56\\x72\\x5d\\x20\\x4e\\x82\\xed\\x3a\\x2e\\x6a\\x6e\\x83\\xdf\\x61\\xfc\\x28\\x2a\\x62\\xca\\x06\\xe6\\x21\\x74\\xb5\\x5b\\xef\\x40\\xa0\\xbd\\xf8\\xd2\\x3d\\x1c\\x33\\x0c\\x71\\x44\\x14\\x85\\xee\\x85\\xe7\\x0c\\xed\\x12\\x1e\\xac\\x60\\x7f\\x58\\x06\\x78\\x16\\x3e\\x4b\\xd7\\x5c\\x67\\x09\\xff\\x3b\\x41\\xde\\x80\\x59\\x4b\\x9e\\x2f\\x2a\\xa2\\x78\\xfe\\xfc\\x21\\xd7\\x3e\\xe3\\xf7\\x28\\x54\\xb9\\x58\\xd9\\xa8\\xf6\\x3e\\x3d\\x70\\xf7\\xfe\\xad\\x8c\\x3d\\xca\\x8e\\x71\\xbf\\x4b\\x9c\\x2a\\x36\\xf2\\x12\\xb3\\x2e\\xb3\\x29\\x2e\\x63\\x55\\x80\\x38\\x65\\x59\\xee\\x1a\\x11\\xdf\\x15\\x29\\x3a\\x0c\\x21\\xcd\\x73\\x60\\x86\\x98\\x46\\xba\\x5b\\x7b\\xa8\\x5c\\x99\\x4f\\x5b\\x2f\\x9c\\xc5\\x0e\\x5e\\xea\\x8e\\x4b\\x36\\x91\\xd8\\x86\\x06\\x2a\\x18\\xcf\\xb1\\x82\\xf1\\xe8\\xb6\\x11\\xfe\\x1b\\xc2\\x63\\x15\\x9c\\xb8\\xa0\\x86\\x78\\x7c\\x81\\x1b\\xea\\x48\\x12\\x53\\x00\\x08\\xc7\\x0c\\xa0\\xc4\\x7e\\x64\\xeb\\x2f\\xba\\xd5\\xb0\\x27\\x27\\xa6\\x6f\\x2c\\xdd\\x6d\\xde\\x86\\xf5\\xd2\\xa9\\x64\\x5a\\x1e\\x9a\\xa6\\x6e\\xe0\\xe1\\x5b\\x97\\xf5\\xfd\\x22\\x95\\x96\\xee\\x02\\xe6\\x61\\xca\\xb9\\xa5\\x4e\\xee\\x1b\\x81\\xf9\\x8f\\xe2\\x56\\xed\\x6c\\x54\\xfe\\xaa\\xa0\\xba\\x04\\x7e\\xea\\x35\\x33\\x44\\xf6\\xe5\\xc6\\x2b\\xe1\\xe9\\xd5\\xc0\\x9a\\x2a\\x69\\x94\\x11\\x11\\x0c\\x56\\xd1\\x94\\x9e\\x90\\xc0\\x7b\\x19\\x38\\xba\\x95\\x55\\xac\\x1b\\xe8\\x51\\x1b\\x51\\x02\\x18\\xd7\\xcd\\xe7\\xe1\\xd7\\x4a\\x68\\xaf\\xb6\\x42\\xf8\\x17\\x15\\xfe\\x9e\\x6c\\x96\\xc5\\x03\\x81\\xae\\x5a\\x9d\\xf3\\x06\\x51\\x87\\x85\\xdc\\x4d\\xbc\\x3a\\x64\\xf6\\x0f\\x24\\x5c\\x56\\x4b\\x80\\x29\\x51\\x2f\\x38\\x1b\\x56\\xee\\x78\\x77\\x03\\x42\\x68\\x03\\xc8\\x0a\\xb1\\xc3\\x11\\xf4\\x77\\xb8\\x91\\x70\\x8b\\x59\\xfa\\x74\\x8f\\x32\\xde\\xbf\\x54\\xd2\\x41\\x37\\x71\\x97\\x8c\\x26\\x5c\\x9b\\x87\\x11\\x4a\\xdf\\x25\\xb8\\x33\\x7a\\xa9\\x3b\\x0e\\x63\\x2a\\x5b\\x6e\\xda\\x47\\x4b\\xec\\x16\\x32\\x81\\x59\\xfb\\xed\\x06\\x7b\\x00\\xb8\\x7a\\xdd\\x61\\x96\\x54\\x92\\xec\\xcc\\x6f\\xd3\\x46\\x1c\\x10\\x00\\xe4\\x03\\x7a\\xb1\\xe8\\xac\\x89\\xa8\\x52\\x4f\\x78\\xae\\x09\\xd3\\x08\\xea\\x6c\\x94\\xff\\x88\\x37\\x32\\xb7\\x12\\xee\\xc0\\xef\\x07\\x71\\x8d\\x33\\xc0\\x11\\xb9\\x39\\x8f\\x8c\\xfe\\xa7\\x33\\x07\\x5a\\xf3\\x31\\xfb\\x3f\\x97\\xcd\\xc1\\xe8\\xc9\\x9f\\x6a\\x10\\x72\\x5a\\x68\\xc5\\xc5\\x8f\\xdd\\x8b\\x0b\\xaa\\x50\\x22\\x7f\\x34\\xd7\\x3d\\x23\\x90\\x52\\x03\\x69\\x8e\\xaf\\xf6\\x26\\x65\\x4c\\xe8\\x3d\\x86\\x51\\x08\\x49\\x9b\\xe6\\x86\\x1f\\x61\\x41\\xbf\\xa6\\x21\\x9d\\x7a\\xb8\\xb5\\x84\\x51\\x91\\x99\\xf8\\x80\\xcf\\xa1\\xb2\\x6d\\x91\\x94\\xd3\\x01\\x71\\x1c\\x30\\xfb\\x44\\x6d\\x6e\\xa7\\x64\\xa4\\x31\\x0f\\x70\\xe4\\xb8\\x59\\xcf\\x95\\xfd\\x44\\xaa\\xf8\\xc1\\xe2\\x40\\xe8\\x0a\\x71\\x61\\x1d\\xbc\\xf5\\x2d\\xa5\\x8e\\xdc\\x32\\x03\\x11\\xde\\x38\\x8d\\x5d\\x9d\\x76\\x9e\\xb5\\x9b\\xe0\\x93\"},\n{{0x15,0x9a,0x9e,0xdd,0xea,0x5d,0xe6,0x34,0x03,0x98,0x7b,0x56,0x70,0xdb,0x6f,0xac,0x98,0xff,0xe5,0xec,0x3a,0x6c,0xf0,0x15,0x16,0xee,0x2c,0x70,0xce,0x3b,0x3b,0xe0,},{0xf6,0x1f,0x4a,0x04,0xa5,0xa1,0x2c,0xca,0xec,0xfa,0xf4,0x4c,0x1c,0x9c,0x18,0x88,0x47,0x5a,0x2c,0x89,0xfb,0x02,0xf2,0x6b,0xb8,0x1a,0xb5,0xf7,0x8f,0x4c,0xe3,0xa8,},{0x05,0x43,0x71,0x2c,0xef,0xa2,0x9a,0x22,0x0d,0x90,0xf8,0x1b,0xaa,0x4e,0x4c,0xf7,0x7a,0xc6,0x52,0x08,0xb2,0xd5,0xce,0x9f,0xd1,0x7c,0xe2,0x14,0xad,0x4a,0x93,0x7b,0x7f,0xc5,0xc7,0x86,0x41,0x3b,0x58,0x05,0x1c,0xca,0x3b,0xb8,0xb2,0xeb,0x55,0x65,0x7d,0x89,0x57,0x2b,0xc5,0x0e,0xa2,0xe5,0xec,0xdc,0x55,0x50,0x88,0x49,0x16,0x03,},\"\\xd1\\x95\\xe5\\x90\\x0d\\xd3\\x93\\x14\\x81\\xbc\\x01\\x2e\\x77\\xbf\\x06\\x0a\\xaf\\x31\\xcc\\xcb\\x0f\\xe1\\xa6\\xc4\\x0e\\xaf\\x28\\x6a\\x61\\x66\\xa1\\x66\\xb1\\xea\\x37\\x05\\x34\\x26\\x28\\x4b\\x92\\x0c\\x67\\xfe\\xe1\\xd4\\xb9\\xd8\\x6f\\xb8\\x61\\xcc\\x6e\\xdd\\x34\\xe1\\x0c\\x52\\x23\\x37\\x34\\xd9\\xcd\\x92\\xf5\\xdb\\xf4\\x33\\x51\\x2e\\xd2\\x55\\xac\\x6b\\x26\\xe5\\x6f\\x5c\\x66\\x4b\\xcc\\xb2\\x60\\x69\\x2c\\xf4\\x9d\\x08\\x36\\x3e\\xe9\\x4e\\x33\\x6a\\xcc\\x48\\x96\\x00\\xa6\\xaa\\x51\\x2a\\x04\\x0f\\x10\\xeb\\xf1\\x8f\\x7d\\x2c\\xbe\\xe9\\xca\\xd1\\x4c\\x4f\\xf8\\x73\\x77\\xa3\\x26\\x34\\x19\\xd8\\x29\\x75\\x29\\x40\\x1f\\x15\\x33\\x7a\\x4c\\x4d\\x23\\x25\\xed\\x7d\\xef\\x76\\x3a\\x0d\\x47\\x9c\\xaa\\x40\\x82\\x66\\x83\\x4d\\xa2\\x42\\xf3\\xa1\\x6b\\x79\\xa4\\x58\\x66\\xb9\\xd9\\xd7\\x1a\\x48\\x29\\x31\\x76\\x74\\xcf\\xf7\\xae\\x6c\\x8c\\x58\\x7b\\xa4\\xd4\\x98\\x0e\\x81\\x86\\x13\\xd3\\xad\\x82\\x50\\x7a\\x7a\\xb0\\x32\\xbb\\xf9\\x9c\\x5e\\x9b\\x64\\x03\\x71\\xbb\\x41\\xb9\\x1e\\x96\\x5d\\xc3\\x1e\\x8c\\x7d\\x4b\\x3b\\xaf\\xd4\\x95\\x70\\x52\\x7f\\xaa\\xa8\\x7a\\xbb\\xf6\\x41\\x6c\\x47\\xb1\\xb1\\xb0\\x9d\\x34\\x01\\x25\\x31\\x26\\xcb\\x24\\x6a\\xe4\\x5a\\xcf\\x5f\\x10\\x0b\\xb1\\xf9\\x2f\\x11\\xa5\\xc6\\xc9\\x37\\xe0\\x58\\x8d\\x8b\\x14\\x6b\\x3e\\x4d\\x3c\\x7e\\x5b\\xf5\\x74\\x84\\xe9\\x84\\xfe\\x3a\\xfc\\x47\\x72\\xf2\\x4e\\xbf\\x89\\x4c\\xdb\\x39\\x83\\x7f\\xbd\\x46\\x9a\\x92\\x1a\\x96\\xac\\x5a\\xf5\\xe0\\x70\\xf6\\xc9\\x62\\x4c\\x58\\x8e\\x9d\\x4f\\xe6\\xdd\\xfe\\xed\\x1f\\x8f\\xe2\\x0e\\xb9\\xc4\\x60\\xce\\x6e\\xe3\\x8b\\xf4\\x71\\xdd\\x56\\xdc\\xf2\\xe3\\xee\\x99\\x8b\\x8e\\x7f\\xdc\\xf6\\x12\\xe7\\x8a\\x2e\\x7c\\x71\\x73\\xc0\\x16\\x09\\x82\\xbe\\xde\\xcc\\x2c\\x62\\x1e\\x5f\\x66\\x11\\xb4\\xef\\x21\\x02\\xe3\\x2e\\x7c\\x29\\x80\\x3a\\x7e\\x25\\xfe\\xe1\\x51\\x24\\x31\\x58\\xa7\\x6e\\xe5\\xd8\\xc1\\xbb\\x2e\\x7d\\x8c\\x88\\x87\\x1b\\xa4\\x33\\xc5\\xe5\\x41\\xc2\\x60\\x26\\x93\\xd9\\x01\\x10\\xbe\\x79\\x5b\\x52\\x3a\\x8f\\xad\\xb6\\x05\\xd8\\xe3\\xd7\\xe4\\x93\\xfe\\x24\\x5d\\x9c\\xc5\\x32\\x0d\\x32\\xb8\\x5d\\x61\\x35\\xa4\\x4b\\x11\\x68\\x72\\x94\\x14\\xc2\\xca\\x21\\x56\\x0f\\xb4\\xfe\\xec\\xde\\xef\\x0c\\xf7\\xd8\\xe0\\x71\\x27\\x4e\\x88\\x56\\xc0\\x04\\x03\\x3e\\x80\\x01\\x3c\\x73\\xaf\\x71\\x77\\xc3\\x19\\x78\\x16\\xa5\\x03\\x2d\\x90\\x59\\xb1\\xb6\\xe4\\x15\\x2c\\x38\\x61\\x92\\xdd\\x54\\xb9\\x0f\\x9d\\x30\\x8b\\xe9\\x8e\\xd7\\xd0\\xca\\x9d\\x12\\xe8\\xaa\\xf6\\xf9\\xd8\\x69\\x38\\x6a\\xa9\\xdb\\xb0\\x15\\x93\\xd3\\x7e\\x72\\xf0\\x90\\x12\\x4d\\x34\\x55\\x29\\x8e\\x9b\\x4c\\x9e\\xc3\\xca\\xe7\\x3b\\xb8\\xee\\x41\\xeb\\x63\\xe3\\x8c\\x56\\x13\\x3e\\xfd\\xba\\xf4\\x49\\xb8\\x4e\\x1e\\x49\\x1e\\x49\\x6f\\x1c\\x70\\xa4\\x4d\\x06\\x99\\x86\\xba\\x88\\x18\\x42\\x20\\x69\\x06\\x1b\\xb6\\xeb\\xcb\\x7b\\x20\\x54\\xe6\\x3d\\xf3\\x81\\xba\\x03\\xc6\\xa7\\x67\\x4a\\xbd\\x61\\x05\\x0d\\x69\\x3d\\x41\\xbf\\xe3\\xca\\x50\\x46\\xc6\\x5f\\xfb\\x06\\xa0\\x74\\x98\\x09\\xe5\\x8d\\x4c\\x93\\xa9\\xff\\x69\\xed\\x30\\x95\\x0b\\xde\\x1f\\x99\\x21\\x6f\\xff\\x29\\x9f\\x22\\xf1\\x6b\\x07\\xc2\\x54\\xc2\\x65\\xae\\x0b\\x12\\xe3\\x13\\x16\\x3c\\xcd\\xf5\\x03\\x6d\\x49\\x05\\x5f\\x9a\\x96\\x67\\xb0\\xb7\\x12\\x92\\xbc\\x3b\\x62\\x60\\xcb\\x87\\x56\\x8f\\xd2\\x67\\x17\\x0b\\xc9\\x40\\xc3\\x33\\x29\\xd7\\x29\\xc9\\xe3\\x2d\\x0f\\x91\\x80\\xb1\\x34\\xbf\\xf8\\xae\\x93\\xb1\\xbf\\xeb\\xfa\\x38\\x42\\xfe\\xf2\\x0b\\xc0\\x4a\\x29\\x7b\\x00\\xa8\\x4a\\x0f\\x42\\x8d\\x5f\\x42\\xfa\\xb8\\x61\\x42\\x99\\x6d\\x4a\\xd9\\xef\\xab\\xc4\\x98\\x52\\xf8\\x81\\x2f\\x3b\\xfb\\x5e\\x57\\x53\\x9e\\x21\\x86\\xeb\\x8a\\xe2\\x29\\x58\\x0b\\xc6\\x04\\x48\\xac\\xde\\xf5\\x72\\x3c\\x88\\x15\\x88\\xb5\\x37\\x89\\xf0\\x5b\\x91\\xe0\\x22\\x89\\x22\\x32\\x52\\xd7\\x53\\xf7\\x98\\x13\\x77\\x9a\\xce\\x70\\x5e\\x04\\xae\\xd1\\x52\\x65\\xd3\\xbd\\xf2\\xa2\\xe4\\xb1\\x56\\x54\\x77\\x0a\\x27\\x58\\x54\\xe6\\x4c\\xf4\\x43\\x90\\x60\\x7a\\x45\\xd7\\xbb\\xa9\\xaf\\x3e\\x1a\\x2e\\x28\\x30\\x67\\xfc\\xd6\\xe6\\x33\\xaa\\x2d\\x24\\x03\\xbd\\x81\\xf7\\xc7\\x92\\x76\\x55\\x10\\xb5\\x98\\x41\\x2f\\x6b\\xda\\x07\\xb2\\xa9\\x45\\xb9\\xf6\\xd4\\x6a\\xb2\\xf7\\xc3\\x20\\x07\\x5b\\xc6\\xb6\\x0a\\x80\\xda\\xa4\\x4a\\xf3\\x91\\xf4\\xcd\\x56\\x21\\x31\\xbb\\xdd\\x40\\x7d\\x66\\xf8\\xdb\\x12\\x59\\xbd\\x76\\xfa\\x7e\\x4d\\x52\\x64\\xe1\\x45\\x54\\x6c\\x94\\x2d\\xfe\\x90\\x07\"},\n{{0xed,0xa0,0xfe,0xac,0x0f,0x2a,0xfe,0x01,0x74,0x49,0x15,0x52,0x48,0x7f,0x39,0x62,0x17,0x13,0x32,0xb8,0x22,0xdc,0x3d,0xa4,0x26,0xf9,0xa5,0xf6,0x2b,0xef,0x7b,0x8d,},{0xef,0xf2,0x7c,0xb5,0x1f,0x4d,0x39,0xc2,0x42,0xf3,0x23,0x01,0x9a,0x12,0x34,0x81,0x8e,0xf2,0xe4,0xcd,0x1b,0xda,0xbc,0x0f,0x2d,0x8d,0x21,0x34,0x58,0xdc,0x47,0x1a,},{0x6c,0xbc,0x7e,0x6f,0x5e,0x12,0x14,0x5b,0x01,0x68,0x7a,0xd9,0xca,0x6b,0xf6,0xe4,0x7f,0x94,0x17,0xc2,0xce,0xfa,0xd3,0xfb,0xd6,0x8f,0xd6,0x5d,0xd7,0x4f,0xaa,0x97,0x50,0xcb,0xa9,0x92,0xde,0x4c,0xeb,0xcf,0xcd,0x35,0x80,0x8c,0xbb,0x3f,0xf1,0x2c,0x8d,0x93,0x07,0x99,0xaf,0x36,0xef,0xe7,0x97,0x6b,0xf2,0xfe,0xa7,0x9e,0x3e,0x0e,},\"\\x90\\x11\\x19\\xda\\x4e\\xd1\\x81\\xaa\\x9e\\x11\\x17\\x0b\\x20\\x62\\x6e\\x00\\xab\\xf0\\xb5\\x48\\x24\\x5e\\x3d\\xeb\\xf9\\x4b\\xf5\\xed\\x50\\xae\\xef\\xe9\\x42\\xb4\\x02\\xcc\\x99\\x48\\x94\\x78\\x52\\xde\\xdf\\x2b\\x53\\x04\\x01\\x76\\x65\\x74\\x9c\\xd4\\x7c\\x21\\xfc\\x65\\x2e\\xe9\\x95\\x67\\x9f\\xf9\\x31\\xe3\\x0e\\x94\\xaf\\x98\\xb4\\xa9\\x8f\\xd4\\x4e\\x84\\x9e\\x98\\x47\\x0f\\xe0\\xa7\\x6c\\xe8\\x0c\\x61\\xf8\\x3f\\xb4\\xe8\\x5b\\xa5\\x23\\xee\\x3f\\xd2\\x5d\\xb0\\x00\\x05\\x3b\\x49\\xd0\\x93\\x0e\\x3b\\x07\\x9e\\x86\\x6e\\x15\\x3f\\x7d\\x86\\x36\\x7f\\x23\\xa4\\xc4\\xab\\xc6\\x3b\\x30\\x75\\x46\\x1e\\x90\\xe4\\xfd\\x89\\x6d\\xa0\\x49\\x2e\\x27\\xd7\\x14\\x94\\x1e\\x96\\x7f\\x52\\xc9\\x3f\\xfa\\xec\\x44\\x80\\x3f\\x57\\x87\\x7d\\x86\\x6e\\xb5\\xf8\\xc5\\x28\\x17\\x85\\xaa\\x48\\x26\\x79\\x2e\\x39\\x64\\xc6\\x65\\x90\\x82\\x1e\\xea\\x66\\x75\\x20\\x74\\x26\\x40\\x18\\xa5\\x71\\xf5\\xb0\\x13\\xb3\\x8e\\x15\\x2c\\x95\\xc0\\x24\\x8a\\xe6\\x03\\x68\\x22\\xa6\\x7a\\xfc\\x9e\\x02\\x69\\x45\\x73\\x15\\x2b\\x86\\x4c\\x56\\xc2\\xf7\\x30\\xa0\\x82\\x10\\xf8\\x5e\\xc4\\x6f\\x98\\x4a\\x64\\x3d\\x51\\x6a\\x15\\xfc\\xfa\\xa8\\x48\\x40\\xf5\\x12\\x04\\x7d\\x11\\x0e\\x07\\x18\\xd2\\x93\\x95\\x5f\\x01\\x58\\x25\\x7f\\xba\\x0d\\x78\\xeb\\x7d\\xf2\\xf0\\xb7\\x7e\\x6e\\xeb\\x76\\xdb\\x5e\\x71\\x70\\x73\\x10\\xe8\\x27\\x36\\x1c\\xd4\\xe1\\x19\\x74\\x0e\\x63\\x92\\x2d\\xb4\\x2c\\x2c\\xeb\\x5e\\xe1\\x75\\xd5\\x0d\\xec\\xc7\\xb7\\x49\\xfd\\x23\\x25\\xbc\\xe1\\xe6\\xa8\\xf7\\x10\\xff\\xcc\\x1e\\x1c\\x9b\\x33\\xc3\\x80\\xe5\\x2a\\x64\\xda\\xa9\\x58\\x5f\\xab\\xe4\\x06\\xd9\\xcf\\x24\\x48\\x8f\\xe2\\x6f\\x3a\\x49\\x5f\\xb0\\xab\\x50\\xe1\\xe2\\xba\\xd8\\x23\\x81\\xaa\\x22\\x43\\x10\\x99\\xcc\\x8a\\x56\\x98\\x13\\xd7\\x9c\\x9d\\x78\\x56\\x9c\\x0d\\x95\\xda\\x9a\\xad\\x2b\\xfb\\x57\\x75\\x8d\\x52\\xa3\\x75\\x27\\x52\\xe0\\x23\\xd6\\x51\\xc9\\xcb\\x66\\xa4\\x12\\xa5\\xc8\\x0f\\x6b\\xa5\\x47\\x93\\xf7\\xec\\x87\\xb4\\xc5\\x98\\xfe\\xd2\\xce\\x24\\xab\\xd7\\x60\\x87\\x08\\x89\\x5c\\x46\\x72\\x73\\x59\\xff\\xec\\xa6\\xd6\\xc6\\x2e\\x10\\xa6\\x78\\xca\\xa7\\x18\\xb4\\xcd\\x26\\x32\\x92\\xcf\\xef\\x53\\x5b\\x9f\\xbe\\x27\\x56\\xb7\\x39\\x6d\\x69\\x7b\\x31\\x46\\xc5\\x51\\xe6\\xaa\\xc1\\xf5\\xf1\\xc2\\x4b\\xe9\\xb6\\x7a\\x1e\\x2a\\x2a\\xff\\x74\\x53\\x01\\xba\\x6a\\x21\\x22\\x17\\xc5\\x3d\\x68\\x16\\x81\\xbb\\xb4\\x01\\xbf\\x4a\\x43\\x65\\x6f\\x5d\\x15\\xcd\\xe9\\x69\\xc1\\x78\\x00\\x99\\xa3\\x32\\x37\\xeb\\x19\\xa3\\xb8\\x58\\x5d\\x6b\\x5d\\xea\\x2f\\xb5\\x77\\x84\\x5f\\x25\\xee\\x2a\\x82\\xcc\\xf4\\xb2\\x85\\x02\\xf9\\x0f\\xe8\\x0b\\x8c\\xdc\\xdf\\x2c\\xcf\\x93\\xc4\\x34\\xc0\\xe6\\xaa\\x5d\\x87\\x52\\xa4\\x43\\x43\\xc2\\xb1\\x8d\\x20\\xfe\\x40\\x04\\xc4\\x70\\x38\\x65\\x93\\x56\\xf8\\x7a\\xbe\\xd5\\x44\\x50\\x34\\xd8\\xe2\\xd3\\xd1\\x47\\x68\\xf5\\xef\\x31\\x2c\\xf1\\x02\\xa9\\x88\\x46\\x83\\xbc\\xc0\\xcd\\x8a\\x71\\xe3\\xec\\x36\\xfb\\xb6\\x33\\x4a\\x1b\\xba\\xed\\x5d\\x2b\\xf1\\x04\\x16\\xd8\\x2b\\xd6\\x53\\x04\\x75\\x38\\x0a\\xb6\\xe2\\x57\\x7b\\xbc\\x69\\xce\\xbd\\xa7\\x5f\\xaf\\x02\\xad\\x82\\x7b\\x54\\x51\\x82\\x13\\x20\\x6f\\xd4\\xcd\\x66\\xf2\\x52\\xb2\\x34\\xac\\xa9\\xee\\xde\\x7e\\x3e\\xeb\\x81\\x5d\\xdc\\xd8\\xd5\\x19\\xc5\\xd7\\xf5\\xd9\\xd1\\xfb\\x9c\\xa0\\xfa\\x44\\x67\\x99\\x00\\x95\\xfa\\x46\\x22\\x0c\\x20\\xa2\\x07\\x1d\\xfc\\xaa\\xd5\\xf0\\x24\\xda\\xe3\\x41\\x6f\\x7c\\x49\\x2d\\x75\\x74\\x88\\xc4\\x9a\\x2e\\x4d\\xf4\\x83\\xbc\\x9b\\x80\\x09\\x8e\\x0d\\x5d\\x68\\x3f\\xac\\xb8\\xc9\\x60\\x82\\x9d\\xff\\x09\\xb3\\x03\\x36\\x9d\\x46\\xcb\\x57\\x33\\x1f\\xf2\\x17\\x91\\xee\\x25\\xd6\\xbe\\x7d\\xec\\x7e\\xba\\xf1\\xb3\\x24\\x79\\xa7\\xf5\\x14\\xdc\\x64\\x71\\x05\\xc9\\x44\\xc3\\x6f\\x7d\\xbf\\x0a\\x5b\\x58\\x91\\x28\\xdb\\xaa\\xa4\\x21\\x71\\xd6\\x42\\xf2\\x5a\\x98\\x1c\\xe1\\xf8\\x37\\x9f\\x91\\x69\\x0b\\x36\\xaf\\x77\\x46\\x48\\xd5\\x62\\x4c\\x08\\xdb\\xd0\\xa9\\x0f\\x70\\x87\\x16\\xdf\\xab\\x20\\x24\\xda\\xe8\\x65\\xb9\\xc4\\x9a\\xb2\\x74\\x73\\x82\\x6c\\xd4\\xa0\\x10\\xbf\\xdb\\x52\\x01\\x1d\\x8c\\x7c\\xb3\\xf4\\x21\\xca\\x8c\\xa3\\xcd\\x04\\x86\\x88\\x91\\x88\\xe6\\x7d\\xf0\\x0f\\xb8\\xc2\\xa6\\x43\\xe7\\xad\\xb2\\xf8\\x27\\x9f\\x76\\x3e\\x5b\\x9a\\x81\\xb6\\xdf\\xc3\\xf7\\x21\\xfc\\x5f\\x68\\x49\\xf6\\x67\\x36\\x78\\x8c\\xc5\\x57\\xc4\\xeb\\xc6\\xfc\\x68\\xd6\\xf6\\xac\\x77\\xbe\\xdd\\xa8\\xac\\xb3\\x62\\x24\\x3b\\xda\\x74\\xe7\\xb2\"},\n{{0xec,0x05,0x9f,0xc6,0xbe,0x98,0x3c,0x27,0xec,0xa9,0x3d,0xdc,0xdc,0xb5,0x3a,0xf7,0x28,0x62,0x55,0xda,0x91,0xe2,0xa5,0x6a,0x68,0x4f,0x64,0x1e,0xc2,0xd0,0x9d,0x6e,},{0xff,0xc6,0xcb,0x75,0x1c,0x70,0x07,0x1b,0x65,0xec,0x2a,0xc6,0xb4,0x5f,0xd1,0xd5,0x5f,0xe8,0x36,0x96,0x5f,0x80,0xb3,0xe7,0xc7,0x84,0xfc,0x70,0x4a,0xcb,0xdf,0x69,},{0xa7,0xb8,0x8e,0x5a,0xbf,0x13,0x28,0x24,0xbd,0xde,0x77,0xc5,0xf8,0xdf,0x94,0xab,0x26,0x48,0x1f,0x6b,0xee,0x66,0x0e,0xa1,0x62,0x24,0x70,0x82,0xa2,0x50,0xd3,0x90,0xc7,0x1d,0x32,0x0a,0xd0,0x60,0xd8,0xef,0x34,0x1f,0xb6,0x9a,0x48,0x32,0x94,0xf0,0xd6,0xde,0x72,0x6f,0x0c,0x86,0x2f,0xa3,0x7e,0xa4,0xbc,0x6d,0xab,0x52,0x15,0x09,},\"\\xd1\\xac\\x63\\x25\\xa4\\xe6\\x90\\xfa\\x79\\x53\\x68\\x83\\xd5\\xc2\\x0e\\xac\\xb7\\xd9\\x64\\xc0\\x17\\x8f\\x74\\x2c\\x2b\\x23\\x72\\x7d\\xeb\\x62\\x64\\x5a\\xf7\\xc8\\x19\\x22\\xa0\\xe7\\x2e\\x5e\\x30\\xb5\\x83\\x9a\\x2e\\xd5\\xe5\\x67\\xec\\x31\\xce\\x22\\x41\\x15\\xb8\\x2d\\x2b\\xf2\\x51\\xb7\\x39\\x3f\\x01\\xb0\\xd0\\x3a\\x60\\x2b\\xc1\\x20\\xae\\x62\\xaf\\x7f\\xbc\\x37\\x9d\\xfc\\xf9\\x5b\\xbb\\xba\\x98\\x4a\\xab\\xa3\\x4f\\xe2\\x12\\xac\\x99\\x00\\x33\\x28\\xb8\\x32\\xc3\\x53\\x2d\\x42\\xee\\xe1\\xe1\\x87\\x4d\\xc2\\x2a\\xd6\\x7d\\xb6\\xc9\\x1d\\xbb\\xfb\\x2b\\x45\\x78\\x5d\\xbc\\xd3\\x99\\x17\\xd3\\x6f\\xb4\\x8c\\x1b\\x5d\\x6f\\x38\\xbd\\xda\\x5d\\x28\\xfb\\xba\\x64\\x17\\x55\\x75\\xaf\\xea\\x46\\xc8\\xed\\x67\\x57\\xff\\x30\\x16\\x4e\\x0d\\xf2\\xe7\\x21\\x76\\xe8\\xb6\\xc9\\xdb\\x5b\\x5e\\xf3\\x90\\xb7\\x2f\\x2d\\x4d\\x94\\xe3\\xb6\\x6f\\x0d\\x44\\xa7\\xe0\\xf0\\x6e\\x89\\xde\\xbc\\xdf\\x13\\x63\\xc0\\xe7\\x5d\\x50\\xdb\\x5b\\xb7\\x01\\x90\\xd1\\x9f\\x66\\xa3\\x9c\\x6f\\x7d\\xba\\x70\\xdf\\xcd\\x4a\\x9f\\xed\\x02\\xc2\\xf1\\xd0\\x67\\xe7\\xc7\\x88\\xc5\\x8f\\xdb\\x3e\\x17\\xa2\\x37\\x7c\\xe4\\x86\\xec\\x65\\x82\\xf3\\xba\\x99\\x7b\\xb5\\xf7\\x0c\\xd6\\x21\\x00\\x29\\x56\\xf5\\x13\\x1a\\xa3\\xa1\\x61\\x7c\\x0c\\xeb\\xcc\\xd9\\x39\\x1d\\xe1\\x30\\x7c\\x85\\x97\\x0a\\x8b\\xc1\\x55\\xf5\\x19\\x87\\x26\\x68\\x45\\x0c\\x91\\x48\\x86\\x89\\xf5\\x3c\\x2c\\x1a\\x7e\\xd5\\x3f\\x38\\x8c\\xb1\\x3a\\x2c\\x38\\x96\\xfe\\x5b\\x7d\\x3a\\x0d\\xc1\\x68\\x3f\\x27\\x66\\x4c\\x8b\\xea\\xea\\x68\\x0c\\x8c\\xc5\\x4a\\x90\\xe4\\xc6\\xf9\\x9f\\xbf\\x05\\xf2\\xc2\\x2d\\xf6\\x0d\\xe9\\xae\\xc8\\x0c\\x79\\xb7\\xd6\\x62\\x07\\x05\\x06\\x67\\xb4\\x52\\xd7\\x85\\x7f\\x9a\\x8c\\xa7\\x23\\x28\\x0d\\xac\\x79\\x92\\xe2\\x07\\x92\\x67\\xec\\x3a\\xd9\\x11\\x40\\x46\\x42\\xc4\\xe3\\x26\\xbf\\xb9\\x6b\\x43\\xc8\\x94\\x34\\xba\\x4b\\xc7\\x8c\\x25\\x2f\\x4d\\x4c\\xa8\\xd1\\x3a\\x88\\x74\\xc6\\xfc\\x82\\x52\\xea\\x0b\\x56\\xc6\\xbc\\x78\\x68\\x47\\xd4\\x31\\x83\\x06\\xe1\\xc6\\x52\\xc4\\x52\\x58\\x5e\\xef\\xd0\\xbd\\x9d\\xd3\\xc1\\x48\\xa7\\x3b\\xa8\\x6e\\xed\\xea\\x94\\x5f\\x01\\x67\\x13\\xed\\x7d\\xf0\\x85\\xd0\\x06\\x66\\x89\\xe7\\x92\\xda\\xcb\\x2b\\xfc\\x1e\\xb5\\xc8\\x24\\x37\\x2a\\x26\\xc5\\xe9\\x44\\xaa\\x74\\x44\\xac\\x97\\x73\\xd4\\xa1\\x92\\x1e\\x49\\xbd\\xd4\\xf8\\xf6\\xd7\\x88\\xc2\\x63\\xfe\\xe0\\x4c\\x7b\\x44\\x4c\\x53\\x05\\xed\\xb6\\x33\\xe1\\xff\\xe0\\xba\\x4e\\xa8\\xda\\x01\\x1a\\x62\\xf2\\xbb\\xfe\\xf4\\xb8\\x95\\xad\\x3f\\x22\\x4c\\x3b\\xa3\\xbf\\xf0\\xc9\\x5d\\x75\\x75\\x0c\\x9b\\xcc\\x66\\xff\\x8a\\x20\\xb6\\xc2\\x4b\\xde\\x75\\x81\\xa7\\xec\\x38\\x66\\xf8\\x71\\x6f\\x78\\x1f\\x46\\xdc\\xad\\x45\\xa9\\xeb\\xcb\\x6e\\xd4\\x69\\x53\\x36\\x83\\x97\\x01\\x17\\x35\\xd4\\xb5\\x2d\\x00\\xe8\\xdb\\x39\\x79\\x95\\xdb\\xdb\\x3d\\x4f\\x42\\x54\\x68\\x7f\\x04\\x68\\x8a\\x26\\x8c\\x30\\x5b\\x2b\\x1f\\x62\\x2c\\xf5\\x1b\\x17\\x47\\x75\\xba\\xd7\\xf6\\x67\\x4a\\xdc\\x2e\\x58\\xe0\\x5c\\xce\\x86\\x5f\\x12\\xd7\\x56\\x9c\\x8e\\x9b\\x35\\xbc\\xdf\\x3c\\xcc\\xe6\\x33\\x0d\\x08\\xce\\x53\\x40\\xa7\\xc6\\x30\\xf2\\x7a\\x6c\\x80\\x86\\xb5\\x14\\x6b\\x29\\x2f\\xcb\\xf5\\x0f\\xf6\\xaa\\xae\\xf8\\x84\\x8a\\x70\\x7b\\x25\\x43\\xc6\\x18\\xd1\\x7b\\xd9\\x76\\xc2\\x40\\xbc\\x79\\xd3\\x3e\\x00\\x4e\\x49\\x53\\x48\\x29\\x15\\xe7\\xe6\\xef\\x94\\x96\\x4b\\xde\\xa4\\xe0\\x2d\\xd7\\xc2\\xf4\\x75\\x23\\x5f\\x2b\\x99\\xe4\\x32\\x29\\xc9\\xac\\x3a\\xba\\x0d\\xb5\\x9a\\xc2\\xda\\x03\\xa9\\xee\\x4f\\x37\\xdb\\xf2\\x47\\xa3\\x3e\\x6d\\xfe\\x5b\\xe7\\xc7\\xf8\\x25\\x84\\xf0\\x4a\\x46\\xd4\\x9f\\x66\\x21\\xda\\x31\\xb9\\x1a\\xc3\\xda\\xa4\\xd6\\x8d\\x48\\xa5\\x66\\x59\\xb4\\x48\\xc0\\xed\\x36\\x5c\\xb4\\xaa\\x0c\\xfd\\x90\\x88\\x53\\xdf\\x5b\\xbf\\xa8\\x8e\\x60\\xe1\\x0a\\x5a\\x00\\x2c\\x32\\xab\\x33\\x33\\xf2\\xc3\\x9b\\xbf\\x3e\\xe0\\x1a\\x4a\\xa6\\x0d\\x2d\\x01\\x42\\x3e\\x60\\x97\\xdc\\x54\\x30\\x5f\\x81\\xa2\\xd9\\x3e\\x2f\\x6b\\x4e\\x8b\\x35\\x19\\x71\\xcb\\xf2\\x45\\x7d\\xc7\\x6e\\x1f\\xb8\\x92\\x93\\x38\\x47\\x98\\xef\\x28\\x23\\x4e\\x9b\\x1a\\x47\\xde\\xdc\\x23\\x36\\xf8\\x6b\\x8e\\x13\\xc4\\xae\\xf7\\x90\\xf5\\xa1\\x12\\x39\\xc7\\x47\\xd9\\xd8\\x65\\xc9\\xa1\\x5a\\xde\\xb0\\x71\\x07\\x02\\x67\\xe5\\x34\\x62\\x56\\x64\\x8a\\xdc\\x0f\\xa4\\xdb\\xdf\\xd7\\x87\\xca\\x14\\x65\\xfc\\x24\\x0a\\x32\\x4c\\x3c\\xaf\\x29\\x31\\xda\\x41\\x49\\x9e\\x27\\x5f\\xd4\\xb3\\x5f\\x6d\\x08\\xdb\"},\n{{0xf1,0x6a,0xbd,0xbc,0xc0,0xbc,0xc6,0x1a,0x1a,0xee,0x3a,0xbd,0x87,0x67,0xab,0x52,0xe5,0xf7,0x99,0x99,0xbb,0x77,0xa3,0x97,0x6c,0xbc,0x82,0x67,0x0d,0xfd,0x2f,0x73,},{0x10,0xf4,0x51,0x71,0x9d,0xb0,0xfd,0x21,0x37,0x6e,0x22,0x8a,0x41,0xc3,0x03,0x5c,0x8c,0x2b,0xc4,0x2e,0x5a,0xaa,0x92,0x6f,0xe6,0x08,0x87,0x8d,0xbb,0x0d,0xc7,0xab,},{0x33,0xd8,0x05,0x29,0x08,0x69,0xb8,0xe0,0x4f,0xf0,0x89,0xfa,0xa2,0xd1,0xfa,0xb8,0x37,0x43,0xba,0xda,0x68,0xad,0xe5,0xb3,0x8a,0xe5,0xf0,0xcc,0x58,0xc3,0x37,0x4e,0xba,0x43,0x94,0x3c,0x1f,0x51,0x10,0x67,0x8e,0xb3,0x9b,0x46,0x58,0x61,0x18,0x22,0xa2,0x6d,0x35,0xff,0xe1,0x9e,0x9c,0xfc,0xb9,0xba,0x95,0x89,0xe4,0xec,0x31,0x05,},\"\\xbf\\xac\\xd7\\xdd\\x4e\\xea\\x46\\x7d\\xcc\\xe4\\x04\\xf4\\xa3\\x52\\x0a\\x45\\xb9\\x4e\\xba\\xa6\\x22\\x19\\x7d\\x02\\xd6\\x15\\x29\\xd2\\xb3\\xbf\\x27\\x3c\\x4e\\xe1\\xfb\\x95\\xa1\\x80\\xc8\\xf8\\x7d\\xe1\\x90\\xa2\\xe5\\xea\\x70\\xb8\\x4a\\xe1\\xeb\\x6f\\xd4\\x44\\x7d\\x8a\\x3a\\x8d\\xed\\x10\\xf6\\xed\\xe2\\x4f\\x0e\\xb9\\x2b\\xd3\\x0b\\xc6\\x5d\\x48\\x71\\xe8\\xf5\\xda\\x08\\xcb\\xe8\\xcd\\x3c\\x0a\\xc6\\x4f\\xd5\\xa5\\x7a\\x6b\\x06\\x4a\\x89\\xd5\\x15\\x9b\\x42\\xf8\\xb3\\xe5\\xa1\\x83\\x8c\\x9c\\xb1\\x9d\\x88\\x10\\x6c\\x07\\x73\\xa2\\x75\\xcd\\x2a\\x1d\\x60\\x99\\x30\\xbf\\x6b\\x30\\xae\\xca\\x62\\xb9\\x7e\\x31\\x9b\\xbf\\xa9\\x34\\xf4\\xd0\\xa1\\xe6\\xac\\x80\\xba\\xeb\\xcb\\xa2\\xd8\\xea\\x4b\\xed\\x9c\\xa8\\x56\\x2b\\x4a\\xcb\\x56\\x97\\x9b\\xf8\\x85\\x32\\x4a\\xc4\\x0a\\xb4\\xa5\\x0b\\xfb\\x9f\\x34\\x90\\x49\\xfc\\x75\\xa0\\xe0\\x3d\\xe4\\xcc\\x43\\xea\\xe3\\xc6\\xa6\\xcf\\xfb\\x5f\\x6a\\xe6\\xc9\\x45\\x04\\x41\\x5e\\x6c\\x7e\\xd3\\x04\\x5a\\x93\\x2f\\x47\\xfd\\x20\\xb9\\xf3\\x48\\x3a\\x77\\xb6\\xd4\\x49\\xd8\\xdf\\xd4\\xa6\\x38\\xdb\\xf5\\x6f\\x03\\xf0\\xf0\\x31\\x87\\x90\\x59\\xb2\\xfb\\x49\\x76\\x79\\x43\\xf4\\x6b\\x38\\x72\\xe2\\xde\\x56\\x7d\\x5f\\xef\\x80\\xb0\\x29\\x25\\xe9\\x86\\x3e\\x0f\\x1d\\x31\\xa8\\x0f\\x4e\\x64\\x51\\xc3\\x25\\x69\\x4b\\x80\\xcf\\x1f\\x19\\x18\\xc6\\xe4\\x98\\x87\\x8e\\xdc\\x47\\xc4\\x53\\x0c\\xac\\x46\\x6f\\x1a\\x29\\x4d\\x55\\xdf\\x09\\xaf\\x4f\\xdc\\x80\\x72\\xad\\xb1\\xbf\\x26\\xca\\x8c\\x92\\xf9\\x12\\xa2\\xb9\\xfe\\xbc\\x8b\\x97\\xb5\\x8c\\x1e\\x9d\\x32\\xc7\\x80\\x32\\x30\\x52\\x97\\x2b\\x6f\\xbd\\x53\\x30\\x4c\\x05\\x19\\x3c\\xae\\xb6\\x7c\\x5b\\xd3\\xe6\\x74\\x79\\x72\\x5d\\x29\\x7d\\xff\\xb0\\x68\\x90\\xab\\xf8\\xcd\\x9e\\x42\\x45\\x8e\\x16\\x8a\\x61\\x18\\xf9\\x05\\xb1\\xd5\\x34\\x86\\x01\\x6f\\x85\\xdc\\xd9\\x8d\\xd3\\x39\\xe3\\x46\\x05\\x33\\xd0\\xb8\\xa4\\x9f\\xae\\x6d\\xc1\\xa0\\x71\\x72\\x5e\\x6a\\xe5\\xf2\\x94\\x47\\x9e\\xe3\\xbd\\xca\\xeb\\x74\\x06\\x18\\x41\\xfb\\x26\\x08\\xe8\\x8a\\x49\\xfd\\x0f\\x38\\x95\\xb1\\x8f\\x85\\xb9\\x0f\\x72\\x41\\xdd\\x13\\x87\\x71\\x00\\x53\\xfa\\xa6\\x2b\\xae\\x75\\xe9\\xae\\x39\\x36\\x9c\\x1c\\x02\\xde\\x5d\\x19\\x24\\x2e\\xfa\\x16\\xe1\\x1d\\x44\\xa4\\xba\\x57\\x78\\xce\\x77\\x22\\xa9\\x1c\\xec\\x0b\\xc0\\xa0\\x8c\\x06\\x9b\\xdf\\xa1\\x30\\xd1\\xc6\\xc4\\xb5\\x6c\\x6e\\x93\\x54\\x24\\x03\\xcc\\xf2\\x76\\x84\\xde\\xf5\\x7d\\xef\\x26\\xdf\\x86\\xce\\xd5\\x71\\x28\\x2d\\xc9\\x60\\x97\\x46\\x18\\xf0\\xa7\\x4a\\x0c\\xde\\x35\\xb6\\x53\\xcc\\x6e\\x77\\x30\\x43\\x1b\\x82\\x5f\\xfb\\x9b\\x8a\\xaa\\xb3\\xc7\\xa3\\x97\\xc9\\x92\\xbc\\x2f\\xa2\\x32\\x70\\xfb\\x11\\xee\\x43\\x1a\\xfd\\x5f\\x9a\\x64\\x44\\x83\\x01\\x11\\x73\\x99\\x3f\\x19\\x48\\x5d\\xd3\\xcb\\xdd\\x18\\x7b\\xd3\\xd9\\x95\\xeb\\xf0\\x03\\x1b\\x1b\\x0d\\xe4\\xa8\\xde\\x9c\\x14\\xeb\\x6f\\x78\\x0e\\x36\\xb8\\x92\\x57\\x56\\xb9\\x79\\x06\\xa1\\x96\\x9d\\x85\\xe9\\x67\\xd8\\x80\\xe6\\xe7\\xdd\\xa4\\x2f\\xd3\\xc3\\x00\\x19\\xf1\\x1d\\x70\\x81\\x07\\x1e\\xee\\x66\\x26\\x42\\x28\\x36\\xbb\\xed\\x27\\xd4\\x6d\\xd0\\xdf\\x1f\\xeb\\x66\\x10\\xdc\\x85\\x9f\\x51\\x3c\\x0b\\xc6\\x53\\xd7\\x02\\x20\\xfe\\x04\\x8d\\x2e\\x97\\xc2\\xe0\\x6a\\xf5\\x30\\xe1\\x1b\\xdc\\x70\\x29\\xbc\\xcc\\x5c\\x92\\xed\\xec\\xef\\x5e\\x4a\\x2e\\x0b\\xe2\\xd2\\x51\\xf4\\x41\\x5d\\xca\\x3e\\x55\\xb3\\xa8\\x50\\xf2\\x63\\x0b\\x87\\x9e\\x4e\\x03\\x6c\\xe8\\x63\\x3b\\xf2\\x09\\x20\\xb6\\x80\\x94\\x21\\x59\\x29\\xac\\xcc\\x7b\\xe4\\x0c\\x57\\x78\\xbc\\x55\\x4e\\x6e\\xdd\\x7e\\x54\\xc9\\xe1\\x45\\xb2\\xee\\x07\\xb6\\x5d\\x06\\x1c\\x11\\xde\\x0e\\x83\\xf3\\x81\\xce\\x4f\\x57\\xc6\\x48\\x3f\\x51\\x06\\x93\\x63\\x51\\x10\\x74\\xc7\\xa5\\x77\\x35\\x3b\\x45\\xc6\\xeb\\x71\\x19\\x9d\\xce\\x50\\x59\\xfd\\x2c\\x46\\x11\\xb0\\x54\\x23\\x8a\\xaa\\xdf\\x2b\\x6b\\xa5\\x34\\xbf\\xff\\xc2\\x72\\x2a\\xe3\\xe3\\x1f\\xf7\\x9a\\xe2\\xeb\\xca\\x99\\xcc\\x35\\x07\\xf8\\xa0\\x33\\xcf\\x4f\\xea\\x70\\xc5\\x2f\\x7d\\xb5\\xde\\x44\\x2b\\x42\\xb8\\xd4\\x1e\\x99\\x01\\x2e\\x42\\xca\\x0e\\x85\\xa9\\xfb\\x6d\\x4f\\x16\\x5b\\x33\\x0d\\xe6\\x38\\x3c\\x57\\x26\\xef\\xca\\x2f\\xe9\\x71\\x34\\x00\\x02\\xf5\\x62\\xdc\\x6c\\xb8\\xf2\\xfa\\xf0\\x66\\x57\\x25\\xe0\\x97\\x79\\x9d\\x09\\x60\\x91\\x86\\x4d\\x66\\xa9\\x50\\xa5\\x79\\x09\\x53\\xee\\x16\\xb9\\xea\\x58\\x20\\x09\\x21\\x87\\x08\\xc4\\xac\\xcd\\x81\\x38\\x13\\x58\\xa2\\xc6\\x89\\xa0\\x41\\xd0\\x2d\\x78\\x61\\x21\"},\n{{0xbe,0x79,0xd1,0xae,0xea,0x86,0xe8,0x6f,0x39,0x81,0x37,0xe6,0x2f,0xfd,0x79,0xe5,0x0e,0xff,0x9f,0x31,0x3f,0x25,0x19,0x2f,0x89,0xe5,0x2f,0x0b,0x4b,0xbd,0x5d,0x32,},{0x18,0x7d,0xac,0x85,0x5c,0xa4,0x42,0xfd,0x9a,0x3d,0xdc,0x32,0x89,0xc2,0x4e,0xb2,0xd2,0x6f,0x7a,0x40,0xfb,0x29,0xd8,0xe7,0x44,0x31,0xb2,0x50,0x22,0xc3,0xa0,0xcc,},{0x6d,0xab,0x59,0x3b,0xb1,0xd4,0x48,0xc9,0x74,0xa6,0x5c,0x6a,0x0b,0x6f,0xad,0x22,0xb4,0x73,0x26,0x32,0xd0,0x04,0x89,0x17,0x6e,0xf1,0x26,0xaa,0x59,0x01,0x09,0xe0,0xa7,0x23,0xa1,0x13,0x10,0x7b,0x53,0xe1,0x7d,0x69,0x0a,0x0d,0x40,0xb0,0xfa,0x33,0x6c,0xc8,0x7f,0xd5,0xfc,0xe8,0xf5,0x41,0xac,0xce,0xc6,0x7f,0x7d,0x1e,0xbc,0x06,},\"\\x6d\\x63\\x2a\\x7d\\x3c\\x9b\\xe5\\x36\\x49\\xd0\\xd1\\xa5\\xee\\xdf\\x51\\x9a\\x41\\x3b\\x13\\xac\\x64\\xe9\\xad\\x85\\x4d\\xfa\\x04\\xf2\\xe1\\x73\\x29\\xd8\\x22\\xbe\\x57\\x3d\\x9e\\x35\\xac\\x06\\x6f\\x02\\x22\\x13\\xa3\\x44\\x62\\x0b\\xba\\x28\\x9f\\x53\\x31\\x69\\x55\\x84\\xd1\\x34\\x3e\\x81\\x54\\x05\\xae\\xab\\xe3\\x86\\x1d\\x63\\xb3\\xa5\\xb9\\x2b\\x8c\\xd8\\xee\\xed\\x22\\x80\\x22\\x2a\\xbd\\xe3\\x0a\\x1b\\xcc\\xd3\\xf3\\xe4\\x11\\xaa\\xb9\\x22\\xfa\\x1b\\xaa\\x09\\x7a\\xa5\\xc7\\x80\\xd0\\xea\\xef\\x94\\xea\\x10\\xfe\\x21\\xf7\\xd6\\x39\\xb7\\x6d\\x47\\x88\\xae\\xb5\\x92\\x4a\\x9d\\x26\\x2d\\xcb\\xc5\\x68\\x8a\\x3e\\x43\\x54\\x4b\\xec\\x08\\x8c\\xa2\\xe0\\xd0\\x6d\\x77\\xa7\\x1f\\xb6\\x41\\xd5\\x52\\x26\\x61\\x44\\x52\\xb1\\xe0\\x80\\x7a\\x9f\\xcd\\x3c\\xa6\\x9b\\xf7\\xf2\\x5d\\x80\\x41\\x47\\x0c\\xeb\\x7b\\x21\\xea\\xd0\\x3e\\xc0\\x37\\xa1\\x62\\x9b\\xd5\\x00\\xaa\\x23\\x3b\\x59\\xbe\\x44\\x97\\x82\\x10\\xb6\\xa3\\x66\\xf2\\x23\\xac\\xfa\\x07\\x97\\x95\\x40\\x07\\xb0\\x0e\\xfb\\x4f\\xfa\\xdb\\x5f\\xc9\\x2b\\xdb\\x37\\x86\\x3e\\x50\\x2d\\x7d\\x70\\x68\\x10\\x39\\xed\\xf3\\x37\\x70\\xdf\\x3d\\x1d\\xe3\\x43\\xdc\\x35\\xf2\\x26\\xd5\\xe7\\x39\\x44\\xba\\x02\\x55\\xe2\\xa8\\x8e\\xf6\\xc4\\x1e\\x47\\x2b\\x21\\x45\\x67\\xc2\\x49\\x59\\x4a\\x50\\x87\\x8b\\x67\\x31\\xc1\\xae\\xb5\\xb1\\x0f\\xa9\\x1f\\xa7\\x6a\\x37\\xe1\\xf9\\xf1\\xc0\\x0f\\xdb\\xfe\\x34\\x85\\xde\\xd5\\x4a\\x00\\x9a\\xb6\\x13\\x39\\x27\\x11\\x56\\x68\\xb5\\x9f\\x51\\x15\\x50\\x8d\\xa9\\x37\\x0f\\x6b\\xc9\\x2a\\x11\\x85\\xc0\\xd5\\xca\\x01\\xd2\\x91\\xe1\\x8c\\x54\\xac\\xfa\\xca\\x73\\x8b\\xd7\\x19\\x68\\xa3\\x42\\xa0\\xcb\\xa6\\x2e\\x4b\\xb1\\x04\\xa5\\xbb\\x37\\x9f\\xc8\\x3e\\xe1\\x82\\x0d\\x1d\\xb9\\x80\\x25\\x3d\\x6c\\xb3\\x83\\xe9\\x5a\\xf1\\x5f\\x53\\xc8\\x5d\\x17\\x58\\x90\\xdd\\xe5\\xe4\\xed\\x03\\xd2\\xd0\\x13\\x5e\\x3d\\x60\\xb1\\x82\\x93\\xf5\\xb5\\x64\\x1e\\xf8\\x3c\\x6e\\xce\\x3d\\x52\\x59\\x8f\\xc6\\x35\\x36\\x86\\xe6\\xf7\\xb0\\x9f\\xde\\xc1\\xf6\\xf1\\x53\\x67\\x2d\\x34\\xb4\\x89\\xb4\\x8a\\x0d\\xb9\\xe4\\x2c\\xed\\xa7\\x17\\x55\\x48\\x1c\\x04\\x70\\x16\\xc2\\x25\\x34\\xe9\\x0c\\x6d\\x20\\x1e\\xd7\\x85\\x96\\x02\\x63\\x6e\\xa7\\x7a\\xe8\\xc6\\x73\\x4b\\x7c\\x4c\\x5b\\xd9\\x95\\x79\\xc5\\x08\\x73\\x1c\\x72\\x46\\xa2\\x95\\x86\\xe4\\x06\\xe1\\xd9\\x32\\xf6\\x71\\x30\\x71\\xd4\\xbe\\xa6\\x3d\\xc5\\xe2\\xa3\\x76\\x1e\\x16\\x02\\x4d\\x2c\\x32\\x84\\xf7\\x09\\xa1\\xf2\\xba\\x08\\x5e\\xad\\x32\\x00\\xc7\\x04\\x62\\x75\\xcb\\x96\\xb6\\x1a\\x60\\xb5\\xac\\x55\\x9b\\xc4\\x88\\xbd\\x10\\x64\\x67\\xc3\\xde\\x50\\xbf\\x5d\\x74\\x0d\\x05\\xc9\\xcd\\x70\\x1d\\x65\\xb7\\xda\\xea\\x29\\xe6\\x4d\\xd5\\xa9\\x7a\\xdb\\x6b\\x5c\\x82\\xcf\\x7f\\x23\\x01\\x7a\\xa7\\xca\\x1a\\xc9\\xa3\\x9e\\x58\\x27\\xeb\\x47\\xe2\\x0d\\x35\\x9b\\x67\\xc7\\xd4\\xe1\\xa8\\xe3\\xe2\\x7c\\x52\\xd3\\x3d\\x93\\x03\\xa5\\x92\\x62\\x34\\x84\\xd7\\x97\\xb4\\x02\\xcb\\xb4\\x58\\xd1\\xac\\x2e\\xa5\\x3e\\x1c\\x4f\\x7a\\xbb\\x70\\xcc\\x02\\x95\\x54\\xa2\\x34\\x57\\x4d\\xef\\x9b\\xc3\\xb0\\xd3\\x83\\x5d\\xc3\\x14\\x90\\x2e\\x25\\xab\\xb2\\x2d\\xfd\\xed\\xdc\\x67\\x9a\\x3c\\xc8\\xf0\\x73\\x40\\xb1\\x5f\\x57\\x62\\xf4\\x40\\x7f\\x38\\x03\\x42\\x55\\x4e\\xd0\\xc6\\x2f\\x73\\xb6\\x18\\x16\\xea\\x8c\\x52\\x94\\x61\\xe1\\xbf\\x0e\\x9d\\x1c\\x2d\\x5e\\x4c\\x57\\x46\\x33\\x6b\\xc0\\xe1\\x32\\x87\\x3c\\xde\\x0d\\xc2\\x15\\x8b\\x54\\xfa\\x1b\\x67\\x8a\\x00\\x6b\\x4d\\x95\\xed\\xa8\\xa9\\x55\\x71\\x42\\x73\\xb7\\xcc\\x5c\\xf2\\xad\\xd9\\x09\\x4d\\x46\\xe4\\x9a\\xbc\\x09\\x6a\\x45\\xf4\\x18\\xe2\\xed\\xbe\\x99\\xdd\\x85\\x29\\x11\\x68\\x80\\x64\\xdf\\x7c\\xf0\\x61\\xd0\\x7a\\xee\\xf4\\x27\\x95\\x69\\x0f\\x48\\xc9\\xba\\x19\\x56\\x54\\x75\\xd5\\x46\\x8a\\x9e\\xf4\\x5d\\x7b\\xf7\\x5f\\xd7\\x11\\x82\\xdd\\x6e\\x64\\x01\\x38\\xf1\\x82\\xa6\\xa0\\xc6\\xcb\\xbd\\x00\\xc4\\x95\\xc4\\x38\\x95\\x30\\xac\\x8e\\x67\\x96\\x0e\\xb5\\xc5\\x76\\x3f\\x54\\x84\\xea\\xb1\\xc1\\xab\\x85\\x01\\x40\\xda\\x04\\x2b\\xa4\\x7e\\xd8\\x52\\x88\\x00\\xd4\\x17\\x87\\xf0\\x75\\xfe\\x0d\\x85\\x50\\x1a\\x7a\\xb7\\x66\\x35\\xd0\\x34\\x10\\xd2\\x86\\xc0\\xe1\\x7d\\xb4\\x02\\x3a\\x76\\x39\\x74\\x68\\xcc\\xb0\\x91\\xcc\\x5a\\xc1\\xf6\\x43\\x45\\x87\\x91\\x3e\\xab\\x92\\x2b\\x50\\xca\\x55\\x67\\x01\\x6d\\xde\\xa3\\x2f\\xb5\\x32\\x55\\xbe\\x67\\xf2\\xdc\\xf9\\xff\\xa8\\x5d\\x11\\x7f\\x1a\\x65\\x5f\\xa7\\x0d\\xd3\\xa5\\x4c\\xf9\\x91\\x53\\x1f\\x19\\x13\\x0e\\xaa\"},\n{{0x26,0x99,0x52,0x17,0x2c,0x3f,0xa9,0x76,0xde,0xfb,0xf4,0x0b,0xd6,0xed,0xd8,0xf1,0x5c,0xfd,0x4b,0xe1,0x0c,0x75,0x8e,0x37,0x41,0xd7,0x41,0x62,0xd8,0xea,0x22,0x9a,},{0x4a,0xea,0x57,0xc7,0x21,0xe3,0xdc,0xca,0x82,0x39,0xe9,0xad,0x9b,0x22,0xc1,0x9b,0xab,0x8d,0xf7,0x2c,0x88,0x79,0x3b,0x24,0xd8,0xdc,0x47,0xcf,0x97,0x40,0xfc,0xf8,},{0x3a,0xc8,0x0d,0x1e,0x8f,0x68,0xb4,0x05,0x8c,0x3a,0x04,0xda,0xd7,0x18,0x73,0x73,0x95,0x9f,0x26,0xa2,0x70,0x02,0x49,0x6f,0x8a,0xfa,0xac,0xcd,0x8b,0xea,0x09,0x01,0xc5,0x4c,0xab,0x87,0xb2,0xa2,0x30,0x2e,0x1f,0x36,0x25,0xc2,0xb0,0x6c,0x7e,0xbc,0xf3,0xce,0x96,0xde,0x3a,0xfd,0xf0,0x0f,0x51,0x94,0xa3,0x5e,0x05,0x52,0xc7,0x0e,},\"\\x7c\\xcb\\x6a\\x05\\x70\\xc5\\x33\\x73\\x7b\\x9a\\x53\\x4a\\x34\\x1a\\x7a\\x96\\xdc\\x76\\x52\\x8b\\x99\\x7a\\x9b\\x48\\xe6\\xe0\\xfd\\xe1\\x0f\\x47\\x4b\\x27\\xec\\x98\\x99\\x12\\xd1\\x76\\xca\\xb7\\x42\\xd8\\x9a\\x84\\x8b\\x36\\x66\\xe9\\x27\\x7d\\x69\\x5b\\x02\\x2f\\xd5\\x3a\\x9e\\xb8\\x9e\\x88\\xc7\\x20\\x39\\x9e\\x24\\xed\\x25\\xdb\\x9e\\xb3\\x5d\\x6d\\xa0\\x09\\xe9\\xf0\\x24\\xef\\x8e\\x65\\x51\\x65\\xbd\\xef\\x1c\\x0d\\x79\\x7c\\x74\\xf0\\x19\\xcd\\x59\\x1a\\x04\\x42\\xa1\\x2d\\x1c\\xa8\\x93\\x83\\x6c\\xa2\\x62\\x8b\\x33\\xe8\\x54\\xf3\\x42\\x8e\\xec\\x4a\\xa5\\xed\\x84\\xf4\\xbd\\xd2\\xee\\xf8\\xb6\\xd2\\x25\\xca\\xf9\\x49\\x6d\\xf9\\xed\\xff\\xd7\\x35\\xea\\x54\\xdb\\x1b\\xde\\xa8\\x83\\xad\\x5d\\x47\\xeb\\x0b\\xd4\\xa6\\x65\\x3f\\x0a\\xb0\\x37\\xf0\\x40\\xa4\\x15\\x17\\xa7\\x74\\x1f\\x91\\xe8\\x2f\\xdb\\x6f\\xda\\x04\\xf0\\xdf\\xa1\\xbc\\xf8\\xb9\\xb3\\x7b\\xf2\\xbf\\xbd\\x87\\x32\\x7a\\x63\\x6f\\x90\\x7f\\xdf\\x96\\x8d\\x01\\x89\\xd1\\xa1\\x18\\x09\\xc4\\x23\\x0b\\xa6\\x9d\\x5c\\xbd\\x84\\xf5\\x61\\xbc\\xac\\x3a\\xd0\\x02\\xe5\\x58\\xc5\\xb9\\xb0\\x97\\xa0\\x19\\x02\\xf2\\x9c\\xe3\\xf1\\xec\\x26\\x41\\x53\\xd6\\x68\\xc7\\x8b\\x84\\x51\\x05\\xb9\\xcd\\x2e\\xf3\\xc9\\x43\\x53\\x1b\\x75\\xaa\\x42\\x8f\\x17\\x9e\\x4b\\x34\\x18\\xb1\\xd5\\xa4\\xaa\\x7a\\xb1\\x20\\x3e\\xfa\\x49\\x5c\\x87\\x69\\x62\\x8e\\xb1\\x06\\x3a\\x93\\x7b\\x73\\xe4\\xb5\\xcd\\x0c\\xda\\x33\\xda\\xb0\\x1a\\x50\\xc6\\x4f\\xeb\\xd9\\x75\\xc5\\x7a\\x1e\\x84\\x15\\x08\\xe8\\x60\\x60\\x94\\xd0\\x82\\x4f\\xdd\\x96\\xcc\\x6c\\xfa\\x18\\xfa\\x82\\x09\\xb3\\x0f\\x0a\\x2a\\x78\\xea\\xc9\\xa7\\x67\\x17\\x6f\\x57\\x3e\\x78\\xc0\\x68\\x80\\x9b\\x19\\x9a\\x69\\xac\\x6d\\x33\\x5d\\x7c\\x92\\x09\\x99\\xc4\\x0c\\xba\\xd8\\x7c\\xf4\\xcc\\x7c\\xa5\\xc6\\x44\\x29\\x1d\\x75\\xad\\x7a\\x74\\xbc\\x1e\\x63\\x92\\xd1\\xce\\x31\\x1e\\xcf\\xd2\\xeb\\xc9\\x16\\xe3\\x9e\\xb6\\xaa\\x3e\\x7d\\x89\\xfb\\x80\\x5a\\x27\\xa5\\x5f\\x17\\x89\\x12\\xb1\\x57\\xbc\\x01\\xa0\\x55\\xf6\\x7a\\xef\\xa7\\x8e\\x55\\xc8\\x06\\xcb\\xd9\\xc0\\x1b\\xaf\\x8e\\xf9\\x2c\\xad\\x22\\x60\\xb4\\xbb\\x14\\xcf\\xe6\\x17\\x82\\xde\\xe5\\xc5\\x99\\x72\\x50\\x69\\x41\\xc4\\x62\\xa4\\xda\\x7e\\xb8\\x99\\x53\\x1c\\xf9\\x96\\xbc\\x98\\xba\\x36\\x29\\xef\\xfe\\x6f\\xcd\\x17\\x06\\xd1\\xb4\\xee\\x4f\\x2a\\x14\\xe9\\x21\\xbd\\x40\\x8f\\x30\\xe1\\x2e\\x73\\xfb\\x7a\\xa8\\x60\\x53\\x6b\\x03\\xe7\\x7c\\xa9\\x37\\x82\\x32\\x81\\xa1\\x64\\x53\\xfe\\x82\\x79\\x35\\x94\\x32\\x01\\xe6\\xec\\x14\\x3a\\x67\\xee\\xfa\\x4f\\x94\\xe9\\xab\\xf9\\x4f\\x7e\\x3d\\x41\\xb7\\x0a\\x82\\xbe\\x69\\xde\\xd8\\xa5\\x30\\x60\\xc2\\x30\\x5f\\x42\\xf6\\x2f\\xe6\\xa2\\xf7\\x04\\xb6\\x7a\\x1e\\x8f\\xdd\\xc7\\xd9\\x8b\\xa7\\xf3\\x45\\x71\\x19\\xb3\\x11\\xd4\\x49\\x66\\x3e\\xd9\\xe3\\x20\\xd6\\x18\\xdc\\x23\\x68\\xd4\\x95\\x08\\x75\\xb9\\xc3\\x8c\\x5d\\x8c\\x03\\x10\\x4e\\x2e\\x32\\xc4\\x32\\x5d\\xed\\xd2\\xbc\\x26\\x7e\\x2a\\xcc\\xb0\\x11\\x20\\x18\\xe9\\xc5\\xa8\\x00\\x7c\\xca\\xb2\\xf6\\xd7\\xc7\\x37\\x79\\x20\\x02\\xac\\xb7\\x30\\xd7\\x2e\\x9f\\x73\\x08\\x29\\xeb\\xc4\\x2c\\xa5\\x64\\xc1\\xd9\\x27\\x1b\\xf1\\x86\\x9c\\x4d\\x35\\x83\\x55\\x89\\xb7\\x43\\x1e\\xf7\\xa3\\x1a\\x07\\x00\\x60\\xfe\\x4a\\x08\\x9f\\xb1\\x1f\\x2d\\xd3\\xdc\\xe6\\x5a\\xe0\\xfb\\x45\\xbc\\x3a\\x28\\x60\\x91\\x7d\\x93\\x3b\\xa2\\xd0\\x90\\x56\\x9e\\xf5\\xed\\x43\\xbc\\x25\\x32\\xdb\\x87\\x9e\\x0f\\x1f\\x22\\x5e\\xad\\xcb\\xef\\x1c\\x03\\xd9\\xed\\x78\\x29\\x9e\\x23\\x3e\\x4c\\xf0\\x7b\\x06\\x4a\\x7b\\xaa\\xc3\\x4c\\x5a\\x0c\\x19\\xfc\\x3a\\x55\\x42\\x08\\x9f\\x70\\x16\\x7b\\xe2\\xf8\\x5b\\x4a\\x10\\xe7\\x78\\x52\\x52\\x23\\xbe\\x8f\\xfd\\x5c\\xff\\x96\\x48\\xb1\\x00\\x5a\\x09\\x8b\\x4b\\x39\\x24\\x39\\x8f\\xb0\\xbc\\xab\\xcc\\x6e\\xdf\\x30\\xc0\\x61\\xec\\xe7\\xae\\xa3\\x5f\\xe9\\x8a\\x92\\x03\\xf8\\x71\\x13\\x69\\x53\\x0f\\xeb\\x5e\\x67\\xbb\\x2d\\x4f\\x59\\xd9\\xc8\\xbc\\x99\\x38\\x54\\xdd\\x47\\x47\\xcd\\xe3\\x99\\xbd\\x0e\\x63\\x74\\x0c\\x1c\\xc8\\x39\\xad\\x0f\\x09\\x8a\\x38\\xa8\\x0b\\xea\\xdd\\x64\\x8e\\x14\\x36\\xde\\xee\\x60\\xe9\\x31\\xe6\\x8f\\x52\\x97\\x9c\\xe4\\x9f\\x30\\x1f\\xe3\\x9a\\xfb\\xb6\\x15\\x35\\x20\\x91\\xc8\\xb6\\x58\\x5f\\xe8\\x84\\x47\\xed\\x6e\\x59\\xa0\\x20\\xb2\\xbb\\xe6\\x6a\\x94\\x23\\xae\\x52\\x28\\xc2\\x03\\xbf\\xd4\\x84\\x7b\\x51\\x81\\xe2\\xc3\\xb4\\xda\\xd8\\x3a\\x6d\\x4f\\xa7\\x69\\x85\\xee\\xf7\\x6a\\xdd\\xe3\\xb3\\x4e\\xdb\\xdd\\x28\\xd6\\xa0\\xb4\\xa4\\xee\"},\n{{0xcc,0x31,0x38,0xe5,0x02,0xa5,0xff,0x6f,0x80,0xd2,0x46,0x36,0x6e,0x84,0xd6,0x5c,0x59,0xf1,0x2d,0x4f,0x49,0x63,0x97,0xe6,0xeb,0x99,0xb5,0x26,0x7b,0x8c,0xbe,0x2a,},{0x9e,0x2d,0x3e,0x88,0xaf,0x7b,0x52,0xdd,0xcf,0x00,0xe6,0xd0,0xc7,0x75,0x9c,0x12,0x38,0xb8,0xfb,0x3e,0xb1,0x44,0x21,0xfe,0x82,0xc3,0x48,0x33,0x43,0x78,0x35,0xbd,},{0xa2,0x70,0x0e,0x38,0x95,0xed,0x0c,0xc2,0xaa,0xf0,0x12,0xa4,0x0b,0xc7,0xbd,0x0b,0xd2,0x9d,0xd7,0x9c,0x69,0xc0,0xb4,0xa6,0xed,0xd0,0x53,0x0c,0xf3,0xe2,0x67,0xc0,0xf8,0x2d,0xd8,0x4e,0xda,0xf1,0x74,0x4d,0xc4,0x11,0xd6,0x2c,0x00,0x28,0x71,0x52,0x58,0x82,0x2d,0x7b,0x63,0xd3,0x97,0x05,0x61,0x2b,0x3f,0xad,0x4b,0x5e,0xfb,0x04,},\"\\x58\\x5e\\xcf\\x2f\\x09\\xeb\\x92\\x3d\\xf2\\x0a\\x85\\x55\\x64\\x2a\\x2b\\xc0\\xb6\\x8c\\x6a\\x5f\\xcf\\xd6\\xb8\\x40\\x1c\\x4a\\x0c\\xba\\xbb\\x4c\\x6e\\x6a\\x20\\x67\\x62\\xb7\\xa3\\x9f\\x2c\\x54\\x55\\xd7\\x80\\x8e\\xbf\\xbe\\xd5\\x6d\\x67\\x60\\xa4\\x31\\xc7\\xd2\\x0c\\x2d\\xc6\\xef\\x1b\\x73\\xca\\xa3\\xc4\\x94\\x88\\xe3\\x0b\\x1c\\xa2\\x52\\x0a\\xd2\\x0b\\x26\\xa1\\x97\\x00\\x78\\x0e\\x5e\\xf3\\xce\\x01\\x44\\x38\\x8d\\x84\\x07\\xb6\\xa7\\x0c\\x1c\\xda\\x37\\xdb\\x7f\\x12\\x09\\x1d\\x89\\x2f\\x2e\\x91\\xad\\x40\\x78\\xbb\\x4d\\xb1\\x76\\x2e\\x46\\x28\\x5a\\x7b\\x66\\x4b\\x2a\\xd3\\xa3\\x4d\\x26\\xd8\\xa9\\x4d\\x64\\x58\\x7a\\x84\\x52\\x77\\x22\\xea\\x83\\xcb\\x8a\\xa8\\x89\\x84\\xe1\\x48\\x97\\x43\\xb4\\x21\\x4e\\xa6\\x04\\x1a\\xa1\\x8e\\x55\\x20\\x09\\x54\\xef\\xc7\\xed\\xb3\\x19\\xdf\\x94\\x7e\\xfb\\xfc\\x6c\\x8d\\x0f\\xea\\x48\\xa1\\x31\\x61\\x34\\x65\\xd8\\xf4\\xc4\\x94\\x98\\xf2\\x26\\x91\\x45\\xc6\\xda\\xe5\\x04\\x78\\x05\\x25\\x98\\xe1\\xca\\x3b\\xe0\\xe3\\x36\\x11\\x57\\x1f\\xa3\\x84\\x77\\x1e\\xee\\x40\\x2c\\xc2\\xb1\\xd8\\x48\\x36\\xc8\\xf1\\xad\\x28\\xf2\\xad\\x23\\xde\\xe9\\xff\\x1d\\x7e\\x1f\\x25\\x21\\x63\\x58\\x74\\x11\\x5d\\xef\\x4d\\x93\\xe8\\x9b\\xe7\\x61\\x80\\xbc\\x55\\xf7\\x61\\x14\\x43\\x60\\xa8\\xb2\\x22\\x89\\x2d\\x64\\xd1\\x57\\xcc\\xb5\\xd8\\xf4\\x85\\x5d\\xca\\x56\\x70\\x14\\x95\\xa0\\xe1\\x00\\x2d\\x34\\x0a\\x4a\\x46\\x15\\x6b\\x9b\\x7f\\xe0\\x6b\\x7c\\x07\\x59\\xe0\\xb6\\xdf\\x55\\x9b\\x69\\x1e\\xde\\x78\\xb5\\x5a\\xf6\\x4e\\x7c\\x8d\\xd9\\x08\\xb7\\x88\\xdd\\x6b\\xa3\\x5a\\x90\\x2c\\x81\\xdc\\xeb\\x37\\x88\\xb6\\x15\\xde\\x22\\x5a\\xfa\\x58\\xa8\\x11\\x81\\xab\\x24\\xa7\\x37\\x05\\xee\\x83\\x8b\\x6e\\x86\\x3f\\xe1\\xbc\\xc2\\x6c\\x1b\\x94\\x32\\x39\\x23\\x0c\\x27\\xc6\\xb3\\x97\\xb2\\x3d\\x13\\xde\\x6a\\x02\\xc9\\x7f\\x36\\x45\\xda\\x91\\xd4\\x13\\xf9\\x16\\x47\\x3b\\x01\\x8a\\x61\\x59\\x4b\\x6f\\x51\\xce\\xa4\\x44\\x57\\xda\\x1e\\x3d\\xbb\\xba\\x6d\\xe1\\x68\\x66\\x65\\x7e\\x92\\xef\\x02\\x02\\x71\\x8a\\x84\\xad\\x03\\x33\\xe8\\x33\\x6b\\x05\\x2b\\x00\\x47\\x33\\xe8\\xe9\\x5e\\xc1\\x3e\\x5f\\x91\\xb3\\x80\\x6a\\x98\\xd3\\xdb\\x72\\x9f\\xb7\\x35\\xb8\\x14\\x7c\\x4a\\x98\\x2a\\x2d\\x5b\\x4e\\xfa\\xe9\\xc0\\x9d\\x0a\\x9b\\xf8\\x91\\xcb\\xbc\\x3c\\x8f\\x53\\x1e\\x76\\xe4\\x04\\x4e\\xc9\\x1f\\x4d\\x7c\\x5c\\xf7\\x73\\x10\\xe2\\xb2\\xcd\\xe2\\xe0\\x7c\\xcf\\x3e\\x0a\\x19\\xdd\\x6a\\xe1\\xb3\\xfc\\xb2\\xdf\\x42\\x18\\x6e\\x9c\\x72\\x92\\x2d\\x2d\\x4c\\xe5\\x1b\\x30\\x6e\\x81\\xb1\\x6c\\xfc\\xf8\\xf0\\x0d\\x51\\x3f\\xbd\\x2c\\x52\\x39\\xb4\\x5a\\xfc\\x65\\x4f\\x6f\\xe2\\x1a\\xcb\\x7e\\x8a\\x0c\\x9a\\xa8\\x7b\\x0b\\x60\\x50\\x74\\xdf\\x95\\x76\\xa6\\xdd\\xd9\\x00\\xac\\xa5\\x67\\x61\\x7c\\xb7\\x96\\x56\\xb3\\xb5\\xec\\xb9\\xff\\x68\\xb2\\xf6\\x24\\x1e\\xd0\\xd0\\x24\\xac\\x27\\xaa\\x6e\\xb4\\x86\\xb6\\x9f\\xdc\\x0a\\x0d\\xb9\\x20\\x96\\xab\\xf8\\x60\\x02\\xde\\xc7\\xaf\\xd8\\x47\\xa0\\x06\\xa3\\xf6\\x95\\x5b\\x49\\x56\\x90\\x53\\xbe\\x9f\\x1d\\x0a\\x49\\xb7\\x93\\xa5\\x41\\x1e\\x59\\x16\\xf4\\x18\\xec\\xab\\x95\\x32\\x43\\x55\\x3b\\x66\\xe6\\xba\\xdc\\x4e\\x90\\x9b\\xe0\\xef\\x5c\\xc7\\xc6\\xd2\\x71\\x99\\xec\\x3f\\x21\\x42\\x3b\\xc4\\x57\\x73\\xfb\\x40\\xb9\\x7b\\x61\\x18\\x5b\\x57\\x08\\x0e\\x8f\\x0b\\x89\\xa3\\xea\\x57\\xc8\\x44\\x4a\\xb2\\x7e\\xcf\\x70\\x06\\xa7\\x66\\x04\\x7e\\xef\\xf5\\x4d\\x85\\x56\\xcf\\xed\\x23\\xde\\xf1\\xda\\x2c\\xc8\\xae\\xbb\\x48\\xc9\\x4e\\x77\\x9e\\x82\\x03\\xae\\x2c\\x90\\x2b\\x51\\xde\\x0e\\xde\\x04\\x56\\xfb\\x73\\xfb\\x4d\\x5f\\x51\\x4a\\x4c\\xeb\\xc4\\x7f\\xec\\x3f\\x94\\x84\\x69\\xa5\\x45\\xc6\\xbc\\x57\\xb4\\x13\\x8d\\xb3\\x4e\\x7c\\xc0\\x06\\xde\\x26\\xef\\x50\\x7b\\x54\\xd2\\x81\\x47\\x56\\x7a\\x8c\\x29\\xac\\x1e\\xce\\xf5\\xbb\\x84\\xfb\\x99\\xac\\xeb\\x23\\xa2\\x02\\x94\\xd7\\x4a\\x85\\xae\\x36\\xb3\\x34\\x50\\x66\\x8a\\x5c\\x26\\x09\\xd3\\xa9\\x39\\x34\\x58\\x6f\\xf9\\x0c\\x3b\\x6d\\x27\\x32\\x9e\\xee\\xf3\\xa7\\x54\\xe9\\xa9\\xcb\\xd5\\x61\\x7e\\xf3\\xb0\\x93\\x97\\xbd\\xc9\\x71\\x37\\x07\\x66\\x58\\x9a\\x12\\xd8\\x90\\x05\\x0d\\x16\\x51\\x45\\x8b\\x3f\\xc5\\x33\\xc8\\x43\\xbf\\xfd\\xf9\\x75\\x4d\\x93\\x2c\\x4e\\xd7\\x61\\x1d\\x4d\\x27\\xc3\\x2a\\x08\\x75\\x55\\xb5\\xea\\xa3\\x7a\\xe9\\x0c\\x49\\x79\\xef\\x54\\x29\\x9c\\x42\\x0a\\xb5\\xe2\\x9a\\xe2\\x84\\x5d\\x4d\\xcf\\x21\\x78\\x92\\x0a\\x86\\x51\\x75\\xfb\\x9c\\xc0\\xe6\\xb8\\xc5\\x24\\xb1\\xee\\x49\\x58\\x05\\xd5\\x17\\xbf\\xe0\"},\n{{0x5c,0x69,0x2c,0x68,0x11,0x98,0xb1,0x72,0xdf,0x2f,0xac,0x2a,0xec,0x3f,0xcf,0x70,0x15,0xc2,0xbb,0x68,0x30,0xf2,0xa9,0x8e,0x30,0xa3,0x96,0xb6,0x4a,0xf4,0x28,0x0e,},{0x33,0xb1,0x69,0xd4,0xca,0x27,0x10,0x40,0x92,0x6e,0xa8,0x78,0x35,0xe5,0x06,0x6f,0x9f,0x05,0x78,0x2f,0x08,0x7f,0xca,0x7a,0x55,0x6f,0x7b,0xf4,0xcb,0xa2,0xe8,0x86,},{0xad,0x8f,0x37,0x9c,0xaf,0x41,0xf7,0x2d,0xcc,0xad,0xc3,0xe9,0x15,0x35,0x7a,0xb0,0xcd,0x30,0x4e,0x10,0xf4,0x12,0x0e,0x0d,0xbb,0xfa,0xac,0x01,0xbf,0xfa,0xf2,0xbe,0x89,0x3f,0x70,0x07,0x2d,0xc9,0x64,0x06,0x91,0x81,0xbe,0xc1,0x7f,0xe0,0x25,0x10,0x55,0xb2,0x1e,0x23,0xde,0xe4,0x36,0x3b,0x27,0xef,0x1f,0xff,0x67,0xaa,0xfe,0x06,},\"\\xb1\\x60\\xee\\x3a\\x93\\xcf\\x6b\\xc3\\x45\\x6e\\x5b\\xd0\\x19\\x7c\\x09\\xaa\\x76\\xc2\\x25\\x80\\x52\\xf9\\xa3\\x4d\\xbc\\x2e\\xd5\\x89\\xf8\\xdb\\xe5\\xff\\x99\\x69\\xa6\\x1c\\xfe\\x84\\x6b\\x2f\\x67\\x39\\xdc\\x7d\\x4a\\x14\\x96\\xe9\\xad\\x58\\x60\\x5b\\x5a\\x27\\x58\\xca\\x07\\x8c\\x55\\xa9\\xfc\\x1c\\x4e\\xeb\\x54\\x91\\xa8\\x4b\\xfd\\x46\\x8a\\x2c\\xeb\\x14\\x1a\\x77\\x34\\x93\\xa9\\xb3\\xee\\x82\\x8b\\x5d\\xde\\x9c\\x00\\xc2\\x36\\xff\\x01\\x56\\xe4\\xe2\\xe4\\x5f\\xa0\\x79\\x31\\xda\\x68\\xbb\\xd2\\x03\\x0a\\x88\\x14\\x05\\xc4\\xf7\\x87\\x28\\x81\\x3a\\x5e\\x04\\x81\\x24\\x04\\xc2\\xa1\\x9c\\x9b\\x87\\xb1\\xcf\\xe9\\xaf\\x95\\xe2\\x73\\xec\\xf9\\xc5\\x18\\xc5\\x39\\x35\\xf8\\x42\\x56\\x3b\\x19\\x2f\\xae\\x12\\xa7\\x3c\\xef\\x08\\x5f\\xe1\\x9e\\x89\\x9e\\x5b\\xa0\\x89\\x79\\xe3\\x11\\xfb\\x28\\x6f\\xbf\\xc7\\xb2\\x48\\xaa\\xbd\\x40\\xdc\\x61\\x61\\x0e\\x1d\\x4f\\xc9\\x80\\x6d\\xd2\\x12\\x92\\x39\\x2d\\xb2\\xdb\\x40\\x42\\x6c\\x5d\\x19\\x6a\\x48\\x9c\\x5d\\xb7\\x7e\\x3e\\x9c\\xf0\\xbd\\x04\\x1e\\x3c\\x23\\xb5\\xba\\x1d\\xb7\\x81\\xa1\\x07\\x90\\xbe\\x1f\\xe0\\x7a\\x2b\\x00\\xca\\x3a\\xf8\\x9c\\xbd\\x46\\xef\\xce\\x88\\x0e\\x1e\\xf2\\x8b\\x0c\\xd7\\x9d\\x53\\xb4\\x2c\\xd8\\x0e\\xaa\\x13\\x7e\\xff\\x7d\\xf9\\x0b\\xcb\\xcf\\x95\\xc9\\x85\\x8d\\xc0\\xcc\\xc6\\xd8\\xca\\x8a\\xe3\\x54\\x7b\\xdb\\xf9\\xff\\x90\\x24\\xf3\\xcf\\x17\\x01\\x15\\xeb\\x28\\xbf\\x12\\xb7\\xd3\\xb7\\x01\\x46\\x0f\\x48\\xd1\\xb4\\xb2\\x3d\\x7f\\x6f\\xf7\\x2f\\xfd\\xc9\\xa6\\xc5\\x26\\x24\\xd1\\x53\\x12\\xd7\\xf1\\x9d\\xdb\\x60\\x26\\xa1\\x5e\\xb5\\x42\\x95\\xd3\\x31\\xfd\\x79\\x50\\x91\\x03\\xbc\\x59\\xa3\\xb6\\xe1\\xba\\x7a\\xc8\\xc1\\x12\\xe4\\xde\\x28\\x17\\xe5\\x1c\\x1e\\x16\\x50\\x7b\\xa6\\x6f\\x25\\x47\\xbc\\x89\\x9f\\x69\\xc1\\x20\\x7a\\xe5\\xe3\\x7b\\xdb\\x0e\\x16\\x1b\\x15\\xb6\\x12\\x30\\x5b\\xc0\\x94\\x0f\\x9d\\x1b\\x38\\x2a\\x37\\xec\\x2d\\xa6\\x39\\xa6\\xec\\xba\\x1b\\xcd\\xfc\\x51\\x21\\x4c\\x32\\x23\\xc1\\x1b\\xba\\xb7\\x9f\\x3f\\xae\\x3d\\x55\\xe2\\xd4\\xbe\\x58\\x4f\\xd7\\x60\\x1e\\x4e\\x2e\\x55\\x8b\\x3b\\xe5\\x70\\x71\\x15\\xa6\\x1f\\x5a\\x81\\x5e\\xc2\\x4a\\xac\\x18\\x09\\x34\\x57\\xbc\\x46\\xc0\\x5c\\xfb\\x7a\\x3f\\x25\\x33\\xea\\xda\\xdc\\x9e\\x6c\\x1f\\xe3\\x10\\x77\\x9e\\x69\\x7f\\x68\\x30\\x35\\xce\\x57\\x87\\x3d\\xf5\\x5d\\x79\\x1f\\x6d\\x2f\\xb0\\xe2\\x10\\x7e\\x68\\x66\\xf8\\x39\\xc3\\xa1\\x26\\xe9\\x02\\x38\\x65\\xce\\xd1\\xbc\\xf6\\x77\\x99\\x55\\xaf\\x54\\x7e\\x1d\\x87\\xeb\\x32\\xa9\\xbf\\x32\\x28\\x57\\xfd\\x12\\x6b\\x0c\\xdc\\x5d\\x5e\\x90\\x4e\\xb7\\x6c\\x67\\x06\\xe3\\xc8\\x97\\xae\\xfd\\x6e\\x47\\x56\\xfb\\x8a\\xca\\x81\\x70\\xca\\x5b\\x39\\x66\\x90\\x89\\xaf\\x1b\\xb1\\x41\\xa2\\x5d\\x6b\\x8b\\x06\\x03\\x4d\\x8b\\x11\\xab\\xf1\\xff\\x8f\\x8d\\x43\\x37\\x58\\x46\\xfa\\x8f\\xa8\\xa3\\x4b\\x5f\\x26\\x48\\x20\\x74\\x4d\\x31\\x14\\x9b\\x7d\\x57\\x32\\x6c\\x59\\xb1\\xdb\\x74\\x13\\x16\\x78\\xf6\\x34\\xe7\\x23\\x2c\\xa5\\xea\\x51\\x88\\x76\\x0a\\x70\\xdc\\x35\\xdc\\x89\\xf8\\xe4\\x53\\xb4\\xc6\\x5b\\x77\\x2c\\x2b\\x6b\\x62\\x76\\x8d\\x83\\x73\\x23\\x65\\x51\\xba\\xaf\\x24\\xd3\\xc3\\x04\\xc4\\x1b\\x62\\xc3\\x6e\\x6a\\x33\\x83\\xb3\\xa1\\x63\\xb7\\x3e\\x78\\xd8\\xba\\xdb\\x75\\x74\\x1e\\x50\\x01\\xd4\\x19\\xd3\\x0e\\x2e\\xd7\\x7c\\x30\\x96\\xe8\\xd8\\xdf\\x71\\x3b\\x93\\x76\\x2c\\x97\\x07\\xbd\\xd0\\xf3\\x65\\xa8\\x74\\xb9\\xda\\x8a\\xb7\\x10\\x49\\x5d\\xd5\\x6a\\xea\\x93\\xbb\\x77\\xfb\\x22\\x26\\x35\\xc6\\x3b\\xce\\x9f\\x63\\xaf\\x91\\xfa\\xc8\\x9c\\x66\\x98\\x6b\\x8e\\x21\\x76\\xdd\\x45\\x1d\\x58\\x33\\x94\\xc1\\x90\\x7c\\xba\\x17\\x25\\xf0\\x6d\\x25\\xd1\\xd0\\x91\\x2b\\x3e\\x5c\\x6c\\x7d\\xcd\\x34\\x35\\x8f\\xad\\x59\\xdb\\xc6\\xf6\\xb1\\xc2\\xef\\x33\\xd3\\xca\\x82\\xf4\\x35\\x18\\xfe\\x4f\\xf3\\x13\\x78\\x01\\x6e\\x57\\x8a\\x7b\\xab\\x0b\\x77\\x67\\x6e\\xba\\xe0\\xd4\\x8d\\x08\\x89\\xd6\\x90\\x29\\xd2\\x09\\xf2\\x83\\xce\\x8f\\xe0\\xec\\x23\\xcd\\x83\\x2a\\xdc\\x12\\xa9\\xc3\\xe3\\xae\\xc2\\xd6\\x03\\x66\\x95\\x55\\x6d\\x93\\x13\\xf1\\x2a\\x89\\x9d\\xd5\\x9a\\x66\\xbe\\xf2\\x8e\\xde\\x17\\x5f\\x8a\\xae\\xee\\xb2\\x94\\x2b\\xb9\\x08\\x92\\xa0\\x4b\\x44\\x0d\\x04\\xb6\\x6f\\x5e\\xef\\xf6\\x1a\\xda\\x72\\x79\\x02\\x94\\xce\\x55\\xc8\\x6c\\x6d\\x92\\x78\\x5d\\xdd\\x26\\xc7\\xa7\\x31\\x60\\x3b\\x06\\x9c\\x60\\x3c\\x92\\xe4\\xfe\\x8f\\xf7\\x82\\x54\\x4c\\x8e\\x89\\xb4\\x0b\\x8b\\x55\\xf9\\x0e\\x2a\\x5e\\x9a\\x0f\\x33\\xc7\\xfe\\xc7\\x7d\\xad\\x81\\x52\"},\n{{0x9d,0x5f,0x85,0xd2,0xe7,0xdf,0xd0,0x3b,0xb6,0x89,0xd9,0x00,0x28,0x5f,0xd4,0x46,0x15,0x38,0xa5,0xf2,0x71,0x0a,0x13,0xed,0x21,0xc7,0x75,0xf6,0xef,0xf6,0xb3,0xff,},{0xb8,0x67,0x97,0xe4,0xbe,0x02,0x86,0xae,0x39,0xe4,0x4d,0xf0,0xa0,0x0c,0x01,0x6d,0xb4,0x55,0x5e,0xf8,0x6f,0x2f,0x05,0xd0,0xa3,0xed,0x89,0xd8,0x9a,0x4c,0x3e,0x5e,},{0x17,0x6b,0x95,0x92,0xf8,0xc2,0x51,0x35,0x29,0x2a,0xdd,0x4d,0xaa,0xcc,0x9c,0x4f,0xaa,0x21,0xd4,0xf4,0x9b,0x27,0x84,0x80,0xc4,0xe8,0x88,0x1c,0x01,0x62,0x4d,0xf9,0xa3,0x7e,0x23,0xe1,0x8e,0x84,0xca,0x32,0xd0,0xd8,0xcb,0x85,0x10,0x54,0x22,0x2f,0x10,0xa4,0x95,0x41,0x9f,0x19,0x7e,0x7b,0x3d,0x18,0xdf,0x0a,0xdf,0xb1,0xb3,0x07,},\"\\xf7\\x0b\\x5b\\x05\\x3a\\x46\\x72\\x51\\x2c\\x24\\xb3\\x16\\x83\\x92\\xf6\\xa1\\x7d\\xd7\\x7d\\x86\\x89\\xc2\\x1c\\x86\\xef\\xc2\\x58\\x29\\xa1\\xa0\\x4f\\xab\\x4f\\x76\\xc8\\x52\\x16\\x84\\xd3\\x20\\x10\\x45\\x59\\x07\\xa2\\x69\\x08\\x67\\x7b\\x40\\xdc\\x69\\x47\\xd6\\x54\\xf2\\x91\\x4c\\x30\\xec\\xee\\x72\\x4f\\xa6\\x84\\x46\\xb5\\x9d\\x09\\x1e\\x25\\x8f\\xc8\\x62\\x41\\x1c\\x96\\x4d\\x66\\x8d\\xef\\x83\\x03\\x4b\\x62\\x7e\\xd4\\x16\\xdc\\x19\\x0b\\xb5\\xa2\\x63\\xa6\\xff\\x8d\\x55\\x9e\\x13\\xb8\\x93\\x62\\x25\\xfb\\x4d\\xab\\x4f\\x7b\\xda\\x04\\x68\\xe5\\x47\\xe7\\x08\\xcb\\x04\\xce\\xbe\\x1e\\x5c\\xfc\\x69\\xf7\\x6a\\x1d\\x28\\x3f\\x28\\x16\\x82\\x86\\xf2\\x4e\\xce\\xa5\\x53\\x5e\\x44\\x90\\xa0\\xc5\\x55\\x67\\xa7\\x34\\x5e\\xf9\\x53\\xce\\x42\\x6b\\x20\\x9a\\x3d\\xe3\\xdf\\x59\\x5e\\x80\\xee\\x61\\xe5\\x72\\xa2\\x78\\xab\\x02\\x21\\x95\\x51\\xb7\\x3d\\xa4\\x19\\x84\\x80\\x82\\x85\\xa8\\x35\\x98\\xa0\\x2d\\x9b\\x28\\x67\\x12\\x10\\x00\\x4e\\x31\\xd8\\xaf\\x92\\x42\\xc1\\x6f\\x90\\xd5\\xea\\x8f\\x63\\xa1\\xff\\x66\\xcf\\xe6\\x0e\\xcb\\xe5\\x37\\x24\\x5f\\xa1\\x2a\\x9b\\x15\\x41\\x15\\x29\\x58\\x06\\xea\\x2d\\x11\\xf3\\x67\\x17\\x82\\xb9\\xaf\\x4f\\xa8\\x6a\\x12\\x88\\xe1\\x23\\xcf\\xd2\\x40\\x9a\\x5d\\xc9\\x8f\\x41\\xb8\\xf6\\xdf\\x29\\x9b\\xbc\\xc4\\xbb\\x64\\x47\\xdc\\x03\\xa6\\xd6\\x0e\\x9b\\x2c\\x5b\\x8f\\xfc\\x40\\xd9\\x83\\x95\\x6b\\xe9\\x77\\x68\\xdd\\x06\\x12\\xd4\\x7c\\xbf\\xa7\\x57\\x1c\\x99\\x69\\x85\\x6c\\x15\\x2c\\xd3\\xb4\\x73\\xac\\xe0\\xb8\\xa1\\x44\\xaa\\xc2\\x09\\x5c\\x0f\\x72\\xf1\\xd3\\x14\\x71\\x52\\xb9\\x08\\xef\\x66\\x26\\xd5\\x22\\x28\\x19\\xb2\\x0b\\xb3\\x35\\x0a\\x46\\x45\\x2f\\x67\\x54\\x90\\xc2\\xa8\\x21\\x50\\xee\\xc4\\x0d\\x75\\xb6\\x6a\\x32\\x5d\\x6e\\x92\\x9a\\x90\\x5a\\xde\\x1e\\x31\\x60\\xab\\x95\\x01\\x81\\xef\\xc6\\x6e\\x59\\x23\\x08\\x65\\xd5\\xe5\\x99\\x69\\x8a\\x8a\\x3f\\xf5\\x60\\xc4\\xc6\\x01\\xa7\\xa9\\xa5\\xda\\x3b\\x5d\\x89\\xbc\\xa9\\x3f\\x7c\\xf5\\xbc\\xf5\\xbd\\x5e\\xcf\\xf8\\xf1\\xa1\\x85\\xc8\\x22\\x0e\\x4c\\x77\\x82\\x1e\\x62\\xad\\xf9\\x5a\\x03\\x7f\\x2d\\xf7\\xce\\xf4\\x3a\\x4c\\x60\\xac\\x75\\x80\\x1e\\x9f\\xcc\\xdc\\x5b\\x08\\xee\\xd3\\x28\\xdd\\x93\\x10\\x09\\x04\\x11\\x56\\x45\\xec\\x1e\\xe0\\x85\\xcc\\x77\\x8b\\x0f\\x4e\\x46\\xe1\\x72\\x98\\x98\\x4a\\x70\\x2e\\xce\\xb3\\xe1\\x52\\x83\\xd8\\x20\\x00\\x4f\\x74\\xa0\\x79\\x52\\x0d\\x63\\xa7\\x5f\\xae\\x33\\xec\\x3f\\x4b\\x83\\x64\\x69\\xe1\\xaa\\x99\\xea\\x24\\x4a\\xf1\\xfb\\x08\\xb0\\x0a\\x8c\\x9d\\xfd\\x03\\x30\\x8d\\xfc\\x20\\x23\\x5e\\xa9\\xc8\\x28\\x3f\\x4d\\xa4\\x7c\\xfb\\xcd\\xbd\\x03\\x1a\\x02\\xd1\\x64\\x16\\x0f\\x2a\\x58\\x98\\x67\\x00\\xb1\\x95\\x26\\xd4\\x1e\\x4d\\x7f\\xd4\\x58\\x43\\x4d\\x72\\x64\\xbc\\x8e\\xb6\\x42\\xe6\\xd8\\xdd\\x27\\x59\\xce\\x2b\\x85\\xc9\\x7b\\x37\\x02\\xe7\\x0d\\xa7\\x1f\\x18\\xed\\xc5\\x3e\\x91\\x40\\xa6\\x45\\x62\\x7e\\x02\\x78\\xe8\\xe7\\x05\\x39\\x03\\x74\\x84\\xdc\\xd1\\x8c\\x62\\xfa\\x33\\x07\\x17\\xd6\\x14\\x8a\\x0d\\x62\\x3f\\xf8\\xb6\\x5e\\xa8\\x56\\x7e\\xc7\\xfa\\x04\\xc8\\x92\\xe3\\xa1\\xec\\xee\\x96\\xe8\\x32\\xf4\\x15\\x50\\x74\\xc8\\x3c\\xbc\\x93\\xe9\\x8c\\xc6\\x7f\\x1f\\xa1\\x12\\xaa\\x06\\xe9\\x91\\x5f\\xa4\\xd2\\xde\\xa9\\x31\\x55\\x1e\\x7c\\x62\\x3a\\xa8\\xa3\\xa7\\x61\\x9e\\xa2\\x4f\\xf9\\x14\\xe2\\x64\\xf3\\x1f\\xc7\\x3d\\xfa\\x8c\\x43\\x0a\\xc4\\x6c\\xe1\\x6d\\xc9\\x68\\xc5\\xa4\\x08\\x5d\\x5c\\x38\\x0d\\x30\\xcd\\xc6\\xf4\\x3d\\xee\\x80\\x6f\\x38\\xd1\\xdf\\x42\\x0a\\x06\\x55\\x74\\x14\\x47\\x37\\x05\\x6d\\xaa\\x62\\xf0\\xc0\\x98\\xc9\\xc5\\x2f\\xcc\\x04\\xcc\\xa6\\x42\\xc4\\x5d\\x68\\x73\\x45\\xa0\\x94\\x61\\x3d\\x4a\\x3c\\x6c\\x87\\x88\\xbf\\xa2\\x18\\x53\\x8a\\xd7\\xec\\xe1\\xbd\\xb6\\xc9\\x39\\x24\\xee\\xc4\\xba\\xaa\\x3e\\xb1\\x5d\\xc1\\x49\\x4d\\x65\\xff\\xa1\\xa2\\x3f\\xf8\\xe9\\x85\\x26\\x34\\x08\\xfb\\x02\\xbf\\xe3\\x9a\\x8c\\x55\\xb3\\x00\\xb1\\xa0\\x2e\\xd3\\x6c\\x67\\x14\\xdd\\x5a\\xb7\\x50\\xd4\\x7f\\x02\\x1f\\x65\\xe0\\x8c\\x63\\x5f\\x1d\\x6b\\x7b\\xaf\\x39\\x6c\\xb4\\xf9\\x3d\\x56\\xc1\\xca\\x46\\x1b\\xb1\\x2e\\x94\\xde\\x7e\\x5d\\x98\\x65\\x9a\\x8a\\xf0\\xbf\\x01\\x9f\\xc4\\x22\\x80\\xe1\\x11\\xe0\\x48\\x00\\xff\\x80\\xe0\\xc1\\x57\\x15\\x0e\\x16\\x56\\x09\\x45\\x42\\x81\\xb2\\x00\\x07\\xe3\\xed\\xfa\\xa1\\xea\\x85\\x44\\x65\\x54\\x7a\\x00\\x6a\\x4c\\x32\\x36\\x41\\x14\\x95\\xda\\x16\\x60\\x98\\xaf\\x28\\x23\\xa4\\x59\\xcf\\x10\\x0a\\x1f\\x3c\\x92\\xc6\\x39\\x0c\\x60\\x66\\xcd\\xbf\"},\n{{0x4a,0xaf,0x2d,0x13,0x28,0x84,0xf3,0x0d,0x11,0x27,0xcf,0x18,0x7e,0xe0,0x93,0x88,0xb4,0xa5,0xc4,0x4a,0x9a,0x92,0x67,0xe6,0x72,0x83,0x17,0x39,0x89,0x51,0xfb,0x61,},{0x83,0x72,0x7e,0x92,0x57,0x34,0x91,0x28,0x55,0x9e,0xbf,0x75,0x9f,0xdc,0x82,0x12,0x2c,0xce,0x76,0x74,0x66,0x39,0xc0,0xad,0xa9,0x76,0x1f,0x0d,0x60,0xb9,0x40,0xb1,},{0x5f,0x11,0xdf,0x39,0x06,0xa7,0x12,0xa9,0x53,0xf4,0x7c,0x85,0x98,0x06,0xb5,0x23,0x73,0x58,0xd0,0x8b,0xa9,0x5e,0x49,0xf9,0xe5,0x30,0xa3,0x71,0x65,0x83,0x5e,0x93,0x59,0xd9,0x76,0x9d,0xc2,0x1f,0xbb,0x4d,0x44,0x49,0x7b,0x93,0x90,0x5b,0xca,0x8d,0x99,0x17,0xc7,0x28,0x49,0x3f,0xee,0x3a,0xcd,0x5b,0x52,0x1d,0xbd,0x1e,0x24,0x08,},\"\\xd7\\x3e\\xaf\\x11\\x41\\x3b\\xf4\\xd5\\xbc\\xcf\\x6a\\x2e\\x80\\x9c\\xd6\\x83\\x2a\\x51\\x82\\x3a\\xa2\\x2b\\xd1\\x6e\\x09\\xcf\\x56\\xff\\x04\\x5e\\xef\\x2d\\x1a\\xda\\xdd\\xa5\\x0c\\x2e\\xbd\\x67\\xbb\\xc4\\xd7\\x0e\\x49\\x3c\\x96\\x8c\\xb4\\xde\\x49\\x77\\x06\\x5d\\x44\\x63\\x30\\x06\\x94\\xc9\\xca\\xa5\\x72\\x06\\xd6\\x66\\x46\\x93\\xd8\\x46\\x2c\\x3c\\x57\\x6b\\x52\\x5c\\xc7\\xac\\xf7\\x9f\\x26\\xf9\\x05\\x5a\\x1b\\xcf\\xa7\\xd0\\x77\\xf4\\x5e\\xbe\\x0b\\x2d\\x48\\x1e\\xbd\\x63\\xf7\\x34\\x0a\\x33\\xe4\\xab\\x68\\xf1\\x60\\x49\\x75\\xec\\x1d\\xfe\\xc4\\x5a\\x79\\x1a\\x2a\\xbb\\x10\\x44\\xd7\\x5a\\x4d\\xb5\\x5a\\xdf\\x59\\xb8\\x39\\x4e\\xbd\\xe6\\x82\\x4c\\x21\\x14\\x5b\\x00\\xef\\x3b\\x1b\\x08\\xed\\x11\\xfd\\x51\\xdd\\xa5\\x14\\xed\\x7e\\x21\\xe5\\x4d\\xba\\xf6\\xab\\xb6\\xd9\\xe3\\x17\\xfc\\xf9\\xfd\\x37\\x5b\\x18\\x76\\x4e\\x64\\xac\\x9b\\xe5\\xb0\\x8f\\xec\\x3b\\x78\\xab\\xba\\xb1\\xd1\\x2a\\x2a\\xb0\\x9d\\x55\\x9a\\xcd\\xc7\\x13\\x3f\\xb2\\xe0\\x00\\x8e\\x0c\\x11\\x4b\\x7c\\xad\\xb4\\xbf\\x76\\x30\\x78\\x67\\x4d\\x03\\xe9\\xc8\\x07\\xbe\\xc1\\xe2\\xca\\x71\\xad\\xcd\\xaa\\x31\\x0d\\x58\\x7f\\xa5\\x69\\x50\\xfc\\x0f\\xb2\\xe9\\x79\\x04\\x3d\\x50\\xf9\\xae\\x23\\xfa\\x8f\\x82\\x1c\\xd9\\xd6\\x23\\x27\\x89\\xd0\\xee\\xcc\\xfc\\x4f\\x47\\xe3\\xad\\x80\\x4e\\x25\\xcf\\x5a\\x42\\x5f\\x94\\x37\\x7d\\x17\\x87\\x48\\x33\\xe6\\xae\\x36\\x38\\x17\\x8c\\x78\\xb7\\x95\\x19\\xd6\\x4d\\x97\\x93\\xf4\\x50\\x46\\x06\\xa0\\xea\\xb6\\x87\\x07\\xf6\\xe1\\xf7\\xcc\\xcb\\x51\\x5b\\xe3\\xd1\\x20\\x1b\\xcd\\x19\\xf2\\xf0\\xe2\\x55\\xc7\\x22\\xea\\xb1\\x2b\\x43\\xaf\\xf8\\xc8\\xc5\\x56\\x11\\x25\\xfb\\xca\\x1f\\x65\\x42\\x07\\x6a\\x06\\x15\\x2e\\xb7\\xe4\\xb0\\x78\\x63\\x24\\xc2\\x49\\x5e\\x79\\xd7\\x9c\\x0a\\x8e\\x29\\x5b\\xb2\\xe3\\xdf\\xd0\\x5a\\x90\\x33\\x19\\x00\\x65\\xa2\\x84\\x55\\x2a\\x6e\\x73\\x60\\x06\\xac\\xe4\\x1f\\x97\\xcc\\x43\\x4a\\x25\\x12\\x05\\x1b\\x72\\x7c\\xe5\\xbc\\x9c\\x4a\\x75\\x52\\x9e\\xc5\\x3d\\xd7\\xd1\\xf1\\x26\\xe7\\x93\\x85\\x77\\x47\\xb5\\xba\\x8d\\x03\\x15\\x5d\\x45\\x55\\xf5\\x9e\\x8b\\xaf\\x2f\\x0c\\xdb\\xa8\\x71\\xac\\x16\\x0e\\x75\\x19\\xa8\\x52\\xdb\\x00\\x4f\\x70\\x16\\x41\\xa4\\x0a\\x42\\x2d\\x4c\\x38\\xb6\\xc0\\xc3\\xcc\\x8f\\xbb\\xd0\\x53\\x22\\xdd\\xc0\\x00\\x1f\\xb8\\x67\\x28\\x6e\\x29\\x6c\\xbd\\x69\\x86\\x2c\\xbc\\xcc\\x74\\x47\\x03\\x8e\\xb3\\x0f\\x8a\\x81\\x23\\xb7\\xb3\\x13\\x73\\x98\\x47\\x02\\xc3\\xbe\\x45\\x7a\\x4b\\x8c\\x54\\xe6\\xe5\\x28\\x04\\x85\\xa2\\xc4\\xff\\x84\\x52\\x1f\\x29\\x8d\\xde\\xb3\\xb3\\xb2\\xbc\\x91\\xf1\\x14\\xdd\\xce\\x67\\x03\\x02\\x48\\x04\\x44\\x69\\xdc\\x06\\xf3\\x62\\xf2\\x91\\x9a\\x3f\\xec\\xe5\\x08\\x23\\x75\\xd0\\x40\\x80\\x37\\x6f\\xe2\\x19\\xd9\\xb4\\x57\\x5b\\x1c\\xf1\\xc9\\xec\\x4d\\xca\\xc5\\x74\\x9f\\xc7\\x78\\xf5\\x15\\xdd\\xa1\\x3f\\xa0\\xd5\\x86\\xc2\\x64\\xb9\\xbb\\x61\\x50\\x33\\x10\\x76\\x2c\\x78\\x9c\\xa1\\x16\\x08\\xd2\\xfe\\xe6\\x74\\xc7\\x0a\\xc4\\xfc\\x6d\\x5e\\xbc\\xf6\\x8c\\x4a\\xb8\\x9b\\xd8\\x45\\x55\\xfc\\x00\\x75\\x23\\xc2\\x8a\\x7e\\x1d\\xd0\\x8a\\x98\\x62\\x04\\x4d\\x52\\x45\\xb9\\x1a\\x87\\x78\\xec\\x9e\\xe9\\x84\\xa4\\x1a\\x9e\\x13\\xb7\\xab\\xd6\\x57\\xae\\x2a\\x46\\xae\\x86\\x01\\x52\\xc6\\x44\\xac\\xd9\\x53\\x67\\x67\\x8f\\xf6\\x4c\\xc5\\x40\\x06\\xe3\\x66\\x14\\x80\\x5e\\xd6\\x18\\xa7\\xc6\\xd0\\xfd\\x33\\xa9\\x08\\x52\\x30\\x90\\x84\\x1c\\x23\\x0a\\xf0\\x98\\x46\\xd1\\x32\\xbb\\x4c\\x6b\\x60\\xe2\\x44\\x1f\\x9d\\x3c\\x49\\x87\\x14\\xf4\\x70\\xf6\\xbc\\x03\\xa8\\x0d\\x14\\xa2\\x94\\xb5\\x65\\xd1\\xd5\\xe7\\x81\\xcf\\xfc\\xb1\\x30\\x4e\\xfd\\xbb\\xc7\\xbf\\xea\\xbd\\xed\\xc8\\x57\\xac\\xc4\\x2e\\x27\\x62\\xbb\\xf9\\x7a\\xf8\\x39\\xa1\\x66\\x75\\x2d\\xa2\\x95\\x67\\x28\\x17\\xf1\\x0d\\xbd\\x47\\x2d\\x38\\x1f\\x53\\x16\\x55\\x55\\xac\\x82\\x22\\xa7\\x85\\x35\\xa8\\x68\\x05\\xf1\\xbe\\xd4\\x22\\x88\\x9f\\x20\\x61\\x09\\xaa\\x74\\x77\\x2e\\xdc\\x0b\\xb5\\x1e\\x8a\\x98\\x40\\xcf\\x62\\xc9\\x2f\\xa6\\x35\\xb9\\x0c\\xae\\x07\\x6d\\xd5\\x0e\\x5a\\xed\\x9d\\xea\\xc8\\x43\\xfa\\x8a\\x6b\\x53\\x99\\x88\\x28\\x5f\\xf1\\xad\\xab\\xe4\\xc7\\xb8\\x3d\\x9e\\x29\\xac\\x2d\\x94\\x09\\x2d\\xaa\\xfe\\xc9\\xf6\\x67\\x36\\x89\\xba\\x9e\\x92\\x52\\xd8\\x64\\xd7\\x57\\x7a\\xa8\\x95\\x05\\xd3\\x31\\xfe\\x78\\x09\\x86\\x12\\x77\\x00\\x2a\\x0b\\x44\\xa9\\x6b\\xa6\\xae\\x4a\\x52\\xb3\\x54\\x8b\\xf2\\x68\\xe7\\x77\\x78\\x0c\\x00\\x20\\x9b\\x24\\x5f\\x8b\\x14\\x17\\xee\\x5e\\x70\\x1a\\x12\\x33\\x4a\\xd5\"},\n{{0x4b,0xc7,0xda,0xab,0xc5,0x40,0x7c,0x22,0x6d,0x19,0x20,0xdb,0x4a,0xfd,0x21,0xb2,0xa5,0xb3,0xe5,0x9b,0x8e,0x92,0x46,0x05,0x3f,0x6a,0x1a,0x6a,0xfa,0x54,0xe7,0xe7,},{0xdc,0x53,0x98,0x85,0xfc,0x7b,0xee,0x00,0x2a,0xc5,0xde,0xba,0xe1,0x6b,0xdd,0xbe,0x4b,0x55,0x3f,0xa1,0x5e,0x81,0xee,0x79,0x88,0x76,0x94,0x0f,0x38,0xcf,0xc4,0xc5,},{0xa7,0xa6,0x48,0x88,0x39,0xbb,0xae,0x04,0xde,0xc9,0x2f,0x96,0xd7,0x28,0xc4,0x64,0x68,0x5d,0x7a,0x96,0xdf,0x51,0x2b,0x00,0x51,0x16,0x3d,0x22,0x53,0x8f,0x74,0x54,0x6f,0xa9,0x86,0xb1,0xb6,0x0a,0x6d,0x8c,0xc7,0x66,0xa2,0x6c,0x69,0x84,0xc9,0xcd,0x26,0x88,0x39,0x58,0x98,0xe2,0xb2,0xae,0x72,0xdc,0x6a,0x2d,0x5a,0x9f,0x75,0x0e,},\"\\x6a\\xcc\\xe9\\x98\\x43\\xb2\\x41\\xaf\\xe6\\xed\\xd5\\xd0\\xab\\x78\\xd0\\xfb\\x21\\xc8\\xc3\\x5a\\xff\\x88\\x13\\x89\\xd5\\x05\\xf2\\xf1\\xdd\\x91\\xaf\\x1e\\xb2\\xad\\x22\\x92\\x54\\x92\\x7c\\x7f\\x0e\\xcf\\xb7\\xa8\\x14\\x16\\x90\\x57\\x3a\\x65\\x5d\\x69\\x85\\x3d\\x74\\xd0\\x70\\x8b\\xf8\\xb1\\xe6\\x0a\\x03\\x96\\x30\\x28\\xa6\\x25\\xb7\\x9f\\x3d\\xfe\\xa2\\xb1\\x13\\xff\\xca\\xb4\\x6f\\x3c\\xfd\\x4a\\x62\\x1e\\x8f\\xd8\\xff\\x0a\\x96\\x81\\x43\\xb0\\xae\\x03\\xcc\\xb6\\xf4\\x2e\\x25\\xe2\\xd7\\x4d\\xbf\\x51\\x5b\\xc3\\x58\\x69\\x9b\\x63\\x50\\x09\\xb0\\x1d\\x61\\xfe\\x59\\x7f\\x1d\\xc2\\xc3\\x5a\\x7b\\xa4\\x55\\x52\\x78\\xee\\x0e\\xa4\\x56\\xc7\\xd3\\x5f\\xa8\\x75\\x7a\\x41\\x79\\x24\\xb1\\xd0\\xa8\\x35\\x1f\\x22\\x6a\\x13\\xec\\x29\\xd0\\x25\\xb4\\x26\\x96\\xec\\x1d\\x99\\x25\\xb7\\x69\\xcd\\x59\\xc8\\xe2\\xf9\\xcd\\x3c\\xe4\\xe5\\xc0\\x20\\xe0\\x51\\xe7\\xa3\\x6f\\x3f\\x97\\xc1\\xe8\\xec\\x71\\x97\\x4b\\xc1\\x6a\\xc4\\xde\\x46\\x51\\xad\\x4d\\xf2\\xe9\\xc0\\xee\\xd6\\x86\\x92\\x42\\x24\\xfe\\x6d\\xe6\\xc6\\x0d\\xd4\\xac\\xc2\\x6e\\x0a\\xab\\xd8\\x0c\\x21\\xd5\\x09\\xd9\\x59\\xb8\\x0b\\x43\\x53\\x95\\x8d\\x00\\xe4\\x4c\\x51\\x1d\\x23\\xbc\\xf4\\x45\\x52\\x60\\x8b\\xfa\\x56\\xa9\\xc5\\xae\\x79\\xde\\x62\\xbb\\x23\\xf1\\x1d\\x74\\x0f\\x48\\x24\\x0c\\x27\\xe1\\x01\\x99\\x97\\x51\\xf2\\x53\\x47\\x42\\xc0\\xa6\\x91\\x3f\\xf6\\x4b\\x68\\x3a\\x18\\x99\\x5a\\xbc\\x39\\x3f\\xeb\\x9d\\x57\\xc7\\x1f\\x49\\xa0\\x80\\x55\\x72\\x98\\xcc\\x40\\x5d\\x11\\xb7\\x98\\x8d\\x71\\x16\\x84\\x0c\\x5a\\xda\\xf5\\x3b\\xc6\\x72\\xb4\\x69\\x23\\xcc\\x45\\x7c\\x70\\x39\\x94\\x0a\\xd4\\xd5\\xbf\\x07\\x3c\\x6c\\x88\\x6b\\x13\\x39\\x52\\x59\\x26\\xd2\\x81\\xdb\\xd1\\xa7\\x97\\x39\\xb2\\xe3\\x64\\x14\\xcb\\xd3\\x21\\xb1\\x85\\xfc\\x88\\xf1\\x8d\\x2f\\x81\\xc8\\x09\\x97\\x5b\\xe9\\xa0\\x93\\x64\\x4c\\xc5\\x59\\xed\\x2a\\xe5\\xcc\\x0e\\x35\\xcb\\xdd\\x18\\x11\\xf7\\x02\\x86\\x05\\x7a\\x3f\\x70\\x30\\x67\\xed\\xdd\\xf5\\xeb\\x16\\x90\\xa7\\x42\\x7b\\xb7\\x3f\\xe3\\x02\\x4e\\xd0\\xdb\\x82\\xa5\\xce\\x8f\\x17\\x16\\x42\\x8a\\x76\\xfd\\x29\\x2b\\xa9\\x9a\\x30\\x0c\\x4b\\x2f\\x36\\x0d\\xa2\\x12\\x46\\x17\\x59\\x0b\\x10\\xe3\\xb1\\x62\\xa6\\xe6\\x7d\\xd5\\xd5\\xa5\\x9b\\xcc\\xa1\\x0f\\x61\\x0f\\xa0\\x64\\xaf\\xfd\\x55\\xf8\\x48\\x3b\\x98\\xa6\\x8d\\x07\\x6f\\x27\\x8a\\xbf\\x88\\x8a\\x08\\xa0\\x14\\xe0\\xea\\x49\\x91\\x80\\xfb\\xc7\\x98\\x40\\xce\\xed\\x13\\xcc\\x6b\\x24\\x58\\xbf\\xab\\x9b\\x0d\\xd7\\xae\\x9d\\x86\\x46\\x1f\\xe2\\x15\\xe7\\xc9\\xf6\\x3f\\x76\\x8c\\xee\\x4a\\x88\\x2d\\xf0\\xdd\\x84\\xe3\\xeb\\x4f\\x2d\\x7f\\x6b\\x18\\xfa\\x57\\xd8\\xbc\\x7d\\x9a\\xfb\\x63\\xc2\\x1a\\xc4\\x65\\xe7\\x90\\x3b\\x9b\\xfb\\x86\\x38\\xa2\\x93\\x61\\xf7\\xeb\\xfc\\x6e\\x54\\xe5\\x46\\x5a\\x6c\\xef\\x46\\x3a\\xe2\\x26\\x43\\xae\\x41\\x02\\x58\\x77\\x9c\\xa7\\x4b\\x70\\x40\\x1a\\x94\\x55\\xa4\\xd1\\x57\\xd7\\x4a\\x70\\x29\\xef\\xe6\\xb5\\x19\\xa8\\xc4\\xbe\\x69\\x67\\x56\\xe0\\x45\\xae\\x40\\x81\\xb7\\x7d\\xd6\\x03\\x1f\\x0d\\x25\\x0f\\xa7\\x61\\xe6\\x0f\\x85\\x9d\\x90\\x63\\xfc\\x10\\x5a\\xa0\\xa1\\xa7\\x45\\x0a\\xf1\\x53\\xe7\\x05\\x47\\x77\\x77\\xc4\\x42\\x58\\x6d\\xf4\\x07\\x40\\x2b\\xa2\\x38\\x75\\x2f\\xae\\xf7\\x4f\\x33\\x45\\xc2\\x6a\\x45\\x33\\xbe\\x9a\\x61\\xf5\\xfc\\x6b\\xde\\x48\\xe3\\xcb\\xa7\\x5c\\x04\\xd6\\xf7\\xb3\\x33\\xe3\\x70\\x06\\xdd\\x0c\\x94\\xfd\\x3b\\x6a\\x13\\x0b\\xd6\\xfc\\xdb\\x3c\\x6a\\xbe\\x21\\xca\\x60\\xeb\\x43\\x1c\\xc2\\xd8\\xa2\\xec\\xe7\\x16\\x9d\\x2d\\xcf\\xce\\x27\\x60\\x82\\x56\\x57\\xfd\\x4c\\x26\\xf3\\xc3\\xb8\\x30\\xac\\xdf\\xd5\\x08\\x01\\x1d\\x14\\x76\\x4b\\x3b\\xe9\\x17\\x15\\x57\\x1a\\x31\\x83\\x01\\x8e\\x0d\\x22\\x1f\\xb9\\x53\\x2b\\xb2\\xe1\\x71\\x1e\\x72\\x5a\\x27\\x3a\\xe0\\xcc\\x2f\\xac\\xcb\\xa7\\xd5\\x50\\x49\\x29\\x45\\x9c\\x99\\x25\\x17\\xb0\\x5c\\x1d\\xdd\\x03\\xaa\\xcc\\xd9\\x37\\xb8\\x6e\\xb6\\x7b\\xc8\\x20\\x2d\\x01\\xca\\xb3\\xd4\\x89\\x58\\x6e\\xea\\x1a\\xcc\\xa7\\xdc\\x20\\xcd\\x0b\\x64\\x75\\xc2\\x58\\xff\\x67\\x36\\x61\\x49\\x6a\\x22\\xea\\x96\\xb8\\x9d\\xb4\\xbf\\x3f\\xca\\xae\\x3b\\xb0\\x4f\\x67\\xdb\\x09\\x6a\\x47\\xff\\x7e\\x1e\\xe2\\x39\\x56\\x2d\\xc1\\x0d\\x40\\xf0\\x53\\x94\\x4f\\x3d\\x7b\\xcc\\x3f\\xf4\\xc0\\xff\\x76\\x56\\x54\\xba\\x5e\\xa6\\x4f\\x0e\\xa6\\x3e\\x45\\xa2\\x1d\\x9b\\x12\\x94\\x9f\\x14\\xf7\\xea\\x70\\x74\\xe9\\xb6\\x59\\xc5\\xc5\\xd4\\x48\\x16\\x84\\x2d\\xe8\\x96\\x98\\xa8\\xfc\\xca\\xce\\x43\\xeb\\x6b\\x41\\x35\\xe0\\xb3\\x33\\xac\"},\n{{0xf2,0x6a,0xf2,0x10,0xe3,0xb2,0x01,0x73,0x99,0x0c,0x77,0x45,0x92,0x2c,0xdf,0x94,0x24,0x77,0x3a,0xbb,0x37,0x4d,0x77,0x7a,0x51,0x2c,0xf5,0xb9,0x7b,0x3a,0x00,0x0d,},{0x54,0x58,0x6a,0xbf,0x04,0x11,0x76,0xe0,0x6a,0xec,0x5b,0x60,0x10,0xe1,0x90,0x91,0x6d,0xa5,0x4a,0x8c,0x4b,0xde,0x28,0x8c,0xf2,0x4d,0x8c,0x10,0x7c,0xb3,0xb7,0x30,},{0xce,0x45,0x45,0x30,0xb9,0x22,0xba,0x5e,0xa1,0x62,0xf1,0xa4,0x52,0xe0,0x5c,0x00,0x36,0x3a,0x49,0xa9,0xdb,0x8a,0x56,0x94,0x97,0xc0,0x0c,0xaf,0x1c,0xbe,0xa9,0x91,0x80,0x77,0x05,0x54,0xed,0x4e,0x31,0x40,0xdf,0xca,0x45,0x55,0x15,0x9e,0xbf,0x48,0xef,0x5d,0x2a,0x50,0xf3,0x94,0xae,0xbd,0x78,0x21,0x16,0xed,0x65,0x69,0xa4,0x09,},\"\\x88\\xe2\\x6d\\xa3\\x5c\\x54\\x88\\x4b\\x47\\x14\\x6f\\x4e\\x3f\\x01\\x4a\\xb6\\x5b\\x3d\\x71\\xaa\\x7e\\x3c\\x33\\x91\\xad\\xbe\\xb1\\x9e\\xf2\\xe7\\xb9\\x30\\x2e\\x28\\x19\\x91\\xb2\\x61\\xb6\\xa0\\x99\\x2e\\x2e\\x89\\xa4\\x9f\\x48\\x0c\\xa2\\xd8\\xe6\\x84\\xb1\\x2f\\x9b\\x15\\x09\\xb3\\x8f\\x6a\\x7a\\x98\\xa5\\xdd\\xb4\\xc2\\xd8\\x69\\xfd\\x03\\x18\\xe9\\x8e\\xcd\\x8f\\xd9\\xdf\\x49\\x1b\\xaf\\x99\\xa9\\x29\\x4d\\xe4\\x9e\\x1c\\xf8\\xdd\\x41\\xee\\x85\\x73\\x0a\\xf0\\x25\\xa7\\x01\\x14\\x3e\\x4f\\x0c\\x8e\\x3d\\x92\\xd5\\x5b\\x59\\xca\\x7d\\x4a\\x6c\\x89\\xad\\x76\\x0d\\xff\\xc0\\xc2\\x18\\x92\\x09\\x50\\x8e\\xf6\\xc2\\x21\\x4e\\xdf\\x99\\x67\\xb1\\x7d\\xef\\x12\\x3d\\x86\\x92\\xc9\\xe4\\xe2\\x0b\\x1e\\x98\\x26\\x88\\x08\\x70\\x4f\\x5f\\x9f\\xe1\\xa6\\xd6\\x05\\x5e\\x32\\xc8\\x72\\x56\\x4b\\xd1\\x7e\\xdb\\x73\\x59\\x57\\x86\\x29\\x01\\x7f\\x0c\\x30\\xfe\\xab\\x8b\\x50\\x4e\\x22\\x89\\x23\\xad\\xc7\\xe8\\x1a\\xe2\\x0a\\x85\\x2d\\xb0\\xad\\x67\\x6a\\x78\\xe0\\x81\\x33\\x6d\\x6b\\x04\\x02\\xf9\\xcd\\xc5\\xd5\\xe9\\x01\\x28\\xca\\x94\\x5d\\x10\\x51\\x5c\\xa0\\xc5\\xef\\x03\\xf7\\x31\\xb1\\xd4\\x0a\\x71\\x07\\x41\\xd4\\x1c\\x1d\\xd1\\xca\\x16\\xb1\\x06\\x0f\\xeb\\xf2\\xa0\\x53\\x2e\\x6f\\x5d\\x76\\x51\\xef\\x44\\x63\\x75\\xec\\x18\\x09\\x0c\\xb8\\x41\\x8b\\x82\\x02\\xf2\\x5a\\x03\\x89\\x03\\x1b\\x30\\x7f\\x22\\x3c\\x5b\\x5f\\x6a\\xfe\\x36\\xa9\\xad\\xc1\\x06\\x8f\\x2c\\x6e\\x0e\\xa5\\xb2\\xb6\\xcf\\xeb\\x8d\\xc0\\x04\\xf7\\xb8\\x29\\xc8\\x04\\x39\\x06\\x9b\\x81\\xa7\\xbd\\x90\\x74\\x77\\xc6\\x13\\x5e\\xf2\\x82\\xb7\\x71\\xf1\\x41\\xdb\\xe7\\x5a\\x0f\\xa0\\x56\\xe0\\x6b\\x8a\\x1a\\x1f\\x98\\xc2\\x5f\\xa5\\x4d\\x14\\xc8\\xfd\\xb4\\x2d\\x65\\x02\\x59\\x5c\\x59\\xd2\\x5b\\xac\\xf1\\xa1\\x9a\\xde\\xfc\\xc1\\x31\\x70\\xf7\\xa4\\x31\\x7b\\x6a\\xb6\\x10\\xb6\\x09\\xd4\\x14\\xb0\\x07\\x3e\\xa0\\x4a\\xc2\\x9e\\xb1\\x0e\\xe7\\x3c\\xd7\\x1a\\x4c\\xa6\\x04\\x09\\xf8\\xe7\\x60\\xe6\\x0f\\x93\\x95\\x10\\x10\\x0d\\x0c\\x8c\\xd7\\x6f\\x26\\x4b\\xb3\\x78\\x11\\xf9\\x7a\\xa5\\x29\\x9a\\xc0\\xb1\\x2d\\x41\\x68\\xff\\x38\\xec\\xdf\\xa8\\x0b\\x1e\\x5c\\x1b\\x3b\\xbd\\x4d\\x40\\xd3\\x54\\x47\\x35\\xdf\\x71\\x67\\xeb\\x15\\x8a\\x9a\\x9a\\x23\\x4d\\x44\\x5f\\x1d\\x66\\x3d\\xed\\x71\\x71\\xed\\xc6\\x8d\\x17\\x2c\\x92\\x21\\x4b\\x82\\xef\\x13\\xfe\\x6b\\x8c\\x43\\xaa\\x89\\xb7\\x39\\xb4\\x99\\x0a\\xe9\\x47\\xa3\\x4f\\x02\\x0a\\x8d\\x89\\x43\\xb0\\xf7\\xa5\\xd6\\x1d\\xfa\\x76\\xad\\xde\\x02\\x72\\xe9\\x8c\\x11\\x59\\xc0\\xfd\\x8a\\x1d\\xe3\\x3f\\x2c\\xef\\x8e\\xdd\\x32\\x85\\x7b\\x21\\x89\\xed\\x96\\x12\\x80\\x57\\xeb\\xde\\xa8\\x1f\\x7a\\x3a\\x3d\\xff\\xe1\\x89\\x3b\\x5b\\xa8\\x77\\x55\\x6c\\x90\\x38\\x3f\\xa2\\xc5\\xa6\\xfd\\x68\\x0e\\x8a\\x67\\xde\\xe4\\x80\\x2d\\x90\\xdf\\xe9\\x71\\x62\\x3a\\x7b\\xe2\\x2a\\xb3\\xca\\x56\\x06\\x7b\\x1e\\x5c\\x69\\x4a\\xa8\\x4c\\x19\\xf1\\x6d\\x69\\xe2\\x84\\xdd\\xfa\\x03\\x9c\\x10\\x8d\\x04\\x35\\x81\\x38\\x12\\x39\\x0d\\x8e\\xbc\\x1e\\x50\\x13\\x81\\x76\\xf2\\x59\\xdc\\x0f\\x26\\xbc\\xa1\\x3b\\xc9\\x43\\xf5\\x0d\\x5a\\x35\\x00\\xb1\\x8d\\x59\\x35\\x74\\xc6\\x20\\xfc\\x09\\x7a\\xce\\x43\\x0f\\xb8\\x07\\x28\\xd3\\xa1\\xaa\\x64\\x4e\\x50\\x4b\\x10\\x09\\xad\\x67\\x53\\x6c\\xeb\\x01\\x1f\\x2a\\x35\\x7d\\xbd\\x00\\x9e\\x4a\\x63\\xf5\\x24\\xd5\\xb5\\x95\\x7f\\x33\\x15\\x67\\xc5\\xb4\\xd1\\x85\\xa6\\x1d\\xf2\\x2d\\x70\\x71\\xd3\\x1a\\xe9\\x21\\x41\\xe1\\x99\\xc1\\x22\\x89\\x51\\x5a\\xed\\x80\\xc9\\x10\\x21\\x45\\x6b\\xcd\\x45\\xcc\\xc6\\x34\\x03\\x7d\\xcf\\x69\\xb4\\x1d\\x6b\\x1f\\xf5\\x34\\x71\\x01\\x0d\\x99\\xf1\\x87\\xf0\\x46\\x54\\xf4\\x36\\x22\\x28\\x78\\x71\\xfe\\xe6\\xdc\\xf5\\xf3\\x02\\x3c\\xbd\\x09\\x13\\xd9\\x9a\\xff\\x43\\xfa\\x95\\xb3\\x2e\\xa2\\xb1\\x33\\xb4\\xc9\\xac\\x4b\\x01\\x7b\\x7c\\xf8\\xf9\\xbe\\x50\\x86\\xfe\\x92\\xb4\\x2c\\xb8\\xdb\\xed\\x5b\\x63\\x0b\\xf0\\x97\\xc1\\x8e\\x2e\\x55\\xc3\\xdd\\x93\\x27\\x1e\\x09\\xc2\\xd1\\xcc\\x6a\\xf8\\x7d\\x83\\xfd\\xef\\x3c\\x3e\\x3c\\x4c\\xba\\xfb\\xea\\x9b\\x60\\xfd\\x5e\\x9c\\xf0\\x01\\x1d\\xe2\\xe9\\xe2\\x6f\\xbf\\x09\\xaf\\xee\\xf5\\xc6\\x98\\x02\\xa6\\xc4\\x6b\\xdf\\x54\\xc1\\x45\\x86\\x29\\x44\\x17\\x3e\\x01\\x7e\\x30\\x14\\x9e\\xa5\\xc0\\x3c\\x7a\\xef\\xa2\\x8a\\x9c\\xac\\x77\\x67\\x00\\x2e\\xa3\\xfe\\xfb\\xde\\xae\\x5b\\xae\\x00\\x5c\\x37\\x0d\\xbc\\x06\\x42\\x44\\xd5\\xb9\\xbe\\x55\\x00\\xa3\\x57\\x26\\xa9\\x9b\\xc9\\xe8\\xc2\\x75\\x2d\\x51\\x0e\\x13\\x9a\\xf2\\x25\\x58\\x00\\x98\\xc8\\x18\\x9a\\xa9\\xc5\\x20\"},\n{{0x39,0xbf,0xfe,0x00,0x7f,0x8d,0xf7,0xce,0x4e,0x56,0xfd,0x17,0x6b,0x10,0x2b,0x92,0x3b,0xa4,0x8a,0xeb,0x82,0x69,0xfd,0x0c,0xd5,0x20,0xc2,0x3a,0x7b,0x23,0x6e,0x6c,},{0x95,0x32,0x63,0x68,0x00,0x01,0x0b,0x3d,0xd4,0x01,0x2e,0x34,0x1f,0xca,0xd6,0xd2,0x9a,0xfa,0xd4,0x84,0xe6,0xfd,0x73,0x6e,0x89,0xd5,0xbc,0x02,0xba,0x0a,0xc8,0x53,},{0xa2,0x7c,0xca,0x4b,0x9f,0x5b,0x95,0xad,0x0e,0x44,0xe4,0x74,0x0c,0x15,0xde,0xae,0xb9,0x3f,0x22,0xa9,0xb2,0x54,0xeb,0xbd,0x23,0x29,0x36,0x5a,0x00,0x96,0x6c,0x9f,0x4e,0xc1,0xe5,0x5c,0x58,0x94,0xe7,0xbf,0xc2,0x3d,0x39,0x8d,0x39,0x70,0xb9,0x46,0x5e,0x98,0xa8,0xd2,0x3e,0x72,0xda,0xe8,0xe3,0x50,0xda,0x35,0x31,0xae,0x69,0x08,},\"\\x7a\\x8c\\x20\\xbf\\x2e\\xff\\x69\\xaf\\x8b\\xad\\x6b\\xdf\\xab\\xc7\\x90\\x9c\\x58\\xce\\x74\\x6c\\xc4\\xdf\\x78\\xb6\\x9b\\x33\\xc1\\x05\\xba\\x3b\\xd8\\xda\\x75\\x24\\x47\\x58\\xb5\\x17\\x2d\\x5c\\x45\\x01\\xbc\\x39\\x97\\x01\\x85\\xee\\x3d\\x43\\x70\\x83\\xa9\\x95\\x9f\\x81\\xe7\\x66\\x5b\\x82\\x9a\\x69\\xa5\\xd7\\x2e\\x03\\x4d\\x35\\x1a\\xdd\\xdc\\xeb\\x3d\\x3f\\xff\\x58\\x99\\x88\\xdf\\x18\\x2b\\x46\\xfa\\x53\\xd2\\x6e\\x7c\\x9e\\xac\\x06\\x22\\x15\\x78\\x8f\\x23\\x37\\xbf\\x90\\xf0\\x17\\x7d\\x8c\\xa7\\x44\\xf9\\x5f\\x28\\xfe\\xa8\\x54\\x59\\x3c\\x43\\x62\\xc8\\x2e\\x9d\\xed\\x19\\xb9\\x04\\xff\\x99\\xd2\\xbe\\xa8\\x24\\x32\\x82\\x2e\\x52\\xc3\\xda\\x6d\\x46\\x2d\\xa7\\x54\\xff\\x1f\\x8b\\xd1\\x09\\x94\\x2d\\xf5\\x1d\\xba\\x25\\xb7\\xcd\\xe8\\x38\\xd5\\xf5\\x24\\x23\\x9f\\x13\\x31\\xf4\\x63\\x19\\x4e\\x10\\xff\\x56\\x79\\x5b\\x29\\x68\\x78\\xfe\\xb1\\xf5\\x5d\\x43\\xec\\x7d\\xaf\\x0c\\xa5\\xab\\x3d\\x68\\x4b\\x55\\xbb\\x0a\\xa4\\xc7\\x20\\xd4\\xb5\\xc2\\xe8\\x30\\xc8\\x58\\x69\\x4d\\x3d\\x0f\\xdb\\xaa\\xd0\\xbf\\x67\\xd8\\x73\\x18\\x2d\\x95\\xb2\\x41\\x2f\\xce\\x5e\\x7b\\x00\\xfa\\x6b\\xfc\\x38\\xb1\\x32\\xef\\xb9\\x6f\\x87\\xbc\\x6c\\x10\\x07\\x0a\\x57\\x16\\xec\\x9b\\x33\\xa2\\x69\\x2c\\xdf\\x5b\\xc4\\x1c\\x7f\\x73\\x7e\\x28\\xc4\\x22\\x03\\x17\\xa4\\x89\\xb7\\x32\\x3d\\x5e\\x20\\xf6\\x5d\\x37\\x5d\\x76\\x9f\\x9e\\x79\\x37\\x6f\\xd0\\x2d\\x85\\x36\\x86\\x71\\xe7\\xe0\\x81\\xeb\\x75\\x3f\\x88\\x85\\x45\\xeb\\xe5\\xc0\\x00\\xb2\\xf8\\x01\\x43\\xeb\\x35\\x8d\\x43\\x18\\x5e\\x2f\\x1c\\x29\\x4b\\x9f\\x29\\xc8\\xbb\\x91\\x48\\x2d\\x43\\x87\\x49\\x4a\\xad\\x17\\x6d\\xeb\\x85\\x54\\x0f\\xd0\\x05\\xc9\\x7d\\x13\\xe6\\x66\\x3f\\x09\\x94\\x4e\\xb4\\x3a\\x46\\xe6\\x23\\x67\\x94\\xbf\\x6e\\x21\\xf8\\x1d\\x0a\\x42\\x09\\x0f\\x9c\\xce\\xf9\\x0a\\x6c\\x48\\x07\\xb5\\xff\\x54\\x13\\x00\\xe5\\x93\\x48\\x81\\xa8\\xd9\\x21\\x96\\xb4\\xce\\xe8\\x5d\\x28\\x09\\x2a\\x82\\x8e\\xa3\\xbf\\xc6\\xb7\\x45\\xad\\x21\\x9b\\xe9\\xf5\\xe9\\x57\\x41\\x17\\xd0\\x79\\xe0\\x2f\\x4b\\x74\\x8e\\x2c\\xc0\\x1a\\x32\\x82\\x6a\\x37\\x08\\x23\\x19\\x14\\xd2\\x77\\x2c\\x76\\x41\\x19\\xfd\\x99\\xd5\\x3a\\xb5\\xb5\\xa2\\xe9\\xd8\\x91\\xa4\\x8a\\x9a\\xaa\\xac\\xc2\\x63\\x38\\xb1\\x82\\x48\\xdb\\x8a\\xb2\\xd5\\x25\\xda\\xf1\\x5f\\xf5\\x3a\\xcb\\xc3\\xaa\\x98\\xd4\\xf2\\xd4\\xa3\\x37\\xbb\\xaf\\x6d\\x1b\\xe2\\x19\\x85\\xa4\\xaf\\x60\\x0e\\x29\\xbb\\xb4\\x2c\\x8d\\x89\\xe6\\xb3\\x89\\xc6\\x6f\\x42\\x27\\x0c\\x3a\\x0b\\x05\\x1b\\xdb\\x62\\x38\\x81\\xe0\\x2f\\x2f\\x42\\x94\\xce\\xc3\\x47\\x63\\x86\\x74\\x7a\\xba\\xe6\\xc7\\x70\\x0b\\x8f\\x9b\\x03\\x87\\xcd\\xdf\\xb7\\x36\\x68\\xfb\\x57\\x69\\x3d\\x84\\x74\\x19\\x6b\\x33\\xab\\xd1\\x2d\\xce\\x59\\xa5\\x7c\\xf7\\x2e\\xe6\\xcc\\x1d\\xdb\\xaa\\xdf\\xb1\\x9e\\x90\\xaf\\x81\\x31\\xb3\\xa9\\x0f\\x98\\x67\\xf4\\xc7\\xe1\\x5b\\xdf\\x9e\\x21\\x84\\x77\\x01\\x6b\\xd0\\xad\\x3b\\xe8\\xdd\\x05\\x96\\x71\\xff\\x65\\x6c\\xbd\\x4e\\xd8\\x98\\x08\\x6d\\xe4\\xd4\\x23\\xf3\\xdf\\xb2\\x70\\xbb\\xf1\\x9d\\x9f\\x53\\xf7\\xf6\\xf2\\xd2\\x2c\\x6a\\xc9\\x02\\x5c\\xba\\xdb\\xa4\\x42\\xe3\\x1d\\x98\\x11\\xe3\\x7e\\x84\\x7d\\xbd\\x48\\x4d\\x80\\xcf\\x74\\x30\\x39\\xff\\xa7\\x04\\x84\\x70\\xfb\\xdc\\x60\\x80\\xf6\\xd3\\x81\\xdc\\x7e\\x3f\\xa2\\x71\\x22\\xdf\\x53\\xcc\\x06\\x39\\x4e\\xa6\\xfc\\x44\\x6e\\x1b\\xa7\\x25\\x38\\x73\\x3e\\xd3\\xab\\xb6\\x85\\xf1\\x6d\\xfd\\x5c\\xcf\\x58\\x5a\\xe8\\xfb\\xf9\\x95\\x4b\\x50\\xf1\\x0b\\x7e\\x54\\x32\\xa2\\x2b\\x36\\x94\\x06\\xa9\\xb7\\x08\\x89\\x61\\xf0\\xae\\x20\\x74\\x95\\xae\\x71\\x85\\x39\\x6d\\xcc\\xf2\\x92\\xdc\\x46\\x3f\\x41\\xf3\\x76\\xa1\\xca\\x89\\xee\\xfb\\xae\\x19\\x26\\x91\\x52\\x03\\x1b\\xfd\\x81\\x52\\x88\\xe8\\xb5\\xba\\xf3\\x48\\xc4\\xf8\\xff\\x3d\\xff\\x4f\\xd6\\xd1\\x08\\xf8\\x71\\xda\\xa3\\x52\\x11\\x0f\\xa6\\x41\\x88\\xb0\\x1b\\x85\\x26\\xa8\\x45\\xaa\\xed\\x13\\x3e\\x45\\x6b\\x4c\\x83\\xc4\\xfd\\x4b\\xbb\\x16\\x5b\\x40\\x90\\x30\\x7e\\x8e\\xb1\\x7d\\xf1\\x76\\xc3\\x22\\x52\\x0f\\x37\\x59\\x9c\\x21\\x05\\xaa\\x81\\x20\\x75\\x83\\x94\\xa4\\x22\\x24\\x73\\x47\\x67\\x64\\xcf\\x0a\\xf7\\xc5\\x51\\x83\\xeb\\xa9\\x68\\x3d\\x72\\x70\\x63\\x14\\x43\\xf3\\xc5\\x1f\\xb8\\xab\\x0c\\x13\\x0a\\xc4\\x36\\xab\\x60\\x3f\\xf4\\xf1\\xd8\\x65\\x6c\\xdb\\xed\\x22\\x9a\\x20\\x2b\\x40\\x00\\x8e\\xa1\\x0b\\x17\\x15\\x42\\xf7\\x4a\\x70\\xb7\\xbb\\xac\\xc4\\x01\\x6b\\x7f\\x63\\x6a\\xa8\\x96\\x33\\xb7\\x66\\x80\\x58\\xf1\\x33\\x12\\xf5\\x7c\\x51\\x62\\xd1\\x8e\\x39\\x9e\"},\n{{0x3c,0x40,0x80,0xcd,0xa0,0xfc,0x3c,0x03,0xb6,0x14,0xd9,0x80,0xf2,0xff,0x83,0x1f,0x5b,0xe0,0xe7,0xa9,0x81,0xd5,0x38,0x1a,0x16,0x18,0xe0,0xb8,0xfd,0x00,0x17,0x76,},{0xf1,0xc3,0x26,0x9d,0x87,0x04,0x02,0xca,0xa4,0x38,0x82,0x13,0x5d,0x9d,0xba,0xdb,0xbb,0x16,0x2d,0xfc,0xa0,0xb3,0xda,0xd1,0x97,0xe6,0xb8,0xa7,0xee,0x67,0x9a,0x70,},{0xc9,0xd4,0xa4,0x72,0x8b,0x8f,0xdd,0x24,0x0d,0x9c,0x49,0x8a,0xa3,0x5d,0xe9,0x5a,0x4b,0xbd,0x51,0x78,0x5b,0x73,0xc8,0x40,0x3f,0xdf,0x04,0x0d,0xfa,0xed,0x94,0x47,0xef,0xad,0x00,0x69,0xb6,0x7c,0x78,0x3d,0x4b,0x81,0xd9,0x66,0xbe,0xf6,0xe3,0xd9,0xa8,0x08,0xa0,0x58,0x4b,0x98,0xec,0x2b,0x18,0x32,0x2c,0x4c,0x92,0x0e,0xb0,0x0a,},\"\\x0c\\xee\\xbc\\x0e\\x8a\\x47\\x72\\x0f\\x25\\x83\\x5e\\x2b\\x9a\\xcf\\x89\\x1b\\xcc\\xa4\\xbd\\xa3\\x86\\x37\\xf3\\x63\\x27\\x44\\x58\\xba\\xa9\\xe2\\xbb\\xaf\\xed\\xd0\\x93\\x8f\\x56\\x88\\x73\\x4e\\x22\\xac\\x50\\xfb\\x12\\x0f\\x66\\x5f\\x6c\\x4c\\x61\\xc6\\x53\\x17\\x39\\xb9\\x29\\xac\\x83\\xcd\\x77\\xf8\\x96\\x3b\\x75\\x44\\x88\\xb9\\xb8\\x59\\xc1\\x38\\x53\\x63\\x7c\\xf0\\x25\\xc1\\x4e\\x8f\\xdd\\x11\\x8f\\xaa\\x14\\xcf\\x39\\x30\\xce\\xb3\\x5f\\x10\\x4d\\x95\\x44\\x1e\\x56\\x48\\x94\\x40\\xf6\\x20\\x41\\xef\\x1a\\xa7\\xc4\\xb0\\x8b\\x28\\x07\\xe3\\x2b\\xb9\\x58\\x4b\\x90\\x04\\xd7\\x6e\\x76\\x53\\x33\\x48\\x50\\x6d\\x64\\xf1\\x12\\xe1\\xff\\x6f\\x93\\x8f\\x64\\x22\\x30\\xbf\\x38\\xaf\\x01\\x0e\\x41\\x98\\x72\\x70\\x24\\x8b\\x13\\x63\\x5a\\x35\\x67\\xb3\\x55\\xbb\\xa5\\xb5\\x74\\x48\\xc6\\xd1\\x3b\\x74\\xf3\\xbe\\xbf\\x61\\x79\\x15\\x82\\x10\\x28\\xfc\\xa5\\xde\\xfa\\x4c\\xe5\\x42\\x4c\\xa1\\x91\\xcd\\x54\\xa2\\x29\\x44\\xa3\\xd9\\x40\\xe4\\xee\\x2e\\x2b\\xa5\\xd5\\x04\\xc8\\x5f\\x95\\x9b\\x51\\x4c\\x4f\\xab\\x41\\xcc\\xb5\\x74\\x3d\\x9c\\xb2\\xf9\\xbf\\x33\\xd1\\xd8\\xc2\\xa5\\x86\\x9e\\x9f\\x46\\x60\\xc3\\xfb\\x22\\x4b\\x39\\x14\\x1e\\x31\\x10\\xc9\\xee\\x8a\\xeb\\x87\\x1e\\x14\\xc6\\x2c\\x6b\\xe3\\x8f\\xb9\\xa4\\x56\\x8d\\x73\\x68\\x10\\xbb\\x9d\\x20\\x73\\x17\\x8b\\x6c\\x7e\\x87\\xe3\\x58\\x2e\\xfc\\x62\\xb5\\x3c\\x23\\xc5\\xd4\\x65\\x20\\xba\\x33\\xff\\xb3\\xa9\\xca\\x64\\x9e\\xf2\\x6f\\xe7\\x4a\\x3c\\xff\\x61\\x88\\x42\\x73\\x26\\xb8\\xc9\\x6f\\x74\\x35\\x4c\\xb3\\xec\\xaa\\x61\\x1b\\x12\\xcd\\xed\\x56\\x5e\\x59\\xfe\\x1f\\x8f\\x40\\x00\\x97\\xe9\\x3e\\xa8\\x59\\x51\\xb5\\xb4\\xe9\\x00\\x9e\\xea\\x7d\\xb9\\x37\\xe4\\x34\\x9c\\x4e\\x5e\\x00\\xc4\\x45\\x6c\\x6c\\x5f\\x4e\\x57\\x41\\x1b\\xaf\\x4e\\x46\\xe7\\x00\\xac\\x40\\x02\\x57\\x76\\x5f\\x48\\xda\\xb0\\x3e\\x43\\x9f\\x76\\xc1\\x49\\x9b\\x51\\x08\\x04\\x7c\\x83\\x01\\x09\\xdc\\xe7\\xf7\\x40\\xd1\\x39\\x37\\x87\\xe2\\x9d\\x37\\x16\\xd3\\xc4\\x7e\\x75\\x5c\\xb8\\x28\\xe7\\xd4\\x40\\xa9\\x71\\x97\\x51\\x97\\xeb\\xdb\\x3f\\x9b\\x73\\x7b\\xa1\\x1f\\x7f\\xd0\\x38\\x6a\\x95\\x92\\x49\\x01\\x7d\\xe7\\x23\\x4d\\x5e\\x5a\\x9b\\x47\\x3b\\xb9\\x58\\x3a\\x37\\x42\\xc7\\x74\\xee\\x55\\x2a\\x12\\xa1\\xf3\\x6e\\xb3\\xf2\\x6c\\x88\\x5b\\xed\\x22\\xe9\\x1c\\x74\\xcf\\x32\\xa8\\xdd\\x3e\\xdb\\x08\\xb6\\x74\\xbf\\x38\\x6e\\xf4\\x27\\x72\\x79\\x12\\xd5\\x7c\\x5f\\xaf\\xaa\\x1c\\xfe\\xb7\\x40\\xcd\\x52\\xb9\\xde\\xe9\\x95\\xe3\\xd0\\x16\\x1c\\xd9\\x21\\x3f\\x38\\xfd\\x68\\x1d\\x53\\x8a\\xb8\\xbf\\x97\\xb7\\x45\\xf5\\x49\\x80\\x03\\x0e\\xf8\\xb7\\x26\\x96\\xd4\\xe2\\x74\\x73\\xfb\\x0f\\x1a\\xcd\\x5d\\x0a\\xae\\x02\\x97\\x21\\x16\\x80\\xea\\x0f\\xc5\\x9d\\x7b\\x6d\\x51\\xc6\\x32\\x92\\x58\\x5a\\x1d\\x55\\x3d\\x0c\\x89\\x54\\xb4\\x2a\\x4b\\xd6\\xfc\\xd3\\xa4\\x95\\x75\\xbf\\x5c\\x88\\x95\\x3f\\x1f\\x4e\\xa7\\xfe\\x0e\\xd7\\xa5\\x79\\xd1\\x69\\x7e\\x64\\x5e\\x2a\\x61\\xc6\\x9d\\x1a\\x56\\xbc\\x60\\x5b\\xb0\\x40\\x60\\xa2\\x77\\x8d\\x50\\x9a\\x8a\\xad\\xbf\\x35\\xd9\\x46\\x97\\xcc\\xee\\x9d\\x35\\x43\\xdd\\x01\\x28\\x1a\\x03\\x1f\\x2a\\x0e\\xb3\\xa9\\xeb\\x13\\xae\\x56\\xff\\x44\\xfa\\x0a\\xed\\x4f\\x34\\x88\\x74\\x7d\\x6a\\xf8\\x20\\xf3\\x98\\x9b\\x71\\x33\\xf4\\x49\\xea\\x56\\xd3\\xa7\\xf7\\x31\\xe7\\x91\\xb7\\xed\\x2a\\x5d\\xb9\\x39\\xbb\\x75\\x35\\x2d\\xe7\\xda\\xec\\x50\\x66\\xfd\\x57\\x55\\x71\\x65\\xad\\xff\\xa6\\x31\\xcd\\x3f\\x96\\x7c\\x3c\\x7c\\xfc\\x11\\xcc\\x1f\\x14\\xfa\\x23\\xde\\xfe\\xc3\\xeb\\x02\\x39\\xb4\\x5e\\xd6\\x01\\xa3\\xa8\\x07\\x8c\\xcf\\xc7\\xf8\\x38\\x09\\x02\\xa8\\x59\\xee\\x9c\\xe2\\xdb\\x79\\x5e\\xfa\\xca\\x0a\\x01\\xdc\\x08\\x79\\xd5\\x06\\xac\\x97\\xd1\\x07\\x04\\xd7\\x75\\x7b\\x3c\\xcf\\x3b\\x37\\xc3\\x39\\xb4\\x2d\\xb2\\x37\\x82\\x27\\x80\\x23\\xe4\\xc2\\xe7\\x7d\\x74\\x24\\x6c\\x9e\\x54\\x41\\x49\\xa5\\x5c\\x0c\\x92\\x0e\\xbf\\x29\\x86\\xb4\\xc5\\xb4\\xb3\\x57\\x2f\\x74\\x8c\\x4b\\x15\\xc7\\xf8\\x63\\x99\\x9b\\xc5\\x13\\x2a\\xda\\xd0\\x97\\x61\\xeb\\x76\\x50\\x50\\x19\\x76\\x9f\\xb5\\x54\\x22\\xf6\\x03\\x18\\x4e\\x24\\xc0\\xd4\\xf3\\x76\\x19\\x87\\xb5\\xc5\\x0f\\xea\\xfc\\xce\\x53\\x30\\x2a\\x3a\\x41\\x5e\\x20\\xf5\\x6a\\x05\\x48\\x03\\xe5\\x53\\xba\\xcd\\x24\\x2a\\x5e\\x13\\x64\\xaa\\x3b\\x2d\\x7c\\xb3\\xbc\\x1e\\x1b\\x86\\xa4\\x74\\x31\\xcb\\xd3\\x96\\x95\\xb6\\x7f\\x55\\x4c\\x46\\x45\\xb7\\x23\\x69\\x04\\x09\\x4c\\x11\\xaa\\x1b\\x40\\x32\\x6b\\xa9\\x1b\\x8b\\xf4\\x87\\x3e\\x9a\\x4d\\xe0\\x4e\\x2b\\xf4\\x62\\x59\\x72\"},\n{{0x45,0x43,0x8f,0x91,0x46,0x5d,0x74,0xa2,0x82,0x5b,0x0f,0x66,0xa3,0x5b,0xd7,0xc8,0xd0,0x05,0x86,0x54,0x79,0xb3,0xdc,0x10,0xa9,0xb5,0x6f,0x29,0x7d,0x31,0xb9,0x26,},{0xf0,0x92,0xb5,0x88,0x03,0x30,0x87,0x1e,0x5a,0xaf,0xdd,0x3c,0xeb,0x38,0x50,0xee,0x7e,0x09,0x41,0xa2,0xa1,0xdc,0x89,0xf4,0xfb,0x47,0x71,0xd7,0x5a,0x22,0xf6,0xf2,},{0xd9,0x28,0x7b,0x7f,0xec,0x01,0x7f,0x2e,0xa4,0x0a,0x14,0xa1,0xf6,0x2d,0xca,0x78,0xb0,0x2a,0x3d,0x66,0x32,0xdf,0x7c,0x60,0xeb,0xd9,0x0f,0xc5,0xe4,0x92,0xc5,0xc6,0x2c,0x43,0x16,0x6b,0xf8,0x56,0x58,0xfb,0x30,0xa0,0x8b,0x57,0xa5,0x81,0x31,0x21,0xb8,0x03,0x97,0x57,0x1a,0x31,0x2b,0x6d,0xd1,0x1b,0x65,0x39,0x20,0x54,0x16,0x02,},\"\\x30\\x71\\xd4\\xb7\\x20\\xdf\\x10\\x93\\x65\\x99\\x67\\xcd\\x4e\\xef\\xef\\x2e\\xf9\\x67\\x84\\x75\\xf7\\xde\\xc5\\x8f\\xec\\xec\\x1d\\x92\\x8d\\xea\\xf8\\x02\\x45\\x7a\\x19\\x34\\xe6\\x04\\x55\\xf4\\x96\\xcf\\x42\\x51\\x82\\x0e\\xd6\\x0a\\x3d\\x81\\x33\\xb6\\x24\\xd3\\x3a\\xf2\\x6a\\x26\\x27\\x84\\xb5\\xa2\\xfb\\xa7\\x3c\\xca\\x2a\\xa5\\xe5\\x19\\xe1\\xf5\\x39\\x58\\x47\\x80\\x64\\x98\\x64\\xba\\x5f\\xbc\\x1f\\x01\\x1d\\xdd\\xac\\x38\\x1f\\x8d\\x48\\xd0\\xd6\\x0c\\xe8\\x23\\x17\\x01\\x17\\x3c\\x9d\\x2a\\x30\\x7a\\x76\\x30\\x2e\\xbc\\x69\\xdc\\xbc\\x93\\x0d\\x28\\x43\\x14\\x75\\xb5\\x16\\xf9\\x8f\\x77\\x8e\\xd2\\xe1\\xff\\xf2\\x72\\x90\\x9a\\x27\\x2c\\xc3\\xfb\\xb6\\xb3\\x1c\\x80\\x41\\xa3\\x7c\\xb7\\x77\\xe0\\x62\\xe4\\x96\\x49\\xaf\\xad\\x12\\xc1\\xb5\\xf7\\xfc\\xb8\\x06\\x5a\\x99\\xe7\\x42\\x33\\x62\\xad\\x16\\x90\\x60\\x31\\x26\\x5d\\xb7\\xe8\\xb8\\x97\\x51\\xf8\\xa4\\xa4\\x07\\xf2\\x50\\x26\\x50\\xfe\\xd7\\x53\\xe4\\x2c\\x8c\\x91\\x1e\\x50\\xb9\\x4b\\x38\\x00\\x69\\x5b\\x0e\\xba\\x7d\\xff\\x06\\xb7\\xa7\\x10\\x11\\x7e\\x49\\x20\\xd4\\xb1\\xc6\\x05\\xa3\\xeb\\xf3\\x2e\\x06\\x96\\x67\\x16\\xed\\xa1\\x4b\\x30\\x42\\x99\\x8a\\x3c\\x7a\\x5e\\x9f\\x83\\x54\\x2d\\x7d\\xde\\x65\\xe5\\x28\\xbe\\xd6\\x10\\x1d\\xeb\\x33\\x1d\\xeb\\x94\\xcd\\xd4\\x60\\x44\\xbe\\xf8\\x8c\\x09\\x7b\\xaf\\xd4\\x0d\\x69\\x21\\xa7\\xc4\\x84\\xc8\\xf9\\x66\\x84\\xdc\\x37\\x16\\x71\\xd9\\x4e\\xee\\x7c\\xbe\\x5d\\x58\\x77\\x15\\x31\\x4c\\xff\\x0d\\x18\\x77\\x27\\x2d\\x81\\x90\\xa9\\x0e\\x18\\xbf\\xb3\\x21\\xd5\\x2b\\xf7\\x47\\x05\\x13\\x7b\\x2a\\xbf\\x91\\x65\\x73\\x17\\x67\\xa1\\x3a\\xdc\\x9c\\x85\\xe0\\x39\\x7b\\x47\\xae\\xf9\\x6b\\xad\\xb2\\xca\\x7f\\xcb\\x82\\x93\\xb0\\x1f\\xd1\\xde\\x31\\x6e\\xe1\\xe6\\x5f\\x35\\x6b\\x9d\\x6e\\x8e\\xa1\\xfd\\xd8\\x37\\xbd\\x96\\x08\\x11\\x49\\xea\\x2d\\xcd\\x73\\xc4\\x88\\x1f\\x32\\xb7\\xde\\xeb\\xc3\\x71\\x5e\\x2d\\x7c\\xdb\\x64\\x3e\\x0d\\x98\\xf4\\xe8\\x46\\x50\\x8b\\x04\\xb3\\x24\\x39\\xff\\x14\\xb1\\x16\\x4f\\x46\\x84\\x6d\\xf9\\xaf\\xae\\x44\\x46\\x4c\\xf5\\x50\\x10\\x4c\\xd3\\xaa\\xb3\\x81\\x75\\x40\\x47\\x0a\\xaa\\x2a\\xb9\\x55\\x9a\\x68\\xb7\\xff\\x6b\\x1b\\x9c\\x0c\\xe9\\xf5\\x86\\x9c\\xbd\\xcd\\xd6\\x17\\x09\\x09\\x42\\xe3\\x53\\xb4\\xc7\\x7f\\x09\\x39\\x58\\x96\\xbe\\xcd\\xdf\\xf1\\xab\\x7f\\x07\\x58\\x6a\\x51\\x4d\\x81\\xfb\\x09\\x63\\x61\\x55\\x75\\x66\\x87\\x0f\\x16\\x91\\x98\\x34\\x85\\xa8\\x0c\\x34\\x13\\xda\\x98\\xb8\\xd1\\x9c\\x78\\xe6\\x37\\x9f\\x94\\x3e\\x5b\\xd5\\xa5\\x69\\x7a\\xa3\\x3c\\x5e\\x6b\\xfc\\xfb\\x7b\\x8d\\xf1\\xe1\\x57\\x4e\\xe4\\x16\\xfa\\xb3\\xc8\\xa7\\xd0\\x88\\xb3\\xa0\\x57\\xcf\\x86\\x53\\x21\\xb7\\x4e\\x61\\x03\\x52\\x6d\\xd9\\xad\\x15\\xca\\x5a\\xd3\\xc0\\xf6\\x97\\x18\\xe2\\x70\\x81\\xd4\\xb3\\x4a\\x7c\\x6d\\x1a\\xab\\x6b\\x96\\xc0\\xa7\\x54\\xb9\\x89\\xb4\\x94\\x06\\x38\\xc9\\xed\\xe3\\xd1\\x7b\\xd4\\x9f\\x65\\xbf\\x78\\x3d\\xc8\\x5f\\x1c\\x4b\\x14\\x48\\x76\\xcd\\xbd\\xb2\\x28\\x2a\\x95\\x64\\xaa\\x81\\xb5\\x70\\x92\\x08\\x0d\\x64\\x48\\xfb\\x65\\x80\\xec\\xf0\\x9f\\x82\\xa7\\x55\\x01\\x0d\\x55\\xd4\\xa5\\xe4\\xf3\\x05\\xe2\\x59\\xdb\\xe9\\x95\\x08\\xb4\\x79\\x25\\x0d\\x80\\xec\\x17\\xc8\\x76\\x0a\\x93\\xe0\\x5a\\x29\\x57\\x1f\\x68\\x56\\x07\\x30\\x22\\xc8\\x70\\x69\\x13\\xc4\\x6a\\x2e\\xfd\\x2e\\x9c\\xaa\\xe4\\xff\\xa1\\xb4\\x22\\x2e\\x3d\\x70\\xe9\\x79\\xe8\\x1a\\x71\\x95\\x1d\\x7c\\xb8\\x30\\xbc\\xbc\\xf9\\x01\\xaf\\x24\\x4f\\x64\\xe4\\xad\\x9f\\x52\\xfa\\x3b\\x62\\x03\\x1e\\x35\\x16\\xda\\x50\\xbc\\x2b\\xce\\x78\\xeb\\x9d\\x61\\xbf\\xed\\xd9\\xb3\\xf5\\x7e\\x89\\x35\\x5f\\x17\\x7d\\xb6\\x16\\x2b\\xf6\\x1d\\xa0\\xe4\\x54\\xc3\\x42\\x88\\xb9\\x67\\xc3\\xfb\\x4c\\x34\\x1b\\x32\\xd4\\xd1\\x3a\\x31\\x98\\x69\\xb8\\xe3\\x60\\x46\\xf9\\xe3\\x38\\xb5\\xf3\\x6a\\x1f\\xc1\\xa7\\xed\\xa7\\xd7\\xb0\\xd4\\x38\\xe0\\xa7\\x5d\\x84\\xbb\\xe4\\xd6\\x8c\\x87\\x9a\\xda\\x80\\xdd\\xe2\\x3f\\x71\\x55\\xb5\\x32\\xcc\\xcf\\x7a\\x63\\xf1\\xbe\\xdf\\x84\\xf8\\x2f\\x44\\x0c\\x9e\\xc3\\xcb\\x0e\\x45\\xf3\\x2c\\x92\\xf7\\x64\\x38\\xf5\\xb4\\xb9\\x10\\x44\\x1e\\x67\\x38\\xaf\\x3f\\x5d\\x20\\x50\\xd5\\x79\\xee\\x96\\xb8\\x8f\\x3b\\x00\\x81\\x0a\\xb1\\x26\\xff\\x3a\\x8f\\xef\\xd9\\x71\\x04\\x43\\x24\\xdd\\x4e\\xb3\\x44\\x7d\\xac\\x5b\\x77\\x80\\x9c\\xda\\x8c\\x71\\x68\\x25\\x49\\xd7\\xcf\\x2d\\xce\\xe3\\x40\\xed\\xcf\\x94\\x94\\xac\\xa4\\x29\\x01\\xe2\\xc1\\x1e\\xd9\\x77\\x90\\xaf\\x48\\xbc\\xea\\x29\\x52\\x1e\\xf0\\xe3\\xd0\\x3c\\xda\\xde\\xcd\\xc8\\x94\\xdd\\x07\\x56\"},\n{{0x72,0xcf,0xce,0xf4,0xc9,0xd6,0xa1,0x98,0x6d,0x19,0x03,0x11,0x84,0x0e,0x55,0xcb,0xaf,0xac,0xc8,0xa6,0xeb,0x5e,0xcc,0x72,0x93,0x4f,0xda,0x53,0x5b,0xdc,0xff,0xb2,},{0xa9,0x44,0x64,0xd8,0xcc,0x8f,0x3e,0x43,0x39,0x39,0x47,0x64,0x9f,0x91,0xc2,0x75,0x23,0x27,0xe4,0x0d,0xac,0xa1,0x1a,0x99,0x70,0xc5,0x18,0x1e,0xda,0x37,0xd6,0x06,},{0xdb,0x72,0x70,0xac,0xce,0x78,0xd7,0xfb,0x09,0x08,0x0a,0x32,0x79,0x41,0xbc,0xe7,0xeb,0x14,0x5b,0x9e,0x36,0x61,0x86,0x6a,0x86,0x83,0xf9,0xa1,0xa3,0xde,0x97,0xfb,0x02,0xb0,0x25,0xdb,0x9e,0xc7,0x6f,0xf3,0x25,0x60,0xfe,0x63,0x88,0x27,0x74,0x2e,0xa2,0xf4,0xeb,0xef,0x6b,0x7c,0xce,0x44,0xf9,0xaa,0xee,0x43,0x4f,0xd7,0xc1,0x08,},\"\\x66\\xa6\\xcb\\xe8\\x8a\\x8a\\xb9\\xa3\\x38\\x47\\x79\\x7f\\xc4\\x80\\xb2\\x44\\xe8\\xa2\\xb8\\xec\\x79\\xe8\\x0b\\xc2\\x63\\x77\\x53\\xde\\xb3\\x6f\\xa3\\x01\\x4f\\x84\\x3e\\x22\\xa4\\x7d\\xb0\\xa3\\x17\\x78\\x38\\x5e\\xc1\\xf4\\x55\\x67\\x2e\\x0d\\xff\\x6c\\xa2\\x1c\\xa4\\xcf\\xd2\\xb9\\x89\\x47\\x1b\\x7f\\xfc\\x30\\x78\\x28\\x13\\x8b\\x0a\\xd4\\xe6\\x47\\xc2\\xd1\\x3c\\xef\\x72\\x44\\x69\\x05\\x4a\\xbd\\x37\\x40\\x24\\x5a\\xea\\x4b\\x78\\x9e\\x24\\x4e\\x95\\xcf\\x9e\\xcf\\xd0\\x8a\\x0d\\x13\\xc7\\xce\\xd3\\x93\\x33\\x27\\x27\\xa7\\xf3\\xd8\\xfb\\xda\\xbd\\x93\\x9d\\xe2\\x8c\\xaa\\x41\\xcc\\x96\\xc7\\x08\\x11\\x98\\xe2\\x26\\x53\\xd9\\x4e\\x02\\x4a\\x61\\xf5\\xf3\\xdc\\x5a\\xa3\\x7f\\xa9\\xad\\xdd\\xc9\\x6c\\xf1\\x69\\xd3\\x50\\x62\\xa0\\xa2\\x9b\\xa4\\x5a\\x53\\x9c\\x87\\xa6\\x8a\\x3a\\x03\\x04\\x36\\x13\\x09\\xd2\\x13\\xe6\\x14\\xee\\x83\\x73\\xda\\xfb\\xa2\\xa7\\xd6\\xed\\x7d\\x2a\\xd3\\x77\\x04\\xc0\\x94\\x6e\\x4d\\x09\\x3e\\x2d\\x94\\xd0\\x61\\x36\\x4c\\xc1\\x23\\x10\\x63\\x72\\x91\\x03\\xa7\\x7c\\xcb\\x50\\x18\\x91\\xbb\\xc3\\x18\\x54\\x57\\xbb\\xd2\\x86\\x9e\\xb6\\x3d\\xc6\\x0f\\x19\\x6f\\x10\\xa3\\x8b\\x7b\\x36\\xcb\\x3f\\x64\\x3d\\x35\\xdd\\xbf\\x43\\x8a\\x44\\xbf\\x0c\\x8f\\x57\\x0f\\xad\\x41\\xbd\\xde\\x26\\x7f\\x0f\\xfc\\xf1\\xf2\\xf9\\x27\\xd6\\x26\\xd1\\xb0\\xd9\\x80\\xa0\\xce\\x22\\x3f\\x2f\\x00\\x54\\x84\\x5a\\xfe\\x41\\xd3\\x9d\\xe5\\xa4\\x57\\x21\\x9f\\x27\\x6c\\x67\\xe6\\x9b\\xe2\\xd5\\xc9\\xe0\\x70\\x13\\x16\\x39\\x56\\x1c\\x26\\x75\\x1f\\xb0\\x64\\x35\\xe0\\xe4\\x2e\\x25\\x08\\xc5\\xf4\\x9c\\xd1\\x2b\\x51\\x7c\\x98\\x33\\xff\\x97\\xf5\\xe5\\x1e\\x1d\\xce\\xaf\\xa9\\x42\\x6d\\x3d\\xc5\\x2f\\xd1\\x37\\x9c\\x64\\xcc\\xaa\\xbb\\x26\\xdb\\x1a\\xf6\\xde\\xd7\\x15\\x36\\x28\\x84\\x2f\\x0c\\xbd\\xbb\\xbd\\x6a\\xa0\\xcf\\xa5\\x40\\x7f\\x40\\x94\\x96\\xc0\\x65\\x32\\xdb\\xea\\xc9\\x4d\\xab\\x9b\\xab\\xa0\\xb3\\xc9\\x88\\xfa\\x03\\xd3\\x6f\\x91\\x1d\\x80\\xe4\\x9b\\x37\\x0b\\x68\\x37\\x03\\x7f\\xf2\\x49\\xe7\\x6d\\x69\\x2c\\xd1\\x77\\x37\\xe0\\xd0\\x79\\x65\\xd3\\x3f\\x17\\x04\\x2b\\xbc\\xd1\\xe9\\x90\\xe0\\x40\\xf7\\x19\\x36\\xf6\\xfc\\xa2\\x54\\x2a\\xe3\\x37\\x48\\x36\\x77\\x87\\xc0\\x1b\\xde\\xa7\\x5c\\x9a\\x0e\\x66\\x15\\x02\\x81\\xc4\\x68\\xfe\\x5c\\x73\\xaf\\x9e\\x5b\\xec\\x37\\x2d\\x50\\x20\\xc3\\xd3\\x7f\\xa1\\x03\\x5a\\x67\\xe2\\x24\\xd0\\x95\\xf0\\x66\\xa5\\x1f\\xe1\\xf6\\x81\\xc3\\x07\\x39\\x39\\x27\\x2f\\x6a\\xf7\\x75\\x0e\\xd8\\xd1\\x83\\x49\\x17\\x8a\\xb4\\xa2\\xee\\xb4\\xe9\\xca\\x82\\xbb\\x67\\x29\\x6e\\x98\\x90\\xf3\\x16\\xc9\\xd9\\x49\\x59\\x53\\xd6\\x84\\x36\\xeb\\x1c\\x1a\\x2f\\xb6\\xa1\\xcc\\xa4\\x5a\\x8e\\x88\\xa0\\x9b\\xdd\\x65\\xa5\\x55\\x80\\x25\\x61\\x8b\\x36\\xd7\\xf3\\xcb\\x38\\x9d\\x2e\\x2a\\xb1\\xed\\x23\\x32\\x28\\xec\\x92\\xa3\\x27\\x97\\x8c\\x0a\\xdc\\xed\\xdb\\x6c\\x96\\x32\\xd3\\xab\\xd7\\x97\\x16\\x21\\x71\\x37\\x54\\x75\\x8e\\x21\\x01\\x3a\\x0c\\x3d\\x00\\x9b\\x6e\\x31\\x93\\xcc\\x15\\x2c\\x57\\xef\\x73\\x10\\x7b\\xd4\\x35\\x7d\\x52\\x8b\\xe4\\x08\\x73\\x02\\x7b\\xf1\\x84\\x0f\\x68\\x55\\x36\\x08\\x0f\\x12\\xc5\\xff\\xa9\\x3c\\xa6\\x29\\x73\\x67\\x80\\xe0\\x15\\xe8\\x6d\\x19\\x09\\xf0\\xd8\\xf3\\x72\\x01\\x0c\\x9c\\xb7\\x2c\\x09\\x89\\x84\\x5f\\xc8\\x83\\x15\\xe6\\xb9\\x37\\x0d\\xc9\\x2d\\x36\\x83\\xef\\x44\\xd3\\xf7\\x5f\\xc9\\x6c\\x4b\\x0e\\x89\\xe1\\x3d\\x68\\x2d\\x19\\x88\\xb6\\x85\\x71\\x3e\\xad\\xa8\\x42\\xbe\\x9d\\x2b\\xbe\\x2a\\x76\\xbb\\xa1\\x5d\\x38\\xcb\\xaf\\xb6\\x5c\\x40\\xc2\\x15\\x9b\\x0c\\xee\\xb0\\xd7\\x69\\xb9\\xbe\\x35\\x55\\x40\\x73\\x4f\\xf3\\x77\\x36\\xc0\\xf0\\xfa\\xcb\\x95\\x15\\x93\\x09\\x36\\x5b\\x96\\x46\\xbc\\x4b\\x34\\x4f\\xb1\\x9a\\x5c\\x16\\x39\\xa8\\x8e\\x87\\x31\\x7b\\xfb\\x3b\\x5e\\x7b\\x51\\x30\\xfa\\x7d\\x56\\x43\\xed\\x4d\\xa0\\x64\\x30\\xc8\\xa0\\xc1\\x85\\x8c\\xcf\\x2f\\x9a\\x6e\\x3d\\x62\\x01\\x22\\x53\\xf0\\x12\\x2d\\xba\\xb4\\xa3\\x54\\x75\\xa6\\xf6\\x55\\x89\\xb2\\xb0\\x95\\x99\\x28\\x26\\xe4\\xf1\\xb5\\x8f\\xa0\\x50\\xb8\\xf9\\x5c\\x4f\\xeb\\xa3\\xfb\\xaa\\xdd\\x2c\\x22\\x44\\xad\\x4a\\xbd\\x41\\x01\\x39\\xad\\xf4\\xc1\\x53\\xcb\\x5e\\x69\\x33\\x7a\\xf1\\x76\\xa7\\x83\\x7e\\xea\\xea\\x99\\xbd\\xcd\\x59\\x38\\x5a\\xfd\\xed\\x34\\xff\\xba\\x80\\x63\\xa3\\x5f\\x4f\\x55\\x8e\\x4e\\xeb\\x48\\xf1\\x48\\x7b\\x56\\xb1\\xf8\\xd1\\xf7\\x30\\x67\\x62\\x1c\\xb5\\x48\\xc8\\x08\\x75\\x3e\\x35\\x26\\xa2\\xf2\\xaa\\xbd\\xe1\\x26\\xbe\\xa5\\x21\\xcf\\x67\\x3d\\xea\\xfa\\x79\\x2c\\xa5\\xbd\\x22\\x12\\x79\\x5b\\xd6\\x6b\\x86\"},\n{{0xa6,0x33,0x7e,0x4d,0x3b,0x1a,0x49,0xb1,0x26,0x31,0x67,0x78,0xc6,0x13,0x51,0x6c,0x03,0xac,0x88,0xc9,0x6d,0x92,0xff,0x5c,0xc7,0xe0,0xc8,0x52,0x7c,0xce,0x1a,0x62,},{0xf5,0xea,0xc4,0xfe,0x0e,0xa1,0xa5,0xf2,0x36,0xb4,0x9d,0xa3,0x3a,0x24,0xe2,0xf3,0xa8,0x3d,0x4b,0x26,0x0c,0x54,0xd3,0x41,0x6c,0x64,0x4e,0x05,0xc8,0x38,0xbf,0x51,},{0x78,0x13,0x76,0xc9,0x51,0x2f,0xa3,0x3c,0x45,0x70,0x47,0xa1,0xf4,0xf0,0xda,0x31,0x76,0xe6,0x0e,0xe4,0x77,0x82,0x86,0x9b,0x7e,0x9f,0xa5,0x84,0x1d,0x96,0x4f,0x3c,0x1a,0xd6,0x6b,0x70,0xc1,0x14,0xb1,0x77,0x1c,0x32,0x4c,0x83,0xff,0x6c,0xd9,0x97,0xae,0xfc,0xcd,0xc5,0x9c,0x11,0x4d,0xb9,0xf2,0xf3,0xca,0x7d,0x84,0xa7,0xb6,0x0f,},\"\\xe3\\x34\\x30\\xc3\\x8c\\x4a\\x40\\xb3\\xc6\\x6e\\x20\\xcf\\x3b\\x70\\xe9\\xfe\\xa8\\xcc\\x50\\x76\\x1f\\x2a\\xfe\\x24\\x9e\\xc0\\x59\\xc0\\x7b\\xc3\\xb3\\x7e\\x5b\\x94\\xf4\\xa4\\x3e\\x31\\x00\\x99\\xb1\\x9a\\x85\\xf5\\x9d\\xff\\x73\\xa7\\xe4\\x95\\xc4\\xdf\\x31\\xf7\\x47\\x80\\xcd\\xef\\x7b\\xd6\\xe4\\x7c\\x39\\x4c\\x18\\x91\\xea\\x30\\x52\\xe3\\xcc\\xf5\\xd8\\x4b\\xae\\x08\\x2d\\x24\\xba\\x71\\x78\\xac\\x65\\xd2\\x29\\xad\\x18\\xa8\\x49\\x40\\xf6\\xb4\\xdb\\xc5\\x96\\xee\\x63\\xc1\\x81\\xb5\\x7b\\x5b\\x49\\x69\\x89\\x79\\xc1\\x86\\x32\\xfa\\x82\\x1c\\xa6\\x1e\\x35\\xa0\\xd0\\x35\\x1f\\xe1\\x3d\\x69\\xe0\\x6d\\xdc\\xc8\\xd6\\x66\\xdc\\xa2\\x45\\x02\\x17\\x7f\\x34\\x4e\\x2f\\x44\\x05\\x75\\xd3\\x9e\\xbf\\xe5\\xe7\\xf1\\x06\\x53\\xb6\\x5b\\xef\\x29\\x1d\\xc8\\x13\\xa0\\x43\\x4c\\x97\\x5d\\xe1\\x64\\xc1\\xa7\\x6b\\xf6\\xfc\\xef\\x98\\xf2\\x31\\x81\\xc0\\x09\\xb9\\x18\\x30\\xb6\\x18\\xe4\\x87\\x48\\x47\\xd2\\xe2\\x1b\\xbd\\xb9\\x3f\\x20\\xcd\\x8b\\x1f\\x4b\\xaa\\xdf\\x99\\x42\\x8a\\x22\\x67\\x43\\x86\\xa6\\x68\\x15\\x2b\\x4b\\x90\\x39\\xff\\x06\\xab\\xcf\\xe3\\x34\\xa0\\x62\\xf7\\x94\\x05\\x61\\x72\\xec\\xbc\\x07\\x94\\xdf\\x98\\x27\\x1b\\x9a\\xcf\\xe4\\xb7\\xda\\x55\\x3a\\x87\\x63\\x42\\x37\\x63\\x00\\x09\\xa0\\x5b\\x25\\x7c\\x18\\x4c\\xbe\\x23\\xd9\\xcd\\x5a\\x03\\x86\\x58\\x01\\x0f\\x57\\x48\\x99\\xf3\\xb2\\xd1\\x54\\xd1\\x85\\xee\\x67\\x23\\x09\\x13\\x65\\x0c\\x3a\\x05\\xb5\\x4a\\x2e\\xdc\\x24\\x3a\\x42\\x87\\x39\\x8e\\x37\\x69\\x28\\xea\\x9c\\x6b\\x2c\\xba\\xf3\\x71\\x25\\x25\\x40\\xe2\\xb8\\x04\\x3f\\xcf\\x55\\x68\\x13\\x19\\x6a\\xe5\\x72\\xc2\\x7c\\xfb\\x5a\\x46\\xab\\xb9\\x72\\x9a\\xf2\\xdc\\xfc\\x29\\xe0\\x33\\xdd\\x11\\xf3\\x3e\\x86\\xcc\\x6a\\xc3\\xbc\\xe6\\xf3\\xf9\\x57\\x7d\\x36\\x78\\x1a\\x69\\xed\\x7e\\xaf\\x8c\\x82\\x63\\xa0\\xf1\\x8e\\xba\\x0f\\xe8\\xa4\\x81\\xf3\\xe1\\x5a\\x55\\x59\\x94\\x34\\x19\\x5f\\x7c\\xb0\\x57\\xdd\\x36\\x4e\\xaa\\x07\\xdd\\x0d\\xfd\\x26\\x6b\\x80\\x7f\\x53\\xa2\\x07\\x0f\\xd7\\x91\\xe8\\x72\\x42\\x2f\\xd9\\x07\\x13\\x4f\\x4a\\x8a\\x78\\xa8\\x76\\xbd\\xcb\\x03\\x1a\\xc8\\x60\\xdf\\xe0\\xbb\\x57\\xe1\\x05\\xdb\\x82\\x87\\xb3\\x1a\\x60\\x4e\\xb7\\x12\\x69\\xbe\\x5b\\xa2\\x29\\x98\\x5c\\xea\\xbc\\x2b\\xdf\\x16\\x5a\\xc7\\x41\\x65\\x0b\\x1f\\x01\\x3a\\x66\\xc9\\xbd\\x24\\x3d\\x03\\xa8\\xb1\\xc5\\x08\\x13\\x81\\xcb\\x92\\xe2\\x3f\\x90\\x57\\x77\\x1f\\xc0\\x7c\\xa3\\x2d\\xff\\x1d\\xb9\\x4f\\x5a\\xdf\\xd2\\xf4\\xff\\x9a\\xf3\\x1d\\x25\\x0d\\xd4\\xf8\\x6b\\x22\\x59\\x2f\\x60\\xa7\\x45\\x75\\x15\\x62\\x13\\xf1\\x08\\x46\\xc7\\x46\\xa9\\x20\\xfe\\x39\\x85\\x1b\\x32\\xfe\\x4c\\x8b\\x87\\x58\\x76\\x5b\\xc5\\xb8\\xb9\\xd5\\xb9\\x92\\x63\\xdf\\x36\\xf9\\x78\\x88\\x05\\x3f\\xd1\\x0f\\x1d\\x68\\xf5\\x77\\xae\\xd5\\x59\\xbc\\xfd\\xe7\\x44\\xbc\\x65\\x11\\x07\\x6c\\xaf\\xd6\\x89\\x44\\xa0\\xed\\x10\\x55\\x2d\\x11\\x34\\x4b\\xc7\\xe4\\xd9\\xef\\x93\\x6d\\xac\\xce\\xd5\\x27\\x43\\x31\\x32\\x95\\x9b\\x1c\\x73\\x24\\xad\\x1c\\x4c\\xbc\\x3a\\x1a\\x73\\x6b\\x1f\\x02\\xaa\\xe8\\xe0\\x61\\x1a\\xe2\\x3f\\xdd\\x47\\x4f\\x5b\\x8e\\xe7\\x05\\x6f\\xcb\\x5a\\xf6\\x13\\x3e\\xcc\\x08\\x4b\\xb9\\xf1\\xf5\\x0c\\xbd\\xac\\x66\\x24\\x44\\x37\\xb4\\x34\\x8f\\x4e\\xdf\\xe2\\x37\\xfc\\x3c\\x38\\x29\\xab\\x94\\xeb\\x4f\\x14\\xca\\xb1\\xcc\\xd6\\xca\\xee\\x36\\xfa\\xdc\\x20\\xa3\\x10\\xcf\\x06\\x90\\x62\\x2c\\xdc\\xa8\\x48\\xae\\xd0\\x3f\\xf4\\x03\\xa6\\x63\\x3f\\x4f\\x65\\x79\\x94\\xb7\\x80\\xdd\\x60\\x48\\x14\\x9c\\x3b\\xfb\\xc1\\x78\\x89\\xe3\\x7d\\x90\\xb1\\xe5\\x42\\x0e\\xb3\\xd4\\x59\\x6b\\x91\\xba\\x11\\xbc\\x02\\x29\\xc6\\x5d\\x05\\xb9\\x3c\\xd7\\xe0\\x45\\x4d\\x1f\\x3c\\x6e\\x1e\\x80\\x71\\x98\\x37\\x92\\xc4\\xd4\\x36\\x8d\\x07\\x78\\xae\\xf4\\xe1\\x23\\x33\\x5f\\xd2\\x96\\x2c\\x65\\x7b\\xd0\\x51\\x35\\x71\\xa5\\xfc\\xe2\\x11\\xde\\x62\\x87\\x4f\\x27\\xca\\x10\\xdc\\x15\\xba\\x2d\\x44\\x5f\\x1c\\xf4\\xbe\\x5f\\x83\\x3c\\xf0\\xb5\\x64\\xc0\\x22\\x57\\x6b\\x98\\xc0\\xa2\\x43\\x49\\xb6\\x70\\x85\\xf9\\x22\\x02\\x67\\x5d\\x7d\\xac\\x48\\xb9\\x5e\\x3b\\xfd\\x65\\x55\\xa9\\xec\\xb7\\xc7\\x2f\\x08\\xbf\\xec\\x0d\\x22\\x02\\x22\\x49\\x2f\\xdc\\x96\\x36\\xf0\\x36\\xec\\x45\\x08\\xa3\\x65\\xb7\\xb7\\x09\\x79\\xf9\\xeb\\x4a\\x72\\x63\\xa8\\xba\\xcb\\x1c\\x1d\\x01\\x55\\x73\\x86\\x46\\xcd\\xd4\\x6a\\xb9\\x23\\x4a\\x17\\x03\\x11\\x50\\x0d\\x0b\\xae\\x6e\\x55\\xa8\\x63\\xbd\\xaa\\x56\\xf5\\x16\\x45\\xad\\x85\\x29\\x7a\\x73\\x81\\xf8\\xd2\\x0c\\xf9\\x6c\\x47\\x4d\\x1b\\xb8\\x1f\\xce\\x13\\x2b\\x14\\x55\\x5d\\x1a\"},\n{{0x10,0x7d,0xa9,0x8d,0x0e,0xe8,0xe7,0xc0,0x0f,0x6d,0x41,0xec,0x26,0x59,0x44,0xce,0x67,0xef,0x8c,0x8f,0xfb,0x51,0xf4,0xf1,0x1f,0x4e,0x5f,0x1a,0x27,0xfb,0xe8,0x05,},{0x3b,0xec,0x34,0xb1,0x61,0xb1,0xbc,0xff,0x00,0x9f,0x8c,0xfc,0x50,0xd8,0x4c,0xeb,0x6a,0x2d,0x5b,0x20,0x3b,0x52,0x38,0xa8,0xaa,0xd8,0xa8,0x36,0x18,0xb4,0x42,0xe7,},{0x53,0x25,0x2b,0x92,0x3a,0xd1,0x9c,0xc3,0x97,0x84,0xd3,0xa9,0xae,0x59,0xd6,0x2a,0x63,0x00,0xdc,0xc5,0x0a,0xc8,0xfd,0x07,0x13,0xcb,0x58,0x84,0x45,0x01,0xd8,0xd3,0x80,0x5a,0xfa,0x0f,0xda,0x64,0xc7,0x3e,0xa0,0xf6,0x0e,0x6a,0x8b,0x34,0x45,0xbf,0xff,0xe6,0xca,0x6b,0xfd,0xc8,0x7e,0x12,0x8b,0xaf,0x99,0xbf,0x62,0x68,0xfc,0x09,},\"\\x1a\\x7b\\x7f\\x3e\\x1c\\x7c\\x41\\x49\\x2a\\x7c\\xe7\\x99\\xef\\xdb\\x2d\\x9d\\xc2\\xf2\\x48\\x9c\\x84\\xae\\x28\\xbb\\x7d\\x08\\x4f\\x32\\xec\\xa8\\xfb\\xb0\\x66\\x88\\x5a\\xc6\\xf2\\xef\\x74\\x49\\xe7\\x12\\x26\\xa8\\x2e\\x9f\\x15\\x37\\x72\\xa9\\x93\\xeb\\x6b\\x6b\\xca\\x64\\x91\\xd2\\x6a\\xca\\x5d\\xee\\x98\\xb7\\x7a\\x1d\\xdc\\x59\\x92\\x2b\\x31\\x45\\xc4\\x47\\xde\\x73\\x7f\\xaf\\xac\\xba\\x5a\\x75\\xf2\\xa8\\x01\\x37\\xb5\\x59\\x46\\x97\\x22\\x0d\\x19\\x61\\x76\\x74\\xa6\\x91\\x13\\xfd\\xf7\\x7c\\x34\\x3a\\xf2\\xb7\\xe3\\x86\\x1b\\x5b\\x78\\x22\\xf5\\x8d\\x60\\x08\\x9c\\x3c\\xa5\\x4c\\x74\\x9d\\x27\\xf8\\x83\\x79\\xc0\\x67\\x59\\x8f\\x06\\x39\\x39\\xba\\x86\\x31\\xd1\\xf5\\x2d\\xc9\\xab\\x45\\x50\\x45\\xfb\\x36\\x0c\\xc2\\xa5\\xb6\\xb0\\x12\\x7f\\xac\\xfc\\xf5\\xb1\\xb4\\xc3\\x3e\\x3f\\x19\\x4f\\xc9\\x24\\xb8\\x54\\x16\\x8c\\xb1\\x16\\x9a\\xb1\\x09\\x97\\xb4\\x38\\xb7\\x1c\\x80\\x87\\x83\\x47\\xbe\\x88\\x7a\\xf4\\x48\\x10\\x13\\x4b\\x51\\x4c\\x80\\x69\\x08\\x20\\x1a\\x3d\\x3e\\x6d\\x0c\\x56\\x12\\x0c\\x43\\x14\\x87\\x4d\\xc2\\x94\\x4d\\x84\\x44\\xf0\\x1b\\xaf\\xa3\\x4a\\xa6\\x2e\\xce\\xf0\\x98\\x15\\x45\\xe5\\xd0\\x2f\\x40\\x16\\xc0\\xb1\\x64\\xfc\\x05\\xae\\x18\\xf5\\x35\\xc3\\x1b\\xf2\\x0b\\x86\\xf3\\x1f\\x7a\\x79\\x4a\\xba\\x14\\x89\\x84\\xc3\\xff\\x43\\x3d\\xc2\\x22\\xc4\\x43\\xb5\\xd2\\x6c\\x1f\\x66\\xe6\\xc5\\xf1\\x9d\\x19\\xcd\\x6e\\xad\\xd4\\xdc\\x94\\x10\\x1b\\x2f\\x52\\xb5\\x8c\\x9d\\x45\\x90\\xcb\\x10\\xdb\\xc5\\xd6\\xea\\xcd\\x11\\xd4\\x2e\\xd0\\x9f\\x15\\xbd\\xe4\\x4e\\xe9\\x27\\x1d\\xef\\x29\\x2f\\x73\\x1b\\xf3\\xb4\\xac\\x6c\\xd1\\x27\\xe4\\x88\\x4c\\x2c\\xb3\\x0b\\x28\\x5f\\xc9\\x24\\x76\\x38\\xa2\\x99\\xe4\\x16\\x52\\x06\\x24\\xd1\\xec\\x8d\\x0d\\xf2\\x49\\x89\\x39\\xc7\\x19\\xa9\\xe7\\xbd\\x29\\xa3\\xc5\\xc3\\x2a\\x3e\\x82\\x41\\x36\\x8d\\x6e\\x4f\\x90\\xfe\\xa2\\x9d\\xc3\\xa3\\xf1\\x47\\xea\\x9f\\x76\\xc5\\x78\\x0e\\x73\\x14\\x3f\\x55\\xd3\\xde\\xc7\\xb6\\x63\\x41\\xd3\\xf3\\xea\\xc1\\xd9\\x8f\\x8e\\x7d\\x4e\\x87\\x75\\x09\\xb4\\x43\\x8c\\x3a\\x52\\x46\\x6d\\x24\\x2a\\x10\\xb4\\xc2\\x7c\\x4a\\x0d\\xb9\\x23\\x2d\\xad\\x01\\x14\\x14\\xeb\\xfb\\xd5\\x79\\x06\\xf1\\xa4\\x10\\x20\\x7b\\x52\\x6b\\x0d\\x1f\\x1b\\x69\\x86\\xb3\\xeb\\xd7\\x55\\x0a\\x2b\\x3c\\x15\\xfc\\x24\\x09\\xc7\\x62\\x6e\\x0d\\xd3\\x30\\xef\\x67\\x22\\xe3\\xba\\x48\\xb1\\xd9\\x20\\x56\\x52\\xac\\x19\\x4c\\x21\\x47\\x3c\\xe2\\x58\\x55\\x9d\\xb5\\x11\\xef\\xad\\x3e\\x5d\\x55\\xf2\\xa7\\x96\\xd6\\x5a\\x6a\\xb9\\x7d\\x86\\x31\\x06\\x2a\\x59\\x3a\\x13\\xaa\\xa0\\x95\\xdb\\xc9\\x3e\\x62\\x17\\xce\\xd6\\x19\\xcb\\x16\\xa5\\x7e\\x74\\x43\\x55\\xa1\\x6b\\x15\\xe7\\x7d\\x49\\x79\\x11\\x92\\x99\\xbb\\x04\\x3e\\x48\\xfa\\x3e\\x61\\x54\\x60\\xe1\\x64\\x88\\x29\\x84\\xa2\\x23\\xd4\\x18\\xca\\x95\\x34\\x0c\\x5b\\xfc\\xda\\x67\\x3f\\xcd\\x13\\xb2\\x9f\\x2c\\x47\\xd2\\xf9\\x7e\\x3e\\x8c\\x61\\x3b\\x6c\\x58\\xdf\\x0e\\x62\\xcf\\x23\\x06\\x1d\\x6f\\x54\\x5b\\x75\\x50\\x33\\xfd\\x3d\\xc1\\x40\\x5e\\x5f\\xef\\x35\\xa1\\x3e\\x01\\x5f\\x98\\xb1\\xcc\\x42\\xf7\\x1b\\x99\\x68\\x1f\\x96\\x81\\x25\\x82\\x29\\xa4\\x47\\x3d\\x86\\xea\\xbb\\x0c\\x17\\x92\\x79\\x41\\xe5\\x0c\\x08\\xf3\\x4a\\x76\\xb4\\x3b\\xcc\\x6d\\x04\\x2e\\x56\\x32\\xef\\x9c\\xcc\\x91\\xb6\\xe6\\x95\\x0f\\x5d\\x30\\xf6\\x70\\xfb\\x39\\x02\\xc3\\xd4\\x09\\x31\\x5a\\x40\\xb0\\x82\\x1c\\xe8\\xa9\\x9a\\x97\\xfe\\xca\\x54\\x78\\xbf\\xd7\\x82\\xe7\\x87\\x67\\xb3\\x11\\xf3\\x74\\x16\\x3f\\x58\\x96\\xb0\\xbe\\xb9\\x58\\x38\\xe6\\x45\\x87\\x8c\\x64\\x99\\x03\\x85\\x12\\x3b\\x61\\x57\\x5d\\xd8\\x42\\xdc\\x76\\x35\\x4b\\xac\\x9c\\x6d\\x5a\\xcd\\x99\\x35\\xb6\\x09\\xbc\\xcc\\xb8\\x46\\x3d\\x39\\x22\\x5d\\xa1\\xaf\\xb8\\x91\\x1d\\x36\\xe6\\x09\\x89\\x2d\\xd1\\x72\\x38\\x52\\xab\\x9f\\x82\\x75\\x8f\\x3f\\x1e\\x4d\\x28\\xdc\\xf0\\x2c\\xb0\\x6e\\xed\\x26\\x84\\x4a\\xae\\x68\\x82\\xed\\x44\\xbc\\xe4\\x4a\\xbc\\xd1\\xdf\\xba\\x63\\x34\\x18\\xc9\\xf1\\x55\\x87\\x9c\\x97\\xab\\x27\\xf8\\xae\\x23\\x83\\x30\\x39\\x2b\\xe5\\x49\\x1a\\x07\\x86\\x62\\xda\\xaa\\x02\\xa3\\xd5\\x45\\x8b\\x77\\xc5\\x49\\xc4\\x9b\\xe2\\x01\\x24\\x5e\\x7a\\xae\\xc0\\xd9\\x4e\\x54\\x37\\xbe\\xca\\x6e\\x5a\\xb0\\x46\\xd6\\x94\\xe9\\x6b\\xf5\\x1e\\x04\\xfb\\x44\\x37\\x9b\\x2b\\x9b\\x80\\x16\\x75\\xfe\\x14\\x77\\xf3\\xe0\\x89\\x87\\x4a\\x60\\x11\\x71\\xd8\\xb6\\x8f\\x02\\x02\\x01\\x46\\x01\\xa5\\x3f\\x81\\x2f\\x53\\xe5\\x81\\xc3\\xb9\\x63\\x12\\xb3\\x6b\\x9e\\xe0\\x4f\\xff\\x11\\xd9\\xea\\xb4\\xe4\\x51\\x48\\xdc\\xc8\\xf0\\xfa\\xb1\"},\n{{0x8b,0xc2,0x29,0xfc,0x23,0x46,0x53,0xb1,0x3c,0x92,0x47,0x10,0xcb,0x46,0x8b,0x8f,0xa9,0xb2,0x80,0xe2,0xad,0xb4,0x9c,0xb4,0xb3,0x6b,0xf5,0x9d,0x6f,0xa4,0xa6,0x39,},{0x46,0x14,0x69,0x75,0xdf,0x67,0x04,0xcb,0xf4,0x53,0x20,0xa5,0xe6,0xcb,0x6d,0xe8,0x13,0x46,0x9f,0x31,0x31,0xe6,0x1d,0x44,0x7b,0xbc,0xa1,0xa4,0x77,0xa0,0xc5,0x57,},{0xd2,0x43,0xb8,0x7d,0x13,0x97,0xd5,0x94,0x13,0x9d,0x83,0xc3,0x9a,0xcf,0x85,0x01,0xd0,0x73,0xbd,0x4b,0xe7,0x18,0xb4,0xc2,0x06,0x98,0x07,0x29,0xe7,0x20,0xa4,0xc5,0xb0,0xea,0x91,0xa2,0x8e,0xa1,0x26,0x04,0xa9,0x87,0xe6,0x95,0x91,0xc5,0x43,0x04,0x9f,0x29,0x73,0xbb,0x91,0xc1,0x70,0x21,0x3c,0x32,0xa6,0x4a,0x0f,0xac,0x82,0x04,},\"\\xba\\xe2\\xdc\\x7f\\x94\\xab\\x5c\\xcd\\xca\\xa8\\xcf\\x49\\xed\\xbe\\xf0\\xf6\\xd7\\xae\\xb1\\xfa\\x89\\x07\\x80\\x05\\x33\\xaf\\x44\\x92\\x61\\x11\\x94\\xe5\\x6c\\xef\\x37\\xb1\\xf0\\x33\\x30\\x37\\x38\\xae\\x2c\\x3b\\xc4\\x58\\x8f\\x5c\\xb3\\xd5\\x5f\\x34\\x5b\\x9a\\x40\\x7e\\x78\\x77\\x42\\xa0\\x6a\\xf0\\xb6\\xee\\x20\\xde\\xe3\\xdf\\xe9\\xc9\\x1d\\x76\\x2a\\x3e\\xbd\\x19\\xae\\xd0\\x79\\x07\\xbb\\xb9\\x1c\\xd7\\x76\\x32\\x65\\x40\\xde\\xd9\\xf7\\xff\\x7d\\xda\\x76\\x61\\x5f\\x97\\x8e\\x94\\x90\\xf4\\x06\\xed\\x2d\\x91\\x16\\xe2\\x09\\x3f\\xa7\\x85\\xe9\\x71\\xb5\\x06\\x2d\\x31\\xcb\\x40\\xff\\xf9\\xe3\\xc5\\x51\\xa7\\x3b\\x20\\x24\\x5d\\x46\\xdf\\x4d\\x7f\\xd1\\x30\\x3a\\x28\\x18\\x01\\x72\\xd9\\xa2\\xbf\\x55\\x93\\xc4\\x79\\x17\\xb5\\x86\\x90\\x91\\x7c\\x1f\\xb0\\xe1\\xe2\\x99\\x4d\\x1f\\xa9\\x77\\x35\\xae\\x37\\x8d\\xe6\\xea\\xfd\\x5c\\x1a\\x25\\xab\\xaf\\xa3\\xcf\\xd2\\xdf\\x7a\\xea\\xbd\\x6e\\x68\\xfc\\x44\\xed\\xf8\\x2f\\xc8\\x36\\x94\\xe5\\xd8\\x41\\xa1\\x5b\\x14\\x56\\x8b\\x61\\x10\\xbe\\x64\\x4b\\xf2\\x2b\\x71\\xfc\\x47\\xd7\\xf0\\x7e\\x16\\x66\\x95\\x7d\\x0f\\x87\\xda\\x17\\xf1\\x3f\\xcd\\x63\\xc1\\xc2\\x96\\x6f\\x68\\x7d\\x25\\xdc\\xbd\\x99\\x63\\xf0\\x1e\\xff\\x13\\x2d\\x5f\\x2b\\x86\\x67\\x78\\x16\\x58\\x8c\\x12\\x3e\\x94\\x57\\xbe\\xfc\\xce\\xd2\\xd3\\xcd\\x1d\\x1b\\xeb\\xe8\\xdd\\x8f\\xbb\\x15\\x87\\xe5\\x53\\xcb\\xcc\\x4c\\x87\\x62\\x06\\x4c\\xd3\\x2e\\xf7\\xa1\\x70\\x24\\x10\\xf7\\x7f\\x15\\x24\\x0d\\x7e\\x2b\\xb5\\x82\\xc6\\x78\\xc0\\xda\\x88\\xef\\x45\\x22\\x83\\x0b\\x14\\x36\\x60\\xac\\x9c\\x43\\x4d\\x95\\x77\\x2e\\x6e\\xee\\xed\\x60\\x14\\xae\\x16\\x82\\x4c\\xcd\\xc4\\xdf\\x2d\\xf6\\x4a\\xeb\\x69\\x80\\xb5\\x1d\\x11\\x89\\x85\\xdc\\xbb\\xd1\\x96\\x1f\\x31\\x5e\\x6a\\x94\\x33\\xf0\\xb9\\x6b\\x1e\\x63\\x51\\x25\\x7e\\xad\\x83\\xe0\\x5b\\x4c\\xc8\\x9c\\x92\\x4b\\xf8\\x35\\x58\\xba\\x7d\\x2e\\x7c\\xa3\\x7c\\x03\\x17\\x9a\\x8f\\x85\\xb8\\x31\\xe7\\x21\\x7b\\xf4\\xc5\\x53\\x83\\x87\\x61\\xd3\\x26\\x02\\x85\\x3b\\x81\\x59\\x3b\\x0e\\xbf\\x8e\\x4b\\x9f\\xfa\\xf0\\xec\\x40\\x5b\\x2a\\x83\\xaf\\x7d\\xe5\\x55\\x4d\\xaa\\xd2\\x8b\\x58\\x2e\\xe0\\x8b\\xd8\\x4b\\x37\\x55\\x50\\xca\\xe0\\x8a\\xe4\\xa5\\xbd\\xa7\\x15\\x81\\xfc\\x3b\\x7b\\x54\\x49\\x8c\\x4e\\x1a\\xfb\\x96\\x6b\\x4a\\xf1\\xd9\\xc8\\x43\\xa6\\xb2\\x5b\\x34\\xe0\\x4c\\xfd\\x9b\\xd2\\x37\\x42\\x44\\xf1\\xfe\\x20\\xec\\x62\\xbe\\x3c\\xcf\\xab\\x4e\\xde\\xf7\\x9e\\xd6\\x4e\\x6b\\x71\\xaa\\x92\\x28\\x12\\x7c\\x63\\x59\\xea\\x1c\\x4a\\x80\\x87\\x89\\x08\\x96\\xff\\xa4\\x6e\\x00\\x92\\xde\\xc7\\xef\\xbc\\x96\\x0a\\x17\\xb7\\x70\\x91\\x6f\\x95\\x40\\x70\\x13\\x2e\\x26\\xd9\\x8d\\x97\\x74\\xa2\\xac\\xdf\\x80\\x9d\\x58\\x6d\\xf0\\x25\\x2f\\x67\\xcf\\xe8\\xd9\\x85\\xa3\\xe2\\x48\\xdb\\x0f\\x90\\x73\\x1a\\xce\\x7a\\xbd\\x99\\x9c\\x74\\x6b\\x69\\x64\\x8d\\x5c\\x3b\\x4b\\xd6\\x11\\x37\\xe0\\x8f\\xcc\\x8b\\x2e\\xfc\\x56\\x76\\xbc\\xd8\\x56\\xa1\\x3b\\x36\\x21\\x51\\x47\\x4c\\x4a\\x1e\\xfd\\xed\\xc5\\x92\\xcf\\x3e\\xad\\x1a\\xba\\xbc\\xd4\\x8e\\xe2\\x04\\xd2\\x77\\x26\\xad\\x1b\\xda\\x4f\\xe4\\xb0\\x9a\\xb5\\x10\\x89\\xd0\\x16\\xde\\x6b\\xa2\\x59\\xea\\x81\\x80\\x7f\\xaf\\x21\\x1c\\x87\\xe4\\xc9\\xef\\xbf\\x6a\\x4c\\x75\\x3e\\x08\\xf7\\x80\\xed\\x55\\x33\\x8c\\x0f\\xde\\x14\\xfb\\x99\\xb3\\x07\\x22\\xb5\\x59\\x4b\\x3a\\xbe\\x02\\x04\\x7f\\x46\\x62\\x42\\x42\\x1f\\xb8\\x11\\x76\\xc9\\xc4\\xf0\\xfd\\x2b\\x5e\\x7c\\x5a\\x0f\\x65\\xa0\\xc5\\x9a\\xa8\\xc3\\xa9\\x86\\x08\\x7d\\xe7\\xba\\x40\\xba\\xca\\x77\\xbd\\x36\\xac\\x21\\xce\\x34\\xe9\\xfe\\x97\\xfa\\xcc\\x4e\\x29\\x83\\x30\\xee\\xce\\x1c\\x8e\\xc6\\x23\\xe6\\x6a\\x4b\\x0f\\x23\\x42\\xd2\\xc5\\xa0\\x2c\\x5f\\x5a\\xbd\\xdc\\x5f\\xf1\\xf1\\xf2\\xd0\\x3c\\x1d\\x4e\\xe9\\xb4\\xb3\\x42\\xed\\x3b\\x1c\\xc2\\x65\\x61\\xf3\\x21\\x7b\\xf8\\x50\\x0e\\x08\\xf0\\x27\\x57\\x1c\\x53\\xc9\\x23\\x26\\x05\\xa5\\x3f\\x2b\\xda\\x02\\x4e\\x39\\x92\\x91\\x63\\xa8\\xe0\\x07\\x91\\xac\\x06\\x56\\xbb\\x07\\x83\\x82\\x5e\\x71\\x05\\xff\\xa9\\xd9\\x09\\x69\\xdc\\x09\\x4a\\xf4\\x6f\\x70\\x2e\\x85\\xcc\\x11\\xe4\\x42\\xb3\\xd5\\x53\\x4c\\x1d\\x32\\x75\\x20\\x7d\\x6d\\x29\\xa9\\x42\\xc3\\x58\\xed\\x5f\\xa0\\x75\\x57\\xc3\\xc0\\x14\\xcf\\x54\\x1f\\x9a\\xae\\xea\\x60\\x25\\xb4\\x1e\\xcd\\xd8\\x48\\x51\\x2b\\xa2\\x5e\\x72\\x1e\\x43\\xd3\\x29\\x18\\x5f\\x8f\\x94\\x89\\x2e\\x9e\\x2d\\x5e\\x7c\\xbb\\x99\\xe7\\xad\\x25\\xf6\\x9e\\x5b\\xef\\x73\\x2c\\xfc\\xeb\\x07\\x86\\x11\\x55\\x3c\\xc7\\x83\\x77\\x37\\x5e\\x74\\xe6\\x6f\\x1b\\x9d\\x8d\\x20\"},\n{{0x3e,0xdb,0x50,0xff,0x07,0x4e,0xf9,0x71,0x7f,0x4f,0xb0,0xb6,0xce,0x25,0x2b,0xf4,0xbd,0x04,0x9c,0x90,0x83,0x77,0x5f,0x52,0x9e,0xaf,0x51,0xe9,0x75,0xcb,0x32,0x45,},{0x4b,0xc2,0x1f,0xe0,0x3e,0x67,0x9a,0xbb,0xfc,0xd8,0xc5,0xea,0x2b,0xcc,0x4d,0x83,0x8a,0x78,0x7d,0x48,0x40,0xc3,0xbc,0x39,0xde,0x4b,0x04,0xc4,0x17,0xc7,0x68,0xa5,},{0xde,0xb3,0xd9,0xfc,0x7b,0x2d,0x86,0xab,0x4b,0x92,0x6f,0x99,0x52,0x79,0x70,0xab,0xb5,0x18,0x38,0xbc,0xc2,0x91,0x9e,0x94,0xcd,0xa3,0x37,0x1f,0xd0,0xe7,0x69,0x3f,0xe3,0x7e,0x0c,0x40,0xe1,0x23,0x3b,0x09,0xff,0xa9,0x03,0xa0,0x34,0xdd,0xe2,0x87,0xc0,0x23,0x7d,0xc5,0x94,0xf5,0x3a,0xbc,0x87,0x84,0x48,0x69,0xdc,0xe9,0x20,0x02,},\"\\x97\\x5e\\xce\\x4e\\x81\\xf0\\x01\\x5f\\x5a\\xc3\\x04\\x46\\x09\\xd0\\xac\\x3a\\x8d\\xf9\\x14\\x5b\\x50\\xc4\\x28\\x89\\xdd\\x31\\x2f\\x56\\x3c\\xf6\\x12\\x6e\\x36\\xff\\xfa\\xf2\\x1e\\xb6\\xb8\\x4f\\xbd\\xa1\\x5a\\xa8\\x5c\\x66\\x14\\x5f\\x75\\x41\\xe5\\xb4\\x1a\\x8e\\x81\\x70\\x0b\\xe3\\x56\\x22\\x4f\\xc1\\x09\\x32\\x7a\\x69\\x19\\x66\\x56\\x73\\x53\\x4f\\x5c\\x8a\\x4a\\x00\\x17\\x50\\xb1\\x99\\xdb\\xfd\\x63\\x06\\x91\\xaf\\x55\\x2d\\x4d\\x26\\xa9\\xd9\\xaf\\xb3\\x3a\\x16\\xaf\\x39\\x11\\x54\\x12\\x4b\\x53\\x42\\x6c\\x9f\\x69\\x50\\x57\\xb1\\x81\\x4f\\xd6\\xd3\\x10\\x29\\x8a\\xf6\\xc8\\x30\\x68\\x6a\\x4a\\x00\\x7a\\x14\\xe0\\x05\\x7b\\x72\\xfb\\xad\\x5b\\x80\\x3a\\xd3\\x53\\xd1\\xc3\\xfd\\xb8\\x90\\xa9\\xc8\\x18\\x08\\xe8\\x9f\\x22\\x91\\x87\\xbc\\xb4\\x4f\\xee\\x16\\xa4\\xeb\\xca\\xd5\\xeb\\xa4\\x59\\xb0\\x28\\x27\\x2a\\x56\\x2c\\x05\\x07\\x9f\\xa7\\xae\\x3e\\xca\\xe8\\x04\\xa9\\xe8\\xc4\\xf3\\xf3\\x15\\x81\\x3c\\x5e\\xe0\\x84\\x1b\\xbc\\xcf\\xe4\\xa9\\x56\\x23\\xb5\\x17\\xa4\\xb4\\x2b\\x2c\\x6d\\x97\\xa3\\xbf\\x26\\xac\\xdb\\xe2\\xe9\\x79\\x63\\x3f\\x02\\xaa\\xc4\\x66\\x52\\x6a\\x3e\\xbb\\x14\\xda\\x19\\xbc\\x95\\xf2\\xc3\\xfd\\xf6\\xbd\\xb0\\x8b\\xe8\\xbd\\xe9\\x7a\\x86\\x4c\\x90\\x7e\\x91\\x8c\\x67\\x9a\\xb7\\x26\\xf8\\x01\\x77\\x14\\x58\\x40\\x21\\x6b\\x9d\\xc3\\xf9\\x81\\xef\\x17\\x87\\x4f\\x08\\xb2\\xfc\\x66\\x11\\xa6\\x34\\x6c\\x3d\\xa6\\xa5\\x5e\\xcf\\xa7\\x53\\xc9\\x91\\x9f\\x4f\\x19\\xe3\\xc7\\x90\\x93\\xbf\\xd7\\x8f\\x86\\x15\\x98\\xe4\\x66\\x6e\\x1c\\xab\\x68\\x8e\\x46\\x04\\xd4\\x6c\\x9c\\x58\\x2e\\xad\\xb9\\x2c\\x98\\x8f\\x47\\x8d\\x16\\x0f\\x5a\\x15\\x18\\x2b\\x33\\x40\\x20\\x17\\x97\\xd0\\xb9\\x55\\x28\\x2e\\x4a\\x21\\x7b\\x50\\xb1\\x4b\\x10\\xc9\\xf4\\x90\\x67\\xea\\x3e\\x84\\xe5\\x27\\x4d\\xca\\xec\\x74\\x47\\x4c\\x57\\x07\\xc2\\x8b\\xba\\x0d\\xb8\\xcd\\xe3\\xe8\\x38\\xd7\\x31\\x3c\\x17\\x1b\\x85\\xff\\x2b\\x9a\\x3d\\x2b\\x16\\x7e\\x90\\x61\\xf8\\x4d\\xf3\\xb1\\x3b\\xdd\\x08\\xb2\\xd5\\x01\\xe5\\x37\\x92\\xd6\\x80\\x54\\xd0\\x48\\xab\\xfe\\x3b\\xce\\x98\\xd9\\x78\\x25\\x6f\\x2f\\xd2\\xc6\\xc4\\xe7\\x6f\\x39\\x68\\x8c\\xcc\\xf0\\xfe\\x14\\x9a\\xf9\\xd3\\x47\\xe7\\xb0\\x40\\xef\\x24\\x1d\\xd5\\xa5\\x3e\\xaa\\x5e\\xab\\x35\\xa1\\x8c\\x68\\xc7\\x54\\xa0\\x6b\\x03\\x39\\x9b\\xbe\\x56\\xa2\\x52\\x68\\xc8\\x29\\xa5\\xba\\x82\\xb2\\x81\\x92\\x04\\x1d\\x3b\\xd2\\x44\\xeb\\x08\\xbf\\x78\\xe7\\x6d\\xef\\x87\\xcd\\x09\\xf3\\x2b\\xea\\xc9\\xbb\\x63\\x98\\x23\\xb3\\x69\\x67\\xa5\\x74\\xd8\\x96\\x0d\\x1b\\xd0\\x34\\x35\\x67\\x9d\\x93\\xed\\xdc\\x55\\x80\\x63\\xc5\\x40\\xb9\\xc2\\xf6\\x09\\xfe\\xd2\\xe2\\xe3\\x57\\x6d\\x19\\xe6\\x20\\x9e\\xab\\x46\\x6c\\x20\\x67\\x91\\xc3\\xaa\\x19\\x96\\x23\\xfb\\xae\\x7d\\x34\\x97\\xe8\\x0f\\xdd\\x3f\\xcb\\xaf\\x5b\\x89\\x11\\x0e\\xd7\\x22\\x44\\x23\\x4b\\xe8\\x5c\\xca\\x4b\\x27\\xa0\\x9b\\xb7\\x0a\\x26\\xec\\xe4\\xeb\\x8d\\xd9\\x70\\xa2\\x6e\\x5b\\x04\\x36\\x1f\\xa5\\x0e\\x90\\x38\\x0e\\xd6\\x5f\\x41\\x4c\\x1b\\xe9\\xf5\\x06\\x4f\\x71\\x42\\x91\\x16\\x26\\x7e\\xdd\\x69\\x76\\x42\\x2a\\xd9\\x2d\\xeb\\x2b\\x80\\x4a\\x92\\xe8\\x1c\\x9f\\x65\\x22\\xa0\\xf3\\xb5\\xd8\\xad\\x36\\xb4\\xf8\\x7d\\xb5\\x16\\xa2\\x28\\x73\\xe6\\xf2\\x72\\x84\\xf2\\xca\\x36\\x0a\\x2f\\x40\\xff\\x3d\\x8e\\x23\\xde\\xc8\\xef\\x8a\\x17\\xa4\\x3a\\xcb\\xb6\\x12\\x71\\xa7\\x27\\xcb\\x86\\x90\\xd2\\x9b\\xb8\\x20\\x16\\x73\\x6b\\x31\\x02\\x62\\x01\\xdd\\x3d\\x38\\x8d\\x2c\\x64\\x3a\\x73\\xcf\\xbd\\x0a\\x94\\xe2\\x05\\x51\\xfb\\x5f\\x8e\\x1f\\xfc\\x39\\x74\\x12\\x72\\xaa\\x23\\x08\\xdc\\x8d\\x21\\x33\\xa3\\xfa\\x9c\\xf1\\x09\\x79\\x6d\\x69\\xd2\\xcc\\x8a\\xdd\\xc4\\x4a\\xe2\\x52\\x77\\x81\\xee\\x99\\x3a\\xf2\\xa6\\x37\\xa8\\x72\\xf0\\x2a\\xff\\x47\\x4a\\x70\\x73\\xf2\\x9d\\x9c\\x89\\x50\\x77\\x01\\xfe\\xcb\\xbf\\xd5\\x10\\x13\\x53\\x53\\x7e\\xba\\x17\\xc2\\x96\\x69\\xda\\xc0\\x42\\x7e\\x38\\xe2\\x2d\\xfa\\xac\\x91\\xfc\\x20\\xd9\\xe3\\xfe\\xe7\\x91\\xf4\\x62\\xa8\\x63\\xbb\\x19\\x08\\xfb\\x1e\\x42\\x04\\xb6\\x88\\x80\\x31\\x4d\\xda\\xca\\xaa\\x35\\xa1\\x7a\\xf5\\xf5\\x7a\\x39\\x9f\\x19\\x31\\xe7\\x8f\\x5a\\x37\\x45\\x4f\\xd3\\x8c\\x57\\xa6\\x8e\\x8d\\x36\\x78\\x48\\xa9\\x73\\x45\\x18\\x9c\\x70\\x07\\x7f\\xd1\\xaa\\x07\\x54\\xe7\\x03\\xe3\\x52\\x61\\x80\\x63\\xb9\\xe3\\xfa\\xf3\\xb1\\x4b\\x5f\\x0b\\x27\\x11\\x36\\x33\\xc5\\xd1\\x73\\x63\\x74\\x1e\\x96\\xa6\\x7e\\x81\\x64\\x01\\xe8\\x09\\x8c\\x17\\xbf\\xfe\\x9c\\x6f\\x35\\x87\\x64\\x6f\\x40\\xe9\\xfd\\xb6\\x81\\x9f\\xd2\\x2a\\x74\\x3a\\x7a\\x6e\\x10\\xfe\\xba\\x11\"},\n{{0xcd,0xa4,0xba,0x93,0x94,0x0a,0xa0,0xc0,0xc3,0x15,0x0b,0x39,0x29,0xb9,0x5e,0xe7,0x76,0x9c,0xe4,0x3f,0xd9,0x8e,0xca,0xff,0x9c,0x4a,0x50,0x9e,0x73,0x6d,0x5c,0x8e,},{0xf4,0xc7,0xa2,0x5f,0x1a,0x74,0x3d,0xaf,0x41,0x41,0x7e,0x47,0xe0,0x27,0x53,0x7f,0x24,0xf4,0x81,0xbd,0x1a,0x75,0xe6,0xb1,0xd3,0x3e,0xc4,0xc8,0x2c,0x55,0xa2,0xd3,},{0x31,0x04,0x8d,0x33,0x4a,0xf0,0x5a,0x4f,0x27,0x5f,0xf8,0x27,0x54,0x4e,0xa2,0x96,0xa4,0xa7,0x75,0xfa,0x59,0xef,0xa0,0x00,0xc5,0x76,0x13,0xfa,0x6e,0x5c,0x49,0x3c,0x3a,0x9b,0x79,0xe8,0xce,0x56,0xe7,0x22,0x5b,0x0f,0xa3,0x26,0x20,0x4f,0x03,0x36,0xc2,0x13,0x53,0x5a,0xe5,0x89,0x17,0x7a,0x8e,0xae,0xdb,0x6d,0xf8,0xb2,0x02,0x03,},\"\\x3a\\x1d\\x66\\x8c\\x66\\x88\\x41\\x48\\x96\\xa7\\x69\\x7f\\x3c\\x2e\\x43\\x10\\x98\\xed\\xfc\\x45\\x7e\\x04\\xd2\\xda\\x86\\x95\\x68\\xad\\x5b\\x33\\x10\\xe5\\x9e\\x4c\\x72\\x7c\\x90\\x3c\\xbf\\x18\\x17\\x40\\x88\\x02\\x31\\x9a\\x8c\\x23\\x1b\\x58\\x02\\x3d\\xfa\\xe4\\x94\\xc0\\x13\\xaf\\x0f\\xdb\\x78\\xc9\\x1d\\x5b\\x45\\x7f\\x8c\\x47\\xa3\\xdc\\x31\\xd8\\xc8\\x59\\x4a\\xa0\\x8f\\x14\\x62\\x03\\xfa\\x2c\\x28\\xb3\\xdd\\x79\\x6a\\x11\\xa9\\x7a\\xde\\xde\\x6a\\x7a\\x70\\x9b\\x5a\\x19\\x18\\xef\\x1b\\xea\\x83\\x53\\x3c\\x78\\x34\\x73\\x70\\x33\\x56\\xf5\\xbe\\xea\\x7f\\xd1\\x8a\\xc4\\x4e\\xc6\\x89\\x04\\x95\\xed\\x17\\x0d\\x03\\xf1\\x5b\\x41\\x86\\x08\\xa7\\xd9\\xef\\xd5\\x2f\\xa1\\x09\\x18\\x63\\x80\\x51\\xc4\\x48\\xd9\\x8d\\x57\\x24\\xf5\\x67\\xc8\\xc6\\x7f\\xd5\\xb6\\xec\\x8c\\x3d\\x63\\x60\\x08\\xb9\\xba\\xe5\\xe8\\xb1\\xe9\\x84\\xf8\\xff\\xb8\\xb6\\x4b\\xee\\xbd\\x63\\x45\\xa1\\x05\\xc1\\xc1\\x08\\x31\\x32\\xfd\\x45\\x08\\xd6\\xac\\x0d\\x4e\\x91\\x45\\x50\\x12\\x10\\xe5\\x17\\xd9\\xb2\\x24\\x78\\xe2\\x15\\xb6\\x02\\x59\\x9f\\x80\\x37\\x62\\xdc\\xd5\\xa4\\x09\\xb3\\x46\\x0e\\x7f\\x34\\x0f\\x47\\xef\\x77\\x28\\x1a\\xd2\\x38\\x3d\\xe0\\x8c\\x5b\\x80\\x95\\x38\\xaa\\xec\\x92\\x2b\\xfc\\xa0\\xd6\\x75\\x2f\\x14\\x79\\x72\\x64\\x6d\\x0a\\x8d\\x83\\x40\\x77\\x2c\\x87\\x1d\\x3b\\x34\\xab\\xc0\\x60\\x37\\xde\\x3a\\xb4\\xe3\\x71\\x29\\x86\\x5d\\x5b\\xa7\\x0b\\x6f\\x3c\\xc9\\xa0\\x59\\xef\\xb7\\xdd\\xdc\\x38\\x82\\xf4\\xfc\\xfe\\x13\\xf4\\x48\\xc9\\xbc\\x66\\x48\\x88\\x58\\x96\\x03\\xba\\x98\\x68\\x3a\\x93\\xb4\\xb3\\xb1\\x01\\x49\\x92\\xa5\\x5c\\x8e\\x4e\\xa1\\xba\\xf9\\xcc\\x00\\xd1\\xba\\xdf\\xf5\\xfd\\x7f\\x5d\\xa5\\xe3\\x07\\xfb\\xd1\\xb4\\xc9\\x84\\xe0\\xfa\\x0e\\xde\\xc5\\xd3\\x0b\\xfe\\xf5\\xf4\\x77\\x30\\x12\\x63\\xb5\\xd7\\x52\\x00\\x1b\\x85\\xdd\\x52\\xdf\\x3b\\x4a\\x7a\\xc2\\x3b\\x93\\x0a\\x91\\xc0\\xa4\\x57\\x65\\xa6\\x64\\x88\\xd8\\xeb\\x59\\x01\\x85\\x70\\x60\\x06\\x7b\\x82\\x37\\x81\\x88\\x54\\x92\\x88\\xdd\\xc6\\x18\\x31\\xe5\\xb6\\x84\\x1b\\x34\\x4c\\xae\\x22\\x50\\x04\\x22\\x19\\xcf\\xb4\\xac\\xe0\\x23\\xe6\\x91\\xf9\\xe4\\x8d\\x00\\x6e\\x9a\\x07\\xc6\\x7d\\x24\\x68\\xf9\\x35\\x93\\xb4\\xaf\\xc1\\x61\\xc0\\x76\\x8b\\x6c\\xeb\\x74\\x4c\\x24\\xc9\\x23\\xda\\x34\\xaf\\x3d\\x5e\\xd5\\x77\\xcc\\x7f\\x85\\xd4\\x91\\x56\\x0f\\x4c\\x0b\\xcb\\xcd\\x1d\\x5e\\x34\\x21\\xbd\\x1c\\xcf\\xaf\\xb3\\x73\\xd6\\x51\\xbd\\x61\\xed\\x71\\xc0\\x9e\\x99\\xf6\\x12\\x00\\x17\\x04\\xd0\\xc6\\x30\\xd8\\x54\\x7b\\xd9\\x70\\xb6\\x6e\\x7f\\x5c\\xe7\\xa0\\x14\\xe0\\xff\\x5a\\x33\\x7d\\xc5\\xc5\\x6a\\x99\\xf1\\x31\\xb9\\x12\\x91\\x40\\xee\\xea\\x39\\x39\\x7c\\x48\\xca\\xa9\\xa8\\x08\\x6f\\x9f\\xd9\\x91\\x50\\xbe\\x7e\\xf8\\x7b\\x6d\\x4b\\x94\\xb1\\xbd\\x52\\x87\\x8b\\xf3\\xbb\\xfc\\xce\\xac\\xc2\\xcc\\x45\\xe8\\x97\\x1c\\x3a\\x4d\\x4a\\x3e\\xb8\\x6a\\xf9\\x87\\x4d\\x4f\\xa5\\xe7\\xca\\xa7\\xf4\\x5d\\x15\\x53\\xff\\xbb\\x41\\x64\\x5b\\xf0\\xf5\\xe9\\xb2\\x97\\x72\\xe3\\xdc\\x08\\x1b\\x25\\xb5\\x2e\\x1c\\xb7\\xe2\\x16\\x74\\x83\\xd5\\x4f\\xba\\x69\\x0d\\xdb\\x29\\xd5\\x46\\x2d\\x2a\\x27\\xa3\\x5d\\x85\\xf0\\x07\\xad\\xed\\xe2\\xa3\\xdd\\x72\\x81\\xf6\\x54\\x33\\x6a\\xfa\\xfb\\x73\\x70\\x78\\x2b\\x29\\xca\\xd6\\x43\\xd9\\xd9\\xdb\\x2f\\x05\\xf2\\x81\\xb5\\x3e\\x13\\x3e\\xc3\\x0e\\xec\\x09\\xfb\\x0d\\x06\\x1b\\x74\\x58\\x1a\\x2b\\xd2\\x79\\x0b\\x13\\x73\\x91\\xf1\\x93\\x28\\x88\\x0f\\x64\\xc5\\x3b\\xe7\\x00\\xd0\\xfa\\xdd\\xb7\\x0d\\xc1\\x65\\xd2\\xd6\\x2e\\x67\\x1e\\xb9\\x44\\x9a\\x2e\\x6e\\x9d\\xf2\\xc1\\x6d\\x8f\\x49\\xfa\\x4b\\x5b\\x84\\x30\\x9f\\x73\\x35\\x13\\x3d\\xbe\\x87\\x2c\\x5a\\x8f\\xdc\\xfb\\xc4\\x98\\x0a\\xbf\\xb3\\xc9\\x59\\x7d\\x5d\\x66\\x7a\\xd2\\xf6\\x88\\xc7\\xab\\x24\\xc9\\xe4\\x40\\x29\\x8d\\x72\\xb2\\x8b\\x0f\\xcd\\xe9\\xc6\\xf0\\x71\\xbc\\xcc\\x93\\xe8\\xdd\\xbb\\xa7\\xb6\\x0a\\x0b\\x54\\x4a\\x2e\\x06\\xc3\\x9c\\x67\\x23\\xd4\\xf7\\xdc\\x18\\x5c\\x21\\x13\\x5f\\xd1\\x3a\\x72\\x77\\x0b\\x97\\x61\\x19\\xe4\\x9a\\x1f\\x81\\xed\\x47\\x6b\\xe0\\x7c\\x44\\x3d\\xe0\\xb0\\xee\\x76\\xfb\\xd9\\x19\\x38\\x93\\x28\\xb3\\xeb\\x86\\x07\\xbc\\x2f\\xe3\\x8f\\x85\\x74\\x5e\\x28\\xad\\xb7\\x48\\x2b\\x70\\x1c\\xcc\\x66\\x90\\xe4\\xae\\x5a\\x93\\x32\\xea\\x44\\x61\\x31\\x79\\x38\\x7d\\xc6\\xfc\\x47\\xc1\\xd1\\xec\\x36\\x60\\x35\\xe9\\x91\\xe1\\x40\\x43\\x23\\xbd\\xbb\\xf5\\x35\\xf1\\xc3\\x3c\\xf5\\x7b\\x67\\x23\\xf1\\x3c\\xa6\\xca\\x32\\x9e\\x2a\\xaa\\x4b\\x46\\xb4\\x26\\x07\\x33\\x99\\x06\\xc7\\xef\\x49\\xb3\\x2d\\xb8\\x2c\\xdf\\x6a\\x87\\xad\"},\n{{0x21,0x7e,0xcd,0x6a,0x7f,0xcc,0x98,0x71,0x92,0x10,0xc3,0x4c,0xc2,0xe1,0x4f,0x5e,0x2d,0x6b,0x5a,0x22,0xf2,0x68,0xc1,0x4b,0xc4,0xd8,0xa7,0xf2,0x81,0x72,0x00,0xc3,},{0xd5,0x91,0x91,0xce,0x28,0x2d,0x72,0xfe,0x3a,0xc4,0x58,0x78,0xe2,0x4b,0xb2,0xf2,0x8c,0x40,0x9b,0xa0,0x5d,0x76,0xce,0x9b,0xcf,0x22,0xf5,0x0b,0x0c,0x77,0x86,0x75,},{0xa0,0xb1,0x69,0xe8,0xe9,0xce,0x55,0x75,0x55,0xe0,0x33,0x4a,0x0d,0xe7,0x43,0x8e,0x55,0x36,0x75,0x48,0x9e,0xa4,0xba,0x9c,0xc6,0x3a,0x23,0x4d,0x00,0xde,0xd8,0xab,0x69,0x67,0xa3,0xbe,0x90,0xef,0x69,0xe0,0x76,0xdb,0x9e,0xa3,0xd5,0xca,0x23,0xb3,0x24,0x8d,0xd2,0x59,0x91,0xee,0x1f,0x4d,0x80,0x62,0x0b,0xf4,0xdb,0x43,0x8f,0x0e,},\"\\x9b\\x53\\x37\\xe7\\x8f\\xb3\\x82\\xf2\\x2e\\xa6\\x0e\\x03\\xc0\\xbf\\x3e\\xe4\\x70\\x0b\\x69\\x78\\xa9\\x1e\\xe6\\xac\\xdf\\x6a\\x40\\x9e\\x49\\x18\\xd1\\x68\\x48\\x81\\xfa\\x1d\\x11\\x8c\\x08\\xc9\\xf6\\xf2\\xca\\x0c\\xab\\x56\\x74\\x02\\xc9\\x50\\x10\\xe7\\xab\\xdf\\xe8\\x48\\xae\\x79\\xba\\x24\\x9a\\xdc\\xb9\\x6e\\xae\\x1d\\xfa\\x08\\x43\\x95\\x21\\x39\\xcf\\x49\\xb5\\x88\\x64\\x78\\x95\\x69\\x1a\\x2e\\x98\\x80\\x46\\x6b\\x7e\\x77\\xe5\\x4f\\x6f\\x60\\x81\\x5e\\xbf\\xd5\\xe5\\x74\\x8f\\x41\\x3c\\x0e\\x15\\xf9\\xd5\\x76\\x79\\x9b\\xcf\\x31\\x28\\x47\\x10\\x63\\x6f\\x6e\\x9d\\xc7\\x87\\x85\\x00\\x79\\x6e\\xed\\x80\\xc8\\xaf\\x4b\\xe2\\x96\\x19\\x52\\xea\\x80\\xbb\\xed\\x14\\x04\\xbd\\x5d\\xae\\x9e\\x6d\\x05\\xfd\\x4f\\x32\\x5a\\x3b\\x83\\xcd\\x45\\x28\\xa0\\x86\\x9c\\xef\\x84\\xb4\\xd3\\x0e\\x02\\xf9\\x41\\xd7\\x49\\xa8\\xda\\xc9\\x7b\\xb3\\xfa\\x83\\x9d\\x25\\x73\\x9b\\x97\\xec\\x37\\x45\\x36\\xbd\\xea\\x50\\x04\\x84\\xa9\\x41\\xdb\\x9f\\x22\\x99\\x97\\x06\\x58\\xd4\\x11\\x48\\x29\\x5c\\xa0\\x84\\x6c\\xa2\\x36\\x62\\x38\\xb6\\x20\\x1a\\x48\\xb3\\xe4\\x47\\xed\\xbe\\xa7\\xa4\\xc8\\xf7\\x10\\x20\\x14\\x27\\x69\\xe1\\x5f\\xa7\\x2a\\xe5\\xf2\\x87\\x14\\x0b\\xc5\\x95\\x3b\\x8a\\x9a\\x24\\x2d\\x20\\x5f\\xc0\\x19\\x09\\x1f\\x2a\\xbe\\xd0\\xfd\\xa4\\x7f\\x52\\xd5\\x9a\\x02\\x04\\xce\\x74\\x01\\xc1\\x82\\x9b\\x58\\x57\\xb9\\xa0\\x91\\x6f\\xce\\xbe\\x2e\\xef\\x99\\x1c\\x41\\x3a\\xcd\\x71\\xb1\\x8d\\x85\\x90\\xd6\\xb6\\xd0\\xfb\\x39\\x94\\x30\\x26\\x78\\xc2\\x9f\\x2b\\x6a\\x53\\x02\\x3f\\x91\\x87\\xe4\\x6c\\x36\\x79\\x0b\\xce\\x73\\x87\\x3c\\x54\\x5a\\x72\\xbe\\xb5\\x53\\x29\\x4b\\x1e\\xe5\\xd0\\xd0\\xdf\\xf2\\x39\\xe2\\x8e\\xc6\\x3b\\x01\\xe4\\xd8\\xfe\\x0d\\x6e\\x69\\xb1\\x60\\x1e\\xfa\\x24\\x11\\xf0\\xc0\\x60\\x1e\\x7e\\x4f\\x65\\xc9\\x84\\xf8\\x29\\xf0\\xdc\\x2a\\x84\\x21\\xe7\\xf6\\x6d\\x93\\x30\\x53\\x71\\x51\\xc7\\x24\\x3c\\xa5\\x24\\xd7\\xa5\\x47\\x35\\xc6\\xe3\\x44\\xf1\\xfc\\x93\\x8e\\xae\\xea\\x27\\x79\\xc9\\x40\\x89\\x1d\\x6d\\x01\\xaa\\x55\\xf4\\x0c\\xc1\\xad\\xba\\x12\\xe8\\xa6\\x7a\\xd9\\xa2\\x7f\\xe6\\x3f\\xb4\\xf3\\x8d\\xc0\\xf0\\x18\\x41\\x92\\x57\\x18\\x42\\x72\\x55\\xbd\\x66\\x5d\\x5e\\xb3\\xbc\\x86\\x98\\x96\\xdb\\x86\\x25\\x20\\x4a\\xd4\\xb0\\x2f\\x5a\\x22\\xaa\\xee\\xad\\x6e\\x30\\x04\\x71\\xfe\\xa6\\x1d\\xbb\\x1b\\x55\\xc0\\x71\\x36\\x5c\\x58\\xb1\\x51\\x1f\\x38\\xb0\\x9a\\x46\\x71\\xbd\\x66\\xb3\\xfe\\xdd\\xa9\\xc8\\x7e\\x43\\xd1\\xeb\\xf3\\x01\\x76\\x4e\\x18\\xfc\\x0c\\xf1\\x6b\\x2d\\x2d\\x67\\xed\\x23\\x9b\\x39\\x3a\\xc7\\x19\\x68\\xa9\\x03\\xc0\\x24\\x77\\xfb\\x2d\\xf9\\xef\\x01\\xdb\\xfc\\x31\\x67\\xde\\x72\\x65\\xf8\\x91\\xe4\\xfd\\x24\\xd0\\x2c\\x63\\x10\\x35\\x19\\xb8\\x6a\\x70\\x85\\xb1\\xec\\x2f\\xb4\\x19\\xdb\\x76\\x6b\\xee\\x7a\\x64\\x1a\\x4b\\xe4\\x29\\x61\\x4a\\xb8\\x9f\\x20\\xf9\\x75\\x34\\x10\\x72\\xbf\\x04\\x41\\x9f\\xb6\\x9b\\xe7\\xa9\\xee\\x71\\xa5\\xb4\\x9a\\xf8\\x3e\\xd3\\x22\\xba\\xc6\\x8a\\x42\\x9f\\xf5\\xc5\\x20\\x67\\x73\\xbe\\x54\\x38\\xb6\\x5e\\x53\\xf6\\x09\\x72\\x9f\\x4f\\x6a\\x21\\xc1\\x33\\x39\\x11\\x26\\x4d\\x63\\x92\\x70\\x17\\xe8\\x13\\x6b\\x47\\x25\\xcd\\x1c\\xc9\\x64\\xe0\\x8c\\xa0\\x93\\x3a\\x56\\x1e\\x7e\\x3f\\x59\\x87\\x76\\x83\\x30\\xe2\\xe5\\x4f\\x8d\\x72\\x8f\\x59\\xed\\xfe\\x2c\\x91\\xc4\\xf9\\x9a\\xef\\x97\\xd1\\x85\\x59\\x19\\x5a\\x3d\\x8e\\xb3\\x15\\xdf\\xf9\\x6f\\xe2\\x76\\xda\\x71\\x37\\xef\\xf9\\x30\\x57\\xac\\x73\\x1e\\x06\\xa6\\x0a\\x58\\xbd\\x8a\\x9a\\xe8\\xc7\\xcb\\xaf\\xf0\\xcb\\x33\\x72\\xc6\\x8d\\xaa\\x17\\x5c\\x42\\x8d\\x52\\xf1\\x07\\x3a\\x38\\xbf\\x29\\x46\\x5d\\x2a\\x71\\x28\\xbb\\x40\\x07\\x40\\x06\\xed\\xcb\\x72\\x5a\\x83\\x1d\\x81\\x28\\x64\\xef\\x43\\xf3\\xb8\\x66\\x7c\\x9f\\xb7\\x10\\x93\\xa1\\x67\\x30\\x49\\xde\\xc0\\x5e\\x09\\x16\\x9d\\x86\\xfe\\xe9\\x2d\\xf2\\x86\\x00\\x8a\\xd9\\x90\\x65\\xa2\\x92\\x97\\x97\\xa9\\x13\\xd0\\x23\\x3f\\x4d\\x1a\\x95\\xa2\\x20\\xbd\\x91\\xc1\\x1d\\xd9\\xc4\\x56\\x85\\xdc\\xad\\x38\\x57\\x80\\xa0\\xc4\\x8b\\x9c\\x4a\\xd2\\xd6\\x63\\x03\\xe8\\xde\\x4a\\xf1\\xdb\\x3c\\x04\\xe4\\xa3\\xdd\\x42\\x19\\xfe\\x77\\x3f\\x83\\xa8\\x92\\x4b\\x0f\\xcb\\xff\\xfc\\xf2\\x64\\xab\\xce\\x32\\x83\\x29\\x24\\x03\\x6b\\xfa\\xbb\\xa6\\x54\\x6b\\x1d\\xf4\\xe3\\xf7\\x88\\xed\\x8a\\xd5\\xc2\\xcd\\x92\\xb2\\x64\\x1b\\x47\\x09\\x0a\\x10\\x3c\\xf5\\xbd\\xc4\\x6d\\x8b\\x21\\x43\\x17\\x47\\x57\\xda\\x80\\x1c\\x36\\x0a\\x7a\\xa1\\x07\\xfa\\xc6\\x54\\xb3\\x4c\\x86\\x0b\\xd5\\x4f\\x76\\xbb\\xf4\\x3c\\x48\\x47\\x8d\\xf4\\xfe\\x7a\\xa5\\x9c\\xf9\\x1d\"},\n{{0x08,0xd1,0xd0,0x6f,0x3e,0xc2,0x9e,0xb5,0x22,0x93,0x90,0x7b,0x70,0x5e,0xc5,0x6c,0x5a,0xb3,0x54,0xfb,0x78,0x67,0x37,0x73,0xae,0x61,0x25,0x30,0x94,0xb8,0x9e,0x82,},{0xc1,0xb9,0x9a,0x87,0xad,0x15,0xbd,0x46,0xf6,0xc8,0x48,0x45,0x2a,0xf0,0xfa,0x3c,0xcc,0xcb,0x5c,0xdf,0x6e,0x34,0x8d,0x81,0x6e,0x36,0xc5,0xd0,0xfc,0xa6,0x6e,0x66,},{0x0b,0x8e,0xdc,0xb8,0xb1,0x5a,0x8c,0xd0,0x74,0xc4,0x1d,0xc2,0xa1,0xba,0x29,0xd9,0x64,0x8d,0x6a,0xcb,0xdc,0x33,0x83,0x14,0x70,0x7e,0xca,0x6f,0xb4,0x71,0x4c,0x99,0x54,0x3b,0x49,0x07,0xb9,0xf8,0x5e,0x57,0xee,0xcf,0xfe,0x0f,0x7a,0x6b,0x70,0x73,0xa8,0x09,0x46,0xf8,0x08,0x75,0x53,0xf4,0x68,0x31,0x09,0x27,0x3a,0x60,0x4a,0x08,},\"\\x12\\x0b\\x35\\x57\\x3c\\x34\\x91\\x4b\\x37\\x30\\x51\\x88\\x0d\\xa2\\x7e\\xd2\\x41\\x37\\x7f\\x0e\\x78\\x97\\x2c\\x98\\xd0\\xfa\\xeb\\xaa\\x76\\x7e\\xb7\\xa7\\xc7\\xe7\\xc6\\xfc\\x34\\x05\\xa4\\x33\\x6e\\xf9\\x5b\\xc5\\xda\\x92\\x25\\xbb\\xd0\\x9e\\x9e\\x11\\xf2\\xa1\\xbf\\x14\\x2a\\xf4\\xe8\\xa0\\xf9\\x24\\xd3\\x23\\xdd\\x5a\\x49\\xdf\\xe5\\x84\\xf0\\x90\\x43\\x9c\\x08\\xe5\\x15\\x11\\x34\\x4d\\x47\\x0c\\x62\\x00\\xac\\x7e\\x7c\\xa1\\x50\\xd0\\x88\\xa9\\x1e\\x47\\xc4\\xc9\\xff\\x74\\xe3\\x8a\\x42\\xa3\\x32\\x15\\x5d\\x81\\x52\\xae\\x4a\\xbd\\x11\\x61\\xad\\xca\\x93\\x4c\\x23\\x4c\\xe4\\x60\\xaf\\x87\\x89\\xe5\\x3f\\x10\\x9d\\x7d\\x31\\xee\\xde\\x0a\\x90\\x9b\\xd1\\x93\\xfc\\x8d\\x3c\\x2c\\xfe\\xc1\\x0b\\x14\\x3c\\x31\\x47\\x67\\x11\\xbb\\xec\\x27\\xe1\\x96\\xa5\\x49\\x85\\xbc\\x34\\x71\\x67\\xac\\xd2\\x33\\x50\\x88\\x27\\xba\\xd3\\x6e\\x54\\x8c\\x88\\x06\\x42\\xb8\\x6a\\x28\\xc6\\xd3\\x40\\x4b\\x51\\x1d\\xa2\\x4f\\x11\\xdf\\xaf\\x6a\\x8f\\x46\\xdd\\xcb\\xc9\\xde\\x9e\\x39\\x15\\x97\\x66\\x9b\\xdd\\xfc\\xa6\\x56\\x0f\\x91\\xac\\xd3\\x45\\x9f\\x32\\x9b\\xb0\\x71\\xdd\\x80\\xda\\xdf\\x35\\xf0\\xe5\\x0d\\xf5\\xb1\\x0f\\x88\\xd2\\x67\\xac\\x9d\\x30\\x62\\x33\\x0d\\xd9\\x9a\\x6b\\xcf\\xa1\\x31\\x87\\xf4\\x5c\\x0c\\x21\\x4d\\xcd\\xe2\\xcd\\xf9\\xc3\\xba\\x4d\\x59\\xe6\\x33\\xa3\\x54\\xa4\\xe2\\x77\\xc6\\x77\\xbb\\xdf\\xa2\\x41\\x91\\x17\\x9c\\xbc\\xaf\\x05\\xa1\\x0d\\x40\\x78\\xd8\\xad\\xd9\\x3b\\xc9\\xed\\x8f\\x6c\\x6c\\x49\\x97\\x57\\x40\\x36\\x55\\x34\\x1f\\x90\\x4e\\x37\\xd9\\x27\\x75\\x0c\\x69\\x9c\\x26\\x9d\\xc9\\x0d\\xc2\\x6d\\x00\\x56\\x25\\xc3\\xf4\\x12\\x4b\\xff\\x66\\xfe\\xca\\x59\\xd4\\xab\\xff\\x41\\x72\\xba\\x3d\\xf4\\x5a\\x87\\x43\\x02\\x23\\x10\\x30\\xfa\\x78\\x33\\x84\\xf5\\x09\\x99\\xe3\\xc4\\xba\\xa5\\xea\\xdb\\x45\\x14\\x52\\xc8\\x88\\xb5\\x19\\x27\\x2e\\x90\\xf7\\x3c\\x68\\x72\\x76\\x8e\\x0d\\xe2\\x0e\\xe2\\xe5\\xf9\\x50\\x2f\\x35\\xe4\\x9f\\xec\\xc2\\x8b\\x75\\x20\\x18\\x87\\xfe\\xd2\\x81\\x8e\\xff\\x54\\x53\\x98\\x39\\x2f\\x5e\\x5b\\x68\\x76\\xbc\\x55\\x6a\\xc1\\x3a\\x19\\x03\\xad\\xa1\\xb9\\xd7\\x25\\xb0\\x4a\\x14\\x20\\x4b\\x59\\x9e\\xc3\\x3d\\x62\\xb7\\xdc\\xae\\xea\\x8c\\x52\\x87\\x7b\\x2c\\xfd\\xc3\\x55\\x8a\\x91\\xd2\\xc9\\x15\\x75\\x00\\xa3\\xbb\\x6d\\x45\\x2e\\x5e\\x2f\\xf0\\x93\\x29\\x4f\\xc4\\x33\\xcb\\xd6\\x34\\x65\\xbb\\x19\\x13\\x07\\xed\\x80\\x1a\\x15\\xb8\\x5d\\xc2\\xff\\x0b\\xb3\\x83\\x12\\xf8\\xb8\\x17\\xa4\\x36\\xd4\\x22\\xcf\\x46\\x07\\xc6\\x4e\\xe7\\x03\\x59\\x23\\xdb\\x6b\\x96\\xa3\\x89\\x99\\x10\\x14\\x9b\\x0d\\xa4\\xaa\\x3e\\x96\\x68\\x5d\\x71\\x63\\xaa\\xcf\\x9e\\x61\\x9d\\xc6\\x08\\x13\\xce\\x4f\\x34\\x4f\\x30\\x79\\xb4\\x3f\\x18\\x7f\\xa3\\x1b\\xda\\xcb\\x9a\\x1d\\x77\\x20\\xb9\\x39\\xd5\\xbd\\x24\\x1b\\x96\\xa1\\x77\\xd7\\xb7\\x76\\x8f\\xfe\\xbf\\x79\\x04\\x4c\\xd2\\x95\\x6d\\x6f\\x88\\xdb\\x1c\\x24\\x3a\\x10\\xfe\\xde\\x68\\x14\\x85\\x2c\\xf4\\x04\\xb2\\xcd\\xcf\\xa7\\x74\\x07\\x6d\\xc1\\x25\\xc7\\x0a\\x57\\xc6\\x90\\x7e\\x99\\xaf\\xe3\\x96\\x22\\xae\\x11\\xf5\\x57\\xe7\\xd3\\x4b\\x39\\xaa\\xaf\\x45\\xf8\\x34\\x05\\x8d\\x2f\\xe5\\xf1\\x5b\\x5e\\xb7\\x0a\\xc1\\x5a\\x90\\xa3\\xde\\x58\\x50\\xab\\x1d\\xcb\\x48\\xb0\\x6b\\x6c\\xca\\xa4\\xb4\\x2f\\x85\\x7e\\x71\\xec\\x00\\xb8\\xa3\\xd8\\x97\\x4b\\x0b\\xea\\x68\\xfa\\x0f\\x66\\x55\\x92\\x11\\x5b\\x4f\\xa5\\x55\\x72\\xcf\\x0b\\x07\\x38\\x64\\x1f\\xc8\\x68\\xd4\\xa2\\xe7\\x14\\xdb\\x3a\\xd7\\x21\\x9a\\x82\\x3d\\x54\\xb7\\xf7\\xc2\\x65\\x6b\\xa5\\xc5\\xee\\xbe\\x35\\x94\\xc7\\xdb\\x12\\x29\\x8c\\x16\\x25\\x1d\\x98\\x45\\xbf\\x2f\\x78\\x00\\xb4\\x19\\x0b\\x74\\x6e\\x21\\xb0\\xc1\\xa5\\xc4\\x7a\\x3d\\xf9\\xa0\\x59\\xce\\x09\\x56\\x67\\x4e\\xb7\\x03\\xde\\xcb\\x0a\\x00\\x45\\x43\\x7d\\xa4\\xda\\x10\\xf2\\x86\\xd7\\x20\\xd1\\xb9\\xdf\\x05\\xfb\\x24\\x41\\x5d\\x68\\xe0\\x65\\x57\\x0e\\x6b\\x31\\x50\\x31\\x42\\xd0\\x33\\x35\\xa8\\x07\\xbd\\xca\\x30\\x89\\x2e\\xdb\\x5f\\x55\\xf8\\x98\\x9d\\x9e\\x64\\x96\\x59\\xc0\\x74\\x4c\\x54\\x33\\xbf\\xb4\\xde\\xeb\\x11\\xc2\\x62\\x6a\\x86\\x50\\xe5\\x4d\\x4d\\x39\\x8b\\xa1\\x9b\\x64\\xf6\\x8b\\xed\\x06\\xd7\\xfc\\x40\\x8f\\x47\\x0a\\xc7\\x04\\xe2\\xac\\x92\\x2a\\xc1\\x41\\x1f\\xee\\x24\\x54\\x3e\\x56\\xf2\\xf5\\x0b\\x6b\\x08\\x95\\x3d\\xc5\\x6a\\x7a\\x75\\xed\\xae\\x43\\x0a\\x6d\\xf2\\x8a\\x22\\x7a\\xda\\xc9\\x1b\\xa2\\x6f\\x0e\\x19\\x85\\x95\\x32\\x77\\x39\\xcb\\xa3\\x03\\xe9\\xaa\\x39\\x3e\\xa6\\x61\\x8a\\x84\\xf8\\xf5\\x03\\xd0\\x05\\x6e\\xe8\\xd8\\x7e\\x37\\x96\\xe0\\x36\\xcc\\x51\\xcc\\xb7\\x91\\xde\\xb7\\x95\"},\n{{0xf0,0xc8,0x5c,0x76,0xb1,0x53,0x2e,0x89,0xae,0xa9,0x75,0x15,0x6d,0xdd,0xb1,0xd3,0xd0,0x66,0xf6,0x40,0x9f,0x84,0x1b,0xb4,0x41,0x09,0x22,0x72,0x5f,0x26,0x9d,0x86,},{0xfd,0x75,0xfc,0x75,0xc3,0x6f,0x83,0x49,0x8d,0x8f,0x08,0x27,0xf0,0x1d,0x3b,0x45,0x7f,0x8b,0xc4,0xd9,0xdc,0x55,0xe4,0xa4,0x62,0x74,0xdd,0xf0,0x03,0x4f,0xe1,0x6f,},{0x42,0x18,0xfe,0x4c,0x1d,0xce,0x79,0x5c,0xa9,0x2a,0x49,0xa6,0xf4,0x79,0x8e,0xb5,0x41,0x2d,0xc8,0x25,0x86,0x03,0x14,0xec,0x46,0x9f,0xed,0x45,0xde,0x3a,0x7b,0xf8,0xea,0x55,0xe8,0x53,0xa3,0x49,0x58,0x4b,0xd9,0x5a,0x82,0x6a,0x58,0x5a,0x50,0x3f,0xd5,0x0b,0xfe,0x4c,0x63,0x5e,0xf1,0x83,0xd0,0x73,0x01,0x36,0x7e,0x90,0x10,0x0a,},\"\\xae\\x2e\\xb0\\x18\\xd4\\x8d\\xbd\\x4f\\x21\\x0b\\x16\\x77\\x8b\\x5b\\xd2\\xfd\\x14\\xc9\\x4e\\x6b\\xbf\\x2b\\x3f\\xf8\\x55\\x18\\xe5\\x60\\xab\\x8d\\x3e\\x72\\x20\\x1f\\x43\\x34\\x20\\xf0\\x0f\\x11\\xbc\\x78\\xe0\\xe9\\xf3\\x72\\x08\\x75\\xb2\\xe9\\xdc\\x11\\xe0\\x43\\x25\\xb8\\xb3\\xf0\\xd4\\x65\\xdd\\xab\\x21\\x51\\x1c\\x45\\x7d\\x6a\\xca\\xd8\\xf2\\xfd\\x5f\\xdc\\x0d\\x28\\x23\\xfe\\x6c\\xaa\\x66\\xa1\\x91\\xa3\\xb6\\x32\\x6b\\x32\\xa1\\x6b\\xef\\xd6\\x4d\\x15\\xb3\\x61\\xa4\\x15\\x13\\x64\\x1b\\xce\\xba\\x26\\xbf\\xe9\\x3b\\xdf\\x85\\x4a\\x4f\\x8f\\x8a\\x0b\\x29\\xf7\\xe2\\x82\\x62\\xe2\\xd6\\xe9\\x8a\\xa2\\x4a\\xc2\\x7f\\x6f\\x78\\x83\\xac\\x01\\xa7\\x4c\\x40\\xcc\\xe9\\x47\\xeb\\xac\\x70\\xe9\\xfe\\xf2\\xa1\\x6e\\x62\\x89\\xe4\\x68\\x95\\x0e\\x39\\x1e\\x9e\\x24\\xef\\x58\\xe8\\x8a\\x44\\x37\\x72\\x69\\xce\\xba\\xfe\\xd8\\x98\\x7d\\x22\\x0d\\xca\\xe2\\xd8\\xb1\\x26\\xb6\\xbf\\x81\\x21\\x67\\xd0\\x23\\xd9\\xba\\xac\\x95\\x0d\\x9d\\xb8\\xcf\\x52\\xde\\x63\\x06\\xbd\\x48\\x99\\x96\\x10\\xc0\\xa4\\x33\\xfa\\x9e\\x17\\x71\\xcb\\x83\\x2d\\x41\\x97\\xaa\\x34\\x0d\\xd0\\xcc\\xd0\\x74\\x4f\\xc6\\xb6\\x2f\\x90\\xbd\\x3e\\xbb\\x53\\x08\\xca\\xb5\\xf9\\x40\\xe2\\x91\\x64\\x23\\xcf\\x0f\\x3b\\xf0\\x80\\xc0\\x6a\\x94\\xf0\\x26\\x91\\x04\\x60\\xdd\\xa8\\x09\\x37\\x4e\\x64\\x57\\xf0\\x64\\xf1\\x78\\xe3\\x08\\xe7\\xa1\\xb5\\xaf\\x4d\\xef\\x31\\x90\\x07\\xd0\\x41\\x77\\x8c\\x3d\\x6a\\x41\\x9f\\x51\\xba\\xdf\\x87\\x66\\x38\\x79\\x30\\x2b\\x53\\xff\\x26\\x9d\\xf4\\x42\\xd0\\xe0\\x5c\\x95\\x8d\\x5b\\xaa\\xcc\\xee\\xd7\\xf5\\xf8\\xaf\\xc8\\x11\\xc1\\x89\\x00\\xee\\x3b\\x0f\\x61\\xe5\\xdc\\xcf\\xd5\\xda\\xc8\\x53\\x32\\xd3\\x2e\\xbb\\xa3\\x71\\xaa\\x2d\\x47\\xa6\\x06\\xf5\\x95\\x46\\xe4\\xbb\\xb6\\x05\\xa7\\x46\\x77\\xb1\\x9a\\x0f\\xe8\\xe9\\x5f\\x9f\\x77\\xc0\\xb8\\xb7\\x1d\\x07\\xe9\\x83\\x00\\x4d\\xc2\\xab\\x2c\\xb3\\x79\\x3a\\x32\\x3c\\x10\\x8d\\xfa\\x79\\x70\\xda\\x00\\xdb\\x19\\x86\\x74\\xbd\\x34\\xbf\\x73\\x10\\x76\\x7f\\x76\\xa2\\x24\\xe0\\x7b\\xdb\\xc6\\x2b\\x9d\\x07\\x8c\\xbc\\x75\\x36\\x7e\\x2e\\xba\\xa2\\xc5\\xd2\\x74\\xbf\\x34\\x27\\xf2\\xa0\\xcc\\x5d\\xbe\\xf0\\xaf\\x4e\\x63\\xad\\x88\\x9e\\x13\\x1b\\x12\\xbc\\x8c\\xa3\\x2d\\x82\\x7f\\x72\\x60\\xb0\\x44\\x9d\\x04\\x43\\xfa\\x28\\x84\\x40\\xef\\xd1\\x36\\x4e\\x3c\\x98\\x49\\x47\\x7e\\x73\\xee\\x0b\\xa4\\x24\\x0d\\x49\\x2a\\xf5\\xce\\x13\\xc3\\x45\\x61\\xb4\\x50\\x10\\xc1\\x09\\xd8\\x42\\xc1\\xfe\\xd1\\xbe\\x3f\\xa9\\xe1\\x84\\xaa\\xa1\\x40\\x64\\xf4\\x3f\\x6d\\xea\\x0b\\x65\\x9c\\x5b\\x97\\x89\\x3c\\xf2\\xa4\\x33\\xbc\\xfb\\x1d\\x2a\\x87\\xeb\\x56\\x4b\\xd9\\x09\\x2c\\x26\\x66\\x70\\x47\\x31\\xf8\\x3e\\x56\\x43\\x4b\\x2a\\x42\\x99\\x65\\x0c\\x70\\x60\\xf9\\xff\\x7e\\x8a\\xad\\xcb\\x45\\x93\\xf6\\x09\\x18\\x8d\\x8b\\x46\\x76\\x46\\xcf\\xe9\\x52\\x70\\x06\\x7a\\x1d\\x35\\xcd\\x75\\x9f\\xe5\\x81\\xaf\\x4e\\x62\\x60\\x2c\\x02\\xef\\x14\\x74\\x41\\x43\\xeb\\x42\\x4f\\x2d\\x9f\\x33\\xa6\\x02\\x88\\xc1\\xb2\\x5f\\x08\\xe4\\xb2\\xf5\\xfe\\xae\\x06\\xcb\\xcc\\x2b\\x20\\x52\\xbf\\x38\\x4e\\x1a\\x6f\\xcd\\x84\\x71\\xce\\x5e\\x56\\x58\\xd7\\x7f\\x40\\xc3\\x5c\\x41\\x5e\\x2a\\x9e\\x09\\xfb\\x58\\x3b\\xb7\\x47\\x12\\x58\\xe7\\xc8\\x06\\xf3\\xc2\\x18\\x22\\xdd\\x10\\xf5\\x6a\\x64\\x0c\\xdc\\x00\\x12\\x8d\\x3b\\xa5\\x56\\xba\\x51\\xdc\\xaa\\xb4\\x7c\\x3b\\xaf\\x9f\\x01\\x97\\xd3\\x66\\x3d\\xe8\\xd0\\x93\\xe8\\x31\\x73\\x32\\x5d\\xef\\x1e\\x83\\xa2\\xf5\\xf5\\xac\\xf1\\x2a\\xe0\\x9f\\x3c\\xe9\\x6c\\xd8\\x88\\x03\\x4d\\xcb\\xe6\\x14\\x7d\\xc5\\x99\\x83\\x62\\xa4\\xbc\\x40\\x6d\\x28\\x84\\x6a\\xb1\\x50\\x3c\\x17\\xc9\\x4f\\x9a\\xfd\\x90\\x3c\\x9a\\x58\\xe1\\xce\\xbb\\x4a\\xbb\\x4f\\xf6\\xf2\\xa4\\x10\\x24\\xe0\\x6d\\xca\\xad\\x14\\xf5\\xb7\\x0c\\x1b\\x26\\xe6\\x9f\\x96\\xec\\xf1\\x4b\\x8d\\xa3\\x1c\\x62\\x1f\\x9a\\xd4\\xe3\\x0a\\xeb\\x98\\x23\\x78\\x67\\x1f\\x7d\\x1f\\x2c\\x4b\\x57\\x2c\\x41\\xbb\\x88\\x30\\x84\\x0a\\xc5\\xdd\\xce\\xd8\\x81\\xf8\\xff\\xf2\\x10\\xc3\\xc7\\xf2\\x36\\xd8\\xc5\\xf2\\xcf\\xda\\xcd\\xa2\\x98\\x93\\x30\\x2f\\xde\\x15\\x28\\x2d\\xb5\\x40\\xcb\\x54\\x37\\x37\\xdd\\x77\\x85\\x25\\x69\\x22\\x1f\\xdd\\xcd\\xd6\\x8d\\x87\\xe2\\x40\\x21\\x79\\xd3\\xa5\\xa7\\x77\\x34\\xc2\\x75\\xa1\\xd5\\x60\\xa4\\x62\\xf4\\x03\\x18\\xbb\\x68\\x19\\x83\\x7d\\xa3\\xd3\\x05\\xeb\\x49\\xb3\\x86\\x50\\xef\\xdc\\x8f\\xe4\\x09\\xd4\\x0f\\xb9\\x4c\\xd5\\xdc\\x3e\\xb0\\x27\\x38\\xf3\\x88\\x52\\xf6\\x71\\xa0\\xc4\\x14\\x14\\xb7\\x6f\\xb4\\x36\\xf3\\x41\\x7b\\x8e\\xf3\\x00\\x92\\x1c\\x00\\x9e\\xbb\\xd7\\xcf\\x8e\\x11\"},\n{{0x18,0xe2,0x68,0xb1,0x5a,0x25,0x01,0xdd,0x4c,0x97,0x9d,0xc1,0x03,0xca,0x6a,0x84,0x22,0x16,0x13,0x2b,0x3b,0x50,0x81,0xd7,0x75,0xf8,0x86,0x40,0xf8,0x9c,0x80,0x41,},{0xb3,0x4e,0x19,0xc1,0xe2,0x08,0xfb,0x48,0xa8,0x85,0x07,0x9d,0x9f,0xbf,0x37,0xc7,0x4f,0x92,0x71,0x09,0x60,0xf8,0x32,0x15,0x4f,0xab,0x18,0x57,0x0c,0xfb,0x4c,0x1d,},{0xf2,0xdc,0xfc,0x06,0xef,0x1d,0x8e,0xcc,0xd8,0xe4,0x0b,0xdf,0x01,0x30,0x7d,0xd1,0x96,0x83,0xf2,0x14,0xd4,0xf0,0x84,0xe6,0xb6,0x93,0x4f,0x63,0x72,0x78,0x30,0x0d,0xbb,0x18,0x89,0xf2,0xd3,0x7f,0x53,0xb3,0xae,0xf2,0x6f,0xbb,0x3e,0x36,0xbd,0x75,0x98,0x5f,0xa7,0xc8,0xea,0x6d,0xdf,0xfa,0x72,0xc8,0xe4,0x06,0xf2,0x4b,0xb2,0x0e,},\"\\x42\\x4b\\xdc\\xf0\\xb2\\x56\\x00\\x14\\x39\\xd1\\x69\\x58\\xff\\xf6\\x48\\xcf\\x7a\\x86\\x04\\xaf\\x22\\xcf\\xa5\\xb4\\x43\\x31\\xb4\\xdc\\x35\\x6d\\xff\\x25\\xcc\\x05\\x63\\xda\\x9d\\x64\\x01\\x33\\xac\\xb7\\x0b\\x6a\\x11\\x76\\xc4\\x82\\xdb\\xc9\\x40\\x8c\\xd6\\x79\\x3d\\x56\\xbc\\x29\\xcc\\x40\\x88\\x23\\xd3\\x88\\xed\\x88\\xb2\\x4c\\xeb\\x66\\x21\\xdb\\xac\\x00\\x23\\xee\\x69\\xf7\\x6f\\x82\\x96\\xa7\\x39\\x52\\x11\\x68\\x5b\\x3c\\xea\\xa9\\x95\\xf0\\x35\\x5d\\x9a\\xad\\x3d\\x97\\x35\\x8f\\x4a\\x37\\x9e\\x59\\x20\\xec\\x54\\x5f\\x46\\x96\\x21\\xcf\\x76\\x8a\\xbf\\x55\\xd2\\xa5\\x54\\xc9\\x49\\xb0\\xed\\x70\\x18\\x7c\\x22\\x05\\xad\\x03\\x29\\x85\\xc9\\xb5\\xb2\\xe4\\xba\\x57\\xe0\\xb4\\xa4\\x7d\\x34\\x45\\x12\\xb8\\x4b\\xfe\\x9f\\x3a\\xa5\\x60\\xfe\\x6e\\xcf\\xc5\\xbd\\xf8\\xc3\\xb4\\x18\\x45\\x29\\x35\\x73\\xf8\\x1e\\xd3\\xb7\\x0e\\xdc\\x63\\xa3\\x0c\\x70\\xcd\\xa3\\xf4\\x55\\x90\\x13\\x13\\xf6\\xd2\\x3d\\xb3\\x09\\x47\\x8f\\x03\\xe3\\x4e\\x71\\x35\\x6d\\x83\\xfa\\x5d\\xb9\\x28\\x0c\\xc2\\xb4\\x36\\x9c\\x3d\\x24\\xdd\\x90\\x38\\xf2\\x47\\x59\\x6c\\x39\\x1e\\x48\\xb2\\xf3\\xf8\\x90\\xa1\\x41\\xca\\x1d\\x12\\x07\\x7c\\x69\\x34\\x47\\x35\\xa5\\x9b\\x1d\\xd4\\x07\\x6b\\x22\\xe1\\x61\\x89\\x99\\x1e\\x5f\\x1b\\xe4\\xfb\\x76\\x95\\xaf\\x90\\xeb\\xea\\x5d\\xf2\\x86\\x13\\x5c\\xec\\x2a\\x6e\\x99\\xaa\\x1d\\xda\\x32\\x8e\\x62\\xc0\\xdf\\xb6\\x37\\x42\\x20\\x2d\\x63\\x62\\x4d\\xcc\\x0c\\x5c\\xf1\\xa5\\xdf\\x79\\xe2\\x87\\x8d\\xbc\\x71\\xfa\\x96\\x57\\x66\\x01\\xaf\\x22\\x84\\x4f\\x54\\x57\\x33\\x12\\x6a\\xf7\\xd3\\x98\\x4c\\x3e\\xd2\\x52\\xe6\\xa8\\x76\\x44\\x5c\\x92\\x25\\x9f\\xbb\\x47\\x0a\\x10\\x56\\x9b\\x49\\xe5\\x79\\x1f\\xd0\\x18\\x2c\\xfe\\x1c\\x3f\\x88\\x29\\x7f\\xac\\xc8\\xc3\\x1a\\x53\\x32\\xf1\\xf4\\xeb\\x49\\x58\\xdb\\x13\\xb6\\xc0\\x79\\xaa\\x9c\\x94\\x94\\x87\\x26\\x34\\x03\\x19\\x0c\\x83\\xc1\\x1a\\x43\\x19\\x1f\\xfe\\xc6\\x02\\x3f\\xb3\\x4c\\xfa\\xb2\\x52\\x5b\\xeb\\x54\\x6c\\xf9\\x20\\x0a\\x96\\xf5\\x85\\x4b\\x2f\\x78\\xec\\xb2\\xd9\\xa5\\x3a\\xa9\\xd2\\x87\\xa9\\x0d\\x4d\\x41\\x0a\\x63\\xad\\xa0\\xe9\\x75\\xd3\\x04\\xd5\\x14\\x83\\x53\\x46\\x3f\\xa8\\x05\\xb4\\x80\\x5f\\xb4\\x68\\x7e\\xd8\\x85\\x7d\\xfc\\xe4\\xbc\\x6e\\x80\\x83\\x3c\\x8f\\x9a\\x79\\xcd\\x4f\\x02\\x9a\\x2d\\x80\\x2b\\xfd\\xc8\\x19\\xed\\x0c\\x0a\\xc8\\xf2\\x10\\x23\\x28\\x7f\\x2b\\x4b\\xaf\\xbc\\xc8\\x99\\x93\\xfe\\x46\\xd5\\x2a\\x9c\\x62\\x46\\xde\\xad\\x61\\x7d\\xf7\\x97\\xd4\\x8e\\xe9\\x85\\xf0\\xf0\\xdf\\x9a\\xa8\\x2e\\xa2\\x0e\\x0d\\x0d\\xb2\\x8a\\x25\\x4a\\x9a\\x25\\x3f\\x39\\xf9\\xcf\\x01\\xe3\\xdb\\x8f\\x3e\\xbc\\xf7\\xcb\\x97\\xce\\xc5\\x8c\\x4e\\xfe\\x03\\x12\\x69\\xb4\\xb3\\x7e\\x4c\\xbb\\x36\\x1f\\x73\\xab\\x4b\\x49\\x80\\xbd\\x90\\x08\\x49\\x53\\x88\\x44\\xc5\\x2c\\xb3\\xac\\x75\\x83\\xb8\\xf8\\x96\\x53\\xa0\\xde\\x65\\xa8\\xbe\\x91\\x58\\x2c\\x55\\x23\\x9c\\xb8\\xf5\\xd5\\x31\\x8a\\x88\\xd1\\x60\\xe1\\xc8\\x71\\xe5\\xea\\x7e\\x75\\xf5\\xa6\\x9c\\xba\\x85\\x38\\x22\\x1a\\xb4\\x2c\\xe2\\xa2\\xc4\\xd9\\xc3\\xb7\\xec\\x85\\x7f\\x23\\x0d\\x57\\x37\\x31\\x13\\x36\\x86\\xae\\x8a\\x7e\\xd6\\x40\\xf4\\x2f\\x31\\x02\\x94\\x89\\xe4\\xe6\\xaf\\x2b\\x3e\\xa4\\xc7\\x94\\x8e\\xd5\\x37\\xc0\\xc5\\x90\\x67\\x26\\xc2\\xb6\\x25\\xfd\\x5f\\x94\\x9e\\x3a\\x7c\\xf3\\xb6\\xe9\\x98\\xec\\x76\\x1d\\xd6\\xe2\\xb5\\x17\\x1a\\x68\\x74\\x97\\x52\\xe7\\x21\\xb7\\x88\\xc3\\x47\\x7f\\xa1\\x90\\xcd\\x6e\\xa8\\x1d\\x57\\x9d\\xce\\x64\\x62\\xd9\\xc6\\x62\\xad\\x89\\x62\\xe7\\x93\\x38\\x71\\x0c\\xc8\\xd2\\x73\\x8a\\x5f\\xb0\\x4a\\xdf\\xdb\\x3f\\x14\\x32\\xcf\\xd8\\x0e\\x2e\\x96\\x7d\\xa0\\x00\\xd8\\x3a\\x0f\\xa8\\x5a\\xba\\xe2\\x95\\x2f\\x3f\\x36\\x83\\xe2\\x54\\xd8\\x68\\xf4\\xbf\\x80\\x9e\\xb2\\xe3\\x00\\xe7\\xb2\\x09\\x73\\x4a\\x3c\\x89\\x4e\\x96\\x6b\\x16\\x08\\x8d\\x5e\\xd3\\x54\\xbf\\xfb\\xff\\xbb\\xf2\\xec\\x2b\\xe9\\x3a\\x32\\xa8\\xbe\\x5c\\xfa\\x18\\xfa\\x56\\x53\\x01\\x2e\\xda\\xe5\\xaf\\xd8\\x70\\x9c\\xa5\\x5c\\x0c\\xf2\\x3a\\x55\\x0d\\x34\\xca\\x0f\\x32\\xd8\\xf6\\x66\\xfb\\x47\\xa1\\x2f\\x2b\\x73\\x53\\xa4\\x0c\\x53\\x79\\xf7\\x53\\x66\\xc1\\x3f\\x4a\\xb9\\xf1\\x4c\\xf8\\x0a\\x94\\xe1\\xf1\\x3d\\x8b\\x09\\xb7\\x6f\\xd8\\xd1\\x4f\\xfa\\x53\\x8f\\x31\\xfd\\x8a\\xeb\\x49\\xd3\\x34\\x33\\xf4\\xdf\\x7c\\x2c\\xa6\\x73\\x99\\x57\\x9f\\xe9\\x90\\x78\\xaa\\x72\\x1d\\x6b\\x6f\\xc0\\xc5\\x0e\\x8a\\x91\\xfc\\x71\\xca\\x25\\xea\\xc1\\x37\\x6f\\xc6\\x71\\xbf\\x61\\x53\\xe7\\x20\\xb2\\x5c\\x7e\\x97\\xa3\\xd4\\xef\\x84\\x42\\xac\\x67\\xac\\xf5\\x8b\\x50\\x4b\\x67\\x15\\x8f\\x91\\x30\\x25\"},\n{{0x3c,0x39,0x3f,0x9d,0xf1,0xfb,0x0b,0x1e,0xec,0x09,0xb7,0xf2,0x70,0xb8,0x59,0x82,0xba,0x0f,0xd5,0xe4,0xb1,0x79,0x5e,0x1a,0x7f,0xa9,0x91,0x37,0xfe,0xe2,0x4d,0x7d,},{0x97,0x4f,0xe2,0x37,0x30,0xfc,0x17,0x94,0x56,0x70,0xfb,0xc1,0xf8,0x0b,0x93,0xf9,0x45,0x93,0xc8,0xd4,0x4b,0xc7,0x5d,0x18,0x9a,0x6b,0xbf,0xaa,0xba,0xf5,0xdb,0xd9,},{0x22,0x33,0x3e,0x56,0x41,0x0f,0xdc,0xbf,0x84,0xf6,0xa8,0xde,0x74,0x13,0x37,0x69,0x16,0x84,0x49,0x5b,0xa6,0x9e,0xff,0x59,0x6d,0xb9,0xc0,0x3a,0x28,0x12,0x10,0x88,0x1e,0x6c,0x91,0xef,0xa9,0x1b,0x21,0x83,0xc0,0xea,0xc9,0x16,0x15,0x28,0x17,0xa7,0x8c,0xa7,0x24,0xba,0x7c,0x8b,0x51,0xbb,0x4c,0xaa,0xde,0xa9,0xa3,0x41,0xeb,0x0e,},\"\\x54\\xd8\\xb8\\xd5\\xfa\\xc2\\x8c\\xff\\xa7\\x7a\\x09\\x16\\xd6\\x33\\x3c\\x16\\xed\\xbc\\x8b\\xb7\\x4a\\xa0\\x6e\\x56\\xdc\\x00\\xe4\\x7e\\x39\\x29\\xe4\\x08\\x64\\xb8\\x84\\x0d\\x91\\x20\\x79\\x59\\x7e\\xac\\xd8\\x1d\\xae\\x43\\xe2\\x78\\x5d\\xfc\\x68\\x9f\\x3e\\x85\\xf8\\xc6\\x65\\x81\\xef\\xc5\\xe8\\x53\\xd1\\xfa\\xaa\\xc7\\x44\\x40\\x0a\\xb0\\x8c\\xbd\\xb5\\xd1\\x61\\x46\\xfa\\x60\\xf9\\x99\\x05\\xed\\x84\\xfd\\x29\\x36\\xdd\\x73\\xf4\\xbc\\xa2\\x57\\x2b\\x7c\\xf5\\x16\\x05\\x60\\xff\\xaa\\x68\\xda\\x7a\\x67\\xe4\\x0e\\x08\\xa7\\xbb\\x7a\\xef\\xc4\\x04\\x3e\\xbe\\xd5\\xfe\\x80\\xa4\\x14\\x81\\x7e\\xdf\\x2c\\x63\\xf6\\x2f\\xac\\x0d\\x47\\x44\\x6e\\xd0\\xbb\\x58\\x40\\x58\\xf4\\x87\\x2f\\xec\\xff\\x62\\x15\\x59\\x31\\x1a\\x27\\x0a\\xea\\x37\\xa6\\x29\\x68\\x64\\xe8\\xd1\\x68\\xbf\\x1e\\x2f\\x55\\xcd\\x3b\\x27\\x6e\\xdf\\xa6\\x12\\xb5\\xd9\\xc3\\x36\\x2e\\x61\\x8b\\xe6\\xe8\\x2a\\x6e\\x5f\\x82\\x66\\x79\\x24\\xf3\\xd1\\xd3\\xdf\\x82\\x5f\\x9d\\x23\\xf4\\xd6\\x14\\x2d\\x31\\x00\\xdf\\xc7\\x0f\\x70\\x60\\x3a\\xbf\\x3f\\xda\\xda\\xca\\x69\\xef\\x6a\\x18\\xef\\x90\\x92\\xb3\\xc4\\x1e\\xc6\\x58\\xab\\x27\\x21\\x6f\\xc6\\x14\\x7a\\x08\\x0a\\xcd\\xa6\\x0a\\x84\\x19\\x84\\xee\\x83\\xf4\\x1a\\xc4\\x2a\\x80\\xea\\xac\\x91\\xff\\xfc\\x82\\x28\\x39\\x1e\\xf5\\x83\\xab\\x3e\\xdd\\xcf\\x87\\x65\\x23\\xc2\\x02\\x81\\x35\\x53\\x00\\xd8\\x6c\\x11\\xa4\\xe7\\xc1\\xad\\xe8\\xe5\\x05\\x60\\xf4\\x39\\x06\\xc9\\xbc\\x8c\\xa5\\xfb\\xf8\\x33\\x9f\\xbe\\xbd\\x02\\xe3\\x3e\\x85\\x18\\xbe\\xe5\\xe8\\x06\\xb8\\xc1\\x0f\\x82\\x77\\xf4\\x10\\x66\\x47\\x35\\xa2\\xbf\\x55\\x68\\x39\\x63\\x54\\x92\\x45\\x2e\\x6c\\xa0\\x79\\xde\\xb9\\x75\\x1c\\xfc\\x67\\x97\\xf4\\x9b\\xca\\x96\\x13\\xff\\x2e\\x7f\\xdd\\x36\\x46\\xf7\\xc5\\x23\\x6a\\x36\\xbd\\xf0\\x05\\x17\\x45\\xe5\\x95\\xdc\\x00\\x72\\xfd\\x66\\x51\\xd5\\x76\\x27\\xa6\\x00\\x4c\\x0f\\x0c\\xfa\\xe8\\x56\\xbb\\xc2\\x8a\\x12\\x31\\xcb\\x83\\x96\\x65\\xff\\x04\\x15\\x2e\\xc3\\x1c\\x00\\x7b\\x3e\\x2e\\xd0\\xa9\\x73\\xb2\\x4c\\x93\\x14\\x9c\\xe7\\x01\\xe6\\xfd\\x65\\x39\\x20\\x6a\\xe9\\x1b\\xec\\x4c\\xe6\\x5a\\x89\\xdb\\x26\\xc7\\xd3\\x8c\\xec\\xb8\\x91\\x9f\\x96\\xfb\\x6c\\xb8\\xf6\\xc1\\x93\\x9d\\x90\\xfb\\x3f\\x90\\xb8\\x87\\x78\\x9f\\x29\\x57\\x5a\\xb2\\x0e\\x0b\\x08\\xbc\\x35\\x81\\x53\\xd8\\xc0\\x35\\x21\\xdc\\x89\\x18\\x70\\xb5\\xf7\\xee\\xdc\\xc1\\xe6\\x2b\\xee\\x7d\\xa0\\x63\\xae\\x66\\xff\\x0a\\x4b\\x7d\\x98\\xd1\\xcb\\x75\\x8f\\x69\\x74\\x3c\\x3d\\xb3\\xae\\x2a\\x2c\\x9b\\xe1\\xbe\\x09\\x4f\\x17\\xcd\\x28\\xf9\\x2d\\x8c\\xcb\\xca\\x98\\x3c\\x74\\x9c\\x75\\xc6\\x10\\xf8\\x40\\x83\\x6e\\x2c\\x43\\x0c\\xcd\\xef\\xf0\\xaf\\xa5\\x44\\x44\\xf1\\x2b\\x4a\\x4f\\x00\\x2c\\x60\\x94\\x51\\x83\\x42\\x44\\xc0\\xc0\\x7d\\xf8\\xe1\\x22\\x02\\xa6\\x5f\\x94\\x44\\x7c\\xd4\\x90\\x3a\\xcb\\x60\\x6d\\x77\\x25\\xa8\\x6e\\x4a\\x23\\x43\\x98\\x4e\\x67\\x9c\\x4a\\xf1\\xb3\\x67\\x9c\\x75\\x5e\\xa5\\x0d\\x0a\\xbe\\x2f\\xcc\\x0c\\x1c\\x33\\x51\\xa9\\xee\\x19\\x6b\\x46\\x44\\xc4\\x24\\x22\\x2b\\xe9\\x9e\\x2f\\xb3\\x73\\xf9\\x64\\x1e\\x3f\\xae\\xbf\\xf4\\x31\\x70\\xeb\\x03\\xfb\\x8e\\xc4\\x55\\x7d\\x15\\x1a\\x55\\xfa\\xb6\\xc4\\x99\\xd4\\x44\\xc8\\x4b\\xe8\\x9f\\x24\\x47\\x68\\x2d\\xe4\\xe6\\xf6\\x35\\x34\\x75\\xef\\xcb\\x8f\\xc5\\x32\\x56\\x76\\x3a\\x94\\x8d\\xc7\\x5c\\x51\\x5f\\xa3\\x53\\x54\\x5d\\x0c\\xba\\xd2\\x9d\\xf5\\xe9\\xdb\\x5c\\xc4\\x57\\xed\\x30\\x86\\xcf\\xfb\\x3d\\x75\\xe8\\x46\\xc4\\xe8\\xd8\\x81\\x47\\xfc\\xd0\\xd8\\xaa\\x5a\\xba\\xb4\\x9b\\x5e\\x05\\xc3\\xd7\\xfe\\xef\\x63\\x79\\x43\\x34\\x7a\\xd3\\xf4\\x92\\xee\\x35\\x6e\\xf3\\x48\\x81\\xcf\\xd8\\x5a\\xbc\\xe8\\xa1\\x44\\xce\\x77\\x61\\xe2\\x84\\xe8\\xb8\\xcb\\x08\\x96\\x60\\x49\\x04\\x7a\\x99\\x6e\\x23\\x55\\x9f\\x77\\x6b\\x1a\\x9f\\x41\\xcb\\xa3\\x95\\x41\\x08\\x48\\x6e\\x29\\x27\\xbe\\xb6\\x43\\x3a\\x36\\xff\\x8b\\x2f\\x03\\xaa\\x74\\xb3\\xd2\\x09\\xc4\\x88\\xe0\\x77\\xf9\\x24\\xf2\\x31\\xe2\\x83\\x45\\x94\\x2c\\x7d\\xcc\\x2e\\x61\\xd7\\xc9\\xb5\\x22\\xb6\\x59\\xfc\\xb5\\x36\\x62\\xaf\\xf3\\x64\\x8f\\x66\\xda\\x3e\\x83\\xe5\\x9b\\x0d\\xaa\\x90\\xb9\\x4c\\x51\\x5d\\xad\\xab\\x10\\xd5\\xa8\\x39\\xcb\\x3a\\x2f\\x1d\\x3c\\xd0\\x92\\xde\\x55\\xd9\\x95\\x13\\x8c\\x3a\\xc0\\xb9\\x07\\xaf\\x15\\xac\\x63\\xec\\x18\\x74\\x11\\x43\\x27\\xe2\\x19\\x71\\x34\\x5e\\xf1\\x70\\x31\\xd5\\x26\\x17\\xe7\\x84\\xda\\x37\\x71\\x43\\x9b\\xe2\\xe8\\x41\\x48\\xbc\\xfe\\xa1\\x32\\xbd\\xe1\\x0e\\x6f\\xda\\x54\\x7d\\xcb\\xb1\\xc4\\xd8\\xf7\\x4d\\xdc\\xe1\\xfc\\xcf\\x82\\x13\\xe0\\xda\\x6e\\x97\\xb8\\x1f\\x75\"},\n{{0xf8,0x66,0x9c,0x88,0xf1,0x68,0x5b,0xbf,0x04,0x80,0xcc,0x92,0x21,0xac,0x2e,0xad,0x8f,0x55,0x1b,0xfa,0x87,0xec,0xba,0x2f,0xd4,0xdd,0xf3,0xba,0x34,0x76,0xeb,0xda,},{0x34,0x72,0x3f,0xb8,0xe2,0x53,0xad,0x9c,0x71,0xce,0xfd,0xe0,0x36,0x28,0xd2,0x04,0xe5,0x35,0xde,0x47,0x9e,0x10,0x48,0xe5,0x18,0x87,0x62,0xa1,0xf3,0x37,0xfe,0x5f,},{0x37,0x46,0xda,0x6c,0xd8,0xca,0x10,0x8b,0xee,0xf0,0x64,0x87,0xbe,0xe6,0x35,0x84,0xf8,0x12,0xc8,0xe0,0x69,0x5f,0xc8,0x63,0xb8,0x6e,0x5d,0xb1,0x32,0x38,0x0b,0x62,0xff,0x85,0x44,0xf6,0xf3,0x74,0x82,0x5b,0x0e,0x3e,0xa0,0x62,0x0e,0xf8,0x54,0xc1,0x33,0x11,0x14,0xd6,0x67,0xdf,0x1f,0x9e,0xa7,0x76,0xc3,0x96,0x38,0x70,0x29,0x0d,},\"\\x5b\\x49\\x41\\xbe\\xec\\x22\\x41\\xc9\\xfb\\x76\\xd8\\x48\\x4f\\x4f\\x3f\\x3a\\xb4\\xff\\xe8\\xec\\xc8\\xe7\\xae\\xc7\\x6d\\xe2\\xab\\x8c\\x36\\x85\\x84\\xd7\\x51\\xb0\\xd3\\xfe\\xb8\\xa1\\xdc\\x81\\x68\\xcd\\xc6\\x94\\x96\\x8f\\x66\\xb2\\xa0\\xb0\\x52\\xaf\\xbf\\x8b\\xe3\\xa7\\xd9\\x51\\x63\\xe9\\xda\\x91\\x41\\xc5\\x9c\\xa5\\x59\\x76\\xc2\\x92\\xc5\\xc7\\x4d\\x31\\x31\\x8d\\x6a\\x91\\xe7\\x81\\x7c\\x5a\\x8b\\x2f\\x81\\x21\\x18\\xcb\\xeb\\xa3\\xa1\\x33\\x23\\xcd\\x97\\x48\\xbf\\x86\\xed\\x1a\\x85\\xdd\\x4e\\xbc\\x0d\\xf4\\x95\\xcf\\xa3\\xd4\\x62\\x74\\x34\\xbf\\x14\\xaa\\xe8\\xab\\x67\\x81\\x46\\x7a\\x56\\xd9\\x65\\xd1\\x0e\\x63\\x71\\x98\\x9d\\xfa\\x0f\\x6b\\xc0\\xf7\\x85\\x9f\\x37\\x71\\xeb\\x90\\x04\\xb3\\x43\\x67\\xdb\\x27\\x05\\xdb\\xd6\\x0f\\xa8\\xf7\\x89\\x5c\\x1e\\xad\\xf5\\x9f\\x53\\xda\\xb1\\x68\\xb4\\xf9\\x36\\x39\\x79\\x02\\x55\\x01\\xdd\\xd9\\x68\\x0d\\xeb\\xc0\\x7c\\xd1\\xca\\x4a\\x09\\x97\\x87\\x6e\\x92\\x11\\xf3\\x07\\xd9\\xb7\\xb9\\xd9\\x04\\xe4\\x8d\\x28\\x61\\xa7\\x78\\xb8\\x79\\xad\\x59\\x0a\\x9a\\x2f\\x14\\x1b\\xd5\\x68\\xe3\\xa1\\xbb\\x24\\x94\\x62\\x8e\\x9e\\xc0\\xc6\\x42\\x55\\xae\\xea\\x6f\\x0e\\xed\\xca\\x30\\xad\\x38\\xa1\\xf3\\xff\\xec\\x3b\\x2b\\x5e\\x94\\x2e\\x21\\x94\\x01\\x04\\xe9\\x14\\xd1\\x1a\\x44\\xc0\\x0f\\xdd\\x47\\xda\\x3e\\x55\\x13\\xaa\\x85\\x30\\xae\\xe2\\x47\\xc9\\x5c\\xa6\\x6d\\x08\\xa2\\x60\\x8c\\x75\\xba\\x98\\x58\\xda\\x14\\xf9\\xa8\\xa3\\x2b\\xe7\\x13\\xd3\\x09\\xe0\\xf5\\x84\\xc8\\x1e\\xf5\\xbe\\x04\\x0e\\x00\\x65\\xf0\\x7b\\x77\\x5a\\xe1\\x75\\xdf\\xe2\\xc8\\xb9\\x0a\\x88\\xcc\\xda\\x17\\xfa\\x4f\\x21\\xc7\\x7e\\xad\\xf5\\xd2\\x5b\\x6e\\x40\\x4b\\xf0\\x04\\x47\\x9e\\x05\\xa0\\x1a\\xc0\\x04\\x2b\\x89\\x93\\x7e\\xb2\\x78\\xc1\\xc3\\x4f\\x33\\x02\\x8d\\xb7\\x80\\xba\\x3b\\x61\\x79\\x18\\x59\\x5a\\x39\\xc0\\xfc\\xad\\x67\\x4b\\x85\\xc4\\x0c\\xac\\x8d\\x34\\x5b\\x7c\\xa0\\xbb\\x48\\xa2\\x8e\\x66\\xc4\\x4d\\x8b\\xb5\\xf2\\x79\\x41\\xe4\\x0b\\x0e\\x9c\\x70\\x97\\x97\\x6c\\x62\\xdf\\xef\\x50\\xc9\\x8f\\x17\\x56\\x6c\\xcb\\xac\\xc8\\x7c\\xb0\\x3b\\x94\\xdf\\xdf\\xaf\\x32\\xf1\\xe5\\x6f\\xfa\\x63\\x9d\\x63\\x61\\x1e\\x21\\x3c\\xeb\\xf5\\x4c\\xd0\\xa3\\xe2\\x17\\x2d\\x81\\x1c\\x0e\\xbd\\x75\\xb1\\xa8\\x64\\x62\\x64\\xdd\\x8b\\x1a\\xbd\\x46\\xe5\\x48\\x97\\x2a\\x1b\\x26\\x2c\\xd9\\x5d\\x51\\x15\\x36\\xdd\\xdc\\xb4\\x97\\x29\\xfe\\x7b\\xd0\\x0b\\x38\\x38\\xbd\\x2f\\x20\\xa1\\x42\\x64\\x0e\\xdb\\x1b\\x6e\\x76\\x5b\\x65\\xda\\x72\\xe7\\x23\\x32\\x61\\xc8\\x89\\x2e\\x2f\\x49\\x49\\xbb\\x51\\xf3\\x2a\\x1a\\x5a\\x3e\\xe1\\x49\\xbe\\xa2\\x6f\\xdc\\xed\\xb9\\x91\\xd2\\xcd\\x12\\x66\\x37\\xe2\\x97\\x1e\\x9b\\x6f\\x0b\\x78\\x5d\\xf2\\x8a\\x48\\xf3\\x01\\x70\\x73\\x49\\x42\\x3f\\x44\\xe8\\x46\\x22\\x89\\xd7\\x25\\x49\\x82\\x30\\x48\\x9d\\xf1\\xb5\\x1b\\xe3\\x0f\\x08\\xd7\\xe3\\x25\\x05\\x65\\xc6\\xef\\x82\\x4b\\xc5\\x3a\\x1b\\xa7\\x4a\\x57\\xa2\\x5c\\x06\\x86\\xad\\xcb\\x6c\\x82\\x5a\\xb1\\xca\\x70\\xc8\\xa5\\xd4\\x6d\\xbb\\xc6\\xfa\\x60\\x74\\x61\\xe2\\x6d\\x16\\xfe\\x93\\xbb\\x3d\\x3a\\x94\\x3a\\x3d\\xc0\\x5f\\x30\\xea\\x6d\\xc8\\xbb\\x12\\xd7\\x08\\x21\\xd3\\x20\\xf1\\xad\\xf1\\xce\\xba\\x4b\\xe6\\x57\\x19\\x4f\\x7f\\xcc\\xd2\\x19\\x90\\xf8\\x62\\x9d\\x74\\x46\\x01\\xcf\\x52\\xea\\x6d\\x94\\x05\\xaa\\xa2\\x87\\x8f\\x1e\\xec\\x40\\x03\\xb4\\x5a\\x42\\x18\\xd8\\xf8\\x0b\\xb0\\xf5\\xaf\\x04\\x73\\x26\\x48\\x77\\x52\\xe2\\xb7\\x6d\\x68\\x87\\x25\\x20\\xbb\\xea\\xe7\\xb3\\x09\\xd7\\x82\\x82\\xa0\\x73\\xfe\\x0b\\x1a\\x1a\\x7a\\x98\\xda\\x23\\xdf\\x68\\xca\\xf8\\xc2\\x69\\x9b\\x1c\\x7d\\x0f\\x47\\xbd\\x7d\\xe2\\xc0\\xbb\\x23\\x36\\x99\\x63\\xe6\\x8a\\x69\\x74\\xc8\\xe2\\xb5\\x95\\xb8\\x29\\x3a\\x9f\\x4d\\x98\\xdf\\x7e\\x9a\\xe3\\xad\\xd2\\xa3\\xf6\\x4e\\x83\\x03\\x97\\x39\\x64\\x2d\\x19\\x22\\x04\\xe8\\x5e\\x6c\\x48\\xd5\\xd6\\x71\\xf6\\xc7\\x5a\\x0a\\x89\\x57\\xed\\xbb\\x74\\x18\\x76\\x20\\xf2\\xab\\xa9\\x9c\\x1c\\x62\\x58\\x4c\\x59\\xac\\x00\\x64\\x7e\\x3f\\xb4\\x02\\x92\\xb9\\xdc\\x1a\\x33\\x46\\x86\\x85\\x53\\x39\\x2f\\xd3\\xf1\\x1d\\x6d\\xc6\\xf5\\xf2\\xf4\\xe8\\x5e\\xe2\\x51\\x25\\xcd\\xd6\\x44\\x74\\x3c\\x7d\\x45\\x28\\x1e\\xda\\xc6\\x38\\x4c\\x77\\xcb\\x98\\xa6\\x7d\\x9a\\xe6\\xfc\\x9a\\x0a\\x76\\xb9\\xf6\\xfa\\x69\\x6f\\xdf\\x4a\\xce\\xab\\x5f\\x79\\x4e\\xe5\\x21\\xb1\\xe5\\xa0\\xee\\x57\\xaf\\x53\\xbd\\xf1\\x76\\x80\\x1b\\x4f\\x45\\xcf\\xb3\\xca\\xe3\\x28\\x72\\x34\\x23\\x4b\\x77\\xce\\x21\\xed\\xf8\\x68\\x0d\\x68\\xc4\\xa8\\xee\\xcf\\x1b\\x03\\x53\\x7e\\xa5\\x69\\x9a\\xcb\\x56\\x27\\x77\\xe4\\x2a\\x48\\x6f\\xe7\\xcd\"},\n{{0xce,0xcc,0xc6,0x83,0x11,0xfc,0x45,0xb6,0xc2,0xa2,0xf1,0xff,0x9c,0xdd,0xe0,0x07,0xec,0x78,0x7f,0xdf,0x25,0xd0,0x2c,0xcd,0x2a,0x1c,0xad,0x9d,0xe3,0xfb,0x4c,0xff,},{0x6f,0x80,0x47,0x34,0xef,0x92,0x82,0x41,0x80,0xda,0x71,0xe5,0x5c,0xf3,0xbf,0x1a,0xfe,0xf6,0x5b,0xcf,0x56,0x09,0x62,0xe0,0xb0,0xac,0xbb,0x2d,0x8c,0xca,0x59,0x84,},{0x3c,0x44,0x62,0xaa,0x47,0x01,0x01,0x32,0xdb,0xb2,0x63,0x11,0xe4,0x44,0x72,0x72,0x79,0xed,0xad,0xe1,0x5a,0x4d,0x66,0x2c,0xf6,0x47,0xf3,0x27,0x5c,0xf3,0x25,0x3e,0x6d,0xe9,0x33,0x38,0x30,0xe0,0x51,0x7a,0xa5,0xfa,0x7b,0xc2,0xd0,0xe6,0x3e,0xa2,0x59,0x7a,0x94,0xb0,0xfe,0x92,0x70,0x6e,0xcd,0x17,0x2c,0x5e,0xc5,0xc7,0xf0,0x06,},\"\\xba\\xc1\\x86\\xd9\\xfe\\x5a\\xbd\\xa7\\x9c\\x3a\\x35\\xa7\\xa3\\xc2\\xea\\xe6\\xae\\x6a\\xb2\\x82\\x47\\x91\\x27\\x70\\xc8\\x4e\\xfd\\x04\\x8e\\xbd\\x3a\\xba\\x57\\xc3\\x7c\\xf4\\xc6\\xc7\\xf3\\x0a\\x79\\xf6\\x8a\\x3f\\x76\\xb2\\x0c\\xd8\\xc6\\x63\\x1f\\xcc\\x96\\x67\\x05\\x22\\x08\\x0e\\x6b\\x62\\xe8\\x87\\xae\\x6f\\x44\\x36\\xd4\\xca\\xf5\\x69\\x43\\x13\\x1c\\x52\\xdd\\x28\\x2b\\x25\\x1c\\xd0\\x75\\xf1\\xf7\\xf8\\xe0\\xbd\\xb6\\xbe\\xdf\\xc9\\xa0\\x79\\x6f\\x55\\x79\\x04\\x2b\\x56\\xe6\\x93\\x74\\x96\\x1b\\x11\\xdf\\xd6\\x1b\\x12\\xde\\x2b\\xb7\\xd4\\x9b\\xfc\\x50\\x9c\\xdb\\x31\\x38\\xf3\\x35\\x6a\\x0d\\xde\\xd9\\x8f\\x53\\x01\\xb7\\xc4\\xa7\\x48\\xbf\\x89\\xb2\\x3d\\xf4\\xf7\\x47\\x2f\\xf8\\xb1\\xf5\\x05\\xd7\\x65\\xc6\\xff\\x82\\xdb\\xad\\x74\\xb9\\xd7\\xae\\xf2\\x2f\\xbc\\xca\\x0b\\x7f\\x35\\x04\\x2f\\x9a\\x76\\x2b\\xd0\\x69\\x02\\xbb\\x21\\xc7\\xf9\\xf7\\xf6\\x6b\\xef\\x38\\x90\\x1d\\x75\\x01\\x2d\\x61\\xd7\\x44\\xde\\xe7\\xaf\\xd8\\x9f\\xc7\\xe9\\x08\\xc4\\x06\\x85\\xbd\\x44\\x0a\\xed\\xa4\\x20\\x4d\\x00\\x6f\\x26\\x30\\x7d\\x82\\xa4\\x96\\x96\\x31\\x15\\xf9\\x0e\\x09\\xf7\\x66\\x88\\x29\\x1f\\x4a\\x67\\xd6\\x41\\x1f\\x76\\xd1\\x66\\x17\\x87\\x5b\\x2b\\x99\\x82\\xdf\\xdc\\x5e\\xe9\\xb8\\x3b\\x98\\x17\\x00\\x93\\x19\\x11\\x0b\\x54\\x04\\xc6\\x31\\x16\\xfb\\x6e\\x94\\x64\\x84\\x6f\\xa0\\x09\\x55\\x56\\x32\\xf0\\x76\\x98\\x4c\\x15\\xe1\\xf6\\x08\\x17\\x33\\xa0\\xd4\\x6f\\x2d\\x6a\\x3c\\xeb\\xf7\\x9e\\xd9\\x02\\x0c\\x9d\\xec\\x8d\\xf1\\x58\\xa3\\x34\\x1f\\x39\\xea\\xa5\\xfc\\xf1\\xcf\\x42\\xa9\\x48\\x49\\xb2\\x35\\x2c\\x1a\\x1e\\xcd\\x4f\\xb8\\x14\\xc2\\x0d\\x07\\xdf\\xda\\x31\\x2b\\xd4\\xf2\\xf5\\x8c\\x15\\x76\\xb4\\xaa\\x31\\x5c\\x96\\xc8\\x78\\x6a\\x4c\\xfb\\xb7\\x36\\xb2\\xd2\\x3c\\x38\\xb1\\xd8\\x1c\\x46\\x44\\xea\\x36\\xaf\\xa0\\x76\\xe0\\x55\\xbe\\x59\\x17\\xcd\\x7a\\x92\\x35\\x0a\\x7e\\xd6\\x6a\\x5a\\xb2\\x25\\x3f\\x55\\xc4\\xfd\\x1a\\x0d\\x0e\\x6d\\x4e\\xda\\xb5\\xf7\\x12\\xed\\xb4\\x40\\xc0\\x6f\\xac\\x8f\\x07\\xe6\\xd7\\x3c\\xc9\\x0b\\x2b\\xa7\\x13\\xd7\\x3c\\x73\\x80\\x23\\x61\\xce\\x46\\xa4\\xeb\\x5e\\xd1\\x06\\x0c\\x4c\\xf5\\x32\\x07\\xd3\\x01\\xf0\\xfc\\xd4\\xf0\\xc9\\xd1\\x58\\x0d\\xb2\\xfc\\x10\\x59\\xd3\\x72\\x07\\x64\\x38\\xa0\\x11\\x92\\xa7\\xf9\\xfd\\x6f\\x78\\x83\\xf5\\x64\\x22\\x86\\x6f\\xd9\\xf0\\xaf\\xe5\\x3f\\xdc\\x91\\x0a\\xfa\\x5a\\x75\\x1c\\xbf\\xa3\\x77\\x59\\x25\\x79\\x16\\x5c\\xb5\\x6d\\xc3\\xeb\\x4d\\xce\\x67\\xe3\\xdb\\x33\\xa9\\x81\\xa5\\x6b\\x7d\\x9f\\x7b\\xde\\xa7\\x4f\\xba\\xea\\x34\\x78\\xe6\\xab\\x2c\\x64\\x4f\\xd7\\x77\\xb8\\xbf\\xa7\\x2a\\xa0\\xf0\\xa5\\x21\\x98\\xd3\\x6e\\x5b\\x63\\x4d\\x2c\\x9a\\x11\\xb7\\xfe\\x0a\\xb2\\xf9\\xa4\\x09\\x01\\xc5\\xb1\\x48\\xa0\\x19\\x2e\\x95\\xa1\\x70\\xba\\xf7\\xd5\\x35\\x0f\\xe0\\x1e\\x56\\x95\\x42\\xb9\\x34\\x85\\xa4\\x19\\x71\\x44\\x34\\x85\\xfa\\xf5\\x7f\\x67\\xf5\\x6d\\xfe\\x2c\\x58\\xe5\\x39\\xc9\\xf9\\xb4\\x49\\xc3\\xf9\\x12\\x49\\xa1\\x0c\\x1a\\x1b\\xe7\\xe0\\xb3\\xea\\xbe\\x8e\\xe0\\xba\\xb1\\xf1\\x1f\\x89\\x61\\x4d\\xce\\xd4\\x18\\xc6\\x2a\\x07\\xa0\\xb5\\x9a\\x13\\x70\\xd6\\x53\\x1b\\xa1\\x77\\x09\\x1c\\x6a\\xd5\\x95\\xfb\\x59\\x48\\x82\\x04\\xf6\\x33\\x44\\x73\\x6e\\xa1\\x01\\x7a\\xff\\xbe\\xb7\\x53\\xa9\\x97\\x86\\xb1\\xeb\\x64\\x51\\x0e\\x2e\\x71\\x7e\\xc9\\x0e\\x02\\x74\\x4b\\xc3\\x52\\xd3\\xf1\\xb2\\xab\\x7b\\xe0\\xeb\\x65\\x62\\x3d\\x04\\xfb\\x3a\\x04\\x6c\\xe7\\xf4\\xda\\x69\\x7d\\x82\\x98\\x28\\xa5\\x2c\\x7b\\x04\\x3b\\x2a\\x82\\xec\\x97\\xfb\\x04\\x1b\\xf5\\x19\\xb4\\xde\\x31\\x6f\\x4e\\x2f\\x5b\\x0d\\xb6\\x2a\\xed\\x0e\\xed\\x95\\xca\\xd4\\x32\\x0c\\x19\\x47\\xc3\\x5f\\xd8\\x84\\x7a\\x58\\x67\\x87\\x28\\x83\\x56\\x11\\x19\\xc0\\x1b\\x00\\x89\\x21\\x3d\\x84\\xdb\\x99\\xd4\\x39\\xf0\\xf6\\x44\\x4d\\x87\\x83\\xdd\\x4b\\x64\\xbe\\x35\\x77\\xcd\\x46\\x1c\\xf7\\x53\\xc8\\xe6\\x1c\\x91\\x2d\\xe2\\xe5\\xd7\\xa7\\xe2\\xba\\xef\\xa2\\x58\\x97\\x5d\\x16\\xef\\x31\\x17\\xda\\x59\\xa6\\xc8\\x93\\xf3\\x33\\x91\\x87\\xdf\\x31\\x68\\xb8\\x9f\\x0f\\xb0\\xb2\\x19\\x8b\\xb6\\xf1\\x59\\x4b\\xb8\\x8f\\x3d\\x61\\x0f\\xce\\xc3\\xe3\\x6d\\xe0\\x4a\\xe1\\x03\\x28\\x11\\x2e\\x6f\\xf7\\x4f\\x5a\\x8c\\xe6\\x8d\\x40\\x71\\x74\\xb4\\xc0\\x69\\x1c\\x76\\x02\\xea\\xb1\\xbb\\x10\\xf3\\xc4\\x9d\\xd2\\x2b\\x84\\x50\\x78\\x2d\\xea\\xe9\\xa7\\x31\\x5e\\x3b\\x88\\xde\\x79\\xcd\\x15\\xe6\\xc9\\x26\\x81\\x65\\xed\\x3a\\x0f\\xb3\\xf8\\x9b\\x18\\x3e\\x1a\\x21\\x21\\x52\\x00\\x3f\\x32\\xa2\\x66\\x5d\\x37\\xcd\\xd7\\xf6\\xb5\\x6c\\x24\\x53\\xe5\\x58\\x0c\\x4d\\x21\\xf9\\x98\\x3f\\x38\\x79\\x8e\\x9b\"},\n{{0x7b,0x30,0xb4,0x2d,0xc2,0xc6,0x70,0xa1,0x95,0xfe,0x2a,0xf8,0x79,0xfc,0x5d,0xe3,0x74,0x02,0x45,0x88,0xfe,0x3d,0xe4,0x3e,0x2d,0xd5,0x08,0x44,0xf4,0x8f,0x42,0xbe,},{0x82,0xa2,0xac,0x60,0x79,0xf2,0x12,0xb5,0xee,0xdd,0x0c,0x19,0xe9,0x39,0x4f,0xaf,0xac,0xd7,0x4d,0x71,0x6f,0xde,0xfb,0xfc,0x6c,0xb8,0xa7,0xea,0xf4,0x1c,0x03,0x62,},{0x0a,0x63,0xb8,0x4f,0x46,0x93,0x5f,0xaf,0x3e,0xa1,0x64,0xb0,0x0a,0xf2,0x27,0xb0,0x08,0x68,0xa0,0x3f,0x56,0x12,0x93,0x5e,0x18,0x61,0x9a,0x84,0xa2,0xe5,0x7b,0x88,0x51,0xd7,0x46,0xe6,0x3f,0xd9,0x10,0x07,0x87,0xf5,0x33,0x8d,0x51,0xc1,0x07,0x3c,0x2f,0xc5,0x30,0x30,0x99,0xe1,0x87,0x3e,0x5e,0x3d,0x3e,0x5c,0x03,0x6f,0xbe,0x01,},\"\\xc6\\x68\\x7a\\xef\\xeb\\xc5\\xc8\\x16\\xd1\\xa3\\x34\\x53\\xbe\\xca\\x50\\x20\\xd3\\xa9\\x7c\\xda\\x1d\\xac\\x56\\x62\\xf0\\xaf\\x72\\xba\\xd4\\x44\\xe2\\xfd\\x11\\x76\\xa7\\xb0\\x4c\\x1b\\xd0\\x9d\\x83\\x26\\x18\\x20\\x9b\\xf3\\xe3\\x3e\\x52\\x35\\x38\\xd6\\xda\\xa7\\x53\\x04\\x6e\\x87\\x1d\\xd3\\xb3\\xc7\\xac\\xad\\x33\\xe7\\x9c\\x1b\\xb7\\x89\\x64\\x07\\x86\\x5d\\x16\\x8d\\x4b\\xc3\\x75\\x7b\\xde\\x4f\\x82\\x3c\\x08\\x77\\x86\\x26\\xf8\\xc7\\x1f\\xb7\\xcf\\xcf\\xdf\\x03\\xa8\\x24\\x97\\xbd\\x8b\\xe7\\xd8\\xf8\\xef\\x64\\x90\\x30\\xb5\\xf3\\x6a\\x33\\x94\\x59\\x96\\x8e\\x24\\x6a\\x1e\\x42\\x08\\x53\\xda\\xce\\x41\\xca\\x85\\x0a\\x4e\\xea\\xe8\\x34\\xae\\x11\\x96\\x10\\xca\\x4c\\xd0\\x66\\x2a\\xac\\x39\\x62\\x15\\x86\\x99\\x80\\x27\\xef\\x2f\\x61\\x48\\x5c\\x02\\x85\\x06\\x71\\x4a\\xe0\\x9c\\x76\\x39\\x9d\\x87\\x3e\\x80\\x81\\x58\\x57\\x8a\\xa5\\x9e\\x82\\x12\\xf5\\x88\\x65\\x31\\x9f\\x9e\\x0d\\x2b\\x8d\\xa7\\xad\\x52\\x9e\\x0a\\xc1\\xf1\\xeb\\x43\\x5a\\xec\\xfd\\x35\\xf5\\xab\\xb9\\x2b\\xea\\x50\\x73\\x49\\x6b\\xf4\\xc0\\xbf\\x15\\xba\\xa2\\x73\\xbf\\xc5\\xc3\\x10\\x44\\x74\\xa2\\xdc\\xf1\\x32\\xc3\\x33\\xeb\\x36\\xec\\x2c\\xbf\\x04\\xfa\\x95\\x80\\xb7\\x68\\xf5\\xce\\xa7\\xb5\\x61\\x7e\\x58\\x80\\xaf\\xf6\\x32\\x01\\xc2\\x74\\xd6\\x69\\x74\\x3e\\x1b\\xc5\\x56\\xb0\\x67\\x90\\x2e\\xee\\x29\\xd2\\x91\\x11\\x28\\x89\\x69\\xcf\\xfa\\x87\\x9f\\xc9\\xcb\\xf6\\x6f\\xbf\\x93\\x26\\xd9\\xd9\\x25\\xac\\x41\\x02\\xfa\\x9f\\x1a\\x06\\x08\\x1a\\xde\\xc0\\x79\\xcb\\xc9\\x67\\x46\\xd7\\x9b\\x63\\xa0\\x12\\xed\\x77\\xd8\\x2c\\x9f\\xfd\\x4e\\x3f\\x16\\x1f\\x6c\\xea\\x28\\xcc\\x23\\xfa\\xc2\\xa5\\x43\\xf5\\xb1\\xd0\\x64\\x4e\\xc0\\x48\\x38\\x32\\x7b\\xcc\\x65\\x2b\\x85\\x8f\\x93\\xff\\x46\\x3f\\x7e\\x94\\x9e\\xec\\x8c\\x9d\\xb6\\x56\\x9a\\x86\\x98\\x4f\\x83\\x1d\\xf6\\xac\\x6d\\x95\\xf3\\x8f\\x46\\xce\\xbb\\x6e\\x65\\x83\\x65\\x7f\\xac\\xd2\\x10\\x8d\\xbc\\xd0\\xaf\\x23\\xab\\x01\\x01\\xa1\\x30\\x1b\\xeb\\x48\\xa4\\x4c\\xac\\xcb\\x91\\x09\\x44\\x73\\xd7\\xe5\\xa5\\xc8\\x8c\\x64\\x4f\\xd3\\x42\\x05\\x73\\xb6\\x78\\xf1\\x7b\\x51\\x74\\xcb\\x14\\xe9\\x0f\\xac\\x69\\x4d\\x1d\\xbc\\x6c\\x96\\x32\\xb5\\x97\\x4a\\xef\\x28\\xac\\x08\\xd7\\x20\\xb2\\xea\\x30\\x44\\x0d\\x2a\\xfb\\x04\\x93\\xb4\\x0d\\xb2\\x4e\\xfb\\xdb\\xf5\\x3c\\x43\\x09\\x21\\xe5\\x2a\\x10\\xb5\\x46\\x61\\xe1\\x49\\xd1\\x65\\x59\\x1a\\x7c\\xf9\\x1d\\x65\\x08\\xea\\x47\\x2f\\xb3\\xbe\\x16\\x39\\x5e\\x30\\x31\\x2f\\x19\\xb8\\x7c\\x47\\xe4\\x68\\x04\\xa0\\xfa\\x29\\xb5\\x6b\\x5a\\xc9\\x50\\x67\\x7b\\xc6\\x02\\x38\\xb5\\xe9\\x9e\\x03\\x0b\\x1e\\x55\\x21\\x46\\xa0\\xe8\\x8c\\x29\\x4c\\xfc\\xa8\\x35\\xc1\\x01\\xc5\\x5f\\x34\\x23\\x87\\x4c\\xc1\\x28\\x75\\x6e\\x73\\xa5\\xde\\xbe\\x8e\\x97\\xfe\\x21\\x66\\xb6\\x5c\\xb4\\x46\\x42\\x77\\x0c\\x6d\\x1d\\x23\\x90\\xaf\\x1b\\x0f\\x31\\xb9\\x58\\xc8\\x30\\xe9\\xac\\x4f\\xe2\\xf5\\xad\\x59\\x05\\x82\\xfb\\xb8\\x92\\xbf\\x94\\x95\\x84\\x47\\x7e\\xf7\\xbd\\xe2\\x3f\\x7d\\xd0\\x2b\\x63\\xf7\\xc2\\x90\\x88\\xa5\\x72\\x51\\x00\\x91\\x32\\xff\\xbb\\x78\\xed\\x14\\xde\\xfb\\xef\\xd9\\xfd\\x31\\xfd\\xca\\xb0\\x3b\\xa8\\x0a\\x23\\xf3\\x33\\x98\\x37\\x60\\xab\\xad\\x4f\\x16\\xdd\\xf9\\xdd\\x44\\x14\\xf0\\x4d\\x00\\xdb\\x56\\xba\\x72\\xd6\\x3a\\x3a\\x13\\xd2\\xc4\\x42\\xf5\\x49\\xfd\\x66\\xc9\\x88\\xd2\\xe4\\x60\\x1d\\x13\\xb5\\x2f\\x77\\x50\\x0d\\xd6\\x92\\xbe\\xc9\\xd6\\xbd\\x3b\\xaf\\xa9\\x24\\x2f\\xdc\\xfa\\xeb\\x69\\xb9\\x8b\\x0b\\x57\\x89\\xb2\\x80\\x38\\x40\\xde\\xc6\\x37\\xb4\\x9a\\xf4\\x38\\x1a\\xe3\\xfa\\x42\\x9f\\xb5\\x34\\x61\\xa0\\xc6\\x74\\xeb\\x5a\\xa1\\x8d\\xbd\\x60\\x7a\\x2b\\x77\\xa9\\x6d\\x3a\\xb4\\x64\\xec\\xd9\\x74\\x92\\xf6\\xde\\x46\\x0c\\x9f\\x11\\xb5\\xc1\\x75\\x6c\\xb5\\x9c\\xb1\\x34\\x8d\\xfd\\x77\\x95\\x6b\\x71\\x90\\x7c\\x54\\x82\\x1e\\x30\\x3c\\xb8\\xb1\\x49\\x06\\xc0\\x03\\xe3\\x48\\x4b\\xe4\\xea\\x05\\xa6\\x90\\x1d\\x69\\xb0\\x74\\x85\\xe8\\x58\\xf7\\xb4\\x71\\xc6\\x35\\xf9\\x03\\x95\\xb9\\xa3\\xe2\\x24\\x7f\\x1a\\xd1\\x2b\\x11\\x8f\\xfa\\xfc\\x72\\x21\\xa5\\x7b\\x10\\xe3\\x19\\xb6\\x1a\\xf1\\xc1\\x36\\x06\\xa8\\x16\\x16\\xce\\x3f\\x1d\\x62\\xba\\x93\\x2f\\xf4\\xe6\\x3e\\x74\\xb8\\x42\\x55\\xe3\\xaf\\x52\\x10\\xbb\\xd5\\x71\\xbd\\xa4\\x4c\\xbf\\x44\\xb7\\x14\\x42\\x2c\\xb4\\x5c\\x2e\\xf2\\x1f\\x98\\x13\\x1b\\xa9\\x6b\\x7e\\xdb\\x9b\\x03\\xe3\\x3d\\x7d\\x18\\x8d\\x5b\\x8d\\x90\\x4c\\xb4\\x13\\x6f\\xe2\\x69\\xdb\\x14\\x69\\x88\\x16\\x8e\\x7e\\xe2\\x45\\x35\\x63\\x54\\xf0\\x02\\xa5\\xea\\x8b\\x35\\xa3\\xa9\\x9e\\x83\\xa1\\x32\\x72\\x27\\x41\\x44\\xb3\\x3a\\x60\\xca\"},\n{{0x66,0x56,0xf4,0xd4,0x71,0x81,0x57,0xc4,0xba,0xc3,0x8f,0xf7,0xab,0xe5,0xeb,0x1f,0x81,0x2c,0x0b,0x98,0x6d,0x9c,0x01,0x4a,0xba,0xd5,0xb0,0x9a,0xa6,0xc8,0xee,0x4a,},{0xf3,0x08,0x78,0x98,0xe4,0x52,0xbe,0x9e,0x30,0xae,0xcc,0x4e,0x8f,0xfe,0x0c,0x01,0x16,0x98,0x88,0x68,0x3f,0x62,0xa4,0x5b,0x8d,0xa3,0x82,0x99,0x01,0x4f,0x5b,0x4a,},{0x9c,0x2c,0x39,0x91,0x5a,0xed,0x6a,0xdd,0x00,0x4e,0x7d,0xd6,0x84,0xee,0x3d,0xcd,0xd1,0x0d,0x87,0xa4,0x87,0xf6,0x77,0xe7,0x3c,0x2b,0xce,0x0f,0xca,0x7d,0x50,0x87,0x96,0x46,0x41,0x50,0xa5,0x2a,0x44,0x0f,0x52,0x37,0x85,0x0a,0x00,0x9c,0x72,0x16,0x2d,0x9d,0x29,0x85,0x47,0x0a,0x33,0x49,0x0e,0x66,0xd3,0xc4,0x01,0x70,0x4c,0x05,},\"\\x94\\xd9\\xe5\\xe5\\xa7\\xb7\\x05\\xd9\\xd9\\x76\\xfe\\x71\\xe9\\x4d\\x3f\\x7f\\xa7\\x86\\x6a\\xfb\\xf7\\xec\\xe4\\x24\\xf1\\x36\\x32\\x77\\x99\\xb2\\xb2\\x06\\xce\\x4e\\xf4\\xc3\\xf3\\xe7\\x05\\x55\\x3a\\xfc\\x8f\\xd5\\xc1\\x95\\x2a\\x4c\\x16\\x65\\x8d\\x4a\\x78\\xaf\\xbb\\x9a\\x97\\xf2\\x71\\x93\\xc6\\x5b\\x65\\xb8\\x2e\\x8f\\x3b\\x71\\x51\\x5f\\xac\\x82\\x64\\x0e\\x0f\\x8a\\x5f\\xb3\\x5a\\xe6\\xfc\\x6a\\x3d\\xb0\\x51\\xa2\\x2d\\x4a\\x53\\x00\\x41\\x3e\\x6e\\x33\\xd1\\x9c\\x20\\x13\\xc2\\x98\\x3a\\xca\\x8a\\xd6\\xce\\xc2\\xce\\x64\\xa8\\x14\\x16\\x4f\\x06\\x1a\\x1a\\x3c\\x5a\\x86\\x10\\xa7\\x65\\x0b\\xfb\\x54\\x23\\xd4\\x36\\x2c\\xe0\\x22\\x06\\xdb\\xe4\\xa6\\xfa\\x82\\x6f\\x03\\xb4\\x2a\\xc3\\xcd\\x9e\\xa4\\xc6\\x51\\x40\\x1b\\x3c\\xea\\x82\\xc3\\x99\\x3f\\x6a\\xf8\\xb2\\xc9\\xe2\\xe6\\xff\\xe6\\x92\\x80\\xab\\x3f\\x09\\xfb\\xe9\\x0d\\xd5\\x47\\xcc\\xda\\x9d\\x9e\\x8e\\x8a\\x53\\x7b\\x3b\\x36\\x05\\x54\\x22\\x7e\\xd0\\x70\\x9f\\x29\\x31\\x98\\x98\\x2e\\xfb\\x5e\\xfb\\x0e\\x73\\xe0\\x00\\x42\\xd1\\xa0\\x63\\xb5\\x74\\x52\\x02\\x7d\\xce\\x1a\\x39\\xe4\\xb0\\x06\\x8f\\x58\\xb1\\x11\\xec\\x5d\\xc1\\x42\\xbf\\x41\\x9a\\xd8\\x93\\xd5\\x4f\\x42\\x60\\xcb\\xde\\x76\\x28\\xf7\\x83\\xde\\x84\\x96\\x38\\x03\\x06\\xa4\\xef\\xf6\\xd8\\x28\\x69\\x10\\x42\\x59\\xc9\\x4c\\x54\\xad\\x5a\\xa8\\xb0\\x67\\xc4\\x24\\x96\\xcb\\x88\\xdd\\x31\\x15\\x0e\\xa0\\x4d\\x49\\x9b\\xfa\\xc9\\x1f\\x4b\\xb3\\xe6\\x8a\\xf5\\xaf\\x7a\\x56\\x8a\\x3e\\x4c\\xe7\\xf1\\x70\\xd9\\x86\\x01\\x16\\x3f\\x49\\x52\\xf1\\xd2\\x5e\\x12\\xe0\\x0e\\xf0\\xa2\\xd8\\xf1\\x11\\xaf\\xdb\\x0f\\xaf\\xba\\xd2\\xbf\\x8e\\x8b\\x9d\\x49\\x36\\x3f\\xca\\x68\\x18\\x36\\x17\\xb5\\x41\\x27\\x0d\\xda\\x46\\x09\\xb2\\x61\\x67\\x29\\xab\\x1b\\x8c\\x42\\xdb\\xdd\\x7b\\xf9\\x86\\xaf\\x8f\\xba\\x52\\xe7\\x33\\xe4\\x2b\\xa0\\x3c\\x89\\x2e\\x1e\\x1e\\xc0\\x6a\\x90\\xb1\\x63\\xf5\\xa7\\x9f\\x61\\x65\\xeb\\x73\\x16\\x97\\x2a\\xc1\\xad\\xbf\\xcf\\x1d\\xca\\xb0\\x78\\x47\\xef\\x82\\xc2\\xca\\xb1\\x01\\x5d\\xbb\\x50\\xaa\\xdc\\x79\\xfe\\x11\\xc8\\x32\\x09\\x8c\\xac\\xc3\\x98\\x20\\xab\\x08\\x5b\\x69\\x63\\xbd\\x42\\x16\\x0e\\xd6\\x61\\x3b\\xae\\x5e\\x20\\x1f\\x17\\xc0\\xfd\\x7f\\x32\\x35\\x7a\\xe3\\x50\\xce\\x9c\\xbb\\xe9\\x26\\xfa\\x42\\xdc\\xbd\\x42\\x2a\\xc1\\xbf\\x09\\xa1\\x9a\\xd1\\xf6\\x94\\x69\\xe4\\xd1\\xdc\\xb1\\x24\\x11\\x8e\\xd4\\x52\\x2d\\x35\\x3c\\x17\\x42\\x98\\x65\\x0f\\xf8\\x83\\x82\\xfa\\x2f\\xdb\\xb2\\x86\\xc4\\x5b\\x18\\xa9\\xba\\xf6\\xf6\\x76\\x3a\\xc2\\x0c\\x9c\\xa4\\x76\\x7d\\x34\\x8c\\x4b\\x8d\\xed\\x63\\x00\\x76\\x65\\x7b\\x85\\xb1\\x4c\\x11\\xae\\x27\\x37\\xea\\x29\\xa4\\x35\\x15\\xb7\\xf0\\x56\\x74\\xa0\\xcd\\x3e\\xd4\\xbf\\x6a\\x3d\\x18\\x9a\\xe9\\x72\\x21\\x8f\\x87\\x7c\\xd8\\xaa\\x69\\x49\\x9d\\x5a\\x08\\xc9\\x9e\\x44\\x06\\x94\\xcc\\xac\\xcd\\xf1\\xf6\\x42\\xe1\\x4e\\x90\\x10\\x5b\\xee\\x6d\\x98\\xed\\xee\\xab\\x3b\\x4f\\x33\\x9f\\x30\\x01\\x88\\xae\\xc0\\xc1\\x6b\\xd6\\x45\\x21\\xd9\\x28\\x73\\x98\\xe6\\x48\\xdb\\x94\\x33\\x0e\\xd8\\xf6\\xb9\\xab\\x6c\\x7a\\xd9\\x3f\\xfc\\x43\\xe8\\x79\\x2e\\x63\\x7c\\x61\\xbf\\xf7\\xd8\\x56\\xe5\\x4e\\xf4\\x98\\x73\\x84\\xe3\\x12\\xcb\\x57\\x01\\x7a\\x50\\xea\\xe5\\x95\\x2a\\xbe\\x19\\xd8\\x99\\x9c\\x8c\\x82\\xdf\\xc4\\x57\\x98\\xcc\\x17\\xc8\\xd9\\x49\\x6b\\xf5\\x20\\xec\\xc5\\xb7\\x7f\\xe2\\x84\\x91\\x55\\x66\\xc4\\x56\\x85\\xc3\\x04\\xa2\\xac\\xd5\\x25\\xef\\x12\\xc8\\x6f\\x38\\xae\\xf5\\x54\\xd8\\xa2\\x38\\x47\\x37\\xcc\\x41\\x33\\xfb\\x7e\\x2b\\x65\\xc1\\x3b\\xef\\x31\\x66\\x8a\\x6c\\x2f\\x60\\xee\\xcd\\x84\\x12\\xee\\xff\\x7f\\x6b\\x60\\x5c\\xbe\\x95\\x08\\x3e\\x23\\x3e\\xc1\\xa7\\xbb\\x36\\xde\\x23\\x6c\\x8a\\x71\\xba\\x28\\x72\\xbe\\x94\\x6c\\xd3\\xb3\\x89\\x35\\xf5\\xda\\x64\\xc8\\xfe\\xc8\\xe1\\x4f\\x45\\xcc\\xf6\\x12\\x4b\\xab\\x7f\\x70\\x56\\x7c\\x2f\\x2b\\xfd\\xd5\\x66\\x67\\x60\\x95\\x72\\x03\\x7c\\x76\\x14\\x6c\\x99\\x17\\x07\\x65\\x9b\\x57\\x09\\xb0\\x74\\xe3\\x45\\x1f\\x92\\x1a\\x2d\\xf2\\x83\\xb9\\x6a\\xa2\\x6a\\xb4\\x76\\x62\\x50\\x16\\xf1\\x81\\xad\\x64\\xc9\\x91\\x9c\\xf4\\x1d\\x71\\x4a\\x1a\\x9a\\x5e\\x2b\\xb2\\x6b\\xaf\\x87\\x70\\xb2\\xeb\\xa7\\x7b\\x77\\x8a\\x33\\x26\\x77\\xa7\\x57\\x2e\\xe3\\xa2\\xb1\\xdc\\x05\\xf7\\x35\\x6b\\xdc\\xae\\x5f\\x55\\xe3\\x53\\x29\\xe3\\x4c\\xaa\\x79\\x43\\x0b\\x27\\x0c\\x03\\x61\\x60\\xdc\\x9f\\xca\\xab\\x5b\\x25\\x45\\x43\\xac\\x94\\xb2\\x46\\x81\\xf1\\x71\\x72\\xb6\\x15\\x9d\\x16\\x62\\x1d\\x7a\\xd0\\xee\\xbd\\x89\\x5a\\x1e\\x1d\\x09\\xb9\\x16\\xa8\\x6f\\xb4\\x8e\\x4c\\x91\\x66\\x10\\x57\\xee\\xe9\\x5c\\x08\\x70\\xed\\x54\"},\n{{0x14,0x38,0x3e,0x6e,0x56,0x04,0xc9,0x9c,0x24,0x8d,0x39,0xbe,0x51,0xd1,0x64,0xb1,0x34,0x42,0xb0,0x5e,0x51,0xd7,0x8e,0xcd,0x99,0x93,0x64,0x22,0x1a,0x45,0x03,0x6b,},{0x2f,0xc1,0x61,0x38,0x22,0x0a,0xb7,0x4b,0x3b,0xd4,0x46,0xf8,0xa7,0x14,0xb5,0x8d,0x54,0x63,0xd4,0x0d,0x43,0x67,0x92,0x50,0x07,0x47,0x4c,0x5b,0x9e,0x35,0xd4,0x94,},{0x45,0xe8,0xed,0x1a,0x75,0x1d,0xfc,0x3b,0x9b,0x7b,0xd7,0xa1,0x0b,0xf5,0xbd,0xcf,0x8c,0xa4,0x61,0x86,0x5a,0x49,0x0c,0x10,0x5f,0x10,0x45,0x29,0x41,0xcf,0x87,0x72,0x12,0x14,0xbf,0xbf,0x3a,0x35,0x60,0x6b,0x7c,0xe3,0x5d,0x6f,0x70,0xaa,0xf2,0xd5,0xea,0xdc,0xc0,0xde,0x03,0x5e,0x9b,0x2f,0x6d,0x7b,0x86,0x2f,0xc2,0x84,0x90,0x04,},\"\\xc4\\x75\\x3b\\x7f\\x7a\\x6f\\x6d\\xea\\x25\\x15\\xc6\\xe3\\xd2\\x95\\x61\\x50\\x6f\\x4f\\x36\\xe0\\xde\\x84\\x99\\x92\\x21\\xf2\\x28\\xe2\\x0b\\xd5\\x12\\x8e\\xd9\\x3b\\xdb\\x8d\\x11\\x93\\x23\\x7d\\x8e\\x29\\x41\\x69\\xa2\\xbc\\x44\\x8a\\xf9\\xdd\\x36\\x06\\x63\\x01\\xef\\xb7\\xfe\\x12\\x31\\x35\\x3c\\x06\\x23\\xff\\xe1\\x11\\x5d\\xeb\\xb6\\x90\\x5a\\xc6\\x94\\x6e\\xe3\\x82\\xa2\\x7c\\x3c\\x09\\xe1\\xb1\\xf5\\xc1\\x14\\x93\\xdb\\xa3\\x7d\\xa0\\xff\\x6e\\xea\\x75\\xd9\\xfa\\xb0\\xee\\x92\\x6d\\x70\\x1d\\xac\\x2f\\xc5\\xb7\\xef\\x57\\x88\\x80\\xa5\\xd5\\xee\\xec\\xad\\xc1\\xf4\\xbc\\xc4\\xcd\\x4e\\xc6\\xf2\\xf1\\x4f\\x52\\xa8\\xc1\\x64\\x07\\x2e\\x6f\\xde\\x5a\\xb2\\xee\\x9c\\xee\\x0b\\x48\\xe5\\x1a\\xf0\\x55\\xf9\\xfe\\xc7\\xc6\\x37\\x50\\xfe\\xdf\\x72\\x33\\x2b\\x23\\x86\\x3a\\x1e\\x54\\xc5\\x2b\\x46\\x1a\\x21\\x50\\x6d\\xfd\\xfc\\x63\\x88\\x0e\\x22\\xd8\\x9c\\x89\\x44\\x12\\x66\\x6c\\x92\\x98\\x21\\xc0\\xe4\\x39\\xe7\\x45\\x41\\x5f\\x71\\x79\\x69\\xe6\\x05\\x85\\x54\\xd6\\x4b\\x94\\x7a\\x4f\\xc9\\xd1\\x6a\\xca\\xe3\\xe4\\x9a\\xec\\x08\\x80\\x1a\\x09\\xd9\\x72\\xf7\\x9e\\xad\\x68\\xd5\\x29\\x76\\x80\\x69\\x73\\x5c\\xaa\\x74\\x2b\\x45\\xa5\\x83\\x05\\x81\\xb8\\x0c\\xa0\\x61\\xa6\\xc1\\x51\\x5e\\x3f\\x7d\\x5a\\x93\\x37\\x87\\x8c\\x19\\xfc\\x94\\xee\\xf2\\x26\\x98\\xea\\x6c\\x4d\\x05\\xf9\\xed\\x41\\x1b\\x6b\\x8f\\x05\\x2b\\x5f\\xf1\\x5d\\xc2\\x3a\\x64\\xbe\\xea\\xae\\x99\\xf8\\x48\\x93\\xde\\x3d\\xf9\\x40\\xa4\\xe0\\xb8\\xe9\\x93\\x93\\x01\\x39\\x05\\x2d\\x99\\xbe\\x47\\xbc\\xa8\\x77\\x5f\\x85\\x63\\xbd\\x40\\x26\\xb7\\x13\\x43\\xd5\\x19\\x68\\xf2\\x33\\x75\\x28\\xf4\\xc9\\xdb\\x8b\\xbd\\x0a\\x29\\x8a\\xf0\\x4b\\x27\\x69\\x5d\\x86\\xb7\\xf7\\xba\\x6c\\x4c\\xcc\\x62\\x73\\xfe\\xbc\\xd8\\xf7\\x5c\\xff\\x26\\x69\\x95\\x24\\x4f\\xc1\\xfa\\x13\\xd8\\xd8\\x43\\xf0\\xbf\\xf4\\x9c\\xc2\\xd5\\x08\\xf4\\xa2\\xb3\\xaa\\xd1\\xd9\\x5f\\xb2\\x2a\\x2b\\xc6\\xad\\x1b\\x96\\x6b\\x08\\x12\\xd9\\x90\\x70\\xbb\\xa0\\x7c\\x92\\x3e\\xe4\\xd0\\x81\\x07\\x48\\x6d\\xc0\\x1a\\x06\\xdb\\xa6\\xf1\\xd5\\xf1\\x05\\xac\\xea\\xde\\x33\\xb1\\x66\\x51\\x0e\\x42\\x7e\\xbb\\xce\\x52\\xa3\\xe7\\x83\\x1f\\x0f\\x78\\xa3\\xc6\\xe0\\x72\\x60\\x83\\x34\\xd8\\x02\\x1c\\x33\\x8a\\x73\\xcc\\x0c\\x47\\xf1\\x9c\\x9f\\xae\\x40\\x3b\\x97\\x16\\xd0\\xd1\\x5f\\xbd\\xf6\\x46\\x6b\\x08\\xf6\\xac\\xce\\x3f\\x50\\xa7\\x03\\xb1\\xde\\xa8\\xd8\\x26\\xdf\\x84\\x2c\\xa1\\xba\\x20\\xd2\\x9f\\x45\\x48\\xac\\xfc\\x75\\x4c\\xf0\\x11\\xf5\\x70\\x68\\x1b\\x59\\xe4\\xda\\x25\\x38\\x5e\\xbd\\x6d\\x5c\\x3a\\xdc\\x93\\x05\\x29\\xe1\\x66\\xce\\x67\\x05\\xf6\\x01\\x02\\x10\\xdb\\x10\\x64\\x62\\xb3\\x33\\x32\\x04\\xe7\\xad\\xad\\xee\\x66\\x06\\xa5\\x62\\x06\\xb4\\x7e\\xef\\x20\\x74\\xb1\\x16\\xe2\\x2a\\x61\\x54\\x18\\xec\\x2c\\xdc\\x33\\x1f\\x1e\\x19\\xe0\\x7e\\x8a\\x37\\xb9\\x2d\\x69\\xdf\\x07\\x34\\xe0\\x85\\xda\\xee\\xb9\\x01\\xec\\x6e\\x8c\\x35\\xf1\\x03\\xf1\\xd8\\x6e\\xf0\\xd2\\xa2\\x65\\x2b\\x01\\xd1\\x83\\x59\\x7e\\x4c\\xfd\\xee\\xdf\\xe5\\xdf\\x9a\\x7e\\xf6\\x6a\\x1c\\x79\\x6a\\x37\\xa2\\x71\\x13\\xb9\\x44\\xdd\\x7b\\xa1\\x7c\\x46\\x00\\x15\\xab\\x8a\\xce\\x45\\x1c\\x57\\x85\\x0e\\xc6\\xc2\\x90\\xc5\\x4e\\x51\\x13\\xf5\\x5e\\x99\\xa8\\xe6\\xe4\\x71\\x1e\\x3b\\x78\\x17\\xbf\\x91\\xa5\\xad\\xb3\\x7f\\xb9\\x46\\x1b\\xe6\\xb1\\xb5\\x5d\\x58\\x60\\x46\\xe4\\x2a\\x54\\xc5\\xde\\xf4\\x07\\x6f\\x1f\\xf6\\xc3\\x1b\\x80\\x6f\\xc6\\x02\\x47\\x43\\x56\\xaa\\x28\\x99\\xea\\xe7\\x0f\\x5e\\x5a\\xbf\\x1f\\x75\\xa7\\xf2\\x4c\\x13\\x4c\\xde\\x11\\x79\\x3b\\xb1\\x62\\xe0\\x3a\\x58\\x3d\\x5b\\xe0\\x46\\xac\\xc7\\x34\\x56\\xd1\\x2d\\x50\\x9d\\x92\\xf7\\x70\\x57\\x68\\x68\\x6f\\x6c\\x71\\x4a\\x4e\\x57\\xec\\x88\\xb7\\x13\\x98\\xe2\\x3e\\x83\\x5d\\x6d\\x65\\x47\\x22\\x59\\x96\\xb7\\xed\\x08\\xf3\\xb7\\x44\\x3b\\xb1\\x7c\\x89\\x94\\x09\\x49\\x3d\\x0e\\xfe\\x84\\x55\\xbe\\xc8\\xe8\\xc2\\x84\\xa3\\xb1\\x49\\xa5\\xb4\\xca\\x63\\x1e\\xa6\\x20\\xb1\\xbb\\x81\\x7c\\xed\\xab\\xa5\\x0b\\x04\\x44\\x11\\x84\\x9d\\x26\\x0a\\x6f\\x2a\\x0d\\x3f\\x2c\\xce\\xec\\x38\\x42\\x71\\x9a\\x5e\\xa4\\xfe\\x18\\xdd\\xe0\\xd4\\x2d\\xcb\\x33\\xad\\x21\\xe6\\x45\\x33\\x25\\xaf\\x6f\\x3c\\x00\\x9f\\x2b\\xb9\\x78\\xd3\\x0c\\xee\\xae\\x9a\\xa4\\x92\\x8b\\xf7\\x37\\x67\\xcd\\xa9\\x29\\x2a\\xb8\\x93\\xce\\x5f\\xa3\\xaa\\x4c\\x23\\x21\\x63\\xb4\\x5c\\x64\\xed\\x79\\x77\\x77\\x9b\\x1c\\x0c\\xaf\\xcf\\xc2\\xb9\\xfa\\x08\\x4a\\x32\\x4f\\x11\\x3a\\xde\\xec\\x21\\x8b\\x47\\x35\\xb6\\xb4\\x64\\xdb\\x6d\\x46\\xc2\\x79\\x1a\\xf3\\x45\\x5f\\x1c\\xa5\\xea\\x1e\\x9a\\x04\\x8c\\x05\\x1a\\x54\\xdf\\xa0\"},\n{{0x59,0xb0,0x72,0x63,0xb2,0x2c,0x0a,0x38,0xbb,0xc5,0x91,0x05,0x95,0x94,0xb2,0xbd,0x92,0x7e,0x80,0x59,0x61,0xdd,0x07,0xe1,0xf9,0x42,0x45,0xb2,0x3a,0xa2,0xe0,0x16,},{0x0b,0x1e,0x4c,0xf5,0xaf,0xf2,0x78,0xec,0x65,0xb4,0x05,0xf5,0x10,0x8e,0x1b,0x5b,0x18,0xa9,0x69,0xad,0x1f,0x1e,0x63,0x81,0x91,0x2c,0x82,0xd6,0x98,0x90,0x7c,0xba,},{0x88,0x6d,0xa3,0x3e,0x35,0x53,0x28,0x5e,0xa5,0x9c,0x14,0x31,0xb6,0xe8,0x6e,0xa4,0x9b,0xb6,0x8b,0x2e,0x0e,0xfd,0x2b,0x15,0x7e,0x77,0x91,0xb7,0x4f,0x35,0xa2,0x42,0x1b,0xb3,0x59,0xf3,0xdc,0x1e,0x4c,0xe5,0xf1,0x1f,0x73,0x65,0x2e,0x03,0xbf,0xc0,0xb4,0x29,0xc5,0x8f,0x0f,0x2d,0x74,0x18,0xc7,0xc2,0x0b,0xce,0x2e,0x2d,0x19,0x01,},\"\\x08\\xce\\x0d\\x4d\\xb5\\xc2\\xaa\\x50\\x0a\\x19\\xef\\xbc\\x8d\\xc8\\x54\\x92\\x50\\xf7\\xdd\\x46\\xa7\\xa9\\xa5\\x40\\x74\\x17\\xb3\\xd5\\x18\\x20\\xe4\\xb0\\xd6\\x12\\x75\\x58\\x3f\\x56\\xf8\\x97\\xfd\\x94\\x2b\\xdd\\x73\\x11\\xad\\x6b\\xaf\\x73\\x81\\x28\\x56\\x7a\\xf6\\x55\\x8d\\x75\\x90\\x6a\\x02\\xc4\\x34\\x3a\\x99\\x55\\xd5\\x9b\\x11\\x08\\x8c\\x58\\x8d\\xc7\\xdd\\x08\\xf6\\x79\\x65\\xc5\\x60\\x2a\\x56\\x92\\x8d\\xda\\x4a\\xe1\\x64\\x29\\x31\\x63\\xb5\\x17\\xca\\x17\\xde\\xd0\\x4f\\xe4\\xab\\x2f\\x97\\x89\\x13\\x0a\\xe9\\x6a\\xb2\\x31\\xf0\\x7e\\x09\\x01\\x5b\\x78\\xf3\\x84\\x8c\\xef\\x43\\x5d\\xb0\\xad\\x9f\\x35\\xe0\\xfb\\xc9\\x85\\x1e\\x3e\\xcf\\xc9\\xfb\\x18\\x6d\\x14\\xd8\\xda\\x4d\\xda\\x45\\xd0\\xb3\\xeb\\x3e\\xe4\\x50\\x0c\\x10\\x1e\\x31\\x94\\xb5\\x72\\x14\\x06\\x89\\xcd\\x75\\xda\\x12\\x87\\xb2\\x54\\xf3\\x74\\xe3\\xd9\\x33\\x26\\xae\\x5f\\xaf\\x11\\x40\\x18\\xac\\x71\\x4b\\xd0\\x03\\x75\\xd9\\x2a\\x8b\\xb6\\x59\\xc3\\x29\\x12\\x83\\x1f\\x4f\\x20\\x77\\x6e\\x9e\\x2c\\x25\\x02\\x9f\\x0a\\xff\\x39\\xfd\\xda\\xc7\\x24\\x15\\x43\\xa0\\x36\\x6b\\x84\\xde\\x7b\\x1f\\xf2\\x3e\\x8e\\x4d\\xc0\\x93\\xdf\\x0d\\x2d\\xd5\\xe5\\x3e\\x68\\x47\\x94\\x8c\\xf3\\xd0\\xff\\x3f\\x56\\x4a\\xd9\\x4d\\x9c\\xc0\\x0a\\x5e\\xa5\\xb6\\x95\\xe4\\x08\\xbf\\x50\\xf5\\xba\\xb2\\xf6\\xea\\x87\\xba\\x8a\\xd3\\xa1\\x94\\x01\\x95\\xcf\\x1b\\xc2\\xb5\\xb3\\x48\\x47\\xad\\x3a\\x5e\\xff\\xb8\\xa7\\x82\\x3d\\xe9\\x1e\\xf1\\x63\\x38\\x69\\xd1\\xf0\\x46\\x43\\xaf\\x4d\\x82\\x6a\\x59\\xe7\\x8b\\x9d\\x18\\x63\\x12\\xb3\\xd9\\x72\\x26\\x36\\x54\\xac\\x55\\x87\\xb8\\x0b\\x71\\x76\\x46\\xf3\\x10\\x03\\xdb\\x81\\xac\\x70\\x86\\x0d\\x3f\\xc8\\xcd\\x3a\\x6a\\x0a\\x0d\\x57\\x6d\\x25\\x73\\x1e\\xf7\\xb8\\x96\\x62\\x63\\xd7\\xa0\\x5b\\x55\\x00\\x9e\\x8a\\x23\\xda\\xc0\\xf9\\xa2\\x1a\\x24\\xb0\\x6e\\x13\\x90\\x0e\\x44\\x44\\x46\\xfd\\xfe\\x56\\xcb\\xc1\\xa0\\x26\\xdf\\x41\\x06\\x6b\\x20\\x1b\\x14\\x81\\xe5\\x61\\x58\\x92\\x6c\\x0c\\x9e\\xa9\\x0f\\x0c\\x64\\x5a\\xab\\x4b\\xef\\x12\\xd4\\xe0\\x72\\xcb\\xfd\\xc3\\xc3\\xd5\\xe0\\xc7\\x2c\\xf8\\x8f\\x16\\x6d\\xe0\\x48\\x87\\x4f\\x35\\x34\\xe0\\x40\\xc6\\x2b\\x16\\x62\\x82\\x1b\\xdd\\x16\\xb0\\xe8\\x58\\x28\\x17\\x46\\x1c\\xb2\\x68\\x92\\x79\\xb4\\x46\\xd7\\x0c\\x8a\\xc2\\x0a\\xd0\\x3e\\x59\\x8c\\xad\\x49\\x08\\xc5\\x2c\\x35\\x0d\\x42\\x43\\xee\\x8a\\xed\\xb8\\x7a\\x4a\\xf9\\x77\\xf7\\xdb\\x57\\xcd\\x94\\x7b\\x47\\xd6\\xbb\\x51\\x40\\x9d\\x80\\xd8\\x1f\\x6d\\xb0\\x3c\\xb9\\xa6\\xa6\\xb7\\x98\\x12\\xf4\\x70\\x69\\x0a\\xfc\\x18\\x36\\xa5\\x31\\x33\\x80\\x94\\xcf\\x26\\xd3\\xc1\\x23\\x2f\\xd5\\x60\\x5d\\x8f\\x8c\\x55\\xb6\\xf8\\xa2\\xa7\\xef\\x1e\\x0c\\x78\\x15\\x55\\x94\\xb2\\x37\\x95\\x6d\\x2a\\xba\\xd6\\xa9\\xad\\xcd\\x58\\xe1\\x1c\\xcd\\x35\\xcc\\x99\\x5b\\x9a\\x0a\\xec\\xbf\\x7f\\x57\\x41\\xac\\x05\\x1b\\x04\\xef\\x6b\\x97\\x44\\xb5\\x6f\\xcc\\xb4\\x63\\x98\\x52\\x8b\\xb3\\x1f\\xbe\\x84\\xe0\\x78\\x84\\x3e\\x69\\xbf\\x33\\x88\\x98\\xcd\\xef\\x69\\xad\\x41\\x87\\x23\\x95\\xe4\\x6b\\x59\\x39\\x04\\x82\\x55\\x47\\xe0\\x0b\\xda\\xf2\\x21\\xf8\\xfa\\x58\\x7e\\xa2\\x03\\x7f\\xfb\\x9a\\xc9\\x30\\x7d\\xd3\\xf8\\xf3\\x5e\\xc5\\x38\\x6b\\xa9\\x66\\x33\\x3e\\x2a\\xc8\\x72\\x7b\\x0e\\x1b\\x80\\x61\\x2d\\x3c\\x7f\\x2c\\xb8\\x8b\\xaa\\xca\\xdf\\xe2\\x16\\x3b\\xc3\\x8c\\x88\\x84\\x2e\\x76\\xa3\\x94\\x57\\x1d\\x40\\x61\\x0e\\x8a\\x29\\x76\\x02\\x79\\x37\\x63\\x29\\x6e\\x3e\\xab\\xf7\\x20\\xe9\\x84\\xb2\\xed\\xd2\\x8c\\xf5\\xc4\\xe0\\xf9\\xa0\\xf7\\x6a\\xce\\xba\\x28\\xcc\\x1f\\x1b\\x69\\xff\\x1d\\x35\\xb4\\xbd\\x33\\x47\\xb7\\xf9\\xa9\\x5a\\x4c\\x1e\\xa1\\x07\\x34\\xe1\\xc9\\x18\\xeb\\x96\\x24\\x9d\\x0c\\xc7\\x0b\\x47\\x7f\\x6f\\x23\\x80\\x9b\\xbd\\xa9\\x01\\xd5\\x3f\\x48\\x5a\\x71\\xf5\\x08\\x60\\x02\\xc1\\xb7\\x1e\\xfc\\xc4\\x1c\\xb1\\xae\\xb5\\x12\\x2a\\x3f\\x3b\\xfc\\x96\\xc5\\x1a\\x55\\xd7\\x5c\\x02\\x98\\x42\\x88\\xbe\\x65\\x78\\x87\\x85\\x4c\\xfa\\x73\\x89\\x74\\xbc\\xd5\\x44\\x01\\x46\\xf9\\xbb\\x14\\x04\\x0d\\xe5\\x4f\\x54\\x44\\xad\\x43\\xb7\\x9a\\xf9\\xbd\\xb2\\x4e\\xd6\\xa4\\x8e\\xb2\\xfd\\xee\\xd7\\x1f\\x31\\xf0\\xec\\xe1\\x02\\xe9\\x18\\xe9\\x56\\x35\\xc7\\xa0\\x38\\x63\\x3e\\xe3\\x48\\xd8\\xb5\\x78\\x16\\x52\\xd5\\x05\\x9d\\x21\\x5a\\xc9\\x7f\\x30\\xea\\x20\\xd2\\x77\\xeb\\xbf\\x15\\x24\\x69\\x05\\x42\\x8a\\x7b\\xec\\x02\\xb8\\xf9\\x26\\x31\\x5b\\xad\\x67\\x23\\xfd\\x64\\xd7\\x1f\\xc9\\x5f\\x33\\x33\\x64\\xcb\\xe9\\x0d\\x46\\x46\\x33\\x3c\\x40\\xdd\\xa6\\xd1\\xd4\\x33\\xb7\\xc1\\x95\\xa7\\x58\\xdb\\xb4\\x03\\x8a\\xf5\\xdc\\xc7\\x23\\x2d\\x45\\x47\\xf5\\x40\\xe3\\x94\"},\n{{0x5c,0xc1,0x15,0xd8,0x39,0xe0,0x58,0xcd,0xb6,0x51,0x8e,0xe9,0xc1,0x61,0xc0,0x04,0xd8,0x8b,0xd3,0x90,0x8d,0x3c,0xf6,0xd5,0x2c,0x8f,0x29,0x6a,0x1a,0x07,0x6b,0x9b,},{0x1e,0x8f,0x33,0x05,0xbf,0x2f,0xa1,0x1b,0x17,0xd9,0x24,0x16,0xab,0x0e,0xa7,0x62,0x39,0x6d,0x88,0xf2,0xf9,0x70,0xef,0x0b,0x10,0x0e,0xd3,0xbf,0x5c,0xc1,0x34,0x40,},{0x03,0x71,0xc2,0xd6,0x4c,0x5e,0xc0,0xc8,0x27,0x6c,0xa5,0xff,0xa6,0x15,0xef,0xf4,0x2f,0x9e,0xff,0xfc,0x58,0xdd,0x8e,0xcf,0xcf,0x67,0x62,0x0a,0x9b,0xcb,0x38,0xfa,0xf1,0x18,0x93,0x2b,0xf2,0xcd,0x5b,0x92,0x05,0xfa,0x55,0x13,0x34,0xdf,0x2a,0x75,0x7c,0x59,0x77,0x44,0xf7,0x91,0xf3,0x71,0xfb,0xed,0xd9,0x8b,0x21,0xf7,0x34,0x05,},\"\\x53\\x3e\\x49\\xc1\\xd5\\xf3\\x3c\\x5e\\xc4\\xbe\\x84\\xc6\\x19\\xf4\\xec\\x64\\x9c\\x25\\xfd\\x70\\xbd\\xcf\\xe2\\x57\\xa6\\x3c\\x33\\x73\\xa4\\xd0\\x89\\xc8\\x9a\\xf6\\xee\\xb7\\x16\\x0d\\xd7\\x7a\\xb6\\x6b\\x1e\\xe7\\xe1\\x08\\x50\\xab\\x4f\\xc1\\xf3\\x51\\x32\\x33\\x2b\\x53\\x78\\x9b\\x2b\\x01\\x40\\xc4\\xf2\\x0f\\x97\\xf2\\x14\\x20\\x72\\xd6\\x24\\xaf\\xf7\\xaa\\xd3\\x24\\xaa\\xcd\\x06\\x8c\\x03\\x5a\\xff\\x52\\xfa\\x71\\x2f\\x4e\\x74\\x83\\x2d\\xe0\\x31\\xb2\\x64\\x23\\x14\\xd1\\x71\\x10\\xde\\xe6\\xfb\\x85\\x76\\x2d\\xc3\\x0d\\x7e\\x97\\x78\\x2f\\xd1\\xfb\\xff\\x71\\x79\\xf0\\x09\\x17\\xf5\\x5a\\xf7\\x50\\x3a\\x5b\\x7e\\x23\\xc6\\xea\\xdb\\x65\\xe1\\x04\\xf1\\x51\\x7b\\x66\\x24\\xc9\\xe5\\x20\\x4b\\x3f\\xd2\\x9a\\x65\\x85\\xe9\\x2c\\xe3\\xa3\\xee\\xe2\\xc5\\xae\\x17\\x79\\x20\\xf7\\xb4\\xab\\x2c\\xac\\x87\\xd6\\x72\\xab\\x6b\\xaa\\xc1\\x18\\x6d\\x90\\x4a\\xea\\x34\\x98\\x53\\x4e\\xb5\\xab\\x23\\xe4\\xac\\x4c\\x0d\\xdb\\x0d\\x82\\xa5\\xae\\x53\\x1d\\x76\\x54\\x9d\\x36\\x76\\x28\\x57\\x7b\\xac\\x42\\x35\\xe8\\x97\\xd9\\xfe\\x20\\x55\\x22\\x04\\x7d\\x21\\x4f\\xf6\\xcc\\xf3\\x11\\xc4\\xe3\\x97\\x82\\x7d\\x97\\xf2\\x86\\x8e\\x70\\xac\\x17\\xd2\\x8e\\x33\\x49\\x99\\x74\\x4d\\x35\\x93\\x76\\xa4\\x82\\xfd\\xcb\\x41\\x4b\\x02\\xb2\\x68\\x7b\\x96\\x2e\\xe8\\x08\\x6e\\x57\\x3f\\xe0\\x00\\xdc\\x51\\xde\\xe0\\x68\\x79\\xc6\\x84\\xe2\\x5f\\x94\\xce\\xe5\\xe8\\x61\\x34\\x7e\\x7b\\xe7\\xfc\\xa5\\x49\\xa0\\xf7\\x65\\x13\\x6a\\x2f\\x4b\\x88\\xfe\\xde\\x07\\x02\\x4d\\xd2\\xfc\\xe1\\xf6\\xd0\\xc0\\x35\\x4d\\xa1\\xa1\\x6e\\xf3\\x66\\xb3\\x15\\xb3\\xf7\\x23\\x30\\x31\\xf9\\x79\\xb7\\x0e\\xac\\x6e\\x23\\xbf\\x3b\\x34\\x9e\\xfb\\xd0\\xe4\\xf5\\x3f\\x4d\\x5c\\x41\\xfc\\x00\\x42\\x76\\xa5\\x96\\x70\\x65\\x9f\\x69\\x05\\xef\\x03\\xd2\\xfc\\x09\\x8d\\x58\\x9f\\xcb\\xc1\\x32\\x82\\x82\\xfa\\x22\\xb1\\x0d\\xb8\\x3c\\x5d\\x70\\x86\\x59\\x94\\xfd\\x19\\xd7\\x60\\xa3\\x9d\\x47\\x6e\\x02\\x33\\x0d\\x2c\\x6d\\x19\\xe7\\x42\\x26\\x7d\\xd3\\x65\\xbb\\xe1\\xfe\\x5c\\x71\\x1a\\x95\\xb1\\x84\\x50\\x8c\\xe4\\x8c\\x1c\\x96\\xd7\\xe6\\x39\\x90\\xb4\\x08\\xd4\\x50\\x89\\xbe\\x79\\xe3\\x2f\\x9c\\xb0\\x16\\x2f\\xd1\\xe7\\xd0\\xd1\\x9d\\x97\\xd0\\xae\\x78\\xff\\x82\\x4c\\xc6\\x98\\x94\\x86\\xc0\\xbd\\x03\\x83\\x52\\x55\\x1f\\x37\\x49\\x9e\\x9e\\x98\\x26\\x80\\x4e\\x9d\\x26\\x24\\xad\\x0c\\x7b\\x75\\x34\\x56\\x0f\\x45\\xfd\\x7d\\x32\\x4b\\x8e\\x51\\x7e\\x01\\xc9\\xb2\\x74\\x3c\\x14\\x97\\x9c\\xfd\\x51\\x2b\\xc3\\xfe\\x66\\x72\\x79\\xb3\\xa2\\x77\\xfb\\x46\\x3e\\x9d\\x73\\x49\\xb6\\x4f\\xfc\\x9f\\xe6\\x08\\x84\\xc2\\x1e\\x48\\x10\\x81\\xed\\x70\\xe6\\xda\\x5a\\x35\\x39\\xc4\\x48\\x97\\x1f\\x0d\\x97\\x87\\x28\\x9f\\xcb\\x00\\x80\\xf2\\x19\\xe9\\x94\\x49\\xf8\\x29\\x8c\\x42\\x47\\x5f\\x87\\xfd\\x10\\xae\\xb5\\x09\\xc5\\x30\\xcf\\x6a\\x57\\x74\\x8e\\xb8\\xf3\\x56\\x21\\x61\\xfa\\x48\\x75\\xea\\x95\\x3f\\x09\\x65\\x9c\\x7d\\xf7\\xa9\\x95\\x0f\\x03\\x17\\x46\\x7c\\xb4\\xe5\\x36\\x6e\\x19\\x6e\\x32\\xf5\\xe2\\x69\\x67\\x33\\xa2\\x5e\\xac\\xbd\\xe4\\x92\\x10\\x49\\x07\\x62\\x06\\x0e\\xa2\\x31\\x37\\x0d\\x40\\x90\\x42\\x9b\\xb0\\x6b\\xb8\\x67\\x39\\x9e\\x8d\\x37\\xbf\\x5d\\x21\\xa0\\xe7\\x21\\x47\\xe4\\x96\\xcf\\x3b\\x7d\\xd6\\xfe\\x6e\\x5e\\xde\\xa9\\x66\\x8d\\x80\\x21\\x90\\xa9\\x1c\\x60\\x0e\\x29\\x52\\x3f\\x8e\\xb9\\x04\\xe4\\x8b\\x70\\x41\\x2b\\xc1\\x0a\\x70\\x20\\x98\\x4c\\x5f\\xf0\\xf5\\xf3\\x83\\xf2\\x14\\xae\\x59\\x4d\\xc8\\x59\\x71\\xe4\\x80\\x37\\x28\\x48\\xd0\\xd7\\xe7\\xcc\\x5c\\x18\\xff\\x88\\xba\\x9b\\x26\\x2d\\x78\\x84\\x69\\x8a\\x41\\xc6\\xc7\\x81\\x9c\\x03\\x19\\xfd\\xc6\\xbb\\x07\\xb9\\x1d\\xc1\\x69\\x4d\\xaf\\xe3\\xaf\\x37\\xa5\\x38\\xbf\\x2b\\x2d\\x8c\\xac\\xb2\\x7d\\x24\\xcd\\xc6\\xea\\xdb\\x8c\\x6a\\x2e\\x6b\\x7d\\xf8\\xa4\\x65\\x4a\\xe9\\x37\\x85\\x0c\\x89\\x0a\\xd9\\x30\\x98\\x0a\\xfc\\xc1\\x49\\x2d\\xb8\\xa0\\x16\\x8c\\xbc\\x9f\\x10\\x65\\x7e\\xb4\\x8d\\x2a\\xc8\\x7f\\x51\\x75\\xd2\\x3c\\xae\\xd4\\xb5\\xe6\\xf1\\x0b\\xbe\\xaa\\x5e\\x33\\xfc\\x5f\\x64\\x18\\xd6\\x3b\\xa3\\x74\\xab\\x1a\\x3c\\xbd\\x36\\xb7\\x29\\xdd\\xbd\\xab\\xa9\\x89\\xd4\\x64\\x5e\\x3a\\x66\\x13\\x0b\\xae\\x41\\x7c\\xad\\x08\\x6d\\xad\\xd3\\x08\\x43\\x35\\x25\\x14\\xc3\\x75\\xf2\\x57\\x1a\\xba\\xf9\\x3e\\x9a\\x07\\x71\\xfa\\x10\\x3a\\xe9\\x25\\x85\\xb0\\x4f\\x55\\xc4\\x34\\x76\\x9b\\x43\\xd6\\xd2\\x2f\\x75\\x3f\\x93\\x06\\x03\\x6e\\x53\\x52\\x4f\\x6f\\x4d\\x9c\\xcb\\xd2\\xc3\\x03\\x17\\xa8\\xe8\\x99\\xf3\\x16\\x14\\x90\\x35\\x89\\x4d\\xa9\\x45\\xb7\\x6d\\x90\\x82\\xbf\\xee\\x32\\x8e\\x7a\\x31\\xb6\\x63\\x28\\xee\\x8b\\x94\\xe0\\x68\\xc7\"},\n{{0x75,0xa5,0x03,0xf4,0x8f,0xfc,0x22,0x16,0x17,0x67,0x25,0x19,0x11,0x1b,0xf9,0x0d,0xa3,0x9d,0xa9,0xea,0xb2,0xe2,0x91,0x4f,0xd3,0x75,0x5f,0x10,0xf5,0x39,0x36,0x68,},{0xf6,0x80,0xcc,0x0f,0x63,0x58,0xcd,0xcf,0x53,0x7a,0xa7,0x11,0x28,0xcf,0xad,0xfc,0x0f,0x3a,0x89,0xc1,0x00,0xaa,0x34,0xbc,0xd2,0x42,0x7e,0x24,0x8b,0x6e,0xd5,0x0b,},{0xdf,0x28,0xe3,0xe6,0x30,0x36,0x08,0x67,0x86,0x4b,0xc4,0x1e,0x43,0xfd,0x7d,0xde,0xb5,0x28,0x76,0xdc,0xe9,0xb2,0x34,0xa3,0xfc,0xc3,0xd8,0x54,0x9d,0xb0,0x11,0x2e,0x17,0x63,0x90,0xa6,0x85,0xeb,0xd4,0x84,0x93,0x6e,0x25,0xc0,0x8c,0x8a,0x38,0x78,0xa3,0x7b,0x3c,0x4e,0x23,0x9a,0xd0,0xa0,0xe5,0x01,0x99,0x37,0xff,0xbc,0xd4,0x07,},\"\\x7b\\x01\\x09\\x04\\x23\\x23\\x6c\\xb4\\xb1\\x3c\\x41\\x77\\xfc\\xe5\\x2a\\x7f\\xf6\\x58\\x05\\x88\\xcc\\x2e\\xb5\\xa3\\xf3\\x9f\\xf5\\xd0\\xc7\\x3e\\x01\\xe0\\x1b\\xf7\\xbd\\x74\\xaf\\xe4\\x15\\x12\\x50\\xc3\\x91\\x42\\x6e\\xa5\\x07\\x27\\x1b\\xea\\x1d\\x6d\\x85\\xf0\\xb2\\xfe\\x35\\xc4\\x05\\x00\\xf9\\x8d\\x06\\x56\\xc6\\x38\\x8f\\xc9\\xef\\xba\\x18\\x37\\xdb\\x22\\xdf\\xa2\\x9d\\x89\\x26\\x76\\xf5\\x0e\\x57\\x5f\\xe8\\x9f\\xd2\\x93\\x89\\xd0\\x9d\\x08\\x0b\\xad\\x67\\xba\\x54\\x4c\\xac\\xab\\xf5\\xa7\\x73\\x82\\x37\\xc5\\x5e\\x28\\x75\\xed\\x49\\x16\\x30\\x2a\\x2b\\x4d\\xc4\\x96\\xe7\\x42\\x73\\xbf\\x05\\x19\\x11\\x37\\x81\\x0e\\x50\\xe4\\x81\\x95\\x26\\x0b\\xab\\x6d\\x81\\xf9\\xc8\\x05\\x62\\xee\\x73\\xcc\\xb9\\x33\\x3c\\xd9\\xb6\\x1d\\xaf\\x5b\\x00\\x38\\xa4\\xe6\\xc5\\xc9\\x58\\xa9\\x1f\\x68\\x50\\x8c\\x1d\\x88\\x25\\x19\\xc1\\xaa\\x4f\\xfc\\xc5\\x35\\x62\\x46\\x3a\\x0a\\xe3\\x01\\x63\\x69\\x6f\\x84\\xb9\\x7c\\xcb\\xd8\\x67\\x98\\x20\\xed\\xd3\\x61\\x7e\\x7b\\x89\\x6e\\xef\\xfe\\x34\\x1e\\xc6\\xb5\\xb0\\x3f\\x73\\xb6\\x25\\xd7\\x41\\xc6\\x55\\xfe\\x6e\\x82\\xd1\\x1d\\x47\\x8a\\x7d\\x54\\x3f\\xf6\\xc0\\xfa\\x3a\\x3a\\x8c\\x94\\xa6\\x16\\xfb\\x84\\x70\\x70\\xd1\\xfb\\xdd\\xe6\\x01\\x0f\\x02\\x6b\\x08\\x9c\\xd8\\x63\\xc3\\xbd\\x29\\xb1\\xc4\\x26\\x9f\\x77\\x65\\x9e\\x51\\x57\\x28\\x89\\x0c\\x97\\x3b\\xe8\\x7f\\x0b\\x83\\x3c\\xa5\\xaf\\x6b\\x4c\\x31\\x33\\xad\\x4f\\xa4\\xf9\\x16\\x55\\xc6\\xad\\xb5\\xb7\\x23\\x5c\\x27\\xfe\\x34\\x82\\x84\\xf3\\xf1\\x33\\x66\\xa6\\xa0\\x3a\\xd2\\x2b\\x87\\xc6\\xf5\\x58\\x4b\\xde\\xae\\xa4\\x8c\\x70\\x32\\x5d\\x6e\\x33\\xa4\\x75\\xf5\\x05\\x11\\x06\\x38\\x75\\x19\\x2a\\x87\\xed\\xc3\\x88\\x08\\x9b\\x84\\x39\\x53\\x90\\xc2\\xa3\\xad\\x89\\xa2\\x25\\x95\\xdc\\x4a\\x71\\x5a\\x42\\xa2\\xc0\\xef\\xde\\xf6\\x7b\\x35\\x4b\\x34\\xfc\\x75\\xca\\x98\\xdf\\x91\\x3e\\x75\\x9e\\x51\\xc7\\xf6\\x25\\xdd\\xd5\\x98\\xac\\x22\\xd4\\x21\\xde\\xcb\\x57\\xbe\\xbd\\x54\\x22\\x0e\\xc6\\xda\\xa5\\xec\\xe7\\x69\\xd2\\xe0\\x1b\\xe7\\xb6\\xbe\\xe2\\xff\\x5a\\x0b\\x06\\xb3\\x2d\\x6d\\xa1\\xd7\\xbc\\x05\\x7e\\x3a\\xbf\\xaa\\xb2\\x42\\xa3\\xf7\\xe6\\x64\\x6a\\x15\\x9e\\x4f\\x50\\x5e\\x46\\x62\\x98\\x2b\\x13\\xd0\\xcc\\x1f\\xba\\x91\\xd1\\x03\\x09\\xa4\\x2d\\xc1\\x08\\x7c\\xf1\\x0d\\x36\\xe3\\x1f\\x17\\x06\\x15\\xa0\\xac\\xb5\\x08\\xbf\\x68\\x3e\\x2d\\xe0\\x0c\\x87\\x64\\x0d\\x30\\x4a\\x94\\x7b\\xc4\\x97\\x1f\\xf3\\x61\\x9c\\x72\\xab\\xd8\\x3c\\x7b\\x2c\\xbb\\x34\\x64\\xc4\\x04\\x0c\\x26\\x62\\xb5\\x85\\x08\\xb7\\x46\\x80\\xcf\\xa6\\xde\\x06\\xe8\\xd2\\x1e\\x3b\\xec\\x85\\x11\\x19\\x93\\x12\\x68\\x00\\x09\\x07\\x1f\\x70\\x6b\\x7b\\x13\\x3a\\x24\\x87\\xd5\\x74\\x5f\\xfa\\xdd\\x5d\\xc0\\xeb\\x2b\\x55\\x3d\\xf4\\x40\\x78\\x7f\\x01\\x1d\\xda\\x37\\x71\\x9f\\xa7\\x13\\x15\\xe8\\xb2\\x91\\xef\\xd7\\x7d\\xa3\\xba\\x14\\xfb\\x99\\x5f\\x03\\x57\\x1a\\x3d\\xb5\\x22\\xb6\\x3c\\x60\\xbe\\x56\\x19\\x94\\x16\\x99\\xb3\\x92\\x22\\xb5\\x9d\\x0f\\x23\\xe5\\xeb\\x37\\xea\\xd4\\xb7\\xf7\\x50\\xed\\x4a\\xbf\\x4d\\xb8\\x7c\\x70\\xda\\x66\\x5b\\xef\\x4d\\x7a\\x29\\x21\\xb2\\xc9\\x98\\x97\\xf2\\x32\\x1c\\x9b\\xe6\\x07\\x5e\\x74\\x4c\\x82\\x28\\x63\\x9a\\xb7\\x36\\xdb\\xeb\\x2b\\xea\\xb4\\x40\\xc1\\x56\\xa3\\x9a\\x2e\\xfd\\x26\\x1d\\xb5\\x08\\x55\\xe3\\x04\\xd9\\xcf\\xeb\\x99\\x14\\x1c\\x61\\x35\\x58\\x10\\x9f\\x21\\x47\\x4d\\x27\\x2a\\x2d\\x90\\x6d\\x48\\x93\\x93\\x4a\\xff\\x8e\\x08\\xa4\\xfc\\xee\\x96\\x4a\\x5c\\xd0\\x07\\x32\\xfd\\x33\\xaf\\x29\\x84\\x9c\\x8d\\xfc\\xa6\\x59\\x79\\x42\\x18\\x57\\x18\\x5c\\xf6\\x29\\xf8\\x68\\x07\\xa8\\x59\\x73\\xd3\\x44\\x0a\\x6b\\xf8\\x11\\xa5\\x8d\\x04\\x13\\x87\\x24\\x98\\x11\\xec\\x04\\x7e\\x5e\\x8b\\x34\\x3b\\x23\\x87\\xd0\\x18\\x1e\\x0d\\x0b\\xd4\\x61\\xef\\x10\\xe8\\x16\\x4a\\xae\\x35\\x7d\\x9b\\x29\\xdc\\x0a\\xce\\x3e\\xc6\\xd7\\x43\\xae\\x34\\x54\\xab\\x9f\\x84\\x2a\\x28\\xd5\\x71\\x02\\x17\\xdf\\xfe\\x50\\x34\\x4e\\x8d\\x93\\x2f\\x18\\x01\\xb0\\xe8\\xf9\\x66\\x19\\x8e\\xf1\\xc9\\xcc\\x69\\x69\\xf3\\x47\\x34\\xaa\\x6a\\x63\\xae\\xaa\\xb4\\x33\\x9f\\x75\\xd3\\x4f\\xfa\\x8a\\xcb\\x93\\x7e\\xd9\\xc7\\x30\\x92\\xa3\\x09\\xa9\\xb8\\x4a\\x25\\x01\\x1e\\x31\\x14\\xc2\\x65\\xe4\\xf6\\x02\\x33\\x7e\\xb6\\x99\\xb5\\xa2\\x2d\\x57\\x2b\\x03\\xe4\\xda\\xd0\\x3b\\x04\\x61\\xc0\\x0d\\xb9\\x67\\x9b\\x72\\xfc\\x5b\\x49\\x3e\\xf4\\x48\\x6f\\x85\\x53\\x5d\\x81\\x3a\\x58\\x08\\x03\\x85\\xaf\\xd4\\xe8\\xd8\\x71\\x82\\x80\\x34\\x33\\x4b\\xfe\\x44\\x1d\\x18\\x98\\x4e\\x4d\\xfc\\xde\\x02\\x44\\x03\\xb5\\xae\\x66\\xcc\\x50\\xa4\\x73\\x01\\xb5\\x7f\\x9a\\x32\\xf7\\x40\\xbd\\xc7\\xff\\x1d\"},\n{{0xd8,0xaa,0x2a,0x0a,0xa5,0x14,0xfd,0x84,0x5f,0x7a,0xa6,0x6b,0x83,0xc0,0xea,0xbb,0x9c,0x16,0x02,0x3a,0xbc,0x16,0x95,0x77,0x34,0x50,0xb2,0xbb,0x33,0x25,0x22,0xf2,},{0xe4,0xe8,0xd6,0xb2,0x98,0x24,0x8c,0x15,0xfe,0x08,0xf8,0x7a,0x3b,0xc6,0x08,0x4b,0xf2,0xd6,0x4d,0x7f,0x1e,0x4b,0x2d,0x51,0x59,0x9e,0x9f,0xad,0x9c,0xc9,0x10,0x92,},{0x14,0x6f,0x65,0xd4,0x3e,0x71,0x55,0x42,0x89,0x4b,0x79,0x00,0xa2,0xf8,0xcd,0x4b,0x17,0xd3,0x87,0x0a,0x61,0x00,0xe3,0x7d,0xe0,0x05,0xb0,0xdb,0x5d,0x81,0x51,0x24,0x6d,0xe4,0xee,0x38,0x42,0xd3,0xeb,0xca,0x20,0xa5,0xda,0x22,0xa3,0x63,0xa7,0x57,0x5e,0x7a,0x55,0x12,0x82,0x95,0xf2,0x72,0x11,0x48,0x4a,0xf5,0x7c,0xd5,0x31,0x09,},\"\\x08\\xde\\xb3\\xb8\\x32\\xf5\\x2d\\x65\\x56\\xf7\\x8c\\x3f\\x0a\\xbe\\x46\\xf1\\xef\\xe4\\x5e\\x3d\\x5d\\x88\\xe7\\xf8\\xed\\xf8\\x03\\x67\\x0c\\xe4\\x61\\x29\\x21\\x74\\x9e\\x9e\\xce\\x63\\xfd\\xc9\\xbe\\xf2\\xba\\x48\\x38\\x12\\xbb\\x62\\x2b\\xe7\\x44\\xd4\\x04\\x04\\xfd\\x6e\\x09\\xc9\\xe1\\xcb\\x7c\\xe1\\x9d\\xe8\\x1a\\x9d\\xad\\xf5\\x56\\x35\\x2e\\xe8\\x98\\x10\\xc7\\x6a\\x9b\\x10\\x47\\xac\\x62\\xb1\\x6e\\xbb\\x7d\\xa2\\x3d\\xdc\\x2d\\x4a\\xb7\\x6a\\x02\\x05\\x61\\xd0\\x2d\\x41\\xb5\\x8b\\x94\\x95\\x3a\\x23\\xfa\\xaf\\xdd\\xd7\\x81\\xb7\\xdc\\xa7\\xb7\\xfb\\xee\\x70\\x6e\\xc1\\x0a\\x73\\x12\\x5b\\xf7\\x44\\x36\\x05\\x6b\\xf3\\xb4\\xf2\\xa0\\x70\\x1c\\xfe\\xf0\\x5b\\xeb\\xd3\\xdd\\x8e\\xef\\x30\\x6c\\x1a\\xc1\\xb0\\x09\\x50\\x88\\x1f\\xf0\\x5a\\xb5\\xc8\\x24\\x8a\\xd1\\x09\\x6a\\xc9\\x1d\\x52\\x6a\\xe5\\x9b\\xa0\\x58\\x3b\\x27\\xdb\\x7d\\x1e\\x39\\x0f\\x57\\xa5\\x88\\x9e\\x27\\x99\\xa4\\xa1\\x51\\x9b\\x15\\xd9\\x3d\\xbf\\x0b\\x21\\xd4\\x50\\x87\\x3c\\x76\\xba\\x52\\x04\\x61\\xe8\\xbb\\x5c\\x83\\xc9\\x01\\x2e\\xac\\xd5\\x57\\xbe\\xa6\\x40\\x58\\x6e\\xfc\\xb8\\x69\\x00\\x76\\x47\\xd4\\x49\\xf9\\x1c\\xcd\\x52\\xaf\\xe3\\xa8\\x94\\x77\\xde\\x7c\\x2b\\x64\\x7e\\xcc\\x9b\\xf9\\x67\\xfb\\xf5\\x76\\x9d\\x74\\x88\\x94\\x47\\xd9\\x52\\x2d\\x9e\\x80\\x69\\xc3\\x49\\x9a\\xf6\\xa8\\xa1\\x09\\x7a\\x95\\xd3\\xbc\\xc5\\xf8\\x34\\x33\\x93\\x44\\x84\\x31\\x4c\\xb3\\x07\\x58\\xb5\\x25\\xfe\\x53\\xe9\\x07\\x21\\xdf\\x5c\\xbe\\x03\\xd9\\x6f\\x0d\\x0f\\x98\\x52\\x1f\\x01\\xa5\\xfb\\xe5\\x7c\\xe8\\x80\\x4d\\xbd\\x18\\xf8\\xf5\\xea\\xc8\\xf7\\xdb\\xb5\\x8c\\x41\\x78\\x9a\\x44\\x43\\x3f\\x8a\\x8d\\x12\\x45\\xd2\\xad\\xda\\x8c\\x78\\xd8\\x81\\xc6\\x5e\\xa6\\x61\\xab\\x17\\x8d\\x4f\\xc2\\x63\\x4c\\xd6\\xcb\\x51\\x4a\\xb6\\xf2\\x54\\x3e\\x91\\x12\\x18\\x3f\\x3f\\xf7\\x3a\\x3f\\x45\\x01\\x06\\xb0\\xee\\x8a\\x34\\x7a\\x80\\xcb\\x82\\x4a\\xc1\\xf8\\x01\\x64\\xe3\\xbb\\x51\\x23\\x69\\x8d\\xe0\\xe7\\x47\\x35\\x9c\\xa3\\x5a\\xca\\xa3\\xba\\x0c\\x94\\x3b\\xea\\xcd\\x7a\\x9b\\xdf\\x8f\\xf7\\x39\\x78\\xe9\\xfb\\x00\\x20\\x45\\xe8\\xfe\\x56\\x48\\xcc\\x0f\\x9c\\xfa\\x88\\xb0\\xd8\\x12\\xe8\\x1a\\xa6\\x2e\\x0d\\x9c\\x73\\xfe\\x61\\x3a\\xfd\\x95\\x39\\xbc\\xb6\\x15\\x72\\x1f\\xb4\\x97\\xd6\\x2f\\x65\\xc8\\x3b\\x87\\xa6\\xd2\\x14\\x3f\\x9b\\x1c\\x88\\x0e\\xc8\\x67\\x1b\\xd4\\x2c\\x8d\\xe9\\x57\\xb1\\xa6\\x8e\\xe4\\x92\\x26\\xff\\x71\\x7c\\xcc\\x6e\\x74\\xf2\\xee\\xe4\\x9c\\x30\\xde\\xa5\\x3f\\xec\\x3c\\xd4\\xd9\\x0f\\x2c\\xcc\\xd8\\xf9\\x7c\\x55\\xd5\\xc7\\x52\\x45\\x4b\\xe2\\xba\\x7b\\x6f\\xf2\\x03\\x0b\\xe6\\x7e\\x0d\\xf5\\x0c\\x5e\\x88\\x38\\x43\\xe7\\x16\\x12\\xf2\\xb9\\x53\\x59\\x54\\x3e\\x2b\\xa1\\xbf\\x2e\\x98\\xde\\xbc\\xf5\\x76\\x8f\\x2b\\xe6\\xfd\\x50\\x4d\\x97\\x83\\xce\\x92\\x1a\\x81\\xe0\\x94\\x16\\xdb\\xcf\\x2b\\xb6\\x55\\xa9\\x24\\xb1\\xef\\x01\\x12\\xd6\\x71\\xf0\\x84\\xa5\\xb6\\x90\\xb0\\xb6\\x4a\\x8b\\x9b\\xf5\\x03\\x33\\xc3\\x59\\xff\\x3f\\xef\\x19\\x96\\x94\\xf9\\xb6\\x29\\x24\\x24\\xf0\\x06\\x66\\xce\\xf6\\xd0\\x6d\\x16\\x1a\\x79\\xe3\\xa1\\xb9\\xb9\\x62\\x9e\\xea\\x53\\x50\\x5f\\x5e\\x36\\xae\\xad\\xfe\\x0d\\x75\\x96\\x72\\xb0\\xff\\xe4\\x98\\x39\\x7d\\x90\\xa5\\x5d\\x99\\x44\\xb3\\x05\\x41\\xa7\\xe1\\xbd\\xac\\x53\\x02\\x06\\x40\\x13\\x7d\\xc2\\x52\\xae\\xf6\\x22\\xf3\\x81\\x9d\\x36\\xab\\x49\\x8d\\x76\\x3e\\x43\\x27\\xba\\x85\\x80\\xdd\\x9f\\x7e\\x5f\\x47\\xc2\\x4c\\xc9\\x92\\x87\\x34\\xb7\\xe6\\x21\\x12\\xc5\\x7e\\x3e\\x0c\\xfe\\xde\\xcd\\xcb\\xac\\xcb\\x0c\\x45\\xaf\\x82\\x19\\x45\\x5e\\xe7\\x22\\x3c\\x71\\xe7\\xe2\\x04\\x10\\xc5\\x24\\x4e\\xb8\\x27\\xaf\\x2f\\x39\\x35\\xce\\x47\\x55\\x44\\x47\\x47\\xaa\\x94\\x5f\\x4c\\x26\\xdb\\x3a\\x29\\x85\\x19\\xe7\\x5f\\xc6\\xba\\xce\\x91\\x52\\x99\\x72\\xe8\\x69\\x1b\\x69\\x4d\\x30\\xaa\\x8b\\x5e\\xc4\\xc1\\xa0\\x28\\xd3\\xbd\\x10\\xbd\\x0c\\x8a\\x40\\x8f\\xb7\\xd9\\xd7\\x03\\x49\\x55\\x53\\xec\\xea\\x59\\x8d\\x06\\x22\\xdc\\xc7\\x4d\\xe4\\x89\\xba\\x71\\x95\\xcd\\xae\\x8d\\x5c\\xff\\x98\\x55\\x92\\x18\\x37\\xb5\\x28\\x43\\x3e\\xe5\\x5c\\x0b\\x70\\x90\\x85\\x7a\\x0c\\x27\\x84\\xd9\\x31\\x0b\\x48\\x25\\xa7\\x99\\x3a\\xd9\\xc6\\xf1\\x8f\\x83\\xbc\\xa5\\xcc\\x6a\\x25\\x04\\x71\\x68\\xa8\\x37\\x6b\\x06\\x2e\\x3a\\x48\\xea\\x90\\xca\\xd8\\x8e\\x33\\x11\\x87\\xc2\\xb6\\xf2\\x81\\x42\\x6f\\x81\\xf7\\x88\\x04\\xa8\\x95\\xc4\\xec\\x06\\xc3\\x41\\xfe\\x84\\x6a\\xf4\\x52\\x7e\\xa2\\x60\\x69\\xdc\\xf6\\x1d\\x81\\x3f\\xdd\\xf0\\xfc\\x43\\xc7\\x07\\x35\\x0b\\xfb\\x2f\\xc1\\xcf\\xfc\\xee\\x7d\\x7c\\xcd\\x7d\\x75\\xf7\\xa4\\x65\\xa3\\xd1\\x4d\\x57\\x30\\x2c\\x14\\x6a\\xba\\x3e\"},\n{{0xde,0x8f,0x1c,0x99,0xe7,0xf8,0x55,0x6d,0xf2,0x0b,0x59,0xb8,0x50,0x4c,0xff,0x7c,0x6c,0x52,0x41,0xa8,0xae,0xeb,0x30,0xb9,0x2e,0xab,0x97,0xbf,0x48,0x1d,0x0f,0xe9,},{0xe4,0x63,0x79,0x1d,0x0f,0x56,0x7e,0xe7,0x3a,0xbb,0xf4,0x7d,0xd5,0x71,0x67,0xa5,0x35,0x61,0x3b,0x05,0xcd,0x48,0xd9,0x2e,0xbc,0x7d,0x24,0xe6,0xeb,0xff,0x95,0x73,},{0x30,0xab,0xc4,0xe4,0xe4,0xb3,0x88,0x58,0x1e,0x66,0x8b,0xd4,0x09,0xee,0x18,0xa6,0xed,0xe8,0x1a,0x13,0x6c,0x28,0xa2,0x92,0x4d,0xf5,0xfc,0x00,0xd7,0xc2,0x80,0xd9,0x78,0x62,0xae,0x3a,0x67,0xa9,0x35,0xce,0x49,0x23,0x64,0x13,0x5e,0x65,0x9a,0xdb,0x5f,0xba,0xbe,0x68,0x98,0x16,0x59,0x1f,0x49,0xac,0x50,0x22,0xa3,0x87,0xcc,0x09,},\"\\x38\\xd9\\x3e\\x5c\\x98\\x01\\xdb\\x90\\x17\\x97\\xec\\x75\\xc6\\xdd\\xdc\\x65\\xae\\x79\\x80\\xde\\x21\\x0b\\xed\\x43\\xb3\\x3e\\xb4\\x4c\\xdc\\x6d\\xc9\\x93\\x3f\\xb6\\xbe\\xc7\\x42\\x1d\\xb1\\x0f\\x0a\\x59\\x32\\x0b\\x9e\\x64\\x2a\\x21\\xf1\\xdd\\x23\\x56\\x01\\xfc\\xd6\\xc5\\x3b\\xe4\\xa8\\x77\\xf4\\xfe\\xd3\\xfa\\x4a\\x0a\\xd4\\xdc\\x6e\\x9b\\x39\\x1b\\xcf\\xa4\\x34\\x90\\x69\\x25\\xba\\x45\\xec\\xc5\\xb4\\x35\\xd9\\xab\\x8c\\xfa\\xfc\\x39\\x4b\\xdc\\xca\\x9b\\x07\\xd5\\x66\\x83\\x93\\x44\\x6e\\x34\\x00\\xe9\\x03\\x94\\x35\\xa1\\xdc\\x78\\xcb\\xc0\\x88\\x07\\xa3\\xfb\\x24\\xca\\x8b\\x19\\xf6\\x4e\\xa0\\x8b\\x8b\\xf6\\xc2\\x0a\\x19\\x5b\\x51\\xff\\x80\\x15\\xf3\\xe7\\xc9\\x1d\\x08\\xe4\\xbc\\x62\\x41\\x55\\x95\\xa5\\xa8\\x82\\xfb\\xa6\\x51\\xdc\\x3a\\x67\\x51\\x87\\xaf\\x61\\x82\\x49\\x74\\x7b\\x46\\x80\\xd1\\xd1\\x5a\\x20\\x2e\\xa9\\xdf\\x48\\xb1\\xc2\\x14\\xfd\\x40\\x34\\x66\\xfd\\x1a\\x26\\x5f\\x2d\\xef\\xaf\\x8e\\xd5\\xa6\\xbf\\x0e\\xb0\\x8d\\x18\\x64\\xf2\\xa2\\x8e\\x94\\x72\\x14\\x3c\\x6f\\xd1\\x03\\xb6\\xb1\\x08\\xc0\\xd1\\xd1\\x36\\x3b\\x99\\xf9\\x20\\x2d\\x11\\xf0\\x20\\x56\\xc2\\x79\\xcc\\xa3\\x15\\xdb\\x1a\\xb6\\xd3\\x10\\x18\\x45\\x8f\\x57\\xba\\x33\\x16\\xcd\\x27\\x38\\xe8\\x0c\\x49\\x2d\\x85\\x7c\\xb1\\x74\\x99\\x25\\xe3\\x31\\xc6\\x58\\x58\\xb5\\x09\\x83\\xcd\\x98\\x38\\xcf\\xd2\\x18\\x8a\\x5e\\x8f\\x05\\xb4\\x71\\xfd\\x3c\\xdd\\xcd\\x30\\xd9\\x69\\x01\\x19\\x40\\x20\\xf1\\x15\\xfb\\x46\\x9a\\xb5\\x84\\x90\\x06\\xdf\\xfa\\x2d\\x54\\x3a\\x13\\xb3\\xb5\\x06\\xed\\x65\\xcc\\x45\\x75\\x32\\xb8\\xaa\\x3e\\xe3\\x1d\\x9d\\x8d\\x9e\\x52\\x98\\xd7\\xac\\x70\\x7a\\xc1\\x5b\\x82\\x7a\\x57\\x8c\\x81\\xd4\\x34\\xf8\\x4c\\xb1\\xb5\\x61\\x20\\xd6\\x67\\xb2\\xaf\\xe6\\xd1\\x53\\x0a\\xfd\\xdf\\xb9\\x66\\xd9\\x53\\xbe\\x7e\\x32\\xdf\\x07\\xde\\x38\\x9e\\x2d\\x04\\xb2\\x32\\xd3\\x51\\x2c\\x7d\\xb9\\x35\\x8f\\xc9\\x44\\xd1\\xb1\\x18\\x07\\x8e\\x69\\x99\\xe8\\x91\\xbb\\xfa\\x4a\\x43\\x29\\xf6\\x5d\\x80\\x71\\x88\\xb5\\x98\\x58\\xc4\\x31\\x21\\x1b\\x29\\x57\\x6f\\x44\\x96\\x13\\x8b\\x7c\\x0c\\x12\\x8f\\x7b\\xef\\x5f\\x79\\xb0\\xf4\\x46\\xfc\\x6b\\x4a\\x0e\\x20\\xbc\\xa4\\xc4\\x0a\\x83\\x57\\x1a\\x36\\x64\\x4a\\xbf\\xfa\\xbd\\x49\\xcb\\x58\\x5f\\xd0\\x64\\xc8\\xe5\\x09\\xd9\\xa0\\xfc\\xff\\x46\\x26\\x76\\xf0\\xeb\\xcb\\x61\\xce\\xc6\\x1e\\x51\\x2b\\xe6\\xf1\\x82\\xab\\xd5\\x9e\\x09\\xf6\\x42\\xaa\\x61\\x96\\x34\\x85\\x34\\x82\\xec\\xe8\\xf8\\x98\\x00\\xf9\\xc5\\xbc\\xfb\\x84\\x14\\x31\\xca\\x06\\x91\\xed\\x8d\\x80\\xe0\\xa2\\xfc\\xb7\\x97\\xa0\\x36\\x89\\x7c\\xfb\\x65\\x37\\x58\\x6b\\x31\\xc0\\x0b\\x79\\x65\\xef\\xdd\\xfd\\xa7\\x28\\x61\\x84\\x50\\x26\\x45\\x91\\x57\\xf7\\x9e\\xba\\x1b\\xca\\xf6\\xcd\\x41\\xd6\\x18\\xae\\xb1\\xbd\\x8d\\xa1\\xbe\\x98\\xf0\\xcd\\xc7\\xf2\\xe0\\x9b\\x90\\x3d\\xe4\\x9c\\x0c\\x1b\\xe9\\x1d\\xcc\\x17\\x7b\\x29\\x80\\x96\\x83\\x6d\\xce\\xa4\\xf6\\x01\\xdd\\x86\\x69\\x15\\x55\\x12\\x83\\x25\\x43\\x8b\\xd9\\xcc\\xbf\\xc0\\xe7\\x77\\x92\\x0a\\xe8\\xbb\\xd5\\x76\\x34\\xc6\\x10\\x4f\\xe6\\x9a\\x3a\\x72\\x01\\x2a\\x23\\x60\\xb6\\xe5\\x52\\x55\\x0c\\xff\\xb4\\xe2\\xf0\\xb4\\x1f\\xe1\\x55\\x37\\xee\\x0e\\x6f\\x37\\xe7\\x88\\x0f\\xb4\\xd1\\x2b\\xef\\x6c\\xad\\x26\\x6c\\xe5\\x8d\\xf9\\x81\\x6b\\x35\\x96\\x0c\\xd0\\xbf\\x86\\x52\\x86\\x2e\\xe7\\x89\\xcc\\xc3\\x1a\\x7e\\xfc\\x21\\xa8\\x1b\\xda\\x46\\x14\\x6b\\x11\\x1f\\xcf\\xd9\\x4f\\x04\\x85\\x6a\\xb6\\x1a\\x55\\x7b\\x1f\\xf7\\xc8\\xe4\\xea\\x6d\\x9c\\x4b\\xcd\\xd9\\x3b\\x15\\x1a\\xa0\\x84\\x61\\xc5\\x68\\xde\\xfb\\x2a\\xef\\xdf\\xce\\x96\\x39\\x4d\\xc8\\x22\\xd4\\xef\\x6c\\xc4\\xb9\\xa3\\xe6\\xc3\\x32\\x03\\x9f\\x65\\x38\\xaa\\x0d\\xf8\\xde\\x81\\x26\\xd9\\x0c\\x31\\x2f\\xf4\\x96\\x88\\x74\\x86\\x11\\x15\\x65\\x53\\x43\\x46\\xa7\\x46\\x26\\x25\\xd6\\x3d\\xf6\\x9f\\xcb\\x57\\x41\\x90\\x6f\\x19\\xe0\\x0f\\xc8\\x00\\x3f\\x08\\xb9\\x59\\x85\\xc3\\x8b\\x86\\x74\\xaf\\x42\\x3c\\xa5\\x6d\\xe5\\xf8\\x81\\xb5\\x9c\\x46\\x62\\x43\\xa7\\xad\\xba\\xdb\\xa2\\x9c\\xaf\\x57\\xfa\\x77\\x71\\x22\\xe6\\x18\\x23\\xb4\\xe7\\x08\\x18\\x2a\\xaf\\x37\\x20\\x6d\\x7d\\x5e\\xd0\\x51\\xc1\\x2a\\x5c\\x0f\\x6b\\x43\\x71\\x04\\x3f\\x56\\x2c\\xdc\\x02\\x9d\\x5e\\x1b\\xa9\\xb2\\xbf\\x5f\\xfb\\xf1\\xf5\\xf5\\x23\\xdb\\x06\\xfe\\xca\\x42\\x7d\\xb7\\xa0\\x88\\x19\\xff\\xb2\\xd0\\x58\\x52\\x42\\xe2\\x0d\\xa5\\x8e\\x32\\x0b\\x16\\xb1\\x6e\\x44\\x8d\\x8b\\xe0\\xef\\x74\\x02\\xd2\\x4a\\x71\\x94\\x25\\x71\\x33\\xbd\\xc9\\x82\\x31\\x4d\\x83\\xad\\xbc\\xd1\\x2e\\x8a\\xf3\\x13\\x03\\x42\\x6c\\x59\\xff\\xd8\\x26\\x9c\\xe4\\xb9\\x87\\xca\\x9b\\x6f\\x0f\\xfd\\xbb\\x4d\\x1d\\x12\"},\n{{0x07,0x36,0xf8,0x01,0x72,0x0a,0x94,0x7c,0x5c,0x2f,0x32,0x58,0xce,0x0d,0x51,0x1c,0x3e,0x17,0xe9,0x4e,0x37,0xb3,0x0a,0xdf,0xa5,0x20,0x95,0x92,0x11,0x71,0xd4,0x00,},{0x4f,0x69,0x42,0x55,0x92,0x0d,0x0c,0x38,0xde,0x6e,0x72,0xe1,0x65,0xc3,0x3a,0xee,0x76,0xb1,0xcb,0xf6,0xf4,0x83,0x7a,0xa5,0x90,0x14,0x75,0x66,0x7a,0xcd,0x28,0x26,},{0xc0,0x3c,0x03,0x14,0x85,0x12,0x79,0xed,0xcd,0xe9,0x70,0xc2,0x3e,0xfa,0x23,0x6f,0x23,0x5e,0xda,0x96,0x0d,0x2c,0x27,0xd3,0xca,0x94,0x6f,0x65,0x0c,0x20,0x0b,0x4e,0xba,0x04,0xbe,0x66,0x8f,0xf6,0x2e,0xaf,0xfa,0x6c,0xea,0x35,0x1a,0xbd,0xfc,0x54,0x40,0x1d,0xcc,0xce,0x3d,0xba,0x78,0x00,0x4a,0xec,0x95,0x81,0xa2,0xcc,0xf4,0x0f,},\"\\x7f\\x87\\xb5\\x1f\\x6e\\xad\\x2d\\x44\\x02\\xa3\\xbd\\x3c\\x37\\x69\\xa2\\x67\\xac\\x8e\\x82\\xf7\\x79\\xad\\x7b\\x98\\x6d\\xec\\x82\\xcb\\xfc\\x1e\\xa5\\x12\\x91\\x88\\x43\\x26\\xd9\\x22\\x69\\x67\\xcb\\x66\\xa9\\x68\\x73\\x18\\x4f\\x0e\\x83\\xb3\\xab\\x25\\xa5\\xab\\x2f\\xa8\\x05\\xfe\\x3a\\x0e\\x7b\\x19\\x0a\\x62\\x2d\\x46\\x1b\\x78\\x30\\xa3\\xf6\\x97\\xc8\\x31\\xc2\\x9e\\xa7\\xc0\\xcd\\x4b\\x68\\xd8\\xe7\\x7a\\xa6\\x97\\x11\\xcf\\x86\\x4d\\xc1\\xd5\\x39\\x4f\\x48\\x45\\xe2\\xfb\\xb5\\x07\\x64\\x04\\xe0\\x9a\\x88\\xb7\\x9f\\x05\\x67\\x05\\x51\\xbc\\xe2\\xef\\x54\\x68\\xb7\\x9d\\x57\\x88\\x8b\\x98\\x52\\xa4\\xbb\\x47\\x9a\\x4f\\xd0\\xbe\\xb6\\x81\\xfd\\x52\\x3f\\xc5\\xbf\\x44\\x58\\xab\\xbc\\x38\\xec\\xe7\\x2e\\x10\\x6e\\x00\\x22\\x20\\x15\\xa5\\x7e\\xbe\\xc5\\x5b\\xf4\\x75\\x13\\xe2\\x5c\\x3c\\x45\\x54\\x84\\x3b\\xda\\xcb\\xcf\\xe9\\xf1\\xb8\\xd0\\xae\\x35\\x4e\\x48\\xd0\\x3f\\xde\\xbd\\xf2\\x0d\\x65\\x5b\\x52\\x68\\xd8\\xbb\\xbf\\x33\\xb1\\x28\\x89\\x10\\xf0\\x44\\x4f\\xcd\\x56\\xc0\\xda\\x7b\\x89\\x03\\x36\\x2b\\x7e\\x37\\xa8\\x64\\x65\\x42\\x77\\xcf\\xfb\\xe6\\xc6\\x08\\x57\\xf0\\xb3\\x51\\x4d\\x22\\xa4\\x0b\\x9d\\xd2\\xd3\\xfe\\x5c\\xae\\xa5\\x50\\x7a\\x0d\\xe3\\x05\\x1b\\xb3\\xa4\\x01\\x5f\\xa0\\xfe\\x4c\\x46\\x2b\\x98\\xfe\\xf2\\x35\\x7d\\xcf\\x6b\\x97\\xdc\\x75\\xde\\xf3\\x82\\xf9\\x01\\xf9\\x6f\\x4a\\x04\\xa3\\xef\\xc6\\x02\\x54\\x20\\x0a\\x2c\\x4c\\xdc\\x8a\\x58\\xb2\\x5d\\x94\\xe3\\x29\\x54\\xea\\xff\\x15\\x11\\xac\\x46\\xe3\\x60\\x66\\x63\\xb6\\x87\\x5f\\x13\\x64\\x99\\xda\\x6a\\x76\\x90\\x97\\x87\\x9a\\x6e\\x08\\x34\\xd5\\x64\\xfa\\x7f\\xdb\\x99\\x58\\x11\\x83\\xed\\x0c\\x9d\\x48\\xfd\\x19\\x5d\\x7e\\xcd\\x9f\\x4d\\xd4\\x86\\x55\\x65\\xfd\\x17\\xa0\\x08\\x71\\x8d\\xcd\\x76\\xf6\\x8a\\x54\\xe5\\x16\\xa2\\xb7\\x30\\xed\\x3d\\xba\\x5c\\x2c\\xf4\\x06\\x30\\xbb\\xfe\\x7f\\xa0\\x3b\\xb7\\xcd\\xd9\\x67\\x69\\x54\\x95\\xa7\\xc8\\x6e\\x2e\\x84\\xcb\\x01\\x7e\\xc6\\x96\\x01\\x92\\x46\\x31\\x59\\x5a\\xff\\xaa\\x8c\\xfd\\x04\\x8d\\x14\\x26\\x7c\\x73\\xe5\\x4c\\xfa\\x53\\x90\\x47\\xe7\\x17\\x69\\x1e\\x39\\x97\\x37\\xfa\\x50\\xcc\\x48\\x44\\x96\\x12\\x57\\xc9\\x3d\\x72\\x53\\xd2\\x32\\x26\\xb7\\xcd\\x0d\\x1b\\xd3\\x1f\\x3f\\x0d\\x2d\\x89\\x2d\\x07\\x3d\\x8c\\x50\\x73\\xc6\\x02\\xf6\\x1a\\x04\\xd6\\x43\\x7c\\x39\\x03\\xeb\\x4a\\x64\\xa0\\x1f\\xbc\\xc0\\xc7\\xe1\\x59\\x20\\x1c\\xdc\\x4a\\xa4\\x2e\\xf3\\xb1\\xff\\x9c\\x78\\xfc\\x27\\x5c\\xfb\\x11\\xa0\\x5f\\xfe\\xd8\\xf9\\xf2\\x2d\\x85\\xba\\x92\\x4d\\x8d\\x32\\x23\\x1c\\x25\\x4d\\x89\\x8d\\xa7\\xf0\\x67\\x9a\\x64\\xca\\xb8\\x40\\x26\\x90\\x6e\\x9e\\x85\\xf9\\x5e\\xfd\\x8e\\xe2\\xa1\\x72\\x56\\x33\\xf4\\xde\\x2b\\xa6\\x7d\\x99\\xaa\\x7f\\x05\\x50\\xaf\\x13\\x9e\\x9f\\x8c\\x52\\x93\\x78\\x67\\x27\\xd8\\x26\\x30\\x29\\x6d\\x5d\\xaa\\x9e\\x83\\x0a\\xa1\\xb3\\xb5\\xb3\\x02\\xb8\\xb6\\x62\\xac\\x83\\x2e\\x92\\x13\\x01\\x6b\\xa4\\x93\\xa0\\x3a\\x28\\xcc\\x3e\\x95\\x40\\xd0\\xd6\\x5a\\xcd\\xdb\\xfe\\x12\\x52\\xb5\\xc1\\x6a\\x84\\xa4\\x45\\xce\\x75\\x41\\x5c\\x6c\\xd8\\xab\\x16\\xfe\\x5e\\xef\\x11\\x70\\x97\\xd7\\x1e\\xb5\\x67\\x6b\\x9a\\x95\\xb3\\x58\\x82\\xa7\\xc3\\x50\\x6b\\xc5\\xd0\\x2f\\x03\\x91\\x0a\\x63\\xd4\\x68\\x46\\xb2\\x13\\xc3\\xc9\\xbb\\x2f\\xc3\\x4e\\x6c\\x69\\x01\\x7d\\x20\\x65\\xa1\\xad\\x3c\\xe3\\xfd\\x14\\xab\\x00\\x14\\xf5\\x84\\xe5\\x7e\\xa9\\xd9\\x03\\xe4\\x0a\\xce\\xb2\\x30\\xa8\\x69\\x3f\\xa2\\xe6\\x36\\x41\\xc2\\x54\\x38\\xff\\x7a\\x16\\x38\\x76\\x04\\x38\\x84\\x4c\\xdf\\x00\\x11\\x80\\xf5\\xb1\\x77\\xbe\\x69\\xed\\xf7\\xef\\x66\\xb3\\x93\\x12\\x80\\x52\\x14\\xcb\\x17\\x70\\x6c\\xef\\xe5\\x45\\xbe\\x5a\\x77\\x01\\x9a\\x5e\\xc5\\x2b\\xbf\\x78\\x85\\x0f\\xa3\\xd9\\x7d\\xe2\\xd4\\xd7\\x4a\\xa6\\x8b\\x58\\xca\\x81\\x2a\\x1b\\x15\\x6a\\x0c\\x40\\x01\\x12\\x9f\\x06\\x72\\x32\\xa6\\xec\\x91\\xa5\\xed\\x42\\x70\\xf2\\xa4\\xc6\\xef\\xee\\xe7\\x87\\x00\\x47\\x70\\xc8\\x59\\xe4\\x50\\xe8\\x37\\xef\\xb0\\x4d\\xc9\\x98\\xbd\\x27\\x3c\\x27\\xa0\\x98\\x55\\xe4\\xec\\xa1\\xa2\\x2a\\x9b\\x88\\xc1\\x7b\\xdb\\xf2\\x53\\xa7\\x97\\x61\\x07\\x0a\\x76\\x81\\x7a\\x7f\\x74\\xff\\x3f\\x07\\xfb\\x71\\x8b\\xff\\xa0\\xb4\\xf3\\x26\\xf2\\x84\\xe6\\x2f\\x83\\x68\\x32\\x42\\x7b\\xe8\\x2f\\x48\\x33\\x73\\x51\\x5b\\x9b\\xf5\\x9a\\xf4\\xa7\\x6a\\x57\\xe2\\xf4\\x0b\\x91\\x03\\x4d\\xd5\\x68\\xec\\x14\\xac\\x10\\xe2\\x30\\x9b\\x87\\xe2\\x92\\x2f\\x9c\\xd9\\xfc\\x1a\\x46\\xa4\\x7e\\xd3\\xbc\\x7e\\x1b\\x9f\\xeb\\x9e\\xe0\\x67\\x07\\x3f\\xa5\\xdc\\xe2\\xa6\\x75\\x30\\x52\\x6d\\xe6\\x7e\\xe0\\xe5\\x09\\x66\\x3c\\x44\\x46\\x7e\\xeb\\x59\\x42\\x01\\x03\\xeb\\xcd\\xff\\xa7\\x09\"},\n{{0xfa,0x75,0x65,0x04,0x91,0x04,0x74,0x28,0xd3,0x63,0xb5,0x82,0x22,0x22,0x12,0x2d,0xff,0xb5,0xa9,0xfd,0xdc,0x60,0x3c,0x33,0xc8,0xa6,0x08,0x61,0x83,0x75,0xdc,0xf3,},{0x98,0xc9,0x64,0x1f,0xa9,0xdf,0xa8,0xea,0x13,0xe0,0xd1,0xc7,0x16,0xb8,0x67,0x9e,0x26,0x4b,0xe1,0x5d,0xd2,0xd4,0xc0,0x6a,0xb4,0x3c,0xbe,0xe4,0x79,0x16,0xee,0x01,},{0x1e,0xff,0xbf,0x92,0x99,0xa1,0xb9,0x35,0x4f,0xe1,0xf1,0xde,0xc1,0x76,0x65,0x95,0xea,0x76,0x7a,0xb8,0xe4,0xda,0x9b,0xb5,0x7b,0x4f,0x69,0xbc,0xbd,0x8c,0xb3,0xd8,0x6f,0x76,0x83,0x92,0xf5,0x9b,0x39,0xfa,0xfa,0x8a,0x21,0x0a,0x65,0x09,0xfe,0x0d,0x60,0x08,0xd6,0x35,0x61,0x11,0xad,0xfb,0x37,0x99,0xc1,0xd5,0x59,0xc2,0x63,0x09,},\"\\xf5\\x4e\\x41\\xb9\\x39\\xe3\\x7d\\xf1\\x7c\\x7d\\x60\\x43\\xfd\\xed\\x14\\xa9\\x15\\xd9\\x34\\xe8\\x67\\xc3\\x45\\x26\\x9f\\xdc\\x01\\x77\\xf5\\xbd\\x10\\xc4\\x34\\x8f\\x31\\x9e\\x0a\\xb9\\xa6\\x4c\\xc0\\xb7\\xd4\\xe0\\xc9\\x1c\\xa9\\xaa\\xda\\xab\\x2e\\xdc\\xba\\x54\\x4f\\x14\\xed\\x2c\\xb5\\x39\\xca\\x89\\x75\\x09\\x7d\\x87\\x92\\x70\\x95\\xb4\\xeb\\xd4\\x90\\x34\\x43\\x40\\x06\\x1e\\xd9\\x3c\\x38\\x16\\x7e\\xda\\xa0\\x96\\xa2\\x30\\xdb\\x59\\x62\\x4c\\x67\\xfb\\x9a\\x1e\\x1d\\xda\\xc4\\x02\\x13\\x3f\\x4d\\x47\\xcf\\xc1\\x1e\\x2f\\xae\\x6b\\x3f\\x3c\\x50\\x01\\xcb\\xa9\\xa8\\xae\\xd9\\x00\\x73\\x10\\x32\\x40\\x22\\x7e\\x71\\x6f\\xf7\\x1b\\xf6\\x8a\\x59\\x1b\\xa2\\xce\\xff\\x2d\\x31\\xb8\\x6e\\xf2\\x1a\\xb0\\x12\\xec\\xcd\\x40\\x9a\\xd5\\xc2\\x9d\\x65\\x9a\\x1b\\x37\\xc4\\xd8\\x55\\x05\\x30\\x41\\x40\\xfb\\x2c\\x34\\x37\\xa2\\x06\\x86\\x8b\\x13\\x52\\xc1\\x02\\xbb\\xfa\\x3b\\x9a\\x76\\x52\\x2a\\x2b\\xfc\\x54\\x06\\xb2\\x57\\x69\\x6d\\xe7\\x4e\\xe7\\xd3\\x15\\xc8\\xe9\\x9c\\xaa\\x96\\xbd\\x83\\x80\\x06\\xc6\\xda\\x2a\\x42\\x33\\x31\\x5a\\x85\\x6a\\xcb\\x8e\\x80\\xc3\\x31\\x68\\xb3\\x33\\x55\\x1d\\x91\\xd0\\x74\\x05\\x57\\x34\\x13\\x0b\\xd7\\xd1\\x4c\\x56\\x81\\x1e\\xba\\xbf\\x7d\\x5a\\x25\\x0e\\x60\\x72\\x59\\x3d\\x9f\\x2f\\x8b\\x97\\xc1\\x2a\\x70\\x3c\\x2c\\x47\\x9c\\xb0\\xb1\\x5b\\x7a\\x27\\x75\\xc9\\xdc\\xd2\\xca\\x46\\x24\\x67\\x23\\x68\\xa2\\xe6\\x14\\x54\\x67\\xf3\\xbe\\x66\\x15\\xf9\\x3b\\x81\\x20\\xa0\\xa1\\x2d\\xa1\\x56\\x06\\x63\\xa2\\x6a\\x61\\x73\\x19\\x66\\xb4\\x4b\\x29\\x9e\\xbf\\xad\\x2a\\x95\\xc6\\x23\\x60\\xf3\\x9c\\xe0\\x5d\\x95\\x58\\xe3\\x05\\xee\\x23\\xa5\\x2f\\xa5\\xce\\x20\\xf6\\xbe\\x5e\\x26\\x2a\\xff\\x3a\\x86\\x4d\\x5d\\xda\\xbe\\x23\\xff\\x94\\x3f\\x71\\xd5\\x99\\x84\\x93\\xd9\\x9f\\xe2\\xac\\x23\\x74\\xb4\\x64\\xa6\\x91\\x83\\xc3\\xbc\\x4f\\x1d\\xdb\\x88\\x36\\x11\\x14\\x9d\\x7d\\xdb\\xf1\\xe8\\x38\\x0b\\x54\\x43\\x35\\xe2\\xb8\\x93\\x95\\x05\\x4c\\x9f\\x25\\x58\\xdf\\xc5\\x6e\\xa9\\x3f\\xf1\\x4d\\x0f\\x15\\xd2\\xe0\\xbd\\x89\\x37\\xa5\\x56\\x38\\x7d\\xe9\\x6e\\x41\\x8d\\x8b\\x3a\\x7d\\x66\\x6f\\xb1\\x90\\x36\\x4b\\x2c\\x21\\x90\\xd3\\xc2\\x5f\\x17\\x52\\xd5\\x48\\x3d\\xcb\\xb5\\x96\\x00\\x64\\xf0\\xc8\\x7f\\xcf\\x8f\\x31\\x3d\\x28\\x78\\x1c\\x11\\x4a\\x16\\x9b\\x69\\x0a\\x87\\x01\\xc5\\x0d\\x89\\xc7\\x73\\x24\\x53\\x1c\\x0f\\x84\\x9d\\xba\\xd1\\x63\\x3d\\x92\\x5a\\xcd\\x06\\xc1\\x6a\\x9c\\xea\\x19\\xa4\\x34\\xeb\\xc4\\x2a\\xeb\\xb1\\xfd\\xb9\\xb0\\xba\\xcc\\x93\\xce\\xc3\\x99\\x19\\x94\\x36\\x64\\xea\\x1a\\x95\\x84\\x06\\xff\\x9e\\x49\\x35\\xc9\\x2c\\xa7\\xc3\\x97\\x08\\xf9\\xca\\xb7\\x10\\xa5\\x83\\x09\\x6b\\x4e\\xd9\\xf4\\x8d\\x9e\\x09\\x06\\x47\\x24\\x0d\\x76\\xec\\xcb\\xab\\xa5\\x91\\xf5\\x5f\\xe7\\xe3\\x6d\\x72\\xc2\\x17\\x27\\xac\\xba\\x0f\\x80\\x30\\x95\\x4e\\x62\\xbc\\x58\\x0b\\x8b\\x67\\x0c\\x44\\x57\\xc3\\x40\\x3e\\x36\\x9a\\xc2\\x0e\\x66\\x0d\\x66\\x2f\\x7f\\x6a\\x41\\x42\\x13\\xea\\x43\\xf7\\xc0\\x10\\x50\\x09\\xc1\\xde\\x81\\x7a\\xdf\\x6f\\xfd\\x9c\\xca\\x3b\\x45\\xa6\\x3a\\x82\\x22\\x81\\xc6\\xe2\\x77\\x2f\\xd7\\xb7\\x80\\x96\\x03\\x18\\x4b\\x48\\x79\\xb1\\x8c\\x88\\x79\\x03\\xf0\\xfc\\x8d\\x8e\\x1e\\x2d\\xbf\\x6e\\x77\\x2f\\x0b\\x2d\\x9b\\x8a\\x29\\x92\\x7a\\xcc\\x81\\x71\\x4a\\x22\\x56\\xad\\x8d\\x7b\\x73\\x30\\x52\\x7d\\x7d\\xbf\\x8b\\xef\\xd8\\x2f\\x8c\\x9b\\xb4\\x01\\xcf\\x0a\\x90\\x24\\x9a\\x64\\xca\\x6f\\x88\\x33\\xdb\\x31\\xbd\\x03\\xb9\\xe7\\x94\\x6d\\x06\\xdd\\x04\\x38\\x3d\\x7c\\x08\\x2d\\x70\\xae\\xb3\\x7f\\xf8\\x4c\\x2b\\x05\\x7d\\x97\\x3b\\x89\\x4b\\x4a\\x03\\xec\\x7b\\xf0\\x31\\xae\\xa6\\x56\\xa1\\x90\\x84\\x88\\x89\\x4a\\x4a\\xda\\x3f\\xd7\\xfa\\xdf\\x91\\xed\\xe9\\x55\\x0d\\x38\\x41\\x5f\\x82\\xa0\\x94\\x55\\xc0\\xf4\\x32\\xfb\\x55\\x98\\x71\\x32\\xf0\\x00\\x42\\xaf\\xd6\\x0e\\xa5\\x1d\\x1f\\x1c\\x6c\\x1a\\xfe\\x0c\\xf8\\x7c\\x34\\x6e\\x31\\xe6\\x3e\\x26\\xf4\\x9b\\x13\\x71\\x77\\xb2\\xd4\\x7a\\xb3\\x0f\\x07\\xce\\xa0\\x71\\x93\\x12\\x74\\xcf\\x01\\x08\\x36\\xd6\\x83\\xff\\xf3\\xbe\\x71\\x34\\xc7\\x8b\\x8b\\xfd\\x8b\\x1b\\x8f\\xc2\\x04\\x9e\\x18\\xcc\\xb1\\xe1\\x8a\\x0a\\x95\\x85\\xa7\\xd8\\xa1\\xe2\\x54\\x92\\x60\\x86\\x68\\xc9\\x6d\\x62\\xa0\\xac\\xa8\\xef\\x90\\xe0\\x48\\xd2\\x03\\x78\\xc1\\x08\\xd0\\x6b\\x03\\xfe\\x3e\\xc4\\xad\\xb2\\x75\\x28\\xae\\x08\\xf7\\xde\\xd9\\x48\\x78\\x93\\xae\\x64\\xca\\x4b\\x93\\x92\\x02\\xaa\\x4c\\x17\\xaf\\xe7\\x18\\xcd\\xca\\x49\\xff\\x96\\x16\\xd0\\xcd\\xf8\\x33\\x4b\\x6a\\xee\\x2d\\x6d\\x20\\x94\\x7c\\xa4\\xbd\\x7d\\xf5\\x31\\xdd\\x1d\\xa9\\x95\\x81\\xff\\x72\\xea\\x56\\xfe\\x62\\xca\\xa2\\xc9\\x5e\\x35\\x87\"},\n{{0xe1,0xc1,0x29,0x46,0xd2,0x21,0xa1,0x94,0xf2,0x2f,0x27,0x62,0xc0,0xe5,0x1c,0xbe,0x3f,0x98,0xb9,0x14,0xa4,0x7d,0x3d,0xc4,0x1a,0x1f,0x45,0xc5,0x43,0x70,0x63,0x7c,},{0x10,0x40,0x81,0x36,0xa6,0x8f,0xc5,0x6c,0x7d,0x3b,0x36,0xb7,0xfe,0xf1,0x22,0x09,0x4d,0xe0,0x81,0x03,0x11,0x89,0xcc,0x84,0xa4,0x88,0x06,0xaa,0xf6,0xcb,0x91,0x85,},{0x8f,0xd7,0xfa,0x40,0x0c,0x03,0x2f,0xcf,0xbc,0x40,0x29,0x42,0xfc,0x78,0x63,0x75,0x26,0xbe,0x97,0xab,0x82,0xf2,0x37,0xbb,0x39,0x3e,0xa3,0x9e,0x35,0x73,0x8c,0x67,0xd7,0x54,0x09,0x54,0x3a,0x8b,0x3c,0x05,0x5f,0x08,0xbf,0x69,0x19,0x9a,0xf6,0x3b,0x69,0x11,0xa4,0x82,0xfb,0x4f,0x65,0x80,0x80,0x2e,0xc9,0xd2,0xdc,0x3c,0x11,0x06,},\"\\x87\\x0f\\x4c\\xd9\\x7c\\xfc\\x0a\\xaf\\xad\\xa4\\x00\\x72\\x31\\x2f\\xb5\\x4b\\xcc\\xc0\\x76\\x28\\x71\\x4e\\x49\\x62\\xd4\\xbe\\xf4\\xee\\xb5\\xde\\x40\\xa1\\x9a\\x24\\x6b\\x5b\\x7d\\x52\\xd4\\x87\\xb7\\xe5\\x2d\\x65\\x6f\\x2c\\x64\\x03\\xb9\\x16\\xd0\\x2e\\x02\\xa6\\xd2\\x91\\xc1\\xe1\\x82\\x8d\\xd9\\x45\\xa5\\x83\\xb4\\x38\\x52\\x8d\\x1c\\x39\\x76\\x5a\\x57\\x20\\x31\\xff\\xa9\\x16\\xb6\\x83\\x21\\xf3\\x2e\\x66\\x46\\xf0\\xdc\\xc1\\xc6\\x02\\x35\\xff\\xaa\\x32\\x35\\xf4\\x84\\xa5\\xc4\\x97\\x8f\\xa3\\xe6\\xbf\\x14\\x30\\x1d\\x53\\xe1\\x2f\\x4c\\xc5\\x21\\x18\\xb1\\xf6\\xf0\\x7f\\x53\\x36\\xf5\\xd0\\xa9\\x37\\x89\\xbb\\x01\\xd1\\x62\\xfb\\x31\\x26\\xdc\\xd7\\x56\\xe0\\x64\\x2e\\x7e\\x69\\x89\\x63\\xc0\\x34\\x59\\x11\\xa5\\xcf\\x3c\\x99\\x53\\xf7\\x73\\x19\\x42\\x6c\\xea\\x2c\\xde\\xda\\x3e\\xfe\\x98\\x9e\\xcb\\x63\\xcb\\x9e\\xb8\\xb9\\x20\\xde\\x76\\x6c\\x4f\\xcf\\x63\\x36\\xe5\\xbc\\x43\\x71\\xa0\\x68\\x37\\x1f\\xed\\x95\\xc8\\xc2\\xb6\\x1e\\xe9\\xb7\\xc3\\xe3\\x83\\x1c\\x20\\xbf\\xfe\\x87\\x07\\xc0\\xc9\\x8b\\xe9\\x61\\x53\\xc8\\xa8\\x73\\xd7\\xf2\\x8a\\xfc\\xa1\\xbf\\x71\\x08\\x5c\\xe0\\xe3\\x89\\x9e\\xef\\x55\\x91\\xbd\\xd6\\x66\\xdc\\x2d\\x07\\x64\\x17\\x72\\xd7\\x45\\xc5\\x16\\x44\\xa2\\x60\\x81\\x5b\\x20\\x8c\\x4d\\xd3\\x05\\xf0\\x5f\\xe4\\x63\\xd0\\xd9\\xd5\\xa9\\xee\\xff\\x97\\x79\\xf5\\xb1\\xd4\\x4f\\x26\\x08\\x30\\x78\\x56\\x6d\\x0e\\x5f\\xf5\\x6b\\x3a\\xf0\\xe6\\x4c\\xc3\\x87\\x08\\xaf\\x5a\\x65\\xf6\\x54\\x35\\x2d\\xf1\\x04\\x37\\xf1\\xdd\\xf9\\x45\\xa0\\xda\\x1f\\x4d\\xef\\x6a\\x71\\xa0\\x60\\xe0\\xc4\\xad\\xec\\xca\\xac\\xf8\\x5e\\x09\\x0f\\x70\\x90\\x37\\x0a\\xe2\\x4e\\x52\\x38\\xd7\\x68\\xa0\\x8f\\xe6\\xb4\\xbb\\x5e\\xc4\\x97\\xa6\\x60\\x31\\x98\\x60\\x84\\x15\\xc7\\xc6\\x49\\x00\\x48\\xaa\\x36\\x73\\x7c\\x08\\x50\\x30\\x08\\xae\\xce\\x0f\\x49\\x42\\x19\\xdd\\xf8\\x9b\\x72\\xea\\x77\\x17\\x1c\\x6d\\x31\\x17\\x08\\x9e\\xb8\\x89\\x07\\xe8\\xc3\\x3f\\xb9\\xe7\\x0b\\x0d\\xc2\\x81\\xf6\\x64\\xb5\\xf9\\x65\\xb5\\xd2\\xad\\xb1\\x25\\x07\\x10\\xef\\x23\\x52\\x02\\x5f\\xb2\\x93\\x39\\x5a\\xe1\\xd2\\x3e\\xe3\\xb5\\x92\\xb4\\xc5\\xf2\\xd5\\x55\\x69\\xa5\\x45\\x86\\x54\\xce\\x3f\\xc2\\x5d\\xd0\\xe3\\xf7\\xe6\\x75\\x7a\\xa7\\xb3\\x47\\xc1\\xff\\xd3\\xba\\x4d\\x4f\\x2c\\x4b\\x6d\\x36\\xaf\\xd5\\x98\\x63\\xa3\\x2a\\x59\\x4e\\x74\\x53\\x7e\\xce\\x9b\\x8b\\x1e\\xc2\\x69\\xbb\\xc4\\xcb\\x54\\xd7\\x62\\x38\\x21\\x1f\\x62\\xa9\\x8a\\x46\\xa4\\xaf\\x66\\x2f\\xa8\\x1e\\xba\\x6f\\x30\\xf5\\x14\\xb8\\x66\\xb7\\x94\\x2b\\xc1\\x73\\xf7\\x21\\x1a\\x6c\\x01\\x4d\\xa1\\x4e\\x74\\x13\\x27\\xa5\\x68\\x62\\x3d\\x14\\xb8\\xf8\\x35\\xef\\x1d\\x5d\\x62\\xb2\\x52\\x3c\\xfe\\x6a\\x85\\xbc\\x69\\xfa\\x05\\x20\\x0d\\xea\\xc1\\x56\\x8b\\x94\\x6a\\x81\\x6b\\x75\\xc5\\xd7\\x60\\x31\\x74\\xfd\\x4e\\x2f\\x91\\x01\\xa7\\x90\\x63\\x79\\x1b\\xc3\\xd5\\x92\\x97\\xcd\\xc1\\x0b\\xda\\xa6\\x63\\xab\\xf3\\xc1\\xbe\\x2f\\xda\\x17\\xe4\\xe5\\xce\\x39\\x4e\\x90\\xbd\\x76\\xb1\\xf9\\xe0\\x40\\x5f\\x56\\x75\\xb9\\x9d\\x63\\x8a\\xbc\\x2c\\x1b\\x2d\\x8b\\x53\\xa6\\xfd\\x3d\\xc8\\x37\\x58\\x55\\xec\\x54\\xcc\\xbd\\xa2\\x4e\\x67\\x25\\x27\\x72\\x3b\\x07\\xbb\\x59\\x9d\\xb5\\x4e\\x38\\x79\\x33\\x91\\xcf\\x09\\xef\\x3b\\x1f\\xd7\\x61\\x49\\x90\\x06\\x5b\\xbd\\x4a\\x19\\xe8\\xd3\\xd1\\x04\\x82\\x53\\xba\\x4c\\x97\\x1c\\x2f\\x98\\xd2\\xb3\\x59\\xdf\\x50\\x90\\x87\\x32\\x3a\\xa6\\x90\\x50\\x29\\xf5\\xcc\\x5e\\x1a\\x0a\\xaf\\x2f\\x7c\\x01\\x08\\xdd\\xb1\\xa4\\x0f\\x56\\x2b\\xe6\\x4e\\x57\\xe6\\x95\\xed\\x21\\xdc\\x7d\\xb1\\x7d\\x53\\x36\\x77\\xef\\x12\\xfc\\xbb\\xe2\\x9f\\x3b\\x23\\x7b\\xb6\\x34\\x4b\\x11\\x09\\xb3\\x2a\\x94\\x62\\xab\\xc3\\xad\\x3c\\x07\\x10\\xb0\\x4f\\x38\\xc6\\xf5\\x95\\x2d\\xb2\\x75\\xe7\\x7e\\x2f\\x37\\xe9\\x5d\\x55\\x09\\x6b\\xba\\xf3\\xe3\\x05\\xd5\\xd7\\x43\\xd3\\x65\\x95\\xbf\\x05\\x67\\x89\\x2c\\x21\\x0a\\xc7\\xba\\xe7\\x37\\x1d\\x16\\x45\\x84\\x78\\x5d\\xd8\\x90\\x17\\x41\\x59\\xb3\\x93\\x0a\\x9a\\x6c\\xe3\\xa1\\x66\\xdd\\xa2\\x38\\x3e\\x6e\\x2a\\xf2\\x8c\\x1b\\xf3\\x19\\x24\\x47\\xe9\\x05\\x11\\xdc\\xd8\\x0e\\xbd\\xf9\\xee\\x2c\\x9b\\xde\\xdd\\xee\\xb6\\x10\\x55\\x86\\x41\\x53\\x2d\\x07\\xcd\\x13\\xda\\x61\\x25\\x41\\x54\\xcc\\x0f\\xd9\\xd4\\x81\\xe3\\xb0\\xa2\\x37\\xaf\\x2e\\xc2\\x62\\x56\\xd4\\xab\\x21\\x9f\\xaf\\x15\\xad\\x2b\\x7e\\x8e\\x57\\xab\\x72\\x6f\\xf2\\x72\\x32\\x16\\xa5\\x74\\x58\\x5e\\x2a\\x63\\x9d\\x94\\x8c\\x2c\\x4f\\x69\\xee\\xaa\\xd2\\x83\\xe3\\xa4\\x4f\\xf2\\x68\\xea\\xef\\xd7\\xe6\\x6b\\x73\\xed\\xe4\\x73\\xa8\\x39\\x7c\\x76\\xb4\\x8d\\x56\\xcb\\x3c\\xcd\\xab\\xc9\\x1a\\x89\\x29\\xcf\\x42\\x99\\x83\\x50\\xe0\"},\n{{0x76,0x2f,0x06,0xca,0x01,0xe3,0x14,0x71,0x5f,0x92,0xc9,0x0b,0xbe,0x72,0xa2,0x5b,0xf2,0x62,0x12,0xc8,0x1e,0xb1,0xd1,0xa0,0xda,0xe2,0xc3,0x11,0x30,0xf7,0xcd,0xbb,},{0xf9,0x62,0x6f,0xfd,0x69,0x27,0x31,0x92,0x5e,0x5a,0xac,0xfa,0x1b,0xde,0xd0,0x1a,0xa8,0xf7,0x30,0xb7,0x72,0xd5,0xe4,0x6a,0xdb,0xc3,0x15,0x56,0x5b,0x9b,0xf2,0xc9,},{0xe8,0x42,0xb4,0x9e,0x53,0x3d,0xbc,0x92,0x99,0x8d,0xc0,0x78,0xe5,0x97,0x93,0xa2,0xc2,0xfa,0x63,0x6b,0xdf,0xaf,0xdb,0x48,0x93,0x4c,0x93,0xcf,0x34,0x79,0x71,0x02,0x93,0x8d,0x13,0x7a,0xb7,0xea,0xd1,0xa0,0xf7,0x0e,0x94,0xa6,0x7d,0x57,0xef,0x6a,0x02,0xc9,0xec,0x77,0xd7,0x1f,0x70,0xcc,0x57,0xf1,0x53,0x3b,0xec,0x87,0x73,0x0e,},\"\\x94\\x97\\x48\\x3a\\x4f\\xba\\x78\\x43\\x3b\\x38\\xe9\\xde\\xb8\\x91\\x5c\\x75\\x0b\\x6d\\xa0\\xf7\\x8a\\xf4\\xa6\\x8b\\x62\\xf9\\xfc\\x03\\x91\\xe3\\x38\\x87\\x3b\\x1d\\x64\\xb1\\xb7\\xf0\\x9f\\x12\\xf0\\x56\\xa3\\xc9\\x16\\x53\\x49\\x8a\\xd5\\x6e\\x06\\x9b\\x8b\\x16\\x08\\x87\\xe8\\xe3\\x78\\xa7\\x6d\\x8b\\x3c\\x66\\x70\\x83\\xc0\\xa2\\xb2\\xd2\\x31\\x7d\\x3b\\x87\\x48\\x57\\xe5\\x78\\x62\\xef\\x0c\\xb7\\x04\\x36\\xa9\\x02\\x8f\\x01\\x91\\xcc\\xc6\\x16\\xe9\\xd7\\xc9\\xbd\\x86\\x98\\x08\\xcf\\x09\\x48\\x35\\xff\\x51\\x86\\x77\\xb3\\xfb\\x08\\x9f\\x4c\\x9d\\x07\\x7c\\xc7\\x74\\x24\\x05\\xb4\\x86\\x3a\\xc7\\xa5\\x96\\x45\\xc9\\xcf\\x54\\x0d\\x57\\x39\\x9d\\xa6\\xae\\x9d\\x07\\xfd\\x19\\xfc\\xa9\\x5b\\xc8\\xa8\\x6d\\x8b\\x8e\\x24\\xe4\\x87\\x33\\xf3\\x21\\x58\\xfd\\x19\\xa8\\xa1\\x11\\x1d\\x1d\\xa1\\xf9\\xb5\\x80\\xa3\\x9c\\x10\\x48\\x46\\x16\\xcf\\x2b\\xc0\\xec\\x29\\xf6\\x3f\\x77\\xc8\\x53\\x56\\x15\\x8e\\x16\\xda\\x59\\x4b\\x5a\\x89\\x0e\\x55\\xd0\\xb6\\x45\\x99\\xb3\\x02\\x93\\xe9\\x00\\xed\\x92\\xad\\x26\\x19\\x69\\xe7\\xdf\\x4c\\x4b\\x1d\\x0b\\x60\\x24\\xbd\\xce\\xb6\\x90\\x67\\xef\\x48\\x6c\\x20\\xfd\\xcd\\x22\\xa1\\x0d\\x5d\\xa4\\x5f\\xbf\\x90\\x5b\\xa1\\xe9\\x35\\xc9\\x6f\\x50\\xaf\\xb6\\x35\\x71\\xbc\\xff\\x31\\x30\\x68\\x4e\\xda\\x0b\\x56\\xe6\\x0b\\x26\\xcf\\x4c\\x0e\\xf9\\x93\\x8a\\x92\\x76\\x8f\\xc8\\x63\\x1f\\xe3\\x08\\x23\\x6b\\x01\\x2f\\x92\\xaf\\x24\\xa8\\xf6\\xe6\\xec\\xbe\\x76\\x62\\x9b\\xba\\xf8\\xff\\xe5\\x4c\\xdb\\xe8\\x67\\x1d\\xe2\\xba\\x62\\x4a\\x7c\\x0f\\x61\\x93\\xbb\\xa4\\x11\\x04\\x12\\x90\\x2b\\xac\\x29\\x90\\x92\\x2a\\x9e\\x5a\\x81\\x05\\x3c\\xf8\\x76\\xa4\\xc8\\x05\\xa0\\x4c\\x56\\xa8\\x13\\x9d\\x34\\x19\\xe4\\x54\\xa6\\x22\\xd0\\x34\\x2b\\xf4\\x26\\xe9\\x80\\x2c\\x3d\\xc1\\xb4\\x08\\x0c\\x75\\x49\\x2a\\xfe\\x9d\\x7b\\x15\\x45\\xfe\\x08\\x6d\\x96\\x35\\x41\\x32\\x4f\\xf5\\x2a\\x48\\xc6\\xbf\\xae\\xa2\\x66\\x68\\xb3\\xe0\\x1e\\x52\\x36\\xfd\\x45\\xfe\\x54\\x59\\x45\\x35\\xc0\\xb2\\x3e\\x28\\x7e\\xbd\\x14\\x28\\xc8\\xbe\\x0a\\xd1\\x41\\x60\\x0e\\x91\\xcb\\x51\\xe1\\xea\\x66\\x27\\x1a\\x64\\x21\\xfb\\x68\\x9e\\x88\\xa0\\x79\\x0a\\x65\\x1d\\xbd\\x21\\xee\\x20\\x89\\xb2\\x74\\x66\\x6f\\x66\\x0c\\xa0\\x9c\\xe2\\xd6\\x0e\\x39\\xe2\\xee\\x5f\\x03\\xb6\\xeb\\x82\\xd1\\x99\\x76\\x96\\x6e\\x79\\x90\\x0a\\x81\\x0f\\x6d\\x5b\\x5c\\x1a\\x54\\x8e\\x50\\x64\\xf5\\xc3\\xd8\\xa9\\xf2\\xde\\xf0\\x17\\x9d\\xf9\\x9d\\x14\\x3f\\xde\\x69\\xb0\\x71\\x2c\\x09\\x1c\\x29\\xe9\\xb2\\x5f\\x40\\xca\\xfd\\x57\\xa0\\x24\\x65\\x8d\\x77\\x74\\x03\\x76\\x10\\x34\\x2f\\x38\\x00\\xfd\\x51\\xf4\\x9e\\x79\\xa5\\xb3\\xde\\xcc\\x11\\x2f\\x58\\xd0\\x3e\\x3d\\x29\\x58\\x75\\x85\\x88\\xbc\\x4b\\x1c\\x6a\\x6c\\xda\\x7b\\xc5\\xf5\\xbe\\x18\\x3e\\x41\\x51\\x3c\\x1f\\x23\\x0f\\x3c\\xc3\\x64\\x30\\x4b\\xf8\\x24\\x84\\xb7\\xcf\\x19\\xa0\\x02\\xe1\\x50\\xf9\\x8c\\x5e\\x97\\xc6\\x16\\x6e\\xa1\\x5b\\x86\\x34\\x0b\\x8c\\x5e\\xbe\\x5c\\x1a\\x18\\x3e\\x55\\x88\\xe6\\x6f\\x55\\x90\\x50\\x86\\x31\\x3f\\x37\\xa4\\x09\\xe8\\x9b\\x47\\xdb\\x31\\xae\\x97\\x45\\x3e\\xdf\\x69\\xfe\\xd7\\xbe\\x08\\x11\\x30\\x71\\xf3\\x74\\xb2\\x6e\\xc6\\x04\\x3f\\x2a\\x0e\\x9c\\xf8\\xba\\xd8\\x02\\xab\\xad\\x69\\xe6\\x17\\xe7\\x62\\x43\\xb3\\xcc\\x03\\x4b\\x09\\x9d\\x87\\x29\\xee\\x40\\x7a\\x53\\xeb\\x03\\xbd\\xc6\\x41\\x0a\\x03\\x95\\x04\\xb3\\xb1\\x2c\\x81\\x9b\\x64\\x54\\x5d\\x40\\x5c\\x6a\\x4f\\x08\\x49\\x21\\x93\\x5b\\xdf\\xf4\\x13\\x0a\\xe6\\x29\\xd9\\x09\\x62\\x6b\\x06\\x26\\x76\\xe5\\x38\\xea\\xfd\\xff\\xb1\\xd6\\x22\\x9c\\x08\\x89\\xd3\\xcd\\xdd\\x33\\x65\\xdc\\x3d\\x65\\x36\\xf7\\x24\\x8c\\x49\\x31\\x7c\\xb5\\x0c\\x56\\xfb\\x57\\x85\\x55\\x41\\xd6\\xfe\\xeb\\xac\\x81\\x6c\\x99\\x28\\xfa\\x66\\x2d\\x0a\\xe8\\x0a\\x0f\\x39\\xe5\\x70\\xbb\\x7d\\x22\\x41\\x6f\\x98\\xf3\\x71\\xb6\\x42\\x47\\x96\\x89\\x51\\xa8\\xa2\\x46\\xf7\\x4b\\x30\\x61\\x74\\x3c\\x9a\\xf7\\x68\\x4b\\xbb\\x96\\x6a\\xe0\\xbd\\x78\\xa8\\x10\\x49\\x3e\\xa4\\xcc\\xd7\\x11\\x74\\x87\\x1c\\x82\\xbb\\x65\\x2b\\x27\\x48\\xe5\\xbc\\xcb\\x0a\\xb6\\x38\\x8a\\x50\\xf0\\x53\\xa0\\x48\\x08\\x7f\\xd9\\x7e\\xb1\\x5c\\x1a\\x21\\xb1\\xee\\x18\\x25\\xe5\\x4a\\xa1\\x30\\xd6\\x63\\x18\\xaa\\xf6\\x61\\xbb\\xb2\\x47\\x63\\x57\\x7e\\xb3\\x7d\\x31\\x0e\\x21\\x9b\\x0a\\x9b\\xba\\x03\\x75\\xeb\\x9c\\x9b\\x4a\\xf8\\xc4\\xb9\\x9a\\x36\\x99\\xe0\\xd3\\x26\\x67\\x33\\xb6\\xe4\\xe9\\xc5\\x34\\x49\\x0a\\x13\\x41\\xcb\\x19\\x90\\xca\\x5b\\x1c\\x84\\x7b\\xc8\\x12\\x60\\x26\\xfe\\xa9\\x03\\xa1\\xf5\\x49\\xd6\\x5a\\xf8\\xfe\\x02\\xa9\\x16\\x3f\\xf8\\xea\\x28\\x1e\\x72\\x26\\x24\\x3e\\x2a\\x15\\x3b\\x92\\x18\\x51\\xde\\x10\\xf7\"},\n{{0xc5,0xcc,0x0b,0x95,0x81,0x8c,0x4b,0xf3,0x8d,0xa1,0xd6,0x5f,0x02,0x16,0x27,0xe9,0xe5,0x7d,0x26,0x2b,0x02,0xec,0x6d,0x91,0x7a,0x7d,0x46,0xb1,0x1c,0x7f,0xe4,0x8a,},{0x45,0x7d,0xa4,0xef,0x14,0x51,0x9d,0x54,0x1e,0xdf,0x92,0xca,0xbe,0xd9,0xb0,0x4d,0x8a,0x2f,0x2a,0xfd,0x15,0x10,0xa9,0x2f,0x00,0x9b,0xb4,0xe8,0x75,0x4f,0x1e,0xba,},{0x3b,0xa0,0xaf,0x8a,0xf1,0x27,0xc4,0x58,0x48,0x26,0x09,0x0e,0xcd,0xaf,0x48,0x5e,0xbd,0xf0,0x7b,0x82,0xbc,0x49,0x9c,0x9a,0x2b,0xef,0xca,0x28,0xd4,0x93,0x44,0x97,0x4a,0xdd,0xbc,0x8d,0x80,0xa5,0x25,0x60,0xe0,0xf3,0xd7,0x3f,0xf5,0xcc,0xcc,0x72,0xc7,0x4b,0x5b,0x47,0xad,0x2e,0x6d,0xe9,0x61,0x2d,0x1a,0x00,0xae,0xc9,0x27,0x01,},\"\\xd6\\x60\\x8b\\xf5\\xac\\x00\\x0e\\xca\\xf9\\x5f\\xc0\\x9f\\x9c\\xb7\\x49\\x8c\\x51\\x8a\\x6e\\x02\\x55\\x58\\x6e\\x63\\x37\\x85\\x3b\\x1d\\x7d\\x9d\\x7d\\xe4\\xdf\\xe1\\x24\\x5d\\x59\\x03\\x1a\\x31\\x7d\\x4e\\x2b\\x6a\\x73\\xc4\\xc3\\xf9\\x5b\\x58\\x2e\\x72\\xa6\\x42\\x02\\x21\\x58\\x7b\\xac\\x12\\x0f\\xb8\\xed\\x73\\x48\\x07\\x0f\\x28\\x60\\xd8\\x58\\x66\\xa0\\x9f\\xe7\\x56\\x74\\x34\\x97\\xf2\\x11\\x9b\\xc1\\xbf\\xdf\\x57\\x3b\\xe3\\x5d\\x10\\x91\\xbe\\x37\\xf1\\x8b\\xcd\\xa6\\x74\\x1c\\x90\\xd5\\x66\\xcc\\x92\\x4b\\x72\\x16\\x4b\\x74\\x9a\\xf9\\xa6\\xf4\\x0f\\x71\\xd3\\xea\\x5d\\x87\\x64\\xcd\\xc8\\x17\\x14\\xbd\\x73\\x95\\xe5\\xf6\\x79\\x97\\x36\\x36\\xef\\xf1\\xdb\\x1c\\xf0\\x01\\x29\\x83\\xf7\\x1a\\x2f\\x2b\\x12\\xd4\\x5a\\x29\\x4e\\x5a\\x38\\x9f\\x4c\\xd2\\x48\\x3e\\xb3\\x9d\\xa0\\xdf\\x26\\xb7\\x36\\xc7\\xaf\\x6e\\x41\\xdd\\x35\\xa7\\x8e\\x45\\x29\\x2c\\x39\\x4e\\x34\\x68\\x95\\x32\\x88\\x87\\x21\\xf8\\x63\\xc5\\x6d\\xb9\\x7d\\xa1\\xcd\\x10\\xa6\\x6a\\x20\\xa6\\x70\\xb2\\x7f\\xe8\\xce\\x55\\x68\\xa4\\x2b\\x89\\x37\\x79\\x0c\\x7b\\xe1\\xaa\\x42\\x0d\\x20\\x3d\\x7a\\x88\\x5c\\x17\\x29\\xcd\\x6b\\x8e\\x19\\x71\\x89\\xe4\\x79\\xd5\\x42\\xcb\\xcb\\x9b\\x53\\x65\\x6f\\x2b\\x9f\\x53\\x9c\\x32\\x5c\\x34\\xaa\\x59\\x8f\\xd9\\x1e\\x7d\\xf7\\x0f\\x9a\\x74\\xab\\xec\\x46\\x76\\x54\\xb1\\xc9\\xa3\\xd1\\x44\\x38\\xe7\\xc0\\x83\\x60\\x40\\xb7\\x93\\x87\\x1e\\xcb\\xe9\\xe5\\xf6\\x68\\x0c\\xcc\\xcd\\x5d\\x46\\x96\\xa8\\x7e\\x37\\xe8\\x9e\\xab\\x28\\xb6\\xbd\\x67\\x9e\\x8f\\xe1\\x62\\x7b\\xdc\\x9d\\x37\\x3b\\x82\\xf5\\x2c\\xd8\\xc4\\x9b\\xe9\\xba\\xcd\\xc6\\x30\\xa3\\x2f\\xd1\\x28\\x35\\x25\\x5a\\x54\\x2f\\xb7\\xb1\\x23\\x93\\x77\\x9d\\x44\\x98\\xaa\\x06\\xa0\\xe7\\xe1\\xa4\\x97\\x79\\x39\\x81\\x7e\\xb2\\x08\\x8a\\xf1\\xe1\\x9b\\xb0\\xe5\\xac\\xa8\\x54\\xc1\\x25\\xdc\\x60\\x3d\\x83\\x57\\x36\\xa0\\x3d\\x93\\x80\\x51\\x53\\x0c\\x9a\\xb1\\xaa\\x3b\\xc7\\x79\\xb3\\xba\\xe7\\x45\\x0e\\xf5\\x7d\\x1b\\x3f\\xc0\\x93\\xa3\\x7d\\xbe\\x9d\\x1b\\xd6\\xd0\\x40\\xf2\\xf8\\xee\\xba\\x77\\xf7\\xfa\\x88\\xc1\\x49\\xf0\\x65\\xc7\\xac\\xe3\\x32\\x77\\xaa\\x99\\x69\\xc2\\x66\\xea\\x6d\\x85\\xca\\xd6\\x2c\\xfa\\xf5\\x50\\x8e\\x70\\x32\\x71\\x6b\\xe6\\x84\\xa2\\x28\\x56\\x41\\x3e\\x0e\\x65\\xe4\\x2b\\x6e\\x9e\\x6d\\x86\\x5a\\x87\\x36\\x3c\\xbb\\x62\\xd5\\xbb\\xb6\\xa3\\x73\\x1d\\xdd\\xa0\\xfa\\x6a\\xd0\\x29\\x3a\\xf9\\x89\\x3c\\x09\\xa9\\xe7\\x43\\x09\\x0f\\x2c\\xee\\x2f\\x44\\x37\\x73\\x6d\\xd4\\x33\\xe2\\xac\\x74\\x28\\xbd\\xc8\\xc7\\x7c\\xb9\\x96\\x43\\x55\\xfa\\x44\\x15\\xcc\\x38\\x31\\xd8\\xc7\\xca\\x5a\\xf9\\x3d\\x51\\x75\\x2e\\x71\\x8c\\x60\\x66\\xec\\xa1\\x42\\x6a\\x87\\xc2\\x98\\x08\\x28\\x1a\\x85\\xac\\x7e\\x0b\\x40\\x44\\xff\\x6e\\x28\\x0e\\x28\\x01\\x4b\\x93\\x83\\xd1\\x9c\\x9d\\x38\\x7d\\x29\\xdc\\x14\\xde\\x43\\x3d\\xa2\\x60\\x78\\x4a\\x49\\x44\\xca\\x76\\xc2\\xfe\\x8a\\x08\\x0d\\x09\\x96\\xd9\\xa6\\xc2\\xa3\\xd3\\xa7\\x07\\x72\\x80\\xed\\xce\\xe0\\x38\\x9a\\xa8\\xe5\\x36\\x5d\\x1d\\x9b\\x34\\x6e\\xca\\x09\\x47\\xb0\\xff\\x52\\x65\\x94\\x3c\\xcf\\x09\\x93\\x9a\\x4b\\x4a\\x8f\\x98\\x5f\\x6a\\x5e\\x72\\x72\\x3c\\x79\\x5d\\xa0\\xbc\\x36\\x0d\\xce\\x50\\x1f\\x67\\x3a\\xb6\\xea\\x84\\x43\\xf1\\x29\\x42\\x79\\x52\\x45\\x3e\\xb7\\x2b\\x3a\\x8d\\x0d\\x97\\x6c\\x27\\x8c\\x5b\\xd1\\xa9\\x85\\x3c\\x91\\x8e\\x0c\\x24\\x0c\\x3c\\x73\\x49\\x32\\x95\\x3f\\xdb\\x50\\x39\\xfb\\xb0\\x46\\x87\\x93\\x7c\\x9f\\xf0\\xab\\x74\\xa1\\x6e\\xae\\x21\\x2b\\xc6\\xf2\\x0e\\x70\\x0a\\x77\\xc0\\x92\\xd2\\x3d\\x2e\\xfb\\x58\\x0e\\x0c\\x19\\xd6\\x5f\\x30\\x41\\x29\\xab\\x8e\\x6c\\xc1\\x2e\\x58\\x05\\x22\\x57\\xba\\x09\\x44\\x9f\\x30\\xd3\\xd9\\x74\\x39\\x1a\\xff\\xf5\\x63\\x3d\\xef\\x2f\\x5c\\x4e\\xbd\\x57\\x3a\\x9e\\x44\\x4b\\xf3\\xa3\\xdd\\xac\\xed\\xf0\\x2c\\x05\\xf3\\xcc\\x2e\\x75\\x06\\x64\\xa8\\x4a\\x1d\\x24\\xc5\\xd2\\x8b\\x49\\x67\\x0d\\xe8\\xa2\\xf2\\x09\\x08\\x39\\x48\\x3c\\xa3\\x89\\x59\\x99\\x1a\\x7d\\x37\\x27\\xe2\\x1a\\x15\\xe8\\x20\\x16\\xc1\\x5a\\x09\\xee\\x71\\xf4\\xf4\\x3c\\x0a\\x60\\x8b\\x48\\x48\\x5c\\x99\\x34\\xa3\\x86\\x14\\x79\\x4d\\x62\\x91\\xda\\xa3\\x9c\\x01\\xc4\\x5d\\x3d\\xeb\\xe5\\x79\\xb5\\x82\\x3b\\xf3\\x40\\x64\\x04\\xb4\\xc8\\x0e\\xe6\\xff\\x34\\x2b\\x46\\xb3\\x34\\xb0\\xb8\\x83\\xb4\\x0b\\xfd\\x2f\\x9a\\x53\\x59\\x5a\\xb6\\x2f\\xd1\\x35\\x1e\\xbc\\x88\\x30\\x83\\x70\\x49\\x72\\x18\\xdf\\xc9\\x8c\\xe0\\x81\\x40\\x7d\\xa8\\x12\\xa4\\x6d\\x64\\x97\\xd7\\xaf\\x9e\\xc6\\xd8\\x3e\\x1c\\x60\\xee\\xb7\\x12\\xd8\\x89\\xdf\\xbe\\xd0\\xc8\\x05\\xaa\\x11\\xcf\\x81\\x7d\\xd8\\xf0\\x43\\x96\\xef\\x87\\x1a\\x26\\x11\\x2d\\xcb\\x7c\\x0e\\x1d\\x2e\\x68\"},\n{{0x61,0xfa,0x86,0x77,0xee,0xda,0xde,0xd6,0x9b,0x16,0x5c,0x8d,0x27,0x7c,0x97,0x82,0x49,0x66,0x30,0x28,0x30,0x1d,0xf6,0x16,0x3e,0x39,0xb0,0x6a,0xc2,0xf5,0x62,0x5f,},{0x87,0x33,0x9e,0xb5,0x72,0x38,0xdb,0x2e,0x4e,0x60,0xf3,0xc2,0x8a,0x3f,0xd5,0xfb,0x61,0x1c,0x65,0xfd,0xdc,0x81,0xee,0xd7,0xcf,0x77,0x71,0xdf,0x34,0xd9,0x22,0x67,},{0xc0,0x4e,0xbd,0x11,0xc3,0xeb,0x09,0x39,0x6f,0xe8,0xd6,0x82,0x79,0x51,0x0a,0x9e,0xfe,0xe3,0x91,0xab,0xee,0x40,0x81,0xf0,0xd2,0x75,0x67,0x4a,0x30,0x47,0x94,0x83,0x5a,0xad,0x7f,0x3e,0x34,0x5b,0xcf,0x0a,0xf8,0x02,0x7f,0x97,0x47,0x7e,0x79,0xe6,0x79,0x2b,0x8f,0x29,0x98,0x46,0xae,0x28,0xcb,0x13,0xbd,0x88,0x75,0x37,0x99,0x0d,},\"\\x02\\xc5\\x81\\xde\\xe0\\x3f\\x2c\\x60\\x39\\x35\\xaf\\x5e\\xce\\xec\\xfa\\x67\\x71\\x34\\xa3\\xe0\\xae\\xa5\\x4f\\xec\\xaf\\x42\\x71\\xfb\\x52\\x95\\x1a\\x27\\xb7\\x68\\x77\\xcc\\xd4\\x9a\\xb4\\x86\\xdf\\xc2\\x27\\xcf\\x31\\xc9\\xd9\\x57\\xcc\\x97\\x30\\x65\\x73\\xfc\\x7f\\xe1\\xd3\\x1b\\x6c\\x7d\\xf3\\xd7\\x80\\xf3\\xa0\\x5c\\xa6\\x39\\x56\\x57\\xa9\\x42\\x43\\x42\\xc9\\xc6\\xb7\\x03\\x12\\x7e\\x03\\x8d\\xf0\\x79\\x21\\x54\\xe3\\x0a\\x49\\x47\\x61\\x12\\xcb\\x92\\xd0\\xd5\\xa2\\xd2\\x2e\\x89\\x57\\x52\\xa8\\x6e\\xdd\\xdd\\x91\\x2f\\xdc\\x81\\xb1\\xe6\\x4a\\x7b\\xb7\\x50\\xf0\\x99\\x18\\x21\\x32\\xee\\x48\\x23\\xfd\\xe8\\x45\\x80\\x2a\\x94\\x45\\x39\\xd4\\x12\\xb2\\xa8\\x1a\\x15\\xb0\\x00\\x71\\xa9\\x50\\x50\\x4c\\x5b\\x55\\xa7\\x1b\\xdb\\x8c\\x5a\\x58\\x26\\x39\\xe8\\x55\\xe8\\xbe\\x24\\x1c\\xda\\x1b\\xa6\\xb3\\xb4\\xf6\\x45\\x54\\xd1\\x78\\x24\\x90\\x4c\\xb3\\x0c\\xd7\\xef\\xd9\\xac\\x04\\x9e\\x39\\x0b\\xb7\\x9f\\x53\\x59\\x8e\\xf1\\xe8\\xfc\\x27\\xdd\\x7b\\xf5\\x99\\xc9\\x02\\x8c\\x9e\\xbf\\x92\\xfc\\x3b\\xe1\\x1d\\xf3\\x29\\x61\\x2a\\x22\\x8e\\x0f\\x56\\x84\\x68\\x7b\\xf4\\x1f\\xf2\\x03\\xe9\\x7a\\x76\\x86\\x12\\x6a\\x39\\x36\\x6b\\xdc\\x26\\xd5\\x0b\\xe0\\x25\\xd5\\x18\\x7c\\x6b\\xa0\\x66\\x6e\\x37\\x9b\\xe4\\xa8\\x0a\\x9e\\x62\\xef\\xfc\\xd9\\x16\\xd7\\xf9\\x8d\\xe6\\x51\\xe0\\x0b\\x97\\xad\\xf5\\xd2\\xd5\\x3d\\xaa\\x7f\\x8d\\x69\\x5a\\x29\\x15\\x60\\x75\\x5c\\x74\\x44\\x82\\x36\\x4c\\x4f\\x1f\\xa4\\x7e\\xc0\\xb1\\xda\\x16\\x1a\\xa3\\x88\\xf9\\x59\\x79\\x89\\xa9\\x77\\x26\\xd3\\xed\\x2c\\xec\\x82\\xf1\\xa1\\xbb\\xc4\\xac\\x0b\\xe0\\xa0\\x0c\\xb4\\xa8\\xdb\\x1f\\xb7\\xc1\\x4b\\xa0\\x5d\\x89\\x63\\x48\\xdc\\x05\\x59\\xd2\\xa9\\x0b\\xea\\xc2\\x04\\x1d\\xd7\\x7f\\x82\\xd6\\xb1\\x2a\\xeb\\x22\\x43\\xca\\x0f\\x41\\x9a\\x57\\xd3\\xca\\x9c\\x7d\\x25\\xa3\\x0f\\xf0\\xe8\\xbb\\x0d\\x94\\x51\\x55\\xd1\\xb3\\x6a\\xd1\\x07\\xb5\\x5b\\xea\\xa9\\x5b\\x7d\\x5e\\x32\\x00\\x34\\x07\\x62\\x9f\\x15\\x15\\xf8\\xa7\\x08\\x9e\\x24\\x88\\xd0\\xd7\\x54\\x4c\\x2f\\x7c\\xc7\\xc7\\xf0\\x98\\x5d\\xa4\\x28\\x40\\xd4\\x36\\x8f\\xf4\\xf0\\xfa\\x4f\\xa2\\x98\\xe3\\xb7\\x22\\x93\\x03\\xab\\xa5\\x14\\xae\\x94\\xe7\\x02\\x65\\x35\\xa3\\xf4\\x26\\xff\\xbb\\x4e\\x00\\x1c\\xd5\\x0e\\xd1\\x2f\\x21\\x4b\\x3a\\xbe\\xf9\\x6e\\x30\\x16\\x35\\xc9\\x87\\xb1\\x33\\xfc\\x5e\\x61\\x84\\xe7\\xb7\\x57\\x2b\\xc3\\xd9\\x9a\\x45\\x23\\xcb\\xd5\\xaf\\xe5\\x93\\xce\\xdf\\x4c\\x9c\\xd0\\x2f\\xf2\\xe3\\x62\\x37\\xe4\\xee\\x12\\xef\\x1a\\x22\\xd1\\x6d\\x7c\\xf4\\xc0\\x72\\xdc\\xed\\x91\\xcd\\xd2\\x6e\\xe1\\x44\\xcc\\x2b\\xef\\x49\\x50\\x02\\x63\\x49\\xe9\\x44\\x47\\x84\\x08\\x1f\\xe4\\xe0\\x49\\x8b\\xc7\\x5f\\x72\\xe6\\x81\\x8f\\x45\\x9b\\xba\\x90\\x49\\xc5\\x61\\x31\\x6c\\x9f\\x49\\x8e\\x7b\\x1a\\x99\\x4b\\x0e\\x93\\x05\\x5f\\xe7\\x3e\\x44\\x4c\\xbd\\xf9\\x6a\\xc3\\x5e\\x9c\\x4e\\x92\\xe6\\xb4\\x9e\\x3b\\xc0\\xe9\\x9d\\xe1\\x71\\x6d\\xf8\\xea\\xca\\xeb\\x8d\\x2f\\xd7\\x48\\x70\\x04\\x4c\\xb3\\x9c\\x0e\\x36\\x7a\\x1f\\xe3\\x2a\\x9b\\xb2\\x97\\x44\\x16\\x36\\x4e\\x73\\x0d\\x52\\x48\\xdf\\xb1\\xdf\\x16\\x4a\\x8d\\x58\\xca\\xa1\\x00\\x5f\\xdc\\x91\\xba\\xc2\\xbc\\x01\\xcc\\x77\\xde\\xcc\\x14\\x89\\x3e\\xf9\\x46\\xfb\\x3c\\x81\\xbe\\x08\\x32\\xc7\\x2f\\xba\\x37\\x20\\x62\\xf8\\x36\\x0f\\x4d\\x8e\\x6d\\x5b\\x74\\x1c\\xf7\\x03\\x2d\\x8d\\x89\\xde\\x2e\\xdf\\x4c\\x71\\x4a\\x29\\xf7\\x5a\\xbd\\x8f\\x5f\\xf4\\x3e\\xcd\\xd4\\xb7\\xa0\\x4d\\x7d\\xb0\\x88\\x2d\\x16\\xe7\\x44\\x73\\xa0\\xfb\\x79\\xdb\\x44\\x4a\\x78\\xea\\x44\\xaa\\x26\\x31\\xb8\\xc0\\xd7\\xb0\\x30\\x0d\\x55\\xcb\\x6a\\xc4\\x85\\xf2\\x4c\\x0a\\xcc\\x64\\x77\\x47\\xc4\\x3d\\xb3\\xb2\\xa8\\x67\\x7b\\xaf\\x65\\x6f\\xa7\\x35\\xa5\\x75\\xf1\\x81\\x3f\\x36\\x68\\xa2\\xac\\xa9\\x17\\x57\\x11\\xb5\\x25\\xeb\\x49\\x6e\\x9e\\xf9\\x71\\x1d\\x75\\xf5\\x90\\xc7\\xd9\\xef\\x99\\xe0\\xf5\\x9e\\x84\\x83\\xcb\\xf9\\xf2\\x84\\xe3\\xf5\\xa3\\x3e\\xe7\\x78\\x1e\\x62\\xb8\\xb0\\x55\\x51\\x77\\x7e\\xfe\\x0f\\xbf\\xd1\\x9e\\x54\\xb6\\xbb\\xd1\\x42\\x94\\x4b\\xc2\\x95\\x9a\\x82\\xeb\\xd2\\x95\\xd2\\x3d\\x34\\x43\\xb6\\xce\\x65\\x8c\\x2d\\x57\\x9a\\x76\\x37\\xb5\\x49\\x52\\x04\\x91\\x90\\x8e\\x34\\x28\\x2e\\xc2\\x71\\x69\\x72\\xe6\\xf0\\x35\\x39\\x29\\x54\\x7e\\xf1\\x53\\x7a\\xec\\xc9\\x6b\\x2d\\xf6\\x16\\x14\\x85\\x99\\xb0\\x9d\\x9b\\x81\\x39\\x4a\\x13\\xfe\\x7d\\xb8\\x67\\x60\\xb1\\xe2\\xa0\\x60\\xef\\xd4\\x84\\xe8\\x18\\x99\\x39\\xeb\\xdf\\x6f\\x21\\x64\\x0d\\x89\\xd8\\xe7\\x36\\xde\\xe0\\x82\\xad\\x72\\xa0\\x18\\x4a\\xde\\xdd\\x8d\\xf2\\x14\\x74\\xc9\\xf5\\x26\\xbc\\xfd\\xf7\\xe8\\x56\\x58\\x19\\x4b\\xb6\\xd9\\x42\\xe7\\xf3\\xfe\\x96\\xc2\\x3f\"},\n{{0x70,0x48,0xc6,0x52,0x1a,0xef,0xaf,0xa4,0xea,0xc6,0xd6,0xc3,0xa7,0x02,0xb9,0x52,0x54,0x80,0xa6,0x64,0x82,0xe4,0x96,0x98,0x96,0x75,0x7f,0x2c,0xd1,0xac,0x7d,0x5b,},{0xed,0x93,0x11,0x3c,0x16,0x43,0xa5,0x3a,0xa0,0x64,0xca,0xa6,0x31,0xce,0xb6,0xe2,0x0f,0x6d,0x6e,0xc2,0xfc,0x6c,0x07,0x11,0xcb,0x8a,0x1f,0xe7,0x31,0x39,0xaf,0x93,},{0x7c,0x45,0x70,0x3e,0xd3,0x94,0x2e,0x44,0x04,0x1c,0x7f,0xa1,0x85,0x8a,0xa5,0xf1,0xdc,0x38,0x1f,0x49,0x3a,0x45,0x2d,0xfb,0x52,0x70,0x80,0x17,0x89,0x8f,0x71,0x0e,0x31,0x11,0x8e,0x33,0x1f,0x00,0xaa,0x64,0xcb,0x73,0x88,0x36,0x68,0x2b,0x7d,0x17,0x7e,0x97,0x95,0x5c,0x00,0x31,0x9a,0xbd,0x79,0xa4,0x9e,0x0f,0xcd,0x16,0xfe,0x00,},\"\\x53\\xf7\\x4c\\x72\\x4d\\xb1\\x57\\x8a\\x1a\\x29\\x6a\\x7c\\xca\\xc9\\x04\\xa2\\x50\\x4d\\xd9\\x00\\x53\\x89\\xb4\\xf8\\xd4\\xea\\x4b\\x63\\x07\\x29\\x8f\\xc6\\xdc\\xce\\x98\\xa6\\xbc\\x07\\x28\\x0d\\x20\\x36\\x4e\\x40\\x5a\\x46\\x7e\\x73\\x65\\x78\\x96\\x52\\x69\\xc8\\x14\\x61\\xd6\\x1f\\xc6\\xb7\\xe4\\xba\\xd6\\x8d\\x2b\\x6d\\xd0\\x00\\x58\\x50\\x10\\x5f\\x0a\\x67\\xbb\\xc6\\xee\\x22\\x3e\\xc1\\x75\\x4a\\xf4\\xe3\\xb9\\xaf\\xa5\\x06\\x2d\\x1c\\x18\\x61\\x04\\x8f\\x18\\x5b\\x12\\x8f\\x1a\\x5c\\x0f\\xb2\\x5c\\x39\\x19\\xb4\\x83\\x3e\\x29\\xe2\\x02\\xbc\\x94\\x1a\\x90\\x5e\\x63\\xc2\\xc0\\x5b\\x10\\x14\\x64\\x7b\\xd7\\xed\\xe5\\xbe\\x9f\\x99\\x66\\x15\\x18\\x7a\\x3d\\x3b\\xb2\\xc7\\xdc\\x4c\\x28\\xf7\\x05\\x3d\\xef\\x9b\\x28\\xb2\\x9e\\x23\\x31\\xf1\\x62\\x96\\xdc\\xe8\\xf1\\xed\\xe4\\x84\\xca\\xec\\x99\\x67\\x02\\xbd\\x99\\x02\\xe5\\x26\\x84\\xc8\\x12\\xc8\\x74\\x40\\xf6\\x9b\\xd1\\x41\\xc7\\xe0\\x0c\\x69\\x47\\xd1\\xfc\\x7c\\x3b\\xdc\\x0b\\xc5\\x50\\x6b\\x6e\\xa4\\x62\\xe6\\x5f\\x9e\\x74\\x3b\\x72\\xc0\\x07\\xdd\\xc7\\xa3\\x77\\x49\\x37\\x77\\xd4\\xeb\\x12\\x62\\x0c\\xa6\\xc0\\x19\\xc8\\xbf\\xc4\\xc2\\x9e\\xc8\\xaf\\x38\\x2f\\xc3\\xea\\xc8\\x41\\x02\\x1a\\x74\\xe4\\x67\\x4b\\xa3\\xe4\\x3e\\x5d\\x7b\\x41\\xe3\\xfe\\xeb\\x17\\xda\\x00\\xa7\\xce\\x45\\x5a\\x1c\\xec\\x70\\xb0\\xbe\\x6e\\x56\\xf8\\x5f\\xc3\\x7f\\x64\\xcf\\x07\\x33\\xb7\\xe3\\x12\\x41\\xde\\x64\\x1a\\x8a\\x8e\\x5b\\x91\\x89\\x7b\\xc1\\x58\\xfe\\x93\\xd1\\x02\\xc0\\x1d\\x1f\\x5e\\x16\\x6d\\x40\\x81\\x65\\xfe\\x3f\\xcb\\x13\\xd5\\x30\\x45\\x90\\xab\\x8e\\xf0\\xdc\\x8d\\x5a\\x8c\\x1d\\x8a\\x93\\xfc\\xeb\\x85\\x4f\\xc1\\xfa\\x36\\xd0\\xcc\\x48\\x0c\\xf8\\x51\\x2d\\x80\\xbe\\xe6\\x9b\\x06\\x50\\xa9\\x57\\xda\\xed\\x28\\x3c\\xd7\\x63\\x81\\x55\\xed\\x77\\x30\\x86\\xe8\\x6a\\x8f\\xfb\\x19\\x8a\\xcc\\x74\\x23\\xb5\\xd1\\xa6\\x09\\xa1\\x75\\xa5\\x6b\\x94\\xc9\\x6b\\x73\\x18\\x51\\xb9\\x3a\\x94\\x97\\x71\\x01\\xe2\\x55\\xf1\\xce\\x92\\xe2\\x32\\xa0\\x5e\\x2e\\x33\\x87\\xfc\\xb4\\xdc\\x13\\xa3\\x1b\\xee\\x6e\\xe2\\x55\\x07\\x32\\x2c\\x73\\xc9\\x88\\x30\\x80\\xa7\\x4c\\x00\\xf8\\x03\\xa9\\x98\\xdd\\x53\\x0a\\x79\\x12\\x6b\\xb1\\x44\\xed\\x55\\x74\\xc4\\xb2\\x31\\x80\\xe3\\x4e\\x09\\x92\\x83\\xb4\\xbb\\x1d\\x28\\x82\\x2f\\xce\\x37\\x17\\x04\\x6f\\xf3\\x2e\\xf9\\xe2\\xcd\\xf9\\x67\\xe3\\x18\\xea\\x72\\x6a\\x2a\\xee\\xc5\\x78\\x06\\x64\\x3a\\xd4\\x80\\x1d\\x3e\\x0d\\xa5\\x2a\\x1d\\x77\\xbf\\x04\\x3f\\x5a\\xe9\\xf3\\xae\\xa9\\xe4\\xbc\\x4f\\xa7\\x95\\xd0\\x84\\x01\\x08\\x5c\\xa9\\x4c\\xfc\\x4c\\xe7\\x19\\xda\\xbc\\x7b\\x23\\x90\\xd0\\x3d\\x29\\x4a\\x65\\xb7\\xaf\\x9b\\xc3\\x90\\x72\\x28\\x5b\\x77\\x7b\\x2f\\x13\\x3d\\xc1\\x1a\\x70\\xc0\\xa9\\xf0\\x60\\xe1\\x04\\x41\\xf4\\x02\\x16\\xac\\xb6\\x41\\x63\\x7a\\x2e\\xad\\xf1\\xf7\\xb8\\xd2\\x62\\xfe\\xc1\\xb4\\xd0\\xf0\\xf4\\xfa\\xa9\\x3f\\x3f\\x73\\x2c\\xac\\x38\\x2d\\x8a\\xc4\\x2e\\x17\\x8e\\x22\\x44\\x99\\x9d\\x76\\x4a\\x9d\\x0e\\x98\\x17\\x14\\x68\\x6e\\xb4\\x92\\x44\\x97\\xe5\\x6b\\x50\\x15\\x7e\\x99\\x39\\x03\\x2c\\x9f\\x88\\xeb\\x65\\x7c\\xfd\\xe4\\x4a\\xd3\\x47\\x14\\xaf\\x4a\\x51\\x32\\x4e\\x5e\\x77\\xd0\\xde\\xea\\x99\\xc9\\xf2\\x44\\xd2\\xe0\\x9e\\xa4\\x25\\x82\\x0a\\x74\\x6d\\x88\\x3a\\x0c\\xf4\\xb7\\x05\\xc2\\x9d\\xf8\\xc0\\x37\\x44\\x81\\x54\\xdc\\x08\\xa4\\xd4\\x33\\x74\\x05\\xfb\\x87\\x65\\x82\\x31\\x14\\x37\\x0b\\x37\\xed\\x86\\x08\\x6e\\xc5\\xf8\\xbd\\x6c\\x72\\xab\\xf1\\x3f\\x51\\x84\\x30\\x71\\x0f\\x59\\x7b\\x06\\x10\\x8f\\x65\\xb3\\x0a\\x48\\x34\\x96\\xe2\\xed\\x81\\xda\\xb1\\x0f\\xee\\x94\\x7f\\xe0\\x4b\\x54\\x85\\xf2\\xe3\\x07\\x40\\x49\\xd2\\x22\\x84\\x26\\x66\\x51\\xad\\x10\\xdd\\x08\\x6a\\xaa\\x5d\\x45\\x2e\\x0d\\x1a\\x61\\x12\\x9d\\x1e\\x77\\xc6\\x63\\xc2\\x6d\\x08\\x89\\x62\\xb5\\x54\\x56\\x45\\xb7\\xa1\\xa8\\x71\\x3d\\x51\\x32\\x7a\\x7a\\x35\\x9b\\x12\\xda\\xad\\xb8\\x5a\\x2c\\xd4\\xb5\\x41\\x0d\\x5c\\x20\\x26\\x7f\\xa7\\x66\\xb8\\xc4\\x2a\\x84\\xdc\\x42\\x66\\x45\\x88\\x87\\x9b\\x3e\\xae\\xfd\\x4c\\xc8\\xdc\\x69\\x3f\\x98\\xac\\x20\\x56\\x09\\xe5\\x70\\x66\\x5b\\x01\\xea\\x46\\x55\\xe3\\x94\\x29\\xa7\\xa7\\xe5\\x42\\xef\\xb4\\xf7\\x89\\x0d\\xbf\\x4e\\x34\\xc6\\xcf\\xf0\\x7e\\x4d\\x35\\xbd\\x3e\\xee\\xdf\\x5b\\x46\\x28\\x0f\\x4a\\x0d\\xa0\\xc2\\xe7\\x3c\\x94\\xea\\x81\\xcf\\xea\\xe7\\xf9\\xbd\\x04\\xfe\\x2d\\x45\\x97\\x65\\x00\\xf7\\xdc\\xac\\xb0\\xdf\\x2a\\x5d\\xc7\\x36\\xa8\\x23\\x67\\x1d\\xb6\\x79\\xbe\\x66\\xcb\\x33\\xc1\\x62\\xfd\\x2c\\x74\\xae\\x71\\xfb\\xf4\\xd2\\xb0\\x5a\\xf0\\x42\\xb3\\xa9\\x77\\xf5\\xb9\\x44\\xb9\\xfd\\xb6\\xc3\\x44\\x24\\x42\\x1b\\xcf\\x4f\\x62\\x23\\x76\\x84\\x28\\xfa\\x14\\x0f\\xd4\"},\n{{0x3e,0x63,0x73,0xb2,0x65,0xb9,0x67,0x89,0x00,0x7a,0xd2,0xa1,0x0c,0x30,0x9a,0x56,0x76,0x38,0xf2,0x55,0x87,0xd7,0x7e,0x28,0xb0,0x82,0x3a,0x4f,0x17,0x9a,0xe4,0xfe,},{0xa3,0x23,0x4e,0x5d,0x13,0xb0,0x34,0x72,0x16,0x50,0x36,0x40,0x4f,0x6d,0xe8,0x0e,0x70,0x28,0x39,0x50,0x0f,0x13,0xd9,0xc9,0x85,0xa0,0x77,0xd4,0x5c,0x69,0xff,0x45,},{0xf5,0x1e,0x0f,0x87,0x8a,0x5a,0x70,0x96,0x47,0xe8,0x5f,0xea,0x83,0x9f,0xd5,0x66,0xe6,0xf3,0x5c,0x8a,0x61,0x85,0xd0,0xc9,0xeb,0x13,0xe0,0xd5,0xb9,0xe6,0xe8,0xaa,0x95,0xc3,0x33,0xa8,0xf5,0x06,0x32,0xa4,0xd6,0x65,0x7b,0x51,0x8c,0xe4,0xcf,0xde,0x40,0xb8,0xf5,0xa0,0x5b,0x2d,0x9f,0x84,0x41,0xfc,0xc9,0xd2,0xd6,0x92,0xd5,0x09,},\"\\xb9\\xd0\\x68\\xbb\\xca\\xe7\\x72\\x2f\\x82\\x8b\\x0f\\x8c\\x98\\xa7\\x38\\xe3\\x6a\\x7d\\xf4\\xc9\\x97\\xc7\\x24\\xba\\x27\\x53\\x1a\\xf3\\x4a\\x2f\\x10\\x6c\\x75\\x13\\xa4\\x4a\\x46\\x1a\\x9a\\xa4\\x30\\x9b\\xc1\\x5c\\x4e\\x0d\\x42\\x75\\x91\\x93\\xea\\x1c\\xde\\xa9\\x56\\xbb\\x81\\x59\\x85\\xf5\\x78\\x67\\x14\\x5e\\x9e\\x2c\\x75\\x85\\xfc\\x8d\\x61\\x02\\x7e\\x47\\xd2\\xd7\\x35\\xe2\\x44\\x8a\\xf3\\x78\\x29\\x09\\x40\\x4e\\xde\\xaa\\xc0\\xfd\\x73\\xf6\\x04\\x5d\\xcd\\xb0\\x4f\\x03\\x77\\x75\\x8f\\x02\\x20\\x4a\\xae\\x3a\\x72\\x20\\x31\\x1c\\x0f\\x47\\x23\\x58\\x27\\x10\\xcc\\x44\\x0c\\x36\\xc9\\x58\\x7b\\x5c\\x9e\\xbc\\x40\\x63\\xfe\\xa8\\xca\\x3f\\x43\\x19\\x58\\x94\\xf7\\x9a\\x36\\x50\\x87\\x13\\x72\\x82\\x30\\x2d\\xbf\\x2e\\x7a\\x0d\\x41\\x1a\\xb5\\x8b\\x70\\x26\\xcc\\xde\\x19\\x88\\x69\\xaa\\x73\\x43\\x34\\xc0\\x52\\x38\\xe2\\x75\\xe3\\xc3\\xab\\x21\\x70\\x83\\x49\\x57\\x69\\xe2\\xfa\\xd3\\x74\\x05\\x14\\x52\\xd7\\xf5\\xb1\\xdb\\x0e\\x78\\x58\\x36\\xd4\\xbd\\x5e\\x29\\x78\\xa3\\xe9\\x91\\xaf\\x0f\\xf7\\x16\\xf4\\x38\\x89\\xa0\\x7f\\x5d\\xf2\\x99\\x60\\x36\\x21\\xc3\\x9e\\x2c\\xde\\xe0\\x89\\x98\\x5d\\x9e\\x6b\\xf7\\xb2\\xfb\\xd0\\x23\\x73\\xae\\x1b\\x5e\\x9b\\x88\\xf5\\xb5\\x4a\\x07\\x6e\\x67\\x6d\\x77\\x90\\xbf\\xc8\\xf5\\x7d\\xcc\\x59\\xef\\x52\\x85\\x0c\\xe9\\x92\\xa7\\x3b\\xa7\\xbc\\x99\\x1d\\xeb\\x4d\\xde\\x5e\\xb0\\xb2\\x16\\x70\\xb1\\xb3\\xd4\\xb6\\x4f\\x36\\xcc\\xa8\\xe3\\x07\\x09\\x85\\x68\\x49\\x7d\\x89\\x16\\xf6\\xb5\\xd0\\xe9\\xe8\\x9f\\x99\\xf8\\x60\\x06\\xf3\\x9b\\xd3\\xa8\\x10\\x76\\x9c\\x8f\\x78\\x01\\x77\\x3c\\x96\\x38\\xab\\xcf\\x5e\\x27\\x11\\xb1\\x9d\\x11\\x67\\x59\\x3a\\xcb\\xe8\\x5e\\x41\\x61\\x42\\x89\\x97\\xa2\\x19\\x4d\\xc5\\xe7\\xb7\\x64\\x0f\\x0d\\x2c\\x1e\\xb2\\x05\\x55\\x3b\\xe9\\x16\\x7f\\xfb\\xc2\\x2b\\x7c\\x2e\\x76\\x98\\xf3\\xaf\\xa1\\x07\\x54\\xcb\\x44\\xd4\\xb1\\xd4\\x5b\\x83\\x73\\x03\\xb1\\x66\\x90\\x73\\x41\\x5a\\x22\\x60\\x6b\\x50\\xf2\\x1f\\x82\\x65\\xe1\\x39\\xf2\\x30\\x5a\\xc0\\xe0\\x12\\x7a\\xe0\\x56\\xce\\x8a\\xbe\\xab\\xa2\\x0e\\x1d\\x26\\x9a\\x2b\\x2e\\x89\\x9c\\x49\\x54\\x72\\x68\\xa0\\x69\\x6a\\xe4\\x50\\xdc\\x02\\x67\\xf7\\xf6\\x3a\\x8e\\xdf\\x07\\x4c\\x47\\xd3\\xc2\\xdb\\x1d\\xa3\\x63\\x93\\x73\\x73\\x04\\xe6\\xdd\\x4f\\xac\\xcd\\xb6\\xab\\x55\\xe5\\xf8\\x52\\x0c\\x3d\\xff\\x5f\\x6b\\xea\\xc3\\x0b\\xa8\\x5b\\x86\\x08\\x23\\x51\\xe3\\xde\\xd8\\x40\\x0a\\xa5\\x7f\\x65\\x0c\\x0c\\x33\\x03\\x6d\\x65\\xb3\\x9b\\x7d\\x2f\\xb6\\x11\\x28\\x63\\xd5\\x9b\\x72\\x55\\x82\\x42\\xe8\\xb0\\x45\\xad\\xdd\\x35\\x7d\\xe6\\xfd\\x37\\xa8\\xf6\\x61\\x17\\x65\\xc9\\xb5\\xff\\x19\\xcc\\x4d\\xb7\\xe1\\x17\\xc6\\x5a\\x00\\x45\\x89\\x08\\xb0\\x24\\x5d\\x04\\xf7\\x90\\x8f\\xc7\\x3b\\x16\\x5d\\xff\\x6e\\x4b\\xe4\\xb4\\x20\\x32\\xd8\\xcf\\xd7\\xd6\\xf7\\x77\\x2c\\x1b\\xfe\\x72\\x1d\\x4b\\xcf\\xe2\\xfc\\x52\\x79\\x98\\xf3\\x4f\\xb4\\x41\\x8a\\x1f\\xae\\x1e\\x6c\\x37\\x67\\xc4\\xd0\\x78\\x06\\x21\\xf9\\x23\\xda\\x1f\\x0a\\x0d\\x3d\\x21\\x9c\\x03\\x6a\\xcf\\xd3\\x70\\x9d\\xad\\x4c\\xf2\\x4d\\x90\\xbc\\x69\\x1d\\x70\\x0e\\x6a\\x9c\\x80\\xcc\\xfd\\x10\\xbd\\xe8\\xe7\\x91\\xc0\\xfe\\xa8\\x28\\x80\\xc0\\x7b\\xaa\\xaa\\x31\\x1e\\xef\\x79\\x24\\x07\\x84\\xf6\\x28\\xa7\\xd2\\xa0\\x91\\x84\\xe0\\x16\\xf8\\x10\\x08\\xe7\\x74\\x29\\xa8\\x65\\x8b\\x15\\x3e\\x44\\xe7\\x9a\\x98\\xad\\x24\\x8f\\x7f\\xda\\x23\\xb5\\x90\\xd6\\x46\\xd7\\xc1\\xd8\\x41\\xf4\\x92\\x7d\\x6e\\x8b\\xc7\\x32\\x14\\xd1\\x0a\\x7f\\x3c\\x29\\xc8\\xf8\\x39\\xa8\\x90\\x8d\\x20\\xa7\\x4e\\x82\\x7a\\xf4\\x67\\xac\\x5a\\xbf\\x0f\\x1d\\x0e\\xd3\\x9c\\xdd\\xd9\\x69\\xdd\\xe9\\xee\\xb4\\xa4\\xb7\\x52\\x7a\\xb3\\xe2\\x47\\x5a\\x19\\x5e\\x24\\x47\\x4a\\x4e\\x36\\xb0\\x90\\x52\\xe2\\xda\\xd4\\xa5\\xeb\\x46\\x91\\xe2\\x63\\xb8\\xc6\\x1b\\xbd\\xe8\\x77\\x72\\x20\\x7e\\x01\\x1c\\x4c\\x1e\\x14\\x23\\x5f\\xb2\\x4e\\x4d\\xa4\\x38\\x87\\x5d\\x18\\x53\\x0f\\xef\\x90\\x26\\x19\\xdd\\x48\\x5d\\x77\\xb5\\x45\\xab\\xb5\\x6b\\x69\\xc7\\x55\\xaf\\xe7\\x58\\x60\\x69\\x71\\xab\\x97\\xdd\\x3a\\xce\\x1c\\x1a\\x34\\xa3\\x37\\x94\\xc8\\x15\\x6d\\xa7\\x99\\xe8\\x22\\x4d\\x88\\x5e\\x18\\x68\\xf9\\xcb\\x46\\x6d\\x80\\x2c\\x82\\x7c\\xc3\\xe1\\xec\\xd0\\xae\\x6e\\x0b\\x01\\xf8\\xf7\\x91\\xb1\\x22\\x08\\xfc\\xc0\\xfe\\xd3\\x85\\xb7\\x96\\xeb\\x2f\\x29\\x08\\xb5\\x8d\\x30\\xb3\\x73\\x3f\\x14\\x70\\xf2\\xe2\\xef\\x12\\xad\\x43\\xfe\\xb7\\x2d\\x08\\x16\\xde\\x3c\\x13\\xa8\\xb5\\xa5\\x23\\xe1\\x4c\\xdf\\x5f\\xf3\\x72\\x0b\\xf8\\x77\\x69\\xcd\\xe7\\x49\\x5d\\x22\\x6b\\xf3\\x82\\x38\\xa8\\x25\\xf7\\x5a\\x09\\xf6\\xbb\\x9a\\xfc\\xe5\\x16\\xa7\\xbc\\x70\\x11\\x43\\x70\\xbb\\xc4\\x0f\\x17\\xc7\\xbc\"},\n{{0xf5,0xe8,0x59,0x7e,0xac,0x0e,0xbf,0xa9,0xd3,0x85,0xde,0x85,0xa1,0xfb,0xaa,0x35,0x14,0x63,0x95,0xb1,0x34,0x57,0xb5,0xb1,0x4d,0x36,0x70,0xda,0xca,0x69,0x05,0xe7,},{0xce,0x93,0xe6,0x42,0xc2,0xf1,0x50,0x84,0xbc,0x83,0xba,0xfd,0xaa,0x19,0x67,0x63,0xde,0x2a,0x3c,0x51,0x3b,0x0e,0x44,0xf6,0x8d,0xdb,0xde,0x37,0x85,0x14,0xc4,0x41,},{0x57,0x65,0x43,0xfc,0x21,0xab,0x0a,0x7c,0x5f,0x63,0xb1,0xcf,0xf0,0x1b,0xf8,0x45,0xdf,0x91,0x79,0x2e,0x7a,0x97,0x50,0xc5,0x50,0x8b,0x51,0x66,0x5e,0x7f,0x89,0xf1,0x7c,0x6e,0xc3,0x35,0x5a,0x0a,0xed,0x87,0xdb,0x8c,0x77,0xbd,0xb2,0x71,0xfb,0xed,0xc7,0x14,0xff,0xad,0xb7,0x8b,0x5e,0x0f,0x97,0x81,0x16,0x77,0x1b,0xa7,0xcf,0x0b,},\"\\x27\\x33\\x41\\xf2\\x19\\xff\\x5c\\xf3\\x81\\xc7\\x7b\\x2d\\xd2\\x26\\xc5\\x8f\\x8f\\x33\\xc4\\x52\\x70\\x48\\xcb\\x00\\x6a\\xff\\xef\\x8c\\xee\\x15\\x1e\\x30\\x0e\\xfe\\xf6\\x29\\xfe\\xd2\\x1b\\x70\\x45\\x1f\\x72\\x92\\x92\\x62\\x7d\\x1f\\x3f\\x1b\\x52\\x57\\x35\\x9e\\xe5\\xa6\\x71\\xcf\\x62\\xae\\x57\\x32\\x49\\x40\\xf2\\xd0\\xb1\\x5a\\xac\\x76\\xff\\x39\\x82\\x20\\xc0\\x80\\x24\\xe2\\x9a\\x8c\\xf3\\x65\\x04\\xe1\\x2a\\x4e\\x96\\x43\\x8f\\x42\\xc3\\xda\\x0c\\x00\\x05\\x41\\xbc\\x11\\xf0\\x91\\x38\\x1b\\x0b\\x72\\xb5\\x8a\\x92\\x08\\x3f\\x44\\x6e\\xca\\x19\\x91\\x99\\x68\\x78\\xde\\x35\\x08\\x1c\\xc4\\xab\\x90\\x95\\x8c\\x96\\xcf\\x5c\\x99\\x79\\x6c\\xba\\x79\\x51\\xee\\x18\\x6f\\x26\\x52\\x7a\\xed\\xe6\\x9d\\xb3\\x04\\xce\\x29\\x41\\xba\\x15\\xcc\\x00\\xba\\x2f\\x14\\x11\\xf2\\x08\\xda\\xd4\\x5e\\x87\\xbc\\xf6\\x38\\x79\\x2d\\xe0\\xa6\\x86\\x24\\xb6\\x67\\x29\\x7c\\x27\\xa3\\x43\\xdb\\x4b\\xaf\\x34\\xa0\\x22\\x8e\\xaf\\x0d\\x10\\x22\\x00\\x9b\\x5d\\x06\\x8b\\x25\\x34\\xd9\\x20\\x30\\x2e\\x71\\x31\\x0f\\xeb\\xf0\\xdf\\x1b\\xb0\\x2c\\x2e\\xf0\\xad\\x1a\\xe1\\x49\\xde\\xad\\xf8\\xc1\\x84\\x37\\x3c\\x0f\\x7e\\xb6\\xb2\\x56\\x95\\xbe\\x82\\xd1\\x2c\\x71\\xb6\\xc8\\x32\\x67\\xd9\\xa2\\x33\\x66\\x7e\\x77\\xbc\\x20\\x59\\x83\\xf8\\xb8\\xd8\\x77\\xd8\\x5a\\xea\\xd3\\xf6\\x0e\\x82\\x0f\\xfc\\xb1\\x7a\\xdd\\xdd\\x92\\xa7\\x71\\x2b\\xbe\\xb3\\x4e\\xe7\\x19\\x66\\xda\\xfd\\x99\\x07\\xd1\\x93\\xdd\\x9d\\x72\\x5a\\x31\\xa6\\x13\\xd2\\x9e\\x32\\xbe\\x72\\x13\\x28\\x08\\x92\\x6d\\x94\\x37\\x47\\x7f\\xee\\x25\\xed\\xa6\\x10\\xae\\xb1\\xdc\\xe1\\x2e\\xa3\\x16\\xc6\\xae\\xc6\\x68\\x9e\\x50\\x1c\\x55\\x19\\x23\\x82\\x5a\\x34\\xb4\\x2c\\x4f\\x06\\x75\\xb8\\x6a\\xb2\\x6a\\xde\\xea\\x2e\\x60\\xda\\xe6\\xc6\\xd1\\xcd\\xd0\\xcb\\x3c\\x34\\x7b\\x16\\x38\\x40\\x39\\xa8\\xe3\\xfd\\x60\\x87\\x38\\x13\\x87\\xcb\\x4b\\xc7\\x2d\\xdb\\x5f\\x25\\xb3\\x74\\x85\\x9b\\x02\\xe5\\xbb\\x1b\\xa0\\x6d\\x3c\\xc6\\x9e\\xc4\\x4c\\xec\\x4b\\x98\\x5c\\x84\\x76\\xe3\\x50\\x32\\xe9\\x9a\\xbf\\x00\\x1a\\x1d\\x44\\xdd\\xc6\\xe2\\x88\\x9c\\x3c\\x2c\\x3e\\xca\\xce\\xd6\\x09\\xb2\\xb2\\x68\\x0e\\x00\\xb1\\xef\\xa7\\xe9\\xd2\\x6d\\x62\\xf2\\xb3\\xab\\x36\\xf9\\x21\\x04\\x47\\x90\\xab\\xbd\\x49\\x36\\x07\\x56\\xdc\\xff\\xcc\\xf2\\x30\\xf6\\x6d\\xbb\\x70\\x1a\\xa1\\x64\\xda\\xd6\\x06\\x9a\\xa2\\xb8\\xb3\\x30\\x9f\\x2f\\xe4\\x4d\\x5e\\x0b\\x25\\xbd\\x55\\x64\\x31\\xf0\\xdf\\x4c\\x2e\\xa9\\x7a\\xe7\\x9e\\xd4\\xa5\\x75\\x78\\xd6\\x6f\\xc6\\x93\\x9c\\x57\\x62\\x8a\\x90\\xca\\xc9\\x7a\\xdf\\xa8\\x70\\x2a\\x4a\\x1c\\x89\\x65\\xba\\x1a\\x90\\x26\\x25\\x67\\x28\\x66\\x64\\x00\\x30\\x03\\x53\\x3c\\xc9\\x31\\x4c\\xaf\\x7d\\x3b\\x98\\x2e\\x0a\\x43\\x2f\\xf5\\xaa\\x4e\\xd5\\x74\\x19\\x83\\xd9\\xb5\\x43\\x23\\xac\\x7e\\x29\\x9b\\x2b\\x49\\x56\\xc1\\xa2\\xc1\\x91\\x55\\x7b\\x27\\xd8\\x6b\\xe7\\x14\\xb5\\xb6\\x8f\\xcb\\x1d\\x41\\xf7\\x8c\\xa5\\xdd\\xb6\\xb5\\x3b\\x3d\\xfc\\x8e\\x7d\\x6b\\x3c\\x3d\\xb0\\x59\\xaf\\x9f\\x2d\\xd7\\x65\\xef\\x04\\xb6\\xd1\\x6e\\x67\\x37\\xc7\\x27\\xaa\\x11\\xf3\\xdf\\x37\\x74\\xa3\\xfc\\x96\\x18\\x2e\\x28\\x2a\\xcc\\x3d\\x23\\x3e\\xea\\xbf\\x8c\\x72\\xd3\\xf2\\x46\\xae\\x18\\x45\\x05\\x28\\x8f\\xef\\x39\\xb3\\x67\\x66\\xb1\\x0d\\xd1\\xbf\\xbf\\xbf\\xa7\\x0f\\x97\\xb3\\xc9\\x01\\x72\\x6d\\x1e\\x0d\\x0a\\x83\\x7d\\x11\\xf0\\x12\\x3a\\x34\\xab\\xad\\x1a\\x79\\xaa\\xbe\\x80\\xb1\\x25\\xb1\\x28\\xee\\x16\\x0b\\x51\\x18\\x48\\xf7\\xf0\\x4c\\x49\\xc8\\xd5\\xc2\\xf2\\x04\\x1d\\xa7\\xd9\\x59\\x9c\\x29\\xb1\\xda\\xc8\\xc6\\x80\\x77\\xef\\xac\\x3e\\xca\\x58\\xbb\\xc1\\x63\\x7a\\xad\\xce\\x21\\xc7\\x74\\xfe\\xa4\\x2d\\x2b\\xcf\\x4a\\x0b\\x98\\x92\\x30\\x7e\\x36\\xfa\\x25\\x0a\\xce\\xe7\\x95\\xad\\x2b\\xfe\\xcf\\xbf\\x60\\x31\\x9b\\x81\\x66\\x3e\\x2a\\x26\\x57\\x19\\x46\\xf7\\x5a\\x8d\\x96\\x9a\\xf1\\x6b\\x3b\\x57\\xc3\\xec\\x3e\\x66\\x15\\x8a\\xaf\\x42\\xcc\\xf5\\xe5\\x8b\\x93\\x7a\\xae\\xf6\\x13\\x31\\x86\\x06\\x60\\x33\\x17\\xe5\\xaa\\x31\\x8b\\xe7\\x0f\\x8d\\xa3\\xc0\\xc1\\x6b\\xe6\\xc2\\x9e\\x3e\\xc9\\xfe\\xf4\\xe4\\x6e\\x8c\\xa2\\x41\\xd9\\x41\\xd5\\x80\\x49\\xa0\\x63\\xd9\\x0a\\xfc\\x95\\x3c\\xa3\\x2e\\x8a\\x50\\xa6\\x47\\x36\\x32\\x58\\x8a\\xc4\\x1e\\xae\\x97\\xf2\\x0c\\xe9\\xb7\\x41\\xed\\x41\\xc9\\xa4\\xaa\\x65\\x51\\xfd\\x82\\x3c\\xe0\\xc8\\x11\\xa5\\xbb\\x5a\\x17\\x1c\\x1e\\xa4\\x23\\x8a\\x02\\x46\\x81\\x1e\\x46\\x9c\\xf4\\x98\\xb7\\x96\\x21\\xc3\\x23\\xeb\\xa7\\x98\\x53\\x44\\xfe\\x11\\xe6\\x74\\x99\\xed\\xf4\\x96\\x74\\x91\\xaa\\x74\\x9f\\x8f\\x3f\\xe3\\x99\\x61\\xd7\\x68\\x92\\xc9\\x3a\\xac\\x3b\\x19\\xfa\\x4b\\x4f\\xc1\\x74\\xd7\\xd4\\xd4\\xd8\\xbd\\x6e\\xe4\\x75\\x47\\x50\\x08\"},\n{{0xcd,0xad,0xc5,0xb8,0x9c,0xb2,0xb6,0x30,0x8a,0x00,0x6f,0x2f,0x4e,0x95,0x5a,0x91,0xaa,0xf3,0xba,0x70,0x16,0x5f,0x2d,0x44,0x4e,0xf1,0xff,0xeb,0xbd,0xaa,0xa2,0x21,},{0x05,0x41,0x41,0x5f,0xf5,0x46,0x7f,0x28,0xce,0xac,0x83,0x9b,0x13,0xa1,0x76,0x6e,0x72,0xc9,0x9e,0x65,0x45,0x20,0x7d,0x9d,0x5d,0x96,0x97,0x41,0x1e,0xb6,0xbc,0xa7,},{0xff,0xed,0xe7,0x01,0xeb,0x18,0x29,0xce,0x23,0x61,0xcd,0xa2,0xc8,0xbb,0x63,0x33,0x85,0x39,0xd8,0xad,0x2f,0x66,0x77,0x58,0x55,0x31,0xe7,0xbf,0x1d,0x39,0x22,0x38,0x26,0x79,0xa1,0xae,0x84,0xff,0xeb,0x75,0x3f,0xc9,0x75,0x4e,0x50,0xc0,0x18,0x52,0xf9,0x55,0xe3,0xfd,0x60,0x9f,0xf6,0x4b,0xf0,0x5b,0xbe,0x70,0x75,0xcd,0xbe,0x00,},\"\\x91\\x17\\x27\\x03\\x6d\\xb3\\x09\\xd6\\xe2\\xe3\\x36\\x9e\\x4f\\x17\\xd9\\x8d\\x99\\xec\\x07\\x0c\\x33\\x28\\x3b\\xb1\\x24\\x4e\\xfd\\x62\\xe7\\x6b\\xd7\\x0a\\x69\\xb9\\x72\\x3b\\xd2\\xb5\\x20\\x47\\x2b\\x98\\xaa\\x06\\x59\\x24\\x36\\x6d\\xe7\\x80\\x90\\x0b\\xcd\\x8b\\x77\\xb5\\x0f\\x87\\xc3\\xc3\\x61\\x87\\x02\\x4b\\xbc\\x59\\xcc\\xf4\\x48\\x2c\\x7b\\x4a\\xad\\xb5\\x6e\\x2e\\x5e\\xcc\\x00\\x03\\xd9\\x89\\xd6\\xaf\\xc6\\x3e\\xc1\\x02\\x42\\xe5\\x74\\x82\\xfe\\x39\\x21\\x52\\x61\\xd5\\xfc\\x95\\xa0\\x18\\x5f\\x95\\xe9\\x54\\x0c\\x55\\xf7\\x4d\\x69\\x60\\x48\\xbc\\xa7\\xab\\x11\\x26\\x81\\xa5\\x55\\x8e\\xa9\\x3c\\x3b\\x1f\\x1c\\xd3\\x64\\x65\\x9e\\x94\\x33\\xce\\xee\\xbe\\x05\\x4e\\xe7\\x13\\xc4\\x77\\x60\\xd7\\xad\\x13\\x2a\\x7f\\x3f\\x8f\\xe3\\xd5\\x04\\x1b\\x81\\x1a\\x26\\xb6\\x5e\\xfb\\x1f\\x34\\x0e\\x18\\x1a\\x4e\\xc7\\x20\\xea\\x13\\x6b\\x3a\\xf3\\xd9\\xe5\\x46\\x1d\\xd2\\x43\\x70\\x33\\x6f\\x10\\xe6\\x35\\x4c\\x8c\\x17\\xac\\xf9\\x99\\x85\\x44\\xce\\xc0\\x87\\x3e\\xfa\\x68\\x7c\\xb1\\x32\\xae\\xcf\\x70\\xae\\xbb\\xc5\\x67\\xba\\x03\\xc5\\x36\\x49\\x9e\\xf9\\x6c\\xc8\\x41\\x2e\\x7a\\xaa\\xd5\\xbf\\x96\\x42\\x2b\\xe4\\x7c\\xb9\\x41\\x36\\x45\\xdf\\x2c\\x17\\x03\\x19\\x23\\x47\\xdc\\xbb\\x12\\x31\\x27\\x45\\x59\\x71\\xae\\x15\\x7e\\x9f\\xa2\\xdb\\xff\\x88\\x74\\x5a\\x96\\xc6\\x58\\xb8\\x65\\xe4\\x1f\\x55\\xae\\xbf\\x98\\x39\\x50\\x05\\xdd\\xcb\\xd5\\x98\\x3e\\x6a\\xe0\\x2c\\x4f\\xbb\\x5e\\x17\\x91\\x67\\x96\\x32\\x5f\\x76\\xed\\xf5\\xb6\\x4a\\xfa\\x4e\\xc5\\xa7\\x41\\x8a\\xfe\\xd2\\x3a\\x97\\xef\\xad\\xe6\\x8b\\x6a\\x5b\\x31\\x45\\xf0\\x8a\\x5d\\x3d\\xb9\\xc2\\x98\\xa5\\x12\\xfa\\xbd\\xac\\x68\\x56\\x2b\\x3f\\x55\\x37\\x7f\\xf4\\x4b\\x00\\xc1\\xc2\\xf3\\xef\\xd1\\x81\\x32\\xda\\x71\\xf9\\x71\\xa9\\x53\\xa9\\x31\\x8c\\x57\\x52\\x33\\x61\\xa1\\x60\\xf9\\xb7\\xe3\\xb5\\x1c\\x52\\x4e\\x95\\xdd\\x5e\\xf4\\x56\\x8e\\xf1\\x8a\\x80\\x07\\x75\\xe9\\xd2\\x6e\\x07\\x13\\x19\\x42\\xd2\\xbe\\x4e\\xf2\\x2c\\x0c\\xbc\\x13\\xdf\\x01\\xc6\\x8b\\x1b\\xcd\\x3b\\xce\\x9b\\xd5\\x1c\\x4c\\xed\\x65\\x2a\\xdc\\x40\\x07\\xbe\\x43\\xb3\\x7c\\x67\\xa5\\xc5\\x5e\\xd4\\x02\\x9e\\x8a\\xd1\\x5d\\xef\\x83\\x05\\xc9\\x68\\x62\\x1a\\xed\\x4c\\xd4\\xbf\\xe0\\x79\\xa6\\xf4\\x88\\x84\\xd8\\x56\\x80\\x39\\x2c\\xa9\\x2b\\xa6\\xe1\\x2f\\xea\\x6f\\x4a\\x05\\x6f\\x79\\xd6\\x7b\\x19\\xb0\\x5f\\x90\\xd6\\x84\\xbe\\x7d\\x45\\x72\\x5f\\x79\\x67\\xc6\\xa4\\x67\\xaf\\x43\\xb8\\x6a\\x6b\\x1b\\x9d\\x9e\\xed\\x3a\\x42\\x48\\x97\\x1c\\x76\\xa7\\xac\\x29\\xc2\\x92\\xdf\\xba\\x4d\\x75\\xc5\\xf7\\xba\\x70\\x9a\\x39\\x05\\x8e\\x96\\xad\\xf6\\xdb\\xd7\\x60\\xd3\\xce\\xf4\\x02\\x4b\\xf3\\xed\\xc4\\x41\\xef\\xbf\\x11\\x47\\xa2\\xc1\\x08\\xbd\\x6f\\x9e\\xb4\\x39\\xc1\\xc5\\xc4\\xd3\\xa6\\xea\\x4e\\xc3\\xd9\\x2c\\xef\\x38\\x13\\x61\\x88\\xbe\\xc9\\xe0\\xb6\\xc0\\x51\\x8d\\x8b\\x79\\xba\\x59\\xc5\\xdc\\xba\\x39\\x3a\\xed\\xfd\\xff\\xb0\\xb7\\x0d\\x77\\x9c\\x2b\\x97\\x65\\xce\\x44\\x52\\xe7\\xe3\\xb0\\x8c\\x44\\x02\\xb1\\xa6\\x08\\x32\\x08\\x40\\xfb\\xe9\\x6d\\x1e\\xb8\\x65\\x6e\\xb1\\xc2\\x0d\\x95\\x51\\xdd\\xf5\\x33\\xb9\\xf1\\x5e\\x4e\\xb5\\x78\\x37\\x56\\xc5\\x3d\\xdd\\x3b\\x14\\xd8\\x07\\xf8\\x38\\xac\\x96\\x80\\xf8\\x9f\\x1a\\xdf\\xb7\\x8d\\x68\\xcc\\xb0\\x67\\x31\\xa9\\x0b\\xea\\xc5\\xf0\\xd7\\x09\\xd5\\xb8\\x8c\\x75\\x43\\x7a\\x66\\x3c\\xb9\\x62\\xd3\\x7f\\x96\\xb8\\xe8\\x92\\x84\\x77\\xb5\\x61\\x12\\x28\\x01\\x5d\\x33\\x7f\\x04\\x9e\\x8b\\x62\\xe4\\xdf\\xf8\\xd0\\xbb\\x6c\\xda\\x24\\xa5\\xdf\\x90\\x83\\xe3\\x48\\xbe\\xf1\\x25\\x85\\xf5\\xf4\\xc4\\xd3\\xbb\\x3c\\x7e\\x78\\xd5\\x50\\x19\\x4a\\x45\\x25\\x1a\\x08\\x79\\xa1\\x62\\x4b\\xf9\\xdd\\x35\\xeb\\x65\\x5c\\x39\\x39\\xfe\\xa8\\x90\\x9f\\x6d\\xf3\\x95\\xbe\\xbd\\x02\\xb6\\x8a\\x17\\xa8\\x97\\xc9\\xaa\\xdd\\xd6\\xe2\\xe2\\x04\\x61\\xe3\\x03\\xf5\\x7c\\xde\\xb0\\x0a\\xe0\\xf2\\x3e\\x60\\xa9\\x4c\\x19\\xc7\\x71\\xd8\\xaa\\x60\\x53\\x3b\\x93\\xce\\xdc\\x1b\\x76\\xd2\\x29\\x0a\\x01\\xbf\\x43\\xb2\\x72\\x5f\\x12\\x5b\\xef\\xa5\\x75\\x15\\x4e\\x98\\x6c\\x9c\\x62\\x05\\xa1\\x59\\x6c\\xba\\xa2\\xd1\\x34\\x70\\xc2\\x34\\x22\\xf2\\xdf\\x7b\\xec\\xe4\\xe6\\xeb\\xd7\\x52\\xe9\\x38\\x9a\\xe6\\x08\\x57\\xb5\\x29\\x69\\xd2\\xdd\\xef\\xa9\\xc0\\x34\\xf1\\xbf\\x35\\xae\\x33\\x16\\x30\\x4e\\x94\\x9c\\x89\\x90\\x82\\x0e\\x26\\xe6\\xcf\\xfa\\xe4\\xb3\\x88\\xd1\\x50\\x5f\\x92\\x37\\x06\\x29\\x7f\\x8d\\xb5\\x56\\x53\\x79\\x19\\xeb\\xbe\\x30\\x86\\x02\\x3f\\x12\\xf4\\xde\\xd3\\xb1\\x1a\\xcf\\x2a\\x6d\\x97\\x3d\\xdd\\x8e\\xb2\\x7b\\x07\\xc5\\x80\\xbf\\x44\\x8c\\xaa\\x5a\\x2e\\xa1\\x16\\xc5\\xea\\xf3\\x6f\\x7a\\x6b\\x17\\xa8\\x5b\\x39\\x55\\xdc\\x8a\\x44\\xa6\\x20\\xd8\"},\n{{0x2d,0xdd,0x79,0xe7,0x60,0x64,0xc2,0xe6,0xb3,0x22,0xaf,0xb0,0xc5,0xc6,0x85,0xcd,0xbe,0xc6,0x28,0x21,0xcd,0xfc,0x0c,0xb1,0x4d,0xb7,0xd0,0x1b,0xa3,0xbf,0x21,0xa5,},{0xf5,0x5b,0x4a,0xb6,0x4a,0x25,0x82,0x21,0x2b,0x96,0xcc,0xac,0x06,0x40,0xe2,0x71,0x94,0x4a,0x34,0xa2,0x86,0xd0,0x35,0x83,0x30,0x45,0x81,0x0e,0x34,0x18,0x24,0xbb,},{0xa4,0xc3,0x96,0xe1,0x9d,0xd4,0x2e,0x03,0x91,0x84,0xcd,0x25,0x11,0x88,0xff,0xa2,0x45,0xf0,0x36,0x7c,0x69,0xc0,0x2d,0x12,0x47,0x4e,0x5c,0xa9,0xe5,0xc7,0x68,0xa7,0xee,0x3a,0x3d,0x47,0xeb,0x22,0xd1,0xac,0x9e,0x04,0xb7,0x04,0xa7,0x4f,0x41,0x69,0x47,0xf3,0xf4,0x9a,0x32,0x42,0x59,0x4e,0x7b,0x63,0x90,0xe8,0x2b,0x60,0xd5,0x05,},\"\\xa5\\x66\\x74\\xa1\\xe1\\xf0\\x97\\x95\\x25\\x1a\\xbe\\x54\\xab\\x43\\xc2\\x98\\x20\\x8f\\xef\\xc9\\xbb\\x91\\x76\\xfd\\xb2\\x3e\\x1e\\x9f\\x60\\xf0\\x32\\x64\\x79\\x15\\x56\\x7e\\xbd\\xcc\\x2b\\x86\\x9e\\xdb\\x70\\x55\\xf4\\xab\\xa6\\x7e\\xcf\\xe7\\xfa\\x19\\xed\\xa4\\x5c\\x06\\x04\\x7c\\x7a\\x51\\x84\\x8b\\xe9\\x97\\x32\\x51\\xf8\\x5f\\xf7\\x6f\\x1c\\x59\\xe3\\x65\\x43\\x82\\x85\\x8c\\x9b\\xe1\\x23\\xdb\\x8a\\x94\\x90\\xc6\\xc9\\xb3\\x09\\xb8\\x2d\\x1e\\x2c\\xa6\\xf4\\xa0\\x7d\\x00\\x12\\x02\\x83\\xc6\\xc2\\x95\\x64\\x49\\x95\\xa9\\x66\\x28\\x61\\x2b\\x8d\\x67\\x91\\x57\\x35\\x18\\xe2\\x55\\x6a\\x68\\x8a\\x09\\xf1\\x49\\xbc\\x84\\x6a\\x68\\xbd\\x0e\\xf7\\x92\\x79\\x03\\x57\\x10\\x03\\x1e\\xf0\\xa8\\xfe\\xd1\\xdd\\x0b\\xf0\\x26\\x12\\x5d\\xc6\\x64\\x8f\\x86\\xf6\\x43\\x09\\x94\\x2e\\x18\\xf2\\x3b\\x12\\xd1\\xdc\\x68\\xc6\\xf2\\x77\\x0c\\xa8\\xb5\\x48\\x5b\\x36\\x9b\\x0c\\x92\\x00\\x7a\\x94\\x61\\xc1\\x39\\xfc\\xbb\\x41\\x17\\x5f\\x31\\x6d\\x44\\x67\\x06\\x0a\\xb4\\x3d\\x12\\x22\\xf5\\x80\\x24\\x04\\xbf\\x63\\xc2\\xdf\\x7e\\x00\\x4b\\xdc\\x40\\x0c\\xa8\\x0f\\xe0\\xd2\\xcb\\x68\\xa2\\x10\\xfb\\xc3\\xfc\\x0b\\x90\\x32\\x09\\xd5\\x47\\x6e\\x7a\\x56\\xba\\xef\\xb8\\xfa\\xd7\\xf3\\x28\\xb7\\x2f\\x32\\x71\\x13\\xe1\\x39\\x41\\x4b\\xa6\\xf3\\x4e\\x99\\xc2\\xec\\xcd\\xe0\\x44\\xe7\\xa3\\xac\\x70\\xc5\\x80\\xcd\\x26\\xc7\\x45\\x01\\x92\\xca\\x4c\\x82\\x3c\\x7a\\xc5\\xea\\xe8\\x76\\xc0\\xd1\\xc8\\xc7\\x68\\xc1\\xcb\\x0b\\x7e\\xa4\\x1f\\xc9\\xb7\\xd2\\x94\\x37\\xbb\\xad\\xab\\x18\\xe0\\xf5\\xed\\x1d\\xef\\xe0\\xcf\\x6c\\x0e\\xba\\xa6\\xb6\\xd7\\x77\\xf4\\xda\\xd9\\xab\\xdd\\xbf\\xc0\\xfd\\x6a\\xb5\\xee\\xea\\x80\\x3c\\xfa\\x01\\xc0\\xbd\\x46\\xf6\\x5f\\xef\\xa4\\x69\\x01\\xab\\xbe\\x0d\\x89\\x10\\x4e\\x3b\\xc4\\xae\\xe1\\xf0\\x59\\x9c\\x69\\xb6\\x7b\\xa5\\x45\\xab\\x9b\\x54\\xf5\\xde\\xe3\\x40\\xac\\x69\\xd8\\x82\\x99\\xe8\\x68\\x22\\xac\\xdd\\xdd\\xce\\x60\\x11\\x22\\x01\\x2f\\x99\\x29\\x97\\x74\\xaa\\xf1\\x7c\\x96\\x4e\\xde\\xcb\\x95\\xe1\\x27\\x7d\\x46\\x2d\\xe6\\x4e\\x91\\x15\\xa6\\x1a\\xd9\\x8a\\xa3\\xd2\\x2e\\x3b\\xa6\\xf8\\xf1\\xcd\\x69\\xb6\\xb5\\x2b\\x83\\x38\\x28\\x23\\xf3\\x0e\\x96\\x6b\\xda\\xd1\\xff\\x5f\\xc1\\x98\\xae\\x32\\xe9\\xb6\\x80\\x55\\xd4\\x39\\x2b\\xc7\\xc3\\xdf\\x10\\x15\\xf1\\x28\\xae\\xe1\\xe4\\xfa\\x3d\\x49\\x99\\xe3\\x29\\xf2\\x2f\\x0f\\xf6\\xaa\\x77\\x8b\\xae\\x02\\x94\\xa1\\xdf\\x74\\x36\\xcb\\x16\\xa2\\xbf\\xcd\\x74\\xb4\\x63\\xab\\xe7\\xcb\\x4b\\xac\\x53\\x62\\xc8\\x9c\\x9d\\x1a\\x37\\x8a\\x2c\\xb8\\x85\\xcc\\x3b\\x26\\xab\\x4b\\xe8\\x81\\xef\\x1a\\xfc\\x14\\x43\\x0e\\x10\\xd2\\x65\\x39\\xca\\x35\\x8c\\x36\\x76\\x28\\x6a\\xd8\\x1c\\xe1\\xc9\\xe7\\x85\\x92\\xaf\\x66\\xf1\\x82\\xbb\\x1f\\x7f\\x86\\x2f\\xe7\\x55\\xbf\\xfb\\x5b\\xe5\\xc5\\xf2\\xb7\\x31\\xc1\\x32\\xe2\\x38\\x8a\\x76\\xa1\\xa7\\xb1\\xcd\\xdf\\x05\\xae\\xd2\\xac\\x9e\\xc4\\x08\\x47\\x52\\x71\\x94\\x2c\\xca\\xdd\\x32\\xe4\\x9d\\x87\\x91\\xed\\xf8\\xb8\\xde\\x11\\x75\\x51\\xce\\x26\\x4a\\x60\\xb8\\x41\\x05\\xea\\xe8\\x7e\\x66\\xf6\\xa4\\x01\\xd1\\x32\\x2b\\xb2\\x1a\\x98\\xe8\\xac\\xd2\\x77\\x49\\x32\\x54\\xe5\\x04\\x00\\x4f\\x72\\xc7\\x6e\\x79\\x03\\xd2\\xfa\\x38\\xfa\\xb7\\x17\\xe9\\x4c\\xe6\\x27\\x94\\x7c\\x4e\\xa3\\x26\\xbd\\x25\\x75\\xc3\\x73\\x10\\xf3\\xb4\\xd8\\x43\\xb9\\x0f\\xa7\\x7d\\x32\\xd9\\x95\\x21\\x94\\x15\\x0b\\x62\\xf8\\x50\\x18\\x7a\\x4f\\xdf\\x38\\x46\\x6d\\xfa\\x06\\x56\\xc0\\xa2\\xe0\\xb3\\xf0\\x74\\x92\\xac\\x8e\\x37\\xe5\\xd0\\xdf\\x95\\xcc\\x89\\xdf\\x30\\x85\\xa2\\x69\\x29\\x1d\\xc2\\x51\\x22\\x10\\xd3\\xfe\\x44\\x24\\x8d\\x7a\\xb9\\x96\\xbe\\x09\\x9a\\xf6\\x4c\\x22\\x75\\x66\\x66\\xf8\\xde\\xa5\\x6c\\x00\\xb9\\x06\\x77\\xd1\\x18\\x25\\x00\\xdd\\x27\\x4f\\xd0\\x76\\x92\\x53\\x82\\x6d\\x67\\x7a\\xb1\\x6a\\x55\\x7b\\x08\\xb3\\xc5\\x22\\x65\\x49\\x8d\\x85\\xc4\\xcb\\x2b\\x60\\x0e\\xe0\\x48\\x1b\\x7c\\x1c\\x47\\x6a\\x9d\\xaa\\x8b\\x88\\xc7\\x1f\\xc2\\x1b\\x6f\\x89\\xbf\\xdf\\xec\\xe5\\x8d\\xa9\\xe8\\xd5\\x65\\x65\\x2e\\x43\\x95\\xbd\\xf4\\xc8\\x11\\xb4\\xf4\\xf2\\x2d\\x2b\\x96\\x13\\x26\\x1f\\x88\\xc6\\x04\\xc2\\x97\\x4d\\x3e\\x97\\x7d\\x14\\x0d\\x04\\x6e\\x1b\\x66\\x25\\xb7\\x07\\x16\\x40\\xd3\\x52\\xcb\\x7e\\x7e\\x65\\xd4\\x6c\\x61\\x34\\x47\\xbe\\x8d\\xc5\\xa2\\x00\\xaa\\x9a\\xca\\xb4\\x6a\\xfc\\xcf\\xeb\\xb6\\xb1\\xc3\\x19\\x73\\x24\\x6c\\x34\\xfa\\xaf\\x8d\\x26\\xea\\x5e\\x83\\xbe\\x15\\x71\\x8f\\x8f\\xdb\\x0c\\xfc\\x44\\x4e\\x2e\\xb6\\x0f\\x36\\x59\\xb0\\x20\\x16\\x1c\\x22\\x8e\\x6b\\x92\\x40\\xb7\\xac\\x39\\x4c\\xab\\x81\\x2d\\xe1\\x05\\x15\\x76\\x6f\\x22\\x47\\x3e\\xcc\\xa5\\x35\\x59\\x4c\\xe5\\x28\\xa5\\x7c\\xf5\\xda\\xb2\\xeb\\x32\\xab\\x84\"},\n{{0x3a,0xbb,0xdb,0x0b,0xa1,0x1a,0xa1,0x06,0x3b,0xd2,0x6b,0x02,0xc1,0x16,0x03,0x78,0x62,0x28,0x5b,0xab,0xd2,0x15,0xd2,0x40,0xbc,0x9c,0x09,0x26,0xf4,0xec,0xea,0x81,},{0xb8,0xfc,0x59,0x43,0x8f,0x8c,0xe9,0xe3,0x78,0x5a,0x47,0x3b,0x22,0xc8,0x89,0x2c,0x51,0xea,0xc2,0x56,0x8c,0x68,0x1d,0xcc,0x77,0xb6,0xf0,0xe0,0x79,0x9c,0x4e,0x33,},{0x98,0x1f,0x20,0x05,0x5a,0x45,0x75,0x25,0xae,0xe5,0x61,0x62,0x64,0xe6,0xaf,0x42,0xe8,0xb3,0x87,0xcb,0x08,0xf8,0xb4,0xa7,0x3f,0x9b,0xe0,0xb3,0x66,0xf1,0x03,0x5b,0xb3,0x0a,0x1c,0x87,0x48,0x94,0xcb,0xec,0xe0,0xa8,0x46,0xd8,0x49,0xb7,0xec,0xc5,0x56,0x58,0x5d,0x0d,0x3d,0x39,0x56,0x45,0x80,0x7f,0xf2,0xa3,0xca,0x5a,0x59,0x0c,},\"\\xdc\\xcd\\x55\\xf9\\x22\\xcd\\x27\\x4f\\x69\\x75\\x00\\x0a\\xdc\\x8d\\x98\\x63\\x0c\\x6d\\x75\\x2c\\x12\\x02\\xa9\\xdd\\x12\\x10\\x48\\xb9\\x39\\x45\\xaf\\x2b\\x11\\x10\\x96\\x77\\x88\\xf9\\x9e\\xc0\\x28\\xe3\\xd3\\xb4\\xcf\\x82\\xfb\\x07\\x17\\x3e\\xa4\\x40\\x1e\\x3b\\xb4\\xb0\\x7b\\x7b\\x0b\\x24\\xb0\\x59\\xa7\\x66\\x33\\x95\\x32\\xd9\\xdf\\x3e\\x31\\xb7\\x2c\\x95\\x8c\\x11\\x9d\\x8d\\xfa\\x15\\xa5\\x07\\xaf\\x6c\\x5f\\x7e\\x78\\xfe\\x27\\x0f\\xa8\\x1b\\x9d\\xf0\\xf2\\xe4\\xaf\\x24\\xbd\\x99\\xfb\\xeb\\x14\\xe0\\x03\\x30\\x84\\xd7\\xfb\\xf8\\x4d\\xde\\xdf\\xd5\\xce\\x56\\x75\\x1d\\x15\\x90\\x84\\x75\\xdf\\x8a\\xf0\\x13\\xd0\\x91\\x17\\x3c\\x13\\x86\\xb9\\x13\\x94\\x26\\xcc\\x60\\x81\\xea\\x16\\x5b\\x8c\\xe4\\x81\\x94\\xb8\\xe1\\x8a\\x9b\\x91\\xa4\\x63\\x13\\x44\\xfe\\x29\\xc8\\xe7\\x28\\x18\\xb7\\x1f\\xa1\\x5c\\x92\\x92\\xd1\\x3f\\xdf\\x5f\\x9d\\x18\\xe2\\x9b\\xd0\\x29\\x1b\\x81\\x38\\xde\\x73\\x8f\\xd3\\xa3\\x6c\\x35\\x23\\x90\\x22\\x36\\x8b\\x45\\x6f\\x1f\\xac\\xba\\x90\\xa0\\xd8\\x0d\\x6e\\x31\\x1c\\x5f\\x6c\\x6f\\x04\\x67\\x7e\\x92\\x37\\x3a\\x5f\\xc4\\x73\\x88\\x94\\xdb\\xed\\x20\\x6c\\x30\\xda\\x34\\x1b\\x3b\\x19\\x6c\\x94\\x78\\x58\\xa6\\xd2\\xad\\xc6\\x8a\\xac\\x3f\\x20\\xcf\\xdb\\xe0\\x49\\x79\\x61\\xda\\xe3\\x34\\x70\\x26\\x6d\\x17\\xec\\x71\\x9a\\x59\\xf0\\x58\\x6f\\x82\\xf9\\x9f\\x1c\\x90\\xed\\x70\\x05\\xa2\\x07\\x21\\x9a\\x55\\xed\\xc7\\x60\\xf4\\xeb\\x8f\\x24\\x02\\x64\\x7f\\x6f\\x77\\x97\\x1f\\xf7\\xb6\\x34\\x35\\x7b\\x6b\\x29\\xbb\\xd7\\xea\\x05\\xe2\\xe2\\x58\\x54\\xe9\\x9c\\x62\\x0f\\x4b\\x8b\\x64\\x73\\x90\\x22\\xff\\x0b\\x33\\x8a\\xfe\\xf3\\x5f\\xb6\\xf4\\x1a\\x53\\x62\\x9a\\x51\\x8e\\xb9\\x3d\\x66\\x02\\x0f\\xb3\\x53\\xae\\xf8\\xdd\\x07\\x1e\\x09\\xc9\\x16\\xd4\\x70\\x4a\\xcd\\xf7\\x76\\xb3\\x8c\\xa9\\xc5\\x9f\\x21\\x1f\\xf8\\x8c\\x43\\x0a\\x57\\xe8\\xf1\\x71\\x39\\x23\\xb3\\xf3\\x0c\\xa8\\x69\\x70\\xa1\\x4a\\x52\\xdb\\x4b\\xcb\\xe6\\x0d\\xf4\\xbc\\x3c\\xfd\\xf2\\x54\\xbf\\x10\\xf8\\xaf\\xae\\x87\\xbd\\x61\\xb3\\x58\\xf4\\x3c\\xc2\\x96\\xc0\\x41\\x29\\x64\\xc4\\xe0\\x0f\\x71\\x21\\x33\\x97\\x46\\x85\\x17\\xcb\\x01\\x37\\x9c\\xb7\\x29\\xc7\\xb9\\xe3\\x5b\\xd5\\x0b\\xdd\\x98\\xc3\\xd3\\xb7\\x62\\x97\\xa1\\x38\\xb5\\x7c\\xeb\\x6c\\x77\\x74\\x2d\\xf0\\x88\\x1d\\x07\\x66\\x8c\\x08\\xa6\\x30\\xa4\\x4e\\x6e\\xd7\\xeb\\x20\\x6d\\x6a\\x56\\x44\\x07\\x10\\x43\\x8a\\x51\\x11\\x42\\x4b\\x61\\xaa\\xee\\xce\\x40\\xe9\\x00\\xf5\\xe3\\xc4\\x57\\xe9\\xd6\\xe3\\x1a\\x79\\xec\\x5b\\x4b\\x42\\xb6\\x8e\\x66\\xe1\\x99\\x30\\x92\\x87\\xca\\xd6\\x53\\x36\\xfc\\x7f\\xe4\\x3f\\x43\\xcd\\x8c\\x77\\x3d\\x3c\\x65\\x80\\xd7\\x21\\x7e\\x2c\\xab\\xec\\xd3\\xea\\xbc\\x48\\x5c\\x4a\\xcf\\x47\\x71\\x8c\\x39\\xb0\\x2c\\x78\\x58\\xff\\x34\\x7c\\xec\\x75\\x35\\xed\\xdc\\xd4\\xfc\\x81\\x5d\\xf8\\x14\\x56\\x9a\\x88\\xae\\x70\\xf2\\x73\\x3a\\x65\\x39\\xf2\\x08\\xc7\\x9c\\xf4\\xe7\\xc4\\xf9\\xea\\x24\\x1a\\x92\\xe9\\x51\\x51\\x71\\x36\\x14\\x18\\xa4\\xc2\\xe5\\x3c\\x07\\x6a\\xaa\\xbc\\x47\\xe4\\xc9\\x71\\xbd\\x04\\xb1\\x00\\xc2\\x62\\x82\\x30\\x88\\x57\\xe0\\x6e\\x7e\\x5f\\xbc\\x43\\x42\\x56\\x4f\\xb3\\xb1\\xea\\x4a\\x17\\xa9\\x25\\xe9\\x1e\\xe6\\x91\\x22\\x32\\x1d\\x39\\x2b\\x24\\x69\\x65\\xb8\\x6b\\x54\\xfd\\x5c\\x83\\xfa\\x5c\\x47\\x41\\x63\\xf9\\x8a\\x9f\\x44\\x7d\\x88\\xcb\\x59\\xfe\\x2c\\xdf\\x9f\\x54\\x12\\xfc\\xbe\\xb3\\xef\\xfa\\xc8\\x97\\x67\\x91\\xc6\\xa4\\x7b\\x66\\x9a\\x2f\\xc5\\x5a\\xbe\\x8e\\x09\\xe7\\x41\\x57\\xef\\xcd\\x1c\\xa7\\x8f\\xc1\\x0f\\xa6\\x87\\x01\\x0c\\x68\\x26\\xc6\\xe8\\x96\\xef\\x5c\\xd7\\x1d\\x0f\\xe4\\xd1\\xbd\\x07\\xc1\\x0d\\xac\\x3b\\x03\\x48\\x5e\\xdd\\x25\\x69\\xa7\\xee\\xcf\\xbc\\x4e\\x5d\\x2e\\xe2\\x37\\x98\\x59\\xe2\\x65\\x26\\x7b\\xed\\xaa\\xd6\\x9d\\x93\\xb7\\xc1\\xbd\\x18\\xf2\\x7e\\xa4\\x24\\x83\\xc7\\xe4\\x10\\x0e\\xe0\\x5b\\x28\\x30\\x39\\xbf\\xb9\\x89\\x1d\\x37\\xc4\\x67\\xed\\x83\\xb8\\x8c\\x79\\x4e\\xab\\x6b\\xab\\x9d\\xc6\\x77\\x89\\x26\\x50\\xe2\\xd8\\x96\\xfb\\xfe\\xc1\\xb1\\xcd\\xb7\\x21\\xbe\\x30\\xb0\\xb8\\xe5\\x35\\x87\\x09\\xe1\\x65\\xcb\\xe3\\xa1\\x82\\xc9\\x3b\\xc0\\xa0\\xce\\xa2\\xf8\\xcf\\x3a\\x62\\x57\\xad\\xf7\\x64\\x53\\x40\\x41\\x20\\x22\\x41\\xa5\\x27\\x9b\\x66\\x8e\\x40\\x12\\x5f\\xc0\\x94\\x58\\x5a\\x3c\\x58\\x8a\\xba\\x82\\xb6\\x7c\\xd9\\x1d\\x48\\x3e\\x54\\x30\\x04\\x28\\x42\\x68\\x63\\xa4\\x23\\x64\\x04\\x9d\\x7c\\x45\\xa1\\x69\\x38\\x5a\\xa8\\x9b\\xf3\\x77\\xf0\\xd3\\x2b\\x07\\x80\\x9b\\x58\\x71\\x39\\x5e\\xc0\\x53\\xa2\\x57\\xd9\\x3e\\x48\\xbb\\xf4\\x07\\xeb\\x60\\x91\\x40\\x1e\\x25\\x65\\x46\\xe3\\x1f\\x9f\\xcd\\x24\\xd2\\xc5\\xb3\\x33\\xcf\\x65\\x78\\x50\\x02\\xf0\\x8d\\x54\\x8d\\xb2\\x6a\\xd1\\xf3\"},\n{{0x8a,0x44,0xd6,0xaf,0xc6,0xc8,0xee,0xe1,0xbc,0x7d,0x5f,0x69,0xe4,0x95,0xb0,0xb1,0x8c,0xa7,0xae,0xe0,0x07,0xde,0xa7,0xcf,0x0d,0x17,0x14,0xd7,0x85,0xa9,0xf4,0xed,},{0xd4,0xf3,0x66,0xb3,0x37,0x7f,0xa3,0x9b,0x36,0xf9,0xae,0x14,0xda,0x40,0x4e,0x22,0x40,0x49,0x0d,0xbd,0x8d,0x79,0x6b,0x1a,0xb8,0x72,0xdf,0xcb,0x83,0xa5,0x95,0x40,},{0xe0,0x72,0x7e,0xb7,0x2e,0x84,0xd2,0xb8,0x2c,0xdb,0xd0,0xa6,0xbd,0x2f,0x49,0x49,0x63,0x16,0xaa,0xe8,0x35,0x1e,0x49,0x02,0xac,0xd5,0xe3,0xcc,0x57,0x34,0x6e,0x7e,0xba,0xfd,0xd9,0x2a,0x90,0xde,0xd7,0x6f,0xd0,0xc6,0x69,0x0d,0x68,0xbb,0x2f,0xed,0xd6,0x13,0xe4,0x4f,0xa2,0x22,0xbe,0x01,0x26,0xda,0x52,0x0a,0xcc,0x2c,0x41,0x05,},\"\\xde\\x80\\x32\\x69\\x66\\x53\\x6c\\xe9\\x49\\x96\\xaf\\x2d\\xe7\\xa0\\x76\\x05\\xcc\\x4f\\xcb\\x9e\\x75\\xee\\x0a\\x67\\xa1\\xe2\\x09\\x32\\x11\\x1d\\xe9\\xb3\\x56\\xd5\\xbe\\xea\\xe8\\x6c\\xc5\\xf5\\x64\\xc1\\x0d\\x66\\xe3\\xde\\x95\\xa5\\xb9\\x9e\\x84\\x49\\x28\\xea\\x8e\\x77\\x58\\x6c\\xf3\\xc1\\x0a\\xd3\\x63\\x3d\\xde\\xeb\\x1d\\x9d\\xcf\\x3f\\x94\\xb7\\x0b\\xf1\\xef\\x63\\xd2\\x38\\xdf\\x20\\x4d\\x70\\x5c\\x0b\\x17\\x4f\\x83\\x28\\x25\\x45\\xf5\\xe4\\x07\\x5f\\x8d\\x69\\xa4\\x81\\x79\\xc2\\x9e\\xab\\xf5\\xc1\\x74\\x2e\\xf3\\x9e\\x1a\\xd9\\x63\\xbe\\xbb\\xb6\\x6f\\xce\\x94\\x91\\xa9\\x84\\x65\\x12\\x15\\xc2\\xe7\\x50\\xe6\\xee\\x83\\x65\\x76\\x64\\x40\\xa8\\x44\\x19\\xe5\\x2d\\xcf\\x67\\x1f\\x1c\\x52\\xea\\xa2\\xb9\\x90\\x2b\\xcc\\xa4\\xb3\\x7c\\xff\\xdb\\xac\\x8e\\x7e\\x7e\\x6b\\x0a\\x5c\\x87\\x48\\xef\\xbf\\x45\\x2d\\xf6\\x16\\x3f\\x4c\\xa0\\x7b\\x61\\xf9\\xa0\\x5e\\xc2\\x0a\\x2b\\xd6\\x33\\x38\\x9e\\x67\\x0b\\xb5\\x45\\x4a\\xcd\\x6f\\x3a\\x06\\x33\\x5b\\x5d\\xa9\\xec\\x32\\x62\\x64\\xe9\\x62\\xc7\\xd9\\xd0\\x6c\\xe7\\xe9\\xff\\x04\\xa0\\xa5\\xbb\\xdf\\xaa\\x4c\\x41\\x08\\x66\\xa5\\x72\\x01\\x16\\x51\\x43\\x9f\\x2d\\xbc\\xe5\\xde\\xe6\\x67\\x92\\x4a\\xc4\\x93\\x4d\\x20\\x54\\x96\\xbd\\x1d\\x4d\\xf0\\x8b\\xd0\\xcb\\x3f\\xd2\\xde\\x73\\xa2\\xef\\x34\\x2f\\xf0\\x09\\x1e\\x10\\xe1\\x5b\\x3b\\x76\\x0a\\x57\\x5d\\xf9\\x3c\\xf1\\xc9\\x7c\\x01\\xc5\\xab\\x11\\xc0\\x94\\xbf\\x34\\x87\\x82\\x06\\x71\\x8f\\x6b\\x28\\x5a\\xa5\\xcc\\x51\\x27\\xbd\\x7f\\x98\\x8b\\x84\\xa9\\x04\\x95\\x30\\x6f\\xd9\\xe9\\x9d\\x89\\x55\\xe6\\x68\\xd1\\xa3\\xff\\x10\\xf6\\x5b\\x7c\\x47\\x9f\\xac\\x24\\x11\\x9a\\x3c\\x10\\x12\\x2d\\x4d\\x18\\xa8\\x05\\xb2\\x47\\xdf\\x16\\x8c\\x0a\\x51\\x00\\x16\\x9b\\x55\\x72\\xd1\\x70\\x12\\xd7\\x51\\xa4\\x2e\\x83\\x37\\x61\\x15\\xe1\\x15\\x61\\xc1\\x60\\xc1\\x5e\\xfa\\xd7\\x6d\\x21\\xf7\\xab\\xb4\\x30\\x36\\x64\\x75\\x23\\x86\\x31\\xf8\\x4c\\x88\\xf8\\x38\\xb0\\xac\\x40\\x4c\\x91\\x3d\\x2f\\xa1\\x24\\x50\\x23\\x84\\x85\\xc3\\x02\\xfc\\x20\\x1f\\x44\\x15\\x1c\\x19\\xbc\\xbd\\xc1\\x19\\x0c\\x12\\xd1\\x54\\x08\\x31\\xfb\\x19\\x58\\x1c\\xb9\\x31\\x72\\xb0\\xd2\\xff\\x5c\\x65\\xf3\\x1c\\xaf\\xf2\\x0f\\x81\\x38\\x81\\xf8\\x4e\\x5e\\xf9\\xd5\\xc1\\x65\\xe0\\x96\\xd2\\x54\\xca\\xdf\\x89\\x52\\x49\\xaa\\xb8\\xd4\\x49\\x6c\\x94\\x0a\\x40\\xf9\\x07\\xbd\\x40\\x93\\x5a\\x94\\xf5\\xe5\\x5b\\x6d\\xd0\\x51\\x15\\x41\\x00\\xfe\\x33\\x17\\x70\\xef\\xf2\\xba\\xd6\\x54\\x56\\x19\\xb8\\xa3\\x3e\\xf6\\x46\\x2a\\x50\\xc0\\xb2\\xc4\\xed\\x2f\\xba\\x4e\\x4e\\x38\\x3e\\xbf\\x29\\x32\\xe6\\x19\\x27\\x66\\xa4\\xaa\\xd1\\xd6\\xe2\\xb6\\x92\\xd9\\xf2\\xbd\\xc2\\x33\\x93\\xe8\\xaa\\xcf\\xba\\x32\\x3b\\x53\\x4f\\x84\\xed\\xf2\\xdc\\xed\\x7c\\x94\\xd5\\x16\\x87\\xda\\xa2\\x71\\x98\\xa9\\x14\\x4b\\x31\\x2b\\x71\\x6f\\xe1\\x70\\x14\\xa7\\xbe\\xd0\\xc1\\x4a\\x24\\x38\\x73\\x3d\\x55\\x5c\\x65\\x64\\xc8\\xc1\\xa3\\xd9\\x97\\xeb\\xae\\x7b\\x3d\\xe8\\x87\\x7a\\xf5\\x3c\\x1d\\x1a\\x50\\x29\\x15\\x8a\\x80\\xaa\\x0c\\x87\\x48\\x9f\\xef\\x27\\x0c\\xdf\\xfe\\x10\\xd3\\x4b\\x15\\xc1\\xa9\\x69\\x3a\\xe0\\x39\\x02\\x43\\xe3\\x14\\xcf\\xac\\x06\\xef\\x6e\\xef\\xeb\\xcc\\xf4\\x3d\\x42\\xea\\xc2\\x4c\\xe9\\x87\\x94\\x29\\xd2\\xfc\\x72\\x53\\xb3\\xed\\x17\\x58\\x25\\xbc\\x4d\\xa0\\x76\\x2b\\x49\\x33\\xa9\\x8a\\xfd\\xb9\\x4b\\x06\\xf4\\xfc\\xd2\\xad\\x36\\x11\\xaa\\x99\\x9d\\x7c\\x1c\\x8d\\x85\\x2d\\x01\\xdd\\x9e\\x52\\x64\\x84\\x55\\xa0\\x4e\\xb2\\x33\\x0a\\x76\\xfd\\x94\\x2c\\x53\\x1e\\x51\\x4b\\x5e\\xc0\\x72\\x8a\\x89\\xd3\\x4c\\xa5\\x90\\xea\\x99\\xc8\\x8f\\xaa\\x20\\xdf\\xb7\\xbb\\xf6\\x56\\x54\\xaa\\x6c\\x21\\x2b\\xeb\\x8a\\xd6\\xbf\\x7c\\x77\\x73\\x91\\xcd\\x49\\xc3\\x9c\\xf8\\xab\\x51\\xb9\\x5b\\x41\\x9e\\x3d\\xfc\\x8d\\x94\\xa9\\x3a\\x1e\\xf0\\x22\\x3c\\x6d\\xe9\\x0b\\xf9\\x62\\x18\\xd8\\x04\\x5b\\xd4\\x95\\x2a\\x0d\\x83\\x72\\xa5\\x57\\x8c\\x6a\\xaf\\xa7\\x4b\\xa6\\x62\\xe3\\x18\\x8e\\x6a\\x6e\\x56\\x7e\\x4d\\x2f\\xe8\\x22\\x7d\\x07\\x43\\x98\\x2a\\x41\\xeb\\xfa\\x0d\\x31\\x0f\\xe7\\x9f\\xed\\x27\\x04\\x17\\x90\\xef\\xd5\\xaf\\xac\\x22\\x43\\xe1\\xd1\\x50\\xb1\\x45\\x01\\x5d\\x9d\\xea\\xb0\\xed\\xed\\x63\\x94\\xac\\x36\\xfc\\x5f\\xb2\\x01\\xf5\\x20\\x4f\\xbd\\x42\\x2a\\x36\\x04\\x23\\x30\\x15\\xbb\\x0a\\x48\\xa9\\x20\\xe2\\xe5\\xe0\\xd4\\xde\\xed\\x67\\x20\\x25\\xf2\\x3c\\xfb\\xa9\\x38\\x89\\x59\\x7e\\x50\\x4c\\x88\\x87\\xad\\xd4\\x6c\\xfe\\xf4\\x02\\x4a\\xfb\\x8a\\x26\\xee\\xb7\\xdc\\xdd\\xb2\\x39\\x7b\\x44\\xa1\\x79\\x63\\x67\\x34\\x00\\x42\\x13\\x70\\x28\\xc3\\x30\\x76\\x26\\x81\\x6c\\x29\\x31\\xe6\\x1e\\xbb\\x6b\\x69\\xed\\xcb\\xcb\\x61\\x2c\\x9b\\x18\\x1a\\x28\\x53\\x01\\xce\\x46\\xf8\\x2f\"},\n{{0x8a,0x97,0x2d,0xd0,0xf1,0x19,0x0c,0x2b,0x9d,0x54,0x8f,0x4b,0xa5,0x82,0x64,0xbb,0x04,0x82,0x67,0x75,0x50,0x2a,0x8d,0x5c,0x2b,0x20,0x9e,0xe8,0x8d,0xce,0xa5,0xfb,},{0x6d,0x80,0x37,0x5f,0x3c,0xf1,0xaa,0xb2,0x83,0x55,0x1d,0xf4,0x45,0xd1,0x7e,0x7d,0x3b,0xaf,0x9b,0xcb,0xec,0xbb,0xb2,0x67,0x05,0x2e,0x02,0xfd,0xb6,0x91,0x44,0xd3,},{0xbd,0x45,0xb3,0xc0,0x45,0x85,0x0e,0xbe,0xf7,0xb8,0x0d,0xd1,0xde,0xab,0x48,0x03,0x7b,0x13,0x46,0xc7,0x1d,0xea,0xf1,0xe5,0x8f,0x2a,0x7b,0x16,0x26,0x74,0xf9,0x4d,0x1e,0xf3,0xd4,0x23,0x90,0x37,0x33,0x0b,0xd6,0x33,0x5f,0xe4,0xf0,0x14,0x92,0x50,0x90,0x1f,0x00,0xa8,0xe4,0x6b,0xe5,0xfa,0x0a,0xae,0xc6,0x9d,0xe0,0x6d,0x73,0x04,},\"\\x30\\xb2\\x89\\x48\\x93\\x9a\\xa2\\x63\\x43\\x7e\\x45\\xc5\\xc0\\x25\\x4f\\xb2\\x0e\\x61\\x7e\\xd0\\xf3\\xfa\\x7d\\xac\\xe5\\xa0\\xa8\\xe0\\xfe\\x3c\\x1f\\xc4\\xad\\xb2\\x80\\x9b\\x61\\xc5\\xe8\\xd9\\x2c\\xd2\\xf3\\xde\\x93\\xb1\\x73\\xbe\\x70\\x7b\\xad\\xa9\\x42\\x40\\xc6\\x26\\x2c\\x16\\x0e\\x8c\\x78\\x21\\x65\\xbe\\xef\\x99\\xd0\\xbe\\x8e\\xcd\\xad\\x63\\x16\\xdc\\xd7\\x34\\xbb\\xb9\\x0a\\x66\\xcb\\xd5\\xb1\\xcb\\x4f\\xd8\\xf2\\x22\\x6c\\xea\\x94\\x8e\\x4d\\xf7\\x6b\\xbe\\x25\\x1d\\x47\\x8f\\x5c\\x3f\\xe0\\xd6\\xde\\x4b\\xe5\\x4f\\x67\\xf5\\x02\\xb2\\x80\\x4f\\x62\\x8b\\x79\\xa5\\x50\\xfb\\x1a\\xc4\\x83\\xad\\x2b\\xa1\\x66\\x37\\xc4\\xbc\\x9d\\xa6\\x7f\\xb4\\xf9\\x86\\x59\\xc4\\xc4\\x39\\x4d\\x16\\xb6\\xd1\\x4b\\x3e\\x0b\\x0c\\x1e\\x62\\x5d\\x71\\x0d\\xcc\\x1c\\x11\\xdf\\x5d\\x34\\x14\\x7b\\x1e\\xc5\\xa4\\x17\\xb9\\xe2\\x1f\\x90\\x8c\\xfc\\x52\\x3d\\x43\\xe3\\xf1\\x81\\xc7\\x20\\x9c\\xc5\\x6b\\xdb\\x5a\\x21\\x62\\x86\\x95\\xed\\x32\\x0f\\x8d\\x4c\\x07\\xfd\\x6d\\x84\\xaa\\x03\\x42\\x6f\\x21\\x64\\x4a\\xae\\xfe\\xee\\xc3\\x11\\xc7\\x4e\\x94\\x99\\x93\\x60\\x47\\x35\\x0a\\x9b\\xf5\\xb7\\x03\\x96\\x2e\\x77\\xce\\x55\\x13\\x36\\x83\\x5f\\xc3\\x2c\\xcb\\xd2\\xc9\\x0a\\xe5\\x2e\\x24\\xd4\\x7d\\x8d\\xcb\\x98\\x7a\\xbd\\x12\\x1d\\x3f\\x74\\x6b\\x5d\\xe2\\x30\\xf2\\x64\\x69\\x60\\x3f\\xb0\\xc4\\xa8\\xf6\\xcd\\x79\\x73\\xd7\\xda\\x88\\x2e\\xd1\\xd6\\xe4\\xd9\\xc5\\xa4\\x6e\\xc2\\xc2\\x19\\x40\\xad\\x33\\x89\\xa1\\x86\\x01\\x4e\\xe9\\x72\\x78\\xe5\\x35\\x09\\x88\\xb1\\x5e\\xcd\\x9e\\xa7\\x45\\x6b\\x3c\\xb5\\x5e\\x4d\\x30\\x93\\xf1\\x3a\\x87\\x5b\\x50\\xd6\\x51\\x63\\x78\\xec\\xaf\\x58\\xd7\\x52\\xc6\\x37\\x4e\\xd1\\x56\\x38\\x40\\x93\\x11\\xfc\\xd3\\x79\\xd1\\x22\\xc8\\xd8\\xc5\\x9b\\x86\\xf4\\xe8\\xdc\\x46\\xad\\xb7\\x30\\xa9\\x33\\x84\\x6e\\x0b\\xd2\\x48\\xd3\\x60\\x82\\x52\\xd9\\x70\\xb5\\x04\\xc8\\x13\\xc6\\xde\\xa9\\xfc\\x88\\xa3\\xde\\x64\\x19\\x56\\xdc\\xa2\\x91\\x20\\x4d\\x39\\x0b\\x6b\\x39\\x98\\x1f\\x8c\\x0a\\x6b\\xcf\\xc3\\x1c\\xa0\\x74\\x44\\x20\\x66\\x2a\\x9b\\x35\\xeb\\x3f\\xc2\\x11\\xf8\\x10\\xa3\\xe8\\x06\\x25\\x00\\xb1\\xe4\\x9b\\xdf\\x85\\x76\\x65\\xff\\x32\\xa9\\xba\\x76\\x19\\x4b\\xbb\\x77\\xfb\\x9c\\x15\\x41\\x29\\x64\\x24\\x4b\\x98\\x65\\xf7\\x3d\\xed\\x9f\\x25\\xb4\\x9b\\x42\\x5a\\xa2\\x53\\xd8\\x07\\xd9\\x81\\x82\\x92\\x76\\x3a\\x51\\x3e\\xc8\\x07\\x47\\x34\\x4f\\xba\\x0a\\xcf\\xe5\\x93\\xcc\\x26\\xb1\\x33\\x0b\\xb9\\xad\\xe6\\x6c\\x4e\\x88\\xcf\\x1b\\xae\\xd6\\xd6\\xe7\\xb7\\x50\\xe6\\xc7\\x23\\x9d\\x7b\\xcb\\xfa\\x3f\\xbe\\x45\\x40\\x5a\\x63\\xb9\\x6d\\x50\\x34\\xcc\\x0c\\x07\\xff\\xc3\\xb5\\x08\\x58\\x08\\x1d\\x19\\x55\\xe2\\xd2\\xfe\\x5b\\xe5\\xfd\\xa7\\xa8\\x99\\x69\\x43\\x76\\x8b\\x05\\x51\\x70\\xb7\\xfd\\x52\\xf0\\xa3\\x20\\x97\\xfe\\x1b\\x7a\\x94\\xf1\\xbf\\x87\\x9a\\x0c\\xba\\xbe\\x10\\xac\\x9a\\x7c\\xc1\\xf9\\xf5\\x50\\x68\\xc4\\x8e\\x3c\\xcc\\x06\\x51\\x36\\x43\\x10\\x18\\xd3\\x8d\\x20\\x10\\x9d\\xc9\\x5d\\x99\\xcc\\x2b\\xbe\\x7c\\x62\\x7a\\xb1\\xa8\\xaa\\x5f\\x43\\x16\\x13\\xb7\\x90\\xc2\\xe6\\x52\\x6c\\xf0\\x4f\\xdc\\x9e\\x55\\xf5\\x1c\\x05\\x5f\\x3c\\x20\\x45\\xa6\\x75\\xe3\\xa1\\xe5\\x4b\\xa4\\x09\\xf7\\xae\\xfa\\x7e\\x4a\\xa0\\x7a\\x2b\\xbd\\x5e\\x4a\\xb1\\x63\\x21\\xa9\\xf0\\x99\\x69\\x43\\x91\\xfd\\xa6\\x8a\\x74\\x58\\x1e\\x2f\\x1f\\x11\\xdd\\x9a\\x6d\\x52\\x4b\\x1b\\x83\\x26\\x0d\\xb5\\x7b\\x72\\xef\\x29\\xc2\\x8c\\x8d\\xb5\\xc3\\x7f\\xd1\\x85\\xb7\\xc2\\xd8\\x45\\x50\\x90\\x65\\x3a\\xf3\\x32\\xdb\\xc8\\x2b\\xfb\\x0d\\xb5\\xdc\\xca\\xbf\\xb6\\xb2\\x8c\\xaa\\x35\\x05\\x25\\xcb\\x54\\xcc\\x84\\xe5\\x53\\xe1\\xcf\\x39\\x54\\xb6\\x12\\x39\\x3e\\x79\\x93\\xff\\x7e\\x8b\\xf5\\xec\\xe3\\xf1\\x45\\x09\\x4d\\xd7\\xa2\\x7c\\xb4\\x7f\\x22\\x74\\x76\\xf2\\x89\\x23\\x52\\x51\\xf7\\x72\\xb3\\xba\\x77\\x6b\\xb7\\x73\\xaf\\x0c\\xc5\\xf7\\x86\\xa3\\xfb\\x9e\\x93\\x1a\\x53\\x0c\\xfb\\xd8\\x91\\xcb\\x5a\\x5d\\xfe\\x25\\x16\\x9e\\xf9\\x33\\xcc\\x82\\xc9\\x08\\x0f\\x32\\x39\\x61\\xa1\\x20\\x15\\x8e\\x4b\\xbd\\x71\\x13\\x4e\\xf1\\xf9\\x01\\x08\\xb8\\x15\\xc2\\x89\\xd4\\xe9\\xa9\\x58\\x9e\\xc6\\x4c\\x05\\xfb\\xb4\\x2a\\x21\\xb2\\x3d\\x16\\xe2\\xa6\\x46\\x78\\xae\\xcf\\xab\\x65\\xcd\\x9a\\x80\\x6c\\x59\\x81\\x03\\xd4\\x1f\\x70\\x09\\x77\\x63\\x17\\x83\\x1f\\xed\\xdd\\x1c\\x90\\x02\\xd4\\xa9\\x22\\x04\\xf9\\x7b\\xa9\\x49\\x0c\\x61\\x46\\x98\\x03\\x07\\x21\\x02\\x52\\x4b\\x9d\\xf5\\x19\\x00\\x5f\\x98\\xaf\\x54\\xd6\\x0c\\xa5\\xba\\x60\\xb5\\x5b\\x09\\x6a\\x4a\\xc2\\xb1\\x6e\\xb9\\xcc\\x81\\x97\\x3c\\x31\\x35\\xd3\\xfb\\x68\\x73\\xdd\\x96\\x53\\x80\\x0a\\x22\\xbb\\x5d\\x0d\\x61\\x17\\xca\\x5d\\x91\\x65\\x53\\xbe\\x39\\xc9\\xa3\\xb5\\x11\\xeb\\x3d\\xb7\\x30\"},\n{{0x12,0x38,0x0c,0x45,0xa7,0x9a,0xde,0x0f,0x48,0x3c,0x88,0x1a,0xaa,0x37,0x30,0x43,0x8b,0x08,0x35,0x90,0xf4,0x04,0xdc,0x9e,0x60,0x1f,0x76,0x15,0xf3,0x75,0xa6,0x28,},{0xd6,0x6f,0xc5,0x9a,0xe9,0x17,0xf7,0x6d,0x24,0xce,0x8a,0xb8,0xee,0x03,0xfb,0xcb,0x71,0x5d,0x5e,0xea,0x4b,0x08,0x39,0x2b,0x59,0x1e,0x64,0x85,0x91,0xc7,0x3c,0x89,},{0x02,0xb2,0x51,0x74,0xa3,0xdd,0x52,0x19,0xed,0x48,0xb2,0xc9,0x4c,0xa2,0x12,0xb6,0x3a,0x6a,0x3a,0x25,0x97,0x70,0x3c,0x07,0xb7,0xf0,0xc9,0x65,0xc3,0xc6,0xac,0x2e,0xb4,0x50,0xef,0xe3,0x87,0x16,0xa2,0xa2,0x8b,0x3f,0x89,0x84,0x6b,0x06,0xeb,0xdc,0xa4,0xbd,0x09,0xaa,0x58,0x1f,0x24,0xe8,0x4d,0x80,0xfc,0x10,0xac,0x1a,0x00,0x0a,},\"\\x68\\x45\\x23\\xc2\\xe7\\xfa\\x8b\\x4b\\xd7\\x54\\x8c\\x4b\\xac\\xaa\\x86\\x78\\xa3\\x30\\xdb\\xbb\\x96\\x06\\x32\\x94\\x01\\x66\\xb2\\xcc\\x9a\\xfc\\x15\\x35\\xc8\\x0c\\x11\\x2c\\x8d\\xc4\\xad\\xa7\\x62\\x92\\x33\\xfe\\x90\\x90\\x55\\x23\\x7d\\x51\\x3e\\x29\\x2a\\xf1\\x5a\\xd7\\x69\\x2f\\x11\\x5a\\xa0\\x92\\xda\\x65\\x75\\x32\\xf5\\x18\\x99\\xc3\\xf7\\xf5\\xd9\\xd4\\x07\\xed\\x5c\\x16\\x3e\\xb3\\x95\\x04\\x80\\xa4\\x12\\x2a\\x09\\x92\\x98\\x1f\\x07\\x7b\\xc8\\x67\\xf9\\x06\\x07\\x54\\x07\\xba\\x98\\x49\\xc4\\xea\\x04\\x73\\xce\\x54\\x0a\\x79\\x67\\x44\\xef\\xa3\\x86\\x03\\x78\\xe1\\xb8\\x93\\x43\\xe5\\x83\\xd0\\x80\\x7e\\x5a\\x67\\xc4\\xd5\\xbd\\x7c\\xe6\\x41\\x29\\xfe\\x90\\x2b\\x8c\\xfa\\xbd\\x2c\\x21\\xfa\\x3d\\x2a\\x10\\xe9\\xbf\\x9e\\xa5\\xe5\\x47\\x3a\\xe2\\x50\\xc9\\x16\\x05\\x09\\x97\\x26\\x78\\xf9\\xa7\\x40\\xe6\\xca\\xdb\\x3b\\x52\\xf5\\x02\\xfa\\x61\\x6c\\xff\\xae\\x1d\\xef\\x89\\x3d\\x54\\xe4\\x1e\\x54\\xd3\\x26\\x46\\x4c\\x9f\\x43\\x5c\\x63\\x50\\x5f\\xb1\\x5e\\x3e\\xea\\xf5\\x02\\x1c\\x65\\xdc\\xd0\\x10\\xf8\\x40\\xaa\\xb3\\x17\\xc8\\x60\\x5d\\xfb\\x1a\\x0c\\x8a\\x3d\\x55\\x49\\x86\\x1b\\x69\\xaf\\x2c\\x93\\xd8\\x6c\\x98\\x1d\\xf3\\xa5\\x1c\\x5b\\xf5\\x78\\x5c\\x2f\\x85\\x26\\x10\\xe4\\x4f\\xa4\\xff\\x1c\\x71\\x61\\x15\\x2e\\x56\\x18\\x38\\x47\\x44\\xfe\\x83\\xba\\xbf\\x0b\\xcb\\x75\\x61\\x78\\x9a\\x02\\x31\\x25\\xf6\\x24\\x2a\\x18\\x3c\\xac\\x95\\x49\\xc9\\x32\\x73\\x3a\\x86\\x8a\\xa1\\x82\\x65\\x6e\\x2b\\xa0\\xa8\\xc0\\xbe\\x10\\x69\\x96\\xa8\\x5c\\xeb\\xf1\\xbd\\xad\\x12\\x3b\\x98\\x2b\\x4e\\x05\\x55\\x10\\x87\\x94\\x82\\x02\\x1d\\xae\\xa9\\xd8\\xf2\\x6c\\x58\\x8e\\x6c\\xd1\\x01\\x26\\xcb\\x31\\x96\\x88\\x03\\x56\\xbe\\xe8\\xf2\\x98\\xbc\\xa3\\x06\\xec\\x56\\x99\\xc7\\x57\\x6b\\x76\\x50\\x87\\xc2\\x53\\xa6\\x02\\x14\\x01\\x0c\\x6e\\xd7\\x0d\\x87\\x1c\\xfc\\x87\\x38\\x01\\x8a\\x0e\\xdb\\x57\\xf1\\x06\\xb4\\x21\\x8d\\x85\\x5e\\xab\\x2c\\x91\\xf3\\x9f\\x85\\x8b\\x3f\\x25\\x90\\x56\\x31\\xa0\\xee\\xe2\\x98\\x56\\xfd\\x34\\xf7\\xb8\\xc9\\xba\\x51\\xc1\\xc4\\xc6\\xa7\\x35\\xd6\\xc7\\xa1\\x3d\\x22\\x0d\\x7a\\x56\\x6c\\x3f\\x50\\x6c\\x72\\xbc\\x74\\x17\\xab\\x37\\xf0\\xd6\\xd7\\x96\\xff\\xc7\\x1d\\xf9\\xdc\\x7c\\x6e\\x13\\x7d\\xa5\\x6b\\x7a\\x3e\\x10\\xcf\\x0b\\x1a\\xbb\\x3f\\xfb\\x70\\xbc\\x66\\x29\\x3b\\x5d\\x75\\xb4\\x05\\xed\\x8b\\xec\\x0d\\x6f\\xcd\\x06\\x92\\x5c\\x38\\x11\\x68\\xac\\x18\\x8d\\x0b\\x8a\\x1a\\xf0\\x83\\x9f\\x5b\\xde\\x84\\x3b\\x69\\x91\\xe5\\xa5\\xd6\\xcd\\x66\\xfe\\x6b\\x0f\\xde\\x86\\x7c\\x08\\x6e\\xd4\\x38\\x76\\x91\\x9a\\x1b\\x72\\x33\\xd8\\xd7\\xe1\\xd2\\x74\\x2f\\x61\\xc7\\x7d\\x8e\\x59\\x91\\x68\\x9c\\x83\\x28\\x67\\x66\\x55\\xb7\\x6a\\x37\\x50\\x56\\x0e\\x75\\xd1\\xc7\\xe8\\x5e\\x3c\\x00\\x85\\x05\\x93\\x31\\x09\\x4b\\xba\\x57\\x10\\x03\\x2c\\xf6\\x79\\xa5\\x25\\xc7\\x8b\\x31\\x70\\x0e\\x6d\\x91\\xf7\\x52\\x94\\xc4\\x22\\x48\\x92\\x97\\xe1\\x73\\x59\\x43\\xe4\\x17\\xfc\\xd3\\x55\\x80\\x58\\x2f\\xdd\\x02\\x39\\xb5\\x11\\x46\\x53\\x0c\\xc0\\x9d\\x83\\xb2\\x8f\\x0a\\x1d\\x64\\x22\\x20\\xdf\\xb9\\x9b\\xad\\x62\\xf3\\x95\\x41\\x03\\x50\\x81\\xd6\\x5d\\x77\\x8d\\xdf\\x32\\x39\\xba\\x0e\\x6f\\xa9\\x91\\x4b\\x17\\xb3\\x97\\xa5\\x34\\xcb\\x8f\\xd3\\xb4\\xff\\x42\\xa8\\xd8\\xc8\\xee\\x66\\x15\\x3f\\xbb\\x1f\\xf0\\xfa\\x54\\xf7\\xbd\\x03\\x27\\x85\\x16\\xe6\\x34\\x1a\\xf8\\x0f\\xcd\\x1f\\xce\\xe7\\x0c\\x35\\x9d\\x20\\x53\\x68\\xac\\x49\\x0d\\x75\\xa3\\x54\\x51\\x2d\\xa4\\x6b\\xa7\\x63\\x4c\\x15\\xb2\\x84\\xb2\\x44\\x77\\x80\\x8f\\x17\\x63\\x33\\x60\\xa4\\xb4\\x9f\\xb3\\xbc\\xaa\\x84\\x18\\x41\\xcf\\x92\\x41\\x7e\\xb2\\x4c\\xe4\\x82\\xd5\\xa2\\x4b\\xfd\\x2d\\xac\\x37\\x22\\x31\\xda\\x53\\x9a\\x05\\x42\\x00\\x02\\xff\\x7a\\x20\\xc4\\x76\\x09\\x7d\\xa0\\x6f\\x59\\xf0\\x33\\x14\\xe6\\x05\\x9f\\xad\\x88\\xc5\\x0c\\x3b\\xaa\\xc0\\x3c\\xef\\xa7\\xcd\\x82\\x11\\xd2\\x46\\x1b\\x16\\x60\\xea\\x6b\\xcf\\x47\\x68\\x38\\xc9\\x1a\\x10\\x07\\x4e\\xb4\\xb4\\x0e\\x6e\\x97\\x4a\\x94\\x5a\\x67\\xf6\\xee\\x69\\x04\\x23\\x1e\\xf0\\x41\\x88\\xf1\\xea\\xd5\\xba\\xf3\\x56\\x94\\xef\\xe3\\x01\\xed\\xc7\\xe8\\x66\\xda\\x23\\xb5\\xa6\\xc5\\x8f\\x01\\xb2\\xa5\\x2c\\xf3\\xab\\x80\\x5e\\xdc\\x5c\\x13\\x68\\x62\\x6b\\x95\\xb9\\x4e\\xb4\\x64\\x5b\\x69\\x3e\\xc8\\x80\\xf2\\xb8\\x11\\x7a\\x69\\x3a\\xfb\\xdc\\xd2\\x48\\x24\\x31\\x89\\x0f\\x41\\x0b\\xc5\\x80\\x53\\x0f\\xef\\x37\\x58\\x79\\xc2\\xe4\\x60\\x49\\xca\\x89\\x1a\\x2c\\x3e\\xcd\\x60\\x43\\xae\\x80\\xd8\\xaf\\x34\\x66\\x34\\x67\\x4c\\x6d\\xfe\\x90\\x59\\x97\\xde\\x5d\\x05\\xd6\\x20\\x09\\xee\\xed\\x27\\x75\\x02\\xfb\\x5a\\x5a\\x31\\x55\\xee\\xee\\xb6\\x73\\x48\\xb6\\x0d\\x89\\xa3\\x4a\\x78\\x12\\x63\\x9f\\x54\\x1f\\xfe\"},\n{{0xd1,0xb3,0x43,0x0d,0x4e,0x63,0xaa,0xbf,0xa9,0xef,0x96,0xbc,0xba,0xf1,0xfa,0x6a,0x9e,0xb5,0x21,0x9d,0xd4,0x4d,0xf3,0xb1,0xa6,0x15,0x63,0xdf,0xfe,0x1c,0xcb,0x28,},{0xc2,0x8a,0x05,0x19,0x52,0x45,0x29,0x0e,0xcd,0x38,0x53,0x55,0x85,0xce,0x51,0xf3,0xc2,0x35,0xc5,0xd6,0x50,0xc8,0xc5,0x7c,0x2f,0x79,0xbb,0x0a,0xc0,0xe8,0x08,0x34,},{0x4c,0xb6,0xff,0x5d,0xd7,0x06,0xb1,0xae,0x81,0x6c,0xdb,0xaf,0x9e,0x9e,0x1e,0xdc,0x80,0xa6,0x62,0x84,0xf9,0x46,0x52,0xd5,0x0e,0xc1,0x4e,0x28,0x3b,0x2a,0xdc,0x59,0x2f,0xd0,0x84,0x33,0x71,0x44,0xff,0xa7,0x12,0xdc,0x34,0xce,0x8e,0x61,0x06,0x68,0xa6,0x5e,0x96,0x9f,0x05,0xce,0xb5,0x47,0x86,0x30,0x4d,0x0d,0x58,0xd3,0x1a,0x08,},\"\\x07\\x6c\\x0c\\x87\\x62\\xe4\\xbc\\x00\\x3c\\x36\\x0a\\x12\\xa1\\x95\\x98\\x05\\x05\\x51\\xd1\\x6b\\x4b\\x8d\\xa0\\xfb\\x9c\\x4a\\xfc\\xc8\\x1a\\xdb\\xe6\\x19\\x95\\xf2\\x5c\\xbc\\x28\\xdc\\xa4\\x20\\xbf\\xa9\\x46\\x10\\x54\\xd3\\xee\\x00\\xad\\x78\\x18\\x3e\\x7f\\x26\\xdf\\x68\\x98\\xaf\\x9a\\x4d\\x22\\x5f\\xca\\xb6\\x7c\\x04\\x2e\\x9a\\x13\\x52\\x5d\\x1f\\x75\\xff\\x0e\\x3d\\x8d\\xa8\\x08\\x96\\xb7\\x28\\xf3\\xe2\\xdb\\x65\\x94\\x4a\\xe0\\x71\\x7d\\x77\\x59\\x90\\xb5\\x9e\\x5b\\x70\\x43\\x4b\\xd4\\xb3\\xee\\x45\\x2f\\x10\\xac\\x06\\x10\\x57\\x0b\\x38\\x22\\x08\\x32\\x96\\x8f\\x54\\x4d\\x3e\\x4d\\x11\\x9b\\x1d\\x4b\\x50\\x15\\xc6\\xcd\\xf4\\xcf\\x22\\x0b\\x56\\xb5\\xc0\\xcc\\xd8\\xe3\\x98\\xd5\\xe4\\xa5\\x8d\\xa3\\xb0\\xe2\\xb2\\x70\\xa5\\xd3\\x9b\\x82\\xab\\xb7\\xf9\\xd2\\x7a\\x41\\x90\\x18\\x55\\x0b\\x62\\x00\\xae\\x51\\xc8\\x48\\x82\\xf0\\x86\\xae\\x7e\\xa5\\x35\\x16\\x71\\xb6\\xdd\\x96\\x09\\x23\\xad\\x6b\\xef\\xc1\\x34\\x09\\x87\\x9a\\x8d\\xf6\\x19\\xbd\\xf6\\xc8\\x8a\\x6f\\xe1\\xec\\xc0\\xf0\\xf3\\xaa\\x21\\x9f\\xb6\\x19\\x02\\xbe\\x48\\xa5\\x3d\\xf2\\xbc\\x66\\xc5\\x6f\\x1c\\x1d\\x17\\xf7\\xe6\\x16\\x7d\\x25\\x51\\x65\\xf1\\x74\\xba\\xa9\\xca\\xf5\\x3c\\x73\\xcb\\xbb\\x7c\\xc2\\xc7\\xc0\\x87\\xf4\\x3a\\xbe\\x2a\\xed\\x5a\\x21\\xfe\\x42\\x90\\xb8\\xd6\\x79\\x60\\xa8\\xa9\\xcb\\xc2\\xa5\\x7a\\xbe\\x22\\x65\\x4d\\xc1\\x84\\xcf\\xf9\\x16\\x8b\\xb6\\x97\\x27\\x03\\x75\\xfe\\x88\\xd5\\xc4\\x9c\\xf9\\x5b\\x06\\xcf\\x9d\\x0d\\xac\\x81\\xfb\\xd9\\xc0\\xd7\\xb8\\x2d\\x05\\xed\\x2c\\x3f\\xd4\\x9c\\xcc\\x29\\x40\\x44\\x41\\x71\\x25\\x45\\xf9\\xa9\\x91\\xe4\\xf0\\xdd\\xb6\\x21\\x90\\x83\\x82\\x96\\xf9\\x67\\x29\\x9a\\x38\\x60\\x72\\x26\\xd8\\xa6\\x81\\xf0\\xa8\\xf3\\xc4\\x38\\x4f\\xd1\\x8b\\x30\\x25\\x7c\\x46\\x3c\\x0a\\xbd\\x0f\\x4f\\x6f\\x12\\x25\\xa5\\x1b\\x76\\x2d\\x6d\\x0a\\xc7\\xd5\\x9c\\xd2\\xef\\xd6\\x98\\xb8\\xd1\\x3e\\x23\\xd7\\x04\\x09\\xf6\\xb0\\x7d\\x69\\x5c\\x16\\x71\\xcd\\x6f\\x59\\x44\\x3b\\x1d\\xb0\\xab\\x35\\xb9\\xdc\\x06\\x40\\xe4\\xc6\\xd1\\xac\\x50\\x47\\x5d\\x28\\xef\\x94\\xf8\\x17\\x90\\xe2\\xe5\\xb2\\x54\\x55\\x14\\xb2\\xa4\\x9c\\x5c\\x21\\x53\\x45\\x9b\\xe5\\x40\\x89\\x0f\\x53\\xbc\\x18\\xe4\\xa1\\x6d\\xcb\\x5d\\xcf\\x50\\xf3\\x7a\\x95\\xc6\\x06\\xfd\\xf4\\x85\\x98\\xe5\\x2a\\xf3\\x17\\x9a\\x20\\x48\\x61\\x5d\\x93\\xd9\\x7e\\x05\\x99\\xb7\\x08\\x8c\\x11\\x74\\xbb\\x9f\\x15\\xe3\\x70\\x18\\xf9\\x9a\\xcb\\xce\\x5b\\x13\\x02\\xf8\\xd8\\xce\\x2a\\xb8\\x54\\x37\\xfe\\xeb\\x0c\\xaa\\x77\\x84\\xdc\\x83\\xc9\\xe7\\xc3\\x6f\\xe0\\x59\\x90\\x6b\\x03\\x0a\\x86\\xa3\\xde\\xd0\\xab\\x9d\\x8b\\x73\\x52\\x9d\\x47\\x5e\\x66\\x1a\\x08\\x08\\xd6\\xd3\\xf0\\x90\\x7f\\x85\\x28\\x87\\x3f\\x08\\xd5\\x74\\x8b\\xe1\\xd6\\x97\\x12\\xe8\\x52\\x62\\xd7\\x7b\\xdf\\x13\\xbf\\xd1\\x8a\\x5c\\xde\\x6f\\x71\\x46\\x26\\x73\\xab\\x29\\xb1\\x61\\x73\\x15\\xa9\\xa6\\xe9\\x36\\xa8\\xe8\\x1a\\x8e\\x43\\xbd\\x0f\\x66\\x44\\xa5\\xc6\\x9e\\xaa\\xac\\x89\\xbd\\xaa\\x99\\xcc\\xa8\\x03\\x83\\x37\\x05\\xe5\\xaf\\xa6\\x9b\\x3b\\xd1\\xd0\\x25\\x2b\\x85\\x46\\x50\\xf2\\x19\\x97\\x91\\xe6\\xac\\xa7\\xc7\\x5a\\x86\\x12\\x83\\x21\\x62\\x33\\xa2\\x63\\x3a\\x6a\\xef\\xf9\\xd3\\x01\\xee\\x5c\\xb4\\xdd\\x72\\xc0\\x8a\\x45\\xcd\\xae\\x8f\\x54\\x58\\xc0\\x95\\xb2\\x2e\\x75\\x9c\\x43\\xb4\\x9b\\x98\\xe9\\xf4\\xcb\\x33\\xd5\\xde\\xa8\\x79\\x44\\x9e\\xae\\x73\\xcb\\x87\\x4c\\x73\\x59\\x43\\x25\\xeb\\xf6\\x8c\\x1e\\xd4\\x06\\x4b\\x6f\\x61\\xab\\x2f\\x01\\x4a\\x2f\\x19\\xf3\\x2e\\x12\\xb3\\x3c\\x5e\\xaa\\x8a\\x29\\x20\\x4d\\x5e\\xba\\x58\\xdc\\x07\\x50\\x72\\xfe\\x39\\x9b\\xe7\\xd1\\xab\\x18\\x08\\x20\\x8f\\xb4\\x08\\x12\\x3b\\xdc\\x0b\\x4a\\xb3\\x13\\x0f\\x9f\\x70\\x6d\\xc3\\xeb\\x19\\x4b\\x60\\x5e\\x73\\xa3\\x2f\\x12\\x5a\\xe4\\x91\\x28\\x5c\\xe6\\x03\\x9f\\xb6\\x23\\xc3\\x8b\\x81\\xd5\\xab\\xa0\\xf5\\x59\\x9f\\x6c\\x86\\xe8\\x72\\x48\\x6b\\x4e\\x96\\x49\\xda\\xff\\xe3\\xa3\\xd0\\x6c\\xb0\\x73\\xdd\\x3b\\xc6\\xf4\\xe1\\x0a\\x18\\x70\\x0e\\x45\\x72\\x2d\\x78\\xa6\\xb0\\x97\\x2d\\xc9\\x4d\\x5c\\x7a\\x7b\\x66\\x41\\x75\\x7b\\x79\\x60\\x75\\x71\\x9d\\x7b\\x8e\\xc3\\x6a\\x1e\\x79\\x6f\\xb5\\xf8\\xfe\\x6f\\x1b\\x79\\xa0\\x85\\x9c\\xb4\\xd6\\x7c\\xec\\x05\\xed\\x91\\x4c\\xfa\\x32\\xc1\\xdd\\xfe\\x21\\x8e\\xf9\\x63\\x43\\x6c\\x3a\\x11\\x48\\xac\\x2c\\xf9\\x09\\xdf\\x73\\x59\\x89\\x06\\x57\\x46\\x3a\\x4e\\xa2\\x5f\\xed\\x59\\x61\\x8a\\x06\\x81\\xa1\\x21\\x7e\\x22\\xd6\\x4e\\xf9\\xd9\\xb4\\x55\\x9d\\x0a\\x0f\\x6b\\x3c\\xe8\\xd8\\x47\\x93\\x0b\\x23\\x23\\x01\\xca\\xf4\\x4c\\xdf\\x7a\\x3f\\x18\\xa2\\xac\\x13\\x0b\\x92\\xcf\\xd9\\xc0\\x33\\x60\\x55\\x7b\\x5f\\x7c\\x47\\x75\\x46\\x2a\\x10\\x71\\xf7\\x03\\x44\\xc7\\x18\\x37\\x4b\"},\n{{0x03,0x3e,0x00,0x3d,0x7a,0xab,0x7b,0xc7,0xfc,0x8a,0xc2,0x04,0xc7,0x33,0x79,0x9a,0xe5,0x53,0xc3,0xfe,0xc5,0x3f,0x10,0xdb,0xf7,0x95,0xb5,0xf4,0xb8,0x7f,0x1c,0x95,},{0x68,0x2f,0x46,0xf5,0xc0,0x56,0xdd,0x45,0xba,0x0b,0x5a,0x78,0x20,0x31,0xf9,0x59,0x6a,0x73,0xaa,0x29,0x2c,0xa2,0x32,0x6b,0xed,0xa7,0x4a,0x52,0xfc,0x32,0xb7,0x16,},{0xed,0xb4,0xe0,0x20,0xd6,0x76,0xfa,0xc6,0xa8,0x45,0x53,0x48,0x80,0xbf,0x61,0x36,0x37,0x4a,0x8b,0x7f,0x2c,0x53,0x85,0xbb,0x9e,0xe2,0x25,0x38,0x1f,0x49,0x4e,0xfb,0x74,0xa5,0x5b,0x41,0x3a,0xe0,0xea,0x70,0xad,0xd6,0x1b,0xfd,0xfb,0x87,0xfb,0x42,0xd5,0xbc,0x0c,0x53,0x59,0xdd,0xdd,0x57,0x3d,0x53,0x8a,0xe9,0x3a,0x6b,0x36,0x09,},\"\\x59\\x6a\\xa2\\xc4\\x0b\\x33\\x18\\x87\\x89\\x38\\xeb\\xc1\\x38\\xdb\\x27\\x4b\\xb3\\x8a\\x52\\x01\\xeb\\x7c\\xaf\\x87\\x5e\\x6c\\x64\\x57\\x91\\xda\\xe0\\x12\\xbd\\xef\\xd4\\x85\\xe6\\xbd\\x9d\\x84\\x99\\xc4\\x2a\\x2a\\xe8\\x6c\\xf3\\x2b\\x18\\x00\\x2e\\x76\\xbb\\x58\\x2c\\xca\\x0d\\xec\\x48\\x15\\xde\\xd8\\xa1\\x21\\x1f\\x8f\\xc8\\x85\\x7f\\xce\\x1d\\x57\\xf6\\x15\\x1d\\x88\\x78\\x7b\\x97\\x8f\\xab\\x56\\xbf\\x92\\x6b\\x15\\x33\\xe1\\x94\\x99\\xe8\\xbb\\x99\\x15\\x8c\\xdd\\x6e\\x98\\x0f\\x6b\\xa5\\x43\\xae\\x83\\x1f\\x9d\\xd1\\x34\\xb0\\xfe\\x6d\\x5c\\x24\\x88\\x7d\\xc7\\xa8\\xd4\\x78\\x1d\\xd9\\xb7\\xfc\\x5d\\xc9\\x46\\x4b\\x04\\x5c\\xbf\\x9d\\x1e\\xf5\\x03\\x6b\\x5b\\xf2\\x8b\\x54\\x9a\\xc7\\xaa\\x8f\\xaf\\xb9\\x1a\\xdc\\x9f\\xec\\xa7\\xa1\\x45\\x54\\xd1\\x10\\xe3\\x10\\xc7\\x49\\xe4\\x85\\x33\\xf3\\x59\\xc7\\x0f\\x05\\xfb\\x7a\\xed\\xef\\x13\\x66\\x36\\xb8\\xef\\x72\\x23\\x88\\x65\\x39\\x86\\x4e\\xe5\\x2d\\x34\\x11\\x8b\\x4b\\x8b\\x74\\xe0\\x8f\\xe6\\xb6\\x58\\x96\\xe4\\xb1\\x9b\\x6d\\x7c\\x3f\\x25\\x28\\x26\\x55\\x85\\x48\\x17\\x10\\xd2\\xd7\\x49\\x48\\xeb\\x4b\\x17\\x08\\xa5\\x0f\\xa7\\x40\\x21\\xbd\\xa4\\xb3\\x61\\xbc\\x68\\xd2\\xa5\\xd2\\x02\\x10\\x9f\\x8d\\x28\\xd8\\xaa\\x67\\xd7\\x8c\\x11\\x36\\xcd\\x2e\\x90\\x3c\\x8d\\xfa\\x17\\x5a\\xf7\\xbd\\x96\\x3b\\x73\\xda\\xe4\\x95\\x87\\x3c\\xcd\\xae\\x62\\xbf\\xef\\x88\\x56\\x36\\xdd\\x83\\x55\\x0f\\xf9\\xc0\\x5c\\x37\\xba\\x33\\x89\\xd1\\x54\\x36\\x85\\xd8\\x94\\x83\\xb0\\xc1\\x04\\xe7\\xef\\xbb\\x77\\x02\\xc5\\xa0\\x39\\x8a\\xc7\\x20\\x48\\x4c\\x50\\x93\\x68\\x35\\xee\\x9d\\xf2\\x53\\xf0\\xef\\x8c\\xbe\\xf3\\xe0\\x7d\\xe9\\x69\\x51\\x1c\\xcb\\xf8\\x75\\x57\\x49\\x3a\\x0b\\x97\\x2e\\xf0\\xe8\\xe6\\x29\\xcf\\x38\\x22\\xdb\\x21\\x28\\x6e\\xd7\\x27\\x66\\x1b\\xd3\\x17\\x86\\xfc\\xa1\\x42\\x11\\x06\\xda\\xcd\\xee\\x1c\\xaa\\xf4\\x94\\x54\\xe8\\x54\\x79\\x4f\\x70\\x4d\\x22\\xa9\\x5a\\x4c\\x8e\\x6b\\x1c\\x2f\\xee\\xa5\\x7e\\x56\\x23\\x8c\\x20\\x96\\xf1\\xcc\\x57\\x86\\x47\\xfe\\xa5\\x44\\xd6\\x76\\x44\\x82\\xbd\\xf5\\x14\\x88\\x79\\xa2\\x5f\\x94\\x3d\\xb1\\x6f\\x29\\x02\\x1b\\x9e\\xcf\\xe3\\xe0\\x90\\xb4\\x25\\xc8\\x1c\\x70\\x09\\x84\\x2e\\x1c\\x7a\\x02\\xd9\\x1c\\xa6\\x0c\\x12\\x01\\xc3\\xbd\\xae\\x9c\\x53\\x73\\xaf\\x03\\xf2\\xf4\\xdb\\xef\\x40\\xde\\x8d\\x9b\\x21\\xfe\\xd6\\x8d\\xee\\x51\\x0d\\xe0\\x42\\x72\\x34\\xca\\xa1\\xc2\\x0a\\x3a\\xe5\\x49\\x95\\x48\\x34\\xc9\\x33\\x73\\xd9\\x13\\xb8\\x75\\x0f\\x23\\xa0\\x37\\x80\\xd7\\xa9\\x45\\x4e\\xd6\\xfe\\x51\\xfd\\x2d\\x27\\x6b\\x9d\\x4a\\xa3\\x2d\\xe0\\x5e\\x03\\x81\\x6e\\x64\\xe9\\x46\\x6f\\x4f\\x0e\\x22\\x46\\x51\\x42\\x8d\\x34\\x2c\\xbc\\xc6\\x97\\x17\\x0a\\x47\\xef\\x99\\x6b\\xda\\xcb\\xce\\x91\\x11\\x7c\\xa1\\xf8\\x45\\x5b\\x25\\xb2\\xb0\\x84\\x43\\xe9\\x91\\x4e\\x3d\\x90\\xc4\\x89\\xee\\xaa\\x77\\x31\\xdd\\xea\\x21\\x23\\xd5\\x5d\\x67\\xb1\\x66\\x83\\xfb\\x7c\\x82\\x36\\xaa\\xa5\\xa1\\xb0\\xfc\\xaf\\x8d\\x17\\x00\\x11\\xdb\\xe9\\xaa\\x28\\x57\\xbe\\x61\\x2c\\xbb\\x85\\xef\\x69\\xe5\\x68\\x31\\xb4\\xda\\xcf\\xbc\\x7a\\x59\\xb4\\x65\\xa6\\x6d\\xc7\\x41\\x2d\\xdb\\x3d\\x6a\\xf4\\xeb\\xfd\\x70\\x58\\x64\\xe7\\xd4\\xfb\\x99\\xa6\\xcc\\xb4\\x8b\\x11\\x83\\x68\\xfe\\xab\\x02\\xa3\\x40\\xc4\\x32\\x76\\x8d\\xe0\\xe0\\x67\\x87\\x1e\\x9e\\xa8\\x08\\xd6\\xd9\\x93\\x81\\x58\\x29\\xe7\\x1f\\x6c\\x04\\x2b\\x66\\x49\\x95\\x09\\x8f\\xee\\x94\\xd5\\x43\\xdf\\x15\\xe5\\xb1\\x69\\x57\\x03\\x1b\\xd2\\x38\\xbc\\xad\\xbb\\xdc\\xc5\\x76\\xaf\\xfb\\x64\\x03\\x03\\xd6\\x9c\\x5b\\x25\\x0b\\x3a\\x53\\x9a\\xfd\\x12\\x7f\\x7e\\xe2\\x60\\x9e\\x52\\xe5\\x15\\x4f\\xbd\\xff\\x3e\\x45\\xf9\\xc4\\x40\\x66\\x65\\x6d\\x56\\x1e\\x0f\\x64\\xdf\\xf2\\x80\\x5d\\xf8\\x8e\\x30\\xa3\\x80\\x53\\x08\\x22\\x41\\x3a\\x7a\\xb7\\x6a\\x1b\\x9a\\x86\\x53\\x78\\xd2\\x47\\x63\\x06\\x9a\\x81\\x40\\x02\\xa9\\xa9\\xd0\\x37\\x95\\xca\\x8d\\x2b\\x5b\\xd1\\x09\\x03\\x93\\xe9\\xe4\\xb1\\xff\\x7d\\x7f\\x0e\\xb8\\x4e\\x71\\x2a\\x01\\x8f\\x68\\xc9\\xe3\\x84\\xf0\\xa0\\xae\\xf3\\x96\\x78\\x79\\x28\\x4f\\x40\\x9e\\x30\\xd2\\x36\\x50\\x86\\xe6\\x69\\x52\\x27\\x8c\\xa9\\xb6\\xf9\\x0e\\x8f\\x69\\xa4\\x8d\\x9b\\x28\\xbb\\x4c\\x4e\\xd6\\x32\\xab\\xca\\x3a\\xf4\\x14\\x4d\\xa7\\x42\\x2b\\xf5\\x19\\x92\\xf7\\x34\\x73\\x14\\x53\\xc7\\xa3\\x3e\\x15\\xe5\\x9f\\x53\\x08\\x12\\x9d\\x6a\\x77\\x4a\\x94\\x58\\x6f\\x72\\x33\\x11\\x17\\x91\\x76\\xc0\\x94\\x8f\\xff\\x4e\\x30\\xc1\\xb9\\x59\\x81\\x2c\\xac\\x97\\x7c\\xc7\\x43\\x47\\xb0\\x07\\x94\\x0f\\x2f\\xb9\\x62\\xa9\\x0d\\x66\\x06\\x6a\\x6d\\xe8\\x80\\x19\\x84\\xde\\xe4\\xa5\\x32\\xd4\\xb0\\xac\\xd6\\xdc\\xaf\\x06\\x72\\x7b\\xab\\x70\\xb3\\x86\\x62\\x32\\x23\\x4c\\x91\\x00\\xbf\\xdc\\x66\\x9f\\x77\\xca\\x49\"},\n{{0xee,0x55,0xfc,0xf7,0x0a,0x27,0x5c,0x72,0x6b,0xd4,0x85,0x66,0x83,0xb3,0x47,0xde,0xcf,0xd4,0x22,0xf1,0x82,0x6c,0x07,0xa9,0x32,0xcb,0x85,0xbe,0x9f,0xa4,0xef,0x3c,},{0xdf,0xcf,0xfb,0x5e,0x15,0x53,0x78,0x9d,0x56,0xa9,0xf3,0x91,0x4b,0xce,0x50,0x0d,0x07,0xc5,0xac,0x31,0x1f,0x92,0x78,0x54,0xb2,0xcf,0x1e,0x58,0x33,0xc0,0x32,0x37,},{0x9d,0x8c,0xb2,0xea,0xf3,0xff,0x3e,0x0c,0x2b,0xc6,0x72,0xe1,0xd2,0x55,0xc5,0xb8,0xe8,0x07,0x31,0xbf,0xf6,0xf6,0xab,0xa5,0x17,0xe1,0x33,0x54,0xe8,0x51,0x08,0x0f,0x4a,0x8b,0xb8,0x12,0x1b,0x26,0x24,0x24,0x4c,0x9e,0xe9,0x5c,0x8a,0x09,0x2f,0x10,0x37,0x03,0xfb,0xe6,0x6f,0x9c,0xba,0x10,0x0d,0x2e,0x91,0xed,0x77,0x4a,0xc9,0x07,},\"\\xb8\\xc8\\x45\\xcf\\x7c\\x54\\x85\\xf0\\x62\\x2d\\x1d\\xdc\\x17\\xf7\\xa0\\xf6\\xf0\\xfd\\x70\\x74\\xfe\\x19\\x4b\\x0e\\x0c\\xd4\\x26\\x50\\xcf\\xc8\\x17\\xf5\\x7f\\x09\\x5f\\x8c\\xdf\\xad\\x1e\\xbe\\x0d\\xfb\\xc1\\xbd\\x76\\x17\\xab\\x4f\\x20\\x4e\\x9d\\x55\\xd8\\x1a\\x7c\\x8a\\x43\\x39\\x40\\xec\\x6f\\x17\\xc8\\xa8\\xe3\\xd5\\x6c\\x1a\\xfb\\x0a\\xf3\\x74\\xbd\\x32\\xd5\\x4e\\xf7\\x13\\x2d\\x26\\xb8\\x9c\\x47\\x0c\\x2a\\xb5\\xbe\\x16\\xfa\\xbb\\x4c\\x75\\x19\\x3d\\x6d\\xa5\\x9b\\xa2\\xfd\\x15\\x7e\\x9e\\xa4\\xe0\\xc5\\xc0\\x8a\\x52\\x02\\xf5\\xed\\xc6\\xa6\\x17\\x01\\xf0\\x8b\\xb3\\x44\\xca\\x64\\x55\\xd7\\x5d\\x14\\x5a\\xdb\\x24\\x4c\\x53\\x4c\\x8c\\xfc\\x62\\x3f\\x4d\\x4b\\x67\\x67\\x59\\x4b\\x39\\xa7\\x69\\x0b\\xee\\xec\\x4d\\xf9\\x74\\x6a\\x57\\xff\\xee\\x05\\x14\\x54\\xc4\\x27\\x8e\\xa4\\x3c\\x81\\x0f\\xf1\\x3c\\xd7\\x69\\x61\\x5f\\x9d\\x05\\xd4\\xfe\\x4a\\x51\\x58\\x3e\\x80\\xc0\\x15\\xdc\\xfe\\xd9\\xaf\\x05\\xf9\\x3d\\x05\\x4d\\x34\\xff\\xd9\\x39\\xbd\\xd8\\xf0\\x51\\x8f\\xa3\\x03\\x0a\\x96\\x4d\\xc9\\xd8\\x0d\\xf0\\x0f\\x16\\x35\\x82\\x40\\x72\\xcd\\xf2\\x9b\\xc8\\x02\\x59\\x20\\x9d\\x50\\xf5\\x6f\\xca\\x9f\\xbd\\x6a\\xe1\\x51\\x4a\\x67\\x19\\x89\\xce\\xa4\\xf6\\x84\\x6b\\xc1\\x91\\x79\\x09\\x7c\\xca\\x40\\xc6\\x24\\xd7\\xed\\xbf\\x91\\xfb\\x5b\\x25\\x39\\xeb\\xbd\\x50\\x2d\\x36\\x46\\x71\\x14\\x30\\xba\\xe4\\x23\\xfd\\x11\\x58\\x48\\x09\\x33\\x18\\xb7\\xd0\\x87\\xef\\x1e\\x3b\\x89\\x4b\\xc3\\xb9\\xea\\x27\\xaf\\x85\\x3f\\xca\\x85\\x95\\xd3\\x6f\\xb7\\x29\\x99\\x69\\x16\\x2f\\x2e\\xd6\\xa2\\xb5\\x50\\x75\\xb2\\xc6\\x30\\x80\\x28\\x57\\x17\\x6d\\xec\\x4c\\xb5\\xac\\xf2\\xb1\\x3a\\x35\\xa9\\x94\\x9b\\x91\\x2b\\xb5\\x7d\\x81\\xeb\\x0c\\x8a\\x8a\\xdf\\x3c\\xf6\\x4c\\xb5\\x71\\xbf\\x5f\\x3d\\x71\\xf9\\x87\\xd6\\x4d\\x74\\xe9\\x19\\xa0\\x03\\x36\\xe5\\x7d\\x35\\xee\\x4e\\xec\\xfc\\x65\\x70\\x00\\xdd\\x5b\\x12\\x99\\x5e\\xe1\\xb1\\x16\\x59\\x1c\\xe5\\x8e\\x56\\xde\\x25\\xb2\\x9c\\x94\\x82\\x9d\\x1d\\x68\\x52\\x1b\\x95\\x58\\xe4\\x72\\x5e\\xc7\\x70\\x39\\x06\\x9c\\x0c\\xd1\\x7b\\x2a\\x00\\x33\\x59\\xe9\\xe1\\xe1\\x12\\xc7\\x59\\x01\\x76\\xce\\xbc\\xe7\\xf0\\x01\\xf1\\xd1\\x36\\xe8\\x18\\xf4\\x81\\x8c\\xfd\\x94\\x74\\x5a\\xfa\\xab\\x56\\xf1\\xa4\\x06\\xf9\\x7d\\xd9\\xe6\\x1b\\x73\\x52\\x66\\xd6\\x82\\xad\\x7d\\xf2\\x6d\\xd7\\x0c\\xde\\x0b\\x57\\xfe\\xa7\\xdb\\x2d\\xf8\\x32\\xfa\\x88\\xa3\\x5f\\x53\\x97\\x94\\x88\\x4d\\xdc\\x41\\x21\\x84\\x03\\x01\\x6c\\xb6\\xd5\\x22\\x1f\\x3f\\xeb\\x5d\\x3a\\xee\\x4a\\x98\\x40\\xa9\\x13\\x07\\x2d\\x29\\xf8\\xd1\\xa9\\x36\\x7b\\xb0\\xbb\\xf5\\x45\\xf7\\xda\\xe7\\xc0\\x0a\\x0d\\x0c\\x03\\x42\\x23\\x1a\\xe4\\x62\\xbb\\x74\\x2e\\x14\\x98\\xee\\x58\\x4a\\xe6\\xc8\\x3f\\x2f\\x1f\\x2d\\x04\\x52\\xbe\\xad\\x98\\x22\\x68\\xcd\\x3c\\xfd\\xe7\\x8f\\xf4\\x22\\xe2\\x26\\xbf\\x7b\\x2a\\xf1\\x13\\x77\\x57\\x79\\x7f\\xb0\\x2e\\x52\\x75\\xc3\\x48\\x09\\xd5\\x4c\\xa9\\xee\\x2a\\x65\\x27\\x5e\\x6e\\x5c\\xff\\xdd\\x20\\xad\\x1f\\xa1\\xee\\x0b\\xd8\\xb2\\x1e\\x04\\xce\\x82\\x9e\\x02\\xcd\\xb6\\x3c\\x48\\xbf\\xcd\\xd8\\x6d\\x3a\\x08\\xc5\\x97\\x89\\xc9\\xd7\\x8e\\x36\\x18\\x1d\\xef\\xeb\\x72\\x27\\x10\\x72\\x75\\xed\\x6b\\x5c\\xcb\\x12\\x7c\\xd7\\x2b\\x37\\x4e\\x17\\xf5\\xee\\x0b\\x5e\\x47\\xb4\\xb3\\xe1\\x4a\\x8e\\xc6\\xd8\\x6b\\xb7\\x50\\x71\\x87\\xf2\\x8d\\xb3\\x2b\\x3f\\x3f\\xa1\\xca\\x13\\x44\\x6f\\xe5\\x25\\x3e\\xe7\\x83\\x64\\x5e\\x79\\x42\\x72\\x79\\x9a\\x86\\x3b\\x4f\\xca\\x99\\xe4\\x43\\xcb\\xaa\\x05\\xde\\x3c\\x50\\xed\\xf3\\xd5\\xcd\\x7c\\x10\\x52\\x9c\\x6c\\x09\\xa0\\xc1\\x45\\x34\\x06\\xac\\x7e\\xca\\xfa\\x9b\\x3a\\x1f\\x36\\x9d\\x68\\xf3\\xc6\\x18\\xf5\\x8e\\xfc\\x35\\x9d\\xf2\\xf3\\xfc\\xd2\\x47\\x8b\\x55\\xa4\\x1a\\x11\\xf2\\x48\\x7e\\x7f\\x70\\xec\\x29\\x3b\\x3e\\xcc\\xc7\\x00\\xef\\x44\\x4a\\x33\\xd1\\xea\\xe9\\x84\\x9c\\x5b\\x76\\xd2\\x9a\\xfd\\x5a\\x23\\x86\\x1a\\xef\\x4f\\x2a\\x7b\\xa3\\xf6\\x66\\x30\\x1f\\xde\\xb5\\xd3\\xd8\\xf0\\xdc\\x9e\\xe2\\xe0\\x14\\xb2\\x4c\\x74\\x65\\xde\\xe3\\xc0\\x96\\x4e\\xdd\\x49\\xed\\x49\\xed\\xab\\xb5\\xca\\x7a\\xfb\\x99\\x57\\x4d\\x00\\x1e\\x58\\x12\\xa0\\x85\\x23\\x1f\\x24\\x1b\\x6b\\x08\\xc7\\x3e\\x80\\xfb\\x44\\xbb\\x2a\\xdf\\x55\\x4f\\x14\\xfd\\x6d\\xce\\x94\\xa6\\xf6\\x36\\x23\\xd9\\xc1\\xde\\xb4\\x1a\\xd1\\x01\\x65\\x1a\\x6b\\x67\\xae\\x52\\x34\\xda\\xae\\x81\\x97\\x9f\\xbd\\x82\\x33\\x89\\x64\\x9a\\x3b\\x0a\\x06\\xc6\\x8b\\x80\\x46\\x8a\\x99\\x1d\\x30\\x07\\x74\\x87\\x51\\xfa\\x69\\x28\\x1d\\xb1\\xb9\\x4d\\x6c\\x16\\x0a\\x1c\\xab\\x50\\x94\\x3c\\xdb\\xb8\\xde\\xa5\\x75\\x09\\x06\\xb3\\xc6\\x59\\x5b\\xb5\\x80\\xde\\xdb\\xfa\\xe5\\x74\\x64\\xcc\\x7a\\x65\\x1d\\x4c\\x51\\xdb\\xb5\\xfa\\x98\\x05\\x97\\xd1\\x76\\x69\"},\n{{0x49,0xc2,0x98,0xa2,0xdb,0x3d,0x25,0x89,0xc9,0xfe,0x16,0xa4,0xe5,0x71,0xe5,0xaa,0x23,0xcb,0xaa,0x77,0x7b,0x86,0x47,0x02,0x90,0xa3,0xed,0xa7,0xa5,0xd3,0xe9,0x6b,},{0xda,0xc5,0x23,0xd6,0x37,0x4c,0x8f,0xf1,0x5f,0xc4,0xdd,0xc7,0x13,0x71,0x5a,0xc3,0x5c,0xf5,0x54,0x7f,0xc1,0xb1,0xb2,0x64,0x6b,0x63,0xfb,0x41,0xa7,0xf2,0x16,0x21,},{0x2a,0x43,0x9c,0x73,0xc9,0x81,0x17,0xfb,0x29,0x52,0xe2,0xb1,0x61,0xf7,0xf3,0xb9,0x9e,0x7d,0x39,0xbc,0x69,0x7f,0x79,0x40,0x75,0xdb,0x7b,0x63,0x4d,0x29,0xf1,0xff,0x57,0x24,0xf6,0x77,0xf8,0x31,0x2a,0xd5,0x15,0xb0,0x97,0xcc,0xa9,0xdf,0xc3,0x0e,0x79,0xee,0x8a,0x7c,0x9d,0xd7,0x28,0xbd,0xd4,0x5d,0xf8,0x59,0xc7,0xbd,0xe3,0x0a,},\"\\x35\\x82\\xee\\xb0\\xd3\\x71\\xdf\\x38\\x5d\\xe8\\x8b\\xaa\\xd3\\x80\\xcb\\x0c\\xdb\\x60\\xea\\xb2\\xba\\xeb\\xb3\\xc7\\x98\\x37\\x75\\x3d\\x08\\xe1\\xcb\\x78\\xc0\\xbd\\x76\\xdd\\x11\\x04\\x45\\x49\\x56\\xd5\\x71\\xce\\xb7\\xe6\\xb5\\x71\\xa5\\x23\\x68\\x35\\xd7\\x84\\xb5\\x0f\\xf6\\x60\\x57\\xb1\\x35\\x95\\xe7\\xd0\\xc8\\xf2\\x5d\\x08\\xae\\x8b\\x54\\xb6\\x12\\x3b\\xa0\\x81\\x51\\xac\\x7d\\xb0\\xc5\\x6a\\x98\\x0f\\x7f\\x0b\\xb3\\x9a\\x54\\xb4\\x37\\xf5\\x48\\x51\\x97\\x99\\x86\\xab\\x13\\x67\\x83\\x5e\\x5c\\x4f\\x3a\\x3b\\x3d\\x76\\x0d\\x38\\x27\\xe7\\x6c\\x56\\x8a\\xe7\\xae\\xbb\\xb6\\x12\\xe7\\x75\\xbd\\xde\\xcc\\xd3\\x34\\xac\\x6b\\xcd\\x32\\x53\\xab\\xc2\\x9d\\x4b\\x7c\\x3f\\x10\\x36\\x26\\x66\\xf6\\xae\\x75\\x08\\x03\\x70\\xa3\\x6c\\xba\\x55\\xdb\\x3a\\x91\\xcb\\x57\\x89\\xe4\\xd6\\xf9\\xef\\xea\\x4d\\xf1\\xdd\\x77\\x30\\xa5\\xe2\\x79\\x60\\xd5\\x3b\\x51\\x21\\x94\\x8c\\xce\\x5a\\xf6\\x53\\xff\\xf1\\xd5\\xb4\\xe5\\xb0\\xa8\\x8c\\x71\\x8c\\x49\\xb3\\x1c\\x79\\x3d\\x88\\xc1\\xcc\\x45\\xab\\x8d\\xa2\\x9d\\x05\\xe9\\x06\\xcd\\x05\\x94\\xb5\\xf6\\x63\\x8c\\x8e\\xc3\\xf1\\x76\\x0b\\xa4\\x23\\xb5\\xab\\x1d\\x08\\xa5\\x87\\x70\\xaf\\xb0\\xf1\\x39\\xab\\xd3\\x49\\xc1\\xbf\\x16\\x0d\\x89\\x02\\x23\\x9c\\xe2\\x4f\\x19\\xb4\\xe1\\xbe\\x09\\x5f\\x7e\\xd1\\x65\\xf3\\x93\\x1e\\x3c\\xbc\\xc3\\x07\\xe9\\xfc\\x5c\\x65\\x80\\x31\\x22\\x8e\\x55\\xcb\\xbe\\xec\\x0d\\x0b\\xcf\\x8f\\x69\\x51\\x54\\xa9\\xee\\xd1\\xbe\\xf3\\x52\\x28\\x78\\x9b\\xfc\\x0d\\x23\\x8b\\x83\\x72\\xd3\\x18\\x32\\x8c\\x13\\x39\\xfe\\xa0\\x88\\x14\\xdb\\x86\\x21\\xab\\xca\\x3a\\xeb\\x82\\x09\\x8b\\x5a\\xa8\\x7b\\xb9\\x8f\\x5e\\x40\\x52\\x2a\\x08\\x88\\x53\\x2c\\x17\\x48\\x45\\x3d\\xb2\\xd2\\xb3\\x94\\x3e\\x4a\\xbb\\x31\\x2d\\xe3\\x19\\xae\\xc4\\x8c\\xc1\\xc9\\x47\\x75\\x97\\x29\\x53\\xfb\\x64\\x96\\xb8\\x16\\x89\\x37\\x62\\x35\\x10\\xcd\\x48\\xc8\\xb2\\x47\\x95\\x6d\\x31\\x68\\x48\\x6c\\x17\\x6a\\xe7\\xa4\\xcb\\x38\\x4e\\xac\\xfd\\xab\\xfa\\xdd\\x9f\\xba\\x30\\xa2\\x3b\\x81\\x1b\\xd7\\x79\\xf3\\xcb\\xa5\\x43\\x38\\xc2\\x8b\\xb3\\x38\\x22\\x38\\xed\\x3b\\x8d\\xd2\\x1b\\xea\\xb2\\xf5\\xca\\xde\\x28\\xc5\\xe0\\x9b\\x31\\xa4\\x54\\x80\\x8a\\x53\\x48\\x12\\x2e\\x3a\\xe3\\x81\\x22\\x96\\xf7\\x86\\x9c\\x38\\x65\\xc3\\xc9\\xd8\\xfe\\x18\\xbd\\x81\\x2f\\x2e\\x60\\xe9\\x14\\x97\\x5c\\xfe\\x1b\\xef\\x8d\\xbb\\x80\\x97\\x00\\x6f\\x0d\\x7c\\xf3\\xfc\\x15\\xeb\\x95\\xc2\\x78\\x54\\xb1\\x43\\x12\\xb8\\x8d\\x52\\x80\\x15\\xaf\\x69\\xfb\\x75\\x05\\xb8\\xf3\\x27\\x03\\xf6\\x4e\\xb1\\xc9\\x58\\xf0\\x46\\xdd\\x25\\x12\\x42\\xf8\\xbe\\xa7\\x46\\x7f\\xc7\\x29\\x1d\\x09\\x5e\\x96\\x96\\xe1\\x1a\\xa4\\x5a\\xbe\\x79\\x24\\xe8\\x56\\x35\\x15\\x35\\xaa\\x07\\x73\\xd3\\xd9\\xe6\\x1c\\xc9\\xa2\\xd8\\x9b\\x5b\\x07\\x74\\xd7\\x64\\x5e\\xe1\\xaf\\x7e\\xb6\\xfc\\xd4\\x40\\xbc\\x69\\xd4\\x3e\\xde\\xaa\\xf9\\x35\\xfd\\x2a\\x52\\x95\\xac\\x19\\xa9\\x7d\\x70\\xaf\\x92\\x98\\x83\\x0f\\x81\\xc0\\xa5\\x09\\xf2\\x42\\xf4\\x73\\x37\\x24\\x78\\xfa\\x58\\x79\\xfb\\x2c\\xb8\\x51\\x10\\x80\\xfc\\x2e\\xcd\\x82\\x59\\xb8\\xc3\\xce\\x9e\\x8b\\x64\\x07\\x61\\xdc\\x79\\x27\\xc3\\x2e\\x7f\\x5b\\xae\\x97\\xa8\\xb8\\xac\\x93\\x56\\x62\\xe5\\xf4\\x5d\\x14\\xca\\xd6\\xd3\\x4a\\xff\\xc9\\xa1\\x94\\x14\\xc4\\x56\\x6f\\x45\\xf9\\x77\\x39\\x67\\x10\\x89\\x4c\\x53\\x99\\xed\\x44\\x80\\xf1\\x8e\\x90\\x95\\x7f\\xaa\\x76\\xcc\\xb5\\x12\\xa2\\xd0\\x75\\x73\\x05\\x8a\\x95\\xb4\\x2f\\xe1\\x81\\x02\\x49\\xd1\\xc8\\x5e\\xc4\\x31\\xa0\\x49\\xd1\\xae\\xcb\\x0f\\x11\\x83\\x79\\xbd\\xc3\\xf1\\xee\\x49\\x0b\\xc8\\xa0\\x54\\xc3\\x2c\\x3d\\xac\\x76\\x59\\x96\\x6c\\xdb\\x66\\xf9\\x95\\xac\\x40\\x3d\\x5e\\x79\\xeb\\x6b\\x25\\xb3\\xf3\\xf6\\x5a\\x6c\\xee\\xc2\\x20\\xd6\\x6c\\x05\\xf8\\xa8\\xa9\\x8b\\x80\\x79\\x9b\\xa4\\xf2\\xc6\\xdb\\xbb\\x4d\\xfb\\x58\\x62\\xc9\\xa4\\x6b\\xca\\x01\\x3e\\xbd\\xfa\\xba\\x74\\x94\\xa3\\x0c\\xe1\\x46\\x06\\xaf\\xc0\\xb0\\xf9\\x93\\x14\\x3f\\xed\\xee\\x78\\x96\\xd9\\xa6\\xbb\\x81\\x49\\x91\\x66\\xed\\x02\\xe9\\x41\\x86\\xaa\\xf3\\x21\\x87\\xae\\xb6\\xe2\\x82\\x50\\x1b\\xca\\x43\\xb5\\x7b\\x7e\\xfa\\x09\\x39\\xc9\\x34\\xbc\\x8f\\xbb\\xd2\\x6c\\x44\\xb6\\x18\\x33\\x5a\\x35\\xc6\\x92\\xff\\x99\\x6a\\x5b\\x95\\xd3\\x27\\xdf\\x9b\\x2a\\x66\\x21\\xb3\\xb0\\xf1\\x90\\xdb\\x1f\\x36\\xd9\\x11\\xd1\\xa6\\x63\\xa4\\xeb\\xf9\\xa2\\x85\\x4b\\xb4\\xf4\\x06\\x10\\x95\\xb6\\x98\\x12\\xc8\\x2c\\x2f\\xfe\\x3f\\x92\\xe9\\xb4\\x4d\\x2e\\xa6\\x31\\x69\\x88\\x1c\\xae\\x84\\x53\\xd6\\xee\\xf7\\xcf\\x69\\xc2\\x5a\\x28\\xb3\\xf8\\xdd\\xc7\\x01\\x48\\xef\\x26\\x72\\x1a\\x3c\\x1f\\x2e\\x62\\xd9\\xd1\\x0c\\xea\\x42\\xfc\\xa3\\xfa\\xcd\\x74\\x67\\x3a\\x4e\\x7f\\x33\\x50\\x73\\x64\\xaa\\x28\\x6c\\x0f\\x38\\xd7\"},\n{{0x82,0x3f,0x0c,0x29,0xfb,0xfd,0xd3,0xd1,0x82,0x8f,0x30,0x55,0xe9,0xec,0x01,0xff,0xd1,0xb5,0xa3,0x75,0x11,0x8d,0xdd,0x7e,0x4e,0x0c,0x43,0x71,0x9f,0x57,0x3f,0xf7,},{0x73,0x12,0x5f,0xc8,0x3a,0xbb,0x8b,0x7c,0x65,0x85,0x59,0xfc,0x12,0x73,0x93,0x23,0x1d,0x03,0xca,0x58,0x46,0xe0,0xc8,0x81,0x18,0xd1,0x3d,0x55,0xca,0x44,0x78,0x9d,},{0xfa,0x74,0x7b,0x6f,0xe3,0x38,0x1a,0xd6,0xbc,0x82,0xa9,0x56,0x43,0xc1,0xf4,0xa2,0x0b,0x76,0xba,0x73,0xbf,0xf0,0x0e,0x63,0x5d,0x64,0x20,0x2d,0x8b,0x0d,0xf0,0x3d,0xbc,0x56,0xb0,0x13,0x8b,0x3a,0x6d,0x41,0x98,0xff,0xaf,0x58,0xcc,0xd3,0xd3,0x88,0xed,0x25,0xeb,0xcf,0x77,0x04,0x43,0xe4,0x1e,0x9d,0x21,0x47,0x95,0x0a,0x30,0x0b,},\"\\x80\\x2c\\x39\\xce\\x7f\\x2a\\x50\\xbd\\x81\\x62\\x2a\\xdd\\x0d\\xf4\\xe0\\xfe\\x03\\xec\\x3d\\x2d\\x30\\x5a\\x45\\xa6\\x16\\x52\\x71\\xed\\x79\\xad\\xd2\\x43\\xb9\\xa0\\x0e\\x52\\x18\\x31\\x92\\xfe\\xb2\\x4c\\x4f\\xdb\\xd2\\x2c\\x80\\x7a\\xe1\\x00\\xef\\xcf\\x16\\x5b\\x9c\\x99\\x61\\x94\\xe0\\x0f\\xa8\\x17\\x76\\x5e\\xa9\\x4a\\x03\\x07\\x0e\\x48\\x66\\x86\\xb4\\x45\\xfc\\xb2\\x63\\xcc\\xfe\\x1f\\x58\\x62\\xf3\\xb8\\x4b\\x10\\xf3\\x90\\x08\\x0b\\xfc\\xae\\x44\\x7a\\xe0\\x06\\x97\\x42\\xb8\\x61\\x8f\\xa9\\x57\\x5f\\x7e\\x63\\x7a\\xd5\\x4e\\x83\\x4c\\xaf\\x03\\x94\\xd7\\x45\\x03\\x2c\\xe1\\xe2\\x55\\xc0\\x27\\x32\\x50\\xf1\\x50\\x4b\\x37\\xa0\\xad\\xd9\\x4a\\xa2\\x45\\xc7\\xde\\x52\\xc8\\x0e\\x05\\xd6\\xe0\\xa9\\x6a\\x14\\x41\\x05\\x43\\x82\\x6a\\x49\\xe9\\xb9\\x45\\x62\\x6d\\x4e\\x89\\xf5\\x50\\x27\\x16\\x3d\\x4b\\xd6\\xd0\\xe9\\xbd\\x1a\\x24\\x77\\xf6\\x7d\\x3d\\x56\\x68\\xa4\\x2e\\x94\\xd8\\xb6\\x11\\x93\\xd8\\x21\\xe0\\xd1\\xb2\\x30\\xfc\\xad\\xc5\\x36\\x13\\xb7\\x5b\\x02\\xcf\\xb8\\x15\\x84\\x56\\x07\\x7e\\xbd\\xf5\\xa5\\xf0\\x0c\\x3b\\x5b\\x18\\x63\\x70\\xca\\xfe\\xc4\\xa2\\x1c\\x69\\xdc\\xe1\\xf0\\x1e\\xfe\\xf2\\x3c\\x37\\xab\\x90\\xf8\\x58\\x23\\x8a\\xef\\xbe\\x21\\x2b\\x55\\x6d\\x2f\\x07\\x34\\x06\\x55\\x9f\\x1a\\x51\\xd8\\x4e\\xff\\xfd\\xce\\x07\\xb0\\x0d\\x01\\xbb\\xf3\\x37\\x71\\xcc\\x12\\xc9\\x60\\xac\\x89\\x36\\x5a\\x9c\\x82\\xc5\\x23\\x43\\xf7\\x60\\x33\\x81\\xb8\\x90\\x23\\xc1\\xa6\\xe7\\x02\\xa5\\xb1\\xe4\\xbd\\x19\\x1e\\xa6\\x97\\x0b\\x5e\\xa4\\x51\\xea\\x05\\xb5\\x9b\\xf8\\x3e\\x55\\xf2\\x9a\\x1f\\x80\\x32\\x12\\xbb\\x2e\\x58\\xf0\\x61\\x63\\x33\\xd9\\x11\\x47\\x08\\x52\\x9e\\x8b\\x6c\\x60\\x81\\xde\\xeb\\x7c\\x29\\x9a\\x5a\\x2a\\x53\\xcc\\xd2\\x4e\\xd5\\x8f\\xfb\\xfe\\x50\\x3d\\x80\\x61\\x4a\\xdb\\x05\\xca\\x11\\xcf\\x29\\xde\\xd0\\x09\\x04\\xea\\x12\\x39\\xf8\\x2b\\xa4\\x0c\\x79\\x3e\\xbc\\x33\\x97\\x75\\xf8\\xb0\\xfe\\x39\\x01\\xf5\\x48\\x2e\\x31\\x0c\\x79\\x3c\\x6e\\x2c\\xf0\\x1d\\xc1\\x57\\x72\\x7a\\xf2\\x38\\xf4\\x9c\\x98\\x62\\x80\\x4b\\x04\\x75\\x51\\xfd\\x88\\x6f\\x4a\\x48\\x99\\xe2\\x2a\\x6a\\x65\\x70\\x11\\x17\\xa3\\x85\\x80\\x55\\xbb\\xfe\\x96\\x6e\\x37\\x0e\\x73\\x3e\\x17\\xef\\xad\\xa2\\x85\\x9f\\xd8\\xff\\xa9\\xe0\\x1f\\xce\\x56\\x06\\xa2\\x55\\x36\\x76\\x78\\xf4\\xbd\\x4e\\x21\\xe5\\xda\\x0f\\xef\\x30\\x75\\x7f\\x34\\xe3\\x89\\xf7\\x6b\\x7d\\x57\\xc4\\xe4\\x10\\xa0\\x02\\xe9\\x00\\xe4\\x8f\\xb2\\x18\\xc8\\xf2\\x77\\x8f\\x14\\x8f\\xee\\x56\\x96\\x5f\\x5b\\x47\\x3e\\x25\\x25\\x6c\\x23\\xa7\\xaf\\x19\\x83\\x42\\xcf\\x3e\\xf0\\x2b\\x84\\xdf\\x2c\\xd5\\x80\\x0a\\x46\\x1c\\x1b\\x07\\xbd\\xa2\\xf4\\x26\\x28\\xa6\\x8a\\xd2\\x9d\\xbb\\x82\\xa4\\x70\\x96\\x7d\\x73\\x02\\xc9\\x93\\xb2\\x34\\x13\\x6e\\x5b\\xf2\\x55\\xe6\\x24\\x8b\\x10\\x2c\\x2b\\xff\\xb2\\x01\\x72\\x37\\x1f\\x1c\\xa3\\xe1\\x0b\\x08\\x10\\xe8\\x64\\x95\\x03\\x54\\x6d\\x9a\\x73\\x1c\\xf1\\x9b\\x08\\x33\\x57\\xd4\\xcf\\xec\\xc8\\x9b\\xed\\xb5\\x35\\x06\\xfe\\x19\\x9b\\x67\\x03\\x91\\xa6\\x20\\x06\\x9a\\x30\\x81\\xf2\\x53\\xb4\\xd7\\x90\\x88\\x0a\\xa2\\x3b\\x53\\xe9\\x7c\\x75\\xdc\\x0c\\x36\\x05\\x40\\xe5\\xb0\\xa3\\xef\\xb1\\xac\\xcf\\xfd\\x13\\x74\\x14\\xff\\x84\\x23\\xd5\\x46\\x46\\xfc\\x56\\xba\\x5f\\x53\\xbd\\x84\\xc7\\x26\\x7c\\x2f\\x7e\\xe3\\xe3\\x76\\x07\\x54\\x41\\x54\\x36\\x5f\\x9f\\x85\\x08\\x1d\\xd7\\xd2\\xee\\x75\\xd3\\x02\\x27\\x5c\\x79\\x9e\\xf2\\x42\\x7c\\xa6\\x49\\x63\\x55\\xdc\\xda\\x1d\\x44\\xe0\\xd9\\x77\\xbf\\x68\\xdb\\x30\\x06\\x50\\x0a\\xe3\\xf4\\x00\\xd6\\xa8\\xc7\\xcf\\x47\\x05\\x7d\\x4f\\xc8\\x7e\\xee\\xcb\\x02\\x11\\x6b\\x73\\xee\\xd6\\xce\\x1f\\xcc\\xef\\x6e\\x8f\\xb8\\xae\\xa3\\x63\\xb2\\xf6\\xf5\\x32\\x2a\\x5f\\x07\\x53\\xf4\\x58\\x99\\x53\\x76\\x46\\xd5\\x86\\x51\\xbe\\x90\\x37\\xbf\\x91\\x42\\x3c\\x29\\x86\\xf5\\xcc\\x2b\\xcb\\xce\\x4f\\xae\\xc9\\x03\\x49\\x8b\\x40\\xfc\\x2d\\xea\\xb6\\x60\\x3d\\x6e\\xea\\x58\\x5d\\x27\\x20\\xd2\\x1b\\xb2\\x72\\x2b\\xc0\\x5b\\x35\\xae\\xd2\\xbc\\xc0\\xe8\\x04\\xfe\\x9d\\x23\\x9f\\xaf\\xda\\x7d\\xda\\xfe\\x1d\\x78\\x60\\xab\\xb0\\xfb\\x28\\xf4\\xbf\\x2b\\x1f\\xbb\\x62\\xa7\\x86\\xe4\\x55\\xbe\\x02\\x4b\\x19\\x3b\\x78\\x30\\xbe\\x0d\\x55\\x8f\\x02\\xc9\\xf3\\xae\\x31\\xdc\\x10\\x7e\\xe9\\x42\\x1d\\xc5\\xf0\\xb0\\xf8\\x94\\x02\\xb7\\x1a\\x45\\x81\\x40\\x15\\x36\\xbc\\x47\\x30\\x85\\x06\\xd9\\x69\\x39\\xa2\\x06\\x36\\x27\\x44\\xe2\\x7d\\xde\\x94\\x4f\\x40\\x96\\xa1\\x2b\\x5f\\x63\\xda\\xb6\\x4d\\x04\\x14\\x84\\xd3\\xfd\\x91\\xa6\\x2c\\x2f\\x0e\\xf9\\xae\\x78\\x74\\x22\\xeb\\x27\\xfe\\xd0\\x80\\x2e\\x25\\xf9\\xbc\\x77\\x5c\\x49\\x15\\xa8\\x37\\xfe\\x3e\\xb7\\xb9\\xd5\\x84\\x3e\\x4d\\x82\\x10\\xc6\\xb4\\x94\\xb6\\x12\\x81\\x63\\x7a\\x6b\\xe3\\x20\\x52\"},\n{{0x65,0x67,0x66,0x33,0x37,0x42,0x14,0xc4,0xac,0x4b,0x7b,0xce,0xa9,0xf1,0xcc,0x84,0xb1,0xb7,0xe7,0x94,0x11,0xe3,0x10,0x52,0x5a,0xce,0x38,0x5f,0x45,0x66,0xc1,0xd5,},{0x0e,0x6e,0xc5,0x80,0x1d,0x8b,0xd6,0xb1,0xeb,0x42,0x14,0x21,0xa1,0x40,0x8f,0x13,0x4c,0xf7,0x12,0x33,0x8e,0x0f,0xfc,0x24,0xcd,0xcc,0xdc,0x4f,0x7f,0xa3,0x1d,0xbe,},{0xe0,0xb8,0x67,0xc9,0xdb,0xda,0x35,0x32,0x34,0x33,0xc0,0x46,0xe0,0x83,0x0c,0x25,0x1b,0x43,0x46,0xc5,0x39,0x59,0x72,0x28,0x6b,0x3a,0x72,0x31,0x0e,0xd4,0x52,0x6e,0x54,0x5d,0xc0,0x9d,0x39,0x18,0xf2,0xeb,0x99,0x20,0xbc,0x9b,0x24,0x1e,0x90,0x50,0xd8,0x48,0xd3,0x83,0x02,0x88,0x65,0x15,0x91,0xf9,0x36,0xd3,0xba,0xe4,0x53,0x01,},\"\\x9d\\x62\\x2c\\x20\\x67\\x87\\x69\\x40\\x93\\xc6\\xf2\\x9f\\x93\\x61\\x9f\\x21\\xbb\\x64\\xc0\\x39\\x41\\x6d\\x20\\xdc\\x70\\x8a\\x08\\x4a\\x9d\\x2e\\x49\\x0c\\xf5\\x65\\x8e\\x13\\xd6\\x2c\\xb0\\xd2\\x1e\\xab\\x00\\xe4\\x2d\\x85\\x1b\\xc6\\xec\\x75\\xda\\xf4\\x05\\xd2\\x37\\x32\\x46\\xee\\xa4\\x15\\xe8\\x66\\x29\\x1b\\xab\\xf7\\x64\\x97\\x68\\x0a\\xaf\\x04\\x42\\x5a\\x42\\x55\\x2b\\x10\\x7d\\x58\\xcd\\x18\\x56\\x1c\\x8c\\x94\\x83\\xf7\\x40\\x74\\x4c\\xbf\\xa6\\x05\\x4c\\x1b\\x12\\x6f\\x5a\\x76\\x65\\x9a\\xc1\\x9d\\xdd\\xad\\x4a\\xb5\\xa0\\x91\\x55\\xd8\\xc0\\x50\\xb5\\x35\\x4e\\x06\\xa4\\xdd\\x3e\\xe3\\xa6\\xf9\\xc9\\x1e\\x8b\\x4c\\x7a\\xf2\\x74\\x96\\x64\\xe7\\xab\\xe9\\x70\\x61\\x58\\x9e\\x15\\x3c\\x58\\xe2\\x7c\\xf2\\x99\\xa2\\x5f\\x2b\\x53\\x0c\\x06\\x07\\x31\\xec\\x0f\\x43\\x66\\xbd\\x1d\\xeb\\xeb\\x4d\\x4e\\x91\\x2e\\x76\\xe5\\x08\\x53\\x4d\\x43\\x3e\\xc4\\x8f\\x96\\xb6\\x2e\\x15\\x0d\\xe9\\x39\\x63\\xa1\\xb3\\xe6\\xc8\\x09\\x1b\\x49\\x5a\\x96\\x51\\x8c\\xe3\\xd3\\xb9\\xa8\\xdb\\xdc\\x2a\\x13\\xfd\\xd0\\x77\\xf2\\x23\\x1d\\xe8\\xd7\\x6f\\x56\\xd9\\xab\\x1c\\x2f\\x9e\\xfa\\xbc\\xe4\\x63\\x83\\x64\\xf8\\xfb\\x2a\\x2c\\x68\\x3c\\xa8\\x19\\xb7\\x03\\xab\\x45\\x3b\\x11\\xd3\\x7a\\x69\\xfa\\x4b\\xcb\\x80\\x23\\x98\\x08\\x34\\xf7\\xb9\\x02\\xad\\x18\\x19\\xfc\\x02\\x92\\x12\\xfd\\xea\\x0a\\xbf\\x11\\xde\\xc8\\x8c\\x55\\xd6\\x8e\\xf8\\x7a\\x26\\xdb\\xb1\\x5d\\xc3\\xd3\\xdf\\xbc\\xdd\\xdd\\x5e\\xd7\\x1b\\xe8\\x6f\\x32\\xc7\\x6e\\xe2\\x22\\x1d\\x92\\x43\\x68\\x3d\\xf9\\x51\\x65\\x64\\xb2\\x6b\\xab\\x5c\\x84\\x5d\\x4d\\xfe\\x0a\\xdc\\xc7\\xcb\\x9f\\xe1\\xee\\x2c\\x05\\x1a\\xf5\\x90\\x8c\\xe0\\xcc\\x3a\\x90\\x90\\x4d\\xbc\\x0d\\x36\\x80\\xed\\x49\\x92\\xf4\\x6c\\xe2\\x5c\\x2e\\xe8\\x51\\xc4\\x14\\xf0\\x18\\x7d\\x89\\x3e\\x5c\\x3b\\x01\\x89\\xa7\\xbb\\x68\\x93\\xd6\\x83\\xf5\\xe3\\x39\\x4c\\xc0\\x46\\x29\\x9a\\x16\\xa1\\xc1\\xb5\\x69\\x59\\x33\\xa8\\x9b\\xb1\\x30\\x30\\x85\\x5b\\x81\\xb3\\xc7\\x46\\x85\\xf7\\x19\\xde\\x01\\x60\\x57\\x5a\\x0f\\xf0\\xa9\\x1f\\xd9\\x43\\x47\\xb8\\xbc\\xbe\\x12\\x5d\\x1d\\x3f\\x9c\\xe7\\x72\\xa8\\x12\\x6e\\x00\\xf5\\x63\\xb3\\x18\\x96\\x56\\xd5\\x52\\x2c\\x18\\x7a\\xb8\\x31\\xa7\\xad\\xe7\\xac\\x06\\xfd\\xca\\xc7\\xf1\\xd4\\x58\\x82\\xe5\\x1f\\x9b\\xf5\\xb4\\x4a\\x2d\\xab\\xa4\\xa5\\x3d\\xbb\\x31\\x97\\x0b\\x4a\\x0f\\x12\\x72\\xfe\\x14\\x08\\x7e\\x0c\\x3c\\x7e\\x45\\x42\\x31\\x2f\\xe7\\x4d\\x76\\x7f\\x21\\xe7\\xea\\x48\\x7d\\x52\\x84\\x28\\x4f\\x46\\xf2\\x0f\\x32\\xc5\\xb1\\x6e\\x1e\\x0a\\xc8\\xd7\\x96\\xab\\x2f\\x80\\xb3\\x44\\xe7\\xa8\\xd8\\x4d\\x5d\\xe8\\x23\\xa5\\x08\\x97\\x75\\x2d\\xc5\\x49\\xa4\\x8f\\xc1\\x0b\\xcd\\x43\\x6a\\x7a\\x93\\xe9\\x7c\\xd0\\x5d\\x78\\x30\\x13\\x8f\\x32\\x38\\x79\\x68\\x0c\\x34\\x3c\\x16\\x46\\x7d\\x26\\x4d\\x74\\x9b\\xf4\\x5e\\x40\\xf3\\x9f\\xbc\\x3a\\x00\\xc4\\x3b\\x00\\x69\\x3b\\x01\\x56\\x76\\x8f\\xf2\\xe3\\xf8\\xad\\x9e\\xb6\\x40\\x50\\x22\\xf5\\xca\\xda\\x66\\x94\\xe8\\xa3\\x3c\\xdc\\x59\\xc6\\x67\\x3c\\x44\\x11\\x72\\x44\\xeb\\x03\\xfd\\x7f\\xd6\\x75\\x93\\x0c\\x29\\x4e\\xdd\\x29\\x40\\xf5\\xf1\\x80\\x95\\x3d\\x91\\x0c\\x55\\x48\\x5b\\x20\\x57\\xae\\x0c\\x93\\x02\\xf4\\xa8\\xe8\\x31\\xa5\\x53\\x0e\\x3c\\xbb\\xf6\\xf4\\x72\\x22\\x40\\x83\\xa9\\x52\\xa8\\x39\\x0a\\xb0\\x0d\\xc0\\xf6\\x9d\\xfd\\x88\\x0e\\xea\\x2d\\x73\\x9d\\x21\\x8d\\x6a\\x66\\xf2\\x37\\xf1\\x0d\\x44\\x01\\xaa\\x75\\x8f\\xf8\\x12\\x0c\\x0a\\xe2\\x76\\x61\\x27\\x84\\x90\\x24\\xf5\\xa4\\xcc\\x57\\x4a\\x5b\\x02\\xb9\\x35\\x96\\x68\\x12\\xcd\\x1f\\xb6\\xd7\\x9d\\x0c\\x4f\\x59\\xff\\x80\\xf0\\x35\\xa0\\xb1\\x09\\xcc\\xcb\\x22\\xfb\\x08\\x53\\x5b\\x87\\x41\\x49\\xed\\xf2\\xa0\\x97\\x0c\\x14\\x88\\x84\\x27\\xd0\\x7d\\x1e\\xaf\\xa6\\x84\\xa6\\xd3\\x45\\x4e\\x49\\xb2\\x25\\x18\\x4c\\x6b\\x99\\x3e\\xc8\\xdd\\xb8\\xb5\\xa3\\x5e\\xe4\\x5f\\x87\\xf6\\x92\\x66\\xd4\\x90\\x96\\xa3\\x17\\xd8\\x6a\\xde\\x27\\xf4\\x52\\x9f\\xe7\\x23\\x64\\xd0\\xb9\\x58\\x00\\x72\\x99\\xd9\\xde\\x87\\xd6\\xff\\x9f\\xb0\\x4d\\x57\\x3a\\xea\\x46\\xba\\xc8\\xeb\\x76\\x47\\x52\\xeb\\x46\\x5c\\xaa\\xab\\xa6\\x89\\xa6\\x46\\x0c\\x11\\x07\\x30\\xbd\\xd0\\x8b\\x16\\x89\\xde\\x7b\\x05\\xde\\x59\\xaf\\x9f\\xe2\\x44\\xac\\x36\\x3e\\x95\\xc9\\x8b\\x66\\x93\\x59\\xaf\\x90\\x31\\xa3\\xa9\\x3b\\xa6\\x31\\xab\\xf1\\xf6\\x1d\\x20\\xef\\x7f\\xc6\\x88\\x3b\\x48\\x40\\xfc\\x92\\x67\\x12\\xe1\\x3d\\x87\\x4b\\x72\\x2f\\x6a\\x79\\xb1\\x60\\x70\\xc0\\x31\\x13\\x25\\xe9\\xa7\\x0f\\xcd\\x86\\x91\\x6c\\xfa\\x1d\\xa7\\xf9\\xd0\\x56\\x3a\\x22\\xfe\\x9b\\xfe\\x85\\x4b\\x0c\\x18\\x6c\\x86\\x63\\xb0\\x61\\xb6\\x5b\\xc0\\x71\\xe8\\x39\\x93\\x8d\\x8f\\xdd\\x7c\\xf8\\xf6\\x95\\x2a\\x64\\x67\\xfa\\xd8\\xe5\\x84\\x90\\xed\\x2b\\x26\\x81\\x33\\x01\"},\n{{0xd2,0xed,0xed,0xcd,0x85,0x32,0x06,0xcb,0xf5,0x9b,0xd7,0x4a,0x25,0xa3,0x03,0xfa,0x2d,0x6c,0x39,0x36,0xbb,0x48,0xeb,0x42,0xf6,0xd9,0x00,0xcb,0xe8,0x07,0x72,0xbe,},{0x22,0x44,0x11,0x1e,0x2e,0x76,0x9e,0xab,0x81,0x87,0x1e,0x06,0xc5,0x80,0x17,0x8c,0x23,0x5c,0x7b,0xf4,0xa5,0x2d,0x2e,0xcc,0xe1,0x18,0x87,0xa9,0xb4,0x6c,0x45,0xc8,},{0xbe,0x3c,0x2b,0x56,0x7f,0xe8,0xc2,0x08,0xc9,0x8e,0x71,0x97,0x11,0x7e,0xb0,0x1b,0x3c,0x19,0x7b,0xdf,0xc8,0x58,0x56,0x2d,0xc5,0xcd,0x90,0xf8,0xe2,0xc0,0x35,0x70,0x42,0x30,0x39,0x95,0xba,0xba,0x2f,0x40,0xb7,0x34,0x5c,0x56,0xdb,0x0b,0x46,0x25,0x58,0x0a,0xa8,0xdc,0xc4,0x8d,0xf6,0x01,0x9d,0x23,0xa8,0x38,0xea,0x71,0x72,0x02,},\"\\x80\\x70\\xbc\\x0d\\xb0\\x89\\xa5\\x92\\x54\\x46\\x01\\x9b\\x7e\\x40\\x3c\\x74\\xec\\x78\\x90\\x3e\\x4b\\xd5\\x4b\\xc1\\xd0\\x8a\\x54\\xa6\\xf0\\xed\\x75\\xa8\\x5b\\x76\\x3f\\xf5\\x4d\\xc3\\x3a\\x26\\x00\\xcc\\xb4\\x57\\xfd\\xba\\xea\\xe5\\x48\\x47\\x7f\\x6d\\x69\\x47\\xae\\x26\\xde\\xb7\\x1e\\xac\\xd1\\xd2\\xd6\\x22\\x82\\xa0\\x83\\x84\\x3b\\xe4\\xe5\\x93\\x1d\\x91\\xc9\\x3b\\x62\\x82\\xc5\\x88\\x07\\xce\\x8f\\x0d\\x88\\x0b\\x14\\x38\\xda\\xd8\\xfd\\xcb\\xa8\\x61\\x2d\\xf7\\x3b\\x9f\\xaf\\xf3\\xa9\\xf7\\xdb\\x30\\x05\\x25\\x05\\x36\\xaa\\xbd\\x98\\xae\\x02\\x7a\\x89\\x5e\\x10\\xb5\\xcb\\x7b\\x69\\x87\\x5c\\x0f\\x39\\x93\\xaf\\x24\\x51\\x92\\xf4\\x39\\x3e\\x9c\\x4d\\x34\\x05\\x74\\x6e\\x31\\x1d\\x3a\\x91\\x44\\x7f\\xcd\\xbd\\x73\\x06\\xb6\\x02\\x0c\\x93\\x3b\\xba\\xb9\\xe3\\x9d\\x13\\x49\\x16\\x25\\x03\\x5c\\x9c\\x63\\x6e\\xfa\\x17\\x39\\xc3\\x58\\x87\\x10\\xa8\\x79\\xd9\\xe3\\xce\\x17\\x64\\x61\\x6f\\x10\\x82\\xe8\\xdf\\xf5\\x75\\x59\\xc3\\xf5\\xa5\\xd7\\x6d\\xd3\\x01\\x12\\x4f\\xa4\\x89\\xfb\\x94\\x9e\\x9e\\x03\\x9d\\xd4\\x62\\x1b\\xda\\x60\\xf0\\xb8\\x6b\\x31\\x1e\\x78\\xed\\x0a\\xb3\\xb5\\x28\\x96\\x50\\x44\\xb2\\x3d\\x78\\xee\\x2f\\x81\\x06\\x1f\\x8e\\xdb\\xd6\\x92\\x99\\x33\\xd1\\x8c\\x02\\x07\\xde\\xc4\\xb5\\xb6\\xb2\\xfa\\x4a\\xca\\x27\\x47\\xcf\\x5b\\x11\\x0d\\xf0\\x0b\\x0c\\x98\\x27\\xbd\\xb3\\xd9\\xdb\\x2c\\x7b\\x03\\x28\\xd4\\x0d\\x99\\xe1\\xf6\\xb2\\x28\\xe4\\x0d\\xad\\xae\\x78\\xae\\xda\\x02\\x89\\xb6\\xa2\\x3d\\x4e\\xb5\\x83\\x70\\x88\\xe5\\xd8\\x84\\x13\\x63\\x2c\\xcc\\x22\\xe2\\x1a\\x73\\x76\\x8c\\x67\\x32\\x01\\xe9\\xa8\\xd8\\xdc\\x6e\\xb6\\xf7\\x39\\x7f\\xed\\xbd\\x39\\x8d\\x26\\xf9\\x69\\x2c\\xa7\\x2f\\x6d\\x6c\\xf0\\x56\\xaa\\xac\\x50\\xac\\x2f\\x3b\\x26\\x6d\\xbe\\x5e\\x7b\\xe7\\xa0\\x24\\x77\\x45\\x78\\xea\\xd5\\x85\\x24\\x5d\\xaa\\xa7\\x3e\\x0a\\xaf\\x83\\x3c\\x07\\x0b\\xa4\\xb2\\x04\\x4c\\xcb\\x5e\\x5c\\xd1\\x6f\\x9c\\x0a\\xd9\\x2e\\xa8\\x44\\x80\\x55\\xdd\\x82\\x8c\\x79\\x93\\x5a\\xa6\\xc0\\x74\\x1f\\x9e\\x2b\\x81\\x03\\x24\\xfd\\xc6\\xe6\\x1e\\x84\\x2f\\x94\\x57\\x22\\x68\\xbf\\x7d\\x5a\\xdf\\xa7\\xab\\x35\\xb0\\x7f\\xb1\\x9e\\x78\\x15\\xa8\\xaa\\x5d\\x81\\x13\\x01\\x30\\xac\\x5c\\xda\\x8a\\x47\\x51\\xee\\x76\\x03\\x8c\\x0a\\x6b\\xc2\\xfa\\xba\\x4c\\x49\\x7e\\x62\\xb9\\xf1\\xf1\\x94\\xb8\\xa5\\x99\\xb0\\x77\\x01\\x81\\x4b\\x6d\\xfb\\x7d\\x84\\xbc\\xdd\\x5b\\x7b\\x5b\\xc2\\x24\\x9f\\x1d\\x38\\x45\\xef\\xf9\\xef\\x8c\\xc7\\x32\\x85\\x35\\xd7\\x0d\\x53\\xc7\\xaa\\x0c\\x73\\x05\\x90\\x1d\\xe7\\xc4\\xed\\x2f\\xe1\\x83\\x82\\x65\\xd4\\xa4\\x17\\xb8\\x76\\xad\\xbd\\x88\\xeb\\x93\\x3f\\x27\\xc9\\xaa\\x48\\xc8\\xc7\\xe3\\x4e\\x48\\x14\\x7c\\xcf\\xfb\\x2f\\xb6\\x1a\\x34\\x8f\\xea\\x13\\xef\\x67\\xcd\\xf2\\xe0\\x39\\xe3\\x3f\\xd8\\x9e\\x2c\\x1a\\xd2\\xa4\\x25\\x4e\\x3b\\xf7\\x48\\x45\\x2a\\xa8\\x3e\\xfe\\xca\\x46\\xe7\\x80\\xed\\xe1\\xd1\\x3f\\xf4\\xcc\\x5e\\x7d\\x01\\xed\\x45\\xeb\\x8c\\x74\\x81\\x8d\\x48\\x60\\xaf\\x47\\x59\\xa8\\x3e\\x14\\x88\\x96\\xab\\x68\\x73\\x43\\x95\\x76\\x0e\\x00\\x14\\x6b\\x79\\x3c\\x3e\\x72\\x89\\x8a\\xa0\\xb3\\xc5\\xe0\\xc1\\xd3\\xfd\\xf1\\x21\\x58\\xd2\\xe8\\xff\\x11\\x23\\xa3\\xa0\\xc6\\x4c\\xf6\\x37\\x4a\\x7f\\x44\\xf1\\x1a\\x57\\x5e\\x48\\xa3\\x79\\x18\\x1b\\x30\\xa4\\x86\\x5c\\xfd\\x02\\x2a\\xa9\\x83\\x27\\x56\\x35\\xce\\x4f\\x2c\\xc4\\x0b\\xfe\\x06\\x60\\x67\\xec\\x4f\\xe2\\x41\\xfa\\x04\\x7b\\x55\\x27\\x0a\\x1a\\xd0\\x77\\x6c\\x5f\\x96\\x86\\x10\\x14\\xcb\\xf4\\x0a\\x04\\x32\\xc5\\x59\\xf2\\x2d\\x79\\x34\\x2b\\x79\\xf8\\xe7\\x04\\x2d\\xcc\\xfb\\x1c\\xf5\\x0f\\x83\\x08\\x5f\\x80\\x63\\xfb\\x18\\x87\\xed\\x2d\\xfc\\x9d\\xb7\\xef\\xc9\\x6d\\xaa\\x0f\\xf2\\xbc\\x4f\\x52\\x33\\x5b\\x02\\x11\\x2d\\x16\\x39\\x2e\\x13\\x4c\\x02\\x23\\xde\\x45\\x8f\\xc0\\x72\\xcc\\x22\\xbf\\x9e\\x7e\\xab\\xc0\\x62\\x08\\x18\\x0a\\x57\\xe7\\xce\\x48\\x05\\xee\\x4e\\x0f\\xc0\\x15\\x84\\x09\\x98\\xfd\\x56\\x86\\x44\\xa0\\x38\\x6b\\x3d\\x8e\\x7d\\xda\\x52\\xab\\xf6\\x4f\\x7d\\xd0\\x08\\x68\\xfc\\x84\\xf0\\x36\\xca\\x8a\\x78\\xe9\\xba\\x81\\x71\\xca\\x90\\x26\\x7c\\x74\\xe6\\x15\\x9a\\xca\\xc7\\xaf\\x5b\\xf2\\x37\\x59\\xab\\xc5\\x3d\\x82\\xe7\\x93\\xdb\\x87\\xfd\\xad\\xe1\\x36\\x33\\x54\\xff\\xdc\\xb0\\xbd\\x4c\\xc9\\x21\\x3f\\x5c\\x84\\x54\\x45\\xfc\\x64\\x9b\\x2a\\x1f\\x32\\x9f\\x9d\\x41\\xd8\\xa0\\x31\\xab\\x46\\xb4\\x72\\x16\\x0f\\x03\\x43\\x4b\\x4b\\x6b\\xc5\\xa4\\x01\\x52\\x4d\\x61\\x79\\xad\\x66\\xf9\\xe2\\x21\\xc9\\x06\\x7f\\xc8\\x7f\\xe4\\xa7\\x7e\\x21\\xe8\\x02\\x3b\\x61\\x69\\xeb\\xf1\\x09\\x0c\\xd5\\x56\\xa9\\xbe\\x50\\xb9\\x18\\x7f\\xe4\\x60\\x7c\\x59\\x25\\xe6\\x0b\\x41\\x4f\\x6a\\x5c\\xbf\\x8a\\xfa\\x15\\xed\\x0e\\xb3\\x4b\\x67\\xb4\\xc9\\xc5\\xd5\\x4a\\xdb\\xe6\\x40\"},\n{{0xb5,0x69,0xf7,0xc1,0xaa,0xdf,0x56,0xed,0x1b,0x5f,0xa1,0xb6,0xfa,0xd6,0x48,0xd0,0xdc,0x54,0x4f,0xf8,0xfc,0xd1,0x73,0x78,0x0d,0xe4,0x1a,0x7d,0x4d,0xe6,0x0c,0xb6,},{0x9e,0xff,0xa4,0xae,0xd9,0xc6,0x58,0xe4,0x34,0x60,0x71,0x43,0x44,0x68,0xa0,0xb8,0xa0,0x4e,0xcf,0x78,0x41,0x69,0x9d,0x63,0xe8,0x88,0x7c,0xe2,0x05,0x57,0x0c,0xea,},{0x2e,0x32,0xba,0x05,0x56,0xbd,0xe9,0x74,0xd7,0xa1,0x9b,0x3b,0x9a,0x1e,0x92,0xf1,0x83,0x92,0x4c,0x4b,0x74,0xc5,0xd7,0x51,0xb5,0xab,0x3d,0x00,0x79,0x67,0x01,0x6e,0xc0,0x3a,0xfe,0x91,0xd7,0x42,0xfb,0x22,0xb6,0x3e,0x5e,0x55,0xb2,0xfc,0xb6,0xc6,0x1a,0x46,0xe9,0xdc,0xe7,0xfe,0x9f,0xa3,0x0b,0xbf,0x66,0xae,0xf4,0xb8,0x5f,0x09,},\"\\x7c\\x5a\\xa4\\xdc\\x80\\x78\\xaa\\x77\\xe8\\xb3\\xb7\\xfe\\xe6\\x10\\x84\\xcf\\xad\\x76\\x47\\x62\\xf1\\xef\\x26\\xd8\\xde\\xb7\\xf2\\xf3\\xb1\\x86\\xdf\\xc7\\x72\\x48\\x75\\x50\\x19\\x78\\x45\\xfb\\xa2\\xf4\\xc2\\x3c\\x83\\x5b\\x9b\\x58\\xdd\\x0b\\x63\\x5c\\x64\\x91\\x35\\x13\\x7f\\x24\\x8f\\x5e\\xf7\\x13\\x56\\x4d\\xe3\\xc9\\x66\\xef\\xa5\\xf6\\xdb\\x6b\\xea\\x9e\\x30\\x97\\x07\\x49\\xf8\\xe8\\x72\\xd8\\xd7\\xae\\x45\\x35\\xb7\\x5e\\x17\\x6e\\xa0\\x48\\x9b\\x91\\x5f\\x34\\x71\\xd8\\x27\\xeb\\x5b\\x44\\x45\\x86\\x48\\x8c\\xfc\\x3f\\xa6\\xa4\\x50\\x82\\xda\\xcb\\x82\\x64\\x95\\xe5\\x0a\\x3b\\x5d\\xc6\\xbb\\x93\\x0a\\x33\\x1f\\x30\\xc3\\x85\\xbc\\x3b\\x24\\xce\\x70\\xb8\\x95\\x96\\xdb\\x6b\\xfb\\x68\\x7d\\x99\\xa5\\x81\\x98\\x7c\\xa8\\x76\\xea\\x0e\\x75\\x76\\x96\\xb3\\xfc\\x03\\x77\\x9a\\x65\\x81\\x30\\xc4\\x10\\xb3\\x44\\xed\\xac\\xc4\\x27\\x7d\\x44\\x84\\x54\\x99\\xd6\\x78\\xe1\\x41\\x4f\\x15\\xf3\\x6e\\x16\\x63\\x35\\x18\\x95\\x69\\xce\\xf3\\x56\\x7a\\xc2\\xe3\\xab\\x82\\x1c\\x91\\xc9\\x32\\x74\\xf5\\xc2\\x8a\\x5d\\x1f\\x7c\\x1b\\xf5\\x09\\x9b\\x10\\xf8\\x4e\\xcb\\x13\\xa4\\xe4\\x53\\x8f\\x66\\x49\\xbf\\x74\\xf7\\x39\\x4b\\x70\\x3e\\xf5\\x36\\x49\\xd8\\x15\\x16\\xcb\\x1d\\xb5\\x21\\x41\\x60\\x65\\xcf\\x9f\\x27\\x6a\\xb8\\x0c\\x93\\x08\\x89\\x7a\\x27\\xdf\\xe3\\x7e\\x5e\\x14\\x2f\\x18\\x19\\xb8\\xd3\\x48\\xdf\\x50\\xa0\\x46\\xa1\\x28\\x88\\xe3\\xb7\\xf2\\xdc\\xc7\\x0f\\x52\\x18\\xd1\\x5e\\xbb\\x9a\\xa7\\x29\\x1a\\x1a\\x92\\xac\\x44\\x5c\\x51\\xd3\\xa5\\x3d\\xd6\\x91\\xef\\xff\\xcf\\x5a\\x01\\xe8\\x76\\xa7\\x2a\\xa4\\x81\\xeb\\x4f\\x12\\x1a\\x07\\x23\\x97\\xd8\\xcc\\x93\\xbb\\xc2\\xc9\\xa6\\xc2\\x8c\\xc8\\x9b\\x11\\xff\\xc0\\xe9\\x10\\xd8\\x2d\\x9d\\x62\\x98\\xa3\\x67\\xa0\\xe1\\xe3\\xe8\\xc8\\x65\\xe4\\x32\\x6a\\x31\\x9b\\x22\\x66\\x6e\\x52\\x9f\\x19\\x98\\xf1\\xb3\\xc8\\xef\\xb5\\xfc\\x21\\xcc\\xe9\\x70\\x40\\xfb\\x62\\x47\\xda\\xa0\\x00\\x0a\\xc5\\x55\\x4d\\x89\\xe7\\xb2\\x71\\x59\\xdd\\x0b\\x18\\x00\\xb7\\x60\\xb7\\x9c\\x91\\xef\\x6e\\x97\\x0b\\x1e\\x6c\\x5f\\xf4\\x24\\x42\\xb1\\xb3\\xae\\x4d\\x3c\\x43\\x9e\\x08\\xec\\x2f\\x6b\\x94\\x17\\x73\\x87\\xca\\x5c\\x01\\xdf\\x6f\\x07\\xf8\\xe3\\x4d\\x25\\xed\\xbd\\x49\\xd8\\xb7\\x4e\\x31\\xa5\\xe6\\x5d\\xec\\x1f\\x87\\x60\\xfa\\x22\\xc0\\x0e\\x6f\\xb1\\xcd\\x55\\x5b\\xe6\\x8b\\x0a\\xb4\\x35\\x99\\xf0\\xb9\\xf4\\xa5\\x4a\\x7c\\xcb\\x06\\x26\\x83\\x89\\x5d\\x5e\\xf6\\x6d\\x24\\xdf\\xb1\\x67\\x8c\\xb0\\xd0\\xe8\\xc8\\x01\\xd8\\xe5\\xff\\xe7\\x9b\\x91\\x39\\xfc\\x96\\xd1\\x18\\xeb\\x39\\xb9\\xc8\\xd4\\x40\\x44\\x89\\x32\\x5d\\x45\\xb4\\xa3\\x20\\x2b\\xea\\xdc\\xa6\\x6f\\x83\\x1c\\x68\\xef\\xb8\\x15\\x94\\x15\\x81\\x93\\x0e\\xad\\x29\\xfd\\x5f\\x21\\x1b\\x90\\xe7\\xa3\\x9f\\x0d\\x4f\\xf4\\x8c\\x62\\xa5\\x45\\xe2\\x8a\\xc2\\xce\\x29\\xbe\\xdc\\x35\\x6d\\x92\\xfc\\x00\\x34\\x71\\x76\\xd7\\x76\\x23\\xe0\\xe1\\x80\\x9e\\xff\\x3f\\xe6\\x2b\\x75\\xa7\\xd9\\xde\\xb7\\x27\\xd8\\x61\\x72\\xd1\\x4e\\xdb\\xf2\\x78\\x9a\\x57\\x14\\x3c\\x69\\x92\\x5c\\x91\\x7d\\x43\\x3b\\x46\\x83\\xb0\\x69\\x3b\\x3c\\xd9\\xe7\\xe3\\x77\\x99\\x64\\x10\\x72\\x7f\\x5e\\x6f\\xb8\\xf5\\xcc\\xd1\\x86\\x0a\\x20\\x29\\x4e\\xcf\\x33\\xfa\\xf9\\x7a\\x1e\\x0f\\x85\\xb7\\x61\\x44\\x7d\\x47\\x61\\xb9\\x6e\\x4d\\xf1\\xb3\\x12\\xbd\\x41\\x4c\\xab\\xcf\\x49\\x84\\x97\\xb0\\xea\\xd6\\x7c\\xd1\\xe5\\x90\\x1b\\xbf\\x3a\\x16\\xa8\\x89\\x1c\\xcc\\xed\\x8a\\x90\\x7d\\xf8\\x87\\x26\\x95\\x2d\\x4a\\xb3\\x70\\xa6\\xb7\\xdf\\x29\\x42\\xcf\\x13\\x61\\x5a\\x5b\\xc1\\x2b\\x4e\\x10\\x6d\\xc3\\x01\\x3c\\x68\\xb8\\xfb\\x90\\x63\\x99\\xdf\\x15\\xf1\\xaa\\x90\\xd5\\x6a\\xa9\\x74\\xb1\\xd2\\xb2\\x8c\\x1a\\x84\\x53\\xb9\\xbf\\x07\\x92\\xa5\\x1c\\x97\\xce\\x8a\\x12\\xaf\\xc9\\x34\\x1b\\xb4\\xc0\\xc3\\x7b\\x12\\xdc\\xb1\\x2c\\x63\\x94\\x49\\x77\\x5d\\x9a\\xc5\\xc2\\xec\\x49\\x67\\x3d\\xa5\\xaa\\xf7\\x49\\x3e\\xd5\\xf1\\xf2\\x11\\x6e\\xae\\xf7\\x2b\\xb7\\xfb\\x1e\\x09\\x3e\\xde\\x2c\\x26\\x31\\x7f\\x4f\\x4b\\x6a\\xd5\\x85\\x34\\x62\\x05\\xdf\\x91\\xa6\\xe9\\x6b\\xc6\\x6d\\x30\\x64\\xbc\\xe9\\x52\\x39\\x8f\\xfc\\xe8\\x80\\x71\\xed\\x9f\\xf2\\x75\\x0c\\x65\\xc0\\xc3\\x04\\x12\\x5a\\xc2\\xca\\xdc\\x4f\\xef\\x71\\xa8\\x18\\x73\\x24\\x96\\xa8\\x4c\\xa5\\x74\\xd4\\x82\\xd5\\xa3\\xbb\\xa2\\x0e\\x16\\xdd\\x2f\\xa2\\x4d\\x32\\x70\\xf6\\xc6\\x09\\x92\\xf7\\xf6\\x3e\\x88\\xf5\\x2e\\xff\\x62\\x22\\x99\\x8e\\xb4\\x41\\x67\\x27\\x38\\x43\\x75\\xf5\\x9f\\x00\\xe4\\x75\\x12\\xee\\x46\\x4c\\x31\\x84\\xac\\xea\\xff\\x3c\\xcf\\xb0\\x6b\\xd1\\x5c\\x18\\x3c\\x5e\\x48\\x59\\x26\\x28\\x8b\\x99\\x7b\\xfa\\xaa\\xec\\xf6\\xec\\xbb\\xf7\\xd2\\xab\\xf4\\x90\\x6d\\xf7\\x6b\\x12\\x77\\xc5\\xf5\\xa8\\x7e\\x68\\x17\\xb1\\xc6\\x36\\xe9\\x1e\\xfd\\x7e\\xcc\\xf6\\x4f\"},\n{{0x32,0x34,0x65,0xd0,0x31,0x3d,0x10,0x01,0xa2,0x61,0xab,0xfd,0x44,0xfe,0x65,0xc3,0x8c,0x9a,0x00,0xca,0x0f,0x20,0x33,0x5d,0x65,0x53,0xde,0x49,0x26,0x99,0xfc,0x46,},{0xe2,0x2f,0x16,0xbd,0x4c,0xc7,0xe9,0x4c,0x46,0xba,0x31,0x96,0x1a,0xf8,0xc5,0x83,0xf9,0xd2,0x71,0x8c,0x68,0xf7,0x3d,0x85,0x06,0x9f,0x60,0x8e,0x15,0xba,0x87,0x66,},{0xda,0x3a,0xad,0xb3,0x43,0x60,0xb2,0xda,0x0c,0x26,0x54,0x2e,0xa7,0x1d,0xef,0xa8,0xa0,0xbf,0x7f,0xbd,0xae,0x3e,0xe9,0xe1,0x1c,0x84,0x08,0x4a,0xd0,0x5c,0xce,0x7b,0xa7,0xd9,0x4d,0xe2,0x5d,0x85,0x63,0x98,0x26,0x16,0xbc,0xdb,0x5b,0xb6,0x39,0x5f,0xac,0x4a,0x7e,0x84,0xbc,0x77,0xe2,0x1e,0xd3,0x6d,0xf7,0x5d,0xec,0x99,0x0b,0x06,},\"\\xbb\\x10\\x82\\xe1\\xcf\\xdc\\xd2\\x9b\\xfc\\xa2\\x46\\x4d\\x5c\\xe4\\x46\\xb5\\xba\\x65\\x4b\\xa5\\x8c\\x22\\x53\\x8d\\xa9\\x26\\xb8\\x30\\x3c\\xab\\xfd\\x28\\x4a\\x7b\\xd5\\x99\\x4a\\x78\\x6f\\xa6\\x6a\\xed\\xf0\\xe1\\x5f\\x20\\xc3\\x82\\xcd\\xac\\xf3\\xd1\\x45\\x57\\xff\\x7a\\x82\\x67\\xfa\\x04\\x67\\x2c\\xac\\xab\\x76\\x70\\x08\\x65\\x0a\\xa9\\xb4\\xa7\\xc9\\x07\\x1c\\x47\\x99\\xf1\\xff\\xa4\\x5c\\xa4\\xd5\\x86\\xe0\\x20\\x47\\x44\\x4c\\x14\\x23\\x19\\x43\\x46\\x7a\\x3a\\xba\\xef\\xa5\\x39\\x59\\xda\\x22\\x6e\\xb0\\xc1\\x53\\x92\\x01\\x97\\x60\\x15\\x96\\x97\\x74\\x82\\x93\\xc0\\x25\\x56\\x87\\x83\\x58\\x8a\\x39\\x10\\xe7\\x8e\\x5e\\xa4\\x27\\xc4\\x40\\x7a\\x89\\x01\\x06\\x1b\\x8b\\x99\\x2b\\x82\\xa2\\xdf\\x58\\xc0\\x4a\\x1b\\x2c\\x5f\\xad\\x11\\xc6\\xb3\\x79\\x85\\x6c\\x2e\\x0f\\xef\\x8a\\x95\\x0d\\xe7\\xe0\\xfc\\x22\\x31\\x03\\x09\\xe0\\x8b\\x13\\x2b\\x0c\\xce\\x4f\\xc1\\xec\\xbf\\x94\\x57\\x4a\\x38\\x8d\\x4a\\xe3\\x66\\x75\\xd3\\x29\\x9a\\x95\\x15\\x54\\xeb\\xf1\\x80\\xeb\\x38\\x1e\\x1b\\x5d\\xf9\\x77\\xd9\\x38\\x43\\x38\\x91\\xbc\\x47\\x8d\\x76\\x81\\x85\\x0b\\x9d\\xc9\\xc5\\xc7\\x69\\xd4\\x05\\xf5\\xd8\\x83\\x9f\\xc9\\x73\\x61\\xd6\\xcb\\x30\\x6c\\x20\\x30\\x26\\xcf\\x2e\\x2b\\x3d\\x39\\x84\\x9e\\x1f\\x4b\\x12\\x25\\xeb\\x25\\xef\\x8a\\xcd\\x40\\xb0\\x06\\xf2\\x0c\\x64\\x4d\\xb6\\x50\\xc7\\x5d\\x38\\xc0\\xfc\\xdd\\x48\\xf5\\x98\\xc7\\xb4\\xa6\\x01\\x06\\xe6\\x9e\\x19\\xcd\\x71\\x25\\x89\\xce\\xdc\\xcf\\x50\\x86\\x4e\\xa5\\xf9\\xe9\\x5e\\x01\\xf1\\xdd\\x85\\xc7\\x51\\x4f\\x2c\\x94\\xb2\\x83\\x59\\xde\\x41\\x32\\xb8\\x8c\\x3e\\xe1\\xd1\\x0a\\x80\\xa9\\xfa\\xdf\\xb6\\x90\\xe3\\xd8\\x86\\x41\\xb3\\x16\\x8f\\x0b\\x89\\x6a\\xf8\\x99\\x0a\\xdb\\xf0\\xe4\\xf8\\xe9\\xd3\\xf9\\xd4\\xcd\\x31\\x4e\\x12\\xc3\\xbc\\xe0\\xcc\\x87\\x38\\xe0\\xcf\\xc1\\x90\\x5b\\xe5\\xef\\xa0\\x71\\xf7\\x10\\xb3\\x2f\\x8e\\x58\\x98\\xc6\\x0e\\xb1\\xbb\\x8f\\xee\\xb7\\x40\\x00\\x56\\x0f\\x41\\xcb\\x2e\\xbc\\x32\\xb2\\x60\\x0b\\x69\\x80\\xa2\\xa4\\x06\\x4d\\xfa\\xa3\\x79\\x7e\\xc4\\x4c\\xfb\\x72\\xd3\\x79\\xf8\\x09\\x73\\x79\\xca\\xd6\\x7e\\xcd\\xc0\\xc3\\x24\\x14\\xfa\\x41\\xc7\\x2b\\x1b\\x9e\\x4e\\xdf\\x55\\x18\\xcb\\x39\\xfe\\x90\\x92\\xb4\\x39\\xaf\\x3a\\x4e\\xbd\\x5a\\xfe\\x79\\xbe\\xdc\\x0e\\xa8\\xbf\\x17\\x47\\x9a\\x28\\x21\\xf5\\xe9\\xbd\\x91\\xd7\\xf4\\xaa\\x5e\\x38\\x46\\x99\\x52\\x37\\x19\\xb6\\x95\\x7f\\x82\\x36\\x7c\\xd8\\x5f\\xea\\x9d\\xed\\x62\\x36\\xa2\\x07\\xc9\\x4c\\xb3\\x73\\xe3\\x39\\x3c\\xb4\\xfe\\x11\\xf9\\x0a\\x1b\\x87\\x79\\xe4\\xab\\x4c\\x34\\x66\\x13\\x6b\\xf2\\x1e\\x2a\\xab\\x78\\xf7\\xd2\\x72\\x6d\\xb6\\x41\\x4f\\xa5\\xc4\\xa3\\xf7\\x31\\x3a\\xd2\\x11\\x6a\\x6d\\x7c\\xe4\\x0a\\xaa\\x10\\x01\\xc2\\x70\\x4d\\x5b\\x05\\xae\\x54\\xc7\\xcc\\x6f\\x56\\x72\\x17\\xf1\\xa4\\x7b\\xfd\\x0e\\xe7\\x38\\xea\\xea\\x5e\\xad\\xb5\\x37\\x10\\x75\\xbe\\x07\\x6c\\x87\\x50\\xae\\xce\\xfc\\x41\\x7e\\xa7\\xbf\\xda\\xac\\x3c\\xc3\\x8b\\xf1\\x6c\\xc2\\x6d\\xf7\\x60\\x0e\\x3c\\x7e\\x8e\\x43\\x1f\\x26\\x76\\xfc\\x2a\\x8c\\x43\\xa6\\xa1\\x43\\x68\\xba\\x62\\xbb\\x32\\x43\\x9a\\x06\\xbe\\xac\\x38\\xa0\\x47\\xb3\\x74\\x5e\\x26\\xf4\\x07\\xad\\x82\\x3d\\x6a\\xd1\\xc0\\xb6\\xa4\\x43\\x41\\xe1\\x5f\\xc9\\xb3\\x31\\x21\\x4f\\xfc\\x89\\x69\\x82\\x11\\xb0\\x51\\x33\\xd6\\xd3\\x43\\x3b\\x5d\\x59\\xf7\\xab\\x4d\\x10\\x9e\\x54\\xe4\\xc5\\xd6\\xf3\\x2f\\xcf\\x72\\x30\\xfa\\x4e\\x25\\x28\\xc8\\x61\\xbb\\x21\\xcc\\xc9\\xe3\\x10\\xe9\\x49\\x7e\\x07\\x7e\\xa6\\x75\\x51\\x0d\\xa7\\x12\\xb1\\xa5\\xdf\\x57\\x5c\\x5d\\x1b\\xf7\\x36\\x2d\\x07\\x11\\x80\\x03\\x9a\\xec\\xfa\\xa5\\xc8\\x57\\x3c\\x24\\xc0\\xf4\\xeb\\xe8\\x1c\\x2f\\x88\\x9a\\xed\\x3d\\xe5\\xa0\\x00\\xbe\\x12\\xfe\\x3d\\x0a\\xf2\\xdc\\x2c\\xd4\\x24\\x0e\\x31\\x4a\\x17\\x6c\\x55\\x3e\\xfd\\x5c\\xba\\x79\\x8d\\x9f\\xf1\\xe3\\xd4\\xbd\\x9e\\x90\\xbb\\x81\\x13\\xe3\\x84\\x9d\\x73\\x5a\\xfa\\x4a\\xf6\\x94\\x5c\\xc5\\x7d\\x4c\\x37\\x8d\\xb8\\x4f\\x20\\x6e\\xf7\\xea\\xb1\\x1c\\x63\\x7a\\x7f\\x72\\x60\\xf1\\x22\\xa9\\x7d\\xff\\x67\\x47\\xe9\\xb4\\xc1\\x74\\xed\\x0d\\x64\\xf9\\xef\\xd7\\xfc\\xcc\\xf9\\x81\\x51\\x9e\\xc5\\x80\\xa8\\x18\\x25\\x47\\xd1\\x79\\x68\\xc4\\x01\\x51\\xfd\\xf6\\xd5\\x4b\\xc5\\x7a\\x91\\x15\\xf0\\x40\\xfa\\xb5\\xc1\\x00\\xde\\xb0\\x39\\x12\\x2b\\x7d\\x2b\\xfd\\x98\\xb6\\xad\\xf3\\x8f\\x42\\xb2\\x96\\xea\\x3b\\x37\\x8a\\x90\\x42\\x59\\xb7\\x5d\\x60\\x70\\x3b\\x48\\x40\\xb3\\xf5\\xda\\x09\\x62\\x0a\\x54\\x77\\x62\\x80\\xe9\\xca\\x9e\\x8c\\xd9\\x24\\xae\\xd2\\xb5\\xdd\\x2b\\x49\\x83\\x4e\\x58\\x1c\\xae\\xd5\\x27\\x1c\\xd7\\x8c\\xe0\\x8e\\x4b\\xba\\x49\\xb5\\x9c\\xd7\\x7c\\x1b\\x62\\x76\\x64\\x91\\x48\\xab\\x72\\x47\\xf9\\x7f\\xc0\\x13\\x16\\x35\\xde\\x47\\x4d\\x3c\\x23\\x49\\x3c\\xa9\\x8d\"},\n{{0x60,0xff,0xdb,0xae,0x00,0x3f,0xa2,0x79,0x4f,0xca,0xbb,0xf8,0xf5,0xb4,0x16,0x44,0xfe,0x3a,0x7f,0x44,0xed,0x6c,0x83,0x41,0x93,0xda,0x07,0xa9,0xdc,0x5e,0x26,0x65,},{0x35,0xb5,0xeb,0x31,0xab,0x55,0x64,0x92,0x57,0x8b,0x3d,0xbd,0x6c,0xf1,0x68,0x7d,0x1f,0xdb,0x21,0x6a,0x72,0x58,0x18,0x07,0x96,0x63,0x48,0x2f,0x22,0x1c,0xe4,0x21,},{0xb8,0xf3,0xe1,0xf3,0x78,0x5a,0x2a,0x39,0xbb,0x08,0x6c,0xa4,0x65,0xc0,0xab,0xf0,0xa3,0xe8,0x74,0x43,0x22,0x5a,0xc6,0xe9,0x66,0xed,0x9b,0x45,0x31,0xc5,0x4a,0x89,0x4a,0x9a,0xbd,0x01,0xac,0x31,0xb8,0x57,0x57,0xfe,0x75,0x30,0x8c,0x95,0x94,0xff,0x65,0xf9,0x7c,0xdd,0x91,0xe8,0xd8,0xa9,0x3c,0xf1,0x2b,0x9e,0x6d,0xbe,0xe9,0x0b,},\"\\x3f\\x8f\\xf2\\x0b\\xb4\\xf0\\x08\\x34\\xc8\\x0f\\x2e\\xe6\\x89\\x3d\\x6f\\x73\\xbf\\x7a\\xce\\x27\\x29\\x60\\x1b\\xb2\\x6a\\x0f\\xb2\\x72\\xa4\\xd0\\xee\\xa1\\xfa\\xe1\\xd3\\x06\\xac\\x2c\\x5f\\x32\\xad\\xd6\\x01\\x35\\x85\\x1d\\xa2\\x7e\\x4f\\x12\\xe6\\x4e\\xa5\\xe9\\xe9\\x96\\x0b\\x13\\x83\\xb0\\x4c\\xe0\\x5a\\x98\\xb0\\x41\\x4d\\xad\\x97\\x1e\\xa9\\x89\\x44\\x87\\x1d\\x41\\x5c\\xc2\\xc4\\x6d\\xa4\\x03\\x97\\x6d\\x9f\\x21\\x93\\x89\\x58\\xd4\\xea\\x8c\\x79\\x03\\xb1\\x4f\\x2a\\x44\\x85\\xfd\\x69\\xaf\\xb2\\x4a\\xbe\\x10\\x2d\\x8f\\xec\\x26\\x6f\\xb4\\x68\\xb4\\x11\\xeb\\x20\\xa3\\x39\\x67\\x7d\\x88\\xeb\\x31\\xc9\\x97\\xb4\\xdc\\x88\\x56\\x13\\xf0\\xbe\\x7c\\x70\\xda\\xf8\\x56\\xa3\\xdf\\x92\\xda\\x96\\x02\\xfb\\xa2\\xe6\\x74\\x9d\\x2f\\x42\\x6b\\xee\\xf6\\x86\\x62\\xd5\\xb0\\xc2\\xfd\\x31\\x32\\x1b\\x22\\xb5\\xec\\x59\\x7d\\xa5\\xd7\\xe6\\xa2\\x88\\xeb\\xd9\\x44\\x3c\\x5f\\x39\\xeb\\x87\\xdc\\xf4\\xa5\\xad\\x9d\\x56\\xc6\\xba\\xf6\\x08\\x09\\x96\\xa7\\x79\\x36\\xbd\\x87\\xdc\\x3c\\xb4\\x2e\\xd4\\xc4\\xd4\\x26\\x88\\xa9\\xe1\\x93\\x82\\x9b\\x76\\x1f\\xf3\\x20\\xe2\\xa6\\x6c\\xc6\\x76\\x48\\xe7\\x0e\\xea\\x3a\\x1f\\x2f\\x9b\\x9d\\x5b\\x42\\x02\\xfb\\x5a\\x39\\xe9\\xad\\xc6\\x09\\x08\\x6a\\x9b\\xe2\\xa8\\x32\\x3a\\xc6\\x69\\x31\\xbd\\xf6\\xc5\\x04\\xd3\\x33\\x62\\x11\\xe4\\x6f\\xde\\xfc\\x48\\x1f\\xbf\\x17\\xf6\\x13\\xda\\xb1\\xfc\\x5c\\x09\\x7c\\x92\\xdb\\x06\\x09\\x90\\x6d\\x78\\xb2\\x5a\\x45\\x5a\\x30\\x45\\x71\\x8e\\xfd\\x3e\\x3b\\x14\\xe2\\x52\\xb1\\xae\\x59\\xc7\\xc3\\x89\\x3e\\x31\\x91\\x3b\\x2c\\x26\\x4c\\x0f\\xfc\\x3b\\x60\\x6c\\xa1\\xb0\\x1d\\xc4\\x7e\\xe8\\x28\\xa0\\x8e\\x46\\xaf\\x60\\x4e\\x59\\x0d\\xef\\x44\\xd2\\x7a\\xab\\x93\\xa4\\x03\\x25\\x1f\\xca\\x07\\x72\\xe9\\xdf\\x0f\\xab\\x7a\\xf0\\xcb\\xc5\\x18\\x1e\\xfd\\xa4\\xda\\x91\\x3d\\x8e\\xb6\\x45\\x2f\\x6c\\xec\\xbd\\xa2\\x04\\xbc\\x72\\xd7\\xc9\\x90\\xf6\\x0c\\xe0\\xdd\\x83\\xc6\\x34\\xe9\\x12\\x23\\x60\\x91\\xb0\\xa6\\x67\\x3a\\x7c\\x89\\xea\\x59\\x30\\x8d\\x55\\xbd\\x7e\\x63\\xa8\\x52\\x67\\x74\\xcb\\xdd\\x7a\\x13\\x39\\xfa\\xc2\\x12\\x4c\\x90\\x22\\xab\\xd6\\xfe\\xce\\x7f\\x2d\\xae\\xdf\\xd8\\x7f\\xa6\\x83\\xdc\\x0e\\x3e\\xf4\\x08\\x06\\xa0\\xab\\x19\\x87\\x69\\xd3\\xa9\\x9f\\xe8\\x1a\\x99\\xb6\\x86\\x00\\x31\\x90\\x87\\xaf\\xa4\\xea\\x79\\xd7\\xee\\x45\\xda\\x9c\\xd4\\x08\\x09\\xf4\\xee\\x8f\\x4e\\x25\\xa0\\x17\\x75\\x21\\xee\\x9d\\xba\\x8b\\x56\\x21\\x2e\\x88\\x71\\x9b\\xb7\\x36\\x73\\x36\\xf4\\xa7\\xbc\\x71\\x22\\xb4\\x1a\\x7d\\xfa\\xa2\\x67\\x2f\\x92\\xf2\\x34\\x03\\xa1\\x0c\\x4f\\xb2\\x53\\x88\\xc6\\xb2\\x00\\x81\\x09\\x3d\\x49\\xf3\\xbe\\x8a\\x9e\\x1c\\x63\\x4e\\xf7\\xba\\x96\\xb6\\xd5\\x23\\xdd\\x6f\\xf6\\x13\\xc0\\xa2\\x3b\\x60\\x45\\x70\\x26\\xcd\\x48\\x5b\\xa8\\xdb\\x61\\xd8\\x0a\\x0d\\xc6\\x59\\xd9\\xaf\\x42\\xa3\\x8c\\xae\\x77\\x7f\\xec\\x68\\xe3\\x9c\\x52\\x98\\x6f\\xf9\\xfc\\x20\\x78\\x9c\\x10\\x58\\x51\\x07\\xc0\\x40\\x47\\xb6\\x6b\\xa1\\x4e\\x93\\xfb\\x90\\x4e\\xa9\\x0d\\xf7\\xac\\x9f\\x01\\x54\\xc9\\x6f\\x32\\x36\\xac\\xf6\\xdc\\x8b\\x44\\xf5\\x54\\xc0\\xcd\\x51\\x31\\x93\\xe5\\xdf\\xd8\\x7e\\x08\\x5a\\xd4\\xb3\\x8a\\xa4\\xc5\\xe3\\x6b\\x24\\x27\\x72\\x20\\x88\\x81\\x6e\\xcd\\x2b\\xc3\\xa3\\xdd\\xa0\\x1e\\x4f\\xb3\\xff\\x5e\\xec\\x7a\\x64\\x17\\x32\\x2b\\xa6\\xa2\\x77\\x73\\xd2\\x44\\x95\\xa8\\x39\\x19\\x4a\\x4a\\x58\\x2f\\xe5\\xab\\xdb\\x8b\\x5d\\x53\\x3a\\x24\\x26\\x25\\x89\\x24\\x1f\\xc8\\x1f\\xdf\\x5e\\x79\\xfd\\x26\\x77\\x64\\x28\\xf8\\xe1\\xce\\x9e\\x92\\x6c\\xf2\\x72\\x71\\x6e\\x75\\x83\\xab\\xfc\\x67\\xa9\\x4a\\xae\\x08\\x16\\xc1\\x00\\x0a\\x19\\x61\\x70\\xbb\\xff\\x1f\\x45\\xe5\\xed\\x9e\\x26\\x7a\\xce\\x1e\\x4d\\x91\\x5d\\xce\\x72\\x16\\xc5\\xf4\\x04\\xde\\xf6\\xfe\\x2b\\xd8\\xb2\\x8b\\x2e\\xcc\\xf3\\xe2\\xae\\xa0\\xc0\\xd6\\x62\\x63\\x90\\x27\\x4e\\x47\\xe7\\x45\\xed\\x3a\\x23\\xbc\\xfd\\x21\\xd2\\x84\\xc3\\x95\\x37\\x9d\\xc0\\x20\\x80\\xf0\\x79\\x36\\xbc\\x15\\x4e\\x7b\\x99\\xee\\x73\\xdb\\x18\\x8b\\xd2\\xa3\\x94\\xe0\\x3a\\x01\\xff\\xe2\\xd1\\xb3\\x30\\xce\\xb7\\x21\\x58\\xf9\\x58\\xc7\\x16\\xa8\\x17\\x11\\xdb\\xf6\\x5a\\xff\\x8c\\xd1\\x2f\\x5d\\xfa\\x53\\xb3\\x76\\xeb\\xb8\\xb9\\x8f\\x86\\x28\\xf1\\x7e\\xf8\\xb2\\xab\\x9c\\x0b\\xb6\\x84\\x12\\xf4\\xe3\\x47\\xa6\\x33\\xe2\\xf8\\xda\\x1a\\x55\\x6d\\x96\\xf4\\xaf\\x72\\x11\\xc0\\x78\\x07\\x9c\\x10\\x54\\x1c\\x07\\xdc\\x37\\x22\\xd1\\x8d\\xab\\x8f\\xa8\\xbc\\x49\\x25\\xab\\xa5\\xc9\\x66\\xf8\\x05\\x04\\x03\\x22\\xdf\\xbb\\xbe\\x87\\xfb\\xfe\\xb1\\x96\\x1f\\x5c\\xcd\\x40\\xa9\\x1b\\x99\\x7e\\x54\\x31\\x5a\\x7e\\xef\\xc3\\xa4\\x7b\\xb0\\xc8\\x7d\\xc2\\x37\\x55\\xce\\x72\\x27\\x57\\x49\\x96\\xf4\\xbe\\x7a\\xa3\\x44\\xfe\\x0d\\x17\\xb9\\x7b\\xc5\\x0c\\x58\\x38\\xf9\\x92\\x92\"},\n{{0x17,0x4e,0x99,0x3d,0x9b,0x81,0xf2,0xaf,0x67,0xe9,0xff,0xb8,0xeb,0xd5,0xda,0x41,0x79,0x66,0xa9,0xe7,0x7f,0x66,0xc6,0x5c,0x76,0x77,0x38,0xfe,0x83,0x57,0xd0,0x7c,},{0x3b,0xb7,0x38,0x6f,0x1b,0x1c,0xbf,0xae,0x55,0x37,0x03,0x83,0x3e,0xbc,0xbf,0xe2,0xdf,0xff,0x8c,0x89,0x9a,0x07,0x92,0xd7,0xce,0x23,0x22,0xb5,0xba,0x64,0x5a,0x5f,},{0xe6,0x07,0xbc,0x9a,0x53,0x60,0xb3,0x1d,0xa5,0x6b,0xe1,0xc5,0x44,0xc2,0x00,0x02,0x84,0x95,0x1d,0x86,0x89,0xf4,0xb7,0x22,0xbc,0x46,0x73,0xa0,0xc8,0x48,0x9b,0x84,0x48,0x3e,0xd8,0xe7,0x6e,0x29,0x7e,0xa0,0x46,0xe8,0x5b,0x37,0xba,0x56,0x30,0x58,0x5e,0x53,0x75,0x56,0x6a,0x18,0x7a,0xfb,0x56,0x96,0x66,0x1e,0x5b,0xfd,0xc1,0x0e,},\"\\xa4\\x01\\x75\\x0a\\xfc\\x48\\x37\\xdf\\xe3\\xaa\\xcc\\x28\\x4a\\x59\\x71\\x45\\xdf\\xef\\x02\\x62\\x9e\\xf8\\x7b\\xd0\\x93\\x8d\\x44\\x39\\x79\\xdf\\x76\\xf2\\x9f\\xcd\\x66\\xa5\\xb7\\x1e\\xa8\\xab\\x78\\x72\\x77\\xe3\\x05\\x6f\\x6e\\xa1\\x1b\\x08\\xbd\\x23\\x89\\x79\\xf9\\xd3\\xb0\\x62\\x53\\x8c\\x4d\\x60\\x40\\xa8\\x6b\\x6e\\x32\\x04\\x7a\\xec\\xc5\\x9c\\x23\\x77\\xad\\x0e\\xa4\\xc4\\x0c\\x79\\xff\\x9f\\xe9\\x8c\\x95\\x8b\\x2b\\xf2\\x5f\\x2f\\xd6\\x34\\x24\\x32\\x63\\x6f\\x5f\\x7d\\x5b\\xb0\\xd2\\xec\\xf1\\x81\\x83\\x42\\x6c\\x73\\x14\\x79\\x84\\xd9\\x5b\\xbe\\x16\\x2e\\x11\\x97\\x2d\\xdb\\x78\\xa2\\xa7\\xc3\\x45\\xc5\\xc0\\xbb\\xba\\xba\\x9c\\xf3\\x8a\\x2d\\x5d\\xd5\\x09\\xa7\\xdf\\x8b\\x84\\x28\\x74\\xa9\\x6e\\x64\\xb5\\xd6\\x4f\\x5c\\x41\\xa2\\x1d\\x20\\x8d\\x14\\xce\\xa7\\x06\\x6c\\xf2\\x2d\\xee\\x0c\\xa4\\x1a\\xa4\\x6a\\xb9\\x21\\xd4\\xce\\xec\\x89\\xec\\x87\\x3f\\x77\\x96\\x0e\\xda\\x60\\xd9\\x67\\x6c\\xfd\\x0d\\xbf\\xae\\xc8\\x72\\xc2\\xad\\xe8\\xfb\\xa4\\x28\\x5a\\xac\\xd5\\x27\\x14\\x3a\\xe0\\x34\\x1d\\x67\\xd0\\x07\\x81\\x19\\x65\\x3b\\x5d\\x23\\xd4\\x6e\\x6e\\xf7\\x02\\x64\\xb1\\xb0\\x91\\x38\\x70\\x87\\x76\\x23\\x71\\x6d\\x0f\\x1a\\x59\\x02\\x1b\\xe7\\x4c\\x91\\x4b\\x43\\x24\\x71\\xa4\\x3a\\x29\\xf2\\xb6\\xdb\\xeb\\x6a\\x22\\x3e\\x2d\\xba\\xab\\xb8\\x20\\xb4\\xad\\xbe\\x33\\x78\\x29\\xe1\\xde\\x0c\\x18\\x4d\\xd0\\xd0\\x9f\\x9d\\x01\\xd4\\x25\\x27\\xe5\\xd4\\x0a\\xbb\\xda\\xcc\\x8a\\xc0\\xf1\\xb2\\xc5\\xc1\\xcb\\x2f\\x23\\x87\\x6d\\x2d\\x1b\\x6b\\x43\\xdf\\xe4\\x82\\xf9\\xd4\\x5a\\x18\\xf5\\xc2\\x2b\\x15\\xf1\\xfe\\x52\\x1e\\xf5\\x7b\\x08\\xae\\xc6\\xa3\\x03\\x39\\x25\\xc7\\x45\\x4c\\x93\\xe6\\x31\\x9e\\x77\\x8a\\xc4\\x94\\xfb\\x14\\x0a\\xe5\\xf1\\xa3\\x1c\\xc8\\x32\\xca\\x24\\x88\\x65\\x10\\x04\\x06\\x3b\\xcf\\xf8\\xfd\\x9a\\xe9\\x26\\x6a\\xf5\\x27\\xf2\\xc3\\x1f\\x6a\\xcb\\x8f\\x3d\\xeb\\xd9\\x97\\x8e\\xf9\\xdf\\x01\\x08\\xe3\\xd5\\x0c\\x49\\x19\\x90\\xc9\\x0d\\xd8\\xee\\x9d\\x64\\xea\\x4e\\xbf\\xd7\\x11\\xc9\\x9d\\x90\\x44\\xec\\x11\\x34\\x2c\\x53\\x83\\xca\\x39\\x23\\x2e\\xd9\\x7a\\x07\\xe4\\xdc\\x51\\xdb\\x4c\\x1f\\xe9\\x47\\x34\\x8d\\xff\\xe7\\x0a\\x95\\xc9\\x9d\\xb1\\x47\\x51\\x31\\x48\\x01\\xf1\\x3f\\xa2\\xbf\\x42\\xd8\\x67\\x37\\x5a\\x08\\xee\\x9b\\x3b\\x79\\x9e\\x0b\\x15\\x27\\x8e\\x95\\xe9\\x1a\\x89\\x68\\x06\\x4d\\x6d\\xfd\\x8f\\x51\\x15\\x43\\x8c\\xcb\\x8b\\x51\\x6c\\xa0\\xc4\\x1d\\xbb\\x19\\x87\\x3c\\x6e\\x10\\xa2\\x36\\xec\\xc2\\xda\\xd5\\x22\\xf8\\x0f\\x01\\xc1\\x4e\\x2f\\xa1\\x4a\\x0d\\x79\\x2b\\x9f\\xc4\\x86\\xc6\\xfb\\x0e\\xfb\\xdf\\x21\\x30\\xf0\\x2d\\xf1\\x49\\x7d\\xb5\\xab\\xa8\\xbe\\x61\\xca\\x70\\xb2\\x93\\x88\\xe4\\xee\\xc7\\xe0\\x69\\x4a\\x38\\xc0\\xd0\\x3c\\x59\\xbb\\x6a\\x2d\\xc3\\xcc\\xd6\\xdd\\xe1\\xe2\\x9e\\xe2\\xc1\\xb3\\x25\\xac\\x72\\xaa\\x8e\\x6f\\xab\\x91\\x38\\xf8\\xb6\\xf5\\xd3\\x24\\xd4\\x6a\\xf3\\xa3\\x54\\x2c\\x8b\\xd8\\x7c\\xb0\\x4f\\xaf\\xc5\\x4b\\x5d\\xb8\\x27\\xde\\x60\\x67\\x62\\xa0\\x97\\xb6\\x22\\x79\\x9c\\xa8\\x27\\xbd\\xa9\\xc1\\xc0\\xbb\\x26\\x7e\\xba\\x82\\x54\\xa8\\x1c\\x6b\\x85\\x8a\\x37\\x5b\\x94\\xbd\\x09\\xf3\\x9e\\xeb\\x88\\xcb\\x14\\xb8\\xd4\\x6e\\x47\\x40\\xdc\\x1a\\xb4\\x2a\\x89\\x5f\\x86\\xd2\\xc5\\x7f\\xc2\\x8b\\x07\\xb7\\xf6\\x0f\\xc4\\xf8\\x84\\x7b\\x8b\\xc8\\xad\\x83\\xa2\\x48\\x1a\\x28\\xf2\\x9b\\xca\\x35\\x10\\xff\\x8b\\xf1\\xdd\\x75\\x81\\xe3\\x35\\x71\\x64\\xf4\\xfe\\x92\\x0f\\x9d\\xe8\\x39\\x37\\x6d\\xe0\\x64\\x90\\x0d\\xc7\\xf8\\xbc\\xf5\\x11\\xdc\\x57\\x2e\\x0f\\x0f\\x6a\\x75\\xb9\\x29\\x79\\x7d\\xa4\\x1c\\x52\\xea\\xe6\\xfe\\x13\\x75\\x0c\\xe3\\x51\\xe8\\x76\\x76\\x30\\xba\\xdf\\x6d\\x7d\\x4e\\xab\\x90\\xcd\\x19\\x04\\xc9\\x6c\\x04\\x8a\\x9a\\xcb\\x21\\x3a\\x9e\\x5b\\x86\\x46\\x15\\x73\\x8a\\x84\\xf2\\x22\\x98\\x6a\\xc2\\x35\\x54\\xcf\\x4c\\xe5\\x4e\\x80\\xab\\x57\\x33\\xc0\\x65\\xb8\\x04\\x59\\x92\\x1d\\xd3\\xd8\\x37\\x2d\\x0e\\x85\\x94\\xd4\\x36\\x43\\x51\\xbf\\x04\\x1c\\x14\\x6f\\xa8\\xd2\\x3a\\x19\\x3e\\xb8\\x07\\xec\\xe2\\x3f\\x24\\xab\\x65\\x95\\xe9\\x32\\xc9\\xce\\x1a\\x75\\x9b\\xf7\\x88\\x91\\x4d\\xb0\\x08\\xe8\\x70\\x98\\xdd\\x81\\x46\\x5e\\x26\\x10\\x64\\x7a\\xc3\\x8e\\x08\\x86\\x66\\xf6\\x0e\\xc5\\xd0\\xe2\\x17\\x33\\x20\\xa4\\x0c\\xd9\\x85\\xf0\\xe0\\x0d\\xbc\\x2b\\x45\\x70\\x72\\x74\\x83\\xa8\\xc2\\x5f\\x6f\\xc1\\xe0\\x93\\xbb\\x57\\xcc\\xaf\\xd1\\xca\\x20\\x2f\\x29\\x86\\xc7\\xc5\\x54\\x0a\\x7c\\x3e\\x10\\xc4\\xa6\\xfc\\x26\\xd1\\xd6\\x2c\\x2c\\xa5\\xaf\\x83\\x05\\xce\\xeb\\xe4\\x2f\\xf9\\x6e\\x7d\\xc5\\x48\\x21\\x43\\x75\\xe8\\xa7\\xf9\\xf7\\x12\\xba\\x8b\\xd8\\x75\\xe4\\x3c\\xa1\\x0c\\xf9\\xb1\\x83\\xf0\\xc8\\x51\\x95\\x12\\x92\\x85\\x38\\xa4\\x78\\xcb\\x98\\x25\\x9b\\xd8\\xb3\\xe3\\x34\\xbc\\xc4\\x63\\x55\\x95\\xca\\xd3\"},\n{{0xe5,0x37,0x15,0xfe,0xc9,0xd3,0xb2,0x0e,0x9c,0x29,0x91,0xe5,0x4b,0x5e,0xb0,0xa8,0xcc,0x81,0x87,0x55,0x69,0xc9,0x5e,0x22,0xa2,0x00,0x13,0x60,0x02,0x17,0x60,0x04,},{0x53,0x51,0x89,0x9b,0x69,0xb2,0x11,0x6b,0xc7,0xf8,0xa8,0x81,0x4d,0x1e,0x5b,0x9f,0xc7,0x85,0x69,0x8b,0xeb,0xd9,0xab,0x14,0x27,0x7c,0x3e,0xcc,0x01,0xef,0x8b,0x1d,},{0x3d,0x0a,0xdc,0xe7,0x7a,0x4e,0x04,0x6f,0xcb,0x9b,0x49,0xad,0x5e,0x6c,0x68,0x09,0xc8,0xac,0x33,0x6c,0x73,0x34,0x04,0xe5,0xd3,0xf0,0x15,0xc9,0x22,0x5c,0x3d,0xf4,0x6e,0xf2,0x1e,0xa3,0x4c,0xff,0xb3,0xaf,0x69,0x97,0x4f,0x8b,0x7e,0xab,0x2d,0x23,0xfc,0xd5,0xa1,0xe1,0x75,0x3a,0x40,0x23,0xde,0xb3,0x81,0x86,0x29,0xa9,0x8a,0x0b,},\"\\x84\\x31\\xcd\\x16\\xd5\\xc0\\x93\\x77\\x5e\\x18\\xc0\\x82\\x52\\xc4\\x3f\\x95\\xb1\\x01\\x7e\\xb7\\x11\\xfc\\xaf\\x73\\xe1\\xe0\\x0c\\x0c\\xd6\\xf3\\x44\\x87\\x44\\xab\\x9b\\x0e\\x64\\x33\\x55\\x18\\xc4\\x83\\xae\\x94\\xde\\xb9\\x76\\x77\\xf8\\x18\\xf0\\xe8\\x1a\\x74\\x90\\x61\\x5b\\x71\\x41\\xb9\\xc3\\x5f\\x80\\x55\\x6e\\x69\\x71\\xce\\xa2\\x8e\\x9a\\x32\\xc3\\x28\\xcc\\x26\\x69\\xfc\\xa5\\xb1\\x23\\xcb\\x66\\x2d\\xeb\\xab\\x2b\\x98\\x15\\x77\\x64\\x66\\x80\\x70\\xe1\\x8e\\xdf\\x76\\x1a\\xe1\\x96\\xbd\\x4b\\x24\\x4f\\xea\\x7b\\x74\\x98\\x45\\x16\\xbe\\x2c\\x00\\x73\\x9e\\x76\\xe6\\xc4\\xb6\\x21\\xcb\\x39\\x83\\x76\\x5a\\x20\\xd8\\x47\\x78\\xd5\\xa4\\x35\\x0b\\x16\\x8f\\x6a\\x0f\\x71\\x2a\\x98\\x20\\xa8\\x5a\\x63\\x6f\\xaf\\x92\\xc7\\x89\\xc4\\x28\\xcf\\xd2\\x96\\x2e\\xd2\\x07\\xc3\\xac\\x88\\x99\\xc2\\x58\\xca\\xc1\\xad\\xb5\\x15\\x9f\\x76\\x4b\\xa3\\x72\\x29\\xc5\\xcb\\xf7\\x83\\xfc\\x9a\\xa4\\xd1\\xea\\x46\\xec\\xc8\\x5f\\xe0\\x96\\x14\\x85\\xd4\\xfc\\x5c\\xb2\\x1d\\xf0\\x01\\x2a\\xc9\\xb9\\x55\\x37\\x3b\\x14\\x22\\xe5\\x1a\\xfa\\x1c\\x55\\x09\\x88\\x86\\x2c\\x86\\x13\\x3b\\x76\\x0a\\xa6\\x30\\xfc\\x0a\\xce\\xe8\\x98\\x91\\x17\\xd1\\xdd\\x96\\xe3\\xe6\\x28\\x7b\\x69\\x28\\x7c\\x59\\x0b\\xdc\\xa9\\xcb\\xc8\\xee\\xce\\xf2\\x81\\xee\\x6d\\x1c\\x8d\\x88\\x82\\x2b\\xfe\\xa5\\xfa\\x0f\\x53\\x0f\\x23\\x27\\x80\\x93\\xc7\\xc8\\x5a\\x0d\\x44\\xc3\\xa7\\x74\\x04\\xee\\x79\\xf1\\xc8\\x36\\x8c\\xd7\\x32\\x1b\\xf1\\x48\\xfd\\xa4\\xdc\\xf2\\xeb\\x07\\xe4\\x63\\x0e\\xa4\\x22\\x58\\x75\\x86\\x37\\x17\\x80\\x51\\x45\\x36\\xb8\\x94\\xc5\\x24\\xe6\\xb8\\x3d\\x5a\\x76\\xa1\\x5c\\x83\\xe9\\x5a\\xb3\\x14\\xe0\\x7b\\x34\\xb9\\x8c\\xd9\\x9e\\x07\\x70\\xb4\\xeb\\x9b\\x3f\\x3f\\x50\\x5b\\xae\\x8a\\x06\\xf7\\xf9\\x50\\x25\\x8d\\x79\\x07\\x48\\x10\\x71\\x95\\xeb\\x4f\\x6b\\x84\\x84\\x0f\\x8c\\x05\\x90\\x72\\x73\\x96\\xed\\x14\\xe3\\xf5\\x32\\x39\\x47\\x6c\\x4d\\x2a\\x72\\x69\\xb2\\xe1\\xf9\\x72\\xfb\\xff\\x33\\xe4\\x72\\x44\\x26\\x74\\x5e\\xc8\\x86\\xa3\\x29\\x16\\x29\\x5e\\x70\\xd4\\x68\\xd0\\x6c\\x7d\\xbb\\x5f\\xf9\\xa3\\x54\\xe1\\xac\\x90\\x3b\\xb4\\x5c\\xa5\\x26\\xf0\\x8b\\x49\\xa6\\x5e\\x82\\x29\\x7d\\x8d\\xd3\\xfb\\x25\\xaa\\x42\\x8f\\x64\\x34\\x5b\\xca\\x97\\x40\\xd9\\x07\\x8d\\xac\\x9e\\x11\\x38\\xc9\\x21\\xbd\\xd7\\x48\\x81\\x67\\x3d\\x49\\xd0\\xcd\\x20\\x06\\x81\\x17\\x23\\xde\\x28\\x7c\\x6c\\x95\\x83\\xe4\\x56\\xa0\\x1a\\xb1\\xa3\\x4d\\xfa\\x1e\\xaa\\x96\\x3b\\x71\\xe8\\xbc\\x7f\\xa8\\xa9\\x8c\\xad\\x4f\\x94\\x1e\\x4b\\x37\\xb6\\x0e\\xef\\x92\\x3b\\x32\\x94\\x88\\x23\\x50\\xb3\\x8e\\xa4\\xea\\xc0\\xe9\\x23\\x2e\\x93\\xc5\\x32\\xdb\\x5d\\x7e\\xec\\x8e\\xcf\\xae\\x65\\xe0\\x80\\x47\\x30\\x78\\x77\\x7d\\xdf\\xdd\\x11\\x50\\x8a\\x6e\\x59\\xf0\\xeb\\xaa\\x3f\\x60\\x44\\x1f\\x82\\xa7\\x1a\\x73\\xc8\\x4b\\xca\\x06\\xa3\\x71\\xff\\x5c\\x9f\\x77\\x21\\x3a\\x2d\\xb7\\x95\\xd4\\xa8\\x89\\x78\\x23\\xd8\\x8f\\xd9\\x2a\\xe3\\xe0\\x57\\xe8\\xbb\\xd8\\x0c\\x99\\x0a\\xf8\\x38\\x6b\\xdf\\x26\\xf1\\x2d\\x97\\x3c\\x8c\\x5f\\xf9\\xed\\x6f\\x7b\\x2d\\x8e\\x61\\x83\\xcf\\x6e\\x68\\xf3\\xbb\\x89\\x8f\\x59\\xa9\\x3e\\xc4\\xde\\x3b\\xea\\x60\\x5a\\x5d\\x8b\\x15\\xdf\\xab\\x71\\x3f\\x35\\x85\\xc4\\x8d\\xc9\\xa5\\x76\\x82\\x42\\xb3\\x31\\x01\\x43\\x80\\x30\\xe7\\x04\\x48\\x80\\xd1\\x7c\\x2e\\xe8\\x4f\\x89\\xd2\\x6a\\x1f\\x7b\\x19\\x86\\x19\\x3f\\x96\\x63\\xc5\\x87\\xd5\\x0c\\xa9\\xdd\\xf6\\x18\\x6a\\x51\\x76\\xaf\\xef\\x1a\\xdb\\x24\\x81\\xb7\\x92\\x54\\xb7\\x8d\\x3b\\x34\\xc6\\x97\\x90\\xeb\\x28\\xb9\\x0b\\x14\\x61\\x17\\x0c\\x3d\\x73\\x81\\x83\\x76\\xcd\\xf3\\x71\\xaf\\x0a\\x0f\\xea\\xf1\\x4f\\xdf\\x70\\x16\\xed\\x6e\\x7f\\x08\\xc0\\xc1\\x4b\\x52\\x70\\x5c\\x86\\xd4\\xf0\\x00\\x3b\\x5e\\x45\\xf9\\x74\\xc0\\x64\\x16\\xcc\\xb5\\xca\\x3e\\x9d\\x52\\x9a\\xa9\\xd4\\x15\\xc2\\x5a\\x44\\x6f\\xa2\\xd6\\x9e\\x82\\xf4\\x99\\x4e\\x57\\xe9\\x22\\xc1\\x7c\\x1c\\x34\\x2d\\xd7\\x28\\x1e\\x41\\x00\\x52\\xd9\\xe4\\xaa\\x1b\\x30\\x9b\\x7d\\x47\\x0d\\x45\\x8c\\x66\\x3e\\x17\\xff\\x25\\x00\\xd0\\xbb\\x8e\\x46\\xa9\\xc4\\x36\\x7e\\x09\\x1c\\xaf\\x87\\xdd\\xfc\\x06\\x2a\\xae\\x08\\xa6\\x5c\\xb9\\xe0\\xea\\xa7\\x1c\\x99\\x45\\x9c\\x5e\\x7c\\xb1\\x12\\xa2\\xee\\x98\\xa5\\xe4\\xcb\\xee\\x0d\\xc5\\x20\\xf8\\x7c\\x30\\x22\\xda\\x65\\x49\\xbe\\x1e\\xe7\\x0a\\x0a\\x73\\xad\\x84\\x99\\xc9\\x7d\\xd0\\x6a\\xa1\\x4c\\x9f\\xd8\\x62\\x8a\\x92\\xca\\x6d\\xb4\\x87\\x32\\x2d\\xb9\\x59\\x8a\\xda\\x1f\\xce\\x28\\xf4\\xb9\\xfc\\x1d\\x3c\\xc3\\x9d\\xcf\\x2e\\xd1\\xdf\\x3d\\x86\\x2d\\x87\\xf5\\x5c\\xc1\\x01\\x6f\\xb9\\xe7\\x3e\\x7c\\xc8\\x97\\xb9\\x70\\xd5\\xff\\x35\\xac\\xfe\\xb0\\x5c\\x1c\\x89\\x19\\x28\\x08\\xae\\xeb\\xfb\\x2c\\xd1\\x7c\\xb1\\xc9\\x4f\\xab\\x05\\x98\\x98\\xfe\\xdc\\x2f\\xbd\\x44\\xcc\\xef\"},\n{{0xab,0xfd,0x69,0x7b,0xfb,0xc5,0xb6,0xff,0x2b,0xdf,0xf3,0xbc,0xe1,0xd7,0x77,0xe0,0x5f,0xbe,0x3e,0xc8,0xb9,0x5c,0xe6,0x93,0xd6,0x23,0x93,0x12,0x09,0x31,0x3d,0x4f,},{0xa7,0x09,0x32,0x1a,0x02,0x10,0xcb,0x80,0xab,0x58,0xbf,0x95,0x5e,0xcd,0xeb,0x8a,0xaf,0x9e,0xe4,0xc3,0x75,0xf9,0x59,0xc5,0x30,0x89,0xd4,0x37,0x48,0x8c,0x08,0x2d,},{0x8c,0x36,0xb5,0xa1,0x11,0xc5,0xa8,0x11,0x9f,0x2d,0x9d,0xb5,0x7e,0xbb,0x59,0x2d,0xae,0x86,0xad,0x4b,0xf6,0x78,0xc1,0x49,0x2e,0x26,0xf3,0xc1,0x0f,0xbe,0x03,0xf1,0x05,0xca,0xe0,0xdc,0x68,0xb5,0x52,0x59,0xb9,0xb5,0x98,0x92,0x89,0xdb,0x33,0xd9,0x5d,0x2e,0xe6,0xb7,0x56,0xc7,0x60,0xf9,0xd3,0xaa,0x0e,0x68,0xa1,0x89,0xde,0x02,},\"\\x89\\x6b\\x7a\\xb8\\x41\\x3f\\xfe\\x43\\x9a\\x2f\\x44\\x87\\xec\\x49\\xd6\\x4e\\x31\\xc7\\x4f\\x50\\xac\\x83\\xf5\\x5d\\xa6\\x1a\\x70\\x03\\xaa\\x71\\x6c\\x2a\\x9d\\xf6\\xb4\\x38\\xe6\\x2f\\x53\\xd8\\xf0\\x19\\x2f\\x37\\x36\\x32\\x47\\x60\\xd7\\xe8\\xc4\\x4a\\xc0\\xba\\xca\\x3a\\xe2\\xa6\\xfb\\x93\\xf1\\x3d\\x96\\x88\\x67\\x99\\xfd\\x2c\\x45\\x51\\xb0\\xab\\x36\\xf1\\x73\\x08\\x55\\x55\\x12\\x65\\xa5\\xa3\\xc3\\xc2\\x1d\\x95\\x16\\xa2\\x37\\xf5\\xdb\\xc1\\xc8\\xe7\\x29\\x99\\xb7\\x82\\xc5\\xca\\x41\\xa4\\xf6\\xe9\\x30\\x8e\\x64\\xaf\\xde\\xe0\\xbf\\x47\\x9e\\x54\\x6b\\x89\\xc5\\x1b\\xc5\\xe4\\xf7\\x1e\\x57\\xfb\\x24\\xce\\x43\\x7a\\x8b\\x81\\xb9\\x1d\\xc7\\x98\\xb5\\xab\\x36\\xf2\\x9a\\xfd\\x5b\\x48\\xe8\\x1c\\x17\\x6a\\xe5\\xed\\xf9\\x53\\x71\\xba\\x32\\x46\\xfb\\x43\\x94\\x05\\xbd\\x10\\xee\\xd3\\x67\\x8e\\x3e\\xc6\\x23\\x07\\xa3\\xb3\\xdc\\x1b\\xad\\xba\\x05\\x1f\\x16\\x77\\x4b\\x85\\x08\\x81\\x88\\xc2\\xa9\\xe3\\x20\\xa1\\x61\\x8d\\x5f\\x26\\xce\\x94\\xee\\x2b\\x93\\x3c\\x30\\x5f\\x6d\\x95\\x84\\x95\\x8e\\xea\\x31\\x56\\xc3\\xd1\\xe0\\xef\\x39\\xa1\\x86\\x27\\x5e\\xe6\\x2c\\x40\\xf3\\xc1\\xac\\xd1\\x5d\\x8b\\xe6\\xe0\\x74\\x35\\x1f\\x53\\x49\\xce\\x3d\\xf6\\x95\\x17\\x50\\x5f\\x45\\xfa\\x06\\xa8\\x15\\xc6\\x9c\\xa1\\x8f\\x45\\x0f\\x42\\xb5\\xcf\\x4e\\xbd\\x99\\x26\\x84\\x45\\xe0\\xf6\\x81\\x04\\xa7\\xde\\xeb\\x0a\\x11\\x5b\\x81\\x7b\\x99\\xe1\\xa7\\x3e\\x0f\\xa9\\xd8\\x7d\\xb7\\x1f\\x8e\\xc9\\x4f\\x87\\x08\\xc9\\xbc\\x2e\\x62\\x2b\\x96\\x33\\x65\\xeb\\xcf\\xb9\\x7c\\xfe\\x73\\x32\\x63\\x00\\x70\\xe9\\x65\\x4e\\xaa\\x60\\x36\\x1a\\x45\\xd4\\x02\\xdc\\x0a\\xb2\\x97\\x66\\x52\\x42\\x66\\x7f\\xbd\\x99\\x40\\xf6\\xcd\\x33\\x19\\x52\\x46\\xa8\\xc2\\x86\\x9a\\xf7\\x59\\xa8\\x62\\xd4\\xb6\\x41\\xdb\\x14\\x4d\\x57\\x32\\x36\\x6b\\x20\\x63\\x6c\\x40\\x27\\x78\\x7f\\x55\\x80\\x27\\xd7\\x6f\\xcb\\xf8\\x43\\x2e\\xb9\\x3e\\x6d\\x14\\x56\\x7d\\xf8\\xdb\\xf2\\x11\\xda\\xeb\\x56\\x55\\xdb\\x10\\xac\\xdd\\xd0\\x5e\\xca\\x06\\xac\\xce\\xe9\\xfd\\xa8\\xd3\\xb7\\x0c\\xa1\\xe6\\xdc\\x58\\x7f\\xa4\\xb7\\x8f\\x63\\xcd\\x66\\x3f\\xf0\\x24\\x38\\x70\\x57\\x0f\\x4d\\xcb\\xaa\\x3f\\xb6\\x26\\xb4\\xe1\\x13\\xbd\\xe4\\x7d\\x5c\\x9d\\xb2\\xb4\\xba\\x6e\\xc6\\xdb\\xf9\\x18\\xac\\x05\\x69\\x49\\xef\\x3c\\xfc\\xb1\\x15\\x56\\x16\\x15\\x77\\x1a\\x03\\x5a\\x43\\xd3\\x3b\\xa2\\x65\\x1d\\xbe\\xb4\\x63\\x48\\x26\\x1c\\xe3\\xc4\\xc9\\xf2\\x46\\xd2\\x3f\\x94\\xdb\\xc2\\xd0\\xc1\\x9b\\x92\\x1e\\x24\\xc7\\x7d\\xa5\\x99\\x2f\\x1b\\x4b\\xdf\\x2e\\xde\\xa4\\x99\\xf5\\x41\\x11\\x68\\xac\\x0c\\x12\\xe9\\x6f\\x3b\\x15\\xd2\\xe1\\x2a\\xc8\\xd7\\xb3\\xed\\x8d\\x1e\\x07\\xc4\\x26\\x7a\\x25\\xd3\\xa3\\xc3\\x53\\xa4\\x20\\x8b\\x74\\x06\\x27\\x8a\\xab\\x9e\\x70\\x0f\\x7b\\x20\\x6f\\x48\\xe6\\xea\\x7c\\xc9\\x7e\\x55\\x4f\\x15\\xc9\\xbe\\x34\\x9d\\xd9\\x15\\x14\\xdb\\xe8\\xd8\\x89\\xf2\\xdc\\xbb\\xfa\\x18\\x2c\\x9f\\xaf\\x58\\x07\\xa6\\x9b\\x2e\\x97\\xfa\\x77\\x1a\\x6f\\x23\\x1a\\x4c\\x7b\\x31\\xd1\\x17\\xb8\\xed\\x0e\\x63\\x0c\\xdf\\x13\\xe0\\x82\\xbb\\x4f\\x63\\xc3\\xf9\\xac\\xb3\\x55\\x32\\x04\\xcc\\xd7\\x6e\\x18\\x35\\xc4\\x6e\\xec\\x3d\\x43\\xc5\\x61\\xbb\\xf1\\x7c\\x92\\x21\\x4a\\x6d\\xb1\\x21\\x2b\\x60\\x03\\xcf\\x2c\\xc2\\x6c\\x7a\\xe6\\x75\\xfc\\xd0\\x53\\xb9\\x47\\xe7\\x22\\xf9\\xe8\\x57\\x62\\xce\\x8a\\x16\\xe4\\x65\\x4e\\xc6\\x34\\x2f\\xc6\\x46\\xe5\\xca\\xb4\\x72\\x79\\x7e\\xab\\xf6\\x58\\xba\\x4a\\xfd\\x14\\x2f\\xc8\\xfc\\x4c\\x8f\\x98\\xf2\\x3c\\x24\\xdc\\x99\\x84\\x7a\\xe8\\xce\\xf0\\x87\\x9e\\x1a\\xb3\\xbb\\x80\\x97\\xe4\\xc3\\x52\\x9a\\xdd\\x2d\\x8e\\x8e\\x2c\\x20\\x69\\x21\\x0f\\x50\\xac\\xe1\\xae\\x32\\xa6\\xc8\\xe6\\x38\\x4a\\x2b\\xf7\\xd7\\x9c\\x66\\xc7\\x46\\x14\\x9c\\x84\\xad\\x75\\xa3\\xa1\\x76\\xe4\\x5e\\x13\\x6d\\x94\\x69\\x5a\\xed\\x4b\\xfd\\x08\\xb4\\x26\\xea\\x8c\\x4b\\x93\\x79\\xf3\\x74\\x25\\x50\\xe1\\xcf\\x5a\\xc8\\x4c\\x18\\x17\\x4d\\x68\\x0e\\x92\\xaf\\x2c\\x18\\x74\\xac\\x1c\\x13\\xd2\\x82\\x32\\xde\\x19\\x37\\x68\\xe5\\x61\\x94\\x7c\\xbd\\x6b\\x79\\xe9\\xb9\\x9d\\xa6\\x5c\\xfb\\x74\\xff\\xb3\\x2f\\x7d\\x3d\\x20\\x25\\xc6\\x07\\x63\\xdc\\x07\\xf5\\x55\\x39\\xb4\\xd2\\x53\\xde\\x1e\\x6c\\x25\\x82\\x3a\\x62\\x58\\xc7\\xa9\\xce\\xd1\\x50\\x1d\\xce\\x27\\x86\\x89\\x8a\\x3e\\x05\\xc9\\xbf\\xf8\\xfc\\x5b\\x21\\x25\\xd0\\xf4\\x71\\x08\\x8a\\x13\\x4b\\x48\\x73\\xc8\\xd5\\x5c\\x04\\x45\\xf6\\xca\\x39\\x6b\\x3d\\x7b\\x4b\\xc2\\xbf\\x5c\\x4d\\x22\\x40\\xda\\x41\\x82\\x93\\xaf\\x6a\\x3e\\xd8\\x53\\xde\\xdd\\x3b\\xf6\\x68\\xd9\\x37\\xb3\\x5a\\xa0\\xc2\\xac\\xbf\\x23\\x76\\x6f\\x9f\\x3e\\x96\\x82\\x84\\x75\\xab\\x08\\x64\\x96\\x61\\x7a\\x6e\\x81\\xd6\\x53\\x58\\x9b\\x2f\\xe5\\x0b\\x7b\\xa8\\xf0\\xcf\\x1e\\x5a\\x44\\xd8\\xd6\\x2f\\x08\\x37\\x7a\\xbf\\xc2\\x62\\x97\"},\n{{0xdc,0xfa,0xd5,0x9f,0xc6,0xb6,0x97,0x10,0x9e,0x72,0x7f,0xf6,0x6a,0x5f,0xe9,0x3a,0x6a,0x22,0x6f,0x63,0x1a,0x64,0xe5,0x79,0x7a,0xd8,0xd8,0xc8,0xb6,0x35,0x87,0x34,},{0xe7,0x9f,0x4f,0x51,0x13,0x72,0xe3,0x55,0xe7,0xe9,0xe0,0xe8,0xb5,0x34,0x6f,0xdb,0xcd,0x2d,0xf1,0xfc,0x5c,0x3a,0x18,0x90,0xd2,0x7f,0xa1,0xfa,0x92,0x8d,0x27,0xa6,},{0x05,0x2f,0xf7,0x95,0x40,0x73,0x74,0x56,0xc6,0xa4,0x2c,0x41,0xc9,0x7d,0x6b,0xf5,0x17,0xb8,0xcf,0x28,0x9b,0xc7,0x8b,0x50,0x3d,0xee,0x6a,0x30,0xef,0x51,0x68,0xb3,0x8f,0x75,0xbe,0xac,0xa1,0xe1,0x4d,0x97,0x1f,0x87,0x73,0xe3,0x94,0x1b,0xd6,0xdf,0x5c,0xb9,0x77,0x8d,0xea,0x12,0x5a,0x4c,0x4f,0xe0,0x11,0x6b,0x70,0xee,0x84,0x0b,},\"\\x7d\\x92\\xdd\\xd8\\x13\\x3c\\x61\\xc6\\x10\\xc1\\x30\\x8c\\x23\\xae\\xaf\\x99\\x38\\x84\\xa4\\xe6\\x7f\\x7b\\x94\\xbb\\x88\\x6d\\xad\\x50\\x98\\x69\\xa9\\x32\\xec\\x4a\\x27\\xd4\\x10\\xd2\\xc2\\x9c\\xa7\\xae\\xae\\x6f\\x92\\x80\\xcf\\x6c\\x4b\\x06\\x7e\\xc7\\x51\\xe5\\xe8\\xc3\\x9f\\xf4\\x44\\xd4\\x22\\xce\\xab\\xae\\x14\\x5d\\x42\\xf0\\x47\\x45\\x3d\\xd4\\x02\\xd1\\x79\\x74\\x05\\x03\\x34\\x09\\xe7\\x2c\\xc1\\x9f\\x79\\x3d\\x5d\\x26\\x8f\\xb3\\xfd\\x2c\\x11\\xea\\x2c\\xb0\\xd7\\x04\\x36\\xe1\\x8f\\x9e\\x88\\xa0\\x15\\x15\\xdc\\x86\\x5f\\x6a\\x1e\\xb2\\x36\\x90\\x32\\x8f\\xd7\\x5d\\xe2\\x63\\x21\\xa3\\x8f\\x12\\x19\\x7a\\x97\\x20\\x1b\\x1d\\x84\\x52\\x94\\x4f\\xbc\\x54\\x1c\\xb6\\x8c\\x77\\xd4\\x95\\x15\\xdb\\x53\\x26\\xf2\\xb1\\xd0\\x76\\x3e\\xda\\x06\\xd2\\x50\\xce\\x2a\\x5e\\x0b\\xbd\\x7d\\x16\\x76\\xd7\\xd4\\x1f\\xb3\\xab\\xe8\\x8b\\xdb\\xe3\\x72\\xf9\\x6b\\xf7\\xbb\\x52\\x6d\\x6b\\x65\\xa2\\x51\\x5e\\x83\\xa5\\x77\\x04\\x5b\\x54\\x79\\xb3\\x8b\\x85\\x2f\\xe4\\xab\\x01\\x1c\\xbf\\x21\\xc0\\x85\\xef\\x5f\\x0a\\x7c\\x1b\\xed\\x76\\x57\\x2b\\x0f\\x86\\x02\\x28\\x06\\x7a\\x89\\x9f\\x89\\x5a\\xe7\\xf6\\x25\\x6e\\xb6\\x51\\x40\\x87\\xf9\\xd6\\xf5\\xc3\\x55\\x96\\xc1\\xf4\\x80\\xc7\\x31\\x13\\x54\\x6c\\xb9\\xcc\\x30\\xf5\\x6a\\xb0\\x74\\xa9\\xff\\x28\\xac\\xab\\x7e\\x42\\x65\\x0a\\x96\\x1d\\xa3\\x25\\xac\\x5b\\x65\\x94\\xb8\\x1c\\x93\\x25\\x0a\\xe7\\xd3\\x92\\x67\\xa1\\x9c\\x97\\x62\\x54\\x07\\xed\\xda\\x04\\x04\\xcb\\xe5\\xa3\\x6e\\x95\\x9f\\xc8\\x20\\xb2\\x7e\\xf5\\xca\\xd7\\x96\\xc1\\x1e\\xaf\\xf1\\xc0\\xe2\\xf9\\xd4\\xb3\\xc6\\x49\\x15\\x02\\x19\\x5d\\xe0\\x36\\x59\\xb3\\x64\\xe4\\xe8\\x7b\\x2b\\x2d\\x73\\x3e\\xc2\\x5e\\x6f\\x9b\\x63\\xd5\\xf6\\x91\\x79\\xe0\\xd2\\x7b\\xd4\\xae\\xcc\\x8f\\x12\\xa5\\x07\\xa9\\x1b\\xaa\\x48\\xd9\\x9b\\x3a\\x42\\x6c\\xec\\xeb\\xae\\xf3\\x7d\\x73\\x61\\x10\\x6a\\x84\\x90\\x64\\x43\\x09\\xf6\\xeb\\x4d\\x25\\x96\\x44\\x3b\\x6b\\x01\\x18\\xb9\\x45\\xac\\xec\\xc6\\x44\\x3e\\xa6\\x1f\\xcd\\x15\\x5b\\x54\\x32\\x5b\\xc2\\xc3\\x1b\\xe0\\x25\\x0f\\x94\\x82\\xe1\\x3f\\xd8\\xeb\\x44\\xe2\\xae\\xd7\\x6b\\xe8\\x12\\xaf\\x54\\x53\\xcb\\x7f\\x86\\x32\\x45\\x8f\\xc8\\xa0\\x2a\\x2f\\x45\\x48\\x0d\\x79\\xb0\\x6c\\x7d\\xda\\x38\\xb4\\x69\\x5d\\x08\\xb5\\xa4\\x30\\x50\\x4f\\x1a\\xe2\\x27\\x5b\\x05\\xc9\\x1e\\x79\\x9d\\x44\\x70\\xf3\\x8a\\xbe\\x77\\x73\\x6d\\xfa\\x89\\x5c\\x19\\x7e\\xa4\\xb6\\x3c\\x2d\\xf1\\x8e\\xfe\\xb1\\x41\\x84\\x83\\x7b\\x8d\\xdf\\x48\\x90\\x95\\x20\\xd9\\x10\\x45\\xb9\\xd9\\x65\\x5c\\x22\\x5a\\x83\\x17\\x39\\x60\\xb4\\xd7\\xcd\\x0d\\x8b\\xae\\x30\\x23\\x75\\x57\\xf8\\x69\\x70\\x8b\\xe1\\x38\\xad\\x52\\x46\\xc8\\x66\\xc6\\xc0\\x59\\xdc\\x59\\x7a\\xbf\\xd4\\x94\\x32\\x37\\x37\\x68\\x96\\x73\\x6b\\x97\\xb7\\xe0\\x28\\x9e\\xf9\\xbb\\xd2\\x94\\x77\\x74\\x5c\\xb6\\x0f\\x46\\x20\\x2f\\x1d\\xe9\\x84\\xf5\\x09\\xb1\\x80\\x88\\x33\\xf5\\x80\\x18\\xcd\\xe8\\xc2\\x6b\\xef\\x4c\\x00\\x5b\\xdc\\xa3\\x85\\xb0\\x57\\x35\\x11\\x0c\\xa0\\x2e\\x56\\x2b\\x50\\xed\\xdf\\xf6\\xfd\\xe9\\xfb\\xb8\\xd0\\x30\\xce\\xdf\\x70\\x31\\xbb\\xeb\\x32\\xb1\\x2b\\x24\\x2b\\xe4\\x9f\\xde\\x01\\x60\\xc1\\xfb\\xde\\x99\\xb0\\x3c\\x06\\x2a\\x1a\\x47\\x06\\x23\\x45\\xc9\\x2e\\x0b\\x60\\x4d\\x08\\x0f\\xac\\xce\\x92\\x43\\x48\\x15\\x29\\xc7\\x05\\x97\\xdf\\xd6\\x43\\x82\\xcb\\x54\\x06\\x91\\xb5\\x9b\\x71\\xb0\\x94\\x33\\x2b\\xaf\\x0b\\xbb\\x12\\x5b\\x63\\xa4\\x46\\xbb\\x97\\x49\\x1c\\x04\\x64\\x32\\x8c\\xab\\xd7\\x62\\x7c\\x46\\xf3\\x92\\xf3\\xb1\\x24\\x82\\x2f\\x20\\x13\\xc6\\xe1\\x6d\\x3c\\xa8\\x7c\\xc5\\xbe\\xcf\\x56\\xb0\\xfc\\x6e\\xb2\\xbf\\x99\\x23\\xb3\\x01\\x2b\\xa2\\xb6\\x12\\x50\\xa6\\x33\\xa4\\xd2\\xee\\x39\\x12\\x56\\xc5\\x20\\x95\\x73\\x82\\xaf\\xf9\\x70\\xc5\\xd2\\x23\\x85\\xc3\\x34\\x4c\\x6d\\x4b\\x45\\x61\\x57\\x1c\\x96\\x32\\x9b\\xf7\\x56\\x15\\x29\\x75\\x16\\xb9\\xf2\\xce\\xb9\\xf9\\x97\\xa3\\x95\\x23\\xaa\\x0f\\x58\\xb4\\x88\\x77\\x2d\\x82\\xfc\\x0d\\x78\\xc5\\xdd\\x52\\xec\\xfa\\x6b\\xfa\\xc6\\x3a\\x76\\xe1\\x48\\x08\\x8b\\x36\\xf2\\x4a\\x88\\xe6\\x83\\x85\\x49\\x6d\\xda\\xdf\\x30\\x23\\xf7\\x2d\\x87\\xc2\\xef\\xa2\\x6e\\x87\\x7d\\x32\\xf1\\xda\\x97\\xcd\\xb4\\x2c\\x8f\\x15\\x71\\x89\\x88\\xe4\\x28\\xcd\\x02\\xf4\\xd0\\x95\\x43\\xbd\\x0b\\xd5\\xb2\\xf4\\x09\\x96\\x3d\\x0f\\xa3\\x73\\x53\\x1f\\x78\\xb5\\x92\\xbd\\x13\\x7e\\xea\\xea\\x0b\\x4e\\x7f\\x91\\x82\\x08\\xe1\\xd5\\x90\\x08\\xa8\\xaf\\x50\\x58\\xf5\\xd9\\x23\\xc4\\xf3\\x2d\\xf1\\x99\\x90\\xf1\\x0d\\xd3\\xf0\\xeb\\x20\\x62\\x93\\xb2\\xb3\\x44\\x3f\\x4a\\x5d\\x2d\\xcc\\x5f\\x7d\\x3b\\xba\\xf6\\xaf\\x43\\xfe\\x45\\xf5\\xdb\\xbe\\x53\\xec\\xf4\\xbf\\x1b\\x4a\\x13\\xe2\\xd4\\x6e\\xf8\\x02\\x98\\xd4\\xf0\\x1c\\x40\\x2e\\x21\\x0f\\xcb\\x9f\\xf2\\x08\\x4e\\xc0\\x3e\\x42\\x00\\x8d\"},\n{{0x69,0x6d,0xc4,0x81,0xf6,0x19,0xa9,0x49,0x85,0x63,0xc8,0x3d,0x0d,0x0e,0x55,0x56,0x5c,0x14,0xa0,0x78,0x45,0xfe,0x4a,0x66,0xab,0xa2,0x24,0x7b,0x11,0x3f,0xf8,0xef,},{0xc9,0xd7,0x37,0xab,0xc4,0xa9,0xe7,0x3c,0x14,0x9e,0xad,0xc1,0x95,0xa8,0x37,0x89,0x9f,0x2c,0xd5,0x01,0x93,0x73,0xc3,0x0e,0xca,0xf6,0x2e,0x5f,0x8e,0x14,0xb6,0x45,},{0xde,0xd5,0xd9,0x91,0x93,0x5c,0xd1,0xf9,0x39,0x0f,0x1e,0x85,0x92,0x9c,0xa1,0x6d,0xab,0xfc,0x83,0xe6,0x5e,0x43,0x27,0x2e,0xb1,0x75,0x16,0x71,0xaa,0x31,0x93,0x0c,0x72,0x85,0x55,0x34,0x14,0x30,0xce,0x7c,0x80,0x48,0x5d,0xe5,0x80,0x06,0x42,0x71,0x29,0xa4,0xd3,0x4f,0xd6,0x81,0xd5,0x2d,0x84,0x0a,0x16,0xba,0xfa,0x15,0x30,0x02,},\"\\x2d\\x4b\\x3a\\xd0\\xcc\\x99\\xf9\\x83\\xe4\\x1f\\x9b\\x48\\xc4\\xa8\\x18\\xef\\xf7\\x5f\\xcf\\xb9\\x3a\\x12\\x29\\xec\\x27\\x40\\xed\\x19\\xc1\\x07\\xd6\\x21\\xdf\\x78\\x05\\x8d\\xe7\\xc2\\xdd\\x72\\x51\\xf5\\xff\\x45\\x43\\x40\\x86\\x5f\\x6c\\x86\\xda\\x65\\x83\\x1f\\x66\\x72\\xdb\\x23\\x17\\x26\\xfd\\xfe\\x4b\\x9e\\xe3\\x15\\xd9\\x3c\\x72\\x44\\xa9\\x20\\xdf\\x37\\x05\\x4c\\x82\\x44\\x9d\\x31\\x0f\\x89\\x29\\x32\\xdd\\xba\\xd9\\x4c\\xc9\\xbb\\x39\\xac\\x89\\x37\\xcc\\x76\\xc9\\x65\\x21\\xd3\\xfd\\xc0\\x28\\xba\\x23\\x41\\x0b\\x29\\x02\\x3e\\x81\\x38\\xfd\\x3f\\x52\\x43\\x19\\x88\\x4e\\xe5\\xda\\xd0\\xd2\\x34\\xc8\\xdf\\x66\\x1f\\x88\\x24\\xbe\\x47\\x7e\\x21\\x69\\x9f\\x63\\x69\\xb1\\x5f\\xf3\\xff\\xef\\xc1\\x51\\xaa\\x55\\x5b\\x3c\\x3d\\x76\\xad\\xb4\\x5f\\x25\\x67\\x2d\\x38\\x0d\\x47\\x2b\\x31\\x48\\xda\\xbd\\xef\\x42\\x45\\xb6\\x8e\\x82\\x85\\x62\\xf2\\x5c\\xc5\\xb8\\x1d\\x9b\\xbb\\x24\\x1b\\xca\\x9d\\x19\\x34\\xea\\x35\\x3f\\x95\\xf7\\xdb\\xf3\\x64\\x64\\x33\\xe8\\x1a\\x35\\x4e\\x1e\\x20\\x56\\xb8\\x1c\\x15\\xaa\\x1f\\xa8\\xed\\x7a\\x9d\\x1a\\xf9\\x92\\x38\\xcd\\x5a\\x5a\\xe9\\xe8\\x41\\xc4\\x8d\\xc3\\x48\\xae\\x1d\\xe7\\xc4\\x1a\\xca\\x23\\x32\\x82\\x36\\xbc\\x38\\xb4\\x7f\\x47\\xc7\\x36\\xb2\\x57\\xa3\\x07\\x8d\\x57\\xd5\\x74\\xb6\\x47\\xa7\\xfc\\x8c\\x4d\\x01\\xbc\\x50\\x30\\x21\\x50\\xd5\\x03\\x2b\\xfa\\xcb\\x04\\xbb\\x0f\\xd1\\x55\\xd9\\x4d\\x92\\x06\\x66\\x77\\x20\\xe1\\x80\\xa6\\x45\\xaf\\x46\\x24\\x59\\xe3\\x32\\x6d\\x46\\x0d\\xa3\\xc4\\x8e\\x75\\x72\\x67\\x8e\\x19\\x19\\x26\\x8d\\x3e\\x47\\x40\\xd6\\x2a\\x26\\xf7\\xc8\\x55\\x9c\\x1c\\x43\\x9b\\x4b\\x0b\\x0c\\x59\\x42\\xa6\\x20\\xcf\\xdb\\x93\\xcc\\x68\\xaa\\x15\\x52\\x0f\\xf2\\x86\\x42\\x69\\xd7\\xa0\\xc1\\x55\\x78\\x0a\\xdc\\x6c\\x18\\x8e\\x0b\\x56\\x5f\\xb9\\x59\\x43\\x19\\xe6\\xf5\\x1d\\x15\\xca\\xf6\\xb2\\x80\\xe7\\x15\\x8f\\x25\\x79\\x94\\x07\\xf3\\xba\\x0d\\xd1\\xce\\xea\\x64\\xb9\\x32\\x6d\\x2c\\xfd\\xef\\x01\\x7e\\x1f\\x17\\x2f\\x4d\\xde\\x0f\\x7e\\x46\\x13\\x50\\x1a\\xf0\\x1e\\xe0\\xac\\x30\\x09\\x5f\\x48\\xb5\\x95\\x90\\x90\\x2b\\x1a\\xec\\xfe\\x09\\x34\\x13\\x91\\x8d\\x83\\x5a\\xdf\\x96\\x2e\\xcf\\x18\\x58\\x0d\\x16\\xf9\\xfd\\x4f\\x6f\\xa1\\x09\\x8a\\xf1\\xd8\\xa2\\xbc\\x24\\xdc\\x86\\xf7\\x1d\\x0a\\x61\\xff\\x15\\x00\\x10\\x86\\x7d\\x08\\x69\\x87\\xb5\\x1d\\xd0\\x30\\xf5\\x0a\\xb6\\xe3\\x74\\xb8\\xe0\\x11\\x84\\xb3\\xe2\\xb2\\x14\\xab\\x1c\\x7f\\xdf\\xae\\xdb\\xc5\\x45\\xe3\\x8c\\x3c\\xd2\\xf6\\x98\\x29\\x79\\x54\\x1f\\xe0\\xff\\x88\\xbe\\xd6\\x75\\x06\\xda\\x95\\x72\\x7a\\xf1\\xa2\\x03\\x8f\\x32\\x40\\xae\\x5b\\xfd\\x30\\xee\\x09\\x21\\x0e\\x00\\xfd\\xcf\\x2a\\x06\\x4d\\x5d\\xb4\\x61\\x49\\x46\\xbd\\xa9\\x72\\xc6\\x70\\x08\\x1a\\x6e\\xe6\\xa1\\x0b\\x63\\xf6\\x73\\xc8\\x3c\\x91\\x5c\\xa5\\x57\\x3e\\x0e\\xd6\\x87\\xb0\\x06\\x7c\\x40\\x07\\x92\\xa9\\xbc\\xc3\\x34\\x4e\\x0e\\x43\\xf5\\xdf\\x63\\xfe\\xd5\\xef\\xa8\\x5e\\x9a\\xaf\\x85\\xe4\\xd7\\xa2\\xc5\\x3a\\x6c\\x92\\x82\\x8e\\x07\\xfe\\x63\\xe2\\xd2\\x3f\\x1b\\xdf\\x97\\xd8\\x4a\\xdc\\x36\\xe9\\xfc\\x95\\xfa\\xad\\xf0\\x3e\\x06\\xd6\\x5a\\x19\\xc5\\xe2\\x85\\xef\\xfd\\x0e\\xa0\\xcf\\xa8\\x39\\xd5\\x5a\\x0a\\x0d\\xbf\\x6d\\xa2\\x87\\x85\\xc7\\x7f\\x5c\\x04\\xbf\\xd5\\x99\\x74\\xef\\x37\\x93\\xcd\\xc3\\x98\\xdf\\x7a\\x1b\\xbc\\x9c\\xfc\\xfc\\x3a\\x51\\xff\\xa9\\xa2\\x0d\\x60\\xc4\\x7b\\x24\\x5d\\xaf\\xa3\\xe4\\x46\\x23\\xcd\\x71\\x1d\\x77\\x62\\xc5\\x0a\\x67\\xd6\\x50\\xc7\\xe8\\xc4\\xfd\\x3b\\xeb\\xc0\\xc4\\x98\\xd2\\x15\\x2a\\xb9\\x82\\x7c\\x70\\x0c\\x7b\\x28\\x61\\x56\\x57\\x49\\xb5\\x86\\x4f\\xec\\x95\\xb7\\xf6\\xb1\\x99\\x4e\\x78\\xd8\\xf8\\x5d\\x06\\x9c\\xc1\\x1f\\x85\\xbe\\xd9\\x71\\x2f\\x7a\\x9f\\x06\\x0b\\x0b\\xf6\\x75\\x32\\xe8\\x8e\\xb9\\xdf\\x3e\\xb4\\xa8\\xd2\\xfb\\xba\\xa8\\x5e\\xda\\x92\\x6d\\x81\\xc4\\x9f\\xb8\\x6e\\x73\\x73\\x1b\\x7e\\xd2\\xa1\\x90\\x50\\x78\\x51\\x3f\\x7c\\xa0\\xfd\\xcc\\x3b\\x1d\\x57\\x6e\\x6a\\x60\\x12\\x4c\\x44\\x61\\x8d\\xf1\\x89\\x0e\\x16\\x97\\x94\\x95\\x6c\\xb1\\xec\\x50\\x1b\\xa2\\x04\\x99\\x70\\xc8\\xe7\\x4c\\xc1\\x80\\x06\\x4c\\x18\\x44\\x68\\xbe\\x4f\\x08\\x9a\\x3a\\xe2\\x26\\x3c\\x85\\x58\\x63\\xb6\\x2c\\x28\\x31\\x3d\\xdf\\x9c\\xa8\\x5b\\xf6\\x6b\\x08\\xa2\\x64\\x15\\x5a\\xd7\\xc3\\x28\\x23\\x8d\\xfe\\x61\\x4a\\x07\\xed\\xe9\\x15\\x5a\\x09\\xcc\\xaf\\xf9\\x22\\x92\\x24\\x93\\x41\\xba\\xed\\xcb\\xe0\\xe6\\x46\\x6e\\x2c\\x76\\x04\\x5e\\x46\\xda\\xd2\\xfc\\x89\\x9a\\x17\\x82\\xe0\\x09\\x98\\xe7\\x9a\\x83\\xab\\xfa\\xe9\\xb7\\x06\\xf7\\x07\\xf5\\x8e\\x73\\x02\\x03\\xe1\\xd2\\xcc\\xa0\\x28\\xc9\\x22\\xbe\\xb6\\xd1\\x57\\xfa\\x7a\\x98\\x13\\x2a\\x92\\x1a\\x3d\\xa2\\x1f\\x2f\\x76\\x9b\\xb6\\xc1\\xf5\\xf1\\x9e\\x9e\\x85\\xa1\\x3b\\x78\\x1a\\xf1\\x41\\x03\\x9d\\x51\\x4e\\xe1\\x07\"},\n{{0xf3,0xf8,0xd6,0x2f,0xee,0x3a,0xf3,0x75,0x66,0x96,0x30,0xcb,0xf0,0x63,0xbf,0xa9,0x30,0x18,0x9a,0xf1,0x36,0xcd,0x75,0x91,0xe2,0x4d,0x57,0x8d,0x73,0x66,0xbf,0x61,},{0x47,0x14,0xc6,0x04,0xaa,0x95,0xe1,0x82,0x8a,0x28,0x36,0x7b,0xa7,0x87,0x60,0xb5,0x89,0x64,0x31,0x68,0x3e,0xe9,0x96,0xcf,0xf9,0x68,0x71,0x77,0x32,0x91,0x95,0x3c,},{0x8d,0x6f,0x7c,0xee,0xb9,0x30,0x8b,0x4a,0x30,0x38,0x79,0xfc,0x6c,0xfa,0x5c,0xa8,0xe0,0x5d,0xfc,0x3d,0xef,0xc2,0xb2,0xcd,0x29,0x10,0xdd,0x4b,0x17,0xc9,0x4e,0xae,0xe8,0x45,0xab,0xe6,0x5f,0xd7,0x15,0xdf,0x05,0xb0,0x12,0x8e,0x43,0x16,0xe2,0x33,0x47,0x99,0xc6,0xe8,0xfa,0x74,0x7e,0xbc,0x8a,0x04,0x0c,0x74,0xf5,0xa1,0x48,0x0c,},\"\\xe1\\xdd\\x1f\\xfd\\x73\\x7a\\xc6\\xdc\\x24\\xb3\\xb9\\xce\\x3b\\x79\\xe8\\x35\\xbf\\x69\\x8e\\x93\\x13\\x03\\xd8\\x09\\xce\\xa1\\x78\\x2d\\xc3\\xaf\\x63\\xa0\\xd5\\xe6\\x73\\x92\\x82\\x3d\\x14\\x39\\xe7\\xb6\\xe3\\x37\\xb0\\x1c\\x8b\\x21\\x54\\x34\\xc2\\x78\\x2b\\x3b\\xe7\\x44\\x3c\\xb5\\xc8\\x81\\xe5\\xfb\\x6c\\xf3\\xbb\\x24\\x41\\x28\\xb4\\xda\\x6a\\x6f\\x42\\xb2\\xbb\\x2c\\xd7\\x51\\x29\\xd5\\x64\\x18\\x85\\x43\\x48\\xc3\\x39\\xdc\\xd9\\x12\\xb4\\x55\\x57\\xa9\\x15\\xe9\\xfd\\x7f\\x37\\x91\\x62\\x36\\x51\\x0c\\xb6\\xc3\\x31\\xc1\\x40\\xb8\\x7d\\x22\\x53\\x11\\x60\\x0b\\x8d\\x13\\x2a\\xc4\\x74\\x73\\x83\\x9c\\x72\\x0f\\x9f\\xf0\\xf9\\xc1\\xdc\\xaa\\x85\\x81\\x5a\\x9d\\x27\\xb9\\x75\\x8c\\xd9\\x1d\\xc5\\xd3\\xe5\\x33\\x26\\xfc\\xdf\\xb2\\x73\\x0e\\x52\\xbe\\x31\\x03\\x95\\x7a\\xc8\\x91\\x49\\xa4\\xc3\\x00\\x4c\\xb6\\x03\\x8c\\x0d\\x80\\xfa\\x72\\xac\\x63\\x0d\\x33\\x3b\\xe5\\xad\\x4a\\xdb\\x58\\x5a\\xeb\\x71\\xae\\xf1\\xcd\\xfd\\x57\\xb9\\x15\\xfa\\xc4\\xf1\\xaf\\x78\\xe7\\xa5\\x97\\xf8\\xd1\\xba\\x06\\x67\\x2b\\x19\\xc0\\xb6\\x58\\x08\\xa8\\xa0\\x71\\xff\\x84\\x09\\x03\\x43\\x79\\x58\\x9f\\x3d\\x41\\x30\\x2d\\x2d\\x39\\xb3\\x31\\x8e\\x8c\\x00\\x90\\xfa\\x36\\xcb\\x95\\x88\\x57\\xff\\x5b\\x21\\x1c\\x96\\x66\\xe2\\x7b\\xc8\\x95\\xab\\x9d\\x00\\x6a\\xba\\xf5\\x95\\x0a\\x03\\xff\\x17\\xea\\x98\\x21\\x78\\xa4\\x46\\xdd\\xa2\\x46\\x6f\\x5a\\x40\\xb8\\xf8\\x95\\x50\\x9e\\x4f\\x4d\\x4a\\x6a\\x27\\x39\\x99\\x7f\\xbd\\x49\\x68\\xf8\\x94\\x36\\xce\\xe3\\xd8\\xed\\xb8\\xa6\\xda\\x9b\\xd3\\xd5\\x5b\\x06\\x64\\x90\\xe8\\x33\\x9c\\x78\\x93\\x5b\\x77\\x88\\x3f\\x95\\xb9\\x32\\xfa\\x5e\\x6b\\xb7\\xdf\\x30\\x3b\\xe3\\x0f\\xa5\\x67\\x24\\x9f\\xff\\xb4\\x73\\xa1\\xe4\\x64\\x32\\x2d\\x7c\\x10\\x3f\\xe8\\x22\\x4c\\x7e\\xc5\\x7b\\xd3\\x9b\\xcd\\x03\\x0b\\x96\\x78\\x7a\\xeb\\xcd\\x20\\xe9\\xad\\x65\\x1c\\xfa\\x2b\\xf0\\x4b\\xa7\\x0a\\x1c\\xf6\\x48\\xe0\\xa5\\x44\\x95\\x67\\x20\\x2a\\x93\\x7a\\x45\\xbe\\xcb\\xb6\\xfc\\xde\\xd3\\x0c\\xf9\\xb5\\xc7\\x48\\xf8\\x82\\xb5\\xdc\\x2a\\x4d\\x65\\xbe\\x69\\xfd\\x7d\\x9c\\x38\\x1e\\x83\\xd0\\xdc\\x2a\\x34\\xb6\\xde\\xe9\\x12\\x20\\xba\\x90\\x6e\\x51\\x2f\\xcd\\x63\\x36\\x8e\\x2c\\xe7\\x33\\xe4\\x66\\xb4\\xb8\\x2b\\x84\\xfb\\x0c\\x71\\x7d\\xc8\\x94\\x5c\\xaf\\x6d\\x46\\xac\\x1c\\x2f\\x64\\x18\\xf7\\x72\\x9e\\xf4\\xc3\\x5e\\x40\\x24\\x22\\xd6\\x4b\\x1c\\x3e\\xbd\\x1b\\x32\\xa3\\x0f\\xc4\\xc5\\xee\\xce\\x7d\\x44\\x08\\xff\\x67\\x9f\\xf0\\x1a\\x1c\\x7b\\x03\\xca\\x51\\x7b\\xe5\\x2e\\x6a\\xe7\\x65\\x0f\\x7b\\xad\\x38\\x90\\x1e\\x34\\x8a\\x55\\x93\\xbc\\x99\\x8f\\x7c\\xf2\\xea\\x97\\x72\\x9c\\xb0\\x04\\xf5\\x61\\xb3\\xb5\\x8f\\xe5\\x98\\x09\\xa4\\x1f\\xd4\\xb3\\xb7\\x66\\x60\\x90\\x6a\\xd9\\xed\\xa2\\x3b\\xf9\\x25\\x43\\x7e\\xf4\\x52\\xb1\\x6f\\x54\\x0b\\x3b\\x80\\xa3\\x5a\\x70\\x93\\xc2\\x73\\x4e\\xef\\xe6\\xfa\\x97\\xd8\\x81\\xd7\\x9e\\xf5\\xb7\\x67\\xd9\\x88\\x9f\\x11\\x84\\x77\\xb7\\x3f\\x58\\xa4\\xc0\\xcb\\x15\\xe0\\xac\\x81\\x01\\x12\\x05\\x71\\xca\\x32\\xce\\x87\\x1f\\x30\\x8a\\xd9\\x05\\x7a\\x80\\xc8\\x28\\x15\\x4f\\xb1\\xbc\\x2b\\x20\\x1d\\x0c\\xd1\\x00\\x6e\\x02\\x2d\\x44\\x4d\\xc9\\x3f\\x1b\\xcf\\x22\\x4d\\xb7\\x4a\\x5b\\x37\\x3e\\x15\\x3e\\x85\\x18\\x54\\x94\\x8b\\x6d\\xa1\\x47\\xb7\\x32\\x87\\xcf\\x17\\xd1\\xfb\\x72\\xb4\\x82\\x76\\x11\\x10\\x36\\x09\\xca\\xb2\\xa1\\x77\\x9e\\x97\\x93\\xb9\\xa7\\x08\\x20\\xfc\\x6f\\x38\\x28\\xa6\\x4c\\x9e\\xac\\x35\\xef\\x7a\\xa7\\xb1\\x76\\x09\\xd8\\xef\\xf8\\xa9\\xe5\\x2e\\x4e\\xbc\\xd8\\x6b\\x1e\\x14\\xfd\\x14\\x0b\\xea\\x47\\xc6\\xb8\\xdd\\xc4\\x1e\\x8c\\xd2\\x71\\xeb\\x92\\x28\\x7c\\xbd\\x06\\x10\\x51\\x22\\x42\\xf7\\x6a\\x1e\\xf3\\xea\\xc1\\xe4\\xbb\\xbc\\x1a\\xda\\xe5\\x00\\x34\\xa7\\xa2\\x64\\x7e\\x08\\xb2\\xfd\\x20\\xaa\\x93\\xa9\\x3c\\xb2\\xff\\xde\\xbf\\x2e\\x46\\x1e\\xcc\\xef\\xbb\\xd1\\xfe\\x89\\x4c\\xe7\\x0a\\xdf\\x79\\x01\\x73\\xba\\xe9\\x6f\\x5a\\x55\\xa1\\x88\\x7e\\x9a\\xe0\\x9f\\xce\\xd1\\xd4\\x30\\x6c\\x29\\x1c\\x6b\\x19\\xec\\xac\\x47\\x07\\xe9\\xef\\x71\\x3e\\xa1\\x8a\\x75\\x62\\xc6\\x67\\x83\\x26\\x22\\x89\\x92\\x07\\x7a\\x46\\x69\\x73\\x49\\x66\\x10\\x80\\x00\\xb4\\x14\\x4f\\x45\\xa0\\xc3\\xa2\\x86\\x3a\\x4c\\x6a\\x3c\\x07\\x63\\x2c\\xb9\\x3e\\xb1\\x97\\xd2\\x94\\x88\\x4d\\x9c\\xa3\\xdd\\x4b\\x21\\xf3\\x9d\\xb7\\x07\\xf6\\x3a\\x7f\\x9a\\x57\\x0f\\x7f\\x0f\\xeb\\x99\\xb2\\xca\\x7d\\xa7\\xdf\\x92\\xa1\\x77\\xab\\xcf\\xe8\\x6e\\xc6\\x61\\xd3\\x0b\\xcd\\xcf\\x15\\x22\\xbd\\xb1\\xfe\\x11\\x67\\x32\\x58\\xdf\\x7e\\x46\\xef\\x4d\\x32\\x66\\x65\\x09\\x31\\x56\\x55\\x3f\\x28\\xb3\\x56\\x3f\\xe7\\x19\\x2f\\x72\\xf5\\xf9\\xb3\\x90\\x3d\\x79\\xfe\\xa0\\x4e\\x2c\\x48\\x8b\\x46\\x5b\\x49\\x78\\xd6\\x9f\\x26\\xe0\\x5a\\x59\\xd5\\xed\\x4e\\xf4\\xca\\xb2\\x32\\xac\\xfd\\x56\\x4f\\xc6\"},\n{{0x86,0x5a,0x43,0x2e,0xcc,0xe7,0xe7,0x8c,0x42,0x70,0x9f,0xc1,0xe5,0x31,0xdf,0x5e,0x39,0x59,0x13,0x2b,0x2b,0x6f,0x31,0x8f,0xd1,0xc3,0x45,0x21,0xf9,0xa2,0x6e,0x3b,},{0xc7,0xa8,0xca,0xf8,0x93,0x0b,0x62,0x2a,0x50,0x13,0x37,0xf9,0x28,0x40,0xed,0x96,0x61,0x1a,0x32,0x20,0x80,0xfd,0xe5,0xe4,0x9f,0x0a,0x2f,0x6e,0x33,0xb8,0x82,0x83,},{0x32,0xbb,0x75,0x20,0xe2,0x63,0x9c,0x6c,0xca,0x19,0xa2,0xb9,0x83,0x6b,0x08,0xf8,0xb0,0x83,0xca,0x33,0x36,0x9d,0xdf,0x5f,0x9a,0x87,0x7d,0x4c,0x7a,0x9e,0xb0,0x5f,0x9c,0x3d,0xc3,0x4e,0xd4,0xcf,0xa4,0xb2,0x83,0xe5,0x19,0x22,0xb0,0x94,0x06,0x6c,0xe9,0xff,0xa4,0xd9,0xdf,0x62,0x19,0x10,0xca,0x37,0xb0,0xb3,0x7f,0xba,0xbb,0x0e,},\"\\xb2\\x31\\xb6\\xd2\\xec\\xde\\x49\\xf5\\x13\\xb0\\xdf\\x25\\xaa\\xfc\\x3e\\x5d\\xa4\\x5b\\x6a\\x99\\x58\\xd6\\x0f\\x54\\x64\\xca\\x59\\x3c\\x03\\x00\\x5e\\xcf\\x36\\x1e\\xf1\\x69\\x6b\\xb6\\xe5\\x5d\\x65\\x38\\xe3\\x4b\\x38\\xf3\\x24\\xc2\\x1c\\xea\\x5c\\xc8\\x1a\\x00\\x73\\x27\\x8b\\xb9\\x27\\x27\\xef\\xf8\\x1a\\xf5\\x61\\x80\\x2d\\xce\\xf3\\x3b\\xec\\x10\\xad\\x65\\x94\\xe2\\x2d\\x9c\\x44\\x18\\xaf\\x39\\x88\\xa4\\x3e\\xd0\\x87\\xb9\\x95\\x4b\\xf8\\xd6\\x28\\x3e\\x4b\\xea\\xe8\\xc0\\x96\\xde\\x66\\x06\\x75\\x1c\\xbe\\xd6\\x85\\x84\\x6c\\x66\\x30\\xb9\\x52\\x8f\\xf3\\x64\\xa7\\xc4\\x84\\x64\\x11\\x34\\x72\\xc9\\x86\\x0b\\x33\\x71\\x96\\x3c\\x91\\x14\\x95\\xa9\\xc6\\x28\\xa3\\xe3\\xe4\\x7a\\xb0\\x99\\x1f\\x10\\xdd\\x1d\\xd3\\x31\\x61\\x52\\x52\\x62\\xd6\\x3b\\xab\\x64\\x88\\x19\\xd5\\x7d\\x12\\x69\\xe1\\x14\\x82\\x5c\\x54\\x34\\xe6\\xb2\\x84\\x5f\\x42\\x79\\x5d\\x4f\\xb0\\x83\\xad\\x79\\x40\\x1f\\x2a\\x07\\x61\\xc6\\x34\\xa5\\x45\\xae\\xc7\\xcd\\xb1\\x3b\\x5b\\xe4\\x49\\xf1\\xd8\\x29\\x32\\x63\\x78\\xed\\x1f\\x49\\x3f\\xe8\\xc8\\xe9\\xb0\\x68\\xcc\\x1d\\xbc\\xf1\\x65\\x55\\x0b\\x81\\x32\\xc3\\x19\\xda\\xc4\\x87\\xb8\\x7b\\xb2\\x2a\\x54\\xcd\\xf6\\x0a\\xac\\x71\\x51\\x61\\x82\\xa4\\xe6\\x9b\\xa0\\x83\\xf6\\xe8\\x6d\\x1a\\x4f\\x05\\x08\\x3a\\x77\\x61\\x9e\\xf2\\x39\\xf7\\x02\\x39\\x6d\\x7e\\x46\\x96\\x8c\\xc0\\x4a\\x3b\\x34\\xdf\\x32\\x65\\xec\\xf1\\x61\\x57\\xab\\xe1\\x5c\\x64\\x2c\\xd7\\x42\\x70\\x96\\xd8\\xd4\\x0d\\xb0\\x02\\xd1\\x96\\xca\\xb1\\xbe\\x30\\x4b\\xcf\\x32\\x2d\\x9d\\x1a\\x24\\x51\\xb6\\xc1\\x1e\\xea\\xf3\\xe8\\xe3\\xd9\\x29\\xf4\\x80\\xb6\\xb7\\x78\\x04\\xfe\\x84\\x49\\x6c\\xa7\\x57\\xe0\\x43\\x37\\x91\\x4c\\xe9\\x44\\x75\\xd7\\x99\\x0c\\x74\\x57\\xc8\\xe6\\x06\\xf8\\xbc\\x20\\x7d\\x2d\\x48\\x11\\x9c\\x80\\xa6\\xb4\\xa9\\xe0\\x7b\\x22\\x92\\x26\\x57\\x0d\\xcd\\x99\\x49\\x89\\xfe\\xcc\\x69\\x4c\\x6c\\x2f\\xb5\\x97\\x5c\\x9a\\x6a\\x9b\\x74\\xe8\\x15\\x9c\\x27\\xdd\\x36\\x77\\xdf\\xd5\\xcb\\x65\\x1f\\x1e\\x32\\xad\\xfa\\xfd\\x81\\x0b\\x6e\\x5d\\x5e\\xfb\\xac\\xe3\\x1a\\xe6\\xd9\\xb1\\x21\\x91\\xe8\\x93\\x98\\xda\\x06\\x3f\\x13\\x8b\\x75\\x84\\xc5\\x8e\\x77\\xe7\\xf9\\xfd\\xd7\\xfb\\x9e\\xf5\\xd6\\x8a\\xe4\\x9c\\x6c\\xca\\xd2\\x8d\\x18\\xbc\\x60\\x09\\xd4\\x18\\x7e\\xd1\\x42\\x02\\x24\\xa5\\x65\\x8a\\xad\\xf1\\x35\\xb5\\xa9\\x53\\xf2\\xdc\\x3c\\x8b\\xfc\\xaf\\x66\\x9e\\xd5\\xda\\x38\\xd0\\x14\\x4f\\xd9\\x66\\x5e\\x6f\\x06\\x77\\xd3\\xfc\\x88\\x04\\xe2\\x1c\\xc2\\x5f\\xd5\\xe0\\x1a\\x3f\\x3f\\xa8\\x3e\\x57\\x1e\\xb2\\xf8\\x82\\xa7\\x65\\x9c\\xe5\\xd8\\x64\\xd8\\xbb\\x54\\x07\\x2b\\x09\\x86\\xa8\\x54\\xf1\\xa7\\xf2\\xd2\\x72\\x0d\\xf8\\x57\\xe6\\xd4\\x21\\x96\\x30\\x84\\x1b\\x1c\\xcd\\xcf\\xc6\\x72\\x6b\\x91\\xbf\\xc1\\x7e\\x18\\xc3\\xe3\\x48\\x0c\\x23\\xa2\\xc0\\x5e\\x4b\\xfe\\xdd\\xd4\\xdb\\x9e\\xf4\\x23\\x88\\xf2\\x34\\xfd\\x3e\\x4f\\x3d\\xad\\x66\\x60\\x26\\xe2\\x78\\x06\\x12\\x37\\x41\\x61\\x31\\x6a\\xfc\\x76\\x65\\xf9\\x41\\x1b\\x6c\\x5a\\xa7\\x89\\x33\\xb1\\x80\\x21\\xc0\\x12\\xb0\\x84\\xf3\\x24\\x47\\x60\\xa4\\xea\\x1b\\xcf\\x31\\xcc\\x9f\\x5c\\x40\\x44\\xa9\\xbc\\xc7\\x5a\\x98\\x67\\x07\\xf3\\x8f\\x45\\xac\\x1c\\x7f\\xa1\\x39\\xee\\x95\\xa6\\xd8\\xf1\\x6c\\x3c\\x1e\\x12\\x76\\x4c\\x4b\\x0b\\x11\\x94\\xc0\\xfc\\x5f\\x7e\\xef\\xf9\\xa8\\x48\\xc4\\x05\\x0b\\x0e\\x65\\x16\\x84\\x71\\x9d\\x43\\x8a\\xad\\x56\\x01\\x91\\x64\\xfa\\xe4\\xf4\\x88\\x82\\x20\\x5e\\xce\\x0b\\x99\\x73\\x67\\x91\\x08\\x4a\\x75\\x3b\\xa7\\xd5\\x6e\\x88\\xfc\\xee\\xa5\\x33\\x56\\x6c\\x3a\\x2c\\xa4\\x8d\\xd6\\xef\\xc4\\x9b\\x27\\xdb\\xf1\\x4f\\x26\\x16\\xce\\xd6\\x52\\xe1\\x38\\x33\\xab\\x90\\x28\\xad\\xa4\\x54\\x43\\x1c\\x89\\xb3\\xcb\\x74\\x41\\xfd\\xb8\\xf2\\x3e\\x12\\xb6\\x0a\\x1a\\x10\\x4a\\x2a\\x8c\\xf4\\xa6\\x4e\\x87\\x8a\\xa2\\x6f\\x54\\xe8\\x88\\x1a\\x4b\\x15\\x1a\\x16\\xa9\\x6d\\xe8\\xb9\\x80\\x7e\\x72\\x93\\x96\\xeb\\xe3\\xe3\\xd3\\x94\\xf8\\x08\\xbd\\x74\\xb7\\x31\\x2f\\xe6\\xb8\\x4b\\x13\\x12\\xaf\\x8a\\x1e\\x41\\x33\\x59\\x9d\\x07\\xbd\\xf3\\x3d\\xb2\\x1e\\x01\\x6b\\x5c\\x19\\x6c\\x1b\\xa3\\x11\\x57\\x08\\xf5\\x81\\xbb\\x82\\xf4\\xb5\\x7a\\x6c\\xa1\\xa5\\x29\\xe6\\x4d\\x19\\x30\\x42\\xc1\\xdc\\x5f\\xaa\\x0a\\x03\\xab\\xf5\\x38\\x49\\xe1\\xbd\\xef\\xba\\xb6\\x4b\\x1c\\xb6\\x0f\\xe1\\x0a\\x3f\\xc1\\x82\\x3a\\x23\\x4c\\x45\\xf3\\xb0\\xdc\\xe6\\x6a\\x46\\x73\\x9c\\x01\\xae\\xad\\x12\\xde\\x6f\\x03\\x13\\xc7\\xbe\\x71\\x40\\x5f\\x3f\\xdc\\x4a\\x50\\x7a\\x9d\\x84\\xe8\\x68\\x6f\\x6f\\xc9\\x26\\x35\\xdb\\x0f\\x78\\x56\\xc7\\x37\\x3a\\x61\\x8a\\x72\\x52\\xc1\\x29\\xa7\\x76\\x0e\\x20\\x29\\x54\\x3d\\x72\\x62\\x28\\xc2\\x1d\\x00\\xad\\x4a\\xc5\\x2e\\x5b\\x1a\\x6e\\x31\\x20\\x09\\x17\\xf1\\x5a\\xf5\\x15\\x85\\x9e\\x08\\xf2\\xa7\\x9a\\xce\\x67\\x99\\x1e\\xd6\\x90\\x44\"},\n{{0x2b,0xe1,0xf9,0x8c,0xe6,0x55,0x3c,0x91,0x5b,0x6a,0x09,0x33,0xec,0x0d,0xe3,0x47,0xb3,0x70,0xe2,0x9c,0xa2,0x94,0xe8,0x00,0x55,0x41,0x23,0x9f,0x63,0xb4,0x30,0xd0,},{0x7a,0x6f,0x44,0x69,0xc3,0x0a,0x63,0xf5,0x60,0xf9,0x87,0x34,0xfc,0x19,0x06,0xeb,0xd1,0x37,0x1e,0xd8,0x01,0x25,0xfa,0x3e,0x4c,0x86,0xb4,0x3f,0x26,0x2c,0xab,0xbc,},{0x8e,0x65,0x9a,0x3f,0x53,0x5a,0x58,0x9a,0x5f,0xd2,0xd2,0x17,0xcb,0xcb,0x8b,0x77,0x7e,0x5a,0xf2,0x0b,0x23,0x44,0x32,0xf7,0xda,0xc2,0x9f,0x81,0x0a,0x2b,0x47,0x37,0xc5,0xca,0xb1,0x0b,0x59,0xdf,0xd0,0x14,0x4f,0x30,0x90,0xf5,0xf9,0xe0,0xe6,0x67,0xf0,0xe2,0x1a,0x9f,0x57,0x3f,0xe1,0x3b,0x1c,0x28,0xec,0xcb,0xb5,0x31,0xa2,0x05,},\"\\x62\\x68\\x20\\x1f\\x93\\x2a\\x7c\\xd3\\xf8\\x79\\xae\\x6a\\xb8\\x38\\x55\\xa2\\xf5\\x02\\x91\\xde\\x78\\x4d\\x7d\\x9e\\x9a\\xda\\xa1\\xb9\\xaf\\xed\\x6f\\x5a\\xea\\x20\\x24\\x0e\\x59\\xfe\\x93\\xe5\\xa7\\x08\\x8c\\x95\\xec\\x8e\\x15\\x74\\x5f\\xb8\\xfd\\xeb\\x91\\xdf\\x01\\x51\\xc7\\xb4\\x60\\x50\\x67\\x56\\x1e\\xa0\\x8d\\xbf\\x00\\xc4\\xff\\xe1\\xfd\\x0a\\xcf\\x10\\x36\\x56\\xa7\\xb5\\x4f\\xad\\x0f\\x25\\xab\\x16\\xb4\\xbd\\xa3\\x47\\x17\\x9e\\xd1\\xca\\xdb\\x7b\\x98\\xbe\\x08\\x95\\xe0\\x50\\xdc\\xbc\\x37\\x9d\\x1f\\xd5\\x53\\xe9\\x97\\x95\\x92\\x8b\\x67\\xa7\\x52\\xf8\\xd2\\xec\\x1b\\x9d\\x66\\xbf\\x6a\\xc9\\x97\\xe7\\x44\\xdc\\x32\\x7f\\x24\\x22\\x30\\xf9\\x2e\\x79\\xae\\x31\\x27\\x45\\xa5\\xab\\x6d\\xde\\xc1\\x99\\x8f\\xb6\\x3d\\xc4\\xf6\\xb0\\x5f\\x14\\x72\\x22\\xd4\\xb6\\x5a\\xce\\x90\\x17\\xdc\\x1b\\xcd\\x67\\x5e\\x49\\x5f\\x9e\\xab\\xb5\\xf6\\x02\\x13\\x3f\\x6c\\x72\\xe0\\x53\\xe9\\xf4\\xae\\x30\\xd8\\x72\\xd7\\x8b\\xf7\\x1f\\xeb\\xa3\\x7a\\xcc\\x59\\x50\\x55\\xc3\\xbe\\xa5\\x3a\\x05\\xef\\x0c\\x7f\\x21\\x2d\\xcf\\x4e\\x0a\\xf8\\x38\\xea\\x29\\x28\\xf4\\xcd\\xc9\\xfd\\xc8\\x37\\xda\\x25\\xf2\\x69\\x66\\xb2\\x45\\x6a\\xbe\\xa6\\x6a\\x5d\\xfb\\x8f\\xaa\\x8f\\xa0\\x91\\xf7\\x33\\x1d\\x54\\x36\\xe9\\x8a\\x8d\\x63\\x23\\xcc\\x9e\\x9a\\x91\\xd5\\xa0\\x2a\\x49\\x51\\x17\\x14\\x84\\x9b\\x47\\x45\\x4b\\xaf\\x99\\xc5\\xf8\\x50\\xa0\\x8d\\x3d\\x98\\x41\\x0e\\x93\\x9a\\x9e\\x89\\xb1\\x50\\x53\\x82\\x5f\\x3e\\x9a\\xee\\x71\\x44\\x74\\x16\\x14\\x07\\x82\\xe1\\xbf\\x3b\\x0d\\x8b\\x4f\\xf6\\x2e\\x77\\xa4\\xa0\\x3f\\x71\\x0a\\x8a\\xb7\\x6c\\xf6\\x35\\x92\\xc0\\x5c\\x44\\x0c\\x8f\\x06\\x47\\x70\\x09\\x91\\x63\\xc1\\x22\\x70\\xf3\\xd5\\xec\\x9a\\x6b\\xc9\\x71\\x5b\\xff\\xfe\\xc7\\x69\\x61\\x1d\\x21\\xfa\\x00\\x3c\\x3c\\xc8\\x35\\x6c\\x97\\x5d\\x37\\xb6\\x2b\\x88\\xaa\\xbb\\x85\\x97\\xda\\xca\\x19\\x6c\\x96\\x48\\xa3\\x1d\\x15\\xbb\\x0b\\x86\\xcf\\x07\\x0e\\xe0\\x1e\\x51\\x1e\\xf3\\x73\\xb4\\xa4\\x4c\\x6a\\x00\\x16\\x0a\\x79\\x7f\\x2e\\x82\\x0b\\x71\\x6f\\x5c\\xa6\\x44\\x64\\xe4\\x18\\x9a\\x00\\xfe\\xe9\\x78\\xd3\\x5b\\xf2\\x04\\xf7\\x1d\\xb1\\xf5\\x01\\xf9\\xb6\\xe5\\xdf\\xc8\\x21\\xa8\\xaf\\x5d\\xbf\\xef\\xd3\\x53\\xad\\x36\\x81\\xf9\\xbc\\x3c\\x22\\xc6\\x7c\\xb2\\x11\\xb4\\x30\\xb6\\xa5\\x5f\\x3e\\x73\\xda\\x7c\\x3a\\x07\\xce\\xb7\\xd2\\xfe\\x25\\x4b\\x10\\xc2\\x70\\x3a\\xb2\\xe2\\x29\\x4d\\xd0\\xd3\\x15\\x2d\\xc7\\xb2\\x1a\\xab\\x87\\xb1\\x50\\xf7\\x37\\xa9\\x47\\x46\\x3f\\xb2\\x04\\x17\\x5d\\xe8\\x54\\x32\\x36\\xfb\\xb0\\xda\\x5c\\x7d\\x48\\xc5\\x7f\\x61\\x74\\x4d\\xe6\\xf9\\x84\\xaa\\x8e\\x61\\xb9\\x70\\xc6\\x2d\\x0e\\xeb\\x84\\x9d\\xa7\\xe8\\x9a\\x61\\x22\\x2d\\x43\\x20\\x79\\xcb\\xcf\\x5f\\x8a\\x2b\\xa9\\x30\\x30\\x16\\x83\\xc0\\x78\\x5c\\x26\\xfd\\xf8\\x5d\\xa3\\x02\\x08\\x74\\x60\\x45\\x99\\xac\\x6c\\x84\\x7e\\xc2\\x60\\x86\\x58\\xb5\\x78\\x8c\\x7b\\x8d\\x3a\\x37\\x44\\xfd\\x54\\x42\\xe2\\x4c\\x8e\\xec\\xcd\\x42\\x07\\x56\\xbd\\xd8\\xb8\\xa7\\x7c\\xfd\\x80\\x58\\x96\\x05\\xdc\\xed\\x9a\\xfd\\xa2\\xbd\\xb6\\x30\\xa0\\xcb\\x61\\x2f\\x73\\x9c\\xe6\\x17\\xd5\\x4e\\xde\\x6c\\xcf\\x36\\xaa\\x31\\xe7\\xe3\\x73\\xd8\\xa0\\xfb\\x1b\\x7c\\x99\\x06\\xf7\\x6b\\x5f\\x9d\\xe8\\xc2\\x68\\x91\\xde\\x00\\x6e\\xb7\\x97\\xea\\xd4\\xa8\\x6f\\x70\\x16\\xf3\\x4b\\xcd\\xe9\\x2f\\x94\\xac\\x3e\\x92\\x0b\\xa5\\x8d\\x6d\\xff\\x77\\x20\\x78\\xd8\\x02\\xa9\\x4f\\x56\\xcb\\x26\\xbf\\x79\\x4f\\xd9\\x0c\\xa0\\xad\\x4f\\x2e\\x7a\\xcd\\xc5\\x92\\x9b\\xc7\\x36\\x49\\x97\\xde\\xd9\\x8c\\xa6\\x9c\\x57\\x39\\x91\\xbb\\x9a\\xb8\\x5f\\x23\\x5b\\x63\\xe7\\x6f\\x77\\xe0\\xab\\x45\\xe7\\x89\\x12\\x38\\x98\\x69\\xaf\\x21\\xe7\\x4e\\x66\\xf7\\xc4\\x56\\xb8\\x27\\xe6\\x70\\xbe\\xb0\\xf0\\x72\\x66\\x88\\xbb\\x1f\\x90\\x36\\xd3\\x8d\\xa0\\x7d\\x69\\xea\\x36\\x66\\xf7\\x6b\\xd6\\x05\\xd8\\x2e\\x2d\\xd6\\x38\\x7e\\xce\\x6e\\x82\\x4a\\x56\\x97\\x00\\xf0\\x1b\\x19\\x5d\\x1a\\x9b\\xdc\\xb0\\xf9\\x6a\\xb5\\xc5\\x4e\\x06\\xc2\\x11\\x9b\\x40\\x6b\\xc4\\x88\\x84\\x80\\x66\\x04\\x18\\xbb\\x42\\x88\\xea\\x2f\\xda\\x96\\x63\\x1b\\x0e\\x1f\\x60\\xac\\x86\\x1d\\x6c\\xcc\\x4c\\x84\\x4b\\x64\\x7a\\x7d\\x74\\x03\\xbc\\x2d\\x15\\xba\\xfe\\x4a\\xf6\\x77\\xe8\\x56\\xfe\\x0d\\x2b\\x5f\\x66\\x3b\\xe4\\xe4\\x80\\xb3\\x8f\\x6b\\x76\\x6a\\xdc\\xd3\\xd0\\x52\\x98\\xef\\x13\\x98\\xd0\\x4d\\x15\\x23\\xa6\\x8b\\x91\\xdd\\x31\\xcf\\x5d\\xc4\\xb7\\x3d\\xec\\xbf\\xd7\\x21\\x3f\\x98\\x1b\\x20\\x7e\\x1f\\x6e\\xf2\\x25\\xd7\\x94\\x8a\\x1a\\xa1\\x7d\\x8d\\x57\\xa1\\x12\\xf1\\xd4\\x46\\x8d\\x2d\\x28\\xf7\\xec\\x2e\\x54\\xb7\\x4a\\x69\\x2c\\x59\\x58\\x02\\x2e\\x82\\x03\\x1a\\x41\\xb3\\x15\\x09\\x0e\\xd4\\xd5\\xbd\\x7b\\xd0\\xb4\\x51\\x47\\x63\\x38\\xf7\\x39\\xa7\\xd7\\x03\\x1a\\xf2\\xd3\\x6c\\xaa\\x09\\xff\\xdb\\xb7\\xc3\\x96\\x50\\x7c\\x75\"},\n{{0x10,0xbb,0xe6,0xe7,0x61,0xa7,0x5c,0x93,0x5b,0x51,0x7f,0x09,0x36,0xfe,0xcb,0x9e,0xc6,0xfc,0x21,0x5e,0x58,0x13,0x08,0x00,0xea,0x18,0xd1,0xff,0x44,0x2a,0x4f,0x13,},{0x86,0x43,0xdd,0xf8,0xaa,0x8d,0x9c,0x8a,0x78,0xb6,0xeb,0x69,0x9f,0xd2,0x0a,0x57,0xf6,0xf1,0x86,0x36,0xb0,0x6c,0xe6,0x9d,0xac,0xdc,0xa1,0x26,0x7a,0xcb,0x39,0x54,},{0xf0,0xf3,0x57,0x41,0x03,0x73,0x31,0x3b,0x7c,0x62,0x52,0xd6,0xd9,0x66,0x00,0x36,0x0c,0x23,0x75,0x2d,0x43,0x1c,0xa8,0x07,0x5b,0xcf,0xb7,0x72,0xd4,0x9c,0xd6,0x09,0xb6,0x5c,0x9c,0xd8,0x38,0xd6,0x34,0xd8,0xd9,0xb9,0x5d,0x1e,0xe3,0x0e,0xde,0xcc,0x13,0xe3,0xca,0x99,0x7b,0x24,0x37,0x30,0x3f,0x8a,0x33,0xa1,0xff,0xc8,0x33,0x06,},\"\\xe8\\x10\\x8c\\x6d\\xe4\\x13\\x37\\x33\\xdc\\x19\\x9a\\x73\\x39\\x2e\\x22\\x6f\\x71\\x2c\\x36\\xa2\\x4f\\xa9\\x1d\\x6f\\xb0\\x9f\\x92\\xdf\\x21\\x8d\\xeb\\x2d\\x28\\x30\\xa6\\x68\\xfd\\x69\\x4b\\x48\\x09\\xd0\\x25\\x35\\x07\\x23\\x12\\x47\\xc7\\xf2\\x58\\xb4\\xd6\\x5c\\x56\\xbb\\x69\\x34\\x5e\\xf6\\xaa\\x97\\xe7\\xc5\\x9e\\x81\\x53\\x77\\x5a\\x5a\\x3c\\xf1\\x09\\xc4\\xbc\\xa9\\x81\\x55\\x69\\xda\\x69\\x32\\xe8\\x21\\x83\\x42\\x5b\\x42\\xd7\\x48\\x3c\\x9d\\xbf\\xcb\\xd8\\xeb\\x38\\xc8\\x47\\x29\\x57\\x1e\\x8e\\xc9\\x39\\x82\\xc3\\x17\\x71\\x67\\x59\\x59\\x8c\\x4f\\x6a\\x1b\\x7f\\x8d\\xa7\\x30\\x6a\\x78\\x15\\x72\\x1c\\xaf\\x02\\xe7\\x02\\x46\\x71\\x23\\x14\\xf7\\x66\\xbe\\x9c\\xb1\\x77\\xcd\\x2f\\xa3\\xbd\\xa2\\x2c\\xd6\\x76\\xc5\\xd2\\xe8\\x6e\\x8d\\x79\\x8f\\xd3\\x4f\\x54\\x3c\\x9b\\xe3\\x12\\x96\\x51\\xf2\\x73\\xf4\\x84\\xf0\\xb9\\x46\\x7b\\x14\\x09\\x55\\xcd\\x29\\x81\\xff\\x26\\x03\\xc0\\xbd\\xbb\\x43\\x6a\\xc0\\x95\\x5a\\x11\\x6c\\x5e\\x5f\\xc3\\x04\\x25\\xe1\\xfe\\x78\\xf6\\x41\\x0f\\x6e\\xf7\\x57\\xf6\\x04\\x66\\x88\\x54\\xba\\xe7\\x9b\\xfe\\x22\\xe1\\xa8\\x5c\\xe5\\xee\\x5d\\x64\\x34\\xb4\\x61\\x01\\x20\\xea\\x7e\\x5d\\x3d\\x13\\x7c\\xe2\\x07\\x51\\x4f\\x85\\x34\\xad\\x9b\\xf3\\x92\\xb7\\xdc\\x53\\x55\\x51\\x4b\\x59\\xf8\\x35\\x46\\x6c\\x8e\\xb5\\x6f\\x44\\xed\\xdc\\x5b\\xad\\x20\\xcf\\x0b\\x48\\x0b\\x2e\\x82\\x2a\\x6f\\x46\\xfd\\x95\\xf3\\x0f\\x18\\x3c\\x7b\\xb3\\x14\\x3e\\x4e\\x61\\x00\\xe2\\xdb\\xc9\\xf2\\xbf\\x0d\\x43\\x07\\x3e\\x0f\\xe6\\x5f\\x01\\xbc\\xce\\x6a\\x1a\\xe4\\x01\\xc1\\x25\\x41\\xbe\\x3a\\xe6\\x8c\\xde\\xac\\x2a\\x4a\\xc7\\x1f\\x16\\x63\\xb5\\xfd\\xfc\\x2e\\x50\\xf0\\xe0\\x77\\xfb\\x3a\\x0a\\x8b\\x8e\\xee\\xad\\x62\\x7c\\x1c\\x3e\\x79\\xdd\\x73\\x61\\x04\\x6f\\x7e\\x57\\xc1\\x74\\x36\\xc3\\x2d\\xc4\\x43\\x2f\\x05\\x00\\x28\\xcc\\x7a\\xa4\\x40\\x8c\\x2d\\x29\\xd1\\xd7\\x99\\x8f\\xdc\\xdd\\xa3\\x2b\\xb3\\x2f\\x70\\x4d\\xc2\\x63\\xdb\\x9b\\x8e\\x06\\xc5\\x76\\x30\\x87\\x0f\\x8b\\xb6\\xec\\x66\\x1f\\xde\\x1b\\x7d\\xa9\\x4d\\x53\\xb0\\x47\\x70\\x1a\\x45\\x88\\x47\\x8c\\x1c\\x66\\x23\\x46\\x74\\x1a\\xea\\xc4\\xc2\\x53\\x38\\x55\\x6a\\x3d\\x84\\x8d\\xe5\\xb2\\xa2\\x3e\\xce\\xa6\\x1b\\x77\\x6b\\xd0\\xe8\\x03\\x7e\\xfb\\x85\\x01\\xef\\xf2\\x39\\xc7\\xfa\\xcc\\xa6\\xc8\\x36\\x7e\\xd7\\xc8\\xad\\xce\\x91\\x9f\\xef\\x1a\\x15\\x5a\\xe0\\xd5\\x47\\x8a\\x98\\x00\\x2c\\x95\\xa1\\x6f\\xbf\\x4c\\x0e\\xd0\\x16\\xea\\x5d\\x38\\x66\\xfe\\x1d\\xe4\\x54\\x83\\x2a\\x4e\\x95\\x65\\x97\\x6b\\x60\\xb3\\xdd\\x2e\\xaf\\x7f\\xee\\x61\\x2f\\x2b\\xc0\\x40\\xd9\\x39\\x75\\x43\\x5e\\xeb\\xd1\\x2f\\x06\\xeb\\x09\\xec\\xea\\x2c\\x66\\x76\\x83\\x08\\xf5\\x8c\\x77\\xac\\x51\\xed\\x7b\\xd2\\x16\\x36\\xfc\\x9c\\xc3\\xfd\\x14\\x87\\x0b\\xd0\\x6b\\xdf\\x12\\x8a\\x81\\xb1\\x47\\x92\\xe6\\x08\\xc4\\x7e\\xa2\\xd5\\x35\\xca\\x7a\\xa2\\x1e\\xb8\\xa8\\xa5\\x6d\\x76\\x99\\x16\\x63\\xa8\\x19\\x0a\\x95\\x05\\x7d\\x33\\x67\\x1e\\x73\\xc7\\xcb\\xce\\x5a\\x98\\xd3\\x1e\\xf0\\xd7\\x3b\\xd0\\xb1\\x63\\x78\\x7b\\x7f\\xdc\\xd2\\xdd\\xfc\\x72\\x96\\x0f\\x2b\\xe3\\x20\\x84\\x6d\\x4b\\x29\\x08\\x0d\\x7a\\xeb\\x5b\\x7e\\xa6\\x45\\xa2\\xad\\x5a\\x59\\xc0\\x12\\xbf\\x7b\\x95\\x15\\xd8\\x59\\xe1\\xc1\\x47\\x2e\\xf8\\xa4\\xd3\\xc9\\x5e\\x71\\x1a\\xf9\\x7a\\xe4\\x61\\x8e\\xfb\\xab\\x3d\\xff\\xe8\\x8c\\x9f\\x6a\\xf4\\xa0\\x9b\\x0e\\x73\\x38\\x7e\\x25\\x1b\\x77\\xd7\\xbf\\xf5\\x21\\x4f\\x79\\x18\\x62\\xdb\\x69\\x88\\x41\\x1e\\x2a\\xe2\\xc7\\x5b\\xf2\\x8d\\x28\\x60\\x2a\\x63\\x7c\\x26\\xf4\\x9c\\x18\\xd3\\x09\\xd2\\xfc\\x58\\xa1\\x26\\x66\\x7a\\xd3\\xc2\\xec\\x16\\x0c\\x99\\xba\\x40\\xfb\\xda\\xc1\\x7e\\x7e\\x4c\\x21\\xa5\\xd5\\x07\\x85\\x97\\x62\\xeb\\xa0\\x9c\\x41\\x60\\xdf\\x66\\xf5\\xfe\\xef\\xe6\\x71\\x5a\\x28\\xc5\\x29\\x6c\\xf4\\x3e\\x5e\\x77\\x1f\\x31\\xfc\\xe5\\x13\\x3b\\xe9\\x7c\\xab\\x57\\x30\\x1b\\x4c\\x9d\\xf9\\xcd\\x9a\\x4a\\xcf\\x1c\\x33\\xfa\\xc9\\x46\\xfa\\x15\\x96\\xfa\\x65\\xc8\\xf3\\x65\\x8b\\xe4\\x7a\\x47\\x3a\\x62\\xc5\\x21\\x81\\xec\\xa1\\x83\\xe4\\x24\\x6c\\xd6\\x24\\xd8\\x78\\x3d\\xcc\\xe5\\xfd\\xcc\\x1f\\xea\\x17\\x3f\\x80\\x71\\xf7\\x07\\x4f\\x55\\x89\\x7d\\xe9\\xbf\\xe8\\x4a\\x6c\\x4f\\xdf\\x80\\x2d\\x50\\x26\\xb8\\x14\\x5e\\x6c\\x8c\\x89\\x50\\xaf\\xc5\\xb4\\x0f\\xd0\\x35\\x6f\\xc5\\x5e\\xe1\\x7e\\x1f\\x85\\x3a\\x4c\\x2f\\xcc\\x34\\xa1\\x36\\x9b\\x87\\xd2\\x8d\\xc2\\xfd\\x20\\x10\\xf1\\x99\\x03\\xaf\\xf8\\xe4\\x6d\\xe0\\x49\\x38\\xf4\\x94\\x82\\x45\\xd5\\xb4\\x25\\xd0\\x74\\xac\\xdf\\x2b\\xd8\\x0b\\xfc\\x37\\x35\\xcc\\x34\\xa2\\x25\\x90\\xf1\\x94\\xaf\\x93\\x13\\xee\\xf4\\xab\\x5f\\xde\\x61\\xf1\\xf9\\xb5\\x85\\x78\\x63\\x8f\\xcb\\x4f\\x28\\x50\\xb2\\xfc\\xe6\\xe0\\x3d\\xb4\\xd0\\xa8\\x34\\x84\\x81\\x63\\xc4\\xb2\\x7e\\x12\\x9f\\x5c\\xc7\\x4f\\x67\\xf0\\x08\\xa2\\x71\\x2d\\x1d\"},\n{{0x18,0x6d,0xcc,0x7e,0xfc,0x5e,0xd7,0xe6,0x1a,0xe5,0x3d,0xc4,0x20,0x93,0xba,0xe8,0xf1,0x5d,0xd9,0x9f,0x0f,0x03,0x33,0x26,0xc5,0x76,0xff,0x75,0x69,0x50,0xd0,0x6d,},{0xc8,0xd1,0x41,0xac,0xb6,0x42,0xaa,0x9b,0xfb,0xd5,0x43,0x27,0x7c,0x2d,0xca,0x8a,0xa9,0x88,0x8e,0xef,0xf0,0x45,0x43,0xb3,0x78,0x9b,0x21,0xf2,0x6a,0xeb,0x0f,0x71,},{0x89,0x45,0x06,0x97,0x87,0xc1,0xc6,0x76,0xa8,0x4a,0x70,0x3c,0xae,0x1e,0x0b,0xac,0xae,0xff,0xd3,0x3e,0x91,0xbe,0xc3,0x60,0x3e,0x1f,0x13,0xfb,0x17,0x0e,0x31,0xe6,0xd7,0x04,0x9e,0xda,0x2b,0xf6,0x27,0x18,0x0f,0x45,0x6c,0x3f,0x7a,0xab,0xfc,0xd3,0x6c,0x49,0xa8,0xc0,0x4f,0x8a,0xe6,0x92,0x9e,0xc5,0xad,0xa0,0x7b,0x65,0x72,0x08,},\"\\x97\\x43\\x64\\xd6\\xc8\\x38\\x84\\x2c\\xcc\\x4e\\x74\\x9e\\x6a\\xfd\\x53\\x71\\x70\\xdc\\xd8\\xcc\\x50\\xd6\\x66\\x54\\xd1\\x05\\x48\\x23\\x39\\xca\\xbd\\xf7\\x4e\\x32\\x93\\x5e\\xe2\\x19\\x27\\x2e\\xa1\\x68\\x4f\\xb9\\x3c\\x1f\\xab\\x42\\xb5\\x63\\x18\\x39\\x24\\x35\\x91\\xbd\\x07\\xd3\\xbe\\x94\\x9b\\x0d\\xd1\\x5e\\x31\\x96\\xdf\\x19\\x6b\\xa7\\x52\\xad\\x11\\x21\\xac\\x71\\x12\\xd5\\x66\\x94\\x4e\\x15\\x3a\\x4e\\x06\\x19\\xb3\\xa2\\x32\\x24\\x1f\\x02\\x0b\\xe0\\x71\\x9f\\x6b\\xec\\x91\\x8b\\x26\\x82\\x8e\\xb1\\x67\\x0e\\xcf\\xc7\\x3c\\x66\\x84\\x4e\\xa3\\xe4\\x04\\xc6\\xa2\\xfc\\x01\\xbe\\xb4\\x03\\xc9\\xd6\\xca\\x55\\x1a\\xd8\\xa6\\xe7\\x1f\\x46\\x64\\x7f\\xa6\\x05\\x3f\\x03\\x14\\xf8\\x12\\x4d\\x8d\\x2b\\xc1\\x2c\\xc8\\xfa\\x8d\\xb9\\x5f\\x2b\\x73\\x53\\x75\\x20\\x1b\\x81\\x6a\\x9c\\xf4\\x0f\\x83\\xee\\x4b\\x86\\x71\\x61\\x80\\x32\\xde\\x22\\x9c\\xe7\\x62\\x71\\xd0\\x3d\\x26\\x72\\xa1\\xae\\x4a\\x28\\x8c\\x85\\xdc\\xd2\\x7f\\xb8\\x45\\x2a\\x81\\x32\\xe9\\xff\\x29\\xe1\\xe8\\x9b\\xf1\\x1b\\x1c\\x83\\x51\\x92\\xc0\\x4b\\x13\\xbe\\x14\\xf3\\xcd\\xe5\\xd3\\x7c\\xe9\\x6f\\x1d\\xc2\\xa9\\xcc\\xda\\x0c\\x4d\\x73\\x7b\\xca\\x1f\\xa2\\x20\\xd2\\x1b\\xf3\\x60\\xb9\\x05\\x15\\xbb\\xd2\\x26\\xbb\\x2a\\x6c\\x8d\\x5f\\x2a\\xb0\\x18\\xd4\\x08\\x4e\\x24\\xee\\x33\\x3c\\xe4\\xe3\\x9b\\xcb\\x6b\\x46\\xe7\\xae\\xb4\\xdb\\x9b\\x6c\\x65\\xb2\\x44\\xd9\\x82\\x82\\x3a\\x77\\x0f\\x9c\\x62\\xa0\\xbd\\xe2\\xcb\\xb7\\xec\\x36\\x84\\x0d\\x45\\x51\\x87\\xfa\\xff\\x4e\\x48\\x8a\\x5c\\x60\\x8e\\xbd\\xb7\\xdb\\x84\\xd8\\x7d\\xad\\x38\\x67\\xe3\\xb0\\xd0\\x4b\\x64\\x71\\x5e\\x16\\x56\\x0a\\x62\\xf1\\xee\\x03\\xdf\\x61\\x83\\xfd\\x5e\\x37\\x55\\x5d\\xa1\\x97\\x2f\\xca\\x06\\x2d\\x12\\xbb\\x84\\x20\\xe0\\x82\\xda\\xcb\\x8d\\xeb\\xb9\\xc1\\x43\\x85\\x41\\xd0\\xda\\x24\\x64\\xef\\x7e\\xc5\\x22\\x63\\xfb\\x9b\\x9a\\x4c\\x46\\x9c\\x83\\x32\\x3e\\x48\\x19\\xdf\\xdf\\x4f\\xa0\\xa7\\x70\\xc3\\xa7\\x09\\x25\\x4e\\x05\\x31\\x48\\x30\\xe8\\x7f\\xbb\\x67\\x36\\xc7\\x2d\\x9d\\xab\\xe0\\x1a\\x31\\x0e\\x91\\xeb\\xbf\\xae\\x76\\x7a\\x1f\\xcb\\x62\\xf6\\x4f\\xa3\\xba\\x8d\\x53\\x40\\x0d\\x64\\x69\\xad\\x1c\\xcb\\x81\\x1f\\xb9\\xe1\\x15\\xf1\\x41\\x27\\xb1\\x3e\\x83\\x64\\xaa\\x2f\\xe8\\x0b\\xbc\\x88\\x6a\\x10\\xdf\\x1b\\x9c\\xc4\\xae\\x46\\x01\\xf5\\x46\\x1a\\xf0\\x91\\xf5\\x26\\xd2\\x72\\xda\\x9b\\x20\\x38\\x57\\xa4\\x44\\x7e\\xab\\xde\\xf4\\x39\\x83\\x04\\x96\\xa5\\x75\\x9c\\x21\\xde\\x65\\xba\\x3a\\x3c\\x8b\\x8e\\x93\\x9c\\x46\\x13\\x32\\xa9\\x24\\x85\\x2c\\x20\\x5c\\x77\\x11\\xf3\\xa6\\x8a\\x23\\x67\\xa9\\x45\\xde\\xf4\\xfb\\xe5\\xf8\\x1c\\x60\\xcb\\xb7\\xe3\\x94\\xa2\\xa4\\x9b\\xe9\\xec\\x2a\\xae\\xb1\\xf3\\x30\\x57\\x59\\x79\\x44\\x6a\\xd9\\xd0\\xd5\\x4a\\xbd\\x43\\x6f\\x28\\x60\\xf0\\x42\\x34\\x26\\xf4\\xbb\\xc2\\x6b\\x3b\\x9f\\x65\\x0d\\x69\\xb1\\x00\\x72\\xd7\\x47\\xa3\\x9e\\x47\\x8f\\x45\\x5e\\xaa\\x12\\xc7\\xc6\\xe1\\x2b\\xfc\\x45\\x36\\xa3\\x59\\x43\\x44\\xbd\\x02\\xb6\\x20\\xe3\\xe2\\xb4\\xe0\\xd5\\x34\\x08\\x9d\\xd7\\xb0\\x4f\\xa6\\x34\\x80\\x45\\x67\\x58\\x6c\\x62\\xbe\\x03\\x91\\xc7\\xbd\\xb0\\xa9\\xfb\\xc1\\xef\\x3b\\x33\\x21\\x1e\\xdb\\xf8\\xef\\x58\\xc2\\xb7\\xa4\\x9d\\x06\\x66\\x79\\x59\\xd7\\xe5\\xd4\\x46\\x71\\xee\\x73\\x57\\xa1\\x0b\\xa0\\xcb\\x1a\\x44\\x5a\\xe5\\xd7\\x09\\xce\\x25\\x5e\\x92\\xde\\x71\\x59\\x75\\xaf\\x94\\xb8\\x9d\\x4a\\x29\\xc7\\x1f\\x9d\\x88\\xc8\\x5b\\x6c\\xd1\\x1d\\x8b\\x33\\x5b\\xf8\\xf2\\xc6\\x58\\xe6\\xdd\\x7c\\x3f\\x6c\\x80\\xad\\x4d\\x0e\\x5a\\x6c\\x87\\xdb\\xa7\\xb5\\xb8\\xa8\\xa4\\x7e\\x72\\xf4\\xd1\\xd3\\xc7\\x43\\x63\\x1d\\xf9\\xad\\xfc\\xfa\\x45\\xce\\xe0\\x49\\x8d\\x5a\\x44\\xa9\\xf7\\x5c\\x83\\xb7\\x5b\\x2a\\x3c\\x23\\x0f\\xf0\\x76\\x7d\\x38\\x88\\xf9\\x41\\xee\\x1b\\x66\\x24\\xdd\\x0e\\x12\\xd0\\x6e\\xd1\\xab\\x8b\\xb1\\x35\\xff\\xd3\\x79\\xe9\\xde\\x37\\x88\\xbe\\x54\\x1a\\xad\\xb2\\xd6\\xa7\\xcc\\x60\\x13\\x16\\xf2\\x1e\\xb9\\xaa\\xa9\\x22\\xf5\\x6a\\x8e\\x35\\x26\\xc9\\xbd\\x11\\x77\\xfe\\xfc\\x2f\\xbe\\x3e\\x43\\x0b\\x62\\x8e\\xeb\\xd6\\x66\\x1e\\x3b\\xa2\\xd6\\x31\\xc6\\xa8\\x42\\x2c\\x24\\x1e\\xcd\\x96\\x99\\x72\\x41\\x2f\\x74\\xda\\x6b\\x12\\x43\\xbf\\x0f\\xbe\\xe8\\xa8\\x4d\\x52\\xe4\\x0a\\xee\\x3f\\x1e\\x4f\\xc8\\x31\\x40\\x2c\\x62\\xf3\\x57\\x6b\\x22\\xe8\\xe3\\xc3\\xdc\\x4e\\x16\\x0b\\xc3\\xb6\\xb9\\xd2\\xce\\x00\\x58\\x53\\x81\\x2e\\xaf\\xc0\\xa4\\xe2\\x5b\\xa7\\x12\\x27\\x9b\\x00\\xba\\x3f\\x91\\x30\\xff\\x36\\xe3\\xef\\x19\\x71\\xdd\\xe7\\x50\\x8b\\x27\\x92\\xfe\\x64\\xd4\\x75\\x68\\x8f\\xc6\\xf3\\x31\\x3a\\xad\\xb7\\x85\\x30\\x2e\\x6b\\x7f\\x9a\\x84\\xf2\\xdb\\xc2\\xf3\\xcf\\x06\\x0e\\xe0\\x8b\\x46\\x37\\x36\\xf8\\x36\\xdb\\xb2\\x62\\xd3\\x29\\x68\\x4c\\x20\\x84\\x92\\xd1\\x7d\\x81\\x12\\x21\\xbe\\x02\\xb6\\x5e\\xe2\\x8e\\x11\\xb5\\x46\\x92\"},\n{{0x07,0x05,0xb3,0x36,0xc8,0x9c,0xa3,0x5f,0xfd,0xde,0x0a,0xf0,0xf9,0x06,0xea,0xcf,0x62,0x3c,0x56,0xc3,0xf7,0x67,0x38,0x16,0x8e,0x76,0xfc,0xd5,0x88,0x2d,0xf7,0x9e,},{0xea,0xaa,0xf2,0xa1,0x5f,0x44,0xb6,0x34,0xce,0xf1,0x5a,0x63,0x8b,0x80,0x20,0x7f,0x61,0x09,0x9a,0x07,0x96,0xf5,0xd4,0x3f,0x3e,0x9d,0x04,0x8e,0x6a,0xe7,0x96,0xc1,},{0xd4,0xa9,0xba,0xe8,0xec,0xc4,0x72,0xc3,0x76,0xba,0xb8,0x05,0xc2,0xce,0x0c,0x1c,0x2e,0xd5,0xfc,0x77,0x37,0x15,0x46,0x8c,0xb1,0xa4,0x93,0x45,0x64,0xda,0xce,0xcf,0x43,0x8b,0x1d,0xd2,0xac,0x1b,0x5c,0x5e,0x33,0x6a,0x1e,0x20,0x70,0x1d,0x5d,0xcf,0x3c,0x8e,0xe3,0xad,0x22,0x3b,0x13,0x9f,0xa9,0x0a,0x1b,0x55,0x2e,0x1b,0x77,0x07,},\"\\x61\\x6f\\xe1\\x5f\\xcc\\xb3\\x31\\x0f\\x9e\\xc7\\x45\\x64\\x47\\xda\\xda\\xf8\\xe0\\xa5\\xfb\\x26\\x9b\\xe1\\x69\\xb0\\xc3\\xea\\x2c\\xfd\\xaa\\xa5\\x5d\\x37\\x93\\x7f\\xe7\\x5b\\x78\\x32\\x4a\\xc2\\x78\\xa6\\x50\\x47\\xe0\\xae\\x4f\\x32\\x7e\\x97\\xef\\xfc\\xb7\\xbe\\xd9\\x1d\\x09\\xda\\x72\\x0b\\x0a\\x10\\x1b\\xe9\\xe9\\x6d\\x0b\\xa8\\x5b\\x1f\\xf4\\x9d\\x8d\\x1d\\xf3\\x62\\xd3\\x45\\x4f\\x0d\\xb6\\x82\\x55\\x96\\x10\\x1c\\x97\\xe5\\xda\\xca\\xd0\\x7e\\xc4\\x92\\xd3\\x0f\\x2d\\x0c\\xb7\\xe7\\xde\\x4e\\x74\\x4b\\xb6\\xa6\\x10\\x0b\\x75\\x4d\\xa8\\x47\\x41\\x1d\\x09\\xaa\\xce\\x8d\\x5d\\x41\\x07\\x58\\xb8\\x30\\x87\\xdb\\x4b\\x5e\\x62\\x97\\x97\\x9a\\x21\\xfb\\x65\\xaf\\x39\\x09\\x52\\xc4\\xf9\\x36\\x26\\x0e\\x72\\xd7\\xc7\\x83\\x27\\xb9\\x4a\\xa6\\xcd\\x61\\x72\\x78\\xb0\\xce\\x9e\\x1b\\xd3\\xfb\\xed\\x93\\xb6\\x9b\\xc6\\x49\\x85\\xdd\\xe0\\xe2\\xc4\\x35\\x7b\\x50\\x2f\\x05\\x5e\\xe7\\xb0\\xa0\\x38\\x84\\x74\\xda\\xe0\\x2d\\x6c\\x1a\\x73\\x1f\\x87\\x78\\x5d\\x75\\x3a\\xeb\\x0d\\x9c\\xfd\\xf8\\x50\\x02\\xdf\\x56\\x6f\\xc2\\x50\\x7d\\xe7\\xba\\x6f\\xd0\\x35\\xbe\\xe1\\x7a\\x2e\\x80\\x8b\\x4a\\x75\\x88\\xc5\\x83\\x37\\x5c\\x82\\x40\\x7a\\x40\\xae\\x9e\\xeb\\xdf\\x94\\xdf\\x2f\\xb8\\xca\\xbf\\x17\\x60\\x6c\\x43\\x9e\\xa7\\x04\\x59\\xb2\\x12\\xaa\\xe4\\xa3\\xf5\\x30\\xec\\xad\\xc5\\xe8\\x8e\\x25\\x48\\xfa\\x64\\x3c\\x7d\\xdf\\x50\\x63\\xb2\\xe1\\x06\\x73\\xe5\\x9d\\x07\\xfe\\x90\\x68\\x92\\xb6\\x7e\\xb5\\x8f\\x93\\x88\\xa5\\x6b\\x37\\x04\\x52\\xe9\\x97\\x77\\x55\\xfc\\x04\\xdf\\xbc\\x77\\xda\\x6c\\x05\\xbe\\xdd\\xeb\\xf0\\x36\\x52\\x56\\xb5\\x2c\\x9a\\xef\\x8a\\x82\\x17\\x3b\\x8c\\x89\\xfb\\xd9\\x8c\\xea\\x36\\xa8\\xb8\\x96\\xfe\\x66\\xd3\\x7c\\xa7\\x9b\\xec\\x7f\\xbf\\xe9\\x58\\xfe\\x89\\xf6\\x76\\x50\\x85\\xb3\\x35\\xdc\\x77\\x03\\x43\\xe2\\x30\\xca\\xdd\\xfa\\x28\\x33\\xda\\xa6\\x62\\xfe\\x82\\x08\\xdd\\x88\\x5a\\x6f\\xdf\\x72\\xe3\\x6e\\xcf\\x22\\xbb\\xbb\\xcb\\xe7\\x9d\\x37\\x06\\x50\\x23\\x69\\x40\\xbc\\x2e\\x6d\\x4a\\xc7\\x4f\\xe4\\xd5\\x54\\xc9\\xbc\\x23\\x2f\\x07\\xd2\\xaf\\x62\\x20\\xd1\\x57\\xbd\\x2d\\xa6\\xa6\\x61\\x2a\\x08\\x1b\\x4c\\x99\\x04\\xa2\\x86\\x9b\\x13\\x7e\\xe3\\xa0\\x85\\x6f\\x12\\xb2\\xeb\\x87\\x62\\xdb\\x94\\xed\\x0b\\xa1\\x36\\xf2\\x3e\\x7f\\xb4\\xbd\\x1f\\xcd\\xee\\x10\\xdd\\x84\\xe2\\xcd\\x3b\\x0a\\x49\\x14\\x8a\\xc7\\x4d\\xb4\\x66\\xdb\\xee\\xf8\\x1e\\x6a\\x8c\\xe0\\x86\\x11\\x02\\xde\\x9b\\x1a\\x3e\\x1d\\xcf\\x5c\\x6b\\x03\\x08\\xa8\\x2e\\x3a\\xc7\\xc2\\x28\\x3c\\x7c\\xc2\\xf3\\x4f\\xfa\\x14\\x5b\\x9f\\x74\\xb7\\x99\\x04\\xb3\\x2b\\x79\\xe9\\x60\\xb8\\x14\\xaa\\xde\\x63\\xa0\\xdf\\x01\\x67\\xdc\\xd2\\x4e\\xd9\\x0a\\x8d\\xa7\\xb9\\x34\\xc7\\x72\\x93\\x2f\\x5a\\x47\\x8f\\xe2\\xa7\\x2f\\x94\\x5a\\x13\\x09\\x6e\\xc3\\x7c\\xe7\\x64\\xb5\\x81\\xeb\\x89\\xe5\\xf6\\xb2\\xbd\\x7e\\xb8\\x8b\\x85\\xa8\\x95\\x87\\x77\\x4d\\x45\\x8c\\x58\\xcd\\x87\\x94\\x57\\x97\\x3d\\x64\\x8e\\xf7\\x71\\xc5\\xf1\\xde\\xb2\\x7a\\x0c\\xc5\\xb2\\x92\\x46\\xac\\x2f\\xa1\\x2d\\x18\\xdd\\xc6\\xb9\\xf9\\xac\\x9c\\xf1\\x46\\xc3\\xf2\\x2b\\x1e\\x44\\x99\\xad\\xee\\xfb\\xcd\\x22\\x49\\x74\\x0e\\x13\\xa2\\x24\\xe7\\xb6\\xb3\\xef\\x15\\x60\\x5e\\x7e\\x74\\xe6\\x8d\\x7b\\x72\\x64\\x24\\x09\\xb9\\x0c\\x4e\\xc1\\x61\\xeb\\x24\\xc9\\xb4\\x0f\\xf9\\xc7\\xe6\\xe5\\xda\\x98\\x32\\x2a\\xca\\x52\\xc4\\x6a\\x8d\\xdc\\x19\\x0f\\x1c\\xab\\x15\\x7c\\x4c\\x76\\x19\\x60\\x1a\\x6b\\x33\\xdf\\x6a\\x50\\xda\\x66\\x1b\\xc7\\x53\\x60\\xdf\\xf6\\x97\\x50\\xd3\\x45\\x74\\x09\\xcc\\x02\\x41\\xc3\\xe8\\xc4\\xb3\\xe5\\x06\\xd4\\x26\\xaf\\x52\\xb7\\x02\\x31\\xcd\\x6c\\x91\\x26\\x0c\\xc4\\x31\\xe4\\xcc\\xfd\\x49\\x6c\\xa1\\x4c\\xea\\xae\\x1c\\xda\\x78\\x72\\x1e\\x16\\x33\\x9d\\x52\\x68\\x2b\\x69\\x51\\xf9\\x66\\xc7\\xda\\x5c\\x6e\\x10\\xd9\\x19\\xae\\x66\\xa9\\xf5\\x2d\\xec\\x10\\x86\\x75\\x38\\xd3\\xdf\\x6d\\x59\\x3a\\x32\\xdb\\x69\\x5a\\x8d\\x77\\x45\\x70\\x35\\x16\\xea\\x56\\xf8\\xc1\\xc8\\xf0\\xef\\x53\\xbd\\xeb\\x7f\\x53\\xc2\\xd9\\x44\\xf5\\x11\\x94\\x0c\\xcb\\x90\\x62\\x49\\x22\\xac\\x59\\x9f\\x46\\x19\\xc3\\x04\\x62\\x07\\xd6\\x05\\xf6\\xff\\x94\\xde\\x78\\x8d\\x25\\x34\\x22\\x29\\xdc\\x8a\\xf9\\x2b\\x5f\\xdf\\x0d\\xd7\\x1d\\xf2\\xb4\\x46\\xcd\\xf1\\xd9\\xa2\\x05\\x24\\x33\\x9e\\xe1\\xc3\\x18\\x26\\x28\\x7e\\xf7\\x27\\x81\\xa7\\xa3\\x52\\x89\\xf8\\x5a\\x15\\xba\\x57\\xc7\\xfd\\x5d\\x88\\x5b\\xd0\\x55\\x3a\\xb4\\x08\\x05\\xf5\\x17\\xe8\\xf1\\xb1\\xb3\\xc4\\xfc\\x67\\x71\\xe6\\xf2\\x24\\xbc\\x03\\x11\\x24\\xb9\\xc9\\xae\\xb1\\x9c\\x5a\\x96\\xbf\\x14\\x88\\xe1\\xe6\\x6c\\x6e\\x88\\x80\\x92\\x30\\xc8\\x3a\\x74\\x15\\x55\\x54\\xa2\\x19\\xec\\x37\\x9a\\xe5\\x4a\\x9f\\xe7\\x9d\\xbe\\xde\\x3d\\x57\\x60\\x42\\xa6\\x35\\xd1\\x97\\xf4\\xd8\\x18\\xc7\\x78\\x75\\x5b\\x8b\\x45\\xe5\\x13\\xde\\xac\\x88\\xf6\\x04\\x25\"},\n{{0x95,0x17,0x4a,0x09,0x15,0x68,0x4c,0xdb,0xb6,0x19,0xb0,0x55,0x49,0x5b,0x00,0xf1,0x92,0x82,0xcf,0xfc,0x3b,0x05,0x01,0x9e,0x6a,0xb7,0x09,0xa4,0xa1,0x74,0x2b,0xab,},{0xaa,0x8c,0x87,0x2d,0x7e,0x10,0xb6,0x7f,0x7f,0xf2,0x41,0x72,0xc3,0x63,0x7e,0x80,0x82,0x5a,0x0a,0x71,0xee,0x0c,0x48,0x86,0x3a,0x2a,0xcd,0xcb,0xe8,0xda,0x45,0x9a,},{0x78,0x0f,0x40,0xc2,0x0f,0xea,0x3b,0x11,0xc9,0x42,0x2a,0x43,0xb9,0xa6,0xf7,0x96,0x11,0xe7,0xf1,0xf5,0x9d,0x14,0x88,0xc1,0x5a,0x5f,0xd2,0xd3,0x2c,0x07,0xda,0xdc,0x39,0x1c,0x38,0x95,0x3e,0xdf,0x0d,0xe4,0x8b,0xe5,0x2d,0xa2,0xaf,0x33,0x5c,0x47,0xb8,0xd2,0xe4,0x4a,0xb9,0xd3,0xdf,0xb7,0x6b,0xa5,0x38,0xb0,0x66,0x49,0x52,0x08,},\"\\x5e\\x1a\\x74\\x00\\x45\\x6c\\xad\\x4f\\x9b\\xa8\\x66\\x43\\xbc\\x7c\\xbf\\x3b\\x35\\x68\\xdc\\xb5\\x22\\xb3\\x70\\x55\\xe8\\xc3\\x9d\\x3c\\x80\\xf2\\x28\\x42\\x38\\xe5\\x72\\x7f\\xd7\\x51\\x3c\\xc8\\xb3\\x1c\\x57\\xae\\x7b\\x40\\x50\\xaa\\x81\\x9f\\xc2\\x36\\x09\\x30\\xeb\\x0d\\xd6\\x77\\xa5\\xb2\\xc7\\x29\\xfe\\xb2\\xda\\x3a\\xd7\\x9a\\xe7\\xfc\\xcd\\xdd\\xb6\\xc0\\x84\\x46\\x26\\x1e\\xc9\\xbb\\xe5\\x9c\\x64\\xe9\\x9a\\xbb\\xc8\\x6d\\x3c\\x48\\x35\\xf0\\x0f\\xef\\xe5\\x27\\x43\\x3a\\x50\\x1a\\x3b\\x6d\\x57\\x2c\\xf5\\xe1\\x2a\\x88\\x01\\x0b\\x46\\xa4\\x72\\xb9\\xbd\\x86\\x91\\xa4\\x07\\xc3\\x65\\xf9\\xf7\\x16\\x34\\xb4\\xd9\\x7e\\xdf\\xdf\\xf0\\x63\\x14\\xc0\\xc1\\xb4\\xeb\\x93\\xc7\\x60\\x7f\\x1d\\x6f\\xa3\\x54\\x65\\x93\\x22\\xc2\\x84\\x07\\x3f\\x42\\x60\\x25\\x18\\xc5\\x4f\\xdf\\x26\\xea\\x2c\\x27\\xc8\\x0a\\x6d\\xfa\\x20\\x56\\x83\\x91\\xab\\x35\\x72\\x82\\xc0\\x6b\\x23\\xbe\\xdc\\x1d\\xf1\\x26\\x4b\\x61\\x1c\\x1e\\x9c\\xf1\\x8a\\xeb\\xe2\\x49\\xfd\\x86\\x17\\xc6\\xe3\\xee\\x98\\xc5\\x3c\\x0f\\x6f\\x21\\x75\\xc5\\x7e\\xf8\\xe2\\x06\\xbd\\x3c\\xf1\\x05\\x62\\x7a\\x98\\x92\\xeb\\x68\\x99\\x20\\x21\\x3a\\xae\\xb6\\x3d\\x87\\x66\\x3d\\xbf\\xa5\\x3f\\x0f\\xb2\\x81\\x62\\x69\\x48\\x29\\x6b\\x2d\\xbc\\xdd\\xe1\\xc5\\x1a\\xf8\\x62\\xee\\xcf\\x1c\\xfe\\x8a\\x46\\xa2\\xc4\\xb2\\x8c\\xfe\\x71\\x30\\x33\\x0a\\xd1\\x73\\xf8\\x71\\x27\\xaa\\xca\\xff\\x43\\xc0\\xbd\\xde\\xa4\\x8b\\x00\\x38\\x97\\x6e\\x66\\x2c\\x04\\xb6\\xb0\\x4a\\xd0\\x3d\\xe1\\x24\\x62\\xc2\\x76\\x5d\\xb5\\x35\\x04\\x95\\x20\\xcc\\x11\\x4a\\xfd\\xb6\\xc9\\x25\\x49\\xb0\\x54\\x6a\\x90\\x27\\xd4\\x49\\x75\\x5b\\xeb\\x8d\\x4c\\x17\\xe6\\xa2\\xa4\\x75\\xf9\\x67\\x6a\\x33\\x7b\\x4e\\x86\\x6d\\x96\\x32\\x5e\\x38\\x9a\\x52\\xc1\\x6c\\x51\\xe1\\x8e\\x0d\\x81\\x03\\x34\\x0c\\x84\\x17\\xb2\\xc5\\x7a\\x55\\xd0\\x42\\xff\\x5e\\x5f\\xc6\\x5d\\xf4\\x23\\xe0\\x09\\x2b\\x0e\\xa8\\x8b\\x96\\xa9\\x07\\xc9\\x51\\x21\\xc5\\x47\\xa6\\x80\\x61\\xf2\\x7b\\xcf\\xb5\\x8c\\xe6\\xc0\\x77\\x28\\xd4\\x84\\x6b\\xdc\\xbf\\x0c\\x62\\x54\\x10\\xed\\xf8\\xde\\xa8\\xcb\\x4c\\x9d\\x0b\\xbe\\xef\\xcd\\xe1\\x92\\x73\\x36\\x5f\\x48\\xd7\\x5a\\xec\\x07\\xd1\\xc2\\x2c\\xcd\\x23\\x06\\x8a\\x97\\xc3\\xfe\\x75\\x2e\\x87\\xa3\\x01\\x18\\xfe\\x2d\\xfd\\x52\\x18\\xb6\\xb1\\x25\\x15\\x4e\\x0e\\xa3\\x86\\xcf\\x23\\x9e\\x31\\x37\\xf8\\xca\\x6d\\x8b\\x74\\x6b\\x6a\\x67\\xd5\\x08\\xcf\\x8c\\x1a\\xb6\\x3e\\x57\\x15\\xe6\\x72\\x1e\\xda\\x5c\\x2b\\xc3\\x93\\xa4\\x93\\xdb\\xd2\\xf9\\xa1\\xfa\\x92\\x6b\\x9a\\x59\\xe4\\x5a\\x18\\x0a\\xee\\xb0\\x25\\x99\\xa8\\xcd\\xd6\\x86\\xf8\\x89\\xb4\\x85\\x27\\x23\\xcb\\x6d\\xbf\\xb5\\x01\\x4c\\xab\\x5f\\x65\\x8a\\x30\\x9a\\x47\\x22\\x39\\x36\\x0e\\xea\\xf6\\x4f\\xc8\\x20\\x3a\\x3c\\x70\\x89\\x70\\xe1\\x5c\\xbc\\xf1\\x36\\x25\\x5d\\x96\\x44\\x6c\\x39\\xa9\\x27\\x03\\x1d\\x26\\x7d\\x69\\xec\\xd5\\x1d\\x7a\\xf6\\xe9\\x1f\\xb4\\xae\\xf9\\xd7\\x8c\\x33\\x35\\xe9\\x07\\x11\\x33\\xcf\\xb8\\xe2\\x12\\x99\\x90\\xc6\\x46\\x37\\xc7\\xad\\xf1\\xda\\xef\\x2d\\xc2\\x6c\\x11\\x63\\x39\\x9f\\x3f\\xe1\\xe7\\x92\\x33\\x80\\x92\\xef\\x6f\\x8d\\xfa\\xf2\\x57\\x30\\xdd\\x2f\\xe8\\xd9\\x78\\xf6\\xf7\\x70\\xf5\\x2b\\x68\\x23\\x81\\x76\\x56\\x4c\\xee\\x5f\\xbb\\x98\\x50\\xb3\\xb3\\xa0\\x4d\\x94\\x84\\x60\\x41\\x78\\x26\\xeb\\x2e\\xb2\\x4f\\xcc\\x5f\\xe3\\x53\\x34\\xbb\\x95\\x21\\xe8\\x7b\\xc4\\xdb\\xde\\x2a\\xc9\\xe1\\xc9\\x89\\x49\\xdc\\x2d\\x29\\xad\\x27\\x9e\\x38\\x84\\xb9\\x05\\x26\\x8e\\xbd\\x08\\x08\\xbf\\x41\\x82\\x57\\xe7\\x5e\\x26\\x2b\\x4d\\x01\\xb0\\x24\\xa6\\xe9\\xaa\\x7b\\xd5\\x01\\xdb\\xa9\\x4f\\xf5\\x06\\x39\\x4b\\x4b\\x0a\\xe6\\x08\\x1e\\xa7\\x30\\x30\\xc4\\x3a\\x6a\\x91\\x76\\x6e\\x80\\xf9\\xf4\\x2c\\x0b\\x68\\xb9\\x84\\x19\\xad\\x4e\\xee\\x4e\\x9a\\x72\\x8a\\xde\\xfb\\xd7\\x9e\\x83\\x1f\\x70\\xf4\\x1e\\x62\\xb4\\x3f\\x0b\\xf4\\x2b\\x3b\\x2c\\xd5\\x3b\\x55\\x89\\x11\\x76\\x64\\xbc\\xeb\\xc4\\x09\\xa7\\x64\\x5b\\x1e\\xed\\xda\\x48\\x2f\\x6b\\x68\\x95\\xa6\\x57\\xba\\x78\\x9b\\x89\\xe5\\x02\\xd6\\x99\\x87\\x51\\xd6\\x30\\x3d\\xed\\x5f\\xa1\\x56\\xee\\x7c\\x7e\\xaf\\xe5\\x46\\x26\\xd1\\x03\\x2c\\x4d\\x7d\\xff\\x97\\x7f\\x1d\\xcc\\x86\\xaf\\x89\\xb1\\xe6\\x46\\xa4\\xaf\\xc2\\x42\\x7e\\xd0\\x2c\\x0a\\xf5\\xd3\\x28\\x90\\xf9\\x5f\\x13\\xf9\\x8c\\x1a\\x5b\\x1d\\x9f\\xbb\\x78\\x1a\\x9a\\x89\\xb2\\xd7\\x90\\xc1\\x46\\x5c\\x2d\\x15\\x20\\x92\\x6f\\xdf\\x28\\xc1\\x7d\\x9b\\xa1\\x58\\x7a\\xd7\\x61\\xf0\\x65\\xd3\\x39\\xbd\\xbe\\x38\\xf4\\x13\\x3f\\x45\\xbb\\x59\\x78\\x74\\x26\\x42\\xf9\\x0c\\x06\\x5e\\xe4\\x89\\x25\\x73\\xf6\\x05\\x9f\\x8b\\x4c\\xe2\\xc1\\x3e\\x73\\xb8\\x91\\xcd\\x05\\xf2\\x37\\x31\\xed\\x9a\\x07\\xe2\\xb8\\xff\\xdc\\x96\\x3b\\x06\\xa5\\x10\\x20\\x9c\\x32\\x99\\x80\\x94\\x9f\\x40\\xd8\\x07\\x3a\\x01\\x3e\\xf8\\x43\\xdf\\xcc\\x4a\\x33\\x94\"},\n{{0x5a,0x84,0xaf,0x28,0xa5,0xdf,0xbb,0x32,0x33,0xa1,0x2f,0x08,0x37,0xf6,0xe8,0x65,0x4e,0x7b,0x0d,0xe1,0x6b,0x02,0xab,0x3c,0xd1,0x78,0x64,0x43,0x1e,0x27,0x46,0x67,},{0x80,0xd4,0xba,0x78,0x9f,0x8a,0x4b,0x20,0x47,0xad,0xaf,0xa5,0xed,0x26,0xcd,0x8c,0x54,0x67,0x33,0x29,0x2e,0x8b,0xf6,0x93,0xcf,0xd1,0x7e,0x28,0x4e,0xfc,0x68,0x71,},{0xa0,0xb8,0x4c,0xa5,0xaf,0x76,0x46,0xe6,0xf6,0x2a,0x69,0x35,0x37,0x94,0x73,0xfa,0x6e,0x4c,0x27,0x69,0x58,0x51,0xfc,0xbd,0xae,0x29,0x17,0xb2,0xdc,0x68,0xd7,0x96,0xe2,0x78,0xd7,0x0c,0xd6,0x7f,0xce,0xdf,0x6c,0xa6,0x29,0xb8,0x81,0xf7,0xc4,0xf2,0xaa,0x25,0x59,0xb2,0x0d,0x67,0x06,0x11,0x76,0x6b,0xd6,0x5a,0xa4,0xfe,0xf2,0x04,},\"\\x8a\\xac\\xd1\\xb8\\xa3\\x9b\\xf0\\x8f\\xd5\\xc9\\x18\\x44\\x6b\\xe5\\x76\\xe6\\xa3\\xf2\\x7f\\x36\\x11\\x16\\x07\\xf2\\x7b\\x56\\xa9\\x12\\x14\\xe7\\x63\\xf9\\xa8\\x7f\\xb1\\xd1\\x84\\x48\\x98\\x96\\x17\\x97\\x64\\x44\\x60\\xbf\\xf5\\x48\\x8c\\x10\\x3a\\xf6\\x05\\xe8\\x74\\x0e\\x46\\x58\\x8f\\xb9\\x3e\\x44\\x3c\\x3b\\xb2\\x3b\\x92\\xc0\\x98\\x70\\xa5\\x57\\x65\\x3a\\x1f\\x22\\xc2\\x18\\xcc\\xbc\\x2f\\x07\\x3a\\x27\\x2d\\x17\\xa8\\x42\\x23\\xef\\x14\\x3f\\x4c\\x7c\\xa2\\x58\\x46\\x0b\\x79\\x81\\x69\\x67\\x3d\\xa1\\x07\\xd7\\x1d\\x53\\x56\\xce\\x9f\\x75\\x59\\xa9\\xb0\\x38\\x39\\x99\\x51\\xf5\\x75\\xc7\\x7e\\x5b\\x9d\\x05\\x29\\x57\\x8e\\xca\\xa2\\xe2\\x08\\x92\\x66\\xfc\\x52\\x6c\\x5d\\x40\\x9f\\xbd\\x46\\xbb\\x86\\x84\\x1c\\xb5\\x54\\xf5\\xbd\\x3c\\x99\\x71\\x3b\\x04\\x3e\\x40\\x46\\x53\\xa7\\xd0\\x13\\x44\\xd4\\xdb\\x83\\x1a\\x21\\x72\\x82\\xc4\\xb3\\x36\\x40\\x56\\x53\\xb8\\x5d\\x27\\xa4\\x6b\\x25\\x9c\\x85\\x5c\\xdd\\x85\\xad\\x6f\\x7a\\xed\\xd8\\x35\\xff\\x55\\x00\\xcc\\x8b\\xaf\\x0f\\xb2\\xf0\\x18\\x09\\x10\\xc6\\x46\\x72\\xb8\\xa8\\xd4\\x9d\\x98\\x4a\\x78\\x29\\x3c\\xf5\\x77\\x9c\\x91\\x0c\\x3a\\xcb\\xbc\\xa4\\x55\\xa8\\x54\\x66\\xe5\\x35\\x04\\x4f\\x34\\x80\\x26\\x2c\\x09\\x0f\\xbf\\x4e\\x0b\\x0d\\xb4\\xd1\\xef\\x87\\x59\\xda\\xaf\\xdd\\x8d\\x05\\x90\\x74\\x82\\x46\\x1f\\xf9\\x10\\xc4\\x37\\x19\\x5d\\x5c\\x7f\\xed\\x9d\\x82\\xcb\\x94\\xe7\\xe4\\xec\\x24\\xda\\x05\\x3e\\x47\\xf6\\x2b\\x48\\x8e\\xb7\\xb2\\x44\\x65\\x5c\\x7d\\xbb\\x20\\xed\\x60\\x7e\\xed\\x45\\x31\\x44\\x9e\\x07\\x80\\xe6\\x1c\\xfd\\x57\\x40\\x86\\xff\\xc5\\xdc\\x52\\x42\\x83\\x77\\x5c\\x44\\xf7\\x54\\x7c\\xda\\xb0\\x4a\\x51\\xee\\xe4\\xe1\\xb7\\xb6\\x5a\\x57\\x57\\x3a\\x92\\x48\\x4a\\x35\\x90\\x0a\\x90\\x9f\\x81\\xe4\\x15\\x02\\x9d\\x22\\xca\\x93\\x7a\\x3a\\xcd\\x9e\\x61\\xf8\\xc0\\xe6\\x86\\xb2\\xd2\\xad\\x03\\x77\\xaf\\x8e\\xe1\\x66\\xe4\\xa2\\x0a\\x82\\xaf\\xf4\\x51\\xe1\\x51\\x10\\x3e\\x0a\\x17\\x67\\xb2\\x71\\xfa\\x9c\\x2b\\x1d\\xd1\\x20\\xf8\\x05\\x85\\x3b\\x3b\\x8a\\x56\\x0f\\xc8\\xb9\\x37\\x62\\x83\\xb5\\x11\\x24\\x32\\x4a\\x28\\x4a\\x0e\\x9a\\xc4\\x9d\\xf6\\x9f\\x52\\x4c\\x8e\\x04\\x2d\\xf8\\x2e\\xfb\\xcd\\x16\\x88\\x1e\\xc1\\x31\\xa1\\x52\\x10\\xdf\\x73\\xde\\x02\\x94\\x34\\x47\\xf2\\x2a\\x2e\\xa1\\xdc\\x8b\\xf9\\x68\\x29\\x8e\\xe9\\x7f\\x3a\\xd5\\x46\\xd7\\x8b\\xc6\\x60\\x89\\x7e\\x08\\xd2\\xa2\\x8b\\x2b\\xa6\\x8b\\x54\\xb9\\x54\\xf1\\x47\\x64\\x51\\xc6\\x92\\x07\\xe5\\xdd\\x24\\x8a\\xe4\\x7e\\xf3\\x56\\x94\\x99\\x0e\\x6f\\x05\\x8b\\xc0\\x01\\x7b\\x74\\x95\\x10\\x5c\\xc8\\x73\\x90\\x66\\xaf\\xb1\\x1e\\x1f\\x26\\x60\\x19\\x42\\x54\\x6a\\xe8\\x49\\xff\\x2f\\x56\\x73\\x0f\\x13\\x26\\xbb\\xee\\xa6\\x40\\xee\\x17\\x8f\\xa2\\x47\\xad\\xff\\xef\\xc0\\x46\\x49\\x4f\\xc7\\xff\\xc0\\x77\\x7d\\x5d\\xbe\\x8a\\x55\\xda\\xee\\x61\\x40\\x6f\\xe3\\xc7\\x08\\x8d\\x43\\xd9\\xe1\\x4d\\xa2\\x1c\\xa5\\x2f\\xd8\\xc1\\x60\\x09\\x1c\\x8f\\x99\\xa6\\x7d\\xad\\x65\\xc6\\x4f\\xea\\x9d\\x18\\xb1\\x53\\x7d\\x06\\x1f\\x5d\\xce\\x87\\x9e\\x0b\\xc4\\x26\\x48\\xd2\\xea\\xa0\\x2d\\x97\\x21\\x85\\x75\\x3c\\xb2\\xf6\\x22\\x5d\\x8d\\x03\\xbb\\x07\\xf9\\x44\\xb1\\x0c\\xf4\\xea\\x22\\x27\\x5c\\x3d\\x70\\x84\\x80\\x20\\xf3\\x0c\\x82\\x3b\\x76\\x14\\x3a\\xcf\\x54\\x59\\x99\\xa2\\xcc\\x4b\\x58\\x98\\xd9\\x4b\\x4a\\x25\\xef\\xbe\\x5a\\x60\\x33\\x1c\\xc0\\x09\\xfe\\xc0\\xa2\\x5b\\xc9\\x89\\x47\\xb1\\xb7\\x13\\x9e\\x22\\xd2\\x32\\x80\\xff\\x88\\x54\\xa1\\xec\\x76\\x22\\x1b\\x1b\\xf3\\xd1\\x08\\x32\\x8c\\x8a\\xc4\\x63\\xc6\\x52\\x63\\xa2\\xd7\\xca\\x74\\x33\\x48\\x29\\x31\\xa1\\xd8\\xfc\\x14\\x4b\\xbe\\x9b\\xef\\x67\\x8c\\x92\\xe1\\xc2\\xd1\\x09\\x21\\xb6\\xad\\x43\\xa7\\x5c\\x53\\xbc\\x07\\x58\\x54\\xed\\x2d\\x99\\xd8\\x25\\xf3\\x0a\\x5e\\x10\\xd5\\x17\\x43\\x8e\\x4d\\x4f\\x71\\x13\\x42\\x9f\\x1e\\xdb\\x38\\x7d\\x6b\\xd7\\xaa\\xd2\\x92\\x74\\xf8\\xd2\\xdc\\x88\\x9b\\x7e\\xfb\\xeb\\x58\\x68\\x6f\\x8d\\x66\\x9c\\xea\\xef\\x92\\xc7\\x5e\\xd5\\x30\\x7f\\x0c\\x03\\xf5\\x90\\x01\\x81\\xce\\x57\\x3c\\x8f\\xa2\\x86\\x75\\x20\\x5f\\xb1\\x05\\x7f\\x62\\x6a\\xa2\\x30\\xd0\\x3e\\x2e\\xaa\\x8c\\xff\\xcd\\xe2\\x00\\x81\\x47\\x5d\\x80\\xb2\\x45\\xa1\\xca\\x60\\x45\\xba\\x20\\x4a\\xb0\\x00\\x69\\x07\\x9c\\x63\\x7f\\xc3\\xfb\\x3e\\x80\\xca\\x04\\x62\\xe7\\xa4\\xcd\\xd9\\x28\\x3f\\xf9\\x00\\x85\\x30\\x36\\x48\\x16\\x79\\x2f\\xdf\\x3b\\x9a\\x4e\\x4d\\xc8\\x37\\x92\\x28\\xed\\xcb\\xb1\\x54\\xbe\\xf3\\x87\\xd3\\x77\\x60\\xd7\\x9a\\xfb\\xb7\\x36\\x26\\x0a\\x1d\\xb1\\x01\\x38\\x36\\x1f\\x24\\xb8\\x26\\xdb\\xcd\\x5f\\x0f\\xc9\\xe7\\x83\\x0d\\x26\\xd8\\x0c\\x52\\xa7\\x92\\x18\\x92\\x76\\xbc\\xe3\\x47\\x60\\xfb\\x77\\xbe\\x13\\x12\\xac\\x8c\\xf9\\x7d\\x92\\xcb\\xf3\\xd0\\x77\\x80\\x28\\xdb\\x5e\\x8e\\xae\\x89\\xe0\\xb9\\xbc\\x87\\x78\\xae\\xb1\\x27\\x8f\\x04\\x71\\xcb\"},\n{{0x79,0x3a,0xc8,0x8d,0x7d,0x3b,0x6f,0xa7,0xf4,0x7d,0xee,0xc3,0x1f,0x68,0xdd,0xcc,0xb7,0x01,0x82,0x0f,0x1b,0x13,0xdd,0xc6,0x52,0xf7,0xc6,0xa8,0x5b,0x60,0x52,0xa5,},{0x91,0xb6,0x22,0x7a,0xcd,0xd1,0x83,0xda,0x62,0xc5,0x19,0x65,0xc6,0x35,0x35,0x8b,0x20,0x4d,0x68,0x3e,0xe0,0x64,0x43,0xcb,0xd4,0x0e,0x71,0xc1,0xf7,0x6a,0xd1,0x02,},{0xa8,0x4f,0x55,0x2b,0xf4,0x43,0x22,0xa6,0xdb,0x24,0x5c,0xa0,0x06,0xd1,0xcf,0x78,0x0c,0x61,0x68,0x0f,0xe7,0x42,0x9a,0x89,0x47,0xc3,0x5f,0x21,0xbc,0x4b,0x44,0x22,0x8b,0xa3,0x0a,0xea,0x0c,0x74,0x4b,0x86,0x64,0x59,0xd3,0xb8,0xac,0xad,0x45,0x3b,0x06,0xac,0xe2,0x47,0xba,0x69,0x52,0x8c,0x6b,0x3b,0xc4,0xb2,0x0e,0x75,0x63,0x0e,},\"\\xec\\x50\\xaf\\xad\\x8a\\xde\\x74\\x05\\xe2\\xc6\\xf5\\xc6\\x24\\x7b\\xbb\\xcc\\xfb\\x2c\\x17\\x16\\x6f\\x78\\x84\\xfe\\xae\\x10\\xd9\\x0f\\x5d\\x83\\xc4\\xb6\\xf0\\xbf\\x76\\xde\\x2f\\x78\\x97\\xba\\x11\\x94\\xd6\\xd3\\x44\\x9d\\xdb\\x80\\xae\\x74\\xeb\\x8e\\xd6\\x8f\\x04\\x9b\\x35\\xc6\\xf2\\x19\\x16\\xdb\\x4d\\xfc\\x27\\x24\\xdc\\x3a\\xf7\\xad\\x8d\\xd5\\xc4\\x4f\\x60\\xd2\\xf4\\x9f\\xad\\xd7\\x00\\x4d\\xa1\\x59\\x30\\x93\\x94\\x2c\\xae\\x52\\x08\\xbf\\x54\\xcf\\x90\\x3b\\xee\\x64\\x69\\x05\\xfc\\xe2\\xeb\\x2e\\x37\\x0d\\x0d\\xca\\x48\\xd8\\x20\\xad\\xea\\xb1\\x6a\\x3b\\x67\\x5e\\x5a\\x4a\\x8e\\x26\\x7e\\x34\\xff\\x96\\xf3\\x12\\x2b\\x18\\xde\\x0c\\xad\\x92\\x92\\xab\\x63\\xd2\\x6e\\x5f\\x31\\x0f\\xa2\\x16\\x8c\\x29\\x66\\xbd\\xb6\\x3b\\x0d\\xe0\\x86\\x26\\x76\\x7b\\x37\\x9d\\xe4\\x63\\x3b\\x9f\\x3e\\xda\\x79\\x17\\x28\\x1d\\xad\\x66\\x1e\\x9f\\x77\\x2b\\x84\\x4a\\x79\\xe8\\x00\\xfd\\x84\\x27\\x02\\x44\\x6e\\x4a\\xa7\\x31\\x75\\x71\\x07\\xf3\\xfd\\x65\\x47\\xbf\\x40\\x75\\x96\\x3d\\x5f\\xd5\\xf5\\x8e\\x80\\x85\\x3f\\xc4\\x27\\x51\\xdc\\xa0\\x78\\xa9\\xfa\\x8d\\x5b\\xb3\\xd9\\xa3\\x4a\\xbc\\xab\\x02\\x93\\xd6\\xce\\xae\\xc4\\x89\\x67\\xa1\\xe6\\x22\\x43\\x98\\xca\\xd0\\xf6\\x05\\xa3\\xbe\\x8e\\x67\\x58\\xea\\x8f\\x29\\x20\\x9d\\x8e\\x4c\\x4c\\xa1\\x89\\x3b\\xaa\\xd9\\x1e\\x37\\x9b\\xa3\\xb1\\x73\\x30\\xc1\\x2a\\x5b\\x6f\\x21\\x9b\\x38\\x4a\\x8a\\xb9\\x78\\xbf\\x1b\\x37\\xc3\\x73\\x1a\\x1b\\x47\\x4b\\x24\\xb5\\xd6\\x7d\\x4c\\xec\\x28\\xaa\\xc6\\x51\\x0b\\x11\\xf2\\xcf\\x21\\xbc\\x16\\x96\\x3d\\x51\\xf5\\x53\\x87\\x27\\x71\\x8f\\xc4\\xe2\\xe5\\x17\\x2e\\x3c\\x0c\\xda\\xbc\\x27\\x7f\\x0d\\x70\\x37\\xc3\\x4c\\xa6\\x8f\\x73\\x28\\x88\\x48\\xb9\\x26\\xbd\\xe0\\xcf\\x47\\xab\\xfa\\x66\\x60\\x09\\x16\\x94\\x6f\\x07\\x65\\x1c\\x28\\x0a\\x20\\x86\\xb1\\x4d\\x52\\x57\\x0c\\xc8\\xa4\\xb7\\x43\\x58\\xb5\\x9c\\x30\\x2b\\x9d\\x00\\xe1\\xb4\\x98\\xf3\\xbc\\x33\\xee\\x4e\\xcf\\x2b\\xce\\x2c\\x65\\xed\\x7e\\x8b\\xa7\\x4d\\x35\\xb7\\x51\\xd3\\xc9\\x9f\\x40\\x86\\x19\\x68\\xc2\\xb7\\xf3\\xa5\\xbe\\x34\\x8c\\x57\\xd9\\x3b\\x40\\xff\\xd0\\x51\\xed\\xd7\\xca\\xca\\x6e\\xe6\\xbc\\xa7\\x21\\xdc\\xba\\x8d\\xb8\\xd0\\x06\\x4f\\x54\\xd3\\x6e\\xc5\\xe8\\xd6\\x2a\\x71\\xfd\\x1c\\x90\\xf1\\x49\\x24\\xf4\\x1c\\x16\\x3f\\x00\\x7a\\xfc\\x6f\\xbb\\xfe\\x86\\x45\\xfa\\x47\\xc3\\xc9\\x80\\x24\\x6d\\x1b\\x92\\x27\\x43\\x85\\x95\\x3c\\x53\\x41\\xcd\\x64\\xc3\\x4a\\xe9\\x71\\x7c\\xc2\\xc3\\x7f\\x58\\x35\\x9c\\x0a\\x99\\x91\\xc2\\x3f\\xe6\\x37\\xde\\x6c\\xdf\\x08\\x62\\xf7\\xd0\\x32\\x9f\\xe7\\x58\\xaa\\x89\\x2a\\xd4\\x58\\x3b\\x9d\\xf2\\xf3\\x33\\x7d\\x5b\\xe5\\x70\\xba\\x65\\x49\\x98\\xed\\x29\\x2f\\x11\\xf0\\x17\\x72\\x38\\x2a\\x04\\x34\\x2f\\xdd\\x99\\xe6\\x9e\\x0d\\x97\\xc4\\x3f\\x10\\xac\\x9b\\x96\\xf1\\x40\\xa6\\xf8\\x3c\\x47\\x29\\xe7\\xa9\\x00\\x47\\x1f\\x2b\\x1d\\xf2\\x40\\x1b\\xc5\\xc6\\x80\\x42\\x2b\\x13\\xb0\\xc8\\x00\\x7d\\x63\\x68\\x1f\\x66\\xa0\\x59\\x5a\\x1c\\x5d\\x3a\\xcd\\xe5\\xb7\\x79\\x42\\x6e\\x73\\x6b\\xc1\\x00\\xc5\\xe6\\xf5\\x26\\x08\\xdc\\x39\\x1e\\x3e\\xf9\\xb1\\xbb\\x6a\\xf1\\x3d\\x24\\x9b\\x7d\\x32\\xce\\x06\\x80\\xc3\\x68\\xf5\\x4d\\x5f\\xe0\\x39\\xcf\\xe1\\x01\\x30\\x25\\x1e\\x4d\\xb1\\x4c\\x79\\xc8\\xd0\\x44\\x06\\x04\\x65\\x82\\x29\\x90\\xd8\\x80\\x93\\xcd\\x73\\x65\\x32\\x85\\x2e\\x44\\x78\\x89\\xdb\\x89\\xcc\\x60\\x05\\x29\\x96\\xa3\\x2a\\x64\\x36\\x5c\\x07\\x26\\x05\\x1c\\x11\\x9e\\xda\\x90\\x1d\\xe5\\x76\\xb3\\x34\\xfc\\x70\\x49\\x48\\x23\\x92\\xe2\\x62\\x0b\\x0a\\x3a\\x13\\xfa\\xb1\\xd3\\x6f\\xc0\\xa5\\xf2\\x3d\\xb1\\x47\\xfd\\x85\\x7b\\x26\\xa6\\x98\\x04\\x8f\\x8b\\x81\\x1e\\x23\\xd7\\x22\\xe2\\xe9\\x02\\x7e\\xd4\\x12\\x4b\\x48\\xdc\\x5e\\x57\\x8a\\x7a\\xeb\\x19\\xa1\\xb4\\xf9\\x48\\xee\\x5b\\x46\\xf6\\x5b\\x97\\x96\\x46\\xe2\\xbe\\x07\\x47\\x14\\x11\\x8b\\xaa\\x4b\\xfc\\x15\\xb0\\x89\\xa0\\xe0\\x66\\x27\\xda\\x46\\xe4\\xbb\\x06\\xaa\\x3c\\x7c\\x5d\\xd6\\x48\\xe0\\x3c\\x9c\\x2d\\xec\\x3f\\xac\\xd9\\x56\\x26\\x56\\x2f\\x30\\x00\\x88\\x32\\x30\\xd2\\xb0\\xa1\\xf8\\xa7\\x47\\x8c\\xb7\\x7f\\x93\\x9a\\x5f\\x18\\x8f\\x45\\x8d\\x10\\x37\\xb9\\x01\\x76\\x66\\x4d\\x86\\xea\\x85\\x0b\\x8a\\xf5\\x08\\x7f\\x86\\x60\\x5a\\x77\\xe0\\x25\\xef\\x6c\\x7e\\x6a\\x2a\\x59\\xf0\\x06\\xcb\\xa1\\x89\\xfa\\xd9\\x33\\xf4\\x2c\\x53\\x27\\x08\\x10\\x9b\\xc1\\xaf\\x81\\x48\\x19\\x59\\x5f\\xfc\\xb9\\x5f\\xbf\\x5b\\x7e\\x93\\xa7\\x11\\x97\\xe4\\x77\\xee\\x7c\\x04\\xb8\\x51\\xc1\\xc3\\x66\\x22\\xcd\\xd8\\xe6\\xc8\\x60\\xd9\\xab\\x2c\\xac\\x56\\xd2\\xdc\\x98\\xfa\\x69\\x12\\x4f\\x2b\\xb2\\xa6\\x47\\x1e\\x1c\\x73\\xb6\\x61\\xf0\\x71\\xf5\\xd8\\x6d\\xe7\\xd1\\xde\\xaf\\xa4\\xed\\xcd\\xc7\\xbf\\x1f\\x70\\x5c\\x56\\x30\\x0a\\xff\\xd0\\x58\\xb9\\x69\\x77\\x91\\x41\\x9e\\x5f\\xb2\\xa5\\xb7\\xf7\\x8c\\xe3\\x40\\x1f\\xf5\\x50\"},\n{{0x89,0xde,0x74,0x42,0xd7,0x4b,0xa9,0x38,0x59,0x69,0xc9,0x65,0x1a,0x88,0xfe,0x28,0xe0,0x40,0xd5,0x93,0x90,0x7d,0xac,0x1a,0x39,0x87,0x41,0x8b,0xdf,0xdb,0xad,0x89,},{0xfd,0x3b,0xa9,0xfa,0xd3,0x20,0xeb,0xa4,0x5d,0x07,0xb8,0x4a,0x49,0x7b,0xe1,0x7d,0x3f,0xc7,0xdd,0x99,0x99,0xc9,0x68,0x88,0x3c,0xd6,0xac,0x13,0xb0,0x66,0x9b,0x17,},{0xba,0xb5,0x72,0x84,0xd2,0x0e,0xe5,0x4c,0xc7,0xf9,0x70,0x8d,0x71,0x77,0x06,0xd8,0xfa,0xf6,0xe4,0x63,0x32,0xb0,0x69,0x1d,0x6f,0x21,0x3a,0x8d,0xb8,0x01,0x15,0x5b,0x4e,0x33,0x8c,0x13,0x61,0xb5,0x92,0xbe,0x75,0x85,0x01,0xb1,0x82,0x17,0x93,0xae,0x52,0x27,0xcc,0x3b,0xa8,0xdf,0x8a,0xdf,0xc6,0xed,0x9a,0xca,0xb5,0x4c,0xc4,0x01,},\"\\x9d\\x52\\x72\\xf0\\xb7\\x84\\x88\\x2b\\x94\\xc7\\x6d\\xfb\\x9d\\x46\\x0c\\xa4\\x95\\x02\\x5e\\x0a\\xec\\x5d\\x52\\xcc\\xff\\xfe\\xce\\x9f\\x81\\x73\\xc1\\x05\\x58\\x26\\x6c\\x49\\x85\\x25\\x89\\x1a\\x97\\xbf\\x38\\x78\\xe3\\x3c\\x3d\\xe2\\xfc\\x2e\\x52\\x55\\x0b\\x43\\x15\\x62\\xcb\\xe4\\xa3\\xd0\\x11\\xec\\xc9\\xe7\\x7e\\xc3\\x6a\\xd3\\x83\\x41\\x35\\x8c\\x88\\x32\\x1c\\x03\\xd0\\x8b\\xb4\\x26\\xa7\\xd5\\x85\\x41\\x71\\xc0\\x27\\xec\\x48\\xd5\\x78\\x19\\xa9\\x1a\\xfd\\x02\\xa6\\x18\\xcc\\xbc\\x25\\xe6\\x8e\\x53\\x09\\xd0\\x47\\xb1\\x56\\xe3\\x57\\x05\\x37\\x3a\\xda\\x2e\\xb8\\x31\\x32\\x1a\\x20\\x3e\\x1b\\xd8\\xf0\\xef\\xec\\xc0\\x96\\x18\\x64\\x7b\\x41\\xdf\\xf2\\x2b\\x39\\xd0\\x22\\x35\\xf8\\x71\\x53\\x2f\\x60\\x85\\xe9\\xcc\\x52\\xec\\x00\\x9b\\x33\\xee\\xbc\\xdc\\x26\\x7d\\x77\\x67\\xc9\\x0c\\x92\\x7e\\x15\\x4f\\x72\\xf3\\xf4\\x8a\\x34\\x95\\x63\\x19\\xb2\\x93\\xc8\\xa8\\xb3\\xe3\\x4e\\xfc\\x5f\\x62\\xf2\\xb4\\xe8\\x01\\x9b\\x50\\xa0\\x8f\\x5c\\xcf\\x95\\xbc\\x83\\x1b\\xaf\\x40\\x81\\x1d\\x87\\xe5\\xed\\xbd\\x2f\\xd5\\x36\\x5b\\x26\\xa4\\x31\\xae\\x95\\x80\\x0f\\xf3\\x81\\xcd\\x62\\xca\\x40\\xe1\\x86\\x6d\\x95\\x0d\\xce\\x14\\xf0\\x30\\x91\\x8a\\xba\\xc6\\x8e\\x79\\x16\\xdd\\xb9\\x5a\\xdc\\x19\\x71\\x28\\x78\\x74\\xd0\\x7e\\xb0\\xed\\xef\\x64\\x29\\x66\\x52\\xc4\\x80\\x44\\xb0\\xc5\\x52\\x1a\\x8d\\x27\\x0d\\x53\\xd7\\x4e\\xc6\\x3b\\x89\\x0f\\x33\\x63\\xf9\\x20\\x7f\\x66\\x52\\xae\\x8e\\x78\\x35\\xc3\\x82\\x0a\\xd6\\xd9\\xe3\\x63\\x3f\\x4b\\xfd\\x53\\x79\\xa4\\x4f\\x29\\xd6\\x5f\\x36\\x09\\xfe\\x35\\x58\\x17\\xdc\\xa5\\x51\\x8d\\xfe\\x3b\\xd7\\x69\\x32\\x0a\\x03\\x19\\x02\\xe9\\xcf\\x66\\x69\\xc2\\x4f\\x88\\xb0\\x1e\\xb3\\x69\\x95\\xbd\\xb8\\xdb\\xed\\x6e\\xe0\\xc9\\xb7\\xf3\\x22\\x95\\xc6\\x1b\\xa8\\x90\\x5e\\x55\\x98\\xf3\\xc9\\xe1\\xc8\\xbf\\x72\\x64\\xf9\\x82\\x93\\xfa\\xea\\x17\\x74\\x7f\\x88\\x44\\x0c\\x31\\x81\\x8c\\x43\\x3e\\xa3\\xd2\\x3c\\x01\\xf4\\xf7\\xe9\\xc3\\xdd\\x3d\\x5f\\x32\\xec\\x9e\\xac\\xd7\\x1a\\x09\\xe3\\xa9\\x97\\x38\\x1f\\x1c\\xbf\\xfd\\xf4\\xb5\\xba\\x49\\x79\\xde\\xb7\\xb0\\x98\\x41\\xaf\\xa3\\xb0\\x3d\\x1c\\x93\\x11\\x09\\x7b\\x86\\x2c\\xae\\x11\\x70\\x7c\\xbd\\x3a\\x4a\\xe6\\xc8\\xa2\\x6a\\x30\\x6a\\x68\\x7c\\x41\\x4a\\x4e\\xa1\\xe8\\x12\\xf1\\x15\\xf6\\x0f\\x70\\xbd\\xa7\\xf8\\xfb\\xe7\\xbc\\x2d\\x50\\xcc\\x55\\x0b\\xba\\x29\\x1d\\x5e\\xc5\\x23\\x22\\x9a\\x08\\xed\\x56\\x8b\\x5c\\xee\\x18\\xfe\\x6f\\x46\\x78\\x2c\\x17\\xcd\\x82\\x88\\x01\\x63\\x92\\x15\\xbc\\x5e\\x9b\\xe4\\x55\\x5c\\x9a\\x18\\x00\\x97\\x67\\xa6\\xc5\\xc7\\x4a\\x82\\x29\\xd2\\xff\\xaa\\x39\\x9d\\x8e\\x64\\x32\\x4e\\x88\\x42\\x23\\xd5\\x07\\x0f\\x73\\x5a\\x75\\xd8\\x5f\\xf6\\xc9\\x4a\\x9f\\xbc\\x2b\\x36\\x51\\x38\\x6d\\xe5\\xa2\\x3c\\xce\\x95\\xc8\\x78\\x81\\xc7\\x93\\x99\\xae\\x71\\xf0\\x90\\x73\\x7e\\x21\\x87\\xfe\\x90\\x4a\\xab\\x1d\\x92\\xd6\\x18\\x67\\x95\\xc9\\xb4\\x6c\\x62\\xa5\\x91\\x4f\\x36\\x30\\xfd\\xcb\\xac\\x3b\\xd4\\xb0\\xda\\x4e\\xc3\\x13\\x6a\\x1f\\xb2\\xba\\x40\\x32\\x2d\\x7c\\xc4\\x08\\x5e\\x16\\x70\\x09\\xcf\\x74\\x50\\xfc\\x6a\\x28\\x6c\\x2f\\x79\\x51\\xd5\\x1a\\xae\\x23\\xb8\\xf3\\x30\\x20\\xef\\xb5\\xe3\\x24\\x5b\\xa6\\xa3\\x54\\x3a\\x2b\\xde\\xc4\\x47\\xd5\\x1a\\xe0\\x0b\\x5e\\x16\\x78\\xb7\\x60\\x93\\xcf\\x21\\x6b\\x95\\x07\\xc9\\x63\\xeb\\xfc\\x02\\x4c\\xcd\\x6e\\xf6\\xc7\\x8c\\x45\\x72\\x27\\x3b\\xea\\xaf\\x55\\x07\\x6d\\xc4\\x4a\\x22\\x4b\\x58\\x61\\x57\\x05\\x79\\x19\\x65\\x30\\x7c\\xef\\xd4\\x86\\x72\\xc0\\x81\\xbc\\xcf\\xbc\\x1d\\x15\\xb0\\x62\\xb3\\x8b\\x4f\\xba\\x9b\\x9b\\xec\\x95\\x6c\\xd1\\x44\\x44\\xee\\x43\\x7e\\x79\\x60\\xcc\\x60\\x1e\\xdd\\xc0\\x2f\\x1a\\x76\\xb6\\x85\\x74\\xd5\\xf8\\x84\\x31\\x50\\xc0\\xb9\\x00\\x99\\x34\\xa2\\xbf\\xaf\\x60\\x57\\x70\\xc1\\x36\\xba\\x29\\xf3\\xdc\\x7e\\x29\\x59\\x7a\\x24\\x80\\xdb\\x23\\xe2\\xb2\\x67\\x7e\\xc6\\xc5\\x1b\\xd3\\x01\\xf2\\xb5\\xa3\\x9d\\xfd\\xa7\\xb4\\x77\\xbe\\xdd\\x1c\\xda\\xed\\x10\\xe2\\x9d\\x29\\x54\\x62\\x9b\\x98\\x76\\xf8\\xee\\x54\\xe4\\x04\\x73\\x69\\xd5\\x34\\xca\\xb5\\x4a\\xea\\x44\\x1d\\xc9\\x47\\xeb\\x3f\\x59\\x38\\x2b\\x21\\x83\\x60\\x57\\x2f\\x26\\x59\\x58\\x31\\x53\\xc0\\xe2\\xb9\\x12\\xcf\\x30\\xc8\\x15\\xb2\\x6f\\x05\\x85\\x3d\\xd3\\x05\\x51\\xee\\xcf\\x64\\xb8\\x58\\xa4\\x41\\xbb\\x8c\\x6d\\xb8\\xa9\\xfd\\xe7\\x7a\\x32\\xa7\\xb4\\x6a\\xf6\\x6f\\x8c\\xb9\\xf3\\x5e\\xe0\\xfa\\xfb\\x0b\\xd4\\x2d\\x9e\\x65\\xb2\\xa9\\x05\\x82\\x41\\xa3\\x1b\\x8c\\xa1\\x11\\x54\\x34\\x23\\x76\\x70\\xaa\\xb4\\xef\\xf3\\x60\\x10\\xed\\x03\\x71\\xf4\\x65\\x95\\xda\\x1b\\xdd\\x57\\x9b\\xbb\\x67\\xaa\\xdb\\x68\\xe7\\x7a\\xd3\\xa3\\x8c\\x8f\\x26\\xd2\\xaf\\x5a\\x71\\x03\\xba\\x5f\\x22\\xb4\\x2c\\xc1\\x2a\\x8c\\x3c\\xe5\\xc9\\x21\\xc9\\x1c\\xfc\\x0e\\x63\\xdf\\x90\\x27\\xd2\\x62\\x29\\xb1\\x04\\x7c\\xbc\\x18\\xf6\\xb0\"},\n{{0x26,0x22,0xbd,0x9b,0xbe,0xf7,0xff,0x4a,0x87,0x62,0x9e,0xa0,0x15,0x3d,0xc4,0xd6,0x08,0xc3,0x1f,0xa5,0x84,0x79,0x88,0xff,0x50,0x0d,0x88,0x06,0x81,0xf1,0x13,0x72,},{0x19,0x97,0x58,0xa9,0xc3,0xd0,0xee,0x3e,0xeb,0xcb,0xbd,0xa3,0xe1,0xef,0x54,0x55,0xff,0x46,0xd7,0x36,0xbb,0x4e,0xf0,0xc0,0x6a,0x73,0x9f,0x9a,0xc5,0x84,0x83,0x95,},{0x43,0x78,0x96,0x6b,0x78,0x31,0xde,0xf4,0xae,0xcb,0x49,0x89,0xbc,0xaf,0x9c,0xae,0x99,0x46,0x1c,0xb9,0xb5,0x9d,0x19,0x51,0x8c,0xc1,0xec,0x7b,0x83,0x51,0xbc,0xd1,0xf7,0x23,0xaa,0xc5,0xf0,0x61,0xb3,0x83,0x63,0x57,0x4f,0xf9,0x6b,0xa1,0x0e,0x19,0x6b,0x1b,0x05,0x31,0xe1,0x18,0x30,0x36,0xa4,0x25,0xe6,0x9c,0x45,0x98,0x04,0x0c,},\"\\x89\\x1e\\x82\\x12\\x25\\x47\\xd6\\x1e\\x83\\xb0\\xab\\xaf\\x27\\xc7\\x30\\x3f\\x05\\x22\\xa2\\xec\\x4a\\xf4\\x4e\\xf0\\xac\\x19\\x6a\\x99\\x78\\xb1\\xc6\\x23\\xef\\x1f\\xa7\\x2b\\xaf\\x70\\x91\\x0a\\x5c\\x51\\xc4\\xf7\\x8e\\x0f\\xe9\\xfe\\x37\\xe2\\x43\\x9c\\x47\\x95\\x91\\x6c\\xfa\\x22\\xab\\x47\\x1a\\x25\\x57\\xcc\\x7b\\xa6\\xb6\\x69\\x56\\x06\\x3d\\xde\\xb3\\x9c\\x50\\xf1\\x4f\\x06\\x34\\x8f\\xa6\\x6b\\x60\\x64\\xdc\\xff\\xca\\x50\\x43\\x96\\x7f\\x05\\x25\\x4d\\x57\\x7a\\xbf\\x22\\xae\\x8c\\x90\\x00\\x0c\\xe2\\xe6\\xa1\\xa8\\xb2\\xe3\\xa6\\xb3\\xab\\xc5\\x63\\xeb\\xff\\xb2\\x04\\x45\\xf0\\x91\\x1c\\xc4\\x2a\\x98\\x7f\\x84\\x56\\xef\\xba\\x41\\x30\\xe6\\x8f\\x01\\xfc\\xdf\\x7b\\xf7\\x71\\xfc\\x1d\\x35\\x37\\x1a\\x0d\\x75\\xdd\\x5f\\x90\\x00\\x2c\\x90\\xb6\\xcb\\xad\\xe4\\x0d\\x5b\\x23\\xfd\\xb4\\x9a\\xba\\xcb\\x72\\x19\\xae\\x27\\x56\\x1a\\xa2\\xa8\\x79\\xda\\x88\\xdf\\x34\\xa8\\xc5\\x81\\xf0\\xc6\\x71\\x98\\xff\\xc6\\x08\\xfe\\x91\\x95\\xb5\\x55\\x5c\\x8a\\xe9\\x34\\xc8\\x30\\xaa\\xe2\\x88\\x5b\\xea\\x87\\x48\\x74\\x48\\xe1\\x1b\\x4f\\x2f\\x17\\x2e\\x4d\\x5c\\xfe\\x4f\\xd1\\x13\\xf9\\xd2\\x01\\x6c\\x24\\xa7\\x34\\x51\\x2b\\xb9\\x18\\xf5\\x75\\xe7\\x54\\x13\\x97\\x18\\xe3\\xd2\\x0e\\x79\\x0a\\xbb\\x94\\x2c\\xba\\x3e\\xc8\\xb2\\xdb\\x59\\x07\\x96\\xdc\\x43\\x5f\\x13\\x9f\\xc6\\x4d\\xdc\\x85\\xa2\\x24\\x94\\xef\\x2b\\xfa\\x1f\\x5c\\x0f\\x18\\x75\\xea\\x58\\xe8\\x4e\\xb3\\x74\\xec\\xf8\\xce\\xc6\\x46\\x8b\\x6b\\x09\\xd1\\xe7\\x4f\\x15\\x41\\xed\\x45\\x4a\\x28\\x07\\xd3\\xf4\\x05\\x35\\x66\\xb0\\xe4\\xe2\\xc6\\xae\\xce\\xd1\\x0d\\xc0\\x07\\xe9\\xdf\\x41\\x6f\\x26\\x7f\\xcb\\x3f\\xe1\\x7b\\x8b\\xac\\xe0\\x3f\\x07\\x43\\xe0\\xe6\\xd4\\xa4\\x8c\\xe7\\x6e\\xdf\\xf6\\x0c\\x0e\\x3a\\x30\\x84\\x56\\x99\\x54\\x13\\xc1\\x07\\x6f\\xf3\\x7e\\xcf\\x23\\x81\\xa0\\xd4\\xe9\\xe4\\xa9\\x13\\xa2\\x58\\xd9\\x83\\xb9\\x69\\x6b\\x5c\\x45\\xaf\\x37\\xc8\\x68\\x40\\x70\\xe4\\x00\\xb8\\xf8\\x65\\xa5\\x04\\x04\\x3f\\x45\\xd7\\x8b\\x97\\x13\\xf3\\x35\\xaa\\x41\\x6a\\x46\\x16\\x64\\x10\\x73\\x5f\\xb5\\xd8\\x22\\x10\\x45\\x8d\\x5a\\x08\\xa1\\x04\\xd4\\x00\\x2a\\xb6\\x11\\x88\\xf9\\xdf\\x45\\x7d\\xd7\\xed\\x59\\x37\\xca\\x50\\x77\\x60\\x6b\\x41\\x8b\\xbc\\x86\\x84\\xa1\\xd5\\x25\\xbf\\xa5\\x51\\x08\\x76\\x40\\xb1\\xd1\\x77\\xca\\x6d\\x4f\\x64\\x71\\xb3\\x9b\\x2c\\xe4\\x3a\\xfb\\xf8\\x28\\x5e\\xcd\\x68\\x7e\\x43\\x8f\\x44\\x25\\xdf\\x56\\x8a\\xb8\\x6f\\xa2\\x31\\x63\\x49\\xa1\\x10\\x2b\\x41\\x43\\xd7\\x1e\\xf4\\xe2\\x4f\\x5c\\x53\\x0c\\x77\\xaf\\xb0\\x10\\x07\\x88\\x63\\x64\\x40\\xe7\\x40\\x67\\x5a\\x61\\x74\\xc5\\xf0\\x57\\x10\\xb2\\x53\\xa4\\x11\\x17\\x3f\\x9e\\x82\\xce\\x6e\\x22\\xf4\\x09\\x5e\\x77\\x14\\xb8\\x73\\x7e\\x14\\x7a\\xa0\\xf2\\x31\\x91\\x57\\x8f\\xfd\\x93\\x82\\x3c\\xe4\\xbf\\x91\\xc1\\xd1\\x10\\x98\\x2a\\x5d\\xa0\\xe4\\xb8\\x1b\\xd2\\x5b\\x9b\\x9c\\x21\\x42\\xa7\\x67\\x1e\\xe9\\x37\\xc9\\x0f\\xd0\\x71\\x5e\\xc9\\xaf\\xa4\\x4d\\x86\\x04\\x68\\x98\\xb4\\x2f\\x75\\x35\\x89\\xd2\\x26\\x8d\\x2a\\xaa\\xa9\\x85\\xcc\\x90\\xe0\\xf9\\xe8\\x27\\xa3\\x92\\x3e\\x77\\x16\\x34\\x6f\\x4f\\x89\\x31\\xc7\\x28\\x21\\xb3\\xeb\\x64\\x5d\\xaa\\x74\\x52\\xc8\\xaf\\xc8\\x98\\xd7\\x97\\x55\\x45\\xc1\\x2d\\xa1\\xbd\\xb2\\x09\\x04\\x5c\\xb0\\x0f\\x4b\\xfd\\x53\\x83\\xdf\\x01\\xf0\\x03\\x68\\x0b\\x97\\x34\\x40\\xf1\\xa3\\x9c\\x9d\\x82\\x09\\x59\\xef\\x6f\\x85\\xbd\\x33\\x63\\x90\\x65\\xae\\xfd\\xc8\\xbc\\xfe\\xcb\\xd9\\xb9\\x55\\x40\\x49\\x73\\x8a\\xf2\\x9f\\x12\\x94\\x63\\x9d\\x39\\x15\\xd6\\x32\\x99\\x5e\\x8f\\xaf\\x71\\x3e\\xf2\\xee\\x3c\\x29\\x8b\\x55\\x96\\xfa\\x10\\xc9\\x9f\\x94\\x6d\\xdb\\x32\\x34\\x06\\x95\\xdf\\x1c\\x19\\x45\\x94\\xea\\xf3\\x77\\x8d\\x73\\xc8\\xba\\x60\\x40\\xc0\\x4e\\xb3\\xa4\\xff\\x86\\x77\\x93\\x6b\\x88\\xe0\\xc5\\xf0\\x44\\x14\\x80\\xd1\\x07\\xd7\\xac\\x22\\x02\\xb3\\xb6\\x94\\xe5\\x7c\\xcc\\xa6\\xd8\\x25\\xe2\\xa0\\x7e\\x81\\x2e\\xd2\\x9b\\x2c\\x20\\xd5\\xc6\\x05\\x47\\x15\\x79\\xe3\\xed\\xff\\xc2\\x23\\xf2\\x42\\xc5\\x93\\x91\\xdb\\x41\\xe9\\x8d\\x5f\\x3d\\x6c\\x5b\\x1e\\x32\\xac\\x82\\x37\\xfc\\xfd\\x10\\x20\\x54\\x3a\\x40\\x41\\xe0\\x3d\\x92\\xad\\x3e\\x2e\\xc5\\x52\\x91\\x47\\x07\\xc7\\x7c\\xd0\\x1f\\x3e\\x48\\x01\\x14\\x44\\x28\\x3f\\x09\\x68\\xfa\\x4d\\xee\\xee\\x55\\xc4\\x56\\xed\\x1f\\x87\\x7a\\xde\\x04\\xac\\x8e\\x8d\\x2c\\xb6\\xc8\\x58\\x20\\xb4\\x92\\x9b\\x25\\xbf\\x31\\xe9\\x25\\x43\\x5d\\x6b\\xcc\\x50\\xd3\\xe2\\xe9\\xb8\\x51\\x02\\xe9\\x70\\xd7\\x89\\x5c\\x25\\xad\\xe5\\x21\\x61\\xa3\\xb6\\xbf\\x50\\x1a\\xb0\\x19\\x61\\xcb\\x63\\xed\\x99\\x0a\\xeb\\x93\\xed\\xa3\\x82\\x8b\\xf0\\x4c\\xa5\\x28\\x53\\xc7\\xb6\\xb8\\xe9\\xe4\\x9e\\x34\\x9d\\x69\\xb5\\x3b\\xe0\\x74\\x85\\xf5\\x42\\xb7\\xcd\\xd0\\x6b\\x52\\x7d\\x41\\xdd\\x11\\x9c\\x70\\xb5\\x64\\xf1\\xa9\\x3a\\xec\\x62\\xae\\x74\\xe6\\xe8\\xf8\\x55\"},\n{{0xae,0xb1,0x3c,0xcb,0x90,0xc8,0xcb,0xef,0x90,0xd5,0x53,0xda,0x3f,0x69,0x01,0xb3,0xd7,0x5c,0x13,0x01,0x1f,0x02,0x49,0x74,0xda,0xf7,0x9a,0x17,0x89,0xc8,0xc6,0x32,},{0x5f,0xaa,0xfe,0xb5,0x95,0xf1,0x6d,0x33,0x8f,0x1c,0x72,0xa9,0xf3,0xe4,0x98,0xf3,0x8b,0xab,0x69,0xa8,0x1b,0x37,0xd2,0xd0,0x92,0xb7,0xbf,0x7e,0x50,0x5d,0x82,0x0d,},{0x06,0x11,0xb1,0x9a,0x74,0x72,0xa4,0x43,0xe8,0x7e,0x54,0xd7,0xc6,0x64,0x7f,0xaa,0xb1,0xb7,0x9a,0x83,0xfd,0x43,0x71,0xc9,0x2b,0x97,0x54,0x00,0xfd,0x62,0x8a,0xcf,0xc3,0x25,0x77,0xcc,0xbb,0xaf,0x03,0xd8,0x8f,0x89,0x3c,0x88,0xf2,0xca,0xc7,0x84,0xc7,0x22,0xa0,0x8f,0x38,0x7a,0xbc,0x31,0x9a,0x70,0x2c,0x86,0x84,0x79,0x65,0x0b,},\"\\x86\\x1a\\x10\\x18\\xd6\\xbd\\xc4\\x80\\x5a\\x5c\\x4d\\xf8\\x7e\\xfa\\xa4\\x62\\xc6\\x8b\\x4b\\xf4\\x06\\x5c\\x68\\x4c\\x2a\\xf1\\x31\\xc6\\x37\\x73\\x88\\xba\\xee\\x58\\xc6\\xc8\\xf8\\x84\\x23\\x62\\xec\\x6e\\x3b\\xce\\x07\\xc8\\xaf\\x55\\x88\\x5e\\x82\\xdb\\x87\\xa1\\x52\\x27\\x80\\x0d\\xd3\\x3a\\xfc\\x5e\\x5f\\xd1\\x57\\x01\\xe9\\x5f\\x53\\x50\\x1b\\x1a\\x6f\\xf8\\x3c\\x64\\xe8\\x51\\x71\\x49\\xbf\\x3f\\xf0\\x11\\xb0\\x94\\xa0\\x9c\\x67\\x3d\\x0f\\xc4\\xa3\\x9e\\xe5\\x5e\\x69\\xf0\\x71\\x17\\x7b\\x8a\\xa3\\x64\\xe1\\xe2\\x56\\x06\\x4c\\xf7\\x02\\x79\\xcc\\x76\\x69\\x5a\\xe4\\x9d\\xaf\\xcd\\x80\\xca\\x0a\\x14\\xe1\\x69\\x1d\\xb9\\x46\\x42\\x2e\\xc7\\x5a\\xb4\\xf7\\x86\\x59\\x15\\xa6\\x9b\\xd4\\x8d\\x89\\xb1\\x2a\\xdf\\x48\\x7d\\x4d\\xb9\\xbe\\x87\\xcd\\xdc\\xa2\\x11\\xaa\\x88\\xe9\\xbb\\xe8\\x49\\xda\\x21\\x39\\x89\\xeb\\x08\\x44\\x59\\x2a\\xd6\\x3e\\x28\\x1b\\x2e\\x4a\\xfe\\x6a\\x88\\x36\\x00\\x66\\x09\\x92\\x6c\\x0f\\x78\\x7e\\x84\\xf2\\xa9\\x5b\\x46\\xb6\\x6f\\x0e\\x45\\x55\\xc9\\x48\\x3c\\xe2\\x17\\x6f\\xc6\\x3f\\x7c\\xc9\\xf4\\xf2\\xa2\\x2d\\xb0\\x55\\xaa\\xe2\\xe6\\x8b\\x30\\xa0\\xda\\x5f\\xeb\\x80\\xc2\\xa6\\x0e\\xa1\\x0d\\xbf\\x67\\xfb\\xbc\\xdb\\xe0\\xbe\\x33\\xf2\\xe9\\xc1\\x3c\\x46\\x9e\\x77\\x68\\xf2\\xff\\x59\\x60\\xa5\\x5e\\xb4\\x82\\xec\\x11\\xd4\\x7e\\x15\\x4b\\x7c\\x42\\xa5\\xfb\\x75\\x6c\\x8a\\xd5\\x39\\xb3\\x3d\\x12\\x5a\\x4a\\x65\\x19\\x2c\\x6c\\x9b\\xd5\\x76\\x23\\x8c\\xa7\\x2a\\x73\\xcd\\x17\\x9e\\x8c\\xf5\\xcd\\x04\\x8e\\xd3\\x30\\x21\\x38\\x23\\xab\\xba\\xfc\\x36\\x82\\xb2\\xb7\\xf6\\x8c\\x5b\\xc4\\x6f\\xd0\\x9a\\x8c\\xb2\\xa3\\xfd\\x09\\x95\\x73\\xee\\x2e\\x6f\\x28\\xc8\\x2e\\x27\\x1b\\xb5\\xef\\x93\\x4b\\x0b\\x0c\\x38\\x1c\\xfa\\xae\\xc6\\x66\\xd7\\x17\\x10\\x6a\\x87\\x4a\\xf3\\x0a\\xa7\\x41\\x25\\xea\\xe9\\xac\\xc2\\xf1\\xf2\\x41\\x18\\xcb\\x4e\\x68\\x3a\\x73\\x1e\\x37\\xe5\\xe4\\x64\\xa1\\xea\\x3d\\x2a\\x53\\xcc\\x0d\\xca\\xd4\\xc1\\x7c\\xea\\x9a\\x43\\xe2\\x36\\x5f\\x3a\\xe3\\xdd\\x89\\xeb\\x39\\x97\\x74\\x20\\x04\\x55\\x50\\x74\\x5f\\xc2\\x67\\xfc\\x7d\\xcc\\x56\\x02\\xe9\\x14\\x97\\x2a\\x4d\\xa6\\xeb\\xeb\\x68\\x7f\\x68\\xa0\\xcd\\x7d\\x8b\\x4f\\xdd\\x73\\x72\\x21\\x06\\xa8\\xe4\\x36\\xb9\\x3e\\x5b\\x58\\xf5\\x98\\x2a\\xce\\xcd\\xec\\xfd\\xb3\\x82\\xfe\\x98\\x53\\x82\\x61\\x42\\x6b\\xa6\\x40\\x52\\x55\\x76\\x43\\xce\\x9f\\xec\\x71\\xea\\x43\\xcf\\x5b\\x6c\\xba\\xde\\xb4\\x95\\x31\\x93\\xff\\x3e\\xd1\\xa1\\xf9\\x22\\xa9\\xaf\\x2e\\xc6\\xf3\\x38\\xe7\\xfb\\x0a\\xff\\xe3\\xd1\\x3c\\x33\\xe3\\x95\\x87\\x3e\\x4a\\x7a\\x7f\\xb0\\x44\\x98\\x1e\\x05\\xa6\\x71\\x97\\xb9\\x96\\xb1\\x99\\xb4\\x30\\x11\\x11\\x93\\x63\\xe5\\x61\\xd5\\xb8\\xa5\\x17\\x84\\xfd\\xff\\x58\\xab\\x80\\xed\\x4c\\x49\\xe9\\x3f\\x0c\\xf4\\x19\\x24\\xf9\\x83\\x5e\\xfb\\x09\\xf6\\x44\\x63\\xb6\\x55\\x17\\xb6\\x7b\\x15\\xdc\\x3f\\x28\\xad\\x9a\\x9b\\x2d\\x29\\x46\\x8d\\xe2\\xc6\\x3e\\x62\\x00\\x4b\\x6a\\x3f\\xd0\\xc5\\xc2\\xe2\\xaa\\xa6\\xcf\\xa1\\x5e\\x4f\\xaa\\xfa\\x1e\\x2c\\x71\\x3e\\x98\\xd3\\xfd\\x25\\xca\\xb9\\xe5\\x17\\x03\\x59\\xc8\\x36\\x51\\x52\\xb4\\x74\\x27\\x6e\\xd0\\x03\\x7c\\xdf\\x77\\x18\\x28\\xe2\\xfb\\x7c\\xce\\xc4\\x89\\x5f\\x21\\xad\\xcc\\x5b\\x68\\x87\\xc8\\x6e\\x51\\xad\\x05\\xf2\\x55\\xf6\\xe9\\xda\\xd2\\xc4\\x1f\\x56\\xb9\\x8b\\x7b\\xbb\\xf9\\xfc\\xb6\\xba\\x8c\\xad\\xfd\\x38\\xad\\x8c\\x62\\xf9\\x2d\\xd8\\x77\\x40\\xfa\\x1e\\x1b\\xd1\\x70\\xc0\\x0b\\x20\\x49\\xc5\\x13\\x0f\\xe7\\x33\\xf1\\x6b\\x1f\\x2c\\x7f\\x00\\xb2\\xef\\x97\\xb3\\xa9\\x54\\x58\\xc5\\x3f\\x19\\x9d\\x46\\x53\\x36\\xd5\\xff\\x59\\x77\\x80\\x6e\\x1a\\xfd\\xe3\\xea\\xa2\\x46\\xd8\\x5c\\xab\\xf7\\xe1\\x23\\x48\\x1e\\x23\\x92\\x99\\x76\\xed\\x19\\xc4\\x0e\\x29\\xff\\x33\\xd8\\x0e\\x7d\\xea\\xb1\\x92\\x71\\xde\\xcd\\x5e\\xe0\\x61\\x72\\xb0\\xb0\\xa1\\x39\\xbd\\x62\\xa2\\xe7\\xc8\\x3a\\x8a\\x65\\x60\\x1d\\x0a\\x05\\xd6\\x1a\\xf9\\xc6\\x03\\x2d\\xf5\\x80\\x01\\xd4\\x73\\xe2\\x0d\\xd6\\xc6\\xaf\\xd7\\x8d\\xdb\\xd7\\xcd\\x17\\x8e\\x9c\\x27\\x1e\\x05\\x72\\xf8\\x59\\x82\\x82\\x3c\\xe6\\xc4\\x02\\x93\\x0c\\xf8\\x0f\\x5e\\x0c\\x7c\\xda\\x85\\x12\\x2a\\x76\\xd1\\xce\\x02\\x1b\\x1e\\x3d\\xe2\\x55\\x6d\\x1b\\x45\\xac\\x7b\\x01\\xb5\\x9c\\xad\\xa2\\x52\\x91\\xd6\\x38\\xa5\\x2a\\x5e\\x7d\\xbc\\xdd\\xf9\\x6b\\xb1\\x77\\x4a\\xb0\\xb0\\x77\\xe4\\xb3\\xda\\x5a\\x95\\x8f\\xe1\\x1d\\xee\\x4a\\x02\\xe6\\x9b\\x91\\x8d\\xdb\\xfa\\x1c\\x5b\\x3b\\x7d\\xca\\x9f\\x87\\x84\\xbb\\x6b\\x0b\\x9d\\x5a\\x7f\\xee\\x74\\xbb\\x03\\x74\\x7f\\x61\\xc2\\xb2\\xf1\\xb4\\x92\\x45\\x2d\\x3b\\x56\\x0b\\x48\\xd3\\x9d\\x87\\x21\\xe9\\x83\\x75\\x25\\x56\\xd4\\x4d\\xa6\\xb0\\x28\\xd9\\xae\\xf8\\xbf\\xf9\\xaa\\x37\\x9c\\x8e\\x2b\\x0a\\x63\\x6d\\x74\\x88\\x60\\xab\\xd8\\xe6\\x4f\\xc8\\xe9\\x65\\x20\\xa3\\x4a\\x27\\xf7\\x67\\xaa\\x97\\xa8\\xf7\\x7b\\x60\\x95\\x21\\x8e\\xad\"},\n{{0x73,0x87,0x2b,0x14,0x76,0x2f,0x68,0xda,0xe4,0xfc,0x10,0xdf,0xd6,0xf4,0x2d,0x3f,0x96,0x22,0xbf,0x2a,0xfe,0x6b,0x34,0xa9,0x56,0x49,0xaa,0x38,0x74,0x24,0xee,0x6c,},{0xdf,0xab,0x2c,0xe1,0xab,0x99,0x81,0xaa,0x7c,0xbf,0x32,0x07,0x35,0x00,0x07,0xfa,0x6c,0xe6,0xca,0x60,0xa2,0xed,0x7b,0x59,0x0f,0x3c,0x2f,0x62,0x92,0x2d,0x8f,0x61,},{0x85,0x25,0xc3,0x46,0xca,0x3a,0x6a,0x6c,0x5f,0x65,0xc4,0x17,0x78,0x59,0x93,0x77,0x65,0x98,0x70,0xcb,0x6d,0xf9,0xa4,0xa0,0xe5,0x5b,0x40,0xc3,0x5b,0xeb,0xa5,0x5c,0x8e,0x00,0x9e,0x56,0x00,0xb6,0x44,0x7d,0xc7,0x40,0x2b,0xa2,0x77,0x49,0x29,0x7e,0x8f,0x95,0x28,0x69,0x18,0x56,0xf7,0x2d,0x2a,0xd7,0x61,0xed,0x1b,0xc1,0x53,0x09,},\"\\x43\\x3d\\x71\\x78\\x1c\\xea\\xb2\\xb4\\x7d\\x82\\x6e\\x67\\xd3\\x9f\\x9b\\x80\\xd2\\xff\\xd7\\x25\\xf8\\xc5\\xae\\xb4\\x0c\\xbe\\x4f\\x9b\\x5f\\x48\\xef\\x93\\x52\\x1c\\xce\\xc6\\x04\\x36\\x0b\\x96\\x47\\x32\\x31\\x90\\xbf\\xef\\x75\\xac\\x93\\x15\\x62\\xd2\\x7f\\x4a\\x4e\\x31\\xf4\\x6e\\x57\\xbc\\x99\\xfa\\x51\\x58\\xc8\\x2e\\x12\\xb7\\x37\\xe4\\x5c\\x5d\\xe9\\xf7\\xdd\\x7c\\x86\\x22\\xd4\\xa7\\xea\\xad\\xf7\\x20\\x2f\\xb4\\x9d\\x81\\x9c\\x9a\\xd2\\x4f\\x88\\x07\\x31\\x3c\\x5f\\x37\\xdc\\x20\\x45\\x3b\\xdf\\x05\\xc9\\xbf\\x1a\\x3c\\x21\\x17\\xc9\\x3e\\x7f\\x3c\\xc8\\xa2\\x54\\x20\\x98\\xe8\\xfc\\x1c\\x64\\x2f\\xa4\\x7b\\x05\\x54\\x36\\x57\\xb8\\x5f\\x48\\x0b\\xc8\\x6e\\xc4\\x28\\x00\\xbb\\x14\\x22\\x35\\x9c\\x7c\\x3e\\x8f\\xf4\\xbe\\x59\\x8b\\xd5\\x4f\\x1d\\xc5\\x86\\xac\\xae\\x45\\xa4\\x74\\x06\\x22\\xb9\\x62\\x74\\x2b\\xc8\\x6e\\x17\\xcf\\xa6\\x3e\\x77\\x53\\x54\\xe7\\x70\\x7e\\x50\\x79\\x58\\x9e\\x8d\\x10\\x8b\\x1f\\x11\\xda\\xce\\x05\\x75\\xcb\\x9a\\x6d\\x26\\xb5\\x9f\\xce\\x98\\x14\\x65\\xd9\\xbc\\x34\\x4e\\xa6\\x94\\x5a\\x95\\xb8\\x62\\x79\\x63\\x84\\xfa\\x81\\x70\\x56\\x08\\x57\\x45\\x7b\\xef\\xf9\\x5a\\x9b\\x5a\\xc3\\xd6\\xad\\x28\\x2d\\x44\\x92\\x9a\\x30\\x30\\x26\\xb4\\xbb\\xed\\xd6\\x0e\\x2e\\xf0\\x55\\xa3\\x1f\\x52\\xd7\\xce\\x8d\\xf2\\xca\\x5d\\x18\\x51\\xc5\\xb1\\x67\\xdb\\x08\\x09\\x25\\x9b\\xb8\\x12\\x56\\x90\\x74\\x10\\x5c\\x73\\x4c\\x85\\xd6\\x23\\x12\\x73\\x75\\x5f\\x3a\\x8b\\x56\\xdc\\x50\\x8d\\xb5\\xc2\\x3d\\xac\\xb7\\xa0\\x61\\x67\\xbd\\xa5\\x1b\\xc0\\x13\\x50\\xf0\\x16\\xcd\\x41\\xb2\\x1e\\x8c\\xc5\\xbc\\x93\\x34\\x3a\\x9b\\xb6\\xea\\x47\\x38\\xc5\\xc8\\x4b\\x78\\xfa\\x96\\x3c\\x41\\x0e\\x43\\x3d\\xc5\\x98\\x19\\x6c\\x22\\xe5\\xb7\\x91\\xe1\\x2a\\x4b\\x34\\x3f\\x7c\\xd4\\x7b\\xbb\\x0e\\xb0\\x78\\x2b\\xdb\\x1a\\x4e\\x46\\x68\\x46\\xa0\\x30\\x52\\x8e\\xeb\\x89\\x05\\x6f\\x73\\x25\\x71\\x93\\xad\\xaa\\xbc\\x1b\\x22\\x98\\x62\\x03\\x48\\x78\\xc3\\x25\\x8a\\x53\\x25\\x48\\x76\\x2e\\x29\\xec\\xc0\\x01\\xab\\xd9\\x89\\x64\\x9d\\xa5\\xe1\\x44\\xcf\\x35\\xd4\\x86\\x99\\xf2\\x3b\\xc4\\x6c\\x5b\\x34\\xe0\\x4a\\x53\\xe7\\x27\\x24\\xb2\\xb0\\xb8\\x78\\x98\\x25\\x75\\xd6\\x88\\xe2\\x3c\\xbe\\x3a\\x34\\x06\\x7f\\x49\\x71\\xe5\\x55\\x97\\x2e\\xc2\\x90\\x8a\\xe5\\xf0\\x3e\\x88\\x31\\xec\\x67\\x75\\x5b\\xe9\\x56\\x87\\xce\\x63\\x72\\x93\\x9e\\x1e\\x2f\\xb6\\x95\\x1e\\xc9\\xec\\xf4\\xbf\\x7d\\x15\\x35\\x43\\x1e\\x25\\x9f\\x29\\xad\\x43\\x12\\x22\\xb5\\x4b\\x65\\xaa\\x7d\\x07\\xcf\\xb5\\xdf\\x16\\x2a\\x87\\xc4\\xd0\\x34\\x81\\xeb\\x44\\x1f\\x22\\x1d\\x7f\\x58\\x62\\x7a\\x14\\x16\\x4e\\x7f\\x4c\\x2e\\x3a\\x1d\\x50\\x7e\\x89\\x9d\\x53\\x58\\xe0\\x08\\x29\\xb0\\x8c\\xf3\\xae\\xcb\\x8a\\x75\\xb2\\xa3\\x1c\\x31\\x85\\xa5\\x80\\xe1\\x2b\\x13\\xf0\\x64\\x28\\x69\\xff\\xfb\\x05\\x67\\x23\\xe9\\x61\\xaa\\xf6\\xfe\\xfe\\x67\\xb4\\xa7\\xc4\\xc9\\x3d\\xb3\\xfe\\x1f\\x61\\xad\\xcc\\x76\\x55\\x69\\xa9\\x9c\\x09\\xa3\\xc8\\x24\\xed\\x4a\\x98\\xba\\xbe\\xae\\x43\\xef\\xb1\\xf3\\x51\\xba\\x13\\x0e\\x22\\xaa\\x97\\x81\\x19\\x86\\xbe\\x92\\x3c\\xc4\\x18\\x0a\\x7c\\x4b\\x78\\xbc\\xc1\\x40\\xce\\xc1\\x55\\x74\\x65\\x4a\\xa6\\xd6\\x5a\\x06\\xb9\\x7e\\xcf\\xa5\\xf3\\xa9\\x35\\x5f\\x96\\xe4\\xee\\xaa\\x76\\x89\\x21\\x7b\\x66\\x3f\\xba\\x4d\\xab\\x0d\\x99\\xb1\\x9c\\x8d\\x8d\\xbf\\x47\\xa1\\x57\\xe5\\xd5\\x96\\x9a\\x35\\xef\\x84\\xdf\\xf9\\x56\\x2e\\xdd\\x43\\x4e\\x73\\xae\\xe7\\xd0\\xd8\\x92\\xdd\\xa7\\x2a\\x36\\x2a\\x22\\xa7\\xe9\\xfa\\x86\\x34\\xa5\\x7e\\xeb\\xd1\\xa9\\x07\\x48\\x5c\\xa8\\x92\\x1b\\xdc\\x19\\xee\\x9e\\xe5\\x88\\xf3\\x95\\x68\\x7d\\x3f\\xc8\\xf8\\xc2\\x5f\\x2e\\x95\\x76\\xca\\x60\\x31\\x3f\\xbb\\x2c\\x26\\x5a\\x99\\xf2\\xcd\\xd5\\x57\\x5b\\x1d\\xd5\\x30\\x60\\x4e\\x9a\\xd6\\x69\\x5c\\x9f\\xb3\\x59\\x94\\xa8\\xb8\\x7d\\x5c\\x85\\x70\\x54\\x9a\\x4d\\x32\\x9b\\x9f\\xe0\\x87\\x06\\x9a\\xb7\\xeb\\x0d\\x71\\x4a\\x94\\xe1\\x92\\x61\\xf8\\x6e\\x44\\x8f\\x2d\\xa9\\xb1\\xcb\\x0c\\x0d\\xbe\\x41\\xd4\\x4c\\x3a\\x82\\x47\\x83\\xd1\\xbd\\xbd\\x73\\x26\\x05\\x1a\\xeb\\x10\\xad\\xab\\x80\\x5c\\x5c\\x59\\xd0\\xe8\\x3b\\x1c\\x11\\xa2\\xfd\\xd3\\x5e\\x44\\x4a\\x49\\x9e\\xd1\\x5d\\xaf\\xd8\\x38\\x62\\x77\\x5f\\x6c\\xdf\\xc6\\x75\\x95\\x81\\x84\\x07\\xbe\\x55\\xec\\xbf\\x7b\\xf8\\x6c\\x73\\x06\\x9a\\xac\\xe5\\x77\\x62\\x6a\\x85\\x63\\x53\\x6f\\x60\\x50\\x42\\xcf\\x7c\\xaa\\xf6\\xfc\\x8e\\x3b\\x54\\x5b\\x77\\x41\\x4d\\xf8\\xd9\\xf6\\x49\\xb9\\x9e\\xe4\\x25\\x41\\xda\\x38\\xc3\\xaa\\xe6\\x27\\x20\\x78\\x45\\xb8\\xf4\\x14\\xa8\\x07\\x4d\\x70\\x86\\x8a\\x5c\\x0b\\x07\\xb0\\x70\\xc3\\xc6\\x53\\xbe\\x04\\x07\\x6b\\x83\\xca\\xd7\\xb0\\x30\\x5d\\x95\\x00\\xaa\\x44\\x45\\x5c\\xb8\\x60\\xdc\\xc7\\x64\\x00\\xaf\\x93\\xc3\\xd2\\xef\\xb4\\x2a\\xe0\\x56\\xf1\\x42\\x8b\\x65\\xf1\\x22\\xe1\\xc7\\xb9\\x58\\x4d\\x81\\x4d\\x50\\xac\\x72\\xef\\xdb\"},\n{{0x67,0xcf,0x27,0x15,0x52,0x87,0xbe,0x6b,0xfa,0xb6,0x62,0x15,0xe0,0x17,0xc3,0x46,0x63,0x22,0xf2,0x1e,0x6e,0xb1,0x40,0xbe,0x4f,0x1b,0xde,0xcf,0x55,0xab,0xfd,0xc1,},{0xd0,0x70,0xaa,0xb2,0x95,0xa8,0xaf,0x93,0x57,0x27,0xc3,0xbe,0x44,0x2b,0x25,0x1d,0xb9,0xe7,0x74,0xd2,0xf4,0x4b,0x3c,0x24,0x24,0xc5,0x2f,0xc8,0x96,0x56,0xe1,0x69,},{0xc9,0x34,0xa3,0xa1,0xaa,0xab,0x78,0xd9,0x26,0x9d,0x1e,0x9d,0x13,0x39,0x2f,0x72,0xc6,0x37,0xbc,0x5d,0xe5,0x4f,0x04,0x69,0x1e,0xfc,0x29,0xd4,0x73,0xb4,0x75,0x02,0x5d,0x8d,0x8f,0xe3,0xc5,0x23,0xd2,0xd2,0x9c,0x41,0xc5,0xf3,0xde,0xc6,0xca,0x38,0xce,0x6d,0x68,0xd7,0xff,0x09,0xb6,0x13,0x5b,0xa2,0x4d,0x0d,0x32,0xcc,0x15,0x02,},\"\\x0f\\xf0\\x52\\x97\\x03\\x1c\\x89\\x27\\x74\\xcb\\x2c\\x01\\xe8\\xca\\x60\\xdd\\xd0\\xce\\xac\\xc0\\xb8\\xd5\\x91\\xa8\\x91\\xe3\\x3b\\x19\\xe1\\xbe\\x9e\\x36\\x3b\\xc6\\x42\\x0d\\x6f\\x52\\x9f\\x04\\x84\\x0b\\x3b\\x08\\x85\\x3c\\x83\\x5a\\x03\\xe0\\x36\\x97\\x8b\\x04\\xa4\\xf9\\xec\\x6b\\xe4\\xae\\xf3\\x31\\x95\\x61\\x90\\x99\\x6d\\xea\\x27\\x26\\x19\\xf1\\x68\\x6d\\x33\\xbe\\xf0\\x3d\\xbc\\x08\\x5a\\x92\\x3a\\x0f\\x11\\x5b\\x78\\xf6\\x53\\xfe\\xeb\\x60\\xbb\\x9e\\x45\\xf3\\x4f\\xb8\\xbe\\x5a\\x4c\\xbb\\x64\\x8c\\x7d\\x29\\x95\\x6f\\x0d\\x0e\\x96\\xbd\\xd3\\xc8\\xd0\\x64\\x97\\x20\\x62\\x4c\\xbc\\x20\\x79\\xe8\\x4f\\xd6\\xd0\\x10\\x24\\x11\\x24\\x09\\x84\\x59\\xf1\\x2a\\xf2\\x99\\x1d\\x38\\x28\\x77\\x0f\\x50\\xb1\\x04\\xea\\x6e\\x5f\\x51\\xfd\\xad\\x30\\xa9\\xb8\\x07\\x9d\\x21\\x59\\xe4\\x6d\\x64\\xaf\\x91\\xd0\\x7c\\x10\\xed\\x19\\x81\\x4d\\xf2\\xaf\\xe6\\x60\\xd7\\xd8\\xf2\\x40\\x35\\x34\\xe9\\x2c\\x62\\xe1\\xea\\x6d\\x68\\x82\\x03\\xbc\\xa3\\xd9\\x7c\\x2a\\xfd\\xa8\\x3b\\x25\\x55\\x20\\xff\\xe9\\x2a\\x33\\x62\\x57\\x72\\x51\\x3b\\x1f\\xe3\\x4f\\xaf\\xe3\\x2b\\x6a\\x9b\\x8c\\xf9\\x94\\xdf\\x7e\\x63\\x4e\\x68\\x65\\x91\\xe5\\xf0\\x07\\x3a\\xba\\xbc\\x64\\xa8\\x92\\x10\\xba\\x53\\xa4\\x99\\x1c\\x11\\x55\\x7e\\x03\\x34\\xe6\\xc6\\xa5\\x03\\x6c\\x64\\x2a\\x31\\x8f\\x22\\x95\\x11\\x71\\x39\\x08\\x5f\\xb3\\x40\\x75\\x64\\x70\\x06\\x75\\x8e\\x32\\xbc\\x00\\xad\\x10\\x9f\\xe8\\x03\\xf7\\xee\\x9f\\x5e\\xc2\\xaf\\x4d\\x25\\xc3\\x07\\x0a\\xbc\\x51\\xcf\\x4d\\x78\\xe1\\x3a\\x7c\\xe2\\x83\\xd4\\xfb\\x4e\\xb4\\x1d\\x3e\\x8c\\xe9\\x02\\x38\\x50\\x0a\\xe0\\xce\\xda\\x32\\x0e\\xc5\\x92\\x2e\\xfa\\x10\\xb9\\x03\\x74\\x8e\\x1e\\x85\\x3a\\x37\\x29\\xd2\\x4c\\x10\\x54\\x39\\xdf\\x2f\\x70\\x00\\x12\\x3d\\xb9\\xb2\\xc0\\x15\\x33\\xbb\\xf0\\xd0\\x28\\xeb\\xb2\\xfc\\x00\\xdc\\xe3\\x8a\\xd0\\x63\\x28\\xee\\x9e\\xcd\\x84\\x9a\\x6e\\xfc\\x3a\\xe8\\x84\\xef\\x69\\x33\\xcf\\xeb\\xed\\x05\\x5b\\xb2\\x96\\x8a\\x0b\\x06\\x76\\xb5\\x72\\x92\\x16\\x17\\x8c\\x75\\x19\\xef\\x07\\x88\\x59\\x3f\\xc0\\xdc\\xff\\x50\\xd7\\xe0\\xb1\\xeb\\xb3\\xcf\\x49\\xbb\\xd1\\xbf\\xa5\\xc3\\x0e\\xa7\\xb8\\x8c\\x36\\xe1\\xa1\\x59\\x3a\\xef\\x0b\\xb3\\xf9\\xe2\\x09\\x1c\\x85\\x89\\xf7\\x41\\x4b\\xee\\xd8\\xdf\\x46\\x6a\\x2e\\xd8\\x7b\\x2c\\xb5\\xf3\\x5f\\x1d\\x31\\x24\\x6c\\xeb\\x96\\x86\\x09\\x25\\x36\\x15\\xd7\\x80\\x43\\x51\\x73\\x79\\xee\\x69\\x74\\xa6\\x69\\xcb\\x48\\xda\\x6a\\xc2\\xf9\\x6d\\x70\\x0b\\x7e\\x44\\xa4\\x35\\xcf\\xef\\xec\\x40\\x2a\\x1e\\x31\\x10\\xe7\\x69\\x81\\x92\\x4f\\x26\\x01\\xc0\\x1d\\xc0\\x35\\x46\\xfd\\x4f\\x51\\x16\\x49\\x30\\x2f\\x06\\x33\\xdf\\xbd\\x25\\x65\\x1c\\x5a\\x59\\x9c\\x90\\x95\\x44\\x89\\xc7\\x6a\\x65\\xec\\x05\\xa7\\xe4\\xcc\\x74\\x61\\x6c\\xe2\\x56\\x01\\xcc\\x37\\xb8\\x04\\xe1\\xf0\\xbc\\xc8\\x65\\x10\\x23\\xb1\\x2e\\x13\\x56\\x84\\x41\\xe8\\xb8\\xef\\x4c\\x30\\x5f\\xcd\\xad\\x3d\\x2b\\x13\\xfa\\x08\\x03\\x24\\xb2\\xfd\\x6b\\x61\\x99\\x8c\\xf8\\x64\\xb6\\x58\\xbc\\x7f\\xef\\xcc\\x48\\xa5\\xa7\\x68\\x1d\\x7c\\x86\\x6c\\x34\\x2c\\x7f\\x5d\\x6c\\xf1\\x08\\x81\\x52\\x2c\\xc7\\x10\\x25\\x7d\\x25\\xa4\\xc1\\xe3\\x52\\xd2\\x70\\xe9\\x02\\x08\\x2a\\xb9\\x54\\x1d\\x59\\x00\\xce\\xff\\xa0\\x91\\x4b\\x16\\xb5\\x5e\\x0d\\xd3\\x78\\x6e\\x98\\xd4\\x17\\x20\\x87\\x5a\\x14\\x8e\\xb4\\xab\\xdb\\x01\\x53\\x85\\x66\\x79\\xfb\\x98\\xc0\\xec\\x48\\x5e\\x5f\\x45\\x8d\\x63\\x5b\\x78\\x61\\xa2\\xb3\\xa8\\xba\\x5e\\xc2\\xc1\\x44\\x4d\\x35\\x39\\x80\\x20\\x0e\\x5e\\x07\\x18\\x08\\x85\\x4a\\x26\\x8c\\xc7\\x6c\\x60\\x5c\\x94\\xf3\\x73\\x29\\xc3\\x61\\x87\\xa4\\x1f\\xdd\\xf9\\x2a\\xab\\xdb\\x49\\x96\\xa0\\xe1\\x0b\\x31\\x55\\x26\\xaf\\xea\\xc8\\x0e\\xb2\\xfa\\x32\\xaf\\x78\\x6a\\x34\\x31\\x6b\\x36\\x11\\x1e\\xe9\\x35\\x21\\x08\\x14\\x4d\\x70\\xf7\\xd1\\x72\\x3b\\x32\\xf4\\xdb\\xaa\\x82\\x20\\x13\\x53\\x41\\x1d\\x65\\x77\\x13\\xe5\\x5e\\x35\\xdf\\x78\\x58\\x0b\\x1b\\xc0\\x86\\x80\\xf0\\x15\\x9f\\xa1\\x16\\xfa\\xf4\\x63\\x56\\x6a\\xaf\\xe8\\xae\\xa6\\x98\\x57\\xe7\\x2e\\x44\\xac\\x80\\x9a\\xc4\\x3f\\x5c\\x45\\x93\\x9d\\x85\\xa1\\xa5\\xf4\\xa3\\x70\\xa1\\x89\\x96\\xc8\\x51\\x4a\\x46\\xf3\\x43\\x71\\xef\\x9e\\x5f\\xb2\\x04\\x42\\x2c\\x93\\x4a\\x1d\\x29\\x3d\\x10\\x1b\\x8c\\x16\\xf9\\x9c\\xc0\\x73\\xea\\x36\\x6a\\x13\\xa4\\x5c\\x43\\x7d\\x62\\x0d\\x13\\x2b\\x74\\x40\\x9c\\xbf\\x8b\\x9c\\x07\\x5b\\x41\\x63\\xf7\\x26\\xaa\\x67\\xe5\\x09\\xa2\\x48\\x74\\xfc\\x1b\\x1f\\xb6\\xfb\\x7c\\x73\\x55\\x15\\x9c\\x02\\xaa\\x13\\xe6\\x4b\\xad\\xf1\\x50\\x35\\x6b\\x18\\x41\\xb3\\x21\\xf8\\x04\\x1e\\x13\\xed\\x77\\xe8\\x46\\x1c\\xfb\\xb8\\xe8\\x28\\x48\\x8b\\xf5\\x17\\xa5\\xd2\\x9f\\xf8\\x2e\\x73\\x67\\x48\\x0a\\x8e\\xdd\\xde\\xb5\\x35\\x0e\\x7a\\x83\\x42\\x3b\\xd0\\xb1\\xc5\\x5f\\x7b\\xb4\\x24\\xca\\x04\\xc2\\x05\\x72\\x3c\\xd5\\x40\\x56\\x71\\xe7\\x33\\xf3\\x91\\x60\\x0a\"},\n{{0x18,0xc2,0x1c,0x0d,0x0d,0xe1,0x3d,0x4c,0x64,0x49,0x7e,0xf0,0x26,0x0d,0x66,0xcf,0xd3,0x42,0x16,0x98,0x1a,0x1b,0x49,0x39,0x1a,0xe5,0xcb,0x0e,0x41,0x43,0x6e,0x9f,},{0xf7,0xd4,0xdd,0x1e,0x05,0x9c,0x36,0xf6,0xd1,0x21,0xc0,0xaf,0xfe,0xb2,0x1f,0x0c,0x57,0x2b,0x45,0x99,0x2f,0x84,0x94,0x8b,0x09,0xaa,0xfb,0xcd,0x86,0xbb,0x53,0x5c,},{0xc9,0xc0,0x99,0xe2,0x1d,0x09,0x5a,0xfa,0xdd,0x4e,0x71,0xc9,0xab,0xf6,0xb7,0x08,0x33,0x24,0x77,0x62,0x25,0xb5,0x87,0xb6,0x0a,0x0e,0x60,0x92,0xec,0xb3,0xd3,0x3c,0xff,0x39,0xc6,0x7d,0x34,0x77,0x6a,0xe9,0x9d,0xda,0x75,0x4a,0x3c,0x2b,0x3f,0x78,0x11,0x35,0xa3,0x8c,0x78,0xed,0x64,0x55,0xaa,0xf0,0xae,0x0c,0x31,0x3b,0x62,0x05,},\"\\x68\\xab\\xca\\x7c\\x16\\x6a\\xfe\\x06\\x3e\\x47\\x7b\\x80\\xe3\\x7d\\xb2\\x24\\xe1\\xa2\\x35\\xde\\x8f\\xcd\\xeb\\x7f\\x42\\x7a\\xf6\\x7e\\x00\\x12\\x47\\xcc\\x5e\\x05\\x71\\x82\\xfd\\x9b\\x6d\\xb8\\xba\\xba\\xa6\\x58\\xcf\\x3b\\x3f\\xe4\\xb0\\x76\\x3b\\xf8\\x8d\\x67\\x31\\x1b\\x11\\x90\\xbe\\x83\\x40\\x18\\xcf\\x57\\xa3\\x32\\x92\\x24\\x13\\x76\\x46\\x20\\xac\\xe0\\x54\\x45\\xee\\x01\\x9a\\x06\\xdf\\xf9\\x8b\\x23\\x89\\x79\\xad\\x6d\\x30\\x90\\x1b\\xef\\xa3\\xc6\\x4f\\x6b\\xd8\\xc6\\xeb\\x09\\x2c\\x2e\\x62\\x84\\x13\\x88\\xfd\\x8c\\x4e\\x84\\x19\\xe2\\x77\\x89\\x84\\x89\\x67\\x37\\xed\\x90\\xa2\\xcd\\xb2\\x19\\x96\\xae\\xf7\\xc2\\x16\\x38\\xd6\\xcb\\xe6\\x80\\x32\\x2d\\x08\\x99\\x65\\x97\\xa9\\xe3\\x03\\xf6\\xf5\\xf4\\x79\\x40\\xf8\\xc5\\xba\\x5f\\x5f\\x76\\x38\\x3e\\x7e\\x18\\x06\\x4a\\x3d\\x2d\\xff\\x5f\\xdf\\x95\\xe9\\x0c\\x5e\\xb3\\x0f\\x4d\\x8d\\x45\\x9e\\xe1\\xd5\\x06\\xa8\\xcd\\x29\\xcd\\xc6\\x9b\\x67\\x54\\x96\\x3b\\x84\\xd6\\x74\\x94\\xb3\\x53\\x05\\xd1\\x0d\\x12\\xb9\\x48\\x74\\x17\\xb2\\xce\\x28\\xad\\xcb\\x10\\xb6\\x5c\\xc9\\x31\\xfb\\x33\\x81\\xae\\x02\\xe7\\xaf\\x79\\xa0\\x2b\\xf9\\x9e\\x25\\x8a\\x56\\x36\\x10\\x90\\xe0\\xb7\\x12\\x22\\xb3\\xac\\x60\\xbf\\x2f\\xb7\\xba\\x83\\x2d\\x03\\x4f\\x5b\\x6b\\xc6\\xfa\\x66\\x3a\\xe7\\x41\\xf7\\x6d\\x97\\xc1\\xac\\x32\\xbc\\xb7\\x41\\x15\\x07\\xd5\\x18\\xd2\\xf6\\x05\\x4b\\x57\\x83\\x28\\xc5\\xf6\\x7f\\x75\\x8a\\xc0\\x1b\\xfe\\x6f\\x4d\\x35\\x90\\x0f\\x50\\xa5\\xdc\\xd3\\x0d\\x2f\\x92\\x61\\xb6\\xbb\\xec\\x4c\\x1d\\x1f\\xc1\\x8d\\x2a\\x7e\\x70\\xc4\\xd3\\x6c\\x21\\xfa\\xf8\\xcf\\x94\\xa5\\x87\\xc3\\xa0\\xd1\\xa9\\xcd\\xe7\\x83\\x1a\\xe6\\x26\\x77\\x54\\x68\\xdd\\xcd\\x40\\xa8\\xba\\x18\\xf4\\x2b\\x34\\x18\\x8d\\xe5\\x74\\x1e\\x1b\\xe8\\x30\\x7b\\x10\\x84\\x58\\x65\\x15\\xec\\x01\\x5e\\x4e\\x37\\x1d\\x29\\x44\\x3a\\x40\\xb0\\xc0\\x69\\xc6\\x41\\xd8\\xce\\xe5\\xe4\\x61\\x18\\x62\\x98\\x7c\\x3e\\x35\\x6b\\x12\\x93\\xb0\\x51\\x8b\\x4a\\x4c\\x8e\\xa9\\x7f\\xc5\\xa4\\xdb\\x1f\\x01\\x29\\xab\\xee\\x72\\xfb\\x80\\x92\\xea\\x35\\xc2\\xda\\xb6\\x75\\x73\\x85\\x02\\x07\\xb8\\xe8\\x27\\x18\\x99\\x9a\\xd9\\x9c\\x4c\\x83\\x9e\\xac\\x14\\x63\\x6b\\xd5\\xe4\\xd8\\x43\\x6a\\x27\\x0d\\xd9\\x0b\\x8e\\x32\\x13\\x02\\xe5\\x2a\\x92\\xd8\\x91\\xff\\x18\\x91\\x54\\x2a\\xe2\\xca\\xa0\\xd6\\x6e\\x0f\\x66\\x1e\\xae\\x37\\xb2\\x5b\\x08\\xbb\\x2e\\x0e\\xee\\xc4\\x83\\x80\\x09\\x77\\x8c\\xd5\\x25\\x98\\x43\\x80\\x98\\x3b\\x2b\\xaa\\xdd\\x71\\x02\\xa1\\xe3\\x56\\x73\\x4e\\x41\\xd7\\x61\\x83\\x82\\x9e\\xa9\\xab\\x82\\x44\\xc3\\x36\\x59\\x7c\\xa2\\xd6\\x79\\x88\\xf2\\x81\\x43\\x84\\x67\\xe4\\x53\\xf5\\x62\\xc6\\x7b\\x22\\xd0\\xa4\\xdd\\x9f\\xcb\\x46\\xa5\\xf8\\x0d\\x29\\x9d\\xb5\\xf0\\x1f\\x59\\x16\\x0a\\x19\\xd7\\x4c\\x64\\x4f\\xa5\\xa9\\x40\\xe3\\x2c\\x9d\\x8d\\x98\\x3b\\xab\\x7e\\xfb\\x0d\\x7c\\x7d\\xa4\\xe3\\xfd\\xa1\\xcd\\x0d\\x18\\xa4\\x55\\x8e\\xb9\\xfe\\x46\\x40\\x8a\\xab\\x50\\x85\\x91\\x2b\\xf2\\xf4\\x6a\\xb6\\x3a\\x93\\x54\\xf9\\x02\\x7c\\x93\\x69\\x12\\x23\\xff\\xaa\\xb8\\x46\\x3b\\xac\\x4c\\x4b\\xc3\\xb1\\x1a\\xbc\\x46\\xba\\x68\\x71\\x7c\\x91\\x78\\x0d\\x3f\\x30\\x47\\x0d\\xbd\\xd8\\x8b\\x37\\x80\\xa1\\x94\\xc8\\xa4\\x0a\\x2c\\x0a\\x81\\xa4\\xd5\\x6d\\xec\\x2d\\x89\\x62\\xc3\\x4d\\x2a\\xb7\\x33\\x69\\x02\\x8e\\x1b\\xfe\\xaa\\x6b\\xb5\\x82\\x41\\xff\\x4f\\x89\\x8f\\x80\\xad\\x3b\\xb1\\xc6\\x91\\xb8\\x64\\x7f\\x2c\\x69\\x83\\x95\\x4c\\x1c\\x77\\x95\\x74\\x58\\xee\\xbf\\x1c\\x50\\x55\\xc3\\x16\\x93\\xab\\xce\\xd0\\x53\\x84\\x73\\x5a\\x4f\\x74\\x19\\x68\\xbd\\x6a\\xc3\\x15\\x65\\xcf\\xee\\x71\\xc8\\x84\\xc1\\xe2\\x9e\\x9e\\x7a\\xe0\\xf7\\xec\\xd0\\x4d\\x46\\x3b\\x1d\\xc3\\x89\\xc3\\x60\\x37\\xe8\\x14\\x58\\xdc\\xec\\x61\\xd0\\x76\\x40\\x32\\xdd\\x58\\x9b\\x92\\xaf\\xda\\x2f\\xc9\\x02\\x8f\\x41\\xab\\x53\\xcc\\xa2\\xd0\\x4e\\xc6\\xa9\\x56\\x59\\x55\\xcb\\xcf\\x1a\\x34\\x63\\x98\\x9c\\x71\\x39\\xbb\\x90\\x2a\\x59\\x21\\xe8\\xb2\\xc9\\x9c\\x48\\xe1\\x37\\x11\\xf0\\xbc\\xc3\\x99\\x25\\x95\\x16\\xc8\\x1a\\xe9\\x42\\xa6\\x79\\xd4\\xba\\x33\\x97\\x9e\\xb1\\x2f\\xcd\\x28\\x60\\x60\\x2e\\x47\\x24\\xb1\\x33\\x0f\\x1c\\xd2\\x57\\xb5\\xb2\\x89\\x1d\\xae\\xe8\\xef\\x4c\\x92\\xfc\\x3b\\xfd\\xb3\\x4e\\x53\\x2d\\x58\\x70\\xf3\\x80\\x59\\x86\\xac\\x97\\xb5\\x03\\xfd\\x85\\x87\\x35\\x48\\xe3\\x09\\x50\\x00\\x0f\\x8a\\x70\\xbe\\x51\\xfa\\x75\\x76\\x03\\x50\\x1f\\x2d\\x30\\xe8\\x52\\xef\\xea\\xc4\\x82\\x68\\x62\\xae\\xd7\\xf6\\xd2\\x0c\\x9a\\x8c\\x8d\\xbe\\x36\\x2d\\xfe\\xe4\\x18\\x93\\xf2\\x7e\\x6f\\xd5\\xe9\\x1d\\x0e\\x7e\\x3d\\x4f\\xd8\\x15\\x5f\\x44\\xfd\\x8e\\xf1\\x7a\\xf1\\x4a\\x84\\x8d\\x44\\xa8\\x76\\x31\\xae\\xee\\x75\\x14\\x62\\xb2\\xa5\\x40\\x87\\x06\\x8d\\xae\\xab\\x3e\\xa3\\x28\\x9e\\xce\\x62\\x12\\xb3\\xb5\\x2c\\xe7\\xa8\\x88\\x6d\\xf2\\xa7\\x27\\xb7\\x2a\\x57\\x0c\\x2f\\xb9\\xc5\\x03\\x41\"},\n{{0xdb,0x9a,0xae,0xe1,0x98,0xcd,0x26,0xa5,0x2b,0x11,0x81,0xfa,0x3f,0xd9,0x2a,0xbe,0x42,0x5e,0x66,0x6d,0x89,0x0b,0xf9,0x69,0x46,0x7d,0xd2,0xce,0x28,0x0e,0xd4,0xa7,},{0x3c,0x89,0x7c,0xaf,0xe2,0xb4,0x99,0xec,0xb2,0xe1,0xdd,0x01,0xea,0x55,0xf3,0xfc,0x88,0xf6,0x8c,0x25,0xb6,0x4a,0x63,0x6b,0x31,0xa1,0xfd,0x1c,0x78,0xf3,0x7f,0x3f,},{0xb2,0xe3,0xd9,0xc5,0xd0,0xff,0x32,0x99,0x96,0xbc,0x89,0xd2,0x6f,0xb3,0xac,0x12,0x6b,0xde,0xd3,0x13,0xcb,0xf8,0xdf,0x86,0x71,0x86,0x38,0xc1,0x99,0xe0,0x57,0x27,0x3d,0x09,0xeb,0x16,0x3c,0x6c,0x18,0x1f,0xd8,0xbc,0xe5,0x1f,0x72,0xd4,0xd9,0xd2,0xe8,0x4a,0xbb,0xe0,0x83,0x30,0x77,0x3b,0x9f,0xcc,0x21,0x66,0xf1,0x40,0xd6,0x0e,},\"\\x47\\xfb\\x62\\x15\\x61\\xf8\\xb7\\xee\\xce\\xc6\\x03\\x3f\\x2b\\xcb\\x6f\\x43\\xac\\x68\\xc9\\x58\\xdf\\xd2\\x65\\x6f\\x52\\xa0\\xc2\\x9b\\x4a\\xcd\\x44\\xf4\\x30\\x4c\\x6b\\xf7\\x7e\\xea\\xa0\\xc5\\xf6\\xd3\\xb2\\x2d\\xb1\\x96\\x99\\xc3\\xdc\\xde\\xde\\x69\\x8a\\xbd\\xe6\\x23\\xec\\x4b\\x2b\\x90\\x91\\x0c\\x80\\xac\\x3a\\xf3\\x9c\\x55\\x0b\\x6d\\xd4\\x09\\xe6\\x3d\\x77\\x70\\x66\\x55\\xa9\\x19\\x9c\\xb5\\xc0\\x25\\x8f\\x5b\\xa3\\x82\\x85\\xff\\xdc\\x64\\xb8\\xa8\\xf3\\x73\\xd1\\xfb\\x29\\xba\\x87\\xf8\\x4d\\xdf\\x5f\\x34\\xd8\\xf1\\x40\\xbb\\xc1\\x7b\\x39\\x61\\x68\\x2d\\xf5\\xd0\\xa8\\xf9\\x10\\x2e\\x37\\x9a\\x99\\x98\\x13\\x9d\\xfe\\x40\\xab\\x8c\\xe7\\x53\\xbf\\x56\\x26\\x10\\x82\\x37\\x77\\x1a\\x7d\\x8e\\x10\\x9e\\x9e\\x0a\\xfe\\x9b\\x66\\xd0\\x42\\x09\\x42\\xe1\\x63\\xa4\\xf3\\xc0\\x3f\\x71\\x81\\x3e\\xe0\\x78\\xbd\\x09\\x0a\\xc3\\xd0\\x77\\x2e\\x26\\x22\\xc2\\x59\\xe6\\x82\\x55\\x2c\\x75\\xb0\\x8d\\xd0\\x55\\xa4\\xa5\\xeb\\x5e\\x60\\x94\\x40\\xbc\\xd3\\xf3\\xa6\\xfe\\xb8\\x76\\xfd\\x16\\x92\\x15\\x20\\xc6\\xcb\\x68\\x84\\x71\\x0d\\x2e\\x15\\xcd\\xad\\x6d\\xaa\\xee\\xd9\\x59\\x62\\xdd\\xa2\\x1c\\x67\\x88\\xf7\\x84\\x91\\x79\\x17\\x98\\x2e\\x1c\\xcb\\xb5\\xfd\\xd9\\xbd\\xc1\\x76\\x9d\\xb6\\xb6\\xdb\\x57\\xca\\x35\\x4e\\x01\\xa1\\x33\\x9d\\x8e\\x77\\xe9\\xdb\\xbb\\x58\\x12\\xfb\\xab\\x6a\\x14\\xc5\\x40\\x85\\xc0\\x65\\x95\\x99\\xf1\\x50\\xe2\\x24\\x72\\x47\\x0f\\x1e\\x5e\\x67\\x2c\\x42\\x5f\\x37\\x5f\\x9e\\x0d\\x6e\\x8d\\x52\\xfa\\x17\\xb7\\xa8\\xd7\\xa4\\xd7\\xca\\x3e\\x12\\xf4\\xdb\\x53\\x83\\x6a\\xed\\x2b\\xeb\\xd7\\x45\\x89\\xba\\xca\\x8c\\xe9\\x10\\x02\\x91\\xbf\\xb7\\xe4\\x56\\xdb\\x7f\\x2f\\x0a\\x84\\xdc\\x0a\\x74\\x88\\x85\\x13\\x66\\xa9\\xa5\\xfe\\xa0\\xe3\\xef\\xc7\\x4b\\x9c\\xdd\\x4b\\xd9\\x7b\\x65\\xab\\xf3\\x61\\x39\\x3c\\xe1\\x70\\x3d\\x85\\x71\\x80\\x5e\\xe6\\x8a\\x13\\xd3\\x65\\x4f\\x03\\xdc\\xec\\xfb\\x77\\xa5\\x34\\x30\\xd0\\x94\\x96\\xad\\x73\\xec\\x01\\x75\\x99\\x57\\xe5\\x10\\x46\\xaa\\x73\\x96\\xf5\\x92\\x33\\x86\\x50\\x11\\x7a\\xc7\\xb4\\xdd\\x35\\x73\\xeb\\x53\\xd9\\xc9\\xf9\\xdf\\xa6\\x2e\\x23\\x69\\xc7\\x7a\\xf9\\xc0\\xd4\\x2f\\x61\\xba\\xe7\\x4b\\x28\\x7d\\xdf\\xa2\\x7b\\x7f\\x1c\\x1b\\xe9\\x88\\x3a\\x04\\x46\\x91\\xd5\\x6d\\xc1\\x37\\x34\\xad\\x4e\\xe3\\xa3\\x2a\\x9f\\x40\\xe3\\x28\\xc5\\x00\\xd0\\xfe\\xd8\\xea\\x05\\x10\\xe9\\x38\\xf2\\x75\\x80\\x04\\x02\\x2b\\xca\\xa6\\x90\\x2b\\xda\\x10\\x14\\xb8\\xae\\x33\\x65\\x27\\x28\\x29\\xed\\x94\\xfa\\xba\\x63\\xcb\\x14\\xa3\\x6c\\xf8\\x13\\x90\\xec\\xa8\\x3f\\xc1\\xc6\\x27\\x17\\x20\\x13\\x26\\x1b\\x39\\x93\\x77\\x9a\\xa0\\x76\\xa5\\xc5\\xd8\\x1d\\x90\\xd2\\x70\\x62\\xe1\\xa6\\xd9\\x0b\\x5c\\xf1\\x00\\x5c\\x70\\x19\\x17\\xb7\\xad\\xac\\x18\\x0c\\xb7\\x5b\\xbc\\xe0\\xf2\\x7f\\x2f\\x18\\x0e\\x2c\\xb9\\x01\\x40\\xc1\\x4c\\xc6\\x00\\x9d\\x2d\\x41\\xaa\\xb1\\xdb\\x94\\x18\\xf9\\x1d\\x4c\\xf3\\x94\\x00\\x2c\\xd7\\x0a\\xc9\\xdc\\x11\\xce\\x86\\x53\\x47\\xfa\\x3f\\x56\\xf8\\x7c\\x14\\x9e\\x2b\\x17\\xd2\\xc7\\x2b\\x66\\x3a\\x58\\xe3\\x18\\x7b\\xb1\\x9b\\x9b\\xac\\x2d\\x11\\x48\\x3b\\xa1\\x2f\\x77\\x0a\\xc0\\x4d\\xc4\\x6d\\x38\\x85\\x18\\xfa\\x54\\xdc\\x15\\x2e\\x9a\\x9d\\xfb\\xff\\x14\\xf1\\x4c\\x61\\xcb\\x37\\x58\\x97\\xe3\\x0c\\x53\\xe6\\xde\\x42\\xd5\\xe1\\x40\\x1d\\xae\\x1b\\x22\\xba\\xaa\\x0e\\x8a\\x41\\xc6\\xaf\\x9d\\x0e\\x0b\\x13\\xa9\\x1a\\x23\\xd9\\xb7\\xd5\\x55\\x20\\x47\\x02\\x9a\\x35\\x21\\x94\\x6c\\x71\\x20\\xd3\\xd2\\x58\\xb3\\xae\\xfc\\xf7\\x54\\xd1\\x95\\x94\\x87\\xa1\\xfe\\x77\\x43\\xac\\x7e\\x1c\\xc8\\x9e\\x36\\x8b\\x19\\x78\\x09\\xc3\\xa2\\x73\\x17\\xe0\\xec\\x48\\xd5\\x46\\xdb\\x1e\\x21\\xeb\\x62\\x9a\\x29\\xbc\\x62\\x47\\xcd\\xd4\\xa1\\x37\\x14\\x37\\x56\\x3e\\xdd\\x12\\xfa\\xea\\x2c\\x5c\\xb7\\x7e\\xed\\xed\\xbf\\xc5\\x80\\x08\\xfa\\xd1\\xf6\\x5a\\xf3\\x58\\x43\\xfa\\x27\\x4c\\x73\\x4e\\x3f\\xbb\\xaa\\x9c\\xc5\\x0d\\x68\\x37\\x48\\xb7\\x5a\\x48\\x5f\\x94\\xd6\\x30\\xb0\\x32\\xa5\\xf1\\x06\\x7d\\x1d\\xeb\\x30\\xe9\\xd2\\x21\\x8c\\x93\\x5c\\x98\\x1d\\x01\\xc0\\xc5\\x47\\xfd\\x68\\x41\\x31\\x36\\xed\\xf4\\xc0\\xc7\\x70\\x28\\x6e\\x82\\x34\\x42\\xe1\\xc5\\x13\\x65\\x19\\x29\\x21\\x3c\\x12\\x1c\\x1d\\xe7\\x00\\x98\\x91\\x41\\xab\\x4a\\xf3\\xb3\\xfe\\x74\\x04\\xb4\\xd2\\xa3\\x8c\\x53\\x0b\\xaf\\xb4\\x98\\xe6\\x49\\x53\\xce\\x1c\\x0f\\xb7\\xd3\\x40\\xe2\\x11\\x35\\xbf\\x8a\\xfd\\xd8\\xdd\\x65\\xb1\\xb1\\x8c\\xf1\\xc8\\xfb\\x9f\\x40\\x2b\\x26\\x70\\x40\\x0b\\x86\\xdd\\xaf\\xb1\\x84\\xcc\\x51\\xd5\\xfd\\xa2\\x73\\xb8\\x0c\\x26\\x52\\x1f\\x91\\x2f\\x35\\x83\\xb4\\xae\\x30\\x1d\\xae\\x15\\x1c\\xb5\\x5c\\x75\\x70\\x3a\\xad\\xef\\x03\\x24\\x15\\x22\\x7d\\x53\\xe3\\x95\\xdb\\x6c\\x15\\x0a\\x1e\\xe8\\x39\\xad\\x26\\xba\\xe5\\x52\\xe1\\xab\\x73\\x62\\x14\\xdc\\x04\\xb0\\xf3\\xc4\\x1b\\x7c\\xfb\\xd0\\x49\\x68\\x1b\\xc8\\x4c\\x3d\\x16\\x53\\x07\\x68\"},\n{{0xa8,0x04,0xc3,0x3b,0x4d,0x38,0xcb,0x3c,0xe3,0x1c,0xf3,0xba,0xc1,0x04,0x9e,0x0d,0x4e,0xc6,0x3a,0x1a,0x0b,0x7b,0x59,0xfd,0x8a,0x36,0xee,0x37,0x54,0x16,0x56,0xaa,},{0x60,0x72,0x25,0x6d,0x65,0x74,0xa2,0x93,0xbd,0x7c,0x22,0x1c,0x55,0x1c,0x32,0xcf,0x2f,0x77,0x15,0xe1,0x9e,0x43,0x3a,0x49,0xd9,0xb8,0xb0,0x49,0x0e,0x56,0xef,0x62,},{0xb1,0xb4,0x4a,0x14,0x2a,0x7c,0x4c,0x3d,0x0b,0xf4,0x66,0x1e,0xda,0xc5,0xb7,0x67,0x00,0x57,0x26,0xc1,0x4a,0x27,0x69,0xb7,0xc2,0x14,0xfb,0x58,0x73,0x7e,0xc2,0xe4,0xbc,0x51,0xc3,0xa1,0x95,0xd2,0xba,0x1b,0x74,0xa5,0x4e,0xff,0x4c,0x33,0xa9,0x0f,0x41,0xcc,0xde,0xfa,0x9e,0x93,0x65,0xfd,0xe8,0xdd,0x85,0x9f,0xd3,0x97,0x8c,0x0a,},\"\\xdb\\xfe\\x30\\x7f\\x2a\\xae\\x9e\\x07\\xec\\x7c\\x4b\\x68\\x21\\x06\\xd2\\xc9\\x36\\x7b\\x0c\\x4a\\xaa\\x58\\xae\\x80\\x4e\\x0a\\x39\\x04\\x75\\x4e\\x6c\\xf8\\xfe\\xe7\\x3c\\xf9\\xe2\\xd4\\x5d\\x02\\x89\\xe5\\x07\\x82\\x93\\xdf\\xc4\\x69\\xd4\\x6e\\xa6\\x70\\x26\\xc5\\xaa\\x69\\x2d\\x2f\\x2c\\x9f\\xb4\\xec\\x57\\xcd\\xab\\x4c\\x04\\x3f\\xf9\\xae\\x61\\x85\\xf2\\x7a\\x70\\x44\\x54\\xe5\\xf5\\x39\\x50\\xaa\\xbd\\x25\\xc9\\x91\\x04\\x74\\xd4\\x5a\\xf8\\x83\\x68\\x62\\x72\\x3e\\x0e\\x6a\\x27\\x82\\x3d\\x82\\xbc\\xbb\\x68\\xa9\\x60\\x52\\x42\\x2a\\x18\\x19\\x51\\x2e\\x3b\\x43\\x40\\x8c\\xf4\\x89\\x57\\xad\\x6a\\xe2\\x35\\xb7\\x23\\x3d\\xf1\\x82\\x84\\x74\\x91\\x53\\xdf\\xa5\\x7d\\xe3\\x50\\x74\\xa3\\x0e\\xdf\\xab\\x8a\\x56\\xdf\\x28\\xab\\x2e\\x29\\x40\\x30\\x6c\\x22\\x1a\\xa5\\x54\\x90\\xcc\\x66\\x4e\\x14\\x68\\x3f\\x30\\xee\\x61\\x5e\\x2d\\x93\\xfd\\xf9\\x71\\xf5\\x96\\x66\\x34\\x65\\x84\\x3b\\x3a\\xdd\\x63\\x92\\xba\\x33\\x90\\x31\\x1e\\xf8\\xdc\\x59\\xf2\\x51\\x44\\x5d\\x66\\x9e\\x10\\xa0\\x06\\x19\\x91\\xe1\\x13\\x56\\x19\\x23\\xaa\\x21\\x52\\x44\\x46\\x3d\\x82\\x64\\x19\\x9a\\xc5\\x88\\x92\\x4e\\x23\\x1e\\x84\\x19\\xd8\\x68\\x5f\\x33\\x8e\\x59\\x9b\\x5f\\x40\\xbf\\x9b\\xd1\\xae\\xce\\x77\\x25\\x35\\xbb\\xbc\\xb8\\xf6\\x88\\x1c\\x2e\\x80\\x04\\x91\\xab\\x3b\\x57\\xb4\\x4b\\x8a\\xe4\\x3a\\xeb\\x5c\\x4a\\xe5\\xe7\\xed\\xeb\\x22\\x8f\\xed\\xc9\\xf6\\xb9\\xca\\xde\\xa1\\x76\\xe1\\x34\\x93\\x6d\\xed\\x60\\xaf\\x1c\\x22\\x87\\x34\\xfb\\x00\\x57\\x0f\\x23\\x74\\xbb\\xbf\\xa1\\xbb\\x17\\x07\\x85\\x80\\x5d\\x6b\\x6c\\x70\\x1e\\x82\\x09\\x52\\xea\\xe4\\x5b\\x8c\\x23\\x66\\x11\\x3a\\x1d\\xfb\\x2e\\x35\\x85\\x2a\\xf4\\x19\\xb7\\x54\\xf9\\xcf\\x7a\\x08\\x1c\\x3d\\xde\\x6c\\x80\\x53\\xbf\\x1c\\xe0\\xc8\\x53\\x39\\xd5\\x69\\x9c\\x42\\x24\\x76\\xfc\\x21\\xf2\\x6c\\xe7\\x5d\\x2a\\x7f\\xed\\x09\\xfc\\x0f\\x41\\x75\\x78\\x98\\x47\\xd8\\x76\\xc5\\x1a\\xa4\\xe0\\xbf\\x7c\\xe8\\x42\\xb8\\x30\\x8d\\xc7\\xa2\\x8c\\x82\\x39\\x52\\x07\\x14\\xdc\\x23\\x31\\x36\\xe0\\x9f\\x55\\x7c\\x7e\\xf3\\xe0\\xf8\\x3b\\xad\\x63\\xcb\\x28\\xac\\x61\\x6d\\x39\\x28\\xf3\\x83\\x7d\\xce\\x1d\\xd5\\x8a\\xcb\\x8d\\xdb\\xc7\\x2e\\x82\\x2d\\xee\\xe4\\x5f\\x00\\x77\\x6a\\xcc\\x88\\xe0\\x0c\\xd3\\xa9\\xdb\\x48\\x6d\\x92\\xd5\\x35\\xa5\\x7a\\x0f\\xdc\\x4f\\x90\\x3b\\x62\\xe5\\x17\\x22\\x1c\\x30\\x8c\\xba\\x2e\\x30\\xff\\xe7\\xb9\\x19\\x37\\xa9\\x94\\x17\\x72\\x1f\\x56\\xfe\\x6d\\xf4\\x48\\x40\\xe9\\xe4\\x11\\x36\\x92\\x9c\\x0c\\xa3\\xdc\\x28\\xdd\\xf2\\x37\\x9e\\x4d\\xcf\\xde\\x83\\x72\\x3e\\x2d\\x4c\\x9e\\x23\\x29\\x9c\\x05\\x6a\\xfb\\x31\\xd3\\xe7\\x0d\\x08\\x5d\\x0a\\x31\\x2c\\x5c\\xd5\\x70\\xb6\\x99\\xde\\xa8\\x71\\x74\\x58\\x53\\x13\\x48\\xc9\\x6f\\x6e\\xb5\\x2d\\x7e\\xe6\\x1d\\x56\\x60\\xf6\\x5e\\x90\\x9a\\x14\\xce\\x10\\x33\\xdc\\x85\\x3f\\x2f\\x25\\xd0\\x9c\\xf4\\xe4\\x0d\\x07\\xef\\xf7\\x2e\\x15\\xa3\\x90\\x56\\x4a\\x2b\\xe3\\xc0\\x42\\xd8\\x9a\\x68\\x66\\x0a\\x97\\xff\\xac\\xec\\x49\\x67\\xa4\\xb6\\x18\\x71\\x2d\\x70\\x60\\x75\\x65\\x20\\xc2\\x9e\\xe8\\xd9\\x22\\x0a\\xd8\\x61\\x5c\\x4f\\xcf\\x39\\x69\\xbd\\x3b\\x2e\\x09\\x47\\xe1\\xf0\\xbe\\x7e\\x2d\\x80\\xe0\\xa6\\x14\\x80\\xc3\\x16\\x6d\\xb5\\x58\\x22\\x18\\xbb\\x0a\\x8b\\xe9\\x84\\x8e\\xfd\\x41\\xb6\\xce\\x0c\\xd7\\x95\\xc4\\x86\\xab\\xb6\\x72\\x10\\xbe\\xb6\\x0c\\xd0\\x78\\xb4\\x6a\\xeb\\x7f\\x4f\\x48\\x50\\x31\\x90\\x2b\\xcd\\x71\\x31\\xe0\\x0b\\x70\\x35\\xaa\\x2d\\x43\\xfe\\xe0\\x63\\xf7\\xf3\\x0b\\xd5\\x70\\xda\\x1d\\xbb\\x65\\xc0\\xca\\x92\\xa4\\x81\\x26\\x32\\xe4\\x32\\x77\\x85\\x53\\xe3\\x5e\\x85\\x6c\\xaa\\x82\\x18\\x22\\x1f\\xd6\\x31\\x6a\\xb0\\x86\\x91\\x73\\xb3\\x84\\x09\\xbc\\xef\\xe6\\xd2\\xdb\\x92\\x10\\xf9\\x02\\x41\\x73\\xb6\\x6d\\xbb\\x92\\x67\\x7c\\xbc\\x71\\xc8\\xa1\\xcd\\x58\\x3f\\xa6\\xf3\\x54\\xd3\\xc9\\x3f\\xa8\\xb1\\x6c\\x71\\x37\\x4f\\x25\\xa0\\x0c\\x33\\x2f\\x85\\xa8\\xbe\\xfd\\x54\\x03\\x88\\xfb\\x50\\xdb\\x9f\\x5d\\x96\\xe4\\xe4\\xe6\\x98\\x83\\x3c\\xe3\\xd6\\x3c\\x10\\xb8\\xee\\xc7\\x0a\\x24\\x3b\\x90\\x15\\xdb\\x45\\x94\\x31\\xb6\\x2f\\x56\\x68\\xbb\\xa6\\x0f\\x07\\x04\\xf6\\xbd\\xfe\\x95\\x46\\xea\\x47\\x5c\\xef\\x2e\\xbc\\xcb\\xa4\\xb7\\x68\\x08\\x48\\xe8\\x2b\\xef\\xf5\\x85\\x4e\\x49\\xf6\\x5b\\xb7\\x73\\xa4\\x92\\x2e\\x90\\xf9\\xb8\\xaf\\xc7\\xcf\\x81\\x87\\x30\\x58\\x8e\\xd5\\xaa\\x7b\\x39\\x98\\x26\\xaa\\xdd\\x54\\x37\\x2f\\xcb\\x76\\x14\\x58\\xb6\\x4d\\xe6\\x68\\x57\\xf4\\xad\\xac\\xd4\\xc3\\x29\\x00\\xcb\\x77\\x13\\x6a\\x53\\x5d\\x7b\\xbb\\xb5\\x54\\x59\\x7a\\xec\\xf3\\x9f\\xf6\\x98\\xb4\\x5e\\x6a\\x21\\x8d\\xf1\\xd2\\xab\\xe6\\x15\\xeb\\x8d\\x9e\\x18\\x24\\xc0\\xbe\\xcc\\xe9\\x07\\x67\\x89\\x9e\\xbf\\xd2\\xc7\\x30\\x14\\x4b\\x32\\xc7\\x46\\x04\\xc0\\xe5\\x3e\\x25\\x05\\xbb\\x15\\xd2\\x80\\x07\\xa8\\x7b\\x99\\x31\\xd6\\xee\\xc0\\xa6\\xcb\\x5b\\x0f\\x96\\xd3\\x19\\x4b\\x24\\x23\"},\n{{0xf8,0x20,0xe6,0xf2,0x4a,0x84,0x18,0xb6,0xac,0xda,0x16,0x5f,0x29,0xa3,0x60,0xf7,0x67,0xcd,0xed,0xde,0x8f,0x64,0xd7,0x68,0xb9,0x5f,0xc2,0xa5,0xf3,0xf4,0x04,0xe7,},{0x79,0xc4,0xb2,0x63,0xb2,0xe5,0x8f,0x67,0x86,0x28,0xd4,0xea,0x82,0xb1,0x75,0xac,0xa2,0x30,0xb9,0xa2,0x02,0x85,0xc8,0x28,0xf9,0x4e,0x1f,0xfd,0x63,0xd7,0x5b,0x23,},{0xf9,0xfd,0x72,0xf3,0x21,0xca,0x21,0x33,0xbf,0x85,0x85,0x90,0x8d,0x9c,0xa7,0xb8,0xe3,0x36,0x22,0x7e,0x3f,0xfb,0x37,0x49,0xa1,0xfb,0xe8,0xc9,0xb1,0xe5,0xd5,0x0e,0xf0,0x1f,0x9d,0xb5,0xf0,0xd2,0xa7,0xc7,0xc1,0x39,0x9b,0x97,0xc9,0x04,0x4e,0x1b,0xc1,0xad,0xc3,0x2b,0x8b,0xea,0x46,0xda,0xd7,0xb8,0x10,0x26,0x46,0x96,0x03,0x03,},\"\\xab\\x6b\\xd4\\x5b\\xb0\\x6d\\xfb\\x90\\x69\\x11\\x8f\\xf9\\x98\\xf3\\xbd\\x39\\x3e\\xa8\\xe9\\x44\\x97\\x9e\\x89\\xe0\\x49\\xf2\\x50\\x5c\\xd8\\x93\\x1b\\x93\\x08\\x6b\\x7e\\x9d\\x8e\\xe7\\x64\\xe9\\xb4\\x47\\xea\\x4e\\xa1\\x21\\x38\\xbb\\x45\\x27\\x5a\\x21\\xa1\\x98\\x43\\xf7\\x5d\\xc5\\x42\\x1d\\x61\\xff\\xd8\\x61\\x83\\x8e\\x58\\x33\\x82\\x5d\\x67\\x16\\x2f\\x32\\x59\\xc2\\x64\\x47\\xbe\\x51\\xdc\\x18\\x02\\xef\\x5a\\x04\\xba\\x73\\xb7\\x83\\x93\\x57\\x06\\xab\\xb4\\x2c\\x51\\x3b\\x65\\xf2\\xbb\\xc4\\x4f\\x83\\xda\\x10\\x61\\x24\\x2f\\x2d\\x5e\\x51\\x98\\xf3\\x8c\\x10\\x71\\x7a\\x86\\xa3\\xa1\\x97\\xe7\\xcd\\x90\\x34\\xf6\\x36\\x11\\x44\\x99\\x03\\x72\\x77\\xac\\xb4\\x72\\x2c\\x06\\xa9\\x1c\\xb2\\xf6\\x5e\\x21\\xeb\\x8d\\x22\\xd3\\x6a\\xd7\\x3b\\x42\\x65\\xf7\\xa7\\x94\\x7e\\x00\\xe7\\x22\\xbd\\xa6\\x70\\x43\\xcd\\x12\\x81\\xbc\\xd8\\x7e\\x76\\x3f\\xc9\\x7b\\x54\\xc8\\xf8\\x68\\x36\\xcd\\xbf\\x08\\xc9\\xa1\\xf7\\x00\\xf4\\xea\\xed\\x9e\\xa5\\x9a\\x6f\\xc1\\xbc\\x0d\\xf8\\xc9\\xec\\x1f\\xc2\\x97\\x7c\\xad\\x60\\xf9\\x78\\xab\\xc0\\xc8\\x38\\x1a\\xa9\\xfb\\x06\\x0e\\x3f\\x99\\x37\\x8a\\x51\\xb2\\xd9\\xaf\\xbe\\xf3\\x58\\xd5\\x51\\x62\\xa3\\x89\\x22\\xeb\\xb8\\x7d\\x2a\\x3e\\x0f\\x0f\\x40\\x00\\xb1\\xc3\\x9b\\x15\\x02\\xe9\\x59\\x45\\xe8\\xac\\x9f\\x4a\\x3e\\xa7\\xc9\\xdd\\xb5\\x81\\xa5\\xec\\x06\\xc0\\x0b\\xa8\\x7a\\x73\\x70\\x84\\xb3\\x84\\xfa\\xba\\x09\\xc8\\x48\\x71\\xdd\\xd6\\x7d\\xc1\\xbe\\xbb\\x2f\\x7f\\xbd\\x94\\xa5\\x59\\x7d\\x01\\x9f\\xe6\\x29\\xe5\\xbf\\x12\\xbe\\xa2\\xe3\\x3c\\xa8\\x4c\\x68\\x0d\\xc5\\xa3\\x98\\x9b\\xbf\\x3a\\xf9\\xee\\xec\\xe8\\xab\\x8f\\xc8\\x61\\xe3\\xb8\\xbf\\xc1\\xe6\\x7e\\x2a\\xee\\x32\\x6b\\x37\\xfb\\x9b\\x51\\xcf\\xa0\\xb5\\xf5\\xfc\\x16\\x00\\x69\\xb4\\x50\\xb7\\x04\\xe0\\xfa\\xb7\\xfb\\x6c\\x5a\\xb3\\xc4\\x0b\\x8f\\x0b\\x3d\\x09\\x30\\xb9\\x11\\x2d\\x64\\xb9\\xda\\xca\\xb4\\xdd\\x87\\x5f\\x29\\xd8\\xc5\\x8c\\x5d\\x20\\x53\\xad\\x91\\x48\\xff\\xde\\x22\\xd9\\x0b\\xc0\\xd5\\x0f\\x5d\\xec\\xa6\\x8d\\x3e\\xa2\\x5c\\x5b\\x4c\\x76\\x88\\x87\\x1c\\x0c\\x77\\xdb\\xce\\xea\\xcb\\xd0\\xa4\\x22\\x9f\\x49\\x70\\xec\\x87\\xb3\\x44\\x99\\xe2\\x78\\x30\\x3c\\x06\\x69\\x4c\\x30\\xac\\x68\\x52\\x4d\\x11\\xb1\\x72\\x79\\x4b\\x48\\x12\\x73\\xa5\\xda\\xc4\\x61\\x22\\xd2\\x47\\x20\\x95\\xa5\\x63\\xa4\\x35\\xd1\\x85\\xd5\\xe9\\x1d\\xa7\\x26\\xe7\\x45\\x92\\x99\\x9c\\xda\\xc6\\x88\\xa3\\x3f\\x38\\xf7\\xc0\\x35\\x58\\x8f\\x62\\x5d\\xc6\\xac\\x73\\xd0\\x04\\x7a\\xb3\\xd6\\xd1\\x2f\\x1a\\xe3\\x3d\\x8b\\x62\\xd6\\xd6\\xc6\\xca\\xcf\\xf0\\xbd\\xd8\\x94\\xb5\\x7e\\x31\\x89\\x12\\xac\\x0c\\xf4\\xa5\\x34\\x76\\x2b\\x2f\\x6d\\x26\\x3c\\x93\\x58\\x04\\x42\\x3e\\xd8\\x68\\xcf\\x8c\\xfb\\xb8\\xbe\\x8f\\x6d\\x8a\\x71\\x4a\\x26\\x8a\\x39\\x0e\\xdc\\x2d\\xd5\\x09\\xd2\\xdc\\x96\\x85\\x1d\\x1b\\xd4\\x32\\x49\\xbd\\x0f\\x69\\xb0\\xc4\\xcb\\x2f\\xf4\\x08\\x0d\\x1f\\xd5\\x62\\x2b\\xc2\\x38\\xdd\\xa6\\xe9\\x30\\x02\\x5d\\x8a\\x2b\\x12\\xb9\\x72\\xf9\\xeb\\xa1\\x74\\x21\\xd4\\xce\\xa6\\x42\\xf4\\x0a\\xd9\\xea\\x85\\x47\\xae\\x59\\x49\\x8c\\x3a\\xd1\\xb9\\xa0\\xc3\\x4e\\xd8\\xc0\\x1a\\xae\\x3b\\xd2\\x1a\\xc1\\x77\\x43\\xb5\\x77\\xf9\\x51\\x5c\\xfb\\xdd\\xe2\\x70\\x4d\\xc5\\x7e\\x80\\xf1\\x25\\x32\\x3d\\x55\\x10\\x0b\\x9f\\x69\\x79\\x27\\xd4\\x31\\xdf\\xe7\\x36\\x31\\xb5\\x8e\\x52\\xaa\\x6a\\xeb\\x04\\x78\\xbf\\x45\\x95\\x52\\x43\\x86\\x89\\xfb\\xeb\\x9c\\x60\\xd8\\x7a\\xae\\x09\\x95\\x43\\x62\\xcd\\x02\\xa2\\xb0\\xb4\\x79\\xef\\xd3\\x8f\\x17\\x82\\x1a\\xf3\\x9b\\x21\\x92\\x6e\\xe0\\x2f\\x7d\\x97\\x2a\\xd0\\xf5\\x4e\\xa6\\x57\\x2c\\xc3\\xeb\\xd0\\x20\\xb1\\xee\\x26\\x88\\x25\\x33\\xbd\\x19\\x11\\x43\\x23\\x81\\x5f\\x67\\x2e\\xc8\\xc9\\x05\\x68\\x73\\x0a\\x58\\xe4\\xe1\\xe3\\x5f\\x68\\x21\\x21\\x9a\\x32\\xb8\\xa6\\xc5\\x2c\\xed\\x6f\\x95\\x73\\xd9\\xf3\\xbe\\xb2\\x85\\x13\\xba\\x62\\xfb\\x20\\x1f\\x7f\\xd4\\x1b\\xb1\\x0c\\xa3\\x4b\\xb1\\xc7\\x0f\\x2f\\xd7\\xbb\\x92\\x99\\xa7\\xc5\\xf7\\xf2\\xe0\\xfa\\x1d\\x1a\\xf0\\xe9\\xae\\xf5\\xed\\xe7\\xc1\\x69\\x50\\xe8\\x60\\xec\\xd6\\x1f\\x18\\x42\\xa1\\xa2\\x2c\\x98\\x31\\xc0\\xc0\\xd4\\xed\\xa8\\x40\\xb0\\x88\\xa5\\x45\\x20\\xc9\\xb1\\x8c\\x76\\xeb\\xa9\\xbe\\xbc\\xd5\\x91\\x38\\x1c\\x18\\x0d\\x7f\\x86\\xa0\\xe5\\x8a\\xdd\\x92\\xb9\\xb0\\xc8\\x07\\x6a\\x7c\\xdc\\xab\\x60\\xde\\xa4\\xc1\\xaf\\xb1\\x8c\\x8b\\x94\\xb1\\xb3\\x92\\xcc\\xfb\\x4d\\xae\\x27\\x11\\xe7\\xd1\\x2d\\x2b\\xc7\\xc7\\x82\\x5f\\x63\\x99\\x2e\\xc3\\x24\\x71\\x63\\xc2\\x83\\xb1\\x07\\x5e\\x32\\x24\\x5f\\x69\\xcf\\x47\\x24\\x0a\\xef\\x0d\\xb4\\x3e\\xfa\\xe8\\x6f\\xc1\\xfd\\x3b\\xb9\\x9c\\xf5\\xb7\\x89\\xf5\\xbc\\xba\\x95\\x04\\x65\\x7d\\x9e\\x62\\x2a\\x4a\\xa1\\x6f\\x01\\xd4\\xd8\\x44\\x41\\x31\\x24\\x44\\x7d\\x6d\\x1a\\x44\\x23\\xe7\\xb5\\x5d\\xb7\\xe6\\xa3\\x1a\\x31\\x9f\\x4b\\xac\\xae\\x43\\x0a\\x33\\xa9\\xbd\\xd4\\xef\\x36\\x80\"},\n{{0x0a,0x05,0x6b,0xe0,0x39,0xfd,0x55,0xda,0xda,0x44,0x1d,0x03,0x73,0x61,0x27,0x3f,0x20,0x6e,0x00,0x0a,0x74,0xa0,0x5c,0x51,0xc0,0xcb,0xb6,0x27,0x43,0xf1,0xf3,0x40,},{0x73,0x14,0x02,0x17,0xa4,0x93,0xa1,0x78,0x66,0xff,0xf5,0x15,0x48,0x32,0x27,0x3d,0xf7,0x9d,0x58,0x11,0x54,0x3c,0x22,0x2a,0x39,0xd0,0x56,0xb8,0xc9,0x70,0xdb,0xfa,},{0xfa,0xb8,0xe5,0xd9,0x3d,0x7d,0x46,0xc6,0x5e,0xe1,0x17,0xc5,0x37,0x5e,0x73,0xc9,0x70,0x5f,0x87,0x54,0x17,0x7f,0xdd,0x46,0xef,0xed,0x47,0x37,0xc2,0x87,0x68,0xcc,0x4b,0x95,0xa9,0xc8,0x4c,0x52,0x9b,0x4b,0x91,0x6b,0x28,0xda,0xbd,0x87,0x41,0x18,0x31,0x44,0xbc,0xdb,0x48,0x3d,0xf9,0x8a,0xf8,0x9d,0x82,0x40,0xcf,0x09,0x46,0x04,},\"\\xa5\\xab\\x14\\x76\\x84\\xe4\\xd4\\xa7\\xbc\\xb5\\xa9\\x6f\\xb3\\x98\\x18\\xe2\\x3f\\x56\\xc2\\xd8\\xa7\\x44\\xe9\\x12\\x3d\\x62\\x08\\x39\\x30\\xab\\x1d\\x0b\\xb5\\x32\\xe6\\x87\\x14\\xfc\\xec\\x7e\\x6c\\x41\\x13\\x4b\\x6b\\x19\\xdd\\xd8\\x67\\xfe\\x63\\x5c\\x9e\\xd6\\x53\\x93\\xee\\x39\\xc5\\xe8\\xfa\\xb4\\x56\\xcb\\x5b\\x32\\x79\\x78\\x83\\xf3\\xcd\\x9a\\x09\\x02\\xb9\\x79\\x63\\x48\\xee\\x66\\xc6\\x91\\xfb\\x4f\\x2b\\xb1\\x47\\x64\\x41\\x06\\x57\\xc7\\x4a\\xb3\\x64\\x56\\x78\\x79\\xb6\\xfa\\x0a\\x6f\\x4d\\xaf\\xd9\\x30\\xd9\\x23\\x4c\\xd7\\x83\\x4f\\xb9\\xd0\\xee\\xdf\\xbb\\x5a\\x39\\x4b\\xf0\\x84\\x6e\\xc6\\x96\\x9c\\x2e\\xf7\\xce\\x39\\xe3\\x85\\x38\\x95\\xff\\x5b\\x4d\\xa3\\x1e\\x54\\x34\\x1b\\x42\\x72\\xe4\\xa2\\x60\\x49\\x18\\x9f\\xf2\\x82\\x41\\xce\\xef\\xfb\\x7d\\x2e\\x1f\\xaf\\x4f\\x77\\x9f\\xa6\\x5c\\xac\\x0f\\x57\\x83\\xc6\\x0a\\xe7\\x7d\\xe3\\x0a\\xd4\\x46\\x5f\\xdb\\x39\\x0d\\x42\\x57\\x1e\\xff\\x4a\\x63\\x13\\x63\\x49\\x93\\x7d\\x6c\\xae\\xef\\xcd\\xae\\x22\\x9e\\x2f\\x28\\xce\\xa8\\xab\\xf3\\xff\\xae\\x3c\\x3e\\xcc\\xd9\\x06\\x70\\xa4\\x21\\x2a\\x2b\\xee\\x1c\\xa6\\xa5\\xb5\\x4f\\x09\\x4f\\xc3\\x23\\x10\\x58\\xf5\\xcb\\x9e\\xce\\xb9\\x99\\x3b\\xe4\\x70\\x27\\xd5\\x1c\\x18\\xde\\xca\\x41\\xcd\\xda\\xf4\\xe8\\xbc\\x56\\xa9\\x9f\\xd2\\x70\\x35\\x5f\\xf4\\x59\\x71\\x95\\x0e\\x34\\x37\\xa1\\x98\\xcc\\xc3\\x25\\x41\\x68\\xdf\\xc1\\x57\\x40\\x80\\x80\\x2e\\xe1\\x01\\xa6\\x17\\xfb\\x60\\x4e\\x86\\x8f\\x8f\\xa8\\xfb\\x30\\xda\\xeb\\x43\\x07\\x4d\\xe1\\x1f\\x24\\x83\\xd9\\x16\\xde\\x56\\x43\\xb7\\xca\\xc2\\x3d\\x93\\x40\\x50\\x8a\\x3f\\xd6\\x21\\xec\\xd2\\x50\\x04\\x35\\x6a\\x53\\x55\\x4a\\xd3\\xad\\x7d\\x5d\\x25\\x81\\x7a\\xd7\\xc9\\xa6\\x10\\x00\\x8c\\x67\\xac\\x16\\xba\\x42\\x11\\xc4\\x2f\\x5d\\xad\\xf8\\x6c\\x2c\\x3a\\xed\\x82\\x5c\\xf2\\xa9\\xb5\\x23\\xbf\\xc0\\x3d\\xd7\\xde\\x40\\x0c\\x67\\x80\\x7e\\x13\\x9e\\xa5\\xdb\\xce\\x4e\\xe1\\xf7\\xd3\\x18\\x88\\x9b\\x01\\xa9\\xf4\\x48\\x03\\xc3\\x22\\xac\\x3b\\x61\\xe2\\x0e\\x63\\x12\\xd0\\xa0\\x3b\\xf9\\x92\\x7f\\xa3\\x3f\\x04\\xed\\x7e\\x20\\x7b\\x16\\xf2\\x65\\x02\\xc2\\x98\\x3a\\x3a\\x96\\x1f\\x22\\x44\\x61\\xfe\\x9b\\x64\\x92\\x3b\\x1d\\x09\\x18\\x94\\x76\\xae\\x8d\\x00\\x1d\\x0e\\xca\\xae\\x4d\\xf6\\x0d\\xb3\\x5f\\x44\\x8b\\xb6\\x12\\xf9\\x65\\x5a\\x5f\\xb1\\x44\\xdf\\x11\\xd8\\x3a\\xa6\\x93\\x68\\x86\\xc3\\x04\\x94\\x9e\\x59\\xaa\\x46\\xdf\\x65\\xc2\\x2c\\xe7\\xbf\\x28\\x9b\\x3c\\x77\\xc2\\x5d\\x89\\x6b\\xe6\\xd5\\x1d\\xee\\x10\\x74\\x82\\x61\\x68\\x8c\\x8b\\x07\\x1c\\x85\\x6f\\x99\\x62\\xc6\\x67\\x75\\xdd\\xf1\\x60\\x83\\xda\\xe0\\x65\\x87\\xe3\\x2a\\x63\\x61\\x19\\x9d\\x72\\x09\\x7e\\x38\\x3a\\xd7\\x43\\x94\\x91\\xb5\\xa5\\x63\\xa3\\xe6\\xd5\\x8d\\xa3\\xd5\\xab\\xb1\\xde\\x84\\x89\\x0a\\x36\\xb4\\x21\\xce\\x03\\xd4\\x84\\xdf\\xd6\\x00\\x39\\x63\\x8d\\x46\\xed\\xfb\\x60\\x65\\x9e\\x3a\\x25\\xac\\x6e\\x9a\\x93\\x5a\\xd6\\xda\\xd5\\x0f\\x92\\x7b\\xcc\\x2f\\xf9\\x9f\\x99\\x24\\xa5\\xb7\\x99\\x5d\\xc2\\x3c\\x8f\\x30\\x1c\\xcc\\x77\\x69\\xf7\\x1c\\x18\\x26\\x09\\x04\\xa3\\xdc\\xfb\\x81\\x7d\\x2d\\x80\\x5c\\xb1\\xf1\\x96\\xbe\\x8b\\x6e\\xcf\\x35\\x2b\\xc2\\x96\\xbc\\x3f\\x76\\xea\\x91\\x35\\x3f\\x8c\\xf3\\x5b\\xcd\\x2b\\x57\\xeb\\x59\\x42\\x77\\x3d\\x68\\x34\\xac\\x50\\xee\\xad\\xc7\\xe6\\x64\\x61\\xd1\\xda\\x09\\x8c\\xce\\xc7\\x5f\\xf7\\x20\\x52\\x15\\xf5\\x24\\x59\\xd9\\x76\\x20\\xf9\\xf0\\x28\\x9e\\x93\\x91\\x1d\\xb3\\x9b\\x21\\xdf\\x81\\x8f\\xdf\\x0b\\xed\\x45\\x50\\x92\\x44\\x63\\x3d\\xf0\\x1c\\xdd\\xdb\\x4b\\x75\\x97\\x2f\\xa7\\xea\\x6f\\x73\\x28\\x1c\\xbd\\xbb\\xd1\\xbc\\xb0\\x0c\\x3b\\xc1\\xb1\\x72\\x8e\\xea\\xe0\\xbb\\xa1\\x72\\xb1\\x31\\xf5\\xd3\\x08\\x90\\xa3\\x41\\xe6\\xb7\\x2f\\x7e\\x89\\xdd\\x4b\\x6d\\xb3\\xe7\\x9b\\x69\\x27\\x58\\x6c\\xf2\\xc8\\xac\\x38\\xdd\\x14\\xf3\\x74\\xd7\\xf5\\xbb\\xa9\\xf4\\x35\\x3d\\xef\\x10\\xdd\\xc9\\x4d\\x3d\\x11\\x18\\xc5\\x69\\x9e\\x38\\xb6\\xb5\\x04\\x91\\x8e\\x58\\x9e\\xfe\\x3f\\x7e\\x97\\x3f\\xb4\\x0e\\x2e\\xbd\\x05\\x7d\\xe1\\x38\\x5e\\x39\\xd6\\x99\\xa8\\xf6\\x83\\xb9\\x62\\xfa\\xe4\\xf3\\x90\\x28\\x81\\xf1\\xaf\\xbe\\xd7\\xc7\\x83\\x82\\x35\\x58\\xc3\\x6d\\x68\\xc6\\x87\\x5d\\x16\\x6f\\xa2\\x43\\xeb\\x2a\\xe1\\x4f\\x7e\\x63\\x15\\xa6\\xd2\\xab\\x4e\\x79\\xea\\x8e\\x16\\xe6\\x9d\\x30\\xed\\xc7\\x08\\xf1\\xe7\\xaf\\x7a\\xda\\xfe\\xdc\\xd3\\x16\\x88\\x98\\xb3\\x31\\x87\\x81\\x78\\xc4\\xba\\x88\\x33\\xd2\\x0b\\x3c\\xac\\x9d\\x32\\xb8\\x88\\x8c\\xc6\\x78\\x32\\x06\\x39\\x74\\x70\\xa2\\xe7\\xcc\\x4c\\x98\\x09\\xff\\x79\\xce\\xac\\x9d\\xc2\\x4c\\xa1\\x43\\x8c\\x91\\x9c\\x8a\\x41\\x5e\\x82\\xf0\\x90\\x2b\\x4d\\x9c\\xf4\\xcc\\xd5\\x76\\x96\\x8d\\x5b\\xee\\x81\\xc5\\xf1\\x9c\\x7d\\x57\\xb9\\xba\\xda\\x8e\\xab\\x47\\x56\\xea\\x27\\x0d\\xd2\\x61\\x29\\xe6\\x12\\x2e\\xe2\\xd6\\x15\\x24\\x2b\\xc7\\xfa\\xbf\\xf4\\xf8\\x31\\x2e\\x68\\x6c\\x8f\"},\n{{0x22,0x05,0x24,0x86,0x0c,0xb8,0x9a,0xb2,0x95,0xbd,0x88,0x4f,0x98,0x8a,0x57,0x91,0x18,0x68,0x69,0x3d,0x6b,0x10,0x5a,0x80,0xb2,0x30,0xf2,0x1e,0x57,0x80,0x5a,0x7d,},{0x4a,0xb3,0x2b,0xc1,0x56,0x6a,0x76,0x77,0xe7,0x99,0x73,0x4d,0xc8,0x41,0x81,0xfb,0xb6,0x54,0xb8,0x13,0x37,0x91,0x80,0xf1,0xdd,0x35,0xae,0xf2,0xd3,0x24,0xc1,0x2c,},{0xdb,0x1c,0xc0,0xc5,0xdb,0x77,0x3e,0xc5,0x16,0x89,0xbe,0x28,0x84,0x2f,0xa6,0x79,0x1a,0x7d,0x75,0xe2,0x9c,0x22,0x8a,0xe9,0x59,0x3a,0x58,0x0e,0x08,0x75,0xb1,0x67,0x0f,0x09,0xb0,0x34,0x42,0x92,0x9a,0x18,0xf1,0xe9,0x41,0x4e,0xa3,0x43,0x15,0xff,0x09,0xd9,0x1d,0x92,0x2e,0xe4,0x7f,0x10,0xf7,0x1d,0xa4,0xab,0x13,0xb7,0xd9,0x01,},\"\\x02\\x4a\\x54\\xac\\x5e\\x01\\x63\\xb3\\xa4\\xfd\\xd0\\x2f\\x59\\x36\\x88\\x8a\\xe2\\xf9\\xb7\\x4a\\x64\\x14\\xb5\\x3c\\x63\\x81\\x17\\x3b\\x09\\x5a\\x4d\\xda\\xcf\\xc3\\xa6\\x9f\\x19\\x16\\x7d\\x0f\\x1a\\xe0\\xc1\\x20\\xbb\\xa7\\xe9\\xfc\\xb7\\xcc\\xfc\\x79\\x6d\\x89\\xea\\x46\\xef\\x80\\x58\\x86\\x6e\\xf6\\xda\\x7d\\x01\\xa6\\xa1\\x42\\xea\\x69\\xd7\\x20\\xc4\\xf8\\x05\\xac\\x54\\x05\\xa8\\x01\\x2c\\x3c\\x2a\\x82\\x63\\xb5\\x37\\x2d\\x59\\xbf\\x7f\\x40\\x99\\x29\\x90\\x13\\xd2\\x62\\x59\\xdf\\xd5\\x19\\x3e\\xce\\x56\\x17\\x97\\x77\\xbe\\x51\\xb8\\x6b\\xd1\\xce\\x5f\\x1f\\xc9\\x15\\x6f\\x2b\\x3a\\x32\\xc0\\x9d\\x86\\xbc\\x61\\x32\\xde\\x57\\x61\\x02\\xe2\\xf0\\x3c\\x71\\x6d\\xb5\\x36\\x6c\\xcb\\xe7\\x42\\xae\\xe3\\x55\\x2a\\xc3\\xb3\\x9d\\x0e\\xc7\\xd4\\xe4\\xe9\\x62\\x6b\\xf8\\xec\\xe0\\x31\\xd6\\x78\\xd3\\x48\\x09\\x05\\xc0\\xe3\\x38\\xfb\\x7c\\xc0\\x26\\xe3\\xe7\\x9c\\xf2\\xc2\\x78\\x1a\\xc2\\xa5\\xa4\\x0d\\xf4\\x28\\x4e\\x23\\x5a\\x03\\x89\\xe9\\x28\\xfc\\x63\\x55\\x7d\\xc6\\xf1\\x99\\xfc\\xec\\x5f\\x36\\x1e\\xa2\\x47\\x59\\xfa\\x7c\\x5f\\x71\\x97\\x8c\\x0b\\xa2\\x45\\xe4\\xb0\\x3a\\xe4\\x35\\x94\\x1c\\x86\\xc8\\x1a\\x51\\x43\\x0c\\x2d\\xc9\\x92\\x7e\\x3b\\x0f\\x4e\\xc4\\xeb\\xa7\\xc2\\x74\\x5b\\x49\\x39\\x87\\x15\\x4d\\x7d\\xa8\\x5b\\x67\\xde\\x21\\xc5\\x98\\x40\\x7f\\xb2\\xa7\\x60\\x80\\x4a\\xd0\\x5b\\xfd\\xfa\\x45\\xa6\\x13\\x22\\x4b\\x22\\xa0\\x85\\x88\\xcc\\xea\\x3c\\xbd\\xf4\\x7a\\x19\\x8b\\xeb\\xf8\\xcf\\xed\\x86\\x49\\xd6\\xd5\\xf3\\xfa\\x50\\x13\\x76\\xbd\\xfb\\xa4\\x00\\x3d\\xac\\x22\\x37\\xdc\\xac\\xe5\\x31\\x5b\\x7f\\xef\\xb8\\x79\\xa8\\x9a\\x85\\xbc\\xe6\\xda\\x52\\x6f\\xc3\\x60\\xcb\\xb4\\xfd\\x55\\x4e\\xf0\\x13\\xf3\\x3b\\x73\\x84\\xcd\\x2b\\x22\\xa8\\x85\\x77\\xf3\\xa2\\xd3\\x66\\x42\\x2a\\xae\\x46\\x41\\x7b\\xa9\\x16\\xe1\\x64\\x6e\\x24\\x40\\x4a\\x88\\xb5\\xd5\\x3f\\xf1\\xae\\xd2\\xa4\\x7b\\xaf\\x81\\xfc\\xb4\\x28\\x63\\x97\\x99\\x13\\x94\\xb2\\xec\\xc3\\x96\\x67\\xac\\x46\\xc2\\xbd\\xb6\\xd0\\x23\\xb3\\x3d\\xb0\\x13\\x45\\x7c\\x40\\x05\\xd8\\x39\\x01\\x5d\\x88\\x51\\xf0\\x28\\xac\\x33\\x4f\\xb2\\x4b\\xba\\xd2\\x90\\x2a\\x4d\\x63\\xae\\x68\\xe0\\xec\\xa7\\xea\\xea\\x1e\\x85\\x65\\x29\\x64\\x7b\\xaf\\x14\\x12\\x21\\x37\\x54\\xed\\x50\\xaf\\x3f\\x43\\x6e\\x9b\\xaf\\xc1\\x60\\x16\\x39\\xb3\\x9d\\x3e\\x52\\xa9\\x3a\\x89\\x8f\\xb6\\x01\\x9f\\xd5\\xed\\x6e\\x7d\\xfc\\x05\\x0e\\x7c\\xe5\\xf3\\xd3\\x5c\\xeb\\x50\\x67\\x02\\x1c\\x0f\\xbd\\xc7\\x08\\xd3\\xf2\\x6b\\xd6\\x05\\x68\\xd1\\xed\\x2b\\x61\\x2b\\x69\\x62\\x35\\xd5\\x33\\x33\\x18\\xf9\\xa6\\xc9\\x87\\x23\\x5a\\x7a\\x07\\xf8\\xc6\\xa9\\x35\\x4f\\xb8\\xe7\\x34\\x76\\x30\\x65\\xaf\\xcd\\x4d\\x93\\x77\\x64\\xa4\\xf0\\x37\\xcc\\x7e\\x7e\\x2b\\x93\\x21\\x7f\\x16\\x41\\x68\\x4f\\xa8\\x1b\\x7f\\xf7\\x98\\x6a\\x28\\xb3\\x8e\\x95\\xb3\\x32\\xe7\\x46\\x49\\xe8\\x3d\\x0d\\xed\\x79\\x5c\\x57\\xf2\\x4c\\xf2\\x76\\xe0\\x14\\x39\\x01\\xba\\xfe\\xf0\\xf1\\x69\\x3f\\xe7\\xcf\\x10\\x90\\x4f\\xb0\\xd8\\x80\\xd7\\x2e\\x44\\x71\\x6a\\x70\\x69\\xda\\xaa\\xe7\\x42\\xcf\\x0f\\xf3\\xed\\x92\\xf5\\xf7\\xd1\\xe1\\x0e\\x04\\x9d\\x8d\\xf0\\x43\\x63\\x1e\\xd0\\xed\\x4c\\x4a\\xc4\\x02\\x2d\\x84\\x03\\xcb\\x04\\x21\\xb4\\x54\\xcb\\xfb\\x6f\\x48\\xa3\\x0e\\x9e\\xe1\\x60\\x9a\\xd7\\xb6\\x82\\x11\\x97\\x7a\\xcb\\x33\\xb9\\xc1\\xa1\\xbe\\x73\\x58\\x14\\xc5\\x8f\\x66\\xdb\\x5f\\x0b\\x8a\\xc7\\x73\\xb1\\xd5\\x8d\\x4e\\x6b\\xc4\\x5d\\xfd\\x48\\xa2\\x94\\xbb\\xd2\\x5e\\x92\\x67\\x1f\\x56\\xf3\\x02\\xf2\\x9b\\x50\\xd8\\x04\\x31\\xc8\\xf2\\xea\\x33\\x99\\x62\\x57\\xb2\\x08\\xe0\\x57\\xea\\x76\\x72\\xcc\\x2d\\x1c\\xd4\\x20\\x4b\\x85\\xb2\\xab\\x50\\x90\\x27\\x13\\x13\\x59\\xae\\xb4\\x2e\\x3e\\xcc\\xdb\\xae\\xcf\\xe2\\xcd\\x3e\\x5a\\x33\\x13\\x26\\x6e\\x76\\x11\\x94\\xff\\x69\\xca\\xe9\\xe3\\x7e\\x51\\xcc\\x0a\\x54\\xf0\\x86\\xdd\\xe1\\x3c\\xb3\\x31\\x18\\xe3\\x4f\\xe3\\x3c\\x74\\xd7\\x35\\x58\\x27\\x52\\xd6\\x8d\\x21\\xc7\\x9e\\x5c\\x3a\\xae\\xa9\\x4b\\xa1\\x07\\xcb\\x7e\\xe8\\xa7\\x0a\\x3f\\x9a\\x01\\xe9\\x80\\x8c\\x0a\\xeb\\xa6\\x66\\x53\\x15\\xb4\\x56\\x25\\x84\\x0a\\x03\\x3a\\x6e\\x2a\\x87\\x54\\x95\\x05\\x79\\x42\\xed\\x9b\\xb2\\xce\\x6e\\x4e\\xe6\\x0b\\xed\\x47\\xcd\\x9d\\x58\\x4b\\xc2\\x45\\x24\\x39\\x7a\\x10\\x94\\x98\\xee\\x2a\\x97\\x3a\\xad\\x6a\\x29\\xb7\\x0a\\x1c\\xfb\\xfe\\x9a\\xa5\\xc7\\xcb\\x9f\\x35\\xf0\\xfa\\x00\\x22\\x7f\\x43\\x98\\x8d\\x07\\x61\\x9b\\x6f\\xb2\\xf6\\xd3\\xbe\\xe2\\x8e\\x10\\xee\\x70\\x53\\x47\\x01\\x5a\\x92\\x2e\\x2e\\x88\\xd3\\x4f\\xb0\\xce\\x51\\x5b\\x08\\xdf\\x3a\\x1b\\x63\\x4f\\xf9\\xec\\x15\\xd0\\x59\\x41\\x82\\xc8\\x6e\\xbb\\x0d\\xb7\\x83\\x61\\x2a\\x7d\\x19\\xe4\\xb2\\x2e\\x82\\x2d\\x56\\x62\\x45\\xae\\xd7\\x2e\\x69\\x4c\\x3d\\x10\\x1b\\xfa\\x4c\\xa8\\x79\\x86\\x2e\\x5f\\x99\\xc2\\x3a\\x5d\\x66\\x08\\x3c\\xe0\\x6d\\x87\\xf3\\x99\\xaa\\x78\\x88\\xab\\x83\\xb8\\x66\\x44\\x72\"},\n{{0x4e,0xf6,0x0f,0x06,0x91,0xd7,0x37,0xe6,0x4d,0x43,0x7b,0xfd,0x33,0x98,0x33,0x0e,0x55,0xe3,0xc0,0x94,0xcf,0x41,0xfc,0x55,0x7b,0x0f,0xe0,0xb6,0x43,0x90,0x9a,0xb8,},{0x30,0x6a,0xb1,0x46,0xe5,0xc8,0xcd,0x63,0x0f,0x9b,0x48,0xbf,0x8b,0x68,0x5d,0xb0,0xb6,0xb5,0x53,0xef,0x69,0x68,0x68,0x53,0xb6,0xb5,0x31,0x96,0x01,0x18,0x54,0x8c,},{0xcb,0xf7,0xcf,0x22,0x08,0x1c,0x5f,0x23,0x5d,0xba,0x35,0x63,0x0f,0xb3,0xf0,0x40,0x8f,0xce,0xcc,0xef,0xeb,0x28,0xb9,0x9d,0x74,0xdb,0xd9,0x8c,0x90,0x2c,0x7d,0x99,0xba,0x9c,0xa7,0xfa,0xb3,0x74,0x7c,0x50,0x4c,0xc2,0x19,0xf4,0xdd,0x10,0x10,0x81,0xf5,0x8c,0xe6,0x16,0xe2,0x92,0x80,0xe3,0x62,0x53,0x9f,0xe4,0x9f,0x34,0xd7,0x05,},\"\\x0a\\x18\\x8a\\xc2\\x6f\\x3c\\x5d\\x89\\xf3\\xd5\\x88\\x37\\x4f\\xac\\x5e\\xcf\\x9a\\x46\\x7e\\x21\\x65\\xb3\\x1d\\x0b\\x0f\\x23\\x50\\x1b\\xd2\\x2e\\x62\\xbf\\x35\\x55\\xff\\xba\\x94\\x63\\x1d\\xe7\\x4a\\x6a\\x3c\\x3c\\xf6\\x3b\\x03\\xac\\x1b\\xbb\\x37\\xd2\\x33\\xec\\xa5\\x99\\x3b\\x09\\x70\\xa0\\x22\\x0d\\xe8\\xd6\\xc4\\x1a\\x97\\x03\\x07\\x30\\x9a\\x52\\xda\\x05\\x76\\xdc\\x33\\x4d\\x80\\x64\\x47\\xaa\\x09\\xd0\\xb2\\x45\\xea\\xcd\\x0b\\x42\\xc4\\xe1\\x9f\\xa3\\xd6\\xfb\\xdc\\x22\\x94\\x30\\xeb\\x3c\\x75\\x58\\xaf\\x53\\x31\\xc6\\xe7\\xfc\\xc2\\xe5\\x52\\xce\\x35\\xd5\\x79\\x07\\x3b\\x54\\x8d\\xc1\\x15\\xbb\\xd2\\x7e\\x5a\\x33\\xce\\x1c\\x47\\xfc\\x84\\x61\\xe3\\x91\\xb6\\xd7\\x67\\x95\\x34\\x87\\xcc\\x52\\xee\\x67\\x3b\\xc4\\xbe\\x96\\x56\\x9c\\x85\\x57\\x36\\x9e\\xbb\\x6e\\x02\\xf7\\x92\\x38\\x10\\x8c\\x3b\\x58\\x56\\xee\\x38\\x1a\\x79\\xff\\x46\\x4c\\x8f\\x60\\x09\\xfd\\x47\\xe6\\x7b\\x4c\\x80\\x20\\x1e\\x11\\xe6\\x1a\\xb8\\xf5\\x9b\\xa5\\xd0\\x7b\\x15\\xac\\xe3\\xfb\\x37\\x4c\\x64\\xb6\\xb4\\xc3\\x45\\xe2\\xb0\\x0e\\x91\\x51\\xab\\x8e\\x1c\\x5c\\x98\\x56\\x8b\\xc5\\x8d\\xd0\\x81\\x2a\\xaa\\x3b\\xee\\xe1\\x65\\xe7\\xea\\xe5\\x8f\\xbd\\xe6\\x30\\x77\\x20\\x3c\\x4f\\xd6\\xe1\\x60\\x68\\xd7\\x6e\\x3d\\x3a\\x13\\xf1\\xcd\\xd7\\x32\\x88\\xbd\\x5e\\x4d\\xa4\\x4e\\xb1\\x19\\xa0\\x4c\\x4d\\x32\\xef\\xa2\\xf1\\x3e\\x74\\x26\\xa2\\xf4\\x1c\\x56\\x23\\xc9\\xb0\\x66\\xb1\\x30\\x36\\x39\\xb8\\xfc\\xea\\x0d\\x87\\x74\\xcc\\x08\\x04\\x5f\\x7e\\x34\\x63\\x65\\xff\\x31\\xd3\\xb1\\xed\\x99\\xe9\\x7b\\xca\\x5f\\x25\\xc9\\x2b\\x28\\x43\\xac\\x58\\x5d\\x02\\x19\\x3a\\x2f\\xd3\\x94\\x66\\xf7\\x3a\\xaa\\x98\\x9b\\x1f\\xa0\\x5b\\x9a\\x15\\x7f\\xd0\\x27\\x7c\\x5e\\x74\\x5d\\x25\\x8e\\x02\\x78\\x03\\xa5\\x24\\xad\\x94\\x30\\x94\\x25\\xc3\\xf4\\xde\\xc3\\x1c\\x0e\\xfc\\x54\\x77\\x52\\xf4\\xc7\\x19\\x4c\\xbb\\x27\\x2f\\x84\\x9a\\x52\\x16\\x9c\\x6a\\x07\\x8d\\x20\\xed\\xe1\\x43\\x20\\x16\\x52\\x84\\x77\\xb5\\x8c\\x2b\\xdf\\x60\\x63\\xf9\\x44\\x7e\\x33\\x83\\x7c\\xcb\\x43\\x7d\\x8d\\x6b\\x95\\xcf\\x4c\\x44\\xbe\\x70\\xc8\\x19\\x3a\\xd9\\x80\\xa1\\x05\\xf3\\xdb\\x6f\\x99\\x30\\xba\\xb4\\x67\\x8c\\x77\\x63\\x42\\xfa\\xf1\\x70\\xed\\xf7\\x42\\x48\\xd3\\xb1\\xca\\x96\\xf7\\x31\\xb9\\xd0\\x26\\xd8\\xf0\\xf7\\xc3\\x4e\\xd3\\x72\\xc1\\xcd\\xe1\\x76\\xf5\\x5f\\x55\\x86\\x75\\xcc\\x31\\x80\\xc2\\x39\\x02\\xf4\\xba\\x95\\x08\\xd1\\xc9\\x1c\\x3c\\x9e\\x68\\x87\\x30\\x32\\x7f\\x3f\\x7b\\x63\\x7a\\x8f\\xee\\x54\\x37\\x37\\x59\\xfc\\xb1\\x7c\\x92\\x17\\xea\\x44\\xce\\x43\\x69\\x1a\\x8f\\x64\\x63\\x64\\x0a\\x4a\\x5e\\x15\\x1e\\x62\\x54\\xc4\\xef\\x12\\x62\\x3b\\x49\\x39\\x4d\\xa7\\xcc\\x79\\x45\\x26\\x93\\x81\\x7d\\x6b\\xae\\xa9\\xa0\\xa7\\x58\\x76\\x94\\x8b\\x1f\\x8d\\x3b\\x71\\x7f\\x9e\\xc3\\x67\\x53\\xf5\\x32\\x63\\x71\\x03\\x83\\xb9\\x82\\x62\\xae\\x63\\x54\\xff\\x2a\\x22\\x83\\x22\\x0a\\xd4\\x2c\\x5c\\xb2\\xcb\\xbd\\xf1\\x2c\\x87\\x95\\x13\\x71\\x0b\\x16\\xbe\\x85\\x6f\\x3b\\x13\\x55\\xb3\\x6f\\x4b\\x80\\xc0\\x17\\xc2\\x1b\\xe8\\x5e\\x96\\x05\\x3d\\xa0\\x50\\xc4\\x03\\x12\\x10\\x0a\\xbb\\x64\\x0b\\x87\\x3d\\x88\\xfb\\x6e\\xe0\\xd1\\x9e\\x9e\\x61\\xb0\\x4c\\x97\\x0b\\xd1\\xf0\\x60\\xdd\\x31\\x1b\\xbb\\x9a\\x6e\\x35\\xb9\\x85\\xfd\\xca\\x17\\xca\\xee\\x8c\\xd5\\xdb\\x63\\x7a\\xcd\\x90\\xcb\\x8e\\x82\\x32\\x55\\xc0\\x56\\x01\\x8f\\xef\\x59\\x20\\xdb\\x64\\x0d\\x22\\x01\\xc5\\xed\\xdb\\xd8\\xa9\\xc9\\x47\\x4d\\xa8\\xde\\xf7\\xe1\\x32\\x5b\\x3c\\xc4\\x36\\xc7\\x4f\\x81\\x5d\\xb1\\xe4\\x2b\\x42\\x1f\\xaa\\xb6\\x26\\xa4\\x37\\x8c\\x2d\\x84\\x26\\x1b\\xf6\\x49\\xa5\\x3b\\x32\\x1f\\x59\\x8c\\x44\\xbb\\xd3\\x00\\x2b\\x06\\xcf\\x7f\\x1f\\xde\\xf8\\x4a\\xb3\\x5f\\x73\\xed\\x7d\\xc6\\x50\\x96\\xcb\\x1d\\xc0\\xcc\\x0e\\x34\\xc5\\x61\\xc8\\xa1\\x5c\\xf5\\x27\\x9a\\xbb\\xed\\x9b\\x16\\xff\\x24\\xa9\\x74\\x4e\\x3f\\x5e\\x64\\x9c\\xc9\\xd8\\x88\\x4f\\x89\\x1c\\x3f\\xb7\\x89\\x02\\x03\\x1f\\xfe\\x0e\\x01\\x21\\xc7\\x20\\x80\\xad\\x10\\xc2\\x47\\xb7\\xc9\\x3a\\x9e\\xbb\\x2d\\x84\\xd4\\xf8\\x77\\x75\\x0d\\x7b\\x34\\x16\\x39\\x3d\\x03\\x04\\x52\\x26\\xbb\\x79\\x94\\xee\\xa5\\x8e\\x27\\x2d\\xc1\\x8c\\x46\\xb3\\x82\\xd1\\xf9\\x7b\\x23\\x76\\x5f\\xda\\x7a\\x8c\\xe2\\x1f\\xc6\\xb9\\x8d\\x72\\x3f\\xfc\\xcd\\x99\\xac\\x46\\x55\\xcc\\x5d\\x10\\x10\\x5a\\x2a\\x5b\\x7c\\x8c\\xfb\\xfb\\x90\\xe2\\x7a\\x9a\\x80\\x9e\\x41\\xae\\x64\\x00\\x63\\x28\\x64\\x05\\xa9\\xbe\\x83\\xac\\x5d\\x29\\x07\\xa4\\x5f\\x16\\x3c\\x77\\x64\\xb0\\x9f\\x99\\xa5\\x55\\x93\\x22\\x0d\\x69\\x01\\x29\\x2b\\x9b\\x58\\x03\\xa0\\xfe\\x71\\xb0\\xe4\\x44\\x1c\\xbf\\xef\\x84\\x1c\\x33\\xce\\xbc\\x98\\x36\\x4d\\x66\\x6e\\x5a\\x9f\\x5e\\x7e\\x69\\xa1\\x50\\x8e\\x43\\x80\\xed\\x36\\x13\\x45\\xb7\\x24\\x8a\\x4c\\x1c\\x1c\\xe0\\x87\\x69\\xbc\\x71\\x52\\xdd\\xb3\\x32\\xfb\\xa1\\x76\\x20\\x0f\\x5a\\xbb\\xae\\x38\\x12\\xf4\\x06\\xda\\x72\\xdd\\xe5\\xdb\"},\n{{0x19,0x7e,0x15,0xdc,0xe4,0xc4,0x7d,0x73,0x4d,0xbc,0xe4,0x68,0x8a,0x7a,0xd5,0xfe,0x41,0xeb,0xf2,0xaa,0x29,0xa2,0xbd,0xdb,0x2b,0xee,0x62,0x84,0x29,0xc1,0xbc,0x02,},{0x30,0xfa,0xc3,0x23,0x04,0x8b,0x0c,0x78,0x1a,0x9f,0x63,0xc1,0xee,0x69,0xf2,0xb9,0xe7,0x5a,0x27,0x06,0xd2,0x49,0x51,0x2a,0x27,0x39,0x60,0x7f,0x26,0xdb,0x13,0x8f,},{0x2c,0x3c,0x8c,0xd2,0x99,0xc9,0x06,0x0b,0x65,0x99,0x9b,0x03,0xa6,0x57,0x9b,0xc5,0x0e,0xf1,0xfe,0x0d,0x85,0x1f,0x23,0xbe,0x9c,0xb5,0x8f,0x8f,0xb8,0xc6,0x72,0xee,0x08,0x6a,0x53,0x9e,0xad,0x94,0x9e,0x08,0x7d,0xf0,0x91,0x12,0x2d,0x26,0xfa,0xaa,0xd2,0x06,0xa5,0xc5,0x2f,0xcd,0x58,0xb5,0x14,0xd7,0xa9,0x35,0xbe,0x01,0x79,0x08,},\"\\xfd\\x97\\x1d\\x48\\x94\\x6b\\x51\\xff\\xed\\x7b\\x62\\xc5\\xd0\\x99\\xc1\\xe5\\x6b\\x13\\x58\\xb9\\x22\\x35\\xe1\\x01\\x0e\\x3f\\x23\\x84\\x4d\\xdb\\x73\\xbc\\xee\\x8d\\x2e\\x1c\\x99\\x77\\x35\\x3b\\xc9\\x6a\\x22\\x1c\\x05\\x60\\x29\\x31\\xfa\\x16\\xcc\\xc2\\xab\\x6d\\x0f\\x01\\xc8\\x46\\xc2\\x92\\x0e\\x99\\xde\\x02\\x6d\\xc2\\x89\\x7f\\x3d\\x5f\\x3c\\xee\\x17\\x4c\\xe7\\x51\\xd4\\xa8\\x05\\xee\\x19\\x59\\xa3\\xc6\\x9c\\xfd\\x42\\xd7\\xc9\\xaf\\xd3\\x1f\\xa9\\xb1\\xcf\\x05\\x78\\x6d\\x8f\\x90\\x42\\xa4\\xf9\\xf8\\x1c\\xf7\\xac\\x9c\\x1c\\x39\\xb3\\x6f\\x1e\\xe9\\x5b\\x98\\xcf\\x7e\\xe3\\xf4\\x3e\\x2c\\x34\\x37\\x33\\xd1\\xd8\\x2c\\xc0\\x8b\\x2c\\xde\\xb7\\x8d\\x98\\x20\\x34\\x08\\x5f\\xf4\\xdc\\x65\\x36\\xcd\\x15\\x4a\\x79\\x0c\\x85\\xc8\\x61\\x3e\\xc4\\xe5\\xe1\\xdc\\x37\\x7d\\x38\\xa7\\x45\\xd9\\x38\\xcf\\xb1\\x5c\\x8b\\x8a\\xa8\\x61\\x21\\x83\\x5f\\x2e\\x25\\xe9\\xe6\\xd0\\xde\\x68\\x02\\x5d\\x81\\x0c\\x3d\\xc9\\xdf\\x99\\x1d\\xad\\xad\\x39\\xdc\\x69\\x81\\xfd\\xba\\xc1\\xff\\x9b\\x7a\\x79\\x1c\\x39\\x60\\xd8\\x56\\x43\\x66\\xe5\\xaa\\x39\\xa9\\xe9\\xc7\\xcb\\xf1\\xd3\\xf0\\xf8\\x20\\xd1\\xb9\\x01\\x08\\x75\\x1a\\xc7\\x64\\xda\\xbe\\x05\\xc5\\x1c\\x18\\x52\\x9d\\xa1\\xb0\\x34\\x96\\x14\\x66\\x84\\x24\\xab\\x4e\\x93\\x64\\x40\\xc4\\xa2\\x51\\x3b\\xe5\\x28\\x53\\x93\\x72\\xee\\xe7\\x87\\x54\\x58\\x9d\\xbe\\x79\\x94\\xfa\\xa1\\xf6\\x22\\x91\\x24\\xf8\\x39\\x95\\x0e\\xd0\\x92\\x3f\\x43\\x23\\x31\\x5a\\xc9\\x63\\xbb\\xe4\\xc8\\xe1\\x77\\xda\\xc5\\x16\\xe7\\x34\\x22\\x38\\xf1\\xcd\\xf1\\x40\\xbe\\xfc\\x8a\\xcd\\xca\\x3d\\x00\\x2b\\x16\\xc1\\x39\\x8d\\x86\\x86\\x00\\x30\\x4c\\x7e\\x98\\x53\\xb2\\x3a\\x51\\xb1\\x7d\\x9f\\xd0\\x61\\x56\\xe1\\xd1\\xd0\\x8a\\x28\\x46\\x09\\x09\\xfa\\x20\\x9c\\xcc\\xcc\\x4c\\xec\\xbd\\xb1\\xa4\\x63\\x48\\x08\\x91\\x15\\x31\\x86\\x81\\xa9\\x5a\\xe5\\x80\\xab\\x67\\x66\\x04\\x13\\x84\\x65\\x1c\\xc4\\xe6\\x14\\x51\\x03\\x92\\x3b\\xdf\\x4a\\x32\\xa9\\x3d\\x93\\xee\\xd3\\x18\\x79\\x1f\\x20\\x80\\x5f\\x7e\\xa8\\x4b\\x74\\x3e\\xe1\\x1e\\xad\\x9e\\x4c\\xa0\\x3d\\xa7\\x6d\\xdd\\x24\\x9f\\xd4\\x47\\x5f\\xc1\\xa3\\x53\\xc7\\x0a\\x83\\x38\\x9b\\xfa\\xc5\\x20\\x98\\xdb\\x06\\x6d\\x10\\x29\\xc4\\xef\\xfb\\xed\\x86\\x4e\\xbe\\x7f\\x10\\x7e\\x01\\x03\\xb3\\xa8\\xf3\\xfd\\x1d\\x6a\\xb4\\x36\\x0b\\x99\\xe8\\xb1\\x40\\xc5\\xea\\x13\\x3e\\x92\\x3c\\x39\\x2b\\x8e\\x40\\x63\\xaa\\x6e\\x52\\x26\\x38\\xf6\\x1d\\x7a\\x71\\xc9\\x22\\x58\\x97\\xd9\\xf8\\xa1\\xe1\\x6c\\xfc\\xc8\\x01\\xe7\\xd5\\x41\\x04\\xeb\\x10\\xe6\\x1a\\x5a\\xe6\\x3c\\x5c\\x85\\xa5\\xb2\\x93\\x92\\xab\\x3a\\xb8\\xe5\\xc0\\x39\\xf1\\x00\\xd0\\xf4\\x60\\x0c\\x61\\x0e\\x02\\x09\\x43\\x6e\\xf2\\xec\\xe4\\xd0\\xbd\\xb0\\xba\\xb4\\x37\\xb2\\xdb\\x5f\\x37\\x08\\xfd\\xdf\\x96\\x66\\x0f\\x6f\\xb1\\xa9\\x0d\\x60\\x48\\xd3\\x95\\xaf\\xaf\\xa7\\x60\\xcc\\xaf\\x15\\xde\\xaa\\x0e\\xff\\xeb\\x26\\xec\\x17\\x68\\x1d\\x17\\x2c\\x13\\x30\\xf7\\x8e\\x78\\xa8\\x73\\x6b\\x28\\x5f\\x61\\x5f\\x15\\xd4\\xf2\\xc3\\x13\\xd2\\x5f\\x30\\xae\\xe9\\xd1\\xdb\\x39\\xf5\\x35\\xfc\\xdd\\x0e\\xbc\\x8e\\x71\\xb8\\x9c\\xe6\\xb3\\xfc\\xb5\\x67\\xcd\\x0f\\xa2\\x88\\xf4\\x8e\\xd3\\xa7\\x59\\xbb\\x2e\\xd2\\x00\\xfd\\xc2\\x30\\x91\\x50\\x2f\\xd9\\xca\\x65\\x1c\\xe5\\xe3\\x42\\x2a\\x98\\x33\\x5a\\x81\\xd7\\x4a\\x65\\xcc\\x15\\x00\\xe9\\x07\\x0a\\xbb\\x60\\x9c\\x1c\\x1f\\x68\\xfc\\x2c\\xa9\\x4c\\xdd\\x55\\x0f\\x99\\xbc\\xb2\\xd0\\x92\\x41\\x6b\\x9b\\xd3\\x88\\x41\\x0b\\x8f\\xe7\\x48\\xfb\\x8c\\x9a\\x5a\\xb8\\x61\\x5f\\x2e\\xd9\\x68\\xf8\\x5d\\xcb\\x27\\x27\\x72\\x69\\x84\\xbe\\xad\\xa7\\xa1\\x8a\\xfd\\xb0\\xc7\\x2a\\xa6\\x5d\\xe7\\xab\\xb7\\xa8\\x6f\\x11\\x16\\x9a\\x6e\\xad\\xf1\\xc2\\x1d\\x61\\x4e\\x52\\xc0\\xc8\\xf0\\x19\\x74\\x7d\\x34\\x1a\\x05\\xd8\\x5e\\x37\\xbf\\x58\\xd8\\x32\\x7e\\x99\\x39\\xc2\\x38\\x7c\\x27\\x44\\xed\\xf8\\x38\\x56\\x3c\\xb3\\x7f\\x0b\\x16\\xe8\\xa0\\x6f\\xc6\\x28\\xa9\\x72\\x30\\x50\\x6f\\xa4\\x18\\x39\\x54\\xdc\\x74\\x81\\x5f\\x3b\\xe2\\xeb\\x2a\\xff\\x4a\\x13\\xc0\\x65\\xf7\\x43\\xb7\\xd8\\x5d\\xe8\\x04\\xeb\\x28\\xef\\xe5\\x70\\xed\\x5e\\xcc\\x71\\xab\\xa9\\x7f\\x97\\x63\\xb4\\x36\\x17\\x32\\x47\\xf3\\x8e\\x0c\\xf6\\x29\\x72\\x09\\xb6\\x51\\x28\\x46\\x5a\\x38\\x26\\x64\\xce\\xd8\\x01\\x1f\\xcc\\x3d\\x0e\\x56\\x3f\\x15\\x5b\\xc6\\x3c\\x94\\xdd\\xe7\\x3c\\x7b\\x17\\x24\\x7b\\x8c\\x3a\\x4e\\x80\\x34\\xeb\\xd4\\x36\\x46\\x35\\x18\\x5c\\xe9\\xc7\\x08\\x1d\\xbd\\xbe\\x85\\x45\\xf7\\x9d\\x01\\xaa\\x53\\x2a\\x0d\\xc5\\x2c\\xb7\\x90\\xa3\\x1f\\xc2\\xff\\x41\\xac\\xeb\\xad\\x27\\xcc\\xe9\\x24\\x45\\x54\\xdb\\x65\\x2f\\xa2\\x87\\xba\\xe7\\xde\\xcb\\xcc\\x8c\\xe9\\xe0\\x1d\\x1a\\x88\\xab\\x41\\x2b\\x6c\\x65\\x78\\x20\\x3b\\x42\\xde\\xc9\\x82\\xb7\\xf3\\xb8\\x23\\x14\\xdb\\x2c\\xc7\\xc5\\xc3\\xdc\\x1d\\x3d\\x8b\\x17\\x14\\x4d\\xa7\\xfe\\x60\\xe7\\xa8\\x72\\x5f\\xd0\\xa9\\x7c\\x61\\x06\\x07\\xcf\\x41\\x3c\\x72\"},\n{{0x08,0xb5,0xfd,0x4e,0x41,0x9d,0x23,0x70,0xc0,0xfc,0xd6,0xc3,0xb9,0x2f,0x8d,0xb3,0xaf,0xd4,0x22,0x68,0xf5,0x33,0x08,0x5d,0x9f,0xce,0x32,0xb5,0x22,0x82,0x4e,0x34,},{0xcd,0x0d,0xa6,0x99,0x37,0x9e,0x4f,0x94,0x25,0xe8,0x4b,0x97,0x57,0x30,0x0a,0x51,0xa1,0x63,0xf3,0x58,0x73,0x4c,0xc3,0x7a,0x91,0xff,0x0e,0xa4,0x88,0xd2,0x97,0x79,},{0x42,0xa1,0x37,0x56,0xb7,0x5c,0x67,0x22,0x48,0x5f,0xa3,0xf6,0x94,0x04,0x1b,0x39,0xb7,0xd7,0xc5,0xfd,0x40,0xeb,0xc0,0x6a,0x52,0xe0,0xff,0x34,0xce,0x14,0xd8,0xd4,0x0f,0xa8,0x2a,0x95,0x08,0xb5,0x68,0x53,0x7d,0x26,0xd0,0xdd,0x7c,0x0a,0x31,0xbe,0x71,0x0d,0xa8,0x0a,0xab,0x35,0x19,0x6a,0x03,0x9b,0x60,0x64,0x1d,0xb1,0xe1,0x01,},\"\\x3c\\xee\\xee\\xa3\\x0f\\xa4\\x01\\x56\\x3d\\xf3\\x6b\\x19\\x8b\\x9b\\x59\\x69\\x8c\\x10\\xe1\\x00\\xa2\\xf3\\x0e\\x6f\\x78\\xfe\\x62\\xb9\\x2e\\xca\\xc9\\x89\\xe8\\xaa\\x09\\xec\\x76\\x0e\\x89\\xca\\xc0\\xa1\\x6b\\xde\\x3c\\xac\\x73\\x62\\x2a\\x86\\x27\\xef\\xed\\xfa\\x4e\\xc0\\x9b\\x87\\x3f\\x7e\\x10\\x00\\xe7\\x69\\x82\\x91\\x0c\\xa0\\xaa\\x4a\\xfb\\x1f\\xf5\\xa8\\x44\\x8b\\x76\\xf7\\xb0\\xd2\\xa2\\xd5\\x2a\\x7f\\x40\\xde\\xde\\xfc\\x68\\xd6\\x0c\\xe6\\x62\\x2c\\xa0\\x80\\xd6\\x69\\x8e\\xa6\\xc3\\xbd\\x72\\x10\\xb3\\xb6\\x48\\xf5\\x32\\x52\\x29\\x14\\x94\\xb3\\x5a\\x55\\xff\\x40\\xfa\\x1a\\x63\\x1a\\x57\\xc5\\x10\\x01\\x1a\\x46\\xbf\\xb9\\xe2\\x71\\xba\\xe1\\xe7\\x8c\\xe6\\xc6\\xea\\x60\\xc5\\x5b\\xa0\\xcc\\xe3\\x60\\x59\\xbf\\xb0\\x1e\\x39\\x45\\x56\\x98\\x7f\\x74\\x4b\\x72\\xae\\xbb\\xdb\\x4b\\x1b\\xdb\\xb3\\xbb\\xaa\\xee\\x1b\\x8b\\x2f\\x31\\x74\\x50\\x6a\\x79\\x3f\\x0a\\x51\\x1b\\x2b\\x56\\x90\\x49\\xb3\\x0a\\x2e\\x08\\x41\\x42\\x41\\x84\\xa4\\x8e\\xca\\x9e\\x2d\\x83\\x78\\x3a\\xc5\\xb6\\x1e\\xb9\\x47\\xcb\\xd8\\xba\\xb7\\xad\\x38\\xb0\\xc6\\x84\\x27\\xd8\\xf9\\x4a\\xe2\\x85\\x19\\x0d\\xbb\\x6e\\x0c\\x6d\\x58\\x0a\\x25\\x14\\x23\\x94\\xbe\\x94\\x81\\x58\\xd8\\xda\\x83\\xb4\\xf3\\x4a\\x8d\\x25\\x8b\\x97\\x07\\x56\\x32\\xb3\\xc2\\x8b\\xfa\\xe3\\x10\\x5e\\xd1\\x87\\x2e\\x35\\x6e\\x43\\xae\\xd5\\x93\\x97\\xb9\\x11\\x0b\\xbf\\x9d\\x8c\\xa2\\xa0\\x44\\xd5\\x27\\x1e\\x6c\\xc3\\x61\\xe1\\x4e\\x69\\xa9\\x32\\x51\\x76\\x83\\xec\\x81\\x81\\x8f\\x02\\xcf\\xa0\\x29\\x5e\\x56\\x61\\xce\\xa3\\xe5\\x86\\xaf\\xc0\\xdb\\x41\\xba\\x95\\x55\\x3e\\xe7\\x5b\\x20\\x0b\\x0f\\x97\\x90\\x11\\x1d\\x37\\x57\\xa7\\x39\\xe5\\x63\\x55\\x7a\\xff\\x9b\\x70\\xca\\x14\\xe8\\x7b\\x79\\x54\\x37\\xba\\x91\\xa9\\x5d\\xd0\\x7e\\xa6\\x9a\\x11\\x35\\x9f\\x36\\xca\\x03\\x29\\x8e\\x0b\\xfa\\x4f\\x91\\x2f\\x64\\xa2\\x92\\x4a\\xd9\\x01\\x97\\x5a\\x2a\\x96\\x0b\\xa1\\xbe\\x89\\x92\\x1b\\x1f\\x54\\x85\\x49\\x6b\\x7e\\xa5\\xda\\x6d\\x8a\\x69\\x37\\xac\\x10\\x5b\\xf3\\x76\\x0e\\x48\\x76\\x99\\x0a\\x0f\\x5c\\x5a\\x63\\x4f\\x74\\xcb\\x57\\xdf\\x7c\\x17\\x2c\\x8a\\x41\\x53\\x72\\xe6\\xd9\\x03\\x29\\x87\\x17\\x49\\x96\\x16\\xf8\\x97\\x1c\\x68\\xbb\\xec\\xe9\\x2e\\xa8\\x78\\xa1\\x8e\\x23\\xf3\\x27\\xc3\\x64\\x9b\\x6a\\x85\\x2e\\xf2\\x3b\\x7b\\x3e\\x60\\x3c\\xdf\\x80\\x45\\x2d\\xbf\\x1b\\xe2\\xfb\\x77\\xe8\\x14\\xd2\\x52\\x54\\x96\\xbb\\x31\\xfb\\x6e\\x4e\\xd2\\x53\\x32\\x48\\xb3\\x9d\\x5f\\xbe\\x23\\x90\\xa9\\xb6\\xfc\\xca\\xba\\x99\\x7e\\x8b\\x49\\xb5\\x98\\x36\\xe3\\xe0\\x95\\x29\\xea\\x5e\\x41\\x13\\xee\\xe4\\x51\\xc9\\xc6\\xbb\\x26\\x74\\x1d\\x0e\\x4c\\x58\\x6f\\x53\\xd6\\x04\\xc6\\xea\\x0c\\x0e\\x60\\xdb\\x02\\xe5\\x10\\x9f\\x37\\x34\\xf5\\x1c\\xdd\\x89\\x85\\xaf\\xeb\\x3e\\xca\\xff\\x65\\xe0\\x59\\xe3\\x12\\xcd\\x50\\xfa\\x34\\x9f\\xf2\\x8b\\xdc\\x9b\\x70\\xb7\\xf5\\x32\\xdb\\xab\\x1d\\xf4\\x3b\\x03\\x16\\x7c\\x1d\\x2e\\x3f\\xa6\\xee\\x8c\\x9b\\x17\\x4a\\x0b\\x2c\\xf8\\xaa\\x9f\\xfa\\x40\\x6b\\xf5\\xbd\\x72\\x88\\x78\\x0c\\x9c\\x4a\\x6b\\x69\\x79\\x49\\xb4\\x86\\x38\\xd4\\x20\\x79\\xc8\\xc6\\x6e\\x14\\xd9\\xb5\\x72\\xa2\\x10\\xa0\\x93\\xea\\xf1\\xd2\\xf7\\xa7\\x03\\xb5\\xcd\\x20\\xad\\xc4\\xf9\\x92\\x7a\\x6e\\xa8\\xea\\x78\\xfa\\xa6\\x1b\\xc6\\x2b\\x3c\\x5c\\xbd\\x3a\\x53\\x25\\x25\\x66\\xd0\\x43\\xba\\x55\\x65\\x90\\xd9\\xa7\\x63\\xbe\\x7f\\xea\\x4b\\x20\\xe1\\xe9\\xcf\\xbe\\xbf\\xae\\x15\\x43\\x9b\\x33\\x4d\\xc5\\x39\\xb1\\x7d\\xad\\xa2\\xe4\\x34\\xe9\\xc8\\x32\\x25\\xb1\\xe8\\xf6\\xbe\\xb7\\xd5\\x56\\xb4\\x7d\\x7f\\x69\\xf7\\xeb\\x7d\\xf5\\xed\\xe2\\xee\\xbd\\x84\\xe2\\x50\\xb7\\xc9\\x46\\x8c\\x21\\xfd\\xc0\\x17\\x0e\\xa8\\xdf\\x66\\x2d\\x61\\x80\\x58\\x1f\\x65\\x7f\\xe7\\x6c\\xef\\x18\\x58\\xb6\\xb0\\x2f\\x73\\x25\\xc7\\x21\\x96\\x43\\xfb\\xa2\\xf7\\xe9\\x96\\x3a\\x33\\x32\\x2d\\x65\\x04\\xab\\x91\\xbf\\x10\\xa9\\x78\\xfa\\x07\\xb4\\x7d\\x5d\\xb0\\xbe\\x00\\x0d\\xcd\\x00\\x2b\\xdd\\xaf\\x67\\x6b\\x77\\x25\\x9c\\x9f\\x60\\xad\\x0b\\x11\\x67\\x1c\\xd5\\x77\\x7c\\x1e\\x80\\xb1\\x3f\\x82\\xeb\\x0f\\xb6\\xa1\\x80\\xb5\\x66\\x62\\x93\\xa4\\x32\\x40\\x86\\x2f\\xbf\\xa3\\x97\\x8d\\x95\\x31\\x19\\x71\\xaf\\xab\\x9e\\x1c\\xc8\\xab\\x14\\xa8\\x76\\xb6\\x57\\x2a\\xc8\\xa4\\xb7\\xe0\\xb4\\x0a\\xaf\\x6b\\x52\\xa1\\xcf\\x4c\\x1e\\xbc\\x6c\\x1c\\x48\\x7d\\xf5\\xa3\\xcb\\xc4\\x00\\x5a\\x0e\\xe3\\x29\\xca\\xbc\\x28\\x6d\\xb1\\x0f\\x17\\xd0\\xf1\\x78\\x2e\\x07\\xd3\\x32\\x4f\\x0c\\x73\\xef\\xbd\\x3c\\x2f\\xb5\\x2b\\x71\\xf9\\x8a\\xd9\\x5d\\xb9\\x50\\x62\\xd9\\x14\\x25\\xe7\\x34\\x67\\xbc\\x1e\\x4e\\x9b\\xf5\\x52\\xe8\\xa2\\x44\\x29\\xd9\\x7d\\xb1\\xd6\\x6d\\xd4\\xd9\\x95\\xe5\\xf8\\xd2\\x4e\\x9c\\x91\\x0b\\x2e\\xb1\\x75\\x8e\\xf7\\x55\\x25\\xc3\\xd6\\x5a\\x3f\\x43\\x0a\\x02\\x73\\x48\\x82\\x0c\\xe3\\x05\\x3b\\x6f\\x3a\\xf4\\xec\\x96\\xd0\\x49\\x37\\x31\\xc8\\x18\\xc6\\xb1\\xa7\\x0c\\x25\\x0a\\xc6\\x86\\xa4\\xfc\"},\n{{0x1e,0x85,0xc9,0xe4,0x51,0xb7,0xac,0xf8,0x01,0xd1,0x6b,0xc8,0x26,0x8e,0xb4,0x2a,0xe8,0x5c,0x72,0xc6,0x8e,0x9f,0x90,0x92,0x7a,0xa0,0xf3,0xb5,0x0b,0xef,0xd2,0x29,},{0xa6,0x9d,0x05,0x7f,0x4b,0x74,0x38,0x11,0xe0,0x7a,0xc7,0x45,0x61,0xc2,0x25,0xbe,0x03,0x81,0xc7,0xd5,0x84,0x9e,0x60,0x18,0x79,0x37,0x01,0xa8,0xcb,0x6c,0x99,0xb5,},{0x6c,0x36,0xda,0x9a,0xd6,0xc4,0x56,0x34,0x3c,0xe6,0x42,0xac,0xa4,0x54,0x92,0x3a,0x52,0xa2,0x84,0x4c,0xe5,0xee,0x58,0x94,0x7c,0x8d,0xf7,0xba,0xb2,0xeb,0xe4,0x67,0x82,0x3c,0x56,0x33,0xe5,0x30,0xb1,0x67,0xd7,0x1c,0x47,0xad,0x95,0x49,0xdf,0x05,0x94,0x3f,0x99,0x42,0x1e,0x17,0x47,0x5c,0x4d,0x4f,0x08,0xde,0xdf,0x6f,0x32,0x05,},\"\\x18\\x9e\\xa9\\xc8\\xd9\\xed\\x14\\xb0\\xde\\x82\\xb4\\x4c\\xbd\\xd5\\x87\\x57\\xa2\\x7c\\x68\\x38\\x3f\\xba\\x59\\x77\\x61\\xf9\\xe8\\x62\\xe0\\x8d\\xe1\\x5b\\x1e\\x44\\xc3\\xdb\\x1b\\xad\\xbd\\xe7\\x69\\x80\\xee\\x39\\xe6\\x99\\x62\\x9f\\x6f\\xcf\\xef\\x32\\xd3\\x6b\\x33\\x93\\xda\\x2c\\xa5\\xa8\\x1f\\x95\\x9c\\x8b\\x0f\\x1b\\x80\\x1b\\x5f\\xa4\\xc4\\x7c\\xa3\\x95\\x91\\xe6\\x12\\xa2\\x43\\x5c\\x5b\\xaf\\xd7\\x7a\\x5c\\x7a\\xb7\\x43\\x59\\x21\\x09\\x06\\xf4\\x75\\x33\\xb1\\x87\\x9e\\x2a\\x5a\\xf5\\x86\\x4d\\x96\\x1c\\x81\\x46\\xe2\\x5d\\xac\\x77\\x25\\x55\\xe0\\x42\\xa8\\x87\\x26\\x14\\x19\\xab\\x8c\\x9f\\x6f\\x62\\x56\\x25\\x48\\x1d\\xa5\\xb9\\x35\\x26\\xa1\\x31\\xf3\\x7b\\x53\\x4a\\x00\\x50\\xa8\\xa4\\x62\\xb3\\x3f\\x20\\xa7\\xe9\\x4b\\x89\\x15\\x30\\xb1\\x9b\\xf6\\x54\\xee\\x95\\x34\\xc9\\xa8\\x36\\x1d\\x03\\x63\\x5d\\x8d\\x27\\xd4\\x6b\\xe7\\xbf\\x84\\x78\\x1a\\xd0\\xd4\\x2d\\x1e\\x7c\\x48\\x54\\xa4\\x9b\\xa1\\xba\\x45\\x82\\x62\\xfe\\x5e\\xa1\\x90\\x21\\xb9\\x35\\xa6\\x94\\x94\\x92\\xd7\\x0b\\x60\\x5e\\x15\\x19\\x89\\xef\\x26\\x41\\xb2\\xbf\\x81\\xec\\x4b\\x92\\x02\\x0f\\xc7\\x07\\x4c\\x2a\\x63\\x22\\x9d\\x51\\xa9\\x44\\x18\\x6a\\x28\\x89\\x5e\\x8e\\xa9\\x52\\x92\\xc2\\xf8\\x72\\xbb\\x21\\xa3\\x14\\x93\\x99\\xe2\\x3c\\xcd\\x8e\\x2f\\xc4\\xf1\\x7a\\x46\\xb5\\x9c\\x28\\x2c\\x51\\xb5\\x8d\\x00\\x26\\x6a\\x5c\\x16\\xb1\\xce\\x35\\x0d\\x54\\x85\\xe8\\xd8\\x01\\x6d\\xd0\\xa5\\x0a\\x59\\x84\\xcc\\x94\\x81\\x54\\xcd\\x5c\\xe7\\xcd\\xa0\\xee\\x0a\\xb1\\xd7\\x25\\x1b\\xdc\\x70\\xa1\\x78\\x5b\\x8e\\x91\\x03\\x91\\x7f\\x4b\\x91\\x7a\\xb2\\xb4\\x94\\xf3\\x48\\x33\\x89\\xa2\\xf9\\x23\\x75\\x41\\x84\\x9e\\xd3\\xbd\\x56\\x5c\\xff\\xac\\x9e\\x75\\x6d\\xb5\\x6e\\xf5\\xe2\\x34\\x95\\xbc\\x77\\x1e\\x88\\xbf\\xfa\\x87\\x07\\xce\\xea\\x5c\\x09\\xbe\\xca\\xdd\\x05\\x9a\\xb8\\x89\\xd1\\xdf\\x7e\\x88\\x7b\\x71\\xa9\\xe6\\xc2\\x38\\x37\\x8f\\xbe\\x0c\\x36\\x30\\x38\\x66\\x16\\x36\\x3f\\x20\\x7b\\x16\\xc3\\x27\\x0d\\x39\\xac\\xde\\xd5\\x11\\x52\\x99\\x92\\xf4\\xe5\\x98\\x78\\x91\\x21\\xd3\\x16\\x13\\x58\\x10\\x63\\x6b\\xaa\\xde\\x8a\\x28\\xed\\xc6\\x6b\\xbf\\x5e\\xde\\x3f\\x40\\x4a\\x70\\xb4\\x7d\\x35\\x98\\x8b\\xe7\\x06\\xb4\\xea\\xa0\\x30\\x23\\xa3\\x90\\x93\\xd5\\x83\\xcd\\x4c\\xd8\\xbf\\x4c\\x74\\x34\\x1a\\x02\\x8c\\x19\\xd6\\x0d\\xa3\\x1b\\x6a\\x7a\\x03\\x4c\\x08\\x1a\\x2b\\x03\\x0f\\xeb\\x3c\\xd2\\xf0\\x3d\\x0f\\xaa\\xbf\\xfb\\x58\\xe3\\xfc\\x36\\xc0\\x06\\xcf\\xb9\\x29\\x47\\xa7\\xde\\x5b\\xa8\\x74\\x76\\xc1\\xb0\\x51\\xe1\\x82\\x83\\xc0\\x3e\\x9c\\x6e\\x5a\\x5c\\x3c\\x27\\x77\\xd9\\xa0\\x75\\x73\\x72\\x37\\x96\\x64\\xe8\\x2f\\x84\\x85\\x82\\x4f\\xed\\xb7\\x0a\\x4b\\xc4\\xe3\\x56\\xed\\xd1\\xb5\\xce\\x0f\\xb6\\xe4\\x1d\\xe0\\x17\\x16\\x21\\xb8\\x4f\\xaf\\xa0\\x01\\x89\\xaf\\xa8\\xa6\\xa9\\x00\\xb1\\x4c\\x70\\x75\\x8f\\x7a\\xa4\\xfb\\x82\\x40\\x0e\\x0d\\x18\\xab\\x3c\\xd7\\xe4\\x8a\\xcf\\xd4\\x89\\xca\\xb0\\xe7\\x2e\\x71\\x9f\\x79\\xa0\\x7d\\x06\\x6c\\x53\\x1a\\x89\\x1c\\x55\\x29\\x1f\\x22\\x45\\xdb\\xbe\\xe4\\x4e\\x52\\xb1\\xdf\\xc8\\x72\\x7a\\xae\\x38\\x7a\\xb9\\xe7\\x19\\x94\\xa3\\x85\\x4e\\x1a\\xdd\\x73\\xd9\\xa7\\x96\\x5c\\x77\\x55\\x21\\xc2\\xf5\\x40\\x84\\x22\\x76\\xdd\\x30\\x9e\\x2f\\x6a\\x34\\x1e\\x7f\\x0f\\x37\\xf2\\x2b\\xb6\\x62\\x7b\\x6e\\x9c\\xb2\\x5b\\xa2\\x4c\\x6c\\x4f\\x4e\\xb9\\xf5\\xe7\\x62\\x2d\\x88\\xda\\x19\\x84\\xe2\\x9c\\x5d\\xa0\\x01\\x03\\x9c\\x44\\x04\\x2b\\x59\\x35\\x14\\x06\\xa4\\x13\\x36\\xdd\\x77\\x2d\\x49\\x7d\\x3f\\xc8\\xaa\\xc4\\x11\\x72\\xeb\\x5a\\xa6\\x41\\x7f\\xe4\\x22\\xec\\x7c\\x15\\x0b\\x96\\xb0\\x45\\x4e\\xe3\\x31\\x24\\x7c\\xb1\\x53\\x8a\\xef\\xf3\\xec\\xa2\\xd5\\x0e\\x53\\xd6\\xd1\\x31\\x70\\xa7\\x6a\\x00\\x49\\xea\\x0c\\x05\\x90\\x4a\\x63\\x90\\xed\\x14\\xce\\x74\\x91\\xe9\\x7f\\x75\\x4c\\x52\\x22\\xda\\xc4\\xb6\\x11\\x8b\\xa3\\x81\\xf5\\x52\\xe7\\x3e\\xa8\\x49\\x1e\\x3b\\x7a\\xc9\\x49\\x56\\x9b\\x56\\x9c\\xf2\\xd2\\x9a\\x80\\x41\\x0e\\x06\\x5b\\x5c\\xc4\\xa4\\x66\\xbb\\x04\\xeb\\x7a\\x15\\xf5\\x96\\x79\\x2e\\x84\\x90\\xba\\x70\\x02\\xec\\x36\\x15\\x71\\xaf\\x5d\\x8f\\x57\\x67\\x5c\\x95\\x64\\x49\\x47\\x0a\\x2f\\x99\\x55\\x40\\x73\\x67\\xe4\\x09\\xa2\\x32\\x89\\x95\\x53\\x12\\x0a\\x27\\x7d\\xb8\\x63\\xe9\\xa8\\x2d\\xda\\xba\\xe8\\x7b\\x78\\x91\\x45\\xba\\x89\\x8d\\xf3\\xc2\\x8b\\x96\\xfb\\xe3\\x01\\x4c\\xd0\\x85\\xc6\\xe6\\x0e\\xe8\\x83\\x17\\x01\\x03\\x6d\\x99\\xc5\\x42\\x5d\\x58\\xe8\\xbc\\xc9\\xfd\\x92\\x71\\xd4\\x6a\\xec\\x1e\\xb9\\x55\\x13\\x01\\x02\\xea\\xaa\\xb4\\x4e\\x07\\x70\\xc3\\x0b\\x2b\\x12\\x7e\\xfb\\x0e\\x5f\\x8a\\x3f\\x7a\\x0c\\xa3\\x4e\\xc9\\x98\\x4a\\x46\\x01\\x1b\\xc2\\x6b\\xfd\\xe0\\xc0\\x81\\x9b\\xb5\\x47\\x06\\xb5\\x65\\x63\\x8b\\x75\\x42\\xdc\\x4b\\x8b\\xf8\\x09\\x8d\\xc0\\x1f\\x16\\x1b\\x3b\\x12\\x96\\x18\\xb5\\x9a\\xde\\xd3\\x3c\\xb5\\x9c\\xe9\\x18\\x9a\\x67\\x62\\xdb\\xae\\x5b\\x0d\\x34\\xb7\\x1c\\x8d\\xbf\"},\n{{0x51,0xcf,0x86,0x8f,0x82,0x0e,0xed,0xa0,0xdb,0xd1,0x01,0x80,0xf7,0x77,0xe6,0x06,0x5c,0x93,0xa4,0x83,0xc5,0x8a,0x77,0x8b,0x67,0xe7,0xd8,0x42,0x30,0x2f,0xb7,0x67,},{0xab,0x08,0x8f,0x50,0x2f,0xbc,0xf2,0x15,0x0e,0x48,0x46,0xb3,0x4d,0x2c,0x80,0x97,0xff,0x01,0x3c,0x02,0xa8,0xb9,0x7c,0xfc,0xf2,0xb9,0x5a,0x1c,0x72,0xdf,0x3e,0x24,},{0xe1,0x53,0x42,0xa1,0x1c,0xaf,0x89,0x28,0x95,0xe4,0x66,0x22,0x88,0x63,0xd0,0x83,0xb0,0x69,0x2f,0x01,0x06,0x10,0x74,0x8c,0x23,0xdf,0x2f,0x11,0xd2,0x94,0x75,0xba,0xfc,0xe9,0x27,0xca,0xfe,0x7f,0x07,0xef,0xb8,0xc3,0x47,0xed,0x56,0x63,0xe7,0x3b,0xea,0x89,0x53,0x1c,0xed,0xc0,0xc3,0x48,0xe7,0x9b,0x6e,0x58,0xa7,0x57,0x49,0x07,},\"\\x7c\\x2d\\x8e\\xe8\\x2d\\x9a\\xbf\\x8a\\xa9\\xc7\\x24\\xc7\\x5b\\x90\\x99\\x04\\x73\\xf1\\x31\\x76\\x3f\\xe9\\x3b\\x30\\xcb\\x04\\x72\\x35\\x88\\x62\\x1d\\xa2\\xa3\\x27\\x92\\x8b\\x22\\x64\\x9f\\xa0\\x62\\xcd\\xea\\xbd\\x77\\x76\\x15\\x38\\xb2\\x70\\x9b\\x8f\\xb7\\xa2\\x00\\x6e\\x50\\x35\\x09\\x13\\x4c\\x92\\x9c\\x30\\x11\\xe1\\xd7\\x28\\xa5\\x7a\\x4e\\x17\\x51\\x98\\x07\\x5e\\x21\\x42\\x53\\xf3\\xf3\\x0e\\x01\\xb6\\xe0\\x4e\\xab\\xd4\\xde\\x06\\x78\\x95\\x58\\xe6\\x98\\xb1\\x86\\xef\\xe3\\x4b\\x32\\x12\\x95\\x68\\xb3\\xe8\\xd0\\xd7\\xea\\x3f\\xf0\\x0b\\x3f\\x25\\xa4\\x22\\x36\\x89\\x3a\\xa8\\xa4\\x1b\\x67\\x4a\\x0a\\xb5\\xf4\\x1e\\x7b\\x28\\xcf\\x5a\\x7c\\xb7\\x65\\xe1\\x8e\\xad\\x6d\\xe6\\xa3\\x53\\xa7\\x82\\x4a\\x3c\\x49\\x78\\x60\\x38\\xd6\\xf4\\x93\\x7f\\x32\\x64\\xd6\\xcc\\xf0\\xc0\\xa2\\x46\\x5b\\xb6\\x93\\xe5\\x2b\\x3d\\x1e\\x6e\\xb9\\xae\\x4c\\xb6\\x5d\\x09\\xcf\\xf5\\x48\\x42\\xe8\\x53\\x62\\x85\\x7a\\x59\\xf7\\x19\\x8a\\x68\\x8a\\x3d\\xf3\\x85\\x13\\xcd\\xd6\\x1e\\x21\\xdf\\xd8\\x59\\x14\\x2c\\x83\\x44\\xa3\\xb8\\xb2\\xa7\\xc7\\xdb\\x17\\x0f\\x39\\xf8\\x7c\\xa3\\xff\\x8e\\xd4\\x27\\x96\\x2b\\x2b\\x1a\\x14\\xd1\\x22\\xfa\\x2d\\x5a\\xea\\x2a\\x66\\x40\\x11\\x7d\\xd2\\x58\\xfa\\x0f\\xc5\\x4a\\xc6\\xe9\\x40\\xbc\\x16\\xd2\\x11\\xec\\x9a\\xdf\\x91\\x4a\\xb1\\x65\\x78\\xf5\\x21\\xf6\\x55\\xd2\\x12\\x7e\\x79\\xe8\\x71\\xbf\\x7f\\xa7\\x54\\x47\\x19\\xd5\\x8e\\xd8\\x47\\x85\\x0c\\xb2\\x7b\\x99\\xeb\\x8f\\x29\\xb1\\x6c\\xdc\\xc2\\x8b\\x15\\xc1\\x25\\x9a\\xb4\\xd5\\x89\\x70\\x5a\\x40\\x66\\x88\\xf6\\x05\\xa2\\xeb\\xf5\\x80\\x51\\xc4\\x3a\\x77\\xc4\\xe0\\x1f\\xd6\\xf7\\x49\\xd3\\x2d\\xb4\\xe8\\x9f\\x26\\x3c\\x2c\\x16\\xde\\x18\\x1f\\x0e\\x6b\\xdd\\x0a\\x6a\\x64\\xff\\xe6\\xf1\\x82\\x94\\x44\\x09\\x6d\\x9f\\x3e\\x2b\\x67\\xe4\\xbb\\x00\\x66\\x50\\xb5\\x92\\x9d\\x1f\\x82\\xeb\\x11\\xbb\\xed\\x24\\xe8\\xf1\\x01\\x8a\\x73\\x84\\x60\\x5a\\x3c\\xf2\\x9a\\xb5\\x98\\x33\\x79\\x39\\xc7\\x6a\\x3b\\xe8\\x61\\xe4\\x83\\xc5\\x80\\x5e\\xc3\\xce\\xe4\\x5e\\x34\\x24\\x84\\x7a\\x08\\x55\\x8d\\xcc\\x99\\x49\\x9f\\xb9\\x38\\x2a\\xca\\xe5\\x6c\\xdc\\x87\\xfb\\xd5\\xb2\\x6f\\xf9\\x4c\\x86\\xf2\\xe1\\x08\\x79\\x43\\x83\\x50\\x1c\\x8b\\x33\\x36\\x68\\x50\\xa7\\x6a\\x0d\\xfc\\x0a\\x7c\\xd7\\x89\\xa0\\x3f\\x01\\xa3\\xe9\\xd9\\xe9\\xae\\x39\\xfd\\x72\\x45\\xdc\\x29\\x29\\x9d\\x24\\xf3\\xb4\\xb1\\x67\\xca\\xcc\\xd2\\x23\\xa9\\x9b\\x6b\\x20\\xa3\\xb6\\x73\\xdc\\x5f\\x74\\x66\\xd0\\xb2\\xf8\\x15\\x09\\x8a\\x49\\x7c\\xca\\xf8\\x04\\x20\\x16\\x8e\\xdd\\xbf\\x4d\\xa5\\x7b\\x86\\x66\\xe9\\xd3\\x3c\\x48\\xeb\\x30\\x4b\\x4c\\xfc\\xf4\\x57\\xcd\\x76\\x59\\x54\\x3f\\x6d\\x1e\\x66\\x18\\x90\\xf5\\x62\\xb4\\x3b\\x8b\\x6d\\x1c\\x4d\\xcc\\x07\\x7b\\x60\\xbf\\xa5\\x33\\xff\\xab\\x92\\x8d\\xbf\\xd9\\x55\\xdc\\x51\\x16\\xd7\\x70\\x95\\x0b\\x69\\x0e\\x21\\x06\\xad\\x52\\xd4\\x2c\\x31\\xc2\\x2b\\x88\\x48\\x89\\x43\\x32\\xb5\\xc6\\x99\\xe5\\xc3\\x31\\xfb\\x38\\x1e\\x58\\x12\\xe7\\x52\\x6f\\xdf\\x4b\\x8a\\xa2\\xda\\xaa\\x2c\\xa2\\xcf\\xb9\\xc9\\x21\\x11\\xb6\\x1c\\xbc\\x3d\\x1e\\xef\\x6c\\x8c\\x67\\x37\\xf0\\x55\\x88\\xf0\\x44\\x67\\xdb\\x83\\x30\\x84\\x3a\\xcc\\x98\\xdc\\x1a\\x16\\xfb\\xd9\\xd9\\xd9\\x4b\\xd8\\xbf\\xde\\x26\\xc3\\xf7\\x1d\\xee\\x72\\xb5\\x09\\x10\\xc3\\x6b\\x24\\x0f\\x80\\x2a\\x61\\xca\\x16\\x37\\x2f\\x6f\\xfa\\xad\\xb2\\xbe\\x4e\\x85\\x3c\\x5e\\xd6\\x9a\\x3d\\x1f\\x6c\\x7b\\x2d\\xe5\\x13\\xc5\\x3a\\x3f\\xdd\\x0a\\x67\\x6f\\x83\\xd0\\x9d\\x5c\\x51\\x17\\x60\\x47\\xd9\\x20\\x07\\x16\\xbf\\x22\\xba\\xe4\\x5f\\xe0\\x1b\\x3e\\x0c\\x2c\\x51\\xc1\\x6e\\x46\\xad\\x06\\x37\\xf7\\x9f\\x9b\\x4d\\x83\\x86\\x77\\x04\\xfe\\xda\\x9f\\x22\\x78\\x31\\xde\\xa2\\x63\\x39\\x9c\\xa2\\x77\\x1a\\x4e\\x78\\xb4\\xdf\\x8a\\xc0\\xde\\x6a\\x94\\x1e\\xab\\x37\\x0b\\x1f\\xdb\\x47\\xda\\xf6\\x64\\x2a\\xae\\xaa\\x63\\x17\\x0f\\xa9\\xb3\\xd1\\xe1\\x62\\x8f\\x7c\\x4e\\x7c\\xf0\\xea\\x8b\\x8a\\x8e\\x51\\x8c\\xba\\xce\\xf9\\xad\\xe8\\x4d\\xf0\\x32\\x48\\x48\\x47\\xff\\xb6\\x1b\\xbd\\x07\\xe8\\x72\\x7c\\xc4\\xc2\\x5d\\xa5\\x77\\xb2\\x64\\x51\\x9b\\x49\\x99\\xfa\\x7c\\x0b\\xc3\\x23\\xd4\\xf3\\xf9\\x73\\x9f\\x78\\x0b\\x9b\\x2c\\x23\\xc7\\x78\\x55\\xee\\x5f\\x6d\\xcc\\x40\\x15\\x44\\xd6\\xb6\\x4b\\x27\\x70\\x15\\x8f\\xdc\\x6c\\x12\\xf4\\xd8\\x9b\\xeb\\x04\\x4e\\x0e\\x85\\xac\\x7a\\x68\\xd4\\x29\\x17\\xb1\\x34\\x51\\x14\\xb9\\xa6\\x72\\xd1\\x23\\x1b\\x2c\\x6c\\x0f\\x96\\x9f\\x20\\x35\\x31\\xe7\\x1b\\xbb\\x40\\x05\\xb1\\x03\\xa7\\xdc\\x3a\\x58\\xb5\\xb8\\x24\\xa7\\xe0\\x1b\\x6e\\xb9\\xf4\\x96\\xdf\\xa6\\x4d\\x64\\xd8\\xc6\\x77\\x7f\\x53\\xaa\\x58\\xd5\\xda\\x04\\x6d\\x72\\x6f\\x55\\x45\\x4c\\x88\\xb6\\xd7\\xd4\\xab\\x0d\\x21\\x98\\xa8\\x97\\x09\\xf1\\x18\\xa6\\xb3\\x24\\x60\\xb9\\xeb\\xce\\xff\\x3f\\xdd\\xc6\\x05\\xda\\x77\\xef\\x3d\\x1b\\xa3\\x0f\\xec\\xf0\\x7b\\xe2\\xf5\\x31\\x3f\\x4e\\xe6\\x35\\xaf\\x5e\\x95\\x61\\xd8\\x77\\xe9\\x9c\"},\n{{0x54,0x3d,0x5f,0x1d,0x4a,0x6e,0x10,0x29,0xb1,0x91,0x41,0x38,0xfb,0x1f,0x46,0x59,0xe6,0x94,0x56,0x55,0x72,0x07,0x40,0x66,0x88,0xa2,0x03,0x5c,0xbb,0xb2,0xa6,0x8a,},{0x3c,0x83,0x79,0x0c,0x3b,0x45,0x53,0xde,0xae,0x4f,0x84,0x3b,0x50,0x1d,0x26,0xf6,0x16,0x70,0x93,0xee,0x54,0xe2,0x79,0x75,0x9f,0xfa,0xd8,0xcb,0xc0,0x61,0xe7,0x20,},{0x55,0x20,0x11,0x94,0x02,0x6f,0xd6,0x44,0x8b,0x1d,0x52,0xf8,0x3e,0xd2,0x0a,0xc2,0x84,0xe7,0xe7,0x7f,0xa9,0x2d,0x52,0x95,0xd3,0x38,0x25,0xce,0xa3,0xac,0xa4,0x7e,0xc7,0xaa,0xca,0x2f,0xc0,0x86,0x79,0xf9,0xac,0xfc,0xed,0xb3,0x76,0xfd,0xa4,0x61,0x9b,0xe3,0x27,0x2c,0x74,0x45,0xe8,0x70,0x5c,0x30,0x61,0x41,0xcd,0xe1,0x6c,0x0f,},\"\\xfe\\x00\\x57\\xf0\\x62\\xfc\\x87\\x13\\x24\\xb8\\xbd\\x5d\\x42\\x7e\\x9a\\x52\\x76\\x23\\x1b\\xd3\\x09\\x90\\x7e\\x58\\x81\\xd7\\xae\\x53\\xb1\\xf3\\x70\\xc2\\xa4\\x33\\x02\\xa1\\x65\\x10\\xb4\\x60\\x64\\xa3\\x07\\x36\\xba\\xc9\\x09\\x51\\xf1\\xd9\\x88\\x1a\\xf6\\x2c\\x70\\x14\\x83\\xeb\\xb9\\x27\\x2a\\xd7\\x72\\x12\\xee\\xb5\\xfc\\xbc\\x7e\\xc2\\x28\\xd9\\x69\\xf8\\x90\\x27\\x32\\x11\\x3b\\x98\\xe3\\xbf\\x82\\xdf\\xea\\xdd\\x0d\\xe5\\xe7\\x65\\xd2\\x87\\x0b\\x12\\xd1\\xf9\\xb5\\xa2\\x82\\x97\\xc9\\xfd\\xd1\\x49\\x5c\\xf8\\x77\\x89\\x19\\x6a\\x7d\\x64\\x4e\\xec\\xd9\\x35\\x87\\xdb\\xf2\\x0c\\x28\\xeb\\x09\\xda\\x28\\x66\\x03\\xc5\\x82\\xd2\\x12\\x9a\\x65\\x7d\\xb2\\xd1\\x7a\\xdd\\x35\\x58\\xdd\\xe0\\x29\\xce\\x27\\xb8\\x83\\x52\\xde\\x3f\\x95\\xab\\xa1\\x7e\\x1e\\xd1\\x91\\x37\\x22\\xdb\\x08\\xa7\\x95\\xdf\\xbb\\x70\\xd6\\x2a\\x88\\x02\\x72\\x4c\\xb0\\xf5\\x35\\xf8\\x48\\xd0\\x52\\xaa\\x3d\\xde\\x91\\x66\\x96\\x3a\\x80\\x41\\xfc\\xcc\\x4e\\x60\\xbf\\xb1\\x1d\\xe2\\xbf\\x28\\x6e\\xb6\\x02\\xa4\\xaf\\x84\\x2f\\x4d\\x1a\\x34\\x0d\\x78\\xbb\\xbc\\xb2\\x85\\x7f\\x0c\\x30\\x8f\\x44\\xbb\\x10\\x1e\\x7b\\xc8\\xb7\\x41\\xd5\\x06\\x09\\x4e\\x27\\xbb\\xaf\\xa7\\x24\\x28\\xef\\x66\\x6e\\xa6\\xea\\x16\\xf7\\x99\\xb4\\xee\\x58\\x27\\x8f\\x04\\x59\\x74\\xd8\\x6d\\xc7\\x2c\\xf5\\x26\\x0d\\x96\\xf9\\xc0\\x9b\\x2f\\x11\\x81\\xe1\\xa4\\x50\\x0f\\x92\\x83\\xdc\\x67\\x7f\\x38\\x4f\\xf6\\x4e\\x51\\xe8\\x9f\\x76\\x58\\x20\\x20\\x32\\x6c\\x38\\x8c\\x08\\xa0\\xfd\\x00\\xde\\x73\\xd5\\xd4\\x9c\\x06\\xc0\\xc6\\x84\\x19\\x1a\\x26\\x4f\\xff\\x72\\x6d\\x87\\x2d\\xc3\\xae\\x49\\x6c\\x7b\\x47\\x8c\\xfc\\x61\\xb5\\x17\\x14\\x19\\x2f\\x76\\x46\\x3e\\x3d\\x0a\\xab\\x41\\x0e\\xa1\\x15\\xe8\\xbe\\xfe\\xdb\\x99\\x7d\\xdd\\x16\\x99\\x21\\xb3\\x20\\x7e\\xa6\\x6c\\x1f\\x59\\x45\\x0b\\x76\\x23\\x12\\x9f\\xd1\\xe2\\xdd\\x3d\\xa8\\xf5\\x20\\x63\\x91\\x17\\x13\\x38\\xea\\x0e\\xc8\\xef\\x3c\\x59\\xed\\x8a\\xfc\\x69\\xf3\\x86\\x5c\\x29\\xa0\\x72\\x3a\\x9b\\xbe\\x95\\xa7\\x42\\x68\\x1e\\xf9\\x85\\x7e\\x81\\xab\\xc8\\x0c\\x92\\xd2\\xa7\\x18\\xa8\\x04\\xf5\\x30\\x4f\\xef\\x3c\\x63\\xd7\\x99\\xa6\\xef\\x87\\x82\\xa7\\xdb\\x46\\x68\\x1d\\x0d\\xe3\\x50\\x64\\x46\\x98\\x22\\x67\\xb2\\x15\\x2b\\x0c\\x32\\x18\\x69\\xe2\\x3c\\xce\\x8c\\x4e\\xbe\\xbe\\xaf\\x4a\\xa1\\xeb\\xe9\\x28\\x3b\\x69\\x26\\x05\\x26\\x0f\\xf6\\x21\\xb0\\x3c\\x10\\x82\\x2a\\xa5\\xf6\\xd0\\x3b\\xde\\xf4\\x9c\\x46\\x2a\\x68\\xd4\\x71\\xe8\\x49\\xe1\\x64\\xe3\\x87\\x4f\\x6e\\x9f\\x6c\\xb3\\xb5\\xf2\\x93\\xeb\\x38\\xae\\x52\\x45\\xa1\\x59\\xec\\x42\\x61\\xa9\\xbf\\x6b\\x5f\\x7b\\x76\\x15\\xfd\\x33\\x9e\\xa1\\x27\\x33\\x11\\x3c\\xe7\\x67\\xf8\\x83\\xae\\x66\\x75\\x41\\x7f\\xc7\\x70\\xb5\\x0b\\xd6\\x0e\\x6f\\x20\\xad\\xdb\\x29\\xc1\\xf7\\x50\\x62\\x33\\xe3\\x2a\\x7e\\xbf\\xad\\xab\\xff\\x98\\xcf\\xd0\\x9b\\x2b\\x3b\\xbd\\x3e\\xae\\x00\\x69\\x54\\x8b\\x9d\\x89\\x87\\xaf\\x46\\xca\\x98\\xeb\\x09\\x5b\\xac\\xbd\\x87\\x47\\x24\\xba\\x10\\xf3\\x63\\x3a\\xa0\\x8a\\xb6\\xec\\x26\\x49\\x4d\\xdf\\x68\\x54\\x30\\x9b\\x55\\xd4\\x3b\\xdb\\xd2\\x9a\\x75\\x56\\xf1\\x2d\\xfb\\x23\\xcd\\x0d\\xb4\\xeb\\x39\\x37\\xa6\\x5c\\x4a\\xed\\x96\\xe8\\x7b\\x34\\x65\\x55\\xf9\\xfc\\x68\\x97\\x94\\x3a\\x0f\\xae\\xe6\\x5c\\xcf\\x39\\x4b\\xd8\\x9b\\x38\\x1b\\xee\\xce\\x25\\xd1\\xba\\x68\\xf8\\xfe\\x32\\xc2\\x3b\\x33\\x54\\xf5\\xbe\\x7e\\x3e\\xa3\\xc0\\xde\\xc0\\xf7\\xec\\x2d\\xd8\\x3f\\x92\\xb7\\x30\\x58\\x89\\x2b\\x63\\x8d\\x4c\\x3b\\x72\\x42\\xbb\\x8f\\x55\\xbf\\x08\\x7b\\xa4\\x5a\\x19\\x0a\\x69\\x8b\\xae\\x67\\x5e\\x0c\\xd5\\xe8\\x44\\x6f\\x2b\\x21\\xae\\xb6\\x3d\\x2c\\xae\\xa0\\xf6\\x79\\xa8\\x37\\xe7\\x93\\x57\\x30\\x8d\\x9f\\x0b\\x8a\\xf3\\x1f\\x9d\\x08\\x00\\x8c\\x39\\xee\\x8d\\x34\\x75\\x28\\x71\\x3c\\x88\\x50\\x01\\x7a\\x7f\\x4a\\xb9\\x8a\\x35\\xc7\\x53\\x19\\x40\\xfa\\x76\\x21\\xe6\\x72\\x03\\xee\\x78\\x2d\\xb3\\xa2\\xfa\\xa3\\x0f\\x3a\\xa8\\x50\\xa5\\xff\\x7a\\xae\\xd8\\x4c\\x00\\xff\\xd2\\x14\\xf2\\xc9\\x26\\x17\\x35\\xfa\\xc3\\x25\\x9d\\x50\\xe0\\x3c\\x26\\x52\\x50\\x52\\x79\\xd9\\x12\\x51\\x92\\x7d\\xe5\\xe5\\x6a\\x8b\\x90\\x64\\xcc\\xf9\\xf4\\x5d\\xcb\\xef\\x46\\xe1\\x18\\x9c\\xed\\x2b\\xc7\\x9e\\x6f\\xf6\\x52\\xe6\\x90\\x97\\xac\\xe5\\x56\\x8b\\xb2\\xd5\\xbe\\xf3\\xce\\x21\\xa2\\x5b\\x3f\\x79\\xee\\x27\\x5e\\xa3\\x4e\\x62\\x13\\x80\\x56\\x6d\\x70\\x4c\\xd9\\x3f\\x24\\xdd\\x90\\x20\\x93\\x2c\\xc0\\x52\\x18\\xc2\\x3b\\x5b\\x22\\xff\\xfa\\x7e\\x99\\xee\\x7f\\xe4\\x57\\x87\\x6a\\x5e\\x33\\x64\\xc9\\xa8\\xe8\\xb0\\x49\\xcf\\xa2\\x09\\x69\\x77\\x4f\\x50\\x6d\\x19\\x96\\xcb\\xe6\\xef\\x5a\\x37\\x79\\x3e\\xcd\\xb0\\x4c\\xfd\\xea\\xed\\x7d\\xcf\\x79\\xab\\x27\\x84\\x74\\xdd\\x77\\x08\\x22\\xd4\\xb3\\x6f\\xc6\\x8e\\x4b\\x2d\\xd6\\x61\\xef\\x99\\xde\\x01\\xde\\x6e\\xec\\x57\\xfa\\x57\\x3e\\xde\\x10\\xfb\\xbd\\x5a\\xc6\\xfd\\x6c\\xd8\\xbb\\x4e\\xee\\x50\\x9d\\xbb\\x46\\x10\\x37\\x44\\x01\"},\n{{0xf8,0xd2,0x57,0xfd,0xfc,0xf9,0x97,0x96,0xf8,0xce,0x4d,0x8a,0xad,0xe3,0xb2,0x25,0xa5,0x3c,0x26,0xfe,0xec,0xef,0x39,0x5b,0x95,0x61,0xd9,0xd5,0x87,0xf5,0xa3,0x3c,},{0xf6,0x6b,0xd4,0x87,0x7d,0xf7,0x8a,0xec,0x04,0xca,0x7e,0x77,0x73,0x28,0x99,0xde,0x06,0x77,0x7e,0x69,0x86,0x29,0xf2,0x99,0x69,0xf8,0xfa,0x9c,0x2f,0x47,0xab,0x9e,},{0x92,0x35,0xd4,0x48,0x07,0x86,0x98,0x16,0xe2,0x8e,0x42,0xc8,0x1c,0x80,0x1f,0xfb,0x12,0x1d,0xe8,0x26,0xc0,0xd3,0x3d,0xcc,0x4a,0x4e,0x1c,0x93,0x2d,0x52,0x28,0xb6,0x39,0xbb,0x29,0x4e,0x16,0x09,0x0a,0x93,0xd1,0xf6,0x90,0x4a,0x70,0x04,0x22,0x2f,0xda,0x0a,0x55,0x44,0x6d,0x99,0x01,0xc7,0x23,0x40,0x00,0x7b,0xb4,0x5a,0xe1,0x03,},\"\\x23\\x3e\\x1e\\xf9\\x01\\xab\\xcb\\x69\\xfb\\x48\\x60\\x85\\xd8\\xdb\\x02\\x33\\xff\\x78\\xf3\\x7b\\x13\\x6f\\x0a\\xfe\\x24\\xf7\\xda\\xc1\\x94\\x4c\\x36\\x78\\xe7\\x4f\\xed\\x58\\xa1\\xad\\x54\\x83\\x5b\\x7d\\xbc\\xb4\\x6f\\xff\\x6c\\x35\\x24\\x31\\x22\\x73\\x30\\x0b\\x6d\\x87\\x8a\\x93\\xe0\\x60\\x8a\\x4a\\xba\\xca\\x4e\\x31\\x94\\x72\\x2b\\xb9\\xe2\\x3d\\x17\\x19\\x4d\\x86\\x67\\xb8\\x4f\\x2d\\xb0\\x38\\xc2\\x4e\\xfb\\x8f\\x53\\x40\\x9c\\xf5\\x59\\x4f\\xdd\\xb8\\xbc\\xd6\\x1f\\x74\\xcf\\x07\\x26\\xb5\\x1c\\x65\\x1c\\xe0\\x1e\\xb6\\x6a\\x59\\xb4\\x55\\xf7\\xd8\\xa7\\xd6\\x0d\\x39\\x27\\xe0\\xc6\\xc5\\x4b\\x13\\x8e\\x01\\x92\\x53\\x71\\xd2\\xd9\\xd9\\x62\\xaa\\x98\\x2f\\x5e\\x60\\x85\\x28\\x0c\\xc0\\x5f\\x35\\x69\\x93\\x91\\x1f\\xd2\\x03\\x9d\\xfc\\x34\\x21\\x17\\x97\\x02\\x91\\x38\\x1d\\x82\\x02\\x7d\\xb3\\x6c\\x79\\x91\\x00\\x05\\x7d\\x93\\x52\\xb2\\xcd\\x87\\x9d\\x9c\\x82\\xaf\\x73\\x4b\\x7f\\xa2\\x97\\xd2\\x11\\x49\\xc9\\x78\\xaa\\x5e\\x12\\x5b\\x20\\x37\\x2a\\x9b\\x2e\\x0e\\xd3\\x57\\x33\\x7e\\xfa\\xea\\x13\\x91\\xf3\\xb9\\xef\\x11\\xe3\\xe5\\x13\\x5b\\xb7\\x0b\\xdb\\xe3\\x2a\\x9b\\xdb\\x7c\\x3c\\x42\\xd5\\xd5\\x7c\\xc8\\xda\\xb6\\x81\\x16\\x28\\xa0\\x10\\x89\\x49\\x5c\\xb8\\xa4\\xa7\\x6a\\x48\\x29\\x6c\\xd8\\xdf\\xaf\\xc0\\x05\\xad\\x49\\xd7\\x0b\\xb1\\x9f\\xac\\xa2\\x08\\x4a\\x1b\\x6f\\x5e\\x48\\xd2\\x3c\\x03\\xfb\\xcf\\x6f\\x10\\x6d\\xb7\\x70\\xf0\\x7c\\x33\\xe8\\xe7\\xf4\\x75\\x7d\\xa9\\x04\\xa4\\x4d\\xd0\\xe7\\x38\\xf3\\xd5\\x73\\x3a\\x32\\x93\\x75\\xce\\xd7\\x4f\\x3c\\x42\\xbf\\xcd\\xbb\\x91\\x01\\x00\\x45\\x5d\\x6a\\xa7\\xd2\\xe3\\xe3\\xaa\\xa5\\x8a\\x82\\x96\\x30\\xd3\\x76\\xb0\\xb4\\x66\\xdc\\x85\\xaa\\xc4\\x8f\\xe2\\x69\\x94\\x6a\\x7b\\xc7\\x2d\\x91\\xeb\\x37\\xde\\xd2\\xf4\\xa7\\x7c\\x68\\x4b\\xe0\\x10\\x93\\xfd\\x12\\xde\\x9d\\x9d\\x83\\x19\\x9c\\xcc\\x50\\x95\\x9a\\x48\\xd6\\xe9\\xa4\\x14\\x27\\x56\\x60\\x92\\xf0\\x4a\\x0f\\x95\\xca\\x52\\x37\\x2e\\x07\\x62\\xb9\\x66\\xce\\x62\\x32\\x05\\x5a\\x4f\\xd7\\x57\\xc6\\x1b\\x8b\\xad\\x83\\xba\\xef\\x91\\xa3\\xc2\\x77\\x2f\\xb3\\x2e\\xad\\x8f\\x59\\x1a\\xc1\\xe0\\x2b\\xbf\\x90\\xa7\\xf6\\xc3\\x90\\x79\\xb8\\x6f\\xb8\\x14\\xcc\\x24\\x2e\\x98\\x0f\\x0b\\x8b\\x1a\\x2c\\xec\\xb8\\xe6\\xd4\\xe8\\xa5\\x21\\x1b\\xf8\\xba\\xbf\\x38\\xe8\\x29\\xab\\x98\\x83\\x60\\x8b\\xd6\\xd5\\x9e\\xa5\\xe8\\x36\\xa9\\xb4\\xa4\\xfb\\xed\\xed\\x1b\\xea\\x2f\\xfe\\x97\\x7e\\x8c\\xf3\\x61\\x5c\\xa4\\xa5\\x0f\\xea\\x1f\\x05\\xf1\\xfe\\x53\\xc8\\xea\\xc5\\x00\\x32\\x3e\\x1f\\x52\\xa8\\x06\\x83\\x15\\x39\\x95\\x79\\x88\\xd7\\x9a\\xcc\\x7b\\x54\\xf7\\xd0\\x2b\\x48\\x0c\\x46\\x9f\\xd6\\x95\\x40\\xfe\\xa4\\xbd\\xd6\\x8c\\xbd\\xc6\\x8c\\xf9\\xc7\\x87\\x2f\\xd7\\x92\\x59\\x1b\\x01\\xe9\\xd9\\x90\\x2d\\x8a\\x61\\x4f\\x4c\\x21\\x82\\x3f\\x23\\x50\\x8f\\xfd\\x49\\xff\\x21\\x8b\\xea\\x92\\x2e\\xc1\\x41\\xef\\xf6\\x0d\\xa1\\x77\\xcc\\xad\\x7d\\x7b\\x9d\\x44\\x4f\\x3b\\x03\\x45\\x81\\x15\\xf1\\x16\\xcc\\x6e\\x37\\x62\\x5c\\x39\\xcb\\xad\\xf0\\x93\\x62\\xf3\\x1d\\x33\\xf4\\xc1\\x3c\\x33\\xb6\\x29\\x20\\x07\\xf2\\xca\\xfd\\x19\\x4f\\x62\\xc6\\x43\\xe7\\xa2\\x55\\x71\\x56\\x4f\\xeb\\xad\\x7d\\x33\\xe3\\x64\\xb6\\x33\\xd0\\x08\\xb0\\x90\\xd7\\xa0\\x91\\x35\\x8b\\xc6\\x9c\\x56\\x7b\\x95\\x22\\xb5\\xc1\\xcd\\x01\\x21\\x8d\\x38\\x52\\x9a\\xeb\\xb0\\x3d\\x9c\\x2a\\x5e\\xb2\\x28\\x5a\\x71\\x76\\xf9\\x8c\\x28\\x03\\x6f\\x21\\xe1\\x9e\\x92\\xb4\\x06\\xe9\\x48\\x95\\xfa\\x28\\x1b\\x35\\x22\\x8f\\xbf\\x76\\xe7\\x3e\\x17\\x58\\xaf\\x1b\\x43\\x4a\\x4d\\xf9\\x8e\\x8c\\xc5\\x56\\xb9\\xd8\\x3f\\x6b\\x0b\\x7f\\xf5\\x2c\\x68\\x0f\\x65\\xef\\xe4\\xe0\\x0c\\x59\\xb4\\x6c\\xe5\\x93\\xbf\\x98\\x89\\x98\\x05\\xd0\\x2b\\x91\\x65\\xb7\\x42\\x98\\x49\\xe7\\x39\\x53\\x77\\x0a\\xe3\\x93\\xe4\\xf1\\xf9\\x7c\\xb9\\x0c\\xd6\\x15\\x9c\\xc9\\x39\\x52\\xae\\x8a\\x4d\\x3d\\x56\\xa9\\xa9\\x5d\\xf7\\xcf\\xab\\xac\\xd4\\xd0\\x30\\xd7\\x36\\xea\\x45\\x4d\\xfa\\x4b\\x4a\\xed\\x1b\\xcd\\x88\\x5d\\x2f\\xbe\\xa5\\xff\\xa2\\xcf\\x29\\x27\\xc1\\x37\\xc8\\x6b\\xe4\\xfe\\x01\\x64\\x12\\x62\\x8f\\xe7\\xa0\\xa0\\xf0\\x2b\\x6b\\x6a\\x9a\\x21\\x68\\x93\\x2b\\x94\\x3f\\xf8\\xb2\\x8d\\xd5\\x87\\xe7\\x72\\x87\\x79\\x0a\\xaa\\xa6\\x9a\\x98\\x50\\x6c\\x76\\x4e\\x6f\\x5b\\xa6\\x33\\x8c\\x09\\xf3\\x82\\xe1\\xb9\\x87\\xd9\\x9f\\x14\\xa3\\xe1\\x95\\x8c\\xb6\\x2a\\xe6\\x70\\x5a\\x57\\x7f\\x9f\\xfc\\x67\\x30\\x64\\x01\\x12\\x87\\x41\\xa8\\xd0\\xaf\\x03\\xc0\\xaa\\xaf\\x6a\\xf0\\x6b\\xd8\\x8e\\xe4\\xb0\\xaf\\x67\\x03\\xe0\\xea\\x60\\xb0\\x40\\x9a\\xce\\x24\\x57\\x2f\\xb3\\x86\\xe0\\x7e\\x9c\\x22\\xc9\\x68\\x6b\\xdc\\x66\\xd4\\xfc\\xf3\\xc7\\x46\\x1d\\x38\\x33\\xa4\\xc3\\x01\\x32\\x43\\x60\\x7d\\x4d\\x15\\x82\\x17\\x18\\x73\\x26\\xdf\\x51\\x72\\x5a\\x6b\\xc5\\x11\\x6e\\x99\\x0b\\xef\\x8a\\x5a\\x95\\x79\\x60\\x02\\x07\\x20\\x6b\\xfc\\x3a\\x6d\\xcf\\x07\\x46\\xef\\x75\\x6f\\xd9\\x39\\xe1\\x87\\xf6\\x68\\x75\\x07\\x16\\xc0\"},\n{{0x8d,0xa9,0xf5,0x4d,0xa0,0xb6,0xa5,0xa3,0x89,0x85,0xb8,0x8b,0x71,0x33,0x9d,0xc7,0x38,0x4c,0xfd,0x5a,0x60,0xbe,0xe1,0x59,0xc3,0x94,0xc2,0x23,0x63,0xbc,0x7e,0xdd,},{0x1a,0xc1,0xa8,0xed,0xeb,0x21,0x7a,0xe9,0xb3,0xa3,0xde,0x53,0x0d,0x24,0xd8,0x3e,0x11,0xfb,0x65,0x38,0xcc,0x70,0x9b,0x52,0x99,0x4f,0xa9,0xc3,0xf1,0xfa,0xdd,0xc8,},{0xf6,0xdc,0xc2,0xd2,0x7b,0xaf,0x16,0xc4,0xf4,0x81,0x7f,0x87,0x49,0x91,0x57,0xd3,0xac,0x1f,0x84,0xed,0x39,0x8a,0x5e,0x8b,0x0d,0x50,0xf4,0x2e,0xdd,0x73,0x85,0xcf,0x06,0x33,0x7a,0x02,0x36,0x10,0x99,0x70,0xb7,0x9c,0xa0,0x9d,0x7c,0x98,0x31,0xc8,0x76,0xa8,0x02,0x79,0x94,0x21,0xc2,0xab,0xd0,0x75,0x87,0xf5,0xeb,0x66,0x16,0x0f,},\"\\xbd\\x53\\xba\\xba\\x66\\x57\\xd8\\xdb\\x8b\\xec\\xae\\x6e\\xab\\xff\\xa5\\x2b\\x01\\x5a\\x5a\\x05\\xfd\\xd2\\xe0\\x70\\x64\\x7d\\xe9\\x6f\\x9c\\xa4\\xdd\\x21\\x9f\\xe0\\xda\\x60\\x8f\\xa0\\x44\\x7f\\x46\\xd1\\x7c\\x9a\\x35\\x82\\x44\\xcd\\x54\\x08\\x59\\x65\\x82\\xcc\\xd3\\xcd\\xd0\\x15\\x1d\\x6f\\x09\\x23\\xe6\\x3d\\x16\\x68\\x37\\x84\\x5f\\x27\\x3f\\xca\\x7a\\xf6\\xc8\\x9d\\x8d\\x52\\x46\\x17\\x5c\\x21\\x67\\xfb\\xb9\\xc2\\xeb\\xf6\\xa7\\x59\\x54\\x91\\xf9\\x7a\\x97\\x13\\xb0\\x2b\\xdf\\x41\\x3e\\x20\\x9a\\xb2\\x2d\\xb7\\xdd\\x2b\\x37\\xfc\\x49\\x43\\x69\\x18\\xcc\\xeb\\xe5\\x74\\x6b\\xc6\\x4d\\xdd\\x6d\\xce\\x19\\xec\\x45\\x58\\xc4\\x0e\\x08\\x96\\xe2\\x19\\x09\\x28\\x0c\\xba\\x06\\xd1\\x6b\\x72\\xf3\\x1d\\x98\\x76\\x85\\xd0\\x71\\xdb\\x81\\x55\\xe9\\x9e\\xbc\\xc6\\xc8\\x21\\xd9\\x26\\x83\\xfd\\xce\\xe0\\x86\\x68\\xa5\\xed\\x58\\xf8\\x39\\xd9\\xed\\xaf\\xb9\\xf1\\x45\\x9d\\x48\\xde\\x8e\\x1b\\xb6\\xf7\\xce\\x84\\xda\\x0b\\xe4\\x11\\xc8\\xf7\\xbe\\x1b\\x9a\\x24\\xbc\\x5d\\x0f\\xe3\\xa9\\x6b\\x02\\x35\\x07\\x50\\xa5\\xcb\\x25\\x0b\\x49\\x55\\x5a\\x48\\x76\\x72\\xbd\\xff\\x3c\\x3f\\x78\\x4e\\x3f\\xb6\\x3c\\x1c\\x97\\xba\\x6a\\xe4\\x3a\\x10\\xe1\\x96\\xf1\\x88\\xdc\\xc6\\x35\\xe2\\x14\\xe2\\x9d\\xf5\\x09\\xe5\\x60\\x8a\\x53\\x67\\xaa\\x28\\x00\\xc1\\xa9\\x6a\\xd9\\x36\\xa9\\xe2\\xa5\\x79\\xb8\\x59\\x2e\\xc1\\x3a\\x35\\x93\\x36\\xa6\\x27\\x88\\xc3\\xec\\x55\\xc0\\xff\\xd6\\xa7\\xd4\\x9e\\xcb\\x7c\\x68\\x2e\\xfa\\x30\\x81\\x99\\xf7\\x08\\xd7\\x9d\\x0e\\x88\\x56\\x36\\x6d\\x26\\x9f\\xab\\x24\\xeb\\x1a\\x07\\x5c\\x96\\xc8\\x81\\xca\\xb8\\x97\\x08\\xce\\xd2\\x79\\x23\\x0d\\x3f\\x1f\\x3e\\xe1\\x73\\x67\\x22\\x83\\xeb\\x8d\\x8a\\x82\\x40\\x38\\xf6\\x48\\xac\\x43\\x72\\x75\\xd7\\x5a\\x0e\\x15\\xf7\\x1c\\xe5\\x6a\\x8a\\xeb\\x77\\x1f\\x07\\xa7\\xf3\\x2a\\xfc\\x9d\\x61\\x2a\\x13\\xbd\\x83\\xb7\\xf9\\x39\\x90\\xd3\\x8f\\xc3\\xf4\\xf4\\xab\\x8a\\xa9\\x43\\x0c\\x65\\x73\\x6e\\xb6\\x4b\\x16\\x80\\x6e\\x99\\x5c\\x1c\\xe9\\xdc\\xf4\\xc5\\x54\\x4e\\x7b\\x3d\\x01\\x54\\x1c\\x57\\x21\\xbb\\x4b\\xe4\\xcf\\x0a\\xe3\\x82\\xa0\\xc1\\xb1\\x69\\xd8\\xe4\\x18\\xde\\xfd\\x55\\x94\\x42\\xac\\xea\\x14\\xb0\\x0d\\x70\\x5b\\xcf\\xa7\\x8b\\xe0\\x75\\x6a\\x8f\\x37\\x7c\\xbf\\x18\\x3b\\xf2\\x59\\x06\\x87\\x41\\x15\\xd8\\xce\\x4c\\x3b\\xa8\\x74\\x10\\x29\\x38\\xa4\\xea\\x16\\x03\\x6d\\x91\\xa4\\x2c\\x5f\\x8f\\x18\\x86\\x55\\xca\\xcb\\x00\\xc8\\x8e\\x3a\\x68\\x50\\x88\\x16\\xe5\\xe1\\xc3\\x1d\\x27\\x18\\x0b\\xbb\\xa9\\x51\\x8a\\x96\\x30\\x72\\x6d\\x7d\\x04\\x7d\\xd8\\xd2\\xc0\\x40\\x12\\x19\\xe1\\x4e\\x6b\\xad\\xfc\\x9b\\x95\\xb7\\x7a\\x6a\\xce\\x9b\\xea\\x71\\xd1\\xb4\\x7c\\x21\\x89\\x03\\xa1\\x15\\xad\\x02\\x9e\\x7f\\x20\\x39\\xea\\x23\\xcf\\xd1\\xfa\\x6a\\x44\\xd0\\x89\\xfc\\xac\\xb6\\x78\\x15\\x3d\\x67\\x4c\\x0e\\x08\\x17\\x64\\x99\\x55\\x95\\xcb\\x68\\x94\\x89\\x5f\\x08\\xe2\\x5b\\x98\\x4e\\x3a\\x69\\x4c\\x92\\xfc\\x7c\\xbe\\x0f\\xfc\\x46\\x97\\x23\\x0b\\xcb\\x0c\\xa4\\x08\\xc2\\xd7\\x08\\x5c\\x11\\xba\\xde\\xb3\\xe6\\xc0\\xe7\\x5e\\x6c\\x49\\x8d\\xb1\\xbe\\xc1\\xed\\x2a\\x3e\\x24\\x45\\xc3\\x2b\\x19\\x13\\xa8\\x95\\x00\\xf6\\x9e\\x7f\\x23\\xf4\\x1d\\x62\\xe5\\xc1\\x89\\xf3\\x9a\\x05\\x6c\\xb9\\xfc\\x68\\xa4\\x52\\x02\\x3a\\x33\\x3f\\x75\\x22\\x0c\\xb9\\xb9\\x44\\x84\\xac\\xac\\x6b\\xbc\\x67\\x1f\\x59\\xff\\xa0\\x72\\xb7\\x1a\\x18\\x96\\xa1\\xb3\\x06\\xe9\\xdc\\x55\\x8d\\xa0\\xec\\x20\\xf3\\x73\\xe4\\xc3\\x55\\xe0\\xc5\\xec\\xcb\\xbf\\x13\\x50\\xc8\\xc0\\x79\\x14\\x89\\x2c\\x45\\x4d\\xef\\xce\\xfb\\x71\\x7b\\xe3\\x4d\\x08\\x7a\\xeb\\x24\\x4a\\x86\\xff\\x49\\xa6\\xc4\\x70\\xaf\\xb3\\x6b\\x40\\xfe\\x8b\\x71\\xc5\\x05\\xa4\\xff\\x7a\\xf2\\x98\\x4c\\x65\\x28\\x49\\x38\\xec\\x0e\\x40\\x52\\x31\\x52\\x1f\\x48\\x10\\x14\\x7d\\xc4\\xe3\\x73\\xfd\\xab\\x66\\x47\\xb8\\x6f\\x79\\x82\\x75\\x02\\xfd\\x08\\x7e\\x27\\xf3\\x10\\xd6\\xb3\\x12\\x36\\x31\\x13\\x84\\x21\\x55\\xc5\\x7a\\x32\\xba\\x03\\xb6\\xcf\\xf9\\x65\\x53\\x0b\\xd7\\x95\\xfc\\x29\\x2e\\x24\\x1c\\x9b\\x6c\\xa0\\x85\\x14\\x00\\x32\\xef\\xe7\\x46\\xf3\\x7d\\x57\\xe9\\x58\\x42\\x11\\x84\\xb8\\xa4\\xc1\\xa6\\xa1\\xe3\\x7d\\x45\\xe0\\x77\\x31\\x98\\x33\\x06\\x8d\\xdc\\xb8\\x9d\\x38\\xc7\\x5b\\xeb\\xa1\\xa6\\xe8\\xe4\\x05\\x28\\x88\\xec\\x18\\x16\\x2d\\xd6\\xff\\x0c\\x59\\xa2\\xfd\\x0b\\x47\\xf3\\x11\\x91\\x95\\x68\\x0f\\xfc\\xcd\\xdf\\x5f\\x76\\xb3\\x5f\\x02\\x2a\\xa6\\x6b\\xd1\\xac\\x56\\xf1\\xae\\x33\\x3e\\x9b\\x9d\\x04\\x6f\\x0b\\x79\\xa8\\x92\\xec\\xc4\\xf8\\xd2\\xf3\\x1e\\x17\\x53\\x6c\\x4c\\x62\\xa9\\xb5\\xe0\\x63\\xdd\\x2d\\xce\\x37\\xd3\\xd0\\xac\\xb4\\x20\\x23\\xeb\\x2f\\x2e\\xa3\\x29\\xd3\\x87\\x6c\\x23\\x86\\xa0\\x22\\x76\\xff\\xf9\\xd3\\x08\\xab\\xba\\xdb\\x72\\x74\\x30\\x1a\\x69\\x62\\xec\\xae\\xeb\\x20\\xbe\\xf5\\xe3\\x6a\\xff\\xfc\\x38\\x7c\\xa8\\xe1\\x85\\xe5\\x62\\xb8\\x65\\xb4\\x92\\x04\\xc1\\x7b\\x2a\\x70\\x11\\x9b\\x06\\x1c\\x29\\xc0\\xfe\\x90\\x04\"},\n{{0x7a,0x2e,0xfd,0x39,0x01,0x24,0xd3,0xfb,0xef,0xc5,0x4a,0x57,0x71,0x06,0xe7,0x4b,0x2d,0x1f,0x5d,0xd5,0x04,0xc0,0x50,0xd0,0xd3,0x59,0xe5,0x3c,0x0f,0x5c,0x87,0x2b,},{0xef,0xc3,0x03,0xd9,0x22,0xe8,0x8f,0x70,0xf3,0x8c,0x1a,0x2b,0x92,0x06,0x84,0xef,0x66,0x30,0x34,0xa1,0xb2,0x3a,0xb9,0xd6,0x9b,0x6c,0xe8,0xed,0x87,0x06,0xf7,0xf7,},{0xc2,0x8b,0x34,0x80,0x48,0x05,0xd8,0x1f,0x7a,0xef,0x78,0x49,0x70,0x67,0x0e,0xda,0xa4,0x17,0x23,0x2b,0xcc,0x67,0xda,0x9b,0x51,0xe9,0xc3,0xd7,0x4f,0xc4,0x99,0x1b,0xde,0x97,0xa0,0x6b,0xd5,0x3f,0xa0,0x0b,0xb4,0x40,0xfd,0x56,0x16,0xcd,0x0d,0xe6,0xe9,0xb0,0xd1,0x9f,0x2f,0x68,0xbf,0xaf,0x9d,0x4c,0x51,0x72,0xc4,0xe5,0x20,0x0a,},\"\\x23\\x8f\\xbe\\x9f\\xb3\\x5c\\x72\\x5c\\x6c\\x1f\\x32\\x92\\x48\\x09\\x4b\\xc7\\xda\\x1b\\x27\\x3e\\xdc\\x76\\x99\\xa7\\xe3\\x45\\x2b\\x57\\x88\\xd8\\x78\\x67\\xde\\xfc\\x40\\xa0\\x05\\x90\\xe8\\x75\\x80\\xd2\\xc0\\x27\\x5d\\xf5\\xab\\xcc\\xe0\\xe1\\xaa\\xa1\\x82\\x90\\xbf\\x93\\xb4\\x4e\\x5a\\xd9\\xd7\\x60\\xdd\\x21\\xf1\\xaa\\xca\\x38\\x31\\x78\\xf9\\xff\\xf9\\x13\\x0f\\x73\\x18\\x7b\\xa9\\xd3\\x1e\\xa3\\x60\\x4a\\x1c\\xdf\\x39\\x11\\xe1\\x43\\x77\\xa0\\xce\\x8b\\x44\\x18\\x9a\\xda\\xa7\\xaa\\xc2\\x3b\\x6c\\xdc\\x7a\\x42\\x5b\\x7e\\xa7\\x45\\x50\\x84\\x55\\x70\\x4f\\x9a\\xd7\\xa8\\x95\\x27\\x18\\xc3\\x98\\xb4\\x21\\xb6\\xe0\\x9c\\xb7\\x8c\\xb5\\x2a\\x18\\x14\\xee\\x2e\\x96\\x39\\xec\\x68\\xd3\\x61\\xf0\\xa3\\x20\\x41\\xd6\\xe7\\x42\\x5b\\x4b\\xb3\\x3c\\x70\\x19\\x6e\\x24\\x00\\xeb\\x81\\x2d\\xb8\\x50\\x6c\\x9f\\x32\\x45\\xbd\\x98\\x8f\\xbc\\x89\\x1b\\xe2\\x0c\\xb0\\x69\\x15\\x59\\xfc\\x91\\x6b\\x57\\xff\\x96\\xc9\\xb1\\x44\\x89\\xe0\\x99\\x3c\\xb7\\x39\\xa3\\x9d\\xa2\\x46\\xd0\\x1a\\x6e\\xbd\\x07\\x58\\x35\\x81\\xf2\\x50\\xbf\\x48\\x0b\\xc4\\x4b\\x2c\\x33\\x91\\x54\\x2d\\x59\\x5e\\x4d\\x39\\x94\\x90\\x19\\x5f\\x84\\x45\\xdf\\x63\\x8f\\x34\\x69\\x8f\\x1a\\x96\\xed\\x27\\xb3\\x53\\x3e\\x3e\\xb6\\x7e\\x8f\\x86\\x58\\x65\\xfa\\x95\\x55\\xed\\x34\\xdf\\x11\\x15\\x76\\x41\\xa0\\x0e\\x6d\\x60\\xcf\\x62\\x3f\\xec\\x1a\\x92\\xb8\\x7a\\x15\\xd7\\x65\\x18\\x5f\\xd9\\x05\\x5a\\xcb\\x38\\xd7\\x5c\\x99\\xdb\\x4f\\xce\\x7b\\x0e\\x39\\xfd\\xc3\\xf8\\x51\\xda\\xf6\\x5c\\x7a\\x33\\xf4\\x64\\x81\\x69\\x31\\x83\\x9f\\xef\\xe8\\xe5\\x8d\\x9a\\xb7\\x42\\xb8\\x61\\x87\\x3f\\xd2\\x29\\x18\\x9e\\x59\\xcd\\x4c\\xe8\\x23\\x9f\\xc9\\x54\\x3f\\x53\\x9d\\x2d\\x29\\x61\\x14\\x26\\x6e\\xa8\\xc6\\xfd\\x15\\x2a\\xc6\\xb3\\x42\\xe5\\xd1\\xa5\\x57\\xab\\x35\\xca\\xc5\\x1e\\x2d\\x12\\x12\\xee\\x31\\x7c\\x4d\\x26\\x71\\x68\\x29\\xe2\\x57\\x46\\xdf\\x17\\xd2\\xa6\\x22\\xc2\\x43\\xf3\\xec\\xbb\\x65\\xf5\\x7a\\xb0\\xf4\\x27\\x0e\\x3d\\x06\\x68\\xa9\\x62\\x50\\x22\\x45\\xb9\\x4c\\x06\\xdf\\x0c\\x5e\\x39\\xe3\\x53\\xaa\\x84\\x2e\\xa0\\x80\\xcf\\x50\\x27\\x08\\xb1\\xdd\\xa2\\xd0\\x01\\x82\\x4d\\xe4\\x58\\xd3\\x77\\x62\\xaf\\x2c\\xdf\\xd5\\xa6\\xd3\\xf3\\x5e\\x08\\xa1\\x8e\\x14\\xaa\\x7a\\x64\\x2c\\x51\\xe4\\x04\\x7e\\x63\\x75\\x17\\x84\\x6d\\xf6\\x46\\xd0\\x73\\x36\\xfb\\x17\\x24\\x34\\xe0\\x88\\x3e\\x2b\\x77\\xd8\\xed\\x1c\\x52\\xc9\\xcc\\x63\\x6a\\x56\\xa1\\x9e\\x57\\xa5\\xf1\\x61\\xb9\\x2d\\x1d\\xcb\\xfa\\x49\\x6f\\x34\\x4a\\xe6\\xd4\\xdf\\xdc\\x95\\x69\\xad\\xe4\\x57\\xa4\\x90\\x91\\x36\\x2e\\x5a\\x0c\\xdd\\x81\\xb3\\x75\\x32\\x43\\xfd\\xac\\x30\\xa2\\xd2\\x7e\\xa0\\x26\\xa5\\xe6\\x01\\x44\\x1e\\xcd\\x55\\x37\\xa7\\x20\\x1b\\xdc\\xb7\\xfd\\x58\\xb2\\x40\\xd0\\x22\\x9f\\xdd\\x9b\\xab\\xf1\\x12\\xb5\\x69\\x48\\x12\\x25\\x0e\\x76\\x8d\\x7c\\x0c\\xe6\\xca\\x56\\x5a\\xd0\\x6a\\xb8\\xf7\\x8a\\x5c\\x99\\x50\\xee\\xf5\\x38\\x72\\x6f\\x57\\x6c\\x4b\\xd2\\xe0\\x75\\x5c\\x7f\\x98\\x39\\x29\\x37\\x2a\\x5f\\xe1\\x1c\\x73\\xf9\\xe1\\xfa\\x45\\x3a\\xb5\\x4b\\x58\\x17\\xaa\\xd3\\x59\\x67\\x56\\x12\\x7d\\x84\\xe3\\x11\\x94\\x53\\xe8\\x82\\x5b\\xb8\\x46\\x0d\\x85\\x1f\\x1f\\x7e\\x4a\\x28\\x38\\xa2\\xbe\\x78\\x6b\\x23\\x35\\x04\\xa6\\x91\\xdb\\x0f\\xa2\\x2a\\x5f\\x41\\xfe\\x3f\\xd3\\xc9\\xb5\\x38\\xb0\\x4f\\x40\\x9e\\x09\\x18\\x09\\x48\\x6b\\x28\\xad\\x0d\\xed\\xa7\\xb3\\x8a\\x42\\xce\\xfc\\x48\\xde\\x7d\\x86\\x79\\xc0\\x3b\\xf8\\x77\\x23\\x85\\x11\\x82\\x0d\\x07\\x70\\xcc\\x8d\\x7b\\x41\\x72\\x37\\x78\\x23\\xa0\\xb9\\x91\\x49\\xab\\xb8\\x91\\x8b\\xfb\\x66\\xd5\\xab\\xfc\\xd1\\x00\\x60\\xb0\\x5c\\xb4\\xf2\\x39\\xdd\\x42\\x81\\xd9\\x34\\x83\\x50\\x4b\\x73\\x1e\\xaf\\x5a\\xdd\\x51\\x5f\\x1f\\x3c\\x3b\\x52\\xb4\\xe3\\xbd\\xaf\\x97\\x6a\\x17\\xb3\\xc9\\xec\\x61\\xbf\\xc8\\xe7\\x71\\x16\\x71\\x58\\x04\\x53\\x2c\\xf2\\xdb\\xf2\\x0b\\x7b\\xa5\\xea\\xd8\\x5a\\xfb\\x95\\x2b\\xee\\xc2\\xfc\\xcf\\xf8\\x5f\\xf5\\x07\\x2b\\xa4\\xed\\x6b\\x54\\x38\\xab\\x15\\x20\\xc6\\xef\\x4b\\x0b\\x26\\xf1\\x2e\\x84\\xae\\xdd\\x65\\xce\\x5c\\x7b\\xbe\\x6a\\xcb\\x67\\x72\\xf5\\x93\\xa6\\xb4\\xf8\\x1d\\xdd\\x9d\\x50\\x27\\x46\\x50\\x50\\x47\\xc8\\x12\\xa0\\x06\\x7a\\xfc\\xeb\\x8d\\xc9\\xbf\\xf3\\x0d\\x40\\x87\\xf8\\xd5\\xa3\\x75\\xec\\xa6\\x05\\xa0\\x62\\x27\\x84\\xd8\\xfe\\xa2\\x78\\xcd\\x1a\\x52\\x41\\xad\\x4b\\x3f\\x1b\\x91\\x4f\\x74\\xf7\\x3b\\xc3\\x6e\\xe7\\xcc\\x82\\xd9\\x6e\\xfd\\xa6\\x3a\\x3b\\x67\\x99\\x73\\x0f\\x20\\x65\\x6c\\x12\\x35\\x6c\\x79\\x06\\x9b\\x2b\\xe6\\xf9\\xb7\\x7b\\xe1\\x01\\x98\\x31\\x18\\x82\\x3e\\xa6\\x6e\\x7c\\x20\\x98\\xfb\\xc7\\x2f\\xc9\\xc0\\x39\\xdf\\xe3\\x0f\\x2d\\xab\\xa1\\x3c\\x3b\\xde\\xfb\\x8a\\x78\\x0b\\xeb\\x5c\\xb1\\xb6\\xc2\\x86\\xa6\\xb3\\xef\\x48\\xfd\\x15\\xc6\\x6c\\x04\\x5b\\xa2\\x9f\\x09\\x70\\x41\\x3b\\x98\\x8d\\x0e\\xa0\\x04\\xab\\x84\\xc9\\x39\\x19\\xf0\\x4f\\x9b\\xf8\\xca\\xf5\\x8c\\x4e\\xb4\\x78\\xf3\\x58\\xef\\x8b\\x68\"},\n{{0xef,0x36,0x48,0xcb,0xe7,0x34,0x02,0xab,0x45,0x0c,0xd6,0xec,0x37,0xe5,0x45,0xd0,0xcd,0x2c,0x99,0x9e,0xcc,0x1f,0xa3,0x81,0xa4,0x5c,0x66,0x0e,0x18,0x53,0x30,0x32,},{0x52,0xa1,0xa4,0x52,0x73,0x87,0x26,0x76,0x58,0x2c,0xc7,0x67,0x33,0x99,0x26,0x41,0x4c,0xd5,0xd0,0x3d,0x98,0x0c,0xf6,0x29,0xdd,0xa2,0xd1,0xa2,0x05,0xe9,0x83,0x0a,},{0xf6,0x70,0x79,0x29,0x42,0xec,0x41,0x44,0x28,0x47,0x56,0x38,0x85,0x3c,0x42,0x72,0x8e,0x86,0xba,0x12,0xbb,0xe8,0x59,0x48,0xb3,0x91,0x34,0xcf,0x6e,0x2b,0xd1,0x28,0x13,0xe0,0xd8,0x3e,0x51,0xe6,0x57,0xc9,0x01,0x07,0xad,0x93,0xa4,0x78,0x8a,0xa3,0x83,0x13,0xfa,0x96,0x2f,0x67,0x67,0xa8,0xf7,0x80,0x5b,0xde,0x65,0xca,0x42,0x0d,},\"\\x6a\\x93\\x37\\x8f\\x88\\x0c\\xf0\\xff\\xdb\\x8e\\x07\\xd6\\x83\\xcc\\x35\\x2e\\x2a\\x10\\x33\\xc4\\x50\\xba\\xa0\\xe8\\xc4\\xe1\\x62\\x05\\xfd\\x0c\\x02\\x74\\x3b\\x0e\\xa0\\x64\\x97\\x1d\\x91\\x1e\\x49\\x47\\x13\\xe6\\xd9\\x4a\\x02\\x17\\x2e\\xd0\\x14\\xd5\\x06\\x59\\x2e\\xc6\\xc7\\x0a\\x9c\\x97\\x85\\x52\\x46\\xbf\\x3d\\x26\\xf3\\xcf\\x74\\xf4\\x93\\xc1\\xb6\\x97\\xa0\\xc4\\x14\\x16\\x0c\\x34\\x14\\x12\\x83\\x09\\x85\\x43\\x08\\x06\\xa0\\xcb\\x3c\\x84\\x75\\xe7\\xe5\\xa9\\x73\\x68\\x6c\\x24\\xd5\\xef\\x1b\\xe7\\xd0\\x06\\x50\\x96\\xfe\\xb5\\x2e\\xab\\x26\\x0b\\x5c\\x48\\x8a\\xf0\\x92\\x70\\xde\\x6d\\xec\\xd3\\x3f\\xea\\x85\\x89\\xdd\\x10\\x21\\xba\\xf4\\x1e\\x3f\\x25\\x5f\\xb8\\xfa\\x19\\x16\\xeb\\xd8\\x53\\x1e\\xeb\\x2f\\x88\\x6b\\xb3\\xb3\\xb0\\x4f\\x9a\\xf6\\xb2\\x76\\xc3\\x59\\x23\\xf1\\x0d\\x3a\\x0a\\xf1\\xe3\\xf5\\x8b\\x0d\\x15\\xae\\xd1\\x65\\x04\\x5f\\x20\\x6f\\x3f\\x43\\x0a\\xbd\\xff\\x09\\x44\\x90\\x97\\xe4\\xb2\\x6d\\x00\\xa8\\xf9\\xf1\\xe8\\xf7\\xa1\\x9f\\x38\\x58\\x81\\x24\\xc3\\x28\\xec\\x43\\xa9\\xcf\\xb4\\x3d\\x3b\\x2c\\x6b\\xdf\\x6a\\x3c\\x1a\\x10\\x2e\\x0e\\x33\\x3d\\xe1\\xac\\x21\\x4a\\x6d\\xf7\\x6d\\xab\\x44\\xba\\x76\\xbf\\x03\\x52\\x73\\xb7\\xff\\x62\\x38\\xec\\x82\\x48\\x3b\\x2d\\x2d\\x9d\\x54\\x29\\x1a\\x72\\x27\\x0f\\x88\\x93\\x3b\\x78\\x6c\\xac\\x05\\x1d\\x99\\x0b\\x3c\\xf7\\x40\\x84\\x5f\\xed\\x3a\\x67\\x86\\x7d\\x7c\\x7c\\x05\\x67\\x4e\\x7c\\xb0\\x2c\\xa5\\xb7\\xac\\xdf\\xba\\x38\\x52\\x80\\x3a\\x3d\\x56\\xc4\\xd5\\xc1\\x3b\\xb1\\xd7\\x72\\x34\\x67\\x74\\x1e\\xac\\x1f\\x2a\\x7a\\xcd\\x3a\\x95\\xf3\\xa5\\x16\\x10\\xa4\\x86\\xfc\\x53\\xa9\\x85\\x16\\x28\\xc5\\x57\\xd3\\x6d\\x8a\\x4c\\xd3\\x7a\\xae\\x9c\\x41\\x74\\xdb\\xbd\\xb6\\xbd\\x88\\x5c\\xf4\\x0b\\x38\\x2b\\x8d\\xed\\x24\\xa4\\x52\\x2a\\x27\\x8f\\xef\\x76\\xc4\\x53\\x19\\x06\\x7e\\x55\\x28\\x6e\\x7b\\x08\\xc6\\x03\\x48\\x6e\\x38\\xa0\\xac\\xf4\\x7e\\xde\\xf8\\x48\\xec\\xbe\\x94\\x2e\\xce\\xad\\xb8\\x63\\x6c\\x83\\x3f\\xeb\\x88\\x2a\\x51\\xa4\\x59\\x5e\\x24\\xf6\\x07\\xca\\x3c\\x9d\\xa1\\xb2\\x40\\x4c\\xe5\\xc7\\x47\\xe0\\x62\\x64\\x17\\x4d\\x64\\x50\\x43\\x31\\x70\\x9b\\xef\\x30\\x05\\x5a\\x5d\\x69\\x5e\\x09\\x53\\x7c\\x8f\\x8c\\x1e\\x5a\\x3a\\x5d\\xb0\\x65\\x99\\xe3\\x19\\xdf\\xdb\\x28\\x72\\x96\\x65\\x27\\x3b\\xf8\\x68\\x95\\x5e\\xa5\\x64\\x27\\xf0\\x8b\\xac\\xd7\\x77\\xf1\\x79\\xb3\\x02\\xf3\\xf6\\x8d\\x04\\xf3\\xf3\\x88\\x3d\\x34\\x49\\x55\\xb6\\x55\\xdd\\xc6\\xd5\\x28\\x2b\\x6d\\x4d\\xf1\\xd8\\x36\\x30\\x21\\x0e\\x69\\x91\\x78\\xe1\\x1f\\x72\\x2e\\x9e\\x5c\\xda\\x67\\x28\\x92\\xae\\x9b\\x23\\xe8\\x16\\x9c\\xbb\\x54\\x80\\x93\\xb8\\x3e\\x64\\x3e\\xb4\\x99\\xd9\\x37\\xd2\\x8f\\x38\\x11\\x59\\x7b\\x64\\x84\\x10\\x2f\\x0c\\x8e\\xb8\\xc8\\x88\\x8c\\xda\\xc2\\x29\\xae\\xbf\\x89\\x08\\x6a\\x64\\x95\\xac\\x55\\x1f\\x3b\\xbd\\xf2\\xd1\\xc9\\xa9\\x3e\\xd1\\xd3\\xa8\\x61\\xee\\xcd\\x9e\\xb8\\x39\\x94\\x9b\\xfb\\xe6\\xa4\\xf6\\xe6\\x48\\x6e\\xde\\xda\\xb5\\x22\\x9d\\x53\\x2b\\x58\\x97\\x6d\\x67\\x51\\x2f\\x9f\\x71\\xae\\x79\\xb4\\x14\\x5c\\xa2\\xfa\\x49\\x7a\\x16\\x5f\\x11\\x07\\x17\\x66\\x6c\\xa3\\x34\\x0b\\xbd\\xa8\\xdf\\x1f\\x82\\xb8\\xc0\\x54\\xcf\\x76\\x54\\xc3\\x56\\x90\\x16\\x8f\\x96\\x27\\x7d\\x41\\xc1\\xc2\\x36\\xb6\\x81\\x98\\x17\\x3c\\x6e\\x2b\\x0a\\x20\\x8e\\xf8\\x3c\\x02\\xa4\\x3e\\x47\\x3d\\x90\\x68\\x6a\\xce\\x75\\xb5\\xbd\\x32\\x1b\\x3f\\x54\\x28\\x13\\x27\\xa6\\x73\\xca\\xd4\\xd4\\xad\\x30\\x40\\xd4\\x8c\\xf4\\x93\\xea\\x23\\x1b\\x3f\\xec\\x06\\xf3\\x99\\x32\\xd7\\xf7\\x0a\\x38\\x42\\x8d\\xf8\\xfe\\xe4\\x37\\x05\\x32\\xae\\x5f\\xb1\\x12\\x05\\x9f\\x0a\\x1d\\x4f\\xbe\\x11\\xb5\\xa2\\x3b\\xb8\\x76\\x35\\x42\\x9e\\xd3\\x3a\\xd1\\xf6\\x14\\x80\\x14\\xcb\\xc1\\x60\\xd9\\x3c\\xa2\\x59\\x20\\x53\\xa6\\xe9\\x53\\x78\\xd6\\xcd\\x3f\\x50\\xdb\\x52\\xbe\\x92\\x8e\\x40\\x92\\xfe\\x5d\\x2b\\x70\\x95\\xa9\\x56\\x68\\x64\\xad\\xfd\\xa5\\x9f\\xd5\\xf2\\xfb\\x62\\x54\\xbd\\x59\\x17\\xb7\\x0f\\xa1\\x46\\x99\\x66\\x5a\\x37\\x29\\x7c\\x98\\x3c\\x1b\\xb9\\xef\\xe1\\xc6\\x7b\\x41\\x3d\\xd1\\xa8\\x53\\x0c\\xbf\\x22\\x72\\x97\\xa8\\xbb\\xf9\\x3a\\x8a\\x02\\x45\\x4e\\x8e\\x46\\x1a\\xc2\\x12\\xb8\\x46\\xa7\\x0d\\x5d\\x56\\xd6\\xc3\\xa6\\xe6\\x5a\\x03\\xbe\\x05\\x80\\x21\\x9b\\xdd\\xec\\x88\\xd4\\x03\\x89\\x11\\xfd\\x95\\x74\\x56\\x3f\\x33\\xe0\\xf9\\xe6\\x04\\x46\\x88\\xd3\\xdd\\x48\\xfa\\xc7\\x03\\x86\\x9a\\xa0\\x9d\\x96\\xef\\xee\\x7d\\x6c\\x68\\x07\\x1d\\x99\\x22\\xd5\\xe8\\xed\\x8d\\xc4\\x0f\\x1b\\x79\\x8f\\x1c\\x58\\x0f\\x78\\x59\\xcb\\x84\\xf1\\xe1\\x4b\\x5e\\x74\\xdd\\xea\\x16\\xad\\x5c\\xbe\\xea\\x4c\\x48\\xfb\\xcf\\xfd\\x29\\x53\\x1a\\xcc\\xc0\\x63\\x39\\x38\\xe3\\xbc\\xb2\\x21\\x26\\x76\\xb6\\x1e\\xf9\\x01\\xe9\\xc8\\x31\\xa4\\x17\\x74\\xd8\\x31\\x7e\\xf3\\x5a\\xf7\\x69\\x90\\xbd\\x24\\x93\\x1f\\xde\\x6d\\x40\\x7e\\x22\\xe7\\x63\\xcf\\x6a\\x57\\x90\\xb2\\x37\\x61\\x90\\x8e\\xee\\x60\\x96\\x37\\xa2\\xc1\\x10\\x59\"},\n{{0x2c,0x8e,0xe7,0xfa,0x9b,0xa2,0x8c,0xe7,0x04,0x96,0x76,0x08,0x7b,0x11,0x63,0xb2,0x41,0x11,0x8d,0x34,0xcd,0xf5,0x34,0xae,0xbe,0x8b,0xa5,0x92,0x82,0xa6,0x2a,0xc2,},{0x24,0x4c,0x24,0xf5,0xec,0xb2,0xdd,0x1d,0x14,0x63,0x51,0x22,0x21,0x32,0x5d,0x73,0xc8,0x1e,0xe4,0xd8,0xad,0xb8,0xe0,0x1e,0x23,0x34,0x5c,0xaf,0x9c,0xa5,0x35,0x3b,},{0xca,0x0b,0xb6,0xc1,0x23,0x56,0x55,0x5f,0x6e,0x1d,0x8f,0x5c,0x8a,0xa7,0xb5,0xe8,0x0c,0xd2,0x80,0xe8,0xb1,0xb9,0xba,0x2e,0xc9,0x55,0x0f,0x62,0x2f,0x48,0x2c,0x3a,0x9a,0xd3,0xbe,0x03,0xa4,0xc9,0xdf,0xc1,0x0d,0x01,0x12,0xb0,0x18,0x9d,0xe9,0x4b,0xff,0xaf,0xd7,0x03,0x41,0x14,0xe0,0xe0,0xd4,0x2c,0x23,0xf3,0x2d,0xc8,0x18,0x07,},\"\\x07\\x66\\x9a\\x89\\x64\\xf0\\x63\\x80\\xd2\\xd4\\x98\\x2c\\xb6\\x34\\x9d\\xe5\\x50\\xb3\\x8c\\xbc\\x35\\xdb\\x2c\\xe5\\x72\\xde\\x88\\x7f\\x66\\x30\\x55\\x73\\x6f\\xaa\\xc7\\xec\\x07\\xc3\\x2d\\xf6\\x0e\\xe2\\x59\\x84\\x22\\xbf\\x37\\xe7\\xcf\\x31\\x9a\\xb3\\xc9\\x05\\x56\\x08\\xca\\x0c\\x49\\x75\\x7d\\x76\\x88\\xe2\\x01\\x3b\\x82\\x44\\xf3\\x54\\x04\\xf4\\x5a\\xc2\\x19\\x49\\x7f\\xe9\\x24\\xde\\x93\\xa5\\x8d\\x0f\\x72\\x1a\\xed\\x78\\x25\\xf6\\x3b\\x26\\x67\\x07\\x7c\\x16\\x1e\\xb4\\xdd\\x8b\\xf7\\xdd\\xbd\\xbb\\xc1\\x9a\\x9e\\xae\\x59\\x78\\x97\\x8d\\x5a\\xeb\\x33\\xa0\\x6d\\xde\\x18\\xe6\\x12\\xe0\\x5b\\xdb\\xca\\xe0\\x16\\x1a\\xa2\\x38\\x90\\x38\\x02\\x64\\x29\\x96\\x0d\\xda\\x3a\\xa1\\x7e\\x96\\x7d\\x10\\x77\\x3c\\xa4\\x97\\x35\\xd8\\xec\\xd7\\x40\\x9b\\xe1\\x65\\xc0\\x9b\\xb0\\xb5\\x09\\x69\\x1d\\x59\\x1c\\x18\\x5c\\x93\\xcd\\xee\\xae\\x95\\x35\\x23\\x16\\x54\\x46\\x80\\x52\\x38\\x21\\x45\\x8c\\xac\\xcf\\x52\\x8a\\xc0\\x45\\x4e\\x4c\\xdd\\xc6\\xdf\\x0d\\x1e\\xa5\\xf1\\xf5\\xcc\\x1e\\xee\\xe0\\x5e\\x19\\xa2\\xad\\x0b\\x6a\\x49\\x73\\x6e\\xd8\\x55\\x23\\x36\\xfc\\xfc\\xad\\xbd\\x93\\x1b\\x0b\\x8e\\x96\\x3b\\xe0\\x5c\\x8e\\x70\\x37\\x38\\x85\\x52\\x51\\x2b\\x68\\x23\\x58\\x3e\\x4a\\x14\\x38\\x4c\\xef\\x50\\x29\\x23\\x2d\\x3e\\x0b\\xaf\\xe4\\x66\\x35\\x1b\\x4b\\xb3\\xf5\\x67\\x54\\x5a\\xb4\\x1f\\xa4\\x6b\\xff\\xaf\\xa8\\x77\\xa1\\x2b\\x38\\xa2\\x7a\\xbd\\x64\\xf7\\x7f\\xbb\\x4d\\xb4\\x66\\xff\\x7f\\x70\\x65\\x04\\x14\\x1d\\x3a\\xdd\\x0d\\x73\\x72\\xf1\\x6f\\xe3\\xd8\\xc6\\x9f\\x62\\x99\\xd9\\x39\\x66\\xd6\\x24\\xa3\\x07\\x0e\\xad\\xb8\\xb4\\x9f\\x29\\xfa\\xb4\\x84\\x4c\\x75\\x28\\xa2\\xa4\\x0b\\x66\\x98\\x70\\x60\\x69\\x5c\\xaa\\x66\\xb8\\x67\\x18\\xc5\\x10\\x49\\xac\\xf4\\xcf\\xad\\x38\\x53\\xed\\xb4\\x92\\xe3\\x68\\xcb\\xd0\\x73\\x96\\x8e\\xca\\xa4\\xa1\\xee\\x60\\x46\\xb5\\xe8\\x26\\xe9\\x01\\xf4\\xa8\\x08\\xc0\\x42\\x7c\\x02\\x6f\\xe2\\xf7\\xb2\\xe1\\x96\\x86\\x67\\xb5\\x3a\\x7d\\x36\\xd7\\x02\\xf2\\xff\\x82\\xc6\\x42\\xd3\\x49\\x19\\xf8\\xe9\\xaa\\xaf\\xe4\\x62\\xa3\\xd4\\xf9\\x26\\x92\\xde\\xac\\x75\\x2b\\xe3\\x48\\xf5\\x4c\\xf0\\x89\\xdd\\x9c\\xd0\\x51\\x84\\x6b\\x04\\xb7\\x19\\x31\\xe1\\x9e\\x89\\xd1\\x25\\x86\\x4b\\xfa\\x89\\x48\\xac\\xe0\\xef\\xf3\\x3c\\x45\\x11\\x05\\x69\\xa0\\xdf\\x37\\x53\\xf4\\xc5\\x8d\\x80\\x02\\xb5\\xbc\\x38\\x10\\x2e\\xc2\\xec\\xf6\\x95\\xfa\\xfa\\x89\\x16\\xda\\x90\\x02\\x38\\x7e\\x44\\xf9\\x6d\\xab\\xf8\\xa9\\x82\\xc5\\x3c\\x9b\\xad\\xbc\\x37\\xbd\\xe4\\x37\\xf1\\x46\\xf7\\x7d\\x8f\\x7b\\xaf\\x12\\x87\\x31\\x96\\xb0\\xc3\\x61\\x93\\xaf\\x55\\xf5\\x42\\xd9\\x96\\x8a\\xed\\x80\\x69\\xab\\x9f\\xbc\\xd6\\x81\\x4e\\xc4\\x72\\x79\\x9a\\xd0\\x9c\\x73\\x0d\\x41\\xed\\xde\\xca\\x3b\\x62\\x69\\xd3\\x1a\\xb5\\x23\\xb5\\x95\\x47\\x07\\x73\\x76\\x34\\x5b\\x05\\xf2\\xae\\x69\\xb4\\xee\\x72\\x8c\\x86\\x3d\\x1b\\xc0\\x4e\\x9b\\x7d\\x3d\\x0f\\xcc\\xeb\\x35\\x9c\\xbd\\x08\\x58\\x59\\x7a\\xf2\\xd6\\x06\\x3e\\x25\\x3f\\xae\\x2c\\x3f\\x25\\x03\\x4c\\x33\\xed\\x59\\xed\\xd2\\x78\\x28\\x68\\x29\\x86\\x81\\xca\\xf5\\x64\\xdb\\x8d\\x19\\x36\\x6f\\x34\\xea\\xe8\\x5b\\xa7\\x3c\\x1e\\x23\\x89\\xb0\\xdd\\x78\\xa9\\xd2\\xca\\xa0\\xf2\\x3c\\x9a\\xd5\\xf6\\xcd\\x9f\\x2c\\x4a\\xd5\\xd5\\x89\\x46\\xad\\xb7\\x18\\xcb\\x83\\xda\\x58\\xe2\\xfc\\xbb\\x60\\x25\\xbe\\xf4\\x66\\x0a\\x83\\xe0\\xaf\\x55\\xe2\\x03\\x08\\x02\\x93\\x2f\\x2a\\x89\\x6a\\x09\\x60\\x79\\xb7\\x54\\xc9\\x9f\\x7b\\x64\\x23\\xb4\\x5a\\x86\\x47\\x2e\\x67\\x23\\xef\\x88\\x96\\xc4\\x32\\x4c\\x73\\xd3\\x4a\\xd5\\x8a\\x4c\\x01\\xb3\\x8a\\x97\\xc7\\x3b\\xe5\\xaa\\x7f\\x74\\xa2\\xfa\\x4d\\x07\\x95\\xaf\\x6d\\xbf\\xcd\\x6d\\x4e\\xb4\\x42\\xa7\\xe2\\x04\\xdb\\x4e\\xcb\\x1f\\x8a\\x22\\x6b\\xdf\\xa2\\x1b\\x6e\\xb1\\x71\\xc9\\xe5\\x9f\\x1a\\x19\\x2e\\x23\\xa7\\x6c\\x35\\x2b\\x04\\xd8\\xa8\\x02\\x33\\x98\\x5b\\x77\\xa2\\x9c\\x02\\x01\\x19\\xce\\x65\\x1c\\x7f\\x41\\x83\\xd0\\xe9\\xc1\\x9f\\xe1\\x8a\\xa1\\x02\\x0c\\x25\\xe4\\x58\\x9d\\xee\\x34\\xb9\\x01\\xbd\\xaf\\x9f\\xf9\\x45\\x0c\\x91\\xaf\\x3c\\x1d\\xb6\\x70\\xb4\\x77\\xe0\\xac\\x21\\x07\\x69\\x6c\\x9e\\xc0\\xd3\\x1d\\x82\\x64\\x7b\\x68\\xea\\x19\\x49\\x9f\\xe3\\x4a\\x8e\\x2e\\x7b\\x37\\x8d\\xc7\\xe7\\x54\\x24\\xe8\\xc4\\x56\\x45\\xb0\\xc2\\x81\\x8e\\x9f\\x88\\x5a\\x1c\\x58\\x41\\x5b\\xba\\x1c\\x3f\\x2a\\x77\\x54\\x9b\\xdc\\x46\\x80\\xdb\\xcd\\x16\\x50\\xc7\\x5d\\x0f\\x45\\x2a\\x6b\\x20\\x85\\x91\\xdf\\x0f\\xa6\\xe1\\x81\\xda\\x2a\\xbf\\xab\\x44\\x46\\x21\\xd5\\xf7\\x7c\\x2c\\xd7\\x95\\x56\\x46\\x72\\x46\\x44\\x7a\\x89\\xf0\\xaa\\xac\\xad\\x66\\x0c\\x9a\\x92\\x5e\\xba\\xfb\\xad\\x43\\xc4\\x78\\xa3\\xc8\\x50\\xa2\\x7e\\x01\\x01\\x9d\\x88\\xa5\\xb1\\xdc\\x81\\xb5\\xd2\\xe9\\xf7\\x40\\xa0\\x28\\xcc\\xb7\\x2c\\x1a\\xcf\\x89\\x7e\\xa5\\xad\\x89\\xe0\\xf9\\x44\\x88\\x88\\xd5\\xb1\\x5c\\xe6\\xe4\\x29\\x77\\xf7\\xa7\\x29\\x15\\x5a\\x28\\x4d\\x11\\x87\\x58\\xac\\x65\\xf3\\xfb\\xb9\\x8d\\xeb\\x65\"},\n{{0xdd,0xd8,0xe9,0xff,0x85,0x56,0x79,0x89,0x6a,0x13,0x97,0xb4,0x27,0xdb,0x85,0x43,0xab,0xe8,0xbb,0x5d,0xd1,0x22,0xe3,0xe3,0x02,0xcc,0xfc,0xe5,0xfd,0xc6,0x3e,0x12,},{0x5a,0x9a,0x31,0x2e,0x89,0x2a,0x10,0xb9,0x8d,0x0d,0xcd,0xd2,0x8d,0xb3,0x48,0x1c,0x3c,0x28,0xad,0xd5,0xad,0x0b,0x19,0x46,0x16,0xda,0x4a,0x3d,0xf7,0x66,0x01,0x09,},{0xdf,0x84,0x9b,0x7b,0xd2,0x97,0x45,0xf8,0xbe,0xcd,0xdd,0xf6,0xc9,0xba,0xf0,0x94,0xd7,0xa9,0x8c,0xc9,0x33,0x8c,0x34,0x4e,0xca,0x17,0xfd,0xe0,0x75,0xfd,0xa8,0xd1,0x54,0x32,0x99,0xf6,0x25,0x98,0x23,0x17,0xdb,0x7b,0x3c,0x77,0x3b,0x64,0xf7,0xd1,0xf2,0x86,0x92,0xac,0x45,0x3b,0x81,0xd7,0xec,0x7b,0x7e,0xc3,0x41,0x7a,0xce,0x04,},\"\\x5e\\x8f\\xee\\xc5\\x09\\x35\\x0d\\x2e\\xe7\\x95\\x5b\\x6f\\x3e\\x27\\x82\\x78\\xa4\\xcb\\x48\\xae\\x72\\xb4\\x65\\x89\\xe4\\x78\\xbe\\x59\\x74\\x7d\\xf5\\x39\\x4a\\x16\\x9f\\x19\\xe1\\x0d\\xb5\\x32\\x02\\xa6\\xa5\\x23\\x20\\xb6\\x3a\\x9a\\x2b\\x72\\x3f\\xd3\\x1a\\xa2\\xdb\\x6d\\x58\\xc5\\x73\\x32\\xda\\x31\\x78\\xbc\\xf9\\x66\\xc5\\x3a\\xbd\\xa3\\x5f\\x12\\xda\\xef\\x9e\\xdc\\xf3\\x99\\xe4\\xa8\\xc5\\xf8\\x3d\\x36\\xf4\\x4a\\x17\\xd7\\x98\\x46\\xbf\\xc9\\x6c\\xe6\\x90\\x19\\x4c\\x21\\x9a\\x29\\x89\\x2f\\x03\\x67\\xa7\\xab\\x38\\x44\\x83\\x78\\x79\\xe3\\x81\\x8d\\xb8\\xd7\\x0c\\x4e\\x3f\\xba\\x4d\\x28\\x07\\x34\\x64\\xdf\\x20\\x85\\x95\\x10\\x38\\xfe\\xa4\\x32\\x81\\xb6\\xb6\\x06\\xdc\\x88\\x46\\xb3\\x0b\\x07\\x63\\xf2\\xca\\x82\\xbd\\x50\\x21\\xf9\\x11\\x70\\x35\\xa7\\x7b\\xcd\\x10\\x75\\x47\\x7c\\x5f\\x43\\x21\\x43\\x34\\xd4\\xd4\\xce\\xdd\\x18\\xf7\\x38\\xd6\\x76\\xc7\\xb5\\x1a\\x18\\x5f\\xfa\\x8d\\x04\\x10\\x11\\x86\\xa4\\x95\\x2b\\xbd\\x87\\x22\\xf5\\x39\\x90\\xb6\\x06\\x37\\x04\\x1e\\x11\\x4a\\xeb\\x8c\\xe7\\x11\\x11\\x31\\xd4\\xdb\\x3f\\xb4\\xd3\\x5d\\x99\\x5a\\xd8\\xd6\\x65\\x0c\\x0c\\x4c\\xcd\\xce\\x9d\\xcc\\x39\\xdb\\x18\\x8a\\x68\\x78\\x55\\x62\\x74\\x06\\x26\\xb3\\xae\\x3e\\x02\\x3f\\x40\\x77\\x2d\\xed\\x87\\x6a\\x45\\xcb\\xef\\x74\\xa0\\x58\\xfd\\x78\\xc1\\xa1\\xff\\x2c\\x24\\x51\\xe1\\x11\\xac\\x1b\\x4b\\x7e\\xe4\\xc8\\x1c\\xd7\\x63\\x10\\xd4\\xd2\\x98\\xfb\\x3c\\x49\\xf5\\xe6\\x40\\x19\\x08\\xa6\\x30\\xfa\\x85\\xdb\\x74\\x71\\x80\\x4f\\xe9\\x90\\x84\\x7f\\x0f\\x75\\x94\\x72\\xf5\\x93\\xdc\\xf0\\x2e\\x11\\x3e\\x15\\xe5\\x64\\xd3\\x0d\\x59\\x84\\x69\\x2d\\xa5\\x5b\\x0b\\x7f\\x22\\x19\\xc4\\xac\\x16\\x26\\x51\\x1a\\xcf\\x19\\x4d\\xc7\\x02\\x6e\\xb9\\xd3\\x67\\xa4\\xa2\\xf1\\xdf\\xb5\\x15\\xcb\\x2c\\x08\\xda\\x4f\\xe5\\x95\\xc8\\x58\\x11\\x12\\x0c\\xba\\x2a\\xe7\\xb6\\x6e\\x67\\xc9\\x1f\\xb8\\xfb\\xcb\\x9d\\x99\\xf1\\x3e\\x50\\xfd\\x67\\x46\\x4d\\x90\\xc8\\xdc\\xf6\\x93\\x55\\x23\\xcf\\x6d\\x13\\xfd\\xd1\\x06\\x35\\xb9\\x23\\x2b\\x7a\\x61\\xdc\\xec\\x9a\\x2b\\x92\\x10\\x61\\x41\\x0d\\xf1\\xde\\x6a\\x45\\x16\\x7f\\xb9\\xf6\\xf1\\x09\\xdc\\xc0\\x88\\x91\\xf2\\x03\\xb2\\x74\\xa3\\xb6\\x82\\x71\\xb3\\xf3\\x5e\\x74\\xf9\\x4b\\xdc\\xed\\x0c\\x5f\\xf8\\x63\\x71\\x73\\xa1\\x76\\xe7\\xda\\xcc\\x81\\xf2\\xcd\\xc4\\xfb\\x0d\\x52\\xd1\\xdf\\xa7\\xf2\\x7b\\x55\\x2f\\xd8\\xd8\\x7a\\x1c\\x55\\xd6\\x94\\x7f\\xd9\\x2e\\xd3\\x25\\x3f\\x95\\x94\\xdb\\x7d\\xf1\\x7a\\x7f\\xc6\\xa7\\x5e\\xcf\\x4f\\xaa\\x4d\\x1e\\x21\\xb6\\x76\\xb3\\x72\\x7d\\x77\\xfb\\xd4\\x3f\\xa7\\xbe\\x76\\xbf\\xb5\\x8f\\xc3\\x09\\xe5\\x67\\x5f\\x0a\\x85\\x9c\\xc4\\x7f\\x37\\xb1\\xbf\\x45\\x59\\x32\\xd8\\x24\\xe8\\x63\\x78\\xde\\x7a\\x7e\\x8c\\x40\\xce\\xd2\\x20\\x90\\x04\\x4d\\xbb\\xf9\\x1c\\x70\\xe5\\x28\\xea\\xcd\\xef\\x37\\x85\\xba\\x3c\\x69\\xa3\\x73\\x5a\\xf6\\x70\\x9c\\xd7\\x6a\\xab\\x28\\xa6\\xac\\xa6\\xe8\\x44\\x97\\x4b\\x10\\xb3\\xfb\\x7b\\x09\\x86\\x00\\x7a\\x72\\x7c\\x2c\\x8f\\xc9\\x5b\\x25\\xf3\\x1f\\x14\\x6b\\x36\\xac\\xd4\\xc5\\x37\\x07\\x49\\x20\\xaf\\xf2\\x47\\xde\\x0f\\x17\\x9c\\x13\\xca\\x57\\x79\\x0a\\x6a\\x71\\xd6\\x2e\\x23\\x32\\x1c\\xcc\\x75\\xb7\\xf3\\xb0\\xaf\\xa0\\xd0\\x35\\x27\\xc9\\x11\\x4a\\x7d\\x4e\\x30\\xc1\\xac\\xe6\\xd7\\x71\\x20\\x13\\xde\\xe6\\x66\\x99\\xaf\\x9c\\x56\\x1c\\x44\\xae\\x61\\x98\\xed\\x39\\x10\\x4e\\x60\\x61\\xae\\x2c\\x45\\xa9\\xa3\\xc7\\x4b\\x5d\\x0f\\xbc\\x4a\\x33\\xe8\\xdf\\xe2\\xa8\\xac\\xc9\\x51\\x1e\\xf7\\xe6\\x56\\x71\\x33\\xf9\\xfe\\x35\\x54\\x28\\x4a\\x75\\xa0\\x59\\xa6\\x49\\xdd\\x24\\xec\\x04\\xa5\\x77\\x30\\xc6\\xd2\\xe9\\xbf\\x11\\x4e\\xa5\\x8a\\x89\\x94\\xab\\xdb\\x0c\\x19\\x43\\x24\\x15\\x72\\xc7\\x9e\\xad\\x04\\x3a\\xd1\\xc8\\xca\\xaf\\x5c\\x9d\\xa5\\x3d\\xd0\\x55\\x22\\xfe\\xbc\\x40\\x33\\x54\\xd6\\x2f\\xe3\\xff\\x93\\x88\\x2d\\xf7\\x5f\\xb2\\x94\\x58\\xd2\\x2e\\x69\\x96\\xc3\\x5b\\x69\\xfa\\xae\\xf2\\xe0\\xc4\\x16\\x38\\x86\\xcb\\x3c\\x3d\\x0f\\x60\\xe1\\x50\\xd3\\x63\\xd6\\xdb\\x59\\xfe\\xfc\\x62\\x6b\\x1b\\xbb\\x1e\\x05\\x2a\\x62\\x41\\x4c\\x4b\\x78\\x56\\xd7\\x20\\x93\\x43\\x2b\\x08\\xf8\\x21\\xbc\\x78\\x4a\\x5a\\x6b\\x0b\\xc2\\x64\\x9c\\x2d\\xaa\\x50\\x86\\x58\\x98\\x0d\\x80\\x22\\x91\\xe7\\x34\\xab\\xaf\\xf0\\x6a\\xfb\\xf2\\x79\\x5e\\x4e\\x35\\x4d\\x52\\x21\\xdc\\x4f\\x52\\xcc\\x96\\xd6\\xb8\\xcf\\x18\\x08\\xb1\\xa8\\x20\\x8d\\xb7\\xda\\xa8\\x0a\\xb7\\x10\\xc5\\x6a\\x8b\\x0e\\x9c\\xb8\\x08\\x1d\\xee\\x93\\xf5\\xf0\\x15\\xf0\\x76\\x64\\x46\\x3a\\x3d\\xcc\\xff\\x7c\\x8a\\xd1\\x99\\x23\\xa9\\x7e\\x39\\x04\\x5b\\xcc\\x4d\\xce\\x0a\\x73\\xd4\\x9c\\x56\\xd5\\xe9\\x37\\xbd\\x11\\xe6\\x18\\x23\\x40\\x1c\\x06\\x62\\x06\\xe3\\x13\\xe6\\x0b\\x47\\x53\\x7e\\x34\\x70\\x4d\\x7d\\x35\\x15\\x55\\x9b\\xb9\\xd0\\x53\\x2d\\x02\\x8e\\x28\\xa5\\x7a\\x87\\x9f\\xd6\\x17\\xcc\\x61\\xf7\\xf7\\x76\\xbd\\x6a\\x00\\x8c\\xd4\\xf8\\x12\\x37\\x8e\\xd3\\x7f\\x39\\x4b\\xb9\\x7e\\x6e\\x75\\x6d\\xa8\\x19\"},\n{{0xa8,0x86,0xf4,0xd3,0xf3,0x4e,0x32,0x0e,0xc6,0xd5,0xf4,0xca,0xa8,0x63,0xf8,0x14,0x77,0xdf,0x77,0x2e,0xff,0x97,0xe6,0x4a,0x37,0xa0,0x5f,0x42,0x11,0xd1,0x90,0xa8,},{0xe9,0xbc,0x96,0xc8,0x1e,0x87,0x81,0x10,0x26,0x8b,0x55,0xde,0xf7,0xea,0x40,0x07,0xa4,0xef,0x9f,0x54,0xd3,0x83,0xd5,0xfb,0x0f,0x6d,0x43,0x43,0xe1,0x01,0x0f,0x38,},{0xab,0xf2,0x83,0xdb,0x1f,0x80,0xc5,0x4c,0x58,0x3b,0x49,0x9d,0xbe,0x20,0xaa,0x04,0x24,0x8c,0x1d,0xce,0x12,0x1f,0x39,0x11,0x67,0x78,0x13,0xac,0x3e,0x01,0x1f,0xd1,0x59,0xad,0x0b,0xf7,0x6b,0x1a,0xa7,0xcc,0x7b,0x14,0xd7,0xb5,0x50,0x84,0x86,0x88,0x25,0x2a,0xcc,0x7f,0xec,0xe9,0x04,0x87,0x24,0x0c,0x3d,0x39,0x9d,0xd3,0x43,0x08,},\"\\x8b\\x83\\x1b\\x87\\x7b\\xc3\\xa9\\x9f\\x61\\x3c\\x89\\xcd\\xa6\\x98\\xb3\\x75\\x9d\\x64\\x38\\x22\\xb5\\xa8\\x8f\\xaf\\x38\\x22\\xec\\xb2\\xce\\x98\\xf6\\x71\\xd7\\x55\\x43\\x21\\xb2\\x4b\\x74\\xb4\\xe3\\x0a\\x66\\x3f\\x7a\\x55\\x70\\xae\\x91\\x7f\\x47\\x9b\\xda\\x29\\x89\\x4b\\x1a\\x8c\\x02\\x8c\\x9d\\x19\\x3e\\x4e\\x7a\\xc1\\x19\\x16\\xdd\\x8e\\x9c\\x3f\\x0e\\xc0\\xef\\x80\\xbd\\x27\\xfd\\xfe\\xee\\x80\\xc1\\x70\\xc7\\x81\\x40\\xb2\\x4c\\x15\\x27\\x14\\x15\\xac\\xf7\\x5c\\x26\\x95\\x6a\\x4d\\x4b\\xf9\\x9d\\x40\\xe8\\x61\\xe9\\x07\\x83\\x20\\xd0\\x97\\xe1\\x25\\x9e\\x5e\\xc1\\x7b\\x58\\x3a\\x95\\xe5\\x24\\x30\\xdd\\x8c\\x00\\x8e\\xd8\\xc7\\xdd\\x1d\\xe1\\xbe\\xcd\\xd1\\xe6\\xbf\\xec\\x4b\\xf3\\x34\\x7a\\x22\\xdd\\x24\\x9f\\x3a\\xc3\\x07\\xa2\\x94\\x5e\\x91\\x37\\xfa\\x4a\\x8c\\x26\\xc8\\x02\\x10\\x77\\x23\\x9c\\xb3\\x24\\x81\\x6a\\x8d\\xad\\x32\\xb0\\x1e\\xe3\\x4a\\x08\\x90\\x30\\x98\\xcb\\x9c\\x42\\x45\\x29\\x1b\\x90\\x3c\\x96\\x27\\x07\\x40\\x95\\x24\\x9e\\x78\\x28\\x13\\x47\\x70\\x32\\xba\\x32\\xef\\x04\\x1a\\x07\\x48\\x6e\\xb4\\x47\\x8c\\x57\\xb9\\xd5\\x32\\x26\\x9a\\x4a\\x47\\xcb\\x5e\\x97\\x4d\\xf7\\xe0\\x10\\x96\\xfb\\xe4\\xf1\\xcc\\xd4\\xe6\\x63\\x66\\x34\\x87\\x97\\x4c\\x62\\xcd\\xd9\\x4d\\x77\\x71\\x6c\\x84\\x79\\xd7\\x9f\\x6b\\x6a\\x7d\\x9c\\x15\\x59\\x88\\xcf\\x39\\x02\\xfb\\x69\\x74\\x24\\x96\\x3e\\xc4\\xec\\x34\\xff\\x2a\\x35\\xd7\\x42\\xc4\\x45\\x5a\\x59\\x3b\\xac\\xff\\xc4\\xd9\\x69\\x9b\\xa7\\x62\\x6c\\x76\\xcb\\x1a\\x61\\x62\\x53\\x75\\x18\\x87\\xf6\\xff\\xe2\\xbe\\x20\\x8c\\x71\\x3d\\xf1\\xab\\x63\\x6d\\x72\\x2e\\xa0\\x6c\\x1c\\x03\\xa5\\x7f\\x2c\\xec\\x08\\x03\\x86\\x6c\\xca\\x33\\x35\\xc2\\x8b\\xf4\\x1c\\x7d\\xef\\x81\\xac\\xb3\\x88\\x58\\xdc\\x10\\xe5\\x94\\x67\\x20\\x86\\x24\\x96\\x7e\\x2e\\x22\\xd9\\xe5\\x66\\x1b\\xb9\\x45\\xf9\\xe0\\x51\\x76\\x87\\xdc\\x80\\xf9\\xb8\\xfd\\xec\\xc8\\xa9\\x76\\x00\\xb6\\xc2\\x19\\xa3\\xb2\\x3a\\x90\\xb6\\xd1\\x8a\\xaa\\xce\\x2c\\x78\\x40\\x0f\\xf3\\x8c\\x8c\\x05\\x96\\x7f\\x54\\x4b\\x6a\\x60\\x6c\\x71\\xac\\x19\\x9e\\xaf\\xd0\\x7e\\xb5\\x84\\x8d\\xf1\\x65\\x7e\\xfb\\x23\\x3f\\xba\\xba\\xe6\\x3a\\x05\\x63\\x81\\x91\\xa0\\xaf\\x74\\x84\\xa1\\xba\\xe1\\x58\\x13\\x75\\x67\\x2c\\x57\\x1e\\x26\\x4f\\x60\\x42\\x25\\x17\\x3a\\x54\\xa3\\x8d\\xd6\\x2a\\xe7\\x13\\x0d\\x05\\xdd\\x29\\x1a\\xd1\\x23\\x54\\xde\\x86\\xa6\\xe1\\x13\\xe8\\x3f\\x6d\\x66\\x85\\x16\\x15\\x7b\\x79\\x67\\x02\\x0d\\xc6\\x51\\x7d\\x8c\\xf4\\x2d\\xd7\\xb1\\xa8\\x97\\xfe\\x1b\\x4e\\x04\\x55\\x3c\\xe2\\x6e\\x29\\x99\\x80\\xaa\\x5f\\x7c\\xe0\\x17\\x9b\\xf4\\x95\\x4f\\x01\\xc2\\xa2\\x36\\x54\\xe5\\xe9\\x73\\x1e\\x14\\x47\\x34\\x7f\\xa4\\x3a\\xa8\\xb2\\xcb\\xd6\\xd4\\xb2\\xdf\\x93\\xfa\\x54\\xaf\\x71\\xe5\\x02\\x8a\\x6d\\xa8\\xc7\\x1e\\xf3\\xc5\\x0c\\x0d\\xe2\\x4d\\xca\\xee\\x78\\x56\\x78\\xe9\\x2a\\xaf\\xab\\xeb\\x23\\x3b\\x01\\x1f\\x45\\xc1\\x06\\x49\\x65\\x08\\x5d\\x25\\x47\\x05\\x0f\\x21\\xc6\\x52\\xaa\\x53\\x3a\\xfe\\x91\\x8a\\xa0\\xf9\\xbd\\xaa\\x26\\x07\\xb8\\x73\\xcc\\xd3\\xdb\\xd1\\xd3\\xa8\\xcc\\x62\\x17\\x2c\\xeb\\x43\\xb9\\x21\\xef\\x6b\\x25\\xc0\\x6b\\x09\\x92\\xe4\\xdf\\x2b\\x91\\xe3\\x71\\xb0\\xef\\x2b\\x39\\x47\\x38\\x8d\\xae\\xc8\\xec\\x6f\\x7e\\x38\\x67\\xd1\\xf6\\x10\\x72\\xaf\\x59\\x01\\x54\\xfa\\x61\\x9a\\x07\\xf8\\x7e\\x02\\xbd\\xdc\\x74\\x06\\x31\\x42\\x70\\xaf\\x1c\\x15\\xe8\\xee\\x88\\xb3\\x9c\\x01\\xbe\\x60\\x2e\\x4f\\x0b\\x52\\xd9\\xa0\\x72\\x4e\\x71\\xed\\xdd\\x7f\\xa9\\x13\\x41\\x69\\xc5\\xfa\\xab\\x91\\x59\\x79\\xee\\xa9\\x36\\x2d\\x0f\\x1f\\x91\\x60\\x26\\x81\\x62\\xdd\\x38\\xdb\\x02\\xfc\\xfb\\x41\\x35\\x0a\\xa0\\x8e\\x1e\\x14\\x09\\xb2\\x28\\x8d\\xb1\\xfe\\x4a\\x0e\\x58\\x6b\\x59\\x10\\xf4\\xde\\x89\\x4b\\xf9\\x97\\x4f\\x6a\\x49\\x83\\x01\\x3a\\x19\\x0e\\x7a\\x73\\x6d\\x14\\xec\\x54\\xc3\\x64\\x4a\\x3e\\xe9\\x58\\xa5\\xbd\\xfb\\xcb\\x62\\x97\\xab\\xa4\\x3a\\xf6\\xc7\\x27\\x46\\xbb\\x13\\x54\\x10\\x50\\x7d\\x8f\\xdd\\xe7\\x3a\\x2a\\x48\\xb7\\x46\\xf9\\x18\\xbe\\xf9\\xed\\x92\\xc5\\xbe\\x62\\xdd\\x55\\x23\\xfe\\x14\\xb1\\x6d\\x63\\x84\\xca\\x46\\xef\\x59\\xb2\\x18\\x5f\\xe9\\x33\\x38\\x3a\\x2c\\x7a\\x9b\\xf0\\x2d\\xa9\\xd0\\xfd\\x8b\\x0c\\x7d\\x7b\\xde\\x6b\\x43\\x9f\\x99\\x60\\x15\\x5e\\x34\\x5d\\x68\\x5d\\x4d\\xc3\\xc7\\x14\\x04\\xd6\\x56\\x81\\x19\\x23\\xaa\\x3c\\x47\\xd4\\xb0\\x9a\\x0b\\xae\\xf0\\xa1\\x2e\\x75\\xb6\\x43\\x9b\\xa8\\x13\\x5d\\xb1\\x58\\x65\\x87\\x42\\x22\\xcd\\x7a\\xa4\\x28\\xf5\\xca\\x5c\\xe5\\x14\\x0e\\x22\\xff\\x92\\x69\\x7f\\x37\\xfc\\x70\\xb5\\xb4\\xc9\\x4d\\x33\\x14\\xe6\\xaa\\x16\\xb2\\x14\\x6b\\xca\\x4f\\xc9\\x41\\x57\\x95\\x1f\\xc4\\x92\\x45\\xda\\x53\\xf6\\xc4\\x3d\\x1b\\xeb\\xd8\\x94\\xe3\\x1a\\x13\\x49\\x88\\x4d\\x71\\x1b\\x55\\xdb\\xe7\\x78\\xff\\xa7\\x27\\x16\\x5c\\xf7\\xcb\\x67\\x64\\x35\\x86\\x6c\\x2d\\x2c\\xb8\\x39\\x74\\x5c\\xa4\\x01\\x66\\xa2\\xf7\\xcf\\xc7\\x7a\\x84\\x24\\x68\\xb5\\x1a\\x8e\\x76\\x57\\x5f\\xc9\\xdd\\xfb\\x5f\"},\n{{0x49,0x7e,0x3e,0xbd,0x9e,0x4c,0xaa,0x81,0xc5,0xa8,0x97,0x3d,0x52,0xf1,0xd2,0x3f,0x60,0xc1,0x34,0xca,0x53,0xf6,0x2a,0x85,0x3a,0x0a,0xc0,0x43,0xe5,0x1c,0xb5,0x17,},{0x71,0xc0,0xca,0x7c,0xfa,0x05,0xca,0xfa,0xbb,0x14,0x3d,0x84,0xae,0x41,0xde,0x83,0x84,0x6f,0x42,0xc7,0x7c,0xaa,0x7a,0x91,0xa2,0xe3,0x48,0x39,0x7d,0x07,0xd5,0x2f,},{0x12,0x74,0x08,0x39,0xb3,0xc9,0xf1,0xba,0x87,0x98,0x96,0xdf,0xf6,0xd7,0x25,0xe8,0x4e,0x04,0x43,0xef,0x96,0xc3,0x49,0xef,0xf9,0x4d,0xc4,0x83,0x31,0x43,0xe5,0xb4,0x19,0x80,0x4d,0xa9,0xdb,0x11,0x8a,0x95,0x92,0xb1,0xb1,0xca,0x48,0xaf,0x18,0xf7,0x5b,0xef,0x1c,0xa4,0x68,0xa1,0xa5,0xc7,0x4c,0x7a,0xc8,0x13,0xbb,0x2c,0xf3,0x06,},\"\\xe1\\x32\\xf9\\xd6\\x7b\\x17\\x29\\x38\\x9b\\x82\\x8a\\x9f\\xae\\x05\\xa6\\x7a\\xa5\\x7f\\x0e\\xf7\\xe7\\xd4\\xd1\\xba\\x24\\x4d\\xec\\x87\\x04\\xdb\\x96\\x95\\x65\\xd1\\xca\\xb8\\x09\\xe4\\x8f\\xc0\\xab\\xf9\\x50\\xbc\\xd4\\xa3\\x7d\\x97\\xae\\xac\\xe6\\xda\\x54\\x6d\\x49\\x14\\xcb\\x5b\\x86\\xd6\\xab\\x18\\x1d\\x83\\x18\\x70\\xc3\\x09\\xbc\\xa6\\x16\\x46\\x8f\\x2a\\x34\\xd3\\xdf\\xaf\\xcd\\xbb\\x75\\x80\\xb0\\xc5\\xd9\\xff\\x98\\xe2\\xc5\\x4e\\xc8\\x03\\xbe\\x0d\\x3f\\xda\\x1d\\x4b\\x8c\\x0d\\x77\\x09\\xc8\\x9e\\x68\\x0b\\x00\\x8b\\xf9\\xb8\\xd9\\x03\\xb5\\xe9\\x34\\xb0\\x19\\x70\\x5f\\xe0\\xb0\\xc8\\xcf\\xbc\\x3c\\x09\\x67\\x84\\x3b\\x0a\\x1f\\xa1\\xb3\\xf1\\x62\\x77\\x6e\\xbe\\x96\\xb7\\x40\\xed\\xd6\\x4a\\xd7\\xc3\\x5b\\x3f\\xd1\\xa0\\x85\\xc9\\x9d\\x16\\xf5\\x41\\x67\\x82\\xde\\x17\\x35\\x85\\x87\\x47\\x0d\\xd1\\x3b\\x51\\x94\\xf2\\x0f\\x23\\x23\\x2b\\x2f\\x70\\x2f\\x10\\xaa\\xfc\\xaa\\x59\\xc7\\x06\\x6f\\x24\\xc4\\xc4\\x71\\xe4\\x2f\\xa8\\x6c\\x6b\\x9c\\x5c\\x3e\\x1e\\x8f\\x83\\x65\\xf4\\xdd\\x75\\xac\\xb3\\x2f\\xff\\xc0\\x53\\xc9\\xaf\\x41\\xc6\\xfd\\x2e\\xfa\\xc3\\x0e\\xcf\\x6a\\x2d\\xd0\\x08\\x5d\\xe9\\xb1\\xd8\\xcd\\xc5\\x0b\\x16\\x60\\xa8\\x66\\xdf\\x77\\x67\\x19\\x8b\\xd9\\xc8\\x73\\x70\\x61\\x5d\\x2b\\xca\\x99\\xf7\\x7b\\x84\\xd9\\x8d\\x7b\\x24\\xc9\\xc2\\x0f\\xd7\\x76\\x8f\\xd0\\x38\\x0d\\x6b\\x37\\x36\\x03\\x40\\xd1\\x35\\x98\\x04\\x78\\x20\\xdc\\xed\\x88\\xa8\\xd4\\x2d\\x57\\x29\\x37\\xb6\\xef\\xa1\\x69\\x21\\xa1\\xb2\\xb2\\xd0\\xeb\\x93\\x16\\x73\\x07\\x08\\x38\\xe6\\x11\\xe6\\xc0\\x23\\x29\\x0d\\x86\\xfe\\x90\\x2f\\x14\\xac\\x3a\\xcd\\x02\\x9e\\x33\\x97\\xfe\\xb9\\x7b\\x17\\x16\\x62\\x45\\xab\\x40\\x7a\\x76\\x6d\\x2e\\x09\\x04\\x42\\x4d\\x33\\xcd\\x3d\\x6e\\x2e\\x62\\xa5\\x2c\\x65\\xdf\\x7c\\xf0\\x04\\xd1\\x41\\x5c\\x0b\\x43\\x0c\\x11\\x27\\x62\\x3d\\xab\\x27\\x2a\\x2c\\x2e\\x2b\\x43\\xe0\\x2b\\x48\\x1b\\xe9\\x28\\xe8\\x99\\x54\\x27\\x28\\x32\\xbe\\x09\\x8b\\x50\\x2b\\x8b\\x56\\x43\\xc6\\x74\\x82\\xf5\\xde\\x44\\x03\\x03\\x25\\x81\\xf0\\x8a\\xfb\\x0a\\xea\\x48\\x86\\x85\\x82\\x60\\x7b\\xb3\\x91\\x98\\xc1\\xbf\\x13\\xa8\\x69\\xb6\\x32\\x58\\xa7\\x58\\x90\\xb6\\x94\\x45\\xff\\xd3\\x45\\x64\\x02\\x3e\\x47\\xf8\\xb1\\x88\\x4a\\x5e\\x49\\xb7\\xd9\\x42\\x5f\\x28\\xd5\\x15\\x30\\x13\\xfe\\x37\\x55\\xc6\\xcb\\x11\\x4d\\xb1\\x80\\xe6\\x0b\\x3d\\xc4\\xad\\xb3\\x6a\\x21\\x42\\x81\\x28\\x00\\x5a\\x77\\x2f\\xb5\\x71\\x89\\x34\\x55\\x65\\xbb\\xd1\\x75\\x98\\x13\\x52\\x3b\\xad\\x62\\x85\\x5e\\x79\\x28\\xee\\xf5\\x88\\x0d\\x3b\\xff\\xf1\\xd0\\xec\\x65\\xc2\\x45\\x92\\x33\\x5c\\xda\\x47\\xcf\\xcc\\x5b\\x5f\\xa6\\x52\\xb4\\x72\\x63\\x22\\x52\\x24\\x84\\x6a\\x20\\x9a\\x3d\\xd7\\x76\\x66\\x61\\xfc\\xa4\\xcc\\xca\\x59\\xc4\\x56\\xfc\\x9c\\xc3\\xe1\\xcf\\x80\\x42\\x55\\xaa\\x5f\\x39\\x7b\\xab\\x19\\x98\\x04\\x33\\x6b\\xde\\x29\\xe5\\x5c\\x6c\\x37\\x7d\\x58\\x3f\\x08\\x2c\\xe6\\x47\\x23\\x73\\x9e\\x4f\\x02\\x46\\x06\\xf9\\x06\\xc1\\x10\\xd0\\xa5\\xb6\\x10\\xe5\\xfe\\xd9\\x6d\\xab\\x5f\\x08\\xf4\\xcb\\x3c\\xfc\\x40\\xa3\\x55\\x57\\xe1\\xa7\\x40\\xb8\\xc7\\xc0\\x1f\\x7d\\x32\\x79\\xdd\\x9c\\x4e\\x87\\x64\\xc9\\x0b\\xc1\\x4f\\x41\\x61\\xdb\\x5a\\x37\\xf0\\x98\\x9b\\x7b\\xd8\\x03\\x5f\\x8b\\xea\\x39\\x4e\\xa1\\xd6\\x00\\x2c\\xe9\\xc3\\x4f\\x1e\\x9c\\x52\\xc6\\xa1\\x5d\\x15\\xbc\\x5b\\x25\\xc6\\xc1\\x5a\\xb0\\x0d\\xfd\\x6a\\x5b\\x1b\\xc9\\x17\\xaf\\x0b\\x1b\\x05\\xfd\\x10\\xd0\\x61\\xb3\\x68\\x3d\\x75\\xb5\\xf9\\xef\\xfb\\x22\\xae\\x72\\x08\\x5b\\xe4\\xf6\\x79\\x7b\\x58\\xcb\\x0c\\xab\\x56\\x18\\x44\\x12\\x1f\\x98\\xbf\\xd9\\x58\\x3e\\x0b\\xcc\\xb7\\x0f\\xad\\x76\\x98\\x0a\\x7a\\x73\\xb2\\x3c\\x70\\xb3\\xfd\\x02\\xf7\\x75\\x7c\\x11\\xa3\\xc2\\x1d\\x19\\xe0\\x56\\x50\\xff\\xb8\\x2b\\x9e\\x0d\\xf8\\xa6\\x73\\x5d\\x48\\x01\\x56\\xf4\\x79\\x49\\xd4\\x45\\x85\\x1b\\xae\\xaa\\x5e\\xe2\\x38\\x14\\xa4\\x1b\\x25\\x23\\x4f\\xb9\\x2c\\xc0\\xdf\\x19\\x80\\xd0\\x23\\xd5\\x1b\\x5c\\xf4\\xc3\\x11\\x85\\xc1\\x18\\xe3\\xee\\x3c\\x0c\\x0a\\x46\\xe0\\xa2\\xbe\\x6f\\x1d\\x3a\\xe4\\x52\\xcb\\xb6\\x6f\\x0f\\xd9\\x19\\x71\\x34\\x2d\\xa7\\xb1\\xb9\\x96\\x58\\x9d\\x94\\x09\\x67\\x81\\x55\\x21\\x95\\xc4\\x33\\xca\\xf1\\x9c\\x37\\xf9\\xf1\\x4f\\xa0\\xae\\x15\\xae\\x0b\\x02\\xb9\\x39\\xe4\\x02\\x03\\x4f\\xf8\\x18\\x85\\x93\\x9d\\x94\\x4e\\x60\\x4f\\x47\\x4f\\x21\\x52\\x43\\x89\\x39\\x0f\\xda\\xda\\x06\\xe3\\x0d\\x69\\x06\\x8c\\x88\\x48\\xcf\\x0a\\x95\\x1e\\xab\\x25\\xc4\\x91\\x25\\x62\\x94\\x4f\\x40\\x24\\x68\\x18\\x7a\\x23\\x23\\x9d\\x33\\x63\\x2f\\x29\\x12\\x3d\\x49\\xb7\\xde\\x13\\x08\\x33\\x98\\xdb\\xa9\\x7d\\xed\\xe1\\x2f\\x79\\x59\\xb9\\x52\\x47\\xa0\\x8f\\xc8\\xe4\\xb5\\x39\\x9d\\x1c\\x03\\x5c\\x08\\x94\\xcc\\x75\\xae\\x98\\x1c\\x2d\\xd4\\x93\\x54\\x13\\xbb\\xeb\\x68\\x53\\xfe\\x04\\x65\\x5c\\x77\\xd1\\x58\\xc1\\x23\\x7b\\x3e\\x0d\\xec\\xa5\\x63\\x6d\\x69\\xe0\\xdb\\xc5\\xac\\xaf\\x72\\xb6\\x0c\\x10\\xbb\\x98\\xcc\\xdd\\x60\\x09\\x8a\\x03\"},\n{{0x85,0xb4,0xd7,0x64,0x16,0x91,0x28,0x62,0x6f,0xd9,0xc7,0x82,0xad,0x61,0x16,0x22,0x9e,0xdd,0x77,0x63,0x1c,0x2b,0xc9,0xb8,0xee,0x54,0xb3,0x65,0x42,0xc1,0x49,0xeb,},{0x6a,0x09,0x89,0x7e,0x62,0x9b,0xb4,0x37,0x04,0xde,0xbb,0x67,0x15,0xc9,0xde,0xa5,0xd8,0x92,0xb6,0x34,0x30,0x64,0x40,0x99,0x7c,0x3c,0x9e,0x94,0xbe,0x8a,0xb5,0x47,},{0x4a,0x79,0xc4,0x42,0xa4,0xc3,0x9c,0x62,0x89,0x26,0x17,0xef,0x8e,0x80,0xb4,0x09,0x11,0xc4,0xb9,0xd3,0xff,0x0a,0x56,0x73,0xb5,0x7b,0xdb,0x84,0x54,0xad,0x73,0x67,0x69,0xdf,0x27,0xc7,0x8a,0x4b,0xf7,0xad,0x56,0x60,0x40,0xe7,0x47,0x27,0x8b,0x11,0xeb,0x65,0xcf,0x9e,0xc7,0xeb,0xa8,0x66,0x12,0x0a,0x36,0x54,0xf4,0x71,0x6e,0x00,},\"\\xb2\\xa0\\x49\\x3d\\x47\\x1c\\x33\\x91\\xf7\\xad\\xd1\\xe2\\xcf\\x0b\\xfb\\x32\\xab\\x05\\xdb\\xcb\\x14\\xf6\\xe4\\xf5\\xf3\\x46\\x3a\\xa8\\xd9\\x95\\x52\\xf4\\x33\\x02\\x20\\x46\\xd2\\xf8\\xeb\\x76\\x3c\\x01\\x71\\xfc\\xb1\\xe7\\x4a\\x04\\x9f\\xfe\\xb4\\xb8\\xf0\\x10\\x0b\\x82\\x10\\xfc\\xe8\\x56\\xb2\\xe1\\xa8\\xe7\\x39\\xd2\\xf9\\x36\\x73\\xef\\x8f\\x8f\\x40\\x49\\x8b\\x30\\x81\\xfa\\x1f\\xd7\\x85\\x19\\x8c\\x6d\\x37\\x0e\\x16\\x2d\\x41\\xab\\xe8\\x31\\x86\\xf2\\x32\\x97\\x83\\x40\\x8b\\x9b\\x88\\x0d\\x00\\xf8\\x1d\\x53\\x10\\x0b\\x42\\xd2\\x7a\\x26\\x1f\\x20\\xcd\\xee\\xd1\\x9c\\xc5\\x8c\\xb8\\x63\\x12\\x81\\xd8\\x0d\\xb1\\x92\\x53\\x10\\xe2\\x35\\xe4\\x49\\x66\\x30\\x9b\\x87\\x9b\\xdf\\xc2\\x32\\x22\\x14\\x33\\xba\\xe5\\xca\\xe4\\x66\\x90\\xcb\\x52\\x7b\\x67\\x79\\xe1\\x1f\\x1b\\xd2\\xa5\\x6b\\x59\\xc5\\x6e\\xd4\\xd9\\x4f\\xdf\\x7a\\xa8\\x9d\\xfa\\x9b\\xf2\\x0d\\xbf\\xa6\\xa4\\x39\\x8b\\x98\\x38\\x45\\x17\\xe1\\xdd\\x5d\\x2c\\xd9\\xce\\x52\\x4a\\x47\\x36\\x2e\\xf3\\x2a\\xc7\\x92\\x74\\x2a\\x12\\x9c\\x9e\\x06\\x13\\x08\\x76\\xab\\x5a\\xd5\\x51\\x8e\\xab\\xc5\\xe8\\x0b\\x02\\x2d\\x8f\\xa1\\x3e\\x50\\xd5\\x5d\\xed\\x58\\x95\\x33\\xe6\\xea\\x32\\x24\\x2c\\x1b\\x3f\\xd7\\xe6\\x5f\\x80\\xde\\xe7\\x20\\xb6\\xd8\\x7d\\xcf\\xf3\\xe3\\xdf\\x04\\xc8\\x02\\xd2\\xe9\\x14\\xa8\\x7a\\x36\\x29\\xc9\\x0b\\xb6\\x9e\\x0a\\x6f\\x8b\\xbb\\x5e\\xe5\\x05\\xf1\\x43\\xc9\\x97\\x73\\x75\\xad\\xb0\\x65\\xc3\\xe3\\xd3\\x91\\xf9\\x05\\xfa\\x3c\\x33\\x6c\\x9d\\xa4\\x1e\\x4a\\x23\\x20\\xbc\\xf4\\x60\\x97\\x6f\\xc7\\xeb\\x1f\\xb6\\xc6\\xa3\\xc3\\x95\\xdb\\xd1\\xd2\\x8a\\x1b\\x09\\xcd\\xb9\\xae\\x9f\\x9a\\xae\\xe4\\xd9\\xc5\\x66\\xa2\\xac\\x40\\xad\\xd8\\x70\\x47\\x9f\\xaf\\x54\\xad\\x1b\\x76\\x97\\x71\\x0b\\x4e\\xb6\\xf7\\x32\\x02\\x44\\xb5\\x97\\x57\\xd1\\xea\\xc3\\xd9\\x22\\xb7\\xa7\\x30\\xb1\\xac\\xf0\\xde\\x9a\\x45\\xd4\\xac\\x87\\x9d\\x21\\xfc\\x61\\x6e\\xf3\\x96\\x5d\\x74\\x34\\x5e\\xd7\\x07\\x79\\xeb\\x68\\x32\\x80\\xce\\xe2\\x5b\\xf3\\x73\\x9b\\xeb\\x6b\\x4c\\xdf\\xa2\\x5d\\x20\\x2d\\xa1\\x3a\\x4a\\x67\\x30\\x40\\xd9\\x70\\x48\\x65\\x8b\\x92\\x05\\x47\\x95\\x05\\xd0\\xbe\\xe4\\x88\\x0a\\x73\\x99\\x7c\\x70\\x82\\x5a\\x6e\\xc5\\xfd\\x9f\\x95\\x2e\\x65\\xfa\\x02\\x22\\x54\\x45\\xfc\\x3b\\xdf\\x4a\\xde\\xa3\\xd4\\xd2\\x25\\x51\\xcb\\xac\\xeb\\x38\\x74\\x79\\x8d\\x6a\\x33\\xa6\\x66\\x3f\\xe3\\x75\\x70\\x81\\xd6\\x24\\x3d\\xfd\\x7c\\xd2\\xee\\xbf\\x60\\xa3\\x89\\x9f\\xa1\\xf8\\xf6\\xc9\\x56\\xa3\\xb1\\x83\\xf8\\x9b\\x9e\\x7d\\x2c\\xa3\\x64\\x48\\x58\\x4d\\x53\\xaa\\x8b\\x44\\xe6\\x5a\\xd3\\xe5\\x27\\xf7\\x87\\x23\\xfa\\x6f\\x59\\x22\\x42\\x98\\xdf\\x31\\xd5\\xe8\\xad\\xa5\\x67\\xc8\\xd1\\xb1\\x1f\\x3b\\x13\\x14\\x75\\x53\\x31\\xc1\\x73\\x2d\\xc5\\x4a\\x12\\xa4\\x35\\x6e\\xdd\\xa4\\x7e\\x3c\\x13\\x0b\\x32\\x52\\x82\\xa3\\x54\\xbf\\xe1\\x5c\\x30\\x00\\xd2\\x07\\x82\\x29\\x31\\x79\\x41\\x87\\xe0\\x97\\x3a\\xb8\\xef\\x87\\xbf\\x89\\xc3\\x54\\xa0\\x35\\xa8\\x1f\\x45\\x91\\x12\\x23\\x56\\x3b\\xfd\\x99\\xf9\\x0a\\x75\\xe5\\x3d\\x01\\x0d\\x89\\x29\\xf4\\xf8\\x5a\\x5a\\x5a\\x4f\\x9f\\xcc\\x1c\\x78\\xf0\\xa2\\xfc\\x46\\x6f\\x5f\\x1c\\x65\\x22\\xcf\\x62\\xa7\\xbe\\x37\\x88\\x07\\x96\\xe9\\xb3\\xca\\x09\\x11\\xec\\xca\\x3f\\x22\\xc3\\xb2\\x4d\\x5d\\x9d\\xaa\\x68\\x88\\xf8\\x9a\\x8f\\x71\\xa1\\x58\\x59\\x35\\x9c\\xea\\x46\\x8e\\xf2\\x38\\xec\\xf6\\x46\\x19\\x27\\x83\\xa2\\x57\\xad\\xda\\xde\\x90\\x47\\xe1\\x3e\\xdd\\x8b\\xcc\\x1f\\xd4\\x17\\x7c\\xb2\\x0f\\x88\\xd1\\x19\\x98\\xd9\\xc7\\x26\\x2d\\x64\\x8c\\x2b\\xf6\\x6f\\xb2\\x27\\xb9\\xb3\\xa9\\xed\\x46\\x96\\x2d\\x22\\x57\\xa4\\x20\\xf6\\x4b\\xea\\xd9\\xe2\\x86\\x57\\xb5\\x21\\xdb\\x2e\\x22\\x16\\x52\\x87\\x79\\x1f\\x3a\\x1b\\xec\\x4c\\x78\\x22\\xa6\\xca\\xbd\\xe5\\xec\\x77\\x01\\x88\\xcb\\x74\\x49\\x8a\\x4f\\x08\\xe5\\xa3\\xa7\\x63\\x9d\\x24\\x0a\\xe3\\xf4\\xfd\\x03\\x53\\xc0\\xdd\\xa8\\xae\\x41\\x0b\\x9f\\xa7\\xf4\\x3f\\xee\\xd1\\x3e\\x9f\\x13\\xe6\\xc9\\x41\\x0a\\x1d\\x24\\xcd\\xfc\\x2c\\x8e\\x64\\xa1\\x5a\\x12\\xf7\\x55\\x45\\xb0\\xa5\\x75\\x71\\x35\\x23\\xd4\\xdf\\xa1\\xa4\\x74\\x27\\xa8\\x85\\x1b\\xa9\\xac\\xcc\\xad\\x78\\xb4\\xef\\x6a\\x18\\x5f\\x5c\\x3b\\x00\\x11\\x90\\xdd\\x8f\\x37\\x08\\x8a\\x00\\x0a\\xcc\\xf4\\x48\\xbe\\x8d\\x49\\x37\\x1d\\x9d\\xa2\\xe1\\xcb\\x5f\\xfe\\x07\\xd4\\x1a\\x5c\\x22\\xe9\\x46\\x60\\xac\\x37\\x13\\x5a\\xc8\\x58\\xcb\\x17\\x69\\xcb\\x66\\xe8\\x26\\x9f\\xd5\\x33\\x58\\xec\\xac\\xf5\\xdd\\x92\\xc7\\xeb\\x61\\x86\\xb4\\xd4\\xd6\\x13\\x0a\\x73\\x2d\\xc1\\x0b\\xbb\\x2b\\xe3\\x2f\\x9b\\x1d\\x69\\x51\\x01\\x4a\\x63\\x5c\\x12\\xd2\\x2f\\x0d\\xc5\\xbd\\x5c\\x2a\\x3f\\x96\\xae\\xc6\\x2e\\x77\\x77\\x94\\x7e\\xaa\\x02\\x28\\x12\\xca\\xce\\xd3\\x3a\\x5b\\xef\\x9f\\xf8\\x83\\x5f\\x88\\x03\\x67\\xa3\\x7b\\x0b\\x76\\xd2\\xdd\\xe3\\x96\\xc6\\x14\\xe1\\xa4\\x72\\x1e\\x00\\x0c\\x00\\xf1\\x61\\x93\\x5b\\x14\\xa7\\x38\\xa1\\xb7\\x0f\\x6e\\xa5\\x42\\x55\\xb7\\x95\\x18\\x69\\x64\\x62\\x12\"},\n{{0x33,0xd4,0x77,0x60,0x2f,0x29,0x63,0x05,0xa6,0x71,0x9e,0xa6,0x94,0xc0,0x44,0xe9,0x0d,0x23,0x3c,0x2d,0xea,0x85,0xc4,0x6a,0xbe,0x19,0x20,0xe8,0x8c,0x31,0x78,0x49,},{0xff,0x6f,0xee,0xa0,0x28,0xec,0x34,0x6d,0xd4,0x91,0x07,0xbb,0x71,0x3f,0xdd,0xbb,0x28,0x2e,0xbc,0xd0,0x34,0xe2,0xea,0xfc,0x7c,0xdb,0x1c,0x5a,0xdf,0x92,0x63,0x90,},{0xca,0xa2,0x87,0x98,0x95,0xd4,0xf6,0x20,0xb9,0xeb,0x5f,0xed,0x22,0xb4,0x56,0x2e,0xeb,0x1a,0xd6,0x38,0x22,0x96,0x8f,0x76,0xad,0x91,0x07,0x6b,0x16,0x6c,0x05,0xee,0x20,0x86,0x4d,0x98,0xbb,0xbc,0x6e,0x79,0xdd,0x03,0x62,0xca,0xcf,0x7a,0x21,0xb4,0xcf,0xc2,0x30,0xd6,0x35,0x5d,0x43,0x12,0x0c,0xff,0xfb,0x94,0x8b,0x8f,0x6c,0x0e,},\"\\xcf\\xea\\x07\\xa7\\x79\\xf1\\x53\\x7e\\x49\\x81\\x23\\xc6\\x76\\x29\\x05\\x73\\xef\\xcc\\x5d\\xb7\\x02\\x45\\xd9\\x3d\\xea\\x5c\\x05\\x72\\x6f\\x87\\x13\\xd0\\x02\\xae\\x66\\xc1\\xc9\\x69\\x07\\x47\\xca\\x92\\x30\\xb1\\x62\\x9d\\x36\\x62\\xab\\x73\\xd6\\x6b\\x94\\x98\\x79\\x16\\x4b\\x21\\xa3\\x5f\\x40\\xcf\\x37\\x99\\x04\\x19\\x08\\xed\\x6f\\x92\\x29\\xec\\xb3\\x90\\xc5\\xf2\\x22\\x34\\xe1\\xc5\\xf2\\x6b\\x3a\\xb5\\xba\\x59\\xe7\\x8c\\x64\\x96\\x98\\x71\\xb4\\x28\\xb7\\x85\\x16\\x77\\x75\\x55\\xaf\\x4e\\x89\\xc6\\xfb\\xc1\\x93\\xa9\\x46\\x95\\x22\\x6c\\x6d\\x32\\x99\\x91\\xa1\\x1b\\xd5\\x80\\xd1\\x89\\x56\\x08\\x9b\\x58\\xa0\\xe4\\x2c\\xa3\\x5f\\x6c\\x6d\\x26\\x09\\xad\\xe0\\xd0\\xb6\\x19\\xd4\\x89\\x25\\xc6\\x8c\\xd9\\xd2\\x25\\x0d\\xff\\x27\\xcf\\x2f\\x0d\\x44\\x44\\x87\\x09\\xb6\\x79\\xf3\\x5b\\xbd\\xce\\x0f\\x49\\x6b\\x0a\\x16\\xca\\x67\\xea\\xce\\xec\\x25\\x8b\\x1a\\xec\\x91\\x77\\x5a\\x3a\\x2e\\xe8\\x01\\xb1\\xc9\\xa2\\x26\\xa6\\xb0\\x01\\x92\\x6a\\x05\\x7a\\x06\\x30\\x67\\x27\\xee\\xda\\xe8\\xc5\\x77\\x53\\x1d\\xf0\\x4a\\xc0\\x9b\\x5b\\x49\\xbc\\xde\\xab\\xde\\xb8\\xac\\x4e\\x8e\\x82\\xcf\\x1e\\x7a\\xf8\\x35\\xfc\\x61\\x1c\\xa7\\xa6\\x84\\xb8\\x35\\x26\\x04\\x24\\x15\\xb1\\xd6\\x65\\x2e\\x86\\x34\\x31\\x1e\\x19\\x46\\x27\\xea\\xe7\\x8d\\x01\\x1e\\x6f\\x40\\xf6\\x45\\x79\\x4e\\x36\\x89\\x5a\\x23\\xe1\\xbd\\x84\\x88\\x3a\\x39\\x3e\\xcf\\xe5\\xa2\\x48\\x02\\x6a\\xea\\x86\\x44\\x70\\x59\\xf7\\xa4\\x29\\x36\\x8f\\x21\\xc8\\x9e\\x01\\x45\\x20\\x79\\x78\\xb9\\x13\\xc8\\x0a\\x22\\xd7\\xca\\xf2\\x67\\x3f\\x7c\\x76\\xf6\\xc2\\x6c\\xf8\\x84\\x41\\x2e\\x17\\xd0\\xc2\\x55\\x43\\x0f\\x50\\x2b\\xce\\x74\\xe3\\xa3\\x10\\xd1\\x7f\\x6f\\x4d\\x48\\x5d\\xa2\\x80\\xed\\x5b\\x5e\\xea\\x6c\\x49\\xba\\x74\\x8d\\x76\\x48\\x14\\xb9\\xe3\\xda\\xf6\\xfc\\xc2\\x18\\xc2\\x74\\x0c\\xa7\\x70\\x18\\xf7\\x13\\x44\\x51\\x9d\\xa8\\x2a\\xda\\x31\\xe0\\x01\\x92\\x4f\\xc7\\x76\\x79\\xe3\\xe9\\xff\\x9f\\xab\\x67\\xdd\\x09\\xa6\\x19\\x24\\xc8\\x21\\xa1\\xfd\\x99\\x9f\\x74\\xdf\\xa3\\xf8\\x19\\xad\\xb3\\x1d\\x15\\xe5\\xed\\x8a\\xaa\\x52\\xc1\\xbd\\x7c\\xca\\x26\\x67\\x11\\xa7\\x4d\\xd6\\x21\\x04\\xef\\x3c\\x2b\\xf7\\x37\\xfc\\xe6\\x94\\x2b\\x34\\x8a\\x33\\xc3\\xdf\\xd6\\xd9\\x2a\\x72\\x4b\\x6d\\x58\\x78\\x42\\x1a\\xeb\\x23\\x0a\\x53\\x3f\\xe2\\x1c\\x8b\\x2f\\xd3\\xda\\x59\\x6a\\x61\\x80\\xa4\\x5c\\x98\\x6d\\x7e\\xce\\x4c\\xdc\\x8a\\xd6\\x81\\xea\\xd6\\x90\\x64\\xbb\\xdd\\xfc\\x20\\xf3\\xc5\\x21\\x25\\xf8\\x33\\x95\\xbe\\xd1\\x55\\x7f\\x67\\x18\\x2b\\x9f\\xe9\\x91\\x38\\xaf\\x3c\\x35\\x6c\\x5e\\x65\\x29\\x78\\xdd\\x23\\x8b\\x76\\x1c\\x74\\x2f\\x81\\x58\\xe2\\x31\\x4b\\x96\\x42\\x08\\x33\\x09\\x78\\xb0\\x62\\x0a\\x13\\xa1\\x6d\\x76\\x1d\\x52\\xf0\\x6e\\x46\\x6a\\x40\\x94\\xb6\\x5c\\xd6\\xf2\\x68\\x54\\xae\\xd6\\xf9\\xa8\\xc2\\xa8\\x84\\xa0\\xd0\\xbf\\x4e\\xe5\\x87\\xee\\xb8\\xb6\\x02\\x48\\x72\\x39\\xa7\\xe5\\x81\\x72\\xc8\\x09\\x98\\x3a\\x8d\\xb1\\xc1\\xfc\\x7c\\xe8\\xc4\\x8b\\xc8\\xa6\\xfb\\x81\\x2d\\x6a\\xa9\\xe8\\x3a\\x3a\\xb4\\xdd\\xf7\\xa8\\xd4\\x0d\\x3f\\xe0\\x0e\\xa1\\x6e\\x04\\x06\\x2b\\x8a\\xce\\xb9\\xc9\\x9e\\xef\\xa4\\x1f\\x4f\\x87\\x44\\x78\\x28\\x12\\x6d\\x0d\\x9c\\x9f\\x86\\x05\\xe8\\x46\\x7c\\x5e\\x4d\\x67\\x1d\\x5c\\x6d\\x9f\\xa7\\x0d\\x74\\x70\\x98\\xd9\\x41\\x21\\x12\\x23\\xb9\\xbc\\xf2\\x61\\x93\\x8d\\x67\\x04\\xa3\\x2d\\x22\\xc6\\x1e\\x30\\xf3\\x57\\x0a\\x1f\\x5d\\x09\\x98\\xb4\\x79\\x10\\x80\\x88\\x2a\\xa5\\x62\\x31\\x67\\xb6\\x3a\\x23\\xf3\\x40\\xf0\\xe7\\xc6\\xf9\\xa8\\x30\\xa7\\x5b\\x74\\x63\\x1f\\xa5\\xb5\\x7a\\xfd\\xb1\\xe6\\xbc\\x22\\x69\\x9b\\xb0\\x31\\x56\\x67\\x5d\\x59\\x83\\x53\\xa5\\xd1\\xb5\\x58\\x97\\xe4\\xc1\\x10\\x61\\xdd\\x14\\x5f\\x23\\xe8\\x53\\x7c\\x63\\x2f\\x75\\xc1\\x0d\\xf0\\x5b\\x25\\x54\\x72\\x38\\x57\\x40\\x17\\xfe\\x7b\\x64\\xb8\\xe9\\x98\\x69\\x15\\x7f\\xee\\x35\\xf7\\xad\\x7e\\x63\\xe9\\x95\\x93\\x30\\x29\\x29\\x50\\x3a\\x96\\x76\\x80\\x23\\xb4\\x12\\x5a\\xd7\\x49\\xdf\\xf4\\xb9\\x92\\xee\\x5c\\x2b\\x4f\\x3a\\xda\\x48\\x89\\xe4\\xae\\x62\\xec\\x15\\xd2\\xdb\\x59\\x69\\xd7\\x30\\xdb\\x30\\x75\\x47\\xf6\\x38\\xc3\\x18\\x50\\x32\\xb1\\x2f\\x75\\xfb\\xb3\\x17\\xe4\\x7d\\xf7\\xb9\\x29\\x2a\\xe9\\xe7\\x6a\\x2c\\x0a\\x06\\xfc\\xad\\x10\\x8c\\xdd\\x23\\x5f\\x6e\\x38\\xd9\\x67\\xb6\\x37\\x95\\x11\\xff\\x69\\x65\\xc2\\x2f\\x2c\\x66\\x80\\xa1\\x2b\\x03\\x04\\xeb\\x2b\\x29\\x6c\\x99\\xa7\\x6c\\x27\\x29\\xd9\\x8e\\x0a\\x78\\x24\\xb6\\x7f\\x3f\\xe8\\x42\\xd6\\xf6\\xab\\x27\\x3e\\x89\\x48\\x45\\xb3\\x2d\\xc6\\xdd\\xfc\\x7a\\x22\\x0f\\x76\\xbd\\x96\\x5c\\x69\\x85\\x81\\x83\\xc8\\xf3\\x57\\x39\\x5f\\xc5\\x7d\\xc8\\x29\\xde\\xfa\\xac\\xb5\\x60\\x3a\\x75\\x78\\x68\\xd5\\xe5\\x62\\xf9\\x78\\x1e\\xe3\\x9e\\x0e\\x94\\x68\\x8a\\xd3\\x54\\x5b\\x32\\xdd\\x73\\x66\\xb6\\xb0\\x47\\xe8\\xd1\\xd3\\xd5\\x65\\x99\\x7b\\x23\\x6e\\x7f\\x75\\x96\\xc5\\xf8\\xd7\\xc1\\xc1\\x1b\\xcf\\x4a\\x24\\x46\\x20\\xcb\\xd2\\x1d\\x55\\x9a\\x7c\\x9b\\x3f\"},\n{{0x70,0x74,0x56,0x86,0x11,0xa6,0x6d,0xfc,0xa8,0x30,0x7c,0xae,0x60,0x8b,0xb2,0x69,0x95,0x84,0x4d,0xf4,0x35,0xe5,0x30,0x0e,0x5b,0x4d,0x72,0x91,0xcc,0x22,0x90,0x7f,},{0xdd,0xab,0xdd,0xd1,0x5e,0xaf,0x83,0x11,0x5d,0xdd,0x06,0x5d,0x7e,0x22,0x0b,0x1e,0xfc,0x26,0x2a,0x61,0xc5,0x2e,0x91,0x43,0x47,0x44,0x2b,0xde,0x6d,0x00,0x25,0x06,},{0x7f,0x65,0x31,0x34,0xc0,0xb9,0x0f,0x44,0xa4,0x89,0xf0,0xb0,0x5f,0xc4,0x07,0x07,0xad,0x9f,0x13,0x98,0xf3,0x40,0xb4,0x47,0xa3,0xc9,0x86,0x1f,0x51,0x1c,0x9f,0x15,0x68,0x80,0x3b,0x76,0x84,0xa0,0x4a,0x89,0x8c,0x45,0x15,0x4d,0xd4,0x86,0xbd,0x50,0x75,0x89,0x98,0xe1,0x26,0x43,0x93,0x78,0xb3,0xf5,0x9f,0xf3,0x67,0x49,0x2a,0x0a,},\"\\x6c\\x13\\x74\\x23\\xea\\xc7\\x90\\xb8\\xe8\\xe4\\x18\\xb2\\x90\\xe0\\x57\\x9c\\x7b\\x86\\xb1\\x4a\\xed\\x81\\x8d\\xe8\\xce\\x53\\xce\\xa3\\xf3\\x40\\xa1\\xa9\\x53\\x91\\xf9\\x84\\x96\\x8f\\x2b\\x42\\x29\\x28\\x2a\\x81\\x61\\xc0\\x9a\\xb1\\x49\\xcd\\xac\\xd6\\x69\\x70\\xb4\\x01\\x3f\\x52\\xe5\\xe6\\x8e\\xa8\\xc9\\xdb\\x68\\x5b\\x2c\\x53\\x07\\x35\\x00\\xe5\\xb3\\x5e\\x29\\xea\\x0b\\xa1\\xf4\\xd1\\x59\\xa5\\x58\\xd3\\x61\\xb0\\x65\\x16\\x83\\x6c\\xf7\\xb9\\xea\\x50\\x1f\\xa0\\x50\\x6b\\x98\\x5f\\x03\\x6a\\x82\\xd9\\xe0\\x84\\x48\\x9d\\x3b\\xfe\\xd3\\x40\\x93\\xe2\\xd6\\xd9\\xed\\xf5\\x57\\x85\\xed\\x35\\xa9\\x0c\\xe5\\x6c\\x76\\x16\\x86\\xcc\\x3e\\xa1\\xa2\\xc7\\x6a\\xda\\x5e\\xc8\\xc1\\x45\\xd8\\x18\\xb0\\x47\\xcc\\x51\\x6e\\xec\\x5d\\x2d\\x6a\\x93\\xa5\\x55\\x92\\xd8\\x92\\xe3\\xd5\\xcd\\x10\\xc2\\x50\\xc0\\x4b\\x04\\x9b\\x38\\xfc\\x7e\\xc0\\xf3\\x9a\\xba\\x15\\x82\\x40\\x07\\x33\\x6c\\x2b\\x0f\\x7f\\x81\\xd6\\x4d\\x5c\\xa3\\xe2\\x9d\\x6f\\xda\\x4c\\x23\\xd9\\xba\\x65\\xd9\\xfe\\x3c\\xb4\\xe0\\x39\\x13\\x69\\x72\\x87\\xb4\\x6a\\x0b\\x1f\\xcc\\xd2\\x62\\x4e\\x39\\x7a\\xe9\\x5c\\x52\\x54\\xbc\\xd8\\x8d\\x2c\\x7c\\x8f\\x70\\xfd\\xc8\\x17\\x3f\\x64\\xc1\\xde\\x32\\x28\\x1a\\xb4\\x18\\x46\\x93\\xb4\\x8a\\x34\\x9e\\x67\\x82\\xbc\\x89\\x92\\xb4\\x3c\\x7d\\xe7\\xcb\\x9d\\x33\\x92\\x9b\\xf9\\x53\\x06\\xc2\\xaf\\x7e\\x93\\x8d\\x84\\x86\\xb3\\x86\\xf9\\xfd\\x3f\\x0f\\x71\\x61\\xe0\\xe6\\x86\\x2d\\x4f\\x92\\x81\\x44\\x68\\x65\\xa1\\xc9\\xbe\\x24\\x60\\xef\\xbc\\x20\\x15\\x1b\\x06\\xe7\\x9d\\x01\\x46\\x17\\xd0\\x30\\x0e\\x67\\x1d\\x48\\x76\\x74\\x58\\x59\\x66\\x25\\xb7\\x6d\\xff\\xc5\\x58\\xaa\\x9b\\x40\\x61\\x21\\x96\\xec\\x82\\x7e\\x1c\\x6f\\xff\\x51\\x8f\\xb7\\xad\\x4b\\xf8\\xc4\\x6f\\xcb\\x27\\x88\\x85\\xaa\\x49\\x1b\\x77\\xa2\\x89\\x95\\xcf\\xb9\\xd7\\x96\\x40\\xaa\\xd1\\x74\\xc6\\xdf\\x43\\x93\\x8e\\x3f\\x13\\x85\\x20\\x5c\\x54\\x59\\x5b\\x33\\xde\\xde\\x50\\x14\\x37\\x46\\xa1\\x70\\x5e\\x7e\\x0b\\x69\\xaf\\x4a\\x26\\xc3\\xb7\\x65\\x15\\x05\\x18\\x92\\xb1\\x5c\\xa6\\xe4\\x8c\\x3d\\x91\\xfb\\xc7\\x5e\\x8f\\xe4\\xa0\\xfe\\x8e\\xd2\\xc2\\x6c\\x10\\x73\\xbe\\xb7\\x0e\\xa3\\x8d\\x09\\x27\\x02\\x92\\x78\\x40\\x67\\x55\\xae\\x6e\\x11\\xda\\x37\\x86\\x53\\x64\\x95\\x15\\xe0\\x08\\x5b\\x5e\\xa7\\xdb\\x32\\x49\\x20\\x8e\\x33\\xa6\\xc8\\xb6\\xae\\x8c\\xd8\\x0c\\x9b\\xd6\\xb9\\x83\\xe7\\x3e\\x9b\\x91\\xdb\\xec\\x09\\x1f\\xae\\x99\\x5f\\x80\\x32\\x42\\x7e\\xde\\xc0\\x2c\\xad\\x90\\x55\\xeb\\x8b\\x7d\\xbc\\xfa\\x80\\xd4\\xf6\\x4f\\x57\\x27\\xa1\\x52\\xf1\\x1c\\x47\\xe5\\x2d\\x75\\x3a\\x57\\xb6\\xe5\\xfd\\xdf\\x77\\x4c\\xea\\x4d\\xa9\\x10\\x02\\x68\\x19\\xc4\\x1e\\x32\\xb4\\xf1\\x99\\x72\\x7e\\x23\\xc5\\x4a\\xb5\\xd7\\x01\\x42\\xb8\\x54\\xa2\\x7b\\x04\\xe6\\x4c\\xf4\\x4a\\xf2\\xa8\\x99\\x5e\\x12\\x00\\xbd\\x11\\x7c\\x7a\\x16\\x74\\xed\\xef\\x59\\xbc\\x53\\xf7\\x3a\\xda\\xf6\\x38\\xe0\\x77\\x3b\\x85\\xb5\\x63\\x34\\xaf\\xf6\\xe1\\x17\\x43\\xe3\\xa3\\xd3\\x61\\x4a\\xa8\\xa3\\x75\\xb3\\x78\\x1e\\xc8\\x14\\xcc\\x08\\xe7\\x1e\\xfa\\x78\\x18\\x51\\x9c\\xb2\\x4a\\xf8\\x2c\\x33\\x1d\\xfd\\x6a\\xc7\\x8e\\xc1\\x7f\\xd7\\x17\\x4b\\x61\\x02\\x1e\\x8c\\xf9\\x01\\xa2\\xaa\\xa6\\xad\\xbc\\x90\\x2a\\x91\\x6b\\x2a\\x2f\\x4f\\x79\\xe5\\x51\\x50\\x1f\\xbf\\x01\\xdf\\x6b\\x85\\x18\\x50\\x4c\\x1e\\x94\\x64\\x69\\x38\\xbe\\xd1\\xa8\\x50\\x9c\\x2a\\x38\\xfb\\x6a\\x79\\x8a\\x78\\x58\\xf4\\x09\\xb0\\xf2\\xfb\\x9b\\x3f\\x48\\x17\\xe5\\x68\\xc5\\x2d\\x9a\\xbf\\xe2\\x16\\x8c\\xc3\\x65\\x0f\\xc4\\x3e\\x0f\\x99\\x75\\xfe\\x29\\xe3\\x3a\\xed\\x1a\\x7b\\xf3\\x0d\\x86\\x31\\x15\\x07\\x90\\x65\\x0a\\x3c\\xb7\\x8c\\x36\\x8f\\x1a\\xea\\x9a\\xc6\\x0c\\x5e\\xeb\\x96\\x9a\\x45\\xf8\\x4a\\xa3\\x73\\x66\\xa8\\x39\\x77\\x19\\x0f\\x41\\xae\\x42\\x1e\\x0c\\x46\\xfd\\xa3\\xfa\\x01\\xb9\\x26\\xfc\\xef\\x82\\x24\\xfd\\xa3\\x6d\\xf4\\xf8\\xa8\\x77\\x01\\xfe\\x79\\xfe\\x06\\x28\\xef\\x0c\\xc0\\x2d\\xf2\\xbd\\x78\\x32\\x07\\xc7\\xdb\\x87\\x11\\x9a\\x03\\x69\\xfe\\x16\\xee\\xb3\\x8f\\xdc\\x9f\\xb3\\x5d\\x9e\\x19\\x5f\\xe1\\x4f\\x8c\\x10\\x38\\x20\\x8a\\xb9\\x77\\x00\\xaf\\x79\\xf2\\xe2\\xe0\\x54\\x96\\x83\\x02\\x07\\xc7\\xda\\x8d\\xbe\\x8e\\x9b\\xb7\\x3b\\xc4\\x71\\xa4\\x3f\\x1b\\xe6\\x50\\xfa\\x92\\x81\\x9a\\xeb\\x5d\\xc7\\xee\\xd7\\xee\\xd8\\x17\\x12\\x70\\xd2\\x19\\x25\\x7d\\x19\\x61\\x0b\\x89\\xd2\\xd6\\x2d\\x3f\\x5b\\x64\\x8e\\x13\\x9e\\xed\\xf1\\xff\\x74\\xbe\\x01\\xa5\\xef\\x1d\\x95\\xf8\\x12\\x92\\x26\\x01\\xee\\x92\\x51\\x51\\x57\\xc4\\xec\\xad\\xfa\\x3e\\xef\\x9f\\x2a\\x67\\x7c\\x00\\x3c\\xa4\\xab\\x9b\\x2c\\x45\\x47\\x2c\\xe5\\x5e\\x18\\xf4\\x0a\\x21\\xfe\\x1b\\x0d\\x45\\xb5\\x0b\\x50\\xc5\\x2a\\x0b\\x1a\\x5d\\x7c\\x37\\xd8\\xeb\\xc1\\x5e\\x02\\x05\\x84\\xd9\\xed\\xd7\\xb5\\x65\\x05\\xf8\\x20\\x78\\xe0\\xf8\\x99\\x38\\x91\\x35\\x01\\x4c\\x86\\xd1\\xe2\\xed\\x49\\xf9\\xcd\\x31\\x90\\x76\\x94\\x35\\x53\\xa3\\x12\\xae\\x05\\xab\\x33\\x35\\x26\\xe1\\x36\\x71\\x4f\\x09\\xa4\\x02\\xb3\\xc8\"},\n{{0x7d,0x7c,0xa8,0xe8,0xd3,0xb8,0x43,0x44,0xa5,0xe4,0xde,0xa0,0x8b,0x33,0x8d,0x8f,0xaa,0x5f,0xfc,0x11,0x9c,0xe5,0x66,0xef,0x65,0x6f,0x0f,0x45,0x84,0x77,0x5b,0x21,},{0x0b,0xde,0x34,0xb7,0x46,0xd2,0xc5,0x49,0x08,0x53,0x06,0x4d,0x48,0xc6,0xb4,0xc1,0xcb,0xbc,0x3e,0xe7,0xbe,0xff,0x5e,0x8f,0x68,0x4c,0x12,0x0f,0x31,0x5d,0x7e,0x4e,},{0xd0,0xc3,0xe2,0x48,0xa8,0xcb,0x2d,0xdc,0x7e,0x9f,0x21,0xc9,0xc5,0xb0,0x09,0xf7,0x0e,0xa2,0x9d,0xa6,0x89,0x7c,0xd9,0x2c,0x26,0x0f,0x04,0x7e,0xd6,0x8a,0xa1,0xc8,0xb9,0x65,0x7f,0x9d,0x82,0x6e,0x88,0xf4,0xa5,0x12,0xc5,0x00,0x3b,0xe6,0x40,0x68,0x80,0x74,0x12,0x63,0xae,0x7c,0xe6,0x86,0x0e,0xfe,0x73,0xad,0x54,0xd4,0x82,0x04,},\"\\x0b\\x72\\x70\\x75\\x34\\x5d\\x61\\x9f\\x5c\\xdc\\x7f\\xc4\\xc4\\x3c\\xdc\\x19\\x10\\x58\\x11\\xd9\\x5d\\x06\\x9f\\x81\\xc0\\xa6\\x2f\\xe1\\xe1\\x17\\x8c\\xf1\\xc3\\x5d\\xb0\\x5e\\x2d\\xe8\\x7d\\x11\\xae\\x1a\\x6f\\x53\\xef\\x38\\xb3\\x9b\\xf4\\xed\\x8f\\xbf\\x56\\xef\\x01\\x7a\\x1d\\x3c\\x15\\xb6\\x4f\\xe4\\xb2\\x61\\x0b\\xf6\\x9b\\xd1\\x9a\\xc7\\xaf\\xd4\\x6a\\x2b\\x87\\xb4\\x88\\xb6\\xc7\\x8a\\xd4\\x56\\x81\\x1c\\x1d\\xd6\\xbd\\x4a\\x6b\\x5d\\xa6\\x98\\x73\\x9f\\xd1\\xa1\\x4c\\xeb\\x9f\\x27\\xf1\\x24\\xb6\\x9f\\x6b\\xd1\\x6d\\xe5\\x53\\x7a\\xad\\x80\\x68\\x1c\\x56\\x33\\x58\\x03\\x94\\xda\\x3b\\x84\\xe9\\xb7\\xa5\\x5e\\xba\\xb8\\x52\\x2d\\x2d\\x6b\\xf1\\xaa\\x4e\\x7b\\x15\\x9c\\xbf\\x4e\\x20\\xb5\\x0b\\xfe\\x9c\\x71\\x1a\\xa0\\x47\\x11\\x9f\\x1d\\xad\\x87\\x49\\x26\\x0b\\x87\\x63\\x9e\\x9c\\x14\\x1d\\xef\\x62\\x02\\x6a\\x99\\x03\\x73\\xdc\\xfd\\x99\\xf7\\x7b\\x0f\\x5e\\xa6\\xad\\xfd\\x8f\\x59\\x4b\\x9c\\xe4\\x10\\x64\\xa5\\xed\\x30\\x7b\\xf2\\xd8\\xd1\\x73\\x70\\x49\\x8a\\xd7\\xf4\\x5f\\x9c\\x4d\\xd2\\x6c\\x42\\x0f\\x45\\x0f\\x53\\x62\\x3b\\xb6\\xd7\\xf3\\xf4\\x6a\\x14\\x9d\\x8f\\x13\\x5b\\xc2\\x91\\x33\\x10\\xfb\\x8f\\x90\\x43\\xd0\\x99\\x27\\x8b\\xbe\\xba\\x39\\x17\\x9f\\xa3\\x67\\xb0\\x16\\x73\\xe1\\xc9\\x53\\xef\\xfd\\x2c\\xae\\xa7\\x31\\x1c\\x47\\xc0\\x37\\x27\\x44\\x09\\x5b\\x1c\\x8f\\x90\\xee\\xf5\\xf1\\x92\\x9d\\xb1\\x99\\x6c\\xd5\\x84\\xf6\\x15\\xd5\\x6f\\xae\\x3a\\xec\\xac\\x3e\\xe8\\x8b\\xd0\\xb2\\x96\\xf4\\x49\\xcc\\x27\\x13\\xc5\\x2d\\xa6\\x95\\x24\\x8f\\xaa\\x8e\\x38\\x9b\\x05\\xa0\\xbc\\xac\\x69\\xdc\\xe9\\x71\\x97\\x23\\x19\\x4f\\x43\\x3b\\x02\\x97\\xeb\\x08\\x59\\x01\\x9f\\x14\\x1a\\x20\\x7c\\xe8\\xcc\\xb5\\x98\\x82\\xca\\xa6\\xe1\\x8f\\x0b\\x43\\xbd\\xdd\\xb9\\x0a\\x0a\\x85\\xff\\xd5\\x77\\xd6\\x39\\x4a\\x1d\\x80\\x48\\x94\\x10\\xf9\\x2a\\xfb\\x85\\xba\\x50\\x6a\\xa9\\xf3\\xf4\\x27\\x44\\x5d\\x21\\x22\\x4b\\x9c\\xb0\\x46\\xc0\\x5f\\x1b\\xac\\xd7\\xb7\\x49\\xfb\\x7b\\x10\\x24\\xd0\\x92\\xe4\\xee\\x4b\\x30\\xa4\\x6e\\xdf\\x71\\x84\\x70\\xc9\\x94\\x91\\xc6\\x8f\\x48\\x79\\xd6\\x2b\\xfc\\xe7\\x04\\x6d\\x81\\x38\\xcb\\xb9\\xe7\\x21\\x29\\x99\\xa4\\x49\\x8b\\x45\\x5f\\xc9\\x0a\\xc2\\x83\\xe9\\x35\\xde\\x04\\xdf\\x6f\\xc9\\x99\\xe4\\x43\\x4b\\xe1\\x10\\x63\\xd6\\xe4\\xee\\x9e\\x09\\x6a\\x87\\xbc\\x71\\x6d\\x2c\\x81\\x99\\x16\\xc3\\x7a\\x4e\\x62\\x98\\xc4\\x99\\x45\\x36\\x6e\\xc3\\xf5\\x00\\x72\\x0b\\x06\\xdc\\x99\\xd3\\xd8\\xac\\x30\\x3e\\x6c\\x26\\x4e\\x28\\xa7\\xc2\\xd4\\x19\\xec\\x62\\x2a\\x97\\xa7\\x11\\x54\\x4f\\xb1\\xf4\\x73\\x5b\\x11\\xf8\\xbb\\x1d\\x7e\\x2c\\x81\\x6a\\x15\\x62\\x87\\xb4\\xcc\\x0c\\x65\\xaa\\xa2\\x80\\xb8\\x37\\x73\\x7f\\x0a\\x84\\xe3\\x6d\\xe2\\xdf\\x2f\\xc3\\xa5\\x0d\\xf9\\x80\\x91\\x8f\\xb9\\xe5\\x83\\x4b\\x42\\xac\\x0e\\x0c\\x72\\x78\\xd7\\xfe\\x8d\\xb4\\xdb\\xde\\xca\\x01\\x41\\xd5\\xfe\\xf5\\xdc\\x61\\x51\\xf8\\x7b\\x86\\x34\\xc2\\x41\\xa8\\xfa\\x0a\\x82\\x71\\x78\\x99\\x77\\x3a\\xe8\\x9f\\x53\\x78\\x90\\xb9\\x15\\x5a\\x7a\\x05\\xbc\\xe4\\x78\\x66\\xec\\x20\\x28\\xa4\\x78\\x98\\xd4\\x85\\x82\\x3a\\x2e\\x99\\x23\\x19\\x68\\x0e\\xb6\\x99\\xb0\\xdd\\x53\\x58\\xf5\\x46\\xfc\\x53\\x7c\\x73\\xd3\\xa4\\xb2\\x23\\xa0\\x94\\x15\\x18\\xb6\\xd1\\xe6\\x6b\\x27\\x67\\x6c\\x1b\\x1f\\xc7\\x6a\\x08\\x32\\x05\\x24\\xa7\\x2e\\x29\\x7f\\xce\\x17\\xaa\\x80\\xd8\\xea\\x7b\\x38\\x8a\\x55\\x16\\x8e\\x7d\\xad\\xb8\\x36\\xe9\\xde\\xe7\\x07\\xed\\x25\\xc0\\xee\\x4d\\xb2\\x5b\\xee\\x3c\\x48\\x5b\\x39\\x64\\x92\\x04\\xef\\xaf\\x28\\x20\\xb2\\x73\\x63\\x68\\xfc\\x77\\x3c\\xe0\\x90\\xc3\\x85\\x37\\x80\\x02\\xc4\\x71\\xb0\\x94\\x79\\x5c\\xb2\\x66\\xd3\\x9e\\xb7\\x58\\x0d\\x70\\x1b\\xe4\\xc8\\x91\\x6f\\x6b\\x38\\xbf\\xe2\\x5f\\xdf\\x36\\xd6\\xc4\\xad\\xaf\\xa9\\xae\\x98\\x64\\xc5\\x7b\\xb7\\x37\\xb4\\x95\\x06\\xed\\x38\\xd6\\x2d\\xe6\\x0c\\xc0\\x59\\x9e\\xc6\\xbb\\x1a\\xcf\\x24\\xb1\\xd3\\x7d\\x60\\xef\\xde\\xb7\\xd9\\x42\\xc5\\x36\\x03\\xa2\\xf0\\x47\\x6e\\x95\\x12\\xc9\\x38\\xb2\\x8d\\x49\\x5a\\x6f\\x26\\xa9\\x07\\xc3\\x96\\xb8\\x41\\xae\\xdd\\x8e\\x14\\xac\\x44\\x7b\\x49\\x5d\\xf1\\xf6\\x76\\xda\\xcc\\xd5\\xa7\\x40\\xc0\\x42\\xf5\\x77\\x2b\\x7d\\xb1\\x7f\\x4f\\x1a\\x3a\\x1c\\x8e\\x7c\\x48\\x83\\x70\\xe7\\x36\\xb5\\x1e\\x69\\x0f\\xd2\\xdd\\xcb\\x5a\\xa6\\x19\\x57\\xa7\\xc7\\x97\\x5a\\xcb\\x2d\\xcb\\x91\\x5d\\x07\\x4d\\x74\\x42\\x79\\xea\\x1c\\x41\\x69\\xf8\\x68\\x87\\x3a\\xc5\\xc2\\x08\\x90\\x16\\x2c\\x1d\\xf9\\x65\\x64\\x19\\x97\\x5a\\x43\\xd3\\x19\\x8e\\x18\\xc3\\x09\\xa1\\xeb\\x7c\\x1d\\x87\\x87\\x3f\\xb1\\x5c\\x6d\\xa4\\x7f\\x54\\x8a\\x01\\xf6\\x9b\\xda\\xb9\\xc3\\x9e\\xf0\\x0d\\x41\\x8a\\x6f\\x61\\x9d\\xd7\\x3d\\x7d\\xb4\\x5c\\xbb\\x6a\\xd2\\x25\\xa2\\xde\\x78\\x7b\\xa7\\x77\\xbc\\x73\\xd2\\x8f\\xc3\\x04\\xf1\\x00\\x09\\xf4\\x02\\x2c\\x2c\\xf8\\x4d\\xe0\\x08\\xd7\\x0f\\xcd\\xc8\\xba\\x7f\\x10\\x7c\\x36\\x98\\x59\\xe9\\xc9\\x0c\\xa8\\xa3\\x93\\xb5\\x53\\xf2\\x66\\x05\\xff\\xd7\\x23\\x0c\\x92\\x14\\x90\\x70\\x0f\"},\n{{0xd2,0x1f,0xdd,0x7b,0x10,0xe5,0x4a,0x8b,0x6b,0xe9,0x5a,0x02,0x24,0xad,0x70,0x66,0x4d,0xd9,0x21,0x12,0xe2,0x68,0x3a,0x4f,0xd2,0x79,0xc4,0x07,0xdb,0x38,0x71,0xbb,},{0xf8,0x9c,0x27,0x2e,0x7d,0x1c,0xc9,0x3d,0x69,0xf6,0x94,0xde,0xc9,0xcc,0xe0,0x5a,0xc2,0x47,0x73,0x45,0x04,0x82,0x9c,0x56,0x99,0x74,0x13,0xc8,0x95,0x8b,0x93,0x30,},{0x6d,0x69,0xe8,0x3b,0x3e,0x7e,0xd5,0x5a,0x85,0xf9,0xfc,0x9d,0x25,0x19,0xda,0x0b,0x0a,0x1e,0xb4,0xda,0xae,0xe9,0x91,0xa6,0x65,0x1f,0x5c,0x89,0x19,0x0c,0x0d,0xe7,0x23,0x73,0xcd,0x98,0x9d,0x46,0xbe,0x13,0x67,0xf9,0xda,0xf1,0xb9,0x2f,0xed,0x3b,0x52,0xbb,0xa5,0x4a,0x1e,0x4c,0xca,0x5b,0xc8,0x72,0x6e,0xd0,0x7f,0x30,0x25,0x01,},\"\\xb8\\x64\\x4a\\xdb\\xef\\x9c\\x7c\\xab\\x91\\x20\\xac\\xed\\xc8\\xe7\\x5c\\x43\\x3d\\x03\\x6f\\xfa\\xe0\\xf9\\x55\\xbe\\x6a\\x48\\x8f\\x1f\\x42\\x7a\\x68\\xa8\\x90\\x2d\\x02\\x6e\\x63\\xdd\\x6c\\x9b\\xf9\\xd9\\x7d\\xe7\\x86\\xb3\\x1d\\xd4\\xf4\\xc9\\xa4\\xf8\\xa6\\x22\\xf1\\xff\\xc8\\x4d\\xa6\\x96\\x7c\\xa7\\x74\\x33\\xc3\\x98\\xf4\\xd3\\xf1\\xc4\\x43\\x49\\x89\\xb7\\xac\\x9d\\x0f\\x3b\\x1b\\xe0\\xc8\\xb3\\x52\\x82\\x4f\\x4e\\x7a\\x08\\x3f\\x34\\x2e\\xc1\\xbe\\x1d\\xa8\\xfb\\x75\\x52\\x42\\xa6\\x54\\x88\\x0e\\xf2\\x98\\xf0\\x59\\x79\\xff\\x02\\x6d\\xdc\\xc0\\x44\\x86\\x0e\\x67\\x57\\xa2\\x9c\\xfa\\xa2\\x22\\xa3\\x59\\x7e\\x38\\xf1\\x77\\x99\\x62\\xa4\\x1a\\x4c\\x8c\\xe6\\xa6\\x5b\\x87\\x81\\x99\\xb4\\xd8\\x0f\\x4a\\x03\\x90\\xca\\xc1\\x9c\\x22\\x6e\\xea\\x4b\\x60\\x36\\xe5\\x7a\\xd8\\x30\\xec\\xfc\\x00\\x69\\x3e\\x26\\x13\\xd3\\xed\\xf4\\x65\\xfc\\x8c\\x4f\\xa2\\x93\\xfd\\x8c\\xfc\\x36\\xdc\\x8e\\x37\\xbc\\xeb\\xab\\xec\\x03\\x49\\xeb\\xd8\\x84\\xe1\\xb2\\x8b\\xce\\x82\\x4e\\x0d\\x55\\xb6\\xd0\\x15\\x38\\x38\\x01\\x66\\x8b\\x34\\xf5\\xba\\x72\\x3d\\x2a\\xc0\\xa2\\x64\\xfa\\xb2\\xc7\\x28\\x60\\x8f\\x16\\x2d\\xe0\\x11\\x79\\x25\\x9b\\xe2\\xcc\\xb0\\x81\\x50\\x02\\xfd\\xed\\x8e\\x0d\\x78\\xb0\\x28\\x07\\x31\\x3e\\x91\\x0e\\xb3\\xa7\\x33\\x7c\\x53\\x4e\\x84\\x6f\\x9e\\xe1\\x55\\x42\\x6e\\x4a\\xef\\x64\\x36\\x61\\xb0\\xed\\xb4\\x45\\x96\\xfd\\xdc\\xd0\\xb3\\xe8\\x14\\xc1\\x37\\x81\\x7a\\x42\\x2b\\xaa\\x40\\xc9\\x05\\x3d\\x03\\x86\\xc6\\xec\\xdb\\x58\\x90\\x52\\x59\\x47\\x42\\x67\\x7c\\x48\\xdc\\xfc\\x8c\\xd4\\xa9\\x36\\x67\\xed\\x4d\\x87\\x64\\x60\\x01\\xed\\xa0\\x79\\xe8\\xb9\\x9d\\x52\\xba\\x21\\xc5\\xec\\x56\\x69\\xfe\\xdf\\x6f\\x40\\x44\\x7a\\x7f\\xf8\\x90\\x1d\\xb0\\xef\\x18\\x47\\xd3\\xca\\xcf\\x01\\x98\\xa2\\xf3\\xbd\\x7b\\xcf\\x2d\\xd8\\x11\\xa0\\x97\\xfc\\x5e\\x51\\x88\\xb0\\x3f\\xdf\\x54\\xe5\\x17\\x63\\x7a\\x14\\x50\\x10\\x00\\xd0\\xd3\\x55\\x16\\xca\\xf0\\x69\\x94\\x02\\xb4\\x8f\\x8d\\x8c\\xc3\\xaf\\xb1\\x7a\\x56\\x13\\x2d\\x08\\x23\\x70\\x35\\xa0\\xc9\\x54\\x90\\xbf\\xe5\\xd7\\xb7\\xfb\\x40\\x17\\x8f\\x28\\x1e\\x4d\\x87\\x2e\\x47\\xa0\\xe9\\x55\\xce\\x97\\x36\\xf3\\xc3\\x33\\xa6\\xad\\xf5\\x0a\\xd3\\x19\\x94\\xeb\\x9f\\x45\\x32\\x7f\\xac\\xc8\\xc5\\xd1\\x13\\xfa\\xd4\\x71\\x3f\\xe7\\xf1\\x98\\x01\\x0d\\x42\\x04\\x6b\\xbf\\xe6\\x8b\\x0d\\xaa\\x79\\xdc\\xb8\\x75\\x59\\x29\\xbe\\x92\\xf9\\xca\\xa1\\x50\\xdf\\xbd\\xe3\\xfc\\x9e\\x39\\x2b\\x2b\\x70\\x1c\\x30\\x21\\xc2\\x40\\xe4\\x67\\x9d\\xe4\\x11\\x24\\xb1\\x88\\x8e\\x5d\\xb5\\xa8\\x3d\\x05\\xce\\xaf\\x49\\xeb\\x44\\x0d\\xc4\\x50\\x26\\xd4\\x50\\xbc\\x98\\x4b\\x8d\\x6f\\x02\\x85\\x0e\\xcb\\x57\\x0e\\xee\\x0a\\x38\\x19\\xb1\\x2b\\xc2\\x63\\x67\\xb5\\xb9\\x8e\\x1b\\x14\\x1c\\x9b\\x0a\\x96\\x90\\xea\\x4a\\x37\\x00\\xda\\xd1\\x23\\x95\\xf9\\x75\\xd1\\x1c\\xd7\\x7f\\x96\\x36\\x88\\x31\\xf2\\x1f\\x4e\\x96\\x8c\\xc5\\xba\\x9e\\xf8\\x24\\x74\\x03\\x8b\\xc7\\xaa\\x26\\x12\\x2d\\x21\\x8b\\x74\\x30\\x41\\x50\\x6a\\xeb\\xbd\\x1f\\x98\\x79\\x59\\xfd\\x16\\x0d\\x6e\\xb7\\xd5\\x8d\\x4f\\x57\\x6f\\x8c\\x0c\\xa8\\xaf\\x86\\x8e\\x39\\xb5\\xea\\x87\\x20\\x39\\x37\\xe0\\x30\\x8a\\xcb\\xea\\xe9\\x1e\\x10\\x60\\x7e\\x44\\xe8\\xab\\x49\\x5b\\xc0\\x1d\\xd5\\x73\\xfb\\xad\\xc9\\x44\\x79\\xff\\x92\\x08\\x2c\\x7b\\xb7\\x51\\x34\\x79\\xc7\\x0f\\x04\\x07\\x76\\x90\\x25\\xd3\\x4d\\x72\\x14\\x0c\\x25\\xd8\\x21\\xf0\\x34\\xa3\\x98\\x51\\xa9\\x3c\\x62\\x3b\\x71\\xc9\\x40\\x0e\\x94\\x26\\x39\\xf2\\x8b\\xbd\\x03\\x2e\\x1d\\x8d\\x3c\\x05\\x9f\\x7c\\x2c\\xd3\\x1d\\x74\\x76\\x46\\x2d\\x27\\x76\\x03\\x5d\\x07\\x88\\x02\\x02\\xdb\\xfe\\x9e\\x07\\xd1\\x54\\x62\\x2d\\x7a\\xc6\\x17\\x5a\\x5a\\xfa\\x79\\xfe\\xd4\\xdc\\xc1\\x37\\x12\\x62\\x0c\\x41\\x99\\x4e\\x11\\xd9\\x24\\x30\\x8f\\xb2\\xff\\x3a\\x1e\\xda\\x44\\xc7\\x61\\xbc\\x73\\x6f\\x34\\x51\\x22\\xf0\\x2a\\x40\\xae\\x6f\\x7d\\xbd\\x03\\xd9\\xfe\\x96\\xee\\x3d\\x7a\\x3b\\x4a\\x5e\\xef\\xbf\\xcc\\x56\\xdc\\x42\\xef\\x27\\xbd\\x80\\x85\\x17\\x60\\x38\\xb9\\xeb\\xae\\x63\\xaa\\x75\\x03\\x52\\x75\\xec\\x34\\xe4\\x18\\x57\\x39\\xd6\\x36\\x24\\x67\\x70\\xac\\xcc\\xc6\\xdc\\x62\\x0e\\x2f\\xc9\\x15\\x6f\\xa9\\x48\\x3e\\x0d\\x9c\\xae\\x0e\\x8c\\x46\\x39\\x48\\xa3\\xd9\\x7a\\xe8\\xdd\\xa5\\x96\\x6c\\x88\\xf0\\x70\\x93\\x29\\x2c\\xce\\x22\\xbb\\xda\\x06\\x2b\\xaa\\xfa\\x7f\\xe8\\x4d\\x0b\\xa2\\xd2\\xdd\\x29\\x5b\\x23\\x45\\x8b\\xca\\xeb\\x2e\\xf7\\x42\\xa2\\xed\\x1c\\x83\\x44\\x83\\xcd\\x70\\x93\\x85\\xaf\\xea\\xdc\\xbc\\x0a\\x9c\\x6a\\x4f\\x38\\x7b\\xab\\xf7\\xe3\\xdc\\x36\\xc8\\x10\\xdb\\x20\\x9b\\xeb\\x66\\xc8\\x66\\x64\\x04\\xc6\\x61\\xdf\\xe9\\xd3\\x2c\\x4c\\x08\\xaf\\xc6\\xf3\\xb1\\x25\\x7d\\x64\\x84\\xa7\\x55\\xf5\\xac\\x70\\x1e\\xb1\\x3f\\x87\\x76\\x3f\\xee\\x33\\x0f\\xfa\\x04\\x22\\xcd\\x80\\xa9\\x20\\x38\\xc6\\xf4\\x52\\x92\\xbd\\xee\\x5f\\x89\\xe9\\x4c\\x7a\\x65\\x21\\x97\\xfc\\x19\\x06\\xb4\\x82\\x58\\x37\\x24\\x49\\xb1\\x08\\x1c\\x6b\\x97\\x13\\x4c\\x43\\xc8\\x9e\\xe2\"},\n{{0xd3,0x36,0xfd,0x84,0x08,0x19,0x6d,0x22,0xfb,0x69,0x8e,0xb2,0x5b,0x76,0x54,0xfd,0xa4,0x6f,0x5d,0xe4,0xc9,0xb4,0xd0,0x49,0x50,0xc3,0x98,0xb5,0x9a,0x44,0x29,0x0a,},{0xf3,0xcd,0x96,0x34,0x7c,0xea,0x63,0xe5,0x00,0xa4,0xc9,0x2c,0x3b,0xf2,0x15,0x66,0x2d,0xd0,0x40,0x07,0x84,0xdb,0xf8,0xb5,0x95,0xdd,0x3d,0x39,0x5f,0x90,0xcc,0x12,},{0xaf,0x7e,0x2d,0xf7,0x52,0x9f,0xd1,0x8d,0x1b,0x21,0xb8,0xfd,0x4c,0x06,0x81,0x50,0x59,0x18,0xe2,0x51,0x14,0x34,0xfe,0x4e,0x49,0x54,0xe7,0x43,0xc1,0xcf,0xa4,0x5e,0x41,0x09,0xd3,0x6c,0x3e,0xec,0xf2,0xe2,0x5d,0x20,0x9b,0x9b,0x5d,0x25,0xf7,0xcb,0xc3,0x80,0x29,0x6d,0x64,0x77,0x52,0xe3,0x0d,0x3b,0xea,0x3b,0x92,0x9b,0x09,0x03,},\"\\xfb\\x49\\xc1\\x9b\\xc4\\x44\\x4c\\x28\\xeb\\x26\\x25\\xf3\\x1d\\x99\\x6d\\x5e\\x36\\xc5\\x7f\\xa6\\xfd\\xd7\\x72\\xe6\\x7b\\x71\\x99\\xce\\xc6\\x7e\\xda\\x54\\x51\\x71\\x2d\\xf7\\xa6\\x9d\\xbb\\xd5\\x6e\\x7c\\x39\\x87\\x96\\xb2\\x00\\x1d\\xef\\x65\\x1c\\x4b\\x9c\\x05\\xee\\x31\\xd9\\x56\\x79\\x53\\x5c\\x81\\x2a\\x37\\xd3\\x1d\\xdb\\x30\\x73\\x19\\x9c\\xd7\\x04\\xff\\x7c\\xa2\\x98\\x1f\\x7b\\x9c\\x92\\x7a\\x7f\\x7d\\x77\\x6f\\xb6\\xf6\\x09\\xf7\\x27\\xe6\\xea\\x70\\x9c\\xe7\\xf4\\x3a\\x60\\x79\\x35\\x04\\x16\\x9a\\x89\\x05\\xd9\\xb2\\x31\\x09\\xf0\\xd8\\x67\\x96\\x6a\\xa3\\xe3\\x00\\xc7\\xe1\\x1d\\xde\\xdb\\x9c\\xc1\\x17\\xb9\\x04\\xf6\\x29\\x27\\xe4\\x8e\\x4d\\x73\\xfe\\x1a\\x6c\\xec\\xcc\\x4c\\xeb\\x08\\xe6\\x4a\\xb5\\x5f\\x25\\xc9\\x82\\x16\\xce\\xc9\\x37\\x60\\x8a\\xd7\\x93\\x14\\x69\\x98\\xf1\\x4c\\x29\\x85\\xe6\\xc2\\x91\\x0d\\xf7\\xb1\\x38\\x8f\\x9d\\xd8\\x63\\xf1\\xe4\\xd7\\xd1\\x62\\x14\\x79\\xb8\\x51\\x2c\\xdb\\x34\\xe6\\x73\\xeb\\x02\\xa4\\x89\\x34\\xe3\\x9c\\x2d\\x18\\xd7\\x0f\\x96\\x6d\\x67\\x6a\\x2b\\xd7\\x5d\\xb5\\x43\\xd2\\x5c\\x5d\\xcd\\xc3\\xef\\x3b\\x8b\\xc8\\x20\\x18\\x48\\xc3\\x09\\x61\\xe9\\x15\\xd9\\x68\\xbd\\xc3\\x19\\x46\\xb0\\xd1\\x8e\\xde\\x7c\\xb0\\x16\\x6d\\xbe\\x1f\\xfe\\xff\\x94\\x39\\xc9\\xc3\\x40\\x4a\\xf6\\x01\\x6c\\x73\\xed\\xeb\\x25\\x3d\\x93\\xf5\\x62\\xa1\\xa6\\xcd\\xd5\\x78\\x98\\xa9\\xb3\\x42\\x25\\x87\\xd5\\xf5\\x6a\\xf3\\xd0\\x6b\\x3f\\x6c\\x25\\x75\\x1f\\x44\\x46\\x0f\\xb3\\x29\\x96\\x56\\xdc\\x11\\x22\\x7e\\xf4\\x83\\x7a\\xab\\xdd\\xee\\x40\\x0f\\xa5\\x3f\\x69\\xe5\\xce\\xd0\\x53\\xc7\\x6d\\xce\\xcd\\xf0\\xad\\xc9\\xef\\x80\\xf4\\xb3\\x30\\x54\\x2f\\xf1\\xfa\\x2d\\xf0\\xb8\\xd4\\x3c\\xd1\\xc3\\x11\\xb1\\xb9\\x95\\x5c\\x63\\x2c\\x8e\\x5f\\x04\\x91\\x93\\x1c\\x04\\xde\\x43\\x4d\\xf8\\xf7\\xa3\\x94\\xe5\\xfe\\xf0\\x16\\xdb\\x2e\\xb7\\xc8\\x7b\\x2a\\xc7\\xa4\\xa7\\x30\\x43\\xbd\\x7f\\x98\\xad\\x0a\\x4d\\x45\\x3a\\xbf\\xb0\\xbe\\x8b\\xe4\\xcb\\x14\\x57\\x42\\xaa\\x56\\xaa\\x5e\\xf2\\xdf\\xf1\\x22\\x30\\xa5\\x10\\xe3\\xb7\\xf8\\x2f\\x78\\x47\\x70\\x0e\\xee\\xa5\\x90\\x5b\\x02\\x89\\x69\\x6c\\x4c\\x14\\x2b\\xf3\\x4b\\xcf\\x81\\xa9\\x62\\xd7\\x5b\\x8d\\x09\\x10\\x55\\x73\\x37\\x79\\x33\\x5b\\x7f\\xd4\\x7a\\x20\\xd1\\x7c\\x94\\x8a\\xb7\\x32\\x94\\x78\\x32\\x67\\x43\\x71\\xe2\\x2e\\x71\\x11\\x34\\xf5\\xc9\\x19\\x79\\x23\\x57\\xf7\\x9b\\xf7\\x0c\\x44\\x70\\x78\\x75\\x28\\x43\\x4f\\xc0\\xb4\\xca\\x09\\x3e\\xe9\\x25\\x43\\x42\\x0d\\x1c\\xa8\\x11\\x24\\xf5\\x58\\x53\\x17\\xe2\\x50\\x82\\x1a\\x4f\\x3d\\x8c\\xe0\\xf9\\x19\\xde\\x9f\\xbf\\x01\\x27\\x08\\x7e\\x67\\x69\\x03\\xf6\\xcb\\x39\\x02\\x5b\\xcc\\x73\\xa0\\x76\\x29\\x54\\xb7\\x2e\\x66\\xa6\\xbe\\x9b\\x96\\xc9\\x7b\\x6f\\x60\\x30\\xbf\\x5c\\xa0\\xbc\\x27\\x27\\xa9\\xa1\\x79\\xcf\\x9d\\x94\\x05\\xf3\\xfe\\x18\\xf3\\x49\\x23\\x89\\x07\\x9a\\x5b\\x65\\xbc\\xb1\\x3a\\x0d\\x5e\\xf4\\x1c\\x2c\\xd9\\x7e\\x70\\x2c\\xee\\x4a\\x2f\\xeb\\x1e\\x67\\x02\\xbd\\x4c\\x63\\xfe\\x0a\\x4a\\xe9\\x94\\xc4\\x28\\x7a\\x83\\x7b\\xc3\\xf6\\x4c\\x2d\\x89\\x88\\x57\\xcd\\xb3\\x2a\\xcd\\x4b\\xd1\\x33\\x67\\x6e\\x51\\xf7\\x7b\\xc7\\x11\\x0e\\x3c\\xe5\\x2d\\x92\\x04\\xfd\\x26\\x91\\xa6\\xd3\\x70\\x78\\xf6\\x8e\\x7b\\xce\\xf3\\x0f\\xc9\\xc4\\x83\\x98\\x58\\x22\\xb6\\x61\\x11\\x92\\x38\\xe4\\x0f\\x9c\\xfd\\xca\\xbe\\xf2\\xd7\\xb1\\x6b\\x05\\x9a\\xb2\\x4a\\xdc\\x05\\x00\\x37\\x12\\xbb\\xb1\\x28\\x09\\x6e\\x37\\xf9\\x1b\\xc4\\xc5\\xc8\\x15\\x08\\xbe\\x27\\xfa\\x0b\\x84\\x94\\x0b\\xe3\\x6b\\xce\\xd2\\xe6\\x5c\\xd3\\x6b\\x39\\xfb\\xdc\\x5e\\xa6\\x86\\x14\\x15\\x92\\x28\\xca\\x65\\xc5\\xd8\\x40\\x7b\\xaf\\x66\\x3b\\x52\\x8e\\x7d\\x87\\x73\\x4c\\x7b\\xc7\\x7d\\xc8\\x43\\x1a\\x1d\\xd6\\x87\\x3c\\xfd\\xdf\\xc3\\xe7\\x57\\xd9\\xad\\x1f\\xed\\xd3\\xc7\\x98\\xf1\\xfe\\x60\\xe7\\x15\\xee\\x48\\xa6\\xbc\\xbb\\x13\\xb6\\x16\\xa8\\x9a\\x38\\xe3\\x36\\x48\\x9d\\x3d\\x6c\\xcb\\x72\\x69\\x14\\x11\\x2a\\x1b\\xc5\\xd9\\x77\\xc9\\xb2\\xa3\\xfa\\xc1\\x07\\xad\\x09\\x4b\\x03\\x8a\\xb7\\x54\\x68\\x26\\x3c\\x34\\xbd\\xa8\\x17\\xc0\\x56\\xe0\\x7a\\x6c\\x56\\x69\\x7c\\xb6\\x4a\\x0b\\x1f\\x96\\x6f\\x6d\\xe0\\xbb\\x1c\\x0a\\x71\\xc8\\xa5\\xfe\\x13\\x3b\\xa2\\x03\\x6d\\x24\\xda\\xcc\\xad\\x3f\\xa0\\x3b\\x39\\xcd\\x27\\xf8\\x32\\x75\\x27\\x51\\x05\\x5a\\x81\\x55\\x91\\x3d\\x04\\x0f\\x51\\xda\\xe7\\x8d\\x71\\x94\\x6c\\xa0\\x4d\\x83\\xc7\\xc8\\x94\\xc2\\x80\\xaa\\xec\\x28\\x55\\x43\\xe5\\xfd\\x5e\\x32\\x7a\\xcc\\xca\\x9a\\xbe\\xf1\\x56\\xa1\\x3b\\x95\\x71\\x44\\x6b\\xd8\\x00\\x7f\\xf9\\x2d\\xbc\\x0f\\xba\\xf2\\x3a\\x94\\x41\\xb5\\x3c\\x1c\\xd7\\x40\\xc3\\x4c\\x28\\x29\\x29\\x10\\x1a\\xd2\\xea\\x8b\\x85\\xd7\\x00\\x52\\x99\\x1b\\x77\\x4e\\x92\\xff\\x75\\xcc\\x85\\x11\\x3e\\x09\\x00\\xb5\\x1b\\x86\\x3e\\x1f\\x2a\\xda\\xab\\x2d\\xbc\\xf4\\x6a\\xf4\\x79\\xea\\x24\\x8e\\xc2\\x88\\x9a\\xfb\\xfe\\x73\\x74\\x08\\x39\\x3a\\x2b\\x1b\\x33\\x01\\xf6\\x5c\\x1f\\xac\\x8b\\x67\\x67\\x95\\xab\\x5b\\xf4\\x47\\xf0\\x5e\\x0d\\xaf\\x67\\x76\"},\n{{0x65,0x73,0x22,0x78,0x41,0xf6,0xf9,0x28,0x31,0x14,0x6c,0x44,0xc0,0xe4,0x80,0xcd,0xf5,0x44,0xbb,0x87,0x65,0x52,0xcc,0x5f,0x9d,0x42,0xf1,0x5b,0xdc,0xc0,0x44,0xb8,},{0x19,0x22,0x57,0xa5,0x4c,0xe5,0xd0,0x4c,0x19,0x43,0x9f,0xdc,0x9e,0xde,0x18,0xec,0x85,0x6e,0x29,0x87,0x0e,0x24,0xd3,0x73,0x1f,0xe2,0x22,0x47,0x99,0x94,0x9b,0x7e,},{0x53,0x8e,0xac,0xe4,0x93,0xde,0x53,0x38,0x4b,0x1e,0x98,0x5b,0xb9,0x07,0xc0,0x94,0xf8,0x16,0x84,0x30,0xda,0xb1,0x4d,0x37,0x79,0x1b,0xe6,0xe7,0x8f,0xf3,0xf5,0xa3,0x06,0xec,0x70,0xdc,0xac,0x86,0xd9,0x93,0xa4,0xc1,0xf7,0x58,0x50,0x78,0x6d,0x79,0x5f,0x02,0x2b,0x79,0xbe,0x6a,0x54,0x77,0x69,0xe4,0x15,0x69,0xc5,0xa9,0xa3,0x0a,},\"\\x6e\\x7c\\x6b\\x12\\x2a\\xb3\\x6b\\xd1\\x35\\xf6\\x9e\\x2b\\x85\\xe7\\xfc\\xce\\xfb\\x07\\x2c\\x12\\xcf\\x08\\x8a\\x32\\x29\\xd8\\x76\\xef\\xf5\\x32\\x38\\x9f\\x05\\x77\\x11\\x6f\\x7a\\xf2\\x9f\\x11\\x95\\xe3\\x82\\x88\\x39\\x38\\x13\\x80\\x46\\x71\\x78\\xb2\\x29\\xc5\\xa1\\x8d\\x7c\\x49\\x43\\xec\\x97\\x0d\\xd1\\x8b\\xce\\x72\\x3b\\xd0\\xca\\x91\\xff\\xa9\\x55\\x63\\x54\\x6a\\x32\\x4f\\xe0\\xb9\\xbf\\x6c\\x04\\x55\\xd4\\x27\\x60\\x39\\xe8\\xd2\\x91\\xfc\\x72\\x76\\xaa\\x55\\xa1\\xcd\\x3e\\xa0\\x52\\x82\\x65\\x4a\\x7f\\x97\\x00\\xad\\xcb\\xc7\\x80\\x77\\xc5\\xdd\\x0f\\xc8\\x6e\\xce\\xd4\\x8f\\x4a\\x60\\xcc\\xb7\\x6b\\xfb\\x8b\\x45\\x62\\xba\\xc2\\x2a\\x02\\xd1\\x9e\\x44\\x89\\x39\\x4a\\xb9\\x71\\x9f\\xc1\\x44\\xf5\\xdb\\x2e\\xf0\\x39\\xb3\\x7f\\x3b\\x51\\xd1\\xd6\\x57\\xa0\\xcf\\x83\\x5d\\x71\\xf1\\xa4\\xaf\\x01\\xeb\\x9f\\xd8\\x85\\xc6\\x04\\xa6\\x24\\xcb\\xe9\\x10\\xbf\\xde\\x09\\x3a\\xd3\\xf0\\xcb\\xfd\\x9a\\x48\\x30\\x73\\x29\\xd4\\x42\\x34\\xbd\\x01\\x19\\x1d\\x56\\xe5\\x22\\xd7\\x2b\\x54\\xe1\\xfe\\x47\\x33\\xda\\x3a\\xec\\x68\\x27\\xea\\xb3\\x55\\x48\\x98\\xe0\\x3e\\x57\\x7b\\x4e\\x7b\\x9d\\xd3\\xf3\\x08\\xe6\\x16\\x80\\x8d\\x02\\x94\\x49\\x9f\\x28\\x86\\x29\\x5e\\x54\\xc3\\x60\\x19\\x9c\\xa8\\x3a\\x83\\xff\\x46\\x19\\x5e\\xa3\\xc4\\x84\\xa6\\x68\\x38\\xd5\\x1a\\xcb\\xe9\\x61\\x1e\\xee\\x03\\x6a\\xe2\\x81\\xc6\\x79\\x3c\\xbd\\x45\\x1f\\x92\\x71\\xfb\\x5d\\x25\\xea\\x7c\\x18\\x99\\xab\\x5d\\x43\\xed\\x8b\\x9d\\x06\\x7b\\xc5\\x6d\\x8d\\x4a\\x15\\xf1\\xda\\xb8\\xd8\\xd9\\x5d\\x1b\\x17\\xaf\\x64\\xcb\\x18\\xc1\\x14\\x75\\x51\\x14\\x7a\\xdd\\xcb\\xdd\\x53\\xfb\\xcc\\xd9\\x02\\x6f\\x85\\x55\\x47\\x13\\x1b\\xee\\x95\\x07\\x16\\x39\\xf6\\x49\\xf2\\xd0\\x35\\xa2\\x5a\\x3e\\x42\\xe3\\x8e\\x22\\xbb\\xf0\\x38\\x10\\x6c\\xe8\\xbc\\x4a\\xd6\\x76\\x8a\\xb9\\x2c\\xd5\\x7a\\xfa\\xcd\\x04\\xee\\x55\\xcf\\x07\\x14\\xb7\\x68\\x95\\x2d\\xac\\x24\\x0b\\x1e\\x9b\\x28\\x35\\xec\\xf7\\xb0\\xd6\\xc4\\x07\\xc8\\x25\\x24\\xa9\\x23\\xb9\\xf5\\x4d\\x1b\\x8f\\x12\\x56\\x4a\\x87\\x21\\x44\\xef\\xad\\x3f\\x3a\\x7d\\x23\\x97\\xcd\\x12\\x17\\xdc\\x5a\\x9c\\x96\\xe4\\x3b\\x29\\x60\\xa8\\x42\\x5e\\x97\\xe0\\x7a\\x02\\xb0\\xda\\xc9\\x0f\\x34\\x6b\\x91\\xa3\\x46\\xa2\\x3e\\xd2\\xbb\\x7f\\xe6\\x91\\x9c\\x22\\xdf\\xf0\\x3f\\x62\\xda\\x7d\\xba\\x17\\x6e\\x8d\\xdb\\x22\\xf3\\xf3\\xa6\\x68\\x89\\x1d\\x3f\\x4e\\x69\\x54\\x8d\\x0a\\xc4\\xe7\\x1e\\x6d\\x28\\xed\\x5a\\x67\\xab\\x5a\\xc6\\x11\\xd4\\x60\\xb6\\x7a\\x20\\x1f\\x4f\\x56\\xa5\\x00\\x3c\\xa7\\xa7\\xd1\\xcd\\x1d\\xb6\\xc1\\x00\\x75\\xb0\\x92\\x27\\xcb\\x8c\\x5d\\xc1\\x66\\x6f\\x8b\\xe7\\x10\\xb4\\xb7\\xbc\\x2b\\x95\\xae\\x60\\xda\\x4f\\x64\\x17\\x9a\\x50\\xd2\\xf8\\x87\\x44\\x36\\x15\\x91\\x67\\x1d\\x36\\xb7\\x29\\x63\\x15\\xf6\\x99\\x64\\x39\\xad\\x79\\x82\\x1d\\xa8\\xe7\\x72\\xdf\\xbf\\x55\\xa9\\x0d\\x5d\\x52\\xef\\x7d\\x76\\xb3\\x5f\\xfe\\xbd\\x42\\xe3\\x52\\x5f\\x45\\x30\\xc5\\x4a\\x0f\\x23\\xb4\\xd0\\x7c\\x5f\\x59\\x74\\x47\\x0e\\x89\\x40\\x4d\\x17\\x6e\\xef\\xf9\\xef\\x23\\x33\\x61\\x96\\x91\\xc5\\x9b\\x7a\\xad\\xd4\\x2c\\x29\\x6b\\x1d\\x0d\\x32\\x8d\\x9a\\x3b\\xd5\\x9a\\x54\\xbb\\xa9\\x3a\\x0c\\x1f\\x1d\\x62\\x41\\x8c\\x21\\x90\\xc3\\x81\\x74\\xb6\\xab\\xea\\x02\\xdb\\x66\\xe8\\x18\\x32\\x0e\\xc4\\xb8\\xba\\xc1\\xc1\\x2f\\x18\\xf3\\x0d\\xad\\xe2\\x7e\\x63\\xc5\\x8f\\x9e\\x7c\\xaf\\x4b\\xf6\\x9b\\x26\\x5a\\x2f\\x9d\\x91\\x80\\x08\\x61\\xac\\xf4\\x79\\xe6\\x5e\\xc1\\x7e\\x68\\x05\\x77\\xe0\\x58\\xcb\\x16\\xc1\\x09\\xbc\\xf9\\xb2\\x90\\x9f\\xce\\x33\\x61\\xa2\\xc2\\x68\\x5c\\x10\\xbe\\x85\\x40\\xa1\\x22\\x2d\\xb5\\xec\\xf0\\xcc\\x4d\\x53\\xa4\\x21\\x4b\\x7b\\xf6\\x24\\x8a\\xdc\\x3a\\x86\\x1e\\x34\\x84\\x1a\\x37\\x79\\xc4\\x60\\x46\\xc5\\x36\\x4f\\x1e\\xa9\\x1a\\x78\\xc9\\x70\\x0d\\x46\\x2e\\xcf\\xaa\\xe3\\x6b\\xa7\\x60\\xc1\\xbd\\x6a\\x23\\x7c\\x96\\x1e\\xdf\\x40\\x22\\xce\\xde\\xfe\\x5e\\x93\\x7b\\xbe\\xd7\\x05\\x1a\\xe6\\x1b\\x96\\xd0\\x8b\\x04\\x87\\xce\\x05\\x68\\xff\\x0d\\x32\\x74\\x0b\\xbd\\x49\\xad\\x0d\\xb8\\x6e\\x09\\x10\\x2a\\xb2\\x1a\\x91\\x56\\x16\\xe9\\xdf\\xdd\\xc8\\x1e\\xbf\\xb3\\x6c\\x90\\x3e\\x07\\xa4\\x0c\\xd2\\xdd\\x11\\x9f\\xf4\\xa5\\x0b\\x93\\xfc\\x6f\\xdf\\xc0\\xf3\\x6e\\x59\\xe0\\x14\\x8f\\xcf\\xf3\\xfe\\x8e\\x2c\\xd6\\xd3\\x0a\\x9e\\x4b\\x8f\\x01\\x55\\x67\\xd1\\x18\\xb6\\x27\\x4e\\x1e\\xd7\\x5b\\x22\\xe4\\x4c\\xa9\\xd9\\xdb\\xfc\\x16\\x07\\x42\\xcf\\xac\\x58\\x1e\\x1a\\x0b\\xf5\\xff\\x33\\x26\\xbc\\x5f\\x78\\x96\\xb9\\xca\\x05\\xa8\\x11\\xd5\\x5e\\x97\\xc8\\x34\\xd3\\x7a\\x64\\x95\\xcc\\x26\\xcf\\x44\\x2b\\xd2\\xd9\\x01\\x29\\x89\\x5e\\x9c\\xc0\\xed\\x01\\xe2\\x15\\x52\\x93\\xf4\\x7a\\x07\\xab\\x58\\x80\\xc6\\xca\\x29\\xed\\x44\\xd9\\xcc\\xbc\\xaa\\xda\\x7f\\x3e\\xb6\\x04\\x02\\x18\\x14\\x88\\x65\\x4e\\x04\\x91\\x15\\x78\\xb1\\xaa\\x9c\\xdd\\x4b\\x86\\xb0\\xdd\\x24\\x50\\xdf\\x3a\\x43\\x08\\x1e\\x41\\x10\\xab\\x58\\xde\\x76\\x39\\x24\\xd3\\xc8\\x91\\x52\\xe9\\x92\\x93\\xe6\\x38\\xf9\\xac\\xd8\\xd7\"},\n{{0xa6,0x3c,0x1f,0x54,0xb2,0xca,0x05,0x8f,0xed,0x2e,0xe2,0x50,0x4b,0x98,0x3f,0xf3,0x3d,0x57,0x0a,0x9b,0xab,0xa5,0x83,0xc0,0x86,0xce,0xfe,0x19,0xf4,0x3e,0xc4,0x9d,},{0x32,0x9b,0x86,0x6b,0xca,0x41,0x94,0x29,0x7f,0xc1,0xad,0x5a,0x0e,0xba,0x0d,0xf9,0x56,0x69,0x9c,0x74,0xab,0x7d,0xa5,0xfa,0x54,0x62,0xbd,0x06,0x61,0x47,0x10,0x20,},{0x28,0x33,0x59,0xbe,0x41,0x29,0x0a,0x51,0xe6,0xa7,0xc5,0xd5,0x72,0x5c,0xa4,0xea,0x0a,0x68,0xf1,0x4a,0xca,0x14,0xb0,0xf0,0x25,0x66,0xde,0xe2,0x1f,0x49,0x0d,0xa3,0xc7,0xe9,0x5f,0x7a,0xb7,0x39,0xbc,0x35,0xa7,0xf4,0xf2,0x32,0xe9,0x71,0xaa,0x15,0x76,0x57,0xa6,0x33,0xeb,0xa0,0xe7,0x2d,0xc9,0x7a,0xf3,0x2c,0xdb,0x92,0x87,0x02,},\"\\x79\\x1b\\x86\\xfd\\x58\\x77\\x13\\x47\\x8f\\x92\\x34\\xff\\x30\\xce\\xfc\\x12\\x3c\\xd7\\xc3\\xeb\\x12\\x5f\\xa7\\x4e\\x4c\\x6d\\xb6\\x4e\\x78\\x44\\xf7\\xc8\\x5b\\x16\\x86\\xe7\\x1e\\xd0\\x8d\\x1a\\x6a\\x04\\xe0\\xeb\\xbd\\xff\\x4a\\xb1\\x60\\xc9\\x76\\xc8\\xab\\x9b\\x50\\x5f\\x6a\\x7e\\xb0\\xa1\\x84\\x27\\xe9\\x99\\xa8\\x82\\x8d\\xf1\\x06\\x84\\xf8\\xc7\\x5b\\x6a\\x6b\\x0a\\x64\\xc0\\xaf\\xa4\\xbb\\x22\\xbe\\xd1\\xcb\\x93\\x25\\x35\\x9c\\xac\\x3b\\x8c\\x50\\x8d\\x98\\xbc\\xb0\\xeb\\xcd\\x74\\x8d\\xc1\\x32\\xf1\\xd6\\xa3\\x60\\xa4\\x45\\x0d\\x12\\x92\\xa1\\xfe\\xfc\\x4e\\x57\\xe4\\x10\\x7a\\x22\\x3f\\x42\\x1e\\x7d\\x14\\xa3\\x84\\xb8\\x5c\\x18\\x84\\x4d\\x0b\\x9e\\xed\\x2e\\xcb\\x81\\xbb\\x74\\xe8\\xa1\\x26\\x52\\xd9\\x85\\x05\\x79\\x5a\\x01\\x31\\x16\\xa7\\x07\\x6c\\xcb\\x54\\x93\\xd6\\xa7\\x11\\xf7\\x63\\x7e\\x97\\xa7\\x80\\xe7\\x4d\\xa1\\xb3\\x9b\\x15\\xcc\\x7b\\xbd\\xe2\\xe6\\xc4\\xd0\\xd3\\xe8\\x30\\x05\\x97\\xc8\\x36\\xe8\\x0b\\xcb\\x8d\\x80\\x81\\xd9\\x74\\xe0\\x24\\x32\\xea\\xc8\\x83\\x68\\x21\\x1d\\x3a\\xaa\\xe8\\x9a\\x14\\x41\\x71\\x08\\xe1\\xff\\x67\\x37\\x08\\x38\\x49\\xc6\\x25\\xb4\\x0d\\x63\\x1f\\x6c\\x83\\x57\\x22\\x0c\\x7f\\x37\\x38\\x0b\\x3b\\x2c\\xc5\\xd0\\xe2\\xdf\\x6b\\x4d\\x11\\x96\\x57\\x9d\\xbc\\x57\\xb6\\xc9\\xea\\x0d\\x41\\xf4\\xfa\\x0e\\x55\\x6f\\x94\\x3c\\x94\\x48\\xef\\x42\\xfc\\x78\\xdf\\x59\\x96\\x64\\x8c\\xe2\\xf3\\xde\\x04\\xd8\\xa6\\x63\\xf9\\x67\\xf3\\xd9\\x33\\xd4\\xf6\\x53\\x57\\xab\\x29\\xba\\x5b\\x64\\x05\\xfb\\x16\\x29\\x72\\x57\\x8d\\xdb\\xb2\\x36\\x7b\\xed\\x14\\x3c\\x85\\x4c\\x10\\x88\\xde\\x92\\x1d\\x79\\xf5\\xa9\\x2a\\x85\\x48\\x37\\xeb\\x77\\x02\\xe1\\xba\\x92\\x5c\\x6e\\xac\\x23\\xd1\\x34\\xba\\x1b\\xaf\\xc5\\xd4\\x6d\\xe2\\xa1\\x94\\x2c\\x7f\\x36\\x6f\\x70\\x1b\\x0a\\xfa\\xbb\\x75\\xcb\\x1d\\x80\\x8e\\x1a\\x1e\\x4e\\x3a\\xe5\\xde\\x88\\xe8\\xe9\\x98\\x97\\x57\\x45\\x8b\\xdd\\xd8\\xa8\\x06\\xc1\\x10\\xcc\\x3a\\x73\\x3d\\x1d\\x4a\\xc5\\x8a\\x40\\x5c\\x4d\\x81\\x13\\x4f\\xbc\\x24\\xcc\\xde\\x7d\\x5a\\xfe\\x42\\x0f\\x9f\\x17\\x85\\xf0\\xa5\\x02\\x0f\\xaf\\xbb\\x22\\x61\\x22\\x25\\x08\\xaa\\x05\\x28\\xb7\\xb4\\x8b\\x56\\x72\\x00\\x95\\x84\\x25\\xef\\xcb\\x42\\x93\\x4a\\x88\\x0b\\x13\\x34\\x44\\xbb\\x10\\x9f\\x2a\\x95\\x4c\\xfa\\x35\\xa2\\xd1\\x7c\\xb0\\x5e\\xe3\\xf1\\x6d\\x06\\xb3\\x21\\xa1\\x5f\\x91\\x33\\x9a\\xbe\\xda\\x24\\x3a\\xd6\\xc0\\x91\\x9f\\xac\\x51\\xe9\\x07\\xe0\\x53\\xfd\\xee\\xd1\\xcf\\x03\\x00\\x37\\x34\\x13\\x77\\x93\\x94\\x1b\\x8a\\xdf\\x9a\\xb6\\xaf\\x81\\x9c\\x24\\x5d\\x6d\\x56\\xf1\\x69\\x64\\xc8\\xa7\\x5b\\x07\\x56\\xa8\\xcb\\x0c\\xa8\\xc1\\x2a\\xc6\\xe6\\xb3\\x94\\x2e\\xeb\\xec\\x2f\\x86\\x88\\x35\\xf8\\x1b\\x10\\x9d\\xb4\\x98\\xa4\\xca\\x2e\\x02\\x1f\\xa7\\x65\\x60\\x8d\\x23\\xd8\\x03\\xde\\xdc\\x9e\\x51\\x45\\x3f\\xc1\\xd2\\xa6\\xa3\\x8a\\x4a\\xab\\x25\\x7c\\x0f\\xe7\\xd6\\x7d\\x32\\xa5\\x41\\xe0\\x14\\xb6\\x0e\\x10\\x13\\xa9\\x2c\\x1b\\x3a\\xd9\\xe6\\xf1\\x1b\\xe2\\x93\\xb2\\x46\\xf9\\xa0\\xc6\\x44\\x0b\\x0b\\x54\\xfe\\xe7\\x5f\\xed\\x2f\\xb7\\x5c\\xc9\\x1e\\xcb\\x32\\x73\\x8c\\x49\\x58\\x31\\x58\\x6a\\x11\\x24\\x2d\\x87\\xdc\\xb4\\x88\\x3e\\xdf\\x67\\x57\\xa5\\x0b\\x18\\x84\\x37\\x59\\xb9\\x8d\\xd0\\xce\\xf4\\xa3\\xfe\\x10\\xd7\\x63\\x70\\xec\\xda\\x8c\\x83\\xfa\\xb8\\x7e\\xee\\x26\\x56\\xc5\\xf2\\x61\\xc3\\x40\\xea\\x91\\xa5\\x60\\xd0\\xe2\\xc6\\x42\\x89\\x26\\x7f\\x00\\x36\\xba\\x35\\x94\\x48\\x00\\xa5\\xa0\\xae\\xf3\\xf1\\xdf\\x83\\x9a\\x72\\x4e\\x18\\x1d\\x79\\xb8\\xa3\\xc1\\x6f\\x65\\xae\\x27\\x95\\x3c\\x4a\\xae\\x8c\\xcd\\x30\\xff\\x5a\\xcc\\x4b\\x31\\xe4\\x76\\x5c\\x68\\xfb\\x38\\x31\\x9f\\x10\\xac\\xf8\\x92\\x47\\xb5\\xa3\\x9b\\x3b\\x08\\xa1\\x91\\x75\\x4a\\x24\\xac\\xa9\\x59\\x6a\\x1f\\x8a\\x70\\xb6\\xe4\\xf0\\x3a\\x20\\x04\\xa9\\x08\\x6f\\xf6\\xed\\x07\\x65\\x2a\\x92\\x6e\\x1e\\x2d\\xf7\\xbd\\xcc\\xd5\\xbe\\xc1\\x6e\\x5c\\x4e\\x96\\x83\\x64\\xa0\\x9a\\xbf\\x9d\\xed\\x93\\xdf\\x5f\\xca\\x0b\\xcc\\xa5\\xc8\\x12\\x97\\x6e\\x5c\\xfb\\x3c\\x34\\x93\\xfc\\x17\\x5d\\x1d\\x92\\xee\\x8d\\x1c\\x98\\xfb\\x33\\x82\\xb3\\xab\\x90\\xc5\\xc0\\xe4\\xbd\\xf6\\xa3\\xac\\x94\\x76\\x7b\\x68\\xd4\\x7e\\x6b\\x9c\\x24\\x42\\x65\\xe3\\xb1\\xab\\x06\\x23\\xa8\\xf0\\x10\\x02\\x73\\xf2\\xc6\\x07\\xde\\x89\\x61\\x2c\\x72\\xd3\\x9b\\xe4\\xc0\\xb4\\xd7\\x7a\\x3c\\x61\\x36\\x8d\\xf4\\x0b\\x36\\x08\\x65\\x29\\x89\\xd1\\xe1\\x9c\\x0a\\xaf\\x0e\\x3c\\x25\\x3e\\x56\\x2c\\x64\\x09\\xfe\\x64\\x48\\x92\\x9b\\x33\\x75\\x3d\\xe1\\x62\\xe6\\xde\\x5b\\xd4\\x66\\xa5\\x11\\x4f\\xc0\\xe5\\xf5\\x71\\x02\\x75\\x5e\\x29\\x54\\x4f\\x03\\xb2\\x8d\\x4f\\x78\\xde\\x9a\\x02\\x4d\\xd4\\xc4\\xe8\\xc3\\xc2\\xd4\\x41\\x15\\xa7\\xae\\x15\\xed\\xb4\\xf5\\x58\\xaa\\x7d\\xba\\x64\\x26\\xe7\\xe3\\x72\\xc5\\x4f\\x79\\x40\\xbd\\x77\\x14\\x46\\x7f\\x8c\\x3a\\x1a\\xdd\\x3c\\x64\\x01\\x89\\xc3\\x16\\x60\\xd8\\xcc\\x01\\xd3\\xc5\\x38\\x2e\\x42\\xab\\xc1\\x04\\xc7\\x23\\xf9\\x48\\xa8\\x04\\xca\\x85\\x30\\x47\\xb6\\xb8\\x7b\\x5b\\x6e\\xf4\"},\n{{0x5b,0x67,0xa6,0xd7,0xc6,0x50,0xdd,0x92,0xdd,0xd0,0x36,0xce,0x7a,0x30,0x5b,0xc9,0x59,0xa4,0x97,0xc5,0xe5,0x15,0xa6,0x84,0x93,0x03,0x5c,0xb3,0x85,0x0e,0xe0,0x3d,},{0x4c,0x6f,0xc1,0x64,0x05,0x05,0xfb,0x46,0x66,0x9f,0x93,0x04,0x8f,0x8e,0xf5,0x57,0x09,0x9f,0x3f,0xd9,0x2a,0x53,0x06,0x4b,0x16,0x33,0x63,0xa3,0x1b,0x7f,0x00,0xaa,},{0x0f,0x07,0x3c,0x9a,0x58,0x6f,0x6f,0x5e,0x08,0x38,0x9a,0x2a,0x5e,0x18,0x08,0xe2,0x70,0xf0,0xed,0xb6,0xaf,0x10,0x44,0x96,0xf9,0x37,0x57,0x62,0x3f,0xea,0x53,0x13,0x3a,0x73,0x1c,0x44,0x5a,0xc2,0x35,0x78,0xcd,0x56,0xa3,0x88,0x3c,0x08,0x95,0x86,0x68,0x63,0x1f,0xed,0xf1,0x44,0x6c,0xe3,0x4f,0x85,0x7f,0x90,0x82,0x2b,0xa8,0x0a,},\"\\x62\\xcc\\xde\\x31\\x77\\x2c\\x57\\xe4\\x85\\x3a\\xaf\\x2a\\x81\\x81\\xfd\\xb5\\x3f\\xb8\\x27\\x90\\xea\\x65\\x01\\xbf\\xc8\\xf5\\xd4\\xae\\x8d\\xbd\\x52\\xde\\x42\\xce\\x2e\\x89\\x61\\xac\\x17\\x31\\xf4\\xbc\\x08\\x5f\\xb5\\x61\\xef\\x09\\xa2\\x44\\x29\\x70\\xb6\\x29\\x79\\x01\\xae\\xaa\\x2e\\xe5\\x55\\xb7\\xd5\\xe3\\x95\\x1c\\x7c\\x35\\x12\\x39\\xdd\\xee\\x95\\xff\\x54\\xf9\\x24\\xda\\x95\\xca\\xe7\\xb1\\x5b\\xa6\\xa9\\xa1\\x33\\x7b\\x8c\\xe4\\x92\\x1e\\xd9\\x13\\xcd\\x79\\x1c\\x1c\\x69\\x41\\x08\\x0e\\x54\\x8f\\x3c\\x36\\xe8\\x45\\xac\\xbf\\xd8\\xd8\\xce\\x35\\xe2\\xfd\\xc2\\xa2\\xad\\x6c\\x7e\\x24\\x61\\xbf\\xcb\\xf1\\xaa\\xbc\\x55\\xcf\\x0f\\xae\\x42\\x88\\x85\\xbe\\x5e\\x86\\x53\\x33\\x08\\xc9\\x75\\x68\\x05\\x21\\x9a\\xbd\\x7f\\xfc\\x16\\x57\\xb6\\xf4\\x63\\x29\\x20\\xa0\\xc1\\x0e\\x0e\\x36\\x33\\x19\\xd9\\x00\\xfc\\xd6\\x1e\\x7d\\xdb\\xcd\\x6e\\x76\\x2a\\x7d\\xb9\\x24\\x80\\xc3\\x63\\xb2\\xc0\\x64\\x0c\\x6b\\xf3\\x2d\\x69\\x0d\\xd8\\x29\\xd8\\x40\\x5f\\xa6\\x6e\\x47\\x83\\xeb\\xe1\\xcb\\xde\\x95\\x47\\x95\\x4a\\x90\\xba\\xad\\x9f\\x77\\x4e\\x94\\x54\\x9a\\xbb\\xff\\x2c\\x1f\\x5c\\xae\\xc2\\xbf\\xd2\\x8e\\x41\\x5d\\x36\\x42\\x9d\\x58\\x51\\x8c\\x3e\\x17\\xe8\\x69\\x9e\\x19\\x89\\xd4\\x7b\\x8d\\x62\\x7e\\xf9\\xab\\x4d\\x1e\\x7d\\x12\\x0b\\x37\\x2c\\x21\\x41\\x30\\x4f\\x7f\\xab\\xd0\\x26\\x5b\\x8b\\xe4\\x1f\\x54\\x67\\xf4\\xde\\x9e\\x65\\xc1\\x25\\xee\\x1f\\x27\\xa2\\x89\\xc4\\xf7\\xc9\\xa1\\xfb\\xf2\\x5b\\xfc\\x2f\\x8d\\x30\\x8e\\x7f\\xf5\\x21\\x91\\xcb\\x76\\x44\\xc6\\xaf\\x20\\x45\\x22\\xf2\\xac\\x87\\xb5\\xf4\\x05\\x25\\xfd\\x43\\xd3\\x08\\xc8\\xdb\\xc6\\xa8\\x61\\xd2\\x5d\\xb2\\x3e\\xe2\\x76\\x67\\x8a\\x1b\\x6e\\x8e\\x91\\x28\\x3b\\xe0\\x24\\x70\\x48\\x2e\\xd6\\xcc\\x9f\\x6e\\x39\\x63\\x51\\xd1\\x1b\\x1c\\x7e\\x22\\x32\\x9c\\x09\\x1f\\xe7\\xd3\\x68\\xf6\\x06\\x53\\xf9\\x3b\\x0f\\x6a\\x3f\\x71\\x2c\\x20\\xf9\\xd2\\xd8\\xa9\\xa0\\x81\\x98\\x72\\xf0\\xc7\\x1d\\x7b\\x1c\\x0b\\xc1\\x68\\x3a\\x15\\x2b\\x48\\x4b\\xc2\\x1c\\xf5\\x56\\x09\\x3a\\xb4\\xc0\\xac\\x16\\xd3\\x22\\xff\\x0b\\xf4\\x52\\xe5\\x58\\x1e\\x1e\\x72\\x41\\x67\\x38\\x84\\x02\\x3c\\x7d\\x6e\\x17\\xe2\\xde\\x80\\x59\\xf6\\x0e\\x4c\\x18\\xe1\\x3b\\xd5\\x5f\\xcf\\xee\\x62\\x3f\\xd0\\x46\\x9c\\x0d\\x09\\x11\\x61\\x1d\\x09\\x9a\\x25\\x70\\x20\\xf2\\xf3\\x1b\\xf5\\x07\\x8e\\x6e\\x65\\xa1\\x35\\xd5\\xbf\\x40\\x76\\x20\\x23\\x6d\\x6c\\xc7\\x59\\x31\\x0f\\xa7\\x28\\xff\\x8b\\xb5\\xec\\x56\\xab\\xbe\\x1a\\x3c\\xd1\\x51\\x53\\xf8\\x92\\xd9\\x58\\xd3\\x0d\\x16\\x2d\\x01\\xee\\x66\\x5f\\x5b\\x56\\x27\\x81\\xd8\\xdc\\xf8\\x42\\x80\\x59\\xe5\\xfd\\x22\\x5a\\xd7\\x8a\\x99\\xea\\x76\\x0f\\xe5\\xd9\\xee\\x82\\x19\\xc9\\x5a\\xcb\\x18\\xd0\\x56\\x22\\xe1\\x0a\\x9b\\x6c\\x67\\xf6\\xd4\\xf6\\xed\\x11\\x63\\x5c\\x5e\\x2e\\x0f\\x85\\xdd\\x5d\\x3c\\xbd\\xa6\\x5a\\xa4\\x23\\xd5\\x94\\xa8\\x0b\\x40\\x42\\x7b\\xc3\\x21\\xe0\\xee\\xf9\\xaf\\xd2\\xbc\\x87\\x46\\xab\\x73\\x99\\xff\\x6d\\x0e\\x12\\x87\\xb6\\x61\\xdd\\xc4\\x06\\x2d\\x07\\x20\\x18\\xf4\\xc1\\x0e\\x86\\xcf\\xae\\xd7\\x2d\\x9e\\x68\\x6e\\xd0\\x9d\\x52\\x55\\xd3\\x60\\xe3\\xee\\xa2\\xc2\\x9b\\x9e\\xae\\xa0\\x5f\\xc7\\x8c\\x8c\\xdb\\x8c\\x9d\\x4a\\xfc\\x7a\\xdc\\x6d\\x4a\\xa0\\x67\\xb7\\xab\\xfb\\x0a\\x4e\\x94\\x0a\\x77\\x58\\x0e\\xc2\\x06\\x45\\x6c\\xb9\\xe9\\xf9\\x5f\\x6d\\x56\\x5d\\x53\\x6e\\x53\\x5a\\x16\\x7e\\xde\\x8e\\x20\\xec\\x36\\x08\\x1e\\x2f\\xc5\\x5a\\xef\\xaf\\x24\\xd2\\x27\\xff\\xfe\\x5e\\x6c\\xb0\\x30\\x93\\xf4\\x43\\xb4\\xc5\\x16\\x55\\xd9\\x1c\\xa6\\xf2\\x75\\x95\\x9d\\x1a\\x80\\x2a\\xde\\xab\\x44\\x70\\x1b\\x31\\xe8\\xb0\\xfd\\x02\\x22\\xc4\\x99\\x96\\x6c\\x72\\xd1\\x02\\x0a\\xd9\\x37\\x0e\\x28\\x02\\xbe\\x04\\xc9\\x93\\x3f\\x6b\\x77\\x4f\\x6e\\x8c\\x69\\xfc\\x0b\\xfd\\x31\\x59\\x39\\xa1\\x27\\xb4\\xe0\\x6d\\x0f\\x6f\\x5e\\xde\\x67\\x1c\\xe1\\x16\\x12\\x12\\x6b\\x51\\x87\\xb5\\x33\\x29\\xb0\\xa9\\xcb\\x7d\\xa3\\xb1\\xcc\\xd6\\x7b\\x8c\\x07\\xba\\xb9\\x9a\\x66\\x2d\\xf8\\xce\\x85\\x1f\\x50\\x2f\\xc4\\xe1\\xed\\x16\\x32\\xb6\\xba\\x55\\x55\\x44\\x01\\x8f\\x75\\x27\\xe3\\x62\\xef\\xc7\\xe3\\xb2\\xba\\x6f\\x75\\xa1\\x25\\x4f\\x42\\x8b\\x3b\\x7e\\x0b\\xea\\x69\\x54\\x9e\\x7f\\x9c\\x73\\x62\\x75\\x55\\x00\\x80\\xae\\xe3\\xaf\\x59\\x14\\xe3\\xa3\\x4b\\xe6\\x56\\xc7\\x7f\\x6b\\x29\\x42\\x0e\\x54\\x33\\xf3\\xdf\\xf3\\x81\\x1f\\x35\\x28\\x20\\x8e\\x9d\\x85\\x0a\\xa3\\xc2\\x9b\\x0f\\x77\\x8a\\x24\\x27\\xd5\\xfd\\xe3\\x07\\x32\\xdf\\xe5\\x04\\x43\\xa9\\xc1\\xad\\x55\\xc7\\x2a\\x08\\xab\\x26\\xff\\xaf\\x8e\\xfb\\x90\\xbc\\xaf\\xd3\\x72\\x6b\\x00\\xc0\\x05\\xc8\\xc0\\xf0\\xdb\\xf2\\xa1\\x35\\x30\\x86\\x72\\x1e\\x44\\x65\\x45\\xb8\\x13\\x44\\x11\\x94\\xa7\\x55\\xfd\\x26\\xb9\\x63\\xaf\\xd9\\x77\\x27\\x8d\\x1b\\x10\\xf0\\x90\\x01\\xc7\\xed\\x97\\x54\\x03\\xc1\\x5c\\xbe\\x7f\\x99\\x2a\\xb0\\x7b\\x84\\x70\\xc9\\x39\\xf8\\x66\\xf4\\x20\\xf7\\x7d\\xb7\\x79\\xaf\\x83\\x97\\x00\\x32\\x9e\\x07\\x77\\xa6\\x11\\x63\\x65\\xd7\\x6c\\x36\\xd0\\x9d\\x86\\x04\\x72\\xa5\"},\n{{0x26,0x31,0xc8,0xc3,0x4d,0x29,0x48,0xdd,0xd5,0x99,0x6b,0x41,0x49,0xce,0xfd,0x23,0x8e,0xa7,0x45,0x2e,0xc2,0x2e,0x24,0x61,0x24,0xdf,0xa2,0x79,0xcc,0xc2,0x7d,0xb8,},{0xc3,0x90,0x67,0x86,0xff,0xb8,0xa7,0xc2,0x7c,0x44,0xc2,0x44,0x7f,0x9d,0xde,0x7d,0x66,0x6d,0xfe,0x58,0x8c,0xfc,0x54,0xf2,0xd2,0x50,0x40,0x51,0x2a,0x37,0x1b,0xc1,},{0x0a,0xdc,0x6f,0xa4,0x0f,0xfb,0x81,0xf6,0xef,0x4e,0x41,0x87,0x55,0x49,0x17,0x77,0x5c,0xf4,0x65,0xe7,0xb5,0xe8,0x57,0xf2,0xe1,0xe7,0xf4,0x00,0x97,0x71,0x06,0xd2,0x37,0x7e,0xbc,0x76,0xab,0xb1,0xdb,0x92,0x4c,0x64,0x86,0x7e,0x3c,0x6f,0xe3,0x8c,0x0b,0x4f,0xcb,0x1d,0x0f,0x94,0x68,0xe8,0xfb,0x23,0x50,0x29,0xa8,0x1c,0xe6,0x04,},\"\\x6f\\x9b\\xdc\\xe1\\x44\\x3f\\x28\\x56\\xd4\\xa2\\xf2\\x27\\x82\\x83\\x50\\x12\\xb7\\x81\\x8a\\x0e\\x02\\x0d\\xbc\\xc2\\x2a\\x82\\x16\\x58\\x30\\x5f\\x13\\x42\\x34\\xd1\\x4c\\xea\\x63\\x61\\x00\\xed\\x89\\x6c\\x2a\\x8f\\xb0\\xe8\\x70\\x48\\xec\\x6f\\x8b\\x31\\x48\\x4f\\x78\\xeb\\x17\\x10\\x45\\xad\\xd7\\x2c\\x85\\x71\\x0e\\xc9\\xf9\\xb5\\xd4\\x36\\x23\\x41\\x7b\\x56\\x53\\xbe\\x86\\xe7\\xfb\\xf8\\xb4\\xff\\x91\\x11\\x0a\\x80\\x8c\\xb4\\x1a\\xcf\\x66\\xd4\\x36\\xe8\\x9a\\x73\\x7f\\xae\\xa4\\xef\\xf3\\x54\\x49\\x60\\xf1\\x14\\xb8\\x33\\xb0\\xb4\\xeb\\xc2\\xc1\\x40\\x70\\xb0\\xbf\\xb7\\xb0\\x05\\x7e\\xeb\\xb8\\x42\\xbd\\x1c\\x1e\\xd4\\x58\\xad\\x34\\x28\\xf8\\xf7\\x2a\\x1d\\x1d\\xb3\\xc4\\xcb\\x47\\x97\\xa3\\x99\\xd4\\x7a\\x1e\\x6d\\xb7\\x4d\\xcb\\x2e\\xe2\\x4a\\xe8\\x15\\x85\\xcf\\x66\\xef\\x6d\\x9b\\xd2\\x23\\xf0\\xf5\\x4b\\xc8\\xc1\\xce\\xc1\\xbb\\x44\\x60\\xbe\\xf4\\xff\\xd3\\x2e\\xe8\\x05\\xc3\\xca\\x5e\\xe9\\x76\\xff\\x9c\\x14\\x55\\x9f\\x8d\\x75\\x66\\x62\\xa2\\xbc\\x19\\xe4\\xc5\\x98\\x54\\x06\\xa0\\x73\\x05\\xc9\\x95\\x0d\\x86\\x6c\\x9a\\x79\\xa3\\xe5\\xf6\\xc5\\x96\\x97\\x53\\xa1\\x70\\xe0\\xfc\\x4c\\xc0\\x9c\\x6d\\x87\\xa1\\x2b\\x44\\xcd\\xf3\\xbe\\x16\\x23\\x15\\x9e\\x90\\xca\\xb7\\xa8\\xa3\\xe6\\xf0\\x1f\\x26\\x85\\x95\\xb0\\x21\\xb1\\xef\\x7d\\x00\\x76\\x94\\x77\\x27\\x0d\\x55\\x84\\xc9\\x12\\xe2\\x2a\\x36\\x74\\x38\\x27\\x7f\\x59\\xdf\\x20\\xc5\\x62\\x0d\\xd5\\xbe\\xaa\\x9b\\xb6\\x0b\\xee\\x47\\xf4\\xaf\\x52\\x7d\\x89\\x29\\x57\\xb2\\xd1\\x2b\\x67\\x8b\\x52\\x79\\xa3\\xf8\\x32\\x64\\x65\\x4c\\x0a\\x0f\\x8d\\x21\\xe7\\x09\\x66\\x8f\\x30\\xfb\\x6e\\x68\\xf0\\x47\\xd0\\xd9\\xa7\\xc2\\xae\\x9a\\x28\\xf7\\xcb\\x9d\\xbf\\x18\\xf6\\x3f\\xc1\\x66\\x1f\\x07\\xd3\\x10\\xe5\\x40\\xc7\\x76\\x31\\xf5\\xbd\\xac\\x58\\x24\\x68\\x5d\\x7c\\x9a\\xba\\x0f\\xe1\\xd0\\x94\\x07\\xa9\\x66\\x2e\\xf1\\x8e\\xb3\\xe2\\x8f\\xd1\\xe8\\xbc\\x89\\x26\\x57\\xbc\\x38\\x24\\x3a\\x2e\\x64\\x53\\xbd\\xae\\xab\\xb2\\x79\\x1f\\xc5\\x48\\x95\\x21\\x29\\x54\\x57\\xad\\x04\\x18\\x0c\\xa8\\x71\\xf6\\x31\\x87\\x92\\xbd\\x15\\xfd\\x18\\x00\\xce\\x59\\xdd\\x3e\\xcc\\x7e\\x0b\\x72\\x97\\x92\\x67\\xd8\\x18\\x3e\\x80\\x4f\\xdd\\x45\\xda\\xad\\x84\\xfc\\x4c\\xaf\\xeb\\x56\\x1e\\xa8\\xd6\\xa7\\x4a\\x7c\\xde\\x72\\x2d\\x96\\x25\\x3a\\xb3\\xe7\\x5f\\x0a\\xdd\\xe0\\x2a\\x61\\xfd\\x5e\\x1f\\x59\\xcb\\x1f\\x5f\\x1b\\x2e\\x05\\x26\\x43\\x58\\x9a\\x9e\\x4b\\xe4\\xdd\\x6e\\xe6\\x45\\x38\\xcb\\x0b\\x10\\x9a\\x11\\x3f\\x30\\xa5\\x8b\\x35\\x65\\x62\\x40\\x43\\x66\\x2a\\xbe\\x17\\xf6\\x0e\\x31\\xe8\\x9c\\x36\\xc9\\x95\\xe0\\x0a\\xe0\\x7f\\x56\\xa9\\x11\\x8a\\x31\\xae\\xc2\\x4a\\xd5\\x44\\xbc\\x96\\x58\\x11\\x21\\x8d\\xf8\\x27\\xc1\\x73\\x0b\\xb9\\x04\\xbb\\x79\\xb6\\x86\\x13\\xf6\\xc9\\x94\\x67\\x9b\\x69\\x90\\xd7\\x75\\xb5\\xcb\\x32\\xdb\\x97\\x19\\x4b\\xd8\\x10\\x19\\xbe\\xa4\\x1f\\x3a\\x7e\\xef\\x50\\x1b\\xf8\\x49\\x1b\\x0e\\xa8\\x59\\x38\\x84\\x52\\xe3\\xec\\xbe\\x16\\xaa\\x7d\\x56\\x91\\x51\\x0a\\x66\\x06\\xc4\\x93\\xe4\\xc2\\x93\\x96\\x1b\\xf4\\x0b\\x4c\\xd3\\x00\\xd9\\xd2\\x2e\\xa1\\xa7\\x72\\x4c\\x07\\x8b\\x8b\\xab\\x1f\\xd1\\x65\\x04\\xe9\\x89\\xb1\\x36\\xd9\\x25\\x1a\\xc9\\xf1\\xed\\x94\\xa5\\xe9\\xac\\xbd\\x9c\\x04\\xf8\\x05\\x8a\\xfe\\x03\\x04\\x9a\\xed\\x8b\\xa2\\x9f\\xa2\\xe8\\xfb\\x44\\xf8\\xe8\\xc0\\x4e\\x87\\x27\\xf3\\x99\\xe7\\x35\\xe6\\xc1\\x49\\x6a\\x91\\xa9\\xb2\\xcd\\x2a\\xb0\\x2d\\x43\\xb2\\x85\\xe9\\xd7\\x61\\x02\\x93\\xb6\\x74\\x9d\\xf1\\x04\\x4b\\x30\\xe2\\xda\\x99\\xa5\\x64\\x42\\x9a\\x23\\xe6\\x8c\\x96\\xfc\\xe9\\x2b\\x08\\xa0\\x0b\\x7b\\x74\\x2b\\xa9\\x7a\\x62\\xee\\x58\\x77\\x6d\\x7d\\xd5\\x65\\xa4\\x90\\x07\\x1d\\x4b\\x19\\xdc\\x64\\x8e\\x03\\x32\\x9c\\xc5\\xc8\\x25\\xd3\\x87\\xeb\\xa4\\x9e\\x2e\\xff\\x6c\\x43\\x41\\x86\\x5c\\x46\\x4f\\x13\\xf1\\xbe\\xb1\\x82\\x7a\\x7f\\x26\\x8c\\xc1\\x5a\\x98\\x24\\x80\\xbf\\x08\\x4f\\xe3\\x65\\x2c\\x1b\\x0e\\x0b\\x4a\\xd2\\x62\\x55\\x85\\x9a\\xbf\\x1c\\x8a\\x7f\\x9b\\x3b\\xef\\x09\\x8a\\x94\\x07\\xfd\\xea\\x0a\\x53\\x9e\\xb0\\x08\\xfd\\xd7\\x49\\xfa\\x01\\x86\\xcc\\x01\\x69\\xd9\\xd9\\xe6\\x8f\\xe5\\xe5\\x4c\\xac\\x32\\xce\\x57\\xb5\\xc8\\x4c\\x2d\\x80\\x5e\\xca\\x39\\xc2\\xdb\\xbd\\xd2\\xe0\\x2f\\x7d\\x22\\x88\\x26\\x71\\x2f\\xf4\\xa6\\x14\\x11\\xca\\x0a\\xeb\\x6f\\x01\\xa1\\xf8\\x0e\\xf2\\x9e\\xeb\\x07\\x1a\\x43\\x22\\x2d\\x94\\x97\\x18\\x4b\\xd8\\x5d\\x9e\\x44\\xb1\\x66\\xbe\\x97\\xcf\\xd2\\xa7\\x32\\xaf\\x4a\\x23\\x34\\x63\\xd3\\xab\\x54\\x3a\\x7a\\x3c\\x7a\\xec\\x55\\x56\\x56\\x56\\x88\\x40\\xf4\\xdf\\xea\\x21\\x7f\\x65\\x53\\xaa\\x98\\xaf\\x32\\x4c\\x12\\xb2\\xc3\\x21\\x4e\\xe7\\x6e\\xec\\x70\\x06\\x70\\xaf\\x68\\xc8\\xc1\\xf3\\x69\\x46\\xef\\xd7\\xff\\x09\\x33\\xe5\\x45\\x3f\\x12\\x8e\\x97\\x15\\xfd\\xb3\\x34\\x4a\\xc1\\x0c\\x4b\\xb7\\xec\\x8f\\x10\\xdd\\xf5\\xdb\\x71\\xf1\\xcf\\x0e\\xfe\\x40\\xf7\\x5e\\x5b\\x63\\x34\\xef\\x8c\\xf8\\x42\\x9b\\x32\\x91\\xe6\\xe4\\xce\\x37\\x9c\\x17\\x8a\\xff\\xcb\\xc6\\x10\\x30\\xeb\\x89\\x6d\\x74\\x4d\"},\n{{0x39,0x76,0x9a,0x66,0xf0,0xca,0x12,0x90,0xfd,0xa1,0x43,0x75,0xb3,0x5c,0x66,0x3f,0x6a,0x4b,0x2a,0xb3,0x60,0x71,0x79,0xab,0xd9,0x90,0x63,0xe2,0xef,0xa2,0xc6,0xa8,},{0xf9,0xfd,0x4c,0x19,0x1f,0x38,0xf1,0x21,0x90,0xd3,0x28,0x5e,0x20,0xc6,0xce,0xe5,0x4c,0xfd,0x6f,0xf3,0x15,0x30,0x0a,0x4e,0xfd,0xc8,0xa9,0x0e,0x80,0xaf,0x40,0x83,},{0x14,0x42,0xde,0xa2,0x80,0x7e,0x03,0x11,0x59,0xec,0x6a,0x41,0x2d,0x8e,0x07,0xbb,0x3e,0x29,0x93,0x08,0x09,0x0f,0x21,0x8f,0xa7,0xc1,0x0a,0x9c,0x50,0x68,0xef,0x9b,0x64,0xef,0x11,0xca,0x9f,0xb9,0x2b,0xe1,0xd0,0x21,0x6b,0x99,0x31,0x8f,0xf0,0xf0,0x3c,0xb8,0x71,0xcd,0x7d,0xd6,0x3a,0x38,0xae,0x17,0x02,0x31,0x3e,0x5b,0x25,0x0c,},\"\\xff\\x4d\\x89\\x87\\xe3\\xfa\\x36\\x01\\x2b\\x75\\x86\\x73\\x6b\\x79\\x3d\\x65\\x97\\x54\\x69\\x8c\\xd1\\x2b\\x65\\xe5\\xba\\x9d\\x75\\x8c\\xac\\x16\\x49\\x28\\x8d\\x20\\x22\\x43\\x77\\x28\\x3e\\xa5\\x42\\x5d\\xec\\x10\\xab\\x99\\x17\\xd1\\x8c\\xd1\\x3d\\x1b\\xdf\\x4a\\x76\\x9f\\x37\\x04\\x4c\\x84\\xfa\\xa2\\xa4\\x49\\xc6\\x89\\xe0\\x04\\xc1\\x4e\\x00\\x5c\\x49\\xda\\x41\\x06\\xff\\x75\\xce\\x13\\x03\\x36\\x1c\\x6e\\x3e\\x34\\xcc\\xfe\\xe7\\x5e\\xe9\\xc3\\x1c\\xbd\\x06\\xa4\\xbc\\xdb\\xb4\\x2f\\xd6\\x49\\xbe\\x4d\\xfc\\xd6\\x64\\x00\\x6d\\x6a\\x5f\\x61\\x07\\x7c\\x04\\xa6\\xa8\\x1d\\xb3\\x6b\\xe8\\x6b\\xa4\\x2c\\x29\\x51\\xf0\\x51\\xae\\xda\\x64\\xac\\xea\\x49\\x6c\\xb9\\x24\\x98\\x2b\\x9f\\x7d\\x23\\x4a\\xc9\\x72\\x3f\\xef\\x98\\xa8\\xe1\\x27\\x55\\xe3\\x26\\xa5\\x2f\\xbe\\x35\\x85\\x1f\\x41\\x1e\\xeb\\x86\\x76\\x06\\xd4\\x5b\\x51\\x3f\\x54\\x52\\x63\\x91\\xc5\\x54\\x63\\x5c\\x18\\x0b\\x8f\\xd0\\xee\\x45\\x1a\\xfc\\x96\\xe4\\xef\\xd3\\x60\\xb6\\x1e\\x6b\\xaf\\x03\\xdd\\x6d\\x19\\xba\\x51\\x5c\\x31\\xec\\x1c\\xdd\\x3a\\xff\\xff\\xdb\\x27\\x35\\x4e\\x3e\\x6b\\x56\\xe9\\xe1\\xa1\\xa1\\xb7\\xd4\\xb5\\x7d\\x9d\\x76\\x89\\xbb\\x2f\\xea\\x6c\\x8d\\x3f\\x9c\\xe0\\xdf\\x2d\\x9e\\xe9\\x19\\xc4\\x23\\x0a\\x1f\\x20\\xb8\\x5d\\xfe\\xfe\\x1e\\xa3\\xd7\\xf7\\x7d\\xb4\\x70\\xe4\\x02\\x24\\x29\\xef\\x60\\x9b\\x0f\\xf4\\x49\\x46\\x44\\x0a\\xcb\\x44\\xcd\\x13\\x44\\x5b\\xcf\\xa3\\xf2\\x05\\x03\\xc2\\x6c\\x2f\\xb6\\x63\\xc8\\x90\\x65\\xfb\\x93\\x34\\xa6\\x03\\xeb\\x9a\\xb7\\x15\\x2e\\x62\\x62\\x92\\x33\\xc4\\x4c\\xb0\\x0e\\x77\\x71\\x6d\\x9b\\x72\\xc8\\x4f\\xd1\\xb3\\x40\\x63\\x4f\\xf1\\xce\\xa3\\x47\\x50\\x15\\x76\\x10\\x0e\\xcb\\x0f\\xd1\\xbb\\x76\\xae\\x0d\\xff\\x1c\\x2b\\x09\\x48\\xeb\\x71\\xee\\x2c\\xc3\\x1e\\x79\\xd3\\x01\\x5d\\x72\\xdb\\xee\\x22\\x4a\\x98\\x0e\\x0f\\x95\\xa6\\x9f\\x79\\x3d\\xa8\\x3a\\x2d\\xaa\\x56\\xef\\xe5\\x7b\\x2f\\x8c\\xea\\xac\\x9e\\x55\\xf4\\x43\\xca\\x9e\\x73\\x2b\\x48\\xc7\\x5f\\xac\\x21\\xc3\\x6f\\xa7\\x72\\x73\\xc3\\xf3\\x48\\x35\\xff\\xd8\\x3c\\x96\\xf0\\x0a\\xc6\\xe8\\x6c\\xff\\xed\\x08\\x15\\x36\\x46\\xc1\\xce\\xa2\\x23\\xda\\x9c\\xa3\\x60\\xca\\xb9\\x7e\\x03\\xb2\\xb6\\xc8\\xfb\\xa7\\xc1\\x95\\xa3\\x9a\\xe5\\x2e\\xb2\\xee\\x86\\x43\\x00\\xae\\x56\\xa1\\x0f\\x54\\x7f\\x99\\xa3\\x16\\x98\\x72\\x24\\x9f\\x97\\x77\\x4b\\x17\\x98\\x93\\x55\\x36\\xf2\\xf5\\xf0\\x11\\xce\\x57\\x61\\x3a\\x94\\xfc\\xb7\\xe7\\x28\\x6a\\x6d\\x49\\xc1\\x0f\\xd9\\x29\\xd7\\x67\\x1c\\xbb\\x8c\\xf1\\x7d\\xfc\\xad\\x4b\\x24\\x85\\xc3\\xd8\\xfd\\x79\\x12\\x87\\x21\\xe5\\x5d\\x84\\x80\\x87\\x63\\xc2\\xaf\\xa9\\xc5\\x5e\\x3b\\x0c\\xd7\\xbf\\x2f\\x0a\\x66\\xb5\\xe4\\x67\\xbe\\xc5\\xee\\x89\\xad\\x57\\x0b\\x60\\xf1\\x88\\xb3\\xf7\\xb4\\xa5\\x11\\xff\\x85\\x93\\x12\\xde\\xd0\\x78\\xd8\\xd0\\x09\\x11\\x34\\xfd\\x49\\xbc\\x79\\x2d\\x2d\\x7d\\x60\\xb3\\x04\\x94\\x1c\\x7f\\x23\\x20\\x6f\\x99\\xe8\\x63\\xb1\\xe2\\xd8\\xc9\\xec\\xff\\xd2\\xff\\x0a\\x3a\\x3c\\x75\\x49\\x85\\x61\\x5a\\x9a\\x92\\xed\\xce\\xad\\x00\\xfe\\x0e\\x05\\x49\\x3b\\x19\\x8d\\x1f\\x7c\\x90\\x08\\x84\\x46\\xbb\\xa4\\x60\\x38\\xa7\\x1f\\x32\\x65\\x3b\\x59\\x12\\xb2\\x4f\\x43\\x13\\x77\\x48\\xb7\\x5a\\xec\\x2c\\x15\\xfe\\x4b\\xf5\\xa6\\xf8\\x6b\\x8a\\x6c\\xdd\\x9c\\x74\\x47\\xf2\\xeb\\xb0\\xf4\\x3b\\x01\\xca\\x15\\x23\\xe0\\xd4\\x96\\x24\\x00\\x06\\xad\\x7f\\xff\\xfa\\xfe\\x0d\\xf5\\x75\\x4b\\x34\\x2c\\xaf\\xf3\\x55\\x5d\\x72\\xa2\\x7d\\x0b\\x92\\xca\\x16\\x67\\x66\\x5c\\xec\\x43\\xbf\\xb5\\x83\\x07\\x7a\\x9c\\x17\\x41\\xfa\\x49\\x2c\\xe3\\xdc\\x2c\\x75\\x29\\xcd\\xed\\x81\\xb8\\x28\\x1a\\x3f\\x37\\x59\\x48\\xb8\\xa7\\xce\\xd0\\x96\\xb2\\xfa\\xcc\\x25\\xe3\\x90\\x29\\xe2\\x21\\xb6\\x6a\\x53\\xd3\\x97\\x9e\\x1f\\x40\\x5f\\xd8\\x8a\\xfc\\x06\\xec\\x6e\\x43\\x09\\xdc\\x85\\xe6\\x9d\\x6e\\xf2\\xb4\\xb4\\x92\\x66\\x16\\x4a\\x9d\\x9d\\x1c\\x31\\xee\\x39\\x21\\x12\\x7b\\x13\\x38\\x1b\\xfb\\x74\\x0d\\xd3\\x8d\\xc1\\xc7\\x31\\x59\\x21\\xf9\\xc2\\xfe\\x58\\xb6\\x1b\\x63\\x1a\\x7d\\x9f\\xde\\x2d\\xd8\\xa4\\xbe\\x3d\\xed\\x04\\x90\\xae\\x3b\\x83\\x76\\x79\\x19\\x55\\xc1\\xc4\\xb4\\xfe\\xd0\\x0b\\x9f\\x4c\\x38\\xab\\x73\\x50\\xfc\\x2e\\x37\\xa3\\x15\\x0c\\x18\\x16\\x2b\\x1f\\xaf\\x03\\x37\\x89\\x4b\\xc2\\x3e\\x74\\xf5\\x95\\xe4\\xbe\\x33\\x46\\x6d\\xea\\xb3\\x54\\x58\\xbe\\x97\\xb4\\xf7\\x56\\x58\\x97\\xf0\\x68\\x52\\xf7\\x1c\\x60\\xfe\\xf9\\x10\\x1d\\x72\\x6b\\x72\\xe0\\x10\\x2a\\x97\\xb2\\xca\\x52\\x11\\xe3\\x80\\x68\\x34\\xb0\\xac\\x1a\\x7d\\xf8\\x7c\\x2a\\x07\\x8d\\xf2\\x63\\xef\\x8b\\xa4\\x57\\xdc\\x89\\x1b\\x7f\\x2e\\x62\\x78\\x11\\xab\\x62\\x2b\\x99\\x46\\xf8\\xc6\\xb7\\x31\\xf2\\x40\\x78\\xd1\\x7b\\x06\\xb2\\x00\\xc3\\x44\\x7f\\x80\\x32\\xaa\\x3e\\x7a\\x24\\x3e\\xe4\\x22\\xdd\\xa2\\xe6\\x52\\xfd\\x75\\x71\\x3a\\xfb\\xce\\x8a\\x59\\xef\\x85\\x36\\x65\\x3a\\x48\\xdc\\xf4\\x2a\\x70\\xe7\\x62\\x1f\\x9b\\x28\\x02\\x40\\x9b\\xe1\\xc1\\xa6\\x1f\\x32\\xe3\\x67\\x89\\xa5\\xc5\\x05\\x5e\\x1a\\x82\\x68\\xe9\\xdc\\x43\\x8c\\x2e\\x15\\x27\"},\n{{0x0c,0x80,0x8b,0x06,0x6f,0x0c,0x8e,0x8d,0xbb,0x1c,0x23,0xd6,0xc2,0xce,0xdd,0x0b,0xe8,0x66,0xd8,0x42,0x5f,0x24,0x1a,0x92,0x85,0x70,0x0e,0xa5,0x45,0x36,0xcf,0x6d,},{0x44,0xee,0x72,0x90,0x04,0x50,0xc5,0x6a,0xb2,0x1f,0x26,0x86,0xd2,0x95,0x25,0xd0,0x66,0x3e,0x0b,0xdd,0x87,0x72,0x5b,0xea,0xc5,0xd6,0x8b,0xac,0xeb,0x69,0xf1,0xd2,},{0x38,0xc6,0x82,0xce,0xde,0xfb,0x13,0xe4,0x6b,0x11,0xf7,0xb5,0xf8,0x00,0xcc,0x81,0x20,0xd4,0x5a,0x83,0xcd,0x8d,0x8d,0xec,0x10,0xc5,0x77,0xbb,0x01,0x53,0xd5,0x09,0xba,0x4f,0xdf,0x40,0x09,0x98,0x78,0x8b,0x70,0x60,0x07,0xce,0x16,0x2b,0x96,0x94,0x5c,0x71,0x40,0xbe,0xee,0x74,0xe1,0x9d,0x07,0x43,0xaf,0xa4,0xec,0xfd,0x25,0x0a,},\"\\xc9\\x45\\x71\\x41\\x00\\x58\\x1f\\x4e\\x24\\xda\\x11\\xfc\\x0f\\x6c\\x6d\\x02\\x10\\x43\\x3f\\x97\\x77\\x52\\x51\\x24\\xc5\\x5e\\xe0\\x72\\xd8\\x5d\\x79\\x8b\\x70\\x5f\\x9d\\x31\\xc8\\xf9\\x77\\xdb\\x6e\\xdf\\xb7\\xa6\\x5c\\x78\\xad\\x2d\\x7d\\x31\\xd6\\xb7\\xb5\\xbe\\x40\\xff\\x11\\x78\\xd3\\x03\\xb6\\x83\\x9b\\xb0\\xc6\\x32\\x10\\xc1\\xd3\\x38\\xc1\\x03\\xaf\\xa0\\xd4\\x53\\xec\\xa1\\xbc\\xa2\\x77\\xd9\\x30\\x77\\x8a\\xd5\\x08\\x02\\x27\\x2f\\x03\\xdb\\xe2\\x18\\x4f\\xc3\\x1e\\xf8\\xea\\x6a\\xbe\\x21\\x69\\x97\\x19\\x9f\\x7c\\x1b\\x33\\x77\\x37\\x96\\x89\\x07\\x27\\x2a\\xa5\\x1b\\xd4\\x9c\\x07\\x38\\x9c\\x95\\x46\\x8c\\xef\\x4f\\xd9\\x9a\\xe7\\x8c\\xa4\\x54\\x2a\\x2b\\xbc\\x0e\\x8a\\xa9\\x52\\x14\\xad\\x1c\\xff\\xf9\\xd5\\x08\\x5a\\x43\\x43\\x94\\x47\\x3b\\x84\\xb7\\x4b\\xe9\\xbf\\x2f\\x02\\x02\\xad\\x1e\\xe4\\x61\\x66\\x04\\xca\\x1d\\xd7\\x5f\\x4a\\x19\\x53\\x42\\xeb\\xbf\\x8f\\xc5\\x9f\\x3f\\x79\\x61\\x65\\x54\\xdc\\x7b\\xfd\\xd5\\x56\\xbe\\x43\\x72\\x21\\xc1\\x0b\\xfa\\xd3\\x9e\\x11\\x9e\\x06\\x04\\x5b\\xe5\\xfe\\xd6\\x83\\xd3\\x53\\x4f\\xb6\\xcf\\xed\\x33\\x89\\x1c\\x96\\xf9\\xc3\\x30\\xf2\\x8b\\x68\\x4f\\x8f\\xba\\xd4\\x7c\\x01\\x41\\x8e\\xab\\x6c\\xee\\xcc\\x2e\\xd7\\x77\\xf4\\xc2\\x18\\xa2\\x7a\\xc2\\x25\\x82\\x39\\x23\\x15\\xc5\\x3a\\xa7\\x30\\x9e\\xc5\\x4c\\x61\\x75\\x23\\x6e\\x44\\x24\\xdc\\x97\\x84\\x65\\xab\\x62\\x8d\\x95\\x44\\xb0\\xbe\\x84\\x10\\x3e\\xb5\\x6f\\x1b\\xaf\\xe5\\xe5\\xea\\xed\\x04\\xc9\\x8b\\xfe\\x2e\\x8a\\x24\\x18\\xc6\\xc5\\x2a\\x61\\xea\\xce\\x85\\x23\\x6b\\x66\\xc7\\xb3\\xb8\\x70\\x7e\\xd5\\x56\\x41\\xdd\\x9d\\x5d\\xa9\\x7c\\x99\\xc1\\x1c\\xbe\\xb9\\xaa\\x2d\\xb1\\x47\\x82\\x0d\\xc7\\x24\\x80\\x0a\\x9d\\x80\\xf5\\x05\\xfa\\x5a\\xf2\\x09\\x21\\xca\\xd2\\x43\\x56\\x83\\xbb\\x4f\\xc6\\x0b\\xdd\\xd4\\x75\\xf8\\x63\\xe2\\xf5\\x95\\x0d\\x23\\x63\\x99\\xd8\\xd7\\x5b\\x40\\x4b\\x39\\x4a\\x54\\x67\\x37\\xf9\\x3a\\x62\\x40\\x87\\x00\\xb3\\xab\\x3c\\x1e\\x92\\x2b\\x1a\\x85\\x9a\\x29\\x15\\xc2\\xd3\\x53\\x68\\x81\\x5c\\xd4\\x5b\\x85\\xb2\\xac\\x08\\x31\\x21\\xff\\x00\\x0f\\x05\\x0d\\xcd\\xf4\\x15\\xe5\\x27\\x5a\\x5c\\x42\\xda\\xe3\\xb1\\x54\\x00\\xf3\\xdd\\xaf\\x93\\x39\\xf2\\x0a\\x12\\x61\\xa8\\x8c\\xd9\\x02\\x05\\x63\\x97\\x63\\x21\\x11\\x52\\xdf\\x41\\x4a\\x9a\\x6a\\x62\\x18\\xf5\\x6b\\x35\\xa2\\xde\\x9e\\x84\\x82\\x44\\x9f\\x6d\\xa7\\x7c\\x9e\\x3d\\x4a\\xf0\\x49\\x30\\x15\\xa7\\x26\\x21\\x7f\\x82\\xac\\x58\\x95\\x4f\\xe3\\xe2\\xe3\\x44\\x40\\x35\\x6b\\x11\\x2e\\x06\\xa6\\xf6\\x71\\xfb\\x5a\\x6e\\xf4\\x61\\x9a\\x6e\\xa7\\xb4\\xe0\\x4d\\xb3\\x75\\x7f\\xb6\\x64\\xc3\\x96\\xb3\\x41\\xca\\x89\\x00\\x1d\\xc1\\x60\\x4b\\x51\\xfa\\x91\\x53\\xf9\\x13\\x0c\\x10\\x20\\xff\\x88\\x90\\x92\\x87\\x82\\x3a\\xb3\\x91\\x5c\\xcc\\x85\\xc4\\xe3\\x5d\\xf6\\xc2\\xf8\\xe6\\xf9\\x02\\xbe\\x82\\xba\\x21\\x29\\x7f\\xd3\\x83\\x5a\\xff\\x5c\\xe0\\x2f\\x3c\\x07\\xdc\\x09\\x3f\\xcb\\x1a\\xba\\x26\\xe0\\x6d\\xfe\\x6f\\x02\\xdf\\x79\\x29\\x1a\\xac\\xa0\\x69\\xec\\xab\\x93\\x81\\x40\\x4c\\x9c\\x3e\\xa1\\xad\\x40\\x9a\\xdf\\x29\\x2a\\x91\\xe3\\xa5\\x82\\xd5\\xa7\\xb6\\x8f\\xfb\\xe1\\x0a\\x03\\x05\\x24\\x8e\\x09\\x67\\xe6\\xdf\\x37\\x2f\\x28\\x1b\\xd1\\x92\\xe1\\x39\\x97\\x9c\\x98\\x66\\xca\\x8f\\xe1\\xe1\\x0e\\x06\\x16\\xdc\\x2d\\x4f\\x85\\xe1\\x19\\xe0\\xcb\\x4b\\xfe\\x8c\\xc3\\x1d\\x9f\\x5c\\x01\\x8b\\x65\\x40\\x85\\x24\\x00\\x0a\\x30\\x16\\xa2\\x3d\\x99\\x14\\xd5\\x7e\\x95\\x55\\x76\\xe2\\x66\\x0b\\x0e\\x0d\\x96\\xc8\\x49\\x5a\\x12\\xc3\\xd7\\x31\\x22\\xd2\\x00\\xb0\\xf0\\xe5\\xeb\\xd4\\x46\\x56\\x2b\\x08\\xf4\\x79\\x34\\xab\\x49\\x9a\\x96\\x99\\x1d\\xcf\\x99\\xc9\\x6a\\x62\\x88\\x07\\x39\\x84\\x5d\\x29\\x82\\x01\\x50\\x55\\x3e\\xae\\x9b\\xe0\\xbb\\x41\\xd5\\x3d\\x3a\\xf0\\x1d\\x98\\x67\\xbb\\x47\\x32\\xc9\\x0b\\xf6\\xe1\\x37\\x31\\x6e\\x3b\\x1e\\xdc\\xc2\\x09\\xa8\\xa0\\x9f\\xb0\\x62\\xa6\\xef\\x05\\xf3\\x7e\\x57\\xf2\\xc5\\xd1\\xd0\\xca\\xba\\xf0\\x7a\\x8e\\xd7\\xd4\\x14\\x55\\x40\\x7b\\x09\\x67\\x54\\x18\\x0a\\xa9\\x6d\\x3d\\x96\\x59\\x19\\x45\\xdd\\x7a\\x10\\x40\\xa2\\xde\\x60\\xd8\\xe1\\xc0\\x54\\xf7\\x85\\x46\\x52\\xb7\\x32\\xe7\\xa8\\xf5\\xb6\\x47\\x4c\\x3b\\xaa\\x18\\x40\\xfb\\xe8\\x1b\\x1e\\x6b\\x54\\xe2\\x01\\xef\\x0b\\xc8\\xd0\\xf2\\x13\\xd7\\xce\\xc1\\xd8\\x24\\xd2\\x22\\x09\\xac\\x72\\x52\\x5a\\x64\\xb9\\x03\\xe7\\x73\\xb8\\x3f\\x1b\\x68\\xf6\\x40\\x27\\x9f\\x15\\x05\\x3d\\x21\\xec\\x15\\xce\\x2f\\xf7\\x59\\x22\\x17\\x6b\\x75\\x84\\xa1\\x6b\\xf1\\xa1\\xf0\\xd6\\x36\\xb7\\x94\\x2a\\x3d\\x61\\x86\\x2f\\x6f\\xd1\\x30\\x99\\x72\\xd3\\x14\\x1e\\xb7\\x69\\x31\\x4c\\xa9\\x75\\xd0\\x20\\xbf\\x02\\xbf\\xdd\\xf1\\x7d\\x14\\xb6\\x0e\\xb7\\x86\\xbf\\x9f\\x55\\x98\\x9f\\xe4\\x73\\x32\\x0d\\x44\\x29\\x67\\x7e\\x30\\x1c\\x68\\x26\\x33\\xf8\\x13\\xff\\x26\\xc0\\xa3\\xda\\x92\\xf6\\xd0\\x68\\x06\\x16\\x10\\x5b\\x04\\x25\\xaf\\x33\\x8c\\x2e\\xa6\\x15\\x3b\\xdd\\x52\\x16\\xfa\\xe2\\xaf\\xe4\\x61\\xe9\\x24\\x9c\\x05\\xe3\\x2f\\x76\\xad\\x7c\\x42\\x9d\\x92\\x53\\x4b\\x68\\x6d\\xd1\"},\n{{0x04,0x9d,0xac,0x3c,0x97,0x7d,0x9d,0xf5,0x03,0x49,0x6b,0x43,0xd7,0x6e,0x55,0x40,0xe3,0x15,0x00,0x1a,0xd5,0x7f,0x15,0xea,0x9f,0x08,0x70,0xca,0xd2,0xd4,0xf9,0xe9,},{0xfc,0x6f,0x4b,0x7e,0xb3,0x9a,0x71,0x16,0x80,0xf9,0x66,0xd4,0x68,0xa6,0x1a,0xbb,0x13,0xa9,0xb6,0x44,0x9b,0xb9,0x9f,0xda,0x3d,0x12,0xce,0x1b,0x50,0x6d,0x1b,0x4b,},{0x75,0x32,0xd1,0xa6,0x1a,0x98,0x1f,0x30,0x3d,0x7c,0x24,0x54,0x35,0x4f,0x99,0x54,0x0c,0xd4,0x84,0xcd,0xe9,0xab,0x33,0x7d,0x6f,0x7b,0x51,0xf1,0x79,0x22,0x0f,0x7f,0xa2,0x07,0x34,0x76,0xb4,0x1c,0x71,0x52,0x9f,0x98,0x36,0xdb,0x6b,0x1d,0x0f,0x5a,0x48,0x2b,0xbb,0x4c,0x68,0x36,0x61,0x76,0xed,0x14,0xd4,0xd8,0xee,0xfa,0xde,0x0d,},\"\\x7f\\x31\\xe3\\x46\\xf6\\x8d\\xa7\\x37\\x16\\xaa\\xcb\\x16\\xee\\xa1\\x9b\\xb2\\x41\\x42\\xdc\\x28\\x3e\\x72\\x63\\xff\\xc3\\xf7\\x04\\xa2\\x2a\\xe5\\x27\\x5a\\x0e\\xf9\\x5f\\x06\\x69\\xba\\xe5\\xa5\\x4c\\x7f\\xeb\\x84\\xbc\\x74\\x87\\x3c\\xca\\x0f\\x33\\x5d\\x6c\\xff\\x3d\\x8b\\x4a\\x20\\x05\\x6c\\x64\\xf5\\xe8\\x82\\xcb\\xbb\\xd2\\xac\\x74\\x20\\x76\\x76\\x46\\x7e\\x54\\x66\\xdd\\xd5\\x6a\\xed\\xf5\\x6e\\x09\\x7c\\x7f\\x59\\xd9\\x45\\x91\\x5e\\xb0\\xeb\\xd0\\xc3\\xc8\\x3d\\x48\\x88\\x8d\\x3e\\x9e\\xde\\x51\\xad\\x2d\\xd8\\xa0\\xee\\x1e\\xab\\x4c\\xf8\\x7f\\xfa\\x78\\x63\\x5a\\xfc\\x4d\\x6e\\xf3\\xe8\\x7d\\xda\\x3b\\x65\\x56\\x5c\\x29\\x85\\xa4\\xad\\x0a\\xcf\\xdf\\xb8\\x1c\\xb0\\xe6\\x1c\\x67\\x82\\x6a\\x6e\\xa0\\xbe\\xd4\\xc0\\x8a\\xa1\\xa5\\x41\\xde\\x60\\x45\\x87\\x04\\xac\\x21\\xca\\x12\\xf1\\xc8\\x11\\x8b\\xb3\\x09\\x2c\\x35\\xa4\\x0c\\x92\\x1e\\x68\\x45\\x64\\x56\\x2c\\x2c\\x10\\x49\\xdc\\xdc\\x2b\\x8d\\x6a\\x97\\xe3\\x56\\x7d\\x35\\x6b\\xff\\xb5\\x69\\x2a\\x41\\xd8\\x9d\\xdd\\xa0\\xec\\x35\\x52\\x15\\x2a\\x27\\x57\\x7f\\x1c\\xce\\x57\\xd0\\x09\\x86\\xdc\\xa7\\x7e\\xdf\\x5e\\x25\\x18\\x15\\x82\\x00\\xad\\xf6\\x90\\xaf\\xfb\\x31\\xaa\\xf2\\xb5\\x74\\x83\\x68\\x39\\x44\\x09\\x99\\xf1\\x57\\x91\\xce\\xa8\\x53\\x42\\xac\\x94\\xa9\\x6c\\x7a\\xf7\\xa1\\x9e\\x49\\x43\\x10\\xae\\x26\\x67\\x5f\\x43\\xc3\\x52\\x58\\xe8\\x5b\\x68\\x40\\xb9\\x9c\\x6b\\x09\\xcf\\xa5\\x8d\\x19\\xf1\\xe4\\x3a\\x77\\xe3\\x97\\xb0\\x8c\\x0d\\xb1\\x83\\x0b\\xca\\x67\\xb3\\x9e\\xcd\\x87\\x52\\xda\\x61\\x1e\\x08\\x32\\xc6\\xca\\xe7\\xbb\\x8c\\xe7\\x4a\\x82\\xe7\\xe7\\x33\\x0b\\xe5\\x06\\x2e\\xd0\\x5a\\xa5\\xc8\\x44\\x57\\xb0\\x07\\xfb\\x5c\\xcd\\xc2\\x0a\\x55\\xd5\\x4d\\x8e\\x04\\x09\\xc8\\xbd\\x83\\x88\\x3d\\x2e\\x02\\x9d\\xff\\x26\\xea\\x5d\\xb2\\x75\\xdc\\xe0\\x99\\xe4\\x18\\x65\\x9a\\x04\\x00\\xf1\\x3b\\xe9\\xff\\xdc\\x14\\xe7\\xd6\\x45\\xa9\\x46\\x77\\xca\\x84\\x69\\x70\\xb7\\xe6\\xac\\x52\\x7f\\xa0\\x09\\xa3\\x59\\x45\\x4b\\x3c\\x49\\x36\\x49\\x05\\x18\\x9f\\xb4\\x9c\\x9b\\xac\\xb6\\x50\\xc0\\x3c\\xd8\\x28\\x75\\x89\\x4e\\x35\\x46\\xba\\x03\\xc3\\x2e\\x33\\x6f\\xc6\\x51\\x6a\\x87\\x67\\x6c\\x50\\xd5\\xb8\\x0b\\x30\\x54\\x27\\x3b\\x15\\x7c\\x5d\\x76\\x75\\x14\\xe5\\x45\\x74\\xb8\\xa1\\x01\\x98\\x5a\\x8e\\x96\\x7e\\x95\\xda\\x8f\\x92\\x98\\x00\\x26\\x0e\\x08\\x14\\x8b\\xee\\xe2\\xd7\\x78\\x1e\\x9e\\x85\\xd4\\x63\\xa9\\x4f\\xfe\\xfd\\xbb\\x75\\xc2\\x8f\\xa8\\x89\\x80\\x15\\x68\\x09\\x99\\x42\\x9c\\xee\\x79\\x8b\\x3f\\xd2\\xd9\\x67\\x37\\x86\\x8a\\x26\\x3f\\xba\\x9f\\xb6\\xf4\\xaa\\xd5\\x6a\\x15\\xc6\\x41\\x2f\\xf8\\x5e\\x7d\\x37\\x52\\x10\\x2d\\xaa\\xf2\\x5e\\x74\\x5f\\xa5\\xf6\\xf1\\x74\\xa2\\x31\\xfc\\xce\\x86\\x24\\xdd\\x70\\x85\\x6f\\x9b\\xab\\xcc\\x20\\x91\\x44\\xff\\x68\\x64\\x64\\x8d\\xea\\x0d\\x68\\x84\\x56\\x6a\\x4c\\x39\\x14\\x78\\x05\\xbe\\x08\\x4e\\x47\\x40\\xbc\\x50\\x93\\x09\\xbc\\xb1\\x42\\x96\\x4b\\xb0\\xcf\\xcf\\x67\\x26\\xa0\\xe0\\x4b\\xbf\\x32\\xae\\x68\\x34\\x73\\x2b\\xda\\x03\\x84\\xce\\xa8\\xf4\\xa4\\x84\\x9b\\xba\\x0d\\x18\\x64\\x6c\\x1c\\x34\\x47\\x18\\x96\\xb5\\xbe\\xf1\\x49\\xf8\\xca\\xb9\\xec\\x83\\x72\\x2b\\x0f\\xb2\\x09\\xef\\xe8\\xa0\\x4c\\x4a\\x23\\x5d\\xc8\\xdd\\xb2\\x0a\\xcd\\x92\\x76\\x5a\\xfb\\xf3\\x05\\x87\\x40\\xea\\x70\\xb9\\xc1\\x0d\\x9c\\x5a\\xef\\x86\\x06\\x29\\x8f\\xe4\\x15\\x15\\x93\\xb2\\x1f\\x79\\x7d\\x92\\xae\\x9f\\x1e\\x08\\x81\\xb0\\xd2\\x71\\xb0\\xd5\\xb1\\x0c\\x6e\\xd8\\x3c\\x34\\x9e\\xc2\\x47\\x3f\\xbf\\x2f\\xf7\\x80\\xdc\\xd0\\x76\\xd8\\xcf\\x0a\\xea\\xfa\\x71\\xfe\\x2b\\x8c\\x51\\x28\\x01\\x5f\\x8f\\xbb\\xcf\\xec\\xd5\\x28\\x1c\\xd5\\xea\\xcb\\x6f\\xe9\\xac\\x6e\\xaa\\x6e\\x47\\xd6\\x67\\xb9\\xad\\x4b\\x7e\\x41\\x1e\\x6c\\xb7\\x46\\x3d\\x56\\x76\\x07\\xaf\\xbf\\xd0\\x41\\x8c\\x4e\\xb0\\x6a\\xfe\\x84\\x7f\\x5e\\x40\\xb4\\x99\\x44\\x38\\x28\\xd5\\xa2\\x73\\xa4\\xa8\\x7e\\x46\\xde\\xf2\\x1a\\x91\\x9d\\x73\\x86\\x3a\\xf0\\x05\\x4a\\x09\\x9e\\x3a\\xdc\\x54\\x50\\xb8\\xe3\\x2f\\x51\\xea\\x52\\xc5\\x99\\xa4\\xa2\\xa3\\x53\\x51\\x78\\x8a\\xf7\\xcb\\x71\\xe5\\xc4\\x4b\\xcb\\x8d\\xf5\\x4a\\x60\\x1e\\x6e\\xc2\\xc1\\x82\\x8b\\x48\\xc4\\xb1\\xae\\x44\\x63\\x10\\x6f\\x10\\xef\\xa5\\xca\\xf3\\x09\\x1a\\xbf\\x99\\xaa\\xba\\x52\\x52\\xf4\\x84\\xd3\\xbb\\xc6\\x2b\\xfa\\x6b\\x2a\\x80\\x6d\\x23\\xc6\\x33\\x1a\\x62\\xfc\\x46\\xbc\\x62\\x76\\x79\\xe7\\x3e\\xc8\\x2d\\xcc\\x08\\xf7\\x91\\x43\\xf4\\xb7\\x1e\\xcf\\x35\\x7e\\xa2\\xf0\\xd7\\x4e\\x6d\\x30\\x58\\xe6\\x06\\x04\\x3f\\x6e\\x8f\\xed\\x70\\x42\\x82\\xc1\\x6b\\x1f\\x98\\x8f\\xfa\\x36\\x5c\\xfa\\xe9\\xa3\\xcf\\x79\\x2e\\x0c\\x5b\\xaa\\xd7\\x0c\\xa7\\xe2\\x57\\x76\\x01\\x8b\\x5e\\x7f\\x0e\\x95\\x44\\xe1\\xd7\\x3f\\x3e\\x5d\\x1e\\x41\\x6a\\x5e\\x50\\xfb\\xed\\x29\\x6d\\xc1\\xbf\\x4b\\x29\\xa3\\xfb\\xe3\\x2e\\xfb\\xd7\\xe9\\x9c\\x83\\x01\\x5d\\x27\\xf5\\x35\\xad\\xec\\xf1\\x75\\xfc\\x36\\xc1\\xea\\x4f\\x44\\x23\\xb3\\x6d\\xcd\\xc0\\x54\\xba\\x99\\x32\\x78\\xe8\\x5a\\xc3\\x62\\x2d\\x43\\x5f\\x52\\x37\\xba\\x61\\xb4\\x9a\"},\n{{0xf0,0x7d,0x61,0xb5,0xca,0x1c,0x27,0x00,0xcb,0x50,0xf9,0x00,0xc2,0x6b,0x7c,0x28,0xf6,0xc6,0x94,0x08,0x08,0xc7,0xba,0xff,0xf7,0x4f,0xca,0x4b,0x11,0xf4,0x25,0xd4,},{0xeb,0x24,0x3d,0xfa,0xcc,0x2d,0xc6,0x43,0x57,0x76,0xd5,0x54,0xec,0xed,0x8b,0xf9,0x23,0x90,0x60,0x4b,0x35,0x55,0x7c,0xda,0x51,0xfd,0x20,0x3e,0xdd,0xb4,0x93,0xfa,},{0xc1,0x9b,0x53,0x2b,0x82,0x48,0x56,0x39,0x32,0x63,0x97,0x01,0xbf,0x15,0xbc,0x01,0x5f,0xae,0xbb,0x17,0xbb,0x98,0xd8,0x71,0x61,0x6e,0x10,0x48,0xd6,0x4c,0xa5,0xf9,0x55,0xf5,0x58,0xf6,0x3b,0x53,0x53,0xa1,0x57,0x6f,0xa1,0xac,0xae,0xf3,0x9b,0xcb,0xc9,0x02,0x17,0x56,0xdf,0x5d,0x1a,0xb3,0xbc,0x74,0x1a,0xcc,0xf9,0x05,0x9b,0x04,},\"\\xc1\\xc6\\x78\\x43\\xd6\\x9a\\x0e\\x62\\xe7\\xbf\\x71\\xf9\\x02\\x06\\xa3\\xd5\\x59\\x5c\\xa3\\xc4\\x82\\xaa\\xa7\\x67\\xe9\\x31\\xb0\\xd6\\xc2\\xf4\\x75\\x2a\\xb8\\x69\\x91\\xf0\\x35\\x83\\xbb\\x13\\x8e\\x9f\\x72\\xfa\\xb5\\x8f\\xd6\\x02\\xa4\\xb6\\xb2\\x96\\x02\\xcf\\x89\\x14\\x08\\xaf\\x5a\\x1b\\xfd\\x33\\x98\\xc0\\x17\\x8c\\x44\\x14\\x61\\xe3\\xf4\\x9b\\xc8\\x1d\\x64\\xc0\\xd9\\x7f\\x5d\\xed\\x69\\x2c\\x75\\xd4\\xd6\\x4d\\xac\\x5d\\x80\\xd6\\x3b\\xd4\\xdc\\x52\\x10\\xc1\\xd9\\x35\\x0b\\x14\\x2b\\xa6\\xe7\\x68\\xf1\\x50\\x80\\x7a\\xb8\\xa8\\x6c\\xac\\xdb\\x59\\xd8\\x4d\\xdf\\x66\\x0b\\xe5\\x62\\x03\\xc0\\x14\\xfb\\xa1\\xe0\\xdc\\x16\\xfa\\x6d\\x32\\x69\\x4e\\x14\\xb1\\x28\\xed\\xd1\\xf6\\xc6\\xab\\x44\\x5a\\x3a\\xd3\\x41\\x74\\xfa\\x9e\\x4b\\x01\\xf2\\x5b\\x1d\\x5e\\x6e\\xb7\\x69\\x83\\xb4\\x29\\x5c\\xe4\\x91\\x4d\\x3a\\xe4\\x8c\\x70\\x4a\\x30\\xe5\\x54\\xfc\\x1f\\x86\\x8b\\x62\\x72\\xef\\xf0\\x6d\\xa2\\x4b\\xfe\\x17\\xe4\\xe0\\xf0\\xfa\\x46\\xbb\\x08\\xff\\xb9\\x07\\xcb\\x61\\xbe\\xbe\\x52\\xdf\\x31\\x1a\\x64\\xcb\\x57\\x8b\\x30\\xfd\\x62\\x7d\\xf1\\x12\\x21\\xae\\x40\\x03\\xa0\\xb0\\xc6\\x8e\\x3c\\x6f\\x95\\xa2\\x1c\\x85\\x00\\xd4\\x1b\\x2c\\x58\\x9c\\xc4\\x6a\\x13\\x9c\\xac\\xff\\x57\\xdc\\xf0\\x07\\x59\\xf5\\x2e\\x9c\\xa3\\xda\\xbd\\xb1\\x78\\x8a\\xb6\\xb3\\x8a\\x50\\x48\\xf5\\x8e\\x08\\xe0\\x5c\\x39\\x4f\\x9d\\x3c\\x72\\x11\\x3d\\x45\\x2b\\x70\\x84\\xc5\\x19\\xf8\\x6c\\x16\\x89\\xff\\xdb\\xae\\x50\\x6e\\xd8\\x45\\x05\\x22\\xcb\\xe4\\x3d\\xe2\\x7a\\xa3\\xbf\\xdd\\x92\\xa9\\x1b\\x71\\xe5\\x2a\\x3c\\xbf\\x77\\xc1\\xbd\\x28\\x93\\xea\\xbd\\x40\\x7a\\x57\\xfe\\x5e\\x14\\x68\\x73\\xbf\\xb2\\x04\\x3f\\x4a\\x61\\x47\\xdf\\x08\\x3e\\x54\\xa2\\x20\\x8d\\x19\\x25\\x81\\x3f\\xa4\\x04\\xe4\\xc4\\x74\\x06\\xe7\\x72\\x86\\x43\\xeb\\xfb\\x0b\\x10\\x14\\x2f\\x90\\x9e\\xf8\\x56\\xfd\\x3a\\x91\\x6b\\xc0\\x85\\x15\\x43\\xb8\\x2a\\x55\\xf8\\xcd\\x52\\x9b\\xd2\\x1d\\x9e\\x29\\x09\\xd6\\xd7\\xe7\\x7b\\xdc\\xea\\x46\\x73\\xe5\\x45\\xff\\x4a\\x67\\xfa\\x37\\xd6\\x5f\\x1f\\x63\\xf1\\x1d\\x5d\\x0d\\x55\\x97\\x4a\\x30\\xab\\xe1\\x88\\x33\\x5d\\xb5\\xdc\\xbd\\x35\\x66\\x58\\xf9\\xb7\\x76\\x82\\xd9\\x6d\\xab\\xb2\\x58\\xea\\x95\\x95\\x1a\\x05\\x59\\xae\\xa4\\x06\\x4d\\x5e\\xa1\\x68\\x05\\x01\\xdc\\xb4\\x22\\x8f\\x2c\\x95\\x6f\\x81\\xd2\\x10\\x11\\x44\\xaf\\x74\\xc7\\x16\\xbc\\x8b\\xf4\\x29\\x6d\\xc3\\xb8\\x31\\x72\\x5c\\xc1\\x7d\\x3b\\xfd\\x90\\x66\\xa2\\x99\\x53\\xb2\\xec\\xd7\\x50\\x59\\x43\\x5b\\x49\\xa2\\x5a\\xc5\\x25\\xb4\\xfb\\xab\\x17\\x79\\x02\\x2d\\xfb\\x6d\\xe5\\x25\\x14\\x9d\\xcd\\x90\\x2a\\xc8\\xa7\\xe2\\x1f\\x34\\x4f\\x5f\\x01\\x01\\x48\\x06\\x92\\xd6\\x16\\x08\\x95\\x2c\\x71\\x41\\x3e\\x30\\x03\\x79\\x45\\xe2\\x06\\xc5\\xee\\xad\\xfc\\x3e\\xdc\\x4b\\xae\\x0d\\x79\\x6c\\xa0\\xc5\\xf5\\x6d\\x6f\\xfb\\x3f\\x09\\x69\\xdf\\x9d\\xf8\\xa7\\x94\\xf5\\xdc\\x83\\xa3\\xb2\\xf5\\xc3\\xab\\x36\\xbb\\x90\\x1b\\xcc\\x31\\x55\\x1c\\x55\\x0c\\x63\\xfa\\x41\\xd6\\xa8\\xd5\\x7b\\xdb\\x9b\\x5c\\x65\\xbc\\x61\\x0c\\x3a\\x98\\x97\\x52\\xab\\x28\\xa0\\x15\\xe7\\xc2\\xf6\\xb2\\xfb\\xf1\\x99\\xa7\\x6b\\x97\\x50\\xc0\\xd3\\xd5\\x92\\x11\\x9c\\x8b\\x40\\x22\\xfa\\x45\\xba\\xde\\x2f\\xbb\\x41\\x43\\x26\\x79\\xb5\\x2a\\xcb\\x46\\x08\\xa9\\x5c\\x34\\xaa\\x40\\xbf\\xfe\\xc1\\x0b\\xc9\\x8f\\x47\\x29\\xdf\\xcc\\xb6\\x50\\xb2\\xa0\\x52\\xdf\\xb0\\x68\\x95\\x9e\\x64\\x8a\\x92\\xd5\\xaa\\x4d\\xd2\\xd1\\x7d\\xde\\x67\\xcd\\xf2\\xe6\\x37\\x7a\\xf0\\xd4\\xae\\x37\\x96\\x07\\x38\\x9d\\x7e\\x35\\x96\\x44\\x1b\\x9f\\x42\\x22\\xcf\\xf6\\xaf\\x73\\xb3\\x30\\x02\\x70\\xce\\x54\\x80\\x0b\\xd9\\x34\\xa9\\x10\\x9a\\x02\\x56\\x3a\\xdc\\x56\\xae\\x46\\x58\\x44\\x51\\xcd\\xaf\\x4a\\x77\\x53\\x81\\x57\\xe5\\x87\\x0f\\x4a\\xe1\\x2d\\xbc\\x81\\x87\\x0f\\x5d\\xb4\\x1a\\x2c\\xb5\\x5e\\x00\\xdb\\x3d\\x22\\x31\\x62\\x8f\\x17\\x27\\xc3\\xac\\xb9\\x9e\\xd3\\xac\\xd8\\xb6\\x71\\x56\\xa8\\x00\\x5a\\x4c\\xc8\\xf3\\xd3\\x55\\x5b\\x79\\xa0\\x37\\x73\\xa9\\x31\\xf1\\x4e\\xeb\\xce\\x40\\xb9\\xfe\\x46\\xed\\xe5\\xda\\x08\\x81\\xfb\\x22\\x07\\x17\\xe4\\x18\\xe8\\xb5\\xa0\\xfe\\x5e\\x47\\x7e\\x72\\x85\\xc5\\x54\\xe8\\x59\\xe1\\x64\\x41\\x67\\x2b\\x48\\x99\\x34\\xa3\\xa9\\xee\\xb8\\x8d\\x78\\xfc\\xc5\\xc1\\xdb\\x2d\\x1f\\xbd\\xde\\x39\\x27\\x73\\xf6\\xc9\\x39\\x97\\x2e\\xe8\\xfa\\x31\\x89\\xf4\\xe9\\x87\\x2b\\x4a\\xbd\\xc8\\x3b\\x37\\x9c\\x0c\\x10\\xe8\\x18\\xdc\\xff\\x75\\xc8\\x3d\\x68\\x70\\x72\\x92\\x84\\xce\\xd4\\x1f\\x2f\\xf5\\x5a\\x87\\xc9\\x60\\xe6\\x3d\\x12\\x11\\xf0\\x80\\x71\\x29\\x3f\\x6a\\xc6\\x3f\\x9b\\xde\\xf3\\x8f\\xd5\\x91\\x9c\\xa9\\x0b\\x3f\\x5e\\x25\\xa6\\xc0\\xc6\\x64\\xc4\\xec\\xf8\\x31\\xc6\\x4e\\x2d\\x4c\\x6e\\x79\\x8a\\x98\\xa3\\xa0\\xf7\\xbe\\x7a\\x24\\x63\\xea\\xda\\xa6\\xa2\\xa3\\x48\\xf9\\xa4\\x94\\x71\\x71\\x23\\xcc\\x0a\\x28\\xc0\\xa5\\xea\\xe3\\xf5\\xb5\\x85\\xf2\\xcb\\x8c\\xb2\\x60\\xc2\\xc5\\x03\\xe4\\x15\\x78\\x57\\x3c\\xd9\\xb7\\xcb\\xa1\\x40\\x8d\\xca\\x9d\\x86\\x0a\\xe4\\xf8\\xc3\\xd3\\xf3\\x22\\xa4\\x5b\\x58\\xa2\\xc4\"},\n{{0x50,0x86,0x4a,0x75,0xaa,0x0c,0x69,0xb5,0x93,0x50,0x07,0x7c,0x20,0x4b,0x20,0x75,0x7f,0x2b,0x8b,0x68,0x55,0xc3,0x7e,0xd7,0x21,0xb4,0x9f,0x2a,0xc9,0x17,0xd6,0xb2,},{0xcf,0xf3,0xeb,0xd5,0xea,0x0c,0x8b,0x55,0x31,0xd9,0x21,0x1e,0x22,0x19,0xe4,0xcf,0xe5,0xde,0xd9,0x91,0xd8,0xec,0x42,0x4d,0xf5,0x4c,0xf5,0x3c,0x83,0x76,0xf9,0xbd,},{0x17,0x74,0x55,0xa7,0x16,0x94,0xf1,0x2b,0x76,0x2f,0xd1,0x7e,0x08,0xbd,0xf0,0x10,0xa7,0xfc,0x91,0xd1,0x91,0x41,0xd7,0xae,0x23,0x99,0xbd,0x24,0x1a,0x99,0x8a,0x6a,0x50,0xa9,0x72,0x2a,0xc1,0x23,0x2c,0x59,0xe4,0xe2,0xaa,0xa8,0x28,0x07,0x8b,0x2b,0x92,0xf4,0xa5,0x4c,0xdf,0x0e,0xfe,0xbb,0xa2,0xc1,0x6d,0xbe,0xaf,0x07,0x22,0x03,},\"\\xb3\\x65\\xf4\\x76\\xac\\x92\\xe7\\x60\\x12\\xa7\\xff\\xd8\\x78\\x2a\\xf1\\x5a\\x3f\\x5e\\xe1\\x47\\xf6\\x03\\xa3\\x67\\xad\\xf2\\xf9\\x72\\x46\\x13\\xe8\\x76\\x5b\\x03\\x7a\\xc0\\xeb\\x1f\\x67\\x37\\x36\\xe1\\x13\\x63\\xe3\\x52\\xed\\x5a\\xe9\\xeb\\x5a\\x67\\x12\\x5e\\xd8\\x18\\x90\\x03\\x42\\xae\\x93\\x37\\x1c\\x43\\x3b\\x91\\xf6\\x02\\x1d\\x4b\\xe2\\xa0\\x52\\xb0\\xda\\x43\\xb3\\x68\\x2e\\x7f\\x74\\x0a\\xe8\\x01\\xd0\\x54\\x10\\x57\\x85\\x8e\\xb0\\xc9\\xc2\\x8d\\x98\\xf0\\x3b\\x45\\xe1\\x28\\xaa\\xa3\\x42\\xc6\\xb6\\x02\\x77\\x67\\x92\\xaa\\x81\\x24\\x1c\\xad\\x06\\xf1\\x33\\x8f\\xa0\\xc7\\x17\\x57\\x18\\x0f\\x58\\x8c\\x83\\x01\\xd9\\x1c\\x27\\x67\\x9b\\x50\\x21\\xcd\\x75\\xd7\\xf6\\x17\\x1e\\xe9\\xf8\\xd5\\x6e\\x43\\x77\\x67\\x98\\x12\\xf6\\xec\\x5e\\xd4\\x65\\x38\\xca\\xed\\x50\\x0c\\x1d\\x15\\xf5\\xfc\\x86\\xea\\xf9\\xed\\x9c\\xf9\\xa0\\x60\\x6b\\x22\\x61\\x4f\\xaf\\x67\\x64\\x62\\x13\\x4e\\x3d\\xb3\\x58\\x23\\x32\\xb4\\x83\\xdf\\xa5\\x4c\\xa2\\x9a\\x5e\\xb0\\xd6\\xba\\xe3\\x38\\x0e\\x19\\xd0\\x60\\x11\\x34\\x53\\xf3\\x2b\\xba\\xb7\\xe1\\x18\\x62\\x7b\\x40\\xbc\\xab\\xf1\\x71\\x1b\\xcf\\xea\\xb8\\x95\\x7d\\xe3\\x39\\x43\\x6c\\x70\\x88\\xbb\\x88\\x31\\x01\\x53\\x9a\\x09\\xd3\\xbe\\xf0\\x88\\xfc\\x1f\\x84\\x07\\x64\\x03\\x6f\\xfb\\xb3\\x3d\\xec\\xd1\\x2a\\xac\\x57\\xfd\\x26\\xf8\\x48\\x23\\xe1\\x95\\x53\\xd4\\xd6\\x7e\\x00\\x0e\\x94\\x36\\xca\\x32\\x3d\\xe0\\x99\\xbc\\x1c\\xe7\\x5e\\xbf\\x5d\\xdc\\xcb\\x44\\x8c\\xd7\\xa2\\xe4\\xbb\\xd6\\xb3\\x2e\\x3f\\x20\\x24\\xf9\\x6c\\xc5\\xc7\\x15\\x2b\\x8b\\xe8\\xed\\x0b\\xd8\\xe4\\x36\\xd3\\x24\\xd1\\xce\\x1d\\xd3\\xcf\\xcc\\x45\\x2a\\x28\\xc7\\x3a\\x95\\xaf\\x84\\x82\\xaa\\x77\\x2a\\xe5\\x3d\\x5b\\xe1\\x29\\x2e\\x39\\xd1\\x71\\x6b\\x43\\x75\\x8f\\xe5\\x63\\xc8\\xaa\\x3b\\x74\\xbb\\xa5\\xc0\\x2d\\x04\\x77\\x8d\\x91\\xe3\\xd4\\x3d\\xcc\\x72\\xbb\\x7c\\x7b\\x04\\x3c\\x05\\xc8\\x74\\x5b\\x70\\x5e\\xe7\\x5b\\x5a\\x4e\\xc7\\xb9\\x5b\\x65\\x43\\x59\\xfb\\x5e\\x85\\x33\\x38\\x21\\x98\\x51\\xd4\\x0a\\x8a\\xfb\\xb4\\xf9\\x1e\\xcb\\xb4\\x1e\\xb8\\x15\\x34\\x19\\x6c\\xc0\\xcc\\x9d\\x3e\\xb7\\x14\\x39\\x6c\\xaf\\x04\\x5b\\x23\\x17\\x22\\xd4\\x48\\x65\\x03\\x64\\x04\\x19\\x98\\x84\\x80\\xa7\\x81\\x58\\x08\\xbe\\x97\\x42\\x87\\x37\\x2c\\xfc\\x48\\x99\\x65\\xaa\\xc5\\xb8\\x09\\x5c\\x63\\x75\\x81\\xeb\\x91\\x0f\\x90\\x55\\xcd\\x1c\\x0a\\x0a\\x3b\\x0b\\x33\\xac\\xa9\\x0f\\x7c\\x5b\\x8e\\x6e\\xf6\\x83\\xab\\xf0\\xce\\x53\\xae\\xba\\x51\\xbe\\xc4\\xfc\\x7b\\x42\\x7a\\x23\\x47\\x36\\x0f\\xca\\x86\\x36\\xd3\\xf1\\x46\\x92\\x84\\xf2\\x69\\xa9\\xab\\xf0\\xcb\\x1a\\x24\\x4a\\x15\\xd6\\xb4\\x04\\x65\\xe7\\x5c\\xf8\\x90\\x92\\x47\\x4a\\x8b\\xed\\xa0\\x33\\x39\\x1d\\xd3\\x11\\xc4\\x99\\x51\\x9a\\x08\\xc4\\xf0\\x34\\xe7\\x19\\x18\\xd7\\xca\\xd4\\x18\\x45\\x32\\x7c\\x89\\xe7\\xb1\\xe9\\x4a\\xfb\\x07\\x23\\x78\\x2c\\xe5\\xc5\\x53\\xef\\x36\\x79\\x1b\\xba\\x63\\xde\\x17\\xd7\\x46\\x49\\x18\\x94\\x01\\x2c\\xeb\\xd8\\x7b\\x18\\x37\\xa8\\x21\\xef\\x5c\\x62\\x4b\\xbc\\x84\\xcc\\x50\\x35\\xf5\\xe7\\x0c\\xd9\\xf2\\x1b\\x42\\x21\\x9a\\x2d\\xce\\x30\\xe0\\xe6\\x5c\\x25\\x0d\\x0d\\x19\\x4d\\x2b\\x52\\x48\\x6b\\x03\\xee\\x66\\x33\\x29\\x81\\xa5\\x22\\x51\\x74\\xdb\\x17\\xe5\\xa8\\xbb\\x4a\\x10\\xed\\x9c\\x8a\\x44\\x5c\\x41\\x44\\x2f\\x3b\\xcd\\xb6\\xb4\\xf4\\x9e\\x4e\\x1d\\xc8\\x76\\x61\\xa7\\xb6\\xe4\\x1f\\x35\\xf5\\x5d\\xd6\\x7b\\xd4\\xcb\\xc6\\xff\\x58\\xbf\\xbf\\xfa\\xff\\xd2\\xc3\\x82\\xfc\\xad\\x0c\\xae\\x8f\\x0d\\xf9\\xaf\\x6a\\xcf\\x09\\x40\\x00\\x76\\x18\\xa5\\x4a\\xee\\x31\\xd9\\x32\\xcb\\xd8\\xe8\\xb4\\x1c\\xa0\\x38\\x21\\xc4\\x28\\xa0\\xef\\x8e\\x58\\xd2\\x43\\x5e\\xec\\xd5\\x03\\xc5\\x4d\\xa9\\xc1\\x62\\x8f\\x3c\\x74\\x9b\\x77\\x05\\x19\\xf5\\x3b\\xf2\\xd5\\x7e\\xd7\\x12\\xd0\\x75\\xd3\\x73\\x37\\xb7\\x7a\\x2b\\x10\\xa7\\x2d\\x2d\\x59\\x0c\\x20\\xd5\\xce\\xc2\\xca\\xcc\\x6c\\x3a\\x8d\\xc1\\x13\\xe2\\xd1\\x6e\\xf2\\xd1\\xb3\\x90\\xed\\x96\\xe4\\x03\\x6a\\xcd\\x30\\x4e\\x0c\\x7c\\xef\\x9d\\x43\\x1f\\x88\\x21\\x8a\\xa1\\xf8\\x38\\x28\\xdd\\xa6\\x36\\xb9\\x4a\\xa7\\x61\\xc7\\x31\\x7e\\xcf\\x11\\x6c\\xbf\\xc6\\x11\\xe5\\xba\\x6d\\x94\\xc5\\x0e\\x99\\x46\\x93\\x02\\x3b\\xdf\\x2d\\x24\\x8e\\xd6\\x03\\xf8\\x5b\\xe7\\x3a\\x00\\x08\\xb7\\x5a\\xde\\xf9\\x51\\xdc\\xcf\\xa3\\x0e\\x42\\xe9\\xf5\\xbb\\x05\\x02\\x3a\\xde\\x79\\x75\\x06\\xcb\\xf9\\x0b\\xb6\\xdc\\xe4\\x3c\\xf3\\xa1\\xc3\\x14\\x1a\\x5c\\xc5\\xfd\\x9a\\x4f\\x3c\\xc5\\x57\\xb9\\x0e\\x18\\x04\\x9b\\x3c\\x13\\x0f\\x46\\x1e\\x4f\\x32\\x29\\x9f\\xa1\\xd1\\xcf\\x9c\\x7f\\x2e\\xa2\\x05\\x35\\x65\\xe8\\x16\\x0a\\x34\\x1c\\xdd\\xf9\\x9a\\xcd\\xdd\\x49\\x16\\x97\\xfa\\x70\\x51\\x24\\xab\\xda\\xb4\\x2a\\x5e\\x8f\\xcf\\x04\\x8d\\xd9\\xf1\\x79\\x38\\x4e\\xc9\\x2a\\x46\\x9a\\xeb\\x11\\xe8\\xbc\\x62\\xb6\\x9d\\xbc\\xfc\\xec\\x66\\x81\\x75\\x47\\x57\\xe4\\xc5\\xd0\\xfd\\xd9\\xb9\\xcf\\xda\\x49\\xaf\\x09\\xb8\\x3a\\x5a\\x4a\\x10\\xae\\xd9\\xa4\\xcf\\x7d\\xdf\\xa2\\x89\\x20\\x9d\\x47\\x5a\\xb3\\x31\\x8c\\xd4\\xb9\\x65\\xe0\\x07\\xdc\\xe1\"},\n{{0xe5,0x5f,0x22,0x0f,0xff,0x80,0x79,0x14,0x8b,0x25,0x41,0x89,0xbb,0x29,0x41,0x74,0xf8,0xe2,0xc5,0x75,0xe5,0x7f,0x39,0xd4,0xba,0xc8,0x16,0x5c,0x5e,0x56,0xe7,0x69,},{0x7f,0xd5,0x07,0xd0,0x3f,0xe1,0xd6,0xe3,0xf9,0x11,0xf0,0x59,0x59,0x7b,0x0e,0x29,0x2e,0xa0,0x96,0xf5,0xbc,0x85,0x18,0x52,0x91,0x6b,0xf1,0x21,0x7c,0xaf,0xdc,0x6c,},{0xc1,0x02,0x3a,0x70,0x68,0x74,0x3e,0xc4,0x66,0x8f,0x49,0x5e,0xb7,0xbd,0x4d,0xb5,0x81,0x29,0xc1,0x1e,0x58,0x29,0x9e,0xa8,0x7d,0x6f,0xac,0xd3,0x02,0xbf,0x29,0x6a,0x98,0xe2,0x98,0xfd,0xb4,0x8e,0xdd,0xf9,0xc4,0x4e,0x79,0xae,0x86,0x41,0xf7,0x34,0x50,0x3b,0xb8,0x3d,0xc0,0xb3,0x1f,0x61,0x0d,0xf1,0xd1,0xe9,0xd6,0x19,0xa7,0x05,},\"\\x1e\\x2c\\xe8\\xbf\\x0e\\xa7\\x87\\x5d\\xf2\\x85\\xb1\\xdb\\xd3\\x4b\\xbe\\x67\\x30\\x7f\\x2e\\x8a\\xc8\\xbc\\x14\\x2c\\x3b\\xa3\\x14\\xc1\\x64\\x2c\\x65\\xa2\\xd6\\x2e\\xb2\\xc7\\x83\\xf9\\x16\\x28\\x3c\\xa4\\xec\\x3e\\x53\\x6d\\x3e\\xeb\\x65\\xcf\\xdc\\xc0\\x54\\x9a\\xc4\\xf6\\xa4\\x5f\\x53\\x9a\\xc5\\xdf\\x79\\xa6\\xd5\\x76\\x82\\x19\\x73\\x9d\\x0c\\x9a\\x0c\\xdb\\xb3\\x12\\x42\\x29\\x6c\\x33\\x12\\xb7\\xed\\x56\\x00\\x43\\xf5\\x36\\xcd\\x1d\\xe9\\xa9\\xc2\\xb2\\x89\\x64\\x1a\\x1c\\x2d\\x84\\xf9\\xa6\\x8b\\x7c\\x03\\xb8\\xb8\\x56\\x7e\\x5d\\xc7\\x13\\x8c\\x2c\\xb9\\x67\\xc6\\x28\\xaa\\x25\\xb2\\xea\\xb4\\x34\\xd4\\x49\\x0b\\x23\\x50\\x74\\x09\\x71\\x7c\\xde\\x94\\xda\\x59\\xdc\\x1d\\xc2\\x5c\\x7b\\xe4\\x2a\\x8a\\xa0\\x2e\\xdc\\xf4\\xd9\\x95\\x36\\x8e\\x6b\\xa0\\xee\\x1f\\x95\\x36\\x00\\xdb\\x98\\xd2\\x2d\\xe0\\xf8\\xd2\\x57\\x02\\x0e\\x0a\\x40\\x6e\\xe1\\x66\\x9b\\xd5\\x27\\xb9\\xfe\\x1c\\x61\\x1f\\x9b\\xe5\\xa3\\xd7\\x52\\x8e\\x8b\\x61\\x51\\x67\\x0a\\x86\\x63\\xd2\\xed\\x1a\\x58\\xd3\\xe3\\x69\\xbb\\x72\\x2a\\x63\\x02\\xd7\\xc1\\x72\\xa1\\x9b\\xda\\xf3\\x57\\xee\\xdb\\x02\\x27\\x91\\x56\\xe3\\xb9\\x03\\x44\\x31\\xa7\\xd6\\x8a\\x39\\x52\\x8e\\xb4\\x02\\x35\\x87\\x57\\x3e\\xb8\\x8f\\x30\\xf9\\x4e\\x83\\x3e\\x8a\\x23\\xb9\\xd0\\xac\\x7b\\x5c\\xa8\\x78\\x24\\x59\\x6b\\xbb\\x0a\\x3d\\x0c\\xa1\\xb1\\x6a\\x68\\x78\\xfd\\xf7\\xe2\\xce\\xa3\\x4a\\x6f\\xfb\\x95\\xa9\\xff\\x4e\\x88\\x8a\\x97\\x59\\x37\\x35\\xb8\\x68\\xda\\x75\\xd8\\x70\\x7b\\xbf\\xdb\\x1d\\x93\\xeb\\x86\\xa5\\x1e\\x2d\\x21\\x5f\\x1d\\xd9\\xdc\\xf7\\x83\\x88\\x72\\x9a\\x3e\\xb0\\xf0\\x66\\xdd\\xc9\\x41\\xe9\\x50\\xc9\\x21\\x27\\x19\\x8b\\xce\\x63\\xa5\\x48\\x68\\xd9\\x97\\x02\\x95\\x72\\xff\\xa6\\xf6\\xfe\\xa1\\xd3\\xa6\\x91\\x64\\xc9\\x99\\x69\\x53\\xdc\\x8b\\x6f\\x9d\\xad\\x06\\x35\\xc9\\xb0\\x81\\xf5\\x5f\\x98\\x33\\x40\\xf0\\x81\\x4b\\xf5\\x47\\x08\\x03\\x09\\x0e\\x79\\x97\\xf7\\xab\\x79\\x6c\\x2b\\x15\\xad\\xaf\\x40\\x21\\xd6\\x7c\\xff\\xaf\\x6e\\x1e\\xf6\\x28\\x67\\x50\\x39\\x45\\xc2\\x1a\\x32\\x96\\x64\\xe0\\x8a\\x95\\xa4\\x15\\x82\\x30\\x0d\\xa9\\xbe\\xd2\\x08\\x44\\x4c\\xe6\\xaa\\x12\\xb3\\xf8\\x67\\x79\\x5c\\x6e\\xe4\\xc4\\xc9\\x25\\x70\\x18\\x62\\x73\\x61\\x29\\x3b\\xd5\\x27\\x82\\x1a\\x29\\xa3\\x39\\xb4\\x04\\xa2\\xda\\x4b\\xd9\\x94\\x4f\\x87\\x70\\x40\\x79\\x8b\\xb5\\x4a\\xbd\\x2d\\x76\\xcb\\xb1\\x8d\\xf4\\x29\\x7f\\x4c\\xe3\\x33\\x7f\\x64\\xd2\\x05\\x80\\xaa\\x64\\xbd\\xec\\xac\\x37\\x6a\\x6a\\x4f\\xf7\\x4d\\x01\\x44\\xb2\\xfe\\x74\\xce\\xf8\\x2d\\x50\\xa5\\xe6\\xbd\\xd7\\x99\\xe5\\x5f\\xf6\\x96\\x62\\xba\\xc5\\x37\\xad\\xcb\\x68\\x81\\x22\\x8c\\xb6\\x37\\x04\\x50\\x0c\\x14\\x3a\\x4f\\x4d\\x1d\\xb2\\x8d\\x45\\x56\\xbe\\xe6\\x04\\xa3\\x99\\xff\\xd2\\x06\\x54\\x65\\x97\\xde\\xe9\\x22\\x52\\x54\\x7f\\x6c\\x65\\x7f\\x36\\x84\\x1a\\x87\\xd5\\x65\\xf6\\x55\\x27\\x16\\xc2\\x5a\\x21\\x15\\x14\\x77\\xbe\\xe9\\xef\\x96\\x18\\x55\\xfb\\x1a\\xf2\\xda\\x80\\x68\\xf2\\x8c\\xe9\\xff\\x70\\xd5\\x25\\x2c\\x7a\\x63\\xa2\\xe1\\x4d\\xed\\x6b\\x89\\x77\\xb1\\xd7\\x69\\x1a\\x77\\xed\\x2e\\x57\\xd2\\x2f\\xf2\\xe1\\xfc\\x4c\\xdb\\xce\\xb5\\xe8\\x05\\x85\\x8d\\x90\\x38\\x96\\xea\\x67\\x07\\xe4\\x8b\\x34\\x5f\\x60\\xe2\\x81\\x8b\\x2f\\xce\\xc4\\xdb\\xa4\\x8c\\xae\\xa9\\xef\\xa3\\x82\\x79\\xfb\\x83\\xd5\\xb0\\xf4\\x6a\\x45\\xe4\\x2c\\x41\\x76\\x5d\\x01\\x71\\xba\\xac\\xd8\\xd6\\xdd\\xa7\\x99\\x13\\x14\\xb3\\x4e\\x15\\xfd\\x36\\x12\\x7c\\x46\\x7d\\x1d\\xe0\\x1c\\x01\\xa3\\xa7\\x8a\\x8c\\x1b\\x10\\x3b\\xee\\x17\\xa7\\xa0\\xb7\\xac\\x55\\x76\\xfd\\xc2\\x26\\xdd\\x24\\x59\\x77\\x31\\x46\\xcf\\x38\\x26\\x14\\x17\\xca\\x19\\x13\\x5d\\xbd\\xa9\\xbd\\xbe\\x54\\xcd\\x17\\xaa\\x7d\\xdd\\x38\\xfd\\xca\\xc2\\xab\\xa3\\x96\\xb3\\x65\\xce\\xae\\x98\\x91\\x9f\\x6c\\x51\\x77\\xfc\\x58\\x3f\\x5b\\xee\\x3f\\x48\\x70\\x49\\x14\\x30\\x6a\\xa1\\x9e\\xe9\\x0e\\x3f\\xd0\\xde\\x55\\x91\\xc6\\x69\\xff\\x35\\xab\\x16\\xfe\\xf3\\x8d\\xee\\x18\\x7b\\xae\\x1e\\x5a\\xaa\\x56\\x6d\\xf1\\x05\\x44\\xb7\\xd6\\xd4\\xeb\\x00\\xda\\x7e\\xbe\\xb4\\xec\\xdc\\xc4\\xd8\\xe3\\x2b\\x49\\xcb\\xbd\\xc6\\xe6\\x66\\x40\\xbd\\xb0\\xf7\\x2e\\x05\\x91\\x8a\\x05\\xc3\\x5d\\x9b\\xff\\x7e\\x0e\\x88\\xf2\\x41\\xd7\\xc6\\xc8\\xcb\\x2f\\xed\\xcc\\xdf\\x65\\x56\\x0a\\xf0\\xe7\\x83\\x3e\\xfe\\x34\\xaf\\x79\\x0d\\xb6\\x31\\x89\\x02\\x2c\\xfd\\x71\\xfc\\x8a\\xcf\\x88\\x86\\x01\\x27\\xbd\\x4f\\xbf\\x02\\x6b\\xcb\\xe3\\x60\\xe3\\x3a\\x89\\x95\\xe6\\x36\\xd0\\x3b\\xb8\\x6d\\xfd\\x01\\x98\\xad\\xa9\\x59\\x34\\x2d\\x8e\\x9c\\x9e\\xd9\\x3e\\x23\\x29\\x7d\\xa9\\x8d\\x66\\xa0\\xd4\\xfc\\x96\\x51\\x62\\x73\\x3b\\xc8\\x65\\x41\\xb9\\x5a\\x6c\\x90\\x97\\xcb\\x55\\xa9\\x73\\xc6\\xfa\\xc1\\x94\\xe8\\xf8\\xa1\\x64\\x27\\x4c\\x47\\x9c\\x51\\x0e\\x62\\xd8\\xa0\\x35\\xeb\\x75\\x11\\x81\\xb5\\x02\\xaf\\xb6\\x14\\xd8\\xc4\\x46\\x7b\\x54\\x45\\xc2\\x68\\xdc\\x3d\\xd0\\xab\\xbd\\x57\\x70\\x04\\xc0\\xbc\\x47\\xb1\\x5f\\xcb\\x80\\x1b\\x79\\x35\\x97\\x57\\xb5\\xea\\x89\\xcf\\x8c\\xf7\\x7f\\xc6\\xd1\\x60\\xe6\\xcd\\x73\\xc4\"},\n{{0xd5,0xe3,0xa4,0x06,0x71,0xbd,0x45,0xf0,0x88,0x42,0xdd,0xc7,0x8a,0xbe,0x57,0xde,0x3b,0x9c,0xe5,0x64,0x6b,0x73,0x0d,0x2e,0x59,0xfe,0xcf,0x5a,0x7d,0xf8,0x0f,0x40,},{0x41,0x6c,0x37,0xae,0x1a,0xd1,0x5b,0x63,0x2b,0x0e,0xa4,0x39,0x32,0xc1,0x76,0x37,0x28,0x2c,0xd9,0x1d,0x59,0x79,0x55,0x2e,0x5e,0xeb,0xb9,0x9a,0x41,0x9d,0x5c,0x97,},{0x63,0xde,0x6a,0x98,0x11,0x42,0x36,0x5a,0x3e,0x59,0x26,0x31,0xc8,0x27,0x72,0x37,0x80,0x97,0x39,0xd1,0xc9,0x8f,0x5a,0x1c,0xb2,0xcc,0xcd,0x34,0x06,0x7d,0x1c,0xa5,0xdc,0x8f,0x2f,0xc6,0x3b,0x8a,0xe1,0xa6,0x89,0xdc,0xaa,0x29,0x1b,0xa6,0xb6,0x9b,0x1a,0x67,0x95,0xc5,0x79,0xa5,0xdb,0x6d,0xcc,0xee,0x73,0xf6,0xa4,0x20,0xac,0x0a,},\"\\x09\\xfe\\x6f\\xfa\\x8b\\xf0\\x94\\x2a\\x64\\x92\\x13\\x57\\x65\\x9d\\xbc\\x6e\\x4f\\x8b\\x63\\xca\\x3b\\x9e\\xa4\\x75\\xea\\x39\\xd7\\x92\\x52\\x90\\xa1\\x48\\xd8\\x7b\\xb1\\x55\\x74\\x1d\\xfa\\x28\\xae\\x1b\\xea\\xdc\\x1f\\x3e\\x1a\\xb7\\x67\\x37\\xeb\\x5d\\x5d\\xda\\xde\\xd0\\xbb\\x38\\x2d\\x7e\\x11\\xea\\x81\\xa5\\xe7\\x80\\x16\\x12\\x69\\x62\\x60\\xba\\x3b\\xd0\\x9c\\x80\\xb6\\x23\\xf6\\x36\\x38\\x0a\\xa0\\x20\\x8f\\xee\\x0a\\xff\\x70\\x81\\x2d\\x53\\x07\\xb2\\x71\\x83\\x83\\x23\\x43\\xde\\xba\\xa3\\x60\\x5d\\xda\\xd1\\x7d\\xdd\\x70\\xd6\\x11\\x40\\x0d\\xdd\\x10\\xd6\\x38\\xaa\\x3d\\x6c\\x68\\xa2\\x8c\\xf0\\xe9\\x7c\\x1d\\xed\\xf6\\xcc\\xd9\\xc7\\x31\\xa8\\x4f\\xf0\\x40\\x5a\\x3a\\x22\\xdc\\xba\\x00\\xab\\x44\\xd5\\xb2\\x18\\x44\\xf1\\x4d\\x13\\x74\\xac\\x0c\\xb1\\xe5\\x8d\\xf4\\xa9\\x0c\\x41\\x25\\x63\\xcf\\xe6\\x9d\\x88\\x2d\\x35\\x0f\\x6a\\xaf\\xbf\\xa6\\x4f\\xa2\\xf9\\xff\\x82\\x60\\x32\\x32\\x67\\x80\\xae\\xcf\\x93\\x05\\xd8\\x21\\x7c\\x17\\x9d\\xbb\\x63\\xc1\\x51\\x54\\x12\\x32\\xeb\\x65\\x97\\x92\\x65\\xd8\\x76\\xc4\\xbc\\x43\\x05\\xc0\\x2f\\x40\\xbc\\x1d\\x05\\xdb\\xaf\\x7d\\xcf\\x4f\\x7d\\xd9\\x23\\x2c\\x17\\xee\\x0f\\x7a\\x05\\x55\\xf5\\x04\\xba\\x37\\x74\\x54\\x84\\x88\\x93\\x3e\\x75\\x71\\xeb\\x3f\\x71\\xc4\\xcb\\xb2\\x0c\\xc4\\xe4\\xa7\\x32\\x2f\\x35\\xac\\x0e\\x79\\xa5\\x91\\x55\\x79\\x8d\\xd0\\xf5\\xb3\\xc1\\x13\\x19\\xb7\\xd8\\xf3\\xea\\x79\\xee\\x3a\\xcc\\x68\\xbd\\xb9\\xf3\\x7c\\x7d\\x4c\\x8f\\x9c\\xab\\xa1\\xeb\\xf8\\xeb\\x7f\\x43\\xb4\\x62\\xae\\xfd\\x38\\xe8\\xc0\\xd4\\xc6\\x39\\x79\\xcf\\x66\\x31\\xde\\xc3\\x1a\\xb5\\xce\\xd3\\x93\\x7e\\xf5\\xb2\\x36\\x2c\\xb0\\x9c\\x71\\xdd\\x09\\x66\\x57\\x70\\x0f\\xd9\\x6b\\xda\\x55\\x5e\\x22\\x71\\x2f\\x71\\xae\\xc1\\x1a\\xe5\\xe9\\x1b\\x24\\xbd\\x16\\x49\\x49\\x8b\\x8d\\x9f\\x86\\x7f\\xb6\\xc4\\x1e\\x07\\x60\\x80\\xf7\\x40\\xd0\\x74\\xc2\\xa2\\x55\\x72\\xd3\\x4e\\x66\\x6b\\x63\\x67\\xbf\\x7c\\xbb\\x3d\\xd4\\x2a\\x23\\x82\\xdc\\x19\\x73\\x96\\x12\\x68\\x60\\x53\\x96\\x81\\x0a\\x45\\x6a\\xc0\\x81\\xbb\\xfd\\x3a\\x54\\xb4\\x48\\x81\\xfc\\xfc\\x45\\xb4\\x24\\x5e\\xe7\\x24\\x65\\xb4\\x87\\xd0\\x7f\\x2e\\xf3\\xf7\\x4a\\xdd\\x71\\xcd\\xfd\\xd1\\x6e\\x92\\xfe\\x25\\x7d\\x33\\x46\\x45\\xb0\\xa9\\xbc\\x7d\\x07\\x26\\x13\\xfb\\x9c\\x0c\\xde\\xa9\\xdb\\x4c\\x72\\xbc\\x87\\x10\\x9e\\x10\\x2d\\x7c\\xba\\xf3\\x66\\xec\\xd6\\x7f\\xbe\\x3d\\xed\\x32\\x74\\x73\\x07\\xa7\\xae\\xef\\x61\\x73\\x5a\\xd3\\xaa\\x5c\\xe9\\x5d\\xee\\xcc\\x16\\xa1\\x6e\\xb2\\xa0\\xbc\\xc7\\xad\\xc0\\xa1\\x1d\\x88\\x80\\x32\\x26\\x0e\\x7c\\x7e\\xc9\\xe5\\x4f\\x5a\\x25\\x31\\x70\\x2a\\x7e\\x5d\\xfb\\x87\\xc3\\x6c\\xe3\\x13\\xa3\\x14\\x75\\x88\\xae\\xf9\\x62\\xc7\\x2f\\xa9\\x66\\xd2\\x41\\x63\\x7c\\x38\\x8b\\x83\\xdd\\xec\\x93\\x43\\xbb\\x86\\x34\\x3e\\x92\\x0b\\x12\\xce\\x1c\\xc9\\x15\\xc8\\x3b\\x31\\xe9\\x98\\x62\\x69\\x06\\x74\\xea\\x49\\x35\\xa4\\x88\\x09\\xd4\\xd2\\x79\\x05\\x41\\x37\\x54\\x63\\x92\\xad\\x9f\\x08\\xe7\\xb8\\xde\\x61\\xae\\x73\\xe8\\x1e\\x48\\x3d\\x3c\\x63\\xb5\\xae\\x73\\x4e\\x18\\xe7\\xa2\\x2f\\xee\\xd1\\x23\\x3d\\x0c\\xa6\\x33\\x55\\xf3\\xa4\\x8a\\x33\\x06\\x7e\\x1a\\x0e\\x19\\x71\\xf3\\x6a\\xa9\\x29\\xfe\\x06\\x13\\xc2\\x1c\\x4a\\xef\\xf9\\x41\\x84\\x29\\xc3\\xb0\\x72\\xa5\\x98\\x49\\x59\\x28\\x7a\\x5e\\x5c\\x40\\xbe\\x02\\xbd\\x22\\xb9\\xa7\\x9c\\x7f\\x3f\\x53\\x59\\xd2\\xbb\\xe4\\x93\\xf5\\x56\\xda\\xcb\\xb0\\xcb\\x4c\\x29\\x3c\\x7d\\x94\\x12\\x65\\xe7\\x77\\x39\\x2d\\x14\\x8d\\x68\\xc0\\x7a\\x13\\xc8\\xde\\xc8\\xe5\\xd1\\xe1\\xc7\\xf0\\x41\\xe8\\x98\\x3e\\xdd\\xda\\xa4\\x64\\x9d\\xac\\x15\\x72\\xa3\\x9a\\xe4\\xc6\\x48\\x0c\\xa5\\x50\\xe2\\xe4\\x46\\x2d\\xcc\\x84\\x9c\\x1b\\xab\\x78\\x1d\\x28\\xa3\\x55\\x2b\\x2d\\x98\\xe0\\x2e\\x15\\x18\\xe6\\x55\\x53\\x40\\xfb\\x76\\xd6\\x8d\\xb5\\x89\\x16\\xd5\\x56\\xa7\\xb8\\x15\\x63\\xab\\xa8\\x1d\\x9a\\x57\\xae\\x50\\xf0\\x4c\\xf5\\x68\\x60\\x21\\x84\\x7d\\x79\\xb6\\xbb\\x3d\\xa8\\x01\\x7a\\x60\\xb1\\xc3\\xbe\\xef\\xd4\\x8d\\x2b\\x3c\\xd3\\x9c\\x6f\\x53\\xc0\\x8b\\xcc\\x96\\x7d\\x93\\x06\\x9f\\x56\\x2b\\xb3\\x6e\\x0c\\x4f\\x4c\\xa6\\xbc\\xcc\\x5e\\x57\\xd3\\x59\\x03\\xcd\\x80\\x0a\\x61\\x78\\x5a\\x93\\x77\\x0e\\x37\\x7f\\x4f\\xe8\\xe9\\xf4\\xb6\\x66\\x80\\x98\\x49\\x68\\xf9\\x64\\x9e\\x10\\x5e\\x7a\\x11\\x9d\\x97\\x63\\x6f\\x3a\\x05\\xca\\xea\\xb1\\xd7\\xea\\x0b\\xc8\\x13\\x34\\xb4\\x2d\\x5c\\xc0\\x80\\x83\\x0e\\xc2\\x4d\\x36\\x9c\\xf8\\x67\\x3a\\x49\\x0d\\x59\\xeb\\x4c\\xb0\\x81\\x81\\xda\\x39\\xa4\\x6d\\x96\\x6e\\x23\\xfe\\xd8\\xd3\\x8a\\x5f\\xab\\xc7\\xe8\\x43\\xbc\\xfb\\x01\\x5a\\x44\\x74\\xbf\\xd4\\x6d\\x4a\\x43\\xff\\x4a\\x51\\xa9\\x56\\x76\\x61\\xe2\\x69\\x6d\\xb8\\x7c\\x37\\x58\\xd3\\xb5\\x4c\\xe7\\x84\\x6d\\x13\\x91\\xd7\\xf4\\x65\\x26\\xef\\x30\\x84\\x4d\\x49\\x32\\x00\\x18\\xd7\\x49\\xb5\\xd4\\xdf\\xd3\\x0d\\x38\\x0c\\x6e\\x57\\x3f\\xc4\\x14\\xd8\\xfe\\xfc\\x5d\\x71\\x04\\x70\\x75\\x6b\\xec\\x00\\xd8\\x8a\\xc4\\xaf\\xc9\\x25\\xd1\\xed\\xe3\\x7e\\xae\\xe6\\x00\\x4a\\x23\\xea\\x0e\\xf8\\xb6\\x0e\\x48\"},\n{{0x4e,0xd7,0x04,0x8a,0xa1,0x28,0x4d,0xbb,0xcc,0x24,0x89,0x38,0xb4,0x0c,0x35,0x74,0x21,0x93,0x59,0x7a,0xdd,0xaf,0xdd,0xe0,0x64,0x13,0xb8,0xd4,0xcc,0xfb,0xe1,0x37,},{0xbf,0x84,0x1f,0xe4,0x44,0xad,0xd1,0xf7,0xc3,0xea,0xcd,0xfd,0x07,0x84,0xb4,0xe8,0x55,0xd2,0x40,0x5f,0x40,0x21,0xcd,0x9d,0x82,0x66,0x07,0x1c,0x32,0xc8,0xa2,0x73,},{0x10,0x6a,0x9d,0xeb,0x23,0x27,0xf3,0x38,0xcc,0xb7,0x1b,0xcc,0x94,0xe2,0xfe,0x3d,0x2e,0x97,0x3c,0xe6,0xdd,0x8f,0xa7,0xba,0xca,0x80,0x8b,0x41,0x11,0x81,0x3e,0x3b,0xc3,0xb4,0xd8,0x8e,0xfa,0x6a,0x00,0xc4,0x71,0x0b,0xbf,0xe5,0x31,0x96,0xf9,0xab,0x3a,0x15,0x0b,0x16,0x54,0xb9,0x08,0xfe,0xac,0xf9,0xc1,0x3d,0xf2,0xd6,0x38,0x02,},\"\\xdc\\xff\\x95\\x87\\xd6\\x04\\x6c\\x11\\x32\\xbe\\x07\\xdf\\x26\\xdf\\x63\\x82\\xff\\x92\\xcf\\xc8\\xeb\\x53\\x45\\xc5\\x1d\\xd5\\x0d\\xd1\\x88\\xee\\x76\\x9f\\x10\\xa4\\xde\\x5e\\x88\\x83\\xd1\\x16\\x96\\x7b\\xea\\x97\\xd3\\xb3\\x2b\\xc8\\xae\\xbb\\x9f\\x01\\x3d\\x6d\\xf9\\x52\\xf2\\x51\\xc1\\xa3\\x12\\x34\\x6e\\x72\\xce\\xe1\\x35\\xa1\\xbf\\xd7\\x6b\\xf3\\x08\\x0a\\x35\\xc8\\x38\\xb4\\x4d\\x75\\x5f\\x26\\x3d\\x21\\x03\\x10\\xfa\\x8d\\x28\\xc4\\xca\\x52\\xf0\\x8c\\xac\\x5b\\x83\\xa8\\xa3\\xb1\\xdf\\xc4\\x6d\\x9b\\x75\\x2d\\x9f\\xc7\\x36\\x49\\xd0\\x0b\\xb9\\xee\\x99\\x26\\x50\\x63\\x9c\\x22\\x5d\\xea\\xc1\\xf3\\x9b\\x9e\\x80\\x36\\x89\\xd1\\x9e\\x6d\\x9f\\x8e\\xf4\\xf5\\x1f\\x1d\\x11\\x60\\x1f\\xac\\xf4\\x10\\xdb\\x64\\x8b\\xcc\\x82\\xbf\\x64\\x87\\x69\\xa7\\xdd\\x59\\xc6\\xe8\\xa2\\x37\\xdb\\x23\\x9d\\x3f\\x66\\x1d\\x78\\x52\\xc4\\x26\\xd3\\x94\\xa9\\x05\\x09\\x52\\x6a\\x85\\x9b\\x47\\x64\\x59\\xde\\xdb\\xe6\\xd8\\x99\\x36\\xc0\\xf3\\x98\\x99\\x95\\x51\\x1d\\x4a\\x57\\x6e\\x54\\x2c\\xce\\x5e\\x0d\\xd7\\xee\\xef\\xeb\\x03\\x26\\xd3\\x3f\\x25\\xc2\\x2a\\xb6\\xe7\\x69\\x06\\x33\\xf4\\xc9\\xed\\x2a\\xad\\xf1\\xd2\\x4f\\x94\\x86\\x21\\x23\\xa4\\x64\\x04\\x2c\\xea\\x19\\x3a\\x2f\\x04\\x79\\xd3\\x9b\\xcd\\x1b\\xbd\\x1c\\x7a\\x0c\\xa7\\xe6\\x25\\x8e\\xd3\\x73\\x23\\x72\\xf5\\x4e\\x0e\\xd5\\xe3\\xf1\\xe2\\xe4\\xd4\\xa0\\x4c\\x51\\x0b\\xee\\x08\\xd1\\xc6\\xd5\\x70\\xcf\\xd6\\x3a\\xbf\\x14\\xb4\\xee\\xf0\\xb9\\x6f\\x39\\xca\\x29\\xe4\\x3c\\x52\\xf2\\xca\\x3d\\xfd\\x46\\x0f\\x66\\xe3\\x02\\x35\\xb1\\x59\\xaa\\xef\\x2c\\xc1\\x56\\x01\\x29\\x69\\xfd\\x3d\\x15\\x99\\x78\\xd6\\xca\\xa0\\xa9\\x45\\x22\\x29\\x1f\\x79\\x89\\xd8\\xaf\\x10\\x83\\x19\\x96\\x13\\x7b\\x68\\xd9\\x7f\\xc1\\x7f\\x6a\\x9b\\xc2\\x84\\x5e\\xf3\\xdd\\x47\\xcb\\xc3\\x86\\xe8\\x97\\x7a\\x86\\x54\\x36\\x34\\x12\\xda\\xc3\\xac\\x51\\xc6\\x38\\x17\\xb7\\xc0\\x51\\x87\\x8d\\xcf\\x45\\x8a\\xb3\\x63\\x0d\\xd7\\xae\\xf6\\x8d\\x27\\x0f\\x8d\\xa7\\x88\\x0a\\x46\\x7b\\x33\\x04\\xf5\\xba\\xed\\xfb\\xa9\\x17\\x3e\\x7e\\xfd\\x00\\x7c\\x41\\x2d\\x17\\x20\\x9c\\x56\\xd2\\x39\\x68\\xe3\\x40\\xb8\\xa0\\xed\\xb4\\x1b\\x7e\\x2a\\x40\\x88\\xbe\\xc0\\x1b\\x53\\x2d\\xf8\\x9b\\x52\\x15\\x81\\x31\\x31\\x10\\x7b\\x7b\\x47\\x4f\\x03\\xc2\\xe4\\x7d\\x43\\x17\\xf1\\x1c\\x4f\\x51\\x60\\x90\\x43\\x04\\x99\\x7e\\x76\\xa1\\x21\\xa9\\x56\\x02\\x35\\x20\\x8d\\x79\\xb2\\xda\\xb4\\xf7\\xe1\\x96\\x79\\x32\\x02\\xc0\\x90\\x2c\\xe9\\xc4\\xbf\\xc1\\x0b\\x8f\\xe3\\x97\\xe3\\x5c\\xa0\\x25\\x64\\x54\\x66\\x2a\\xe8\\x78\\xef\\xb0\\xa0\\xa6\\x06\\xfa\\xc0\\xa9\\x52\\xc9\\xf6\\xba\\xae\\xb2\\xd4\\x5b\\x25\\x8c\\x61\\x75\\x59\\xc0\\xed\\x25\\x28\\xa8\\x8b\\x49\\xaa\\x44\\xee\\x43\\x03\\x5b\\x0d\\x79\\x3a\\xad\\x39\\x53\\xc1\\xa5\\xa3\\x46\\x38\\x66\\xbc\\x81\\x5b\\x1f\\xfc\\xe2\\xff\\x2b\\x65\\xe0\\xfd\\x47\\xdb\\xc1\\x5f\\x4e\\x7a\\x06\\xbf\\xab\\xc2\\x90\\xfc\\x62\\x09\\x0b\\xf7\\xd9\\x48\\x53\\xf7\\x7c\\x04\\x44\\xa9\\xb9\\x0e\\xfe\\x77\\xd1\\xce\\xb4\\xbd\\x39\\xe2\\x03\\xbc\\x88\\x40\\x11\\x62\\x4e\\x68\\x46\\xe2\\xa3\\x71\\x05\\x8d\\xab\\xa6\\x3c\\x23\\xf8\\x6c\\x42\\xc3\\xe3\\x1e\\xaa\\x4b\\xd7\\xd7\\xa4\\x2a\\xf2\\xd5\\x24\\x89\\x6e\\x31\\xba\\xa3\\xe2\\x07\\x63\\xf8\\x5d\\xcf\\xd5\\x27\\x75\\xf2\\x80\\x72\\xd8\\x9f\\x0b\\xd4\\xfa\\xe3\\x0d\\x0b\\x13\\x7e\\xe3\\x7a\\xb0\\x63\\xba\\x06\\xfe\\x9d\\x4e\\xc6\\x2a\\xbb\\x2f\\xea\\x0f\\x81\\xb8\\xcb\\xee\\xfc\\x03\\x00\\x80\\xb8\\x02\\x6a\\x58\\xfd\\x18\\x67\\xf6\\x6b\\xe1\\x15\\x4e\\x65\\xbf\\xea\\x7d\\xce\\xc5\\x5f\\xe3\\x2d\\x51\\xfb\\x0b\\x4a\\x8a\\x5a\\x8a\\x04\\x42\\x63\\x94\\x3d\\x6a\\xc8\\x01\\x1c\\x6e\\x67\\x01\\xbe\\xec\\x3a\\x88\\x65\\x58\\x40\\xc4\\x89\\x2d\\x45\\x0d\\x31\\x2b\\x76\\x52\\xd2\\x51\\x47\\x69\\xf2\\x3b\\xfd\\x6e\\x70\\x46\\x46\\x7d\\xf2\\x9a\\x28\\x7f\\xf3\\xc4\\xc9\\xd0\\xe6\\x4e\\x6d\\x9e\\x4e\\xde\\xe1\\xb9\\x35\\xd0\\x76\\x81\\xd4\\x70\\x04\\x35\\x28\\x86\\xe8\\x47\\xb0\\xc6\\xd5\\x76\\x2f\\xd4\\x5a\\x81\\xa5\\x3c\\xce\\x94\\x76\\xc8\\x87\\x22\\x1a\\xea\\x6c\\x0c\\x82\\xbb\\xf3\\xb2\\x97\\x93\\x2e\\x5b\\x11\\xe5\\x38\\xa3\\x24\\x5d\\x63\\xd7\\xb7\\xb0\\x91\\xdf\\xa1\\xd7\\xb9\\xa0\\xe2\\xdb\\x66\\x98\\xa4\\xc5\\xe9\\xfe\\x93\\x16\\x62\\xd7\\xc6\\xec\\x6d\\x9d\\x5b\\x92\\xbc\\x7e\\x04\\x15\\x55\\xdf\\x4d\\xf0\\xca\\x11\\xca\\xbc\\x48\\x5f\\x9c\\x55\\x61\\x38\\xa7\\x17\\x45\\xf0\\x3b\\x97\\x83\\xbb\\x20\\x0b\\x72\\xd2\\x33\\x69\\x7e\\x8b\\xcf\\x6b\\x41\\x17\\xee\\x67\\x63\\xd7\\x92\\xd7\\x42\\x22\\x64\\x85\\x2f\\x4f\\x30\\xf8\\xd1\\x89\\x0e\\x2e\\xa0\\x80\\x98\\x04\\x0f\\x7f\\x28\\x8e\\x4a\\xbe\\x90\\xb6\\x3c\\xab\\x2c\\x14\\x37\\x30\\x60\\x84\\x0e\\xf8\\x27\\xec\\xc8\\x46\\xcd\\x56\\x0e\\x90\\xa2\\x0b\\x83\\x05\\xf4\\x63\\xc3\\x6e\\xa0\\x38\\x84\\xa5\\xdf\\x4c\\x25\\xf1\\xba\\x9e\\xa1\\x25\\x95\\x2d\\xc0\\x91\\xb9\\x75\\x16\\xde\\x1d\\x28\\x7c\\x0e\\x2b\\xf5\\x29\\x77\\x5b\\xa6\\xd2\\xf8\\xed\\xe0\\x3c\\xb4\\x2c\\x1e\\x40\\x0e\\xc8\\x04\\xa9\\xdf\\x08\\xe4\\x6f\\x44\\xb5\\x06\\x63\\x46\\xe3\\xf7\\xc7\\xa1\\xa8\"},\n{{0xc7,0xec,0xa8,0x3e,0x94,0x85,0x76,0xbd,0x9f,0x27,0x8f,0xd7,0xb8,0x28,0x00,0xa4,0x1d,0x92,0xda,0x9b,0x72,0xd5,0xa1,0xcc,0xdb,0xbc,0x65,0x58,0x10,0x52,0x56,0x8b,},{0x07,0x6b,0x83,0x52,0xdc,0xa8,0x03,0x1e,0x85,0x3c,0x8d,0x90,0x99,0xc2,0xef,0x57,0x93,0x37,0xcc,0x7b,0x2b,0x4c,0x75,0xd1,0xa0,0x63,0xea,0x3e,0xc7,0x25,0xb7,0xfd,},{0x86,0x99,0x6a,0x1b,0x8e,0x49,0x5d,0x42,0x52,0x77,0xe9,0x7c,0xc0,0x83,0x05,0x49,0x34,0x9b,0xc2,0xb6,0xf3,0xdc,0xda,0x60,0xf3,0xb7,0xd3,0x50,0x1b,0x8b,0x50,0xb5,0xb4,0x58,0xcd,0xa5,0x8b,0x43,0x6e,0x23,0xc0,0x2c,0xd4,0xa2,0x2b,0x23,0x48,0x13,0xaa,0x9b,0xcc,0x3c,0x61,0xf9,0x83,0xc0,0xb7,0xef,0xec,0xa0,0xf1,0xbe,0xc2,0x0d,},\"\\x8d\\x8c\\xef\\xd6\\x73\\x85\\x5c\\xcd\\x8e\\xb8\\x53\\x4c\\x31\\x2d\\x33\\x80\\x05\\xbb\\x05\\xf5\\xb9\\x50\\x7d\\x58\\x85\\x9e\\x1e\\x95\\x3b\\x0a\\x4d\\x91\\x3b\\xe7\\x59\\xd8\\xed\\xfa\\x92\\x89\\x8c\\x6e\\x70\\xa5\\x3f\\x81\\x95\\x4f\\xc3\\x44\\xb4\\xad\\x62\\x46\\xb0\\x10\\x94\\x81\\xba\\x6f\\x73\\xae\\x63\\x31\\xab\\xf2\\xdf\\x10\\x8e\\xb2\\xe8\\x5c\\xeb\\x08\\x7c\\x1f\\x6f\\xcf\\xc9\\xde\\x2c\\x1f\\x13\\x9b\\xa1\\x77\\x1b\\x72\\x68\\x03\\x02\\xd8\\x11\\xcc\\xd0\\xcc\\xd4\\xe0\\xc7\\xfe\\xb0\\x13\\x2e\\xb2\\x0b\\x33\\x4e\\x5a\\xab\\xe5\\xf6\\x11\\x9f\\xd8\\x94\\x7d\\x9e\\x88\\x52\\xe1\\xeb\\x1b\\x74\\x10\\x7e\\x17\\x41\\x00\\xe3\\xe6\\xdf\\x0c\\x3a\\x68\\x13\\x0c\\xa6\\x30\\x94\\x02\\x59\\x4b\\xb5\\x0c\\x1c\\x8e\\x27\\x74\\xf1\\x32\\x14\\x49\\x6a\\x7b\\x1f\\x34\\x83\\x85\\xea\\xbf\\xbc\\xcb\\xac\\x16\\x5a\\x5a\\x2e\\x7d\\x9d\\xea\\x5f\\xfd\\x58\\xb0\\xbd\\x88\\xb4\\x9c\\xb3\\x31\\xec\\xb7\\xf4\\xe9\\xd6\\xba\\xe9\\x79\\x1a\\xd7\\x88\\xe6\\xab\\x89\\x26\\xc1\\xcc\\x16\\x15\\xde\\xaf\\x4c\\xc4\\x00\\xc7\\x7a\\x31\\x61\\x97\\xbc\\xa1\\x90\\x49\\x95\\xe1\\x36\\x5d\\x1b\\x97\\x02\\x64\\x83\\x76\\x11\\x69\\x30\\xf6\\xf9\\x11\\x66\\xe6\\x14\\x86\\x29\\xe7\\x5b\\xe2\\xd0\\x68\\x95\\xf6\\xa8\\xd1\\x5d\\x5a\\x94\\xca\\x69\\xb7\\x12\\xf3\\x3b\\xcf\\x95\\xbe\\x0c\\x1b\\xe6\\x90\\x2b\\xb7\\x8b\\x8a\\x23\\x0d\\x7a\\x85\\x60\\xc4\\xd8\\x4e\\x23\\x89\\x55\\x2a\\x81\\x57\\x1a\\xa6\\x65\\xc1\\x9c\\x2e\\x93\\xb0\\xd4\\x3e\\x8c\\x2c\\xbd\\x9e\\x88\\x5d\\x70\\x52\\x51\\x8b\\x77\\xc4\\x7e\\x84\\x1d\\x11\\x9d\\xc2\\x8b\\x65\\xa7\\x50\\x4f\\x66\\x42\\x71\\xf0\\x6c\\x7f\\xf3\\x93\\xf8\\x25\\xb1\\xe5\\x93\\x0d\\x02\\xb9\\xc7\\x00\\x35\\xe2\\x92\\x41\\x1c\\x4a\\xed\\xf6\\x60\\x47\\x00\\x69\\x70\\xe3\\x49\\xdf\\xca\\x7f\\xb4\\x1c\\x10\\xfd\\x53\\x7e\\x35\\x25\\x2e\\x10\\x9e\\x33\\x36\\xd7\\xa8\\x2a\\x14\\xde\\x5d\\x55\\x40\\xc6\\xfc\\x65\\x71\\xd5\\x77\\x4f\\x39\\xb7\\xc4\\x03\\xe7\\xb8\\x87\\x5e\\xc2\\x15\\x87\\x7e\\xfc\\x6c\\xc8\\xea\\x48\\xb1\\x86\\xb4\\x68\\x21\\xea\\x5e\\xf2\\xba\\x8b\\xac\\xd4\\x0d\\x79\\x7e\\x6a\\xdd\\x06\\x41\\x32\\x83\\x14\\x5b\\x60\\x46\\x2b\\x35\\x03\\xc5\\xb8\\x81\\xd7\\x9a\\x59\\x29\\x55\\xd1\\x8a\\xfa\\x08\\x96\\x9e\\x31\\x45\\x7f\\x5b\\x27\\xda\\xec\\x01\\x03\\x38\\xed\\x86\\x7f\\x30\\x08\\x78\\xfd\\x87\\xce\\x32\\x18\\x80\\xb8\\x60\\xa0\\xc6\\x42\\x84\\xca\\x2d\\xc1\\x5f\\x5e\\x53\\x10\\xe1\\x0e\\x6a\\x73\\xa7\\xea\\x65\\x0e\\xa9\\xd3\\x73\\x69\\x4d\\xa4\\xdd\\x42\\x9a\\xe7\\x41\\x2e\\xf9\\xb2\\x9c\\x83\\xb3\\xb0\\x68\\xc7\\x47\\x69\\xf4\\x31\\xce\\x06\\x15\\xf9\\xff\\x4f\\x82\\xba\\xac\\x47\\xb4\\xbc\\xe9\\x04\\x49\\xec\\x41\\xc2\\xa2\\xd5\\x73\\xd9\\x2b\\x92\\xe0\\x56\\x31\\x48\\x61\\x65\\xbc\\x71\\x0e\\xf5\\x84\\x0f\\x80\\xda\\xe9\\xf9\\xdd\\x5c\\xff\\xd4\\xeb\\xf5\\xd1\\x07\\x46\\x51\\x0c\\x5f\\xcb\\xfe\\x62\\xcb\\x97\\x03\\xc0\\xb1\\x54\\xc8\\x6f\\x10\\x81\\x66\\x72\\x49\\x76\\x70\\xa3\\xb0\\x15\\x0b\\xb4\\xe1\\xb0\\x3b\\x3b\\xd5\\x44\\xc1\\x2a\\x90\\xc3\\xed\\xcc\\xd7\\x90\\x0e\\xbb\\x5b\\x31\\xc9\\x11\\x17\\xcc\\x82\\x81\\xa3\\xc4\\xed\\x04\\x99\\x8e\\x99\\xae\\xd4\\x1b\\xb4\\x1f\\xce\\x99\\x90\\xa4\\x06\\x48\\x5b\\x14\\xdb\\xe3\\xbc\\x1a\\x5f\\xcf\\x77\\x19\\x50\\x79\\x90\\xda\\x3b\\x0b\\x3c\\x68\\xad\\x40\\xd8\\x95\\x0c\\x0d\\x49\\xce\\xd1\\x01\\x93\\x19\\xa3\\xf3\\x6a\\xff\\x6c\\xaf\\x75\\xd7\\xf9\\xa0\\x93\\x3d\\xd3\\xab\\xdd\\x76\\x92\\xa1\\x56\\x2f\\x06\\x13\\xfe\\x4a\\x27\\x8d\\x5c\\xe4\\xc8\\xda\\xfb\\xb5\\x5b\\x2e\\xc2\\xaf\\x2b\\x24\\xe8\\x39\\x6f\\x58\\x7b\\x17\\x0c\\x9c\\xa6\\x54\\x75\\x08\\xfa\\xcd\\xe7\\x34\\x90\\xdf\\xb0\\x1e\\xb6\\x65\\x7e\\x3f\\x4f\\x27\\x23\\x04\\xb7\\x0b\\xf0\\x47\\xa4\\x3a\\x2b\\x58\\xe5\\x56\\x8b\\xc5\\x2b\\x2c\\x8d\\x4c\\x03\\x21\\x9a\\x5a\\x8b\\xd3\\xdc\\x06\\x43\\x18\\x59\\x13\\xc0\\xaf\\x74\\x11\\xf8\\x1b\\x77\\xbe\\x2a\\x9b\\xfd\\x5c\\xb2\\x69\\x77\\x11\\x3d\\x26\\x58\\xa9\\x71\\x92\\xb4\\x1c\\xf6\\xc7\\x01\\x1b\\x0f\\xf6\\xa1\\x1c\\xbf\\xf3\\x50\\x55\\x46\\x32\\x2f\\x0b\\xef\\x60\\x97\\xe4\\x6b\\x36\\x49\\x2b\\x01\\x6a\\x45\\x62\\xe0\\x92\\xb6\\x7c\\x3f\\xcc\\xc7\\x78\\x0e\\xa2\\x74\\xd9\\x6d\\x59\\x58\\x49\\xf7\\xe2\\xa5\\x6d\\x79\\xed\\xcb\\x32\\xd7\\x84\\x04\\x9f\\xc1\\x32\\x4a\\x5b\\xee\\xfc\\x24\\x19\\x3a\\x66\\xe1\\xca\\xc4\\xa1\\x3a\\x81\\x1b\\x90\\x95\\x83\\xcc\\x91\\x0c\\xf0\\x8d\\x4b\\x10\\x4d\\xbd\\xb8\\xa6\\xf2\\xb2\\x1f\\xbc\\x1d\\xb1\\x17\\x5a\\x1a\\x23\\x56\\xa6\\x3d\\x3e\\xea\\x9d\\xbb\\x85\\x37\\xd2\\xc6\\x86\\x27\\x54\\x3d\\xf0\\xd1\\xf8\\xfd\\x8d\\x57\\xa1\\x8b\\x0d\\xbd\\x69\\xb9\\x20\\xcb\\x9b\\x28\\x6e\\x3c\\x07\\xae\\x44\\xae\\x2e\\x1b\\xee\\xc0\\x1c\\xee\\x6b\\xa9\\x88\\xb5\\xd1\\xaf\\xb9\\x97\\x90\\xb1\\xdd\\x91\\x06\\x55\\xc4\\x3d\\x7f\\x2a\\x3e\\xd3\\x75\\x4b\\xa4\\x65\\x16\\xd2\\x78\\x70\\x55\\x59\\xf5\\x74\\x16\\x22\\xa9\\xab\\xb5\\xc8\\xf2\\x3f\\xa9\\x76\\xa9\\xd1\\x46\\x94\\x8a\\xde\\x6b\\xa6\\x60\\x8a\\x35\\xe4\\xe0\\xd3\\x30\\xe8\\x2e\\x96\\xa2\\xbe\\x6c\\x78\\xad\\x0c\\xd4\\xd8\\x70\\x4e\\x57\\xce\\xa1\\x46\"},\n{{0x7b,0x46,0x9d,0xf9,0xc8,0xf7,0x84,0x89,0xab,0x47,0xcc,0x70,0xa8,0x85,0x03,0xf1,0xb8,0xf3,0xd9,0x29,0xc3,0x3f,0xea,0xb1,0xc5,0x03,0xf0,0x96,0x9a,0x3a,0xc3,0x7b,},{0xa8,0x14,0xc7,0xe3,0x73,0xd0,0x11,0x3b,0x90,0x62,0x4a,0x8a,0xb2,0xbc,0xa5,0xcf,0x53,0xbf,0x52,0x8e,0x39,0xfc,0x3d,0x36,0x7d,0xe1,0x54,0xb9,0x4b,0xb2,0x2f,0x1d,},{0x18,0xfa,0xf8,0x2d,0x08,0xe1,0x06,0x8e,0x9f,0x98,0x3d,0x81,0x2f,0x05,0xfd,0xb6,0x92,0x9d,0x27,0x23,0xdb,0x1f,0x77,0xc4,0x5a,0x74,0xbb,0x09,0xcf,0xf2,0x77,0x73,0xb5,0x4c,0xe8,0xf4,0x3b,0x30,0x15,0x41,0x91,0x12,0xe7,0x25,0xea,0x7a,0xcd,0xa4,0xb2,0x3b,0x81,0x20,0xe7,0xb0,0xcf,0x42,0x01,0x53,0xe5,0xb0,0x3d,0xd0,0x61,0x09,},\"\\x1c\\x0f\\xd7\\x45\\x0e\\x29\\x67\\x5c\\x93\\x09\\x16\\x38\\xc2\\xac\\x93\\x3c\\xa9\\x97\\x76\\x6e\\x38\\x0e\\xc3\\x3a\\x92\\xb8\\xa7\\xe1\\xa1\\xed\\x98\\x21\\xc7\\x5f\\xcc\\xb5\\xc5\\xf3\\x76\\x0e\\x76\\xd0\\xe8\\x81\\x03\\x11\\xdd\\xc6\\x24\\xea\\x87\\x42\\x13\\x1c\\x1c\\x43\\x08\\xf4\\x17\\x8e\\x04\\xd0\\x49\\x60\\x69\\x3d\\x84\\x6c\\x1f\\x51\\xd8\\x77\\x3b\\x6d\\xeb\\x34\\x43\\xd8\\x74\\xb9\\xe2\\xde\\x3b\\x77\\x78\\x51\\x85\\x51\\x8b\\x2e\\x9e\\xe7\\x36\\xc6\\x3a\\x39\\xc8\\x21\\x2c\\xa8\\x66\\x9e\\x16\\x1d\\x13\\x1b\\x1a\\xb2\\x26\\x4f\\xdd\\x72\\xdc\\x56\\x28\\xb1\\x1c\\x06\\xf2\\xaf\\x9f\\x07\\x89\\x04\\x7b\\xdd\\x4e\\xbb\\x5d\\x55\\x89\\x9f\\x74\\xdc\\x4e\\x12\\xe7\\x97\\x53\\x63\\xf6\\x3a\\x8d\\xa7\\x6b\\x55\\x85\\xc1\\x6b\\xb6\\xd5\\x5b\\x05\\xfa\\xde\\x87\\x13\\xd1\\x9c\\xad\\x1a\\x21\\x16\\x40\\x26\\x26\\x91\\xaa\\xc9\\xb4\\x37\\xa9\\xec\\xf8\\x9a\\x92\\x46\\xec\\xdb\\xa1\\xff\\x0b\\xea\\x78\\x49\\x4c\\xee\\x15\\x29\\x62\\x16\\xea\\x6b\\xb8\\x82\\x47\\x9d\\x24\\x37\\xc9\\x49\\x4a\\xc7\\xfa\\x4f\\x30\\x15\\xd1\\xd3\\x14\\x9d\\x55\\x64\\xd7\\xc1\\x1a\\x7e\\x7b\\x61\\x4f\\x7d\\x3e\\x9d\\x45\\x4f\\x0a\\x05\\xb0\\x40\\xa1\\xe0\\x6f\\xe7\\x83\\x7c\\x2a\\x9d\\xa2\\x79\\x4d\\x91\\x8b\\xff\\xa9\\xe6\\x1a\\x0c\\x3f\\x08\\x9f\\x6c\\x9f\\x7e\\xea\\xc5\\x86\\xe3\\x4b\\xf9\\x44\\x70\\xd9\\x13\\xda\\x41\\x37\\x1c\\xac\\xdf\\xc7\\xee\\x8b\\xd1\\x13\\x56\\x55\\x56\\x69\\x24\\xea\\xdf\\x09\\x6a\\xc0\\x30\\xa6\\x59\\x02\\xc1\\x03\\xb1\\x72\\xd1\\x2e\\x88\\xf0\\x53\\xfc\\x56\\xee\\x73\\xf3\\x18\\x70\\x81\\x70\\x83\\xaf\\xa8\\x02\\xf7\\x66\\x8b\\x81\\x5e\\xe7\\x90\\xf7\\xd4\\x0b\\x43\\x7a\\x2e\\x6d\\xb2\\xf0\\xfb\\x26\\x83\\x6b\\x4b\\x23\\x31\\xeb\\xa5\\x55\\x39\\x61\\x4c\\x0f\\xe1\\x72\\x40\\x24\\x2d\\xd3\\xaf\\x73\\x83\\xbc\\xff\\x7d\\x3f\\x47\\xd6\\x54\\x4b\\x08\\x72\\x0c\\x0a\\x52\\x44\\x1f\\x74\\x11\\x93\\x5d\\xd4\\xa9\\x52\\xd3\\x86\\x51\\xa8\\x00\\x05\\xfa\\x3e\\xb0\\xea\\xec\\xc7\\x35\\xd2\\x90\\xe8\\xbd\\x5e\\x31\\xb7\\x40\\x14\\x0e\\x13\\x6b\\x2c\\x00\\x25\\x23\\xd8\\xeb\\x2a\\x0a\\xb5\\xbd\\x68\\x70\\x02\\xb3\\xb9\\x26\\xf7\\x5e\\xb6\\x90\\xd1\\xda\\x73\\xad\\x23\\x58\\x92\\xf3\\xb2\\x3a\\x75\\x6b\\x60\\x5a\\x43\\x7c\\x00\\xe0\\x62\\x13\\x04\\xe8\\x10\\xf9\\x9e\\x31\\x4c\\x4d\\x63\\xe3\\x22\\xd9\\xb6\\x98\\x15\\xf3\\x82\\xff\\xa1\\xec\\x62\\x80\\xfc\\x0e\\x64\\x1c\\x8a\\x6f\\x6f\\x7f\\x61\\x98\\x5b\\xd3\\x56\\x7e\\x0f\\x44\\x0d\\xe9\\xf7\\x62\\x17\\x15\\xda\\xcd\\x07\\x42\\x8c\\x00\\x90\\x15\\x4d\\x59\\xce\\x6d\\xb4\\x01\\x69\\xc6\\x58\\xac\\x5b\\xf4\\x4b\\x67\\x67\\x1f\\xe1\\x9e\\x4b\\x5b\\x38\\xaa\\xd2\\xd3\\xd4\\xe1\\x90\\xa5\\x50\\xaa\\xd4\\x18\\x83\\x52\\xf7\\x98\\x1a\\x6d\\x88\\x06\\x25\\x02\\xdf\\x86\\x79\\x13\\x50\\x39\\x2d\\x41\\xce\\xfa\\xcb\\x24\\xe3\\x7b\\xc7\\x00\\xcb\\x02\\x91\\x90\\xc3\\xb1\\x82\\x14\\x77\\xe1\\x17\\xd5\\xa4\\x62\\xfb\\x3e\\x79\\x13\\x3b\\x10\\x73\\x59\\x89\\x66\\xf5\\x2b\\x63\\x25\\x6d\\xbf\\x32\\x6a\\xce\\x14\\xdb\\x0c\\x80\\x05\\x8c\\xf0\\x0d\\x68\\x9a\\x0a\\x58\\x11\\x1a\\xf1\\x69\\x27\\x44\\xbf\\x79\\x1b\\xcb\\xb4\\x27\\xa3\\x72\\x24\\x6e\\x95\\x01\\xa8\\x5c\\xd5\\x20\\xc6\\x1a\\x1e\\x59\\xee\\x18\\x0e\\x8c\\x97\\x19\\x2f\\x60\\xfa\\x5d\\x3a\\xb0\\x5d\\xf8\\xd8\\x55\\x1c\\x1a\\xc6\\xca\\x0a\\x9a\\x01\\x2f\\xfe\\xce\\xb3\\xc1\\xf5\\x21\\x41\\x1e\\xdb\\x65\\x09\\xbc\\x27\\x8a\\x65\\x1e\\x12\\x9e\\x96\\xb0\\xad\\xc7\\xae\\xd7\\x07\\x22\\x1c\\xae\\xac\\x22\\x98\\x84\\x41\\x3d\\xaa\\x10\\x59\\x5d\\x22\\xd1\\xdb\\x70\\x82\\x12\\x5f\\x4f\\x96\\x95\\x00\\xa1\\xd4\\x8d\\xac\\xda\\xe8\\x0f\\x40\\x29\\xc1\\x63\\xdc\\xd7\\x9d\\xdc\\x64\\x68\\xfc\\xda\\x16\\x37\\xb8\\x7d\\xdc\\xf2\\xa3\\xd9\\xb4\\xd2\\x99\\xa0\\xe5\\x39\\x4d\\xf9\\x0e\\xd0\\x3b\\x62\\x13\\x7b\\xa6\\x7b\\x9f\\xea\\x8a\\xe1\\xf0\\xd2\\x2f\\x91\\xc6\\x3a\\x24\\xb5\\x93\\x4f\\x74\\xc2\\x65\\xc4\\x3f\\x1b\\x92\\x3d\\xb9\\x80\\xad\\xfc\\xee\\x83\\x13\\xda\\x52\\x01\\x76\\x73\\x0e\\xf9\\x73\\x6b\\x27\\xe6\\xba\\x32\\xd1\\x7e\\xa6\\x9d\\xca\\xc6\\xf4\\xa0\\x16\\xed\\xfe\\x2d\\xb5\\xa5\\xbb\\x3b\\x64\\x93\\x2f\\x70\\x11\\xf1\\xc4\\x53\\xbb\\xe8\\x8b\\xba\\xc8\\xc7\\x03\\x5f\\x93\\xfe\\x39\\xb5\\x81\\xfc\\xaa\\x7a\\xaf\\x08\\x2f\\xbe\\xd0\\x04\\xfd\\x1f\\xd5\\xa4\\xe2\\xd9\\xc1\\x97\\x16\\x60\\x4b\\x19\\xce\\x19\\x9e\\x21\\x69\\xa7\\xbe\\x51\\x8d\\x5f\\xad\\xd2\\xac\\x31\\xb9\\x54\\x78\\x08\\x2a\\xc9\\x13\\x06\\x00\\x8d\\xe4\\xec\\x0e\\xf4\\xc9\\xf9\\xd6\\xf9\\x6d\\x2f\\x66\\xd6\\x2f\\xaf\\xc2\\x19\\x40\\x82\\x80\\x8a\\xf0\\xd6\\x7b\\x9f\\xba\\x0d\\x18\\x9b\\x05\\x5f\\x06\\x1c\\xca\\xc2\\x4b\\x27\\x61\\x0b\\xfb\\xd5\\xa2\\x23\\x2d\\xd6\\xf3\\xc8\\x90\\xa9\\xb1\\x26\\x64\\x71\\xb3\\x22\\xe9\\xe1\\xbf\\x97\\x75\\x7b\\xef\\x72\\xab\\xce\\xe9\\x3b\\x05\\x1f\\xc9\\x23\\xcf\\xd4\\xe7\\x23\\xbe\\x3e\\x17\\x14\\x3f\\x38\\xee\\xbb\\x90\\x0b\\x5b\\xbc\\xf7\\x30\\x47\\x32\\xb9\\xc0\\xa1\\xc5\\xfc\\x95\\x09\\xa6\\x93\\x58\\x0a\\xe7\\x3a\\x4c\\xdf\\xc5\\xfb\\xf2\\x0c\\xe8\\x1e\\xbc\\x83\\x5c\\x6c\\x90\\x9d\\x83\\x11\\x41\\xb1\\x94\\xf6\"},\n{{0xdf,0xec,0xde,0x7a,0x56,0xa1,0x8c,0x1f,0x19,0xd8,0x0a,0x19,0xa4,0xf1,0xda,0xdd,0xd0,0xbc,0xec,0xb0,0x1e,0xec,0xad,0x6d,0xfc,0xa0,0xf9,0x57,0xa9,0x14,0xed,0x7a,},{0xaf,0xba,0xa6,0xe7,0x3e,0x85,0xb0,0x2b,0x25,0xa4,0xb5,0x87,0xec,0xb8,0xc4,0xdf,0xb7,0x9a,0xa9,0x20,0x27,0x61,0xef,0xa8,0xd1,0xdf,0x2c,0xd0,0xaa,0x63,0x16,0xc4,},{0xb4,0xfd,0xe5,0x5b,0x91,0x6c,0xf6,0x00,0x68,0xf1,0x9b,0x25,0x35,0x1c,0x14,0x10,0xdc,0xf6,0x6b,0xfc,0x40,0xf9,0x6d,0x1b,0xa2,0x36,0x8b,0xc2,0xb9,0x11,0x5a,0xaa,0x5b,0x2d,0x1c,0xf0,0xe3,0xdf,0xca,0x02,0xac,0x90,0x2a,0x94,0x3e,0x24,0x89,0xa5,0x68,0x1b,0xba,0xfe,0xd3,0x9c,0x6e,0x33,0x21,0x1a,0x9c,0xb2,0xff,0x6e,0x54,0x09,},\"\\xae\\x6e\\x8f\\xf6\\x5c\\xcd\\xe6\\xf2\\x64\\x84\\x95\\x08\\x26\\xb4\\x36\\x23\\x05\\x8a\\x5e\\xfe\\x02\\x0b\\xb1\\x9b\\x7d\\x8b\\x4e\\x25\\x76\\x8b\\x69\\x27\\x34\\xfe\\x07\\xc9\\x13\\xb9\\xe8\\x81\\x26\\xbe\\xcb\\xf1\\x4a\\x0f\\xd0\\x20\\x5b\\x39\\xfc\\xc2\\xae\\xc3\\x73\\xf8\\xc1\\x84\\xc6\\xa9\\xbb\\xbb\\x84\\x44\\x9a\\x7c\\xa3\\xb9\\x20\\xad\\xa0\\x88\\x01\\xdf\\xc6\\x6f\\xf1\\x9a\\xeb\\x92\\xf2\\x55\\x53\\x99\\xa4\\x30\\x27\\x7a\\xe2\\x2d\\x23\\x75\\x4e\\xaa\\xce\\x3c\\x73\\x84\\x67\\x97\\x53\\x6d\\xd7\\x1a\\x56\\xf4\\xb5\\x84\\x2c\\x0f\\x41\\x0d\\x19\\x89\\xac\\xac\\x5d\\x80\\x5d\\x26\\x57\\x2c\\x0f\\x3a\\x64\\xdd\\x20\\x71\\x66\\x22\\x12\\xd5\\x2f\\xe9\\x9e\\x59\\xd9\\x66\\x04\\x77\\x77\\xf9\\x03\\x0f\\xa4\\xfd\\x2e\\xe7\\x4b\\x7a\\x7c\\x9f\\x7c\\x34\\xa6\\xdc\\x7e\\x03\\x59\\x3a\\x13\\xd6\\x4c\\xe6\\x24\\x53\\xee\\x3c\\xa3\\x0d\\x84\\x67\\x28\\x39\\xf1\\x9f\\x1c\\x15\\xd0\\xc4\\x5d\\x27\\x55\\xbb\\x39\\x4a\\xcf\\x4d\\xcb\\x7f\\x7f\\x07\\x11\\xac\\x40\\xea\\x46\\x61\\x2e\\xa3\\x7a\\x76\\x07\\xad\\x32\\xe8\\x18\\x26\\x5f\\xab\\x19\\x33\\xf5\\x09\\x4e\\x2d\\x03\\xbc\\xfa\\xa5\\xf6\\x16\\x67\\xf3\\xb3\\x7f\\x00\\xc4\\xc5\\x8d\\x9b\\x41\\xb9\\xaf\\x39\\x00\\x48\\x2b\\x0f\\xfb\\x4f\\xa4\\x37\\x6a\\xa0\\x40\\x00\\x9d\\xec\\x2f\\x45\\x25\\x79\\x9c\\xb0\\x05\\xf3\\x9d\\x74\\xcb\\x2d\\x8d\\xce\\x8c\\x20\\xc2\\xc3\\xf5\\x40\\x97\\x03\\xaf\\x15\\x6c\\xfb\\xa2\\x8a\\x9d\\x91\\x64\\x39\\xcb\\x29\\xf8\\x3d\\x24\\x29\\xce\\x62\\x23\\x51\\x9e\\x75\\xe1\\x5c\\x7c\\x7f\\xa2\\x15\\x11\\x9e\\x07\\x3f\\xa7\\x97\\x4d\\xb1\\x4f\\x7a\\x01\\x09\\x3f\\xaa\\x94\\xad\\x52\\xab\\x1e\\xad\\xce\\x1a\\x89\\x36\\x6c\\xa1\\x3a\\xdb\\x89\\x06\\x64\\x38\\xa2\\xbe\\xb7\\x30\\x34\\x17\\x0a\\xa4\\x2d\\x9c\\x2d\\xdb\\x97\\xc1\\x4a\\x17\\xc3\\x09\\x43\\x76\\xd2\\xa3\\xff\\xd8\\x09\\x5f\\xc4\\x05\\x3d\\x91\\xd1\\x6e\\x06\\xd2\\x76\\x93\\xa1\\x31\\x0f\\x01\\xa7\\x51\\x11\\xcf\\xed\\xa8\\x92\\xc3\\x97\\x2a\\x13\\x3a\\x09\\xad\\xda\\xa8\\xf7\\x41\\x45\\xf8\\x86\\x81\\xb6\\xd2\\x77\\x96\\x4b\\xfe\\x38\\x55\\x1a\\x2c\\x61\\x9f\\xa3\\xca\\xe3\\x94\\xac\\xb2\\x9c\\x94\\x10\\xb4\\x5e\\x10\\x1b\\x17\\x40\\xe8\\xb2\\xaa\\x6f\\xeb\\xc3\\xa4\\x5d\\xad\\xb9\\xd9\\x58\\x9d\\x59\\x7e\\x57\\xcd\\x94\\x7b\\x68\\x4c\\xc3\\x55\\x24\\x6c\\xe6\\xc3\\x26\\xdd\\x98\\xcf\\x92\\xb6\\xee\\xa3\\xba\\x5a\\xb0\\x37\\x00\\x62\\x26\\x36\\x32\\x4d\\xc1\\x22\\x2c\\xd7\\x48\\xfa\\x07\\xbf\\xd3\\x9a\\x1e\\x06\\x98\\x09\\xe5\\x67\\x14\\x1a\\x61\\x3e\\x2e\\x8b\\xe9\\xdd\\x39\\x8a\\xb6\\xbe\\xaa\\xfd\\x85\\xff\\x36\\x28\\xee\\x2a\\xa3\\x2d\\x0a\\x57\\xbb\\xac\\xf9\\x56\\x19\\x0b\\x5c\\x42\\x42\\xeb\\x5b\\x85\\x87\\xd2\\xfd\\xcb\\x07\\x41\\xb9\\x41\\x6a\\x05\\xf5\\xfe\\xcb\\x1f\\xb2\\xd6\\x47\\x88\\xdc\\xe7\\x83\\xc1\\xf6\\x3e\\x60\\x64\\x1f\\xce\\x5e\\x1d\\x2b\\x18\\xa9\\x50\\x0c\\xd6\\xa1\\xfd\\x33\\x5c\\xc1\\xdb\\x46\\xef\\x04\\x75\\x2b\\x2d\\x22\\x07\\x2e\\x6d\\xfc\\xfc\\xfa\\x56\\x9b\\xb2\\x5e\\x45\\x7a\\xfe\\xb6\\x3a\\x4f\\xbe\\xdc\\x29\\x3a\\xd9\\xd1\\xab\\xa4\\xe3\\x94\\xaa\\x10\\x97\\xe1\\x2b\\x0f\\xc9\\x0c\\x89\\xf7\\x6d\\xf0\\xd6\\x44\\x1f\\xa9\\x98\\x08\\xb6\\x0b\\xe0\\x7d\\xfc\\xc7\\xf9\\x01\\x0b\\xbf\\x90\\x33\\x55\\x6d\\x5e\\xe2\\xd4\\x48\\x93\\x7b\\x78\\x34\\x93\\x92\\x0f\\x68\\x1e\\x4d\\xa7\\x08\\x67\\x10\\x97\\xe1\\x99\\x48\\x1b\\x8e\\xf0\\xe0\\x15\\x0d\\x7c\\x28\\x51\\xdf\\x44\\xc5\\x45\\x12\\x2f\\x9b\\x0e\\x5b\\xa2\\xee\\xff\\x2d\\x98\\x8d\\x56\\xd9\\xbb\\xb5\\x5d\\x98\\x96\\x11\\x11\\x51\\xa4\\x36\\xaf\\x06\\x5e\\x0c\\xad\\x17\\x8a\\x2c\\x9f\\xa8\\xf6\\x97\\x4e\\xcd\\xf0\\x9a\\xdf\\x01\\x33\\x00\\xcf\\xfe\\xda\\xf4\\xb8\\x79\\x1b\\x46\\x7b\\xa7\\x93\\x3a\\xda\\x5d\\x63\\x2d\\xb4\\x4e\\xd6\\xdc\\xf2\\xaa\\x64\\x89\\x17\\xbe\\x63\\x37\\xd2\\xe2\\xd2\\x06\\x85\\x6d\\x08\\xf9\\xee\\x7b\\x5e\\x2f\\x14\\xdd\\xc6\\xd3\\xac\\x42\\x92\\x15\\xa8\\x79\\x23\\xad\\x32\\xd5\\xdc\\xfe\\xe3\\x68\\x63\\x16\\xdd\\xd1\\xb2\\x7b\\xb1\\x93\\xa5\\xfc\\x05\\xc8\\x93\\xa9\\x39\\xa5\\xb9\\x89\\x87\\x36\\x6c\\x82\\x9e\\x39\\x2f\\x48\\x5e\\xa1\\x5e\\x22\\xcd\\x8f\\x85\\x7a\\x13\\x4a\\xfa\\x98\\xf3\\x72\\x15\\x57\\x6d\\xdc\\x5a\\xab\\x4f\\x2d\\x10\\xca\\xaf\\x05\\x00\\x59\\xa3\\x35\\xf2\\x4b\\xcd\\xcb\\xac\\x81\\x9f\\x66\\xdb\\x07\\xaa\\xbd\\xfb\\x76\\x27\\x1d\\x17\\xbc\\xe2\\x2c\\xba\\x46\\x3a\\x80\\xaa\\x89\\x2d\\x0d\\x8e\\x05\\x5f\\x94\\x8d\\xf7\\xf6\\xe6\\xc3\\x00\\xda\\xef\\xfd\\x3a\\x23\\x6d\\xdd\\xcf\\x23\\x8f\\xe1\\x06\\x66\\xa5\\x7c\\x6e\\x3a\\xe7\\xe3\\x67\\x3d\\x35\\x57\\x8f\\x8b\\x8e\\xa6\\x9d\\x3c\\x08\\xe0\\x14\\x0a\\xfd\\x3e\\xe0\\x30\\xb2\\x2a\\x37\\x21\\x60\\xf9\\x08\\xa3\\x78\\xf8\\x10\\x1b\\x5f\\x59\\x69\\xfe\\xa3\\x10\\xee\\xd3\\x7a\\x00\\xd9\\x73\\x02\\xd5\\xc2\\xdb\\xe8\\xcc\\x60\\x00\\x75\\xdc\\xcd\\x33\\xad\\x63\\xd2\\x65\\xaa\\xf6\\x0e\\x24\\x1c\\xe3\\x11\\xbe\\xd7\\xdd\\x5e\\x27\\x45\\x24\\x1a\\xe0\\x2a\\xe5\\x32\\xd1\\x5c\\x18\\x88\\x6e\\x81\\x81\\x38\\x75\\x1a\\xfc\\x51\\x85\\x0e\\x50\\x6c\\x6d\\x31\\xa8\\xee\\xf4\\x51\\xad\\xfd\\x4b\\x3d\\x26\\x6b\\x41\\x5a\\x7e\"},\n{{0x07,0x82,0x8c,0x58,0x0e,0xbf,0x9e,0x1d,0x82,0x5a,0x59,0xc3,0xbf,0x35,0xf0,0x72,0xae,0x12,0x33,0x55,0xbd,0xcc,0x24,0x9e,0xec,0x7f,0x2f,0xc5,0x75,0x5e,0x29,0xb5,},{0x58,0xe5,0xed,0x85,0x10,0x0b,0xbd,0x9b,0x22,0x21,0xaf,0xc9,0xc9,0x31,0x84,0x33,0x0a,0xd5,0x9e,0x13,0x85,0x60,0x62,0x44,0xbf,0x00,0x3b,0x8d,0x20,0x18,0x50,0x1b,},{0xbb,0x09,0x36,0x04,0x39,0xa8,0x2d,0xee,0x5c,0x7d,0x85,0x77,0x9e,0x54,0xc1,0x3f,0x88,0xe0,0x6d,0x38,0xf4,0xb9,0x49,0x60,0xfe,0x17,0xa1,0xeb,0xca,0xa3,0xee,0x2f,0x33,0x0c,0x64,0x91,0x54,0xbb,0xc8,0x75,0xa4,0x07,0x6c,0xf0,0xbb,0xf7,0xee,0xbf,0x7b,0x8d,0x08,0xd5,0xaa,0x4b,0xe7,0x41,0x38,0x81,0x24,0x5f,0xc2,0xd2,0xb6,0x01,},\"\\x0e\\xda\\xd5\\xca\\xe6\\xed\\x98\\x43\\xe9\\x1c\\x50\\xd9\\x34\\xcf\\x55\\xdd\\x65\\x8f\\x3d\\x25\\x20\\x39\\xcd\\x6c\\x75\\xbe\\x4f\\x6b\\x86\\x6f\\xb7\\x5f\\x35\\xc8\\xf9\\x8f\\x17\\x21\\xd7\\xe6\\xd9\\xd9\\x8a\\x22\\xe0\\xb4\\x93\\x4d\\xcc\\x12\\x92\\x61\\xbf\\x67\\x23\\xb2\\xfa\\x7a\\x99\\x5e\\x35\\xc4\\xbd\\x79\\xc5\\x81\\x6a\\x32\\x16\\x07\\xd9\\xdc\\xce\\x39\\xfe\\xfa\\x1d\\x55\\xde\\x4e\\x76\\x17\\x54\\x8e\\xc3\\x85\\xc3\\xde\\x01\\xe3\\x66\\xbf\\x50\\xc4\\x57\\xa5\\x55\\xe9\\x32\\x07\\x0e\\x2a\\x5a\\x01\\x97\\xb7\\x9e\\xfb\\xe7\\x00\\x6f\\x0c\\xec\\x78\\xb6\\x0e\\xbb\\x8f\\xa8\\x78\\x1d\\x8e\\xb7\\x32\\x6e\\xdc\\x30\\xe6\\x2d\\x32\\x97\\xa1\\xe0\\xa1\\x11\\x71\\x08\\xc4\\x6e\\xe5\\xdb\\xef\\xc6\\x59\\x42\\x89\\x33\\x5e\\x78\\x0d\\x55\\xa0\\x84\\xf5\\x52\\xda\\x3f\\x36\\xd3\\xc4\\xc6\\x17\\x8b\\xa7\\x4d\\x4d\\xec\\xef\\xc5\\xa3\\xb8\\xc4\\x7c\\x16\\xf5\\x34\\xbd\\xb6\\x08\\x95\\xd3\\xd5\\x4c\\xd2\\xbb\\x26\\x6b\\x39\\x9e\\x4d\\x4f\\xb4\\x8d\\x7a\\x8c\\xde\\x17\\xf4\\x24\\x12\\x56\\x07\\x37\\xd3\\xc0\\x6e\\x29\\xdf\\x52\\x4d\\x0c\\xbd\\x30\\x93\\xef\\xca\\x1c\\x8f\\xed\\xca\\xa1\\x24\\xab\\xb2\\x7a\\xbd\\xac\\x6a\\x29\\xe0\\xe8\\x24\\x6a\\xbd\\x6f\\x5f\\x53\\x19\\x50\\x03\\x7f\\x76\\x32\\x3a\\xa5\\x6c\\xc3\\xfe\\xfa\\x60\\x30\\x41\\xd5\\x5f\\x19\\x29\\xe2\\x77\\xe7\\x2c\\xda\\x1f\\x96\\x54\\x1d\\x2a\\xf3\\xe9\\x0c\\x0f\\x0e\\x28\\xbe\\x19\\x6d\\x8f\\x69\\x21\\xf3\\xcd\\x57\\xa7\\x92\\x6b\\x86\\x0a\\xa1\\xbc\\x40\\x35\\x76\\x89\\x2a\\x96\\xb9\\x31\\x90\\xae\\x38\\x3f\\x63\\x1b\\x72\\x80\\x26\\x58\\xb2\\xe8\\x45\\x1d\\x52\\xa2\\xf4\\x5d\\xb4\\xf8\\xbc\\x3b\\x0e\\x4e\\x50\\xb6\\xd6\\x03\\xa5\\xbd\\xd3\\x0c\\x23\\x42\\x00\\xad\\x7d\\xeb\\xb9\\x63\\xf5\\x8a\\x4f\\xa2\\x03\\x30\\xb3\\x69\\x64\\x49\\x44\\x5a\\xa3\\x71\\x82\\x48\\x42\\xfb\\xf3\\x26\\xd9\\x01\\xdf\\xe3\\xbe\\x04\\x54\\x52\\xa3\\x74\\x0d\\xd1\\x60\\xe7\\x27\\x33\\xf6\\xe2\\x73\\x35\\x25\\xa2\\x9a\\x86\\x5f\\x6f\\x50\\xd5\\x3b\\xf7\\x19\\x1c\\x59\\x9c\\x87\\x6f\\x5c\\x9c\\xa1\\xe3\\xfa\\xd7\\x96\\x06\\x48\\xe0\\xd4\\x71\\xf7\\xd5\\xc0\\x1c\\x67\\x3f\\x42\\xd6\\x59\\xbc\\x3d\\x98\\xdb\\xf0\\x7d\\x8f\\xeb\\xfb\\x99\\x5d\\x17\\xf9\\xa0\\x2c\\xd6\\xc3\\x9f\\x2d\\xdc\\xd0\\xf1\\xd2\\x22\\xb9\\xe1\\x1f\\x2d\\xd7\\xd3\\xc7\\x51\\x82\\x24\\xbb\\x6b\\xfb\\x8b\\x7c\\x58\\xfe\\x8a\\xc1\\x05\\x40\\x59\\x03\\xa1\\xb9\\xda\\x75\\x16\\x71\\x5b\\x7a\\xfc\\x38\\xa5\\x55\\xe6\\xbb\\xcd\\xba\\xd4\\x6e\\x34\\xe5\\x76\\xfe\\xa3\\x4c\\xe3\\x57\\x34\\xed\\x20\\xaf\\x5d\\x88\\xee\\xb1\\x04\\x7a\\x26\\x60\\x64\\x8b\\xbb\\x11\\x3a\\xd9\\xdb\\x8c\\x53\\xed\\xb6\\xed\\x98\\x71\\xa1\\xe4\\x4c\\x9e\\xd2\\xdf\\x56\\x56\\xfb\\x2b\\x28\\x06\\xec\\xf0\\x3b\\x1e\\xca\\x9e\\xab\\x50\\xa6\\xea\\xab\\x55\\xb9\\x33\\xb2\\xdd\\x1f\\x21\\xd4\\x50\\xde\\x9d\\x5c\\xb2\\x23\\x2f\\x07\\xa3\\x92\\x08\\x1b\\x0b\\x4b\\x88\\x5d\\x54\\x78\\x9e\\x2f\\x75\\xbf\\x2c\\x4c\\xda\\xd8\\x78\\x98\\x9b\\x1d\\x6d\\xab\\xd9\\xed\\x23\\xc7\\xc5\\xb0\\x35\\x6a\\x7d\\x9e\\x73\\x35\\x29\\x0d\\x7c\\x85\\xb9\\x66\\xe8\\x01\\x84\\xbd\\x07\\x99\\x86\\x02\\x88\\x6d\\x70\\x76\\x19\\x35\\x65\\xc8\\x1c\\xcc\\xda\\x4c\\xc7\\xd3\\x3c\\x85\\xd9\\x05\\xb1\\xbe\\xb6\\xe8\\xe7\\x41\\x8e\\x8a\\xca\\xed\\xf0\\xd9\\xa3\\x2a\\x7d\\x29\\xd0\\x7c\\xf4\\x4d\\x31\\x19\\xd4\\xe7\\x89\\x68\\x20\\xb7\\x7d\\xe6\\x4b\\x65\\x5e\\x4f\\x14\\x88\\x00\\x43\\x4a\\xf7\\xbd\\xb2\\xa5\\x6b\\x25\\xeb\\x94\\xea\\x39\\xf2\\x16\\x95\\x96\\xbb\\x2b\\x11\\x76\\x1f\\x08\\x2b\\xae\\xc0\\x88\\x85\\xf4\\xa0\\xeb\\x6c\\x95\\x76\\x71\\x35\\xa7\\xf7\\xcd\\x72\\xe7\\x43\\xd2\\xdf\\xf1\\x44\\xdd\\x8b\\xaf\\xb1\\xb3\\x18\\x00\\x6e\\x58\\x76\\xf8\\xe2\\xcb\\x44\\xaa\\x58\\x8f\\x90\\x62\\x66\\xac\\x67\\x11\\x9c\\x17\\xf5\\xde\\x11\\x4e\\x72\\xe4\\x2a\\x1f\\xb3\\x99\\x44\\x32\\x1a\\x11\\x1f\\xa7\\x95\\xff\\x70\\x17\\xf2\\xfb\\x8c\\xaf\\x48\\x2f\\x55\\xd7\\x7a\\x80\\x85\\x54\\x28\\xde\\xd7\\xec\\x20\\xac\\xec\\xca\\x83\\xf8\\xd1\\xeb\\x13\\x7b\\x58\\x8c\\xcb\\x74\\x5c\\x10\\x5f\\x2b\\x2c\\xa4\\x1c\\x3a\\x9f\\x49\\xd3\\xc6\\xe9\\xd7\\xc6\\x48\\xb0\\x03\\xb9\\x70\\x7c\\x90\\x64\\x62\\xed\\xad\\x61\\x7a\\x8c\\xfb\\xf9\\xbc\\xc6\\xc5\\xfb\\x6f\\xa9\\x84\\x32\\x5d\\x65\\x82\\xe2\\x8f\\x62\\x00\\x53\\x83\\xf3\\x38\\xdf\\x5b\\x38\\xfa\\x9d\\x19\\xc2\\x2a\\x2a\\x7e\\xa1\\xd6\\x8a\\x92\\xd1\\xd9\\x3b\\x7f\\xb0\\xb8\\xf3\\x3b\\xc8\\x76\\x0f\\x28\\xae\\xb1\\x43\\x9a\\x8b\\x07\\xf3\\xda\\x58\\xdd\\xb1\\x55\\xb4\\x98\\xcb\\x09\\xc7\\x5a\\x55\\x96\\x83\\x8a\\x65\\x01\\x3e\\x24\\xd5\\x64\\x0d\\x08\\x42\\xa7\\x69\\x93\\x22\\xcf\\x3f\\xfc\\xb5\\x70\\x3f\\x41\\x4f\\xfd\\x16\\x88\\x60\\xba\\xd3\\xe3\\x08\\xb2\\xb5\\xbf\\x3c\\xdf\\x7f\\x36\\x3b\\xf9\\xaa\\xf4\\xb3\\xbc\\x42\\x4c\\x14\\x6c\\x6f\\x54\\x21\\x43\\x0f\\x9f\\x47\\x6a\\xa3\\x4a\\x0c\\x6e\\xe8\\x01\\x31\\xfc\\x4d\\x4d\\x97\\x07\\x23\\xa2\\x18\\x6a\\xe3\\x62\\x5e\\x28\\x6d\\x17\\xdd\\xdc\\x43\\x5c\\xcb\\x00\\x83\\x16\\x78\\xab\\xa5\\x84\\xa6\\x2d\\xbf\\xf0\\x02\\xbe\\xad\\x6e\\x11\\xe2\\x3c\\x54\\xd3\\x3c\\xf3\\xa4\\xb2\\x31\\xa9\\x08\"},\n{{0xf0,0x8e,0xe8,0xda,0xa7,0x3e,0x1f,0xeb,0x61,0xa8,0x8e,0x06,0x2d,0xfb,0x10,0x03,0xc8,0x57,0x8a,0x0d,0x53,0xbd,0x3b,0xc9,0xe5,0x89,0xef,0xb9,0x2f,0x68,0xbe,0x14,},{0x76,0x69,0x2c,0xe8,0xd1,0x16,0xec,0xcb,0x89,0x70,0x77,0xed,0xca,0xaf,0xdd,0x3e,0xb4,0x4e,0xa1,0xa4,0x86,0xb9,0x0e,0x49,0xe9,0x7f,0x96,0x69,0x01,0x01,0x55,0x02,},{0x66,0xdf,0xa4,0xc1,0x57,0x5b,0xef,0xf2,0xf5,0xa2,0x30,0xb2,0x8c,0x58,0xc3,0xee,0xa0,0x73,0x6d,0xf3,0x79,0xd7,0x55,0x59,0xbc,0x9d,0x37,0xa9,0x57,0x9d,0x12,0x1c,0x05,0xc3,0x73,0xe8,0x48,0x4c,0x97,0x47,0xef,0x44,0x77,0xe8,0x0c,0x4b,0x2c,0xb4,0xdd,0xf1,0x6a,0xe9,0xfd,0xfa,0x08,0xa0,0x75,0x47,0xd1,0x07,0xdc,0xea,0x12,0x03,},\"\\x64\\xde\\x90\\x04\\x4d\\x0e\\x76\\xbc\\x02\\xfc\\xff\\xcb\\x75\\x26\\x36\\x67\\xb3\\xbd\\x73\\x3b\\x40\\xbf\\xb2\\x6c\\x6c\\x52\\xfd\\xb4\\xb0\\x78\\x22\\x78\\xca\\xba\\xe4\\x1e\\x21\\x29\\xea\\x40\\x17\\xe9\\x4d\\xe8\\x60\\x87\\x96\\x4f\\x66\\xd8\\x62\\x07\\x98\\x74\\x67\\xa1\\x68\\x8f\\x9f\\xab\\x3f\\xfb\\x2f\\x1d\\x00\\x63\\xbf\\x62\\x6c\\x94\\x13\\x67\\xc1\\x2e\\x31\\x9a\\xb7\\xca\\x30\\x20\\xc9\\xb3\\xa7\\x21\\x5a\\x19\\x30\\x3e\\x2d\\x0e\\x89\\x88\\x79\\x1d\\xe0\\xd8\\xe1\\x63\\x2d\\xaa\\x38\\xc7\\xf3\\xe7\\xf6\\xe4\\x8c\\xe1\\x22\\x14\\x3d\\x1e\\x2c\\xb6\\x61\\xba\\x77\\xc6\\x9e\\x6a\\x71\\x09\\x11\\x64\\x4b\\xc1\\x10\\xff\\x58\\xbb\\x00\\xb5\\x29\\x08\\x20\\xce\\x30\\x97\\x0e\\x7f\\xde\\x18\\x9e\\x14\\x0e\\x5c\\x70\\xc7\\x83\\xee\\xd5\\x3f\\x0e\\x2a\\xc7\\xec\\xae\\x4f\\x27\\xdb\\x81\\xd1\\x5b\\x86\\x46\\xfa\\xa9\\xc5\\xa3\\xae\\x2b\\x7f\\x47\\xcd\\x58\\x0d\\x77\\x07\\xb0\\x02\\x49\\x9b\\x4c\\xfe\\xb8\\xc5\\x91\\xaf\\xdf\\x1c\\xc6\\x2a\\xf2\\x59\\x5c\\x18\\x4a\\xbc\\xf0\\xb2\\x62\\x3a\\x1b\\xae\\x60\\xaf\\x70\\x26\\xb2\\x8d\\x05\\x40\\xb4\\x15\\x26\\xe3\\x02\\x0f\\x81\\xb8\\x94\\xeb\\x3f\\xe3\\x1b\\x72\\xb2\\x1a\\x32\\x60\\xda\\xe3\\x21\\x0c\\x4c\\xe4\\xfd\\x69\\xe2\\xe5\\xea\\x0c\\x86\\x32\\xa5\\x83\\x26\\x2a\\x12\\xb3\\xa8\\xb1\\x6c\\x9c\\x12\\x06\\xad\\x73\\x02\\x30\\x37\\xcf\\x30\\x65\\x3c\\xb8\\x0a\\xa7\\xdf\\x83\\x14\\xb0\\xf5\\xbc\\x6e\\x9d\\x5f\\xa0\\x0b\\x00\\x9d\\x55\\x52\\xd8\\x3b\\x79\\x70\\xb5\\xbc\\x4b\\x99\\x84\\xf6\\x9d\\x1c\\xca\\x9c\\xe4\\xcb\\x74\\xdd\\xd2\\xd8\\x79\\xd3\\x73\\x12\\xa0\\xe1\\x59\\xd7\\xa6\\xaf\\xb7\\x7a\\xc5\\x85\\xe6\\xb4\\x59\\xc5\\x51\\x30\\x4e\\x1e\\xeb\\xfb\\xca\\xb4\\x3a\\x10\\xb5\\x05\\x92\\x4e\\x03\\xea\\x33\\x2f\\x5d\\x02\\x0a\\x55\\xc7\\xaa\\x68\\x3c\\x54\\x1d\\xcf\\x77\\x90\\xa2\\x40\\xaf\\x07\\x9b\\xab\\xa9\\x40\\x96\\xb4\\x60\\x60\\xfd\\x7a\\xfe\\x90\\x56\\xca\\x99\\xe6\\x88\\xdf\\x28\\x0a\\x9b\\xe8\\xc8\\xc7\\x3e\\x6e\\x6f\\xb0\\x52\\xa3\\x3e\\xb3\\x32\\x8a\\x7f\\x60\\x25\\x42\\xfe\\x28\\x0c\\x89\\x0e\\x3c\\xca\\xf2\\x2c\\x7f\\x34\\xf8\\x7b\\x5e\\x5b\\xa7\\x84\\xb4\\x72\\xb1\\xe1\\xa9\\x93\\x47\\xa9\\xe0\\xd2\\x40\\x85\\x8d\\x12\\x77\\xa5\\xc6\\xb3\\x49\\x38\\x3f\\xe4\\xfd\\x55\\xcf\\x92\\xe6\\x9f\\xaa\\xd3\\x26\\xb8\\xd6\\xdb\\x46\\x23\\x30\\x26\\x22\\x1e\\xe6\\xd0\\xa1\\xc4\\x24\\x65\\x33\\xc4\\xa0\\xe5\\xbd\\x17\\x2e\\xb8\\x93\\x6a\\x9c\\x0d\\x30\\x06\\x65\\x38\\xe3\\xeb\\x4a\\xd5\\xcb\\x98\\x77\\xfd\\x86\\x1b\\x48\\x2b\\x30\\x15\\x0a\\x06\\x10\\x41\\x61\\x64\\x7e\\x01\\xd0\\x04\\xd9\\x97\\x40\\x3e\\xe0\\x67\\x26\\xcb\\x97\\xe2\\xe2\\x5f\\x18\\xc6\\x68\\xee\\xe4\\xc5\\xbf\\x72\\x52\\x98\\x03\\x18\\x9e\\xe6\\xa7\\xae\\xc2\\x38\\xd5\\x90\\x6e\\xa5\\xae\\x10\\x72\\x2c\\x9a\\x61\\xa7\\x8a\\xea\\x52\\xaf\\x33\\xea\\xac\\x75\\x40\\x6b\\x1a\\x60\\xbe\\xfb\\xaa\\xd4\\x84\\x76\\xd9\\xff\\x88\\x7f\\xd2\\x83\\xeb\\x16\\x55\\xbc\\xc0\\x7c\\xf7\\x53\\x33\\x14\\x36\\xdb\\x5b\\x3b\\x13\\x03\\x2f\\xf9\\xc3\\xd6\\x96\\x38\\x0e\\x9f\\x5a\\xbf\\x50\\xd3\\x55\\x6f\\xda\\x0d\\xf0\\xb5\\x38\\x97\\xa7\\x37\\xac\\x7a\\x3b\\x87\\xc2\\xa8\\x32\\xb0\\xc7\\x27\\x3e\\xa9\\xfc\\x54\\xa7\\x67\\xf1\\xa8\\x12\\xbf\\x01\\x64\\xbf\\x75\\x21\\x63\\x0b\\x81\\xb9\\xdd\\x93\\x0d\\x92\\xee\\x2c\\xa2\\x8e\\x32\\x03\\xb7\\x7b\\xc0\\x82\\xce\\xb3\\x7d\\x55\\xed\\xbc\\xb7\\x1d\\xf0\\xb7\\x92\\x36\\x78\\x9a\\x25\\xd4\\x18\\xcb\\xb9\\x55\\x44\\xe2\\xce\\xf3\\x3b\\xbd\\xeb\\x27\\xa3\\xf7\\x90\\x9c\\x1f\\x49\\x8f\\x47\\x13\\x5a\\xe9\\x03\\x3a\\xdf\\x25\\x0a\\xd4\\xf6\\x57\\x53\\x61\\xe4\\xcf\\xcc\\x9b\\xcf\\x4b\\x90\\xc3\\xad\\x47\\xa3\\x44\\x22\\x97\\xa2\\x23\\xcc\\xa8\\x43\\xd7\\x20\\x5e\\xd0\\x8a\\x9b\\x87\\x16\\x0a\\x6d\\x01\\xb4\\x6a\\x7d\\x1c\\x84\\x4e\\x8d\\x1f\\x18\\xf6\\x18\\x68\\x2b\\xfb\\x22\\x95\\x5f\\x39\\x5b\\x2a\\x57\\x90\\xa5\\x1a\\x69\\x64\\x99\\xd9\\xe7\\x1a\\x50\\x1f\\x3f\\xa5\\x46\\xde\\x9b\\x10\\xae\\x47\\xbc\\xee\\x42\\xba\\x7f\\x86\\x9f\\xb9\\xce\\x4e\\xd7\\xc6\\x45\\x33\\x26\\xc0\\x34\\xcf\\x05\\xd9\\xf1\\xe3\\xc2\\x00\\x70\\x1b\\xa7\\x52\\xda\\xbb\\xd8\\x68\\x52\\x1c\\x3d\\x8f\\x80\\x67\\x2d\\x42\\xf6\\xcf\\x45\\x64\\xf0\\x8c\\xd7\\xb3\\x90\\xe6\\xd4\\x9d\\xd9\\x00\\x90\\xaf\\xdb\\x84\\x48\\x6f\\xfc\\xaa\\x4e\\x84\\xd8\\x86\\x82\\x74\\x4d\\xc0\\xa8\\x78\\xfa\\xa7\\xcd\\x44\\x0a\\x8b\\x27\\x67\\x10\\x90\\x20\\x81\\xf4\\xdc\\x84\\x17\\x46\\x19\\xa6\\x6e\\xa3\\xa3\\x71\\xf9\\x55\\x05\\x40\\x0d\\x99\\xfa\\x99\\x90\\x17\\x71\\x0c\\x8e\\x27\\x14\\xbe\\x60\\x94\\x9d\\x46\\x13\\x10\\xf7\\xd4\\x3a\\x0d\\xc1\\x23\\x51\\x6d\\x77\\xd3\\x62\\x21\\x3f\\x9f\\x75\\xa5\\xa1\\xc3\\x93\\xaf\\xfc\\x49\\xea\\x15\\x1d\\x46\\xa8\\x1f\\xfa\\xd2\\x39\\xf2\\x8c\\x07\\xf6\\x5f\\x59\\xea\\x07\\x7d\\x9a\\x4d\\x9c\\x75\\x2d\\xe4\\x9b\\x9e\\xf3\\x6b\\xe6\\x0d\\x11\\x2d\\x79\\x5f\\x58\\x8b\\x00\\xef\\x6e\\x77\\x30\\xde\\xa6\\x5e\\x10\\x16\\xda\\x0d\\xd4\\x62\\x37\\x0e\\x0b\\xa5\\xc6\\x60\\x00\\x1e\\x45\\x7c\\x08\\xb4\\x36\\xda\\x29\\x03\\xb6\\x29\\x06\\x93\\x20\\x84\\x72\\x8c\\x81\\x67\\x1c\\xbf\\xb0\\x79\\xbb\\x29\"},\n{{0x27,0x2d,0x64,0xde,0x50,0xb1,0x31,0x2b,0xee,0x23,0xd7,0xf4,0xce,0xa5,0x08,0xa8,0xfc,0xcf,0x3e,0x9b,0x32,0x4e,0x97,0xb1,0xc8,0xe7,0x25,0x02,0xf6,0x1f,0xbf,0x45,},{0x33,0x49,0x8c,0x3b,0x71,0x2a,0xb9,0xc0,0x1e,0xc7,0x6b,0x2e,0xfe,0x2b,0x83,0xad,0xd1,0xe1,0xf2,0xb5,0xeb,0x78,0xf2,0x16,0x92,0x32,0x34,0x51,0x82,0x0c,0xbe,0x10,},{0x33,0x81,0x4c,0x6e,0xf3,0x75,0xab,0x96,0x37,0x69,0xb2,0xde,0x4a,0x25,0xe7,0x02,0x0f,0xcd,0x97,0xf7,0x8f,0x8f,0xc9,0x34,0x55,0xc4,0xb1,0xc2,0xbd,0x45,0xd4,0xb0,0x1e,0x19,0x29,0x00,0xe3,0x12,0x22,0x65,0xfc,0x55,0x2c,0xd5,0xc5,0xf0,0x0e,0x93,0x1e,0x3a,0x18,0x3c,0xca,0x5b,0xa0,0x80,0x2d,0xaf,0xde,0xbb,0x79,0xeb,0xeb,0x03,},\"\\xd6\\x26\\x0d\\x7e\\xec\\x5d\\x43\\x62\\x08\\xe7\\xe7\\x37\\x65\\x5e\\x09\\x71\\x81\\x42\\x70\\x19\\x44\\x05\\xe3\\x6e\\x39\\xf8\\xf1\\x7b\\x64\\x9f\\xbc\\x16\\xc0\\xf3\\xd7\\xf2\\xbe\\xf5\\xeb\\xc0\\x2b\\xb1\\xc4\\xdf\\x48\\xe8\\x47\\x0a\\x3e\\xae\\x8a\\x3c\\xca\\xf6\\x40\\xab\\xcc\\x09\\x4a\\xa9\\x11\\x50\\xff\\x1a\\x8c\\xf1\\x16\\x96\\x93\\xeb\\xf5\\xac\\x00\\x34\\xb9\\xb9\\x19\\xec\\xf1\\x7d\\xb7\\x91\\xdf\\xe5\\xfe\\xdc\\x90\\x91\\x8b\\x23\\xe5\\x4e\\x90\\x04\\xa1\\xae\\x77\\x1c\\x21\\x3e\\xd7\\xed\\x73\\x34\\x43\\x4e\\x5b\\xc0\\x2c\\x0d\\xda\\x2b\\xd1\\xa8\\x76\\xfb\\x82\\x4a\\x19\\x7b\\xc9\\x96\\x13\\xb1\\x40\\x9e\\x70\\x52\\x31\\x0b\\x08\\x20\\xda\\x71\\x44\\x69\\x29\\xae\\x7c\\xfd\\x3a\\xfb\\xa0\\x42\\xde\\x54\\x57\\x8a\\x5b\\xfd\\x94\\xc1\\x54\\x43\\x91\\xa3\\xd9\\xac\\xbd\\x56\\x63\\xef\\x65\\xc6\\x92\\x0d\\x78\\x51\\x6d\\xec\\x1c\\xd5\\x5f\\x6e\\xb7\\x29\\x0b\\xa0\\xaa\\xf9\\xa1\\x71\\x65\\x82\\x00\\xb2\\x4a\\x47\\xa0\\x71\\xb9\\x6f\\xea\\x03\\xc6\\xca\\x7e\\xd0\\xd6\\xfe\\x67\\x5d\\xd6\\x37\\x61\\x83\\x3d\\x75\\xbc\\x5e\\x58\\xa9\\x58\\x58\\x2d\\xb0\\x2a\\x60\\xc6\\xce\\x0a\\x63\\xf4\\x2b\\xa8\\x37\\xae\\x77\\xc1\\x7a\\x32\\x70\\x5f\\xd9\\xca\\xfa\\x58\\x7b\\x55\\x5d\\xd4\\x61\\x98\\x51\\x07\\x97\\x94\\xe2\\x4e\\xb4\\x46\\x08\\x83\\x5a\\x6f\\x48\\x24\\x92\\x0d\\x57\\x7a\\x27\\x03\\x96\\xc9\\x57\\x3b\\xc7\\xd8\\x2f\\xe2\\xaa\\x04\\x65\\x95\\x66\\x13\\xa2\\xc5\\x08\\xcf\\x24\\x32\\x33\\x7a\\x36\\x5e\\x6c\\x98\\x4c\\xba\\x91\\x7f\\x0c\\xf8\\x42\\xaf\\x12\\x2d\\xc8\\x9d\\xea\\x95\\x8d\\x41\\x8c\\xae\\x44\\xa6\\xe4\\xed\\x26\\x3a\\x41\\x5f\\xf9\\x94\\xa5\\xff\\xb2\\xff\\x13\\x91\\x3d\\xf2\\x14\\xbb\\xfe\\x90\\xa3\\x4b\\x24\\x7e\\x71\\xab\\x73\\xf7\\xff\\x00\\x4c\\x23\\xac\\xfd\\x90\\xc7\\x67\\x61\\x1a\\xa5\\x58\\x14\\xc6\\x69\\x64\\x16\\x8e\\x56\\x8b\\xa7\\x5b\\xf3\\x49\\x03\\x59\\x7c\\xdc\\xac\\x78\\xc2\\x4b\\xb9\\xf1\\x4f\\x5c\\x86\\xa5\\x1f\\x36\\x4f\\x9a\\xb4\\x1e\\x46\\x4a\\xee\\x64\\xfa\\x50\\xa1\\xc1\\x59\\xcb\\xd8\\x50\\x83\\x2c\\x50\\x4a\\xb4\\x2a\\x58\\x4a\\x96\\xd5\\xae\\xe0\\x82\\xd8\\x2c\\x1e\\xdd\\xa1\\x93\\x38\\x16\\x0b\\x8d\\xcf\\xa3\\x41\\x9b\\x3a\\xf6\\x4d\\x9c\\xfb\\x10\\x4f\\x98\\xf9\\xd3\\x5e\\x53\\x94\\xe2\\x32\\x28\\xe2\\x75\\xc8\\x7d\\xb5\\x0c\\xa8\\x67\\x54\\x0b\\x88\\x0c\\x7a\\xf2\\x9f\\xbf\\x53\\x42\\x94\\x58\\x1c\\x22\\x24\\x0b\\xcd\\x4d\\x7d\\x2c\\x20\\xff\\xc3\\x67\\x33\\xad\\xa2\\x76\\x53\\xd3\\xae\\x1a\\x8c\\x22\\x03\\xea\\xc6\\x26\\xe2\\xe9\\xbb\\x4b\\x52\\xce\\x52\\x3e\\x5a\\xdb\\x3b\\x2c\\x10\\xdc\\xf7\\x8c\\x2a\\x1e\\x62\\x6a\\x16\\xeb\\xfa\\x1b\\xdb\\x8c\\x16\\x14\\x93\\xa5\\xaa\\xa2\\xd8\\x4b\\xfa\\xa0\\xf2\\x02\\x7f\\xfe\\x4e\\x9e\\xae\\xb3\\x32\\xeb\\xda\\x7c\\xbb\\xb6\\x77\\x76\\x9d\\x78\\x51\\x7a\\xdf\\x72\\xf8\\x23\\xa7\\xf8\\x44\\x16\\x5a\\x07\\x98\\x78\\xd2\\x58\\xfd\\x95\\x22\\x5c\\x21\\x17\\x78\\x37\\xe6\\x9c\\x19\\x68\\x5a\\x05\\x1c\\xa9\\x2b\\x12\\x0b\\x7d\\x86\\xd7\\x85\\x95\\x47\\x1f\\xfc\\x42\\xa5\\xe6\\xe6\\x43\\x1b\\xe7\\xb6\\x4f\\x80\\x76\\x45\\x8b\\xac\\xd6\\xc7\\x29\\x03\\xcc\\x34\\xfc\\x63\\xa4\\x0c\\xf3\\xdf\\x00\\xef\\xf9\\xd6\\xee\\x9a\\x8f\\x39\\xd2\\x5e\\xad\\x81\\xa8\\x12\\x88\\x88\\xb0\\xa1\\xac\\x0e\\x5e\\x3a\\xd9\\x27\\x71\\x2c\\x14\\x14\\x6a\\xdf\\x82\\x87\\x70\\xff\\x95\\x87\\x09\\xeb\\x19\\x28\\x8e\\x77\\xbb\\x70\\x73\\x48\\x81\\xe9\\xe0\\x16\\xcd\\x29\\xe7\\xd0\\x89\\x93\\x41\\xff\\x6b\\x29\\x7a\\xc7\\x96\\xbb\\xde\\x48\\x6e\\xc3\\x59\\x49\\xf6\\xa3\\x2b\\x2c\\xa6\\x47\\x38\\x59\\x15\\xec\\xba\\x3b\\x9f\\x02\\x25\\x08\\x71\\x45\\xc1\\x8d\\x65\\x59\\xd3\\xa3\\x1d\\x6f\\x22\\xfc\\x49\\xf8\\xa6\\x31\\x5f\\x1d\\x32\\xab\\xee\\xb7\\xcf\\x2c\\x2c\\x77\\x6e\\xa7\\x35\\x0f\\xd5\\xeb\\xc0\\xe0\\xf2\\x65\\xba\\xcc\\xc2\\x69\\x7a\\x7c\\x8c\\xa4\\x0c\\x13\\x5f\\x6c\\xfc\\xb0\\xb5\\x8a\\x61\\x43\\x19\\x60\\xff\\xa9\\x06\\x57\\x09\\xa9\\x61\\xa6\\x33\\xd5\\x70\\xb7\\x3f\\xb4\\x49\\x1d\\xe5\\x2a\\xd0\\xd7\\xb2\\x04\\xb6\\xe9\\x97\\xb0\\x37\\xed\\xe3\\xf7\\xec\\xa8\\x20\\xa7\\xcd\\xb2\\xc6\\x9a\\xc2\\x91\\x48\\xbe\\x35\\x23\\x50\\x8a\\xe7\\xe4\\xc3\\xd1\\xa7\\x17\\xf5\\x5a\\x82\\x1d\\x14\\xc3\\xb6\\x4f\\x08\\xca\\x9a\\xe4\\x96\\x13\\xb1\\x15\\x77\\x3e\\xf6\\x18\\xd3\\x21\\xc9\\x08\\xbd\\x21\\x56\\x71\\x7a\\x43\\x4e\\x50\\x89\\xa5\\x94\\x8c\\x04\\x5c\\x8d\\xa8\\xa4\\xbd\\x86\\xed\\x5f\\xab\\xc6\\xb1\\x34\\x66\\xe6\\xde\\xda\\x58\\x32\\x07\\xd2\\xad\\xa2\\xb2\\xab\\x9c\\xb1\\x54\\x3d\\xf7\\xa3\\x73\\x4d\\xfb\\xc6\\xfc\\x42\\x81\\x06\\xd4\\x84\\x47\\x24\\xa1\\x3d\\xf4\\x2f\\xaa\\xb1\\x8c\\xa8\\x9d\\xb2\\x0a\\xc9\\xbc\\x27\\xb8\\x53\\x94\\x66\\x7c\\x5a\\x27\\x79\\xca\\x63\\xed\\x7a\\xc2\\xb7\\xc0\\xd4\\x12\\x23\\x91\\xee\\x46\\x02\\xd6\\x1e\\xa0\\x38\\x17\\x64\\xfb\\x72\\xdc\\xc2\\x24\\xe6\\x5e\\xae\\x2b\\xc4\\x50\\x6b\\x0f\\x09\\xe2\\x32\\x05\\xd0\\xbb\\x21\\xc7\\x7d\\x82\\x87\\xc1\\x65\\xe0\\xb4\\x2c\\x55\\x15\\x79\\x77\\x8a\\xcb\\x72\\x58\\xa2\\x47\\x9d\\x7c\\xf2\\x5b\\x90\\x2e\\x8d\\x0d\\xa4\\x29\\xbd\\xe3\\x6b\\x45\\x90\\xda\\xe9\\x6f\\x52\\x54\\x81\\xac\\x83\\x78\"},\n{{0x0c,0x9f,0xe5,0x59,0xad,0x1e,0xd3,0xba,0x16,0x4d,0xac,0xea,0xcb,0x02,0x35,0x67,0xb2,0x43,0x03,0x20,0xb6,0x71,0x5d,0xe7,0x32,0xa0,0x3c,0x59,0xc7,0x30,0x31,0x30,},{0xe7,0x0f,0xc4,0x66,0xfb,0x2a,0xcd,0x74,0xe0,0x99,0xc3,0x6e,0x2c,0x22,0xfa,0x51,0x29,0x0b,0xdd,0xe9,0x6d,0xf9,0xc3,0x1b,0x6d,0xfb,0xfd,0xc2,0xe2,0xc1,0x4a,0x40,},{0x6c,0xd8,0xae,0xd9,0x7d,0x9c,0x62,0xd5,0xfd,0xae,0x59,0x7d,0x06,0x1c,0x0c,0x2b,0xc3,0x7e,0x42,0xdf,0x06,0xb8,0x32,0x7a,0x46,0x8f,0x92,0xb3,0xf4,0x38,0xa1,0xe6,0xb6,0xb1,0xef,0x2b,0xe7,0x85,0x49,0xa2,0x89,0xfd,0x3f,0xc1,0xa6,0x29,0x9e,0x5a,0x33,0xd5,0x39,0x6c,0xb4,0xfa,0xc1,0xe8,0xe9,0x98,0x2f,0x0c,0xb3,0xd2,0x0d,0x07,},\"\\x26\\xeb\\xc6\\x48\\xcf\\x8c\\x79\\x65\\xec\\x6e\\xbe\\x96\\x5d\\x9c\\x79\\x2b\\xed\\x90\\x65\\x5a\\xd4\\x40\\x18\\x3c\\x6d\\x70\\xea\\x64\\x67\\xbb\\x8e\\x6f\\x04\\xec\\x84\\x3f\\x33\\x31\\x56\\x91\\x7b\\xf4\\xc5\\x1d\\x0e\\xd0\\xf2\\x8b\\x7c\\xd3\\x1b\\xc1\\x2c\\xf8\\x40\\x68\\x6b\\x82\\xb0\\xc2\\xc3\\x50\\xbb\\xda\\xc8\\x05\\x33\\x37\\x25\\xd6\\xb6\\x9c\\x2a\\xb7\\xf3\\x4e\\xe5\\x93\\xfa\\x1c\\xcc\\xed\\xf3\\xf0\\x64\\x2a\\x68\\x8f\\xcc\\x1c\\xd9\\x8b\\x09\\x87\\xd0\\x1f\\x71\\x3a\\x2f\\xa6\\x41\\x6c\\x96\\x19\\x21\\xde\\x0c\\xc2\\xc9\\xec\\x7a\\x55\\x58\\x55\\xe7\\xfc\\xd4\\xc7\\xdd\\xaa\\x14\\xfd\\x91\\xec\\xb0\\x42\\x24\\xe1\\x76\\x1b\\x7d\\x6b\\x35\\xf4\\xaa\\x56\\x18\\xa5\\x00\\xca\\x00\\xd1\\xca\\x24\\x51\\xb5\\xd3\\x68\\xaf\\xde\\x3a\\x40\\x7e\\x78\\x31\\x35\\xf3\\x90\\x19\\xa5\\xb9\\x84\\xe8\\x2a\\xc2\\x79\\xc0\\x5e\\x48\\xc2\\x95\\xeb\\xd1\\x56\\x38\\x21\\xa0\\x74\\x3c\\x52\\x24\\x6b\\x5d\\x2b\\x20\\x34\\xe3\\xae\\xb6\\xce\\x7c\\x5c\\xf9\\x19\\xe7\\x4a\\x9c\\x7b\\xbc\\x9e\\x25\\xda\\x30\\x43\\x0e\\xb1\\x6e\\xcf\\x38\\x37\\xeb\\x38\\xa0\\xf5\\x59\\x79\\x2a\\x72\\x98\\x90\\xba\\x83\\x10\\x26\\x0f\\x8a\\xeb\\x9b\\x5a\\xf0\\x0e\\xb6\\x33\\xc1\\x2d\\xee\\x02\\x26\\x28\\xba\\x41\\x8d\\x75\\xcf\\x18\\xde\\x2f\\x2e\\x65\\xe4\\x9b\\x1a\\x69\\x68\\x4d\\x61\\x27\\xef\\x48\\x1c\\xa8\\x61\\xec\\xbc\\xe3\\xbe\\x86\\x49\\x7e\\x65\\xdf\\x4c\\x5f\\xcd\\x08\\x17\\xc9\\x71\\x6b\\x59\\xf2\\xa2\\x63\\xd5\\xe9\\xeb\\x60\\x68\\x39\\xf8\\x5c\\x5a\\x36\\x58\\x37\\xb0\\xfb\\xe2\\xc4\\x27\\x4d\\x66\\xcb\\x2c\\x65\\xed\\x36\\x5f\\xab\\xf5\\x8f\\x15\\xbe\\x52\\xb5\\x1c\\xb6\\x01\\x18\\xca\\x4f\\x73\\x0d\\x44\\x73\\x59\\xf7\\xef\\x34\\x6b\\x75\\x02\\x17\\xd4\\x7b\\x2e\\x79\\xc8\\x6c\\x0c\\x62\\x81\\x6a\\x0c\\x7c\\x18\\xa2\\xce\\x2b\\x68\\x8e\\x0c\\xce\\x0d\\x75\\x23\\x21\\xe7\\x9b\\x42\\x38\\x57\\xda\\xc5\\x9f\\x8f\\xbe\\xb0\\x94\\x11\\xe7\\x16\\x69\\xef\\x9a\\x26\\x43\\xf2\\xe9\\x9f\\x38\\x7a\\xc1\\x83\\xe0\\xb0\\xac\\x72\\xc5\\x9a\\x0c\\x3c\\x18\\xc0\\xde\\x8b\\x01\\x08\\x78\\x07\\x4a\\xcc\\x1a\\x2b\\x39\\xf9\\xdf\\x99\\xd9\\xf8\\xf8\\xb5\\x2f\\xef\\xe4\\x94\\x3c\\x52\\x5f\\xd4\\xd0\\x6a\\xd8\\x78\\xe4\\x66\\x08\\xab\\xf2\\x7a\\x54\\xbc\\x50\\x06\\xf6\\x47\\xdb\\x72\\x48\\x51\\xdb\\x7c\\x45\\x78\\xae\\x66\\x58\\x3d\\xc4\\xbb\\x51\\x8e\\xf0\\x28\\x89\\x03\\x47\\xe8\\xfc\\xe0\\x92\\x7d\\x7d\\x9a\\xf3\\xab\\x5d\\x0d\\x2d\\x20\\x2a\\x40\\x26\\xaa\\x2e\\xa7\\x48\\x79\\x62\\x67\\x6a\\x60\\x32\\x98\\xe7\\xd2\\xe7\\xb9\\x09\\x21\\xee\\x1b\\x52\\x80\\x6d\\x71\\xa7\\x64\\xe0\\x3e\\x25\\xdd\\xd6\\x84\\x8f\\x61\\xd4\\x6f\\xad\\x3d\\x00\\x8e\\x10\\xee\\x5c\\xd5\\xa3\\x39\\x0f\\x9d\\x15\\x8a\\x44\\x37\\xef\\x61\\x5f\\xc9\\x0a\\xc5\\xbf\\x3a\\x9d\\x68\\x2e\\x12\\xc3\\x39\\x8a\\xc7\\x76\\x80\\xd2\\x2c\\xd1\\xa6\\xa5\\x6e\\xc3\\xb2\\x5c\\xed\\xe8\\x67\\xed\\xd3\\x83\\x15\\x9c\\x61\\x64\\xd6\\x3e\\x9c\\xd1\\xc9\\x56\\xac\\x72\\x35\\xff\\xfa\\xe9\\x36\\x16\\x6c\\xcd\\x35\\x89\\x8e\\x29\\xc9\\xb4\\xca\\x4e\\x29\\x25\\xda\\x32\\x3b\\x6f\\xbf\\x67\\xcf\\xd5\\x96\\xc8\\x8a\\x1a\\x35\\xa8\\x35\\x98\\x51\\xdd\\xcb\\xa8\\xf6\\x13\\x4a\\x9f\\xaa\\x24\\x4d\\xcb\\x47\\xe6\\x91\\x27\\x6e\\xe6\\x25\\xcc\\x20\\xad\\xce\\xc2\\x1c\\xbe\\x77\\xa3\\xac\\xb9\\xba\\x72\\xf0\\xc9\\xd3\\xda\\x7e\\x9c\\xd5\\xbe\\x3b\\x95\\x99\\x0b\\xa5\\x4a\\x9f\\x31\\xaf\\x17\\x1f\\x95\\xae\\xea\\xd3\\x33\\x1c\\xb1\\x88\\xa5\\xb2\\xc6\\xf5\\x39\\xac\\xb4\\x8b\\x98\\xb3\\xf7\\x34\\x1f\\x60\\x25\\x1c\\xb6\\x04\\x29\\xcc\\xd9\\xcf\\x32\\xf0\\x09\\x20\\x5f\\x27\\x53\\xfb\\xbb\\x26\\xaa\\x53\\x17\\x43\\x42\\xad\\x18\\x4d\\xab\\x68\\x70\\xc0\\xfb\\x52\\x93\\x01\\x19\\xd9\\xf9\\x7d\\x84\\x89\\xa6\\x00\\x76\\xaa\\xdb\\x2e\\x96\\x05\\x4a\\xc7\\xcb\\x7f\\x84\\xe1\\x3c\\x75\\xbb\\xf9\\xe4\\xd9\\x24\\xd2\\x27\\x2a\\xfe\\xf0\\x87\\x19\\x15\\xe2\\x43\\xce\\x66\\xfc\\x2a\\x88\\x88\\x51\\x35\\x35\\xb1\\x0b\\xb4\\x07\\x9c\\x80\\x6b\\xd9\\x49\\x28\\x1e\\x28\\x28\\x35\\x23\\xd0\\xd2\\x10\\xb3\\x1e\\xf6\\x2a\\x95\\xdc\\xae\\x0c\\xd2\\x52\\x90\\xc7\\xed\\xf2\\xc2\\x4b\\x43\\x28\\x22\\xde\\xbe\\x34\\x7f\\x1c\\xae\\x94\\x5f\\x57\\x28\\xc7\\x1b\\x54\\x03\\xef\\x14\\xe7\\x2c\\x3d\\x83\\x42\\xe1\\x98\\xb3\\x62\\xee\\x20\\xf8\\x09\\xe4\\x6a\\xca\\x01\\x5f\\x35\\x47\\x7f\\xf8\\x9a\\xc4\\xb3\\x7e\\x66\\x15\\x85\\x6f\\x7e\\xa2\\x51\\xfb\\xfe\\x13\\xf9\\x06\\x52\\x59\\xb0\\x94\\x6a\\xae\\xf2\\x49\\x43\\x27\\x0a\\x85\\x4d\\xe8\\x89\\x78\\x00\\x33\\xd6\\x3d\\xda\\x54\\x47\\x99\\x8a\\x3e\\xd7\\xe5\\x06\\xae\\xb5\\x1e\\xa3\\x7b\\x68\\x1a\\xc3\\x07\\x67\\x97\\xac\\xdb\\xfc\\xc2\\x78\\x83\\x63\\x0a\\xdb\\x72\\x26\\x0a\\x46\\xaf\\x0a\\x60\\xd5\\x3f\\x66\\x54\\x56\\x6e\\x20\\xd6\\x08\\x8c\\xd4\\x8e\\x23\\xb2\\x8d\\x81\\xf0\\xee\\xd2\\x05\\xb9\\x2a\\xaf\\xd9\\x61\\x64\\xd6\\xd3\\xca\\x3f\\xc8\\xb1\\x71\\x80\\x4e\\xe9\\xfc\\xe7\\xab\\xae\\xd2\\xea\\x4d\\xdf\\x9c\\xb2\\xb3\\xae\\x73\\xa7\\x0e\\xd6\\x3d\\xe4\\x5e\\x14\\x10\\x14\\x28\\xd0\\xa7\\xa2\\x26\\xdb\\x39\\xab\\x6c\\xd0\\x43\\x74\\x08\\x0e\\x69\\x83\\xf0\\x18\\xce\\x93\\xda\\x4c\\x89\\xac\"},\n{{0x15,0xd7,0x5a,0xd8,0xe4,0xaf,0xb1,0x26,0x34,0xcc,0x8e,0x60,0x0f,0x1a,0x42,0x67,0xef,0x95,0x84,0xf4,0xc4,0xac,0x44,0xff,0xfe,0x4b,0x9f,0xcb,0x88,0x5c,0x9d,0x2a,},{0x09,0xd1,0x26,0xf0,0x17,0xe0,0x16,0x97,0x74,0xe8,0xc3,0x7a,0xb3,0x79,0x26,0x3a,0x80,0x75,0x74,0x61,0x27,0xc2,0xd1,0x1e,0xcb,0x0e,0x4c,0xb4,0x54,0x70,0x9f,0xf1,},{0xa8,0xf2,0xf4,0xb9,0xe2,0x07,0x2c,0xa9,0xfa,0xde,0x37,0xfd,0xd6,0x2d,0x8d,0x02,0x42,0xfd,0x4d,0xaa,0x09,0xfd,0x85,0x6e,0x75,0xf4,0xe3,0x43,0xc7,0x26,0x0e,0xa6,0x77,0xf7,0x53,0xa6,0x27,0xae,0xd0,0x8c,0xb9,0x6c,0x44,0x4e,0x29,0xbd,0xb5,0xb5,0x38,0x5d,0x43,0x84,0x3b,0xbe,0x79,0xa3,0xdd,0xa3,0x6e,0x1e,0x11,0x01,0xc5,0x0f,},\"\\xd1\\xce\\xa2\\xb7\\xe9\\xaf\\xc1\\xf0\\xfa\\xb8\\x90\\xd2\\x70\\x0a\\x5a\\xe4\\x1e\\x15\\xe7\\xd3\\x4d\\x3b\\xf1\\x9d\\x0f\\x34\\xd9\\xf9\\xf0\\xab\\x98\\x12\\xdc\\x7c\\x2a\\x8d\\xc4\\x4c\\x8e\\xe7\\xf3\\x78\\x87\\x61\\xec\\xd9\\x88\\xee\\x72\\xc7\\x36\\xb6\\x2a\\x7c\\xac\\x3c\\xc9\\xb7\\x38\\xe9\\x38\\xdf\\x77\\x87\\x37\\x7e\\xb9\\xff\\xd1\\x20\\xd4\\xff\\x58\\xcf\\x1c\\x06\\x75\\x63\\x3f\\x7e\\x83\\xc4\\xb1\\x15\\x54\\x8f\\x14\\xd2\\xf7\\x0c\\x6d\\x48\\x22\\x11\\x44\\x3a\\x84\\x99\\x59\\x95\\x58\\xc1\\x42\\x77\\x98\\x0f\\xa4\\x2a\\x78\\x42\\x79\\x07\\xf7\\x3a\\x41\\xf5\\xf6\\x69\\x3b\\x2f\\x75\\xfe\\x5e\\x7a\\x6f\\xf0\\xa6\\xc3\\xa4\\xe2\\xed\\x1d\\x0d\\x96\\x8d\\x5c\\xc9\\xd6\\xf1\\x3d\\x41\\xc3\\xd2\\x91\\x39\\x6a\\xe7\\xe4\\x34\\xe6\\x64\\xb2\\xff\\x24\\x3e\\x7f\\x6d\\x88\\x01\\x02\\x10\\x07\\x8c\\x39\\xb5\\xa5\\x76\\xca\\xf4\\x09\\xbb\\x47\\x11\\xb3\\xee\\xfc\\x48\\x6b\\x67\\xb7\\xff\\xea\\xe0\\xcb\\xac\\x6a\\x0f\\xbd\\xf5\\x34\\x3f\\xb2\\xae\\x4e\\x05\\x7e\\xdc\\x8c\\x9d\\x2e\\xd3\\x1e\\xae\\x9e\\xc8\\x3d\\x2b\\xed\\xd2\\x19\\xeb\\x98\\x9b\\x2d\\x44\\x19\\x61\\x8c\\x2d\\x3c\\xe4\\x49\\x0e\\x35\\xfb\\xca\\xd4\\x32\\xb0\\x12\\x47\\x95\\xf9\\xc5\\xcb\\xdc\\x1e\\xb0\\xc3\\x07\\x2b\\x4a\\xa8\\x01\\xd2\\x6f\\xbc\\xc7\\xb0\\x7b\\x82\\x57\\xf5\\xfe\\x47\\xac\\xd9\\xbc\\x58\\x7b\\x56\\x57\\xcf\\x07\\xca\\x54\\x5b\\xb5\\x68\\xc9\\xe4\\xe7\\x3c\\xdd\\xf6\\x25\\x4e\\x22\\xf7\\x8a\\xb2\\xf8\\x06\\x45\\x19\\xf8\\xab\\xfd\\x16\\xfc\\xfa\\x90\\xf8\\x76\\x87\\xdb\\x0c\\x42\\x09\\xbe\\x2c\\x6c\\x79\\xa5\\x52\\x1f\\x44\\x18\\x96\\x78\\xd9\\x32\\xc5\\x45\\x85\\x70\\x0a\\x24\\x37\\x70\\x2e\\x56\\xaa\\xb5\\x88\\xa1\\x7c\\xb2\\xcc\\x94\\xc0\\x0e\\x87\\x57\\x0e\\xf3\\xac\\x51\\x33\\xd7\\x53\\x03\\x8a\\xa4\\x65\\x10\\xa2\\x60\\xc1\\xfe\\x80\\x47\\x9b\\xc0\\x2e\\xed\\x9a\\x8d\\x1d\\xe9\\x93\\x54\\xac\\x26\\x48\\xb4\\x8b\\x96\\xab\\x1b\\x80\\xcc\\xa6\\xca\\xe1\\x87\\x7f\\x37\\xd7\\x04\\x28\\xbb\\x50\\x85\\x0e\\x03\\x08\\xdb\\x0b\\x42\\x30\\x87\\xbf\\x7d\\xde\\x27\\x9e\\x09\\x67\\x66\\xf2\\xab\\x3a\\xb2\\x38\\x5b\\x04\\x64\\xa5\\xbe\\xd7\\xbb\\xd8\\xd4\\x57\\xe9\\x35\\xe2\\x00\\xaa\\xaa\\x8d\\x95\\x15\\x70\\xe0\\x53\\x07\\x6d\\xb1\\x8a\\x6a\\x62\\xf7\\x2b\\x31\\x95\\x79\\x88\\x4a\\x08\\x26\\xba\\x2b\\x43\\x63\\x71\\xdd\\x21\\x8b\\x01\\xa0\\xc5\\xe5\\x8d\\x0c\\xd5\\xff\\x98\\x25\\xe4\\x46\\x6f\\xe9\\x66\\xdf\\x05\\xcc\\x31\\xc8\\x03\\xe5\\x21\\x21\\x83\\xdd\\xf2\\x9c\\xef\\x7f\\xb9\\x16\\x48\\xa4\\xf8\\xee\\x19\\xfd\\x5f\\x8d\\xbd\\x8a\\x56\\xbe\\x7a\\xbf\\x33\\x65\\x9a\\x92\\x24\\xa1\\xe2\\x7a\\x10\\x24\\xef\\xfd\\xfb\\x88\\xe8\\x80\\x61\\x48\\xd0\\xd1\\x78\\x09\\x06\\xaf\\x1e\\xbe\\x3e\\x5f\\x14\\x36\\x31\\x90\\xd8\\x8c\\xc6\\xe5\\x08\\x94\\x44\\xf1\\x25\\xd0\\x63\\x15\\x5d\\xcf\\x86\\xca\\x92\\x63\\xf2\\xf5\\xf1\\x83\\xc2\\x69\\x74\\xfe\\x00\\x0b\\x93\\x42\\xd2\\x4c\\x78\\x1e\\x20\\x58\\x28\\x7c\\xb6\\xf3\\xf1\\xe3\\x27\\x0c\\x22\\xb7\\x70\\x7b\\x83\\x23\\xa5\\xcc\\x8d\\xb8\\x1a\\xa9\\x06\\xbb\\x59\\xd6\\x96\\xcb\\x97\\xcc\\x74\\xe3\\x59\\x59\\x5f\\xfb\\x83\\x73\\xca\\xd3\\x71\\x0e\\xa0\\x9e\\xa9\\x74\\x4c\\x20\\xe9\\xa1\\x2e\\x05\\xbe\\x5a\\x95\\xf0\\x85\\xac\\x56\\x16\\x78\\xd7\\xda\\x43\\x2e\\x4c\\x7c\\xb5\\x3e\\x12\\x71\\xdf\\x5c\\xd5\\xa3\\x39\\xd2\\xd7\\x52\\x0f\\x1c\\x18\\x48\\xd1\\x50\\x71\\xd8\\xc6\\x98\\x46\\xb2\\x3c\\x5d\\x24\\x32\\xc7\\x38\\x90\\xf2\\xed\\xed\\x37\\xc3\\xd2\\x96\\x4a\\x4b\\x5b\\x55\\x22\\x58\\x88\\xe8\\x92\\xf5\\x26\\xd1\\xca\\xc3\\x1e\\xac\\x35\\x6f\\x36\\x1c\\x2b\\xf3\\x36\\xc4\\x62\\xd6\\x0c\\x82\\xe8\\x2b\\x61\\x6f\\x2a\\x51\\x9c\\x2f\\x67\\xbf\\x01\\x29\\x03\\x69\\xbe\\x9b\\x55\\xe9\\xf5\\xc8\\xce\\xc4\\xf2\\xe1\\xb2\\xab\\x30\\x25\\x06\\xc9\\x03\\xdc\\x3e\\x7b\\x9c\\x97\\x81\\x41\\xdc\\x90\\x4b\\x01\\xb1\\xc2\\x3d\\x25\\x00\\x43\\x99\\xbf\\x8b\\x73\\xd6\\x9c\\xd5\\x39\\xc7\\x9a\\xf5\\xe9\\xa0\\xa5\\x11\\xec\\xa2\\x21\\x07\\x8a\\x1f\\xf7\\xb0\\xf6\\x04\\xae\\xa8\\x42\\x46\\xc3\\xcb\\x32\\xdb\\x93\\x81\\xbe\\x12\\x17\\x67\\xe0\\x97\\xbe\\xa5\\x17\\xbf\\xcd\\x82\\xdf\\xe9\\x21\\x37\\x98\\x40\\xef\\xb4\\xb6\\xf0\\x2a\\x48\\xec\\xda\\xf1\\x2d\\x2c\\xd3\\x89\\x30\\xd4\\x47\\x3a\\xdf\\x97\\xcd\\x71\\xdc\\x4e\\xa1\\x03\\x82\\xf4\\xf5\\xd1\\xdd\\x75\\x62\\xcd\\x4b\\xf5\\x11\\x59\\x32\\xf6\\xc4\\x70\\x0a\\xa8\\xfe\\x8d\\xec\\xa9\\xd5\\xe7\\x27\\x79\\x02\\xb8\\xf8\\x86\\x52\\x97\\x65\\xdb\\x24\\x86\\x07\\x4b\\x23\\xa1\\x9f\\xd4\\xb0\\x43\\x56\\xbf\\xa6\\x22\\x6c\\x82\\xba\\xf6\\x9a\\x08\\x7d\\x9c\\xa1\\x88\\x23\\xf8\\xe3\\xe6\\x83\\x08\\xe1\\x6b\\x80\\x4c\\x36\\x3d\\xf5\\xb6\\x30\\x7e\\x76\\x24\\x0d\\xb1\\xed\\x84\\x1b\\x61\\x2d\\x65\\x54\\x8d\\xdf\\xbe\\x83\\x67\\xda\\x60\\x77\\x2c\\x6a\\xff\\x55\\x4d\\xc8\\x5d\\x04\\x19\\x48\\x34\\x5e\\x56\\x7d\\xa9\\x33\\x31\\x51\\x85\\x8f\\xdf\\x69\\x93\\x27\\x39\\x25\\xbf\\xdc\\x71\\x81\\xb5\\xf6\\x46\\xd0\\x63\\xa8\\xc8\\xf3\\x10\\x56\\x9b\\x0e\\xd0\\x93\\xbd\\x9d\\xff\\x04\\xfe\\xbf\\x0b\\x41\\xc6\\xdc\\x55\\x16\\x9a\\x14\\xa3\\xc8\\x62\\xe5\\x41\\x6f\\x1e\\x58\\x2f\\xde\\xe8\\xfe\\x87\\xdc\"},\n{{0xbf,0x3c,0x0c,0xbb,0xbe,0x20,0xbe,0x2a,0xcf,0xaf,0xb2,0x7a,0x36,0x11,0xb4,0x89,0x21,0xa7,0x28,0xab,0x17,0x33,0x4b,0x8a,0xfd,0xee,0x83,0x05,0x17,0x8f,0x61,0x3b,},{0x45,0x00,0xa0,0x3c,0x3a,0x3f,0xc7,0x8a,0xc7,0x9d,0x0c,0x6e,0x03,0xdf,0xc2,0x7c,0xfc,0x36,0x16,0xa4,0x2e,0xd2,0xc8,0xc1,0x87,0x88,0x6d,0x4e,0x6e,0x0c,0x27,0xfd,},{0x8f,0x87,0x03,0xbc,0xf4,0xc0,0x32,0x94,0x17,0x33,0x9e,0xb0,0x26,0xf2,0xb7,0x2d,0x31,0x4d,0x92,0x2e,0x9a,0xcc,0xb5,0xd8,0xbb,0x7e,0xec,0x87,0xe0,0x7e,0x61,0x38,0x55,0x16,0x72,0xa6,0x13,0x2c,0xb4,0xf8,0x75,0x50,0x8e,0xd3,0x29,0x95,0x67,0xb4,0xa7,0x41,0x34,0xd2,0xbd,0xf0,0xd8,0x57,0xf9,0x80,0x86,0x1d,0x18,0xbe,0x7e,0x01,},\"\\x8f\\x30\\xba\\x2f\\x79\\x2e\\x9a\\x97\\xf6\\xea\\xfe\\x29\\xf9\\x76\\xa4\\x80\\x28\\xcb\\x88\\x57\\xb5\\xc7\\x98\\xbc\\x2b\\x61\\x68\\xc4\\x64\\x44\\xc0\\xce\\x69\\x60\\x70\\x37\\x4c\\x5e\\x6a\\x40\\xc3\\xd1\\x8a\\x5d\\xc7\\x66\\x9f\\xc4\\x1d\\xb9\\xa8\\x1c\\xff\\x75\\x9b\\x8c\\xa0\\x15\\x98\\x71\\xc3\\x44\\x2e\\x8c\\x75\\x12\\x69\\x8f\\xa4\\x47\\xb5\\x78\\x3e\\xe0\\x1d\\x1b\\x61\\x14\\x49\\xab\\xad\\x23\\x71\\x62\\x92\\x2b\\x02\\xd1\\xae\\xc5\\xde\\x1d\\x66\\x6f\\x17\\xda\\x16\\x13\\x10\\x63\\x01\\xd3\\x05\\x86\\xd1\\x16\\xe2\\xac\\x09\\x00\\x7d\\xd7\\x1e\\x81\\x23\\xed\\xe4\\xc5\\xa6\\xa9\\xac\\x07\\x7f\\xe3\\xd9\\x39\\x09\\xda\\x62\\x8e\\x86\\x58\\x70\\xa4\\xe2\\x5c\\xb3\\x55\\x91\\x67\\x5a\\x06\\x90\\xbe\\xc4\\xaf\\x02\\x81\\x71\\x4f\\xe6\\x66\\x1b\\xd5\\xc0\\x0a\\x27\\xd7\\x9f\\x95\\x9f\\xb4\\xd4\\xfb\\x16\\x36\\xa6\\xa3\\x57\\x5f\\x4f\\x01\\x47\\x06\\x63\\x89\\x9d\\x73\\x74\\x72\\xb0\\x96\\xbe\\x4d\\xb7\\x23\\x71\\x53\\x67\\xa4\\x1a\\x3a\\x4c\\x13\\xf7\\x42\\xd9\\x08\\xf4\\xd9\\x21\\xcf\\xdd\\x15\\x6e\\x75\\x86\\x82\\x61\\xba\\x9c\\x10\\xd8\\x58\\x74\\xca\\x2d\\x6c\\x0c\\x9e\\x72\\x95\\xe5\\x66\\x2b\\xd9\\x16\\xa3\\x63\\xc7\\xa7\\x96\\xea\\xd6\\x17\\xc4\\x25\\x1e\\x67\\x94\\xda\\x06\\xc3\\xd0\\x8f\\x2f\\xdc\\x38\\x86\\x94\\x4a\\x75\\x09\\xe6\\x40\\x9c\\x90\\x6b\\x59\\x31\\x13\\xb4\\xb1\\xf9\\x85\\x01\\x32\\x96\\x0d\\x9f\\x3a\\x4e\\xeb\\x73\\x86\\xfa\\x59\\x2f\\x61\\x93\\xbe\\xab\\x8e\\x0f\\xf0\\xf2\\x89\\x08\\xa0\\xd5\\x48\\xdb\\x87\\xba\\xe9\\x78\\xb0\\x5a\\xbb\\xca\\x9b\\x3e\\x96\\xd8\\x79\\x5b\\x88\\x07\\x7f\\x62\\x0f\\x21\\x24\\xe3\\x15\\x90\\xeb\\x09\\x9e\\x94\\xe0\\xe6\\xe3\\xcd\\x62\\x0a\\xe6\\x29\\x0f\\x3e\\x2d\\x01\\x46\\x7e\\x5b\\xef\\x4f\\xab\\xde\\xf7\\x9d\\x9a\\xb9\\x23\\x9e\\x75\\x3e\\xc4\\xfa\\x0b\\xb1\\x10\\xff\\x1d\\x39\\x3f\\xca\\x02\\x24\\x35\\x02\\xd7\\xe9\\x87\\x99\\x1e\\xb7\\x6d\\x08\\xf8\\xbe\\x7e\\xb2\\xb1\\xee\\x00\\xc3\\xb6\\x8b\\xbf\\x72\\xa6\\x23\\xba\\xa1\\x5b\\xe8\\x96\\xb3\\x21\\x5e\\xbe\\x8a\\x82\\x31\\x31\\x09\\xfc\\x62\\x9b\\x0c\\xce\\x64\\x91\\xf8\\x13\\xc2\\x49\\x70\\xe4\\xff\\xe6\\x86\\x9e\\x40\\xb4\\x6b\\x4e\\xd2\\x29\\x86\\xd0\\x04\\x21\\x55\\x27\\x6c\\x23\\x0d\\xe4\\xc0\\x5d\\x67\\x85\\x52\\xf2\\xe8\\x51\\xca\\xcf\\x5a\\x47\\x21\\x57\\xdb\\xb1\\xa9\\x9a\\x2b\\x42\\xff\\x40\\x37\\xf0\\xdc\\x63\\x80\\x67\\x29\\x21\\xc9\\x09\\x20\\x6e\\x80\\x05\\x0e\\x61\\xa6\\xb3\\x05\\x6b\\x17\\xe3\\xae\\x83\\x50\\x09\\xb2\\x04\\x19\\xa3\\xb9\\x84\\x6d\\x37\\x48\\x92\\xe7\\x19\\xf1\\xb3\\x5b\\xc1\\x25\\x7d\\xa9\\x3c\\xcc\\x6d\\x8f\\x8f\\xca\\xa8\\xe6\\x09\\xa8\\xd2\\x04\\xdf\\x10\\x8b\\xe7\\x19\\x34\\x67\\xe7\\xf1\\x05\\x93\\x52\\x82\\xc3\\xfe\\x66\\x70\\xa5\\x32\\x94\\x42\\xea\\x3e\\xdd\\xa2\\x37\\x6a\\x03\\xa1\\xcf\\xe8\\x72\\x3a\\x90\\x9c\\x06\\x4d\\x30\\xfe\\x9b\\xb0\\x21\\x2c\\x33\\xaf\\xe2\\xbe\\xa3\\x0c\\x91\\x43\\xc0\\x01\\xda\\x01\\xc7\\xed\\x50\\x45\\x59\\xb9\\x7f\\xe2\\xce\\xa0\\x9b\\xeb\\x9d\\xb5\\x19\\x00\\xdc\\x13\\x67\\x05\\x92\\x1e\\x20\\x29\\x78\\x45\\xba\\x72\\xa9\\x7a\\xa7\\xc9\\x53\\x81\\x45\\x71\\xbe\\x3f\\x08\\xce\\xf9\\x68\\x04\\x5a\\x5a\\xc3\\x40\\x04\\xf6\\x7f\\xbf\\xa5\\x4e\\x99\\x6b\\x31\\x1b\\xd8\\xdc\\x52\\x7d\\x89\\xe1\\xd4\\xf5\\x34\\x53\\xa6\\x71\\x37\\x20\\x10\\x1c\\x45\\xa6\\x0e\\xe3\\xa0\\x5c\\x2e\\xe6\\x6f\\x13\\x4b\\x5a\\xf4\\x0e\\x4b\\x70\\xef\\x37\\xba\\x3f\\x0a\\xfd\\xef\\xc0\\x39\\xf3\\x42\\xc2\\x8a\\xf9\\x19\\x82\\x51\\x38\\x1a\\x10\\x79\\xa5\\xdd\\x03\\x5a\\x8c\\x28\\x97\\x6c\\x6b\\x7f\\x4d\\xb0\\x9e\\xa3\\x83\\xa3\\xa8\\x7f\\x0f\\x85\\x1f\\xd3\\x31\\xae\\xa7\\xfa\\x4b\\xfc\\xd9\\x56\\x31\\xd6\\x52\\xfa\\x2f\\x50\\xf1\\xc2\\x3f\\xf2\\xbc\\x13\\x7a\\x06\\x04\\xe3\\xd9\\xf3\\x9c\\xcb\\x96\\x51\\x45\\xbc\\xa4\\x8b\\x06\\xdc\\x8a\\x81\\x75\\x47\\xb6\\x25\\xef\\xfa\\x79\\x6d\\x00\\x0c\\x37\\x74\\xba\\xd1\\x98\\xdb\\x12\\x41\\xbe\\x7a\\x2c\\x0d\\xc4\\xa4\\x64\\x1b\\x9a\\x8c\\xb9\\xcb\\x8c\\x8c\\x38\\x87\\x57\\x6f\\x52\\x72\\xc3\\x3a\\xaf\\xfe\\x45\\x61\\x5f\\x51\\xa9\\x6f\\xae\\x76\\xcf\\x51\\x25\\xbc\\x69\\xad\\x0a\\x40\\x38\\x79\\x07\\x99\\xb5\\xc2\\x62\\x44\\x21\\xa6\\x43\\x3d\\xba\\xb3\\x9c\\xcc\\xb0\\xb1\\x78\\x7b\\x5b\\xce\\x28\\x95\\x94\\x48\\x9d\\x17\\xed\\xb5\\xf9\\x31\\x03\\x74\\x80\\x7d\\x36\\xc6\\xe6\\x73\\x47\\x26\\xbb\\x33\\x00\\x4e\\xca\\xe8\\xbb\\x69\\x1d\\xcd\\x38\\x76\\x01\\xf4\\xea\\x91\\x1b\\x4b\\x90\\xeb\\xff\\x75\\x6d\\x7d\\x8d\\x9e\\xb4\\x22\\xcb\\xb9\\xaa\\xf7\\xf4\\x77\\x2e\\x0a\\x54\\x36\\x43\\x06\\x85\\xe5\\x7b\\x69\\x74\\x54\\xe8\\x2e\\xea\\xdc\\xe4\\xab\\xa0\\x62\\xb7\\x76\\x82\\xcf\\x21\\x9b\\xe1\\xfd\\x9b\\x00\\xf1\\xcb\\x11\\x35\\xa1\\x02\\x13\\x49\\x53\\x9a\\x4b\\x93\\xae\\x21\\x3f\\x19\\x3d\\x29\\x32\\x73\\x8e\\xf7\\x29\\x20\\x49\\x9b\\x7b\\xe2\\xa8\\x1c\\x9b\\xaa\\xed\\x17\\xc5\\x46\\x41\\xa5\\x97\\x4d\\x27\\x22\\x32\\x41\\xe3\\xc6\\xa0\\x95\\x22\\x6b\\xd2\\x37\\xe0\\x59\\x1e\\x00\\x2b\\x3a\\xf0\\x56\\x5d\\xf3\\xe9\\x76\\x42\\x0f\\x97\\x64\\xa0\\x9a\\xe8\\xbf\\xa2\\x79\\x5f\\x8f\\xad\\x7f\\xc6\\x87\\xbd\\x2d\\xe2\\x3d\\x14\\x88\\xf4\\x49\\xd8\"},\n{{0x28,0x7f,0xaf,0xd2,0x13,0x74,0x57,0x2f,0x57,0x81,0x00,0x47,0xd0,0xd9,0x8c,0xb1,0xff,0x3d,0x01,0x20,0xfa,0xa4,0x88,0x61,0x32,0x24,0x57,0x32,0xc1,0xa6,0xab,0x78,},{0xe8,0x25,0x20,0x63,0xf5,0xad,0x7e,0x95,0xbd,0x05,0xc5,0x02,0xa8,0xbc,0x4a,0x17,0x55,0x63,0x60,0x86,0x9b,0x9d,0xe0,0xa3,0xb8,0x58,0x93,0x8e,0x11,0x11,0x76,0x19,},{0x62,0x01,0xe3,0x05,0x91,0xd3,0x6b,0x7b,0x22,0x6e,0x36,0xfd,0xf5,0x64,0x34,0xc4,0x7c,0xd3,0x05,0x18,0x37,0xaf,0x31,0x31,0x3a,0x99,0x17,0xfd,0x02,0xdd,0xed,0x2b,0x5b,0xbb,0x4b,0xbc,0x36,0x8b,0x3b,0xd1,0x5d,0x06,0x20,0x45,0xf1,0x05,0xb6,0xe7,0x34,0x1b,0x15,0x15,0x0d,0x36,0xf9,0x00,0x87,0x59,0x1d,0x83,0x99,0x01,0xb8,0x01,},\"\\xb3\\xc4\\x43\\xe4\\xe5\\x89\\x9c\\x16\\xd3\\x9e\\x81\\xb4\\xf8\\x07\\x40\\x42\\xa9\\x04\\xa7\\x35\\x07\\x4b\\x27\\x95\\xd9\\xac\\x06\\xb1\\x37\\x9e\\xf7\\x61\\x8d\\x2a\\x53\\x4b\\x6b\\xef\\x81\\x56\\x9e\\x60\\x71\\x92\\x67\\xbf\\x29\\xcd\\x9d\\x16\\xac\\xc9\\xa1\\x74\\xd8\\x02\\x6b\\x14\\xb1\\x27\\xd0\\xd2\\xd8\\xb4\\x58\\x39\\x98\\x89\\x5a\\xd7\\xef\\x72\\xfe\\xdc\\x53\\xb8\\xf0\\x8a\\x22\\x50\\x10\\x0e\\x1f\\x1f\\x0a\\xab\\x48\\xbc\\x70\\x74\\x64\\x34\\x88\\xe6\\xb6\\x70\\xe1\\xb0\\x72\\x7c\\x38\\x5a\\x34\\xff\\x65\\xa0\\xd7\\xe8\\x3b\\xa8\\x60\\x83\\xb8\\x73\\xdf\\xf0\\x55\\x92\\x09\\xb1\\x4b\\x2a\\xc4\\x2b\\xf7\\xc5\\x72\\xd0\\xc5\\x91\\x7a\\xc4\\x2e\\x4a\\xe4\\xda\\xe1\\xdd\\x42\\x35\\x79\\x52\\x76\\xa0\\x76\\x13\\x2c\\xfe\\x3e\\x0c\\x35\\x0b\\x26\\x58\\x0f\\xbb\\x3a\\xf8\\x17\\x77\\xb9\\x3a\\xd9\\x5c\\xb7\\xff\\x17\\xc2\\xd9\\x80\\xce\\x0d\\x49\\x2f\\x6d\\x40\\xfa\\x90\\xba\\x3f\\xca\\xa2\\x1b\\xb6\\x87\\x35\\xee\\x1e\\xf2\\x08\\x49\\x5e\\xbf\\x7b\\x02\\x27\\x6f\\xfa\\x1e\\xfc\\x08\\x16\\x58\\xbb\\x44\\xcd\\x27\\x61\\xef\\x5e\\x3e\\x1c\\xa6\\x0e\\xc8\\xb5\\xd8\\x16\\xd4\\xab\\xac\\xd0\\xbc\\xc8\\x02\\x68\\xd8\\xf4\\xdf\\x8b\\x3a\\x52\\x04\\x9d\\xb0\\x15\\x7e\\x2b\\x6e\\x81\\xac\\xd6\\xf3\\xf2\\x89\\x47\\xc0\\x76\\x27\\x95\\x5c\\xda\\xc9\\xea\\xa1\\xde\\x17\\xd4\\xb9\\xda\\xa3\\x61\\xfb\\x49\\x78\\x26\\x64\\xd7\\xd6\\xd2\\xca\\x5c\\xec\\x6d\\x14\\x89\\x3c\\x3e\\x80\\xb6\\xd1\\x6d\\xaa\\xcf\\xfc\\xc0\\xb7\\x59\\x37\\xe8\\xbe\\xf6\\xf9\\xe1\\x12\\xa8\\x7f\\x4b\\x03\\x5f\\x90\\x36\\x07\\x0a\\x2c\\xcc\\x55\\xc2\\xaa\\xd9\\x39\\xdf\\x67\\x4f\\x7e\\x4e\\x12\\x68\\x5e\\x01\\x6e\\xa0\\xe4\\x90\\x2a\\xaa\\xaf\\xaf\\xfe\\x38\\xdd\\xb2\\xf9\\x0d\\x9c\\xf7\\x85\\x37\\xf6\\x13\\x91\\x69\\x6f\\xf0\\x33\\x0a\\xe8\\xf7\\x9a\\x1c\\x1e\\xd5\\xd5\\x2b\\x4e\\xe2\\xa6\\x2d\\x90\\xfb\\x82\\xd9\\xa4\\x83\\x93\\xfa\\x33\\x81\\x0b\\x40\\xd0\\x45\\x59\\x02\\xd5\\x74\\xff\\x05\\x20\\x03\\xe0\\x16\\x0c\\x0f\\x47\\xb5\\xe5\\x80\\xa0\\x78\\xbc\\xee\\xf0\\x60\\x73\\xdd\\xa8\\xb2\\xd1\\xf1\\x04\\xa5\\x95\\xe9\\x0b\\xb6\\xa4\\x8e\\xdd\\xd8\\x65\\xf1\\xca\\xe4\\xf1\\x78\\xfe\\x22\\xe7\\x5f\\x2f\\x61\\x24\\xa9\\xda\\x06\\x82\\x44\\x71\\x12\\xb3\\xdb\\x5b\\xe8\\xc4\\x24\\x72\\xb2\\x41\\xe9\\x44\\xfd\\x23\\x70\\xc2\\xdc\\x27\\x15\\xc0\\x5a\\x41\\xbd\\xbc\\x89\\x0c\\x41\\xc6\\x5f\\xb0\\x8c\\x2f\\x59\\x31\\x74\\x39\\x1a\\xc8\\x80\\xf3\\xcb\\x67\\xd1\\xb7\\x4f\\xf8\\x02\\xef\\x96\\x2a\\xfe\\xf7\\xb9\\xf3\\xea\\x32\\x6f\\x95\\x27\\xe7\\xfb\\xa6\\x98\\x18\\x79\\x24\\xb6\\x4c\\xcd\\xd0\\x86\\x62\\x48\\xc7\\x6e\\xe6\\x4c\\x79\\x06\\x9b\\xe0\\xa0\\x57\\xb1\\x0a\\xe1\\x90\\xf3\\x8f\\xf5\\xab\\xa8\\x44\\xe3\\x93\\x31\\xcf\\x1d\\xb1\\x3c\\x90\\x09\\x06\\xbe\\xe0\\xd7\\xe7\\x54\\x6e\\xf5\\x23\\x24\\xe3\\x7c\\x59\\x06\\x75\\xf1\\x39\\xf5\\x8f\\x57\\x3a\\x49\\x4f\\x4a\\xe8\\x2c\\x4e\\xc8\\x10\\x66\\xa6\\x8e\\x2d\\x92\\x90\\x01\\x91\\xc4\\x7d\\x30\\x62\\xf0\\xf9\\xaa\\xed\\x19\\x11\\x37\\xcd\\xa9\\xb8\\x3c\\xd1\\x30\\xe8\\x26\\x29\\x60\\xe6\\x24\\x4f\\x8f\\x6e\\xf3\\x9f\\x15\\xa4\\xfe\\xd1\\x3c\\xb6\\x69\\xed\\xc1\\x9f\\x5c\\xe1\\x62\\xce\\xb8\\xd2\\x42\\xb9\\xad\\xdb\\xfb\\xa8\\x77\\x2c\\xe7\\x49\\x85\\xa5\\xf3\\x72\\x0d\\x59\\x0a\\x92\\x0e\\x1d\\xca\\x75\\xa8\\x79\\xb1\\xaa\\x45\\x9f\\x74\\x62\\xff\\xf2\\xe9\\x50\\x72\\x76\\x1b\\x20\\x92\\x54\\xfe\\x38\\xc5\\x4d\\x83\\x3a\\x8e\\x2c\\xb8\\xfc\\x40\\xc5\\x98\\xf3\\xc7\\xf7\\xd6\\xc5\\x70\\x57\\x15\\xd0\\x30\\x8d\\xc3\\x0e\\xaa\\x84\\x67\\x6d\\x20\\x9d\\x7b\\x7b\\x31\\x34\\x47\\x56\\xe6\\x9a\\x9a\\x4c\\xb4\\xe4\\xa2\\x51\\x81\\x7a\\x37\\x86\\xfe\\xa6\\x72\\x8d\\xd6\\x08\\x22\\x33\\x6b\\x45\\xae\\x5d\\x47\\xc7\\x04\\xb4\\x5c\\x4c\\xad\\x38\\xc1\\xe0\\x1a\\xb9\\x3d\\x14\\x16\\x92\\xd5\\x5d\\x12\\xfd\\xb9\\x74\\x0f\\x1d\\x18\\x15\\x82\\xf1\\xc4\\x8c\\xe5\\x43\\x48\\x60\\xd9\\x30\\xf0\\xe7\\xe7\\x0e\\xdc\\xff\\xb8\\x55\\x60\\xa5\\x3d\\xba\\x95\\xd5\\x7b\\x31\\xe8\\x92\\x41\\x37\\xbc\\x2c\\x19\\xe3\\x4b\\xb9\\xc9\\x86\\x68\\x77\\x17\\x42\\x80\\xe8\\x0c\\x23\\x97\\x8d\\x57\\x79\\x58\\x64\\xa7\\x37\\x4a\\xef\\x38\\x3f\\x3b\\xf6\\x37\\x53\\x59\\xbf\\x63\\x56\\x47\\x40\\x09\\x84\\x61\\xa6\\xc7\\x6e\\x8f\\x23\\x89\\x13\\x28\\x87\\x69\\xa1\\xcb\\x1c\\x95\\xb2\\x2c\\x32\\xa9\\xeb\\xb3\\xec\\xeb\\x04\\x8e\\xe3\\x24\\xcf\\x0d\\x7e\\x85\\xa3\\x89\\xb0\\x4d\\xed\\xbb\\xcb\\xee\\xf2\\x98\\xd0\\x52\\x78\\x16\\x08\\x5c\\x0c\\x83\\xef\\xaa\\x29\\x85\\x46\\xe8\\x39\\x0b\\xd1\\xbf\\xe4\\x65\\xec\\x1b\\xaf\\xae\\x69\\xee\\x52\\x18\\xe7\\x2c\\xae\\xdb\\x9b\\x64\\x9c\\xf7\\x3e\\xec\\x45\\x4a\\x2b\\x48\\x49\\x65\\x17\\x96\\x72\\xde\\xbc\\xf9\\x44\\x13\\x63\\x99\\x5a\\x8a\\x90\\x7d\\xe1\\x7d\\xc0\\x68\\x4f\\x2a\\xea\\x57\\x9a\\x2f\\xb4\\x48\\x41\\x95\\xdb\\x41\\x15\\xca\\x32\\xe9\\x70\\x52\\x6d\\xc0\\x0a\\x5c\\xac\\xaf\\x58\\x87\\x11\\xdb\\xd4\\x69\\xce\\x80\\xbd\\x29\\x7c\\x4f\\x41\\xd6\\xfa\\x28\\xa5\\x97\\xc6\\x37\\x2c\\x0d\\x21\\x49\\x60\\xb5\\x45\\x98\\xcd\\x8b\\xc8\\x49\\xeb\\xdc\\xa3\\x6d\\x62\\x25\\xb2\\x0d\\xec\\x0d\\x03\\x11\\x69\\xce\\xbb\\x36\\xea\\xdc\\x3a\"},\n{{0x9a,0xd0,0x49,0x10,0x08,0x51,0xd0,0xf7,0x9b,0x71,0x12,0x25,0xc9,0x88,0x47,0x79,0x5a,0xcf,0xc3,0x60,0x1c,0x14,0xb8,0xa9,0x77,0x8d,0x62,0x70,0xcd,0x4c,0x05,0xed,},{0xe7,0xca,0xcf,0x4f,0x37,0x14,0x54,0x3c,0x27,0xa3,0xe9,0xed,0x83,0x3b,0xaf,0x3b,0xde,0x4c,0x09,0x56,0x3b,0xef,0x59,0xe7,0x63,0xfa,0xb7,0x1f,0xb5,0xe4,0xff,0x56,},{0xfe,0xc0,0xaf,0x34,0xcb,0xc5,0xcf,0xfc,0x56,0xe9,0x6d,0xd5,0xed,0x59,0x68,0xe5,0x2c,0xbd,0x42,0x69,0x84,0x4f,0xc3,0x0e,0x3a,0xb0,0xd3,0x47,0x2b,0x5d,0x18,0x0c,0x8d,0x1b,0x76,0x90,0x51,0x8f,0x41,0xf1,0x44,0x38,0xe7,0xf3,0xa8,0x3d,0x5e,0x89,0x76,0xcb,0x9a,0x26,0x15,0x1f,0xc4,0x14,0x9a,0x32,0x98,0xd7,0xe4,0x2c,0x05,0x03,},\"\\xc2\\x84\\xbd\\xd8\\xf8\\x27\\x5b\\x49\\xac\\x80\\x8c\\x39\\x04\\x5e\\x50\\xe1\\xed\\x50\\xc8\\xa1\\xaf\\xd0\\x11\\xaf\\xe5\\xdb\\x3d\\xda\\x62\\x0b\\xe8\\xae\\xc3\\x7f\\x45\\x60\\x57\\x62\\xe2\\x25\\xd0\\x41\\x11\\xf2\\x1b\\x49\\xfc\\xef\\xca\\x3f\\x3d\\x5f\\x81\\x3b\\x20\\x20\\xa5\\x2c\\x49\\xf9\\x5c\\x4a\\xd6\\x1c\\xa2\\x14\\x61\\x8a\\xde\\x7e\\xed\\x6c\\xd8\\xd3\\x14\\xdc\\x4c\\x63\\x55\\x95\\x52\\x77\\xd4\\x57\\x46\\x2f\\x03\\xb9\\xfb\\xa2\\xe2\\x25\\xb1\\xb5\\x37\\xcd\\x4b\\x52\\x37\\x50\\x5c\\x90\\xd4\\x32\\x05\\xe1\\x71\\x5c\\x39\\x63\\xcc\\xfb\\xec\\x37\\x9e\\x6c\\x17\\x05\\xe0\\x80\\x34\\xa3\\x1a\\xfc\\xe6\\x46\\x72\\x7e\\x78\\xa2\\x0e\\xed\\x88\\xae\\xb0\\xdc\\xda\\xbc\\x5c\\x86\\xe8\\x69\\x79\\xe6\\x3a\\x5c\\x26\\xc3\\xe2\\x17\\x79\\x73\\xb6\\x98\\x3c\\xeb\\xfe\\xda\\x9f\\x31\\x47\\x93\\x61\\xb6\\x61\\x76\\x3a\\xa7\\x26\\x1c\\x09\\x39\\xca\\xd4\\x8b\\x71\\x90\\x8e\\xa9\\x07\\x68\\xbb\\x6c\\x95\\x83\\xd8\\xea\\xeb\\x9e\\x03\\x38\\x51\\x5a\\xca\\x12\\x42\\x62\\x6d\\xc6\\xbe\\x04\\xec\\xc4\\x42\\x9e\\x4c\\xbb\\x4f\\xf3\\x36\\x09\\x61\\x92\\xf7\\x50\\x1e\\xc4\\x71\\xb5\\x96\\xa9\\x9d\\x4c\\x02\\x75\\x82\\xcc\\x69\\xe2\\x04\\xb6\\xfb\\xcd\\xdf\\x59\\xf5\\xbf\\x74\\x62\\xdd\\xcd\\x59\\x89\\x12\\x1f\\xd1\\x0f\\x11\\xa0\\x67\\x5b\\x6c\\x4e\\x4f\\x65\\x20\\xd2\\x7d\\x7c\\x61\\x43\\x1b\\xa7\\xd1\\x74\\xf5\\x73\\x95\\xa0\\xbf\\x72\\xd3\\x8c\\x11\\x42\\x73\\x6d\\xed\\x6b\\x91\\xe4\\x81\\x1c\\x0e\\x85\\x41\\xa6\\xc0\\xd9\\x96\\xc5\\xa1\\x7d\\xc9\\x7d\\xb3\\x88\\xf7\\x21\\xd2\\x35\\x7d\\x3c\\x6a\\xf5\\xc8\\x6b\\x1d\\x5e\\x47\\x6e\\xa0\\xac\\x0b\\x1c\\x11\\xd4\\x38\\x7f\\x76\\x90\\x39\\xbd\\xf5\\x38\\xa0\\x21\\x6e\\xdd\\x00\\x45\\xee\\x6d\\xd8\\x9e\\xef\\x82\\xa4\\x25\\xa8\\x3f\\xaa\\x1b\\x12\\x80\\x70\\x38\\xca\\x19\\xeb\\xec\\x00\\x2e\\x8b\\x3c\\x15\\x34\\x4c\\x61\\xcf\\xd1\\xe5\\xf0\\xe3\\xb0\\x27\\x3d\\xeb\\x37\\x27\\x8c\\xf1\\x97\\xd8\\xa8\\x3b\\x13\\xd9\\x92\\x30\\x8a\\x51\\x37\\x3e\\xb3\\x81\\x14\\xc9\\xe4\\x5b\\x43\\x87\\x80\\x27\\x7d\\x1e\\x32\\xf3\\x97\\x29\\x62\\xa3\\xe1\\x4a\\x8d\\x08\\xdb\\x9f\\x09\\xae\\xc3\\xdd\\x32\\xa5\\xb9\\x94\\x23\\xe6\\x1f\\x5e\\x79\\x94\\x4a\\xb5\\x7a\\x36\\xf6\\xec\\x07\\xcc\\x32\\x04\\xf9\\x16\\x5e\\xe0\\x21\\xad\\xa9\\x3e\\x6f\\xec\\xb7\\xec\\x45\\x6a\\xa0\\x28\\x8c\\x37\\x8a\\x75\\xaf\\xd6\\xe9\\xda\\xd6\\xc6\\xf8\\x8e\\x95\\x9a\\x2c\\xf2\\x8b\\xfe\\x56\\xd2\\xe6\\x1b\\x2a\\xda\\xec\\xf0\\xd8\\x6d\\xd8\\x92\\x8b\\xce\\xda\\x26\\xb0\\x54\\x02\\x46\\xb7\\x33\\x7f\\x5c\\xdc\\xec\\x11\\xfb\\x0c\\x1a\\x59\\xd6\\x31\\xfc\\xca\\x19\\x40\\x8f\\x95\\x22\\xb6\\x8a\\x39\\xf8\\x6e\\xf9\\x70\\xb8\\x83\\xa0\\xf0\\xbd\\x6b\\x7b\\x14\\x15\\xec\\x9a\\xa0\\x43\\xb5\\x2e\\x19\\xba\\xc1\\x76\\xd6\\x7b\\x79\\xe2\\xa5\\xdc\\xa8\\xbf\\xd2\\x91\\x02\\xac\\x60\\x8e\\x47\\x3e\\x9f\\x98\\x2c\\x3e\\xc8\\x93\\x2d\\x8a\\xa8\\xcd\\x56\\x52\\x84\\x49\\x1d\\xe5\\x2f\\x51\\x6b\\x9e\\xbf\\xb7\\xdb\\xe1\\x29\\x95\\x11\\xae\\x73\\x2c\\x2a\\xd1\\xee\\x49\\x92\\xb0\\x77\\xfa\\xff\\xc6\\x5f\\x48\\x8f\\x1b\\xa2\\x15\\xda\\x69\\x79\\x60\\x09\\x71\\x19\\x6d\\x0f\\xf3\\xa0\\x8a\\xd9\\xf0\\x0e\\x82\\x9c\\x1d\\xe1\\xaf\\xca\\x10\\xca\\x47\\x6b\\xe6\\x64\\xaa\\xd2\\x61\\x88\\x9b\\x0e\\xb7\\xae\\xb6\\xed\\x86\\x37\\x61\\x89\\x00\\xac\\xf4\\x81\\xe2\\xd2\\x24\\xec\\x64\\xa6\\xe6\\xcf\\x4f\\xa4\\xdf\\x73\\x1b\\x7a\\x4f\\xee\\xff\\x25\\x80\\xc9\\x9b\\x6d\\x75\\xb4\\xdc\\xd0\\x97\\x69\\x65\\xcb\\x2b\\x0b\\x56\\x35\\x22\\x78\\x42\\xd0\\x8a\\x7d\\x90\\x7a\\xae\\xbc\\x2f\\xde\\xd8\\x00\\x98\\x11\\xdc\\xdd\\x73\\x35\\x49\\x21\\x75\\x3b\\xc5\\xde\\xc0\\x17\\x68\\x93\\x35\\xf5\\x6d\\x0f\\xb7\\xae\\x21\\x3b\\x41\\x79\\x2b\\x1f\\x4e\\xb1\\x4a\\x24\\x53\\x59\\x77\\xa3\\x05\\xb1\\x9e\\xb9\\x83\\x8d\\xc6\\xb5\\x15\\x28\\xb9\\x8a\\x39\\xbd\\xa0\\x60\\x10\\x71\\x7a\\x20\\x8c\\x34\\x7a\\xa1\\x58\\xee\\xcd\\xfd\\x9a\\x04\\x72\\xd3\\xb8\\xd9\\x20\\xf9\\x69\\xe1\\x2b\\x65\\x91\\x9b\\xda\\x38\\xb4\\x61\\x94\\x98\\x50\\xcc\\x9c\\xc1\\x8d\\x8e\\x3b\\xaa\\x8c\\x88\\x6d\\x93\\xcd\\x09\\x6a\\x20\\x9d\\x54\\x3c\\xa3\\x37\\x5f\\xc4\\xe7\\xd6\\x51\\x03\\xcb\\x64\\x24\\xbe\\xab\\x44\\xe8\\xbc\\x4a\\x5b\\x62\\xc2\\x9a\\x01\\xbc\\xf4\\x4d\\xcc\\x61\\xe7\\x67\\x5c\\x02\\x5d\\xec\\x07\\x24\\x20\\x01\\x94\\xbd\\xe7\\x4d\\x72\\xc0\\x2e\\x94\\xa9\\x46\\xa7\\x52\\xf3\\x60\\x84\\x57\\xfd\\x91\\xf2\\x92\\x71\\x57\\x71\\x48\\x7d\\x26\\xca\\xd4\\xe5\\xcf\\x6e\\xf7\\xc6\\xf7\\x16\\x27\\xa4\\xda\\xf8\\xa4\\xc9\\xb8\\x91\\xc1\\xee\\x8f\\x04\\xae\\xaa\\x99\\xfe\\x0c\\x8b\\x4e\\x83\\x3b\\x76\\x09\\x06\\x6b\\x61\\x32\\xa9\\x68\\x89\\x0e\\x26\\x95\\xda\\x22\\xb2\\xd8\\x57\\xc8\\xc0\\xad\\x91\\x87\\xc9\\x60\\x69\\xe4\\x76\\xe2\\x7e\\x46\\x32\\xc4\\x47\\xee\\x76\\x71\\x4a\\x31\\xd1\\xe5\\x14\\x9e\\xcb\\x33\\x7e\\xe1\\x32\\xf3\\x55\\x2d\\xa3\\x3a\\xb2\\xd6\\xfa\\x9d\\x7e\\x93\\xf6\\x8a\\x77\\xcb\\xf1\\x91\\xcb\\x06\\xbc\\x22\\xf3\\x47\\x0a\\xf6\\xd7\\x58\\x1e\\x3a\\xcc\\xbe\\xca\\x0b\\x6f\\xeb\\x08\\xa1\\x4b\\x9a\\x80\\xc1\\xef\\x59\\x37\\x4c\\xcd\\xc0\\x52\\x3c\\x36\\x84\\x50\\x4c\\x01\\x04\\xbb\\xa2\\x2c\\x10\"},\n{{0xde,0x54,0xe1,0x3f,0x9e,0x2c,0xc7,0x54,0x54,0x6c,0x99,0xb3,0x3b,0x3d,0x72,0xf4,0xd1,0xf7,0x71,0x50,0x38,0xa9,0x65,0x9f,0x33,0x63,0x65,0x77,0xbb,0x52,0x6a,0xdb,},{0x36,0x33,0x8d,0xb3,0x32,0x6b,0x00,0x5e,0x5c,0x61,0xff,0x78,0x2b,0xe2,0xea,0xb1,0x66,0xd4,0xeb,0x72,0x34,0xa9,0x8e,0xa1,0xcd,0x85,0x5e,0x1a,0xd5,0x35,0xe9,0x4c,},{0x37,0xac,0xa8,0xf2,0x48,0x39,0x4a,0x9e,0x04,0xd0,0x6a,0x7d,0xa8,0x4a,0x7d,0xef,0xa3,0x9d,0xe4,0xda,0x2b,0xcb,0x18,0xd5,0xf6,0x4c,0xc3,0x4d,0xb0,0x86,0x51,0xaf,0x4a,0xbb,0x19,0xfa,0x2a,0x92,0xa7,0xdd,0xa5,0x6e,0xc9,0x93,0x0b,0x81,0xae,0xbd,0x23,0x99,0x05,0x11,0xf6,0x84,0xc6,0xd1,0x5b,0xa5,0x95,0xf7,0xd4,0xa2,0x74,0x0e,},\"\\xdc\\x40\\x41\\xad\\x61\\x42\\x3a\\x12\\xa0\\x41\\x13\\x18\\xa6\\xe6\\x2a\\x5e\\xf6\\x4a\\x19\\xab\\xe2\\xd9\\x85\\x22\\x97\\xbe\\x2d\\x4a\\x35\\xeb\\x86\\x70\\xca\\x36\\xc5\\x21\\x53\\x1b\\x30\\x38\\xac\\xda\\xee\\xa2\\xea\\x01\\xa0\\xb6\\x18\\x78\\x62\\xa4\\xe1\\xa8\\x9d\\x4b\\x81\\xc5\\x31\\x8e\\xd4\\xd6\\x71\\x31\\xbc\\x38\\xf8\\x41\\xa1\\x42\\xa2\\xf6\\xf3\\x16\\xdf\\xf0\\x76\\x93\\x9d\\xc0\\xeb\\x81\\xb2\\x30\\xfe\\xa9\\x88\\x1f\\x8f\\x0f\\xf7\\xed\\x0b\\x29\\x3f\\x69\\xb2\\x89\\xfe\\x77\\x08\\x81\\xfb\\x37\\x10\\x80\\x8e\\x8e\\x59\\xe6\\x4e\\x19\\x0c\\x1e\\x37\\x9b\\x9d\\xd3\\x48\\xb0\\x2c\\x23\\x47\\xd7\\xe2\\x06\\x96\\x79\\x0b\\x62\\x77\\x6a\\x2e\\x82\\x5b\\xed\\x69\\x17\\x03\\x7c\\xb6\\x35\\xc9\\x2f\\xbc\\x76\\xb4\\xc5\\x85\\x10\\x27\\xe7\\xf1\\x38\\x52\\xee\\x7e\\x7c\\x52\\x57\\x3a\\x90\\x30\\xb7\\x9f\\x22\\xb6\\x0d\\x58\\x69\\xef\\xe6\\x80\\xc0\\x16\\x64\\x92\\x9f\\xe9\\xa0\\x6f\\xa3\\x33\\x05\\x2b\\xe1\\xd6\\xaf\\x3a\\x0b\\x48\\x2c\\x33\\x2e\\x18\\x05\\x1e\\x78\\xb3\\x33\\x83\\x9d\\x6c\\xb9\\x3d\\x93\\xeb\\xfb\\x27\\x7e\\x42\\x68\\xfb\\xee\\xee\\xba\\x1e\\x8f\\x96\\xa5\\xc9\\xe3\\x28\\xc4\\x26\\x72\\x12\\xca\\xc2\\x51\\x21\\x5b\\xfa\\xa7\\x8f\\xd8\\x8a\\x87\\x41\\x7a\\x80\\x60\\x2d\\xcd\\x88\\x28\\xe8\\x04\\x00\\xda\\x30\\x4e\\x98\\x98\\x62\\xd1\\x32\\x01\\x08\\x2d\\xe3\\x53\\x09\\x25\\xe0\\xed\\xc2\\xc1\\x30\\xa9\\xa4\\x19\\x07\\x1b\\x31\\x08\\x8d\\xa6\\xf6\\xff\\x40\\x56\\x30\\x1c\\x12\\x9f\\xc2\\x13\\x52\\x33\\x62\\x8d\\x16\\xd8\\xbf\\x16\\x0f\\x6c\\xe8\\x6d\\x83\\xcd\\x4e\\x29\\xae\\x0c\\x73\\x84\\x3d\\x70\\xb5\\x30\\x56\\xc5\\xaf\\x3f\\x3d\\xc5\\x61\\x27\\x1c\\xb5\\xaf\\xf3\\x93\\xf0\\x80\\x3a\\xde\\x07\\x2d\\x9c\\xeb\\x74\\x5b\\x61\\x87\\xb2\\x8d\\x24\\x69\\x67\\x67\\xd5\\xc2\\x1f\\x4d\\x4a\\xc5\\x8d\\x5b\\xb6\\x6c\\x5c\\xad\\xfe\\xfb\\x16\\x26\\xef\\x93\\xf7\\x14\\xc7\\x82\\xb6\\xef\\x3c\\xcf\\x4b\\x44\\xee\\x75\\xf0\\xbb\\x75\\x7a\\x25\\xd9\\xb4\\x6a\\x9d\\x93\\x1a\\x03\\x72\\x7d\\x49\\x6a\\x22\\x81\\x0c\\x63\\x4f\\x5c\\x1a\\xe6\\x0c\\xbd\\xf2\\xf1\\xea\\x29\\xb5\\x46\\x07\\xcf\\xf5\\x0d\\x9f\\x8e\\x03\\xa0\\xa4\\x51\\x3c\\xf6\\x8d\\xfb\\x61\\x97\\x73\\x41\\x1b\\x61\\x80\\x95\\x9a\\x8a\\xac\\x30\\xb2\\xee\\xe4\\xad\\x32\\x79\\x15\\xf6\\x0a\\xe5\\x2b\\x90\\xe0\\x4a\\x9b\\xce\\xf8\\xdc\\x67\\xe7\\x1e\\xa1\\x0a\\xca\\x55\\x3d\\xb9\\x89\\x5c\\xd8\\x00\\x84\\x57\\xd7\\x6f\\x02\\xce\\xb5\\x35\\x00\\x21\\x11\\x09\\xe8\\x96\\x03\\xf3\\x04\\xd8\\x80\\xaa\\xf0\\x28\\x61\\xfe\\x37\\xc9\\x53\\x4a\\x9d\\x67\\x2d\\x83\\x71\\x3c\\xd3\\x26\\xc9\\xab\\x81\\xc3\\x53\\x76\\x4c\\xa5\\xad\\x5a\\xc0\\xe7\\xf1\\xff\\x88\\x0f\\xb4\\x8a\\xcd\\x9c\\xbb\\x94\\x90\\x64\\xe2\\x11\\x83\\xbc\\x38\\xfb\\x1d\\x90\\xcf\\xe6\\x19\\xa8\\xb8\\xfb\\xf5\\x32\\x18\\x89\\xbb\\x15\\xc0\\x2a\\x53\\xe4\\xd3\\x67\\xfc\\x66\\x88\\x77\\xb6\\x62\\x28\\x1c\\x4a\\x2a\\xf6\\x78\\xf8\\x6e\\x69\\x1d\\xaa\\x8a\\xfd\\xca\\xc1\\xb8\\x20\\x18\\x9f\\xe5\\xc2\\x50\\x8c\\xe3\\x6e\\xdd\\x9c\\x6f\\x8f\\x51\\x57\\x50\\x71\\x83\\x94\\x39\\xa0\\x03\\x35\\x2c\\x15\\x73\\xe1\\x27\\x68\\xdd\\x6d\\xeb\\xdf\\x1e\\xd4\\xf9\\x4a\\xc7\\x9d\\xf1\\xab\\x6a\\x0b\\xc2\\x50\\x79\\xc0\\x93\\x54\\x77\\xd9\\x14\\x99\\x88\\xec\\x3b\\x87\\x93\\xef\\xcd\\xa8\\x59\\xac\\xc3\\x92\\xab\\x3f\\xa9\\x94\\x93\\xd7\\xae\\x0a\\x65\\x75\\xb6\\x95\\xa1\\xce\\x07\\x65\\x32\\x86\\x02\\x87\\xdd\\x49\\x89\\x67\\xc4\\x6f\\x7a\\xdd\\x49\\x49\\x4c\\x02\\xe7\\x44\\xc4\\x02\\x80\\x19\\x57\\x82\\xe2\\x42\\x44\\x76\\x16\\x5e\\x72\\xce\\xe2\\x36\\x42\\xe5\\x1c\\xec\\x43\\x21\\x91\\x11\\x6a\\xec\\x59\\xb5\\x9f\\xcf\\x0a\\x36\\x83\\xb9\\x5f\\x76\\x07\\x60\\xa2\\x0b\\xd6\\x74\\x54\\xd8\\xde\\x64\\x7c\\x0f\\x9f\\xfc\\x4f\\x90\\xf6\\xe4\\x5a\\xc9\\x3d\\x80\\x2f\\x33\\x82\\x99\\xef\\x28\\x0d\\x3b\\xb7\\xa4\\xa8\\x9d\\xb8\\xc5\\x9a\\x12\\x52\\x6f\\x27\\x83\\x02\\x4c\\x8a\\xde\\x90\\x02\\xf0\\x0e\\x3d\\x52\\x9b\\x78\\xdc\\xdd\\x49\\x03\\xda\\xf5\\x76\\x7a\\x2b\\xed\\x75\\x14\\x53\\x96\\xef\\xb6\\x97\\x90\\x71\\x2d\\xe6\\xa5\\x90\\x1e\\x6d\\x8c\\x15\\x28\\x01\\x82\\x38\\x82\\x85\\x02\\x1d\\x0e\\x70\\x92\\x92\\x15\\xd9\\xf2\\xb7\\x99\\xbb\\x92\\xf2\\xca\\x56\\xf4\\x8e\\x8c\\xbb\\xa2\\xf1\\x9b\\x08\\x58\\x45\\x12\\x65\\x67\\xcf\\xaf\\xa6\\x03\\xc2\\x94\\x6e\\xa1\\xe7\\xd2\\x74\\x55\\x4a\\x38\\xbf\\x7d\\x86\\x51\\x1f\\x3e\\x47\\x4f\\x9f\\xa5\\xcb\\x11\\x10\\x5f\\xb5\\x2f\\xc6\\x81\\x77\\xf3\\x38\\x5f\\xe1\\x39\\x7b\\xe5\\x84\\xa7\\x00\\x89\\xdc\\x74\\x1b\\x4b\\x00\\x95\\xbf\\x7e\\xb2\\x99\\x3b\\x41\\x8d\\xf8\\x7b\\x14\\xa1\\xf9\\x79\\x26\\xe8\\x68\\xdf\\x6e\\x56\\x8b\\xec\\xa2\\x21\\x5f\\x2d\\xd7\\xce\\x8a\\x3c\\x9e\\xe8\\x49\\xcb\\x41\\x34\\x6c\\x68\\x4f\\x7f\\xfe\\xf0\\xa7\\x92\\xed\\xf4\\x33\\xca\\x99\\xef\\x34\\xc7\\x3f\\x92\\x72\\xa7\\xeb\\x97\\x58\\x7c\\x8f\\xce\\x4a\\x51\\x36\\x44\\x47\\x37\\x13\\x8d\\x53\\xea\\xdf\\x3a\\x84\\xf5\\x01\\xbb\\x10\\x45\\x6e\\x8e\\x4a\\x40\\x47\\x08\\x2c\\x9e\\x14\\x35\\xf5\\x76\\x52\\x6c\\x21\\x64\\x71\\x4d\\x70\\xb3\\xd0\\xa6\\xe9\\xc0\\x8a\\x53\\xe3\\x23\\x84\\x0f\\x4d\\xcf\\xe8\\xf2\\xd1\\x9f\\x0b\\xe2\\xc8\\x8e\"},\n{{0x85,0x04,0xfb,0xca,0xab,0xa6,0x76,0x83,0xf8,0x15,0x49,0x92,0x82,0xb6,0xeb,0xd4,0x97,0xa8,0x1a,0x91,0x56,0xf5,0x3e,0x02,0x5c,0x2d,0x3e,0xce,0xe0,0xdb,0x65,0x59,},{0xe6,0x2d,0xa8,0x64,0x93,0xa0,0xca,0xf5,0x29,0x21,0xd5,0x60,0x2f,0xbd,0xc3,0xdd,0x3a,0x84,0x36,0x94,0x1f,0x6b,0xe2,0x40,0xb3,0x15,0x09,0x68,0x12,0x38,0x74,0x6d,},{0xc0,0xea,0x07,0x4b,0xf9,0xad,0xde,0xe2,0xe3,0x35,0x0a,0x96,0x9e,0x7c,0x56,0x9e,0x3a,0xea,0x1a,0x41,0x88,0xee,0x5a,0xf3,0x4c,0xb7,0x3f,0x38,0x82,0x98,0x65,0x3d,0x29,0x9b,0x5d,0xbd,0x94,0x16,0x3f,0xba,0x20,0x9e,0x8f,0x7d,0xc2,0xe2,0x63,0x4d,0x3a,0x52,0xa0,0x28,0x10,0xa8,0x8c,0x61,0x52,0x94,0x5b,0xc1,0x6b,0xbd,0xfb,0x0c,},\"\\x6c\\x63\\xed\\xbd\\x40\\xa0\\x38\\x74\\xec\\xae\\xf8\\x16\\x02\\xcd\\x68\\x50\\xc0\\x9f\\x49\\x15\\xb7\\xaa\\xf4\\x18\\x25\\x8c\\x56\\x83\\x64\\x53\\x8e\\x83\\x92\\xa8\\xc3\\x79\\x83\\x8b\\x0c\\x95\\x34\\x5b\\xf6\\x4c\\x3d\\xbc\\x17\\x58\\x53\\xfb\\x64\\x1f\\x35\\x0f\\x0b\\x53\\xa0\\x5a\\x8e\\xc2\\x90\\x28\\x8c\\x03\\x26\\xd4\\x35\\xff\\x77\\x6f\\x86\\x83\\xa2\\x73\\x33\\x3f\\x9b\\xb2\\x80\\x21\\x84\\xec\\xc5\\x3b\\x06\\xb2\\x8c\\x2c\\x40\\x2a\\x54\\xbf\\x13\\x4c\\x1a\\x23\\x29\\x97\\x49\\xa6\\xce\\x2b\\x51\\xa7\\xba\\x22\\x23\\x21\\x48\\x79\\x7e\\x99\\x3f\\xf2\\x58\\x28\\x6e\\x94\\x77\\x78\\xa8\\x74\\x2d\\x3f\\x36\\xcc\\x78\\x42\\x97\\x60\\x43\\xfc\\x23\\xda\\x8a\\x97\\xec\\xb9\\x71\\x5f\\xc0\\x5f\\xb0\\xf2\\x3f\\xa7\\x32\\x1d\\xdc\\x19\\x32\\x86\\x16\\x31\\x60\\x4e\\xba\\x2e\\xf2\\x5d\\x8b\\x75\\x6c\\xe4\\x73\\x36\\x56\\xbf\\xd1\\xe1\\x47\\x08\\x92\\x3a\\xc7\\xc6\\x0a\\x79\\x84\\x61\\x36\\xd7\\x41\\x97\\x3b\\xa5\\x51\\x41\\x89\\x72\\x0b\\xc0\\xf7\\x77\\x4b\\x7b\\xd3\\x57\\x45\\x95\\xbd\\xe2\\x51\\x50\\x31\\xb2\\x5b\\x62\\x65\\x4b\\x16\\x10\\x35\\x77\\x80\\x70\\xac\\xe1\\x49\\x71\\xdf\\x1f\\xe0\\xbe\\x4e\\xa1\\xef\\x55\\xcf\\x87\\x47\\xd3\\x71\\x6c\\x1c\\xe7\\x07\\xb1\\xa7\\xc8\\x52\\x0e\\x6d\\xeb\\x33\\x4e\\xb1\\x86\\x33\\x8f\\xc9\\x30\\x00\\x76\\x8e\\xb2\\xbe\\x40\\xc6\\xe0\\xdc\\x3f\\x5d\\xf8\\x31\\xb3\\x2c\\x3a\\x2c\\x33\\xe2\\x88\\x98\\xd6\\x76\\x2a\\x15\\x22\\xd3\\xd4\\x8d\\xae\\xe5\\x6a\\x02\\x69\\xbd\\xdf\\x6c\\xfc\\x9d\\x73\\xf8\\xd1\\x78\\xae\\xcc\\xbf\\xfe\\xf7\\xce\\x16\\x4f\\x98\\xaf\\xea\\x22\\x4a\\x9b\\x60\\xed\\xe4\\x6a\\x95\\xfa\\xdc\\x9f\\xc5\\xd9\\x4d\\x20\\x9c\\x16\\x6d\\x9b\\x8d\\xe2\\x53\\x38\\x1e\\xa2\\x24\\x88\\x62\\x94\\x6b\\x9c\\xf5\\x34\\x94\\x74\\x55\\xc2\\x44\\x58\\xcf\\x56\\x68\\x3a\\x0e\\xc4\\x7a\\x2c\\x65\\x07\\x5c\\x69\\x4c\\x7c\\x3d\\x6a\\xdf\\x9a\\xe5\\xe8\\xad\\x31\\xac\\x76\\x9f\\x83\\xaa\\x26\\xe3\\x12\\xc5\\xb0\\x1a\\x9a\\x09\\x40\\x4b\\x15\\xb8\\x14\\xba\\xa7\\x66\\x6b\\x3e\\x03\\xf0\\x6a\\x8d\\x63\\x48\\xab\\x8c\\xcb\\x9b\\x60\\xa4\\xa4\\xfa\\xf8\\x6f\\x71\\x35\\xdf\\x03\\x9d\\x95\\x5c\\x07\\xbd\\x92\\xe7\\xb8\\xe3\\x27\\xee\\x6c\\x1b\\x40\\x19\\x6a\\x28\\xb4\\x44\\x6a\\xa5\\xa9\\xb2\\xb9\\x77\\x3a\\xb7\\x6e\\x3c\\xe2\\x11\\x80\\xf0\\x9d\\x6c\\x08\\xd2\\x77\\xc6\\x77\\x1d\\x67\\xe2\\x2d\\x84\\x54\\x0f\\xa4\\x3b\\x38\\xf6\\x34\\xcf\\xc4\\x6e\\x5b\\x8c\\x33\\xf1\\x5a\\x56\\x8a\\x77\\xe4\\x91\\x4a\\xad\\x9a\\xb8\\xc9\\xf7\\xfe\\xa4\\x7f\\x76\\x77\\xc0\\x18\\x80\\xb3\\xe8\\x5d\\x2d\\x0e\\x3f\\xbd\\x6d\\xc6\\xe9\\x9e\\x43\\x7d\\xdc\\x73\\x6f\\x92\\xb5\\xa2\\xff\\x29\\x27\\xe0\\xb4\\x42\\x14\\x2f\\x08\\x97\\xd0\\xb8\\xa1\\x9a\\xc2\\x03\\x63\\x3d\\xf4\\x13\\xfe\\xaf\\x8e\\xf5\\x0a\\x5f\\x76\\x7b\\xed\\xaf\\x20\\xf1\\xc1\\x3f\\x3b\\x89\\xd1\\xe8\\xb7\\xbd\\x18\\xd5\\x91\\xf9\\xde\\x11\\x6e\\xe3\\x4f\\x98\\x24\\xe4\\xea\\xd1\\xae\\x9d\\xa2\\xe8\\xca\\xae\\xf8\\x8b\\x29\\x51\\x6a\\xa9\\x42\\xde\\x77\\xa7\\x46\\x7b\\x6f\\xb2\\x6a\\x66\\x6f\\x30\\x64\\x8c\\x71\\x5a\\x2e\\xe9\\xf9\\x46\\x74\\x3b\\x54\\x3a\\x44\\x28\\xe0\\xdf\\xd0\\x61\\x78\\xe7\\xe9\\x3e\\xc6\\xf2\\x6e\\x00\\x3e\\x05\\x8b\\xec\\x14\\xa4\\xaa\\x2e\\x3b\\x8d\\xe1\\x12\\x95\\xa7\\x64\\xca\\xb3\\x0b\\x31\\x3f\\xcc\\x57\\x43\\xb2\\xfb\\x89\\x96\\x2d\\xdc\\x5c\\xdc\\x6a\\xa0\\xd2\\xe4\\xa3\\x06\\xe7\\x7a\\xf7\\x6a\\x05\\xa5\\x98\\x92\\x3f\\x62\\x8a\\x85\\xdf\\x1c\\xc7\\x3a\\xd3\\xbc\\x01\\xc4\\xb9\\x79\\xbd\\x7c\\xb2\\x96\\x59\\x0a\\x88\\xb0\\xa4\\x1b\\x44\\x5d\\x50\\xa0\\x84\\x23\\xe4\\xed\\x80\\xf1\\x76\\x3c\\x71\\x6b\\x6c\\x45\\x7d\\x84\\x5d\\xfa\\xa6\\x8d\\x12\\xb0\\xd0\\x3c\\x55\\xfd\\xe8\\xae\\x6b\\x2b\\x92\\xbc\\x63\\x22\\x94\\x3d\\xbe\\x54\\xc7\\x06\\xbc\\x8e\\x5f\\xce\\xe7\\x06\\x54\\xb2\\x6f\\x3b\\xfd\\x87\\x7f\\x5f\\x53\\x39\\xac\\x18\\x2d\\x54\\x17\\xbd\\x4c\\x07\\x35\\xd8\\x25\\xbf\\x70\\xe8\\x5e\\xab\\x82\\x16\\xed\\xda\\x63\\x2a\\xe7\\xe2\\x2b\\x3e\\x53\\xd0\\x78\\xa8\\xb2\\x0b\\x5a\\x7e\\x23\\x85\\x33\\x7c\\xf9\\x2b\\x3c\\x16\\xb0\\x23\\x56\\x3e\\x11\\xcb\\x50\\x43\\xb7\\x04\\xd3\\x7e\\xb5\\xed\\x9e\\x85\\xfc\\xdc\\x95\\xcf\\x7a\\x6e\\xad\\xe4\\x08\\x03\\x17\\x5a\\x00\\x8e\\xf6\\x53\\xac\\x61\\x36\\xf1\\x61\\x29\\xab\\xae\\x11\\x37\\xc5\\x82\\x34\\x00\\x74\\x8a\\x81\\x25\\x62\\x54\\xd3\\x17\\xcf\\xc9\\x39\\xe2\\x6e\\xa0\\xce\\xf9\\xf6\\x54\\x8d\\xb4\\x28\\x90\\xc4\\x8b\\xeb\\x04\\x79\\x10\\x3b\\xa0\\x89\\xe5\\x14\\x11\\x80\\x38\\xb1\\xb9\\x09\\x43\\xd7\\x16\\xf7\\xa8\\xd4\\xcd\\xa5\\x98\\x3a\\x67\\x4b\\x83\\xa0\\x02\\xd8\\xac\\x9c\\x65\\x73\\x4a\\x28\\xb7\\x7b\\x76\\x0c\\x8e\\x38\\x03\\xf8\\x78\\x1e\\xa9\\x19\\x9f\\x79\\x7c\\xe7\\x29\\xe0\\x6b\\xff\\xfe\\x8c\\x29\\xb2\\x0b\\xc8\\x52\\x27\\xc0\\x9c\\xc0\\x52\\x19\\xff\\x2b\\xa3\\x8e\\x18\\x05\\x10\\x83\\x73\\x2f\\x83\\xcb\\xfc\\xcc\\x31\\x07\\x56\\x45\\x0b\\x26\\x1d\\x5b\\xe1\\x83\\xd9\\xfb\\x44\\xec\\x18\\x52\\x9f\\x2c\\xc9\\x84\\x8c\\x40\\x11\\x9c\\x60\\x76\\x76\\xbc\\x4d\\x90\\x15\\xfd\\x4b\\xd2\\xfc\\x91\\x8d\\xc8\\x03\\x1e\\xc1\\x9a\\x05\\xff\\x36\\x2c\\x18\\x40\\x43\\xbe\\x7f\\xe0\\x66\\x01\\x9a\\xc5\"},\n{{0xea,0xc0,0xf0,0x6c,0x2c,0x14,0xf3,0x7d,0x43,0x4b,0xc9,0x98,0x97,0x22,0x5d,0xd2,0xe3,0xf1,0xed,0x74,0xaa,0x74,0x42,0xc5,0x50,0x33,0x9d,0xf7,0x7d,0x0b,0x7b,0x32,},{0x43,0xe6,0x20,0x55,0xdb,0x6e,0x13,0x49,0xc9,0x4d,0x89,0x02,0x91,0x87,0x88,0x20,0x20,0xcb,0xcf,0x9d,0x75,0xe0,0x3e,0xb6,0x56,0xfa,0x0a,0x15,0xb1,0x90,0x02,0xd7,},{0x45,0xf2,0x80,0x3a,0xfe,0xb0,0xfc,0x44,0xd3,0xaa,0x96,0x5b,0x12,0x65,0x9b,0xf5,0x02,0xe4,0x72,0x95,0x70,0x61,0x84,0xb2,0xa1,0xc6,0xf1,0x6d,0x05,0x06,0x13,0xf5,0x96,0xa2,0x00,0x13,0x94,0xe0,0x0e,0x2a,0x44,0xc4,0x6c,0xf6,0x50,0x5d,0x5c,0xf5,0xb8,0xab,0x84,0x12,0xf0,0x7e,0xda,0x95,0x1a,0x15,0x00,0x5e,0x33,0x8f,0x3c,0x0e,},\"\\x27\\xb7\\xfd\\x0e\\x71\\xad\\xf1\\x94\\xcf\\x54\\x07\\xb6\\x77\\x17\\x93\\x06\\x0d\\xe0\\xfc\\xa7\\xca\\x0a\\xe6\\x48\\x35\\xc4\\x31\\x87\\x40\\x8a\\x70\\x4f\\x53\\x3d\\x5e\\xa0\\xc8\\x3a\\x65\\x43\\x87\\xba\\x7d\\xb1\\x6e\\xd5\\x8e\\xc8\\x37\\x22\\x6d\\xf5\\x7c\\x1f\\xe6\\x38\\x2c\\x59\\x19\\xe9\\x22\\x13\\xf6\\xf1\\x8c\\xbb\\x57\\x35\\xd1\\x78\\xa4\\x76\\xaf\\x35\\xd3\\x90\\xb7\\xcd\\x25\\x56\\x21\\x7c\\x53\\x0f\\x3a\\x1f\\x8a\\xb2\\x33\\x9c\\x1a\\x5e\\x8d\\x96\\x93\\x87\\xef\\xd3\\x94\\x14\\xb5\\x6b\\xb7\\x84\\xdf\\xd5\\xeb\\x89\\xb8\\x59\\xe1\\xf4\\x03\\xa2\\x38\\xec\\xa2\\xa9\\x41\\xe6\\xdb\\x56\\xac\\x45\\x6b\\x73\\x45\\x06\\x98\\xd1\\x45\\x5e\\xc1\\xe9\\xb3\\x9a\\x1e\\x90\\x7d\\x6b\\xc7\\xe6\\xcf\\xf4\\x24\\xa2\\x8e\\xed\\x57\\x9a\\xf1\\x63\\x10\\x11\\x5b\\x67\\xf5\\xfc\\xf7\\xf8\\x34\\x6b\\x3f\\xa0\\x26\\x0c\\x6d\\xa2\\xe2\\x77\\x55\\xac\\xa5\\x70\\xba\\xbb\\x3d\\x30\\x3c\\xc8\\x32\\x46\\x0c\\x96\\x3b\\xfd\\xd5\\xc1\\xff\\xb2\\xfc\\x19\\x92\\x19\\x29\\xdd\\xa2\\xa7\\x17\\xfb\\xcb\\xeb\\x2b\\x85\\x25\\x76\\x1b\\xd6\\x60\\xce\\x4a\\x0f\\x76\\x85\\x28\\x5d\\x7f\\xad\\x61\\x15\\xab\\x09\\xf8\\xe6\\x3f\\x5f\\x77\\x39\\x14\\x49\\x4e\\x20\\xbe\\x1b\\x51\\x2d\\x11\\x14\\xcc\\xe3\\xf0\\xf6\\x8c\\x7d\\x94\\xf5\\x48\\x57\\x69\\x4f\\x22\\xaf\\x4c\\x69\\x8d\\x78\\x2c\\xe8\\x37\\xb0\\xc1\\x72\\x2b\\xb7\\x31\\x3b\\xb2\\xc4\\x1f\\x6d\\x3d\\xd1\\xa0\\x28\\x77\\xfb\\x42\\x96\\xd8\\x66\\x2a\\x9e\\x86\\x25\\x98\\x4d\\xc1\\xfd\\x1a\\x95\\x10\\xeb\\xa9\\xd6\\x43\\xac\\x58\\xa8\\x86\\xa0\\x45\\xcd\\x0e\\x53\\xc0\\x56\\xa8\\x33\\xf9\\x68\\xb3\\x5d\\x01\\x32\\x0e\\x9c\\xc0\\xb4\\x35\\xd3\\xf6\\xbf\\xad\\x26\\xf9\\xeb\\x57\\x54\\xd3\\x8d\\xdf\\x6d\\x5c\\x4b\\xf6\\x15\\xa7\\x64\\x4a\\x23\\xf9\\x82\\x6b\\xcc\\x97\\x60\\x92\\xd8\\x2d\\x81\\xd5\\x47\\x00\\x0d\\xe0\\x08\\x1b\\x7a\\x40\\xa9\\x3f\\xbd\\xda\\xc1\\x3f\\x7d\\x99\\x70\\x8c\\xcd\\xee\\xb9\\x40\\x5c\\xd6\\x34\\xca\\x07\\x48\\xca\\xd2\\xc1\\xd8\\xf1\\x64\\xf5\\xd7\\x7a\\x4f\\x36\\x4a\\xe4\\x88\\xbe\\xdc\\xf1\\xf2\\x0e\\xb9\\x54\\xbc\\x8a\\x27\\x8a\\xf8\\x14\\x32\\x41\\x78\\x56\\xa9\\x00\\xf8\\xf1\\x52\\x92\\x1a\\xfb\\xe1\\x79\\x14\\x22\\x9a\\x51\\x3b\\xd7\\x1a\\xb7\\xe6\\x61\\xcd\\xe1\\x29\\xaf\\x93\\xe2\\x50\\x94\\xc5\\x61\\x18\\xed\\x1f\\x22\\xdb\\x64\\x44\\x28\\xb4\\x74\\x65\\x1f\\xe3\\x6b\\xe8\\x2f\\xa3\\x69\\x5c\\x41\\xfc\\x86\\x99\\x66\\x7e\\x05\\x37\\x43\\xb0\\xa4\\x11\\x55\\xc3\\x1f\\x1e\\x26\\x79\\xc6\\xe8\\xcb\\x9c\\x9d\\x1f\\x5f\\x4b\\x40\\xa3\\x20\\xa9\\xfd\\x9f\\x47\\xda\\x9b\\x94\\x21\\x1b\\xa6\\x01\\xb2\\x2a\\x11\\x52\\x10\\xd9\\xf5\\x59\\xc4\\x49\\x6f\\x01\\x73\\x24\\x58\\xf4\\x9a\\xc3\\x4e\\xb3\\x86\\x63\\x6c\\x8b\\x6c\\x68\\xc7\\xbb\\xc0\\x07\\x8a\\xb6\\xf3\\x98\\xa6\\x24\\xb8\\xba\\xfb\\x1c\\x62\\x29\\x58\\x56\\x2d\\x23\\x1d\\xff\\xd4\\xdb\\x09\\x61\\x96\\xbb\\x87\\x47\\x9e\\x42\\xea\\x22\\xac\\xbd\\xcd\\xe8\\xde\\xb1\\x0e\\x31\\x16\\x32\\xf0\\x2f\\xca\\x14\\x78\\x7f\\xd3\\x14\\x05\\x69\\xb9\\x42\\x89\\x91\\x54\\x3e\\xc6\\xe8\\x34\\xe1\\x0b\\x14\\x9f\\x23\\xc7\\x4b\\xb9\\x9a\\xc7\\xb3\\x79\\x9a\\x20\\x96\\xd2\\x2e\\x38\\x7a\\x71\\x2b\\x6f\\x90\\x11\\xea\\x34\\xc5\\xbe\\x4c\\x46\\x85\\x81\\xac\\x62\\xce\\x66\\x20\\x63\\x25\\x2e\\x06\\x6a\\x9a\\x3b\\x15\\xc9\\x57\\x0d\\x06\\x5d\\xc1\\x61\\x99\\x29\\xf0\\x6b\\xc7\\x5a\\x31\\x79\\x46\\x8b\\xc8\\xa1\\x6e\\x3d\\xdc\\x4f\\xe1\\x85\\xce\\xba\\x0a\\x92\\xa5\\x46\\xb8\\x67\\x5f\\xc1\\xad\\xe5\\x63\\x07\\x15\\x0c\\x7e\\x4c\\x84\\x4f\\x6a\\xa5\\xf1\\xed\\xbf\\xb5\\x4a\\xc6\\x32\\xca\\x2b\\x25\\x9c\\x32\\xa3\\x3e\\xe2\\x86\\x78\\x56\\xc3\\x39\\x0a\\x67\\x40\\x36\\x4c\\xb0\\xdf\\xb9\\x76\\xe5\\x3d\\x0c\\xc6\\xc4\\x2a\\x10\\x6a\\x1c\\x26\\x91\\x8c\\x8a\\x6a\\x03\\x3b\\x2a\\xa3\\xc7\\xf2\\xe4\\x39\\x2e\\x79\\xf8\\xec\\xa5\\xb3\\x36\\xba\\xc5\\x06\\x1d\\x76\\x98\\xa3\\xbf\\xe7\\xc2\\xc2\\x92\\x89\\x25\\x54\\x03\\x0d\\xe6\\xce\\x7c\\x0d\\x06\\xee\\xfc\\x54\\x90\\x6f\\x81\\xe0\\x09\\x7f\\xcf\\xf2\\x7d\\x14\\xb9\\xb7\\x99\\x4a\\x79\\x70\\xe1\\xa5\\xf5\\xc6\\xb6\\x40\\x5d\\xca\\x22\\x03\\x3d\\xff\\x0e\\xae\\x13\\x8a\\xd8\\x99\\xf6\\xee\\x68\\x12\\x0b\\x8f\\x22\\x74\\x4b\\x02\\x69\\xa9\\xa8\\x98\\x9b\\x6f\\x7e\\x08\\xaf\\xfa\\xe7\\x7b\\xca\\x21\\x68\\xad\\xe2\\x40\\x58\\xae\\x68\\xa7\\xf8\\x00\\xe0\\x2e\\x7c\\x38\\x39\\x1b\\xaf\\x56\\x5d\\xd4\\x0b\\x55\\xfa\\x3a\\xb3\\xc2\\x47\\xb9\\xce\\xb4\\xd9\\x67\\x47\\x17\\x75\\xe6\\x63\\xd6\\xa1\\xc6\\xc7\\xe1\\x73\\x50\\xbb\\xd6\\xb9\\xa3\\xeb\\x1e\\x48\\x4a\\xc2\\xe7\\xa7\\xa5\\xc8\\x4f\\x50\\x83\\xe5\\xac\\xe8\\x73\\x0d\\xe8\\x9c\\x47\\xe8\\xdc\\xf8\\x34\\x1e\\x40\\xba\\x34\\x5d\\xbd\\x66\\xba\\xe0\\xf7\\xf0\\x76\\xa7\\x05\\xb1\\xbb\\x7f\\x47\\x0e\\x3e\\xdf\\xb2\\xb7\\x8e\\x4d\\x63\\x59\\x41\\x3d\\x18\\xd3\\x32\\x80\\xb4\\x54\\xa0\\xdb\\xb8\\x81\\xd8\\x60\\x67\\x26\\xfa\\x9b\\xea\\x27\\x24\\x75\\xe7\\x9f\\xea\\x6a\\x54\\xcb\\x4c\\x06\\x19\\x54\\x1b\\x4e\\x77\\xc1\\x70\\xc8\\x61\\x68\\x74\\xb9\\x54\\xbe\\xb8\\xd1\\x05\\xb8\\x6b\\xd1\\x91\\x7e\\x25\\xcf\\xba\\x92\\x67\\x18\\x7e\\xe2\\x03\\x8b\\x3f\\x00\\x78\\xf4\\xc3\\x18\\xb5\\x87\\xcf\\x44\"},\n{{0xe6,0x08,0xd5,0xde,0x97,0x97,0x90,0x7d,0xb6,0xd9,0x8e,0x03,0x45,0xd5,0xca,0xf2,0xad,0x33,0xe0,0xed,0xde,0xbf,0x18,0xb8,0x1d,0x61,0xe8,0x37,0x3e,0xcf,0xb4,0x99,},{0x60,0xe0,0xc1,0x6a,0xda,0x58,0x6e,0x36,0x46,0x91,0x2a,0x5f,0x2b,0xb3,0x18,0xfb,0xc3,0xd5,0x0b,0x57,0xd3,0x6f,0xab,0xb6,0x37,0x69,0x6f,0x9d,0x8d,0x4d,0xc7,0x61,},{0x0d,0x8f,0x09,0x5e,0x42,0xa2,0x73,0x0a,0x3c,0x7b,0xed,0xf4,0x2d,0x5c,0x83,0x39,0x8b,0x5c,0x0e,0xe9,0xc7,0x7c,0x5a,0x61,0xd9,0x82,0x29,0x13,0x96,0xa9,0x18,0x2a,0x08,0x02,0xa3,0x7f,0x32,0x4b,0xc4,0xfb,0x5d,0x4a,0xa4,0xed,0x60,0x44,0x4b,0x66,0x14,0x4b,0xac,0xbc,0x86,0x51,0x05,0xd7,0x69,0x0f,0x14,0x06,0x50,0x69,0x1d,0x03,},\"\\xe6\\x10\\xfa\\x7d\\x83\\x85\\xc0\\x9c\\x78\\x98\\x9e\\xd5\\xef\\x7a\\x23\\x05\\x47\\xf0\\x13\\xcb\\x7e\\x8d\\xdf\\x31\\x74\\x9f\\xfc\\x31\\xce\\xe1\\x0a\\xb3\\xef\\xac\\xa3\\xf1\\x4e\\xa1\\x94\\x51\\x0f\\x09\\x85\\xa8\\x18\\xef\\x8b\\x04\\x0e\\x10\\xc3\\xa5\\x11\\x4d\\xe1\\xac\\x08\\x0f\\x14\\xc3\\xd6\\x5d\\x3c\\x24\\x4f\\x92\\x42\\xf7\\x54\\x92\\xca\\xba\\xe8\\x00\\xfc\\xfc\\x9b\\xc2\\x75\\xea\\x1f\\x27\\x72\\x8c\\x92\\x0c\\x25\\x8f\\xe7\\xaa\\x73\\x94\\x80\\x60\\x29\\x9c\\xb8\\x78\\x35\\x79\\x2e\\xdc\\xc0\\x72\\x15\\x0b\\x73\\xce\\xfe\\xb0\\xd5\\x15\\x62\\xe5\\x3b\\x46\\x81\\x0e\\x27\\xa4\\xd7\\xf6\\xab\\xd3\\x2e\\x95\\x9f\\x7d\\x73\\x1d\\xde\\x01\\xd9\\x4b\\xc4\\x1e\\xd8\\x35\\xef\\xcd\\x42\\xc9\\x22\\x43\\x70\\x37\\xa8\\x7d\\xd3\\x66\\xff\\xad\\x2e\\xec\\xab\\x6a\\xba\\xeb\\x4f\\xcf\\x07\\x39\\x2b\\x3a\\xb4\\x0c\\xfa\\xef\\xea\\xa4\\x26\\x6b\\xc5\\x37\\x67\\x16\\x93\\xc9\\x09\\x3d\\xab\\xe8\\xa0\\x53\\x8c\\xaf\\xd1\\x2c\\x63\\x9a\\x04\\xbd\\x2b\\xa8\\x0c\\xe0\\xf2\\x9a\\xdb\\xfc\\x66\\xbd\\x46\\x37\\xca\\x05\\x43\\xa5\\x3b\\x0e\\x37\\x1d\\x0e\\x2e\\x47\\x0d\\x31\\xba\\x36\\x06\\x42\\xa4\\x5a\\xb4\\xcf\\xe3\\xe7\\x90\\xf5\\x87\\xf6\\xc5\\xa5\\x58\\x3f\\xd1\\x5b\\x18\\x99\\x78\\x38\\xa2\\x00\\x92\\x1c\\x1c\\x39\\x9c\\x0b\\x16\\x27\\x8b\\x7d\\xd6\\xd3\\xaa\\xab\\x6f\\x32\\x5b\\x16\\xaf\\xdf\\x76\\x1a\\x1b\\xbf\\x86\\x7d\\xe2\\xbd\\xd4\\x86\\x15\\xf1\\x5b\\x52\\x67\\x70\\xed\\x20\\xd7\\x9f\\x0f\\x30\\x71\\x4b\\xee\\xed\\xa5\\x8f\\x52\\xa3\\xcc\\x0c\\x5a\\x61\\x83\\x15\\xe5\\x22\\xb9\\xeb\\xe7\\xcd\\x99\\xb6\\x5e\\xd5\\x32\\xa6\\x2e\\x0f\\x0d\\xf7\\x27\\x64\\xd6\\xec\\x6d\\x6d\\x1b\\xa4\\x0e\\xf4\\x0e\\x05\\x42\\x63\\x60\\x79\\x5d\\x6d\\xd8\\x5b\\xb3\\x9f\\x73\\x21\\xd3\\xfb\\x06\\x27\\x5d\\xe0\\x96\\xaa\\xe4\\xa2\\xfa\\x22\\x93\\xf3\\x1b\\x33\\xf4\\xad\\x4d\\x7c\\x25\\x1a\\xc1\\x3e\\x8e\\x15\\xc2\\xbf\\xb1\\xf9\\x8f\\x49\\x62\\xc5\\x4b\\x6c\\xe0\\x33\\xb0\\x8a\\xa6\\x26\\xf2\\x90\\x5d\\x46\\x3f\\x55\\xb7\\x1c\\xbd\\xad\\xec\\xdb\\x3e\\x0b\\x36\\x5d\\xae\\x07\\xb1\\x70\\x30\\x19\\x83\\xae\\xb8\\x3b\\x1e\\x9f\\x2f\\x28\\xcf\\x65\\x41\\x9f\\xd6\\xb0\\xa1\\xa9\\xc2\\x6c\\xb5\\x4b\\x59\\x49\\xf4\\xbc\\x01\\xa9\\x86\\x81\\x84\\x4b\\x43\\x03\\x4c\\x37\\x2a\\x45\\x3d\\x38\\xf0\\x47\\x3d\\x0d\\xdc\\x70\\x9d\\x9f\\x49\\xc8\\x75\\x3a\\x75\\xb8\\x56\\xc7\\xe9\\x77\\x55\\x17\\xdf\\x57\\x4a\\x09\\xa3\\x95\\x3b\\xde\\x5d\\xae\\xdf\\x8e\\x4a\\x8d\\xa9\\xd7\\x73\\xa2\\x15\\x12\\x0e\\x26\\x9f\\xa1\\x86\\x11\\x33\\xcd\\x4c\\xea\\xeb\\x91\\xd5\\xcc\\xa2\\x60\\x63\\x25\\x45\\x8e\\x50\\xcb\\x96\\x6d\\x14\\x05\\x5b\\x22\\x44\\x7e\\xb6\\x5d\\xc1\\x01\\x18\\xda\\x08\\x31\\xdf\\x28\\xc3\\xb4\\xee\\x8b\\x11\\xf0\\x73\\x2f\\x15\\x21\\xbb\\x94\\x82\\xb1\\x1f\\x5a\\x86\\xb2\\x2f\\x18\\xe8\\x3d\\xd1\\xd9\\x67\\xd3\\x94\\x42\\x85\\xe5\\xd6\\x3a\\x5a\\x98\\x98\\x17\\xab\\x24\\x18\\xbc\\x7e\\xd8\\x91\\xa3\\x73\\x84\\x67\\x47\\xa1\\x2b\\x52\\x7c\\x2f\\x44\\xee\\x01\\x97\\xb9\\x46\\xc6\\x7e\\x67\\xfa\\x4a\\xa1\\xc2\\x9f\\x33\\x79\\xd4\\x6f\\xe0\\x7d\\x3a\\xab\\x83\\xda\\x17\\xf9\\xd7\\x6b\\xed\\xd3\\x84\\x36\\xa0\\x55\\xe3\\x4c\\xa1\\xd3\\xaf\\x5a\\x87\\x54\\xd3\\x8c\\x17\\xb9\\xba\\x4e\\x64\\x19\\xcb\\xab\\x51\\x5f\\x43\\x1a\\x25\\x95\\x95\\x4e\\x42\\x8c\\x26\\x70\\xfa\\xe3\\xbe\\xd6\\x2b\\x45\\x96\\x17\\x9c\\xb5\\x9e\\x21\\x10\\x87\\x08\\xd0\\x71\\xbc\\xf9\\xc6\\x21\\xc6\\xdf\\xf0\\x3d\\x3c\\xdc\\x92\\x02\\x02\\x94\\x54\\x01\\x3b\\x9d\\x13\\x38\\x47\\xf2\\x65\\x44\\x81\\x1c\\x01\\x69\\x77\\x0f\\xdc\\x6f\\xe5\\x63\\x8b\\xfd\\x7a\\x72\\x0d\\x8b\\x38\\xf7\\xe3\\x0a\\x7e\\x68\\x79\\x06\\x0b\\x5f\\x28\\xc8\\xab\\x17\\xb0\\x02\\x00\\x71\\x32\\x07\\xe8\\x63\\x7b\\xff\\x48\\x44\\xd8\\x42\\xd9\\xca\\x78\\x83\\x91\\x34\\x01\\x98\\xa3\\xfe\\x01\\x72\\xdf\\xa7\\x4d\\xe1\\xe5\\x5a\\xde\\xfb\\xc2\\xe9\\xbc\\x7e\\x88\\x54\\x76\\xd1\\xb9\\xc0\\x55\\x81\\x34\\x08\\xa4\\x75\\x28\\x43\\x43\\x55\\xbf\\x03\\xfd\\xd4\\xe2\\x7d\\x8b\\x34\\x61\\xb0\\xfb\\x66\\xab\\x3e\\x15\\xa8\\x79\\xa1\\x84\\x45\\x7e\\x9e\\xd9\\xea\\x6c\\x51\\xb6\\x63\\xb3\\x1e\\xdc\\x8c\\x4a\\x3c\\xd4\\x54\\xf6\\x9d\\x9c\\xe5\\x18\\xd1\\xb8\\x78\\x88\\xee\\x3d\\x9d\\xd5\\x41\\x6e\\x43\\xe1\\x14\\xac\\x05\\x72\\x13\\x52\\xdf\\xfc\\x2c\\xa8\\x85\\x97\\x37\\x7b\\xbc\\x41\\x40\\x09\\xb0\\xc2\\xfd\\x36\\x9b\\xe5\\xba\\x35\\xa6\\xdc\\xe3\\x47\\x8b\\x6c\\x11\\xb3\\x3c\\x0a\\x33\\x91\\x8b\\x6e\\xe5\\xac\\x4c\\xd4\\xc2\\xf1\\xca\\x6b\\xd1\\x90\\xa0\\x00\\xa8\\x38\\xda\\x38\\xf5\\x30\\x77\\x56\\x03\\x35\\x59\\x6d\\x13\\x58\\x93\\x77\\x93\\x96\\x38\\x10\\xa7\\x9a\\x21\\xb8\\xd4\\x61\\x40\\xe7\\x68\\x89\\x8d\\xcd\\xa8\\x8a\\x0f\\xaf\\x8d\\xdd\\x0d\\x63\\x38\\x47\\xaa\\xea\\x0e\\x03\\x0b\\xe6\\x45\\x5b\\x41\\xe3\\xed\\xe1\\xe2\\x87\\x37\\x30\\xeb\\x84\\x81\\xac\\xaa\\x7a\\x51\\x9c\\xf9\\x19\\x58\\x47\\xa8\\x6a\\xfa\\x57\\xf9\\x07\\x1d\\x44\\xf4\\xaf\\x4c\\xa0\\xd3\\x43\\xc9\\x0c\\x0d\\x22\\xd9\\x46\\x14\\x65\\x85\\xf0\\x0e\\xf3\\xae\\xf5\\x7f\\x0f\\x9e\\x55\\xe8\\x18\\xc0\\x12\\x8a\\xe2\\x55\\xdb\\xc3\\x11\\x6c\\xf0\\xfe\\x02\\x16\\x6d\\x54\\x85\\x9d\\xec\\xbf\\xdc\\xcc\"},\n{{0x0e,0x86,0x87,0x2c,0x78,0x62,0x0f,0x10,0xcb,0x6d,0xfc,0x46,0x3d,0x2c,0x28,0x72,0xc4,0xda,0x66,0x07,0x48,0xc9,0xcd,0xa0,0x1a,0xb1,0x45,0x69,0x58,0xaf,0xba,0x7f,},{0xde,0x49,0x89,0x98,0x92,0x69,0xca,0xbd,0x8f,0x4f,0x40,0x9c,0xf1,0xa4,0xd9,0x74,0x03,0x8b,0x27,0x55,0x02,0x27,0x35,0x57,0xf3,0x12,0xd5,0x55,0x3f,0xab,0x93,0xc3,},{0x20,0x37,0xe9,0x77,0x41,0xc3,0xe6,0x40,0x9c,0x66,0xfc,0x67,0x82,0xaa,0xb3,0x89,0xc5,0xd7,0x78,0x09,0x7a,0xc7,0x78,0x99,0x9e,0x85,0x76,0xe4,0x9e,0xf4,0xf6,0xa0,0xc7,0x73,0x0b,0xd9,0xe0,0x93,0xdd,0x3c,0x0a,0xe7,0xec,0x76,0x20,0x33,0x80,0xda,0x65,0x71,0x47,0xd3,0x3a,0x8d,0x9d,0xd6,0x5e,0xd0,0x0c,0xf7,0x62,0x24,0xd6,0x01,},\"\\xa9\\x00\\xf3\\xe9\\xc6\\x43\\xa5\\x64\\x9b\\x07\\x6f\\xb6\\x9c\\x3b\\x2a\\xc0\\x84\\xd5\\x2c\\xcb\\xaf\\xcd\\xca\\x5a\\x9d\\xb1\\xda\\xa7\\x05\\x00\\xde\\x99\\x33\\xd2\\x3d\\x15\\x3f\\x74\\x95\\x4e\\x1b\\xd5\\xf5\\x7b\\x89\\x9f\\xe8\\xa4\\xb1\\x34\\xc1\\x95\\x41\\x2b\\x49\\x83\\x3b\\x6e\\x50\\x95\\xa6\\x55\\x4e\\xaa\\x6d\\x84\\x4b\\x11\\xf1\\x58\\x4c\\x85\\x05\\x5b\\x87\\xf4\\x1c\\x99\\x96\\x69\\x04\\x6c\\x71\\xae\\xb5\\xc0\\x45\\x3f\\xd6\\xa3\\xc4\\x37\\xf8\\x15\\xf0\\x68\\x98\\x7c\\x38\\x68\\xcc\\x07\\xaa\\x2a\\xf6\\x58\\x19\\x04\\x6c\\x30\\x7b\\xaf\\xb7\\x53\\x0d\\xe8\\x4f\\x71\\x30\\xae\\xa7\\x8e\\xf0\\x05\\xd5\\xff\\xf5\\x2f\\x8d\\xea\\xf1\\xd5\\xe9\\xc3\\x26\\xd3\\x21\\x7f\\xc5\\x5b\\x94\\xf6\\x28\\xaa\\x10\\x4f\\x6a\\x24\\xa3\\x95\\xe6\\x2d\\x1b\\x62\\xbd\\x9c\\x0d\\x82\\x43\\x63\\x19\\xc5\\xd7\\x3e\\x57\\x65\\x43\\x5f\\x3b\\xa8\\x56\\xa4\\x73\\x4f\\xd6\\x0a\\xe6\\x17\\xf7\\xf0\\xc3\\xba\\x57\\x22\\xa7\\x33\\x66\\xc8\\x8a\\x6d\\xfe\\xca\\x85\\xc4\\x44\\x63\\x9f\\x44\\x1f\\x2c\\x55\\xfd\\xc4\\x64\\xec\\xb2\\x99\\xee\\xe3\\x6d\\x8e\\xae\\x06\\x3b\\xb9\\x4b\\xb2\\x43\\x9d\\xa0\\x4f\\xa5\\xeb\\xc5\\x09\\x23\\x38\\xa5\\x03\\x5e\\x48\\x0f\\x08\\x34\\xae\\xee\\x8d\\x71\\x1f\\x28\\xc4\\x6d\\xc9\\x60\\xde\\x1b\\xe9\\xdf\\x30\\x7c\\x18\\xc5\\xc1\\x78\\xb2\\x62\\x96\\xdc\\x56\\x7f\\x15\\xbf\\x60\\x86\\x3a\\x36\\x71\\x08\\x67\\xe9\\x2f\\xd5\\x10\\x48\\x86\\x56\\x74\\xc2\\xaf\\x0c\\x53\\xb2\\xe7\\xa2\\x48\\xae\\x5b\\xd0\\x9a\\x49\\xaa\\x03\\x06\\x18\\x49\\x5f\\x82\\x48\\x0c\\x42\\x0a\\xe1\\x06\\x88\\x9b\\xec\\x00\\x62\\x78\\xb9\\x22\\x72\\x07\\x57\\x09\\xfe\\xc9\\x54\\x87\\xcf\\xb1\\x00\\x61\\xe6\\x72\\x2b\\x93\\xee\\xbf\\xc0\\xbc\\x58\\x7b\\xf7\\xba\\x5f\\x66\\x92\\xb0\\x74\\xf5\\x5a\\x98\\xd5\\xc3\\x02\\x76\\x0b\\x1b\\xf1\\xd0\\x9f\\x7e\\x86\\x68\\x47\\x9c\\xa6\\xf0\\x1e\\xed\\xa2\\xfd\\xaf\\x58\\x4a\\xc2\\x05\\x8f\\xbf\\x7c\\xf3\\x10\\x0d\\x06\\xb8\\x09\\x1b\\xfe\\xab\\x51\\xc0\\xc0\\xb1\\xd4\\xee\\x3a\\x82\\x57\\xf6\\x9b\\x16\\x17\\x60\\x4f\\xce\\x95\\x3b\\xb5\\xf7\\xf2\\x71\\xc6\\xa1\\x88\\x0e\\xa1\\xb3\\xf6\\x62\\x67\\xe2\\x43\\x9f\\x34\\x58\\x06\\x28\\x91\\x78\\x77\\xc6\\x6e\\xc0\\xfe\\xd7\\x6e\\x44\\xe8\\xbb\\x2b\\x91\\xa8\\x80\\x6d\\xf4\\xba\\xca\\x6c\\xc9\\x28\\x89\\xb8\\x80\\x50\\x70\\xc9\\xa6\\x17\\xf8\\x07\\x15\\x75\\x30\\x75\\x1c\\xc1\\x7c\\x47\\xb0\\x9e\\xeb\\xa9\\x4d\\x22\\xb4\\xe5\\x47\\xc3\\x70\\xce\\x7a\\x49\\x6f\\xca\\xa3\\x41\\x2a\\xff\\xff\\xb8\\xc9\\xb4\\xde\\x89\\xb9\\xf1\\x21\\xaa\\xec\\x5f\\x54\\x4b\\x0c\\x72\\x5e\\xc5\\xee\\x9d\\x4b\\x34\\x76\\xad\\xc9\\xd0\\x50\\xed\\xb0\\xfd\\xba\\xf0\\x2c\\xa9\\xe3\\x8a\\xf1\\x5f\\x51\\x50\\x15\\xa2\\x67\\x29\\x2e\\xc9\\xaa\\x54\\x44\\xed\\x1d\\xec\\xd9\\xcd\\x9e\\x1e\\xad\\x64\\x87\\xa0\\xcc\\xef\\x99\\x5b\\x1c\\x60\\x0a\\x03\\x69\\x35\\x83\\x86\\x60\\xac\\xab\\x27\\x6d\\x8b\\x0e\\x5b\\x07\\xd9\\xf3\\x63\\x53\\x21\\x4b\\xf8\\x0f\\x94\\x1a\\xc8\\x8c\\xf4\\x0a\\x08\\xaf\\x91\\x79\\x26\\x23\\x41\\x12\\xec\\xcd\\xaa\\x16\\x2d\\xc9\\x9d\\xe3\\xe2\\x5b\\xaf\\xf6\\x5b\\xb0\\x1e\\x49\\x89\\x89\\x86\\x33\\x2b\\xdc\\x2d\\x70\\x5d\\x5a\\xea\\x40\\xf9\\xbc\\x4f\\xbb\\x28\\x06\\x89\\x44\\x96\\x03\\x8d\\xa2\\x36\\xe9\\xdc\\x29\\x60\\x0c\\x9c\\xed\\xea\\xc3\\xb6\\x16\\xcc\\x56\\xd8\\x9e\\xc2\\xfa\\x67\\x38\\x96\\x66\\xc6\\xc4\\xfe\\x23\\x3b\\x63\\x91\\x05\\x02\\x3e\\x10\\x1b\\x87\\x4a\\x63\\x30\\xfe\\x57\\x3f\\x80\\xac\\xe5\\x5d\\x03\\x7c\\xc6\\x12\\xe6\\xdf\\xd5\\xa6\\xe6\\x86\\xf9\\xa8\\x30\\x54\\xfc\\x46\\xe1\\x5b\\xb6\\xda\\x45\\x3d\\x81\\x0c\\xf1\\x38\\xa1\\x78\\xbf\\x03\\x9d\\x1e\\x18\\x16\\x14\\xff\\x40\\xcb\\xe6\\xbb\\x3b\\x47\\x36\\x63\\x75\\x2e\\xa8\\x02\\x5f\\xf7\\xf7\\x39\\xee\\x4b\\x67\\x11\\x0f\\x96\\x80\\x89\\xb2\\x47\\x3c\\xd0\\x44\\xd4\\x8b\\x00\\x9d\\x06\\x77\\xf7\\x91\\xf5\\x4e\\x2d\\xf6\\xaf\\xdc\\x3a\\xcb\\x9e\\x99\\xdd\\x69\\x58\\xa4\\x50\\xc0\\xe1\\xb6\\xdd\\x5e\\x97\\xa2\\xcc\\x46\\x29\\x8b\\x4f\\x48\\xac\\x6a\\xda\\xf0\\x13\\xd7\\x5b\\x2c\\x42\\x07\\x2d\\x2e\\xe1\\x3f\\x73\\x36\\x87\\xee\\x83\\xc3\\xf7\\x0c\\x4f\\xdd\\x97\\x20\\xfd\\x17\\x98\\xc6\\x62\\xfe\\xf3\\xba\\x01\\x2b\\xed\\xd4\\x45\\xc4\\x72\\x9f\\x21\\x30\\x48\\x4f\\xe7\\x7a\\xc1\\xb4\\xc4\\xdd\\xeb\\x81\\xfa\\xf6\\x0f\\x76\\xe3\\xbd\\x7d\\x21\\xa9\\xa6\\xc5\\x7a\\x69\\xa9\\xcd\\x9c\\xc2\\x03\\xfc\\x63\\xb5\\x9e\\xe8\\x4b\\x89\\x15\\xb3\\xc1\\x8a\\x59\\x54\\xe2\\x27\\xc8\\x6e\\xbb\\xb7\\xd4\\xc4\\xc1\\xa0\\x8d\\x0c\\x5e\\x46\\x7c\\x68\\xa0\\x69\\x70\\x75\\x1e\\xf5\\x84\\xbd\\xd6\\x11\\xe1\\xdd\\x1b\\x48\\x90\\x0a\\xb3\\x54\\xb9\\x9c\\xec\\x6e\\x1d\\xf3\\xbd\\x41\\x46\\xea\\x07\\x55\\x35\\x0d\\xc1\\x1c\\x3a\\x3f\\x60\\x0d\\x47\\x0a\\x74\\xf4\\x75\\xe4\\xfe\\xed\\xaf\\x08\\x65\\x27\\x6f\\xa8\\xa9\\x77\\x13\\x47\\x1d\\x0c\\xa9\\x95\\x5c\\x71\\x35\\x88\\x33\\x9d\\xee\\x79\\x65\\x6e\\x56\\x7e\\x6a\\xb1\\xdb\\xf9\\x83\\x07\\x03\\x81\\x7a\\xe6\\x20\\x92\\x9a\\x06\\x84\\xa5\\xca\\xf2\\x0f\\xef\\x81\\xa8\\xee\\x89\\x7b\\xe7\\xe5\\x05\\xad\\xe6\\x49\\x6b\\x9a\\xef\\x02\\x72\\xbd\\x8f\\x35\\x08\\x60\\x23\\x3b\\x33\\x8c\\x2e\\x36\\xd3\\x13\\x8d\\xb6\\x95\\x38\"},\n{{0x52,0x03,0x54,0xd8,0x5a,0x87,0xd7,0xc2,0x2c,0xa6,0xf7,0x84,0x71,0x44,0x10,0xec,0x98,0xbf,0x6a,0x65,0xf8,0x03,0xef,0x93,0x79,0xbd,0xc8,0x04,0x35,0x9b,0x23,0x49,},{0xd8,0x51,0x1c,0xea,0xc2,0xfd,0x66,0x1a,0xcb,0xff,0xb0,0x1b,0xa2,0x74,0x1c,0xad,0x88,0x99,0x34,0xde,0x63,0x92,0x96,0x1b,0xde,0xc6,0xfa,0x46,0x12,0x3b,0x7f,0x0f,},{0x75,0x4e,0x60,0xd3,0xf6,0xf4,0xab,0x4f,0x5d,0x0d,0xdb,0xb0,0x01,0x53,0x20,0x09,0x16,0x63,0x88,0x48,0x7f,0x78,0x0b,0x76,0xf6,0x0b,0xd0,0xbc,0x9f,0xef,0xab,0xfa,0xab,0x6b,0xe2,0xae,0x78,0x69,0x57,0x3a,0x64,0x79,0x6e,0xf2,0x84,0x6e,0x85,0xe5,0xcd,0xae,0x52,0xdb,0x10,0x44,0xfe,0xfa,0x79,0x6b,0xac,0xf4,0x8b,0x96,0x8b,0x0d,},\"\\xa1\\xd4\\xad\\x48\\x6e\\xbb\\x7c\\x1a\\x0a\\xcb\\x8f\\x11\\x70\\x13\\xe8\\xe4\\x74\\x67\\x89\\xc6\\x24\\x4a\\x56\\xc9\\xed\\xfb\\xf1\\xef\\x37\\xac\\x13\\x09\\xaa\\xf5\\x1c\\x93\\x75\\xfc\\x12\\xca\\xcd\\x68\\x97\\xa4\\x47\\x95\\x45\\xf2\\xbf\\x39\\x0a\\xb7\\xc0\\xc0\\xe5\\xc5\\x92\\xf5\\x50\\x6e\\x99\\x38\\x37\\x8a\\x11\\xb6\\x36\\xbf\\x85\\x70\\x29\\xb9\\x68\\x54\\x7a\\xa5\\x06\\xc4\\xa0\\x82\\x9a\\x15\\xfd\\x39\\x95\\xfe\\xad\\x4f\\x86\\x0f\\xd7\\xc6\\x23\\xc6\\x3e\\x86\\x95\\x43\\x6e\\xae\\x55\\x81\\x64\\x14\\x77\\x83\\x47\\x09\\x2f\\x5f\\x4d\\x42\\x2b\\xb1\\xb5\\xe5\\xa0\\x69\\x66\\x24\\x1e\\xfe\\xc1\\x4f\\x1e\\x4f\\xca\\x06\\x63\\x91\\x14\\x71\\x8c\\x30\\xeb\\xca\\xdd\\x4c\\x6d\\x8a\\xbe\\x7f\\xe9\\x3b\\x25\\xd1\\x71\\x73\\x53\\x39\\x54\\x18\\x8b\\x1a\\xb0\\x3f\\xcb\\x77\\x92\\xcb\\x63\\x5c\\xe3\\x6e\\x9b\\xdb\\xdd\\xe7\\xa5\\x61\\xc5\\xf6\\x69\\x20\\xd9\\x10\\xcb\\x26\\x9c\\x8c\\x1c\\x3f\\x59\\x32\\x65\\x09\\x00\\x72\\xc4\\x89\\x32\\xe6\\x92\\xa9\\xc7\\x38\\xc7\\x04\\x89\\x74\\x89\\xa7\\x15\\xc2\\xb3\\x94\\xd5\\xa8\\x6f\\x70\\x36\\xa4\\xca\\xc5\\xdc\\xb5\\xb8\\x5c\\xfa\\x16\\x21\\x56\\xe0\\xbc\\x6b\\xfe\\x02\\xfb\\x4c\\x38\\x60\\x8c\\xfb\\x23\\xc9\\x2b\\x8b\\x6a\\x3c\\xb4\\x6e\\x48\\x7d\\x60\\xe0\\xdc\\x97\\xaa\\x2e\\x33\\xe3\\xda\\xda\\x92\\x5e\\x4e\\x66\\x12\\xcc\\x5a\\xf1\\x25\\xe5\\xac\\xa4\\x58\\x17\\xa2\\xfd\\x6c\\x3f\\xf1\\x0b\\x18\\x93\\x8b\\x44\\xbd\\x4d\\xd2\\x0d\\x7f\\xcc\\xf7\\xf2\\x6b\\x40\\xa6\\x6f\\x48\\xaa\\xff\\xc9\\xa5\\x41\\xe6\\xd3\\x71\\x38\\xfc\\x55\\x46\\x98\\x68\\xe2\\xd1\\x03\\x65\\xef\\xf3\\x7f\\xac\\x36\\x0f\\xab\\x3d\\xc5\\x54\\x37\\xac\\x2d\\x8f\\xea\\x74\\x74\\x40\\x5f\\xb3\\x63\\x0f\\x79\\x63\\xd2\\xd4\\x59\\x58\\xf9\\x09\\xd1\\x48\\x30\\x28\\x6f\\xf1\\x52\\xaa\\x75\\x2f\\x51\\x0c\\xe9\\x80\\xbd\\x57\\x54\\xe3\\xfa\\x32\\xc6\\x99\\x24\\xdd\\x95\\xd5\\xc1\\x52\\xa7\\x37\\xa8\\xfa\\xdc\\xfd\\x0a\\x45\\x60\\xe0\\xb1\\x14\\xf8\\xe8\\xaa\\xa6\\x18\\xd4\\x38\\xb9\\x87\\x71\\x11\\xda\\x17\\x40\\xef\\x81\\x7c\\x44\\x19\\x39\\xec\\xec\\x79\\x9b\\xa1\\x6b\\x1b\\x17\\x1c\\xa9\\xb6\\x49\\xb7\\xd7\\x8f\\xa0\\x52\\xd1\\x49\\x7a\\x50\\x76\\x88\\xbe\\xde\\x49\\x00\\xab\\xc5\\x3a\\x96\\x48\\xda\\x59\\x17\\x03\\x5c\\xef\\xfe\\x0d\\xa2\\x1c\\x25\\xc0\\x9b\\x06\\xd6\\x18\\x5b\\xdd\\xa2\\xd7\\x78\\xf7\\xed\\xe6\\x15\\x3e\\x3e\\xaf\\xf4\\x95\\xc9\\x79\\x6d\\x4d\\x16\\x6d\\x2d\\x2e\\xa4\\x18\\xe4\\xa4\\xaa\\x6e\\x67\\x8f\\xaf\\x06\\x96\\xe7\\x52\\xa0\\x9e\\x02\\xea\\xad\\xe7\\x63\\x07\\x0e\\x08\\x8e\\x99\\x64\\x91\\x9f\\xf4\\xaa\\x4c\\x82\\xf8\\x62\\x9a\\x3d\\x5c\\x79\\x7c\\x2a\\x64\\x59\\x4d\\x20\\x68\\x35\\xda\\x0b\\xfa\\x43\\xcc\\xd9\\xdd\\xfc\\xdb\\x6a\\xac\\x4d\\x48\\x6e\\x03\\xc8\\x41\\x22\\x37\\x59\\x39\\xa5\\x27\\x0b\\xc1\\x51\\x9e\\x07\\x07\\xe5\\x1c\\x3f\\x46\\xf1\\xe5\\xc5\\x66\\xb3\\x3a\\x24\\x5f\\xa0\\xc2\\x02\\x83\\x84\\x72\\x36\\x3d\\xe9\\xf0\\xed\\xde\\x2e\\x79\\x1d\\x82\\x29\\x30\\x95\\xf7\\x50\\xbf\\xf5\\x45\\xe6\\xc3\\x47\\x39\\xdc\\xc5\\x4d\\xb0\\xa3\\x6a\\xe2\\xe2\\xaa\\x39\\xb0\\x7c\\xb4\\xf6\\xa9\\x64\\x62\\x40\\xd2\\xd3\\x14\\x88\\xf6\\x78\\x15\\xb2\\x95\\x45\\xd2\\x20\\xbe\\x92\\x9e\\x33\\x39\\xf8\\x28\\x1a\\x93\\x7e\\x05\\xa8\\xc5\\xc3\\x88\\x7e\\x06\\x04\\x8e\\xa7\\xb1\\x8a\\x48\\xf8\\xd9\\x1b\\x1e\\x3a\\xf5\\xca\\xb5\\xce\\xda\\x0e\\xbd\\x71\\xbf\\x54\\xed\\xec\\x20\\x3d\\x37\\x16\\x5e\\x4c\\x9f\\x9f\\x80\\x46\\x1c\\xd2\\x9f\\xcd\\x99\\xdd\\xea\\x43\\x96\\x93\\x94\\x1b\\x5d\\x53\\xff\\x94\\x37\\x9c\\xf6\\x42\\x57\\x1d\\xd5\\x59\\xa1\\x1f\\x8f\\x38\\x3d\\x94\\x3f\\x22\\x55\\xcf\\x71\\x58\\x00\\xaf\\x77\\x6b\\x10\\x45\\xbf\\x19\\xa9\\xc9\\xbb\\x09\\x51\\x55\\xdf\\xb6\\x46\\xb6\\x5f\\x4a\\x28\\x0f\\x2a\\x97\\xef\\x92\\x7d\\xda\\xbe\\x24\\xa2\\xf9\\x71\\xa8\\x17\\x0d\\xd4\\x2a\\x08\\x92\\x76\\x82\\x5c\\xb9\\x14\\x8c\\x01\\x5a\\xae\\x1e\\x9d\\xad\\xf2\\x2c\\x10\\xe7\\x54\\x8c\\x59\\xbf\\x6b\\x86\\x8b\\x20\\xe8\\x6c\\x83\\xa9\\xe7\\x34\\x3a\\xec\\x27\\x54\\xee\\x62\\x25\\xf9\\xfd\\xce\\xaf\\x8e\\x51\\xc4\\x0e\\x95\\x5b\\xda\\x49\\xc3\\x5d\\xed\\x38\\xfa\\x8b\\xcc\\x1e\\x6c\\x8f\\xc9\\xc2\\x41\\x2e\\x91\\x04\\xc5\\xc2\\x36\\x8b\\x1f\\x99\\x23\\xe0\\x10\\xfa\\x2e\\xde\\x91\\x1d\\x42\\xb1\\x39\\xf4\\x00\\x7e\\x34\\x26\\x92\\x2f\\xfb\\x61\\x58\\xec\\xa9\\x7b\\x47\\xcf\\xc9\\x97\\x85\\x35\\x12\\xbb\\x9d\\x4c\\xa2\\xf0\\x17\\xc2\\xc2\\x63\\xdc\\x19\\x9f\\x3b\\xf1\\xeb\\x4f\\x15\\x08\\xef\\x82\\x8b\\x0e\\x00\\xdb\\x21\\x00\\x27\\x36\\xa7\\xf2\\x2e\\xc9\\x12\\x98\\x19\\x45\\x83\\x13\\x9a\\xd7\\x5f\\x58\\xe2\\x1b\\x51\\x8d\\xaa\\x49\\xa4\\x07\\x6c\\x63\\x75\\xfa\\xa6\\x08\\x91\\xa6\\x9e\\x52\\xa6\\x56\\x69\\x9d\\x80\\x34\\xa7\\xab\\x7f\\xcb\\xe4\\x21\\x75\\x49\\x14\\x41\\xfe\\x61\\xb1\\x78\\x3e\\x83\\x78\\x57\\x52\\x22\\x15\\xa5\\xfa\\xc5\\x59\\x0b\\xed\\x2e\\x9d\\x20\\x66\\x06\\x09\\x6d\\x3b\\xe8\\xee\\x92\\x87\\x3b\\xfc\\x30\\xca\\xb1\\x5c\\xe9\\xf9\\x91\\x0d\\x01\\xa1\\x17\\xf8\\x99\\x26\\xcc\\x3a\\xfa\\x8d\\x10\\x4f\\x79\\x9f\\xf3\\x80\\x98\\xde\\x28\\xb8\\xff\\x0f\\x03\\x87\\x25\\xc2\\x90\\x3b\\x24\\xc1\\x42\\x9c\\xea\\x49\\x25\\x24\\x9d\\x87\\x81\"},\n{{0x06,0x1b,0xcf,0x1a,0xa6,0xfd,0x98,0x98,0x97,0xb3,0x22,0xe5,0x91,0xcc,0xef,0x54,0x54,0xef,0x4a,0x5a,0xdb,0x1a,0x48,0x00,0xf3,0x26,0x11,0xcf,0xf2,0xb5,0xbc,0x78,},{0x73,0xc8,0x0b,0x73,0x4b,0xfc,0x94,0x17,0xd5,0x76,0x89,0x0c,0x20,0x16,0x6d,0xa5,0xc7,0xfa,0xbd,0x61,0x3f,0x75,0x47,0x4f,0x76,0x49,0x73,0x2e,0x00,0x29,0x5b,0xe2,},{0x5a,0xda,0xa9,0x43,0x30,0xa0,0x35,0x37,0x12,0xa3,0x4d,0xbe,0x97,0x3b,0x75,0x18,0xf9,0xa2,0xc7,0x13,0xf8,0xaa,0xd1,0x00,0x25,0x1b,0x08,0x6a,0xe8,0xde,0x26,0xf6,0xd2,0xb6,0xcc,0xf0,0x52,0x8c,0xc5,0xde,0xdc,0xa3,0x18,0xdf,0x19,0xcc,0x7e,0x45,0xde,0xae,0x28,0x1e,0x13,0x24,0xb9,0x6e,0x32,0xfe,0xf4,0x5a,0xaf,0x60,0xb1,0x0c,},\"\\xd6\\x3b\\xb9\\x20\\x8c\\x1f\\x4c\\x7d\\x43\\x32\\x6c\\xf3\\x5f\\xa5\\xd8\\x39\\x33\\x15\\x18\\x04\\xab\\x89\\x1d\\x49\\xb0\\xbd\\xaf\\x42\\x9e\\x4c\\x39\\xa3\\x21\\x42\\x8e\\x0d\\x90\\xaa\\x00\\x31\\x8b\\x97\\xe0\\x8c\\x70\\x24\\xc9\\x12\\xcf\\x38\\x88\\x79\\xf3\\xcf\\x97\\x4b\\xb2\\x53\\xa1\\xe7\\xa4\\xc8\\xee\\xc1\\x93\\xbf\\x4c\\x14\\xaf\\x6f\\xb9\\x79\\x4d\\xf0\\xd4\\x97\\x85\\x0e\\xdb\\x04\\xd5\\x74\\xc9\\x7e\\xd7\\x6c\\x70\\x21\\x39\\x96\\x84\\x01\\xb4\\x0e\\xb5\\x43\\x94\\xef\\x4c\\xfa\\xa7\\xe5\\xd3\\xcd\\x94\\x3a\\xf1\\x21\\x92\\x53\\x8d\\xde\\xe5\\x93\\xc2\\xa2\\x4a\\x26\\x7a\\xfa\\x13\\x71\\xfd\\x77\\xfe\\xee\\x20\\x71\\xf4\\x36\\x9f\\xbe\\xf8\\x79\\x76\\xe7\\xeb\\xd8\\x1d\\x1e\\x5b\\x31\\xd6\\xe0\\x9e\\x02\\xd8\\x30\\x35\\x7d\\x36\\xbf\\xf8\\x59\\x67\\x03\\xe4\\x14\\x6d\\x08\\x27\\xbe\\xc9\\xc0\\xf8\\x7b\\x26\\xf3\\x11\\x95\\xc9\\x6c\\x93\\xb6\\xd8\\xc4\\x67\\x67\\xec\\x1b\\xc6\\xde\\x39\\xf0\\x00\\x8a\\x41\\xff\\x87\\x5d\\xa0\\x50\\xa3\\xf8\\x65\\xab\\x92\\xcb\\xf2\\x9c\\x38\\xa2\\x80\\xf3\\xbf\\x69\\xf6\\x8e\\x92\\xb5\\xf4\\x30\\xcd\\xee\\x35\\x01\\x98\\x1d\\x0b\\x3d\\x18\\x90\\x96\\xe0\\xae\\xac\\xd6\\x4c\\x33\\x10\\x24\\x21\\x34\\x88\\x12\\x15\\x8b\\xb6\\x1e\\x51\\xae\\x93\\x65\\x92\\xb2\\xf8\\xf1\\xb9\\x10\\x94\\x9e\\xf3\\x72\\x32\\x58\\xa9\\xb4\\x4e\\x4e\\x1b\\xda\\xdf\\x1a\\xe2\\xcf\\xc1\\x8e\\x37\\xd2\\xed\\x0d\\xd1\\x73\\x44\\x04\\xb8\\xba\\xa5\\xf3\\x93\\xcd\\x56\\x06\\x9e\\xce\\xbf\\x7e\\xdd\\x7c\\x06\\xcf\\x6c\\x8a\\xa3\\xe8\\xe1\\x2f\\xbf\\x94\\x6d\\x7b\\x32\\xd8\\x45\\x3b\\x6f\\xbb\\x65\\x35\\x52\\x6c\\x8f\\xb8\\xfc\\x1d\\x58\\x15\\x56\\x0b\\xb3\\x1b\\x99\\x5d\\xf2\\xad\\xbd\\x83\\x6a\\xdd\\x92\\x9a\\x56\\xfd\\xd9\\x3a\\x17\\x47\\xd9\\x3a\\x40\\xc0\\x5e\\x12\\x9e\\xb6\\xf8\\x58\\x3c\\x29\\x21\\xcc\\x9d\\xbd\\xda\\x42\\x25\\xe1\\x76\\xdb\\x38\\x6a\\x02\\xec\\x40\\xaf\\x10\\x32\\xc9\\xb6\\x2e\\x95\\x14\\x70\\x25\\xf4\\xac\\x8d\\xd5\\x84\\x33\\xb6\\x4a\\xc0\\x73\\x15\\x0c\\x69\\xb9\\xc4\\x15\\x4d\\xcb\\xb0\\x03\\x44\\xf3\\x08\\x11\\x3c\\xd9\\x19\\x9c\\xcf\\xb5\\x07\\x58\\x01\\xc7\\x05\\xb8\\xfc\\x43\\xb7\\xc8\\xbc\\x16\\x73\\x65\\xe4\\x62\\x93\\xd0\\x6c\\x4f\\x48\\x35\\xc6\\x4e\\xe5\\xd5\\x38\\x3f\\x68\\x90\\xca\\x35\\xa8\\x0a\\xf9\\x17\\x74\\x81\\x62\\xdf\\x25\\x18\\xab\\x14\\x68\\xf1\\x53\\x62\\x98\\x99\\x40\\x6c\\xde\\x66\\xce\\x07\\xfa\\x7d\\x29\\x93\\xda\\xbe\\x0c\\x60\\x08\\x9c\\x91\\x89\\x24\\x88\\xf3\\xbc\\xaa\\xec\\x40\\x8a\\x0c\\xd0\\x8c\\x9a\\xa9\\x8e\\x09\\x37\\xe0\\x2c\\x41\\xad\\x52\\xd2\\x41\\xa9\\x98\\x33\\xe3\\xb8\\x3f\\x7d\\x3f\\x1b\\x07\\x8c\\x31\\xd4\\x5c\\x34\\xfa\\x01\\x75\\xab\\xbd\\x0f\\x32\\x2b\\x8f\\xd2\\xdc\\x83\\x49\\x1d\\xa2\\x92\\xad\\x00\\x76\\x2e\\x3e\\x57\\x7b\\x9e\\xee\\x0a\\xae\\x08\\x72\\x90\\x70\\xac\\x25\\xe3\\x3b\\xc9\\x45\\x25\\xbc\\x0d\\x2a\\xb5\\x97\\x04\\xef\\xec\\x5c\\x01\\x48\\x42\\x1a\\x47\\x92\\x8d\\x34\\xb1\\xe4\\x5c\\xe7\\x21\\xee\\x64\\x47\\xfb\\x08\\x2a\\xc4\\x00\\xb3\\xe6\\x84\\x6d\\x20\\x4f\\x7f\\x9d\\xb6\\xf0\\xa3\\x2b\\x2a\\x69\\x73\\x8b\\x3e\\xe9\\xdd\\xbb\\x0d\\xbd\\x7e\\x0f\\x04\\x1d\\x7e\\xa5\\x3a\\x5d\\x64\\x7f\\xb5\\x0b\\x39\\xae\\x24\\xd7\\x8c\\x8b\\x07\\xcf\\xc4\\xe0\\x52\\x71\\x1f\\x0d\\x46\\x39\\xe7\\x21\\xd5\\xc3\\x6f\\x31\\xb5\\x88\\x86\\x67\\x12\\xb7\\x57\\x10\\x8a\\x40\\xcc\\x7a\\xbb\\xb9\\x91\\x30\\x83\\x30\\x3a\\xae\\x05\\xa0\\xf1\\xaf\\x0e\\xc6\\x87\\x84\\x41\\xa2\\x5c\\xf8\\x72\\x9a\\xba\\x42\\xa3\\xa9\\x4c\\xe9\\xb7\\x38\\x88\\xa0\\xf5\\xc9\\xe4\\x0c\\x9f\\xc4\\x54\\x10\\xf0\\x68\\x1f\\xa7\\xf9\\x08\\x98\\x56\\x2c\\xcb\\x4b\\xbc\\x55\\xf0\\xab\\x1f\\xe9\\xc7\\x0e\\xa6\\x60\\x26\\xdd\\xa8\\xd7\\x09\\x0f\\x7b\\x38\\xed\\xb5\\xae\\xc1\\x55\\x7b\\x11\\x66\\x98\\x7c\\xd4\\x1a\\x70\\x59\\xcd\\xee\\x60\\x9b\\x74\\xd8\\xfe\\x06\\xb7\\x05\\x9b\\x77\\x24\\xbf\\xf5\\x30\\x07\\xf7\\xe1\\x10\\x46\\x2f\\x06\\xad\\x14\\xd0\\x7e\\xe1\\xb4\\xd6\\x9a\\xc8\\x23\\xbc\\xf5\\x76\\xd2\\xfa\\x9e\\x2e\\x8e\\xd7\\xf3\\x19\\x80\\x40\\xd4\\x71\\x29\\x60\\x63\\x13\\x7c\\x98\\x1a\\xdb\\xf3\\x64\\xcb\\x20\\xf0\\xa1\\xad\\x20\\x54\\x47\\x2f\\x7c\\xee\\x25\\x27\\xf9\\x98\\x09\\x61\\x5d\\x2e\\x4b\\x73\\x4b\\x06\\xf3\\x5d\\xee\\xcb\\xd6\\x26\\x19\\x66\\x3d\\xde\\x81\\xd6\\xe2\\x35\\x28\\xb0\\xc9\\x71\\x32\\xaf\\x0a\\x23\\xba\\xd6\\x3d\\x9c\\x08\\x14\\x2a\\x26\\xe2\\x74\\x3f\\x86\\x18\\xec\\xfe\\x72\\x3b\\x19\\xff\\xdd\\x0b\\x19\\xab\\xd9\\xa3\\xf4\\xfe\\x21\\x0b\\x1e\\x71\\xac\\xdf\\xe3\\x8a\\xbe\\xbe\\x23\\xf7\\xfd\\xef\\x66\\x38\\x1c\\xbc\\x75\\xf3\\x07\\xe5\\x57\\x72\\x35\\xb0\\x2e\\x4c\\xd9\\xcf\\xaa\\x15\\x03\\x08\\x68\\xed\\x14\\x53\\xda\\x58\\xf7\\x83\\xb7\\x35\\x2b\\x04\\x65\\x68\\x44\\xc0\\x42\\x44\\x1e\\xfe\\x6a\\x3b\\x4f\\x8f\\xec\\x8f\\x7d\\xe8\\x07\\x44\\x54\\x0c\\x4f\\xc7\\xa1\\x07\\xf4\\xe1\\xbf\\xcb\\xd9\\x9d\\xa2\\x5b\\x97\\x46\\x09\\x5d\\xdf\\x01\\x25\\xd5\\x6d\\xa7\\xe7\\xf8\\x60\\x3f\\x04\\xd3\\x59\\xa0\\x88\\xb4\\xc0\\x44\\xf9\\x36\\xcc\\xb7\\xd8\\xf8\\x9e\\xd5\\x3c\\xc9\\x91\\xa3\\x49\\x7c\\xa9\\x52\\x09\\x4f\\xf3\\xc3\\x30\\x46\\xf2\\x60\\x9d\\x07\\xb2\\x9b\\x63\\x39\\x81\\x36\\x9c\\xb2\\xf0\\xee\\xcd\"},\n{{0x2e,0x19,0xcd,0x44,0x2f,0x22,0xa4,0xa9,0x9d,0xff,0xc5,0x5e,0x7b,0xf6,0x25,0xf8,0x9d,0x13,0x44,0xb5,0x63,0xf6,0x78,0x53,0x13,0xa7,0xee,0xe9,0x73,0xb4,0xaa,0x36,},{0xee,0x3d,0xa7,0x6a,0x8f,0xcf,0x40,0x3a,0x29,0x58,0xd4,0x55,0x1d,0xa0,0xa7,0x2b,0x2e,0x73,0x85,0x22,0xb2,0xe6,0xb2,0x0f,0xba,0x6a,0xa2,0x6b,0x32,0x30,0x73,0x57,},{0x28,0x32,0x6b,0x5b,0x97,0x8e,0x0d,0xbd,0xab,0x5d,0xde,0x70,0x37,0x85,0xa6,0x67,0xa7,0xef,0x43,0x9d,0x81,0xea,0x47,0xe0,0x66,0xb0,0x89,0xd1,0x16,0xc2,0x5a,0x34,0xbb,0x63,0x3f,0x26,0x0d,0x55,0xf4,0x5b,0xdf,0x6b,0xcd,0xa7,0x48,0x03,0xd7,0x62,0x4b,0x19,0x27,0xce,0xc1,0x8e,0xb1,0x99,0x22,0x60,0xbe,0xef,0xc3,0x99,0xd9,0x0e,},\"\\x1b\\xfc\\x5c\\x6a\\xa6\\xa5\\x35\\x4f\\xbb\\x86\\x14\\x69\\x79\\x63\\x48\\xac\\x63\\x19\\x12\\x4d\\xa3\\xf1\\x0d\\x20\\xd5\\x0b\\xbd\\xc7\\x15\\x9d\\x41\\xb5\\xab\\xb1\\x36\\xc7\\x99\\x6a\\x77\\x37\\x97\\x12\\x2b\\x52\\x5e\\x8e\\x2d\\xca\\x19\\x54\\xf6\\x39\\x17\\x07\\x30\\x1d\\x90\\xf2\\x10\\x1b\\x46\\xc7\\xb0\\x86\\xef\\xa1\\x58\\x77\\xca\\xdc\\xd0\\x58\\x12\\xdb\\x34\\xb9\\x96\\xcb\\x4f\\x53\\x1a\\xbc\\xd1\\xe9\\x8d\\xb0\\x8a\\x5c\\xf1\\x36\\x8e\\x8f\\x4b\\x11\\x09\\x14\\x2e\\x95\\x62\\xbd\\x00\\x85\\xff\\xae\\x5e\\x66\\x0f\\x59\\xc9\\x30\\x79\\x3e\\xbd\\xb6\\xe8\\x0b\\x0a\\x2f\\x4f\\x3f\\x59\\xbf\\x9d\\x39\\x5c\\x48\\xd2\\x6e\\x0a\\x72\\xa6\\x0f\\x9d\\x1f\\xf8\\x7f\\xd2\\xd7\\xa3\\xf5\\x38\\x3a\\xa9\\x02\\xad\\xed\\xed\\xeb\\xc6\\xcd\\x1b\\xef\\xd0\\x38\\x33\\x61\\x62\\x74\\x9d\\x91\\xa9\\x57\\xca\\x2e\\x3d\\xd4\\x70\\x91\\xc5\\x59\\x31\\x13\\xda\\x87\\xc3\\xd6\\x6a\\x02\\xc8\\x0a\\x6e\\xdd\\xb5\\x35\\xc4\\x8c\\xa1\\xf3\\x4a\\x97\\xfd\\x1c\\x95\\xeb\\xc2\\xe5\\x70\\xfc\\x8f\\xaf\\xe6\\xe5\\xd6\\x54\\x6d\\x1f\\x3a\\x9b\\xa8\\xda\\xac\\x33\\x4c\\xf4\\x7b\\xf1\\x17\\xe1\\x28\\x0d\\x0e\\xbd\\xf1\\x4b\\x0f\\xcd\\xbb\\x43\\xb8\\xd2\\x48\\xcc\\x6b\\x61\\x32\\x0f\\xdb\\x04\\x49\\xed\\x5f\\x5d\\xe8\\xba\\xb1\\x21\\xaf\\x0d\\x85\\x54\\x95\\x6e\\x6a\\x12\\x01\\x6b\\x42\\x67\\x7b\\x44\\x36\\x78\\x92\\xc3\\xb2\\x0a\\xfc\\xc2\\xcb\\x9c\\xfb\\x5b\\x10\\x0a\\x95\\xb5\\x1e\\x8b\\x07\\xda\\x9f\\x51\\x41\\x5f\\x4c\\xd7\\x78\\x1a\\x31\\x37\\x65\\xe2\\x0d\\xb2\\x7f\\x23\\x43\\xe0\\xf7\\x19\\xec\\xea\\x9a\\xf0\\x26\\x95\\x6f\\x33\\x87\\xe9\\xea\\x7e\\xd0\\xa2\\x93\\x75\\x9b\\x4a\\x26\\x22\\x02\\x80\\x7b\\x41\\x30\\x9f\\xb8\\x0f\\x50\\x18\\x5d\\xb6\\xa5\\xf8\\xbd\\xca\\x17\\x88\\x41\\xbe\\xc0\\x6a\\xdd\\xc7\\x61\\x0d\\xf7\\x60\\x17\\xb5\\x14\\xbc\\x41\\x42\\xf2\\x6a\\x36\\xbf\\x5b\\xac\\xec\\xb0\\x12\\xfa\\x41\\x71\\x0d\\xd8\\x49\\xbe\\xf7\\xa7\\xe4\\x51\\x43\\x28\\x36\\xfe\\x9b\\x32\\x65\\xfd\\x5b\\x59\\xee\\x40\\xb0\\x4d\\xad\\x85\\xcf\\x48\\xf8\\x91\\x46\\x5a\\x84\\x2c\\xd4\\x50\\x0a\\x10\\x24\\xee\\xfd\\xf0\\xf5\\x54\\xf0\\xca\\x17\\xec\\x9f\\x7b\\x71\\x52\\x56\\xa9\\xb9\\xdb\\xe2\\x79\\x66\\x38\\x6d\\x8a\\xc3\\x7d\\x3c\\x51\\x58\\x96\\xde\\x0f\\x7c\\xdf\\x7c\\xf5\\xb3\\x20\\xff\\x7a\\x8e\\xf6\\xb3\\x4b\\xa8\\x20\\xab\\xa9\\x06\\x6d\\xd2\\x53\\xc5\\xb7\\x76\\x37\\x77\\xf9\\x4b\\x2d\\x6a\\xd8\\xc7\\x10\\x22\\x1e\\x11\\x37\\x53\\x5d\\xff\\x8a\\x1b\\x75\\x65\\xec\\x81\\xbd\\x8d\\xde\\xb5\\x02\\xe3\\xd5\\x8f\\xf8\\xf1\\xfe\\x6e\\x86\\xb8\\xdc\\x15\\xa3\\xaa\\xec\\x68\\x8b\\xbb\\xec\\xd4\\x68\\x82\\x81\\xdb\\x0f\\x81\\x8d\\xe0\\xf7\\x26\\x1b\\xa9\\xcc\\x58\\xc8\\xbc\\x0d\\x02\\xe0\\x66\\x32\\xef\\xe7\\x28\\x7a\\xd7\\xa8\\x43\\x31\\xa8\\x24\\xd9\\x28\\x73\\x44\\xef\\xaa\\xa7\\x4f\\x1f\\xc5\\x76\\xd0\\x26\\x94\\x30\\xf8\\x56\\xa8\\x56\\x52\\x65\\xb9\\xd6\\xef\\x71\\xfe\\x13\\x4d\\x25\\x10\\xab\\x06\\xb6\\x0b\\xf3\\xc1\\x53\\xb5\\x7e\\xcf\\xd2\\xe6\\x34\\x24\\x03\\xfe\\x67\\x8b\\x58\\x86\\xb6\\xb7\\x34\\xb7\\xd3\\x69\\x06\\x62\\xb6\\xc8\\xc6\\xf6\\xe2\\x50\\xe5\\xaf\\x6a\\x81\\x83\\x16\\x6d\\xdc\\xd0\\xa1\\x7f\\x0c\\xdd\\xc8\\x63\\x6e\\xf1\\xa6\\x84\\x98\\xbe\\x50\\xb6\\x59\\x95\\x39\\xd4\\x6b\\x4c\\xea\\x97\\x13\\x0e\\x08\\xf9\\x4c\\xa5\\x3e\\x88\\x46\\x44\\xed\\xa7\\x5d\\x23\\xcd\\x2c\\x03\\x8a\\x5f\\x17\\xb5\\x91\\xe2\\x13\\x69\\x37\\x8c\\xd3\\xfb\\x57\\x62\\xd1\\xa7\\xc3\\xe6\\x6a\\x11\\xae\\x6e\\x91\\xcb\\xae\\x61\\x6a\\xd0\\x55\\xe3\\x9d\\xc4\\x1e\\x15\\x4f\\x4f\\xce\\xd7\\xb2\\x69\\x6d\\x9d\\xc6\\x73\\x80\\xbb\\x8e\\xef\\x47\\x4e\\x9a\\xa8\\x3c\\xec\\x47\\xfa\\xfa\\xfb\\x94\\x1d\\x62\\x65\\x64\\xb2\\x07\\x5b\\xcc\\x08\\x56\\xda\\x8d\\x6e\\x1b\\x0b\\x8f\\x18\\xba\\xf7\\x51\\x3b\\xbd\\x14\\xe4\\x91\\xed\\x51\\x79\\x68\\xc4\\xf7\\x24\\x1a\\xf2\\x50\\x98\\xee\\x8d\\xf1\\x30\\xb7\\xa3\\x4d\\x59\\x73\\x6d\\x78\\x36\\xd3\\x23\\xfe\\x3f\\x43\\xf5\\x08\\xcd\\xcb\\x75\\x58\\x95\\xf5\\x9a\\x00\\xc8\\x04\\xed\\x16\\x4c\\xc3\\x39\\x92\\xf3\\xae\\xe9\\x62\\xae\\x9e\\x99\\x0b\\x74\\x27\\x2e\\xb9\\x87\\xb1\\x2d\\x90\\xb2\\x73\\x14\\xd5\\x74\\x00\\xe7\\x37\\xd1\\x34\\x3e\\x97\\x09\\x85\\xc4\\x27\\x10\\x60\\x87\\x6a\\xbc\\xd7\\x04\\x9e\\x7c\\x9f\\xe2\\x44\\xff\\x3e\\xf9\\x85\\x60\\x99\\x5b\\x74\\x82\\xd3\\x1b\\xc7\\xc0\\x9d\\x99\\x69\\xf7\\xcd\\x41\\xf4\\xe4\\xe2\\x52\\x75\\x0d\\xc1\\x6c\\xcd\\xb2\\x9b\\x98\\x53\\x14\\xa0\\xb6\\xe7\\x49\\xc9\\x5f\\x9b\\xd2\\x83\\x8d\\x5a\\xc4\\x9e\\xe0\\x31\\xfd\\x07\\x9b\\xec\\x30\\x28\\xdd\\x9d\\xd0\\x7d\\xb6\\xfa\\x62\\x2a\\xd6\\x21\\xb3\\xb1\\xe1\\x27\\xe8\\xfc\\xa3\\x7b\\xd1\\x46\\xe3\\xcf\\x70\\x3e\\x91\\x17\\x01\\xb7\\xa1\\x6c\\x2d\\x30\\x36\\x9c\\x94\\x64\\x8e\\xcc\\x03\\xdf\\x10\\xd7\\xdd\\x5c\\x05\\x58\\xfa\\x95\\x93\\x42\\x5d\\x94\\x87\\x27\\xd6\\x86\\x0c\\x3a\\x14\\xf8\\x11\\x24\\x51\\x06\\x61\\x6d\\x2a\\x5f\\xa9\\x81\\xc6\\xb7\\xf4\\x7e\\xc9\\xde\\xf6\\x54\\x12\\xd1\\x32\\xac\\xc6\\x91\\x9d\\xa4\\xe8\\x85\\x97\\xaa\\x91\\x90\\xca\\x61\\x4b\\x21\\x80\\x66\\xa0\\xf7\\xb1\\x69\\x97\\xee\\x74\\x7c\\x5a\\x09\\x78\\x5e\\x50\\xd0\\xa8\\x91\\xd9\\x59\\x37\\x86\\x3d\\x61\\x3c\\xef\\xf7\"},\n{{0x82,0x10,0x90,0x99,0xd1,0xea,0xfe,0xed,0x5a,0x85,0x20,0x60,0x46,0x49,0x1b,0x34,0xd0,0x6d,0xcd,0xe3,0x3f,0x08,0x09,0x60,0x28,0x7b,0x10,0xfb,0x23,0xff,0x9f,0x78,},{0x08,0x1c,0xfd,0xf2,0xd7,0x58,0x65,0x4c,0x41,0xc4,0x47,0xe1,0xe6,0x27,0x38,0x10,0xf8,0xa7,0x38,0xa7,0x33,0xaf,0xc4,0x22,0x94,0xa2,0xb1,0xbb,0xb7,0x69,0xef,0xce,},{0xb3,0x98,0x7f,0x32,0x4b,0xc7,0xe7,0x76,0xc0,0xf2,0x87,0xfa,0x13,0xad,0x28,0x74,0x16,0x95,0xe2,0xe7,0xbc,0xe8,0xd1,0x43,0xe2,0x9f,0xad,0x5d,0x00,0x99,0x47,0x58,0xe2,0x25,0xfb,0x80,0x21,0x00,0xd2,0x3f,0xd6,0xcc,0xaf,0xee,0x8e,0x0a,0x95,0xbc,0x47,0x9b,0xe8,0xc2,0x3a,0x11,0x31,0x97,0x45,0x76,0x5b,0x7c,0xd4,0x7e,0x70,0x06,},\"\\x84\\xf4\\x7d\\xd7\\x94\\x97\\x7a\\x6c\\x15\\x05\\xac\\x8c\\x05\\x68\\x0c\\x56\\x15\\xa2\\xd5\\xb0\\x57\\xe3\\x9b\\x04\\xf8\\x5e\\x3f\\x9f\\xf0\\x49\\x60\\xe0\\xe0\\x16\\x68\\x5a\\x86\\xee\\xbc\\xec\\xf6\\xfb\\xce\\x5f\\xdd\\xcd\\xac\\x1a\\x47\\x4c\\x8a\\x0d\\x50\\x2c\\x40\\xe1\\x0f\\x94\\x86\\x46\\xfd\\xac\\x6c\\x81\\xf1\\xff\\xbb\\x17\\x7a\\x2a\\x49\\x63\\xb6\\x78\\x25\\x90\\x3c\\xde\\x65\\xb5\\xdb\\xe0\\xd8\\x94\\x1d\\x54\\x6c\\xff\\xa2\\xbf\\x8a\\x8c\\xa8\\xd6\\xc6\\x40\\x85\\x30\\xa6\\x29\\x0f\\x5d\\x08\\x82\\xf1\\xa1\\x67\\x2d\\xbf\\x97\\x8e\\x10\\xc5\\xc8\\xaf\\x5e\\x0a\\x62\\x39\\xf0\\x65\\x5e\\xe7\\xfd\\x9e\\x66\\x96\\x30\\x77\\xa0\\xe8\\x47\\x13\\x73\\x97\\xd1\\xf0\\x69\\x99\\xdc\\x6f\\x8a\\x94\\x5c\\x60\\x03\\xea\\x4e\\xa7\\xfd\\x58\\x37\\x8a\\xcb\\x44\\xed\\x57\\x80\\xea\\xa3\\x67\\x79\\x6b\\xee\\xa3\\x7d\\xdc\\x23\\x69\\x99\\xd0\\x12\\xd6\\xa7\\x16\\xd7\\x91\\x56\\x49\\xcc\\x28\\xe5\\x88\\x75\\x64\\x7e\\x9f\\x5a\\xc0\\x55\\x3c\\x0f\\x54\\x4d\\xf5\\x64\\x69\\xc6\\x70\\x81\\xd5\\xe3\\x03\\x95\\xf3\\xe9\\x60\\xe6\\xa5\\x2f\\x08\\x33\\x19\\x2c\\x54\\x8c\\xd5\\x7c\\x92\\x6b\\x82\\xdb\\x48\\xc3\\x61\\xbd\\xe7\\x03\\x33\\xa3\\x70\\x08\\x3e\\xaa\\xa0\\x68\\xdc\\x2a\\xe4\\x52\\xd2\\x1e\\xf1\\x33\\x1a\\xed\\x19\\x0b\\xd3\\xe1\\x28\\x9a\\x10\\x4c\\xf6\\x67\\x83\\x43\\x77\\xcf\\x7b\\x5a\\x29\\x77\\x48\\x07\\xc3\\xf1\\xea\\x9e\\x7b\\x28\\x83\\x1d\\x0f\\x6c\\x42\\x94\\x78\\x58\\x67\\xb1\\x37\\xb6\\x50\\x28\\xc1\\x4f\\x93\\x2a\\x1b\\xa8\\xe6\\xf9\\xf5\\x96\\x24\\xfe\\x0c\\x39\\x68\\x43\\xea\\x19\\xe4\\x6f\\xba\\x09\\x14\\x2c\\xf9\\xd4\\x24\\x97\\x31\\x2f\\x36\\x02\\x44\\x03\\x2f\\x1e\\x00\\xf3\\x8d\\xd0\\xde\\x29\\xf9\\x63\\xb5\\xcc\\xc1\\xef\\x12\\xb2\\xcc\\x62\\x04\\xb9\\x94\\xaf\\x1f\\x3b\\xaf\\x19\\x6d\\x9e\\x21\\xe8\\xfa\\x4f\\x09\\x73\\x20\\xc6\\x44\\x04\\xd0\\xb7\\xd5\\xab\\x38\\x56\\x0c\\xa0\\x65\\x53\\x64\\xb0\\xb0\\x9c\\xd6\\xdc\\x0f\\x0e\\x05\\xb8\\xc9\\x11\\x03\\x64\\xf1\\x42\\x4a\\x96\\x72\\xb7\\xef\\xdf\\x7e\\x1f\\x37\\x8e\\x23\\x45\\x50\\x56\\x6d\\xbe\\x13\\xb0\\x15\\x78\\xb0\\x41\\x53\\xe9\\xc3\\x7b\\x55\\x3e\\x32\\xa4\\x44\\x1b\\xc9\\x7e\\x29\\x53\\xbe\\xc2\\xe4\\x14\\x55\\x51\\x0f\\x98\\x02\\xef\\x94\\x8d\\xcb\\xf1\\x3f\\xad\\xdd\\x72\\x2e\\xde\\x57\\x36\\x27\\xb2\\x58\\xd5\\x5e\\x83\\xc0\\x89\\x5b\\x22\\x91\\x9e\\x4b\\xe5\\xce\\x8d\\x81\\x9c\\xe6\\xad\\x84\\x3b\\x2d\\xd0\\x9d\\xf6\\x40\\x04\\xc8\\x26\\xc1\\xdd\\xe7\\xce\\x64\\x80\\xa2\\x71\\xa8\\x58\\xa1\\xdb\\x16\\x9e\\x14\\x94\\xd4\\x46\\x90\\x32\\xbc\\xc1\\xcc\\xd8\\x96\\x53\\x19\\x8b\\x7c\\x07\\x3f\\x76\\xa2\\x6a\\x29\\x99\\xb5\\x64\\x8c\\xba\\xdc\\x15\\x74\\xc7\\x8e\\xad\\x8e\\xec\\xe8\\x3b\\x91\\xe1\\x29\\xc4\\x37\\xf9\\xee\\xec\\x04\\xc8\\x07\\x45\\x90\\x02\\xe6\\x6d\\xcc\\xa9\\xbf\\xc2\\xca\\xed\\x9e\\x6c\\x0b\\xa2\\x3d\\x23\\x55\\xde\\xf7\\x56\\x65\\x74\\x94\\x30\\xee\\x92\\xc5\\x32\\xa6\\x95\\x47\\x9f\\xec\\x92\\x91\\x74\\xf4\\x40\\xec\\xb6\\x1a\\x5a\\xe8\\xb2\\xb7\\xe9\\x58\\x92\\x05\\x58\\x26\\x89\\x78\\xf7\\xfb\\x4d\\xa1\\xb3\\x8b\\x12\\x01\\x4f\\x5d\\x61\\xb0\\xfd\\xd7\\xf6\\x13\\x6b\\xa4\\x28\\x1b\\x41\\xa3\\xa3\\xcd\\x18\\x80\\x52\\xb6\\x98\\x76\\x5b\\x6f\\x05\\xe4\\x1e\\x78\\x37\\x3e\\xa8\\x30\\x46\\x97\\x87\\xa3\\x75\\x10\\x99\\x3d\\x12\\xf9\\x3e\\x96\\xc7\\x2d\\x72\\xf4\\x46\\x19\\x84\\xf6\\x91\\xa4\\x1c\\x7d\\x33\\x97\\xdd\\xd5\\xa1\\xb3\\x92\\x37\\xd1\\x30\\x88\\x64\\xd4\\x15\\xfc\\x6c\\x22\\xb6\\x3f\\x37\\x6c\\xed\\xde\\x37\\xf5\\x25\\x2b\\x51\\xec\\x72\\xe5\\x15\\x5f\\x3b\\xdb\\x4f\\xcd\\x54\\x12\\x49\\x8b\\xd2\\xe0\\xc1\\xf9\\x85\\x0b\\x3a\\x85\\xd1\\xdf\\xd2\\x51\\x67\\xa3\\xcd\\x77\\x1e\\x8e\\x4c\\x9d\\x86\\x8c\\x95\\xa7\\x17\\x5e\\x37\\x75\\xf6\\xce\\xf1\\x7e\\x4e\\x36\\x49\\x7c\\xe9\\xe4\\x55\\x32\\xbd\\x7f\\x44\\xb2\\x77\\x6e\\x40\\xf9\\x1a\\x07\\xca\\x4f\\xa1\\xb9\\x5d\\xbe\\x81\\xcf\\x8f\\x49\\xe4\\x6b\\x6c\\x82\\xa6\\xee\\x43\\x47\\x91\\x8a\\x76\\x43\\xb0\\xd9\\xa3\\x88\\x57\\x21\\x2c\\x69\\x3e\\xad\\xac\\xfd\\x37\\xa5\\xf1\\xd9\\x15\\x58\\xf5\\x45\\x4d\\xcd\\xd0\\x59\\x35\\xf2\\x90\\xe6\\x2d\\x7e\\x65\\x00\\x6c\\xd5\\x49\\xf6\\x55\\x3c\\xe7\\x41\\xdf\\x44\\xd3\\x96\\x44\\x00\\x1e\\xb4\\x79\\xca\\x69\\x56\\x8a\\xd1\\xf2\\x3b\\xba\\x09\\x9a\\x41\\xa4\\x72\\x94\\xdb\\x93\\x87\\x31\\xc5\\x30\\xaf\\x1c\\xeb\\x92\\x17\\xd2\\x9b\\xc2\\x70\\x56\\x13\\xc1\\xa1\\xfe\\x9c\\x20\\x8d\\x0b\\x01\\xba\\x6f\\x4d\\x9b\\x4c\\x7b\\xa8\\xf0\\x21\\xdf\\x91\\xea\\x2d\\x57\\x8c\\xe0\\x83\\x12\\x3e\\x83\\xba\\x4b\\x9c\\x50\\x40\\x7f\\x66\\x66\\xfb\\xe6\\x11\\x58\\xb0\\xd1\\xb9\\x57\\x77\\x72\\xe3\\xea\\xff\\x8f\\xb4\\x29\\xd0\\xf6\\xd2\\xe3\\x84\\x12\\x61\\x30\\xf2\\x1b\\x44\\x9f\\xb1\\xdc\\x17\\x0d\\xb4\\x5a\\xf5\\x05\\xbd\\x31\\x82\\x67\\x8a\\x9b\\x5f\\x9f\\xdf\\xf6\\x5f\\x04\\x13\\xb6\\x72\\xc4\\x78\\x63\\x40\\xfc\\xf2\\x52\\x2e\\xa7\\xf3\\xd8\\xad\\xe8\\xa0\\x59\\x52\\x96\\x49\\xdb\\xda\\x9c\\xe5\\x1f\\xf0\\x5a\\x2a\\x2a\\x3d\\x66\\xd2\\x16\\x6b\\xf2\\xc9\\xc6\\x77\\x2b\\xa0\\xef\\x41\\x05\\xe6\\x8c\\x05\\x5e\\x02\\x13\\xd4\\x2c\\x1e\\xe1\\x23\\xb3\\xc1\\x21\\x78\\x43\\xe6\\xec\\x57\\x5d\\x75\\x4d\\xf3\\xc9\\x0a\\x75\"},\n{{0x65,0xfc,0xbd,0x62,0x6d,0x00,0x21,0x11,0x33,0x4b,0xaa,0xd4,0xe6,0xa8,0x00,0x6e,0x47,0xa1,0xf9,0x13,0x97,0xbe,0xe6,0xdd,0x6c,0xd7,0xda,0x5a,0x0e,0x02,0x48,0xa4,},{0x20,0x40,0x9a,0x14,0x6b,0x42,0xc9,0x6b,0xea,0xb0,0xb4,0x2e,0xa7,0xf2,0xc2,0x51,0x93,0x11,0x9d,0x0d,0xf4,0x4d,0xc2,0xbf,0x14,0xd1,0x1a,0x32,0xfd,0x73,0x36,0x15,},{0xbc,0x78,0xe1,0x6b,0xa6,0x74,0xe0,0xa7,0xdb,0xa5,0x7a,0x19,0x09,0x4f,0x97,0x33,0xc5,0x5d,0x74,0xb9,0xd1,0x5f,0x8a,0x44,0xd1,0xbb,0xc0,0xa0,0x23,0xf7,0x01,0x55,0xde,0x29,0x77,0x11,0x1a,0x41,0x7e,0xef,0xa8,0xcb,0x30,0xec,0x12,0xab,0xc8,0x38,0x42,0x28,0x16,0x7c,0x70,0x98,0x2a,0x82,0x06,0xb1,0xff,0xb7,0x21,0x74,0xaf,0x01,},\"\\xe4\\xc0\\x94\\x7f\\xc8\\xca\\x78\\xfa\\x88\\x63\\xf4\\xd0\\x44\\x49\\x9d\\x03\\x6e\\x2e\\x7e\\xf8\\xc1\\x7e\\x83\\x8f\\x2f\\xac\\x02\\x67\\x5b\\x7b\\x53\\x81\\xe5\\xf9\\xab\\xce\\xaf\\xd0\\xd8\\x88\\x6a\\x92\\x9d\\x9d\\x9b\\x49\\xfc\\xb7\\x38\\x61\\xb2\\x9d\\x15\\x18\\xac\\x5f\\x83\\xf7\\xf8\\xfc\\x26\\xbd\\x1c\\xeb\\xc2\\x2d\\x87\\x3a\\x9a\\x08\\x23\\x14\\x06\\xfb\\x03\\x2e\\x48\\x66\\xe5\\xf5\\x5c\\x7c\\x04\\x41\\xc5\\x19\\x04\\x1b\\xb2\\xcc\\x73\\xf9\\x22\\x6d\\xd5\\xd0\\x7e\\xce\\xb6\\x60\\xd6\\xc9\\x67\\xdb\\x23\\x36\\x55\\x74\\xbe\\xe8\\xfc\\x10\\x22\\x29\\x28\\x76\\x77\\x13\\x57\\x1a\\x71\\xc9\\x3a\\x85\\x27\\x8d\\x42\\x29\\x9a\\x70\\x59\\x9c\\xa9\\x93\\x26\\xcc\\x86\\xf6\\xd9\\x8d\\xaa\\xc0\\x00\\xfd\\xfa\\x71\\x05\\x62\\xf4\\x81\\xfa\\xa0\\x20\\xc7\\x2a\\x76\\xe2\\x06\\x7d\\x15\\x4c\\x23\\x5a\\x7a\\x4f\\x29\\x70\\x8c\\xc5\\x44\\x53\\x3b\\xd7\\x99\\xed\\x63\\x63\\xeb\\x3b\\x56\\xaa\\x4a\\x6d\\x0e\\x37\\x9b\\xbf\\x07\\x60\\x05\\x95\\xc2\\x3a\\xb1\\xf3\\xf9\\xf1\\x70\\x8e\\x00\\x70\\x26\\x1b\\xbb\\xf4\\xbf\\xea\\xf6\\xd6\\xce\\xd4\\xd7\\xff\\x72\\x2c\\x9c\\xc5\\x2d\\x91\\x33\\xea\\x68\\xd4\\x95\\xdc\\x94\\x89\\xc3\\xed\\xf6\\x83\\x02\\x31\\x35\\x1f\\x65\\xcb\\x52\\x72\\xf5\\x39\\x6e\\x2c\\x4a\\x1a\\x5c\\x88\\x66\\x1a\\x10\\x18\\x92\\x24\\x9e\\x23\\xd6\\xce\\x9f\\xdb\\x6a\\x9a\\xbf\\x74\\x27\\x2c\\x2f\\x59\\xc3\\xd8\\xfd\\x87\\x43\\xcc\\xe4\\x61\\x12\\x6c\\xa0\\xa8\\xb8\\x32\\xb4\\xb2\\x18\\x33\\x6b\\x1a\\xe1\\x4d\\xa6\\x77\\xba\\x7f\\x1b\\x2c\\xc5\\xca\\x3c\\x71\\x58\\xf7\\x27\\xa9\\xe1\\xb8\\xfd\\xd9\\xed\\xf5\\xc2\\x18\\x7f\\xcb\\x83\\xdb\\x86\\x2a\\xd0\\xc6\\xb3\\x92\\x16\\xde\\x31\\x16\\x91\\x95\\x56\\x46\\x51\\x00\\xad\\xe0\\xa4\\x2b\\xd6\\xba\\x10\\xd9\\x54\\x18\\xb6\\x9a\\x3e\\x00\\x5e\\x9f\\x10\\x45\\x89\\xea\\x59\\x48\\xb2\\xb5\\x1b\\xc7\\xb1\\xa9\\xa0\\x74\\x9d\\xa8\\xf0\\x13\\x78\\x1b\\xc0\\x5c\\x80\\x5b\\xb5\\x1e\\x18\\x77\\x61\\xac\\x24\\xc7\\x64\\x14\\xf6\\x68\\xeb\\x45\\xfb\\x0a\\x50\\x24\\xdf\\xe5\\xa5\\xca\\x06\\xf0\\x40\\x3a\\x02\\xe3\\xb2\\xfe\\xf7\\xa2\\xc4\\xbc\\xfb\\x1d\\x07\\x5d\\x31\\x0d\\x51\\x97\\xe6\\x59\\xcd\\x14\\x02\\x3f\\xae\\xc2\\x0e\\x04\\x5c\\xab\\xcb\\x86\\xb2\\x21\\xa1\\xd4\\x82\\x71\\x13\\xff\\x32\\x67\\xa6\\x4d\\xeb\\xe9\\x93\\x90\\x04\\xca\\xba\\xc8\\x5e\\x5c\\x74\\x61\\xe7\\xe8\\x2a\\x97\\x5a\\xcf\\xae\\x0b\\x6c\\x51\\x6a\\x1c\\x60\\x53\\x74\\xcf\\xea\\x7d\\x81\\x90\\x44\\xef\\xd6\\xd7\\x46\\x54\\x42\\x4f\\xd5\\xc9\\x0f\\xf2\\x57\\x4f\\xcd\\x8e\\x00\\x77\\x40\\xd9\\x75\\x86\\x1d\\x0d\\xf5\\x25\\x9f\\xe4\\x3e\\x43\\x63\\x9e\\x36\\xe5\\x28\\x95\\x43\\x9b\\xa2\\xc2\\x7c\\x1e\\x88\\x9c\\x93\\x09\\x41\\x04\\xfe\\x91\\x49\\x21\\xbd\\x6f\\x25\\xd3\\x98\\x5a\\xb1\\xf2\\x2c\\xa5\\x57\\xb0\\xe4\\x9a\\xfc\\x73\\x75\\x24\\x3c\\x52\\x1c\\x6d\\x5f\\xaf\\xe0\\x38\\x1c\\xce\\xa8\\x28\\xe8\\x8e\\x64\\x7f\\xd9\\x09\\x76\\xb3\\xfb\\xec\\x19\\xfe\\x9a\\xdb\\x11\\x3c\\x64\\x04\\xbd\\x35\\x2b\\xfc\\x00\\x04\\x46\\xd2\\x10\\x05\\xb5\\xf9\\x50\\xae\\x07\\xe5\\x1c\\x76\\x8c\\xa3\\xff\\x61\\x77\\xb2\\xea\\xc5\\x0f\\x10\\xdd\\x2e\\x64\\x61\\x0f\\xa8\\xab\\x57\\x88\\xfa\\xee\\xe2\\x9d\\x12\\x90\\x09\\xd7\\xfe\\x46\\xaa\\x3d\\xa6\\xb9\\xd8\\x6c\\x73\\x06\\x5e\\xb5\\x16\\x1f\\xbd\\xbd\\xfa\\xc5\\x77\\x7c\\x4e\\x75\\x45\\x2e\\x6e\\x16\\xae\\x9f\\xd6\\x6b\\xb7\\xd9\\xaa\\xa4\\x26\\xbc\\xb7\\xa6\\x91\\x5f\\x0f\\xf4\\x4a\\x1f\\x8e\\xc7\\x13\\x94\\xe9\\x35\\x2f\\xdf\\x20\\xe0\\x2f\\xaf\\xe1\\xe0\\xce\\xfe\\x50\\x74\\x4c\\x31\\x94\\x95\\x6f\\x92\\x8f\\x82\\x53\\x37\\x55\\x37\\x38\\x38\\xdc\\xc1\\x29\\x6a\\x89\\x1a\\xdf\\x64\\x1c\\x73\\x82\\xd6\\x9b\\x4f\\x5a\\x43\\xd4\\xaf\\x77\\x72\\xa4\\xa1\\xee\\x87\\x92\\x92\\xd7\\xa4\\xf3\\x2a\\xc3\\x5e\\xe1\\x21\\xc6\\xc3\\x4c\\xa5\\xf9\\x84\\x87\\xa9\\x41\\xfc\\xb1\\xe6\\x5b\\x44\\xd4\\x45\\x61\\x27\\xee\\xdb\\x2f\\xcc\\x1c\\x3f\\x48\\xef\\xf9\\x30\\x09\\x81\\xe5\\x2a\\xc3\\x8b\\x49\\x6a\\xb8\\xbb\\xce\\x14\\x4a\\x85\\xeb\\x9c\\x07\\x63\\x8b\\x31\\xfd\\xaa\\x78\\x17\\x44\\xbc\\xe1\\x7e\\x8d\\x93\\xdc\\xdc\\x60\\xaf\\xed\\xa4\\x88\\x80\\x76\\x17\\xf8\\x8d\\x6a\\xa5\\x44\\x22\\xfd\\x34\\x7d\\xda\\xdd\\xef\\xf3\\x7a\\x56\\x3d\\xbf\\x19\\x97\\x4b\\x2a\\x23\\xbe\\x30\\x0f\\xbf\\xa6\\xc7\\xfc\\x41\\xf8\\x4c\\x69\\x05\\x41\\x52\\x69\\xf1\\x95\\x99\\x0b\\x5b\\x4d\\xe1\\x26\\x68\\xc7\\x1c\\x87\\xb5\\x04\\xf4\\x11\\x24\\xbf\\x94\\x43\\x6f\\x33\\x30\\x45\\x63\\x15\\x18\\x15\\x2c\\x51\\x62\\xa2\\x47\\x5c\\x40\\xef\\xb6\\xcb\\xda\\xaf\\x9a\\xf4\\x28\\xfe\\xd3\\x25\\xb3\\xa7\\xd9\\x4c\\x17\\x52\\x0f\\xd8\\x9e\\x00\\xdd\\xf0\\x8b\\x22\\xad\\xf6\\x61\\xf0\\xac\\xd7\\x23\\xb3\\x96\\x9d\\xc6\\x43\\x4e\\xa6\\xf9\\x2e\\xf5\\x8e\\x8d\\xfa\\xe5\\xb0\\xcc\\x28\\x85\\xba\\x98\\x7e\\xa1\\xd1\\x6c\\x39\\xb3\\x4e\\xf6\\x50\\x23\\x00\\x9d\\x63\\x45\\xe4\\x8e\\x36\\x91\\xa4\\x1f\\x02\\xa7\\x7b\\x7f\\xe1\\x33\\xea\\x9d\\xe7\\x56\\x5f\\x15\\x7a\\x20\\x78\\xae\\x98\\x8b\\xbb\\x26\\x6d\\x22\\xd5\\xfa\\x91\\xa7\\xb2\\x63\\xe9\\x8a\\xd2\\xdc\\x07\\x31\\xfe\\x5a\\x29\\x02\\x5a\\x0c\\xb4\\x36\\x86\\x4a\\x5a\\x60\\xdb\\x25\\x7f\\x1e\\x76\\xb5\\xc6\\x08\\xf2\\x5c\\xde\\xcc\\x87\\xea\\xe6\"},\n{{0xb5,0x00,0x76,0x8a,0x28,0x23,0x91,0x5c,0x4a,0x68,0x48,0xd3,0x5f,0x64,0x87,0xd4,0x3b,0xd7,0x66,0xd2,0xce,0x09,0x45,0xf8,0xa3,0xcc,0xdb,0x8d,0x82,0xa3,0x89,0x2b,},{0xb8,0xce,0xa2,0x15,0xa0,0x12,0x4e,0xed,0x27,0x00,0x57,0x25,0xd8,0x97,0x78,0x1e,0xa0,0x64,0xdc,0xef,0xb2,0x14,0x22,0xc8,0xbd,0x24,0x02,0xc5,0x6a,0x10,0x57,0x1c,},{0xe3,0xdb,0x47,0xa1,0x1e,0x10,0xe7,0x88,0x92,0x5d,0x14,0xb1,0xe2,0x8b,0x54,0xc9,0xfc,0xf9,0xb6,0xac,0xc1,0xdf,0x8c,0x14,0xf6,0x83,0xa5,0x67,0x2f,0xd5,0x04,0xdd,0x4a,0x47,0x5a,0x33,0x93,0xb3,0xef,0x8b,0xce,0xac,0x23,0x61,0xdb,0xba,0x35,0x30,0xaf,0x25,0xc2,0x46,0xc3,0xec,0x4c,0x05,0x89,0x9b,0x51,0x7f,0x6c,0xd3,0x4f,0x0a,},\"\\x0a\\x9f\\xda\\x8b\\x8c\\xfc\\xa7\\xa5\\xb0\\x5d\\x78\\x11\\x6f\\xce\\xe1\\x9a\\xb8\\x03\\xc1\\xc6\\x01\\x0c\\xe1\\x1d\\xaa\\x8e\\x93\\xa6\\x6d\\x12\\xc1\\x2e\\x47\\x4e\\xb9\\x1c\\x26\\x40\\xd9\\x7a\\x81\\x3d\\x9a\\x83\\x0d\\x26\\x88\\x68\\xeb\\x2e\\x37\\x70\\x42\\x5f\\x10\\xc7\\x58\\x40\\x46\\x8e\\x66\\x9d\\xc7\\xf6\\x1d\\x3b\\xe2\\xde\\x88\\xae\\x0e\\x54\\x2b\\xc8\\x09\\x67\\x91\\x13\\x95\\x7a\\x14\\xda\\x4e\\xaf\\xf5\\x49\\xbf\\xde\\x63\\x7d\\x7c\\xaf\\xdc\\x6a\\xa8\\x39\\x94\\x83\\x73\\x97\\xf8\\x6e\\x4f\\xde\\x86\\xd4\\x02\\xfa\\x9a\\xef\\x7f\\x65\\x54\\x9a\\x21\\x43\\x73\\xe5\\x60\\xe6\\xd7\\xa1\\xc2\\x76\\x9e\\x0c\\x7d\\x5a\\x01\\x71\\xe7\\xcc\\x00\\xdf\\xf3\\x6e\\x04\\x29\\x79\\x8b\\x53\\xaa\\x62\\x16\\x24\\xbd\\xa7\\x4d\\x6d\\xf0\\xbf\\xff\\xfb\\xd8\\xfd\\x7b\\xef\\x1a\\x64\\xf3\\x6c\\x00\\x07\\x82\\xf6\\xed\\x03\\x1a\\xf5\\xc2\\xa7\\x4a\\x18\\x96\\x35\\x98\\xc9\\xba\\x06\\x23\\x92\\xde\\x96\\x02\\x03\\x67\\x94\\xb7\\xb5\\xe6\\x8c\\x25\\xc9\\x3f\\xe7\\xcf\\xad\\x47\\xa7\\xc5\\xb9\\x79\\xd4\\x76\\xcd\\x51\\x3a\\x12\\xbf\\x03\\x07\\xcb\\x16\\x31\\x74\\x00\\x42\\xa9\\xfb\\xf3\\xeb\\x0b\\xe5\\x17\\x06\\x20\\xda\\xfd\\x5f\\x16\\xed\\x89\\x34\\x2c\\x26\\x25\\xd7\\x83\\xe7\\x4e\\xe0\\xd7\\x84\\xbf\\x05\\x19\\x43\\x74\\x0c\\x88\\xb0\\xbe\\xf7\\xbc\\x85\\xe1\\xa6\\xa4\\xa5\\x17\\xd4\\x92\\xfb\\x73\\x7e\\x77\\x66\\x99\\x59\\x0c\\x93\\x22\\x4c\\xd4\\xd9\\x24\\x5d\\x4e\\x93\\x71\\xa3\\x67\\xc0\\x71\\x2f\\x87\\x49\\x0f\\x92\\x47\\xc4\\x9a\\xdd\\x93\\x13\\xf2\\x77\\xa4\\xd9\\xf2\\x6b\\x75\\xaa\\xe4\\xde\\xd6\\xa3\\xde\\xf8\\x5f\\x83\\xfc\\x99\\x59\\x10\\x40\\x55\\x48\\xaf\\x67\\x0e\\xd8\\xaa\\xa3\\x05\\x24\\xab\\x82\\x9c\\xcb\\x56\\xa5\\x00\\x5b\\x58\\xbc\\xe8\\x68\\xc9\\xe8\\x07\\x4f\\x07\\xdd\\x7f\\x38\\x18\\xf2\\x99\\xe4\\xe0\\x86\\xbe\\xd9\\xea\\xb9\\x02\\xcf\\x11\\xb3\\x98\\xd5\\x31\\xb8\\x63\\x2e\\x7d\\x52\\x3a\\x8f\\x87\\x76\\x95\\xf4\\x6c\\xcf\\x9c\\xe2\\x4e\\x62\\xca\\xb2\\xc7\\xcd\\x0a\\xae\\xe1\\x7d\\xb5\\x26\\x76\\xa4\\xb5\\x05\\x8e\\x9c\\x1d\\x7c\\x47\\xbf\\xfc\\xb6\\x41\\xb0\\xea\\x2b\\x09\\x44\\xf3\\x9a\\x75\\x66\\x5a\\x7e\\xf2\\x9b\\x7f\\x02\\xa8\\x78\\xdb\\x82\\x38\\x83\\xbd\\xac\\xfb\\x0f\\xbe\\x5d\\xfe\\x5a\\x9b\\xed\\x9f\\xda\\xc7\\xe4\\x14\\x2e\\x3e\\xb5\\x0d\\x5e\\x84\\x0b\\xd0\\xac\\x0b\\xec\\xf4\\xfa\\x97\\xe1\\xfc\\x48\\x27\\xc3\\x97\\xa5\\x24\\x65\\xd9\\x16\\x88\\x99\\x54\\xb3\\x70\\x1b\\x0f\\xac\\x61\\x15\\x9b\\x23\\x09\\x2f\\x46\\x85\\xf4\\x78\\x8b\\xad\\x35\\xd0\\x0d\\xa2\\x67\\x9e\\xcc\\x54\\x92\\x1f\\x1a\\x86\\x47\\x10\\x16\\x57\\xab\\x49\\x47\\x74\\x20\\x56\\x7a\\xed\\x67\\xc8\\x60\\x59\\x30\\x44\\x4b\\x5d\\x07\\x92\\x7c\\x17\\xef\\xf1\\xf8\\x57\\x0c\\xf2\\xaf\\x29\\xe7\\x19\\xf8\\x5c\\xa7\\x84\\x9b\\x89\\x55\\x49\\xf1\\x3d\\xfe\\xca\\x68\\xbb\\xef\\x71\\xe3\\xce\\x8b\\x6c\\xed\\xd2\\xff\\x68\\xd3\\x2b\\x02\\xca\\xf5\\x95\\x1a\\x0b\\x3e\\x6b\\x0b\\xae\\x6a\\x96\\xc0\\x20\\x58\\x19\\x1f\\x30\\x5e\\x09\\x07\\x11\\xc4\\x6d\\xad\\xdc\\xd5\\xae\\xee\\x76\\x9c\\x3a\\x10\\x5e\\x9a\\x82\\x7b\\xbd\\x19\\x5d\\x32\\x92\\x31\\xc2\\x62\\x38\\x47\\x9a\\x9b\\xb0\\x07\\x1a\\xfb\\x16\\x0e\\xf9\\x55\\xe8\\x74\\xd7\\xa4\\x20\\xc5\\x67\\x85\\xf4\\x4a\\xe0\\xa1\\x8c\\x52\\xd8\\x28\\x0c\\x59\\x98\\xcf\\x38\\x88\\xfe\\xaf\\x89\\x89\\x81\\x34\\xbc\\x8d\\x41\\x1f\\xc9\\xf6\\xc5\\x76\\x8e\\xa7\\xa2\\x49\\x72\\x94\\x13\\x73\\x9e\\x53\\x2b\\x64\\x39\\x37\\x15\\x2c\\xdf\\xb8\\xd2\\xff\\x87\\xfd\\x48\\x08\\x4d\\xd8\\xae\\xeb\\xea\\xf0\\xf7\\xb1\\x0d\\x87\\xb6\\xe4\\x42\\x32\\x28\\xc9\\xfc\\x8d\\xc5\\xe3\\x85\\x2a\\xa8\\xb8\\xac\\xc5\\x45\\xd1\\x8f\\x25\\xc5\\x5d\\x73\\xda\\x1b\\xb8\\x2e\\x3e\\xb3\\x76\\xf9\\xef\\x05\\xb2\\x74\\xd7\\xec\\xb1\\x84\\x5d\\x65\\xca\\x0c\\xd2\\x62\\x9f\\x03\\x8a\\x2d\\x66\\x4d\\x7a\\x69\\x78\\x1c\\x84\\xe9\\x8d\\xe2\\xc2\\x09\\xc4\\x6e\\xfc\\x51\\x16\\x21\\x72\\x85\\x66\\x49\\x46\\x9e\\x67\\x33\\x08\\xdc\\xc1\\x45\\xea\\xf7\\x83\\xf5\\xcb\\x5b\\x4b\\xe7\\xd9\\xfd\\x58\\xee\\x09\\x74\\xc9\\x81\\xa3\\x8f\\xea\\x8e\\x31\\x26\\x7a\\xbf\\xa4\\x10\\xe6\\x9e\\x46\\x48\\x2f\\x51\\x34\\xf3\\xda\\x1f\\xfe\\x38\\x1b\\xd6\\x9d\\x8d\\x0b\\x78\\xea\\x90\\x9b\\x4a\\xf9\\x39\\x6d\\xca\\xff\\x89\\x96\\x0a\\x04\\x9e\\xda\\x69\\x46\\x61\\x6f\\xc2\\x7c\\xcf\\x9a\\x9e\\x5b\\xa1\\xa0\\x13\\x57\\x64\\xf3\\x77\\x19\\xda\\x4d\\x28\\x07\\x81\\x85\\xd0\\x4d\\x72\\x41\\x9c\\x2c\\x70\\xf2\\x90\\xd9\\x7e\\x1f\\x82\\xb8\\x79\\xf7\\x1b\\x9e\\x19\\xd5\\x04\\xd3\\x64\\xcd\\x3b\\xa2\\x2c\\xf9\\x05\\x25\\x0f\\xd3\\x7d\\x58\\xe5\\xfe\\x40\\x20\\x9f\\x60\\x72\\xa0\\x6d\\x8b\\x5b\\xa7\\x01\\x96\\x23\\x05\\x77\\x87\\x7e\\xc4\\x61\\x53\\x16\\x7a\\x7c\\x7a\\xea\\x27\\x0f\\xa1\\x09\\x8a\\xba\\x9e\\x3a\\x74\\xac\\xb3\\x6a\\x11\\xb0\\x9b\\xd0\\x7a\\x3b\\x88\\xea\\x65\\x4e\\x26\\x83\\x65\\x62\\x5b\\x58\\x9b\\x22\\x06\\xc7\\x10\\xd9\\x60\\xf4\\x2e\\xa4\\x19\\xb7\\xe4\\xe3\\xda\\x47\\x59\\xfc\\xbc\\xa5\\x0e\\x4b\\xf4\\xcc\\x55\\xcf\\x88\\xf7\\x0b\\x31\\x80\\xc8\\x05\\xa7\\x04\\x50\\x86\\xaf\\xa0\\x4c\\x6b\\xe2\\x32\\x23\\xec\\xae\\x5f\\x82\\xc1\\x46\\xd5\\x43\\x11\\xd1\\x80\\x7c\\x2e\\x4a\\x53\\xf9\\xe0\\xa4\\x48\\x2b\\x4e\\x1e\"},\n{{0x9e,0xb5,0xc9,0xef,0x13,0x53,0x5f,0x80,0x81,0x09,0xf4,0xa4,0x3c,0xfa,0xd5,0x68,0x4f,0x80,0xda,0xf0,0x2e,0xed,0x54,0x10,0xac,0x0b,0x0a,0x09,0xa6,0x08,0x2d,0x69,},{0x36,0x7e,0xea,0x1e,0xcb,0x4e,0x5e,0xec,0xdf,0x7e,0x47,0x1b,0x90,0xbb,0x34,0xf9,0xb7,0x98,0x2c,0x8c,0xd6,0x6d,0x42,0x55,0x5c,0x24,0x0b,0x41,0xcd,0x87,0x39,0xdb,},{0x42,0x9c,0xe1,0xfe,0x84,0x6d,0x25,0x08,0x49,0xec,0xa7,0xd4,0x56,0xf8,0xc5,0x9f,0x86,0x75,0xb1,0xf4,0xc1,0x3f,0x2b,0xe4,0x16,0x88,0xdf,0xb8,0xca,0x2a,0x3b,0x24,0xae,0x29,0xd5,0xb6,0xbf,0x47,0x11,0x57,0xbc,0xb6,0xe2,0xec,0x9d,0x4a,0x26,0xb0,0x38,0xe6,0xec,0x28,0x58,0x4c,0xc2,0x3f,0x2a,0x03,0x55,0x6d,0xbb,0x37,0xe9,0x00,},\"\\x2d\\x7c\\xb0\\x5e\\x61\\xdb\\xae\\x26\\x25\\x8e\\x38\\x61\\xc6\\x39\\xef\\x0e\\x1d\\x17\\xfc\\x71\\x1a\\x00\\xf3\\x35\\xba\\x3c\\x02\\x71\\x37\\xe0\\x07\\x08\\xd7\\x08\\xc1\\xff\\x45\\x7f\\xf2\\xc6\\x51\\x12\\xf7\\xdc\\xd7\\xd0\\x2f\\x24\\xd5\\x6f\\x07\\x21\\x58\\xea\\x1c\\x71\\x83\\x25\\x50\\xa5\\x83\\x66\\xfd\\x91\\x97\\x29\\x6b\\xbe\\x61\\xaa\\x4d\\x00\\xde\\x18\\xa4\\x53\\xef\\x91\\x74\\xfa\\x81\\x96\\x83\\x05\\xc4\\x1c\\x34\\x55\\xf4\\x2d\\x44\\x7a\\x92\\x34\\xf0\\x6e\\x13\\xbf\\x8b\\xca\\xa1\\xba\\xbb\\x11\\x69\\x5f\\xaf\\xdc\\x08\\xf7\\xa5\\x84\\xb2\\xea\\x1f\\x61\\xe9\\x38\\x92\\x60\\xce\\x73\\x35\\xa0\\x7d\\xe7\\x2c\\x89\\x11\\xa5\\x8a\\x31\\x3f\\x10\\x88\\xdc\\xdf\\x5c\\x8d\\x4c\\x45\\x6c\\xba\\x2d\\xcb\\x4f\\x2d\\x15\\x6b\\x49\\x43\\xb9\\x5b\\xd4\\x93\\xea\\x4f\\xe1\\xa8\\x2d\\x4e\\x3e\\xa0\\x2a\\xa0\\x29\\x72\\x40\\x0b\\x5e\\xe1\\x78\\x42\\x83\\x2d\\x59\\x97\\x9f\\xc1\\x79\\xf8\\x43\\xc4\\x4b\\x03\\xeb\\x3c\\x30\\x24\\x16\\xd0\\xcd\\xaf\\x11\\xc4\\xca\\x8a\\x66\\xcc\\xbb\\x69\\x97\\x39\\x5e\\xdf\\x6f\\xca\\x2e\\xa0\\x04\\xcf\\x34\\x86\\x97\\x10\\x04\\xa4\\x20\\x42\\xaf\\x8e\\xce\\x00\\x5b\\x94\\x46\\x1d\\x86\\xdc\\xde\\x21\\x2a\\x2e\\xb1\\xbe\\x3b\\x91\\x4c\\x78\\x3e\\x48\\xac\\x1a\\xd4\\x6c\\xac\\xd7\\x3e\\x1e\\xb4\\x48\\x36\\x83\\x22\\xd2\\x67\\x8e\\xfc\\xb2\\xab\\xff\\x52\\x09\\x3d\\xb0\\xf2\\x59\\xdc\\xe5\\xc1\\xe1\\x9a\\x51\\x28\\x20\\xf2\\x35\\xd6\\xae\\xaf\\x0e\\x1a\\x72\\x3c\\x2c\\x65\\x0c\\xff\\x1e\\xe3\\xb6\\xb4\\xf4\\xcc\\x98\\x9c\\x0b\\x7d\\x6d\\xe3\\xcd\\x7e\\x6d\\xaa\\x39\\xbb\\x69\\x07\\x10\\xdf\\x00\\xa7\\x19\\x4c\\x17\\x20\\x1f\\x0e\\x81\\xbe\\x64\\xb6\\x73\\x9e\\x1c\\x1e\\x81\\x76\\xb7\\xe1\\x2a\\x35\\x34\\x27\\xc0\\x67\\xc1\\x93\\x14\\xdb\\x64\\x2e\\x5c\\x76\\x26\\x6b\\x64\\x0e\\xb1\\xcc\\x0c\\x73\\xf8\\x4f\\xc0\\x22\\x7e\\x5a\\x96\\x06\\x0d\\x81\\x40\\x71\\xcd\\xe2\\xfe\\xd9\\x44\\x76\\x7b\\x74\\x66\\xf9\\x00\\x1d\\xfc\\x22\\x36\\x85\\x42\\x9b\\xc4\\xe5\\xe4\\x8f\\x5c\\x13\\xa6\\x3a\\x4e\\x0d\\x82\\x61\\x33\\xad\\x92\\x0d\\x11\\x77\\x21\\x45\\xad\\x6e\\x13\\xc9\\x38\\x97\\x39\\x8a\\x8a\\x40\\x1f\\x93\\xdb\\xd1\\x03\\x00\\x5c\\x7d\\xae\\x44\\x38\\x7f\\x3e\\x80\\xb7\\x93\\x60\\x7d\\x05\\xd2\\xd8\\xbc\\x0d\\x03\\x51\\xa3\\xa4\\x52\\xb8\\xce\\x75\\x9c\\x1a\\xd4\\x8d\\xf7\\xb9\\xba\\x9e\\x4a\\x17\\xdf\\x61\\xfd\\xab\\xb9\\xb5\\x77\\xb5\\xce\\xc3\\xe9\\x46\\x1f\\xbb\\x5e\\x12\\x81\\x55\\xa3\\xc9\\xc8\\x9f\\x8f\\x6b\\xeb\\xb7\\x32\\x2a\\x16\\x67\\x8e\\x8e\\xcb\\x98\\x95\\x3d\\x95\\x83\\x10\\xdb\\x1b\\x06\\x34\\x48\\xc3\\x49\\xf3\\x6e\\x16\\x8f\\xac\\x48\\x4c\\xb3\\xc0\\xd4\\xcb\\x2c\\x25\\x1b\\xd9\\x2e\\xf8\\xe9\\x26\\x2b\\x44\\x09\\x3d\\x7e\\x65\\x0a\\x7d\\x3b\\xed\\x37\\x91\\xfa\\x88\\x10\\x0f\\xee\\x6e\\xf0\\xd5\\xe2\\x3d\\x1e\\x9a\\x80\\x99\\xcc\\x03\\x35\\x20\\x2a\\x4f\\x10\\x6c\\x24\\x77\\x7e\\x98\\xf8\\x1d\\x26\\xef\\xba\\x15\\xc9\\xad\\x15\\x41\\xe0\\xad\\xbf\\x1d\\x1d\\x76\\x07\\x6b\\x0d\\xfd\\x7b\\x7d\\x6c\\x8b\\x82\\xf9\\xc0\\x93\\x46\\x8c\\xd1\\x96\\x67\\x2d\\xc5\\x47\\x8e\\x91\\xce\\x70\\x1c\\xdd\\x7b\\x68\\xb3\\x53\\xc9\\x71\\x11\\xf0\\x42\\x97\\x60\\x63\\x57\\x62\\xf8\\x68\\x3a\\xe9\\x70\\x56\\x4b\\xce\\xba\\x91\\x20\\x51\\x76\\x42\\xe8\\xb3\\xa2\\xba\\xaa\\x85\\xc2\\x5b\\x54\\xa9\\x43\\x76\\x61\\x84\\x90\\x4c\\x72\\xd9\\x29\\x63\\x4e\\xc5\\xf0\\xc2\\x84\\x73\\x41\\x5f\\x12\\x53\\x89\\x06\\xc6\\x78\\xfc\\xa4\\xe6\\x82\\xdb\\x48\\x79\\x75\\x84\\x92\\x53\\x7e\\x78\\x50\\xb9\\xbf\\xef\\x3e\\xb9\\x05\\x3b\\x43\\x92\\x0d\\x81\\x0e\\x55\\xbe\\x96\\x6a\\xec\\x68\\xc9\\xdd\\x3b\\x62\\xcc\\xf5\\x7e\\x81\\x78\\xcb\\x5e\\xf6\\xd1\\x6d\\x17\\x2a\\x56\\xdd\\x92\\x4f\\x00\\xf2\\xd3\\xb5\\xe9\\x3a\\xaa\\x92\\xb2\\x9f\\xb8\\x33\\x6d\\x73\\xe2\\x9e\\x59\\xd1\\xc4\\x7e\\xa6\\x23\\x0c\\xda\\x1d\\x5b\\x03\\xbb\\xa5\\xdf\\xdb\\x33\\x1f\\xeb\\x19\\x44\\x3f\\x12\\x3d\\x2a\\x03\\xff\\x4f\\x10\\xec\\xa1\\x66\\xc2\\x99\\x85\\x88\\xf1\\xe5\\x84\\xed\\x19\\x4d\\xd6\\xf7\\x3c\\x8a\\xca\\x84\\x66\\x31\\x90\\x4d\\x9f\\xe4\\xa9\\x8b\\x36\\x78\\x23\\xe4\\x6e\\xdb\\xa2\\x88\\x51\\x29\\x87\\x9e\\x92\\x77\\xe1\\x50\\xf0\\x29\\xb8\\xfa\\x7b\\xd1\\x1e\\xab\\x9c\\xe1\\x33\\x67\\x77\\xc8\\x0b\\x56\\xb3\\xa1\\xf0\\x81\\x1a\\xdb\\xca\\x0f\\x5b\\x40\\x25\\xa5\\x50\\x3c\\x81\\x96\\x66\\x1a\\xee\\x90\\x00\\x6e\\x9c\\x85\\xbb\\xfa\\x4c\\x5a\\x0e\\x90\\x28\\x85\\xc8\\xce\\x51\\x21\\x2e\\xe6\\x7f\\x0f\\xe0\\xb6\\xaf\\xbc\\x8b\\xad\\x45\\x37\\x27\\x54\\x3b\\x3c\\x68\\xb8\\x90\\xdd\\xab\\xa2\\x69\\xd2\\x5f\\xc1\\x64\\x3f\\x54\\x83\\x51\\x36\\xa1\\xa2\\x5b\\xa1\\x8d\\x91\\x6c\\xed\\xd6\\xa4\\x7f\\xc0\\x7a\\xdf\\x6f\\xc6\\x9f\\xa5\\x08\\x94\\x9d\\xc1\\x0d\\x9d\\xc5\\xe0\\x26\\x1b\\x52\\xf3\\x65\\x71\\x70\\x38\\x4e\\xcc\\xd9\\xc8\\x05\\x41\\x35\\x4b\\x1c\\xe0\\xf6\\xfb\\x5e\\xd3\\xe8\\xd5\\x4a\\xf0\\xb5\\xbf\\x0a\\x92\\x83\\x51\\x25\\xc7\\xd9\\xbc\\x4f\\x09\\x2f\\xf3\\x80\\xe5\\xe8\\x96\\xfb\\xf3\\x02\\x55\\x2b\\x14\\xd5\\xb6\\x1a\\x22\\x4d\\x86\\xe3\\x01\\xc7\\xa6\\x6a\\x66\\xe4\\xe4\\x32\\x9a\\xac\\x0a\\x66\\xb1\\x56\\x77\\x23\\x74\\xdc\\x1c\\x71\\x68\\xd5\\xb5\\x61\\x65\\x2f\\x8f\\x43\\x87\\xe4\\xf2\\x89\\xb6\\x36\\x6a\"},\n{{0xef,0x09,0x48,0xe1,0x32,0x81,0xf3,0xcf,0x35,0x2c,0xbf,0xaf,0x8d,0x89,0xd1,0x17,0x76,0x85,0x52,0xd5,0xa1,0x54,0x8e,0xcb,0xaf,0x37,0x41,0x2e,0x97,0x67,0x0f,0xac,},{0x58,0xc2,0x45,0x7f,0x5a,0x5e,0x3c,0xfb,0xf4,0x71,0x19,0xa8,0x7f,0x2a,0xff,0x19,0x18,0xf1,0xe6,0x7a,0xe6,0xfa,0x91,0x71,0xd3,0xf4,0x1e,0xee,0x07,0xa8,0x68,0x72,},{0xcc,0x12,0xf6,0x9d,0xb6,0x3a,0x67,0x8e,0xc4,0x77,0xa6,0x05,0xa5,0x05,0xc5,0x7d,0xc2,0xb8,0x10,0xef,0x85,0xe3,0xe3,0x45,0x19,0xcb,0x25,0xc5,0x10,0x63,0xaa,0x66,0x35,0x5d,0x3f,0x1e,0x29,0x74,0x69,0x58,0x66,0xed,0xf6,0xf1,0x71,0x71,0xce,0x37,0x84,0x2f,0xba,0xb5,0x07,0x5f,0xc8,0x95,0xd1,0x8e,0xd7,0x43,0xc5,0x46,0x08,0x0c,},\"\\x7e\\xc4\\x7f\\x2f\\x1f\\xe3\\xb7\\x0a\\x6d\\x1d\\x82\\xc7\\xcd\\x92\\x4b\\x4b\\xf9\\xb2\\x02\\x9f\\xc1\\x2c\\x52\\xa6\\xe1\\xcc\\x06\\xcf\\x5a\\xbf\\xc0\\xa4\\x42\\xe7\\xcf\\x14\\x5c\\x15\\x42\\xb9\\xb1\\x35\\x04\\x96\\x65\\x71\\x10\\x35\\xe3\\xc2\\x9a\\x91\\xd4\\xfd\\xae\\xd6\\x12\\x70\\x57\\xa8\\x12\\xc2\\x2c\\xd7\\x5a\\xd1\\x87\\x9b\\xe1\\xd2\\xc6\\x11\\x0e\\x79\\xe9\\x87\\x52\\x4e\\x4e\\x8f\\x27\\xf1\\x6e\\xda\\x90\\xcb\\xd4\\x73\\x3f\\x11\\x18\\x25\\xb5\\x16\\xd1\\x06\\x7f\\x81\\xec\\xa5\\xe6\\x94\\x85\\x76\\xd5\\xbf\\xed\\xb3\\x27\\x7c\\x1a\\xbc\\x1e\\x60\\xf3\\x74\\xd0\\x70\\x1b\\x32\\xcc\\xfd\\x6a\\x5e\\x9c\\x8d\\x16\\x59\\xaa\\xf3\\xd0\\x81\\x86\\x13\\x61\\x3b\\x7e\\x28\\x8d\\x84\\x5e\\x9a\\xaa\\xba\\x2e\\x3e\\x9b\\x41\\x1d\\x50\\x1d\\xff\\xe8\\x56\\xfd\\x31\\x3e\\x9f\\xcc\\x9e\\x74\\x30\\xb9\\x98\\x3f\\x20\\xab\\x4e\\xbf\\x4e\\xb6\\x16\\xbd\\x63\\xe2\\xc5\\x77\\x43\\x65\\x89\\x95\\xed\\x0a\\x14\\x9a\\xe6\\x20\\xa3\\x95\\x61\\x37\\x19\\xb3\\xed\\x7c\\xed\\x45\\x88\\xd5\\x91\\x5d\\x70\\xa2\\xf0\\xc6\\x87\\x68\\x0e\\xc3\\x4f\\xe3\\xe9\\xf7\\x23\\x92\\xe1\\x89\\xe1\\x3a\\x47\\x49\\xd5\\xca\\x9f\\xac\\x65\\x1b\\x92\\xc0\\x84\\xc4\\x06\\x6f\\xdf\\x98\\xa8\\x69\\x22\\x3e\\x4e\\x0c\\x9b\\xec\\x58\\x12\\xb5\\xc1\\x90\\x0e\\x6e\\x60\\xd3\\xa1\\x88\\xd4\\x8a\\x74\\xdf\\xd4\\x15\\xb5\\xca\\xd2\\xe9\\x1f\\xf7\\x6d\\xf7\\x50\\x89\\xd2\\x0a\\x75\\x5f\\x26\\x07\\x56\\xc8\\xf1\\x38\\x2a\\x29\\xf7\\xb9\\x37\\x26\\xe7\\x31\\x07\\x1c\\xd4\\x77\\x45\\x8c\\x6f\\x20\\x22\\xdf\\xad\\x7d\\x4f\\xc7\\xab\\x23\\x80\\x54\\x18\\x64\\xf6\\xb5\\x87\\x74\\xf9\\xae\\x8e\\x5f\\x07\\x7c\\x1a\\x8d\\xa0\\x73\\xc3\\x98\\x53\\xeb\\x2f\\xd4\\x77\\x22\\x0b\\x45\\xa3\\xd9\\x22\\x63\\xdc\\x7e\\x14\\xd3\\xbb\\x2b\\x36\\xfc\\xa4\\x66\\xc7\\xef\\x8a\\x24\\x75\\x38\\x72\\x5f\\x2f\\xce\\x5c\\x72\\x21\\xbc\\x75\\x1c\\xde\\x13\\x94\\x60\\x4f\\x59\\x31\\xd7\\x33\\x36\\x0c\\xcd\\x47\\xce\\x08\\x77\\x12\\x95\\x81\\x80\\xad\\x84\\xfa\\xe7\\x13\\xb5\\x43\\xf0\\x5e\\xef\\x6a\\xbc\\x06\\x61\\x43\\x31\\x21\\xed\\x3b\\x45\\x06\\xa1\\x46\\x50\\x25\\x31\\x6f\\xb8\\xf9\\xd6\\x45\\x35\\xcc\\x45\\x38\\xac\\xd4\\x06\\x4d\\xd5\\x76\\xb0\\x74\\x0e\\x1b\\xeb\\x13\\xbc\\xea\\xf1\\x55\\x54\\x3d\\xc8\\x90\\x97\\xca\\x5c\\xa1\\xcf\\xfa\\x0a\\xd6\\x5a\\x10\\xbc\\xb7\\x59\\x35\\x4e\\xab\\x8a\\x42\\xde\\x73\\x4a\\xf9\\x09\\xc2\\xfe\\xba\\x38\\x0d\\x66\\x40\\x9f\\x32\\x5d\\x5f\\x17\\xaf\\x9c\\xa7\\xf8\\xcb\\x41\\x34\\xfd\\x6a\\x2b\\x6a\\x52\\x8d\\x9e\\x60\\xd9\\x61\\x2b\\x8e\\x8b\\x40\\x62\\xf8\\xe0\\xfa\\xd1\\xe7\\xee\\xb9\\xcb\\xfe\\xf6\\xe9\\x73\\x8e\\xc7\\x97\\x3e\\x1c\\xb2\\xba\\x23\\x27\\xde\\xca\\x4e\\xa4\\x65\\x68\\xf3\\x1e\\x12\\xf7\\x30\\xe2\\x47\\xc1\\xd0\\x70\\x29\\xfd\\x44\\x22\\xb2\\x98\\xff\\x23\\x98\\x02\\x3b\\x41\\x20\\xa3\\xa4\\x25\\xff\\xb6\\x52\\x88\\x0c\\x19\\xea\\x69\\xf3\\x63\\x9e\\x0f\\x6d\\xf4\\xf0\\x08\\x76\\xcc\\x45\\x28\\xe2\\x67\\xe8\\x1d\\x59\\x43\\x19\\x9d\\x0f\\xeb\\x6c\\xb4\\xe1\\xba\\xf4\\x04\\xbb\\x6f\\x8b\\x39\\xb1\\x2d\\xbc\\xe9\\xfd\\xc3\\x5d\\xc1\\x58\\x06\\x6e\\x99\\x75\\xae\\x5b\\xd3\\xb5\\x5f\\x2a\\x41\\xa7\\x91\\xba\\xf3\\xe8\\x35\\x1e\\xc6\\x04\\x94\\x47\\x90\\xa2\\x2c\\x93\\x3c\\x80\\xb1\\x59\\x0b\\xa1\\x97\\xa4\\x70\\x6f\\x7f\\x51\\x28\\x68\\x2e\\xdc\\xd7\\x4d\\xd7\\x8d\\x43\\x5e\\x78\\x7c\\x2b\\x76\\xa5\\x7b\\x3f\\x4e\\x7d\\x7b\\xe2\\xef\\xd2\\x6d\\xa5\\xf9\\xa8\\x29\\x11\\x9b\\x01\\x50\\x8b\\x70\\x72\\xc7\\x69\\x9c\\xe5\\x2b\\xb5\\x78\\xcc\\x5b\\x1b\\x93\\x66\\x1b\\x51\\x72\\xfb\\x84\\xda\\xf1\\xba\\x36\\x4d\\x2c\\xbd\\x80\\xe2\\xc9\\x9b\\xca\\x9c\\xae\\xa8\\x73\\xcc\\x0a\\x16\\x29\\xea\\xc3\\x84\\xe9\\xb2\\x06\\x84\\x2a\\x6e\\x61\\x83\\x38\\x75\\x91\\xb4\\xaa\\x34\\xa9\\x5f\\xd8\\x9b\\x49\\xd8\\xd1\\x5d\\x91\\xe2\\x19\\x40\\xe1\\x7d\\xca\\xf1\\xef\\xf8\\xa0\\xa4\\x7a\\x0d\\x7a\\x95\\xda\\xea\\xd8\\x2a\\xa3\\xdf\\x82\\x04\\xa0\\xcd\\x20\\x69\\x24\\xae\\x51\\x0f\\xec\\x8a\\x9c\\x4e\\x8d\\x85\\xd4\\x66\\xfd\\xb4\\xdd\\x36\\x5d\\xc9\\x93\\x36\\xb2\\x2c\\xe0\\xb9\\x56\\xb5\\xee\\x00\\x17\\xf2\\x9d\\x25\\xee\\x66\\xfb\\xdc\\xec\\xb0\\xd9\\x96\\xff\\xb9\\x7c\\x8d\\xef\\xde\\x40\\xa9\\xff\\x99\\x93\\x19\\x3c\\xa8\\xf1\\x68\\x50\\x67\\xc1\\x9c\\x52\\x6e\\x0e\\xfe\\xd2\\x36\\xf8\\xed\\xb8\\xde\\xf6\\xc2\\xa0\\x3e\\x21\\x95\\x2c\\x86\\x12\\xd6\\x24\\xe6\\x88\\x6a\\x31\\x1f\\xfb\\x9e\\x2f\\x15\\xda\\x44\\xab\\xe1\\x80\\xd2\\x6a\\x14\\xb1\\x5f\\x63\\x56\\x1e\\x09\\x7a\\x73\\x0e\\xca\\xbb\\x79\\x2c\\x7c\\x23\\x5f\\xdd\\x36\\x0f\\x57\\x1f\\x27\\xef\\x68\\x67\\x7a\\x7d\\x63\\xbe\\xb4\\x97\\x59\\x82\\xcb\\x19\\x9a\\x56\\x0f\\x81\\x6e\\xe1\\x29\\x89\\x44\\x5f\\x7f\\x75\\xb8\\x3e\\xb2\\x78\\xd6\\x28\\x25\\x94\\x7d\\x84\\x09\\x9a\\xf2\\xa6\\xff\\x2e\\xad\\xbb\\xf5\\x89\\xb5\\xeb\\x2f\\x72\\xed\\x11\\x4c\\x73\\x15\\x11\\x53\\xae\\x00\\x22\\xbc\\x95\\x64\\xd1\\x5c\\x2d\\x5c\\xdb\\xba\\xab\\xbe\\xf6\\x38\\xf0\\x30\\x95\\xf5\\x3e\\xeb\\xac\\x96\\x83\\x40\\x9a\\xd3\\x06\\x0c\\xfb\\x7c\\x70\\x37\\xb9\\xb0\\xbe\\xfe\\x06\\x9c\\x92\\xa0\\x2b\\xe9\\x53\\x38\\x8e\\x9e\\xa4\\x5d\\x36\\xdd\\xf4\\xf5\\xa8\\x38\\x94\\x32\\xcc\\xf5\\x04\\xc5\\x08\\x08\\xb0\\x7f\\x69\"},\n{{0x90,0x3f,0x3b,0x53,0x99,0x89,0x2e,0x29,0xcc,0xfa,0xfb,0xaf,0xbd,0x7c,0xc4,0x53,0x3c,0x15,0x4a,0x62,0x56,0x82,0x40,0x6c,0x89,0xbf,0x89,0x4c,0x88,0x9e,0x43,0xf4,},{0x8f,0xa5,0xff,0x5b,0x6b,0x26,0xbd,0x67,0xdf,0x86,0x40,0x46,0x42,0x9d,0xf1,0x24,0xb5,0x23,0x00,0x5d,0xd8,0x94,0x44,0x27,0x5c,0x8a,0xb7,0xeb,0xdd,0xb6,0xf4,0xdb,},{0x49,0x5a,0x8f,0x99,0x19,0x41,0xc6,0x29,0xbd,0x64,0x1a,0x67,0x47,0x1a,0xb8,0x60,0xbf,0xd3,0x9b,0x72,0xf2,0x33,0x55,0xf7,0x27,0x09,0x09,0xd5,0x30,0x7c,0x77,0xb1,0xb9,0x4b,0xae,0x3e,0xd1,0x94,0x50,0x78,0x0e,0x90,0x85,0x30,0x5f,0x31,0xb1,0xe1,0x68,0x3f,0xac,0xf0,0xd1,0xfc,0x88,0x40,0xae,0xc7,0x7d,0xf6,0x7a,0xea,0xb3,0x02,},\"\\xa2\\xc1\\x1b\\x5f\\xb8\\x84\\xa8\\x22\\xfa\\xe6\\x4d\\xa8\\xdc\\xb4\\x45\\x2c\\xfd\\x7a\\x04\\xca\\x6d\\x7a\\x5a\\xbc\\x8d\\x82\\x71\\xe9\\x3f\\x93\\x44\\x9e\\x1f\\xeb\\x8e\\x02\\x97\\x5f\\x49\\x6b\\x90\\x34\\x40\\x0d\\x35\\x99\\xab\\x97\\xaa\\x39\\x97\\xda\\xd1\\xc9\\xff\\xab\\x5b\\x9f\\x8d\\xf4\\xaa\\xa5\\xb8\\x40\\xd9\\x0d\\x86\\x2f\\xff\\x7f\\xf0\\xcf\\x73\\xa6\\x0c\\x66\\x15\\x00\\x09\\xe0\\x1c\\x93\\x7b\\xd1\\xaf\\x68\\x07\\xb5\\xba\\x2e\\xf6\\x12\\xee\\x13\\xd6\\xde\\xf4\\x0b\\xb0\\x9c\\x46\\x81\\x1a\\x2d\\x4e\\x46\\x8e\\x03\\x8b\\x32\\x30\\x55\\xf9\\xdf\\xbd\\x01\\x82\\x9a\\xe2\\xf1\\xa5\\x35\\xef\\x02\\x95\\xca\\x1e\\xd1\\x76\\xe4\\x6d\\xe9\\x96\\xcc\\x87\\xba\\xce\\x45\\x35\\x62\\x33\\x21\\x18\\x35\\xb6\\xf4\\x75\\x7c\\x99\\xbd\\x52\\x7e\\x76\\x6a\\x5f\\x0b\\x12\\x7c\\x8c\\xff\\x8e\\x6d\\x66\\xf8\\xba\\xb8\\x6d\\x00\\x00\\x45\\x2c\\xd7\\xf6\\x7b\\xe5\\x57\\x78\\x85\\x13\\xec\\x07\\x09\\xb5\\x37\\xb0\\x07\\xb4\\x20\\x16\\xe7\\xa8\\x96\\x83\\x46\\x9b\\xd8\\xff\\x8d\\x21\\xeb\\x10\\xc1\\x49\\x17\\xd4\\x7f\\x2d\\xc4\\xf8\\x26\\x32\\x4f\\x7c\\x01\\xb2\\x4f\\x8d\\xcf\\xf0\\x4a\\xa6\\xd8\\x50\\x95\\xd9\\xab\\x15\\x4b\\xa5\\xc3\\xbd\\x91\\x9c\\x9d\\x72\\x8d\\xbd\\xc9\\x90\\xd1\\x9c\\xeb\\x23\\x7b\\x45\\x29\\x07\\xbd\\xbe\\x21\\xf9\\xf0\\x8c\\xdd\\xae\\x5b\\xe4\\x79\\x27\\x67\\x09\\xb8\\xae\\x73\\xf8\\x97\\x4c\\x4b\\x11\\x38\\x41\\xad\\x53\\x5d\\x6f\\xf6\\x22\\x3e\\xea\\x47\\xd1\\x85\\xc8\\xe8\\xa6\\x5f\\xde\\xe2\\xc2\\xd4\\x58\\x00\\xc1\\x7c\\xb5\\x56\\xea\\xfd\\x67\\x66\\x47\\xd9\\x96\\x8e\\x55\\xca\\x9c\\x59\\x23\\x2b\\x97\\x70\\xad\\x10\\xf9\\x55\\xfc\\xb5\\x85\\x8e\\xdf\\x0b\\x74\\x83\\xad\\xc1\\x81\\x7c\\x0f\\x8d\\x02\\x24\\x04\\x82\\xca\\xa7\\x6f\\x43\\xc6\\xd2\\xe9\\x6a\\x4f\\xf9\\x59\\x1c\\xd7\\xb8\\x78\\xea\\x61\\x9e\\xa5\\x6d\\x1b\\x58\\x86\\x31\\xe7\\x63\\x3c\\x5e\\xcb\\x2b\\xa6\\x99\\x83\\x98\\xcb\\x06\\xe3\\xcf\\x75\\xae\\xb3\\xe0\\x8d\\xab\\x19\\x63\\x2d\\x45\\x4f\\xf7\\xdc\\x0e\\x2a\\x41\\xf0\\x97\\x37\\xe8\\xee\\x82\\x3d\\x1b\\x9e\\x24\\xdd\\xa8\\x4a\\x2c\\xe0\\x31\\x3c\\xb9\\xfc\\xe3\\x1c\\xb6\\x63\\xc5\\x5c\\x05\\x64\\x5e\\x63\\x40\\x17\\x56\\xe8\\xad\\x38\\xf5\\x17\\x4c\\x02\\xa6\\x63\\xd8\\x15\\xad\\x64\\x42\\x2f\\xf7\\x72\\x7d\\x4f\\xda\\x16\\xe4\\x8d\\x4b\\xf8\\xf6\\x60\\x2e\\x72\\x60\\xda\\x62\\x33\\x0e\\x68\\x78\\xc3\\x47\\x64\\xe1\\x29\\xaf\\xbd\\x55\\x22\\x08\\xf6\\xbe\\xd4\\xf7\\xce\\xe9\\xb6\\x71\\xf4\\x88\\x38\\x88\\x15\\xd7\\x4b\\x49\\x51\\xb8\\x68\\x2c\\xe7\\x6c\\xfe\\x31\\xe9\\x38\\xc4\\x70\\xb8\\xf7\\xa4\\x5f\\xd6\\x3a\\x96\\x91\\xf4\\x26\\xa7\\x5c\\x58\\xed\\x3d\\xbc\\xe3\\xae\\x8f\\xd9\\xd1\\x0a\\x83\\x52\\xe4\\x7c\\xc1\\xb1\\x2c\\x91\\x92\\xac\\x86\\x26\\xd1\\xb3\\x84\\xb7\\x7a\\x18\\xb9\\x86\\xe7\\x1a\\x99\\x86\\x46\\xc1\\x37\\x99\\x2b\\x67\\xc4\\x81\\x7e\\x34\\x63\\x45\\xfa\\xf5\\x0a\\x26\\x59\\xfd\\xc5\\xca\\xd5\\xc7\\x19\\x64\\x8e\\xfe\\xe3\\x84\\x7c\\x0f\\xf6\\xbd\\x70\\x95\\xc2\\x8b\\x4c\\x51\\x95\\x96\\x7c\\x90\\xcf\\x84\\xe1\\xef\\x68\\xa1\\xad\\xa0\\x1f\\x62\\x74\\xed\\xe3\\x63\\xfb\\x82\\xe0\\xb5\\x49\\xa8\\x70\\x24\\x5d\\x60\\x8c\\xae\\x82\\x34\\xf6\\xd8\\x4a\\xbe\\xb6\\x1b\\x71\\x84\\x66\\x09\\x36\\x20\\xd8\\x5c\\x58\\x4a\\xb0\\x1e\\xed\\xa0\\x91\\xee\\x8a\\xff\\x1c\\xf6\\x7a\\x46\\x75\\x67\\x9a\\x1f\\x40\\x03\\xe6\\x6a\\xaf\\x43\\x87\\x1b\\x88\\xec\\xda\\x6a\\x16\\xdc\\x5a\\xcb\\x05\\x39\\x5f\\x2d\\xa9\\xdf\\x70\\xd3\\xbd\\xb6\\x14\\x38\\xe1\\xc3\\xd4\\x09\\x81\\xe0\\x34\\x62\\x7d\\x02\\x6e\\xe1\\xd2\\xe7\\x9f\\x65\\xcb\\xb8\\x18\\x9f\\xcb\\xb3\\xcc\\x8b\\x5c\\x2e\\x7e\\x79\\x6b\\x5d\\x28\\x89\\x41\\x1d\\x56\\x41\\xfb\\x86\\x9c\\x7b\\x0a\\x58\\x9c\\x43\\x25\\x4f\\x8c\\x54\\x38\\xaa\\xf5\\xac\\x42\\x38\\x32\\xf0\\x18\\xd7\\x9a\\x51\\xb9\\x6f\\x24\\x2e\\x2d\\xe0\\xc8\\x51\\xcc\\x5f\\xc2\\xb2\\x06\\xbc\\xa4\\xb5\\xbe\\x83\\x61\\x25\\xac\\xa1\\x44\\xbb\\xc3\\x8c\\x8c\\x63\\x8b\\xe0\\xd3\\xbb\\xe0\\x25\\xa1\\xbe\\x8b\\x3d\\x03\\xd5\\x92\\x9b\\xaa\\x64\\x9c\\x35\\x44\\xa3\\x2a\\x91\\x5e\\x92\\x6a\\x38\\x79\\x1b\\x13\\x4a\\x97\\x1b\\xc5\\x2d\\x1b\\x6c\\xa6\\x25\\xef\\xb7\\xc2\\xf3\\xbb\\x47\\xab\\x51\\xd4\\x3c\\x8e\\x37\\x4d\\x16\\xcd\\xa8\\x82\\x20\\x4b\\x71\\xca\\xfe\\x90\\x93\\xcb\\x60\\x78\\xef\\x2b\\xdf\\xad\\x59\\xed\\xea\\xf3\\x6d\\x0c\\x1a\\x4d\\xc4\\x25\\xb9\\xe7\\x18\\xc4\\x51\\x85\\x22\\x5a\\x9c\\x30\\x84\\xb7\\x82\\xbf\\xe1\\x63\\x49\\x2f\\x8e\\x84\\x82\\xec\\x9a\\xa0\\x73\\xf6\\x90\\x1f\\xf3\\xd1\\x11\\x7c\\xe9\\x17\\xe1\\x91\\x22\\xfa\\x67\\x65\\x0d\\x85\\x8f\\x8f\\x82\\xb3\\x76\\x69\\x72\\x3c\\x22\\x6d\\x72\\x16\\x97\\xe7\\xae\\x33\\x59\\xf5\\xa6\\xb0\\x24\\x24\\xee\\x87\\x94\\xcb\\xea\\xa6\\x41\\xed\\xbb\\xf7\\x53\\xb1\\x03\\xa5\\xfe\\x15\\x8b\\xe0\\xba\\x60\\xd8\\xa2\\x12\\xd4\\x2f\\x8c\\x5c\\x2a\\xf2\\x54\\xbf\\x1b\\x9c\\x80\\xdf\\x6f\\x1c\\xf0\\x9d\\x70\\x79\\x3c\\xae\\x1a\\xbb\\x46\\x27\\xb1\\x78\\x0f\\x1b\\xce\\x7f\\x61\\x7e\\xe5\\x0f\\x6b\\xd4\\xb0\\x83\\xb2\\xfc\\x7c\\xd8\\x44\\xaf\\xb7\\x23\\x80\\xd5\\xcb\\x6b\\x25\\x5b\\xf4\\x7e\\xa7\\x1c\\xad\\x6c\\x6c\\x4d\\xf0\\x21\\xf8\\x1b\\x54\\x8f\\x43\\x2c\\x18\\xac\\x36\\x6c\\x6a\\xec\\xd0\\x3b\\x6c\\x8c\\xe2\"},\n{{0xee,0x81,0xe0,0xfb,0x05,0x2e,0x23,0xad,0x75,0x9d,0xe6,0xaa,0x98,0x38,0xde,0x98,0xe3,0x6d,0x48,0x20,0xdc,0x0e,0x1b,0x7b,0x3e,0xf1,0x14,0x1a,0xb9,0xde,0x33,0x40,},{0x98,0xf3,0xc9,0x88,0x07,0x94,0xde,0x64,0xfa,0x26,0x9b,0xdf,0x33,0x60,0x95,0xe0,0xe0,0x1b,0x1a,0x3b,0x37,0x5f,0x96,0x5b,0x93,0x70,0x0b,0xbd,0xf4,0xb9,0x68,0x69,},{0xf0,0xd8,0x73,0xbe,0x15,0xcf,0x45,0x4c,0x74,0x34,0xde,0xab,0x71,0xde,0x25,0xcf,0xe9,0x9e,0x81,0xa4,0x8d,0x2d,0xce,0x6a,0x35,0xd1,0x63,0x37,0x14,0xdf,0x0f,0x8b,0x40,0x29,0xe0,0x58,0x25,0x11,0xef,0xc4,0xd0,0x68,0x92,0xf6,0x72,0x85,0x02,0x46,0xbc,0xf0,0x70,0xc4,0x6f,0xad,0xc2,0xfa,0xab,0x44,0xdc,0x43,0x50,0x45,0xde,0x00,},\"\\x28\\xd9\\x9e\\x95\\x18\\xb8\\x82\\x83\\xc2\\x20\\xe7\\x6d\\xe2\\x05\\xd7\\xb6\\x16\\x23\\x59\\xb1\\xdf\\xec\\x1f\\xba\\xab\\x98\\xec\\x0e\\xf1\\xdf\\x8d\\xa4\\x0b\\x6b\\x7a\\x77\\x5e\\x97\\x28\\x45\\x0a\\xeb\\x23\\x51\\xfe\\x5c\\x16\\xaf\\xda\\x3a\\xec\\x0d\\x71\\x04\\x9d\\xa4\\xcb\\x7d\\x4c\\x63\\x71\\x3a\\x24\\x10\\xab\\xb0\\x22\\xf8\\x16\\x11\\xcc\\x06\\x45\\x87\\xc8\\x04\\x7d\\x43\\x83\\xc0\\x0c\\x3c\\x56\\x2e\\x9c\\xee\\xa3\\x57\\x75\\x09\\x53\\x91\\xb5\\xf3\\xdd\\xa0\\xe3\\x73\\xc4\\xa7\\x7f\\xf6\\x18\\xa2\\x8e\\xf6\\x87\\x87\\xeb\\xfc\\x3e\\xbc\\xcc\\xc5\\xd1\\xce\\x32\\xdd\\xf4\\x3b\\xfc\\xe5\\x72\\x03\\xda\\x76\\xa8\\x66\\x4b\\x3c\\x61\\x6a\\x88\\x69\\x28\\x2d\\xb0\\xb7\\x28\\x11\\xb5\\xfd\\x5a\\x2a\\x03\\xa4\\xff\\x66\\x72\\x4b\\x04\\x89\\xea\\x2e\\x10\\x73\\xd7\\x81\\xc3\\xf1\\x89\\x11\\x5d\\x79\\xba\\x20\\xa4\\x6d\\x1d\\xfa\\xf5\\xb1\\xa5\\x84\\x7b\\x2a\\x2e\\x31\\xb2\\x80\\x87\\x37\\x56\\x9e\\x60\\xb5\\x72\\x31\\xe6\\xa9\\x9a\\xf2\\x6f\\x58\\xaf\\xeb\\x15\\x77\\x08\\x10\\x47\\x48\\x12\\xfe\\x4a\\xfa\\xcf\\x88\\x45\\x06\\xb8\\xc3\\x14\\xbc\\x67\\x51\\xbb\\x42\\xb4\\xbd\\x6e\\x87\\xd2\\xe5\\xde\\x70\\xfe\\xc5\\xf0\\x01\\x4c\\x42\\x57\\xb1\\x34\\x72\\xa3\\xb0\\x11\\x1a\\x7a\\x8c\\xf8\\x3b\\x1d\\xc0\\xcf\\x96\\x20\\x22\\xcd\\x44\\x46\\x8a\\x3a\\xb1\\xf0\\x01\\x6b\\x70\\xca\\xfb\\x1d\\x02\\x46\\xac\\xd7\\x05\\x39\\x37\\xc9\\xac\\x40\\x20\\x7c\\xf1\\x3b\\x50\\xdd\\x15\\xe2\\xa2\\xe1\\x5f\\x50\\xa0\\x5b\\xca\\x2f\\x28\\xe7\\x70\\x26\\x23\\x71\\xda\\xce\\xe0\\x2e\\x25\\xb2\\xa5\\x96\\x58\\xed\\x90\\xc0\\x60\\x0f\\xa2\\x65\\xb7\\xde\\x3d\\x44\\xf8\\xef\\x07\\x21\\xbf\\x39\\xec\\x4d\\x4e\\xca\\x58\\x88\\x52\\x7b\\x77\\x80\\x67\\xb1\\xd6\\x59\\xc0\\x05\\x14\\xc8\\xd7\\x05\\x62\\x73\\xa2\\x94\\xcb\\xaf\\xe4\\x50\\x90\\xd0\\x69\\xbb\\xd0\\x9f\\x92\\xf4\\x61\\xe6\\x48\\xf3\\xe6\\x82\\x88\\x2c\\x71\\x57\\x6e\\x97\\x4d\\xeb\\xb0\\xcb\\x7e\\x0e\\x83\\x16\\x40\\x66\\x60\\x15\\x0d\\xab\\xb5\\x8e\\x76\\x24\\x66\\x14\\xa2\\x91\\xc1\\x2c\\xe9\\xe0\\x34\\x6c\\x02\\x77\\x4d\\x4d\\x09\\xce\\xcc\\x23\\x69\\x67\\x12\\xfe\\xe2\\x50\\xc0\\xbb\\x5d\\xf7\\xa2\\xa4\\xc4\\x3a\\x55\\x63\\x33\\x1b\\xcb\\xbf\\x84\\xbe\\x3f\\x2e\\xeb\\x06\\x54\\x53\\x2e\\x85\\xec\\x59\\x7b\\x53\\xb3\\x2f\\x39\\x54\\xcc\\xaf\\x0c\\xd4\\x26\\xde\\xf9\\x1e\\xc4\\xb2\\x08\\x41\\x69\\x48\\xaf\\x27\\xde\\x04\\xd8\\x32\\x70\\x58\\x97\\xa0\\x4c\\x5e\\x24\\xa2\\xe8\\x8b\\x20\\x04\\x0f\\xd4\\xec\\xa3\\x08\\x9f\\xdb\\x91\\x8a\\x92\\xe3\\x5c\\x4d\\x31\\xda\\x26\\x85\\x0b\\x9d\\xd3\\x41\\x18\\xc7\\x44\\x49\\xa8\\x55\\xff\\x4b\\xc9\\xff\\xf0\\xd1\\x44\\x78\\x39\\x65\\x4b\\x00\\x41\\x79\\x99\\xfa\\x4e\\xb8\\x91\\x02\\x13\\x3c\\xd3\\x20\\x40\\x91\\x53\\x58\\x49\\x57\\xc1\\x04\\x89\\xdb\\x4b\\x72\\x44\\xc9\\x59\\x07\\x98\\x8e\\x83\\xdc\\x82\\x12\\x71\\xdc\\x1a\\xb6\\x43\\xd6\\x99\\x2d\\x0f\\xd8\\x20\\x49\\x2a\\xe6\\x42\\xe2\\x4d\\x19\\xa1\\x79\\xfa\\x75\\xd9\\x36\\x3b\\x32\\x16\\x62\\x60\\x6f\\xd9\\x4a\\x47\\xfd\\xb2\\xe6\\x8d\\x3f\\x30\\xc0\\x46\\x73\\xf8\\x09\\xde\\x01\\x44\\x94\\x5e\\xa4\\xd4\\x18\\x3d\\x48\\xf1\\x75\\x07\\x9e\\xed\\x50\\x32\\x3c\\x6b\\x19\\x2e\\x02\\x0e\\x16\\x2a\\x35\\x03\\xaa\\x58\\x2f\\xb0\\x8b\\x40\\x36\\x24\\xa2\\x3e\\x35\\x7e\\xed\\xa0\\x8d\\x90\\x43\\x86\\xf3\\x58\\xc3\\x6c\\x64\\xd3\\x14\\xc7\\x7c\\xd9\\xd4\\xd2\\x3d\\x58\\x1e\\xe5\\x3d\\x81\\xff\\x97\\xad\\xa0\\x19\\xcf\\xcf\\x04\\xeb\\x9d\\xcc\\x1d\\xe9\\xb7\\x4c\\x3d\\xb6\\xb8\\x11\\x57\\x8b\\xd4\\xf2\\x19\\xc5\\xca\\x48\\xef\\x4c\\x82\\x6b\\x09\\xe6\\xc9\\x6d\\x03\\x1f\\x65\\xdd\\x48\\xb6\\xe7\\x3d\\x0c\\x10\\x05\\x86\\xb2\\x1d\\xf0\\x29\\x3a\\x03\\xd2\\xed\\x7e\\x50\\x09\\xad\\x02\\x53\\x40\\xc2\\x1d\\x09\\x06\\x06\\x91\\xf5\\xcd\\x8a\\xf2\\xab\\x12\\xf9\\xb8\\x60\\xee\\x87\\x81\\x5e\\x1a\\x9f\\x40\\x0c\\x2a\\x6f\\x63\\x4e\\xa8\\xf9\\xb3\\x42\\x5a\\x08\\xd1\\x0b\\x3c\\x81\\x53\\x67\\x38\\x8f\\x4d\\x1b\\xe3\\x56\\x31\\x8e\\xcf\\x90\\x35\\xd0\\xee\\x97\\x5a\\xff\\xa8\\x59\\xca\\xac\\x28\\xeb\\xcc\\xd0\\x59\\x9b\\xb2\\xf6\\xf3\\x52\\x36\\x61\\xbd\\x17\\x8f\\xc9\\xe4\\xca\\xc3\\x78\\xbb\\x9d\\xd4\\x71\\x6b\\xb0\\x69\\x23\\xfd\\x2b\\xbd\\x56\\xc9\\x59\\xc4\\x2b\\x95\\xd5\\x01\\x93\\xf8\\xbf\\x29\\x9f\\xcc\\xa3\\xb2\\xee\\xa9\\x4e\\xc5\\xf9\\x85\\x83\\x92\\x4c\\x08\\x04\\x16\\xe2\\x8b\\x54\\xfe\\x57\\x65\\x84\\x58\\xb0\\x55\\xce\\x4d\\xe8\\xa7\\x5f\\xc8\\x27\\x15\\xca\\xe9\\x1d\\x37\\x5c\\xf6\\x92\\x81\\x37\\x80\\x51\\xbb\\x61\\xfd\\xd7\\xbb\\x00\\x68\\xf6\\x3e\\xfa\\x6d\\x6e\\x83\\xd8\\xfd\\x42\\x57\\xaf\\x80\\x97\\x0f\\x4a\\x9e\\x69\\x24\\xb2\\xde\\x0a\\xd9\\x66\\xdf\\xfe\\x6f\\xa4\\xa1\\x13\\xb0\\xe7\\x72\\xf1\\x76\\x87\\x85\\xb3\\xb4\\x20\\x49\\xf7\\x6c\\x48\\xad\\x80\\xf2\\xc6\\x7f\\xb0\\xf9\\x1a\\x5f\\xc4\\x10\\x79\\x12\\x52\\x0d\\x8d\\x68\\x3c\\x06\\x2c\\x3a\\x22\\x2b\\xcd\\xa7\\xe7\\x10\\xba\\xcd\\x47\\x8e\\xe8\\x83\\x67\\xb6\\xa0\\x59\\xa4\\x52\\xfd\\x26\\xf1\\x14\\xa5\\xac\\xbd\\x69\\x79\\xba\\x01\\x9f\\x7d\\xa6\\x8a\\xc0\\x4a\\x19\\x30\\x26\\xbc\\x1c\\x27\\xe4\\x83\\x7b\\x1d\\xe2\\x9c\\xce\\x09\\x0e\\x33\\x80\\xd5\\x05\\x1a\\x58\\x64\\x09\\xe6\\x28\\xe3\\x14\\x56\\x65\\xbb\\x1d\\x84\\xec\\xd8\"},\n{{0x69,0xd0,0x1d,0x82,0x91,0x13,0x08,0x1c,0xbf,0x5d,0x0c,0x6e,0xf7,0x7b,0x21,0x77,0x5c,0x8d,0x9b,0x68,0x00,0x00,0x05,0x6f,0x03,0xc7,0x5a,0x7d,0x0a,0x05,0x87,0xd2,},{0xee,0x84,0x69,0xdd,0x61,0xcf,0x5d,0xe4,0x00,0xda,0x7d,0x7a,0x47,0x9a,0x44,0x18,0xe6,0x77,0x2e,0x69,0xff,0x53,0x30,0xce,0x5c,0xa7,0x78,0x59,0xfe,0x27,0x17,0x55,},{0x40,0x8c,0xef,0xcf,0x01,0x41,0x7e,0x2d,0xc6,0xa8,0xa1,0x82,0x84,0xe4,0x11,0x65,0x7f,0x03,0x92,0x50,0xc3,0x12,0x78,0xdb,0x28,0x19,0xf9,0xea,0xea,0x42,0x93,0xfb,0xf6,0x83,0x1a,0x28,0x01,0xfc,0x1e,0xa6,0x87,0x16,0x57,0xb8,0x41,0xe1,0x73,0xf4,0x51,0xb0,0xd5,0x75,0xa9,0x37,0x9e,0x35,0x85,0x7e,0x8c,0x72,0x97,0xfa,0x14,0x04,},\"\\x0b\\x9e\\x11\\x0f\\x29\\xd1\\x98\\x16\\xa1\\x7b\\x2c\\x75\\x47\\x8f\\x13\\xce\\xe9\\x53\\x81\\x1a\\x19\\x83\\x01\\x4c\\xb7\\xeb\\x0f\\x75\\x52\\x69\\x12\\x04\\x4c\\x3e\\xa6\\x82\\x97\\x80\\xe6\\x57\\xf8\\x17\\xc5\\x59\\x7d\\x46\\x61\\x08\\x0d\\x90\\x34\\xc9\\x77\\x87\\x22\\x41\\x8f\\x2c\\x3a\\xee\\xca\\xef\\x6b\\x69\\x0c\\x5b\\xd3\\xb5\\x93\\x70\\x10\\x86\\x98\\x8e\\x43\\x40\\xae\\xc3\\x4e\\x01\\x72\\x75\\x8e\\xb2\\x40\\x87\\xd0\\x3a\\x8f\\x76\\xe7\\xcb\\xca\\x53\\xaa\\xaf\\xc4\\xd2\\x15\\x5c\\x75\\x32\\xab\\x54\\xbe\\x48\\x87\\x26\\x53\\x06\\x6f\\xa1\\xfd\\xd5\\x4a\\xcf\\xe9\\xda\\xae\\xca\\x35\\x6c\\x29\\x0e\\x6b\\xe6\\x33\\x55\\xb6\\xd9\\xfc\\x52\\xeb\\x5e\\x4f\\xcc\\xbb\\xc6\\x08\\x35\\x07\\x13\\x2d\\xe4\\x85\\xbf\\xae\\x9f\\x42\\xe1\\x97\\x12\\x23\\x2b\\x71\\x64\\x02\\xc2\\x3f\\xea\\x74\\xef\\xa6\\x9d\\x73\\xc8\\xc2\\xe3\\xa8\\x66\\x2b\\x8b\\x65\\xb0\\xfd\\x00\\x77\\x41\\x01\\x3e\\x1f\\x6e\\x3c\\xfe\\x43\\x45\\xd5\\xc8\\x30\\x68\\x2f\\xe6\\x00\\x21\\xd7\\x08\\xe1\\x0a\\x9e\\x9f\\x40\\x52\\xff\\x7a\\x6a\\xbf\\x28\\xac\\xb1\\xd6\\xb5\\xfb\\x03\\x8e\\xed\\x3f\\x72\\x51\\x3c\\x35\\x5b\\xbf\\xd5\\xc2\\x27\\x4f\\xa8\\x5f\\xc4\\xf4\\x46\\x97\\x4b\\x2d\\x1b\\xc0\\x36\\x50\\x7a\\x1e\\xb5\\xfc\\xf5\\x5d\\xbd\\x44\\x21\\x0e\\x53\\x82\\x74\\xde\\x80\\x8b\\x90\\x0b\\xf1\\xc0\\xfc\\xc0\\x24\\x12\\x70\\xdb\\x8d\\xbd\\xcd\\x88\\x34\\x9d\\x67\\x22\\x4f\\x08\\x7e\\x5f\\x07\\xf6\\x99\\xb0\\xba\\xe6\\x8b\\x2e\\xbc\\x9a\\x4e\\x27\\xc7\\x0d\\x3a\\xc7\\xd9\\x96\\xfa\\x7d\\x4d\\xab\\xd5\\x68\\x37\\x8e\\x3f\\x93\\x90\\x5b\\x1c\\x89\\xc6\\x52\\xd3\\x84\\xc1\\x6c\\x2b\\xcb\\x1c\\x98\\x44\\xc3\\x8f\\x71\\xbb\\x13\\xe0\\xc6\\xa2\\xea\\x95\\xb6\\x12\\xe3\\x90\\xc5\\xf8\\x6d\\x24\\x8e\\xa5\\x31\\xf2\\xec\\x6f\\x63\\x9a\\x40\\x2d\\xfa\\xcc\\xf3\\x72\\x17\\x00\\x53\\x44\\x03\\x07\\x45\\xd1\\xf1\\xe5\\x20\\xcc\\x19\\x5d\\xaf\\xdd\\x7f\\x29\\x5f\\x37\\x7b\\x8d\\x61\\x47\\x16\\x70\\x38\\x36\\x21\\x9b\\xb7\\xb0\\x9f\\xea\\x7a\\xae\\x9a\\xc3\\x3e\\x42\\xdc\\xab\\x65\\xcc\\x61\\x42\\xfc\\xd8\\xce\\x15\\xe9\\x77\\x17\\xfd\\xb3\\x3e\\x95\\x38\\xc4\\x4f\\x6c\\xd9\\xc1\\xc6\\x5d\\xb6\\x27\\x51\\xf5\\x52\\xf8\\x70\\xf1\\x01\\x42\\xc9\\x6f\\x9d\\xf1\\x85\\x5a\\xbb\\x39\\xe4\\x27\\x06\\xa5\\x63\\xab\\x15\\x45\\x11\\xfd\\xce\\x68\\x7c\\x95\\x76\\xf9\\xed\\xc3\\xb4\\xba\\x55\\x34\\x6c\\xe6\\x68\\x02\\xff\\xfe\\xf4\\xb1\\xb5\\xe1\\x20\\x15\\xce\\x8b\\x57\\xde\\x54\\x58\\xca\\xa0\\xda\\xf3\\x41\\x96\\x81\\x28\\x58\\x42\\x88\\xc2\\xf2\\x7c\\xbf\\xb7\\x6e\\xab\\x28\\x6b\\xac\\x5f\\x66\\xaa\\xd0\\x04\\x9e\\x0c\\xa6\\x0a\\x90\\x14\\xe1\\x79\\x01\\xc4\\x13\\x0e\\x83\\xce\\xae\\xb4\\xc2\\x71\\x3e\\x97\\x1a\\x23\\x5e\\xff\\x99\\x5a\\x81\\x3a\\xe4\\xea\\x64\\xa5\\x83\\xff\\xde\\xfd\\xac\\x82\\xac\\x76\\xea\\xf4\\xd4\\x7c\\x4a\\xc8\\x25\\x0f\\xcb\\xaf\\xd6\\xb8\\x8f\\xae\\xb4\\x80\\x15\\xf5\\xb4\\x2b\\x53\\x34\\xa5\\x0b\\x31\\xd4\\x50\\x2e\\xa4\\x91\\xda\\x90\\xdc\\xe9\\x3c\\x08\\xfd\\x56\\xf5\\xc5\\x8e\\xed\\xb3\\x79\\x16\\x6a\\x23\\x76\\x2b\\xe5\\xe4\\xad\\xea\\xa6\\xf4\\xae\\x1c\\x24\\xe0\\xca\\xc4\\xdd\\xca\\x03\\x83\\x45\\x85\\x60\\xcd\\xc4\\x8b\\x8c\\xd1\\xf4\\x2a\\x3b\\xa2\\xf6\\xff\\xb6\\x07\\x79\\x09\\xfc\\xb2\\x94\\xad\\x1e\\xf4\\xa4\\x4c\\x22\\xec\\x4b\\x39\\x87\\xdd\\xbe\\xef\\x32\\x5b\\x98\\xce\\xd5\\x68\\x15\\xea\\x7d\\x5f\\xcc\\xf5\\xaf\\xdf\\xe9\\x8e\\x0e\\x6d\\x92\\x0f\\x7a\\xda\\x2e\\xb5\\xc9\\x16\\x24\\xc7\\x6c\\xbb\\xa2\\x99\\x3a\\x9c\\x7a\\x55\\x02\\x1d\\x12\\x7a\\x66\\x7b\\x39\\xe2\\x35\\xdf\\x4f\\x81\\xde\\xe7\\xdd\\x14\\x28\\x98\\x77\\x8d\\xbd\\x92\\x13\\x5b\\x70\\xb3\\xac\\xf5\\x9f\\x6c\\x29\\xa2\\xc9\\xd4\\xa7\\x00\\x6e\\xf1\\x1a\\x91\\x8b\\x3a\\x29\\x06\\x26\\x4a\\x15\\xd6\\xb5\\x29\\x30\\x8c\\xbc\\x89\\xf8\\x56\\x01\\xfc\\x1e\\xa1\\x31\\x4d\\x67\\xf7\\x56\\x6c\\xf1\\x09\\x16\\x5c\\x7f\\x92\\xde\\x1a\\x18\\xd7\\x0d\\xeb\\xe0\\x24\\x34\\x9d\\xb3\\x56\\x0a\\x6e\\x52\\x7e\\x2a\\xc3\\xe0\\x67\\x89\\x46\\x87\\x04\\xe6\\xb8\\xf1\\x87\\x1f\\x16\\xba\\xe9\\x82\\x73\\x92\\xb4\\x18\\xf1\\x08\\x6c\\xc4\\x97\\x08\\x6c\\xed\\x14\\xb1\\x24\\x9d\\x6d\\x87\\x94\\xf2\\x3b\\xb8\\x77\\x9d\\x41\\x86\\x48\\xf2\\x15\\x56\\x56\\xa6\\xfd\\xa7\\x44\\x0c\\x56\\x28\\x4d\\x9b\\x21\\x88\\xfa\\x7d\\x17\\x36\\xbc\\xcc\\x9c\\xff\\x0b\\xe5\\xb1\\xe1\\xf5\\x51\\xff\\x81\\x37\\xff\\x59\\x66\\xed\\x9d\\x0f\\x7f\\x01\\xc3\\xdf\\xf2\\x98\\xe9\\x10\\x2f\\xfb\\xd3\\x24\\xbf\\xca\\x5f\\xfe\\x09\\x68\\xe6\\x6f\\x9d\\x82\\xf4\\x87\\xd3\\x03\\x93\\x4f\\x27\\xf7\\x8b\\x28\\x37\\x8e\\xb7\\x2c\\x38\\x27\\x29\\x62\\xa5\\xf7\\x35\\xd7\\x39\\x2e\\x5d\\x33\\x3f\\xd8\\x6d\\xe1\\x67\\x26\\x9c\\x17\\xa1\\x65\\xb9\\x2d\\x31\\xa4\\x88\\x0a\\x41\\xe1\\x36\\xf7\\x18\\x96\\x0a\\x91\\x9b\\x3d\\x7c\\x4e\\x74\\xcb\\xd7\\x3c\\x73\\xf9\\x21\\xbe\\x51\\x3f\\x73\\x9a\\xff\\xb2\\xe4\\x1f\\x80\\x42\\x6b\\xb8\\xcf\\xb4\\x56\\x4b\\x98\\xfc\\x4d\\xe5\\x32\\x55\\xce\\x3f\\x98\\xb4\\xd2\\x2a\\xe6\\xfc\\xe9\\x19\\x0b\\x55\\xbf\\x2c\\x93\\x86\\x1c\\x1d\\xca\\xc1\\x01\\xb5\\xe1\\x6c\\xf0\\x99\\x91\\xc5\\xde\\xfa\\x33\\xf8\\xd5\\x10\\x56\\xd9\\x34\\xbb\\x4b\\x47\\x7b\\x65\\x20\\xd4\\xc7\\xae\\x22\\xea\\x7f\\xb3\\x10\\x9d\\xe7\\xf4\"},\n{{0x4b,0x8e,0xd2,0x97,0x31,0xf1,0x04,0x79,0x5e,0x97,0xde,0xe7,0xc8,0xb4,0x01,0xa0,0x2a,0xfa,0xa9,0xa7,0x95,0xe6,0x13,0x35,0x3d,0x2b,0x95,0x00,0x17,0x65,0x02,0x7a,},{0xf2,0x22,0x98,0x21,0x0b,0x09,0xfd,0x61,0x7f,0xc8,0xb3,0x50,0x74,0xca,0x18,0x01,0xe6,0x07,0x5d,0xc9,0x2a,0x8f,0x50,0x34,0x4b,0x80,0xe8,0x54,0x05,0xa0,0x38,0xf5,},{0x23,0x45,0x88,0x66,0x86,0xeb,0x39,0xb5,0x19,0x9c,0xaa,0xa9,0x61,0x5b,0xc6,0xb4,0x89,0x6f,0x07,0x6e,0x8b,0xd7,0x36,0xc0,0x03,0x8a,0x65,0x17,0xf9,0xc2,0xb1,0x67,0xe7,0x59,0xf3,0x73,0x72,0x26,0x8a,0x69,0x7e,0x9b,0x78,0x60,0x5f,0x2e,0xd9,0x47,0x25,0xf6,0x90,0x5a,0x79,0x00,0x15,0x3f,0xc9,0xe8,0xbe,0xed,0x31,0xff,0xae,0x05,},\"\\xcb\\xb5\\xf1\\x3a\\x0e\\xf2\\x83\\x7b\\x80\\x5d\\x3b\\x78\\x51\\x09\\xf9\\xf2\\xe0\\xd0\\xa0\\x17\\xbf\\xe7\\x69\\x2d\\x91\\xec\\x23\\xdd\\xab\\x78\\x17\\x33\\x0b\\xef\\x24\\x7f\\xd9\\x1a\\xb2\\xc7\\x7d\\xd4\\x41\\x25\\x19\\xcb\\xd3\\x84\\x75\\xce\\x0c\\xb3\\x9b\\x14\\x80\\x09\\x2b\\xc7\\x38\\xd4\\x15\\x2b\\x8a\\x6d\\x55\\x24\\x8e\\x3b\\x9f\\x32\\xcd\\xcd\\x15\\xec\\x5d\\x05\\x9e\\xc3\\xc8\\x84\\x75\\x54\\xee\\x47\\x00\\x53\\x94\\x97\\x4d\\x8e\\xb2\\x35\\x92\\xd1\\x7f\\x5a\\x39\\x6e\\x3c\\x19\\xf8\\xe8\\x98\\x37\\x06\\x79\\xfe\\xf5\\x31\\x8c\\x4d\\xd2\\x99\\xc6\\x21\\x7d\\x6a\\xbc\\xc9\\xb6\\x1a\\x5b\\x2d\\x0c\\xfe\\xf6\\x95\\xd1\\x70\\xca\\x20\\xa8\\x3d\\x6f\\xd3\\xc6\\x66\\xc8\\xfd\\x1c\\x10\\xad\\x97\\x0e\\x2f\\xa6\\xaf\\x10\\xff\\x0e\\xd0\\xcb\\xfe\\x75\\x22\\x46\\xd0\\x3f\\x3a\\x3c\\x60\\x32\\xdb\\xb3\\x19\\xbc\\xfd\\xac\\x4d\\xaf\\xc5\\x0b\\xc3\\xe6\\xbf\\x59\\x5f\\x49\\x1d\\xec\\x38\\x8b\\x34\\x41\\xb8\\xce\\xe0\\xdf\\x91\\xf5\\x5c\\xc7\\x80\\x7d\\x07\\xf8\\xf5\\x41\\xed\\x73\\x22\\xff\\xc3\\x9d\\x18\\xf8\\x95\\x60\\xe4\\x12\\x3a\\xec\\x1d\\x77\\x96\\x9c\\xf1\\x87\\x77\\x86\\xf4\\xcf\\x94\\xb1\\x77\\x0b\\x10\\x90\\x65\\x5e\\x8c\\x72\\xee\\xce\\xa4\\x57\\x2e\\x46\\xf5\\x80\\xf9\\x63\\x96\\x6d\\xb2\\xa1\\x08\\x5e\\xea\\xbc\\x57\\xbf\\x4a\\x84\\x72\\x4b\\x9c\\x85\\x99\\xa4\\x33\\xab\\xf5\\x8b\\xca\\x80\\x40\\x91\\xd3\\xd5\\xe6\\xe5\\x04\\x8e\\xc2\\x7b\\xf8\\x12\\x9b\\x67\\x0c\\xc2\\xc8\\x8d\\x9c\\xac\\x47\\x18\\x59\\xf4\\x69\\xb9\\x18\\xf3\\xf6\\xd7\\x0f\\x7d\\x66\\x63\\x50\\x1f\\xfb\\xef\\xef\\x02\\x6d\\x79\\xea\\x70\\x92\\x7c\\xcf\\x60\\x75\\xee\\x51\\x05\\x42\\x33\\x21\\xe1\\x1a\\xee\\x9a\\xd1\\x6f\\x98\\x7e\\xfb\\xdd\\x00\\xb6\\x2a\\xff\\x69\\x8e\\x52\\x1a\\xdf\\x92\\x03\\xb1\\x5e\\x9f\\x0f\\x3a\\xd0\\x7d\\xca\\xd9\\xdd\\xcc\\xaa\\xe9\\xb4\\x90\\x24\\x7f\\x12\\xc3\\x11\\xde\\xe6\\xb7\\x3b\\x8f\\x91\\x24\\xfd\\xce\\x12\\x99\\xb4\\x7f\\xb1\\x91\\x4c\\xee\\x7e\\x3a\\x07\\x81\\x4e\\x31\\x2c\\x3c\\xe5\\x69\\x27\\x67\\x2c\\x51\\xb3\\x18\\x59\\x80\\xcd\\xe5\\x7f\\x3a\\x75\\x9b\\x50\\xbc\\xfc\\x4c\\xb0\\x75\\x3b\\x95\\x4d\\x97\\x13\\x5d\\xeb\\x2a\\x05\\x32\\xe9\\x8b\\x66\\xf3\\x9a\\x7c\\x08\\xcf\\x4d\\x54\\x85\\x39\\xe2\\xeb\\x9f\\x42\\x2f\\x66\\x49\\x65\\x88\\x93\\xa7\\xc3\\xc2\\x5a\\x4f\\xc9\\x01\\xf8\\xc3\\x98\\xb8\\xc7\\x27\\x33\\x91\\x1a\\x00\\x72\\xed\\x6b\\xd2\\xf4\\x18\\x93\\x89\\xae\\x10\\xa8\\x14\\xf6\\x48\\xd7\\x1f\\x69\\xc3\\x7e\\x82\\x95\\x78\\x44\\x28\\x18\\x3b\\x93\\xc8\\x01\\x3b\\x96\\x4a\\x9f\\xef\\x86\\xb4\\x8f\\x48\\x93\\x16\\xbc\\x22\\x2e\\x96\\xb3\\xbd\\x15\\xff\\x14\\x9b\\x96\\x82\\x03\\x29\\x55\\x1c\\x15\\xe0\\xd0\\x95\\xd1\\x56\\x9b\\x1e\\x21\\x31\\xc7\\x87\\x51\\x56\\x5c\\x30\\x41\\xf2\\x97\\x85\\x39\\x5b\\x97\\x15\\x13\\x17\\xf6\\x2e\\x35\\x82\\xe4\\x07\\xb1\\x64\\x9e\\x60\\xd0\\x3a\\x85\\x99\\x12\\x0a\\x30\\x2a\\x46\\x95\\xfa\\x86\\x2b\\x41\\x20\\xf9\\x4d\\x22\\xec\\xae\\x72\\x39\\x8d\\x20\\x94\\xd1\\x08\\xad\\x2d\\xbc\\x1b\\x95\\x97\\x35\\x90\\x21\\x42\\xaa\\x5f\\xe6\\xe7\\x99\\x65\\x59\\xf6\\xf6\\x01\\x44\\x8a\\xea\\x02\\xf3\\x56\\xf8\\xdc\\xdd\\x14\\x43\\x40\\xeb\\x36\\x19\\xf9\\x86\\x5b\\xf7\\x67\\x2a\\xea\\x32\\x6c\\x4e\\x93\\xc9\\x9f\\x0e\\xd1\\xf9\\xed\\x86\\x6b\\xe1\\x5d\\x3a\\xf2\\x67\\x5f\\x6d\\xd6\\xe2\\x96\\x60\\x2c\\xa3\\x73\\xa8\\x15\\xb0\\xbe\\x46\\xbc\\x2a\\x3f\\xbb\\xa0\\x6b\\x88\\x05\\xc7\\x31\\xfe\\x08\\x00\\x7d\\xaa\\x06\\x05\\x09\\x61\\xb2\\x4d\\x14\\x69\\x3a\\x72\\x89\\x8c\\xcf\\xb8\\xb8\\xfe\\xdc\\x60\\xa4\\xee\\xf8\\xff\\x79\\xb6\\xdd\\x75\\x92\\x59\\x18\\x33\\xb5\\x76\\xef\\x48\\x29\\x4e\\x5e\\x04\\x85\\x94\\x2e\\x57\\xc1\\x19\\x60\\x2e\\xdd\\xf8\\x8b\\x1f\\xae\\xa5\\x17\\xf2\\xfc\\x2e\\x3d\\x14\\xd2\\x46\\xa5\\x2c\\xbd\\x71\\xa1\\x08\\xc6\\x6b\\x6c\\xc4\\xf2\\xd4\\x58\\x04\\xa2\\x82\\xec\\xed\\xb1\\xb0\\xad\\x3d\\xc3\\xb4\\x88\\x0a\\xb2\\xff\\x78\\xb8\\xdd\\xde\\x48\\xf7\\x46\\x6c\\x14\\xfe\\xd3\\x49\\xe9\\x5b\\x50\\x53\\xab\\xf1\\xbf\\x09\\x91\\x12\\x60\\x31\\xd9\\x75\\x47\\xd1\\x43\\xc2\\xae\\x16\\x49\\x28\\xb6\\x1c\\x07\\x08\\xaf\\x8c\\xa3\\xe4\\xf5\\x51\\x54\\xd1\\x3d\\x75\\xe9\\x7d\\xb4\\xba\\x3e\\x69\\xd3\\x6e\\x9b\\x37\\x08\\x23\\x68\\xc2\\xf7\\x21\\xbd\\x3f\\x95\\x12\\x6a\\x1e\\x00\\x4e\\xb2\\xa1\\xbf\\x26\\x83\\x43\\xae\\x21\\xd2\\x99\\x50\\x44\\xa2\\xca\\xdd\\x67\\xff\\xac\\x9e\\x15\\x38\\x17\\x5b\\x3c\\xc4\\x4d\\xb5\\xd2\\x6f\\x1d\\x5c\\xc8\\x9c\\xa0\\xe1\\xc1\\xee\\x85\\x37\\xa8\\xa9\\x1d\\x32\\x4c\\x2e\\x02\\xe1\\x8b\\x9f\\xb9\\x73\\x0d\\x6d\\xda\\x55\\xf7\\x2d\\x84\\x33\\x89\\x69\\x3e\\xbf\\xcb\\xa7\\xfb\\xe1\\xa0\\xbc\\xff\\xb9\\xaa\\x28\\x4f\\x4a\\xe6\\x6f\\x44\\xa8\\xb8\\x93\\x02\\x98\\x3b\\x22\\x73\\x6d\\x0c\\x72\\xd6\\xa0\\x44\\xe4\\x29\\x16\\x24\\x24\\x3a\\x4e\\x0c\\xe6\\x5d\\x5e\\x53\\x46\\xd6\\x7f\\xed\\x37\\x60\\xdd\\xb0\\xc5\\x10\\xb5\\x0f\\xf3\\xee\\xf0\\xa1\\x8a\\x26\\x7d\\xe7\\x30\\x47\\x6d\\xd8\\x2d\\xff\\x70\\x72\\xcb\\xa0\\x98\\x48\\x25\\xa0\\x04\\xdd\\x4b\\xcd\\x8c\\x37\\xfd\\xaf\\x1f\\x68\\x3d\\x1d\\x93\\x80\\xe1\\x35\\xa9\\x5d\\x24\\xb8\\x9f\\xad\\x0b\\xe9\\x41\\xc5\\x48\\x25\\x1b\\xec\\x90\\xcc\\xae\\x01\\x5b\\xc0\\x56\\x7d\\xa8\\x4b\\x37\\x1e\\x50\"},\n{{0x08,0x0d,0x7f,0x76,0x18,0x2e,0xe6,0xbc,0xea,0x89,0x4b,0x1e,0x00,0x60,0x55,0x8b,0x3b,0x12,0x5a,0x34,0x99,0xdf,0x39,0x73,0xb8,0xdd,0x66,0x93,0x40,0x8e,0xe4,0x69,},{0x41,0x24,0x71,0x3d,0x7c,0x2d,0xf5,0x0f,0x93,0x05,0x57,0x30,0xd1,0xb2,0x81,0xda,0xec,0x30,0x28,0xcf,0x2c,0x1e,0x48,0x58,0xd1,0x28,0x70,0x7a,0x23,0xd6,0xde,0xb0,},{0x18,0x5f,0xb1,0xb6,0xd8,0x6d,0xc4,0x44,0x48,0x10,0xcf,0x5e,0xc6,0xfe,0xf0,0xab,0xda,0xfa,0x2a,0x6f,0xcc,0xb4,0x5d,0x11,0xcf,0xb5,0x4b,0xa1,0x6a,0x68,0x43,0xf2,0x80,0xd3,0x80,0x47,0x10,0x02,0xae,0x0d,0x71,0x50,0x85,0x56,0xc7,0x8e,0xd5,0x41,0x5e,0x42,0x33,0x8c,0x16,0x1f,0x2b,0x62,0x1e,0x74,0xcb,0xa4,0xf6,0xa1,0xd4,0x02,},\"\\xab\\x0a\\x6d\\xe2\\x35\\x1b\\x9a\\x84\\x98\\xf6\\x82\\x72\\xd9\\xa0\\xa7\\xa0\\x57\\x36\\x5d\\x34\\xef\\xa0\\xfd\\x34\\xcc\\x3b\\xf8\\x62\\xe4\\x9c\\xdc\\x30\\x2b\\x2b\\xd5\\xa3\\x0d\\x60\\x1a\\x13\\x0e\\xc4\\x03\\x2f\\x54\\x1a\\xe6\\xcb\\x7b\\xa9\\x7f\\x84\\x18\\x3d\\x2d\\x25\\x81\\x28\\x7c\\xa7\\x01\\xd7\\xd7\\xa9\\xab\\xa1\\x10\\xce\\x58\\xb9\\x46\\xac\\x08\\x24\\x30\\x5d\\xf7\\x92\\x9f\\x3d\\xd7\\xfc\\x9c\\x87\\x32\\x23\\x86\\x37\\xe2\\xb1\\x81\\xd6\\xe1\\x16\\xc7\\xf6\\x6e\\x32\\x26\\xaa\\xe3\\xce\\xd1\\x61\\x02\\x62\\xda\\x1a\\x0a\\x4a\\xa5\\x0a\\x1b\\x94\\x43\\xec\\x82\\x83\\x29\\xe4\\x73\\x4d\\x28\\xfc\\x25\\xab\\x9c\\x1d\\xe9\\xb8\\x98\\x7e\\x5d\\xc0\\xc8\\x13\\x19\\x16\\xc5\\xf1\\x89\\x28\\x70\\x4a\\x71\\xe8\\x06\\x22\\xb1\\x49\\x2b\\xf2\\xfe\\xc5\\xd4\\xb6\\xdb\\xe4\\x15\\xc8\\xaf\\x2c\\xe3\\xef\\x10\\x9b\\x34\\xdd\\x5e\\x64\\xd5\\x68\\x46\\xf0\\x85\\x93\\x5a\\x4a\\x5d\\x10\\x73\\x49\\x7f\\xb3\\xfb\\x8f\\xb7\\x7e\\x8f\\x5d\\x5e\\x3f\\xd0\\x0c\\x30\\x65\\x2e\\x3c\\x5c\\xde\\x40\\xa3\\x35\\xd1\\x4e\\x54\\x25\\xff\\xba\\x94\\x28\\x85\\xed\\x17\\xbd\\x36\\xdf\\x50\\x69\\x24\\x23\\x7e\\x75\\xbe\\x84\\xda\\x82\\x19\\x50\\xb9\\x14\\x24\\xfd\\x9f\\x16\\xc1\\xb2\\xc7\\x83\\xe9\\x0f\\x8c\\xc2\\xcc\\xc7\\x98\\x0c\\xe9\\x15\\xc7\\x69\\x6b\\x06\\xa5\\x86\\x73\\x02\\x59\\xe6\\xd1\\x45\\x88\\x58\\x2b\\xab\\x9d\\x2a\\x39\\xf6\\x9e\\x98\\xe7\\xf2\\xae\\x9b\\xc0\\xc2\\x61\\x0d\\x7e\\x04\\x57\\xf2\\x6a\\x5d\\x66\\x54\\x3b\\xe1\\xd6\\x5b\\x79\\xc4\\xb7\\xc0\\xd8\\xee\\x73\\xd0\\xc2\\xb6\\x7b\\xf5\\x0d\\x80\\x82\\xf0\\x06\\xf9\\x6d\\x11\\x95\\x05\\x87\\x31\\x93\\xdf\\xdb\\xd4\\x32\\xbb\\x1c\\x9e\\xe0\\xd0\\x3e\\xe5\\x4c\\xf9\\x5d\\x20\\xe9\\x1f\\x7f\\x3a\\x06\\x9b\\x62\\x56\\xf4\\x21\\x59\\xcd\\xc1\\xe6\\x00\\xa9\\xa1\\xc2\\xf5\\xa8\\xe4\\x67\\xd5\\xc2\\xa9\\xdf\\xf8\\x73\\x0e\\x6b\\xe8\\x26\\xfb\\x2a\\x1e\\x64\\x48\\xbf\\xc4\\xfc\\xaa\\xaa\\xcd\\xaa\\x76\\x62\\x35\\x1f\\xaa\\xdc\\x91\\xf7\\xca\\xa7\\x73\\x7d\\xc8\\x2e\\xc3\\xd4\\xb2\\x19\\x36\\xbc\\xa1\\xbd\\x7c\\xe3\\x73\\xad\\x66\\x26\\x4a\\xf1\\x32\\x41\\x16\\x75\\x49\\x31\\x8c\\xdd\\x78\\xe5\\x63\\x82\\x7f\\x85\\xea\\xb2\\x0e\\x0b\\x42\\xbc\\x55\\x4a\\x71\\x2c\\x00\\x51\\xa5\\x01\\x0d\\xc2\\xf2\\xc7\\xdb\\x85\\xac\\xf6\\x54\\x9f\\x9d\\x10\\x2c\\x90\\x3c\\x1b\\xe5\\xa0\\x52\\x92\\xc3\\x0f\\x21\\xab\\x1b\\x2b\\x8a\\xbc\\xbb\\xf1\\x04\\x72\\x3c\\x63\\xf0\\xeb\\xc5\\x54\\xfb\\xee\\x42\\x02\\x0c\\xcb\\x14\\xf4\\x43\\x47\\x8d\\xf7\\x7c\\x6a\\xa4\\x4d\\xb9\\xa5\\x7f\\x8f\\xd4\\x4d\\x97\\xea\\x09\\x9e\\x47\\x74\\x82\\x3e\\xbe\\x12\\x3f\\xcf\\x50\\x16\\xa6\\x6e\\x83\\x7b\\x2f\\x65\\xc1\\x84\\x5e\\x68\\x1e\\xe2\\xa7\\x05\\x9f\\xb1\\x29\\x0c\\xd0\\xa9\\x33\\x12\\x98\\x55\\xcc\\x83\\xc8\\x7e\\x0b\\x3b\\xb6\\x1e\\x44\\x13\\x4a\\xdd\\xd3\\x63\\x78\\x50\\x24\\x6c\\xdc\\xda\\xa2\\x9f\\x15\\xc4\\x1a\\x3d\\x4d\\xd2\\xc1\\xd7\\x60\\x06\\x21\\x24\\x33\\x31\\x24\\xcf\\x09\\x14\\x35\\xfd\\xce\\x71\\x1f\\x52\\x31\\x63\\x68\\x99\\x9b\\xef\\xa4\\xc8\\x0a\\x39\\xb3\\x75\\x0e\\x4e\\x38\\x62\\x89\\xe4\\xe2\\x85\\x5e\\x97\\xb6\\x19\\xb0\\xa2\\x57\\x99\\x91\\x24\\x08\\xb7\\xd5\\x8a\\x4d\\xd9\\x81\\x95\\x71\\xe9\\x01\\x43\\x0f\\x6d\\x55\\x55\\x29\\xdd\\x63\\x0a\\x18\\x67\\x45\\x9b\\x80\\x22\\xd0\\xe0\\xad\\xd6\\xab\\x4f\\x12\\xf6\\x0b\\xaa\\xc7\\x59\\x79\\xbb\\xff\\x7f\\x62\\x58\\xd2\\x8d\\x67\\x60\\xb1\\xff\\x24\\x3c\\x39\\xe4\\xbb\\xd6\\xcf\\x9b\\xea\\x57\\x2a\\x9c\\x08\\x2d\\x05\\xad\\xcf\\xd4\\xcc\\xf9\\xfa\\x02\\x6f\\x2c\\x90\\x4b\\x6e\\x78\\x2e\\xd7\\x09\\xdf\\x77\\x48\\xa3\\x07\\xcd\\x2d\\xc3\\xa0\\xfc\\x41\\x23\\xdf\\x58\\x0c\\xbf\\x49\\xe0\\x5c\\xee\\xab\\xc9\\xf3\\x9e\\x57\\xb7\\xf3\\x00\\x90\\x5d\\x8b\\x31\\x00\\x91\\xfb\\x95\\x3f\\x3d\\xef\\x36\\xde\\xb3\\xe8\\xbf\\x37\\x2f\\x59\\x16\\xb5\\x15\\x97\\xdf\\x02\\x4c\\xe8\\x5c\\xc4\\xc3\\x6e\\xab\\xdc\\x58\\x0b\\x5c\\xf1\\x52\\x99\\x46\\x48\\xf1\\xd7\\xf3\\x5f\\xed\\x5c\\xd1\\x0f\\x6e\\x29\\x49\\x16\\x1a\\x33\\x59\\xb3\\x03\\x4d\\x45\\x0e\\xa6\\xf6\\x1c\\xdf\\x1d\\x5a\\xf7\\x6d\\x40\\x10\\x2b\\x60\\x29\\x4f\\x4e\\x49\\x07\\x82\\x49\\x02\\x6d\\x62\\xfe\\x35\\xfd\\xf2\\x24\\x92\\x8b\\x0c\\x49\\xba\\x2b\\x53\\x39\\xeb\\xb1\\x92\\xc5\\xab\\x7f\\x05\\xcd\\xb9\\x46\\xe3\\x7d\\x67\\x1a\\x4a\\x5e\\xf2\\xa5\\x82\\x72\\x20\\xb4\\x43\\x8c\\xbd\\xa0\\x57\\x36\\x29\\x28\\x06\\x64\\x8f\\x5b\\xdd\\x52\\x42\\x0f\\xa7\\x6b\\x84\\xa6\\xad\\xdb\\x12\\x63\\xeb\\x0c\\x50\\x0e\\x81\\x56\\x6d\\x71\\x8d\\x50\\x66\\x02\\x6d\\xa0\\x97\\x05\\x4a\\x86\\x63\\x10\\x16\\xdd\\xfb\\x70\\x6a\\x56\\x77\\xd5\\x02\\xef\\x84\\xaa\\x73\\xb5\\x86\\x3b\\xc4\\x0f\\xdc\\x42\\xcb\\x73\\x21\\xac\\x5f\\x00\\xe2\\x92\\x8f\\xed\\x7b\\x04\\x18\\x59\\x6d\\xb4\\xb6\\x15\\x1d\\xd6\\xbc\\x6e\\x81\\x8f\\x02\\x53\\x55\\x2b\\xf1\\x37\\x41\\xe6\\x96\\x80\\xe9\\x66\\xc9\\x2c\\x29\\x3e\\x13\\xc9\\x0f\\x7c\\x99\\x99\\xbd\\x1e\\xc6\\xaf\\xe3\\xb4\\xaf\\xfb\\x47\\x34\\x0c\\x89\\x85\\x98\\x29\\xfe\\xb5\\x99\\xdb\\x3a\\x8c\\x3d\\x33\\xfc\\x8d\\x45\\xfa\\x53\\x81\\x07\\x8a\\xe9\\xf7\\x5d\\x85\\xc1\\x49\\x6f\\x5f\\xb5\\xad\\xdf\\x4e\\x40\\x09\\xb7\\x64\\xbc\\xc9\\x11\\x8e\\x92\\x75\\xdc\\x72\\x19\\xf2\\x81\\xd0\\xd1\\xef\\x71\\x58\"},\n{{0x49,0x84,0x6a,0xda,0x7a,0xe6,0x84,0x97,0x1d,0xd9,0x17,0x10,0x79,0x90,0x90,0xb3,0x7f,0xe5,0xad,0x56,0x1d,0x72,0xa3,0x5f,0x2e,0xfb,0x40,0x5f,0x19,0x6a,0xb0,0xec,},{0x4d,0x37,0x0a,0x81,0x94,0xa3,0x04,0x5b,0x09,0xb3,0xbd,0xaf,0xa2,0x7f,0xb9,0xac,0xd5,0x99,0x43,0xa5,0x4a,0xe1,0x4c,0xba,0xaa,0x22,0x00,0xeb,0x0f,0x3d,0xa7,0x1b,},{0xa5,0xc8,0x09,0xd1,0xca,0x4c,0xfb,0xb3,0xdc,0x70,0xa2,0xa3,0xa1,0xf2,0x67,0xc2,0x73,0x30,0x42,0x07,0x19,0xe3,0x60,0x62,0x18,0xa1,0x47,0x1c,0xac,0x57,0xcb,0x67,0x4b,0x9b,0x42,0x82,0x7c,0x5e,0x9a,0x7b,0x25,0xc8,0x13,0x9c,0x13,0xdf,0xf6,0x0b,0xde,0x6c,0x2d,0xba,0xd3,0xa8,0x36,0x11,0x97,0xc1,0xfb,0x19,0xd2,0xcd,0x52,0x0b,},\"\\xab\\x39\\x8d\\x94\\xf9\\x28\\xb1\\xd4\\x21\\x02\\xa3\\xe5\\x13\\xcc\\xd1\\xcb\\x10\\x89\\x90\\x11\\x03\\x94\\x10\\xa8\\x88\\x8b\\xba\\x26\\xdf\\x1a\\x03\\x72\\xbd\\xba\\x0c\\xe8\\xd8\\x54\\xaf\\x51\\xe9\\x33\\x0a\\x8d\\xaa\\x93\\xc1\\x05\\x80\\x90\\x6a\\x8a\\xc7\\x2d\\x29\\x4a\\xeb\\x95\\x66\\xfe\\x1c\\x78\\xba\\x84\\x71\\xc0\\x6c\\x4a\\x8a\\x75\\x11\\x3b\\x34\\x89\\x3f\\x62\\x76\\xed\\x81\\x32\\x92\\x05\\x3b\\x95\\x6a\\x46\\x5d\\x84\\x7d\\x2e\\xce\\x86\\xe2\\xda\\x8a\\x9f\\x0f\\xe3\\xdb\\x52\\xa5\\xaa\\xc7\\x46\\xef\\x96\\x48\\x5e\\xf8\\x1f\\x13\\x62\\xb5\\xa4\\x2e\\xaa\\xee\\x1f\\xbb\\x06\\x46\\x70\\x44\\x71\\xa2\\x1b\\xf7\\x63\\x67\\xbe\\xaa\\x07\\x81\\x2b\\x3d\\x32\\xad\\xcd\\xed\\xde\\xd7\\x53\\x9e\\x3a\\x50\\x1b\\x83\\xc0\\x5b\\x19\\xa4\\x9b\\x52\\x0e\\xde\\xdc\\x9a\\x78\\xa5\\xfc\\x2d\\x50\\x12\\xf1\\xd4\\xe3\\x81\\x84\\x4e\\x79\\x2e\\xd9\\x0b\\x0f\\x57\\xbc\\xe3\\x75\\xc7\\x5a\\x65\\x8b\\x2c\\x78\\xc6\\xff\\x7d\\x9e\\xfc\\xd4\\xbf\\xa3\\x5c\\x47\\x68\\xcb\\xb1\\x95\\xe4\\x82\\x3d\\x9b\\xbd\\x83\\x5a\\x37\\x4f\\xa0\\x4c\\xa1\\xea\\xae\\x9c\\x56\\x6d\\x8f\\xd5\\xaa\\x7c\\xa5\\xef\\xe0\\xdf\\xc3\\x17\\xff\\xfa\\x40\\x9e\\xf1\\x02\\x2f\\x1c\\x3b\\x37\\x6a\\x93\\x5a\\xf5\\x57\\x08\\x3e\\x95\\x28\\x7b\\x07\\xa9\\x8a\\xc6\\xc1\\xb7\\xbd\\x8b\\xb2\\x6b\\x60\\xfa\\x7c\\x4b\\xc9\\x19\\x73\\xb2\\x01\\xb2\\x99\\x22\\xb4\\xb9\\xd0\\x3d\\xd6\\x88\\x2a\\x0b\\xd3\\xb7\\xd9\\xe5\\xb8\\x1e\\xe7\\x4c\\x36\\xbe\\xc6\\x65\\xe4\\x34\\x3c\\x8c\\x9a\\xd3\\x36\\xda\\x38\\x50\\xc9\\xb2\\x69\\x7f\\xe1\\xcc\\xe2\\x9c\\x37\\x86\\x22\\xa3\\x3c\\x24\\x8f\\x44\\x8c\\x88\\xf4\\x8d\\xf0\\x26\\x01\\x43\\xb2\\xa3\\x42\\xf1\\xdd\\xee\\x74\\xd3\\xb9\\x7c\\xa3\\xe1\\x16\\x6b\\x15\\x69\\x93\\xda\\xd3\\x0c\\x49\\xd8\\x10\\xd7\\x40\\x48\\xbc\\x6d\\x46\\x76\\x52\\x00\\x4d\\x7e\\xdb\\x65\\xc6\\xda\\xc3\\xa2\\xc5\\xd3\\x00\\xb9\\x7e\\xe3\\xa1\\x0a\\x9e\\x14\\xb6\\x9f\\x3c\\xad\\x67\\x59\\x72\\x96\\x2e\\x1f\\x8e\\xd9\\x75\\x47\\xad\\xed\\xc4\\x7d\\x1c\\xf3\\x47\\x1e\\xf3\\xb2\\x2f\\xdb\\xf7\\x8e\\x34\\xf3\\x1a\\x3b\\xb7\\x66\\x9c\\x41\\xbd\\x92\\x92\\xc3\\x80\\xbc\\xe9\\xa4\\x2d\\x84\\xbc\\x27\\xac\\x92\\x8b\\x8b\\xfc\\x3c\\x63\\xd2\\x0c\\xcd\\xb4\\x78\\xdf\\x7d\\xdf\\x42\\x1f\\xb1\\xcd\\x90\\x5f\\xfc\\x4c\\x04\\x78\\x6f\\xd9\\xae\\xf0\\x6b\\x89\\x38\\xab\\x8e\\xf5\\x22\\x21\\x7b\\x2c\\x04\\x51\\x5f\\x61\\xa1\\xc3\\x12\\xea\\x83\\x25\\x3f\\x84\\x58\\xc0\\x91\\x8f\\xcf\\xe8\\x74\\xe6\\xe7\\xfb\\x11\\x27\\x5d\\xb2\\xa2\\xec\\x79\\xa2\\xd8\\x68\\x30\\x32\\x33\\xc1\\xb6\\x97\\x95\\x2a\\x3b\\xfd\\x3a\\xd0\\xa6\\xf6\\xcd\\xd5\\xe7\\x2c\\xc9\\x40\\x9f\\x74\\x10\\xa4\\x0d\\x5b\\x45\\x36\\xdd\\x46\\xeb\\x16\\x11\\xae\\x86\\x70\\x36\\x71\\xb3\\xa0\\x51\\x5a\\x03\\x77\\xbe\\xa1\\x56\\x54\\xba\\x0a\\x0d\\x1e\\x4e\\x96\\x02\\x63\\x28\\x42\\xf2\\xac\\xd4\\xef\\x99\\x32\\x36\\xe9\\x93\\xf2\\x65\\x0d\\x59\\x92\\x3f\\x24\\xe2\\xcd\\x30\\x93\\x2d\\x8b\\xf8\\xae\\xec\\x64\\x44\\x72\\xba\\x46\\xa0\\x78\\x81\\x49\\x6c\\x92\\xa0\\x13\\x5c\\x67\\x5a\\xeb\\x0c\\xe6\\x18\\x10\\x88\\xdb\\x8f\\x15\\x6c\\xfe\\x74\\x35\\xca\\xc6\\xc9\\x7d\\xa6\\x37\\xdb\\x4a\\x89\\xf5\\x13\\x31\\xda\\x13\\x73\\x1e\\x74\\x1f\\xcc\\xc0\\x35\\x55\\x42\\xce\\x11\\xef\\xa6\\x9d\\x05\\x38\\xd3\\xef\\x12\\x7a\\xa6\\x87\\x45\\xed\\x30\\x85\\xd2\\x9d\\xa9\\x0d\\xc5\\x83\\x70\\x1b\\x6b\\x3a\\x70\\xa3\\xef\\x3e\\x16\\xa9\\x24\\xb3\\x32\\x03\\xb9\\x23\\x96\\xc4\\xb9\\x45\\xf1\\x27\\xa7\\x88\\x8f\\xa0\\x50\\x15\\xc0\\x60\\x30\\x07\\x56\\x67\\x29\\x23\\x7c\\xc0\\x78\\x2b\\x30\\xc0\\x20\\xd9\\x95\\x95\\x47\\xfe\\xec\\x9f\\x4d\\x67\\x64\\x60\\xbf\\xe0\\xc5\\xc1\\x9c\\xea\\xba\\xee\\x06\\x82\\xdb\\x8b\\xe6\\x91\\x35\\x18\\x1e\\xc0\\xfd\\xd9\\xf7\\xa6\\x6d\\x50\\xbd\\xc3\\x79\\xe4\\xa2\\xc5\\x98\\x17\\x8f\\x95\\x93\\x94\\x6a\\xca\\x64\\x05\\xb1\\x77\\xfc\\xad\\xe0\\xf8\\x64\\x21\\x58\\x3e\\xd6\\x7e\\xba\\x18\\x72\\x22\\xa1\\xe4\\x44\\x95\\xb3\\xae\\x54\\x4f\\xdc\\xa2\\x8e\\x2c\\x14\\x48\\x5e\\xab\\x04\\x71\\xaa\\xa8\\x03\\xc2\\x9a\\x9d\\x8a\\x48\\x92\\x67\\x64\\xfc\\xa1\\xdf\\x51\\x40\\x7a\\xd3\\x3e\\xc1\\x7e\\x94\\x1e\\x6e\\x26\\x17\\x23\\x7a\\x84\\x30\\x98\\x73\\xdc\\x71\\x36\\x55\\x87\\xbd\\xe4\\x27\\x4b\\x5d\\xc3\\x27\\xcc\\xb1\\xe1\\xe9\\xc8\\x57\\xe0\\x42\\xcc\\xca\\x8d\\x85\\x52\\xba\\x28\\x8c\\x97\\x8c\\xfa\\x0a\\xf9\\x9d\\x67\\xcd\\x03\\x40\\x60\\x62\\x8e\\x23\\x52\\x5d\\xbc\\xa2\\x07\\x67\\x9c\\xe2\\x96\\x90\\x87\\x84\\x48\\x55\\x3c\\xd3\\x86\\x75\\xbc\\xe0\\x7b\\xf9\\x7b\\x93\\x17\\xdc\\x44\\x46\\x8b\\x76\\x8b\\x15\\x8b\\x0c\\x11\\x1d\\x63\\xa5\\x72\\x23\\x56\\x55\\xc4\\x0e\\x16\\x59\\x7c\\xa0\\x59\\xf4\\x0c\\x3d\\x8a\\xc5\\xbd\\x61\\xa4\\x87\\xc1\\x53\\x13\\x84\\x6a\\x70\\x4a\\x78\\x11\\xb8\\xbc\\x0c\\xee\\x61\\xe3\\x47\\x62\\xb6\\xc1\\xb7\\xce\\xa1\\xc4\\x6e\\x60\\x87\\xe9\\xa3\\x6f\\x89\\x91\\x8a\\x25\\x8b\\x3f\\xa7\\x76\\x20\\xbe\\x10\\xc1\\x84\\xc3\\xfc\\x39\\x73\\x90\\x24\\xe9\\x82\\x78\\xfd\\x65\\xb8\\x2c\\xad\\x83\\x69\\x9f\\x3a\\xd8\\xc6\\xec\\xcb\\xec\\x8b\\x7b\\x1b\\xd7\\x91\\x4d\\x3f\\x6c\\x3d\\x02\\xbf\\x40\\x28\\x3b\\x1c\\x1f\\x1e\\x98\\xe3\\x08\\xbe\\xae\\xbb\\xf8\\x94\\xb8\\xf5\\xe9\\x1b\\xbb\\xc6\\x25\\x35\\xf9\\x23\"},\n{{0x83,0x34,0x3e,0x37,0xad,0x09,0x1a,0x85,0xee,0xc3,0x70,0x70,0x1b,0x81,0xa5,0x8f,0x93,0x70,0xa4,0xb0,0x42,0x3a,0x07,0x0d,0x60,0xf9,0x2d,0x8d,0x18,0x09,0x84,0x4e,},{0x50,0xb6,0x8b,0xf7,0x26,0xea,0xbc,0xa5,0x3a,0xc6,0xc9,0x0d,0x4e,0xac,0x55,0x47,0x03,0x71,0x2d,0x22,0x10,0x55,0x54,0xf0,0x5b,0xf7,0x9f,0x9d,0x08,0xfc,0xc4,0x93,},{0x9c,0x69,0x89,0xcb,0xe1,0x7e,0x16,0xca,0xa2,0x53,0xff,0xb1,0xa6,0x4a,0x10,0x6f,0xb0,0x17,0x82,0xc9,0x9b,0x17,0x22,0xba,0xf1,0xac,0xaa,0x42,0xae,0x5b,0x36,0xb7,0x9b,0x2a,0x2c,0xd8,0xfc,0x91,0xf5,0xad,0x89,0x23,0x81,0x70,0x25,0xa7,0x78,0x25,0xa0,0x5d,0xf8,0xc4,0x17,0xec,0x53,0xc4,0xa3,0xaa,0x1c,0x0e,0xfd,0x5b,0xbe,0x0f,},\"\\xc7\\xda\\xdc\\xac\\x5d\\x87\\x95\\xe1\\x74\\xb6\\x91\\x38\\x91\\x2e\\x70\\xff\\x41\\xe7\\xa7\\x25\\xfa\\xf3\\x85\\xb7\\x73\\xed\\x15\\x09\\x89\\x72\\xb3\\x0d\\x9b\\x73\\x93\\x72\\xd9\\x75\\xb4\\x80\\xcc\\xfd\\xfc\\x58\\x0e\\x2e\\x2d\\xdf\\x5e\\x3c\\x27\\xee\\x79\\x12\\x79\\xab\\x95\\xe4\\x38\\x2b\\x14\\x59\\xdd\\x8d\\x41\\xae\\x36\\x0d\\x4a\\x87\\x88\\x46\\x69\\x29\\x24\\xfe\\xef\\x39\\x0c\\x0d\\xbb\\xfa\\x35\\xe4\\xb8\\x2d\\x7c\\xbc\\x33\\xee\\x15\\x81\\xc5\\x2b\\xd9\\x49\\x38\\x5b\\x2e\\xe4\\x02\\x63\\xa5\\x7d\\xa1\\x17\\x4b\\xb4\\xac\\xad\\x37\\xcd\\x8a\\xe2\\xa6\\xb4\\x5f\\x7a\\x6d\\x6b\\xbe\\xf5\\xa7\\x98\\xce\\x85\\xb9\\xe0\\x5e\\x76\\x47\\xe3\\x34\\xec\\xfc\\x77\\x63\\x78\\xde\\x17\\x4c\\x49\\x7c\\x0f\\x40\\x75\\xe6\\x25\\xaf\\x7a\\xed\\x50\\x2c\\xd1\\xcf\\x7f\\x58\\x8d\\x0d\\x80\\x7f\\x02\\xe3\\x2f\\x43\\x00\\xf2\\x28\\xa5\\x0a\\x66\\x7b\\x5a\\xd1\\xfb\\xbc\\x17\\xe0\\xb3\\xc5\\x70\\x51\\xdd\\xc6\\x02\\xf5\\x76\\x07\\x9f\\x6f\\xc5\\x88\\x9b\\x7f\\x29\\x00\\x71\\x13\\x34\\x42\\x0f\\xc6\\x66\\xf6\\x6d\\xba\\xff\\x41\\x26\\x33\\x6c\\x35\\x3f\\x1e\\x5b\\x56\\x4a\\x66\\x45\\x37\\xf8\\x37\\x86\\xda\\x5c\\x56\\x27\\x74\\x54\\x06\\xd7\\xb2\\xfe\\x32\\x33\\xbf\\xd5\\x8e\\xf4\\x64\\xa0\\x6c\\x95\\xcf\\xd0\\xb9\\x88\\xa7\\x6d\\x05\\x3a\\x64\\x4b\\xcc\\x15\\x9c\\xad\\x53\\xa7\\xc5\\xdb\\xb4\\x0e\\xef\\x5c\\xd0\\x47\\x05\\x6a\\x3f\\x09\\x26\\x5b\\x13\\x25\\x69\\x9c\\x7d\\x15\\x9d\\x5c\\x90\\x24\\x40\\x17\\x33\\x57\\xff\\xab\\x8f\\x7a\\x5e\\x38\\x9f\\x46\\x8c\\x33\\x3b\\x78\\x2f\\x80\\x17\\x0a\\xe9\\x09\\x83\\xaf\\x15\\x3f\\x2e\\x73\\xbd\\x2b\\xef\\x12\\x5e\\x3d\\x38\\x68\\xc2\\xab\\x9e\\xcf\\x03\\xaf\\xf7\\x6e\\xcb\\xeb\\x18\\x16\\x7c\\xa2\\xf7\\x11\\xcd\\x56\\x58\\x51\\xd7\\xf0\\x4e\\xe9\\xd9\\xb0\\x1b\\x6d\\x83\\xa7\\x60\\x57\\x22\\x62\\x0d\\x28\\xc8\\x4d\\x6c\\x1a\\xf4\\x2f\\x6a\\x76\\x92\\x58\\xf5\\x3c\\x1f\\x66\\xda\\x36\\x66\\x6d\\xa5\\xca\\xa9\\xbd\\x9e\\x8f\\xbc\\x16\\x92\\x11\\xb1\\xae\\xd9\\xc2\\x55\\x8f\\x6a\\xaf\\x5b\\x14\\x5a\\xbc\\x72\\x1a\\xbb\\x00\\x72\\x01\\x94\\xe0\\x27\\x03\\x54\\x68\\xbd\\xe3\\xfe\\x0b\\x88\\x88\\x4f\\x4e\\x9b\\x26\\xe7\\x71\\xe6\\xc7\\xa0\\xa5\\x5e\\xa3\\x6f\\xc5\\x0d\\xec\\x8c\\xef\\x16\\x2f\\x9b\\xba\\x5b\\x4b\\x16\\x10\\x5a\\xfd\\x6e\\x37\\x4e\\x03\\x8d\\x5c\\x85\\x87\\xcf\\xd7\\xdd\\x88\\x29\\x0b\\x2c\\x9c\\xab\\x45\\xa2\\x64\\xd6\\x54\\x0e\\xa1\\x41\\x6e\\x6e\\x4e\\x74\\xa1\\x2f\\x45\\xa2\\xef\\x13\\xcc\\x8a\\x36\\xe7\\xb0\\xa2\\x6b\\x90\\x2c\\x3d\\x96\\xe2\\xe2\\x22\\x92\\x02\\xe2\\x57\\x65\\x69\\x4b\\x94\\x33\\x73\\xd1\\x6e\\x60\\x0b\\xd7\\x86\\xd9\\x55\\xa4\\xb3\\xf1\\x02\\x16\\x40\\xc3\\x9a\\x0b\\x6c\\x69\\x15\\x00\\x28\\x1a\\xe0\\xd0\\x98\\xcc\\x7f\\x38\\x5e\\x18\\xa0\\x7e\\x62\\xfa\\x4a\\x10\\x1e\\xf5\\xb7\\x85\\x51\\xfa\\x29\\xbd\\x15\\xee\\x03\\x53\\xa1\\xa5\\xef\\x9b\\x21\\x6e\\x8b\\x0f\\xa5\\x07\\x50\\xa3\\x41\\x62\\xb6\\x35\\xa0\\xbc\\x5e\\x5d\\x72\\x30\\xaa\\x19\\xaf\\xa1\\x28\\xab\\xa6\\x42\\x2d\\x38\\xeb\\x77\\xa3\\xf0\\xbb\\x9d\\xd8\\xe4\\x65\\x2f\\x12\\x07\\x0a\\x37\\x36\\x1c\\x37\\x25\\x50\\x3c\\x9d\\x22\\xe2\\xfa\\xce\\x2e\\xa7\\x4a\\x70\\x02\\x40\\x62\\x47\\xdd\\x86\\x97\\x5f\\x07\\x57\\x5c\\x9e\\x7c\\x6f\\x41\\xb5\\x3b\\x26\\xd5\\xcf\\x52\\xc5\\xac\\xc2\\xc5\\xd9\\x82\\x71\\x43\\x4e\\x9f\\xa5\\x09\\xc6\\xdf\\xbd\\x72\\x43\\x72\\xaa\\x5c\\x13\\x45\\x1a\\xae\\x39\\x3d\\xe0\\xa1\\x86\\x46\\x4f\\x5d\\x33\\x7e\\x9f\\x62\\x7b\\x4f\\x1c\\x29\\x09\\x46\\x70\\x65\\xe8\\x9a\\x42\\x2e\\xc4\\x0e\\xe1\\xd8\\x0a\\x13\\x39\\x00\\xa6\\x2f\\x4e\\x4f\\x7e\\x94\\xeb\\x72\\x61\\x5e\\x7e\\xc2\\x99\\x6c\\x6c\\x24\\x30\\xc3\\xe9\\x57\\xce\\xae\\x21\\x05\\xa1\\xe9\\x0e\\xae\\xac\\x0d\\x31\\xaf\\xfa\\x9f\\x57\\x92\\x6d\\x71\\xd9\\x72\\xa9\\xa2\\xde\\x11\\x25\\x8c\\xc1\\xe7\\x28\\x59\\x9c\\x9f\\xb3\\x87\\x24\\x91\\x84\\x7e\\x10\\xc6\\x7e\\xfa\\xef\\x6b\\x69\\x6a\\x03\\x0f\\xf0\\x53\\x3a\\x58\\x3b\\xea\\x1d\\x04\\xdf\\x25\\xf7\\xee\\xf3\\xa1\\x3b\\x8e\\x31\\xaa\\xd1\\x33\\x85\\x7d\\xf1\\xb4\\xe5\\xff\\xbd\\xee\\x37\\xf4\\x0f\\x38\\xd2\\x24\\xc7\\x0a\\xe0\\x4e\\xf3\\x3b\\x41\\xb0\\x2e\\x71\\x91\\xa8\\x66\\x56\\xb0\\xd7\\x2b\\x2c\\xbb\\x53\\xc4\\x90\\x8c\\xa2\\x06\\xf7\\x57\\x34\\xb2\\x77\\x08\\x15\\x4f\\xcd\\x8a\\x97\\x42\\x9c\\xfd\\x1f\\x2d\\xa2\\x42\\x97\\x78\\x43\\x80\\x03\\xf5\\xb5\\xb9\\xc2\\x1d\\x9e\\xd2\\x3b\\x8a\\xd8\\xa2\\x28\\xeb\\x4f\\x65\\xc2\\x4c\\x1c\\x59\\x69\\x9a\\x5c\\x90\\xaf\\xf7\\x73\\xe5\\xc6\\x76\\xdb\\x36\\x2a\\x19\\x30\\xba\\x16\\xab\\xa7\\x6e\\xf8\\xda\\xa4\\x2b\\x3e\\xb2\\xcc\\xc4\\x5c\\x93\\x4d\\x23\\xd4\\x92\\x9a\\x7a\\xd9\\xe3\\xef\\x46\\x8b\\x06\\xa4\\x99\\x5c\\x80\\xdd\\x23\\x6a\\x7b\\xcf\\x38\\x79\\xd8\\xb7\\x94\\x67\\xf7\\x2b\\x33\\x84\\xc1\\x60\\xcc\\x18\\x17\\x14\\xe9\\x2f\\x20\\x35\\xe7\\xb9\\x72\\xa2\\xcc\\x52\\x42\\xd9\\x32\\x52\\x5e\\xae\\x7c\\x50\\xbd\\x26\\x3b\\x0f\\xa0\\x9c\\xbd\\x9d\\x6f\\x98\\x4b\\x9c\\xf6\\x15\\x2d\\x9a\\x13\\x3c\\x27\\x84\\x32\\x02\\xd1\\xe8\\x7f\\xa5\\xa6\\xe1\\x23\\x5d\\x9c\\x75\\x6b\\xb8\\xe6\\x8b\\x05\\xb9\\x8d\\xa5\\x41\\x95\\x22\\x3f\\xdf\\x02\\x10\\x25\\x32\\x50\\x63\\x3c\\x11\\xc5\\xf6\\x0b\\x5e\\x67\\xd7\\xee\\xfc\\xaa\\x6c\\x2d\\xaa\\x52\\x31\\x37\"},\n{{0xda,0x01,0x32,0x21,0xb2,0xf5,0x88,0xaf,0x40,0xe2,0x11,0xa0,0xf9,0x75,0xd4,0x4f,0x9d,0x65,0x02,0x81,0x60,0x51,0x4c,0x39,0x61,0x89,0xf2,0x7c,0x7b,0x06,0x66,0xea,},{0x07,0x11,0x7c,0x6b,0x0d,0xb5,0xb6,0xfd,0xa1,0xed,0xc4,0x39,0x6c,0x47,0xc2,0x2b,0x54,0xee,0x0c,0xe5,0x37,0x5c,0x3e,0xc6,0x33,0xc8,0x3a,0xfc,0x53,0xad,0x6c,0xe4,},{0x10,0xcb,0x52,0xd6,0x10,0xe4,0xa8,0x1d,0x32,0x86,0x9b,0xff,0xce,0x38,0x07,0xe6,0x39,0x1f,0x78,0x2f,0xcd,0x53,0x8b,0x55,0x4d,0x09,0x03,0x7f,0xda,0x72,0x28,0x5b,0x96,0x62,0xb1,0xb1,0x10,0x7c,0x40,0x81,0x78,0xac,0x00,0x9f,0x05,0x25,0x96,0x73,0x88,0xa7,0xd8,0x5f,0xa1,0x23,0x59,0xd3,0xce,0x38,0x75,0x03,0x7d,0xcf,0x6a,0x04,},\"\\xbc\\x93\\xee\\x1e\\xc4\\x72\\x8a\\xc6\\x36\\xa6\\x24\\x8f\\xcc\\x45\\x51\\xc9\\xd1\\x59\\x80\\xdb\\x8e\\x5f\\x54\\xb0\\xef\\x07\\x5a\\x71\\x97\\x0e\\x17\\x6a\\x3c\\xb9\\x18\\x2e\\x32\\xda\\x7a\\x8c\\x2a\\xc0\\xcd\\x7e\\x59\\x57\\x74\\x57\\x5f\\x9c\\x83\\x50\\x6a\\x60\\x6f\\xac\\xe8\\x95\\x12\\x13\\x5d\\x03\\x2a\\xb0\\x5e\\x39\\xff\\xf9\\xc8\\xca\\x6c\\x25\\xcd\\x5d\\x78\\xec\\xc3\\xac\\x32\\x32\\x90\\xc9\\xc8\\x16\\x26\\x73\\x5e\\x19\\x0e\\xb5\\xae\\x34\\x5c\\xa7\\xa9\\x58\\x40\\x9f\\x77\\x43\\xb0\\xb1\\x61\\x49\\x16\\x83\\x22\\x17\\xc5\\x7e\\xee\\x1b\\x4f\\x8e\\x62\\x2a\\xc0\\x52\\xa9\\x3d\\xd5\\xb3\\x9d\\x07\\x61\\xe4\\x0e\\x9f\\xbd\\x83\\x96\\xf6\\x0a\\x3b\\xf6\\x66\\x0c\\x5f\\xa9\\x9c\\xd8\\x13\\x9f\\x68\\xcb\\xe0\\x89\\x4e\\x5c\\x67\\xe1\\x68\\xcc\\x74\\xb2\\x72\\x4e\\x9d\\x91\\xd6\\x00\\x0a\\x0c\\xec\\x58\\x7a\\x11\\x46\\x3f\\x72\\xee\\x6e\\xd2\\x55\\xbd\\x87\\xeb\\x30\\xfd\\x45\\x75\\x96\\xf6\\x88\\xca\\x0e\\xa7\\x3f\\x30\\x49\\x72\\x38\\xde\\x21\\xc9\\x3f\\xbb\\x12\\x94\\xdb\\x61\\xe4\\xa5\\x60\\x89\\x10\\x6d\\x1c\\xf7\\xce\\x5a\\x65\\xec\\x3d\\x12\\x17\\x0c\\xe7\\x84\\x0f\\x08\\x8a\\x8d\\x0e\\x3a\\xef\\x17\\xe5\\x31\\xde\\x47\\x80\\x03\\x57\\x02\\x58\\xe9\\x27\\xf1\\x56\\xe7\\x96\\x10\\x65\\xaf\\xa6\\x66\\xaf\\x38\\x58\\x2b\\x35\\x3c\\xc4\\x77\\xba\\x77\\x5c\\xae\\x45\\x94\\x6d\\x08\\xdb\\x75\\x21\\x59\\x14\\xda\\x32\\x61\\xb6\\x22\\x94\\xe9\\x2a\\xfb\\x38\\x14\\x59\\xc2\\x1d\\xda\\x4e\\xa6\\xed\\x79\\x5f\\x79\\x25\\x7c\\x09\\x4d\\xd6\\x08\\xdc\\x8e\\x1b\\x7c\\x40\\xcd\\x29\\xfe\\xa2\\x22\\x08\\x8f\\x65\\x69\\x7e\\xa8\\x88\\x95\\xd1\\x0a\\xce\\xa8\\x79\\x73\\x60\\xdc\\xba\\xce\\xe2\\x69\\xc6\\x06\\x60\\x0a\\xdf\\xfd\\xcf\\x9c\\x7c\\x38\\x1d\\x0a\\xd6\\x69\\x69\\x67\\xd9\\xff\\x03\\xe6\\x1a\\x24\\x90\\x65\\x02\\xb2\\x95\\xe7\\x6f\\x4d\\x08\\x75\\x65\\x5b\\x01\\xe6\\xff\\xca\\xcc\\x8e\\xf0\\x11\\x29\\xc7\\x2a\\x58\\x46\\xb6\\x0e\\xc8\\x00\\x17\\x37\\x4e\\x75\\xd3\\x06\\x40\\x3d\\x9e\\xcc\\xf2\\x64\\x95\\xd2\\x98\\x12\\x0a\\x06\\x33\\x83\\x5c\\x5d\\x1e\\xff\\x17\\xc9\\xc6\\x24\\x76\\xf7\\x52\\xc8\\x97\\x10\\xad\\xfa\\x4d\\x51\\x61\\x7b\\x59\\x18\\x17\\x3c\\xba\\x72\\x25\\x40\\xe3\\x88\\xff\\xbf\\xfb\\x96\\x68\\x74\\xdb\\x00\\x40\\x4d\\x06\\xb0\\xce\\x11\\x39\\xba\\x74\\x14\\x3c\\x76\\xb8\\xf4\\xd3\\x3b\\x21\\x16\\xe1\\xcc\\xe1\\x75\\x17\\x3a\\x96\\xfc\\x15\\x1e\\xa2\\x39\\xbf\\xc2\\x0d\\x66\\xfb\\xb6\\xf5\\x2a\\x66\\x6c\\x0e\\x81\\xcc\\x2b\\x80\\x20\\x91\\x06\\xe2\\x48\\x0e\\x41\\x11\\xc7\\x0e\\x7b\\xe4\\xaa\\xbb\\x68\\x42\\x2f\\x0b\\x8c\\x6b\\xa1\\x5c\\x14\\x2f\\x82\\xe6\\xc7\\xf3\\x78\\xd7\\x80\\x0a\\x09\\xea\\xa4\\xda\\x25\\x3c\\x2f\\xd9\\x1e\\x12\\x63\\xc6\\xb6\\x55\\xbf\\x70\\x25\\x5d\\x7e\\x3b\\xb4\\x77\\x55\\x23\\xa0\\xa9\\xe7\\xff\\x03\\x79\\x7e\\xe3\\xff\\xca\\x8a\\x50\\xd1\\x0f\\x20\\xd5\\xe5\\xa8\\x89\\xec\\x5e\\x33\\x4e\\xf2\\x6c\\xf7\\x99\\x8b\\x08\\x36\\xf6\\x56\\x45\\x68\\x88\\xe1\\x37\\xf3\\x9d\\x3e\\x43\\xe2\\xce\\x3c\\x6e\\xf5\\x40\\xd9\\x5d\\x9a\\x20\\xc4\\x2c\\xb8\\xae\\x2d\\x9d\\x0f\\x25\\xa8\\x91\\xc3\\x63\\xea\\xd9\\xcc\\x42\\x3f\\x9a\\x32\\x3f\\xe2\\x32\\x28\\x1f\\xb6\\x7f\\x5b\\xe1\\xc0\\x78\\x43\\x61\\x46\\x04\\x68\\xa8\\x7e\\x95\\xdf\\xa3\\x5d\\x7f\\x0f\\xfa\\x22\\x11\\xbe\\x6b\\x5f\\xb3\\x2d\\x42\\xba\\x65\\x18\\xab\\x6e\\xa9\\x37\\x80\\xf4\\x31\\xd3\\x00\\x67\\x31\\xbe\\x44\\x40\\xe7\\x12\\x97\\x4f\\x74\\xba\\xea\\x41\\x9f\\x40\\x22\\xfa\\x25\\x02\\xe1\\xb2\\x39\\x8e\\x93\\x86\\x16\\x7d\\x93\\xec\\xa9\\x2c\\xa6\\x0d\\xd7\\xd9\\x1f\\xe8\\x23\\x24\\xf6\\x82\\xd9\\x4a\\xa7\\xa8\\x6a\\xb0\\x34\\xf8\\xa9\\xe9\\x52\\xe8\\xfc\\x95\\xbf\\xf4\\xdf\\xed\\x6a\\x43\\x31\\x3a\\xbb\\x92\\x40\\x1b\\x30\\xc3\\x3c\\x79\\xa7\\xba\\x3e\\xfd\\xbe\\x16\\x28\\x04\\x0f\\xba\\xf4\\x43\\xf3\\xf9\\x80\\x84\\x6f\\xdb\\x28\\x3d\\xcc\\xd9\\x3f\\xab\\x09\\x70\\x8b\\x7d\\x54\\x86\\x1d\\x74\\xb1\\xfe\\x8f\\x10\\x70\\x1f\\x21\\x1b\\xa3\\xd3\\x90\\xe8\\xa6\\xae\\x40\\x77\\x39\\x64\\x6a\\x79\\xa5\\x83\\x37\\xa7\\x17\\xa8\\x72\\x00\\x9c\\x2d\\xf6\\x76\\x1c\\x24\\x25\\xa3\\x2a\\x00\\x18\\xaa\\xf9\\x64\\x64\\x70\\xcb\\xc8\\x7c\\x3a\\x65\\xc0\\xe0\\xef\\xfb\\xaa\\x52\\x8f\\xe4\\x78\\x3c\\x77\\x2a\\xb2\\x66\\xb8\\xf2\\x82\\x68\\xcf\\x14\\xaf\\x23\\x4b\\x15\\x81\\x6d\\x1a\\x3a\\x49\\x1a\\xf5\\xf2\\x97\\xe3\\x3d\\x57\\x29\\x71\\x5d\\x51\\x2c\\x37\\x3f\\xef\\x5e\\xcc\\x3f\\x39\\x54\\xa6\\x0a\\x2a\\x0f\\x64\\xd8\\x29\\x47\\x41\\x19\\xca\\x1a\\x18\\xf1\\x05\\x78\\xd0\\x4d\\x63\\x8d\\x5e\\xea\\xfc\\x37\\x1a\\x94\\x6f\\x6c\\xe7\\xef\\xbd\\x2a\\xcc\\xe3\\x4e\\x20\\x44\\x1c\\xde\\x9a\\x37\\xd5\\xa8\\x7d\\xc6\\x19\\xb0\\xa7\\x27\\x59\\x6c\\xd1\\x2e\\x15\\xcd\\x97\\x84\\xbb\\x91\\xf1\\x39\\x9a\\x59\\xfc\\x0a\\x7a\\x4a\\xf6\\x8b\\x0d\\x57\\x5d\\x93\\x38\\x71\\x72\\x97\\x33\\x75\\xc4\\x65\\xdf\\x5d\\x2d\\x5e\\x06\\x1a\\x2a\\x9b\\x23\\xb4\\x91\\x5a\\x0a\\x8b\\x8c\\x1f\\x09\\x42\\x09\\x4a\\xf7\\x28\\xc8\\xc3\\x11\\x45\\xfa\\x7a\\xaf\\x74\\xa2\\x1a\\x3b\\x03\\x2b\\xb0\\x9c\\x39\\x22\\x05\\xbf\\x09\\x5b\\xda\\x98\\x6e\\x5d\\xd6\\x62\\x7c\\x1e\\x41\\x7f\\x65\\x03\\x26\\xdf\\xe3\\xa9\\xc9\\x99\\x4c\\x6e\\x0e\\x01\\x27\\x6f\\x91\\xf2\\x98\\x7d\\x2b\\x85\\xde\\xda\\x96\\x54\\x91\"},\n{{0x5a,0x86,0x8f,0xb7,0x5e,0xa0,0x72,0x1f,0x7e,0x86,0xc7,0xbc,0x10,0x6d,0x74,0x13,0xc8,0xcf,0x4d,0x03,0x3c,0xe1,0x40,0x05,0xdf,0x23,0xce,0x4c,0x15,0x5b,0xbd,0x27,},{0x6d,0x1e,0x29,0xf3,0x9d,0xed,0xa2,0xbb,0xfb,0xb5,0x7c,0xb0,0x1c,0xb3,0x9e,0x58,0x80,0x82,0x78,0xe5,0x19,0x6a,0xda,0x1c,0x02,0x76,0x46,0xf2,0x04,0x87,0xd2,0x52,},{0x38,0xc4,0x8d,0xba,0x99,0xa6,0x52,0x4a,0x18,0x8d,0x5c,0xd7,0x8a,0x98,0xe6,0x77,0xdd,0x26,0x3e,0xf6,0xb4,0xdf,0x44,0x6b,0x31,0x0b,0x3d,0xd8,0x9c,0xaf,0xdd,0xb9,0xb1,0x7a,0x65,0xbb,0xa8,0xe1,0x39,0x68,0xbd,0xc2,0x5b,0x1d,0x84,0xb6,0xe2,0x43,0x6e,0xdf,0x31,0xaa,0x75,0x6e,0x3a,0x48,0x72,0x6d,0x6f,0x91,0xc8,0x08,0xee,0x0e,},\"\\xd5\\xaa\\x11\\x82\\x5b\\x99\\x44\\x8c\\x80\\x63\\x06\\x23\\xd8\\xc7\\x46\\x01\\x7c\\xfe\\x3d\\xe6\\xfa\\x8a\\x0c\\x6e\\xd6\\x62\\x71\\x27\\xcf\\xc1\\xf8\\x4d\\x4e\\x0a\\x54\\xe6\\xa7\\xd9\\x08\\xd3\\x71\\x9f\\x14\\x21\\xd1\\xd4\\xc7\\x8b\\x3c\\xdd\\x94\\x76\\x9a\\xb6\\x03\\x3b\\xce\\x97\\x9d\\xd9\\x0e\\x10\\x68\\x02\\xeb\\xa9\\xa0\\x32\\x95\\xd4\\x8f\\x9b\\x9a\\x95\\xd5\\x7e\\xe7\\x74\\x54\\x02\\xa4\\x80\\x23\\xbf\\x3b\\xdd\\xd5\\xc6\\xb9\\x1c\\x77\\x3e\\x49\\x19\\x13\\xa3\\x8a\\xc3\\x46\\x26\\x05\\xcf\\x28\\x2d\\xea\\xc7\\x57\\x42\\xfb\\xd2\\x75\\x29\\x27\\x6e\\x81\\xdc\\xce\\x8d\\xff\\x96\\x05\\x03\\x5e\\x8c\\xf0\\x5d\\xf6\\xa4\\x3d\\xb1\\x51\\xf0\\x41\\x57\\x65\\xbc\\xbd\\x1f\\x1b\\xb6\\x68\\xad\\x62\\x73\\xb8\\x91\\xc0\\xdc\\x4f\\x3d\\xba\\x59\\x0e\\xa8\\x2f\\x83\\x63\\x76\\x9b\\x9c\\x77\\x51\\x19\\x47\\x11\\x73\\x75\\xdc\\x49\\x04\\xd4\\x8b\\x88\\xb6\\x8a\\x25\\x5b\\x28\\x01\\x1b\\x11\\x04\\x81\\x94\\x09\\x3e\\x98\\x20\\x7a\\xb1\\xcf\\x75\\x6a\\xb8\\x33\\x1f\\x8d\\x6f\\x9d\\x5b\\xe2\\xe1\\x19\\x05\\x73\\xe9\\x5e\\x71\\x0f\\x2a\\x35\\x01\\xb5\\x3a\\xa0\\x82\\x5d\\x6c\\x12\\xdc\\xfb\\x94\\xac\\x80\\xdc\\x10\\x82\\xcb\\x4a\\xd2\\x62\\xe6\\xd4\\x93\\xad\\xce\\xb6\\xbc\\x19\\x14\\x5f\\xbf\\x73\\x8d\\xf7\\x6f\\x21\\x34\\xfa\\x04\\xcb\\xbe\\x44\\xff\\xc5\\x5f\\xfe\\x5f\\x9d\\x3e\\x9b\\xeb\\xd1\\x59\\xa0\\x01\\xaa\\x9b\\xf7\\x88\\x92\\xa1\\x65\\x38\\xa5\\x20\\x82\\x3c\\xde\\x5d\\x61\\xe2\\x9a\\x56\\xa7\\x7a\\xb9\\x6e\\x49\\xe3\\x00\\xd9\\x86\\x59\\x62\\xc7\\xe7\\xfb\\x8b\\xcf\\x5d\\xe0\\xb9\\x38\\x29\\x7c\\x3f\\x4d\\x6f\\x60\\x21\\xe2\\x4d\\xfd\\xad\\x98\\x61\\x65\\x2f\\x34\\x0f\\x42\\x1e\\x7a\\xf2\\xc7\\x1e\\xd9\\xa7\\x15\\x87\\xfc\\x75\\x3b\\x11\\x55\\x49\\xb2\\xf7\\xf7\\xcb\\x29\\x69\\x0e\\xa2\\xb1\\x58\\xa9\\x4c\\xd2\\xbc\\x42\\xe7\\x06\\x3d\\x61\\x9b\\x93\\x9d\\x52\\x3e\\x3c\\x23\\x7e\\xb1\\xf4\\x08\\x10\\xde\\x0b\\x44\\xaa\\x69\\x37\\x86\\x3d\\x62\\x9e\\xdd\\x55\\x75\\xe6\\xc0\\x47\\x52\\x61\\xb6\\x27\\x47\\x30\\x92\\x77\\x5c\\x84\\x36\\x00\\x11\\xd5\\x7c\\x57\\x20\\x9c\\x2e\\x87\\x5a\\x3f\\x89\\x63\\xe8\\xb2\\x41\\xa7\\xaa\\x75\\xef\\x30\\xc4\\xa7\\x18\\xac\\x4d\\xd4\\x66\\xdc\\x7a\\x3e\\x40\\xe5\\x87\\x4f\\x15\\x7a\\x84\\x9e\\xd3\\xa3\\xa9\\xd4\\xae\\xb7\\xd9\\x4d\\xf0\\x9b\\xb5\\x5a\\x0b\\x2b\\xc9\\xf8\\xb6\\x95\\xc3\\x71\\x79\\x30\\x23\\x67\\x60\\x63\\x67\\xc5\\xf3\\x24\\x82\\x8c\\xe7\\x5a\\x94\\x4f\\x50\\x70\\x3a\\x47\\x90\\x6a\\x80\\x88\\xf3\\xa1\\x1c\\xfe\\x4a\\x85\\x4e\\x01\\xf1\\x74\\x12\\x52\\xc4\\x86\\x33\\x7d\\x06\\xb1\\xcc\\x6c\\x6b\\x9b\\x12\\x95\\x43\\x1e\\xe0\\x73\\x59\\x35\\x7b\\x3a\\x78\\xef\\x50\\x75\\xb6\\x5d\\x7f\\xed\\x5e\\xb7\\x42\\xe5\\x10\\x15\\x98\\x44\\x4b\\x46\\x62\\x3f\\x89\\xa3\\x03\\xac\\xc1\\x0c\\x73\\x24\\x49\\x51\\x3b\\x70\\xdc\\x45\\x6a\\x79\\xd3\\x7c\\x48\\xe5\\xe7\\x26\\xc2\\xf5\\x58\\xda\\x0a\\x1c\\x46\\xef\\xbd\\x2d\\x92\\x03\\x26\\xa6\\x78\\xb8\\xa2\\x2f\\x09\\x44\\xbe\\x4a\\xf5\\x5b\\x6c\\x71\\xf4\\x53\\xfb\\xae\\x40\\x0e\\x6a\\xcc\\x04\\xe0\\xe9\\x5c\\xa2\\x00\\x16\\x7e\\x96\\xee\\x98\\xea\\x83\\x93\\x16\\xda\\x93\\xa1\\x2c\\x2d\\x76\\xf1\\x1a\\xee\\xbe\\xb7\\x8e\\x65\\xea\\x48\\xf7\\xfe\\xeb\\xbb\\x13\\x7b\\x2a\\xc6\\x7e\\xae\\xf0\\x2a\\x2d\\x9e\\x64\\x71\\xdd\\x63\\x4a\\x03\\x7d\\x4f\\x5d\\x35\\xa2\\xf7\\x8a\\xf4\\x1a\\x8e\\xa5\\xaf\\x5b\\xc8\\x15\\x0a\\x99\\xed\\x68\\xa6\\xa0\\xcc\\xff\\x2b\\x1d\\x79\\x65\\xd8\\xbc\\x3e\\xf9\\x28\\x5b\\xa6\\x42\\x1d\\x87\\xc3\\x3a\\xad\\x81\\x03\\xa5\\x87\\xbe\\x01\\x92\\x68\\x45\\xbf\\xbd\\xdb\\xaf\\xc6\\x9c\\x4b\\x92\\x52\\x88\\x67\\x20\\xd4\\x18\\x50\\x9f\\x40\\xf3\\xdc\\xf5\\x57\\x65\\xdc\\xcc\\x3d\\xee\\xd8\\x27\\x72\\x15\\xe6\\x9f\\x05\\x6b\\xa3\\x1b\\x8a\\x30\\xb5\\x00\\x94\\xea\\x8f\\x14\\x47\\x20\\x76\\x0c\\x8f\\x8c\\x05\\x5c\\xf1\\xa8\\x69\\x64\\xff\\xcb\\xb8\\xee\\x1b\\xb2\\x18\\x12\\x76\\xea\\x99\\xa7\\xb8\\xe7\\x10\\x67\\xfa\\x31\\x0b\\xa4\\x47\\x1e\\x84\\x27\\x90\\x37\\xbc\\x49\\x2a\\x55\\xde\\x20\\x55\\x48\\xe7\\x7b\\x01\\x45\\x04\\xee\\x66\\x64\\xc4\\x98\\x8c\\xbb\\x9e\\xd9\\x1f\\xf3\\x2e\\x22\\x59\\xed\\x4c\\xfd\\x61\\xa1\\x97\\xd0\\xdb\\xc3\\x2c\\x68\\xf6\\x54\\x9c\\x0d\\x29\\xfc\\x45\\xf3\\x6a\\xcb\\x26\\xb1\\x64\\xde\\x97\\xcc\\xdc\\x37\\x90\\x0d\\x93\\xcd\\xbc\\xf9\\x68\\x7e\\xf5\\x3f\\x1f\\x4d\\xa1\\xb1\\xae\\x42\\x25\\xb8\\x84\\x20\\x9e\\x81\\xba\\x43\\x11\\x52\\x04\\x77\\xed\\x42\\x11\\xb0\\x92\\x40\\xbd\\x7b\\x82\\x5e\\x54\\x73\\x9f\\xe2\\x5d\\x86\\x24\\xaf\\x04\\xb8\\x6f\\x6d\\x11\\x06\\xd1\\x81\\x70\\xe5\\x06\\x4d\\x1a\\x73\\xc1\\xfb\\x1a\\x27\\xb2\\x89\\xa9\\x48\\xd7\\x71\\xa2\\xf6\\xb8\\xb0\\x9a\\x63\\x5d\\xb9\\x6c\\x62\\x51\\xc3\\x5a\\x18\\x76\\xd3\\x69\\x62\\x66\\x99\\x41\\x6c\\x0e\\x40\\x29\\x8a\\x68\\x1f\\xda\\xf5\\x25\\x5f\\x58\\xc2\\x55\\x77\\x59\\xd8\\xf5\\xdf\\x14\\x8d\\xec\\x9d\\xbe\\x1c\\xe6\\xdf\\x04\\x1c\\x36\\xf8\\x3e\\x69\\xcc\\xfb\\x4a\\xac\\xa5\\xcb\\x48\\xfa\\x6a\\x85\\xc8\\xff\\x66\\x06\\x15\\x24\\xd8\\xb1\\x1b\\xd7\\xff\\xae\\xd9\\x9d\\x0c\\xd4\\x5c\\x42\\x01\\x0f\\x21\\xd3\\x6c\\xc3\\x16\\xca\\x86\\x09\\x55\\x63\\x5b\\xff\\xaa\\x7d\\x9a\\xac\\x57\\x2d\\xcc\\xf3\\x15\\x3d\\x42\\xee\\x8a\\x2b\\x12\\xba\\xa5\\x7c\\x16\\x0b\\xd0\\xad\"},\n{{0xc5,0x4b,0xd3,0x43,0x1f,0x26,0x59,0x28,0x1d,0x31,0xe9,0x3b,0x30,0x78,0x76,0x68,0xbc,0xba,0x6e,0x5e,0xe4,0x7d,0xb4,0x6e,0x50,0xde,0xab,0xe3,0xf4,0x8c,0x9e,0xd8,},{0x1e,0xba,0x6e,0xb3,0xf7,0xf2,0x4c,0xdf,0x80,0xab,0xf8,0xa1,0x9d,0x30,0x8c,0x24,0xf1,0xe2,0x5b,0xa1,0x59,0x70,0xed,0xa7,0x11,0x67,0x07,0xb0,0xf1,0x2c,0xf9,0x32,},{0xdf,0x45,0x41,0xdf,0xf1,0xa9,0x79,0x7f,0xeb,0x61,0x7f,0x98,0xe4,0xb5,0x7a,0xa7,0x71,0x41,0x31,0xee,0x8f,0xf5,0x45,0xed,0x50,0x82,0xe3,0x56,0x8e,0xfd,0x1c,0x39,0x9c,0xdc,0x56,0xf5,0x58,0x29,0x91,0xeb,0x87,0x85,0xfb,0x33,0x86,0x4e,0xef,0x7f,0x55,0x3f,0x3e,0x24,0x82,0x62,0xed,0x54,0x8a,0x1a,0x68,0x88,0xf9,0x2e,0x92,0x0e,},\"\\x6f\\x8c\\xdd\\x75\\xe1\\xb8\\x56\\xbb\\xbe\\x9c\\xdc\\x25\\x53\\x7f\\xdf\\x7e\\x82\\x36\\xcb\\x02\\x9a\\xcd\\x39\\x84\\x49\\x21\\x10\\xd0\\xc3\\x04\\x41\\xd4\\x21\\x84\\xb5\\xfb\\x18\\x3d\\xa9\\xf3\\x14\\x03\\x78\\xdf\\xa7\\xd7\\x4c\\xcc\\x9e\\xf5\\x00\\x19\\x3c\\xc9\\x57\\x9f\\xff\\xa6\\x0b\\xd2\\xa8\\xab\\x9e\\x09\\x58\\x15\\x00\\xcf\\x06\\xcd\\x35\\xab\\xc1\\x71\\xd9\\xd1\\x2c\\x65\\x80\\xd9\\x68\\x2f\\x9f\\x49\\xfe\\x36\\xd0\\xa3\\x17\\x72\\x38\\xfa\\x50\\xe7\\xeb\\x4c\\x27\\xe4\\x60\\xf5\\xe4\\x58\\x0a\\x56\\x56\\x8a\\x19\\xe0\\x3d\\x95\\xb0\\xff\\x4f\\x4a\\x23\\x18\\x24\\xcd\\x2f\\x34\\x42\\xe0\\xba\\x40\\x0b\\xc1\\x1b\\x7a\\x98\\x9d\\x50\\x1f\\x5d\\xf3\\x5e\\x43\\x01\\x50\\x8f\\x72\\xa8\\x52\\x01\\x4b\\xfb\\xf4\\x00\\x1e\\x28\\x09\\x54\\x73\\xd9\\x65\\x9e\\xed\\x60\\x67\\xba\\xf6\\x8f\\x92\\xbe\\xf3\\x12\\xc0\\x9b\\x19\\xaa\\xf7\\xc4\\xfb\\xa3\\xd9\\x02\\xb9\\xf6\\xcf\\x95\\x2e\\xb9\\xb9\\xa5\\x3c\\xa8\\xbc\\xbd\\x04\\x2d\\x84\\x2e\\x98\\x53\\xb6\\x72\\xa1\\xd0\\x09\\xd8\\x23\\x83\\x8b\\xeb\\xe5\\x63\\x7c\\x4c\\x07\\xed\\x1b\\x19\\x48\\x55\\x4b\\x23\\xb3\\x2d\\xe1\\xd6\\xc1\\x16\\xf9\\x33\\xb3\\x54\\xf2\\x8b\\xbb\\x77\\x9f\\xa6\\x54\\x8c\\x48\\x29\\x2b\\x61\\x2c\\x7f\\x55\\x1a\\x75\\xfb\\xc4\\x6c\\x02\\x73\\x6b\\xf9\\x9e\\x9c\\x8e\\xad\\x56\\xf0\\x5a\\xb0\\x42\\x7a\\x6e\\xc6\\x16\\xe3\\xdc\\xc7\\x75\\x7e\\xfd\\xb7\\x62\\x8d\\x4e\\x96\\x32\\x5f\\xe0\\xae\\x25\\x4c\\xef\\x5c\\xb7\\xa7\\x04\\xb3\\x5a\\x92\\x0c\\xb3\\xfa\\x2a\\x03\\xe9\\x61\\xda\\xf3\\x71\\x82\\x1b\\xe0\\xb3\\x0f\\x19\\xae\\x49\\x52\\x44\\x1e\\x08\\xa7\\xd2\\x2f\\x54\\x31\\x39\\x0a\\x5b\\xe8\\x09\\x7f\\xd5\\x79\\x7a\\x1a\\x62\\x97\\x66\\x4d\\xa4\\x2c\\x20\\x08\\xd0\\x32\\x10\\x60\\xeb\\xe3\\x18\\x1e\\xb7\\x95\\xa7\\x28\\x92\\x58\\x08\\xda\\x78\\x67\\x29\\x3b\\x72\\x08\\xf3\\x77\\xd3\\xa7\\x71\\x18\\x5e\\x6d\\x2c\\x1c\\x8c\\xe1\\x83\\x76\\xfe\\x3c\\x0c\\x14\\x58\\xc7\\xf5\\xbe\\x34\\xf4\\x28\\xa0\\xd5\\x75\\x93\\x10\\x74\\xc9\\x7c\\xbf\\xce\\x8a\\xd8\\x13\\x13\\xec\\xca\\x73\\xa9\\xf3\\xdb\\x43\\x4f\\xba\\xd4\\xbb\\xbf\\xf5\\x02\\xbf\\x72\\x97\\xe1\\x7a\\x97\\xa8\\x86\\x42\\x11\\xe6\\x78\\x9b\\xa1\\x92\\x03\\x6e\\xa5\\x9a\\x34\\xd8\\x4f\\xf2\\xa1\\x11\\x07\\x4c\\x3f\\x23\\x73\\xb1\\x01\\x11\\xb5\\xda\\xa7\\x89\\x56\\x0c\\xb3\\x54\\x90\\x95\\x4c\\x88\\xea\\x00\\xc4\\x10\\xdf\\x85\\x0a\\xd0\\x0c\\xae\\x2f\\x28\\xe7\\x19\\xfb\\x06\\x71\\x69\\x88\\xa9\\xbb\\x0b\\xfc\\x6c\\x98\\x9d\\x58\\x7e\\x56\\x85\\xae\\x88\\x3c\\x2c\\x2e\\x74\\xdd\\xbf\\x91\\x5c\\x98\\x56\\xaa\\xe8\\xf3\\x28\\x8f\\xc6\\x25\\xbf\\xb2\\xfe\\x26\\x8d\\x74\\xf5\\x9f\\x8b\\x7d\\x83\\x63\\x74\\x97\\x69\\x16\\x90\\x07\\xd5\\xe6\\x7b\\x7d\\x0b\\x8c\\x8f\\x5a\\x9d\\x9f\\x9c\\x7b\\x74\\x5c\\x0a\\x42\\x94\\x76\\x2c\\xbe\\xca\\x42\\xd5\\x38\\x49\\x61\\xe9\\x21\\xa7\\xef\\xb6\\x5d\\xa8\\xd1\\xe0\\x3b\\x67\\x45\\xcd\\xf3\\x08\\x09\\x7f\\xb1\\x3d\\x64\\xfd\\x2f\\x8c\\x10\\xfa\\x95\\x09\\xeb\\x2d\\x91\\x38\\x7f\\x00\\x64\\x5c\\xa7\\xd0\\x48\\x3b\\x2c\\xd1\\x4c\\x20\\x6b\\x8d\\x7a\\xe0\\xa3\\xfb\\x7c\\x09\\xbc\\x68\\x43\\xd1\\x02\\xad\\xcd\\xa1\\x9f\\x8b\\xbd\\x85\\x1e\\xb6\\x83\\xc4\\x43\\x5c\\xeb\\x4b\\x3d\\x23\\xd3\\x8f\\x56\\xd4\\xd1\\x11\\x4e\\xef\\x0f\\xc6\\xf2\\x4d\\xf5\\x27\\x70\\xd8\\xf1\\xf3\\xf8\\x2f\\x47\\x20\\xe8\\x92\\xb3\\x15\\x24\\x4e\\xf5\\x6c\\x36\\xb2\\x3f\\xcd\\x40\\x79\\x78\\x52\\x41\\x40\\x38\\x2e\\x11\\x74\\x0f\\xd4\\x6f\\xe4\\x29\\x99\\x23\\xf5\\x2b\\x88\\xb4\\xa9\\xcf\\xf4\\xb2\\xb4\\xb2\\x3a\\x2e\\x76\\x0a\\xd8\\x1c\\x78\\xba\\x87\\x69\\x31\\xd9\\xaa\\xa4\\xbe\\xed\\x40\\xfb\\x10\\xa7\\x99\\xeb\\x30\\xd3\\x7f\\x75\\x47\\x78\\xba\\xc8\\x5b\\xf0\\x63\\x1d\\x85\\x2b\\xe7\\xd7\\x4a\\x64\\x31\\xf3\\x84\\xa4\\x02\\x5c\\x10\\x91\\x42\\x1d\\x67\\xa4\\xe9\\xc9\\x4c\\x1b\\xe3\\x69\\x0c\\x6b\\xf8\\x1d\\x06\\xbd\\xaf\\x32\\xfe\\xab\\xba\\xf1\\xdc\\x26\\x3f\\x27\\x3a\\x0b\\x9e\\xd6\\x54\\x60\\xba\\xef\\xce\\xfc\\xf6\\xac\\xcc\\xda\\x0e\\xdd\\x23\\xdf\\x9e\\x05\\x12\\x8e\\x29\\xd6\\x61\\xc4\\xb4\\x4b\\xd9\\x2d\\x64\\x0f\\xaa\\x85\\x3a\\xfd\\x83\\x70\\xe5\\x63\\xb4\\x0a\\xe0\\x14\\x9a\\x14\\x28\\xe0\\x6e\\x3d\\xd8\\xe6\\x6b\\x79\\xda\\x21\\xcc\\x75\\x3d\\xdc\\x47\\x6e\\x3d\\x76\\xe2\\xf3\\x6f\\x2b\\x6c\\x6b\\xc1\\xb6\\x50\\x87\\xd5\\xf8\\x6c\\x8a\\xc3\\x54\\x71\\x1a\\x8c\\x08\\xf3\\x48\\x6e\\x47\\x9d\\x6a\\xe9\\x43\\xf8\\x84\\x63\\x32\\xd4\\xe5\\xb4\\xbb\\x2e\\x82\\x57\\xe3\\x08\\x3d\\xf4\\xf8\\x1d\\xd4\\xf0\\xc1\\xee\\x1d\\x97\\x18\\x21\\x66\\x16\\x1a\\x18\\x59\\x7e\\xe0\\xb9\\x59\\xde\\x1c\\x45\\x59\\x1a\\xbf\\x7c\\x51\\x03\\x3d\\x7c\\x66\\x35\\x2d\\xee\\xb6\\x82\\xe7\\x77\\xae\\xae\\x2f\\xa8\\xd3\\xa7\\x7f\\x47\\x0d\\xb7\\x8d\\xdc\\x1b\\x1f\\xc8\\x28\\x40\\xc4\\x06\\x57\\x76\\xd9\\xbf\\xca\\x9d\\x39\\x2d\\x92\\x88\\xee\\x91\\x32\\xaa\\x3e\\x4f\\x2d\\x19\\xd0\\xd9\\x3e\\x01\\xb6\\x66\\xf3\\x64\\x7a\\xba\\xf2\\x25\\xc2\\x92\\x41\\x9c\\x8a\\x82\\xeb\\xa3\\xe1\\x1a\\xb1\\x03\\x84\\x6f\\xcd\\x49\\x35\\xf4\\x12\\x41\\x47\\x7c\\x0f\\x15\\x2b\\x79\\x65\\xad\\x54\\xbb\\x72\\xbc\\x3d\\xe2\\xe0\\xb7\\x9d\\x62\\x25\\xe8\\xfa\\x7a\\x62\\x86\\xb5\\xfc\\xcb\\xb3\\x58\\x22\\xe8\\x0c\\x8b\\xfe\\xa7\\x4c\\xb4\\x8a\\x22\\xd2\\x41\\x38\\x53\\x95\\xc2\"},\n{{0xea,0x60,0xda,0x01,0x79,0xbc,0xaf,0x6b,0x21,0x81,0x42,0xb1,0x11,0x90,0x46,0xff,0xe6,0xd8,0x5a,0x74,0x1b,0x0d,0x16,0x62,0x30,0xbc,0x6d,0xe3,0x30,0x4f,0x67,0x73,},{0x50,0x6b,0x2e,0xbb,0x49,0xbd,0x9b,0x9f,0xf6,0x6e,0x6b,0x7b,0x1f,0xab,0x96,0x68,0xcb,0x18,0x1b,0x4f,0xb5,0xe4,0x34,0x3d,0xdd,0xd3,0xf8,0xa9,0xd7,0x02,0x03,0x1c,},{0x27,0xfb,0x6b,0x5f,0x06,0x52,0x8a,0x64,0x19,0x8a,0x3e,0x7d,0x67,0xc7,0x38,0x84,0x0a,0x8c,0xff,0x4b,0x48,0x2b,0x4d,0x52,0x4b,0x12,0x2d,0x17,0xd2,0xae,0xbc,0xc0,0x38,0x9b,0xe2,0xc6,0xe2,0x8e,0x2c,0xdf,0xc4,0x84,0xc1,0x8d,0xe4,0x25,0xdb,0x56,0xcd,0xfa,0x56,0x1c,0x50,0x7c,0xd9,0x70,0x60,0x2d,0x3a,0x38,0x5d,0x3a,0xea,0x0f,},\"\\x61\\x2d\\x6e\\xf6\\xe4\\x34\\x9f\\xfa\\xe5\\x16\\xe9\\x83\\xe8\\xfa\\x7b\\x52\\xd9\\xfd\\x13\\x42\\x82\\x24\\x0d\\x95\\x14\\x38\\x24\\xbd\\x4a\\xae\\x03\\x23\\x4b\\x76\\xa8\\xcd\\x6d\\x40\\x68\\xcf\\x00\\x9e\\x48\\x1c\\x26\\x85\\x36\\x1c\\x75\\x50\\x42\\xc4\\xe6\\xab\\x87\\x03\\xec\\xbf\\x8f\\x02\\x0c\\xf5\\x73\\x9a\\x4c\\x2a\\x03\\xc3\\x73\\x1e\\x9c\\xf7\\x5a\\xee\\x25\\x96\\x61\\x53\\xb9\\x71\\x15\\x15\\xc6\\xc3\\x9a\\xfa\\x95\\xf2\\x21\\xac\\x33\\x95\\xb0\\x89\\xc9\\x7a\\xc9\\xb5\\x14\\xe1\\x7d\\x55\\xf7\\x96\\xa3\\xec\\xc1\\x35\\xfa\\xaa\\xee\\x90\\x7a\\xab\\x10\\x29\\x64\\x7b\\x48\\xac\\x81\\x74\\x9b\\xab\\x26\\x62\\x7c\\xf7\\x09\\x5d\\x74\\xc2\\xfc\\xee\\x35\\x67\\x1c\\x8b\\xb4\\x60\\x53\\xf5\\x15\\x1b\\x0c\\x2e\\x5d\\xab\\xe0\\xf2\\xd6\\xaa\\x20\\x41\\x33\\x05\\x02\\x0b\\x2a\\xfd\\x9e\\xe3\\x38\\x7b\\x2c\\x9e\\xd0\\xbc\\x3f\\xe2\\x90\\x2a\\xf4\\x10\\x0c\\xec\\x23\\x32\\x7b\\x0f\\x1e\\x4c\\xa3\\x9e\\xf6\\xea\\xf6\\xfd\\xf5\\xd5\\xac\\xf9\\x3f\\xc8\\x68\\x53\\x6d\\x8c\\xba\\x40\\x17\\x69\\x32\\x9f\\xbe\\x93\\xef\\xfc\\x7e\\xe6\\xbf\\x93\\xa6\\xe5\\x88\\xbd\\x55\\x1e\\xaa\\x51\\x28\\x53\\x95\\x2c\\x81\\xb2\\x45\\xe5\\xd2\\x29\\xd2\\x94\\xe4\\x13\\x70\\xb8\\x67\\x80\\x86\\x67\\x88\\x7a\\x6f\\x9e\\xba\\x2a\\x8d\\x56\\xa7\\xa7\\x04\\xe6\\x6b\\x1c\\x02\\xf9\\x6e\\x73\\x89\\x5f\\x48\\x3e\\x44\\xa5\\xc5\\x66\\xcb\\x1a\\xf2\\x65\\x73\\xbf\\xe2\\xaf\\xce\\x06\\xb1\\xfb\\x58\\x77\\xe5\\x1e\\xf3\\x12\\x6a\\x3f\\x21\\x0f\\xbf\\x21\\x3e\\xd6\\x5d\\x5c\\xa4\\x6c\\x46\\xce\\x4a\\xa9\\x45\\xbd\\x8c\\xa6\\x11\\xe3\\x83\\x62\\x50\\xf5\\x64\\xf7\\xea\\x35\\x42\\x39\\x82\\xf9\\x70\\x5f\\xcd\\x6b\\xef\\x46\\xae\\x16\\xcb\\x0f\\x6b\\xc9\\x12\\xc3\\xf2\\x86\\x42\\xb8\\xd8\\x77\\x75\\xb8\\x18\\xe4\\xe4\\xe8\\x06\\x11\\x67\\x89\\x9b\\xd2\\x7a\\x7e\\x2f\\xb8\\x18\\x7e\\xe9\\x91\\x7d\\x2d\\x58\\x6b\\xf9\\xd4\\x99\\xe8\\xfa\\xbc\\xa8\\x3d\\xdf\\x58\\xc7\\x43\\x7e\\xaa\\xce\\xc4\\xf4\\x44\\xfb\\x2b\\xf7\\x45\\xdc\\xcd\\x8c\\xae\\x38\\x94\\x45\\x71\\xde\\xde\\x20\\x37\\xdc\\x41\\xf0\\x81\\x8a\\x3d\\x91\\xe3\\x02\\x0a\\x72\\x74\\xc6\\x67\\x42\\x47\\x87\\x60\\x83\\xd0\\xe3\\x97\\x46\\xc9\\x68\\x40\\x61\\xbf\\x74\\xad\\x58\\x84\\x36\\xce\\x1b\\x76\\x3d\\xbf\\x4b\\xfc\\xf8\\xde\\x6e\\x35\\xc5\\xa7\\x62\\x66\\x75\\xc1\\x27\\x29\\x2b\\x21\\xdf\\x3c\\x16\\xf8\\x10\\x63\\x32\\x2a\\x75\\xf3\\x43\\x88\\x86\\xf1\\xf0\\xce\\xbf\\xc1\\xa9\\x6f\\x41\\x38\\x4c\\xbd\\xd8\\x61\\xb0\\x4f\\x51\\x9f\\xf6\\xa9\\x34\\x4d\\x94\\xf3\\xd3\\xa0\\xab\\xa8\\x40\\x9d\\xfc\\xf1\\x8d\\x01\\xf2\\xb5\\xb4\\x55\\x17\\x16\\x39\\xee\\xa7\\x7d\\xee\\x70\\x6e\\xa8\\x3d\\xcd\\x2b\\x8b\\x1f\\xc5\\xec\\x0d\\x74\\x07\\x61\\xa5\\xf0\\x5f\\x7e\\xc8\\xd8\\x7a\\xd1\\xf2\\x92\\xa5\\x0c\\x8b\\xae\\x0a\\xd3\\x2b\\x03\\x41\\x9a\\x95\\x0d\\x9f\\xe3\\xb3\\xec\\xc4\\xd8\\xd3\\xaa\\x95\\xe0\\x2b\\x51\\xb1\\x83\\x1d\\x83\\xea\\xde\\xaa\\x44\\x23\\x86\\x35\\xf9\\xc6\\x5e\\xfe\\x2f\\x67\\x44\\xa7\\x0b\\x9a\\xe4\\x1e\\xf1\\x5d\\x97\\x90\\x8c\\x05\\x33\\x93\\x44\\x12\\xf7\\x95\\x83\\xd0\\xe9\\xb3\\xd7\\x06\\xa1\\x28\\xe8\\x8f\\xb5\\x1e\\xed\\xb6\\x5e\\x46\\xd8\\xa2\\xb3\\x8b\\xbd\\xd6\\x45\\x55\\x54\\x96\\x7a\\x8d\\xc0\\xc6\\x8b\\xdd\\xfe\\xae\\x0f\\x8f\\x72\\xf0\\xb8\\x86\\xc3\\xc7\\x41\\xfa\\xc4\\xf9\\x1e\\x5c\\x49\\x1d\\xba\\xe9\\xda\\x45\\x94\\x83\\x6c\\xf1\\xd9\\xfb\\x6e\\xe1\\x30\\x02\\x50\\x89\\xae\\xd3\\x50\\xef\\x24\\x7b\\xc9\\x88\\x7a\\x20\\x50\\x15\\x9d\\xde\\xd1\\x42\\x8f\\xfd\\x9b\\x07\\xb9\\xec\\x2e\\x3d\\x4b\\xbd\\xc2\\xdd\\xb5\\x4e\\x87\\x3b\\x63\\xf2\\x47\\x52\\x33\\xe1\\x91\\x33\\xa1\\x4b\\x66\\x58\\x50\\x94\\x57\\x00\\x81\\x86\\xd6\\x22\\x59\\x95\\xa9\\x67\\x26\\xb5\\x29\\xf4\\x42\\x81\\xaa\\x24\\xfe\\xfd\\x1c\\xff\\x8f\\x81\\x5d\\x93\\xa5\\x98\\x69\\x31\\x66\\x22\\x90\\xb3\\xee\\x16\\x83\\x3c\\x60\\xf0\\xaf\\xce\\xf2\\xcb\\xc0\\x00\\x62\\x3f\\x39\\x31\\x90\\x9c\\xa9\\x76\\xa0\\x94\\xe2\\xb0\\xfd\\xb7\\xdc\\xf7\\xc4\\x85\\xe1\\x49\\x88\\xa3\\x6f\\x19\\xb6\\x64\\x25\\x38\\x5f\\x56\\x32\\xce\\xf6\\x5d\\x1d\\x34\\x14\\x62\\x3a\\xe3\\xee\\x81\\x6e\\x76\\x3a\\x5f\\x60\\x64\\x66\\x62\\x2b\\xe6\\x60\\x21\\x14\\x50\\x29\\x51\\xcf\\x0c\\x09\\x7c\\x16\\x48\\xa7\\x2e\\x2c\\x43\\xd9\\xaf\\xa9\\x68\\x9f\\x2c\\x3c\\xfe\\x02\\x6c\\xdc\\xe3\\xbd\\x1b\\xf9\\xeb\\xf7\\x77\\x56\\x2e\\xcd\\x8f\\xf1\\xb0\\xd7\\x75\\x30\\x6d\\x90\\x04\\x43\\xf3\\x0a\\x84\\x33\\x10\\xb8\\xde\\x6a\\x38\\xff\\x10\\x8b\\x72\\x39\\x13\\xd7\\x89\\x9b\\x9f\\xbe\\x7c\\x3d\\x76\\x6e\\xf8\\xbd\\xfb\\x6d\\x8b\\x0b\\x52\\x95\\x6c\\xb1\\xce\\xc9\\x93\\x6d\\x70\\xb4\\x87\\xc0\\x14\\x40\\xa8\\x42\\xb2\\xfa\\xbe\\x38\\xe7\\xb8\\x85\\x1a\\x38\\x7d\\x35\\x8b\\xe7\\xef\\x12\\xa7\\xe4\\xf2\\xb5\\x27\\xe8\\x30\\x90\\xd6\\x7e\\xb0\\x13\\xc9\\xc2\\xcf\\xd3\\xde\\x5a\\x1a\\x3f\\x99\\x74\\x8a\\x41\\xf4\\x81\\x9d\\x90\\x36\\xe5\\x00\\xc5\\x04\\xc9\\x88\\xbf\\xd2\\x4f\\x61\\x7d\\x6e\\xbd\\xca\\xb2\\xdd\\xea\\xa6\\x15\\x79\\x41\\x4f\\x36\\x0b\\x46\\x9a\\x33\\xa6\\xde\\xd9\\x6b\\xa1\\xd8\\xc1\\x40\\xc4\\xff\\xc9\\x49\\x90\\xd8\\xad\\xf7\\x8c\\xd3\\x87\\x80\\xbd\\x68\\x66\\x3d\\x1a\\x0e\\xe3\\x3f\\x53\\x7c\\xdf\\x89\\x2d\\x56\\x2e\\x82\\xdc\\xd1\\xd9\\x12\\xca\\xd3\\x8d\\x65\\x56\\x7d\\x29\\x14\\x06\"},\n{{0xb6,0x2c,0x24,0x18,0x78,0x27,0x35,0x13,0xe0,0xbf,0x6f,0x33,0xd2,0x10,0x43,0x65,0xb2,0xce,0x9c,0x5a,0x1b,0x78,0x60,0x58,0xe9,0xc5,0xb4,0xd1,0xd1,0x92,0xf8,0x7f,},{0xbb,0xf6,0xfc,0x51,0x98,0xf3,0xfb,0xa5,0xab,0x00,0x7f,0x8a,0x63,0x2d,0x28,0xd1,0xaf,0x86,0x5d,0x29,0x0f,0xa0,0xa9,0x0f,0xaa,0x9a,0x9b,0x5b,0x9c,0x13,0xf3,0xfb,},{0xc5,0x90,0x39,0x58,0x7b,0x38,0xdc,0x14,0x1e,0x05,0x5a,0x93,0x85,0x01,0x04,0xd6,0x29,0xe3,0x80,0x70,0x5b,0x8f,0xc9,0x18,0x84,0x7c,0x5e,0x2a,0x35,0x2d,0xa3,0xa0,0x2f,0xce,0x7f,0x71,0x99,0xf4,0xae,0x2b,0x1e,0x2a,0x59,0x48,0x34,0x18,0x93,0x2e,0x18,0x5f,0x7e,0x45,0xb5,0x05,0x0c,0x64,0x2c,0xec,0xc7,0xe7,0x81,0x99,0x85,0x07,},\"\\x26\\xa3\\xc2\\x6a\\x5a\\x18\\x9c\\xad\\x40\\x7c\\xba\\xa3\\xa6\\x86\\x7a\\xc0\\xa2\\x60\\x88\\xc7\\x5f\\x9d\\x0f\\xa1\\x9b\\xd5\\x02\\x74\\xce\\xc5\\x75\\x5a\\x49\\x71\\x09\\xa4\\x73\\x28\\x4d\\x6f\\xc8\\x1a\\xd4\\xb9\\xec\\x29\\xfa\\x7e\\xc9\\x76\\x4f\\xd3\\x09\\x9f\\x06\\x0e\\x36\\x83\\x65\\x52\\xff\\x24\\x13\\xe3\\xd5\\x09\\x5f\\xe0\\xb1\\xa8\\xbf\\xcf\\x67\\xee\\x06\\xaa\\x90\\x32\\xe7\\xbb\\x32\\x49\\x69\\x80\\x47\\x71\\x4d\\x28\\x14\\x15\\x27\\x3c\\x98\\x34\\xad\\x9e\\xb6\\x65\\xa7\\xd9\\x72\\x20\\xe7\\x2d\\x9c\\xa7\\x3f\\x31\\xaf\\xa7\\x73\\x86\\x75\\xba\\x31\\x62\\xef\\xef\\xe7\\x47\\x9a\\x5b\\xc4\\xbc\\xe2\\xe8\\xb7\\xaf\\x47\\x41\\xd7\\x03\\xdc\\x9b\\xbd\\x60\\xb4\\xcf\\x4b\\x90\\x87\\xf6\\xcf\\x86\\xcf\\x53\\xae\\xd0\\x2b\\xf4\\xca\\x6a\\x18\\xf6\\x07\\xcb\\x52\\xa3\\x03\\xd7\\x8e\\x85\\xad\\x88\\xfd\\xfc\\x86\\xdc\\xb7\\x18\\x77\\x27\\xb0\\x3b\\xe2\\x27\\x74\\x5b\\xea\\x74\\x4f\\xd0\\x06\\x52\\x5b\\xc5\\x9a\\x4d\\xdd\\xab\\x91\\x5c\\xef\\x40\\xa8\\xf3\\x08\\x02\\x91\\x3b\\x79\\x13\\xea\\xf9\\x74\\x33\\x65\\x52\\xe2\\xf1\\x45\\x6a\\xd8\\x03\\xdc\\x58\\xc9\\xb4\\xb1\\x8e\\xfa\\xf7\\xf7\\xe3\\x57\\xe2\\xcd\\x77\\xd1\\x38\\xd9\\x00\\x80\\xe2\\x96\\xd1\\x36\\x4a\\x2f\\x32\\x4d\\x3e\\x0d\\x6e\\xdc\\x20\\xb8\\xbd\\xaa\\x9d\\x2e\\x87\\x1f\\x5e\\x7b\\x05\\x1f\\xb6\\xfc\\xdb\\x55\\x95\\xf2\\x1d\\x3f\\x8d\\xe2\\x9f\\xb7\\x86\\x78\\xfa\\x47\\x9e\\xaa\\x32\\x57\\x9c\\x78\\x4d\\x51\\x3a\\xc5\\xf8\\x36\\xd9\\x54\\xd0\\xd3\\xfc\\x0e\\x5f\\xc8\\xa6\\xee\\xab\\x90\\x20\\x2b\\x4c\\x4a\\x2b\\xec\\x24\\xcf\\x63\\xea\\x67\\xc4\\x70\\x09\\x62\\x18\\xcd\\x43\\x1e\\x88\\x31\\x05\\xfc\\x9c\\x27\\xf9\\xea\\x77\\xc1\\x8e\\xda\\x69\\xbc\\x00\\xa2\\x24\\x2b\\xd4\\x20\\xf0\\x95\\xc9\\xb9\\xa9\\x2d\\x95\\x6c\\xcc\\x5a\\x85\\x72\\xb0\\x57\\xa7\\xfe\\x17\\x3e\\xeb\\x2a\\x31\\x66\\xcb\\x20\\x89\\xd1\\x13\\xa8\\x16\\x46\\x2b\\x25\\x80\\x5b\\x8a\\xba\\xff\\x5b\\x0b\\x22\\x87\\xc5\\x08\\xec\\x2b\\x8c\\x34\\xb2\\x19\\x5c\\x33\\x28\\x70\\xd3\\xcc\\x39\\x60\\x17\\xa1\\x6b\\x9e\\x0d\\xa6\\x18\\x2d\\x07\\x1d\\x3b\\xf3\\x63\\xd3\\xf1\\xe7\\xb7\\xda\\x11\\xd7\\x11\\x25\\x0a\\x58\\xaf\\xd7\\x4e\\xd3\\xe3\\x15\\x8d\\x47\\x18\\xba\\xd4\\xd2\\x74\\xbb\\x34\\x44\\xcf\\xc3\\x18\\x07\\x4b\\x53\\xbe\\xba\\x44\\xa2\\xa3\\x4f\\xf8\\xeb\\x72\\x6e\\x4a\\x1d\\xaa\\x91\\x10\\x51\\x62\\x16\\x51\\x89\\x8b\\x88\\x71\\x69\\xf6\\x2b\\x9c\\x0f\\x40\\x20\\x48\\x3e\\xf5\\x44\\xf8\\xf5\\x72\\xfa\\x6a\\x66\\x40\\xa4\\xcf\\xfc\\xe9\\x76\\xcb\\x70\\x24\\xf8\\x47\\xbd\\xc9\\x5d\\x1d\\x7c\\xe6\\x53\\x50\\x5d\\xeb\\xfc\\x69\\x88\\xed\\x28\\x9d\\xd4\\x7a\\x9e\\xb2\\x61\\x25\\x9e\\x3e\\x65\\xe4\\x5f\\xc9\\xd7\\x14\\x94\\x69\\x35\\xcd\\x8e\\xa1\\x3b\\xc6\\xdb\\x5e\\xaa\\xb9\\xe8\\xb1\\x0d\\xae\\x0f\\xdd\\x69\\x79\\xc2\\x03\\x5c\\xfb\\x80\\x98\\x25\\x2f\\x22\\x05\\x44\\x3b\\x80\\x88\\x16\\xbf\\x77\\x87\\xb7\\xf1\\xe7\\x8b\\xc9\\x8a\\x72\\x85\\xe7\\x33\\xd4\\x5f\\xc4\\x61\\x0c\\x20\\x97\\x7c\\xa3\\x22\\x98\\x89\\xbb\\x8c\\xd2\\xb6\\x94\\xce\\x9e\\x3f\\xe7\\x83\\x03\\xaf\\x83\\xe1\\x06\\x42\\x25\\x42\\xfb\\x79\\x61\\xd3\\x2e\\xb1\\xd2\\xc5\\xfb\\xe6\\x07\\x51\\x67\\x4b\\x07\\x47\\x73\\xee\\x06\\x16\\xe0\\x29\\x73\\xf6\\xa7\\x4a\\x3a\\xe4\\x66\\x4a\\x26\\x50\\x91\\x5a\\x3e\\x10\\x49\\x3b\\x9e\\x66\\xa3\\x9f\\xa5\\xc8\\x9c\\x61\\xd4\\x47\\x35\\xf1\\x07\\xd3\\x37\\x57\\xae\\x67\\x9b\\x43\\xa8\\xd4\\x3a\\x01\\x75\\x7a\\xe1\\xf3\\x27\\x9e\\x86\\x24\\x42\\xe1\\x50\\x71\\x55\\x50\\xee\\x82\\xe4\\x9c\\x0d\\x49\\x43\\xfa\\xf1\\x3f\\x22\\x79\\x1f\\x0e\\x66\\xf2\\x4a\\xc5\\x0a\\xb3\\xc0\\x03\\x85\\x2b\\x21\\xe1\\x5b\\x2f\\x00\\x6e\\xdc\\x2c\\xd6\\xa8\\x79\\xc4\\x76\\xab\\x5b\\x35\\x2e\\xb1\\x09\\x9d\\xad\\x4c\\x50\\x37\\x24\\x00\\xfa\\xa5\\x49\\x8d\\x78\\xc6\\xb8\\x57\\x03\\x4c\\x25\\xca\\xf7\\xb9\\x33\\xfa\\xf6\\xbd\\x7c\\x59\\xfa\\x3d\\xa5\\x73\\x97\\xb6\\x03\\xde\\x9c\\xb9\\xd8\\x0e\\x51\\xf7\\x99\\x7b\\xaa\\x46\\x2a\\xcd\\x53\\x7e\\x2c\\x41\\x94\\xc7\\x6c\\x7e\\x0b\\xe6\\x51\\x2b\\xce\\x4d\\x63\\x66\\x0b\\x36\\xc7\\xcc\\x46\\x63\\x1f\\xb9\\x67\\x1a\\xd8\\xc5\\xd2\\x8e\\x2f\\x2e\\xe2\\xed\\xce\\x81\\x95\\x44\\x21\\xb8\\xa3\\xd9\\xff\\x6f\\x66\\x69\\x9f\\x4b\\xce\\x88\\xbc\\xb8\\xef\\x19\\x2c\\x26\\x2a\\x74\\xab\\x7e\\x19\\x1e\\xee\\x91\\x01\\xa2\\x8d\\x4b\\x66\\x28\\x2b\\x51\\x22\\x09\\x3d\\x14\\x1c\\x64\\x96\\xc7\\xab\\xa4\\xd3\\x52\\xe4\\x72\\xee\\x74\\x40\\xe0\\x5a\\xf6\\x0d\\xa0\\xcf\\xc9\\x3e\\x30\\x36\\x42\\xba\\x8f\\xb8\\xe5\\xc5\\x68\\x68\\x7a\\xbd\\x63\\xaf\\xb3\\xed\\x6a\\x32\\xb6\\xda\\xe5\\x6a\\x7e\\x5d\\x73\\xde\\xba\\xf4\\x1d\\x35\\xca\\x36\\xad\\xb9\\x7a\\x22\\xc0\\xad\\xbe\\x71\\x8b\\xec\\x1f\\xa5\\x19\\x98\\xde\\x9b\\x4b\\x96\\xa7\\x9c\\x5b\\x96\\x55\\xb0\\x16\\x5d\\x5e\\x1b\\x9a\\x8c\\xc5\\x52\\xe8\\xc9\\x32\\x9e\\xde\\x58\\xdf\\x74\\xc6\\x7b\\x2b\\xa1\\xa8\\x42\\xfd\\x3e\\x81\\x58\\xc1\\xfe\\xa3\\xa9\\x9b\\x56\\xa2\\xc2\\xa9\\x62\\x07\\x85\\x3d\\x26\\x02\\x2c\\xec\\x17\\x0d\\x7e\\x79\\x94\\x4d\\x2f\\x56\\xaa\\xb1\\xf1\\x91\\xbf\\xd4\\x8d\\x72\\x54\\x90\\xca\\x82\\xb8\\xd9\\x06\\xf0\\x68\\x0e\\x69\\xee\\xb9\\x57\\x57\\x74\\xfb\\x9d\\x60\\x45\\x13\\xfb\\xc2\\x6f\\x5d\\x30\\x3b\\x68\\x85\\xca\\xc0\\xbf\\x8e\\xfe\\xe0\\x53\\x8f\\x92\"},\n{{0x0f,0x77,0xf7,0x7a,0x1c,0x7e,0x04,0xbd,0xa8,0xe5,0x34,0xf4,0xe3,0xef,0xf9,0xa2,0x38,0xcc,0x14,0x87,0x6b,0x7e,0x3e,0xca,0x8b,0xed,0xe1,0x92,0x3a,0x33,0x64,0x06,},{0x10,0x45,0xea,0x9f,0xe2,0x14,0x58,0x3a,0x0c,0xdb,0xc4,0x94,0x93,0x2b,0xc4,0x4a,0xfe,0xeb,0x08,0x0b,0xec,0x48,0x5c,0xc2,0x34,0xfd,0xdc,0xff,0x13,0x9c,0xce,0x00,},{0xb2,0x0b,0x9c,0x42,0x46,0xf0,0xd2,0x97,0x01,0x38,0xaf,0x7d,0xc9,0xaf,0x62,0x9b,0x68,0xfb,0xc3,0x7d,0xf8,0x7a,0xfd,0xca,0xdc,0xb5,0x45,0xc1,0x76,0x83,0x76,0xa0,0x9c,0x3b,0xab,0xc3,0xeb,0x1a,0xf3,0xb7,0x51,0x98,0x52,0xf7,0x5f,0xab,0x1c,0x9c,0x11,0x9c,0x66,0x2c,0x58,0x77,0xfb,0x2f,0x72,0x99,0xca,0xb5,0x7f,0xad,0x3d,0x0e,},\"\\x0e\\xcb\\x74\\x6d\\xbd\\xb0\\x16\\x14\\x21\\xaf\\xeb\\x7a\\xde\\xa7\\xa3\\x7c\\x2e\\xa4\\x40\\x8a\\x59\\x2c\\x9d\\x78\\x1e\\xd6\\xac\\x6f\\x4e\\xe5\\xcc\\x65\\xd5\\x27\\x0e\\x4c\\xf2\\x76\\x32\\xf7\\xc5\\xc1\\x33\\xd4\\x39\\xb7\\x8d\\x1f\\x71\\xaa\\x6d\\xd8\\x07\\x13\\xd9\\x0b\\x15\\x1e\\x19\\x12\\x1b\\xfa\\x87\\x71\\x0e\\x84\\xa4\\x85\\x0a\\x3b\\x5b\\x02\\x65\\xba\\x26\\x03\\xd0\\x71\\x6e\\x9b\\x7e\\x11\\x22\\x10\\x9c\\x39\\xc6\\xf1\\x02\\x7f\\xce\\x18\\x79\\x8c\\xbb\\x4f\\x6b\\xc5\\xe4\\xd7\\xac\\xa4\\x70\\x46\\x90\\xf5\\xc9\\x81\\x51\\x08\\x71\\xc3\\x13\\x59\\x57\\x98\\x33\\x86\\x81\\x10\\x7f\\x2b\\x57\\x94\\xd4\\x6f\\x6e\\x0b\\xde\\x2c\\xd0\\x64\\xb3\\xb1\\xfc\\x00\\xca\\x47\\x18\\x8b\\xbb\\xc1\\xf4\\xa0\\xce\\x30\\x5c\\xc6\\xd8\\xa8\\x96\\x92\\x0e\\xb9\\xeb\\xae\\x57\\x9f\\xd3\\x38\\x5f\\x8f\\x1f\\x35\\x97\\x62\\x88\\xf4\\xc5\\x8f\\xfc\\x47\\x60\\xf3\\x59\\xb0\\x03\\xc8\\x72\\xe9\\xa2\\x40\\x55\\x35\\x5e\\xa9\\x58\\x5e\\x95\\x10\\x69\\xdc\\xa2\\x5f\\xd0\\xcc\\x0b\\x9d\\xb5\\x2a\\xae\\xaf\\x19\\xd4\\x3f\\x2e\\xab\\x4f\\x83\\x56\\x03\\xad\\x12\\xd2\\xdc\\x49\\xb3\\x10\\x25\\x6b\\x94\\xbe\\xd5\\x48\\x96\\xa1\\x6b\\x69\\xb0\\x9c\\xb4\\xc8\\xff\\x5c\\x23\\xcc\\xe5\\x59\\x3d\\x87\\xad\\xe2\\xa8\\x2a\\xda\\x50\\x85\\x9e\\x15\\x44\\xc1\\x86\\x18\\xa6\\x5c\\x00\\x7e\\xf4\\x24\\xc9\\x85\\x4a\\x17\\x5b\\x6e\\x6c\\x0e\\x64\\xb2\\xc8\\xeb\\x8a\\xd4\\xd2\\x8b\\x97\\x7d\\x68\\xe7\\x81\\x69\\x91\\x51\\x98\\x97\\x53\\x94\\xd3\\xb9\\xb2\\x69\\xca\\xb0\\xd3\\x26\\x1b\\x2b\\x56\\xcd\\x2c\\xc4\\xbd\\xdb\\xd4\\xf1\\x43\\x9e\\x0d\\xbe\\x2c\\x9b\\x3f\\x3f\\x75\\x14\\xed\\xac\\x5e\\xbb\\x46\\x22\\xb9\\x2a\\x69\\xa8\\x40\\xa9\\x02\\x85\\x50\\xb2\\x21\\xdb\\x59\\xdd\\xfb\\x00\\x13\\x96\\xf8\\x63\\x92\\xa1\\x7f\\x08\\xcc\\xb1\\x94\\xcd\\x9e\\x1a\\x00\\x81\\xd7\\xdd\\x9c\\xca\\x23\\x57\\xfe\\xb8\\xb7\\x95\\xe5\\x17\\x02\\x9f\\x79\\xc8\\x2a\\x3b\\xe6\\xf9\\xa0\\x31\\xdd\\x1a\\xf1\\xe7\\x9e\\x49\\x82\\xbf\\x8e\\x76\\xb3\\x10\\xf9\\xd3\\x55\\xef\\xcd\\x5b\\x1e\\xfa\\x9f\\x35\\x9c\\x17\\xcf\\x3b\\x51\\x0d\\x51\\x3e\\x8c\\xd5\\x78\\x6a\\x0d\\x34\\x45\\xdc\\x59\\xa8\\x43\\x3a\\x46\\x48\\x86\\x87\\xb0\\xf5\\x8b\\x1b\\xd6\\x56\\x7c\\x2a\\xf4\\x87\\x3b\\x51\\xfc\\x84\\x5e\\x76\\x7e\\x24\\x30\\x05\\x19\\x2f\\x8f\\x06\\x74\\xf2\\x81\\x26\\x5a\\x55\\xd7\\x6c\\xea\\x32\\x22\\x60\\xc9\\x32\\xce\\xa6\\x71\\x7a\\xdb\\x98\\xa2\\xdd\\xa8\\xc6\\x98\\xe2\\xe8\\x92\\x55\\xfe\\xb7\\x7d\\xa7\\x64\\x81\\x67\\xbc\\x1e\\x58\\x87\\x7f\\xeb\\x72\\xd1\\xd1\\x4b\\x0c\\x30\\x4f\\x07\\x37\\x2d\\x95\\x56\\x75\\x23\\x7c\\x49\\xf7\\xa6\\xdb\\xc9\\x15\\xe6\\x81\\x4a\\xba\\xe6\\xcc\\xe4\\xca\\xf9\\xf4\\x80\\x87\\xe9\\xdf\\xb2\\x82\\xd8\\xf3\\x40\\x37\\x7c\\x1e\\x29\\xc6\\x73\\x1c\\xcc\\x26\\x67\\xda\\x66\\x95\\xb7\\x12\\xbe\\x03\\x12\\xd8\\x65\\x11\\x19\\x34\\xf1\\x68\\xd5\\x54\\x43\\x65\\xdd\\xae\\x27\\xab\\xc6\\x4a\\xef\\xbc\\xb3\\x22\\xdb\\x7d\\x97\\xd9\\x0d\\x95\\x7a\\x63\\x7b\\xd8\\x26\\xc2\\x27\\xe9\\xeb\\x18\\x0b\\x45\\xa4\\x31\\x62\\x6a\\x6f\\xd8\\x90\\xc0\\xe5\\xf4\\xed\\x7e\\x85\\x64\\x74\\x75\\x2f\\x80\\xb5\\xae\\xf6\\xe7\\x3e\\xfd\\xaa\\x6c\\x2c\\x45\\x1b\\xd7\\x4c\\x1e\\xf4\\x66\\xca\\x3a\\xaa\\x25\\x73\\xbb\\x52\\xcb\\x2b\\x1c\\xa9\\x6a\\x1b\\x57\\x44\\x03\\xce\\xae\\x1c\\xf0\\x5f\\xfc\\x53\\x43\\x0e\\x1e\\x4c\\xd5\\x59\\x3b\\xd1\\xef\\x84\\xbc\\xbf\\xe2\\x19\\xf0\\x81\\x60\\xd1\\x66\\xf2\\x73\\x1d\\x99\\xb8\\xd7\\xa3\\x2b\\x12\\x99\\x1f\\x77\\x77\\x5a\\x26\\x7e\\xc0\\x82\\x97\\xec\\x51\\x2d\\x7b\\x72\\x43\\x56\\x32\\x52\\x5c\\x04\\x00\\x0f\\xb0\\x0a\\x79\\x3f\\x8b\\x5f\\x8f\\x37\\x47\\xb5\\x53\\x59\\xdf\\x21\\xb7\\xe2\\xc4\\x9f\\x2b\\x0b\\x9a\\xe0\\x82\\xaf\\xc7\\x0a\\x14\\x68\\x71\\x37\\x0b\\x8d\\x50\\x08\\x6d\\xe0\\x0f\\x94\\x48\\xbe\\x89\\x02\\x17\\x4b\\xa2\\xcc\\x85\\x1f\\xa3\\x79\\xdd\\x70\\x31\\xca\\x45\\x7a\\x88\\x69\\xaf\\x4b\\x6c\\x27\\x29\\xda\\xc5\\x19\\x55\\x6b\\x8b\\xb4\\xab\\x51\\x9e\\xf1\\xbb\\x02\\x4e\\xa8\\xb7\\xf0\\x17\\x71\\xc9\\xaa\\xb7\\x48\\xe5\\x73\\x81\\xa0\\x19\\x2a\\x6e\\x39\\x8c\\xbe\\x6d\\xd9\\xf3\\x67\\xcc\\x7b\\x33\\x54\\xf8\\x3b\\x79\\xbc\\xda\\x46\\xb7\\x93\\xa4\\xad\\xa8\\x55\\x49\\xc8\\xd6\\xbd\\xd6\\x16\\x81\\x24\\x36\\x2f\\xf9\\x08\\xaa\\x1a\\x0c\\xb7\\x8a\\xa3\\x30\\xc4\\x2d\\x5a\\x5d\\x48\\x12\\x35\\xac\\xac\\x3a\\x91\\x9b\\x96\\x9c\\x50\\x98\\x72\\x66\\xd4\\x04\\xd1\\x5d\\x0e\\x70\\x6f\\xd9\\x00\\x76\\x34\\xf6\\x9e\\x13\\xc5\\x6e\\xc4\\x71\\x33\\x88\\x4f\\xca\\xdd\\xc1\\x6b\\xee\\xee\\xd1\\x9e\\x0c\\xd9\\x17\\xaa\\x49\\x63\\x67\\x86\\x7d\\xfc\\xea\\x27\\x4e\\x1a\\x47\\xda\\x77\\x4f\\x3c\\x93\\x63\\x02\\x1e\\x7c\\x8d\\x6b\\xf8\\xf0\\x00\\x53\\xfa\\xcc\\x11\\xcb\\x68\\xa9\\xd6\\xe1\\xfc\\x2d\\x6d\\x19\\x17\\x5d\\x63\\x24\\xff\\x7c\\xa6\\xc2\\x30\\x58\\xb8\\xb6\\x93\\xd8\\xfd\\x4e\\x0b\\x51\\xdc\\xbb\\x11\\x35\\x43\\xf2\\xfc\\xc0\\x45\\x2e\\xb9\\xd9\\x67\\xac\\x0f\\xa9\\xb2\\x3e\\x9e\\x0b\\x1d\\xa8\\xd8\\x3a\\x3c\\x1f\\xc9\\xe9\\xec\\x97\\x1f\\x0f\\x67\\xfc\\x74\\x5b\\xb1\\x73\\x76\\xbc\\x46\\x24\\x5f\\x52\\x8c\\xb6\\xe5\\xfe\\xe1\\x1b\\xcd\\xda\\x86\\x7b\\x7f\\x79\\x01\\x9c\\xf9\\xdb\\x59\\x18\\x58\\x23\\x0a\\xec\\xb4\\xd1\\xe9\\x3d\\x16\\x7c\\xd8\\x6b\\x42\\xdd\\x87\\x9a\\x13\\xfa\\x0e\"},\n{{0xc5,0xa5,0x05,0x34,0x77,0xae,0x31,0x15,0x8e,0x74,0x69,0xdd,0x15,0x04,0x86,0x76,0x50,0xd4,0x6f,0x15,0x89,0x06,0x7f,0x5c,0xd8,0x81,0xca,0xf2,0x5c,0x26,0xcb,0x21,},{0x70,0xf8,0x5d,0xb9,0x80,0x7b,0x26,0xfc,0xf3,0xe6,0x69,0x0b,0x91,0x72,0x4f,0x7a,0xe3,0xd2,0x0e,0xc3,0x60,0x4a,0xb7,0xd6,0x30,0x8d,0x90,0x94,0x30,0x8b,0x2d,0x59,},{0xf5,0x19,0x1b,0x44,0xbd,0x6c,0xc3,0xea,0x28,0x17,0x71,0xdf,0x12,0x54,0x9b,0xa2,0xbe,0x22,0x8b,0x51,0xeb,0x79,0x1b,0x9e,0x5e,0xd2,0x81,0x5f,0x86,0x2a,0xa6,0x30,0xb5,0x69,0x67,0xcd,0xef,0x8b,0x6a,0xf0,0xb9,0xd2,0x1a,0xb8,0xc9,0x7a,0x6d,0xff,0x68,0x1c,0xce,0xd9,0xf5,0x01,0x97,0x13,0xd4,0x35,0x7c,0xb3,0xe5,0x4c,0x0d,0x08,},\"\\x85\\x71\\xff\\x39\\x03\\x48\\x6a\\x43\\xa6\\x12\\x6c\\x32\\x3e\\x7b\\x3a\\x74\\x14\\x1d\\x13\\x85\\xd4\\xbd\\x70\\x3f\\x19\\xe2\\xd1\\xb6\\x4b\\x50\\x28\\x1d\\x27\\x16\\x8a\\xe3\\xe7\\x69\\xc6\\xdd\\x9d\\xf7\\xd9\\x78\\x64\\xfb\\x37\\x82\\x2f\\x00\\x21\\x85\\x2e\\x31\\x68\\xab\\x7d\\x84\\x5a\\x65\\x45\\xed\\x0c\\x37\\x7d\\x9f\\x7c\\x04\\x8a\\x2b\\x96\\xe8\\xdc\\xf4\\x45\\x77\\x96\\x84\\xa0\\x58\\xc2\\xb9\\xc2\\x1a\\xc6\\x8a\\x0c\\x34\\x1d\\x1d\\x6c\\x09\\x81\\x45\\x64\\x57\\x45\\x8e\\xb7\\xce\\xbf\\x66\\x67\\x87\\x40\\x77\\x7e\\xca\\x26\\xe0\\x1e\\x1c\\x8f\\x53\\xb5\\xd4\\x75\\x6c\\xc5\\xf0\\xb9\\x0f\\x0c\\x5d\\xb0\\x53\\x93\\xcd\\x4b\\x8e\\x44\\xf6\\x81\\x0c\\xaa\\x5a\\x11\\x6a\\x33\\x57\\x77\\x24\\x39\\x5d\\x41\\x3a\\xf6\\x19\\x63\\x2a\\x6f\\xed\\x14\\xe2\\x15\\xc2\\xf1\\x9d\\x10\\x5c\\xe2\\xbf\\x14\\x98\\xe6\\xd2\\xab\\x4f\\x65\\x0f\\x61\\xba\\x5c\\xf6\\xd0\\xc7\\x3b\\xbb\\xde\\x98\\xe3\\x04\\x29\\x91\\x0a\\x4e\\x67\\xdf\\xbc\\x71\\x7c\\xb0\\x91\\x18\\x2d\\x59\\x70\\x58\\xb5\\xd7\\x65\\xd0\\x97\\xe6\\x87\\x58\\x31\\xb5\\x88\\xaa\\xeb\\x3e\\x73\\x27\\xe8\\x56\\xb4\\x2f\\xa9\\x83\\xfd\\x25\\x4e\\xf1\\xf9\\x18\\xb0\\x43\\xd1\\xdd\\x3d\\x7b\\x7e\\x30\\xb3\\x15\\x38\\x6e\\xec\\x91\\xe7\\xf9\\x4d\\x59\\x8f\\x4b\\xeb\\x3b\\x27\\xb4\\x2f\\x4e\\xe1\\xfb\\xf7\\xaf\\xb4\\x86\\xbd\\xcc\\x60\\x81\\xcc\\xb8\\x67\\xf0\\x41\\x11\\x04\\x4f\\x4b\\xbb\\xe3\\xc8\\x12\\x2e\\xde\\xad\\xef\\xa9\\xd6\\x93\\x90\\x6e\\x0d\\x6e\\x13\\x3b\\xf6\\xf2\\xda\\x61\\x58\\xfe\\xed\\xbd\\xa0\\x24\\x41\\x0f\\x12\\x08\\x6e\\x7a\\xcc\\xf1\\xc6\\x8e\\x15\\x57\\xf0\\x0c\\x14\\xe9\\xc7\\xea\\x76\\xa5\\xed\\x13\\x37\\xa0\\x54\\xac\\x2c\\x94\\x9c\\x05\\x97\\x7e\\x03\\x02\\x74\\xf6\\xa4\\xf2\\xa6\\xb3\\x0a\\x15\\xc5\\x70\\xec\\x94\\x33\\xf7\\x4f\\x47\\x52\\x80\\x87\\xc9\\xce\\x9a\\x62\\x92\\x95\\x1c\\x54\\x35\\x49\\x96\\xfb\\x28\\x3c\\x0d\\xc4\\xcf\\x33\\xc0\\x01\\xbc\\x96\\x87\\x5e\\xa6\\xe1\\xf4\\x6f\\x83\\x7f\\xf1\\x8d\\xd9\\x54\\x5f\\xb9\\x93\\x46\\x55\\x34\\x2b\\x12\\xc2\\x99\\x0b\\x9f\\x1c\\x6f\\xf4\\xd6\\x64\\x89\\xd6\\xae\\xdc\\xe7\\x5c\\x7c\\xb0\\x3a\\xc1\\x34\\xbf\\xd3\\x9b\\x18\\x1d\\xfb\\x7f\\x9a\\x97\\xce\\x73\\x7f\\xe5\\x70\\xad\\x5f\\x81\\x34\\x59\\x39\\xa6\\xde\\x5a\\x40\\xa3\\x3a\\x0e\\x44\\xbf\\x95\\x75\\x03\\xd5\\xca\\x02\\x83\\x51\\x2e\\x57\\xfb\\xa8\\xa3\\xa6\\xf2\\xc3\\x90\\x68\\x7b\\x1b\\x77\\x08\\x67\\x6e\\x0f\\xd0\\x3b\\x7c\\x18\\x8d\\x45\\x61\\xc1\\x87\\x91\\x63\\xea\\xf2\\xb5\\x96\\xdd\\xd5\\xf3\\xc1\\xf4\\xda\\xdb\\xc1\\x39\\xc2\\x16\\x48\\x92\\x82\\x0b\\x2f\\xe0\\x9c\\xbc\\x3d\\x19\\x08\\x80\\x76\\x36\\x45\\x10\\x25\\x4f\\x2b\\x6d\\x41\\x03\\x29\\xe7\\x0f\\x2e\\x5a\\x94\\x5b\\xba\\xcd\\x2c\\xa8\\x9b\\xd4\\xb6\\xe1\\xf5\\xe2\\xe1\\xd4\\xf4\\xed\\x2f\\xe0\\x11\\x3b\\xcf\\x32\\x96\\x2f\\x00\\xd5\\xc3\\x3b\\x1d\\xf9\\x88\\x40\\x2b\\xa0\\xdc\\x88\\x04\\xc1\\xaf\\x66\\xcc\\xae\\x26\\x70\\xef\\xa3\\x13\\x4c\\x67\\xfc\\x90\\xfe\\xed\\x8d\\x8d\\xee\\xdc\\xcf\\x6a\\x46\\xf2\\x29\\x40\\x45\\x4a\\xf2\\xbb\\x67\\x54\\xcf\\x23\\x5d\\xdb\\xb0\\x00\\x1c\\x6c\\x74\\x1b\\xf8\\x74\\xbc\\xd8\\xd4\\x1d\\x9d\\xba\\x81\\x62\\x58\\x1c\\x37\\x46\\xd7\\xf3\\x0e\\x73\\xde\\xf6\\x94\\x15\\xaf\\x51\\x81\\xc1\\x49\\x91\\x42\\x95\\x12\\x2d\\x45\\x98\\x2f\\x94\\x94\\x3e\\x20\\xb0\\xff\\xc7\\xfe\\x6d\\xdf\\x19\\xa0\\x22\\xe8\\x7a\\x52\\x13\\x33\\x57\\xa1\\xe8\\x0f\\x37\\xf2\\x8a\\x4c\\x4a\\x8a\\x61\\xc1\\x48\\xdd\\x87\\x5c\\x1e\\x8e\\xcd\\xcd\\x84\\x0d\\xd8\\x63\\xe4\\x4d\\x9b\\xcb\\x16\\xb6\\xe5\\xaf\\x01\\x47\\xb3\\x4a\\x7a\\x90\\x52\\xc8\\xd3\\xf4\\x52\\x01\\x3d\\x2d\\x35\\x4f\\x68\\x03\\xf9\\xea\\xf6\\x05\\x6f\\x3b\\x01\\x3c\\x61\\x6e\\x47\\xf3\\x98\\x81\\x91\\x46\\x32\\x0a\\x5e\\x3d\\xbd\\xf1\\x68\\x43\\xea\\x29\\xde\\xf2\\x62\\xcc\\x9a\\x34\\x36\\x72\\xcf\\x96\\xbc\\xcc\\x6e\\x87\\xe6\\xa6\\xba\\xf0\\x71\\x2e\\x6e\\xe8\\x9a\\xa6\\x04\\x89\\xf1\\x7c\\xb7\\x2d\\xdc\\x44\\xba\\xd1\\x61\\x58\\x7d\\x87\\xf5\\x4d\\x67\\xcc\\x0a\\x27\\x78\\x49\\x7d\\x83\\x10\\x88\\x31\\x5f\\xfe\\xee\\x3d\\x26\\x8c\\x59\\xbe\\xfe\\x88\\x4c\\x3a\\xa0\\xe0\\xae\\x22\\x96\\xbb\\xb6\\x0e\\xac\\x90\\x97\\xcd\\xf8\\xdc\\x09\\x87\\xce\\xb1\\x74\\x2b\\x05\\x86\\xdf\\xce\\x79\\xec\\x10\\x42\\x5b\\x28\\xf4\\xe6\\x45\\x20\\xd7\\x12\\xe3\\xf4\\x6e\\xa8\\x3b\\xe2\\xde\\x6a\\x15\\x74\\x07\\x3b\\xc5\\xc7\\x55\\x7b\\x8e\\x25\\xb6\\x41\\x11\\x84\\xea\\x28\\x3d\\x88\\x00\\x23\\x2c\\x79\\x06\\x94\\x21\\x81\\x1f\\x88\\x3c\\x29\\x94\\xe7\\xb7\\xe2\\xad\\x9f\\x8d\\xc4\\x89\\xc9\\x34\\x77\\x24\\x39\\x46\\x09\\xc9\\x89\\x09\\xa6\\xc2\\x60\\x17\\xb5\\x0f\\x20\\xd5\\x0c\\xca\\xcb\\xde\\x36\\xb7\\x6b\\xa6\\x46\\xa7\\x6d\\xc6\\xa5\\xb0\\xf5\\x06\\x49\\xc5\\x65\\x8b\\xbd\\xfd\\xd3\\xb5\\xca\\xfc\\x54\\x79\\xa2\\xf4\\x8e\\xe5\\x15\\x42\\xf2\\x3e\\x9f\\xc9\\x21\\x32\\x06\\x0f\\xd6\\x35\\xef\\xf4\\x52\\x11\\x1c\\xda\\xf3\\xef\\xbd\\xb7\\xdb\\x9e\\x7d\\x47\\x16\\xd0\\xd6\\x01\\x1c\\x29\\x11\\x8a\\x55\\xd4\\xc1\\xa4\\x36\\xab\\xe2\\x4e\\x3c\\xbf\\x40\\x23\\x5b\\x76\\xdd\\x19\\x23\\x50\\x3c\\x5f\\x35\\x98\\x12\\x4e\\x2d\\xf5\\x5a\\x2d\\x1f\\x24\\x6e\\x90\\xde\\x4b\\x71\\x64\\x5d\\x51\\x75\\xb6\\x1b\\x01\\x74\\xe7\\xe5\\x7d\\xf1\\x28\\x5c\\xcf\\x8c\\x86\\xb8\\x38\\x2c\\x25\\x80\\x79\"},\n{{0x05,0xc7,0x19,0xca,0xe0,0x6e,0x2b,0xb7,0xd8,0x78,0x63,0xab,0x31,0x50,0x27,0x2c,0xb2,0xf8,0xc3,0xaa,0x24,0x21,0x91,0x2d,0x87,0xf9,0x8e,0x75,0x89,0x63,0x8c,0xe9,},{0x90,0x21,0x17,0x96,0xfe,0xd3,0xd5,0x3b,0x81,0xf8,0xfe,0xeb,0x1b,0xad,0x1f,0xfc,0x93,0x3e,0x5f,0x10,0xd3,0xbc,0x1b,0x36,0xdd,0xf2,0x10,0xa4,0x79,0x23,0xdf,0x03,},{0xba,0x6e,0xb7,0x51,0x37,0x1d,0xf7,0x21,0xb7,0x70,0x7a,0x5b,0x33,0x39,0xed,0xb5,0x5f,0x13,0x86,0x40,0xb9,0x7b,0xe6,0x33,0x4d,0x6c,0xda,0x51,0x91,0xa3,0xff,0x63,0x67,0x91,0x17,0x61,0x88,0x2a,0x4a,0x00,0x7f,0x16,0x1b,0x74,0x8c,0xec,0x95,0xb1,0x9e,0x99,0x5f,0x28,0x58,0xc2,0x57,0xcd,0x61,0x69,0x25,0x66,0x62,0x30,0x11,0x02,},\"\\xec\\x24\\x19\\x18\\x41\\x8e\\x60\\x52\\x20\\x42\\xe6\\x73\\x39\\xe6\\x64\\x94\\x99\\xf3\\x1a\\x6c\\x7c\\xf8\\x92\\x5f\\x1f\\x61\\xdd\\xe8\\x94\\x60\\x36\\x02\\xae\\x8b\\xb5\\xf5\\x88\\x09\\x82\\x1f\\x83\\x34\\x4f\\x23\\xcd\\x31\\xe6\\x4e\\xc9\\xff\\xe7\\x9a\\x98\\x6b\\x7e\\x29\\xe4\\x31\\x9a\\x63\\x41\\x43\\x16\\xbd\\x6e\\xe2\\x0e\\x02\\xa5\\x0d\\xa4\\x40\\x12\\xbd\\x2d\\x6f\\x9f\\x67\\x9e\\x88\\xed\\x0c\\x8b\\xb1\\xe2\\xca\\xd5\\x5e\\x56\\x57\\x89\\x88\\x33\\x45\\xb7\\x54\\x6f\\x3d\\x54\\xb1\\xb3\\x62\\xb1\\xc6\\x50\\x50\\x2c\\x01\\x9d\\x73\\x13\\xaf\\xbc\\x82\\x68\\x9b\\x23\\xa3\\xa5\\x2d\\x8f\\x1a\\xf9\\xf8\\x1e\\x18\\x8d\\xbd\\xf2\\x03\\xfb\\x53\\x00\\xb4\\x22\\x5b\\xfb\\x67\\x73\\x33\\x7b\\xe6\\x75\\x0b\\x3d\\xb8\\x8c\\xe0\\x97\\x34\\x3f\\x62\\xee\\x2c\\x11\\x85\\x74\\xef\\x15\\x0c\\xbd\\x4c\\x62\\x76\\x0c\\x3e\\x43\\xdc\\xbc\\x39\\x21\\x8b\\xd6\\xd9\\x85\\x65\\xfa\\x38\\x98\\x11\\xb1\\xa6\\x74\\xf6\\x17\\xfd\\x75\\x67\\x33\\xdc\\xb5\\x67\\xa9\\x2d\\xbf\\x38\\x55\\xb5\\x7b\\x1f\\x4a\\x46\\xd5\\xb8\\x97\\x4b\\x39\\xac\\x0d\\x0e\\x24\\xd9\\x9d\\x20\\x37\\xc0\\x4f\\x60\\xd9\\x14\\x0f\\x64\\xb0\\x7a\\x77\\xd7\\xea\\xa1\\xce\\x8a\\x78\\xe8\\x44\\xb1\\xdc\\xf0\\xe3\\x74\\x24\\xf3\\xf9\\xd2\\x53\\xa5\\x48\\x56\\x1a\\x03\\x75\\xa8\\xd4\\x34\\x12\\x97\\xbf\\xed\\xb7\\x04\\x8c\\x79\\x35\\xe1\\x48\\x14\\x18\\xf9\\xbb\\xa9\\x27\\x1f\\x9f\\xd6\\x02\\x62\\x24\\xe7\\x8e\\x05\\x5d\\x8a\\x09\\x39\\xfa\\x2f\\xe1\\xdb\\xc0\\xfc\\x7b\\x58\\x3e\\x4c\\xff\\x34\\x90\\xe1\\xd0\\xf6\\x10\\xb2\\x52\\xe3\\x0d\\x84\\x97\\xd0\\x0e\\x4a\\xac\\xb3\\x75\\xf1\\x9a\\x47\\x19\\xf7\\x9c\\xa1\\xea\\x58\\x3a\\x2f\\x8b\\x14\\x06\\xa4\\xaa\\x5c\\xb5\\x5c\\x08\\xb6\\x59\\x3b\\x67\\x6e\\xb5\\xc3\\x4a\\xbe\\x89\\x39\\x2d\\x62\\xd2\\x33\\x08\\xa3\\x34\\x8b\\x57\\xaf\\xfb\\xba\\x77\\x39\\xcd\\xe8\\xe1\\x90\\x9d\\x34\\x25\\xee\\xb2\\x09\\x26\\xa9\\x77\\xd3\\xa9\\x4a\\x86\\xe0\\xba\\x10\\xb3\\x86\\x92\\x66\\x98\\x82\\x7e\\x86\\xb4\\xfd\\x6c\\x61\\x80\\x04\\x7c\\x87\\xec\\x3b\\x31\\x61\\x9d\\x05\\xa9\\xdf\\x34\\xef\\xd3\\xd7\\x6a\\x83\\x69\\x62\\xb2\\xef\\x60\\x4d\\x07\\xaf\\x09\\x75\\xeb\\x8f\\x3d\\xd2\\x25\\x94\\x32\\x38\\x02\\x56\\x4c\\x92\\x9b\\x3f\\x65\\xda\\xcb\\x57\\x2b\\x32\\x55\\x3d\\x69\\xb3\\x1a\\x19\\x76\\x90\\xa9\\xbb\\x86\\x0b\\x08\\x0a\\x77\\xcf\\xbb\\x3c\\x17\\x5a\\xaf\\xce\\x01\\x46\\xa8\\x2a\\x4d\\x06\\xe8\\xc7\\x50\\x52\\x1b\\x72\\x6e\\xf1\\xcb\\x29\\xd0\\x21\\xe5\\x91\\x5e\\x5e\\x84\\x62\\xed\\xe5\\x39\\x54\\x45\\x24\\x5c\\x9a\\xe8\\x82\\xee\\xc4\\xb1\\x74\\x5e\\x11\\x79\\x1f\\x76\\x21\\xd3\\xfe\\x70\\x2c\\xac\\x15\\x25\\xe1\\xf7\\xb4\\x6e\\x11\\x05\\xcd\\xd0\\x6d\\xa2\\xaf\\xde\\x26\\x47\\x5d\\xc1\\xf7\\x8d\\xf8\\xe2\\xd7\\x2b\\x0e\\xc3\\xef\\x7d\\xd9\\x56\\x19\\x3c\\x99\\x68\\x42\\xa4\\x32\\x69\\x65\\x38\\xcf\\x12\\x3d\\x76\\x87\\x21\\x1f\\xfc\\xd0\\x90\\xb9\\x38\\x1e\\xab\\xec\\x87\\x9f\\x76\\x9a\\xac\\x0d\\x35\\x64\\xe1\\x6d\\xf7\\x94\\xfa\\x24\\x72\\x8d\\x71\\x72\\xfd\\x07\\x73\\x2e\\xab\\x07\\x7e\\xd8\\x1c\\x22\\x08\\x4f\\x6f\\x78\\x1b\\x62\\x6d\\xac\\x67\\x42\\x8a\\x9d\\xdf\\x3b\\x0d\\xb0\\x46\\x52\\x51\\x22\\x0d\\x18\\xb8\\xbf\\x62\\x04\\x64\\xc5\\x1a\\x57\\x8d\\xec\\xcc\\xbb\\xab\\xa5\\x45\\xed\\x44\\x2c\\xf1\\x2c\\x4c\\x66\\xf6\\xcb\\x6e\\x69\\x01\\xea\\x54\\xae\\xda\\x23\\x6e\\xc4\\x5e\\xef\\x88\\x6a\\x7d\\xdd\\x2c\\x04\\x1c\\xab\\xa3\\xa6\\xce\\xe3\\x39\\x71\\x5b\\x6c\\xe9\\x7e\\x76\\x5e\\xc3\\x47\\x9f\\x3d\\x52\\x82\\x4a\\x81\\x94\\xbe\\xc2\\xa8\\x96\\x47\\xe8\\xc6\\x3f\\xf7\\x64\\x5f\\xf6\\xd0\\x53\\x67\\xc7\\x67\\xbc\\x48\\xcc\\x96\\xba\\xf0\\x5d\\x6a\\x41\\x5b\\x2a\\x5a\\xff\\x9b\\xfb\\x21\\x79\\x48\\xfa\\xd3\\x57\\xb9\\x8f\\x47\\xdf\\xed\\x62\\xff\\x12\\x85\\xeb\\x9f\\x46\\x8f\\x0f\\x29\\xed\\xd7\\x5a\\xdc\\x0c\\x8c\\x2f\\xf6\\xa5\\x65\\xed\\xb8\\xed\\xfb\\x48\\xbe\\xa0\\x3b\\x70\\xc4\\x47\\x36\\x9c\\x52\\xd8\\x81\\xee\\xa0\\xee\\xdb\\x08\\xc3\\x15\\xcd\\xf0\\xbf\\xeb\\x97\\x9c\\x1c\\x02\\x50\\x94\\x6b\\xb1\\x00\\xc2\\x86\\x6b\\x41\\x69\\xb8\\xcb\\xd4\\x4d\\x65\\x8f\\x02\\x36\\xe1\\xe9\\xf3\\xaa\\x13\\xbb\\x8e\\x80\\x22\\xa3\\x8c\\xe9\\x97\\xc9\\x4b\\x5b\\xaf\\x97\\xe0\\xba\\x62\\x1f\\x7e\\x09\\x67\\x1c\\xe6\\x38\\xc2\\xa3\\x9e\\xe6\\xc6\\xe2\\x5a\\x68\\x80\\x19\\xdd\\x16\\x76\\x75\\xce\\xae\\xc2\\x1c\\x6b\\x42\\xa7\\xc8\\xc4\\x76\\xd1\\x29\\xdc\\xc6\\x93\\xc3\\x92\\xa0\\x2b\\xe9\\x1b\\x87\\x43\\x7a\\x08\\xa0\\xeb\\xf1\\xa7\\xbd\\x97\\x6b\\xa2\\x37\\x74\\x76\\x68\\x38\\xb8\\xd6\\x02\\x4f\\x5b\\xb9\\xb0\\x7f\\x3c\\x6b\\x71\\x9b\\x4d\\xe1\\x5b\\x72\\x44\\x80\\x48\\xab\\x70\\xdb\\x3d\\x4b\\xea\\x77\\xba\\x35\\x9b\\x51\\xb1\\xec\\x17\\xdb\\xe8\\x01\\x0a\\xef\\x02\\x44\\xa8\\x07\\x9c\\xa8\\xb9\\xa2\\xa7\\x97\\xf3\\xb1\\xfe\\x04\\x7c\\x8d\\xd5\\xca\\xb7\\xfb\\x48\\x68\\x29\\x23\\x9c\\x4e\\xf6\\xd9\\xa3\\x83\\x70\\xd4\\x88\\xc4\\x7b\\x7c\\x03\\x0e\\x49\\xa5\\x50\\x0c\\x9a\\xbb\\x39\\xa9\\xa5\\xab\\xfe\\x72\\xe9\\x18\\xb7\\x63\\x84\\xec\\xaa\\xfe\\x16\\x27\\x26\\x6c\\xd1\\x4e\\x69\\x6c\\x09\\xd2\\x51\\x2e\\x31\\x25\\x82\\xa8\\xa9\\x11\\xe7\\xb7\\xbf\\xa0\\x4c\\x21\\x81\\x9a\\xf6\\x87\\xf0\\x4c\\x5e\\x0c\\xbe\\x9a\\x2c\\xe2\\x4d\\x4d\\x3f\\xd1\\x21\\x90\\xb2\\x53\\xda\\xbc\\x12\\xc6\\x3c\\xab\\xfa\\x94\"},\n{{0x53,0x11,0xf3,0xc9,0x61,0x01,0xcb,0x8b,0x7a,0xbc,0x62,0x2b,0xb9,0x32,0x6b,0x8f,0x51,0x3c,0x2b,0x16,0xd2,0x94,0xdf,0x79,0x7f,0x56,0xdf,0xd8,0x20,0x3d,0xda,0x27,},{0x23,0x0b,0x70,0x02,0xf5,0x7c,0x79,0xae,0x2e,0x6b,0xfd,0xb8,0xdf,0x30,0xdb,0x3e,0x90,0x07,0x56,0xb5,0x4a,0xf3,0x96,0x8c,0x67,0x0e,0xe2,0xf3,0x2b,0xb1,0x1e,0x0a,},{0x3c,0xbb,0xb2,0x60,0x88,0x70,0xde,0xa1,0xef,0xee,0xbb,0x3f,0xbf,0x68,0x1e,0x27,0x70,0x5c,0x35,0xe4,0xdd,0xee,0xa8,0x6c,0x1b,0x34,0x2a,0x77,0xdc,0x29,0x6b,0x49,0x84,0x19,0x80,0x8e,0xac,0xbc,0x78,0x85,0x56,0x11,0xff,0xbc,0x92,0x65,0xa7,0x47,0x98,0xe5,0x18,0x27,0xe6,0xe5,0xd8,0x11,0x81,0x6d,0x3c,0xa2,0x1e,0x8b,0x9c,0x06,},\"\\x61\\xb1\\x5b\\xe3\\x7c\\x4e\\xb3\\x97\\xd9\\xe7\\x7e\\x00\\x15\\x1a\\x28\\xed\\x3e\\x86\\xd5\\x0a\\x95\\x52\\xbb\\x48\\x50\\xb6\\x21\\x76\\x3f\\x01\\x2e\\x7e\\x77\\xbb\\x5d\\xb8\\xf3\\xdf\\x7d\\xcf\\x76\\x9f\\x2d\\x1d\\x46\\xd8\\xd6\\x0b\\xae\\x40\\xc8\\xca\\x6e\\x25\\xc6\\x41\\x0b\\x60\\x07\\x8a\\x93\\xfd\\x05\\x90\\x21\\x14\\xbd\\x91\\x04\\x5c\\x06\\x19\\x2c\\x70\\xc4\\x2c\\x9f\\x41\\xf8\\x16\\x1c\\xa4\\x65\\x64\\xeb\\xc2\\x1a\\x4b\\xdd\\x81\\x90\\xeb\\xa2\\xae\\xb3\\x09\\x82\\x30\\x72\\xec\\x2c\\x02\\x00\\xce\\x64\\x98\\xf9\\xd7\\x2b\\x37\\xb3\\xfb\\x46\\x67\\x74\\x32\\x6d\\xf3\\x7a\\xd8\\x80\\xd8\\xed\\xdb\\x32\\xaf\\x67\\x3e\\x45\\xd8\\x8e\\xec\\x49\\xb1\\x57\\x7b\\x43\\xb8\\x63\\x91\\x11\\xc2\\xe0\\xb9\\x41\\x87\\xd2\\xd4\\xe0\\x17\\x3c\\x00\\x0f\\x4c\\x37\\xbe\\x84\\x5d\\x68\\x81\\x0b\\x78\\x89\\xff\\x2a\\x04\\x9f\\x3f\\x9f\\x24\\x5e\\xc7\\x0f\\x21\\xde\\xf9\\x77\\x80\\xb6\\x11\\x40\\x0a\\x83\\xc3\\x1a\\x79\\xd9\\x3a\\x8e\\x98\\xb6\\x08\\xfd\\xcf\\x24\\x88\\xb0\\x68\\xfe\\x1a\\xe4\\x21\\x72\\x93\\xa9\\x36\\x7b\\xb7\\x34\\xb5\\xbc\\x7b\\xd8\\x81\\x9b\\x37\\x7f\\x09\\x0b\\x4f\\x8f\\xdb\\xff\\x50\\x79\\x9c\\x76\\x88\\x0d\\x19\\x13\\x35\\x80\\xe1\\xdd\\xfc\\x2b\\x9b\\xaa\\xdd\\xba\\xb3\\x4f\\xc6\\xfd\\xc0\\x78\\x01\\x4b\\xd1\\xff\\x73\\x9d\\xaa\\xfe\\x54\\x76\\xf3\\xf7\\x9d\\x4d\\xbe\\xc2\\x16\\xfa\\x76\\x80\\xee\\x8e\\x84\\x00\\x2d\\xcb\\x9d\\xdb\\xc7\\xfc\\x1e\\x1c\\x8e\\xf4\\xf1\\xb2\\xa2\\x08\\x1b\\x92\\x82\\x24\\x3d\\xa6\\x15\\x3c\\x1f\\xce\\x09\\x05\\xcf\\x35\\xf8\\x3a\\x68\\x4c\\x01\\xb0\\x45\\x57\\xec\\x84\\xf7\\xe9\\xa9\\x4f\\xc2\\x88\\x2e\\x2f\\xf1\\x9f\\xea\\x21\\xd2\\xce\\x61\\x67\\x86\\x1c\\xe0\\x1d\\xf8\\xb8\\xd3\\xc3\\xe8\\xd2\\x55\\x61\\x0b\\x7a\\xf2\\x59\\x6c\\xd5\\xcf\\x00\\x16\\x73\\x49\\x42\\xcc\\x71\\x4c\\x27\\x2c\\x05\\xfd\\xa9\\xd3\\x47\\x23\\x62\\x66\\x46\\xa4\\x61\\x30\\x18\\x2c\\xeb\\xcf\\x17\\x9e\\xc0\\x0a\\x6a\\x17\\x3b\\xd8\\x57\\x7f\\xa8\\x45\\xc4\\x4d\\x19\\xc6\\x99\\x79\\x44\\x75\\x5f\\x2b\\x4e\\x46\\x85\\x63\\xa7\\x5e\\x90\\x16\\x52\\x3b\\x87\\xdd\\xac\\x3e\\xee\\x21\\xbc\\xbc\\xa0\\x8f\\xcc\\x29\\x54\\x6a\\x43\\xcb\\xe0\\xd8\\xd1\\x0a\\x0e\\x8d\\xdc\\xba\\x17\\x2d\\x1d\\xed\\x15\\x03\\x78\\xe1\\x8b\\x36\\x8c\\x77\\x63\\x91\\x3e\\x4b\\x40\\x70\\x12\\xfd\\x76\\xa8\\x72\\xd2\\xcb\\x04\\x93\\x0b\\x8e\\x22\\xb3\\x08\\x24\\x3d\\x4c\\xc2\\x78\\xfd\\xf2\\xe1\\xf9\\x40\\xae\\x89\\xac\\x89\\x1b\\x9e\\x06\\x61\\xae\\xe5\\x53\\x93\\x7b\\xf3\\x50\\xb4\\x07\\x07\\x0a\\x1b\\xdf\\xc4\\xf7\\xa3\\x78\\x7e\\xf3\\x99\\xd2\\xca\\xf4\\xec\\x74\\x43\\x9c\\x58\\x73\\x76\\xc7\\x7b\\xe0\\xc3\\xde\\x53\\x9d\\x3a\\xc2\\x60\\x89\\x76\\x5b\\x9b\\xe1\\x0b\\x90\\x38\\x69\\x46\\x36\\xe2\\x62\\xd7\\xba\\xa0\\xb3\\xa8\\x94\\x1a\\x20\\x15\\x96\\x76\\x39\\xf6\\x04\\x4c\\x67\\xe5\\x9b\\xc8\\x1c\\xf2\\xfb\\xa7\\x04\\xac\\x0d\\xf4\\x8d\\xa6\\x03\\x74\\x05\\xa8\\xe8\\xb8\\xa7\\xce\\x3c\\x58\\xef\\x38\\xa8\\x83\\x53\\x8b\\x24\\x7f\\xfe\\x18\\x09\\x7a\\xf0\\x95\\x24\\x2b\\x05\\x8b\\xdd\\x1e\\x3e\\x24\\x5e\\xec\\xe0\\xa7\\x1b\\x75\\xb9\\x7d\\x52\\xf2\\x0d\\x6d\\x51\\xbb\\x97\\x66\\xb0\\xda\\x0f\\xc0\\x9c\\x8a\\xc2\\xa3\\x0f\\xb6\\xe7\\xb3\\x2e\\xe0\\x6d\\xad\\xf4\\x6d\\x73\\x59\\xcc\\x06\\x6a\\xa9\\x47\\x85\\xd8\\xa8\\x82\\xff\\x09\\x7d\\x78\\xa8\\x6b\\xe2\\xd4\\x56\\x00\\xdd\\x3d\\x30\\x60\\x12\\x5f\\x01\\xc0\\x63\\xe4\\x88\\xd5\\xc3\\xef\\xee\\x1b\\xca\\x1e\\x58\\x51\\x64\\x55\\xff\\xca\\xec\\x1b\\x81\\xef\\x43\\x38\\x76\\xbf\\x09\\xff\\xa5\\x1d\\x6f\\x50\\x18\\x58\\x52\\x24\\x57\\x9c\\xb6\\x7b\\x56\\xce\\x1c\\x21\\x6e\\xc0\\xa8\\x83\\xe0\\x6c\\x8e\\x15\\x63\\x42\\x1e\\xa7\\x2b\\x0c\\x10\\xd4\\xbb\\x31\\xe4\\x91\\xc2\\xae\\x2f\\xe8\\x13\\x9f\\x24\\x9e\\xc9\\x27\\xd8\\x06\\xba\\x08\\xdb\\x52\\xb1\\xb5\\x06\\x66\\x90\\x47\\xf0\\xc1\\x16\\xff\\x37\\xac\\x5b\\xa6\\xcd\\xb1\\xea\\xaf\\x33\\xfd\\xad\\xb0\\x70\\x5c\\x79\\x9d\\x35\\xac\\x6d\\x9c\\x80\\xda\\x90\\xc1\\x43\\x8b\\x58\\x5f\\xfd\\x59\\x35\\x0a\\x26\\x86\\xb1\\xec\\x35\\x16\\x6c\\xb9\\xb6\\x9a\\xd0\\xf5\\x65\\x86\\xaa\\x03\\x27\\x4d\\x78\\x2e\\x3f\\x85\\x8d\\xb6\\x4a\\xdf\\xbf\\x04\\xd5\\x22\\x8a\\x7b\\x1c\\x4a\\x20\\x48\\xbb\\xcd\\xb9\\x41\\x15\\x3a\\x43\\x6d\\x74\\x2c\\x38\\xb5\\x8b\\x4d\\x7d\\x13\\xc9\\xf1\\xd6\\x0e\\x15\\x2a\\xa2\\x79\\x23\\x49\\xa3\\xd9\\x4e\\x7e\\x6b\\x11\\x04\\xaa\\x1b\\x87\\x09\\x98\\xc1\\x8d\\xd7\\x06\\x56\\x54\\xa8\\x52\\x81\\xbb\\x6f\\x02\\x7f\\xaa\\xd5\\x56\\xb1\\xf5\\x32\\xe7\\xa1\\xe2\\x2d\\x56\\x40\\x69\\x28\\x95\\x87\\xa0\\xef\\xc9\\xc1\\x58\\x5d\\x13\\x5f\\x31\\x23\\x3c\\x41\\xf4\\x40\\x46\\x6e\\x71\\xfe\\x90\\x12\\xe5\\xf9\\xa0\\xd7\\x4a\\x72\\x82\\xee\\x39\\x2f\\xb0\\x16\\x5d\\xb7\\x9f\\xf1\\xd3\\x17\\x6e\\xd0\\x8a\\xfe\\x1d\\xaa\\x66\\xcf\\xbf\\x43\\x05\\xae\\x16\\xac\\x17\\x92\\x33\\x43\\x99\\xf7\\x1b\\x19\\x17\\xdd\\xec\\x27\\x0a\\xcf\\xf6\\x65\\xea\\x05\\xd1\\x84\\xc2\\xc5\\xcd\\x2c\\xcd\\x90\\x2b\\x22\\xf9\\xb7\\x19\\x5e\\x66\\xa6\\x55\\x56\\xca\\x88\\x4b\\xa6\\xf5\\xda\\x04\\xdc\\xd4\\x61\\x7f\\x33\\xdc\\x2b\\x44\\xa0\\xea\\x74\\x2a\\xeb\\x2b\\x93\\xf3\\xa4\\x1d\\xf7\\x95\\x7a\\x02\\x67\\x97\\xa5\\x85\\xce\\xee\\x81\\x4b\\x19\\x75\\xf5\\x23\\xd2\\xdb\\x5d\\xbb\\x9b\\xe0\\xca\\x64\\x9d\\x1d\\x45\\xdc\\xfd\"},\n{{0xd2,0x90,0xff,0xd9,0x33,0x95,0xbd,0x5f,0xc5,0x87,0xd1,0xab,0x51,0x18,0x66,0xe7,0x2b,0x37,0x1a,0x17,0x35,0x73,0x2d,0x9d,0x5c,0x6a,0x18,0xdd,0x46,0x5e,0x93,0x63,},{0xfd,0x4a,0xad,0x73,0xb0,0x32,0x46,0x1c,0xa0,0xaa,0xe8,0x71,0xca,0x70,0x16,0x38,0x3b,0x2b,0xe0,0x16,0x90,0x53,0xfd,0xbf,0x6c,0x59,0x14,0xfd,0xd6,0xdd,0x6f,0x92,},{0x21,0x70,0x4d,0x5e,0x62,0x6d,0xcf,0x6a,0x9d,0xcd,0xef,0x93,0x54,0x29,0xeb,0x7f,0xb5,0xb2,0x57,0xee,0xcd,0x7b,0xf7,0x4a,0xcb,0x0c,0xd3,0x0e,0xcf,0xcf,0x60,0x8d,0x0c,0x5b,0x63,0x3a,0x4a,0x8a,0x9b,0xa2,0xcc,0x82,0xa2,0x1e,0x03,0x35,0x5e,0x01,0xd8,0x5d,0xae,0x7e,0xca,0xc8,0x89,0x6d,0xc1,0x5d,0xae,0x04,0x85,0x70,0x71,0x04,},\"\\xeb\\xd9\\x00\\xbc\\x91\\x0c\\x5e\\xcc\\x4d\\x97\\xda\\xf7\\xcb\\x5e\\xbb\\x54\\x91\\x50\\x0b\\x7a\\xd1\\x16\\xe3\\x06\\x60\\x95\\x07\\x09\\xd8\\x08\\x4b\\xb6\\x43\\x4c\\x5b\\xea\\x4a\\x8c\\xcc\\x1e\\xd5\\xa8\\x01\\xbe\\xbb\\x1a\\x11\\x78\\x78\\xc0\\x37\\x47\\x00\\x3e\\x14\\x8e\\xd9\\x14\\x34\\x83\\x2e\\x89\\x66\\x24\\x1a\\x7f\\xff\\x22\\xfe\\x1d\\x6d\\x8c\\x3c\\x3d\\xdd\\x72\\x15\\xa1\\xef\\xaf\\x4b\\x07\\xaf\\xee\\x1b\\x25\\x67\\x3a\\x14\\x39\\xea\\xac\\x32\\x4e\\x89\\x5d\\x4b\\xe8\\x39\\xe9\\x76\\xc0\\x3a\\xc0\\x01\\x25\\x48\\x76\\x88\\x8c\\xca\\xaf\\x39\\x12\\x72\\x7a\\x60\\x10\\x6a\\x87\\xbe\\x69\\x24\\x7c\\x9e\\x43\\x8c\\x31\\xfc\\xa8\\xd9\\xc6\\x1b\\xae\\x36\\x8c\\x83\\xe4\\x09\\x01\\xa9\\x97\\x00\\xdf\\xf8\\x39\\xb5\\x13\\xba\\x8d\\xc4\\x2d\\x93\\xce\\x09\\x87\\xa2\\x33\\x34\\x70\\xa9\\xf9\\x83\\x31\\x3f\\x91\\x98\\x86\\x59\\xda\\x54\\x03\\x9e\\x49\\x9c\\xd1\\xaf\\x2b\\x8f\\xa0\\xeb\\xe7\\x50\\xe2\\x4d\\x55\\xc2\\xa5\\xbd\\x1a\\xde\\x3f\\x68\\x00\\x92\\x54\\x2b\\xd1\\xbe\\x0b\\x97\\x35\\xba\\x39\\x3a\\xd5\\x69\\x7d\\x24\\x1e\\x8e\\x8b\\x28\\x64\\x6d\\xb2\\x7d\\x2f\\xb5\\xa9\\x40\\xe8\\xfa\\xea\\xf0\\xb6\\xc9\\xef\\xda\\x88\\x61\\x5d\\xec\\x89\\x1c\\xe7\\x32\\x93\\x08\\x13\\xbf\\xbb\\xd0\\xbc\\x5f\\x82\\x10\\xab\\xe8\\x43\\xbe\\xb5\\xe4\\xf0\\x28\\xf4\\x9b\\xea\\x34\\xf1\\xe5\\xb0\\x9e\\xac\\x4c\\x66\\x62\\xc7\\x4f\\xba\\x39\\xde\\x4a\\x96\\x02\\xa9\\x69\\x4a\\x85\\xc7\\xc1\\x37\\x5f\\xda\\xdf\\xda\\x6a\\x19\\x57\\xfc\\x5b\\x59\\x87\\xa6\\x87\\xb0\\x39\\x95\\xe5\\x16\\x97\\xa1\\xab\\x5b\\xb6\\xcb\\x11\\xb6\\x63\\xc1\\x37\\x2f\\xad\\xe4\\xc0\\xac\\xa8\\xfb\\xeb\\xb4\\xeb\\x54\\xce\\x7c\\xe3\\x6c\\x69\\x04\\xea\\xf6\\xea\\xb2\\xf3\\x4f\\xac\\xd8\\xc7\\x68\\xc8\\xd3\\x6d\\xa2\\x39\\x7b\\x1a\\x02\\x73\\x5a\\xea\\x72\\xcf\\xaa\\xd0\\x39\\x34\\x10\\xdb\\x52\\x7a\\x8a\\xb2\\x36\\xd4\\xcd\\xab\\xdc\\x88\\x8f\\xac\\x6f\\x18\\x21\\x48\\xb1\\x32\\x61\\x44\\x25\\xd3\\x90\\xff\\x03\\x6e\\x54\\x85\\x5e\\x42\\x03\\xc5\\x12\\x03\\xc1\\xf4\\x3e\\x37\\xbb\\xf6\\xb9\\xbf\\x27\\xf5\\xb7\\xe7\\xc6\\x65\\x15\\x14\\x65\\x40\\x1a\\xc3\\x2c\\xbe\\x9e\\x33\\x50\\x53\\x5e\\xdf\\x48\\xa7\\xbc\\x36\\x03\\xe2\\x23\\x2e\\x93\\x8f\\x9a\\x81\\x5a\\xc4\\xd1\\xde\\xec\\x99\\x1e\\xf9\\x62\\x09\\x48\\x44\\x1f\\x7a\\x2f\\x4a\\x46\\xe2\\xc4\\x00\\xab\\x91\\x4c\\x4b\\xe5\\x1d\\xca\\xad\\x8e\\xd8\\x23\\x9c\\xbb\\xe9\\x77\\xa9\\xf0\\x9c\\x02\\x69\\x83\\x19\\xd9\\xfe\\x2a\\x8c\\x6e\\xb6\\x0b\\x79\\x9f\\x29\\xae\\x76\\x59\\x97\\x0d\\x2e\\xbd\\xff\\x3c\\x6c\\xf7\\x09\\xbb\\xf6\\xf4\\xbb\\x55\\xb9\\xdf\\x4f\\x61\\xa2\\x41\\xde\\xc1\\x44\\xb5\\x99\\x3f\\x08\\x7e\\x78\\x4b\\x97\\xbe\\x1e\\x53\\x60\\x8c\\x2e\\x81\\x7c\\xe3\\xd9\\xaa\\xf9\\x14\\xe6\\xb7\\x23\\xf5\\xb4\\xaf\\xff\\xd2\\xa6\\xb9\\xfe\\x9d\\x2d\\x73\\x91\\x5c\\x7a\\xd1\\xff\\xb1\\x3e\\xfc\\xb7\\x3c\\x56\\x23\\x81\\x95\\x64\\x52\\x03\\x98\\x4c\\x99\\xaa\\xfd\\x02\\x35\\xf7\\x3b\\x3f\\x88\\x2e\\x07\\x39\\x39\\xbf\\x78\\x66\\x57\\x28\\x01\\x38\\xdb\\x05\\xb8\\x6f\\xcc\\x94\\x60\\xb3\\x85\\xef\\x45\\x59\\x20\\x4e\\xcd\\x81\\xe2\\xf1\\x2f\\x5f\\x06\\x2a\\xa4\\x48\\xdc\\xcc\\x82\\xea\\x8d\\x89\\x46\\x6d\\xd1\\xbe\\x46\\xf8\\x2c\\x4f\\x87\\xbf\\x0d\\xb2\\xb8\\x78\\xac\\xbb\\x0d\\x91\\x12\\xc8\\xdb\\x6f\\x51\\xd3\\x5f\\x6d\\x42\\xf7\\x49\\x85\\x6b\\x99\\xe5\\x50\\xb6\\xc4\\x54\\xe9\\xe8\\xbe\\x4d\\xa1\\x75\\xf0\\xb5\\xe8\\x6b\\xe6\\x6c\\x97\\x9f\\xd8\\x78\\x23\\x7e\\x57\\xf6\\x91\\xf0\\xd2\\xac\\xd0\\x28\\xfb\\xff\\xa5\\xb0\\x66\\x87\\x75\\x03\\x4d\\xb1\\xf2\\x1d\\xdb\\xe7\\x11\\x4e\\xe3\\xdc\\x0b\\x44\\xda\\xca\\x64\\xc5\\xa0\\x3a\\x2f\\xee\\xae\\xab\\xeb\\x70\\x63\\xbf\\xcc\\xcc\\x55\\x9b\\xaf\\x27\\xf1\\xcc\\xb2\\x20\\x2f\\xa4\\xd1\\xb2\\xbf\\x44\\xc0\\x4b\\x2c\\x2f\\x81\\xf9\\x4e\\x28\\x1b\\x1a\\x5a\\xdc\\x85\\x0d\\xa1\\xb9\\x47\\x9f\\xca\\xbd\\xda\\xde\\xa5\\x6a\\x11\\x5b\\xb5\\xf0\\x6c\\xc0\\x16\\xf1\\x41\\xc0\\xfc\\xb5\\xe8\\x3a\\xb2\\x48\\xea\\xec\\x90\\x15\\x8d\\x8b\\xe6\\x47\\xaf\\xf1\\x2e\\x7e\\xeb\\x5e\\x57\\xdb\\xcc\\x29\\x3c\\xb3\\xb6\\xaa\\xcb\\x55\\x23\\x6d\\x4a\\x83\\x9a\\x06\\x20\\xf4\\x76\\x23\\x87\\xdd\\x17\\x14\\xdf\\x5c\\x13\\x5e\\x3d\\x9d\\x68\\x24\\xf9\\x3b\\x7c\\x90\\xd3\\xae\\x38\\xc5\\x18\\xd6\\x07\\x12\\x0c\\x83\\x95\\x70\\x41\\x3b\\x46\\xb8\\xcc\\xd7\\x37\\x04\\x92\\xd8\\xae\\x5c\\x60\\x9e\\x00\\xcf\\x82\\x51\\xe2\\xe7\\xdf\\x81\\xe5\\xb4\\xf9\\xc1\\x6a\\x5a\\x53\\x9f\\x0a\\xfc\\xce\\x41\\xbb\\x43\\x62\\xe5\\xea\\xa5\\xf9\\x40\\xa1\\x70\\x6f\\x4a\\xfb\\x6b\\x14\\x43\\x2c\\x81\\xd4\\xba\\x1a\\x33\\xd3\\x22\\xdb\\xf1\\x06\\x45\\xab\\x63\\x73\\x7e\\xad\\xc8\\x6f\\xe6\\xe0\\x97\\x6f\\x76\\x33\\x97\\xfb\\x89\\x86\\x37\\x59\\x5d\\xfd\\x36\\x93\\x47\\x92\\xd7\\x79\\xe2\\x4c\\x2a\\x3f\\x0b\\xac\\xf5\\x3e\\x04\\x73\\xc5\\xfd\\xa9\\xc6\\x12\\x84\\xe4\\x41\\x9b\\xdc\\x0e\\xef\\x5d\\x22\\xf4\\xd9\\xbf\\x42\\xe8\\xc0\\x49\\x33\\xbb\\x93\\xb5\\x3c\\x29\\x5d\\x7a\\xc9\\x39\\x5a\\xbb\\x6d\\xcb\\xd7\\x42\\xb1\\xe1\\xbc\\x3b\\x0e\\xa4\\x43\\x4e\\xa2\\x1b\\x8e\\xca\\x9a\\xe6\\x82\\xd3\\x31\\x5a\\x41\\xe9\\xc3\\xc3\\x37\\x18\\x40\\x76\\x1d\\xc5\\x9c\\xac\\x45\\xda\\x7e\\x38\\x13\\xe2\\x87\\x88\\xdc\\x89\\xde\\x35\\x5b\\x5a\\xee\\x08\\x80\\x90\\xa3\\x8d\\xd3\\x9d\\x83\\xe5\\xe4\"},\n{{0xd7,0xfd,0x73,0xd1,0xd2,0x29,0xa6,0x58,0x94,0x42,0x0e,0x4b,0xa7,0x34,0x27,0x0d,0x5a,0x20,0x75,0x83,0x64,0xde,0x89,0x7d,0x85,0x55,0xe2,0x41,0x97,0x45,0x3c,0x19,},{0x3c,0x22,0x77,0x2a,0xec,0x0a,0x0c,0x15,0x59,0x07,0x7f,0x2c,0xfd,0x1f,0x24,0x65,0xd4,0xb4,0x84,0x95,0xc5,0xd0,0x5f,0x1f,0x83,0x7c,0x31,0x84,0x5f,0x34,0xca,0xd1,},{0x40,0x0c,0x35,0x05,0xf1,0xdf,0xa8,0x0d,0xf4,0xb2,0x6d,0xb2,0x4c,0x02,0x7e,0xb8,0x19,0x77,0xf0,0xfb,0x9b,0x5a,0xca,0x52,0x4a,0xd5,0x12,0x00,0xf4,0xbf,0xb1,0x33,0xdb,0x83,0x48,0x23,0x31,0x41,0x95,0xf4,0xed,0xc2,0x92,0xd5,0xf5,0x30,0xd0,0x85,0x56,0xe7,0x80,0x9c,0xaf,0x23,0x39,0x76,0x8a,0xa3,0x80,0x29,0xfd,0xbc,0x28,0x0f,},\"\\xc9\\x22\\x58\\x59\\xd5\\x55\\xbc\\x42\\x01\\x1a\\xf1\\xb4\\xf1\\x49\\x98\\xe6\\xe9\\xb0\\xa6\\x5e\\x21\\x72\\x71\\x3e\\x96\\x83\\x80\\xfb\\x6c\\xee\\xdd\\xa2\\x2e\\x02\\x2c\\x51\\x30\\x30\\x31\\xd9\\x93\\x1c\\xce\\xf2\\xf7\\xbc\\x70\\x5c\\x9e\\x21\\x5c\\x1d\\x08\\x9d\\x48\\x8d\\xad\\xda\\xee\\x15\\x5c\\x93\\x9b\\x62\\x02\\xca\\x53\\xbf\\xc7\\xf6\\xe8\\x8e\\x15\\x29\\xd8\\x2f\\xb4\\x5e\\x02\\xb5\\xd0\\x5a\\x82\\xbb\\xb9\\xdb\\x5f\\x41\\x5c\\x58\\xba\\x8b\\xd5\\x6c\\xff\\xd9\\x22\\x70\\xb2\\x47\\x49\\xe5\\x6d\\x12\\xc9\\x9a\\xe9\\x0c\\x78\\x00\\xf5\\x4f\\x55\\x25\\x4e\\xa4\\x2d\\xa5\\xdc\\xfb\\xe0\\xe1\\xd9\\x89\\xcd\\x2f\\x68\\x97\\xe2\\x32\\xdf\\x04\\x70\\x7b\\x34\\xaf\\x75\\xfa\\x7f\\xec\\x33\\xe5\\x5e\\xd5\\x6a\\xee\\x39\\xc2\\x2b\\x04\\x5b\\xed\\xd1\\x61\\x08\\x3b\\xc5\\x51\\x4c\\x1f\\x81\\xca\\x90\\x7b\\x7c\\x76\\x03\\x17\\xa7\\xfd\\x5a\\x5a\\x02\\xa5\\xd4\\x0e\\x2e\\x82\\x3e\\x24\\xad\\x96\\xae\\xf6\\xda\\x8e\\xa9\\x82\\xb5\\x16\\x1c\\xc3\\x9d\\x84\\xaa\\x2f\\xfd\\x95\\x44\\xc1\\x1b\\x63\\x40\\x37\\xab\\x0a\\x1c\\x8e\\x36\\xac\\x63\\x01\\x9d\\xa1\\xb2\\xd9\\x95\\xcb\\x7b\\xd3\\xd6\\x2f\\xe5\\x74\\xde\\xab\\xcc\\xbd\\x0d\\x3a\\xe7\\xa5\\x6e\\x5b\\xec\\x91\\xe4\\xba\\x3f\\x3d\\xb8\\xbf\\xea\\x88\\xe6\\x7d\\xa6\\x2e\\x88\\x27\\x8a\\x6e\\x3b\\x41\\x8d\\xce\\xea\\x05\\x89\\xf2\\x5f\\x7d\\xd8\\xad\\x19\\xdd\\x84\\x50\\x89\\x41\\x9b\\x47\\x2e\\xfc\\xcc\\x87\\x9c\\x17\\x2b\\x32\\xee\\x4a\\x4d\\xbc\\x2e\\x6c\\x2e\\x86\\x5b\\xb3\\xb8\\xca\\x0a\\xdc\\xb7\\x1f\\xdf\\x89\\xe1\\x97\\x39\\x10\\xef\\x24\\x29\\x15\\xf3\\x3e\\x23\\x6d\\x2f\\x7c\\x8e\\x9f\\x1e\\xe5\\xb0\\x7c\\x6e\\x3c\\x25\\x36\\x0f\\x8c\\xb1\\x46\\x0b\\xe8\\x7d\\xb3\\x1a\\x29\\x1d\\x4d\\xee\\x34\\x95\\x3e\\x75\\xc6\\x75\\xbf\\x18\\x1b\\xb7\\xa0\\xb7\\xb5\\xc1\\xbe\\xfd\\xc8\\x6a\\xda\\x07\\x2a\\x48\\xf6\\xac\\x75\\x5d\\x49\\x9b\\xd6\\x8d\\x62\\x5d\\x85\\x14\\x52\\x5c\\xc3\\xab\\x8f\\x54\\xce\\x15\\xa8\\x71\\x29\\x17\\x78\\xde\\x13\\x05\\xd2\\x21\\x93\\x61\\xaa\\x30\\xe3\\x32\\xa2\\xe0\\x69\\x07\\x7c\\x5c\\x53\\x45\\x75\\x20\\x37\\x9d\\x8b\\x90\\xd2\\x4b\\xd8\\xa3\\xa7\\x70\\x0f\\xf7\\x66\\x23\\x1c\\xb5\\x69\\x7f\\x9a\\xce\\x52\\x1a\\x99\\xe8\\x96\\xda\\x54\\xc4\\x07\\x93\\xbc\\x7c\\x1f\\xb1\\x58\\x4b\\xb1\\xc8\\x61\\x94\\xd2\\xfb\\x7a\\x4b\\x80\\x2f\\x30\\x88\\x5e\\x0e\\xe8\\xaf\\x88\\xd6\\x88\\x6e\\x3a\\x3a\\x4d\\x4c\\x85\\x46\\x49\\xcc\\x01\\xab\\xdf\\x35\\x31\\x9a\\x08\\x56\\xcc\\x65\\xd0\\x92\\xa3\\x86\\xf8\\x86\\x96\\x25\\xcd\\x0a\\xca\\xc0\\x87\\xe9\\x35\\x17\\x90\\xcc\\xb4\\xa8\\x65\\xf6\\x51\\xa8\\x81\\xc3\\xeb\\xf1\\x09\\x07\\x27\\x74\\xf9\\x40\\xf5\\xaa\\x98\\xa2\\xa2\\xaa\\x3d\\xd3\\x66\\x47\\xd0\\xde\\x83\\x00\\x1a\\xa7\\xcd\\xc0\\x31\\xcc\\x4a\\x4d\\x75\\xdc\\x11\\xce\\x55\\x16\\x76\\xa2\\xad\\x43\\xa3\\xf6\\xa1\\x6a\\x4b\\xc5\\xae\\xe8\\x0e\\x53\\x64\\x20\\x60\\x87\\x36\\x4e\\xb8\\xb2\\xb1\\x5f\\xb7\\x05\\x38\\x0a\\x07\\x2d\\x7c\\x8b\\x51\\x99\\x59\\x43\\xaa\\x76\\x2e\\x8d\\xeb\\x4c\\x56\\x8c\\xda\\xa1\\x41\\x1a\\xb6\\x8f\\x28\\x48\\x9e\\x13\\x23\\xbb\\x61\\x56\\xce\\x25\\x00\\xb0\\x6e\\x77\\x93\\xc5\\x10\\xa3\\xde\\x29\\x15\\x08\\x40\\xbf\\xdb\\x0b\\x2b\\x7b\\x21\\xc2\\xbb\\x8a\\x77\\x46\\x16\\x7c\\x92\\x9d\\xd0\\xad\\xad\\x44\\xfe\\xd8\\xf3\\x6e\\x83\\x81\\xb3\\x42\\x08\\x0b\\x2a\\x7d\\x82\\xa3\\xf8\\x1f\\xf7\\x26\\x30\\xcb\\x78\\xdf\\x91\\xf7\\xb6\\x5a\\x44\\xef\\xf6\\xed\\x64\\xd4\\x8a\\xfe\\xd1\\x09\\xdd\\x7a\\x69\\x3a\\x1b\\xa8\\xc3\\x7e\\x00\\x8f\\xcb\\x15\\x7e\\x37\\x29\\x7d\\x32\\xeb\\xa7\\x65\\xa6\\xc7\\x19\\x3e\\x73\\xbd\\x97\\x64\\x79\\x85\\xb1\\x60\\x38\\xc7\\x4a\\x08\\x4a\\x8f\\x25\\x65\\x4c\\xd8\\xcd\\x2c\\xdd\\x27\\xff\\x17\\x33\\x4e\\x06\\xad\\xaa\\x05\\x82\\x64\\x01\\x7a\\x3b\\x2d\\xa7\\x8e\\x57\\x38\\xa2\\x7e\\x35\\x0d\\x88\\x2f\\x5f\\xae\\x19\\x92\\x78\\xd4\\xe5\\x0b\\x8b\\xad\\xf5\\x7c\\x21\\x41\\xdf\\xdc\\x3c\\xff\\x99\\xdf\\x5d\\xe8\\x6f\\xec\\x29\\x3c\\x76\\xcb\\x94\\xb6\\xb1\\x9b\\xa3\\x03\\x4e\\x46\\x0f\\x84\\xc2\\x80\\xa2\\xe6\\x41\\x2f\\xab\\x56\\x98\\xce\\x89\\x02\\x07\\xca\\xba\\xbc\\xa0\\xa9\\x5b\\x5a\\xd5\\x33\\xce\\x11\\x4b\\xf7\\x1a\\x40\\x4a\\x87\\x59\\x0d\\x35\\xfa\\x7c\\xed\\xba\\x43\\x13\\x1c\\x4e\\xe9\\x23\\x44\\x83\\x9f\\x25\\xcb\\xfa\\xeb\\x12\\xae\\xeb\\xc8\\x04\\x08\\x93\\x95\\x1a\\x34\\x6b\\xd2\\x8f\\xdd\\x16\\x7b\\xd2\\x0f\\x71\\xa1\\xe5\\x9f\\xb6\\x0d\\x55\\xe1\\xc5\\x67\\xf4\\x78\\xf0\\x27\\xcf\\x67\\x9a\\x37\\xd1\\xd9\\xdb\\x86\\x7e\\x17\\xbf\\xdd\\x60\\xb3\\x47\\xd8\\x9d\\x32\\x26\\x39\\xd3\\x15\\xbb\\x7a\\x2c\\x91\\x34\\xf0\\x0e\\xa0\\x3a\\x36\\x7f\\x30\\x5e\\xa4\\xd6\\x0d\\xc9\\xd5\\x67\\xcf\\x92\\x48\\x51\\xe4\\x69\\xea\\x95\\x4e\\xd3\\xea\\x63\\xea\\x86\\x06\\xf7\\x9f\\x07\\x73\\x39\\xbf\\xa2\\xb5\\x1a\\xe4\\x9b\\xaa\\x0f\\xb2\\x53\\x77\\x82\\x1d\\x7c\\x11\\xef\\x9a\\xd4\\xbb\\x4c\\x0f\\xe4\\x89\\xac\\xba\\xb0\\xef\\x00\\x0d\\x61\\x8c\\x7a\\xf5\\xef\\xd2\\x05\\xd6\\x85\\x99\\xfc\\xbd\\xd9\\x5e\\x28\\xf8\\x36\\xe0\\x91\\x6f\\x9f\\xf5\\x48\\xd0\\xba\\x17\\xda\\x62\\x53\\x6e\\x74\\x64\\x68\\x01\\xee\\xb6\\x12\\x2b\\xa3\\x2c\\x41\\x07\\x3a\\xe0\\x4e\\x42\\xc6\\xc1\\xd5\\xd8\\xd2\\x29\\x76\\xa5\\x62\\x26\\xdd\\xf4\\xb6\\xac\\x95\\x45\\x5f\\xb5\\x30\\x99\\xf2\\x02\\x15\\xb2\\xeb\\xc9\\x07\"},\n{{0xfd,0xa7,0xcb,0x08,0x40,0x16,0xba,0x51,0x3c,0x7c,0x4f,0x8f,0x71,0x80,0x48,0x0b,0xb1,0x81,0xe9,0x56,0x95,0xea,0x68,0x73,0x7f,0xa3,0x4a,0x40,0xec,0xbd,0xf3,0xef,},{0xa2,0xde,0x3a,0x0e,0xf9,0x72,0x98,0xfd,0x71,0x61,0x06,0xe2,0xf3,0xf5,0x45,0x13,0x05,0x7a,0x40,0x07,0x2d,0x23,0x4c,0x35,0x18,0x15,0x4c,0x1b,0xd1,0x2d,0xe0,0x37,},{0x33,0x61,0x4b,0x7a,0x94,0xf7,0x5e,0x03,0x65,0x34,0xd7,0x6e,0x30,0x14,0x7e,0xcc,0xdd,0x2a,0x04,0xe0,0x0c,0xd4,0x70,0x4a,0xb6,0xe8,0x07,0xd6,0xa2,0xac,0xc1,0xe1,0xd9,0x63,0xb8,0xee,0xe0,0x81,0x0d,0x41,0x2d,0x9d,0x56,0xe5,0x45,0x56,0x30,0x2b,0x10,0x73,0x0c,0x15,0xab,0xf8,0x9c,0x29,0xa0,0x27,0x30,0x3e,0xa8,0x8a,0xe7,0x01,},\"\\xc2\\x1b\\xb3\\xf8\\xe3\\x7b\\xef\\xa3\\x67\\xc9\\x13\\x67\\x31\\x01\\xba\\x30\\xd3\\xb5\\xc7\\x4b\\xd8\\xbd\\xb0\\x9c\\xd2\\x86\\x40\\x01\\x2d\\xb4\\x11\\x20\\xc2\\xbc\\xc4\\x08\\x5d\\xe2\\xa0\\xf9\\x5c\\x92\\x15\\xdd\\xef\\x8c\\xb5\\xfc\\x8d\\x8b\\x12\\x51\\xb4\\x15\\x27\\xc6\\x7d\\xfa\\xa3\\xf9\\x5b\\xa3\\x57\\x83\\x91\\xea\\x5a\\x66\\x29\\xa7\\x33\\x09\\x5f\\xd0\\xa4\\x3f\\xdb\\xa4\\x0f\\xfe\\x26\\x0f\\xff\\x82\\xac\\xee\\x2e\\xbe\\x98\\x0e\\x9e\\xce\\xcc\\xfe\\x7e\\x10\\xb2\\xed\\x8c\\x2e\\x6b\\x41\\x0d\\x54\\x7a\\x12\\x86\\x57\\x1d\\xf3\\xd7\\x01\\x17\\x4e\\x57\\x9f\\xcf\\x19\\xd3\\xbd\\x80\\x86\\xc0\\x42\\x3f\\x37\\x11\\x77\\x89\\xf3\\x05\\xd9\\x67\\x0a\\xd2\\x8c\\x99\\x67\\x4f\\x52\\xcf\\x64\\x21\\x1a\\x08\\x1d\\x0c\\x6c\\x30\\x96\\xda\\x2c\\x71\\xbf\\x5f\\x57\\x99\\xa7\\x91\\x0e\\x6f\\x38\\x10\\x4a\\x37\\xa6\\x55\\x7c\\x2d\\xae\\xf3\\x40\\x81\\x4a\\x1f\\x83\\x0d\\x59\\x37\\x73\\xc6\\xcf\\x48\\xd8\\x3e\\xa0\\x72\\x94\\xb9\\x4e\\xb0\\x80\\xb8\\x5d\\x69\\x70\\xe2\\x8f\\x40\\x51\\xd5\\x06\\x6d\\xb1\\x0e\\x96\\x19\\x73\\xa6\\x26\\xa8\\x26\\xae\\xaf\\x8a\\x06\\xec\\x0d\\x56\\x6b\\x7e\\x0c\\x4e\\xf6\\x0f\\x0c\\x56\\x78\\xfc\\xbb\\x5b\\x2a\\xc6\\x3f\\x7b\\xed\\x06\\x44\\x8a\\x24\\x7b\\x3d\\x42\\x7b\\x87\\x08\\x6d\\x33\\x57\\x3f\\xb2\\xd7\\x22\\x8c\\x5c\\x34\\xea\\x66\\x40\\xee\\xfa\\x95\\x64\\x48\\x5a\\x79\\x63\\x8e\\x9c\\x97\\xc0\\xaf\\x84\\xcf\\xee\\x7c\\xe4\\xa7\\x39\\x22\\x0c\\x84\\x29\\xe0\\x67\\x14\\x39\\x53\\xd5\\x50\\x66\\x8d\\xad\\xc8\\x4e\\x7b\\xed\\x9a\\xb0\\x70\\xa5\\x94\\x33\\x90\\xc6\\x11\\xd7\\x5b\\x1c\\xb1\\x28\\x73\\xa3\\x7d\\x98\\x50\\x66\\x1a\\x00\\x77\\xbf\\xa9\\xca\\x9b\\x8b\\x26\\x37\\x66\\xc1\\x49\\xff\\x0e\\xe4\\xb4\\xad\\xba\\x25\\xea\\xf7\\xd7\\xf5\\x01\\xf3\\x62\\x45\\x42\\x56\\xbc\\x12\\x69\\x37\\x8e\\xf3\\x35\\x9a\\x8e\\xd6\\xb9\\x60\\xb8\\x66\\x21\\xfa\\x3b\\x61\\x3e\\xb1\\x32\\x12\\x2f\\x49\\xf2\\xeb\\x2c\\xeb\\x68\\x32\\xa3\\x99\\x1e\\x96\\x1c\\xb0\\xe7\\x8b\\x74\\x2e\\xf4\\xd6\\x5e\\x8d\\xe3\\x46\\x96\\x66\\xfe\\xc7\\xc5\\xb8\\x74\\x78\\x95\\x71\\xc5\\xc9\\x9a\\x2c\\x02\\xa0\\x53\\xff\\x7d\\x2f\\xc9\\x00\\x76\\xba\\xfe\\x1f\\x26\\x7f\\xa8\\x1a\\x39\\x90\\xf2\\x7f\\xf1\\x4f\\x03\\x00\\x0a\\xf0\\x0c\\x59\\x28\\x6c\\xb9\\xbb\\x98\\xe2\\x04\\xe9\\x01\\x90\\xae\\x2a\\x50\\xed\\xef\\x04\\x9e\\xa9\\x2a\\x1f\\x78\\x50\\x88\\xf9\\x4a\\xdf\\x65\\x88\\xfb\\x43\\xbb\\x40\\xfb\\xe2\\x32\\x42\\x35\\xcc\\x7e\\x16\\x8b\\x80\\x26\\x4b\\x06\\x9f\\x94\\x4f\\x50\\x36\\x92\\xc9\\x49\\x23\\x4d\\x5b\\x76\\xbc\\xff\\xab\\xe2\\x9f\\xf9\\x06\\x4b\\xd7\\xcb\\xed\\x9e\\x00\\xe5\\xb7\\xfd\\xda\\x43\\x12\\xeb\\x80\\x14\\x65\\xf1\\x27\\xd0\\xca\\x68\\x83\\x2a\\x7f\\x4e\\xd0\\xea\\xed\\x8f\\x55\\x9c\\x16\\x31\\xcd\\x4d\\x34\\xf0\\xdc\\x41\\x4d\\x9f\\xcf\\xe8\\x49\\xa9\\x1e\\x25\\xf3\\xe0\\xff\\x01\\x3a\\x8c\\xff\\xa8\\x06\\xed\\x8e\\x93\\xd0\\x8a\\x1e\\x5a\\x75\\x76\\x82\\xca\\x3d\\x26\\xab\\xc8\\x69\\xc7\\x6f\\x1c\\x79\\x00\\x7d\\x55\\x9d\\xfe\\x67\\xe7\\x8d\\x8a\\xf0\\x19\\x58\\x08\\xb0\\xe7\\x71\\xc7\\x1e\\x64\\xb5\\x71\\x6f\\xb3\\x63\\x09\\xc2\\x50\\x25\\xfa\\xe6\\x41\\x4c\\x28\\xbb\\xdb\\xd4\\xde\\x59\\x7a\\x74\\x99\\x6c\\x9d\\xa9\\x74\\x92\\x0d\\x59\\xe6\\xf4\\xc2\\xed\\xfe\\x11\\x0f\\xf8\\x17\\xfd\\x48\\x0a\\x50\\x80\\x97\\x80\\x48\\x86\\x57\\x12\\x05\\x8c\\x5f\\xe7\\xb5\\x60\\xb1\\x2b\\x67\\xf7\\x37\\xea\\x6e\\x2a\\xf9\\x24\\x2c\\xf0\\x7a\\xd0\\xa8\\xa6\\x79\\xf2\\x64\\x30\\x04\\x6a\\xdc\\x3e\\x70\\x66\\x4c\\xc9\\xc0\\xee\\x5a\\xbc\\xef\\x6d\\x72\\x6b\\x4e\\x04\\x17\\x60\\x48\\xb7\\x95\\xbe\\x12\\x85\\x1b\\xdb\\x74\\x00\\x3a\\x13\\x20\\x41\\x19\\xb8\\x68\\x64\\xd6\\x53\\x5b\\xa0\\x95\\x04\\x0a\\x85\\xd9\\x78\\x1c\\xf4\\xf3\\x48\\x0a\\x30\\x4e\\x22\\x7f\\x78\\x7a\\xd5\\x38\\xe6\\x8f\\x4b\\xab\\x01\\x41\\x79\\xe3\\x0d\\x3f\\xde\\xf9\\xef\\xf1\\x1b\\xcf\\x47\\x1f\\xa3\\xa0\\xbc\\x74\\xb5\\x57\\x6f\\x30\\x2d\\x3a\\x6b\\x49\\x9f\\x11\\xf2\\xef\\x32\\x6a\\xc0\\x26\\xc9\\x8d\\xb1\\x0e\\x27\\x41\\x41\\x3f\\x32\\x22\\x28\\xb3\\xcf\\xf0\\xf3\\x37\\xba\\x2f\\x29\\x4c\\x78\\xef\\x73\\xf0\\xe8\\x77\\x87\\x8f\\x8f\\xc7\\xff\\x6d\\x10\\xbc\\xe6\\x6a\\xd6\\x28\\x43\\x79\\xb8\\x0c\\xa8\\x93\\x27\\xd4\\xdb\\x0b\\xf1\\x4e\\x6d\\x8f\\x01\\xb2\\x2a\\xb2\\x02\\xb7\\x16\\xcc\\x07\\xe3\\xc8\\x86\\x6d\\x16\\x8a\\x50\\x94\\xba\\xc5\\xa4\\x95\\xe7\\x38\\x68\\xee\\xdc\\x27\\x22\\x2e\\x64\\x44\\xf8\\x3b\\xcf\\x65\\xac\\xdc\\x3e\\xc8\\x91\\x20\\xbb\\x50\\xe8\\xab\\xfc\\x28\\xb7\\x8e\\x6d\\x98\\x0c\\x77\\x5f\\x48\\x49\\xa0\\xe8\\xca\\xda\\x80\\x24\\x0b\\xca\\x24\\x5e\\x39\\x96\\x6e\\x89\\xa0\\x34\\x4d\\xf8\\x36\\x3a\\x7d\\xcc\\x81\\xb2\\x01\\xce\\x9c\\x75\\x3a\\xd5\\x44\\xe1\\x12\\x4e\\x21\\x02\\x0d\\x4c\\x62\\xde\\xda\\x9e\\xd9\\xb9\\xd1\\xf2\\xfb\\x7c\\x54\\xca\\x7a\\xb0\\x9f\\x38\\x3b\\xef\\x48\\xcf\\xc6\\x84\\x8c\\x27\\x13\\x02\\xa1\\x0f\\xa6\\x87\\xf5\\x6e\\x00\\xe0\\xa7\\xd0\\x93\\xc9\\x27\\xb4\\xfd\\xd8\\xf1\\xbe\\xdf\\x62\\x88\\xa0\\xe3\\x02\\x84\\x8a\\x80\\x12\\xf1\\x27\\xa7\\x9d\\x2d\\x30\\xa0\\x6c\\xe1\\x7d\\x94\\xaa\\x6f\\x7f\\x8a\\x1e\\x6e\\xb9\\xd0\\x68\\x1c\\x37\\x74\\xf6\\x14\\xcc\\x6d\\xbc\\xb2\\xa8\\x13\\xf9\\x25\\xc6\\x30\\x6a\\x63\\x05\\x72\\xa8\\x3e\\xc1\\x09\\xd5\\xf5\\x33\\xc0\\x58\\x4c\\xb4\\x21\\xd9\\x19\"},\n{{0xa1,0xac,0x48,0xaa,0x5f,0xfa,0x3d,0x80,0x08,0x19,0xd0,0x3b,0x7f,0x62,0xba,0xbf,0x29,0x1f,0x20,0x90,0x4c,0x11,0xa6,0x40,0x0e,0x4f,0x45,0x20,0x5f,0x10,0x3e,0x38,},{0x08,0x54,0xe0,0x34,0x0f,0x81,0x49,0x85,0xfb,0x12,0x2b,0x78,0x72,0x94,0x79,0xe3,0xfd,0xe8,0x55,0xc2,0x11,0xca,0xde,0xae,0x56,0xf0,0xd4,0xdc,0x08,0x28,0xd5,0xfa,},{0xc5,0x7e,0x3c,0x09,0x1e,0xd2,0x4e,0x5e,0x84,0x66,0x5b,0xd9,0xbb,0x10,0x2d,0xb4,0x97,0x97,0xdf,0x90,0x08,0xf0,0x55,0x57,0xfa,0x0d,0x5a,0xd7,0xa2,0x95,0xe5,0xe4,0xd2,0xa4,0x71,0x6b,0x17,0xf8,0xc9,0x1c,0xb1,0x2f,0x5a,0xbf,0xb1,0xaf,0x02,0x7f,0xb0,0x41,0x11,0x99,0xac,0xc5,0xd2,0x85,0xd8,0x42,0xa4,0xb6,0x5b,0xde,0x49,0x02,},\"\\xd6\\xf1\\x24\\xed\\x75\\x20\\x21\\xc1\\x09\\x26\\x97\\x2a\\x0c\\x26\\xf3\\xb1\\x83\\x8b\\x3c\\x7a\\xf2\\x47\\xc1\\x80\\x09\\xa2\\x31\\xec\\xce\\x96\\x4b\\xf6\\x69\\x86\\x37\\x83\\x3f\\x60\\x7d\\xca\\x83\\x6f\\x8a\\x60\\x6c\\x72\\xae\\x3c\\xb1\\x70\\x17\\x44\\x47\\xa2\\xcc\\xe5\\x83\\xf6\\xe2\\x44\\xdb\\xc1\\x63\\xe2\\x15\\xb9\\x82\\x0d\\xe7\\x49\\x6f\\xfc\\x5b\\x70\\x50\\xc4\\x8f\\x28\\x30\\x24\\x66\\x78\\xcb\\xa4\\xdc\\x5c\\xaa\\x07\\xc1\\x45\\x85\\x63\\xaa\\x2d\\x10\\xdc\\xb7\\x77\\x0e\\xf8\\xfe\\xde\\x02\\x7d\\xd7\\xf2\\x0d\\xdc\\x8c\\xc7\\x8c\\x3a\\x2e\\x2e\\x95\\x8b\\xd1\\x8c\\x00\\x06\\xcf\\x8f\\xb8\\x2d\\x44\\xe5\\x3e\\x1d\\xa7\\xaa\\x80\\xfd\\x10\\x06\\xf3\\xb2\\x30\\x0c\\x9b\\x07\\x9d\\x8a\\x66\\xf1\\xe4\\xa3\\xf4\\x70\\x61\\xf9\\xe2\\xf4\\x5d\\xae\\x35\\xdc\\x29\\x52\\x04\\xb1\\x94\\x60\\xca\\x57\\x07\\xab\\x57\\xce\\x21\\x5a\\x24\\xc1\\x0f\\xaa\\xb3\\xfa\\x20\\xbc\\xcd\\x10\\x1e\\x7a\\x7d\\x70\\x07\\x75\\x99\\xf3\\xd6\\x72\\x57\\x07\\x55\\x21\\x29\\xca\\xd7\\x57\\xd6\\x51\\x4c\\x1b\\x28\\x99\\x7e\\x47\\x1f\\x94\\xb0\\xfd\\xed\\x8f\\xbb\\xd0\\x65\\xde\\xad\\x19\\x6d\\x2c\\x07\\xd3\\xdf\\xa7\\xb9\\xfb\\x3b\\xae\\x76\\x80\\xf7\\x66\\x21\\x20\\x0d\\x09\\x9e\\xeb\\xeb\\xbe\\xa0\\xe8\\x95\\x7d\\xf5\\xb5\\xe2\\x04\\xca\\x3e\\x9e\\x29\\x52\\xb8\\xa3\\x0f\\x0a\\x13\\x1a\\x68\\x67\\xb1\\x38\\x1e\\x39\\x4b\\x1b\\x44\\x43\\x10\\xf0\\x76\\x32\\x66\\x56\\xcf\\x93\\x41\\x67\\x80\\x08\\xe9\\x52\\x51\\x47\\xd8\\xd6\\x1c\\xe9\\x3d\\x3b\\xf5\\x39\\x00\\xca\\xb9\\x12\\x66\\x37\\x17\\xe0\\x98\\x72\\x93\\x83\\x3d\\x19\\x02\\xd7\\xfb\\x04\\x7b\\x99\\x7b\\x86\\x02\\x6c\\x46\\x7d\\x7b\\xb1\\x7c\\xf4\\x57\\x96\\x73\\x8f\\x7a\\x77\\x4a\\xc1\\x26\\x76\\x4e\\xd4\\xeb\\x45\\x12\\x43\\x09\\xf4\\x58\\x62\\x60\\x17\\x6b\\xa4\\x65\\x91\\x8d\\x48\\x33\\x0a\\x9c\\xc1\\x8c\\x4e\\xce\\xa0\\xdd\\xaf\\x38\\x94\\x6a\\xcc\\x0e\\x36\\x1d\\xd4\\x0a\\x7e\\x91\\x33\\xce\\xb5\\x0e\\x1c\\x31\\x7e\\xa4\\x2b\\xd0\\x98\\x0a\\x72\\xb8\\xba\\x3d\\x8a\\x6c\\x76\\x93\\xdd\\x56\\x02\\xf3\\x74\\xf2\\x66\\x4d\\xf4\\xba\\x56\\xdf\\x01\\xe8\\x82\\xfc\\xa4\\x2c\\xb4\\xdb\\x62\\x1f\\x47\\x6c\\x76\\xe1\\xea\\x9f\\xd1\\x05\\x91\\x1a\\x74\\xb7\\x79\\x52\\xd9\\x91\\x4a\\x5a\\xc0\\xf9\\x8a\\x90\\x0c\\x1b\\x2e\\x1a\\x56\\xc4\\xea\\x85\\x18\\xa9\\xee\\x47\\xc4\\xed\\x14\\xd0\\xbd\\x35\\xec\\xa5\\x60\\x31\\x9c\\x8e\\xa2\\x47\\x55\\xd7\\x1a\\x4e\\x03\\x08\\x50\\xbc\\x4d\\xc6\\x03\\x89\\xf3\\x25\\x80\\x40\\x21\\x20\\x4c\\xce\\xbc\\x25\\xfe\\xdb\\xd3\\x2e\\xdd\\x8d\\x84\\x46\\xaa\\x23\\xce\\x56\\xa8\\x5f\\x77\\x9e\\x85\\x8d\\x36\\xaf\\x7c\\x07\\x3c\\x11\\x5e\\x34\\x1f\\x41\\x2c\\x66\\x0f\\xab\\x80\\x0f\\xe7\\x4c\\x50\\xe7\\x14\\xee\\x08\\x6e\\x2f\\xbc\\x8d\\x7a\\xbb\\xf3\\xe9\\x8f\\xb4\\x0c\\xa2\\x7f\\x1f\\x01\\xa9\\xaa\\xdd\\x8c\\xc2\\x27\\x5c\\x2d\\xd3\\xf7\\x6e\\x4c\\x1d\\x81\\xc4\\xb7\\x92\\xda\\xec\\xc9\\xfe\\x66\\x04\\x49\\x41\\xb8\\xb2\\x91\\x84\\x86\\xdd\\x4a\\xcb\\x56\\x2a\\x7b\\x58\\xad\\x8c\\x60\\xc2\\x1b\\x83\\xcf\\x48\\xae\\xfa\\x72\\x56\\xa1\\xed\\x80\\x9e\\x66\\x98\\x11\\xf4\\x84\\x36\\x49\\x70\\xbc\\x56\\x95\\x08\\x99\\x19\\xbc\\x32\\xd2\\x8e\\xa7\\x52\\xe8\\xe3\\x18\\xce\\xff\\x46\\x7f\\x77\\xae\\x19\\x77\\xc5\\xff\\xd7\\x9c\\x17\\xc2\\xda\\x8b\\xc7\\xf8\\x23\\xdd\\x94\\x39\\x86\\x83\\x18\\x99\\x45\\xf8\\xb7\\x92\\x38\\xa4\\xe8\\x15\\xb1\\x42\\xb8\\x66\\xac\\xbd\\xbc\\xb7\\xae\\xa7\\xf1\\x43\\xff\\xfb\\x7c\\xc2\\xb4\\xb5\\x4b\\xbf\\x36\\x1a\\xfd\\xa9\\x13\\xad\\x6d\\xf1\\xe4\\x9d\\xfd\\x6b\\x53\\x26\\x42\\xe6\\x3f\\x55\\xd8\\x93\\xa4\\x70\\xd4\\x03\\x70\\x66\\x5c\\xfb\\x74\\xef\\xd3\\xf5\\x9c\\xb0\\xff\\x60\\x06\\x17\\x4c\\xa3\\x5f\\x53\\xb9\\x7c\\x54\\x3e\\x08\\xaf\\x4b\\xf5\\xbb\\x75\\xff\\x90\\x31\\x61\\x06\\x52\\xa3\\xf6\\xf2\\xa0\\xcf\\xe9\\x7e\\x7a\\x52\\x1f\\x3d\\x2a\\x28\\x91\\x14\\xde\\xd3\\x47\\x72\\xb0\\xe4\\x98\\x17\\xbd\\xe1\\xcb\\x92\\x4f\\xf5\\x14\\xe2\\x86\\x6a\\x09\\xe3\\xed\\xe0\\x78\\x2d\\x2c\\x0c\\x98\\xe6\\x81\\x4b\\x8c\\x1e\\x77\\x8c\\xf8\\x30\\x63\\x48\\xc9\\x33\\xad\\xb2\\xe4\\x72\\xdb\\xa0\\x9d\\xb9\\x54\\xff\\x49\\x64\\x83\\x73\\x39\\x5a\\x2f\\x01\\x81\\x95\\x8f\\xeb\\x1e\\xa2\\x83\\x4c\\x99\\x53\\x28\\x73\\xdb\\x5c\\x88\\xeb\\x52\\x89\\xc7\\x7e\\x90\\x01\\x52\\x03\\xef\\x50\\x2a\\xc8\\xe1\\xc4\\x8f\\xa1\\xa0\\x6d\\xaf\\xa6\\x51\\x9d\\x52\\xda\\xe3\\xc5\\x56\\x75\\x70\\xdd\\x24\\x34\\xe6\\x71\\x92\\x7c\\x66\\x36\\x3f\\x78\\x31\\x56\\x89\\x3f\\x13\\x8a\\x84\\xc7\\x56\\x64\\xb3\\x0a\\xe4\\x27\\x51\\x12\\x73\\x6d\\x53\\xd4\\xf3\\x99\\xdd\\xda\\x3d\\x23\\x06\\x7c\\x07\\x3f\\x52\\x1a\\xfb\\xa1\\xf7\\xbe\\x58\\x55\\x13\\xc2\\xce\\xc9\\xc8\\xf0\\x8d\\x2a\\x22\\xc3\\xc8\\x53\\x92\\xcd\\x2a\\xe5\\x0f\\x39\\x28\\x25\\x1f\\x86\\xb3\\x10\\xc6\\x9a\\x0f\\x8c\\x4e\\x85\\x3a\\xb3\\xf3\\xe8\\x12\\x9b\\x05\\x66\\xef\\x4b\\xbb\\xe8\\x0b\\x8c\\x02\\xc8\\x92\\x8a\\x4d\\xe5\\x6c\\x0d\\x11\\x9a\\x45\\xbb\\xf5\\xaf\\x18\\x08\\xd4\\x88\\x85\\x2d\\x8a\\x45\\xbe\\xb0\\xd6\\x83\\x24\\x8a\\x4d\\x65\\xde\\x15\\x26\\xb3\\xd1\\xd2\\xff\\xc1\\xf2\\x22\\x15\\xb6\\x08\\x46\\x8c\\xbc\\x3b\\xd3\\x95\\x14\\xb3\\x97\\xfc\\x0d\\xb0\\xf1\\x13\\xdb\\xe6\\xfc\\xe4\\x65\\x2e\\x82\\xff\\x89\\x5b\\x2b\\x43\\x87\\xe0\\x41\\xd7\\xe4\\xe7\\xbd\\xe4\\x69\\x47\\x69\\x66\\x5e\\x81\"},\n{{0xf5,0xe5,0x76,0x7c,0xf1,0x53,0x31,0x95,0x17,0x63,0x0f,0x22,0x68,0x76,0xb8,0x6c,0x81,0x60,0xcc,0x58,0x3b,0xc0,0x13,0x74,0x4c,0x6b,0xf2,0x55,0xf5,0xcc,0x0e,0xe5,},{0x27,0x81,0x17,0xfc,0x14,0x4c,0x72,0x34,0x0f,0x67,0xd0,0xf2,0x31,0x6e,0x83,0x86,0xce,0xff,0xbf,0x2b,0x24,0x28,0xc9,0xc5,0x1f,0xef,0x7c,0x59,0x7f,0x1d,0x42,0x6e,},{0x0a,0xab,0x4c,0x90,0x05,0x01,0xb3,0xe2,0x4d,0x7c,0xdf,0x46,0x63,0x32,0x6a,0x3a,0x87,0xdf,0x5e,0x48,0x43,0xb2,0xcb,0xdb,0x67,0xcb,0xf6,0xe4,0x60,0xfe,0xc3,0x50,0xaa,0x53,0x71,0xb1,0x50,0x8f,0x9f,0x45,0x28,0xec,0xea,0x23,0xc4,0x36,0xd9,0x4b,0x5e,0x8f,0xcd,0x4f,0x68,0x1e,0x30,0xa6,0xac,0x00,0xa9,0x70,0x4a,0x18,0x8a,0x03,},\"\\x08\\xb8\\xb2\\xb7\\x33\\x42\\x42\\x43\\x76\\x0f\\xe4\\x26\\xa4\\xb5\\x49\\x08\\x63\\x21\\x10\\xa6\\x6c\\x2f\\x65\\x91\\xea\\xbd\\x33\\x45\\xe3\\xe4\\xeb\\x98\\xfa\\x6e\\x26\\x4b\\xf0\\x9e\\xfe\\x12\\xee\\x50\\xf8\\xf5\\x4e\\x9f\\x77\\xb1\\xe3\\x55\\xf6\\xc5\\x05\\x44\\xe2\\x3f\\xb1\\x43\\x3d\\xdf\\x73\\xbe\\x84\\xd8\\x79\\xde\\x7c\\x00\\x46\\xdc\\x49\\x96\\xd9\\xe7\\x73\\xf4\\xbc\\x9e\\xfe\\x57\\x38\\x82\\x9a\\xdb\\x26\\xc8\\x1b\\x37\\xc9\\x3a\\x1b\\x27\\x0b\\x20\\x32\\x9d\\x65\\x86\\x75\\xfc\\x6e\\xa5\\x34\\xe0\\x81\\x0a\\x44\\x32\\x82\\x6b\\xf5\\x8c\\x94\\x1e\\xfb\\x65\\xd5\\x7a\\x33\\x8b\\xbd\\x2e\\x26\\x64\\x0f\\x89\\xff\\xbc\\x1a\\x85\\x8e\\xfc\\xb8\\x55\\x0e\\xe3\\xa5\\xe1\\x99\\x8b\\xd1\\x77\\xe9\\x3a\\x73\\x63\\xc3\\x44\\xfe\\x6b\\x19\\x9e\\xe5\\xd0\\x2e\\x82\\xd5\\x22\\xc4\\xfe\\xba\\x15\\x45\\x2f\\x80\\x28\\x8a\\x82\\x1a\\x57\\x91\\x16\\xec\\x6d\\xad\\x2b\\x3b\\x31\\x0d\\xa9\\x03\\x40\\x1a\\xa6\\x21\\x00\\xab\\x5d\\x1a\\x36\\x55\\x3e\\x06\\x20\\x3b\\x33\\x89\\x0c\\xc9\\xb8\\x32\\xf7\\x9e\\xf8\\x05\\x60\\xcc\\xb9\\xa3\\x9c\\xe7\\x67\\x96\\x7e\\xd6\\x28\\xc6\\xad\\x57\\x3c\\xb1\\x16\\xdb\\xef\\xef\\xd7\\x54\\x99\\xda\\x96\\xbd\\x68\\xa8\\xa9\\x7b\\x92\\x8a\\x8b\\xbc\\x10\\x3b\\x66\\x21\\xfc\\xde\\x2b\\xec\\xa1\\x23\\x1d\\x20\\x6b\\xe6\\xcd\\x9e\\xc7\\xaf\\xf6\\xf6\\xc9\\x4f\\xcd\\x72\\x04\\xed\\x34\\x55\\xc6\\x8c\\x83\\xf4\\xa4\\x1d\\xa4\\xaf\\x2b\\x74\\xef\\x5c\\x53\\xf1\\xd8\\xac\\x70\\xbd\\xcb\\x7e\\xd1\\x85\\xce\\x81\\xbd\\x84\\x35\\x9d\\x44\\x25\\x4d\\x95\\x62\\x9e\\x98\\x55\\xa9\\x4a\\x7c\\x19\\x58\\xd1\\xf8\\xad\\xa5\\xd0\\x53\\x2e\\xd8\\xa5\\xaa\\x3f\\xb2\\xd1\\x7b\\xa7\\x0e\\xb6\\x24\\x8e\\x59\\x4e\\x1a\\x22\\x97\\xac\\xbb\\xb3\\x9d\\x50\\x2f\\x1a\\x8c\\x6e\\xb6\\xf1\\xce\\x22\\xb3\\xde\\x1a\\x1f\\x40\\xcc\\x24\\x55\\x41\\x19\\xa8\\x31\\xa9\\xaa\\xd6\\x07\\x9c\\xad\\x88\\x42\\x5d\\xe6\\xbd\\xe1\\xa9\\x18\\x7e\\xbb\\x60\\x92\\xcf\\x67\\xbf\\x2b\\x13\\xfd\\x65\\xf2\\x70\\x88\\xd7\\x8b\\x7e\\x88\\x3c\\x87\\x59\\xd2\\xc4\\xf5\\xc6\\x5a\\xdb\\x75\\x53\\x87\\x8a\\xd5\\x75\\xf9\\xfa\\xd8\\x78\\xe8\\x0a\\x0c\\x9b\\xa6\\x3b\\xcb\\xcc\\x27\\x32\\xe6\\x94\\x85\\xbb\\xc9\\xc9\\x0b\\xfb\\xd6\\x24\\x81\\xd9\\x08\\x9b\\xec\\xcf\\x80\\xcf\\xe2\\xdf\\x16\\xa2\\xcf\\x65\\xbd\\x92\\xdd\\x59\\x7b\\x07\\x07\\xe0\\x91\\x7a\\xf4\\x8b\\xbb\\x75\\xfe\\xd4\\x13\\xd2\\x38\\xf5\\x55\\x5a\\x7a\\x56\\x9d\\x80\\xc3\\x41\\x4a\\x8d\\x08\\x59\\xdc\\x65\\xa4\\x61\\x28\\xba\\xb2\\x7a\\xf8\\x7a\\x71\\x31\\x4f\\x31\\x8c\\x78\\x2b\\x23\\xeb\\xfe\\x80\\x8b\\x82\\xb0\\xce\\x26\\x40\\x1d\\x2e\\x22\\xf0\\x4d\\x83\\xd1\\x25\\x5d\\xc5\\x1a\\xdd\\xd3\\xb7\\x5a\\x2b\\x1a\\xe0\\x78\\x45\\x04\\xdf\\x54\\x3a\\xf8\\x96\\x9b\\xe3\\xea\\x70\\x82\\xff\\x7f\\xc9\\x88\\x8c\\x14\\x4d\\xa2\\xaf\\x58\\x42\\x9e\\xc9\\x60\\x31\\xdb\\xca\\xd3\\xda\\xd9\\xaf\\x0d\\xcb\\xaa\\xaf\\x26\\x8c\\xb8\\xfc\\xff\\xea\\xd9\\x4f\\x3c\\x7c\\xa4\\x95\\xe0\\x56\\xa9\\xb4\\x7a\\xcd\\xb7\\x51\\xfb\\x73\\xe6\\x66\\xc6\\xc6\\x55\\xad\\xe8\\x29\\x72\\x97\\xd0\\x7a\\xd1\\xba\\x5e\\x43\\xf1\\xbc\\xa3\\x23\\x01\\x65\\x13\\x39\\xe2\\x29\\x04\\xcc\\x8c\\x42\\xf5\\x8c\\x30\\xc0\\x4a\\xaf\\xdb\\x03\\x8d\\xda\\x08\\x47\\xdd\\x98\\x8d\\xcd\\xa6\\xf3\\xbf\\xd1\\x5c\\x4b\\x4c\\x45\\x25\\x00\\x4a\\xa0\\x6e\\xef\\xf8\\xca\\x61\\x78\\x3a\\xac\\xec\\x57\\xfb\\x3d\\x1f\\x92\\xb0\\xfe\\x2f\\xd1\\xa8\\x5f\\x67\\x24\\x51\\x7b\\x65\\xe6\\x14\\xad\\x68\\x08\\xd6\\xf6\\xee\\x34\\xdf\\xf7\\x31\\x0f\\xdc\\x82\\xae\\xbf\\xd9\\x04\\xb0\\x1e\\x1d\\xc5\\x4b\\x29\\x27\\x09\\x4b\\x2d\\xb6\\x8d\\x6f\\x90\\x3b\\x68\\x40\\x1a\\xde\\xbf\\x5a\\x7e\\x08\\xd7\\x8f\\xf4\\xef\\x5d\\x63\\x65\\x3a\\x65\\x04\\x0c\\xf9\\xbf\\xd4\\xac\\xa7\\x98\\x4a\\x74\\xd3\\x71\\x45\\x98\\x67\\x80\\xfc\\x0b\\x16\\xac\\x45\\x16\\x49\\xde\\x61\\x88\\xa7\\xdb\\xdf\\x19\\x1f\\x64\\xb5\\xfc\\x5e\\x2a\\xb4\\x7b\\x57\\xf7\\xf7\\x27\\x6c\\xd4\\x19\\xc1\\x7a\\x3c\\xa8\\xe1\\xb9\\x39\\xae\\x49\\xe4\\x88\\xac\\xba\\x6b\\x96\\x56\\x10\\xb5\\x48\\x01\\x09\\xc8\\xb1\\x7b\\x80\\xe1\\xb7\\xb7\\x50\\xdf\\xc7\\x59\\x8d\\x5d\\x50\\x11\\xfd\\x2d\\xcc\\x56\\x00\\xa3\\x2e\\xf5\\xb5\\x2a\\x1e\\xcc\\x82\\x0e\\x30\\x8a\\xa3\\x42\\x72\\x1a\\xac\\x09\\x43\\xbf\\x66\\x86\\xb6\\x4b\\x25\\x79\\x37\\x65\\x04\\xcc\\xc4\\x93\\xd9\\x7e\\x6a\\xed\\x3f\\xb0\\xf9\\xcd\\x71\\xa4\\x3d\\xd4\\x97\\xf0\\x1f\\x17\\xc0\\xe2\\xcb\\x37\\x97\\xaa\\x2a\\x2f\\x25\\x66\\x56\\x16\\x8e\\x6c\\x49\\x6a\\xfc\\x5f\\xb9\\x32\\x46\\xf6\\xb1\\x11\\x63\\x98\\xa3\\x46\\xf1\\xa6\\x41\\xf3\\xb0\\x41\\xe9\\x89\\xf7\\x91\\x4f\\x90\\xcc\\x2c\\x7f\\xff\\x35\\x78\\x76\\xe5\\x06\\xb5\\x0d\\x33\\x4b\\xa7\\x7c\\x22\\x5b\\xc3\\x07\\xba\\x53\\x71\\x52\\xf3\\xf1\\x61\\x0e\\x4e\\xaf\\xe5\\x95\\xf6\\xd9\\xd9\\x0d\\x11\\xfa\\xa9\\x33\\xa1\\x5e\\xf1\\x36\\x95\\x46\\x86\\x8a\\x7f\\x3a\\x45\\xa9\\x67\\x68\\xd4\\x0f\\xd9\\xd0\\x34\\x12\\xc0\\x91\\xc6\\x31\\x5c\\xf4\\xfd\\xe7\\xcb\\x68\\x60\\x69\\x37\\x38\\x0d\\xb2\\xea\\xaa\\x70\\x7b\\x4c\\x41\\x85\\xc3\\x2e\\xdd\\xcd\\xd3\\x06\\x70\\x5e\\x4d\\xc1\\xff\\xc8\\x72\\xee\\xee\\x47\\x5a\\x64\\xdf\\xac\\x86\\xab\\xa4\\x1c\\x06\\x18\\x98\\x3f\\x87\\x41\\xc5\\xef\\x68\\xd3\\xa1\\x01\\xe8\\xa3\\xb8\\xca\\xc6\\x0c\\x90\\x5c\\x15\\xfc\\x91\\x08\\x40\\xb9\\x4c\\x00\\xa0\\xb9\\xd0\"},\n};\n\nstatic void add_l(unsigned char * const S)\n{\n    static const unsigned char l[32] =\n      { 0xed, 0xd3, 0xf5, 0x5c, 0x1a, 0x63, 0x12, 0x58,\n        0xd6, 0x9c, 0xf7, 0xa2, 0xde, 0xf9, 0xde, 0x14,\n        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,\n        0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10 };\n    unsigned char c = 0U;\n    unsigned int  i;\n    unsigned int  s;\n\n    for (i = 0U; i < 32U; i++) {\n        s = S[i] + l[i] + c;\n        S[i] = (unsigned char) s;\n        c = (s >> 8) & 1;\n    }\n}\n\nint main(void)\n{\n    unsigned char extracted_seed[crypto_sign_ed25519_SEEDBYTES];\n    unsigned char extracted_pk[crypto_sign_ed25519_PUBLICKEYBYTES];\n    unsigned char sig[crypto_sign_BYTES];\n    unsigned char sm[1024 + crypto_sign_BYTES];\n    unsigned char m[1024];\n    unsigned char skpk[crypto_sign_SECRETKEYBYTES];\n    unsigned char pk[crypto_sign_PUBLICKEYBYTES];\n    unsigned char sk[crypto_sign_SECRETKEYBYTES];\n    char          pk_hex[crypto_sign_PUBLICKEYBYTES * 2 + 1];\n    char          sk_hex[crypto_sign_SECRETKEYBYTES * 2 + 1];\n    unsigned long long siglen;\n    unsigned long long smlen;\n    unsigned long long mlen;\n    unsigned int i;\n    unsigned int j;\n\n    memset(sig, 0, sizeof sig);\n    for (i = 0U; i < (sizeof test_data) / (sizeof test_data[0]); i++) {\n        memcpy(skpk, test_data[i].sk, crypto_sign_SEEDBYTES);\n        memcpy(skpk + crypto_sign_SEEDBYTES, test_data[i].pk,\n               crypto_sign_PUBLICKEYBYTES);\n        if (crypto_sign(sm, &smlen, (const unsigned char *)test_data[i].m, i,\n                        skpk) != 0) {\n            printf(\"crypto_sign() failure: [%u]\\n\", i);\n            continue;\n        }\n        if (memcmp(test_data[i].sig, sm, crypto_sign_BYTES) != 0) {\n            printf(\"signature failure: [%u]\\n\", i);\n            continue;\n        }\n        if (crypto_sign_open(m, NULL, sm, smlen, test_data[i].pk) != 0) {\n            printf(\"crypto_sign_open() failure: [%u]\\n\", i);\n            continue;\n        }\n        add_l(sm + 32);\n        if (crypto_sign_open(m, &mlen, sm, smlen, test_data[i].pk) != 0) {\n            printf(\"crypto_sign_open(): signature [%u] is not malleable\\n\", i);\n            continue;\n        }\n        if (memcmp(test_data[i].m, m, (size_t)mlen) != 0) {\n            printf(\"message verification failure: [%u]\\n\", i);\n            continue;\n        }\n        sm[i + crypto_sign_BYTES - 1U]++;\n        if (crypto_sign_open(m, &mlen, sm, smlen, test_data[i].pk) == 0) {\n            printf(\"message can be forged: [%u]\\n\", i);\n            continue;\n        }\n        if (crypto_sign_open(m, &mlen, sm, i % crypto_sign_BYTES,\n                             test_data[i].pk) == 0) {\n            printf(\"short signed message verifies: [%u]\\n\",\n                   i % crypto_sign_BYTES);\n            continue;\n        }\n        if (crypto_sign_detached(sig, &siglen,\n                                 (const unsigned char *)test_data[i].m, i, skpk)\n            != 0) {\n            printf(\"detached signature failed: [%u]\\n\", i);\n            continue;\n        }\n        if (siglen == 0U || siglen > crypto_sign_BYTES) {\n            printf(\"detached signature has an unexpected length\");\n            continue;\n        }\n        if (memcmp(test_data[i].sig, sig, crypto_sign_BYTES) != 0) {\n            printf(\"detached signature failure: [%u]\\n\", i);\n            continue;\n        }\n        if (crypto_sign_verify_detached(sig,\n                                        (const unsigned char *)test_data[i].m,\n                                        i, test_data[i].pk) != 0) {\n            printf(\"detached signature verification failed: [%u]\\n\", i);\n            continue;\n        }\n    }\n    printf(\"%u tests\\n\", i);\n\n    i--;\n\n    memcpy(sm, test_data[i].m, i);\n    if (crypto_sign(sm, &smlen, sm, i, skpk) != 0) {\n        printf(\"crypto_sign() with overlap failed\\n\");\n    }\n    if (crypto_sign_open(sm, &mlen, sm, smlen, test_data[i].pk) != 0) {\n        printf(\"crypto_sign_open() with overlap failed\\n\");\n    }\n    if (memcmp(test_data[i].m, sm, (size_t)mlen) != 0) {\n        printf(\"crypto_sign_open() with overlap failed (content)\\n\");\n    }\n\n    for (j = 1U; j < 8U; j++) {\n        sig[63] ^= (j << 5);\n        if (crypto_sign_verify_detached(sig,\n                                        (const unsigned char *)test_data[i].m,\n                                        i, test_data[i].pk) != -1) {\n            printf(\"detached signature verification should have failed\\n\");\n            continue;\n        }\n        sig[63] ^= (j << 5);\n    }\n\n    memset(pk, 0, sizeof pk);\n    if (crypto_sign_verify_detached(sig,\n                                    (const unsigned char *)test_data[i].m,\n                                    i, pk) != -1) {\n        printf(\"detached signature verification should have failed\\n\");\n    }\n\n    if (crypto_sign_keypair(pk, sk) != 0) {\n        printf(\"crypto_sign_keypair() failure\\n\");\n    }\n    if (crypto_sign_seed_keypair(pk, sk, keypair_seed) != 0) {\n        printf(\"crypto_sign_seed_keypair() failure\\n\");\n        return -1;\n    }\n    crypto_sign_ed25519_sk_to_seed(extracted_seed, sk);\n    if (memcmp(extracted_seed, keypair_seed, crypto_sign_ed25519_SEEDBYTES)\n        != 0) {\n        printf(\"crypto_sign_ed25519_sk_to_seed() failure\\n\");\n    }\n    crypto_sign_ed25519_sk_to_pk(extracted_pk, sk);\n    if (memcmp(extracted_pk, pk, crypto_sign_ed25519_PUBLICKEYBYTES) != 0) {\n        printf(\"crypto_sign_ed25519_sk_to_pk() failure\\n\");\n    }\n    sodium_bin2hex(pk_hex, sizeof pk_hex, pk, sizeof pk);\n    sodium_bin2hex(sk_hex, sizeof sk_hex, sk, sizeof sk);\n\n    printf(\"pk: [%s]\\n\", pk_hex);\n    printf(\"sk: [%s]\\n\", sk_hex);\n\n    assert(crypto_sign_bytes() > 0U);\n    assert(crypto_sign_seedbytes() > 0U);\n    assert(crypto_sign_publickeybytes() > 0U);\n    assert(crypto_sign_secretkeybytes() > 0U);\n    assert(strcmp(crypto_sign_primitive(), \"ed25519\") == 0);\n    assert(crypto_sign_bytes() == crypto_sign_ed25519_bytes());\n    assert(crypto_sign_seedbytes() == crypto_sign_ed25519_seedbytes());\n    assert(crypto_sign_publickeybytes()\n           == crypto_sign_ed25519_publickeybytes());\n    assert(crypto_sign_secretkeybytes()\n           == crypto_sign_ed25519_secretkeybytes());\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/sodium_core.c",
    "content": "\n#define TEST_NAME \"sodium_core\"\n#include \"cmptest.h\"\n\nint main(void)\n{\n    printf(\"%d\\n\", sodium_init());\n\n    (void)sodium_runtime_has_neon();\n    (void)sodium_runtime_has_sse2();\n    (void)sodium_runtime_has_sse3();\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/sodium_utils.c",
    "content": "\n#define TEST_NAME \"sodium_utils\"\n#include \"cmptest.h\"\n\nint main(void)\n{\n    unsigned char buf1[1000];\n    unsigned char buf2[1000];\n    char buf3[33];\n    unsigned char buf4[4];\n    const char *hex;\n    const char *hex_end;\n    size_t bin_len;\n\n    randombytes_buf(buf1, sizeof buf1);\n    memcpy(buf2, buf1, sizeof buf2);\n    printf(\"%d\\n\", sodium_memcmp(buf1, buf2, sizeof buf1));\n    sodium_memzero(buf1, 0U);\n    printf(\"%d\\n\", sodium_memcmp(buf1, buf2, sizeof buf1));\n    sodium_memzero(buf1, sizeof buf1 / 2);\n    printf(\"%d\\n\", sodium_memcmp(buf1, buf2, sizeof buf1));\n    printf(\"%d\\n\", sodium_memcmp(buf1, buf2, 0U));\n    sodium_memzero(buf2, sizeof buf2 / 2);\n    printf(\"%d\\n\", sodium_memcmp(buf1, buf2, sizeof buf1));\n    printf(\"%s\\n\",\n           sodium_bin2hex(buf3, 33U, (const unsigned char *)\"0123456789ABCDEF\",\n                          16U));\n    hex = \"Cafe : 6942\";\n    sodium_hex2bin(buf4, sizeof buf4, hex, strlen(hex), \": \", &bin_len, &hex_end);\n    printf(\"%lu:%02x%02x%02x%02x\\n\", (unsigned long)bin_len, buf4[0], buf4[1],\n           buf4[2], buf4[3]);\n    printf(\"dt1: %ld\\n\", (long) (hex_end - hex));\n\n    hex = \"Cafe : 6942\";\n    sodium_hex2bin(buf4, sizeof buf4, hex, strlen(hex), \": \", &bin_len, NULL);\n    printf(\"%lu:%02x%02x%02x%02x\\n\", (unsigned long)bin_len, buf4[2], buf4[3],\n           buf4[2], buf4[3]);\n\n    hex = \"deadbeef\";\n    if (sodium_hex2bin(buf1, 1U, hex, 8U, NULL, &bin_len, &hex_end) != -1) {\n        printf(\"sodium_hex2bin() overflow not detected\\n\");\n    }\n    printf(\"dt2: %ld\\n\", (long) (hex_end - hex));\n\n    hex = \"de:ad:be:eff\";\n    if (sodium_hex2bin(buf1, 4U, hex, 12U, \":\", &bin_len, &hex_end) != -1) {\n        printf(\"sodium_hex2bin() with an odd input length and a short output buffer\\n\");\n    }\n    printf(\"dt3: %ld\\n\", (long) (hex_end - hex));\n\n    hex = \"de:ad:be:eff\";\n    if (sodium_hex2bin(buf1, sizeof buf1, hex, 12U, \":\", &bin_len, &hex_end) != 0) {\n        printf(\"sodium_hex2bin() with an odd input length\\n\");\n    }\n    printf(\"dt4: %ld\\n\", (long) (hex_end - hex));\n\n    hex = \"de:ad:be:eff\";\n    if (sodium_hex2bin(buf1, sizeof buf1, hex, 13U, \":\", &bin_len, &hex_end) != 0) {\n        printf(\"sodium_hex2bin() with an odd input length\\n\");\n    }\n    printf(\"dt5: %ld\\n\", (long) (hex_end - hex));\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/sodium_utils2.c",
    "content": "\n#include <sys/types.h>\n\n#include <limits.h>\n#include <signal.h>\n\n#define TEST_NAME \"sodium_utils2\"\n#include \"cmptest.h\"\n\n#ifdef __SANITIZE_ADDRESS__\n# warning The sodium_utils2 test is expected to fail with address sanitizer\n#endif\n\nstatic void segv_handler(int sig)\n{\n    printf(\"Intentional segfault / bus error caught\\n\");\n    printf(\"OK\\n\");\n#ifdef SIGSEGV\n    signal(SIGSEGV, SIG_DFL);\n#endif\n#ifdef SIGBUS\n    signal(SIGBUS, SIG_DFL);\n#endif\n#ifdef SIGABRT\n    signal(SIGABRT, SIG_DFL);\n#endif\n    exit(0);\n}\n\nint main(void)\n{\n    void *buf;\n    size_t size;\n    unsigned int i;\n\n    if (sodium_malloc(SIZE_MAX - 1U) != NULL) {\n        return 1;\n    }\n    if (sodium_allocarray(SIZE_MAX / 2U + 1U, SIZE_MAX / 2U) != NULL) {\n        return 1;\n    }\n    sodium_free(sodium_allocarray(0U, 0U));\n    sodium_free(sodium_allocarray(0U, 1U));\n    sodium_free(sodium_allocarray(1U, 0U));\n\n    buf = sodium_allocarray(1000U, 50U);\n    memset(buf, 0, 50000U);\n    sodium_free(buf);\n\n    sodium_free(sodium_malloc(0U));\n    sodium_free(NULL);\n    for (i = 0U; i < 10000U; i++) {\n        size = randombytes_uniform(100000U);\n        buf = sodium_malloc(size);\n        assert(buf != NULL);\n        memset(buf, i, size);\n        sodium_mprotect_noaccess(buf);\n        sodium_free(buf);\n    }\n    printf(\"OK\\n\");\n\n#ifdef SIGSEGV\n    signal(SIGSEGV, segv_handler);\n#endif\n#ifdef SIGBUS\n    signal(SIGBUS, segv_handler);\n#endif\n#ifdef SIGABRT\n    signal(SIGABRT, segv_handler);\n#endif\n    size = randombytes_uniform(100000U);\n    buf = sodium_malloc(size);\n    assert(buf != NULL);\n    sodium_mprotect_readonly(buf);\n    sodium_mprotect_readwrite(buf);\n#ifndef __EMSCRIPTEN__\n    sodium_memzero(((unsigned char *)buf) + size, 1U);\n    sodium_mprotect_noaccess(buf);\n    sodium_free(buf);\n    printf(\"Overflow not caught\\n\");\n#endif\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/sodium_utils3.c",
    "content": "\n#include <sys/types.h>\n\n#include <limits.h>\n#include <signal.h>\n\n#define TEST_NAME \"sodium_utils3\"\n#include \"cmptest.h\"\n\n#ifdef __SANITIZE_ADDRESS__\n# warning The sodium_utils3 test is expected to fail with address sanitizer\n#endif\n\nstatic void segv_handler(int sig)\n{\n    printf(\"Intentional segfault / bus error caught\\n\");\n    printf(\"OK\\n\");\n#ifdef SIGSEGV\n    signal(SIGSEGV, SIG_DFL);\n#endif\n#ifdef SIGBUS\n    signal(SIGBUS, SIG_DFL);\n#endif\n#ifdef SIGABRT\n    signal(SIGABRT, SIG_DFL);\n#endif\n    exit(0);\n}\n\nint main(void)\n{\n    void *buf;\n    size_t size;\n\n#ifdef SIGSEGV\n    signal(SIGSEGV, segv_handler);\n#endif\n#ifdef SIGBUS\n    signal(SIGBUS, segv_handler);\n#endif\n#ifdef SIGABRT\n    signal(SIGABRT, segv_handler);\n#endif\n    size = randombytes_uniform(100000U);\n    buf = sodium_malloc(size);\n    assert(buf != NULL);\n    sodium_mprotect_noaccess(buf);\n    sodium_mprotect_readwrite(buf);\n#ifndef __EMSCRIPTEN__\n    sodium_memzero(((unsigned char *)buf) - 8, 8U);\n    sodium_mprotect_readonly(buf);\n    sodium_free(buf);\n    printf(\"Underflow not caught\\n\");\n#endif\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/sodium_version.c",
    "content": "\n#define TEST_NAME \"sodium_version\"\n#include \"cmptest.h\"\n\nint main(void)\n{\n    printf(\"%d\\n\", sodium_version_string() != NULL);\n    printf(\"%d\\n\", sodium_library_version_major() > 0);\n    printf(\"%d\\n\", sodium_library_version_minor() >= 0);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/stream.c",
    "content": "\n#define TEST_NAME \"stream\"\n#include \"cmptest.h\"\n\nunsigned char firstkey[32]\n    = { 0x1b, 0x27, 0x55, 0x64, 0x73, 0xe9, 0x85, 0xd4, 0x62, 0xcd, 0x51,\n        0x19, 0x7a, 0x9a, 0x46, 0xc7, 0x60, 0x09, 0x54, 0x9e, 0xac, 0x64,\n        0x74, 0xf2, 0x06, 0xc4, 0xee, 0x08, 0x44, 0xf6, 0x83, 0x89 };\n\nunsigned char nonce[24] = { 0x69, 0x69, 0x6e, 0xe9, 0x55, 0xb6, 0x2b, 0x73,\n                            0xcd, 0x62, 0xbd, 0xa8, 0x75, 0xfc, 0x73, 0xd6,\n                            0x82, 0x19, 0xe0, 0x03, 0x6b, 0x7a, 0x0b, 0x37 };\n\nunsigned char output[4194304];\n\nunsigned char h[32];\n\nint main(void)\n{\n    int i;\n\n    crypto_stream(output, sizeof output, nonce, firstkey);\n    crypto_hash_sha256(h, output, sizeof output);\n\n    for (i = 0; i < 32; ++i)\n        printf(\"%02x\", h[i]);\n    printf(\"\\n\");\n\n    assert(sizeof output > 4000);\n\n    crypto_stream_xsalsa20_xor_ic(output, output, 4000, nonce, 0U, firstkey);\n    for (i = 0; i < 4000; ++i)\n        assert(output[i] == 0);\n\n    crypto_stream_xsalsa20_xor_ic(output, output, 4000, nonce, 1U, firstkey);\n    crypto_hash_sha256(h, output, sizeof output);\n    for (i = 0; i < 32; ++i)\n        printf(\"%02x\", h[i]);\n    printf(\"\\n\");\n\n    assert(crypto_stream_keybytes() > 0U);\n    assert(crypto_stream_noncebytes() > 0U);\n    assert(strcmp(crypto_stream_primitive(), \"xsalsa20\") == 0);\n    assert(crypto_stream_keybytes() == crypto_stream_xsalsa20_keybytes());\n    assert(crypto_stream_noncebytes() == crypto_stream_xsalsa20_noncebytes());\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/stream2.c",
    "content": "\n#define TEST_NAME \"stream2\"\n#include \"cmptest.h\"\n\nunsigned char secondkey[32]\n    = { 0xdc, 0x90, 0x8d, 0xda, 0x0b, 0x93, 0x44, 0xa9, 0x53, 0x62, 0x9b,\n        0x73, 0x38, 0x20, 0x77, 0x88, 0x80, 0xf3, 0xce, 0xb4, 0x21, 0xbb,\n        0x61, 0xb9, 0x1c, 0xbd, 0x4c, 0x3e, 0x66, 0x25, 0x6c, 0xe4 };\n\nunsigned char noncesuffix[8]\n    = { 0x82, 0x19, 0xe0, 0x03, 0x6b, 0x7a, 0x0b, 0x37 };\n\nunsigned char output[4194304];\n\nunsigned char h[32];\n\nint main(void)\n{\n    int i;\n    crypto_stream_salsa20(output, sizeof output, noncesuffix, secondkey);\n    crypto_hash_sha256(h, output, sizeof output);\n    for (i = 0; i < 32; ++i)\n        printf(\"%02x\", h[i]);\n    printf(\"\\n\");\n\n    assert(sizeof output > 4000);\n\n    crypto_stream_salsa20_xor_ic(output, output, 4000, noncesuffix, 0U, secondkey);\n    for (i = 0; i < 4000; ++i)\n        assert(output[i] == 0);\n\n    crypto_stream_salsa20_xor_ic(output, output, 4000, noncesuffix, 1U, secondkey);\n    crypto_hash_sha256(h, output, sizeof output);\n    for (i = 0; i < 32; ++i)\n        printf(\"%02x\", h[i]);\n    printf(\"\\n\");\n\n    assert(crypto_stream_salsa20_keybytes() > 0U);\n    assert(crypto_stream_salsa20_noncebytes() > 0U);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/stream3.c",
    "content": "\n#define TEST_NAME \"stream3\"\n#include \"cmptest.h\"\n\nunsigned char firstkey[32]\n    = { 0x1b, 0x27, 0x55, 0x64, 0x73, 0xe9, 0x85, 0xd4, 0x62, 0xcd, 0x51,\n        0x19, 0x7a, 0x9a, 0x46, 0xc7, 0x60, 0x09, 0x54, 0x9e, 0xac, 0x64,\n        0x74, 0xf2, 0x06, 0xc4, 0xee, 0x08, 0x44, 0xf6, 0x83, 0x89 };\n\nunsigned char nonce[24] = { 0x69, 0x69, 0x6e, 0xe9, 0x55, 0xb6, 0x2b, 0x73,\n                            0xcd, 0x62, 0xbd, 0xa8, 0x75, 0xfc, 0x73, 0xd6,\n                            0x82, 0x19, 0xe0, 0x03, 0x6b, 0x7a, 0x0b, 0x37 };\n\nunsigned char rs[32];\n\nint main(void)\n{\n    int i;\n\n    crypto_stream(rs, 32, nonce, firstkey);\n\n    for (i = 0; i < 32; ++i) {\n        printf(\",0x%02x\", (unsigned int)rs[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/stream4.c",
    "content": "\n#define TEST_NAME \"stream4\"\n#include \"cmptest.h\"\n\nunsigned char firstkey[32]\n    = { 0x1b, 0x27, 0x55, 0x64, 0x73, 0xe9, 0x85, 0xd4, 0x62, 0xcd, 0x51,\n        0x19, 0x7a, 0x9a, 0x46, 0xc7, 0x60, 0x09, 0x54, 0x9e, 0xac, 0x64,\n        0x74, 0xf2, 0x06, 0xc4, 0xee, 0x08, 0x44, 0xf6, 0x83, 0x89 };\n\nunsigned char nonce[24] = { 0x69, 0x69, 0x6e, 0xe9, 0x55, 0xb6, 0x2b, 0x73,\n                            0xcd, 0x62, 0xbd, 0xa8, 0x75, 0xfc, 0x73, 0xd6,\n                            0x82, 0x19, 0xe0, 0x03, 0x6b, 0x7a, 0x0b, 0x37 };\n\nunsigned char m[163]\n    = { 0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,    0,\n        0,    0,    0,    0,    0,    0,    0,    0,    0xbe, 0x07, 0x5f, 0xc5,\n        0x3c, 0x81, 0xf2, 0xd5, 0xcf, 0x14, 0x13, 0x16, 0xeb, 0xeb, 0x0c, 0x7b,\n        0x52, 0x28, 0xc5, 0x2a, 0x4c, 0x62, 0xcb, 0xd4, 0x4b, 0x66, 0x84, 0x9b,\n        0x64, 0x24, 0x4f, 0xfc, 0xe5, 0xec, 0xba, 0xaf, 0x33, 0xbd, 0x75, 0x1a,\n        0x1a, 0xc7, 0x28, 0xd4, 0x5e, 0x6c, 0x61, 0x29, 0x6c, 0xdc, 0x3c, 0x01,\n        0x23, 0x35, 0x61, 0xf4, 0x1d, 0xb6, 0x6c, 0xce, 0x31, 0x4a, 0xdb, 0x31,\n        0x0e, 0x3b, 0xe8, 0x25, 0x0c, 0x46, 0xf0, 0x6d, 0xce, 0xea, 0x3a, 0x7f,\n        0xa1, 0x34, 0x80, 0x57, 0xe2, 0xf6, 0x55, 0x6a, 0xd6, 0xb1, 0x31, 0x8a,\n        0x02, 0x4a, 0x83, 0x8f, 0x21, 0xaf, 0x1f, 0xde, 0x04, 0x89, 0x77, 0xeb,\n        0x48, 0xf5, 0x9f, 0xfd, 0x49, 0x24, 0xca, 0x1c, 0x60, 0x90, 0x2e, 0x52,\n        0xf0, 0xa0, 0x89, 0xbc, 0x76, 0x89, 0x70, 0x40, 0xe0, 0x82, 0xf9, 0x37,\n        0x76, 0x38, 0x48, 0x64, 0x5e, 0x07, 0x05 };\n\nunsigned char c[163];\n\nint main(void)\n{\n    int i;\n\n    crypto_stream_xor(c, m, 163, nonce, firstkey);\n\n    for (i = 32; i < 163; ++i) {\n        printf(\",0x%02x\", (unsigned int)c[i]);\n        if (i % 8 == 7)\n            printf(\"\\n\");\n    }\n    printf(\"\\n\");\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/verify1.c",
    "content": "\n#define TEST_NAME \"verify1\"\n#include \"cmptest.h\"\n\nunsigned char v16[16], v16x[16];\nunsigned char v32[32], v32x[32];\nunsigned char v64[64], v64x[64];\n\nint main(void)\n{\n    randombytes_buf(v16, sizeof v16);\n    randombytes_buf(v32, sizeof v32);\n    randombytes_buf(v64, sizeof v64);\n\n    memcpy(v16x, v16, sizeof v16);\n    memcpy(v32x, v32, sizeof v32);\n    memcpy(v64x, v64, sizeof v64);\n\n    printf(\"%d\\n\", crypto_verify_16(v16, v16x));\n    printf(\"%d\\n\", crypto_verify_32(v32, v32x));\n    printf(\"%d\\n\", crypto_verify_64(v64, v64x));\n\n    v16x[randombytes_random() & 15U]++;\n    v32x[randombytes_random() & 31U]++;\n    v64x[randombytes_random() & 63U]++;\n\n    printf(\"%d\\n\", crypto_verify_16(v16, v16x));\n    printf(\"%d\\n\", crypto_verify_32(v32, v32x));\n    printf(\"%d\\n\", crypto_verify_64(v64, v64x));\n\n    assert(crypto_verify_16_bytes() == 16U);\n    assert(crypto_verify_32_bytes() == 32U);\n    assert(crypto_verify_64_bytes() == 64U);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/default/wintest.bat",
    "content": "@ECHO OFF\n\nif \"%1\" == \"\" (\n  echo \"Usage: wintest.bat <Release | ReleaseDLL | Debug | DebugDLL\"\n\tgoto :END\n)\n\nif not exist sodium_version.c (\n\tCD test\\default\n\tif not exist sodium_version.c (\n\t\techo \"Are you on the right path?\" %CD%\n\t\tgoto :END\n\t)\n)\n\nif \"%2\" == \"x64\" (SET ARCH=x64) else (SET ARCH=Win32)\nSET CFLAGS=/nologo /DTEST_SRCDIR=\\\".\\\" /I..\\..\\src\\libsodium\\include\\sodium /I..\\..\\src\\libsodium\\include /I..\\quirks\nSET LDFLAGS=/link /LTCG advapi32.lib ..\\..\\Build\\%1\\%ARCH%\\libsodium.lib\nif \"%1\" == \"ReleaseDLL\" ( goto :ReleaseDLL )\nif \"%1\" == \"DebugDLL\"   ( goto :DebugDLL )\nif \"%1\" == \"Release\"   ( goto :Release )\nif \"%1\" == \"Debug\"   ( goto :Debug )\necho \"Invalid build type\"\ngoto :END\n:ReleaseDLL\n\tSET CFLAGS=%CFLAGS% /MD /Ox \n\tSET PATH=..\\..\\Build\\%1\\%ARCH%;%PATH% \n\tgoto :COMPILE\n:Release\n\tSET CFLAGS=%CFLAGS% /MT /Ox /DSODIUM_STATIC /DSODIUM_EXPORT=\n\tgoto :COMPILE\n:DebugDLL\n\tSET CFLAGS=%CFLAGS% /GS /MDd /Od\n\tSET PATH=..\\..\\Build\\%1\\%ARCH%;%PATH%\n\tgoto :COMPILE\n:Debug\n\tSET CFLAGS=%CFLAGS% /GS /MTd /Od /DSODIUM_STATIC /DSODIUM_EXPORT=\n\tgoto :COMPILE\n:COMPILE\necho Running the test suite:\nFOR %%f in (*.c) DO (\n\tcl %CFLAGS% %%f %LDFLAGS% /OUT:%%f.exe > NUL 2>&1\n\tif not exist %%f.exe (\n\t\techo %%f compile failed\n\t\tgoto :END\n\t)\n\t%%f.exe\n\tif errorlevel 1 ( \n\t\techo %%f failed\n\t) else (\n\t\techo %%f ok\n\t)\n)\nREM Remove temporary files\ndel *.exe *.obj *.res \n:END\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libsodium/test/quirks/quirks.h",
    "content": "\n#include <stdlib.h>\n\n#ifdef __EMSCRIPTEN__\n# define strcmp(s1, s2) xstrcmp(s1, s2)\n\nint\nstrcmp(const char *s1, const char *s2) {\n    while (*s1 == *s2++) { if (*s1++ == 0) return 0; }\n    return *(unsigned char *) s1 - *(unsigned char *) --s2;\n}\n#endif\n\n#ifdef _WIN32\nstatic void\nsrandom(unsigned seed)\n{\n    srand(seed);\n}\n\nstatic long\nrandom(void)\n{\n    return (long) rand();\n}\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/CMakeLists.txt",
    "content": "# Copyright (C) 2007-2013 LuaDist.\n# Created by Peter Drahoš, Peter Kapec\n# Redistribution and use of this file is allowed according to the terms of the MIT license.\n# For details see the COPYRIGHT file distributed with LuaDist.\n# Please note that the package source code is licensed under its own license.\n\nproject ( libudns )\ncmake_minimum_required ( VERSION 2.8 )\n\ninclude_directories( ${CMAKE_CURRENT_BINARY_DIR} )\n\nset ( UDNS_SRC\n  udns_dn.c udns_dntosp.c udns_parse.c udns_resolver.c udns_init.c\n  udns_misc.c udns_XtoX.c\n  udns_rr_a.c udns_rr_ptr.c udns_rr_mx.c udns_rr_txt.c udns_bl.c\n  udns_rr_srv.c udns_rr_naptr.c udns_codes.c udns_jran.c\n)\n\nif (WIN32)\n    list ( APPEND UDNS_LIBS Ws2_32 )\nendif ()\n\nadd_library ( udns STATIC ${UDNS_SRC} )\ntarget_link_libraries ( udns ${UDNS_LIBS} )\n\nset(libudns_include_dirs\n        ${PROJECT_SOURCE_DIR}\n        ${PROJECT_BINARY_DIR}\n        CACHE INTERNAL \"libudns library\" FORCE\n        )\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/COPYING.LGPL",
    "content": "                  GNU LESSER GENERAL PUBLIC LICENSE\n                       Version 2.1, February 1999\n\n Copyright (C) 1991, 1999 Free Software Foundation, Inc.\n 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n[This is the first released version of the Lesser GPL.  It also counts\n as the successor of the GNU Library Public License, version 2, hence\n the version number 2.1.]\n\n                            Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicenses are intended to guarantee your freedom to share and change\nfree software--to make sure the software is free for all its users.\n\n  This license, the Lesser General Public License, applies to some\nspecially designated software packages--typically libraries--of the\nFree Software Foundation and other authors who decide to use it.  You\ncan use it too, but we suggest you first think carefully about whether\nthis license or the ordinary General Public License is the better\nstrategy to use in any particular case, based on the explanations below.\n\n  When we speak of free software, we are referring to freedom of use,\nnot price.  Our General Public Licenses are designed to make sure that\nyou have the freedom to distribute copies of free software (and charge\nfor this service if you wish); that you receive source code or can get\nit if you want it; that you can change the software and use pieces of\nit in new free programs; and that you are informed that you can do\nthese things.\n\n  To protect your rights, we need to make restrictions that forbid\ndistributors to deny you these rights or to ask you to surrender these\nrights.  These restrictions translate to certain responsibilities for\nyou if you distribute copies of the library or if you modify it.\n\n  For example, if you distribute copies of the library, whether gratis\nor for a fee, you must give the recipients all the rights that we gave\nyou.  You must make sure that they, too, receive or can get the source\ncode.  If you link other code with the library, you must provide\ncomplete object files to the recipients, so that they can relink them\nwith the library after making changes to the library and recompiling\nit.  And you must show them these terms so they know their rights.\n\n  We protect your rights with a two-step method: (1) we copyright the\nlibrary, and (2) we offer you this license, which gives you legal\npermission to copy, distribute and/or modify the library.\n\n  To protect each distributor, we want to make it very clear that\nthere is no warranty for the free library.  Also, if the library is\nmodified by someone else and passed on, the recipients should know\nthat what they have is not the original version, so that the original\nauthor's reputation will not be affected by problems that might be\nintroduced by others.\n\f\n  Finally, software patents pose a constant threat to the existence of\nany free program.  We wish to make sure that a company cannot\neffectively restrict the users of a free program by obtaining a\nrestrictive license from a patent holder.  Therefore, we insist that\nany patent license obtained for a version of the library must be\nconsistent with the full freedom of use specified in this license.\n\n  Most GNU software, including some libraries, is covered by the\nordinary GNU General Public License.  This license, the GNU Lesser\nGeneral Public License, applies to certain designated libraries, and\nis quite different from the ordinary General Public License.  We use\nthis license for certain libraries in order to permit linking those\nlibraries into non-free programs.\n\n  When a program is linked with a library, whether statically or using\na shared library, the combination of the two is legally speaking a\ncombined work, a derivative of the original library.  The ordinary\nGeneral Public License therefore permits such linking only if the\nentire combination fits its criteria of freedom.  The Lesser General\nPublic License permits more lax criteria for linking other code with\nthe library.\n\n  We call this license the \"Lesser\" General Public License because it\ndoes Less to protect the user's freedom than the ordinary General\nPublic License.  It also provides other free software developers Less\nof an advantage over competing non-free programs.  These disadvantages\nare the reason we use the ordinary General Public License for many\nlibraries.  However, the Lesser license provides advantages in certain\nspecial circumstances.\n\n  For example, on rare occasions, there may be a special need to\nencourage the widest possible use of a certain library, so that it becomes\na de-facto standard.  To achieve this, non-free programs must be\nallowed to use the library.  A more frequent case is that a free\nlibrary does the same job as widely used non-free libraries.  In this\ncase, there is little to gain by limiting the free library to free\nsoftware only, so we use the Lesser General Public License.\n\n  In other cases, permission to use a particular library in non-free\nprograms enables a greater number of people to use a large body of\nfree software.  For example, permission to use the GNU C Library in\nnon-free programs enables many more people to use the whole GNU\noperating system, as well as its variant, the GNU/Linux operating\nsystem.\n\n  Although the Lesser General Public License is Less protective of the\nusers' freedom, it does ensure that the user of a program that is\nlinked with the Library has the freedom and the wherewithal to run\nthat program using a modified version of the Library.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.  Pay close attention to the difference between a\n\"work based on the library\" and a \"work that uses the library\".  The\nformer contains code derived from the library, whereas the latter must\nbe combined with the library in order to run.\n\f\n                  GNU LESSER GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License Agreement applies to any software library or other\nprogram which contains a notice placed by the copyright holder or\nother authorized party saying it may be distributed under the terms of\nthis Lesser General Public License (also called \"this License\").\nEach licensee is addressed as \"you\".\n\n  A \"library\" means a collection of software functions and/or data\nprepared so as to be conveniently linked with application programs\n(which use some of those functions and data) to form executables.\n\n  The \"Library\", below, refers to any such software library or work\nwhich has been distributed under these terms.  A \"work based on the\nLibrary\" means either the Library or any derivative work under\ncopyright law: that is to say, a work containing the Library or a\nportion of it, either verbatim or with modifications and/or translated\nstraightforwardly into another language.  (Hereinafter, translation is\nincluded without limitation in the term \"modification\".)\n\n  \"Source code\" for a work means the preferred form of the work for\nmaking modifications to it.  For a library, complete source code means\nall the source code for all modules it contains, plus any associated\ninterface definition files, plus the scripts used to control compilation\nand installation of the library.\n\n  Activities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning a program using the Library is not restricted, and output from\nsuch a program is covered only if its contents constitute a work based\non the Library (independent of the use of the Library in a tool for\nwriting it).  Whether that is true depends on what the Library does\nand what the program that uses the Library does.\n\n  1. You may copy and distribute verbatim copies of the Library's\ncomplete source code as you receive it, in any medium, provided that\nyou conspicuously and appropriately publish on each copy an\nappropriate copyright notice and disclaimer of warranty; keep intact\nall the notices that refer to this License and to the absence of any\nwarranty; and distribute a copy of this License along with the\nLibrary.\n\n  You may charge a fee for the physical act of transferring a copy,\nand you may at your option offer warranty protection in exchange for a\nfee.\n\f\n  2. You may modify your copy or copies of the Library or any portion\nof it, thus forming a work based on the Library, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) The modified work must itself be a software library.\n\n    b) You must cause the files modified to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    c) You must cause the whole of the work to be licensed at no\n    charge to all third parties under the terms of this License.\n\n    d) If a facility in the modified Library refers to a function or a\n    table of data to be supplied by an application program that uses\n    the facility, other than as an argument passed when the facility\n    is invoked, then you must make a good faith effort to ensure that,\n    in the event an application does not supply such function or\n    table, the facility still operates, and performs whatever part of\n    its purpose remains meaningful.\n\n    (For example, a function in a library to compute square roots has\n    a purpose that is entirely well-defined independent of the\n    application.  Therefore, Subsection 2d requires that any\n    application-supplied function or table used by this function must\n    be optional: if the application does not supply it, the square\n    root function must still compute square roots.)\n\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Library,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Library, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote\nit.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Library.\n\nIn addition, mere aggregation of another work not based on the Library\nwith the Library (or with a work based on the Library) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may opt to apply the terms of the ordinary GNU General Public\nLicense instead of this License to a given copy of the Library.  To do\nthis, you must alter all the notices that refer to this License, so\nthat they refer to the ordinary GNU General Public License, version 2,\ninstead of to this License.  (If a newer version than version 2 of the\nordinary GNU General Public License has appeared, then you can specify\nthat version instead if you wish.)  Do not make any other change in\nthese notices.\n\f\n  Once this change is made in a given copy, it is irreversible for\nthat copy, so the ordinary GNU General Public License applies to all\nsubsequent copies and derivative works made from that copy.\n\n  This option is useful when you wish to copy part of the code of\nthe Library into a program that is not a library.\n\n  4. You may copy and distribute the Library (or a portion or\nderivative of it, under Section 2) in object code or executable form\nunder the terms of Sections 1 and 2 above provided that you accompany\nit with the complete corresponding machine-readable source code, which\nmust be distributed under the terms of Sections 1 and 2 above on a\nmedium customarily used for software interchange.\n\n  If distribution of object code is made by offering access to copy\nfrom a designated place, then offering equivalent access to copy the\nsource code from the same place satisfies the requirement to\ndistribute the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\n  5. A program that contains no derivative of any portion of the\nLibrary, but is designed to work with the Library by being compiled or\nlinked with it, is called a \"work that uses the Library\".  Such a\nwork, in isolation, is not a derivative work of the Library, and\ntherefore falls outside the scope of this License.\n\n  However, linking a \"work that uses the Library\" with the Library\ncreates an executable that is a derivative of the Library (because it\ncontains portions of the Library), rather than a \"work that uses the\nlibrary\".  The executable is therefore covered by this License.\nSection 6 states terms for distribution of such executables.\n\n  When a \"work that uses the Library\" uses material from a header file\nthat is part of the Library, the object code for the work may be a\nderivative work of the Library even though the source code is not.\nWhether this is true is especially significant if the work can be\nlinked without the Library, or if the work is itself a library.  The\nthreshold for this to be true is not precisely defined by law.\n\n  If such an object file uses only numerical parameters, data\nstructure layouts and accessors, and small macros and small inline\nfunctions (ten lines or less in length), then the use of the object\nfile is unrestricted, regardless of whether it is legally a derivative\nwork.  (Executables containing this object code plus portions of the\nLibrary will still fall under Section 6.)\n\n  Otherwise, if the work is a derivative of the Library, you may\ndistribute the object code for the work under the terms of Section 6.\nAny executables containing that work also fall under Section 6,\nwhether or not they are linked directly with the Library itself.\n\f\n  6. As an exception to the Sections above, you may also combine or\nlink a \"work that uses the Library\" with the Library to produce a\nwork containing portions of the Library, and distribute that work\nunder terms of your choice, provided that the terms permit\nmodification of the work for the customer's own use and reverse\nengineering for debugging such modifications.\n\n  You must give prominent notice with each copy of the work that the\nLibrary is used in it and that the Library and its use are covered by\nthis License.  You must supply a copy of this License.  If the work\nduring execution displays copyright notices, you must include the\ncopyright notice for the Library among them, as well as a reference\ndirecting the user to the copy of this License.  Also, you must do one\nof these things:\n\n    a) Accompany the work with the complete corresponding\n    machine-readable source code for the Library including whatever\n    changes were used in the work (which must be distributed under\n    Sections 1 and 2 above); and, if the work is an executable linked\n    with the Library, with the complete machine-readable \"work that\n    uses the Library\", as object code and/or source code, so that the\n    user can modify the Library and then relink to produce a modified\n    executable containing the modified Library.  (It is understood\n    that the user who changes the contents of definitions files in the\n    Library will not necessarily be able to recompile the application\n    to use the modified definitions.)\n\n    b) Use a suitable shared library mechanism for linking with the\n    Library.  A suitable mechanism is one that (1) uses at run time a\n    copy of the library already present on the user's computer system,\n    rather than copying library functions into the executable, and (2)\n    will operate properly with a modified version of the library, if\n    the user installs one, as long as the modified version is\n    interface-compatible with the version that the work was made with.\n\n    c) Accompany the work with a written offer, valid for at\n    least three years, to give the same user the materials\n    specified in Subsection 6a, above, for a charge no more\n    than the cost of performing this distribution.\n\n    d) If distribution of the work is made by offering access to copy\n    from a designated place, offer equivalent access to copy the above\n    specified materials from the same place.\n\n    e) Verify that the user has already received a copy of these\n    materials or that you have already sent this user a copy.\n\n  For an executable, the required form of the \"work that uses the\nLibrary\" must include any data and utility programs needed for\nreproducing the executable from it.  However, as a special exception,\nthe materials to be distributed need not include anything that is\nnormally distributed (in either source or binary form) with the major\ncomponents (compiler, kernel, and so on) of the operating system on\nwhich the executable runs, unless that component itself accompanies\nthe executable.\n\n  It may happen that this requirement contradicts the license\nrestrictions of other proprietary libraries that do not normally\naccompany the operating system.  Such a contradiction means you cannot\nuse both them and the Library together in an executable that you\ndistribute.\n\f\n  7. You may place library facilities that are a work based on the\nLibrary side-by-side in a single library together with other library\nfacilities not covered by this License, and distribute such a combined\nlibrary, provided that the separate distribution of the work based on\nthe Library and of the other library facilities is otherwise\npermitted, and provided that you do these two things:\n\n    a) Accompany the combined library with a copy of the same work\n    based on the Library, uncombined with any other library\n    facilities.  This must be distributed under the terms of the\n    Sections above.\n\n    b) Give prominent notice with the combined library of the fact\n    that part of it is a work based on the Library, and explaining\n    where to find the accompanying uncombined form of the same work.\n\n  8. You may not copy, modify, sublicense, link with, or distribute\nthe Library except as expressly provided under this License.  Any\nattempt otherwise to copy, modify, sublicense, link with, or\ndistribute the Library is void, and will automatically terminate your\nrights under this License.  However, parties who have received copies,\nor rights, from you under this License will not have their licenses\nterminated so long as such parties remain in full compliance.\n\n  9. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Library or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Library (or any work based on the\nLibrary), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Library or works based on it.\n\n  10. Each time you redistribute the Library (or any work based on the\nLibrary), the recipient automatically receives a license from the\noriginal licensor to copy, distribute, link with or modify the Library\nsubject to these terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties with\nthis License.\n\f\n  11. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Library at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Library by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Library.\n\nIf any portion of this section is held invalid or unenforceable under any\nparticular circumstance, the balance of the section is intended to apply,\nand the section as a whole is intended to apply in other circumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\n  12. If the distribution and/or use of the Library is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Library under this License may add\nan explicit geographical distribution limitation excluding those countries,\nso that distribution is permitted only in or among countries not thus\nexcluded.  In such case, this License incorporates the limitation as if\nwritten in the body of this License.\n\n  13. The Free Software Foundation may publish revised and/or new\nversions of the Lesser General Public License from time to time.\nSuch new versions will be similar in spirit to the present version,\nbut may differ in detail to address new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Library\nspecifies a version number of this License which applies to it and\n\"any later version\", you have the option of following the terms and\nconditions either of that version or of any later version published by\nthe Free Software Foundation.  If the Library does not specify a\nlicense version number, you may choose any version ever published by\nthe Free Software Foundation.\n\f\n  14. If you wish to incorporate parts of the Library into other free\nprograms whose distribution conditions are incompatible with these,\nwrite to the author to ask for permission.  For software which is\ncopyrighted by the Free Software Foundation, write to the Free\nSoftware Foundation; we sometimes make exceptions for this.  Our\ndecision will be guided by the two goals of preserving the free status\nof all derivatives of our free software and of promoting the sharing\nand reuse of software generally.\n\n                            NO WARRANTY\n\n  15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO\nWARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.\nEXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR\nOTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY\nKIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE\nIMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR\nPURPOSE.  THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE\nLIBRARY IS WITH YOU.  SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME\nTHE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.\n\n  16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN\nWRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY\nAND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU\nFOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR\nCONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE\nLIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING\nRENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A\nFAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF\nSUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGES.\n\n                     END OF TERMS AND CONDITIONS\n\f\n           How to Apply These Terms to Your New Libraries\n\n  If you develop a new library, and you want it to be of the greatest\npossible use to the public, we recommend making it free software that\neveryone can redistribute and change.  You can do so by permitting\nredistribution under these terms (or, alternatively, under the terms of the\nordinary General Public License).\n\n  To apply these terms, attach the following notices to the library.  It is\nsafest to attach them to the start of each source file to most effectively\nconvey the exclusion of warranty; and each file should have at least the\n\"copyright\" line and a pointer to where the full notice is found.\n\n    <one line to give the library's name and a brief idea of what it does.>\n    Copyright (C) <year>  <name of author>\n\n    This library is free software; you can redistribute it and/or\n    modify it under the terms of the GNU Lesser General Public\n    License as published by the Free Software Foundation; either\n    version 2.1 of the License, or (at your option) any later version.\n\n    This library is distributed in the hope that it will be useful,\n    but WITHOUT ANY WARRANTY; without even the implied warranty of\n    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n    Lesser General Public License for more details.\n\n    You should have received a copy of the GNU Lesser General Public\n    License along with this library; if not, write to the Free Software\n    Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA\n\nAlso add information on how to contact you by electronic and paper mail.\n\nYou should also get your employer (if you work as a programmer) or your\nschool, if any, to sign a \"copyright disclaimer\" for the library, if\nnecessary.  Here is a sample; alter the names:\n\n  Yoyodyne, Inc., hereby disclaims all copyright interest in the\n  library `Frob' (a library for tweaking knobs) written by James Random Hacker.\n\n  <signature of Ty Coon>, 1 April 1990\n  Ty Coon, President of Vice\n\nThat's all there is to it!\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/Makefile.am",
    "content": "SRCS   = udns_dn.c udns_dntosp.c udns_parse.c udns_resolver.c udns_init.c \\\n\tudns_misc.c udns_XtoX.c \\\n\tudns_rr_a.c udns_rr_ptr.c udns_rr_mx.c udns_rr_txt.c udns_bl.c \\\n\tudns_rr_srv.c udns_rr_naptr.c udns_codes.c udns_jran.c\n\nnoinst_LTLIBRARIES=libudns.la\nlibudns_la_SOURCES= ${SRCS}\nlibudns_la_LDFLAGS= -static\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/Makefile.in",
    "content": "# Makefile.in generated by automake 1.15 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2014 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\nam__is_gnu_make = { \\\n  if test -z '$(MAKELEVEL)'; then \\\n    false; \\\n  elif test -n '$(MAKE_HOST)'; then \\\n    true; \\\n  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \\\n    true; \\\n  else \\\n    false; \\\n  fi; \\\n}\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\nsubdir = libudns\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \\\n\t$(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/inet_ntop.m4 \\\n\t$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \\\n\t$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \\\n\t$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/mbedtls.m4 \\\n\t$(top_srcdir)/m4/openssl.m4 $(top_srcdir)/m4/pcre.m4 \\\n\t$(top_srcdir)/m4/polarssl.m4 \\\n\t$(top_srcdir)/m4/stack-protector.m4 $(top_srcdir)/m4/zlib.m4 \\\n\t$(top_srcdir)/libev/libev.m4 $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nDIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nLTLIBRARIES = $(noinst_LTLIBRARIES)\nlibudns_la_LIBADD =\nam__objects_1 = udns_dn.lo udns_dntosp.lo udns_parse.lo \\\n\tudns_resolver.lo udns_init.lo udns_misc.lo udns_XtoX.lo \\\n\tudns_rr_a.lo udns_rr_ptr.lo udns_rr_mx.lo udns_rr_txt.lo \\\n\tudns_bl.lo udns_rr_srv.lo udns_rr_naptr.lo udns_codes.lo \\\n\tudns_jran.lo\nam_libudns_la_OBJECTS = $(am__objects_1)\nlibudns_la_OBJECTS = $(am_libudns_la_OBJECTS)\nAM_V_lt = $(am__v_lt_@AM_V@)\nam__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)\nam__v_lt_0 = --silent\nam__v_lt_1 = \nlibudns_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \\\n\t$(libudns_la_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nDEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)\ndepcomp = $(SHELL) $(top_srcdir)/auto/depcomp\nam__depfiles_maybe = depfiles\nam__mv = mv -f\nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nLTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \\\n\t$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \\\n\t$(AM_CFLAGS) $(CFLAGS)\nAM_V_CC = $(am__v_CC_@AM_V@)\nam__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)\nam__v_CC_0 = @echo \"  CC      \" $@;\nam__v_CC_1 = \nCCLD = $(CC)\nLINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \\\n\t$(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_CCLD = $(am__v_CCLD_@AM_V@)\nam__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)\nam__v_CCLD_0 = @echo \"  CCLD    \" $@;\nam__v_CCLD_1 = \nSOURCES = $(libudns_la_SOURCES)\nDIST_SOURCES = $(libudns_la_SOURCES)\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nam__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/auto/depcomp \\\n\tNEWS TODO\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAR = @AR@\nASCIIDOC = @ASCIIDOC@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDLLTOOL = @DLLTOOL@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nGZIP = @GZIP@\nINET_NTOP_LIB = @INET_NTOP_LIB@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBPCRE = @LIBPCRE@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMANIFEST_TOOL = @MANIFEST_TOOL@\nMKDIR_P = @MKDIR_P@\nMV = @MV@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nPCRE_CONFIG = @PCRE_CONFIG@\nPTHREAD_CC = @PTHREAD_CC@\nPTHREAD_CFLAGS = @PTHREAD_CFLAGS@\nPTHREAD_LIBS = @PTHREAD_LIBS@\nRANLIB = @RANLIB@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nXMLTO = @XMLTO@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_AR = @ac_ct_AR@\nac_ct_CC = @ac_ct_CC@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nax_pthread_config = @ax_pthread_config@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npcre_pcreh = @pcre_pcreh@\npcreh = @pcreh@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nrunstatedir = @runstatedir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsubdirs = @subdirs@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nSRCS = udns_dn.c udns_dntosp.c udns_parse.c udns_resolver.c udns_init.c \\\n\tudns_misc.c udns_XtoX.c \\\n\tudns_rr_a.c udns_rr_ptr.c udns_rr_mx.c udns_rr_txt.c udns_bl.c \\\n\tudns_rr_srv.c udns_rr_naptr.c udns_codes.c udns_jran.c\n\nnoinst_LTLIBRARIES = libudns.la\nlibudns_la_SOURCES = ${SRCS}\nlibudns_la_LDFLAGS = -static\nall: all-am\n\n.SUFFIXES:\n.SUFFIXES: .c .lo .o .obj\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign libudns/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign libudns/Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\nclean-noinstLTLIBRARIES:\n\t-test -z \"$(noinst_LTLIBRARIES)\" || rm -f $(noinst_LTLIBRARIES)\n\t@list='$(noinst_LTLIBRARIES)'; \\\n\tlocs=`for p in $$list; do echo $$p; done | \\\n\t      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \\\n\t      sort -u`; \\\n\ttest -z \"$$locs\" || { \\\n\t  echo rm -f $${locs}; \\\n\t  rm -f $${locs}; \\\n\t}\n\nlibudns.la: $(libudns_la_OBJECTS) $(libudns_la_DEPENDENCIES) $(EXTRA_libudns_la_DEPENDENCIES) \n\t$(AM_V_CCLD)$(libudns_la_LINK)  $(libudns_la_OBJECTS) $(libudns_la_LIBADD) $(LIBS)\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udns_XtoX.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udns_bl.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udns_codes.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udns_dn.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udns_dntosp.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udns_init.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udns_jran.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udns_misc.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udns_parse.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udns_resolver.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udns_rr_a.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udns_rr_mx.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udns_rr_naptr.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udns_rr_ptr.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udns_rr_srv.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/udns_rr_txt.Plo@am__quote@\n\n.c.o:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.o$$||'`;\\\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<\n\n.c.obj:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.obj$$||'`;\\\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\n.c.lo:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.lo$$||'`;\\\n@am__fastdepCC_TRUE@\t$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-am\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-am\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscopelist: cscopelist-am\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(LTLIBRARIES)\ninstalldirs:\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \\\n\tmostlyclean-am\n\ndistclean: distclean-am\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am:\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic \\\n\tmostlyclean-libtool\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am:\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \\\n\tclean-libtool clean-noinstLTLIBRARIES cscopelist-am ctags \\\n\tctags-am distclean distclean-compile distclean-generic \\\n\tdistclean-libtool distclean-tags distdir dvi dvi-am html \\\n\thtml-am info info-am install install-am install-data \\\n\tinstall-data-am install-dvi install-dvi-am install-exec \\\n\tinstall-exec-am install-html install-html-am install-info \\\n\tinstall-info-am install-man install-pdf install-pdf-am \\\n\tinstall-ps install-ps-am install-strip installcheck \\\n\tinstallcheck-am installdirs maintainer-clean \\\n\tmaintainer-clean-generic mostlyclean mostlyclean-compile \\\n\tmostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \\\n\ttags tags-am uninstall uninstall-am\n\n.PRECIOUS: Makefile\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/NEWS",
    "content": "NEWS\nUser-visible changes in udns library.  Recent changes on top.\n\n0.4 (Jan 2014)\n\n - bugfix: fix a bug in new list code introduced in 0.3\n - portability: use $(LD)/$(LDFLAGS)/$(LIBS)\n\n0.3 (Jan 2014)\n\n - bugfix: refactor double-linked list implementation in udns_resolver.c\n   (internal to the library) to be more strict-aliasing-friendly, because\n   old code were miscompiled by gcc.\n\n - bugfix: forgotten strdup() in rblcheck\n\n0.2 (Dec 2011)\n\n - bugfix: SRV RR handling: fix domain name parsing and crash in case\n   if no port is specified on input for SRV record query\n\n - (trivial api) dns_set_opts() now returns number of unrecognized \n   options instead of always returning 0\n\n - dnsget: combine -f and -o options in dnsget (and stop documenting -f),\n   and report unknown/invalid -o options (and error out)\n\n - dnsget: pretty-print SSHFP RRs\n\n 0.1 (Dec 2010)\n\n - bugfix: udns_new(old) - when actually cloning another context -\n   makes the new context referencing memory from old, which leads\n   to crashes when old is modified later\n\n - use random queue IDs (the 16bit qID) in queries instead of sequentional\n   ones, based on simple pseudo-random RNG by Bob Jenkins (udns_jran.[ch]).\n   Some people believe that this improves security (CVE-2008-1447).  I'm\n   still not convinced (see comments in udns_resolver.c), but it isn't\n   difficult to add after all.\n\n - deprecate dns_random16() function which was declared in udns.h\n   (not anymore) but never documented.  In order to keep ABI compatible\n   it is still exported.\n\n - library has a way now to set query flags (DNS_SET_DO; DNS_SET_CD).\n\n - dnsget now prints non-printable chars in all strings in DNS RRs using\n   decimal escape sequences (\\%03u) instead of hexadecimal (\\%02x) when\n   before - other DNS software does it like this.\n\n - recognize a few more record types in dnsget, notable some DNSSEC RRs;\n   add -f option for dnsget to set query flags.\n\n - udns is not a Debian native package anymore (was a wrong idea)\n\n0.0.9 (16 Jan 2007)\n\n - incompat: minor API changes in dns_init() &friends.  dns_init()\n   now requires extra `struct dns_ctx *' argument.  Not bumped\n   soversion yet - I only expect one \"release\" with this change.\n\n - many small bugfixes, here and there\n\n - more robust FORMERR replies handling - not only such replies are now\n   recognized, but udns retries queries without EDNS0 extensions if tried\n   with, but server reported FORMERR\n\n - portability changes, udns now includes getopt() implementation fo\n   the systems lacking it (mostly windows), and dns_ntop()&dns_pton(),\n   which are either just wrappers for system functions or reimplementations.\n\n - build is now based on autoconf-like configuration\n\n - NAPTR (RFC3403) RR decoding support\n\n - new file NOTES which complements TODO somewhat, and includes some\n   important shortcomings\n\n - many internal cleanups, including some preparations for better error\n   recovery, security and robustness (and thus API changes)\n\n - removed some #defines which are now unused (like DNS_MAXSRCH)\n\n - changed WIN32 to WINDOWS everywhere in preprocessor tests,\n   to be able to build it on win64 as well\n\n0.0.8 (12 Sep 2005)\n\n - added SRV records (rfc2782) parsing,\n   thanks to Thadeu Lima de Souza Cascardo for implementation.\n\n - bugfixes:\n   o use uninitialized value when no reply, library died with assertion:\n     assert((status < 0 && result == 0) || (status >= 0 && result != 0)).\n   o on some OSes, struct sockaddr_in has additional fields, so\n     memcmp'ing two sockaddresses does not work.\n\n - rblcheck(.1)\n\n0.0.7 (20 Apr 2005)\n\n - dnsget.1 manpage and several enhancements to dnsget.\n\n - allow nameserver names for -n option of dnsget.\n\n - API change: all dns_submit*() routines now does not expect\n   last `now' argument, since requests aren't sent immediately\n   anymore.\n\n - API change: different application timer callback mechanism.\n   Udns now uses single per-context timer instead of per-query.\n\n - don't assume DNS replies only contain backward DN pointers,\n   allow forward pointers too.  Change parsing API.\n\n - debianize\n\n0.0.6 (08 Apr 2005)\n\n - use double sorted list for requests (sorted by deadline).\n   This should significantly speed up timeout processing for\n   large number of requests.\n\n - changed debugging interface, so it is finally useable\n   (still not documented).\n\n - dnsget routine is now Officially Useable, and sometimes\n   even more useable than `host' from BIND distribution\n   (and sometimes not - dnsget does not have -C option\n   and TCP mode)\n\n - Debian packaging in debian/ -- udns is now maintained as a\n   native Debian package.\n\n - alot (and I really mean alot) of code cleanups all over.\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/NOTES",
    "content": "Assorted notes about udns (library).\n\nUDP-only mode\n~~~~~~~~~~~~~\n\nFirst of all, since udns is (currently) UDP-only, there are some\nshortcomings.\n\nIt assumes that a reply will fit into a UDP buffer.  With adoption of EDNS0,\nand general robustness of IP stacks, in most cases it's not an issue.  But\nin some cases there may be problems:\n\n - if an RRset is \"very large\" so it does not fit even in buffer of size\n   requested by the library (current default is 4096; some servers limits\n   it further), we will not see the reply, or will only see \"damaged\"\n   reply (depending on the server).\n\n - many DNS servers ignores EDNS0 option requests.  In this case, no matter\n   which buffer size udns library will request, such servers reply is limited\n   to 512 bytes (standard pre-EDNS0 DNS packet size).  (Udns falls back to\n   non-EDNO0 query if EDNS0-enabled one received FORMERR or NOTIMPL error).\n\nThe problem is that with this, udns currently will not consider replies with\nTC (truncation) bit set, and will treat such replies the same way as it\ntreats SERVFAIL replies, thus trying next server, or temp-failing the query\nif no more servers to try.  In other words, if the reply is really large, or\nif the servers you're using don't support EDNS0, your application will be\nunable to resolve a given name.\n\nYet it's not common situation - in practice, it's very rare.\n\nImplementing TCP mode isn't difficult, but it complicates API significantly.\nCurrently udns uses only single UDP socket (or - maybe in the future - two,\nsee below), but in case of TCP, it will need to open and close sockets for\nTCP connections left and right, and that have to be integrated into an\napplication's event loop in an easy and efficient way.  Plus all the\ntimeouts - different for connect(), write, and several stages of read.\n\nIPv6 vs IPv4 usage\n~~~~~~~~~~~~~~~~~~\n\nThis is only relevant for nameservers reachable over IPv6, NOT for IPv6\nqueries.  I.e., if you've IPv6 addresses in 'nameservers' line in your\n/etc/resolv.conf file.  Even more: if you have BOTH IPv6 AND IPv4 addresses\nthere.  Or pass them to udns initialization routines.\n\nSince udns uses a single UDP socket to communicate with all nameservers,\nit should support both v4 and v6 communications.  Most current platforms\nsupports this mode - using PF_INET6 socket and V4MAPPED addresses, i.e,\n\"tunnelling\" IPv4 inside IPv6.  But not all systems supports this.  And\nmore, it has been said that such mode is deprecated.\n\nSo, list only IPv4 or only IPv6 addresses, but don't mix them, in your\n/etc/resolv.conf.\n\nAn alternative is to use two sockets instead of 1 - one for IPv6 and one\nfor IPv4.  For now I'm not sure if it's worth the complexity - again, of\nthe API, not the library itself (but this will not simplify library either).\n\nSingle socket for all queries\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nUsing single UDP socket for sending queries to all nameservers has obvious\nadvantages.  First it's, again, trivial, simple to use API.  And simple\nlibrary too.  Also, after sending queries to all nameservers (in case first\ndidn't reply in time), we will be able to receive late reply from first\nnameserver and accept it.\n\nBut this mode has disadvantages too.  Most important is that it's much easier\nto send fake reply to us, as the UDP port where we expects the reply to come\nto is constant during the whole lifetime of an application.  More secure\nimplementations uses random port for every single query.  While port number\n(16 bits integer) can not hold much randomness, it's still of some help.\nOk, udns is a stub resolver, so it expects sorta friendly environment, but\non LAN it's usually much easier to fire an attack, due to the speed of local\nnetwork, where a bad guy can generate alot of packets in a short time.\n\nSpoofing of replies (Kaminsky attack, CVE-2008-1447)\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nWhile udns uses random numbers for query IDs, it uses single UDP port for\nall queries (see previous item).  And even if it used random UDP port for\neach query, the attack described in CVE-2008-1447 is still quite trivial.\nThis is not specific to udns library unfortunately - it is inherent property\nof the protocol.  Udns is designed to work in a LAN, it needs full recursive\nresolver nearby, and modern LAN usually uses high-bandwidth equipment which\nmakes the Kaminsky attack trivial.  The problem is that even with qID (16\nbits) and random UDP port (about 20 bits available to a regular process)\ncombined still can not hold enough randomness, so on a fast network it is\nstill easy to flood the target with fake replies and hit the \"right\" reply\nbefore real reply comes.  So random qIDs don't add much protection anyway,\neven if this feature is implemented in udns, and using all available\ntechniques wont solve it either.\n\nSee also long comment in udns_resolver.c, udns_newid().\n\nAssumptions about RRs returned\n~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n\nCurrently udns processes records in the reply it received sequentially.\nThis means that order of the records is significant.  For example, if\nwe asked for foo.bar A, but the server returned that foo.bar is a CNAME\n(alias) for bar.baz, and bar.baz, in turn, has address 1.2.3.4, when\nthe CNAME should come first in reply, followed by A.  While DNS specs\ndoes not say anything about order of records - it's an rrSET - unordered, -\nI think an implementation which returns the records in \"wrong\" order is\nsomewhat insane...\n\nCNAME recursion\n~~~~~~~~~~~~~~~\n\nAnother interesting point is the handling of CNAMEs returned as replies\nto non-CNAME queries.  If we asked for foo.bar A, but it's a CNAME, udns\nexpects BOTH the CNAME itself and the target DN to be present in the reply.\nIn other words, udns DOES NOT RECURSE CNAMES.  If we asked for foo.bar A,\nbut only record in reply was that foo.bar is a CNAME for bar.baz, udns will\nreturn no records to an application (NXDOMAIN).  Strictly speaking, udns\nshould repeat the query asking for bar.baz A, and recurse.  But since it's\nstub resolver, recursive resolver should recurse for us instead.\n\nIt's not very difficult to implement, however.  Probably with some (global?)\nflag to en/dis-able the feature.  Provided there's some demand for it.\n\nTo clarify: udns handles CNAME recursion in a single reply packet just fine.\n\nNote also that standard gethostbyname() routine does not recurse in this\nsituation, too.\n\nError reporting\n~~~~~~~~~~~~~~~\n\nToo many places in the code (various failure paths) sets generic \"TEMPFAIL\"\nerror condition.  For example, if no nameserver replied to our query, an\napplication will get generic TEMPFAIL, instead of something like TIMEDOUT.\nThis probably should be fixed, but most applications don't care about the\nexact reasons of failure - 4 common cases are already too much:\n  - query returned some valid data\n  - NXDOMAIN\n  - valid domain but no data of requested type - =NXDOMAIN in most cases\n  - temporary error - this one sometimes (incorrectly!) treated as NXDOMAIN\n    by (naive) applications.\nDNS isn't yes/no, it's at least 3 variants, temp err being the 3rd important\ncase!  And adding more variations for the temp error case is complicating things\neven more - again, from an application writer standpoint.  For diagnostics,\nsuch more specific error cases are of good help.\n\nPlanned API changes\n~~~~~~~~~~~~~~~~~~~\n\nAt least one thing I want to change for some future version is a way how\nqueries are submitted and how replies are handled.\n\nI want to made dns_query object to be owned by an application.  So that instead\nof udns library allocating it for the lifetime of query, it will be pre-\nallocated by an application.  This simplifies and enhances query submitting\ninterface, and complicates it a bit too, in simplest cases.\n\nCurrently, we have:\n\ndns_submit_dn(dn, cls, typ, flags, parse, cbck, data)\ndns_submit_p(name, cls, typ, flags, parse, cbck, data)\ndns_submit_a4(ctx, name, flags, cbck, data)\n\nand so on -- with many parameters missed for type-specific cases, but generic\ncases being too complex for most common usage.\n\nInstead, with dns_query being owned by an app, we will be able to separately\nset up various parts of the query - domain name (various forms), type&class,\nparser, flags, callback...  and even change them at runtime.  And we will also\nbe able to reuse query structures, instead of allocating/freeing them every\ntime.  So the whole thing will look something like:\n\n q = dns_alloc_query();\n dns_submit(dns_q_flags(dns_q_a4(q, name, cbck), DNS_F_NOSRCH), data);\n\nThe idea is to have a set of functions accepting struct dns_query* and\nreturning it (so the calls can be \"nested\" like the above), to set up\nrelevant parts of the query - specific type of callback, conversion from\n(type-specific) query parameters into a domain name (this is for type-\nspecific query initializers), and setting various flags and options and\ntype&class things.\n\nOne example where this is almost essential - if we want to support\nper-query set of nameservers (which isn't at all useless: imagine a\nhigh-volume mail server, were we want to direct DNSBL queries to a separate\nset of nameservers, and rDNS queries to their own set and so on).  Adding\nanother argument (set of nameservers to use) to EVERY query submitting\nroutine is.. insane.  Especially since in 99% cases it will be set to\ndefault NULL.  But with such \"nesting\" of query initializers, it becomes\ntrivial.\n\nThis change (the way how queries gets submitted) will NOT break API/ABI\ncompatibility with old versions, since the new submitting API works in\nparallel with current (and current will use the new one as building\nblocks, instead of doing all work at once).\n\nAnother way to do the same is to manipulate query object right after a\nquery has been submitted, but before any events processing (during this\ntime, query object is allocated and initialized, but no actual network\npackets were sent - it will happen on the next event processing).  But\nthis way it become impossible to perform syncronous resolver calls, since\nthose calls hide query objects they use internally.\n\nSpeaking of replies handling - the planned change is to stop using dynamic\nmemory (malloc) inside the library.  That is, instead of allocating a buffer\nfor a reply dynamically in a parsing routine (or memdup'ing the raw reply\npacket if no parsing routine is specified), I want udns to return the packet\nbuffer it uses internally, and change parsing routines to expect a buffer\nfor result.  When parsing, a routine will return true amount of memory it\nwill need to place the result, regardless of whenever it has enough room\nor not, so that an application can (re)allocate properly sized buffer and\ncall a parsing routine again.\n\nThis, in theory, also can be done without breaking current API/ABI, but in\nthat case we'll again need a parallel set of routines (parsing included),\nwhich makes the library more complicated with too many ways of doing the\nsame thing.  Still, code reuse is at good level.\n\nAnother modification I plan to include is to have an ability to work in\nterms of domain names (DNs) as used with on-wire DNS packets, not only\nwith asciiz representations of them.  For this to work, the above two\nchanges (query submission and result passing) have to be completed first\n(esp. the query submission part), so that it will be possible to specify\nsome additional query flags (for example) to request domain names instead\nof the text strings, and to allow easy query submissions with either DNs\nor text strings.\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/TODO",
    "content": "TODO\n\nThe following is mostly an internal, not user-visible stuff.\n\n* rearrange an API to make dns_query object owned by application,\n  so that it'll look like this:\n   struct dns_query *q;\n   q = dns_query_alloc(ctx);\n   dns_query_set(q, options, domain_name, flags, ...);\n   dns_query_submit(ctx, q);\n  For more information see NOTES file, section \"Planned API changes\".\n\n* allow NULL callbacks?  Or provide separate resolver\n  context list of queries which are done but wich did not\n  have callback, and dns_pick() routine to retrieve results\n  from this query, i.e. allow non-callback usage?  The\n  non-callback usage may be handy sometimes (any *good*\n  example?), but it will be difficult to provide type-safe\n  non-callback interface due to various RR-specific types\n  in use.\n\n* DNS_OPT_FLAGS should be DNS_OPT_ADDFLAGS and DNS_OPT_SETFLAGS.\n  Currently one can't add a single flag bit but preserve\n  existing bits... at least not without retrieving all current\n  flags before, which isn't that bad anyway.\n\n* dns_set_opts() may process flags too (such as aaonly etc)\n\n* a way to disable $NSCACHEIP et al processing?\n  (with now separate dns_init() and dns_reset(), it has finer\n  control, but still no way to init from system files but ignore\n  environment variables and the like)\n\n* initialize/open the context automatically, and be more\n  liberal about initialization in general?\n\n* dns_init(ctx, do_open) - make the parameter opposite, aka\n  dns_init(ctx, skip_open) ?\n\n* allow TCP queue?\n\n* more accurate error reporting.  Currently, udns always returns TEMPFAIL,\n  but don't specify why it happened (ENOMEM, timeout, etc).\n\n* check the error value returned by recvfrom() and\n  sendto() and determine which errors to ignore.\n\n* maybe merge dns_timeouts() and dns_ioevent(), to have\n  only one entry point for everything?  For traditional\n  select-loop-based eventloop it may be easier, but for\n  callback-driven event loops the two should be separate.\n  Provide an option, or a single dns_events() entry point\n  for select-loop approach, or just call dns_ioevent()\n  from within dns_timeouts() (probably after renaming\n  it to be dns_events()) ?\n\n* implement /etc/hosts lookup too, ala [c-]ares??\n\n* sortlist support?\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/dnsget.1",
    "content": ".\\\" dnsget.1: dnsget manpage\n.\\\"\n.\\\" Copyright (C) 2005-2014  Michael Tokarev <mjt+udns@tls.msk.ru>\n.\\\" This file is part of UDNS library, an async DNS stub resolver.\n.\\\"\n.\\\" This library is free software; you can redistribute it and/or\n.\\\" modify it under the terms of the GNU Lesser General Public\n.\\\" License as published by the Free Software Foundation; either\n.\\\" version 2.1 of the License, or (at your option) any later version.\n.\\\"\n.\\\" This library is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" Lesser General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU Lesser General Public\n.\\\" License along with this library, in file named COPYING.LGPL; if not,\n.\\\" write to the Free Software Foundation, Inc., 59 Temple Place,\n.\\\" Suite 330, Boston, MA  02111-1307  USA\n\n.TH dnsget 1 \"Jan 2014\" \"User Utilities\"\n\n.SH NAME\ndnsget \\- DNS lookup utility\n\n.SH SYNOPSYS\n.B dnsget\n.RB [\\| \\-v \\||\\| \\-q \\|]\n.RB [\\| \\-c\n.IR class \\|]\n.RB [\\| \\-t\n.IR type \\|]\n.RB [\\| \\-o\n.IR opt , opt ,...]\n.IR name \\|.\\|.\\|.\n\n.SH DESCRIPTION\n.B dnsget\nis a simple command-line to perform DNS lookups, similar to\n.BR host (1)\nand\n.BR dig (1).\nIt is useable for both interactive/debugging scenarious and\nin scripts.\nThe program is implemented using\n.BR udns (3)\nlibrary.\n\n.PP\nBy default,\n.B dnsget\nproduces a human-readable output, similar to\n.RS\n.nf\nalias.example.com. CNAME www.example.com.\nwww.example.com. A 192.168.1.1\nwww.example.com. MX 10 mx.example.com.\n.fi\n.RE\nwhich is just sufficient to see how a given name resolves.\nOutput format is controllable with\n.B \\-v\nand\n.B \\-q\noptions -- the former increases verbosity level up to printing\nthe whole DNS contents of all packets sent and received, which\nis suitable for debugging DNS problems, while the latter reduces\nthe level, making output more quiet, up to bare result with no\nerror messages, which is good for scripts.\n\n.SH OPTIONS\n\nThe following options are recognized by\n.BR dnsget :\n\n.TP\n.B \\-v\nproduce more detailed output.  More\n.BR \\-v 's\nmeans more details will be produced.  With single\n.BR \\-v , dnsget\nwill print contents of all received DNS packets (in a readable format),\nwhile with\n.BR \\-vv ,\nit will output all outgoing DNS packets too.\n\n.TP\n.B \\-q\nthe opposite for \\fB\\-v\\fR -- produce less detailed output.\nWith single\n.BR \\-q , dnsget\nwill only show (decoded) data from final DNS resource records (RR),\nwhile\n.B \\-qq\nalso suppresses error messages.\n\n.TP\n\\fB\\-t \\fItype\\fR\nrequest record(s) of the given type \\fItype\\fR.  By default,\n.B dnsget\nwill ask for IPv4 address (A) record, or for PTR record if the\nargument in question is an IPv4 or IPv6 address.  Recognized\ntypes include A, AAAA, MX, TXT, CNAME, PTR, NS, SOA, ANY and\nothers.\n\n.TP\n\\fB\\-c \\fIclass\\fR\nrequest DNS record(s) of the given class \\fIclass\\fR.  By\ndefault\n.B dnsget\nuses IN class.  Valid classes include IN, CH, HS, ANY.\n\n.TP\n.B \\-a\n(compatibility option).  Equivalent to setting query type to\n.B ANY\nand increasing verbosity level\n.RB ( \\-v ).\n\n.TP\n.B \\-C\n(planned)\n\n.TP\n.B \\-x\n(planned)\n\n.TP\n\\fB\\-o \\fIopt\\fR,\\fIopt\\fR,...\n(may be specified several times).\nSet resolver options (in a form \\fIoption\\fR:\\fIvalue\\fR) as if they\nwere set in\n.RB $ RES_OPTIONS\nenvironment variable, or set query flags:\n.RS\n.TP\n\\fBtimeout\\fR:\\fIsec\\fR\nSet initial query timeout to \\fIsec\\fR.\n.TP\n\\fBattempts\\fR:\\fInum\\fR\n(re)try every query \\fInum\\fR times before failing.\n.TP\n\\fBudpbuf\\fR:\\fIbytes\\fR\nset DNS UDP buffer size to \\fIbytes\\fR bytes.  Valid values\nare from 512 to 65535.  If \\fIbytes\\fR is greather than 512,\nEDNS0 (RFC 2671) extensions will be used.\n.TP\n\\fBport\\fR:\\fInum\\fR\nUse given UDP port number \\fInum\\fR instead of the default port 53 (domain).\n.TP\n\\fBaa\\fR\nset AA (auth only) query bit.\n.TP\n\\fBnord\\fR\ndo not set RD (recursion desired) query bit (set by default).\n.TP\n\\fBdnssec\\fR or \\fBdo\\fR\nset DNSSEC OK (DO) query flag (\\fBdnsget\\fR does not verify DNSSEC signatures,\nonly displays them; this is set in EDNS RR).\n.TP\n\\fBcd\\fR\nset CD (checking disabled) query bit.\n.RE\n\n.TP\n\\fB\\-n \\fInameserver\\fR\nUse the given nameserver(s) (may be specified more than once)\ninstead of the default.  Using this option has the same same effect as \n.RB $ NSCACHEIP\nor\n.RB $ NAMESERVERS\nenvironment variables, with the only difference that only IPv4 addresses\nare recognized for now, and it is possible to specify names (which will\nbe resolved using default settings) instead of IP addresses.\n\n.TP\n.B \\-h\nprint short help and exit.\n\n.SH \"RETURN VALUE\"\nWhen all names where resovled successefully,\n.B dnsget\nexits with zero exit status.  If at least one name was not found,\n.B dnsget\nwill exit with return code 100.  If some other error occured during\nname resolution, it will exit with code 99.  In case of usage or\ninitialization error,\n.B dnsget\nwill return 1.\n\n.SH \"SEE ALSO\"\n.BR host (1)\n.BR dig (1)\n.BR resolv.conf (5)\n.BR udns (3).\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/dnsget.c",
    "content": "/* dnsget.c\n   simple host/dig-like application using UDNS library\n\n   Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n */\n\n#ifdef HAVE_CONFIG_H\n# include \"config.h\"\n#endif\n#ifdef __MINGW32__\n#include <windows.h>\n#include <winsock2.h>\n#else\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <sys/time.h>\n#include <unistd.h>\n#endif\n#include <time.h>\n#include <stdarg.h>\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include \"udns.h\"\n\n#ifndef HAVE_GETOPT\n# include \"getopt.c\"\n#endif\n\n#ifndef AF_INET6\n# define AF_INET6 10\n#endif\n\nstatic char *progname;\nstatic int verbose = 1;\nstatic int errors;\nstatic int notfound;\n\n/* verbosity level:\n * <0 - bare result\n *  0 - bare result and error messages\n *  1 - readable result\n *  2 - received packet contents and `trying ...' stuff\n *  3 - sent and received packet contents\n */\n\nstatic void die(int errnum, const char *fmt, ...) {\n  va_list ap;\n  fprintf(stderr, \"%s: \", progname);\n  va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap);\n  if (errnum) fprintf(stderr, \": %s\\n\", strerror(errnum));\n  else putc('\\n', stderr);\n  fflush(stderr);\n  exit(1);\n}\n\nstatic const char *dns_xntop(int af, const void *src) {\n  static char buf[6*5+4*4];\n  return dns_ntop(af, src, buf, sizeof(buf));\n}\n\nstruct query {\n  const char *name;\t\t/* original query string */\n  unsigned char *dn;\t\t/* the DN being looked up */\n  enum dns_type qtyp;\t\t/* type of the query */\n};\n\nstatic void query_free(struct query *q) {\n  free(q->dn);\n  free(q);\n}\n\nstatic struct query *\nquery_new(const char *name, const unsigned char *dn, enum dns_type qtyp) {\n  struct query *q = malloc(sizeof(*q));\n  unsigned l = dns_dnlen(dn);\n  unsigned char *cdn = malloc(l);\n  if (!q || !cdn) die(0, \"out of memory\");\n  memcpy(cdn, dn, l);\n  q->name = name;\n  q->dn = cdn;\n  q->qtyp = qtyp;\n  return q;\n}\n\nstatic enum dns_class qcls = DNS_C_IN;\n\nstatic void\ndnserror(struct query *q, int errnum) {\n  if (verbose >= 0)\n    fprintf(stderr, \"%s: unable to lookup %s record for %s: %s\\n\", progname,\n            dns_typename(q->qtyp), dns_dntosp(q->dn), dns_strerror(errnum));\n  if (errnum == DNS_E_NXDOMAIN || errnum == DNS_E_NODATA)\n    ++notfound;\n  else\n    ++errors;\n  query_free(q);\n}\n\nstatic const unsigned char *\nprinttxt(const unsigned char *c) {\n  unsigned n = *c++;\n  const unsigned char *e = c + n;\n  if (verbose > 0) while(c < e) {\n    if (*c < ' ' || *c >= 127) printf(\"\\\\%03u\", *c);\n    else if (*c == '\\\\' || *c == '\"') printf(\"\\\\%c\", *c);\n    else putchar(*c);\n    ++c;\n  }\n  else\n   fwrite(c, n, 1, stdout);\n  return e;\n}\n\nstatic void\nprinthex(const unsigned char *c, const unsigned char *e) {\n  while(c < e)\n    printf(\"%02x\", *c++);\n}\n\nstatic unsigned char to_b64[] =\n\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\nstatic void\nprintb64(const unsigned char *c, const unsigned char *e) {\n  while(c < e) {\n    putchar(to_b64[c[0] >> 2]);\n    if (c+1 < e) {\n      putchar(to_b64[(c[0] & 0x3) << 4 | c[1] >> 4]);\n      if (c+2 < e) {\n        putchar(to_b64[(c[1] & 0xf) << 2 | c[2] >> 6]);\n        putchar(to_b64[c[2] & 0x3f]);\n      }\n      else {\n        putchar(to_b64[(c[1] & 0xf) << 2]);\n\tputchar('=');\n\tbreak;\n      }\n    }\n    else {\n      putchar(to_b64[(c[0] & 0x3) << 4]);\n      putchar('=');\n      putchar('=');\n      break;\n    }\n    c += 3;\n  }\n}\n\nstatic void\nprintdate(time_t time) {\n  struct tm *tm = gmtime(&time);\n  printf(\"%04d%02d%02d%02d%02d%02d\",\n    tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday,\n    tm->tm_hour, tm->tm_min, tm->tm_sec);\n}\n\nstatic void\nprintrr(const struct dns_parse *p, struct dns_rr *rr) {\n  const unsigned char *pkt = p->dnsp_pkt;\n  const unsigned char *end = p->dnsp_end;\n  const unsigned char *dptr = rr->dnsrr_dptr;\n  const unsigned char *dend = rr->dnsrr_dend;\n  unsigned char *dn = rr->dnsrr_dn;\n  const unsigned char *c;\n  unsigned n;\n\n  if (verbose > 0) {\n    if (verbose > 1) {\n      if (!p->dnsp_rrl && !rr->dnsrr_dn[0] && rr->dnsrr_typ == DNS_T_OPT) {\n        printf(\";EDNS%d OPT record (UDPsize: %d, ERcode: %d, Flags: 0x%02x): %d bytes\\n\",\n               (rr->dnsrr_ttl>>16) & 0xff,\t/* version */\n               rr->dnsrr_cls,\t\t\t/* udp size */\n               (rr->dnsrr_ttl>>24) & 0xff,\t/* extended rcode */\n               rr->dnsrr_ttl & 0xffff,\t\t/* flags */\n               rr->dnsrr_dsz);\n        return;\n      }\n      n = printf(\"%s.\", dns_dntosp(rr->dnsrr_dn));\n      printf(\"%s%u\\t%s\\t%s\\t\",\n             n > 15 ? \"\\t\" : n > 7 ? \"\\t\\t\" : \"\\t\\t\\t\",\n             rr->dnsrr_ttl,\n             dns_classname(rr->dnsrr_cls),\n             dns_typename(rr->dnsrr_typ));\n    }\n    else\n      printf(\"%s. %s \", dns_dntosp(rr->dnsrr_dn), dns_typename(rr->dnsrr_typ));\n  }\n\n  switch(rr->dnsrr_typ) {\n\n  case DNS_T_CNAME:\n  case DNS_T_PTR:\n  case DNS_T_NS:\n  case DNS_T_MB:\n  case DNS_T_MD:\n  case DNS_T_MF:\n  case DNS_T_MG:\n  case DNS_T_MR:\n    if (dns_getdn(pkt, &dptr, end, dn, DNS_MAXDN) <= 0) goto xperr;\n    printf(\"%s.\", dns_dntosp(dn));\n    break;\n\n  case DNS_T_A:\n    if (rr->dnsrr_dsz != 4) goto xperr;\n    printf(\"%d.%d.%d.%d\", dptr[0], dptr[1], dptr[2], dptr[3]);\n    break;\n\n  case DNS_T_AAAA:\n    if (rr->dnsrr_dsz != 16) goto xperr;\n    printf(\"%s\", dns_xntop(AF_INET6, dptr));\n    break;\n\n  case DNS_T_MX:\n    c = dptr + 2;\n    if (dns_getdn(pkt, &c, end, dn, DNS_MAXDN) <= 0 || c != dend) goto xperr;\n    printf(\"%d %s.\", dns_get16(dptr), dns_dntosp(dn));\n    break;\n\n  case DNS_T_TXT:\n    /* first verify it */\n    for(c = dptr; c < dend; c += n) {\n      n = *c++;\n      if (c + n > dend) goto xperr;\n    }\n    c = dptr; n = 0;\n    while (c < dend) {\n      if (verbose > 0) printf(n++ ? \"\\\" \\\"\":\"\\\"\");\n      c = printtxt(c);\n    }\n    if (verbose > 0) putchar('\"');\n    break;\n\n  case DNS_T_HINFO:\t/* CPU, OS */\n    c = dptr;\n    n = *c++; if ((c += n) >= dend) goto xperr;\n    n = *c++; if ((c += n) != dend) goto xperr;\n    c = dptr;\n    if (verbose > 0) putchar('\"');\n    c = printtxt(c);\n    if (verbose > 0) printf(\"\\\" \\\"\"); else putchar(' ');\n    printtxt(c);\n    if (verbose > 0) putchar('\"');\n    break;\n\n  case DNS_T_WKS:\n    c = dptr;\n    if (dptr + 4 + 2 >= end) goto xperr;\n    printf(\"%s %d\", dns_xntop(AF_INET, dptr), dptr[4]);\n    c = dptr + 5;\n    for (n = 0; c < dend; ++c, n += 8) {\n      if (*c) {\n        unsigned b;\n        for (b = 0; b < 8; ++b)\n          if (*c & (1 << (7-b))) printf(\" %d\", n + b);\n      }\n    }\n    break;\n\n  case DNS_T_SRV:\t/* prio weight port targetDN */\n    c = dptr;\n    c += 2 + 2 + 2;\n    if (dns_getdn(pkt, &c, end, dn, DNS_MAXDN) <= 0 || c != dend) goto xperr;\n    c = dptr;\n    printf(\"%d %d %d %s.\",\n           dns_get16(c+0), dns_get16(c+2), dns_get16(c+4),\n           dns_dntosp(dn));\n    break;\n\n  case DNS_T_NAPTR:\t/* order pref flags serv regexp repl */\n    c = dptr;\n    c += 4;\t/* order, pref */\n    for (n = 0; n < 3; ++n)\n      if (c >= dend) goto xperr;\n      else c += *c + 1;\n    if (dns_getdn(pkt, &c, end, dn, DNS_MAXDN) <= 0 || c != dend) goto xperr;\n    c = dptr;\n    printf(\"%u %u\", dns_get16(c+0), dns_get16(c+2));\n    c += 4;\n    for(n = 0; n < 3; ++n) {\n      putchar(' ');\n      if (verbose > 0) putchar('\"');\n      c = printtxt(c);\n      if (verbose > 0) putchar('\"');\n    }\n    printf(\" %s.\", dns_dntosp(dn));\n    break;\n\n  case DNS_T_KEY:\n  case DNS_T_DNSKEY:\n    /* flags(2) proto(1) algo(1) pubkey */\n  case DNS_T_DS:\n  case DNS_T_DLV:\n    /* ktag(2) proto(1) algo(1) pubkey */\n    c = dptr;\n    if (c + 2 + 1 + 1 > dend) goto xperr;\n    printf(\"%d %d %d\", dns_get16(c), c[2], c[3]);\n    c += 2 + 1 + 1;\n    if (c < dend) {\n      putchar(' ');\n      printb64(c, dend);\n    }\n    break;\n\n  case DNS_T_SIG:\n  case DNS_T_RRSIG:\n    /* type(2) algo(1) labels(1) ottl(4) sexp(4) sinc(4) tag(2) sdn sig */\n    c = dptr;\n    c += 2 + 1 + 1 + 4 + 4 + 4 + 2;\n    if (dns_getdn(pkt, &c, end, dn, DNS_MAXDN) <= 0) goto xperr;\n    printf(\"%s %u %u %u \",\n           dns_typename(dns_get16(dptr)), dptr[2], dptr[3], dns_get32(dptr+4));\n    printdate(dns_get32(dptr+8));\n    putchar(' ');\n    printdate(dns_get32(dptr+12));\n    printf(\" %d %s. \", dns_get16(dptr+10), dns_dntosp(dn));\n    printb64(c, dend);\n    break;\n\n  case DNS_T_SSHFP: /* algo(1), fp type(1), fp... */\n    if (dend < dptr + 3) goto xperr;\n    printf(\"%u %u \", dptr[0], dptr[1]); /* algo, fp type */\n    printhex(dptr + 2, dend);\n    break;\n\n#if 0\t/* unused RR types? */\n  case DNS_T_NSEC: /* nextDN bitmaps */\n    c = dptr;\n    if (dns_getdn(pkt, &c, end, dn, DNS_MAXDN) <= 0) goto xperr;\n    printf(\"%s.\", dns_dntosp(dn));\n    unfinished.\n    break;\n#endif\n\n\n  case DNS_T_SOA:\n    c = dptr;\n    if (dns_getdn(pkt, &c, end, dn, DNS_MAXDN) <= 0 ||\n        dns_getdn(pkt, &c, end, dn, DNS_MAXDN) <= 0 ||\n        c + 4*5 != dend)\n      goto xperr;\n    dns_getdn(pkt, &dptr, end, dn, DNS_MAXDN);\n    printf(\"%s. \", dns_dntosp(dn));\n    dns_getdn(pkt, &dptr, end, dn, DNS_MAXDN);\n    printf(\"%s. \", dns_dntosp(dn));\n    printf(\"%u %u %u %u %u\",\n           dns_get32(dptr), dns_get32(dptr+4), dns_get32(dptr+8),\n           dns_get32(dptr+12), dns_get32(dptr+16));\n    break;\n\n  case DNS_T_MINFO:\n    c = dptr;\n    if (dns_getdn(pkt, &c, end, dn, DNS_MAXDN) <= 0 ||\n        dns_getdn(pkt, &c, end, dn, DNS_MAXDN) <= 0 ||\n\tc != dend)\n      goto xperr;\n    dns_getdn(pkt, &dptr, end, dn, DNS_MAXDN);\n    printf(\"%s. \", dns_dntosp(dn));\n    dns_getdn(pkt, &dptr, end, dn, DNS_MAXDN);\n    printf(\"%s.\", dns_dntosp(dn));\n    break;\n\n  case DNS_T_NULL:\n  default:\n    printhex(dptr, dend);\n    break;\n  }\n  putchar('\\n');\n  return;\n\nxperr:\n  printf(\"<parse error>\\n\");\n  ++errors;\n}\n\nstatic int\nprintsection(struct dns_parse *p, int nrr, const char *sname) {\n  struct dns_rr rr;\n  int r;\n  if (!nrr) return 0;\n  if (verbose > 1) printf(\"\\n;; %s section (%d):\\n\", sname, nrr);\n\n  p->dnsp_rrl = nrr;\n  while((r = dns_nextrr(p, &rr)) > 0)\n    printrr(p, &rr);\n  if (r < 0) printf(\"<<ERROR>>\\n\");\n  return r;\n}\n\n/* dbgcb will only be called if verbose > 1 */\nstatic void\ndbgcb(int code, const struct sockaddr *sa, unsigned slen,\n      const unsigned char *pkt, int r,\n      const struct dns_query *unused_q, void *unused_data) {\n  struct dns_parse p;\n  const unsigned char *cur, *end;\n  int numqd;\n\n  if (code > 0)\t{\n    printf(\";; trying %s.\\n\", dns_dntosp(dns_payload(pkt)));\n    printf(\";; sending %d bytes query to \", r);\n  }\n  else\n    printf(\";; received %d bytes response from \", r);\n  if (sa->sa_family == AF_INET && slen >= sizeof(struct sockaddr_in))\n    printf(\"%s port %d\\n\",\n           dns_xntop(AF_INET, &((struct sockaddr_in*)sa)->sin_addr),\n           htons(((struct sockaddr_in*)sa)->sin_port));\n#ifdef HAVE_IPv6\n  else if (sa->sa_family == AF_INET6 && slen >= sizeof(struct sockaddr_in6))\n    printf(\"%s port %d\\n\",\n           dns_xntop(AF_INET6, &((struct sockaddr_in6*)sa)->sin6_addr),\n           htons(((struct sockaddr_in6*)sa)->sin6_port));\n#endif\n  else\n    printf(\"<<unknown socket type %d>>\\n\", sa->sa_family);\n  if (code > 0 && verbose < 3) {\n    putchar('\\n');\n    return;\n  }\n\n  if (code == -2) printf(\";; reply from unexpected source\\n\");\n  if (code == -5) printf(\";; reply to a query we didn't sent (or old)\\n\");\n  if (r < DNS_HSIZE) {\n    printf(\";; short packet (%d bytes)\\n\", r);\n    return;\n  }\n  if (dns_opcode(pkt) != 0)\n    printf(\";; unexpected opcode %d\\n\", dns_opcode(pkt));\n  if (dns_tc(pkt) != 0)\n    printf(\";; warning: TC bit set, probably incomplete reply\\n\");\n\n  printf(\";; ->>HEADER<<- opcode: \");\n  switch(dns_opcode(pkt)) {\n  case 0: printf(\"QUERY\"); break;\n  case 1: printf(\"IQUERY\"); break;\n  case 2: printf(\"STATUS\"); break;\n  default: printf(\"UNKNOWN(%u)\", dns_opcode(pkt)); break;\n  }\n  printf(\", status: %s, id: %d, size: %d\\n;; flags:\",\n         dns_rcodename(dns_rcode(pkt)), dns_qid(pkt), r);\n  if (dns_qr(pkt)) printf(\" qr\");\n  if (dns_aa(pkt)) printf(\" aa\");\n  if (dns_tc(pkt)) printf(\" tc\");\n  if (dns_rd(pkt)) printf(\" rd\");\n  if (dns_ra(pkt)) printf(\" ra\");\n  /* if (dns_z(pkt))  printf(\" z\"); only one reserved bit left */\n  if (dns_ad(pkt)) printf(\" ad\");\n  if (dns_cd(pkt)) printf(\" cd\");\n  numqd = dns_numqd(pkt);\n  printf(\"; QUERY: %d, ANSWER: %d, AUTHORITY: %d, ADDITIONAL: %d\\n\",\n         numqd, dns_numan(pkt), dns_numns(pkt), dns_numar(pkt));\n  if (numqd != 1)\n    printf(\";; unexpected number of entries in QUERY section: %d\\n\",\n           numqd);\n  printf(\"\\n;; QUERY SECTION (%d):\\n\", numqd);\n  cur = dns_payload(pkt);\n  end = pkt + r;\n  while(numqd--) {\n    if (dns_getdn(pkt, &cur, end, p.dnsp_dnbuf, DNS_MAXDN) <= 0 ||\n        cur + 4 > end) {\n      printf(\"; invalid query section\\n\");\n      return;\n    }\n    r = printf(\";%s.\", dns_dntosp(p.dnsp_dnbuf));\n    printf(\"%s%s\\t%s\\n\",\n           r > 23 ? \"\\t\" : r > 15 ? \"\\t\\t\" : r > 7 ? \"\\t\\t\\t\" : \"\\t\\t\\t\\t\",\n           dns_classname(dns_get16(cur+2)), dns_typename(dns_get16(cur)));\n    cur += 4;\n  }\n\n  p.dnsp_pkt = pkt;\n  p.dnsp_cur = p.dnsp_ans = cur;\n  p.dnsp_end = end;\n  p.dnsp_qdn = NULL;\n  p.dnsp_qcls = p.dnsp_qtyp = 0;\n  p.dnsp_ttl = 0xffffffffu;\n  p.dnsp_nrr = 0;\n\n  r = printsection(&p, dns_numan(pkt), \"ANSWER\");\n  if (r == 0)\n    r = printsection(&p, dns_numns(pkt), \"AUTHORITY\");\n  if (r == 0)\n    r = printsection(&p, dns_numar(pkt), \"ADDITIONAL\");\n  putchar('\\n');\n}\n\nstatic void dnscb(struct dns_ctx *ctx, void *result, void *data) {\n  int r = dns_status(ctx);\n  struct query *q = data;\n  struct dns_parse p;\n  struct dns_rr rr;\n  unsigned nrr;\n  unsigned char dn[DNS_MAXDN];\n  const unsigned char *pkt, *cur, *end;\n  if (!result) {\n    dnserror(q, r);\n    return;\n  }\n  pkt = result; end = pkt + r; cur = dns_payload(pkt);\n  dns_getdn(pkt, &cur, end, dn, sizeof(dn));\n  dns_initparse(&p, NULL, pkt, cur, end);\n  p.dnsp_qcls = p.dnsp_qtyp = 0;\n  nrr = 0;\n  while((r = dns_nextrr(&p, &rr)) > 0) {\n    if (!dns_dnequal(dn, rr.dnsrr_dn)) continue;\n    if ((qcls == DNS_C_ANY || qcls == rr.dnsrr_cls) &&\n        (q->qtyp == DNS_T_ANY || q->qtyp == rr.dnsrr_typ))\n      ++nrr;\n    else if (rr.dnsrr_typ == DNS_T_CNAME && !nrr) {\n      if (dns_getdn(pkt, &rr.dnsrr_dptr, end,\n                    p.dnsp_dnbuf, sizeof(p.dnsp_dnbuf)) <= 0 ||\n          rr.dnsrr_dptr != rr.dnsrr_dend) {\n        r = DNS_E_PROTOCOL;\n        break;\n      }\n      else {\n        if (verbose == 1) {\n          printf(\"%s.\", dns_dntosp(dn));\n          printf(\" CNAME %s.\\n\", dns_dntosp(p.dnsp_dnbuf));\n        }\n        dns_dntodn(p.dnsp_dnbuf, dn, sizeof(dn));\n      }\n    }\n  }\n  if (!r && !nrr)\n    r = DNS_E_NODATA;\n  if (r < 0) {\n    dnserror(q, r);\n    free(result);\n    return;\n  }\n  if (verbose < 2) {\t/* else it is already printed by dbgfn */\n    dns_rewind(&p, NULL);\n    p.dnsp_qtyp = q->qtyp == DNS_T_ANY ? 0 : q->qtyp;\n    p.dnsp_qcls = qcls == DNS_C_ANY ? 0 : qcls;\n    while(dns_nextrr(&p, &rr))\n      printrr(&p, &rr);\n  }\n  free(result);\n  query_free(q);\n}\n\nint main(int argc, char **argv) {\n  int i;\n  int fd;\n  fd_set fds;\n  struct timeval tv;\n  time_t now;\n  char *ns[DNS_MAXSERV];\n  int nns = 0;\n  struct query *q;\n  enum dns_type qtyp = 0;\n  struct dns_ctx *nctx = NULL;\n  int flags = 0;\n\n  if (!(progname = strrchr(argv[0], '/'))) progname = argv[0];\n  else argv[0] = ++progname;\n\n  if (argc <= 1)\n    die(0, \"try `%s -h' for help\", progname);\n\n  if (dns_init(NULL, 0) < 0 || !(nctx = dns_new(NULL)))\n    die(errno, \"unable to initialize dns library\");\n  /* we keep two dns contexts: one may be needed to resolve\n   * nameservers if given as names, using default options.\n   */\n\n  while((i = getopt(argc, argv, \"vqt:c:an:o:f:h\")) != EOF) switch(i) {\n  case 'v': ++verbose; break;\n  case 'q': --verbose; break;\n  case 't':\n    if (optarg[0] == '*' && !optarg[1])\n      i = DNS_T_ANY;\n    else if ((i = dns_findtypename(optarg)) <= 0)\n      die(0, \"unrecognized query type `%s'\", optarg);\n    qtyp = i;\n    break;\n  case 'c':\n    if (optarg[0] == '*' && !optarg[1])\n      i = DNS_C_ANY;\n    else if ((i = dns_findclassname(optarg)) < 0)\n      die(0, \"unrecognized query class `%s'\", optarg);\n    qcls = i;\n    break;\n  case 'a':\n    qtyp = DNS_T_ANY;\n    ++verbose;\n    break;\n  case 'n':\n    if (nns >= DNS_MAXSERV)\n      die(0, \"too many nameservers, %d max\", DNS_MAXSERV);\n    ns[nns++] = optarg;\n    break;\n  case 'o':\n  case 'f': {\n    char *opt;\n    const char *const delim = \" \\t,;\";\n    for(opt = strtok(optarg, delim); opt != NULL; opt = strtok(NULL, delim)) {\n      if (dns_set_opts(NULL, optarg) == 0)\n        ;\n      else if (strcmp(opt, \"aa\") == 0) flags |= DNS_AAONLY;\n      else if (strcmp(optarg, \"nord\") == 0) flags |= DNS_NORD;\n      else if (strcmp(optarg, \"dnssec\") == 0) flags |= DNS_SET_DO;\n      else if (strcmp(optarg, \"do\")     == 0) flags |= DNS_SET_DO;\n      else if (strcmp(optarg, \"cd\") == 0) flags |= DNS_SET_CD;\n      else\n        die(0, \"invalid option: `%s'\", opt);\n    }\n    break;\n  }\n  case 'h':\n    printf(\n\"%s: simple DNS query tool (using udns version %s)\\n\"\n\"Usage: %s [options] domain-name...\\n\"\n\"where options are:\\n\"\n\" -h - print this help and exit\\n\"\n\" -v - be more verbose\\n\"\n\" -q - be less verbose\\n\"\n\" -t type - set query type (A, AAA, PTR etc)\\n\"\n\" -c class - set query class (IN (default), CH, HS, *)\\n\"\n\" -a - equivalent to -t ANY -v\\n\"\n\" -n ns - use given nameserver(s) instead of default\\n\"\n\"  (may be specified multiple times)\\n\"\n\" -o opt,opt,... (comma- or space-separated list,\\n\"\n\"                 may be specified more than once):\\n\"\n\"  set resovler options (the same as setting $RES_OPTIONS):\\n\"\n\"   timeout:sec  - initial query timeout\\n\"\n\"   attempts:num - number of attempt to resovle a query\\n\"\n\"   ndots:num    - if name has more than num dots, lookup it before search\\n\"\n\"   port:num     - port number for queries instead of default 53\\n\"\n\"   udpbuf:num   - size of UDP buffer (use EDNS0 if >512)\\n\"\n\"  or query flags:\\n\"\n\"   aa,nord,dnssec,do,cd - set query flag (auth-only, no recursion,\\n\"\n\"     enable DNSSEC (DNSSEC Ok), check disabled)\\n\"\n      , progname, dns_version(), progname);\n    return 0;\n  default:\n    die(0, \"try `%s -h' for help\", progname);\n  }\n\n  argc -= optind; argv += optind;\n  if (!argc)\n    die(0, \"no name(s) to query specified\");\n\n  if (nns) {\n    /* if nameservers given as names, resolve them.\n     * We only allow IPv4 nameservers as names for now.\n     * Ok, it is easy enouth to try both AAAA and A,\n     * but the question is what to do by default.\n     */\n    struct sockaddr_in sin;\n    int j, r = 0, opened = 0;\n    memset(&sin, 0, sizeof(sin));\n    sin.sin_family = AF_INET;\n    sin.sin_port = htons(dns_set_opt(NULL, DNS_OPT_PORT, -1));\n    dns_add_serv(NULL, NULL);\n    for(i = 0; i < nns; ++i) {\n      if (dns_pton(AF_INET, ns[i], &sin.sin_addr) <= 0) {\n        struct dns_rr_a4 *rr;\n        if (!opened) {\n          if (dns_open(nctx) < 0)\n            die(errno, \"unable to initialize dns context\");\n          opened = 1;\n        }\n        rr = dns_resolve_a4(nctx, ns[i], 0);\n        if (!rr)\n          die(0, \"unable to resolve nameserver %s: %s\",\n              ns[i], dns_strerror(dns_status(nctx)));\n        for(j = 0; j < rr->dnsa4_nrr; ++j) {\n          sin.sin_addr = rr->dnsa4_addr[j];\n          if ((r = dns_add_serv_s(NULL, (struct sockaddr *)&sin)) < 0)\n            break;\n        }\n        free(rr);\n      }\n      else\n        r = dns_add_serv_s(NULL, (struct sockaddr *)&sin);\n      if (r < 0)\n        die(errno, \"unable to add nameserver %s\",\n             dns_xntop(AF_INET, &sin.sin_addr));\n    }\n  }\n  dns_free(nctx);\n\n  fd = dns_open(NULL);\n  if (fd < 0)\n    die(errno, \"unable to initialize dns context\");\n\n  if (verbose > 1)\n    dns_set_dbgfn(NULL, dbgcb);\n\n  if (flags)\n    dns_set_opt(NULL, DNS_OPT_FLAGS, flags);\n\n  for (i = 0; i < argc; ++i) {\n    char *name = argv[i];\n    union {\n      struct in_addr addr;\n      struct in6_addr addr6;\n    } a;\n    unsigned char dn[DNS_MAXDN];\n    enum dns_type l_qtyp = 0;\n    int abs;\n    if (dns_pton(AF_INET, name, &a.addr) > 0) {\n      dns_a4todn(&a.addr, 0, dn, sizeof(dn));\n      l_qtyp = DNS_T_PTR;\n      abs = 1;\n    }\n#ifdef HAVE_IPv6\n    else if (dns_pton(AF_INET6, name, &a.addr6) > 0) {\n      dns_a6todn(&a.addr6, 0, dn, sizeof(dn));\n      l_qtyp = DNS_T_PTR;\n      abs = 1;\n    }\n#endif\n    else if (!dns_ptodn(name, strlen(name), dn, sizeof(dn), &abs))\n      die(0, \"invalid name `%s'\\n\", name);\n    else\n      l_qtyp = DNS_T_A;\n    if (qtyp) l_qtyp = qtyp;\n    q = query_new(name, dn, l_qtyp);\n    if (abs) abs = DNS_NOSRCH;\n    if (!dns_submit_dn(NULL, dn, qcls, l_qtyp, abs, 0, dnscb, q))\n      dnserror(q, dns_status(NULL));\n  }\n\n  FD_ZERO(&fds);\n  now = 0;\n  while((i = dns_timeouts(NULL, -1, now)) > 0) {\n    FD_SET(fd, &fds);\n    tv.tv_sec = i;\n    tv.tv_usec = 0;\n    i = select(fd+1, &fds, 0, 0, &tv);\n    now = time(NULL);\n    if (i > 0) dns_ioevent(NULL, now);\n  }\n\n  return errors ? 1 : notfound ? 100 : 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/ex-rdns.c",
    "content": "/* ex-rdns.c\n   parallel rDNS resolver example - read IP addresses from stdin,\n   write domain names to stdout\n \n   Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n */\n\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <sys/poll.h>\n#include <unistd.h>\n#include <stdio.h>\n#include <time.h>\n#include <stdlib.h>\n#include <string.h>\n#include \"udns.h\"\n\nstatic int curq;\n\nstatic const char *n2ip(const unsigned char *c) {\n  static char b[sizeof(\"255.255.255.255\")];\n  sprintf(b, \"%u.%u.%u.%u\", c[0], c[1], c[2], c[3]);\n  return b;\n}\nstatic void dnscb(struct dns_ctx *ctx, struct dns_rr_ptr *rr, void *data) {\n  const char *ip = n2ip((unsigned char *)&data);\n  int i;\n  --curq;\n  if (rr) {\n    printf(\"%s\", ip);\n    for(i = 0; i < rr->dnsptr_nrr; ++i)\n      printf(\" %s\", rr->dnsptr_ptr[i]);\n    putchar('\\n');\n    free(rr);\n  }\n  else\n    fprintf(stderr, \"%s: %s\\n\", ip, dns_strerror(dns_status(ctx)));\n}\n\nint main(int argc, char **argv) {\n  int c;\n  time_t now;\n  int maxq = 10;\n  struct pollfd pfd;\n  char linebuf[1024];\n  char *eol;\n  int eof;\n\n  if (dns_init(NULL, 1) < 0) {\n    fprintf(stderr, \"unable to initialize dns library\\n\");\n    return 1;\n  }\n  while((c = getopt(argc, argv, \"m:r\")) != EOF) switch(c) {\n  case 'm': maxq = atoi(optarg); break;\n  case 'r':\n     dns_set_opt(0, DNS_OPT_FLAGS,\n                 dns_set_opt(0, DNS_OPT_FLAGS, -1) | DNS_NORD);\n     break;\n  default: return 1;\n  }\n  if (argc != optind) return 1;\n\n  pfd.fd = dns_sock(0);\n  pfd.events = POLLIN;\n  now = time(NULL);\n  c = optind;\n  eof = 0;\n  while(curq || !eof) {\n    if (!eof && curq < maxq) {\n      union { struct in_addr a; void *p; } pa;\n      if (!fgets(linebuf, sizeof(linebuf), stdin)) {\n        eof = 1;\n        continue;\n      }\n      eol = strchr(linebuf, '\\n');\n      if (eol) *eol = '\\0';\n      if (!linebuf[0]) continue;\n      if (dns_pton(AF_INET, linebuf, &pa.a) <= 0)\n        fprintf(stderr, \"%s: invalid address\\n\", linebuf);\n      else if (dns_submit_a4ptr(0, &pa.a, dnscb, pa.p) == 0)\n        fprintf(stderr, \"%s: unable to submit query: %s\\n\",\n                linebuf, dns_strerror(dns_status(0)));\n      else\n        ++curq;\n      continue;\n    }\n    if (curq) {\n      c = dns_timeouts(0, -1, now);\n      c = poll(&pfd, 1, c < 0 ? -1 : c * 1000);\n      now = time(NULL);\n      if (c)\n        dns_ioevent(0, now);\n    }\n  }\n  return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/getopt.c",
    "content": "/* getopt.c\n * Simple getopt() implementation.\n *\n * Standard interface:\n *  extern int getopt(int argc, char *const *argv, const char *opts);\n *  extern int optind;    current index in argv[]\n *  extern char *optarg;  argument for the current option\n *  extern int optopt;    the current option\n *  extern int opterr;    to control error printing\n *\n * Some minor extensions:\n *  ignores leading `+' sign in opts[] (unemplemented GNU extension)\n *  handles optional arguments, in form \"x::\" in opts[]\n *  if opts[] starts with `:', will return `:' in case of missing required\n *    argument, instead of '?'.\n *\n * Compile with -DGETOPT_NO_OPTERR to never print errors internally.\n * Compile with -DGETOPT_NO_STDIO to use write() calls instead of fprintf() for\n *  error reporting (ignored with -DGETOPT_NO_OPTERR).\n * Compile with -DGETOPT_CLASS=static to get static linkage.\n * Compile with -DGETOPT_MY to redefine all visible symbols to be prefixed\n *  with \"my_\", like my_getopt instead of getopt.\n * Compile with -DTEST to get a test executable.\n *\n * Written by Michael Tokarev.  Public domain.\n */\n\n#include <string.h>\n\n#ifndef GETOPT_CLASS\n# define GETOPT_CLASS\n#endif\n#ifdef GETOPT_MY\n# define optarg my_optarg\n# define optind my_optind\n# define opterr my_opterr\n# define optopt my_optopt\n# define getopt my_getopt\n#endif\n\nGETOPT_CLASS char *optarg /* = NULL */;\nGETOPT_CLASS int optind = 1;\nGETOPT_CLASS int opterr = 1;\nGETOPT_CLASS int optopt;\n\nstatic char *nextc /* = NULL */;\n\n#if defined(GETOPT_NO_OPTERR)\n\n#define printerr(argv, msg)\n\n#elif defined(GETOPT_NO_STDIO)\n\nextern int write(int, void *, int);\n\nstatic void printerr(char *const *argv, const char *msg) {\n  if (opterr) {\n    char buf[64];\n    unsigned pl = strlen(argv[0]);\n    unsigned ml = strlen(msg);\n    char *p;\n    if (pl + /*\": \"*/2 + ml + /*\" -- c\\n\"*/6 > sizeof(buf)) {\n      write(2, argv[0], pl);\n      p = buf;\n    }\n    else {\n      memcpy(buf, argv[0], ml);\n      p = buf + pl;\n    }\n    *p++ = ':'; *p++ = ' ';\n    memcpy(p, msg, ml); p += ml;\n    *p++ = ' '; *p++ = '-'; *p++ = '-'; *p++ = ' ';\n    *p++ = optopt;\n    *p++ = '\\n';\n    write(2, buf, p - buf);\n  }\n}\n\n#else\n\n#include <stdio.h>\nstatic void printerr(char *const *argv, const char *msg) {\n  if (opterr)\n     fprintf(stderr, \"%s: %s -- %c\\n\", argv[0], msg, optopt);\n}\n\n#endif\n\nGETOPT_CLASS int getopt(int argc, char *const *argv, const char *opts) {\n  char *p;\n\n  optarg = 0;\n  if (*opts == '+') /* GNU extension (permutation) - isn't supported */\n    ++opts;\n\n  if (!optind) {  /* a way to reset things */\n    nextc = 0;\n    optind = 1;\n  }\n\n  if (!nextc || !*nextc) {   /* advance to the next argv element */\n    /* done scanning? */\n    if (optind >= argc)\n      return -1;\n    /* not an optional argument */\n    if (argv[optind][0] != '-')\n      return -1;\n    /* bare `-' */\n    if (argv[optind][1] == '\\0')\n      return -1;\n    /* special case `--' argument */\n    if (argv[optind][1] == '-' && argv[optind][2] == '\\0') {\n      ++optind;\n      return -1;\n    }\n    nextc = argv[optind] + 1;\n  }\n\n  optopt = *nextc++;\n  if (!*nextc)\n    ++optind;\n  p = strchr(opts, optopt);\n  if (!p || optopt == ':') {\n    printerr(argv, \"illegal option\");\n    return '?';\n  }\n  if (p[1] == ':') {\n    if (*nextc) {\n      optarg = nextc;\n      nextc = NULL;\n      ++optind;\n    }\n    else if (p[2] != ':') {\t/* required argument */\n      if (optind >= argc) {\n        printerr(argv, \"option requires an argument\");\n        return *opts == ':' ? ':' : '?';\n      }\n      else\n        optarg = argv[optind++];\n    }\n  }\n  return optopt;\n}\n\n#ifdef TEST\n\n#include <stdio.h>\n\nint main(int argc, char **argv) {\n  int c;\n  while((c = getopt(argc, argv, \"ab:c::\")) != -1) switch(c) {\n  case 'a':\n  case 'b':\n  case 'c':\n    printf(\"option %c %s\\n\", c, optarg ? optarg : \"(none)\");\n    break;\n  default:\n    return -1;\n  }\n  for(c = optind; c < argc; ++c)\n    printf(\"non-opt: %s\\n\", argv[c]);\n  return 0;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/inet_XtoX.c",
    "content": "/* inet_XtoX.c\n * Simple implementation of the following functions:\n *  inet_ntop(), inet_ntoa(), inet_pton(), inet_aton().\n *\n * Differences from traditional implementaitons:\n *  o modifies destination buffers even on error return.\n *  o no fancy (hex, or 1.2) input support in inet_aton()\n *  o inet_aton() does not accept junk after an IP address.\n *  o inet_ntop(AF_INET) requires at least 16 bytes in dest,\n *    and inet_ntop(AF_INET6) at least 40 bytes\n *    (traditional inet_ntop() will try to fit anyway)\n *\n * Compile with -Dinet_XtoX_prefix=pfx_ to have pfx_*() instead of inet_*()\n * Compile with -Dinet_XtoX_no_ntop or -Dinet_XtoX_no_pton\n *  to disable net2str or str2net conversions.\n *\n * #define inet_XtoX_prototypes and #include \"this_file.c\"\n * to get function prototypes only (but not for inet_ntoa()).\n * #define inet_XtoX_decl to be `static' for static visibility,\n * or use __declspec(dllexport) or somesuch...\n *\n * Compile with -DTEST to test against stock implementation.\n *\n * Written by Michael Tokarev.  Public domain.\n */\n\n#ifdef inet_XtoX_prototypes\n\nstruct in_addr;\n\n#else\n\n#include <errno.h>\n\n#ifdef TEST\n\n# include <netinet/in.h>\n# include <sys/socket.h>\n# include <arpa/inet.h>\n# include <stdio.h>\n# include <stdlib.h>\n# include <unistd.h>\n# include <string.h>\n# undef inet_XtoX_prefix\n# define inet_XtoX_prefix mjt_inet_\n# undef inet_XtoX_no_ntop\n# undef inet_XtoX_no_pton\n\n#endif /* TEST */\n\n#endif /* inet_XtoX_prototypes */\n\n#ifndef inet_XtoX_prefix\n# define inet_XtoX_prefix inet_\n#endif\n#ifndef inet_XtoX_decl\n# define inet_XtoX_decl /* empty */\n#endif\n\n#define cc2_(x,y) cc2__(x,y)\n#define cc2__(x,y) x##y\n#define fn(x) cc2_(inet_XtoX_prefix,x)\n\n#ifndef inet_XtoX_no_ntop\n\ninet_XtoX_decl const char *\nfn(ntop)(int af, const void *src, char *dst, int size);\n\n#ifndef inet_XtoX_prototypes\n\nstatic int mjt_ntop4(const void *_src, char *dst, int size) {\n  unsigned i, x, r;\n  char *p;\n  const unsigned char *s = _src;\n  if (size < 4*4)\t/* for simplicity, disallow non-max-size buffer */\n    return 0;\n  for (i = 0, p = dst; i < 4; ++i) {\n    if (i) *p++ = '.';\n    x = r = s[i];\n    if (x > 99) { *p++ = (char)(r / 100 + '0'); r %= 100; }\n    if (x > 9) { *p++ = (char)(r / 10 + '0'); r %= 10; }\n    *p++ = (char)(r + '0');\n  }\n  *p = '\\0';\n  return 1;\n}\n\nstatic char *hexc(char *p, unsigned x) {\n  static char hex[16] = \"0123456789abcdef\";\n  if (x > 0x0fff) *p++ = hex[(x >>12) & 15];\n  if (x > 0x00ff) *p++ = hex[(x >> 8) & 15];\n  if (x > 0x000f) *p++ = hex[(x >> 4) & 15];\n  *p++ = hex[x & 15];\n  return p;\n}\n\nstatic int mjt_ntop6(const void *_src, char *dst, int size) {\n  unsigned i;\n  unsigned short w[8];\n  unsigned bs = 0, cs = 0;\n  unsigned bl = 0, cl = 0;\n  char *p;\n  const unsigned char *s = _src;\n\n  if (size < 40)\t/* for simplicity, disallow non-max-size buffer */\n    return 0;\n\n  for(i = 0; i < 8; ++i, s += 2) {\n    w[i] = (((unsigned short)(s[0])) << 8) | s[1];\n    if (!w[i]) {\n      if (!cl++) cs = i;\n    }\n    else {\n      if (cl > bl) bl = cl, bs = cs;\n    }\n  }\n  if (cl > bl) bl = cl, bs = cs;\n  p = dst;\n  if (bl == 1)\n    bl = 0;\n  if (bl) {\n    for(i = 0; i < bs; ++i) {\n      if (i) *p++ = ':';\n      p = hexc(p, w[i]);\n    }\n    *p++ = ':';\n    i += bl;\n    if (i == 8)\n      *p++ = ':';\n  }\n  else\n    i = 0;\n  for(; i < 8; ++i) {\n    if (i) *p++ = ':';\n    if (i == 6 && !bs && (bl == 6 || (bl == 5 && w[5] == 0xffff)))\n      return mjt_ntop4(s - 4, p, size - (p - dst));\n    p = hexc(p, w[i]);\n  }\n  *p = '\\0';\n  return 1;\n}\n\ninet_XtoX_decl const char *\nfn(ntop)(int af, const void *src, char *dst, int size) {\n  switch(af) {\n  /* don't use AF_*: don't mess with headers */\n  case 2:  /* AF_INET */  if (mjt_ntop4(src, dst, size)) return dst; break;\n  case 10: /* AF_INET6 */ if (mjt_ntop6(src, dst, size)) return dst; break;\n  default: errno = EAFNOSUPPORT; return (char*)0;\n  }\n  errno = ENOSPC;\n  return (char*)0;\n}\n\ninet_XtoX_decl const char *\nfn(ntoa)(struct in_addr addr) {\n  static char buf[4*4];\n  mjt_ntop4(&addr, buf, sizeof(buf));\n  return buf;\n}\n\n#endif /* inet_XtoX_prototypes */\n#endif /* inet_XtoX_no_ntop */\n\n#ifndef inet_XtoX_no_pton\n\ninet_XtoX_decl int fn(pton)(int af, const char *src, void *dst);\ninet_XtoX_decl int fn(aton)(const char *src, struct in_addr *addr);\n\n#ifndef inet_XtoX_prototypes\n\nstatic int mjt_pton4(const char *c, void *dst) {\n  unsigned char *a = dst;\n  unsigned n, o;\n  for (n = 0; n < 4; ++n) {\n    if (*c < '0' || *c > '9')\n      return 0;\n    o = *c++ - '0';\n    while(*c >= '0' && *c <= '9')\n      if ((o = o * 10 + (*c++ - '0')) > 255)\n        return 0;\n    if (*c++ != (n == 3 ? '\\0' : '.'))\n      return 0;\n    *a++ = (unsigned char)o;\n  }\n  return 1;\n}\n\nstatic int mjt_pton6(const char *c, void *dst) {\n  unsigned short w[8], *a = w, *z, *i;\n  unsigned v, o;\n  const char *sc;\n  unsigned char *d = dst;\n  if (*c != ':') z = (unsigned short*)0;\n  else if (*++c != ':') return 0;\n  else ++c, z = a;\n  i = 0;\n  for(;;) {\n    v = 0;\n    sc = c;\n    for(;;) {\n      if (*c >= '0' && *c <= '9') o = *c - '0';\n      else if (*c >= 'a' && *c <= 'f') o = *c - 'a' + 10;\n      else if (*c >= 'A' && *c <= 'F') o = *c - 'A' + 10;\n      else break;\n      v = (v << 4) | o;\n      if (v > 0xffff) return 0;\n      ++c;\n    }\n    if (sc == c) {\n      if (z == a && !*c)\n        break;\n      else\n        return 0;\n    }\n    if (*c == ':') {\n      if (a >= w + 8)\n        return 0;\n      *a++ = v;\n      if (*++c == ':') {\n        if (z)\n          return 0;\n        z = a;\n        if (!*++c)\n          break;\n      }\n    }\n    else if (!*c) {\n      if (a >= w + 8)\n        return 0;\n      *a++ = v;\n      break;\n    }\n    else if (*c == '.') {\n      if (a > w + 6)\n        return 0;\n      if (!mjt_pton4(sc, d))\n        return 0;\n      *a++ = ((unsigned)(d[0]) << 8) | d[1];\n      *a++ = ((unsigned)(d[2]) << 8) | d[3];\n      break;\n    }\n    else\n      return 0;\n  }\n  v = w + 8 - a;\n  if ((v && !z) || (!v && z))\n    return 0;\n  for(i = w; ; ++i) {\n    if (i == z)\n      while(v--) { *d++ = '\\0'; *d++ = '\\0'; }\n    if (i >= a)\n      break;\n    *d++ = (unsigned char)((*i >> 8) & 255);\n    *d++ = (unsigned char)(*i & 255);\n  }\n  return 1;\n}\n\ninet_XtoX_decl int fn(pton)(int af, const char *src, void *dst) {\n  switch(af) {\n  /* don't use AF_*: don't mess with headers */\n  case 2  /* AF_INET  */: return mjt_pton4(src, dst);\n  case 10 /* AF_INET6 */: return mjt_pton6(src, dst);\n  default: errno = EAFNOSUPPORT; return -1;\n  }\n}\n\ninet_XtoX_decl int fn(aton)(const char *src, struct in_addr *addr) {\n  return mjt_pton4(src, addr);\n}\n\n#endif /* inet_XtoX_prototypes */\n\n#endif /* inet_XtoX_no_pton */\n\n#ifdef TEST\n\nint main(int argc, char **argv) {\n  int i;\n  char n0[16], n1[16];\n  char p0[64], p1[64];\n  int af = AF_INET;\n  int pl = sizeof(p0);\n  int r0, r1;\n  const char *s0, *s1;\n\n  while((i = getopt(argc, argv, \"46a:p:\")) != EOF) switch(i) {\n  case '4': af = AF_INET;  break;\n  case '6': af = AF_INET6; break;\n  case 'a': case 'p': pl = atoi(optarg); break;\n  default: return 1;\n  }\n  for(i = optind; i < argc; ++i) {\n    char *a = argv[i];\n\n    printf(\"%s:\\n\", a);\n    r0 = inet_pton(af, a, n0);\n    printf(\" p2n stock: %s\\n\",\n     (r0 < 0 ? \"(notsupp)\" : !r0 ? \"(inval)\" : fn(ntop)(af,n0,p0,sizeof(p0))));\n    r1 = fn(pton)(af, a, n1);\n    printf(\" p2n this : %s\\n\",\n     (r1 < 0 ? \"(notsupp)\" : !r1 ? \"(inval)\" : fn(ntop)(af,n1,p1,sizeof(p1))));\n\n    if ((r0 > 0) != (r1 > 0) ||\n        (r0 > 0 && r1 > 0 && memcmp(n0, n1, af == AF_INET ? 4 : 16) != 0))\n      printf(\" DIFFER!\\n\");\n\n    s0 = inet_ntop(af, n1, p0, pl);\n    printf(\" n2p stock: %s\\n\", s0 ? s0 : \"(inval)\");\n    s1 = fn(ntop)(af, n1, p1, pl);\n    printf(\" n2p this : %s\\n\", s1 ? s1 : \"(inval)\");\n    if ((s0 != 0) != (s1 != 0) ||\n        (s0 && s1 && strcmp(s0, s1) != 0))\n      printf(\" DIFFER!\\n\");\n\n  }\n  return 0;\n}\n\n#endif /* TEST */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/rblcheck.1",
    "content": ".\\\" rblcheck.1\n.\\\" rblckeck manpage\n.\\\"\n.\\\" Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n.\\\" This file is part of UDNS library, an async DNS stub resolver.\n.\\\"\n.\\\" This library is free software; you can redistribute it and/or\n.\\\" modify it under the terms of the GNU Lesser General Public\n.\\\" License as published by the Free Software Foundation; either\n.\\\" version 2.1 of the License, or (at your option) any later version.\n.\\\"\n.\\\" This library is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" Lesser General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU Lesser General Public\n.\\\" License along with this library, in file named COPYING.LGPL; if not,\n.\\\" write to the Free Software Foundation, Inc., 59 Temple Place,\n.\\\" Suite 330, Boston, MA  02111-1307  USA\n\n.TH rblckeck 1 \"Apr 2005\" \"User Utilities\"\n\n.SH NAME\nrblckeck \\- DNSBL lookup utility\n\n.SH SYNOPSYS\n.B rblcheck\n.RB [\\| \\-s\n.IR zone \\|]\n.RB [\\| \\-S\n.IR zone\\-file \\|]\n.RB [\\| \\-c \\|]\n.RB [\\| \\-tmvq \\|]\n.RB [\\| \\-n\n.IR nsaddr \\|]\n.IR address \\|.\\|.\\|.\n\n.SH DESCRIPTION\n.B rblcheck\nis a simple command-line to perform DNSBL (DNS-based blocklists) lookups.\nFor every IP address (or a name, in which case it will be resolved to an\naddress first), the utility verifies whenever it is listed in a (list of)\nDNS blocklists specified with\n.B \\-s\nor\n.B \\-S\noptions, optionally obtains text assotiated with the listing (usually it\nis either some description about the reason of the listing or an URL\nreferring to such a description), and displays results on standard output.\n.PP\nThe program is implemented on top of\n.BR udns (3)\nlibrary.\n\n.SH OPTIONS\n\nThe following options are recognized by\n.BR rblcheck :\n\n.TP\n.B \\-s \\fIzone\\fR\nadd the given \\fIzone\\fR DNSBL name to the list of active zones.\n.TP\n.B \\-S \\fIzone-file\\fR\nadd list of zones from the named \\fIzone-file\\fR to the list of\nactive zones (the file specifies one zone as the first word on a\nline, empty lines and lines starting with `#' character are ignored).\n.TP\n.B \\-c\nreset active zone list.\n.TP\n.B \\-v\nbe more verbose, produce more detailed output.\n.TP\n.B \\-q\nthe opposite for \\fB\\-v\\fR -- produce less detailed output.\n.TP\n.B \\-t\nobtain text for listed addresses.\n.TP\n.B \\-n \\fInsaddr\\fR\nUse the given nameserver (given as IPv4 or IPv6 address) instead of the\ndefault.  The same effect may be achieved by setting $NSCACHEIP environment\nvariable.\n.TP\n.B \\-m\nstop after first hit, ie after the first address which is found to be\nlisted.\n\n.TP\n.B \\-h\nprint short help and exit.\n\n.PP\nIf no\n.BR \\-s ,\n.BR \\-S\nand\n.B \\-c\noptions are given,\n.B rblcheck\nwill try to obtain list of zones using $RBLCHECK_ZONES environment variable,\nor ~/.rblcheckrc, or /etc/rblckechrc files, in that order.  If no zones are\nfound, it will exit unsuccessefully.\n\n.SH \"RETURN VALUE\"\nWhen no addresses given are listed and no errors occured,\n.B rblcheck\nexits with code 0.  If at least one address is listed,\n.B rblcheck\nreturns 100.  In case of DNS errors,\n.B rblcheck\nreturns 2.\n\n.SH ENVIRONMENT\n\n.TP\n.B $RBLCHECK_ZONES\nif no\n.BR \\-s ,\n.B \\-S\nor\n.B \\-c\noption is given,\n.B rblcheck\ntries this variable to obtain list of DNSBL zones to check against.\n\n.SH FILES\n\n.TP\n$HOME/.rblcheckrc and /etc/rblcheckrc\nif no\n.BR \\-s ,\n.B \\-S\nor\n.B \\-c\noption is given, and no $RBLCHECK_ZONES environment variable is set,\n.B rblcheck\nwill try the two files (the first one that exists) to obtain list of\nDNSBL zones to check against.\nEach line specifies one zone (only first word in each line is used).\nEmpty lines and lines starting with `#' character are ignored.\n\n.SH \"SEE ALSO\"\n.BR dnsget (1)\n.BR resolv.conf (5)\n.BR udns (3).\n\n.SH AUTHOR\nThis program and manual pages are written by Michael Tokarev.\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/rblcheck.c",
    "content": "/* rblcheck.c\n   dnsbl (rbl) checker application\n\n   Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n */\n\n#ifdef HAVE_CONFIG_H\n# include \"config.h\"\n#endif\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#ifdef __MINGW32__\n# include <winsock2.h>\n#else\n# include <unistd.h>\n# include <sys/types.h>\n# include <sys/socket.h>\n# include <netinet/in.h>\n#endif\n#include <time.h>\n#include <errno.h>\n#include <stdarg.h>\n#include \"udns.h\"\n\n#ifndef HAVE_GETOPT\n# include \"getopt.c\"\n#endif\n\nstatic const char *version = \"udns-rblcheck 0.4\";\nstatic char *progname;\n\nstatic void error(int die, const char *fmt, ...) {\n  va_list ap;\n  fprintf(stderr, \"%s: \", progname);\n  va_start(ap, fmt); vfprintf(stderr, fmt, ap); va_end(ap);\n  putc('\\n', stderr);\n  fflush(stderr);\n  if (die)\n    exit(1);\n}\n\nstruct rblookup {\n  struct ipcheck *parent;\n  struct in_addr key;\n  const char *zone;\n  struct dns_rr_a4  *addr;\n  struct dns_rr_txt *txt;\n};\n\nstruct ipcheck {\n  const char *name;\n  int naddr;\n  int listed;\n  struct rblookup *lookup;\n};\n\n#define notlisted ((void*)1)\n\nstatic int nzones, nzalloc;\nstatic const char **zones;\n\nstatic int do_txt;\nstatic int stopfirst;\nstatic int verbose = 1;\n/* verbosity level:\n * <0 - only bare As/TXTs\n * 0 - what RBL result\n * 1(default) - what is listed by RBL: result\n * 2          - what is[not ]listed by RBL: result, name lookups\n */\n\nstatic int listed;\nstatic int failures;\n\nstatic void *ecalloc(int size, int cnt) {\n  void *t = calloc(size, cnt);\n  if (!t)\n    error(1, \"out of memory\");\n  return t;\n}\n\nstatic void addzone(const char *zone) {\n  if (nzones >= nzalloc) {\n    const char **zs = (const char**)ecalloc(sizeof(char*), (nzalloc += 16));\n    if (zones) {\n      memcpy(zs, zones, nzones * sizeof(char*));\n      free(zones);\n    }\n    zones = zs;\n  }\n  zones[nzones++] = zone;\n}\n\nstatic int addzonefile(const char *fname) {\n  FILE *f = fopen(fname, \"r\");\n  char linebuf[2048];\n  if (!f)\n    return 0;\n  while(fgets(linebuf, sizeof(linebuf), f)) {\n    char *p = linebuf, *e;\n    while(*p == ' ' || *p == '\\t') ++p;\n    if (*p == '#' || *p == '\\n') continue;\n    e = p;\n    while(*e && *e != ' ' && *e != '\\t' && *e != '\\n')\n      ++e;\n    *e++ = '\\0';\n    p = memcpy(ecalloc(e - p, 1), p, e - p); // strdup\n    addzone(p);\n  }\n  fclose(f);\n  return 1;\n}\n\nstatic void dnserror(struct rblookup *ipl, const char *what) {\n  char buf[4*4];\n  error(0, \"unable to %s for %s (%s): %s\",\n          what, dns_ntop(AF_INET, &ipl->key, buf, sizeof(buf)),\n          ipl->zone, dns_strerror(dns_status(0)));\n  ++failures;\n}\n\nstatic void display_result(struct ipcheck *ipc) {\n  int j;\n  struct rblookup *l, *le;\n  char buf[4*4];\n  if (!ipc->naddr) return;\n  for (l = ipc->lookup, le = l + nzones * ipc->naddr; l < le; ++l) {\n    if (!l->addr) continue;\n    if (verbose < 2 && l->addr == notlisted) continue;\n    if (verbose >= 0) {\n      dns_ntop(AF_INET, &l->key, buf, sizeof(buf));\n      if (ipc->name) printf(\"%s[%s]\", ipc->name, buf);\n      else printf(\"%s\", buf);\n    }\n    if (l->addr == notlisted) {\n      printf(\" is NOT listed by %s\\n\", l->zone);\n      continue;\n    }\n    else if (verbose >= 1)\n      printf(\" is listed by %s: \", l->zone);\n    else if (verbose >= 0)\n      printf(\" %s \", l->zone);\n    if (verbose >= 1 || !do_txt)\n      for (j = 0; j < l->addr->dnsa4_nrr; ++j)\n        printf(\"%s%s\", j ? \" \" : \"\",\n               dns_ntop(AF_INET, &l->addr->dnsa4_addr[j], buf, sizeof(buf)));\n    if (!do_txt) ;\n    else if (l->txt) {\n      for(j = 0; j < l->txt->dnstxt_nrr; ++j) {\n        unsigned char *t = l->txt->dnstxt_txt[j].txt;\n        unsigned char *e = t + l->txt->dnstxt_txt[j].len;\n        printf(\"%s\\\"\", verbose > 0 ? \"\\n\\t\" : j ? \" \" : \"\");\n        while(t < e) {\n          if (*t < ' ' || *t >= 127) printf(\"\\\\x%02x\", *t);\n          else if (*t == '\\\\' || *t == '\"') printf(\"\\\\%c\", *t);\n          else putchar(*t);\n          ++t;\n        }\n        putchar('\"');\n      }\n      free(l->txt);\n    }\n    else\n      printf(\"%s<no text available>\", verbose > 0 ? \"\\n\\t\" : \"\");\n    free(l->addr);\n    putchar('\\n');\n  }\n  free(ipc->lookup);\n}\n\nstatic void txtcb(struct dns_ctx *ctx, struct dns_rr_txt *r, void *data) {\n  struct rblookup *ipl = data;\n  if (r) {\n    ipl->txt = r;\n    ++ipl->parent->listed;\n  }\n  else if (dns_status(ctx) != DNS_E_NXDOMAIN)\n    dnserror(ipl, \"lookup DNSBL TXT record\");\n}\n\nstatic void a4cb(struct dns_ctx *ctx, struct dns_rr_a4 *r, void *data) {\n  struct rblookup *ipl = data;\n  if (r) {\n    ipl->addr = r;\n    ++listed;\n    if (do_txt) {\n      if (dns_submit_a4dnsbl_txt(0, &ipl->key, ipl->zone, txtcb, ipl))\n        return;\n      dnserror(ipl, \"submit DNSBL TXT record\");\n    }\n    ++ipl->parent->listed;\n  }\n  else if (dns_status(ctx) != DNS_E_NXDOMAIN)\n    dnserror(ipl, \"lookup DNSBL A record\");\n  else\n    ipl->addr = notlisted;\n}\n\nstatic int\nsubmit_a_queries(struct ipcheck *ipc,\n                 int naddr, const struct in_addr *addr) {\n  int z, a;\n  struct rblookup *rl = ecalloc(sizeof(*rl), nzones * naddr);\n  ipc->lookup = rl;\n  ipc->naddr = naddr;\n  for(a = 0; a < naddr; ++a) {\n    for(z = 0; z < nzones; ++z) {\n      rl->key = addr[a];\n      rl->zone = zones[z];\n      rl->parent = ipc;\n      if (!dns_submit_a4dnsbl(0, &rl->key, rl->zone, a4cb, rl))\n        dnserror(rl, \"submit DNSBL A query\");\n      ++rl;\n    }\n  }\n  return 0;\n}\n\nstatic void namecb(struct dns_ctx *ctx, struct dns_rr_a4 *rr, void *data) {\n  struct ipcheck *ipc = data;\n  if (rr) {\n    submit_a_queries(ipc, rr->dnsa4_nrr, rr->dnsa4_addr);\n    free(rr);\n  }\n  else {\n    error(0, \"unable to lookup `%s': %s\",\n          ipc->name, dns_strerror(dns_status(ctx)));\n    ++failures;\n  }\n}\n\nstatic int submit(struct ipcheck *ipc) {\n  struct in_addr addr;\n  if (dns_pton(AF_INET, ipc->name, &addr) > 0) {\n    submit_a_queries(ipc, 1, &addr);\n    ipc->name = NULL;\n  }\n  else if (!dns_submit_a4(0, ipc->name, 0, namecb, ipc)) {\n    error(0, \"unable to submit name query for %s: %s\\n\",\n          ipc->name, dns_strerror(dns_status(0)));\n    ++failures;\n  }\n  return 0;\n}\n\nstatic void waitdns(struct ipcheck *ipc) {\n  struct timeval tv;\n  fd_set fds;\n  int c;\n  int fd = dns_sock(NULL);\n  time_t now = 0;\n  FD_ZERO(&fds);\n  while((c = dns_timeouts(NULL, -1, now)) > 0) {\n    FD_SET(fd, &fds);\n    tv.tv_sec = c;\n    tv.tv_usec = 0;\n    c = select(fd+1, &fds, NULL, NULL, &tv);\n    now = time(NULL);\n    if (c > 0)\n      dns_ioevent(NULL, now);\n    if (stopfirst && ipc->listed)\n      break;\n  }\n}\n\nint main(int argc, char **argv) {\n  int c;\n  struct ipcheck ipc;\n  char *nameserver = NULL;\n  int zgiven = 0;\n\n  if (!(progname = strrchr(argv[0], '/'))) progname = argv[0];\n  else argv[0] = ++progname;\n\n  while((c = getopt(argc, argv, \"hqtvms:S:cn:\")) != EOF) switch(c) {\n  case 's': ++zgiven; addzone(optarg); break;\n  case 'S':\n    ++zgiven;\n    if (addzonefile(optarg)) break;\n    error(1, \"unable to read zonefile `%s'\", optarg);\n  case 'c': ++zgiven; nzones = 0; break;\n  case 'q': --verbose; break;\n  case 'v': ++verbose; break;\n  case 't': do_txt = 1; break;\n  case 'n': nameserver = optarg; break;\n  case 'm': ++stopfirst; break;\n  case 'h':\n    printf(\"%s: %s (udns library version %s).\\n\",\n           progname, version, dns_version());\n    printf(\"Usage is: %s [options] address..\\n\", progname);\n    printf(\n\"Where options are:\\n\"\n\" -h - print this help and exit\\n\"\n\" -s service - add the service (DNSBL zone) to the serice list\\n\"\n\" -S service-file - add the DNSBL zone(s) read from the given file\\n\"\n\" -c - clear service list\\n\"\n\" -v - increase verbosity level (more -vs => more verbose)\\n\"\n\" -q - decrease verbosity level (opposite of -v)\\n\"\n\" -t - obtain and print TXT records if any\\n\"\n\" -m - stop checking after first address match in any list\\n\"\n\" -n ipaddr - use the given nameserver instead of the default\\n\"\n\"(if no -s or -S option is given, use $RBLCHECK_ZONES, ~/.rblcheckrc\\n\"\n\"or /etc/rblcheckrc in that order)\\n\"\n    );\n    return 0;\n  default:\n    error(1, \"use `%s -h' for help\", progname);\n  }\n\n  if (!zgiven) {\n    char *s = getenv(\"RBLCHECK_ZONES\");\n    if (s) {\n      char *k;\n      s = strdup(s);\n      for(k = strtok(s, \" \\t\"); k; k = strtok(NULL, \" \\t\"))\n        addzone(k);\n      free(s);\n    }\n    else {\t/* probably worthless on windows? */\n      char *path;\n      char *home = getenv(\"HOME\");\n      if (!home) home = \".\";\n      path = malloc(strlen(home) + 1 + sizeof(\".rblcheckrc\"));\n      sprintf(path, \"%s/.rblcheckrc\", home);\n      if (!addzonefile(path))\n        addzonefile(\"/etc/rblcheckrc\");\n      free(path);\n    }\n  }\n  if (!nzones)\n    error(1, \"no service (zone) list specified (-s or -S option)\");\n\n  argv += optind;\n  argc -= optind;\n\n  if (!argc)\n    return 0;\n\n  if (dns_init(NULL, 0) < 0)\n    error(1, \"unable to initialize DNS library: %s\", strerror(errno));\n  if (nameserver) {\n    dns_add_serv(NULL, NULL);\n    if (dns_add_serv(NULL, nameserver) < 0)\n      error(1, \"wrong IP address for a nameserver: `%s'\", nameserver);\n  }\n  if (dns_open(NULL) < 0)\n    error(1, \"unable to initialize DNS library: %s\", strerror(errno));\n\n  for (c = 0; c < argc; ++c) {\n    if (c && (verbose > 1 || (verbose == 1 && do_txt))) putchar('\\n');\n    memset(&ipc, 0, sizeof(ipc));\n    ipc.name = argv[c];\n    submit(&ipc);\n    waitdns(&ipc);\n    display_result(&ipc);\n    if (stopfirst > 1 && listed) break;\n  }\n\n  return listed ? 100 : failures ? 2 : 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns.3",
    "content": ".\\\" udns.3\n.\\\" udns library manpage\n.\\\"\n.\\\" Copyright (C) 2005-2014  Michael Tokarev <mjt+udns@tls.msk.ru>\n.\\\" This file is part of UDNS library, an async DNS stub resolver.\n.\\\"\n.\\\" This library is free software; you can redistribute it and/or\n.\\\" modify it under the terms of the GNU Lesser General Public\n.\\\" License as published by the Free Software Foundation; either\n.\\\" version 2.1 of the License, or (at your option) any later version.\n.\\\"\n.\\\" This library is distributed in the hope that it will be useful,\n.\\\" but WITHOUT ANY WARRANTY; without even the implied warranty of\n.\\\" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n.\\\" Lesser General Public License for more details.\n.\\\"\n.\\\" You should have received a copy of the GNU Lesser General Public\n.\\\" License along with this library, in file named COPYING.LGPL; if not,\n.\\\" write to the Free Software Foundation, Inc., 59 Temple Place,\n.\\\" Suite 330, Boston, MA  02111-1307  USA\n\n.TH udns 3 \"Jan 2014\" \"Library Functions\"\n\n.SH NAME\nudns \\- stub DNS resolver library\n\n.SH SYNOPSYS\n.nf\n#include <udns.h>\nstruct \\fBdns_ctx\\fR;\nstruct \\fBdns_query\\fR;\nextern struct dns_ctx \\fBdns_defctx\\fR;\nstruct dns_ctx *\\fIctx\\fR;\ntypedef void \\fBdns_query_fn\\fR(\\fIctx\\fR, void *\\fIresult\\fR, void *\\fIdata\\fR);\ntypedef int\n\\fBdns_parse_fn\\fR(const unsigned char *\\fIqnd\\fR,\n       const unsigned char *\\fIpkt\\fR,\n       const unsigned char *\\fIcur\\fR,\n       const unsigned char *\\fIend\\fR,\n       void **\\fIresultp\\fR);\n\n\\fBcc\\fR ... -l\\fBudns\\fR\n.fi\n\n.SH DESCRIPTION\n\n.PP\nThe DNS library, \\fBudns\\fR, implements thread-safe stub DNS resolver\nfunctionality, which may be used both traditional, syncronous way\nand asyncronously, with application-supplied event loop.\n\n.PP\nWhile DNS works with both TCP and UDP, performing UDP query first and\nif the result does not fit in UDP buffer (512 bytes max for original\nDNS protocol), retrying the query over TCP, the library uses UDP only,\nbut uses EDNS0 (RFC2671) extensions which allows larger UDP buffers.\n\n.PP\nThe library uses single UDP socket to perform all operations even when\nasking multiple nameservers.  This way, it is very simple to use the\nlibrary in asyncronous event-loop applications: an application should\nadd only single socket to the set of filedescriptors it monitors for I/O.\n\n.PP\nThe library uses two main objects, \\fIresolver context\\fR of type\n\\fBstruct\\ dns_ctx\\fR, and \\fIquery structure\\fR of type\n\\fBstruct\\ dns_query\\fR, both are opaque for an application.\nResolver context holds global information about the resolver,\nsuch as list of nameservers to use, list of active requests and the like.\nQuery objects holds information about a single DNS query in progress and\nare allocated/processed/freed by the library.   Pointer to query structure\nmay be treated as an identifier of an in-progress query and may be used\nto cancel the asyncronous query or to wait for it to complete.\n\n.PP\nAsyncronous interface works as follows.  An application initializes\nresolver context, submits any number of queries for it using one of\nsupplied \\fBdns_submit_\\fIXXX\\fR() routines (each return the query\nidentifier as pointer to query structure), waits for input on the\nUDP socket used by the library, and gives some control to the library\nby calling \\fBdns_ioevent\\fR() and \\fBdns_timeouts\\fR() routines when\nappropriate.  The library performs all necessary processing and executes\napplication supplied callback routine when a query completes (either\nsuccessefully or not), giving it the result if any, pointer to the\nresolver context (from which completion status may be obtained), and\nthe data pointer supplied by an application when the query has been\nsubmitted.  When submitting a query, an application requests how to\nhandle the reply -- to either return raw DNS reply packet for its\nown low-level processing, or it may provide an address of \\fIparsing\nroutine\\fR of type \\fBdns_parse_fn\\fR to perform conversion of on-wire\nformat into easy to use data structure (the library provides parsing\nroutines for several commonly used resource record types, as well as\ntype-safe higher-level inteface that requests parsing automatically).\nThe I/O monitoring and timeout handling may be either traditional\nselect() or poll() based, or any callback-driven technique may be\nused.\n\n.PP\nAdditionally, the library provides traditional syncronous interface,\nwhich may be intermixed with asyncronous calls (during syncronous\nquery processing, other asyncronous queries for the same resolver\ncontext continued to be processed as usual).  An application uses\none of numerous \\fBdns_resolve_\\fIXXX\\fR() routines provided by the\nlibrary to perform a query.  As with asyncronous interface, an\napplication may either request to return raw DNS packet or type-specific\ndata structure by providing the parsing routine to handle the reply.\nEvery routine from \\fBdns_resolve_\\fIXXX\\fR() series return pointer\nto result or NULL in case of any error.  Query completion status\n(or length of the raw DNS packet) is available from the resolver\ncontext using \\fBdns_status\\fR() routine, the same way as for the\nasyncronous interface.\n\n.PP\nInternally, library uses on-wire format of domain names, referred\nto as \\fIDN format\\fR in this manual page.  This is a series of domain\n\\fIlabels\\fR whith preceeding length byte, terminated by zero-length\nlabel wich is integral part of the DN format.  There are several routines\nprovided to convert from traditional asciiz string to DN and back.\nHigher-level type-specific query interface hides the DN format from\nan application.\n\n.SH \"COMMON DEFINITIONS\"\n\n.PP\nEvery DNS Resource Record (RR) has a \\fItype\\fR and a \\fIclass\\fR.\nThe library defines several integer constants, \\fBDNS_C_\\fIXXX\\fR and\n\\fBDNS_T_\\fIXXX\\fR, to use as symbolic names for RR classes and types,\nsuch as \\fBDNS_C_IN\\fR for Internet class, \\fBDNS_T_A\\fR for IPv4\naddress record type and so on.  See udns.h header file for complete list\nof all such constants.\n\n.PP\nThe following constants are defined in udns.h header file:\n.IP \"\\fBDNS_MAXDN\\fR (255 bytes)\"\nMaximum length of the domain name in internal (on-wire) DN format.\n.IP \"\\fBDNS_MAXLABEL\\fR (63 bytes)\"\nMaximum length of a single label in DN format.\n.IP \"\\fBDNS_MAXNAME\\fR (1024 bytes)\"\nMaximum length of asciiz format of a domain name.\n.IP \"\\fBDNS_HSIZE\\fR (12 bytes)\"\nSize of header in DNS packet.\n.IP \"\\fBDNS_PORT\\fR (53)\"\nDefault port to use when contacting a DNS server.\n.IP \"\\fBDNS_MAXSERV\\fR (6 servers)\"\nMaximum number of DNS servers to use.\n.IP \"\\fBDNS_MAXPACKET\\fR (512 bytes)\"\nMaximum length of DNS UDP packet as specified by original DNS protocol\n.IP \"\\fBDNS_EDNS0PACKET\\fR (4096 bytes)\"\nDefault length of DNS UDP packet (with EDNS0 extensions) the library uses.\nNote that recursive nameservers usually resides near the client asking them\nto resolve names, e.g. on the same LAN segment or even on the same host, so\nUDP packet fragmentation isn't a problem in most cases.  Note also that\nthe size of actual packets will be as many bytes as actual reply size requires,\nwhich is smaller than this value in almost all cases.\n\n.PP\nAdditionally, several constants are defined to simplify work with raw DNS\npackets, such as DNS response codes (\\fBDNS_R_\\fIXXX\\fR), DNS header layout\n(\\fBDNS_H_\\fIXXX\\fR) and others.  Again, see udns.h for complete list.\nLibrary error codes (\\fBDNS_E_\\fIXXX\\fR) are described later in this\nmanual page.\n\n.SH \"RESOLVER CONTEXT\"\n\n.PP\nResolver context, of type \\fBstruct\\ dns_ctx\\fR, is an object which is\nopaque to an application.  Several routines provided by the library\nto initialize, copy and free resolver contexts.  Most other high-level\nroutines in this library expects a pointer to resolver context, \\fIctx\\fR,\nas the first argument.  There is a default resolver context available,\nnamed \\fBdns_defctx\\fR.  When the context pointer \\fIctx\\fR passed to\na routine is NULL, \\fBdns_defctx\\fR is used.  Several resolver contexts\nmay be active at the same time, for example, when an application is\nmulti-threaded and each thread uses resolver.\n.PP\nIn order to use the library, an application should initialize and open\none or more resolver context objects.  These are two separate actions,\nperformed by \\fBdns_init\\fR() (or \\fBdns_reset\\fR()), and \\fBdns_open\\fR().\nBetween the two calls, an application is free to pefrorm additional\ninitialisation, such as setting custom nameservers, options or domain search\nlists.  Optionally, in case no additional custom initialisation is required,\n\\fBdns_init\\fR() may open the context if \\fIdo_open\\fR argument (see below)\nis non-zero.\n.PP\nWhen initializing resolver context, the library uses information from\nsystem file /etc/resolv.conf (see \\fBresolv.conf\\fR(5)), consults\nenvironment variables \\fB$LOCALDOMAIN\\fR, \\fB$NSCACHEIP\\fR,\n\\fB$NAMESERVERS\\fR and \\fB$RES_OPTIONS\\fR, and local host name to obtain\nlist of local nameservers, domain name search list and various resolver\noptions.\n.PP\nThe following routines to initialize resolver context are available:\n.PP\n.nf\nvoid \\fBdns_reset\\fR(\\fIctx\\fR)\nint \\fBdns_init\\fR(\\fIctx\\fR, int \\fIdo_open\\fR)\n.fi\n.RS\n\\fBdns_reset\\fR() resets a given resolver context to default values,\npreparing it to be opened by \\fBdns_open\\fR().\nIt is ok to call this routine against opened and active context - all active\nqueries will be dropped, sockets will be closed and so on.  This routine\ndoes not initialize any parameters from system configuration files, use\n\\fBdns_init\\fR() for this.  There's no error return - operation always\nsucceeds.  \\fBdns_init\\fR() does everything \\fBdns_reset\\fR() does,\nplus initializes various parameters of the context according to system\nconfiguration and process environment variables.  If \\fIdo_open\\fR is\nnon-zero, \\fBdns_init\\fR() calls \\fIdns_open\\fR(), so that the whole\nlibrary initialisation is performed in a single step.\n.RE\n.PP\n.nf\nstruct dns_ctx *\\fBdns_new\\fR(struct dns_ctx *\\fIcopy\\fR)\nvoid \\fBdns_free\\fR(\\fIctx\\fR)\n.fi\n.RS\n\\fBdns_new\\fR() allocates new resolver context and copies all parameters\nfor a given resolver context \\fIcopy\\fR, or default context if \\fIcopy\\fR\nis NULL, and returns pointer to the newly allocated context.  The context\nbeing copied should be initialized.\n\\fBdns_new\\fR() may fail if there's no memory available to make a copy\nof \\fIcopy\\fR, in which case the routine will return NULL pointer.\n\\fBdns_free\\fR() is used to close assotiated socket and free resolver\ncontext resources and cancelling (abandoming) all active queries\nassotiated with it.  It's an error to free \\fBdns_defctx\\fR, only\ndynamically allocated contexts returned by \\fBdns_new\\fR() are allowed\nto be freed by \\fBdns_free\\fR().\n.RE\n.PP\n.nf\nint \\fBdns_add_serv\\fR(\\fIctx\\fR, const char *\\fIservaddr\\fR)\nint \\fBdns_add_serv_s\\fR(\\fIctx\\fR, const struct sockaddr *\\fIsa\\fR)\nint \\fBdns_add_srch\\fR(\\fIctx\\fR, const char *\\fIsrch\\fR)\n.fi\n.RS\nAdd an element to list of nameservers (\\fBdns_add_serv\\fR(), as\nasciiz-string \\fIservaddr\\fR with an IP address of the nameserver,\nand \\fBdns_add_serv_s\\fR(), as initialized socket address \\fIsa\\fR),\nor search list (\\fBdns_add_srch\\fR(), as a pointer to domain name)\nfor the given context \\fIctx\\fR.  If the last argument is a NULL\npointer, the corresponding list (search or nameserver) is reset\ninstead.  Upon successeful completion, each routine returns new\nnumber of elements in the list in question.  On error, negative\nvalue is returned and global variable \\fBerrno\\fR is set appropriately.\nIt is an error to call any of this functions if the context is\nopened (after \\fBdns_open\\fR() or \\fBdns_init\\fR() with non-zero argument).\n.RE\n.PP\n.nf\nint \\fBdns_set_opts\\fR(\\fIctx\\fR, const char *\\fIopts\\fR)\n.fi\n.RS\nset resolver context options from \\fIopts\\fR string, in the same way as\nprocessing \\fBoptions\\fR statement in resolv.conf and \\fB$RES_OPTIONS\\fR\nenvironment variable.  Return number of unrecognized/invalid options\nfound (all recognized and valid options gets processed).\n.RE\n.PP\n.nf\nvoid \\fBdns_set_opt\\fR(\\fIctx\\fR, int \\fIopt\\fR, \\fIval\\fR)\n.fi\n.RS\n.B TODO\nThe \\fIflags\\fR argument is a bitmask with the following bits defined:\n.IP \\fBDNS_NOSRCH\\fR\ndo not perform domain name search in search list.\n.IP \\fBDNS_NORD\\fR\ndo not request recursion when performing queries\n(i.e. don't set RD flag in querues).\n.IP \\fBDNS_AAONLY\\fR\nrequest authoritative answers only (i.e. set AA\nflag in queries).\n.RE\n\n.PP\n.nf\nint \\fBdns_open\\fR(\\fIctx\\fR)\nint \\fBdns_sock\\fR(const \\fIctx\\fR)\nvoid \\fBdns_close\\fR(\\fIctx\\fR)\n.fi\n.RS\n\\fBdns_open\\fR() opens the UDP socket used for queries if not already\nopen, and return assotiated filedescriptor (or negative value in case\nof error).  Before any query can be submitted, the context should be\nopened using this routine.  And before opening, the context should be\ninitialized.\n\\fBdns_sock\\fR() return the UDP socket if open, or -1 if not.\n\\fBdns_close\\fR() closes the UDP socket if it was open, and drops all active\nqueries if any.\n.RE\n\n.PP\n.nf\nint \\fBdns_active\\fR(const \\fIctx\\fR)\n.fi\n.RS\nreturn number of active queries queued for the given context\n\\fIctx\\fR, or zero if none.\n.RE\n\n.PP\n.nf\nint \\fBdns_status\\fR(const \\fIctx\\fR)\n.fi\n.RS\nreturn status code from last operation.  When using syncronous\ninterface, this is the query completion status of the last query.\nWith asyncronous interface, from within the callback routine,\nthis is the query completion status of the query for which the\ncallback is being called.  When query submission fails, this\nis the error code indicating failure reason.  All error codes\nare negative and are represented by \\fBDNS_E_\\fIXXX\\fR constants\ndescribed below.\n.RE\n\n.PP\n.nf\nvoid \\fBdns_ioevent\\fR(\\fIctx\\fR, time_t \\fInow\\fR)\n.fi\n.RS\nthis routine may be called by an application to process I/O\nevents on the UDP socket used by the library, as returned\nby \\fBdns_sock\\fR().  The routine tries to receive incoming\nUDP datagram from the socket and process it.  The socket is\nset up to be non-blocking, so it is safe to call the routine\neven if there's no data to read.  The routine will process\nas many datagrams as are queued for the socket, so it is\nsafe to use it with either level-triggered or edge-triggered\nI/O monitoring model.  The \\fInow\\fR argument is either a\ncurrent time as returned by \\fBtime\\fR(), or 0, in which\ncase the routine will obtain current time by it's own.\n.RE\n\n.PP\n.nf\nint \\fBdns_timeouts\\fR(\\fIctx\\fR, int \\fImaxwait\\fR, time_t \\fInow\\fR)\n.fi\n.RS\nprocess any pending timeouts and return number of secounds\nfrom current time (\\fInow\\fR if it is not 0) to the time when\nthe library wants the application to pass it control to process\nmore queued requests.  In case when there are no requests pending,\nthis time is -1.  The routine will not request a time larger than\n\\fImaxwait\\fR secounds if it is greather or equal to zero.  If\n\\fInow\\fR is 0, the routine will obtain current time by it's own;\nwhen it is not 0, it should contain current time as returned by\n\\fBtime\\fR().\n.RE\n\n.PP\n.nf\ntypedef void \\fBdns_utm_fn\\fR(\\fIctx\\fR, int \\fItimeout\\fR, void *\\fIdata\\fR)\nvoid \\fBdns_set_tmcbck\\fR(\\fIctx\\fR, dns_utm_fn *\\fIutmfn\\fR, void *\\fIdata\\fR)\n.fi\n.RS\nAn application may use custom callback-based I/O multiplexing mechanism.\nUsually such a mechanism have concept of a \\fItimer\\fR, and an ability\nto register a timer event in a form of a callback routine which will\nbe executed after certain amount of time.  In order to use such an\nevent mechanism, udns provides an ability to register and de-register\ntimer events necessary for internal processing using whatever event\nmechanism an application uses.  For this to work, it is possible to\nassotiate a pointer to a routine that will perform necessary work for\n(de)registering timer events with a given resolver context, and\nudns will call that routine at appropriate times.  Prototype of\nsuch a routine is shown by \\fBdns_utm_fn\\fR typedef above.  Libudns\nassotiates single timer with resolver context.  User-supplied \\fIutmfn\\fR\nroutine will be called by the library with the following arguments:\n.IP \"\\fIctx\\fR == NULL\"\ndelete user timer, at context free time or when an application changes\nuser timer request routine using \\fBdns_set_tmcbck\\fR();\n.IP \"\\fIctx\\fR != NULL, \\fItimeout\\fR < 0\"\ndon't fire timer anymore, when there are no active requests;\n.IP \"\\fIctx\\fR != NULL, \\fItimeout\\fR == 0\"\nfire timer at the next possibility, but not immediately;\n.IP \"\\fIctx\\fR != NULL, \\fItimeout\\fR > 0\"\nfire timer after \\fItimeout\\fR seconds after now.\n.PP\nThe \\fIdata\\fR argument passed to the routine will be the same\nas passed to \\fBdns_set_tmcbck\\fR().\n.PP\nWhen a timer expires, an application should call \\fBdns_timeouts\\fR()\nroutine (see below).  Non-callback timer usage is provided too.\n.RE\n\n.PP\n.B XXXX TODO: some more resolver context routines, like dns_set_dbgfn() etc.\n\n.SH \"QUERY INTERFACE\"\n\n.PP\nThere are two ways to perform DNS queries: traditional syncronous\nway, when udns performs all the necessary processing and return\ncontrol to the application only when the query completes, and\nasyncronous way, when an application submits one or more queries\nto the library using given resolver context, and waits for completion\nby monitoring filedescriptor used by library and calling library\nroutines to process input on that filedescriptor.  Asyncronous mode\nworks with callback routines: an application supplies an address of\na routine to execute when the query completes, and a data pointer,\nwhich is passed to the callback routine.\n\n.PP\nQueries are submitted to the library in a form of \\fBstruct\\ dns_query\\fR.\nTo perform asyncronous query, an application calls one of the\n\\fBdns_submit_\\fIXXX\\fR() rounines, and provides necessary information\nfor a callback, together with all the query parameters.\nWhen the query completes, library will call application-supplied callback\nroutine, giving it the resolver context (wich holds query completion status),\ndynamically allocated result (which will be either raw DNS packet or, if\napplicatin requested parsing the result by specifying non-NULL parse routine,\nready-to-use type-specific structure), and a data pointer provided by an\napplication when it submitted the query.  It is the application who's\nresponsible for freeing the result memory.\n.PP\nGeneric query callback routine looks like this:\n.nf\ntypedef void\n\\fBdns_query_fn\\fR(\\fIctx\\fR, void *\\fIresult\\fR, void *\\fIdata\\fR)\n.fi\nType-specific query interface expects similar form of callback\nroutine with the only difference in type of \\fBresult\\fR argument,\nwhich will be pointer to specific data structure (decoded reply)\ninstead of this void pointer to raw DNS packet data.\n\n.PP\nResult parsing routine looks like this:\n.nf\ntypedef int\n\\fBdns_parse_fn\\fR(const unsigned char *\\fIqdn\\fR,\n      const unsigned char *\\fIpkt\\fR,\n      const unsigned char *\\fIcur\\fR,\n      const unsigned char *\\fIend\\fR,\n      void **\\fIresultp\\fR);\n.fi\nWhen called by the library, the arguments are as follows:\n\\fIpkt\\fR points to the start of the packet received;\n\\fIend\\fR points past the end of the packet received;\n\\fIcur\\fR points past the query DN in the query section of the\npacket;\n\\fIqdn\\fR points to the original query DN.\nThe routine should allocate a single buffer to hold the result,\nparse the reply filling in the buffer, and return the buffer\nusing \\fIresultp\\fR argument.  It returns 0 in case of error,\nor udns error code (\\fBDNS_E_\\fIXXX\\fR constants) in case of\nerror.\nNote that by the time when the parse routine is called by the\nlibrary, packet is already verified to be a reply to the\noriginal query, by matching query DN, query class and query type.\n\n.PP\nType-specific query inteface supplies necessary parsing routines\nautomatically.\n\n.PP\nIn case of error, query completion status as returned by\n\\fBdns_status\\fR(\\fIctx\\fR), will contain one of the following values:\n.IP \"positive value\"\nlength of raw DNS packet if parsing is not requested.\n.IP 0\nthe query was successeful and the \\fIreply\\fR points to type-specific\ndata structure.\n.IP \\fBDNS_E_TEMPFAIL\\fR\ntemporary error, the resolver nameserver was not able to\nprocess our query or timed out.\n.IP \\fBDNS_E_PROTOCOL\\fR\nprotocol error, a nameserver returned malformed reply.\n.IP \\fBDNS_E_NXDOMAIN\\fR\nthe domain name does not exist.\n.IP \\fBDNS_E_NODATA\\fR\nthere is no data of requested type found.\n.IP \\fBDNS_E_NOMEM\\fR\nout of memory while processing request.\n.IP \\fBDNS_E_BADQUERY\\fR\nsome aspect of the query (most common is the domain name in question)\nis invalid, and the library can't even start a query.\n\n.PP\nLibrary provides two series of routines which uses similar interface --\none for asyncronous queries and another for syncronous queries.  There\nare two general low-level routines in each series to submit (asyncronous\ninterface) and resolve (syncronous interface) queries, as well as several\ntype-specific routines with more easy-to-use interfaces.  To submit\nan asyncronous query, use one of \\fBdns_submit_\\fIXXX\\fR() routine, each\nof which accepts query parameters, pointers to callback routine and to\ncallback data, and optional current time hint.  Note type-specific\n\\fBdns_submit_\\fIXXX\\fR() routines expects specific type of the callback\nroutine as well, which accepts reply as a pointer to corresponding\nstructure, not a void pointer).  Every \\fBdns_submit_\\fIXXX\\fR() routine\nreturn pointer to internal query structure of type struct\\ dns_query,\nused as an identifier for the given query.\n\n.PP\nTo resolve a query syncronously, use one of \\fBdns_resolve_\\fIXXX\\fR()\nroutines, which accepts the same query parameters (but not the\ncallback pointers) as corresponding \\fBdns_submit_\\fIXXX\\fR(), and\nreturn the query result, which is the same as passed to the callback\nroutine in case of asyncronous interface.\n\n.PP\nIn either case, the result memory (if the query completed successefully)\nis dynamically allocated and should be freed by an application.  If\nthe query failed for any reason, the result will be NULL, and error\nstatus will be available from \\fBdns_status\\fR(\\fIctx\\fR) routine\nas shown above.\n\n.PP\n.nf\nstruct dns_query *\n\\fBdns_submit_dn\\fR(\\fIctx\\fR,\n     const unsigned char *\\fIdn\\fR, \\fIqcls\\fR, \\fIqtyp\\fR, \\fIflags\\fR,\n     \\fIparse\\fR, \\fIcbck\\fR, \\fIdata\\fR)\nstruct dns_query *\n\\fBdns_submit_p\\fR(\\fIctx\\fR,\n     const char *\\fIname\\fR, \\fIqcls\\fR, \\fIqtyp\\fR, \\fIflags\\fR,\n     \\fIparse\\fR, \\fIcbck\\fR, \\fIdata\\fR)\n   enum dns_class \\fIqcls\\fR;\n   enum dns_type \\fIqtyp\\fR;\n   int \\fIflags\\fR;\n   dns_parse_fn *\\fIparse\\fR;\n   dns_query_fn *\\fIcbck\\fR;\n   void *\\fIdata\\fR;\n.fi\n.RS\nsubmit a query for processing for the given resolver context \\fIctx\\fR.\nTwo routines differs only in 3rd argument, which is domain name in\nDN format (\\fIdn\\fR) or asciiz string (\\fIname\\fR).  The query will be\nperformed for the given domain name, with type \\fIqtyp\\fR in class \\fIqcls\\fR,\nusing option bits in \\fIflags\\fR, using RR parsing routine pointed by\n\\fIparse\\fR if not-NULL, and upon completion, \\fIcbck\\fR function will\nbe called with the \\fIdata\\fR argument.\nIn case of successeful query submission,\nthe routine return pointer to internal query structure which may be treated\nas an identifier of the query as used by the library, and may be used as an\nargument for \\fBdns_cancel\\fR() routine.  In case of error, NULL will be\nreturned, and context error status (available using \\fIdns_status\\fR() routine)\nwill be set to corresponding error code, which in this case may be\nDNS_E_BADQUERY if the \\fIname\\fR of \\fIdn\\fR is invalid, DNS_E_NOMEM if\nthere's no memory available to allocate query structure, or DNS_E_TEMPFAIL\nif an internal error occured.\n.RE\n\n.PP\n.nf\nvoid *\\fBdns_resolve_dn\\fR(\\fIctx\\fR,\n     const unsigned char *\\fIdn\\fR, \\fIqcls\\fR, \\fIqtyp\\fR, \\fIflags\\fR, \\fIparse\\fR);\nvoid *\\fBdns_resolve_p\\fR(\\fIctx\\fR,\n     const char *\\fIname\\fR, \\fIqcls\\fR, \\fIqtyp\\fR, \\fIflags\\fR, \\fIparse\\fR)\n   enum dns_class \\fIqcls\\fR;\n   enum dns_type \\fIqtyp\\fR;\n   int \\fIflags\\fR;\n   dns_parse_fn *\\fIparse\\fR;  \n.fi\n.RS\nsyncronous interface.  The routines perform all the steps necessary to resolve\nthe given query and return the result.  If there's no positive result for any\nreason, all the routines return NULL, and set context error status (available \nusing \\fBdns_status\\fR() routine) to indicate the error code.  If the query\nwas successeful, context status code will contain either the length of the\nraw DNS reply packet if \\fIparse\\fR argument was NULL (in which case the return\nvalue is pointer to the reply DNS packet), or 0 (in which case the return value\nis the result of \\fIparse\\fR routine).  If the query successeful (return value\nis not NULL), the memory returned was dynamically allocated by the library\nand should be free()d by application after use.\n.RE\n\n.PP\n.nf\nvoid *\\fBdns_resolve\\fR(\\fIctx\\fR, struct dns_query *\\fIq\\fR)\n.fi\n.RS\nwait for the given query \\fIq\\fR, as returned by one of\n\\fBdns_submit_\\fIXXX\\fR() routines, for completion, and\nreturn the result.  The callback routine will not be called\nfor this query.  After completion, the query identifier \\fIq\\fR\nis not valid. Both \\fBdns_resolve_dn\\fR() and \\fBdns_resolve_p\\fR()\nare just wrappers around corresponding submit routines and this\n\\fBdns_resolve\\fR() routine.\n.RE\n\n.PP\n.nf\nvoid \\fBdns_cancel\\fR(\\fIctx\\fR, struct dns_query *\\fIq\\fR)\n.fi\n.RS\ncancel an active query \\fIq\\fR, without calling a callback routine.\nAfter completion, the query identifier \\fIq\\fR is not valid.\n.RE\n\n.SH \"TYPE-SPECIFIC QUERIES\"\n\n.PP\nIn addition to the generic low-level query interface, the library provides\na set of routines to perform specific queries in a type-safe manner, as\nwell as parsers for several well-known resource record types.  The library\nimplements high-level interface for A, AAAA, PTR, MX and TXT records\nand DNSBL and RHSBL functionality.  These routines returns specific types\nas result of a query, instead of raw DNS packets.  The following types\nand routines are available.\n\n.PP\n.nf\nstruct \\fBdns_rr_null\\fR {\n  char *\\fBdnsn_qname\\fR;     /* original query name */\n  char *\\fBdnsn_cname\\fR;     /* canonical name */\n  unsigned \\fBdnsn_ttl\\fR;    /* Time-To-Live (TTL) value */\n  int \\fBdnsn_nrr\\fR;         /* number of records in the set */\n};\n.fi\n.PP\nNULL RR set, used as a base for all other RR type structures.\nEvery RR structure as used by the library have four standard\nfields as in struct\\ \\fBdns_rr_null\\fR.\n\n.SS \"IN A Queries\"\n.PP\n.nf\nstruct \\fBdns_rr_a4\\fR {       /* IN A RRset */\n  char *\\fBdnsa4_qname\\fR;     /* original query name */\n  char *\\fBdnsa4_cname\\fR;     /* canonical name */\n  unsigned \\fBdnsa4_ttl\\fR;    /* Time-To-Live (TTL) value */\n  int \\fBdnsa4_nrr\\fR;         /* number of addresses in the set */\n  struct in_addr \\fBdnsa4_addr\\fR[]; /* array of addresses */\n};\ntypedef void\n  \\fBdns_query_a4_fn\\fR(\\fIctx\\fR, struct dns_rr_a4 *\\fIresult\\fR, \\fIdata\\fR)\ndns_parse_fn \\fBdns_parse_a4\\fB;\nstruct dns_query *\n\\fBdns_submit_a4\\fB(\\fIctx\\fR, const char *\\fIname\\fR, int \\fIflags\\fR,\n   dns_query_a4_fn *\\fIcbck\\fR, \\fIdata\\fR);\nstruct dns_rr_a4 *\n\\fBdns_resolve_a4\\fB(\\fIctx\\fR, const char *\\fIname\\fR, int \\fIflags\\fR);\n.fi\n.PP\nThe \\fBdns_rr_a4\\fR structure holds a result of an \\fBIN A\\fR query,\nwhich is an array of IPv4 addresses.  Callback routine for IN A queries\nexpected to be of type \\fBdns_query_a4_fn\\fR, which expects pointer to\n\\fBdns_rr_a4\\fR structure as query result instead of raw DNS packet.\nThe \\fBdns_parse_a4\\fR() is used to convert raw DNS reply packet into\n\\fBdns_rr_a4\\fR structure (it is used internally and may be used directly too\nwith generic query interface).  Routines \\fBdns_submit_a4\\fR() and\n\\fBdns_resolve_a4\\fR() are used to perform A IN queries in a type-safe\nmanner.  The \\fIname\\fR parameter is the domain name in question, and\n\\fIflags\\fR is query flags bitmask, with one bit, DNS_NOSRCH, of practical\ninterest (if the \\fIname\\fR is absolute, that is, it ends up with a dot,\nDNS_NOSRCH flag will be set automatically).\n\n.SS \"IN AAAA Queries\"\n.PP\n.nf\nstruct \\fBdns_rr_a6\\fR {       /* IN AAAA RRset */\n  char *\\fBdnsa6_qname\\fR;     /* original query name */\n  char *\\fBdnsa6_cname\\fR;     /* canonical name */\n  unsigned \\fBdnsa6_ttl\\fR;    /* Time-To-Live (TTL) value */\n  int \\fBdnsa6_nrr\\fR;         /* number of addresses in the set */\n  struct in6_addr \\fBdnsa6_addr\\fR[]; /* array of addresses */\n};\ntypedef void\n  \\fBdns_query_a6_fn\\fR(\\fIctx\\fR, struct dns_rr_a6 *\\fIresult\\fR, \\fIdata\\fR)\ndns_parse_fn \\fBdns_parse_a6\\fB;\nstruct dns_query *\n\\fBdns_submit_a6\\fB(\\fIctx\\fR, const char *\\fIname\\fR, int \\fIflags\\fR,\n   dns_query_a6_fn *\\fIcbck\\fR, \\fIdata\\fR);\nstruct dns_rr_a6 *\n\\fBdns_resolve_a6\\fB(\\fIctx\\fR, const char *\\fIname\\fR, int \\fIflags\\fR);\n.fi\n.PP\nThe \\fBdns_rr_a6\\fR structure holds a result of an \\fBIN AAAA\\fR query,\nwhich is an array of IPv6 addresses.  Callback routine for IN AAAA queries\nexpected to be of type \\fBdns_query_a6_fn\\fR, which expects pointer to\n\\fBdns_rr_a6\\fR structure as query result instead of raw DNS packet.\nThe \\fBdns_parse_a6\\fR() is used to convert raw DNS reply packet into\n\\fBdns_rr_a6\\fR structure (it is used internally and may be used directly too\nwith generic query interface).  Routines \\fBdns_submit_a6\\fR() and\n\\fBdns_resolve_a6\\fR() are used to perform AAAA IN queries in a type-safe\nmanner.  The \\fIname\\fR parameter is the domain name in question, and\n\\fIflags\\fR is query flags bitmask, with one bit, DNS_NOSRCH, of practical\ninterest (if the \\fIname\\fR is absolute, that is, it ends up with a dot,\nDNS_NOSRCH flag will be set automatically).\n\n.SS \"IN PTR Queries\"\n.PP\n.nf\nstruct \\fBdns_rr_ptr\\fR {       /* IN PTR RRset */\n  char *\\fBdnsptr_qname\\fR;     /* original query name */\n  char *\\fBdnsptr_cname\\fR;     /* canonical name */\n  unsigned \\fBdnsptr_ttl\\fR;    /* Time-To-Live (TTL) value */\n  int \\fBdnsptr_nrr\\fR;         /* number of domain name pointers */\n  char *\\fBdnsptr_ptr\\fR[];     /* array of domain name pointers */\n};\ntypedef void\n  \\fBdns_query_ptr_fn\\fR(\\fIctx\\fR, struct dns_rr_ptr *\\fIresult\\fR, \\fIdata\\fR)\ndns_parse_fn \\fBdns_parse_ptr\\fB;\nstruct dns_query *\n\\fBdns_submit_a4ptr\\fB(\\fIctx\\fR, const struct in_addr *\\fBaddr\\fR,\n   dns_query_ptr_fn *\\fIcbck\\fR, \\fIdata\\fR);\nstruct dns_rr_ptr *\n\\fBdns_resolve_a4ptr\\fB(\\fIctx\\fR, const struct in_addr *\\fBaddr\\fR);\nstruct dns_query *\n\\fBdns_submit_a6ptr\\fB(\\fIctx\\fR, const struct in6_addr *\\fBaddr\\fR,\n   dns_query_ptr_fn *\\fIcbck\\fR, \\fIdata\\fR);\nstruct dns_rr_ptr *\n\\fBdns_resolve_a6ptr\\fB(\\fIctx\\fR, const struct in6_addr *\\fBaddr\\fR);\n.fi\n.PP\nThe \\fBdns_rr_ptr\\fR structure holds a result of an IN PTR query, which\nis an array of domain name pointers for a given IPv4 or IPv6 address.\nCallback routine for IN PTR queries expected to be of type\n\\fBdns_query_ptr_fn\\fR, which expects pointer to \\fBdns_rr_ptr\\fR\nstructure as query result instead of raw DNS packet.  The \\fBdns_parse_ptr\\fR()\nis used to convert raw DNS reply packet into \\fBdns_rr_ptr\\fR structure\n(it is used internally and may be used directly too with generic query\ninterface).  Routines \\fBdns_submit_a4ptr\\fR() and \\fBdns_resolve_a4ptr\\fR()\nare used to perform IN PTR queries for IPv4 addresses in a type-safe\nmanner. Routines \\fBdns_submit_a6ptr\\fR() and \\fBdns_resolve_a6ptr\\fR()\nare used to perform IN PTR queries for IPv6 addresses.\n\n.SS \"IN MX Queries\"\n.PP\n.nf\nstruct \\fBdns_mx\\fR {          /* single MX record */\n  int \\fBpriority\\fR;          /* priority value of this MX */\n  char *\\fBname\\fR;            /* domain name of this MX */\n};\nstruct \\fBdns_rr_mx\\fR {       /* IN MX RRset */\n  char *\\fBdnsmx_qname\\fR;     /* original query name */\n  char *\\fBdnsmx_cname\\fR;     /* canonical name */\n  unsigned \\fBdnsmx_ttl\\fR;    /* Time-To-Live (TTL) value */\n  int \\fBdnsmx_nrr\\fR;         /* number of mail exchangers in the set */\n  struct dns_mx \\fBdnsmx_mx\\fR[]; /* array of mail exchangers */\n};\ntypedef void\n  \\fBdns_query_mx_fn\\fR(\\fIctx\\fR, struct dns_rr_mx *\\fIresult\\fR, \\fIdata\\fR)\ndns_parse_fn \\fBdns_parse_mx\\fB;\nstruct dns_query *\n\\fBdns_submit_mx\\fB(\\fIctx\\fR, const char *\\fIname\\fR, int \\fIflags\\fR,\n   dns_query_mx_fn *\\fIcbck\\fR, \\fIdata\\fR);\nstruct dns_rr_mx *\n\\fBdns_resolve_mx\\fB(\\fIctx\\fR, const char *\\fIname\\fR, int \\fIflags\\fR);\n.fi\n.PP\nThe \\fBdns_rr_mx\\fR structure holds a result of an IN MX query, which\nis an array of mail exchangers for a given domain.  Callback routine for IN MX\nqueries expected to be of type \\fBdns_query_mx_fn\\fR, which expects pointer to\n\\fBdns_rr_mx\\fR structure as query result instead of raw DNS packet.\nThe \\fBdns_parse_mx\\fR() is used to convert raw DNS reply packet into\n\\fBdns_rr_mx\\fR structure (it is used internally and may be used directly too\nwith generic query interface).  Routines \\fBdns_submit_mx\\fR() and\n\\fBdns_resolve_mx\\fR() are used to perform IN MX queries in a type-safe\nmanner.  The \\fIname\\fR parameter is the domain name in question, and\n\\fIflags\\fR is query flags bitmask, with one bit, DNS_NOSRCH, of practical\ninterest (if the \\fIname\\fR is absolute, that is, it ends up with a dot,\nDNS_NOSRCH flag will be set automatically).\n\n.SS \"TXT Queries\"\n.PP\n.nf\nstruct \\fBdns_txt\\fR {          /* single TXT record */\n  int \\fBlen\\fR;                /* length of the text */\n  unsigned char *\\fBtxt\\fR;     /* pointer to the text */\n};\nstruct \\fBdns_rr_txt\\fR {       /* TXT RRset */\n  char *\\fBdnstxt_qname\\fR;     /* original query name */\n  char *\\fBdnstxt_cname\\fR;     /* canonical name */\n  unsigned \\fBdnstxt_ttl\\fR;    /* Time-To-Live (TTL) value */\n  int \\fBdnstxt_nrr\\fR;         /* number of text records in the set */\n  struct dns_txt \\fBdnstxt_txt\\fR[]; /* array of TXT records */\n};\ntypedef void\n  \\fBdns_query_txt_fn\\fR(\\fIctx\\fR, struct dns_rr_txt *\\fIresult\\fR, \\fIdata\\fR)\ndns_parse_fn \\fBdns_parse_txt\\fB;\nstruct dns_query *\n\\fBdns_submit_txt\\fB(\\fIctx\\fR, const char *\\fIname\\fR, enum dns_class \\fIqcls\\fR,\n   int \\fIflags\\fR, dns_query_txt_fn *\\fIcbck\\fR, \\fIdata\\fR);\nstruct dns_rr_txt *\n\\fBdns_resolve_txt\\fB(\\fIctx\\fR, const char *\\fIname\\fR,\n             enum dns_class \\fIqcls\\fR, int \\fIflags\\fR);\n.fi\n.PP\nThe \\fBdns_rr_txt\\fR structure holds a result of a TXT query, which is an\narray of text records for a given domain name.  Callback routine for TXT\nqueries expected to be of type \\fBdns_query_txt_fn\\fR, which expects pointer\nto \\fBdns_rr_txt\\fR structure as query result instead of raw DNS packet.\nThe \\fBdns_parse_txt\\fR() is used to convert raw DNS reply packet into\n\\fBdns_rr_txt\\fR structure (it is used internally and may be used directly too\nwith generic query interface).  Routines \\fBdns_submit_txt\\fR() and\n\\fBdns_resolve_txt\\fR() are used to perform IN MX queries in a type-safe\nmanner.  The \\fIname\\fR parameter is the domain name in question, and\n\\fIflags\\fR is query flags bitmask, with one bit, DNS_NOSRCH, of practical\ninterest (if the \\fIname\\fR is absolute, that is, it ends up with a dot,\nDNS_NOSRCH flag will be set automatically).  Note that each TXT string\nis represented by \\fBstruct\\ dns_txt\\fR, while zero-terminated (and the\nlen field of the structure does not include the terminator), may contain\nembedded null characters -- content of TXT records is not interpreted\nby the library in any way.\n\n.SS \"SRV Queries\"\n.PP\n.nf\nstruct \\fBdns_srv\\fR {          /* single SRV record */\n  int \\fBpriority\\fR;           /* priority of the record */\n  int \\fBweight\\fR;             /* weight of the record */\n  int \\fBport\\fR;               /* the port number to connect to */\n  char *\\fBname\\fR;             /* target host name */\n};\nstruct \\fBdns_rr_srv\\fR {       /* SRV RRset */\n  char *\\fBdnssrv_qname\\fR;     /* original query name */\n  char *\\fBdnssrv_cname\\fR;     /* canonical name */\n  unsigned \\fBdnssrv_ttl\\fR;    /* Time-To-Live (TTL) value */\n  int \\fBdnssrv_nrr\\fR;         /* number of text records in the set */\n  struct dns_srv \\fBdnssrv_srv\\fR[]; /* array of SRV records */\n};\ntypedef void\n  \\fBdns_query_srv_fn\\fR(\\fIctx\\fR, struct dns_rr_srv *\\fIresult\\fR, \\fIdata\\fR)\ndns_parse_fn \\fBdns_parse_srv\\fB;\nstruct dns_query *\n\\fBdns_submit_srv\\fB(\\fIctx\\fR, const char *\\fIname\\fR, const char *\\fIservice\\fR, const char *\\fIprotocol\\fR,\n   int \\fIflags\\fR, dns_query_txt_fn *\\fIcbck\\fR, \\fIdata\\fR);\nstruct dns_rr_srv *\n\\fBdns_resolve_srv\\fB(\\fIctx\\fR, const char *\\fIname\\fR, const char *\\fIservice\\fR, const char *\\fIprotocol\\fR,\n             int \\fIflags\\fR);\n.fi\n.PP\nThe \\fBdns_rr_srv\\fR structure holds a result of an IN SRV (rfc2782) query,\nwhich is an array of servers (together with port numbers) which are performing\noperations for a given \\fIservice\\fR using given \\fIprotocol\\fR on a target\ndomain \\fIname\\fR.  Callback routine for IN SRV queries expected to be of type\n\\fBdns_query_srv_fn\\fR, which expects pointer to \\fBdns_rr_srv\\fR structure as\nquery result instead of raw DNS packet.  The \\fBdns_parse_srv\\fR() is used to\nconvert raw DNS reply packet into \\fBdns_rr_srv\\fR structure (it is used\ninternally and may be used directly too with generic query interface).\nRoutines \\fBdns_submit_srv\\fR() and \\fBdns_resolve_srv\\fR() are used to\nperform IN SRV queries in a type-safe manner.  The \\fIname\\fR parameter\nis the domain name in question, \\fIservice\\fR and \\fRprotocl\\fR specifies the\nservice and the protocol in question (the library will construct query DN\naccording to rfc2782 rules) and may be NULL (in this case the library\nassumes \\fIname\\fR parameter holds the complete SRV query), and\n\\fIflags\\fR is query flags bitmask, with one bit, DNS_NOSRCH, of practical\ninterest (if the \\fIname\\fR is absolute, that is, it ends up with a dot,\nDNS_NOSRCH flag will be set automatically).\n\n.SS \"NAPTR Queries\"\n.PP\n.nf\nstruct \\fBdns_naptr\\fR {        /* single NAPTR record */\n  int \\fBorder\\fR;              /* record order */\n  int \\fBpreference\\fR;         /* preference of this record */\n  char *\\fBflags\\fR;            /* application-specific flags */\n  char *\\fBservice\\fR;          /* service parameter */\n  char *\\fBregexp\\fR;           /* substitutional regular expression */\n  char *\\fBreplacement\\fR;      /* replacement string */\n};\nstruct \\fBdns_rr_naptr\\fR {     /* NAPTR RRset */\n  char *\\fBdnsnaptr_qname\\fR;   /* original query name */\n  char *\\fBdnsnaptr_cname\\fR;   /* canonical name */\n  unsigned \\fBdnsnaptr_ttl\\fR;  /* Time-To-Live (TTL) value */\n  int \\fBdnsnaptr_nrr\\fR;       /* number of text records in the set */\n  struct dns_naptr \\fBdnsnaptr_naptr\\fR[]; /* array of NAPTR records */\n};\ntypedef void\n  \\fBdns_query_naptr_fn\\fR(\\fIctx\\fR, struct dns_rr_naptr *\\fIresult\\fR, \\fIdata\\fR)\ndns_parse_fn \\fBdns_parse_naptr\\fB;\nstruct dns_query *\n\\fBdns_submit_naptr\\fB(\\fIctx\\fR, const char *\\fIname\\fR, int \\fIflags\\fR,\n   dns_query_txt_fn *\\fIcbck\\fR, \\fIdata\\fR);\nstruct dns_rr_naptr *\n\\fBdns_resolve_naptr\\fB(\\fIctx\\fR, const char *\\fIname\\fR, int \\fIflags\\fR);\n.fi\n.PP\nThe \\fBdns_rr_naptr\\fR structure holds a result of an IN NAPTR (rfc3403) query.\nCallback routine for IN NAPTR queries expected to be of type\n\\fBdns_query_naptr_fn\\fR, expects pointer to \\fBdns_rr_naptr\\fR\nstructure as query result instead of raw DNS packet.\nThe \\fBdns_parse_naptr\\fR() is used to convert raw DNS reply packet into\n\\fBdns_rr_naptr\\fR structure (it is used\ninternally and may be used directly too with generic query interface).\nRoutines \\fBdns_submit_naptr\\fR() and \\fBdns_resolve_naptr\\fR() are used to\nperform IN NAPTR queries in a type-safe manner.  The \\fIname\\fR parameter\nis the domain name in question, and \\fIflags\\fR is query flags bitmask,\nwith one bit, DNS_NOSRCH, of practical interest (if the \\fIname\\fR is\nabsolute, that is, it ends up with a dot, DNS_NOSRCH flag will be set\nautomatically).\n\n.SS \"DNSBL Interface\"\n.PP\nA DNS-based blocklists, or a DNSBLs, are in wide use nowadays, especially\nto protect mailservers from spammers.  The library provides DNSBL interface,\na set of routines to perform queries against DNSBLs.  Routines accepts an\nIP address (IPv4 and IPv6 are both supported) and a base DNSBL zone as\nquery parameters, and returns either \\fBdns_rr_a4\\fR or \\fBdns_rr_txt\\fR\nstructure.  Note that IPv6 interface return IPv4 RRset.\n.PP\n.nf\nstruct dns_query *\n\\fBdns_submit_a4dnsbl\\fR(\\fIctx\\fR,\n  const struct in_addr *\\fIaddr\\fR, const char *\\fIdnsbl\\fR,\n  dns_query_a4_fn *\\fIcbck\\fR, void *\\fIdata\\fR);\nstruct dns_query *\n\\fBdns_submit_a4dnsbl_txt\\fR(\\fIctx\\fR,\n  const struct in_addr *\\fIaddr\\fR, const char *\\fIdnsbl\\fR,\n  dns_query_txt_fn *\\fIcbck\\fR, void *\\fIdata\\fR);\nstruct dns_query *\n\\fBdns_submit_a6dnsbl\\fR(\\fIctx\\fR,\n  const struct in6_addr *\\fIaddr\\fR, const char *\\fIdnsbl\\fR,\n  dns_query_a4_fn *\\fIcbck\\fR, void *\\fIdata\\fR);\nstruct dns_query *\n\\fBdns_submit_a6dnsbl_txt\\fR(\\fIctx\\fR,\n  const struct in6_addr *\\fIaddr\\fR, const char *\\fIdnsbl\\fR,\n  dns_query_txt_fn *\\fIcbck\\fR, void *\\fIdata\\fR);\nstruct dns_rr_a4 *\\fBdns_resolve_a4dnsbl\\fR(\\fIctx\\fR,\n  const struct in_addr *\\fIaddr\\fR, const char *\\fIdnsbl\\fR)\nstruct dns_rr_txt *\\fBdns_resolve_a4dnsbl_txt\\fR(\\fIctx\\fR,\n  const struct in_addr *\\fIaddr\\fR, const char *\\fIdnsbl\\fR)\nstruct dns_rr_a4 *\\fBdns_resolve_a6dnsbl\\fR(\\fIctx\\fR,\n  const struct in6_addr *\\fIaddr\\fR, const char *\\fIdnsbl\\fR)\nstruct dns_rr_txt *\\fBdns_resolve_a6dnsbl_txt\\fR(\\fIctx\\fR,\n  const struct in6_addr *\\fIaddr\\fR, const char *\\fIdnsbl\\fR)\n.fi\nPerform (submit or resolve) a DNSBL query for the given \\fIdnsbl\\fR\ndomain and an IP \\fIaddr\\fR in question, requesting either A or TXT\nrecords.\n\n.SS \"RHSBL Interface\"\n.PP\nRHSBL is similar to DNSBL, but instead of an IP address, the\nparameter is a domain name.\n.PP\n.nf\nstruct dns_query *\n\\fBdns_submit_rhsbl\\fR(\\fIctx\\fR, const char *\\fIname\\fR, const char *\\fIrhsbl\\fR,\n  dns_query_a4_fn *\\fIcbck\\fR, void *\\fIdata\\fR);\nstruct dns_query *\n\\fBdns_submit_rhsbl_txt\\fR(\\fIctx\\fR, const char *\\fIname\\fR, const char *\\fIrhsbl\\fR,\n  dns_query_txt_fn *\\fIcbck\\fR, void *\\fIdata\\fR);\nstruct dns_rr_a4 *\n\\fBdns_resolve_rhsbl\\fR(\\fIctx\\fR, const char *\\fIname\\fR, const char *\\fIrhsbl\\fR);\nstruct dns_rr_txt *\n\\fBdns_resolve_rhsbl_txt\\fR(\\fIctx\\fR, const char *\\fIname\\fR, const char *\\fIrhsbl\\fR);\n.fi\nPerform (submit or resolve) a RHSBL query for the given \\fIrhsbl\\fR\ndomain and \\fIname\\fR in question, requesting either A or TXT records.\n\n\n.SH \"LOW-LEVEL INTERFACE\"\n\n.SS \"Domain Names (DNs)\"\n\n.PP\nA DN is a series of domain name labels each starts with length byte,\nfollowed by empty label (label with zero length).  The following\nroutines to work with DNs are provided.\n\n.PP\n.nf\nunsigned \\fBdns_dnlen\\fR(const unsigned char *\\fIdn\\fR)\n.fi\n.RS\nreturn length of the domain name \\fIdn\\fR, including the terminating label.\n.RE\n\n.PP\n.nf\nunsigned \\fBdns_dnlabels\\fR(const unsigned char *\\fIdn\\fR)\n.fi\n.RS\nreturn number of non-zero labels in domain name \\fIdn\\fR.\n.RE\n\n.PP\n.nf\nunsigned \\fBdns_dnequal\\fR(\\fIdn1\\fR, \\fIdn2\\fR)\n  const unsigned char *\\fIdn1\\fR, *\\fIdn2\\fR;\n.fi\n.RS\ntest whenever the two domain names, \\fIdn1\\fR and \\fIdn2\\fR, are\nequal (case-insensitive).  Return domain name length if equal\nor 0 if not.\n.RE\n\n.PP\n.nf\nunsigned \\fBdns_dntodn\\fR(\\fIsdn\\fR, \\fIddn\\fR, \\fIdnsiz\\fR)\n  const unsigned char *\\fIsdn\\fR;\n  unsigned char *\\fIddn\\fR;\n  unsigned \\fIdnsiz\\fR;\n.fi\n.RS\ncopies the source domain name \\fIsdn\\fR to destination buffer \\fIddn\\fR\nof size \\fIdnsiz\\fR.  Return domain name length or 0 if \\fIddn\\fR is\ntoo small.\n.RE\n\n.PP\n.nf\nint \\fBdns_ptodn\\fR(\\fIname\\fR, \\fInamelen\\fR, \\fIdn\\fR, \\fIdnsiz\\fR, \\fIisabs\\fR)\nint \\fBdns_sptodn\\fR(\\fIname\\fR, \\fIdn\\fR, \\fIdnsiz\\fR)\n  const char *\\fIname\\fR; unsigned \\fInamelen\\fR;\n  unsigned char *\\fIdn\\fR; unsigned \\fIdnsiz\\fR;\n  int *\\fIisabs\\fR;\n.fi\n.RS\nconvert asciiz name \\fIname\\fR of length \\fInamelen\\fR to DN format,\nplacing result into buffer \\fIdn\\fR of size \\fIdnsiz\\fR.  Return\nlength of the DN if successeful, 0 if the \\fIdn\\fR buffer supplied is\ntoo small, or negative value if \\fIname\\fR is invalid.  If \\fIisabs\\fR\nis non-NULL and conversion was successeful, *\\fIisabs\\fR will be set to\neither 1 or 0 depending whenever \\fIname\\fR was absolute (i.e. ending with\na dot) or not.  Name length, \\fInamelength\\fR, may be zero, in which case\nstrlen(\\fIname\\fR) will be used.  Second form, \\fBdns_sptodn\\fR(), is a\nsimplified form of \\fBdns_ptodn\\fR(), equivalent to\n.br\n.nf\n\\fBdns_ptodn\\fR(\\fIname\\fR, 0, \\fIdn\\fR, \\fIdnlen\\fR, 0).\n.fi\n.RE\n\n.PP\n.nf\nextern const unsigned char \\fBdns_inaddr_arpa_dn\\fR[]\nint \\fBdns_a4todn\\fR(const struct in_addr *\\fIaddr\\fR, const unsigned char *\\fItdn\\fR,\n      unsigned char *\\fIdn\\fR, unsigned \\fIdnsiz\\fR)\nint \\fBdns_a4ptodn\\fR(const struct in_addr *\\fIaddr\\fR, const char *\\fItname\\fR,\n      unsigned char *\\fIdn\\fR, unsigned \\fIdnsiz\\fR)\nextern const unsigned char \\fBdns_ip6_arpa_dn\\fR[]\nint \\fBdns_a6todn\\fR(const struct in6_addr *\\fIaddr\\fR, const unsigned char *\\fItdn\\fR,\n      unsigned char *\\fIdn\\fR, unsigned \\fIdnsiz\\fR)\nint \\fBdns_a6ptodn\\fR(const struct in6_addr *\\fIaddr\\fR, const char *\\fItname\\fR,\n      unsigned char *\\fIdn\\fR, unsigned \\fIdnsiz\\fR)\n.fi\n.RS\nseveral variants of routines to convert IPv4 and IPv6 address \\fIaddr\\fR\ninto reverseDNS-like domain name in DN format, storing result in \\fIdn\\fR\nof size \\fIdnsiz\\fR.  \\fItdn\\fR (or \\fItname\\fR) is the base zone name,\nlike in-addr.arpa for IPv4 or in6.arpa for IPv6.  If \\fItdn\\fR (or \\fItname\\fR)\nis NULL, \\fBdns_inaddr_arpa_dn\\fR (or \\fBdns_ip6_arpa_dn\\fR) will be used.\nThe routines may be used to construct a DN for a DNSBL lookup for example.\nAll routines return length of the resulting DN on success, -1 if resulting\nDN is invalid, or 0 if the \\fIdn\\fR buffer (\\fIdnsiz\\fR) is too small.\nTo hold standard rDNS DN, a buffer of size \\fBDNS_A4RSIZE\\fR (30 bytes) for\nIPv4 address, or \\fBDNS_A6RSIZE\\fR (74 bytes) for IPv6 address, is sufficient.\n.RE\n\n.PP\n.nf\nint \\fBdns_dntop\\fR(\\fIdn\\fR, \\fIname\\fR, \\fInamesiz\\fR)\n   const unsigned char *\\fIdn\\fR;\n   const char *\\fIname\\fR; unsigned \\fInamesiz\\fR;\n.fi\n.RS\nconvert domain name \\fIdn\\fR in DN format to asciiz string, placing result\ninto \\fIname\\fR buffer of size \\fInamesiz\\fR.  Maximum length of asciiz\nrepresentation of domain name is \\fBDNS_MAXNAME\\fR (1024) bytes.  Root\ndomain is represented as empty string.  Return length of the resulting name\n(including terminating character, i.e. strlen(name)+1) on success, 0 if the\n\\fIname\\fR buffer is too small, or negative value if \\fIdn\\fR is invalid\n(last case should never happen since all routines in this library which\nproduce domain names ensure the DNs generated are valid).\n.RE\n\n.PP\n.nf\nconst char *\\fBdns_dntosp\\fR(const unsigned char *\\fIdn\\fR)\n.fi\n.RS\nconvert domain name \\fIdn\\fR in DN format to asciiz string using static\nbuffer.  Return the resulting asciiz string on success or NULL on failure.\nNote since this routine uses static buffer, it is not thread-safe.\n.RE\n\n.PP\n.nf\nunsigned \\fBdns_dntop_size\\fR(const unsigned char *\\fIdn\\fR)\n.fi\n.RS\nreturn the buffer size needed to convert the \\fIdn\\fR domain name\nin DN format to asciiz string, for \\fBdns_dntop\\fR().  The routine\nreturn either the size of buffer required, including the trailing\nzero byte, or 0 if \\fIdn\\fR is invalid.\n.RE\n\n.SS \"Working with DNS Packets\"\n\n.PP\nThe following routines are provided to encode and decode DNS on-wire\npackets.  This is low-level interface.\n\n.PP\nDNS response codes (returned by \\fBdns_rcode\\fR() routine) are\ndefined as constants prefixed with \\fBDNS_R_\\fR.  See udns.h\nheader file for the complete list.  In particular, constants\n\\fBDNS_R_NOERROR\\fR (0), \\fBDNS_R_SERVFAIL\\fR, \\fBDNS_R_NXDOMAIN\\fR\nmay be of interest to an application.\n\n.PP\n.nf\nunsigned \\fBdns_get16\\fR(const unsigned char *\\fIp\\fR)\nunsigned \\fBdns_get32\\fR(const unsigned char *\\fIp\\fR)\n.fi\n.RS\nhelper routines, convert 16-bit or 32-bit integer in on-wire\nformat pointed to by \\fIp\\fR to unsigned.\n.RE\n\n.PP\n.nf\nunsigned char *\\fBdns_put16\\fR(unsigned char *\\fId\\fR, unsigned \\fIn\\fR)\nunsigned char *\\fBdns_put32\\fR(unsigned char *\\fId\\fR, unsigned \\fIn\\fR)\n.fi\n.RS\nhelper routine, convert unsigned 16-bit or 32-bit integer \\fIn\\fR to\non-wire format to buffer pointed to by \\fId\\fR, return \\fId\\fR+2 or\n\\fId\\fR+4.\n.RE\n\n.PP\n.nf\n\\fBDNS_HSIZE\\fR (12)\n.fi\n.RS\ndefines size of DNS header.  Data section\nin the DNS packet immediately follows the header.  In the header,\nthere are query identifier (id), various flags and codes,\nand number of resource records in various data sections.\nSee udns.h header file for complete list of DNS header definitions.\n.RE\n\n.PP\n.nf\nunsigned \\fBdns_qid\\fR(const unsigned char *\\fIpkt\\fR)\nint \\fBdns_rd\\fR(const unsigned char *\\fIpkt\\fR)\nint \\fBdns_tc\\fR(const unsigned char *\\fIpkt\\fR)\nint \\fBdns_aa\\fR(const unsigned char *\\fIpkt\\fR)\nint \\fBdns_qr\\fR(const unsigned char *\\fIpkt\\fR)\nint \\fBdns_ra\\fR(const unsigned char *\\fIpkt\\fR)\nunsigned \\fBdns_opcode\\fR(const unsigned char *\\fIpkt\\fR)\nunsigned \\fBdns_rcode\\fR(const unsigned char *\\fIpkt\\fR)\nunsigned \\fBdns_numqd\\fR(const unsigned char *\\fIpkt\\fR)\nunsigned \\fBdns_numan\\fR(const unsigned char *\\fIpkt\\fR)\nunsigned \\fBdns_numns\\fR(const unsigned char *\\fIpkt\\fR)\nunsigned \\fBdns_numar\\fR(const unsigned char *\\fIpkt\\fR)\nconst unsigned char *\\fBdns_payload\\fR(const unsigned char *\\fIpkt\\fR)\n.fi\n.RS\nreturn various parts from the DNS packet header \\fIpkt\\fR:\nquery identifier (qid),\nrecursion desired (rd) flag,\ntruncation occured (tc) flag,\nauthoritative answer (aa) flag,\nquery response (qr) flag,\nrecursion available (ra) flag,\noperation code (opcode),\nresult code (rcode),\nnumber of entries in question section (numqd),\nnumber of answers (numan),\nnumber of authority records (numns),\nnumber of additional records (numar),\nand the pointer to the packet data (payload).\n.RE\n\n.PP\n.nf\nint \\fBdns_getdn\\fR(\\fIpkt\\fR, \\fIcurp\\fR, \\fIpkte\\fR, \\fIdn\\fR, \\fIdnsiz\\fR)\nconst unsigned char *\\fBdns_skipdn\\fR(\\fIcur\\fR, \\fIpkte\\fR)\n   const unsigned char *\\fIpkt\\fR, *\\fIpkte\\fR, **\\fIcurp\\fR, *\\fIcur\\fR;\n   unsigned char *\\fIdn\\fR; unsigned \\fIdnsiz\\fR;\n.fi\n.RS\n\\fBdns_getdn\\fR() extract DN from DNS packet \\fIpkt\\fR which ends before\n\\fIpkte\\fR starting at position *\\fIcurp\\fR into buffer pointed to by\n\\fIdn\\fR of size \\fIdnsiz\\fR.  Upon successeful completion, *\\fIcurp\\fR\nwill point to the next byte in the packet after the extracted domain name.\nIt return positive number (length of the DN if \\fIdn\\fR) upon successeful\ncompletion, negative value on error (when the packet contains invalid data),\nor zero if the \\fIdnsiz\\fR is too small (maximum length of a domain name is\n\\fBDNS_MAXDN\\fR).  \\fBdns_skipdn\\fR() return pointer to the next byte in\nDNS packet which ends up before \\fIpkte\\fR after a domain name which starts\nat the \\fIcur\\fP byte, or NULL if the packet is invalid.  \\fBdns_skipdn\\fR()\nis more or less equivalent to what \\fBdns_getdn\\fR() does, except it does not\nactually extract the domain name in question, and uses simpler interface.\n.RE\n\n.PP\n.nf\nstruct \\fBdns_rr\\fR {\n  unsigned char \\fBdnsrr_dn\\fR[DNS_MAXDN]; /* the RR DN name */\n  enum dns_class \\fBdnsrr_cls\\fR;          /* class of the RR */\n  enum dns_type  \\fBdnsrr_typ\\fR;          /* type of the RR */\n  unsigned \\fBdnsrr_ttl\\fR;                /* TTL value */\n  unsigned \\fBdnsrr_dsz\\fR;                /* size of data in bytes */\n  const unsigned char *\\fBdnsrr_dptr\\fR;   /* pointer to the first data byte */\n  const unsigned char *\\fBdnsrr_dend\\fR;   /* next byte after RR */\n};\n.fi\n.RS\nThe \\fBdns_rr\\fR structure is used to hold information about\nsingle DNS Resource Record (RR) in an easy to use form.\n.RE\n\n.PP\n.nf\nstruct \\fBdns_parse\\fR {\n  const unsigned char *\\fBdnsp_pkt\\fR; /* pointer to the packet being parsed */\n  const unsigned char *\\fBdnsp_end\\fR; /* end of the packet pointer */\n  const unsigned char *\\fBdnsp_cur\\fR; /* current packet positionn */\n  const unsigned char *\\fBdnsp_ans\\fR; /* pointer to the answer section */\n  int \\fBdnsp_rrl\\fR;                  /* number of RRs left */\n  int \\fBdnsp_nrr\\fR;                  /* number of relevant RRs seen so far */\n  unsigned \\fBdnsp_ttl\\fR;             /* TTL value so far */\n  const unsigned char *\\fBdnsp_qdn\\fR; /* the domain of interest or NULL */\n  enum dns_class \\fBdnsp_qcls\\fR;      /* class of interest or 0 for any */\n  enum dns_type  \\fBdnsp_qtyp\\fR;      /* type of interest or 0 for any */\n  unsigned char \\fBdnsp_dnbuf\\fR[DNS_MAXDN]; /* domain name buffer */\n};\n.fi\n.RS\nThe \\fBdns_parse\\fR structure is used to parse DNS reply packet.\nIt holds information about the packet being parsed (dnsp_pkt, dnsp_end and\ndnsp_cur fields), number of RRs in the current section left to do, and\nthe information about specific RR which we're looking for (dnsp_qdn,\ndnsp_qcls and dnsp_qtyp fields).\n.RE\n\n.PP\n.nf\nint \\fBdns_initparse\\fR(struct dns_parse *\\fIp\\fR,\n  const unsigned char *\\fIqdn\\fR,\n  const unsigned char *\\fIpkt\\fR,\n  const unsigned char *\\fIcur\\fR,\n  const unsigned char *\\fIend\\fR)\n.fi\n.RS\ninitializes the RR parsing structure \\fIp\\fR.  Arguments \\fIpkt\\fR, \\fIcur\\fR\nand \\fIend\\fR should describe the received packet: \\fIpkt\\fR is the start of\nthe packet, \\fIend\\fR points to the next byte after the end of the packet,\nand \\fIcur\\fR points past the query DN in query section (to query class+type\ninformation).  And \\fIqdn\\fR points to the query DN.  This is the arguments\npassed to \\fBdns_parse_fn\\fR() routine. \\fBdns_initparse\\fR() initializes\n\\fBdnsp_pkt\\fR, \\fBdnsp_end\\fR and \\fBdnsp_qdn\\fR fields to the corresponding\narguments, extracts and initializes \\fBdnsp_qcls\\fR and \\fBdnsp_qtyp\\fR\nfields to the values found at \\fIcur\\fR pointer, initializes\n\\fBdnsp_cur\\fR and \\fBdnsp_ans\\fR fields to be \\fIcur\\fR+4 (to the start of\nanswer section), and initializes \\fBdnsp_rrl\\fR field to be number of entries\nin answer section. \\fBdnsp_ttl\\fR will be set to max TTL value, 0xffffffff,\nand \\fBdnsp_nrr\\fR to 0.\n.RE\n\n.PP\n.nf\nint \\fBdns_nextrr\\fR(struct dns_parse *\\fIp\\fR, struct dns_rr *\\fIrr\\fR);\n.fi\n.RS\nsearches for next RR in the packet based on the criteria provided in\nthe \\fIp\\fR structure, filling in the \\fIrr\\fR structure and\nadvancing \\fIp\\fR->\\fBdnsp_cur\\fR to the next RR in the packet.\nRR selection is based on dnsp_qdn, dnsp_qcls and dnsp_qtyp fields in\nthe dns_parse structure.  Any (or all) of the 3 fields may be 0,\nwhich means any actual value from the packet is acceptable.  In case\nthe field isn't 0 (or NULL for dnsp_qdn), only RRs with corresponding\ncharacteristics are acceptable.  Additionally, when dnsp_qdn is non-NULL,\n\\fBdns_nextrr\\fR() performs automatic CNAME expansion.\nRoutine will return positive value on success, 0 in case it reached the end\nof current section in the packet (\\fIp\\fR->\\fBdnsp_rrl\\fR is zero), or\nnegative value if next RR can not be decoded (packet format is invalid).\nThe routine updates \\fIp\\fR->\\fBdnsp_qdn\\fR automatically when this\nfield is non-NULL and it encounters appropriate CNAME RRs (saving CNAME\ntarget in \\fIp\\fR->\\fBdnsp_dnbuf\\fR), so after end of the process,\n\\fIp\\fR->\\fBdnsp_qdn\\fR will point to canonical name of the domain\nin question.  The routine updates \\fIp\\fR->\\fBdnsp_ttl\\fR value to\nbe the minimum TTL of all RRs found.\n.RE\n\n.PP\n.nf\nvoid \\fBdns_rewind\\fR(struct dns_parse *\\fIp\\fR, const unsigned char *\\fIqdn\\fR)\n.fi\n.RS\nthis routine \"rewinds\" the packet parse state structure to be at the\nsame state as after a call to \\fBdns_initparse\\fR(), i.e. reposition\nthe parse structure \\fIp\\fR to the start of answer section and\ninitialize \\fIp\\fR->\\fBdnsp_rrl\\fR to the number of entries in\nanswer section.\n.RE\n\n.PP\n.nf\nint \\fBdns_stdrr_size\\fR(const struct dns_parse *\\fIp\\fR);\n.fi\n.RS\nreturn size to hold standard RRset structure information, as shown\nin \\fBdns_rr_null\\fR structure (for the query and canonical\nnames).  Used to calculate amount of memory to allocate for common\npart of type-specific RR structures in parsing routines.\n.RE\n\n.PP\n.nf\nvoid *\\fBdns_stdrr_finish\\fR(struct dns_rr_null *\\fIret\\fR, char *\\fIcp\\fR,\n  const struct dns_parse *\\fIp\\fR);\n.fi\n.RS\ninitializes standard RRset fields in \\fIret\\fR structure using buffer\npointed to by \\fIcp\\fR, which should have at least as many bytes\nas \\fBdns_stdrr_size\\fR(\\fIp\\fR) returned.  Used to finalize common\npart of type-specific RR structures in parsing routines.\n.RE\n\n.PP\nSee library source for usage examples of all the above low-level routines,\nespecially source of the parsing routines.\n\n.SS \"Auxilary Routines\"\n\n.PP\n.nf\nint \\fBdns_pton\\fR(int \\fIaf\\fR, const char *\\fIsrc\\fR, void *\\fIdst\\fR);\n.fi\n.RS\nprivides functionality similar to standard \\fBinet_pton\\fR() routine,\nto convert printable representation of an IP address of family \\fIaf\\fR\n(either \\fBAF_INET\\fR or \\fBAF_INET6\\fR) pointed to by \\fIsrc\\fR into\nbinary form suitable for socket addresses and transmission over network,\nin buffer pointed to by \\fIdst\\fR.  The destination buffer should be\nof size 4 for \\fBAF_INET\\fR family or 16 for \\fBAF_INET6\\fR.\nThe return value is positive on success, 0 if \\fIsrc\\fR is not a valid text\nrepresentation of an address of family \\fIaf\\fR, or negative if the\ngiven address family is not supported.\n.RE\n\n.PP\n.nf\nconst char *\\fBdns_ntop\\fR(int \\fIaf\\fR, const void *\\fIsrc\\fR,\n    char *\\fIdst\\fR, int \\fIdstsize\\fR)\n.fi\n.RS\nprivides functionality similar to standard \\fBinet_ntop\\fR() routine,\nto convert binary representation of an IP address of family \\fIaf\\fR\n(either \\fBAF_INET\\fR or \\fBAF_INET6\\fR) pointed to by \\fIsrc\\fR\n(either 4 or 16 bytes) into printable form in buffer in buffer pointed\nto by \\fIdst\\fR of size \\fIdstsize\\fR.  The destination buffer should be\nat least of size 16 bytes for \\fBAF_INET\\fR family or 46 bytes for\n\\fBAF_INET6\\fR.  The return value is either \\fIdst\\fR, or NULL pointer\nif \\fIdstsize\\fR is too small to hold this address or if the given\naddress family is not supported.\n.RE\n\n.SH AUTHOR\n.PP\nThe \\fBudns\\fR library has been written by Michael Tokarev, mjt+udns@tls.msk.ru.\n\n.SH VERSION\n.PP\nThis manual page corresponds to udns version 0.4, released Jan-2014.\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns.h",
    "content": "/* udns.h\n   header file for the UDNS library.\n\n   Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n */\n\n#ifndef UDNS_VERSION\t/* include guard */\n\n#define UDNS_VERSION \"0.4\"\n\n#ifdef __MINGW32__\n# ifdef UDNS_DYNAMIC_LIBRARY\n#  ifdef DNS_LIBRARY_BUILD\n#   define UDNS_API __declspec(dllexport)\n#   define UDNS_DATA_API __declspec(dllexport)\n#  else\n#   define UDNS_API __declspec(dllimport)\n#   define UDNS_DATA_API __declspec(dllimport)\n#  endif\n# endif\n#endif\n\n#ifndef UDNS_API\n# define UDNS_API\n#endif\n#ifndef UDNS_DATA_API\n# define UDNS_DATA_API\n#endif\n\n#include <sys/types.h>\t\t/* for time_t */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* forward declarations if sockets stuff isn't #include'd */\nstruct in_addr;\nstruct in6_addr;\nstruct sockaddr;\n\n/**************************************************************************/\n/**************** Common definitions **************************************/\n\nUDNS_API const char *\ndns_version(void);\n\nstruct dns_ctx;\nstruct dns_query;\n\n/* shorthand for [const] unsigned char */\ntypedef unsigned char dnsc_t;\ntypedef const unsigned char dnscc_t;\n\n#define DNS_MAXDN\t255\t/* max DN length */\n#define DNS_DNPAD\t1\t/* padding for DN buffers */\n#define DNS_MAXLABEL\t63\t/* max DN label length */\n#define DNS_MAXNAME\t1024\t/* max asciiz domain name length */\n#define DNS_HSIZE\t12\t/* DNS packet header size */\n#define DNS_PORT\t53\t/* default domain port */\n#define DNS_MAXSERV\t6\t/* max servers to consult */\n#define DNS_MAXPACKET\t512\t/* max traditional-DNS UDP packet size */\n#define DNS_EDNS0PACKET\t4096\t/* EDNS0 packet size to use */\n\nenum dns_class {\t/* DNS RR Classes */\n  DNS_C_INVALID\t= 0,\t/* invalid class */\n  DNS_C_IN\t= 1,\t/* Internet */\n  DNS_C_CH\t= 3,\t/* CHAOS */\n  DNS_C_HS\t= 4,\t/* HESIOD */\n  DNS_C_ANY\t= 255\t/* wildcard */\n};\n\nenum dns_type {\t\t/* DNS RR Types */\n  DNS_T_INVALID\t\t= 0,\t/* Cookie. */\n  DNS_T_A\t\t= 1,\t/* Host address. */\n  DNS_T_NS\t\t= 2,\t/* Authoritative server. */\n  DNS_T_MD\t\t= 3,\t/* Mail destination. */\n  DNS_T_MF\t\t= 4,\t/* Mail forwarder. */\n  DNS_T_CNAME\t\t= 5,\t/* Canonical name. */\n  DNS_T_SOA\t\t= 6,\t/* Start of authority zone. */\n  DNS_T_MB\t\t= 7,\t/* Mailbox domain name. */\n  DNS_T_MG\t\t= 8,\t/* Mail group member. */\n  DNS_T_MR\t\t= 9,\t/* Mail rename name. */\n  DNS_T_NULL\t\t= 10,\t/* Null resource record. */\n  DNS_T_WKS\t\t= 11,\t/* Well known service. */\n  DNS_T_PTR\t\t= 12,\t/* Domain name pointer. */\n  DNS_T_HINFO\t\t= 13,\t/* Host information. */\n  DNS_T_MINFO\t\t= 14,\t/* Mailbox information. */\n  DNS_T_MX\t\t= 15,\t/* Mail routing information. */\n  DNS_T_TXT\t\t= 16,\t/* Text strings. */\n  DNS_T_RP\t\t= 17,\t/* Responsible person. */\n  DNS_T_AFSDB\t\t= 18,\t/* AFS cell database. */\n  DNS_T_X25\t\t= 19,\t/* X_25 calling address. */\n  DNS_T_ISDN\t\t= 20,\t/* ISDN calling address. */\n  DNS_T_RT\t\t= 21,\t/* Router. */\n  DNS_T_NSAP\t\t= 22,\t/* NSAP address. */\n  DNS_T_NSAP_PTR\t= 23,\t/* Reverse NSAP lookup (deprecated). */\n  DNS_T_SIG\t\t= 24,\t/* Security signature. */\n  DNS_T_KEY\t\t= 25,\t/* Security key. */\n  DNS_T_PX\t\t= 26,\t/* X.400 mail mapping. */\n  DNS_T_GPOS\t\t= 27,\t/* Geographical position (withdrawn). */\n  DNS_T_AAAA\t\t= 28,\t/* Ip6 Address. */\n  DNS_T_LOC\t\t= 29,\t/* Location Information. */\n  DNS_T_NXT\t\t= 30,\t/* Next domain (security). */\n  DNS_T_EID\t\t= 31,\t/* Endpoint identifier. */\n  DNS_T_NIMLOC\t\t= 32,\t/* Nimrod Locator. */\n  DNS_T_SRV\t\t= 33,\t/* Server Selection. */\n  DNS_T_ATMA\t\t= 34,\t/* ATM Address */\n  DNS_T_NAPTR\t\t= 35,\t/* Naming Authority PoinTeR */\n  DNS_T_KX\t\t= 36,\t/* Key Exchange */\n  DNS_T_CERT\t\t= 37,\t/* Certification record */\n  DNS_T_A6\t\t= 38,\t/* IPv6 address (deprecates AAAA) */\n  DNS_T_DNAME\t\t= 39,\t/* Non-terminal DNAME (for IPv6) */\n  DNS_T_SINK\t\t= 40,\t/* Kitchen sink (experimentatl) */\n  DNS_T_OPT\t\t= 41,\t/* EDNS0 option (meta-RR) */\n  DNS_T_DS\t\t= 43,\t/* DNSSEC */\n  DNS_T_SSHFP\t\t= 44,\n  DNS_T_IPSECKEY\t= 45,\n  DNS_T_RRSIG\t\t= 46,\t/* DNSSEC */\n  DNS_T_NSEC\t\t= 47,\t/* DNSSEC */\n  DNS_T_DNSKEY\t\t= 48,\n  DNS_T_DHCID\t\t= 49,\n  DNS_T_NSEC3\t\t= 50,\n  DNS_T_NSEC3PARAMS\t= 51,\n  DNS_T_TALINK\t\t= 58, /* draft-ietf-dnsop-trust-history */\n  DNS_T_SPF\t\t= 99,\n  DNS_T_UINFO\t\t= 100,\n  DNS_T_UID\t\t= 101,\n  DNS_T_GID\t\t= 102,\n  DNS_T_UNSPEC\t\t= 103,\n  DNS_T_TSIG\t\t= 250,\t/* Transaction signature. */\n  DNS_T_IXFR\t\t= 251,\t/* Incremental zone transfer. */\n  DNS_T_AXFR\t\t= 252,\t/* Transfer zone of authority. */\n  DNS_T_MAILB\t\t= 253,\t/* Transfer mailbox records. */\n  DNS_T_MAILA\t\t= 254,\t/* Transfer mail agent records. */\n  DNS_T_ANY\t\t= 255,\t/* Wildcard match. */\n  DNS_T_ZXFR\t\t= 256,\t/* BIND-specific, nonstandard. */\n  DNS_T_DLV\t\t= 32769, /* RFC 4431, 5074, DNSSEC Lookaside Validation */\n  DNS_T_MAX\t\t= 65536\n};\n\n/**************************************************************************/\n/**************** Domain Names (DNs) **************************************/\n\n/* return length of the DN */\nUDNS_API unsigned\ndns_dnlen(dnscc_t *dn);\n\n/* return #of labels in a DN */\nUDNS_API unsigned\ndns_dnlabels(dnscc_t *dn);\n\n/* lower- and uppercase single DN char */\n#define DNS_DNLC(c) ((c) >= 'A' && (c) <= 'Z' ? (c) - 'A' + 'a' : (c))\n#define DNS_DNUC(c) ((c) >= 'a' && (c) <= 'z' ? (c) - 'a' + 'A' : (c))\n\n/* compare the DNs, return dnlen of equal or 0 if not */\nUDNS_API unsigned\ndns_dnequal(dnscc_t *dn1, dnscc_t *dn2);\n\n/* copy one DN to another, size checking */\nUDNS_API unsigned\ndns_dntodn(dnscc_t *sdn, dnsc_t *ddn, unsigned ddnsiz);\n\n/* convert asciiz string of length namelen (0 to use strlen) to DN */\nUDNS_API int\ndns_ptodn(const char *name, unsigned namelen,\n          dnsc_t *dn, unsigned dnsiz, int *isabs);\n\n/* simpler form of dns_ptodn() */\n#define dns_sptodn(name,dn,dnsiz) dns_ptodn((name),0,(dn),(dnsiz),0)\n\nUDNS_DATA_API extern dnscc_t dns_inaddr_arpa_dn[14];\n#define DNS_A4RSIZE\t30\nUDNS_API int\ndns_a4todn(const struct in_addr *addr, dnscc_t *tdn,\n           dnsc_t *dn, unsigned dnsiz);\nUDNS_API int\ndns_a4ptodn(const struct in_addr *addr, const char *tname,\n            dnsc_t *dn, unsigned dnsiz);\nUDNS_API dnsc_t *\ndns_a4todn_(const struct in_addr *addr, dnsc_t *dn, dnsc_t *dne);\n\nUDNS_DATA_API extern dnscc_t dns_ip6_arpa_dn[10];\n#define DNS_A6RSIZE\t74\nUDNS_API int\ndns_a6todn(const struct in6_addr *addr, dnscc_t *tdn,\n           dnsc_t *dn, unsigned dnsiz);\nUDNS_API int\ndns_a6ptodn(const struct in6_addr *addr, const char *tname,\n            dnsc_t *dn, unsigned dnsiz);\nUDNS_API dnsc_t *\ndns_a6todn_(const struct in6_addr *addr, dnsc_t *dn, dnsc_t *dne);\n\n/* convert DN into asciiz string */\nUDNS_API int\ndns_dntop(dnscc_t *dn, char *name, unsigned namesiz);\n\n/* convert DN into asciiz string, using static buffer (NOT thread-safe!) */\nUDNS_API const char *\ndns_dntosp(dnscc_t *dn);\n\n/* return buffer size (incl. null byte) required for asciiz form of a DN */\nUDNS_API unsigned\ndns_dntop_size(dnscc_t *dn);\n\n/* either wrappers or reimplementations for inet_ntop() and inet_pton() */\nUDNS_API const char *dns_ntop(int af, const void *src, char *dst, int size);\nUDNS_API int dns_pton(int af, const char *src, void *dst);\n\n/**************************************************************************/\n/**************** DNS raw packet layout ***********************************/\n\nenum dns_rcode {\t/* reply codes */\n  DNS_R_NOERROR\t\t= 0,\t/* ok, no error */\n  DNS_R_FORMERR\t\t= 1,\t/* format error */\n  DNS_R_SERVFAIL\t= 2,\t/* server failed */\n  DNS_R_NXDOMAIN\t= 3,\t/* domain does not exists */\n  DNS_R_NOTIMPL\t\t= 4,\t/* not implemented */\n  DNS_R_REFUSED\t\t= 5,\t/* query refused */\n  /* these are for BIND_UPDATE */\n  DNS_R_YXDOMAIN\t= 6,\t/* Name exists */\n  DNS_R_YXRRSET\t\t= 7,\t/* RRset exists */\n  DNS_R_NXRRSET\t\t= 8,\t/* RRset does not exist */\n  DNS_R_NOTAUTH\t\t= 9,\t/* Not authoritative for zone */\n  DNS_R_NOTZONE\t\t= 10,\t/* Zone of record different from zone section */\n  /*ns_r_max = 11,*/\n  /* The following are TSIG extended errors */\n  DNS_R_BADSIG\t\t= 16,\n  DNS_R_BADKEY\t\t= 17,\n  DNS_R_BADTIME\t\t= 18\n};\n\nstatic __inline unsigned dns_get16(dnscc_t *s) {\n  return ((unsigned)s[0]<<8) | s[1];\n}\nstatic __inline unsigned dns_get32(dnscc_t *s) {\n  return ((unsigned)s[0]<<24) | ((unsigned)s[1]<<16)\n        | ((unsigned)s[2]<<8) | s[3];\n}\nstatic __inline dnsc_t *dns_put16(dnsc_t *d, unsigned n) {\n  *d++ = (dnsc_t)((n >> 8) & 255); *d++ = (dnsc_t)(n & 255); return d;\n}\nstatic __inline dnsc_t *dns_put32(dnsc_t *d, unsigned n) {\n  *d++ = (dnsc_t)((n >> 24) & 255); *d++ = (dnsc_t)((n >> 16) & 255);\n  *d++ = (dnsc_t)((n >>  8) & 255); *d++ = (dnsc_t)(n & 255);\n  return d;\n}\n\n/* DNS Header layout */\nenum {\n /* bytes 0:1 - query ID */\n  DNS_H_QID1\t= 0,\n  DNS_H_QID2\t= 1,\n  DNS_H_QID\t= DNS_H_QID1,\n#define dns_qid(pkt)\tdns_get16((pkt)+DNS_H_QID)\n /* byte 2: flags1 */\n  DNS_H_F1\t= 2,\n  DNS_HF1_QR\t= 0x80,\t/* query response flag */\n#define dns_qr(pkt)\t((pkt)[DNS_H_F1]&DNS_HF1_QR)\n  DNS_HF1_OPCODE = 0x78, /* opcode, 0 = query */\n#define dns_opcode(pkt)\t(((pkt)[DNS_H_F1]&DNS_HF1_OPCODE)>>3)\n  DNS_HF1_AA\t= 0x04,\t/* auth answer */\n#define dns_aa(pkt)\t((pkt)[DNS_H_F1]&DNS_HF1_AA)\n  DNS_HF1_TC\t= 0x02,\t/* truncation flag */\n#define dns_tc(pkt)\t((pkt)[DNS_H_F1]&DNS_HF1_TC)\n  DNS_HF1_RD\t= 0x01,\t/* recursion desired (may be set in query) */\n#define dns_rd(pkt)\t((pkt)[DNS_H_F1]&DNS_HF1_RD)\n /* byte 3: flags2 */\n  DNS_H_F2\t= 3,\n  DNS_HF2_RA\t= 0x80,\t/* recursion available */\n#define dns_ra(pkt)\t((pkt)[DNS_H_F2]&DNS_HF2_RA)\n  DNS_HF2_Z\t= 0x40,\t/* reserved */\n  DNS_HF2_AD\t= 0x20, /* DNSSEC: authentic data */\n#define dns_ad(pkt)\t((pkt)[DNS_H_F2]&DNS_HF2_AD)\n  DNS_HF2_CD\t= 0x10, /* DNSSEC: checking disabled */\n#define dns_cd(pkt)\t((pkt)[DNS_H_F2]&DNS_HF2_CD)\n  DNS_HF2_RCODE\t= 0x0f,\t/* response code, DNS_R_XXX above */\n#define dns_rcode(pkt)\t((pkt)[DNS_H_F2]&DNS_HF2_RCODE)\n /* bytes 4:5: qdcount, numqueries */\n  DNS_H_QDCNT1\t= 4,\n  DNS_H_QDCNT2\t= 5,\n  DNS_H_QDCNT\t= DNS_H_QDCNT1,\n#define dns_numqd(pkt)\tdns_get16((pkt)+4)\n /* bytes 6:7: ancount, numanswers */\n  DNS_H_ANCNT1\t= 6,\n  DNS_H_ANCNT2\t= 7,\n  DNS_H_ANCNT\t= DNS_H_ANCNT1,\n#define dns_numan(pkt)\tdns_get16((pkt)+6)\n /* bytes 8:9: nscount, numauthority */\n  DNS_H_NSCNT1\t= 8,\n  DNS_H_NSCNT2\t= 9,\n  DNS_H_NSCNT\t= DNS_H_NSCNT1,\n#define dns_numns(pkt)\tdns_get16((pkt)+8)\n /* bytes 10:11: arcount, numadditional */\n  DNS_H_ARCNT1\t= 10,\n  DNS_H_ARCNT2\t= 11,\n  DNS_H_ARCNT\t= DNS_H_ARCNT1,\n#define dns_numar(pkt)\tdns_get16((pkt)+10)\n#define dns_payload(pkt) ((pkt)+DNS_HSIZE)\n  /* EDNS0 (OPT RR) flags (Ext. Flags) */\n  DNS_EF1_DO\t= 0x80, /* DNSSEC OK */\n};\n\n/* packet buffer: start at pkt, end before pkte, current pos *curp.\n * extract a DN and set *curp to the next byte after DN in packet.\n * return -1 on error, 0 if dnsiz is too small, or dnlen on ok.\n */\nUDNS_API int\ndns_getdn(dnscc_t *pkt, dnscc_t **curp, dnscc_t *end,\n          dnsc_t *dn, unsigned dnsiz);\n\n/* skip the DN at position cur in packet ending before pkte,\n * return pointer to the next byte after the DN or NULL on error */\nUDNS_API dnscc_t *\ndns_skipdn(dnscc_t *end, dnscc_t *cur);\n\nstruct dns_rr {\t\t/* DNS Resource Record */\n  dnsc_t dnsrr_dn[DNS_MAXDN];\t/* the DN of the RR */\n  enum dns_class dnsrr_cls;\t/* Class */\n  enum dns_type  dnsrr_typ;\t/* Type */\n  unsigned dnsrr_ttl;\t\t/* Time-To-Live (TTL) */\n  unsigned dnsrr_dsz;\t\t/* data size */\n  dnscc_t *dnsrr_dptr;\t\t/* pointer to start of data */\n  dnscc_t *dnsrr_dend;\t\t/* past end of data */\n};\n\nstruct dns_parse {\t/* RR/packet parsing state */\n  dnscc_t *dnsp_pkt;\t\t/* start of the packet */\n  dnscc_t *dnsp_end;\t\t/* end of the packet */\n  dnscc_t *dnsp_cur;\t\t/* current packet position */\n  dnscc_t *dnsp_ans;\t\t/* start of answer section */\n  int dnsp_rrl;\t\t\t/* number of RRs left to go */\n  int dnsp_nrr;\t\t\t/* RR count so far */\n  unsigned dnsp_ttl;\t\t/* TTL value so far */\n  dnscc_t *dnsp_qdn;\t\t/* the RR DN we're looking for */\n  enum dns_class dnsp_qcls;\t/* RR class we're looking for or 0 */\n  enum dns_type  dnsp_qtyp;\t/* RR type we're looking for or 0 */\n  dnsc_t dnsp_dnbuf[DNS_MAXDN];\t/* domain buffer */\n};\n\n/* initialize the parse structure */\nUDNS_API void\ndns_initparse(struct dns_parse *p, dnscc_t *qdn,\n              dnscc_t *pkt, dnscc_t *cur, dnscc_t *end);\n\n/* search next RR, <0=error, 0=no more RRs, >0 = found. */\nUDNS_API int\ndns_nextrr(struct dns_parse *p, struct dns_rr *rr);\n\nUDNS_API void\ndns_rewind(struct dns_parse *p, dnscc_t *qdn);\n\n\n/**************************************************************************/\n/**************** Resolver Context ****************************************/\n\n/* default resolver context */\nUDNS_DATA_API extern struct dns_ctx dns_defctx;\n\n/* reset resolver context to default state, close it if open, drop queries */\nUDNS_API void\ndns_reset(struct dns_ctx *ctx);\n\n/* reset resolver context and read in system configuration */\nUDNS_API int\ndns_init(struct dns_ctx *ctx, int do_open);\n\n/* return new resolver context with the same settings as copy */\nUDNS_API struct dns_ctx *\ndns_new(const struct dns_ctx *copy);\n\n/* free resolver context returned by dns_new(); all queries are dropped */\nUDNS_API void\ndns_free(struct dns_ctx *ctx);\n\n/* add nameserver for a resolver context (or reset nslist if serv==NULL) */\nUDNS_API int\ndns_add_serv(struct dns_ctx *ctx, const char *serv);\n\n/* add nameserver using struct sockaddr structure (with ports) */\nUDNS_API int\ndns_add_serv_s(struct dns_ctx *ctx, const struct sockaddr *sa);\n\n/* add search list element for a resolver context (or reset it if srch==NULL) */\nUDNS_API int\ndns_add_srch(struct dns_ctx *ctx, const char *srch);\n\n/* set options for a resolver context */\nUDNS_API int\ndns_set_opts(struct dns_ctx *ctx, const char *opts);\n\nenum dns_opt {\t\t/* options */\n  DNS_OPT_FLAGS,\t/* flags, DNS_F_XXX */\n  DNS_OPT_TIMEOUT,\t/* timeout in secounds */\n  DNS_OPT_NTRIES,\t/* number of retries */\n  DNS_OPT_NDOTS,\t/* ndots */\n  DNS_OPT_UDPSIZE,\t/* EDNS0 UDP size */\n  DNS_OPT_PORT,\t\t/* port to use */\n};\n\n/* set or get (if val<0) an option */\nUDNS_API int\ndns_set_opt(struct dns_ctx *ctx, enum dns_opt opt, int val);\n\nenum dns_flags {\n  DNS_NOSRCH\t= 0x00010000,\t/* do not perform search */\n  DNS_NORD\t= 0x00020000,\t/* request no recursion */\n  DNS_AAONLY\t= 0x00040000,\t/* set AA flag in queries */\n  DNS_SET_DO\t= 0x00080000,\t/* set EDNS0 \"DO\" bit (DNSSEC OK) */\n  DNS_SET_CD\t= 0x00100000,\t/* set CD bit (DNSSEC: checking disabled) */\n};\n\n/* set the debug function pointer */\ntypedef void\n(dns_dbgfn)(int code, const struct sockaddr *sa, unsigned salen,\n            dnscc_t *pkt, int plen,\n            const struct dns_query *q, void *data);\nUDNS_API void\ndns_set_dbgfn(struct dns_ctx *ctx, dns_dbgfn *dbgfn);\n\n/* open and return UDP socket */\nUDNS_API int\ndns_open(struct dns_ctx *ctx);\n\n/* return UDP socket or -1 if not open */\nUDNS_API int\ndns_sock(const struct dns_ctx *ctx);\n\n/* close the UDP socket */\nUDNS_API void\ndns_close(struct dns_ctx *ctx);\n\n/* return number of requests queued */\nUDNS_API int\ndns_active(const struct dns_ctx *ctx);\n\n/* return status of the last operation */\nUDNS_API int\ndns_status(const struct dns_ctx *ctx);\nUDNS_API void\ndns_setstatus(struct dns_ctx *ctx, int status);\n\n/* handle I/O event on UDP socket */\nUDNS_API void\ndns_ioevent(struct dns_ctx *ctx, time_t now);\n\n/* process any timeouts, return time in secounds to the\n * next timeout (or -1 if none) but not greather than maxwait */\nUDNS_API int\ndns_timeouts(struct dns_ctx *ctx, int maxwait, time_t now);\n\n/* define timer requesting routine to use */\ntypedef void dns_utm_fn(struct dns_ctx *ctx, int timeout, void *data);\nUDNS_API void\ndns_set_tmcbck(struct dns_ctx *ctx, dns_utm_fn *fn, void *data);\n\n/**************************************************************************/\n/**************** Making Queries ******************************************/\n\n/* query callback routine */\ntypedef void dns_query_fn(struct dns_ctx *ctx, void *result, void *data);\n\n/* query parse routine: raw DNS => application structure */\ntypedef int\ndns_parse_fn(dnscc_t *qdn, dnscc_t *pkt, dnscc_t *cur, dnscc_t *end,\n             void **res);\n\nenum dns_status {\n  DNS_E_NOERROR\t\t= 0,\t/* ok, not an error */\n  DNS_E_TEMPFAIL\t= -1,\t/* timeout, SERVFAIL or similar */\n  DNS_E_PROTOCOL\t= -2,\t/* got garbled reply */\n  DNS_E_NXDOMAIN\t= -3,\t/* domain does not exists */\n  DNS_E_NODATA\t\t= -4,\t/* domain exists but no data of reqd type */\n  DNS_E_NOMEM\t\t= -5,\t/* out of memory while processing */\n  DNS_E_BADQUERY\t= -6\t/* the query is malformed */\n};\n\n/* submit generic DN query */\nUDNS_API struct dns_query *\ndns_submit_dn(struct dns_ctx *ctx,\n              dnscc_t *dn, int qcls, int qtyp, int flags,\n              dns_parse_fn *parse, dns_query_fn *cbck, void *data);\n/* submit generic name query */\nUDNS_API struct dns_query *\ndns_submit_p(struct dns_ctx *ctx,\n             const char *name, int qcls, int qtyp, int flags,\n             dns_parse_fn *parse, dns_query_fn *cbck, void *data);\n\n/* cancel the given async query in progress */\nUDNS_API int\ndns_cancel(struct dns_ctx *ctx, struct dns_query *q);\n\n/* resolve a generic query, return the answer */\nUDNS_API void *\ndns_resolve_dn(struct dns_ctx *ctx,\n               dnscc_t *qdn, int qcls, int qtyp, int flags,\n               dns_parse_fn *parse);\nUDNS_API void *\ndns_resolve_p(struct dns_ctx *ctx,\n              const char *qname, int qcls, int qtyp, int flags,\n              dns_parse_fn *parse);\nUDNS_API void *\ndns_resolve(struct dns_ctx *ctx, struct dns_query *q);\n\n\n/* Specific RR handlers */\n\n#define dns_rr_common(prefix)\t\t\t\t\t\t\\\n  char *prefix##_cname;\t\t/* canonical name */\t\t\t\\\n  char *prefix##_qname;\t\t/* original query name */\t\t\\\n  unsigned prefix##_ttl;\t/* TTL value */\t\t\t\t\\\n  int prefix##_nrr\t\t/* number of records */\n\nstruct dns_rr_null {\t\t/* NULL RRset, aka RRset template */\n  dns_rr_common(dnsn);\n};\n\nUDNS_API int\ndns_stdrr_size(const struct dns_parse *p);\nUDNS_API void *\ndns_stdrr_finish(struct dns_rr_null *ret, char *cp, const struct dns_parse *p);\n\nstruct dns_rr_a4 {\t\t/* the A RRset */\n  dns_rr_common(dnsa4);\n  struct in_addr *dnsa4_addr;\t/* array of addresses, naddr elements */\n};\n\nUDNS_API dns_parse_fn dns_parse_a4;\t/* A RR parsing routine */\ntypedef void\t\t\t\t/* A query callback routine */\ndns_query_a4_fn(struct dns_ctx *ctx, struct dns_rr_a4 *result, void *data);\n\n/* submit A IN query */\nUDNS_API struct dns_query *\ndns_submit_a4(struct dns_ctx *ctx, const char *name, int flags,\n              dns_query_a4_fn *cbck, void *data);\n\n/* resolve A IN query */\nUDNS_API struct dns_rr_a4 *\ndns_resolve_a4(struct dns_ctx *ctx, const char *name, int flags);\n\n\nstruct dns_rr_a6 {\t\t/* the AAAA RRset */\n  dns_rr_common(dnsa6);\n  struct in6_addr *dnsa6_addr;\t/* array of addresses, naddr elements */\n};\n\nUDNS_API dns_parse_fn dns_parse_a6;\t/* A RR parsing routine */\ntypedef void\t\t\t\t/* A query callback routine */\ndns_query_a6_fn(struct dns_ctx *ctx, struct dns_rr_a6 *result, void *data);\n\n/* submit AAAA IN query */\nUDNS_API struct dns_query *\ndns_submit_a6(struct dns_ctx *ctx, const char *name, int flags,\n              dns_query_a6_fn *cbck, void *data);\n\n/* resolve AAAA IN query */\nUDNS_API struct dns_rr_a6 *\ndns_resolve_a6(struct dns_ctx *ctx, const char *name, int flags);\n\n\nstruct dns_rr_ptr {\t\t/* the PTR RRset */\n  dns_rr_common(dnsptr);\n  char **dnsptr_ptr;\t\t/* array of PTRs */\n};\n\nUDNS_API dns_parse_fn dns_parse_ptr;\t/* PTR RR parsing routine */\ntypedef void\t\t\t\t/* PTR query callback */\ndns_query_ptr_fn(struct dns_ctx *ctx, struct dns_rr_ptr *result, void *data);\n/* submit PTR IN in-addr.arpa query */\nUDNS_API struct dns_query *\ndns_submit_a4ptr(struct dns_ctx *ctx, const struct in_addr *addr,\n                 dns_query_ptr_fn *cbck, void *data);\n/* resolve PTR IN in-addr.arpa query */\nUDNS_API struct dns_rr_ptr *\ndns_resolve_a4ptr(struct dns_ctx *ctx, const struct in_addr *addr);\n\n/* the same as above, but for ip6.arpa */\nUDNS_API struct dns_query *\ndns_submit_a6ptr(struct dns_ctx *ctx, const struct in6_addr *addr,\n                 dns_query_ptr_fn *cbck, void *data);\nUDNS_API struct dns_rr_ptr *\ndns_resolve_a6ptr(struct dns_ctx *ctx, const struct in6_addr *addr);\n\n\nstruct dns_mx {\t\t/* single MX RR */\n  int priority;\t\t/* MX priority */\n  char *name;\t\t/* MX name */\n};\nstruct dns_rr_mx {\t\t/* the MX RRset */\n  dns_rr_common(dnsmx);\n  struct dns_mx *dnsmx_mx;\t/* array of MXes */\n};\nUDNS_API dns_parse_fn dns_parse_mx;\t/* MX RR parsing routine */\ntypedef void\t\t\t\t/* MX RR callback */\ndns_query_mx_fn(struct dns_ctx *ctx, struct dns_rr_mx *result, void *data);\n/* submit MX IN query */\nUDNS_API struct dns_query *\ndns_submit_mx(struct dns_ctx *ctx, const char *name, int flags,\n              dns_query_mx_fn *cbck, void *data);\n/* resolve MX IN query */\nUDNS_API struct dns_rr_mx *\ndns_resolve_mx(struct dns_ctx *ctx, const char *name, int flags);\n\n\nstruct dns_txt {\t/* single TXT record */\n  int len;\t\t/* length of the text */\n  dnsc_t *txt;\t/* pointer to text buffer. May contain nulls. */\n};\nstruct dns_rr_txt {\t\t/* the TXT RRset */\n  dns_rr_common(dnstxt);\n  struct dns_txt *dnstxt_txt;\t/* array of TXT records */\n};\nUDNS_API dns_parse_fn dns_parse_txt;\t/* TXT RR parsing routine */\ntypedef void\t\t\t\t/* TXT RR callback */\ndns_query_txt_fn(struct dns_ctx *ctx, struct dns_rr_txt *result, void *data);\n/* submit TXT query */\nUDNS_API struct dns_query *\ndns_submit_txt(struct dns_ctx *ctx, const char *name, int qcls, int flags,\n               dns_query_txt_fn *cbck, void *data);\n/* resolve TXT query */\nUDNS_API struct dns_rr_txt *\ndns_resolve_txt(struct dns_ctx *ctx, const char *name, int qcls, int flags);\n\n\nstruct dns_srv {\t/* single SRV RR */\n  int priority;\t\t/* SRV priority */\n  int weight;\t\t/* SRV weight */\n  int port;\t\t/* SRV port */\n  char *name;\t\t/* SRV name */\n};\nstruct dns_rr_srv {\t\t/* the SRV RRset */\n  dns_rr_common(dnssrv);\n  struct dns_srv *dnssrv_srv;\t/* array of SRVes */\n};\nUDNS_API dns_parse_fn dns_parse_srv;\t/* SRV RR parsing routine */\ntypedef void\t\t\t\t/* SRV RR callback */\ndns_query_srv_fn(struct dns_ctx *ctx, struct dns_rr_srv *result, void *data);\n/* submit SRV IN query */\nUDNS_API struct dns_query *\ndns_submit_srv(struct dns_ctx *ctx,\n               const char *name, const char *srv, const char *proto,\n               int flags, dns_query_srv_fn *cbck, void *data);\n/* resolve SRV IN query */\nUDNS_API struct dns_rr_srv *\ndns_resolve_srv(struct dns_ctx *ctx,\n                const char *name, const char *srv, const char *proto,\n                int flags);\n\n/* NAPTR (RFC3403) RR type */\nstruct dns_naptr {\t/* single NAPTR RR */\n  int order;\t\t/* NAPTR order */\n  int preference;\t/* NAPTR preference */\n  char *flags;\t\t/* NAPTR flags */\n  char *service;\t/* NAPTR service */\n  char *regexp;\t\t/* NAPTR regexp */\n  char *replacement;\t/* NAPTR replacement */\n};\n\nstruct dns_rr_naptr {\t\t/* the NAPTR RRset */\n  dns_rr_common(dnsnaptr);\n  struct dns_naptr *dnsnaptr_naptr;\t/* array of NAPTRes */\n};\nUDNS_API dns_parse_fn dns_parse_naptr;\t/* NAPTR RR parsing routine */\ntypedef void\t\t\t\t/* NAPTR RR callback */\ndns_query_naptr_fn(struct dns_ctx *ctx,\n                   struct dns_rr_naptr *result, void *data);\n/* submit NAPTR IN query */\nUDNS_API struct dns_query *\ndns_submit_naptr(struct dns_ctx *ctx, const char *name, int flags,\n                 dns_query_naptr_fn *cbck, void *data);\n/* resolve NAPTR IN query */\nUDNS_API struct dns_rr_naptr *\ndns_resolve_naptr(struct dns_ctx *ctx, const char *name, int flags);\n\n\nUDNS_API struct dns_query *\ndns_submit_a4dnsbl(struct dns_ctx *ctx,\n                   const struct in_addr *addr, const char *dnsbl,\n                   dns_query_a4_fn *cbck, void *data);\nUDNS_API struct dns_query *\ndns_submit_a4dnsbl_txt(struct dns_ctx *ctx,\n                       const struct in_addr *addr, const char *dnsbl,\n                       dns_query_txt_fn *cbck, void *data);\nUDNS_API struct dns_rr_a4 *\ndns_resolve_a4dnsbl(struct dns_ctx *ctx,\n                    const struct in_addr *addr, const char *dnsbl);\nUDNS_API struct dns_rr_txt *\ndns_resolve_a4dnsbl_txt(struct dns_ctx *ctx,\n                        const struct in_addr *addr, const char *dnsbl);\n\nUDNS_API struct dns_query *\ndns_submit_a6dnsbl(struct dns_ctx *ctx,\n                   const struct in6_addr *addr, const char *dnsbl,\n                   dns_query_a4_fn *cbck, void *data);\nUDNS_API struct dns_query *\ndns_submit_a6dnsbl_txt(struct dns_ctx *ctx,\n                       const struct in6_addr *addr, const char *dnsbl,\n                       dns_query_txt_fn *cbck, void *data);\nUDNS_API struct dns_rr_a4 *\ndns_resolve_a6dnsbl(struct dns_ctx *ctx,\n                    const struct in6_addr *addr, const char *dnsbl);\nUDNS_API struct dns_rr_txt *\ndns_resolve_a6dnsbl_txt(struct dns_ctx *ctx,\n                        const struct in6_addr *addr, const char *dnsbl);\n\nUDNS_API struct dns_query *\ndns_submit_rhsbl(struct dns_ctx *ctx,\n                 const char *name, const char *rhsbl,\n                 dns_query_a4_fn *cbck, void *data);\nUDNS_API struct dns_query *\ndns_submit_rhsbl_txt(struct dns_ctx *ctx,\n                     const char *name, const char *rhsbl,\n                     dns_query_txt_fn *cbck, void *data);\nUDNS_API struct dns_rr_a4 *\ndns_resolve_rhsbl(struct dns_ctx *ctx, const char *name, const char *rhsbl);\nUDNS_API struct dns_rr_txt *\ndns_resolve_rhsbl_txt(struct dns_ctx *ctx, const char *name, const char *rhsbl);\n\n/**************************************************************************/\n/**************** Names, Names ********************************************/\n\nstruct dns_nameval {\n  int val;\n  const char *name;\n};\n\nUDNS_DATA_API extern const struct dns_nameval dns_classtab[];\nUDNS_DATA_API extern const struct dns_nameval dns_typetab[];\nUDNS_DATA_API extern const struct dns_nameval dns_rcodetab[];\nUDNS_API int\ndns_findname(const struct dns_nameval *nv, const char *name);\n#define dns_findclassname(cls) dns_findname(dns_classtab, (cls))\n#define dns_findtypename(type) dns_findname(dns_typetab, (type))\n#define dns_findrcodename(rcode) dns_findname(dns_rcodetab, (rcode))\n\nUDNS_API const char *dns_classname(enum dns_class cls);\nUDNS_API const char *dns_typename(enum dns_type type);\nUDNS_API const char *dns_rcodename(enum dns_rcode rcode);\nconst char *_dns_format_code(char *buf, const char *prefix, int code);\n\nUDNS_API const char *dns_strerror(int errnum);\n\n/* simple pseudo-random number generator, code by Bob Jenkins */\n\nstruct udns_jranctx {\t/* the context */\n  unsigned a, b, c, d;\n};\n\n/* initialize the RNG with a given seed */\nUDNS_API void\nudns_jraninit(struct udns_jranctx *x, unsigned seed);\n\n/* return next random number.  32bits on most platforms so far. */\nUDNS_API unsigned\nudns_jranval(struct udns_jranctx *x);\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif\n\n#endif\t/* include guard */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns_XtoX.c",
    "content": "/* udns_XtoX.c\n   udns_ntop() and udns_pton() routines, which are either\n     - wrappers for inet_ntop() and inet_pton() or\n     - reimplementations of those routines.\n\n   Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n */\n\n#ifdef HAVE_CONFIG_H\n# include \"config.h\"\n#endif\n#include \"udns.h\"\n\n#if HAVE_DECL_INET_NTOP == 1\n\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <arpa/inet.h>\n\nconst char *dns_ntop(int af, const void *src, char *dst, int size) {\n  return inet_ntop(af, src, dst, size);\n}\n\nint dns_pton(int af, const char *src, void *dst) {\n  return inet_pton(af, src, dst);\n}\n\n#else\n\n#include <winsock2.h>          /* includes <windows.h> */\n#include <ws2tcpip.h>          /* needed for struct in6_addr */\n\n#ifndef EAFNOSUPPORT\n#define EAFNOSUPPORT    WSAEAFNOSUPPORT\n#endif\n\n#define inet_XtoX_prefix dns_\n#include \"inet_XtoX.c\"\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns_bl.c",
    "content": "/* udns_bl.c\n   DNSBL stuff\n\n   Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n */\n\n#include \"udns.h\"\n#ifndef NULL\n# define NULL 0\n#endif\n\nstruct dns_query *\ndns_submit_a4dnsbl(struct dns_ctx *ctx,\n                   const struct in_addr *addr, const char *dnsbl,\n                   dns_query_a4_fn *cbck, void *data) {\n  dnsc_t dn[DNS_MAXDN];\n  if (dns_a4ptodn(addr, dnsbl, dn, sizeof(dn)) <= 0) {\n    dns_setstatus(ctx, DNS_E_BADQUERY);\n    return NULL;\n  }\n  return\n    dns_submit_dn(ctx, dn, DNS_C_IN, DNS_T_A, DNS_NOSRCH,\n                  dns_parse_a4, (dns_query_fn*)cbck, data);\n}\n\nstruct dns_query *\ndns_submit_a4dnsbl_txt(struct dns_ctx *ctx,\n                       const struct in_addr *addr, const char *dnsbl,\n                       dns_query_txt_fn *cbck, void *data) {\n  dnsc_t dn[DNS_MAXDN];\n  if (dns_a4ptodn(addr, dnsbl, dn, sizeof(dn)) <= 0) {\n    dns_setstatus(ctx, DNS_E_BADQUERY);\n    return NULL;\n  }\n  return\n    dns_submit_dn(ctx, dn, DNS_C_IN, DNS_T_TXT, DNS_NOSRCH,\n                  dns_parse_txt, (dns_query_fn*)cbck, data);\n}\n\nstruct dns_rr_a4 *\ndns_resolve_a4dnsbl(struct dns_ctx *ctx,\n                    const struct in_addr *addr, const char *dnsbl) {\n  return (struct dns_rr_a4 *)\n    dns_resolve(ctx, dns_submit_a4dnsbl(ctx, addr, dnsbl, 0, 0));\n}\n\nstruct dns_rr_txt *\ndns_resolve_a4dnsbl_txt(struct dns_ctx *ctx,\n                        const struct in_addr *addr, const char *dnsbl) {\n  return (struct dns_rr_txt *)\n    dns_resolve(ctx, dns_submit_a4dnsbl_txt(ctx, addr, dnsbl, 0, 0));\n}\n\n\nstruct dns_query *\ndns_submit_a6dnsbl(struct dns_ctx *ctx,\n                   const struct in6_addr *addr, const char *dnsbl,\n                   dns_query_a4_fn *cbck, void *data) {\n  dnsc_t dn[DNS_MAXDN];\n  if (dns_a6ptodn(addr, dnsbl, dn, sizeof(dn)) <= 0) {\n    dns_setstatus(ctx, DNS_E_BADQUERY);\n    return NULL;\n  }\n  return\n    dns_submit_dn(ctx, dn, DNS_C_IN, DNS_T_A, DNS_NOSRCH,\n                  dns_parse_a4, (dns_query_fn*)cbck, data);\n}\n\nstruct dns_query *\ndns_submit_a6dnsbl_txt(struct dns_ctx *ctx,\n                       const struct in6_addr *addr, const char *dnsbl,\n                       dns_query_txt_fn *cbck, void *data) {\n  dnsc_t dn[DNS_MAXDN];\n  if (dns_a6ptodn(addr, dnsbl, dn, sizeof(dn)) <= 0) {\n    dns_setstatus(ctx, DNS_E_BADQUERY);\n    return NULL;\n  }\n  return\n    dns_submit_dn(ctx, dn, DNS_C_IN, DNS_T_TXT, DNS_NOSRCH,\n                  dns_parse_txt, (dns_query_fn*)cbck, data);\n}\n\nstruct dns_rr_a4 *\ndns_resolve_a6dnsbl(struct dns_ctx *ctx,\n                    const struct in6_addr *addr, const char *dnsbl) {\n  return (struct dns_rr_a4 *)\n    dns_resolve(ctx, dns_submit_a6dnsbl(ctx, addr, dnsbl, 0, 0));\n}\n\nstruct dns_rr_txt *\ndns_resolve_a6dnsbl_txt(struct dns_ctx *ctx,\n                        const struct in6_addr *addr, const char *dnsbl) {\n  return (struct dns_rr_txt *)\n    dns_resolve(ctx, dns_submit_a6dnsbl_txt(ctx, addr, dnsbl, 0, 0));\n}\n\nstatic int\ndns_rhsbltodn(const char *name, const char *rhsbl, dnsc_t dn[DNS_MAXDN])\n{\n  int l = dns_sptodn(name, dn, DNS_MAXDN);\n  if (l <= 0) return 0;\n  l = dns_sptodn(rhsbl, dn+l-1, DNS_MAXDN-l+1);\n  if (l <= 0) return 0;\n  return 1;\n}\n\nstruct dns_query *\ndns_submit_rhsbl(struct dns_ctx *ctx, const char *name, const char *rhsbl,\n                 dns_query_a4_fn *cbck, void *data) {\n  dnsc_t dn[DNS_MAXDN];\n  if (!dns_rhsbltodn(name, rhsbl, dn)) {\n    dns_setstatus(ctx, DNS_E_BADQUERY);\n    return NULL;\n  }\n  return\n    dns_submit_dn(ctx, dn, DNS_C_IN, DNS_T_A, DNS_NOSRCH,\n                  dns_parse_a4, (dns_query_fn*)cbck, data);\n}\nstruct dns_query *\ndns_submit_rhsbl_txt(struct dns_ctx *ctx, const char *name, const char *rhsbl,\n                     dns_query_txt_fn *cbck, void *data) {\n  dnsc_t dn[DNS_MAXDN];\n  if (!dns_rhsbltodn(name, rhsbl, dn)) {\n    dns_setstatus(ctx, DNS_E_BADQUERY);\n    return NULL;\n  }\n  return\n    dns_submit_dn(ctx, dn, DNS_C_IN, DNS_T_TXT, DNS_NOSRCH,\n                  dns_parse_txt, (dns_query_fn*)cbck, data);\n}\n\nstruct dns_rr_a4 *\ndns_resolve_rhsbl(struct dns_ctx *ctx, const char *name, const char *rhsbl) {\n  return (struct dns_rr_a4*)\n    dns_resolve(ctx, dns_submit_rhsbl(ctx, name, rhsbl, 0, 0));\n}\n\nstruct dns_rr_txt *\ndns_resolve_rhsbl_txt(struct dns_ctx *ctx, const char *name, const char *rhsbl)\n{\n  return (struct dns_rr_txt*)\n    dns_resolve(ctx, dns_submit_rhsbl_txt(ctx, name, rhsbl, 0, 0));\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns_codes.c",
    "content": "/* Automatically generated. */\n#include \"udns.h\"\n\nconst struct dns_nameval dns_typetab[] = {\n {DNS_T_INVALID,\"INVALID\"},\n {DNS_T_A,\"A\"},\n {DNS_T_NS,\"NS\"},\n {DNS_T_MD,\"MD\"},\n {DNS_T_MF,\"MF\"},\n {DNS_T_CNAME,\"CNAME\"},\n {DNS_T_SOA,\"SOA\"},\n {DNS_T_MB,\"MB\"},\n {DNS_T_MG,\"MG\"},\n {DNS_T_MR,\"MR\"},\n {DNS_T_NULL,\"NULL\"},\n {DNS_T_WKS,\"WKS\"},\n {DNS_T_PTR,\"PTR\"},\n {DNS_T_HINFO,\"HINFO\"},\n {DNS_T_MINFO,\"MINFO\"},\n {DNS_T_MX,\"MX\"},\n {DNS_T_TXT,\"TXT\"},\n {DNS_T_RP,\"RP\"},\n {DNS_T_AFSDB,\"AFSDB\"},\n {DNS_T_X25,\"X25\"},\n {DNS_T_ISDN,\"ISDN\"},\n {DNS_T_RT,\"RT\"},\n {DNS_T_NSAP,\"NSAP\"},\n {DNS_T_NSAP_PTR,\"NSAP_PTR\"},\n {DNS_T_SIG,\"SIG\"},\n {DNS_T_KEY,\"KEY\"},\n {DNS_T_PX,\"PX\"},\n {DNS_T_GPOS,\"GPOS\"},\n {DNS_T_AAAA,\"AAAA\"},\n {DNS_T_LOC,\"LOC\"},\n {DNS_T_NXT,\"NXT\"},\n {DNS_T_EID,\"EID\"},\n {DNS_T_NIMLOC,\"NIMLOC\"},\n {DNS_T_SRV,\"SRV\"},\n {DNS_T_ATMA,\"ATMA\"},\n {DNS_T_NAPTR,\"NAPTR\"},\n {DNS_T_KX,\"KX\"},\n {DNS_T_CERT,\"CERT\"},\n {DNS_T_A6,\"A6\"},\n {DNS_T_DNAME,\"DNAME\"},\n {DNS_T_SINK,\"SINK\"},\n {DNS_T_OPT,\"OPT\"},\n {DNS_T_DS,\"DS\"},\n {DNS_T_SSHFP,\"SSHFP\"},\n {DNS_T_IPSECKEY,\"IPSECKEY\"},\n {DNS_T_RRSIG,\"RRSIG\"},\n {DNS_T_NSEC,\"NSEC\"},\n {DNS_T_DNSKEY,\"DNSKEY\"},\n {DNS_T_DHCID,\"DHCID\"},\n {DNS_T_NSEC3,\"NSEC3\"},\n {DNS_T_NSEC3PARAMS,\"NSEC3PARAMS\"},\n {DNS_T_TALINK,\"TALINK\"},\n {DNS_T_SPF,\"SPF\"},\n {DNS_T_UINFO,\"UINFO\"},\n {DNS_T_UID,\"UID\"},\n {DNS_T_GID,\"GID\"},\n {DNS_T_UNSPEC,\"UNSPEC\"},\n {DNS_T_TSIG,\"TSIG\"},\n {DNS_T_IXFR,\"IXFR\"},\n {DNS_T_AXFR,\"AXFR\"},\n {DNS_T_MAILB,\"MAILB\"},\n {DNS_T_MAILA,\"MAILA\"},\n {DNS_T_ANY,\"ANY\"},\n {DNS_T_ZXFR,\"ZXFR\"},\n {DNS_T_DLV,\"DLV\"},\n {DNS_T_MAX,\"MAX\"},\n {0,0}};\nconst char *dns_typename(enum dns_type code) {\n static char nm[20];\n switch(code) {\n case DNS_T_INVALID: return dns_typetab[0].name;\n case DNS_T_A: return dns_typetab[1].name;\n case DNS_T_NS: return dns_typetab[2].name;\n case DNS_T_MD: return dns_typetab[3].name;\n case DNS_T_MF: return dns_typetab[4].name;\n case DNS_T_CNAME: return dns_typetab[5].name;\n case DNS_T_SOA: return dns_typetab[6].name;\n case DNS_T_MB: return dns_typetab[7].name;\n case DNS_T_MG: return dns_typetab[8].name;\n case DNS_T_MR: return dns_typetab[9].name;\n case DNS_T_NULL: return dns_typetab[10].name;\n case DNS_T_WKS: return dns_typetab[11].name;\n case DNS_T_PTR: return dns_typetab[12].name;\n case DNS_T_HINFO: return dns_typetab[13].name;\n case DNS_T_MINFO: return dns_typetab[14].name;\n case DNS_T_MX: return dns_typetab[15].name;\n case DNS_T_TXT: return dns_typetab[16].name;\n case DNS_T_RP: return dns_typetab[17].name;\n case DNS_T_AFSDB: return dns_typetab[18].name;\n case DNS_T_X25: return dns_typetab[19].name;\n case DNS_T_ISDN: return dns_typetab[20].name;\n case DNS_T_RT: return dns_typetab[21].name;\n case DNS_T_NSAP: return dns_typetab[22].name;\n case DNS_T_NSAP_PTR: return dns_typetab[23].name;\n case DNS_T_SIG: return dns_typetab[24].name;\n case DNS_T_KEY: return dns_typetab[25].name;\n case DNS_T_PX: return dns_typetab[26].name;\n case DNS_T_GPOS: return dns_typetab[27].name;\n case DNS_T_AAAA: return dns_typetab[28].name;\n case DNS_T_LOC: return dns_typetab[29].name;\n case DNS_T_NXT: return dns_typetab[30].name;\n case DNS_T_EID: return dns_typetab[31].name;\n case DNS_T_NIMLOC: return dns_typetab[32].name;\n case DNS_T_SRV: return dns_typetab[33].name;\n case DNS_T_ATMA: return dns_typetab[34].name;\n case DNS_T_NAPTR: return dns_typetab[35].name;\n case DNS_T_KX: return dns_typetab[36].name;\n case DNS_T_CERT: return dns_typetab[37].name;\n case DNS_T_A6: return dns_typetab[38].name;\n case DNS_T_DNAME: return dns_typetab[39].name;\n case DNS_T_SINK: return dns_typetab[40].name;\n case DNS_T_OPT: return dns_typetab[41].name;\n case DNS_T_DS: return dns_typetab[42].name;\n case DNS_T_SSHFP: return dns_typetab[43].name;\n case DNS_T_IPSECKEY: return dns_typetab[44].name;\n case DNS_T_RRSIG: return dns_typetab[45].name;\n case DNS_T_NSEC: return dns_typetab[46].name;\n case DNS_T_DNSKEY: return dns_typetab[47].name;\n case DNS_T_DHCID: return dns_typetab[48].name;\n case DNS_T_NSEC3: return dns_typetab[49].name;\n case DNS_T_NSEC3PARAMS: return dns_typetab[50].name;\n case DNS_T_TALINK: return dns_typetab[51].name;\n case DNS_T_SPF: return dns_typetab[52].name;\n case DNS_T_UINFO: return dns_typetab[53].name;\n case DNS_T_UID: return dns_typetab[54].name;\n case DNS_T_GID: return dns_typetab[55].name;\n case DNS_T_UNSPEC: return dns_typetab[56].name;\n case DNS_T_TSIG: return dns_typetab[57].name;\n case DNS_T_IXFR: return dns_typetab[58].name;\n case DNS_T_AXFR: return dns_typetab[59].name;\n case DNS_T_MAILB: return dns_typetab[60].name;\n case DNS_T_MAILA: return dns_typetab[61].name;\n case DNS_T_ANY: return dns_typetab[62].name;\n case DNS_T_ZXFR: return dns_typetab[63].name;\n case DNS_T_DLV: return dns_typetab[64].name;\n case DNS_T_MAX: return dns_typetab[65].name;\n }\n return _dns_format_code(nm,\"type\",code);\n}\n\nconst struct dns_nameval dns_classtab[] = {\n {DNS_C_INVALID,\"INVALID\"},\n {DNS_C_IN,\"IN\"},\n {DNS_C_CH,\"CH\"},\n {DNS_C_HS,\"HS\"},\n {DNS_C_ANY,\"ANY\"},\n {0,0}};\nconst char *dns_classname(enum dns_class code) {\n static char nm[20];\n switch(code) {\n case DNS_C_INVALID: return dns_classtab[0].name;\n case DNS_C_IN: return dns_classtab[1].name;\n case DNS_C_CH: return dns_classtab[2].name;\n case DNS_C_HS: return dns_classtab[3].name;\n case DNS_C_ANY: return dns_classtab[4].name;\n }\n return _dns_format_code(nm,\"class\",code);\n}\n\nconst struct dns_nameval dns_rcodetab[] = {\n {DNS_R_NOERROR,\"NOERROR\"},\n {DNS_R_FORMERR,\"FORMERR\"},\n {DNS_R_SERVFAIL,\"SERVFAIL\"},\n {DNS_R_NXDOMAIN,\"NXDOMAIN\"},\n {DNS_R_NOTIMPL,\"NOTIMPL\"},\n {DNS_R_REFUSED,\"REFUSED\"},\n {DNS_R_YXDOMAIN,\"YXDOMAIN\"},\n {DNS_R_YXRRSET,\"YXRRSET\"},\n {DNS_R_NXRRSET,\"NXRRSET\"},\n {DNS_R_NOTAUTH,\"NOTAUTH\"},\n {DNS_R_NOTZONE,\"NOTZONE\"},\n {DNS_R_BADSIG,\"BADSIG\"},\n {DNS_R_BADKEY,\"BADKEY\"},\n {DNS_R_BADTIME,\"BADTIME\"},\n {0,0}};\nconst char *dns_rcodename(enum dns_rcode code) {\n static char nm[20];\n switch(code) {\n case DNS_R_NOERROR: return dns_rcodetab[0].name;\n case DNS_R_FORMERR: return dns_rcodetab[1].name;\n case DNS_R_SERVFAIL: return dns_rcodetab[2].name;\n case DNS_R_NXDOMAIN: return dns_rcodetab[3].name;\n case DNS_R_NOTIMPL: return dns_rcodetab[4].name;\n case DNS_R_REFUSED: return dns_rcodetab[5].name;\n case DNS_R_YXDOMAIN: return dns_rcodetab[6].name;\n case DNS_R_YXRRSET: return dns_rcodetab[7].name;\n case DNS_R_NXRRSET: return dns_rcodetab[8].name;\n case DNS_R_NOTAUTH: return dns_rcodetab[9].name;\n case DNS_R_NOTZONE: return dns_rcodetab[10].name;\n case DNS_R_BADSIG: return dns_rcodetab[11].name;\n case DNS_R_BADKEY: return dns_rcodetab[12].name;\n case DNS_R_BADTIME: return dns_rcodetab[13].name;\n }\n return _dns_format_code(nm,\"rcode\",code);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns_dn.c",
    "content": "/* udns_dn.c\n   domain names manipulation routines\n\n   Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n */\n\n#include <string.h>\n#include \"udns.h\"\n\nunsigned dns_dnlen(dnscc_t *dn) {\n  register dnscc_t *d = dn;\n  while(*d)\n    d += 1 + *d;\n  return (unsigned)(d - dn) + 1;\n}\n\nunsigned dns_dnlabels(register dnscc_t *dn) {\n  register unsigned l = 0;\n  while(*dn)\n    ++l, dn += 1 + *dn;\n  return l;\n}\n\nunsigned dns_dnequal(register dnscc_t *dn1, register dnscc_t *dn2) {\n  register unsigned c;\n  dnscc_t *dn = dn1;\n  for(;;) {\n    if ((c = *dn1++) != *dn2++)\n      return 0;\n    if (!c)\n      return (unsigned)(dn1 - dn);\n    while(c--) {\n      if (DNS_DNLC(*dn1) != DNS_DNLC(*dn2))\n        return 0;\n      ++dn1; ++dn2;\n    }\n  }\n}\n\nunsigned\ndns_dntodn(dnscc_t *sdn, dnsc_t *ddn, unsigned ddnsiz) {\n  unsigned sdnlen = dns_dnlen(sdn);\n  if (ddnsiz < sdnlen)\n    return 0;\n  memcpy(ddn, sdn, sdnlen);\n  return sdnlen;\n}\n\nint\ndns_ptodn(const char *name, unsigned namelen,\n          dnsc_t *dn, unsigned dnsiz, int *isabs)\n{\n  dnsc_t *dp;\t\t/* current position in dn (len byte first) */\n  dnsc_t *const de\t/* end of dn: last byte that can be filled up */\n      = dn + (dnsiz >= DNS_MAXDN ? DNS_MAXDN : dnsiz) - 1;\n  dnscc_t *np = (dnscc_t *)name;\n  dnscc_t *ne = np + (namelen ? namelen : strlen((char*)np));\n  dnsc_t *llab;\t\t/* start of last label (llab[-1] will be length) */\n  unsigned c;\t\t/* next input character, or length of last label */\n\n  if (!dnsiz)\n    return 0;\n  dp = llab = dn + 1;\n\n  while(np < ne) {\n\n    if (*np == '.') {\t/* label delimiter */\n      c = dp - llab;\t\t/* length of the label */\n      if (!c) {\t\t\t/* empty label */\n        if (np == (dnscc_t *)name && np + 1 == ne) {\n          /* special case for root dn, aka `.' */\n          ++np;\n          break;\n        }\n        return -1;\t\t/* zero label */\n      }\n      if (c > DNS_MAXLABEL)\n        return -1;\t\t/* label too long */\n      llab[-1] = (dnsc_t)c;\t/* update len of last label */\n      llab = ++dp; /* start new label, llab[-1] will be len of it */\n      ++np;\n      continue;\n    }\n\n    /* check whenever we may put out one more byte */\n    if (dp >= de) /* too long? */\n      return dnsiz >= DNS_MAXDN ? -1 : 0;\n    if (*np != '\\\\') { /* non-escape, simple case */\n      *dp++ = *np++;\n      continue;\n    }\n    /* handle \\-style escape */\n    /* note that traditionally, domain names (gethostbyname etc)\n     * used decimal \\dd notation, not octal \\ooo (RFC1035), so\n     * we're following this tradition here.\n     */\n    if (++np == ne)\n      return -1;\t\t\t/* bad escape */\n    else if (*np >= '0' && *np <= '9') { /* decimal number */\n      /* we allow not only exactly 3 digits as per RFC1035,\n       * but also 2 or 1, for better usability. */\n      c = *np++ - '0';\n      if (np < ne && *np >= '0' && *np <= '9') { /* 2digits */\n        c = c * 10 + *np++ - '0';\n        if (np < ne && *np >= '0' && *np <= '9') {\n          c = c * 10 + *np++ - '0';\n          if (c > 255)\n            return -1;\t\t\t/* bad escape */\n        }\n      }\n    }\n    else\n      c = *np++;\n    *dp++ = (dnsc_t)c;\t/* place next out byte */\n  }\n\n  if ((c = dp - llab) > DNS_MAXLABEL)\n    return -1;\t\t\t\t/* label too long */\n  if ((llab[-1] = (dnsc_t)c) != 0) {\n    *dp++ = 0;\n    if (isabs)\n      *isabs = 0;\n  }\n  else if (isabs)\n    *isabs = 1;\n\n  return dp - dn;\n}\n\ndnscc_t dns_inaddr_arpa_dn[14] = \"\\07in-addr\\04arpa\";\n\ndnsc_t *\ndns_a4todn_(const struct in_addr *addr, dnsc_t *dn, dnsc_t *dne) {\n  const unsigned char *s = ((const unsigned char *)addr) + 4;\n  while(s > (const unsigned char *)addr) {\n    unsigned n = *--s;\n    dnsc_t *p = dn + 1;\n    if (n > 99) {\n      if (p + 2 > dne) return 0;\n      *p++ = n / 100 + '0';\n      *p++ = (n % 100 / 10) + '0';\n      *p = n % 10 + '0';\n    }\n    else if (n > 9) {\n      if (p + 1 > dne) return 0;\n      *p++ = n / 10 + '0';\n      *p = n % 10 + '0';\n    }\n    else {\n      if (p > dne) return 0;\n      *p = n + '0';\n    }\n    *dn = p - dn;\n    dn = p + 1;\n  }\n  return dn;\n}\n\nint dns_a4todn(const struct in_addr *addr, dnscc_t *tdn,\n               dnsc_t *dn, unsigned dnsiz) {\n  dnsc_t *dne = dn + (dnsiz > DNS_MAXDN ? DNS_MAXDN : dnsiz);\n  dnsc_t *p;\n  unsigned l;\n  p = dns_a4todn_(addr, dn, dne);\n  if (!p) return 0;\n  if (!tdn)\n    tdn = dns_inaddr_arpa_dn;\n  l = dns_dnlen(tdn);\n  if (p + l > dne) return dnsiz >= DNS_MAXDN ? -1 : 0;\n  memcpy(p, tdn, l);\n  return (p + l) - dn;\n}\n\nint dns_a4ptodn(const struct in_addr *addr, const char *tname,\n                dnsc_t *dn, unsigned dnsiz) {\n  dnsc_t *p;\n  int r;\n  if (!tname)\n    return dns_a4todn(addr, NULL, dn, dnsiz);\n  p = dns_a4todn_(addr, dn, dn + dnsiz);\n  if (!p) return 0;\n  r = dns_sptodn(tname, p, dnsiz - (p - dn));\n  return r != 0 ? r : dnsiz >= DNS_MAXDN ? -1 : 0;\n}\n\ndnscc_t dns_ip6_arpa_dn[10] = \"\\03ip6\\04arpa\";\n\ndnsc_t *\ndns_a6todn_(const struct in6_addr *addr, dnsc_t *dn, dnsc_t *dne) {\n  const unsigned char *s = ((const unsigned char *)addr) + 16;\n  if (dn + 64 > dne) return 0;\n  while(s > (const unsigned char *)addr) {\n    unsigned n = *--s & 0x0f;\n    *dn++ = 1;\n    *dn++ = n > 9 ? n + 'a' - 10 : n + '0';\n    *dn++ = 1;\n    n = *s >> 4;\n    *dn++ = n > 9 ? n + 'a' - 10 : n + '0';\n  }\n  return dn;\n}\n\nint dns_a6todn(const struct in6_addr *addr, dnscc_t *tdn,\n               dnsc_t *dn, unsigned dnsiz) {\n  dnsc_t *dne = dn + (dnsiz > DNS_MAXDN ? DNS_MAXDN : dnsiz);\n  dnsc_t *p;\n  unsigned l;\n  p = dns_a6todn_(addr, dn, dne);\n  if (!p) return 0;\n  if (!tdn)\n    tdn = dns_ip6_arpa_dn;\n  l = dns_dnlen(tdn);\n  if (p + l > dne) return dnsiz >= DNS_MAXDN ? -1 : 0;\n  memcpy(p, tdn, l);\n  return (p + l) - dn;\n}\n\nint dns_a6ptodn(const struct in6_addr *addr, const char *tname,\n                dnsc_t *dn, unsigned dnsiz) {\n  dnsc_t *p;\n  int r;\n  if (!tname)\n    return dns_a6todn(addr, NULL, dn, dnsiz);\n  p = dns_a6todn_(addr, dn, dn + dnsiz);\n  if (!p) return 0;\n  r = dns_sptodn(tname, p, dnsiz - (p - dn));\n  return r != 0 ? r : dnsiz >= DNS_MAXDN ? -1 : 0;\n}\n\n/* return size of buffer required to convert the dn into asciiz string.\n * Keep in sync with dns_dntop() below.\n */\nunsigned dns_dntop_size(dnscc_t *dn) {\n  unsigned size = 0;\t\t/* the size reqd */\n  dnscc_t *le;\t\t\t/* label end */\n\n  while(*dn) {\n    /* *dn is the length of the next label, non-zero */\n    if (size)\n      ++size;\t\t/* for the dot */\n    le = dn + *dn + 1;\n    ++dn;\n    do {\n      switch(*dn) {\n      case '.':\n      case '\\\\':\n      /* Special modifiers in zone files. */\n      case '\"':\n      case ';':\n      case '@':\n      case '$':\n        size += 2;\n        break;\n      default:\n        if (*dn <= 0x20 || *dn >= 0x7f)\n          /* \\ddd decimal notation */\n          size += 4;\n        else\n          size += 1;\n      }\n    } while(++dn < le);\n  }\n  size += 1;\t/* zero byte at the end - string terminator */\n  return size > DNS_MAXNAME ? 0 : size;\n}\n\n/* Convert the dn into asciiz string.\n * Keep in sync with dns_dntop_size() above.\n */\nint dns_dntop(dnscc_t *dn, char *name, unsigned namesiz) {\n  char *np = name;\t\t\t/* current name ptr */\n  char *const ne = name + namesiz;\t/* end of name */\n  dnscc_t *le;\t\t/* label end */\n\n  while(*dn) {\n    /* *dn is the length of the next label, non-zero */\n    if (np != name) {\n      if (np >= ne) goto toolong;\n      *np++ = '.';\n    }\n    le = dn + *dn + 1;\n    ++dn;\n    do {\n      switch(*dn) {\n      case '.':\n      case '\\\\':\n      /* Special modifiers in zone files. */\n      case '\"':\n      case ';':\n      case '@':\n      case '$':\n        if (np + 2 > ne) goto toolong;\n        *np++ = '\\\\';\n        *np++ = *dn;\n        break;\n      default:\n        if (*dn <= 0x20 || *dn >= 0x7f) {\n          /* \\ddd decimal notation */\n          if (np + 4 >= ne) goto toolong;\n          *np++ = '\\\\';\n          *np++ = '0' + (*dn / 100);\n          *np++ = '0' + ((*dn % 100) / 10);\n          *np++ = '0' + (*dn % 10);\n        }\n        else {\n          if (np >= ne) goto toolong;\n          *np++ = *dn;\n        }\n      }\n    } while(++dn < le);\n  }\n  if (np >= ne) goto toolong;\n  *np++ = '\\0';\n  return np - name;\ntoolong:\n  return namesiz >= DNS_MAXNAME ? -1 : 0;\n}\n\n#if 0\n#include <stdio.h>\n#include <stdlib.h>\n\nint main(int argc, char **argv) {\n  int i;\n  int sz;\n  dnsc_t dn[DNS_MAXDN+10];\n  dnsc_t *dl, *dp;\n  int isabs;\n\n  sz = (argc > 1) ? atoi(argv[1]) : 0;\n\n  for(i = 2; i < argc; ++i) {\n    int r = dns_ptodn(argv[i], 0, dn, sz, &isabs);\n    printf(\"%s: \", argv[i]);\n    if (r < 0) printf(\"error\\n\");\n    else if (!r) printf(\"buffer too small\\n\");\n    else {\n      printf(\"len=%d dnlen=%d size=%d name:\",\n             r, dns_dnlen(dn), dns_dntop_size(dn));\n      dl = dn;\n      while(*dl) {\n        printf(\" %d=\", *dl);\n        dp = dl + 1;\n        dl = dp + *dl;\n        while(dp < dl) {\n          if (*dp <= ' ' || *dp >= 0x7f)\n            printf(\"\\\\%03d\", *dp);\n          else if (*dp == '.' || *dp == '\\\\')\n            printf(\"\\\\%c\", *dp);\n          else\n            putchar(*dp);\n          ++dp;\n        }\n      }\n      if (isabs) putchar('.');\n      putchar('\\n');\n    }\n  }\n  return 0;\n}\n\n#endif /* TEST */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns_dntosp.c",
    "content": "/* udns_dntosp.c\n   dns_dntosp() = convert DN to asciiz string using static buffer\n\n   Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n */\n\n#include \"udns.h\"\n\nstatic char name[DNS_MAXNAME];\n\nconst char *dns_dntosp(dnscc_t *dn) {\n  return dns_dntop(dn, name, sizeof(name)) > 0 ? name : 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns_init.c",
    "content": "/* udns_init.c\n   resolver initialisation stuff\n\n   Copyright (C) 2006  Michael Tokarev <mjt@corpit.ru>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n */\n\n#ifdef HAVE_CONFIG_H\n# include \"config.h\"\n#endif\n#ifdef __MINGW32__\n# include <winsock2.h>          /* includes <windows.h> */\n# include <iphlpapi.h>\t\t/* for dns server addresses etc */\n#else\n# include <sys/types.h>\n# include <unistd.h>\n# include <fcntl.h>\n#endif\t/* !__MINGW32__ */\n\n#include <stdlib.h>\n#include <string.h>\n#include \"udns.h\"\n\n#define ISSPACE(x) (x == ' ' || x == '\\t' || x == '\\r' || x == '\\n')\n\nstatic const char space[] = \" \\t\\r\\n\";\n\nstatic void dns_set_serv_internal(struct dns_ctx *ctx, char *serv) {\n  dns_add_serv(ctx, NULL);\n  for(serv = strtok(serv, space); serv; serv = strtok(NULL, space))\n    dns_add_serv(ctx, serv);\n}\n\nstatic void dns_set_srch_internal(struct dns_ctx *ctx, char *srch) {\n  dns_add_srch(ctx, NULL);\n  for(srch = strtok(srch, space); srch; srch = strtok(NULL, space))\n    dns_add_srch(ctx, srch);\n}\n\n#ifdef __MINGW32__\n\n#define NO_IPHLPAPI\n\n#ifndef NO_IPHLPAPI\n/* Apparently, some systems does not have proper headers for IPHLPAIP to work.\n * The best is to upgrade headers, but here's another, ugly workaround for\n * this: compile with -DNO_IPHLPAPI.\n */\n\ntypedef DWORD (WINAPI *GetAdaptersAddressesFunc)(\n  ULONG Family, DWORD Flags, PVOID Reserved,\n  PIP_ADAPTER_ADDRESSES pAdapterAddresses,\n  PULONG pOutBufLen);\n\nstatic int dns_initns_iphlpapi(struct dns_ctx *ctx) {\n  HANDLE h_iphlpapi;\n  GetAdaptersAddressesFunc pfnGetAdAddrs;\n  PIP_ADAPTER_ADDRESSES pAddr, pAddrBuf;\n  PIP_ADAPTER_DNS_SERVER_ADDRESS pDnsAddr;\n  ULONG ulOutBufLen;\n  DWORD dwRetVal;\n  int ret = -1;\n\n  h_iphlpapi = LoadLibrary(\"iphlpapi.dll\");\n  if (!h_iphlpapi)\n    return -1;\n  pfnGetAdAddrs = (GetAdaptersAddressesFunc)\n    GetProcAddress(h_iphlpapi, \"GetAdaptersAddresses\");\n  if (!pfnGetAdAddrs) goto freelib;\n  ulOutBufLen = 0;\n  dwRetVal = pfnGetAdAddrs(AF_UNSPEC, 0, NULL, NULL, &ulOutBufLen);\n  if (dwRetVal != ERROR_BUFFER_OVERFLOW) goto freelib;\n  pAddrBuf = malloc(ulOutBufLen);\n  if (!pAddrBuf) goto freelib;\n  dwRetVal = pfnGetAdAddrs(AF_UNSPEC, 0, NULL, pAddrBuf, &ulOutBufLen);\n  if (dwRetVal != ERROR_SUCCESS) goto freemem;\n  for (pAddr = pAddrBuf; pAddr; pAddr = pAddr->Next)\n    for (pDnsAddr = pAddr->FirstDnsServerAddress;\n\t pDnsAddr;\n\t pDnsAddr = pDnsAddr->Next)\n      dns_add_serv_s(ctx, pDnsAddr->Address.lpSockaddr);\n  ret = 0;\nfreemem:\n  free(pAddrBuf);\nfreelib:\n  FreeLibrary(h_iphlpapi);\n  return ret;\n}\n\n#else /* NO_IPHLPAPI */\n\n#define dns_initns_iphlpapi(ctx) (-1)\n\n#endif /* NO_IPHLPAPI */\n\nstatic int dns_initns_registry(struct dns_ctx *ctx) {\n  LONG res;\n  HKEY hk;\n  DWORD type = REG_EXPAND_SZ | REG_SZ;\n  DWORD len;\n  char valBuf[1024];\n\n#define REGKEY_WINNT \"SYSTEM\\\\CurrentControlSet\\\\Services\\\\Tcpip\\\\Parameters\"\n#define REGKEY_WIN9x \"SYSTEM\\\\CurrentControlSet\\\\Services\\\\VxD\\\\MSTCP\"\n  res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGKEY_WINNT, 0, KEY_QUERY_VALUE, &hk);\n  if (res != ERROR_SUCCESS)\n    res = RegOpenKeyEx(HKEY_LOCAL_MACHINE, REGKEY_WIN9x,\n                       0, KEY_QUERY_VALUE, &hk);\n  if (res != ERROR_SUCCESS)\n    return -1;\n  len = sizeof(valBuf) - 1;\n  res = RegQueryValueEx(hk, \"NameServer\", NULL, &type, (BYTE*)valBuf, &len);\n  if (res != ERROR_SUCCESS || !len || !valBuf[0]) {\n    len = sizeof(valBuf) - 1;\n    res = RegQueryValueEx(hk, \"DhcpNameServer\", NULL, &type,\n                          (BYTE*)valBuf, &len);\n  }\n  RegCloseKey(hk);\n  if (res != ERROR_SUCCESS || !len || !valBuf[0])\n    return -1;\n  valBuf[len] = '\\0';\n  /* nameservers are stored as a whitespace-seperate list:\n   * \"192.168.1.1 123.21.32.12\" */\n  dns_set_serv_internal(ctx, valBuf);\n  return 0;\n}\n\n#else /* !__MINGW32__ */\n\nstatic int dns_init_resolvconf(struct dns_ctx *ctx) {\n  char *v;\n  char buf[2049];\t/* this buffer is used to hold /etc/resolv.conf */\n  int has_srch = 0;\n\n  /* read resolv.conf... */\n  { int fd = open(\"/etc/resolv.conf\", O_RDONLY);\n    if (fd >= 0) {\n      int l = read(fd, buf, sizeof(buf) - 1);\n      close(fd);\n      buf[l < 0 ? 0 : l] = '\\0';\n    }\n    else\n      buf[0] = '\\0';\n  }\n  if (buf[0]) {\t/* ...and parse it */\n    char *line, *nextline;\n    line = buf;\n    do {\n      nextline = strchr(line, '\\n');\n      if (nextline) *nextline++ = '\\0';\n      v = line;\n      while(*v && !ISSPACE(*v)) ++v;\n      if (!*v) continue;\n      *v++ = '\\0';\n      while(ISSPACE(*v)) ++v;\n      if (!*v) continue;\n      if (strcmp(line, \"domain\") == 0) {\n        dns_set_srch_internal(ctx, strtok(v, space));\n\thas_srch = 1;\n      }\n      else if (strcmp(line, \"search\") == 0) {\n        dns_set_srch_internal(ctx, v);\n\thas_srch = 1;\n      }\n      else if (strcmp(line, \"nameserver\") == 0)\n        dns_add_serv(ctx, strtok(v, space));\n      else if (strcmp(line, \"options\") == 0)\n        dns_set_opts(ctx, v);\n    } while((line = nextline) != NULL);\n  }\n\n  buf[sizeof(buf)-1] = '\\0';\n\n  /* get list of nameservers from env. vars. */\n  if ((v = getenv(\"NSCACHEIP\")) != NULL ||\n      (v = getenv(\"NAMESERVERS\")) != NULL) {\n    strncpy(buf, v, sizeof(buf) - 1);\n    dns_set_serv_internal(ctx, buf);\n  }\n  /* if $LOCALDOMAIN is set, use it for search list */\n  if ((v = getenv(\"LOCALDOMAIN\")) != NULL) {\n    strncpy(buf, v, sizeof(buf) - 1);\n    dns_set_srch_internal(ctx, buf);\n    has_srch = 1;\n  }\n  if ((v = getenv(\"RES_OPTIONS\")) != NULL)\n    dns_set_opts(ctx, v);\n\n  /* if still no search list, use local domain name */\n  if (has_srch &&\n      gethostname(buf, sizeof(buf) - 1) == 0 &&\n      (v = strchr(buf, '.')) != NULL &&\n      *++v != '\\0')\n    dns_add_srch(ctx, v);\n\n  return 0;\n}\n\n#endif /* !__MINGW32__ */\n\nint dns_init(struct dns_ctx *ctx, int do_open) {\n  if (!ctx)\n    ctx = &dns_defctx;\n  dns_reset(ctx);\n\n#ifdef __MINGW32__\n  if (dns_initns_iphlpapi(ctx) != 0)\n    dns_initns_registry(ctx);\n  /*XXX __MINGW32__: probably good to get default domain and search list too...\n   * And options.  Something is in registry. */\n  /*XXX __MINGW32__: maybe environment variables are also useful? */\n#else\n  dns_init_resolvconf(ctx);\n#endif\n\n  return do_open ? dns_open(ctx) : 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns_jran.c",
    "content": "/* udns_jran.c: small non-cryptographic random number generator\n * taken from http://burtleburtle.net/bob/rand/smallprng.html\n * by Bob Jenkins, Public domain.\n */\n\n#include \"udns.h\"\n\n#define rot32(x,k) (((x) << (k)) | ((x) >> (32-(k))))\n#define rot64(x,k) (((x) << (k)) | ((x) >> (64-(k))))\n#define tr32(x) ((x)&0xffffffffu)\n\nunsigned udns_jranval(struct udns_jranctx *x) {\n  /* This routine can be made to work with either 32 or 64bit words -\n   * if JRAN_32_64 is defined when compiling the file.\n   * We use if() instead of #if since there's no good\n   * portable way to check sizeof() in preprocessor without\n   * introducing some ugly configure-time checks.\n   * Most compilers will optimize the wrong branches away anyway.\n   * By default it assumes 32bit integers\n   */\n#ifdef JRAN_32_64\n  if (sizeof(unsigned) == 4) {\n#endif\n    unsigned e = tr32(x->a - rot32(x->b, 27));\n    x->a = tr32(x->b ^ rot32(x->c, 17));\n    x->b = tr32(x->c + x->d);\n    x->c = tr32(x->d + e);\n    x->d = tr32(e + x->a);\n#ifdef JRAN_32_64\n  }\n  else if (sizeof(unsigned) == 8) { /* assuming it's 64bits */\n    unsigned e = x->a - rot64(x->b, 7);\n    x->a = x->b ^ rot64(x->c, 13);\n    x->b = x->c + rot64(x->d, 37);\n    x->c = x->d + e;\n    x->d = e + x->a;\n  }\n  else {\n    unsigned e = 0;\n    x->d = 1/e; /* bail */\n  }\n#endif\n  return x->d;\n}\n\nvoid udns_jraninit(struct udns_jranctx *x, unsigned seed) {\n  unsigned i;\n  x->a = 0xf1ea5eed;\n  x->b = x->c = x->d = seed;\n  for (i = 0; i < 20; ++i)\n     (void)udns_jranval(x);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns_misc.c",
    "content": "/* udns_misc.c\n   miscellaneous routines\n\n   Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n */\n\n#include \"udns.h\"\n\nint dns_findname(const struct dns_nameval *nv, const char *name) {\n  register const char *a, *b;\n  for(; nv->name; ++nv)\n    for(a = name, b = nv->name; ; ++a, ++b)\n      if (DNS_DNUC(*a) != *b) break;\n      else if (!*a) return nv->val;\n  return -1;\n}\n\nconst char *_dns_format_code(char *buf, const char *prefix, int code) {\n  char *bp = buf;\n  unsigned c, n;\n  do *bp++ = DNS_DNUC(*prefix);\n  while(*++prefix);\n  *bp++ = '#';\n  if (code < 0) code = -code, *bp++ = '-';\n  n = 0; c = code;\n  do ++n;\n  while((c /= 10));\n  c = code;\n  bp[n--] = '\\0';\n  do bp[n--] = c % 10 + '0';\n  while((c /= 10));\n  return buf;\n}\n\nconst char *dns_strerror(int err) {\n  if (err >= 0) return \"successeful completion\";\n  switch(err) {\n  case DNS_E_TEMPFAIL:\treturn \"temporary failure in name resolution\";\n  case DNS_E_PROTOCOL:\treturn \"protocol error\";\n  case DNS_E_NXDOMAIN:\treturn \"domain name does not exist\";\n  case DNS_E_NODATA:\treturn \"valid domain but no data of requested type\";\n  case DNS_E_NOMEM:\treturn \"out of memory\";\n  case DNS_E_BADQUERY:\treturn \"malformed query\";\n  default:\t\treturn \"unknown error\";\n  }\n}\n\nconst char *dns_version(void) {\n  return UDNS_VERSION;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns_parse.c",
    "content": "/* udns_parse.c\n   raw DNS packet parsing routines\n\n   Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n */\n\n#include <string.h>\n#include <assert.h>\n#include \"udns.h\"\n\ndnscc_t *dns_skipdn(dnscc_t *cur, dnscc_t *end) {\n  unsigned c;\n  for(;;) {\n    if (cur >= end)\n      return NULL;\n    c = *cur++;\n    if (!c)\n      return cur;\n    if (c & 192)\t\t/* jump */\n      return cur + 1 >= end ? NULL : cur + 1;\n    cur += c;\n  }\n}\n\nint\ndns_getdn(dnscc_t *pkt, dnscc_t **cur, dnscc_t *end,\n          register dnsc_t *dn, unsigned dnsiz) {\n  unsigned c;\n  dnscc_t *pp = *cur;\t\t/* current packet pointer */\n  dnsc_t *dp = dn;\t\t/* current dn pointer */\n  dnsc_t *const de\t\t/* end of the DN dest */\n       = dn + (dnsiz < DNS_MAXDN ? dnsiz : DNS_MAXDN);\n  dnscc_t *jump = NULL;\t\t/* ptr after first jump if any */\n  unsigned loop = 100;\t\t/* jump loop counter */\n\n  for(;;) {\t\t/* loop by labels */\n    if (pp >= end)\t\t/* reached end of packet? */\n      return -1;\n    c = *pp++;\t\t\t/* length of the label */\n    if (!c) {\t\t\t/* empty label: terminate */\n      if (dn >= de)\t\t/* can't fit terminator */\n        goto noroom;\n      *dp++ = 0;\n      /* return next pos: either after the first jump or current */\n      *cur = jump ? jump : pp;\n      return dp - dn;\n    }\n    if (c & 192) {\t\t/* jump */\n      if (pp >= end)\t\t/* eop instead of jump pos */\n        return -1;\n      if (!jump) jump = pp + 1;\t/* remember first jump */\n      else if (!--loop) return -1; /* too many jumps */\n      c = ((c & ~192) << 8) | *pp; /* new pos */\n      if (c < DNS_HSIZE)\t/* don't allow jump into the header */\n        return -1;\n      pp = pkt + c;\n      continue;\n    }\n    if (c > DNS_MAXLABEL)\t/* too long label? */\n      return -1;\n    if (pp + c > end)\t\t/* label does not fit in packet? */\n      return -1;\n    if (dp + c + 1 > de)\t/* if enouth room for the label */\n      goto noroom;\n    *dp++ = c;\t\t\t/* label length */\n    memcpy(dp, pp, c);\t\t/* and the label itself */\n    dp += c;\n    pp += c;\t\t\t/* advance to the next label */\n  }\nnoroom:\n  return dnsiz < DNS_MAXDN ? 0 : -1;\n}\n\nvoid dns_rewind(struct dns_parse *p, dnscc_t *qdn) {\n  p->dnsp_qdn = qdn;\n  p->dnsp_cur = p->dnsp_ans;\n  p->dnsp_rrl = dns_numan(p->dnsp_pkt);\n  p->dnsp_ttl = 0xffffffffu;\n  p->dnsp_nrr = 0;\n}\n\nvoid\ndns_initparse(struct dns_parse *p, dnscc_t *qdn,\n              dnscc_t *pkt, dnscc_t *cur, dnscc_t *end) {\n  p->dnsp_pkt = pkt;\n  p->dnsp_end = end;\n  p->dnsp_rrl = dns_numan(pkt);\n  p->dnsp_qdn = qdn;\n  assert(cur + 4 <= end);\n  if ((p->dnsp_qtyp = dns_get16(cur+0)) == DNS_T_ANY) p->dnsp_qtyp = 0;\n  if ((p->dnsp_qcls = dns_get16(cur+2)) == DNS_C_ANY) p->dnsp_qcls = 0;\n  p->dnsp_cur = p->dnsp_ans = cur + 4;\n  p->dnsp_ttl = 0xffffffffu;\n  p->dnsp_nrr = 0;\n}\n\nint dns_nextrr(struct dns_parse *p, struct dns_rr *rr) {\n  dnscc_t *cur = p->dnsp_cur;\n  while(p->dnsp_rrl > 0) {\n    --p->dnsp_rrl;\n    if (dns_getdn(p->dnsp_pkt, &cur, p->dnsp_end,\n                  rr->dnsrr_dn, sizeof(rr->dnsrr_dn)) <= 0)\n      return -1;\n    if (cur + 10 > p->dnsp_end)\n      return -1;\n    rr->dnsrr_typ = dns_get16(cur);\n    rr->dnsrr_cls = dns_get16(cur+2);\n    rr->dnsrr_ttl = dns_get32(cur+4);\n    rr->dnsrr_dsz = dns_get16(cur+8);\n    rr->dnsrr_dptr = cur = cur + 10;\n    rr->dnsrr_dend = cur = cur + rr->dnsrr_dsz;\n    if (cur > p->dnsp_end)\n      return -1;\n    if (p->dnsp_qdn && !dns_dnequal(p->dnsp_qdn, rr->dnsrr_dn))\n      continue;\n    if ((!p->dnsp_qcls || p->dnsp_qcls == rr->dnsrr_cls) &&\n        (!p->dnsp_qtyp || p->dnsp_qtyp == rr->dnsrr_typ)) {\n      p->dnsp_cur = cur;\n      ++p->dnsp_nrr;\n      if (p->dnsp_ttl > rr->dnsrr_ttl) p->dnsp_ttl = rr->dnsrr_ttl;\n      return 1;\n    }\n    if (p->dnsp_qdn && rr->dnsrr_typ == DNS_T_CNAME && !p->dnsp_nrr) {\n      if (dns_getdn(p->dnsp_pkt, &rr->dnsrr_dptr, p->dnsp_end,\n                    p->dnsp_dnbuf, sizeof(p->dnsp_dnbuf)) <= 0 ||\n          rr->dnsrr_dptr != rr->dnsrr_dend)\n        return -1;\n      p->dnsp_qdn = p->dnsp_dnbuf;\n      if (p->dnsp_ttl > rr->dnsrr_ttl) p->dnsp_ttl = rr->dnsrr_ttl;\n    }\n  }\n  p->dnsp_cur = cur;\n  return 0;\n}\n\nint dns_stdrr_size(const struct dns_parse *p) {\n  return\n    dns_dntop_size(p->dnsp_qdn) +\n    (p->dnsp_qdn == dns_payload(p->dnsp_pkt) ? 0 :\n     dns_dntop_size(dns_payload(p->dnsp_pkt)));\n}\n\nvoid *dns_stdrr_finish(struct dns_rr_null *ret, char *cp,\n                       const struct dns_parse *p) {\n  cp += dns_dntop(p->dnsp_qdn, (ret->dnsn_cname = cp), DNS_MAXNAME);\n  if (p->dnsp_qdn == dns_payload(p->dnsp_pkt))\n    ret->dnsn_qname = ret->dnsn_cname;\n  else\n    dns_dntop(dns_payload(p->dnsp_pkt), (ret->dnsn_qname = cp), DNS_MAXNAME);\n  ret->dnsn_ttl = p->dnsp_ttl;\n  return ret;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns_resolver.c",
    "content": "/* udns_resolver.c\n   resolver stuff (main module)\n\n   Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n */\n\n#ifdef HAVE_CONFIG_H\n# include \"config.h\"\n#endif\n#ifdef __MINGW32__\n# include <winsock2.h>          /* includes <windows.h> */\n# include <ws2tcpip.h>          /* needed for struct in6_addr */\n#else\n# include <sys/types.h>\n# include <sys/socket.h>\n# include <netinet/in.h>\n# include <unistd.h>\n# include <fcntl.h>\n# include <sys/time.h>\n# ifdef HAVE_POLL\n#  include <sys/poll.h>\n# else\n#  ifdef HAVE_SYS_SELECT_H\n#   include <sys/select.h>\n#  endif\n# endif\n# ifdef HAVE_TIMES\n#  include <sys/times.h>\n# endif\n# define closesocket(sock) close(sock)\n#endif\t/* !__MINGW32__ */\n\n#include <stdlib.h>\n#include <string.h>\n#include <time.h>\n#include <errno.h>\n#include <assert.h>\n#include <stddef.h>\n#include \"udns.h\"\n\n#ifndef EAFNOSUPPORT\n# define EAFNOSUPPORT EINVAL\n#endif\n#ifndef MSG_DONTWAIT\n# define MSG_DONTWAIT 0\n#endif\n\nstruct dns_qlist {\n  struct dns_query *head, *tail;\n};\n\nstruct dns_query {\n  struct dns_query *dnsq_next;          /* double-linked list */\n  struct dns_query *dnsq_prev;\n  unsigned dnsq_origdnl0;\t\t/* original query DN len w/o last 0 */\n  unsigned dnsq_flags;\t\t\t/* control flags for this query */\n  unsigned dnsq_servi;\t\t\t/* index of next server to try */\n  unsigned dnsq_servwait;\t\t/* bitmask: servers left to wait */\n  unsigned dnsq_servskip;\t\t/* bitmask: servers to skip */\n  unsigned dnsq_servnEDNS0;\t\t/* bitmask: servers refusing EDNS0 */\n  unsigned dnsq_try;\t\t\t/* number of tries made so far */\n  dnscc_t *dnsq_nxtsrch;\t\t/* next search pointer @dnsc_srchbuf */\n  time_t dnsq_deadline;\t\t\t/* when current try will expire */\n  dns_parse_fn *dnsq_parse;\t\t/* parse: raw => application */\n  dns_query_fn *dnsq_cbck;\t\t/* the callback to call when done */\n  void *dnsq_cbdata;\t\t\t/* user data for the callback */\n#ifndef NDEBUG\n  struct dns_ctx *dnsq_ctx;\t\t/* the resolver context */\n#endif\n  /* char fields at the end to avoid padding */\n  dnsc_t dnsq_id[2];\t\t\t/* query ID */\n  dnsc_t dnsq_typcls[4];\t\t/* requested RR type+class */\n  dnsc_t dnsq_dn[DNS_MAXDN+DNS_DNPAD];\t/* the query DN +alignment */\n};\n\n/* working with dns_query lists */\n\nstatic __inline void qlist_init(struct dns_qlist *list) {\n  list->head = list->tail = NULL;\n}\n\nstatic __inline void qlist_remove(struct dns_qlist *list, struct dns_query *q) {\n   if (q->dnsq_prev) q->dnsq_prev->dnsq_next = q->dnsq_next;\n   else list->head = q->dnsq_next;\n   if (q->dnsq_next) q->dnsq_next->dnsq_prev = q->dnsq_prev;\n   else list->tail = q->dnsq_prev;\n}\n\nstatic __inline void\nqlist_add_head(struct dns_qlist *list, struct dns_query *q) {\n  q->dnsq_next = list->head;\n  if (list->head) list->head->dnsq_prev = q;\n  else list->tail = q;\n  list->head = q;\n  q->dnsq_prev = NULL;\n}\n\nstatic __inline void\nqlist_insert_after(struct dns_qlist *list,\n                   struct dns_query *q, struct dns_query *prev) {\n  if ((q->dnsq_prev = prev) != NULL) {\n    if ((q->dnsq_next = prev->dnsq_next) != NULL)\n      q->dnsq_next->dnsq_prev = q;\n    else\n      list->tail = q;\n    prev->dnsq_next = q;\n  }\n  else\n    qlist_add_head(list, q);\n}\n\nstruct sockaddr_ns {\n  union {\n    struct sockaddr sa;\n    struct sockaddr_in sin;\n#ifdef HAVE_IPv6\n    struct sockaddr_in6 sin6;\n#endif\n  };\n};\n\n#define sin_eq(a,b) \\\n\t((a).sin_port == (b).sin_port && \\\n\t (a).sin_addr.s_addr == (b).sin_addr.s_addr)\n#define sin6_eq(a,b) \\\n\t((a).sin6_port == (b).sin6_port && \\\n\t memcmp(&(a).sin6_addr, &(b).sin6_addr, sizeof(struct in6_addr)) == 0)\n\nstruct dns_ctx {\t\t/* resolver context */\n  /* settings */\n  unsigned dnsc_flags;\t\t\t/* various flags */\n  unsigned dnsc_timeout;\t\t/* timeout (base value) for queries */\n  unsigned dnsc_ntries;\t\t\t/* number of retries */\n  unsigned dnsc_ndots;\t\t\t/* ndots to assume absolute name */\n  unsigned dnsc_port;\t\t\t/* default port (DNS_PORT) */\n  unsigned dnsc_udpbuf;\t\t\t/* size of UDP buffer */\n  /* array of nameserver addresses */\n  struct sockaddr_ns dnsc_serv[DNS_MAXSERV];\n  unsigned dnsc_nserv;\t\t\t/* number of nameservers */\n  unsigned dnsc_salen;\t\t\t/* length of socket addresses */\n  dnsc_t dnsc_srchbuf[1024];\t\t/* buffer for searchlist */\n  dnsc_t *dnsc_srchend;\t\t\t/* current end of srchbuf */\n\n  dns_utm_fn *dnsc_utmfn;\t\t/* register/cancel timer events */\n  void *dnsc_utmctx;\t\t\t/* user timer context for utmfn() */\n  time_t dnsc_utmexp;\t\t\t/* when user timer expires */\n\n  dns_dbgfn *dnsc_udbgfn;\t\t/* debugging function */\n\n  /* dynamic data */\n  struct udns_jranctx dnsc_jran;\t/* random number generator state */\n  unsigned dnsc_nextid;\t\t\t/* next queue ID to use if !0 */\n  int dnsc_udpsock;\t\t\t/* UDP socket */\n  struct dns_qlist dnsc_qactive;\t/* active list sorted by deadline */\n  int dnsc_nactive;\t\t\t/* number entries in dnsc_qactive */\n  dnsc_t *dnsc_pbuf;\t\t\t/* packet buffer (udpbuf size) */\n  int dnsc_qstatus;\t\t\t/* last query status value */\n};\n\nstatic const struct {\n  const char *name;\n  enum dns_opt opt;\n  unsigned offset;\n  unsigned min, max;\n} dns_opts[] = {\n#define opt(name,opt,field,min,max) \\\n\t{name,opt,offsetof(struct dns_ctx,field),min,max}\n  opt(\"retrans\", DNS_OPT_TIMEOUT, dnsc_timeout, 1,300),\n  opt(\"timeout\", DNS_OPT_TIMEOUT, dnsc_timeout, 1,300),\n  opt(\"retry\",    DNS_OPT_NTRIES, dnsc_ntries, 1,50),\n  opt(\"attempts\", DNS_OPT_NTRIES, dnsc_ntries, 1,50),\n  opt(\"ndots\", DNS_OPT_NDOTS, dnsc_ndots, 0,1000),\n  opt(\"port\", DNS_OPT_PORT, dnsc_port, 1,0xffff),\n  opt(\"udpbuf\", DNS_OPT_UDPSIZE, dnsc_udpbuf, DNS_MAXPACKET,65536),\n#undef opt\n};\n#define dns_ctxopt(ctx,idx) (*((unsigned*)(((char*)ctx)+dns_opts[idx].offset)))\n\n#define ISSPACE(x) (x == ' ' || x == '\\t' || x == '\\r' || x == '\\n')\n\nstruct dns_ctx dns_defctx;\n\n#define SETCTX(ctx) if (!ctx) ctx = &dns_defctx\n#define SETCTXINITED(ctx) SETCTX(ctx); assert(CTXINITED(ctx))\n#define CTXINITED(ctx) (ctx->dnsc_flags & DNS_INITED)\n#define SETCTXFRESH(ctx) SETCTXINITED(ctx); assert(!CTXOPEN(ctx))\n#define SETCTXINACTIVE(ctx) \\\n\t\tSETCTXINITED(ctx); assert(!ctx->dnsc_nactive)\n#define SETCTXOPEN(ctx) SETCTXINITED(ctx); assert(CTXOPEN(ctx))\n#define CTXOPEN(ctx) (ctx->dnsc_udpsock >= 0)\n\n#if defined(NDEBUG) || !defined(DEBUG)\n#define dns_assert_ctx(ctx)\n#else\nstatic void dns_assert_ctx(const struct dns_ctx *ctx) {\n  int nactive = 0;\n  const struct dns_query *q;\n  for(q = ctx->dnsc_qactive.head; q; q = q->dnsq_next) {\n    assert(q->dnsq_ctx == ctx);\n    assert(q == (q->dnsq_next ?\n                 q->dnsq_next->dnsq_prev : ctx->dnsc_qactive.tail));\n    assert(q == (q->dnsq_prev ?\n                 q->dnsq_prev->dnsq_next : ctx->dnsc_qactive.head));\n    ++nactive;\n  }\n  assert(nactive == ctx->dnsc_nactive);\n}\n#endif\n\nenum {\n  DNS_INTERNAL\t\t= 0xffff, /* internal flags mask */\n  DNS_INITED\t\t= 0x0001, /* the context is initialized */\n  DNS_ASIS_DONE\t\t= 0x0002, /* search: skip the last as-is query */\n  DNS_SEEN_NODATA\t= 0x0004, /* search: NODATA has been received */\n};\n\nint dns_add_serv(struct dns_ctx *ctx, const char *serv) {\n  struct sockaddr_ns *sns;\n  SETCTXFRESH(ctx);\n  if (!serv)\n    return (ctx->dnsc_nserv = 0);\n  if (ctx->dnsc_nserv >= DNS_MAXSERV)\n    return errno = ENFILE, -1;\n  sns = &ctx->dnsc_serv[ctx->dnsc_nserv];\n  memset(sns, 0, sizeof(*sns));\n  if (dns_pton(AF_INET, serv, &sns->sin.sin_addr) > 0) {\n    sns->sin.sin_family = AF_INET;\n    return ++ctx->dnsc_nserv;\n  }\n#ifdef HAVE_IPv6\n  if (dns_pton(AF_INET6, serv, &sns->sin6.sin6_addr) > 0) {\n    sns->sin6.sin6_family = AF_INET6;\n    return ++ctx->dnsc_nserv;\n  }\n#endif\n  errno = EINVAL;\n  return -1;\n}\n\nint dns_add_serv_s(struct dns_ctx *ctx, const struct sockaddr *sa) {\n  SETCTXFRESH(ctx);\n  if (!sa)\n    return (ctx->dnsc_nserv = 0);\n  if (ctx->dnsc_nserv >= DNS_MAXSERV)\n    return errno = ENFILE, -1;\n#ifdef HAVE_IPv6\n  else if (sa->sa_family == AF_INET6)\n    ctx->dnsc_serv[ctx->dnsc_nserv].sin6 = *(struct sockaddr_in6*)sa;\n#endif\n  else if (sa->sa_family == AF_INET)\n    ctx->dnsc_serv[ctx->dnsc_nserv].sin = *(struct sockaddr_in*)sa;\n  else\n    return errno = EAFNOSUPPORT, -1;\n  return ++ctx->dnsc_nserv;\n}\n\nint dns_set_opts(struct dns_ctx *ctx, const char *opts) {\n  unsigned i, v;\n  int err = 0;\n  SETCTXINACTIVE(ctx);\n  for(;;) {\n    while(ISSPACE(*opts)) ++opts;\n    if (!*opts) break;\n    for(i = 0; ; ++i) {\n      if (i >= sizeof(dns_opts)/sizeof(dns_opts[0])) { ++err; break; }\n      v = strlen(dns_opts[i].name);\n      if (strncmp(dns_opts[i].name, opts, v) != 0 ||\n          (opts[v] != ':' && opts[v] != '='))\n        continue;\n      opts += v + 1;\n      v = 0;\n      if (*opts < '0' || *opts > '9') { ++err; break; }\n      do v = v * 10 + (*opts++ - '0');\n      while (*opts >= '0' && *opts <= '9');\n      if (v < dns_opts[i].min) v = dns_opts[i].min;\n      if (v > dns_opts[i].max) v = dns_opts[i].max;\n      dns_ctxopt(ctx, i) = v;\n      break;\n    }\n    while(*opts && !ISSPACE(*opts)) ++opts;\n  }\n  return err;\n}\n\nint dns_set_opt(struct dns_ctx *ctx, enum dns_opt opt, int val) {\n  int prev;\n  unsigned i;\n  SETCTXINACTIVE(ctx);\n  for(i = 0; i < sizeof(dns_opts)/sizeof(dns_opts[0]); ++i) {\n    if (dns_opts[i].opt != opt) continue;\n    prev = dns_ctxopt(ctx, i);\n    if (val >= 0) {\n      unsigned v = val;\n      if (v < dns_opts[i].min || v > dns_opts[i].max) {\n        errno = EINVAL;\n        return -1;\n      }\n      dns_ctxopt(ctx, i) = v;\n    }\n    return prev;\n  }\n  if (opt == DNS_OPT_FLAGS) {\n    prev = ctx->dnsc_flags & ~DNS_INTERNAL;\n    if (val >= 0)\n      ctx->dnsc_flags =\n        (ctx->dnsc_flags & DNS_INTERNAL) | (val & ~DNS_INTERNAL);\n    return prev;\n  }\n  errno = ENOSYS;\n  return -1;\n}\n\nint dns_add_srch(struct dns_ctx *ctx, const char *srch) {\n  int dnl;\n  SETCTXINACTIVE(ctx);\n  if (!srch) {\n    memset(ctx->dnsc_srchbuf, 0, sizeof(ctx->dnsc_srchbuf));\n    ctx->dnsc_srchend = ctx->dnsc_srchbuf;\n    return 0;\n  }\n  dnl =\n    sizeof(ctx->dnsc_srchbuf) - (ctx->dnsc_srchend - ctx->dnsc_srchbuf) - 1;\n  dnl = dns_sptodn(srch, ctx->dnsc_srchend, dnl);\n  if (dnl > 0)\n    ctx->dnsc_srchend += dnl;\n  ctx->dnsc_srchend[0] = '\\0';\t/* we ensure the list is always ends at . */\n  if (dnl > 0)\n    return 0;\n  errno = EINVAL;\n  return -1;\n}\n\nstatic void dns_drop_utm(struct dns_ctx *ctx) {\n  if (ctx->dnsc_utmfn)\n    ctx->dnsc_utmfn(NULL, -1, ctx->dnsc_utmctx);\n  ctx->dnsc_utmctx = NULL;\n  ctx->dnsc_utmexp = -1;\n}\n\nstatic void\n_dns_request_utm(struct dns_ctx *ctx, time_t now) {\n  struct dns_query *q;\n  time_t deadline;\n  int timeout;\n  q = ctx->dnsc_qactive.head;\n  if (!q)\n    deadline = -1, timeout = -1;\n  else if (!now || q->dnsq_deadline <= now)\n    deadline = 0, timeout = 0;\n  else\n    deadline = q->dnsq_deadline, timeout = (int)(deadline - now);\n  if (ctx->dnsc_utmexp == deadline)\n    return;\n  ctx->dnsc_utmfn(ctx, timeout, ctx->dnsc_utmctx);\n  ctx->dnsc_utmexp = deadline;\n}\n\nstatic __inline void\ndns_request_utm(struct dns_ctx *ctx, time_t now) {\n  if (ctx->dnsc_utmfn)\n    _dns_request_utm(ctx, now);\n}\n\nvoid dns_set_dbgfn(struct dns_ctx *ctx, dns_dbgfn *dbgfn) {\n  SETCTXINITED(ctx);\n  ctx->dnsc_udbgfn = dbgfn;\n}\n\nvoid\ndns_set_tmcbck(struct dns_ctx *ctx, dns_utm_fn *fn, void *data) {\n  SETCTXINITED(ctx);\n  dns_drop_utm(ctx);\n  ctx->dnsc_utmfn = fn;\n  ctx->dnsc_utmctx = data;\n  if (CTXOPEN(ctx))\n    dns_request_utm(ctx, 0);\n}\n\nstatic unsigned dns_nonrandom_32(void) {\n#ifdef __MINGW32__\n  FILETIME ft;\n  GetSystemTimeAsFileTime(&ft);\n  return ft.dwLowDateTime;\n#else\n  struct timeval tv;\n  gettimeofday(&tv, NULL);\n  return tv.tv_usec;\n#endif\n}\n\n/* This is historic deprecated API */\nUDNS_API unsigned dns_random16(void);\nunsigned dns_random16(void) {\n  unsigned x = dns_nonrandom_32();\n  return (x ^ (x >> 16)) & 0xffff;\n}\n\nstatic void dns_init_rng(struct dns_ctx *ctx) {\n  udns_jraninit(&ctx->dnsc_jran, dns_nonrandom_32());\n  ctx->dnsc_nextid = 0;\n}\n\nvoid dns_close(struct dns_ctx *ctx) {\n  struct dns_query *q, *p;\n  SETCTX(ctx);\n  if (CTXINITED(ctx)) {\n    if (ctx->dnsc_udpsock >= 0)\n      closesocket(ctx->dnsc_udpsock);\n    ctx->dnsc_udpsock = -1;\n    if (ctx->dnsc_pbuf)\n      free(ctx->dnsc_pbuf);\n    ctx->dnsc_pbuf = NULL;\n    q = ctx->dnsc_qactive.head;\n    while((p = q) != NULL) {\n      q = q->dnsq_next;\n      free(p);\n    }\n    qlist_init(&ctx->dnsc_qactive);\n    ctx->dnsc_nactive = 0;\n    dns_drop_utm(ctx);\n  }\n}\n\nvoid dns_reset(struct dns_ctx *ctx) {\n  SETCTX(ctx);\n  dns_close(ctx);\n  memset(ctx, 0, sizeof(*ctx));\n  ctx->dnsc_timeout = 4;\n  ctx->dnsc_ntries = 3;\n  ctx->dnsc_ndots = 1;\n  ctx->dnsc_udpbuf = DNS_EDNS0PACKET;\n  ctx->dnsc_port = DNS_PORT;\n  ctx->dnsc_udpsock = -1;\n  ctx->dnsc_srchend = ctx->dnsc_srchbuf;\n  qlist_init(&ctx->dnsc_qactive);\n  dns_init_rng(ctx);\n  ctx->dnsc_flags = DNS_INITED;\n}\n\nstruct dns_ctx *dns_new(const struct dns_ctx *copy) {\n  struct dns_ctx *ctx;\n  SETCTXINITED(copy);\n  dns_assert_ctx(copy);\n  ctx = malloc(sizeof(*ctx));\n  if (!ctx)\n    return NULL;\n  *ctx = *copy;\n  ctx->dnsc_udpsock = -1;\n  qlist_init(&ctx->dnsc_qactive);\n  ctx->dnsc_nactive = 0;\n  ctx->dnsc_pbuf = NULL;\n  ctx->dnsc_qstatus = 0;\n  ctx->dnsc_srchend = ctx->dnsc_srchbuf +\n    (copy->dnsc_srchend - copy->dnsc_srchbuf);\n  ctx->dnsc_utmfn = NULL;\n  ctx->dnsc_utmctx = NULL;\n  dns_init_rng(ctx);\n  return ctx;\n}\n\nvoid dns_free(struct dns_ctx *ctx) {\n  assert(ctx != NULL && ctx != &dns_defctx);\n  dns_reset(ctx);\n  free(ctx);\n}\n\nint dns_open(struct dns_ctx *ctx) {\n  int sock;\n  unsigned i;\n  int port;\n  struct sockaddr_ns *sns;\n#ifdef HAVE_IPv6\n  unsigned have_inet6 = 0;\n#endif\n\n  SETCTXINITED(ctx);\n  assert(!CTXOPEN(ctx));\n\n  port = htons((unsigned short)ctx->dnsc_port);\n  /* ensure we have at least one server */\n  if (!ctx->dnsc_nserv) {\n    sns = ctx->dnsc_serv;\n    sns->sin.sin_family = AF_INET;\n    sns->sin.sin_addr.s_addr = htonl(INADDR_LOOPBACK);\n    ctx->dnsc_nserv = 1;\n  }\n\n  for (i = 0; i < ctx->dnsc_nserv; ++i) {\n    sns = &ctx->dnsc_serv[i];\n    /* set port for each sockaddr */\n#ifdef HAVE_IPv6\n    if (sns->sa.sa_family == AF_INET6) {\n      if (!sns->sin6.sin6_port) sns->sin6.sin6_port = (unsigned short)port;\n      ++have_inet6;\n    }\n    else\n#endif\n    {\n      assert(sns->sa.sa_family == AF_INET);\n      if (!sns->sin.sin_port) sns->sin.sin_port = (unsigned short)port;\n    }\n  }\n\n#ifdef HAVE_IPv6\n  if (have_inet6 && have_inet6 < ctx->dnsc_nserv) {\n    /* convert all IPv4 addresses to IPv6 V4MAPPED */\n    struct sockaddr_in6 sin6;\n    memset(&sin6, 0, sizeof(sin6));\n    sin6.sin6_family = AF_INET6;\n    /* V4MAPPED: ::ffff:1.2.3.4 */\n    sin6.sin6_addr.s6_addr[10] = 0xff;\n    sin6.sin6_addr.s6_addr[11] = 0xff;\n    for(i = 0; i < ctx->dnsc_nserv; ++i) {\n      sns = &ctx->dnsc_serv[i];\n      if (sns->sa.sa_family == AF_INET) {\n        sin6.sin6_port = sns->sin.sin_port;\n        memcpy(sin6.sin6_addr.s6_addr + 4*3, &sns->sin.sin_addr, 4);\n        sns->sin6 = sin6;\n      }\n    }\n  }\n\n  ctx->dnsc_salen = have_inet6 ?\n    sizeof(struct sockaddr_in6) : sizeof(struct sockaddr_in);\n\n  if (have_inet6)\n    sock = socket(PF_INET6, SOCK_DGRAM, IPPROTO_UDP);\n  else\n    sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);\n#else /* !HAVE_IPv6 */\n  sock = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP);\n  ctx->dnsc_salen = sizeof(struct sockaddr_in);\n#endif /* HAVE_IPv6 */\n\n  if (sock < 0) {\n    ctx->dnsc_qstatus = DNS_E_TEMPFAIL;\n    return -1;\n  }\n#ifdef __MINGW32__\n  { unsigned long on = 1;\n    if (ioctlsocket(sock, FIONBIO, &on) == SOCKET_ERROR) {\n      closesocket(sock);\n      ctx->dnsc_qstatus = DNS_E_TEMPFAIL;\n      return -1;\n    }\n  }\n#else\t/* !__MINGW32__ */\n  if (fcntl(sock, F_SETFL, fcntl(sock, F_GETFL) | O_NONBLOCK) < 0 ||\n      fcntl(sock, F_SETFD, FD_CLOEXEC) < 0) {\n    closesocket(sock);\n    ctx->dnsc_qstatus = DNS_E_TEMPFAIL;\n    return -1;\n  }\n#endif\t/* __MINGW32__ */\n  /* allocate the packet buffer */\n  if ((ctx->dnsc_pbuf = malloc(ctx->dnsc_udpbuf)) == NULL) {\n    closesocket(sock);\n    ctx->dnsc_qstatus = DNS_E_NOMEM;\n    errno = ENOMEM;\n    return -1;\n  }\n\n  ctx->dnsc_udpsock = sock;\n  dns_request_utm(ctx, 0);\n  return sock;\n}\n\nint dns_sock(const struct dns_ctx *ctx) {\n  SETCTXINITED(ctx);\n  return ctx->dnsc_udpsock;\n}\n\nint dns_active(const struct dns_ctx *ctx) {\n  SETCTXINITED(ctx);\n  dns_assert_ctx(ctx);\n  return ctx->dnsc_nactive;\n}\n\nint dns_status(const struct dns_ctx *ctx) {\n  SETCTX(ctx);\n  return ctx->dnsc_qstatus;\n}\nvoid dns_setstatus(struct dns_ctx *ctx, int status) {\n  SETCTX(ctx);\n  ctx->dnsc_qstatus = status;\n}\n\n/* End the query: disconnect it from the active list, free it,\n * and return the result to the caller.\n */\nstatic void\ndns_end_query(struct dns_ctx *ctx, struct dns_query *q,\n              int status, void *result) {\n  dns_query_fn *cbck = q->dnsq_cbck;\n  void *cbdata = q->dnsq_cbdata;\n  ctx->dnsc_qstatus = status;\n  assert((status < 0 && result == 0) || (status >= 0 && result != 0));\n  assert(cbck != 0);\t/*XXX callback may be NULL */\n  assert(ctx->dnsc_nactive > 0);\n  --ctx->dnsc_nactive;\n  qlist_remove(&ctx->dnsc_qactive, q);\n  /* force the query to be unconnected */\n  /*memset(q, 0, sizeof(*q));*/\n#ifndef NDEBUG\n  q->dnsq_ctx = NULL;\n#endif\n  free(q);\n  cbck(ctx, result, cbdata);\n}\n\n#define DNS_DBG(ctx, code, sa, slen, pkt, plen) \\\n  do { \\\n    if (ctx->dnsc_udbgfn) \\\n      ctx->dnsc_udbgfn(code, (sa), slen, pkt, plen, 0, 0); \\\n  } while(0)\n#define DNS_DBGQ(ctx, q, code, sa, slen, pkt, plen) \\\n  do { \\\n    if (ctx->dnsc_udbgfn) \\\n      ctx->dnsc_udbgfn(code, (sa), slen, pkt, plen, q, q->dnsq_cbdata); \\\n  } while(0)\n\nstatic void dns_newid(struct dns_ctx *ctx, struct dns_query *q) {\n  /* this is how we choose an identifier for a new query (qID).\n   * For now, it's just sequential number, incremented for every query, and\n   * thus obviously trivial to guess.\n   * There are two choices:\n   *  a) use sequential numbers.  It is plain insecure. In DNS, there are two\n   *   places where random numbers are (or can) be used to increase security:\n   *   random qID and random source port number.  Without this randomness\n   *   (udns uses fixed port for all queries), or when the randomness is weak,\n   *   it's trivial to spoof query replies.  With randomness however, it\n   *   becomes a bit more difficult task.  Too bad we only have 16 bits for\n   *   our security, as qID is only two bytes.  It isn't a security per se,\n   *   to rely on those 16 bits - an attacker can just flood us with fake\n   *   replies with all possible qIDs (only 65536 of them), and in this case,\n   *   even if we'll use true random qIDs, we'll be in trouble (not protected\n   *   against spoofing).  Yes, this is only possible on a high-speed network\n   *   (probably on the LAN only, since usually a border router for a LAN\n   *   protects internal machines from packets with spoofed local addresses\n   *   from outside, and usually a nameserver resides on LAN), but it's\n   *   still very well possible to send us fake replies.\n   *   In other words: there's nothing a DNS (stub) resolver can do against\n   *   spoofing attacks, unless DNSSEC is in use, which helps here alot.\n   *   Too bad that DNSSEC isn't widespread, so relying on it isn't an\n   *   option in almost all cases...\n   *  b) use random qID, based on some random-number generation mechanism.\n   *   This way, we increase our protection a bit (see above - it's very weak\n   *   still), but we also increase risk of qID reuse and matching late replies\n   *   that comes to queries we've sent before against new queries.  There are\n   *   some more corner cases around that, as well - for example, normally,\n   *   udns tries to find the query for a given reply by qID, *and* by\n   *   verifying that the query DN and other parameters are also the same\n   *   (so if the new query is against another domain name, old reply will\n   *   be ignored automatically).  But certain types of replies which we now\n   *   handle - for example, FORMERR reply from servers which refuses to\n   *   process EDNS0-enabled packets - comes without all the query parameters\n   *   but the qID - so we're forced to use qID only when determining which\n   *   query the given reply corresponds to.  This makes us even more\n   *   vulnerable to spoofing attacks, because an attacker don't even need to\n   *   know which queries we perform to spoof the replies - he only needs to\n   *   flood us with fake FORMERR \"replies\".\n   *\n   * That all to say: using sequential (or any other trivially guessable)\n   * numbers for qIDs is insecure, but the whole thing is inherently insecure\n   * as well, and this \"extra weakness\" that comes from weak qID choosing\n   * algorithm adds almost nothing to the underlying problem.\n   *\n   * It CAN NOT be made secure.  Period.  That's it.\n   * Unless we choose to implement DNSSEC, which is a whole different story.\n   * Forcing TCP mode makes it better, but who uses TCP for DNS anyway?\n   * (and it's hardly possible because of huge impact on the recursive\n   * nameservers).\n   *\n   * Note that ALL stub resolvers (again, unless they implement and enforce\n   * DNSSEC) suffers from this same problem.\n   *\n   * Here, I use a pseudo-random number generator for qIDs, instead of a\n   * simpler sequential IDs.  This is _not_ more secure than sequential\n   * ID, but some found random IDs more enjoyeable for some reason.  So\n   * here it goes.\n   */\n\n  /* Use random number and check if it's unique.\n   * If it's not, try again up to 5 times.\n   */\n  unsigned loop;\n  dnsc_t c0, c1;\n  for(loop = 0; loop < 5; ++loop) {\n    const struct dns_query *c;\n    if (!ctx->dnsc_nextid)\n      ctx->dnsc_nextid = udns_jranval(&ctx->dnsc_jran);\n    c0 = ctx->dnsc_nextid & 0xff;\n    c1 = (ctx->dnsc_nextid >> 8) & 0xff;\n    ctx->dnsc_nextid >>= 16;\n    for(c = ctx->dnsc_qactive.head; c; c = c->dnsq_next)\n      if (c->dnsq_id[0] == c0 && c->dnsq_id[1] == c1)\n        break; /* found such entry, try again */\n    if (!c)\n      break;\n  }\n  q->dnsq_id[0] = c0; q->dnsq_id[1] = c1;\n\n  /* reset all parameters relevant for previous query lifetime */\n  q->dnsq_try = 0;\n  q->dnsq_servi = 0;\n  /*XXX probably should keep dnsq_servnEDNS0 bits?\n   * See also comments in dns_ioevent() about FORMERR case */\n  q->dnsq_servwait = q->dnsq_servskip = q->dnsq_servnEDNS0 = 0;\n}\n\n/* Find next search suffix and fills in q->dnsq_dn.\n * Return 0 if no more to try. */\nstatic int dns_next_srch(struct dns_ctx *ctx, struct dns_query *q) {\n  unsigned dnl;\n\n  for(;;) {\n    if (q->dnsq_nxtsrch > ctx->dnsc_srchend)\n      return 0;\n    dnl = dns_dnlen(q->dnsq_nxtsrch);\n    if (dnl + q->dnsq_origdnl0 <= DNS_MAXDN &&\n        (*q->dnsq_nxtsrch || !(q->dnsq_flags & DNS_ASIS_DONE)))\n      break;\n    q->dnsq_nxtsrch += dnl;\n  }\n  memcpy(q->dnsq_dn + q->dnsq_origdnl0, q->dnsq_nxtsrch, dnl);\n  if (!*q->dnsq_nxtsrch)\n    q->dnsq_flags |= DNS_ASIS_DONE;\n  q->dnsq_nxtsrch += dnl;\n  dns_newid(ctx, q); /* new ID for new qDN */\n  return 1;\n}\n\n/* find the server to try for current iteration.\n * Note that current dnsq_servi may point to a server we should skip --\n * in that case advance to the next server.\n * Return true if found, false if all tried.\n */\nstatic int dns_find_serv(const struct dns_ctx *ctx, struct dns_query *q) {\n  while(q->dnsq_servi < ctx->dnsc_nserv) {\n    if (!(q->dnsq_servskip & (1 << q->dnsq_servi)))\n      return 1;\n    ++q->dnsq_servi;\n  }\n  return 0;\n}\n\n/* format and send the query to a given server.\n * In case of network problem (sendto() fails), return -1,\n * else return 0.\n */\nstatic int\ndns_send_this(struct dns_ctx *ctx, struct dns_query *q,\n              unsigned servi, time_t now) {\n  unsigned qlen;\n  unsigned tries;\n\n  { /* format the query buffer */\n    dnsc_t *p = ctx->dnsc_pbuf;\n    memset(p, 0, DNS_HSIZE);\n    if (!(q->dnsq_flags & DNS_NORD)) p[DNS_H_F1] |= DNS_HF1_RD;\n    if (q->dnsq_flags & DNS_AAONLY) p[DNS_H_F1] |= DNS_HF1_AA;\n    if (q->dnsq_flags & DNS_SET_CD) p[DNS_H_F2] |= DNS_HF2_CD;\n    p[DNS_H_QDCNT2] = 1;\n    memcpy(p + DNS_H_QID, q->dnsq_id, 2);\n    p = dns_payload(p);\n    /* copy query dn */\n    p += dns_dntodn(q->dnsq_dn, p, DNS_MAXDN);\n    /* query type and class */\n    memcpy(p, q->dnsq_typcls, 4); p += 4;\n    /* add EDNS0 record. DO flag requires it */\n    if (q->dnsq_flags & DNS_SET_DO ||\n        (ctx->dnsc_udpbuf > DNS_MAXPACKET &&\n         !(q->dnsq_servnEDNS0 & (1 << servi)))) {\n      *p++ = 0;\t\t\t/* empty (root) DN */\n      p = dns_put16(p, DNS_T_OPT);\n      p = dns_put16(p, ctx->dnsc_udpbuf);\n      /* EDNS0 RCODE & VERSION; rest of the TTL field; RDLEN */\n      memset(p, 0, 2+2+2);\n      if (q->dnsq_flags & DNS_SET_DO) p[2] |= DNS_EF1_DO;\n      p += 2+2+2;\n      ctx->dnsc_pbuf[DNS_H_ARCNT2] = 1;\n    }\n    qlen = p - ctx->dnsc_pbuf;\n    assert(qlen <= ctx->dnsc_udpbuf);\n  }\n\n  /* send the query */\n  tries = 10;\n  while (sendto(ctx->dnsc_udpsock, (void*)ctx->dnsc_pbuf, qlen, 0,\n                &ctx->dnsc_serv[servi].sa, ctx->dnsc_salen) < 0) {\n    /*XXX just ignore the sendto() error for now and try again.\n     * In the future, it may be possible to retrieve the error code\n     * and find which operation/query failed.\n     *XXX try the next server too? (if ENETUNREACH is returned immediately)\n     */\n    if (--tries) continue;\n    /* if we can't send the query, fail it. */\n    dns_end_query(ctx, q, DNS_E_TEMPFAIL, 0);\n    return -1;\n  }\n  DNS_DBGQ(ctx, q, 1,\n           &ctx->dnsc_serv[servi].sa, sizeof(struct sockaddr_ns),\n           ctx->dnsc_pbuf, qlen);\n  q->dnsq_servwait |= 1 << servi;\t/* expect reply from this ns */\n\n  q->dnsq_deadline = now +\n    (dns_find_serv(ctx, q) ? 1 : ctx->dnsc_timeout << q->dnsq_try);\n\n  /* move the query to the proper place, according to the new deadline */\n  qlist_remove(&ctx->dnsc_qactive, q);\n  { /* insert from the tail */\n    struct dns_query *p;\n    for(p = ctx->dnsc_qactive.tail; p; p = p->dnsq_prev)\n      if (p->dnsq_deadline <= q->dnsq_deadline)\n\tbreak;\n    qlist_insert_after(&ctx->dnsc_qactive, q, p);\n  }\n\n  return 0;\n}\n\n/* send the query out using next available server\n * and add it to the active list, or, if no servers available,\n * end it.\n */\nstatic void\ndns_send(struct dns_ctx *ctx, struct dns_query *q, time_t now) {\n\n  /* if we can't send the query, return TEMPFAIL even when searching:\n   * we can't be sure whenever the name we tried to search exists or not,\n   * so don't continue searching, or we may find the wrong name. */\n\n  if (!dns_find_serv(ctx, q)) {\n    /* no more servers in this iteration.  Try the next cycle */\n    q->dnsq_servi = 0;\t/* reset */\n    q->dnsq_try++;\t/* next try */\n    if (q->dnsq_try >= ctx->dnsc_ntries ||\n        !dns_find_serv(ctx, q)) {\n      /* no more servers and tries, fail the query */\n      /* return TEMPFAIL even when searching: no more tries for this\n       * searchlist, and no single definitive reply (handled in dns_ioevent()\n       * in NOERROR or NXDOMAIN cases) => all nameservers failed to process\n       * current search list element, so we don't know whenever the name exists.\n       */\n      dns_end_query(ctx, q, DNS_E_TEMPFAIL, 0);\n      return;\n    }\n  }\n\n  dns_send_this(ctx, q, q->dnsq_servi++, now);\n}\n\nstatic void dns_dummy_cb(struct dns_ctx *ctx, void *result, void *data) {\n  if (result) free(result);\n  data = ctx = 0;\t/* used */\n}\n\n/* The (only, main, real) query submission routine.\n * Allocate new query structure, initialize it, check validity of\n * parameters, and add it to the head of the active list, without\n * trying to send it (to be picked up on next event).\n * Error return (without calling the callback routine) -\n *  no memory or wrong parameters.\n *XXX The `no memory' case probably should go to the callback anyway...\n */\nstruct dns_query *\ndns_submit_dn(struct dns_ctx *ctx,\n              dnscc_t *dn, int qcls, int qtyp, int flags,\n              dns_parse_fn *parse, dns_query_fn *cbck, void *data) {\n  struct dns_query *q;\n  SETCTXOPEN(ctx);\n  dns_assert_ctx(ctx);\n\n  q = calloc(sizeof(*q), 1);\n  if (!q) {\n    ctx->dnsc_qstatus = DNS_E_NOMEM;\n    return NULL;\n  }\n\n#ifndef NDEBUG\n  q->dnsq_ctx = ctx;\n#endif\n  q->dnsq_parse = parse;\n  q->dnsq_cbck = cbck ? cbck : dns_dummy_cb;\n  q->dnsq_cbdata = data;\n\n  q->dnsq_origdnl0 = dns_dntodn(dn, q->dnsq_dn, sizeof(q->dnsq_dn));\n  assert(q->dnsq_origdnl0 > 0);\n  --q->dnsq_origdnl0;\t\t/* w/o the trailing 0 */\n  dns_put16(q->dnsq_typcls+0, qtyp);\n  dns_put16(q->dnsq_typcls+2, qcls);\n  q->dnsq_flags = (flags | ctx->dnsc_flags) & ~DNS_INTERNAL;\n\n  if (flags & DNS_NOSRCH ||\n      dns_dnlabels(q->dnsq_dn) > ctx->dnsc_ndots) {\n    q->dnsq_nxtsrch = flags & DNS_NOSRCH ?\n      ctx->dnsc_srchend /* end of the search list if no search requested */ :\n      ctx->dnsc_srchbuf /* beginning of the list, but try as-is first */;\n    q->dnsq_flags |= DNS_ASIS_DONE;\n    dns_newid(ctx, q);\n  }\n  else {\n    q->dnsq_nxtsrch = ctx->dnsc_srchbuf;\n    dns_next_srch(ctx, q);\n  }\n\n  /* q->dnsq_deadline is set to 0 (calloc above): the new query is\n   * \"already expired\" when first inserted into queue, so it's safe\n   * to insert it into the head of the list.  Next call to dns_timeouts()\n   * will actually send it.\n   */\n  qlist_add_head(&ctx->dnsc_qactive, q);\n  ++ctx->dnsc_nactive;\n  dns_request_utm(ctx, 0);\n\n  return q;\n}\n\nstruct dns_query *\ndns_submit_p(struct dns_ctx *ctx,\n             const char *name, int qcls, int qtyp, int flags,\n             dns_parse_fn *parse, dns_query_fn *cbck, void *data) {\n  int isabs;\n  SETCTXOPEN(ctx);\n  if (dns_ptodn(name, 0, ctx->dnsc_pbuf, DNS_MAXDN, &isabs) <= 0) {\n    ctx->dnsc_qstatus = DNS_E_BADQUERY;\n    return NULL;\n  }\n  if (isabs)\n    flags |= DNS_NOSRCH;\n  return\n    dns_submit_dn(ctx, ctx->dnsc_pbuf, qcls, qtyp, flags, parse, cbck, data);\n}\n\n/* process readable fd condition.\n * To be usable in edge-triggered environment, the routine\n * should consume all input so it should loop over.\n * Note it isn't really necessary to loop here, because\n * an application may perform the loop just fine by it's own,\n * but in this case we should return some sensitive result,\n * to indicate when to stop calling and error conditions.\n * Note also we may encounter all sorts of recvfrom()\n * errors which aren't fatal, and at the same time we may\n * loop forever if an error IS fatal.\n */\nvoid dns_ioevent(struct dns_ctx *ctx, time_t now) {\n  int r;\n  unsigned servi;\n  struct dns_query *q;\n  dnsc_t *pbuf;\n  dnscc_t *pend, *pcur;\n  void *result;\n  struct sockaddr_ns sns;\n  socklen_t slen;\n\n  SETCTX(ctx);\n  if (!CTXOPEN(ctx))\n    return;\n  dns_assert_ctx(ctx);\n  pbuf = ctx->dnsc_pbuf;\n\n  if (!now) now = time(NULL);\n\nagain: /* receive the reply */\n\n  slen = sizeof(sns);\n  r = recvfrom(ctx->dnsc_udpsock, (void*)pbuf, ctx->dnsc_udpbuf,\n               MSG_DONTWAIT, &sns.sa, &slen);\n  if (r < 0) {\n    /*XXX just ignore recvfrom() errors for now.\n     * in the future it may be possible to determine which\n     * query failed and requeue it.\n     * Note there may be various error conditions, triggered\n     * by both local problems and remote problems.  It isn't\n     * quite trivial to determine whenever an error is local\n     * or remote.  On local errors, we should stop, while\n     * remote errors should be ignored (for now anyway).\n     */\n#ifdef __MINGW32__\n    if (WSAGetLastError() == WSAEWOULDBLOCK)\n#else\n    if (errno == EAGAIN)\n#endif\n    {\n      dns_request_utm(ctx, now);\n      return;\n    }\n    goto again;\n  }\n\n  pend = pbuf + r;\n  pcur = dns_payload(pbuf);\n\n  /* check reply header */\n  if (pcur > pend || dns_numqd(pbuf) > 1 || dns_opcode(pbuf) != 0) {\n    DNS_DBG(ctx, -1/*bad reply*/, &sns.sa, slen, pbuf, r);\n    goto again;\n  }\n\n  /* find the matching query, by qID */\n  for (q = ctx->dnsc_qactive.head; ; q = q->dnsq_next) {\n    if (!q) {\n      /* no more requests: old reply? */\n      DNS_DBG(ctx, -5/*no matching query*/, &sns.sa, slen, pbuf, r);\n      goto again;\n    }\n    if (pbuf[DNS_H_QID1] == q->dnsq_id[0] &&\n        pbuf[DNS_H_QID2] == q->dnsq_id[1])\n      break;\n  }\n\n  /* if we have numqd, compare with our query qDN */\n  if (dns_numqd(pbuf)) {\n    /* decode the qDN */\n    dnsc_t dn[DNS_MAXDN];\n    if (dns_getdn(pbuf, &pcur, pend, dn, sizeof(dn)) < 0 ||\n        pcur + 4 > pend) {\n      DNS_DBG(ctx, -1/*bad reply*/, &sns.sa, slen, pbuf, r);\n      goto again;\n    }\n    if (!dns_dnequal(dn, q->dnsq_dn) ||\n        memcmp(pcur, q->dnsq_typcls, 4) != 0) {\n      /* not this query */\n      DNS_DBG(ctx, -5/*no matching query*/, &sns.sa, slen, pbuf, r);\n      goto again;\n    }\n    /* here, query match, and pcur points past qDN in query section in pbuf */\n  }\n  /* if no numqd, we only allow FORMERR rcode */\n  else if (dns_rcode(pbuf) != DNS_R_FORMERR) {\n    /* treat it as bad reply if !FORMERR */\n    DNS_DBG(ctx, -1/*bad reply*/, &sns.sa, slen, pbuf, r);\n    goto again;\n  }\n  else {\n    /* else it's FORMERR, handled below */\n  }\n\n  /* find server */\n#ifdef HAVE_IPv6\n  if (sns.sa.sa_family == AF_INET6 && slen >= sizeof(sns.sin6)) {\n    for(servi = 0; servi < ctx->dnsc_nserv; ++servi)\n      if (sin6_eq(ctx->dnsc_serv[servi].sin6, sns.sin6))\n        break;\n  }\n  else\n#endif\n  if (sns.sa.sa_family == AF_INET && slen >= sizeof(sns.sin)) {\n    for(servi = 0; servi < ctx->dnsc_nserv; ++servi)\n      if (sin_eq(ctx->dnsc_serv[servi].sin, sns.sin))\n        break;\n  }\n  else\n    servi = ctx->dnsc_nserv;\n\n  /* check if we expect reply from this server.\n   * Note we can receive reply from first try if we're already at next */\n  if (!(q->dnsq_servwait & (1 << servi))) { /* if ever asked this NS */\n    DNS_DBG(ctx, -2/*wrong server*/, &sns.sa, slen, pbuf, r);\n    goto again;\n  }\n\n  /* we got (some) reply for our query */\n\n  DNS_DBGQ(ctx, q, 0, &sns.sa, slen, pbuf, r);\n  q->dnsq_servwait &= ~(1 << servi);\t/* don't expect reply from this serv */\n\n  /* process the RCODE */\n  switch(dns_rcode(pbuf)) {\n\n  case DNS_R_NOERROR:\n    if (dns_tc(pbuf)) {\n      /* possible truncation.  We can't deal with it. */\n      /*XXX for now, treat TC bit the same as SERVFAIL.\n       * It is possible to:\n       *  a) try to decode the reply - may be ANSWER section is ok;\n       *  b) check if server understands EDNS0, and if it is, and\n       *   answer still don't fit, end query.\n       */\n      break;\n    }\n    if (!dns_numan(pbuf)) {\t/* no data of requested type */\n      if (dns_next_srch(ctx, q)) {\n        /* if we're searching, try next searchlist element,\n         * but remember NODATA reply. */\n        q->dnsq_flags |= DNS_SEEN_NODATA;\n        dns_send(ctx, q, now);\n      }\n      else\n        /* else - nothing to search any more - finish the query.\n         * It will be NODATA since we've seen a NODATA reply. */\n        dns_end_query(ctx, q, DNS_E_NODATA, 0);\n    }\n    /* we've got a positive reply here */\n    else if (q->dnsq_parse) {\n      /* if we have parsing routine, call it and return whatever it returned */\n      /* don't try to re-search if NODATA here.  For example,\n       * if we asked for A but only received CNAME.  Unless we'll\n       * someday do recursive queries.  And that's problematic too, since\n       * we may be dealing with specific AA-only nameservers for a given\n       * domain, but CNAME points elsewhere...\n       */\n      r = q->dnsq_parse(q->dnsq_dn, pbuf, pcur, pend, &result);\n      dns_end_query(ctx, q, r, r < 0 ? NULL : result);\n    }\n    /* else just malloc+copy the raw DNS reply */\n    else if ((result = malloc(r)) == NULL)\n      dns_end_query(ctx, q, DNS_E_NOMEM, NULL);\n    else {\n      memcpy(result, pbuf, r);\n      dns_end_query(ctx, q, r, result);\n    }\n    goto again;\n\n  case DNS_R_NXDOMAIN:\t/* Non-existing domain. */\n    if (dns_next_srch(ctx, q))\n      /* more search entries exists, try them. */\n      dns_send(ctx, q, now);\n    else\n      /* nothing to search anymore. End the query, returning either NODATA\n       * if we've seen it before, or NXDOMAIN if not. */\n      dns_end_query(ctx, q,\n           q->dnsq_flags & DNS_SEEN_NODATA ? DNS_E_NODATA : DNS_E_NXDOMAIN, 0);\n    goto again;\n\n  case DNS_R_FORMERR:\n  case DNS_R_NOTIMPL:\n    /* for FORMERR and NOTIMPL rcodes, if we tried EDNS0-enabled query,\n     * try w/o EDNS0. */\n    if (ctx->dnsc_udpbuf > DNS_MAXPACKET &&\n        !(q->dnsq_servnEDNS0 & (1 << servi))) {\n      /* we always trying EDNS0 first if enabled, and retry a given query\n       * if not available. Maybe it's better to remember inavailability of\n       * EDNS0 in ctx as a per-NS flag, and never try again for this NS.\n       * For long-running applications.. maybe they will change the nameserver\n       * while we're running? :)  Also, since FORMERR is the only rcode we\n       * allow to be header-only, and in this case the only check we do to\n       * find a query it belongs to is qID (not qDN+qCLS+qTYP), it's much\n       * easier to spoof and to force us to perform non-EDNS0 queries only...\n       */\n      q->dnsq_servnEDNS0 |= 1 << servi;\n      dns_send_this(ctx, q, servi, now);\n      goto again;\n    }\n    /* else we handle it the same as SERVFAIL etc */\n\n  case DNS_R_SERVFAIL:\n  case DNS_R_REFUSED:\n    /* for these rcodes, advance this request\n     * to the next server and reschedule */\n  default: /* unknown rcode? hmmm... */\n    break;\n  }\n\n  /* here, we received unexpected reply */\n  q->dnsq_servskip |= (1 << servi);\t/* don't retry this server */\n\n  /* we don't expect replies from this server anymore.\n   * But there may be other servers.  Some may be still processing our\n   * query, and some may be left to try.\n   * We just ignore this reply and wait a bit more if some NSes haven't\n   * replied yet (dnsq_servwait != 0), and let the situation to be handled\n   * on next event processing.  Timeout for this query is set correctly,\n   * if not taking into account the one-second difference - we can try\n   * next server in the same iteration sooner.\n   */\n\n  /* try next server */\n  if (!q->dnsq_servwait) {\n    /* next retry: maybe some other servers will reply next time.\n     * dns_send() will end the query for us if no more servers to try.\n     * Note we can't continue with the next searchlist element here:\n     * we don't know if the current qdn exists or not, there's no definitive\n     * answer yet (which is seen in cases above).\n     *XXX standard resolver also tries as-is query in case all nameservers\n     * failed to process our query and if not tried before.  We don't do it.\n     */\n    dns_send(ctx, q, now);\n  }\n  else {\n    /* else don't do anything - not all servers replied yet */\n  }\n  goto again;\n\n}\n\n/* handle all timeouts */\nint dns_timeouts(struct dns_ctx *ctx, int maxwait, time_t now) {\n  /* this is a hot routine */\n  struct dns_query *q;\n\n  SETCTX(ctx);\n  dns_assert_ctx(ctx);\n\n  /* Pick up first entry from query list.\n   * If its deadline has passed, (re)send it\n   * (dns_send() will move it next in the list).\n   * If not, this is the query which determines the closest deadline.\n   */\n\n  q = ctx->dnsc_qactive.head;\n  if (!q)\n    return maxwait;\n  if (!now)\n    now = time(NULL);\n  do {\n    if (q->dnsq_deadline > now) { /* first non-expired query */\n      int w = (int)(q->dnsq_deadline - now);\n      if (maxwait < 0 || maxwait > w)\n        maxwait = w;\n      break;\n    }\n    else {\n      /* process expired deadline */\n      dns_send(ctx, q, now);\n    }\n  } while((q = ctx->dnsc_qactive.head) != NULL);\n\n  dns_request_utm(ctx, now); /* update timer with new deadline */\n  return maxwait;\n}\n\nstruct dns_resolve_data {\n  int   dnsrd_done;\n  void *dnsrd_result;\n};\n\nstatic void dns_resolve_cb(struct dns_ctx *ctx, void *result, void *data) {\n  struct dns_resolve_data *d = data;\n  d->dnsrd_result = result;\n  d->dnsrd_done = 1;\n  ctx = ctx;\n}\n\nvoid *dns_resolve(struct dns_ctx *ctx, struct dns_query *q) {\n  time_t now;\n  struct dns_resolve_data d;\n  int n;\n  SETCTXOPEN(ctx);\n\n  if (!q)\n    return NULL;\n\n  assert(ctx == q->dnsq_ctx);\n  dns_assert_ctx(ctx);\n  /* do not allow re-resolving syncronous queries */\n  assert(q->dnsq_cbck != dns_resolve_cb && \"can't resolve syncronous query\");\n  if (q->dnsq_cbck == dns_resolve_cb) {\n    ctx->dnsc_qstatus = DNS_E_BADQUERY;\n    return NULL;\n  }\n  q->dnsq_cbck = dns_resolve_cb;\n  q->dnsq_cbdata = &d;\n  d.dnsrd_done = 0;\n\n  now = time(NULL);\n  while(!d.dnsrd_done && (n = dns_timeouts(ctx, -1, now)) >= 0) {\n#ifdef HAVE_POLL\n    struct pollfd pfd;\n    pfd.fd = ctx->dnsc_udpsock;\n    pfd.events = POLLIN;\n    n = poll(&pfd, 1, n * 1000);\n#else\n    fd_set rfd;\n    struct timeval tv;\n    FD_ZERO(&rfd);\n    FD_SET(ctx->dnsc_udpsock, &rfd);\n    tv.tv_sec = n; tv.tv_usec = 0;\n    n = select(ctx->dnsc_udpsock + 1, &rfd, NULL, NULL, &tv);\n#endif\n    now = time(NULL);\n    if (n > 0)\n      dns_ioevent(ctx, now);\n  }\n\n  return d.dnsrd_result;\n}\n\nvoid *dns_resolve_dn(struct dns_ctx *ctx,\n                     dnscc_t *dn, int qcls, int qtyp, int flags,\n                     dns_parse_fn *parse) {\n  return\n    dns_resolve(ctx,\n      dns_submit_dn(ctx, dn, qcls, qtyp, flags, parse, NULL, NULL));\n}\n\nvoid *dns_resolve_p(struct dns_ctx *ctx,\n                    const char *name, int qcls, int qtyp, int flags,\n                    dns_parse_fn *parse) {\n  return\n    dns_resolve(ctx,\n      dns_submit_p(ctx, name, qcls, qtyp, flags, parse, NULL, NULL));\n}\n\nint dns_cancel(struct dns_ctx *ctx, struct dns_query *q) {\n  SETCTX(ctx);\n  dns_assert_ctx(ctx);\n  assert(q->dnsq_ctx == ctx);\n  /* do not allow cancelling syncronous queries */\n  assert(q->dnsq_cbck != dns_resolve_cb && \"can't cancel syncronous query\");\n  if (q->dnsq_cbck == dns_resolve_cb)\n    return (ctx->dnsc_qstatus = DNS_E_BADQUERY);\n  qlist_remove(&ctx->dnsc_qactive, q);\n  --ctx->dnsc_nactive;\n  dns_request_utm(ctx, 0);\n  return 0;\n}\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns_rr_a.c",
    "content": "/* udns_rr_a.c\n   parse/query A/AAAA IN records\n\n   Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n */\n\n#include <string.h>\n#include <stdlib.h>\n#include <assert.h>\n#ifndef __MINGW32__\n# include <sys/types.h>\n# include <netinet/in.h>\n#endif\n#include \"udns.h\"\n\n/* here, we use common routine to parse both IPv4 and IPv6 addresses.\n */\n\n/* this structure should match dns_rr_a[46] */\nstruct dns_rr_a {\n  dns_rr_common(dnsa);\n  unsigned char *dnsa_addr;\n};\n\nstatic int\ndns_parse_a(dnscc_t *qdn, dnscc_t *pkt, dnscc_t *cur, dnscc_t *end,\n            void **result, unsigned dsize) {\n  struct dns_rr_a *ret;\n  struct dns_parse p;\n  struct dns_rr rr;\n  int r;\n\n  /* first, validate and count number of addresses */\n  dns_initparse(&p, qdn, pkt, cur, end);\n  while((r = dns_nextrr(&p, &rr)) > 0)\n    if (rr.dnsrr_dsz != dsize)\n      return DNS_E_PROTOCOL;\n  if (r < 0)\n    return DNS_E_PROTOCOL;\n  else if (!p.dnsp_nrr)\n    return DNS_E_NODATA;\n\n  ret = malloc(sizeof(*ret) + dsize * p.dnsp_nrr + dns_stdrr_size(&p));\n  if (!ret)\n    return DNS_E_NOMEM;\n\n  ret->dnsa_nrr = p.dnsp_nrr;\n  ret->dnsa_addr = (unsigned char*)(ret+1);\n\n  /* copy the RRs */\n  for (dns_rewind(&p, qdn), r = 0; dns_nextrr(&p, &rr); ++r)\n    memcpy(ret->dnsa_addr + dsize * r, rr.dnsrr_dptr, dsize);\n\n  dns_stdrr_finish((struct dns_rr_null *)ret,\n                   (char *)(ret->dnsa_addr + dsize * p.dnsp_nrr), &p);\n  *result = ret;\n  return 0;\n}\n\nint\ndns_parse_a4(dnscc_t *qdn, dnscc_t *pkt, dnscc_t *cur, dnscc_t *end,\n             void **result) {\n#ifdef AF_INET\n  assert(sizeof(struct in_addr) == 4);\n#endif\n  assert(dns_get16(cur+2) == DNS_C_IN && dns_get16(cur+0) == DNS_T_A);\n  return dns_parse_a(qdn, pkt, cur, end, result, 4);\n}\n\nstruct dns_query *\ndns_submit_a4(struct dns_ctx *ctx, const char *name, int flags,\n              dns_query_a4_fn *cbck, void *data) {\n  return\n    dns_submit_p(ctx, name, DNS_C_IN, DNS_T_A, flags,\n                 dns_parse_a4, (dns_query_fn*)cbck, data);\n}\n\nstruct dns_rr_a4 *\ndns_resolve_a4(struct dns_ctx *ctx, const char *name, int flags) {\n  return (struct dns_rr_a4 *)\n    dns_resolve_p(ctx, name, DNS_C_IN, DNS_T_A, flags, dns_parse_a4);\n}\n\nint\ndns_parse_a6(dnscc_t *qdn, dnscc_t *pkt, dnscc_t *cur, dnscc_t *end,\n             void **result) {\n#ifdef AF_INET6\n  assert(sizeof(struct in6_addr) == 16);\n#endif\n  assert(dns_get16(cur+2) == DNS_C_IN && dns_get16(cur+0) == DNS_T_AAAA);\n  return dns_parse_a(qdn, pkt, cur, end, result, 16);\n}\n\nstruct dns_query *\ndns_submit_a6(struct dns_ctx *ctx, const char *name, int flags,\n              dns_query_a6_fn *cbck, void *data) {\n  return\n    dns_submit_p(ctx, name, DNS_C_IN, DNS_T_AAAA, flags,\n                 dns_parse_a6, (dns_query_fn*)cbck, data);\n}\n\nstruct dns_rr_a6 *\ndns_resolve_a6(struct dns_ctx *ctx, const char *name, int flags) {\n  return (struct dns_rr_a6 *)\n    dns_resolve_p(ctx, name, DNS_C_IN, DNS_T_AAAA, flags, dns_parse_a6);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns_rr_mx.c",
    "content": "/* udns_rr_mx.c\n   parse/query MX IN records\n\n   Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n */\n\n#include <string.h>\n#include <stdlib.h>\n#include <assert.h>\n#include \"udns.h\"\n\nint\ndns_parse_mx(dnscc_t *qdn, dnscc_t *pkt, dnscc_t *cur, dnscc_t *end,\n             void **result) {\n  struct dns_rr_mx *ret;\n  struct dns_parse p;\n  struct dns_rr rr;\n  int r, l;\n  char *sp;\n  dnsc_t mx[DNS_MAXDN];\n\n  assert(dns_get16(cur+2) == DNS_C_IN && dns_get16(cur+0) == DNS_T_MX);\n\n  /* first, validate the answer and count size of the result */\n  l = 0;\n  dns_initparse(&p, qdn, pkt, cur, end);\n  while((r = dns_nextrr(&p, &rr)) > 0) {\n    cur = rr.dnsrr_dptr + 2;\n    r = dns_getdn(pkt, &cur, end, mx, sizeof(mx));\n    if (r <= 0 || cur != rr.dnsrr_dend)\n      return DNS_E_PROTOCOL;\n    l += dns_dntop_size(mx);\n  }\n  if (r < 0)\n    return DNS_E_PROTOCOL;\n  if (!p.dnsp_nrr)\n    return DNS_E_NODATA;\n\n  /* next, allocate and set up result */\n  l += dns_stdrr_size(&p);\n  ret = malloc(sizeof(*ret) + sizeof(struct dns_mx) * p.dnsp_nrr + l);\n  if (!ret)\n    return DNS_E_NOMEM;\n  ret->dnsmx_nrr = p.dnsp_nrr;\n  ret->dnsmx_mx = (struct dns_mx *)(ret+1);\n\n  /* and 3rd, fill in result, finally */\n  sp = (char*)(ret->dnsmx_mx + p.dnsp_nrr);\n  for (dns_rewind(&p, qdn), r = 0; dns_nextrr(&p, &rr); ++r) {\n    ret->dnsmx_mx[r].name = sp;\n    cur = rr.dnsrr_dptr;\n    ret->dnsmx_mx[r].priority = dns_get16(cur);\n    cur += 2;\n    dns_getdn(pkt, &cur, end, mx, sizeof(mx));\n    sp += dns_dntop(mx, sp, DNS_MAXNAME);\n  }\n  dns_stdrr_finish((struct dns_rr_null *)ret, sp, &p);\n  *result = ret;\n  return 0;\n}\n\nstruct dns_query *\ndns_submit_mx(struct dns_ctx *ctx, const char *name, int flags,\n              dns_query_mx_fn *cbck, void *data) {\n  return\n    dns_submit_p(ctx, name, DNS_C_IN, DNS_T_MX, flags,\n                 dns_parse_mx, (dns_query_fn *)cbck, data);\n}\n\nstruct dns_rr_mx *\ndns_resolve_mx(struct dns_ctx *ctx, const char *name, int flags) {\n  return (struct dns_rr_mx *)\n    dns_resolve_p(ctx, name, DNS_C_IN, DNS_T_MX, flags, dns_parse_mx);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns_rr_naptr.c",
    "content": "/* udns_rr_naptr.c\n   parse/query NAPTR IN records\n\n   Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n   Copyright (C) 2006  Mikael Magnusson <mikma@users.sourceforge.net>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n */\n\n#include <string.h>\n#include <stdlib.h>\n#include <assert.h>\n#include \"udns.h\"\n\n/* Get a single string for NAPTR record, pretty much like a DN label.\n * String length is in first byte in *cur, so it can't be >255.\n */\nstatic int dns_getstr(dnscc_t **cur, dnscc_t *ep, char *buf)\n{\n  unsigned l;\n  dnscc_t *cp = *cur;\n\n  l = *cp++;\n  if (cp + l > ep)\n    return DNS_E_PROTOCOL;\n  if (buf) {\n    memcpy(buf, cp, l);\n    buf[l] = '\\0';\n  }\n  cp += l;\n\n  *cur = cp;\n  return l + 1;\n}\n\nint\ndns_parse_naptr(dnscc_t *qdn, dnscc_t *pkt, dnscc_t *cur, dnscc_t *end,\n                void **result) {\n  struct dns_rr_naptr *ret;\n  struct dns_parse p;\n  struct dns_rr rr;\n  int r, l;\n  char *sp;\n  dnsc_t dn[DNS_MAXDN];\n\n  assert(dns_get16(cur+2) == DNS_C_IN && dns_get16(cur+0) == DNS_T_NAPTR);\n\n  /* first, validate the answer and count size of the result */\n  l = 0;\n  dns_initparse(&p, qdn, pkt, cur, end);\n  while((r = dns_nextrr(&p, &rr)) > 0) {\n    int i;\n    dnscc_t *ep = rr.dnsrr_dend;\n\n    /* first 4 bytes: order & preference */\n    cur = rr.dnsrr_dptr + 4;\n\n    /* flags, services and regexp */\n    for (i = 0; i < 3; i++) {\n      r = dns_getstr(&cur, ep, NULL);\n      if (r < 0)\n        return r;\n      l += r;\n    }\n    /* replacement */\n    r = dns_getdn(pkt, &cur, end, dn, sizeof(dn));\n    if (r <= 0 || cur != rr.dnsrr_dend)\n      return DNS_E_PROTOCOL;\n    l += dns_dntop_size(dn);\n  }\n  if (r < 0)\n    return DNS_E_PROTOCOL;\n  if (!p.dnsp_nrr)\n    return DNS_E_NODATA;\n\n  /* next, allocate and set up result */\n  l += dns_stdrr_size(&p);\n  ret = malloc(sizeof(*ret) + sizeof(struct dns_naptr) * p.dnsp_nrr + l);\n  if (!ret)\n    return DNS_E_NOMEM;\n  ret->dnsnaptr_nrr = p.dnsp_nrr;\n  ret->dnsnaptr_naptr = (struct dns_naptr *)(ret+1);\n\n  /* and 3rd, fill in result, finally */\n  sp = (char*)(&ret->dnsnaptr_naptr[p.dnsp_nrr]);\n  for (dns_rewind(&p, qdn), r = 0; dns_nextrr(&p, &rr); ++r) {\n    cur = rr.dnsrr_dptr;\n    ret->dnsnaptr_naptr[r].order = dns_get16(cur); cur += 2;\n    ret->dnsnaptr_naptr[r].preference = dns_get16(cur); cur += 2;\n    sp += dns_getstr(&cur, end, (ret->dnsnaptr_naptr[r].flags = sp));\n    sp += dns_getstr(&cur, end, (ret->dnsnaptr_naptr[r].service = sp));\n    sp += dns_getstr(&cur, end, (ret->dnsnaptr_naptr[r].regexp = sp));\n    dns_getdn(pkt, &cur, end, dn, sizeof(dn));\n    sp += dns_dntop(dn, (ret->dnsnaptr_naptr[r].replacement = sp), DNS_MAXNAME);\n  }\n  dns_stdrr_finish((struct dns_rr_null *)ret, sp, &p);\n  *result = ret;\n  return 0;\n}\n\nstruct dns_query *\ndns_submit_naptr(struct dns_ctx *ctx, const char *name, int flags,\n                 dns_query_naptr_fn *cbck, void *data) {\n  return\n    dns_submit_p(ctx, name, DNS_C_IN, DNS_T_NAPTR, flags,\n                 dns_parse_naptr, (dns_query_fn *)cbck, data);\n}\n\nstruct dns_rr_naptr *\ndns_resolve_naptr(struct dns_ctx *ctx, const char *name, int flags) {\n  return (struct dns_rr_naptr *)\n    dns_resolve_p(ctx, name, DNS_C_IN, DNS_T_NAPTR, flags, dns_parse_naptr);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns_rr_ptr.c",
    "content": "/* udns_rr_ptr.c\n   parse/query PTR records\n\n   Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n */\n\n#include <stdlib.h>\n#include <assert.h>\n#include \"udns.h\"\n\nint\ndns_parse_ptr(dnscc_t *qdn, dnscc_t *pkt, dnscc_t *cur, dnscc_t *end,\n              void **result) {\n  struct dns_rr_ptr *ret;\n  struct dns_parse p;\n  struct dns_rr rr;\n  int r, l, c;\n  char *sp;\n  dnsc_t ptr[DNS_MAXDN];\n\n  assert(dns_get16(cur+2) == DNS_C_IN && dns_get16(cur+0) == DNS_T_PTR);\n\n  /* first, validate the answer and count size of the result */\n  l = c = 0;\n  dns_initparse(&p, qdn, pkt, cur, end);\n  while((r = dns_nextrr(&p, &rr)) > 0) {\n    cur = rr.dnsrr_dptr;\n    r = dns_getdn(pkt, &cur, end, ptr, sizeof(ptr));\n    if (r <= 0 || cur != rr.dnsrr_dend)\n      return DNS_E_PROTOCOL;\n    l += dns_dntop_size(ptr);\n    ++c;\n  }\n  if (r < 0)\n    return DNS_E_PROTOCOL;\n  if (!c)\n    return DNS_E_NODATA;\n\n  /* next, allocate and set up result */\n  ret = malloc(sizeof(*ret) + sizeof(char **) * c + l + dns_stdrr_size(&p));\n  if (!ret)\n    return DNS_E_NOMEM;\n  ret->dnsptr_nrr = c;\n  ret->dnsptr_ptr = (char **)(ret+1);\n\n  /* and 3rd, fill in result, finally */\n  sp = (char*)(ret->dnsptr_ptr + c);\n  c = 0;\n  dns_rewind(&p, qdn);\n  while((r = dns_nextrr(&p, &rr)) > 0) {\n    ret->dnsptr_ptr[c] = sp;\n    cur = rr.dnsrr_dptr;\n    dns_getdn(pkt, &cur, end, ptr, sizeof(ptr));\n    sp += dns_dntop(ptr, sp, DNS_MAXNAME);\n    ++c;\n  }\n  dns_stdrr_finish((struct dns_rr_null *)ret, sp, &p);\n  *result = ret;\n  return 0;\n}\n\nstruct dns_query *\ndns_submit_a4ptr(struct dns_ctx *ctx, const struct in_addr *addr,\n                 dns_query_ptr_fn *cbck, void *data) {\n  dnsc_t dn[DNS_A4RSIZE];\n  dns_a4todn(addr, 0, dn, sizeof(dn));\n  return\n    dns_submit_dn(ctx, dn, DNS_C_IN, DNS_T_PTR, DNS_NOSRCH,\n                  dns_parse_ptr, (dns_query_fn *)cbck, data);\n}\n\nstruct dns_rr_ptr *\ndns_resolve_a4ptr(struct dns_ctx *ctx, const struct in_addr *addr) {\n  return (struct dns_rr_ptr *)\n    dns_resolve(ctx, dns_submit_a4ptr(ctx, addr, NULL, NULL));\n}\n\nstruct dns_query *\ndns_submit_a6ptr(struct dns_ctx *ctx, const struct in6_addr *addr,\n                 dns_query_ptr_fn *cbck, void *data) {\n  dnsc_t dn[DNS_A6RSIZE];\n  dns_a6todn(addr, 0, dn, sizeof(dn));\n  return\n    dns_submit_dn(ctx, dn, DNS_C_IN, DNS_T_PTR, DNS_NOSRCH,\n                  dns_parse_ptr, (dns_query_fn *)cbck, data);\n}\n\nstruct dns_rr_ptr *\ndns_resolve_a6ptr(struct dns_ctx *ctx, const struct in6_addr *addr) {\n  return (struct dns_rr_ptr *)\n    dns_resolve(ctx, dns_submit_a6ptr(ctx, addr, NULL, NULL));\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns_rr_srv.c",
    "content": "/* udns_rr_srv.c\n   parse/query SRV IN (rfc2782) records\n\n   Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n   Copyright 2005 Thadeu Lima de Souza Cascardo <cascardo@minaslivre.org>\n\n   2005-09-11:\n   Changed MX parser file into a SRV parser file\n\n */\n\n#include <string.h>\n#include <stdlib.h>\n#include <assert.h>\n#include \"udns.h\"\n\nint\ndns_parse_srv(dnscc_t *qdn, dnscc_t *pkt, dnscc_t *cur, dnscc_t *end,\n              void **result) {\n  struct dns_rr_srv *ret;\n  struct dns_parse p;\n  struct dns_rr rr;\n  int r, l;\n  char *sp;\n  dnsc_t srv[DNS_MAXDN];\n\n  assert(dns_get16(cur+2) == DNS_C_IN && dns_get16(cur+0) == DNS_T_SRV);\n\n  /* first, validate the answer and count size of the result */\n  l = 0;\n  dns_initparse(&p, qdn, pkt, cur, end);\n  while((r = dns_nextrr(&p, &rr)) > 0) {\n    cur = rr.dnsrr_dptr + 6;\n    r = dns_getdn(pkt, &cur, end, srv, sizeof(srv));\n    if (r <= 0 || cur != rr.dnsrr_dend)\n      return DNS_E_PROTOCOL;\n    l += dns_dntop_size(srv);\n  }\n  if (r < 0)\n    return DNS_E_PROTOCOL;\n  if (!p.dnsp_nrr)\n    return DNS_E_NODATA;\n\n  /* next, allocate and set up result */\n  l += dns_stdrr_size(&p);\n  ret = malloc(sizeof(*ret) + sizeof(struct dns_srv) * p.dnsp_nrr + l);\n  if (!ret)\n    return DNS_E_NOMEM;\n  ret->dnssrv_nrr = p.dnsp_nrr;\n  ret->dnssrv_srv = (struct dns_srv *)(ret+1);\n\n  /* and 3rd, fill in result, finally */\n  sp = (char*)(ret->dnssrv_srv + p.dnsp_nrr);\n  for (dns_rewind(&p, qdn), r = 0; dns_nextrr(&p, &rr); ++r) {\n    ret->dnssrv_srv[r].name = sp;\n    cur = rr.dnsrr_dptr;\n    ret->dnssrv_srv[r].priority = dns_get16(cur);\n    ret->dnssrv_srv[r].weight = dns_get16(cur+2);\n    ret->dnssrv_srv[r].port = dns_get16(cur+4);\n    cur += 6;\n    dns_getdn(pkt, &cur, end, srv, sizeof(srv));\n    sp += dns_dntop(srv, sp, DNS_MAXNAME);\n  }\n  dns_stdrr_finish((struct dns_rr_null *)ret, sp, &p);\n  *result = ret;\n  return 0;\n}\n\n/* Add a single service or proto name prepending an undescore (_),\n * according to rfc2782 rules.\n * Return 0 or the label length.\n * Routing assumes dn holds enouth space for a single DN label. */\nstatic int add_sname(dnsc_t *dn, const char *sn) {\n  int l = dns_ptodn(sn, 0, dn + 1, DNS_MAXLABEL-1, NULL);\n  if (l <= 1 || l - 2 != dn[1])\n    /* Should we really check if sn is exactly one label?  Do we care? */\n    return 0;\n  dn[0] = l - 1;\n  dn[1] = '_';\n  return l;\n}\n\n/* Construct a domain name for SRV query from the given name, service and proto.\n * The code allows any combinations of srv and proto (both are non-NULL,\n * both NULL, or either one is non-NULL).  Whenever it makes any sense or not\n * is left as an exercise to programmer.\n * Return negative value on error (malformed query) or addition query flag(s).\n */\nstatic int\nbuild_srv_dn(dnsc_t *dn, const char *name, const char *srv, const char *proto)\n{\n  int p = 0, l, isabs;\n  if (srv) {\n    l = add_sname(dn + p, srv);\n    if (!l)\n      return -1;\n    p += l;\n  }\n  if (proto) {\n    l = add_sname(dn + p, proto);\n    if (!l)\n      return -1;\n    p += l;\n  }\n  l = dns_ptodn(name, 0, dn + p, DNS_MAXDN - p, &isabs);\n  if (l < 0)\n    return -1;\n  return isabs ? DNS_NOSRCH : 0;\n}\n\nstruct dns_query *\ndns_submit_srv(struct dns_ctx *ctx,\n               const char *name, const char *srv, const char *proto,\n               int flags, dns_query_srv_fn *cbck, void *data) {\n  dnsc_t dn[DNS_MAXDN];\n  int r = build_srv_dn(dn, name, srv, proto);\n  if (r < 0) {\n    dns_setstatus (ctx, DNS_E_BADQUERY);\n    return NULL;\n  }\n  return\n    dns_submit_dn(ctx, dn, DNS_C_IN, DNS_T_SRV, flags | r,\n                  dns_parse_srv, (dns_query_fn *)cbck, data);\n}\n\nstruct dns_rr_srv *\ndns_resolve_srv(struct dns_ctx *ctx,\n                const char *name, const char *srv, const char *proto, int flags)\n{\n  dnsc_t dn[DNS_MAXDN];\n  int r = build_srv_dn(dn, name, srv, proto);\n  if (r < 0) {\n    dns_setstatus(ctx, DNS_E_BADQUERY);\n    return NULL;\n  }\n  return (struct dns_rr_srv *)\n    dns_resolve_dn(ctx, dn, DNS_C_IN, DNS_T_SRV, flags | r, dns_parse_srv);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/libudns/udns_rr_txt.c",
    "content": "/* udns_rr_txt.c\n   parse/query TXT records\n\n   Copyright (C) 2005  Michael Tokarev <mjt@corpit.ru>\n   This file is part of UDNS library, an async DNS stub resolver.\n\n   This library is free software; you can redistribute it and/or\n   modify it under the terms of the GNU Lesser General Public\n   License as published by the Free Software Foundation; either\n   version 2.1 of the License, or (at your option) any later version.\n\n   This library is distributed in the hope that it will be useful,\n   but WITHOUT ANY WARRANTY; without even the implied warranty of\n   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU\n   Lesser General Public License for more details.\n\n   You should have received a copy of the GNU Lesser General Public\n   License along with this library, in file named COPYING.LGPL; if not,\n   write to the Free Software Foundation, Inc., 59 Temple Place,\n   Suite 330, Boston, MA  02111-1307  USA\n\n */\n\n#include <string.h>\n#include <stdlib.h>\n#include <assert.h>\n#include \"udns.h\"\n\nint\ndns_parse_txt(dnscc_t *qdn, dnscc_t *pkt, dnscc_t *cur, dnscc_t *end,\n              void **result) {\n  struct dns_rr_txt *ret;\n  struct dns_parse p;\n  struct dns_rr rr;\n  int r, l;\n  dnsc_t *sp;\n  dnscc_t *cp, *ep;\n\n  assert(dns_get16(cur+0) == DNS_T_TXT);\n\n  /* first, validate the answer and count size of the result */\n  l = 0;\n  dns_initparse(&p, qdn, pkt, cur, end);\n  while((r = dns_nextrr(&p, &rr)) > 0) {\n    cp = rr.dnsrr_dptr; ep = rr.dnsrr_dend;\n    while(cp < ep) {\n      r = *cp++;\n      if (cp + r > ep)\n        return DNS_E_PROTOCOL;\n      l += r;\n      cp += r;\n    }\n  }\n  if (r < 0)\n    return DNS_E_PROTOCOL;\n  if (!p.dnsp_nrr)\n    return DNS_E_NODATA;\n\n  /* next, allocate and set up result */\n  l +=  (sizeof(struct dns_txt) + 1) * p.dnsp_nrr + dns_stdrr_size(&p);\n  ret = malloc(sizeof(*ret) + l);\n  if (!ret)\n    return DNS_E_NOMEM;\n  ret->dnstxt_nrr = p.dnsp_nrr;\n  ret->dnstxt_txt = (struct dns_txt *)(ret+1);\n\n  /* and 3rd, fill in result, finally */\n  sp = (dnsc_t*)(ret->dnstxt_txt + p.dnsp_nrr);\n  for(dns_rewind(&p, qdn), r = 0; dns_nextrr(&p, &rr) > 0; ++r) {\n    ret->dnstxt_txt[r].txt = sp;\n    cp = rr.dnsrr_dptr; ep = rr.dnsrr_dend;\n    while(cp < ep) {\n      l = *cp++;\n      memcpy(sp, cp, l);\n      sp += l;\n      cp += l;\n    }\n    ret->dnstxt_txt[r].len = sp - ret->dnstxt_txt[r].txt;\n    *sp++ = '\\0';\n  }\n  dns_stdrr_finish((struct dns_rr_null *)ret, (char*)sp, &p);\n  *result = ret;\n  return 0;\n}\n\nstruct dns_query *\ndns_submit_txt(struct dns_ctx *ctx, const char *name, int qcls, int flags,\n               dns_query_txt_fn *cbck, void *data) {\n  return\n    dns_submit_p(ctx, name, qcls, DNS_T_TXT, flags,\n                 dns_parse_txt, (dns_query_fn *)cbck, data);\n}\n\nstruct dns_rr_txt *\ndns_resolve_txt(struct dns_ctx *ctx, const char *name, int qcls, int flags) {\n  return (struct dns_rr_txt *)\n    dns_resolve_p(ctx, name, qcls, DNS_T_TXT, flags, dns_parse_txt);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/m4/ax_pthread.m4",
    "content": "# ===========================================================================\n#        http://www.gnu.org/software/autoconf-archive/ax_pthread.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_PTHREAD([ACTION-IF-FOUND[, ACTION-IF-NOT-FOUND]])\n#\n# DESCRIPTION\n#\n#   This macro figures out how to build C programs using POSIX threads. It\n#   sets the PTHREAD_LIBS output variable to the threads library and linker\n#   flags, and the PTHREAD_CFLAGS output variable to any special C compiler\n#   flags that are needed. (The user can also force certain compiler\n#   flags/libs to be tested by setting these environment variables.)\n#\n#   Also sets PTHREAD_CC to any special C compiler that is needed for\n#   multi-threaded programs (defaults to the value of CC otherwise). (This\n#   is necessary on AIX to use the special cc_r compiler alias.)\n#\n#   NOTE: You are assumed to not only compile your program with these flags,\n#   but also link it with them as well. e.g. you should link with\n#   $PTHREAD_CC $CFLAGS $PTHREAD_CFLAGS $LDFLAGS ... $PTHREAD_LIBS $LIBS\n#\n#   If you are only building threads programs, you may wish to use these\n#   variables in your default LIBS, CFLAGS, and CC:\n#\n#     LIBS=\"$PTHREAD_LIBS $LIBS\"\n#     CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n#     CC=\"$PTHREAD_CC\"\n#\n#   In addition, if the PTHREAD_CREATE_JOINABLE thread-attribute constant\n#   has a nonstandard name, defines PTHREAD_CREATE_JOINABLE to that name\n#   (e.g. PTHREAD_CREATE_UNDETACHED on AIX).\n#\n#   Also HAVE_PTHREAD_PRIO_INHERIT is defined if pthread is found and the\n#   PTHREAD_PRIO_INHERIT symbol is defined when compiling with\n#   PTHREAD_CFLAGS.\n#\n#   ACTION-IF-FOUND is a list of shell commands to run if a threads library\n#   is found, and ACTION-IF-NOT-FOUND is a list of commands to run it if it\n#   is not found. If ACTION-IF-FOUND is not specified, the default action\n#   will define HAVE_PTHREAD.\n#\n#   Please let the authors know if this macro fails on any platform, or if\n#   you have any other suggestions or comments. This macro was based on work\n#   by SGJ on autoconf scripts for FFTW (http://www.fftw.org/) (with help\n#   from M. Frigo), as well as ac_pthread and hb_pthread macros posted by\n#   Alejandro Forero Cuervo to the autoconf macro repository. We are also\n#   grateful for the helpful feedback of numerous users.\n#\n#   Updated for Autoconf 2.68 by Daniel Richard G.\n#\n# LICENSE\n#\n#   Copyright (c) 2008 Steven G. Johnson <stevenj@alum.mit.edu>\n#   Copyright (c) 2011 Daniel Richard G. <skunk@iSKUNK.ORG>\n#\n#   This program is free software: you can redistribute it and/or modify it\n#   under the terms of the GNU General Public License as published by the\n#   Free Software Foundation, either version 3 of the License, or (at your\n#   option) any later version.\n#\n#   This program is distributed in the hope that it will be useful, but\n#   WITHOUT ANY WARRANTY; without even the implied warranty of\n#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n#   Public License for more details.\n#\n#   You should have received a copy of the GNU General Public License along\n#   with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n#   As a special exception, the respective Autoconf Macro's copyright owner\n#   gives unlimited permission to copy, distribute and modify the configure\n#   scripts that are the output of Autoconf when processing the Macro. You\n#   need not follow the terms of the GNU General Public License when using\n#   or distributing such scripts, even though portions of the text of the\n#   Macro appear in them. The GNU General Public License (GPL) does govern\n#   all other use of the material that constitutes the Autoconf Macro.\n#\n#   This special exception to the GPL applies to versions of the Autoconf\n#   Macro released by the Autoconf Archive. When you make and distribute a\n#   modified version of the Autoconf Macro, you may extend this special\n#   exception to the GPL to apply to your modified version as well.\n\n#serial 21\n\nAU_ALIAS([ACX_PTHREAD], [AX_PTHREAD])\nAC_DEFUN([AX_PTHREAD], [\nAC_REQUIRE([AC_CANONICAL_HOST])\nAC_LANG_PUSH([C])\nax_pthread_ok=no\n\n# We used to check for pthread.h first, but this fails if pthread.h\n# requires special compiler flags (e.g. on True64 or Sequent).\n# It gets checked for in the link test anyway.\n\n# First of all, check if the user has set any of the PTHREAD_LIBS,\n# etcetera environment variables, and if threads linking works using\n# them:\nif test x\"$PTHREAD_LIBS$PTHREAD_CFLAGS\" != x; then\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        AC_MSG_CHECKING([for pthread_join in LIBS=$PTHREAD_LIBS with CFLAGS=$PTHREAD_CFLAGS])\n        AC_TRY_LINK_FUNC([pthread_join], [ax_pthread_ok=yes])\n        AC_MSG_RESULT([$ax_pthread_ok])\n        if test x\"$ax_pthread_ok\" = xno; then\n                PTHREAD_LIBS=\"\"\n                PTHREAD_CFLAGS=\"\"\n        fi\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\nfi\n\n# We must check for the threads library under a number of different\n# names; the ordering is very important because some systems\n# (e.g. DEC) have both -lpthread and -lpthreads, where one of the\n# libraries is broken (non-POSIX).\n\n# Create a list of thread flags to try.  Items starting with a \"-\" are\n# C compiler flags, and other items are library names, except for \"none\"\n# which indicates that we try without any flags at all, and \"pthread-config\"\n# which is a program returning the flags for the Pth emulation library.\n\nax_pthread_flags=\"pthreads none -Kthread -kthread lthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config\"\n\n# The ordering *is* (sometimes) important.  Some notes on the\n# individual items follow:\n\n# pthreads: AIX (must check this before -lpthread)\n# none: in case threads are in libc; should be tried before -Kthread and\n#       other compiler flags to prevent continual compiler warnings\n# -Kthread: Sequent (threads in libc, but -Kthread needed for pthread.h)\n# -kthread: FreeBSD kernel threads (preferred to -pthread since SMP-able)\n# lthread: LinuxThreads port on FreeBSD (also preferred to -pthread)\n# -pthread: Linux/gcc (kernel threads), BSD/gcc (userland threads)\n# -pthreads: Solaris/gcc\n# -mthreads: Mingw32/gcc, Lynx/gcc\n# -mt: Sun Workshop C (may only link SunOS threads [-lthread], but it\n#      doesn't hurt to check since this sometimes defines pthreads too;\n#      also defines -D_REENTRANT)\n#      ... -mt is also the pthreads flag for HP/aCC\n# pthread: Linux, etcetera\n# --thread-safe: KAI C++\n# pthread-config: use pthread-config program (for GNU Pth library)\n\ncase ${host_os} in\n        solaris*)\n\n        # On Solaris (at least, for some versions), libc contains stubbed\n        # (non-functional) versions of the pthreads routines, so link-based\n        # tests will erroneously succeed.  (We need to link with -pthreads/-mt/\n        # -lpthread.)  (The stubs are missing pthread_cleanup_push, or rather\n        # a function called by this macro, so we could check for that, but\n        # who knows whether they'll stub that too in a future libc.)  So,\n        # we'll just look for -pthreads and -lpthread first:\n\n        ax_pthread_flags=\"-pthreads pthread -mt -pthread $ax_pthread_flags\"\n        ;;\nesac\n\n# Clang doesn't consider unrecognized options an error unless we specify\n# -Werror. We throw in some extra Clang-specific options to ensure that\n# this doesn't happen for GCC, which also accepts -Werror.\n\nAC_MSG_CHECKING([if compiler needs -Werror to reject unknown flags])\nsave_CFLAGS=\"$CFLAGS\"\nax_pthread_extra_flags=\"-Werror\"\nCFLAGS=\"$CFLAGS $ax_pthread_extra_flags -Wunknown-warning-option -Wsizeof-array-argument\"\nAC_COMPILE_IFELSE([AC_LANG_PROGRAM([int foo(void);],[foo()])],\n                  [AC_MSG_RESULT([yes])],\n                  [ax_pthread_extra_flags=\n                   AC_MSG_RESULT([no])])\nCFLAGS=\"$save_CFLAGS\"\n\nif test x\"$ax_pthread_ok\" = xno; then\nfor flag in $ax_pthread_flags; do\n\n        case $flag in\n                none)\n                AC_MSG_CHECKING([whether pthreads work without any flags])\n                ;;\n\n                -*)\n                AC_MSG_CHECKING([whether pthreads work with $flag])\n                PTHREAD_CFLAGS=\"$flag\"\n                ;;\n\n                pthread-config)\n                AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no])\n                if test x\"$ax_pthread_config\" = xno; then continue; fi\n                PTHREAD_CFLAGS=\"`pthread-config --cflags`\"\n                PTHREAD_LIBS=\"`pthread-config --ldflags` `pthread-config --libs`\"\n                ;;\n\n                *)\n                AC_MSG_CHECKING([for the pthreads library -l$flag])\n                PTHREAD_LIBS=\"-l$flag\"\n                ;;\n        esac\n\n        save_LIBS=\"$LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS $ax_pthread_extra_flags\"\n\n        # Check for various functions.  We must include pthread.h,\n        # since some functions may be macros.  (On the Sequent, we\n        # need a special flag -Kthread to make this header compile.)\n        # We check for pthread_join because it is in -lpthread on IRIX\n        # while pthread_create is in libc.  We check for pthread_attr_init\n        # due to DEC craziness with -lpthreads.  We check for\n        # pthread_cleanup_push because it is one of the few pthread\n        # functions on Solaris that doesn't have a non-functional libc stub.\n        # We try pthread_create on general principles.\n        AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>\n                        static void routine(void *a) { a = 0; }\n                        static void *start_routine(void *a) { return a; }],\n                       [pthread_t th; pthread_attr_t attr;\n                        pthread_create(&th, 0, start_routine, 0);\n                        pthread_join(th, 0);\n                        pthread_attr_init(&attr);\n                        pthread_cleanup_push(routine, 0);\n                        pthread_cleanup_pop(0) /* ; */])],\n                [ax_pthread_ok=yes],\n                [])\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n\n        AC_MSG_RESULT([$ax_pthread_ok])\n        if test \"x$ax_pthread_ok\" = xyes; then\n                break;\n        fi\n\n        PTHREAD_LIBS=\"\"\n        PTHREAD_CFLAGS=\"\"\ndone\nfi\n\n# Various other checks:\nif test \"x$ax_pthread_ok\" = xyes; then\n        save_LIBS=\"$LIBS\"\n        LIBS=\"$PTHREAD_LIBS $LIBS\"\n        save_CFLAGS=\"$CFLAGS\"\n        CFLAGS=\"$CFLAGS $PTHREAD_CFLAGS\"\n\n        # Detect AIX lossage: JOINABLE attribute is called UNDETACHED.\n        AC_MSG_CHECKING([for joinable pthread attribute])\n        attr_name=unknown\n        for attr in PTHREAD_CREATE_JOINABLE PTHREAD_CREATE_UNDETACHED; do\n            AC_LINK_IFELSE([AC_LANG_PROGRAM([#include <pthread.h>],\n                           [int attr = $attr; return attr /* ; */])],\n                [attr_name=$attr; break],\n                [])\n        done\n        AC_MSG_RESULT([$attr_name])\n        if test \"$attr_name\" != PTHREAD_CREATE_JOINABLE; then\n            AC_DEFINE_UNQUOTED([PTHREAD_CREATE_JOINABLE], [$attr_name],\n                               [Define to necessary symbol if this constant\n                                uses a non-standard name on your system.])\n        fi\n\n        AC_MSG_CHECKING([if more special flags are required for pthreads])\n        flag=no\n        case ${host_os} in\n            aix* | freebsd* | darwin*) flag=\"-D_THREAD_SAFE\";;\n            osf* | hpux*) flag=\"-D_REENTRANT\";;\n            solaris*)\n            if test \"$GCC\" = \"yes\"; then\n                flag=\"-D_REENTRANT\"\n            else\n                # TODO: What about Clang on Solaris?\n                flag=\"-mt -D_REENTRANT\"\n            fi\n            ;;\n        esac\n        AC_MSG_RESULT([$flag])\n        if test \"x$flag\" != xno; then\n            PTHREAD_CFLAGS=\"$flag $PTHREAD_CFLAGS\"\n        fi\n\n        AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT],\n            [ax_cv_PTHREAD_PRIO_INHERIT], [\n                AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include <pthread.h>]],\n                                                [[int i = PTHREAD_PRIO_INHERIT;]])],\n                    [ax_cv_PTHREAD_PRIO_INHERIT=yes],\n                    [ax_cv_PTHREAD_PRIO_INHERIT=no])\n            ])\n        AS_IF([test \"x$ax_cv_PTHREAD_PRIO_INHERIT\" = \"xyes\"],\n            [AC_DEFINE([HAVE_PTHREAD_PRIO_INHERIT], [1], [Have PTHREAD_PRIO_INHERIT.])])\n\n        LIBS=\"$save_LIBS\"\n        CFLAGS=\"$save_CFLAGS\"\n\n        # More AIX lossage: compile with *_r variant\n        if test \"x$GCC\" != xyes; then\n            case $host_os in\n                aix*)\n                AS_CASE([\"x/$CC\"],\n                  [x*/c89|x*/c89_128|x*/c99|x*/c99_128|x*/cc|x*/cc128|x*/xlc|x*/xlc_v6|x*/xlc128|x*/xlc128_v6],\n                  [#handle absolute path differently from PATH based program lookup\n                   AS_CASE([\"x$CC\"],\n                     [x/*],\n                     [AS_IF([AS_EXECUTABLE_P([${CC}_r])],[PTHREAD_CC=\"${CC}_r\"])],\n                     [AC_CHECK_PROGS([PTHREAD_CC],[${CC}_r],[$CC])])])\n                ;;\n            esac\n        fi\nfi\n\ntest -n \"$PTHREAD_CC\" || PTHREAD_CC=\"$CC\"\n\nAC_SUBST([PTHREAD_LIBS])\nAC_SUBST([PTHREAD_CFLAGS])\nAC_SUBST([PTHREAD_CC])\n\n# Finally, execute ACTION-IF-FOUND/ACTION-IF-NOT-FOUND:\nif test x\"$ax_pthread_ok\" = xyes; then\n        ifelse([$1],,[AC_DEFINE([HAVE_PTHREAD],[1],[Define if you have POSIX threads libraries and header files.])],[$1])\n        :\nelse\n        ax_pthread_ok=no\n        $2\nfi\nAC_LANG_POP\n])dnl AX_PTHREAD\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/m4/ax_tls.m4",
    "content": "# ===========================================================================\n#          http://www.gnu.org/software/autoconf-archive/ax_tls.html\n# ===========================================================================\n#\n# SYNOPSIS\n#\n#   AX_TLS([action-if-found], [action-if-not-found])\n#\n# DESCRIPTION\n#\n#   Provides a test for the compiler support of thread local storage (TLS)\n#   extensions. Defines TLS if it is found. Currently knows about GCC/ICC\n#   and MSVC. I think SunPro uses the same as GCC, and Borland apparently\n#   supports either.\n#\n# LICENSE\n#\n#   Copyright (c) 2008 Alan Woodland <ajw05@aber.ac.uk>\n#   Copyright (c) 2010 Diego Elio Petteno` <flameeyes@gmail.com>\n#\n#   This program is free software: you can redistribute it and/or modify it\n#   under the terms of the GNU General Public License as published by the\n#   Free Software Foundation, either version 3 of the License, or (at your\n#   option) any later version.\n#\n#   This program is distributed in the hope that it will be useful, but\n#   WITHOUT ANY WARRANTY; without even the implied warranty of\n#   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General\n#   Public License for more details.\n#\n#   You should have received a copy of the GNU General Public License along\n#   with this program. If not, see <http://www.gnu.org/licenses/>.\n#\n#   As a special exception, the respective Autoconf Macro's copyright owner\n#   gives unlimited permission to copy, distribute and modify the configure\n#   scripts that are the output of Autoconf when processing the Macro. You\n#   need not follow the terms of the GNU General Public License when using\n#   or distributing such scripts, even though portions of the text of the\n#   Macro appear in them. The GNU General Public License (GPL) does govern\n#   all other use of the material that constitutes the Autoconf Macro.\n#\n#   This special exception to the GPL applies to versions of the Autoconf\n#   Macro released by the Autoconf Archive. When you make and distribute a\n#   modified version of the Autoconf Macro, you may extend this special\n#   exception to the GPL to apply to your modified version as well.\n\n#serial 11\n\nAC_DEFUN([AX_TLS], [\n  AC_MSG_CHECKING([for thread local storage (TLS) class])\n  AC_CACHE_VAL([ac_cv_tls],\n   [for ax_tls_keyword in __thread '__declspec(thread)' none; do\n       AS_CASE([$ax_tls_keyword],\n          [none], [ac_cv_tls=none ; break],\n          [AC_TRY_COMPILE(\n              [#include <stdlib.h>\n               static void\n               foo(void) {\n               static ] $ax_tls_keyword [ int bar;\n               exit(1);\n               }],\n               [],\n               [ac_cv_tls=$ax_tls_keyword ; break],\n               ac_cv_tls=none\n           )])\n    done\n  ])\n  AC_MSG_RESULT([$ac_cv_tls])\n\n  AS_IF([test \"$ac_cv_tls\" != \"none\"],\n    [AC_DEFINE_UNQUOTED([TLS],[$ac_cv_tls],[If the compiler supports a TLS storage class define it to that here])\n     m4_ifnblank([$1],[$1])],\n    [m4_ifnblank([$2],[$2])])\n])\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/m4/inet_ntop.m4",
    "content": "# inet_ntop.m4 serial 19\ndnl Copyright (C) 2005-2006, 2008-2013 Free Software Foundation, Inc.\ndnl This file is free software; the Free Software Foundation\ndnl gives unlimited permission to copy and/or distribute it,\ndnl with or without modifications, as long as this notice is preserved.\n\nAC_DEFUN([ss_FUNC_INET_NTOP],\n[\n  AC_REQUIRE([AC_C_RESTRICT])\n\n  dnl Most platforms that provide inet_ntop define it in libc.\n  dnl Solaris 8..10 provide inet_ntop in libnsl instead.\n  dnl Solaris 2.6..7 provide inet_ntop in libresolv instead.\n  HAVE_INET_NTOP=1\n  INET_NTOP_LIB=\n  ss_save_LIBS=$LIBS\n  AC_SEARCH_LIBS([inet_ntop], [nsl resolv], [],\n    [AC_CHECK_FUNCS([inet_ntop])\n     if test $ac_cv_func_inet_ntop = no; then\n       HAVE_INET_NTOP=0\n     fi\n    ])\n  LIBS=$ss_save_LIBS\n\n  if test \"$ac_cv_search_inet_ntop\" != \"no\" \\\n     && test \"$ac_cv_search_inet_ntop\" != \"none required\"; then\n    INET_NTOP_LIB=\"$ac_cv_search_inet_ntop\"\n  fi\n\n  AC_CHECK_HEADERS_ONCE([netdb.h])\n  AC_CHECK_DECLS([inet_ntop],,,\n    [[#include <arpa/inet.h>\n      #if HAVE_NETDB_H\n      # include <netdb.h>\n      #endif\n    ]])\n  if test $ac_cv_have_decl_inet_ntop = no; then\n    HAVE_DECL_INET_NTOP=0\n  fi\n  AC_SUBST([INET_NTOP_LIB])\n])\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/m4/libtool.m4",
    "content": "# libtool.m4 - Configure libtool for the host system. -*-Autoconf-*-\n#\n#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,\n#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software\n#                 Foundation, Inc.\n#   Written by Gordon Matzigkeit, 1996\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\nm4_define([_LT_COPYING], [dnl\n#   Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2003, 2004, 2005,\n#                 2006, 2007, 2008, 2009, 2010, 2011 Free Software\n#                 Foundation, Inc.\n#   Written by Gordon Matzigkeit, 1996\n#\n#   This file is part of GNU Libtool.\n#\n# GNU Libtool is free software; you can redistribute it and/or\n# modify it under the terms of the GNU General Public License as\n# published by the Free Software Foundation; either version 2 of\n# the License, or (at your option) any later version.\n#\n# As a special exception to the GNU General Public License,\n# if you distribute this file as part of a program or library that\n# is built using GNU Libtool, you may include this file under the\n# same distribution terms that you use for the rest of that program.\n#\n# GNU Libtool is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY; without even the implied warranty of\n# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n# GNU General Public License for more details.\n#\n# You should have received a copy of the GNU General Public License\n# along with GNU Libtool; see the file COPYING.  If not, a copy\n# can be downloaded from http://www.gnu.org/licenses/gpl.html, or\n# obtained by writing to the Free Software Foundation, Inc.,\n# 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.\n])\n\n# serial 57 LT_INIT\n\n\n# LT_PREREQ(VERSION)\n# ------------------\n# Complain and exit if this libtool version is less that VERSION.\nm4_defun([LT_PREREQ],\n[m4_if(m4_version_compare(m4_defn([LT_PACKAGE_VERSION]), [$1]), -1,\n       [m4_default([$3],\n\t\t   [m4_fatal([Libtool version $1 or higher is required],\n\t\t             63)])],\n       [$2])])\n\n\n# _LT_CHECK_BUILDDIR\n# ------------------\n# Complain if the absolute build directory name contains unusual characters\nm4_defun([_LT_CHECK_BUILDDIR],\n[case `pwd` in\n  *\\ * | *\\\t*)\n    AC_MSG_WARN([Libtool does not cope well with whitespace in `pwd`]) ;;\nesac\n])\n\n\n# LT_INIT([OPTIONS])\n# ------------------\nAC_DEFUN([LT_INIT],\n[AC_PREREQ([2.58])dnl We use AC_INCLUDES_DEFAULT\nAC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT])dnl\nAC_BEFORE([$0], [LT_LANG])dnl\nAC_BEFORE([$0], [LT_OUTPUT])dnl\nAC_BEFORE([$0], [LTDL_INIT])dnl\nm4_require([_LT_CHECK_BUILDDIR])dnl\n\ndnl Autoconf doesn't catch unexpanded LT_ macros by default:\nm4_pattern_forbid([^_?LT_[A-Z_]+$])dnl\nm4_pattern_allow([^(_LT_EOF|LT_DLGLOBAL|LT_DLLAZY_OR_NOW|LT_MULTI_MODULE)$])dnl\ndnl aclocal doesn't pull ltoptions.m4, ltsugar.m4, or ltversion.m4\ndnl unless we require an AC_DEFUNed macro:\nAC_REQUIRE([LTOPTIONS_VERSION])dnl\nAC_REQUIRE([LTSUGAR_VERSION])dnl\nAC_REQUIRE([LTVERSION_VERSION])dnl\nAC_REQUIRE([LTOBSOLETE_VERSION])dnl\nm4_require([_LT_PROG_LTMAIN])dnl\n\n_LT_SHELL_INIT([SHELL=${CONFIG_SHELL-/bin/sh}])\n\ndnl Parse OPTIONS\n_LT_SET_OPTIONS([$0], [$1])\n\n# This can be used to rebuild libtool when needed\nLIBTOOL_DEPS=\"$ltmain\"\n\n# Always use our own libtool.\nLIBTOOL='$(SHELL) $(top_builddir)/libtool'\nAC_SUBST(LIBTOOL)dnl\n\n_LT_SETUP\n\n# Only expand once:\nm4_define([LT_INIT])\n])# LT_INIT\n\n# Old names:\nAU_ALIAS([AC_PROG_LIBTOOL], [LT_INIT])\nAU_ALIAS([AM_PROG_LIBTOOL], [LT_INIT])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_PROG_LIBTOOL], [])\ndnl AC_DEFUN([AM_PROG_LIBTOOL], [])\n\n\n# _LT_CC_BASENAME(CC)\n# -------------------\n# Calculate cc_basename.  Skip known compiler wrappers and cross-prefix.\nm4_defun([_LT_CC_BASENAME],\n[for cc_temp in $1\"\"; do\n  case $cc_temp in\n    compile | *[[\\\\/]]compile | ccache | *[[\\\\/]]ccache ) ;;\n    distcc | *[[\\\\/]]distcc | purify | *[[\\\\/]]purify ) ;;\n    \\-*) ;;\n    *) break;;\n  esac\ndone\ncc_basename=`$ECHO \"$cc_temp\" | $SED \"s%.*/%%; s%^$host_alias-%%\"`\n])\n\n\n# _LT_FILEUTILS_DEFAULTS\n# ----------------------\n# It is okay to use these file commands and assume they have been set\n# sensibly after `m4_require([_LT_FILEUTILS_DEFAULTS])'.\nm4_defun([_LT_FILEUTILS_DEFAULTS],\n[: ${CP=\"cp -f\"}\n: ${MV=\"mv -f\"}\n: ${RM=\"rm -f\"}\n])# _LT_FILEUTILS_DEFAULTS\n\n\n# _LT_SETUP\n# ---------\nm4_defun([_LT_SETUP],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\nAC_REQUIRE([_LT_PREPARE_SED_QUOTE_VARS])dnl\nAC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])dnl\n\n_LT_DECL([], [PATH_SEPARATOR], [1], [The PATH separator for the build system])dnl\ndnl\n_LT_DECL([], [host_alias], [0], [The host system])dnl\n_LT_DECL([], [host], [0])dnl\n_LT_DECL([], [host_os], [0])dnl\ndnl\n_LT_DECL([], [build_alias], [0], [The build system])dnl\n_LT_DECL([], [build], [0])dnl\n_LT_DECL([], [build_os], [0])dnl\ndnl\nAC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([LT_PATH_LD])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\ndnl\nAC_REQUIRE([AC_PROG_LN_S])dnl\ntest -z \"$LN_S\" && LN_S=\"ln -s\"\n_LT_DECL([], [LN_S], [1], [Whether we need soft or hard links])dnl\ndnl\nAC_REQUIRE([LT_CMD_MAX_LEN])dnl\n_LT_DECL([objext], [ac_objext], [0], [Object file suffix (normally \"o\")])dnl\n_LT_DECL([], [exeext], [0], [Executable file suffix (normally \"\")])dnl\ndnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_CHECK_SHELL_FEATURES])dnl\nm4_require([_LT_PATH_CONVERSION_FUNCTIONS])dnl\nm4_require([_LT_CMD_RELOAD])dnl\nm4_require([_LT_CHECK_MAGIC_METHOD])dnl\nm4_require([_LT_CHECK_SHAREDLIB_FROM_LINKLIB])dnl\nm4_require([_LT_CMD_OLD_ARCHIVE])dnl\nm4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl\nm4_require([_LT_WITH_SYSROOT])dnl\n\n_LT_CONFIG_LIBTOOL_INIT([\n# See if we are running on zsh, and set the options which allow our\n# commands through without removal of \\ escapes INIT.\nif test -n \"\\${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n])\nif test -n \"${ZSH_VERSION+set}\" ; then\n   setopt NO_GLOB_SUBST\nfi\n\n_LT_CHECK_OBJDIR\n\nm4_require([_LT_TAG_COMPILER])dnl\n\ncase $host_os in\naix3*)\n  # AIX sometimes has problems with the GCC collect2 program.  For some\n  # reason, if we set the COLLECT_NAMES environment variable, the problems\n  # vanish in a puff of smoke.\n  if test \"X${COLLECT_NAMES+set}\" != Xset; then\n    COLLECT_NAMES=\n    export COLLECT_NAMES\n  fi\n  ;;\nesac\n\n# Global variables:\nofile=libtool\ncan_build_shared=yes\n\n# All known linkers require a `.a' archive for static linking (except MSVC,\n# which needs '.lib').\nlibext=a\n\nwith_gnu_ld=\"$lt_cv_prog_gnu_ld\"\n\nold_CC=\"$CC\"\nold_CFLAGS=\"$CFLAGS\"\n\n# Set sane defaults for various variables\ntest -z \"$CC\" && CC=cc\ntest -z \"$LTCC\" && LTCC=$CC\ntest -z \"$LTCFLAGS\" && LTCFLAGS=$CFLAGS\ntest -z \"$LD\" && LD=ld\ntest -z \"$ac_objext\" && ac_objext=o\n\n_LT_CC_BASENAME([$compiler])\n\n# Only perform the check for file, if the check method requires it\ntest -z \"$MAGIC_CMD\" && MAGIC_CMD=file\ncase $deplibs_check_method in\nfile_magic*)\n  if test \"$file_magic_cmd\" = '$MAGIC_CMD'; then\n    _LT_PATH_MAGIC\n  fi\n  ;;\nesac\n\n# Use C for the default configuration in the libtool script\nLT_SUPPORTED_TAG([CC])\n_LT_LANG_C_CONFIG\n_LT_LANG_DEFAULT_CONFIG\n_LT_CONFIG_COMMANDS\n])# _LT_SETUP\n\n\n# _LT_PREPARE_SED_QUOTE_VARS\n# --------------------------\n# Define a few sed substitution that help us do robust quoting.\nm4_defun([_LT_PREPARE_SED_QUOTE_VARS],\n[# Backslashify metacharacters that are still active within\n# double-quoted strings.\nsed_quote_subst='s/\\([[\"`$\\\\]]\\)/\\\\\\1/g'\n\n# Same as above, but do not quote variable references.\ndouble_quote_subst='s/\\([[\"`\\\\]]\\)/\\\\\\1/g'\n\n# Sed substitution to delay expansion of an escaped shell variable in a\n# double_quote_subst'ed string.\ndelay_variable_subst='s/\\\\\\\\\\\\\\\\\\\\\\$/\\\\\\\\\\\\$/g'\n\n# Sed substitution to delay expansion of an escaped single quote.\ndelay_single_quote_subst='s/'\\''/'\\'\\\\\\\\\\\\\\'\\''/g'\n\n# Sed substitution to avoid accidental globbing in evaled expressions\nno_glob_subst='s/\\*/\\\\\\*/g'\n])\n\n# _LT_PROG_LTMAIN\n# ---------------\n# Note that this code is called both from `configure', and `config.status'\n# now that we use AC_CONFIG_COMMANDS to generate libtool.  Notably,\n# `config.status' has no value for ac_aux_dir unless we are using Automake,\n# so we pass a copy along to make sure it has a sensible value anyway.\nm4_defun([_LT_PROG_LTMAIN],\n[m4_ifdef([AC_REQUIRE_AUX_FILE], [AC_REQUIRE_AUX_FILE([ltmain.sh])])dnl\n_LT_CONFIG_LIBTOOL_INIT([ac_aux_dir='$ac_aux_dir'])\nltmain=\"$ac_aux_dir/ltmain.sh\"\n])# _LT_PROG_LTMAIN\n\n\n## ------------------------------------- ##\n## Accumulate code for creating libtool. ##\n## ------------------------------------- ##\n\n# So that we can recreate a full libtool script including additional\n# tags, we accumulate the chunks of code to send to AC_CONFIG_COMMANDS\n# in macros and then make a single call at the end using the `libtool'\n# label.\n\n\n# _LT_CONFIG_LIBTOOL_INIT([INIT-COMMANDS])\n# ----------------------------------------\n# Register INIT-COMMANDS to be passed to AC_CONFIG_COMMANDS later.\nm4_define([_LT_CONFIG_LIBTOOL_INIT],\n[m4_ifval([$1],\n          [m4_append([_LT_OUTPUT_LIBTOOL_INIT],\n                     [$1\n])])])\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_INIT])\n\n\n# _LT_CONFIG_LIBTOOL([COMMANDS])\n# ------------------------------\n# Register COMMANDS to be passed to AC_CONFIG_COMMANDS later.\nm4_define([_LT_CONFIG_LIBTOOL],\n[m4_ifval([$1],\n          [m4_append([_LT_OUTPUT_LIBTOOL_COMMANDS],\n                     [$1\n])])])\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_COMMANDS])\n\n\n# _LT_CONFIG_SAVE_COMMANDS([COMMANDS], [INIT_COMMANDS])\n# -----------------------------------------------------\nm4_defun([_LT_CONFIG_SAVE_COMMANDS],\n[_LT_CONFIG_LIBTOOL([$1])\n_LT_CONFIG_LIBTOOL_INIT([$2])\n])\n\n\n# _LT_FORMAT_COMMENT([COMMENT])\n# -----------------------------\n# Add leading comment marks to the start of each line, and a trailing\n# full-stop to the whole comment if one is not present already.\nm4_define([_LT_FORMAT_COMMENT],\n[m4_ifval([$1], [\nm4_bpatsubst([m4_bpatsubst([$1], [^ *], [# ])],\n              [['`$\\]], [\\\\\\&])]m4_bmatch([$1], [[!?.]$], [], [.])\n)])\n\n\n\n## ------------------------ ##\n## FIXME: Eliminate VARNAME ##\n## ------------------------ ##\n\n\n# _LT_DECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION], [IS-TAGGED?])\n# -------------------------------------------------------------------\n# CONFIGNAME is the name given to the value in the libtool script.\n# VARNAME is the (base) name used in the configure script.\n# VALUE may be 0, 1 or 2 for a computed quote escaped value based on\n# VARNAME.  Any other value will be used directly.\nm4_define([_LT_DECL],\n[lt_if_append_uniq([lt_decl_varnames], [$2], [, ],\n    [lt_dict_add_subkey([lt_decl_dict], [$2], [libtool_name],\n\t[m4_ifval([$1], [$1], [$2])])\n    lt_dict_add_subkey([lt_decl_dict], [$2], [value], [$3])\n    m4_ifval([$4],\n\t[lt_dict_add_subkey([lt_decl_dict], [$2], [description], [$4])])\n    lt_dict_add_subkey([lt_decl_dict], [$2],\n\t[tagged?], [m4_ifval([$5], [yes], [no])])])\n])\n\n\n# _LT_TAGDECL([CONFIGNAME], VARNAME, VALUE, [DESCRIPTION])\n# --------------------------------------------------------\nm4_define([_LT_TAGDECL], [_LT_DECL([$1], [$2], [$3], [$4], [yes])])\n\n\n# lt_decl_tag_varnames([SEPARATOR], [VARNAME1...])\n# ------------------------------------------------\nm4_define([lt_decl_tag_varnames],\n[_lt_decl_filter([tagged?], [yes], $@)])\n\n\n# _lt_decl_filter(SUBKEY, VALUE, [SEPARATOR], [VARNAME1..])\n# ---------------------------------------------------------\nm4_define([_lt_decl_filter],\n[m4_case([$#],\n  [0], [m4_fatal([$0: too few arguments: $#])],\n  [1], [m4_fatal([$0: too few arguments: $#: $1])],\n  [2], [lt_dict_filter([lt_decl_dict], [$1], [$2], [], lt_decl_varnames)],\n  [3], [lt_dict_filter([lt_decl_dict], [$1], [$2], [$3], lt_decl_varnames)],\n  [lt_dict_filter([lt_decl_dict], $@)])[]dnl\n])\n\n\n# lt_decl_quote_varnames([SEPARATOR], [VARNAME1...])\n# --------------------------------------------------\nm4_define([lt_decl_quote_varnames],\n[_lt_decl_filter([value], [1], $@)])\n\n\n# lt_decl_dquote_varnames([SEPARATOR], [VARNAME1...])\n# ---------------------------------------------------\nm4_define([lt_decl_dquote_varnames],\n[_lt_decl_filter([value], [2], $@)])\n\n\n# lt_decl_varnames_tagged([SEPARATOR], [VARNAME1...])\n# ---------------------------------------------------\nm4_define([lt_decl_varnames_tagged],\n[m4_assert([$# <= 2])dnl\n_$0(m4_quote(m4_default([$1], [[, ]])),\n    m4_ifval([$2], [[$2]], [m4_dquote(lt_decl_tag_varnames)]),\n    m4_split(m4_normalize(m4_quote(_LT_TAGS)), [ ]))])\nm4_define([_lt_decl_varnames_tagged],\n[m4_ifval([$3], [lt_combine([$1], [$2], [_], $3)])])\n\n\n# lt_decl_all_varnames([SEPARATOR], [VARNAME1...])\n# ------------------------------------------------\nm4_define([lt_decl_all_varnames],\n[_$0(m4_quote(m4_default([$1], [[, ]])),\n     m4_if([$2], [],\n\t   m4_quote(lt_decl_varnames),\n\tm4_quote(m4_shift($@))))[]dnl\n])\nm4_define([_lt_decl_all_varnames],\n[lt_join($@, lt_decl_varnames_tagged([$1],\n\t\t\tlt_decl_tag_varnames([[, ]], m4_shift($@))))dnl\n])\n\n\n# _LT_CONFIG_STATUS_DECLARE([VARNAME])\n# ------------------------------------\n# Quote a variable value, and forward it to `config.status' so that its\n# declaration there will have the same value as in `configure'.  VARNAME\n# must have a single quote delimited value for this to work.\nm4_define([_LT_CONFIG_STATUS_DECLARE],\n[$1='`$ECHO \"$][$1\" | $SED \"$delay_single_quote_subst\"`'])\n\n\n# _LT_CONFIG_STATUS_DECLARATIONS\n# ------------------------------\n# We delimit libtool config variables with single quotes, so when\n# we write them to config.status, we have to be sure to quote all\n# embedded single quotes properly.  In configure, this macro expands\n# each variable declared with _LT_DECL (and _LT_TAGDECL) into:\n#\n#    <var>='`$ECHO \"$<var>\" | $SED \"$delay_single_quote_subst\"`'\nm4_defun([_LT_CONFIG_STATUS_DECLARATIONS],\n[m4_foreach([_lt_var], m4_quote(lt_decl_all_varnames),\n    [m4_n([_LT_CONFIG_STATUS_DECLARE(_lt_var)])])])\n\n\n# _LT_LIBTOOL_TAGS\n# ----------------\n# Output comment and list of tags supported by the script\nm4_defun([_LT_LIBTOOL_TAGS],\n[_LT_FORMAT_COMMENT([The names of the tagged configurations supported by this script])dnl\navailable_tags=\"_LT_TAGS\"dnl\n])\n\n\n# _LT_LIBTOOL_DECLARE(VARNAME, [TAG])\n# -----------------------------------\n# Extract the dictionary values for VARNAME (optionally with TAG) and\n# expand to a commented shell variable setting:\n#\n#    # Some comment about what VAR is for.\n#    visible_name=$lt_internal_name\nm4_define([_LT_LIBTOOL_DECLARE],\n[_LT_FORMAT_COMMENT(m4_quote(lt_dict_fetch([lt_decl_dict], [$1],\n\t\t\t\t\t   [description])))[]dnl\nm4_pushdef([_libtool_name],\n    m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [libtool_name])))[]dnl\nm4_case(m4_quote(lt_dict_fetch([lt_decl_dict], [$1], [value])),\n    [0], [_libtool_name=[$]$1],\n    [1], [_libtool_name=$lt_[]$1],\n    [2], [_libtool_name=$lt_[]$1],\n    [_libtool_name=lt_dict_fetch([lt_decl_dict], [$1], [value])])[]dnl\nm4_ifval([$2], [_$2])[]m4_popdef([_libtool_name])[]dnl\n])\n\n\n# _LT_LIBTOOL_CONFIG_VARS\n# -----------------------\n# Produce commented declarations of non-tagged libtool config variables\n# suitable for insertion in the LIBTOOL CONFIG section of the `libtool'\n# script.  Tagged libtool config variables (even for the LIBTOOL CONFIG\n# section) are produced by _LT_LIBTOOL_TAG_VARS.\nm4_defun([_LT_LIBTOOL_CONFIG_VARS],\n[m4_foreach([_lt_var],\n    m4_quote(_lt_decl_filter([tagged?], [no], [], lt_decl_varnames)),\n    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var)])])])\n\n\n# _LT_LIBTOOL_TAG_VARS(TAG)\n# -------------------------\nm4_define([_LT_LIBTOOL_TAG_VARS],\n[m4_foreach([_lt_var], m4_quote(lt_decl_tag_varnames),\n    [m4_n([_LT_LIBTOOL_DECLARE(_lt_var, [$1])])])])\n\n\n# _LT_TAGVAR(VARNAME, [TAGNAME])\n# ------------------------------\nm4_define([_LT_TAGVAR], [m4_ifval([$2], [$1_$2], [$1])])\n\n\n# _LT_CONFIG_COMMANDS\n# -------------------\n# Send accumulated output to $CONFIG_STATUS.  Thanks to the lists of\n# variables for single and double quote escaping we saved from calls\n# to _LT_DECL, we can put quote escaped variables declarations\n# into `config.status', and then the shell code to quote escape them in\n# for loops in `config.status'.  Finally, any additional code accumulated\n# from calls to _LT_CONFIG_LIBTOOL_INIT is expanded.\nm4_defun([_LT_CONFIG_COMMANDS],\n[AC_PROVIDE_IFELSE([LT_OUTPUT],\n\tdnl If the libtool generation code has been placed in $CONFIG_LT,\n\tdnl instead of duplicating it all over again into config.status,\n\tdnl then we will have config.status run $CONFIG_LT later, so it\n\tdnl needs to know what name is stored there:\n        [AC_CONFIG_COMMANDS([libtool],\n            [$SHELL $CONFIG_LT || AS_EXIT(1)], [CONFIG_LT='$CONFIG_LT'])],\n    dnl If the libtool generation code is destined for config.status,\n    dnl expand the accumulated commands and init code now:\n    [AC_CONFIG_COMMANDS([libtool],\n        [_LT_OUTPUT_LIBTOOL_COMMANDS], [_LT_OUTPUT_LIBTOOL_COMMANDS_INIT])])\n])#_LT_CONFIG_COMMANDS\n\n\n# Initialize.\nm4_define([_LT_OUTPUT_LIBTOOL_COMMANDS_INIT],\n[\n\n# The HP-UX ksh and POSIX shell print the target directory to stdout\n# if CDPATH is set.\n(unset CDPATH) >/dev/null 2>&1 && unset CDPATH\n\nsed_quote_subst='$sed_quote_subst'\ndouble_quote_subst='$double_quote_subst'\ndelay_variable_subst='$delay_variable_subst'\n_LT_CONFIG_STATUS_DECLARATIONS\nLTCC='$LTCC'\nLTCFLAGS='$LTCFLAGS'\ncompiler='$compiler_DEFAULT'\n\n# A function that is used when there is no print builtin or printf.\nfunc_fallback_echo ()\n{\n  eval 'cat <<_LTECHO_EOF\n\\$[]1\n_LTECHO_EOF'\n}\n\n# Quote evaled strings.\nfor var in lt_decl_all_varnames([[ \\\n]], lt_decl_quote_varnames); do\n    case \\`eval \\\\\\\\\\$ECHO \\\\\\\\\"\"\\\\\\\\\\$\\$var\"\\\\\\\\\"\\` in\n    *[[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"\\\\\\$\\$var\\\\\" | \\\\\\$SED \\\\\"\\\\\\$sed_quote_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n# Double-quote double-evaled strings.\nfor var in lt_decl_all_varnames([[ \\\n]], lt_decl_dquote_varnames); do\n    case \\`eval \\\\\\\\\\$ECHO \\\\\\\\\"\"\\\\\\\\\\$\\$var\"\\\\\\\\\"\\` in\n    *[[\\\\\\\\\\\\\\`\\\\\"\\\\\\$]]*)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\`\\\\\\$ECHO \\\\\"\\\\\\$\\$var\\\\\" | \\\\\\$SED -e \\\\\"\\\\\\$double_quote_subst\\\\\" -e \\\\\"\\\\\\$sed_quote_subst\\\\\" -e \\\\\"\\\\\\$delay_variable_subst\\\\\"\\\\\\`\\\\\\\\\\\\\"\"\n      ;;\n    *)\n      eval \"lt_\\$var=\\\\\\\\\\\\\"\\\\\\$\\$var\\\\\\\\\\\\\"\"\n      ;;\n    esac\ndone\n\n_LT_OUTPUT_LIBTOOL_INIT\n])\n\n# _LT_GENERATED_FILE_INIT(FILE, [COMMENT])\n# ------------------------------------\n# Generate a child script FILE with all initialization necessary to\n# reuse the environment learned by the parent script, and make the\n# file executable.  If COMMENT is supplied, it is inserted after the\n# `#!' sequence but before initialization text begins.  After this\n# macro, additional text can be appended to FILE to form the body of\n# the child script.  The macro ends with non-zero status if the\n# file could not be fully written (such as if the disk is full).\nm4_ifdef([AS_INIT_GENERATED],\n[m4_defun([_LT_GENERATED_FILE_INIT],[AS_INIT_GENERATED($@)])],\n[m4_defun([_LT_GENERATED_FILE_INIT],\n[m4_require([AS_PREPARE])]dnl\n[m4_pushdef([AS_MESSAGE_LOG_FD])]dnl\n[lt_write_fail=0\ncat >$1 <<_ASEOF || lt_write_fail=1\n#! $SHELL\n# Generated by $as_me.\n$2\nSHELL=\\${CONFIG_SHELL-$SHELL}\nexport SHELL\n_ASEOF\ncat >>$1 <<\\_ASEOF || lt_write_fail=1\nAS_SHELL_SANITIZE\n_AS_PREPARE\nexec AS_MESSAGE_FD>&1\n_ASEOF\ntest $lt_write_fail = 0 && chmod +x $1[]dnl\nm4_popdef([AS_MESSAGE_LOG_FD])])])# _LT_GENERATED_FILE_INIT\n\n# LT_OUTPUT\n# ---------\n# This macro allows early generation of the libtool script (before\n# AC_OUTPUT is called), incase it is used in configure for compilation\n# tests.\nAC_DEFUN([LT_OUTPUT],\n[: ${CONFIG_LT=./config.lt}\nAC_MSG_NOTICE([creating $CONFIG_LT])\n_LT_GENERATED_FILE_INIT([\"$CONFIG_LT\"],\n[# Run this file to recreate a libtool stub with the current configuration.])\n\ncat >>\"$CONFIG_LT\" <<\\_LTEOF\nlt_cl_silent=false\nexec AS_MESSAGE_LOG_FD>>config.log\n{\n  echo\n  AS_BOX([Running $as_me.])\n} >&AS_MESSAGE_LOG_FD\n\nlt_cl_help=\"\\\n\\`$as_me' creates a local libtool stub from the current configuration,\nfor use in further configure time tests before the real libtool is\ngenerated.\n\nUsage: $[0] [[OPTIONS]]\n\n  -h, --help      print this help, then exit\n  -V, --version   print version number, then exit\n  -q, --quiet     do not print progress messages\n  -d, --debug     don't remove temporary files\n\nReport bugs to <bug-libtool@gnu.org>.\"\n\nlt_cl_version=\"\\\nm4_ifset([AC_PACKAGE_NAME], [AC_PACKAGE_NAME ])config.lt[]dnl\nm4_ifset([AC_PACKAGE_VERSION], [ AC_PACKAGE_VERSION])\nconfigured by $[0], generated by m4_PACKAGE_STRING.\n\nCopyright (C) 2011 Free Software Foundation, Inc.\nThis config.lt script is free software; the Free Software Foundation\ngives unlimited permision to copy, distribute and modify it.\"\n\nwhile test $[#] != 0\ndo\n  case $[1] in\n    --version | --v* | -V )\n      echo \"$lt_cl_version\"; exit 0 ;;\n    --help | --h* | -h )\n      echo \"$lt_cl_help\"; exit 0 ;;\n    --debug | --d* | -d )\n      debug=: ;;\n    --quiet | --q* | --silent | --s* | -q )\n      lt_cl_silent=: ;;\n\n    -*) AC_MSG_ERROR([unrecognized option: $[1]\nTry \\`$[0] --help' for more information.]) ;;\n\n    *) AC_MSG_ERROR([unrecognized argument: $[1]\nTry \\`$[0] --help' for more information.]) ;;\n  esac\n  shift\ndone\n\nif $lt_cl_silent; then\n  exec AS_MESSAGE_FD>/dev/null\nfi\n_LTEOF\n\ncat >>\"$CONFIG_LT\" <<_LTEOF\n_LT_OUTPUT_LIBTOOL_COMMANDS_INIT\n_LTEOF\n\ncat >>\"$CONFIG_LT\" <<\\_LTEOF\nAC_MSG_NOTICE([creating $ofile])\n_LT_OUTPUT_LIBTOOL_COMMANDS\nAS_EXIT(0)\n_LTEOF\nchmod +x \"$CONFIG_LT\"\n\n# configure is writing to config.log, but config.lt does its own redirection,\n# appending to config.log, which fails on DOS, as config.log is still kept\n# open by configure.  Here we exec the FD to /dev/null, effectively closing\n# config.log, so it can be properly (re)opened and appended to by config.lt.\nlt_cl_success=:\ntest \"$silent\" = yes &&\n  lt_config_lt_args=\"$lt_config_lt_args --quiet\"\nexec AS_MESSAGE_LOG_FD>/dev/null\n$SHELL \"$CONFIG_LT\" $lt_config_lt_args || lt_cl_success=false\nexec AS_MESSAGE_LOG_FD>>config.log\n$lt_cl_success || AS_EXIT(1)\n])# LT_OUTPUT\n\n\n# _LT_CONFIG(TAG)\n# ---------------\n# If TAG is the built-in tag, create an initial libtool script with a\n# default configuration from the untagged config vars.  Otherwise add code\n# to config.status for appending the configuration named by TAG from the\n# matching tagged config vars.\nm4_defun([_LT_CONFIG],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\n_LT_CONFIG_SAVE_COMMANDS([\n  m4_define([_LT_TAG], m4_if([$1], [], [C], [$1]))dnl\n  m4_if(_LT_TAG, [C], [\n    # See if we are running on zsh, and set the options which allow our\n    # commands through without removal of \\ escapes.\n    if test -n \"${ZSH_VERSION+set}\" ; then\n      setopt NO_GLOB_SUBST\n    fi\n\n    cfgfile=\"${ofile}T\"\n    trap \"$RM \\\"$cfgfile\\\"; exit 1\" 1 2 15\n    $RM \"$cfgfile\"\n\n    cat <<_LT_EOF >> \"$cfgfile\"\n#! $SHELL\n\n# `$ECHO \"$ofile\" | sed 's%^.*/%%'` - Provide generalized library-building support services.\n# Generated automatically by $as_me ($PACKAGE$TIMESTAMP) $VERSION\n# Libtool was configured on host `(hostname || uname -n) 2>/dev/null | sed 1q`:\n# NOTE: Changes made to this file will be lost: look at ltmain.sh.\n#\n_LT_COPYING\n_LT_LIBTOOL_TAGS\n\n# ### BEGIN LIBTOOL CONFIG\n_LT_LIBTOOL_CONFIG_VARS\n_LT_LIBTOOL_TAG_VARS\n# ### END LIBTOOL CONFIG\n\n_LT_EOF\n\n  case $host_os in\n  aix3*)\n    cat <<\\_LT_EOF >> \"$cfgfile\"\n# AIX sometimes has problems with the GCC collect2 program.  For some\n# reason, if we set the COLLECT_NAMES environment variable, the problems\n# vanish in a puff of smoke.\nif test \"X${COLLECT_NAMES+set}\" != Xset; then\n  COLLECT_NAMES=\n  export COLLECT_NAMES\nfi\n_LT_EOF\n    ;;\n  esac\n\n  _LT_PROG_LTMAIN\n\n  # We use sed instead of cat because bash on DJGPP gets confused if\n  # if finds mixed CR/LF and LF-only lines.  Since sed operates in\n  # text mode, it properly converts lines to CR/LF.  This bash problem\n  # is reportedly fixed, but why not run on old versions too?\n  sed '$q' \"$ltmain\" >> \"$cfgfile\" \\\n     || (rm -f \"$cfgfile\"; exit 1)\n\n  _LT_PROG_REPLACE_SHELLFNS\n\n   mv -f \"$cfgfile\" \"$ofile\" ||\n    (rm -f \"$ofile\" && cp \"$cfgfile\" \"$ofile\" && rm -f \"$cfgfile\")\n  chmod +x \"$ofile\"\n],\n[cat <<_LT_EOF >> \"$ofile\"\n\ndnl Unfortunately we have to use $1 here, since _LT_TAG is not expanded\ndnl in a comment (ie after a #).\n# ### BEGIN LIBTOOL TAG CONFIG: $1\n_LT_LIBTOOL_TAG_VARS(_LT_TAG)\n# ### END LIBTOOL TAG CONFIG: $1\n_LT_EOF\n])dnl /m4_if\n],\n[m4_if([$1], [], [\n    PACKAGE='$PACKAGE'\n    VERSION='$VERSION'\n    TIMESTAMP='$TIMESTAMP'\n    RM='$RM'\n    ofile='$ofile'], [])\n])dnl /_LT_CONFIG_SAVE_COMMANDS\n])# _LT_CONFIG\n\n\n# LT_SUPPORTED_TAG(TAG)\n# ---------------------\n# Trace this macro to discover what tags are supported by the libtool\n# --tag option, using:\n#    autoconf --trace 'LT_SUPPORTED_TAG:$1'\nAC_DEFUN([LT_SUPPORTED_TAG], [])\n\n\n# C support is built-in for now\nm4_define([_LT_LANG_C_enabled], [])\nm4_define([_LT_TAGS], [])\n\n\n# LT_LANG(LANG)\n# -------------\n# Enable libtool support for the given language if not already enabled.\nAC_DEFUN([LT_LANG],\n[AC_BEFORE([$0], [LT_OUTPUT])dnl\nm4_case([$1],\n  [C],\t\t\t[_LT_LANG(C)],\n  [C++],\t\t[_LT_LANG(CXX)],\n  [Go],\t\t\t[_LT_LANG(GO)],\n  [Java],\t\t[_LT_LANG(GCJ)],\n  [Fortran 77],\t\t[_LT_LANG(F77)],\n  [Fortran],\t\t[_LT_LANG(FC)],\n  [Windows Resource],\t[_LT_LANG(RC)],\n  [m4_ifdef([_LT_LANG_]$1[_CONFIG],\n    [_LT_LANG($1)],\n    [m4_fatal([$0: unsupported language: \"$1\"])])])dnl\n])# LT_LANG\n\n\n# _LT_LANG(LANGNAME)\n# ------------------\nm4_defun([_LT_LANG],\n[m4_ifdef([_LT_LANG_]$1[_enabled], [],\n  [LT_SUPPORTED_TAG([$1])dnl\n  m4_append([_LT_TAGS], [$1 ])dnl\n  m4_define([_LT_LANG_]$1[_enabled], [])dnl\n  _LT_LANG_$1_CONFIG($1)])dnl\n])# _LT_LANG\n\n\nm4_ifndef([AC_PROG_GO], [\n############################################################\n# NOTE: This macro has been submitted for inclusion into   #\n#  GNU Autoconf as AC_PROG_GO.  When it is available in    #\n#  a released version of Autoconf we should remove this    #\n#  macro and use it instead.                               #\n############################################################\nm4_defun([AC_PROG_GO],\n[AC_LANG_PUSH(Go)dnl\nAC_ARG_VAR([GOC],     [Go compiler command])dnl\nAC_ARG_VAR([GOFLAGS], [Go compiler flags])dnl\n_AC_ARG_VAR_LDFLAGS()dnl\nAC_CHECK_TOOL(GOC, gccgo)\nif test -z \"$GOC\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    AC_CHECK_PROG(GOC, [${ac_tool_prefix}gccgo], [${ac_tool_prefix}gccgo])\n  fi\nfi\nif test -z \"$GOC\"; then\n  AC_CHECK_PROG(GOC, gccgo, gccgo, false)\nfi\n])#m4_defun\n])#m4_ifndef\n\n\n# _LT_LANG_DEFAULT_CONFIG\n# -----------------------\nm4_defun([_LT_LANG_DEFAULT_CONFIG],\n[AC_PROVIDE_IFELSE([AC_PROG_CXX],\n  [LT_LANG(CXX)],\n  [m4_define([AC_PROG_CXX], defn([AC_PROG_CXX])[LT_LANG(CXX)])])\n\nAC_PROVIDE_IFELSE([AC_PROG_F77],\n  [LT_LANG(F77)],\n  [m4_define([AC_PROG_F77], defn([AC_PROG_F77])[LT_LANG(F77)])])\n\nAC_PROVIDE_IFELSE([AC_PROG_FC],\n  [LT_LANG(FC)],\n  [m4_define([AC_PROG_FC], defn([AC_PROG_FC])[LT_LANG(FC)])])\n\ndnl The call to [A][M_PROG_GCJ] is quoted like that to stop aclocal\ndnl pulling things in needlessly.\nAC_PROVIDE_IFELSE([AC_PROG_GCJ],\n  [LT_LANG(GCJ)],\n  [AC_PROVIDE_IFELSE([A][M_PROG_GCJ],\n    [LT_LANG(GCJ)],\n    [AC_PROVIDE_IFELSE([LT_PROG_GCJ],\n      [LT_LANG(GCJ)],\n      [m4_ifdef([AC_PROG_GCJ],\n\t[m4_define([AC_PROG_GCJ], defn([AC_PROG_GCJ])[LT_LANG(GCJ)])])\n       m4_ifdef([A][M_PROG_GCJ],\n\t[m4_define([A][M_PROG_GCJ], defn([A][M_PROG_GCJ])[LT_LANG(GCJ)])])\n       m4_ifdef([LT_PROG_GCJ],\n\t[m4_define([LT_PROG_GCJ], defn([LT_PROG_GCJ])[LT_LANG(GCJ)])])])])])\n\nAC_PROVIDE_IFELSE([AC_PROG_GO],\n  [LT_LANG(GO)],\n  [m4_define([AC_PROG_GO], defn([AC_PROG_GO])[LT_LANG(GO)])])\n\nAC_PROVIDE_IFELSE([LT_PROG_RC],\n  [LT_LANG(RC)],\n  [m4_define([LT_PROG_RC], defn([LT_PROG_RC])[LT_LANG(RC)])])\n])# _LT_LANG_DEFAULT_CONFIG\n\n# Obsolete macros:\nAU_DEFUN([AC_LIBTOOL_CXX], [LT_LANG(C++)])\nAU_DEFUN([AC_LIBTOOL_F77], [LT_LANG(Fortran 77)])\nAU_DEFUN([AC_LIBTOOL_FC], [LT_LANG(Fortran)])\nAU_DEFUN([AC_LIBTOOL_GCJ], [LT_LANG(Java)])\nAU_DEFUN([AC_LIBTOOL_RC], [LT_LANG(Windows Resource)])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_CXX], [])\ndnl AC_DEFUN([AC_LIBTOOL_F77], [])\ndnl AC_DEFUN([AC_LIBTOOL_FC], [])\ndnl AC_DEFUN([AC_LIBTOOL_GCJ], [])\ndnl AC_DEFUN([AC_LIBTOOL_RC], [])\n\n\n# _LT_TAG_COMPILER\n# ----------------\nm4_defun([_LT_TAG_COMPILER],\n[AC_REQUIRE([AC_PROG_CC])dnl\n\n_LT_DECL([LTCC], [CC], [1], [A C compiler])dnl\n_LT_DECL([LTCFLAGS], [CFLAGS], [1], [LTCC compiler flags])dnl\n_LT_TAGDECL([CC], [compiler], [1], [A language specific compiler])dnl\n_LT_TAGDECL([with_gcc], [GCC], [0], [Is the compiler the GNU compiler?])dnl\n\n# If no C compiler was specified, use CC.\nLTCC=${LTCC-\"$CC\"}\n\n# If no C compiler flags were specified, use CFLAGS.\nLTCFLAGS=${LTCFLAGS-\"$CFLAGS\"}\n\n# Allow CC to be a program name with arguments.\ncompiler=$CC\n])# _LT_TAG_COMPILER\n\n\n# _LT_COMPILER_BOILERPLATE\n# ------------------------\n# Check for compiler boilerplate output or warnings with\n# the simple compiler test code.\nm4_defun([_LT_COMPILER_BOILERPLATE],\n[m4_require([_LT_DECL_SED])dnl\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_compile_test_code\" >conftest.$ac_ext\neval \"$ac_compile\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_compiler_boilerplate=`cat conftest.err`\n$RM conftest*\n])# _LT_COMPILER_BOILERPLATE\n\n\n# _LT_LINKER_BOILERPLATE\n# ----------------------\n# Check for linker boilerplate output or warnings with\n# the simple link test code.\nm4_defun([_LT_LINKER_BOILERPLATE],\n[m4_require([_LT_DECL_SED])dnl\nac_outfile=conftest.$ac_objext\necho \"$lt_simple_link_test_code\" >conftest.$ac_ext\neval \"$ac_link\" 2>&1 >/dev/null | $SED '/^$/d; /^ *+/d' >conftest.err\n_lt_linker_boilerplate=`cat conftest.err`\n$RM -r conftest*\n])# _LT_LINKER_BOILERPLATE\n\n# _LT_REQUIRED_DARWIN_CHECKS\n# -------------------------\nm4_defun_once([_LT_REQUIRED_DARWIN_CHECKS],[\n  case $host_os in\n    rhapsody* | darwin*)\n    AC_CHECK_TOOL([DSYMUTIL], [dsymutil], [:])\n    AC_CHECK_TOOL([NMEDIT], [nmedit], [:])\n    AC_CHECK_TOOL([LIPO], [lipo], [:])\n    AC_CHECK_TOOL([OTOOL], [otool], [:])\n    AC_CHECK_TOOL([OTOOL64], [otool64], [:])\n    _LT_DECL([], [DSYMUTIL], [1],\n      [Tool to manipulate archived DWARF debug symbol files on Mac OS X])\n    _LT_DECL([], [NMEDIT], [1],\n      [Tool to change global to local symbols on Mac OS X])\n    _LT_DECL([], [LIPO], [1],\n      [Tool to manipulate fat objects and archives on Mac OS X])\n    _LT_DECL([], [OTOOL], [1],\n      [ldd/readelf like tool for Mach-O binaries on Mac OS X])\n    _LT_DECL([], [OTOOL64], [1],\n      [ldd/readelf like tool for 64 bit Mach-O binaries on Mac OS X 10.4])\n\n    AC_CACHE_CHECK([for -single_module linker flag],[lt_cv_apple_cc_single_mod],\n      [lt_cv_apple_cc_single_mod=no\n      if test -z \"${LT_MULTI_MODULE}\"; then\n\t# By default we will add the -single_module flag. You can override\n\t# by either setting the environment variable LT_MULTI_MODULE\n\t# non-empty at configure time, or by adding -multi_module to the\n\t# link flags.\n\trm -rf libconftest.dylib*\n\techo \"int foo(void){return 1;}\" > conftest.c\n\techo \"$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n-dynamiclib -Wl,-single_module conftest.c\" >&AS_MESSAGE_LOG_FD\n\t$LTCC $LTCFLAGS $LDFLAGS -o libconftest.dylib \\\n\t  -dynamiclib -Wl,-single_module conftest.c 2>conftest.err\n        _lt_result=$?\n\t# If there is a non-empty error log, and \"single_module\"\n\t# appears in it, assume the flag caused a linker warning\n        if test -s conftest.err && $GREP single_module conftest.err; then\n\t  cat conftest.err >&AS_MESSAGE_LOG_FD\n\t# Otherwise, if the output was created with a 0 exit code from\n\t# the compiler, it worked.\n\telif test -f libconftest.dylib && test $_lt_result -eq 0; then\n\t  lt_cv_apple_cc_single_mod=yes\n\telse\n\t  cat conftest.err >&AS_MESSAGE_LOG_FD\n\tfi\n\trm -rf libconftest.dylib*\n\trm -f conftest.*\n      fi])\n\n    AC_CACHE_CHECK([for -exported_symbols_list linker flag],\n      [lt_cv_ld_exported_symbols_list],\n      [lt_cv_ld_exported_symbols_list=no\n      save_LDFLAGS=$LDFLAGS\n      echo \"_main\" > conftest.sym\n      LDFLAGS=\"$LDFLAGS -Wl,-exported_symbols_list,conftest.sym\"\n      AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],\n\t[lt_cv_ld_exported_symbols_list=yes],\n\t[lt_cv_ld_exported_symbols_list=no])\n\tLDFLAGS=\"$save_LDFLAGS\"\n    ])\n\n    AC_CACHE_CHECK([for -force_load linker flag],[lt_cv_ld_force_load],\n      [lt_cv_ld_force_load=no\n      cat > conftest.c << _LT_EOF\nint forced_loaded() { return 2;}\n_LT_EOF\n      echo \"$LTCC $LTCFLAGS -c -o conftest.o conftest.c\" >&AS_MESSAGE_LOG_FD\n      $LTCC $LTCFLAGS -c -o conftest.o conftest.c 2>&AS_MESSAGE_LOG_FD\n      echo \"$AR cru libconftest.a conftest.o\" >&AS_MESSAGE_LOG_FD\n      $AR cru libconftest.a conftest.o 2>&AS_MESSAGE_LOG_FD\n      echo \"$RANLIB libconftest.a\" >&AS_MESSAGE_LOG_FD\n      $RANLIB libconftest.a 2>&AS_MESSAGE_LOG_FD\n      cat > conftest.c << _LT_EOF\nint main() { return 0;}\n_LT_EOF\n      echo \"$LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a\" >&AS_MESSAGE_LOG_FD\n      $LTCC $LTCFLAGS $LDFLAGS -o conftest conftest.c -Wl,-force_load,./libconftest.a 2>conftest.err\n      _lt_result=$?\n      if test -s conftest.err && $GREP force_load conftest.err; then\n\tcat conftest.err >&AS_MESSAGE_LOG_FD\n      elif test -f conftest && test $_lt_result -eq 0 && $GREP forced_load conftest >/dev/null 2>&1 ; then\n\tlt_cv_ld_force_load=yes\n      else\n\tcat conftest.err >&AS_MESSAGE_LOG_FD\n      fi\n        rm -f conftest.err libconftest.a conftest conftest.c\n        rm -rf conftest.dSYM\n    ])\n    case $host_os in\n    rhapsody* | darwin1.[[012]])\n      _lt_dar_allow_undefined='${wl}-undefined ${wl}suppress' ;;\n    darwin1.*)\n      _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n    darwin*) # darwin 5.x on\n      # if running on 10.5 or later, the deployment target defaults\n      # to the OS version, if on x86, and 10.4, the deployment\n      # target defaults to 10.4. Don't you love it?\n      case ${MACOSX_DEPLOYMENT_TARGET-10.0},$host in\n\t10.0,*86*-darwin8*|10.0,*-darwin[[91]]*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n\t10.[[012]]*)\n\t  _lt_dar_allow_undefined='${wl}-flat_namespace ${wl}-undefined ${wl}suppress' ;;\n\t10.*)\n\t  _lt_dar_allow_undefined='${wl}-undefined ${wl}dynamic_lookup' ;;\n      esac\n    ;;\n  esac\n    if test \"$lt_cv_apple_cc_single_mod\" = \"yes\"; then\n      _lt_dar_single_mod='$single_module'\n    fi\n    if test \"$lt_cv_ld_exported_symbols_list\" = \"yes\"; then\n      _lt_dar_export_syms=' ${wl}-exported_symbols_list,$output_objdir/${libname}-symbols.expsym'\n    else\n      _lt_dar_export_syms='~$NMEDIT -s $output_objdir/${libname}-symbols.expsym ${lib}'\n    fi\n    if test \"$DSYMUTIL\" != \":\" && test \"$lt_cv_ld_force_load\" = \"no\"; then\n      _lt_dsymutil='~$DSYMUTIL $lib || :'\n    else\n      _lt_dsymutil=\n    fi\n    ;;\n  esac\n])\n\n\n# _LT_DARWIN_LINKER_FEATURES([TAG])\n# ---------------------------------\n# Checks for linker and compiler features on darwin\nm4_defun([_LT_DARWIN_LINKER_FEATURES],\n[\n  m4_require([_LT_REQUIRED_DARWIN_CHECKS])\n  _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n  _LT_TAGVAR(hardcode_direct, $1)=no\n  _LT_TAGVAR(hardcode_automatic, $1)=yes\n  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n  if test \"$lt_cv_ld_force_load\" = \"yes\"; then\n    _LT_TAGVAR(whole_archive_flag_spec, $1)='`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience ${wl}-force_load,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"`'\n    m4_case([$1], [F77], [_LT_TAGVAR(compiler_needs_object, $1)=yes],\n                  [FC],  [_LT_TAGVAR(compiler_needs_object, $1)=yes])\n  else\n    _LT_TAGVAR(whole_archive_flag_spec, $1)=''\n  fi\n  _LT_TAGVAR(link_all_deplibs, $1)=yes\n  _LT_TAGVAR(allow_undefined_flag, $1)=\"$_lt_dar_allow_undefined\"\n  case $cc_basename in\n     ifort*) _lt_dar_can_shared=yes ;;\n     *) _lt_dar_can_shared=$GCC ;;\n  esac\n  if test \"$_lt_dar_can_shared\" = \"yes\"; then\n    output_verbose_link_cmd=func_echo_all\n    _LT_TAGVAR(archive_cmds, $1)=\"\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring $_lt_dar_single_mod${_lt_dsymutil}\"\n    _LT_TAGVAR(module_cmds, $1)=\"\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dsymutil}\"\n    _LT_TAGVAR(archive_expsym_cmds, $1)=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\$libobjs \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring ${_lt_dar_single_mod}${_lt_dar_export_syms}${_lt_dsymutil}\"\n    _LT_TAGVAR(module_expsym_cmds, $1)=\"sed -e 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC \\$allow_undefined_flag -o \\$lib -bundle \\$libobjs \\$deplibs \\$compiler_flags${_lt_dar_export_syms}${_lt_dsymutil}\"\n    m4_if([$1], [CXX],\n[   if test \"$lt_cv_apple_cc_single_mod\" != \"yes\"; then\n      _LT_TAGVAR(archive_cmds, $1)=\"\\$CC -r -keep_private_externs -nostdlib -o \\${lib}-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\${lib}-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring${_lt_dsymutil}\"\n      _LT_TAGVAR(archive_expsym_cmds, $1)=\"sed 's,^,_,' < \\$export_symbols > \\$output_objdir/\\${libname}-symbols.expsym~\\$CC -r -keep_private_externs -nostdlib -o \\${lib}-master.o \\$libobjs~\\$CC -dynamiclib \\$allow_undefined_flag -o \\$lib \\${lib}-master.o \\$deplibs \\$compiler_flags -install_name \\$rpath/\\$soname \\$verstring${_lt_dar_export_syms}${_lt_dsymutil}\"\n    fi\n],[])\n  else\n  _LT_TAGVAR(ld_shlibs, $1)=no\n  fi\n])\n\n# _LT_SYS_MODULE_PATH_AIX([TAGNAME])\n# ----------------------------------\n# Links a minimal program and checks the executable\n# for the system default hardcoded library path. In most cases,\n# this is /usr/lib:/lib, but when the MPI compilers are used\n# the location of the communication and MPI libs are included too.\n# If we don't find anything, use the default library path according\n# to the aix ld manual.\n# Store the results from the different compilers for each TAGNAME.\n# Allow to override them for all tags through lt_cv_aix_libpath.\nm4_defun([_LT_SYS_MODULE_PATH_AIX],\n[m4_require([_LT_DECL_SED])dnl\nif test \"${lt_cv_aix_libpath+set}\" = set; then\n  aix_libpath=$lt_cv_aix_libpath\nelse\n  AC_CACHE_VAL([_LT_TAGVAR([lt_cv_aix_libpath_], [$1])],\n  [AC_LINK_IFELSE([AC_LANG_PROGRAM],[\n  lt_aix_libpath_sed='[\n      /Import File Strings/,/^$/ {\n\t  /^0/ {\n\t      s/^0  *\\([^ ]*\\) *$/\\1/\n\t      p\n\t  }\n      }]'\n  _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -H conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  # Check for a 64-bit object if we didn't find anything.\n  if test -z \"$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])\"; then\n    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=`dump -HX64 conftest$ac_exeext 2>/dev/null | $SED -n -e \"$lt_aix_libpath_sed\"`\n  fi],[])\n  if test -z \"$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])\"; then\n    _LT_TAGVAR([lt_cv_aix_libpath_], [$1])=\"/usr/lib:/lib\"\n  fi\n  ])\n  aix_libpath=$_LT_TAGVAR([lt_cv_aix_libpath_], [$1])\nfi\n])# _LT_SYS_MODULE_PATH_AIX\n\n\n# _LT_SHELL_INIT(ARG)\n# -------------------\nm4_define([_LT_SHELL_INIT],\n[m4_divert_text([M4SH-INIT], [$1\n])])# _LT_SHELL_INIT\n\n\n\n# _LT_PROG_ECHO_BACKSLASH\n# -----------------------\n# Find how we can fake an echo command that does not interpret backslash.\n# In particular, with Autoconf 2.60 or later we add some code to the start\n# of the generated configure script which will find a shell with a builtin\n# printf (which we can use as an echo command).\nm4_defun([_LT_PROG_ECHO_BACKSLASH],\n[ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\nECHO=$ECHO$ECHO$ECHO$ECHO$ECHO\nECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO\n\nAC_MSG_CHECKING([how to print strings])\n# Test print first, because it will be a builtin if present.\nif test \"X`( print -r -- -n ) 2>/dev/null`\" = X-n && \\\n   test \"X`print -r -- $ECHO 2>/dev/null`\" = \"X$ECHO\"; then\n  ECHO='print -r --'\nelif test \"X`printf %s $ECHO 2>/dev/null`\" = \"X$ECHO\"; then\n  ECHO='printf %s\\n'\nelse\n  # Use this function as a fallback that always works.\n  func_fallback_echo ()\n  {\n    eval 'cat <<_LTECHO_EOF\n$[]1\n_LTECHO_EOF'\n  }\n  ECHO='func_fallback_echo'\nfi\n\n# func_echo_all arg...\n# Invoke $ECHO with all args, space-separated.\nfunc_echo_all ()\n{\n    $ECHO \"$*\" \n}\n\ncase \"$ECHO\" in\n  printf*) AC_MSG_RESULT([printf]) ;;\n  print*) AC_MSG_RESULT([print -r]) ;;\n  *) AC_MSG_RESULT([cat]) ;;\nesac\n\nm4_ifdef([_AS_DETECT_SUGGESTED],\n[_AS_DETECT_SUGGESTED([\n  test -n \"${ZSH_VERSION+set}${BASH_VERSION+set}\" || (\n    ECHO='\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\'\n    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO\n    ECHO=$ECHO$ECHO$ECHO$ECHO$ECHO$ECHO\n    PATH=/empty FPATH=/empty; export PATH FPATH\n    test \"X`printf %s $ECHO`\" = \"X$ECHO\" \\\n      || test \"X`print -r -- $ECHO`\" = \"X$ECHO\" )])])\n\n_LT_DECL([], [SHELL], [1], [Shell to use when invoking shell scripts])\n_LT_DECL([], [ECHO], [1], [An echo program that protects backslashes])\n])# _LT_PROG_ECHO_BACKSLASH\n\n\n# _LT_WITH_SYSROOT\n# ----------------\nAC_DEFUN([_LT_WITH_SYSROOT],\n[AC_MSG_CHECKING([for sysroot])\nAC_ARG_WITH([sysroot],\n[  --with-sysroot[=DIR] Search for dependent libraries within DIR\n                        (or the compiler's sysroot if not specified).],\n[], [with_sysroot=no])\n\ndnl lt_sysroot will always be passed unquoted.  We quote it here\ndnl in case the user passed a directory name.\nlt_sysroot=\ncase ${with_sysroot} in #(\n yes)\n   if test \"$GCC\" = yes; then\n     lt_sysroot=`$CC --print-sysroot 2>/dev/null`\n   fi\n   ;; #(\n /*)\n   lt_sysroot=`echo \"$with_sysroot\" | sed -e \"$sed_quote_subst\"`\n   ;; #(\n no|'')\n   ;; #(\n *)\n   AC_MSG_RESULT([${with_sysroot}])\n   AC_MSG_ERROR([The sysroot must be an absolute path.])\n   ;;\nesac\n\n AC_MSG_RESULT([${lt_sysroot:-no}])\n_LT_DECL([], [lt_sysroot], [0], [The root where to search for ]dnl\n[dependent libraries, and in which our libraries should be installed.])])\n\n# _LT_ENABLE_LOCK\n# ---------------\nm4_defun([_LT_ENABLE_LOCK],\n[AC_ARG_ENABLE([libtool-lock],\n  [AS_HELP_STRING([--disable-libtool-lock],\n    [avoid locking (might break parallel builds)])])\ntest \"x$enable_libtool_lock\" != xno && enable_libtool_lock=yes\n\n# Some flags need to be propagated to the compiler or linker for good\n# libtool support.\ncase $host in\nia64-*-hpux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.$ac_objext` in\n      *ELF-32*)\n\tHPUX_IA64_MODE=\"32\"\n\t;;\n      *ELF-64*)\n\tHPUX_IA64_MODE=\"64\"\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n*-*-irix6*)\n  # Find out which ABI we are using.\n  echo '[#]line '$LINENO' \"configure\"' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    if test \"$lt_cv_prog_gnu_ld\" = yes; then\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -melf32bsmip\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -melf32bmipn32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -melf64bmip\"\n\t;;\n      esac\n    else\n      case `/usr/bin/file conftest.$ac_objext` in\n\t*32-bit*)\n\t  LD=\"${LD-ld} -32\"\n\t  ;;\n\t*N32*)\n\t  LD=\"${LD-ld} -n32\"\n\t  ;;\n\t*64-bit*)\n\t  LD=\"${LD-ld} -64\"\n\t  ;;\n      esac\n    fi\n  fi\n  rm -rf conftest*\n  ;;\n\nx86_64-*kfreebsd*-gnu|x86_64-*linux*|powerpc*-*linux*| \\\ns390*-*linux*|s390*-*tpf*|sparc*-*linux*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.o` in\n      *32-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_i386_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    case `/usr/bin/file conftest.o` in\n\t      *x86-64*)\n\t\tLD=\"${LD-ld} -m elf32_x86_64\"\n\t\t;;\n\t      *)\n\t\tLD=\"${LD-ld} -m elf_i386\"\n\t\t;;\n\t    esac\n\t    ;;\n\t  powerpc64le-*)\n\t    LD=\"${LD-ld} -m elf32lppclinux\"\n\t    ;;\n\t  powerpc64-*)\n\t    LD=\"${LD-ld} -m elf32ppclinux\"\n\t    ;;\n\t  s390x-*linux*)\n\t    LD=\"${LD-ld} -m elf_s390\"\n\t    ;;\n\t  sparc64-*linux*)\n\t    LD=\"${LD-ld} -m elf32_sparc\"\n\t    ;;\n\tesac\n\t;;\n      *64-bit*)\n\tcase $host in\n\t  x86_64-*kfreebsd*-gnu)\n\t    LD=\"${LD-ld} -m elf_x86_64_fbsd\"\n\t    ;;\n\t  x86_64-*linux*)\n\t    LD=\"${LD-ld} -m elf_x86_64\"\n\t    ;;\n\t  powerpcle-*)\n\t    LD=\"${LD-ld} -m elf64lppc\"\n\t    ;;\n\t  powerpc-*)\n\t    LD=\"${LD-ld} -m elf64ppc\"\n\t    ;;\n\t  s390*-*linux*|s390*-*tpf*)\n\t    LD=\"${LD-ld} -m elf64_s390\"\n\t    ;;\n\t  sparc*-*linux*)\n\t    LD=\"${LD-ld} -m elf64_sparc\"\n\t    ;;\n\tesac\n\t;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\n\n*-*-sco3.2v5*)\n  # On SCO OpenServer 5, we need -belf to get full-featured binaries.\n  SAVE_CFLAGS=\"$CFLAGS\"\n  CFLAGS=\"$CFLAGS -belf\"\n  AC_CACHE_CHECK([whether the C compiler needs -belf], lt_cv_cc_needs_belf,\n    [AC_LANG_PUSH(C)\n     AC_LINK_IFELSE([AC_LANG_PROGRAM([[]],[[]])],[lt_cv_cc_needs_belf=yes],[lt_cv_cc_needs_belf=no])\n     AC_LANG_POP])\n  if test x\"$lt_cv_cc_needs_belf\" != x\"yes\"; then\n    # this is probably gcc 2.8.0, egcs 1.0 or newer; no need for -belf\n    CFLAGS=\"$SAVE_CFLAGS\"\n  fi\n  ;;\n*-*solaris*)\n  # Find out which ABI we are using.\n  echo 'int i;' > conftest.$ac_ext\n  if AC_TRY_EVAL(ac_compile); then\n    case `/usr/bin/file conftest.o` in\n    *64-bit*)\n      case $lt_cv_prog_gnu_ld in\n      yes*)\n        case $host in\n        i?86-*-solaris*)\n          LD=\"${LD-ld} -m elf_x86_64\"\n          ;;\n        sparc*-*-solaris*)\n          LD=\"${LD-ld} -m elf64_sparc\"\n          ;;\n        esac\n        # GNU ld 2.21 introduced _sol2 emulations.  Use them if available.\n        if ${LD-ld} -V | grep _sol2 >/dev/null 2>&1; then\n          LD=\"${LD-ld}_sol2\"\n        fi\n        ;;\n      *)\n\tif ${LD-ld} -64 -r -o conftest2.o conftest.o >/dev/null 2>&1; then\n\t  LD=\"${LD-ld} -64\"\n\tfi\n\t;;\n      esac\n      ;;\n    esac\n  fi\n  rm -rf conftest*\n  ;;\nesac\n\nneed_locks=\"$enable_libtool_lock\"\n])# _LT_ENABLE_LOCK\n\n\n# _LT_PROG_AR\n# -----------\nm4_defun([_LT_PROG_AR],\n[AC_CHECK_TOOLS(AR, [ar], false)\n: ${AR=ar}\n: ${AR_FLAGS=cru}\n_LT_DECL([], [AR], [1], [The archiver])\n_LT_DECL([], [AR_FLAGS], [1], [Flags to create an archive])\n\nAC_CACHE_CHECK([for archiver @FILE support], [lt_cv_ar_at_file],\n  [lt_cv_ar_at_file=no\n   AC_COMPILE_IFELSE([AC_LANG_PROGRAM],\n     [echo conftest.$ac_objext > conftest.lst\n      lt_ar_try='$AR $AR_FLAGS libconftest.a @conftest.lst >&AS_MESSAGE_LOG_FD'\n      AC_TRY_EVAL([lt_ar_try])\n      if test \"$ac_status\" -eq 0; then\n\t# Ensure the archiver fails upon bogus file names.\n\trm -f conftest.$ac_objext libconftest.a\n\tAC_TRY_EVAL([lt_ar_try])\n\tif test \"$ac_status\" -ne 0; then\n          lt_cv_ar_at_file=@\n        fi\n      fi\n      rm -f conftest.* libconftest.a\n     ])\n  ])\n\nif test \"x$lt_cv_ar_at_file\" = xno; then\n  archiver_list_spec=\nelse\n  archiver_list_spec=$lt_cv_ar_at_file\nfi\n_LT_DECL([], [archiver_list_spec], [1],\n  [How to feed a file listing to the archiver])\n])# _LT_PROG_AR\n\n\n# _LT_CMD_OLD_ARCHIVE\n# -------------------\nm4_defun([_LT_CMD_OLD_ARCHIVE],\n[_LT_PROG_AR\n\nAC_CHECK_TOOL(STRIP, strip, :)\ntest -z \"$STRIP\" && STRIP=:\n_LT_DECL([], [STRIP], [1], [A symbol stripping program])\n\nAC_CHECK_TOOL(RANLIB, ranlib, :)\ntest -z \"$RANLIB\" && RANLIB=:\n_LT_DECL([], [RANLIB], [1],\n    [Commands used to install an old-style archive])\n\n# Determine commands to create old-style static archives.\nold_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs'\nold_postinstall_cmds='chmod 644 $oldlib'\nold_postuninstall_cmds=\n\nif test -n \"$RANLIB\"; then\n  case $host_os in\n  openbsd*)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB -t \\$tool_oldlib\"\n    ;;\n  *)\n    old_postinstall_cmds=\"$old_postinstall_cmds~\\$RANLIB \\$tool_oldlib\"\n    ;;\n  esac\n  old_archive_cmds=\"$old_archive_cmds~\\$RANLIB \\$tool_oldlib\"\nfi\n\ncase $host_os in\n  darwin*)\n    lock_old_archive_extraction=yes ;;\n  *)\n    lock_old_archive_extraction=no ;;\nesac\n_LT_DECL([], [old_postinstall_cmds], [2])\n_LT_DECL([], [old_postuninstall_cmds], [2])\n_LT_TAGDECL([], [old_archive_cmds], [2],\n    [Commands used to build an old-style archive])\n_LT_DECL([], [lock_old_archive_extraction], [0],\n    [Whether to use a lock for old archive extraction])\n])# _LT_CMD_OLD_ARCHIVE\n\n\n# _LT_COMPILER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,\n#\t\t[OUTPUT-FILE], [ACTION-SUCCESS], [ACTION-FAILURE])\n# ----------------------------------------------------------------\n# Check whether the given compiler option works\nAC_DEFUN([_LT_COMPILER_OPTION],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_SED])dnl\nAC_CACHE_CHECK([$1], [$2],\n  [$2=no\n   m4_if([$4], , [ac_outfile=conftest.$ac_objext], [ac_outfile=$4])\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n   lt_compiler_flag=\"$3\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   # The option is referenced via a variable to avoid confusing sed.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [[^ ]]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n   (eval \"$lt_compile\" 2>conftest.err)\n   ac_status=$?\n   cat conftest.err >&AS_MESSAGE_LOG_FD\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&AS_MESSAGE_LOG_FD\n   if (exit $ac_status) && test -s \"$ac_outfile\"; then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings other than the usual output.\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' >conftest.exp\n     $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n     if test ! -s conftest.er2 || diff conftest.exp conftest.er2 >/dev/null; then\n       $2=yes\n     fi\n   fi\n   $RM conftest*\n])\n\nif test x\"[$]$2\" = xyes; then\n    m4_if([$5], , :, [$5])\nelse\n    m4_if([$6], , :, [$6])\nfi\n])# _LT_COMPILER_OPTION\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_COMPILER_OPTION], [_LT_COMPILER_OPTION])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_COMPILER_OPTION], [])\n\n\n# _LT_LINKER_OPTION(MESSAGE, VARIABLE-NAME, FLAGS,\n#                  [ACTION-SUCCESS], [ACTION-FAILURE])\n# ----------------------------------------------------\n# Check whether the given linker option works\nAC_DEFUN([_LT_LINKER_OPTION],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_SED])dnl\nAC_CACHE_CHECK([$1], [$2],\n  [$2=no\n   save_LDFLAGS=\"$LDFLAGS\"\n   LDFLAGS=\"$LDFLAGS $3\"\n   echo \"$lt_simple_link_test_code\" > conftest.$ac_ext\n   if (eval $ac_link 2>conftest.err) && test -s conftest$ac_exeext; then\n     # The linker can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     if test -s conftest.err; then\n       # Append any errors to the config.log.\n       cat conftest.err 1>&AS_MESSAGE_LOG_FD\n       $ECHO \"$_lt_linker_boilerplate\" | $SED '/^$/d' > conftest.exp\n       $SED '/^$/d; /^ *+/d' conftest.err >conftest.er2\n       if diff conftest.exp conftest.er2 >/dev/null; then\n         $2=yes\n       fi\n     else\n       $2=yes\n     fi\n   fi\n   $RM -r conftest*\n   LDFLAGS=\"$save_LDFLAGS\"\n])\n\nif test x\"[$]$2\" = xyes; then\n    m4_if([$4], , :, [$4])\nelse\n    m4_if([$5], , :, [$5])\nfi\n])# _LT_LINKER_OPTION\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_LINKER_OPTION], [_LT_LINKER_OPTION])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_LINKER_OPTION], [])\n\n\n# LT_CMD_MAX_LEN\n#---------------\nAC_DEFUN([LT_CMD_MAX_LEN],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\n# find the maximum length of command line arguments\nAC_MSG_CHECKING([the maximum length of command line arguments])\nAC_CACHE_VAL([lt_cv_sys_max_cmd_len], [dnl\n  i=0\n  teststring=\"ABCD\"\n\n  case $build_os in\n  msdosdjgpp*)\n    # On DJGPP, this test can blow up pretty badly due to problems in libc\n    # (any single argument exceeding 2000 bytes causes a buffer overrun\n    # during glob expansion).  Even if it were fixed, the result of this\n    # check would be larger than it should be.\n    lt_cv_sys_max_cmd_len=12288;    # 12K is about right\n    ;;\n\n  gnu*)\n    # Under GNU Hurd, this test is not required because there is\n    # no limit to the length of command line arguments.\n    # Libtool will interpret -1 as no limit whatsoever\n    lt_cv_sys_max_cmd_len=-1;\n    ;;\n\n  cygwin* | mingw* | cegcc*)\n    # On Win9x/ME, this test blows up -- it succeeds, but takes\n    # about 5 minutes as the teststring grows exponentially.\n    # Worse, since 9x/ME are not pre-emptively multitasking,\n    # you end up with a \"frozen\" computer, even though with patience\n    # the test eventually succeeds (with a max line length of 256k).\n    # Instead, let's just punt: use the minimum linelength reported by\n    # all of the supported platforms: 8192 (on NT/2K/XP).\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  mint*)\n    # On MiNT this can take a long time and run out of memory.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  amigaos*)\n    # On AmigaOS with pdksh, this test takes hours, literally.\n    # So we just punt and use a minimum line length of 8192.\n    lt_cv_sys_max_cmd_len=8192;\n    ;;\n\n  netbsd* | freebsd* | openbsd* | darwin* | dragonfly*)\n    # This has been around since 386BSD, at least.  Likely further.\n    if test -x /sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/sbin/sysctl -n kern.argmax`\n    elif test -x /usr/sbin/sysctl; then\n      lt_cv_sys_max_cmd_len=`/usr/sbin/sysctl -n kern.argmax`\n    else\n      lt_cv_sys_max_cmd_len=65536\t# usable default for all BSDs\n    fi\n    # And add a safety zone\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n    lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    ;;\n\n  interix*)\n    # We know the value 262144 and hardcode it with a safety zone (like BSD)\n    lt_cv_sys_max_cmd_len=196608\n    ;;\n\n  os2*)\n    # The test takes a long time on OS/2.\n    lt_cv_sys_max_cmd_len=8192\n    ;;\n\n  osf*)\n    # Dr. Hans Ekkehard Plesser reports seeing a kernel panic running configure\n    # due to this test when exec_disable_arg_limit is 1 on Tru64. It is not\n    # nice to cause kernel panics so lets avoid the loop below.\n    # First set a reasonable default.\n    lt_cv_sys_max_cmd_len=16384\n    #\n    if test -x /sbin/sysconfig; then\n      case `/sbin/sysconfig -q proc exec_disable_arg_limit` in\n        *1*) lt_cv_sys_max_cmd_len=-1 ;;\n      esac\n    fi\n    ;;\n  sco3.2v5*)\n    lt_cv_sys_max_cmd_len=102400\n    ;;\n  sysv5* | sco5v6* | sysv4.2uw2*)\n    kargmax=`grep ARG_MAX /etc/conf/cf.d/stune 2>/dev/null`\n    if test -n \"$kargmax\"; then\n      lt_cv_sys_max_cmd_len=`echo $kargmax | sed 's/.*[[\t ]]//'`\n    else\n      lt_cv_sys_max_cmd_len=32768\n    fi\n    ;;\n  *)\n    lt_cv_sys_max_cmd_len=`(getconf ARG_MAX) 2> /dev/null`\n    if test -n \"$lt_cv_sys_max_cmd_len\" && \\\n\ttest undefined != \"$lt_cv_sys_max_cmd_len\"; then\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 4`\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\* 3`\n    else\n      # Make teststring a little bigger before we do anything with it.\n      # a 1K string should be a reasonable start.\n      for i in 1 2 3 4 5 6 7 8 ; do\n        teststring=$teststring$teststring\n      done\n      SHELL=${SHELL-${CONFIG_SHELL-/bin/sh}}\n      # If test is not a shell built-in, we'll probably end up computing a\n      # maximum length that is only half of the actual maximum length, but\n      # we can't tell.\n      while { test \"X\"`env echo \"$teststring$teststring\" 2>/dev/null` \\\n\t         = \"X$teststring$teststring\"; } >/dev/null 2>&1 &&\n\t      test $i != 17 # 1/2 MB should be enough\n      do\n        i=`expr $i + 1`\n        teststring=$teststring$teststring\n      done\n      # Only check the string length outside the loop.\n      lt_cv_sys_max_cmd_len=`expr \"X$teststring\" : \".*\" 2>&1`\n      teststring=\n      # Add a significant safety factor because C++ compilers can tack on\n      # massive amounts of additional arguments before passing them to the\n      # linker.  It appears as though 1/2 is a usable value.\n      lt_cv_sys_max_cmd_len=`expr $lt_cv_sys_max_cmd_len \\/ 2`\n    fi\n    ;;\n  esac\n])\nif test -n $lt_cv_sys_max_cmd_len ; then\n  AC_MSG_RESULT($lt_cv_sys_max_cmd_len)\nelse\n  AC_MSG_RESULT(none)\nfi\nmax_cmd_len=$lt_cv_sys_max_cmd_len\n_LT_DECL([], [max_cmd_len], [0],\n    [What is the maximum length of a command?])\n])# LT_CMD_MAX_LEN\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_SYS_MAX_CMD_LEN], [LT_CMD_MAX_LEN])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_SYS_MAX_CMD_LEN], [])\n\n\n# _LT_HEADER_DLFCN\n# ----------------\nm4_defun([_LT_HEADER_DLFCN],\n[AC_CHECK_HEADERS([dlfcn.h], [], [], [AC_INCLUDES_DEFAULT])dnl\n])# _LT_HEADER_DLFCN\n\n\n# _LT_TRY_DLOPEN_SELF (ACTION-IF-TRUE, ACTION-IF-TRUE-W-USCORE,\n#                      ACTION-IF-FALSE, ACTION-IF-CROSS-COMPILING)\n# ----------------------------------------------------------------\nm4_defun([_LT_TRY_DLOPEN_SELF],\n[m4_require([_LT_HEADER_DLFCN])dnl\nif test \"$cross_compiling\" = yes; then :\n  [$4]\nelse\n  lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2\n  lt_status=$lt_dlunknown\n  cat > conftest.$ac_ext <<_LT_EOF\n[#line $LINENO \"configure\"\n#include \"confdefs.h\"\n\n#if HAVE_DLFCN_H\n#include <dlfcn.h>\n#endif\n\n#include <stdio.h>\n\n#ifdef RTLD_GLOBAL\n#  define LT_DLGLOBAL\t\tRTLD_GLOBAL\n#else\n#  ifdef DL_GLOBAL\n#    define LT_DLGLOBAL\t\tDL_GLOBAL\n#  else\n#    define LT_DLGLOBAL\t\t0\n#  endif\n#endif\n\n/* We may have to define LT_DLLAZY_OR_NOW in the command line if we\n   find out it does not work in some platform. */\n#ifndef LT_DLLAZY_OR_NOW\n#  ifdef RTLD_LAZY\n#    define LT_DLLAZY_OR_NOW\t\tRTLD_LAZY\n#  else\n#    ifdef DL_LAZY\n#      define LT_DLLAZY_OR_NOW\t\tDL_LAZY\n#    else\n#      ifdef RTLD_NOW\n#        define LT_DLLAZY_OR_NOW\tRTLD_NOW\n#      else\n#        ifdef DL_NOW\n#          define LT_DLLAZY_OR_NOW\tDL_NOW\n#        else\n#          define LT_DLLAZY_OR_NOW\t0\n#        endif\n#      endif\n#    endif\n#  endif\n#endif\n\n/* When -fvisbility=hidden is used, assume the code has been annotated\n   correspondingly for the symbols needed.  */\n#if defined(__GNUC__) && (((__GNUC__ == 3) && (__GNUC_MINOR__ >= 3)) || (__GNUC__ > 3))\nint fnord () __attribute__((visibility(\"default\")));\n#endif\n\nint fnord () { return 42; }\nint main ()\n{\n  void *self = dlopen (0, LT_DLGLOBAL|LT_DLLAZY_OR_NOW);\n  int status = $lt_dlunknown;\n\n  if (self)\n    {\n      if (dlsym (self,\"fnord\"))       status = $lt_dlno_uscore;\n      else\n        {\n\t  if (dlsym( self,\"_fnord\"))  status = $lt_dlneed_uscore;\n          else puts (dlerror ());\n\t}\n      /* dlclose (self); */\n    }\n  else\n    puts (dlerror ());\n\n  return status;\n}]\n_LT_EOF\n  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext} 2>/dev/null; then\n    (./conftest; exit; ) >&AS_MESSAGE_LOG_FD 2>/dev/null\n    lt_status=$?\n    case x$lt_status in\n      x$lt_dlno_uscore) $1 ;;\n      x$lt_dlneed_uscore) $2 ;;\n      x$lt_dlunknown|x*) $3 ;;\n    esac\n  else :\n    # compilation failed\n    $3\n  fi\nfi\nrm -fr conftest*\n])# _LT_TRY_DLOPEN_SELF\n\n\n# LT_SYS_DLOPEN_SELF\n# ------------------\nAC_DEFUN([LT_SYS_DLOPEN_SELF],\n[m4_require([_LT_HEADER_DLFCN])dnl\nif test \"x$enable_dlopen\" != xyes; then\n  enable_dlopen=unknown\n  enable_dlopen_self=unknown\n  enable_dlopen_self_static=unknown\nelse\n  lt_cv_dlopen=no\n  lt_cv_dlopen_libs=\n\n  case $host_os in\n  beos*)\n    lt_cv_dlopen=\"load_add_on\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ;;\n\n  mingw* | pw32* | cegcc*)\n    lt_cv_dlopen=\"LoadLibrary\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  cygwin*)\n    lt_cv_dlopen=\"dlopen\"\n    lt_cv_dlopen_libs=\n    ;;\n\n  darwin*)\n  # if libdl is installed we need to link against it\n    AC_CHECK_LIB([dl], [dlopen],\n\t\t[lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"],[\n    lt_cv_dlopen=\"dyld\"\n    lt_cv_dlopen_libs=\n    lt_cv_dlopen_self=yes\n    ])\n    ;;\n\n  *)\n    AC_CHECK_FUNC([shl_load],\n\t  [lt_cv_dlopen=\"shl_load\"],\n      [AC_CHECK_LIB([dld], [shl_load],\n\t    [lt_cv_dlopen=\"shl_load\" lt_cv_dlopen_libs=\"-ldld\"],\n\t[AC_CHECK_FUNC([dlopen],\n\t      [lt_cv_dlopen=\"dlopen\"],\n\t  [AC_CHECK_LIB([dl], [dlopen],\n\t\t[lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-ldl\"],\n\t    [AC_CHECK_LIB([svld], [dlopen],\n\t\t  [lt_cv_dlopen=\"dlopen\" lt_cv_dlopen_libs=\"-lsvld\"],\n\t      [AC_CHECK_LIB([dld], [dld_link],\n\t\t    [lt_cv_dlopen=\"dld_link\" lt_cv_dlopen_libs=\"-ldld\"])\n\t      ])\n\t    ])\n\t  ])\n\t])\n      ])\n    ;;\n  esac\n\n  if test \"x$lt_cv_dlopen\" != xno; then\n    enable_dlopen=yes\n  else\n    enable_dlopen=no\n  fi\n\n  case $lt_cv_dlopen in\n  dlopen)\n    save_CPPFLAGS=\"$CPPFLAGS\"\n    test \"x$ac_cv_header_dlfcn_h\" = xyes && CPPFLAGS=\"$CPPFLAGS -DHAVE_DLFCN_H\"\n\n    save_LDFLAGS=\"$LDFLAGS\"\n    wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $export_dynamic_flag_spec\\\"\n\n    save_LIBS=\"$LIBS\"\n    LIBS=\"$lt_cv_dlopen_libs $LIBS\"\n\n    AC_CACHE_CHECK([whether a program can dlopen itself],\n\t  lt_cv_dlopen_self, [dnl\n\t  _LT_TRY_DLOPEN_SELF(\n\t    lt_cv_dlopen_self=yes, lt_cv_dlopen_self=yes,\n\t    lt_cv_dlopen_self=no, lt_cv_dlopen_self=cross)\n    ])\n\n    if test \"x$lt_cv_dlopen_self\" = xyes; then\n      wl=$lt_prog_compiler_wl eval LDFLAGS=\\\"\\$LDFLAGS $lt_prog_compiler_static\\\"\n      AC_CACHE_CHECK([whether a statically linked program can dlopen itself],\n\t  lt_cv_dlopen_self_static, [dnl\n\t  _LT_TRY_DLOPEN_SELF(\n\t    lt_cv_dlopen_self_static=yes, lt_cv_dlopen_self_static=yes,\n\t    lt_cv_dlopen_self_static=no,  lt_cv_dlopen_self_static=cross)\n      ])\n    fi\n\n    CPPFLAGS=\"$save_CPPFLAGS\"\n    LDFLAGS=\"$save_LDFLAGS\"\n    LIBS=\"$save_LIBS\"\n    ;;\n  esac\n\n  case $lt_cv_dlopen_self in\n  yes|no) enable_dlopen_self=$lt_cv_dlopen_self ;;\n  *) enable_dlopen_self=unknown ;;\n  esac\n\n  case $lt_cv_dlopen_self_static in\n  yes|no) enable_dlopen_self_static=$lt_cv_dlopen_self_static ;;\n  *) enable_dlopen_self_static=unknown ;;\n  esac\nfi\n_LT_DECL([dlopen_support], [enable_dlopen], [0],\n\t [Whether dlopen is supported])\n_LT_DECL([dlopen_self], [enable_dlopen_self], [0],\n\t [Whether dlopen of programs is supported])\n_LT_DECL([dlopen_self_static], [enable_dlopen_self_static], [0],\n\t [Whether dlopen of statically linked programs is supported])\n])# LT_SYS_DLOPEN_SELF\n\n# Old name:\nAU_ALIAS([AC_LIBTOOL_DLOPEN_SELF], [LT_SYS_DLOPEN_SELF])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_DLOPEN_SELF], [])\n\n\n# _LT_COMPILER_C_O([TAGNAME])\n# ---------------------------\n# Check to see if options -c and -o are simultaneously supported by compiler.\n# This macro does not hard code the compiler like AC_PROG_CC_C_O.\nm4_defun([_LT_COMPILER_C_O],\n[m4_require([_LT_DECL_SED])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_TAG_COMPILER])dnl\nAC_CACHE_CHECK([if $compiler supports -c -o file.$ac_objext],\n  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)],\n  [_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=no\n   $RM -r conftest 2>/dev/null\n   mkdir conftest\n   cd conftest\n   mkdir out\n   echo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n   lt_compiler_flag=\"-o out/conftest2.$ac_objext\"\n   # Insert the option either (1) after the last *FLAGS variable, or\n   # (2) before a word containing \"conftest.\", or (3) at the end.\n   # Note that $ac_compile itself does not contain backslashes and begins\n   # with a dollar sign (not a hyphen), so the echo should work correctly.\n   lt_compile=`echo \"$ac_compile\" | $SED \\\n   -e 's:.*FLAGS}\\{0,1\\} :&$lt_compiler_flag :; t' \\\n   -e 's: [[^ ]]*conftest\\.: $lt_compiler_flag&:; t' \\\n   -e 's:$: $lt_compiler_flag:'`\n   (eval echo \"\\\"\\$as_me:$LINENO: $lt_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n   (eval \"$lt_compile\" 2>out/conftest.err)\n   ac_status=$?\n   cat out/conftest.err >&AS_MESSAGE_LOG_FD\n   echo \"$as_me:$LINENO: \\$? = $ac_status\" >&AS_MESSAGE_LOG_FD\n   if (exit $ac_status) && test -s out/conftest2.$ac_objext\n   then\n     # The compiler can only warn and ignore the option if not recognized\n     # So say no if there are warnings\n     $ECHO \"$_lt_compiler_boilerplate\" | $SED '/^$/d' > out/conftest.exp\n     $SED '/^$/d; /^ *+/d' out/conftest.err >out/conftest.er2\n     if test ! -s out/conftest.er2 || diff out/conftest.exp out/conftest.er2 >/dev/null; then\n       _LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes\n     fi\n   fi\n   chmod u+w . 2>&AS_MESSAGE_LOG_FD\n   $RM conftest*\n   # SGI C++ compiler will create directory out/ii_files/ for\n   # template instantiation\n   test -d out/ii_files && $RM out/ii_files/* && rmdir out/ii_files\n   $RM out/* && rmdir out\n   cd ..\n   $RM -r conftest\n   $RM conftest*\n])\n_LT_TAGDECL([compiler_c_o], [lt_cv_prog_compiler_c_o], [1],\n\t[Does compiler simultaneously support -c and -o options?])\n])# _LT_COMPILER_C_O\n\n\n# _LT_COMPILER_FILE_LOCKS([TAGNAME])\n# ----------------------------------\n# Check to see if we can do hard links to lock some files if needed\nm4_defun([_LT_COMPILER_FILE_LOCKS],\n[m4_require([_LT_ENABLE_LOCK])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\n_LT_COMPILER_C_O([$1])\n\nhard_links=\"nottested\"\nif test \"$_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)\" = no && test \"$need_locks\" != no; then\n  # do not overwrite the value of need_locks provided by the user\n  AC_MSG_CHECKING([if we can lock with hard links])\n  hard_links=yes\n  $RM conftest*\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  touch conftest.a\n  ln conftest.a conftest.b 2>&5 || hard_links=no\n  ln conftest.a conftest.b 2>/dev/null && hard_links=no\n  AC_MSG_RESULT([$hard_links])\n  if test \"$hard_links\" = no; then\n    AC_MSG_WARN([`$CC' does not support `-c -o', so `make -j' may be unsafe])\n    need_locks=warn\n  fi\nelse\n  need_locks=no\nfi\n_LT_DECL([], [need_locks], [1], [Must we lock files when doing compilation?])\n])# _LT_COMPILER_FILE_LOCKS\n\n\n# _LT_CHECK_OBJDIR\n# ----------------\nm4_defun([_LT_CHECK_OBJDIR],\n[AC_CACHE_CHECK([for objdir], [lt_cv_objdir],\n[rm -f .libs 2>/dev/null\nmkdir .libs 2>/dev/null\nif test -d .libs; then\n  lt_cv_objdir=.libs\nelse\n  # MS-DOS does not allow filenames that begin with a dot.\n  lt_cv_objdir=_libs\nfi\nrmdir .libs 2>/dev/null])\nobjdir=$lt_cv_objdir\n_LT_DECL([], [objdir], [0],\n         [The name of the directory that contains temporary libtool files])dnl\nm4_pattern_allow([LT_OBJDIR])dnl\nAC_DEFINE_UNQUOTED(LT_OBJDIR, \"$lt_cv_objdir/\",\n  [Define to the sub-directory in which libtool stores uninstalled libraries.])\n])# _LT_CHECK_OBJDIR\n\n\n# _LT_LINKER_HARDCODE_LIBPATH([TAGNAME])\n# --------------------------------------\n# Check hardcoding attributes.\nm4_defun([_LT_LINKER_HARDCODE_LIBPATH],\n[AC_MSG_CHECKING([how to hardcode library paths into programs])\n_LT_TAGVAR(hardcode_action, $1)=\nif test -n \"$_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\" ||\n   test -n \"$_LT_TAGVAR(runpath_var, $1)\" ||\n   test \"X$_LT_TAGVAR(hardcode_automatic, $1)\" = \"Xyes\" ; then\n\n  # We can hardcode non-existent directories.\n  if test \"$_LT_TAGVAR(hardcode_direct, $1)\" != no &&\n     # If the only mechanism to avoid hardcoding is shlibpath_var, we\n     # have to relink, otherwise we might link with an installed library\n     # when we should be linking with a yet-to-be-installed one\n     ## test \"$_LT_TAGVAR(hardcode_shlibpath_var, $1)\" != no &&\n     test \"$_LT_TAGVAR(hardcode_minus_L, $1)\" != no; then\n    # Linking always hardcodes the temporary library directory.\n    _LT_TAGVAR(hardcode_action, $1)=relink\n  else\n    # We can link without hardcoding, and we can hardcode nonexisting dirs.\n    _LT_TAGVAR(hardcode_action, $1)=immediate\n  fi\nelse\n  # We cannot hardcode anything, or else we can only hardcode existing\n  # directories.\n  _LT_TAGVAR(hardcode_action, $1)=unsupported\nfi\nAC_MSG_RESULT([$_LT_TAGVAR(hardcode_action, $1)])\n\nif test \"$_LT_TAGVAR(hardcode_action, $1)\" = relink ||\n   test \"$_LT_TAGVAR(inherit_rpath, $1)\" = yes; then\n  # Fast installation is not supported\n  enable_fast_install=no\nelif test \"$shlibpath_overrides_runpath\" = yes ||\n     test \"$enable_shared\" = no; then\n  # Fast installation is not necessary\n  enable_fast_install=needless\nfi\n_LT_TAGDECL([], [hardcode_action], [0],\n    [How to hardcode a shared library path into an executable])\n])# _LT_LINKER_HARDCODE_LIBPATH\n\n\n# _LT_CMD_STRIPLIB\n# ----------------\nm4_defun([_LT_CMD_STRIPLIB],\n[m4_require([_LT_DECL_EGREP])\nstriplib=\nold_striplib=\nAC_MSG_CHECKING([whether stripping libraries is possible])\nif test -n \"$STRIP\" && $STRIP -V 2>&1 | $GREP \"GNU strip\" >/dev/null; then\n  test -z \"$old_striplib\" && old_striplib=\"$STRIP --strip-debug\"\n  test -z \"$striplib\" && striplib=\"$STRIP --strip-unneeded\"\n  AC_MSG_RESULT([yes])\nelse\n# FIXME - insert some real tests, host_os isn't really good enough\n  case $host_os in\n  darwin*)\n    if test -n \"$STRIP\" ; then\n      striplib=\"$STRIP -x\"\n      old_striplib=\"$STRIP -S\"\n      AC_MSG_RESULT([yes])\n    else\n      AC_MSG_RESULT([no])\n    fi\n    ;;\n  *)\n    AC_MSG_RESULT([no])\n    ;;\n  esac\nfi\n_LT_DECL([], [old_striplib], [1], [Commands to strip libraries])\n_LT_DECL([], [striplib], [1])\n])# _LT_CMD_STRIPLIB\n\n\n# _LT_SYS_DYNAMIC_LINKER([TAG])\n# -----------------------------\n# PORTME Fill in your ld.so characteristics\nm4_defun([_LT_SYS_DYNAMIC_LINKER],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_OBJDUMP])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_CHECK_SHELL_FEATURES])dnl\nAC_MSG_CHECKING([dynamic linker characteristics])\nm4_if([$1],\n\t[], [\nif test \"$GCC\" = yes; then\n  case $host_os in\n    darwin*) lt_awk_arg=\"/^libraries:/,/LR/\" ;;\n    *) lt_awk_arg=\"/^libraries:/\" ;;\n  esac\n  case $host_os in\n    mingw* | cegcc*) lt_sed_strip_eq=\"s,=\\([[A-Za-z]]:\\),\\1,g\" ;;\n    *) lt_sed_strip_eq=\"s,=/,/,g\" ;;\n  esac\n  lt_search_path_spec=`$CC -print-search-dirs | awk $lt_awk_arg | $SED -e \"s/^libraries://\" -e $lt_sed_strip_eq`\n  case $lt_search_path_spec in\n  *\\;*)\n    # if the path contains \";\" then we assume it to be the separator\n    # otherwise default to the standard path separator (i.e. \":\") - it is\n    # assumed that no part of a normal pathname contains \";\" but that should\n    # okay in the real world where \";\" in dirpaths is itself problematic.\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED 's/;/ /g'`\n    ;;\n  *)\n    lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $SED \"s/$PATH_SEPARATOR/ /g\"`\n    ;;\n  esac\n  # Ok, now we have the path, separated by spaces, we can step through it\n  # and add multilib dir if necessary.\n  lt_tmp_lt_search_path_spec=\n  lt_multi_os_dir=`$CC $CPPFLAGS $CFLAGS $LDFLAGS -print-multi-os-directory 2>/dev/null`\n  for lt_sys_path in $lt_search_path_spec; do\n    if test -d \"$lt_sys_path/$lt_multi_os_dir\"; then\n      lt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path/$lt_multi_os_dir\"\n    else\n      test -d \"$lt_sys_path\" && \\\n\tlt_tmp_lt_search_path_spec=\"$lt_tmp_lt_search_path_spec $lt_sys_path\"\n    fi\n  done\n  lt_search_path_spec=`$ECHO \"$lt_tmp_lt_search_path_spec\" | awk '\nBEGIN {RS=\" \"; FS=\"/|\\n\";} {\n  lt_foo=\"\";\n  lt_count=0;\n  for (lt_i = NF; lt_i > 0; lt_i--) {\n    if ($lt_i != \"\" && $lt_i != \".\") {\n      if ($lt_i == \"..\") {\n        lt_count++;\n      } else {\n        if (lt_count == 0) {\n          lt_foo=\"/\" $lt_i lt_foo;\n        } else {\n          lt_count--;\n        }\n      }\n    }\n  }\n  if (lt_foo != \"\") { lt_freq[[lt_foo]]++; }\n  if (lt_freq[[lt_foo]] == 1) { print lt_foo; }\n}'`\n  # AWK program above erroneously prepends '/' to C:/dos/paths\n  # for these hosts.\n  case $host_os in\n    mingw* | cegcc*) lt_search_path_spec=`$ECHO \"$lt_search_path_spec\" |\\\n      $SED 's,/\\([[A-Za-z]]:\\),\\1,g'` ;;\n  esac\n  sys_lib_search_path_spec=`$ECHO \"$lt_search_path_spec\" | $lt_NL2SP`\nelse\n  sys_lib_search_path_spec=\"/lib /usr/lib /usr/local/lib\"\nfi])\nlibrary_names_spec=\nlibname_spec='lib$name'\nsoname_spec=\nshrext_cmds=\".so\"\npostinstall_cmds=\npostuninstall_cmds=\nfinish_cmds=\nfinish_eval=\nshlibpath_var=\nshlibpath_overrides_runpath=unknown\nversion_type=none\ndynamic_linker=\"$host_os ld.so\"\nsys_lib_dlsearch_path_spec=\"/lib /usr/lib\"\nneed_lib_prefix=unknown\nhardcode_into_libs=no\n\n# when you set need_version to no, make sure it does not cause -set_version\n# flags to be left without arguments\nneed_version=unknown\n\ncase $host_os in\naix3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix $libname.a'\n  shlibpath_var=LIBPATH\n\n  # AIX 3 has no versioning support, so we append a major version to the name.\n  soname_spec='${libname}${release}${shared_ext}$major'\n  ;;\n\naix[[4-9]]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  hardcode_into_libs=yes\n  if test \"$host_cpu\" = ia64; then\n    # AIX 5 supports IA64\n    library_names_spec='${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext}$versuffix $libname${shared_ext}'\n    shlibpath_var=LD_LIBRARY_PATH\n  else\n    # With GCC up to 2.95.x, collect2 would create an import file\n    # for dependence libraries.  The import file would start with\n    # the line `#! .'.  This would cause the generated library to\n    # depend on `.', always an invalid library.  This was fixed in\n    # development snapshots of GCC prior to 3.0.\n    case $host_os in\n      aix4 | aix4.[[01]] | aix4.[[01]].*)\n      if { echo '#if __GNUC__ > 2 || (__GNUC__ == 2 && __GNUC_MINOR__ >= 97)'\n\t   echo ' yes '\n\t   echo '#endif'; } | ${CC} -E - | $GREP yes > /dev/null; then\n\t:\n      else\n\tcan_build_shared=no\n      fi\n      ;;\n    esac\n    # AIX (on Power*) has no versioning support, so currently we can not hardcode correct\n    # soname into executable. Probably we can add versioning support to\n    # collect2, so additional links can be useful in future.\n    if test \"$aix_use_runtimelinking\" = yes; then\n      # If using run time linking (on AIX 4.2 or later) use lib<name>.so\n      # instead of lib<name>.a to let people know that these are not\n      # typical AIX shared libraries.\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    else\n      # We preserve .a as extension for shared libraries through AIX4.2\n      # and later when we are not doing run time linking.\n      library_names_spec='${libname}${release}.a $libname.a'\n      soname_spec='${libname}${release}${shared_ext}$major'\n    fi\n    shlibpath_var=LIBPATH\n  fi\n  ;;\n\namigaos*)\n  case $host_cpu in\n  powerpc)\n    # Since July 2007 AmigaOS4 officially supports .so libraries.\n    # When compiling the executable, add -use-dynld -Lsobjs: to the compileline.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    ;;\n  m68k)\n    library_names_spec='$libname.ixlibrary $libname.a'\n    # Create ${libname}_ixlibrary.a entries in /sys/libs.\n    finish_eval='for lib in `ls $libdir/*.ixlibrary 2>/dev/null`; do libname=`func_echo_all \"$lib\" | $SED '\\''s%^.*/\\([[^/]]*\\)\\.ixlibrary$%\\1%'\\''`; test $RM /sys/libs/${libname}_ixlibrary.a; $show \"cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a\"; cd /sys/libs && $LN_S $lib ${libname}_ixlibrary.a || exit 1; done'\n    ;;\n  esac\n  ;;\n\nbeos*)\n  library_names_spec='${libname}${shared_ext}'\n  dynamic_linker=\"$host_os ld.so\"\n  shlibpath_var=LIBRARY_PATH\n  ;;\n\nbsdi[[45]]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/shlib /usr/lib /usr/X11/lib /usr/contrib/lib /lib /usr/local/lib\"\n  sys_lib_dlsearch_path_spec=\"/shlib /usr/lib /usr/local/lib\"\n  # the default ld.so.conf also contains /usr/contrib/lib and\n  # /usr/X11R6/lib (/usr/X11 is a link to /usr/X11R6), but let us allow\n  # libtool to hard-code these into programs\n  ;;\n\ncygwin* | mingw* | pw32* | cegcc*)\n  version_type=windows\n  shrext_cmds=\".dll\"\n  need_version=no\n  need_lib_prefix=no\n\n  case $GCC,$cc_basename in\n  yes,*)\n    # gcc\n    library_names_spec='$libname.dll.a'\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname~\n      chmod a+x \\$dldir/$dlname~\n      if test -n '\\''$stripme'\\'' && test -n '\\''$striplib'\\''; then\n        eval '\\''$striplib \\$dldir/$dlname'\\'' || exit \\$?;\n      fi'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n\n    case $host_os in\n    cygwin*)\n      # Cygwin DLLs use 'cyg' prefix rather than 'lib'\n      soname_spec='`echo ${libname} | sed -e 's/^lib/cyg/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\nm4_if([$1], [],[\n      sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/lib/w32api\"])\n      ;;\n    mingw* | cegcc*)\n      # MinGW DLLs use traditional 'lib' prefix\n      soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    pw32*)\n      # pw32 DLLs use 'pw' prefix rather than 'lib'\n      library_names_spec='`echo ${libname} | sed -e 's/^lib/pw/'``echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\n      ;;\n    esac\n    dynamic_linker='Win32 ld.exe'\n    ;;\n\n  *,cl*)\n    # Native MSVC\n    libname_spec='$name'\n    soname_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext}'\n    library_names_spec='${libname}.dll.lib'\n\n    case $build_os in\n    mingw*)\n      sys_lib_search_path_spec=\n      lt_save_ifs=$IFS\n      IFS=';'\n      for lt_path in $LIB\n      do\n        IFS=$lt_save_ifs\n        # Let DOS variable expansion print the short 8.3 style file name.\n        lt_path=`cd \"$lt_path\" 2>/dev/null && cmd //C \"for %i in (\".\") do @echo %~si\"`\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec $lt_path\"\n      done\n      IFS=$lt_save_ifs\n      # Convert to MSYS style.\n      sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | sed -e 's|\\\\\\\\|/|g' -e 's| \\\\([[a-zA-Z]]\\\\):| /\\\\1|g' -e 's|^ ||'`\n      ;;\n    cygwin*)\n      # Convert to unix form, then to dos form, then back to unix form\n      # but this time dos style (no spaces!) so that the unix form looks\n      # like /cygdrive/c/PROGRA~1:/cygdr...\n      sys_lib_search_path_spec=`cygpath --path --unix \"$LIB\"`\n      sys_lib_search_path_spec=`cygpath --path --dos \"$sys_lib_search_path_spec\" 2>/dev/null`\n      sys_lib_search_path_spec=`cygpath --path --unix \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      ;;\n    *)\n      sys_lib_search_path_spec=\"$LIB\"\n      if $ECHO \"$sys_lib_search_path_spec\" | [$GREP ';[c-zC-Z]:/' >/dev/null]; then\n        # It is most probably a Windows format PATH.\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e 's/;/ /g'`\n      else\n        sys_lib_search_path_spec=`$ECHO \"$sys_lib_search_path_spec\" | $SED -e \"s/$PATH_SEPARATOR/ /g\"`\n      fi\n      # FIXME: find the short name or the path components, as spaces are\n      # common. (e.g. \"Program Files\" -> \"PROGRA~1\")\n      ;;\n    esac\n\n    # DLL is installed to $(libdir)/../bin by postinstall_cmds\n    postinstall_cmds='base_file=`basename \\${file}`~\n      dlpath=`$SHELL 2>&1 -c '\\''. $dir/'\\''\\${base_file}'\\''i; echo \\$dlname'\\''`~\n      dldir=$destdir/`dirname \\$dlpath`~\n      test -d \\$dldir || mkdir -p \\$dldir~\n      $install_prog $dir/$dlname \\$dldir/$dlname'\n    postuninstall_cmds='dldll=`$SHELL 2>&1 -c '\\''. $file; echo \\$dlname'\\''`~\n      dlpath=$dir/\\$dldll~\n       $RM \\$dlpath'\n    shlibpath_overrides_runpath=yes\n    dynamic_linker='Win32 link.exe'\n    ;;\n\n  *)\n    # Assume MSVC wrapper\n    library_names_spec='${libname}`echo ${release} | $SED -e 's/[[.]]/-/g'`${versuffix}${shared_ext} $libname.lib'\n    dynamic_linker='Win32 ld.exe'\n    ;;\n  esac\n  # FIXME: first we should search . and the directory the executable is in\n  shlibpath_var=PATH\n  ;;\n\ndarwin* | rhapsody*)\n  dynamic_linker=\"$host_os dyld\"\n  version_type=darwin\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${major}$shared_ext ${libname}$shared_ext'\n  soname_spec='${libname}${release}${major}$shared_ext'\n  shlibpath_overrides_runpath=yes\n  shlibpath_var=DYLD_LIBRARY_PATH\n  shrext_cmds='`test .$module = .yes && echo .so || echo .dylib`'\nm4_if([$1], [],[\n  sys_lib_search_path_spec=\"$sys_lib_search_path_spec /usr/local/lib\"])\n  sys_lib_dlsearch_path_spec='/usr/local/lib /lib /usr/lib'\n  ;;\n\ndgux*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname$shared_ext'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\nfreebsd* | dragonfly*)\n  # DragonFly does not have aout.  When/if they implement a new\n  # versioning mechanism, adjust this.\n  if test -x /usr/bin/objformat; then\n    objformat=`/usr/bin/objformat`\n  else\n    case $host_os in\n    freebsd[[23]].*) objformat=aout ;;\n    *) objformat=elf ;;\n    esac\n  fi\n  version_type=freebsd-$objformat\n  case $version_type in\n    freebsd-elf*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n      need_version=no\n      need_lib_prefix=no\n      ;;\n    freebsd-*)\n      library_names_spec='${libname}${release}${shared_ext}$versuffix $libname${shared_ext}$versuffix'\n      need_version=yes\n      ;;\n  esac\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_os in\n  freebsd2.*)\n    shlibpath_overrides_runpath=yes\n    ;;\n  freebsd3.[[01]]* | freebsdelf3.[[01]]*)\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  freebsd3.[[2-9]]* | freebsdelf3.[[2-9]]* | \\\n  freebsd4.[[0-5]] | freebsdelf4.[[0-5]] | freebsd4.1.1 | freebsdelf4.1.1)\n    shlibpath_overrides_runpath=no\n    hardcode_into_libs=yes\n    ;;\n  *) # from 4.6 on, and DragonFly\n    shlibpath_overrides_runpath=yes\n    hardcode_into_libs=yes\n    ;;\n  esac\n  ;;\n\nhaiku*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  dynamic_linker=\"$host_os runtime_loader\"\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}${major} ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  sys_lib_dlsearch_path_spec='/boot/home/config/lib /boot/common/lib /boot/system/lib'\n  hardcode_into_libs=yes\n  ;;\n\nhpux9* | hpux10* | hpux11*)\n  # Give a soname corresponding to the major version so that dld.sl refuses to\n  # link against other versions.\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  case $host_cpu in\n  ia64*)\n    shrext_cmds='.so'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.so\"\n    shlibpath_var=LD_LIBRARY_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    if test \"X$HPUX_IA64_MODE\" = X32; then\n      sys_lib_search_path_spec=\"/usr/lib/hpux32 /usr/local/lib/hpux32 /usr/local/lib\"\n    else\n      sys_lib_search_path_spec=\"/usr/lib/hpux64 /usr/local/lib/hpux64\"\n    fi\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  hppa*64*)\n    shrext_cmds='.sl'\n    hardcode_into_libs=yes\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=LD_LIBRARY_PATH # How should we handle SHLIB_PATH\n    shlibpath_overrides_runpath=yes # Unless +noenvvar is specified.\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    sys_lib_search_path_spec=\"/usr/lib/pa20_64 /usr/ccs/lib/pa20_64\"\n    sys_lib_dlsearch_path_spec=$sys_lib_search_path_spec\n    ;;\n  *)\n    shrext_cmds='.sl'\n    dynamic_linker=\"$host_os dld.sl\"\n    shlibpath_var=SHLIB_PATH\n    shlibpath_overrides_runpath=no # +s is required to enable SHLIB_PATH\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    ;;\n  esac\n  # HP-UX runs *really* slowly unless shared libraries are mode 555, ...\n  postinstall_cmds='chmod 555 $lib'\n  # or fails outright, so override atomically:\n  install_override_mode=555\n  ;;\n\ninterix[[3-9]]*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  dynamic_linker='Interix 3.x ld.so.1 (PE, like ELF)'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $host_os in\n    nonstopux*) version_type=nonstopux ;;\n    *)\n\tif test \"$lt_cv_prog_gnu_ld\" = yes; then\n\t\tversion_type=linux # correct to gnu/linux during the next big refactor\n\telse\n\t\tversion_type=irix\n\tfi ;;\n  esac\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${release}${shared_ext} $libname${shared_ext}'\n  case $host_os in\n  irix5* | nonstopux*)\n    libsuff= shlibsuff=\n    ;;\n  *)\n    case $LD in # libtool.m4 will add one of these switches to LD\n    *-32|*\"-32 \"|*-melf32bsmip|*\"-melf32bsmip \")\n      libsuff= shlibsuff= libmagic=32-bit;;\n    *-n32|*\"-n32 \"|*-melf32bmipn32|*\"-melf32bmipn32 \")\n      libsuff=32 shlibsuff=N32 libmagic=N32;;\n    *-64|*\"-64 \"|*-melf64bmip|*\"-melf64bmip \")\n      libsuff=64 shlibsuff=64 libmagic=64-bit;;\n    *) libsuff= shlibsuff= libmagic=never-match;;\n    esac\n    ;;\n  esac\n  shlibpath_var=LD_LIBRARY${shlibsuff}_PATH\n  shlibpath_overrides_runpath=no\n  sys_lib_search_path_spec=\"/usr/lib${libsuff} /lib${libsuff} /usr/local/lib${libsuff}\"\n  sys_lib_dlsearch_path_spec=\"/usr/lib${libsuff} /lib${libsuff}\"\n  hardcode_into_libs=yes\n  ;;\n\n# No shared lib support for Linux oldld, aout, or coff.\nlinux*oldld* | linux*aout* | linux*coff*)\n  dynamic_linker=no\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -n $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n\n  # Some binutils ld are patched to set DT_RUNPATH\n  AC_CACHE_VAL([lt_cv_shlibpath_overrides_runpath],\n    [lt_cv_shlibpath_overrides_runpath=no\n    save_LDFLAGS=$LDFLAGS\n    save_libdir=$libdir\n    eval \"libdir=/foo; wl=\\\"$_LT_TAGVAR(lt_prog_compiler_wl, $1)\\\"; \\\n\t LDFLAGS=\\\"\\$LDFLAGS $_LT_TAGVAR(hardcode_libdir_flag_spec, $1)\\\"\"\n    AC_LINK_IFELSE([AC_LANG_PROGRAM([],[])],\n      [AS_IF([ ($OBJDUMP -p conftest$ac_exeext) 2>/dev/null | grep \"RUNPATH.*$libdir\" >/dev/null],\n\t [lt_cv_shlibpath_overrides_runpath=yes])])\n    LDFLAGS=$save_LDFLAGS\n    libdir=$save_libdir\n    ])\n  shlibpath_overrides_runpath=$lt_cv_shlibpath_overrides_runpath\n\n  # This implies no fast_install, which is unacceptable.\n  # Some rework will be needed to allow for fast_install\n  # before this can be enabled.\n  hardcode_into_libs=yes\n\n  # Append ld.so.conf contents to the search path\n  if test -f /etc/ld.so.conf; then\n    lt_ld_extra=`awk '/^include / { system(sprintf(\"cd /etc; cat %s 2>/dev/null\", \\[$]2)); skip = 1; } { if (!skip) print \\[$]0; skip = 0; }' < /etc/ld.so.conf | $SED -e 's/#.*//;/^[\t ]*hwcap[\t ]/d;s/[:,\t]/ /g;s/=[^=]*$//;s/=[^= ]* / /g;s/\"//g;/^$/d' | tr '\\n' ' '`\n    sys_lib_dlsearch_path_spec=\"/lib /usr/lib $lt_ld_extra\"\n  fi\n\n  # We used to test for /lib/ld.so.1 and disable shared libraries on\n  # powerpc, because MkLinux only supported shared libraries with the\n  # GNU dynamic linker.  Since this was broken with cross compilers,\n  # most powerpc-linux boxes support dynamic linking these days and\n  # people can always --disable-shared, the test was removed, and we\n  # assume the GNU/Linux dynamic linker is in use.\n  dynamic_linker='GNU/Linux ld.so'\n  ;;\n\nnetbsdelf*-gnu)\n  version_type=linux\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='NetBSD ld.elf_so'\n  ;;\n\nnetbsd*)\n  version_type=sunos\n  need_lib_prefix=no\n  need_version=no\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n    finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n    dynamic_linker='NetBSD (a.out) ld.so'\n  else\n    library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major ${libname}${shared_ext}'\n    soname_spec='${libname}${release}${shared_ext}$major'\n    dynamic_linker='NetBSD ld.elf_so'\n  fi\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  ;;\n\nnewsos6)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  ;;\n\n*nto* | *qnx*)\n  version_type=qnx\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  dynamic_linker='ldqnx.so'\n  ;;\n\nopenbsd*)\n  version_type=sunos\n  sys_lib_dlsearch_path_spec=\"/usr/lib\"\n  need_lib_prefix=no\n  # Some older versions of OpenBSD (3.3 at least) *do* need versioned libs.\n  case $host_os in\n    openbsd3.3 | openbsd3.3.*)\tneed_version=yes ;;\n    *)\t\t\t\tneed_version=no  ;;\n  esac\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/sbin\" ldconfig -m $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    case $host_os in\n      openbsd2.[[89]] | openbsd2.[[89]].*)\n\tshlibpath_overrides_runpath=no\n\t;;\n      *)\n\tshlibpath_overrides_runpath=yes\n\t;;\n      esac\n  else\n    shlibpath_overrides_runpath=yes\n  fi\n  ;;\n\nos2*)\n  libname_spec='$name'\n  shrext_cmds=\".dll\"\n  need_lib_prefix=no\n  library_names_spec='$libname${shared_ext} $libname.a'\n  dynamic_linker='OS/2 ld.exe'\n  shlibpath_var=LIBPATH\n  ;;\n\nosf3* | osf4* | osf5*)\n  version_type=osf\n  need_lib_prefix=no\n  need_version=no\n  soname_spec='${libname}${release}${shared_ext}$major'\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  sys_lib_search_path_spec=\"/usr/shlib /usr/ccs/lib /usr/lib/cmplrs/cc /usr/lib /usr/local/lib /var/shlib\"\n  sys_lib_dlsearch_path_spec=\"$sys_lib_search_path_spec\"\n  ;;\n\nrdos*)\n  dynamic_linker=no\n  ;;\n\nsolaris*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  # ldd complains unless libraries are executable\n  postinstall_cmds='chmod +x $lib'\n  ;;\n\nsunos4*)\n  version_type=sunos\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${shared_ext}$versuffix'\n  finish_cmds='PATH=\"\\$PATH:/usr/etc\" ldconfig $libdir'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  if test \"$with_gnu_ld\" = yes; then\n    need_lib_prefix=no\n  fi\n  need_version=yes\n  ;;\n\nsysv4 | sysv4.3*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  case $host_vendor in\n    sni)\n      shlibpath_overrides_runpath=no\n      need_lib_prefix=no\n      runpath_var=LD_RUN_PATH\n      ;;\n    siemens)\n      need_lib_prefix=no\n      ;;\n    motorola)\n      need_lib_prefix=no\n      need_version=no\n      shlibpath_overrides_runpath=no\n      sys_lib_search_path_spec='/lib /usr/lib /usr/ccs/lib'\n      ;;\n  esac\n  ;;\n\nsysv4*MP*)\n  if test -d /usr/nec ;then\n    version_type=linux # correct to gnu/linux during the next big refactor\n    library_names_spec='$libname${shared_ext}.$versuffix $libname${shared_ext}.$major $libname${shared_ext}'\n    soname_spec='$libname${shared_ext}.$major'\n    shlibpath_var=LD_LIBRARY_PATH\n  fi\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  version_type=freebsd-elf\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext} $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=yes\n  hardcode_into_libs=yes\n  if test \"$with_gnu_ld\" = yes; then\n    sys_lib_search_path_spec='/usr/local/lib /usr/gnu/lib /usr/ccs/lib /usr/lib /lib'\n  else\n    sys_lib_search_path_spec='/usr/ccs/lib /usr/lib'\n    case $host_os in\n      sco3.2v5*)\n        sys_lib_search_path_spec=\"$sys_lib_search_path_spec /lib\"\n\t;;\n    esac\n  fi\n  sys_lib_dlsearch_path_spec='/usr/lib'\n  ;;\n\ntpf*)\n  # TPF is a cross-target only.  Preferred cross-host = GNU/Linux.\n  version_type=linux # correct to gnu/linux during the next big refactor\n  need_lib_prefix=no\n  need_version=no\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  shlibpath_var=LD_LIBRARY_PATH\n  shlibpath_overrides_runpath=no\n  hardcode_into_libs=yes\n  ;;\n\nuts4*)\n  version_type=linux # correct to gnu/linux during the next big refactor\n  library_names_spec='${libname}${release}${shared_ext}$versuffix ${libname}${release}${shared_ext}$major $libname${shared_ext}'\n  soname_spec='${libname}${release}${shared_ext}$major'\n  shlibpath_var=LD_LIBRARY_PATH\n  ;;\n\n*)\n  dynamic_linker=no\n  ;;\nesac\nAC_MSG_RESULT([$dynamic_linker])\ntest \"$dynamic_linker\" = no && can_build_shared=no\n\nvariables_saved_for_relink=\"PATH $shlibpath_var $runpath_var\"\nif test \"$GCC\" = yes; then\n  variables_saved_for_relink=\"$variables_saved_for_relink GCC_EXEC_PREFIX COMPILER_PATH LIBRARY_PATH\"\nfi\n\nif test \"${lt_cv_sys_lib_search_path_spec+set}\" = set; then\n  sys_lib_search_path_spec=\"$lt_cv_sys_lib_search_path_spec\"\nfi\nif test \"${lt_cv_sys_lib_dlsearch_path_spec+set}\" = set; then\n  sys_lib_dlsearch_path_spec=\"$lt_cv_sys_lib_dlsearch_path_spec\"\nfi\n\n_LT_DECL([], [variables_saved_for_relink], [1],\n    [Variables whose values should be saved in libtool wrapper scripts and\n    restored at link time])\n_LT_DECL([], [need_lib_prefix], [0],\n    [Do we need the \"lib\" prefix for modules?])\n_LT_DECL([], [need_version], [0], [Do we need a version for libraries?])\n_LT_DECL([], [version_type], [0], [Library versioning type])\n_LT_DECL([], [runpath_var], [0],  [Shared library runtime path variable])\n_LT_DECL([], [shlibpath_var], [0],[Shared library path variable])\n_LT_DECL([], [shlibpath_overrides_runpath], [0],\n    [Is shlibpath searched before the hard-coded library search path?])\n_LT_DECL([], [libname_spec], [1], [Format of library name prefix])\n_LT_DECL([], [library_names_spec], [1],\n    [[List of archive names.  First name is the real one, the rest are links.\n    The last name is the one that the linker finds with -lNAME]])\n_LT_DECL([], [soname_spec], [1],\n    [[The coded name of the library, if different from the real name]])\n_LT_DECL([], [install_override_mode], [1],\n    [Permission mode override for installation of shared libraries])\n_LT_DECL([], [postinstall_cmds], [2],\n    [Command to use after installation of a shared archive])\n_LT_DECL([], [postuninstall_cmds], [2],\n    [Command to use after uninstallation of a shared archive])\n_LT_DECL([], [finish_cmds], [2],\n    [Commands used to finish a libtool library installation in a directory])\n_LT_DECL([], [finish_eval], [1],\n    [[As \"finish_cmds\", except a single script fragment to be evaled but\n    not shown]])\n_LT_DECL([], [hardcode_into_libs], [0],\n    [Whether we should hardcode library paths into libraries])\n_LT_DECL([], [sys_lib_search_path_spec], [2],\n    [Compile-time system search path for libraries])\n_LT_DECL([], [sys_lib_dlsearch_path_spec], [2],\n    [Run-time system search path for libraries])\n])# _LT_SYS_DYNAMIC_LINKER\n\n\n# _LT_PATH_TOOL_PREFIX(TOOL)\n# --------------------------\n# find a file program which can recognize shared library\nAC_DEFUN([_LT_PATH_TOOL_PREFIX],\n[m4_require([_LT_DECL_EGREP])dnl\nAC_MSG_CHECKING([for $1])\nAC_CACHE_VAL(lt_cv_path_MAGIC_CMD,\n[case $MAGIC_CMD in\n[[\\\\/*] |  ?:[\\\\/]*])\n  lt_cv_path_MAGIC_CMD=\"$MAGIC_CMD\" # Let the user override the test with a path.\n  ;;\n*)\n  lt_save_MAGIC_CMD=\"$MAGIC_CMD\"\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\ndnl $ac_dummy forces splitting on constant user-supplied paths.\ndnl POSIX.2 word splitting is done only on the output of word expansions,\ndnl not every word.  This closes a longstanding sh security hole.\n  ac_dummy=\"m4_if([$2], , $PATH, [$2])\"\n  for ac_dir in $ac_dummy; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f $ac_dir/$1; then\n      lt_cv_path_MAGIC_CMD=\"$ac_dir/$1\"\n      if test -n \"$file_magic_test_file\"; then\n\tcase $deplibs_check_method in\n\t\"file_magic \"*)\n\t  file_magic_regex=`expr \"$deplibs_check_method\" : \"file_magic \\(.*\\)\"`\n\t  MAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\n\t  if eval $file_magic_cmd \\$file_magic_test_file 2> /dev/null |\n\t    $EGREP \"$file_magic_regex\" > /dev/null; then\n\t    :\n\t  else\n\t    cat <<_LT_EOF 1>&2\n\n*** Warning: the command libtool uses to detect shared libraries,\n*** $file_magic_cmd, produces output that libtool cannot recognize.\n*** The result is that libtool may fail to recognize shared libraries\n*** as such.  This will affect the creation of libtool libraries that\n*** depend on shared libraries, but programs linked with such libtool\n*** libraries will work regardless of this problem.  Nevertheless, you\n*** may want to report the problem to your system manager and/or to\n*** bug-libtool@gnu.org\n\n_LT_EOF\n\t  fi ;;\n\tesac\n      fi\n      break\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\n  MAGIC_CMD=\"$lt_save_MAGIC_CMD\"\n  ;;\nesac])\nMAGIC_CMD=\"$lt_cv_path_MAGIC_CMD\"\nif test -n \"$MAGIC_CMD\"; then\n  AC_MSG_RESULT($MAGIC_CMD)\nelse\n  AC_MSG_RESULT(no)\nfi\n_LT_DECL([], [MAGIC_CMD], [0],\n\t [Used to examine libraries when file_magic_cmd begins with \"file\"])dnl\n])# _LT_PATH_TOOL_PREFIX\n\n# Old name:\nAU_ALIAS([AC_PATH_TOOL_PREFIX], [_LT_PATH_TOOL_PREFIX])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_PATH_TOOL_PREFIX], [])\n\n\n# _LT_PATH_MAGIC\n# --------------\n# find a file program which can recognize a shared library\nm4_defun([_LT_PATH_MAGIC],\n[_LT_PATH_TOOL_PREFIX(${ac_tool_prefix}file, /usr/bin$PATH_SEPARATOR$PATH)\nif test -z \"$lt_cv_path_MAGIC_CMD\"; then\n  if test -n \"$ac_tool_prefix\"; then\n    _LT_PATH_TOOL_PREFIX(file, /usr/bin$PATH_SEPARATOR$PATH)\n  else\n    MAGIC_CMD=:\n  fi\nfi\n])# _LT_PATH_MAGIC\n\n\n# LT_PATH_LD\n# ----------\n# find the pathname to the GNU or non-GNU linker\nAC_DEFUN([LT_PATH_LD],\n[AC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_PROG_ECHO_BACKSLASH])dnl\n\nAC_ARG_WITH([gnu-ld],\n    [AS_HELP_STRING([--with-gnu-ld],\n\t[assume the C compiler uses GNU ld @<:@default=no@:>@])],\n    [test \"$withval\" = no || with_gnu_ld=yes],\n    [with_gnu_ld=no])dnl\n\nac_prog=ld\nif test \"$GCC\" = yes; then\n  # Check if gcc -print-prog-name=ld gives a path.\n  AC_MSG_CHECKING([for ld used by $CC])\n  case $host in\n  *-*-mingw*)\n    # gcc leaves a trailing carriage return which upsets mingw\n    ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\\015'` ;;\n  *)\n    ac_prog=`($CC -print-prog-name=ld) 2>&5` ;;\n  esac\n  case $ac_prog in\n    # Accept absolute paths.\n    [[\\\\/]]* | ?:[[\\\\/]]*)\n      re_direlt='/[[^/]][[^/]]*/\\.\\./'\n      # Canonicalize the pathname of ld\n      ac_prog=`$ECHO \"$ac_prog\"| $SED 's%\\\\\\\\%/%g'`\n      while $ECHO \"$ac_prog\" | $GREP \"$re_direlt\" > /dev/null 2>&1; do\n\tac_prog=`$ECHO $ac_prog| $SED \"s%$re_direlt%/%\"`\n      done\n      test -z \"$LD\" && LD=\"$ac_prog\"\n      ;;\n  \"\")\n    # If it fails, then pretend we aren't using GCC.\n    ac_prog=ld\n    ;;\n  *)\n    # If it is relative, then search for the first ld in PATH.\n    with_gnu_ld=unknown\n    ;;\n  esac\nelif test \"$with_gnu_ld\" = yes; then\n  AC_MSG_CHECKING([for GNU ld])\nelse\n  AC_MSG_CHECKING([for non-GNU ld])\nfi\nAC_CACHE_VAL(lt_cv_path_LD,\n[if test -z \"$LD\"; then\n  lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n  for ac_dir in $PATH; do\n    IFS=\"$lt_save_ifs\"\n    test -z \"$ac_dir\" && ac_dir=.\n    if test -f \"$ac_dir/$ac_prog\" || test -f \"$ac_dir/$ac_prog$ac_exeext\"; then\n      lt_cv_path_LD=\"$ac_dir/$ac_prog\"\n      # Check to see if the program is GNU ld.  I'd rather use --version,\n      # but apparently some variants of GNU ld only accept -v.\n      # Break only if it was the GNU/non-GNU ld that we prefer.\n      case `\"$lt_cv_path_LD\" -v 2>&1 </dev/null` in\n      *GNU* | *'with BFD'*)\n\ttest \"$with_gnu_ld\" != no && break\n\t;;\n      *)\n\ttest \"$with_gnu_ld\" != yes && break\n\t;;\n      esac\n    fi\n  done\n  IFS=\"$lt_save_ifs\"\nelse\n  lt_cv_path_LD=\"$LD\" # Let the user override the test with a path.\nfi])\nLD=\"$lt_cv_path_LD\"\nif test -n \"$LD\"; then\n  AC_MSG_RESULT($LD)\nelse\n  AC_MSG_RESULT(no)\nfi\ntest -z \"$LD\" && AC_MSG_ERROR([no acceptable ld found in \\$PATH])\n_LT_PATH_LD_GNU\nAC_SUBST([LD])\n\n_LT_TAGDECL([], [LD], [1], [The linker used to build libraries])\n])# LT_PATH_LD\n\n# Old names:\nAU_ALIAS([AM_PROG_LD], [LT_PATH_LD])\nAU_ALIAS([AC_PROG_LD], [LT_PATH_LD])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_PROG_LD], [])\ndnl AC_DEFUN([AC_PROG_LD], [])\n\n\n# _LT_PATH_LD_GNU\n#- --------------\nm4_defun([_LT_PATH_LD_GNU],\n[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], lt_cv_prog_gnu_ld,\n[# I'd rather use --version here, but apparently some GNU lds only accept -v.\ncase `$LD -v 2>&1 </dev/null` in\n*GNU* | *'with BFD'*)\n  lt_cv_prog_gnu_ld=yes\n  ;;\n*)\n  lt_cv_prog_gnu_ld=no\n  ;;\nesac])\nwith_gnu_ld=$lt_cv_prog_gnu_ld\n])# _LT_PATH_LD_GNU\n\n\n# _LT_CMD_RELOAD\n# --------------\n# find reload flag for linker\n#   -- PORTME Some linkers may need a different reload flag.\nm4_defun([_LT_CMD_RELOAD],\n[AC_CACHE_CHECK([for $LD option to reload object files],\n  lt_cv_ld_reload_flag,\n  [lt_cv_ld_reload_flag='-r'])\nreload_flag=$lt_cv_ld_reload_flag\ncase $reload_flag in\n\"\" | \" \"*) ;;\n*) reload_flag=\" $reload_flag\" ;;\nesac\nreload_cmds='$LD$reload_flag -o $output$reload_objs'\ncase $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    if test \"$GCC\" != yes; then\n      reload_cmds=false\n    fi\n    ;;\n  darwin*)\n    if test \"$GCC\" = yes; then\n      reload_cmds='$LTCC $LTCFLAGS -nostdlib ${wl}-r -o $output$reload_objs'\n    else\n      reload_cmds='$LD$reload_flag -o $output$reload_objs'\n    fi\n    ;;\nesac\n_LT_TAGDECL([], [reload_flag], [1], [How to create reloadable object files])dnl\n_LT_TAGDECL([], [reload_cmds], [2])dnl\n])# _LT_CMD_RELOAD\n\n\n# _LT_CHECK_MAGIC_METHOD\n# ----------------------\n# how to check for library dependencies\n#  -- PORTME fill in with the dynamic library characteristics\nm4_defun([_LT_CHECK_MAGIC_METHOD],\n[m4_require([_LT_DECL_EGREP])\nm4_require([_LT_DECL_OBJDUMP])\nAC_CACHE_CHECK([how to recognize dependent libraries],\nlt_cv_deplibs_check_method,\n[lt_cv_file_magic_cmd='$MAGIC_CMD'\nlt_cv_file_magic_test_file=\nlt_cv_deplibs_check_method='unknown'\n# Need to set the preceding variable on all platforms that support\n# interlibrary dependencies.\n# 'none' -- dependencies not supported.\n# `unknown' -- same as none, but documents that we really don't know.\n# 'pass_all' -- all dependencies passed with no checks.\n# 'test_compile' -- check by making test program.\n# 'file_magic [[regex]]' -- check by looking for files in library path\n# which responds to the $file_magic_cmd with a given extended regex.\n# If you have `file' or equivalent on your system and you're not sure\n# whether `pass_all' will *always* work, you probably want this one.\n\ncase $host_os in\naix[[4-9]]*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbeos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nbsdi[[45]]*)\n  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib)'\n  lt_cv_file_magic_cmd='/usr/bin/file -L'\n  lt_cv_file_magic_test_file=/shlib/libc.so\n  ;;\n\ncygwin*)\n  # func_win32_libid is a shell function defined in ltmain.sh\n  lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n  lt_cv_file_magic_cmd='func_win32_libid'\n  ;;\n\nmingw* | pw32*)\n  # Base MSYS/MinGW do not provide the 'file' command needed by\n  # func_win32_libid shell function, so use a weaker test based on 'objdump',\n  # unless we find 'file', for example because we are cross-compiling.\n  # func_win32_libid assumes BSD nm, so disallow it if using MS dumpbin.\n  if ( test \"$lt_cv_nm_interface\" = \"BSD nm\" && file / ) >/dev/null 2>&1; then\n    lt_cv_deplibs_check_method='file_magic ^x86 archive import|^x86 DLL'\n    lt_cv_file_magic_cmd='func_win32_libid'\n  else\n    # Keep this pattern in sync with the one in func_win32_libid.\n    lt_cv_deplibs_check_method='file_magic file format (pei*-i386(.*architecture: i386)?|pe-arm-wince|pe-x86-64)'\n    lt_cv_file_magic_cmd='$OBJDUMP -f'\n  fi\n  ;;\n\ncegcc*)\n  # use the weaker test based on 'objdump'. See mingw*.\n  lt_cv_deplibs_check_method='file_magic file format pe-arm-.*little(.*architecture: arm)?'\n  lt_cv_file_magic_cmd='$OBJDUMP -f'\n  ;;\n\ndarwin* | rhapsody*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nfreebsd* | dragonfly*)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    case $host_cpu in\n    i*86 )\n      # Not sure whether the presence of OpenBSD here was a mistake.\n      # Let's accept both of them until this is cleared up.\n      lt_cv_deplibs_check_method='file_magic (FreeBSD|OpenBSD|DragonFly)/i[[3-9]]86 (compact )?demand paged shared library'\n      lt_cv_file_magic_cmd=/usr/bin/file\n      lt_cv_file_magic_test_file=`echo /usr/lib/libc.so.*`\n      ;;\n    esac\n  else\n    lt_cv_deplibs_check_method=pass_all\n  fi\n  ;;\n\nhaiku*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nhpux10.20* | hpux11*)\n  lt_cv_file_magic_cmd=/usr/bin/file\n  case $host_cpu in\n  ia64*)\n    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|ELF-[[0-9]][[0-9]]) shared object file - IA64'\n    lt_cv_file_magic_test_file=/usr/lib/hpux32/libc.so\n    ;;\n  hppa*64*)\n    [lt_cv_deplibs_check_method='file_magic (s[0-9][0-9][0-9]|ELF[ -][0-9][0-9])(-bit)?( [LM]SB)? shared object( file)?[, -]* PA-RISC [0-9]\\.[0-9]']\n    lt_cv_file_magic_test_file=/usr/lib/pa20_64/libc.sl\n    ;;\n  *)\n    lt_cv_deplibs_check_method='file_magic (s[[0-9]][[0-9]][[0-9]]|PA-RISC[[0-9]]\\.[[0-9]]) shared library'\n    lt_cv_file_magic_test_file=/usr/lib/libc.sl\n    ;;\n  esac\n  ;;\n\ninterix[[3-9]]*)\n  # PIC code is broken on Interix 3.x, that's why |\\.a not |_pic\\.a here\n  lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so|\\.a)$'\n  ;;\n\nirix5* | irix6* | nonstopux*)\n  case $LD in\n  *-32|*\"-32 \") libmagic=32-bit;;\n  *-n32|*\"-n32 \") libmagic=N32;;\n  *-64|*\"-64 \") libmagic=64-bit;;\n  *) libmagic=never-match;;\n  esac\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\n# This must be glibc/ELF.\nlinux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nnetbsd* | netbsdelf*-gnu)\n  if echo __ELF__ | $CC -E - | $GREP __ELF__ > /dev/null; then\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so|_pic\\.a)$'\n  fi\n  ;;\n\nnewos6*)\n  lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (executable|dynamic lib)'\n  lt_cv_file_magic_cmd=/usr/bin/file\n  lt_cv_file_magic_test_file=/usr/lib/libnls.so\n  ;;\n\n*nto* | *qnx*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nopenbsd*)\n  if test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|\\.so|_pic\\.a)$'\n  else\n    lt_cv_deplibs_check_method='match_pattern /lib[[^/]]+(\\.so\\.[[0-9]]+\\.[[0-9]]+|_pic\\.a)$'\n  fi\n  ;;\n\nosf3* | osf4* | osf5*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nrdos*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsolaris*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX* | sysv4*uw2*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\n\nsysv4 | sysv4.3*)\n  case $host_vendor in\n  motorola)\n    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[ML]]SB (shared object|dynamic lib) M[[0-9]][[0-9]]* Version [[0-9]]'\n    lt_cv_file_magic_test_file=`echo /usr/lib/libc.so*`\n    ;;\n  ncr)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  sequent)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method='file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB (shared object|dynamic lib )'\n    ;;\n  sni)\n    lt_cv_file_magic_cmd='/bin/file'\n    lt_cv_deplibs_check_method=\"file_magic ELF [[0-9]][[0-9]]*-bit [[LM]]SB dynamic lib\"\n    lt_cv_file_magic_test_file=/lib/libc.so\n    ;;\n  siemens)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  pc)\n    lt_cv_deplibs_check_method=pass_all\n    ;;\n  esac\n  ;;\n\ntpf*)\n  lt_cv_deplibs_check_method=pass_all\n  ;;\nesac\n])\n\nfile_magic_glob=\nwant_nocaseglob=no\nif test \"$build\" = \"$host\"; then\n  case $host_os in\n  mingw* | pw32*)\n    if ( shopt | grep nocaseglob ) >/dev/null 2>&1; then\n      want_nocaseglob=yes\n    else\n      file_magic_glob=`echo aAbBcCdDeEfFgGhHiIjJkKlLmMnNoOpPqQrRsStTuUvVwWxXyYzZ | $SED -e \"s/\\(..\\)/s\\/[[\\1]]\\/[[\\1]]\\/g;/g\"`\n    fi\n    ;;\n  esac\nfi\n\nfile_magic_cmd=$lt_cv_file_magic_cmd\ndeplibs_check_method=$lt_cv_deplibs_check_method\ntest -z \"$deplibs_check_method\" && deplibs_check_method=unknown\n\n_LT_DECL([], [deplibs_check_method], [1],\n    [Method to check whether dependent libraries are shared objects])\n_LT_DECL([], [file_magic_cmd], [1],\n    [Command to use when deplibs_check_method = \"file_magic\"])\n_LT_DECL([], [file_magic_glob], [1],\n    [How to find potential files when deplibs_check_method = \"file_magic\"])\n_LT_DECL([], [want_nocaseglob], [1],\n    [Find potential files using nocaseglob when deplibs_check_method = \"file_magic\"])\n])# _LT_CHECK_MAGIC_METHOD\n\n\n# LT_PATH_NM\n# ----------\n# find the pathname to a BSD- or MS-compatible name lister\nAC_DEFUN([LT_PATH_NM],\n[AC_REQUIRE([AC_PROG_CC])dnl\nAC_CACHE_CHECK([for BSD- or MS-compatible name lister (nm)], lt_cv_path_NM,\n[if test -n \"$NM\"; then\n  # Let the user override the test.\n  lt_cv_path_NM=\"$NM\"\nelse\n  lt_nm_to_check=\"${ac_tool_prefix}nm\"\n  if test -n \"$ac_tool_prefix\" && test \"$build\" = \"$host\"; then\n    lt_nm_to_check=\"$lt_nm_to_check nm\"\n  fi\n  for lt_tmp_nm in $lt_nm_to_check; do\n    lt_save_ifs=\"$IFS\"; IFS=$PATH_SEPARATOR\n    for ac_dir in $PATH /usr/ccs/bin/elf /usr/ccs/bin /usr/ucb /bin; do\n      IFS=\"$lt_save_ifs\"\n      test -z \"$ac_dir\" && ac_dir=.\n      tmp_nm=\"$ac_dir/$lt_tmp_nm\"\n      if test -f \"$tmp_nm\" || test -f \"$tmp_nm$ac_exeext\" ; then\n\t# Check to see if the nm accepts a BSD-compat flag.\n\t# Adding the `sed 1q' prevents false positives on HP-UX, which says:\n\t#   nm: unknown option \"B\" ignored\n\t# Tru64's nm complains that /dev/null is an invalid object file\n\tcase `\"$tmp_nm\" -B /dev/null 2>&1 | sed '1q'` in\n\t*/dev/null* | *'Invalid file or object type'*)\n\t  lt_cv_path_NM=\"$tmp_nm -B\"\n\t  break\n\t  ;;\n\t*)\n\t  case `\"$tmp_nm\" -p /dev/null 2>&1 | sed '1q'` in\n\t  */dev/null*)\n\t    lt_cv_path_NM=\"$tmp_nm -p\"\n\t    break\n\t    ;;\n\t  *)\n\t    lt_cv_path_NM=${lt_cv_path_NM=\"$tmp_nm\"} # keep the first match, but\n\t    continue # so that we can try to find one that supports BSD flags\n\t    ;;\n\t  esac\n\t  ;;\n\tesac\n      fi\n    done\n    IFS=\"$lt_save_ifs\"\n  done\n  : ${lt_cv_path_NM=no}\nfi])\nif test \"$lt_cv_path_NM\" != \"no\"; then\n  NM=\"$lt_cv_path_NM\"\nelse\n  # Didn't find any BSD compatible name lister, look for dumpbin.\n  if test -n \"$DUMPBIN\"; then :\n    # Let the user override the test.\n  else\n    AC_CHECK_TOOLS(DUMPBIN, [dumpbin \"link -dump\"], :)\n    case `$DUMPBIN -symbols /dev/null 2>&1 | sed '1q'` in\n    *COFF*)\n      DUMPBIN=\"$DUMPBIN -symbols\"\n      ;;\n    *)\n      DUMPBIN=:\n      ;;\n    esac\n  fi\n  AC_SUBST([DUMPBIN])\n  if test \"$DUMPBIN\" != \":\"; then\n    NM=\"$DUMPBIN\"\n  fi\nfi\ntest -z \"$NM\" && NM=nm\nAC_SUBST([NM])\n_LT_DECL([], [NM], [1], [A BSD- or MS-compatible name lister])dnl\n\nAC_CACHE_CHECK([the name lister ($NM) interface], [lt_cv_nm_interface],\n  [lt_cv_nm_interface=\"BSD nm\"\n  echo \"int some_variable = 0;\" > conftest.$ac_ext\n  (eval echo \"\\\"\\$as_me:$LINENO: $ac_compile\\\"\" >&AS_MESSAGE_LOG_FD)\n  (eval \"$ac_compile\" 2>conftest.err)\n  cat conftest.err >&AS_MESSAGE_LOG_FD\n  (eval echo \"\\\"\\$as_me:$LINENO: $NM \\\\\\\"conftest.$ac_objext\\\\\\\"\\\"\" >&AS_MESSAGE_LOG_FD)\n  (eval \"$NM \\\"conftest.$ac_objext\\\"\" 2>conftest.err > conftest.out)\n  cat conftest.err >&AS_MESSAGE_LOG_FD\n  (eval echo \"\\\"\\$as_me:$LINENO: output\\\"\" >&AS_MESSAGE_LOG_FD)\n  cat conftest.out >&AS_MESSAGE_LOG_FD\n  if $GREP 'External.*some_variable' conftest.out > /dev/null; then\n    lt_cv_nm_interface=\"MS dumpbin\"\n  fi\n  rm -f conftest*])\n])# LT_PATH_NM\n\n# Old names:\nAU_ALIAS([AM_PROG_NM], [LT_PATH_NM])\nAU_ALIAS([AC_PROG_NM], [LT_PATH_NM])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_PROG_NM], [])\ndnl AC_DEFUN([AC_PROG_NM], [])\n\n# _LT_CHECK_SHAREDLIB_FROM_LINKLIB\n# --------------------------------\n# how to determine the name of the shared library\n# associated with a specific link library.\n#  -- PORTME fill in with the dynamic library characteristics\nm4_defun([_LT_CHECK_SHAREDLIB_FROM_LINKLIB],\n[m4_require([_LT_DECL_EGREP])\nm4_require([_LT_DECL_OBJDUMP])\nm4_require([_LT_DECL_DLLTOOL])\nAC_CACHE_CHECK([how to associate runtime and link libraries],\nlt_cv_sharedlib_from_linklib_cmd,\n[lt_cv_sharedlib_from_linklib_cmd='unknown'\n\ncase $host_os in\ncygwin* | mingw* | pw32* | cegcc*)\n  # two different shell functions defined in ltmain.sh\n  # decide which to use based on capabilities of $DLLTOOL\n  case `$DLLTOOL --help 2>&1` in\n  *--identify-strict*)\n    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib\n    ;;\n  *)\n    lt_cv_sharedlib_from_linklib_cmd=func_cygming_dll_for_implib_fallback\n    ;;\n  esac\n  ;;\n*)\n  # fallback: assume linklib IS sharedlib\n  lt_cv_sharedlib_from_linklib_cmd=\"$ECHO\"\n  ;;\nesac\n])\nsharedlib_from_linklib_cmd=$lt_cv_sharedlib_from_linklib_cmd\ntest -z \"$sharedlib_from_linklib_cmd\" && sharedlib_from_linklib_cmd=$ECHO\n\n_LT_DECL([], [sharedlib_from_linklib_cmd], [1],\n    [Command to associate shared and link libraries])\n])# _LT_CHECK_SHAREDLIB_FROM_LINKLIB\n\n\n# _LT_PATH_MANIFEST_TOOL\n# ----------------------\n# locate the manifest tool\nm4_defun([_LT_PATH_MANIFEST_TOOL],\n[AC_CHECK_TOOL(MANIFEST_TOOL, mt, :)\ntest -z \"$MANIFEST_TOOL\" && MANIFEST_TOOL=mt\nAC_CACHE_CHECK([if $MANIFEST_TOOL is a manifest tool], [lt_cv_path_mainfest_tool],\n  [lt_cv_path_mainfest_tool=no\n  echo \"$as_me:$LINENO: $MANIFEST_TOOL '-?'\" >&AS_MESSAGE_LOG_FD\n  $MANIFEST_TOOL '-?' 2>conftest.err > conftest.out\n  cat conftest.err >&AS_MESSAGE_LOG_FD\n  if $GREP 'Manifest Tool' conftest.out > /dev/null; then\n    lt_cv_path_mainfest_tool=yes\n  fi\n  rm -f conftest*])\nif test \"x$lt_cv_path_mainfest_tool\" != xyes; then\n  MANIFEST_TOOL=:\nfi\n_LT_DECL([], [MANIFEST_TOOL], [1], [Manifest tool])dnl\n])# _LT_PATH_MANIFEST_TOOL\n\n\n# LT_LIB_M\n# --------\n# check for math library\nAC_DEFUN([LT_LIB_M],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nLIBM=\ncase $host in\n*-*-beos* | *-*-cegcc* | *-*-cygwin* | *-*-haiku* | *-*-pw32* | *-*-darwin*)\n  # These system don't have libm, or don't need it\n  ;;\n*-ncr-sysv4.3*)\n  AC_CHECK_LIB(mw, _mwvalidcheckl, LIBM=\"-lmw\")\n  AC_CHECK_LIB(m, cos, LIBM=\"$LIBM -lm\")\n  ;;\n*)\n  AC_CHECK_LIB(m, cos, LIBM=\"-lm\")\n  ;;\nesac\nAC_SUBST([LIBM])\n])# LT_LIB_M\n\n# Old name:\nAU_ALIAS([AC_CHECK_LIBM], [LT_LIB_M])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_CHECK_LIBM], [])\n\n\n# _LT_COMPILER_NO_RTTI([TAGNAME])\n# -------------------------------\nm4_defun([_LT_COMPILER_NO_RTTI],\n[m4_require([_LT_TAG_COMPILER])dnl\n\n_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\n\nif test \"$GCC\" = yes; then\n  case $cc_basename in\n  nvcc*)\n    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -Xcompiler -fno-builtin' ;;\n  *)\n    _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin' ;;\n  esac\n\n  _LT_COMPILER_OPTION([if $compiler supports -fno-rtti -fno-exceptions],\n    lt_cv_prog_compiler_rtti_exceptions,\n    [-fno-rtti -fno-exceptions], [],\n    [_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\"$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1) -fno-rtti -fno-exceptions\"])\nfi\n_LT_TAGDECL([no_builtin_flag], [lt_prog_compiler_no_builtin_flag], [1],\n\t[Compiler flag to turn off builtin functions])\n])# _LT_COMPILER_NO_RTTI\n\n\n# _LT_CMD_GLOBAL_SYMBOLS\n# ----------------------\nm4_defun([_LT_CMD_GLOBAL_SYMBOLS],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_PROG_CC])dnl\nAC_REQUIRE([AC_PROG_AWK])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\nAC_REQUIRE([LT_PATH_LD])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_TAG_COMPILER])dnl\n\n# Check for command to grab the raw symbol name followed by C symbol from nm.\nAC_MSG_CHECKING([command to parse $NM output from $compiler object])\nAC_CACHE_VAL([lt_cv_sys_global_symbol_pipe],\n[\n# These are sane defaults that work on at least a few old systems.\n# [They come from Ultrix.  What could be older than Ultrix?!! ;)]\n\n# Character class describing NM global symbol codes.\nsymcode='[[BCDEGRST]]'\n\n# Regexp to match symbols that can be accessed directly from C.\nsympat='\\([[_A-Za-z]][[_A-Za-z0-9]]*\\)'\n\n# Define system-specific variables.\ncase $host_os in\naix*)\n  symcode='[[BCDT]]'\n  ;;\ncygwin* | mingw* | pw32* | cegcc*)\n  symcode='[[ABCDGISTW]]'\n  ;;\nhpux*)\n  if test \"$host_cpu\" = ia64; then\n    symcode='[[ABCDEGRST]]'\n  fi\n  ;;\nirix* | nonstopux*)\n  symcode='[[BCDEGRST]]'\n  ;;\nosf*)\n  symcode='[[BCDEGQRST]]'\n  ;;\nsolaris*)\n  symcode='[[BDRT]]'\n  ;;\nsco3.2v5*)\n  symcode='[[DT]]'\n  ;;\nsysv4.2uw2*)\n  symcode='[[DT]]'\n  ;;\nsysv5* | sco5v6* | unixware* | OpenUNIX*)\n  symcode='[[ABDT]]'\n  ;;\nsysv4)\n  symcode='[[DFNSTU]]'\n  ;;\nesac\n\n# If we're using GNU nm, then use its standard symbol codes.\ncase `$NM -V 2>&1` in\n*GNU* | *'with BFD'*)\n  symcode='[[ABCDGIRSTW]]' ;;\nesac\n\n# Transform an extracted symbol line into a proper C declaration.\n# Some systems (esp. on ia64) link data and code symbols differently,\n# so use this general approach.\nlt_cv_sys_global_symbol_to_cdecl=\"sed -n -e 's/^T .* \\(.*\\)$/extern int \\1();/p' -e 's/^$symcode* .* \\(.*\\)$/extern char \\1;/p'\"\n\n# Transform an extracted symbol line into symbol name and symbol address\nlt_cv_sys_global_symbol_to_c_name_address=\"sed -n -e 's/^: \\([[^ ]]*\\)[[ ]]*$/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([[^ ]]*\\) \\([[^ ]]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p'\"\nlt_cv_sys_global_symbol_to_c_name_address_lib_prefix=\"sed -n -e 's/^: \\([[^ ]]*\\)[[ ]]*$/  {\\\\\\\"\\1\\\\\\\", (void *) 0},/p' -e 's/^$symcode* \\([[^ ]]*\\) \\(lib[[^ ]]*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/p' -e 's/^$symcode* \\([[^ ]]*\\) \\([[^ ]]*\\)$/  {\\\"lib\\2\\\", (void *) \\&\\2},/p'\"\n\n# Handle CRLF in mingw tool chain\nopt_cr=\ncase $build_os in\nmingw*)\n  opt_cr=`$ECHO 'x\\{0,1\\}' | tr x '\\015'` # option cr in regexp\n  ;;\nesac\n\n# Try without a prefix underscore, then with it.\nfor ac_symprfx in \"\" \"_\"; do\n\n  # Transform symcode, sympat, and symprfx into a raw symbol and a C symbol.\n  symxfrm=\"\\\\1 $ac_symprfx\\\\2 \\\\2\"\n\n  # Write the raw and C identifiers.\n  if test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n    # Fake it for dumpbin and say T for any non-static function\n    # and D for any global variable.\n    # Also find C++ and __fastcall symbols from MSVC++,\n    # which start with @ or ?.\n    lt_cv_sys_global_symbol_pipe=\"$AWK ['\"\\\n\"     {last_section=section; section=\\$ 3};\"\\\n\"     /^COFF SYMBOL TABLE/{for(i in hide) delete hide[i]};\"\\\n\"     /Section length .*#relocs.*(pick any)/{hide[last_section]=1};\"\\\n\"     \\$ 0!~/External *\\|/{next};\"\\\n\"     / 0+ UNDEF /{next}; / UNDEF \\([^|]\\)*()/{next};\"\\\n\"     {if(hide[section]) next};\"\\\n\"     {f=0}; \\$ 0~/\\(\\).*\\|/{f=1}; {printf f ? \\\"T \\\" : \\\"D \\\"};\"\\\n\"     {split(\\$ 0, a, /\\||\\r/); split(a[2], s)};\"\\\n\"     s[1]~/^[@?]/{print s[1], s[1]; next};\"\\\n\"     s[1]~prfx {split(s[1],t,\\\"@\\\"); print t[1], substr(t[1],length(prfx))}\"\\\n\"     ' prfx=^$ac_symprfx]\"\n  else\n    lt_cv_sys_global_symbol_pipe=\"sed -n -e 's/^.*[[\t ]]\\($symcode$symcode*\\)[[\t ]][[\t ]]*$ac_symprfx$sympat$opt_cr$/$symxfrm/p'\"\n  fi\n  lt_cv_sys_global_symbol_pipe=\"$lt_cv_sys_global_symbol_pipe | sed '/ __gnu_lto/d'\"\n\n  # Check to see that the pipe works correctly.\n  pipe_works=no\n\n  rm -f conftest*\n  cat > conftest.$ac_ext <<_LT_EOF\n#ifdef __cplusplus\nextern \"C\" {\n#endif\nchar nm_test_var;\nvoid nm_test_func(void);\nvoid nm_test_func(void){}\n#ifdef __cplusplus\n}\n#endif\nint main(){nm_test_var='a';nm_test_func();return(0);}\n_LT_EOF\n\n  if AC_TRY_EVAL(ac_compile); then\n    # Now try to grab the symbols.\n    nlist=conftest.nm\n    if AC_TRY_EVAL(NM conftest.$ac_objext \\| \"$lt_cv_sys_global_symbol_pipe\" \\> $nlist) && test -s \"$nlist\"; then\n      # Try sorting and uniquifying the output.\n      if sort \"$nlist\" | uniq > \"$nlist\"T; then\n\tmv -f \"$nlist\"T \"$nlist\"\n      else\n\trm -f \"$nlist\"T\n      fi\n\n      # Make sure that we snagged all the symbols we need.\n      if $GREP ' nm_test_var$' \"$nlist\" >/dev/null; then\n\tif $GREP ' nm_test_func$' \"$nlist\" >/dev/null; then\n\t  cat <<_LT_EOF > conftest.$ac_ext\n/* Keep this code in sync between libtool.m4, ltmain, lt_system.h, and tests.  */\n#if defined(_WIN32) || defined(__CYGWIN__) || defined(_WIN32_WCE)\n/* DATA imports from DLLs on WIN32 con't be const, because runtime\n   relocations are performed -- see ld's documentation on pseudo-relocs.  */\n# define LT@&t@_DLSYM_CONST\n#elif defined(__osf__)\n/* This system does not cope well with relocations in const data.  */\n# define LT@&t@_DLSYM_CONST\n#else\n# define LT@&t@_DLSYM_CONST const\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n_LT_EOF\n\t  # Now generate the symbol file.\n\t  eval \"$lt_cv_sys_global_symbol_to_cdecl\"' < \"$nlist\" | $GREP -v main >> conftest.$ac_ext'\n\n\t  cat <<_LT_EOF >> conftest.$ac_ext\n\n/* The mapping between symbol names and symbols.  */\nLT@&t@_DLSYM_CONST struct {\n  const char *name;\n  void       *address;\n}\nlt__PROGRAM__LTX_preloaded_symbols[[]] =\n{\n  { \"@PROGRAM@\", (void *) 0 },\n_LT_EOF\n\t  $SED \"s/^$symcode$symcode* \\(.*\\) \\(.*\\)$/  {\\\"\\2\\\", (void *) \\&\\2},/\" < \"$nlist\" | $GREP -v main >> conftest.$ac_ext\n\t  cat <<\\_LT_EOF >> conftest.$ac_ext\n  {0, (void *) 0}\n};\n\n/* This works around a problem in FreeBSD linker */\n#ifdef FREEBSD_WORKAROUND\nstatic const void *lt_preloaded_setup() {\n  return lt__PROGRAM__LTX_preloaded_symbols;\n}\n#endif\n\n#ifdef __cplusplus\n}\n#endif\n_LT_EOF\n\t  # Now try linking the two files.\n\t  mv conftest.$ac_objext conftstm.$ac_objext\n\t  lt_globsym_save_LIBS=$LIBS\n\t  lt_globsym_save_CFLAGS=$CFLAGS\n\t  LIBS=\"conftstm.$ac_objext\"\n\t  CFLAGS=\"$CFLAGS$_LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)\"\n\t  if AC_TRY_EVAL(ac_link) && test -s conftest${ac_exeext}; then\n\t    pipe_works=yes\n\t  fi\n\t  LIBS=$lt_globsym_save_LIBS\n\t  CFLAGS=$lt_globsym_save_CFLAGS\n\telse\n\t  echo \"cannot find nm_test_func in $nlist\" >&AS_MESSAGE_LOG_FD\n\tfi\n      else\n\techo \"cannot find nm_test_var in $nlist\" >&AS_MESSAGE_LOG_FD\n      fi\n    else\n      echo \"cannot run $lt_cv_sys_global_symbol_pipe\" >&AS_MESSAGE_LOG_FD\n    fi\n  else\n    echo \"$progname: failed program was:\" >&AS_MESSAGE_LOG_FD\n    cat conftest.$ac_ext >&5\n  fi\n  rm -rf conftest* conftst*\n\n  # Do not use the global_symbol_pipe unless it works.\n  if test \"$pipe_works\" = yes; then\n    break\n  else\n    lt_cv_sys_global_symbol_pipe=\n  fi\ndone\n])\nif test -z \"$lt_cv_sys_global_symbol_pipe\"; then\n  lt_cv_sys_global_symbol_to_cdecl=\nfi\nif test -z \"$lt_cv_sys_global_symbol_pipe$lt_cv_sys_global_symbol_to_cdecl\"; then\n  AC_MSG_RESULT(failed)\nelse\n  AC_MSG_RESULT(ok)\nfi\n\n# Response file support.\nif test \"$lt_cv_nm_interface\" = \"MS dumpbin\"; then\n  nm_file_list_spec='@'\nelif $NM --help 2>/dev/null | grep '[[@]]FILE' >/dev/null; then\n  nm_file_list_spec='@'\nfi\n\n_LT_DECL([global_symbol_pipe], [lt_cv_sys_global_symbol_pipe], [1],\n    [Take the output of nm and produce a listing of raw symbols and C names])\n_LT_DECL([global_symbol_to_cdecl], [lt_cv_sys_global_symbol_to_cdecl], [1],\n    [Transform the output of nm in a proper C declaration])\n_LT_DECL([global_symbol_to_c_name_address],\n    [lt_cv_sys_global_symbol_to_c_name_address], [1],\n    [Transform the output of nm in a C name address pair])\n_LT_DECL([global_symbol_to_c_name_address_lib_prefix],\n    [lt_cv_sys_global_symbol_to_c_name_address_lib_prefix], [1],\n    [Transform the output of nm in a C name address pair when lib prefix is needed])\n_LT_DECL([], [nm_file_list_spec], [1],\n    [Specify filename containing input files for $NM])\n]) # _LT_CMD_GLOBAL_SYMBOLS\n\n\n# _LT_COMPILER_PIC([TAGNAME])\n# ---------------------------\nm4_defun([_LT_COMPILER_PIC],\n[m4_require([_LT_TAG_COMPILER])dnl\n_LT_TAGVAR(lt_prog_compiler_wl, $1)=\n_LT_TAGVAR(lt_prog_compiler_pic, $1)=\n_LT_TAGVAR(lt_prog_compiler_static, $1)=\n\nm4_if([$1], [CXX], [\n  # C++ specific cases for pic, static, wl, etc.\n  if test \"$GXX\" = yes; then\n    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\n    case $host_os in\n    aix*)\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the `-m68020' flag to GCC prevents building anything better,\n            # like `-m68040'.\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n    mingw* | cygwin* | os2* | pw32* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      ;;\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'\n      ;;\n    *djgpp*)\n      # DJGPP does not support shared libraries at all\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n      ;;\n    haiku*)\n      # PIC is the default for Haiku.\n      # The \"-static\" flag exists, but is broken.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)=\n      ;;\n    interix[[3-9]]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic\n      fi\n      ;;\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t;;\n      esac\n      ;;\n    *qnx* | *nto*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n    *)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n      ;;\n    esac\n  else\n    case $host_os in\n      aix[[4-9]]*)\n\t# All AIX code is PIC.\n\tif test \"$host_cpu\" = ia64; then\n\t  # AIX 5 now supports IA64 processor\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\telse\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'\n\tfi\n\t;;\n      chorus*)\n\tcase $cc_basename in\n\tcxch68*)\n\t  # Green Hills C++ Compiler\n\t  # _LT_TAGVAR(lt_prog_compiler_static, $1)=\"--no_auto_instantiation -u __main -u __premain -u _abort -r $COOL_DIR/lib/libOrb.a $MVME_DIR/lib/CC/libC.a $MVME_DIR/lib/classix/libcx.s.a\"\n\t  ;;\n\tesac\n\t;;\n      mingw* | cygwin* | os2* | pw32* | cegcc*)\n\t# This hack is so that the source file can tell whether it is being\n\t# built for inclusion in a dll (and should export symbols for example).\n\tm4_if([$1], [GCJ], [],\n\t  [_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n\t;;\n      dgux*)\n\tcase $cc_basename in\n\t  ec++*)\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    ;;\n\t  ghcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      freebsd* | dragonfly*)\n\t# FreeBSD uses GNU C++\n\t;;\n      hpux9* | hpux10* | hpux11*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'\n\t    if test \"$host_cpu\" != ia64; then\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t    fi\n\t    ;;\n\t  aCC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'\n\t    case $host_cpu in\n\t    hppa*64*|ia64*)\n\t      # +Z the default\n\t      ;;\n\t    *)\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t      ;;\n\t    esac\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      interix*)\n\t# This is c89, which is MS Visual C++ (no shared libs)\n\t# Anyone wants to do a port?\n\t;;\n      irix5* | irix6* | nonstopux*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    # CC pic flag -KPIC is the default.\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n\tcase $cc_basename in\n\t  KCC*)\n\t    # KAI C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t    ;;\n\t  ecpc* )\n\t    # old Intel C++ for x86_64 which still supported -KPIC.\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\t    ;;\n\t  icpc* )\n\t    # Intel C++, used to be incompatible with GCC.\n\t    # ICC 10 doesn't accept -KPIC any more.\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\t    ;;\n\t  pgCC* | pgcpp*)\n\t    # Portland Group C++ compiler\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    ;;\n\t  xlc* | xlC* | bgxl[[cC]]* | mpixl[[cC]]*)\n\t    # IBM XL 8.0, 9.0 on PPC and BlueGene\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n      lynxos*)\n\t;;\n      m88k*)\n\t;;\n      mvs*)\n\tcase $cc_basename in\n\t  cxx*)\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-W c,exportall'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      netbsd* | netbsdelf*-gnu)\n\t;;\n      *qnx* | *nto*)\n        # QNX uses GNU C++, but need to define -shared option too, otherwise\n        # it will coredump.\n        _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n        ;;\n      osf3* | osf4* | osf5*)\n\tcase $cc_basename in\n\t  KCC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='--backend -Wl,'\n\t    ;;\n\t  RCC*)\n\t    # Rational C++ 2.4.1\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  cxx*)\n\t    # Digital/Compaq C++\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    # Make sure the PIC flag is empty.  It appears that all Alpha\n\t    # Linux and Compaq Tru64 Unix objects are PIC.\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      psos*)\n\t;;\n      solaris*)\n\tcase $cc_basename in\n\t  CC* | sunCC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n\t    ;;\n\t  gcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sunos4*)\n\tcase $cc_basename in\n\t  CC*)\n\t    # Sun C++ 4.x\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\t  lcc*)\n\t    # Lucid\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n\tcase $cc_basename in\n\t  CC*)\n\t    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t    ;;\n\tesac\n\t;;\n      tandem*)\n\tcase $cc_basename in\n\t  NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t    ;;\n\t  *)\n\t    ;;\n\tesac\n\t;;\n      vxworks*)\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n\t;;\n    esac\n  fi\n],\n[\n  if test \"$GCC\" = yes; then\n    _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n    _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\n    case $host_os in\n      aix*)\n      # All AIX code is PIC.\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n        ;;\n      m68k)\n            # FIXME: we need at least 68020 code to build shared libraries, but\n            # adding the `-m68020' flag to GCC prevents building anything better,\n            # like `-m68040'.\n            _LT_TAGVAR(lt_prog_compiler_pic, $1)='-m68020 -resident32 -malways-restore-a4'\n        ;;\n      esac\n      ;;\n\n    beos* | irix5* | irix6* | nonstopux* | osf3* | osf4* | osf5*)\n      # PIC is the default for these OSes.\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      # Although the cygwin gcc ignores -fPIC, still need this for old-style\n      # (--disable-auto-import) libraries\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      ;;\n\n    darwin* | rhapsody*)\n      # PIC is the default on this platform\n      # Common symbols not allowed in MH_DYLIB files\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fno-common'\n      ;;\n\n    haiku*)\n      # PIC is the default for Haiku.\n      # The \"-static\" flag exists, but is broken.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)=\n      ;;\n\n    hpux*)\n      # PIC is the default for 64-bit PA HP-UX, but not for 32-bit\n      # PA HP-UX.  On IA64 HP-UX, PIC is the default but the pic flag\n      # sets the default TLS model and affects inlining.\n      case $host_cpu in\n      hppa*64*)\n\t# +Z the default\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t;;\n      esac\n      ;;\n\n    interix[[3-9]]*)\n      # Interix 3.x gcc -fpic/-fPIC options generate broken code.\n      # Instead, we relocate shared libraries at runtime.\n      ;;\n\n    msdosdjgpp*)\n      # Just because we use GCC doesn't mean we suddenly get shared libraries\n      # on systems that don't support them.\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      enable_shared=no\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)=-Kconform_pic\n      fi\n      ;;\n\n    *)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n      ;;\n    esac\n\n    case $cc_basename in\n    nvcc*) # Cuda Compiler Driver 2.2\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Xlinker '\n      if test -n \"$_LT_TAGVAR(lt_prog_compiler_pic, $1)\"; then\n        _LT_TAGVAR(lt_prog_compiler_pic, $1)=\"-Xcompiler $_LT_TAGVAR(lt_prog_compiler_pic, $1)\"\n      fi\n      ;;\n    esac\n  else\n    # PORTME Check for flag to pass linker flags through the system compiler.\n    case $host_os in\n    aix*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      if test \"$host_cpu\" = ia64; then\n\t# AIX 5 now supports IA64 processor\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      else\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-bnso -bI:/lib/syscalls.exp'\n      fi\n      ;;\n\n    mingw* | cygwin* | pw32* | os2* | cegcc*)\n      # This hack is so that the source file can tell whether it is being\n      # built for inclusion in a dll (and should export symbols for example).\n      m4_if([$1], [GCJ], [],\n\t[_LT_TAGVAR(lt_prog_compiler_pic, $1)='-DDLL_EXPORT'])\n      ;;\n\n    hpux9* | hpux10* | hpux11*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # PIC is the default for IA64 HP-UX and 64-bit HP-UX, but\n      # not for PA HP-UX.\n      case $host_cpu in\n      hppa*64*|ia64*)\n\t# +Z the default\n\t;;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='+Z'\n\t;;\n      esac\n      # Is there a better lt_prog_compiler_static that works with the bundled CC?\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='${wl}-a ${wl}archive'\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # PIC (with -KPIC) is the default.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n      case $cc_basename in\n      # old Intel for x86_64 which still supported -KPIC.\n      ecc*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n        ;;\n      # icc used to be incompatible with GCC.\n      # ICC 10 doesn't accept -KPIC any more.\n      icc* | ifort*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n        ;;\n      # Lahey Fortran 8.1.\n      lf95*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='--shared'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='--static'\n\t;;\n      nagfor*)\n\t# NAG Fortran compiler\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,-Wl,,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t;;\n      pgcc* | pgf77* | pgf90* | pgf95* | pgfortran*)\n        # Portland Group compilers (*not* the Pentium gcc compiler,\n\t# which looks to be a dead project)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n        ;;\n      ccc*)\n        _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n        # All Alpha code is PIC.\n        _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n        ;;\n      xl* | bgxl* | bgf* | mpixl*)\n\t# IBM XL C 8.0/Fortran 10.1, 11.1 on PPC and BlueGene\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-qpic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-qstaticlink'\n\t;;\n      *)\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ Ceres\\ Fortran* | *Sun*Fortran*\\ [[1-7]].* | *Sun*Fortran*\\ 8.[[0-3]]*)\n\t  # Sun Fortran 8.3 passes all unrecognized flags to the linker\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)=''\n\t  ;;\n\t*Sun\\ F* | *Sun*Fortran*)\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n\t  ;;\n\t*Sun\\ C*)\n\t  # Sun C 5.9\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t  ;;\n        *Intel*\\ [[CF]]*Compiler*)\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-static'\n\t  ;;\n\t*Portland\\ Group*)\n\t  _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n\t  _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fpic'\n\t  _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n\t  ;;\n\tesac\n\t;;\n      esac\n      ;;\n\n    newsos6)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    *nto* | *qnx*)\n      # QNX uses GNU C++, but need to define -shared option too, otherwise\n      # it will coredump.\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-fPIC -shared'\n      ;;\n\n    osf3* | osf4* | osf5*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      # All OSF/1 code is PIC.\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    rdos*)\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-non_shared'\n      ;;\n\n    solaris*)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      case $cc_basename in\n      f77* | f90* | f95* | sunf77* | sunf90* | sunf95*)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld ';;\n      *)\n\t_LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,';;\n      esac\n      ;;\n\n    sunos4*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Qoption ld '\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-PIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    sysv4 | sysv4.2uw2* | sysv4.3*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec ;then\n\t_LT_TAGVAR(lt_prog_compiler_pic, $1)='-Kconform_pic'\n\t_LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      fi\n      ;;\n\n    sysv5* | unixware* | sco3.2v5* | sco5v6* | OpenUNIX*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-KPIC'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    unicos*)\n      _LT_TAGVAR(lt_prog_compiler_wl, $1)='-Wl,'\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      ;;\n\n    uts4*)\n      _LT_TAGVAR(lt_prog_compiler_pic, $1)='-pic'\n      _LT_TAGVAR(lt_prog_compiler_static, $1)='-Bstatic'\n      ;;\n\n    *)\n      _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no\n      ;;\n    esac\n  fi\n])\ncase $host_os in\n  # For platforms which do not support PIC, -DPIC is meaningless:\n  *djgpp*)\n    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\n    ;;\n  *)\n    _LT_TAGVAR(lt_prog_compiler_pic, $1)=\"$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])\"\n    ;;\nesac\n\nAC_CACHE_CHECK([for $compiler option to produce PIC],\n  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)],\n  [_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_prog_compiler_pic, $1)])\n_LT_TAGVAR(lt_prog_compiler_pic, $1)=$_LT_TAGVAR(lt_cv_prog_compiler_pic, $1)\n\n#\n# Check to make sure the PIC flag actually works.\n#\nif test -n \"$_LT_TAGVAR(lt_prog_compiler_pic, $1)\"; then\n  _LT_COMPILER_OPTION([if $compiler PIC flag $_LT_TAGVAR(lt_prog_compiler_pic, $1) works],\n    [_LT_TAGVAR(lt_cv_prog_compiler_pic_works, $1)],\n    [$_LT_TAGVAR(lt_prog_compiler_pic, $1)@&t@m4_if([$1],[],[ -DPIC],[m4_if([$1],[CXX],[ -DPIC],[])])], [],\n    [case $_LT_TAGVAR(lt_prog_compiler_pic, $1) in\n     \"\" | \" \"*) ;;\n     *) _LT_TAGVAR(lt_prog_compiler_pic, $1)=\" $_LT_TAGVAR(lt_prog_compiler_pic, $1)\" ;;\n     esac],\n    [_LT_TAGVAR(lt_prog_compiler_pic, $1)=\n     _LT_TAGVAR(lt_prog_compiler_can_build_shared, $1)=no])\nfi\n_LT_TAGDECL([pic_flag], [lt_prog_compiler_pic], [1],\n\t[Additional compiler flags for building library objects])\n\n_LT_TAGDECL([wl], [lt_prog_compiler_wl], [1],\n\t[How to pass a linker flag through the compiler])\n#\n# Check to make sure the static flag actually works.\n#\nwl=$_LT_TAGVAR(lt_prog_compiler_wl, $1) eval lt_tmp_static_flag=\\\"$_LT_TAGVAR(lt_prog_compiler_static, $1)\\\"\n_LT_LINKER_OPTION([if $compiler static flag $lt_tmp_static_flag works],\n  _LT_TAGVAR(lt_cv_prog_compiler_static_works, $1),\n  $lt_tmp_static_flag,\n  [],\n  [_LT_TAGVAR(lt_prog_compiler_static, $1)=])\n_LT_TAGDECL([link_static_flag], [lt_prog_compiler_static], [1],\n\t[Compiler flag to prevent dynamic linking])\n])# _LT_COMPILER_PIC\n\n\n# _LT_LINKER_SHLIBS([TAGNAME])\n# ----------------------------\n# See if the linker supports building shared libraries.\nm4_defun([_LT_LINKER_SHLIBS],\n[AC_REQUIRE([LT_PATH_LD])dnl\nAC_REQUIRE([LT_PATH_NM])dnl\nm4_require([_LT_PATH_MANIFEST_TOOL])dnl\nm4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_DECL_SED])dnl\nm4_require([_LT_CMD_GLOBAL_SYMBOLS])dnl\nm4_require([_LT_TAG_COMPILER])dnl\nAC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])\nm4_if([$1], [CXX], [\n  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']\n  case $host_os in\n  aix[[4-9]]*)\n    # If we're using GNU nm, then we don't want the \"-C\" option.\n    # -C means demangle to AIX nm, but means don't demangle with GNU nm\n    # Also, AIX nm treats weak defined symbols like other global defined\n    # symbols, whereas GNU nm marks them as \"W\".\n    if $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"W\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n    else\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n    fi\n    ;;\n  pw32*)\n    _LT_TAGVAR(export_symbols_cmds, $1)=\"$ltdll_cmds\"\n    ;;\n  cygwin* | mingw* | cegcc*)\n    case $cc_basename in\n    cl*)\n      _LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'\n      ;;\n    *)\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\\([[^ ]]*\\)/\\1 DATA/;s/^.*[[ ]]__nm__\\([[^ ]]*\\)[[ ]][[^ ]]*/\\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\\'' | sort | uniq > $export_symbols'\n      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']\n      ;;\n    esac\n    ;;\n  linux* | k*bsd*-gnu | gnu*)\n    _LT_TAGVAR(link_all_deplibs, $1)=no\n    ;;\n  *)\n    _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n    ;;\n  esac\n], [\n  runpath_var=\n  _LT_TAGVAR(allow_undefined_flag, $1)=\n  _LT_TAGVAR(always_export_symbols, $1)=no\n  _LT_TAGVAR(archive_cmds, $1)=\n  _LT_TAGVAR(archive_expsym_cmds, $1)=\n  _LT_TAGVAR(compiler_needs_object, $1)=no\n  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n  _LT_TAGVAR(export_dynamic_flag_spec, $1)=\n  _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\\''s/.* //'\\'' | sort | uniq > $export_symbols'\n  _LT_TAGVAR(hardcode_automatic, $1)=no\n  _LT_TAGVAR(hardcode_direct, $1)=no\n  _LT_TAGVAR(hardcode_direct_absolute, $1)=no\n  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n  _LT_TAGVAR(hardcode_libdir_separator, $1)=\n  _LT_TAGVAR(hardcode_minus_L, $1)=no\n  _LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n  _LT_TAGVAR(inherit_rpath, $1)=no\n  _LT_TAGVAR(link_all_deplibs, $1)=unknown\n  _LT_TAGVAR(module_cmds, $1)=\n  _LT_TAGVAR(module_expsym_cmds, $1)=\n  _LT_TAGVAR(old_archive_from_new_cmds, $1)=\n  _LT_TAGVAR(old_archive_from_expsyms_cmds, $1)=\n  _LT_TAGVAR(thread_safe_flag_spec, $1)=\n  _LT_TAGVAR(whole_archive_flag_spec, $1)=\n  # include_expsyms should be a list of space-separated symbols to be *always*\n  # included in the symbol list\n  _LT_TAGVAR(include_expsyms, $1)=\n  # exclude_expsyms can be an extended regexp of symbols to exclude\n  # it will be wrapped by ` (' and `)$', so one must not match beginning or\n  # end of line.  Example: `a|bc|.*d.*' will exclude the symbols `a' and `bc',\n  # as well as any symbol that contains `d'.\n  _LT_TAGVAR(exclude_expsyms, $1)=['_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*']\n  # Although _GLOBAL_OFFSET_TABLE_ is a valid symbol C name, most a.out\n  # platforms (ab)use it in PIC code, but their linkers get confused if\n  # the symbol is explicitly referenced.  Since portable code cannot\n  # rely on this symbol name, it's probably fine to never include it in\n  # preloaded symbol tables.\n  # Exclude shared library initialization/finalization symbols.\ndnl Note also adjust exclude_expsyms for C++ above.\n  extract_expsyms_cmds=\n\n  case $host_os in\n  cygwin* | mingw* | pw32* | cegcc*)\n    # FIXME: the MSVC++ port hasn't been tested in a loooong time\n    # When not using gcc, we currently assume that we are using\n    # Microsoft Visual C++.\n    if test \"$GCC\" != yes; then\n      with_gnu_ld=no\n    fi\n    ;;\n  interix*)\n    # we just hope/assume this is gcc and not c89 (= MSVC++)\n    with_gnu_ld=yes\n    ;;\n  openbsd*)\n    with_gnu_ld=no\n    ;;\n  linux* | k*bsd*-gnu | gnu*)\n    _LT_TAGVAR(link_all_deplibs, $1)=no\n    ;;\n  esac\n\n  _LT_TAGVAR(ld_shlibs, $1)=yes\n\n  # On some targets, GNU ld is compatible enough with the native linker\n  # that we're better off using the native interface for both.\n  lt_use_gnu_ld_interface=no\n  if test \"$with_gnu_ld\" = yes; then\n    case $host_os in\n      aix*)\n\t# The AIX port of GNU ld has always aspired to compatibility\n\t# with the native linker.  However, as the warning in the GNU ld\n\t# block says, versions before 2.19.5* couldn't really create working\n\t# shared libraries, regardless of the interface used.\n\tcase `$LD -v 2>&1` in\n\t  *\\ \\(GNU\\ Binutils\\)\\ 2.19.5*) ;;\n\t  *\\ \\(GNU\\ Binutils\\)\\ 2.[[2-9]]*) ;;\n\t  *\\ \\(GNU\\ Binutils\\)\\ [[3-9]]*) ;;\n\t  *)\n\t    lt_use_gnu_ld_interface=yes\n\t    ;;\n\tesac\n\t;;\n      *)\n\tlt_use_gnu_ld_interface=yes\n\t;;\n    esac\n  fi\n\n  if test \"$lt_use_gnu_ld_interface\" = yes; then\n    # If archive_cmds runs LD, not CC, wlarc should be empty\n    wlarc='${wl}'\n\n    # Set some defaults for GNU ld with shared library support. These\n    # are reset later if shared libraries are not supported. Putting them\n    # here allows them to be overridden if necessary.\n    runpath_var=LD_RUN_PATH\n    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n    # ancient GNU ld didn't support --whole-archive et. al.\n    if $LD --help 2>&1 | $GREP 'no-whole-archive' > /dev/null; then\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n    else\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=\n    fi\n    supports_anon_versioning=no\n    case `$LD -v 2>&1` in\n      *GNU\\ gold*) supports_anon_versioning=yes ;;\n      *\\ [[01]].* | *\\ 2.[[0-9]].* | *\\ 2.10.*) ;; # catch versions < 2.11\n      *\\ 2.11.93.0.2\\ *) supports_anon_versioning=yes ;; # RH7.3 ...\n      *\\ 2.11.92.0.12\\ *) supports_anon_versioning=yes ;; # Mandrake 8.2 ...\n      *\\ 2.11.*) ;; # other 2.11 versions\n      *) supports_anon_versioning=yes ;;\n    esac\n\n    # See if GNU ld supports shared libraries.\n    case $host_os in\n    aix[[3-9]]*)\n      # On AIX/PPC, the GNU linker is very broken\n      if test \"$host_cpu\" != ia64; then\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: the GNU linker, at least up to release 2.19, is reported\n*** to be unable to reliably create shared libraries on AIX.\n*** Therefore, libtool is disabling shared libraries support.  If you\n*** really care for shared libraries, you may want to install binutils\n*** 2.20 or above, or modify your PATH so that a non-GNU linker is found.\n*** You will then need to restart the configuration process.\n\n_LT_EOF\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            _LT_TAGVAR(archive_expsym_cmds, $1)=''\n        ;;\n      m68k)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes\n        ;;\n      esac\n      ;;\n\n    beos*)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t# Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t# support --undefined.  This deserves some investigation.  FIXME\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,\n      # as there is no search path for DLLs.\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      _LT_TAGVAR(always_export_symbols, $1)=no\n      _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n      _LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\\([[^ ]]*\\)/\\1 DATA/;s/^.*[[ ]]__nm__\\([[^ ]]*\\)[[ ]][[^ ]]*/\\1 DATA/;/^I[[ ]]/d;/^[[AITW]][[ ]]/s/.* //'\\'' | sort | uniq > $export_symbols'\n      _LT_TAGVAR(exclude_expsyms, $1)=['[_]+GLOBAL_OFFSET_TABLE_|[_]+GLOBAL__[FID]_.*|[_]+head_[A-Za-z0-9_]+_dll|[A-Za-z0-9_]+_dll_iname']\n\n      if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t# If the export-symbols file already is a .def file (1st line\n\t# is EXPORTS), use it as is; otherwise, prepend...\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t  cp $export_symbols $output_objdir/$soname.def;\n\telse\n\t  echo EXPORTS > $output_objdir/$soname.def;\n\t  cat $export_symbols >> $output_objdir/$soname.def;\n\tfi~\n\t$CC -shared $output_objdir/$soname.def $libobjs $deplibs $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    haiku*)\n      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      ;;\n\n    interix[[3-9]]*)\n      _LT_TAGVAR(hardcode_direct, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n      # Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n      # Instead, shared libraries are loaded at an image base (0x10000000 by\n      # default) and relocated if they conflict, which is a slow very memory\n      # consuming and fragmenting process.  To avoid this, we pick a random,\n      # 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n      # time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      _LT_TAGVAR(archive_expsym_cmds, $1)='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n      ;;\n\n    gnu* | linux* | tpf* | k*bsd*-gnu | kopensolaris*-gnu)\n      tmp_diet=no\n      if test \"$host_os\" = linux-dietlibc; then\n\tcase $cc_basename in\n\t  diet\\ *) tmp_diet=yes;;\t# linux-dietlibc with static linking (!diet-dyn)\n\tesac\n      fi\n      if $LD --help 2>&1 | $EGREP ': supported targets:.* elf' > /dev/null \\\n\t && test \"$tmp_diet\" = no\n      then\n\ttmp_addflag=' $pic_flag'\n\ttmp_sharedflag='-shared'\n\tcase $cc_basename,$host_cpu in\n        pgcc*)\t\t\t\t# Portland Group C compiler\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag'\n\t  ;;\n\tpgf77* | pgf90* | pgf95* | pgfortran*)\n\t\t\t\t\t# Portland Group f77 and f90 compilers\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  tmp_addflag=' $pic_flag -Mnomain' ;;\n\tecc*,ia64* | icc*,ia64*)\t# Intel C compiler on ia64\n\t  tmp_addflag=' -i_dynamic' ;;\n\tefc*,ia64* | ifort*,ia64*)\t# Intel Fortran compiler on ia64\n\t  tmp_addflag=' -i_dynamic -nofor_main' ;;\n\tifc* | ifort*)\t\t\t# Intel Fortran compiler\n\t  tmp_addflag=' -nofor_main' ;;\n\tlf95*)\t\t\t\t# Lahey Fortran 8.1\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)=\n\t  tmp_sharedflag='--shared' ;;\n\txl[[cC]]* | bgxl[[cC]]* | mpixl[[cC]]*) # IBM XL C 8.0 on PPC (deal with xlf below)\n\t  tmp_sharedflag='-qmkshrobj'\n\t  tmp_addflag= ;;\n\tnvcc*)\t# Cuda Compiler Driver 2.2\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  _LT_TAGVAR(compiler_needs_object, $1)=yes\n\t  ;;\n\tesac\n\tcase `$CC -V 2>&1 | sed 5q` in\n\t*Sun\\ C*)\t\t\t# Sun C 5.9\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t  _LT_TAGVAR(compiler_needs_object, $1)=yes\n\t  tmp_sharedflag='-G' ;;\n\t*Sun\\ F*)\t\t\t# Sun Fortran 8.3\n\t  tmp_sharedflag='-G' ;;\n\tesac\n\t_LT_TAGVAR(archive_cmds, $1)='$CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\n        if test \"x$supports_anon_versioning\" = xyes; then\n          _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t    cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t    echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t    $CC '\"$tmp_sharedflag\"\"$tmp_addflag\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'\n        fi\n\n\tcase $cc_basename in\n\txlf* | bgf* | bgxlf* | mpixlf*)\n\t  # IBM XL Fortran 10.1 on PPC cannot create shared libs itself\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='--whole-archive$convenience --no-whole-archive'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -shared $libobjs $deplibs $linker_flags -soname $soname -o $lib'\n\t  if test \"x$supports_anon_versioning\" = xyes; then\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t      cat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t      echo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t      $LD -shared $libobjs $deplibs $linker_flags -soname $soname -version-script $output_objdir/$libname.ver -o $lib'\n\t  fi\n\t  ;;\n\tesac\n      else\n        _LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable $libobjs $deplibs $linker_flags -o $lib'\n\twlarc=\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      fi\n      ;;\n\n    solaris*)\n      if $LD -v 2>&1 | $GREP 'BFD 2\\.8' > /dev/null; then\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: The releases 2.8.* of the GNU linker cannot reliably\n*** create shared libraries on Solaris systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.9.1 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n      elif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6* | unixware* | OpenUNIX*)\n      case `$LD -v 2>&1` in\n        *\\ [[01]].* | *\\ 2.[[0-9]].* | *\\ 2.1[[0-5]].*)\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\tcat <<_LT_EOF 1>&2\n\n*** Warning: Releases of the GNU linker prior to 2.16.91.0.3 can not\n*** reliably create shared libraries on SCO systems.  Therefore, libtool\n*** is disabling shared libraries support.  We urge you to upgrade GNU\n*** binutils to release 2.16.91.0.3 or newer.  Another option is to modify\n*** your PATH or compiler configuration so that the native linker is\n*** used, and then restart.\n\n_LT_EOF\n\t;;\n\t*)\n\t  # For security reasons, it is highly recommended that you always\n\t  # use absolute paths for naming shared libraries, and exclude the\n\t  # DT_RUNPATH tag from executables and libraries.  But doing so\n\t  # requires that you compile everything twice, which is a pain.\n\t  if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t  else\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t  fi\n\t;;\n      esac\n      ;;\n\n    sunos4*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      wlarc=\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *)\n      if $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n    esac\n\n    if test \"$_LT_TAGVAR(ld_shlibs, $1)\" = no; then\n      runpath_var=\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)=\n      _LT_TAGVAR(whole_archive_flag_spec, $1)=\n    fi\n  else\n    # PORTME fill in a description of your system's linker (not GNU ld)\n    case $host_os in\n    aix3*)\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      _LT_TAGVAR(always_export_symbols, $1)=yes\n      _LT_TAGVAR(archive_expsym_cmds, $1)='$LD -o $output_objdir/$soname $libobjs $deplibs $linker_flags -bE:$export_symbols -T512 -H512 -bM:SRE~$AR $AR_FLAGS $lib $output_objdir/$soname'\n      # Note: this linker hardcodes the directories in LIBPATH if there\n      # are no directories specified by -L.\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      if test \"$GCC\" = yes && test -z \"$lt_prog_compiler_static\"; then\n\t# Neither direct hardcoding nor static linking is supported with a\n\t# broken collect2.\n\t_LT_TAGVAR(hardcode_direct, $1)=unsupported\n      fi\n      ;;\n\n    aix[[4-9]]*)\n      if test \"$host_cpu\" = ia64; then\n\t# On IA64, the linker does run time linking by default, so we don't\n\t# have to do anything special.\n\taix_use_runtimelinking=no\n\texp_sym_flag='-Bexport'\n\tno_entry_flag=\"\"\n      else\n\t# If we're using GNU nm, then we don't want the \"-C\" option.\n\t# -C means demangle to AIX nm, but means don't demangle with GNU nm\n\t# Also, AIX nm treats weak defined symbols like other global\n\t# defined symbols, whereas GNU nm marks them as \"W\".\n\tif $NM -V 2>&1 | $GREP 'GNU' > /dev/null; then\n\t  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -Bpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\") || (\\$ 2 == \"W\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\telse\n\t  _LT_TAGVAR(export_symbols_cmds, $1)='$NM -BCpg $libobjs $convenience | awk '\\''{ if (((\\$ 2 == \"T\") || (\\$ 2 == \"D\") || (\\$ 2 == \"B\")) && ([substr](\\$ 3,1,1) != \".\")) { print \\$ 3 } }'\\'' | sort -u > $export_symbols'\n\tfi\n\taix_use_runtimelinking=no\n\n\t# Test if we are trying to use run time linking or normal\n\t# AIX style linking. If -brtl is somewhere in LDFLAGS, we\n\t# need to do runtime linking.\n\tcase $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)\n\t  for ld_flag in $LDFLAGS; do\n\t  if (test $ld_flag = \"-brtl\" || test $ld_flag = \"-Wl,-brtl\"); then\n\t    aix_use_runtimelinking=yes\n\t    break\n\t  fi\n\t  done\n\t  ;;\n\tesac\n\n\texp_sym_flag='-bexport'\n\tno_entry_flag='-bnoentry'\n      fi\n\n      # When large executables or shared objects are built, AIX ld can\n      # have problems creating the table of contents.  If linking a library\n      # or program results in \"error TOC overflow\" add -mminimal-toc to\n      # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n      # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n      _LT_TAGVAR(archive_cmds, $1)=''\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'\n\n      if test \"$GCC\" = yes; then\n\tcase $host_os in aix4.[[012]]|aix4.[[012]].*)\n\t# We only want to do this on AIX 4.2 and lower, the check\n\t# below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`${CC} -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t   strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t  # We have reworked collect2\n\t  :\n\t  else\n\t  # We have old collect2\n\t  _LT_TAGVAR(hardcode_direct, $1)=unsupported\n\t  # It fails to find uninstalled libraries when the uninstalled\n\t  # path is not listed in the libpath.  Setting hardcode_minus_L\n\t  # to unsupported forces relinking\n\t  _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n\t  _LT_TAGVAR(hardcode_libdir_separator, $1)=\n\t  fi\n\t  ;;\n\tesac\n\tshared_flag='-shared'\n\tif test \"$aix_use_runtimelinking\" = yes; then\n\t  shared_flag=\"$shared_flag \"'${wl}-G'\n\tfi\n\t_LT_TAGVAR(link_all_deplibs, $1)=no\n      else\n\t# not using gcc\n\tif test \"$host_cpu\" = ia64; then\n\t# VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t# chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n\telse\n\t  if test \"$aix_use_runtimelinking\" = yes; then\n\t    shared_flag='${wl}-G'\n\t  else\n\t    shared_flag='${wl}-bM:SRE'\n\t  fi\n\tfi\n      fi\n\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'\n      # It seems that -bexpall does not export symbols beginning with\n      # underscore (_), so it is better to generate a list of symbols to export.\n      _LT_TAGVAR(always_export_symbols, $1)=yes\n      if test \"$aix_use_runtimelinking\" = yes; then\n\t# Warning - without using the other runtime loading flags (-brtl),\n\t# -berok will link without error, but may produce a broken library.\n\t_LT_TAGVAR(allow_undefined_flag, $1)='-berok'\n        # Determine the default libpath from the value encoded in an\n        # empty executable.\n        _LT_SYS_MODULE_PATH_AIX([$1])\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then func_echo_all \"${wl}${allow_undefined_flag}\"; else :; fi` '\"\\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n      else\n\tif test \"$host_cpu\" = ia64; then\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=\"-z nodefs\"\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$exp_sym_flag:\\$export_symbols\"\n\telse\n\t # Determine the default libpath from the value encoded in an\n\t # empty executable.\n\t _LT_SYS_MODULE_PATH_AIX([$1])\n\t _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\t  # Warning - without using the other run time loading flags,\n\t  # -berok will link without error, but may produce a broken library.\n\t  _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'\n\t  if test \"$with_gnu_ld\" = yes; then\n\t    # We only use this code for GNU lds that support --whole-archive.\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'\n\t  else\n\t    # Exported symbols can be pulled into shared objects from archives\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'\n\t  fi\n\t  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\t  # This is similar to how AIX traditionally builds its shared libraries.\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'\n\tfi\n      fi\n      ;;\n\n    amigaos*)\n      case $host_cpu in\n      powerpc)\n            # see comment about AmigaOS4 .so support\n            _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n            _LT_TAGVAR(archive_expsym_cmds, $1)=''\n        ;;\n      m68k)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/a2ixlibrary.data~$ECHO \"#define NAME $libname\" > $output_objdir/a2ixlibrary.data~$ECHO \"#define LIBRARY_ID 1\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define VERSION $major\" >> $output_objdir/a2ixlibrary.data~$ECHO \"#define REVISION $revision\" >> $output_objdir/a2ixlibrary.data~$AR $AR_FLAGS $lib $libobjs~$RANLIB $lib~(cd $output_objdir && a2ixlibrary -32)'\n            _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes\n        ;;\n      esac\n      ;;\n\n    bsdi[[45]]*)\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)=-rdynamic\n      ;;\n\n    cygwin* | mingw* | pw32* | cegcc*)\n      # When not using gcc, we currently assume that we are using\n      # Microsoft Visual C++.\n      # hardcode_libdir_flag_spec is actually meaningless, as there is\n      # no search path for DLLs.\n      case $cc_basename in\n      cl*)\n\t# Native MSVC\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '\n\t_LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t_LT_TAGVAR(always_export_symbols, $1)=yes\n\t_LT_TAGVAR(file_list_spec, $1)='@'\n\t# Tell ltmain to make .lib files, not .a files.\n\tlibext=lib\n\t# Tell ltmain to make .dll files, not .so files.\n\tshrext_cmds=\".dll\"\n\t# FIXME: Setting linknames here is a bad hack.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t    sed -n -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' -e '1\\\\\\!p' < $export_symbols > $output_objdir/$soname.exp;\n\t  else\n\t    sed -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;\n\t  fi~\n\t  $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs \"@$tool_output_objdir$soname.exp\" -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~\n\t  linknames='\n\t# The linker will not automatically build a static lib if we build a DLL.\n\t# _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'\n\t_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\t_LT_TAGVAR(exclude_expsyms, $1)='_NULL_IMPORT_DESCRIPTOR|_IMPORT_DESCRIPTOR_.*'\n\t_LT_TAGVAR(export_symbols_cmds, $1)='$NM $libobjs $convenience | $global_symbol_pipe | $SED -e '\\''/^[[BCDGRS]][[ ]]/s/.*[[ ]]\\([[^ ]]*\\)/\\1,DATA/'\\'' | $SED -e '\\''/^[[AITW]][[ ]]/s/.*[[ ]]//'\\'' | sort | uniq > $export_symbols'\n\t# Don't use ranlib\n\t_LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'\n\t_LT_TAGVAR(postlink_cmds, $1)='lt_outputfile=\"@OUTPUT@\"~\n\t  lt_tool_outputfile=\"@TOOL_OUTPUT@\"~\n\t  case $lt_outputfile in\n\t    *.exe|*.EXE) ;;\n\t    *)\n\t      lt_outputfile=\"$lt_outputfile.exe\"\n\t      lt_tool_outputfile=\"$lt_tool_outputfile.exe\"\n\t      ;;\n\t  esac~\n\t  if test \"$MANIFEST_TOOL\" != \":\" && test -f \"$lt_outputfile.manifest\"; then\n\t    $MANIFEST_TOOL -manifest \"$lt_tool_outputfile.manifest\" -outputresource:\"$lt_tool_outputfile\" || exit 1;\n\t    $RM \"$lt_outputfile.manifest\";\n\t  fi'\n\t;;\n      *)\n\t# Assume MSVC wrapper\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '\n\t_LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t# Tell ltmain to make .lib files, not .a files.\n\tlibext=lib\n\t# Tell ltmain to make .dll files, not .so files.\n\tshrext_cmds=\".dll\"\n\t# FIXME: Setting linknames here is a bad hack.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -o $lib $libobjs $compiler_flags `func_echo_all \"$deplibs\" | $SED '\\''s/ -lc$//'\\''` -link -dll~linknames='\n\t# The linker will automatically build a .lib file if we build a DLL.\n\t_LT_TAGVAR(old_archive_from_new_cmds, $1)='true'\n\t# FIXME: Should let the user specify the lib program.\n\t_LT_TAGVAR(old_archive_cmds, $1)='lib -OUT:$oldlib$oldobjs$old_deplibs'\n\t_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\t;;\n      esac\n      ;;\n\n    darwin* | rhapsody*)\n      _LT_DARWIN_LINKER_FEATURES($1)\n      ;;\n\n    dgux*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    # FreeBSD 2.2.[012] allows us to include c++rt0.o to get C++ constructor\n    # support.  Future versions do this automatically, but an explicit c++rt0.o\n    # does not break anything, and helps significantly (at the cost of a little\n    # extra space).\n    freebsd2.2*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags /usr/lib/c++rt0.o'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    # Unfortunately, older versions of FreeBSD 2 do not have this feature.\n    freebsd2.*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    # FreeBSD 3 and greater uses gcc -shared to do shared libraries.\n    freebsd* | dragonfly*)\n      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    hpux9*)\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $libobjs $deplibs $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$LD -b +b $install_libdir -o $output_objdir/$soname $libobjs $deplibs $linker_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n\n      # hardcode_minus_L: Not really in the search PATH,\n      # but as the default location of the library.\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n      ;;\n\n    hpux10*)\n      if test \"$GCC\" = yes && test \"$with_gnu_ld\" = no; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\t_LT_TAGVAR(hardcode_direct, $1)=yes\n\t_LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\t# hardcode_minus_L: Not really in the search PATH,\n\t# but as the default location of the library.\n\t_LT_TAGVAR(hardcode_minus_L, $1)=yes\n      fi\n      ;;\n\n    hpux11*)\n      if test \"$GCC\" = yes && test \"$with_gnu_ld\" = no; then\n\tcase $host_cpu in\n\thppa*64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tesac\n      else\n\tcase $host_cpu in\n\thppa*64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\tia64*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\tm4_if($1, [], [\n\t  # Older versions of the 11.00 compiler do not understand -b yet\n\t  # (HP92453-01 A.11.01.20 doesn't, HP92453-01 B.11.X.35175-35176.GP does)\n\t  _LT_LINKER_OPTION([if $CC understands -b],\n\t    _LT_TAGVAR(lt_cv_prog_compiler__b, $1), [-b],\n\t    [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'],\n\t    [_LT_TAGVAR(archive_cmds, $1)='$LD -b +h $soname +b $install_libdir -o $lib $libobjs $deplibs $linker_flags'])],\n\t  [_LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $libobjs $deplibs $compiler_flags'])\n\t  ;;\n\tesac\n      fi\n      if test \"$with_gnu_ld\" = no; then\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\tcase $host_cpu in\n\thppa*64*|ia64*)\n\t  _LT_TAGVAR(hardcode_direct, $1)=no\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\n\t  # hardcode_minus_L: Not really in the search PATH,\n\t  # but as the default location of the library.\n\t  _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t  ;;\n\tesac\n      fi\n      ;;\n\n    irix5* | irix6* | nonstopux*)\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t# Try to use the -exported_symbol ld option, if it does not\n\t# work, assume that -exports_file does not work either and\n\t# implicitly export all symbols.\n\t# This should be the same for all languages, so no per-tag cache variable.\n\tAC_CACHE_CHECK([whether the $host_os linker accepts -exported_symbol],\n\t  [lt_cv_irix_exported_symbol],\n\t  [save_LDFLAGS=\"$LDFLAGS\"\n\t   LDFLAGS=\"$LDFLAGS -shared ${wl}-exported_symbol ${wl}foo ${wl}-update_registry ${wl}/dev/null\"\n\t   AC_LINK_IFELSE(\n\t     [AC_LANG_SOURCE(\n\t        [AC_LANG_CASE([C], [[int foo (void) { return 0; }]],\n\t\t\t      [C++], [[int foo (void) { return 0; }]],\n\t\t\t      [Fortran 77], [[\n      subroutine foo\n      end]],\n\t\t\t      [Fortran], [[\n      subroutine foo\n      end]])])],\n\t      [lt_cv_irix_exported_symbol=yes],\n\t      [lt_cv_irix_exported_symbol=no])\n           LDFLAGS=\"$save_LDFLAGS\"])\n\tif test \"$lt_cv_irix_exported_symbol\" = yes; then\n          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations ${wl}-exports_file ${wl}$export_symbols -o $lib'\n\tfi\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -exports_file $export_symbols -o $lib'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(inherit_rpath, $1)=yes\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      ;;\n\n    netbsd* | netbsdelf*-gnu)\n      if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'  # a.out\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -shared -o $lib $libobjs $deplibs $linker_flags'      # ELF\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    newsos6)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *nto* | *qnx*)\n      ;;\n\n    openbsd*)\n      if test -f /usr/libexec/ld.so; then\n\t_LT_TAGVAR(hardcode_direct, $1)=yes\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\tif test -z \"`echo __ELF__ | $CC -E - | $GREP __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags ${wl}-retain-symbols-file,$export_symbols'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\telse\n\t  case $host_os in\n\t   openbsd[[01]].* | openbsd2.[[0-7]] | openbsd2.[[0-7]].*)\n\t     _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable -o $lib $libobjs $deplibs $linker_flags'\n\t     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t     ;;\n\t   *)\n\t     _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -o $lib $libobjs $deplibs $compiler_flags'\n\t     _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t     ;;\n\t  esac\n\tfi\n      else\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n      fi\n      ;;\n\n    os2*)\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n      _LT_TAGVAR(archive_cmds, $1)='$ECHO \"LIBRARY $libname INITINSTANCE\" > $output_objdir/$libname.def~$ECHO \"DESCRIPTION \\\"$libname\\\"\" >> $output_objdir/$libname.def~echo DATA >> $output_objdir/$libname.def~echo \" SINGLE NONSHARED\" >> $output_objdir/$libname.def~echo EXPORTS >> $output_objdir/$libname.def~emxexp $libobjs >> $output_objdir/$libname.def~$CC -Zdll -Zcrtdll -o $lib $libobjs $deplibs $compiler_flags $output_objdir/$libname.def'\n      _LT_TAGVAR(old_archive_from_new_cmds, $1)='emximp -o $output_objdir/$libname.a $output_objdir/$libname.def'\n      ;;\n\n    osf3*)\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n      else\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      ;;\n\n    osf4* | osf5*)\t# as osf3* with the addition of -msym flag\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $pic_flag $libobjs $deplibs $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n      else\n\t_LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $libobjs $deplibs $compiler_flags -msym -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done; printf \"%s\\\\n\" \"-hidden\">> $lib.exp~\n\t$CC -shared${allow_undefined_flag} ${wl}-input ${wl}$lib.exp $compiler_flags $libobjs $deplibs -soname $soname `test -n \"$verstring\" && $ECHO \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib~$RM $lib.exp'\n\n\t# Both c and cxx compiler support -rpath directly\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n      fi\n      _LT_TAGVAR(archive_cmds_need_lc, $1)='no'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n      ;;\n\n    solaris*)\n      _LT_TAGVAR(no_undefined_flag, $1)=' -z defs'\n      if test \"$GCC\" = yes; then\n\twlarc='${wl}'\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -shared $pic_flag ${wl}-z ${wl}text ${wl}-M ${wl}$lib.exp ${wl}-h ${wl}$soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n      else\n\tcase `$CC -V 2>&1` in\n\t*\"Compilers 5.0\"*)\n\t  wlarc=''\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $LD -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $linker_flags~$RM $lib.exp'\n\t  ;;\n\t*)\n\t  wlarc='${wl}'\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h $soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t  $CC -G${allow_undefined_flag} -M $lib.exp -h $soname -o $lib $libobjs $deplibs $compiler_flags~$RM $lib.exp'\n\t  ;;\n\tesac\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      case $host_os in\n      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n      *)\n\t# The compiler driver will combine and reorder linker options,\n\t# but understands `-z linker_flag'.  GCC discards it without `$wl',\n\t# but is careful enough not to reorder.\n\t# Supported since Solaris 2.6 (maybe 2.5.1?)\n\tif test \"$GCC\" = yes; then\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'\n\telse\n\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'\n\tfi\n\t;;\n      esac\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      ;;\n\n    sunos4*)\n      if test \"x$host_vendor\" = xsequent; then\n\t# Use $CC to link under sequent, because it throws in some extra .o\n\t# files that make .init and .fini sections work.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h $soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -assert pure-text -Bstatic -o $lib $libobjs $deplibs $linker_flags'\n      fi\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_direct, $1)=yes\n      _LT_TAGVAR(hardcode_minus_L, $1)=yes\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    sysv4)\n      case $host_vendor in\n\tsni)\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes # is this really true???\n\t;;\n\tsiemens)\n\t  ## LD is ld it makes a PLAMLIB\n\t  ## CC just makes a GrossModule.\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(reload_cmds, $1)='$CC -r -o $output$reload_objs'\n\t  _LT_TAGVAR(hardcode_direct, $1)=no\n        ;;\n\tmotorola)\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t  _LT_TAGVAR(hardcode_direct, $1)=no #Motorola manual says yes, but my tests say they lie\n\t;;\n      esac\n      runpath_var='LD_RUN_PATH'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    sysv4.3*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='-Bexport'\n      ;;\n\n    sysv4*MP*)\n      if test -d /usr/nec; then\n\t_LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\trunpath_var=LD_RUN_PATH\n\thardcode_runpath_var=yes\n\t_LT_TAGVAR(ld_shlibs, $1)=yes\n      fi\n      ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)\n      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    sysv5* | sco3.2v5* | sco5v6*)\n      # Note: We can NOT use -z defs as we might desire, because we do not\n      # link with -lc, and that would cause any symbols used from libc to\n      # always be unresolved, which means just about no library would\n      # ever link correctly.  If we're not using GNU ld we use -z text\n      # though, which does catch some bad symbols but isn't as heavy-handed\n      # as -z defs.\n      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n      _LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'\n      _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n      _LT_TAGVAR(link_all_deplibs, $1)=yes\n      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'\n      runpath_var='LD_RUN_PATH'\n\n      if test \"$GCC\" = yes; then\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      else\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n      fi\n      ;;\n\n    uts4*)\n      _LT_TAGVAR(archive_cmds, $1)='$LD -G -h $soname -o $lib $libobjs $deplibs $linker_flags'\n      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      ;;\n\n    *)\n      _LT_TAGVAR(ld_shlibs, $1)=no\n      ;;\n    esac\n\n    if test x$host_vendor = xsni; then\n      case $host in\n      sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*)\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Blargedynsym'\n\t;;\n      esac\n    fi\n  fi\n])\nAC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])\ntest \"$_LT_TAGVAR(ld_shlibs, $1)\" = no && can_build_shared=no\n\n_LT_TAGVAR(with_gnu_ld, $1)=$with_gnu_ld\n\n_LT_DECL([], [libext], [0], [Old archive suffix (normally \"a\")])dnl\n_LT_DECL([], [shrext_cmds], [1], [Shared library suffix (normally \".so\")])dnl\n_LT_DECL([], [extract_expsyms_cmds], [2],\n    [The commands to extract the exported symbol list from a shared archive])\n\n#\n# Do we need to explicitly link libc?\n#\ncase \"x$_LT_TAGVAR(archive_cmds_need_lc, $1)\" in\nx|xyes)\n  # Assume -lc should be added\n  _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\n  if test \"$enable_shared\" = yes && test \"$GCC\" = yes; then\n    case $_LT_TAGVAR(archive_cmds, $1) in\n    *'~'*)\n      # FIXME: we may have to deal with multi-command sequences.\n      ;;\n    '$CC '*)\n      # Test whether the compiler implicitly links with -lc since on some\n      # systems, -lgcc has to come before -lc. If gcc already passes -lc\n      # to ld, don't add -lc before -lgcc.\n      AC_CACHE_CHECK([whether -lc should be explicitly linked in],\n\t[lt_cv_]_LT_TAGVAR(archive_cmds_need_lc, $1),\n\t[$RM conftest*\n\techo \"$lt_simple_compile_test_code\" > conftest.$ac_ext\n\n\tif AC_TRY_EVAL(ac_compile) 2>conftest.err; then\n\t  soname=conftest\n\t  lib=conftest\n\t  libobjs=conftest.$ac_objext\n\t  deplibs=\n\t  wl=$_LT_TAGVAR(lt_prog_compiler_wl, $1)\n\t  pic_flag=$_LT_TAGVAR(lt_prog_compiler_pic, $1)\n\t  compiler_flags=-v\n\t  linker_flags=-v\n\t  verstring=\n\t  output_objdir=.\n\t  libname=conftest\n\t  lt_save_allow_undefined_flag=$_LT_TAGVAR(allow_undefined_flag, $1)\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=\n\t  if AC_TRY_EVAL(_LT_TAGVAR(archive_cmds, $1) 2\\>\\&1 \\| $GREP \\\" -lc \\\" \\>/dev/null 2\\>\\&1)\n\t  then\n\t    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\t  else\n\t    lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\t  fi\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=$lt_save_allow_undefined_flag\n\telse\n\t  cat conftest.err 1>&5\n\tfi\n\t$RM conftest*\n\t])\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=$lt_cv_[]_LT_TAGVAR(archive_cmds_need_lc, $1)\n      ;;\n    esac\n  fi\n  ;;\nesac\n\n_LT_TAGDECL([build_libtool_need_lc], [archive_cmds_need_lc], [0],\n    [Whether or not to add -lc for building shared libraries])\n_LT_TAGDECL([allow_libtool_libs_with_static_runtimes],\n    [enable_shared_with_static_runtimes], [0],\n    [Whether or not to disallow shared libs when runtime libs are static])\n_LT_TAGDECL([], [export_dynamic_flag_spec], [1],\n    [Compiler flag to allow reflexive dlopens])\n_LT_TAGDECL([], [whole_archive_flag_spec], [1],\n    [Compiler flag to generate shared objects directly from archives])\n_LT_TAGDECL([], [compiler_needs_object], [1],\n    [Whether the compiler copes with passing no objects directly])\n_LT_TAGDECL([], [old_archive_from_new_cmds], [2],\n    [Create an old-style archive from a shared archive])\n_LT_TAGDECL([], [old_archive_from_expsyms_cmds], [2],\n    [Create a temporary old-style archive to link instead of a shared archive])\n_LT_TAGDECL([], [archive_cmds], [2], [Commands used to build a shared archive])\n_LT_TAGDECL([], [archive_expsym_cmds], [2])\n_LT_TAGDECL([], [module_cmds], [2],\n    [Commands used to build a loadable module if different from building\n    a shared archive.])\n_LT_TAGDECL([], [module_expsym_cmds], [2])\n_LT_TAGDECL([], [with_gnu_ld], [1],\n    [Whether we are building with GNU ld or not])\n_LT_TAGDECL([], [allow_undefined_flag], [1],\n    [Flag that allows shared libraries with undefined symbols to be built])\n_LT_TAGDECL([], [no_undefined_flag], [1],\n    [Flag that enforces no undefined symbols])\n_LT_TAGDECL([], [hardcode_libdir_flag_spec], [1],\n    [Flag to hardcode $libdir into a binary during linking.\n    This must work even if $libdir does not exist])\n_LT_TAGDECL([], [hardcode_libdir_separator], [1],\n    [Whether we need a single \"-rpath\" flag with a separated argument])\n_LT_TAGDECL([], [hardcode_direct], [0],\n    [Set to \"yes\" if using DIR/libNAME${shared_ext} during linking hardcodes\n    DIR into the resulting binary])\n_LT_TAGDECL([], [hardcode_direct_absolute], [0],\n    [Set to \"yes\" if using DIR/libNAME${shared_ext} during linking hardcodes\n    DIR into the resulting binary and the resulting library dependency is\n    \"absolute\", i.e impossible to change by setting ${shlibpath_var} if the\n    library is relocated])\n_LT_TAGDECL([], [hardcode_minus_L], [0],\n    [Set to \"yes\" if using the -LDIR flag during linking hardcodes DIR\n    into the resulting binary])\n_LT_TAGDECL([], [hardcode_shlibpath_var], [0],\n    [Set to \"yes\" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR\n    into the resulting binary])\n_LT_TAGDECL([], [hardcode_automatic], [0],\n    [Set to \"yes\" if building a shared library automatically hardcodes DIR\n    into the library and all subsequent libraries and executables linked\n    against it])\n_LT_TAGDECL([], [inherit_rpath], [0],\n    [Set to yes if linker adds runtime paths of dependent libraries\n    to runtime path list])\n_LT_TAGDECL([], [link_all_deplibs], [0],\n    [Whether libtool must link a program against all its dependency libraries])\n_LT_TAGDECL([], [always_export_symbols], [0],\n    [Set to \"yes\" if exported symbols are required])\n_LT_TAGDECL([], [export_symbols_cmds], [2],\n    [The commands to list exported symbols])\n_LT_TAGDECL([], [exclude_expsyms], [1],\n    [Symbols that should not be listed in the preloaded symbols])\n_LT_TAGDECL([], [include_expsyms], [1],\n    [Symbols that must always be exported])\n_LT_TAGDECL([], [prelink_cmds], [2],\n    [Commands necessary for linking programs (against libraries) with templates])\n_LT_TAGDECL([], [postlink_cmds], [2],\n    [Commands necessary for finishing linking programs])\n_LT_TAGDECL([], [file_list_spec], [1],\n    [Specify filename containing input files])\ndnl FIXME: Not yet implemented\ndnl _LT_TAGDECL([], [thread_safe_flag_spec], [1],\ndnl    [Compiler flag to generate thread safe objects])\n])# _LT_LINKER_SHLIBS\n\n\n# _LT_LANG_C_CONFIG([TAG])\n# ------------------------\n# Ensure that the configuration variables for a C compiler are suitably\n# defined.  These variables are subsequently used by _LT_CONFIG to write\n# the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_C_CONFIG],\n[m4_require([_LT_DECL_EGREP])dnl\nlt_save_CC=\"$CC\"\nAC_LANG_PUSH(C)\n\n# Source file extension for C test sources.\nac_ext=c\n\n# Object file extension for compiled C test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"int some_variable = 0;\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='int main(){return(0);}'\n\n_LT_TAG_COMPILER\n# Save the default compiler, since it gets overwritten when the other\n# tags are being tested, and _LT_TAGVAR(compiler, []) is a NOP.\ncompiler_DEFAULT=$CC\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n  _LT_COMPILER_NO_RTTI($1)\n  _LT_COMPILER_PIC($1)\n  _LT_COMPILER_C_O($1)\n  _LT_COMPILER_FILE_LOCKS($1)\n  _LT_LINKER_SHLIBS($1)\n  _LT_SYS_DYNAMIC_LINKER($1)\n  _LT_LINKER_HARDCODE_LIBPATH($1)\n  LT_SYS_DLOPEN_SELF\n  _LT_CMD_STRIPLIB\n\n  # Report which library types will actually be built\n  AC_MSG_CHECKING([if libtool supports shared libraries])\n  AC_MSG_RESULT([$can_build_shared])\n\n  AC_MSG_CHECKING([whether to build shared libraries])\n  test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n  # On AIX, shared libraries and static libraries use the same namespace, and\n  # are all built from PIC.\n  case $host_os in\n  aix3*)\n    test \"$enable_shared\" = yes && enable_static=no\n    if test -n \"$RANLIB\"; then\n      archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n      postinstall_cmds='$RANLIB $lib'\n    fi\n    ;;\n\n  aix[[4-9]]*)\n    if test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n      test \"$enable_shared\" = yes && enable_static=no\n    fi\n    ;;\n  esac\n  AC_MSG_RESULT([$enable_shared])\n\n  AC_MSG_CHECKING([whether to build static libraries])\n  # Make sure either enable_shared or enable_static is yes.\n  test \"$enable_shared\" = yes || enable_static=yes\n  AC_MSG_RESULT([$enable_static])\n\n  _LT_CONFIG($1)\nfi\nAC_LANG_POP\nCC=\"$lt_save_CC\"\n])# _LT_LANG_C_CONFIG\n\n\n# _LT_LANG_CXX_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for a C++ compiler are suitably\n# defined.  These variables are subsequently used by _LT_CONFIG to write\n# the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_CXX_CONFIG],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nm4_require([_LT_DECL_EGREP])dnl\nm4_require([_LT_PATH_MANIFEST_TOOL])dnl\nif test -n \"$CXX\" && ( test \"X$CXX\" != \"Xno\" &&\n    ( (test \"X$CXX\" = \"Xg++\" && `g++ -v >/dev/null 2>&1` ) ||\n    (test \"X$CXX\" != \"Xg++\"))) ; then\n  AC_PROG_CXXCPP\nelse\n  _lt_caught_CXX_error=yes\nfi\n\nAC_LANG_PUSH(C++)\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(compiler_needs_object, $1)=no\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_shlibpath_var, $1)=unsupported\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for C++ test sources.\nac_ext=cpp\n\n# Object file extension for compiled C++ test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the CXX compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test \"$_lt_caught_CXX_error\" != yes; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"int some_variable = 0;\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code='int main(int, char *[[]]) { return(0); }'\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=$CC\n  lt_save_CFLAGS=$CFLAGS\n  lt_save_LD=$LD\n  lt_save_GCC=$GCC\n  GCC=$GXX\n  lt_save_with_gnu_ld=$with_gnu_ld\n  lt_save_path_LD=$lt_cv_path_LD\n  if test -n \"${lt_cv_prog_gnu_ldcxx+set}\"; then\n    lt_cv_prog_gnu_ld=$lt_cv_prog_gnu_ldcxx\n  else\n    $as_unset lt_cv_prog_gnu_ld\n  fi\n  if test -n \"${lt_cv_path_LDCXX+set}\"; then\n    lt_cv_path_LD=$lt_cv_path_LDCXX\n  else\n    $as_unset lt_cv_path_LD\n  fi\n  test -z \"${LDCXX+set}\" || LD=$LDCXX\n  CC=${CXX-\"c++\"}\n  CFLAGS=$CXXFLAGS\n  compiler=$CC\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n\n  if test -n \"$compiler\"; then\n    # We don't want -fno-exception when compiling C++ code, so set the\n    # no_builtin_flag separately\n    if test \"$GXX\" = yes; then\n      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=' -fno-builtin'\n    else\n      _LT_TAGVAR(lt_prog_compiler_no_builtin_flag, $1)=\n    fi\n\n    if test \"$GXX\" = yes; then\n      # Set up default GNU C++ configuration\n\n      LT_PATH_LD\n\n      # Check if GNU C++ uses GNU ld as the underlying linker, since the\n      # archiving commands below assume that GNU ld is being used.\n      if test \"$with_gnu_ld\" = yes; then\n        _LT_TAGVAR(archive_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n        _LT_TAGVAR(archive_expsym_cmds, $1)='$CC $pic_flag -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\n        # If archive_cmds runs LD, not CC, wlarc should be empty\n        # XXX I think wlarc can be eliminated in ltcf-cxx, but I need to\n        #     investigate it a little bit more. (MM)\n        wlarc='${wl}'\n\n        # ancient GNU ld didn't support --whole-archive et. al.\n        if eval \"`$CC -print-prog-name=ld` --help 2>&1\" |\n\t  $GREP 'no-whole-archive' > /dev/null; then\n          _LT_TAGVAR(whole_archive_flag_spec, $1)=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n        else\n          _LT_TAGVAR(whole_archive_flag_spec, $1)=\n        fi\n      else\n        with_gnu_ld=no\n        wlarc=\n\n        # A generic and very simple default shared library creation\n        # command for GNU C++ for the case where it uses the native\n        # linker, instead of GNU ld.  If possible, this setting should\n        # overridden to take advantage of the native linker features on\n        # the platform it is being used on.\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n      fi\n\n      # Commands to make compiler produce verbose output that lists\n      # what \"hidden\" libraries, object files and flags are used when\n      # linking a shared library.\n      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\n    else\n      GXX=no\n      with_gnu_ld=no\n      wlarc=\n    fi\n\n    # PORTME: fill in a description of your system's C++ link characteristics\n    AC_MSG_CHECKING([whether the $compiler linker ($LD) supports shared libraries])\n    _LT_TAGVAR(ld_shlibs, $1)=yes\n    case $host_os in\n      aix3*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n      aix[[4-9]]*)\n        if test \"$host_cpu\" = ia64; then\n          # On IA64, the linker does run time linking by default, so we don't\n          # have to do anything special.\n          aix_use_runtimelinking=no\n          exp_sym_flag='-Bexport'\n          no_entry_flag=\"\"\n        else\n          aix_use_runtimelinking=no\n\n          # Test if we are trying to use run time linking or normal\n          # AIX style linking. If -brtl is somewhere in LDFLAGS, we\n          # need to do runtime linking.\n          case $host_os in aix4.[[23]]|aix4.[[23]].*|aix[[5-9]]*)\n\t    for ld_flag in $LDFLAGS; do\n\t      case $ld_flag in\n\t      *-brtl*)\n\t        aix_use_runtimelinking=yes\n\t        break\n\t        ;;\n\t      esac\n\t    done\n\t    ;;\n          esac\n\n          exp_sym_flag='-bexport'\n          no_entry_flag='-bnoentry'\n        fi\n\n        # When large executables or shared objects are built, AIX ld can\n        # have problems creating the table of contents.  If linking a library\n        # or program results in \"error TOC overflow\" add -mminimal-toc to\n        # CXXFLAGS/CFLAGS for g++/gcc.  In the cases where that is not\n        # enough to fix the problem, add -Wl,-bbigtoc to LDFLAGS.\n\n        _LT_TAGVAR(archive_cmds, $1)=''\n        _LT_TAGVAR(hardcode_direct, $1)=yes\n        _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n        _LT_TAGVAR(link_all_deplibs, $1)=yes\n        _LT_TAGVAR(file_list_spec, $1)='${wl}-f,'\n\n        if test \"$GXX\" = yes; then\n          case $host_os in aix4.[[012]]|aix4.[[012]].*)\n          # We only want to do this on AIX 4.2 and lower, the check\n          # below for broken collect2 doesn't work under 4.3+\n\t  collect2name=`${CC} -print-prog-name=collect2`\n\t  if test -f \"$collect2name\" &&\n\t     strings \"$collect2name\" | $GREP resolve_lib_name >/dev/null\n\t  then\n\t    # We have reworked collect2\n\t    :\n\t  else\n\t    # We have old collect2\n\t    _LT_TAGVAR(hardcode_direct, $1)=unsupported\n\t    # It fails to find uninstalled libraries when the uninstalled\n\t    # path is not listed in the libpath.  Setting hardcode_minus_L\n\t    # to unsupported forces relinking\n\t    _LT_TAGVAR(hardcode_minus_L, $1)=yes\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=\n\t  fi\n          esac\n          shared_flag='-shared'\n\t  if test \"$aix_use_runtimelinking\" = yes; then\n\t    shared_flag=\"$shared_flag \"'${wl}-G'\n\t  fi\n        else\n          # not using gcc\n          if test \"$host_cpu\" = ia64; then\n\t  # VisualAge C++, Version 5.5 for AIX 5L for IA-64, Beta 3 Release\n\t  # chokes on -Wl,-G. The following line is correct:\n\t  shared_flag='-G'\n          else\n\t    if test \"$aix_use_runtimelinking\" = yes; then\n\t      shared_flag='${wl}-G'\n\t    else\n\t      shared_flag='${wl}-bM:SRE'\n\t    fi\n          fi\n        fi\n\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-bexpall'\n        # It seems that -bexpall does not export symbols beginning with\n        # underscore (_), so it is better to generate a list of symbols to\n\t# export.\n        _LT_TAGVAR(always_export_symbols, $1)=yes\n        if test \"$aix_use_runtimelinking\" = yes; then\n          # Warning - without using the other runtime loading flags (-brtl),\n          # -berok will link without error, but may produce a broken library.\n          _LT_TAGVAR(allow_undefined_flag, $1)='-berok'\n          # Determine the default libpath from the value encoded in an empty\n          # executable.\n          _LT_SYS_MODULE_PATH_AIX([$1])\n          _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\n          _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags `if test \"x${allow_undefined_flag}\" != \"x\"; then func_echo_all \"${wl}${allow_undefined_flag}\"; else :; fi` '\"\\${wl}$exp_sym_flag:\\$export_symbols $shared_flag\"\n        else\n          if test \"$host_cpu\" = ia64; then\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $libdir:/usr/lib:/lib'\n\t    _LT_TAGVAR(allow_undefined_flag, $1)=\"-z nodefs\"\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs '\"\\${wl}$no_entry_flag\"' $compiler_flags ${wl}${allow_undefined_flag} '\"\\${wl}$exp_sym_flag:\\$export_symbols\"\n          else\n\t    # Determine the default libpath from the value encoded in an\n\t    # empty executable.\n\t    _LT_SYS_MODULE_PATH_AIX([$1])\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-blibpath:$libdir:'\"$aix_libpath\"\n\t    # Warning - without using the other run time loading flags,\n\t    # -berok will link without error, but may produce a broken library.\n\t    _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-bernotok'\n\t    _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-berok'\n\t    if test \"$with_gnu_ld\" = yes; then\n\t      # We only use this code for GNU lds that support --whole-archive.\n\t      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'\n\t    else\n\t      # Exported symbols can be pulled into shared objects from archives\n\t      _LT_TAGVAR(whole_archive_flag_spec, $1)='$convenience'\n\t    fi\n\t    _LT_TAGVAR(archive_cmds_need_lc, $1)=yes\n\t    # This is similar to how AIX traditionally builds its shared\n\t    # libraries.\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)=\"\\$CC $shared_flag\"' -o $output_objdir/$soname $libobjs $deplibs ${wl}-bnoentry $compiler_flags ${wl}-bE:$export_symbols${allow_undefined_flag}~$AR $AR_FLAGS $output_objdir/$libname$release.a $output_objdir/$soname'\n          fi\n        fi\n        ;;\n\n      beos*)\n\tif $LD --help 2>&1 | $GREP ': supported targets:.* elf' > /dev/null; then\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t  # Joseph Beckenbach <jrb3@best.com> says some releases of gcc\n\t  # support --undefined.  This deserves some investigation.  FIXME\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -nostart $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\telse\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\tfi\n\t;;\n\n      chorus*)\n        case $cc_basename in\n          *)\n\t  # FIXME: insert proper C++ library support\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\t  ;;\n        esac\n        ;;\n\n      cygwin* | mingw* | pw32* | cegcc*)\n\tcase $GXX,$cc_basename in\n\t,cl* | no,cl*)\n\t  # Native MSVC\n\t  # hardcode_libdir_flag_spec is actually meaningless, as there is\n\t  # no search path for DLLs.\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)=' '\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t  _LT_TAGVAR(always_export_symbols, $1)=yes\n\t  _LT_TAGVAR(file_list_spec, $1)='@'\n\t  # Tell ltmain to make .lib files, not .a files.\n\t  libext=lib\n\t  # Tell ltmain to make .dll files, not .so files.\n\t  shrext_cmds=\".dll\"\n\t  # FIXME: Setting linknames here is a bad hack.\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -o $output_objdir/$soname $libobjs $compiler_flags $deplibs -Wl,-dll~linknames='\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t      $SED -n -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' -e '1\\\\\\!p' < $export_symbols > $output_objdir/$soname.exp;\n\t    else\n\t      $SED -e 's/\\\\\\\\\\\\\\(.*\\\\\\\\\\\\\\)/-link\\\\\\ -EXPORT:\\\\\\\\\\\\\\1/' < $export_symbols > $output_objdir/$soname.exp;\n\t    fi~\n\t    $CC -o $tool_output_objdir$soname $libobjs $compiler_flags $deplibs \"@$tool_output_objdir$soname.exp\" -Wl,-DLL,-IMPLIB:\"$tool_output_objdir$libname.dll.lib\"~\n\t    linknames='\n\t  # The linker will not automatically build a static lib if we build a DLL.\n\t  # _LT_TAGVAR(old_archive_from_new_cmds, $1)='true'\n\t  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\t  # Don't use ranlib\n\t  _LT_TAGVAR(old_postinstall_cmds, $1)='chmod 644 $oldlib'\n\t  _LT_TAGVAR(postlink_cmds, $1)='lt_outputfile=\"@OUTPUT@\"~\n\t    lt_tool_outputfile=\"@TOOL_OUTPUT@\"~\n\t    case $lt_outputfile in\n\t      *.exe|*.EXE) ;;\n\t      *)\n\t\tlt_outputfile=\"$lt_outputfile.exe\"\n\t\tlt_tool_outputfile=\"$lt_tool_outputfile.exe\"\n\t\t;;\n\t    esac~\n\t    func_to_tool_file \"$lt_outputfile\"~\n\t    if test \"$MANIFEST_TOOL\" != \":\" && test -f \"$lt_outputfile.manifest\"; then\n\t      $MANIFEST_TOOL -manifest \"$lt_tool_outputfile.manifest\" -outputresource:\"$lt_tool_outputfile\" || exit 1;\n\t      $RM \"$lt_outputfile.manifest\";\n\t    fi'\n\t  ;;\n\t*)\n\t  # g++\n\t  # _LT_TAGVAR(hardcode_libdir_flag_spec, $1) is actually meaningless,\n\t  # as there is no search path for DLLs.\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-L$libdir'\n\t  _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-all-symbols'\n\t  _LT_TAGVAR(allow_undefined_flag, $1)=unsupported\n\t  _LT_TAGVAR(always_export_symbols, $1)=no\n\t  _LT_TAGVAR(enable_shared_with_static_runtimes, $1)=yes\n\n\t  if $LD --help 2>&1 | $GREP 'auto-import' > /dev/null; then\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t    # If the export-symbols file already is a .def file (1st line\n\t    # is EXPORTS), use it as is; otherwise, prepend...\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='if test \"x`$SED 1q $export_symbols`\" = xEXPORTS; then\n\t      cp $export_symbols $output_objdir/$soname.def;\n\t    else\n\t      echo EXPORTS > $output_objdir/$soname.def;\n\t      cat $export_symbols >> $output_objdir/$soname.def;\n\t    fi~\n\t    $CC -shared -nostdlib $output_objdir/$soname.def $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $output_objdir/$soname ${wl}--enable-auto-image-base -Xlinker --out-implib -Xlinker $lib'\n\t  else\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t  fi\n\t  ;;\n\tesac\n\t;;\n      darwin* | rhapsody*)\n        _LT_DARWIN_LINKER_FEATURES($1)\n\t;;\n\n      dgux*)\n        case $cc_basename in\n          ec++*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          ghcx*)\n\t    # Green Hills C++ Compiler\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      freebsd2.*)\n        # C++ shared libraries reported to be fairly broken before\n\t# switch to ELF\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      freebsd-elf*)\n        _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n        ;;\n\n      freebsd* | dragonfly*)\n        # FreeBSD 3 and later use GNU C++ and GNU ld with standard ELF\n        # conventions\n        _LT_TAGVAR(ld_shlibs, $1)=yes\n        ;;\n\n      haiku*)\n        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n        _LT_TAGVAR(link_all_deplibs, $1)=yes\n        ;;\n\n      hpux9*)\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n        _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n        _LT_TAGVAR(hardcode_direct, $1)=yes\n        _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,\n\t\t\t\t             # but as the default\n\t\t\t\t             # location of the library.\n\n        case $cc_basename in\n          CC*)\n            # FIXME: insert proper C++ library support\n            _LT_TAGVAR(ld_shlibs, $1)=no\n            ;;\n          aCC*)\n            _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -b ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n            # Commands to make compiler produce verbose output that lists\n            # what \"hidden\" libraries, object files and flags are used when\n            # linking a shared library.\n            #\n            # There doesn't appear to be a way to prevent this compiler from\n            # explicitly linking system object files so we need to strip them\n            # from the output so that they don't get included in the library\n            # dependencies.\n            output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $EGREP \"\\-L\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n            ;;\n          *)\n            if test \"$GXX\" = yes; then\n              _LT_TAGVAR(archive_cmds, $1)='$RM $output_objdir/$soname~$CC -shared -nostdlib $pic_flag ${wl}+b ${wl}$install_libdir -o $output_objdir/$soname $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~test $output_objdir/$soname = $lib || mv $output_objdir/$soname $lib'\n            else\n              # FIXME: insert proper C++ library support\n              _LT_TAGVAR(ld_shlibs, $1)=no\n            fi\n            ;;\n        esac\n        ;;\n\n      hpux10*|hpux11*)\n        if test $with_gnu_ld = no; then\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}+b ${wl}$libdir'\n\t  _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n          case $host_cpu in\n            hppa*64*|ia64*)\n              ;;\n            *)\n\t      _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n              ;;\n          esac\n        fi\n        case $host_cpu in\n          hppa*64*|ia64*)\n            _LT_TAGVAR(hardcode_direct, $1)=no\n            _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n            ;;\n          *)\n            _LT_TAGVAR(hardcode_direct, $1)=yes\n            _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n            _LT_TAGVAR(hardcode_minus_L, $1)=yes # Not in the search PATH,\n\t\t\t\t\t         # but as the default\n\t\t\t\t\t         # location of the library.\n            ;;\n        esac\n\n        case $cc_basename in\n          CC*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          aCC*)\n\t    case $host_cpu in\n\t      hppa*64*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      ia64*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t      *)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -b ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t        ;;\n\t    esac\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`($CC -b $CFLAGS -v conftest.$objext 2>&1) | $GREP \"\\-L\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\t    ;;\n          *)\n\t    if test \"$GXX\" = yes; then\n\t      if test $with_gnu_ld = no; then\n\t        case $host_cpu in\n\t          hppa*64*)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib -fPIC ${wl}+h ${wl}$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          ia64*)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+nodefaultrpath -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t          *)\n\t            _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib $pic_flag ${wl}+h ${wl}$soname ${wl}+b ${wl}$install_libdir -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t            ;;\n\t        esac\n\t      fi\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      _LT_TAGVAR(ld_shlibs, $1)=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      interix[[3-9]]*)\n\t_LT_TAGVAR(hardcode_direct, $1)=no\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\t# Hack: On Interix 3.x, we cannot compile PIC because of a broken gcc.\n\t# Instead, shared libraries are loaded at an image base (0x10000000 by\n\t# default) and relocated if they conflict, which is a slow very memory\n\t# consuming and fragmenting process.  To avoid this, we pick a random,\n\t# 256 KiB-aligned image base between 0x50000000 and 0x6FFC0000 at link\n\t# time.  Moving up from 0x10000000 also allows more sbrk(2) space.\n\t_LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\t_LT_TAGVAR(archive_expsym_cmds, $1)='sed \"s,^,_,\" $export_symbols >$output_objdir/$soname.expsym~$CC -shared $pic_flag $libobjs $deplibs $compiler_flags ${wl}-h,$soname ${wl}--retain-symbols-file,$output_objdir/$soname.expsym ${wl}--image-base,`expr ${RANDOM-$$} % 4096 / 2 \\* 262144 + 1342177280` -o $lib'\n\t;;\n      irix5* | irix6*)\n        case $cc_basename in\n          CC*)\n\t    # SGI C++\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared -all -multigot $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -ar\", where \"CC\" is the IRIX C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -ar -WR,-u -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    if test \"$GXX\" = yes; then\n\t      if test \"$with_gnu_ld\" = no; then\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t      else\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` -o $lib'\n\t      fi\n\t    fi\n\t    _LT_TAGVAR(link_all_deplibs, $1)=yes\n\t    ;;\n        esac\n        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n        _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n        _LT_TAGVAR(inherit_rpath, $1)=yes\n        ;;\n\n      linux* | k*bsd*-gnu | kopensolaris*-gnu | gnu*)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo $lib | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib ${wl}-retain-symbols-file,$export_symbols; mv \\$templib $lib'\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1 | $GREP \"ld\"`; rm -f libconftest$shared_ext; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -Bstatic\", where \"CC\" is the KAI C++ compiler.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs'\n\t    ;;\n\t  icpc* | ecpc* )\n\t    # Intel C++\n\t    with_gnu_ld=yes\n\t    # version 8.0 and above of icpc choke on multiply defined symbols\n\t    # if we add $predep_objects and $postdep_objects, however 7.1 and\n\t    # earlier do not add the objects themselves.\n\t    case `$CC -V 2>&1` in\n\t      *\"Version 7.\"*)\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t      *)  # Version 8.0 or newer\n\t        tmp_idyn=\n\t        case $host_cpu in\n\t\t  ia64*) tmp_idyn=' -i_dynamic';;\n\t\tesac\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t\t_LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared'\"$tmp_idyn\"' $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-retain-symbols-file $wl$export_symbols -o $lib'\n\t\t;;\n\t    esac\n\t    _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive$convenience ${wl}--no-whole-archive'\n\t    ;;\n          pgCC* | pgcpp*)\n            # Portland Group C++ compiler\n\t    case `$CC -V` in\n\t    *pgCC\\ [[1-5]].* | *pgcpp\\ [[1-5]].*)\n\t      _LT_TAGVAR(prelink_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $objs $libobjs $compile_deplibs~\n\t\tcompile_command=\"$compile_command `find $tpldir -name \\*.o | sort | $NL2SP`\"'\n\t      _LT_TAGVAR(old_archive_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $oldobjs$old_deplibs~\n\t\t$AR $AR_FLAGS $oldlib$oldobjs$old_deplibs `find $tpldir -name \\*.o | sort | $NL2SP`~\n\t\t$RANLIB $oldlib'\n\t      _LT_TAGVAR(archive_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n\t\t$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='tpldir=Template.dir~\n\t\trm -rf $tpldir~\n\t\t$CC --prelink_objects --instantiation_dir $tpldir $predep_objects $libobjs $deplibs $convenience $postdep_objects~\n\t\t$CC -shared $pic_flag $predep_objects $libobjs $deplibs `find $tpldir -name \\*.o | sort | $NL2SP` $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'\n\t      ;;\n\t    *) # Version 6 and above use weak symbols\n\t      _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname -o $lib'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname ${wl}-retain-symbols-file ${wl}$export_symbols -o $lib'\n\t      ;;\n\t    esac\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}--rpath ${wl}$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`for conv in $convenience\\\"\\\"; do test  -n \\\"$conv\\\" && new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n            ;;\n\t  cxx*)\n\t    # Compaq C++\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $wl$soname  -o $lib ${wl}-retain-symbols-file $wl$export_symbols'\n\n\t    runpath_var=LD_RUN_PATH\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\"`; templist=`func_echo_all \"$templist\" | $SED \"s/\\(^.*ld.*\\)\\( .*ld .*$\\)/\\1/\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"X$list\" | $Xsed'\n\t    ;;\n\t  xl* | mpixl* | bgxl*)\n\t    # IBM XL 8.0 on PPC, with GNU ld\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}--export-dynamic'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname -o $lib'\n\t    if test \"x$supports_anon_versioning\" = xyes; then\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $output_objdir/$libname.ver~\n\t\tcat $export_symbols | sed -e \"s/\\(.*\\)/\\1;/\" >> $output_objdir/$libname.ver~\n\t\techo \"local: *; };\" >> $output_objdir/$libname.ver~\n\t\t$CC -qmkshrobj $libobjs $deplibs $compiler_flags ${wl}-soname $wl$soname ${wl}-version-script ${wl}$output_objdir/$libname.ver -o $lib'\n\t    fi\n\t    ;;\n\t  *)\n\t    case `$CC -V 2>&1 | sed 5q` in\n\t    *Sun\\ C*)\n\t      # Sun C++ 5.9\n\t      _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'\n\t      _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t      _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G${allow_undefined_flag} -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file ${wl}$export_symbols'\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t      _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}--whole-archive`new_convenience=; for conv in $convenience\\\"\\\"; do test -z \\\"$conv\\\" || new_convenience=\\\"$new_convenience,$conv\\\"; done; func_echo_all \\\"$new_convenience\\\"` ${wl}--no-whole-archive'\n\t      _LT_TAGVAR(compiler_needs_object, $1)=yes\n\n\t      # Not sure whether something based on\n\t      # $CC $CFLAGS -v conftest.$objext -o libconftest$shared_ext 2>&1\n\t      # would be better.\n\t      output_verbose_link_cmd='func_echo_all'\n\n\t      # Archives containing C++ object files must be created using\n\t      # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t      # necessary to make sure instantiated templates are included\n\t      # in the archive.\n\t      _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'\n\t      ;;\n\t    esac\n\t    ;;\n\tesac\n\t;;\n\n      lynxos*)\n        # FIXME: insert proper C++ library support\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\t;;\n\n      m88k*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n\t;;\n\n      mvs*)\n        case $cc_basename in\n          cxx*)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n\t  *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n\tesac\n\t;;\n\n      netbsd*)\n        if echo __ELF__ | $CC -E - | $GREP __ELF__ >/dev/null; then\n\t  _LT_TAGVAR(archive_cmds, $1)='$LD -Bshareable  -o $lib $predep_objects $libobjs $deplibs $postdep_objects $linker_flags'\n\t  wlarc=\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\tfi\n\t# Workaround some broken pre-1.5 toolchains\n\toutput_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP conftest.$objext | $SED -e \"s:-lgcc -lc -lgcc::\"'\n\t;;\n\n      *nto* | *qnx*)\n        _LT_TAGVAR(ld_shlibs, $1)=yes\n\t;;\n\n      openbsd2*)\n        # C++ shared libraries are fairly broken\n\t_LT_TAGVAR(ld_shlibs, $1)=no\n\t;;\n\n      openbsd*)\n\tif test -f /usr/libexec/ld.so; then\n\t  _LT_TAGVAR(hardcode_direct, $1)=yes\n\t  _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t  _LT_TAGVAR(hardcode_direct_absolute, $1)=yes\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -o $lib'\n\t  _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t  if test -z \"`echo __ELF__ | $CC -E - | grep __ELF__`\" || test \"$host_os-$host_cpu\" = \"openbsd2.8-powerpc\"; then\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared $pic_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-retain-symbols-file,$export_symbols -o $lib'\n\t    _LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-E'\n\t    _LT_TAGVAR(whole_archive_flag_spec, $1)=\"$wlarc\"'--whole-archive$convenience '\"$wlarc\"'--no-whole-archive'\n\t  fi\n\t  output_verbose_link_cmd=func_echo_all\n\telse\n\t  _LT_TAGVAR(ld_shlibs, $1)=no\n\tfi\n\t;;\n\n      osf3* | osf4* | osf5*)\n        case $cc_basename in\n          KCC*)\n\t    # Kuck and Associates, Inc. (KAI) C++ Compiler\n\n\t    # KCC will only create a shared library if the output file\n\t    # ends with \".so\" (or \".sl\" for HP-UX), so rename the library\n\t    # to its proper name (with version) after linking.\n\t    _LT_TAGVAR(archive_cmds, $1)='tempext=`echo $shared_ext | $SED -e '\\''s/\\([[^()0-9A-Za-z{}]]\\)/\\\\\\\\\\1/g'\\''`; templib=`echo \"$lib\" | $SED -e \"s/\\${tempext}\\..*/.so/\"`; $CC $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags --soname $soname -o \\$templib; mv \\$templib $lib'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath,$libdir'\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Archives containing C++ object files must be created using\n\t    # the KAI C++ compiler.\n\t    case $host in\n\t      osf3*) _LT_TAGVAR(old_archive_cmds, $1)='$CC -Bstatic -o $oldlib $oldobjs' ;;\n\t      *) _LT_TAGVAR(old_archive_cmds, $1)='$CC -o $oldlib $oldobjs' ;;\n\t    esac\n\t    ;;\n          RCC*)\n\t    # Rational C++ 2.4.1\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          cxx*)\n\t    case $host in\n\t      osf3*)\n\t        _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname $soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\t        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t\t;;\n\t      *)\n\t        _LT_TAGVAR(allow_undefined_flag, $1)=' -expect_unresolved \\*'\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname `test -n \"$verstring\" && func_echo_all \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='for i in `cat $export_symbols`; do printf \"%s %s\\\\n\" -exported_symbol \"\\$i\" >> $lib.exp; done~\n\t          echo \"-hidden\">> $lib.exp~\n\t          $CC -shared$allow_undefined_flag $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags -msym -soname $soname ${wl}-input ${wl}$lib.exp  `test -n \"$verstring\" && $ECHO \"-set_version $verstring\"` -update_registry ${output_objdir}/so_locations -o $lib~\n\t          $RM $lib.exp'\n\t        _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-rpath $libdir'\n\t\t;;\n\t    esac\n\n\t    _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t    # Commands to make compiler produce verbose output that lists\n\t    # what \"hidden\" libraries, object files and flags are used when\n\t    # linking a shared library.\n\t    #\n\t    # There doesn't appear to be a way to prevent this compiler from\n\t    # explicitly linking system object files so we need to strip them\n\t    # from the output so that they don't get included in the library\n\t    # dependencies.\n\t    output_verbose_link_cmd='templist=`$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP \"ld\" | $GREP -v \"ld:\"`; templist=`func_echo_all \"$templist\" | $SED \"s/\\(^.*ld.*\\)\\( .*ld.*$\\)/\\1/\"`; list=\"\"; for z in $templist; do case $z in conftest.$objext) list=\"$list $z\";; *.$objext);; *) list=\"$list $z\";;esac; done; func_echo_all \"$list\"'\n\t    ;;\n\t  *)\n\t    if test \"$GXX\" = yes && test \"$with_gnu_ld\" = no; then\n\t      _LT_TAGVAR(allow_undefined_flag, $1)=' ${wl}-expect_unresolved ${wl}\\*'\n\t      case $host in\n\t        osf3*)\n\t          _LT_TAGVAR(archive_cmds, $1)='$CC -shared -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t\t  ;;\n\t        *)\n\t          _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib ${allow_undefined_flag} $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-msym ${wl}-soname ${wl}$soname `test -n \"$verstring\" && func_echo_all \"${wl}-set_version ${wl}$verstring\"` ${wl}-update_registry ${wl}${output_objdir}/so_locations -o $lib'\n\t\t  ;;\n\t      esac\n\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-rpath ${wl}$libdir'\n\t      _LT_TAGVAR(hardcode_libdir_separator, $1)=:\n\n\t      # Commands to make compiler produce verbose output that lists\n\t      # what \"hidden\" libraries, object files and flags are used when\n\t      # linking a shared library.\n\t      output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\n\t    else\n\t      # FIXME: insert proper C++ library support\n\t      _LT_TAGVAR(ld_shlibs, $1)=no\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n      psos*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      sunos4*)\n        case $cc_basename in\n          CC*)\n\t    # Sun C++ 4.x\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          lcc*)\n\t    # Lucid\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      solaris*)\n        case $cc_basename in\n          CC* | sunCC*)\n\t    # Sun C++ 4.2, 5.x and Centerline C++\n            _LT_TAGVAR(archive_cmds_need_lc,$1)=yes\n\t    _LT_TAGVAR(no_undefined_flag, $1)=' -zdefs'\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -G${allow_undefined_flag}  -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t      $CC -G${allow_undefined_flag} ${wl}-M ${wl}$lib.exp -h$soname -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t    _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='-R$libdir'\n\t    _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t    case $host_os in\n\t      solaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n\t      *)\n\t\t# The compiler driver will combine and reorder linker options,\n\t\t# but understands `-z linker_flag'.\n\t        # Supported since Solaris 2.6 (maybe 2.5.1?)\n\t\t_LT_TAGVAR(whole_archive_flag_spec, $1)='-z allextract$convenience -z defaultextract'\n\t        ;;\n\t    esac\n\t    _LT_TAGVAR(link_all_deplibs, $1)=yes\n\n\t    output_verbose_link_cmd='func_echo_all'\n\n\t    # Archives containing C++ object files must be created using\n\t    # \"CC -xar\", where \"CC\" is the Sun C++ compiler.  This is\n\t    # necessary to make sure instantiated templates are included\n\t    # in the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -xar -o $oldlib $oldobjs'\n\t    ;;\n          gcx*)\n\t    # Green Hills C++ Compiler\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\n\t    # The C++ compiler must be used to create the archive.\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC $LDFLAGS -archive -o $oldlib $oldobjs'\n\t    ;;\n          *)\n\t    # GNU C++ compiler with Solaris linker\n\t    if test \"$GXX\" = yes && test \"$with_gnu_ld\" = no; then\n\t      _LT_TAGVAR(no_undefined_flag, $1)=' ${wl}-z ${wl}defs'\n\t      if $CC --version | $GREP -v '^2\\.7' > /dev/null; then\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -shared $pic_flag -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t\t  $CC -shared $pic_flag -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -shared $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\t      else\n\t        # g++ 2.7 appears to require `-G' NOT `-shared' on this\n\t        # platform.\n\t        _LT_TAGVAR(archive_cmds, $1)='$CC -G -nostdlib $LDFLAGS $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags ${wl}-h $wl$soname -o $lib'\n\t        _LT_TAGVAR(archive_expsym_cmds, $1)='echo \"{ global:\" > $lib.exp~cat $export_symbols | $SED -e \"s/\\(.*\\)/\\1;/\" >> $lib.exp~echo \"local: *; };\" >> $lib.exp~\n\t\t  $CC -G -nostdlib ${wl}-M $wl$lib.exp -o $lib $predep_objects $libobjs $deplibs $postdep_objects $compiler_flags~$RM $lib.exp'\n\n\t        # Commands to make compiler produce verbose output that lists\n\t        # what \"hidden\" libraries, object files and flags are used when\n\t        # linking a shared library.\n\t        output_verbose_link_cmd='$CC -G $CFLAGS -v conftest.$objext 2>&1 | $GREP -v \"^Configured with:\" | $GREP \"\\-L\"'\n\t      fi\n\n\t      _LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R $wl$libdir'\n\t      case $host_os in\n\t\tsolaris2.[[0-5]] | solaris2.[[0-5]].*) ;;\n\t\t*)\n\t\t  _LT_TAGVAR(whole_archive_flag_spec, $1)='${wl}-z ${wl}allextract$convenience ${wl}-z ${wl}defaultextract'\n\t\t  ;;\n\t      esac\n\t    fi\n\t    ;;\n        esac\n        ;;\n\n    sysv4*uw2* | sysv5OpenUNIX* | sysv5UnixWare7.[[01]].[[10]]* | unixware7* | sco3.2v5.0.[[024]]*)\n      _LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n      _LT_TAGVAR(archive_cmds_need_lc, $1)=no\n      _LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n      runpath_var='LD_RUN_PATH'\n\n      case $cc_basename in\n        CC*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n\t*)\n\t  _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t  ;;\n      esac\n      ;;\n\n      sysv5* | sco3.2v5* | sco5v6*)\n\t# Note: We can NOT use -z defs as we might desire, because we do not\n\t# link with -lc, and that would cause any symbols used from libc to\n\t# always be unresolved, which means just about no library would\n\t# ever link correctly.  If we're not using GNU ld we use -z text\n\t# though, which does catch some bad symbols but isn't as heavy-handed\n\t# as -z defs.\n\t_LT_TAGVAR(no_undefined_flag, $1)='${wl}-z,text'\n\t_LT_TAGVAR(allow_undefined_flag, $1)='${wl}-z,nodefs'\n\t_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\t_LT_TAGVAR(hardcode_shlibpath_var, $1)=no\n\t_LT_TAGVAR(hardcode_libdir_flag_spec, $1)='${wl}-R,$libdir'\n\t_LT_TAGVAR(hardcode_libdir_separator, $1)=':'\n\t_LT_TAGVAR(link_all_deplibs, $1)=yes\n\t_LT_TAGVAR(export_dynamic_flag_spec, $1)='${wl}-Bexport'\n\trunpath_var='LD_RUN_PATH'\n\n\tcase $cc_basename in\n          CC*)\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -G ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -G ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    _LT_TAGVAR(old_archive_cmds, $1)='$CC -Tprelink_objects $oldobjs~\n\t      '\"$_LT_TAGVAR(old_archive_cmds, $1)\"\n\t    _LT_TAGVAR(reload_cmds, $1)='$CC -Tprelink_objects $reload_objs~\n\t      '\"$_LT_TAGVAR(reload_cmds, $1)\"\n\t    ;;\n\t  *)\n\t    _LT_TAGVAR(archive_cmds, $1)='$CC -shared ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    _LT_TAGVAR(archive_expsym_cmds, $1)='$CC -shared ${wl}-Bexport:$export_symbols ${wl}-h,$soname -o $lib $libobjs $deplibs $compiler_flags'\n\t    ;;\n\tesac\n      ;;\n\n      tandem*)\n        case $cc_basename in\n          NCC*)\n\t    # NonStop-UX NCC 3.20\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n          *)\n\t    # FIXME: insert proper C++ library support\n\t    _LT_TAGVAR(ld_shlibs, $1)=no\n\t    ;;\n        esac\n        ;;\n\n      vxworks*)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n\n      *)\n        # FIXME: insert proper C++ library support\n        _LT_TAGVAR(ld_shlibs, $1)=no\n        ;;\n    esac\n\n    AC_MSG_RESULT([$_LT_TAGVAR(ld_shlibs, $1)])\n    test \"$_LT_TAGVAR(ld_shlibs, $1)\" = no && can_build_shared=no\n\n    _LT_TAGVAR(GCC, $1)=\"$GXX\"\n    _LT_TAGVAR(LD, $1)=\"$LD\"\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_SYS_HIDDEN_LIBDEPS($1)\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  CC=$lt_save_CC\n  CFLAGS=$lt_save_CFLAGS\n  LDCXX=$LD\n  LD=$lt_save_LD\n  GCC=$lt_save_GCC\n  with_gnu_ld=$lt_save_with_gnu_ld\n  lt_cv_path_LDCXX=$lt_cv_path_LD\n  lt_cv_path_LD=$lt_save_path_LD\n  lt_cv_prog_gnu_ldcxx=$lt_cv_prog_gnu_ld\n  lt_cv_prog_gnu_ld=$lt_save_with_gnu_ld\nfi # test \"$_lt_caught_CXX_error\" != yes\n\nAC_LANG_POP\n])# _LT_LANG_CXX_CONFIG\n\n\n# _LT_FUNC_STRIPNAME_CNF\n# ----------------------\n# func_stripname_cnf prefix suffix name\n# strip PREFIX and SUFFIX off of NAME.\n# PREFIX and SUFFIX must not contain globbing or regex special\n# characters, hashes, percent signs, but SUFFIX may contain a leading\n# dot (in which case that matches only a dot).\n#\n# This function is identical to the (non-XSI) version of func_stripname,\n# except this one can be used by m4 code that may be executed by configure,\n# rather than the libtool script.\nm4_defun([_LT_FUNC_STRIPNAME_CNF],[dnl\nAC_REQUIRE([_LT_DECL_SED])\nAC_REQUIRE([_LT_PROG_ECHO_BACKSLASH])\nfunc_stripname_cnf ()\n{\n  case ${2} in\n  .*) func_stripname_result=`$ECHO \"${3}\" | $SED \"s%^${1}%%; s%\\\\\\\\${2}\\$%%\"`;;\n  *)  func_stripname_result=`$ECHO \"${3}\" | $SED \"s%^${1}%%; s%${2}\\$%%\"`;;\n  esac\n} # func_stripname_cnf\n])# _LT_FUNC_STRIPNAME_CNF\n\n# _LT_SYS_HIDDEN_LIBDEPS([TAGNAME])\n# ---------------------------------\n# Figure out \"hidden\" library dependencies from verbose\n# compiler output when linking a shared library.\n# Parse the compiler output and extract the necessary\n# objects, libraries and library flags.\nm4_defun([_LT_SYS_HIDDEN_LIBDEPS],\n[m4_require([_LT_FILEUTILS_DEFAULTS])dnl\nAC_REQUIRE([_LT_FUNC_STRIPNAME_CNF])dnl\n# Dependencies to place before and after the object being linked:\n_LT_TAGVAR(predep_objects, $1)=\n_LT_TAGVAR(postdep_objects, $1)=\n_LT_TAGVAR(predeps, $1)=\n_LT_TAGVAR(postdeps, $1)=\n_LT_TAGVAR(compiler_lib_search_path, $1)=\n\ndnl we can't use the lt_simple_compile_test_code here,\ndnl because it contains code intended for an executable,\ndnl not a library.  It's possible we should let each\ndnl tag define a new lt_????_link_test_code variable,\ndnl but it's only used here...\nm4_if([$1], [], [cat > conftest.$ac_ext <<_LT_EOF\nint a;\nvoid foo (void) { a = 0; }\n_LT_EOF\n], [$1], [CXX], [cat > conftest.$ac_ext <<_LT_EOF\nclass Foo\n{\npublic:\n  Foo (void) { a = 0; }\nprivate:\n  int a;\n};\n_LT_EOF\n], [$1], [F77], [cat > conftest.$ac_ext <<_LT_EOF\n      subroutine foo\n      implicit none\n      integer*4 a\n      a=0\n      return\n      end\n_LT_EOF\n], [$1], [FC], [cat > conftest.$ac_ext <<_LT_EOF\n      subroutine foo\n      implicit none\n      integer a\n      a=0\n      return\n      end\n_LT_EOF\n], [$1], [GCJ], [cat > conftest.$ac_ext <<_LT_EOF\npublic class foo {\n  private int a;\n  public void bar (void) {\n    a = 0;\n  }\n};\n_LT_EOF\n], [$1], [GO], [cat > conftest.$ac_ext <<_LT_EOF\npackage foo\nfunc foo() {\n}\n_LT_EOF\n])\n\n_lt_libdeps_save_CFLAGS=$CFLAGS\ncase \"$CC $CFLAGS \" in #(\n*\\ -flto*\\ *) CFLAGS=\"$CFLAGS -fno-lto\" ;;\n*\\ -fwhopr*\\ *) CFLAGS=\"$CFLAGS -fno-whopr\" ;;\n*\\ -fuse-linker-plugin*\\ *) CFLAGS=\"$CFLAGS -fno-use-linker-plugin\" ;;\nesac\n\ndnl Parse the compiler output and extract the necessary\ndnl objects, libraries and library flags.\nif AC_TRY_EVAL(ac_compile); then\n  # Parse the compiler output and extract the necessary\n  # objects, libraries and library flags.\n\n  # Sentinel used to keep track of whether or not we are before\n  # the conftest object file.\n  pre_test_object_deps_done=no\n\n  for p in `eval \"$output_verbose_link_cmd\"`; do\n    case ${prev}${p} in\n\n    -L* | -R* | -l*)\n       # Some compilers place space between \"-{L,R}\" and the path.\n       # Remove the space.\n       if test $p = \"-L\" ||\n          test $p = \"-R\"; then\n\t prev=$p\n\t continue\n       fi\n\n       # Expand the sysroot to ease extracting the directories later.\n       if test -z \"$prev\"; then\n         case $p in\n         -L*) func_stripname_cnf '-L' '' \"$p\"; prev=-L; p=$func_stripname_result ;;\n         -R*) func_stripname_cnf '-R' '' \"$p\"; prev=-R; p=$func_stripname_result ;;\n         -l*) func_stripname_cnf '-l' '' \"$p\"; prev=-l; p=$func_stripname_result ;;\n         esac\n       fi\n       case $p in\n       =*) func_stripname_cnf '=' '' \"$p\"; p=$lt_sysroot$func_stripname_result ;;\n       esac\n       if test \"$pre_test_object_deps_done\" = no; then\n\t case ${prev} in\n\t -L | -R)\n\t   # Internal compiler library paths should come after those\n\t   # provided the user.  The postdeps already come after the\n\t   # user supplied libs so there is no need to process them.\n\t   if test -z \"$_LT_TAGVAR(compiler_lib_search_path, $1)\"; then\n\t     _LT_TAGVAR(compiler_lib_search_path, $1)=\"${prev}${p}\"\n\t   else\n\t     _LT_TAGVAR(compiler_lib_search_path, $1)=\"${_LT_TAGVAR(compiler_lib_search_path, $1)} ${prev}${p}\"\n\t   fi\n\t   ;;\n\t # The \"-l\" case would never come before the object being\n\t # linked, so don't bother handling this case.\n\t esac\n       else\n\t if test -z \"$_LT_TAGVAR(postdeps, $1)\"; then\n\t   _LT_TAGVAR(postdeps, $1)=\"${prev}${p}\"\n\t else\n\t   _LT_TAGVAR(postdeps, $1)=\"${_LT_TAGVAR(postdeps, $1)} ${prev}${p}\"\n\t fi\n       fi\n       prev=\n       ;;\n\n    *.lto.$objext) ;; # Ignore GCC LTO objects\n    *.$objext)\n       # This assumes that the test object file only shows up\n       # once in the compiler output.\n       if test \"$p\" = \"conftest.$objext\"; then\n\t pre_test_object_deps_done=yes\n\t continue\n       fi\n\n       if test \"$pre_test_object_deps_done\" = no; then\n\t if test -z \"$_LT_TAGVAR(predep_objects, $1)\"; then\n\t   _LT_TAGVAR(predep_objects, $1)=\"$p\"\n\t else\n\t   _LT_TAGVAR(predep_objects, $1)=\"$_LT_TAGVAR(predep_objects, $1) $p\"\n\t fi\n       else\n\t if test -z \"$_LT_TAGVAR(postdep_objects, $1)\"; then\n\t   _LT_TAGVAR(postdep_objects, $1)=\"$p\"\n\t else\n\t   _LT_TAGVAR(postdep_objects, $1)=\"$_LT_TAGVAR(postdep_objects, $1) $p\"\n\t fi\n       fi\n       ;;\n\n    *) ;; # Ignore the rest.\n\n    esac\n  done\n\n  # Clean up.\n  rm -f a.out a.exe\nelse\n  echo \"libtool.m4: error: problem compiling $1 test program\"\nfi\n\n$RM -f confest.$objext\nCFLAGS=$_lt_libdeps_save_CFLAGS\n\n# PORTME: override above test on systems where it is broken\nm4_if([$1], [CXX],\n[case $host_os in\ninterix[[3-9]]*)\n  # Interix 3.5 installs completely hosed .la files for C++, so rather than\n  # hack all around it, let's just trust \"g++\" to DTRT.\n  _LT_TAGVAR(predep_objects,$1)=\n  _LT_TAGVAR(postdep_objects,$1)=\n  _LT_TAGVAR(postdeps,$1)=\n  ;;\n\nlinux*)\n  case `$CC -V 2>&1 | sed 5q` in\n  *Sun\\ C*)\n    # Sun C++ 5.9\n\n    # The more standards-conforming stlport4 library is\n    # incompatible with the Cstd library. Avoid specifying\n    # it if it's in CXXFLAGS. Ignore libCrun as\n    # -library=stlport4 depends on it.\n    case \" $CXX $CXXFLAGS \" in\n    *\" -library=stlport4 \"*)\n      solaris_use_stlport4=yes\n      ;;\n    esac\n\n    if test \"$solaris_use_stlport4\" != yes; then\n      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'\n    fi\n    ;;\n  esac\n  ;;\n\nsolaris*)\n  case $cc_basename in\n  CC* | sunCC*)\n    # The more standards-conforming stlport4 library is\n    # incompatible with the Cstd library. Avoid specifying\n    # it if it's in CXXFLAGS. Ignore libCrun as\n    # -library=stlport4 depends on it.\n    case \" $CXX $CXXFLAGS \" in\n    *\" -library=stlport4 \"*)\n      solaris_use_stlport4=yes\n      ;;\n    esac\n\n    # Adding this requires a known-good setup of shared libraries for\n    # Sun compiler versions before 5.6, else PIC objects from an old\n    # archive will be linked into the output, leading to subtle bugs.\n    if test \"$solaris_use_stlport4\" != yes; then\n      _LT_TAGVAR(postdeps,$1)='-library=Cstd -library=Crun'\n    fi\n    ;;\n  esac\n  ;;\nesac\n])\n\ncase \" $_LT_TAGVAR(postdeps, $1) \" in\n*\" -lc \"*) _LT_TAGVAR(archive_cmds_need_lc, $1)=no ;;\nesac\n _LT_TAGVAR(compiler_lib_search_dirs, $1)=\nif test -n \"${_LT_TAGVAR(compiler_lib_search_path, $1)}\"; then\n _LT_TAGVAR(compiler_lib_search_dirs, $1)=`echo \" ${_LT_TAGVAR(compiler_lib_search_path, $1)}\" | ${SED} -e 's! -L! !g' -e 's!^ !!'`\nfi\n_LT_TAGDECL([], [compiler_lib_search_dirs], [1],\n    [The directories searched by this compiler when creating a shared library])\n_LT_TAGDECL([], [predep_objects], [1],\n    [Dependencies to place before and after the objects being linked to\n    create a shared library])\n_LT_TAGDECL([], [postdep_objects], [1])\n_LT_TAGDECL([], [predeps], [1])\n_LT_TAGDECL([], [postdeps], [1])\n_LT_TAGDECL([], [compiler_lib_search_path], [1],\n    [The library search path used internally by the compiler when linking\n    a shared library])\n])# _LT_SYS_HIDDEN_LIBDEPS\n\n\n# _LT_LANG_F77_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for a Fortran 77 compiler are\n# suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_F77_CONFIG],\n[AC_LANG_PUSH(Fortran 77)\nif test -z \"$F77\" || test \"X$F77\" = \"Xno\"; then\n  _lt_disable_F77=yes\nfi\n\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for f77 test sources.\nac_ext=f\n\n# Object file extension for compiled f77 test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the F77 compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test \"$_lt_disable_F77\" != yes; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"\\\n      subroutine t\n      return\n      end\n\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code=\"\\\n      program t\n      end\n\"\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=\"$CC\"\n  lt_save_GCC=$GCC\n  lt_save_CFLAGS=$CFLAGS\n  CC=${F77-\"f77\"}\n  CFLAGS=$FFLAGS\n  compiler=$CC\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n  GCC=$G77\n  if test -n \"$compiler\"; then\n    AC_MSG_CHECKING([if libtool supports shared libraries])\n    AC_MSG_RESULT([$can_build_shared])\n\n    AC_MSG_CHECKING([whether to build shared libraries])\n    test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n    # On AIX, shared libraries and static libraries use the same namespace, and\n    # are all built from PIC.\n    case $host_os in\n      aix3*)\n        test \"$enable_shared\" = yes && enable_static=no\n        if test -n \"$RANLIB\"; then\n          archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n          postinstall_cmds='$RANLIB $lib'\n        fi\n        ;;\n      aix[[4-9]]*)\n\tif test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n\t  test \"$enable_shared\" = yes && enable_static=no\n\tfi\n        ;;\n    esac\n    AC_MSG_RESULT([$enable_shared])\n\n    AC_MSG_CHECKING([whether to build static libraries])\n    # Make sure either enable_shared or enable_static is yes.\n    test \"$enable_shared\" = yes || enable_static=yes\n    AC_MSG_RESULT([$enable_static])\n\n    _LT_TAGVAR(GCC, $1)=\"$G77\"\n    _LT_TAGVAR(LD, $1)=\"$LD\"\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  GCC=$lt_save_GCC\n  CC=\"$lt_save_CC\"\n  CFLAGS=\"$lt_save_CFLAGS\"\nfi # test \"$_lt_disable_F77\" != yes\n\nAC_LANG_POP\n])# _LT_LANG_F77_CONFIG\n\n\n# _LT_LANG_FC_CONFIG([TAG])\n# -------------------------\n# Ensure that the configuration variables for a Fortran compiler are\n# suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_FC_CONFIG],\n[AC_LANG_PUSH(Fortran)\n\nif test -z \"$FC\" || test \"X$FC\" = \"Xno\"; then\n  _lt_disable_FC=yes\nfi\n\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n_LT_TAGVAR(allow_undefined_flag, $1)=\n_LT_TAGVAR(always_export_symbols, $1)=no\n_LT_TAGVAR(archive_expsym_cmds, $1)=\n_LT_TAGVAR(export_dynamic_flag_spec, $1)=\n_LT_TAGVAR(hardcode_direct, $1)=no\n_LT_TAGVAR(hardcode_direct_absolute, $1)=no\n_LT_TAGVAR(hardcode_libdir_flag_spec, $1)=\n_LT_TAGVAR(hardcode_libdir_separator, $1)=\n_LT_TAGVAR(hardcode_minus_L, $1)=no\n_LT_TAGVAR(hardcode_automatic, $1)=no\n_LT_TAGVAR(inherit_rpath, $1)=no\n_LT_TAGVAR(module_cmds, $1)=\n_LT_TAGVAR(module_expsym_cmds, $1)=\n_LT_TAGVAR(link_all_deplibs, $1)=unknown\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n_LT_TAGVAR(no_undefined_flag, $1)=\n_LT_TAGVAR(whole_archive_flag_spec, $1)=\n_LT_TAGVAR(enable_shared_with_static_runtimes, $1)=no\n\n# Source file extension for fc test sources.\nac_ext=${ac_fc_srcext-f}\n\n# Object file extension for compiled fc test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# No sense in running all these tests if we already determined that\n# the FC compiler isn't working.  Some variables (like enable_shared)\n# are currently assumed to apply to all compilers on this platform,\n# and will be corrupted by setting them based on a non-working compiler.\nif test \"$_lt_disable_FC\" != yes; then\n  # Code to be used in simple compile tests\n  lt_simple_compile_test_code=\"\\\n      subroutine t\n      return\n      end\n\"\n\n  # Code to be used in simple link tests\n  lt_simple_link_test_code=\"\\\n      program t\n      end\n\"\n\n  # ltmain only uses $CC for tagged configurations so make sure $CC is set.\n  _LT_TAG_COMPILER\n\n  # save warnings/boilerplate of simple test code\n  _LT_COMPILER_BOILERPLATE\n  _LT_LINKER_BOILERPLATE\n\n  # Allow CC to be a program name with arguments.\n  lt_save_CC=\"$CC\"\n  lt_save_GCC=$GCC\n  lt_save_CFLAGS=$CFLAGS\n  CC=${FC-\"f95\"}\n  CFLAGS=$FCFLAGS\n  compiler=$CC\n  GCC=$ac_cv_fc_compiler_gnu\n\n  _LT_TAGVAR(compiler, $1)=$CC\n  _LT_CC_BASENAME([$compiler])\n\n  if test -n \"$compiler\"; then\n    AC_MSG_CHECKING([if libtool supports shared libraries])\n    AC_MSG_RESULT([$can_build_shared])\n\n    AC_MSG_CHECKING([whether to build shared libraries])\n    test \"$can_build_shared\" = \"no\" && enable_shared=no\n\n    # On AIX, shared libraries and static libraries use the same namespace, and\n    # are all built from PIC.\n    case $host_os in\n      aix3*)\n        test \"$enable_shared\" = yes && enable_static=no\n        if test -n \"$RANLIB\"; then\n          archive_cmds=\"$archive_cmds~\\$RANLIB \\$lib\"\n          postinstall_cmds='$RANLIB $lib'\n        fi\n        ;;\n      aix[[4-9]]*)\n\tif test \"$host_cpu\" != ia64 && test \"$aix_use_runtimelinking\" = no ; then\n\t  test \"$enable_shared\" = yes && enable_static=no\n\tfi\n        ;;\n    esac\n    AC_MSG_RESULT([$enable_shared])\n\n    AC_MSG_CHECKING([whether to build static libraries])\n    # Make sure either enable_shared or enable_static is yes.\n    test \"$enable_shared\" = yes || enable_static=yes\n    AC_MSG_RESULT([$enable_static])\n\n    _LT_TAGVAR(GCC, $1)=\"$ac_cv_fc_compiler_gnu\"\n    _LT_TAGVAR(LD, $1)=\"$LD\"\n\n    ## CAVEAT EMPTOR:\n    ## There is no encapsulation within the following macros, do not change\n    ## the running order or otherwise move them around unless you know exactly\n    ## what you are doing...\n    _LT_SYS_HIDDEN_LIBDEPS($1)\n    _LT_COMPILER_PIC($1)\n    _LT_COMPILER_C_O($1)\n    _LT_COMPILER_FILE_LOCKS($1)\n    _LT_LINKER_SHLIBS($1)\n    _LT_SYS_DYNAMIC_LINKER($1)\n    _LT_LINKER_HARDCODE_LIBPATH($1)\n\n    _LT_CONFIG($1)\n  fi # test -n \"$compiler\"\n\n  GCC=$lt_save_GCC\n  CC=$lt_save_CC\n  CFLAGS=$lt_save_CFLAGS\nfi # test \"$_lt_disable_FC\" != yes\n\nAC_LANG_POP\n])# _LT_LANG_FC_CONFIG\n\n\n# _LT_LANG_GCJ_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for the GNU Java Compiler compiler\n# are suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_GCJ_CONFIG],\n[AC_REQUIRE([LT_PROG_GCJ])dnl\nAC_LANG_SAVE\n\n# Source file extension for Java test sources.\nac_ext=java\n\n# Object file extension for compiled Java test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"class foo {}\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='public class conftest { public static void main(String[[]] argv) {}; }'\n\n# ltmain only uses $CC for tagged configurations so make sure $CC is set.\n_LT_TAG_COMPILER\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n# Allow CC to be a program name with arguments.\nlt_save_CC=$CC\nlt_save_CFLAGS=$CFLAGS\nlt_save_GCC=$GCC\nGCC=yes\nCC=${GCJ-\"gcj\"}\nCFLAGS=$GCJFLAGS\ncompiler=$CC\n_LT_TAGVAR(compiler, $1)=$CC\n_LT_TAGVAR(LD, $1)=\"$LD\"\n_LT_CC_BASENAME([$compiler])\n\n# GCJ did not exist at the time GCC didn't implicitly link libc in.\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n  _LT_COMPILER_NO_RTTI($1)\n  _LT_COMPILER_PIC($1)\n  _LT_COMPILER_C_O($1)\n  _LT_COMPILER_FILE_LOCKS($1)\n  _LT_LINKER_SHLIBS($1)\n  _LT_LINKER_HARDCODE_LIBPATH($1)\n\n  _LT_CONFIG($1)\nfi\n\nAC_LANG_RESTORE\n\nGCC=$lt_save_GCC\nCC=$lt_save_CC\nCFLAGS=$lt_save_CFLAGS\n])# _LT_LANG_GCJ_CONFIG\n\n\n# _LT_LANG_GO_CONFIG([TAG])\n# --------------------------\n# Ensure that the configuration variables for the GNU Go compiler\n# are suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_GO_CONFIG],\n[AC_REQUIRE([LT_PROG_GO])dnl\nAC_LANG_SAVE\n\n# Source file extension for Go test sources.\nac_ext=go\n\n# Object file extension for compiled Go test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code=\"package main; func main() { }\"\n\n# Code to be used in simple link tests\nlt_simple_link_test_code='package main; func main() { }'\n\n# ltmain only uses $CC for tagged configurations so make sure $CC is set.\n_LT_TAG_COMPILER\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n# Allow CC to be a program name with arguments.\nlt_save_CC=$CC\nlt_save_CFLAGS=$CFLAGS\nlt_save_GCC=$GCC\nGCC=yes\nCC=${GOC-\"gccgo\"}\nCFLAGS=$GOFLAGS\ncompiler=$CC\n_LT_TAGVAR(compiler, $1)=$CC\n_LT_TAGVAR(LD, $1)=\"$LD\"\n_LT_CC_BASENAME([$compiler])\n\n# Go did not exist at the time GCC didn't implicitly link libc in.\n_LT_TAGVAR(archive_cmds_need_lc, $1)=no\n\n_LT_TAGVAR(old_archive_cmds, $1)=$old_archive_cmds\n_LT_TAGVAR(reload_flag, $1)=$reload_flag\n_LT_TAGVAR(reload_cmds, $1)=$reload_cmds\n\n## CAVEAT EMPTOR:\n## There is no encapsulation within the following macros, do not change\n## the running order or otherwise move them around unless you know exactly\n## what you are doing...\nif test -n \"$compiler\"; then\n  _LT_COMPILER_NO_RTTI($1)\n  _LT_COMPILER_PIC($1)\n  _LT_COMPILER_C_O($1)\n  _LT_COMPILER_FILE_LOCKS($1)\n  _LT_LINKER_SHLIBS($1)\n  _LT_LINKER_HARDCODE_LIBPATH($1)\n\n  _LT_CONFIG($1)\nfi\n\nAC_LANG_RESTORE\n\nGCC=$lt_save_GCC\nCC=$lt_save_CC\nCFLAGS=$lt_save_CFLAGS\n])# _LT_LANG_GO_CONFIG\n\n\n# _LT_LANG_RC_CONFIG([TAG])\n# -------------------------\n# Ensure that the configuration variables for the Windows resource compiler\n# are suitably defined.  These variables are subsequently used by _LT_CONFIG\n# to write the compiler configuration to `libtool'.\nm4_defun([_LT_LANG_RC_CONFIG],\n[AC_REQUIRE([LT_PROG_RC])dnl\nAC_LANG_SAVE\n\n# Source file extension for RC test sources.\nac_ext=rc\n\n# Object file extension for compiled RC test sources.\nobjext=o\n_LT_TAGVAR(objext, $1)=$objext\n\n# Code to be used in simple compile tests\nlt_simple_compile_test_code='sample MENU { MENUITEM \"&Soup\", 100, CHECKED }'\n\n# Code to be used in simple link tests\nlt_simple_link_test_code=\"$lt_simple_compile_test_code\"\n\n# ltmain only uses $CC for tagged configurations so make sure $CC is set.\n_LT_TAG_COMPILER\n\n# save warnings/boilerplate of simple test code\n_LT_COMPILER_BOILERPLATE\n_LT_LINKER_BOILERPLATE\n\n# Allow CC to be a program name with arguments.\nlt_save_CC=\"$CC\"\nlt_save_CFLAGS=$CFLAGS\nlt_save_GCC=$GCC\nGCC=\nCC=${RC-\"windres\"}\nCFLAGS=\ncompiler=$CC\n_LT_TAGVAR(compiler, $1)=$CC\n_LT_CC_BASENAME([$compiler])\n_LT_TAGVAR(lt_cv_prog_compiler_c_o, $1)=yes\n\nif test -n \"$compiler\"; then\n  :\n  _LT_CONFIG($1)\nfi\n\nGCC=$lt_save_GCC\nAC_LANG_RESTORE\nCC=$lt_save_CC\nCFLAGS=$lt_save_CFLAGS\n])# _LT_LANG_RC_CONFIG\n\n\n# LT_PROG_GCJ\n# -----------\nAC_DEFUN([LT_PROG_GCJ],\n[m4_ifdef([AC_PROG_GCJ], [AC_PROG_GCJ],\n  [m4_ifdef([A][M_PROG_GCJ], [A][M_PROG_GCJ],\n    [AC_CHECK_TOOL(GCJ, gcj,)\n      test \"x${GCJFLAGS+set}\" = xset || GCJFLAGS=\"-g -O2\"\n      AC_SUBST(GCJFLAGS)])])[]dnl\n])\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_GCJ], [LT_PROG_GCJ])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_GCJ], [])\n\n\n# LT_PROG_GO\n# ----------\nAC_DEFUN([LT_PROG_GO],\n[AC_CHECK_TOOL(GOC, gccgo,)\n])\n\n\n# LT_PROG_RC\n# ----------\nAC_DEFUN([LT_PROG_RC],\n[AC_CHECK_TOOL(RC, windres,)\n])\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_RC], [LT_PROG_RC])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_RC], [])\n\n\n# _LT_DECL_EGREP\n# --------------\n# If we don't have a new enough Autoconf to choose the best grep\n# available, choose the one first in the user's PATH.\nm4_defun([_LT_DECL_EGREP],\n[AC_REQUIRE([AC_PROG_EGREP])dnl\nAC_REQUIRE([AC_PROG_FGREP])dnl\ntest -z \"$GREP\" && GREP=grep\n_LT_DECL([], [GREP], [1], [A grep program that handles long lines])\n_LT_DECL([], [EGREP], [1], [An ERE matcher])\n_LT_DECL([], [FGREP], [1], [A literal string matcher])\ndnl Non-bleeding-edge autoconf doesn't subst GREP, so do it here too\nAC_SUBST([GREP])\n])\n\n\n# _LT_DECL_OBJDUMP\n# --------------\n# If we don't have a new enough Autoconf to choose the best objdump\n# available, choose the one first in the user's PATH.\nm4_defun([_LT_DECL_OBJDUMP],\n[AC_CHECK_TOOL(OBJDUMP, objdump, false)\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n_LT_DECL([], [OBJDUMP], [1], [An object symbol dumper])\nAC_SUBST([OBJDUMP])\n])\n\n# _LT_DECL_DLLTOOL\n# ----------------\n# Ensure DLLTOOL variable is set.\nm4_defun([_LT_DECL_DLLTOOL],\n[AC_CHECK_TOOL(DLLTOOL, dlltool, false)\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\n_LT_DECL([], [DLLTOOL], [1], [DLL creation program])\nAC_SUBST([DLLTOOL])\n])\n\n# _LT_DECL_SED\n# ------------\n# Check for a fully-functional sed program, that truncates\n# as few characters as possible.  Prefer GNU sed if found.\nm4_defun([_LT_DECL_SED],\n[AC_PROG_SED\ntest -z \"$SED\" && SED=sed\nXsed=\"$SED -e 1s/^X//\"\n_LT_DECL([], [SED], [1], [A sed program that does not truncate output])\n_LT_DECL([], [Xsed], [\"\\$SED -e 1s/^X//\"],\n    [Sed that helps us avoid accidentally triggering echo(1) options like -n])\n])# _LT_DECL_SED\n\nm4_ifndef([AC_PROG_SED], [\n############################################################\n# NOTE: This macro has been submitted for inclusion into   #\n#  GNU Autoconf as AC_PROG_SED.  When it is available in   #\n#  a released version of Autoconf we should remove this    #\n#  macro and use it instead.                               #\n############################################################\n\nm4_defun([AC_PROG_SED],\n[AC_MSG_CHECKING([for a sed that does not truncate output])\nAC_CACHE_VAL(lt_cv_path_SED,\n[# Loop through the user's path and test for sed and gsed.\n# Then use that list of sed's as ones to test for truncation.\nas_save_IFS=$IFS; IFS=$PATH_SEPARATOR\nfor as_dir in $PATH\ndo\n  IFS=$as_save_IFS\n  test -z \"$as_dir\" && as_dir=.\n  for lt_ac_prog in sed gsed; do\n    for ac_exec_ext in '' $ac_executable_extensions; do\n      if $as_executable_p \"$as_dir/$lt_ac_prog$ac_exec_ext\"; then\n        lt_ac_sed_list=\"$lt_ac_sed_list $as_dir/$lt_ac_prog$ac_exec_ext\"\n      fi\n    done\n  done\ndone\nIFS=$as_save_IFS\nlt_ac_max=0\nlt_ac_count=0\n# Add /usr/xpg4/bin/sed as it is typically found on Solaris\n# along with /bin/sed that truncates output.\nfor lt_ac_sed in $lt_ac_sed_list /usr/xpg4/bin/sed; do\n  test ! -f $lt_ac_sed && continue\n  cat /dev/null > conftest.in\n  lt_ac_count=0\n  echo $ECHO_N \"0123456789$ECHO_C\" >conftest.in\n  # Check for GNU sed and select it if it is found.\n  if \"$lt_ac_sed\" --version 2>&1 < /dev/null | grep 'GNU' > /dev/null; then\n    lt_cv_path_SED=$lt_ac_sed\n    break\n  fi\n  while true; do\n    cat conftest.in conftest.in >conftest.tmp\n    mv conftest.tmp conftest.in\n    cp conftest.in conftest.nl\n    echo >>conftest.nl\n    $lt_ac_sed -e 's/a$//' < conftest.nl >conftest.out || break\n    cmp -s conftest.out conftest.nl || break\n    # 10000 chars as input seems more than enough\n    test $lt_ac_count -gt 10 && break\n    lt_ac_count=`expr $lt_ac_count + 1`\n    if test $lt_ac_count -gt $lt_ac_max; then\n      lt_ac_max=$lt_ac_count\n      lt_cv_path_SED=$lt_ac_sed\n    fi\n  done\ndone\n])\nSED=$lt_cv_path_SED\nAC_SUBST([SED])\nAC_MSG_RESULT([$SED])\n])#AC_PROG_SED\n])#m4_ifndef\n\n# Old name:\nAU_ALIAS([LT_AC_PROG_SED], [AC_PROG_SED])\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([LT_AC_PROG_SED], [])\n\n\n# _LT_CHECK_SHELL_FEATURES\n# ------------------------\n# Find out whether the shell is Bourne or XSI compatible,\n# or has some other useful features.\nm4_defun([_LT_CHECK_SHELL_FEATURES],\n[AC_MSG_CHECKING([whether the shell understands some XSI constructs])\n# Try some XSI features\nxsi_shell=no\n( _lt_dummy=\"a/b/c\"\n  test \"${_lt_dummy##*/},${_lt_dummy%/*},${_lt_dummy#??}\"${_lt_dummy%\"$_lt_dummy\"}, \\\n      = c,a/b,b/c, \\\n    && eval 'test $(( 1 + 1 )) -eq 2 \\\n    && test \"${#_lt_dummy}\" -eq 5' ) >/dev/null 2>&1 \\\n  && xsi_shell=yes\nAC_MSG_RESULT([$xsi_shell])\n_LT_CONFIG_LIBTOOL_INIT([xsi_shell='$xsi_shell'])\n\nAC_MSG_CHECKING([whether the shell understands \"+=\"])\nlt_shell_append=no\n( foo=bar; set foo baz; eval \"$[1]+=\\$[2]\" && test \"$foo\" = barbaz ) \\\n    >/dev/null 2>&1 \\\n  && lt_shell_append=yes\nAC_MSG_RESULT([$lt_shell_append])\n_LT_CONFIG_LIBTOOL_INIT([lt_shell_append='$lt_shell_append'])\n\nif ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then\n  lt_unset=unset\nelse\n  lt_unset=false\nfi\n_LT_DECL([], [lt_unset], [0], [whether the shell understands \"unset\"])dnl\n\n# test EBCDIC or ASCII\ncase `echo X|tr X '\\101'` in\n A) # ASCII based system\n    # \\n is not interpreted correctly by Solaris 8 /usr/ucb/tr\n  lt_SP2NL='tr \\040 \\012'\n  lt_NL2SP='tr \\015\\012 \\040\\040'\n  ;;\n *) # EBCDIC based system\n  lt_SP2NL='tr \\100 \\n'\n  lt_NL2SP='tr \\r\\n \\100\\100'\n  ;;\nesac\n_LT_DECL([SP2NL], [lt_SP2NL], [1], [turn spaces into newlines])dnl\n_LT_DECL([NL2SP], [lt_NL2SP], [1], [turn newlines into spaces])dnl\n])# _LT_CHECK_SHELL_FEATURES\n\n\n# _LT_PROG_FUNCTION_REPLACE (FUNCNAME, REPLACEMENT-BODY)\n# ------------------------------------------------------\n# In `$cfgfile', look for function FUNCNAME delimited by `^FUNCNAME ()$' and\n# '^} FUNCNAME ', and replace its body with REPLACEMENT-BODY.\nm4_defun([_LT_PROG_FUNCTION_REPLACE],\n[dnl {\nsed -e '/^$1 ()$/,/^} # $1 /c\\\n$1 ()\\\n{\\\nm4_bpatsubsts([$2], [$], [\\\\], [^\\([\t ]\\)], [\\\\\\1])\n} # Extended-shell $1 implementation' \"$cfgfile\" > $cfgfile.tmp \\\n  && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n    || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\ntest 0 -eq $? || _lt_function_replace_fail=:\n])\n\n\n# _LT_PROG_REPLACE_SHELLFNS\n# -------------------------\n# Replace existing portable implementations of several shell functions with\n# equivalent extended shell implementations where those features are available..\nm4_defun([_LT_PROG_REPLACE_SHELLFNS],\n[if test x\"$xsi_shell\" = xyes; then\n  _LT_PROG_FUNCTION_REPLACE([func_dirname], [dnl\n    case ${1} in\n      */*) func_dirname_result=\"${1%/*}${2}\" ;;\n      *  ) func_dirname_result=\"${3}\" ;;\n    esac])\n\n  _LT_PROG_FUNCTION_REPLACE([func_basename], [dnl\n    func_basename_result=\"${1##*/}\"])\n\n  _LT_PROG_FUNCTION_REPLACE([func_dirname_and_basename], [dnl\n    case ${1} in\n      */*) func_dirname_result=\"${1%/*}${2}\" ;;\n      *  ) func_dirname_result=\"${3}\" ;;\n    esac\n    func_basename_result=\"${1##*/}\"])\n\n  _LT_PROG_FUNCTION_REPLACE([func_stripname], [dnl\n    # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are\n    # positional parameters, so assign one to ordinary parameter first.\n    func_stripname_result=${3}\n    func_stripname_result=${func_stripname_result#\"${1}\"}\n    func_stripname_result=${func_stripname_result%\"${2}\"}])\n\n  _LT_PROG_FUNCTION_REPLACE([func_split_long_opt], [dnl\n    func_split_long_opt_name=${1%%=*}\n    func_split_long_opt_arg=${1#*=}])\n\n  _LT_PROG_FUNCTION_REPLACE([func_split_short_opt], [dnl\n    func_split_short_opt_arg=${1#??}\n    func_split_short_opt_name=${1%\"$func_split_short_opt_arg\"}])\n\n  _LT_PROG_FUNCTION_REPLACE([func_lo2o], [dnl\n    case ${1} in\n      *.lo) func_lo2o_result=${1%.lo}.${objext} ;;\n      *)    func_lo2o_result=${1} ;;\n    esac])\n\n  _LT_PROG_FUNCTION_REPLACE([func_xform], [    func_xform_result=${1%.*}.lo])\n\n  _LT_PROG_FUNCTION_REPLACE([func_arith], [    func_arith_result=$(( $[*] ))])\n\n  _LT_PROG_FUNCTION_REPLACE([func_len], [    func_len_result=${#1}])\nfi\n\nif test x\"$lt_shell_append\" = xyes; then\n  _LT_PROG_FUNCTION_REPLACE([func_append], [    eval \"${1}+=\\\\${2}\"])\n\n  _LT_PROG_FUNCTION_REPLACE([func_append_quoted], [dnl\n    func_quote_for_eval \"${2}\"\ndnl m4 expansion turns \\\\\\\\ into \\\\, and then the shell eval turns that into \\\n    eval \"${1}+=\\\\\\\\ \\\\$func_quote_for_eval_result\"])\n\n  # Save a `func_append' function call where possible by direct use of '+='\n  sed -e 's%func_append \\([[a-zA-Z_]]\\{1,\\}\\) \"%\\1+=\"%g' $cfgfile > $cfgfile.tmp \\\n    && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n      || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\n  test 0 -eq $? || _lt_function_replace_fail=:\nelse\n  # Save a `func_append' function call even when '+=' is not available\n  sed -e 's%func_append \\([[a-zA-Z_]]\\{1,\\}\\) \"%\\1=\"$\\1%g' $cfgfile > $cfgfile.tmp \\\n    && mv -f \"$cfgfile.tmp\" \"$cfgfile\" \\\n      || (rm -f \"$cfgfile\" && cp \"$cfgfile.tmp\" \"$cfgfile\" && rm -f \"$cfgfile.tmp\")\n  test 0 -eq $? || _lt_function_replace_fail=:\nfi\n\nif test x\"$_lt_function_replace_fail\" = x\":\"; then\n  AC_MSG_WARN([Unable to substitute extended shell functions in $ofile])\nfi\n])\n\n# _LT_PATH_CONVERSION_FUNCTIONS\n# -----------------------------\n# Determine which file name conversion functions should be used by\n# func_to_host_file (and, implicitly, by func_to_host_path).  These are needed\n# for certain cross-compile configurations and native mingw.\nm4_defun([_LT_PATH_CONVERSION_FUNCTIONS],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\nAC_REQUIRE([AC_CANONICAL_BUILD])dnl\nAC_MSG_CHECKING([how to convert $build file names to $host format])\nAC_CACHE_VAL(lt_cv_to_host_file_cmd,\n[case $host in\n  *-*-mingw* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_host_file_cmd=func_convert_file_msys_to_w32\n        ;;\n      *-*-cygwin* )\n        lt_cv_to_host_file_cmd=func_convert_file_cygwin_to_w32\n        ;;\n      * ) # otherwise, assume *nix\n        lt_cv_to_host_file_cmd=func_convert_file_nix_to_w32\n        ;;\n    esac\n    ;;\n  *-*-cygwin* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_host_file_cmd=func_convert_file_msys_to_cygwin\n        ;;\n      *-*-cygwin* )\n        lt_cv_to_host_file_cmd=func_convert_file_noop\n        ;;\n      * ) # otherwise, assume *nix\n        lt_cv_to_host_file_cmd=func_convert_file_nix_to_cygwin\n        ;;\n    esac\n    ;;\n  * ) # unhandled hosts (and \"normal\" native builds)\n    lt_cv_to_host_file_cmd=func_convert_file_noop\n    ;;\nesac\n])\nto_host_file_cmd=$lt_cv_to_host_file_cmd\nAC_MSG_RESULT([$lt_cv_to_host_file_cmd])\n_LT_DECL([to_host_file_cmd], [lt_cv_to_host_file_cmd],\n         [0], [convert $build file names to $host format])dnl\n\nAC_MSG_CHECKING([how to convert $build file names to toolchain format])\nAC_CACHE_VAL(lt_cv_to_tool_file_cmd,\n[#assume ordinary cross tools, or native build.\nlt_cv_to_tool_file_cmd=func_convert_file_noop\ncase $host in\n  *-*-mingw* )\n    case $build in\n      *-*-mingw* ) # actually msys\n        lt_cv_to_tool_file_cmd=func_convert_file_msys_to_w32\n        ;;\n    esac\n    ;;\nesac\n])\nto_tool_file_cmd=$lt_cv_to_tool_file_cmd\nAC_MSG_RESULT([$lt_cv_to_tool_file_cmd])\n_LT_DECL([to_tool_file_cmd], [lt_cv_to_tool_file_cmd],\n         [0], [convert $build files to toolchain format])dnl\n])# _LT_PATH_CONVERSION_FUNCTIONS\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/m4/ltoptions.m4",
    "content": "# Helper functions for option handling.                    -*- Autoconf -*-\n#\n#   Copyright (C) 2004, 2005, 2007, 2008, 2009 Free Software Foundation,\n#   Inc.\n#   Written by Gary V. Vaughan, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 7 ltoptions.m4\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTOPTIONS_VERSION], [m4_if([1])])\n\n\n# _LT_MANGLE_OPTION(MACRO-NAME, OPTION-NAME)\n# ------------------------------------------\nm4_define([_LT_MANGLE_OPTION],\n[[_LT_OPTION_]m4_bpatsubst($1__$2, [[^a-zA-Z0-9_]], [_])])\n\n\n# _LT_SET_OPTION(MACRO-NAME, OPTION-NAME)\n# ---------------------------------------\n# Set option OPTION-NAME for macro MACRO-NAME, and if there is a\n# matching handler defined, dispatch to it.  Other OPTION-NAMEs are\n# saved as a flag.\nm4_define([_LT_SET_OPTION],\n[m4_define(_LT_MANGLE_OPTION([$1], [$2]))dnl\nm4_ifdef(_LT_MANGLE_DEFUN([$1], [$2]),\n        _LT_MANGLE_DEFUN([$1], [$2]),\n    [m4_warning([Unknown $1 option `$2'])])[]dnl\n])\n\n\n# _LT_IF_OPTION(MACRO-NAME, OPTION-NAME, IF-SET, [IF-NOT-SET])\n# ------------------------------------------------------------\n# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise.\nm4_define([_LT_IF_OPTION],\n[m4_ifdef(_LT_MANGLE_OPTION([$1], [$2]), [$3], [$4])])\n\n\n# _LT_UNLESS_OPTIONS(MACRO-NAME, OPTION-LIST, IF-NOT-SET)\n# -------------------------------------------------------\n# Execute IF-NOT-SET unless all options in OPTION-LIST for MACRO-NAME\n# are set.\nm4_define([_LT_UNLESS_OPTIONS],\n[m4_foreach([_LT_Option], m4_split(m4_normalize([$2])),\n\t    [m4_ifdef(_LT_MANGLE_OPTION([$1], _LT_Option),\n\t\t      [m4_define([$0_found])])])[]dnl\nm4_ifdef([$0_found], [m4_undefine([$0_found])], [$3\n])[]dnl\n])\n\n\n# _LT_SET_OPTIONS(MACRO-NAME, OPTION-LIST)\n# ----------------------------------------\n# OPTION-LIST is a space-separated list of Libtool options associated\n# with MACRO-NAME.  If any OPTION has a matching handler declared with\n# LT_OPTION_DEFINE, dispatch to that macro; otherwise complain about\n# the unknown option and exit.\nm4_defun([_LT_SET_OPTIONS],\n[# Set options\nm4_foreach([_LT_Option], m4_split(m4_normalize([$2])),\n    [_LT_SET_OPTION([$1], _LT_Option)])\n\nm4_if([$1],[LT_INIT],[\n  dnl\n  dnl Simply set some default values (i.e off) if boolean options were not\n  dnl specified:\n  _LT_UNLESS_OPTIONS([LT_INIT], [dlopen], [enable_dlopen=no\n  ])\n  _LT_UNLESS_OPTIONS([LT_INIT], [win32-dll], [enable_win32_dll=no\n  ])\n  dnl\n  dnl If no reference was made to various pairs of opposing options, then\n  dnl we run the default mode handler for the pair.  For example, if neither\n  dnl `shared' nor `disable-shared' was passed, we enable building of shared\n  dnl archives by default:\n  _LT_UNLESS_OPTIONS([LT_INIT], [shared disable-shared], [_LT_ENABLE_SHARED])\n  _LT_UNLESS_OPTIONS([LT_INIT], [static disable-static], [_LT_ENABLE_STATIC])\n  _LT_UNLESS_OPTIONS([LT_INIT], [pic-only no-pic], [_LT_WITH_PIC])\n  _LT_UNLESS_OPTIONS([LT_INIT], [fast-install disable-fast-install],\n  \t\t   [_LT_ENABLE_FAST_INSTALL])\n  ])\n])# _LT_SET_OPTIONS\n\n\n## --------------------------------- ##\n## Macros to handle LT_INIT options. ##\n## --------------------------------- ##\n\n# _LT_MANGLE_DEFUN(MACRO-NAME, OPTION-NAME)\n# -----------------------------------------\nm4_define([_LT_MANGLE_DEFUN],\n[[_LT_OPTION_DEFUN_]m4_bpatsubst(m4_toupper([$1__$2]), [[^A-Z0-9_]], [_])])\n\n\n# LT_OPTION_DEFINE(MACRO-NAME, OPTION-NAME, CODE)\n# -----------------------------------------------\nm4_define([LT_OPTION_DEFINE],\n[m4_define(_LT_MANGLE_DEFUN([$1], [$2]), [$3])[]dnl\n])# LT_OPTION_DEFINE\n\n\n# dlopen\n# ------\nLT_OPTION_DEFINE([LT_INIT], [dlopen], [enable_dlopen=yes\n])\n\nAU_DEFUN([AC_LIBTOOL_DLOPEN],\n[_LT_SET_OPTION([LT_INIT], [dlopen])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the `dlopen' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_DLOPEN], [])\n\n\n# win32-dll\n# ---------\n# Declare package support for building win32 dll's.\nLT_OPTION_DEFINE([LT_INIT], [win32-dll],\n[enable_win32_dll=yes\n\ncase $host in\n*-*-cygwin* | *-*-mingw* | *-*-pw32* | *-*-cegcc*)\n  AC_CHECK_TOOL(AS, as, false)\n  AC_CHECK_TOOL(DLLTOOL, dlltool, false)\n  AC_CHECK_TOOL(OBJDUMP, objdump, false)\n  ;;\nesac\n\ntest -z \"$AS\" && AS=as\n_LT_DECL([], [AS],      [1], [Assembler program])dnl\n\ntest -z \"$DLLTOOL\" && DLLTOOL=dlltool\n_LT_DECL([], [DLLTOOL], [1], [DLL creation program])dnl\n\ntest -z \"$OBJDUMP\" && OBJDUMP=objdump\n_LT_DECL([], [OBJDUMP], [1], [Object dumper program])dnl\n])# win32-dll\n\nAU_DEFUN([AC_LIBTOOL_WIN32_DLL],\n[AC_REQUIRE([AC_CANONICAL_HOST])dnl\n_LT_SET_OPTION([LT_INIT], [win32-dll])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the `win32-dll' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_WIN32_DLL], [])\n\n\n# _LT_ENABLE_SHARED([DEFAULT])\n# ----------------------------\n# implement the --enable-shared flag, and supports the `shared' and\n# `disable-shared' LT_INIT options.\n# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.\nm4_define([_LT_ENABLE_SHARED],\n[m4_define([_LT_ENABLE_SHARED_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([shared],\n    [AS_HELP_STRING([--enable-shared@<:@=PKGS@:>@],\n\t[build shared libraries @<:@default=]_LT_ENABLE_SHARED_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_shared=yes ;;\n    no) enable_shared=no ;;\n    *)\n      enable_shared=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_shared=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [enable_shared=]_LT_ENABLE_SHARED_DEFAULT)\n\n    _LT_DECL([build_libtool_libs], [enable_shared], [0],\n\t[Whether or not to build shared libraries])\n])# _LT_ENABLE_SHARED\n\nLT_OPTION_DEFINE([LT_INIT], [shared], [_LT_ENABLE_SHARED([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-shared], [_LT_ENABLE_SHARED([no])])\n\n# Old names:\nAC_DEFUN([AC_ENABLE_SHARED],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[shared])\n])\n\nAC_DEFUN([AC_DISABLE_SHARED],\n[_LT_SET_OPTION([LT_INIT], [disable-shared])\n])\n\nAU_DEFUN([AM_ENABLE_SHARED], [AC_ENABLE_SHARED($@)])\nAU_DEFUN([AM_DISABLE_SHARED], [AC_DISABLE_SHARED($@)])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_ENABLE_SHARED], [])\ndnl AC_DEFUN([AM_DISABLE_SHARED], [])\n\n\n\n# _LT_ENABLE_STATIC([DEFAULT])\n# ----------------------------\n# implement the --enable-static flag, and support the `static' and\n# `disable-static' LT_INIT options.\n# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.\nm4_define([_LT_ENABLE_STATIC],\n[m4_define([_LT_ENABLE_STATIC_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([static],\n    [AS_HELP_STRING([--enable-static@<:@=PKGS@:>@],\n\t[build static libraries @<:@default=]_LT_ENABLE_STATIC_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_static=yes ;;\n    no) enable_static=no ;;\n    *)\n     enable_static=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_static=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [enable_static=]_LT_ENABLE_STATIC_DEFAULT)\n\n    _LT_DECL([build_old_libs], [enable_static], [0],\n\t[Whether or not to build static libraries])\n])# _LT_ENABLE_STATIC\n\nLT_OPTION_DEFINE([LT_INIT], [static], [_LT_ENABLE_STATIC([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-static], [_LT_ENABLE_STATIC([no])])\n\n# Old names:\nAC_DEFUN([AC_ENABLE_STATIC],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[static])\n])\n\nAC_DEFUN([AC_DISABLE_STATIC],\n[_LT_SET_OPTION([LT_INIT], [disable-static])\n])\n\nAU_DEFUN([AM_ENABLE_STATIC], [AC_ENABLE_STATIC($@)])\nAU_DEFUN([AM_DISABLE_STATIC], [AC_DISABLE_STATIC($@)])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AM_ENABLE_STATIC], [])\ndnl AC_DEFUN([AM_DISABLE_STATIC], [])\n\n\n\n# _LT_ENABLE_FAST_INSTALL([DEFAULT])\n# ----------------------------------\n# implement the --enable-fast-install flag, and support the `fast-install'\n# and `disable-fast-install' LT_INIT options.\n# DEFAULT is either `yes' or `no'.  If omitted, it defaults to `yes'.\nm4_define([_LT_ENABLE_FAST_INSTALL],\n[m4_define([_LT_ENABLE_FAST_INSTALL_DEFAULT], [m4_if($1, no, no, yes)])dnl\nAC_ARG_ENABLE([fast-install],\n    [AS_HELP_STRING([--enable-fast-install@<:@=PKGS@:>@],\n    [optimize for fast installation @<:@default=]_LT_ENABLE_FAST_INSTALL_DEFAULT[@:>@])],\n    [p=${PACKAGE-default}\n    case $enableval in\n    yes) enable_fast_install=yes ;;\n    no) enable_fast_install=no ;;\n    *)\n      enable_fast_install=no\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for pkg in $enableval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$pkg\" = \"X$p\"; then\n\t  enable_fast_install=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [enable_fast_install=]_LT_ENABLE_FAST_INSTALL_DEFAULT)\n\n_LT_DECL([fast_install], [enable_fast_install], [0],\n\t [Whether or not to optimize for fast installation])dnl\n])# _LT_ENABLE_FAST_INSTALL\n\nLT_OPTION_DEFINE([LT_INIT], [fast-install], [_LT_ENABLE_FAST_INSTALL([yes])])\nLT_OPTION_DEFINE([LT_INIT], [disable-fast-install], [_LT_ENABLE_FAST_INSTALL([no])])\n\n# Old names:\nAU_DEFUN([AC_ENABLE_FAST_INSTALL],\n[_LT_SET_OPTION([LT_INIT], m4_if([$1], [no], [disable-])[fast-install])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you put\nthe `fast-install' option into LT_INIT's first parameter.])\n])\n\nAU_DEFUN([AC_DISABLE_FAST_INSTALL],\n[_LT_SET_OPTION([LT_INIT], [disable-fast-install])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you put\nthe `disable-fast-install' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_ENABLE_FAST_INSTALL], [])\ndnl AC_DEFUN([AM_DISABLE_FAST_INSTALL], [])\n\n\n# _LT_WITH_PIC([MODE])\n# --------------------\n# implement the --with-pic flag, and support the `pic-only' and `no-pic'\n# LT_INIT options.\n# MODE is either `yes' or `no'.  If omitted, it defaults to `both'.\nm4_define([_LT_WITH_PIC],\n[AC_ARG_WITH([pic],\n    [AS_HELP_STRING([--with-pic@<:@=PKGS@:>@],\n\t[try to use only PIC/non-PIC objects @<:@default=use both@:>@])],\n    [lt_p=${PACKAGE-default}\n    case $withval in\n    yes|no) pic_mode=$withval ;;\n    *)\n      pic_mode=default\n      # Look at the argument we got.  We use all the common list separators.\n      lt_save_ifs=\"$IFS\"; IFS=\"${IFS}$PATH_SEPARATOR,\"\n      for lt_pkg in $withval; do\n\tIFS=\"$lt_save_ifs\"\n\tif test \"X$lt_pkg\" = \"X$lt_p\"; then\n\t  pic_mode=yes\n\tfi\n      done\n      IFS=\"$lt_save_ifs\"\n      ;;\n    esac],\n    [pic_mode=default])\n\ntest -z \"$pic_mode\" && pic_mode=m4_default([$1], [default])\n\n_LT_DECL([], [pic_mode], [0], [What type of objects to build])dnl\n])# _LT_WITH_PIC\n\nLT_OPTION_DEFINE([LT_INIT], [pic-only], [_LT_WITH_PIC([yes])])\nLT_OPTION_DEFINE([LT_INIT], [no-pic], [_LT_WITH_PIC([no])])\n\n# Old name:\nAU_DEFUN([AC_LIBTOOL_PICMODE],\n[_LT_SET_OPTION([LT_INIT], [pic-only])\nAC_DIAGNOSE([obsolete],\n[$0: Remove this warning and the call to _LT_SET_OPTION when you\nput the `pic-only' option into LT_INIT's first parameter.])\n])\n\ndnl aclocal-1.4 backwards compatibility:\ndnl AC_DEFUN([AC_LIBTOOL_PICMODE], [])\n\n## ----------------- ##\n## LTDL_INIT Options ##\n## ----------------- ##\n\nm4_define([_LTDL_MODE], [])\nLT_OPTION_DEFINE([LTDL_INIT], [nonrecursive],\n\t\t [m4_define([_LTDL_MODE], [nonrecursive])])\nLT_OPTION_DEFINE([LTDL_INIT], [recursive],\n\t\t [m4_define([_LTDL_MODE], [recursive])])\nLT_OPTION_DEFINE([LTDL_INIT], [subproject],\n\t\t [m4_define([_LTDL_MODE], [subproject])])\n\nm4_define([_LTDL_TYPE], [])\nLT_OPTION_DEFINE([LTDL_INIT], [installable],\n\t\t [m4_define([_LTDL_TYPE], [installable])])\nLT_OPTION_DEFINE([LTDL_INIT], [convenience],\n\t\t [m4_define([_LTDL_TYPE], [convenience])])\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/m4/ltsugar.m4",
    "content": "# ltsugar.m4 -- libtool m4 base layer.                         -*-Autoconf-*-\n#\n# Copyright (C) 2004, 2005, 2007, 2008 Free Software Foundation, Inc.\n# Written by Gary V. Vaughan, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 6 ltsugar.m4\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTSUGAR_VERSION], [m4_if([0.1])])\n\n\n# lt_join(SEP, ARG1, [ARG2...])\n# -----------------------------\n# Produce ARG1SEPARG2...SEPARGn, omitting [] arguments and their\n# associated separator.\n# Needed until we can rely on m4_join from Autoconf 2.62, since all earlier\n# versions in m4sugar had bugs.\nm4_define([lt_join],\n[m4_if([$#], [1], [],\n       [$#], [2], [[$2]],\n       [m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift(m4_shift($@)))])])\nm4_define([_lt_join],\n[m4_if([$#$2], [2], [],\n       [m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift(m4_shift($@)))])])\n\n\n# lt_car(LIST)\n# lt_cdr(LIST)\n# ------------\n# Manipulate m4 lists.\n# These macros are necessary as long as will still need to support\n# Autoconf-2.59 which quotes differently.\nm4_define([lt_car], [[$1]])\nm4_define([lt_cdr],\n[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],\n       [$#], 1, [],\n       [m4_dquote(m4_shift($@))])])\nm4_define([lt_unquote], $1)\n\n\n# lt_append(MACRO-NAME, STRING, [SEPARATOR])\n# ------------------------------------------\n# Redefine MACRO-NAME to hold its former content plus `SEPARATOR'`STRING'.\n# Note that neither SEPARATOR nor STRING are expanded; they are appended\n# to MACRO-NAME as is (leaving the expansion for when MACRO-NAME is invoked).\n# No SEPARATOR is output if MACRO-NAME was previously undefined (different\n# than defined and empty).\n#\n# This macro is needed until we can rely on Autoconf 2.62, since earlier\n# versions of m4sugar mistakenly expanded SEPARATOR but not STRING.\nm4_define([lt_append],\n[m4_define([$1],\n\t   m4_ifdef([$1], [m4_defn([$1])[$3]])[$2])])\n\n\n\n# lt_combine(SEP, PREFIX-LIST, INFIX, SUFFIX1, [SUFFIX2...])\n# ----------------------------------------------------------\n# Produce a SEP delimited list of all paired combinations of elements of\n# PREFIX-LIST with SUFFIX1 through SUFFIXn.  Each element of the list\n# has the form PREFIXmINFIXSUFFIXn.\n# Needed until we can rely on m4_combine added in Autoconf 2.62.\nm4_define([lt_combine],\n[m4_if(m4_eval([$# > 3]), [1],\n       [m4_pushdef([_Lt_sep], [m4_define([_Lt_sep], m4_defn([lt_car]))])]]dnl\n[[m4_foreach([_Lt_prefix], [$2],\n\t     [m4_foreach([_Lt_suffix],\n\t\t]m4_dquote(m4_dquote(m4_shift(m4_shift(m4_shift($@)))))[,\n\t[_Lt_sep([$1])[]m4_defn([_Lt_prefix])[$3]m4_defn([_Lt_suffix])])])])])\n\n\n# lt_if_append_uniq(MACRO-NAME, VARNAME, [SEPARATOR], [UNIQ], [NOT-UNIQ])\n# -----------------------------------------------------------------------\n# Iff MACRO-NAME does not yet contain VARNAME, then append it (delimited\n# by SEPARATOR if supplied) and expand UNIQ, else NOT-UNIQ.\nm4_define([lt_if_append_uniq],\n[m4_ifdef([$1],\n\t  [m4_if(m4_index([$3]m4_defn([$1])[$3], [$3$2$3]), [-1],\n\t\t [lt_append([$1], [$2], [$3])$4],\n\t\t [$5])],\n\t  [lt_append([$1], [$2], [$3])$4])])\n\n\n# lt_dict_add(DICT, KEY, VALUE)\n# -----------------------------\nm4_define([lt_dict_add],\n[m4_define([$1($2)], [$3])])\n\n\n# lt_dict_add_subkey(DICT, KEY, SUBKEY, VALUE)\n# --------------------------------------------\nm4_define([lt_dict_add_subkey],\n[m4_define([$1($2:$3)], [$4])])\n\n\n# lt_dict_fetch(DICT, KEY, [SUBKEY])\n# ----------------------------------\nm4_define([lt_dict_fetch],\n[m4_ifval([$3],\n\tm4_ifdef([$1($2:$3)], [m4_defn([$1($2:$3)])]),\n    m4_ifdef([$1($2)], [m4_defn([$1($2)])]))])\n\n\n# lt_if_dict_fetch(DICT, KEY, [SUBKEY], VALUE, IF-TRUE, [IF-FALSE])\n# -----------------------------------------------------------------\nm4_define([lt_if_dict_fetch],\n[m4_if(lt_dict_fetch([$1], [$2], [$3]), [$4],\n\t[$5],\n    [$6])])\n\n\n# lt_dict_filter(DICT, [SUBKEY], VALUE, [SEPARATOR], KEY, [...])\n# --------------------------------------------------------------\nm4_define([lt_dict_filter],\n[m4_if([$5], [], [],\n  [lt_join(m4_quote(m4_default([$4], [[, ]])),\n           lt_unquote(m4_split(m4_normalize(m4_foreach(_Lt_key, lt_car([m4_shiftn(4, $@)]),\n\t\t      [lt_if_dict_fetch([$1], _Lt_key, [$2], [$3], [_Lt_key ])])))))])[]dnl\n])\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/m4/ltversion.m4",
    "content": "# ltversion.m4 -- version numbers\t\t\t-*- Autoconf -*-\n#\n#   Copyright (C) 2004 Free Software Foundation, Inc.\n#   Written by Scott James Remnant, 2004\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# @configure_input@\n\n# serial 3337 ltversion.m4\n# This file is part of GNU Libtool\n\nm4_define([LT_PACKAGE_VERSION], [2.4.2])\nm4_define([LT_PACKAGE_REVISION], [1.3337])\n\nAC_DEFUN([LTVERSION_VERSION],\n[macro_version='2.4.2'\nmacro_revision='1.3337'\n_LT_DECL(, macro_version, 0, [Which release of libtool.m4 was used?])\n_LT_DECL(, macro_revision, 0)\n])\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/m4/lt~obsolete.m4",
    "content": "# lt~obsolete.m4 -- aclocal satisfying obsolete definitions.    -*-Autoconf-*-\n#\n#   Copyright (C) 2004, 2005, 2007, 2009 Free Software Foundation, Inc.\n#   Written by Scott James Remnant, 2004.\n#\n# This file is free software; the Free Software Foundation gives\n# unlimited permission to copy and/or distribute it, with or without\n# modifications, as long as this notice is preserved.\n\n# serial 5 lt~obsolete.m4\n\n# These exist entirely to fool aclocal when bootstrapping libtool.\n#\n# In the past libtool.m4 has provided macros via AC_DEFUN (or AU_DEFUN)\n# which have later been changed to m4_define as they aren't part of the\n# exported API, or moved to Autoconf or Automake where they belong.\n#\n# The trouble is, aclocal is a bit thick.  It'll see the old AC_DEFUN\n# in /usr/share/aclocal/libtool.m4 and remember it, then when it sees us\n# using a macro with the same name in our local m4/libtool.m4 it'll\n# pull the old libtool.m4 in (it doesn't see our shiny new m4_define\n# and doesn't know about Autoconf macros at all.)\n#\n# So we provide this file, which has a silly filename so it's always\n# included after everything else.  This provides aclocal with the\n# AC_DEFUNs it wants, but when m4 processes it, it doesn't do anything\n# because those macros already exist, or will be overwritten later.\n# We use AC_DEFUN over AU_DEFUN for compatibility with aclocal-1.6. \n#\n# Anytime we withdraw an AC_DEFUN or AU_DEFUN, remember to add it here.\n# Yes, that means every name once taken will need to remain here until\n# we give up compatibility with versions before 1.7, at which point\n# we need to keep only those names which we still refer to.\n\n# This is to help aclocal find these macros, as it can't see m4_define.\nAC_DEFUN([LTOBSOLETE_VERSION], [m4_if([1])])\n\nm4_ifndef([AC_LIBTOOL_LINKER_OPTION],\t[AC_DEFUN([AC_LIBTOOL_LINKER_OPTION])])\nm4_ifndef([AC_PROG_EGREP],\t\t[AC_DEFUN([AC_PROG_EGREP])])\nm4_ifndef([_LT_AC_PROG_ECHO_BACKSLASH],\t[AC_DEFUN([_LT_AC_PROG_ECHO_BACKSLASH])])\nm4_ifndef([_LT_AC_SHELL_INIT],\t\t[AC_DEFUN([_LT_AC_SHELL_INIT])])\nm4_ifndef([_LT_AC_SYS_LIBPATH_AIX],\t[AC_DEFUN([_LT_AC_SYS_LIBPATH_AIX])])\nm4_ifndef([_LT_PROG_LTMAIN],\t\t[AC_DEFUN([_LT_PROG_LTMAIN])])\nm4_ifndef([_LT_AC_TAGVAR],\t\t[AC_DEFUN([_LT_AC_TAGVAR])])\nm4_ifndef([AC_LTDL_ENABLE_INSTALL],\t[AC_DEFUN([AC_LTDL_ENABLE_INSTALL])])\nm4_ifndef([AC_LTDL_PREOPEN],\t\t[AC_DEFUN([AC_LTDL_PREOPEN])])\nm4_ifndef([_LT_AC_SYS_COMPILER],\t[AC_DEFUN([_LT_AC_SYS_COMPILER])])\nm4_ifndef([_LT_AC_LOCK],\t\t[AC_DEFUN([_LT_AC_LOCK])])\nm4_ifndef([AC_LIBTOOL_SYS_OLD_ARCHIVE],\t[AC_DEFUN([AC_LIBTOOL_SYS_OLD_ARCHIVE])])\nm4_ifndef([_LT_AC_TRY_DLOPEN_SELF],\t[AC_DEFUN([_LT_AC_TRY_DLOPEN_SELF])])\nm4_ifndef([AC_LIBTOOL_PROG_CC_C_O],\t[AC_DEFUN([AC_LIBTOOL_PROG_CC_C_O])])\nm4_ifndef([AC_LIBTOOL_SYS_HARD_LINK_LOCKS], [AC_DEFUN([AC_LIBTOOL_SYS_HARD_LINK_LOCKS])])\nm4_ifndef([AC_LIBTOOL_OBJDIR],\t\t[AC_DEFUN([AC_LIBTOOL_OBJDIR])])\nm4_ifndef([AC_LTDL_OBJDIR],\t\t[AC_DEFUN([AC_LTDL_OBJDIR])])\nm4_ifndef([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH], [AC_DEFUN([AC_LIBTOOL_PROG_LD_HARDCODE_LIBPATH])])\nm4_ifndef([AC_LIBTOOL_SYS_LIB_STRIP],\t[AC_DEFUN([AC_LIBTOOL_SYS_LIB_STRIP])])\nm4_ifndef([AC_PATH_MAGIC],\t\t[AC_DEFUN([AC_PATH_MAGIC])])\nm4_ifndef([AC_PROG_LD_GNU],\t\t[AC_DEFUN([AC_PROG_LD_GNU])])\nm4_ifndef([AC_PROG_LD_RELOAD_FLAG],\t[AC_DEFUN([AC_PROG_LD_RELOAD_FLAG])])\nm4_ifndef([AC_DEPLIBS_CHECK_METHOD],\t[AC_DEFUN([AC_DEPLIBS_CHECK_METHOD])])\nm4_ifndef([AC_LIBTOOL_PROG_COMPILER_NO_RTTI], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_NO_RTTI])])\nm4_ifndef([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE], [AC_DEFUN([AC_LIBTOOL_SYS_GLOBAL_SYMBOL_PIPE])])\nm4_ifndef([AC_LIBTOOL_PROG_COMPILER_PIC], [AC_DEFUN([AC_LIBTOOL_PROG_COMPILER_PIC])])\nm4_ifndef([AC_LIBTOOL_PROG_LD_SHLIBS],\t[AC_DEFUN([AC_LIBTOOL_PROG_LD_SHLIBS])])\nm4_ifndef([AC_LIBTOOL_POSTDEP_PREDEP],\t[AC_DEFUN([AC_LIBTOOL_POSTDEP_PREDEP])])\nm4_ifndef([LT_AC_PROG_EGREP],\t\t[AC_DEFUN([LT_AC_PROG_EGREP])])\nm4_ifndef([LT_AC_PROG_SED],\t\t[AC_DEFUN([LT_AC_PROG_SED])])\nm4_ifndef([_LT_CC_BASENAME],\t\t[AC_DEFUN([_LT_CC_BASENAME])])\nm4_ifndef([_LT_COMPILER_BOILERPLATE],\t[AC_DEFUN([_LT_COMPILER_BOILERPLATE])])\nm4_ifndef([_LT_LINKER_BOILERPLATE],\t[AC_DEFUN([_LT_LINKER_BOILERPLATE])])\nm4_ifndef([_AC_PROG_LIBTOOL],\t\t[AC_DEFUN([_AC_PROG_LIBTOOL])])\nm4_ifndef([AC_LIBTOOL_SETUP],\t\t[AC_DEFUN([AC_LIBTOOL_SETUP])])\nm4_ifndef([_LT_AC_CHECK_DLFCN],\t\t[AC_DEFUN([_LT_AC_CHECK_DLFCN])])\nm4_ifndef([AC_LIBTOOL_SYS_DYNAMIC_LINKER],\t[AC_DEFUN([AC_LIBTOOL_SYS_DYNAMIC_LINKER])])\nm4_ifndef([_LT_AC_TAGCONFIG],\t\t[AC_DEFUN([_LT_AC_TAGCONFIG])])\nm4_ifndef([AC_DISABLE_FAST_INSTALL],\t[AC_DEFUN([AC_DISABLE_FAST_INSTALL])])\nm4_ifndef([_LT_AC_LANG_CXX],\t\t[AC_DEFUN([_LT_AC_LANG_CXX])])\nm4_ifndef([_LT_AC_LANG_F77],\t\t[AC_DEFUN([_LT_AC_LANG_F77])])\nm4_ifndef([_LT_AC_LANG_GCJ],\t\t[AC_DEFUN([_LT_AC_LANG_GCJ])])\nm4_ifndef([AC_LIBTOOL_LANG_C_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_C_CONFIG])])\nm4_ifndef([_LT_AC_LANG_C_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_C_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_CXX_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_CXX_CONFIG])])\nm4_ifndef([_LT_AC_LANG_CXX_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_CXX_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_F77_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_F77_CONFIG])])\nm4_ifndef([_LT_AC_LANG_F77_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_F77_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_GCJ_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_GCJ_CONFIG])])\nm4_ifndef([_LT_AC_LANG_GCJ_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_GCJ_CONFIG])])\nm4_ifndef([AC_LIBTOOL_LANG_RC_CONFIG],\t[AC_DEFUN([AC_LIBTOOL_LANG_RC_CONFIG])])\nm4_ifndef([_LT_AC_LANG_RC_CONFIG],\t[AC_DEFUN([_LT_AC_LANG_RC_CONFIG])])\nm4_ifndef([AC_LIBTOOL_CONFIG],\t\t[AC_DEFUN([AC_LIBTOOL_CONFIG])])\nm4_ifndef([_LT_AC_FILE_LTDLL_C],\t[AC_DEFUN([_LT_AC_FILE_LTDLL_C])])\nm4_ifndef([_LT_REQUIRED_DARWIN_CHECKS],\t[AC_DEFUN([_LT_REQUIRED_DARWIN_CHECKS])])\nm4_ifndef([_LT_AC_PROG_CXXCPP],\t\t[AC_DEFUN([_LT_AC_PROG_CXXCPP])])\nm4_ifndef([_LT_PREPARE_SED_QUOTE_VARS],\t[AC_DEFUN([_LT_PREPARE_SED_QUOTE_VARS])])\nm4_ifndef([_LT_PROG_ECHO_BACKSLASH],\t[AC_DEFUN([_LT_PROG_ECHO_BACKSLASH])])\nm4_ifndef([_LT_PROG_F77],\t\t[AC_DEFUN([_LT_PROG_F77])])\nm4_ifndef([_LT_PROG_FC],\t\t[AC_DEFUN([_LT_PROG_FC])])\nm4_ifndef([_LT_PROG_CXX],\t\t[AC_DEFUN([_LT_PROG_CXX])])\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/m4/mbedtls.m4",
    "content": "dnl Check to find the mbed TLS headers/libraries\n\nAC_DEFUN([ss_MBEDTLS],\n[\n\n  AC_ARG_WITH(mbedtls,\n    AS_HELP_STRING([--with-mbedtls=DIR], [mbed TLS base directory, or:]),\n    [mbedtls=\"$withval\"\n     CFLAGS=\"$CFLAGS -I$withval/include\"\n     LDFLAGS=\"$LDFLAGS -L$withval/lib\"]\n  )\n\n  AC_ARG_WITH(mbedtls-include,\n    AS_HELP_STRING([--with-mbedtls-include=DIR], [mbed TLS headers directory (without trailing /mbedtls)]),\n    [mbedtls_include=\"$withval\"\n     CFLAGS=\"$CFLAGS -I$withval\"]\n  )\n\n  AC_ARG_WITH(mbedtls-lib,\n    AS_HELP_STRING([--with-mbedtls-lib=DIR], [mbed TLS library directory]),\n    [mbedtls_lib=\"$withval\"\n     LDFLAGS=\"$LDFLAGS -L$withval\"]\n  )\n\n  AC_CHECK_LIB(mbedcrypto, mbedtls_cipher_setup,\n    [LIBS=\"-lmbedcrypto $LIBS\"],\n    [AC_MSG_ERROR([mbed TLS libraries not found.])]\n  )\n\n  AC_MSG_CHECKING([whether mbedtls supports Cipher Feedback mode or not])\n  AC_COMPILE_IFELSE(\n    [AC_LANG_PROGRAM(\n      [[\n#include <mbedtls/config.h>\n      ]],\n      [[\n#ifndef MBEDTLS_CIPHER_MODE_CFB\n#error Cipher Feedback mode a.k.a CFB not supported by your mbed TLS.\n#endif\n      ]]\n    )],\n    [AC_MSG_RESULT([ok])],\n    [AC_MSG_ERROR([MBEDTLS_CIPHER_MODE_CFB required])]\n  )\n\n\n  AC_MSG_CHECKING([whether mbedtls supports the ARC4 stream cipher or not])\n  AC_COMPILE_IFELSE(\n    [AC_LANG_PROGRAM(\n      [[\n#include <mbedtls/config.h>\n      ]],\n      [[\n#ifndef MBEDTLS_ARC4_C\n#error the ARC4 stream cipher not supported by your mbed TLS.\n#endif\n      ]]\n    )],\n    [AC_MSG_RESULT([ok])],\n    [AC_MSG_ERROR([MBEDTLS_ARC4_C required])]\n  )\n\n  AC_MSG_CHECKING([whether mbedtls supports the Blowfish block cipher or not])\n  AC_COMPILE_IFELSE(\n    [AC_LANG_PROGRAM(\n      [[\n#include <mbedtls/config.h>\n      ]],\n      [[\n#ifndef MBEDTLS_BLOWFISH_C\n#error the Blowfish block cipher not supported by your mbed TLS.\n#endif\n      ]]\n    )],\n    [AC_MSG_RESULT([ok])],\n    [AC_MSG_ERROR([MBEDTLS_BLOWFISH_C required])]\n  )\n\n  AC_MSG_CHECKING([whether mbedtls supports the Camellia block cipher or not])\n  AC_COMPILE_IFELSE(\n    [AC_LANG_PROGRAM(\n      [[\n#include <mbedtls/config.h>\n      ]],\n      [[\n#ifndef MBEDTLS_CAMELLIA_C\n#error the Camellia block cipher not supported by your mbed TLS.\n#endif\n      ]]\n    )],\n    [AC_MSG_RESULT([ok])],\n    [AC_MSG_ERROR([MBEDTLS_CAMELLIA_C required])]\n  )\n])\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/m4/openssl.m4",
    "content": "dnl Check to find the OpenSSL headers/libraries\n\nAC_DEFUN([ss_OPENSSL],\n[\n  case $host_os in\n    *mingw*)\n    ;;\n    *)\n      AC_CHECK_FUNC(dlopen,\n        [],\n        [AC_CHECK_LIB(dl, dlopen,\n          [LIBS=\"$LIBS -ldl\"],\n          [AC_MSG_ERROR([OpenSSL depends on libdl.]); break]\n        )]\n      )\n    ;;\n  esac\n\n  AC_ARG_WITH(openssl,\n    AS_HELP_STRING([--with-openssl=DIR], [OpenSSL base directory, or:]),\n    [openssl=\"$withval\"\n     CFLAGS=\"$CFLAGS -I$withval/include\"\n     LDFLAGS=\"$LDFLAGS -L$withval/lib\"]\n  )\n\n  AC_ARG_WITH(openssl-include,\n    AS_HELP_STRING([--with-openssl-include=DIR], [OpenSSL headers directory (without trailing /openssl)]),\n    [openssl_include=\"$withval\"\n     CFLAGS=\"$CFLAGS -I$withval\"]\n  )\n\n  AC_ARG_WITH(openssl-lib,\n    AS_HELP_STRING([--with-openssl-lib=DIR], [OpenSSL library directory]),\n    [openssl_lib=\"$withval\"\n     LDFLAGS=\"$LDFLAGS -L$withval\"]\n  )\n\n  AC_CHECK_HEADERS(openssl/evp.h openssl/rsa.h openssl/rand.h openssl/err.h openssl/sha.h openssl/pem.h openssl/engine.h,\n    [],\n    [AC_MSG_ERROR([OpenSSL header files not found.]); break]\n  )\n\n  AC_CHECK_LIB(crypto, EVP_EncryptInit_ex,\n    [LIBS=\"-lcrypto $LIBS\"],\n    [AC_MSG_ERROR([OpenSSL libraries not found.])]\n  )\n\n  AC_CHECK_FUNCS([RAND_pseudo_bytes EVP_EncryptInit_ex], ,\n    [AC_MSG_ERROR([Missing OpenSSL functionality, make sure you have installed the latest version.]); break],\n  )\n\n  AC_CHECK_DECL([OpenSSL_add_all_algorithms], ,\n    [AC_MSG_ERROR([Missing OpenSSL functionality, make sure you have installed the latest version.]); break],\n    [#include <openssl/evp.h>]\n  )\n])\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/m4/pcre.m4",
    "content": "dnl -------------------------------------------------------- -*- autoconf -*-\ndnl Licensed to the Apache Software Foundation (ASF) under one or more\ndnl contributor license agreements.  See the NOTICE file distributed with\ndnl this work for additional information regarding copyright ownership.\ndnl The ASF licenses this file to You under the Apache License, Version 2.0\ndnl (the \"License\"); you may not use this file except in compliance with\ndnl the License.  You may obtain a copy of the License at\ndnl\ndnl     http://www.apache.org/licenses/LICENSE-2.0\ndnl\ndnl Unless required by applicable law or agreed to in writing, software\ndnl distributed under the License is distributed on an \"AS IS\" BASIS,\ndnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\ndnl See the License for the specific language governing permissions and\ndnl limitations under the License.\n\ndnl\ndnl TS_ADDTO(variable, value)\ndnl\ndnl  Add value to variable\ndnl\nAC_DEFUN([TS_ADDTO], [\n  if test \"x$$1\" = \"x\"; then\n    test \"x$verbose\" = \"xyes\" && echo \"  setting $1 to \\\"$2\\\"\"\n    $1=\"$2\"\n  else\n    ats_addto_bugger=\"$2\"\n    for i in $ats_addto_bugger; do\n      ats_addto_duplicate=\"0\"\n      for j in $$1; do\n        if test \"x$i\" = \"x$j\"; then\n          ats_addto_duplicate=\"1\"\n          break\n        fi\n      done\n      if test $ats_addto_duplicate = \"0\"; then\n        test \"x$verbose\" = \"xyes\" && echo \"  adding \\\"$i\\\" to $1\"\n        $1=\"$$1 $i\"\n      fi\n    done\n  fi\n])dnl\n\ndnl\ndnl TS_ADDTO_RPATH(path)\ndnl\ndnl   Adds path to variable with the '-rpath' directive.\ndnl\nAC_DEFUN([TS_ADDTO_RPATH], [\n  AC_MSG_NOTICE([adding $1 to RPATH])\n  TS_ADDTO(LIBTOOL_LINK_FLAGS, [-R$1])\n])dnl\n\ndnl\ndnl pcre.m4: Trafficserver's pcre autoconf macros\ndnl\n\ndnl\ndnl TS_CHECK_PCRE: look for pcre libraries and headers\ndnl\nAC_DEFUN([TS_CHECK_PCRE], [\nenable_pcre=no\nAC_ARG_WITH(pcre, [AC_HELP_STRING([--with-pcre=DIR],[use a specific pcre library])],\n[\n  if test \"x$withval\" != \"xyes\" && test \"x$withval\" != \"x\"; then\n    pcre_base_dir=\"$withval\"\n    if test \"$withval\" != \"no\"; then\n      enable_pcre=yes\n      case \"$withval\" in\n      *\":\"*)\n        pcre_include=\"`echo $withval |sed -e 's/:.*$//'`\"\n        pcre_ldflags=\"`echo $withval |sed -e 's/^.*://'`\"\n        AC_MSG_CHECKING(checking for pcre includes in $pcre_include libs in $pcre_ldflags )\n        ;;\n      *)\n        pcre_include=\"$withval/include\"\n        pcre_ldflags=\"$withval/lib\"\n        AC_MSG_CHECKING(checking for pcre includes in $withval)\n        ;;\n      esac\n    fi\n  fi\n],\n[\n  AC_CHECK_PROG(PCRE_CONFIG, pcre-config, pcre-config)\n  if test \"x$PCRE_CONFIG\" != \"x\"; then\n    enable_pcre=yes\n    pcre_base_dir=\"`$PCRE_CONFIG --prefix`\"\n    pcre_include=\"`$PCRE_CONFIG --cflags | sed -es/-I//`\"\n    pcre_ldflags=\"`$PCRE_CONFIG --libs | sed -es/-lpcre// -es/-L//`\"\n  fi\n])\n\nif test \"x$pcre_base_dir\" = \"x\"; then\n  AC_MSG_CHECKING([for pcre location])\n  AC_CACHE_VAL(ats_cv_pcre_dir,[\n  for dir in /usr/local /usr ; do\n    if test -d $dir && ( test -f $dir/include/pcre.h || test -f $dir/include/pcre/pcre.h ); then\n      ats_cv_pcre_dir=$dir\n      break\n    fi\n  done\n  ])\n  pcre_base_dir=$ats_cv_pcre_dir\n  if test \"x$pcre_base_dir\" = \"x\"; then\n    enable_pcre=no\n    AC_MSG_RESULT([not found])\n  else\n    enable_pcre=yes\n    pcre_include=\"$pcre_base_dir/include\"\n    pcre_ldflags=\"$pcre_base_dir/lib\"\n    AC_MSG_RESULT([$pcre_base_dir])\n  fi\nelse\n  AC_MSG_CHECKING(for pcre headers in $pcre_include)\n  if test -d $pcre_include && test -d $pcre_ldflags && ( test -f $pcre_include/pcre.h || test -f $pcre_include/pcre/pcre.h ); then\n    AC_MSG_RESULT([ok])\n  else\n    AC_MSG_RESULT([not found])\n  fi\nfi\n\npcreh=0\npcre_pcreh=0\nif test \"$enable_pcre\" != \"no\"; then\n  saved_ldflags=$LDFLAGS\n  saved_cppflags=$CFLAGS\n  pcre_have_headers=0\n  pcre_have_libs=0\n  if test \"$pcre_base_dir\" != \"/usr\"; then\n    TS_ADDTO(CFLAGS, [-I${pcre_include}])\n    TS_ADDTO(CFLAGS, [-DPCRE_STATIC])\n    TS_ADDTO(LDFLAGS, [-L${pcre_ldflags}])\n    TS_ADDTO_RPATH(${pcre_ldflags})\n  fi\n  AC_SEARCH_LIBS([pcre_exec], [pcre], [pcre_have_libs=1])\n  if test \"$pcre_have_libs\" != \"0\"; then\n    AC_CHECK_HEADERS(pcre.h, [pcre_have_headers=1])\n    AC_CHECK_HEADERS(pcre/pcre.h, [pcre_have_headers=1])\n  fi\n  if test \"$pcre_have_headers\" != \"0\"; then\n    AC_DEFINE(HAVE_LIBPCRE,1,[Compiling with pcre support])\n    AC_SUBST(LIBPCRE, [-lpcre])\n  else\n    enable_pcre=no\n    CFLAGS=$saved_cppflags\n    LDFLAGS=$saved_ldflags\n  fi\nfi\nAC_SUBST(pcreh)\nAC_SUBST(pcre_pcreh)\n])\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/m4/polarssl.m4",
    "content": "dnl Check to find the PolarSSL headers/libraries\n\nAC_DEFUN([ss_POLARSSL],\n[\n\n  AC_ARG_WITH(polarssl,\n    AS_HELP_STRING([--with-polarssl=DIR], [PolarSSL base directory, or:]),\n    [polarssl=\"$withval\"\n     CFLAGS=\"$CFLAGS -I$withval/include\"\n     LDFLAGS=\"$LDFLAGS -L$withval/lib\"]\n  )\n\n  AC_ARG_WITH(polarssl-include,\n    AS_HELP_STRING([--with-polarssl-include=DIR], [PolarSSL headers directory (without trailing /polarssl)]),\n    [polarssl_include=\"$withval\"\n     CFLAGS=\"$CFLAGS -I$withval\"]\n  )\n\n  AC_ARG_WITH(polarssl-lib,\n    AS_HELP_STRING([--with-polarssl-lib=DIR], [PolarSSL library directory]),\n    [polarssl_lib=\"$withval\"\n     LDFLAGS=\"$LDFLAGS -L$withval\"]\n  )\n\n  AC_CHECK_LIB(polarssl, cipher_init_ctx,\n    [LIBS=\"-lpolarssl $LIBS\"],\n    [AC_MSG_ERROR([PolarSSL libraries not found.])]\n  )\n\n  AC_MSG_CHECKING([polarssl version])\n  AC_COMPILE_IFELSE(\n    [AC_LANG_PROGRAM(\n      [[\n#include <polarssl/version.h>\n      ]],\n      [[\n#if POLARSSL_VERSION_NUMBER < 0x01020500\n#error invalid version\n#endif\n      ]]\n    )],\n    [AC_MSG_RESULT([ok])],\n    [AC_MSG_ERROR([PolarSSL 1.2.5 or newer required])]\n  )\n])\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/m4/stack-protector.m4",
    "content": "#\n# Copyright 2007 Google Inc.\n#\n# Licensed under the Apache License, Version 2.0 (the \"License\");\n# you may not use this file except in compliance with the License.\n# You may obtain a copy of the License at\n#\n#      http://www.apache.org/licenses/LICENSE-2.0\n#\n# Unless required by applicable law or agreed to in writing, software\n# distributed under the License is distributed on an \"AS IS\" BASIS,\n# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n# See the License for the specific language governing permissions and\n# limitations under the License.\n#\n# GGL_CHECK_STACK_PROTECTOR([ACTION-IF-OK], [ACTION-IF-NOT-OK])\n# Check if c compiler supports -fstack-protector and -fstack-protector-all\n# options.\n\nAC_DEFUN([GGL_CHECK_STACK_PROTECTOR], [\nggl_check_stack_protector_save_CXXFLAGS=\"$CXXFLAGS\"\nggl_check_stack_protector_save_CFLAGS=\"$CFLAGS\"\n\nAC_MSG_CHECKING([if -fstack-protector and -fstack-protector-all are supported.])\n\nCXXFLAGS=\"$CXXFLAGS -fstack-protector\"\nCFLAGS=\"$CFLAGS -fstack-protector\"\nAC_COMPILE_IFELSE([AC_LANG_SOURCE([\nint main() {\n  return 0;\n}\n])],\n[ggl_check_stack_protector_ok=yes],\n[ggl_check_stack_protector_ok=no])\n\nCXXFLAGS=\"$ggl_check_stack_protector_save_CXXFLAGS -fstack-protector-all\"\nCFLAGS=\"$ggl_check_stack_protector_save_CFLAGS -fstack-protector-all\"\nAC_COMPILE_IFELSE([AC_LANG_SOURCE([\nint main() {\n  return 0;\n}\n])],\n[ggl_check_stack_protector_all_ok=yes],\n[ggl_check_stack_protector_all_ok=no])\n\nif test \"x$ggl_check_stack_protector_ok\" = \"xyes\" -a \\\n        \"x$ggl_check_stack_protector_all_ok\" = \"xyes\"; then\n  AC_MSG_RESULT([yes])\n  ifelse([$1], , :, [$1])\nelse\n  AC_MSG_RESULT([no])\n  ifelse([$2], , :, [$2])\nfi\n\nCXXFLAGS=\"$ggl_check_stack_protector_save_CXXFLAGS\"\nCFLAGS=\"$ggl_check_stack_protector_save_CFLAGS\"\n\n]) # GGL_CHECK_STACK_PROTECTOR\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/m4/zlib.m4",
    "content": "dnl Check to find the zlib headers/libraries\n\nAC_DEFUN([ss_ZLIB],\n[\n  AC_ARG_ENABLE([zlib],\n    AS_HELP_STRING([--disable-zlib], [disable zlib compression support]))\n  AS_IF([test \"x$enable_zlib\" != \"xno\"], [\n  AC_DEFINE(HAVE_ZLIB, 1, [have zlib compression support])\n    AC_ARG_WITH(zlib,\n      AS_HELP_STRING([--with-zlib=DIR], [zlib base directory, or:]),\n      [zlib=\"$withval\"\n       CPPFLAGS=\"$CPPFLAGS -I$withval/include\"\n       LDFLAGS=\"$LDFLAGS -L$withval/lib\"]\n    )\n\n    AC_ARG_WITH(zlib-include,\n      AS_HELP_STRING([--with-zlib-include=DIR], [zlib headers directory]),\n      [zlib_include=\"$withval\"\n       CPPFLAGS=\"$CPPFLAGS -I$withval\"]\n    )\n\n    AC_ARG_WITH(zlib-lib,\n      AS_HELP_STRING([--with-zlib-lib=DIR], [zlib library directory]),\n      [zlib_lib=\"$withval\"\n       LDFLAGS=\"$LDFLAGS -L$withval\"]\n    )\n\n    AC_CHECK_HEADERS(zlib.h,\n      [],\n      [AC_MSG_ERROR(\"zlib header files not found.\"); break]\n    )\n\n    AC_CHECK_LIB(z, compress2,\n      [LIBS=\"$LIBS -lz\"],\n      [AC_MSG_ERROR(\"zlib libraries not found.\")]\n    )\n  ])\n])\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/rpm/SOURCES/etc/init.d/shadowsocks-libev",
    "content": "#!/bin/bash\n#\n# Script to run Shadowsocks in daemon mode at boot time.\n# ScriptAuthor: icyboy\n# Revision 1.0 - 14th Sep 2013\n#====================================================================\n# Run level information:\n# chkconfig: 2345 99 99\n# Description: lightweight secured socks5 proxy\n# processname: ss-server\n# Author: Max Lv <max.c.lv@gmail.com>;\n# Run \"/sbin/chkconfig --add shadowsocks\" to add the Run levels.\n#====================================================================\n\n#====================================================================\n# Paths and variables and system checks.\n\n# Source function library\n. /etc/rc.d/init.d/functions\n\n# Check that networking is up.\n#\n[ ${NETWORKING} =\"yes\" ] || exit 0\n\n# Daemon\nNAME=shadowsocks-server\nDAEMON=/usr/bin/ss-server\n\n# Path to the configuration file.\n#\nCONF=/etc/shadowsocks-libev/config.json\n\n#USER=\"nobody\"\n#GROUP=\"nobody\"\n\n# Take care of pidfile permissions\nmkdir /var/run/$NAME 2>/dev/null || true\n#chown \"$USER:$GROUP\" /var/run/$NAME\n\n# Check the configuration file exists.\n#\nif [ ! -f $CONF ] ; then\necho \"The configuration file cannot be found!\"\nexit 0\nfi\n\n# Path to the lock file.\n#\nLOCK_FILE=/var/lock/subsys/shadowsocks\n\n# Path to the pid file.\n#\nPID=/var/run/$NAME/pid\n\n\n#====================================================================\n\n#====================================================================\n# Run controls:\n\nRETVAL=0\n\n# Start shadowsocks as daemon.\n#\nstart() {\nif [ -f $LOCK_FILE ]; then\necho \"$NAME is already running!\"\nexit 0\nelse\necho -n $\"Starting ${NAME}: \"\n#daemon --check $DAEMON --user $USER \"$DAEMON -f $PID -c $CONF > /dev/null\"\ndaemon $DAEMON -u -c $CONF -f $PID\nfi\n\nRETVAL=$?\n[ $RETVAL -eq 0 ] && success\necho\n[ $RETVAL -eq 0 ] && touch $LOCK_FILE\nreturn $RETVAL\n}\n\n\n# Stop shadowsocks.\n#\nstop() {\necho -n $\"Shutting down ${NAME}: \"\nkillproc -p ${PID}\nRETVAL=$?\n[ $RETVAL -eq 0 ]\nrm -f $LOCK_FILE\nrm -f ${PID}\necho\nreturn $RETVAL\n}\n\n# See how we were called.\ncase \"$1\" in\nstart)\nstart\n;;\nstop)\nstop\n;;\nrestart)\nstop\nstart\n;;\ncondrestart)\nif [ -f $LOCK_FILE ]; then\nstop\nstart\nRETVAL=$?\nfi\n;;\nstatus)\nstatus $DAEMON\nRETVAL=$?\n;;\n*)\necho $\"Usage: $0 {start|stop|restart|condrestart|status}\"\nRETVAL=1\nesac\n\nexit $RETVAL\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/rpm/SPECS/shadowsocks-libev.spec.in",
    "content": "Name:\t\tshadowsocks-libev\nVersion:\tVERSION\nRelease:\t1%{?dist}\nSummary:\tA lightweight and secure socks5 proxy\n\nGroup:\t\tApplications/Internet\nLicense:\tGPLv3+\nURL:\t\thttps://github.com/shadowsocks/%{name}\nSource0:\t%{url}/archive/v%{version}.tar.gz\n\nAutoReq:        no\nConflicts:\t    python-shadowsocks python3-shadowsocks\nBuildRequires:\tmake gcc pcre-devel asciidoc xmlto\nRequires:       pcre\n\n%if 0%{?suse_version}\nRequires:       libopenssl1_0_0\nBuildRequires:  libopenssl-devel\n%else\nRequires:       openssl\nBuildRequires:  openssl-devel\n%endif\n\n%if 0%{?fedora} >= 15 || 0%{?rhel} >=7 || 0%{?suse_version} >= 1210\n%global use_systemd 1\n%else\n%global use_systemd 0\n%endif\n\n%if 0%{?use_systemd}\n%{?systemd_requires}\n%if 0%{?suse_version}\nBuildRequires:   systemd-rpm-macros\n%else\nBuildRequires:   systemd\n%endif\n%endif\n\n%if 0%{?use_system_lib}\nBuildRequires:  libev-devel libsodium-devel >= 1.0.4 udns-devel\nRequires:       libev libsodium >= 1.0.4 udns\n%endif\n\n\n%description\nshadowsocks-libev is a lightweight secured scoks5 proxy for embedded devices and low end boxes.\n\n\n%prep\n%setup -q\n\n\n%build\n%if 0%{?use_system_lib}\n%configure --enable-shared --enable-system-shared-lib\n%else\n%configure --enable-shared\n%endif\nmake %{?_smp_mflags}\n\n\n%install\nmake install DESTDIR=%{buildroot}\nmkdir -p %{buildroot}/etc/shadowsocks-libev\n%if ! 0%{?use_systemd}\nmkdir -p %{buildroot}%{_initddir}\ninstall -m 755 %{_builddir}/%{buildsubdir}/rpm/SOURCES/etc/init.d/shadowsocks-libev %{buildroot}%{_initddir}/shadowsocks-libev\n%else\nmkdir -p %{buildroot}%{_sysconfdir}/default\nmkdir -p %{buildroot}%{_unitdir}\ninstall -m 644 %{_builddir}/%{buildsubdir}/debian/shadowsocks-libev.default %{buildroot}%{_sysconfdir}/default/shadowsocks-libev\ninstall -m 644 %{_builddir}/%{buildsubdir}/debian/shadowsocks-libev.service %{buildroot}%{_unitdir}/shadowsocks-libev.service\ninstall -m 644 %{_builddir}/%{buildsubdir}/debian/shadowsocks-libev-*.service %{buildroot}%{_unitdir}/\n%endif\ninstall -m 644 %{_builddir}/%{buildsubdir}/debian/config.json %{buildroot}%{_sysconfdir}/shadowsocks-libev/config.json\nmkdir -p %{buildroot}%{_datadir}/bash-completion/completions/\ninstall -m 644 %{_builddir}/%{buildsubdir}/completions/bash/* %{buildroot}%{_datadir}/bash-completion/completions/\n\n%pre\n%if 0%{?use_systemd} && 0%{?suse_version}\n%service_add_pre shadowsocks-libev.service\n%endif\n\n%post\n%if ! 0%{?use_systemd}\n/sbin/chkconfig --add shadowsocks-libev > /dev/null 2>&1 || :\n%else\n%if 0%{?suse_version}\n%service_add_post shadowsocks-libev.service\n%else\n%systemd_post shadowsocks-libev.service\n%endif\n%endif\n\n%preun\n%if ! 0%{?use_systemd}\nif [ $1 -eq 0 ]; then\n    /sbin/service shadowsocks-libev stop  > /dev/null 2>&1 || :\n    /sbin/chkconfig --del shadowsocks-libev > /dev/null 2>&1 || :\nfi\n%else\n%if 0%{?suse_version}\n%service_del_preun shadowsocks-libev.service\n%else\n%systemd_preun shadowsocks-libev.service\n%endif\n%endif\n\n%postun\n%if 0%{?use_systemd}\n%if 0%{?suse_version}\n%service_del_postun shadowsocks-libev.service\n%else\n%systemd_postun_with_restart shadowsocks-libev.service\n%endif\n%endif\n\n%files\n/usr/share/doc/shadowsocks-libev/shadowsocks-libev.html\n/usr/share/doc/shadowsocks-libev/ss-local.html\n/usr/share/doc/shadowsocks-libev/ss-manager.html\n/usr/share/doc/shadowsocks-libev/ss-nat.html\n/usr/share/doc/shadowsocks-libev/ss-redir.html\n/usr/share/doc/shadowsocks-libev/ss-server.html\n/usr/share/doc/shadowsocks-libev/ss-tunnel.html\n%{_bindir}/*\n%{_libdir}/*.so.*\n%config(noreplace) %{_sysconfdir}/shadowsocks-libev/config.json\n%{_datadir}/bash-completion/completions/*\n%doc %{_mandir}/*\n%if ! 0%{?use_systemd}\n%{_initddir}/shadowsocks-libev\n%else\n%{_unitdir}/shadowsocks-libev.service\n%{_unitdir}/shadowsocks-libev-*.service\n%config(noreplace) %{_sysconfdir}/default/shadowsocks-libev\n%endif\n\n%package devel\nSummary:    Development files for shadowsocks-libev\nGroup:      Applications/Internet\nLicense:    GPLv3+\nRequires:   shadowsocks-libev == %{version}-%{release}\n\n%description devel\nDevelopment files for shadowsocks-libev\n\n%files devel\n%{_includedir}/*\n%{_libdir}/pkgconfig/*.pc\n%{_libdir}/libshadowsocks-libev.la\n%{_libdir}/libshadowsocks-libev.so\n\n%changelog\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/rpm/genrpm.sh",
    "content": "#!/usr/bin/env bash\nset -e\n\nshow_help()\n{\n    echo -e \"`basename $0`  [option] [argument]\"\n    echo\n    echo -e \"Options:\"\n    echo -e \"  -h    show this help.\"\n    echo -e \"  -v    with argument version (2.5.6 by default).\"\n    echo -e \"  -f    with argument format (tar.xz by default) used by git archive.\"\n    echo\n    echo -e \"Examples:\"\n    echo -e \"  to build base on version \\`2.4.1' with format \\`tar.xz', run:\"\n    echo -e \"    `basename $0` -f tar.xz -v 2.4.1\"\n}\n\nwhile getopts \"hv:f:\" opt\ndo\n    case ${opt} in\n        h)\n            show_help\n            exit 0\n            ;;\n        v)\n            if [ \"${OPTARG}\" = v* ]; then\n                version=${OPTARG#\"v\"}\n            else\n                version=${OPTARG}\n            fi\n            ;;\n        f)\n            format=${OPTARG}\n            ;;\n        *)\n            exit 1\n            ;;\n    esac\ndone\n\n: ${version:=2.5.6}\n: ${format:=tar.gz}\n\nname=\"shadowsocks-libev\"\nspec_name=\"shadowsocks-libev.spec\"\n\npushd `git rev-parse --show-toplevel`\ngit archive \"v${version}\" --format=\"${format}\" --prefix=\"${name}-${version}/\" -o rpm/SOURCES/\"${name}-${version}.${format}\"\npushd rpm\n\nsed -e \"s/^\\(Version:\t\\).*$/\\1${version}/\" \\\n    -e \"s/^\\(Source0:\t\\).*$/\\1${name}-${version}.${format}/\" \\\n    SPECS/\"${spec_name}\".in > SPECS/\"${spec_name}\"\n\nrpmbuild -bb SPECS/\"${spec_name}\" --define \"%_topdir `pwd`\"\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/Makefile.am",
    "content": "VERSION_INFO = 2:0:0\n\nAM_CFLAGS = -g -O2 -Wall -Werror -Wno-deprecated-declarations -fno-strict-aliasing -std=gnu99 -D_GNU_SOURCE\nAM_CFLAGS += $(PTHREAD_CFLAGS)\nif !USE_SYSTEM_SHARED_LIB\nAM_CFLAGS += -I$(top_srcdir)/libev\nAM_CFLAGS += -I$(top_srcdir)/libudns\nAM_CFLAGS += -I$(top_srcdir)/libsodium/src/libsodium/include\nendif\nAM_CFLAGS += -I$(top_srcdir)/libipset/include\nAM_CFLAGS += -I$(top_srcdir)/libcork/include\nAM_CFLAGS += $(LIBPCRE_CFLAGS)\n\nSS_COMMON_LIBS = $(top_builddir)/libipset/libipset.la \\\n                 $(top_builddir)/libcork/libcork.la \\\n                 $(INET_NTOP_LIB) $(LIBPCRE_LIBS)\nif USE_SYSTEM_SHARED_LIB\nSS_COMMON_LIBS += -lev -lsodium -lm\nelse\nSS_COMMON_LIBS += $(top_builddir)/libev/libev.la \\\n                  $(top_builddir)/libsodium/src/libsodium/libsodium.la\nendif\n\nbin_PROGRAMS = ss-server ss-check\n\nsni_src = http.c \\\n          tls.c \\\n          rule.c\n\nss_check_SOURCES = check.c \n\nss_server_SOURCES = utils.c \\\n                    netutils.c \\\n                    jconf.c \\\n                    json.c \\\n                    encrypt.c \\\n                    udprelay.c \\\n                    cache.c \\\n                    acl.c \\\n                    resolv.c \\\n                    server.c \\\n                    $(sni_src)\n\n\nss_check_LDADD = $(SS_COMMON_LIBS)\nss_server_LDADD = $(SS_COMMON_LIBS)\n\nif USE_SYSTEM_SHARED_LIB\nss_server_LDADD += -ludns\nelse\nss_server_LDADD += $(top_builddir)/libudns/libudns.la\nendif\n\nss_check_CFLAGS = $(AM_CFLAGS) \nss_server_CFLAGS = $(AM_CFLAGS) -DMODULE_REMOTE\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/Makefile.in",
    "content": "# Makefile.in generated by automake 1.15 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2014 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\nam__is_gnu_make = { \\\n  if test -z '$(MAKELEVEL)'; then \\\n    false; \\\n  elif test -n '$(MAKE_HOST)'; then \\\n    true; \\\n  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \\\n    true; \\\n  else \\\n    false; \\\n  fi; \\\n}\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\n@USE_SYSTEM_SHARED_LIB_FALSE@am__append_1 = -I$(top_srcdir)/libev \\\n@USE_SYSTEM_SHARED_LIB_FALSE@\t-I$(top_srcdir)/libudns \\\n@USE_SYSTEM_SHARED_LIB_FALSE@\t-I$(top_srcdir)/libsodium/src/libsodium/include\n@USE_SYSTEM_SHARED_LIB_TRUE@am__append_2 = -lev -lsodium -lm\n@USE_SYSTEM_SHARED_LIB_FALSE@am__append_3 = $(top_builddir)/libev/libev.la \\\n@USE_SYSTEM_SHARED_LIB_FALSE@                  $(top_builddir)/libsodium/src/libsodium/libsodium.la\n\nbin_PROGRAMS = ss-server$(EXEEXT) ss-check$(EXEEXT)\n@USE_SYSTEM_SHARED_LIB_TRUE@am__append_4 = -ludns\n@USE_SYSTEM_SHARED_LIB_FALSE@am__append_5 = $(top_builddir)/libudns/libudns.la\nsubdir = server\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \\\n\t$(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/inet_ntop.m4 \\\n\t$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \\\n\t$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \\\n\t$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/mbedtls.m4 \\\n\t$(top_srcdir)/m4/openssl.m4 $(top_srcdir)/m4/pcre2.m4 \\\n\t$(top_srcdir)/m4/polarssl.m4 \\\n\t$(top_srcdir)/m4/stack-protector.m4 $(top_srcdir)/m4/zlib.m4 \\\n\t$(top_srcdir)/libev/libev.m4 $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nDIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nam__installdirs = \"$(DESTDIR)$(bindir)\"\nPROGRAMS = $(bin_PROGRAMS)\nam_ss_check_OBJECTS = ss_check-check.$(OBJEXT)\nss_check_OBJECTS = $(am_ss_check_OBJECTS)\nam__DEPENDENCIES_1 =\nam__DEPENDENCIES_2 = $(top_builddir)/libipset/libipset.la \\\n\t$(top_builddir)/libcork/libcork.la $(am__DEPENDENCIES_1) \\\n\t$(am__DEPENDENCIES_1) $(am__append_3)\nss_check_DEPENDENCIES = $(am__DEPENDENCIES_2)\nAM_V_lt = $(am__v_lt_@AM_V@)\nam__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)\nam__v_lt_0 = --silent\nam__v_lt_1 =\nss_check_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(ss_check_CFLAGS) \\\n\t$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nam__objects_1 = ss_server-http.$(OBJEXT) ss_server-tls.$(OBJEXT) \\\n\tss_server-rule.$(OBJEXT)\nam_ss_server_OBJECTS = ss_server-utils.$(OBJEXT) \\\n\tss_server-netutils.$(OBJEXT) ss_server-jconf.$(OBJEXT) \\\n\tss_server-json.$(OBJEXT) ss_server-encrypt.$(OBJEXT) \\\n\tss_server-udprelay.$(OBJEXT) ss_server-cache.$(OBJEXT) \\\n\tss_server-acl.$(OBJEXT) ss_server-resolv.$(OBJEXT) \\\n\tss_server-server.$(OBJEXT) $(am__objects_1)\nss_server_OBJECTS = $(am_ss_server_OBJECTS)\nss_server_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \\\n\t$(am__append_5)\nss_server_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(ss_server_CFLAGS) \\\n\t$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 =\nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 =\nDEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)\ndepcomp = $(SHELL) $(top_srcdir)/auto/depcomp\nam__depfiles_maybe = depfiles\nam__mv = mv -f\nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nLTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \\\n\t$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \\\n\t$(AM_CFLAGS) $(CFLAGS)\nAM_V_CC = $(am__v_CC_@AM_V@)\nam__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)\nam__v_CC_0 = @echo \"  CC      \" $@;\nam__v_CC_1 =\nCCLD = $(CC)\nLINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \\\n\t$(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_CCLD = $(am__v_CCLD_@AM_V@)\nam__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)\nam__v_CCLD_0 = @echo \"  CCLD    \" $@;\nam__v_CCLD_1 =\nSOURCES = $(ss_check_SOURCES) $(ss_server_SOURCES)\nDIST_SOURCES = $(ss_check_SOURCES) $(ss_server_SOURCES)\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nam__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/auto/depcomp\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAR = @AR@\nASCIIDOC = @ASCIIDOC@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDLLTOOL = @DLLTOOL@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nGZIP = @GZIP@\nINET_NTOP_LIB = @INET_NTOP_LIB@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBPCRE = @LIBPCRE@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMANIFEST_TOOL = @MANIFEST_TOOL@\nMKDIR_P = @MKDIR_P@\nMV = @MV@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nPCRE_CONFIG = @PCRE_CONFIG@\nPTHREAD_CC = @PTHREAD_CC@\nPTHREAD_CFLAGS = @PTHREAD_CFLAGS@\nPTHREAD_LIBS = @PTHREAD_LIBS@\nRANLIB = @RANLIB@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nXMLTO = @XMLTO@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_AR = @ac_ct_AR@\nac_ct_CC = @ac_ct_CC@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nax_pthread_config = @ax_pthread_config@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npcre_pcreh = @pcre_pcreh@\npcreh = @pcreh@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nrunstatedir = @runstatedir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsubdirs = @subdirs@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nVERSION_INFO = 2:0:0\nAM_CFLAGS = -g -O2 -Wall -Werror -Wno-deprecated-declarations \\\n\t-fno-strict-aliasing -std=gnu99 -D_GNU_SOURCE \\\n\t$(PTHREAD_CFLAGS) $(am__append_1) \\\n\t-I$(top_srcdir)/libipset/include \\\n\t-I$(top_srcdir)/libcork/include $(LIBPCRE_CFLAGS)\nSS_COMMON_LIBS = $(top_builddir)/libipset/libipset.la \\\n\t$(top_builddir)/libcork/libcork.la $(INET_NTOP_LIB) \\\n\t$(LIBPCRE_LIBS) $(am__append_2) $(am__append_3)\nsni_src = http.c \\\n          tls.c \\\n          rule.c\n\nss_check_SOURCES = check.c\nss_server_SOURCES = utils.c \\\n                    netutils.c \\\n                    jconf.c \\\n                    json.c \\\n                    encrypt.c \\\n                    udprelay.c \\\n                    cache.c \\\n                    acl.c \\\n                    resolv.c \\\n                    server.c \\\n                    $(sni_src)\n\nss_check_LDADD = $(SS_COMMON_LIBS)\nss_server_LDADD = $(SS_COMMON_LIBS) $(am__append_4) $(am__append_5)\nss_check_CFLAGS = $(AM_CFLAGS)\nss_server_CFLAGS = $(AM_CFLAGS) -DMODULE_REMOTE\nall: all-am\n\n.SUFFIXES:\n.SUFFIXES: .c .lo .o .obj\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign server/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign server/Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\ninstall-binPROGRAMS: $(bin_PROGRAMS)\n\t@$(NORMAL_INSTALL)\n\t@list='$(bin_PROGRAMS)'; test -n \"$(bindir)\" || list=; \\\n\tif test -n \"$$list\"; then \\\n\t  echo \" $(MKDIR_P) '$(DESTDIR)$(bindir)'\"; \\\n\t  $(MKDIR_P) \"$(DESTDIR)$(bindir)\" || exit 1; \\\n\tfi; \\\n\tfor p in $$list; do echo \"$$p $$p\"; done | \\\n\tsed 's/$(EXEEXT)$$//' | \\\n\twhile read p p1; do if test -f $$p \\\n\t || test -f $$p1 \\\n\t  ; then echo \"$$p\"; echo \"$$p\"; else :; fi; \\\n\tdone | \\\n\tsed -e 'p;s,.*/,,;n;h' \\\n\t    -e 's|.*|.|' \\\n\t    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \\\n\tsed 'N;N;N;s,\\n, ,g' | \\\n\t$(AWK) 'BEGIN { files[\".\"] = \"\"; dirs[\".\"] = 1 } \\\n\t  { d=$$3; if (dirs[d] != 1) { print \"d\", d; dirs[d] = 1 } \\\n\t    if ($$2 == $$4) files[d] = files[d] \" \" $$1; \\\n\t    else { print \"f\", $$3 \"/\" $$4, $$1; } } \\\n\t  END { for (d in files) print \"f\", d, files[d] }' | \\\n\twhile read type dir files; do \\\n\t    if test \"$$dir\" = .; then dir=; else dir=/$$dir; fi; \\\n\t    test -z \"$$files\" || { \\\n\t    echo \" $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'\"; \\\n\t    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files \"$(DESTDIR)$(bindir)$$dir\" || exit $$?; \\\n\t    } \\\n\t; done\n\nuninstall-binPROGRAMS:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(bin_PROGRAMS)'; test -n \"$(bindir)\" || list=; \\\n\tfiles=`for p in $$list; do echo \"$$p\"; done | \\\n\t  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \\\n\t      -e 's/$$/$(EXEEXT)/' \\\n\t`; \\\n\ttest -n \"$$list\" || exit 0; \\\n\techo \" ( cd '$(DESTDIR)$(bindir)' && rm -f\" $$files \")\"; \\\n\tcd \"$(DESTDIR)$(bindir)\" && rm -f $$files\n\nclean-binPROGRAMS:\n\t@list='$(bin_PROGRAMS)'; test -n \"$$list\" || exit 0; \\\n\techo \" rm -f\" $$list; \\\n\trm -f $$list || exit $$?; \\\n\ttest -n \"$(EXEEXT)\" || exit 0; \\\n\tlist=`for p in $$list; do echo \"$$p\"; done | sed 's/$(EXEEXT)$$//'`; \\\n\techo \" rm -f\" $$list; \\\n\trm -f $$list\n\nss-check$(EXEEXT): $(ss_check_OBJECTS) $(ss_check_DEPENDENCIES) $(EXTRA_ss_check_DEPENDENCIES)\n\t@rm -f ss-check$(EXEEXT)\n\t$(AM_V_CCLD)$(ss_check_LINK) $(ss_check_OBJECTS) $(ss_check_LDADD) $(LIBS)\n\nss-server$(EXEEXT): $(ss_server_OBJECTS) $(ss_server_DEPENDENCIES) $(EXTRA_ss_server_DEPENDENCIES)\n\t@rm -f ss-server$(EXEEXT)\n\t$(AM_V_CCLD)$(ss_server_LINK) $(ss_server_OBJECTS) $(ss_server_LDADD) $(LIBS)\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_check-check.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-acl.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-cache.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-encrypt.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-http.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-jconf.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-json.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-netutils.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-resolv.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-rule.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-server.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-tls.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-udprelay.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-utils.Po@am__quote@\n\n.c.o:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.o$$||'`;\\\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<\n\n.c.obj:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.obj$$||'`;\\\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\n.c.lo:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.lo$$||'`;\\\n@am__fastdepCC_TRUE@\t$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<\n\nss_check-check.o: check.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_check_CFLAGS) $(CFLAGS) -MT ss_check-check.o -MD -MP -MF $(DEPDIR)/ss_check-check.Tpo -c -o ss_check-check.o `test -f 'check.c' || echo '$(srcdir)/'`check.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_check-check.Tpo $(DEPDIR)/ss_check-check.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='check.c' object='ss_check-check.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_check_CFLAGS) $(CFLAGS) -c -o ss_check-check.o `test -f 'check.c' || echo '$(srcdir)/'`check.c\n\nss_check-check.obj: check.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_check_CFLAGS) $(CFLAGS) -MT ss_check-check.obj -MD -MP -MF $(DEPDIR)/ss_check-check.Tpo -c -o ss_check-check.obj `if test -f 'check.c'; then $(CYGPATH_W) 'check.c'; else $(CYGPATH_W) '$(srcdir)/check.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_check-check.Tpo $(DEPDIR)/ss_check-check.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='check.c' object='ss_check-check.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_check_CFLAGS) $(CFLAGS) -c -o ss_check-check.obj `if test -f 'check.c'; then $(CYGPATH_W) 'check.c'; else $(CYGPATH_W) '$(srcdir)/check.c'; fi`\n\nss_server-utils.o: utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-utils.o -MD -MP -MF $(DEPDIR)/ss_server-utils.Tpo -c -o ss_server-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-utils.Tpo $(DEPDIR)/ss_server-utils.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='utils.c' object='ss_server-utils.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c\n\nss_server-utils.obj: utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-utils.obj -MD -MP -MF $(DEPDIR)/ss_server-utils.Tpo -c -o ss_server-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-utils.Tpo $(DEPDIR)/ss_server-utils.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='utils.c' object='ss_server-utils.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`\n\nss_server-netutils.o: netutils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-netutils.o -MD -MP -MF $(DEPDIR)/ss_server-netutils.Tpo -c -o ss_server-netutils.o `test -f 'netutils.c' || echo '$(srcdir)/'`netutils.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-netutils.Tpo $(DEPDIR)/ss_server-netutils.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='netutils.c' object='ss_server-netutils.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-netutils.o `test -f 'netutils.c' || echo '$(srcdir)/'`netutils.c\n\nss_server-netutils.obj: netutils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-netutils.obj -MD -MP -MF $(DEPDIR)/ss_server-netutils.Tpo -c -o ss_server-netutils.obj `if test -f 'netutils.c'; then $(CYGPATH_W) 'netutils.c'; else $(CYGPATH_W) '$(srcdir)/netutils.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-netutils.Tpo $(DEPDIR)/ss_server-netutils.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='netutils.c' object='ss_server-netutils.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-netutils.obj `if test -f 'netutils.c'; then $(CYGPATH_W) 'netutils.c'; else $(CYGPATH_W) '$(srcdir)/netutils.c'; fi`\n\nss_server-jconf.o: jconf.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-jconf.o -MD -MP -MF $(DEPDIR)/ss_server-jconf.Tpo -c -o ss_server-jconf.o `test -f 'jconf.c' || echo '$(srcdir)/'`jconf.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-jconf.Tpo $(DEPDIR)/ss_server-jconf.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='jconf.c' object='ss_server-jconf.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-jconf.o `test -f 'jconf.c' || echo '$(srcdir)/'`jconf.c\n\nss_server-jconf.obj: jconf.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-jconf.obj -MD -MP -MF $(DEPDIR)/ss_server-jconf.Tpo -c -o ss_server-jconf.obj `if test -f 'jconf.c'; then $(CYGPATH_W) 'jconf.c'; else $(CYGPATH_W) '$(srcdir)/jconf.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-jconf.Tpo $(DEPDIR)/ss_server-jconf.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='jconf.c' object='ss_server-jconf.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-jconf.obj `if test -f 'jconf.c'; then $(CYGPATH_W) 'jconf.c'; else $(CYGPATH_W) '$(srcdir)/jconf.c'; fi`\n\nss_server-json.o: json.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-json.o -MD -MP -MF $(DEPDIR)/ss_server-json.Tpo -c -o ss_server-json.o `test -f 'json.c' || echo '$(srcdir)/'`json.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-json.Tpo $(DEPDIR)/ss_server-json.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='json.c' object='ss_server-json.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-json.o `test -f 'json.c' || echo '$(srcdir)/'`json.c\n\nss_server-json.obj: json.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-json.obj -MD -MP -MF $(DEPDIR)/ss_server-json.Tpo -c -o ss_server-json.obj `if test -f 'json.c'; then $(CYGPATH_W) 'json.c'; else $(CYGPATH_W) '$(srcdir)/json.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-json.Tpo $(DEPDIR)/ss_server-json.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='json.c' object='ss_server-json.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-json.obj `if test -f 'json.c'; then $(CYGPATH_W) 'json.c'; else $(CYGPATH_W) '$(srcdir)/json.c'; fi`\n\nss_server-encrypt.o: encrypt.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-encrypt.o -MD -MP -MF $(DEPDIR)/ss_server-encrypt.Tpo -c -o ss_server-encrypt.o `test -f 'encrypt.c' || echo '$(srcdir)/'`encrypt.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-encrypt.Tpo $(DEPDIR)/ss_server-encrypt.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='encrypt.c' object='ss_server-encrypt.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-encrypt.o `test -f 'encrypt.c' || echo '$(srcdir)/'`encrypt.c\n\nss_server-encrypt.obj: encrypt.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-encrypt.obj -MD -MP -MF $(DEPDIR)/ss_server-encrypt.Tpo -c -o ss_server-encrypt.obj `if test -f 'encrypt.c'; then $(CYGPATH_W) 'encrypt.c'; else $(CYGPATH_W) '$(srcdir)/encrypt.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-encrypt.Tpo $(DEPDIR)/ss_server-encrypt.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='encrypt.c' object='ss_server-encrypt.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-encrypt.obj `if test -f 'encrypt.c'; then $(CYGPATH_W) 'encrypt.c'; else $(CYGPATH_W) '$(srcdir)/encrypt.c'; fi`\n\nss_server-udprelay.o: udprelay.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-udprelay.o -MD -MP -MF $(DEPDIR)/ss_server-udprelay.Tpo -c -o ss_server-udprelay.o `test -f 'udprelay.c' || echo '$(srcdir)/'`udprelay.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-udprelay.Tpo $(DEPDIR)/ss_server-udprelay.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='udprelay.c' object='ss_server-udprelay.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-udprelay.o `test -f 'udprelay.c' || echo '$(srcdir)/'`udprelay.c\n\nss_server-udprelay.obj: udprelay.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-udprelay.obj -MD -MP -MF $(DEPDIR)/ss_server-udprelay.Tpo -c -o ss_server-udprelay.obj `if test -f 'udprelay.c'; then $(CYGPATH_W) 'udprelay.c'; else $(CYGPATH_W) '$(srcdir)/udprelay.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-udprelay.Tpo $(DEPDIR)/ss_server-udprelay.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='udprelay.c' object='ss_server-udprelay.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-udprelay.obj `if test -f 'udprelay.c'; then $(CYGPATH_W) 'udprelay.c'; else $(CYGPATH_W) '$(srcdir)/udprelay.c'; fi`\n\nss_server-cache.o: cache.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-cache.o -MD -MP -MF $(DEPDIR)/ss_server-cache.Tpo -c -o ss_server-cache.o `test -f 'cache.c' || echo '$(srcdir)/'`cache.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-cache.Tpo $(DEPDIR)/ss_server-cache.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='cache.c' object='ss_server-cache.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-cache.o `test -f 'cache.c' || echo '$(srcdir)/'`cache.c\n\nss_server-cache.obj: cache.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-cache.obj -MD -MP -MF $(DEPDIR)/ss_server-cache.Tpo -c -o ss_server-cache.obj `if test -f 'cache.c'; then $(CYGPATH_W) 'cache.c'; else $(CYGPATH_W) '$(srcdir)/cache.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-cache.Tpo $(DEPDIR)/ss_server-cache.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='cache.c' object='ss_server-cache.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-cache.obj `if test -f 'cache.c'; then $(CYGPATH_W) 'cache.c'; else $(CYGPATH_W) '$(srcdir)/cache.c'; fi`\n\nss_server-acl.o: acl.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-acl.o -MD -MP -MF $(DEPDIR)/ss_server-acl.Tpo -c -o ss_server-acl.o `test -f 'acl.c' || echo '$(srcdir)/'`acl.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-acl.Tpo $(DEPDIR)/ss_server-acl.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='acl.c' object='ss_server-acl.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-acl.o `test -f 'acl.c' || echo '$(srcdir)/'`acl.c\n\nss_server-acl.obj: acl.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-acl.obj -MD -MP -MF $(DEPDIR)/ss_server-acl.Tpo -c -o ss_server-acl.obj `if test -f 'acl.c'; then $(CYGPATH_W) 'acl.c'; else $(CYGPATH_W) '$(srcdir)/acl.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-acl.Tpo $(DEPDIR)/ss_server-acl.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='acl.c' object='ss_server-acl.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-acl.obj `if test -f 'acl.c'; then $(CYGPATH_W) 'acl.c'; else $(CYGPATH_W) '$(srcdir)/acl.c'; fi`\n\nss_server-resolv.o: resolv.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-resolv.o -MD -MP -MF $(DEPDIR)/ss_server-resolv.Tpo -c -o ss_server-resolv.o `test -f 'resolv.c' || echo '$(srcdir)/'`resolv.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-resolv.Tpo $(DEPDIR)/ss_server-resolv.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='resolv.c' object='ss_server-resolv.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-resolv.o `test -f 'resolv.c' || echo '$(srcdir)/'`resolv.c\n\nss_server-resolv.obj: resolv.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-resolv.obj -MD -MP -MF $(DEPDIR)/ss_server-resolv.Tpo -c -o ss_server-resolv.obj `if test -f 'resolv.c'; then $(CYGPATH_W) 'resolv.c'; else $(CYGPATH_W) '$(srcdir)/resolv.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-resolv.Tpo $(DEPDIR)/ss_server-resolv.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='resolv.c' object='ss_server-resolv.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-resolv.obj `if test -f 'resolv.c'; then $(CYGPATH_W) 'resolv.c'; else $(CYGPATH_W) '$(srcdir)/resolv.c'; fi`\n\nss_server-server.o: server.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-server.o -MD -MP -MF $(DEPDIR)/ss_server-server.Tpo -c -o ss_server-server.o `test -f 'server.c' || echo '$(srcdir)/'`server.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-server.Tpo $(DEPDIR)/ss_server-server.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='server.c' object='ss_server-server.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-server.o `test -f 'server.c' || echo '$(srcdir)/'`server.c\n\nss_server-server.obj: server.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-server.obj -MD -MP -MF $(DEPDIR)/ss_server-server.Tpo -c -o ss_server-server.obj `if test -f 'server.c'; then $(CYGPATH_W) 'server.c'; else $(CYGPATH_W) '$(srcdir)/server.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-server.Tpo $(DEPDIR)/ss_server-server.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='server.c' object='ss_server-server.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-server.obj `if test -f 'server.c'; then $(CYGPATH_W) 'server.c'; else $(CYGPATH_W) '$(srcdir)/server.c'; fi`\n\nss_server-http.o: http.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-http.o -MD -MP -MF $(DEPDIR)/ss_server-http.Tpo -c -o ss_server-http.o `test -f 'http.c' || echo '$(srcdir)/'`http.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-http.Tpo $(DEPDIR)/ss_server-http.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='http.c' object='ss_server-http.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-http.o `test -f 'http.c' || echo '$(srcdir)/'`http.c\n\nss_server-http.obj: http.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-http.obj -MD -MP -MF $(DEPDIR)/ss_server-http.Tpo -c -o ss_server-http.obj `if test -f 'http.c'; then $(CYGPATH_W) 'http.c'; else $(CYGPATH_W) '$(srcdir)/http.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-http.Tpo $(DEPDIR)/ss_server-http.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='http.c' object='ss_server-http.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-http.obj `if test -f 'http.c'; then $(CYGPATH_W) 'http.c'; else $(CYGPATH_W) '$(srcdir)/http.c'; fi`\n\nss_server-tls.o: tls.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-tls.o -MD -MP -MF $(DEPDIR)/ss_server-tls.Tpo -c -o ss_server-tls.o `test -f 'tls.c' || echo '$(srcdir)/'`tls.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-tls.Tpo $(DEPDIR)/ss_server-tls.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='tls.c' object='ss_server-tls.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-tls.o `test -f 'tls.c' || echo '$(srcdir)/'`tls.c\n\nss_server-tls.obj: tls.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-tls.obj -MD -MP -MF $(DEPDIR)/ss_server-tls.Tpo -c -o ss_server-tls.obj `if test -f 'tls.c'; then $(CYGPATH_W) 'tls.c'; else $(CYGPATH_W) '$(srcdir)/tls.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-tls.Tpo $(DEPDIR)/ss_server-tls.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='tls.c' object='ss_server-tls.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-tls.obj `if test -f 'tls.c'; then $(CYGPATH_W) 'tls.c'; else $(CYGPATH_W) '$(srcdir)/tls.c'; fi`\n\nss_server-rule.o: rule.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-rule.o -MD -MP -MF $(DEPDIR)/ss_server-rule.Tpo -c -o ss_server-rule.o `test -f 'rule.c' || echo '$(srcdir)/'`rule.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-rule.Tpo $(DEPDIR)/ss_server-rule.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='rule.c' object='ss_server-rule.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-rule.o `test -f 'rule.c' || echo '$(srcdir)/'`rule.c\n\nss_server-rule.obj: rule.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-rule.obj -MD -MP -MF $(DEPDIR)/ss_server-rule.Tpo -c -o ss_server-rule.obj `if test -f 'rule.c'; then $(CYGPATH_W) 'rule.c'; else $(CYGPATH_W) '$(srcdir)/rule.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-rule.Tpo $(DEPDIR)/ss_server-rule.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='rule.c' object='ss_server-rule.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-rule.obj `if test -f 'rule.c'; then $(CYGPATH_W) 'rule.c'; else $(CYGPATH_W) '$(srcdir)/rule.c'; fi`\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-am\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-am\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscopelist: cscopelist-am\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(PROGRAMS)\ninstalldirs:\n\tfor dir in \"$(DESTDIR)$(bindir)\"; do \\\n\t  test -z \"$$dir\" || $(MKDIR_P) \"$$dir\"; \\\n\tdone\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am\n\ndistclean: distclean-am\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am: install-binPROGRAMS\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic \\\n\tmostlyclean-libtool\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am: uninstall-binPROGRAMS\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \\\n\tclean-binPROGRAMS clean-generic clean-libtool cscopelist-am \\\n\tctags ctags-am distclean distclean-compile distclean-generic \\\n\tdistclean-libtool distclean-tags distdir dvi dvi-am html \\\n\thtml-am info info-am install install-am install-binPROGRAMS \\\n\tinstall-data install-data-am install-dvi install-dvi-am \\\n\tinstall-exec install-exec-am install-html install-html-am \\\n\tinstall-info install-info-am install-man install-pdf \\\n\tinstall-pdf-am install-ps install-ps-am install-strip \\\n\tinstallcheck installcheck-am installdirs maintainer-clean \\\n\tmaintainer-clean-generic mostlyclean mostlyclean-compile \\\n\tmostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \\\n\ttags tags-am uninstall uninstall-am uninstall-binPROGRAMS\n\n.PRECIOUS: Makefile\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/acl.c",
    "content": "/*\n * acl.c - Manage the ACL (Access Control List)\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#include <ipset/ipset.h>\n#include <ctype.h>\n\n#include \"rule.h\"\n#include \"utils.h\"\n#include \"cache.h\"\n#include \"acl.h\"\n\nstatic struct ip_set white_list_ipv4;\nstatic struct ip_set white_list_ipv6;\n\nstatic struct ip_set black_list_ipv4;\nstatic struct ip_set black_list_ipv6;\n\nstatic struct cork_dllist black_list_rules;\nstatic struct cork_dllist white_list_rules;\n\nstatic int acl_mode = BLACK_LIST;\n\nstatic struct cache *block_list;\n\nstatic struct ip_set outbound_block_list_ipv4;\nstatic struct ip_set outbound_block_list_ipv6;\nstatic struct cork_dllist outbound_block_list_rules;\n\n#ifdef __linux__\n\n#include <unistd.h>\n#include <stdio.h>\n\n#define NO_FIREWALL_MODE 0\n#define IPTABLES_MODE    1\n#define FIREWALLD_MODE   2\n\nstatic FILE *shell_stdin;\nstatic int mode = NO_FIREWALL_MODE;\n\nstatic char chain_name[64];\nstatic char *iptables_init_chain =\n    \"iptables -N %s; iptables -F %s; iptables -A OUTPUT -p tcp --tcp-flags RST RST -j %s\";\nstatic char *iptables_remove_chain =\n    \"iptables -D OUTPUT -p tcp --tcp-flags RST RST -j %s; iptables -F %s; iptables -X %s\";\nstatic char *iptables_add_rule    = \"iptables -A %s -d %s -j DROP\";\nstatic char *iptables_remove_rule = \"iptables -D %s -d %s -j DROP\";\n\nstatic char *ip6tables_init_chain =\n    \"ip6tables -N %s; ip6tables -F %s; ip6tables -A OUTPUT -p tcp --tcp-flags RST RST -j %s\";\nstatic char *ip6tables_remove_chain =\n    \"ip6tables -D OUTPUT -p tcp --tcp-flags RST RST -j %s; ip6tables -F %s; ip6tables -X %s\";\nstatic char *ip6tables_add_rule    = \"ip6tables -A %s -d %s -j DROP\";\nstatic char *ip6tables_remove_rule = \"ip6tables -D %s -d %s -j DROP\";\n\nstatic char *firewalld_init_chain =\n    \"firewall-cmd --direct --add-chain ipv4 filter %s; \\\n     firewall-cmd --direct --passthrough ipv4 -F %s; \\\n     firewall-cmd --direct --passthrough ipv4 -A OUTPUT -p tcp --tcp-flags RST RST -j %s\";\nstatic char *firewalld_remove_chain =\n    \"firewall-cmd --direct --passthrough ipv4 -D OUTPUT -p tcp --tcp-flags RST RST -j %s; \\\n     firewall-cmd --direct --passthrough ipv4 -F %s; \\\n     firewall-cmd --direct --remove-chain ipv4 filter %s\";\nstatic char *firewalld_add_rule    = \"firewall-cmd --direct --passthrough ipv4 -A %s -d %s -j DROP\";\nstatic char *firewalld_remove_rule = \"firewall-cmd --direct --passthrough ipv4 -D %s -d %s -j DROP\";\n\nstatic char *firewalld6_init_chain =\n    \"firewall-cmd --direct --add-chain ipv6 filter %s; \\\n     firewall-cmd --direct --passthrough ipv6 -F %s; \\\n     firewall-cmd --direct --passthrough ipv6 -A OUTPUT -p tcp --tcp-flags RST RST -j %s\";\nstatic char *firewalld6_remove_chain =\n    \"firewall-cmd --direct --passthrough ipv6 -D OUTPUT -p tcp --tcp-flags RST RST -j %s; \\\n     firewall-cmd --direct --passthrough ipv6 -F %s; \\\n     firewall-cmd --direct --remove-chain ipv6 filter %s\";\nstatic char *firewalld6_add_rule    = \"firewall-cmd --direct --passthrough ipv6 -A %s -d %s -j DROP\";\nstatic char *firewalld6_remove_rule = \"firewall-cmd --direct --passthrough ipv6 -D %s -d %s -j DROP\";\n\nstatic int\nrun_cmd(const char *cmd)\n{\n    int ret = 0;\n    char cmdstring[256];\n\n    sprintf(cmdstring, \"%s\\n\", cmd);\n    size_t len = strlen(cmdstring);\n\n    if (shell_stdin != NULL) {\n        ret = fwrite(cmdstring, 1, len, shell_stdin);\n        fflush(shell_stdin);\n    }\n\n    return ret == len;\n}\n\nstatic int\ninit_firewall()\n{\n    int ret = 0;\n    char cli[256];\n    FILE *fp;\n\n    if (getuid() != 0)\n        return -1;\n\n    sprintf(cli, \"firewall-cmd --version 2>&1\");\n    fp = popen(cli, \"r\");\n\n    if (fp == NULL)\n        return -1;\n\n    if (pclose(fp) == 0) {\n        mode = FIREWALLD_MODE;\n    } else {\n        /* Check whether we have permission to operate iptables.\n\t * Note that checking `iptables --version` is insufficient:\n         * eg, running within a child user namespace.\n\t */\n        sprintf(cli, \"iptables -L 2>&1\");\n        fp = popen(cli, \"r\");\n        if (fp == NULL)\n            return -1;\n        if (pclose(fp) == 0)\n            mode = IPTABLES_MODE;\n    }\n\n    sprintf(chain_name, \"SHADOWSOCKS_LIBEV_%d\", getpid());\n\n    if (mode == FIREWALLD_MODE) {\n        sprintf(cli, firewalld6_init_chain, chain_name, chain_name, chain_name);\n        ret |= system(cli);\n        sprintf(cli, firewalld_init_chain, chain_name, chain_name, chain_name);\n        ret |= system(cli);\n    } else if (mode == IPTABLES_MODE) {\n        sprintf(cli, ip6tables_init_chain, chain_name, chain_name, chain_name);\n        ret |= system(cli);\n        sprintf(cli, iptables_init_chain, chain_name, chain_name, chain_name);\n        ret |= system(cli);\n    }\n\n    shell_stdin = popen(\"/bin/sh\", \"w\");\n\n    return ret;\n}\n\nstatic int\nreset_firewall()\n{\n    int ret = 0;\n    char cli[256];\n\n    if (getuid() != 0)\n        return -1;\n\n    if (mode == IPTABLES_MODE) {\n        sprintf(cli, ip6tables_remove_chain, chain_name, chain_name, chain_name);\n        ret |= system(cli);\n        sprintf(cli, iptables_remove_chain, chain_name, chain_name, chain_name);\n        ret |= system(cli);\n    } else if (mode == FIREWALLD_MODE) {\n        sprintf(cli, firewalld6_remove_chain, chain_name, chain_name, chain_name);\n        ret |= system(cli);\n        sprintf(cli, firewalld_remove_chain, chain_name, chain_name, chain_name);\n        ret |= system(cli);\n    }\n\n    if (shell_stdin != NULL) {\n        run_cmd(\"exit 0\");\n        pclose(shell_stdin);\n    }\n\n    return ret;\n}\n\nstatic int\nset_firewall_rule(char *addr, int add)\n{\n    char cli[256];\n    struct cork_ip ip;\n\n    if (getuid() != 0)\n        return -1;\n\n    if (cork_ip_init(&ip, addr))\n        return -1;\n\n    if (add) {\n        if (mode == IPTABLES_MODE)\n            sprintf(cli, ip.version == 4 ? iptables_add_rule : ip6tables_add_rule,\n                    chain_name, addr);\n        else if (mode == FIREWALLD_MODE)\n            sprintf(cli, ip.version == 4 ? firewalld_add_rule : firewalld6_add_rule,\n                    chain_name, addr);\n        return run_cmd(cli);\n    } else {\n        if (mode == IPTABLES_MODE)\n            sprintf(cli, ip.version == 4 ? iptables_remove_rule : ip6tables_remove_rule,\n                    chain_name, addr);\n        else if (mode == FIREWALLD_MODE)\n            sprintf(cli, ip.version == 4 ? firewalld_remove_rule : firewalld6_remove_rule,\n                    chain_name, addr);\n        return run_cmd(cli);\n    }\n\n    return 0;\n}\n\nstatic void\nfree_firewall_rule(void *key, void *element)\n{\n    if (key == NULL)\n        return;\n    char *addr = (char *)key;\n    set_firewall_rule(addr, 0);\n    ss_free(element);\n}\n\n#endif\n\nvoid\ninit_block_list(int firewall)\n{\n    // Initialize cache\n#ifdef __linux__\n    if (firewall)\n        init_firewall();\n    else\n        mode = NO_FIREWALL_MODE;\n    cache_create(&block_list, 256, free_firewall_rule);\n#else\n    cache_create(&block_list, 256, NULL);\n#endif\n}\n\nvoid\nfree_block_list()\n{\n#ifdef __linux__\n    if (mode != NO_FIREWALL_MODE)\n        reset_firewall();\n#endif\n    cache_clear(block_list, 0); // Remove all items\n}\n\nint\nremove_from_block_list(char *addr)\n{\n    size_t addr_len = strlen(addr);\n    return cache_remove(block_list, addr, addr_len);\n}\n\nvoid\nclear_block_list()\n{\n    cache_clear(block_list, 3600); // Clear items older than 1 hour\n}\n\nint\ncheck_block_list(char *addr)\n{\n    size_t addr_len = strlen(addr);\n\n    if (cache_key_exist(block_list, addr, addr_len)) {\n        int *count = NULL;\n        cache_lookup(block_list, addr, addr_len, &count);\n\n        if (count != NULL && *count > MAX_TRIES)\n            return 1;\n    }\n\n    return 0;\n}\n\nint\nupdate_block_list(char *addr, int err_level)\n{\n    size_t addr_len = strlen(addr);\n\n    if (cache_key_exist(block_list, addr, addr_len)) {\n        int *count = NULL;\n        cache_lookup(block_list, addr, addr_len, &count);\n        if (count != NULL) {\n            if (*count > MAX_TRIES)\n                return 1;\n            (*count) += err_level;\n        }\n    } else if (err_level > 0) {\n        int *count = (int *)ss_malloc(sizeof(int));\n        *count = 1;\n        cache_insert(block_list, addr, addr_len, count);\n#ifdef __linux__\n        if (mode != NO_FIREWALL_MODE)\n            set_firewall_rule(addr, 1);\n#endif\n    }\n\n    return 0;\n}\n\nstatic void\nparse_addr_cidr(const char *str, char *host, int *cidr)\n{\n    int ret = -1, n = 0;\n    char *pch;\n\n    pch = strchr(str, '/');\n    while (pch != NULL) {\n        n++;\n        ret = pch - str;\n        pch = strchr(pch + 1, '/');\n    }\n    if (ret == -1) {\n        strcpy(host, str);\n        *cidr = -1;\n    } else {\n        memcpy(host, str, ret);\n        host[ret] = '\\0';\n        *cidr     = atoi(str + ret + 1);\n    }\n}\n\nchar *\ntrimwhitespace(char *str)\n{\n    char *end;\n\n    // Trim leading space\n    while (isspace(*str))\n        str++;\n\n    if (*str == 0)   // All spaces?\n        return str;\n\n    // Trim trailing space\n    end = str + strlen(str) - 1;\n    while (end > str && isspace(*end))\n        end--;\n\n    // Write new null terminator\n    *(end + 1) = 0;\n\n    return str;\n}\n\nint\ninit_acl(const char *path)\n{\n    // initialize ipset\n    ipset_init_library();\n\n    ipset_init(&white_list_ipv4);\n    ipset_init(&white_list_ipv6);\n    ipset_init(&black_list_ipv4);\n    ipset_init(&black_list_ipv6);\n    ipset_init(&outbound_block_list_ipv4);\n    ipset_init(&outbound_block_list_ipv6);\n\n    cork_dllist_init(&black_list_rules);\n    cork_dllist_init(&white_list_rules);\n    cork_dllist_init(&outbound_block_list_rules);\n\n    struct ip_set *list_ipv4  = &black_list_ipv4;\n    struct ip_set *list_ipv6  = &black_list_ipv6;\n    struct cork_dllist *rules = &black_list_rules;\n\n    FILE *f = fopen(path, \"r\");\n    if (f == NULL) {\n        LOGE(\"Invalid acl path.\");\n        return -1;\n    }\n\n    char buf[257];\n    while (!feof(f))\n        if (fgets(buf, 256, f)) {\n            // Trim the newline\n            int len = strlen(buf);\n            if (len > 0 && buf[len - 1] == '\\n') {\n                buf[len - 1] = '\\0';\n            }\n\n            char *line = trimwhitespace(buf);\n\n            // Skip comments\n            if (line[0] == '#') {\n                continue;\n            }\n\n            if (strlen(line) == 0) {\n                continue;\n            }\n\n            if (strcmp(line, \"[outbound_block_list]\") == 0) {\n                list_ipv4 = &outbound_block_list_ipv4;\n                list_ipv6 = &outbound_block_list_ipv6;\n                rules     = &outbound_block_list_rules;\n                continue;\n            } else if (strcmp(line, \"[black_list]\") == 0\n                       || strcmp(line, \"[bypass_list]\") == 0) {\n                list_ipv4 = &black_list_ipv4;\n                list_ipv6 = &black_list_ipv6;\n                rules     = &black_list_rules;\n                continue;\n            } else if (strcmp(line, \"[white_list]\") == 0\n                       || strcmp(line, \"[proxy_list]\") == 0) {\n                list_ipv4 = &white_list_ipv4;\n                list_ipv6 = &white_list_ipv6;\n                rules     = &white_list_rules;\n                continue;\n            } else if (strcmp(line, \"[reject_all]\") == 0\n                       || strcmp(line, \"[bypass_all]\") == 0) {\n                acl_mode = WHITE_LIST;\n                continue;\n            } else if (strcmp(line, \"[accept_all]\") == 0\n                       || strcmp(line, \"[proxy_all]\") == 0) {\n                acl_mode = BLACK_LIST;\n                continue;\n            }\n\n            char host[257];\n            int cidr;\n            parse_addr_cidr(line, host, &cidr);\n\n            struct cork_ip addr;\n            int err = cork_ip_init(&addr, host);\n            if (!err) {\n                if (addr.version == 4) {\n                    if (cidr >= 0) {\n                        ipset_ipv4_add_network(list_ipv4, &(addr.ip.v4), cidr);\n                    } else {\n                        ipset_ipv4_add(list_ipv4, &(addr.ip.v4));\n                    }\n                } else if (addr.version == 6) {\n                    if (cidr >= 0) {\n                        ipset_ipv6_add_network(list_ipv6, &(addr.ip.v6), cidr);\n                    } else {\n                        ipset_ipv6_add(list_ipv6, &(addr.ip.v6));\n                    }\n                }\n            } else {\n                rule_t *rule = new_rule();\n                accept_rule_arg(rule, line);\n                init_rule(rule);\n                add_rule(rules, rule);\n            }\n        }\n\n    fclose(f);\n\n    return 0;\n}\n\nvoid\nfree_rules(struct cork_dllist *rules)\n{\n    struct cork_dllist_item *iter;\n    while ((iter = cork_dllist_head(rules)) != NULL) {\n        rule_t *rule = cork_container_of(iter, rule_t, entries);\n        remove_rule(rule);\n    }\n}\n\nvoid\nfree_acl(void)\n{\n    ipset_done(&black_list_ipv4);\n    ipset_done(&black_list_ipv6);\n    ipset_done(&white_list_ipv4);\n    ipset_done(&white_list_ipv6);\n\n    free_rules(&black_list_rules);\n    free_rules(&white_list_rules);\n}\n\nint\nget_acl_mode(void)\n{\n    return acl_mode;\n}\n\n/*\n * Return 0,  if not match.\n * Return 1,  if match black list.\n * Return -1, if match white list.\n */\nint\nacl_match_host(const char *host)\n{\n    struct cork_ip addr;\n    int ret = 0;\n    int err = cork_ip_init(&addr, host);\n\n    if (err) {\n        int host_len = strlen(host);\n        if (lookup_rule(&black_list_rules, host, host_len) != NULL)\n            ret = 1;\n        else if (lookup_rule(&white_list_rules, host, host_len) != NULL)\n            ret = -1;\n        return ret;\n    }\n\n    if (addr.version == 4) {\n        if (ipset_contains_ipv4(&black_list_ipv4, &(addr.ip.v4)))\n            ret = 1;\n        else if (ipset_contains_ipv4(&white_list_ipv4, &(addr.ip.v4)))\n            ret = -1;\n    } else if (addr.version == 6) {\n        if (ipset_contains_ipv6(&black_list_ipv6, &(addr.ip.v6)))\n            ret = 1;\n        else if (ipset_contains_ipv6(&white_list_ipv6, &(addr.ip.v6)))\n            ret = -1;\n    }\n\n    return ret;\n}\n\nint\nacl_add_ip(const char *ip)\n{\n    struct cork_ip addr;\n    int err = cork_ip_init(&addr, ip);\n    if (err) {\n        return -1;\n    }\n\n    if (addr.version == 4) {\n        ipset_ipv4_add(&black_list_ipv4, &(addr.ip.v4));\n    } else if (addr.version == 6) {\n        ipset_ipv6_add(&black_list_ipv6, &(addr.ip.v6));\n    }\n\n    return 0;\n}\n\nint\nacl_remove_ip(const char *ip)\n{\n    struct cork_ip addr;\n    int err = cork_ip_init(&addr, ip);\n    if (err) {\n        return -1;\n    }\n\n    if (addr.version == 4) {\n        ipset_ipv4_remove(&black_list_ipv4, &(addr.ip.v4));\n    } else if (addr.version == 6) {\n        ipset_ipv6_remove(&black_list_ipv6, &(addr.ip.v6));\n    }\n\n    return 0;\n}\n\n/*\n * Return 0,  if not match.\n * Return 1,  if match black list.\n */\nint\noutbound_block_match_host(const char *host)\n{\n    struct cork_ip addr;\n    int ret = 0;\n    int err = cork_ip_init(&addr, host);\n\n    if (err) {\n        int host_len = strlen(host);\n        if (lookup_rule(&outbound_block_list_rules, host, host_len) != NULL)\n            ret = 1;\n        return ret;\n    }\n\n    if (addr.version == 4) {\n        if (ipset_contains_ipv4(&outbound_block_list_ipv4, &(addr.ip.v4)))\n            ret = 1;\n    } else if (addr.version == 6) {\n        if (ipset_contains_ipv6(&outbound_block_list_ipv6, &(addr.ip.v6)))\n            ret = 1;\n    }\n\n    return ret;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/acl.h",
    "content": "/*\n * acl.h - Define the ACL interface\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _ACL_H\n#define _ACL_H\n\n#define BLACK_LIST 0\n#define WHITE_LIST 1\n\n#define MAX_TRIES  64\n#define MALICIOUS  8\n#define SUSPICIOUS 4\n#define BAD        2\n#define MALFORMED  1\n\nint init_acl(const char *path);\nvoid free_acl(void);\nvoid clear_block_list(void);\n\nint acl_match_host(const char *ip);\nint acl_add_ip(const char *ip);\nint acl_remove_ip(const char *ip);\n\nint get_acl_mode(void);\n\nvoid init_block_list(int firewall);\nvoid free_block_list();\nint check_block_list(char *addr);\nint update_block_list(char *addr, int err_level);\nint remove_from_block_list(char *addr);\n\nint outbound_block_match_host(const char *host);\n\n#endif // _ACL_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/auth.c",
    "content": "\n#include \"auth.h\"\n\nstatic int auth_simple_pack_unit_size = 2000;\ntypedef int (*hmac_with_key_func)(char *auth, char *msg, int msg_len, uint8_t *auth_key, int key_len);\ntypedef int (*hash_func)(char *auth, char *msg, int msg_len);\n\ntypedef struct auth_simple_global_data {\n    uint8_t local_client_id[8];\n    uint32_t connection_id;\n}auth_simple_global_data;\n\ntypedef struct auth_simple_local_data {\n    int has_sent_header;\n    char * recv_buffer;\n    int recv_buffer_size;\n    uint32_t recv_id;\n    uint32_t pack_id;\n    char * salt;\n    uint8_t * user_key;\n    char uid[4];\n    int user_key_len;\n    hmac_with_key_func hmac;\n    hash_func hash;\n    int hash_len;\n}auth_simple_local_data;\n\nvoid auth_simple_local_data_init(auth_simple_local_data* local) {\n    local->has_sent_header = 0;\n    local->recv_buffer = (char*)malloc(16384);\n    local->recv_buffer_size = 0;\n    local->recv_id = 1;\n    local->pack_id = 1;\n    local->salt = \"\";\n    local->user_key = 0;\n    local->user_key_len = 0;\n    local->hmac = 0;\n    local->hash = 0;\n    local->hash_len = 0;\n    local->salt = \"\";\n}\n\nvoid * auth_simple_init_data() {\n    auth_simple_global_data *global = (auth_simple_global_data*)malloc(sizeof(auth_simple_global_data));\n    rand_bytes(global->local_client_id, 8);\n    rand_bytes((uint8_t*)&global->connection_id, 4);\n    global->connection_id &= 0xFFFFFF;\n    return global;\n}\n\nobfs * auth_simple_new_obfs() {\n    obfs * self = new_obfs();\n    self->l_data = malloc(sizeof(auth_simple_local_data));\n    auth_simple_local_data_init((auth_simple_local_data*)self->l_data);\n    return self;\n}\n\nobfs * auth_aes128_md5_new_obfs() {\n    obfs * self = new_obfs();\n    self->l_data = malloc(sizeof(auth_simple_local_data));\n    auth_simple_local_data_init((auth_simple_local_data*)self->l_data);\n    ((auth_simple_local_data*)self->l_data)->hmac = ss_md5_hmac_with_key;\n    ((auth_simple_local_data*)self->l_data)->hash = ss_md5_hash_func;\n    ((auth_simple_local_data*)self->l_data)->hash_len = 16;\n    ((auth_simple_local_data*)self->l_data)->salt = \"auth_aes128_md5\";\n    return self;\n}\n\nobfs * auth_aes128_sha1_new_obfs() {\n    obfs * self = new_obfs();\n    self->l_data = malloc(sizeof(auth_simple_local_data));\n    auth_simple_local_data_init((auth_simple_local_data*)self->l_data);\n    ((auth_simple_local_data*)self->l_data)->hmac = ss_sha1_hmac_with_key;\n    ((auth_simple_local_data*)self->l_data)->hash = ss_sha1_hash_func;\n    ((auth_simple_local_data*)self->l_data)->hash_len = 20;\n    ((auth_simple_local_data*)self->l_data)->salt = \"auth_aes128_sha1\";\n    return self;\n}\n\nvoid auth_simple_dispose(obfs *self) {\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    if (local->recv_buffer != NULL) {\n        free(local->recv_buffer);\n        local->recv_buffer = NULL;\n    }\n    if (local->user_key != NULL) {\n        free(local->user_key);\n        local->user_key = NULL;\n    }\n    free(local);\n    self->l_data = NULL;\n    dispose_obfs(self);\n}\n\nint auth_simple_pack_data(char *data, int datalength, char *outdata) {\n    unsigned char rand_len = (xorshift128plus() & 0xF) + 1;\n    int out_size = rand_len + datalength + 6;\n    outdata[0] = out_size >> 8;\n    outdata[1] = out_size;\n    outdata[2] = rand_len;\n    memmove(outdata + rand_len + 2, data, datalength);\n    fillcrc32((unsigned char *)outdata, out_size);\n    return out_size;\n}\n\nvoid memintcopy_lt(void *mem, uint32_t val) {\n    ((uint8_t *)mem)[0] = val;\n    ((uint8_t *)mem)[1] = val >> 8;\n    ((uint8_t *)mem)[2] = val >> 16;\n    ((uint8_t *)mem)[3] = val >> 24;\n}\n\nint auth_simple_pack_auth_data(auth_simple_global_data *global, char *data, int datalength, char *outdata) {\n    unsigned char rand_len = (xorshift128plus() & 0xF) + 1;\n    int out_size = rand_len + datalength + 6 + 12;\n    outdata[0] = out_size >> 8;\n    outdata[1] = out_size;\n    outdata[2] = rand_len;\n    ++global->connection_id;\n    if (global->connection_id > 0xFF000000) {\n        rand_bytes(global->local_client_id, 8);\n        rand_bytes((uint8_t*)&global->connection_id, 4);\n        global->connection_id &= 0xFFFFFF;\n    }\n    time_t t = time(NULL);\n    memintcopy_lt(outdata + rand_len + 2, t);\n    memmove(outdata + rand_len + 2 + 4, global->local_client_id, 4);\n    memintcopy_lt(outdata + rand_len + 2 + 8, global->connection_id);\n    memmove(outdata + rand_len + 2 + 12, data, datalength);\n    fillcrc32((unsigned char *)outdata, out_size);\n    return out_size;\n}\n\nint auth_simple_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc(datalength * 2 + 64);\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    if (len > 0 && local->has_sent_header == 0) {\n        int head_size = get_head_size(plaindata, datalength, 30);\n        if (head_size > datalength)\n            head_size = datalength;\n        pack_len = auth_simple_pack_auth_data((auth_simple_global_data *)self->server.g_data, data, head_size, buffer);\n        buffer += pack_len;\n        data += head_size;\n        len -= head_size;\n        local->has_sent_header = 1;\n    }\n    while ( len > auth_simple_pack_unit_size ) {\n        pack_len = auth_simple_pack_data(data, auth_simple_pack_unit_size, buffer);\n        buffer += pack_len;\n        data += auth_simple_pack_unit_size;\n        len -= auth_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = auth_simple_pack_data(data, len, buffer);\n        buffer += pack_len;\n    }\n    len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_simple_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    char * out_buffer = (char*)malloc(local->recv_buffer_size);\n    char * buffer = out_buffer;\n    while (local->recv_buffer_size > 2) {\n        int length = ((int)recv_buffer[0] << 8) | recv_buffer[1];\n        if (length >= 8192 || length < 7) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        int crc = crc32((unsigned char*)recv_buffer, length);\n        if (crc != -1) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        int data_size = length - recv_buffer[2] - 6;\n        memmove(buffer, recv_buffer + 2 + recv_buffer[2], data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\n\nint auth_sha1_pack_data(char *data, int datalength, char *outdata) {\n    unsigned char rand_len = (xorshift128plus() & 0xF) + 1;\n    int out_size = rand_len + datalength + 6;\n    outdata[0] = out_size >> 8;\n    outdata[1] = out_size;\n    outdata[2] = rand_len;\n    memmove(outdata + rand_len + 2, data, datalength);\n    filladler32((unsigned char *)outdata, out_size);\n    return out_size;\n}\n\nint auth_sha1_pack_auth_data(auth_simple_global_data *global, server_info *server, char *data, int datalength, char *outdata) {\n    unsigned char rand_len = (xorshift128plus() & 0x7F) + 1;\n    int data_offset = rand_len + 4 + 2;\n    int out_size = data_offset + datalength + 12 + OBFS_HMAC_SHA1_LEN;\n    fillcrc32to((unsigned char *)server->key, server->key_len, (unsigned char *)outdata);\n    outdata[4] = out_size >> 8;\n    outdata[5] = out_size;\n    outdata[6] = rand_len;\n    ++global->connection_id;\n    if (global->connection_id > 0xFF000000) {\n        rand_bytes(global->local_client_id, 8);\n        rand_bytes((uint8_t*)&global->connection_id, 4);\n        global->connection_id &= 0xFFFFFF;\n    }\n    time_t t = time(NULL);\n    memintcopy_lt(outdata + data_offset, t);\n    memmove(outdata + data_offset + 4, global->local_client_id, 4);\n    memintcopy_lt(outdata + data_offset + 8, global->connection_id);\n    memmove(outdata + data_offset + 12, data, datalength);\n    char hash[ONETIMEAUTH_BYTES * 2];\n    ss_sha1_hmac(hash, outdata, out_size - OBFS_HMAC_SHA1_LEN, server->iv);\n    memcpy(outdata + out_size - OBFS_HMAC_SHA1_LEN, hash, OBFS_HMAC_SHA1_LEN);\n    return out_size;\n}\n\nint auth_sha1_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc(datalength * 2 + 256);\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    if (len > 0 && local->has_sent_header == 0) {\n        int head_size = get_head_size(plaindata, datalength, 30);\n        if (head_size > datalength)\n            head_size = datalength;\n        pack_len = auth_sha1_pack_auth_data((auth_simple_global_data *)self->server.g_data, &self->server, data, head_size, buffer);\n        buffer += pack_len;\n        data += head_size;\n        len -= head_size;\n        local->has_sent_header = 1;\n    }\n    while ( len > auth_simple_pack_unit_size ) {\n        pack_len = auth_sha1_pack_data(data, auth_simple_pack_unit_size, buffer);\n        buffer += pack_len;\n        data += auth_simple_pack_unit_size;\n        len -= auth_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = auth_sha1_pack_data(data, len, buffer);\n        buffer += pack_len;\n    }\n    len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_sha1_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    char * out_buffer = (char*)malloc(local->recv_buffer_size);\n    char * buffer = out_buffer;\n    while (local->recv_buffer_size > 2) {\n        int length = ((int)recv_buffer[0] << 8) | recv_buffer[1];\n        if (length >= 8192 || length < 7) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        if (checkadler32((unsigned char*)recv_buffer, length) == 0) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        int pos = recv_buffer[2] + 2;\n        int data_size = length - pos - 4;\n        memmove(buffer, recv_buffer + pos, data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_sha1_v2_pack_data(char *data, int datalength, char *outdata) {\n    unsigned int rand_len = (datalength > 1300 ? 0 : datalength > 400 ? (xorshift128plus() & 0x7F) : (xorshift128plus() & 0x3FF)) + 1;\n    int out_size = rand_len + datalength + 6;\n    outdata[0] = out_size >> 8;\n    outdata[1] = out_size;\n    if (rand_len < 128)\n    {\n        outdata[2] = rand_len;\n    }\n    else\n    {\n        outdata[2] = 0xFF;\n        outdata[3] = rand_len >> 8;\n        outdata[4] = rand_len;\n    }\n    memmove(outdata + rand_len + 2, data, datalength);\n    filladler32((unsigned char *)outdata, out_size);\n    return out_size;\n}\n\nint auth_sha1_v2_pack_auth_data(auth_simple_global_data *global, server_info *server, char *data, int datalength, char *outdata) {\n    unsigned int rand_len = (datalength > 1300 ? 0 : datalength > 400 ? (xorshift128plus() & 0x7F) : (xorshift128plus() & 0x3FF)) + 1;\n    int data_offset = rand_len + 4 + 2;\n    int out_size = data_offset + datalength + 12 + OBFS_HMAC_SHA1_LEN;\n    const char* salt = \"auth_sha1_v2\";\n    int salt_len = strlen(salt);\n    unsigned char *crc_salt = (unsigned char*)malloc(salt_len + server->key_len);\n    memcpy(crc_salt, salt, salt_len);\n    memcpy(crc_salt + salt_len, server->key, server->key_len);\n    fillcrc32to(crc_salt, salt_len + server->key_len, (unsigned char *)outdata);\n    free(crc_salt);\n    outdata[4] = out_size >> 8;\n    outdata[5] = out_size;\n    if (rand_len < 128)\n    {\n        outdata[6] = rand_len;\n    }\n    else\n    {\n        outdata[6] = 0xFF;\n        outdata[7] = rand_len >> 8;\n        outdata[8] = rand_len;\n    }\n    ++global->connection_id;\n    if (global->connection_id > 0xFF000000) {\n        rand_bytes(global->local_client_id, 8);\n        rand_bytes((uint8_t*)&global->connection_id, 4);\n        global->connection_id &= 0xFFFFFF;\n    }\n    memmove(outdata + data_offset, global->local_client_id, 8);\n    memintcopy_lt(outdata + data_offset + 8, global->connection_id);\n    memmove(outdata + data_offset + 12, data, datalength);\n    char hash[ONETIMEAUTH_BYTES * 2];\n    ss_sha1_hmac(hash, outdata, out_size - OBFS_HMAC_SHA1_LEN, server->iv);\n    memcpy(outdata + out_size - OBFS_HMAC_SHA1_LEN, hash, OBFS_HMAC_SHA1_LEN);\n    return out_size;\n}\n\nint auth_sha1_v2_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc(datalength * 2 + 4096);\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    if (len > 0 && local->has_sent_header == 0) {\n        int head_size = get_head_size(plaindata, datalength, 30);\n        if (head_size > datalength)\n            head_size = datalength;\n        pack_len = auth_sha1_v2_pack_auth_data((auth_simple_global_data *)self->server.g_data, &self->server, data, head_size, buffer);\n        buffer += pack_len;\n        data += head_size;\n        len -= head_size;\n        local->has_sent_header = 1;\n    }\n    while ( len > auth_simple_pack_unit_size ) {\n        pack_len = auth_sha1_v2_pack_data(data, auth_simple_pack_unit_size, buffer);\n        buffer += pack_len;\n        data += auth_simple_pack_unit_size;\n        len -= auth_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = auth_sha1_v2_pack_data(data, len, buffer);\n        buffer += pack_len;\n    }\n    len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_sha1_v2_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    char * out_buffer = (char*)malloc(local->recv_buffer_size);\n    char * buffer = out_buffer;\n    char error = 0;\n    while (local->recv_buffer_size > 2) {\n        int length = ((int)recv_buffer[0] << 8) | recv_buffer[1];\n        if (length >= 8192 || length < 7) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        if (checkadler32((unsigned char*)recv_buffer, length) == 0) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        int pos = recv_buffer[2];\n        if (pos < 255)\n        {\n            pos += 2;\n        }\n        else\n        {\n            pos = ((recv_buffer[3] << 8) | recv_buffer[4]) + 2;\n        }\n        int data_size = length - pos - 4;\n        memmove(buffer, recv_buffer + pos, data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len;\n    if (error == 0) {\n        len = buffer - out_buffer;\n        if (*capacity < len) {\n            *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n            plaindata = *pplaindata;\n        }\n        memmove(plaindata, out_buffer, len);\n    } else {\n        len = -1;\n    }\n    free(out_buffer);\n    return len;\n}\n\nint auth_sha1_v4_pack_data(char *data, int datalength, char *outdata) {\n    unsigned int rand_len = (datalength > 1300 ? 0 : datalength > 400 ? (xorshift128plus() & 0x7F) : (xorshift128plus() & 0x3FF)) + 1;\n    int out_size = rand_len + datalength + 8;\n    outdata[0] = out_size >> 8;\n    outdata[1] = out_size;\n    uint32_t crc_val = crc32((unsigned char*)outdata, 2);\n    outdata[2] = crc_val;\n    outdata[3] = crc_val >> 8;\n    if (rand_len < 128)\n    {\n        outdata[4] = rand_len;\n    }\n    else\n    {\n        outdata[4] = 0xFF;\n        outdata[5] = rand_len >> 8;\n        outdata[6] = rand_len;\n    }\n    memmove(outdata + rand_len + 4, data, datalength);\n    filladler32((unsigned char *)outdata, out_size);\n    return out_size;\n}\n\nint auth_sha1_v4_pack_auth_data(auth_simple_global_data *global, server_info *server, char *data, int datalength, char *outdata) {\n    unsigned int rand_len = (datalength > 1300 ? 0 : datalength > 400 ? (xorshift128plus() & 0x7F) : (xorshift128plus() & 0x3FF)) + 1;\n    int data_offset = rand_len + 4 + 2;\n    int out_size = data_offset + datalength + 12 + OBFS_HMAC_SHA1_LEN;\n    const char* salt = \"auth_sha1_v4\";\n    int salt_len = strlen(salt);\n    unsigned char *crc_salt = (unsigned char*)malloc(salt_len + server->key_len + 2);\n    crc_salt[0] = outdata[0] = out_size >> 8;\n    crc_salt[1] = outdata[1] = out_size;\n\n    memcpy(crc_salt + 2, salt, salt_len);\n    memcpy(crc_salt + salt_len + 2, server->key, server->key_len);\n    fillcrc32to(crc_salt, salt_len + server->key_len + 2, (unsigned char *)outdata + 2);\n    free(crc_salt);\n    if (rand_len < 128)\n    {\n        outdata[6] = rand_len;\n    }\n    else\n    {\n        outdata[6] = 0xFF;\n        outdata[7] = rand_len >> 8;\n        outdata[8] = rand_len;\n    }\n    ++global->connection_id;\n    if (global->connection_id > 0xFF000000) {\n        rand_bytes(global->local_client_id, 8);\n        rand_bytes((uint8_t*)&global->connection_id, 4);\n        global->connection_id &= 0xFFFFFF;\n    }\n    time_t t = time(NULL);\n    memintcopy_lt(outdata + data_offset, t);\n    memmove(outdata + data_offset + 4, global->local_client_id, 4);\n    memintcopy_lt(outdata + data_offset + 8, global->connection_id);\n    memmove(outdata + data_offset + 12, data, datalength);\n    char hash[ONETIMEAUTH_BYTES * 2];\n    ss_sha1_hmac(hash, outdata, out_size - OBFS_HMAC_SHA1_LEN, server->iv);\n    memcpy(outdata + out_size - OBFS_HMAC_SHA1_LEN, hash, OBFS_HMAC_SHA1_LEN);\n    return out_size;\n}\n\nint auth_sha1_v4_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc(datalength * 2 + 4096);\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    if (len > 0 && local->has_sent_header == 0) {\n        int head_size = get_head_size(plaindata, datalength, 30);\n        if (head_size > datalength)\n            head_size = datalength;\n        pack_len = auth_sha1_v4_pack_auth_data((auth_simple_global_data *)self->server.g_data, &self->server, data, head_size, buffer);\n        buffer += pack_len;\n        data += head_size;\n        len -= head_size;\n        local->has_sent_header = 1;\n    }\n    while ( len > auth_simple_pack_unit_size ) {\n        pack_len = auth_sha1_v4_pack_data(data, auth_simple_pack_unit_size, buffer);\n        buffer += pack_len;\n        data += auth_simple_pack_unit_size;\n        len -= auth_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = auth_sha1_v4_pack_data(data, len, buffer);\n        buffer += pack_len;\n    }\n    len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_sha1_v4_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    char * out_buffer = (char*)malloc(local->recv_buffer_size);\n    char * buffer = out_buffer;\n    char error = 0;\n    while (local->recv_buffer_size > 4) {\n        uint32_t crc_val = crc32((unsigned char*)recv_buffer, 2);\n        if ((((uint32_t)recv_buffer[3] << 8) | recv_buffer[2]) != (crc_val & 0xffff)) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        int length = ((int)recv_buffer[0] << 8) | recv_buffer[1];\n        if (length >= 8192 || length < 7) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        if (checkadler32((unsigned char*)recv_buffer, length) == 0) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        int pos = recv_buffer[4];\n        if (pos < 255)\n        {\n            pos += 4;\n        }\n        else\n        {\n            pos = (((int)recv_buffer[5] << 8) | recv_buffer[6]) + 4;\n        }\n        int data_size = length - pos - 4;\n        memmove(buffer, recv_buffer + pos, data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len;\n    if (error == 0) {\n        len = buffer - out_buffer;\n        if (*capacity < len) {\n            *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n            plaindata = *pplaindata;\n        }\n        memmove(plaindata, out_buffer, len);\n    } else {\n        len = -1;\n    }\n    free(out_buffer);\n    return len;\n}\n\n\nint auth_aes128_sha1_pack_data(char *data, int datalength, char *outdata, auth_simple_local_data *local, server_info *server) {\n    unsigned int rand_len = (datalength > 1200 ? 0 : local->pack_id > 4 ? (xorshift128plus() & 0x20) : datalength > 900 ? (xorshift128plus() & 0x80) : (xorshift128plus() & 0x200)) + 1;\n    int out_size = rand_len + datalength + 8;\n    memcpy(outdata + rand_len + 4, data, datalength);\n    outdata[0] = out_size;\n    outdata[1] = out_size >> 8;\n    uint8_t key_len = local->user_key_len + 4;\n    uint8_t *key = (uint8_t*)malloc(key_len);\n    memcpy(key, local->user_key, local->user_key_len);\n    memintcopy_lt(key + key_len - 4, local->pack_id);\n\n    {\n        uint8_t rnd_data[rand_len];\n        rand_bytes(rnd_data, rand_len);\n        memcpy(outdata + 4, rnd_data, rand_len);\n    }\n\n    {\n        char hash[20];\n        local->hmac(hash, outdata, 2, key, key_len);\n        memcpy(outdata + 2, hash, 2);\n    }\n\n    if (rand_len < 128)\n    {\n        outdata[4] = rand_len;\n    }\n    else\n    {\n        outdata[4] = 0xFF;\n        outdata[5] = rand_len;\n        outdata[6] = rand_len >> 8;\n    }\n    ++local->pack_id;\n\n    {\n        char hash[20];\n        local->hmac(hash, outdata, out_size - 4, key, key_len);\n        memcpy(outdata + out_size - 4, hash, 4);\n    }\n    free(key);\n\n    return out_size;\n}\n\nint auth_aes128_sha1_pack_auth_data(auth_simple_global_data *global, server_info *server, auth_simple_local_data *local, char *data, int datalength, char *outdata) {\n    unsigned int rand_len = (datalength > 400 ? (xorshift128plus() & 0x200) : (xorshift128plus() & 0x400));\n    int data_offset = rand_len + 16 + 4 + 4 + 7;\n    int out_size = data_offset + datalength + 4;\n\n    char encrypt[24];\n    char encrypt_data[16];\n\n    uint8_t *key = (uint8_t*)malloc(server->iv_len + server->key_len);\n    uint8_t key_len = server->iv_len + server->key_len;\n    memcpy(key, server->iv, server->iv_len);\n    memcpy(key + server->iv_len, server->key, server->key_len);\n\n    {\n        uint8_t rnd_data[rand_len];\n        rand_bytes(rnd_data, rand_len);\n        memcpy(outdata + data_offset - rand_len, rnd_data, rand_len);\n    }\n\n    ++global->connection_id;\n    if (global->connection_id > 0xFF000000) {\n        rand_bytes(global->local_client_id, 8);\n        rand_bytes((uint8_t*)&global->connection_id, 4);\n        global->connection_id &= 0xFFFFFF;\n    }\n    time_t t = time(NULL);\n    memintcopy_lt(encrypt, t);\n    memcpy(encrypt + 4, global->local_client_id, 4);\n    memintcopy_lt(encrypt + 8, global->connection_id);\n    encrypt[12] = out_size;\n    encrypt[13] = out_size >> 8;\n    encrypt[14] = rand_len;\n    encrypt[15] = rand_len >> 8;\n\n    {\n\n        if (local->user_key == NULL) {\n            if(server->param != NULL && server->param[0] != 0) {\n                char *param = server->param;\n                char *delim = strchr(param, ':');\n                if(delim != NULL) {\n                    char uid_str[16] = {};\n                    strncpy(uid_str, param, delim - param);\n                    char key_str[128];\n                    strcpy(key_str, delim + 1);\n                    long uid_long = strtol(uid_str, NULL, 10);\n                    memintcopy_lt(local->uid, uid_long);\n\n                    char hash[21] = {0};\n                    local->hash(hash, key_str, strlen(key_str));\n\n                    local->user_key_len = local->hash_len;\n                    local->user_key = (uint8_t*)malloc(local->user_key_len);\n                    memcpy(local->user_key, hash, local->hash_len);\n                }\n            }\n            if (local->user_key == NULL) {\n                rand_bytes((uint8_t *)local->uid, 4);\n\n                local->user_key_len = server->key_len;\n                local->user_key = (uint8_t*)malloc(local->user_key_len);\n                memcpy(local->user_key, server->key, local->user_key_len);\n            }\n        }\n\n        char encrypt_key_base64[256] = {0};\n        unsigned char encrypt_key[local->user_key_len];\n        memcpy(encrypt_key, local->user_key, local->user_key_len);\n        base64_encode(encrypt_key, local->user_key_len, encrypt_key_base64);\n\n        int base64_len;\n        base64_len = (local->user_key_len + 2) / 3 * 4;\n        memcpy(encrypt_key_base64 + base64_len, local->salt, strlen(local->salt));\n\n        char enc_key[16];\n        int enc_key_len = base64_len + strlen(local->salt);\n        bytes_to_key_with_size(encrypt_key_base64, enc_key_len, (uint8_t*)enc_key, 16);\n        ss_aes_128_cbc(encrypt, encrypt_data, enc_key);\n        memcpy(encrypt + 4, encrypt_data, 16);\n        memcpy(encrypt, local->uid, 4);\n    }\n\n    {\n        char hash[20];\n        local->hmac(hash, encrypt, 20, key, key_len);\n        memcpy(encrypt + 20, hash, 4);\n    }\n\n    {\n        uint8_t rnd[1];\n        rand_bytes(rnd, 1);\n        memcpy(outdata, rnd, 1);\n        char hash[20];\n        local->hmac(hash, (char *)rnd, 1, key, key_len);\n        memcpy(outdata + 1, hash, 6);\n    }\n\n    memcpy(outdata + 7, encrypt, 24);\n    memcpy(outdata + data_offset, data, datalength);\n\n    {\n        char hash[20];\n        local->hmac(hash, outdata, out_size - 4, local->user_key, local->user_key_len);\n        memmove(outdata + out_size - 4, hash, 4);\n    }\n    free(key);\n\n    return out_size;\n}\n\nint auth_aes128_sha1_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc(datalength * 2 + 4096);\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    if (len > 0 && local->has_sent_header == 0) {\n        int head_size = 1200;\n        if (head_size > datalength)\n            head_size = datalength;\n        pack_len = auth_aes128_sha1_pack_auth_data((auth_simple_global_data *)self->server.g_data, &self->server, local, data, head_size, buffer);\n        buffer += pack_len;\n        data += head_size;\n        len -= head_size;\n        local->has_sent_header = 1;\n    }\n    while ( len > auth_simple_pack_unit_size ) {\n        pack_len = auth_aes128_sha1_pack_data(data, auth_simple_pack_unit_size, buffer, local, &self->server);\n        buffer += pack_len;\n        data += auth_simple_pack_unit_size;\n        len -= auth_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = auth_aes128_sha1_pack_data(data, len, buffer, local, &self->server);\n        buffer += pack_len;\n    }\n    len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_aes128_sha1_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    //server_info *server = (server_info*)&self->server;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    int key_len = local->user_key_len + 4;\n    uint8_t *key = (uint8_t*)malloc(key_len);\n    memcpy(key, local->user_key, local->user_key_len);\n\n    char * out_buffer = (char*)malloc(local->recv_buffer_size);\n    char * buffer = out_buffer;\n    char error = 0;\n    while (local->recv_buffer_size > 4) {\n        memintcopy_lt(key + key_len - 4, local->recv_id);\n\n        {\n            char hash[20];\n            local->hmac(hash, (char*)recv_buffer, 2, key, key_len);\n\n            if (memcmp(hash, recv_buffer + 2, 2)) {\n                local->recv_buffer_size = 0;\n                error = 1;\n                break;\n            }\n        }\n\n        int length = ((int)recv_buffer[1] << 8) + recv_buffer[0];\n        if (length >= 8192 || length < 8) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        {\n            char hash[20];\n            local->hmac(hash, (char *)recv_buffer, length - 4, key, key_len);\n            if (memcmp(hash, recv_buffer + length - 4, 4))\n            {\n                local->recv_buffer_size = 0;\n                error = 1;\n                break;\n            }\n        }\n\n        ++local->recv_id;\n        int pos = recv_buffer[4];\n        if (pos < 255)\n        {\n            pos += 4;\n        }\n        else\n        {\n            pos = (((int)recv_buffer[6] << 8) | recv_buffer[5]) + 4;\n        }\n        int data_size = length - pos - 4;\n        memmove(buffer, recv_buffer + pos, data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len;\n    if (error == 0) {\n        len = buffer - out_buffer;\n        if (*capacity < len) {\n            *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n            plaindata = *pplaindata;\n        }\n        memmove(plaindata, out_buffer, len);\n    } else {\n        len = -1;\n    }\n    free(out_buffer);\n    free(key);\n    return len;\n}\n\nint auth_aes128_sha1_client_udp_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc(datalength + 8);\n\n    if (local->user_key == NULL) {\n        if(self->server.param != NULL && self->server.param[0] != 0) {\n            char *param = self->server.param;\n            char *delim = strchr(param, ':');\n            if(delim != NULL) {\n                char uid_str[16] = {};\n                strncpy(uid_str, param, delim - param);\n                char key_str[128];\n                strcpy(key_str, delim + 1);\n                long uid_long = strtol(uid_str, NULL, 10);\n                memintcopy_lt(local->uid, uid_long);\n\n                char hash[21] = {0};\n                local->hash(hash, key_str, strlen(key_str));\n\n                local->user_key_len = local->hash_len;\n                local->user_key = (uint8_t*)malloc(local->user_key_len);\n                memcpy(local->user_key, hash, local->hash_len);\n            }\n        }\n        if (local->user_key == NULL) {\n            rand_bytes((uint8_t *)local->uid, 4);\n\n            local->user_key_len = self->server.key_len;\n            local->user_key = (uint8_t*)malloc(local->user_key_len);\n            memcpy(local->user_key, self->server.key, local->user_key_len);\n        }\n    }\n\n    int outlength = datalength + 8;\n    memmove(out_buffer, plaindata, datalength);\n    memmove(out_buffer + datalength, local->uid, 4);\n\n    {\n        char hash[20];\n        local->hmac(hash, out_buffer, outlength - 4, local->user_key, local->user_key_len);\n        memmove(out_buffer + outlength - 4, hash, 4);\n    }\n\n    if (*capacity < outlength) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = outlength * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, outlength);\n\n    free(out_buffer);\n    return outlength;\n}\n\nint auth_aes128_sha1_client_udp_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    if (datalength <= 4)\n        return 0;\n\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n\n    char hash[20];\n    local->hmac(hash, plaindata, datalength - 4, self->server.key, self->server.key_len);\n\n    if (memcmp(hash, plaindata + datalength - 4, 4))\n    {\n        return 0;\n    }\n\n    return datalength - 4;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/auth.h",
    "content": "/*\n * auth.h - Define shadowsocksR server's buffers and callbacks\n *\n * Copyright (C) 2015 - 2016, Break Wa11 <mmgac001@gmail.com>\n */\n\n#ifndef _AUTH_H\n#define _AUTH_H\n\nvoid * auth_simple_init_data();\nobfs * auth_simple_new_obfs();\nvoid auth_simple_dispose(obfs *self);\n\nint auth_simple_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint auth_simple_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\n\nint auth_sha1_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint auth_sha1_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\nint auth_sha1_v2_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint auth_sha1_v2_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\nint auth_sha1_v4_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint auth_sha1_v4_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\nint auth_aes128_sha1_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint auth_aes128_sha1_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\n#endif // _AUTH_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/base64.c",
    "content": "#include \"base64.h\"\n\n/* BASE 64 encode table */\nstatic const char base64en[] = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n#define BASE64_PAD  '='\n\n#define BASE64DE_FIRST  '+'\n#define BASE64DE_LAST   'z'\n\n/* ASCII order for BASE 64 decode, -1 in unused character */\nstatic const signed char base64de[] = {\n        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,\n        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,\n        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,\n        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,\n        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,\n    /*                '+', ',', '-', '.', '/', */\n        -1,  -1,  -1,  62,  -1,  -1,  -1,  63,\n    /* '0', '1', '2', '3', '4', '5', '6', '7', */\n        52,  53,  54,  55,  56,  57,  58,  59,\n    /* '8', '9', ':', ';', '<', '=', '>', '?', */\n        60,  61,  -1,  -1,  -1,  -1,  -1,  -1,\n    /* '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', */\n        -1,   0,   1,   2,   3,   4,   5,   6,\n    /* 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', */\n         7,   8,   9,  10,  11,  12,  13,  14,\n    /* 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', */\n        15,  16,  17,  18,  19,  20,  21,  22,\n    /* 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', */\n        23,  24,  25,  -1,  -1,  -1,  -1,  -1,\n    /* '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', */\n        -1,  26,  27,  28,  29,  30,  31,  32,\n    /* 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', */\n        33,  34,  35,  36,  37,  38,  39,  40,\n    /* 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', */\n        41,  42,  43,  44,  45,  46,  47,  48,\n    /* 'x', 'y', 'z', */\n        49,  50,  51,\n};\n\nint\nbase64_encode(const unsigned char *in, unsigned int inlen, char *out)\n{\n    unsigned int i, j;\n\n    for (i = j = 0; i < inlen; i++) {\n        int s = i % 3;          /* from 6/gcd(6, 8) */\n\n        switch (s) {\n        case 0:\n            out[j++] = base64en[(in[i] >> 2) & 0x3F];\n            continue;\n        case 1:\n            out[j++] = base64en[((in[i-1] & 0x3) << 4) + ((in[i] >> 4) & 0xF)];\n            continue;\n        case 2:\n            out[j++] = base64en[((in[i-1] & 0xF) << 2) + ((in[i] >> 6) & 0x3)];\n            out[j++] = base64en[in[i] & 0x3F];\n        }\n    }\n\n    /* move back */\n    i -= 1;\n\n    /* check the last and add padding */\n    if ((i % 3) == 0) {\n        out[j++] = base64en[(in[i] & 0x3) << 4];\n        out[j++] = BASE64_PAD;\n        out[j++] = BASE64_PAD;\n    } else if ((i % 3) == 1) {\n        out[j++] = base64en[(in[i] & 0xF) << 2];\n        out[j++] = BASE64_PAD;\n    }\n\n    return BASE64_OK;\n}\n\nint\nbase64_decode(const char *in, unsigned int inlen, unsigned char *out)\n{\n    unsigned int i, j;\n\n    for (i = j = 0; i < inlen; i++) {\n        int c;\n        int s = i % 4;          /* from 8/gcd(6, 8) */\n\n        if (in[i] == '=')\n            return BASE64_OK;\n\n        if (in[i] < BASE64DE_FIRST || in[i] > BASE64DE_LAST ||\n            (c = base64de[(int)in[i]]) == -1)\n            return BASE64_INVALID;\n\n        switch (s) {\n        case 0:\n            out[j] = ((unsigned int)c << 2) & 0xFF;\n            continue;\n        case 1:\n            out[j++] += ((unsigned int)c >> 4) & 0x3;\n\n            /* if not last char with padding */\n            if (i < (inlen - 3) || in[inlen - 2] != '=')\n                out[j] = ((unsigned int)c & 0xF) << 4; \n            continue;\n        case 2:\n            out[j++] += ((unsigned int)c >> 2) & 0xF;\n\n            /* if not last char with padding */\n            if (i < (inlen - 2) || in[inlen - 1] != '=')\n                out[j] =  ((unsigned int)c & 0x3) << 6;\n            continue;\n        case 3:\n            out[j++] += (unsigned char)c;\n        }\n    }\n\n    return BASE64_OK;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/base64.h",
    "content": "#ifndef __BASE64_H__\n#define __BASE64_H__\n\nenum {BASE64_OK = 0, BASE64_INVALID};\n\n#define BASE64_ENCODE_OUT_SIZE(s)\t(((s) + 2) / 3 * 4)\n#define BASE64_DECODE_OUT_SIZE(s)\t(((s)) / 4 * 3)\n\nint\nbase64_encode(const unsigned char *in, unsigned int inlen, char *out);\n\nint\nbase64_decode(const char *in, unsigned int inlen, unsigned char *out);\n\n\n#endif /* __BASE64_H__ */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/cache.c",
    "content": "/*\n * cache.c - Manage the connection cache for UDPRELAY\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n/*\n * Original Author:  Oliver Lorenz (ol), olli@olorenz.org, https://olorenz.org\n * License:  This is licensed under the same terms as uthash itself\n */\n\n#include <errno.h>\n#include <stdlib.h>\n\n#include \"cache.h\"\n#include \"utils.h\"\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#endif\n\n/** Creates a new cache object\n *\n *  @param dst\n *  Where the newly allocated cache object will be stored in\n *\n *  @param capacity\n *  The maximum number of elements this cache object can hold\n *\n *  @return EINVAL if dst is NULL, ENOMEM if malloc fails, 0 otherwise\n */\nint\ncache_create(struct cache **dst, const size_t capacity,\n             void (*free_cb)(void *key, void *element))\n{\n    struct cache *new = NULL;\n\n    if (!dst) {\n        return EINVAL;\n    }\n\n    if ((new = malloc(sizeof(*new))) == NULL) {\n        return ENOMEM;\n    }\n\n    new->max_entries = capacity;\n    new->entries     = NULL;\n    new->free_cb     = free_cb;\n    *dst             = new;\n    return 0;\n}\n\n/** Frees an allocated cache object\n *\n *  @param cache\n *  The cache object to free\n *\n *  @param keep_data\n *  Whether to free contained data or just delete references to it\n *\n *  @return EINVAL if cache is NULL, 0 otherwise\n */\nint\ncache_delete(struct cache *cache, int keep_data)\n{\n    struct cache_entry *entry, *tmp;\n\n    if (!cache) {\n        return EINVAL;\n    }\n\n    if (keep_data) {\n        HASH_CLEAR(hh, cache->entries);\n    } else {\n        HASH_ITER(hh, cache->entries, entry, tmp){\n            HASH_DEL(cache->entries, entry);\n            if (entry->data != NULL) {\n                if (cache->free_cb) {\n                    cache->free_cb(entry->key, entry->data);\n                } else {\n                    ss_free(entry->data);\n                }\n            }\n            ss_free(entry->key);\n            ss_free(entry);\n        }\n    }\n\n    ss_free(cache);\n    return 0;\n}\n\n/** Clear old cache object\n *\n *  @param cache\n *  The cache object to clear\n *\n *  @param age\n *  Clear only objects older than the age (sec)\n *\n *  @return EINVAL if cache is NULL, 0 otherwise\n */\nint\ncache_clear(struct cache *cache, ev_tstamp age)\n{\n    struct cache_entry *entry, *tmp;\n\n    if (!cache) {\n        return EINVAL;\n    }\n\n    ev_tstamp now = ev_time();\n\n    HASH_ITER(hh, cache->entries, entry, tmp){\n        if (now - entry->ts > age) {\n            HASH_DEL(cache->entries, entry);\n            if (entry->data != NULL) {\n                if (cache->free_cb) {\n                    cache->free_cb(entry->key, entry->data);\n                } else {\n                    ss_free(entry->data);\n                }\n            }\n            ss_free(entry->key);\n            ss_free(entry);\n        }\n    }\n\n    return 0;\n}\n\n/** Removes a cache entry\n *\n *  @param cache\n *  The cache object\n *\n *  @param key\n *  The key of the entry to remove\n *\n *  @param key_len\n *  The length of key\n *\n *  @return EINVAL if cache is NULL, 0 otherwise\n */\nint\ncache_remove(struct cache *cache, char *key, size_t key_len)\n{\n    struct cache_entry *tmp;\n\n    if (!cache || !key) {\n        return EINVAL;\n    }\n\n    HASH_FIND(hh, cache->entries, key, key_len, tmp);\n\n    if (tmp) {\n        HASH_DEL(cache->entries, tmp);\n        if (tmp->data != NULL) {\n            if (cache->free_cb) {\n                cache->free_cb(tmp->key, tmp->data);\n            } else {\n                ss_free(tmp->data);\n            }\n        }\n        ss_free(tmp->key);\n        ss_free(tmp);\n    }\n\n    return 0;\n}\n\n/** Checks if a given key is in the cache\n *\n *  @param cache\n *  The cache object\n *\n *  @param key\n *  The key to look-up\n *\n *  @param key_len\n *  The length of key\n *\n *  @param result\n *  Where to store the result if key is found.\n *\n *  A warning: Even though result is just a pointer,\n *  you have to call this function with a **ptr,\n *  otherwise this will blow up in your face.\n *\n *  @return EINVAL if cache is NULL, 0 otherwise\n */\nint\ncache_lookup(struct cache *cache, char *key, size_t key_len, void *result)\n{\n    struct cache_entry *tmp = NULL;\n    char **dirty_hack       = result;\n\n    if (!cache || !key || !result) {\n        return EINVAL;\n    }\n\n    HASH_FIND(hh, cache->entries, key, key_len, tmp);\n    if (tmp) {\n        HASH_DELETE(hh, cache->entries, tmp);\n        tmp->ts = ev_time();\n        HASH_ADD_KEYPTR(hh, cache->entries, tmp->key, key_len, tmp);\n        *dirty_hack = tmp->data;\n    } else {\n        *dirty_hack = result = NULL;\n    }\n\n    return 0;\n}\n\nint\ncache_key_exist(struct cache *cache, char *key, size_t key_len)\n{\n    struct cache_entry *tmp = NULL;\n\n    if (!cache || !key) {\n        return 0;\n    }\n\n    HASH_FIND(hh, cache->entries, key, key_len, tmp);\n    if (tmp) {\n        HASH_DELETE(hh, cache->entries, tmp);\n        tmp->ts = ev_time();\n        HASH_ADD_KEYPTR(hh, cache->entries, tmp->key, key_len, tmp);\n        return 1;\n    } else {\n        return 0;\n    }\n\n    return 0;\n}\n\n/** Inserts a given <key, value> pair into the cache\n *\n *  @param cache\n *  The cache object\n *\n *  @param key\n *  The key that identifies <value>\n *\n *  @param key_len\n *  The length of key\n *\n *  @param data\n *  Data associated with <key>\n *\n *  @return EINVAL if cache is NULL, ENOMEM if malloc fails, 0 otherwise\n */\nint\ncache_insert(struct cache *cache, char *key, size_t key_len, void *data)\n{\n    struct cache_entry *entry     = NULL;\n    struct cache_entry *tmp_entry = NULL;\n\n    if (!cache) {\n        return EINVAL;\n    }\n\n    if ((entry = malloc(sizeof(*entry))) == NULL) {\n        return ENOMEM;\n    }\n\n    entry->key = ss_malloc(key_len + 1);\n    memcpy(entry->key, key, key_len);\n    entry->key[key_len] = 0;\n\n    entry->data = data;\n    entry->ts   = ev_time();\n    HASH_ADD_KEYPTR(hh, cache->entries, entry->key, key_len, entry);\n\n    if (HASH_COUNT(cache->entries) >= cache->max_entries) {\n        HASH_ITER(hh, cache->entries, entry, tmp_entry){\n            HASH_DELETE(hh, cache->entries, entry);\n            if (entry->data != NULL) {\n                if (cache->free_cb) {\n                    cache->free_cb(entry->key, entry->data);\n                } else {\n                    ss_free(entry->data);\n                }\n            }\n            ss_free(entry->key);\n            ss_free(entry);\n            break;\n        }\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/cache.h",
    "content": "/*\n * cache.h - Define the cache manager interface\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n/*\n * Original Author:  Oliver Lorenz (ol), olli@olorenz.org, https://olorenz.org\n * License:  This is licensed under the same terms as uthash itself\n */\n\n#ifndef _CACHE_\n#define _CACHE_\n\n#include \"uthash.h\"\n#include \"ev.h\"\n\n/**\n * A cache entry\n */\nstruct cache_entry {\n    char *key;         /**<The key */\n    void *data;        /**<Payload */\n    ev_tstamp ts;    /**<Timestamp */\n    UT_hash_handle hh; /**<Hash Handle for uthash */\n};\n\n/**\n * A cache object\n */\nstruct cache {\n    size_t max_entries;              /**<Amount of entries this cache object can hold */\n    struct cache_entry *entries;     /**<Head pointer for uthash */\n    void (*free_cb) (void *key, void *element); /**<Callback function to free cache entries */\n};\n\nint cache_create(struct cache **dst, const size_t capacity,\n                        void (*free_cb)(void *key, void *element));\nint cache_delete(struct cache *cache, int keep_data);\nint cache_clear(struct cache *cache, ev_tstamp age);\nint cache_lookup(struct cache *cache, char *key, size_t key_len, void *result);\nint cache_insert(struct cache *cache, char *key, size_t key_len, void *data);\nint cache_remove(struct cache *cache, char *key, size_t key_len);\nint cache_key_exist(struct cache *cache, char *key, size_t key_len);\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/check.c",
    "content": "#include <stdlib.h>\n#include <stdio.h>\n#include <unistd.h>\n#include <fcntl.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netdb.h>\n#include <netinet/in.h>\n#include <errno.h>\n#include <time.h>\n#include<arpa/inet.h>\n#include <setjmp.h>\n#include <signal.h>\n#include <string.h>\n\n//#define __DEBUG__  \n#ifdef __DEBUG__  \n#define DEBUG(format,...) printf(\"File: \"__FILE__\", Line: %05d: \"format\"/n\", __LINE__, ##__VA_ARGS__)  \n#else  \n#define DEBUG(format,...)  \n#endif  \n\nstatic sigjmp_buf jmpbuf;\nstatic void alarm_func()\n{\n    siglongjmp(jmpbuf, 1);\n}\n\nstatic struct hostent *timeGethostbyname(const char *domain, int timeout)\n{\n    struct hostent *ipHostent = NULL;\n    signal(SIGALRM, alarm_func);\n    if(sigsetjmp(jmpbuf, 1) != 0)\n    {\n        alarm(0);//timout\n        signal(SIGALRM, SIG_IGN);\n        return NULL;\n    }\n    alarm(timeout);//setting alarm\n    ipHostent = gethostbyname(domain);\n    signal(SIGALRM, SIG_IGN);\n    return ipHostent;\n}\n\n\n#define MY_HTTP_DEFAULT_PORT 80\n#define BUFFER_SIZE 1024\n#define HTTP_POST \"POST /%s HTTP/1.1\\r\\nHOST: %s:%d\\r\\nAccept: */*\\r\\n\"\\\n    \"Content-Type:application/x-www-form-urlencoded\\r\\nContent-Length: %d\\r\\n\\r\\n%s\"\n#define HTTP_GET \"GET /%s HTTP/1.1\\r\\nHOST: %s:%d\\r\\nAccept: */*\\r\\n\\r\\n\"\n\nstatic int http_parse_url(const char *url,char *host,char *file,int *port)\n{\n    char *ptr1,*ptr2;\n    int len = 0;\n    if(!url || !host || !file || !port){\n        return 1;\n    }\n\n    ptr1 = (char *)url;\n\n    if(!strncmp(ptr1,\"http://\",strlen(\"http://\"))){\n        ptr1 += strlen(\"http://\");\n    }else{\n        return 1;\n    }\n\n    ptr2 = strchr(ptr1,'/');\n    if(ptr2){\n        len = strlen(ptr1) - strlen(ptr2);\n        memcpy(host,ptr1,len);\n        host[len] = '\\0';\n        if(*(ptr2 + 1)){\n            memcpy(file,ptr2 + 1,strlen(ptr2) - 1 );\n            file[strlen(ptr2) - 1] = '\\0';\n        }\n    }else{\n        memcpy(host,ptr1,strlen(ptr1));\n        host[strlen(ptr1)] = '\\0';\n    }\n    //get host and ip\n    ptr1 = strchr(host,':');\n    if(ptr1){\n        *ptr1++ = '\\0';\n        *port = atoi(ptr1);\n    }else{\n        *port = MY_HTTP_DEFAULT_PORT;\n    }\n\n    return 0;\n}\n\n\nstatic int http_tcpclient_recv(int socket,char *lpbuff){\n    int recvnum = 0;\n\n    recvnum = recv(socket, lpbuff,BUFFER_SIZE*4,0);\n\n    return recvnum;\n}\n\nstatic int http_tcpclient_send(int socket,char *buff,int size){\n    int sent=0,tmpres=0;\n\n    while(sent < size){\n        tmpres = send(socket,buff+sent,size-sent,0);\n        if(tmpres == -1){\n            return 1;\n        }\n        sent += tmpres;\n    }\n    return sent;\n}\n\n\n\n\n\nint  http_get(const char *url,int socket_fd)\n{\n    char lpbuf[BUFFER_SIZE*4] = {'\\0'};\n\n    char host_addr[BUFFER_SIZE] = {'\\0'};\n    char file[BUFFER_SIZE] = {'\\0'};\n    int port = 0;\n\n\n    if(!url){\n       DEBUG(\"      failed!\\n\");\n        return 1;\n    }\n\n    if(http_parse_url(url,host_addr,file,&port)){\n       DEBUG(\"http_parse_url failed!\\n\");\n        return 1;\n    }\n    DEBUG(\"url:  %s\\thost_addr : %s\\tfile:%s\\t,%d\\n\",url,host_addr,file,port);\n\n\n    if(socket_fd < 0){\n       DEBUG(\"http_tcpclient_create failed\\n\");\n        return 1;\n    }\n\n    sprintf(lpbuf,HTTP_GET,file,host_addr,port);\n\n    if(http_tcpclient_send(socket_fd,lpbuf,strlen(lpbuf)) < 0){\n       DEBUG(\"http_tcpclient_send failed..\\n\");\n        return 1;\n    }\n\t  DEBUG(\"request:\\n%s\\n\",lpbuf);\n\n    if(http_tcpclient_recv(socket_fd,lpbuf) <= 0){\n       DEBUG(\"http_tcpclient_recv failed\\n\");\n        close(socket_fd);\n        return 1;\n    }\n    DEBUG(\"rec:\\n%s\\n\",lpbuf);\n    close(socket_fd);\n\n    //return http_parse_result(lpbuf);\nreturn 0;\n}\n\n\n\nint main(int argc, char *argv[])\n{\n        int fd,http_flag=0,http_ret=1;\n        struct sockaddr_in addr;\n        struct hostent *host;\n        struct timeval timeo = {3, 0};\n        socklen_t len = sizeof(timeo);\n        \n        char http_url[100]=\"http://\";\n\n   \n\n        fd = socket(AF_INET, SOCK_STREAM, 0);\n        if (argc >= 4)\n                 timeo.tv_sec = atoi(argv[3]);\n        if (argc>=5)\n         http_flag=1;\n         \n        if((host=timeGethostbyname(argv[1],timeo.tv_sec)) == NULL) {\n        DEBUG(\"gethostbyname err\\n\");\n        return 1;\n    }\n  if (setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeo, len) == -1)\n    {\n\n      DEBUG(\"setsockopt send err\\n\");\n       return 1;\n    }\n            \n  if (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeo, len) == -1)\n    {\n\n      DEBUG(\"setsockopt recv err\\n\");\n       return 1;\n    }\n  \n         addr.sin_family = AF_INET;\n         addr.sin_addr = *((struct in_addr *)host->h_addr);\n         //addr.sin_addr.s_addr = inet_addr(argv[1]);\n         addr.sin_port = htons(atoi(argv[2]));\nif (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1)\n    {  \n      if (errno == EINPROGRESS) \n       {\n         DEBUG(\"timeout err\\n\");\n          return 1;\n        }  \n       DEBUG(\"connect err\\n\");\n        return 1;\n    }\nif(http_flag==0)\n{\n close(fd);\n return 0;\n}\nstrcat(http_url,argv[1]);\nhttp_ret=http_get(http_url,fd);\nif(http_ret==1)\n{\nDEBUG(\"recv err\");\n return 1;\n}\nelse\n{\nDEBUG(\"recv ok\");\n\n return 0;\n}\n\n}"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/common.h",
    "content": "/*\n * common.h - Provide global definitions\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _COMMON_H\n#define _COMMON_H\n\n#define DEFAULT_CONF_PATH \"/etc/shadowsocks-libev/config.json\"\n\n#ifndef SOL_TCP\n#define SOL_TCP IPPROTO_TCP\n#endif\n\n#if defined(MODULE_TUNNEL) || defined(MODULE_REDIR)\n#define MODULE_LOCAL\n#endif\n\nint init_udprelay(const char *server_host, const char *server_port,\n#ifdef MODULE_LOCAL\n                  const struct sockaddr *remote_addr, const int remote_addr_len,\n#ifdef MODULE_TUNNEL\n                  const ss_addr_t tunnel_addr,\n#endif\n#endif\n                  int mtu, int method, int auth, int timeout, const char *iface, const char *protocol, const char *protocol_param);\n\nvoid free_udprelay(void);\n\n#ifdef ANDROID\nint protect_socket(int fd);\nint send_traffic_stat(uint64_t tx, uint64_t rx);\n#endif\n\n#define STAGE_ERROR     -1  /* Error detected                   */\n#define STAGE_INIT       0  /* Initial stage                    */\n#define STAGE_HANDSHAKE  1  /* Handshake with client            */\n#define STAGE_PARSE      2  /* Parse the header                 */\n#define STAGE_RESOLVE    4  /* Resolve the hostname             */\n#define STAGE_STREAM     5  /* Stream between client and server */\n\n#endif // _COMMON_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/crc32.c",
    "content": "static uint32_t crc32_table[256] = {0};\n\nvoid init_crc32_table(void) {\n    uint32_t c, i, j;\n    if (crc32_table[0] == 0) {\n        for (i = 0; i < 256; i++) {\n            c = i;\n            for (j = 0; j < 8; j++) {\n                if (c & 1)\n                    c = 0xedb88320L ^ (c >> 1);\n                else\n                    c = c >> 1;\n            }\n            crc32_table[i] = c;\n        }\n    }\n}\n\nuint32_t crc32(unsigned char *buffer, unsigned int size) {\n    uint32_t crc = 0xFFFFFFFF;\n    unsigned int i;\n    for (i = 0; i < size; i++) {\n        crc = crc32_table[(crc ^ buffer[i]) & 0xFF] ^ (crc >> 8);\n    }\n    return crc ^ 0xFFFFFFFF;\n}\n\nvoid fillcrc32to(unsigned char *buffer, unsigned int size, unsigned char *outbuffer) {\n    uint32_t crc = 0xFFFFFFFF;\n    unsigned int i;\n    for (i = 0; i < size; i++) {\n        crc = crc32_table[(crc ^ buffer[i]) & 0xff] ^ (crc >> 8);\n    }\n    crc ^= 0xFFFFFFFF;\n    outbuffer[0] = crc;\n    outbuffer[1] = crc >> 8;\n    outbuffer[2] = crc >> 16;\n    outbuffer[3] = crc >> 24;\n}\n\nvoid fillcrc32(unsigned char *buffer, unsigned int size) {\n    uint32_t crc = 0xFFFFFFFF;\n    unsigned int i;\n    size -= 4;\n    for (i = 0; i < size; i++) {\n        crc = crc32_table[(crc ^ buffer[i]) & 0xff] ^ (crc >> 8);\n    }\n    buffer += size;\n    buffer[0] = crc;\n    buffer[1] = crc >> 8;\n    buffer[2] = crc >> 16;\n    buffer[3] = crc >> 24;\n}\n\nvoid adler32_short(unsigned char *buffer, unsigned int size, uint32_t *a, uint32_t *b) {\n    for (int i = 0; i < size; i++) {\n        *a += buffer[i];\n        *b += *a;\n    }\n    *a %= 65521;\n    *b %= 65521;\n}\n\n#define NMAX 5552\nuint32_t adler32(unsigned char *buffer, unsigned int size) {\n    uint32_t a = 1;\n    uint32_t b = 0;\n    while ( size >= NMAX ) {\n        adler32_short(buffer, NMAX, &a, &b);\n        buffer += NMAX;\n        size -= NMAX;\n    }\n    adler32_short(buffer, size, &a, &b);\n    return (b << 16) + a;\n}\n#undef NMAX\n\nvoid filladler32(unsigned char *buffer, unsigned int size) {\n    size -= 4;\n    uint32_t checksum = adler32(buffer, size);\n    buffer += size;\n    buffer[0] = checksum;\n    buffer[1] = checksum >> 8;\n    buffer[2] = checksum >> 16;\n    buffer[3] = checksum >> 24;\n}\n\nint checkadler32(unsigned char *buffer, unsigned int size) {\n    size -= 4;\n    uint32_t checksum = adler32(buffer, size);\n    buffer += size;\n    return checksum == (((uint32_t)buffer[3] << 24)\n            | ((uint32_t)buffer[2] << 16)\n            | ((uint32_t)buffer[1] << 8)\n            | (uint32_t)buffer[0]);\n}\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/encrypt.c",
    "content": "/*\n * encrypt.c - Manage the global encryptor\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#include <stdint.h>\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#if defined(USE_CRYPTO_OPENSSL)\n\n#include <openssl/md5.h>\n#include <openssl/rand.h>\n#include <openssl/hmac.h>\n#include <openssl/aes.h>\n\n#elif defined(USE_CRYPTO_POLARSSL)\n\n#include <polarssl/md5.h>\n#include <polarssl/sha1.h>\n#include <polarssl/aes.h>\n#include <polarssl/entropy.h>\n#include <polarssl/ctr_drbg.h>\n#include <polarssl/version.h>\n#define CIPHER_UNSUPPORTED \"unsupported\"\n\n#include <time.h>\n#ifdef _WIN32\n#include <windows.h>\n#include <wincrypt.h>\n#else\n#include <stdio.h>\n#endif\n\n#elif defined(USE_CRYPTO_MBEDTLS)\n\n#include <mbedtls/md5.h>\n#include <mbedtls/entropy.h>\n#include <mbedtls/ctr_drbg.h>\n#include <mbedtls/version.h>\n#include <mbedtls/aes.h>\n#define CIPHER_UNSUPPORTED \"unsupported\"\n\n#include <time.h>\n#ifdef _WIN32\n#include <windows.h>\n#include <wincrypt.h>\n#else\n#include <stdio.h>\n#endif\n\n#endif\n\n#include <sodium.h>\n\n#ifndef __MINGW32__\n#include <arpa/inet.h>\n#endif\n\n#include \"cache.h\"\n#include \"encrypt.h\"\n#include \"utils.h\"\n\n#define OFFSET_ROL(p, o) ((uint64_t)(*(p + o)) << (8 * o))\n\nstatic uint8_t *enc_table;\nstatic uint8_t *dec_table;\nstatic uint8_t enc_key[MAX_KEY_LENGTH];\nstatic int enc_key_len;\nstatic int enc_iv_len;\nstatic int enc_method;\n\nstatic struct cache *iv_cache;\n\n#ifdef DEBUG\nstatic void\ndump(char *tag, char *text, int len)\n{\n    int i;\n    printf(\"%s: \", tag);\n    for (i = 0; i < len; i++)\n        printf(\"0x%02x \", (uint8_t)text[i]);\n    printf(\"\\n\");\n}\n\n#endif\n\nstatic const char *supported_ciphers[CIPHER_NUM] = {\n    \"table\",\n    \"rc4\",\n    \"rc4-md5-6\",\n    \"rc4-md5\",\n    \"aes-128-cfb\",\n    \"aes-192-cfb\",\n    \"aes-256-cfb\",\n    \"aes-128-ctr\",\n    \"aes-192-ctr\",\n    \"aes-256-ctr\",\n    \"bf-cfb\",\n    \"camellia-128-cfb\",\n    \"camellia-192-cfb\",\n    \"camellia-256-cfb\",\n    \"cast5-cfb\",\n    \"des-cfb\",\n    \"idea-cfb\",\n    \"rc2-cfb\",\n    \"seed-cfb\",\n    \"salsa20\",\n    \"chacha20\",\n    \"chacha20-ietf\"\n};\n\n#ifdef USE_CRYPTO_POLARSSL\nstatic const char *supported_ciphers_polarssl[CIPHER_NUM] = {\n    \"table\",\n    \"ARC4-128\",\n    \"ARC4-128\",\n    \"ARC4-128\",\n    \"AES-128-CFB128\",\n    \"AES-192-CFB128\",\n    \"AES-256-CFB128\",\n    \"AES-128-CTR\",\n    \"AES-192-CTR\",\n    \"AES-256-CTR\",\n    \"BLOWFISH-CFB64\",\n    \"CAMELLIA-128-CFB128\",\n    \"CAMELLIA-192-CFB128\",\n    \"CAMELLIA-256-CFB128\",\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    \"salsa20\",\n    \"chacha20\",\n    \"chacha20-ietf\"\n};\n#endif\n\n#ifdef USE_CRYPTO_MBEDTLS\nstatic const char *supported_ciphers_mbedtls[CIPHER_NUM] = {\n    \"table\",\n    \"ARC4-128\",\n    \"ARC4-128\",\n    \"ARC4-128\",\n    \"AES-128-CFB128\",\n    \"AES-192-CFB128\",\n    \"AES-256-CFB128\",\n    \"AES-128-CTR\",\n    \"AES-192-CTR\",\n    \"AES-256-CTR\",\n    \"BLOWFISH-CFB64\",\n    \"CAMELLIA-128-CFB128\",\n    \"CAMELLIA-192-CFB128\",\n    \"CAMELLIA-256-CFB128\",\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    \"salsa20\",\n    \"chacha20\",\n    \"chacha20-ietf\"\n};\n#endif\n\n#ifdef USE_CRYPTO_APPLECC\nstatic const CCAlgorithm supported_ciphers_applecc[CIPHER_NUM] = {\n    kCCAlgorithmInvalid,\n    kCCAlgorithmRC4,\n    kCCAlgorithmRC4,\n    kCCAlgorithmRC4,\n    kCCAlgorithmAES,\n    kCCAlgorithmAES,\n    kCCAlgorithmAES,\n    kCCAlgorithmAES,\n    kCCAlgorithmAES,\n    kCCAlgorithmAES,\n    kCCAlgorithmBlowfish,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmCAST,\n    kCCAlgorithmDES,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmRC2,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid\n};\n\nstatic const CCMode supported_modes_applecc[CIPHER_NUM] = {\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCModeRC4,\n    kCCModeRC4,\n    kCCModeCFB,\n    kCCModeCFB,\n    kCCModeCFB,\n    kCCModeCTR,\n    kCCModeCTR,\n    kCCModeCTR,\n    kCCModeCFB,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCModeCFB,\n    kCCModeCFB,\n    kCCModeCFB,\n    kCCModeCFB,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid\n};\n#endif\n\nstatic const int supported_ciphers_iv_size[CIPHER_NUM] = {\n    0,  0,  6, 16, 16, 16, 16, 16, 16, 16,  8, 16, 16, 16,  8,  8,  8,  8, 16,  8,  8, 12\n};\n\nstatic const int supported_ciphers_key_size[CIPHER_NUM] = {\n    0, 16, 16, 16, 16, 24, 32, 16, 24, 32, 16, 16, 24, 32, 16,  8, 16, 16, 16, 32, 32, 32\n};\n\nstatic int\nsafe_memcmp(const void *s1, const void *s2, size_t n)\n{\n    const unsigned char *_s1 = (const unsigned char *)s1;\n    const unsigned char *_s2 = (const unsigned char *)s2;\n    int ret                  = 0;\n    size_t i;\n    for (i = 0; i < n; i++)\n        ret |= _s1[i] ^ _s2[i];\n    return !!ret;\n}\n\nint\nballoc(buffer_t *ptr, size_t capacity)\n{\n    sodium_memzero(ptr, sizeof(buffer_t));\n    ptr->array    = ss_malloc(capacity);\n    ptr->capacity = capacity;\n    return capacity;\n}\n\nint\nbrealloc(buffer_t *ptr, size_t len, size_t capacity)\n{\n    if (ptr == NULL)\n        return -1;\n    size_t real_capacity = max(len, capacity);\n    if (ptr->capacity < real_capacity) {\n        ptr->array    = ss_realloc(ptr->array, real_capacity);\n        ptr->capacity = real_capacity;\n    }\n    return real_capacity;\n}\n\nvoid\nbfree(buffer_t *ptr)\n{\n    if (ptr == NULL)\n        return;\n    ptr->idx      = 0;\n    ptr->len      = 0;\n    ptr->capacity = 0;\n    if (ptr->array != NULL) {\n        ss_free(ptr->array);\n    }\n}\n\nstatic int\ncrypto_stream_xor_ic(uint8_t *c, const uint8_t *m, uint64_t mlen,\n                     const uint8_t *n, uint64_t ic, const uint8_t *k,\n                     int method)\n{\n    switch (method) {\n    case SALSA20:\n        return crypto_stream_salsa20_xor_ic(c, m, mlen, n, ic, k);\n    case CHACHA20:\n        return crypto_stream_chacha20_xor_ic(c, m, mlen, n, ic, k);\n    case CHACHA20IETF:\n        return crypto_stream_chacha20_ietf_xor_ic(c, m, mlen, n, (uint32_t)ic, k);\n    }\n    // always return 0\n    return 0;\n}\n\nstatic int\nrandom_compare(const void *_x, const void *_y, uint32_t i,\n               uint64_t a)\n{\n    uint8_t x = *((uint8_t *)_x);\n    uint8_t y = *((uint8_t *)_y);\n    return a % (x + i) - a % (y + i);\n}\n\nstatic void\nmerge(uint8_t *left, int llength, uint8_t *right,\n      int rlength, uint32_t salt, uint64_t key)\n{\n    uint8_t *ltmp = (uint8_t *)malloc(llength * sizeof(uint8_t));\n    uint8_t *rtmp = (uint8_t *)malloc(rlength * sizeof(uint8_t));\n\n    uint8_t *ll = ltmp;\n    uint8_t *rr = rtmp;\n\n    uint8_t *result = left;\n\n    memcpy(ltmp, left, llength * sizeof(uint8_t));\n    memcpy(rtmp, right, rlength * sizeof(uint8_t));\n\n    while (llength > 0 && rlength > 0) {\n        if (random_compare(ll, rr, salt, key) <= 0) {\n            *result = *ll;\n            ++ll;\n            --llength;\n        } else {\n            *result = *rr;\n            ++rr;\n            --rlength;\n        }\n        ++result;\n    }\n\n    if (llength > 0) {\n        while (llength > 0) {\n            *result = *ll;\n            ++result;\n            ++ll;\n            --llength;\n        }\n    } else {\n        while (rlength > 0) {\n            *result = *rr;\n            ++result;\n            ++rr;\n            --rlength;\n        }\n    }\n\n    ss_free(ltmp);\n    ss_free(rtmp);\n}\n\nstatic void\nmerge_sort(uint8_t array[], int length,\n           uint32_t salt, uint64_t key)\n{\n    uint8_t middle;\n    uint8_t *left, *right;\n    int llength;\n\n    if (length <= 1) {\n        return;\n    }\n\n    middle = length / 2;\n\n    llength = length - middle;\n\n    left  = array;\n    right = array + llength;\n\n    merge_sort(left, llength, salt, key);\n    merge_sort(right, middle, salt, key);\n    merge(left, llength, right, middle, salt, key);\n}\n\nint\nenc_get_iv_len()\n{\n    return enc_iv_len;\n}\n\nuint8_t* enc_get_key()\n{\n    return enc_key;\n}\n\nint enc_get_key_len()\n{\n    return enc_key_len;\n}\n\nunsigned char *enc_md5(const unsigned char *d, size_t n, unsigned char *md)\n{\n#if defined(USE_CRYPTO_OPENSSL)\n    return MD5(d, n, md);\n#elif defined(USE_CRYPTO_POLARSSL)\n    static unsigned char m[16];\n    if (md == NULL) {\n        md = m;\n    }\n    md5(d, n, md);\n    return md;\n#elif defined(USE_CRYPTO_MBEDTLS)\n    static unsigned char m[16];\n    if (md == NULL) {\n        md = m;\n    }\n    mbedtls_md5(d, n, md);\n    return md;\n#endif\n}\n\nvoid\nenc_table_init(const char *pass)\n{\n    uint32_t i;\n    uint64_t key = 0;\n    uint8_t *digest;\n\n    enc_table = ss_malloc(256);\n    dec_table = ss_malloc(256);\n\n    digest = enc_md5((const uint8_t *)pass, strlen(pass), NULL);\n\n    for (i = 0; i < 8; i++)\n        key += OFFSET_ROL(digest, i);\n\n    for (i = 0; i < 256; ++i)\n        enc_table[i] = i;\n    for (i = 1; i < 1024; ++i)\n        merge_sort(enc_table, 256, i, key);\n    for (i = 0; i < 256; ++i)\n        // gen decrypt table from encrypt table\n        dec_table[enc_table[i]] = i;\n}\n\nint\ncipher_iv_size(const cipher_t *cipher)\n{\n#if defined(USE_CRYPTO_OPENSSL)\n    if (cipher->info == NULL)\n        return cipher->iv_len;\n    else\n        return EVP_CIPHER_iv_length(cipher->info);\n#elif defined(USE_CRYPTO_POLARSSL) || defined(USE_CRYPTO_MBEDTLS)\n    if (cipher == NULL) {\n        return 0;\n    }\n    return cipher->info->iv_size;\n#endif\n}\n\nint\ncipher_key_size(const cipher_t *cipher)\n{\n#if defined(USE_CRYPTO_OPENSSL)\n    if (cipher->info == NULL)\n        return cipher->key_len;\n    else\n        return EVP_CIPHER_key_length(cipher->info);\n#elif defined(USE_CRYPTO_POLARSSL)\n    if (cipher == NULL) {\n        return 0;\n    }\n    /* Override PolarSSL 32 bit default key size with sane 128 bit default */\n    if (cipher->info->base != NULL && POLARSSL_CIPHER_ID_BLOWFISH ==\n        cipher->info->base->cipher) {\n        return 128 / 8;\n    }\n    return cipher->info->key_length / 8;\n#elif defined(USE_CRYPTO_MBEDTLS)\n    /*\n     * Semi-API changes (technically public, morally private)\n     * Renamed a few headers to include _internal in the name. Those headers are\n     * not supposed to be included by users.\n     * Changed md_info_t into an opaque structure (use md_get_xxx() accessors).\n     * Changed pk_info_t into an opaque structure.\n     * Changed cipher_base_t into an opaque structure.\n     */\n    if (cipher == NULL) {\n        return 0;\n    }\n    /* From Version 1.2.7 released 2013-04-13 Default Blowfish keysize is now 128-bits */\n    return cipher->info->key_bitlen / 8;\n#endif\n}\n\nvoid\nbytes_to_key_with_size(const char *pass, size_t len, uint8_t *md, size_t md_size)\n{\n    uint8_t result[128];\n    enc_md5((const unsigned char *)pass, len, result);\n    memcpy(md, result, 16);\n    int i = 16;\n    for (; i < md_size; i += 16) {\n        memcpy(result + 16, pass, len);\n        enc_md5(result, 16 + len, result);\n        memcpy(md + i, result, 16);\n    }\n}\n\nint\nbytes_to_key(const cipher_t *cipher, const digest_type_t *md,\n             const uint8_t *pass, uint8_t *key)\n{\n    size_t datal;\n    datal = strlen((const char *)pass);\n\n#if defined(USE_CRYPTO_OPENSSL)\n\n    MD5_CTX c;\n    unsigned char md_buf[MAX_MD_SIZE];\n    int nkey;\n    int addmd;\n    unsigned int i, j, mds;\n\n    mds  = 16;\n    nkey = cipher_key_size(cipher);\n    if (pass == NULL)\n        return nkey;\n    memset(&c, 0, sizeof(MD5_CTX));\n\n    for (j = 0, addmd = 0; j < nkey; addmd++) {\n        MD5_Init(&c);\n        if (addmd) {\n            MD5_Update(&c, md_buf, mds);\n        }\n        MD5_Update(&c, pass, datal);\n        MD5_Final(md_buf, &c);\n\n        for (i = 0; i < mds; i++, j++) {\n            if (j >= nkey)\n                break;\n            key[j] = md_buf[i];\n        }\n    }\n\n    return nkey;\n\n#elif defined(USE_CRYPTO_POLARSSL)\n    md_context_t c;\n    unsigned char md_buf[MAX_MD_SIZE];\n    int nkey;\n    int addmd;\n    unsigned int i, j, mds;\n\n    nkey = cipher_key_size(cipher);\n    mds  = md_get_size(md);\n    memset(&c, 0, sizeof(md_context_t));\n\n    if (pass == NULL)\n        return nkey;\n    if (md_init_ctx(&c, md))\n        return 0;\n\n    for (j = 0, addmd = 0; j < nkey; addmd++) {\n        md_starts(&c);\n        if (addmd) {\n            md_update(&c, md_buf, mds);\n        }\n        md_update(&c, pass, datal);\n        md_finish(&c, md_buf);\n\n        for (i = 0; i < mds; i++, j++) {\n            if (j >= nkey)\n                break;\n            key[j] = md_buf[i];\n        }\n    }\n\n    md_free_ctx(&c);\n    return nkey;\n\n#elif defined(USE_CRYPTO_MBEDTLS)\n\n    mbedtls_md_context_t c;\n    unsigned char md_buf[MAX_MD_SIZE];\n    int nkey;\n    int addmd;\n    unsigned int i, j, mds;\n\n    nkey = cipher_key_size(cipher);\n    mds  = mbedtls_md_get_size(md);\n    memset(&c, 0, sizeof(mbedtls_md_context_t));\n\n    if (pass == NULL)\n        return nkey;\n    if (mbedtls_md_setup(&c, md, 1))\n        return 0;\n\n    for (j = 0, addmd = 0; j < nkey; addmd++) {\n        mbedtls_md_starts(&c);\n        if (addmd) {\n            mbedtls_md_update(&c, md_buf, mds);\n        }\n        mbedtls_md_update(&c, pass, datal);\n        mbedtls_md_finish(&c, &(md_buf[0]));\n\n        for (i = 0; i < mds; i++, j++) {\n            if (j >= nkey)\n                break;\n            key[j] = md_buf[i];\n        }\n    }\n\n    mbedtls_md_free(&c);\n    return nkey;\n#endif\n}\n\nint\nrand_bytes(uint8_t *output, int len)\n{\n    randombytes_buf(output, len);\n    // always return success\n    return 0;\n}\n\nconst cipher_kt_t *\nget_cipher_type(int method)\n{\n    if (method <= TABLE || method >= CIPHER_NUM) {\n        LOGE(\"get_cipher_type(): Illegal method\");\n        return NULL;\n    }\n\n    if (method == RC4_MD5 || method == RC4_MD5_6) {\n        method = RC4;\n    }\n\n    if (method >= SALSA20) {\n        return NULL;\n    }\n\n    const char *ciphername = supported_ciphers[method];\n#if defined(USE_CRYPTO_OPENSSL)\n    return EVP_get_cipherbyname(ciphername);\n#elif defined(USE_CRYPTO_POLARSSL)\n    const char *polarname = supported_ciphers_polarssl[method];\n    if (strcmp(polarname, CIPHER_UNSUPPORTED) == 0) {\n        LOGE(\"Cipher %s currently is not supported by PolarSSL library\",\n             ciphername);\n        return NULL;\n    }\n    return cipher_info_from_string(polarname);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    const char *mbedtlsname = supported_ciphers_mbedtls[method];\n    if (strcmp(mbedtlsname, CIPHER_UNSUPPORTED) == 0) {\n        LOGE(\"Cipher %s currently is not supported by mbed TLS library\",\n             ciphername);\n        return NULL;\n    }\n    return mbedtls_cipher_info_from_string(mbedtlsname);\n#endif\n}\n\nconst digest_type_t *\nget_digest_type(const char *digest)\n{\n    if (digest == NULL) {\n        LOGE(\"get_digest_type(): Digest name is null\");\n        return NULL;\n    }\n\n#if defined(USE_CRYPTO_OPENSSL)\n    return EVP_get_digestbyname(digest);\n#elif defined(USE_CRYPTO_POLARSSL)\n    return md_info_from_string(digest);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    return mbedtls_md_info_from_string(digest);\n#endif\n}\n\nvoid\ncipher_context_init(cipher_ctx_t *ctx, int method, int enc)\n{\n    if (method <= TABLE || method >= CIPHER_NUM) {\n        LOGE(\"cipher_context_init(): Illegal method\");\n        return;\n    }\n\n    if (method >= SALSA20) {\n        enc_iv_len = supported_ciphers_iv_size[method];\n        return;\n    }\n\n    const char *ciphername = supported_ciphers[method];\n#if defined(USE_CRYPTO_APPLECC)\n    cipher_cc_t *cc = &ctx->cc;\n    cc->cryptor = NULL;\n    cc->cipher  = supported_ciphers_applecc[method];\n    if (cc->cipher == kCCAlgorithmInvalid) {\n        cc->valid = kCCContextInvalid;\n    } else {\n        cc->valid = kCCContextValid;\n        if (cc->cipher == kCCAlgorithmRC4) {\n            cc->mode    = supported_modes_applecc[method];\n            cc->padding = ccNoPadding;\n        } else {\n            cc->mode = supported_modes_applecc[method];\n            if (cc->mode == kCCModeCTR) {\n                cc->padding = ccNoPadding;\n            } else {\n                cc->padding = ccPKCS7Padding;\n            }\n        }\n        return;\n    }\n#endif\n\n    const cipher_kt_t *cipher = get_cipher_type(method);\n\n#if defined(USE_CRYPTO_OPENSSL)\n    ctx->evp = EVP_CIPHER_CTX_new();\n    cipher_evp_t *evp = ctx->evp;\n\n    if (cipher == NULL) {\n        LOGE(\"Cipher %s not found in OpenSSL library\", ciphername);\n        FATAL(\"Cannot initialize cipher\");\n    }\n    if (!EVP_CipherInit_ex(evp, cipher, NULL, NULL, NULL, enc)) {\n        LOGE(\"Cannot initialize cipher %s\", ciphername);\n        exit(EXIT_FAILURE);\n    }\n    if (!EVP_CIPHER_CTX_set_key_length(evp, enc_key_len)) {\n        EVP_CIPHER_CTX_cleanup(evp);\n        LOGE(\"Invalid key length: %d\", enc_key_len);\n        exit(EXIT_FAILURE);\n    }\n    if (method > RC4_MD5) {\n        EVP_CIPHER_CTX_set_padding(evp, 1);\n    }\n#elif defined(USE_CRYPTO_POLARSSL)\n    ctx->evp = (cipher_evp_t *)ss_malloc(sizeof(cipher_evp_t));\n    cipher_evp_t *evp = ctx->evp;\n\n    if (cipher == NULL) {\n        LOGE(\"Cipher %s not found in PolarSSL library\", ciphername);\n        FATAL(\"Cannot initialize PolarSSL cipher\");\n    }\n    if (cipher_init_ctx(evp, cipher) != 0) {\n        FATAL(\"Cannot initialize PolarSSL cipher context\");\n    }\n#elif defined(USE_CRYPTO_MBEDTLS)\n    ctx->evp = (cipher_evp_t *)ss_malloc(sizeof(cipher_evp_t));\n    cipher_evp_t *evp = ctx->evp;\n\n    if (cipher == NULL) {\n        LOGE(\"Cipher %s not found in mbed TLS library\", ciphername);\n        FATAL(\"Cannot initialize mbed TLS cipher\");\n    }\n    mbedtls_cipher_init(evp);\n    if (mbedtls_cipher_setup(evp, cipher) != 0) {\n        FATAL(\"Cannot initialize mbed TLS cipher context\");\n    }\n#endif\n}\n\nvoid\ncipher_context_set_iv(cipher_ctx_t *ctx, uint8_t *iv, size_t iv_len,\n                      int enc)\n{\n    const unsigned char *true_key;\n\n    if (iv == NULL) {\n        LOGE(\"cipher_context_set_iv(): IV is null\");\n        return;\n    }\n\n    if (!enc) {\n        memcpy(ctx->iv, iv, iv_len);\n    }\n\n    if (enc_method >= SALSA20) {\n        return;\n    }\n\n    if (enc_method == RC4_MD5 || enc_method == RC4_MD5_6) {\n        unsigned char key_iv[32];\n        memcpy(key_iv, enc_key, 16);\n        memcpy(key_iv + 16, iv, iv_len);\n        true_key = enc_md5(key_iv, 16 + iv_len, NULL);\n        iv_len   = 0;\n    } else {\n        true_key = enc_key;\n    }\n\n#ifdef USE_CRYPTO_APPLECC\n    cipher_cc_t *cc = &ctx->cc;\n    if (cc->valid == kCCContextValid) {\n        memcpy(cc->iv, iv, iv_len);\n        memcpy(cc->key, true_key, enc_key_len);\n        cc->iv_len  = iv_len;\n        cc->key_len = enc_key_len;\n        cc->encrypt = enc ? kCCEncrypt : kCCDecrypt;\n        if (cc->cryptor != NULL) {\n            CCCryptorRelease(cc->cryptor);\n            cc->cryptor = NULL;\n        }\n\n        CCCryptorStatus ret;\n        ret = CCCryptorCreateWithMode(\n            cc->encrypt,\n            cc->mode,\n            cc->cipher,\n            cc->padding,\n            cc->iv, cc->key, cc->key_len,\n            NULL, 0, 0, kCCModeOptionCTR_BE,\n            &cc->cryptor);\n        if (ret != kCCSuccess) {\n            if (cc->cryptor != NULL) {\n                CCCryptorRelease(cc->cryptor);\n                cc->cryptor = NULL;\n            }\n            FATAL(\"Cannot set CommonCrypto key and IV\");\n        }\n        return;\n    }\n#endif\n\n    cipher_evp_t *evp = ctx->evp;\n    if (evp == NULL) {\n        LOGE(\"cipher_context_set_iv(): Cipher context is null\");\n        return;\n    }\n#if defined(USE_CRYPTO_OPENSSL)\n    if (!EVP_CipherInit_ex(evp, NULL, NULL, true_key, iv, enc)) {\n        EVP_CIPHER_CTX_cleanup(evp);\n        FATAL(\"Cannot set key and IV\");\n    }\n#elif defined(USE_CRYPTO_POLARSSL)\n    // XXX: PolarSSL 1.3.11: cipher_free_ctx deprecated, Use cipher_free() instead.\n    if (cipher_setkey(evp, true_key, enc_key_len * 8, enc) != 0) {\n        cipher_free_ctx(evp);\n        FATAL(\"Cannot set PolarSSL cipher key\");\n    }\n#if POLARSSL_VERSION_NUMBER >= 0x01030000\n    if (cipher_set_iv(evp, iv, iv_len) != 0) {\n        cipher_free_ctx(evp);\n        FATAL(\"Cannot set PolarSSL cipher IV\");\n    }\n    if (cipher_reset(evp) != 0) {\n        cipher_free_ctx(evp);\n        FATAL(\"Cannot finalize PolarSSL cipher context\");\n    }\n#else\n    if (cipher_reset(evp, iv) != 0) {\n        cipher_free_ctx(evp);\n        FATAL(\"Cannot set PolarSSL cipher IV\");\n    }\n#endif\n#elif defined(USE_CRYPTO_MBEDTLS)\n    if (mbedtls_cipher_setkey(evp, true_key, enc_key_len * 8, enc) != 0) {\n        mbedtls_cipher_free(evp);\n        FATAL(\"Cannot set mbed TLS cipher key\");\n    }\n\n    if (mbedtls_cipher_set_iv(evp, iv, iv_len) != 0) {\n        mbedtls_cipher_free(evp);\n        FATAL(\"Cannot set mbed TLS cipher IV\");\n    }\n    if (mbedtls_cipher_reset(evp) != 0) {\n        mbedtls_cipher_free(evp);\n        FATAL(\"Cannot finalize mbed TLS cipher context\");\n    }\n#endif\n\n#ifdef DEBUG\n    dump(\"IV\", (char *)iv, iv_len);\n#endif\n}\n\nvoid\ncipher_context_release(cipher_ctx_t *ctx)\n{\n    if (enc_method >= SALSA20) {\n        return;\n    }\n\n#ifdef USE_CRYPTO_APPLECC\n    cipher_cc_t *cc = &ctx->cc;\n    if (cc->cryptor != NULL) {\n        CCCryptorRelease(cc->cryptor);\n        cc->cryptor = NULL;\n    }\n    if (cc->valid == kCCContextValid) {\n        return;\n    }\n#endif\n\n#if defined(USE_CRYPTO_OPENSSL)\n    EVP_CIPHER_CTX_free(ctx->evp);\n#elif defined(USE_CRYPTO_POLARSSL)\n// NOTE: cipher_free_ctx deprecated in PolarSSL 1.3.11\n    cipher_free_ctx(ctx->evp);\n    ss_free(ctx->evp);\n#elif defined(USE_CRYPTO_MBEDTLS)\n// NOTE: cipher_free_ctx deprecated\n    mbedtls_cipher_free(ctx->evp);\n    ss_free(ctx->evp);\n#endif\n}\n\nstatic int\ncipher_context_update(cipher_ctx_t *ctx, uint8_t *output, size_t *olen,\n                      const uint8_t *input, size_t ilen)\n{\n#ifdef USE_CRYPTO_APPLECC\n    cipher_cc_t *cc = &ctx->cc;\n    if (cc->valid == kCCContextValid) {\n        CCCryptorStatus ret;\n        ret = CCCryptorUpdate(cc->cryptor, input, ilen, output,\n                              ilen, olen);\n        return (ret == kCCSuccess) ? 1 : 0;\n    }\n#endif\n    cipher_evp_t *evp = ctx->evp;\n#if defined(USE_CRYPTO_OPENSSL)\n    int err = 0, tlen = *olen;\n    err = EVP_CipherUpdate(evp, (uint8_t *)output, &tlen,\n                           (const uint8_t *)input, ilen);\n    *olen = tlen;\n    return err;\n#elif defined(USE_CRYPTO_POLARSSL)\n    return !cipher_update(evp, (const uint8_t *)input, ilen,\n                          (uint8_t *)output, olen);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    return !mbedtls_cipher_update(evp, (const uint8_t *)input, ilen,\n                                  (uint8_t *)output, olen);\n#endif\n}\nint ss_md5_hmac(char *auth, char *msg, int msg_len, uint8_t *iv)\n{\n    uint8_t hash[MD5_BYTES];\n    uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH];\n    memcpy(auth_key, iv, enc_iv_len);\n    memcpy(auth_key + enc_iv_len, enc_key, enc_key_len);\n\n#if defined(USE_CRYPTO_OPENSSL)\n    HMAC(EVP_md5(), auth_key, enc_iv_len + enc_key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_MD5), auth_key, enc_iv_len + enc_key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#else\n    md5_hmac(auth_key, enc_iv_len + enc_key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#endif\n\n    memcpy(auth, hash, MD5_BYTES);\n\n    return 0;\n}\n\nint ss_md5_hmac_with_key(char *auth, char *msg, int msg_len, uint8_t *auth_key, int key_len)\n{\n    uint8_t hash[MD5_BYTES];\n\n#if defined(USE_CRYPTO_OPENSSL)\n    HMAC(EVP_md5(), auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_MD5), auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#else\n    md5_hmac(auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#endif\n\n    memcpy(auth, hash, MD5_BYTES);\n\n    return 0;\n}\n\nint ss_md5_hash_func(char *auth, char *msg, int msg_len)\n{\n    uint8_t hash[MD5_BYTES];\n\n#if defined(USE_CRYPTO_OPENSSL)\n    MD5((uint8_t *)msg, msg_len, (uint8_t *)hash);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md(mbedtls_md_info_from_type(MBEDTLS_MD_MD5), (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#else\n    md5((uint8_t *)msg, msg_len, (uint8_t *)hash);\n#endif\n\n    memcpy(auth, hash, MD5_BYTES);\n\n    return 0;\n}\n\nint ss_sha1_hmac(char *auth, char *msg, int msg_len, uint8_t *iv)\n{\n    uint8_t hash[SHA1_BYTES];\n    uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH];\n    memcpy(auth_key, iv, enc_iv_len);\n    memcpy(auth_key + enc_iv_len, enc_key, enc_key_len);\n\n#if defined(USE_CRYPTO_OPENSSL)\n    HMAC(EVP_sha1(), auth_key, enc_iv_len + enc_key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), auth_key, enc_iv_len + enc_key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#else\n    sha1_hmac(auth_key, enc_iv_len + enc_key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#endif\n\n    memcpy(auth, hash, SHA1_BYTES);\n\n    return 0;\n}\n\nint ss_sha1_hmac_with_key(char *auth, char *msg, int msg_len, uint8_t *auth_key, int key_len)\n{\n    uint8_t hash[SHA1_BYTES];\n\n#if defined(USE_CRYPTO_OPENSSL)\n    HMAC(EVP_sha1(), auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#else\n    sha1_hmac(auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#endif\n\n    memcpy(auth, hash, SHA1_BYTES);\n\n    return 0;\n}\n\nint ss_sha1_hash_func(char *auth, char *msg, int msg_len)\n{\n    uint8_t hash[SHA1_BYTES];\n#if defined(USE_CRYPTO_OPENSSL)\n    SHA1((uint8_t *)msg, msg_len, (uint8_t *)hash);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md(mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#else\n    sha1((uint8_t *)msg, msg_len, (uint8_t *)hash);\n#endif\n\n    memcpy(auth, hash, SHA1_BYTES);\n\n    return 0;\n}\n\nint ss_aes_128_cbc(char *encrypt, char *out_data, char *key)\n{\n    unsigned char iv[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };\n\n#if defined(USE_CRYPTO_OPENSSL)\n    AES_KEY aes;\n    AES_set_encrypt_key((unsigned char*)key, 128, &aes);\n    AES_cbc_encrypt((const unsigned char *)encrypt, (unsigned char *)out_data, 16, &aes, iv, AES_ENCRYPT);\n\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_aes_context aes;\n\n    unsigned char output[16];\n\n    mbedtls_aes_setkey_enc( &aes, (unsigned char *)key, 128 );\n    mbedtls_aes_crypt_cbc( &aes, MBEDTLS_AES_ENCRYPT, 16, iv, (unsigned char *)encrypt, output );\n\n    memcpy(out_data, output, 16);\n#else\n\n    aes_context aes;\n\n    unsigned char output[16];\n\n    aes_setkey_enc( &aes, (unsigned char *)key, 128 );\n    aes_crypt_cbc( &aes, AES_ENCRYPT, 16, iv, (unsigned char *)encrypt, output );\n\n    memcpy(out_data, output, 16);\n#endif\n\n    return 0;\n}\n\nint ss_onetimeauth(buffer_t *buf, uint8_t *iv, size_t capacity)\n{\n    uint8_t hash[ONETIMEAUTH_BYTES * 2];\n    uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH];\n    memcpy(auth_key, iv, enc_iv_len);\n    memcpy(auth_key + enc_iv_len, enc_key, enc_key_len);\n\n    brealloc(buf, ONETIMEAUTH_BYTES + buf->len, capacity);\n\n#if defined(USE_CRYPTO_OPENSSL)\n    HMAC(EVP_sha1(), auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, buf->len, (uint8_t *)hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md_hmac(mbedtls_md_info_from_type(\n                        MBEDTLS_MD_SHA1), auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, buf->len,\n                    (uint8_t *)hash);\n#else\n    sha1_hmac(auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, buf->len, (uint8_t *)hash);\n#endif\n\n    memcpy(buf->array + buf->len, hash, ONETIMEAUTH_BYTES);\n    buf->len += ONETIMEAUTH_BYTES;\n\n    return 0;\n}\n\nint\nss_onetimeauth_verify(buffer_t *buf, uint8_t *iv)\n{\n    uint8_t hash[ONETIMEAUTH_BYTES * 2];\n    uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH];\n    memcpy(auth_key, iv, enc_iv_len);\n    memcpy(auth_key + enc_iv_len, enc_key, enc_key_len);\n    size_t len = buf->len - ONETIMEAUTH_BYTES;\n\n#if defined(USE_CRYPTO_OPENSSL)\n    HMAC(EVP_sha1(), auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, len, hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md_hmac(mbedtls_md_info_from_type(\n                        MBEDTLS_MD_SHA1), auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, len, hash);\n#else\n    sha1_hmac(auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, len, hash);\n#endif\n\n    return safe_memcmp(buf->array + len, hash, ONETIMEAUTH_BYTES);\n}\n\nint\nss_encrypt_all(buffer_t *plain, int method, int auth, size_t capacity)\n{\n    if (method > TABLE) {\n        cipher_ctx_t evp;\n        cipher_context_init(&evp, method, 1);\n\n        size_t iv_len = enc_iv_len;\n        int err       = 1;\n\n        static buffer_t tmp = { 0, 0, 0, NULL };\n        brealloc(&tmp, iv_len + plain->len, capacity);\n        buffer_t *cipher = &tmp;\n        cipher->len = plain->len;\n\n        uint8_t iv[MAX_IV_LENGTH];\n\n        rand_bytes(iv, iv_len);\n        cipher_context_set_iv(&evp, iv, iv_len, 1);\n        memcpy(cipher->array, iv, iv_len);\n\n        if (auth) {\n            ss_onetimeauth(plain, iv, capacity);\n            cipher->len = plain->len;\n        }\n\n        if (method >= SALSA20) {\n            crypto_stream_xor_ic((uint8_t *)(cipher->array + iv_len),\n                                 (const uint8_t *)plain->array, (uint64_t)(plain->len),\n                                 (const uint8_t *)iv,\n                                 0, enc_key, method);\n        } else {\n            err = cipher_context_update(&evp, (uint8_t *)(cipher->array + iv_len),\n                                        &cipher->len, (const uint8_t *)plain->array,\n                                        plain->len);\n        }\n\n        if (!err) {\n            bfree(plain);\n            cipher_context_release(&evp);\n            return -1;\n        }\n\n#ifdef DEBUG\n        dump(\"PLAIN\", plain->array, plain->len);\n        dump(\"CIPHER\", cipher->array + iv_len, cipher->len);\n#endif\n\n        cipher_context_release(&evp);\n\n        brealloc(plain, iv_len + cipher->len, capacity);\n        memcpy(plain->array, cipher->array, iv_len + cipher->len);\n        plain->len = iv_len + cipher->len;\n\n        return 0;\n    } else {\n        char *begin = plain->array;\n        char *ptr   = plain->array;\n        while (ptr < begin + plain->len) {\n            *ptr = (char)enc_table[(uint8_t)*ptr];\n            ptr++;\n        }\n        return 0;\n    }\n}\n\nint\nss_encrypt(buffer_t *plain, enc_ctx_t *ctx, size_t capacity)\n{\n    if (ctx != NULL) {\n        static buffer_t tmp = { 0, 0, 0, NULL };\n\n        int err       = 1;\n        size_t iv_len = 0;\n        if (!ctx->init) {\n            iv_len = enc_iv_len;\n        }\n\n        brealloc(&tmp, iv_len + plain->len, capacity);\n        buffer_t *cipher = &tmp;\n        cipher->len = plain->len;\n\n        if (!ctx->init) {\n            cipher_context_set_iv(&ctx->evp, ctx->evp.iv, iv_len, 1);\n            memcpy(cipher->array, ctx->evp.iv, iv_len);\n            ctx->counter = 0;\n            ctx->init    = 1;\n        }\n\n        if (enc_method >= SALSA20) {\n            int padding = ctx->counter % SODIUM_BLOCK_SIZE;\n            brealloc(cipher, iv_len + (padding + cipher->len) * 2, capacity);\n            if (padding) {\n                brealloc(plain, plain->len + padding, capacity);\n                memmove(plain->array + padding, plain->array, plain->len);\n                sodium_memzero(plain->array, padding);\n            }\n            crypto_stream_xor_ic((uint8_t *)(cipher->array + iv_len),\n                                 (const uint8_t *)plain->array,\n                                 (uint64_t)(plain->len + padding),\n                                 (const uint8_t *)ctx->evp.iv,\n                                 ctx->counter / SODIUM_BLOCK_SIZE, enc_key,\n                                 enc_method);\n            ctx->counter += plain->len;\n            if (padding) {\n                memmove(cipher->array + iv_len,\n                        cipher->array + iv_len + padding, cipher->len);\n            }\n        } else {\n            err =\n                cipher_context_update(&ctx->evp,\n                                      (uint8_t *)(cipher->array + iv_len),\n                                      &cipher->len, (const uint8_t *)plain->array,\n                                      plain->len);\n            if (!err) {\n                return -1;\n            }\n        }\n\n#ifdef DEBUG\n        dump(\"PLAIN\", plain->array, plain->len);\n        dump(\"CIPHER\", cipher->array + iv_len, cipher->len);\n#endif\n\n        brealloc(plain, iv_len + cipher->len, capacity);\n        memcpy(plain->array, cipher->array, iv_len + cipher->len);\n        plain->len = iv_len + cipher->len;\n\n        return 0;\n    } else {\n        char *begin = plain->array;\n        char *ptr   = plain->array;\n        while (ptr < begin + plain->len) {\n            *ptr = (char)enc_table[(uint8_t)*ptr];\n            ptr++;\n        }\n        return 0;\n    }\n}\n\nint\nss_decrypt_all(buffer_t *cipher, int method, int auth, size_t capacity)\n{\n    if (method > TABLE) {\n        size_t iv_len = enc_iv_len;\n        int ret       = 1;\n\n        if (cipher->len <= iv_len) {\n            return -1;\n        }\n\n        cipher_ctx_t evp;\n        cipher_context_init(&evp, method, 0);\n\n        static buffer_t tmp = { 0, 0, 0, NULL };\n        brealloc(&tmp, cipher->len, capacity);\n        buffer_t *plain = &tmp;\n        plain->len = cipher->len - iv_len;\n\n        uint8_t iv[MAX_IV_LENGTH];\n        memcpy(iv, cipher->array, iv_len);\n        cipher_context_set_iv(&evp, iv, iv_len, 0);\n\n        if (method >= SALSA20) {\n            crypto_stream_xor_ic((uint8_t *)plain->array,\n                                 (const uint8_t *)(cipher->array + iv_len),\n                                 (uint64_t)(cipher->len - iv_len),\n                                 (const uint8_t *)iv, 0, enc_key, method);\n        } else {\n            ret = cipher_context_update(&evp, (uint8_t *)plain->array, &plain->len,\n                                        (const uint8_t *)(cipher->array + iv_len),\n                                        cipher->len - iv_len);\n        }\n\n        if (auth || (plain->array[0] & ONETIMEAUTH_FLAG)) {\n            if (plain->len > ONETIMEAUTH_BYTES) {\n                ret = !ss_onetimeauth_verify(plain, iv);\n                if (ret) {\n                    plain->len -= ONETIMEAUTH_BYTES;\n                }\n            } else {\n                ret = 0;\n            }\n        }\n\n        if (!ret) {\n            bfree(cipher);\n            cipher_context_release(&evp);\n            return -1;\n        }\n\n#ifdef DEBUG\n        dump(\"PLAIN\", plain->array, plain->len);\n        dump(\"CIPHER\", cipher->array + iv_len, cipher->len - iv_len);\n#endif\n\n        cipher_context_release(&evp);\n\n        brealloc(cipher, plain->len, capacity);\n        memcpy(cipher->array, plain->array, plain->len);\n        cipher->len = plain->len;\n\n        return 0;\n    } else {\n        char *begin = cipher->array;\n        char *ptr   = cipher->array;\n        while (ptr < begin + cipher->len) {\n            *ptr = (char)dec_table[(uint8_t)*ptr];\n            ptr++;\n        }\n        return 0;\n    }\n}\n\nint\nss_decrypt(buffer_t *cipher, enc_ctx_t *ctx, size_t capacity)\n{\n    if (ctx != NULL) {\n        static buffer_t tmp = { 0, 0, 0, NULL };\n\n        size_t iv_len = 0;\n        int err       = 1;\n\n        brealloc(&tmp, cipher->len, capacity);\n        buffer_t *plain = &tmp;\n        plain->len = cipher->len;\n\n        if (!ctx->init) {\n            uint8_t iv[MAX_IV_LENGTH];\n            iv_len      = enc_iv_len;\n            plain->len -= iv_len;\n\n            memcpy(iv, cipher->array, iv_len);\n            cipher_context_set_iv(&ctx->evp, iv, iv_len, 0);\n            ctx->counter = 0;\n            ctx->init    = 1;\n\n            if (enc_method > RC4) {\n                if (cache_key_exist(iv_cache, (char *)iv, iv_len)) {\n                    bfree(cipher);\n                    return -1;\n                } else {\n                    cache_insert(iv_cache, (char *)iv, iv_len, NULL);\n                }\n            }\n        }\n\n        if (enc_method >= SALSA20) {\n            int padding = ctx->counter % SODIUM_BLOCK_SIZE;\n            brealloc(plain, (plain->len + padding) * 2, capacity);\n\n            if (padding) {\n                brealloc(cipher, cipher->len + padding, capacity);\n                memmove(cipher->array + iv_len + padding, cipher->array + iv_len,\n                        cipher->len - iv_len);\n                sodium_memzero(cipher->array + iv_len, padding);\n            }\n            crypto_stream_xor_ic((uint8_t *)plain->array,\n                                 (const uint8_t *)(cipher->array + iv_len),\n                                 (uint64_t)(cipher->len - iv_len + padding),\n                                 (const uint8_t *)ctx->evp.iv,\n                                 ctx->counter / SODIUM_BLOCK_SIZE, enc_key,\n                                 enc_method);\n            ctx->counter += cipher->len - iv_len;\n            if (padding) {\n                memmove(plain->array, plain->array + padding, plain->len);\n            }\n        } else {\n            err = cipher_context_update(&ctx->evp, (uint8_t *)plain->array, &plain->len,\n                                        (const uint8_t *)(cipher->array + iv_len),\n                                        cipher->len - iv_len);\n        }\n\n        if (!err) {\n            bfree(cipher);\n            return -1;\n        }\n\n#ifdef DEBUG\n        dump(\"PLAIN\", plain->array, plain->len);\n        dump(\"CIPHER\", cipher->array + iv_len, cipher->len - iv_len);\n#endif\n\n        brealloc(cipher, plain->len, capacity);\n        memcpy(cipher->array, plain->array, plain->len);\n        cipher->len = plain->len;\n\n        return 0;\n    } else {\n        char *begin = cipher->array;\n        char *ptr   = cipher->array;\n        while (ptr < begin + cipher->len) {\n            *ptr = (char)dec_table[(uint8_t)*ptr];\n            ptr++;\n        }\n        return 0;\n    }\n}\n\nvoid\nenc_ctx_init(int method, enc_ctx_t *ctx, int enc)\n{\n    sodium_memzero(ctx, sizeof(enc_ctx_t));\n    cipher_context_init(&ctx->evp, method, enc);\n\n    if (enc) {\n        rand_bytes(ctx->evp.iv, enc_iv_len);\n    }\n}\n\nvoid\nenc_key_init(int method, const char *pass)\n{\n    if (method <= TABLE || method >= CIPHER_NUM) {\n        LOGE(\"enc_key_init(): Illegal method\");\n        return;\n    }\n\n    // Initialize cache\n    cache_create(&iv_cache, 256, NULL);\n\n#if defined(USE_CRYPTO_OPENSSL)\n    OpenSSL_add_all_algorithms();\n#else\n    cipher_kt_t cipher_info;\n#endif\n\n    cipher_t cipher;\n    memset(&cipher, 0, sizeof(cipher_t));\n\n    // Initialize sodium for random generator\n    if (sodium_init() == -1) {\n        FATAL(\"Failed to initialize sodium\");\n    }\n\n    if (method == SALSA20 || method == CHACHA20 || method == CHACHA20IETF) {\n#if defined(USE_CRYPTO_OPENSSL)\n        cipher.info    = NULL;\n        cipher.key_len = supported_ciphers_key_size[method];\n        cipher.iv_len  = supported_ciphers_iv_size[method];\n#endif\n#if defined(USE_CRYPTO_POLARSSL)\n        cipher.info             = &cipher_info;\n        cipher.info->base       = NULL;\n        cipher.info->key_length = supported_ciphers_key_size[method] * 8;\n        cipher.info->iv_size    = supported_ciphers_iv_size[method];\n#endif\n#if defined(USE_CRYPTO_MBEDTLS)\n        // XXX: key_length changed to key_bitlen in mbed TLS 2.0.0\n        cipher.info             = &cipher_info;\n        cipher.info->base       = NULL;\n        cipher.info->key_bitlen = supported_ciphers_key_size[method] * 8;\n        cipher.info->iv_size    = supported_ciphers_iv_size[method];\n#endif\n    } else {\n        cipher.info = (cipher_kt_t *)get_cipher_type(method);\n    }\n\n    if (cipher.info == NULL && cipher.key_len == 0) {\n        do {\n#if defined(USE_CRYPTO_POLARSSL) && defined(USE_CRYPTO_APPLECC)\n            if (supported_ciphers_applecc[method] != kCCAlgorithmInvalid) {\n                cipher_info.base       = NULL;\n                cipher_info.key_length = supported_ciphers_key_size[method] * 8;\n                cipher_info.iv_size    = supported_ciphers_iv_size[method];\n                cipher.info            = (cipher_kt_t *)&cipher_info;\n                break;\n            }\n#endif\n#if defined(USE_CRYPTO_MBEDTLS) && defined(USE_CRYPTO_APPLECC)\n            // XXX: key_length changed to key_bitlen in mbed TLS 2.0.0\n            if (supported_ciphers_applecc[method] != kCCAlgorithmInvalid) {\n                cipher_info.base       = NULL;\n                cipher_info.key_bitlen = supported_ciphers_key_size[method] * 8;\n                cipher_info.iv_size    = supported_ciphers_iv_size[method];\n                cipher.info            = (cipher_kt_t *)&cipher_info;\n                break;\n            }\n#endif\n            LOGE(\"Cipher %s not found in crypto library\", supported_ciphers[method]);\n            FATAL(\"Cannot initialize cipher\");\n        } while (0);\n    }\n\n    const digest_type_t *md = get_digest_type(\"MD5\");\n    if (md == NULL) {\n        FATAL(\"MD5 Digest not found in crypto library\");\n    }\n\n    enc_key_len = bytes_to_key(&cipher, md, (const uint8_t *)pass, enc_key);\n\n    if (enc_key_len == 0) {\n        FATAL(\"Cannot generate key and IV\");\n    }\n    if (method == RC4_MD5 || method == RC4_MD5_6) {\n        enc_iv_len = supported_ciphers_iv_size[method];\n    } else {\n        enc_iv_len = cipher_iv_size(&cipher);\n    }\n    enc_method = method;\n}\n\nint\nenc_init(const char *pass, const char *method)\n{\n    int m = TABLE;\n    if (method != NULL) {\n        for (m = TABLE; m < CIPHER_NUM; m++)\n            if (strcmp(method, supported_ciphers[m]) == 0) {\n                break;\n            }\n        if (m >= CIPHER_NUM) {\n            LOGE(\"Invalid cipher name: %s, use rc4-md5 instead\", method);\n            m = RC4_MD5;\n        }\n    }\n    if (m == TABLE) {\n        enc_table_init(pass);\n    } else {\n        enc_key_init(m, pass);\n    }\n    return m;\n}\n\nint\nss_check_hash(buffer_t *buf, chunk_t *chunk, enc_ctx_t *ctx, size_t capacity)\n{\n    int i, j, k;\n    ssize_t blen  = buf->len;\n    uint32_t cidx = chunk->idx;\n\n    brealloc(chunk->buf, chunk->len + blen, capacity);\n    brealloc(buf, chunk->len + blen, capacity);\n\n    for (i = 0, j = 0, k = 0; i < blen; i++) {\n        chunk->buf->array[cidx++] = buf->array[k++];\n\n        if (cidx == CLEN_BYTES) {\n            uint16_t clen = ntohs(*((uint16_t *)chunk->buf->array));\n            brealloc(chunk->buf, clen + AUTH_BYTES, capacity);\n            chunk->len = clen;\n        }\n\n        if (cidx == chunk->len + AUTH_BYTES) {\n            // Compare hash\n            uint8_t hash[ONETIMEAUTH_BYTES * 2];\n            uint8_t key[MAX_IV_LENGTH + sizeof(uint32_t)];\n\n            uint32_t c = htonl(chunk->counter);\n            memcpy(key, ctx->evp.iv, enc_iv_len);\n            memcpy(key + enc_iv_len, &c, sizeof(uint32_t));\n#if defined(USE_CRYPTO_OPENSSL)\n            HMAC(EVP_sha1(), key, enc_iv_len + sizeof(uint32_t),\n                 (uint8_t *)chunk->buf->array + AUTH_BYTES, chunk->len, hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n            mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), key, enc_iv_len + sizeof(uint32_t),\n                            (uint8_t *)chunk->buf->array + AUTH_BYTES, chunk->len, hash);\n#else\n            sha1_hmac(key, enc_iv_len + sizeof(uint32_t),\n                      (uint8_t *)chunk->buf->array + AUTH_BYTES, chunk->len, hash);\n#endif\n\n            if (safe_memcmp(hash, chunk->buf->array + CLEN_BYTES, ONETIMEAUTH_BYTES) != 0) {\n                return 0;\n            }\n\n            // Copy chunk back to buffer\n            memmove(buf->array + j + chunk->len, buf->array + k, blen - i - 1);\n            memcpy(buf->array + j, chunk->buf->array + AUTH_BYTES, chunk->len);\n\n            // Reset the base offset\n            j   += chunk->len;\n            k    = j;\n            cidx = 0;\n            chunk->counter++;\n        }\n    }\n\n    buf->len   = j;\n    chunk->idx = cidx;\n    return 1;\n}\n\nint\nss_gen_hash(buffer_t *buf, uint32_t *counter, enc_ctx_t *ctx, size_t capacity)\n{\n    ssize_t blen       = buf->len;\n    uint16_t chunk_len = htons((uint16_t)blen);\n    uint8_t hash[ONETIMEAUTH_BYTES * 2];\n    uint8_t key[MAX_IV_LENGTH + sizeof(uint32_t)];\n    uint32_t c = htonl(*counter);\n\n    brealloc(buf, AUTH_BYTES + blen, capacity);\n    memcpy(key, ctx->evp.iv, enc_iv_len);\n    memcpy(key + enc_iv_len, &c, sizeof(uint32_t));\n#if defined(USE_CRYPTO_OPENSSL)\n    HMAC(EVP_sha1(), key, enc_iv_len + sizeof(uint32_t), (uint8_t *)buf->array, blen, hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md_hmac(mbedtls_md_info_from_type(\n                        MBEDTLS_MD_SHA1), key, enc_iv_len + sizeof(uint32_t), (uint8_t *)buf->array, blen, hash);\n#else\n    sha1_hmac(key, enc_iv_len + sizeof(uint32_t), (uint8_t *)buf->array, blen, hash);\n#endif\n\n    memmove(buf->array + AUTH_BYTES, buf->array, blen);\n    memcpy(buf->array + CLEN_BYTES, hash, ONETIMEAUTH_BYTES);\n    memcpy(buf->array, &chunk_len, CLEN_BYTES);\n\n    *counter = *counter + 1;\n    buf->len = blen + AUTH_BYTES;\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/encrypt.h",
    "content": "/*\n * encrypt.h - Define the enryptor's interface\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _ENCRYPT_H\n#define _ENCRYPT_H\n\n#ifndef __MINGW32__\n#include <sys/socket.h>\n#else\n\n#ifdef max\n#undef max\n#endif\n\n#ifdef min\n#undef min\n#endif\n\n#endif\n\n#include <string.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <stdint.h>\n\n#if defined(USE_CRYPTO_OPENSSL)\n\n#include <openssl/evp.h>\n#include <openssl/sha.h>\n#include <openssl/md5.h>\ntypedef EVP_CIPHER cipher_kt_t;\ntypedef EVP_CIPHER_CTX cipher_evp_t;\ntypedef EVP_MD digest_type_t;\n#define MAX_KEY_LENGTH EVP_MAX_KEY_LENGTH\n#define MAX_IV_LENGTH EVP_MAX_IV_LENGTH\n#define MAX_MD_SIZE EVP_MAX_MD_SIZE\n\n#elif defined(USE_CRYPTO_POLARSSL)\n\n#include <polarssl/cipher.h>\n#include <polarssl/md.h>\ntypedef cipher_info_t cipher_kt_t;\ntypedef cipher_context_t cipher_evp_t;\ntypedef md_info_t digest_type_t;\n#define MAX_KEY_LENGTH 64\n#define MAX_IV_LENGTH POLARSSL_MAX_IV_LENGTH\n#define MAX_MD_SIZE POLARSSL_MD_MAX_SIZE\n\n#elif defined(USE_CRYPTO_MBEDTLS)\n\n#include <mbedtls/cipher.h>\n#include <mbedtls/md.h>\ntypedef mbedtls_cipher_info_t cipher_kt_t;\ntypedef mbedtls_cipher_context_t cipher_evp_t;\ntypedef mbedtls_md_info_t digest_type_t;\n#define MAX_KEY_LENGTH 64\n#define MAX_IV_LENGTH MBEDTLS_MAX_IV_LENGTH\n#define MAX_MD_SIZE MBEDTLS_MD_MAX_SIZE\n\n/* we must have MBEDTLS_CIPHER_MODE_CFB defined */\n#if !defined(MBEDTLS_CIPHER_MODE_CFB)\n#error Cipher Feedback mode a.k.a CFB not supported by your mbed TLS.\n#endif\n\n#endif\n\n#ifdef USE_CRYPTO_APPLECC\n\n#include <CommonCrypto/CommonCrypto.h>\n\n#define kCCAlgorithmInvalid UINT32_MAX\n#define kCCContextValid 0\n#define kCCContextInvalid -1\n\ntypedef struct {\n    CCCryptorRef cryptor;\n    int valid;\n    CCOperation encrypt;\n    CCAlgorithm cipher;\n    CCMode mode;\n    CCPadding padding;\n    uint8_t iv[MAX_IV_LENGTH];\n    uint8_t key[MAX_KEY_LENGTH];\n    size_t iv_len;\n    size_t key_len;\n} cipher_cc_t;\n\n#endif\n\ntypedef struct {\n    cipher_evp_t *evp;\n#ifdef USE_CRYPTO_APPLECC\n    cipher_cc_t cc;\n#endif\n    uint8_t iv[MAX_IV_LENGTH];\n} cipher_ctx_t;\n\ntypedef struct {\n    cipher_kt_t *info;\n    size_t iv_len;\n    size_t key_len;\n} cipher_t;\n\n#ifdef HAVE_STDINT_H\n#include <stdint.h>\n#elif HAVE_INTTYPES_H\n#include <inttypes.h>\n#endif\n\n#define SODIUM_BLOCK_SIZE   64\n\nenum crpher_index {\n    NONE = -1,\n    TABLE = 0,\n    RC4,\n    RC4_MD5_6,\n    RC4_MD5,\n    AES_128_CFB,\n    AES_192_CFB,\n    AES_256_CFB,\n    AES_128_CTR,\n    AES_192_CTR,\n    AES_256_CTR,\n    BF_CFB,\n    CAMELLIA_128_CFB,\n    CAMELLIA_192_CFB,\n    CAMELLIA_256_CFB,\n    CAST5_CFB,\n    DES_CFB,\n    IDEA_CFB,\n    RC2_CFB,\n    SEED_CFB,\n    SALSA20,\n    CHACHA20,\n    CHACHA20IETF,\n    CIPHER_NUM,\n};\n\n#define ONETIMEAUTH_FLAG 0x10\n#define ADDRTYPE_MASK 0xEF\n\n#define ONETIMEAUTH_BYTES 10U\n#define MD5_BYTES 16U\n#define SHA1_BYTES 20U\n#define CLEN_BYTES 2U\n#define AUTH_BYTES (ONETIMEAUTH_BYTES + CLEN_BYTES)\n\n#define min(a, b) (((a) < (b)) ? (a) : (b))\n#define max(a, b) (((a) > (b)) ? (a) : (b))\n\ntypedef struct buffer {\n    size_t idx;\n    size_t len;\n    size_t capacity;\n    char   *array;\n} buffer_t;\n\ntypedef struct chunk {\n    uint32_t idx;\n    uint32_t len;\n    uint32_t counter;\n    buffer_t *buf;\n} chunk_t;\n\ntypedef struct enc_ctx {\n    uint8_t init;\n    uint64_t counter;\n    cipher_ctx_t evp;\n} enc_ctx_t;\n\nvoid bytes_to_key_with_size(const char *pass, size_t len, uint8_t *md, size_t md_size);\n\nint ss_encrypt_all(buffer_t *plaintext, int method, int auth, size_t capacity);\nint ss_decrypt_all(buffer_t *ciphertext, int method, int auth, size_t capacity);\nint ss_encrypt(buffer_t *plaintext, enc_ctx_t *ctx, size_t capacity);\nint ss_decrypt(buffer_t *ciphertext, enc_ctx_t *ctx, size_t capacity);\n\nvoid enc_ctx_init(int method, enc_ctx_t *ctx, int enc);\nint enc_init(const char *pass, const char *method);\nint enc_get_iv_len(void);\nuint8_t* enc_get_key(void);\nint enc_get_key_len(void);\nvoid cipher_context_release(cipher_ctx_t *evp);\nunsigned char *enc_md5(const unsigned char *d, size_t n, unsigned char *md);\n\nint ss_md5_hmac(char *auth, char *msg, int msg_len, uint8_t *iv);\nint ss_md5_hmac_with_key(char *auth, char *msg, int msg_len, uint8_t *auth_key, int key_len);\nint ss_md5_hash_func(char *auth, char *msg, int msg_len);\nint ss_sha1_hmac(char *auth, char *msg, int msg_len, uint8_t *iv);\nint ss_sha1_hmac_with_key(char *auth, char *msg, int msg_len, uint8_t *auth_key, int key_len);\nint ss_sha1_hash_func(char *auth, char *msg, int msg_len);\nint ss_aes_128_cbc(char *encrypt, char *out_data, char *key);\nint ss_onetimeauth(buffer_t *buf, uint8_t *iv, size_t capacity);\nint ss_onetimeauth_verify(buffer_t *buf, uint8_t *iv);\n\nint ss_check_hash(buffer_t *buf, chunk_t *chunk, enc_ctx_t *ctx, size_t capacity);\nint ss_gen_hash(buffer_t *buf, uint32_t *counter, enc_ctx_t *ctx, size_t capacity);\n\nint balloc(buffer_t *ptr, size_t capacity);\nint brealloc(buffer_t *ptr, size_t len, size_t capacity);\nvoid bfree(buffer_t *ptr);\n\n#endif // _ENCRYPT_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/http.c",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <stdlib.h> /* malloc() */\n#include <string.h> /* strncpy() */\n#include <strings.h> /* strncasecmp() */\n#include <ctype.h> /* isblank() */\n\n#include \"http.h\"\n#include \"protocol.h\"\n\n#define SERVER_NAME_LEN 256\n\nstatic int parse_http_header(const char *, size_t, char **);\nstatic int get_header(const char *, const char *, int, char **);\nstatic int next_header(const char **, int *);\n\nstatic const protocol_t http_protocol_st = {\n    .default_port =                 80,\n    .parse_packet = &parse_http_header,\n};\nconst protocol_t *const http_protocol = &http_protocol_st;\n\n/*\n * Parses a HTTP request for the Host: header\n *\n * Returns:\n *  >=0  - length of the hostname and updates *hostname\n *         caller is responsible for freeing *hostname\n *  -1   - Incomplete request\n *  -2   - No Host header included in this request\n *  -3   - Invalid hostname pointer\n *  -4   - malloc failure\n *  < -4 - Invalid HTTP request\n *\n */\nstatic int\nparse_http_header(const char *data, size_t data_len, char **hostname)\n{\n    int result, i;\n\n    if (hostname == NULL)\n        return -3;\n\n    if (data_len == 0)\n        return -1;\n\n    result = get_header(\"Host:\", data, data_len, hostname);\n    if (result < 0)\n        return result;\n\n    /*\n     *  if the user specifies the port in the request, it is included here.\n     *  Host: example.com:80\n     *  so we trim off port portion\n     */\n    for (i = result - 1; i >= 0; i--)\n        if ((*hostname)[i] == ':') {\n            (*hostname)[i] = '\\0';\n            result         = i;\n            break;\n        }\n\n    return result;\n}\n\nstatic int\nget_header(const char *header, const char *data, int data_len, char **value)\n{\n    int len, header_len;\n\n    header_len = strlen(header);\n\n    /* loop through headers stopping at first blank line */\n    while ((len = next_header(&data, &data_len)) != 0)\n        if (len > header_len && strncasecmp(header, data, header_len) == 0) {\n            /* Eat leading whitespace */\n            while (header_len < len && isblank(data[header_len]))\n                header_len++;\n\n            *value = malloc(len - header_len + 1);\n            if (*value == NULL)\n                return -4;\n\n            strncpy(*value, data + header_len, len - header_len);\n            (*value)[len - header_len] = '\\0';\n\n            return len - header_len;\n        }\n\n    /* If there is no data left after reading all the headers then we do not\n     * have a complete HTTP request, there must be a blank line */\n    if (data_len == 0)\n        return -1;\n\n    return -2;\n}\n\nstatic int\nnext_header(const char **data, int *len)\n{\n    int header_len;\n\n    /* perhaps we can optimize this to reuse the value of header_len, rather\n     * than scanning twice.\n     * Walk our data stream until the end of the header */\n    while (*len > 2 && (*data)[0] != '\\r' && (*data)[1] != '\\n') {\n        (*len)--;\n        (*data)++;\n    }\n\n    /* advanced past the <CR><LF> pair */\n    *data += 2;\n    *len  -= 2;\n\n    /* Find the length of the next header */\n    header_len = 0;\n    while (*len > header_len + 1\n           && (*data)[header_len] != '\\r'\n           && (*data)[header_len + 1] != '\\n')\n        header_len++;\n\n    return header_len;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/http.h",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef HTTP_H\n#define HTTP_H\n\n#include <stdio.h>\n#include \"protocol.h\"\n\nconst protocol_t *const http_protocol;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/http_simple.c",
    "content": "\n#include \"http_simple.h\"\n\nstatic char* g_useragent[] = {\n    \"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0\",\n    \"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:40.0) Gecko/20100101 Firefox/44.0\",\n    \"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36\",\n    \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/27.0.1453.93 Chrome/27.0.1453.93 Safari/537.36\",\n    \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0\",\n    \"Mozilla/5.0 (compatible; WOW64; MSIE 10.0; Windows NT 6.2)\",\n    \"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\",\n    \"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C)\",\n    \"Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko\",\n    \"Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/BuildID) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36\",\n    \"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3\",\n    \"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3\",\n};\n\nstatic int g_useragent_index = -1;\n\ntypedef struct http_simple_local_data {\n    int has_sent_header;\n    int has_recv_header;\n    char *encode_buffer;\n    int host_matched;\n    char *recv_buffer;\n    int recv_buffer_size;\n}http_simple_local_data;\n\nvoid http_simple_local_data_init(http_simple_local_data* local) {\n    local->has_sent_header = 0;\n    local->has_recv_header = 0;\n    local->encode_buffer = NULL;\n\n    local->recv_buffer = malloc(0);\n    local->recv_buffer_size = 0;\n\n    local->host_matched = 0;\n\n    if (g_useragent_index == -1) {\n        g_useragent_index = xorshift128plus() % (sizeof(g_useragent) / sizeof(*g_useragent));\n    }\n}\n\nobfs * http_simple_new_obfs() {\n    obfs * self = new_obfs();\n    self->l_data = malloc(sizeof(http_simple_local_data));\n    http_simple_local_data_init((http_simple_local_data*)self->l_data);\n    return self;\n}\n\nvoid http_simple_dispose(obfs *self) {\n    http_simple_local_data *local = (http_simple_local_data*)self->l_data;\n    if (local->encode_buffer != NULL) {\n        free(local->encode_buffer);\n        local->encode_buffer = NULL;\n    }\n    free(local);\n    dispose_obfs(self);\n}\n\nchar http_simple_hex(char c) {\n    if (c < 10) return c + '0';\n    return c - 10 + 'a';\n}\n\nint get_data_from_http_header(char *data, char **outdata) {\n    char *delim = \"\\r\\n\";\n    char *delim_hex = \"%\";\n    int outlength = 0;\n\n    char *buf = *outdata;\n    char *p_line;\n    p_line = strtok(data, delim);\n\n    //while(p_line)\n    {\n        char *p_hex;\n\n        p_hex = strtok(p_line, delim_hex);\n\n        while((p_hex = strtok(NULL, delim_hex)))\n        {\n            char hex = 0;\n\n            if(strlen(p_hex) <= 0)\n            {\n                continue;\n            }\n\n            if(strlen(p_hex) > 2)\n            {\n                char *c_hex = (char*)malloc(2);\n                memcpy(c_hex, p_hex, 2);\n                hex = (char)strtol(c_hex, NULL, 16);\n                free(c_hex);\n            }\n            else\n            {\n                hex = (char)strtol(p_hex, NULL, 16);\n            }\n\n            outlength += 1;\n            buf = (char*)realloc(buf, outlength);\n            buf[outlength - 1] = hex;\n        }\n\n        //p_line = strtok(p_line, delim);\n    }\n    *outdata = buf;\n    return outlength;\n}\n\nvoid get_host_from_http_header(char *data, char **host) {\n    char* data_begin = strstr(data, \"Host: \");\n\n    if(data_begin == NULL)\n    {\n        return;\n    }\n\n    data_begin += 6;\n    char* data_end = strstr(data_begin, \"\\r\\n\");\n    char* data_end_port = strstr(data_begin, \":\");\n\n    int host_length = 0;\n\n    if(data_end_port != NULL)\n    {\n        host_length = data_end_port - data_begin;\n    }\n    else\n    {\n        host_length = data_end - data_begin;\n    }\n\n    if(host_length <= 0)\n    {\n        return;\n    }\n\n    memset(*host, 0x00, 1024);\n    memcpy(*host, data_begin, host_length);\n}\n\nvoid http_simple_encode_head(http_simple_local_data *local, char *data, int datalength) {\n    if (local->encode_buffer == NULL) {\n        local->encode_buffer = (char*)malloc(datalength * 3 + 1);\n    }\n    int pos = 0;\n    for (; pos < datalength; ++pos) {\n        local->encode_buffer[pos * 3] = '%';\n        local->encode_buffer[pos * 3 + 1] = http_simple_hex(((unsigned char)data[pos] >> 4));\n        local->encode_buffer[pos * 3 + 2] = http_simple_hex(data[pos] & 0xF);\n    }\n    local->encode_buffer[pos * 3] = 0;\n}\n\nint http_simple_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity) {\n    char *encryptdata = *pencryptdata;\n    http_simple_local_data *local = (http_simple_local_data*)self->l_data;\n    if (local->has_sent_header) {\n        return datalength;\n    }\n    char hosts[1024];\n    char * phost[128];\n    int host_num = 0;\n    int pos;\n    char hostport[128];\n    int head_size = self->server.head_len + (xorshift128plus() & 0x3F);\n    int outlength;\n    char * out_buffer = (char*)malloc(datalength + 2048);\n    char * body_buffer = NULL;\n    if (head_size > datalength)\n        head_size = datalength;\n    http_simple_encode_head(local, encryptdata, head_size);\n    if (self->server.param && strlen(self->server.param) == 0)\n        self->server.param = NULL;\n    strncpy(hosts, self->server.param ? self->server.param : self->server.host, sizeof hosts);\n    phost[host_num++] = hosts;\n    for (pos = 0; hosts[pos]; ++pos) {\n        if (hosts[pos] == ',') {\n            phost[host_num++] = &hosts[pos + 1];\n            hosts[pos] = 0;\n        } else if (hosts[pos] == '#') {\n            char * body_pointer = &hosts[pos + 1];\n            char * p;\n            int trans_char = 0;\n            p = body_buffer = (char*)malloc(2048);\n            for ( ; *body_pointer; ++body_pointer) {\n                if (*body_pointer == '\\\\') {\n                    trans_char = 1;\n                    continue;\n                } else if (*body_pointer == '\\n') {\n                    *p = '\\r';\n                    *++p = '\\n';\n                    continue;\n                }\n                if (trans_char) {\n                    if (*body_pointer == '\\\\' ) {\n                        *p = '\\\\';\n                    } else if (*body_pointer == 'n' ) {\n                        *p = '\\r';\n                        *++p = '\\n';\n                    } else {\n                        *p = '\\\\';\n                        *p = *body_pointer;\n                    }\n                    trans_char = 0;\n                } else {\n                    *p = *body_pointer;\n                }\n                ++p;\n            }\n            *p = 0;\n            hosts[pos] = 0;\n            break;\n        }\n    }\n    host_num = xorshift128plus() % host_num;\n    if (self->server.port == 80)\n        sprintf(hostport, \"%s\", phost[host_num]);\n    else\n        sprintf(hostport, \"%s:%d\", phost[host_num], self->server.port);\n    if (body_buffer) {\n        sprintf(out_buffer,\n            \"GET /%s HTTP/1.1\\r\\n\"\n            \"Host: %s\\r\\n\"\n            \"%s\\r\\n\\r\\n\",\n            local->encode_buffer,\n            hostport,\n            body_buffer);\n    } else {\n        sprintf(out_buffer,\n            \"GET /%s HTTP/1.1\\r\\n\"\n            \"Host: %s\\r\\n\"\n            \"User-Agent: %s\\r\\n\"\n            \"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\\r\\n\"\n            \"Accept-Language: en-US,en;q=0.8\\r\\n\"\n            \"Accept-Encoding: gzip, deflate\\r\\n\"\n            \"DNT: 1\\r\\n\"\n            \"Connection: keep-alive\\r\\n\"\n            \"\\r\\n\",\n            local->encode_buffer,\n            hostport,\n            g_useragent[g_useragent_index]\n            );\n    }\n    //LOGI(\"http header: %s\", out_buffer);\n    outlength = strlen(out_buffer);\n    memmove(out_buffer + outlength, encryptdata + head_size, datalength - head_size);\n    outlength += datalength - head_size;\n    local->has_sent_header = 1;\n    if (*capacity < outlength) {\n        *pencryptdata = (char*)realloc(*pencryptdata, *capacity = outlength * 2);\n        encryptdata = *pencryptdata;\n    }\n    memmove(encryptdata, out_buffer, outlength);\n    free(out_buffer);\n    if (body_buffer != NULL)\n        free(body_buffer);\n    if (local->encode_buffer != NULL) {\n        free(local->encode_buffer);\n        local->encode_buffer = NULL;\n    }\n    return outlength;\n}\n\nint http_simple_server_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity) {\n    char *encryptdata = *pencryptdata;\n    http_simple_local_data *local = (http_simple_local_data*)self->l_data;\n    if (local->has_sent_header) {\n        return datalength;\n    }\n    int outlength;\n    char * out_buffer = (char*)malloc(datalength + 2048);\n\n    time_t now;\n    struct tm *tm_now;\n    char    datetime[200];\n\n    time(&now);\n    tm_now = localtime(&now);\n    strftime(datetime, 200, \"%a, %d %b %Y %H:%M:%S GMT\", tm_now);\n\n    sprintf(out_buffer,\n        \"HTTP/1.1 200 OK\\r\\nConnection: keep-alive\\r\\nContent-Encoding: gzip\\r\\nContent-Type: text/html\\r\\nDate: \"\n        \"%s\"\n        \"\\r\\nServer: nginx\\r\\nVary: Accept-Encoding\\r\\n\\r\\n\",\n        datetime);\n\n    outlength = strlen(out_buffer);\n    memmove(out_buffer + outlength, encryptdata, datalength);\n    outlength += datalength;\n\n    local->has_sent_header = 1;\n    if (*capacity < outlength) {\n        *pencryptdata = (char*)realloc(*pencryptdata, *capacity = outlength * 2);\n        encryptdata = *pencryptdata;\n    }\n    memmove(encryptdata, out_buffer, outlength);\n    free(out_buffer);\n    return outlength;\n}\n\nint http_simple_client_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback) {\n    char *encryptdata = *pencryptdata;\n    http_simple_local_data *local = (http_simple_local_data*)self->l_data;\n    *needsendback = 0;\n    if (local->has_recv_header) {\n        return datalength;\n    }\n    char* data_begin = strstr(encryptdata, \"\\r\\n\\r\\n\");\n    if (data_begin) {\n        int outlength;\n        data_begin += 4;\n        local->has_recv_header = 1;\n        outlength = datalength - (data_begin - encryptdata);\n        memmove(encryptdata, data_begin, outlength);\n        return outlength;\n    } else {\n        return 0;\n    }\n}\n\nint http_simple_server_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback) {\n    char *encryptdata = *pencryptdata;\n    http_simple_local_data *local = (http_simple_local_data*)self->l_data;\n    *needsendback = 0;\n    if (local->has_recv_header) {\n        return datalength;\n    }\n\n    if(datalength != 0)\n    {\n        local->recv_buffer = (char*)realloc(local->recv_buffer, local->recv_buffer_size + datalength);\n        memmove(local->recv_buffer + local->recv_buffer_size, encryptdata, datalength);\n        local->recv_buffer_size += datalength;\n\n        int outlength = local->recv_buffer_size;\n        if (*capacity < outlength) {\n            *pencryptdata = (char*)realloc(*pencryptdata, *capacity = outlength * 2);\n            encryptdata = *pencryptdata;\n        }\n        memcpy(encryptdata, local->recv_buffer, local->recv_buffer_size);\n    }\n\n    if(local->recv_buffer_size > 10)\n    {\n        if(strstr(local->recv_buffer, \"GET /\") == local->recv_buffer || strstr(local->recv_buffer, \"POST /\") == local->recv_buffer)\n        {\n            if(local->recv_buffer_size > 65536)\n            {\n                free(local->recv_buffer);\n                local->recv_buffer = malloc(0);\n                local->recv_buffer_size = 0;\n                local->has_sent_header = 1;\n                local->has_recv_header = 1;\n                LOGE(\"http_simple: over size\");\n                return -1;\n            }\n        }\n        else\n        {\n            free(local->recv_buffer);\n            local->recv_buffer = malloc(0);\n            local->recv_buffer_size = 0;\n            local->has_sent_header = 1;\n            local->has_recv_header = 1;\n            LOGE(\"http_simple: not match begin\");\n            return -1;\n        }\n    }\n    else\n    {\n        LOGE(\"http_simple: too short\");\n        local->has_sent_header = 1;\n        local->has_recv_header = 1;\n        return -1;\n    }\n\n    char* data_begin = strstr(encryptdata, \"\\r\\n\\r\\n\");\n    if (data_begin) {\n        int outlength;\n        char *ret_buf = (char*)malloc(*capacity);\n        memset(ret_buf, 0x00, *capacity);\n        int ret_buf_len = 0;\n        ret_buf_len = get_data_from_http_header(encryptdata, &ret_buf);\n\n        if (self->server.param && strlen(self->server.param) == 0)\n        {\n            self->server.param = NULL;\n        }\n        else\n        {\n            if(local->host_matched == 0)\n            {\n                char *host = (char*)malloc(1024);\n                get_host_from_http_header(local->recv_buffer, &host);\n                char hosts[1024];\n                char * phost[128];\n                int host_num = 0;\n                int pos = 0;\n                int is_match = 0;\n                char * body_buffer = NULL;\n                strncpy(hosts, self->server.param, sizeof hosts);\n                phost[host_num++] = hosts;\n\n                for (pos = 0; hosts[pos]; ++pos) {\n                    if (hosts[pos] == ',') {\n                        phost[host_num++] = &hosts[pos + 1];\n                        hosts[pos] = 0;\n                    } else if (hosts[pos] == '#') {\n                        char * body_pointer = &hosts[pos + 1];\n                        char * p;\n                        int trans_char = 0;\n                        p = body_buffer = (char*)malloc(2048);\n                        for ( ; *body_pointer; ++body_pointer) {\n                            if (*body_pointer == '\\\\') {\n                                trans_char = 1;\n                                continue;\n                            } else if (*body_pointer == '\\n') {\n                                *p = '\\r';\n                                *++p = '\\n';\n                                continue;\n                            }\n                            if (trans_char) {\n                                if (*body_pointer == '\\\\' ) {\n                                    *p = '\\\\';\n                                } else if (*body_pointer == 'n' ) {\n                                    *p = '\\r';\n                                    *++p = '\\n';\n                                } else {\n                                    *p = '\\\\';\n                                    *p = *body_pointer;\n                                }\n                                trans_char = 0;\n                            } else {\n                                *p = *body_pointer;\n                            }\n                            ++p;\n                        }\n                        *p = 0;\n                        hosts[pos] = 0;\n                        break;\n                    }\n                }\n\n\n                for(pos = 0; pos < host_num; pos++)\n                {\n                    if(strcmp(phost[pos], host) == 0)\n                    {\n                        is_match = 1;\n                        local->host_matched = 1;\n                    }\n                }\n\n                if(is_match == 0)\n                {\n                    free(local->recv_buffer);\n                    local->recv_buffer = malloc(0);\n                    local->recv_buffer_size = 0;\n                    local->has_sent_header = 1;\n                    local->has_recv_header = 1;\n                    LOGE(\"http_simple: not match host, host: %s\", host);\n                    return -1;\n                }\n\n                free(host);\n            }\n        }\n\n        if(ret_buf_len <= 0)\n        {\n            return -1;\n        }\n\n        data_begin += 4;\n        local->has_recv_header = 1;\n\n        ret_buf = (char*)realloc(ret_buf, ret_buf_len + datalength - (data_begin - encryptdata));\n        outlength = ret_buf_len + datalength - (data_begin - encryptdata);\n\n        memcpy(ret_buf + ret_buf_len, data_begin, datalength - (data_begin - encryptdata));\n\n        if (*capacity < outlength) {\n            *pencryptdata = (char*)realloc(*pencryptdata, *capacity = outlength * 2);\n            encryptdata = *pencryptdata;\n        }\n\n        memcpy(encryptdata, ret_buf, outlength);\n        free(ret_buf);\n        return outlength;\n    } else {\n        return 0;\n    }\n}\n\nvoid boundary(char result[])\n{\n    char *str = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n    int i,lstr;\n    char ss[3] = {0};\n    lstr = strlen(str);\n    srand((unsigned int)time((time_t *)NULL));\n    for(i = 0; i < 32; ++i)\n    {\n        sprintf(ss, \"%c\", str[(rand()%lstr)]);\n        strcat(result, ss);\n    }\n}\n\nint http_post_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity) {\n    char *encryptdata = *pencryptdata;\n    http_simple_local_data *local = (http_simple_local_data*)self->l_data;\n    if (local->has_sent_header) {\n        return datalength;\n    }\n    char hosts[1024];\n    char * phost[128];\n    int host_num = 0;\n    int pos;\n    char hostport[128];\n    int head_size = self->server.head_len + (xorshift128plus() & 0x3F);\n    int outlength;\n    char * out_buffer = (char*)malloc(datalength + 2048);\n    char * body_buffer = NULL;\n    if (head_size > datalength)\n        head_size = datalength;\n    http_simple_encode_head(local, encryptdata, head_size);\n    if (self->server.param && strlen(self->server.param) == 0)\n        self->server.param = NULL;\n    strncpy(hosts, self->server.param ? self->server.param : self->server.host, sizeof hosts);\n    phost[host_num++] = hosts;\n    for (pos = 0; hosts[pos]; ++pos) {\n        if (hosts[pos] == ',') {\n            phost[host_num++] = &hosts[pos + 1];\n            hosts[pos] = 0;\n        } else if (hosts[pos] == '#') {\n            char * body_pointer = &hosts[pos + 1];\n            char * p;\n            int trans_char = 0;\n            p = body_buffer = (char*)malloc(2048);\n            for ( ; *body_pointer; ++body_pointer) {\n                if (*body_pointer == '\\\\') {\n                    trans_char = 1;\n                    continue;\n                } else if (*body_pointer == '\\n') {\n                    *p = '\\r';\n                    *++p = '\\n';\n                    continue;\n                }\n                if (trans_char) {\n                    if (*body_pointer == '\\\\' ) {\n                        *p = '\\\\';\n                    } else if (*body_pointer == 'n' ) {\n                        *p = '\\r';\n                        *++p = '\\n';\n                    } else {\n                        *p = '\\\\';\n                        *p = *body_pointer;\n                    }\n                    trans_char = 0;\n                } else {\n                    *p = *body_pointer;\n                }\n                ++p;\n            }\n            *p = 0;\n            hosts[pos] = 0;\n            break;\n        }\n    }\n    host_num = xorshift128plus() % host_num;\n    if (self->server.port == 80)\n        sprintf(hostport, \"%s\", phost[host_num]);\n    else\n        sprintf(hostport, \"%s:%d\", phost[host_num], self->server.port);\n    if (body_buffer) {\n        sprintf(out_buffer,\n            \"POST /%s HTTP/1.1\\r\\n\"\n            \"Host: %s\\r\\n\"\n            \"%s\\r\\n\\r\\n\",\n            local->encode_buffer,\n            hostport,\n            body_buffer);\n    } else {\n        char result[33] = {0};\n        boundary(result);\n        sprintf(out_buffer,\n            \"POST /%s HTTP/1.1\\r\\n\"\n            \"Host: %s\\r\\n\"\n            \"User-Agent: %s\\r\\n\"\n            \"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\\r\\n\"\n            \"Accept-Language: en-US,en;q=0.8\\r\\n\"\n            \"Accept-Encoding: gzip, deflate\\r\\n\"\n            \"Content-Type: multipart/form-data; boundary=%s\\r\\n\"\n            \"DNT: 1\\r\\n\"\n            \"Connection: keep-alive\\r\\n\"\n            \"\\r\\n\",\n            local->encode_buffer,\n            hostport,\n            g_useragent[g_useragent_index],\n            result\n            );\n    }\n    //LOGI(\"http header: %s\", out_buffer);\n    outlength = strlen(out_buffer);\n    memmove(out_buffer + outlength, encryptdata + head_size, datalength - head_size);\n    outlength += datalength - head_size;\n    local->has_sent_header = 1;\n    if (*capacity < outlength) {\n        *pencryptdata = (char*)realloc(*pencryptdata, *capacity = outlength * 2);\n        encryptdata = *pencryptdata;\n    }\n    memmove(encryptdata, out_buffer, outlength);\n    free(out_buffer);\n    if (body_buffer != NULL)\n        free(body_buffer);\n    if (local->encode_buffer != NULL) {\n        free(local->encode_buffer);\n        local->encode_buffer = NULL;\n    }\n    return outlength;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/http_simple.h",
    "content": "/*\n * http_simple.h - Define shadowsocksR server's buffers and callbacks\n *\n * Copyright (C) 2015 - 2016, Break Wa11 <mmgac001@gmail.com>\n */\n\n#ifndef _HTTP_SIMPLE_H\n#define _HTTP_SIMPLE_H\n\nobfs * http_simple_new_obfs();\nvoid http_simple_dispose(obfs *self);\n\nint http_simple_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity);\nint http_simple_client_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback);\n\nint http_post_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity);\n\nint http_simple_server_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity);\nint http_simple_server_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback);\n\n#endif // _HTTP_SIMPLE_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/jconf.c",
    "content": "/*\n * jconf.c - Parse the JSON format config file\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <unistd.h>\n#include <string.h>\n#include <time.h>\n\n#include \"utils.h\"\n#include \"jconf.h\"\n#include \"json.h\"\n#include \"string.h\"\n\n#include <libcork/core.h>\n\n#define check_json_value_type(value, expected_type, message) \\\n    do { \\\n        if ((value)->type != (expected_type)) \\\n            FATAL((message)); \\\n    } while(0)\n\nstatic char *\nto_string(const json_value *value)\n{\n    if (value->type == json_string) {\n        return ss_strndup(value->u.string.ptr, value->u.string.length);\n    } else if (value->type == json_integer) {\n        return strdup(ss_itoa(value->u.integer));\n    } else if (value->type == json_null) {\n        return \"null\";\n    } else {\n        LOGE(\"%d\", value->type);\n        FATAL(\"Invalid config format.\");\n    }\n    return 0;\n}\n\nvoid\nfree_addr(ss_addr_t *addr)\n{\n    ss_free(addr->host);\n    ss_free(addr->port);\n}\n\nvoid\nparse_addr(const char *str, ss_addr_t *addr)\n{\n    int ipv6 = 0, ret = -1, n = 0;\n    char *pch;\n\n    struct cork_ip ip;\n    if (cork_ip_init(&ip, str) != -1) {\n        addr->host = strdup(str);\n        addr->port = NULL;\n        return;\n    }\n\n    pch = strchr(str, ':');\n    while (pch != NULL) {\n        n++;\n        ret = pch - str;\n        pch = strchr(pch + 1, ':');\n    }\n    if (n > 1) {\n        ipv6 = 1;\n        if (str[ret - 1] != ']') {\n            ret = -1;\n        }\n    }\n\n    if (ret == -1) {\n        if (ipv6) {\n            addr->host = ss_strndup(str + 1, strlen(str) - 2);\n        } else {\n            addr->host = strdup(str);\n        }\n        addr->port = NULL;\n    } else {\n        if (ipv6) {\n            addr->host = ss_strndup(str + 1, ret - 2);\n        } else {\n            addr->host = ss_strndup(str, ret);\n        }\n        addr->port = strdup(str + ret + 1);\n    }\n}\n\njconf_t *\nread_jconf(const char *file)\n{\n    static jconf_t conf;\n\n    memset(&conf, 0, sizeof(jconf_t));\n\n    char *buf;\n    json_value *obj;\n\n    FILE *f = fopen(file, \"rb\");\n    if (f == NULL) {\n        FATAL(\"Invalid config path.\");\n    }\n\n    fseek(f, 0, SEEK_END);\n    long pos = ftell(f);\n    fseek(f, 0, SEEK_SET);\n\n    if (pos >= MAX_CONF_SIZE) {\n        FATAL(\"Too large config file.\");\n    }\n\n    buf = ss_malloc(pos + 1);\n    if (buf == NULL) {\n        FATAL(\"No enough memory.\");\n    }\n\n    int nread = fread(buf, pos, 1, f);\n    if (!nread) {\n        FATAL(\"Failed to read the config file.\");\n    }\n    fclose(f);\n\n    buf[pos] = '\\0'; // end of string\n\n    json_settings settings = { 0UL, 0, NULL, NULL, NULL };\n    char error_buf[512];\n    obj = json_parse_ex(&settings, buf, pos, error_buf);\n\n    if (obj == NULL) {\n        FATAL(error_buf);\n    }\n\n    if (obj->type == json_object) {\n        unsigned int i, j;\n        for (i = 0; i < obj->u.object.length; i++) {\n            char *name        = obj->u.object.values[i].name;\n            json_value *value = obj->u.object.values[i].value;\n            if (strcmp(name, \"server\") == 0) {\n                if (value->type == json_array) {\n                    for (j = 0; j < value->u.array.length; j++) {\n                        if (j >= MAX_REMOTE_NUM) {\n                            break;\n                        }\n                        json_value *v = value->u.array.values[j];\n                        char *addr_str = to_string(v);\n                        parse_addr(addr_str, conf.remote_addr + j);\n                        ss_free(addr_str);\n                        conf.remote_num = j + 1;\n                    }\n                } else if (value->type == json_string) {\n                    conf.remote_addr[0].host = to_string(value);\n                    conf.remote_addr[0].port = NULL;\n                    conf.remote_num          = 1;\n                }\n            } else if (strcmp(name, \"port_password\") == 0) {\n                if (value->type == json_object) {\n                    for (j = 0; j < value->u.object.length; j++) {\n                        if (j >= MAX_PORT_NUM) {\n                            break;\n                        }\n                        json_value *v = value->u.object.values[j].value;\n                        if (v->type == json_string) {\n                            conf.port_password[j].port = ss_strndup(value->u.object.values[j].name,\n                                                                    value->u.object.values[j].name_length);\n                            conf.port_password[j].password = to_string(v);\n                            conf.port_password_num         = j + 1;\n                        }\n                    }\n                }\n            } else if (strcmp(name, \"server_port\") == 0) {\n                conf.remote_port = to_string(value);\n            } else if (strcmp(name, \"local_address\") == 0) {\n                conf.local_addr = to_string(value);\n            } else if (strcmp(name, \"local_port\") == 0) {\n                conf.local_port = to_string(value);\n            } else if (strcmp(name, \"password\") == 0) {\n                conf.password = to_string(value);\n            } else if (strcmp(name, \"protocol\") == 0) { // SSR\n                conf.protocol = to_string(value);\n            } else if (strcmp(name, \"protocol_param\") == 0) { // SSR\n                conf.protocol_param = to_string(value);\n            } else if (strcmp(name, \"method\") == 0) {\n                conf.method = to_string(value);\n            } else if (strcmp(name, \"obfs\") == 0) { // SSR\n                conf.obfs = to_string(value);\n            } else if (strcmp(name, \"obfs_param\") == 0) { // SSR\n                conf.obfs_param = to_string(value);\n            } else if (strcmp(name, \"timeout\") == 0) {\n                conf.timeout = to_string(value);\n            } else if (strcmp(name, \"user\") == 0) {\n                conf.user = to_string(value);\n            } else if (strcmp(name, \"fast_open\") == 0) {\n                check_json_value_type(value, json_boolean,\n                        \"invalid config file: option 'fast_open' must be a boolean\");\n                conf.fast_open = value->u.boolean;\n            } else if (strcmp(name, \"auth\") == 0) {\n                check_json_value_type(value, json_boolean,\n                        \"invalid config file: option 'auth' must be a boolean\");\n                conf.auth = value->u.boolean;\n            } else if (strcmp(name, \"nofile\") == 0) {\n                check_json_value_type(value, json_integer,\n                    \"invalid config file: option 'nofile' must be an integer\");\n                conf.nofile = value->u.integer;\n            } else if (strcmp(name, \"nameserver\") == 0) {\n                conf.nameserver = to_string(value);\n            } else if (strcmp(name, \"tunnel_address\") == 0) {\n                conf.tunnel_address = to_string(value);\n            } else if (strcmp(name, \"mode\") == 0) {\n                char *mode_str = to_string(value);\n\n                if (strcmp(mode_str, \"tcp_only\") == 0)\n                    conf.mode = TCP_ONLY;\n                else if (strcmp(mode_str, \"tcp_and_udp\") == 0)\n                    conf.mode = TCP_AND_UDP;\n                else if (strcmp(mode_str, \"udp_only\") == 0)\n                    conf.mode = UDP_ONLY;\n                else\n                    LOGI(\"ignore unknown mode: %s, use tcp_only as fallback\",\n                         mode_str);\n                ss_free(mode_str);\n            } else if (strcmp(name, \"mtu\") == 0) {\n                check_json_value_type(value, json_integer,\n                    \"invalid config file: option 'mtu' must be an integer\");\n                conf.mtu = value->u.integer;\n            } else if (strcmp(name, \"mptcp\") == 0) {\n                check_json_value_type(value, json_boolean,\n                    \"invalid config file: option 'mptcp' must be a boolean\");\n                conf.mptcp = value->u.boolean;\n            } else if (strcmp(name, \"ipv6_first\") == 0) {\n                check_json_value_type(value, json_boolean,\n                    \"invalid config file: option 'ipv6_first' must be a boolean\");\n                conf.ipv6_first = value->u.boolean;\n            }\n        }\n    } else {\n        FATAL(\"Invalid config file\");\n    }\n\n    ss_free(buf);\n    json_value_free(obj);\n    return &conf;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/jconf.h",
    "content": "/*\n * jconf.h - Define the config data structure\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _JCONF_H\n#define _JCONF_H\n\n#define MAX_PORT_NUM 1024\n#define MAX_REMOTE_NUM 10\n#define MAX_CONF_SIZE 128 * 1024\n#define MAX_DNS_NUM 4\n#define MAX_CONNECT_TIMEOUT 10\n#define MAX_REQUEST_TIMEOUT 60\n#define MIN_UDP_TIMEOUT 10\n\n#define TCP_ONLY     0\n#define TCP_AND_UDP  1\n#define UDP_ONLY     3\n\ntypedef struct {\n    char *host;\n    char *port;\n} ss_addr_t;\n\ntypedef struct {\n    char *port;\n    char *password;\n} ss_port_password_t;\n\ntypedef struct {\n    int remote_num;\n    ss_addr_t remote_addr[MAX_REMOTE_NUM];\n    int port_password_num;\n    ss_port_password_t port_password[MAX_PORT_NUM];\n    char *remote_port;\n    char *local_addr;\n    char *local_port;\n    char *password;\n    char *protocol; // SSR\n    char *protocol_param; // SSR\n    char *method;\n    char *obfs; // SSR\n    char *obfs_param; // SSR\n    char *timeout;\n    char *user;\n    int auth;\n    int fast_open;\n    int nofile;\n    char *nameserver;\n    char *tunnel_address;\n    int mode;\n    int mtu;\n    int mptcp;\n    int ipv6_first;\n} jconf_t;\n\njconf_t *read_jconf(const char *file);\nvoid parse_addr(const char *str, ss_addr_t *addr);\nvoid free_addr(ss_addr_t *addr);\n\n#endif // _JCONF_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/json.c",
    "content": "/* vim: set et ts=3 sw=3 sts=3 ft=c:\n *\n * Copyright (C) 2012, 2013, 2014 James McLaughlin et al.  All rights reserved.\n * https://github.com/udp/json-parser\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *   notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"json.h\"\n#include \"utils.h\"\n\n#ifdef _MSC_VER\n#ifndef _CRT_SECURE_NO_WARNINGS\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#endif\n\n#ifdef __cplusplus\nconst struct _json_value json_value_none; /* zero-d by ctor */\n#else\nconst struct _json_value json_value_none = { NULL, 0, { 0 }, { NULL } };\n#endif\n\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n#include <math.h>\n\ntypedef unsigned short json_uchar;\n\nstatic unsigned char\nhex_value(json_char c)\n{\n    if (isdigit((uint8_t)c)) {\n        return c - '0';\n    }\n\n    switch (c) {\n    case 'a':\n    case 'A':\n        return 0x0A;\n    case 'b':\n    case 'B':\n        return 0x0B;\n    case 'c':\n    case 'C':\n        return 0x0C;\n    case 'd':\n    case 'D':\n        return 0x0D;\n    case 'e':\n    case 'E':\n        return 0x0E;\n    case 'f':\n    case 'F':\n        return 0x0F;\n    default:\n        return 0xFF;\n    }\n}\n\ntypedef struct {\n    unsigned long used_memory;\n\n    unsigned int uint_max;\n    unsigned long ulong_max;\n\n    json_settings settings;\n    int first_pass;\n} json_state;\n\nstatic void *\ndefault_alloc(size_t size, int zero, void *user_data)\n{\n    return zero ? calloc(1, size) : ss_malloc(size);\n}\n\nstatic void\ndefault_free(void *ptr, void *user_data)\n{\n    ss_free(ptr);\n}\n\nstatic void *\njson_alloc(json_state *state, unsigned long size, int zero)\n{\n    if ((state->ulong_max - state->used_memory) < size) {\n        return 0;\n    }\n\n    if (state->settings.max_memory\n        && (state->used_memory += size) > state->settings.max_memory) {\n        return 0;\n    }\n\n    return state->settings.mem_alloc(size, zero, state->settings.user_data);\n}\n\nstatic int\nnew_value(json_state *state, json_value **top, json_value **root,\n          json_value **alloc, json_type type)\n{\n    json_value *value;\n    int values_size;\n\n    if (!state->first_pass) {\n        value  = *top = *alloc;\n        *alloc = (*alloc)->_reserved.next_alloc;\n\n        if (!*root) {\n            *root = value;\n        }\n\n        switch (value->type) {\n        case json_array:\n\n            if (!(value->u.array.values = (json_value **)json_alloc\n                                              (state, value->u.array.length *\n                                              sizeof(json_value *), 0))) {\n                return 0;\n            }\n\n            value->u.array.length = 0;\n            break;\n\n        case json_object:\n\n            values_size = sizeof(*value->u.object.values) *\n                          value->u.object.length;\n\n            if (!((*(void **)&value->u.object.values) = json_alloc\n                                                            (state,\n                                                            values_size +\n                                                            ((size_t)value->u.\n                                                             object.values),\n                                                            0))) {\n                return 0;\n            }\n\n            value->_reserved.object_mem = (*(char **)&value->u.object.values) +\n                                          values_size;\n\n            value->u.object.length = 0;\n            break;\n\n        case json_string:\n\n            if (!(value->u.string.ptr = (json_char *)json_alloc\n                                            (state,\n                                            (value->u.string.length +\n                                             1) * sizeof(json_char), 0))) {\n                return 0;\n            }\n\n            value->u.string.length = 0;\n            break;\n\n        default:\n            break;\n        }\n\n        return 1;\n    }\n\n    value = (json_value *)json_alloc(state, sizeof(json_value), 1);\n\n    if (!value) {\n        return 0;\n    }\n\n    if (!*root) {\n        *root = value;\n    }\n\n    value->type   = type;\n    value->parent = *top;\n\n    if (*alloc) {\n        (*alloc)->_reserved.next_alloc = value;\n    }\n\n    *alloc = *top = value;\n\n    return 1;\n}\n\n#define e_off \\\n    ((int)(i - cur_line_begin))\n\n#define whitespace                          \\\ncase '\\n': \\\n    ++cur_line; cur_line_begin = i; \\\ncase ' ': \\\ncase '\\t': \\\ncase '\\r'\n\n#define string_add(b)                                         \\\n    do { if (!state.first_pass) { string[string_length] = b; \\\n         } ++string_length; } while (0)\n\nstatic const long\n    flag_next           = 1 << 0,\n    flag_reproc         = 1 << 1,\n    flag_need_comma     = 1 << 2,\n    flag_seek_value     = 1 << 3,\n    flag_escaped        = 1 << 4,\n    flag_string         = 1 << 5,\n    flag_need_colon     = 1 << 6,\n    flag_done           = 1 << 7,\n    flag_num_negative   = 1 << 8,\n    flag_num_zero       = 1 << 9,\n    flag_num_e          = 1 << 10,\n    flag_num_e_got_sign = 1 << 11,\n    flag_num_e_negative = 1 << 12,\n    flag_line_comment   = 1 << 13,\n    flag_block_comment  = 1 << 14;\n\njson_value *\njson_parse_ex(json_settings *settings,\n              const json_char *json,\n              size_t length,\n              char *error_buf)\n{\n    json_char error[json_error_max];\n    int cur_line;\n    const json_char *cur_line_begin, *i, *end;\n    json_value *top, *root, *alloc = 0;\n    json_state state = { 0UL, 0U, 0UL, { 0UL, 0, NULL, NULL, NULL }, 0 };\n    long flags;\n    long num_digits = 0, num_e = 0;\n    json_int_t num_fraction = 0;\n\n    /* Skip UTF-8 BOM\n     */\n    if (length >= 3 && ((unsigned char)json[0]) == 0xEF\n        && ((unsigned char)json[1]) == 0xBB\n        && ((unsigned char)json[2]) == 0xBF) {\n        json   += 3;\n        length -= 3;\n    }\n\n    error[0] = '\\0';\n    end      = (json + length);\n\n    memcpy(&state.settings, settings, sizeof(json_settings));\n\n    if (!state.settings.mem_alloc) {\n        state.settings.mem_alloc = default_alloc;\n    }\n\n    if (!state.settings.mem_free) {\n        state.settings.mem_free = default_free;\n    }\n\n    memset(&state.uint_max, 0xFF, sizeof(state.uint_max));\n    memset(&state.ulong_max, 0xFF, sizeof(state.ulong_max));\n\n    state.uint_max  -= 8; /* limit of how much can be added before next check */\n    state.ulong_max -= 8;\n\n    for (state.first_pass = 1; state.first_pass >= 0; --state.first_pass) {\n        json_uchar uchar;\n        unsigned char uc_b1, uc_b2, uc_b3, uc_b4;\n        json_char *string          = 0;\n        unsigned int string_length = 0;\n\n        top   = root = 0;\n        flags = flag_seek_value;\n\n        cur_line       = 1;\n        cur_line_begin = json;\n\n        for (i = json;; ++i) {\n            json_char b = (i == end ? 0 : *i);\n\n            if (flags & flag_string) {\n                if (!b) {\n                    sprintf(error, \"Unexpected EOF in string (at %d:%d)\",\n                            cur_line, e_off);\n                    goto e_failed;\n                }\n\n                if (string_length > state.uint_max) {\n                    goto e_overflow;\n                }\n\n                if (flags & flag_escaped) {\n                    flags &= ~flag_escaped;\n\n                    switch (b) {\n                    case 'b':\n                        string_add('\\b');\n                        break;\n                    case 'f':\n                        string_add('\\f');\n                        break;\n                    case 'n':\n                        string_add('\\n');\n                        break;\n                    case 'r':\n                        string_add('\\r');\n                        break;\n                    case 't':\n                        string_add('\\t');\n                        break;\n                    case 'u':\n\n                        if (end - i < 4 ||\n                            (uc_b1 = hex_value(*++i)) == 0xFF ||\n                            (uc_b2 = hex_value(*++i)) == 0xFF\n                            || (uc_b3 = hex_value(*++i)) == 0xFF ||\n                            (uc_b4 = hex_value(*++i)) == 0xFF) {\n                            sprintf(error,\n                                    \"Invalid character value `%c` (at %d:%d)\",\n                                    b, cur_line, e_off);\n                            goto e_failed;\n                        }\n\n                        uc_b1 = uc_b1 * 16 + uc_b2;\n                        uc_b2 = uc_b3 * 16 + uc_b4;\n\n                        uchar = ((json_char)uc_b1) * 256 + uc_b2;\n\n                        if (sizeof(json_char) >= sizeof(json_uchar) ||\n                            (uc_b1 == 0 && uc_b2 <= 0x7F)) {\n                            string_add((json_char)uchar);\n                            break;\n                        }\n\n                        if (uchar <= 0x7FF) {\n                            if (state.first_pass) {\n                                string_length += 2;\n                            } else {\n                                string[string_length++] = 0xC0 |\n                                                          ((uc_b2 &\n                                                            0xC0) >>\n                                                           6) |\n                                                          ((uc_b1 & 0x7) << 2);\n                                string[string_length++] = 0x80 |\n                                                          (uc_b2 & 0x3F);\n                            }\n\n                            break;\n                        }\n\n                        if (state.first_pass) {\n                            string_length += 3;\n                        } else {\n                            string[string_length++] = 0xE0 |\n                                                      ((uc_b1 & 0xF0) >> 4);\n                            string[string_length++] = 0x80 |\n                                                      ((uc_b1 &\n                                                        0xF) <<\n                                                       2) |\n                                                      ((uc_b2 & 0xC0) >> 6);\n                            string[string_length++] = 0x80 | (uc_b2 & 0x3F);\n                        }\n\n                        break;\n\n                    default:\n                        string_add(b);\n                    }\n\n                    continue;\n                }\n\n                if (b == '\\\\') {\n                    flags |= flag_escaped;\n                    continue;\n                }\n\n                if (b == '\"') {\n                    if (!state.first_pass) {\n                        string[string_length] = 0;\n                    }\n\n                    flags &= ~flag_string;\n                    string = 0;\n\n                    switch (top->type) {\n                    case json_string:\n\n                        top->u.string.length = string_length;\n                        flags               |= flag_next;\n\n                        break;\n\n                    case json_object:\n\n                        if (state.first_pass) {\n                            (*(json_char **)&top->u.object.values) +=\n                                string_length + 1;\n                        } else {\n                            top->u.object.values[top->u.object.length].name\n                                = (json_char *)top->_reserved.object_mem;\n\n                            top->u.object.values[top->u.object.length].\n                            name_length\n                                = string_length;\n\n                            (*(json_char **)&top->_reserved.object_mem) +=\n                                string_length + 1;\n                        }\n\n                        flags |= flag_seek_value | flag_need_colon;\n                        continue;\n\n                    default:\n                        break;\n                    }\n                } else {\n                    string_add(b);\n                    continue;\n                }\n            }\n\n            if (state.settings.settings & json_enable_comments) {\n                if (flags & (flag_line_comment | flag_block_comment)) {\n                    if (flags & flag_line_comment) {\n                        if (b == '\\r' || b == '\\n' || !b) {\n                            flags &= ~flag_line_comment;\n                            --i;   /* so null can be reproc'd */\n                        }\n\n                        continue;\n                    }\n\n                    if (flags & flag_block_comment) {\n                        if (!b) {\n                            sprintf(error,\n                                    \"%d:%d: Unexpected EOF in block comment\",\n                                    cur_line, e_off);\n                            goto e_failed;\n                        }\n\n                        if (b == '*' && i < (end - 1) && i[1] == '/') {\n                            flags &= ~flag_block_comment;\n                            ++i;   /* skip closing sequence */\n                        }\n\n                        continue;\n                    }\n                } else if (b == '/') {\n                    if (!(flags & (flag_seek_value | flag_done)) && top->type !=\n                        json_object) {\n                        sprintf(error, \"%d:%d: Comment not allowed here\",\n                                cur_line, e_off);\n                        goto e_failed;\n                    }\n\n                    if (++i == end) {\n                        sprintf(error, \"%d:%d: EOF unexpected\", cur_line,\n                                e_off);\n                        goto e_failed;\n                    }\n\n                    switch (b = *i) {\n                    case '/':\n                        flags |= flag_line_comment;\n                        continue;\n\n                    case '*':\n                        flags |= flag_block_comment;\n                        continue;\n\n                    default:\n                        sprintf(error,\n                                \"%d:%d: Unexpected `%c` in comment opening sequence\", cur_line, e_off,\n                                b);\n                        goto e_failed;\n                    }\n                }\n            }\n\n            if (flags & flag_done) {\n                if (!b) {\n                    break;\n                }\n\n                switch (b) {\nwhitespace:\n                    continue;\n\n                default:\n                    sprintf(error, \"%d:%d: Trailing garbage: `%c`\", cur_line,\n                            e_off, b);\n                    goto e_failed;\n                }\n            }\n\n            if (flags & flag_seek_value) {\n                switch (b) {\nwhitespace:\n                    continue;\n\n                case ']':\n\n                    if (top->type == json_array) {\n                        flags =\n                            (flags &\n                             ~(flag_need_comma | flag_seek_value)) | flag_next;\n                    } else {\n                        sprintf(error, \"%d:%d: Unexpected ]\", cur_line, e_off);\n                        goto e_failed;\n                    }\n\n                    break;\n\n                default:\n\n                    if (flags & flag_need_comma) {\n                        if (b == ',') {\n                            flags &= ~flag_need_comma;\n                            continue;\n                        } else {\n                            sprintf(error, \"%d:%d: Expected , before %c\",\n                                    cur_line, e_off, b);\n                            goto e_failed;\n                        }\n                    }\n\n                    if (flags & flag_need_colon) {\n                        if (b == ':') {\n                            flags &= ~flag_need_colon;\n                            continue;\n                        } else {\n                            sprintf(error, \"%d:%d: Expected : before %c\",\n                                    cur_line, e_off, b);\n                            goto e_failed;\n                        }\n                    }\n\n                    flags &= ~flag_seek_value;\n\n                    switch (b) {\n                    case '{':\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_object)) {\n                            goto e_alloc_failure;\n                        }\n\n                        continue;\n\n                    case '[':\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_array)) {\n                            goto e_alloc_failure;\n                        }\n\n                        flags |= flag_seek_value;\n                        continue;\n\n                    case '\"':\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_string)) {\n                            goto e_alloc_failure;\n                        }\n\n                        flags |= flag_string;\n\n                        string        = top->u.string.ptr;\n                        string_length = 0;\n\n                        continue;\n\n                    case 't':\n\n                        if ((end - i) < 3 || *(++i) != 'r' || *(++i) != 'u' ||\n                            *(++i) != 'e') {\n                            goto e_unknown_value;\n                        }\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_boolean)) {\n                            goto e_alloc_failure;\n                        }\n\n                        top->u.boolean = 1;\n\n                        flags |= flag_next;\n                        break;\n\n                    case 'f':\n\n                        if ((end - i) < 4 || *(++i) != 'a' || *(++i) != 'l' ||\n                            *(++i) != 's' || *(++i) != 'e') {\n                            goto e_unknown_value;\n                        }\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_boolean)) {\n                            goto e_alloc_failure;\n                        }\n\n                        flags |= flag_next;\n                        break;\n\n                    case 'n':\n\n                        if ((end - i) < 3 || *(++i) != 'u' || *(++i) != 'l' ||\n                            *(++i) != 'l') {\n                            goto e_unknown_value;\n                        }\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_null)) {\n                            goto e_alloc_failure;\n                        }\n\n                        flags |= flag_next;\n                        break;\n\n                    default:\n\n                        if (isdigit((uint8_t)b) || b == '-') {\n                            if (!new_value(&state, &top, &root, &alloc,\n                                           json_integer)) {\n                                goto e_alloc_failure;\n                            }\n\n                            if (!state.first_pass) {\n                                while (isdigit((uint8_t)b) || b == '+' || b ==\n                                       '-'\n                                       || b == 'e' || b == 'E' || b == '.') {\n                                    if ((++i) == end) {\n                                        b = 0;\n                                        break;\n                                    }\n\n                                    b = *i;\n                                }\n\n                                flags |= flag_next | flag_reproc;\n                                break;\n                            }\n\n                            flags &= ~(flag_num_negative | flag_num_e |\n                                       flag_num_e_got_sign |\n                                       flag_num_e_negative |\n                                       flag_num_zero);\n\n                            num_digits   = 0;\n                            num_fraction = 0;\n                            num_e        = 0;\n\n                            if (b != '-') {\n                                flags |= flag_reproc;\n                                break;\n                            }\n\n                            flags |= flag_num_negative;\n                            continue;\n                        } else {\n                            sprintf(error,\n                                    \"%d:%d: Unexpected %c when seeking value\",\n                                    cur_line, e_off, b);\n                            goto e_failed;\n                        }\n                    }\n                }\n            } else {\n                switch (top->type) {\n                case json_object:\n\n                    switch (b) {\nwhitespace:\n                        continue;\n\n                    case '\"':\n\n                        if (flags & flag_need_comma) {\n                            sprintf(error, \"%d:%d: Expected , before \\\"\",\n                                    cur_line, e_off);\n                            goto e_failed;\n                        }\n\n                        flags |= flag_string;\n\n                        string        = (json_char *)top->_reserved.object_mem;\n                        string_length = 0;\n\n                        break;\n\n                    case '}':\n\n                        flags = (flags & ~flag_need_comma) | flag_next;\n                        break;\n\n                    case ',':\n\n                        if (flags & flag_need_comma) {\n                            flags &= ~flag_need_comma;\n                            break;\n                        }\n\n                    default:\n\n                        sprintf(error, \"%d:%d: Unexpected `%c` in object\",\n                                cur_line, e_off, b);\n                        goto e_failed;\n                    }\n\n                    break;\n\n                case json_integer:\n                case json_double:\n\n                    if (isdigit((uint8_t)b)) {\n                        ++num_digits;\n\n                        if (top->type == json_integer || flags & flag_num_e) {\n                            if (!(flags & flag_num_e)) {\n                                if (flags & flag_num_zero) {\n                                    sprintf(error,\n                                            \"%d:%d: Unexpected `0` before `%c`\",\n                                            cur_line, e_off, b);\n                                    goto e_failed;\n                                }\n\n                                if (num_digits == 1 && b == '0') {\n                                    flags |= flag_num_zero;\n                                }\n                            } else {\n                                flags |= flag_num_e_got_sign;\n                                num_e  = (num_e * 10) + (b - '0');\n                                continue;\n                            }\n\n                            top->u.integer = (top->u.integer * 10) + (b - '0');\n                            continue;\n                        }\n\n                        num_fraction = (num_fraction * 10) + (b - '0');\n                        continue;\n                    }\n\n                    if (b == '+' || b == '-') {\n                        if ((flags & flag_num_e) &&\n                            !(flags & flag_num_e_got_sign)) {\n                            flags |= flag_num_e_got_sign;\n\n                            if (b == '-') {\n                                flags |= flag_num_e_negative;\n                            }\n\n                            continue;\n                        }\n                    } else if (b == '.' && top->type == json_integer) {\n                        if (!num_digits) {\n                            sprintf(error, \"%d:%d: Expected digit before `.`\",\n                                    cur_line, e_off);\n                            goto e_failed;\n                        }\n\n                        top->type  = json_double;\n                        top->u.dbl = (double)top->u.integer;\n\n                        num_digits = 0;\n                        continue;\n                    }\n\n                    if (!(flags & flag_num_e)) {\n                        if (top->type == json_double) {\n                            if (!num_digits) {\n                                sprintf(error,\n                                        \"%d:%d: Expected digit after `.`\",\n                                        cur_line, e_off);\n                                goto e_failed;\n                            }\n\n                            top->u.dbl += ((double)num_fraction) /\n                                          (pow(10, (double)num_digits));\n                        }\n\n                        if (b == 'e' || b == 'E') {\n                            flags |= flag_num_e;\n\n                            if (top->type == json_integer) {\n                                top->type  = json_double;\n                                top->u.dbl = (double)top->u.integer;\n                            }\n\n                            num_digits = 0;\n                            flags     &= ~flag_num_zero;\n\n                            continue;\n                        }\n                    } else {\n                        if (!num_digits) {\n                            sprintf(error, \"%d:%d: Expected digit after `e`\",\n                                    cur_line, e_off);\n                            goto e_failed;\n                        }\n\n                        top->u.dbl *=\n                            pow(10,\n                                (double)((flags &\n                                         flag_num_e_negative) ? -num_e : num_e));\n                    }\n\n                    if (flags & flag_num_negative) {\n                        if (top->type == json_integer) {\n                            top->u.integer = -top->u.integer;\n                        } else {\n                            top->u.dbl = -top->u.dbl;\n                        }\n                    }\n\n                    flags |= flag_next | flag_reproc;\n                    break;\n\n                default:\n                    break;\n                }\n            }\n\n            if (flags & flag_reproc) {\n                flags &= ~flag_reproc;\n                --i;\n            }\n\n            if (flags & flag_next) {\n                flags = (flags & ~flag_next) | flag_need_comma;\n\n                if (!top->parent) {\n                    /* root value done */\n\n                    flags |= flag_done;\n                    continue;\n                }\n\n                if (top->parent->type == json_array) {\n                    flags |= flag_seek_value;\n                }\n\n                if (!state.first_pass) {\n                    json_value *parent = top->parent;\n\n                    switch (parent->type) {\n                    case json_object:\n\n                        parent->u.object.values\n                        [parent->u.object.length].value = top;\n\n                        break;\n\n                    case json_array:\n\n                        parent->u.array.values\n                        [parent->u.array.length] = top;\n\n                        break;\n\n                    default:\n                        break;\n                    }\n                }\n\n                if ((++top->parent->u.array.length) > state.uint_max) {\n                    goto e_overflow;\n                }\n\n                top = top->parent;\n\n                continue;\n            }\n        }\n\n        alloc = root;\n    }\n\n    return root;\n\ne_unknown_value:\n\n    sprintf(error, \"%d:%d: Unknown value\", cur_line, e_off);\n    goto e_failed;\n\ne_alloc_failure:\n\n    strcpy(error, \"Memory allocation failure\");\n    goto e_failed;\n\ne_overflow:\n\n    sprintf(error, \"%d:%d: Too long (caught overflow)\", cur_line, e_off);\n    goto e_failed;\n\ne_failed:\n\n    if (error_buf) {\n        if (*error) {\n            strcpy(error_buf, error);\n        } else {\n            strcpy(error_buf, \"Unknown error\");\n        }\n    }\n\n    if (state.first_pass) {\n        alloc = root;\n    }\n\n    while (alloc) {\n        top = alloc->_reserved.next_alloc;\n        state.settings.mem_free(alloc, state.settings.user_data);\n        alloc = top;\n    }\n\n    if (!state.first_pass) {\n        json_value_free_ex(&state.settings, root);\n    }\n\n    return 0;\n}\n\njson_value *\njson_parse(const json_char *json, size_t length)\n{\n    json_settings settings = { 0UL, 0, NULL, NULL, NULL };\n    return json_parse_ex(&settings, json, length, 0);\n}\n\nvoid\njson_value_free_ex(json_settings *settings, json_value *value)\n{\n    json_value *cur_value;\n\n    if (!value) {\n        return;\n    }\n\n    value->parent = 0;\n\n    while (value) {\n        switch (value->type) {\n        case json_array:\n\n            if (!value->u.array.length) {\n                settings->mem_free(value->u.array.values, settings->user_data);\n                break;\n            }\n\n            value = value->u.array.values[--value->u.array.length];\n            continue;\n\n        case json_object:\n\n            if (!value->u.object.length) {\n                settings->mem_free(value->u.object.values, settings->user_data);\n                break;\n            }\n\n            value = value->u.object.values[--value->u.object.length].value;\n            continue;\n\n        case json_string:\n\n            settings->mem_free(value->u.string.ptr, settings->user_data);\n            break;\n\n        default:\n            break;\n        }\n\n        cur_value = value;\n        value     = value->parent;\n        settings->mem_free(cur_value, settings->user_data);\n    }\n}\n\nvoid\njson_value_free(json_value *value)\n{\n    json_settings settings = { 0UL, 0, NULL, NULL, NULL };\n    settings.mem_free = default_free;\n    json_value_free_ex(&settings, value);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/json.h",
    "content": "/* vim: set et ts=3 sw=3 sts=3 ft=c:\n *\n * Copyright (C) 2012, 2013, 2014 James McLaughlin et al.  All rights reserved.\n * https://github.com/udp/json-parser\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *   notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#ifndef _JSON_H\n#define _JSON_H\n\n#ifndef json_char\n#define json_char char\n#endif\n\n#ifndef json_int_t\n#ifndef _MSC_VER\n#include <inttypes.h>\n#define json_int_t int64_t\n#else\n#define json_int_t __int64\n#endif\n#endif\n\n#include <stdlib.h>\n\n#ifdef __cplusplus\n\n#include <string.h>\n\nextern \"C\"\n{\n#endif\n\ntypedef struct {\n    unsigned long max_memory;\n    int settings;\n\n    /* Custom allocator support (leave null to use malloc/free)\n     */\n\n    void * (*mem_alloc)(size_t, int zero, void *user_data);\n    void (*mem_free)(void *, void *user_data);\n\n    void *user_data;       /* will be passed to mem_alloc and mem_free */\n} json_settings;\n\n#define json_enable_comments  0x01\n\ntypedef enum {\n    json_none,\n    json_object,\n    json_array,\n    json_integer,\n    json_double,\n    json_string,\n    json_boolean,\n    json_null\n} json_type;\n\nextern const struct _json_value json_value_none;\n\ntypedef struct _json_value {\n    struct _json_value *parent;\n\n    json_type type;\n\n    union {\n        int boolean;\n        json_int_t integer;\n        double dbl;\n\n        struct {\n            unsigned int length;\n            json_char *ptr;      /* null terminated */\n        } string;\n\n        struct {\n            unsigned int length;\n\n            struct {\n                json_char *name;\n                unsigned int name_length;\n\n                struct _json_value *value;\n            } *values;\n\n#if defined(__cplusplus) && __cplusplus >= 201103L\n            decltype(values) begin() const\n            {\n                return values;\n            }\n            decltype(values) end() const\n            {\n                return values + length;\n            }\n#endif\n        } object;\n\n        struct {\n            unsigned int length;\n            struct _json_value **values;\n\n#if defined(__cplusplus) && __cplusplus >= 201103L\n            decltype(values) begin() const\n            {\n                return values;\n            }\n            decltype(values) end() const\n            {\n                return values + length;\n            }\n#endif\n        } array;\n    } u;\n\n    union {\n        struct _json_value *next_alloc;\n        void *object_mem;\n    } _reserved;\n\n    /* Some C++ operator sugar */\n\n#ifdef __cplusplus\n\npublic:\n\n    inline _json_value(){\n        memset(this, 0, sizeof(_json_value));\n    }\n\n    inline const struct _json_value &operator [] (int index) const {\n        if (type != json_array || index < 0\n            || ((unsigned int)index) >= u.array.length) {\n            return json_value_none;\n        }\n\n        return *u.array.values[index];\n    }\n\n    inline const struct _json_value &operator [] (const char *index) const {\n        if (type != json_object) {\n            return json_value_none;\n        }\n\n        for (unsigned int i = 0; i < u.object.length; ++i)\n            if (!strcmp(u.object.values[i].name, index)) {\n                return *u.object.values[i].value;\n            }\n\n        return json_value_none;\n    }\n\n    inline operator const char * () const\n    {\n        switch (type) {\n        case json_string:\n            return u.string.ptr;\n\n        default:\n            return \"\";\n        }\n    }\n\n    inline operator\n    json_int_t() const\n    {\n        switch (type) {\n        case json_integer:\n            return u.integer;\n\n        case json_double:\n            return (json_int_t)u.dbl;\n\n        default:\n            return 0;\n        }\n    }\n\n    inline operator\n    bool() const\n    {\n        if (type != json_boolean) {\n            return false;\n        }\n\n        return u.boolean != 0;\n    }\n\n    inline operator double () const\n    {\n        switch (type) {\n        case json_integer:\n            return (double)u.integer;\n\n        case json_double:\n            return u.dbl;\n\n        default:\n            return 0;\n        }\n    }\n\n#endif\n} json_value;\n\njson_value *json_parse(const json_char *json,\n                       size_t length);\n\n#define json_error_max 128\njson_value *json_parse_ex(json_settings *settings,\n                          const json_char *json,\n                          size_t length,\n                          char *error);\n\nvoid json_value_free(json_value *);\n\n/* Not usually necessary, unless you used a custom mem_alloc and now want to\n * use a custom mem_free.\n */\nvoid json_value_free_ex(json_settings *settings,\n                        json_value *);\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/list.c",
    "content": "#include \"list.h\"\n\n/// 文件：list_impl.c\n/// 功能：实现链表的基本操作\n/// 作者：bluewind\n/// 完成时间：2011.5.29\n/// 修改时间：2011.5.31, 2011.7.2\n/// 修改备注：在头节点处添加一个空节点，可以优化添加、删除节点代码\n///  再次修改，链表增加节点数据data_size，限制数据大小，修改了\n///  添加复制数据代码，修正重复添加节点后释放节点的Bug，添加了前\n///  插、排序和遍历功能，7.3 添加tail尾指针，改进后插法性能，并改名\n/// --------------------------------------------------------------\n\nvoid swap_data(Node n1, Node n2);\n\n/// --------------------------------------------------------------\n//  函数名：list_init\n//  功能：  链表初始化\n//  参数：  无\n//  返回值：已初始化链表指针\n//  备注：  链表本身动态分配，由list_destroy函数管理释放\n/// --------------------------------------------------------------\nList list_init(unsigned int data_size)\n{\n    List list = (List) malloc(sizeof(struct clist));\n    if(list != NULL)                                        //内存分配成功\n    {\n        list->head = (Node) malloc(sizeof(node));           //为头节点分配内存\n        if(list->head)          //内存分配成功\n        {\n            list->head->data = NULL;      //初始化头节点\n            list->head->next = NULL;\n            list->data_size  = data_size;\n            list->tail = list->head;\n            list->size = 0;\n\n            list->add_back  = list_add_back;   //初始化成员函数\n            list->add_front  = list_add_front;\n            list->delete_node = list_delete_node;\n            list->delete_at  = list_delete_at;\n            list->modify_at  = list_modify_at;\n            list->have_same  = list_have_same;\n            list->have_same_cmp  = list_have_same_cmp;\n            list->foreach  = list_foreach;\n            list->clear   = list_clear;\n            list->sort   = list_sort;\n            list->destroy  = list_destroy;\n        }\n    }\n    return list;\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_add_back\n//  功能：  添加链表结点 (后插法)\n//  参数：  l--链表指针，data--链表数据指针，可为任意类型\n//  返回值：int型，为1表示添加成功，为0表示添加失败\n//  备注：  如果链表本身为空或是分配节点内存失败，将返回0\n/// --------------------------------------------------------------\nint  list_add_back(List l, void *data)\n{\n    Node new_node = (Node) malloc(sizeof(node));\n\n    if(l != NULL && new_node != NULL)  //链表本身不为空，且内存申请成功\n    {\n        new_node->data = malloc(l->data_size);\n        memcpy(new_node->data, data, l->data_size);\n        new_node->next = NULL;\n\n        l->tail->next = new_node;   //添加节点\n        l->tail = new_node;     //记录尾节点位置\n        l->size ++;       //链表元素总数加1\n\n        return 1;\n    }\n\n    return 0;\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_add_front\n//  功能：  添加链表结点 (前插法)\n//  参数：  l--链表指针，data--链表数据指针，可为任意类型\n//  返回值：int型，为1表示添加成功，为0表示添加失败\n//  备注：  如果链表本身为空或是分配节点内存失败，将返回0\n/// --------------------------------------------------------------\nint list_add_front(List l, void *data)\n{\n    Node new_node = (Node) malloc(sizeof(node));\n\n    if(l != NULL && new_node != NULL)\n    {\n        new_node->data = malloc(l->data_size);\n        memcpy(new_node->data, data, l->data_size);\n        new_node->next = l->head->next;\n\n        l->head->next = new_node;\n        if(!l->size)        //记录尾指针位置\n            l->tail = new_node;\n        l->size ++;\n\n        return 1;\n    }\n\n    return 0;\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_delete_node\n//  功能：删除链表结点\n//  参数：l--链表指针，data--链表数据指针，可为任意类型\n//        *pfunc为指向一个数据类型比较的函数指针\n//  返回值：int型，为1表示删除成功，为0表示没有找到匹配数据\n//  备注：*pfunc函数接口参数ndata为节点数据，data为比较数据，返回为真表示匹配数据\n/// --------------------------------------------------------------\nint  list_delete_node(List l, void *data, int (*pfunc)(void *ndata, void *data))\n{\n    if(l != NULL)\n    {\n        Node prev = l->head;      //前一个节点\n        Node curr = l->head->next;     //当前节点\n\n        while(curr != NULL)\n        {\n            if(pfunc(curr->data, data))    //如果找到匹配数据\n            {\n                if(curr == l->tail)     //如果是删除尾节点\n                 l->tail = prev;\n\n                prev->next = prev->next->next;  //修改前节点next指针指向下下个节点\n\n                free(curr->data);     //释放节点数据\n                free(curr);       //释放节点\n\n                l->size--;       //链表元素总数减1\n                return 1;       //返回真值\n            }\n            prev = prev->next;      //没有找到匹配时移动前节点和当前节点\n            curr = curr->next;\n        }\n    }\n\n return 0;         //没有找到匹配数据\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_delete_at\n//  功能：  修改链表节点元素值\n//  参数：  l--链表指针，index--索引值, 范围(0 -- size-1)\n//  返回值：int型，为1表示删除成功，为0表示删除失败\n//  备注：  如果链表本身为空或是index为非法值，将返回0\n/// --------------------------------------------------------------\nint list_delete_at(List l, unsigned int index)\n{\n    unsigned int cindex = 0;\n\n    if(l != NULL && index >= 0 && index < l->size)\n    {\n        Node prev = l->head;      //前一个节点\n        Node curr = l->head->next;     //当前节点\n\n        while(cindex != index)\n        {\n            prev = prev->next;\n            curr = curr->next;\n            cindex ++;\n        }\n\n        if(index == (l->size) - 1)\n            l->tail = prev;\n\n        prev->next = prev->next->next;\n        free(curr->data);\n        free(curr);\n        l->size --;\n\n        return 1;\n    }\n\n    return 0;\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_modify_at\n//  功能：  修改链表节点元素值\n//  参数：  l--链表指针，index--索引值, 范围(0 -- size-1)\n//   data--链表数据指针\n//  返回值：int型，为1表示修改成功，为0表示修改失败\n//  备注：  如果链表本身为空或是index为非法值，将返回0\n/// --------------------------------------------------------------\nint list_modify_at(List l, unsigned int index, void *new_data)\n{\n    unsigned int cindex = 0;\n\n    if(l != NULL && index >= 0 && index < l->size )  //非空链表，并且index值合法\n    {\n        Node curr = l->head->next;\n        while(cindex != index)\n        {\n            curr = curr->next;\n            cindex ++;\n        }\n        memcpy(curr->data, new_data, l->data_size);\n        return 1;\n    }\n\n    return 0;\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_sort\n//  功能：  链表排序\n//  参数：  l--链表指针，*pfunc为指向一个数据类型比较的函数指针\n//  返回值：无\n//  备注：  使用简单选择排序法，相比冒泡法每次交换，效率高一点\n/// --------------------------------------------------------------\nvoid list_sort(List l, compare pfunc)\n{\n    if(l != NULL)\n    {\n        Node min, icurr, jcurr;\n\n        icurr = l->head->next;\n        while(icurr)\n        {\n            min = icurr;        //记录最小值\n            jcurr = icurr->next;      //内循环指向下一个节点\n            while(jcurr)\n            {\n                if(pfunc(min->data, jcurr->data))  //如果找到n+1到最后一个元素最小值\n                    min = jcurr;      //记录下最小值的位置\n\n                jcurr = jcurr->next;\n            }\n\n            if(min != icurr)       //当最小值位置和n+1元素位置不相同时\n            {\n                swap_data(min, icurr);     //才进行交换，减少交换次数\n            }\n\n            icurr = icurr->next;\n        }\n    }\n}\n\nvoid swap_data(Node n1, Node n2)\n{\n    void *temp;\n\n    temp = n2->data;\n    n2->data = n1->data;\n    n1->data = temp;\n}\n\n\nint list_have_same(List l, void *data, int (*pfunc)(void *ndata, void *data))\n{\n    if(l != NULL)\n    {\n        Node curr;\n\n        for(curr = l->head->next; curr != NULL; curr = curr->next)\n        {\n            if(pfunc(curr->data, data))\n            {\n                return 1;\n            }\n        }\n    }\n\n    return 0;\n}\n\nint list_have_same_cmp(List l, void *data)\n{\n    if(l != NULL)\n    {\n        Node curr;\n\n        for(curr = l->head->next; curr != NULL; curr = curr->next)\n        {\n            if(memcmp(curr->data, data, l->data_size))\n            {\n                return 1;\n            }\n        }\n    }\n\n    return 0;\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_foreach\n//  功能：  遍历链表元素\n//  参数：  l--链表指针，doit为指向一个处理数据的函数指针\n//  返回值：无\n//  备注：  doit申明为void (*dofunc)(void *ndata)原型\n/// --------------------------------------------------------------\nvoid list_foreach(List l, dofunc doit)\n{\n    if(l != NULL)\n    {\n        Node curr;\n\n        for(curr = l->head->next; curr != NULL; curr = curr->next)\n        {\n            doit(curr->data);\n        }\n    }\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_clear\n//  功能：  清空链表元素\n//  参数：  l--链表指针\n//  返回值：无\n// 备注： 没有使用先Destroy再Init链表的办法，直接实现\n/// --------------------------------------------------------------\nvoid list_clear(List l)\n{\n    if(l != NULL)\n    {\n        Node temp;\n        Node curr = l->head->next;\n\n        while(curr != NULL)\n        {\n            temp = curr->next;\n\n            free(curr->data);    //释放节点和数据\n            free(curr);\n\n            curr = temp;\n        }\n\n        l->size = 0;      //重置链表数据\n        l->head->next = NULL;\n        l->tail = l->head;\n    }\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_destroy\n//  功能：  释放链表\n//  参数：  l--链表指针\n//  返回值：空链表指针\n/// --------------------------------------------------------------\nList list_destroy(List l)\n{\n    if(l != NULL)\n    {\n        Node temp;\n\n        while(l->head)\n        {\n            temp = l->head->next;\n\n            if(l->head->data != NULL)   //如果是头节点就不释放数据空间\n            free(l->head->data);   //先释放节点数据(但是节点数据里也有指针？)\n            free(l->head);      //再释放节点\n\n            l->head = temp;\n        }\n\n        free(l);        //释放链表本身占用空间\n        l = NULL;\n    }\n\n    return l;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/list.h",
    "content": "#ifndef LIST_H_H\n#define LIST_H_H\n\n#include <stdio.h>\n#include <malloc.h>\n#include <string.h>\n\ntypedef struct clist *List;\n\ntypedef int (*compare)(void *ndata, void *data);\ntypedef void (*dofunc)(void *ndata);\n\ntypedef int (*lpf0)(List l, void *data);\ntypedef int (*lpf1)(List l, void *data, compare pfunc);\ntypedef List (*lpf2)(List l);\ntypedef void (*lpf3)(List l);\ntypedef void (*lpf4)(List l, dofunc pfunc);\ntypedef int (*lpf5)(List l, unsigned int index, void *new_data);\ntypedef void (*lpf6)(List l, compare pfunc);\ntypedef int (*lpf7)(List l, unsigned int index);\n\ntypedef struct cnode\n{\n    void *data;\n    struct cnode *next;\n}node, *Node;\n\ntypedef struct clist\n{\n    Node head;\n    Node tail;\n    unsigned int size;\n    unsigned int data_size;\n    lpf0 add_back;\n    lpf0 add_front;\n    lpf1 delete_node;\n    lpf1 have_same;\n    lpf0 have_same_cmp;\n    lpf4 foreach;\n    lpf3 clear;\n    lpf2 destroy;\n    lpf5 modify_at;\n    lpf6 sort;\n    lpf7 delete_at;\n}list;\n\n//初始化链表\nList list_init(unsigned int data_size);\nint  list_add_back(List l, void *data);\nint  list_add_front(List l, void *data);\nint  list_delete_node(List l, void *data, compare pfunc);\nint  list_delete_at(List l, unsigned int index);\nint  list_modify_at(List l, unsigned int index, void *new_data);\nint  list_have_same(List l, void *data, compare pfunc);\nint  list_have_same_cmp(List l, void *data);\nvoid list_foreach(List l, dofunc doit);\nvoid list_sort(List l, compare pfunc);\nvoid list_clear(List l);\n//释放链表\nList list_destroy(List l);\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/netutils.c",
    "content": "/*\n * netutils.c - Network utilities\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#include <math.h>\n\n#include <libcork/core.h>\n#include <udns.h>\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#define sleep(n) Sleep(1000 * (n))\n#else\n#include <sys/socket.h>\n#include <netdb.h>\n#include <netinet/in.h>\n#include <unistd.h>\n#endif\n\n#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_NET_IF_H) && defined(__linux__)\n#include <net/if.h>\n#include <sys/ioctl.h>\n#define SET_INTERFACE\n#endif\n\n#include \"netutils.h\"\n#include \"utils.h\"\n\n#ifndef SO_REUSEPORT\n#define SO_REUSEPORT 15\n#endif\n\nextern int verbose;\n\nstatic const char valid_label_bytes[] =\n    \"-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\";\n\n#if defined(MODULE_LOCAL)\nextern int keep_resolving;\n#endif\n\nint\nset_reuseport(int socket)\n{\n    int opt = 1;\n    return setsockopt(socket, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt));\n}\n\nsize_t\nget_sockaddr_len(struct sockaddr *addr)\n{\n    if (addr->sa_family == AF_INET) {\n        return sizeof(struct sockaddr_in);\n    } else if (addr->sa_family == AF_INET6) {\n        return sizeof(struct sockaddr_in6);\n    }\n    return 0;\n}\n\n#ifdef SET_INTERFACE\nint\nsetinterface(int socket_fd, const char *interface_name)\n{\n    struct ifreq interface;\n    memset(&interface, 0, sizeof(struct ifreq));\n    strncpy(interface.ifr_name, interface_name, IFNAMSIZ);\n    int res = setsockopt(socket_fd, SOL_SOCKET, SO_BINDTODEVICE, &interface,\n                         sizeof(struct ifreq));\n    return res;\n}\n\n#endif\n\nint\nbind_to_address(int socket_fd, const char *host)\n{\n    if (host != NULL) {\n        struct cork_ip ip;\n        struct sockaddr_storage storage;\n        memset(&storage, 0, sizeof(struct sockaddr_storage));\n        if (cork_ip_init(&ip, host) != -1) {\n            if (ip.version == 4) {\n                struct sockaddr_in *addr = (struct sockaddr_in *)&storage;\n                dns_pton(AF_INET, host, &addr->sin_addr);\n                addr->sin_family = AF_INET;\n                return bind(socket_fd, (struct sockaddr *)addr, sizeof(struct sockaddr_in));\n            } else if (ip.version == 6) {\n                struct sockaddr_in6 *addr = (struct sockaddr_in6 *)&storage;\n                dns_pton(AF_INET6, host, &addr->sin6_addr);\n                addr->sin6_family = AF_INET6;\n                return bind(socket_fd, (struct sockaddr *)addr, sizeof(struct sockaddr_in6));\n            }\n        }\n    }\n    return -1;\n}\n\nssize_t\nget_sockaddr(char *host, char *port,\n             struct sockaddr_storage *storage, int block,\n             int ipv6first)\n{\n    struct cork_ip ip;\n    if (cork_ip_init(&ip, host) != -1) {\n        if (ip.version == 4) {\n            struct sockaddr_in *addr = (struct sockaddr_in *)storage;\n            addr->sin_family = AF_INET;\n            dns_pton(AF_INET, host, &(addr->sin_addr));\n            if (port != NULL) {\n                addr->sin_port = htons(atoi(port));\n            }\n        } else if (ip.version == 6) {\n            struct sockaddr_in6 *addr = (struct sockaddr_in6 *)storage;\n            addr->sin6_family = AF_INET6;\n            dns_pton(AF_INET6, host, &(addr->sin6_addr));\n            if (port != NULL) {\n                addr->sin6_port = htons(atoi(port));\n            }\n        }\n        return 0;\n    } else {\n        struct addrinfo hints;\n        struct addrinfo *result, *rp;\n\n        memset(&hints, 0, sizeof(struct addrinfo));\n        hints.ai_family   = AF_UNSPEC;   /* Return IPv4 and IPv6 choices */\n        hints.ai_socktype = SOCK_STREAM; /* We want a TCP socket */\n\n        int err, i;\n\n        for (i = 1; i < 8; i++) {\n            err = getaddrinfo(host, port, &hints, &result);\n#if defined(MODULE_LOCAL)\n            if (!keep_resolving)\n                break;\n#endif\n            if ((!block || !err)) {\n                break;\n            } else {\n                sleep(pow(2, i));\n                LOGE(\"failed to resolve server name, wait %.0f seconds\", pow(2, i));\n            }\n        }\n\n        if (err != 0) {\n            LOGE(\"getaddrinfo: %s\", gai_strerror(err));\n            return -1;\n        }\n\n        int prefer_af = ipv6first ? AF_INET6 : AF_INET;\n        for (rp = result; rp != NULL; rp = rp->ai_next)\n            if (rp->ai_family == prefer_af) {\n                if (rp->ai_family == AF_INET)\n                    memcpy(storage, rp->ai_addr, sizeof(struct sockaddr_in));\n                else if (rp->ai_family == AF_INET6)\n                    memcpy(storage, rp->ai_addr, sizeof(struct sockaddr_in6));\n                break;\n            }\n\n        if (rp == NULL) {\n            for (rp = result; rp != NULL; rp = rp->ai_next) {\n                if (rp->ai_family == AF_INET)\n                    memcpy(storage, rp->ai_addr, sizeof(struct sockaddr_in));\n                else if (rp->ai_family == AF_INET6)\n                    memcpy(storage, rp->ai_addr, sizeof(struct sockaddr_in6));\n                break;\n            }\n        }\n\n        if (rp == NULL) {\n            LOGE(\"failed to resolve remote addr\");\n            return -1;\n        }\n\n        freeaddrinfo(result);\n        return 0;\n    }\n\n    return -1;\n}\n\nint\nsockaddr_cmp(struct sockaddr_storage *addr1,\n             struct sockaddr_storage *addr2, socklen_t len)\n{\n    struct sockaddr_in *p1_in   = (struct sockaddr_in *)addr1;\n    struct sockaddr_in *p2_in   = (struct sockaddr_in *)addr2;\n    struct sockaddr_in6 *p1_in6 = (struct sockaddr_in6 *)addr1;\n    struct sockaddr_in6 *p2_in6 = (struct sockaddr_in6 *)addr2;\n    if (p1_in->sin_family < p2_in->sin_family)\n        return -1;\n    if (p1_in->sin_family > p2_in->sin_family)\n        return 1;\n    /* compare ip4 */\n    if (p1_in->sin_family == AF_INET) {\n        /* just order it, ntohs not required */\n        if (p1_in->sin_port < p2_in->sin_port)\n            return -1;\n        if (p1_in->sin_port > p2_in->sin_port)\n            return 1;\n        return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);\n    } else if (p1_in6->sin6_family == AF_INET6) {\n        /* just order it, ntohs not required */\n        if (p1_in6->sin6_port < p2_in6->sin6_port)\n            return -1;\n        if (p1_in6->sin6_port > p2_in6->sin6_port)\n            return 1;\n        return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,\n                      INET6_SIZE);\n    } else {\n        /* eek unknown type, perform this comparison for sanity. */\n        return memcmp(addr1, addr2, len);\n    }\n}\n\nint\nsockaddr_cmp_addr(struct sockaddr_storage *addr1,\n                  struct sockaddr_storage *addr2, socklen_t len)\n{\n    struct sockaddr_in *p1_in   = (struct sockaddr_in *)addr1;\n    struct sockaddr_in *p2_in   = (struct sockaddr_in *)addr2;\n    struct sockaddr_in6 *p1_in6 = (struct sockaddr_in6 *)addr1;\n    struct sockaddr_in6 *p2_in6 = (struct sockaddr_in6 *)addr2;\n    if (p1_in->sin_family < p2_in->sin_family)\n        return -1;\n    if (p1_in->sin_family > p2_in->sin_family)\n        return 1;\n    /* compare ip4 */\n    if (p1_in->sin_family == AF_INET) {\n        return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);\n    } else if (p1_in6->sin6_family == AF_INET6) {\n        return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,\n                      INET6_SIZE);\n    } else {\n        /* eek unknown type, perform this comparison for sanity. */\n        return memcmp(addr1, addr2, len);\n    }\n}\n\nint\nvalidate_hostname(const char *hostname, const int hostname_len)\n{\n    if (hostname == NULL)\n        return 0;\n\n    if (hostname_len < 1 || hostname_len > 255)\n        return 0;\n\n    if (hostname[0] == '.')\n        return 0;\n\n    const char *label = hostname;\n    while (label < hostname + hostname_len) {\n        size_t label_len = hostname_len - (label - hostname);\n        char *next_dot   = strchr(label, '.');\n        if (next_dot != NULL)\n            label_len = next_dot - label;\n\n        if (label + label_len > hostname + hostname_len)\n            return 0;\n\n        if (label_len > 63 || label_len < 1)\n            return 0;\n\n        if (label[0] == '-' || label[label_len - 1] == '-')\n            return 0;\n\n        if (strspn(label, valid_label_bytes) < label_len)\n            return 0;\n\n        label += label_len + 1;\n    }\n\n    return 1;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/netutils.h",
    "content": "/*\n * netutils.h - Network utilities\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _NETUTILS_H\n#define _NETUTILS_H\n\n#if defined(__linux__)\n#include <netdb.h>\n#elif !defined(__MINGW32__)\n#include <netinet/tcp.h>\n#endif\n\n// only enable TCP_FASTOPEN on linux\n#if defined(__linux__)\n#include <linux/tcp.h>\n/*  conditional define for TCP_FASTOPEN */\n#ifndef TCP_FASTOPEN\n#define TCP_FASTOPEN   23\n#endif\n/*  conditional define for MSG_FASTOPEN */\n#ifndef MSG_FASTOPEN\n#define MSG_FASTOPEN   0x20000000\n#endif\n#elif !defined(__APPLE__)\n#ifdef TCP_FASTOPEN\n#undef TCP_FASTOPEN\n#endif\n#endif\n\n/* Backward compatibility for MPTCP_ENABLED between kernel 3 & 4 */\n#ifndef MPTCP_ENABLED\n#ifdef TCP_CC_INFO\n#define MPTCP_ENABLED 42\n#else\n#define MPTCP_ENABLED 26\n#endif\n#endif\n\n/** byte size of ip4 address */\n#define INET_SIZE 4\n/** byte size of ip6 address */\n#define INET6_SIZE 16\n\nsize_t get_sockaddr_len(struct sockaddr *addr);\nssize_t get_sockaddr(char *host, char *port,\n                     struct sockaddr_storage *storage, int block,\n                     int ipv6first);\nint set_reuseport(int socket);\n\n#ifdef SET_INTERFACE\nint setinterface(int socket_fd, const char *interface_name);\n#endif\n\nint bind_to_address(int socket_fd, const char *address);\n\n/**\n * Compare two sockaddrs. Imposes an ordering on the addresses.\n * Compares address and port.\n * @param addr1: address 1.\n * @param addr2: address 2.\n * @param len: lengths of addr.\n * @return: 0 if addr1 == addr2. -1 if addr1 is smaller, +1 if larger.\n */\nint sockaddr_cmp(struct sockaddr_storage *addr1,\n                 struct sockaddr_storage *addr2, socklen_t len);\n\n/**\n * Compare two sockaddrs. Compares address, not the port.\n * @param addr1: address 1.\n * @param addr2: address 2.\n * @param len: lengths of addr.\n * @return: 0 if addr1 == addr2. -1 if addr1 is smaller, +1 if larger.\n */\nint sockaddr_cmp_addr(struct sockaddr_storage *addr1,\n                      struct sockaddr_storage *addr2, socklen_t len);\n\nint validate_hostname(const char *hostname, const int hostname_len);\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/obfs.c",
    "content": "#include <string.h>\n#include <stdlib.h>\n\n#include \"utils.h\"\n#include \"obfs.h\"\n\nint rand_bytes(uint8_t *output, int len);\n#define OBFS_HMAC_SHA1_LEN 10\n\n#include \"obfsutil.c\"\n#include \"crc32.c\"\n#include \"base64.c\"\n#include \"http_simple.c\"\n#include \"tls1.2_ticket.c\"\n#include \"verify.c\"\n#include \"auth.c\"\n\nvoid * init_data() {\n    return malloc(1);\n}\n\nobfs * new_obfs() {\n    obfs * self = (obfs*)malloc(sizeof(obfs));\n    self->l_data = NULL;\n    return self;\n}\n\nvoid set_server_info(obfs *self, server_info *server) {\n    memmove(&self->server, server, sizeof(server_info));\n}\n\nvoid get_server_info(obfs *self, server_info *server) {\n    memmove(server, &self->server, sizeof(server_info));\n}\n\nvoid dispose_obfs(obfs *self) {\n    free(self);\n}\n\nobfs_class * new_obfs_class(char *plugin_name)\n{\n    if (plugin_name == NULL)\n        return NULL;\n    if (strcmp(plugin_name, \"origin\") == 0)\n        return NULL;\n    if (strcmp(plugin_name, \"plain\") == 0)\n        return NULL;\n    init_crc32_table();\n    init_shift128plus();\n    if (strcmp(plugin_name, \"http_simple\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = init_data;\n        plugin->new_obfs = http_simple_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = http_simple_dispose;\n\n        plugin->client_encode = http_simple_client_encode;\n        plugin->client_decode = http_simple_client_decode;\n\n        plugin->server_encode = http_simple_server_encode;\n        plugin->server_decode = http_simple_server_decode;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"http_post\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = init_data;\n        plugin->new_obfs = http_simple_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = http_simple_dispose;\n\n        plugin->client_encode = http_post_client_encode;\n        plugin->client_decode = http_simple_client_decode;\n\n        plugin->server_encode = http_simple_server_encode;\n        plugin->server_decode = http_simple_server_decode;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"tls1.2_ticket_auth\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = tls12_ticket_auth_init_data;\n        plugin->new_obfs = tls12_ticket_auth_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = tls12_ticket_auth_dispose;\n\n        plugin->client_encode = tls12_ticket_auth_client_encode;\n        plugin->client_decode = tls12_ticket_auth_client_decode;\n\n        plugin->server_encode = tls12_ticket_auth_server_encode;\n        plugin->server_decode = tls12_ticket_auth_server_decode;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"verify_simple\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = init_data;\n        plugin->new_obfs = verify_simple_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = verify_simple_dispose;\n\n        plugin->client_pre_encrypt = verify_simple_client_pre_encrypt;\n        plugin->client_post_decrypt = verify_simple_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = NULL;\n        plugin->client_udp_post_decrypt = NULL;\n\n        plugin->server_pre_encrypt = verify_simple_server_pre_encrypt;\n        plugin->server_post_decrypt = verify_simple_server_post_decrypt;\n        plugin->server_udp_pre_encrypt = NULL;\n        plugin->server_udp_post_decrypt = NULL;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_simple\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = auth_simple_init_data;\n        plugin->new_obfs = auth_simple_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = auth_simple_dispose;\n\n        plugin->client_pre_encrypt = auth_simple_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_simple_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = NULL;\n        plugin->client_udp_post_decrypt = NULL;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_sha1\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = auth_simple_init_data;\n        plugin->new_obfs = auth_simple_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = auth_simple_dispose;\n\n        plugin->client_pre_encrypt = auth_sha1_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_sha1_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = NULL;\n        plugin->client_udp_post_decrypt = NULL;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_sha1_v2\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = auth_simple_init_data;\n        plugin->new_obfs = auth_simple_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = auth_simple_dispose;\n\n        plugin->client_pre_encrypt = auth_sha1_v2_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_sha1_v2_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = NULL;\n        plugin->client_udp_post_decrypt = NULL;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_sha1_v4\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = auth_simple_init_data;\n        plugin->new_obfs = auth_simple_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = auth_simple_dispose;\n\n        plugin->client_pre_encrypt = auth_sha1_v4_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_sha1_v4_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = NULL;\n        plugin->client_udp_post_decrypt = NULL;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_aes128_md5\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = auth_simple_init_data;\n        plugin->new_obfs = auth_aes128_md5_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = auth_simple_dispose;\n\n        plugin->client_pre_encrypt = auth_aes128_sha1_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_aes128_sha1_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = auth_aes128_sha1_client_udp_pre_encrypt;\n        plugin->client_udp_post_decrypt = auth_aes128_sha1_client_udp_post_decrypt;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_aes128_sha1\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = auth_simple_init_data;\n        plugin->new_obfs = auth_aes128_sha1_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = auth_simple_dispose;\n\n        plugin->client_pre_encrypt = auth_aes128_sha1_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_aes128_sha1_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = auth_aes128_sha1_client_udp_pre_encrypt;\n        plugin->client_udp_post_decrypt = auth_aes128_sha1_client_udp_post_decrypt;\n\n        return plugin;\n    }\n    LOGE(\"Load obfs '%s' failed\", plugin_name);\n    return NULL;\n}\n\nvoid free_obfs_class(obfs_class *plugin) {\n    free(plugin);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/obfs.h",
    "content": "/*\n * obfs.h - Define shadowsocksR server's buffers and callbacks\n *\n * Copyright (C) 2015 - 2016, Break Wa11 <mmgac001@gmail.com>\n */\n\n#ifndef _OBFS_H\n#define _OBFS_H\n\n#include <stdint.h>\n#include <unistd.h>\n\ntypedef struct server_info {\n    char host[64];\n    uint16_t port;\n    char *param;\n    void *g_data;\n    uint8_t *iv;\n    size_t iv_len;\n    uint8_t *recv_iv;\n    size_t recv_iv_len;\n    uint8_t *key;\n    size_t key_len;\n    int head_len;\n    size_t tcp_mss;\n}server_info;\n\ntypedef struct obfs {\n    server_info server;\n    void *l_data;\n}obfs;\n\ntypedef struct obfs_class {\n    void * (*init_data)();\n    obfs * (*new_obfs)();\n    void (*get_server_info)(obfs *self, server_info *server);\n    void (*set_server_info)(obfs *self, server_info *server);\n    void (*dispose)(obfs *self);\n\n    int (*client_pre_encrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*client_encode)(obfs *self,\n            char **pencryptdata,\n            int datalength,\n            size_t* capacity);\n    int (*client_decode)(obfs *self,\n            char **pencryptdata,\n            int datalength,\n            size_t* capacity,\n            int *needsendback);\n    int (*client_post_decrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*client_udp_pre_encrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*client_udp_post_decrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*server_pre_encrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*server_post_decrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*server_udp_pre_encrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*server_udp_post_decrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*server_encode)(obfs *self,\n            char **pencryptdata,\n            int datalength,\n            size_t* capacity);\n    int (*server_decode)(obfs *self,\n            char **pencryptdata,\n            int datalength,\n            size_t* capacity,\n            int *needsendback);\n}obfs_class;\n\nobfs_class * new_obfs_class(char *plugin_name);\nvoid free_obfs_class(obfs_class *plugin);\n\nvoid set_server_info(obfs *self, server_info *server);\nvoid get_server_info(obfs *self, server_info *server);\nobfs * new_obfs();\nvoid dispose_obfs(obfs *self);\n\n#endif // _OBFS_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/obfsutil.c",
    "content": "int get_head_size(char *plaindata, int size, int def_size) {\n    if (plaindata == NULL || size < 2)\n        return def_size;\n    int head_type = plaindata[0] & 0x7;\n    if (head_type == 1)\n        return 7;\n    if (head_type == 4)\n        return 19;\n    if (head_type == 3)\n        return 4 + plaindata[1];\n    return def_size;\n}\n\nstatic int shift128plus_init_flag = 0;\nstatic uint64_t shift128plus_s[2] = {0x10000000, 0xFFFFFFFF};\n\nvoid init_shift128plus(void) {\n    if (shift128plus_init_flag == 0) {\n        shift128plus_init_flag = 1;\n        uint32_t seed = time(NULL);\n        shift128plus_s[0] = seed | 0x100000000L;\n        shift128plus_s[1] = ((uint64_t)seed << 32) | 0x1;\n    }\n}\n\nuint64_t xorshift128plus(void) {\n    uint64_t x = shift128plus_s[0];\n    uint64_t const y = shift128plus_s[1];\n    shift128plus_s[0] = y;\n    x ^= x << 23; // a\n    x ^= x >> 17; // b\n    x ^= y ^ (y >> 26); // c\n    shift128plus_s[1] = x;\n    return x + y;\n}\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/protocol.h",
    "content": "/*\n * Copyright (c) 2014, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef PROTOCOL_H\n#define PROTOCOL_H\n\ntypedef struct protocol {\n    const int default_port;\n    int(*const parse_packet)(const char *, size_t, char **);\n} protocol_t;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/resolv.c",
    "content": "/*\n * Copyright (c) 2014, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <fcntl.h>\n#include <ev.h>\n#include <udns.h>\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#else\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <errno.h>\n#include <unistd.h>\n#endif\n\n#include \"resolv.h\"\n#include \"utils.h\"\n#include \"netutils.h\"\n\n/*\n * Implement DNS resolution interface using libudns\n */\n\nstruct ResolvQuery {\n    void (*client_cb)(struct sockaddr *, void *);\n    void (*client_free_cb)(void *);\n    void *client_cb_data;\n    struct dns_query *queries[2];\n    size_t response_count;\n    struct sockaddr **responses;\n    uint16_t port;\n};\n\nextern int verbose;\n\nstatic struct ev_io resolv_io_watcher;\nstatic struct ev_timer resolv_timeout_watcher;\nstatic const int MODE_IPV4_ONLY  = 0;\nstatic const int MODE_IPV6_ONLY  = 1;\nstatic const int MODE_IPV4_FIRST = 2;\nstatic const int MODE_IPV6_FIRST = 3;\nstatic int resolv_mode           = 0;\n\nstatic void resolv_sock_cb(struct ev_loop *, struct ev_io *, int);\nstatic void resolv_timeout_cb(struct ev_loop *, struct ev_timer *, int);\nstatic void dns_query_v4_cb(struct dns_ctx *, struct dns_rr_a4 *, void *);\nstatic void dns_query_v6_cb(struct dns_ctx *, struct dns_rr_a6 *, void *);\nstatic void dns_timer_setup_cb(struct dns_ctx *, int, void *);\nstatic void process_client_callback(struct ResolvQuery *);\nstatic inline int all_queries_are_null(struct ResolvQuery *);\nstatic struct sockaddr *choose_ipv4_first(struct ResolvQuery *);\nstatic struct sockaddr *choose_ipv6_first(struct ResolvQuery *);\nstatic struct sockaddr *choose_any(struct ResolvQuery *);\n\nint\nresolv_init(struct ev_loop *loop, char **nameservers, int nameserver_num, int ipv6first)\n{\n    if (ipv6first)\n        resolv_mode = MODE_IPV6_FIRST;\n    else\n        resolv_mode = MODE_IPV4_FIRST;\n\n    struct dns_ctx *ctx = &dns_defctx;\n    if (nameservers == NULL) {\n        /* Nameservers not specified, use system resolver config */\n        dns_init(ctx, 0);\n    } else {\n        dns_reset(ctx);\n\n        for (int i = 0; i < nameserver_num; i++) {\n            char *server = nameservers[i];\n            dns_add_serv(ctx, server);\n        }\n    }\n\n    int sockfd = dns_open(ctx);\n    if (sockfd < 0) {\n        FATAL(\"Failed to open DNS resolver socket\");\n    }\n\n    if (nameserver_num == 1 && nameservers != NULL) {\n        if (strncmp(\"127.0.0.1\", nameservers[0], 9) == 0\n            || strncmp(\"::1\", nameservers[0], 3) == 0) {\n            if (verbose) {\n                LOGI(\"bind UDP resolver to %s\", nameservers[0]);\n            }\n            if (bind_to_address(sockfd, nameservers[0]) == -1)\n                ERROR(\"bind_to_address\");\n        }\n    }\n\n#ifdef __MINGW32__\n    setnonblocking(sockfd);\n#else\n    int flags = fcntl(sockfd, F_GETFL, 0);\n    fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);\n#endif\n\n    ev_io_init(&resolv_io_watcher, resolv_sock_cb, sockfd, EV_READ);\n    resolv_io_watcher.data = ctx;\n\n    ev_io_start(loop, &resolv_io_watcher);\n\n    ev_timer_init(&resolv_timeout_watcher, resolv_timeout_cb, 0.0, 0.0);\n    resolv_timeout_watcher.data = ctx;\n\n    dns_set_tmcbck(ctx, dns_timer_setup_cb, loop);\n\n    return sockfd;\n}\n\nvoid\nresolv_shutdown(struct ev_loop *loop)\n{\n    struct dns_ctx *ctx = (struct dns_ctx *)resolv_io_watcher.data;\n\n    ev_io_stop(loop, &resolv_io_watcher);\n\n    if (ev_is_active(&resolv_timeout_watcher)) {\n        ev_timer_stop(loop, &resolv_timeout_watcher);\n    }\n\n    dns_close(ctx);\n}\n\nstruct ResolvQuery *\nresolv_query(const char *hostname, void (*client_cb)(struct sockaddr *, void *),\n             void (*client_free_cb)(void *), void *client_cb_data,\n             uint16_t port)\n{\n    struct dns_ctx *ctx = (struct dns_ctx *)resolv_io_watcher.data;\n\n    /*\n     * Wrap udns's call back in our own\n     */\n    struct ResolvQuery *cb_data = ss_malloc(sizeof(struct ResolvQuery));\n    if (cb_data == NULL) {\n        LOGE(\"Failed to allocate memory for DNS query callback data.\");\n        return NULL;\n    }\n    memset(cb_data, 0, sizeof(struct ResolvQuery));\n\n    cb_data->client_cb      = client_cb;\n    cb_data->client_free_cb = client_free_cb;\n    cb_data->client_cb_data = client_cb_data;\n    memset(cb_data->queries, 0, sizeof(cb_data->queries));\n    cb_data->response_count = 0;\n    cb_data->responses      = NULL;\n    cb_data->port           = port;\n\n    /* Submit A and AAAA queries */\n    if (resolv_mode != MODE_IPV6_ONLY) {\n        cb_data->queries[0] = dns_submit_a4(ctx,\n                                            hostname, 0,\n                                            dns_query_v4_cb, cb_data);\n        if (cb_data->queries[0] == NULL) {\n            LOGE(\"Failed to submit DNS query: %s\",\n                 dns_strerror(dns_status(ctx)));\n        }\n    }\n\n    if (resolv_mode != MODE_IPV4_ONLY) {\n        cb_data->queries[1] = dns_submit_a6(ctx,\n                                            hostname, 0,\n                                            dns_query_v6_cb, cb_data);\n        if (cb_data->queries[1] == NULL) {\n            LOGE(\"Failed to submit DNS query: %s\",\n                 dns_strerror(dns_status(ctx)));\n        }\n    }\n\n    if (all_queries_are_null(cb_data)) {\n        if (cb_data->client_free_cb != NULL) {\n            cb_data->client_free_cb(cb_data->client_cb_data);\n        }\n        ss_free(cb_data);\n    }\n\n    return cb_data;\n}\n\nvoid\nresolv_cancel(struct ResolvQuery *query_handle)\n{\n    struct ResolvQuery *cb_data = (struct ResolvQuery *)query_handle;\n    struct dns_ctx *ctx         = (struct dns_ctx *)resolv_io_watcher.data;\n\n    for (int i = 0; i < sizeof(cb_data->queries) / sizeof(cb_data->queries[0]);\n         i++)\n        if (cb_data->queries[i] != NULL) {\n            dns_cancel(ctx, cb_data->queries[i]);\n            ss_free(cb_data->queries[i]);\n        }\n\n    if (cb_data->client_free_cb != NULL) {\n        cb_data->client_free_cb(cb_data->client_cb_data);\n    }\n\n    ss_free(cb_data);\n}\n\n/*\n * DNS UDP socket activity callback\n */\nstatic void\nresolv_sock_cb(struct ev_loop *loop, struct ev_io *w, int revents)\n{\n    struct dns_ctx *ctx = (struct dns_ctx *)w->data;\n\n    if (revents & EV_READ) {\n        dns_ioevent(ctx, ev_now(loop));\n    }\n}\n\n/*\n * Wrapper for client callback we provide to udns\n */\nstatic void\ndns_query_v4_cb(struct dns_ctx *ctx, struct dns_rr_a4 *result, void *data)\n{\n    struct ResolvQuery *cb_data = (struct ResolvQuery *)data;\n\n    if (result == NULL) {\n        if (verbose) {\n            LOGI(\"IPv4 resolv: %s\", dns_strerror(dns_status(ctx)));\n        }\n    } else if (result->dnsa4_nrr > 0) {\n        struct sockaddr **new_responses = ss_realloc(cb_data->responses,\n                                                     (cb_data->response_count +\n                                                      result->dnsa4_nrr) *\n                                                     sizeof(struct sockaddr *));\n        if (new_responses == NULL) {\n            LOGE(\"Failed to allocate memory for additional DNS responses\");\n        } else {\n            cb_data->responses = new_responses;\n\n            for (int i = 0; i < result->dnsa4_nrr; i++) {\n                struct sockaddr_in *sa =\n                    (struct sockaddr_in *)ss_malloc(sizeof(struct sockaddr_in));\n                sa->sin_family = AF_INET;\n                sa->sin_port   = cb_data->port;\n                sa->sin_addr   = result->dnsa4_addr[i];\n\n                cb_data->responses[cb_data->response_count] =\n                    (struct sockaddr *)sa;\n                if (cb_data->responses[cb_data->response_count] == NULL) {\n                    LOGE(\n                        \"Failed to allocate memory for DNS query result address\");\n                } else {\n                    cb_data->response_count++;\n                }\n            }\n        }\n    }\n\n    ss_free(result);\n    cb_data->queries[0] = NULL; /* mark A query as being completed */\n\n    /* Once all queries have completed, call client callback */\n    if (all_queries_are_null(cb_data)) {\n        return process_client_callback(cb_data);\n    }\n}\n\nstatic void\ndns_query_v6_cb(struct dns_ctx *ctx, struct dns_rr_a6 *result, void *data)\n{\n    struct ResolvQuery *cb_data = (struct ResolvQuery *)data;\n\n    if (result == NULL) {\n        if (verbose) {\n            LOGI(\"IPv6 resolv: %s\", dns_strerror(dns_status(ctx)));\n        }\n    } else if (result->dnsa6_nrr > 0) {\n        struct sockaddr **new_responses = ss_realloc(cb_data->responses,\n                                                     (cb_data->response_count +\n                                                      result->dnsa6_nrr) *\n                                                     sizeof(struct sockaddr *));\n        if (new_responses == NULL) {\n            LOGE(\"Failed to allocate memory for additional DNS responses\");\n        } else {\n            cb_data->responses = new_responses;\n\n            for (int i = 0; i < result->dnsa6_nrr; i++) {\n                struct sockaddr_in6 *sa =\n                    (struct sockaddr_in6 *)ss_malloc(sizeof(struct sockaddr_in6));\n                sa->sin6_family = AF_INET6;\n                sa->sin6_port   = cb_data->port;\n                sa->sin6_addr   = result->dnsa6_addr[i];\n\n                cb_data->responses[cb_data->response_count] =\n                    (struct sockaddr *)sa;\n                if (cb_data->responses[cb_data->response_count] == NULL) {\n                    LOGE(\n                        \"Failed to allocate memory for DNS query result address\");\n                } else {\n                    cb_data->response_count++;\n                }\n            }\n        }\n    }\n\n    ss_free(result);\n    cb_data->queries[1] = NULL; /* mark AAAA query as being completed */\n\n    /* Once all queries have completed, call client callback */\n    if (all_queries_are_null(cb_data)) {\n        return process_client_callback(cb_data);\n    }\n}\n\n/*\n * Called once all queries have been completed\n */\nstatic void\nprocess_client_callback(struct ResolvQuery *cb_data)\n{\n    struct sockaddr *best_address = NULL;\n\n    if (resolv_mode == MODE_IPV4_FIRST) {\n        best_address = choose_ipv4_first(cb_data);\n    } else if (resolv_mode == MODE_IPV6_FIRST) {\n        best_address = choose_ipv6_first(cb_data);\n    } else {\n        best_address = choose_any(cb_data);\n    }\n\n    cb_data->client_cb(best_address, cb_data->client_cb_data);\n\n    for (int i = 0; i < cb_data->response_count; i++)\n        ss_free(cb_data->responses[i]);\n\n    ss_free(cb_data->responses);\n    if (cb_data->client_free_cb != NULL) {\n        cb_data->client_free_cb(cb_data->client_cb_data);\n    }\n    ss_free(cb_data);\n}\n\nstatic struct sockaddr *\nchoose_ipv4_first(struct ResolvQuery *cb_data)\n{\n    for (int i = 0; i < cb_data->response_count; i++)\n        if (cb_data->responses[i]->sa_family == AF_INET) {\n            return cb_data->responses[i];\n        }\n\n    return choose_any(cb_data);\n}\n\nstatic struct sockaddr *\nchoose_ipv6_first(struct ResolvQuery *cb_data)\n{\n    for (int i = 0; i < cb_data->response_count; i++)\n        if (cb_data->responses[i]->sa_family == AF_INET6) {\n            return cb_data->responses[i];\n        }\n\n    return choose_any(cb_data);\n}\n\nstatic struct sockaddr *\nchoose_any(struct ResolvQuery *cb_data)\n{\n    if (cb_data->response_count >= 1) {\n        return cb_data->responses[0];\n    }\n\n    return NULL;\n}\n\n/*\n * DNS timeout callback\n */\nstatic void\nresolv_timeout_cb(struct ev_loop *loop, struct ev_timer *w, int revents)\n{\n    struct dns_ctx *ctx = (struct dns_ctx *)w->data;\n\n    if (revents & EV_TIMER) {\n        dns_timeouts(ctx, 30, ev_now(loop));\n    }\n}\n\n/*\n * Callback to setup DNS timeout callback\n */\nstatic void\ndns_timer_setup_cb(struct dns_ctx *ctx, int timeout, void *data)\n{\n    struct ev_loop *loop = (struct ev_loop *)data;\n\n    if (ev_is_active(&resolv_timeout_watcher)) {\n        ev_timer_stop(loop, &resolv_timeout_watcher);\n    }\n\n    if (ctx != NULL && timeout >= 0) {\n        ev_timer_set(&resolv_timeout_watcher, timeout, 0.0);\n        ev_timer_start(loop, &resolv_timeout_watcher);\n    }\n}\n\nstatic inline int\nall_queries_are_null(struct ResolvQuery *cb_data)\n{\n    int result = 1;\n\n    for (int i = 0; i < sizeof(cb_data->queries) / sizeof(cb_data->queries[0]);\n         i++)\n        result = result && cb_data->queries[i] == NULL;\n\n    return result;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/resolv.h",
    "content": "/*\n * Copyright (c) 2014, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef RESOLV_H\n#define RESOLV_H\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdint.h>\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#else\n#include <sys/socket.h>\n#endif\n\nstruct ResolvQuery;\n\nint resolv_init(struct ev_loop *, char **, int, int);\nstruct ResolvQuery *resolv_query(const char *, void (*)(struct sockaddr *,\n                                                        void *), void (*)(\n                                     void *), void *, uint16_t);\nvoid resolv_cancel(struct ResolvQuery *);\nvoid resolv_shutdown(struct ev_loop *);\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/rule.c",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * Copyright (c) 2011 Manuel Kasper <mk@neon1.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <string.h>\n\n#ifdef __MINGW32__\nextern void ss_error(const char *s);\n#endif\n\n#include \"rule.h\"\n#include \"utils.h\"\n\nstatic void free_rule(rule_t *);\n\nrule_t *\nnew_rule()\n{\n    rule_t *rule;\n\n    rule = calloc(1, sizeof(rule_t));\n    if (rule == NULL) {\n        ERROR(\"malloc\");\n        return NULL;\n    }\n\n    return rule;\n}\n\nint\naccept_rule_arg(rule_t *rule, const char *arg)\n{\n    if (rule->pattern == NULL) {\n        rule->pattern = strdup(arg);\n        if (rule->pattern == NULL) {\n            ERROR(\"strdup failed\");\n            return -1;\n        }\n    } else {\n        LOGE(\"Unexpected table rule argument: %s\", arg);\n        return -1;\n    }\n\n    return 1;\n}\n\nvoid\nadd_rule(struct cork_dllist *rules, rule_t *rule)\n{\n    cork_dllist_add(rules, &rule->entries);\n}\n\nint\ninit_rule(rule_t *rule)\n{\n    if (rule->pattern_re == NULL) {\n        int errornumber;\n        PCRE2_SIZE erroroffset;\n        rule->pattern_re = pcre2_compile(\n            (PCRE2_SPTR)rule->pattern,   /* the pattern */\n            PCRE2_ZERO_TERMINATED,       /* indicates pattern is zero-terminated */\n            0,                           /* default options */\n            &errornumber,                /* for error number */\n            &erroroffset,                /* for error offset */\n            NULL);                       /* use default compile context */\n\n        if (rule->pattern_re == NULL) {\n            PCRE2_UCHAR errbuffer[512];\n            pcre2_get_error_message(errornumber, errbuffer, sizeof(errbuffer));\n            LOGE(\"PCRE2 regex compilation failed at offset %d: %s\\n\", (int)erroroffset,\n                 errbuffer);\n            return 0;\n        }\n\n        rule->pattern_re_match_data = pcre2_match_data_create_from_pattern(rule->pattern_re, NULL);\n\n        if (rule->pattern_re_match_data == NULL) {\n            ERROR(\"PCRE2: the memory for the block could not be obtained\");\n            return 0;\n        }\n    }\n\n    return 1;\n}\n\nrule_t *\nlookup_rule(const struct cork_dllist *rules, const char *name, size_t name_len)\n{\n    struct cork_dllist_item *curr, *next;\n\n    if (name == NULL) {\n        name     = \"\";\n        name_len = 0;\n    }\n\n    cork_dllist_foreach_void(rules, curr, next) {\n        rule_t *rule = cork_container_of(curr, rule_t, entries);\n        if (pcre2_match(\n                rule->pattern_re,            /* the compiled pattern */\n                (PCRE2_SPTR)name,            /* the subject string */\n                name_len,                    /* the length of the subject */\n                0,                           /* start at offset 0 in the subject */\n                0,                           /* default options */\n                rule->pattern_re_match_data, /* block for storing the result */\n                NULL                         /* use default match context */\n                ) >= 0)\n            return rule;\n    }\n\n    return NULL;\n}\n\nvoid\nremove_rule(rule_t *rule)\n{\n    cork_dllist_remove(&rule->entries);\n    free_rule(rule);\n}\n\nstatic void\nfree_rule(rule_t *rule)\n{\n    if (rule == NULL)\n        return;\n\n    ss_free(rule->pattern);\n    if (rule->pattern_re != NULL) {\n        pcre2_code_free(rule->pattern_re);                    /* data and the compiled pattern. */\n        rule->pattern_re            = NULL;\n    }\n    if (rule->pattern_re_match_data != NULL) {\n        pcre2_match_data_free(rule->pattern_re_match_data);   /* Release memory used for the match */\n        rule->pattern_re_match_data = NULL;\n    }\n    ss_free(rule);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/rule.h",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * Copyright (c) 2011 Manuel Kasper <mk@neon1.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef RULE_H\n#define RULE_H\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <libcork/ds.h>\n\n/*\n * The PCRE2_CODE_UNIT_WIDTH macro must be defined before including pcre2.h.\n * For a program that uses only one code unit width, setting it to 8, 16, or 32\n * makes it possible to use generic function names such as pcre2_compile(). Note\n * that just changing 8 to 16 (for example) is not sufficient to convert this\n * program to process 16-bit characters. Even in a fully 16-bit environment, where\n * string-handling functions such as strcmp() and printf() work with 16-bit\n * characters, the code for handling the table of named substrings will still need\n * to be modified.\n */\n/* we only need to support ASCII chartable, thus set it to 8 */\n#define PCRE2_CODE_UNIT_WIDTH 8\n\n#include <pcre2.h>\n\ntypedef struct rule {\n    char *pattern;\n\n    /* Runtime fields */\n    pcre2_code *pattern_re;\n    pcre2_match_data *pattern_re_match_data;\n\n    struct cork_dllist_item entries;\n} rule_t;\n\nvoid add_rule(struct cork_dllist *, rule_t *);\nint init_rule(rule_t *);\nrule_t *lookup_rule(const struct cork_dllist *, const char *, size_t);\nvoid remove_rule(rule_t *);\nrule_t *new_rule();\nint accept_rule_arg(rule_t *, const char *);\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/server.c",
    "content": "/*\n * server.c - Provide shadowsocks service\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <fcntl.h>\n#include <locale.h>\n#include <signal.h>\n#include <string.h>\n#include <strings.h>\n#include <time.h>\n#include <unistd.h>\n#include <getopt.h>\n#include <math.h>\n\n#ifndef __MINGW32__\n#include <netdb.h>\n#include <errno.h>\n#include <arpa/inet.h>\n#include <netinet/in.h>\n#include <pthread.h>\n#include <sys/un.h>\n#endif\n\n#include <libcork/core.h>\n#include <udns.h>\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#endif\n\n#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_NET_IF_H) && defined(__linux__)\n#include <net/if.h>\n#include <sys/ioctl.h>\n#define SET_INTERFACE\n#endif\n\n#include \"netutils.h\"\n#include \"utils.h\"\n#include \"acl.h\"\n#include \"server.h\"\n\n#include \"obfs.c\" // I don't want to modify makefile\n\n#ifndef EAGAIN\n#define EAGAIN EWOULDBLOCK\n#endif\n\n#ifndef EWOULDBLOCK\n#define EWOULDBLOCK EAGAIN\n#endif\n\n#ifndef BUF_SIZE\n#define BUF_SIZE 2048\n#endif\n\n#ifndef SSMAXCONN\n#define SSMAXCONN 1024\n#endif\n\n#ifndef UPDATE_INTERVAL\n#define UPDATE_INTERVAL 30\n#endif\n\nstatic void signal_cb(EV_P_ ev_signal *w, int revents);\nstatic void accept_cb(EV_P_ ev_io *w, int revents);\nstatic void server_send_cb(EV_P_ ev_io *w, int revents);\nstatic void server_recv_cb(EV_P_ ev_io *w, int revents);\nstatic void remote_recv_cb(EV_P_ ev_io *w, int revents);\nstatic void remote_send_cb(EV_P_ ev_io *w, int revents);\nstatic void server_timeout_cb(EV_P_ ev_timer *watcher, int revents);\nstatic void block_list_clear_cb(EV_P_ ev_timer *watcher, int revents);\n\nstatic remote_t *new_remote(int fd);\nstatic server_t *new_server(int fd, listen_ctx_t *listener);\nstatic remote_t *connect_to_remote(EV_P_ struct addrinfo *res,\n                                   server_t *server);\n\nstatic void free_remote(remote_t *remote);\nstatic void close_and_free_remote(EV_P_ remote_t *remote);\nstatic void free_server(server_t *server);\nstatic void close_and_free_server(EV_P_ server_t *server);\nstatic void server_resolve_cb(struct sockaddr *addr, void *data);\nstatic void query_free_cb(void *data);\n\nstatic size_t parse_header_len(const char atyp, const char *data, size_t offset);\nstatic int is_header_complete(const buffer_t *buf);\n\nint verbose = 0;\n\nstatic int acl       = 0;\nstatic int mode      = TCP_ONLY;\nstatic int auth      = 0;\nstatic int ipv6first = 0;\n\nstatic int protocol_compatible = 0;//SSR\nstatic int obfs_compatible = 0;//SSR\n\nstatic int fast_open = 0;\n#ifdef HAVE_SETRLIMIT\nstatic int nofile = 0;\n#endif\nstatic int remote_conn = 0;\nstatic int server_conn = 0;\n\nstatic char *bind_address    = NULL;\nstatic char *server_port     = NULL;\nstatic char *manager_address = NULL;\nuint64_t tx                  = 0;\nuint64_t rx                  = 0;\nev_timer stat_update_watcher;\nev_timer block_list_watcher;\n\nstatic struct cork_dllist connections;\n\nstatic void\nstat_update_cb(EV_P_ ev_timer *watcher, int revents)\n{\n    struct sockaddr_un svaddr, claddr;\n    int sfd = -1;\n    size_t msgLen;\n    char resp[BUF_SIZE];\n\n    if (verbose) {\n        LOGI(\"update traffic stat: tx: %\" PRIu64 \" rx: %\" PRIu64 \"\", tx, rx);\n    }\n\n    snprintf(resp, BUF_SIZE, \"stat: {\\\"%s\\\":%\" PRIu64 \"}\", server_port, tx + rx);\n    msgLen = strlen(resp) + 1;\n\n    ss_addr_t ip_addr = { .host = NULL, .port = NULL };\n    parse_addr(manager_address, &ip_addr);\n\n    if (ip_addr.host == NULL || ip_addr.port == NULL) {\n        sfd = socket(AF_UNIX, SOCK_DGRAM, 0);\n        if (sfd == -1) {\n            ERROR(\"stat_socket\");\n            return;\n        }\n\n        memset(&claddr, 0, sizeof(struct sockaddr_un));\n        claddr.sun_family = AF_UNIX;\n        snprintf(claddr.sun_path, sizeof(claddr.sun_path), \"/tmp/shadowsocks.%s\", server_port);\n\n        unlink(claddr.sun_path);\n\n        if (bind(sfd, (struct sockaddr *)&claddr, sizeof(struct sockaddr_un)) == -1) {\n            ERROR(\"stat_bind\");\n            close(sfd);\n            return;\n        }\n\n        memset(&svaddr, 0, sizeof(struct sockaddr_un));\n        svaddr.sun_family = AF_UNIX;\n        strncpy(svaddr.sun_path, manager_address, sizeof(svaddr.sun_path) - 1);\n\n        if (sendto(sfd, resp, strlen(resp) + 1, 0, (struct sockaddr *)&svaddr,\n                   sizeof(struct sockaddr_un)) != msgLen) {\n            ERROR(\"stat_sendto\");\n            close(sfd);\n            return;\n        }\n\n        unlink(claddr.sun_path);\n    } else {\n        struct sockaddr_storage storage;\n        memset(&storage, 0, sizeof(struct sockaddr_storage));\n        if (get_sockaddr(ip_addr.host, ip_addr.port, &storage, 0, ipv6first) == -1) {\n            ERROR(\"failed to parse the manager addr\");\n            return;\n        }\n\n        sfd = socket(storage.ss_family, SOCK_DGRAM, 0);\n\n        if (sfd == -1) {\n            ERROR(\"stat_socket\");\n            return;\n        }\n\n        size_t addr_len = get_sockaddr_len((struct sockaddr *)&storage);\n        if (sendto(sfd, resp, strlen(resp) + 1, 0, (struct sockaddr *)&storage,\n                   addr_len) != msgLen) {\n            ERROR(\"stat_sendto\");\n            close(sfd);\n            return;\n        }\n    }\n\n    close(sfd);\n}\n\nstatic void\nfree_connections(struct ev_loop *loop)\n{\n    struct cork_dllist_item *curr, *next;\n    cork_dllist_foreach_void(&connections, curr, next) {\n        server_t *server = cork_container_of(curr, server_t, entries);\n        remote_t *remote = server->remote;\n        close_and_free_server(loop, server);\n        close_and_free_remote(loop, remote);\n    }\n}\n\nstatic size_t\nparse_header_len(const char atyp, const char *data, size_t offset)\n{\n    size_t len = 0;\n    if ((atyp & ADDRTYPE_MASK) == 1) {\n        // IP V4\n        len += sizeof(struct in_addr);\n    } else if ((atyp & ADDRTYPE_MASK) == 3) {\n        // Domain name\n        uint8_t name_len = *(uint8_t *)(data + offset);\n        len += name_len + 1;\n    } else if ((atyp & ADDRTYPE_MASK) == 4) {\n        // IP V6\n        len += sizeof(struct in6_addr);\n    } else {\n        return 0;\n    }\n    len += 2;\n    return len;\n}\n\nstatic int\nis_header_complete(const buffer_t *buf)\n{\n    size_t header_len = 0;\n    size_t buf_len    = buf->len;\n\n    char atyp = buf->array[header_len];\n\n    // 1 byte for atyp\n    header_len++;\n\n    if ((atyp & ADDRTYPE_MASK) == 1) {\n        // IP V4\n        header_len += sizeof(struct in_addr);\n    } else if ((atyp & ADDRTYPE_MASK) == 3) {\n        // Domain name\n        // domain len + len of domain\n        if (buf_len < header_len + 1)\n            return 0;\n        uint8_t name_len = *(uint8_t *)(buf->array + header_len);\n        header_len += name_len + 1;\n    } else if ((atyp & ADDRTYPE_MASK) == 4) {\n        // IP V6\n        header_len += sizeof(struct in6_addr);\n    } else {\n        return -1;\n    }\n\n    // len of port\n    header_len += 2;\n\n    // size of ONETIMEAUTH_BYTES\n    if (auth || (atyp & ONETIMEAUTH_FLAG)) {\n        header_len += ONETIMEAUTH_BYTES;\n    }\n\n    return buf_len >= header_len ? 1 : 0;\n}\n\nstatic char *\nget_peer_name(int fd)\n{\n    static char peer_name[INET6_ADDRSTRLEN] = { 0 };\n    struct sockaddr_storage addr;\n    socklen_t len = sizeof(struct sockaddr_storage);\n    memset(&addr, 0, len);\n    memset(peer_name, 0, INET6_ADDRSTRLEN);\n    int err = getpeername(fd, (struct sockaddr *)&addr, &len);\n    if (err == 0) {\n        if (addr.ss_family == AF_INET) {\n            struct sockaddr_in *s = (struct sockaddr_in *)&addr;\n            dns_ntop(AF_INET, &s->sin_addr, peer_name, INET_ADDRSTRLEN);\n        } else if (addr.ss_family == AF_INET6) {\n            struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;\n            dns_ntop(AF_INET6, &s->sin6_addr, peer_name, INET6_ADDRSTRLEN);\n        }\n    } else {\n        return NULL;\n    }\n    return peer_name;\n}\n\n#ifdef __linux__\nstatic void\nset_linger(int fd)\n{\n    struct linger so_linger;\n    memset(&so_linger, 0, sizeof(struct linger));\n    so_linger.l_onoff  = 1;\n    so_linger.l_linger = 0;\n    setsockopt(fd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof so_linger);\n}\n#endif\n\nstatic void\nreset_addr(int fd)\n{\n    char *peer_name;\n    peer_name = get_peer_name(fd);\n    if (peer_name != NULL) {\n        remove_from_block_list(peer_name);\n    }\n}\n\nstatic void\nreport_addr(int fd, int err_level)\n{\n#ifdef __linux__\n    set_linger(fd);\n#endif\n\n    char *peer_name;\n    peer_name = get_peer_name(fd);\n    if (peer_name != NULL) {\n        LOGE(\"failed to handshake with %s\", peer_name);\n        update_block_list(peer_name, err_level);\n    }\n}\n\nint\nsetfastopen(int fd)\n{\n    int s = 0;\n#ifdef TCP_FASTOPEN\n    if (fast_open) {\n#ifdef __APPLE__\n        int opt = 1;\n#else\n        int opt = 5;\n#endif\n        s = setsockopt(fd, IPPROTO_TCP, TCP_FASTOPEN, &opt, sizeof(opt));\n\n        if (s == -1) {\n            if (errno == EPROTONOSUPPORT || errno == ENOPROTOOPT) {\n                LOGE(\"fast open is not supported on this platform\");\n                fast_open = 0;\n            } else {\n                ERROR(\"setsockopt\");\n            }\n        }\n    }\n#endif\n    return s;\n}\n\n#ifndef __MINGW32__\nint\nsetnonblocking(int fd)\n{\n    int flags;\n    if (-1 == (flags = fcntl(fd, F_GETFL, 0))) {\n        flags = 0;\n    }\n    return fcntl(fd, F_SETFL, flags | O_NONBLOCK);\n}\n\n#endif\n\nint\ncreate_and_bind(const char *host, const char *port, int mptcp)\n{\n    struct addrinfo hints;\n    struct addrinfo *result, *rp, *ipv4v6bindall;\n    int s, listen_sock;\n\n    memset(&hints, 0, sizeof(struct addrinfo));\n    hints.ai_family   = AF_UNSPEC;               /* Return IPv4 and IPv6 choices */\n    hints.ai_socktype = SOCK_STREAM;             /* We want a TCP socket */\n    hints.ai_flags    = AI_PASSIVE | AI_ADDRCONFIG; /* For wildcard IP address */\n    hints.ai_protocol = IPPROTO_TCP;\n\n    for (int i = 1; i < 8; i++) {\n        s = getaddrinfo(host, port, &hints, &result);\n        if (s == 0) {\n            break;\n        } else {\n            sleep(pow(2, i));\n            LOGE(\"failed to resolve server name, wait %.0f seconds\", pow(2, i));\n        }\n    }\n\n    if (s != 0) {\n        LOGE(\"getaddrinfo: %s\", gai_strerror(s));\n        return -1;\n    }\n\n    rp = result;\n\n    /*\n     * On Linux, with net.ipv6.bindv6only = 0 (the default), getaddrinfo(NULL) with\n     * AI_PASSIVE returns 0.0.0.0 and :: (in this order). AI_PASSIVE was meant to\n     * return a list of addresses to listen on, but it is impossible to listen on\n     * 0.0.0.0 and :: at the same time, if :: implies dualstack mode.\n     */\n    if (!host) {\n        ipv4v6bindall = result;\n\n        /* Loop over all address infos found until a IPV6 address is found. */\n        while (ipv4v6bindall) {\n            if (ipv4v6bindall->ai_family == AF_INET6) {\n                rp = ipv4v6bindall; /* Take first IPV6 address available */\n                break;\n            }\n            ipv4v6bindall = ipv4v6bindall->ai_next; /* Get next address info, if any */\n        }\n    }\n\n    for (/*rp = result*/; rp != NULL; rp = rp->ai_next) {\n        listen_sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);\n        if (listen_sock == -1) {\n            continue;\n        }\n\n        if (rp->ai_family == AF_INET6) {\n            int ipv6only = host ? 1 : 0;\n            setsockopt(listen_sock, IPPROTO_IPV6, IPV6_V6ONLY, &ipv6only, sizeof(ipv6only));\n        }\n\n        int opt = 1;\n        setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));\n#ifdef SO_NOSIGPIPE\n        setsockopt(listen_sock, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n#endif\n        int err = set_reuseport(listen_sock);\n        if (err == 0) {\n            LOGI(\"tcp port reuse enabled\");\n        }\n\n        if (mptcp == 1) {\n            int err = setsockopt(listen_sock, SOL_TCP, MPTCP_ENABLED, &opt, sizeof(opt));\n            if (err == -1) {\n                ERROR(\"failed to enable multipath TCP\");\n            }\n        }\n\n        s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);\n        if (s == 0) {\n            /* We managed to bind successfully! */\n            break;\n        } else {\n            ERROR(\"bind\");\n        }\n\n        close(listen_sock);\n    }\n\n    if (rp == NULL) {\n        LOGE(\"Could not bind\");\n        return -1;\n    }\n\n    freeaddrinfo(result);\n\n    return listen_sock;\n}\n\nstatic remote_t *\nconnect_to_remote(EV_P_ struct addrinfo *res,\n                  server_t *server)\n{\n    int sockfd;\n#ifdef SET_INTERFACE\n    const char *iface = server->listen_ctx->iface;\n#endif\n\n    if (acl) {\n        char ipstr[INET6_ADDRSTRLEN];\n        memset(ipstr, 0, INET6_ADDRSTRLEN);\n\n        if (res->ai_addr->sa_family == AF_INET) {\n            struct sockaddr_in *s = (struct sockaddr_in *)res->ai_addr;\n            dns_ntop(AF_INET, &s->sin_addr, ipstr, INET_ADDRSTRLEN);\n        } else if (res->ai_addr->sa_family == AF_INET6) {\n            struct sockaddr_in6 *s = (struct sockaddr_in6 *)res->ai_addr;\n            dns_ntop(AF_INET6, &s->sin6_addr, ipstr, INET6_ADDRSTRLEN);\n        }\n\n        if (outbound_block_match_host(ipstr) == 1) {\n            if (verbose)\n                LOGI(\"outbound blocked %s\", ipstr);\n            return NULL;\n        }\n    }\n\n    // initialize remote socks\n    sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);\n    if (sockfd == -1) {\n        ERROR(\"socket\");\n        close(sockfd);\n        return NULL;\n    }\n\n    int opt = 1;\n    setsockopt(sockfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\n#ifdef SO_NOSIGPIPE\n    setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n#endif\n    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));\n\n    // setup remote socks\n\n    if (setnonblocking(sockfd) == -1)\n        ERROR(\"setnonblocking\");\n\n    if (bind_address != NULL)\n        if (bind_to_address(sockfd, bind_address) == -1) {\n            ERROR(\"bind_to_address\");\n            close(sockfd);\n            return NULL;\n        }\n\n#ifdef SET_INTERFACE\n    if (iface) {\n        if (setinterface(sockfd, iface) == -1) {\n            ERROR(\"setinterface\");\n            close(sockfd);\n            return NULL;\n        }\n    }\n#endif\n\n    remote_t *remote = new_remote(sockfd);\n\n#ifdef TCP_FASTOPEN\n    if (fast_open) {\n#ifdef __APPLE__\n        ((struct sockaddr_in *)(res->ai_addr))->sin_len = sizeof(struct sockaddr_in);\n        sa_endpoints_t endpoints;\n        memset((char *)&endpoints, 0, sizeof(endpoints));\n        endpoints.sae_dstaddr    = res->ai_addr;\n        endpoints.sae_dstaddrlen = res->ai_addrlen;\n\n        struct iovec iov;\n        iov.iov_base = server->buf->array + server->buf->idx;\n        iov.iov_len  = server->buf->len;\n        size_t len;\n        int s = connectx(sockfd, &endpoints, SAE_ASSOCID_ANY, CONNECT_DATA_IDEMPOTENT,\n                         &iov, 1, &len, NULL);\n        if (s == 0) {\n            s = len;\n        }\n#else\n        ssize_t s = sendto(sockfd, server->buf->array + server->buf->idx,\n                           server->buf->len, MSG_FASTOPEN, res->ai_addr,\n                           res->ai_addrlen);\n#endif\n        if (s == -1) {\n            if (errno == CONNECT_IN_PROGRESS || errno == EAGAIN\n                || errno == EWOULDBLOCK) {\n                // The remote server doesn't support tfo or it's the first connection to the server.\n                // It will automatically fall back to conventional TCP.\n            } else if (errno == EOPNOTSUPP || errno == EPROTONOSUPPORT ||\n                       errno == ENOPROTOOPT) {\n                // Disable fast open as it's not supported\n                fast_open = 0;\n                LOGE(\"fast open is not supported on this platform\");\n            } else {\n                ERROR(\"sendto\");\n            }\n        } else if (s <= server->buf->len) {\n            server->buf->idx += s;\n            server->buf->len -= s;\n        } else {\n            server->buf->idx = 0;\n            server->buf->len = 0;\n        }\n    }\n#endif\n\n    if (!fast_open) {\n        int r = connect(sockfd, res->ai_addr, res->ai_addrlen);\n\n        if (r == -1 && errno != CONNECT_IN_PROGRESS) {\n            ERROR(\"connect\");\n            close_and_free_remote(EV_A_ remote);\n            return NULL;\n        }\n    }\n\n    return remote;\n}\n\nstatic void\nserver_recv_cb(EV_P_ ev_io *w, int revents)\n{\n    server_ctx_t *server_recv_ctx = (server_ctx_t *)w;\n    server_t *server              = server_recv_ctx->server;\n    remote_t *remote              = NULL;\n\n    int len       = server->buf->len;\n    buffer_t *buf = server->buf;\n\n    if (server->stage > STAGE_PARSE) {\n        remote = server->remote;\n        buf    = remote->buf;\n        len    = 0;\n\n        ev_timer_again(EV_A_ & server->recv_ctx->watcher);\n    }\n\n    if (len > BUF_SIZE) {\n        ERROR(\"out of recv buffer\");\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    ssize_t r = recv(server->fd, buf->array + len, BUF_SIZE - len, 0);\n\n    if (r == 0) {\n        // connection closed\n        if (verbose) {\n            LOGI(\"server_recv close the connection\");\n        }\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else if (r == -1) {\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n            // no data\n            // continue to wait for recv\n            return;\n        } else {\n            ERROR(\"server recv\");\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    }\n\n    tx += r;\n\n    if (server->stage == STAGE_ERROR) {\n        server->buf->len = 0;\n        server->buf->idx = 0;\n        return;\n    }\n\n    // handle incomplete header part 1\n    if (server->stage == STAGE_INIT) {\n        buf->len += r;\n        if (buf->len <= enc_get_iv_len() + 1) {\n            // wait for more\n            return;\n        }\n    } else {\n        buf->len = r;\n    }\n\n    // SSR beg\n\n    if (server->obfs_plugin) {\n        obfs_class *obfs_plugin = server->obfs_plugin;\n        if (obfs_plugin->server_decode) {\n            int needsendback = 0;\n\n            if(obfs_compatible == 1)\n            {\n                char *back_buf = (char*)malloc(sizeof(buffer_t));\n                memcpy(back_buf, buf, sizeof(buffer_t));\n                buf->len = obfs_plugin->server_decode(server->obfs, &buf->array, buf->len, &buf->capacity, &needsendback);\n\n                if ((int)buf->len < 0)\n                {\n                    LOGE(\"obfs_compatible\");\n                    memcpy(buf, back_buf, sizeof(buffer_t));\n                    free(back_buf);\n                    server->obfs_compatible_state = 1;\n                }\n            }\n            else\n            {\n                buf->len = obfs_plugin->server_decode(server->obfs, &buf->array, buf->len, &buf->capacity, &needsendback);\n                if ((int)buf->len < 0) {\n                    LOGE(\"server_decode\");\n                    close_and_free_remote(EV_A_ remote);\n                    close_and_free_server(EV_A_ server);\n                    return;\n                }\n            }\n\n            if (needsendback) {\n                size_t capacity = BUF_SIZE;\n                char *sendback_buf = (char*)malloc(capacity);\n                obfs_class *obfs_plugin = server->obfs_plugin;\n                if (obfs_plugin->server_encode) {\n                    int len = obfs_plugin->server_encode(server->obfs, &sendback_buf, 0, &capacity);\n                    send(server->fd, sendback_buf, len, 0);\n                }\n                free(sendback_buf);\n                return;\n            }\n        }\n    }\n\n    int err = ss_decrypt(buf, server->d_ctx, BUF_SIZE);\n\n    if (err) {\n        report_addr(server->fd, MALICIOUS);\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    if (server->protocol_plugin) {\n        obfs_class *protocol_plugin = server->protocol_plugin;\n        if (protocol_plugin->server_post_decrypt) {\n\n            if(protocol_compatible == 1)\n            {\n                char *back_buf = (char*)malloc(sizeof(buffer_t));\n                memcpy(back_buf, buf, sizeof(buffer_t));\n                buf->len = protocol_plugin->server_post_decrypt(server->protocol, &buf->array, buf->len, &buf->capacity);\n\n                if ((int)buf->len < 0) {\n                    LOGE(\"protocol_compatible\");\n                    memcpy(buf, back_buf, sizeof(buffer_t));\n                    free(back_buf);\n                    server->protocol_compatible_state = 1;\n                }\n                if ( buf->len == 0 )\n                {\n                    LOGE(\"protocol_compatible\");\n                    memcpy(buf, back_buf, sizeof(buffer_t));\n                    free(back_buf);\n                    server->protocol_compatible_state = 1;\n                }\n            }\n            else\n            {\n                buf->len = protocol_plugin->server_post_decrypt(server->protocol, &buf->array, buf->len, &buf->capacity);\n                if ((int)buf->len < 0) {\n                    LOGE(\"server_post_decrypt\");\n                    close_and_free_remote(EV_A_ remote);\n                    close_and_free_server(EV_A_ server);\n                    return;\n                }\n                if ( buf->len == 0 )\n                {\n                    LOGE(\"server_post_decrypt\");\n                    return;\n                }\n            }\n        }\n    }\n    // SSR end\n\n    // handle incomplete header part 2\n    if (server->stage == STAGE_INIT) {\n        int ret = is_header_complete(server->buf);\n        if (ret == 1) {\n            bfree(server->header_buf);\n            ss_free(server->header_buf);\n            server->stage = STAGE_PARSE;\n        } else if (ret == -1) {\n            server->stage = STAGE_ERROR;\n            report_addr(server->fd, MALFORMED);\n            server->buf->len = 0;\n            server->buf->idx = 0;\n            return;\n        } else {\n            server->stage = STAGE_HANDSHAKE;\n        }\n    }\n\n    if (server->stage == STAGE_HANDSHAKE) {\n        size_t header_len = server->header_buf->len;\n        brealloc(server->header_buf, server->buf->len + header_len, BUF_SIZE);\n        memcpy(server->header_buf->array + header_len,\n               server->buf->array, server->buf->len);\n        server->header_buf->len = server->buf->len + header_len;\n\n        int ret = is_header_complete(server->buf);\n\n        if (ret == 1) {\n            brealloc(server->buf, server->header_buf->len, BUF_SIZE);\n            memcpy(server->buf->array, server->header_buf->array, server->header_buf->len);\n            server->buf->len = server->header_buf->len;\n            bfree(server->header_buf);\n            ss_free(server->header_buf);\n            server->stage = STAGE_PARSE;\n        } else {\n            if (ret == -1)\n                server->stage = STAGE_ERROR;\n            server->buf->len = 0;\n            server->buf->idx = 0;\n            return;\n        }\n    }\n\n    // handshake and transmit data\n    if (server->stage == STAGE_STREAM) {\n        if (server->auth && !ss_check_hash(remote->buf, server->chunk, server->d_ctx, BUF_SIZE)) {\n            LOGE(\"hash error\");\n            report_addr(server->fd, BAD);\n            close_and_free_server(EV_A_ server);\n            close_and_free_remote(EV_A_ remote);\n            return;\n        }\n\n        int s = send(remote->fd, remote->buf->array, remote->buf->len, 0);\n        if (s == -1) {\n            if (errno == EAGAIN || errno == EWOULDBLOCK) {\n                // no data, wait for send\n                remote->buf->idx = 0;\n                ev_io_stop(EV_A_ & server_recv_ctx->io);\n                ev_io_start(EV_A_ & remote->send_ctx->io);\n            } else {\n                ERROR(\"server_recv_send\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n            }\n        } else if (s < remote->buf->len) {\n            remote->buf->len -= s;\n            remote->buf->idx  = s;\n            ev_io_stop(EV_A_ & server_recv_ctx->io);\n            ev_io_start(EV_A_ & remote->send_ctx->io);\n        }\n        return;\n    } else if (server->stage == STAGE_PARSE) {\n        /*\n         * Shadowsocks TCP Relay Header:\n         *\n         *    +------+----------+----------+----------------+\n         *    | ATYP | DST.ADDR | DST.PORT |    HMAC-SHA1   |\n         *    +------+----------+----------+----------------+\n         *    |  1   | Variable |    2     |      10        |\n         *    +------+----------+----------+----------------+\n         *\n         *    If ATYP & ONETIMEAUTH_FLAG(0x10) != 0, Authentication (HMAC-SHA1) is enabled.\n         *\n         *    The key of HMAC-SHA1 is (IV + KEY) and the input is the whole header.\n         *    The output of HMAC-SHA is truncated to 10 bytes (leftmost bits).\n         */\n\n        /*\n         * Shadowsocks Request's Chunk Authentication for TCP Relay's payload\n         * (No chunk authentication for response's payload):\n         *\n         *    +------+-----------+-------------+------+\n         *    | LEN  | HMAC-SHA1 |    DATA     |      ...\n         *    +------+-----------+-------------+------+\n         *    |  2   |    10     |  Variable   |      ...\n         *    +------+-----------+-------------+------+\n         *\n         *    The key of HMAC-SHA1 is (IV + CHUNK ID)\n         *    The output of HMAC-SHA is truncated to 10 bytes (leftmost bits).\n         */\n\n        int offset     = 0;\n        int need_query = 0;\n        char atyp      = server->buf->array[offset++];\n        char host[257] = { 0 };\n        uint16_t port  = 0;\n        struct addrinfo info;\n        struct sockaddr_storage storage;\n        memset(&info, 0, sizeof(struct addrinfo));\n        memset(&storage, 0, sizeof(struct sockaddr_storage));\n\n        if (auth || (atyp & ONETIMEAUTH_FLAG)) {\n            size_t header_len = parse_header_len(atyp, server->buf->array, offset);\n            size_t len        = server->buf->len;\n\n            if (header_len == 0 || len < offset + header_len + ONETIMEAUTH_BYTES) {\n                report_addr(server->fd, MALFORMED);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n\n            server->buf->len = offset + header_len + ONETIMEAUTH_BYTES;\n            if (ss_onetimeauth_verify(server->buf, server->d_ctx->evp.iv)) {\n                report_addr(server->fd, BAD);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n\n            server->buf->len = len;\n            server->auth     = 1;\n        }\n\n        // get remote addr and port\n        if ((atyp & ADDRTYPE_MASK) == 1) {\n            // IP V4\n            struct sockaddr_in *addr = (struct sockaddr_in *)&storage;\n            size_t in_addr_len       = sizeof(struct in_addr);\n            addr->sin_family = AF_INET;\n            if (server->buf->len >= in_addr_len + 3) {\n                addr->sin_addr = *(struct in_addr *)(server->buf->array + offset);\n                dns_ntop(AF_INET, (const void *)(server->buf->array + offset),\n                         host, INET_ADDRSTRLEN);\n                offset += in_addr_len;\n            } else {\n                LOGE(\"invalid header with addr type %d\", atyp);\n                report_addr(server->fd, MALFORMED);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n            addr->sin_port   = *(uint16_t *)(server->buf->array + offset);\n            info.ai_family   = AF_INET;\n            info.ai_socktype = SOCK_STREAM;\n            info.ai_protocol = IPPROTO_TCP;\n            info.ai_addrlen  = sizeof(struct sockaddr_in);\n            info.ai_addr     = (struct sockaddr *)addr;\n        } else if ((atyp & ADDRTYPE_MASK) == 3) {\n            // Domain name\n            uint8_t name_len = *(uint8_t *)(server->buf->array + offset);\n            if (name_len + 4 <= server->buf->len) {\n                memcpy(host, server->buf->array + offset + 1, name_len);\n                offset += name_len + 1;\n            } else {\n                LOGE(\"invalid name length: %d\", name_len);\n                report_addr(server->fd, MALFORMED);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n            if (acl && outbound_block_match_host(host) == 1) {\n                if (verbose)\n                    LOGI(\"outbound blocked %s\", host);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n            struct cork_ip ip;\n            if (cork_ip_init(&ip, host) != -1) {\n                info.ai_socktype = SOCK_STREAM;\n                info.ai_protocol = IPPROTO_TCP;\n                if (ip.version == 4) {\n                    struct sockaddr_in *addr = (struct sockaddr_in *)&storage;\n                    dns_pton(AF_INET, host, &(addr->sin_addr));\n                    addr->sin_port   = *(uint16_t *)(server->buf->array + offset);\n                    addr->sin_family = AF_INET;\n                    info.ai_family   = AF_INET;\n                    info.ai_addrlen  = sizeof(struct sockaddr_in);\n                    info.ai_addr     = (struct sockaddr *)addr;\n                } else if (ip.version == 6) {\n                    struct sockaddr_in6 *addr = (struct sockaddr_in6 *)&storage;\n                    dns_pton(AF_INET6, host, &(addr->sin6_addr));\n                    addr->sin6_port   = *(uint16_t *)(server->buf->array + offset);\n                    addr->sin6_family = AF_INET6;\n                    info.ai_family    = AF_INET6;\n                    info.ai_addrlen   = sizeof(struct sockaddr_in6);\n                    info.ai_addr      = (struct sockaddr *)addr;\n                }\n            } else {\n                if (!validate_hostname(host, name_len)) {\n                    LOGE(\"invalid host name\");\n                    report_addr(server->fd, MALFORMED);\n                    close_and_free_server(EV_A_ server);\n                    return;\n                }\n                need_query = 1;\n            }\n        } else if ((atyp & ADDRTYPE_MASK) == 4) {\n            // IP V6\n            struct sockaddr_in6 *addr = (struct sockaddr_in6 *)&storage;\n            size_t in6_addr_len       = sizeof(struct in6_addr);\n            addr->sin6_family = AF_INET6;\n            if (server->buf->len >= in6_addr_len + 3) {\n                addr->sin6_addr = *(struct in6_addr *)(server->buf->array + offset);\n                dns_ntop(AF_INET6, (const void *)(server->buf->array + offset),\n                         host, INET6_ADDRSTRLEN);\n                offset += in6_addr_len;\n            } else {\n                LOGE(\"invalid header with addr type %d\", atyp);\n                report_addr(server->fd, MALFORMED);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n            addr->sin6_port  = *(uint16_t *)(server->buf->array + offset);\n            info.ai_family   = AF_INET6;\n            info.ai_socktype = SOCK_STREAM;\n            info.ai_protocol = IPPROTO_TCP;\n            info.ai_addrlen  = sizeof(struct sockaddr_in6);\n            info.ai_addr     = (struct sockaddr *)addr;\n        }\n\n        if (offset == 1) {\n            LOGE(\"invalid header with addr type %d\", atyp);\n            report_addr(server->fd, MALFORMED);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n\n        port = (*(uint16_t *)(server->buf->array + offset));\n\n        offset += 2;\n\n        if (server->auth) {\n            offset += ONETIMEAUTH_BYTES;\n        }\n\n        if (server->buf->len < offset) {\n            report_addr(server->fd, MALFORMED);\n            close_and_free_server(EV_A_ server);\n            return;\n        } else {\n            server->buf->len -= offset;\n            memmove(server->buf->array, server->buf->array + offset, server->buf->len);\n        }\n\n        if (verbose) {\n            if ((atyp & ADDRTYPE_MASK) == 4)\n                LOGI(\"connect to [%s]:%d\", host, ntohs(port));\n            else\n                LOGI(\"connect to %s:%d\", host, ntohs(port));\n        }\n\n        if (server->auth && !ss_check_hash(server->buf, server->chunk, server->d_ctx, BUF_SIZE)) {\n            LOGE(\"hash error\");\n            report_addr(server->fd, BAD);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n\n\n        if (!need_query) {\n            remote_t *remote = connect_to_remote(EV_A_ &info, server);\n\n            if (remote == NULL) {\n                LOGE(\"connect error\");\n                close_and_free_server(EV_A_ server);\n                return;\n            } else {\n                server->remote = remote;\n                remote->server = server;\n\n                // XXX: should handle buffer carefully\n                if (server->buf->len > 0) {\n                    memcpy(remote->buf->array, server->buf->array, server->buf->len);\n                    remote->buf->len = server->buf->len;\n                    remote->buf->idx = 0;\n                    server->buf->len = 0;\n                    server->buf->idx = 0;\n                }\n\n                // waiting on remote connected event\n                ev_io_stop(EV_A_ & server_recv_ctx->io);\n                ev_io_start(EV_A_ & remote->send_ctx->io);\n            }\n        } else {\n            query_t *query = (query_t *)ss_malloc(sizeof(query_t));\n            query->server = server;\n            snprintf(query->hostname, 256, \"%s\", host);\n\n            server->stage = STAGE_RESOLVE;\n            server->query = resolv_query(host, server_resolve_cb,\n                                         query_free_cb, query, port);\n\n            ev_io_stop(EV_A_ & server_recv_ctx->io);\n        }\n\n        return;\n    }\n    // should not reach here\n    FATAL(\"server context error\");\n}\n\nstatic void\nserver_send_cb(EV_P_ ev_io *w, int revents)\n{\n    server_ctx_t *server_send_ctx = (server_ctx_t *)w;\n    server_t *server              = server_send_ctx->server;\n    remote_t *remote              = server->remote;\n\n    if (remote == NULL) {\n        LOGE(\"invalid server\");\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    if (server->buf->len == 0) {\n        // close and free\n        if (verbose) {\n            LOGI(\"server_send close the connection\");\n        }\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else {\n        // has data to send\n        ssize_t s = send(server->fd, server->buf->array + server->buf->idx,\n                         server->buf->len, 0);\n        if (s == -1) {\n            if (errno != EAGAIN && errno != EWOULDBLOCK) {\n                ERROR(\"server_send_send\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n            }\n            return;\n        } else if (s < server->buf->len) {\n            // partly sent, move memory, wait for the next time to send\n            server->buf->len -= s;\n            server->buf->idx += s;\n            return;\n        } else {\n            // all sent out, wait for reading\n            server->buf->len = 0;\n            server->buf->idx = 0;\n            ev_io_stop(EV_A_ & server_send_ctx->io);\n            if (remote != NULL) {\n                ev_io_start(EV_A_ & remote->recv_ctx->io);\n                return;\n            } else {\n                LOGE(\"invalid remote\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n        }\n    }\n}\n\nstatic void\nblock_list_clear_cb(EV_P_ ev_timer *watcher, int revents)\n{\n    clear_block_list();\n}\n\nstatic void\nserver_timeout_cb(EV_P_ ev_timer *watcher, int revents)\n{\n    server_ctx_t *server_ctx\n        = cork_container_of(watcher, server_ctx_t, watcher);\n    server_t *server = server_ctx->server;\n    remote_t *remote = server->remote;\n\n    if (verbose) {\n        LOGI(\"TCP connection timeout\");\n    }\n\n    if (server->stage < STAGE_PARSE) {\n        if (verbose) {\n            size_t len = server->stage ?\n                         server->header_buf->len : server->buf->len;\n#ifdef __MINGW32__\n            LOGI(\"incomplete header: %u\", len);\n#else\n            LOGI(\"incomplete header: %zu\", len);\n#endif\n        }\n        report_addr(server->fd, SUSPICIOUS);\n    }\n\n    close_and_free_remote(EV_A_ remote);\n    close_and_free_server(EV_A_ server);\n}\n\nstatic void\nquery_free_cb(void *data)\n{\n    if (data != NULL) {\n        ss_free(data);\n    }\n}\n\nstatic void\nserver_resolve_cb(struct sockaddr *addr, void *data)\n{\n    query_t *query       = (query_t *)data;\n    server_t *server     = query->server;\n    struct ev_loop *loop = server->listen_ctx->loop;\n\n    server->query = NULL;\n\n    if (addr == NULL) {\n        LOGE(\"unable to resolve %s\", query->hostname);\n        close_and_free_server(EV_A_ server);\n    } else {\n        if (verbose) {\n            LOGI(\"successfully resolved %s\", query->hostname);\n        }\n\n        struct addrinfo info;\n        memset(&info, 0, sizeof(struct addrinfo));\n        info.ai_socktype = SOCK_STREAM;\n        info.ai_protocol = IPPROTO_TCP;\n        info.ai_addr     = addr;\n\n        if (addr->sa_family == AF_INET) {\n            info.ai_family  = AF_INET;\n            info.ai_addrlen = sizeof(struct sockaddr_in);\n        } else if (addr->sa_family == AF_INET6) {\n            info.ai_family  = AF_INET6;\n            info.ai_addrlen = sizeof(struct sockaddr_in6);\n        }\n\n        remote_t *remote = connect_to_remote(EV_A_ &info, server);\n\n        if (remote == NULL) {\n            close_and_free_server(EV_A_ server);\n        } else {\n            server->remote = remote;\n            remote->server = server;\n\n            // XXX: should handle buffer carefully\n            if (server->buf->len > 0) {\n                memcpy(remote->buf->array, server->buf->array + server->buf->idx,\n                       server->buf->len);\n                remote->buf->len = server->buf->len;\n                remote->buf->idx = 0;\n                server->buf->len = 0;\n                server->buf->idx = 0;\n            }\n\n            // listen to remote connected event\n            ev_io_start(EV_A_ & remote->send_ctx->io);\n        }\n    }\n}\n\nstatic void\nremote_recv_cb(EV_P_ ev_io *w, int revents)\n{\n    remote_ctx_t *remote_recv_ctx = (remote_ctx_t *)w;\n    remote_t *remote              = remote_recv_ctx->remote;\n    server_t *server              = remote->server;\n\n    if (server == NULL) {\n        LOGE(\"invalid server\");\n        close_and_free_remote(EV_A_ remote);\n        return;\n    }\n\n    ev_timer_again(EV_A_ & server->recv_ctx->watcher);\n\n    ssize_t r = recv(remote->fd, server->buf->array, BUF_SIZE, 0);\n\n    if (r == 0) {\n        // connection closed\n        if (verbose) {\n            LOGI(\"remote_recv close the connection\");\n        }\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else if (r == -1) {\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n            // no data\n            // continue to wait for recv\n            return;\n        } else {\n            ERROR(\"remote recv\");\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    }\n\n    rx += r;\n\n    server->buf->len = r;\n\n    // SSR beg\n    server_info _server_info;\n    if (server->obfs_plugin) {\n        server->obfs_plugin->get_server_info(server->obfs, &_server_info);\n        _server_info.head_len = get_head_size(server->buf->array, server->buf->len, 30);\n        server->obfs_plugin->set_server_info(server->obfs, &_server_info);\n    }\n\n    if (server->protocol_plugin && server->obfs_compatible_state == 0) {\n        obfs_class *protocol_plugin = server->protocol_plugin;\n        if (protocol_plugin->server_pre_encrypt) {\n            server->buf->len = protocol_plugin->server_pre_encrypt(server->protocol, &server->buf->array, server->buf->len, &server->buf->capacity);\n        }\n    }\n\n    int err = ss_encrypt(server->buf, server->e_ctx, BUF_SIZE);\n\n    if (err) {\n        LOGE(\"invalid password or cipher\");\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    if (server->obfs_plugin && server->obfs_compatible_state == 0) {\n        obfs_class *obfs_plugin = server->obfs_plugin;\n        if (obfs_plugin->server_encode) {\n            server->buf->len = obfs_plugin->server_encode(server->obfs, &server->buf->array, server->buf->len, &server->buf->capacity);\n        }\n    }\n    // SSR end\n\n    int s = send(server->fd, server->buf->array, server->buf->len, 0);\n\n    if (s == -1) {\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n            // no data, wait for send\n            server->buf->idx = 0;\n            ev_io_stop(EV_A_ & remote_recv_ctx->io);\n            ev_io_start(EV_A_ & server->send_ctx->io);\n        } else {\n            ERROR(\"remote_recv_send\");\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    } else if (s < server->buf->len) {\n        server->buf->len -= s;\n        server->buf->idx  = s;\n        ev_io_stop(EV_A_ & remote_recv_ctx->io);\n        ev_io_start(EV_A_ & server->send_ctx->io);\n    }\n\n    // Disable TCP_NODELAY after the first response are sent\n    if (!remote->recv_ctx->connected) {\n        int opt = 0;\n        setsockopt(server->fd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\n        setsockopt(remote->fd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\n        remote->recv_ctx->connected = 1;\n    }\n}\n\nstatic void\nremote_send_cb(EV_P_ ev_io *w, int revents)\n{\n    remote_ctx_t *remote_send_ctx = (remote_ctx_t *)w;\n    remote_t *remote              = remote_send_ctx->remote;\n    server_t *server              = remote->server;\n\n    if (server == NULL) {\n        LOGE(\"invalid server\");\n        close_and_free_remote(EV_A_ remote);\n        return;\n    }\n\n    if (!remote_send_ctx->connected) {\n        struct sockaddr_storage addr;\n        socklen_t len = sizeof(struct sockaddr_storage);\n        memset(&addr, 0, len);\n        int r = getpeername(remote->fd, (struct sockaddr *)&addr, &len);\n        if (r == 0) {\n            if (verbose) {\n                LOGI(\"remote connected\");\n            }\n            remote_send_ctx->connected = 1;\n\n            // Clear the state of this address in the block list\n            reset_addr(server->fd);\n\n            if (remote->buf->len == 0) {\n                server->stage = STAGE_STREAM;\n                ev_io_stop(EV_A_ & remote_send_ctx->io);\n                ev_io_start(EV_A_ & server->recv_ctx->io);\n                ev_io_start(EV_A_ & remote->recv_ctx->io);\n                return;\n            }\n        } else {\n            ERROR(\"getpeername\");\n            // not connected\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    }\n\n    if (remote->buf->len == 0) {\n        // close and free\n        if (verbose) {\n            LOGI(\"remote_send close the connection\");\n        }\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else {\n        // has data to send\n        ssize_t s = send(remote->fd, remote->buf->array + remote->buf->idx,\n                         remote->buf->len, 0);\n        if (s == -1) {\n            if (errno != EAGAIN && errno != EWOULDBLOCK) {\n                ERROR(\"remote_send_send\");\n                // close and free\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n            }\n            return;\n        } else if (s < remote->buf->len) {\n            // partly sent, move memory, wait for the next time to send\n            remote->buf->len -= s;\n            remote->buf->idx += s;\n            return;\n        } else {\n            // all sent out, wait for reading\n            remote->buf->len = 0;\n            remote->buf->idx = 0;\n            ev_io_stop(EV_A_ & remote_send_ctx->io);\n            if (server != NULL) {\n                ev_io_start(EV_A_ & server->recv_ctx->io);\n                if (server->stage != STAGE_STREAM) {\n                    server->stage = STAGE_STREAM;\n                    ev_io_start(EV_A_ & remote->recv_ctx->io);\n                }\n            } else {\n                LOGE(\"invalid server\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n            }\n            return;\n        }\n    }\n}\n\nstatic remote_t *\nnew_remote(int fd)\n{\n    if (verbose) {\n        remote_conn++;\n    }\n\n    remote_t *remote;\n\n    remote                      = ss_malloc(sizeof(remote_t));\n    remote->recv_ctx            = ss_malloc(sizeof(remote_ctx_t));\n    remote->send_ctx            = ss_malloc(sizeof(remote_ctx_t));\n    remote->buf                 = ss_malloc(sizeof(buffer_t));\n    remote->fd                  = fd;\n    remote->recv_ctx->remote    = remote;\n    remote->recv_ctx->connected = 0;\n    remote->send_ctx->remote    = remote;\n    remote->send_ctx->connected = 0;\n    remote->server              = NULL;\n\n    ev_io_init(&remote->recv_ctx->io, remote_recv_cb, fd, EV_READ);\n    ev_io_init(&remote->send_ctx->io, remote_send_cb, fd, EV_WRITE);\n\n    balloc(remote->buf, BUF_SIZE);\n\n    return remote;\n}\n\nstatic void\nfree_remote(remote_t *remote)\n{\n    if (remote->server != NULL) {\n        remote->server->remote = NULL;\n    }\n    if (remote->buf != NULL) {\n        bfree(remote->buf);\n        ss_free(remote->buf);\n    }\n    ss_free(remote->recv_ctx);\n    ss_free(remote->send_ctx);\n    ss_free(remote);\n}\n\nstatic void\nclose_and_free_remote(EV_P_ remote_t *remote)\n{\n    if (remote != NULL) {\n        ev_io_stop(EV_A_ & remote->send_ctx->io);\n        ev_io_stop(EV_A_ & remote->recv_ctx->io);\n        close(remote->fd);\n        free_remote(remote);\n        if (verbose) {\n            remote_conn--;\n            LOGI(\"current remote connection: %d\", remote_conn);\n        }\n    }\n}\n\nstatic server_t *\nnew_server(int fd, listen_ctx_t *listener)\n{\n    if (verbose) {\n        server_conn++;\n    }\n\n    server_t *server;\n    server = ss_malloc(sizeof(server_t));\n\n    memset(server, 0, sizeof(server_t));\n\n    server->recv_ctx            = ss_malloc(sizeof(server_ctx_t));\n    server->send_ctx            = ss_malloc(sizeof(server_ctx_t));\n    server->buf                 = ss_malloc(sizeof(buffer_t));\n    server->header_buf          = ss_malloc(sizeof(buffer_t));\n    server->fd                  = fd;\n    server->recv_ctx->server    = server;\n    server->recv_ctx->connected = 0;\n    server->send_ctx->server    = server;\n    server->send_ctx->connected = 0;\n    server->stage               = STAGE_INIT;\n    server->query               = NULL;\n    server->listen_ctx          = listener;\n    server->remote              = NULL;\n\n    if (listener->method) {\n        server->e_ctx = ss_malloc(sizeof(enc_ctx_t));\n        server->d_ctx = ss_malloc(sizeof(enc_ctx_t));\n        enc_ctx_init(listener->method, server->e_ctx, 1);\n        enc_ctx_init(listener->method, server->d_ctx, 0);\n    } else {\n        server->e_ctx = NULL;\n        server->d_ctx = NULL;\n    }\n\n    int request_timeout = min(MAX_REQUEST_TIMEOUT, listener->timeout)\n                          + rand() % MAX_REQUEST_TIMEOUT;\n\n    ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ);\n    ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE);\n    ev_timer_init(&server->recv_ctx->watcher, server_timeout_cb,\n                  request_timeout, listener->timeout);\n\n    balloc(server->buf, BUF_SIZE);\n    balloc(server->header_buf, BUF_SIZE);\n\n    server->chunk = (chunk_t *)malloc(sizeof(chunk_t));\n    memset(server->chunk, 0, sizeof(chunk_t));\n    server->chunk->buf = ss_malloc(sizeof(buffer_t));\n    memset(server->chunk->buf, 0, sizeof(buffer_t));\n\n    cork_dllist_add(&connections, &server->entries);\n\n    return server;\n}\n\nstatic void\nfree_server(server_t *server)\n{\n    cork_dllist_remove(&server->entries);\n\n    if (server->chunk != NULL) {\n        if (server->chunk->buf != NULL) {\n            bfree(server->chunk->buf);\n            ss_free(server->chunk->buf);\n        }\n        ss_free(server->chunk);\n    }\n    if (server->remote != NULL) {\n        server->remote->server = NULL;\n    }\n    if (server->e_ctx != NULL) {\n        cipher_context_release(&server->e_ctx->evp);\n        ss_free(server->e_ctx);\n    }\n    if (server->d_ctx != NULL) {\n        cipher_context_release(&server->d_ctx->evp);\n        ss_free(server->d_ctx);\n    }\n    if (server->buf != NULL) {\n        bfree(server->buf);\n        ss_free(server->buf);\n    }\n    if (server->header_buf != NULL) {\n        bfree(server->header_buf);\n        ss_free(server->header_buf);\n    }\n\n    ss_free(server->recv_ctx);\n    ss_free(server->send_ctx);\n    ss_free(server);\n}\n\nstatic void\nclose_and_free_server(EV_P_ server_t *server)\n{\n    if (server != NULL) {\n        if (server->query != NULL) {\n            resolv_cancel(server->query);\n            server->query = NULL;\n        }\n        ev_io_stop(EV_A_ & server->send_ctx->io);\n        ev_io_stop(EV_A_ & server->recv_ctx->io);\n        ev_timer_stop(EV_A_ & server->recv_ctx->watcher);\n        close(server->fd);\n        free_server(server);\n        if (verbose) {\n            server_conn--;\n            LOGI(\"current server connection: %d\", server_conn);\n        }\n    }\n}\n\nstatic void\nsignal_cb(EV_P_ ev_signal *w, int revents)\n{\n    if (revents & EV_SIGNAL) {\n        switch (w->signum) {\n        case SIGINT:\n        case SIGTERM:\n            ev_unloop(EV_A_ EVUNLOOP_ALL);\n        }\n    }\n}\n\nstatic void\naccept_cb(EV_P_ ev_io *w, int revents)\n{\n    listen_ctx_t *listener = (listen_ctx_t *)w;\n    int serverfd           = accept(listener->fd, NULL, NULL);\n    if (serverfd == -1) {\n        ERROR(\"accept\");\n        return;\n    }\n\n    char *peer_name = get_peer_name(serverfd);\n    if (peer_name != NULL) {\n        int in_white_list = 0;\n        if (acl) {\n            if ((get_acl_mode() == BLACK_LIST && acl_match_host(peer_name) == 1)\n                || (get_acl_mode() == WHITE_LIST && acl_match_host(peer_name) >= 0)) {\n                LOGE(\"Access denied from %s\", peer_name);\n                close(serverfd);\n                return;\n            } else if (acl_match_host(peer_name) == -1) {\n                in_white_list = 1;\n            }\n        }\n        if (!in_white_list && check_block_list(peer_name)) {\n            LOGE(\"block all requests from %s\", peer_name);\n#ifdef __linux__\n            set_linger(serverfd);\n#endif\n            close(serverfd);\n            return;\n        }\n    }\n\n    int opt = 1;\n    setsockopt(serverfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\n#ifdef SO_NOSIGPIPE\n    setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n#endif\n    setnonblocking(serverfd);\n\n    if (verbose) {\n        LOGI(\"accept a connection\");\n    }\n\n    server_t *server = new_server(serverfd, listener);\n\n    // SSR beg\n    server->obfs_plugin = new_obfs_class(server->listen_ctx->obfs_name);\n    if (server->obfs_plugin) {\n        server->obfs = server->obfs_plugin->new_obfs();\n        server->obfs_compatible_state = 0;\n    }\n    server->protocol_plugin = new_obfs_class(server->listen_ctx->protocol_name);\n    if (server->protocol_plugin) {\n        server->protocol = server->protocol_plugin->new_obfs();\n        server->protocol_compatible_state = 0;\n    }\n    server_info _server_info;\n    memset(&_server_info, 0, sizeof(server_info));\n    _server_info.param = server->listen_ctx->obfs_param;\n    if(server->obfs_plugin)\n        _server_info.g_data = server->obfs_plugin->init_data();\n    _server_info.head_len = 7;\n    _server_info.iv = server->e_ctx->evp.iv;\n    _server_info.iv_len = enc_get_iv_len();\n    _server_info.key = enc_get_key();\n    _server_info.key_len = enc_get_key_len();\n    _server_info.tcp_mss = 1460;\n\n    if (server->obfs_plugin)\n        server->obfs_plugin->set_server_info(server->obfs, &_server_info);\n\n    _server_info.param = server->listen_ctx->protocol_param;\n    if (server->protocol_plugin)\n        _server_info.g_data = server->protocol_plugin->init_data();\n\n    if (server->protocol_plugin)\n        server->protocol_plugin->set_server_info(server->protocol, &_server_info);\n    // SSR end\n\n    ev_io_start(EV_A_ & server->recv_ctx->io);\n    ev_timer_start(EV_A_ & server->recv_ctx->watcher);\n}\n\nint\nmain(int argc, char **argv)\n{\n    int i, c;\n    int pid_flags   = 0;\n    int mptcp       = 0;\n    int firewall    = 0;\n    int mtu         = 0;\n    char *user      = NULL;\n    char *password  = NULL;\n    char *timeout   = NULL;\n    char *protocol = NULL; // SSR\n    char *protocol_param = NULL; // SSR\n    char *method = NULL;\n    char *obfs = NULL; // SSR\n    char *obfs_param = NULL; // SSR\n    char *pid_path  = NULL;\n    char *conf_path = NULL;\n    char *iface     = NULL;\n\n    int server_num = 0;\n    const char *server_host[MAX_REMOTE_NUM];\n\n    char *nameservers[MAX_DNS_NUM + 1];\n    int nameserver_num = 0;\n\n    int option_index                    = 0;\n    static struct option long_options[] = {\n        { \"fast-open\",       no_argument,       0, 0 },\n        { \"acl\",             required_argument, 0, 0 },\n        { \"manager-address\", required_argument, 0, 0 },\n        { \"mtu\",             required_argument, 0, 0 },\n        { \"help\",            no_argument,       0, 0 },\n#ifdef __linux__\n        { \"mptcp\",           no_argument,       0, 0 },\n        { \"firewall\",        no_argument,       0, 0 },\n#endif\n        {                 0,                 0, 0, 0 }\n    };\n\n    opterr = 0;\n\n    USE_TTY();\n\n    while ((c = getopt_long(argc, argv, \"f:s:p:l:k:t:m:b:c:i:d:a:n:O:o:G:g:huUvA6\",\n                            long_options, &option_index)) != -1) {\n        switch (c) {\n        case 0:\n            if (option_index == 0) {\n                fast_open = 1;\n            } else if (option_index == 1) {\n                LOGI(\"initializing acl...\");\n                acl = !init_acl(optarg);\n            } else if (option_index == 2) {\n                manager_address = optarg;\n            } else if (option_index == 3) {\n                mtu = atoi(optarg);\n                LOGI(\"set MTU to %d\", mtu);\n            } else if (option_index == 4) {\n                usage();\n                exit(EXIT_SUCCESS);\n            } else if (option_index == 5) {\n                mptcp = 1;\n                LOGI(\"enable multipath TCP\");\n            } else if (option_index == 6) {\n                firewall = 1;\n                LOGI(\"enable firewall rules\");\n            }\n            break;\n        case 's':\n            if (server_num < MAX_REMOTE_NUM) {\n                server_host[server_num++] = optarg;\n            }\n            break;\n        case 'b':\n            bind_address = optarg;\n            break;\n        case 'p':\n            server_port = optarg;\n            break;\n        case 'k':\n            password = optarg;\n            break;\n        case 'f':\n            pid_flags = 1;\n            pid_path  = optarg;\n            break;\n        case 't':\n            timeout = optarg;\n            break;\n        // SSR beg\n        case 'O':\n            protocol = optarg;\n            break;\n        case 'm':\n            method = optarg;\n            break;\n        case 'o':\n            obfs = optarg;\n            break;\n        case 'G':\n            protocol_param = optarg;\n            break;\n        case 'g':\n            obfs_param = optarg;\n            break;\n        // SSR end\n        case 'c':\n            conf_path = optarg;\n            break;\n        case 'i':\n            iface = optarg;\n            break;\n        case 'd':\n            if (nameserver_num < MAX_DNS_NUM) {\n                nameservers[nameserver_num++] = optarg;\n            }\n            break;\n        case 'a':\n            user = optarg;\n            break;\n#ifdef HAVE_SETRLIMIT\n        case 'n':\n            nofile = atoi(optarg);\n            break;\n#endif\n        case 'u':\n            mode = TCP_AND_UDP;\n            break;\n        case 'U':\n            mode = UDP_ONLY;\n            break;\n        case 'v':\n            verbose = 1;\n            break;\n        case 'h':\n            usage();\n            exit(EXIT_SUCCESS);\n        case 'A':\n            auth = 1;\n            break;\n        case '6':\n            ipv6first = 1;\n            break;\n        case '?':\n            // The option character is not recognized.\n            LOGE(\"Unrecognized option: %s\", optarg);\n            opterr = 1;\n            break;\n        }\n    }\n\n    if (opterr) {\n        usage();\n        exit(EXIT_FAILURE);\n    }\n\n    if (argc == 1) {\n        if (conf_path == NULL) {\n            conf_path = DEFAULT_CONF_PATH;\n        }\n    }\n\n    if (conf_path != NULL) {\n        jconf_t *conf = read_jconf(conf_path);\n        if (server_num == 0) {\n            server_num = conf->remote_num;\n            for (i = 0; i < server_num; i++)\n                server_host[i] = conf->remote_addr[i].host;\n        }\n        if (server_port == NULL) {\n            server_port = conf->remote_port;\n        }\n        if (password == NULL) {\n            password = conf->password;\n        }\n        // SSR beg\n        if (protocol == NULL) {\n            protocol = conf->protocol;\n            LOGI(\"protocol %s\", protocol);\n        }\n        if (protocol_param == NULL) {\n            protocol_param = conf->protocol_param;\n            LOGI(\"protocol_param %s\", obfs_param);\n        }\n        if (method == NULL) {\n            method = conf->method;\n            LOGI(\"method %s\", method);\n        }\n        if (obfs == NULL) {\n            obfs = conf->obfs;\n            LOGI(\"obfs %s\", obfs);\n        }\n        if (obfs_param == NULL) {\n            obfs_param = conf->obfs_param;\n            LOGI(\"obfs_param %s\", obfs_param);\n        }\n        // SSR end\n        if (timeout == NULL) {\n            timeout = conf->timeout;\n        }\n        if (user == NULL) {\n            user = conf->user;\n        }\n        if (auth == 0) {\n            auth = conf->auth;\n        }\n        if (mode == TCP_ONLY) {\n            mode = conf->mode;\n        }\n        if (mtu == 0) {\n            mtu = conf->mtu;\n        }\n        if (mptcp == 0) {\n            mptcp = conf->mptcp;\n        }\n#ifdef TCP_FASTOPEN\n        if (fast_open == 0) {\n            fast_open = conf->fast_open;\n        }\n#endif\n#ifdef HAVE_SETRLIMIT\n        if (nofile == 0) {\n            nofile = conf->nofile;\n        }\n#endif\n        if (conf->nameserver != NULL) {\n            nameservers[nameserver_num++] = conf->nameserver;\n        }\n        if (ipv6first == 0) {\n            ipv6first = conf->ipv6_first;\n        }\n    }\n\n    //_compatible\n    if(strlen(protocol)>11)\n    {\n        char *text;\n        text = (char*)malloc(12);\n        memcpy(text, protocol + strlen(protocol) - 11, 12);\n\n        if(strcmp(text, \"_compatible\") == 0)\n        {\n            free(text);\n            text = (char*)malloc(strlen(protocol) - 11);\n            memcpy(text, protocol, strlen(protocol) - 11);\n            int length = strlen(protocol) - 11;\n            free(protocol);\n            obfs = (char*)malloc(length);\n            memset(protocol, 0x00, length);\n            memcpy(protocol, text, length);\n            LOGI(\"protocol compatible enable, %s\", protocol);\n            free(text);\n            protocol_compatible = 1;\n        }\n    }\n\n    if(strlen(obfs)>11)\n    {\n        char *text;\n        text = (char*)malloc(12);\n        memcpy(text, obfs + strlen(obfs) - 11, 12);\n\n        if(strcmp(text, \"_compatible\") == 0)\n        {\n            free(text);\n            text = (char*)malloc(strlen(obfs) - 11);\n            memcpy(text, obfs, strlen(obfs) - 11);\n            int length = strlen(obfs) - 11;\n            free(obfs);\n            obfs = (char*)malloc(length);\n            memset(obfs, 0x00, length);\n            memcpy(obfs, text, length);\n            LOGI(\"obfs compatible enable, %s\", obfs);\n            free(text);\n            obfs_compatible = 1;\n        }\n    }\n\n\n    if (server_num == 0) {\n        server_host[server_num++] = NULL;\n    }\n\n    if (server_num == 0 || server_port == NULL || password == NULL) {\n        usage();\n        exit(EXIT_FAILURE);\n    }\n\n    if (protocol && strcmp(protocol, \"verify_sha1\") == 0) {\n        auth = 1;\n        protocol = NULL;\n    }\n\n    if (method == NULL) {\n        method = \"rc4-md5\";\n    }\n\n    if (timeout == NULL) {\n        timeout = \"60\";\n    }\n\n#ifdef HAVE_SETRLIMIT\n    /*\n     * no need to check the return value here since we will show\n     * the user an error message if setrlimit(2) fails\n     */\n    if (nofile > 1024) {\n        if (verbose) {\n            LOGI(\"setting NOFILE to %d\", nofile);\n        }\n        set_nofile(nofile);\n    }\n#endif\n\n    if (pid_flags) {\n        USE_SYSLOG(argv[0]);\n        daemonize(pid_path);\n    }\n\n    if (ipv6first) {\n        LOGI(\"resolving hostname to IPv6 address first\");\n    }\n\n    if (fast_open == 1) {\n#ifdef TCP_FASTOPEN\n        LOGI(\"using tcp fast open\");\n#else\n        LOGE(\"tcp fast open is not supported by this environment\");\n        fast_open = 0;\n#endif\n    }\n\n    if (auth) {\n        LOGI(\"onetime authentication enabled\");\n    }\n\n    if (mode != TCP_ONLY) {\n        LOGI(\"UDP relay enabled\");\n    }\n\n    if (mode == UDP_ONLY) {\n        LOGI(\"TCP relay disabled\");\n    }\n\n#ifdef __MINGW32__\n    winsock_init();\n#else\n    // ignore SIGPIPE\n    signal(SIGPIPE, SIG_IGN);\n    signal(SIGCHLD, SIG_IGN);\n    signal(SIGABRT, SIG_IGN);\n#endif\n\n    struct ev_signal sigint_watcher;\n    struct ev_signal sigterm_watcher;\n    ev_signal_init(&sigint_watcher, signal_cb, SIGINT);\n    ev_signal_init(&sigterm_watcher, signal_cb, SIGTERM);\n    ev_signal_start(EV_DEFAULT, &sigint_watcher);\n    ev_signal_start(EV_DEFAULT, &sigterm_watcher);\n\n    // setup keys\n    LOGI(\"initializing ciphers... %s\", method);\n    int m = enc_init(password, method);\n\n    // initialize ev loop\n    struct ev_loop *loop = EV_DEFAULT;\n\n    // setup udns\n    if (nameserver_num == 0) {\n#ifdef __MINGW32__\n        nameservers[nameserver_num++] = \"8.8.8.8\";\n        resolv_init(loop, nameservers, nameserver_num, ipv6first);\n#else\n        resolv_init(loop, NULL, 0, ipv6first);\n#endif\n    } else {\n        resolv_init(loop, nameservers, nameserver_num, ipv6first);\n    }\n\n    for (int i = 0; i < nameserver_num; i++)\n        LOGI(\"using nameserver: %s\", nameservers[i]);\n\n    // initialize listen context\n    listen_ctx_t listen_ctx_list[server_num];\n\n    // bind to each interface\n    while (server_num > 0) {\n        int index        = --server_num;\n        const char *host = server_host[index];\n\n        if (mode != UDP_ONLY) {\n            // Bind to port\n            int listenfd;\n            listenfd = create_and_bind(host, server_port, mptcp);\n            if (listenfd == -1) {\n                FATAL(\"bind() error\");\n            }\n            if (listen(listenfd, SSMAXCONN) == -1) {\n                FATAL(\"listen() error\");\n            }\n            setfastopen(listenfd);\n            setnonblocking(listenfd);\n            listen_ctx_t *listen_ctx = &listen_ctx_list[index];\n\n            // Setup proxy context\n            listen_ctx->timeout = atoi(timeout);\n            listen_ctx->fd      = listenfd;\n            listen_ctx->method  = m;\n            listen_ctx->iface   = iface;\n\n            // SSR beg\n            listen_ctx->protocol_name = protocol;\n            listen_ctx->protocol_param = protocol_param;\n            listen_ctx->method = m;\n            listen_ctx->obfs_name = obfs;\n            listen_ctx->obfs_param = obfs_param;\n            listen_ctx->list_protocol_global = malloc(sizeof(void *));\n            listen_ctx->list_obfs_global = malloc(sizeof(void *));\n            memset(listen_ctx->list_protocol_global, 0, sizeof(void *));\n            memset(listen_ctx->list_obfs_global, 0, sizeof(void *));\n            // SSR end\n\n            listen_ctx->loop    = loop;\n\n            ev_io_init(&listen_ctx->io, accept_cb, listenfd, EV_READ);\n            ev_io_start(loop, &listen_ctx->io);\n        }\n\n        // Setup UDP\n        if (mode != TCP_ONLY) {\n            init_udprelay(server_host[index], server_port, mtu, m,\n                          auth, atoi(timeout), iface, protocol, protocol_param);\n        }\n\n        if (host && strcmp(host, \":\") > 0)\n            LOGI(\"listening at [%s]:%s\", host, server_port);\n        else\n            LOGI(\"listening at %s:%s\", host ? host : \"*\", server_port);\n    }\n\n    if (manager_address != NULL) {\n        ev_timer_init(&stat_update_watcher, stat_update_cb, UPDATE_INTERVAL, UPDATE_INTERVAL);\n        ev_timer_start(EV_DEFAULT, &stat_update_watcher);\n    }\n\n    ev_timer_init(&block_list_watcher, block_list_clear_cb, UPDATE_INTERVAL, UPDATE_INTERVAL);\n    ev_timer_start(EV_DEFAULT, &block_list_watcher);\n\n    // setuid\n    if (user != NULL && ! run_as(user)) {\n        FATAL(\"failed to switch user\");\n    }\n\n#ifndef __MINGW32__\n    if (geteuid() == 0){\n        LOGI(\"running from root user\");\n    } else if (firewall) {\n        LOGE(\"firewall setup requires running from root user\");\n        exit(-1);\n    }\n#endif\n\n    // init block list\n    init_block_list(firewall);\n\n    // Init connections\n    cork_dllist_init(&connections);\n\n    // start ev loop\n    ev_run(loop, 0);\n\n    if (verbose) {\n        LOGI(\"closed gracefully\");\n    }\n\n    // Free block list\n    free_block_list();\n\n    if (manager_address != NULL) {\n        ev_timer_stop(EV_DEFAULT, &stat_update_watcher);\n    }\n    ev_timer_stop(EV_DEFAULT, &block_list_watcher);\n\n    // Clean up\n    for (int i = 0; i <= server_num; i++) {\n        listen_ctx_t *listen_ctx = &listen_ctx_list[i];\n        if (mode != UDP_ONLY) {\n            ev_io_stop(loop, &listen_ctx->io);\n            close(listen_ctx->fd);\n        }\n    }\n\n    if (mode != UDP_ONLY) {\n        free_connections(loop);\n    }\n\n    if (mode != TCP_ONLY) {\n        free_udprelay();\n    }\n\n    resolv_shutdown(loop);\n\n#ifdef __MINGW32__\n    winsock_cleanup();\n#endif\n\n    ev_signal_stop(EV_DEFAULT, &sigint_watcher);\n    ev_signal_stop(EV_DEFAULT, &sigterm_watcher);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/server.h",
    "content": "/*\n * server.h - Define shadowsocks server's buffers and callbacks\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _SERVER_H\n#define _SERVER_H\n\n#include <ev.h>\n#include <time.h>\n#include <libcork/ds.h>\n\n#include \"encrypt.h\"\n#include \"jconf.h\"\n#include \"resolv.h\"\n#include \"obfs.h\"\n#include \"protocol.h\"\n\n#include \"common.h\"\n\ntypedef struct listen_ctx {\n    ev_io io;\n    int fd;\n    int timeout;\n    int method;\n    char *iface;\n    struct ev_loop *loop;\n\n    // SSR\n    char *protocol_name;\n    char *protocol_param;\n    char *obfs_name;\n    char *obfs_param;\n    void **list_protocol_global;\n    void **list_obfs_global;\n} listen_ctx_t;\n\ntypedef struct server_ctx {\n    ev_io io;\n    ev_timer watcher;\n    int connected;\n    struct server *server;\n} server_ctx_t;\n\ntypedef struct server {\n    int fd;\n    int stage;\n    buffer_t *buf;\n    ssize_t buf_capacity;\n    buffer_t *header_buf;\n\n    int auth;\n    struct chunk *chunk;\n\n    struct enc_ctx *e_ctx;\n    struct enc_ctx *d_ctx;\n    struct server_ctx *recv_ctx;\n    struct server_ctx *send_ctx;\n    struct listen_ctx *listen_ctx;\n    struct remote *remote;\n\n    struct ResolvQuery *query;\n\n    struct cork_dllist_item entries;\n\n    // SSR\n    obfs *protocol;\n    obfs *obfs;\n    obfs_class *protocol_plugin;\n    obfs_class *obfs_plugin;\n    int obfs_compatible_state;\n    int protocol_compatible_state;\n} server_t;\n\ntypedef struct query {\n    server_t *server;\n    char hostname[257];\n} query_t;\n\ntypedef struct remote_ctx {\n    ev_io io;\n    int connected;\n    struct remote *remote;\n} remote_ctx_t;\n\ntypedef struct remote {\n    int fd;\n    buffer_t *buf;\n    ssize_t buf_capacity;\n    struct remote_ctx *recv_ctx;\n    struct remote_ctx *send_ctx;\n    struct server *server;\n\n    // SSR\n    int remote_index;\n} remote_t;\n\n#endif // _SERVER_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/tls.c",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/*\n * This is a minimal TLS implementation intended only to parse the server name\n * extension.  This was created based primarily on Wireshark dissection of a\n * TLS handshake and RFC4366.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <stdlib.h> /* malloc() */\n#include <string.h> /* strncpy() */\n\n#ifndef __MINGW32__\n#include <sys/socket.h>\n#else\n#include <win32.h>\n#endif\n\n#include \"tls.h\"\n#include \"protocol.h\"\n#include \"utils.h\"\n\n#define SERVER_NAME_LEN 256\n#define TLS_HEADER_LEN 5\n#define TLS_HANDSHAKE_CONTENT_TYPE 0x16\n#define TLS_HANDSHAKE_TYPE_CLIENT_HELLO 0x01\n\n#ifndef MIN\n#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))\n#endif\n\nextern int verbose;\n\nstatic int parse_tls_header(const char *, size_t, char **);\nstatic int parse_extensions(const char *, size_t, char **);\nstatic int parse_server_name_extension(const char *, size_t, char **);\n\nstatic const protocol_t tls_protocol_st = {\n    .default_port =               443,\n    .parse_packet = &parse_tls_header,\n};\nconst protocol_t *const tls_protocol = &tls_protocol_st;\n\n/* Parse a TLS packet for the Server Name Indication extension in the client\n * hello handshake, returning the first servername found (pointer to static\n * array)\n *\n * Returns:\n *  >=0  - length of the hostname and updates *hostname\n *         caller is responsible for freeing *hostname\n *  -1   - Incomplete request\n *  -2   - No Host header included in this request\n *  -3   - Invalid hostname pointer\n *  -4   - malloc failure\n *  < -4 - Invalid TLS client hello\n */\nstatic int\nparse_tls_header(const char *data, size_t data_len, char **hostname)\n{\n    char tls_content_type;\n    char tls_version_major;\n    char tls_version_minor;\n    size_t pos = TLS_HEADER_LEN;\n    size_t len;\n\n    if (hostname == NULL)\n        return -3;\n\n    /* Check that our TCP payload is at least large enough for a TLS header */\n    if (data_len < TLS_HEADER_LEN)\n        return -1;\n\n    /* SSL 2.0 compatible Client Hello\n     *\n     * High bit of first byte (length) and content type is Client Hello\n     *\n     * See RFC5246 Appendix E.2\n     */\n    if (data[0] & 0x80 && data[2] == 1) {\n        if (verbose)\n            LOGI(\"Received SSL 2.0 Client Hello which can not support SNI.\");\n        return -2;\n    }\n\n    tls_content_type = data[0];\n    if (tls_content_type != TLS_HANDSHAKE_CONTENT_TYPE) {\n        if (verbose)\n            LOGI(\"Request did not begin with TLS handshake.\");\n        return -5;\n    }\n\n    tls_version_major = data[1];\n    tls_version_minor = data[2];\n    if (tls_version_major < 3) {\n        if (verbose)\n            LOGI(\"Received SSL %d.%d handshake which can not support SNI.\",\n                 tls_version_major, tls_version_minor);\n\n        return -2;\n    }\n\n    /* TLS record length */\n    len = ((unsigned char)data[3] << 8) +\n          (unsigned char)data[4] + TLS_HEADER_LEN;\n    data_len = MIN(data_len, len);\n\n    /* Check we received entire TLS record length */\n    if (data_len < len)\n        return -1;\n\n    /*\n     * Handshake\n     */\n    if (pos + 1 > data_len) {\n        return -5;\n    }\n    if (data[pos] != TLS_HANDSHAKE_TYPE_CLIENT_HELLO) {\n        if (verbose)\n            LOGI(\"Not a client hello\");\n\n        return -5;\n    }\n\n    /* Skip past fixed length records:\n     * 1\tHandshake Type\n     * 3\tLength\n     * 2\tVersion (again)\n     * 32\tRandom\n     * to\tSession ID Length\n     */\n    pos += 38;\n\n    /* Session ID */\n    if (pos + 1 > data_len)\n        return -5;\n    len  = (unsigned char)data[pos];\n    pos += 1 + len;\n\n    /* Cipher Suites */\n    if (pos + 2 > data_len)\n        return -5;\n    len  = ((unsigned char)data[pos] << 8) + (unsigned char)data[pos + 1];\n    pos += 2 + len;\n\n    /* Compression Methods */\n    if (pos + 1 > data_len)\n        return -5;\n    len  = (unsigned char)data[pos];\n    pos += 1 + len;\n\n    if (pos == data_len && tls_version_major == 3 && tls_version_minor == 0) {\n        if (verbose)\n            LOGI(\"Received SSL 3.0 handshake without extensions\");\n        return -2;\n    }\n\n    /* Extensions */\n    if (pos + 2 > data_len)\n        return -5;\n    len  = ((unsigned char)data[pos] << 8) + (unsigned char)data[pos + 1];\n    pos += 2;\n\n    if (pos + len > data_len)\n        return -5;\n    return parse_extensions(data + pos, len, hostname);\n}\n\nstatic int\nparse_extensions(const char *data, size_t data_len, char **hostname)\n{\n    size_t pos = 0;\n    size_t len;\n\n    /* Parse each 4 bytes for the extension header */\n    while (pos + 4 <= data_len) {\n        /* Extension Length */\n        len = ((unsigned char)data[pos + 2] << 8) +\n              (unsigned char)data[pos + 3];\n\n        /* Check if it's a server name extension */\n        if (data[pos] == 0x00 && data[pos + 1] == 0x00) {\n            /* There can be only one extension of each type, so we break\n             * our state and move p to beinnging of the extension here */\n            if (pos + 4 + len > data_len)\n                return -5;\n            return parse_server_name_extension(data + pos + 4, len, hostname);\n        }\n        pos += 4 + len; /* Advance to the next extension header */\n    }\n    /* Check we ended where we expected to */\n    if (pos != data_len)\n        return -5;\n\n    return -2;\n}\n\nstatic int\nparse_server_name_extension(const char *data, size_t data_len,\n                            char **hostname)\n{\n    size_t pos = 2; /* skip server name list length */\n    size_t len;\n\n    while (pos + 3 < data_len) {\n        len = ((unsigned char)data[pos + 1] << 8) +\n              (unsigned char)data[pos + 2];\n\n        if (pos + 3 + len > data_len)\n            return -5;\n\n        switch (data[pos]) { /* name type */\n        case 0x00:     /* host_name */\n            *hostname = malloc(len + 1);\n            if (*hostname == NULL) {\n                ERROR(\"malloc() failure\");\n                return -4;\n            }\n\n            strncpy(*hostname, data + pos + 3, len);\n\n            (*hostname)[len] = '\\0';\n\n            return len;\n        default:\n            if (verbose)\n                LOGI(\"Unknown server name extension name type: %d\",\n                     data[pos]);\n        }\n        pos += 3 + len;\n    }\n    /* Check we ended where we expected to */\n    if (pos != data_len)\n        return -5;\n\n    return -2;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/tls.h",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef TLS_H\n#define TLS_H\n\n#include \"protocol.h\"\n\nconst protocol_t *const tls_protocol;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/tls1.2_ticket.c",
    "content": "\n#include \"tls1.2_ticket.h\"\n#include \"list.c\"\n\ntypedef struct tls12_ticket_auth_global_data {\n    uint8_t local_client_id[32];\n    List client_data;\n    time_t startup_time;\n}tls12_ticket_auth_global_data;\n\ntypedef struct tls12_ticket_auth_local_data {\n    int handshake_status;\n    char *send_buffer;\n    int send_buffer_size;\n    char *recv_buffer;\n    int recv_buffer_size;\n}tls12_ticket_auth_local_data;\n\nvoid tls12_ticket_auth_local_data_init(tls12_ticket_auth_local_data* local) {\n    local->handshake_status = 0;\n    local->send_buffer = malloc(0);\n    local->send_buffer_size = 0;\n    local->recv_buffer = malloc(0);\n    local->recv_buffer_size = 0;\n}\n\nvoid * tls12_ticket_auth_init_data() {\n    tls12_ticket_auth_global_data *global = (tls12_ticket_auth_global_data*)malloc(sizeof(tls12_ticket_auth_global_data));\n    rand_bytes(global->local_client_id, 32);\n    global->client_data = list_init(22);\n    global->startup_time = time(NULL);\n    return global;\n}\n\nobfs * tls12_ticket_auth_new_obfs() {\n    obfs * self = new_obfs();\n    self->l_data = malloc(sizeof(tls12_ticket_auth_local_data));\n    tls12_ticket_auth_local_data_init((tls12_ticket_auth_local_data*)self->l_data);\n    return self;\n}\n\nvoid tls12_ticket_auth_dispose(obfs *self) {\n    tls12_ticket_auth_local_data *local = (tls12_ticket_auth_local_data*)self->l_data;\n    if (local->send_buffer != NULL) {\n        free(local->send_buffer);\n        local->send_buffer = NULL;\n    }\n    if (local->recv_buffer != NULL) {\n        free(local->recv_buffer);\n        local->recv_buffer = NULL;\n    }\n    free(local);\n    dispose_obfs(self);\n}\n\nint tls12_ticket_pack_auth_data(tls12_ticket_auth_global_data *global, server_info *server, char *outdata) {\n    int out_size = 32;\n    time_t t = time(NULL);\n    outdata[0] = t >> 24;\n    outdata[1] = t >> 16;\n    outdata[2] = t >> 8;\n    outdata[3] = t;\n    rand_bytes((uint8_t*)outdata + 4, 18);\n\n    uint8_t *key = (uint8_t*)malloc(server->key_len + 32);\n    char hash[ONETIMEAUTH_BYTES * 2];\n    memcpy(key, server->key, server->key_len);\n    memcpy(key + server->key_len, global->local_client_id, 32);\n    ss_sha1_hmac_with_key(hash, outdata, out_size - OBFS_HMAC_SHA1_LEN, key, server->key_len + 32);\n    free(key);\n    memcpy(outdata + out_size - OBFS_HMAC_SHA1_LEN, hash, OBFS_HMAC_SHA1_LEN);\n    return out_size;\n}\n\nvoid tls12_ticket_auth_pack_data(char *encryptdata, int datalength, int start, int len, char *out_buffer, int outlength) {\n    out_buffer[outlength] = 0x17;\n    out_buffer[outlength + 1] = 0x3;\n    out_buffer[outlength + 2] = 0x3;\n    out_buffer[outlength + 3] = len >> 8;\n    out_buffer[outlength + 4] = len;\n    memcpy(out_buffer + outlength + 5, encryptdata + start, len);\n}\n\nint tls12_ticket_auth_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity) {\n    char *encryptdata = *pencryptdata;\n    tls12_ticket_auth_local_data *local = (tls12_ticket_auth_local_data*)self->l_data;\n    tls12_ticket_auth_global_data *global = (tls12_ticket_auth_global_data*)self->server.g_data;\n    char * out_buffer = NULL;\n\n    if (local->handshake_status == 8) {\n        if (datalength < 1024) {\n            if (*capacity < datalength + 5) {\n                *pencryptdata = (char*)realloc(*pencryptdata, *capacity = (datalength + 5) * 2);\n                encryptdata = *pencryptdata;\n            }\n            memmove(encryptdata + 5, encryptdata, datalength);\n            encryptdata[0] = 0x17;\n            encryptdata[1] = 0x3;\n            encryptdata[2] = 0x3;\n            encryptdata[3] = datalength >> 8;\n            encryptdata[4] = datalength;\n            return datalength + 5;\n        } else {\n            out_buffer = (char*)malloc(datalength + 2048);\n            int start = 0;\n            int outlength = 0;\n            int len;\n            while (datalength - start > 2048) {\n                len = xorshift128plus() % 4096 + 100;\n                if (len > datalength - start)\n                    len = datalength - start;\n                tls12_ticket_auth_pack_data(encryptdata, datalength, start, len, out_buffer, outlength);\n                outlength += len + 5;\n                start += len;\n            }\n            if (datalength - start > 0) {\n                len = datalength - start;\n                tls12_ticket_auth_pack_data(encryptdata, datalength, start, len, out_buffer, outlength);\n                outlength += len + 5;\n            }\n            if (*capacity < outlength) {\n                *pencryptdata = (char*)realloc(*pencryptdata, *capacity = outlength * 2);\n                encryptdata = *pencryptdata;\n            }\n            memcpy(encryptdata, out_buffer, outlength);\n            free(out_buffer);\n            return outlength;\n        }\n    }\n    local->send_buffer = (char*)realloc(local->send_buffer, local->send_buffer_size + datalength + 5);\n    memcpy(local->send_buffer + local->send_buffer_size + 5, encryptdata, datalength);\n    local->send_buffer[local->send_buffer_size] = 0x17;\n    local->send_buffer[local->send_buffer_size + 1] = 0x3;\n    local->send_buffer[local->send_buffer_size + 2] = 0x3;\n    local->send_buffer[local->send_buffer_size + 3] = datalength >> 8;\n    local->send_buffer[local->send_buffer_size + 4] = datalength;\n    local->send_buffer_size += datalength + 5;\n\n    if (local->handshake_status == 0) {\n#define CSTR_DECL(name, len, str) const char* name = str; const int len = sizeof(str) - 1;\n        CSTR_DECL(tls_data0, tls_data0_len, \"\\x00\\x1c\\xc0\\x2b\\xc0\\x2f\\xcc\\xa9\\xcc\\xa8\\xcc\\x14\\xcc\\x13\\xc0\\x0a\\xc0\\x14\\xc0\\x09\\xc0\\x13\\x00\\x9c\\x00\\x35\\x00\\x2f\\x00\\x0a\\x01\\x00\"\n                );\n        CSTR_DECL(tls_data1, tls_data1_len, \"\\xff\\x01\\x00\\x01\\x00\"\n                );\n        CSTR_DECL(tls_data2, tls_data2_len, \"\\x00\\x17\\x00\\x00\\x00\\x23\\x00\\xd0\");\n        CSTR_DECL(tls_data3, tls_data3_len, \"\\x00\\x0d\\x00\\x16\\x00\\x14\\x06\\x01\\x06\\x03\\x05\\x01\\x05\\x03\\x04\\x01\\x04\\x03\\x03\\x01\\x03\\x03\\x02\\x01\\x02\\x03\\x00\\x05\\x00\\x05\\x01\\x00\\x00\\x00\\x00\\x00\\x12\\x00\\x00\\x75\\x50\\x00\\x00\\x00\\x0b\\x00\\x02\\x01\\x00\\x00\\x0a\\x00\\x06\\x00\\x04\\x00\\x17\\x00\\x18\"\n                //\"00150066000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\" // padding\n                );\n        uint8_t tls_data[2048];\n        int tls_data_len = 0;\n        memcpy(tls_data, tls_data1, tls_data1_len);\n        tls_data_len += tls_data1_len;\n\n        char hosts[1024];\n        char * phost[128];\n        int host_num = 0;\n        int pos;\n\n        char sni[256] = {0};\n        if (self->server.param && strlen(self->server.param) == 0)\n            self->server.param = NULL;\n        strncpy(hosts, self->server.param ? self->server.param : self->server.host, sizeof hosts);\n        phost[host_num++] = hosts;\n        for (pos = 0; hosts[pos]; ++pos) {\n            if (hosts[pos] == ',') {\n                phost[host_num++] = &hosts[pos + 1];\n            }\n        }\n        host_num = xorshift128plus() % host_num;\n\n        sprintf(sni, \"%s\", phost[host_num]);\n        int sni_len = strlen(sni);\n        if (sni_len > 0 && sni[sni_len - 1] >= '0' && sni[sni_len - 1] <= '9')\n            sni_len = 0;\n        tls_data[tls_data_len] = '\\0';\n        tls_data[tls_data_len + 1] = '\\0';\n        tls_data[tls_data_len + 2] = (sni_len + 5) >> 8;\n        tls_data[tls_data_len + 3] = (sni_len + 5);\n        tls_data[tls_data_len + 4] = (sni_len + 3) >> 8;\n        tls_data[tls_data_len + 5] = (sni_len + 3);\n        tls_data[tls_data_len + 6] = '\\0';\n        tls_data[tls_data_len + 7] = sni_len >> 8;\n        tls_data[tls_data_len + 8] = sni_len;\n        memcpy(tls_data + tls_data_len + 9, sni, sni_len);\n        tls_data_len += 9 + sni_len;\n        memcpy(tls_data + tls_data_len, tls_data2, tls_data2_len);\n        tls_data_len += tls_data2_len;\n        rand_bytes(tls_data + tls_data_len, 208);\n        tls_data_len += 208;\n        memcpy(tls_data + tls_data_len, tls_data3, tls_data3_len);\n        tls_data_len += tls_data3_len;\n\n        datalength = 11 + 32 + 1 + 32 + tls_data0_len + 2 + tls_data_len;\n        out_buffer = (char*)malloc(datalength);\n        char *pdata = out_buffer + datalength - tls_data_len;\n        int len = tls_data_len;\n        memcpy(pdata, tls_data, tls_data_len);\n        pdata[-1] = tls_data_len;\n        pdata[-2] = tls_data_len >> 8;\n        pdata -= 2; len += 2;\n        memcpy(pdata - tls_data0_len, tls_data0, tls_data0_len);\n        pdata -= tls_data0_len; len += tls_data0_len;\n        memcpy(pdata - 32, global->local_client_id, 32);\n        pdata -= 32; len += 32;\n        pdata[-1] = 0x20;\n        pdata -= 1; len += 1;\n        tls12_ticket_pack_auth_data(global, &self->server, pdata - 32);\n        pdata -= 32; len += 32;\n        pdata[-1] = 0x3;\n        pdata[-2] = 0x3; // tls version\n        pdata -= 2; len += 2;\n        pdata[-1] = len;\n        pdata[-2] = len >> 8;\n        pdata[-3] = 0;\n        pdata[-4] = 1;\n        pdata -= 4; len += 4;\n\n        pdata[-1] = len;\n        pdata[-2] = len >> 8;\n        pdata -= 2; len += 2;\n        pdata[-1] = 0x1;\n        pdata[-2] = 0x3; // tls version\n        pdata -= 2; len += 2;\n        pdata[-1] = 0x16; // tls handshake\n        pdata -= 1; len += 1;\n\n        local->handshake_status = 1;\n    } else if (datalength == 0) {\n        datalength = local->send_buffer_size + 43;\n        out_buffer = (char*)malloc(datalength);\n        char *pdata = out_buffer;\n        memcpy(pdata, \"\\x14\\x03\\x03\\x00\\x01\\x01\", 6);\n        pdata += 6;\n        memcpy(pdata, \"\\x16\\x03\\x03\\x00\\x20\", 5);\n        pdata += 5;\n        rand_bytes((uint8_t*)pdata, 22);\n        pdata += 22;\n\n        uint8_t *key = (uint8_t*)malloc(self->server.key_len + 32);\n        char hash[ONETIMEAUTH_BYTES * 2];\n        memcpy(key, self->server.key, self->server.key_len);\n        memcpy(key + self->server.key_len, global->local_client_id, 32);\n        ss_sha1_hmac_with_key(hash, out_buffer, pdata - out_buffer, key, self->server.key_len + 32);\n        free(key);\n        memcpy(pdata, hash, OBFS_HMAC_SHA1_LEN);\n\n        pdata += OBFS_HMAC_SHA1_LEN;\n        memcpy(pdata, local->send_buffer, local->send_buffer_size);\n        free(local->send_buffer);\n        local->send_buffer = NULL;\n\n        local->handshake_status = 8;\n    } else {\n        return 0;\n    }\n    if (*capacity < datalength) {\n        *pencryptdata = (char*)realloc(*pencryptdata, *capacity = datalength * 2);\n        encryptdata = *pencryptdata;\n    }\n    memmove(encryptdata, out_buffer, datalength);\n    free(out_buffer);\n    return datalength;\n}\n\nint tls12_ticket_auth_server_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity) {\n    char *encryptdata = *pencryptdata;\n    tls12_ticket_auth_local_data *local = (tls12_ticket_auth_local_data*)self->l_data;\n    tls12_ticket_auth_global_data *global = (tls12_ticket_auth_global_data*)self->server.g_data;\n    char * out_buffer = NULL;\n\n    if (local->handshake_status == 8) {\n        if (datalength < 1024) {\n            if (*capacity < datalength + 5) {\n                *pencryptdata = (char*)realloc(*pencryptdata, *capacity = (datalength + 5) * 2);\n                encryptdata = *pencryptdata;\n            }\n            memmove(encryptdata + 5, encryptdata, datalength);\n            encryptdata[0] = 0x17;\n            encryptdata[1] = 0x3;\n            encryptdata[2] = 0x3;\n            encryptdata[3] = datalength >> 8;\n            encryptdata[4] = datalength;\n            return datalength + 5;\n        } else {\n            out_buffer = (char*)malloc(datalength + 2048);\n            int start = 0;\n            int outlength = 0;\n            int len;\n            while (datalength - start > 2048) {\n                len = xorshift128plus() % 4096 + 100;\n                if (len > datalength - start)\n                    len = datalength - start;\n                tls12_ticket_auth_pack_data(encryptdata, datalength, start, len, out_buffer, outlength);\n                outlength += len + 5;\n                start += len;\n            }\n            if (datalength - start > 0) {\n                len = datalength - start;\n                tls12_ticket_auth_pack_data(encryptdata, datalength, start, len, out_buffer, outlength);\n                outlength += len + 5;\n            }\n            if (*capacity < outlength) {\n                *pencryptdata = (char*)realloc(*pencryptdata, *capacity = outlength * 2);\n                encryptdata = *pencryptdata;\n            }\n            memcpy(encryptdata, out_buffer, outlength);\n            free(out_buffer);\n            return outlength;\n        }\n    }\n\n    local->handshake_status = 3;\n\n    out_buffer = (char*)malloc(43 + 86);\n    int data_len = 0;\n    char *p_data = out_buffer + 86;\n\n    memcpy(p_data - 10, \"\\xc0\\x2f\\x00\\x00\\x05\\xff\\x01\\x00\\x01\\x00\", 10);\n    p_data -= 10;data_len += 10;\n\n    memcpy(p_data - 32, global->local_client_id, 32);\n    p_data -= 32;data_len += 32;\n\n    p_data[-1] = 0x20;\n    p_data -= 1;data_len += 1;\n\n    tls12_ticket_pack_auth_data(global, &self->server, p_data - 32);\n    p_data -= 32;data_len += 32;\n\n    p_data[-1] = 0x3;\n    p_data[-2] = 0x3; // tls version\n    p_data -= 2;data_len += 2;\n\n    p_data[-1] = data_len;\n    p_data[-2] = data_len >> 8;\n    p_data[-3] = 0x00;\n    p_data[-4] = 0x02;\n    p_data -= 4; data_len += 4;\n\n    p_data[-1] = data_len;\n    p_data[-2] = data_len >> 8;\n    p_data[-3] = 0x03;\n    p_data[-4] = 0x03;\n    p_data[-5] = 0x16;\n    p_data -= 5; data_len += 5;\n\n    memcpy(out_buffer, p_data, data_len);\n    char *pdata = out_buffer + 86;\n\n    memcpy(pdata, \"\\x14\\x03\\x03\\x00\\x01\\x01\", 6);\n    pdata += 6;\n    memcpy(pdata, \"\\x16\\x03\\x03\\x00\\x20\", 5);\n    pdata += 5;\n    rand_bytes((uint8_t*)pdata, 22);\n    pdata += 22;\n\n    uint8_t *key = (uint8_t*)malloc(self->server.key_len + 32);\n    char hash[ONETIMEAUTH_BYTES * 2];\n    memcpy(key, self->server.key, self->server.key_len);\n    memcpy(key + self->server.key_len, global->local_client_id, 32);\n    ss_sha1_hmac_with_key(hash, out_buffer, 43 + 86, key, self->server.key_len + 32);\n    free(key);\n    memcpy(pdata, hash, OBFS_HMAC_SHA1_LEN);\n\n    memmove(encryptdata, out_buffer, 43 + 86);\n    free(out_buffer);\n    return 43 + 86;\n}\n\nint tls12_ticket_auth_client_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback) {\n    char *encryptdata = *pencryptdata;\n    tls12_ticket_auth_local_data *local = (tls12_ticket_auth_local_data*)self->l_data;\n    tls12_ticket_auth_global_data *global = (tls12_ticket_auth_global_data*)self->server.g_data;\n\n    *needsendback = 0;\n\n    if (local->handshake_status == 8) {\n        local->recv_buffer_size += datalength;\n        local->recv_buffer = (char*)realloc(local->recv_buffer, local->recv_buffer_size);\n        memcpy(local->recv_buffer + local->recv_buffer_size - datalength, encryptdata, datalength);\n        datalength = 0;\n        while (local->recv_buffer_size > 5) {\n            if (local->recv_buffer[0] != 0x17)\n                return -1;\n            int size = ((int)(unsigned char)local->recv_buffer[3] << 8) + (unsigned char)local->recv_buffer[4];\n            if (size + 5 > local->recv_buffer_size)\n                break;\n            if (*capacity < datalength + size) {\n                *pencryptdata = (char*)realloc(*pencryptdata, *capacity = (datalength + size) * 2);\n                encryptdata = *pencryptdata;\n            }\n            memcpy(encryptdata + datalength, local->recv_buffer + 5, size);\n            datalength += size;\n            local->recv_buffer_size -= 5 + size;\n            memmove(local->recv_buffer, local->recv_buffer + 5 + size, local->recv_buffer_size);\n        }\n        return datalength;\n    }\n    if (datalength < 11 + 32 + 1 + 32) {\n        return -1;\n    }\n\n    uint8_t *key = (uint8_t*)malloc(self->server.key_len + 32);\n    char hash[ONETIMEAUTH_BYTES * 2];\n    memcpy(key, self->server.key, self->server.key_len);\n    memcpy(key + self->server.key_len, global->local_client_id, 32);\n    ss_sha1_hmac_with_key(hash, encryptdata + 11, 22, key, self->server.key_len + 32);\n    free(key);\n\n    if (memcmp(encryptdata + 33, hash, OBFS_HMAC_SHA1_LEN)) {\n        return -1;\n    }\n\n    *needsendback = 1;\n    return 0;\n}\n\nint tls12_ticket_auth_server_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback) {\n    char *encryptdata = *pencryptdata;\n    tls12_ticket_auth_local_data *local = (tls12_ticket_auth_local_data*)self->l_data;\n    tls12_ticket_auth_global_data *global = (tls12_ticket_auth_global_data*)self->server.g_data;\n\n    *needsendback = 0;\n\n    if (local->handshake_status == 8) {\n        if(datalength != 0)\n        {\n            local->recv_buffer = (char*)realloc(local->recv_buffer, local->recv_buffer_size + datalength);\n            memmove(local->recv_buffer + local->recv_buffer_size, encryptdata, datalength);\n            local->recv_buffer_size += datalength;\n        }\n        datalength = 0;\n\n        while (local->recv_buffer_size > 5) {\n            if (local->recv_buffer[0] != 0x17 || local->recv_buffer[1] != 0x03 || local->recv_buffer[2] != 0x03)\n            {\n                LOGE(\"server_decode data error, wrong tls version 3\");\n                return -1;\n            }\n            int size = ((int)(unsigned char)local->recv_buffer[3] << 8) + (unsigned char)local->recv_buffer[4];\n            if (size + 5 > local->recv_buffer_size)\n                break;\n            if (*capacity < local->recv_buffer_size + size) {\n                *pencryptdata = (char*)realloc(*pencryptdata, *capacity = (local->recv_buffer_size + size) * 2);\n                encryptdata = *pencryptdata;\n            }\n            memcpy(encryptdata + datalength, local->recv_buffer + 5, size);\n            datalength += size;\n            local->recv_buffer_size -= 5 + size;\n            memmove(local->recv_buffer, local->recv_buffer + 5 + size, local->recv_buffer_size);\n        }\n        return datalength;\n    }\n\n    if (local->handshake_status == 3) {\n\n        char *verify = encryptdata;\n\n        if(datalength < 43)\n        {\n            LOGE(\"server_decode data error, too short:%d\", (int)datalength);\n            return -1;\n        }\n\n        if(encryptdata[0] != 0x14 || encryptdata[1] != 0x03 || encryptdata[2] != 0x03 || encryptdata[3] != 0x00 || encryptdata[4] != 0x01 || encryptdata[5] != 0x01)\n        {\n            LOGE(\"server_decode data error, wrong tls version\");\n            return -1;\n        }\n\n        encryptdata += 6;\n\n        if(encryptdata[0] != 0x16 || encryptdata[1] != 0x03 || encryptdata[2] != 0x03 || encryptdata[3] != 0x00 || encryptdata[4] != 0x20)\n        {\n            LOGE(\"server_decode data error, wrong tls version 2\");\n            return -1;\n        }\n\n        uint8_t *key = (uint8_t*)malloc(self->server.key_len + 32);\n        char hash[ONETIMEAUTH_BYTES * 2];\n        memcpy(key, self->server.key, self->server.key_len);\n        memcpy(key + self->server.key_len, global->local_client_id, 32);\n        ss_sha1_hmac_with_key(hash, verify, 33, key, self->server.key_len + 32);\n        free(key);\n\n        if (memcmp(verify + 33, hash, OBFS_HMAC_SHA1_LEN) != 0) {\n            LOGE(\"server_decode data error, hash Mismatch %d\",(int)memcmp(verify + 33, hash, OBFS_HMAC_SHA1_LEN));\n            return -1;\n        }\n\n        local->recv_buffer_size = datalength - 43;\n        local->recv_buffer = (char*)realloc(local->recv_buffer, local->recv_buffer_size);\n        memmove(local->recv_buffer, encryptdata + 37, datalength - 43);\n\n        local->handshake_status = 8;\n        return tls12_ticket_auth_server_decode(self, pencryptdata, 0, capacity, needsendback);\n    }\n\n    local->handshake_status = 2;\n    if(encryptdata[0] != 0x16 || encryptdata[1] != 0x03 || encryptdata[2] != 0x01)\n    {\n        return -1;\n    }\n\n    encryptdata += 3;\n\n    {\n        int size = ((int)(unsigned char)encryptdata[0] << 8) + (unsigned char)encryptdata[1];\n        if(size != datalength - 5)\n        {\n            LOGE(\"tls_auth wrong tls head size\");\n            return -1;\n        }\n    }\n\n    encryptdata += 2;\n\n    if(encryptdata[0] != 0x01 || encryptdata[1] != 0x00)\n    {\n        LOGE(\"tls_auth not client hello message\");\n        return -1;\n    }\n\n    encryptdata += 2;\n\n    {\n        int size = ((int)(unsigned char)encryptdata[0] << 8) + (unsigned char)encryptdata[1];\n        if(size != datalength - 9)\n        {\n            LOGE(\"tls_auth wrong message size\");\n            return -1;\n        }\n    }\n\n    encryptdata += 2;\n\n    if(encryptdata[0] != 0x03 || encryptdata[1] != 0x03)\n    {\n        LOGE(\"tls_auth wrong tls version\");\n        return -1;\n    }\n\n    encryptdata += 2;\n\n    char *verifyid = encryptdata;\n\n    encryptdata += 32;\n\n    int sessionid_len = encryptdata[0];\n    if(sessionid_len < 32)\n    {\n        LOGE(\"tls_auth wrong sessionid_len\");\n        return -1;\n    }\n\n    char *sessionid = encryptdata + 1;\n    memcpy(global->local_client_id , sessionid, sessionid_len);\n\n    uint8_t *key = (uint8_t*)malloc(self->server.key_len + sessionid_len);\n    char hash[ONETIMEAUTH_BYTES * 2];\n    memcpy(key, self->server.key, self->server.key_len);\n    memcpy(key + self->server.key_len, global->local_client_id, sessionid_len);\n    ss_sha1_hmac_with_key(hash, verifyid, 22, key, self->server.key_len + sessionid_len);\n    free(key);\n\n    encryptdata += (sessionid_len + 1);\n\n    long utc_time = ((int)(unsigned char)verifyid[0] << 24) + ((int)(unsigned char)verifyid[1] << 16) + ((int)(unsigned char)verifyid[2] << 8) + (unsigned char)verifyid[3];\n    time_t t = time(NULL);\n\n\n    if (self->server.param && strlen(self->server.param) == 0)\n    {\n        self->server.param = NULL;\n    }\n\n    int max_time_dif = 0;\n    int time_dif = utc_time - t;\n    if(self->server.param)\n    {\n        max_time_dif = atoi(self->server.param);\n    }\n\n    if(max_time_dif > 0 && (time_dif < -max_time_dif || time_dif > max_time_dif || utc_time - global->startup_time < -max_time_dif / 2))\n    {\n        LOGE(\"tls_auth wrong time\");\n        return -1;\n    }\n\n    if (memcmp(verifyid + 22, hash, OBFS_HMAC_SHA1_LEN)) {\n        LOGE(\"tls_auth wrong sha1\");\n        return -1;\n    }\n\n    int search_result = global->client_data->have_same_cmp(global->client_data, verifyid);\n    if(search_result != 0)\n    {\n        LOGE(\"replay attack detect!\");\n        return -1;\n    }\n\n    global->client_data->add_back(global->client_data, verifyid);\n\n    encryptdata += 48;\n\n    *needsendback = 1;\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/tls1.2_ticket.h",
    "content": "/*\n * http_simple.h - Define shadowsocksR server's buffers and callbacks\n *\n * Copyright (C) 2015 - 2016, Break Wa11 <mmgac001@gmail.com>\n */\n\n#ifndef _TLS1_2_TICKET_H\n#define _TLS1_2_TICKET_H\n\nvoid * tls12_ticket_auth_init_data();\nobfs * tls12_ticket_auth_new_obfs();\nvoid tls12_ticket_auth_dispose(obfs *self);\n\nint tls12_ticket_auth_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity);\nint tls12_ticket_auth_client_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback);\n\nint tls12_ticket_auth_server_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity);\nint tls12_ticket_auth_server_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback);\n\n#endif // _TLS1_2_TICKET_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/udprelay.c",
    "content": "/*\n * udprelay.c - Setup UDP relay for both client and server\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <fcntl.h>\n#include <locale.h>\n#include <signal.h>\n#include <string.h>\n#include <strings.h>\n#include <time.h>\n#include <unistd.h>\n\n#ifndef __MINGW32__\n#include <arpa/inet.h>\n#include <errno.h>\n#include <netdb.h>\n#include <netinet/in.h>\n#include <pthread.h>\n#endif\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_NET_IF_H) && defined(__linux__)\n#include <net/if.h>\n#include <sys/ioctl.h>\n#define SET_INTERFACE\n#endif\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#endif\n\n#include <libcork/core.h>\n#include <udns.h>\n\n#include \"utils.h\"\n#include \"netutils.h\"\n#include \"cache.h\"\n#include \"udprelay.h\"\n\n#ifdef MODULE_REMOTE\n#define MAX_UDP_CONN_NUM 512\n#else\n#define MAX_UDP_CONN_NUM 256\n#endif\n\n#ifdef MODULE_REMOTE\n#ifdef MODULE_\n#error \"MODULE_REMOTE and MODULE_LOCAL should not be both defined\"\n#endif\n#endif\n\n#ifndef EAGAIN\n#define EAGAIN EWOULDBLOCK\n#endif\n\n#ifndef EWOULDBLOCK\n#define EWOULDBLOCK EAGAIN\n#endif\n\nstatic void server_recv_cb(EV_P_ ev_io *w, int revents);\nstatic void remote_recv_cb(EV_P_ ev_io *w, int revents);\nstatic void remote_timeout_cb(EV_P_ ev_timer *watcher, int revents);\n\nstatic char *hash_key(const int af, const struct sockaddr_storage *addr);\n#ifdef MODULE_REMOTE\nstatic void query_resolve_cb(struct sockaddr *addr, void *data);\n#endif\nstatic void close_and_free_remote(EV_P_ remote_ctx_t *ctx);\nstatic remote_ctx_t *new_remote(int fd, server_ctx_t *server_ctx);\n\n#ifdef ANDROID\nextern uint64_t tx;\nextern uint64_t rx;\nextern int vpn;\n#endif\n\nextern int verbose;\n#ifdef MODULE_REMOTE\nextern uint64_t tx;\nextern uint64_t rx;\n#endif\n\nstatic int packet_size                               = DEFAULT_PACKET_SIZE;\nstatic int buf_size                                  = DEFAULT_PACKET_SIZE * 2;\nstatic int server_num                                = 0;\nstatic server_ctx_t *server_ctx_list[MAX_REMOTE_NUM] = { NULL };\n\n#ifndef __MINGW32__\nstatic int\nsetnonblocking(int fd)\n{\n    int flags;\n    if (-1 == (flags = fcntl(fd, F_GETFL, 0))) {\n        flags = 0;\n    }\n    return fcntl(fd, F_SETFL, flags | O_NONBLOCK);\n}\n\n#endif\n\n#if defined(MODULE_REMOTE) && defined(SO_BROADCAST)\nstatic int\nset_broadcast(int socket_fd)\n{\n    int opt = 1;\n    return setsockopt(socket_fd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));\n}\n\n#endif\n\n#ifdef SO_NOSIGPIPE\nstatic int\nset_nosigpipe(int socket_fd)\n{\n    int opt = 1;\n    return setsockopt(socket_fd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n}\n\n#endif\n\n#ifdef MODULE_REDIR\n\n#ifndef IP_TRANSPARENT\n#define IP_TRANSPARENT       19\n#endif\n\n#ifndef IP_RECVORIGDSTADDR\n#define IP_RECVORIGDSTADDR   20\n#endif\n\nstatic int\nget_dstaddr(struct msghdr *msg, struct sockaddr_storage *dstaddr)\n{\n    struct cmsghdr *cmsg;\n\n    for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) {\n        if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVORIGDSTADDR) {\n            memcpy(dstaddr, CMSG_DATA(cmsg), sizeof(struct sockaddr_in));\n            dstaddr->ss_family = AF_INET;\n            return 0;\n        } else if (cmsg->cmsg_level == SOL_IPV6 && cmsg->cmsg_type == IP_RECVORIGDSTADDR) {\n            memcpy(dstaddr, CMSG_DATA(cmsg), sizeof(struct sockaddr_in6));\n            dstaddr->ss_family = AF_INET6;\n            return 0;\n        }\n    }\n\n    return 1;\n}\n\n#endif\n\n#define HASH_KEY_LEN sizeof(struct sockaddr_storage) + sizeof(int)\nstatic char *\nhash_key(const int af, const struct sockaddr_storage *addr)\n{\n    size_t addr_len = sizeof(struct sockaddr_storage);\n    static char key[HASH_KEY_LEN];\n\n    memset(key, 0, HASH_KEY_LEN);\n    memcpy(key, &af, sizeof(int));\n    memcpy(key + sizeof(int), (const uint8_t *)addr, addr_len);\n\n    return key;\n}\n\n#if defined(MODULE_REDIR) || defined(MODULE_REMOTE)\nstatic int\nconstruct_udprealy_header(const struct sockaddr_storage *in_addr,\n                          char *addr_header)\n{\n    int addr_header_len = 0;\n    if (in_addr->ss_family == AF_INET) {\n        struct sockaddr_in *addr = (struct sockaddr_in *)in_addr;\n        size_t addr_len          = sizeof(struct in_addr);\n        addr_header[addr_header_len++] = 1;\n        memcpy(addr_header + addr_header_len, &addr->sin_addr, addr_len);\n        addr_header_len += addr_len;\n        memcpy(addr_header + addr_header_len, &addr->sin_port, 2);\n        addr_header_len += 2;\n    } else if (in_addr->ss_family == AF_INET6) {\n        struct sockaddr_in6 *addr = (struct sockaddr_in6 *)in_addr;\n        size_t addr_len           = sizeof(struct in6_addr);\n        addr_header[addr_header_len++] = 4;\n        memcpy(addr_header + addr_header_len, &addr->sin6_addr, addr_len);\n        addr_header_len += addr_len;\n        memcpy(addr_header + addr_header_len, &addr->sin6_port, 2);\n        addr_header_len += 2;\n    } else {\n        return 0;\n    }\n    return addr_header_len;\n}\n\n#endif\n\nstatic int\nparse_udprealy_header(const char *buf, const size_t buf_len,\n                      char *host, char *port, struct sockaddr_storage *storage)\n{\n    const uint8_t atyp = *(uint8_t *)buf;\n    int offset         = 1;\n\n    // get remote addr and port\n    if ((atyp & ADDRTYPE_MASK) == 1) {\n        // IP V4\n        size_t in_addr_len = sizeof(struct in_addr);\n        if (buf_len >= in_addr_len + 3) {\n            if (storage != NULL) {\n                struct sockaddr_in *addr = (struct sockaddr_in *)storage;\n                addr->sin_family = AF_INET;\n                addr->sin_addr   = *(struct in_addr *)(buf + offset);\n                addr->sin_port   = *(uint16_t *)(buf + offset + in_addr_len);\n            }\n            if (host != NULL) {\n                dns_ntop(AF_INET, (const void *)(buf + offset),\n                         host, INET_ADDRSTRLEN);\n            }\n            offset += in_addr_len;\n        }\n    } else if ((atyp & ADDRTYPE_MASK) == 3) {\n        // Domain name\n        uint8_t name_len = *(uint8_t *)(buf + offset);\n        if (name_len + 4 <= buf_len) {\n            if (storage != NULL) {\n                char tmp[257] = { 0 };\n                struct cork_ip ip;\n                memcpy(tmp, buf + offset + 1, name_len);\n                if (cork_ip_init(&ip, tmp) != -1) {\n                    if (ip.version == 4) {\n                        struct sockaddr_in *addr = (struct sockaddr_in *)storage;\n                        dns_pton(AF_INET, tmp, &(addr->sin_addr));\n                        addr->sin_port   = *(uint16_t *)(buf + offset + 1 + name_len);\n                        addr->sin_family = AF_INET;\n                    } else if (ip.version == 6) {\n                        struct sockaddr_in6 *addr = (struct sockaddr_in6 *)storage;\n                        dns_pton(AF_INET, tmp, &(addr->sin6_addr));\n                        addr->sin6_port   = *(uint16_t *)(buf + offset + 1 + name_len);\n                        addr->sin6_family = AF_INET6;\n                    }\n                }\n            }\n            if (host != NULL) {\n                memcpy(host, buf + offset + 1, name_len);\n            }\n            offset += 1 + name_len;\n        }\n    } else if ((atyp & ADDRTYPE_MASK) == 4) {\n        // IP V6\n        size_t in6_addr_len = sizeof(struct in6_addr);\n        if (buf_len >= in6_addr_len + 3) {\n            if (storage != NULL) {\n                struct sockaddr_in6 *addr = (struct sockaddr_in6 *)storage;\n                addr->sin6_family = AF_INET6;\n                addr->sin6_addr   = *(struct in6_addr *)(buf + offset);\n                addr->sin6_port   = *(uint16_t *)(buf + offset + in6_addr_len);\n            }\n            if (host != NULL) {\n                dns_ntop(AF_INET6, (const void *)(buf + offset),\n                         host, INET6_ADDRSTRLEN);\n            }\n            offset += in6_addr_len;\n        }\n    }\n\n    if (offset == 1) {\n        LOGE(\"[udp] invalid header with addr type %d\", atyp);\n        return 0;\n    }\n\n    if (port != NULL) {\n        sprintf(port, \"%d\", ntohs(*(uint16_t *)(buf + offset)));\n    }\n    offset += 2;\n\n    return offset;\n}\n\nstatic char *\nget_addr_str(const struct sockaddr *sa)\n{\n    static char s[SS_ADDRSTRLEN];\n    memset(s, 0, SS_ADDRSTRLEN);\n    char addr[INET6_ADDRSTRLEN] = { 0 };\n    char port[PORTSTRLEN]       = { 0 };\n    uint16_t p;\n\n    switch (sa->sa_family) {\n    case AF_INET:\n        dns_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr),\n                 addr, INET_ADDRSTRLEN);\n        p = ntohs(((struct sockaddr_in *)sa)->sin_port);\n        sprintf(port, \"%d\", p);\n        break;\n\n    case AF_INET6:\n        dns_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr),\n                 addr, INET6_ADDRSTRLEN);\n        p = ntohs(((struct sockaddr_in *)sa)->sin_port);\n        sprintf(port, \"%d\", p);\n        break;\n\n    default:\n        strncpy(s, \"Unknown AF\", SS_ADDRSTRLEN);\n    }\n\n    int addr_len = strlen(addr);\n    int port_len = strlen(port);\n    memcpy(s, addr, addr_len);\n    memcpy(s + addr_len + 1, port, port_len);\n    s[addr_len] = ':';\n\n    return s;\n}\n\nint\ncreate_remote_socket(int ipv6)\n{\n    int remote_sock;\n\n    if (ipv6) {\n        // Try to bind IPv6 first\n        struct sockaddr_in6 addr;\n        memset(&addr, 0, sizeof(struct sockaddr_in6));\n        addr.sin6_family = AF_INET6;\n        addr.sin6_addr   = in6addr_any;\n        addr.sin6_port   = 0;\n        remote_sock      = socket(AF_INET6, SOCK_DGRAM, 0);\n        if (remote_sock == -1) {\n            ERROR(\"[udp] cannot create socket\");\n            return -1;\n        }\n        if (bind(remote_sock, (struct sockaddr *)&addr, sizeof(addr)) != 0) {\n            FATAL(\"[udp] cannot bind remote\");\n            return -1;\n        }\n    } else {\n        // Or else bind to IPv4\n        struct sockaddr_in addr;\n        memset(&addr, 0, sizeof(struct sockaddr_in));\n        addr.sin_family      = AF_INET;\n        addr.sin_addr.s_addr = INADDR_ANY;\n        addr.sin_port        = 0;\n        remote_sock          = socket(AF_INET, SOCK_DGRAM, 0);\n        if (remote_sock == -1) {\n            ERROR(\"[udp] cannot create socket\");\n            return -1;\n        }\n\n        if (bind(remote_sock, (struct sockaddr *)&addr, sizeof(addr)) != 0) {\n            FATAL(\"[udp] cannot bind remote\");\n            return -1;\n        }\n    }\n    return remote_sock;\n}\n\nint\ncreate_server_socket(const char *host, const char *port)\n{\n    struct addrinfo hints;\n    struct addrinfo *result, *rp, *ipv4v6bindall;\n    int s, server_sock;\n\n    memset(&hints, 0, sizeof(struct addrinfo));\n    hints.ai_family   = AF_UNSPEC;               /* Return IPv4 and IPv6 choices */\n    hints.ai_socktype = SOCK_DGRAM;              /* We want a UDP socket */\n    hints.ai_flags    = AI_PASSIVE | AI_ADDRCONFIG; /* For wildcard IP address */\n    hints.ai_protocol = IPPROTO_UDP;\n\n    s = getaddrinfo(host, port, &hints, &result);\n    if (s != 0) {\n        LOGE(\"[udp] getaddrinfo: %s\", gai_strerror(s));\n        return -1;\n    }\n\n    rp = result;\n\n    /*\n     * On Linux, with net.ipv6.bindv6only = 0 (the default), getaddrinfo(NULL) with\n     * AI_PASSIVE returns 0.0.0.0 and :: (in this order). AI_PASSIVE was meant to\n     * return a list of addresses to listen on, but it is impossible to listen on\n     * 0.0.0.0 and :: at the same time, if :: implies dualstack mode.\n     */\n    if (!host) {\n        ipv4v6bindall = result;\n\n        /* Loop over all address infos found until a IPV6 address is found. */\n        while (ipv4v6bindall) {\n            if (ipv4v6bindall->ai_family == AF_INET6) {\n                rp = ipv4v6bindall; /* Take first IPV6 address available */\n                break;\n            }\n            ipv4v6bindall = ipv4v6bindall->ai_next; /* Get next address info, if any */\n        }\n    }\n\n    for (/*rp = result*/; rp != NULL; rp = rp->ai_next) {\n        server_sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);\n        if (server_sock == -1) {\n            continue;\n        }\n\n        if (rp->ai_family == AF_INET6) {\n            int ipv6only = host ? 1 : 0;\n            setsockopt(server_sock, IPPROTO_IPV6, IPV6_V6ONLY, &ipv6only, sizeof(ipv6only));\n        }\n\n        int opt = 1;\n        setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));\n#ifdef SO_NOSIGPIPE\n        set_nosigpipe(server_sock);\n#endif\n        int err = set_reuseport(server_sock);\n        if (err == 0) {\n            LOGI(\"udp port reuse enabled\");\n        }\n#ifdef IP_TOS\n        // Set QoS flag\n        int tos = 46;\n        setsockopt(server_sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));\n#endif\n\n#ifdef MODULE_REDIR\n        if (setsockopt(server_sock, SOL_IP, IP_TRANSPARENT, &opt, sizeof(opt))) {\n            ERROR(\"[udp] setsockopt IP_TRANSPARENT\");\n            exit(EXIT_FAILURE);\n        }\n        if (setsockopt(server_sock, IPPROTO_IP, IP_RECVORIGDSTADDR, &opt, sizeof(opt))) {\n            FATAL(\"[udp] setsockopt IP_RECVORIGDSTADDR\");\n        }\n#endif\n\n        s = bind(server_sock, rp->ai_addr, rp->ai_addrlen);\n        if (s == 0) {\n            /* We managed to bind successfully! */\n            break;\n        } else {\n            ERROR(\"[udp] bind\");\n        }\n\n        close(server_sock);\n    }\n\n    if (rp == NULL) {\n        LOGE(\"[udp] cannot bind\");\n        return -1;\n    }\n\n    freeaddrinfo(result);\n\n    return server_sock;\n}\n\nremote_ctx_t *\nnew_remote(int fd, server_ctx_t *server_ctx)\n{\n    remote_ctx_t *ctx = ss_malloc(sizeof(remote_ctx_t));\n    memset(ctx, 0, sizeof(remote_ctx_t));\n\n    ctx->fd         = fd;\n    ctx->server_ctx = server_ctx;\n\n    ev_io_init(&ctx->io, remote_recv_cb, fd, EV_READ);\n    ev_timer_init(&ctx->watcher, remote_timeout_cb, server_ctx->timeout,\n                  server_ctx->timeout);\n\n    return ctx;\n}\n\nserver_ctx_t *\nnew_server_ctx(int fd)\n{\n    server_ctx_t *ctx = ss_malloc(sizeof(server_ctx_t));\n    memset(ctx, 0, sizeof(server_ctx_t));\n\n    ctx->fd = fd;\n\n    ev_io_init(&ctx->io, server_recv_cb, fd, EV_READ);\n\n    return ctx;\n}\n\n#ifdef MODULE_REMOTE\nstruct query_ctx *\nnew_query_ctx(char *buf, size_t len)\n{\n    struct query_ctx *ctx = ss_malloc(sizeof(struct query_ctx));\n    memset(ctx, 0, sizeof(struct query_ctx));\n    ctx->buf = ss_malloc(sizeof(buffer_t));\n    balloc(ctx->buf, len);\n    memcpy(ctx->buf->array, buf, len);\n    ctx->buf->len = len;\n    return ctx;\n}\n\nvoid\nclose_and_free_query(EV_P_ struct query_ctx *ctx)\n{\n    if (ctx != NULL) {\n        if (ctx->query != NULL) {\n            resolv_cancel(ctx->query);\n            ctx->query = NULL;\n        }\n        if (ctx->buf != NULL) {\n            bfree(ctx->buf);\n            ss_free(ctx->buf);\n        }\n        ss_free(ctx);\n    }\n}\n\n#endif\n\nvoid\nclose_and_free_remote(EV_P_ remote_ctx_t *ctx)\n{\n    if (ctx != NULL) {\n        ev_timer_stop(EV_A_ & ctx->watcher);\n        ev_io_stop(EV_A_ & ctx->io);\n        close(ctx->fd);\n        ss_free(ctx);\n    }\n}\n\nstatic void\nremote_timeout_cb(EV_P_ ev_timer *watcher, int revents)\n{\n    remote_ctx_t *remote_ctx\n        = cork_container_of(watcher, remote_ctx_t, watcher);\n\n    if (verbose) {\n        LOGI(\"[udp] connection timeout\");\n    }\n\n    char *key = hash_key(remote_ctx->af, &remote_ctx->src_addr);\n    cache_remove(remote_ctx->server_ctx->conn_cache, key, HASH_KEY_LEN);\n}\n\n#ifdef MODULE_REMOTE\nstatic void\nquery_resolve_cb(struct sockaddr *addr, void *data)\n{\n    struct query_ctx *query_ctx = (struct query_ctx *)data;\n    struct ev_loop *loop        = query_ctx->server_ctx->loop;\n\n    if (verbose) {\n        LOGI(\"[udp] udns resolved\");\n    }\n\n    query_ctx->query = NULL;\n\n    if (addr == NULL) {\n        LOGE(\"[udp] udns returned an error\");\n    } else {\n        remote_ctx_t *remote_ctx = query_ctx->remote_ctx;\n        int cache_hit            = 0;\n\n        // Lookup in the conn cache\n        if (remote_ctx == NULL) {\n            char *key = hash_key(AF_UNSPEC, &query_ctx->src_addr);\n            cache_lookup(query_ctx->server_ctx->conn_cache, key, HASH_KEY_LEN, (void *)&remote_ctx);\n        }\n\n        if (remote_ctx == NULL) {\n            int remotefd = create_remote_socket(addr->sa_family == AF_INET6);\n            if (remotefd != -1) {\n                setnonblocking(remotefd);\n#ifdef SO_BROADCAST\n                set_broadcast(remotefd);\n#endif\n#ifdef SO_NOSIGPIPE\n                set_nosigpipe(remotefd);\n#endif\n#ifdef IP_TOS\n                // Set QoS flag\n                int tos = 46;\n                setsockopt(remotefd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));\n#endif\n#ifdef SET_INTERFACE\n                if (query_ctx->server_ctx->iface) {\n                    if (setinterface(remotefd, query_ctx->server_ctx->iface) == -1)\n                        ERROR(\"setinterface\");\n                }\n#endif\n                remote_ctx                  = new_remote(remotefd, query_ctx->server_ctx);\n                remote_ctx->src_addr        = query_ctx->src_addr;\n                remote_ctx->server_ctx      = query_ctx->server_ctx;\n                remote_ctx->addr_header_len = query_ctx->addr_header_len;\n                memcpy(remote_ctx->addr_header, query_ctx->addr_header,\n                       query_ctx->addr_header_len);\n            } else {\n                ERROR(\"[udp] bind() error\");\n            }\n        } else {\n            cache_hit = 1;\n        }\n\n        if (remote_ctx != NULL) {\n            memcpy(&remote_ctx->dst_addr, addr, sizeof(struct sockaddr_storage));\n\n            size_t addr_len = get_sockaddr_len(addr);\n            int s           = sendto(remote_ctx->fd, query_ctx->buf->array, query_ctx->buf->len,\n                                     0, addr, addr_len);\n\n            if (s == -1) {\n                ERROR(\"[udp] sendto_remote\");\n                if (!cache_hit) {\n                    close_and_free_remote(EV_A_ remote_ctx);\n                }\n            } else {\n                if (!cache_hit) {\n                    // Add to conn cache\n                    char *key = hash_key(AF_UNSPEC, &remote_ctx->src_addr);\n                    cache_insert(query_ctx->server_ctx->conn_cache, key, HASH_KEY_LEN, (void *)remote_ctx);\n                    ev_io_start(EV_A_ & remote_ctx->io);\n                    ev_timer_start(EV_A_ & remote_ctx->watcher);\n                }\n            }\n        }\n    }\n\n    // clean up\n    close_and_free_query(EV_A_ query_ctx);\n}\n\n#endif\n\nstatic void\nremote_recv_cb(EV_P_ ev_io *w, int revents)\n{\n    ssize_t r;\n    remote_ctx_t *remote_ctx = (remote_ctx_t *)w;\n    server_ctx_t *server_ctx = remote_ctx->server_ctx;\n\n    // server has been closed\n    if (server_ctx == NULL) {\n        LOGE(\"[udp] invalid server\");\n        close_and_free_remote(EV_A_ remote_ctx);\n        return;\n    }\n\n    struct sockaddr_storage src_addr;\n    socklen_t src_addr_len = sizeof(struct sockaddr_storage);\n    memset(&src_addr, 0, src_addr_len);\n\n    buffer_t *buf = ss_malloc(sizeof(buffer_t));\n    balloc(buf, buf_size);\n\n    // recv\n    r = recvfrom(remote_ctx->fd, buf->array, buf_size, 0, (struct sockaddr *)&src_addr, &src_addr_len);\n\n    if (r == -1) {\n        // error on recv\n        // simply drop that packet\n        ERROR(\"[udp] remote_recv_recvfrom\");\n        goto CLEAN_UP;\n    } else if (r > packet_size) {\n        LOGE(\"[udp] remote_recv_recvfrom fragmentation\");\n        goto CLEAN_UP;\n    }\n\n    buf->len = r;\n\n#ifdef MODULE_LOCAL\n    int err = ss_decrypt_all(buf, server_ctx->method, 0, buf_size);\n    if (err) {\n        // drop the packet silently\n        goto CLEAN_UP;\n    }\n\n    //SSR beg\n    if (server_ctx->protocol_plugin) {\n        obfs_class *protocol_plugin = server_ctx->protocol_plugin;\n        if (protocol_plugin->client_udp_post_decrypt) {\n            buf->len = protocol_plugin->client_udp_post_decrypt(server_ctx->protocol, &buf->array, buf->len, &buf->capacity);\n            if ((int)buf->len < 0) {\n                LOGE(\"client_udp_post_decrypt\");\n                close_and_free_remote(EV_A_ remote_ctx);\n                return;\n            }\n            if ( buf->len == 0 )\n                return;\n        }\n    }\n    // SSR end\n\n#ifdef MODULE_REDIR\n    struct sockaddr_storage dst_addr;\n    memset(&dst_addr, 0, sizeof(struct sockaddr_storage));\n    int len = parse_udprealy_header(buf->array, buf->len, NULL, NULL, &dst_addr);\n\n    if (dst_addr.ss_family != AF_INET && dst_addr.ss_family != AF_INET6) {\n        LOGI(\"[udp] ss-redir does not support domain name\");\n        goto CLEAN_UP;\n    }\n\n    if (verbose) {\n        char src[SS_ADDRSTRLEN];\n        char dst[SS_ADDRSTRLEN];\n        strcpy(src, get_addr_str((struct sockaddr *)&src_addr));\n        strcpy(dst, get_addr_str((struct sockaddr *)&dst_addr));\n        LOGI(\"[udp] recv %s via %s\", dst, src);\n    }\n#else\n    int len = parse_udprealy_header(buf->array, buf->len, NULL, NULL, NULL);\n#endif\n\n    if (len == 0) {\n        LOGI(\"[udp] error in parse header\");\n        // error in parse header\n        goto CLEAN_UP;\n    }\n\n    // server may return using a different address type other than the type we\n    // have used during sending\n#if defined(MODULE_TUNNEL) || defined(MODULE_REDIR)\n    // Construct packet\n    buf->len -= len;\n    memmove(buf->array, buf->array + len, buf->len);\n#else\n#ifdef ANDROID\n    rx += buf->len;\n#endif\n    // Construct packet\n    brealloc(buf, buf->len + 3, buf_size);\n    memmove(buf->array + 3, buf->array, buf->len);\n    memset(buf->array, 0, 3);\n    buf->len += 3;\n#endif\n\n#endif\n\n#ifdef MODULE_REMOTE\n\n    rx += buf->len;\n\n    char addr_header_buf[512];\n    char *addr_header   = remote_ctx->addr_header;\n    int addr_header_len = remote_ctx->addr_header_len;\n\n    if (remote_ctx->af == AF_INET || remote_ctx->af == AF_INET6) {\n        addr_header_len = construct_udprealy_header(&src_addr, addr_header_buf);\n        addr_header     = addr_header_buf;\n    }\n\n    // Construct packet\n    brealloc(buf, buf->len + addr_header_len, buf_size);\n    memmove(buf->array + addr_header_len, buf->array, buf->len);\n    memcpy(buf->array, addr_header, addr_header_len);\n    buf->len += addr_header_len;\n\n    int err = ss_encrypt_all(buf, server_ctx->method, 0, buf_size);\n    if (err) {\n        // drop the packet silently\n        goto CLEAN_UP;\n    }\n\n#endif\n\n    if (buf->len > packet_size) {\n        LOGE(\"[udp] remote_recv_sendto fragmentation\");\n        goto CLEAN_UP;\n    }\n\n    size_t remote_src_addr_len = get_sockaddr_len((struct sockaddr *)&remote_ctx->src_addr);\n\n#ifdef MODULE_REDIR\n\n    size_t remote_dst_addr_len = get_sockaddr_len((struct sockaddr *)&dst_addr);\n\n    int src_fd = socket(remote_ctx->src_addr.ss_family, SOCK_DGRAM, 0);\n    if (src_fd < 0) {\n        ERROR(\"[udp] remote_recv_socket\");\n        goto CLEAN_UP;\n    }\n    int opt = 1;\n    if (setsockopt(src_fd, SOL_IP, IP_TRANSPARENT, &opt, sizeof(opt))) {\n        ERROR(\"[udp] remote_recv_setsockopt\");\n        close(src_fd);\n        goto CLEAN_UP;\n    }\n    if (setsockopt(src_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {\n        ERROR(\"[udp] remote_recv_setsockopt\");\n        close(src_fd);\n        goto CLEAN_UP;\n    }\n#ifdef IP_TOS\n    // Set QoS flag\n    int tos = 46;\n    setsockopt(src_fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));\n#endif\n    if (bind(src_fd, (struct sockaddr *)&dst_addr, remote_dst_addr_len) != 0) {\n        ERROR(\"[udp] remote_recv_bind\");\n        close(src_fd);\n        goto CLEAN_UP;\n    }\n\n    int s = sendto(src_fd, buf->array, buf->len, 0,\n                   (struct sockaddr *)&remote_ctx->src_addr, remote_src_addr_len);\n    if (s == -1) {\n        ERROR(\"[udp] remote_recv_sendto\");\n        close(src_fd);\n        goto CLEAN_UP;\n    }\n    close(src_fd);\n\n#else\n\n    int s = sendto(server_ctx->fd, buf->array, buf->len, 0,\n                   (struct sockaddr *)&remote_ctx->src_addr, remote_src_addr_len);\n    if (s == -1) {\n        ERROR(\"[udp] remote_recv_sendto\");\n        goto CLEAN_UP;\n    }\n\n#endif\n\n    // handle the UDP packet successfully,\n    // triger the timer\n    ev_timer_again(EV_A_ & remote_ctx->watcher);\n\nCLEAN_UP:\n\n    bfree(buf);\n    ss_free(buf);\n}\n\nstatic void\nserver_recv_cb(EV_P_ ev_io *w, int revents)\n{\n    server_ctx_t *server_ctx = (server_ctx_t *)w;\n    struct sockaddr_storage src_addr;\n    memset(&src_addr, 0, sizeof(struct sockaddr_storage));\n\n    buffer_t *buf = ss_malloc(sizeof(buffer_t));\n    balloc(buf, buf_size);\n\n    socklen_t src_addr_len = sizeof(struct sockaddr_storage);\n    unsigned int offset    = 0;\n\n#ifdef MODULE_REDIR\n    char control_buffer[64] = { 0 };\n    struct msghdr msg;\n    memset(&msg, 0, sizeof(struct msghdr));\n    struct iovec iov[1];\n    struct sockaddr_storage dst_addr;\n    memset(&dst_addr, 0, sizeof(struct sockaddr_storage));\n\n    msg.msg_name       = &src_addr;\n    msg.msg_namelen    = src_addr_len;\n    msg.msg_control    = control_buffer;\n    msg.msg_controllen = sizeof(control_buffer);\n\n    iov[0].iov_base = buf->array;\n    iov[0].iov_len  = buf_size;\n    msg.msg_iov     = iov;\n    msg.msg_iovlen  = 1;\n\n    buf->len = recvmsg(server_ctx->fd, &msg, 0);\n    if (buf->len == -1) {\n        ERROR(\"[udp] server_recvmsg\");\n        goto CLEAN_UP;\n    } else if (buf->len > packet_size) {\n        ERROR(\"[udp] UDP server_recv_recvmsg fragmentation\");\n        goto CLEAN_UP;\n    }\n\n    if (get_dstaddr(&msg, &dst_addr)) {\n        LOGE(\"[udp] unable to get dest addr\");\n        goto CLEAN_UP;\n    }\n\n    src_addr_len = msg.msg_namelen;\n#else\n    ssize_t r;\n    r = recvfrom(server_ctx->fd, buf->array, buf_size,\n                 0, (struct sockaddr *)&src_addr, &src_addr_len);\n\n    if (r == -1) {\n        // error on recv\n        // simply drop that packet\n        ERROR(\"[udp] server_recv_recvfrom\");\n        goto CLEAN_UP;\n    } else if (r > packet_size) {\n        ERROR(\"[udp] server_recv_recvfrom fragmentation\");\n        goto CLEAN_UP;\n    }\n\n    buf->len = r;\n#endif\n\n#ifdef MODULE_REMOTE\n    tx += buf->len;\n\n    int err = ss_decrypt_all(buf, server_ctx->method, server_ctx->auth, buf_size);\n    if (err) {\n        // drop the packet silently\n        goto CLEAN_UP;\n    }\n#endif\n\n#ifdef MODULE_LOCAL\n#if !defined(MODULE_TUNNEL) && !defined(MODULE_REDIR)\n#ifdef ANDROID\n    tx += buf->len;\n#endif\n    uint8_t frag = *(uint8_t *)(buf->array + 2);\n    offset += 3;\n#endif\n#endif\n\n    /*\n     *\n     * SOCKS5 UDP Request\n     * +----+------+------+----------+----------+----------+\n     * |RSV | FRAG | ATYP | DST.ADDR | DST.PORT |   DATA   |\n     * +----+------+------+----------+----------+----------+\n     * | 2  |  1   |  1   | Variable |    2     | Variable |\n     * +----+------+------+----------+----------+----------+\n     *\n     * SOCKS5 UDP Response\n     * +----+------+------+----------+----------+----------+\n     * |RSV | FRAG | ATYP | DST.ADDR | DST.PORT |   DATA   |\n     * +----+------+------+----------+----------+----------+\n     * | 2  |  1   |  1   | Variable |    2     | Variable |\n     * +----+------+------+----------+----------+----------+\n     *\n     * shadowsocks UDP Request (before encrypted)\n     * +------+----------+----------+----------+-------------+\n     * | ATYP | DST.ADDR | DST.PORT |   DATA   |  HMAC-SHA1  |\n     * +------+----------+----------+----------+-------------+\n     * |  1   | Variable |    2     | Variable |     10      |\n     * +------+----------+----------+----------+-------------+\n     *\n     * If ATYP & ONETIMEAUTH_FLAG(0x10) != 0, Authentication (HMAC-SHA1) is enabled.\n     *\n     * The key of HMAC-SHA1 is (IV + KEY) and the input is the whole packet.\n     * The output of HMAC-SHA is truncated to 10 bytes (leftmost bits).\n     *\n     * shadowsocks UDP Response (before encrypted)\n     * +------+----------+----------+----------+\n     * | ATYP | DST.ADDR | DST.PORT |   DATA   |\n     * +------+----------+----------+----------+\n     * |  1   | Variable |    2     | Variable |\n     * +------+----------+----------+----------+\n     *\n     * shadowsocks UDP Request and Response (after encrypted)\n     * +-------+--------------+\n     * |   IV  |    PAYLOAD   |\n     * +-------+--------------+\n     * | Fixed |   Variable   |\n     * +-------+--------------+\n     *\n     */\n\n#ifdef MODULE_REDIR\n    if (verbose) {\n        char src[SS_ADDRSTRLEN];\n        char dst[SS_ADDRSTRLEN];\n        strcpy(src, get_addr_str((struct sockaddr *)&src_addr));\n        strcpy(dst, get_addr_str((struct sockaddr *)&dst_addr));\n        LOGI(\"[udp] redir to %s from %s\", dst, src);\n    }\n\n    char addr_header[512] = { 0 };\n    int addr_header_len   = construct_udprealy_header(&dst_addr, addr_header);\n\n    if (addr_header_len == 0) {\n        LOGE(\"[udp] failed to parse tproxy addr\");\n        goto CLEAN_UP;\n    }\n\n    // reconstruct the buffer\n    brealloc(buf, buf->len + addr_header_len, buf_size);\n    memmove(buf->array + addr_header_len, buf->array, buf->len);\n    memcpy(buf->array, addr_header, addr_header_len);\n    buf->len += addr_header_len;\n\n#elif MODULE_TUNNEL\n\n    char addr_header[512] = { 0 };\n    char *host            = server_ctx->tunnel_addr.host;\n    char *port            = server_ctx->tunnel_addr.port;\n    uint16_t port_num     = (uint16_t)atoi(port);\n    uint16_t port_net_num = htons(port_num);\n    int addr_header_len   = 0;\n\n    struct cork_ip ip;\n    if (cork_ip_init(&ip, host) != -1) {\n        if (ip.version == 4) {\n            // send as IPv4\n            struct in_addr host_addr;\n            memset(&host_addr, 0, sizeof(struct in_addr));\n            int host_len = sizeof(struct in_addr);\n\n            if (dns_pton(AF_INET, host, &host_addr) == -1) {\n                FATAL(\"IP parser error\");\n            }\n            addr_header[addr_header_len++] = 1;\n            memcpy(addr_header + addr_header_len, &host_addr, host_len);\n            addr_header_len += host_len;\n        } else if (ip.version == 6) {\n            // send as IPv6\n            struct in6_addr host_addr;\n            memset(&host_addr, 0, sizeof(struct in6_addr));\n            int host_len = sizeof(struct in6_addr);\n\n            if (dns_pton(AF_INET6, host, &host_addr) == -1) {\n                FATAL(\"IP parser error\");\n            }\n            addr_header[addr_header_len++] = 4;\n            memcpy(addr_header + addr_header_len, &host_addr, host_len);\n            addr_header_len += host_len;\n        } else {\n            FATAL(\"IP parser error\");\n        }\n    } else {\n        // send as domain\n        int host_len = strlen(host);\n\n        addr_header[addr_header_len++] = 3;\n        addr_header[addr_header_len++] = host_len;\n        memcpy(addr_header + addr_header_len, host, host_len);\n        addr_header_len += host_len;\n    }\n    memcpy(addr_header + addr_header_len, &port_net_num, 2);\n    addr_header_len += 2;\n\n    // reconstruct the buffer\n    brealloc(buf, buf->len + addr_header_len, buf_size);\n    memmove(buf->array + addr_header_len, buf->array, buf->len);\n    memcpy(buf->array, addr_header, addr_header_len);\n    buf->len += addr_header_len;\n\n#else\n\n    char host[257] = { 0 };\n    char port[64]  = { 0 };\n    struct sockaddr_storage dst_addr;\n    memset(&dst_addr, 0, sizeof(struct sockaddr_storage));\n\n    int addr_header_len = parse_udprealy_header(buf->array + offset, buf->len - offset,\n                                                host, port, &dst_addr);\n    if (addr_header_len == 0) {\n        // error in parse header\n        goto CLEAN_UP;\n    }\n\n    char *addr_header = buf->array + offset;\n#endif\n\n#ifdef MODULE_LOCAL\n    char *key = hash_key(server_ctx->remote_addr->sa_family, &src_addr);\n#else\n    char *key = hash_key(dst_addr.ss_family, &src_addr);\n#endif\n\n    struct cache *conn_cache = server_ctx->conn_cache;\n\n    remote_ctx_t *remote_ctx = NULL;\n    cache_lookup(conn_cache, key, HASH_KEY_LEN, (void *)&remote_ctx);\n\n    if (remote_ctx != NULL) {\n        if (sockaddr_cmp(&src_addr, &remote_ctx->src_addr, sizeof(src_addr))) {\n            remote_ctx = NULL;\n        }\n    }\n\n    // reset the timer\n    if (remote_ctx != NULL) {\n        ev_timer_again(EV_A_ & remote_ctx->watcher);\n    }\n\n    if (remote_ctx == NULL) {\n        if (verbose) {\n#ifdef MODULE_REDIR\n            char src[SS_ADDRSTRLEN];\n            char dst[SS_ADDRSTRLEN];\n            strcpy(src, get_addr_str((struct sockaddr *)&src_addr));\n            strcpy(dst, get_addr_str((struct sockaddr *)&dst_addr));\n            LOGI(\"[udp] cache miss: %s <-> %s\", dst, src);\n#else\n            LOGI(\"[udp] cache miss: %s:%s <-> %s\", host, port,\n                 get_addr_str((struct sockaddr *)&src_addr));\n#endif\n        }\n    } else {\n        if (verbose) {\n#ifdef MODULE_REDIR\n            char src[SS_ADDRSTRLEN];\n            char dst[SS_ADDRSTRLEN];\n            strcpy(src, get_addr_str((struct sockaddr *)&src_addr));\n            strcpy(dst, get_addr_str((struct sockaddr *)&dst_addr));\n            LOGI(\"[udp] cache hit: %s <-> %s\", dst, src);\n#else\n            LOGI(\"[udp] cache hit: %s:%s <-> %s\", host, port,\n                 get_addr_str((struct sockaddr *)&src_addr));\n#endif\n        }\n    }\n\n#ifdef MODULE_LOCAL\n\n#if !defined(MODULE_TUNNEL) && !defined(MODULE_REDIR)\n    if (frag) {\n        LOGE(\"[udp] drop a message since frag is not 0, but %d\", frag);\n        goto CLEAN_UP;\n    }\n#endif\n\n    const struct sockaddr *remote_addr = server_ctx->remote_addr;\n    const int remote_addr_len          = server_ctx->remote_addr_len;\n\n    if (remote_ctx == NULL) {\n        // Bind to any port\n        int remotefd = create_remote_socket(remote_addr->sa_family == AF_INET6);\n        if (remotefd < 0) {\n            ERROR(\"[udp] udprelay bind() error\");\n            goto CLEAN_UP;\n        }\n        setnonblocking(remotefd);\n\n#ifdef SO_NOSIGPIPE\n        set_nosigpipe(remotefd);\n#endif\n#ifdef IP_TOS\n        // Set QoS flag\n        int tos = 46;\n        setsockopt(remotefd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));\n#endif\n#ifdef SET_INTERFACE\n        if (server_ctx->iface) {\n            if (setinterface(remotefd, server_ctx->iface) == -1)\n                ERROR(\"setinterface\");\n        }\n#endif\n\n#ifdef ANDROID\n        if (vpn) {\n            if (protect_socket(remotefd) == -1) {\n                ERROR(\"protect_socket\");\n                close(remotefd);\n                goto CLEAN_UP;\n            }\n        }\n#endif\n\n        // Init remote_ctx\n        remote_ctx                  = new_remote(remotefd, server_ctx);\n        remote_ctx->src_addr        = src_addr;\n        remote_ctx->af              = remote_addr->sa_family;\n        remote_ctx->addr_header_len = addr_header_len;\n        memcpy(remote_ctx->addr_header, addr_header, addr_header_len);\n\n        // Add to conn cache\n        cache_insert(conn_cache, key, HASH_KEY_LEN, (void *)remote_ctx);\n\n        // Start remote io\n        ev_io_start(EV_A_ & remote_ctx->io);\n        ev_timer_start(EV_A_ & remote_ctx->watcher);\n    }\n\n    if (offset > 0) {\n        buf->len -= offset;\n        memmove(buf->array, buf->array + offset, buf->len);\n    }\n\n    if (server_ctx->auth) {\n        buf->array[0] |= ONETIMEAUTH_FLAG;\n    }\n\n    // SSR beg\n    if (server_ctx->protocol_plugin) {\n        obfs_class *protocol_plugin = server_ctx->protocol_plugin;\n        if (protocol_plugin->client_udp_pre_encrypt) {\n            buf->len = protocol_plugin->client_udp_pre_encrypt(server_ctx->protocol, &buf->array, buf->len, &buf->capacity);\n        }\n    }\n    //SSR end\n\n    int err = ss_encrypt_all(buf, server_ctx->method, server_ctx->auth, buf->len);\n\n    if (err) {\n        // drop the packet silently\n        goto CLEAN_UP;\n    }\n\n    if (buf->len > packet_size) {\n        LOGE(\"[udp] server_recv_sendto fragmentation\");\n        goto CLEAN_UP;\n    }\n\n    int s = sendto(remote_ctx->fd, buf->array, buf->len, 0, remote_addr, remote_addr_len);\n\n    if (s == -1) {\n        ERROR(\"[udp] server_recv_sendto\");\n    }\n\n#else\n\n    int cache_hit  = 0;\n    int need_query = 0;\n\n    if (buf->len - addr_header_len > packet_size) {\n        LOGE(\"[udp] server_recv_sendto fragmentation\");\n        goto CLEAN_UP;\n    }\n\n    if (remote_ctx != NULL) {\n        cache_hit = 1;\n        // detect destination mismatch\n        if (remote_ctx->addr_header_len != addr_header_len\n            || memcmp(addr_header, remote_ctx->addr_header, addr_header_len) != 0) {\n            if (dst_addr.ss_family != AF_INET && dst_addr.ss_family != AF_INET6) {\n                need_query = 1;\n            }\n        } else {\n            memcpy(&dst_addr, &remote_ctx->dst_addr, sizeof(struct sockaddr_storage));\n        }\n    } else {\n        if (dst_addr.ss_family == AF_INET || dst_addr.ss_family == AF_INET6) {\n            int remotefd = create_remote_socket(dst_addr.ss_family == AF_INET6);\n            if (remotefd != -1) {\n                setnonblocking(remotefd);\n#ifdef SO_BROADCAST\n                set_broadcast(remotefd);\n#endif\n#ifdef SO_NOSIGPIPE\n                set_nosigpipe(remotefd);\n#endif\n#ifdef IP_TOS\n                // Set QoS flag\n                int tos = 46;\n                setsockopt(remotefd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));\n#endif\n#ifdef SET_INTERFACE\n                if (server_ctx->iface) {\n                    if (setinterface(remotefd, server_ctx->iface) == -1)\n                        ERROR(\"setinterface\");\n                }\n#endif\n                remote_ctx                  = new_remote(remotefd, server_ctx);\n                remote_ctx->src_addr        = src_addr;\n                remote_ctx->server_ctx      = server_ctx;\n                remote_ctx->addr_header_len = addr_header_len;\n                memcpy(remote_ctx->addr_header, addr_header, addr_header_len);\n                memcpy(&remote_ctx->dst_addr, &dst_addr, sizeof(struct sockaddr_storage));\n            } else {\n                ERROR(\"[udp] bind() error\");\n                goto CLEAN_UP;\n            }\n        }\n    }\n\n    if (remote_ctx != NULL && !need_query) {\n        size_t addr_len = get_sockaddr_len((struct sockaddr *)&dst_addr);\n        int s           = sendto(remote_ctx->fd, buf->array + addr_header_len,\n                                 buf->len - addr_header_len, 0,\n                                 (struct sockaddr *)&dst_addr, addr_len);\n\n        if (s == -1) {\n            ERROR(\"[udp] sendto_remote\");\n            if (!cache_hit) {\n                close_and_free_remote(EV_A_ remote_ctx);\n            }\n        } else {\n            if (!cache_hit) {\n                // Add to conn cache\n                remote_ctx->af = dst_addr.ss_family;\n                char *key = hash_key(remote_ctx->af, &remote_ctx->src_addr);\n                cache_insert(server_ctx->conn_cache, key, HASH_KEY_LEN, (void *)remote_ctx);\n\n                ev_io_start(EV_A_ & remote_ctx->io);\n                ev_timer_start(EV_A_ & remote_ctx->watcher);\n            }\n        }\n    } else {\n        struct addrinfo hints;\n        memset(&hints, 0, sizeof(struct addrinfo));\n        hints.ai_family   = AF_UNSPEC;\n        hints.ai_socktype = SOCK_DGRAM;\n        hints.ai_protocol = IPPROTO_UDP;\n\n        struct query_ctx *query_ctx = new_query_ctx(buf->array + addr_header_len,\n                                                    buf->len - addr_header_len);\n        query_ctx->server_ctx      = server_ctx;\n        query_ctx->addr_header_len = addr_header_len;\n        query_ctx->src_addr        = src_addr;\n        memcpy(query_ctx->addr_header, addr_header, addr_header_len);\n\n        if (need_query) {\n            query_ctx->remote_ctx = remote_ctx;\n        }\n\n        struct ResolvQuery *query = resolv_query(host, query_resolve_cb,\n                                                 NULL, query_ctx, htons(atoi(port)));\n        if (query == NULL) {\n            ERROR(\"[udp] unable to create DNS query\");\n            close_and_free_query(EV_A_ query_ctx);\n            goto CLEAN_UP;\n        }\n        query_ctx->query = query;\n    }\n#endif\n\nCLEAN_UP:\n    bfree(buf);\n    ss_free(buf);\n}\n\nvoid\nfree_cb(void *key, void *element)\n{\n    remote_ctx_t *remote_ctx = (remote_ctx_t *)element;\n\n    if (verbose) {\n        LOGI(\"[udp] one connection freed\");\n    }\n\n    close_and_free_remote(EV_DEFAULT, remote_ctx);\n}\n\nint\ninit_udprelay(const char *server_host, const char *server_port,\n#ifdef MODULE_LOCAL\n              const struct sockaddr *remote_addr, const int remote_addr_len,\n#ifdef MODULE_TUNNEL\n              const ss_addr_t tunnel_addr,\n#endif\n#endif\n              int mtu, int method, int auth, int timeout, const char *iface, const char *protocol, const char *protocol_param)\n{\n    // Initialize ev loop\n    struct ev_loop *loop = EV_DEFAULT;\n\n    // Initialize MTU\n    if (mtu > 0) {\n        packet_size = mtu - 1 - 28 - 2 - 64;\n        buf_size    = packet_size * 2;\n    }\n\n    // Initialize cache\n    struct cache *conn_cache;\n    cache_create(&conn_cache, MAX_UDP_CONN_NUM, free_cb);\n\n    // ////////////////////////////////////////////////\n    // Setup server context\n\n    // Bind to port\n    int serverfd = create_server_socket(server_host, server_port);\n    if (serverfd < 0) {\n        FATAL(\"[udp] bind() error\");\n    }\n    setnonblocking(serverfd);\n    if (protocol != NULL && strcmp(protocol, \"verify_sha1\") == 0) {\n        auth = 1;\n        protocol = NULL;\n    }\n\n    server_ctx_t *server_ctx = new_server_ctx(serverfd);\n#ifdef MODULE_REMOTE\n    server_ctx->loop = loop;\n#endif\n    server_ctx->auth       = auth;\n    server_ctx->timeout    = max(timeout, MIN_UDP_TIMEOUT);\n    server_ctx->method     = method;\n    server_ctx->iface      = iface;\n    server_ctx->conn_cache = conn_cache;\n#ifdef MODULE_LOCAL\n    server_ctx->remote_addr     = remote_addr;\n    server_ctx->remote_addr_len = remote_addr_len;\n    //SSR beg\n    server_ctx->protocol_plugin = new_obfs_class((char *)protocol);\n    if (server_ctx->protocol_plugin) {\n        server_ctx->protocol = server_ctx->protocol_plugin->new_obfs();\n        server_ctx->protocol_global = server_ctx->protocol_plugin->init_data();\n    }\n\n    server_info _server_info;\n    memset(&_server_info, 0, sizeof(server_info));\n    strcpy(_server_info.host, inet_ntoa(((struct sockaddr_in*)remote_addr)->sin_addr));\n    _server_info.port = ((struct sockaddr_in*)remote_addr)->sin_port;\n    _server_info.port = _server_info.port >> 8 | _server_info.port << 8;\n    _server_info.g_data = server_ctx->protocol_global;\n    _server_info.param = (char *)protocol_param;\n    _server_info.key = enc_get_key();\n    _server_info.key_len = enc_get_key_len();\n\n    if (server_ctx->protocol_plugin)\n        server_ctx->protocol_plugin->set_server_info(server_ctx->protocol, &_server_info);\n    //SSR end\n#ifdef MODULE_TUNNEL\n    server_ctx->tunnel_addr = tunnel_addr;\n#endif\n#endif\n\n    ev_io_start(loop, &server_ctx->io);\n\n    server_ctx_list[server_num++] = server_ctx;\n\n    return 0;\n}\n\nvoid\nfree_udprelay()\n{\n    struct ev_loop *loop = EV_DEFAULT;\n    while (server_num-- > 0) {\n        server_ctx_t *server_ctx = server_ctx_list[server_num];\n\n#ifdef MODULE_LOCAL\n        //SSR beg\n        if (server_ctx->protocol_plugin) {\n            server_ctx->protocol_plugin->dispose(server_ctx->protocol);\n            server_ctx->protocol = NULL;\n            free_obfs_class(server_ctx->protocol_plugin);\n            server_ctx->protocol_plugin = NULL;\n        }\n        //SSR end\n#endif\n\n        ev_io_stop(loop, &server_ctx->io);\n        close(server_ctx->fd);\n        cache_delete(server_ctx->conn_cache, 0);\n        ss_free(server_ctx);\n        server_ctx_list[server_num] = NULL;\n    }\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/udprelay.h",
    "content": "/*\n * udprelay.h - Define UDP relay's buffers and callbacks\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _UDPRELAY_H\n#define _UDPRELAY_H\n\n#include <ev.h>\n#include <time.h>\n\n#include \"encrypt.h\"\n#include \"jconf.h\"\n#include \"obfs.h\"\n\n#ifdef MODULE_REMOTE\n#include \"resolv.h\"\n#endif\n\n#include \"cache.h\"\n\n#include \"common.h\"\n\n#define MAX_UDP_PACKET_SIZE (65507)\n\n#define DEFAULT_PACKET_SIZE 1397 // 1492 - 1 - 28 - 2 - 64 = 1397, the default MTU for UDP relay\n\ntypedef struct server_ctx {\n    ev_io io;\n    int fd;\n    int method;\n    int auth;\n    int timeout;\n    const char *iface;\n    struct cache *conn_cache;\n#ifdef MODULE_LOCAL\n    const struct sockaddr *remote_addr;\n    int remote_addr_len;\n#ifdef MODULE_TUNNEL\n    ss_addr_t tunnel_addr;\n#endif\n#endif\n#ifdef MODULE_REMOTE\n    struct ev_loop *loop;\n#endif\n    // SSR\n    obfs *protocol;\n    obfs_class *protocol_plugin;\n    void *protocol_global;\n} server_ctx_t;\n\n#ifdef MODULE_REMOTE\ntypedef struct query_ctx {\n    struct ResolvQuery *query;\n    struct sockaddr_storage src_addr;\n    buffer_t *buf;\n    int addr_header_len;\n    char addr_header[384];\n    struct server_ctx *server_ctx;\n    struct remote_ctx *remote_ctx;\n} query_ctx_t;\n#endif\n\ntypedef struct remote_ctx {\n    ev_io io;\n    ev_timer watcher;\n    int af;\n    int fd;\n    int addr_header_len;\n    char addr_header[384];\n    struct sockaddr_storage src_addr;\n#ifdef MODULE_REMOTE\n    struct sockaddr_storage dst_addr;\n#endif\n    struct server_ctx *server_ctx;\n} remote_ctx_t;\n\n#endif // _UDPRELAY_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/uthash.h",
    "content": "/*\nCopyright (c) 2003-2016, Troy D. Hanson     http://troydhanson.github.com/uthash/\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER\nOR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\nEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\nPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef UTHASH_H\n#define UTHASH_H\n\n#define UTHASH_VERSION 2.0.1\n\n#include <string.h>   /* memcmp,strlen */\n#include <stddef.h>   /* ptrdiff_t */\n#include <stdlib.h>   /* exit() */\n\n/* These macros use decltype or the earlier __typeof GNU extension.\n   As decltype is only available in newer compilers (VS2010 or gcc 4.3+\n   when compiling c++ source) this code uses whatever method is needed\n   or, for VS2008 where neither is available, uses casting workarounds. */\n#if defined(_MSC_VER)   /* MS compiler */\n#if _MSC_VER >= 1600 && defined(__cplusplus)  /* VS2010 or newer in C++ mode */\n#define DECLTYPE(x) (decltype(x))\n#else                   /* VS2008 or older (or VS2010 in C mode) */\n#define NO_DECLTYPE\n#define DECLTYPE(x)\n#endif\n#elif defined(__BORLANDC__) || defined(__LCC__) || defined(__WATCOMC__)\n#define NO_DECLTYPE\n#define DECLTYPE(x)\n#else                   /* GNU, Sun and other compilers */\n#define DECLTYPE(x) (__typeof(x))\n#endif\n\n#ifdef NO_DECLTYPE\n#define DECLTYPE_ASSIGN(dst,src)                                                 \\\ndo {                                                                             \\\n  char **_da_dst = (char**)(&(dst));                                             \\\n  *_da_dst = (char*)(src);                                                       \\\n} while (0)\n#else\n#define DECLTYPE_ASSIGN(dst,src)                                                 \\\ndo {                                                                             \\\n  (dst) = DECLTYPE(dst)(src);                                                    \\\n} while (0)\n#endif\n\n/* a number of the hash function use uint32_t which isn't defined on Pre VS2010 */\n#if defined(_WIN32)\n#if defined(_MSC_VER) && _MSC_VER >= 1600\n#include <stdint.h>\n#elif defined(__WATCOMC__) || defined(__MINGW32__) || defined(__CYGWIN__)\n#include <stdint.h>\n#else\ntypedef unsigned int uint32_t;\ntypedef unsigned char uint8_t;\n#endif\n#elif defined(__GNUC__) && !defined(__VXWORKS__)\n#include <stdint.h>\n#else\ntypedef unsigned int uint32_t;\ntypedef unsigned char uint8_t;\n#endif\n\n#ifndef uthash_fatal\n#define uthash_fatal(msg) exit(-1)        /* fatal error (out of memory,etc) */\n#endif\n#ifndef uthash_malloc\n#define uthash_malloc(sz) malloc(sz)      /* malloc fcn                      */\n#endif\n#ifndef uthash_free\n#define uthash_free(ptr,sz) free(ptr)     /* free fcn                        */\n#endif\n#ifndef uthash_strlen\n#define uthash_strlen(s) strlen(s)\n#endif\n#ifndef uthash_memcmp\n#define uthash_memcmp(a,b,n) memcmp(a,b,n)\n#endif\n\n#ifndef uthash_noexpand_fyi\n#define uthash_noexpand_fyi(tbl)          /* can be defined to log noexpand  */\n#endif\n#ifndef uthash_expand_fyi\n#define uthash_expand_fyi(tbl)            /* can be defined to log expands   */\n#endif\n\n/* initial number of buckets */\n#define HASH_INITIAL_NUM_BUCKETS 32U     /* initial number of buckets        */\n#define HASH_INITIAL_NUM_BUCKETS_LOG2 5U /* lg2 of initial number of buckets */\n#define HASH_BKT_CAPACITY_THRESH 10U     /* expand when bucket count reaches */\n\n/* calculate the element whose hash handle address is hhp */\n#define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho)))\n/* calculate the hash handle from element address elp */\n#define HH_FROM_ELMT(tbl,elp) ((UT_hash_handle *)(((char*)(elp)) + ((tbl)->hho)))\n\n#define HASH_VALUE(keyptr,keylen,hashv)                                          \\\ndo {                                                                             \\\n  HASH_FCN(keyptr, keylen, hashv);                                               \\\n} while (0)\n\n#define HASH_FIND_BYHASHVALUE(hh,head,keyptr,keylen,hashval,out)                 \\\ndo {                                                                             \\\n  (out) = NULL;                                                                  \\\n  if (head) {                                                                    \\\n    unsigned _hf_bkt;                                                            \\\n    HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _hf_bkt);                  \\\n    if (HASH_BLOOM_TEST((head)->hh.tbl, hashval) != 0) {                         \\\n      HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], keyptr, keylen, hashval, out); \\\n    }                                                                            \\\n  }                                                                              \\\n} while (0)\n\n#define HASH_FIND(hh,head,keyptr,keylen,out)                                     \\\ndo {                                                                             \\\n  unsigned _hf_hashv;                                                            \\\n  HASH_VALUE(keyptr, keylen, _hf_hashv);                                         \\\n  HASH_FIND_BYHASHVALUE(hh, head, keyptr, keylen, _hf_hashv, out);               \\\n} while (0)\n\n#ifdef HASH_BLOOM\n#define HASH_BLOOM_BITLEN (1UL << HASH_BLOOM)\n#define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8UL) + (((HASH_BLOOM_BITLEN%8UL)!=0UL) ? 1UL : 0UL)\n#define HASH_BLOOM_MAKE(tbl)                                                     \\\ndo {                                                                             \\\n  (tbl)->bloom_nbits = HASH_BLOOM;                                               \\\n  (tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN);                 \\\n  if (!((tbl)->bloom_bv))  { uthash_fatal( \"out of memory\"); }                   \\\n  memset((tbl)->bloom_bv, 0, HASH_BLOOM_BYTELEN);                                \\\n  (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE;                                       \\\n} while (0)\n\n#define HASH_BLOOM_FREE(tbl)                                                     \\\ndo {                                                                             \\\n  uthash_free((tbl)->bloom_bv, HASH_BLOOM_BYTELEN);                              \\\n} while (0)\n\n#define HASH_BLOOM_BITSET(bv,idx) (bv[(idx)/8U] |= (1U << ((idx)%8U)))\n#define HASH_BLOOM_BITTEST(bv,idx) (bv[(idx)/8U] & (1U << ((idx)%8U)))\n\n#define HASH_BLOOM_ADD(tbl,hashv)                                                \\\n  HASH_BLOOM_BITSET((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1U)))\n\n#define HASH_BLOOM_TEST(tbl,hashv)                                               \\\n  HASH_BLOOM_BITTEST((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1U)))\n\n#else\n#define HASH_BLOOM_MAKE(tbl)\n#define HASH_BLOOM_FREE(tbl)\n#define HASH_BLOOM_ADD(tbl,hashv)\n#define HASH_BLOOM_TEST(tbl,hashv) (1)\n#define HASH_BLOOM_BYTELEN 0U\n#endif\n\n#define HASH_MAKE_TABLE(hh,head)                                                 \\\ndo {                                                                             \\\n  (head)->hh.tbl = (UT_hash_table*)uthash_malloc(                                \\\n                  sizeof(UT_hash_table));                                        \\\n  if (!((head)->hh.tbl))  { uthash_fatal( \"out of memory\"); }                    \\\n  memset((head)->hh.tbl, 0, sizeof(UT_hash_table));                              \\\n  (head)->hh.tbl->tail = &((head)->hh);                                          \\\n  (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS;                        \\\n  (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2;              \\\n  (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head);                    \\\n  (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc(                      \\\n          HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket));               \\\n  if (! (head)->hh.tbl->buckets) { uthash_fatal( \"out of memory\"); }             \\\n  memset((head)->hh.tbl->buckets, 0,                                             \\\n          HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket));               \\\n  HASH_BLOOM_MAKE((head)->hh.tbl);                                               \\\n  (head)->hh.tbl->signature = HASH_SIGNATURE;                                    \\\n} while (0)\n\n#define HASH_REPLACE_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,replaced,cmpfcn) \\\ndo {                                                                             \\\n  (replaced) = NULL;                                                             \\\n  HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \\\n  if (replaced) {                                                                \\\n     HASH_DELETE(hh, head, replaced);                                            \\\n  }                                                                              \\\n  HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn); \\\n} while (0)\n\n#define HASH_REPLACE_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add,replaced) \\\ndo {                                                                             \\\n  (replaced) = NULL;                                                             \\\n  HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \\\n  if (replaced) {                                                                \\\n     HASH_DELETE(hh, head, replaced);                                            \\\n  }                                                                              \\\n  HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add); \\\n} while (0)\n\n#define HASH_REPLACE(hh,head,fieldname,keylen_in,add,replaced)                   \\\ndo {                                                                             \\\n  unsigned _hr_hashv;                                                            \\\n  HASH_VALUE(&((add)->fieldname), keylen_in, _hr_hashv);                         \\\n  HASH_REPLACE_BYHASHVALUE(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced); \\\n} while (0)\n\n#define HASH_REPLACE_INORDER(hh,head,fieldname,keylen_in,add,replaced,cmpfcn)    \\\ndo {                                                                             \\\n  unsigned _hr_hashv;                                                            \\\n  HASH_VALUE(&((add)->fieldname), keylen_in, _hr_hashv);                         \\\n  HASH_REPLACE_BYHASHVALUE_INORDER(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced, cmpfcn); \\\n} while (0)\n\n#define HASH_APPEND_LIST(hh, head, add)                                          \\\ndo {                                                                             \\\n  (add)->hh.next = NULL;                                                         \\\n  (add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail);           \\\n  (head)->hh.tbl->tail->next = (add);                                            \\\n  (head)->hh.tbl->tail = &((add)->hh);                                           \\\n} while (0)\n\n#define HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh,head,keyptr,keylen_in,hashval,add,cmpfcn) \\\ndo {                                                                             \\\n  unsigned _ha_bkt;                                                              \\\n  (add)->hh.hashv = (hashval);                                                   \\\n  (add)->hh.key = (char*) (keyptr);                                              \\\n  (add)->hh.keylen = (unsigned) (keylen_in);                                     \\\n  if (!(head)) {                                                                 \\\n    (add)->hh.next = NULL;                                                       \\\n    (add)->hh.prev = NULL;                                                       \\\n    (head) = (add);                                                              \\\n    HASH_MAKE_TABLE(hh, head);                                                   \\\n  } else {                                                                       \\\n    struct UT_hash_handle *_hs_iter = &(head)->hh;                               \\\n    (add)->hh.tbl = (head)->hh.tbl;                                              \\\n    do {                                                                         \\\n      if (cmpfcn(DECLTYPE(head) ELMT_FROM_HH((head)->hh.tbl, _hs_iter), add) > 0) \\\n        break;                                                                   \\\n    } while ((_hs_iter = _hs_iter->next));                                       \\\n    if (_hs_iter) {                                                              \\\n      (add)->hh.next = _hs_iter;                                                 \\\n      if (((add)->hh.prev = _hs_iter->prev)) {                                   \\\n        HH_FROM_ELMT((head)->hh.tbl, _hs_iter->prev)->next = (add);              \\\n      } else {                                                                   \\\n        (head) = (add);                                                          \\\n      }                                                                          \\\n      _hs_iter->prev = (add);                                                    \\\n    } else {                                                                     \\\n      HASH_APPEND_LIST(hh, head, add);                                           \\\n    }                                                                            \\\n  }                                                                              \\\n  (head)->hh.tbl->num_items++;                                                   \\\n  HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt);                    \\\n  HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], &(add)->hh);                 \\\n  HASH_BLOOM_ADD((head)->hh.tbl, hashval);                                       \\\n  HASH_EMIT_KEY(hh, head, keyptr, keylen_in);                                    \\\n  HASH_FSCK(hh, head);                                                           \\\n} while (0)\n\n#define HASH_ADD_KEYPTR_INORDER(hh,head,keyptr,keylen_in,add,cmpfcn)             \\\ndo {                                                                             \\\n  unsigned _hs_hashv;                                                            \\\n  HASH_VALUE(keyptr, keylen_in, _hs_hashv);                                      \\\n  HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, keyptr, keylen_in, _hs_hashv, add, cmpfcn); \\\n} while (0)\n\n#define HASH_ADD_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,cmpfcn) \\\n  HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn)\n\n#define HASH_ADD_INORDER(hh,head,fieldname,keylen_in,add,cmpfcn)                 \\\n  HASH_ADD_KEYPTR_INORDER(hh, head, &((add)->fieldname), keylen_in, add, cmpfcn)\n\n#define HASH_ADD_KEYPTR_BYHASHVALUE(hh,head,keyptr,keylen_in,hashval,add)        \\\ndo {                                                                             \\\n  unsigned _ha_bkt;                                                              \\\n  (add)->hh.hashv = (hashval);                                                   \\\n  (add)->hh.key = (char*) (keyptr);                                              \\\n  (add)->hh.keylen = (unsigned) (keylen_in);                                     \\\n  if (!(head)) {                                                                 \\\n    (add)->hh.next = NULL;                                                       \\\n    (add)->hh.prev = NULL;                                                       \\\n    (head) = (add);                                                              \\\n    HASH_MAKE_TABLE(hh, head);                                                   \\\n  } else {                                                                       \\\n    (add)->hh.tbl = (head)->hh.tbl;                                              \\\n    HASH_APPEND_LIST(hh, head, add);                                             \\\n  }                                                                              \\\n  (head)->hh.tbl->num_items++;                                                   \\\n  HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt);                    \\\n  HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], &(add)->hh);                 \\\n  HASH_BLOOM_ADD((head)->hh.tbl, hashval);                                       \\\n  HASH_EMIT_KEY(hh, head, keyptr, keylen_in);                                    \\\n  HASH_FSCK(hh, head);                                                           \\\n} while (0)\n\n#define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add)                            \\\ndo {                                                                             \\\n  unsigned _ha_hashv;                                                            \\\n  HASH_VALUE(keyptr, keylen_in, _ha_hashv);                                      \\\n  HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, keyptr, keylen_in, _ha_hashv, add);      \\\n} while (0)\n\n#define HASH_ADD_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add)            \\\n  HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add)\n\n#define HASH_ADD(hh,head,fieldname,keylen_in,add)                                \\\n  HASH_ADD_KEYPTR(hh, head, &((add)->fieldname), keylen_in, add)\n\n#define HASH_TO_BKT(hashv,num_bkts,bkt)                                          \\\ndo {                                                                             \\\n  bkt = ((hashv) & ((num_bkts) - 1U));                                           \\\n} while (0)\n\n/* delete \"delptr\" from the hash table.\n * \"the usual\" patch-up process for the app-order doubly-linked-list.\n * The use of _hd_hh_del below deserves special explanation.\n * These used to be expressed using (delptr) but that led to a bug\n * if someone used the same symbol for the head and deletee, like\n *  HASH_DELETE(hh,users,users);\n * We want that to work, but by changing the head (users) below\n * we were forfeiting our ability to further refer to the deletee (users)\n * in the patch-up process. Solution: use scratch space to\n * copy the deletee pointer, then the latter references are via that\n * scratch pointer rather than through the repointed (users) symbol.\n */\n#define HASH_DELETE(hh,head,delptr)                                              \\\ndo {                                                                             \\\n    struct UT_hash_handle *_hd_hh_del;                                           \\\n    if ( ((delptr)->hh.prev == NULL) && ((delptr)->hh.next == NULL) )  {         \\\n        uthash_free((head)->hh.tbl->buckets,                                     \\\n                    (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \\\n        HASH_BLOOM_FREE((head)->hh.tbl);                                         \\\n        uthash_free((head)->hh.tbl, sizeof(UT_hash_table));                      \\\n        head = NULL;                                                             \\\n    } else {                                                                     \\\n        unsigned _hd_bkt;                                                        \\\n        _hd_hh_del = &((delptr)->hh);                                            \\\n        if ((delptr) == ELMT_FROM_HH((head)->hh.tbl,(head)->hh.tbl->tail)) {     \\\n            (head)->hh.tbl->tail =                                               \\\n                (UT_hash_handle*)((ptrdiff_t)((delptr)->hh.prev) +               \\\n                (head)->hh.tbl->hho);                                            \\\n        }                                                                        \\\n        if ((delptr)->hh.prev != NULL) {                                         \\\n            ((UT_hash_handle*)((ptrdiff_t)((delptr)->hh.prev) +                  \\\n                    (head)->hh.tbl->hho))->next = (delptr)->hh.next;             \\\n        } else {                                                                 \\\n            DECLTYPE_ASSIGN(head,(delptr)->hh.next);                             \\\n        }                                                                        \\\n        if (_hd_hh_del->next != NULL) {                                          \\\n            ((UT_hash_handle*)((ptrdiff_t)_hd_hh_del->next +                     \\\n                    (head)->hh.tbl->hho))->prev =                                \\\n                    _hd_hh_del->prev;                                            \\\n        }                                                                        \\\n        HASH_TO_BKT( _hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt);   \\\n        HASH_DEL_IN_BKT(hh,(head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del);        \\\n        (head)->hh.tbl->num_items--;                                             \\\n    }                                                                            \\\n    HASH_FSCK(hh,head);                                                          \\\n} while (0)\n\n\n/* convenience forms of HASH_FIND/HASH_ADD/HASH_DEL */\n#define HASH_FIND_STR(head,findstr,out)                                          \\\n    HASH_FIND(hh,head,findstr,(unsigned)uthash_strlen(findstr),out)\n#define HASH_ADD_STR(head,strfield,add)                                          \\\n    HASH_ADD(hh,head,strfield[0],(unsigned)uthash_strlen(add->strfield),add)\n#define HASH_REPLACE_STR(head,strfield,add,replaced)                             \\\n    HASH_REPLACE(hh,head,strfield[0],(unsigned)uthash_strlen(add->strfield),add,replaced)\n#define HASH_FIND_INT(head,findint,out)                                          \\\n    HASH_FIND(hh,head,findint,sizeof(int),out)\n#define HASH_ADD_INT(head,intfield,add)                                          \\\n    HASH_ADD(hh,head,intfield,sizeof(int),add)\n#define HASH_REPLACE_INT(head,intfield,add,replaced)                             \\\n    HASH_REPLACE(hh,head,intfield,sizeof(int),add,replaced)\n#define HASH_FIND_PTR(head,findptr,out)                                          \\\n    HASH_FIND(hh,head,findptr,sizeof(void *),out)\n#define HASH_ADD_PTR(head,ptrfield,add)                                          \\\n    HASH_ADD(hh,head,ptrfield,sizeof(void *),add)\n#define HASH_REPLACE_PTR(head,ptrfield,add,replaced)                             \\\n    HASH_REPLACE(hh,head,ptrfield,sizeof(void *),add,replaced)\n#define HASH_DEL(head,delptr)                                                    \\\n    HASH_DELETE(hh,head,delptr)\n\n/* HASH_FSCK checks hash integrity on every add/delete when HASH_DEBUG is defined.\n * This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined.\n */\n#ifdef HASH_DEBUG\n#define HASH_OOPS(...) do { fprintf(stderr,__VA_ARGS__); exit(-1); } while (0)\n#define HASH_FSCK(hh,head)                                                       \\\ndo {                                                                             \\\n    struct UT_hash_handle *_thh;                                                 \\\n    if (head) {                                                                  \\\n        unsigned _bkt_i;                                                         \\\n        unsigned _count;                                                         \\\n        char *_prev;                                                             \\\n        _count = 0;                                                              \\\n        for( _bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; _bkt_i++) {       \\\n            unsigned _bkt_count = 0;                                             \\\n            _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head;                      \\\n            _prev = NULL;                                                        \\\n            while (_thh) {                                                       \\\n               if (_prev != (char*)(_thh->hh_prev)) {                            \\\n                   HASH_OOPS(\"invalid hh_prev %p, actual %p\\n\",                  \\\n                    _thh->hh_prev, _prev );                                      \\\n               }                                                                 \\\n               _bkt_count++;                                                     \\\n               _prev = (char*)(_thh);                                            \\\n               _thh = _thh->hh_next;                                             \\\n            }                                                                    \\\n            _count += _bkt_count;                                                \\\n            if ((head)->hh.tbl->buckets[_bkt_i].count !=  _bkt_count) {          \\\n               HASH_OOPS(\"invalid bucket count %u, actual %u\\n\",                 \\\n                (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count);              \\\n            }                                                                    \\\n        }                                                                        \\\n        if (_count != (head)->hh.tbl->num_items) {                               \\\n            HASH_OOPS(\"invalid hh item count %u, actual %u\\n\",                   \\\n                (head)->hh.tbl->num_items, _count );                             \\\n        }                                                                        \\\n        /* traverse hh in app order; check next/prev integrity, count */         \\\n        _count = 0;                                                              \\\n        _prev = NULL;                                                            \\\n        _thh =  &(head)->hh;                                                     \\\n        while (_thh) {                                                           \\\n           _count++;                                                             \\\n           if (_prev !=(char*)(_thh->prev)) {                                    \\\n              HASH_OOPS(\"invalid prev %p, actual %p\\n\",                          \\\n                    _thh->prev, _prev );                                         \\\n           }                                                                     \\\n           _prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh);                    \\\n           _thh = ( _thh->next ?  (UT_hash_handle*)((char*)(_thh->next) +        \\\n                                  (head)->hh.tbl->hho) : NULL );                 \\\n        }                                                                        \\\n        if (_count != (head)->hh.tbl->num_items) {                               \\\n            HASH_OOPS(\"invalid app item count %u, actual %u\\n\",                  \\\n                (head)->hh.tbl->num_items, _count );                             \\\n        }                                                                        \\\n    }                                                                            \\\n} while (0)\n#else\n#define HASH_FSCK(hh,head)\n#endif\n\n/* When compiled with -DHASH_EMIT_KEYS, length-prefixed keys are emitted to\n * the descriptor to which this macro is defined for tuning the hash function.\n * The app can #include <unistd.h> to get the prototype for write(2). */\n#ifdef HASH_EMIT_KEYS\n#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen)                                   \\\ndo {                                                                             \\\n    unsigned _klen = fieldlen;                                                   \\\n    write(HASH_EMIT_KEYS, &_klen, sizeof(_klen));                                \\\n    write(HASH_EMIT_KEYS, keyptr, (unsigned long)fieldlen);                      \\\n} while (0)\n#else\n#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen)\n#endif\n\n/* default to Jenkin's hash unless overridden e.g. DHASH_FUNCTION=HASH_SAX */\n#ifdef HASH_FUNCTION\n#define HASH_FCN HASH_FUNCTION\n#else\n#define HASH_FCN HASH_JEN\n#endif\n\n/* The Bernstein hash function, used in Perl prior to v5.6. Note (x<<5+x)=x*33. */\n#define HASH_BER(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned _hb_keylen=(unsigned)keylen;                                          \\\n  const unsigned char *_hb_key=(const unsigned char*)(key);                      \\\n  (hashv) = 0;                                                                   \\\n  while (_hb_keylen-- != 0U) {                                                   \\\n      (hashv) = (((hashv) << 5) + (hashv)) + *_hb_key++;                         \\\n  }                                                                              \\\n} while (0)\n\n\n/* SAX/FNV/OAT/JEN hash functions are macro variants of those listed at\n * http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx */\n#define HASH_SAX(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned _sx_i;                                                                \\\n  const unsigned char *_hs_key=(const unsigned char*)(key);                      \\\n  hashv = 0;                                                                     \\\n  for(_sx_i=0; _sx_i < keylen; _sx_i++) {                                        \\\n      hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i];                     \\\n  }                                                                              \\\n} while (0)\n/* FNV-1a variation */\n#define HASH_FNV(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned _fn_i;                                                                \\\n  const unsigned char *_hf_key=(const unsigned char*)(key);                      \\\n  hashv = 2166136261U;                                                           \\\n  for(_fn_i=0; _fn_i < keylen; _fn_i++) {                                        \\\n      hashv = hashv ^ _hf_key[_fn_i];                                            \\\n      hashv = hashv * 16777619U;                                                 \\\n  }                                                                              \\\n} while (0)\n\n#define HASH_OAT(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned _ho_i;                                                                \\\n  const unsigned char *_ho_key=(const unsigned char*)(key);                      \\\n  hashv = 0;                                                                     \\\n  for(_ho_i=0; _ho_i < keylen; _ho_i++) {                                        \\\n      hashv += _ho_key[_ho_i];                                                   \\\n      hashv += (hashv << 10);                                                    \\\n      hashv ^= (hashv >> 6);                                                     \\\n  }                                                                              \\\n  hashv += (hashv << 3);                                                         \\\n  hashv ^= (hashv >> 11);                                                        \\\n  hashv += (hashv << 15);                                                        \\\n} while (0)\n\n#define HASH_JEN_MIX(a,b,c)                                                      \\\ndo {                                                                             \\\n  a -= b; a -= c; a ^= ( c >> 13 );                                              \\\n  b -= c; b -= a; b ^= ( a << 8 );                                               \\\n  c -= a; c -= b; c ^= ( b >> 13 );                                              \\\n  a -= b; a -= c; a ^= ( c >> 12 );                                              \\\n  b -= c; b -= a; b ^= ( a << 16 );                                              \\\n  c -= a; c -= b; c ^= ( b >> 5 );                                               \\\n  a -= b; a -= c; a ^= ( c >> 3 );                                               \\\n  b -= c; b -= a; b ^= ( a << 10 );                                              \\\n  c -= a; c -= b; c ^= ( b >> 15 );                                              \\\n} while (0)\n\n#define HASH_JEN(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned _hj_i,_hj_j,_hj_k;                                                    \\\n  unsigned const char *_hj_key=(unsigned const char*)(key);                      \\\n  hashv = 0xfeedbeefu;                                                           \\\n  _hj_i = _hj_j = 0x9e3779b9u;                                                   \\\n  _hj_k = (unsigned)(keylen);                                                    \\\n  while (_hj_k >= 12U) {                                                         \\\n    _hj_i +=    (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 )                      \\\n        + ( (unsigned)_hj_key[2] << 16 )                                         \\\n        + ( (unsigned)_hj_key[3] << 24 ) );                                      \\\n    _hj_j +=    (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 )                      \\\n        + ( (unsigned)_hj_key[6] << 16 )                                         \\\n        + ( (unsigned)_hj_key[7] << 24 ) );                                      \\\n    hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 )                         \\\n        + ( (unsigned)_hj_key[10] << 16 )                                        \\\n        + ( (unsigned)_hj_key[11] << 24 ) );                                     \\\n                                                                                 \\\n     HASH_JEN_MIX(_hj_i, _hj_j, hashv);                                          \\\n                                                                                 \\\n     _hj_key += 12;                                                              \\\n     _hj_k -= 12U;                                                               \\\n  }                                                                              \\\n  hashv += (unsigned)(keylen);                                                   \\\n  switch ( _hj_k ) {                                                             \\\n     case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); /* FALLTHROUGH */        \\\n     case 10: hashv += ( (unsigned)_hj_key[9] << 16 );  /* FALLTHROUGH */        \\\n     case 9:  hashv += ( (unsigned)_hj_key[8] << 8 );   /* FALLTHROUGH */        \\\n     case 8:  _hj_j += ( (unsigned)_hj_key[7] << 24 );  /* FALLTHROUGH */        \\\n     case 7:  _hj_j += ( (unsigned)_hj_key[6] << 16 );  /* FALLTHROUGH */        \\\n     case 6:  _hj_j += ( (unsigned)_hj_key[5] << 8 );   /* FALLTHROUGH */        \\\n     case 5:  _hj_j += _hj_key[4];                      /* FALLTHROUGH */        \\\n     case 4:  _hj_i += ( (unsigned)_hj_key[3] << 24 );  /* FALLTHROUGH */        \\\n     case 3:  _hj_i += ( (unsigned)_hj_key[2] << 16 );  /* FALLTHROUGH */        \\\n     case 2:  _hj_i += ( (unsigned)_hj_key[1] << 8 );   /* FALLTHROUGH */        \\\n     case 1:  _hj_i += _hj_key[0];                                               \\\n  }                                                                              \\\n  HASH_JEN_MIX(_hj_i, _hj_j, hashv);                                             \\\n} while (0)\n\n/* The Paul Hsieh hash function */\n#undef get16bits\n#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__)             \\\n  || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)\n#define get16bits(d) (*((const uint16_t *) (d)))\n#endif\n\n#if !defined (get16bits)\n#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)             \\\n                       +(uint32_t)(((const uint8_t *)(d))[0]) )\n#endif\n#define HASH_SFH(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned const char *_sfh_key=(unsigned const char*)(key);                     \\\n  uint32_t _sfh_tmp, _sfh_len = (uint32_t)keylen;                                \\\n                                                                                 \\\n  unsigned _sfh_rem = _sfh_len & 3U;                                             \\\n  _sfh_len >>= 2;                                                                \\\n  hashv = 0xcafebabeu;                                                           \\\n                                                                                 \\\n  /* Main loop */                                                                \\\n  for (;_sfh_len > 0U; _sfh_len--) {                                             \\\n    hashv    += get16bits (_sfh_key);                                            \\\n    _sfh_tmp  = ((uint32_t)(get16bits (_sfh_key+2)) << 11) ^ hashv;              \\\n    hashv     = (hashv << 16) ^ _sfh_tmp;                                        \\\n    _sfh_key += 2U*sizeof (uint16_t);                                            \\\n    hashv    += hashv >> 11;                                                     \\\n  }                                                                              \\\n                                                                                 \\\n  /* Handle end cases */                                                         \\\n  switch (_sfh_rem) {                                                            \\\n    case 3: hashv += get16bits (_sfh_key);                                       \\\n            hashv ^= hashv << 16;                                                \\\n            hashv ^= (uint32_t)(_sfh_key[sizeof (uint16_t)]) << 18;              \\\n            hashv += hashv >> 11;                                                \\\n            break;                                                               \\\n    case 2: hashv += get16bits (_sfh_key);                                       \\\n            hashv ^= hashv << 11;                                                \\\n            hashv += hashv >> 17;                                                \\\n            break;                                                               \\\n    case 1: hashv += *_sfh_key;                                                  \\\n            hashv ^= hashv << 10;                                                \\\n            hashv += hashv >> 1;                                                 \\\n  }                                                                              \\\n                                                                                 \\\n    /* Force \"avalanching\" of final 127 bits */                                  \\\n    hashv ^= hashv << 3;                                                         \\\n    hashv += hashv >> 5;                                                         \\\n    hashv ^= hashv << 4;                                                         \\\n    hashv += hashv >> 17;                                                        \\\n    hashv ^= hashv << 25;                                                        \\\n    hashv += hashv >> 6;                                                         \\\n} while (0)\n\n#ifdef HASH_USING_NO_STRICT_ALIASING\n/* The MurmurHash exploits some CPU's (x86,x86_64) tolerance for unaligned reads.\n * For other types of CPU's (e.g. Sparc) an unaligned read causes a bus error.\n * MurmurHash uses the faster approach only on CPU's where we know it's safe.\n *\n * Note the preprocessor built-in defines can be emitted using:\n *\n *   gcc -m64 -dM -E - < /dev/null                  (on gcc)\n *   cc -## a.c (where a.c is a simple test file)   (Sun Studio)\n */\n#if (defined(__i386__) || defined(__x86_64__)  || defined(_M_IX86))\n#define MUR_GETBLOCK(p,i) p[i]\n#else /* non intel */\n#define MUR_PLUS0_ALIGNED(p) (((unsigned long)p & 3UL) == 0UL)\n#define MUR_PLUS1_ALIGNED(p) (((unsigned long)p & 3UL) == 1UL)\n#define MUR_PLUS2_ALIGNED(p) (((unsigned long)p & 3UL) == 2UL)\n#define MUR_PLUS3_ALIGNED(p) (((unsigned long)p & 3UL) == 3UL)\n#define WP(p) ((uint32_t*)((unsigned long)(p) & ~3UL))\n#if (defined(__BIG_ENDIAN__) || defined(SPARC) || defined(__ppc__) || defined(__ppc64__))\n#define MUR_THREE_ONE(p) ((((*WP(p))&0x00ffffff) << 8) | (((*(WP(p)+1))&0xff000000) >> 24))\n#define MUR_TWO_TWO(p)   ((((*WP(p))&0x0000ffff) <<16) | (((*(WP(p)+1))&0xffff0000) >> 16))\n#define MUR_ONE_THREE(p) ((((*WP(p))&0x000000ff) <<24) | (((*(WP(p)+1))&0xffffff00) >>  8))\n#else /* assume little endian non-intel */\n#define MUR_THREE_ONE(p) ((((*WP(p))&0xffffff00) >> 8) | (((*(WP(p)+1))&0x000000ff) << 24))\n#define MUR_TWO_TWO(p)   ((((*WP(p))&0xffff0000) >>16) | (((*(WP(p)+1))&0x0000ffff) << 16))\n#define MUR_ONE_THREE(p) ((((*WP(p))&0xff000000) >>24) | (((*(WP(p)+1))&0x00ffffff) <<  8))\n#endif\n#define MUR_GETBLOCK(p,i) (MUR_PLUS0_ALIGNED(p) ? ((p)[i]) :           \\\n                            (MUR_PLUS1_ALIGNED(p) ? MUR_THREE_ONE(p) : \\\n                             (MUR_PLUS2_ALIGNED(p) ? MUR_TWO_TWO(p) :  \\\n                                                      MUR_ONE_THREE(p))))\n#endif\n#define MUR_ROTL32(x,r) (((x) << (r)) | ((x) >> (32 - (r))))\n#define MUR_FMIX(_h) \\\ndo {                 \\\n  _h ^= _h >> 16;    \\\n  _h *= 0x85ebca6bu; \\\n  _h ^= _h >> 13;    \\\n  _h *= 0xc2b2ae35u; \\\n  _h ^= _h >> 16;    \\\n} while (0)\n\n#define HASH_MUR(key,keylen,hashv)                                     \\\ndo {                                                                   \\\n  const uint8_t *_mur_data = (const uint8_t*)(key);                    \\\n  const int _mur_nblocks = (int)(keylen) / 4;                          \\\n  uint32_t _mur_h1 = 0xf88D5353u;                                      \\\n  uint32_t _mur_c1 = 0xcc9e2d51u;                                      \\\n  uint32_t _mur_c2 = 0x1b873593u;                                      \\\n  uint32_t _mur_k1 = 0;                                                \\\n  const uint8_t *_mur_tail;                                            \\\n  const uint32_t *_mur_blocks = (const uint32_t*)(_mur_data+(_mur_nblocks*4)); \\\n  int _mur_i;                                                          \\\n  for(_mur_i = -_mur_nblocks; _mur_i!=0; _mur_i++) {                   \\\n    _mur_k1 = MUR_GETBLOCK(_mur_blocks,_mur_i);                        \\\n    _mur_k1 *= _mur_c1;                                                \\\n    _mur_k1 = MUR_ROTL32(_mur_k1,15);                                  \\\n    _mur_k1 *= _mur_c2;                                                \\\n                                                                       \\\n    _mur_h1 ^= _mur_k1;                                                \\\n    _mur_h1 = MUR_ROTL32(_mur_h1,13);                                  \\\n    _mur_h1 = (_mur_h1*5U) + 0xe6546b64u;                              \\\n  }                                                                    \\\n  _mur_tail = (const uint8_t*)(_mur_data + (_mur_nblocks*4));          \\\n  _mur_k1=0;                                                           \\\n  switch((keylen) & 3U) {                                              \\\n    case 3: _mur_k1 ^= (uint32_t)_mur_tail[2] << 16; /* FALLTHROUGH */ \\\n    case 2: _mur_k1 ^= (uint32_t)_mur_tail[1] << 8;  /* FALLTHROUGH */ \\\n    case 1: _mur_k1 ^= (uint32_t)_mur_tail[0];                         \\\n    _mur_k1 *= _mur_c1;                                                \\\n    _mur_k1 = MUR_ROTL32(_mur_k1,15);                                  \\\n    _mur_k1 *= _mur_c2;                                                \\\n    _mur_h1 ^= _mur_k1;                                                \\\n  }                                                                    \\\n  _mur_h1 ^= (uint32_t)(keylen);                                       \\\n  MUR_FMIX(_mur_h1);                                                   \\\n  hashv = _mur_h1;                                                     \\\n} while (0)\n#endif  /* HASH_USING_NO_STRICT_ALIASING */\n\n/* iterate over items in a known bucket to find desired item */\n#define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,hashval,out)               \\\ndo {                                                                             \\\n  if ((head).hh_head != NULL) {                                                  \\\n    DECLTYPE_ASSIGN(out, ELMT_FROM_HH(tbl, (head).hh_head));                     \\\n  } else {                                                                       \\\n    (out) = NULL;                                                                \\\n  }                                                                              \\\n  while ((out) != NULL) {                                                        \\\n    if ((out)->hh.hashv == (hashval) && (out)->hh.keylen == (keylen_in)) {       \\\n      if (uthash_memcmp((out)->hh.key, keyptr, keylen_in) == 0) {                \\\n        break;                                                                   \\\n      }                                                                          \\\n    }                                                                            \\\n    if ((out)->hh.hh_next != NULL) {                                             \\\n      DECLTYPE_ASSIGN(out, ELMT_FROM_HH(tbl, (out)->hh.hh_next));                \\\n    } else {                                                                     \\\n      (out) = NULL;                                                              \\\n    }                                                                            \\\n  }                                                                              \\\n} while (0)\n\n/* add an item to a bucket  */\n#define HASH_ADD_TO_BKT(head,addhh)                                              \\\ndo {                                                                             \\\n head.count++;                                                                   \\\n (addhh)->hh_next = head.hh_head;                                                \\\n (addhh)->hh_prev = NULL;                                                        \\\n if (head.hh_head != NULL) { (head).hh_head->hh_prev = (addhh); }                \\\n (head).hh_head=addhh;                                                           \\\n if ((head.count >= ((head.expand_mult+1U) * HASH_BKT_CAPACITY_THRESH))          \\\n     && ((addhh)->tbl->noexpand != 1U)) {                                        \\\n       HASH_EXPAND_BUCKETS((addhh)->tbl);                                        \\\n }                                                                               \\\n} while (0)\n\n/* remove an item from a given bucket */\n#define HASH_DEL_IN_BKT(hh,head,hh_del)                                          \\\n    (head).count--;                                                              \\\n    if ((head).hh_head == hh_del) {                                              \\\n      (head).hh_head = hh_del->hh_next;                                          \\\n    }                                                                            \\\n    if (hh_del->hh_prev) {                                                       \\\n        hh_del->hh_prev->hh_next = hh_del->hh_next;                              \\\n    }                                                                            \\\n    if (hh_del->hh_next) {                                                       \\\n        hh_del->hh_next->hh_prev = hh_del->hh_prev;                              \\\n    }\n\n/* Bucket expansion has the effect of doubling the number of buckets\n * and redistributing the items into the new buckets. Ideally the\n * items will distribute more or less evenly into the new buckets\n * (the extent to which this is true is a measure of the quality of\n * the hash function as it applies to the key domain).\n *\n * With the items distributed into more buckets, the chain length\n * (item count) in each bucket is reduced. Thus by expanding buckets\n * the hash keeps a bound on the chain length. This bounded chain\n * length is the essence of how a hash provides constant time lookup.\n *\n * The calculation of tbl->ideal_chain_maxlen below deserves some\n * explanation. First, keep in mind that we're calculating the ideal\n * maximum chain length based on the *new* (doubled) bucket count.\n * In fractions this is just n/b (n=number of items,b=new num buckets).\n * Since the ideal chain length is an integer, we want to calculate\n * ceil(n/b). We don't depend on floating point arithmetic in this\n * hash, so to calculate ceil(n/b) with integers we could write\n *\n *      ceil(n/b) = (n/b) + ((n%b)?1:0)\n *\n * and in fact a previous version of this hash did just that.\n * But now we have improved things a bit by recognizing that b is\n * always a power of two. We keep its base 2 log handy (call it lb),\n * so now we can write this with a bit shift and logical AND:\n *\n *      ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0)\n *\n */\n#define HASH_EXPAND_BUCKETS(tbl)                                                 \\\ndo {                                                                             \\\n    unsigned _he_bkt;                                                            \\\n    unsigned _he_bkt_i;                                                          \\\n    struct UT_hash_handle *_he_thh, *_he_hh_nxt;                                 \\\n    UT_hash_bucket *_he_new_buckets, *_he_newbkt;                                \\\n    _he_new_buckets = (UT_hash_bucket*)uthash_malloc(                            \\\n             2UL * tbl->num_buckets * sizeof(struct UT_hash_bucket));            \\\n    if (!_he_new_buckets) { uthash_fatal( \"out of memory\"); }                    \\\n    memset(_he_new_buckets, 0,                                                   \\\n            2UL * tbl->num_buckets * sizeof(struct UT_hash_bucket));             \\\n    tbl->ideal_chain_maxlen =                                                    \\\n       (tbl->num_items >> (tbl->log2_num_buckets+1U)) +                          \\\n       (((tbl->num_items & ((tbl->num_buckets*2U)-1U)) != 0U) ? 1U : 0U);        \\\n    tbl->nonideal_items = 0;                                                     \\\n    for(_he_bkt_i = 0; _he_bkt_i < tbl->num_buckets; _he_bkt_i++)                \\\n    {                                                                            \\\n        _he_thh = tbl->buckets[ _he_bkt_i ].hh_head;                             \\\n        while (_he_thh != NULL) {                                                \\\n           _he_hh_nxt = _he_thh->hh_next;                                        \\\n           HASH_TO_BKT( _he_thh->hashv, tbl->num_buckets*2U, _he_bkt);           \\\n           _he_newbkt = &(_he_new_buckets[ _he_bkt ]);                           \\\n           if (++(_he_newbkt->count) > tbl->ideal_chain_maxlen) {                \\\n             tbl->nonideal_items++;                                              \\\n             _he_newbkt->expand_mult = _he_newbkt->count /                       \\\n                                        tbl->ideal_chain_maxlen;                 \\\n           }                                                                     \\\n           _he_thh->hh_prev = NULL;                                              \\\n           _he_thh->hh_next = _he_newbkt->hh_head;                               \\\n           if (_he_newbkt->hh_head != NULL) { _he_newbkt->hh_head->hh_prev =     \\\n                _he_thh; }                                                       \\\n           _he_newbkt->hh_head = _he_thh;                                        \\\n           _he_thh = _he_hh_nxt;                                                 \\\n        }                                                                        \\\n    }                                                                            \\\n    uthash_free( tbl->buckets, tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \\\n    tbl->num_buckets *= 2U;                                                      \\\n    tbl->log2_num_buckets++;                                                     \\\n    tbl->buckets = _he_new_buckets;                                              \\\n    tbl->ineff_expands = (tbl->nonideal_items > (tbl->num_items >> 1)) ?         \\\n        (tbl->ineff_expands+1U) : 0U;                                            \\\n    if (tbl->ineff_expands > 1U) {                                               \\\n        tbl->noexpand=1;                                                         \\\n        uthash_noexpand_fyi(tbl);                                                \\\n    }                                                                            \\\n    uthash_expand_fyi(tbl);                                                      \\\n} while (0)\n\n\n/* This is an adaptation of Simon Tatham's O(n log(n)) mergesort */\n/* Note that HASH_SORT assumes the hash handle name to be hh.\n * HASH_SRT was added to allow the hash handle name to be passed in. */\n#define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn)\n#define HASH_SRT(hh,head,cmpfcn)                                                 \\\ndo {                                                                             \\\n  unsigned _hs_i;                                                                \\\n  unsigned _hs_looping,_hs_nmerges,_hs_insize,_hs_psize,_hs_qsize;               \\\n  struct UT_hash_handle *_hs_p, *_hs_q, *_hs_e, *_hs_list, *_hs_tail;            \\\n  if (head != NULL) {                                                            \\\n      _hs_insize = 1;                                                            \\\n      _hs_looping = 1;                                                           \\\n      _hs_list = &((head)->hh);                                                  \\\n      while (_hs_looping != 0U) {                                                \\\n          _hs_p = _hs_list;                                                      \\\n          _hs_list = NULL;                                                       \\\n          _hs_tail = NULL;                                                       \\\n          _hs_nmerges = 0;                                                       \\\n          while (_hs_p != NULL) {                                                \\\n              _hs_nmerges++;                                                     \\\n              _hs_q = _hs_p;                                                     \\\n              _hs_psize = 0;                                                     \\\n              for ( _hs_i = 0; _hs_i  < _hs_insize; _hs_i++ ) {                  \\\n                  _hs_psize++;                                                   \\\n                  _hs_q = (UT_hash_handle*)((_hs_q->next != NULL) ?              \\\n                          ((void*)((char*)(_hs_q->next) +                        \\\n                          (head)->hh.tbl->hho)) : NULL);                         \\\n                  if (! (_hs_q) ) { break; }                                     \\\n              }                                                                  \\\n              _hs_qsize = _hs_insize;                                            \\\n              while ((_hs_psize > 0U) || ((_hs_qsize > 0U) && (_hs_q != NULL))) {\\\n                  if (_hs_psize == 0U) {                                         \\\n                      _hs_e = _hs_q;                                             \\\n                      _hs_q = (UT_hash_handle*)((_hs_q->next != NULL) ?          \\\n                              ((void*)((char*)(_hs_q->next) +                    \\\n                              (head)->hh.tbl->hho)) : NULL);                     \\\n                      _hs_qsize--;                                               \\\n                  } else if ( (_hs_qsize == 0U) || (_hs_q == NULL) ) {           \\\n                      _hs_e = _hs_p;                                             \\\n                      if (_hs_p != NULL){                                        \\\n                        _hs_p = (UT_hash_handle*)((_hs_p->next != NULL) ?        \\\n                                ((void*)((char*)(_hs_p->next) +                  \\\n                                (head)->hh.tbl->hho)) : NULL);                   \\\n                       }                                                         \\\n                      _hs_psize--;                                               \\\n                  } else if ((                                                   \\\n                      cmpfcn(DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_p)), \\\n                             DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_q))) \\\n                             ) <= 0) {                                           \\\n                      _hs_e = _hs_p;                                             \\\n                      if (_hs_p != NULL){                                        \\\n                        _hs_p = (UT_hash_handle*)((_hs_p->next != NULL) ?        \\\n                               ((void*)((char*)(_hs_p->next) +                   \\\n                               (head)->hh.tbl->hho)) : NULL);                    \\\n                       }                                                         \\\n                      _hs_psize--;                                               \\\n                  } else {                                                       \\\n                      _hs_e = _hs_q;                                             \\\n                      _hs_q = (UT_hash_handle*)((_hs_q->next != NULL) ?          \\\n                              ((void*)((char*)(_hs_q->next) +                    \\\n                              (head)->hh.tbl->hho)) : NULL);                     \\\n                      _hs_qsize--;                                               \\\n                  }                                                              \\\n                  if ( _hs_tail != NULL ) {                                      \\\n                      _hs_tail->next = ((_hs_e != NULL) ?                        \\\n                            ELMT_FROM_HH((head)->hh.tbl,_hs_e) : NULL);          \\\n                  } else {                                                       \\\n                      _hs_list = _hs_e;                                          \\\n                  }                                                              \\\n                  if (_hs_e != NULL) {                                           \\\n                  _hs_e->prev = ((_hs_tail != NULL) ?                            \\\n                     ELMT_FROM_HH((head)->hh.tbl,_hs_tail) : NULL);              \\\n                  }                                                              \\\n                  _hs_tail = _hs_e;                                              \\\n              }                                                                  \\\n              _hs_p = _hs_q;                                                     \\\n          }                                                                      \\\n          if (_hs_tail != NULL){                                                 \\\n            _hs_tail->next = NULL;                                               \\\n          }                                                                      \\\n          if ( _hs_nmerges <= 1U ) {                                             \\\n              _hs_looping=0;                                                     \\\n              (head)->hh.tbl->tail = _hs_tail;                                   \\\n              DECLTYPE_ASSIGN(head,ELMT_FROM_HH((head)->hh.tbl, _hs_list));      \\\n          }                                                                      \\\n          _hs_insize *= 2U;                                                      \\\n      }                                                                          \\\n      HASH_FSCK(hh,head);                                                        \\\n }                                                                               \\\n} while (0)\n\n/* This function selects items from one hash into another hash.\n * The end result is that the selected items have dual presence\n * in both hashes. There is no copy of the items made; rather\n * they are added into the new hash through a secondary hash\n * hash handle that must be present in the structure. */\n#define HASH_SELECT(hh_dst, dst, hh_src, src, cond)                              \\\ndo {                                                                             \\\n  unsigned _src_bkt, _dst_bkt;                                                   \\\n  void *_last_elt=NULL, *_elt;                                                   \\\n  UT_hash_handle *_src_hh, *_dst_hh, *_last_elt_hh=NULL;                         \\\n  ptrdiff_t _dst_hho = ((char*)(&(dst)->hh_dst) - (char*)(dst));                 \\\n  if (src != NULL) {                                                             \\\n    for(_src_bkt=0; _src_bkt < (src)->hh_src.tbl->num_buckets; _src_bkt++) {     \\\n      for(_src_hh = (src)->hh_src.tbl->buckets[_src_bkt].hh_head;                \\\n          _src_hh != NULL;                                                       \\\n          _src_hh = _src_hh->hh_next) {                                          \\\n          _elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh);                       \\\n          if (cond(_elt)) {                                                      \\\n            _dst_hh = (UT_hash_handle*)(((char*)_elt) + _dst_hho);               \\\n            _dst_hh->key = _src_hh->key;                                         \\\n            _dst_hh->keylen = _src_hh->keylen;                                   \\\n            _dst_hh->hashv = _src_hh->hashv;                                     \\\n            _dst_hh->prev = _last_elt;                                           \\\n            _dst_hh->next = NULL;                                                \\\n            if (_last_elt_hh != NULL) { _last_elt_hh->next = _elt; }             \\\n            if (dst == NULL) {                                                   \\\n              DECLTYPE_ASSIGN(dst,_elt);                                         \\\n              HASH_MAKE_TABLE(hh_dst,dst);                                       \\\n            } else {                                                             \\\n              _dst_hh->tbl = (dst)->hh_dst.tbl;                                  \\\n            }                                                                    \\\n            HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt);    \\\n            HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt],_dst_hh);            \\\n            (dst)->hh_dst.tbl->num_items++;                                      \\\n            _last_elt = _elt;                                                    \\\n            _last_elt_hh = _dst_hh;                                              \\\n          }                                                                      \\\n      }                                                                          \\\n    }                                                                            \\\n  }                                                                              \\\n  HASH_FSCK(hh_dst,dst);                                                         \\\n} while (0)\n\n#define HASH_CLEAR(hh,head)                                                      \\\ndo {                                                                             \\\n  if (head != NULL) {                                                            \\\n    uthash_free((head)->hh.tbl->buckets,                                         \\\n                (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket));      \\\n    HASH_BLOOM_FREE((head)->hh.tbl);                                             \\\n    uthash_free((head)->hh.tbl, sizeof(UT_hash_table));                          \\\n    (head)=NULL;                                                                 \\\n  }                                                                              \\\n} while (0)\n\n#define HASH_OVERHEAD(hh,head)                                                   \\\n ((head != NULL) ? (                                                             \\\n (size_t)(((head)->hh.tbl->num_items   * sizeof(UT_hash_handle))   +             \\\n          ((head)->hh.tbl->num_buckets * sizeof(UT_hash_bucket))   +             \\\n           sizeof(UT_hash_table)                                   +             \\\n           (HASH_BLOOM_BYTELEN))) : 0U)\n\n#ifdef NO_DECLTYPE\n#define HASH_ITER(hh,head,el,tmp)                                                \\\nfor(((el)=(head)), ((*(char**)(&(tmp)))=(char*)((head!=NULL)?(head)->hh.next:NULL)); \\\n  (el) != NULL; ((el)=(tmp)), ((*(char**)(&(tmp)))=(char*)((tmp!=NULL)?(tmp)->hh.next:NULL)))\n#else\n#define HASH_ITER(hh,head,el,tmp)                                                \\\nfor(((el)=(head)), ((tmp)=DECLTYPE(el)((head!=NULL)?(head)->hh.next:NULL));      \\\n  (el) != NULL; ((el)=(tmp)), ((tmp)=DECLTYPE(el)((tmp!=NULL)?(tmp)->hh.next:NULL)))\n#endif\n\n/* obtain a count of items in the hash */\n#define HASH_COUNT(head) HASH_CNT(hh,head)\n#define HASH_CNT(hh,head) ((head != NULL)?((head)->hh.tbl->num_items):0U)\n\ntypedef struct UT_hash_bucket {\n   struct UT_hash_handle *hh_head;\n   unsigned count;\n\n   /* expand_mult is normally set to 0. In this situation, the max chain length\n    * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If\n    * the bucket's chain exceeds this length, bucket expansion is triggered).\n    * However, setting expand_mult to a non-zero value delays bucket expansion\n    * (that would be triggered by additions to this particular bucket)\n    * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH.\n    * (The multiplier is simply expand_mult+1). The whole idea of this\n    * multiplier is to reduce bucket expansions, since they are expensive, in\n    * situations where we know that a particular bucket tends to be overused.\n    * It is better to let its chain length grow to a longer yet-still-bounded\n    * value, than to do an O(n) bucket expansion too often.\n    */\n   unsigned expand_mult;\n\n} UT_hash_bucket;\n\n/* random signature used only to find hash tables in external analysis */\n#define HASH_SIGNATURE 0xa0111fe1u\n#define HASH_BLOOM_SIGNATURE 0xb12220f2u\n\ntypedef struct UT_hash_table {\n   UT_hash_bucket *buckets;\n   unsigned num_buckets, log2_num_buckets;\n   unsigned num_items;\n   struct UT_hash_handle *tail; /* tail hh in app order, for fast append    */\n   ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */\n\n   /* in an ideal situation (all buckets used equally), no bucket would have\n    * more than ceil(#items/#buckets) items. that's the ideal chain length. */\n   unsigned ideal_chain_maxlen;\n\n   /* nonideal_items is the number of items in the hash whose chain position\n    * exceeds the ideal chain maxlen. these items pay the penalty for an uneven\n    * hash distribution; reaching them in a chain traversal takes >ideal steps */\n   unsigned nonideal_items;\n\n   /* ineffective expands occur when a bucket doubling was performed, but\n    * afterward, more than half the items in the hash had nonideal chain\n    * positions. If this happens on two consecutive expansions we inhibit any\n    * further expansion, as it's not helping; this happens when the hash\n    * function isn't a good fit for the key domain. When expansion is inhibited\n    * the hash will still work, albeit no longer in constant time. */\n   unsigned ineff_expands, noexpand;\n\n   uint32_t signature; /* used only to find hash tables in external analysis */\n#ifdef HASH_BLOOM\n   uint32_t bloom_sig; /* used only to test bloom exists in external analysis */\n   uint8_t *bloom_bv;\n   uint8_t bloom_nbits;\n#endif\n\n} UT_hash_table;\n\ntypedef struct UT_hash_handle {\n   struct UT_hash_table *tbl;\n   void *prev;                       /* prev element in app order      */\n   void *next;                       /* next element in app order      */\n   struct UT_hash_handle *hh_prev;   /* previous hh in bucket order    */\n   struct UT_hash_handle *hh_next;   /* next hh in bucket order        */\n   void *key;                        /* ptr to enclosing struct's key  */\n   unsigned keylen;                  /* enclosing struct's key len     */\n   unsigned hashv;                   /* result of hash-fcn(key)        */\n} UT_hash_handle;\n\n#endif /* UTHASH_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/utils.c",
    "content": "/*\n * utils.c - Misc utilities\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdlib.h>\n#include <unistd.h>\n#include <string.h>\n#include <errno.h>\n#include <ctype.h>\n#ifndef __MINGW32__\n#include <pwd.h>\n#include <grp.h>\n#endif\n\n#include <sys/types.h>\n#include <sys/stat.h>\n\n#include \"utils.h\"\n\n#ifdef HAVE_SETRLIMIT\n#include <sys/time.h>\n#include <sys/resource.h>\n#endif\n\n#define INT_DIGITS 19           /* enough for 64 bit integer */\n\n#ifdef LIB_ONLY\nFILE *logfile;\n#endif\n\n#ifdef HAS_SYSLOG\nint use_syslog = 0;\n#endif\n\n#ifndef __MINGW32__\nvoid\nERROR(const char *s)\n{\n    char *msg = strerror(errno);\n    LOGE(\"%s: %s\", s, msg);\n}\n\n#endif\n\nint use_tty = 1;\n\nchar *\nss_itoa(int i)\n{\n    /* Room for INT_DIGITS digits, - and '\\0' */\n    static char buf[INT_DIGITS + 2];\n    char *p = buf + INT_DIGITS + 1;     /* points to terminating '\\0' */\n    if (i >= 0) {\n        do {\n            *--p = '0' + (i % 10);\n            i   /= 10;\n        } while (i != 0);\n        return p;\n    } else {                     /* i < 0 */\n        do {\n            *--p = '0' - (i % 10);\n            i   /= 10;\n        } while (i != 0);\n        *--p = '-';\n    }\n    return p;\n}\n\nint\nss_isnumeric(const char *s) {\n    if (!s || !*s)\n        return 0;\n    while (isdigit(*s))\n        ++s;\n    return *s == '\\0';\n}\n\n/*\n * setuid() and setgid() for a specified user.\n */\nint\nrun_as(const char *user)\n{\n#ifndef __MINGW32__\n    if (user[0]) {\n        /* Convert user to a long integer if it is a non-negative number.\n         * -1 means it is a user name. */\n        long uid = -1;\n        if (ss_isnumeric(user)) {\n            errno = 0;\n            char *endptr;\n            uid = strtol(user, &endptr, 10);\n            if (errno || endptr == user)\n                uid = -1;\n        }\n\n#ifdef HAVE_GETPWNAM_R\n        struct passwd pwdbuf, *pwd;\n        memset(&pwdbuf, 0, sizeof(struct passwd));\n        size_t buflen;\n        int err;\n\n        for (buflen = 128;; buflen *= 2) {\n            char buf[buflen];  /* variable length array */\n\n            /* Note that we use getpwnam_r() instead of getpwnam(),\n             * which returns its result in a statically allocated buffer and\n             * cannot be considered thread safe. */\n            err = uid >= 0 ? getpwuid_r((uid_t)uid, &pwdbuf, buf, buflen, &pwd)\n                : getpwnam_r(user, &pwdbuf, buf, buflen, &pwd);\n\n            if (err == 0 && pwd) {\n                /* setgid first, because we may not be allowed to do it anymore after setuid */\n                if (setgid(pwd->pw_gid) != 0) {\n                    LOGE(\n                        \"Could not change group id to that of run_as user '%s': %s\",\n                        pwd->pw_name, strerror(errno));\n                    return 0;\n                }\n\n                if (initgroups(pwd->pw_name, pwd->pw_gid) == -1) {\n                    LOGE(\"Could not change supplementary groups for user '%s'.\", pwd->pw_name);\n                    return 0;\n                }\n\n                if (setuid(pwd->pw_uid) != 0) {\n                    LOGE(\n                        \"Could not change user id to that of run_as user '%s': %s\",\n                        pwd->pw_name, strerror(errno));\n                    return 0;\n                }\n                break;\n            } else if (err != ERANGE) {\n                if (err) {\n                    LOGE(\"run_as user '%s' could not be found: %s\", user,\n                            strerror(err));\n                } else {\n                    LOGE(\"run_as user '%s' could not be found.\", user);\n                }\n                return 0;\n            } else if (buflen >= 16 * 1024) {\n                /* If getpwnam_r() seems defective, call it quits rather than\n                 * keep on allocating ever larger buffers until we crash. */\n                LOGE(\n                    \"getpwnam_r() requires more than %u bytes of buffer space.\",\n                    (unsigned)buflen);\n                return 0;\n            }\n            /* Else try again with larger buffer. */\n        }\n#else\n        /* No getpwnam_r() :-(  We'll use getpwnam() and hope for the best. */\n        struct passwd *pwd;\n\n        if (!(pwd = uid >=0 ? getpwuid((uid_t)uid) : getpwnam(user))) {\n            LOGE(\"run_as user %s could not be found.\", user);\n            return 0;\n        }\n        /* setgid first, because we may not allowed to do it anymore after setuid */\n        if (setgid(pwd->pw_gid) != 0) {\n            LOGE(\"Could not change group id to that of run_as user '%s': %s\",\n                 pwd->pw_name, strerror(errno));\n            return 0;\n        }\n        if (initgroups(pwd->pw_name, pwd->pw_gid) == -1) {\n            LOGE(\"Could not change supplementary groups for user '%s'.\", pwd->pw_name);\n            return 0;\n        }\n        if (setuid(pwd->pw_uid) != 0) {\n            LOGE(\"Could not change user id to that of run_as user '%s': %s\",\n                 pwd->pw_name, strerror(errno));\n            return 0;\n        }\n#endif\n    }\n\n#endif // __MINGW32__\n    return 1;\n}\n\nchar *\nss_strndup(const char *s, size_t n)\n{\n    size_t len = strlen(s);\n    char *ret;\n\n    if (len <= n) {\n        return strdup(s);\n    }\n\n    ret = ss_malloc(n + 1);\n    strncpy(ret, s, n);\n    ret[n] = '\\0';\n    return ret;\n}\n\nvoid\nFATAL(const char *msg)\n{\n    LOGE(\"%s\", msg);\n    exit(-1);\n}\n\nvoid *\nss_malloc(size_t size)\n{\n    void *tmp = malloc(size);\n    if (tmp == NULL)\n        exit(EXIT_FAILURE);\n    return tmp;\n}\n\nvoid *\nss_realloc(void *ptr, size_t new_size)\n{\n    void *new = realloc(ptr, new_size);\n    if (new == NULL) {\n        free(ptr);\n        ptr = NULL;\n        exit(EXIT_FAILURE);\n    }\n    return new;\n}\n\nvoid\nusage()\n{\n    printf(\"\\n\");\n    printf(\"shadowsocks-libev %s with %s\\n\\n\", VERSION, USING_CRYPTO);\n    printf(\n        \"  maintained by Max Lv <max.c.lv@gmail.com> and Linus Yang <laokongzi@gmail.com>\\n\\n\");\n    printf(\"  usage:\\n\\n\");\n#ifdef MODULE_LOCAL\n    printf(\"    ss-local\\n\");\n#elif MODULE_REMOTE\n    printf(\"    ss-server\\n\");\n#elif MODULE_TUNNEL\n    printf(\"    ss-tunnel\\n\");\n#elif MODULE_REDIR\n    printf(\"    ss-redir\\n\");\n#elif MODULE_MANAGER\n    printf(\"    ss-manager\\n\");\n#endif\n    printf(\"\\n\");\n    printf(\n        \"       -s <server_host>           Host name or IP address of your remote server.\\n\");\n    printf(\n        \"       -p <server_port>           Port number of your remote server.\\n\");\n    printf(\n        \"       -l <local_port>            Port number of your local server.\\n\");\n    printf(\n        \"       -k <password>              Password of your remote server.\\n\");\n    printf(\n        \"       -m <encrypt_method>        Encrypt method: table, rc4, rc4-md5,\\n\");\n    printf(\n        \"                                  aes-128-cfb, aes-192-cfb, aes-256-cfb,\\n\");\n    printf(\n        \"                                  aes-128-ctr, aes-192-ctr, aes-256-ctr,\\n\");\n    printf(\n        \"                                  bf-cfb, camellia-128-cfb, camellia-192-cfb,\\n\");\n    printf(\n        \"                                  camellia-256-cfb, cast5-cfb, des-cfb,\\n\");\n    printf(\n        \"                                  idea-cfb, rc2-cfb, seed-cfb, salsa20,\\n\");\n    printf(\n        \"                                  chacha20 and chacha20-ietf.\\n\");\n    printf(\n        \"                                  The default cipher is rc4-md5.\\n\");\n    printf(\"\\n\");\n    printf(\n        \"       [-a <user>]                Run as another user.\\n\");\n    printf(\n        \"       [-f <pid_file>]            The file path to store pid.\\n\");\n    printf(\n        \"       [-t <timeout>]             Socket timeout in seconds.\\n\");\n    printf(\n        \"       [-c <config_file>]         The path to config file.\\n\");\n#ifdef HAVE_SETRLIMIT\n    printf(\n        \"       [-n <number>]              Max number of open files.\\n\");\n#endif\n#ifndef MODULE_REDIR\n    printf(\n        \"       [-i <interface>]           Network interface to bind.\\n\");\n#endif\n    printf(\n        \"       [-b <local_address>]       Local address to bind.\\n\");\n    printf(\"\\n\");\n    printf(\n        \"       [-u]                       Enable UDP relay.\\n\");\n#ifdef MODULE_REDIR\n    printf(\n        \"                                  TPROXY is required in redir mode.\\n\");\n#endif\n    printf(\n        \"       [-U]                       Enable UDP relay and disable TCP relay.\\n\");\n    printf(\n        \"       [-A]                       Enable onetime authentication.\\n\");\n#ifdef MODULE_REMOTE\n    printf(\n        \"       [-6]                       Resovle hostname to IPv6 address first.\\n\");\n#endif\n    printf(\"\\n\");\n#ifdef MODULE_TUNNEL\n    printf(\n        \"       [-L <addr>:<port>]         Destination server address and port\\n\");\n    printf(\n        \"                                  for local port forwarding.\\n\");\n#endif\n#ifdef MODULE_REMOTE\n    printf(\n        \"       [-d <addr>]                Name servers for internal DNS resolver.\\n\");\n#endif\n#if defined(MODULE_REMOTE) || defined(MODULE_LOCAL)\n    printf(\n        \"       [--fast-open]              Enable TCP fast open.\\n\");\n    printf(\n        \"                                  with Linux kernel > 3.7.0.\\n\");\n    printf(\n        \"       [--acl <acl_file>]         Path to ACL (Access Control List).\\n\");\n#endif\n#if defined(MODULE_REMOTE) || defined(MODULE_MANAGER)\n    printf(\n        \"       [--manager-address <addr>] UNIX domain socket address.\\n\");\n#endif\n#ifdef MODULE_MANAGER\n    printf(\n        \"       [--executable <path>]      Path to the executable of ss-server.\\n\");\n#endif\n    printf(\n        \"       [--mtu <MTU>]              MTU of your network interface.\\n\");\n#ifdef __linux__\n    printf(\n        \"       [--mptcp]                  Enable Multipath TCP on MPTCP Kernel.\\n\");\n#ifdef MODULE_REMOTE\n    printf(\n        \"       [--firewall]               Setup firewall rules for auto blocking.\\n\");\n#endif\n#endif\n    printf(\"\\n\");\n    printf(\n        \"       [-v]                       Verbose mode.\\n\");\n    printf(\n        \"       [-h, --help]               Print this message.\\n\");\n    printf(\"\\n\");\n}\n\nvoid\ndaemonize(const char *path)\n{\n#ifndef __MINGW32__\n    /* Our process ID and Session ID */\n    pid_t pid, sid;\n\n    /* Fork off the parent process */\n    pid = fork();\n    if (pid < 0) {\n        exit(EXIT_FAILURE);\n    }\n\n    /* If we got a good PID, then\n     * we can exit the parent process. */\n    if (pid > 0) {\n        FILE *file = fopen(path, \"w\");\n        if (file == NULL) {\n            FATAL(\"Invalid pid file\\n\");\n        }\n\n        fprintf(file, \"%d\", (int)pid);\n        fclose(file);\n        exit(EXIT_SUCCESS);\n    }\n\n    /* Change the file mode mask */\n    umask(0);\n\n    /* Open any logs here */\n\n    /* Create a new SID for the child process */\n    sid = setsid();\n    if (sid < 0) {\n        /* Log the failure */\n        exit(EXIT_FAILURE);\n    }\n\n    /* Change the current working directory */\n    if ((chdir(\"/\")) < 0) {\n        /* Log the failure */\n        exit(EXIT_FAILURE);\n    }\n\n    /* Close out the standard file descriptors */\n    close(STDIN_FILENO);\n    close(STDOUT_FILENO);\n    close(STDERR_FILENO);\n#endif\n}\n\n#ifdef HAVE_SETRLIMIT\nint\nset_nofile(int nofile)\n{\n    struct rlimit limit = { nofile, nofile }; /* set both soft and hard limit */\n\n    if (nofile <= 0) {\n        FATAL(\"nofile must be greater than 0\\n\");\n    }\n\n    if (setrlimit(RLIMIT_NOFILE, &limit) < 0) {\n        if (errno == EPERM) {\n            LOGE(\n                \"insufficient permission to change NOFILE, not starting as root?\");\n            return -1;\n        } else if (errno == EINVAL) {\n            LOGE(\"invalid nofile, decrease nofile and try again\");\n            return -1;\n        } else {\n            LOGE(\"setrlimit failed: %s\", strerror(errno));\n            return -1;\n        }\n    }\n\n    return 0;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/utils.h",
    "content": "/*\n * utils.h - Misc utilities\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#if defined(USE_CRYPTO_OPENSSL)\n\n#include <openssl/opensslv.h>\n#define USING_CRYPTO OPENSSL_VERSION_TEXT\n\n#elif defined(USE_CRYPTO_POLARSSL)\n#include <polarssl/version.h>\n#define USING_CRYPTO POLARSSL_VERSION_STRING_FULL\n\n#elif defined(USE_CRYPTO_MBEDTLS)\n#include <mbedtls/version.h>\n#define USING_CRYPTO MBEDTLS_VERSION_STRING_FULL\n\n#endif\n\n#ifndef _UTILS_H\n#define _UTILS_H\n\n#include <stddef.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <time.h>\n\n#define PORTSTRLEN 16\n#define SS_ADDRSTRLEN (INET6_ADDRSTRLEN + PORTSTRLEN + 1)\n\n#ifdef ANDROID\n\n#include <android/log.h>\n\n#define USE_TTY()\n#define USE_SYSLOG(ident)\n#define LOGI(...)                                                \\\n    ((void)__android_log_print(ANDROID_LOG_DEBUG, \"shadowsocks\", \\\n                               __VA_ARGS__))\n#define LOGE(...)                                                \\\n    ((void)__android_log_print(ANDROID_LOG_ERROR, \"shadowsocks\", \\\n                               __VA_ARGS__))\n\n#else\n\n#define STR(x) # x\n#define TOSTR(x) STR(x)\n\n#ifdef LIB_ONLY\n\nextern FILE *logfile;\n\n#define TIME_FORMAT \"%Y-%m-%d %H:%M:%S\"\n\n#define USE_TTY()\n\n#define USE_SYSLOG(ident)\n\n#define USE_LOGFILE(ident)                                     \\\n    do {                                                       \\\n        if (ident != NULL) { logfile = fopen(ident, \"w+\"); } } \\\n    while (0)\n\n#define CLOSE_LOGFILE                               \\\n    do {                                            \\\n        if (logfile != NULL) { fclose(logfile); } } \\\n    while (0)\n\n#define LOGI(format, ...)                                                        \\\n    do {                                                                         \\\n        if (logfile != NULL) {                                                   \\\n            time_t now = time(NULL);                                             \\\n            char timestr[20];                                                    \\\n            strftime(timestr, 20, TIME_FORMAT, localtime(&now));                 \\\n            fprintf(logfile, \" %s INFO: \" format \"\\n\", timestr, ## __VA_ARGS__); \\\n            fflush(logfile); }                                                   \\\n    }                                                                            \\\n    while (0)\n\n#define LOGE(format, ...)                                        \\\n    do {                                                         \\\n        if (logfile != NULL) {                                   \\\n            time_t now = time(NULL);                             \\\n            char timestr[20];                                    \\\n            strftime(timestr, 20, TIME_FORMAT, localtime(&now)); \\\n            fprintf(logfile, \" %s ERROR: \" format \"\\n\", timestr, \\\n                    ## __VA_ARGS__);                             \\\n            fflush(logfile); }                                   \\\n    }                                                            \\\n    while (0)\n\n#elif defined(_WIN32)\n\n#define TIME_FORMAT \"%Y-%m-%d %H:%M:%S\"\n\n#define USE_TTY()\n\n#define USE_SYSLOG(ident)\n\n#define LOGI(format, ...)                                                   \\\n    do {                                                                    \\\n        time_t now = time(NULL);                                            \\\n        char timestr[20];                                                   \\\n        strftime(timestr, 20, TIME_FORMAT, localtime(&now));                \\\n        fprintf(stderr, \" %s INFO: \" format \"\\n\", timestr, ## __VA_ARGS__); \\\n        fflush(stderr); }                                                   \\\n    while (0)\n\n#define LOGE(format, ...)                                                    \\\n    do {                                                                     \\\n        time_t now = time(NULL);                                             \\\n        char timestr[20];                                                    \\\n        strftime(timestr, 20, TIME_FORMAT, localtime(&now));                 \\\n        fprintf(stderr, \" %s ERROR: \" format \"\\n\", timestr, ## __VA_ARGS__); \\\n        fflush(stderr); }                                                    \\\n    while (0)\n\n#else\n\n#include <syslog.h>\n\nextern int use_tty;\n#define USE_TTY()                        \\\n    do {                                 \\\n        use_tty = isatty(STDERR_FILENO); \\\n    } while (0)                          \\\n\n#define HAS_SYSLOG\nextern int use_syslog;\n\n#define TIME_FORMAT \"%F %T\"\n\n#define USE_SYSLOG(ident)                          \\\n    do {                                           \\\n        use_syslog = 1;                            \\\n        openlog((ident), LOG_CONS | LOG_PID, 0); } \\\n    while (0)\n\n#define LOGI(format, ...)                                                        \\\n    do {                                                                         \\\n        if (use_syslog) {                                                        \\\n            syslog(LOG_INFO, format, ## __VA_ARGS__);                            \\\n        } else {                                                                 \\\n            time_t now = time(NULL);                                             \\\n            char timestr[20];                                                    \\\n            strftime(timestr, 20, TIME_FORMAT, localtime(&now));                 \\\n            if (use_tty) {                                                       \\\n                fprintf(stderr, \"\\e[01;32m %s INFO: \\e[0m\" format \"\\n\", timestr, \\\n                        ## __VA_ARGS__);                                         \\\n            } else {                                                             \\\n                fprintf(stderr, \" %s INFO: \" format \"\\n\", timestr,               \\\n                        ## __VA_ARGS__);                                         \\\n            }                                                                    \\\n        }                                                                        \\\n    }                                                                            \\\n    while (0)\n\n#define LOGE(format, ...)                                                         \\\n    do {                                                                          \\\n        if (use_syslog) {                                                         \\\n            syslog(LOG_ERR, format, ## __VA_ARGS__);                              \\\n        } else {                                                                  \\\n            time_t now = time(NULL);                                              \\\n            char timestr[20];                                                     \\\n            strftime(timestr, 20, TIME_FORMAT, localtime(&now));                  \\\n            if (use_tty) {                                                        \\\n                fprintf(stderr, \"\\e[01;35m %s ERROR: \\e[0m\" format \"\\n\", timestr, \\\n                        ## __VA_ARGS__);                                          \\\n            } else {                                                              \\\n                fprintf(stderr, \" %s ERROR: \" format \"\\n\", timestr,               \\\n                        ## __VA_ARGS__);                                          \\\n            }                                                                     \\\n        } }                                                                       \\\n    while (0)\n\n#endif\n/* _WIN32 */\n\n#endif\n\n#ifdef __MINGW32__\n\n#ifdef ERROR\n#undef ERROR\n#endif\n#define ERROR(s) ss_error(s)\n\n#else\n\nvoid ERROR(const char *s);\n\n#endif\n\nchar *ss_itoa(int i);\nint ss_isnumeric(const char *s);\nint run_as(const char *user);\nvoid FATAL(const char *msg);\nvoid usage(void);\nvoid daemonize(const char *path);\nchar *ss_strndup(const char *s, size_t n);\n#ifdef HAVE_SETRLIMIT\nint set_nofile(int nofile);\n#endif\n\nvoid *ss_malloc(size_t size);\nvoid *ss_realloc(void *ptr, size_t new_size);\n\n#define ss_free(ptr)     \\\n    do {                 \\\n        free(ptr);       \\\n        ptr = NULL;      \\\n    } while (0)\n\n#endif // _UTILS_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/verify.c",
    "content": "\n#include \"verify.h\"\n\nstatic int verify_simple_pack_unit_size = 2000;\n\ntypedef struct verify_simple_local_data {\n    char * recv_buffer;\n    int recv_buffer_size;\n}verify_simple_local_data;\n\nvoid verify_simple_local_data_init(verify_simple_local_data* local) {\n    local->recv_buffer = (char*)malloc(16384);\n    local->recv_buffer_size = 0;\n}\n\nobfs * verify_simple_new_obfs() {\n    obfs * self = new_obfs();\n    self->l_data = malloc(sizeof(verify_simple_local_data));\n    verify_simple_local_data_init((verify_simple_local_data*)self->l_data);\n    return self;\n}\n\nvoid verify_simple_dispose(obfs *self) {\n    verify_simple_local_data *local = (verify_simple_local_data*)self->l_data;\n    if (local->recv_buffer != NULL) {\n        free(local->recv_buffer);\n        local->recv_buffer = NULL;\n    }\n    free(local);\n    self->l_data = NULL;\n    dispose_obfs(self);\n}\n\nint verify_simple_pack_data(char *data, int datalength, char *outdata) {\n    unsigned char rand_len = (xorshift128plus() & 0xF) + 1;\n    int out_size = rand_len + datalength + 6;\n    outdata[0] = out_size >> 8;\n    outdata[1] = out_size;\n    outdata[2] = rand_len;\n    memmove(outdata + rand_len + 2, data, datalength);\n    fillcrc32((unsigned char *)outdata, out_size);\n    return out_size;\n}\n\nint verify_simple_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity) {\n    char *plaindata = *pplaindata;\n    //verify_simple_local_data *local = (verify_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc(datalength * 2 + 32);\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    while ( len > verify_simple_pack_unit_size ) {\n        pack_len = verify_simple_pack_data(data, verify_simple_pack_unit_size, buffer);\n        buffer += pack_len;\n        data += verify_simple_pack_unit_size;\n        len -= verify_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = verify_simple_pack_data(data, len, buffer);\n        buffer += pack_len;\n    }\n    len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint verify_simple_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity) {\n    char *plaindata = *pplaindata;\n    verify_simple_local_data *local = (verify_simple_local_data*)self->l_data;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    char * out_buffer = (char*)malloc(local->recv_buffer_size);\n    char * buffer = out_buffer;\n    while (local->recv_buffer_size > 2) {\n        int length = ((int)recv_buffer[0] << 8) | recv_buffer[1];\n        if (length >= 8192 || length < 7) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        int crc = crc32((unsigned char*)recv_buffer, length);\n        if (crc != -1) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        int data_size = length - recv_buffer[2] - 6;\n        memmove(buffer, recv_buffer + 2 + recv_buffer[2], data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint verify_simple_server_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity) {\n    char *plaindata = *pplaindata;\n    //verify_simple_local_data *local = (verify_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc(datalength * 2 + 32);\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    while ( len > verify_simple_pack_unit_size ) {\n        pack_len = verify_simple_pack_data(data, verify_simple_pack_unit_size, buffer);\n        buffer += pack_len;\n        data += verify_simple_pack_unit_size;\n        len -= verify_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = verify_simple_pack_data(data, len, buffer);\n        buffer += pack_len;\n    }\n    len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint verify_simple_server_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity) {\n    char *plaindata = *pplaindata;\n    verify_simple_local_data *local = (verify_simple_local_data*)self->l_data;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n    {\n        LOGE(\"verify_simple: wrong buf length %d\", local->recv_buffer_size + datalength);\n        return -1;\n    }\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    char * out_buffer = (char*)malloc(local->recv_buffer_size);\n    char * buffer = out_buffer;\n    while (local->recv_buffer_size > 2) {\n        int length = ((int)recv_buffer[0] << 8) | recv_buffer[1];\n        if (length >= 8192 || length < 7) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            LOGE(\"verify_simple: wrong length %d\", length);\n            return -1;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        int crc = crc32((unsigned char*)recv_buffer, length);\n        if (crc != -1) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            LOGE(\"verify_simple: wrong crc\");\n            return -1;\n        }\n        int data_size = length - recv_buffer[2] - 6;\n        memmove(buffer, recv_buffer + 2 + recv_buffer[2], data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/server/verify.h",
    "content": "/*\n * verify.h - Define shadowsocksR server's buffers and callbacks\n *\n * Copyright (C) 2015 - 2016, Break Wa11 <mmgac001@gmail.com>\n */\n\n#ifndef _VERIFY_H\n#define _VERIFY_H\n\nobfs * verify_simple_new_obfs();\nvoid verify_simple_dispose(obfs *self);\n\nint verify_simple_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint verify_simple_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\nint verify_simple_server_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint verify_simple_server_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\n#endif // _VERIFY_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/shadowsocks-libev.pc.in",
    "content": "prefix=@prefix@\nexec_prefix=@exec_prefix@\nlibdir=@libdir@\nincludedir=@includedir@\n\nName: shadowsocks-libev\nDescription: a lightweight secured socks5 proxy\nURL: http://shadowsocks.org\nVersion: @VERSION@\nRequires:\nCflags: -I${includedir}\nLibs: -L${libdir} -lshadowsocks-libev -lcrypto\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/CMakeLists.txt",
    "content": "\nset(CMAKE_C_STANDARD 99)\n\nset(SOURCE_FILES_SNI\n        http.c\n        http.h\n        tls.c\n        tls.h\n        rule.c\n        rule.h)\n\nset(SOURCE_FILES_OBFS\n        obfs/verify.c\n        obfs/verify.h\n        obfs/tls1.2_ticket.c\n        obfs/tls1.2_ticket.h\n        obfs/obfsutil.c\n        obfs/obfsutil.h\n        obfs/obfs.c\n        obfs/obfs.h\n        obfs/http_simple.c\n        obfs/http_simple.h\n        obfs/crc32.c\n        obfs/crc32.h\n        obfs/base64.c\n        obfs/base64.h\n        obfs/auth_chain.c\n        obfs/auth_chain.h\n        obfs/auth.c\n        obfs/auth.h)\n\nset(SOURCE_FILES_LOCAL\n        utils.c\n        utils.h\n        jconf.c\n        jconf.h\n        json.c\n        json.h\n        encrypt.c\n        encrypt.h\n        udprelay.c\n        udprelay.h\n        cache.c\n        cache.h\n        acl.c\n        acl.h\n        netutils.c\n        netutils.h\n        local.c\n        local.h\n        ${SOURCE_FILES_OBFS}\n        ${SOURCE_FILES_SNI})\n\nset(SOURCE_FILES_TUNNEL\n        utils.c\n        utils.h\n        jconf.c\n        jconf.h\n        json.c\n        json.h\n        encrypt.c\n        encrypt.h\n        udprelay.c\n        udprelay.h\n        cache.c\n        cache.h\n        netutils.c\n        netutils.h\n        tunnel.c\n        tunnel.h)\n\nset(SOURCE_FILES_SERVER\n        utils.c\n        utils.h\n        jconf.c\n        jconf.h\n        json.c\n        json.h\n        encrypt.c\n        encrypt.h\n        udprelay.c\n        udprelay.h\n        cache.c\n        cache.h\n        acl.c\n        acl.h\n        resolv.c\n        resolv.h\n        netutils.c\n        netutils.h\n        server.c\n        server.h\n        ${SOURCE_FILES_OBFS}\n        ${SOURCE_FILES_SNI})\n\nset(SOURCE_FILES_MANAGER\n        utils.c\n        utils.h\n        jconf.c\n        jconf.h\n        json.c\n        json.h\n        manager.c)\n\nset(SOURCE_FILES_REDIR\n        utils.c\n        utils.h\n        jconf.c\n        jconf.h\n        json.c\n        json.h\n        encrypt.c\n        encrypt.h\n        netutils.c\n        netutils.h\n        cache.c\n        cache.h\n        udprelay.c\n        udprelay.h\n        redir.c\n        redir.h\n        ${SOURCE_FILES_SNI})\n\ninclude_directories(${CMAKE_CURRENT_SOURCE_DIR})\ninclude_directories(${CMAKE_CURRENT_BINARY_DIR})\ninclude_directories(${libev_include_dirs})\ninclude_directories(${libcork_include_dirs})\ninclude_directories(${libipset_include_dirs})\ninclude_directories(${libudns_include_dirs})\ninclude_directories(${libsodium_include_dirs})\n\n\nif (WIN32)\n    list ( APPEND SOURCE_FILES_LOCAL win32.c )\n    list ( APPEND SOURCE_FILES_TUNNEL win32.c )\n    list ( APPEND SOURCE_FILES_SERVER win32.c )\nendif ()\n\nadd_executable(ss_local ${SOURCE_FILES_LOCAL})\n#add_executable(ss_tunnel ${SOURCE_FILES_TUNNEL})\n#add_executable(ss_server ${SOURCE_FILES_SERVER})\n#add_executable(ss_manager ${SOURCE_FILES_MANAGER})\nadd_executable(ss_redir ${SOURCE_FILES_REDIR})\nadd_library(libshadowsocks-libev ${SOURCE_FILES_LOCAL})\n\nset_target_properties(ss_local PROPERTIES\n        COMPILE_DEFINITIONS MODULE_LOCAL\n        )\n#set_target_properties(ss_tunnel PROPERTIES\n#        COMPILE_DEFINITIONS MODULE_TUNNEL\n#        )\n#set_target_properties(ss_server PROPERTIES\n#        COMPILE_DEFINITIONS MODULE_REMOTE\n#        )\n#set_target_properties(ss_manager PROPERTIES\n#        COMPILE_DEFINITIONS MODULE_MANAGER\n#        )\nset_target_properties(ss_redir PROPERTIES\n        COMPILE_DEFINITIONS MODULE_REDIR\n        )\ntarget_compile_definitions(libshadowsocks-libev\n        PRIVATE MODULE_LOCAL LIB_ONLY\n        )\nset_target_properties(libshadowsocks-libev PROPERTIES SUFFIX \".la\")\n\nset (ss_lib_common\n        ev\n        m\n        libcork)\n\nset (ss_lib_net\n        ${ss_lib_common}\n        ${LIBCRYPTO}\n        libipset\n        ${PCRE_LIBRARIES}\n        udns\n        sodium\n        )\n\nif (WIN32)\n    list ( APPEND ss_lib_net Ws2_32 )\nendif()\n\ntarget_link_libraries(ss_local\n        ${ss_lib_net}\n)\n#target_link_libraries(ss_tunnel\n#        ${ss_lib_net}\n#        )\n#target_link_libraries(ss_server\n#        ${ss_lib_net}\n#        )\n#target_link_libraries(ss_manager\n#        ${ss_lib_common}\n#        )\ntarget_link_libraries(ss_redir\n        ${ss_lib_net}\n        )"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/Makefile.am",
    "content": "VERSION_INFO = 2:0:0\n\nAM_CFLAGS = -g -O2 -Wall -Werror -Wno-deprecated-declarations -fno-strict-aliasing -std=gnu99 -D_GNU_SOURCE\nAM_CFLAGS += $(PTHREAD_CFLAGS)\nif !USE_SYSTEM_SHARED_LIB\nAM_CFLAGS += -I$(top_srcdir)/libev\nAM_CFLAGS += -I$(top_srcdir)/libudns\nAM_CFLAGS += -I$(top_srcdir)/libsodium/src/libsodium/include\nendif\nAM_CFLAGS += -I$(top_srcdir)/libipset/include\nAM_CFLAGS += -I$(top_srcdir)/libcork/include\nAM_CFLAGS += $(LIBPCRE_CFLAGS)\n\nSS_COMMON_LIBS = $(top_builddir)/libipset/libipset.la \\\n                 $(top_builddir)/libcork/libcork.la \\\n                 $(INET_NTOP_LIB) $(LIBPCRE_LIBS)\nif USE_SYSTEM_SHARED_LIB\nSS_COMMON_LIBS += -lev -lsodium -lm\nelse\nSS_COMMON_LIBS += $(top_builddir)/libev/libev.la \\\n                  $(top_builddir)/libsodium/src/libsodium/libsodium.la\nendif\n\nbin_PROGRAMS = ss-local\n#bin_PROGRAMS += ss-tunnel\nif !BUILD_WINCOMPAT\n#bin_PROGRAMS += ss-server ss-manager\nendif\n\nsni_src = http.c \\\n          tls.c \\\n          rule.c\n\nss_local_SOURCES = utils.c \\\n                   jconf.c \\\n                   json.c \\\n                   encrypt.c \\\n                   udprelay.c \\\n                   cache.c \\\n                   acl.c \\\n                   netutils.c \\\n                   local.c \\\n                   $(sni_src)\n\n#ss_tunnel_SOURCES = utils.c \\\n#                    jconf.c \\\n#                    json.c \\\n#                    encrypt.c \\\n#                    udprelay.c \\\n#                    cache.c \\\n#                    netutils.c \\\n#                    tunnel.c\n#\n#ss_server_SOURCES = utils.c \\\n#                    netutils.c \\\n#                    jconf.c \\\n#                    json.c \\\n#                    encrypt.c \\\n#                    udprelay.c \\\n#                    cache.c \\\n#                    acl.c \\\n#                    resolv.c \\\n#                    server.c \\\n#                    $(sni_src)\n#\n#ss_manager_SOURCES = utils.c \\\n#                     jconf.c \\\n#                     json.c \\\n#                     manager.c\n\nss_local_LDADD = $(SS_COMMON_LIBS)\n#ss_tunnel_LDADD = $(SS_COMMON_LIBS)\n#ss_server_LDADD = $(SS_COMMON_LIBS)\n#ss_manager_LDADD = $(SS_COMMON_LIBS)\nif USE_SYSTEM_SHARED_LIB\nss_local_LDADD += -ludns\n#ss_tunnel_LDADD += -ludns\n#ss_server_LDADD += -ludns\nelse\nss_local_LDADD += $(top_builddir)/libudns/libudns.la\n#ss_tunnel_LDADD += $(top_builddir)/libudns/libudns.la\n#ss_server_LDADD += $(top_builddir)/libudns/libudns.la\nendif\n\nss_local_CFLAGS = $(AM_CFLAGS) -DMODULE_LOCAL\n#ss_tunnel_CFLAGS = $(AM_CFLAGS) -DMODULE_TUNNEL\n#ss_server_CFLAGS = $(AM_CFLAGS) -DMODULE_REMOTE\n#ss_manager_CFLAGS = $(AM_CFLAGS) -DMODULE_MANAGER\n\nif BUILD_WINCOMPAT\nss_local_SOURCES += win32.c\n#ss_tunnel_SOURCES += win32.c\nendif\n\nif BUILD_REDIRECTOR\nbin_SCRIPTS = ss-nat\nbin_PROGRAMS += ss-redir\nss_redir_SOURCES = utils.c \\\n                   jconf.c \\\n                   json.c \\\n                   encrypt.c \\\n                   netutils.c \\\n                   cache.c \\\n                   udprelay.c \\\n                   redir.c \\\n                   $(sni_src)\nss_redir_CFLAGS = $(AM_CFLAGS) -DMODULE_REDIR\nss_redir_LDADD = $(SS_COMMON_LIBS)\nif USE_SYSTEM_SHARED_LIB\nss_redir_LDADD += -ludns\nelse\nss_redir_LDADD += $(top_builddir)/libudns/libudns.la\nendif\nendif\n\nlib_LTLIBRARIES = libshadowsocks-libev.la\nlibshadowsocks_libev_la_SOURCES = $(ss_local_SOURCES)\nlibshadowsocks_libev_la_CFLAGS = $(ss_local_CFLAGS) -DLIB_ONLY\nlibshadowsocks_libev_la_LDFLAGS = -version-info $(VERSION_INFO)\nlibshadowsocks_libev_la_LIBADD = $(ss_local_LDADD)\ninclude_HEADERS = shadowsocks.h\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/Makefile.in",
    "content": "# Makefile.in generated by automake 1.15 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2014 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\n\n\n\nVPATH = @srcdir@\nam__is_gnu_make = { \\\n  if test -z '$(MAKELEVEL)'; then \\\n    false; \\\n  elif test -n '$(MAKE_HOST)'; then \\\n    true; \\\n  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \\\n    true; \\\n  else \\\n    false; \\\n  fi; \\\n}\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\n@USE_SYSTEM_SHARED_LIB_FALSE@am__append_1 = -I$(top_srcdir)/libev \\\n@USE_SYSTEM_SHARED_LIB_FALSE@\t-I$(top_srcdir)/libudns \\\n@USE_SYSTEM_SHARED_LIB_FALSE@\t-I$(top_srcdir)/libsodium/src/libsodium/include\n@USE_SYSTEM_SHARED_LIB_TRUE@am__append_2 = -lev -lsodium -lm\n@USE_SYSTEM_SHARED_LIB_FALSE@am__append_3 = $(top_builddir)/libev/libev.la \\\n@USE_SYSTEM_SHARED_LIB_FALSE@                  $(top_builddir)/libsodium/src/libsodium/libsodium.la\n\nbin_PROGRAMS = ss-local$(EXEEXT) $(am__EXEEXT_1)\n#ss_tunnel_LDADD = $(SS_COMMON_LIBS)\n#ss_server_LDADD = $(SS_COMMON_LIBS)\n#ss_manager_LDADD = $(SS_COMMON_LIBS)\n@USE_SYSTEM_SHARED_LIB_TRUE@am__append_4 = -ludns\n#ss_tunnel_LDADD += -ludns\n#ss_server_LDADD += -ludns\n@USE_SYSTEM_SHARED_LIB_FALSE@am__append_5 = $(top_builddir)/libudns/libudns.la\n#ss_tunnel_CFLAGS = $(AM_CFLAGS) -DMODULE_TUNNEL\n#ss_server_CFLAGS = $(AM_CFLAGS) -DMODULE_REMOTE\n#ss_manager_CFLAGS = $(AM_CFLAGS) -DMODULE_MANAGER\n@BUILD_WINCOMPAT_TRUE@am__append_6 = win32.c\n@BUILD_REDIRECTOR_TRUE@am__append_7 = ss-redir\n@BUILD_REDIRECTOR_TRUE@@USE_SYSTEM_SHARED_LIB_TRUE@am__append_8 = -ludns\n@BUILD_REDIRECTOR_TRUE@@USE_SYSTEM_SHARED_LIB_FALSE@am__append_9 = $(top_builddir)/libudns/libudns.la\nsubdir = src\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \\\n\t$(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/inet_ntop.m4 \\\n\t$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \\\n\t$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \\\n\t$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/mbedtls.m4 \\\n\t$(top_srcdir)/m4/openssl.m4 $(top_srcdir)/m4/pcre.m4 \\\n\t$(top_srcdir)/m4/polarssl.m4 \\\n\t$(top_srcdir)/m4/stack-protector.m4 $(top_srcdir)/m4/zlib.m4 \\\n\t$(top_srcdir)/libev/libev.m4 $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nDIST_COMMON = $(srcdir)/Makefile.am $(include_HEADERS) \\\n\t$(am__DIST_COMMON)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nam__vpath_adj_setup = srcdirstrip=`echo \"$(srcdir)\" | sed 's|.|.|g'`;\nam__vpath_adj = case $$p in \\\n    $(srcdir)/*) f=`echo \"$$p\" | sed \"s|^$$srcdirstrip/||\"`;; \\\n    *) f=$$p;; \\\n  esac;\nam__strip_dir = f=`echo $$p | sed -e 's|^.*/||'`;\nam__install_max = 40\nam__nobase_strip_setup = \\\n  srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*|]/\\\\\\\\&/g'`\nam__nobase_strip = \\\n  for p in $$list; do echo \"$$p\"; done | sed -e \"s|$$srcdirstrip/||\"\nam__nobase_list = $(am__nobase_strip_setup); \\\n  for p in $$list; do echo \"$$p $$p\"; done | \\\n  sed \"s| $$srcdirstrip/| |;\"' / .*\\//!s/ .*/ ./; s,\\( .*\\)/[^/]*$$,\\1,' | \\\n  $(AWK) 'BEGIN { files[\".\"] = \"\" } { files[$$2] = files[$$2] \" \" $$1; \\\n    if (++n[$$2] == $(am__install_max)) \\\n      { print $$2, files[$$2]; n[$$2] = 0; files[$$2] = \"\" } } \\\n    END { for (dir in files) print dir, files[dir] }'\nam__base_list = \\\n  sed '$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;$$!N;s/\\n/ /g' | \\\n  sed '$$!N;$$!N;$$!N;$$!N;s/\\n/ /g'\nam__uninstall_files_from_dir = { \\\n  test -z \"$$files\" \\\n    || { test ! -d \"$$dir\" && test ! -f \"$$dir\" && test ! -r \"$$dir\"; } \\\n    || { echo \" ( cd '$$dir' && rm -f\" $$files \")\"; \\\n         $(am__cd) \"$$dir\" && rm -f $$files; }; \\\n  }\nam__installdirs = \"$(DESTDIR)$(libdir)\" \"$(DESTDIR)$(bindir)\" \\\n\t\"$(DESTDIR)$(bindir)\" \"$(DESTDIR)$(includedir)\"\nLTLIBRARIES = $(lib_LTLIBRARIES)\nam__DEPENDENCIES_1 =\nam__DEPENDENCIES_2 = $(top_builddir)/libipset/libipset.la \\\n\t$(top_builddir)/libcork/libcork.la $(am__DEPENDENCIES_1) \\\n\t$(am__DEPENDENCIES_1) $(am__append_3)\nam__DEPENDENCIES_3 = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \\\n\t$(am__append_5)\nlibshadowsocks_libev_la_DEPENDENCIES = $(am__DEPENDENCIES_3)\nam__libshadowsocks_libev_la_SOURCES_DIST = utils.c jconf.c json.c \\\n\tencrypt.c udprelay.c cache.c acl.c netutils.c local.c http.c \\\n\ttls.c rule.c win32.c\nam__objects_1 = libshadowsocks_libev_la-http.lo \\\n\tlibshadowsocks_libev_la-tls.lo libshadowsocks_libev_la-rule.lo\n@BUILD_WINCOMPAT_TRUE@am__objects_2 =  \\\n@BUILD_WINCOMPAT_TRUE@\tlibshadowsocks_libev_la-win32.lo\nam__objects_3 = libshadowsocks_libev_la-utils.lo \\\n\tlibshadowsocks_libev_la-jconf.lo \\\n\tlibshadowsocks_libev_la-json.lo \\\n\tlibshadowsocks_libev_la-encrypt.lo \\\n\tlibshadowsocks_libev_la-udprelay.lo \\\n\tlibshadowsocks_libev_la-cache.lo \\\n\tlibshadowsocks_libev_la-acl.lo \\\n\tlibshadowsocks_libev_la-netutils.lo \\\n\tlibshadowsocks_libev_la-local.lo $(am__objects_1) \\\n\t$(am__objects_2)\nam_libshadowsocks_libev_la_OBJECTS = $(am__objects_3)\nlibshadowsocks_libev_la_OBJECTS =  \\\n\t$(am_libshadowsocks_libev_la_OBJECTS)\nAM_V_lt = $(am__v_lt_@AM_V@)\nam__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)\nam__v_lt_0 = --silent\nam__v_lt_1 = \nlibshadowsocks_libev_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC \\\n\t$(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=link $(CCLD) \\\n\t$(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) \\\n\t$(libshadowsocks_libev_la_LDFLAGS) $(LDFLAGS) -o $@\n@BUILD_REDIRECTOR_TRUE@am__EXEEXT_1 = ss-redir$(EXEEXT)\nPROGRAMS = $(bin_PROGRAMS)\nam__ss_local_SOURCES_DIST = utils.c jconf.c json.c encrypt.c \\\n\tudprelay.c cache.c acl.c netutils.c local.c http.c tls.c \\\n\trule.c win32.c\nam__objects_4 = ss_local-http.$(OBJEXT) ss_local-tls.$(OBJEXT) \\\n\tss_local-rule.$(OBJEXT)\n@BUILD_WINCOMPAT_TRUE@am__objects_5 = ss_local-win32.$(OBJEXT)\nam_ss_local_OBJECTS = ss_local-utils.$(OBJEXT) \\\n\tss_local-jconf.$(OBJEXT) ss_local-json.$(OBJEXT) \\\n\tss_local-encrypt.$(OBJEXT) ss_local-udprelay.$(OBJEXT) \\\n\tss_local-cache.$(OBJEXT) ss_local-acl.$(OBJEXT) \\\n\tss_local-netutils.$(OBJEXT) ss_local-local.$(OBJEXT) \\\n\t$(am__objects_4) $(am__objects_5)\nss_local_OBJECTS = $(am_ss_local_OBJECTS)\nss_local_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \\\n\t$(am__append_5)\nss_local_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(ss_local_CFLAGS) \\\n\t$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nam__ss_redir_SOURCES_DIST = utils.c jconf.c json.c encrypt.c \\\n\tnetutils.c cache.c udprelay.c redir.c http.c tls.c rule.c\nam__objects_6 = ss_redir-http.$(OBJEXT) ss_redir-tls.$(OBJEXT) \\\n\tss_redir-rule.$(OBJEXT)\n@BUILD_REDIRECTOR_TRUE@am_ss_redir_OBJECTS = ss_redir-utils.$(OBJEXT) \\\n@BUILD_REDIRECTOR_TRUE@\tss_redir-jconf.$(OBJEXT) \\\n@BUILD_REDIRECTOR_TRUE@\tss_redir-json.$(OBJEXT) \\\n@BUILD_REDIRECTOR_TRUE@\tss_redir-encrypt.$(OBJEXT) \\\n@BUILD_REDIRECTOR_TRUE@\tss_redir-netutils.$(OBJEXT) \\\n@BUILD_REDIRECTOR_TRUE@\tss_redir-cache.$(OBJEXT) \\\n@BUILD_REDIRECTOR_TRUE@\tss_redir-udprelay.$(OBJEXT) \\\n@BUILD_REDIRECTOR_TRUE@\tss_redir-redir.$(OBJEXT) \\\n@BUILD_REDIRECTOR_TRUE@\t$(am__objects_6)\nss_redir_OBJECTS = $(am_ss_redir_OBJECTS)\n@BUILD_REDIRECTOR_TRUE@ss_redir_DEPENDENCIES = $(am__DEPENDENCIES_2) \\\n@BUILD_REDIRECTOR_TRUE@\t$(am__DEPENDENCIES_1) $(am__append_9)\nss_redir_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(ss_redir_CFLAGS) \\\n\t$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nSCRIPTS = $(bin_SCRIPTS)\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nDEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)\ndepcomp = $(SHELL) $(top_srcdir)/auto/depcomp\nam__depfiles_maybe = depfiles\nam__mv = mv -f\nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nLTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \\\n\t$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \\\n\t$(AM_CFLAGS) $(CFLAGS)\nAM_V_CC = $(am__v_CC_@AM_V@)\nam__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)\nam__v_CC_0 = @echo \"  CC      \" $@;\nam__v_CC_1 = \nCCLD = $(CC)\nLINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \\\n\t$(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_CCLD = $(am__v_CCLD_@AM_V@)\nam__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)\nam__v_CCLD_0 = @echo \"  CCLD    \" $@;\nam__v_CCLD_1 = \nSOURCES = $(libshadowsocks_libev_la_SOURCES) $(ss_local_SOURCES) \\\n\t$(ss_redir_SOURCES)\nDIST_SOURCES = $(am__libshadowsocks_libev_la_SOURCES_DIST) \\\n\t$(am__ss_local_SOURCES_DIST) $(am__ss_redir_SOURCES_DIST)\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nHEADERS = $(include_HEADERS)\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nam__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/auto/depcomp\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAR = @AR@\nASCIIDOC = @ASCIIDOC@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDLLTOOL = @DLLTOOL@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nGZIP = @GZIP@\nINET_NTOP_LIB = @INET_NTOP_LIB@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBPCRE = @LIBPCRE@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMANIFEST_TOOL = @MANIFEST_TOOL@\nMKDIR_P = @MKDIR_P@\nMV = @MV@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nPCRE_CONFIG = @PCRE_CONFIG@\nPTHREAD_CC = @PTHREAD_CC@\nPTHREAD_CFLAGS = @PTHREAD_CFLAGS@\nPTHREAD_LIBS = @PTHREAD_LIBS@\nRANLIB = @RANLIB@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nXMLTO = @XMLTO@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_AR = @ac_ct_AR@\nac_ct_CC = @ac_ct_CC@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nax_pthread_config = @ax_pthread_config@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npcre_pcreh = @pcre_pcreh@\npcreh = @pcreh@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nrunstatedir = @runstatedir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsubdirs = @subdirs@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nVERSION_INFO = 2:0:0\nAM_CFLAGS = -g -O2 -Wall -Werror -Wno-deprecated-declarations \\\n\t-fno-strict-aliasing -std=gnu99 -D_GNU_SOURCE \\\n\t$(PTHREAD_CFLAGS) $(am__append_1) \\\n\t-I$(top_srcdir)/libipset/include \\\n\t-I$(top_srcdir)/libcork/include $(LIBPCRE_CFLAGS)\nSS_COMMON_LIBS = $(top_builddir)/libipset/libipset.la \\\n\t$(top_builddir)/libcork/libcork.la $(INET_NTOP_LIB) \\\n\t$(LIBPCRE_LIBS) $(am__append_2) $(am__append_3)\n#bin_PROGRAMS += ss-tunnel\n#bin_PROGRAMS += ss-server ss-manager\nsni_src = http.c \\\n          tls.c \\\n          rule.c\n\nss_local_SOURCES = utils.c jconf.c json.c encrypt.c udprelay.c cache.c \\\n\tacl.c netutils.c local.c $(sni_src) $(am__append_6)\n\n#ss_tunnel_SOURCES = utils.c \\\n#                    jconf.c \\\n#                    json.c \\\n#                    encrypt.c \\\n#                    udprelay.c \\\n#                    cache.c \\\n#                    netutils.c \\\n#                    tunnel.c\n#\n#ss_server_SOURCES = utils.c \\\n#                    netutils.c \\\n#                    jconf.c \\\n#                    json.c \\\n#                    encrypt.c \\\n#                    udprelay.c \\\n#                    cache.c \\\n#                    acl.c \\\n#                    resolv.c \\\n#                    server.c \\\n#                    $(sni_src)\n#\n#ss_manager_SOURCES = utils.c \\\n#                     jconf.c \\\n#                     json.c \\\n#                     manager.c\nss_local_LDADD = $(SS_COMMON_LIBS) $(am__append_4) $(am__append_5)\n#ss_tunnel_LDADD += $(top_builddir)/libudns/libudns.la\n#ss_server_LDADD += $(top_builddir)/libudns/libudns.la\nss_local_CFLAGS = $(AM_CFLAGS) -DMODULE_LOCAL\n#ss_tunnel_SOURCES += win32.c\n@BUILD_REDIRECTOR_TRUE@bin_SCRIPTS = ss-nat\n@BUILD_REDIRECTOR_TRUE@ss_redir_SOURCES = utils.c \\\n@BUILD_REDIRECTOR_TRUE@                   jconf.c \\\n@BUILD_REDIRECTOR_TRUE@                   json.c \\\n@BUILD_REDIRECTOR_TRUE@                   encrypt.c \\\n@BUILD_REDIRECTOR_TRUE@                   netutils.c \\\n@BUILD_REDIRECTOR_TRUE@                   cache.c \\\n@BUILD_REDIRECTOR_TRUE@                   udprelay.c \\\n@BUILD_REDIRECTOR_TRUE@                   redir.c \\\n@BUILD_REDIRECTOR_TRUE@                   $(sni_src)\n\n@BUILD_REDIRECTOR_TRUE@ss_redir_CFLAGS = $(AM_CFLAGS) -DMODULE_REDIR\n@BUILD_REDIRECTOR_TRUE@ss_redir_LDADD = $(SS_COMMON_LIBS) \\\n@BUILD_REDIRECTOR_TRUE@\t$(am__append_8) $(am__append_9)\nlib_LTLIBRARIES = libshadowsocks-libev.la\nlibshadowsocks_libev_la_SOURCES = $(ss_local_SOURCES)\nlibshadowsocks_libev_la_CFLAGS = $(ss_local_CFLAGS) -DLIB_ONLY\nlibshadowsocks_libev_la_LDFLAGS = -version-info $(VERSION_INFO)\nlibshadowsocks_libev_la_LIBADD = $(ss_local_LDADD)\ninclude_HEADERS = shadowsocks.h\nall: all-am\n\n.SUFFIXES:\n.SUFFIXES: .c .lo .o .obj\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign src/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign src/Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\n\ninstall-libLTLIBRARIES: $(lib_LTLIBRARIES)\n\t@$(NORMAL_INSTALL)\n\t@list='$(lib_LTLIBRARIES)'; test -n \"$(libdir)\" || list=; \\\n\tlist2=; for p in $$list; do \\\n\t  if test -f $$p; then \\\n\t    list2=\"$$list2 $$p\"; \\\n\t  else :; fi; \\\n\tdone; \\\n\ttest -z \"$$list2\" || { \\\n\t  echo \" $(MKDIR_P) '$(DESTDIR)$(libdir)'\"; \\\n\t  $(MKDIR_P) \"$(DESTDIR)$(libdir)\" || exit 1; \\\n\t  echo \" $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(libdir)'\"; \\\n\t  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 \"$(DESTDIR)$(libdir)\"; \\\n\t}\n\nuninstall-libLTLIBRARIES:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(lib_LTLIBRARIES)'; test -n \"$(libdir)\" || list=; \\\n\tfor p in $$list; do \\\n\t  $(am__strip_dir) \\\n\t  echo \" $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(libdir)/$$f'\"; \\\n\t  $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f \"$(DESTDIR)$(libdir)/$$f\"; \\\n\tdone\n\nclean-libLTLIBRARIES:\n\t-test -z \"$(lib_LTLIBRARIES)\" || rm -f $(lib_LTLIBRARIES)\n\t@list='$(lib_LTLIBRARIES)'; \\\n\tlocs=`for p in $$list; do echo $$p; done | \\\n\t      sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \\\n\t      sort -u`; \\\n\ttest -z \"$$locs\" || { \\\n\t  echo rm -f $${locs}; \\\n\t  rm -f $${locs}; \\\n\t}\n\nlibshadowsocks-libev.la: $(libshadowsocks_libev_la_OBJECTS) $(libshadowsocks_libev_la_DEPENDENCIES) $(EXTRA_libshadowsocks_libev_la_DEPENDENCIES) \n\t$(AM_V_CCLD)$(libshadowsocks_libev_la_LINK) -rpath $(libdir) $(libshadowsocks_libev_la_OBJECTS) $(libshadowsocks_libev_la_LIBADD) $(LIBS)\ninstall-binPROGRAMS: $(bin_PROGRAMS)\n\t@$(NORMAL_INSTALL)\n\t@list='$(bin_PROGRAMS)'; test -n \"$(bindir)\" || list=; \\\n\tif test -n \"$$list\"; then \\\n\t  echo \" $(MKDIR_P) '$(DESTDIR)$(bindir)'\"; \\\n\t  $(MKDIR_P) \"$(DESTDIR)$(bindir)\" || exit 1; \\\n\tfi; \\\n\tfor p in $$list; do echo \"$$p $$p\"; done | \\\n\tsed 's/$(EXEEXT)$$//' | \\\n\twhile read p p1; do if test -f $$p \\\n\t || test -f $$p1 \\\n\t  ; then echo \"$$p\"; echo \"$$p\"; else :; fi; \\\n\tdone | \\\n\tsed -e 'p;s,.*/,,;n;h' \\\n\t    -e 's|.*|.|' \\\n\t    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \\\n\tsed 'N;N;N;s,\\n, ,g' | \\\n\t$(AWK) 'BEGIN { files[\".\"] = \"\"; dirs[\".\"] = 1 } \\\n\t  { d=$$3; if (dirs[d] != 1) { print \"d\", d; dirs[d] = 1 } \\\n\t    if ($$2 == $$4) files[d] = files[d] \" \" $$1; \\\n\t    else { print \"f\", $$3 \"/\" $$4, $$1; } } \\\n\t  END { for (d in files) print \"f\", d, files[d] }' | \\\n\twhile read type dir files; do \\\n\t    if test \"$$dir\" = .; then dir=; else dir=/$$dir; fi; \\\n\t    test -z \"$$files\" || { \\\n\t    echo \" $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'\"; \\\n\t    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files \"$(DESTDIR)$(bindir)$$dir\" || exit $$?; \\\n\t    } \\\n\t; done\n\nuninstall-binPROGRAMS:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(bin_PROGRAMS)'; test -n \"$(bindir)\" || list=; \\\n\tfiles=`for p in $$list; do echo \"$$p\"; done | \\\n\t  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \\\n\t      -e 's/$$/$(EXEEXT)/' \\\n\t`; \\\n\ttest -n \"$$list\" || exit 0; \\\n\techo \" ( cd '$(DESTDIR)$(bindir)' && rm -f\" $$files \")\"; \\\n\tcd \"$(DESTDIR)$(bindir)\" && rm -f $$files\n\nclean-binPROGRAMS:\n\t@list='$(bin_PROGRAMS)'; test -n \"$$list\" || exit 0; \\\n\techo \" rm -f\" $$list; \\\n\trm -f $$list || exit $$?; \\\n\ttest -n \"$(EXEEXT)\" || exit 0; \\\n\tlist=`for p in $$list; do echo \"$$p\"; done | sed 's/$(EXEEXT)$$//'`; \\\n\techo \" rm -f\" $$list; \\\n\trm -f $$list\n\nss-local$(EXEEXT): $(ss_local_OBJECTS) $(ss_local_DEPENDENCIES) $(EXTRA_ss_local_DEPENDENCIES) \n\t@rm -f ss-local$(EXEEXT)\n\t$(AM_V_CCLD)$(ss_local_LINK) $(ss_local_OBJECTS) $(ss_local_LDADD) $(LIBS)\n\nss-redir$(EXEEXT): $(ss_redir_OBJECTS) $(ss_redir_DEPENDENCIES) $(EXTRA_ss_redir_DEPENDENCIES) \n\t@rm -f ss-redir$(EXEEXT)\n\t$(AM_V_CCLD)$(ss_redir_LINK) $(ss_redir_OBJECTS) $(ss_redir_LDADD) $(LIBS)\ninstall-binSCRIPTS: $(bin_SCRIPTS)\n\t@$(NORMAL_INSTALL)\n\t@list='$(bin_SCRIPTS)'; test -n \"$(bindir)\" || list=; \\\n\tif test -n \"$$list\"; then \\\n\t  echo \" $(MKDIR_P) '$(DESTDIR)$(bindir)'\"; \\\n\t  $(MKDIR_P) \"$(DESTDIR)$(bindir)\" || exit 1; \\\n\tfi; \\\n\tfor p in $$list; do \\\n\t  if test -f \"$$p\"; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  if test -f \"$$d$$p\"; then echo \"$$d$$p\"; echo \"$$p\"; else :; fi; \\\n\tdone | \\\n\tsed -e 'p;s,.*/,,;n' \\\n\t    -e 'h;s|.*|.|' \\\n\t    -e 'p;x;s,.*/,,;$(transform)' | sed 'N;N;N;s,\\n, ,g' | \\\n\t$(AWK) 'BEGIN { files[\".\"] = \"\"; dirs[\".\"] = 1; } \\\n\t  { d=$$3; if (dirs[d] != 1) { print \"d\", d; dirs[d] = 1 } \\\n\t    if ($$2 == $$4) { files[d] = files[d] \" \" $$1; \\\n\t      if (++n[d] == $(am__install_max)) { \\\n\t\tprint \"f\", d, files[d]; n[d] = 0; files[d] = \"\" } } \\\n\t    else { print \"f\", d \"/\" $$4, $$1 } } \\\n\t  END { for (d in files) print \"f\", d, files[d] }' | \\\n\twhile read type dir files; do \\\n\t     if test \"$$dir\" = .; then dir=; else dir=/$$dir; fi; \\\n\t     test -z \"$$files\" || { \\\n\t       echo \" $(INSTALL_SCRIPT) $$files '$(DESTDIR)$(bindir)$$dir'\"; \\\n\t       $(INSTALL_SCRIPT) $$files \"$(DESTDIR)$(bindir)$$dir\" || exit $$?; \\\n\t     } \\\n\t; done\n\nuninstall-binSCRIPTS:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(bin_SCRIPTS)'; test -n \"$(bindir)\" || exit 0; \\\n\tfiles=`for p in $$list; do echo \"$$p\"; done | \\\n\t       sed -e 's,.*/,,;$(transform)'`; \\\n\tdir='$(DESTDIR)$(bindir)'; $(am__uninstall_files_from_dir)\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_libev_la-acl.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_libev_la-cache.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_libev_la-encrypt.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_libev_la-http.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_libev_la-jconf.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_libev_la-json.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_libev_la-local.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_libev_la-netutils.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_libev_la-rule.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_libev_la-tls.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_libev_la-udprelay.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_libev_la-utils.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libshadowsocks_libev_la-win32.Plo@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-acl.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-cache.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-encrypt.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-http.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-jconf.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-json.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-local.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-netutils.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-rule.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-tls.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-udprelay.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-utils.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_local-win32.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-cache.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-encrypt.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-http.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-jconf.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-json.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-netutils.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-redir.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-rule.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-tls.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-udprelay.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_redir-utils.Po@am__quote@\n\n.c.o:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.o$$||'`;\\\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<\n\n.c.obj:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.obj$$||'`;\\\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\n.c.lo:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.lo$$||'`;\\\n@am__fastdepCC_TRUE@\t$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<\n\nlibshadowsocks_libev_la-utils.lo: utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -MT libshadowsocks_libev_la-utils.lo -MD -MP -MF $(DEPDIR)/libshadowsocks_libev_la-utils.Tpo -c -o libshadowsocks_libev_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libshadowsocks_libev_la-utils.Tpo $(DEPDIR)/libshadowsocks_libev_la-utils.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='utils.c' object='libshadowsocks_libev_la-utils.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -c -o libshadowsocks_libev_la-utils.lo `test -f 'utils.c' || echo '$(srcdir)/'`utils.c\n\nlibshadowsocks_libev_la-jconf.lo: jconf.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -MT libshadowsocks_libev_la-jconf.lo -MD -MP -MF $(DEPDIR)/libshadowsocks_libev_la-jconf.Tpo -c -o libshadowsocks_libev_la-jconf.lo `test -f 'jconf.c' || echo '$(srcdir)/'`jconf.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libshadowsocks_libev_la-jconf.Tpo $(DEPDIR)/libshadowsocks_libev_la-jconf.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='jconf.c' object='libshadowsocks_libev_la-jconf.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -c -o libshadowsocks_libev_la-jconf.lo `test -f 'jconf.c' || echo '$(srcdir)/'`jconf.c\n\nlibshadowsocks_libev_la-json.lo: json.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -MT libshadowsocks_libev_la-json.lo -MD -MP -MF $(DEPDIR)/libshadowsocks_libev_la-json.Tpo -c -o libshadowsocks_libev_la-json.lo `test -f 'json.c' || echo '$(srcdir)/'`json.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libshadowsocks_libev_la-json.Tpo $(DEPDIR)/libshadowsocks_libev_la-json.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='json.c' object='libshadowsocks_libev_la-json.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -c -o libshadowsocks_libev_la-json.lo `test -f 'json.c' || echo '$(srcdir)/'`json.c\n\nlibshadowsocks_libev_la-encrypt.lo: encrypt.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -MT libshadowsocks_libev_la-encrypt.lo -MD -MP -MF $(DEPDIR)/libshadowsocks_libev_la-encrypt.Tpo -c -o libshadowsocks_libev_la-encrypt.lo `test -f 'encrypt.c' || echo '$(srcdir)/'`encrypt.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libshadowsocks_libev_la-encrypt.Tpo $(DEPDIR)/libshadowsocks_libev_la-encrypt.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='encrypt.c' object='libshadowsocks_libev_la-encrypt.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -c -o libshadowsocks_libev_la-encrypt.lo `test -f 'encrypt.c' || echo '$(srcdir)/'`encrypt.c\n\nlibshadowsocks_libev_la-udprelay.lo: udprelay.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -MT libshadowsocks_libev_la-udprelay.lo -MD -MP -MF $(DEPDIR)/libshadowsocks_libev_la-udprelay.Tpo -c -o libshadowsocks_libev_la-udprelay.lo `test -f 'udprelay.c' || echo '$(srcdir)/'`udprelay.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libshadowsocks_libev_la-udprelay.Tpo $(DEPDIR)/libshadowsocks_libev_la-udprelay.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='udprelay.c' object='libshadowsocks_libev_la-udprelay.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -c -o libshadowsocks_libev_la-udprelay.lo `test -f 'udprelay.c' || echo '$(srcdir)/'`udprelay.c\n\nlibshadowsocks_libev_la-cache.lo: cache.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -MT libshadowsocks_libev_la-cache.lo -MD -MP -MF $(DEPDIR)/libshadowsocks_libev_la-cache.Tpo -c -o libshadowsocks_libev_la-cache.lo `test -f 'cache.c' || echo '$(srcdir)/'`cache.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libshadowsocks_libev_la-cache.Tpo $(DEPDIR)/libshadowsocks_libev_la-cache.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='cache.c' object='libshadowsocks_libev_la-cache.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -c -o libshadowsocks_libev_la-cache.lo `test -f 'cache.c' || echo '$(srcdir)/'`cache.c\n\nlibshadowsocks_libev_la-acl.lo: acl.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -MT libshadowsocks_libev_la-acl.lo -MD -MP -MF $(DEPDIR)/libshadowsocks_libev_la-acl.Tpo -c -o libshadowsocks_libev_la-acl.lo `test -f 'acl.c' || echo '$(srcdir)/'`acl.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libshadowsocks_libev_la-acl.Tpo $(DEPDIR)/libshadowsocks_libev_la-acl.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='acl.c' object='libshadowsocks_libev_la-acl.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -c -o libshadowsocks_libev_la-acl.lo `test -f 'acl.c' || echo '$(srcdir)/'`acl.c\n\nlibshadowsocks_libev_la-netutils.lo: netutils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -MT libshadowsocks_libev_la-netutils.lo -MD -MP -MF $(DEPDIR)/libshadowsocks_libev_la-netutils.Tpo -c -o libshadowsocks_libev_la-netutils.lo `test -f 'netutils.c' || echo '$(srcdir)/'`netutils.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libshadowsocks_libev_la-netutils.Tpo $(DEPDIR)/libshadowsocks_libev_la-netutils.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='netutils.c' object='libshadowsocks_libev_la-netutils.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -c -o libshadowsocks_libev_la-netutils.lo `test -f 'netutils.c' || echo '$(srcdir)/'`netutils.c\n\nlibshadowsocks_libev_la-local.lo: local.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -MT libshadowsocks_libev_la-local.lo -MD -MP -MF $(DEPDIR)/libshadowsocks_libev_la-local.Tpo -c -o libshadowsocks_libev_la-local.lo `test -f 'local.c' || echo '$(srcdir)/'`local.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libshadowsocks_libev_la-local.Tpo $(DEPDIR)/libshadowsocks_libev_la-local.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='local.c' object='libshadowsocks_libev_la-local.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -c -o libshadowsocks_libev_la-local.lo `test -f 'local.c' || echo '$(srcdir)/'`local.c\n\nlibshadowsocks_libev_la-http.lo: http.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -MT libshadowsocks_libev_la-http.lo -MD -MP -MF $(DEPDIR)/libshadowsocks_libev_la-http.Tpo -c -o libshadowsocks_libev_la-http.lo `test -f 'http.c' || echo '$(srcdir)/'`http.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libshadowsocks_libev_la-http.Tpo $(DEPDIR)/libshadowsocks_libev_la-http.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='http.c' object='libshadowsocks_libev_la-http.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -c -o libshadowsocks_libev_la-http.lo `test -f 'http.c' || echo '$(srcdir)/'`http.c\n\nlibshadowsocks_libev_la-tls.lo: tls.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -MT libshadowsocks_libev_la-tls.lo -MD -MP -MF $(DEPDIR)/libshadowsocks_libev_la-tls.Tpo -c -o libshadowsocks_libev_la-tls.lo `test -f 'tls.c' || echo '$(srcdir)/'`tls.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libshadowsocks_libev_la-tls.Tpo $(DEPDIR)/libshadowsocks_libev_la-tls.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='tls.c' object='libshadowsocks_libev_la-tls.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -c -o libshadowsocks_libev_la-tls.lo `test -f 'tls.c' || echo '$(srcdir)/'`tls.c\n\nlibshadowsocks_libev_la-rule.lo: rule.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -MT libshadowsocks_libev_la-rule.lo -MD -MP -MF $(DEPDIR)/libshadowsocks_libev_la-rule.Tpo -c -o libshadowsocks_libev_la-rule.lo `test -f 'rule.c' || echo '$(srcdir)/'`rule.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libshadowsocks_libev_la-rule.Tpo $(DEPDIR)/libshadowsocks_libev_la-rule.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='rule.c' object='libshadowsocks_libev_la-rule.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -c -o libshadowsocks_libev_la-rule.lo `test -f 'rule.c' || echo '$(srcdir)/'`rule.c\n\nlibshadowsocks_libev_la-win32.lo: win32.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -MT libshadowsocks_libev_la-win32.lo -MD -MP -MF $(DEPDIR)/libshadowsocks_libev_la-win32.Tpo -c -o libshadowsocks_libev_la-win32.lo `test -f 'win32.c' || echo '$(srcdir)/'`win32.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/libshadowsocks_libev_la-win32.Tpo $(DEPDIR)/libshadowsocks_libev_la-win32.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='win32.c' object='libshadowsocks_libev_la-win32.lo' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libshadowsocks_libev_la_CFLAGS) $(CFLAGS) -c -o libshadowsocks_libev_la-win32.lo `test -f 'win32.c' || echo '$(srcdir)/'`win32.c\n\nss_local-utils.o: utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-utils.o -MD -MP -MF $(DEPDIR)/ss_local-utils.Tpo -c -o ss_local-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-utils.Tpo $(DEPDIR)/ss_local-utils.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='utils.c' object='ss_local-utils.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c\n\nss_local-utils.obj: utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-utils.obj -MD -MP -MF $(DEPDIR)/ss_local-utils.Tpo -c -o ss_local-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-utils.Tpo $(DEPDIR)/ss_local-utils.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='utils.c' object='ss_local-utils.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`\n\nss_local-jconf.o: jconf.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-jconf.o -MD -MP -MF $(DEPDIR)/ss_local-jconf.Tpo -c -o ss_local-jconf.o `test -f 'jconf.c' || echo '$(srcdir)/'`jconf.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-jconf.Tpo $(DEPDIR)/ss_local-jconf.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='jconf.c' object='ss_local-jconf.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-jconf.o `test -f 'jconf.c' || echo '$(srcdir)/'`jconf.c\n\nss_local-jconf.obj: jconf.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-jconf.obj -MD -MP -MF $(DEPDIR)/ss_local-jconf.Tpo -c -o ss_local-jconf.obj `if test -f 'jconf.c'; then $(CYGPATH_W) 'jconf.c'; else $(CYGPATH_W) '$(srcdir)/jconf.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-jconf.Tpo $(DEPDIR)/ss_local-jconf.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='jconf.c' object='ss_local-jconf.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-jconf.obj `if test -f 'jconf.c'; then $(CYGPATH_W) 'jconf.c'; else $(CYGPATH_W) '$(srcdir)/jconf.c'; fi`\n\nss_local-json.o: json.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-json.o -MD -MP -MF $(DEPDIR)/ss_local-json.Tpo -c -o ss_local-json.o `test -f 'json.c' || echo '$(srcdir)/'`json.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-json.Tpo $(DEPDIR)/ss_local-json.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='json.c' object='ss_local-json.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-json.o `test -f 'json.c' || echo '$(srcdir)/'`json.c\n\nss_local-json.obj: json.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-json.obj -MD -MP -MF $(DEPDIR)/ss_local-json.Tpo -c -o ss_local-json.obj `if test -f 'json.c'; then $(CYGPATH_W) 'json.c'; else $(CYGPATH_W) '$(srcdir)/json.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-json.Tpo $(DEPDIR)/ss_local-json.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='json.c' object='ss_local-json.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-json.obj `if test -f 'json.c'; then $(CYGPATH_W) 'json.c'; else $(CYGPATH_W) '$(srcdir)/json.c'; fi`\n\nss_local-encrypt.o: encrypt.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-encrypt.o -MD -MP -MF $(DEPDIR)/ss_local-encrypt.Tpo -c -o ss_local-encrypt.o `test -f 'encrypt.c' || echo '$(srcdir)/'`encrypt.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-encrypt.Tpo $(DEPDIR)/ss_local-encrypt.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='encrypt.c' object='ss_local-encrypt.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-encrypt.o `test -f 'encrypt.c' || echo '$(srcdir)/'`encrypt.c\n\nss_local-encrypt.obj: encrypt.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-encrypt.obj -MD -MP -MF $(DEPDIR)/ss_local-encrypt.Tpo -c -o ss_local-encrypt.obj `if test -f 'encrypt.c'; then $(CYGPATH_W) 'encrypt.c'; else $(CYGPATH_W) '$(srcdir)/encrypt.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-encrypt.Tpo $(DEPDIR)/ss_local-encrypt.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='encrypt.c' object='ss_local-encrypt.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-encrypt.obj `if test -f 'encrypt.c'; then $(CYGPATH_W) 'encrypt.c'; else $(CYGPATH_W) '$(srcdir)/encrypt.c'; fi`\n\nss_local-udprelay.o: udprelay.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-udprelay.o -MD -MP -MF $(DEPDIR)/ss_local-udprelay.Tpo -c -o ss_local-udprelay.o `test -f 'udprelay.c' || echo '$(srcdir)/'`udprelay.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-udprelay.Tpo $(DEPDIR)/ss_local-udprelay.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='udprelay.c' object='ss_local-udprelay.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-udprelay.o `test -f 'udprelay.c' || echo '$(srcdir)/'`udprelay.c\n\nss_local-udprelay.obj: udprelay.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-udprelay.obj -MD -MP -MF $(DEPDIR)/ss_local-udprelay.Tpo -c -o ss_local-udprelay.obj `if test -f 'udprelay.c'; then $(CYGPATH_W) 'udprelay.c'; else $(CYGPATH_W) '$(srcdir)/udprelay.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-udprelay.Tpo $(DEPDIR)/ss_local-udprelay.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='udprelay.c' object='ss_local-udprelay.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-udprelay.obj `if test -f 'udprelay.c'; then $(CYGPATH_W) 'udprelay.c'; else $(CYGPATH_W) '$(srcdir)/udprelay.c'; fi`\n\nss_local-cache.o: cache.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-cache.o -MD -MP -MF $(DEPDIR)/ss_local-cache.Tpo -c -o ss_local-cache.o `test -f 'cache.c' || echo '$(srcdir)/'`cache.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-cache.Tpo $(DEPDIR)/ss_local-cache.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='cache.c' object='ss_local-cache.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-cache.o `test -f 'cache.c' || echo '$(srcdir)/'`cache.c\n\nss_local-cache.obj: cache.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-cache.obj -MD -MP -MF $(DEPDIR)/ss_local-cache.Tpo -c -o ss_local-cache.obj `if test -f 'cache.c'; then $(CYGPATH_W) 'cache.c'; else $(CYGPATH_W) '$(srcdir)/cache.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-cache.Tpo $(DEPDIR)/ss_local-cache.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='cache.c' object='ss_local-cache.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-cache.obj `if test -f 'cache.c'; then $(CYGPATH_W) 'cache.c'; else $(CYGPATH_W) '$(srcdir)/cache.c'; fi`\n\nss_local-acl.o: acl.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-acl.o -MD -MP -MF $(DEPDIR)/ss_local-acl.Tpo -c -o ss_local-acl.o `test -f 'acl.c' || echo '$(srcdir)/'`acl.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-acl.Tpo $(DEPDIR)/ss_local-acl.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='acl.c' object='ss_local-acl.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-acl.o `test -f 'acl.c' || echo '$(srcdir)/'`acl.c\n\nss_local-acl.obj: acl.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-acl.obj -MD -MP -MF $(DEPDIR)/ss_local-acl.Tpo -c -o ss_local-acl.obj `if test -f 'acl.c'; then $(CYGPATH_W) 'acl.c'; else $(CYGPATH_W) '$(srcdir)/acl.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-acl.Tpo $(DEPDIR)/ss_local-acl.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='acl.c' object='ss_local-acl.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-acl.obj `if test -f 'acl.c'; then $(CYGPATH_W) 'acl.c'; else $(CYGPATH_W) '$(srcdir)/acl.c'; fi`\n\nss_local-netutils.o: netutils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-netutils.o -MD -MP -MF $(DEPDIR)/ss_local-netutils.Tpo -c -o ss_local-netutils.o `test -f 'netutils.c' || echo '$(srcdir)/'`netutils.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-netutils.Tpo $(DEPDIR)/ss_local-netutils.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='netutils.c' object='ss_local-netutils.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-netutils.o `test -f 'netutils.c' || echo '$(srcdir)/'`netutils.c\n\nss_local-netutils.obj: netutils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-netutils.obj -MD -MP -MF $(DEPDIR)/ss_local-netutils.Tpo -c -o ss_local-netutils.obj `if test -f 'netutils.c'; then $(CYGPATH_W) 'netutils.c'; else $(CYGPATH_W) '$(srcdir)/netutils.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-netutils.Tpo $(DEPDIR)/ss_local-netutils.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='netutils.c' object='ss_local-netutils.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-netutils.obj `if test -f 'netutils.c'; then $(CYGPATH_W) 'netutils.c'; else $(CYGPATH_W) '$(srcdir)/netutils.c'; fi`\n\nss_local-local.o: local.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-local.o -MD -MP -MF $(DEPDIR)/ss_local-local.Tpo -c -o ss_local-local.o `test -f 'local.c' || echo '$(srcdir)/'`local.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-local.Tpo $(DEPDIR)/ss_local-local.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='local.c' object='ss_local-local.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-local.o `test -f 'local.c' || echo '$(srcdir)/'`local.c\n\nss_local-local.obj: local.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-local.obj -MD -MP -MF $(DEPDIR)/ss_local-local.Tpo -c -o ss_local-local.obj `if test -f 'local.c'; then $(CYGPATH_W) 'local.c'; else $(CYGPATH_W) '$(srcdir)/local.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-local.Tpo $(DEPDIR)/ss_local-local.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='local.c' object='ss_local-local.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-local.obj `if test -f 'local.c'; then $(CYGPATH_W) 'local.c'; else $(CYGPATH_W) '$(srcdir)/local.c'; fi`\n\nss_local-http.o: http.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-http.o -MD -MP -MF $(DEPDIR)/ss_local-http.Tpo -c -o ss_local-http.o `test -f 'http.c' || echo '$(srcdir)/'`http.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-http.Tpo $(DEPDIR)/ss_local-http.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='http.c' object='ss_local-http.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-http.o `test -f 'http.c' || echo '$(srcdir)/'`http.c\n\nss_local-http.obj: http.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-http.obj -MD -MP -MF $(DEPDIR)/ss_local-http.Tpo -c -o ss_local-http.obj `if test -f 'http.c'; then $(CYGPATH_W) 'http.c'; else $(CYGPATH_W) '$(srcdir)/http.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-http.Tpo $(DEPDIR)/ss_local-http.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='http.c' object='ss_local-http.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-http.obj `if test -f 'http.c'; then $(CYGPATH_W) 'http.c'; else $(CYGPATH_W) '$(srcdir)/http.c'; fi`\n\nss_local-tls.o: tls.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-tls.o -MD -MP -MF $(DEPDIR)/ss_local-tls.Tpo -c -o ss_local-tls.o `test -f 'tls.c' || echo '$(srcdir)/'`tls.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-tls.Tpo $(DEPDIR)/ss_local-tls.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='tls.c' object='ss_local-tls.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-tls.o `test -f 'tls.c' || echo '$(srcdir)/'`tls.c\n\nss_local-tls.obj: tls.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-tls.obj -MD -MP -MF $(DEPDIR)/ss_local-tls.Tpo -c -o ss_local-tls.obj `if test -f 'tls.c'; then $(CYGPATH_W) 'tls.c'; else $(CYGPATH_W) '$(srcdir)/tls.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-tls.Tpo $(DEPDIR)/ss_local-tls.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='tls.c' object='ss_local-tls.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-tls.obj `if test -f 'tls.c'; then $(CYGPATH_W) 'tls.c'; else $(CYGPATH_W) '$(srcdir)/tls.c'; fi`\n\nss_local-rule.o: rule.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-rule.o -MD -MP -MF $(DEPDIR)/ss_local-rule.Tpo -c -o ss_local-rule.o `test -f 'rule.c' || echo '$(srcdir)/'`rule.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-rule.Tpo $(DEPDIR)/ss_local-rule.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='rule.c' object='ss_local-rule.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-rule.o `test -f 'rule.c' || echo '$(srcdir)/'`rule.c\n\nss_local-rule.obj: rule.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-rule.obj -MD -MP -MF $(DEPDIR)/ss_local-rule.Tpo -c -o ss_local-rule.obj `if test -f 'rule.c'; then $(CYGPATH_W) 'rule.c'; else $(CYGPATH_W) '$(srcdir)/rule.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-rule.Tpo $(DEPDIR)/ss_local-rule.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='rule.c' object='ss_local-rule.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-rule.obj `if test -f 'rule.c'; then $(CYGPATH_W) 'rule.c'; else $(CYGPATH_W) '$(srcdir)/rule.c'; fi`\n\nss_local-win32.o: win32.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-win32.o -MD -MP -MF $(DEPDIR)/ss_local-win32.Tpo -c -o ss_local-win32.o `test -f 'win32.c' || echo '$(srcdir)/'`win32.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-win32.Tpo $(DEPDIR)/ss_local-win32.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='win32.c' object='ss_local-win32.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-win32.o `test -f 'win32.c' || echo '$(srcdir)/'`win32.c\n\nss_local-win32.obj: win32.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -MT ss_local-win32.obj -MD -MP -MF $(DEPDIR)/ss_local-win32.Tpo -c -o ss_local-win32.obj `if test -f 'win32.c'; then $(CYGPATH_W) 'win32.c'; else $(CYGPATH_W) '$(srcdir)/win32.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_local-win32.Tpo $(DEPDIR)/ss_local-win32.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='win32.c' object='ss_local-win32.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_local_CFLAGS) $(CFLAGS) -c -o ss_local-win32.obj `if test -f 'win32.c'; then $(CYGPATH_W) 'win32.c'; else $(CYGPATH_W) '$(srcdir)/win32.c'; fi`\n\nss_redir-utils.o: utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-utils.o -MD -MP -MF $(DEPDIR)/ss_redir-utils.Tpo -c -o ss_redir-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-utils.Tpo $(DEPDIR)/ss_redir-utils.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='utils.c' object='ss_redir-utils.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c\n\nss_redir-utils.obj: utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-utils.obj -MD -MP -MF $(DEPDIR)/ss_redir-utils.Tpo -c -o ss_redir-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-utils.Tpo $(DEPDIR)/ss_redir-utils.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='utils.c' object='ss_redir-utils.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`\n\nss_redir-jconf.o: jconf.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-jconf.o -MD -MP -MF $(DEPDIR)/ss_redir-jconf.Tpo -c -o ss_redir-jconf.o `test -f 'jconf.c' || echo '$(srcdir)/'`jconf.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-jconf.Tpo $(DEPDIR)/ss_redir-jconf.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='jconf.c' object='ss_redir-jconf.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-jconf.o `test -f 'jconf.c' || echo '$(srcdir)/'`jconf.c\n\nss_redir-jconf.obj: jconf.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-jconf.obj -MD -MP -MF $(DEPDIR)/ss_redir-jconf.Tpo -c -o ss_redir-jconf.obj `if test -f 'jconf.c'; then $(CYGPATH_W) 'jconf.c'; else $(CYGPATH_W) '$(srcdir)/jconf.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-jconf.Tpo $(DEPDIR)/ss_redir-jconf.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='jconf.c' object='ss_redir-jconf.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-jconf.obj `if test -f 'jconf.c'; then $(CYGPATH_W) 'jconf.c'; else $(CYGPATH_W) '$(srcdir)/jconf.c'; fi`\n\nss_redir-json.o: json.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-json.o -MD -MP -MF $(DEPDIR)/ss_redir-json.Tpo -c -o ss_redir-json.o `test -f 'json.c' || echo '$(srcdir)/'`json.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-json.Tpo $(DEPDIR)/ss_redir-json.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='json.c' object='ss_redir-json.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-json.o `test -f 'json.c' || echo '$(srcdir)/'`json.c\n\nss_redir-json.obj: json.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-json.obj -MD -MP -MF $(DEPDIR)/ss_redir-json.Tpo -c -o ss_redir-json.obj `if test -f 'json.c'; then $(CYGPATH_W) 'json.c'; else $(CYGPATH_W) '$(srcdir)/json.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-json.Tpo $(DEPDIR)/ss_redir-json.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='json.c' object='ss_redir-json.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-json.obj `if test -f 'json.c'; then $(CYGPATH_W) 'json.c'; else $(CYGPATH_W) '$(srcdir)/json.c'; fi`\n\nss_redir-encrypt.o: encrypt.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-encrypt.o -MD -MP -MF $(DEPDIR)/ss_redir-encrypt.Tpo -c -o ss_redir-encrypt.o `test -f 'encrypt.c' || echo '$(srcdir)/'`encrypt.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-encrypt.Tpo $(DEPDIR)/ss_redir-encrypt.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='encrypt.c' object='ss_redir-encrypt.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-encrypt.o `test -f 'encrypt.c' || echo '$(srcdir)/'`encrypt.c\n\nss_redir-encrypt.obj: encrypt.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-encrypt.obj -MD -MP -MF $(DEPDIR)/ss_redir-encrypt.Tpo -c -o ss_redir-encrypt.obj `if test -f 'encrypt.c'; then $(CYGPATH_W) 'encrypt.c'; else $(CYGPATH_W) '$(srcdir)/encrypt.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-encrypt.Tpo $(DEPDIR)/ss_redir-encrypt.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='encrypt.c' object='ss_redir-encrypt.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-encrypt.obj `if test -f 'encrypt.c'; then $(CYGPATH_W) 'encrypt.c'; else $(CYGPATH_W) '$(srcdir)/encrypt.c'; fi`\n\nss_redir-netutils.o: netutils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-netutils.o -MD -MP -MF $(DEPDIR)/ss_redir-netutils.Tpo -c -o ss_redir-netutils.o `test -f 'netutils.c' || echo '$(srcdir)/'`netutils.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-netutils.Tpo $(DEPDIR)/ss_redir-netutils.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='netutils.c' object='ss_redir-netutils.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-netutils.o `test -f 'netutils.c' || echo '$(srcdir)/'`netutils.c\n\nss_redir-netutils.obj: netutils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-netutils.obj -MD -MP -MF $(DEPDIR)/ss_redir-netutils.Tpo -c -o ss_redir-netutils.obj `if test -f 'netutils.c'; then $(CYGPATH_W) 'netutils.c'; else $(CYGPATH_W) '$(srcdir)/netutils.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-netutils.Tpo $(DEPDIR)/ss_redir-netutils.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='netutils.c' object='ss_redir-netutils.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-netutils.obj `if test -f 'netutils.c'; then $(CYGPATH_W) 'netutils.c'; else $(CYGPATH_W) '$(srcdir)/netutils.c'; fi`\n\nss_redir-cache.o: cache.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-cache.o -MD -MP -MF $(DEPDIR)/ss_redir-cache.Tpo -c -o ss_redir-cache.o `test -f 'cache.c' || echo '$(srcdir)/'`cache.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-cache.Tpo $(DEPDIR)/ss_redir-cache.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='cache.c' object='ss_redir-cache.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-cache.o `test -f 'cache.c' || echo '$(srcdir)/'`cache.c\n\nss_redir-cache.obj: cache.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-cache.obj -MD -MP -MF $(DEPDIR)/ss_redir-cache.Tpo -c -o ss_redir-cache.obj `if test -f 'cache.c'; then $(CYGPATH_W) 'cache.c'; else $(CYGPATH_W) '$(srcdir)/cache.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-cache.Tpo $(DEPDIR)/ss_redir-cache.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='cache.c' object='ss_redir-cache.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-cache.obj `if test -f 'cache.c'; then $(CYGPATH_W) 'cache.c'; else $(CYGPATH_W) '$(srcdir)/cache.c'; fi`\n\nss_redir-udprelay.o: udprelay.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-udprelay.o -MD -MP -MF $(DEPDIR)/ss_redir-udprelay.Tpo -c -o ss_redir-udprelay.o `test -f 'udprelay.c' || echo '$(srcdir)/'`udprelay.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-udprelay.Tpo $(DEPDIR)/ss_redir-udprelay.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='udprelay.c' object='ss_redir-udprelay.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-udprelay.o `test -f 'udprelay.c' || echo '$(srcdir)/'`udprelay.c\n\nss_redir-udprelay.obj: udprelay.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-udprelay.obj -MD -MP -MF $(DEPDIR)/ss_redir-udprelay.Tpo -c -o ss_redir-udprelay.obj `if test -f 'udprelay.c'; then $(CYGPATH_W) 'udprelay.c'; else $(CYGPATH_W) '$(srcdir)/udprelay.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-udprelay.Tpo $(DEPDIR)/ss_redir-udprelay.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='udprelay.c' object='ss_redir-udprelay.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-udprelay.obj `if test -f 'udprelay.c'; then $(CYGPATH_W) 'udprelay.c'; else $(CYGPATH_W) '$(srcdir)/udprelay.c'; fi`\n\nss_redir-redir.o: redir.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-redir.o -MD -MP -MF $(DEPDIR)/ss_redir-redir.Tpo -c -o ss_redir-redir.o `test -f 'redir.c' || echo '$(srcdir)/'`redir.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-redir.Tpo $(DEPDIR)/ss_redir-redir.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='redir.c' object='ss_redir-redir.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-redir.o `test -f 'redir.c' || echo '$(srcdir)/'`redir.c\n\nss_redir-redir.obj: redir.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-redir.obj -MD -MP -MF $(DEPDIR)/ss_redir-redir.Tpo -c -o ss_redir-redir.obj `if test -f 'redir.c'; then $(CYGPATH_W) 'redir.c'; else $(CYGPATH_W) '$(srcdir)/redir.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-redir.Tpo $(DEPDIR)/ss_redir-redir.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='redir.c' object='ss_redir-redir.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-redir.obj `if test -f 'redir.c'; then $(CYGPATH_W) 'redir.c'; else $(CYGPATH_W) '$(srcdir)/redir.c'; fi`\n\nss_redir-http.o: http.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-http.o -MD -MP -MF $(DEPDIR)/ss_redir-http.Tpo -c -o ss_redir-http.o `test -f 'http.c' || echo '$(srcdir)/'`http.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-http.Tpo $(DEPDIR)/ss_redir-http.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='http.c' object='ss_redir-http.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-http.o `test -f 'http.c' || echo '$(srcdir)/'`http.c\n\nss_redir-http.obj: http.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-http.obj -MD -MP -MF $(DEPDIR)/ss_redir-http.Tpo -c -o ss_redir-http.obj `if test -f 'http.c'; then $(CYGPATH_W) 'http.c'; else $(CYGPATH_W) '$(srcdir)/http.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-http.Tpo $(DEPDIR)/ss_redir-http.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='http.c' object='ss_redir-http.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-http.obj `if test -f 'http.c'; then $(CYGPATH_W) 'http.c'; else $(CYGPATH_W) '$(srcdir)/http.c'; fi`\n\nss_redir-tls.o: tls.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-tls.o -MD -MP -MF $(DEPDIR)/ss_redir-tls.Tpo -c -o ss_redir-tls.o `test -f 'tls.c' || echo '$(srcdir)/'`tls.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-tls.Tpo $(DEPDIR)/ss_redir-tls.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='tls.c' object='ss_redir-tls.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-tls.o `test -f 'tls.c' || echo '$(srcdir)/'`tls.c\n\nss_redir-tls.obj: tls.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-tls.obj -MD -MP -MF $(DEPDIR)/ss_redir-tls.Tpo -c -o ss_redir-tls.obj `if test -f 'tls.c'; then $(CYGPATH_W) 'tls.c'; else $(CYGPATH_W) '$(srcdir)/tls.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-tls.Tpo $(DEPDIR)/ss_redir-tls.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='tls.c' object='ss_redir-tls.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-tls.obj `if test -f 'tls.c'; then $(CYGPATH_W) 'tls.c'; else $(CYGPATH_W) '$(srcdir)/tls.c'; fi`\n\nss_redir-rule.o: rule.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-rule.o -MD -MP -MF $(DEPDIR)/ss_redir-rule.Tpo -c -o ss_redir-rule.o `test -f 'rule.c' || echo '$(srcdir)/'`rule.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-rule.Tpo $(DEPDIR)/ss_redir-rule.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='rule.c' object='ss_redir-rule.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-rule.o `test -f 'rule.c' || echo '$(srcdir)/'`rule.c\n\nss_redir-rule.obj: rule.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -MT ss_redir-rule.obj -MD -MP -MF $(DEPDIR)/ss_redir-rule.Tpo -c -o ss_redir-rule.obj `if test -f 'rule.c'; then $(CYGPATH_W) 'rule.c'; else $(CYGPATH_W) '$(srcdir)/rule.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_redir-rule.Tpo $(DEPDIR)/ss_redir-rule.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='rule.c' object='ss_redir-rule.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_redir_CFLAGS) $(CFLAGS) -c -o ss_redir-rule.obj `if test -f 'rule.c'; then $(CYGPATH_W) 'rule.c'; else $(CYGPATH_W) '$(srcdir)/rule.c'; fi`\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\ninstall-includeHEADERS: $(include_HEADERS)\n\t@$(NORMAL_INSTALL)\n\t@list='$(include_HEADERS)'; test -n \"$(includedir)\" || list=; \\\n\tif test -n \"$$list\"; then \\\n\t  echo \" $(MKDIR_P) '$(DESTDIR)$(includedir)'\"; \\\n\t  $(MKDIR_P) \"$(DESTDIR)$(includedir)\" || exit 1; \\\n\tfi; \\\n\tfor p in $$list; do \\\n\t  if test -f \"$$p\"; then d=; else d=\"$(srcdir)/\"; fi; \\\n\t  echo \"$$d$$p\"; \\\n\tdone | $(am__base_list) | \\\n\twhile read files; do \\\n\t  echo \" $(INSTALL_HEADER) $$files '$(DESTDIR)$(includedir)'\"; \\\n\t  $(INSTALL_HEADER) $$files \"$(DESTDIR)$(includedir)\" || exit $$?; \\\n\tdone\n\nuninstall-includeHEADERS:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(include_HEADERS)'; test -n \"$(includedir)\" || list=; \\\n\tfiles=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \\\n\tdir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir)\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-am\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-am\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscopelist: cscopelist-am\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(LTLIBRARIES) $(PROGRAMS) $(SCRIPTS) $(HEADERS)\ninstall-binPROGRAMS: install-libLTLIBRARIES\n\ninstalldirs:\n\tfor dir in \"$(DESTDIR)$(libdir)\" \"$(DESTDIR)$(bindir)\" \"$(DESTDIR)$(bindir)\" \"$(DESTDIR)$(includedir)\"; do \\\n\t  test -z \"$$dir\" || $(MKDIR_P) \"$$dir\"; \\\n\tdone\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-binPROGRAMS clean-generic clean-libLTLIBRARIES \\\n\tclean-libtool mostlyclean-am\n\ndistclean: distclean-am\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am: install-includeHEADERS\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am: install-binPROGRAMS install-binSCRIPTS \\\n\tinstall-libLTLIBRARIES\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic \\\n\tmostlyclean-libtool\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \\\n\tuninstall-includeHEADERS uninstall-libLTLIBRARIES\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \\\n\tclean-binPROGRAMS clean-generic clean-libLTLIBRARIES \\\n\tclean-libtool cscopelist-am ctags ctags-am distclean \\\n\tdistclean-compile distclean-generic distclean-libtool \\\n\tdistclean-tags distdir dvi dvi-am html html-am info info-am \\\n\tinstall install-am install-binPROGRAMS install-binSCRIPTS \\\n\tinstall-data install-data-am install-dvi install-dvi-am \\\n\tinstall-exec install-exec-am install-html install-html-am \\\n\tinstall-includeHEADERS install-info install-info-am \\\n\tinstall-libLTLIBRARIES install-man install-pdf install-pdf-am \\\n\tinstall-ps install-ps-am install-strip installcheck \\\n\tinstallcheck-am installdirs maintainer-clean \\\n\tmaintainer-clean-generic mostlyclean mostlyclean-compile \\\n\tmostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \\\n\ttags tags-am uninstall uninstall-am uninstall-binPROGRAMS \\\n\tuninstall-binSCRIPTS uninstall-includeHEADERS \\\n\tuninstall-libLTLIBRARIES\n\n.PRECIOUS: Makefile\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/acl.c",
    "content": "/*\r\n * acl.c - Manage the ACL (Access Control List)\r\n *\r\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\r\n *\r\n * This file is part of the shadowsocks-libev.\r\n *\r\n * shadowsocks-libev is free software; you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation; either version 3 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * shadowsocks-libev is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with shadowsocks-libev; see the file COPYING. If not, see\r\n * <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include <ipset/ipset.h>\r\n#include <ctype.h>\r\n\r\n#include \"rule.h\"\r\n#include \"utils.h\"\r\n#include \"cache.h\"\r\n#include \"acl.h\"\r\n\r\n/*\r\n * definition:\r\n * white list: you can connect directly\r\n * black list: you have to connect via proxy, or which has been blocked\r\n */\r\nstatic struct ip_set white_list_ipv4;\r\nstatic struct ip_set white_list_ipv6;\r\n\r\nstatic struct ip_set black_list_ipv4;\r\nstatic struct ip_set black_list_ipv6;\r\n\r\nstatic struct cork_dllist black_list_rules;\r\nstatic struct cork_dllist white_list_rules;\r\n\r\nstatic int acl_mode = BLACK_LIST;\r\n\r\nstatic struct cache *block_list;\r\n\r\nstatic struct ip_set outbound_block_list_ipv4;\r\nstatic struct ip_set outbound_block_list_ipv6;\r\nstatic struct cork_dllist outbound_block_list_rules;\r\n\r\n#ifdef __linux__\r\n\r\n#include <unistd.h>\r\n#include <stdio.h>\r\n\r\n#define NO_FIREWALL_MODE 0\r\n#define IPTABLES_MODE    1\r\n#define FIREWALLD_MODE   2\r\n\r\nstatic FILE *shell_stdin;\r\nstatic int mode = NO_FIREWALL_MODE;\r\n\r\nstatic char chain_name[64];\r\nstatic char *iptables_init_chain =\r\n    \"iptables -N %s; iptables -F %s; iptables -A OUTPUT -p tcp --tcp-flags RST RST -j %s\";\r\nstatic char *iptables_remove_chain =\r\n    \"iptables -D OUTPUT -p tcp --tcp-flags RST RST -j %s; iptables -F %s; iptables -X %s\";\r\nstatic char *iptables_add_rule    = \"iptables -A %s -d %s -j DROP\";\r\nstatic char *iptables_remove_rule = \"iptables -D %s -d %s -j DROP\";\r\n\r\nstatic char *ip6tables_init_chain =\r\n    \"ip6tables -N %s; ip6tables -F %s; ip6tables -A OUTPUT -p tcp --tcp-flags RST RST -j %s\";\r\nstatic char *ip6tables_remove_chain =\r\n    \"ip6tables -D OUTPUT -p tcp --tcp-flags RST RST -j %s; ip6tables -F %s; ip6tables -X %s\";\r\nstatic char *ip6tables_add_rule    = \"ip6tables -A %s -d %s -j DROP\";\r\nstatic char *ip6tables_remove_rule = \"ip6tables -D %s -d %s -j DROP\";\r\n\r\nstatic char *firewalld_init_chain =\r\n    \"firewall-cmd --direct --add-chain ipv4 filter %s; \\\r\n     firewall-cmd --direct --passthrough ipv4 -F %s; \\\r\n     firewall-cmd --direct --passthrough ipv4 -A OUTPUT -p tcp --tcp-flags RST RST -j %s\";\r\nstatic char *firewalld_remove_chain =\r\n    \"firewall-cmd --direct --passthrough ipv4 -D OUTPUT -p tcp --tcp-flags RST RST -j %s; \\\r\n     firewall-cmd --direct --passthrough ipv4 -F %s; \\\r\n     firewall-cmd --direct --remove-chain ipv4 filter %s\";\r\nstatic char *firewalld_add_rule    = \"firewall-cmd --direct --passthrough ipv4 -A %s -d %s -j DROP\";\r\nstatic char *firewalld_remove_rule = \"firewall-cmd --direct --passthrough ipv4 -D %s -d %s -j DROP\";\r\n\r\nstatic char *firewalld6_init_chain =\r\n    \"firewall-cmd --direct --add-chain ipv6 filter %s; \\\r\n     firewall-cmd --direct --passthrough ipv6 -F %s; \\\r\n     firewall-cmd --direct --passthrough ipv6 -A OUTPUT -p tcp --tcp-flags RST RST -j %s\";\r\nstatic char *firewalld6_remove_chain =\r\n    \"firewall-cmd --direct --passthrough ipv6 -D OUTPUT -p tcp --tcp-flags RST RST -j %s; \\\r\n     firewall-cmd --direct --passthrough ipv6 -F %s; \\\r\n     firewall-cmd --direct --remove-chain ipv6 filter %s\";\r\nstatic char *firewalld6_add_rule    = \"firewall-cmd --direct --passthrough ipv6 -A %s -d %s -j DROP\";\r\nstatic char *firewalld6_remove_rule = \"firewall-cmd --direct --passthrough ipv6 -D %s -d %s -j DROP\";\r\n\r\nstatic int\r\nrun_cmd(const char *cmd)\r\n{\r\n    int ret = 0;\r\n    char cmdstring[256];\r\n\r\n    sprintf(cmdstring, \"%s\\n\", cmd);\r\n    size_t len = strlen(cmdstring);\r\n\r\n    if (shell_stdin != NULL) {\r\n        ret = fwrite(cmdstring, 1, len, shell_stdin);\r\n        fflush(shell_stdin);\r\n    }\r\n\r\n    return ret == len;\r\n}\r\n\r\nstatic int\r\ninit_firewall()\r\n{\r\n    int ret = 0;\r\n    char cli[256];\r\n    FILE *fp;\r\n\r\n    if (getuid() != 0)\r\n        return -1;\r\n\r\n    sprintf(cli, \"firewall-cmd --version 2>&1\");\r\n    fp = popen(cli, \"r\");\r\n\r\n    if (fp == NULL)\r\n        return -1;\r\n\r\n    if (pclose(fp) == 0) {\r\n        mode = FIREWALLD_MODE;\r\n    } else {\r\n        /* Check whether we have permission to operate iptables.\r\n\t * Note that checking `iptables --version` is insufficient:\r\n         * eg, running within a child user namespace.\r\n\t */\r\n        sprintf(cli, \"iptables -L 2>&1\");\r\n        fp = popen(cli, \"r\");\r\n        if (fp == NULL)\r\n            return -1;\r\n        if (pclose(fp) == 0)\r\n            mode = IPTABLES_MODE;\r\n    }\r\n\r\n    sprintf(chain_name, \"SHADOWSOCKS_LIBEV_%d\", getpid());\r\n\r\n    if (mode == FIREWALLD_MODE) {\r\n        sprintf(cli, firewalld6_init_chain, chain_name, chain_name, chain_name);\r\n        ret |= system(cli);\r\n        sprintf(cli, firewalld_init_chain, chain_name, chain_name, chain_name);\r\n        ret |= system(cli);\r\n    } else if (mode == IPTABLES_MODE) {\r\n        sprintf(cli, ip6tables_init_chain, chain_name, chain_name, chain_name);\r\n        ret |= system(cli);\r\n        sprintf(cli, iptables_init_chain, chain_name, chain_name, chain_name);\r\n        ret |= system(cli);\r\n    }\r\n\r\n    shell_stdin = popen(\"/bin/sh\", \"w\");\r\n\r\n    return ret;\r\n}\r\n\r\nstatic int\r\nreset_firewall()\r\n{\r\n    int ret = 0;\r\n    char cli[256];\r\n\r\n    if (getuid() != 0)\r\n        return -1;\r\n\r\n    if (mode == IPTABLES_MODE) {\r\n        sprintf(cli, ip6tables_remove_chain, chain_name, chain_name, chain_name);\r\n        ret |= system(cli);\r\n        sprintf(cli, iptables_remove_chain, chain_name, chain_name, chain_name);\r\n        ret |= system(cli);\r\n    } else if (mode == FIREWALLD_MODE) {\r\n        sprintf(cli, firewalld6_remove_chain, chain_name, chain_name, chain_name);\r\n        ret |= system(cli);\r\n        sprintf(cli, firewalld_remove_chain, chain_name, chain_name, chain_name);\r\n        ret |= system(cli);\r\n    }\r\n\r\n    if (shell_stdin != NULL) {\r\n        run_cmd(\"exit 0\");\r\n        pclose(shell_stdin);\r\n    }\r\n\r\n    return ret;\r\n}\r\n\r\nstatic int\r\nset_firewall_rule(char *addr, int add)\r\n{\r\n    char cli[256];\r\n    struct cork_ip ip;\r\n\r\n    if (getuid() != 0)\r\n        return -1;\r\n\r\n    if (cork_ip_init(&ip, addr))\r\n        return -1;\r\n\r\n    if (add) {\r\n        if (mode == IPTABLES_MODE)\r\n            sprintf(cli, ip.version == 4 ? iptables_add_rule : ip6tables_add_rule,\r\n                    chain_name, addr);\r\n        else if (mode == FIREWALLD_MODE)\r\n            sprintf(cli, ip.version == 4 ? firewalld_add_rule : firewalld6_add_rule,\r\n                    chain_name, addr);\r\n        return run_cmd(cli);\r\n    } else {\r\n        if (mode == IPTABLES_MODE)\r\n            sprintf(cli, ip.version == 4 ? iptables_remove_rule : ip6tables_remove_rule,\r\n                    chain_name, addr);\r\n        else if (mode == FIREWALLD_MODE)\r\n            sprintf(cli, ip.version == 4 ? firewalld_remove_rule : firewalld6_remove_rule,\r\n                    chain_name, addr);\r\n        return run_cmd(cli);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nstatic void\r\nfree_firewall_rule(void *key, void *element)\r\n{\r\n    if (key == NULL)\r\n        return;\r\n    char *addr = (char *)key;\r\n    set_firewall_rule(addr, 0);\r\n    ss_free(element);\r\n}\r\n\r\n#endif\r\n\r\nvoid\r\ninit_block_list(int firewall)\r\n{\r\n    // Initialize cache\r\n#ifdef __linux__\r\n    if (firewall)\r\n        init_firewall();\r\n    else\r\n        mode = NO_FIREWALL_MODE;\r\n    cache_create(&block_list, 256, free_firewall_rule);\r\n#else\r\n    cache_create(&block_list, 256, NULL);\r\n#endif\r\n}\r\n\r\nvoid\r\nfree_block_list()\r\n{\r\n#ifdef __linux__\r\n    if (mode != NO_FIREWALL_MODE)\r\n        reset_firewall();\r\n#endif\r\n    cache_clear(block_list, 0); // Remove all items\r\n}\r\n\r\nint\r\nremove_from_block_list(char *addr)\r\n{\r\n    size_t addr_len = strlen(addr);\r\n    return cache_remove(block_list, addr, addr_len);\r\n}\r\n\r\nvoid\r\nclear_block_list()\r\n{\r\n    cache_clear(block_list, 3600); // Clear items older than 1 hour\r\n}\r\n\r\nint\r\ncheck_block_list(char *addr)\r\n{\r\n    size_t addr_len = strlen(addr);\r\n\r\n    if (cache_key_exist(block_list, addr, addr_len)) {\r\n        int *count = NULL;\r\n        cache_lookup(block_list, addr, addr_len, &count);\r\n\r\n        if (count != NULL && *count > MAX_TRIES)\r\n            return 1;\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nint\r\nupdate_block_list(char *addr, int err_level)\r\n{\r\n    size_t addr_len = strlen(addr);\r\n\r\n    if (cache_key_exist(block_list, addr, addr_len)) {\r\n        int *count = NULL;\r\n        cache_lookup(block_list, addr, addr_len, &count);\r\n        if (count != NULL) {\r\n            if (*count > MAX_TRIES)\r\n                return 1;\r\n            (*count) += err_level;\r\n        }\r\n    } else if (err_level > 0) {\r\n        int *count = (int *)ss_malloc(sizeof(int));\r\n        *count = 1;\r\n        cache_insert(block_list, addr, addr_len, count);\r\n#ifdef __linux__\r\n        if (mode != NO_FIREWALL_MODE)\r\n            set_firewall_rule(addr, 1);\r\n#endif\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nstatic void\r\nparse_addr_cidr(const char *str, char *host, int *cidr)\r\n{\r\n    int ret = -1, n = 0;\r\n    char *pch;\r\n\r\n    pch = strchr(str, '/');\r\n    while (pch != NULL) {\r\n        n++;\r\n        ret = pch - str;\r\n        pch = strchr(pch + 1, '/');\r\n    }\r\n    if (ret == -1) {\r\n        strcpy(host, str);\r\n        *cidr = -1;\r\n    } else {\r\n        memcpy(host, str, ret);\r\n        host[ret] = '\\0';\r\n        *cidr     = atoi(str + ret + 1);\r\n    }\r\n}\r\n\r\nchar *\r\ntrimwhitespace(char *str)\r\n{\r\n    char *end;\r\n\r\n    // Trim leading space\r\n    while (isspace(*str))\r\n        str++;\r\n\r\n    if (*str == 0)   // All spaces?\r\n        return str;\r\n\r\n    // Trim trailing space\r\n    end = str + strlen(str) - 1;\r\n    while (end > str && isspace(*end))\r\n        end--;\r\n\r\n    // Write new null terminator\r\n    *(end + 1) = 0;\r\n\r\n    return str;\r\n}\r\n\r\nint\r\ninit_acl(const char *path)\r\n{\r\n    // initialize ipset\r\n    ipset_init_library();\r\n\r\n    ipset_init(&white_list_ipv4);\r\n    ipset_init(&white_list_ipv6);\r\n    ipset_init(&black_list_ipv4);\r\n    ipset_init(&black_list_ipv6);\r\n    ipset_init(&outbound_block_list_ipv4);\r\n    ipset_init(&outbound_block_list_ipv6);\r\n\r\n    cork_dllist_init(&black_list_rules);\r\n    cork_dllist_init(&white_list_rules);\r\n    cork_dllist_init(&outbound_block_list_rules);\r\n\r\n    struct ip_set *list_ipv4  = &black_list_ipv4;\r\n    struct ip_set *list_ipv6  = &black_list_ipv6;\r\n    struct cork_dllist *rules = &black_list_rules;\r\n\r\n    FILE *f = fopen(path, \"r\");\r\n    if (f == NULL) {\r\n        LOGE(\"Invalid acl path.\");\r\n        return -1;\r\n    }\r\n\r\n    char buf[257];\r\n    while (!feof(f))\r\n        if (fgets(buf, 256, f)) {\r\n            // Trim the newline\r\n            int len = strlen(buf);\r\n            if (len > 0 && buf[len - 1] == '\\n') {\r\n                buf[len - 1] = '\\0';\r\n            }\r\n\r\n            char *comment = strchr(buf, '#');\r\n            if (comment) {\r\n                *comment = '\\0';\r\n            }\r\n\r\n            char *line = trimwhitespace(buf);\r\n            if (strlen(line) == 0) {\r\n                continue;\r\n            }\r\n\r\n            if (strcmp(line, \"[outbound_block_list]\") == 0) {\r\n                list_ipv4 = &outbound_block_list_ipv4;\r\n                list_ipv6 = &outbound_block_list_ipv6;\r\n                rules     = &outbound_block_list_rules;\r\n                continue;\r\n            } else if (strcmp(line, \"[white_list]\") == 0\r\n                       || strcmp(line, \"[proxy_list]\") == 0) {\r\n                list_ipv4 = &black_list_ipv4;\r\n                list_ipv6 = &black_list_ipv6;\r\n                rules     = &black_list_rules;\r\n                continue;\r\n            } else if (strcmp(line, \"[black_list]\") == 0\r\n                       || strcmp(line, \"[bypass_list]\") == 0) {\r\n                list_ipv4 = &white_list_ipv4;\r\n                list_ipv6 = &white_list_ipv6;\r\n                rules     = &white_list_rules;\r\n                continue;\r\n            } else if (strcmp(line, \"[reject_all]\") == 0\r\n                       || strcmp(line, \"[bypass_all]\") == 0) {\r\n                acl_mode = BLACK_LIST;\r\n                continue;\r\n            } else if (strcmp(line, \"[accept_all]\") == 0\r\n                       || strcmp(line, \"[proxy_all]\") == 0) {\r\n                acl_mode = WHITE_LIST;\r\n                continue;\r\n            } else if (strcmp(line, \"[remote_dns]\") == 0) {\r\n                continue;\r\n            }\r\n\r\n            char host[257];\r\n            int cidr;\r\n            parse_addr_cidr(line, host, &cidr);\r\n\r\n            struct cork_ip addr;\r\n            int err = cork_ip_init(&addr, host);\r\n            if (!err) {\r\n                if (addr.version == 4) {\r\n                    if (cidr >= 0) {\r\n                        ipset_ipv4_add_network(list_ipv4, &(addr.ip.v4), cidr);\r\n                    } else {\r\n                        ipset_ipv4_add(list_ipv4, &(addr.ip.v4));\r\n                    }\r\n                } else if (addr.version == 6) {\r\n                    if (cidr >= 0) {\r\n                        ipset_ipv6_add_network(list_ipv6, &(addr.ip.v6), cidr);\r\n                    } else {\r\n                        ipset_ipv6_add(list_ipv6, &(addr.ip.v6));\r\n                    }\r\n                }\r\n            } else {\r\n                rule_t *rule = new_rule();\r\n                accept_rule_arg(rule, line);\r\n                init_rule(rule);\r\n                add_rule(rules, rule);\r\n            }\r\n        }\r\n\r\n    fclose(f);\r\n\r\n    return 0;\r\n}\r\n\r\nvoid\r\nfree_rules(struct cork_dllist *rules)\r\n{\r\n    struct cork_dllist_item *iter;\r\n    while ((iter = cork_dllist_head(rules)) != NULL) {\r\n        rule_t *rule = cork_container_of(iter, rule_t, entries);\r\n        remove_rule(rule);\r\n    }\r\n}\r\n\r\nvoid\r\nfree_acl(void)\r\n{\r\n    ipset_done(&black_list_ipv4);\r\n    ipset_done(&black_list_ipv6);\r\n    ipset_done(&white_list_ipv4);\r\n    ipset_done(&white_list_ipv6);\r\n\r\n    free_rules(&black_list_rules);\r\n    free_rules(&white_list_rules);\r\n}\r\n\r\nint\r\nget_acl_mode(void)\r\n{\r\n    return acl_mode;\r\n}\r\n\r\n/*\r\n * Return 0,  if not match.\r\n * Return 1,  if match black list.\r\n * Return -1, if match white list.\r\n */\r\nint\r\nacl_match_host(const char *host)\r\n{\r\n    struct cork_ip addr;\r\n    int ret = 0;\r\n    int err = cork_ip_init(&addr, host);\r\n\r\n    if (err) {\r\n        int host_len = strlen(host);\r\n        if (lookup_rule(&black_list_rules, host, host_len) != NULL)\r\n            ret = 1;\r\n        else if (lookup_rule(&white_list_rules, host, host_len) != NULL)\r\n            ret = -1;\r\n        return ret;\r\n    }\r\n\r\n    if (addr.version == 4) {\r\n        if (ipset_contains_ipv4(&black_list_ipv4, &(addr.ip.v4)))\r\n            ret = 1;\r\n        else if (ipset_contains_ipv4(&white_list_ipv4, &(addr.ip.v4)))\r\n            ret = -1;\r\n    } else if (addr.version == 6) {\r\n        if (ipset_contains_ipv6(&black_list_ipv6, &(addr.ip.v6)))\r\n            ret = 1;\r\n        else if (ipset_contains_ipv6(&white_list_ipv6, &(addr.ip.v6)))\r\n            ret = -1;\r\n    }\r\n\r\n    return ret;\r\n}\r\n\r\nint\r\nacl_add_ip(const char *ip)\r\n{\r\n    struct cork_ip addr;\r\n    int err = cork_ip_init(&addr, ip);\r\n    if (err) {\r\n        return -1;\r\n    }\r\n\r\n    if (addr.version == 4) {\r\n        ipset_ipv4_add(&black_list_ipv4, &(addr.ip.v4));\r\n    } else if (addr.version == 6) {\r\n        ipset_ipv6_add(&black_list_ipv6, &(addr.ip.v6));\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nint\r\nacl_remove_ip(const char *ip)\r\n{\r\n    struct cork_ip addr;\r\n    int err = cork_ip_init(&addr, ip);\r\n    if (err) {\r\n        return -1;\r\n    }\r\n\r\n    if (addr.version == 4) {\r\n        ipset_ipv4_remove(&black_list_ipv4, &(addr.ip.v4));\r\n    } else if (addr.version == 6) {\r\n        ipset_ipv6_remove(&black_list_ipv6, &(addr.ip.v6));\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\n/*\r\n * Return 0,  if not match.\r\n * Return 1,  if match black list.\r\n */\r\nint\r\noutbound_block_match_host(const char *host)\r\n{\r\n    struct cork_ip addr;\r\n    int ret = 0;\r\n    int err = cork_ip_init(&addr, host);\r\n\r\n    if (err) {\r\n        int host_len = strlen(host);\r\n        if (lookup_rule(&outbound_block_list_rules, host, host_len) != NULL)\r\n            ret = 1;\r\n        return ret;\r\n    }\r\n\r\n    if (addr.version == 4) {\r\n        if (ipset_contains_ipv4(&outbound_block_list_ipv4, &(addr.ip.v4)))\r\n            ret = 1;\r\n    } else if (addr.version == 6) {\r\n        if (ipset_contains_ipv6(&outbound_block_list_ipv6, &(addr.ip.v6)))\r\n            ret = 1;\r\n    }\r\n\r\n    return ret;\r\n}\r\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/acl.h",
    "content": "/*\n * acl.h - Define the ACL interface\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _ACL_H\n#define _ACL_H\n\n#define BLACK_LIST 0\n#define WHITE_LIST 1\n\n#define MAX_TRIES  64\n#define MALICIOUS  8\n#define SUSPICIOUS 4\n#define BAD        2\n#define MALFORMED  1\n\nint init_acl(const char *path);\nvoid free_acl(void);\nvoid clear_block_list(void);\n\nint acl_match_host(const char *ip);\nint acl_add_ip(const char *ip);\nint acl_remove_ip(const char *ip);\n\nint get_acl_mode(void);\n\nvoid init_block_list(int firewall);\nvoid free_block_list();\nint check_block_list(char *addr);\nint update_block_list(char *addr, int err_level);\nint remove_from_block_list(char *addr);\n\nint outbound_block_match_host(const char *host);\n\n#endif // _ACL_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/android.c",
    "content": "/*\n * android.c - Setup IPC for shadowsocks-android\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <fcntl.h>\n#include <locale.h>\n#include <signal.h>\n#include <string.h>\n#include <strings.h>\n#include <unistd.h>\n\n#include <errno.h>\n#include <arpa/inet.h>\n#include <netdb.h>\n#include <netinet/in.h>\n#include <netinet/tcp.h>\n\n#include <sys/un.h>\n#include <ancillary.h>\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"netutils.h\"\n#include \"utils.h\"\n\nextern char *prefix;\n\nint\nprotect_socket(int fd)\n{\n    int sock;\n    struct sockaddr_un addr;\n\n    if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {\n        LOGE(\"[android] socket() failed: %s (socket fd = %d)\\n\", strerror(errno), sock);\n        return -1;\n    }\n\n    // Set timeout to 1s\n    struct timeval tv;\n    tv.tv_sec  = 1;\n    tv.tv_usec = 0;\n    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));\n    setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval));\n\n    char path[257];\n    sprintf(path, \"%s/protect_path\", prefix);\n\n    memset(&addr, 0, sizeof(addr));\n    addr.sun_family = AF_UNIX;\n    strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1);\n\n    if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) {\n        LOGE(\"[android] connect() failed: %s (socket fd = %d), path: %s\\n\",\n             strerror(errno), sock, path);\n        close(sock);\n        return -1;\n    }\n\n    if (ancil_send_fd(sock, fd)) {\n        ERROR(\"[android] ancil_send_fd\");\n        close(sock);\n        return -1;\n    }\n\n    char ret = 0;\n\n    if (recv(sock, &ret, 1, 0) == -1) {\n        ERROR(\"[android] recv\");\n        close(sock);\n        return -1;\n    }\n\n    close(sock);\n    return ret;\n}\n\nint\nsend_traffic_stat(uint64_t tx, uint64_t rx)\n{\n    int sock;\n    struct sockaddr_un addr;\n\n    if ((sock = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) {\n        LOGE(\"[android] socket() failed: %s (socket fd = %d)\\n\", strerror(errno), sock);\n        return -1;\n    }\n\n    // Set timeout to 1s\n    struct timeval tv;\n    tv.tv_sec  = 1;\n    tv.tv_usec = 0;\n    setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (char *)&tv, sizeof(struct timeval));\n    setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (char *)&tv, sizeof(struct timeval));\n\n    char path[257];\n    sprintf(path, \"%s/stat_path\", prefix);\n\n    memset(&addr, 0, sizeof(addr));\n    addr.sun_family = AF_UNIX;\n    strncpy(addr.sun_path, path, sizeof(addr.sun_path) - 1);\n\n    if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1) {\n        LOGE(\"[android] connect() failed: %s (socket fd = %d), path: %s\\n\",\n             strerror(errno), sock, path);\n        close(sock);\n        return -1;\n    }\n\n    uint64_t stat[2] = { tx, rx };\n\n    if (send(sock, stat, sizeof(stat), 0) == -1) {\n        ERROR(\"[android] send\");\n        close(sock);\n        return -1;\n    }\n\n    char ret = 0;\n\n    if (recv(sock, &ret, 1, 0) == -1) {\n        ERROR(\"[android] recv\");\n        close(sock);\n        return -1;\n    }\n\n    close(sock);\n    return ret;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/cache.c",
    "content": "/*\n * cache.c - Manage the connection cache for UDPRELAY\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n/*\n * Original Author:  Oliver Lorenz (ol), olli@olorenz.org, https://olorenz.org\n * License:  This is licensed under the same terms as uthash itself\n */\n\n#include <errno.h>\n#include <stdlib.h>\n\n#include \"cache.h\"\n#include \"utils.h\"\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#endif\n\n/** Creates a new cache object\n *\n *  @param dst\n *  Where the newly allocated cache object will be stored in\n *\n *  @param capacity\n *  The maximum number of elements this cache object can hold\n *\n *  @return EINVAL if dst is NULL, ENOMEM if malloc fails, 0 otherwise\n */\nint\ncache_create(struct cache **dst, const size_t capacity,\n             void (*free_cb)(void *key, void *element))\n{\n    struct cache *new = NULL;\n\n    if (!dst) {\n        return EINVAL;\n    }\n\n    if ((new = malloc(sizeof(*new))) == NULL) {\n        return ENOMEM;\n    }\n\n    new->max_entries = capacity;\n    new->entries     = NULL;\n    new->free_cb     = free_cb;\n    *dst             = new;\n    return 0;\n}\n\n/** Frees an allocated cache object\n *\n *  @param cache\n *  The cache object to free\n *\n *  @param keep_data\n *  Whether to free contained data or just delete references to it\n *\n *  @return EINVAL if cache is NULL, 0 otherwise\n */\nint\ncache_delete(struct cache *cache, int keep_data)\n{\n    struct cache_entry *entry, *tmp;\n\n    if (!cache) {\n        return EINVAL;\n    }\n\n    if (keep_data) {\n        HASH_CLEAR(hh, cache->entries);\n    } else {\n        HASH_ITER(hh, cache->entries, entry, tmp){\n            HASH_DEL(cache->entries, entry);\n            if (entry->data != NULL) {\n                if (cache->free_cb) {\n                    cache->free_cb(entry->key, entry->data);\n                } else {\n                    ss_free(entry->data);\n                }\n            }\n            ss_free(entry->key);\n            ss_free(entry);\n        }\n    }\n\n    ss_free(cache);\n    return 0;\n}\n\n/** Clear old cache object\n *\n *  @param cache\n *  The cache object to clear\n *\n *  @param age\n *  Clear only objects older than the age (sec)\n *\n *  @return EINVAL if cache is NULL, 0 otherwise\n */\nint\ncache_clear(struct cache *cache, ev_tstamp age)\n{\n    struct cache_entry *entry, *tmp;\n\n    if (!cache) {\n        return EINVAL;\n    }\n\n    ev_tstamp now = ev_time();\n\n    HASH_ITER(hh, cache->entries, entry, tmp){\n        if (now - entry->ts > age) {\n            HASH_DEL(cache->entries, entry);\n            if (entry->data != NULL) {\n                if (cache->free_cb) {\n                    cache->free_cb(entry->key, entry->data);\n                } else {\n                    ss_free(entry->data);\n                }\n            }\n            ss_free(entry->key);\n            ss_free(entry);\n        }\n    }\n\n    return 0;\n}\n\n/** Removes a cache entry\n *\n *  @param cache\n *  The cache object\n *\n *  @param key\n *  The key of the entry to remove\n *\n *  @param key_len\n *  The length of key\n *\n *  @return EINVAL if cache is NULL, 0 otherwise\n */\nint\ncache_remove(struct cache *cache, char *key, size_t key_len)\n{\n    struct cache_entry *tmp;\n\n    if (!cache || !key) {\n        return EINVAL;\n    }\n\n    HASH_FIND(hh, cache->entries, key, key_len, tmp);\n\n    if (tmp) {\n        HASH_DEL(cache->entries, tmp);\n        if (tmp->data != NULL) {\n            if (cache->free_cb) {\n                cache->free_cb(tmp->key, tmp->data);\n            } else {\n                ss_free(tmp->data);\n            }\n        }\n        ss_free(tmp->key);\n        ss_free(tmp);\n    }\n\n    return 0;\n}\n\n/** Checks if a given key is in the cache\n *\n *  @param cache\n *  The cache object\n *\n *  @param key\n *  The key to look-up\n *\n *  @param key_len\n *  The length of key\n *\n *  @param result\n *  Where to store the result if key is found.\n *\n *  A warning: Even though result is just a pointer,\n *  you have to call this function with a **ptr,\n *  otherwise this will blow up in your face.\n *\n *  @return EINVAL if cache is NULL, 0 otherwise\n */\nint\ncache_lookup(struct cache *cache, char *key, size_t key_len, void *result)\n{\n    struct cache_entry *tmp = NULL;\n    char **dirty_hack       = result;\n\n    if (!cache || !key || !result) {\n        return EINVAL;\n    }\n\n    HASH_FIND(hh, cache->entries, key, key_len, tmp);\n    if (tmp) {\n        HASH_DELETE(hh, cache->entries, tmp);\n        tmp->ts = ev_time();\n        HASH_ADD_KEYPTR(hh, cache->entries, tmp->key, key_len, tmp);\n        *dirty_hack = tmp->data;\n    } else {\n        *dirty_hack = result = NULL;\n    }\n\n    return 0;\n}\n\nint\ncache_key_exist(struct cache *cache, char *key, size_t key_len)\n{\n    struct cache_entry *tmp = NULL;\n\n    if (!cache || !key) {\n        return 0;\n    }\n\n    HASH_FIND(hh, cache->entries, key, key_len, tmp);\n    if (tmp) {\n        HASH_DELETE(hh, cache->entries, tmp);\n        tmp->ts = ev_time();\n        HASH_ADD_KEYPTR(hh, cache->entries, tmp->key, key_len, tmp);\n        return 1;\n    } else {\n        return 0;\n    }\n\n    return 0;\n}\n\n/** Inserts a given <key, value> pair into the cache\n *\n *  @param cache\n *  The cache object\n *\n *  @param key\n *  The key that identifies <value>\n *\n *  @param key_len\n *  The length of key\n *\n *  @param data\n *  Data associated with <key>\n *\n *  @return EINVAL if cache is NULL, ENOMEM if malloc fails, 0 otherwise\n */\nint\ncache_insert(struct cache *cache, char *key, size_t key_len, void *data)\n{\n    struct cache_entry *entry     = NULL;\n    struct cache_entry *tmp_entry = NULL;\n\n    if (!cache) {\n        return EINVAL;\n    }\n\n    if ((entry = malloc(sizeof(*entry))) == NULL) {\n        return ENOMEM;\n    }\n\n    entry->key = ss_malloc(key_len + 1);\n    memcpy(entry->key, key, key_len);\n    entry->key[key_len] = 0;\n\n    entry->data = data;\n    entry->ts   = ev_time();\n    HASH_ADD_KEYPTR(hh, cache->entries, entry->key, key_len, entry);\n\n    if (HASH_COUNT(cache->entries) >= cache->max_entries) {\n        HASH_ITER(hh, cache->entries, entry, tmp_entry){\n            HASH_DELETE(hh, cache->entries, entry);\n            if (entry->data != NULL) {\n                if (cache->free_cb) {\n                    cache->free_cb(entry->key, entry->data);\n                } else {\n                    ss_free(entry->data);\n                }\n            }\n            ss_free(entry->key);\n            ss_free(entry);\n            break;\n        }\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/cache.h",
    "content": "/*\n * cache.h - Define the cache manager interface\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n/*\n * Original Author:  Oliver Lorenz (ol), olli@olorenz.org, https://olorenz.org\n * License:  This is licensed under the same terms as uthash itself\n */\n\n#ifndef _CACHE_\n#define _CACHE_\n\n#include \"uthash.h\"\n#include \"ev.h\"\n\n/**\n * A cache entry\n */\nstruct cache_entry {\n    char *key;         /**<The key */\n    void *data;        /**<Payload */\n    ev_tstamp ts;    /**<Timestamp */\n    UT_hash_handle hh; /**<Hash Handle for uthash */\n};\n\n/**\n * A cache object\n */\nstruct cache {\n    size_t max_entries;              /**<Amount of entries this cache object can hold */\n    struct cache_entry *entries;     /**<Head pointer for uthash */\n    void (*free_cb) (void *key, void *element); /**<Callback function to free cache entries */\n};\n\nint cache_create(struct cache **dst, const size_t capacity,\n                        void (*free_cb)(void *key, void *element));\nint cache_delete(struct cache *cache, int keep_data);\nint cache_clear(struct cache *cache, ev_tstamp age);\nint cache_lookup(struct cache *cache, char *key, size_t key_len, void *result);\nint cache_insert(struct cache *cache, char *key, size_t key_len, void *data);\nint cache_remove(struct cache *cache, char *key, size_t key_len);\nint cache_key_exist(struct cache *cache, char *key, size_t key_len);\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/common.h",
    "content": "/*\n * common.h - Provide global definitions\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _COMMON_H\n#define _COMMON_H\n\n#define DEFAULT_CONF_PATH \"/etc/shadowsocks-libev/config.json\"\n\n#ifndef SOL_TCP\n#define SOL_TCP IPPROTO_TCP\n#endif\n\n#if defined(MODULE_TUNNEL) || defined(MODULE_REDIR)\n#define MODULE_LOCAL\n#endif\n\n#include <libcork/ds.h>\n\n#include \"encrypt.h\"\n#include \"obfs/obfs.h\"\n\nint init_udprelay(const char *server_host, const char *server_port,\n#ifdef MODULE_LOCAL\n                  const struct sockaddr *remote_addr, const int remote_addr_len,\n                  const ss_addr_t tunnel_addr,\n#endif\n                  int mtu, int timeout, const char *iface,\n                  cipher_env_t* cipher_env, const char *protocol, const char *protocol_param);\n\nvoid free_udprelay(void);\n\ntypedef struct server_def {\n    char *hostname;\n    char *host;\n    int port;\n    int udp_port;\n    struct sockaddr_storage *addr; // resolved address\n    struct sockaddr_storage *addr_udp; // resolved address\n    int addr_len;\n    int addr_udp_len;\n\n    char *psw; // raw password\n    cipher_env_t cipher;\n\n    struct cork_dllist connections;\n\n    // SSR\n    char *protocol_name; // for logging use only?\n    char *obfs_name; // for logging use only?\n\n    char *protocol_param;\n    char *obfs_param;\n\n    obfs_class *protocol_plugin;\n    obfs_class *obfs_plugin;\n\n    void *protocol_global;\n    void *obfs_global;\n\n    int enable;\n    char *id;\n    char *group;\n    int udp_over_tcp;\n} server_def_t;\n\n#ifdef ANDROID\nint protect_socket(int fd);\nint send_traffic_stat(uint64_t tx, uint64_t rx);\n#endif\n\n#define STAGE_ERROR     -1  /* Error detected                   */\n#define STAGE_INIT       0  /* Initial stage                    */\n#define STAGE_HANDSHAKE  1  /* Handshake with client            */\n#define STAGE_PARSE      2  /* Parse the header                 */\n#define STAGE_RESOLVE    4  /* Resolve the hostname             */\n#define STAGE_STREAM     5  /* Stream between client and server */\n\n#endif // _COMMON_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/encrypt.c",
    "content": "/*\n * encrypt.c - Manage the global encryptor\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#include <stdint.h>\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#if defined(USE_CRYPTO_OPENSSL)\n\n#include <openssl/md5.h>\n#include <openssl/rand.h>\n#include <openssl/hmac.h>\n#include <openssl/aes.h>\n\n#elif defined(USE_CRYPTO_POLARSSL)\n\n#include <polarssl/md5.h>\n#include <polarssl/sha1.h>\n#include <polarssl/aes.h>\n#include <polarssl/entropy.h>\n#include <polarssl/ctr_drbg.h>\n#include <polarssl/version.h>\n#define CIPHER_UNSUPPORTED \"unsupported\"\n\n#ifdef __MINGW32__\n#include \"winsock2.h\"\n#endif\n\n#include <time.h>\n#ifdef _WIN32\n#include <windows.h>\n#include <wincrypt.h>\n#else\n#include <stdio.h>\n#endif\n\n#elif defined(USE_CRYPTO_MBEDTLS)\n\n#include <mbedtls/md5.h>\n#include <mbedtls/entropy.h>\n#include <mbedtls/ctr_drbg.h>\n#include <mbedtls/version.h>\n#include <mbedtls/aes.h>\n#define CIPHER_UNSUPPORTED \"unsupported\"\n\n#include <time.h>\n#ifdef _WIN32\n#include <windows.h>\n#include <wincrypt.h>\n#else\n#include <stdio.h>\n#endif\n\n#endif\n\n#include <sodium.h>\n\n#ifndef __MINGW32__\n#include <arpa/inet.h>\n#endif\n\n#include \"cache.h\"\n#include \"encrypt.h\"\n#include \"utils.h\"\n\n#define OFFSET_ROL(p, o) ((uint64_t)(*(p + o)) << (8 * o))\n\n#ifdef DEBUG\nstatic void\ndump(char *tag, char *text, int len)\n{\n    int i;\n    printf(\"%s: \", tag);\n    for (i = 0; i < len; i++)\n        printf(\"0x%02x \", (uint8_t)text[i]);\n    printf(\"\\n\");\n}\n\n#endif\n\n//cipher_env_t cipher_env;\n\nstatic const char *supported_ciphers[CIPHER_NUM] = {\n    \"none\",\n    \"table\",\n    \"rc4\",\n    \"rc4-md5-6\",\n    \"rc4-md5\",\n    \"aes-128-cfb\",\n    \"aes-192-cfb\",\n    \"aes-256-cfb\",\n    \"aes-128-ctr\",\n    \"aes-192-ctr\",\n    \"aes-256-ctr\",\n    \"bf-cfb\",\n    \"camellia-128-cfb\",\n    \"camellia-192-cfb\",\n    \"camellia-256-cfb\",\n    \"cast5-cfb\",\n    \"des-cfb\",\n    \"idea-cfb\",\n    \"rc2-cfb\",\n    \"seed-cfb\",\n    \"salsa20\",\n    \"chacha20\",\n    \"chacha20-ietf\"\n};\n\n#ifdef USE_CRYPTO_POLARSSL\nstatic const char *supported_ciphers_polarssl[CIPHER_NUM] = {\n    \"none\",\n    \"table\",\n    \"ARC4-128\",\n    \"ARC4-128\",\n    \"ARC4-128\",\n    \"AES-128-CFB128\",\n    \"AES-192-CFB128\",\n    \"AES-256-CFB128\",\n    \"AES-128-CTR\",\n    \"AES-192-CTR\",\n    \"AES-256-CTR\",\n    \"BLOWFISH-CFB64\",\n    \"CAMELLIA-128-CFB128\",\n    \"CAMELLIA-192-CFB128\",\n    \"CAMELLIA-256-CFB128\",\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    \"salsa20\",\n    \"chacha20\",\n    \"chacha20-ietf\"\n};\n#endif\n\n#ifdef USE_CRYPTO_MBEDTLS\nstatic const char *supported_ciphers_mbedtls[CIPHER_NUM] = {\n    \"none\",\n    \"table\",\n    \"ARC4-128\",\n    \"ARC4-128\",\n    \"ARC4-128\",\n    \"AES-128-CFB128\",\n    \"AES-192-CFB128\",\n    \"AES-256-CFB128\",\n    \"AES-128-CTR\",\n    \"AES-192-CTR\",\n    \"AES-256-CTR\",\n    \"BLOWFISH-CFB64\",\n    \"CAMELLIA-128-CFB128\",\n    \"CAMELLIA-192-CFB128\",\n    \"CAMELLIA-256-CFB128\",\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    \"salsa20\",\n    \"chacha20\",\n    \"chacha20-ietf\"\n};\n#endif\n\n#ifdef USE_CRYPTO_APPLECC\nstatic const CCAlgorithm supported_ciphers_applecc[CIPHER_NUM] = {\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmRC4,\n    kCCAlgorithmRC4,\n    kCCAlgorithmRC4,\n    kCCAlgorithmAES,\n    kCCAlgorithmAES,\n    kCCAlgorithmAES,\n    kCCAlgorithmAES,\n    kCCAlgorithmAES,\n    kCCAlgorithmAES,\n    kCCAlgorithmBlowfish,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmCAST,\n    kCCAlgorithmDES,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmRC2,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid\n};\n\nstatic const CCMode supported_modes_applecc[CIPHER_NUM] = {\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCModeRC4,\n    kCCModeRC4,\n    kCCModeCFB,\n    kCCModeCFB,\n    kCCModeCFB,\n    kCCModeCTR,\n    kCCModeCTR,\n    kCCModeCTR,\n    kCCModeCFB,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCModeCFB,\n    kCCModeCFB,\n    kCCModeCFB,\n    kCCModeCFB,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid\n};\n#endif\n\nstatic const int supported_ciphers_iv_size[CIPHER_NUM] = {\n    0 ,  0,  0,  6, 16, 16, 16, 16, 16, 16, 16,  8, 16, 16, 16,  8,  8,  8,  8, 16,  8,  8, 12\n};\n\nstatic const int supported_ciphers_key_size[CIPHER_NUM] = {\n    16, 16, 16, 16, 16, 16, 24, 32, 16, 24, 32, 16, 16, 24, 32, 16,  8, 16, 16, 16, 32, 32, 32\n};\n\nint\nballoc(buffer_t *ptr, size_t capacity)\n{\n    sodium_memzero(ptr, sizeof(buffer_t));\n    ptr->array    = ss_malloc(capacity);\n    ptr->capacity = capacity;\n    return capacity;\n}\n\nint\nbrealloc(buffer_t *ptr, size_t len, size_t capacity)\n{\n    if (ptr == NULL)\n        return -1;\n    size_t real_capacity = max(len, capacity);\n    if (ptr->capacity < real_capacity) {\n        ptr->array    = ss_realloc(ptr->array, real_capacity);\n        ptr->capacity = real_capacity;\n    }\n    return real_capacity;\n}\n\nvoid\nbfree(buffer_t *ptr)\n{\n    if (ptr == NULL)\n        return;\n    ptr->idx      = 0;\n    ptr->len      = 0;\n    ptr->capacity = 0;\n    if (ptr->array != NULL) {\n        ss_free(ptr->array);\n    }\n}\n\nstatic int\ncrypto_stream_xor_ic(uint8_t *c, const uint8_t *m, uint64_t mlen,\n                     const uint8_t *n, uint64_t ic, const uint8_t *k,\n                     int method)\n{\n    switch (method) {\n    case SALSA20:\n        return crypto_stream_salsa20_xor_ic(c, m, mlen, n, ic, k);\n    case CHACHA20:\n        return crypto_stream_chacha20_xor_ic(c, m, mlen, n, ic, k);\n    case CHACHA20IETF:\n        return crypto_stream_chacha20_ietf_xor_ic(c, m, mlen, n, (uint32_t)ic, k);\n    }\n    // always return 0\n    return 0;\n}\n\nstatic int\nrandom_compare(const void *_x, const void *_y, uint32_t i,\n               uint64_t a)\n{\n    uint8_t x = *((uint8_t *)_x);\n    uint8_t y = *((uint8_t *)_y);\n    return a % (x + i) - a % (y + i);\n}\n\nstatic void\nmerge(uint8_t *left, int llength, uint8_t *right,\n      int rlength, uint32_t salt, uint64_t key)\n{\n    uint8_t *ltmp = (uint8_t *)malloc(llength * sizeof(uint8_t));\n    uint8_t *rtmp = (uint8_t *)malloc(rlength * sizeof(uint8_t));\n\n    uint8_t *ll = ltmp;\n    uint8_t *rr = rtmp;\n\n    uint8_t *result = left;\n\n    memcpy(ltmp, left, llength * sizeof(uint8_t));\n    memcpy(rtmp, right, rlength * sizeof(uint8_t));\n\n    while (llength > 0 && rlength > 0) {\n        if (random_compare(ll, rr, salt, key) <= 0) {\n            *result = *ll;\n            ++ll;\n            --llength;\n        } else {\n            *result = *rr;\n            ++rr;\n            --rlength;\n        }\n        ++result;\n    }\n\n    if (llength > 0) {\n        while (llength > 0) {\n            *result = *ll;\n            ++result;\n            ++ll;\n            --llength;\n        }\n    } else {\n        while (rlength > 0) {\n            *result = *rr;\n            ++result;\n            ++rr;\n            --rlength;\n        }\n    }\n\n    ss_free(ltmp);\n    ss_free(rtmp);\n}\n\nstatic void\nmerge_sort(uint8_t array[], int length,\n           uint32_t salt, uint64_t key)\n{\n    uint8_t middle;\n    uint8_t *left, *right;\n    int llength;\n\n    if (length <= 1) {\n        return;\n    }\n\n    middle = length / 2;\n\n    llength = length - middle;\n\n    left  = array;\n    right = array + llength;\n\n    merge_sort(left, llength, salt, key);\n    merge_sort(right, middle, salt, key);\n    merge(left, llength, right, middle, salt, key);\n}\n\nint\nenc_get_iv_len(cipher_env_t *env)\n{\n    return env->enc_iv_len;\n}\n\nuint8_t* enc_get_key(cipher_env_t *env)\n{\n    return env->enc_key;\n}\n\nint enc_get_key_len(cipher_env_t *env)\n{\n    return env->enc_key_len;\n}\n\nunsigned char *enc_md5(const unsigned char *d, size_t n, unsigned char *md)\n{\n#if defined(USE_CRYPTO_OPENSSL)\n    return MD5(d, n, md);\n#elif defined(USE_CRYPTO_POLARSSL)\n    static unsigned char m[16];\n    if (md == NULL) {\n        md = m;\n    }\n    md5(d, n, md);\n    return md;\n#elif defined(USE_CRYPTO_MBEDTLS)\n    static unsigned char m[16];\n    if (md == NULL) {\n        md = m;\n    }\n    mbedtls_md5(d, n, md);\n    return md;\n#endif\n}\n\nint\ncipher_iv_size(const cipher_t *cipher)\n{\n#if defined(USE_CRYPTO_OPENSSL)\n    if (cipher->info == NULL)\n        return cipher->iv_len;\n    else\n        return EVP_CIPHER_iv_length(cipher->info);\n#elif defined(USE_CRYPTO_POLARSSL) || defined(USE_CRYPTO_MBEDTLS)\n    if (cipher == NULL) {\n        return 0;\n    }\n    return cipher->info->iv_size;\n#endif\n}\n\nint\ncipher_key_size(const cipher_t *cipher)\n{\n#if defined(USE_CRYPTO_OPENSSL)\n    if (cipher->info == NULL)\n        return cipher->key_len;\n    else\n        return EVP_CIPHER_key_length(cipher->info);\n#elif defined(USE_CRYPTO_POLARSSL)\n    if (cipher == NULL) {\n        return 0;\n    }\n    /* Override PolarSSL 32 bit default key size with sane 128 bit default */\n    if (cipher->info->base != NULL && POLARSSL_CIPHER_ID_BLOWFISH ==\n        cipher->info->base->cipher) {\n        return 128 / 8;\n    }\n    return cipher->info->key_length / 8;\n#elif defined(USE_CRYPTO_MBEDTLS)\n    /*\n     * Semi-API changes (technically public, morally private)\n     * Renamed a few headers to include _internal in the name. Those headers are\n     * not supposed to be included by users.\n     * Changed md_info_t into an opaque structure (use md_get_xxx() accessors).\n     * Changed pk_info_t into an opaque structure.\n     * Changed cipher_base_t into an opaque structure.\n     */\n    if (cipher == NULL) {\n        return 0;\n    }\n    /* From Version 1.2.7 released 2013-04-13 Default Blowfish keysize is now 128-bits */\n    return cipher->info->key_bitlen / 8;\n#endif\n}\n\nvoid\nbytes_to_key_with_size(const char *pass, size_t len, uint8_t *md, size_t md_size)\n{\n    uint8_t result[128];\n    enc_md5((const unsigned char *)pass, len, result);\n    memcpy(md, result, 16);\n    int i = 16;\n    for (; i < md_size; i += 16) {\n        memcpy(result + 16, pass, len);\n        enc_md5(result, 16 + len, result);\n        memcpy(md + i, result, 16);\n    }\n}\n\nint\nbytes_to_key(const cipher_t *cipher, const digest_type_t *md,\n             const uint8_t *pass, uint8_t *key)\n{\n    size_t datal;\n    datal = strlen((const char *)pass);\n\n#if defined(USE_CRYPTO_OPENSSL)\n\n    MD5_CTX c;\n    unsigned char md_buf[MAX_MD_SIZE];\n    int nkey;\n    int addmd;\n    unsigned int i, j, mds;\n\n    mds  = 16;\n    nkey = 16;\n    if (cipher != NULL) {\n        nkey = cipher_key_size(cipher);\n    }\n    if (pass == NULL)\n        return nkey;\n    memset(&c, 0, sizeof(MD5_CTX));\n\n    for (j = 0, addmd = 0; j < nkey; addmd++) {\n        MD5_Init(&c);\n        if (addmd) {\n            MD5_Update(&c, md_buf, mds);\n        }\n        MD5_Update(&c, pass, datal);\n        MD5_Final(md_buf, &c);\n\n        for (i = 0; i < mds; i++, j++) {\n            if (j >= nkey)\n                break;\n            key[j] = md_buf[i];\n        }\n    }\n\n    return nkey;\n\n#elif defined(USE_CRYPTO_POLARSSL)\n    md_context_t c;\n    unsigned char md_buf[MAX_MD_SIZE];\n    int nkey;\n    int addmd;\n    unsigned int i, j, mds;\n\n    nkey = 16;\n    if (cipher != NULL) {\n        nkey = cipher_key_size(cipher);\n    }\n    mds  = md_get_size(md);\n    memset(&c, 0, sizeof(md_context_t));\n\n    if (pass == NULL)\n        return nkey;\n    if (md_init_ctx(&c, md))\n        return 0;\n\n    for (j = 0, addmd = 0; j < nkey; addmd++) {\n        md_starts(&c);\n        if (addmd) {\n            md_update(&c, md_buf, mds);\n        }\n        md_update(&c, pass, datal);\n        md_finish(&c, md_buf);\n\n        for (i = 0; i < mds; i++, j++) {\n            if (j >= nkey)\n                break;\n            key[j] = md_buf[i];\n        }\n    }\n\n    md_free_ctx(&c);\n    return nkey;\n\n#elif defined(USE_CRYPTO_MBEDTLS)\n\n    mbedtls_md_context_t c;\n    unsigned char md_buf[MAX_MD_SIZE];\n    int nkey;\n    int addmd;\n    unsigned int i, j, mds;\n\n    nkey = 16;\n    if (cipher != NULL) {\n        nkey = cipher_key_size(cipher);\n    }\n    mds  = mbedtls_md_get_size(md);\n    memset(&c, 0, sizeof(mbedtls_md_context_t));\n\n    if (pass == NULL)\n        return nkey;\n    if (mbedtls_md_setup(&c, md, 1))\n        return 0;\n\n    for (j = 0, addmd = 0; j < nkey; addmd++) {\n        mbedtls_md_starts(&c);\n        if (addmd) {\n            mbedtls_md_update(&c, md_buf, mds);\n        }\n        mbedtls_md_update(&c, pass, datal);\n        mbedtls_md_finish(&c, &(md_buf[0]));\n\n        for (i = 0; i < mds; i++, j++) {\n            if (j >= nkey)\n                break;\n            key[j] = md_buf[i];\n        }\n    }\n\n    mbedtls_md_free(&c);\n    return nkey;\n#endif\n}\n\nint\nrand_bytes(uint8_t *output, int len)\n{\n    randombytes_buf(output, len);\n    // always return success\n    return 0;\n}\n\nconst cipher_kt_t *\nget_cipher_type(int method)\n{\n    if (method < NONE || method >= CIPHER_NUM) {\n        LOGE(\"get_cipher_type(): Illegal method\");\n        return NULL;\n    }\n\n    if (method == RC4_MD5 || method == RC4_MD5_6) {\n        method = RC4;\n    }\n\n    if (method >= SALSA20) {\n        return NULL;\n    }\n\n    const char *ciphername = supported_ciphers[method];\n#if defined(USE_CRYPTO_OPENSSL)\n    return EVP_get_cipherbyname(ciphername);\n#elif defined(USE_CRYPTO_POLARSSL)\n    const char *polarname = supported_ciphers_polarssl[method];\n    if (strcmp(polarname, CIPHER_UNSUPPORTED) == 0) {\n        LOGE(\"Cipher %s currently is not supported by PolarSSL library\",\n             ciphername);\n        return NULL;\n    }\n    return cipher_info_from_string(polarname);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    const char *mbedtlsname = supported_ciphers_mbedtls[method];\n    if (strcmp(mbedtlsname, CIPHER_UNSUPPORTED) == 0) {\n        LOGE(\"Cipher %s currently is not supported by mbed TLS library\",\n             ciphername);\n        return NULL;\n    }\n    return mbedtls_cipher_info_from_string(mbedtlsname);\n#endif\n}\n\nconst digest_type_t *\nget_digest_type(const char *digest)\n{\n    if (digest == NULL) {\n        LOGE(\"get_digest_type(): Digest name is null\");\n        return NULL;\n    }\n\n#if defined(USE_CRYPTO_OPENSSL)\n    return EVP_get_digestbyname(digest);\n#elif defined(USE_CRYPTO_POLARSSL)\n    return md_info_from_string(digest);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    return mbedtls_md_info_from_string(digest);\n#endif\n}\n\nvoid\ncipher_context_init(cipher_env_t *env, cipher_ctx_t *ctx, int enc)\n{\n    int method = env->enc_method;\n\n    if (method < NONE || method >= CIPHER_NUM) {\n        LOGE(\"cipher_context_init(): Illegal method\");\n        return;\n    }\n\n    if (method >= SALSA20) {\n//        enc_iv_len = supported_ciphers_iv_size[method];\n        return;\n    }\n\n    const char *ciphername = supported_ciphers[method];\n#if defined(USE_CRYPTO_APPLECC)\n    cipher_cc_t *cc = &ctx->cc;\n    cc->cryptor = NULL;\n    cc->cipher  = supported_ciphers_applecc[method];\n    if (cc->cipher == kCCAlgorithmInvalid) {\n        cc->valid = kCCContextInvalid;\n    } else {\n        cc->valid = kCCContextValid;\n        if (cc->cipher == kCCAlgorithmRC4) {\n            cc->mode    = supported_modes_applecc[method];\n            cc->padding = ccNoPadding;\n        } else {\n            cc->mode = supported_modes_applecc[method];\n            if (cc->mode == kCCModeCTR) {\n                cc->padding = ccNoPadding;\n            } else {\n                cc->padding = ccPKCS7Padding;\n            }\n        }\n        return;\n    }\n#endif\n\n    const cipher_kt_t *cipher = get_cipher_type(method);\n\n#if defined(USE_CRYPTO_OPENSSL)\n    ctx->evp = EVP_CIPHER_CTX_new();\n    cipher_evp_t *evp = ctx->evp;\n\n    if (cipher == NULL) {\n        LOGE(\"Cipher %s not found in OpenSSL library\", ciphername);\n        FATAL(\"Cannot initialize cipher\");\n    }\n    if (!EVP_CipherInit_ex(evp, cipher, NULL, NULL, NULL, enc)) {\n        LOGE(\"Cannot initialize cipher %s\", ciphername);\n        exit(EXIT_FAILURE);\n    }\n    if (!EVP_CIPHER_CTX_set_key_length(evp, env->enc_key_len)) {\n        EVP_CIPHER_CTX_cleanup(evp);\n        LOGE(\"Invalid key length: %d\", env->enc_key_len);\n        exit(EXIT_FAILURE);\n    }\n    if (method > RC4_MD5) {\n        EVP_CIPHER_CTX_set_padding(evp, 1);\n    }\n#elif defined(USE_CRYPTO_POLARSSL)\n    ctx->evp = (cipher_evp_t *)ss_malloc(sizeof(cipher_evp_t));\n    cipher_evp_t *evp = ctx->evp;\n\n    if (cipher == NULL) {\n        LOGE(\"Cipher %s not found in PolarSSL library\", ciphername);\n        FATAL(\"Cannot initialize PolarSSL cipher\");\n    }\n    if (cipher_init_ctx(evp, cipher) != 0) {\n        FATAL(\"Cannot initialize PolarSSL cipher context\");\n    }\n#elif defined(USE_CRYPTO_MBEDTLS)\n    ctx->evp = ss_malloc(sizeof(cipher_evp_t));\n    memset(ctx->evp, 0, sizeof(cipher_evp_t));\n    cipher_evp_t *evp = ctx->evp;\n\n    if (cipher == NULL) {\n        LOGE(\"Cipher %s not found in mbed TLS library\", ciphername);\n        FATAL(\"Cannot initialize mbed TLS cipher\");\n    }\n    mbedtls_cipher_init(evp);\n    if (mbedtls_cipher_setup(evp, cipher) != 0) {\n        FATAL(\"Cannot initialize mbed TLS cipher context\");\n    }\n#endif\n}\n\nvoid\ncipher_context_set_iv(cipher_env_t *env, cipher_ctx_t *ctx, uint8_t *iv, size_t iv_len,\n                      int enc)\n{\n    const unsigned char *true_key;\n\n    if (iv == NULL) {\n        LOGE(\"cipher_context_set_iv(): IV is null\");\n        return;\n    }\n\n    if (!enc) {\n        memcpy(ctx->iv, iv, iv_len);\n    }\n\n    if (env->enc_method >= SALSA20) {\n        return;\n    }\n\n    if (env->enc_method == RC4_MD5 || env->enc_method == RC4_MD5_6) {\n        unsigned char key_iv[32];\n        memcpy(key_iv, env->enc_key, 16);\n        memcpy(key_iv + 16, iv, iv_len);\n        true_key = enc_md5(key_iv, 16 + iv_len, NULL);\n        iv_len   = 0;\n    } else {\n        true_key = env->enc_key;\n    }\n\n#ifdef USE_CRYPTO_APPLECC\n    cipher_cc_t *cc = &ctx->cc;\n    if (cc->valid == kCCContextValid) {\n        memcpy(cc->iv, iv, iv_len);\n        memcpy(cc->key, true_key, env->enc_key_len);\n        cc->iv_len  = iv_len;\n        cc->key_len = env->enc_key_len;\n        cc->encrypt = enc ? kCCEncrypt : kCCDecrypt;\n        if (cc->cryptor != NULL) {\n            CCCryptorRelease(cc->cryptor);\n            cc->cryptor = NULL;\n        }\n\n        CCCryptorStatus ret;\n        ret = CCCryptorCreateWithMode(\n            cc->encrypt,\n            cc->mode,\n            cc->cipher,\n            cc->padding,\n            cc->iv, cc->key, cc->key_len,\n            NULL, 0, 0, kCCModeOptionCTR_BE,\n            &cc->cryptor);\n        if (ret != kCCSuccess) {\n            if (cc->cryptor != NULL) {\n                CCCryptorRelease(cc->cryptor);\n                cc->cryptor = NULL;\n            }\n            FATAL(\"Cannot set CommonCrypto key and IV\");\n        }\n        return;\n    }\n#endif\n\n    cipher_evp_t *evp = ctx->evp;\n    if (evp == NULL) {\n        LOGE(\"cipher_context_set_iv(): Cipher context is null\");\n        return;\n    }\n#if defined(USE_CRYPTO_OPENSSL)\n    if (!EVP_CipherInit_ex(evp, NULL, NULL, true_key, iv, enc)) {\n        EVP_CIPHER_CTX_cleanup(evp);\n        FATAL(\"Cannot set key and IV\");\n    }\n#elif defined(USE_CRYPTO_POLARSSL)\n    // XXX: PolarSSL 1.3.11: cipher_free_ctx deprecated, Use cipher_free() instead.\n    if (cipher_setkey(evp, true_key, env->enc_key_len * 8, enc) != 0) {\n        cipher_free_ctx(evp);\n        FATAL(\"Cannot set PolarSSL cipher key\");\n    }\n#if POLARSSL_VERSION_NUMBER >= 0x01030000\n    if (cipher_set_iv(evp, iv, iv_len) != 0) {\n        cipher_free_ctx(evp);\n        FATAL(\"Cannot set PolarSSL cipher IV\");\n    }\n    if (cipher_reset(evp) != 0) {\n        cipher_free_ctx(evp);\n        FATAL(\"Cannot finalize PolarSSL cipher context\");\n    }\n#else\n    if (cipher_reset(evp, iv) != 0) {\n        cipher_free_ctx(evp);\n        FATAL(\"Cannot set PolarSSL cipher IV\");\n    }\n#endif\n#elif defined(USE_CRYPTO_MBEDTLS)\n    if (mbedtls_cipher_setkey(evp, true_key, env->enc_key_len * 8, enc) != 0) {\n        mbedtls_cipher_free(evp);\n        FATAL(\"Cannot set mbed TLS cipher key\");\n    }\n\n    if (mbedtls_cipher_set_iv(evp, iv, iv_len) != 0) {\n        mbedtls_cipher_free(evp);\n        FATAL(\"Cannot set mbed TLS cipher IV\");\n    }\n    if (mbedtls_cipher_reset(evp) != 0) {\n        mbedtls_cipher_free(evp);\n        FATAL(\"Cannot finalize mbed TLS cipher context\");\n    }\n#endif\n\n#ifdef DEBUG\n    dump(\"IV\", (char *)iv, iv_len);\n#endif\n}\n\nvoid\ncipher_context_release(cipher_env_t *env, cipher_ctx_t *ctx)\n{\n    if (env->enc_method >= SALSA20) {\n        return;\n    }\n\n#ifdef USE_CRYPTO_APPLECC\n    cipher_cc_t *cc = &ctx->cc;\n    if (cc->cryptor != NULL) {\n        CCCryptorRelease(cc->cryptor);\n        cc->cryptor = NULL;\n    }\n    if (cc->valid == kCCContextValid) {\n        return;\n    }\n#endif\n\n#if defined(USE_CRYPTO_OPENSSL)\n    EVP_CIPHER_CTX_free(ctx->evp);\n#elif defined(USE_CRYPTO_POLARSSL)\n// NOTE: cipher_free_ctx deprecated in PolarSSL 1.3.11\n    cipher_free_ctx(ctx->evp);\n    ss_free(ctx->evp);\n#elif defined(USE_CRYPTO_MBEDTLS)\n// NOTE: cipher_free_ctx deprecated\n    mbedtls_cipher_free(ctx->evp);\n    ss_free(ctx->evp);\n#endif\n}\n\nstatic int\ncipher_context_update(cipher_ctx_t *ctx, uint8_t *output, size_t *olen,\n                      const uint8_t *input, size_t ilen)\n{\n#ifdef USE_CRYPTO_APPLECC\n    cipher_cc_t *cc = &ctx->cc;\n    if (cc->valid == kCCContextValid) {\n        CCCryptorStatus ret;\n        ret = CCCryptorUpdate(cc->cryptor, input, ilen, output,\n                              ilen, olen);\n        return (ret == kCCSuccess) ? 1 : 0;\n    }\n#endif\n    cipher_evp_t *evp = ctx->evp;\n#if defined(USE_CRYPTO_OPENSSL)\n    int err = 0, tlen = *olen;\n    err = EVP_CipherUpdate(evp, (uint8_t *)output, &tlen,\n                           (const uint8_t *)input, ilen);\n    *olen = tlen;\n    return err;\n#elif defined(USE_CRYPTO_POLARSSL)\n    return !cipher_update(evp, (const uint8_t *)input, ilen,\n                          (uint8_t *)output, olen);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    return !mbedtls_cipher_update(evp, (const uint8_t *)input, ilen,\n                                  (uint8_t *)output, olen);\n#endif\n}\n\nint ss_md5_hmac_with_key(char *auth, char *msg, int msg_len, uint8_t *auth_key, int key_len)\n{\n    uint8_t hash[MD5_BYTES];\n\n#if defined(USE_CRYPTO_OPENSSL)\n    HMAC(EVP_md5(), auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_MD5), auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#else\n    md5_hmac(auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#endif\n\n    memcpy(auth, hash, MD5_BYTES);\n\n    return 0;\n}\n\nint ss_md5_hash_func(char *auth, char *msg, int msg_len)\n{\n    uint8_t hash[MD5_BYTES];\n\n#if defined(USE_CRYPTO_OPENSSL)\n    MD5((uint8_t *)msg, msg_len, (uint8_t *)hash);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md(mbedtls_md_info_from_type(MBEDTLS_MD_MD5), (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#else\n    md5((uint8_t *)msg, msg_len, (uint8_t *)hash);\n#endif\n\n    memcpy(auth, hash, MD5_BYTES);\n\n    return 0;\n}\n\nint ss_sha1_hmac_with_key(char *auth, char *msg, int msg_len, uint8_t *auth_key, int key_len)\n{\n    uint8_t hash[SHA1_BYTES];\n\n#if defined(USE_CRYPTO_OPENSSL)\n    HMAC(EVP_sha1(), auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#else\n    sha1_hmac(auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#endif\n\n    memcpy(auth, hash, SHA1_BYTES);\n\n    return 0;\n}\n\nint ss_sha1_hash_func(char *auth, char *msg, int msg_len)\n{\n    uint8_t hash[SHA1_BYTES];\n#if defined(USE_CRYPTO_OPENSSL)\n    SHA1((uint8_t *)msg, msg_len, (uint8_t *)hash);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md(mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#else\n    sha1((uint8_t *)msg, msg_len, (uint8_t *)hash);\n#endif\n\n    memcpy(auth, hash, SHA1_BYTES);\n\n    return 0;\n}\n\nint ss_aes_128_cbc(char *encrypt, char *out_data, char *key)\n{\n    unsigned char iv[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };\n\n#if defined(USE_CRYPTO_OPENSSL)\n    AES_KEY aes;\n    AES_set_encrypt_key((unsigned char*)key, 128, &aes);\n    AES_cbc_encrypt((const unsigned char *)encrypt, (unsigned char *)out_data, 16, &aes, iv, AES_ENCRYPT);\n\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_aes_context aes;\n\n    unsigned char output[16];\n\n    mbedtls_aes_setkey_enc( &aes, (unsigned char *)key, 128 );\n    mbedtls_aes_crypt_cbc( &aes, MBEDTLS_AES_ENCRYPT, 16, iv, (unsigned char *)encrypt, output );\n\n    memcpy(out_data, output, 16);\n#else\n\n    aes_context aes;\n\n    unsigned char output[16];\n\n    aes_setkey_enc( &aes, (unsigned char *)key, 128 );\n    aes_crypt_cbc( &aes, AES_ENCRYPT, 16, iv, (unsigned char *)encrypt, output );\n\n    memcpy(out_data, output, 16);\n#endif\n\n    return 0;\n}\n\nint\nss_encrypt_all(cipher_env_t* env, buffer_t *plain, size_t capacity)\n{\n    int method = env->enc_method;\n    if (method > TABLE) {\n        cipher_ctx_t evp;\n        cipher_context_init(env, &evp, 1);\n\n        size_t iv_len = env->enc_iv_len;\n        int err       = 1;\n\n        static buffer_t tmp = { 0, 0, 0, NULL };\n        brealloc(&tmp, iv_len + plain->len, capacity);\n        buffer_t *cipher = &tmp;\n        cipher->len = plain->len;\n\n        uint8_t iv[MAX_IV_LENGTH];\n\n        rand_bytes(iv, iv_len);\n        cipher_context_set_iv(env, &evp, iv, iv_len, 1);\n        memcpy(cipher->array, iv, iv_len);\n\n        if (method >= SALSA20) {\n            crypto_stream_xor_ic((uint8_t *)(cipher->array + iv_len),\n                                 (const uint8_t *)plain->array, (uint64_t)(plain->len),\n                                 (const uint8_t *)iv,\n                                 0, env->enc_key, method);\n        } else {\n            err = cipher_context_update(&evp, (uint8_t *)(cipher->array + iv_len),\n                                        &cipher->len, (const uint8_t *)plain->array,\n                                        plain->len);\n        }\n\n        if (!err) {\n            bfree(plain);\n            cipher_context_release(env, &evp);\n            return -1;\n        }\n\n#ifdef DEBUG\n        dump(\"PLAIN\", plain->array, plain->len);\n        dump(\"CIPHER\", cipher->array + iv_len, cipher->len);\n#endif\n\n        cipher_context_release(env, &evp);\n\n        brealloc(plain, iv_len + cipher->len, capacity);\n        memcpy(plain->array, cipher->array, iv_len + cipher->len);\n        plain->len = iv_len + cipher->len;\n\n        return 0;\n    } else {\n        if (env->enc_method == TABLE) {\n            char *begin = plain->array;\n            char *ptr   = plain->array;\n            while (ptr < begin + plain->len) {\n                *ptr = (char)env->enc_table[(uint8_t)*ptr];\n                ptr++;\n            }\n        }\n\n        return 0;\n    }\n}\n\nint\nss_encrypt(cipher_env_t *env, buffer_t *plain, enc_ctx_t *ctx, size_t capacity)\n{\n    if (ctx != NULL) {\n        static buffer_t tmp = { 0, 0, 0, NULL };\n\n        int err       = 1;\n        size_t iv_len = 0;\n        if (!ctx->init) {\n            iv_len = env->enc_iv_len;\n        }\n\n        brealloc(&tmp, iv_len + plain->len, capacity);\n        buffer_t *cipher = &tmp;\n        cipher->len = plain->len;\n\n        if (!ctx->init) {\n            cipher_context_set_iv(env, &ctx->evp, ctx->evp.iv, iv_len, 1);\n            memcpy(cipher->array, ctx->evp.iv, iv_len);\n            ctx->counter = 0;\n            ctx->init    = 1;\n        }\n\n        if (env->enc_method >= SALSA20) {\n            int padding = ctx->counter % SODIUM_BLOCK_SIZE;\n            brealloc(cipher, iv_len + (padding + cipher->len) * 2, capacity);\n            if (padding) {\n                brealloc(plain, plain->len + padding, capacity);\n                memmove(plain->array + padding, plain->array, plain->len);\n                sodium_memzero(plain->array, padding);\n            }\n            crypto_stream_xor_ic((uint8_t *)(cipher->array + iv_len),\n                                 (const uint8_t *)plain->array,\n                                 (uint64_t)(plain->len + padding),\n                                 (const uint8_t *)ctx->evp.iv,\n                                 ctx->counter / SODIUM_BLOCK_SIZE, env->enc_key,\n                                 env->enc_method);\n            ctx->counter += plain->len;\n            if (padding) {\n                memmove(cipher->array + iv_len,\n                        cipher->array + iv_len + padding, cipher->len);\n            }\n        } else {\n            err =\n                cipher_context_update(&ctx->evp,\n                                      (uint8_t *)(cipher->array + iv_len),\n                                      &cipher->len, (const uint8_t *)plain->array,\n                                      plain->len);\n            if (!err) {\n                return -1;\n            }\n        }\n\n#ifdef DEBUG\n        dump(\"PLAIN\", plain->array, plain->len);\n        dump(\"CIPHER\", cipher->array + iv_len, cipher->len);\n#endif\n\n        brealloc(plain, iv_len + cipher->len, capacity);\n        memcpy(plain->array, cipher->array, iv_len + cipher->len);\n        plain->len = iv_len + cipher->len;\n\n        return 0;\n    } else {\n        if (env->enc_method == TABLE) {\n            char *begin = plain->array;\n            char *ptr   = plain->array;\n            while (ptr < begin + plain->len) {\n                *ptr = (char)env->enc_table[(uint8_t)*ptr];\n                ptr++;\n            }\n        }\n        return 0;\n    }\n}\n\nint\nss_decrypt_all(cipher_env_t* env, buffer_t *cipher, size_t capacity)\n{\n    int method = env->enc_method;\n    if (method > TABLE) {\n        size_t iv_len = env->enc_iv_len;\n        int ret       = 1;\n\n        if (cipher->len <= iv_len) {\n            return -1;\n        }\n\n        cipher_ctx_t evp;\n        cipher_context_init(env, &evp, 0);\n\n        static buffer_t tmp = { 0, 0, 0, NULL };\n        brealloc(&tmp, cipher->len, capacity);\n        buffer_t *plain = &tmp;\n        plain->len = cipher->len - iv_len;\n\n        uint8_t iv[MAX_IV_LENGTH];\n        memcpy(iv, cipher->array, iv_len);\n        cipher_context_set_iv(env, &evp, iv, iv_len, 0);\n\n        if (method >= SALSA20) {\n            crypto_stream_xor_ic((uint8_t *)plain->array,\n                                 (const uint8_t *)(cipher->array + iv_len),\n                                 (uint64_t)(cipher->len - iv_len),\n                                 (const uint8_t *)iv, 0, env->enc_key, method);\n        } else {\n            ret = cipher_context_update(&evp, (uint8_t *)plain->array, &plain->len,\n                                        (const uint8_t *)(cipher->array + iv_len),\n                                        cipher->len - iv_len);\n        }\n\n        if (!ret) {\n            bfree(cipher);\n            cipher_context_release(env, &evp);\n            return -1;\n        }\n\n#ifdef DEBUG\n        dump(\"PLAIN\", plain->array, plain->len);\n        dump(\"CIPHER\", cipher->array + iv_len, cipher->len - iv_len);\n#endif\n\n        cipher_context_release(env, &evp);\n\n        brealloc(cipher, plain->len, capacity);\n        memcpy(cipher->array, plain->array, plain->len);\n        cipher->len = plain->len;\n\n        return 0;\n    } else {\n        if (method == TABLE) {\n            char *begin = cipher->array;\n            char *ptr   = cipher->array;\n            while (ptr < begin + cipher->len) {\n                *ptr = (char)env->dec_table[(uint8_t)*ptr];\n                ptr++;\n            }\n        }\n\n        return 0;\n    }\n}\n\nint\nss_decrypt(cipher_env_t* env, buffer_t *cipher, enc_ctx_t *ctx, size_t capacity)\n{\n    if (ctx != NULL) {\n        static buffer_t tmp = { 0, 0, 0, NULL };\n\n        size_t iv_len = 0;\n        int err       = 1;\n\n        brealloc(&tmp, cipher->len, capacity);\n        buffer_t *plain = &tmp;\n        plain->len = cipher->len;\n\n        if (!ctx->init) {\n            uint8_t iv[MAX_IV_LENGTH];\n            iv_len      = env->enc_iv_len;\n            plain->len -= iv_len;\n\n            memcpy(iv, cipher->array, iv_len);\n            cipher_context_set_iv(env, &ctx->evp, iv, iv_len, 0);\n            ctx->counter = 0;\n            ctx->init    = 1;\n\n            if (env->enc_method > RC4) {\n                if (cache_key_exist(env->iv_cache, (char *)iv, iv_len)) {\n                    bfree(cipher);\n                    return -1;\n                } else {\n                    cache_insert(env->iv_cache, (char *)iv, iv_len, NULL);\n                }\n            }\n        }\n\n        if (env->enc_method >= SALSA20) {\n            int padding = ctx->counter % SODIUM_BLOCK_SIZE;\n            brealloc(plain, (plain->len + padding) * 2, capacity);\n\n            if (padding) {\n                brealloc(cipher, cipher->len + padding, capacity);\n                memmove(cipher->array + iv_len + padding, cipher->array + iv_len,\n                        cipher->len - iv_len);\n                sodium_memzero(cipher->array + iv_len, padding);\n            }\n            crypto_stream_xor_ic((uint8_t *)plain->array,\n                                 (const uint8_t *)(cipher->array + iv_len),\n                                 (uint64_t)(cipher->len - iv_len + padding),\n                                 (const uint8_t *)ctx->evp.iv,\n                                 ctx->counter / SODIUM_BLOCK_SIZE, env->enc_key,\n                                 env->enc_method);\n            ctx->counter += cipher->len - iv_len;\n            if (padding) {\n                memmove(plain->array, plain->array + padding, plain->len);\n            }\n        } else {\n            err = cipher_context_update(&ctx->evp, (uint8_t *)plain->array, &plain->len,\n                                        (const uint8_t *)(cipher->array + iv_len),\n                                        cipher->len - iv_len);\n        }\n\n        if (!err) {\n            bfree(cipher);\n            return -1;\n        }\n\n#ifdef DEBUG\n        dump(\"PLAIN\", plain->array, plain->len);\n        dump(\"CIPHER\", cipher->array + iv_len, cipher->len - iv_len);\n#endif\n\n        brealloc(cipher, plain->len, capacity);\n        memcpy(cipher->array, plain->array, plain->len);\n        cipher->len = plain->len;\n\n        return 0;\n    } else {\n        if(env->enc_method == TABLE) {\n            char *begin = cipher->array;\n            char *ptr   = cipher->array;\n            while (ptr < begin + cipher->len) {\n                *ptr = (char)env->dec_table[(uint8_t)*ptr];\n                ptr++;\n            }\n        }\n        return 0;\n    }\n}\n\nint\nss_encrypt_buffer(cipher_env_t *env, enc_ctx_t *ctx, char *in, size_t in_size, char *out, size_t *out_size)\n{\n    buffer_t cipher;\n    memset(&cipher, 0, sizeof(buffer_t));\n    balloc(&cipher, in_size + 32);\n    cipher.len = in_size;\n    memcpy(cipher.array, in, in_size);\n    int s = ss_encrypt(env, &cipher, ctx, in_size + 32);\n    if (s == 0) {\n        *out_size = cipher.len;\n        memcpy(out, cipher.array, cipher.len);\n    }\n    bfree(&cipher);\n    return s;\n}\n\nint\nss_decrypt_buffer(cipher_env_t *env, enc_ctx_t *ctx, char *in, size_t in_size, char *out, size_t *out_size)\n{\n    buffer_t cipher;\n    memset(&cipher, 0, sizeof(buffer_t));\n    balloc(&cipher, in_size + 32);\n    cipher.len = in_size;\n    memcpy(cipher.array, in, in_size);\n    int s = ss_decrypt(env, &cipher, ctx, in_size + 32);\n    if (s == 0) {\n        *out_size = cipher.len;\n        memcpy(out, cipher.array, cipher.len);\n    }\n    bfree(&cipher);\n    return s;\n}\n\nvoid\nenc_ctx_init(cipher_env_t *env, enc_ctx_t *ctx, int enc)\n{\n    sodium_memzero(ctx, sizeof(enc_ctx_t));\n    cipher_context_init(env, &ctx->evp, enc);\n\n    if (enc) {\n        rand_bytes(ctx->evp.iv, env->enc_iv_len);\n    }\n}\n\nvoid\nenc_ctx_release(cipher_env_t *env, enc_ctx_t *ctx)\n{\n    cipher_context_release(env, &ctx->evp);\n}\n\nvoid\nenc_table_init(cipher_env_t * env, int method, const char *pass)\n{\n    uint32_t i;\n    uint64_t key = 0;\n    uint8_t *digest;\n\n    env->enc_table = ss_malloc(256);\n    env->dec_table = ss_malloc(256);\n\n    digest = enc_md5((const uint8_t *)pass, strlen(pass), NULL);\n\n    for (i = 0; i < 8; i++)\n        key += OFFSET_ROL(digest, i);\n\n    for (i = 0; i < 256; ++i)\n        env->enc_table[i] = i;\n    for (i = 1; i < 1024; ++i)\n        merge_sort(env->enc_table, 256, i, key);\n    for (i = 0; i < 256; ++i)\n        // gen decrypt table from encrypt table\n        env->dec_table[env->enc_table[i]] = i;\n\n    if (method == TABLE) {\n        env->enc_key_len = strlen(pass);\n        memcpy(&env->enc_key, pass, env->enc_key_len);\n    } else {\n        const digest_type_t *md = get_digest_type(\"MD5\");\n\n        env->enc_key_len = bytes_to_key(NULL, md, (const uint8_t *)pass, env->enc_key);\n\n        if (env->enc_key_len == 0) {\n            FATAL(\"Cannot generate key and IV\");\n        }\n    }\n\n    env->enc_iv_len = 0;\n\n    env->enc_method = method;\n}\n\nvoid\nenc_key_init(cipher_env_t *env, int method, const char *pass)\n{\n    if (method < NONE || method >= CIPHER_NUM) {\n        LOGE(\"enc_key_init(): Illegal method\");\n        return;\n    }\n\n    // Initialize cache\n    cache_create(&env->iv_cache, 256, NULL);\n\n#if defined(USE_CRYPTO_OPENSSL)\n    OpenSSL_add_all_algorithms();\n#else\n    cipher_kt_t cipher_info;\n#endif\n\n    cipher_t cipher;\n    memset(&cipher, 0, sizeof(cipher_t));\n\n    // Initialize sodium for random generator\n    if (sodium_init() == -1) {\n        FATAL(\"Failed to initialize sodium\");\n    }\n\n    if (method == SALSA20 || method == CHACHA20 || method == CHACHA20IETF) {\n#if defined(USE_CRYPTO_OPENSSL)\n        cipher.info    = NULL;\n        cipher.key_len = supported_ciphers_key_size[method];\n        cipher.iv_len  = supported_ciphers_iv_size[method];\n#endif\n#if defined(USE_CRYPTO_POLARSSL)\n        cipher.info             = &cipher_info;\n        cipher.info->base       = NULL;\n        cipher.info->key_length = supported_ciphers_key_size[method] * 8;\n        cipher.info->iv_size    = supported_ciphers_iv_size[method];\n#endif\n#if defined(USE_CRYPTO_MBEDTLS)\n        // XXX: key_length changed to key_bitlen in mbed TLS 2.0.0\n        cipher.info             = &cipher_info;\n        cipher.info->base       = NULL;\n        cipher.info->key_bitlen = supported_ciphers_key_size[method] * 8;\n        cipher.info->iv_size    = supported_ciphers_iv_size[method];\n#endif\n    } else {\n        cipher.info = (cipher_kt_t *)get_cipher_type(method);\n    }\n\n    if (cipher.info == NULL && cipher.key_len == 0) {\n        do {\n#if defined(USE_CRYPTO_POLARSSL) && defined(USE_CRYPTO_APPLECC)\n            if (supported_ciphers_applecc[method] != kCCAlgorithmInvalid) {\n                cipher_info.base       = NULL;\n                cipher_info.key_length = supported_ciphers_key_size[method] * 8;\n                cipher_info.iv_size    = supported_ciphers_iv_size[method];\n                cipher.info            = (cipher_kt_t *)&cipher_info;\n                break;\n            }\n#endif\n#if defined(USE_CRYPTO_MBEDTLS) && defined(USE_CRYPTO_APPLECC)\n            // XXX: key_length changed to key_bitlen in mbed TLS 2.0.0\n            if (supported_ciphers_applecc[method] != kCCAlgorithmInvalid) {\n                cipher_info.base       = NULL;\n                cipher_info.key_bitlen = supported_ciphers_key_size[method] * 8;\n                cipher_info.iv_size    = supported_ciphers_iv_size[method];\n                cipher.info            = (cipher_kt_t *)&cipher_info;\n                break;\n            }\n#endif\n            LOGE(\"Cipher %s not found in crypto library\", supported_ciphers[method]);\n            FATAL(\"Cannot initialize cipher\");\n        } while (0);\n    }\n\n    const digest_type_t *md = get_digest_type(\"MD5\");\n    if (md == NULL) {\n        FATAL(\"MD5 Digest not found in crypto library\");\n    }\n\n    env->enc_key_len = bytes_to_key(&cipher, md, (const uint8_t *)pass, env->enc_key);\n\n    if (env->enc_key_len == 0) {\n        FATAL(\"Cannot generate key and IV\");\n    }\n    if (method == RC4_MD5 || method == RC4_MD5_6) {\n        env->enc_iv_len = supported_ciphers_iv_size[method];\n    } else {\n        env->enc_iv_len = cipher_iv_size(&cipher);\n    }\n    env->enc_method = method;\n}\n\nint\nenc_init(cipher_env_t *env, const char *pass, const char *method)\n{\n    int m = NONE;\n    if (method != NULL) {\n        for (m = NONE; m < CIPHER_NUM; m++)\n            if (strcmp(method, supported_ciphers[m]) == 0) {\n                break;\n            }\n        if (m >= CIPHER_NUM) {\n            LOGE(\"Invalid cipher name: %s, use rc4-md5 instead\", method);\n            m = RC4_MD5;\n        }\n    }\n    if (m <= TABLE) {\n        enc_table_init(env, m, pass);\n    } else {\n        enc_key_init(env, m, pass);\n    }\n    env->enc_method = m;\n    return m;\n}\n\nvoid\nenc_release(cipher_env_t *env) {\n    if (env->enc_method == TABLE) {\n        ss_free(env->enc_table);\n        ss_free(env->dec_table);\n    } else {\n        cache_delete(env->iv_cache, 0);\n    }\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/encrypt.h",
    "content": "/*\n * encrypt.h - Define the enryptor's interface\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _ENCRYPT_H\n#define _ENCRYPT_H\n\n#ifndef __MINGW32__\n#include <sys/socket.h>\n#else\n\n#ifdef max\n#undef max\n#endif\n\n#ifdef min\n#undef min\n#endif\n\n#endif\n\n#include <string.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <stdint.h>\n\n#if defined(USE_CRYPTO_OPENSSL)\n\n#include <openssl/evp.h>\n#include <openssl/sha.h>\n#include <openssl/md5.h>\ntypedef EVP_CIPHER cipher_kt_t;\ntypedef EVP_CIPHER_CTX cipher_evp_t;\ntypedef EVP_MD digest_type_t;\n#define MAX_KEY_LENGTH EVP_MAX_KEY_LENGTH\n#define MAX_IV_LENGTH EVP_MAX_IV_LENGTH\n#define MAX_MD_SIZE EVP_MAX_MD_SIZE\n\n#elif defined(USE_CRYPTO_POLARSSL)\n\n#include <polarssl/cipher.h>\n#include <polarssl/md.h>\ntypedef cipher_info_t cipher_kt_t;\ntypedef cipher_context_t cipher_evp_t;\ntypedef md_info_t digest_type_t;\n#define MAX_KEY_LENGTH 64\n#define MAX_IV_LENGTH POLARSSL_MAX_IV_LENGTH\n#define MAX_MD_SIZE POLARSSL_MD_MAX_SIZE\n\n#elif defined(USE_CRYPTO_MBEDTLS)\n\n#include <mbedtls/cipher.h>\n#include <mbedtls/md.h>\ntypedef mbedtls_cipher_info_t cipher_kt_t;\ntypedef mbedtls_cipher_context_t cipher_evp_t;\ntypedef mbedtls_md_info_t digest_type_t;\n#define MAX_KEY_LENGTH 64\n#define MAX_IV_LENGTH MBEDTLS_MAX_IV_LENGTH\n#define MAX_MD_SIZE MBEDTLS_MD_MAX_SIZE\n\n/* we must have MBEDTLS_CIPHER_MODE_CFB defined */\n#if !defined(MBEDTLS_CIPHER_MODE_CFB)\n#error Cipher Feedback mode a.k.a CFB not supported by your mbed TLS.\n#endif\n\n#endif\n\n#ifdef USE_CRYPTO_APPLECC\n\n#include <CommonCrypto/CommonCrypto.h>\n\n#define kCCAlgorithmInvalid UINT32_MAX\n#define kCCContextValid 0\n#define kCCContextInvalid -1\n\ntypedef struct {\n    CCCryptorRef cryptor;\n    int valid;\n    CCOperation encrypt;\n    CCAlgorithm cipher;\n    CCMode mode;\n    CCPadding padding;\n    uint8_t iv[MAX_IV_LENGTH];\n    uint8_t key[MAX_KEY_LENGTH];\n    size_t iv_len;\n    size_t key_len;\n} cipher_cc_t;\n\n#endif\n\ntypedef struct {\n    uint8_t *enc_table;\n    uint8_t *dec_table;\n    uint8_t enc_key[MAX_KEY_LENGTH];\n    int enc_key_len;\n    int enc_iv_len;\n    int enc_method;\n\n    struct cache *iv_cache;\n} cipher_env_t;\n\ntypedef struct {\n    cipher_evp_t *evp;\n#ifdef USE_CRYPTO_APPLECC\n    cipher_cc_t cc;\n#endif\n    uint8_t iv[MAX_IV_LENGTH];\n} cipher_ctx_t;\n\ntypedef struct {\n    cipher_kt_t *info;\n    size_t iv_len;\n    size_t key_len;\n} cipher_t;\n\n#ifdef HAVE_STDINT_H\n#include <stdint.h>\n#elif HAVE_INTTYPES_H\n#include <inttypes.h>\n#endif\n\n#define SODIUM_BLOCK_SIZE   64\n\nenum crpher_index {\n    NONE,\n    TABLE,\n    RC4,\n    RC4_MD5_6,\n    RC4_MD5,\n    AES_128_CFB,\n    AES_192_CFB,\n    AES_256_CFB,\n    AES_128_CTR,\n    AES_192_CTR,\n    AES_256_CTR,\n    BF_CFB,\n    CAMELLIA_128_CFB,\n    CAMELLIA_192_CFB,\n    CAMELLIA_256_CFB,\n    CAST5_CFB,\n    DES_CFB,\n    IDEA_CFB,\n    RC2_CFB,\n    SEED_CFB,\n    SALSA20,\n    CHACHA20,\n    CHACHA20IETF,\n    CIPHER_NUM,\n};\n\n#define ADDRTYPE_MASK 0xEF\n\n#define MD5_BYTES 16U\n#define SHA1_BYTES 20U\n\n#define min(a, b) (((a) < (b)) ? (a) : (b))\n#define max(a, b) (((a) > (b)) ? (a) : (b))\n\ntypedef struct buffer {\n    size_t idx;\n    size_t len;\n    size_t capacity;\n    char   *array;\n} buffer_t;\n\ntypedef struct chunk {\n    uint32_t idx;\n    uint32_t len;\n    uint32_t counter;\n    buffer_t *buf;\n} chunk_t;\n\ntypedef struct enc_ctx {\n    uint8_t init;\n    uint64_t counter;\n    cipher_ctx_t evp;\n} enc_ctx_t;\n\nvoid bytes_to_key_with_size(const char *pass, size_t len, uint8_t *md, size_t md_size);\n\nint rand_bytes(uint8_t *output, int len);\n\nint ss_encrypt_all(cipher_env_t* env, buffer_t *plaintext, size_t capacity);\nint ss_decrypt_all(cipher_env_t* env, buffer_t *ciphertext, size_t capacity);\nint ss_encrypt(cipher_env_t* env, buffer_t *plaintext, enc_ctx_t *ctx, size_t capacity);\nint ss_decrypt(cipher_env_t* env, buffer_t *ciphertext, enc_ctx_t *ctx, size_t capacity);\n\nint enc_init(cipher_env_t *env, const char *pass, const char *method);\nvoid enc_release(cipher_env_t *env);\nvoid enc_ctx_init(cipher_env_t *env, enc_ctx_t *ctx, int enc);\nvoid enc_ctx_release(cipher_env_t* env, enc_ctx_t *ctx);\nint enc_get_iv_len(cipher_env_t* env);\nuint8_t* enc_get_key(cipher_env_t* env);\nint enc_get_key_len(cipher_env_t* env);\nvoid cipher_context_release(cipher_env_t *env, cipher_ctx_t *ctx);\nunsigned char *enc_md5(const unsigned char *d, size_t n, unsigned char *md);\n\nint ss_md5_hmac_with_key(char *auth, char *msg, int msg_len, uint8_t *auth_key, int key_len);\nint ss_md5_hash_func(char *auth, char *msg, int msg_len);\nint ss_sha1_hmac_with_key(char *auth, char *msg, int msg_len, uint8_t *auth_key, int key_len);\nint ss_sha1_hash_func(char *auth, char *msg, int msg_len);\nint ss_aes_128_cbc(char *encrypt, char *out_data, char *key);\nint ss_encrypt_buffer(cipher_env_t *env, enc_ctx_t *ctx, char *in, size_t in_size, char *out, size_t *out_size);\nint ss_decrypt_buffer(cipher_env_t *env, enc_ctx_t *ctx, char *in, size_t in_size, char *out, size_t *out_size);\n\nint balloc(buffer_t *ptr, size_t capacity);\nint brealloc(buffer_t *ptr, size_t len, size_t capacity);\nvoid bfree(buffer_t *ptr);\n\n//extern cipher_env_t cipher_env;\n\n#endif // _ENCRYPT_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/http.c",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <stdlib.h> /* malloc() */\n#include <string.h> /* strncpy() */\n#include <strings.h> /* strncasecmp() */\n#include <ctype.h> /* isblank() */\n\n#include \"http.h\"\n#include \"protocol.h\"\n\n#define SERVER_NAME_LEN 256\n\nstatic int parse_http_header(const char *, size_t, char **);\nstatic int get_header(const char *, const char *, int, char **);\nstatic int next_header(const char **, int *);\n\nstatic const protocol_t http_protocol_st = {\n    .default_port =                 80,\n    .parse_packet = &parse_http_header,\n};\nconst protocol_t *const http_protocol = &http_protocol_st;\n\n/*\n * Parses a HTTP request for the Host: header\n *\n * Returns:\n *  >=0  - length of the hostname and updates *hostname\n *         caller is responsible for freeing *hostname\n *  -1   - Incomplete request\n *  -2   - No Host header included in this request\n *  -3   - Invalid hostname pointer\n *  -4   - malloc failure\n *  < -4 - Invalid HTTP request\n *\n */\nstatic int\nparse_http_header(const char *data, size_t data_len, char **hostname)\n{\n    int result, i;\n\n    if (hostname == NULL)\n        return -3;\n\n    if (data_len == 0)\n        return -1;\n\n    result = get_header(\"Host:\", data, data_len, hostname);\n    if (result < 0)\n        return result;\n\n    /*\n     *  if the user specifies the port in the request, it is included here.\n     *  Host: example.com:80\n     *  so we trim off port portion\n     */\n    for (i = result - 1; i >= 0; i--)\n        if ((*hostname)[i] == ':') {\n            (*hostname)[i] = '\\0';\n            result         = i;\n            break;\n        }\n\n    return result;\n}\n\nstatic int\nget_header(const char *header, const char *data, int data_len, char **value)\n{\n    int len, header_len;\n\n    header_len = strlen(header);\n\n    /* loop through headers stopping at first blank line */\n    while ((len = next_header(&data, &data_len)) != 0)\n        if (len > header_len && strncasecmp(header, data, header_len) == 0) {\n            /* Eat leading whitespace */\n            while (header_len < len && isblank(data[header_len]))\n                header_len++;\n\n            *value = malloc(len - header_len + 1);\n            if (*value == NULL)\n                return -4;\n\n            strncpy(*value, data + header_len, len - header_len);\n            (*value)[len - header_len] = '\\0';\n\n            return len - header_len;\n        }\n\n    /* If there is no data left after reading all the headers then we do not\n     * have a complete HTTP request, there must be a blank line */\n    if (data_len == 0)\n        return -1;\n\n    return -2;\n}\n\nstatic int\nnext_header(const char **data, int *len)\n{\n    int header_len;\n\n    /* perhaps we can optimize this to reuse the value of header_len, rather\n     * than scanning twice.\n     * Walk our data stream until the end of the header */\n    while (*len > 2 && (*data)[0] != '\\r' && (*data)[1] != '\\n') {\n        (*len)--;\n        (*data)++;\n    }\n\n    /* advanced past the <CR><LF> pair */\n    *data += 2;\n    *len  -= 2;\n\n    /* Find the length of the next header */\n    header_len = 0;\n    while (*len > header_len + 1\n           && (*data)[header_len] != '\\r'\n           && (*data)[header_len + 1] != '\\n')\n        header_len++;\n\n    return header_len;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/http.h",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef HTTP_H\n#define HTTP_H\n\n#include <stdio.h>\n#include \"protocol.h\"\n\nconst protocol_t *const http_protocol;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/includeobfs.h",
    "content": "#ifndef _INCLUDEOBFSOBFS_H\n#define _INCLUDEOBFSOBFS_H\n\n#include \"obfs/auth_chain.c\"\n#include \"obfs/auth.c\"\n#include \"obfs/tls1.2_ticket.c\"\n#include \"obfs/verify.c\"\n#include \"obfs/http_simple.c\"\n#include \"obfs/obfsutil.c\"\n#include \"obfs/base64.c\"\n#include \"obfs/crc32.c\"\n#include \"obfs/obfs.c\"\n\n#endif // _INCLUDEOBFSOBFS_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/jconf.c",
    "content": "/*\n * jconf.c - Parse the JSON format config file\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <unistd.h>\n#include <string.h>\n#include <time.h>\n\n#include \"utils.h\"\n#include \"jconf.h\"\n#include \"json.h\"\n#include \"string.h\"\n\n#include <libcork/core.h>\n\n#define check_json_value_type(value, expected_type, message) \\\n    do { \\\n        if ((value)->type != (expected_type)) \\\n            FATAL((message)); \\\n    } while(0)\n\nstatic char *\nto_string(const json_value *value)\n{\n    if (value->type == json_string) {\n        return ss_strndup(value->u.string.ptr, value->u.string.length);\n    } else if (value->type == json_integer) {\n        return strdup(ss_itoa(value->u.integer));\n    } else if (value->type == json_null) {\n        return \"null\";\n    } else {\n        LOGE(\"%d\", value->type);\n        FATAL(\"Invalid config format.\");\n    }\n    return 0;\n}\n\nvoid\nfree_addr(ss_addr_t *addr)\n{\n    ss_free(addr->host);\n    ss_free(addr->port);\n}\n\nvoid\nparse_addr(const char *str, ss_addr_t *addr)\n{\n    int ipv6 = 0, ret = -1, n = 0;\n    char *pch;\n\n    struct cork_ip ip;\n    if (cork_ip_init(&ip, str) != -1) {\n        addr->host = strdup(str);\n        addr->port = NULL;\n        return;\n    }\n\n    pch = strchr(str, ':');\n    while (pch != NULL) {\n        n++;\n        ret = pch - str;\n        pch = strchr(pch + 1, ':');\n    }\n    if (n > 1) {\n        ipv6 = 1;\n        if (str[ret - 1] != ']') {\n            ret = -1;\n        }\n    }\n\n    if (ret == -1) {\n        if (ipv6) {\n            addr->host = ss_strndup(str + 1, strlen(str) - 2);\n        } else {\n            addr->host = strdup(str);\n        }\n        addr->port = NULL;\n    } else {\n        if (ipv6) {\n            addr->host = ss_strndup(str + 1, ret - 2);\n        } else {\n            addr->host = ss_strndup(str, ret);\n        }\n        addr->port = strdup(str + ret + 1);\n    }\n}\n\nvoid parse_ss_server(ss_server_t *server, json_value* json) {\n    unsigned int i;\n\n    // TODO: set default value\n\n    for (i = 0; i < json->u.object.length; i++) {\n        char *name = json->u.object.values[i].name;\n        json_value *value = json->u.object.values[i].value;\n\n        if (strcmp(name, \"id\") == 0) {\n            server->id = to_string(value);\n        } else if (strcmp(name, \"server\") == 0) {\n            server->server = to_string(value);\n        } else if (strcmp(name, \"server_port\") == 0) {\n            check_json_value_type(value, json_integer,\n                                  \"invalid config file: option 'server_port' must be an integer\");\n            server->server_port = value->u.integer;\n        } else if (strcmp(name, \"server_udp_port\") == 0) { // SSR\n            check_json_value_type(value, json_integer,\n                                  \"invalid config file: option 'server_udp_port' must be an integer\");\n            server->server_udp_port = value->u.integer;\n        } else if (strcmp(name, \"password\") == 0) {\n            server->password = to_string(value);\n        } else if (strcmp(name, \"method\") == 0) {\n            server->method = to_string(value);\n        } else if (strcmp(name, \"protocol\") == 0) { // SSR\n            server->protocol = to_string(value);\n        } else if (strcmp(name, \"protocol_param\") == 0) { //SSR\n            server->protocol_param = to_string(value);\n        } else if (strcmp(name, \"obfs\") == 0) { // SSR\n            server->obfs = to_string(value);\n        } else if (strcmp(name, \"obfs_param\") == 0) { // SSR\n            server->obfs_param = to_string(value);\n        } else if (strcmp(name, \"group\") == 0) { // SSR\n            server->group = to_string(value);\n        } else if (strcmp(name, \"enable\") == 0) { // SSR\n            check_json_value_type(value, json_boolean,\n                                  \"invalid config file: option 'enable' must be an boolean\");\n            server->enable = value->u.boolean;\n        } else if (strcmp(name, \"udp_over_tcp\") == 0) { // SSR\n            check_json_value_type(value, json_boolean,\n                                  \"invalid config file: option 'udp_over_tcp' must be an boolean\");\n            server->udp_over_tcp = value->u.boolean;\n        }\n    }\n}\n\njconf_t *\nread_jconf(const char *file)\n{\n    static jconf_t conf;\n\n    memset(&conf, 0, sizeof(jconf_t));\n\n    conf.conf_ver = CONF_VER_LEGACY; // try legacy version first\n\n    char *buf;\n    json_value *obj;\n\n    FILE *f = fopen(file, \"rb\");\n    if (f == NULL) {\n        FATAL(\"Invalid config path.\");\n    }\n\n    fseek(f, 0, SEEK_END);\n    long pos = ftell(f);\n    fseek(f, 0, SEEK_SET);\n\n    if (pos >= MAX_CONF_SIZE) {\n        FATAL(\"Too large config file.\");\n    }\n\n    buf = ss_malloc(pos + 1);\n    if (buf == NULL) {\n        FATAL(\"No enough memory.\");\n    }\n\n    int nread = fread(buf, pos, 1, f);\n    if (!nread) {\n        FATAL(\"Failed to read the config file.\");\n    }\n    fclose(f);\n\n    buf[pos] = '\\0'; // end of string\n\n    json_settings settings = { 0UL, 0, NULL, NULL, NULL };\n    char error_buf[512];\n    obj = json_parse_ex(&settings, buf, pos, error_buf);\n\n    if (obj == NULL) {\n        FATAL(error_buf);\n    }\n\n    if (obj->type == json_object) {\n        unsigned int i, j;\n        for (i = 0; i < obj->u.object.length; i++) {\n            char *name = obj->u.object.values[i].name;\n            json_value *value = obj->u.object.values[i].value;\n\n            int match = 1;\n\n            // Legacy server config format\n            if (conf.conf_ver == CONF_VER_LEGACY) {\n                if (strcmp(name, \"server\") == 0) {\n                    if (value->type == json_array) {\n                        for (j = 0; j < value->u.array.length; j++) {\n                            if (j >= MAX_REMOTE_NUM) {\n                                break;\n                            }\n                            json_value *v = value->u.array.values[j];\n                            char *addr_str = to_string(v);\n                            parse_addr(addr_str, conf.server_legacy.remote_addr + j);\n                            ss_free(addr_str);\n                            conf.server_legacy.remote_num = j + 1;\n                        }\n                    } else if (value->type == json_string) {\n                        conf.server_legacy.remote_addr[0].host = to_string(value);\n                        conf.server_legacy.remote_addr[0].port = NULL;\n                        conf.server_legacy.remote_num = 1;\n                    }\n                } else if (strcmp(name, \"port_password\") == 0) {\n                    if (value->type == json_object) {\n                        for (j = 0; j < value->u.object.length; j++) {\n                            if (j >= MAX_PORT_NUM) {\n                                break;\n                            }\n                            json_value *v = value->u.object.values[j].value;\n                            if (v->type == json_string) {\n                                conf.server_legacy.port_password[j].port = ss_strndup(value->u.object.values[j].name,\n                                                                        value->u.object.values[j].name_length);\n                                conf.server_legacy.port_password[j].password = to_string(v);\n                                conf.server_legacy.port_password_num = j + 1;\n                            }\n                        }\n                    }\n                } else if (strcmp(name, \"server_port\") == 0) {\n                    conf.server_legacy.remote_port = to_string(value);\n                } else if (strcmp(name, \"local_address\") == 0) {\n                    conf.server_legacy.local_addr = to_string(value);\n                } else if (strcmp(name, \"local_port\") == 0) {\n                    conf.server_legacy.local_port = to_string(value);\n                } else if (strcmp(name, \"password\") == 0) {\n                    conf.server_legacy.password = to_string(value);\n                } else if (strcmp(name, \"auth\") == 0) {\n                    LOGI(\"auth is deprecated, ignored\");\n                } else if (strcmp(name, \"protocol\") == 0) { // SSR\n                    conf.server_legacy.protocol = to_string(value);\n                } else if (strcmp(name, \"protocol_param\") == 0) { //SSR\n                    conf.server_legacy.protocol_param = to_string(value);\n                } else if (strcmp(name, \"method\") == 0) {\n                    conf.server_legacy.method = to_string(value);\n                } else if (strcmp(name, \"obfs\") == 0) { // SSR\n                    conf.server_legacy.obfs = to_string(value);\n                } else if (strcmp(name, \"obfs_param\") == 0) { // SSR\n                    conf.server_legacy.obfs_param = to_string(value);\n                } else {\n                    match = 0;\n                }\n            }\n            if (!match) {\n                if(strcmp(name, \"servers\") == 0) {\n                    if(conf.conf_ver == CONF_VER_LEGACY) {\n                        memset(&conf.server_new_1, 0, sizeof(conf.server_new_1));\n                        conf.conf_ver = CONF_VER_1;\n                    }\n\n                    if (value->type == json_array) {\n                        for (j = 0; j < value->u.array.length; j++) {\n                            if (conf.server_new_1.server_num >= MAX_SERVER_NUM) {\n                                LOGI(\"Max servers exceed, ignore remain server defines.\");\n                                break;\n                            }\n                            json_value *v = value->u.array.values[j];\n\n                            if(v->type == json_object) {\n                                parse_ss_server(&conf.server_new_1.servers[conf.server_new_1.server_num], v);\n                                conf.server_new_1.server_num++;\n                            }\n                        }\n                    }\n                } else if (strcmp(name, \"timeout\") == 0) {\n                    conf.timeout = to_string(value);\n                } else if (strcmp(name, \"user\") == 0) {\n                    conf.user = to_string(value);\n                } else if (strcmp(name, \"fast_open\") == 0) {\n                    check_json_value_type(value, json_boolean,\n                                          \"invalid config file: option 'fast_open' must be a boolean\");\n                    conf.fast_open = value->u.boolean;\n                } else if (strcmp(name, \"nofile\") == 0) {\n                    check_json_value_type(value, json_integer,\n                                          \"invalid config file: option 'nofile' must be an integer\");\n                    conf.nofile = value->u.integer;\n                } else if (strcmp(name, \"nameserver\") == 0) {\n                    conf.nameserver = to_string(value);\n                } else if (strcmp(name, \"tunnel_address\") == 0) {\n                    conf.tunnel_address = to_string(value);\n                } else if (strcmp(name, \"mode\") == 0) {\n                    char *mode_str = to_string(value);\n\n                    if (strcmp(mode_str, \"tcp_only\") == 0)\n                        conf.mode = TCP_ONLY;\n                    else if (strcmp(mode_str, \"tcp_and_udp\") == 0)\n                        conf.mode = TCP_AND_UDP;\n                    else if (strcmp(mode_str, \"udp_only\") == 0)\n                        conf.mode = UDP_ONLY;\n                    else\n                        LOGI(\"ignore unknown mode: %s, use tcp_only as fallback\",\n                             mode_str);\n                    ss_free(mode_str);\n                } else if (strcmp(name, \"mtu\") == 0) {\n                    check_json_value_type(value, json_integer,\n                                          \"invalid config file: option 'mtu' must be an integer\");\n                    conf.mtu = value->u.integer;\n                } else if (strcmp(name, \"mptcp\") == 0) {\n                    check_json_value_type(value, json_boolean,\n                                          \"invalid config file: option 'mptcp' must be a boolean\");\n                    conf.mptcp = value->u.boolean;\n                } else if (strcmp(name, \"ipv6_first\") == 0) {\n                    check_json_value_type(value, json_boolean,\n                                          \"invalid config file: option 'ipv6_first' must be a boolean\");\n                    conf.ipv6_first = value->u.boolean;\n                }\n            }\n        }\n    } else {\n        FATAL(\"Invalid config file\");\n    }\n\n    ss_free(buf);\n    json_value_free(obj);\n    return &conf;\n}\n\nvoid free_jconf(jconf_t *conf) {\n    int i;\n\n    if (!conf) {\n        return;\n    }\n\n    ss_free(conf->timeout);\n    ss_free(conf->user);\n    ss_free(conf->nameserver);\n    ss_free(conf->tunnel_address);\n\n    if(conf->conf_ver == CONF_VER_LEGACY){\n        ss_server_legacy_t *legacy = &conf->server_legacy;\n        for(i = 0; i < legacy->remote_num; i++){\n            free_addr(&legacy->remote_addr[i]);\n        }\n        for(i = 0; i < legacy->port_password_num; i++){\n            ss_free(legacy->port_password[i].port);\n            ss_free(legacy->port_password[i].password);\n        }\n        ss_free(legacy->remote_port);\n        ss_free(legacy->local_addr);\n        ss_free(legacy->local_port);\n        ss_free(legacy->password);\n        ss_free(legacy->protocol);\n        ss_free(legacy->protocol_param);\n        ss_free(legacy->method);\n        ss_free(legacy->obfs);\n        ss_free(legacy->obfs_param);\n    } else {\n        ss_server_new_1_t *ss_server_new_1 = &conf->server_new_1;\n        for(i = 0; i < ss_server_new_1->server_num; i++){\n            ss_server_t *serv = &ss_server_new_1->servers[i];\n\n            ss_free(serv->server);\n            ss_free(serv->password);\n            ss_free(serv->method);\n            ss_free(serv->protocol);\n            ss_free(serv->protocol_param);\n            ss_free(serv->obfs);\n            ss_free(serv->obfs_param);\n            ss_free(serv->id);\n            ss_free(serv->group);\n        }\n    }\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/jconf.h",
    "content": "/*\n * jconf.h - Define the config data structure\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _JCONF_H\n#define _JCONF_H\n\n#define MAX_PORT_NUM 1024\n#define MAX_REMOTE_NUM 10\n#define MAX_SERVER_NUM 10\n#define MAX_CONF_SIZE 128 * 1024\n#define MAX_DNS_NUM 4\n#define MAX_CONNECT_TIMEOUT 10\n#define MAX_REQUEST_TIMEOUT 60\n#define MIN_UDP_TIMEOUT 10\n\n#define TCP_ONLY     0\n#define TCP_AND_UDP  1\n#define UDP_ONLY     3\n\ntypedef struct {\n    char *host;\n    char *port;\n} ss_addr_t;\n\ntypedef struct {\n    char *port;\n    char *password;\n} ss_port_password_t;\n\ntypedef struct {\n    // address from input (cmd or config file)\n    char *server;\n    int server_port;\n    int server_udp_port;\n\n    char *password; // raw password\n    char *method;\n\n    char *protocol;\n    char *protocol_param;\n    char *obfs;\n    char *obfs_param;\n\n    char *id;\n    char *group;\n    int enable;\n    int udp_over_tcp;\n} ss_server_t;\n\ntypedef struct {\n    int remote_num;\n    ss_addr_t remote_addr[MAX_REMOTE_NUM];\n    int port_password_num;\n    ss_port_password_t port_password[MAX_PORT_NUM];\n    char *remote_port;\n    char *local_addr;\n    char *local_port;\n    char *password;\n    char *protocol; // SSR\n    char *protocol_param; // SSR\n    char *method;\n    char *obfs; // SSR\n    char *obfs_param; // SSR\n} ss_server_legacy_t;\n\ntypedef struct {\n    size_t server_num;\n    ss_server_t servers[MAX_SERVER_NUM];\n} ss_server_new_1_t;\n\n#define CONF_VER_LEGACY 0\n#define CONF_VER_1 1\n\ntypedef struct {\n    int conf_ver; // 0 for legacy, > 0 for server_new_X\n    union {\n        ss_server_legacy_t server_legacy;\n        ss_server_new_1_t server_new_1;\n    };\n    char *timeout;\n    char *user;\n    int fast_open;\n    int nofile;\n    char *nameserver;\n    char *tunnel_address;\n    int mode;\n    int mtu;\n    int mptcp;\n    int ipv6_first;\n} jconf_t;\n\njconf_t *read_jconf(const char *file);\nvoid free_jconf(jconf_t *conf);\nvoid parse_addr(const char *str, ss_addr_t *addr);\nvoid free_addr(ss_addr_t *addr);\n\n#endif // _JCONF_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/json.c",
    "content": "/* vim: set et ts=3 sw=3 sts=3 ft=c:\n *\n * Copyright (C) 2012, 2013, 2014 James McLaughlin et al.  All rights reserved.\n * https://github.com/udp/json-parser\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *   notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"json.h\"\n#include \"utils.h\"\n\n#ifdef _MSC_VER\n#ifndef _CRT_SECURE_NO_WARNINGS\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#endif\n\n#ifdef __cplusplus\nconst struct _json_value json_value_none; /* zero-d by ctor */\n#else\nconst struct _json_value json_value_none = { NULL, 0, { 0 }, { NULL } };\n#endif\n\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n#include <math.h>\n\ntypedef unsigned short json_uchar;\n\nstatic unsigned char\nhex_value(json_char c)\n{\n    if (isdigit((uint8_t)c)) {\n        return c - '0';\n    }\n\n    switch (c) {\n    case 'a':\n    case 'A':\n        return 0x0A;\n    case 'b':\n    case 'B':\n        return 0x0B;\n    case 'c':\n    case 'C':\n        return 0x0C;\n    case 'd':\n    case 'D':\n        return 0x0D;\n    case 'e':\n    case 'E':\n        return 0x0E;\n    case 'f':\n    case 'F':\n        return 0x0F;\n    default:\n        return 0xFF;\n    }\n}\n\ntypedef struct {\n    unsigned long used_memory;\n\n    unsigned int uint_max;\n    unsigned long ulong_max;\n\n    json_settings settings;\n    int first_pass;\n} json_state;\n\nstatic void *\ndefault_alloc(size_t size, int zero, void *user_data)\n{\n    return zero ? calloc(1, size) : ss_malloc(size);\n}\n\nstatic void\ndefault_free(void *ptr, void *user_data)\n{\n    ss_free(ptr);\n}\n\nstatic void *\njson_alloc(json_state *state, unsigned long size, int zero)\n{\n    if ((state->ulong_max - state->used_memory) < size) {\n        return 0;\n    }\n\n    if (state->settings.max_memory\n        && (state->used_memory += size) > state->settings.max_memory) {\n        return 0;\n    }\n\n    return state->settings.mem_alloc(size, zero, state->settings.user_data);\n}\n\nstatic int\nnew_value(json_state *state, json_value **top, json_value **root,\n          json_value **alloc, json_type type)\n{\n    json_value *value;\n    int values_size;\n\n    if (!state->first_pass) {\n        value  = *top = *alloc;\n        *alloc = (*alloc)->_reserved.next_alloc;\n\n        if (!*root) {\n            *root = value;\n        }\n\n        switch (value->type) {\n        case json_array:\n\n            if (!(value->u.array.values = (json_value **)json_alloc\n                                              (state, value->u.array.length *\n                                              sizeof(json_value *), 0))) {\n                return 0;\n            }\n\n            value->u.array.length = 0;\n            break;\n\n        case json_object:\n\n            values_size = sizeof(*value->u.object.values) *\n                          value->u.object.length;\n\n            if (!((*(void **)&value->u.object.values) = json_alloc\n                                                            (state,\n                                                            values_size +\n                                                            ((size_t)value->u.\n                                                             object.values),\n                                                            0))) {\n                return 0;\n            }\n\n            value->_reserved.object_mem = (*(char **)&value->u.object.values) +\n                                          values_size;\n\n            value->u.object.length = 0;\n            break;\n\n        case json_string:\n\n            if (!(value->u.string.ptr = (json_char *)json_alloc\n                                            (state,\n                                            (value->u.string.length +\n                                             1) * sizeof(json_char), 0))) {\n                return 0;\n            }\n\n            value->u.string.length = 0;\n            break;\n\n        default:\n            break;\n        }\n\n        return 1;\n    }\n\n    value = (json_value *)json_alloc(state, sizeof(json_value), 1);\n\n    if (!value) {\n        return 0;\n    }\n\n    if (!*root) {\n        *root = value;\n    }\n\n    value->type   = type;\n    value->parent = *top;\n\n    if (*alloc) {\n        (*alloc)->_reserved.next_alloc = value;\n    }\n\n    *alloc = *top = value;\n\n    return 1;\n}\n\n#define e_off \\\n    ((int)(i - cur_line_begin))\n\n#define whitespace                          \\\ncase '\\n': \\\n    ++cur_line; cur_line_begin = i; \\\ncase ' ': \\\ncase '\\t': \\\ncase '\\r'\n\n#define string_add(b)                                         \\\n    do { if (!state.first_pass) { string[string_length] = b; \\\n         } ++string_length; } while (0)\n\nstatic const long\n    flag_next           = 1 << 0,\n    flag_reproc         = 1 << 1,\n    flag_need_comma     = 1 << 2,\n    flag_seek_value     = 1 << 3,\n    flag_escaped        = 1 << 4,\n    flag_string         = 1 << 5,\n    flag_need_colon     = 1 << 6,\n    flag_done           = 1 << 7,\n    flag_num_negative   = 1 << 8,\n    flag_num_zero       = 1 << 9,\n    flag_num_e          = 1 << 10,\n    flag_num_e_got_sign = 1 << 11,\n    flag_num_e_negative = 1 << 12,\n    flag_line_comment   = 1 << 13,\n    flag_block_comment  = 1 << 14;\n\njson_value *\njson_parse_ex(json_settings *settings,\n              const json_char *json,\n              size_t length,\n              char *error_buf)\n{\n    json_char error[json_error_max];\n    int cur_line;\n    const json_char *cur_line_begin, *i, *end;\n    json_value *top, *root, *alloc = 0;\n    json_state state = { 0UL, 0U, 0UL, { 0UL, 0, NULL, NULL, NULL }, 0 };\n    long flags;\n    long num_digits = 0, num_e = 0;\n    json_int_t num_fraction = 0;\n\n    /* Skip UTF-8 BOM\n     */\n    if (length >= 3 && ((unsigned char)json[0]) == 0xEF\n        && ((unsigned char)json[1]) == 0xBB\n        && ((unsigned char)json[2]) == 0xBF) {\n        json   += 3;\n        length -= 3;\n    }\n\n    error[0] = '\\0';\n    end      = (json + length);\n\n    memcpy(&state.settings, settings, sizeof(json_settings));\n\n    if (!state.settings.mem_alloc) {\n        state.settings.mem_alloc = default_alloc;\n    }\n\n    if (!state.settings.mem_free) {\n        state.settings.mem_free = default_free;\n    }\n\n    memset(&state.uint_max, 0xFF, sizeof(state.uint_max));\n    memset(&state.ulong_max, 0xFF, sizeof(state.ulong_max));\n\n    state.uint_max  -= 8; /* limit of how much can be added before next check */\n    state.ulong_max -= 8;\n\n    for (state.first_pass = 1; state.first_pass >= 0; --state.first_pass) {\n        json_uchar uchar;\n        unsigned char uc_b1, uc_b2, uc_b3, uc_b4;\n        json_char *string          = 0;\n        unsigned int string_length = 0;\n\n        top   = root = 0;\n        flags = flag_seek_value;\n\n        cur_line       = 1;\n        cur_line_begin = json;\n\n        for (i = json;; ++i) {\n            json_char b = (i == end ? 0 : *i);\n\n            if (flags & flag_string) {\n                if (!b) {\n                    sprintf(error, \"Unexpected EOF in string (at %d:%d)\",\n                            cur_line, e_off);\n                    goto e_failed;\n                }\n\n                if (string_length > state.uint_max) {\n                    goto e_overflow;\n                }\n\n                if (flags & flag_escaped) {\n                    flags &= ~flag_escaped;\n\n                    switch (b) {\n                    case 'b':\n                        string_add('\\b');\n                        break;\n                    case 'f':\n                        string_add('\\f');\n                        break;\n                    case 'n':\n                        string_add('\\n');\n                        break;\n                    case 'r':\n                        string_add('\\r');\n                        break;\n                    case 't':\n                        string_add('\\t');\n                        break;\n                    case 'u':\n\n                        if (end - i < 4 ||\n                            (uc_b1 = hex_value(*++i)) == 0xFF ||\n                            (uc_b2 = hex_value(*++i)) == 0xFF\n                            || (uc_b3 = hex_value(*++i)) == 0xFF ||\n                            (uc_b4 = hex_value(*++i)) == 0xFF) {\n                            sprintf(error,\n                                    \"Invalid character value `%c` (at %d:%d)\",\n                                    b, cur_line, e_off);\n                            goto e_failed;\n                        }\n\n                        uc_b1 = uc_b1 * 16 + uc_b2;\n                        uc_b2 = uc_b3 * 16 + uc_b4;\n\n                        uchar = ((json_char)uc_b1) * 256 + uc_b2;\n\n                        if (sizeof(json_char) >= sizeof(json_uchar) ||\n                            (uc_b1 == 0 && uc_b2 <= 0x7F)) {\n                            string_add((json_char)uchar);\n                            break;\n                        }\n\n                        if (uchar <= 0x7FF) {\n                            if (state.first_pass) {\n                                string_length += 2;\n                            } else {\n                                string[string_length++] = 0xC0 |\n                                                          ((uc_b2 &\n                                                            0xC0) >>\n                                                           6) |\n                                                          ((uc_b1 & 0x7) << 2);\n                                string[string_length++] = 0x80 |\n                                                          (uc_b2 & 0x3F);\n                            }\n\n                            break;\n                        }\n\n                        if (state.first_pass) {\n                            string_length += 3;\n                        } else {\n                            string[string_length++] = 0xE0 |\n                                                      ((uc_b1 & 0xF0) >> 4);\n                            string[string_length++] = 0x80 |\n                                                      ((uc_b1 &\n                                                        0xF) <<\n                                                       2) |\n                                                      ((uc_b2 & 0xC0) >> 6);\n                            string[string_length++] = 0x80 | (uc_b2 & 0x3F);\n                        }\n\n                        break;\n\n                    default:\n                        string_add(b);\n                    }\n\n                    continue;\n                }\n\n                if (b == '\\\\') {\n                    flags |= flag_escaped;\n                    continue;\n                }\n\n                if (b == '\"') {\n                    if (!state.first_pass) {\n                        string[string_length] = 0;\n                    }\n\n                    flags &= ~flag_string;\n                    string = 0;\n\n                    switch (top->type) {\n                    case json_string:\n\n                        top->u.string.length = string_length;\n                        flags               |= flag_next;\n\n                        break;\n\n                    case json_object:\n\n                        if (state.first_pass) {\n                            (*(json_char **)&top->u.object.values) +=\n                                string_length + 1;\n                        } else {\n                            top->u.object.values[top->u.object.length].name\n                                = (json_char *)top->_reserved.object_mem;\n\n                            top->u.object.values[top->u.object.length].\n                            name_length\n                                = string_length;\n\n                            (*(json_char **)&top->_reserved.object_mem) +=\n                                string_length + 1;\n                        }\n\n                        flags |= flag_seek_value | flag_need_colon;\n                        continue;\n\n                    default:\n                        break;\n                    }\n                } else {\n                    string_add(b);\n                    continue;\n                }\n            }\n\n            if (state.settings.settings & json_enable_comments) {\n                if (flags & (flag_line_comment | flag_block_comment)) {\n                    if (flags & flag_line_comment) {\n                        if (b == '\\r' || b == '\\n' || !b) {\n                            flags &= ~flag_line_comment;\n                            --i;   /* so null can be reproc'd */\n                        }\n\n                        continue;\n                    }\n\n                    if (flags & flag_block_comment) {\n                        if (!b) {\n                            sprintf(error,\n                                    \"%d:%d: Unexpected EOF in block comment\",\n                                    cur_line, e_off);\n                            goto e_failed;\n                        }\n\n                        if (b == '*' && i < (end - 1) && i[1] == '/') {\n                            flags &= ~flag_block_comment;\n                            ++i;   /* skip closing sequence */\n                        }\n\n                        continue;\n                    }\n                } else if (b == '/') {\n                    if (!(flags & (flag_seek_value | flag_done)) && top->type !=\n                        json_object) {\n                        sprintf(error, \"%d:%d: Comment not allowed here\",\n                                cur_line, e_off);\n                        goto e_failed;\n                    }\n\n                    if (++i == end) {\n                        sprintf(error, \"%d:%d: EOF unexpected\", cur_line,\n                                e_off);\n                        goto e_failed;\n                    }\n\n                    switch (b = *i) {\n                    case '/':\n                        flags |= flag_line_comment;\n                        continue;\n\n                    case '*':\n                        flags |= flag_block_comment;\n                        continue;\n\n                    default:\n                        sprintf(error,\n                                \"%d:%d: Unexpected `%c` in comment opening sequence\", cur_line, e_off,\n                                b);\n                        goto e_failed;\n                    }\n                }\n            }\n\n            if (flags & flag_done) {\n                if (!b) {\n                    break;\n                }\n\n                switch (b) {\nwhitespace:\n                    continue;\n\n                default:\n                    sprintf(error, \"%d:%d: Trailing garbage: `%c`\", cur_line,\n                            e_off, b);\n                    goto e_failed;\n                }\n            }\n\n            if (flags & flag_seek_value) {\n                switch (b) {\nwhitespace:\n                    continue;\n\n                case ']':\n\n                    if (top->type == json_array) {\n                        flags =\n                            (flags &\n                             ~(flag_need_comma | flag_seek_value)) | flag_next;\n                    } else {\n                        sprintf(error, \"%d:%d: Unexpected ]\", cur_line, e_off);\n                        goto e_failed;\n                    }\n\n                    break;\n\n                default:\n\n                    if (flags & flag_need_comma) {\n                        if (b == ',') {\n                            flags &= ~flag_need_comma;\n                            continue;\n                        } else {\n                            sprintf(error, \"%d:%d: Expected , before %c\",\n                                    cur_line, e_off, b);\n                            goto e_failed;\n                        }\n                    }\n\n                    if (flags & flag_need_colon) {\n                        if (b == ':') {\n                            flags &= ~flag_need_colon;\n                            continue;\n                        } else {\n                            sprintf(error, \"%d:%d: Expected : before %c\",\n                                    cur_line, e_off, b);\n                            goto e_failed;\n                        }\n                    }\n\n                    flags &= ~flag_seek_value;\n\n                    switch (b) {\n                    case '{':\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_object)) {\n                            goto e_alloc_failure;\n                        }\n\n                        continue;\n\n                    case '[':\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_array)) {\n                            goto e_alloc_failure;\n                        }\n\n                        flags |= flag_seek_value;\n                        continue;\n\n                    case '\"':\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_string)) {\n                            goto e_alloc_failure;\n                        }\n\n                        flags |= flag_string;\n\n                        string        = top->u.string.ptr;\n                        string_length = 0;\n\n                        continue;\n\n                    case 't':\n\n                        if ((end - i) < 3 || *(++i) != 'r' || *(++i) != 'u' ||\n                            *(++i) != 'e') {\n                            goto e_unknown_value;\n                        }\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_boolean)) {\n                            goto e_alloc_failure;\n                        }\n\n                        top->u.boolean = 1;\n\n                        flags |= flag_next;\n                        break;\n\n                    case 'f':\n\n                        if ((end - i) < 4 || *(++i) != 'a' || *(++i) != 'l' ||\n                            *(++i) != 's' || *(++i) != 'e') {\n                            goto e_unknown_value;\n                        }\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_boolean)) {\n                            goto e_alloc_failure;\n                        }\n\n                        flags |= flag_next;\n                        break;\n\n                    case 'n':\n\n                        if ((end - i) < 3 || *(++i) != 'u' || *(++i) != 'l' ||\n                            *(++i) != 'l') {\n                            goto e_unknown_value;\n                        }\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_null)) {\n                            goto e_alloc_failure;\n                        }\n\n                        flags |= flag_next;\n                        break;\n\n                    default:\n\n                        if (isdigit((uint8_t)b) || b == '-') {\n                            if (!new_value(&state, &top, &root, &alloc,\n                                           json_integer)) {\n                                goto e_alloc_failure;\n                            }\n\n                            if (!state.first_pass) {\n                                while (isdigit((uint8_t)b) || b == '+' || b ==\n                                       '-'\n                                       || b == 'e' || b == 'E' || b == '.') {\n                                    if ((++i) == end) {\n                                        b = 0;\n                                        break;\n                                    }\n\n                                    b = *i;\n                                }\n\n                                flags |= flag_next | flag_reproc;\n                                break;\n                            }\n\n                            flags &= ~(flag_num_negative | flag_num_e |\n                                       flag_num_e_got_sign |\n                                       flag_num_e_negative |\n                                       flag_num_zero);\n\n                            num_digits   = 0;\n                            num_fraction = 0;\n                            num_e        = 0;\n\n                            if (b != '-') {\n                                flags |= flag_reproc;\n                                break;\n                            }\n\n                            flags |= flag_num_negative;\n                            continue;\n                        } else {\n                            sprintf(error,\n                                    \"%d:%d: Unexpected %c when seeking value\",\n                                    cur_line, e_off, b);\n                            goto e_failed;\n                        }\n                    }\n                }\n            } else {\n                switch (top->type) {\n                case json_object:\n\n                    switch (b) {\nwhitespace:\n                        continue;\n\n                    case '\"':\n\n                        if (flags & flag_need_comma) {\n                            sprintf(error, \"%d:%d: Expected , before \\\"\",\n                                    cur_line, e_off);\n                            goto e_failed;\n                        }\n\n                        flags |= flag_string;\n\n                        string        = (json_char *)top->_reserved.object_mem;\n                        string_length = 0;\n\n                        break;\n\n                    case '}':\n\n                        flags = (flags & ~flag_need_comma) | flag_next;\n                        break;\n\n                    case ',':\n\n                        if (flags & flag_need_comma) {\n                            flags &= ~flag_need_comma;\n                            break;\n                        }\n\n                    default:\n\n                        sprintf(error, \"%d:%d: Unexpected `%c` in object\",\n                                cur_line, e_off, b);\n                        goto e_failed;\n                    }\n\n                    break;\n\n                case json_integer:\n                case json_double:\n\n                    if (isdigit((uint8_t)b)) {\n                        ++num_digits;\n\n                        if (top->type == json_integer || flags & flag_num_e) {\n                            if (!(flags & flag_num_e)) {\n                                if (flags & flag_num_zero) {\n                                    sprintf(error,\n                                            \"%d:%d: Unexpected `0` before `%c`\",\n                                            cur_line, e_off, b);\n                                    goto e_failed;\n                                }\n\n                                if (num_digits == 1 && b == '0') {\n                                    flags |= flag_num_zero;\n                                }\n                            } else {\n                                flags |= flag_num_e_got_sign;\n                                num_e  = (num_e * 10) + (b - '0');\n                                continue;\n                            }\n\n                            top->u.integer = (top->u.integer * 10) + (b - '0');\n                            continue;\n                        }\n\n                        num_fraction = (num_fraction * 10) + (b - '0');\n                        continue;\n                    }\n\n                    if (b == '+' || b == '-') {\n                        if ((flags & flag_num_e) &&\n                            !(flags & flag_num_e_got_sign)) {\n                            flags |= flag_num_e_got_sign;\n\n                            if (b == '-') {\n                                flags |= flag_num_e_negative;\n                            }\n\n                            continue;\n                        }\n                    } else if (b == '.' && top->type == json_integer) {\n                        if (!num_digits) {\n                            sprintf(error, \"%d:%d: Expected digit before `.`\",\n                                    cur_line, e_off);\n                            goto e_failed;\n                        }\n\n                        top->type  = json_double;\n                        top->u.dbl = (double)top->u.integer;\n\n                        num_digits = 0;\n                        continue;\n                    }\n\n                    if (!(flags & flag_num_e)) {\n                        if (top->type == json_double) {\n                            if (!num_digits) {\n                                sprintf(error,\n                                        \"%d:%d: Expected digit after `.`\",\n                                        cur_line, e_off);\n                                goto e_failed;\n                            }\n\n                            top->u.dbl += ((double)num_fraction) /\n                                          (pow(10, (double)num_digits));\n                        }\n\n                        if (b == 'e' || b == 'E') {\n                            flags |= flag_num_e;\n\n                            if (top->type == json_integer) {\n                                top->type  = json_double;\n                                top->u.dbl = (double)top->u.integer;\n                            }\n\n                            num_digits = 0;\n                            flags     &= ~flag_num_zero;\n\n                            continue;\n                        }\n                    } else {\n                        if (!num_digits) {\n                            sprintf(error, \"%d:%d: Expected digit after `e`\",\n                                    cur_line, e_off);\n                            goto e_failed;\n                        }\n\n                        top->u.dbl *=\n                            pow(10,\n                                (double)((flags &\n                                         flag_num_e_negative) ? -num_e : num_e));\n                    }\n\n                    if (flags & flag_num_negative) {\n                        if (top->type == json_integer) {\n                            top->u.integer = -top->u.integer;\n                        } else {\n                            top->u.dbl = -top->u.dbl;\n                        }\n                    }\n\n                    flags |= flag_next | flag_reproc;\n                    break;\n\n                default:\n                    break;\n                }\n            }\n\n            if (flags & flag_reproc) {\n                flags &= ~flag_reproc;\n                --i;\n            }\n\n            if (flags & flag_next) {\n                flags = (flags & ~flag_next) | flag_need_comma;\n\n                if (!top->parent) {\n                    /* root value done */\n\n                    flags |= flag_done;\n                    continue;\n                }\n\n                if (top->parent->type == json_array) {\n                    flags |= flag_seek_value;\n                }\n\n                if (!state.first_pass) {\n                    json_value *parent = top->parent;\n\n                    switch (parent->type) {\n                    case json_object:\n\n                        parent->u.object.values\n                        [parent->u.object.length].value = top;\n\n                        break;\n\n                    case json_array:\n\n                        parent->u.array.values\n                        [parent->u.array.length] = top;\n\n                        break;\n\n                    default:\n                        break;\n                    }\n                }\n\n                if ((++top->parent->u.array.length) > state.uint_max) {\n                    goto e_overflow;\n                }\n\n                top = top->parent;\n\n                continue;\n            }\n        }\n\n        alloc = root;\n    }\n\n    return root;\n\ne_unknown_value:\n\n    sprintf(error, \"%d:%d: Unknown value\", cur_line, e_off);\n    goto e_failed;\n\ne_alloc_failure:\n\n    strcpy(error, \"Memory allocation failure\");\n    goto e_failed;\n\ne_overflow:\n\n    sprintf(error, \"%d:%d: Too long (caught overflow)\", cur_line, e_off);\n    goto e_failed;\n\ne_failed:\n\n    if (error_buf) {\n        if (*error) {\n            strcpy(error_buf, error);\n        } else {\n            strcpy(error_buf, \"Unknown error\");\n        }\n    }\n\n    if (state.first_pass) {\n        alloc = root;\n    }\n\n    while (alloc) {\n        top = alloc->_reserved.next_alloc;\n        state.settings.mem_free(alloc, state.settings.user_data);\n        alloc = top;\n    }\n\n    if (!state.first_pass) {\n        json_value_free_ex(&state.settings, root);\n    }\n\n    return 0;\n}\n\njson_value *\njson_parse(const json_char *json, size_t length)\n{\n    json_settings settings = { 0UL, 0, NULL, NULL, NULL };\n    return json_parse_ex(&settings, json, length, 0);\n}\n\nvoid\njson_value_free_ex(json_settings *settings, json_value *value)\n{\n    json_value *cur_value;\n\n    if (!value) {\n        return;\n    }\n\n    value->parent = 0;\n\n    while (value) {\n        switch (value->type) {\n        case json_array:\n\n            if (!value->u.array.length) {\n                settings->mem_free(value->u.array.values, settings->user_data);\n                break;\n            }\n\n            value = value->u.array.values[--value->u.array.length];\n            continue;\n\n        case json_object:\n\n            if (!value->u.object.length) {\n                settings->mem_free(value->u.object.values, settings->user_data);\n                break;\n            }\n\n            value = value->u.object.values[--value->u.object.length].value;\n            continue;\n\n        case json_string:\n\n            settings->mem_free(value->u.string.ptr, settings->user_data);\n            break;\n\n        default:\n            break;\n        }\n\n        cur_value = value;\n        value     = value->parent;\n        settings->mem_free(cur_value, settings->user_data);\n    }\n}\n\nvoid\njson_value_free(json_value *value)\n{\n    json_settings settings = { 0UL, 0, NULL, NULL, NULL };\n    settings.mem_free = default_free;\n    json_value_free_ex(&settings, value);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/json.h",
    "content": "/* vim: set et ts=3 sw=3 sts=3 ft=c:\n *\n * Copyright (C) 2012, 2013, 2014 James McLaughlin et al.  All rights reserved.\n * https://github.com/udp/json-parser\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *   notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#ifndef _JSON_H\n#define _JSON_H\n\n#ifndef json_char\n#define json_char char\n#endif\n\n#ifndef json_int_t\n#ifndef _MSC_VER\n#include <inttypes.h>\n#define json_int_t int64_t\n#else\n#define json_int_t __int64\n#endif\n#endif\n\n#include <stdlib.h>\n\n#ifdef __cplusplus\n\n#include <string.h>\n\nextern \"C\"\n{\n#endif\n\ntypedef struct {\n    unsigned long max_memory;\n    int settings;\n\n    /* Custom allocator support (leave null to use malloc/free)\n     */\n\n    void * (*mem_alloc)(size_t, int zero, void *user_data);\n    void (*mem_free)(void *, void *user_data);\n\n    void *user_data;       /* will be passed to mem_alloc and mem_free */\n} json_settings;\n\n#define json_enable_comments  0x01\n\ntypedef enum {\n    json_none,\n    json_object,\n    json_array,\n    json_integer,\n    json_double,\n    json_string,\n    json_boolean,\n    json_null\n} json_type;\n\nextern const struct _json_value json_value_none;\n\ntypedef struct _json_value {\n    struct _json_value *parent;\n\n    json_type type;\n\n    union {\n        int boolean;\n        json_int_t integer;\n        double dbl;\n\n        struct {\n            unsigned int length;\n            json_char *ptr;      /* null terminated */\n        } string;\n\n        struct {\n            unsigned int length;\n\n            struct {\n                json_char *name;\n                unsigned int name_length;\n\n                struct _json_value *value;\n            } *values;\n\n#if defined(__cplusplus) && __cplusplus >= 201103L\n            decltype(values) begin() const\n            {\n                return values;\n            }\n            decltype(values) end() const\n            {\n                return values + length;\n            }\n#endif\n        } object;\n\n        struct {\n            unsigned int length;\n            struct _json_value **values;\n\n#if defined(__cplusplus) && __cplusplus >= 201103L\n            decltype(values) begin() const\n            {\n                return values;\n            }\n            decltype(values) end() const\n            {\n                return values + length;\n            }\n#endif\n        } array;\n    } u;\n\n    union {\n        struct _json_value *next_alloc;\n        void *object_mem;\n    } _reserved;\n\n    /* Some C++ operator sugar */\n\n#ifdef __cplusplus\n\npublic:\n\n    inline _json_value(){\n        memset(this, 0, sizeof(_json_value));\n    }\n\n    inline const struct _json_value &operator [] (int index) const {\n        if (type != json_array || index < 0\n            || ((unsigned int)index) >= u.array.length) {\n            return json_value_none;\n        }\n\n        return *u.array.values[index];\n    }\n\n    inline const struct _json_value &operator [] (const char *index) const {\n        if (type != json_object) {\n            return json_value_none;\n        }\n\n        for (unsigned int i = 0; i < u.object.length; ++i)\n            if (!strcmp(u.object.values[i].name, index)) {\n                return *u.object.values[i].value;\n            }\n\n        return json_value_none;\n    }\n\n    inline operator const char * () const\n    {\n        switch (type) {\n        case json_string:\n            return u.string.ptr;\n\n        default:\n            return \"\";\n        }\n    }\n\n    inline operator\n    json_int_t() const\n    {\n        switch (type) {\n        case json_integer:\n            return u.integer;\n\n        case json_double:\n            return (json_int_t)u.dbl;\n\n        default:\n            return 0;\n        }\n    }\n\n    inline operator\n    bool() const\n    {\n        if (type != json_boolean) {\n            return false;\n        }\n\n        return u.boolean != 0;\n    }\n\n    inline operator double () const\n    {\n        switch (type) {\n        case json_integer:\n            return (double)u.integer;\n\n        case json_double:\n            return u.dbl;\n\n        default:\n            return 0;\n        }\n    }\n\n#endif\n} json_value;\n\njson_value *json_parse(const json_char *json,\n                       size_t length);\n\n#define json_error_max 128\njson_value *json_parse_ex(json_settings *settings,\n                          const json_char *json,\n                          size_t length,\n                          char *error);\n\nvoid json_value_free(json_value *);\n\n/* Not usually necessary, unless you used a custom mem_alloc and now want to\n * use a custom mem_free.\n */\nvoid json_value_free_ex(json_settings *settings,\n                        json_value *);\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/local.c",
    "content": "/*\r\n * local.c - Setup a socks5 proxy through remote shadowsocks server\r\n *\r\n * Copyright (C) 2013 - 2015, Max Lv <max.c.lv@gmail.com>\r\n *\r\n * This file is part of the shadowsocks-libev.\r\n *\r\n * shadowsocks-libev is free software; you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation; either version 3 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * shadowsocks-libev is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with shadowsocks-libev; see the file COPYING. If not, see\r\n * <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#ifdef HAVE_CONFIG_H\r\n\r\n#include \"config.h\"\r\n\r\n#endif\r\n\r\n#include <sys/stat.h>\r\n#include <sys/types.h>\r\n#include <fcntl.h>\r\n#include <locale.h>\r\n#include <signal.h>\r\n#include <string.h>\r\n#include <strings.h>\r\n#include <unistd.h>\r\n#include <getopt.h>\r\n\r\n#ifndef __MINGW32__\r\n#include <errno.h>\r\n#include <arpa/inet.h>\r\n#include <netdb.h>\r\n#include <netinet/in.h>\r\n#include <pthread.h>\r\n#endif\r\n\r\n#ifdef LIB_ONLY\r\n\r\n#include <pthread.h>\r\n#include \"shadowsocks.h\"\r\n\r\n#endif\r\n\r\n#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_NET_IF_H) && defined(__linux__)\r\n#include <net/if.h>\r\n#include <sys/ioctl.h>\r\n#define SET_INTERFACE\r\n#endif\r\n\r\n#include <libcork/core.h>\r\n#include <udns.h>\r\n\r\n#ifdef __MINGW32__\r\n\r\n#include \"win32.h\"\r\n\r\n#endif\r\n\r\n#include \"netutils.h\"\r\n#include \"utils.h\"\r\n#include \"socks5.h\"\r\n#include \"acl.h\"\r\n#include \"http.h\"\r\n#include \"tls.h\"\r\n#include \"local.h\"\r\n\r\n#ifndef LIB_ONLY\r\n#ifdef __APPLE__\r\n#include <AvailabilityMacros.h>\r\n#if defined(MAC_OS_X_VERSION_10_10) && MAC_OS_X_VERSION_MIN_REQUIRED >= MAC_OS_X_VERSION_10_10\r\n#include <launch.h>\r\n#define HAVE_LAUNCHD\r\n#endif\r\n#endif\r\n#endif\r\n\r\n#ifndef EAGAIN\r\n#define EAGAIN EWOULDBLOCK\r\n#endif\r\n\r\n#ifndef EWOULDBLOCK\r\n#define EWOULDBLOCK EAGAIN\r\n#endif\r\n\r\n#ifndef BUF_SIZE\r\n#define BUF_SIZE 2048\r\n#endif\r\n\r\nint verbose = 0;\r\nint keep_resolving = 1;\r\n\r\n#ifdef ANDROID\r\nint log_tx_rx  = 0;\r\nint vpn        = 0;\r\nuint64_t tx    = 0;\r\nuint64_t rx    = 0;\r\nev_tstamp last = 0;\r\nchar *prefix;\r\n#endif\r\n\r\n#include \"includeobfs.h\" // I don't want to modify makefile\r\n#include \"jconf.h\"\r\n#include \"obfs/obfs.h\"\r\n\r\nstatic int acl = 0;\r\nstatic int mode = TCP_ONLY;\r\nstatic int ipv6first = 0;\r\n\r\nstatic int fast_open = 0;\r\n#ifdef HAVE_SETRLIMIT\r\n#ifndef LIB_ONLY\r\nstatic int nofile = 0;\r\n#endif\r\n#endif\r\n\r\nstatic void server_recv_cb(EV_P_ ev_io *w, int revents);\r\n\r\nstatic void server_send_cb(EV_P_ ev_io *w, int revents);\r\n\r\nstatic void remote_recv_cb(EV_P_ ev_io *w, int revents);\r\n\r\nstatic void remote_send_cb(EV_P_ ev_io *w, int revents);\r\n\r\nstatic void accept_cb(EV_P_ ev_io *w, int revents);\r\n\r\nstatic void signal_cb(EV_P_ ev_signal *w, int revents);\r\n\r\nstatic int create_and_bind(const char *addr, const char *port);\r\n\r\n#ifdef HAVE_LAUNCHD\r\nstatic int launch_or_create(const char *addr, const char *port);\r\n#endif\r\n\r\nstatic remote_t *create_remote(listen_ctx_t *listener, struct sockaddr *addr);\r\n\r\nstatic void free_remote(remote_t *remote);\r\n\r\nstatic void close_and_free_remote(EV_P_ remote_t *remote);\r\n\r\nstatic void free_server(server_t *server);\r\n\r\nstatic void close_and_free_server(EV_P_ server_t *server);\r\n\r\nstatic remote_t *new_remote(int fd, int timeout);\r\n\r\nstatic server_t *new_server(int fd, listen_ctx_t *profile);\r\n\r\nstatic struct cork_dllist inactive_profiles;\r\nstatic listen_ctx_t *current_profile;\r\nstatic struct cork_dllist all_connections;\r\n\r\n#ifndef __MINGW32__\r\nint\r\nsetnonblocking(int fd)\r\n{\r\n    int flags;\r\n    if (-1 == (flags = fcntl(fd, F_GETFL, 0))) {\r\n        flags = 0;\r\n    }\r\n    return fcntl(fd, F_SETFL, flags | O_NONBLOCK);\r\n}\r\n\r\n#endif\r\n\r\nvoid\r\nev_io_remote_send(EV_P_ server_t *server, remote_t *remote) {\r\n    ev_io_stop(EV_A_ &remote->send_ctx->io);\r\n    ev_io_start(EV_A_ &server->recv_ctx->io);\r\n}\r\n\r\nvoid\r\nev_io_remote_recv(EV_P_ server_t *server, remote_t *remote) {\r\n    ev_io_stop(EV_A_ &remote->recv_ctx->io);\r\n    ev_io_start(EV_A_ &server->send_ctx->io);\r\n}\r\n\r\nvoid\r\nev_io_server_send(EV_P_ server_t *server, remote_t *remote) {\r\n    ev_io_stop(EV_A_ &server->send_ctx->io);\r\n    ev_io_start(EV_A_ &remote->recv_ctx->io);\r\n}\r\n\r\nvoid\r\nev_io_server_recv(EV_P_ server_t *server, remote_t *remote) {\r\n    ev_io_stop(EV_A_ &server->recv_ctx->io);\r\n    ev_io_start(EV_A_ &remote->send_ctx->io);\r\n}\r\n\r\nint\r\ncreate_and_bind(const char *addr, const char *port) {\r\n    struct addrinfo hints;\r\n    struct addrinfo *result, *rp;\r\n    int s, listen_sock;\r\n\r\n    memset(&hints, 0, sizeof(struct addrinfo));\r\n    hints.ai_family = AF_UNSPEC;   /* Return IPv4 and IPv6 choices */\r\n    hints.ai_socktype = SOCK_STREAM; /* We want a TCP socket */\r\n\r\n    s = getaddrinfo(addr, port, &hints, &result);\r\n    if (s != 0) {\r\n        LOGI(\"getaddrinfo: %s\", gai_strerror(s));\r\n        return -1;\r\n    }\r\n\r\n    if (result == NULL) {\r\n        LOGE(\"Could not bind\");\r\n        return -1;\r\n    }\r\n\r\n    for (rp = result; rp != NULL; rp = rp->ai_next) {\r\n        listen_sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);\r\n        if (listen_sock == -1) {\r\n            continue;\r\n        }\r\n\r\n        int opt = 1;\r\n        setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));\r\n#ifdef SO_NOSIGPIPE\r\n        setsockopt(listen_sock, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\r\n#endif\r\n        int err = set_reuseport(listen_sock);\r\n        if (err == 0) {\r\n            LOGI(\"tcp port reuse enabled\");\r\n        }\r\n\r\n        s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);\r\n        if (s == 0) {\r\n            /* We managed to bind successfully! */\r\n            break;\r\n        } else {\r\n            ERROR(\"bind\");\r\n        }\r\n\r\n        close(listen_sock);\r\n        listen_sock = -1;\r\n    }\r\n\r\n    freeaddrinfo(result);\r\n\r\n    return listen_sock;\r\n}\r\n\r\n#ifdef HAVE_LAUNCHD\r\nint\r\nlaunch_or_create(const char *addr, const char *port)\r\n{\r\n    int *fds;\r\n    size_t cnt;\r\n    int error = launch_activate_socket(\"Listeners\", &fds, &cnt);\r\n    if (error == 0) {\r\n        if (cnt == 1) {\r\n            return fds[0];\r\n        } else {\r\n            FATAL(\"please don't specify multi entry\");\r\n        }\r\n    } else if (error == ESRCH || error == ENOENT) {\r\n        /* ESRCH:  The calling process is not managed by launchd(8).\r\n         * ENOENT: The socket name specified does not exist\r\n         *          in the caller's launchd.plist(5).\r\n         */\r\n        if (port == NULL) {\r\n            usage();\r\n            exit(EXIT_FAILURE);\r\n        }\r\n        return create_and_bind(addr, port);\r\n    } else {\r\n        FATAL(\"launch_activate_socket() error\");\r\n    }\r\n    return -1;\r\n}\r\n#endif\r\n\r\nstatic void\r\nfree_connections(struct ev_loop *loop) {\r\n    struct cork_dllist_item *curr, *next;\r\n    cork_dllist_foreach_void(&all_connections, curr, next) {\r\n        server_t *server = cork_container_of(curr, server_t, entries_all);\r\n        remote_t *remote = server->remote;\r\n        close_and_free_remote(loop, remote);\r\n        close_and_free_server(loop, server);\r\n    }\r\n}\r\n\r\nstatic void\r\nserver_recv_cb(EV_P_ ev_io *w, int revents) {\r\n    server_ctx_t *server_recv_ctx = (server_ctx_t *) w;\r\n    server_t *server = server_recv_ctx->server;\r\n    remote_t *remote = server->remote;\r\n    buffer_t *buf;\r\n    ssize_t r;\r\n\r\n    if (remote == NULL) {\r\n        buf = server->buf;\r\n    } else {\r\n        buf = remote->buf;\r\n    }\r\n\r\n    r = recv(server->fd, buf->array + buf->len, BUF_SIZE - buf->len, 0);\r\n\r\n    if (r == 0) {\r\n        // connection closed\r\n        close_and_free_remote(EV_A_ remote);\r\n        close_and_free_server(EV_A_ server);\r\n        return;\r\n    } else if (r == -1) {\r\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\r\n            // no data\r\n            // continue to wait for recv\r\n            return;\r\n        } else {\r\n            if (verbose)\r\n                ERROR(\"server_recv_cb_recv\");\r\n            close_and_free_remote(EV_A_ remote);\r\n            close_and_free_server(EV_A_ server);\r\n            return;\r\n        }\r\n    }\r\n\r\n    buf->len += r;\r\n\r\n    if (server->stage == STAGE_INIT) {\r\n        char *host = server->listener->tunnel_addr.host;\r\n        char *port = server->listener->tunnel_addr.port;\r\n        if (host && port) {\r\n            server->stage = STAGE_PARSE;\r\n            int addr_len = strlen(host);\r\n            int header_len = addr_len + 3 + 4;\r\n            int port_num = atoi(port);\r\n            memmove(buf->array + header_len, buf->array, buf->len);\r\n            buf->len += header_len;\r\n            buf->array[0] = 5;\r\n            buf->array[1] = 1;\r\n            buf->array[2] = 0;\r\n            buf->array[3] = 3;\r\n            buf->array[4] = addr_len;\r\n            memcpy(buf->array + 5, host, addr_len);\r\n            buf->array[addr_len + 5] = port_num >> 8;\r\n            buf->array[addr_len + 6] = port_num;\r\n        }\r\n    }\r\n    while (1) {\r\n        // local socks5 server\r\n        if (server->stage == STAGE_STREAM) {\r\n            if (remote == NULL) {\r\n                LOGE(\"invalid remote\");\r\n                close_and_free_server(EV_A_ server);\r\n                return;\r\n            }\r\n\r\n            // insert shadowsocks header\r\n            if (!remote->direct) {\r\n                server_def_t *server_env = server->server_env;\r\n                // SSR beg\r\n                if (server_env->protocol_plugin) {\r\n                    obfs_class *protocol_plugin = server_env->protocol_plugin;\r\n                    if (protocol_plugin->client_pre_encrypt) {\r\n                        remote->buf->len = (size_t) protocol_plugin->client_pre_encrypt(\r\n                                server->protocol,\r\n                                &remote->buf->array,\r\n                                (int) remote->buf->len,\r\n                                &remote->buf->capacity\r\n                        );\r\n                    }\r\n                }\r\n                int err = ss_encrypt(&server_env->cipher, remote->buf, server->e_ctx, BUF_SIZE);\r\n\r\n                if (err) {\r\n                    LOGE(\"server invalid password or cipher\");\r\n                    close_and_free_remote(EV_A_ remote);\r\n                    close_and_free_server(EV_A_ server);\r\n                    return;\r\n                }\r\n\r\n                if (server_env->obfs_plugin) {\r\n                    obfs_class *obfs_plugin = server_env->obfs_plugin;\r\n                    if (obfs_plugin->client_encode) {\r\n                        remote->buf->len = (size_t) obfs_plugin->client_encode(\r\n                                server->obfs,\r\n                                &remote->buf->array,\r\n                                (int) remote->buf->len,\r\n                                &remote->buf->capacity\r\n                        );\r\n                    }\r\n                }\r\n                // SSR end\r\n#ifdef ANDROID\r\n                if (log_tx_rx)\r\n                    tx += buf->len;\r\n#endif\r\n            }\r\n\r\n            if (!remote->send_ctx->connected) {\r\n#ifdef ANDROID\r\n                if (vpn) {\r\n                    int not_protect = 0;\r\n                    if (remote->direct_addr.addr.ss_family == AF_INET) {\r\n                        struct sockaddr_in *s = (struct sockaddr_in *)&remote->direct_addr.addr;\r\n                        if (s->sin_addr.s_addr == inet_addr(\"127.0.0.1\"))\r\n                            not_protect = 1;\r\n                    }\r\n                    if (!not_protect) {\r\n                        if (protect_socket(remote->fd) == -1) {\r\n                            ERROR(\"protect_socket\");\r\n                            close_and_free_remote(EV_A_ remote);\r\n                            close_and_free_server(EV_A_ server);\r\n                            return;\r\n                        }\r\n                    }\r\n                }\r\n#endif\r\n\r\n                remote->buf->idx = 0;\r\n\r\n                if (!fast_open || remote->direct) {\r\n                    // connecting, wait until connected\r\n                    int r = connect(\r\n                            remote->fd,\r\n                            (struct sockaddr *) &(remote->direct_addr.addr),\r\n                            remote->direct_addr.addr_len\r\n                    );\r\n\r\n                    if (r == -1 && errno != CONNECT_IN_PROGRESS) {\r\n                        ERROR(\"connect\");\r\n                        close_and_free_remote(EV_A_ remote);\r\n                        close_and_free_server(EV_A_ server);\r\n                        return;\r\n                    }\r\n\r\n                    // wait on remote connected event\r\n                    ev_io_server_recv(EV_A_ server, remote);\r\n                    ev_timer_start(EV_A_ &remote->send_ctx->watcher);\r\n                } else {\r\n#ifdef TCP_FASTOPEN\r\n#ifdef __APPLE__\r\n                    ((struct sockaddr_in *)&(remote->direct_addr.addr))->sin_len = sizeof(struct sockaddr_in);\r\n                    sa_endpoints_t endpoints;\r\n                    memset((char *)&endpoints, 0, sizeof(endpoints));\r\n                    endpoints.sae_dstaddr    = (struct sockaddr *)&(remote->direct_addr.addr);\r\n                    endpoints.sae_dstaddrlen = remote->direct_addr.addr_len;\r\n\r\n                    int s = connectx(remote->fd, &endpoints, SAE_ASSOCID_ANY,\r\n                                     CONNECT_RESUME_ON_READ_WRITE | CONNECT_DATA_IDEMPOTENT,\r\n                                     NULL, 0, NULL, NULL);\r\n                    if (s == 0) {\r\n                        s = send(remote->fd, remote->buf->array, remote->buf->len, 0);\r\n                    }\r\n#else\r\n                    int s = sendto(remote->fd, remote->buf->array, remote->buf->len, MSG_FASTOPEN,\r\n                                   (struct sockaddr *)&(remote->direct_addr.addr), remote->direct_addr.addr_len);\r\n#endif\r\n                    if (s == -1) {\r\n                        if (errno == CONNECT_IN_PROGRESS) {\r\n                            // in progress, wait until connected\r\n                            remote->buf->idx = 0;\r\n                            ev_io_server_recv(EV_A_ server, remote);\r\n                            return;\r\n                        } else {\r\n                            ERROR(\"sendto\");\r\n                            if (errno == ENOTCONN) {\r\n                                LOGE(\"fast open is not supported on this platform\");\r\n                                // just turn it off\r\n                                fast_open = 0;\r\n                            }\r\n                            close_and_free_remote(EV_A_ remote);\r\n                            close_and_free_server(EV_A_ server);\r\n                            return;\r\n                        }\r\n                    } else if (s < (int)(remote->buf->len)) {\r\n                        remote->buf->len -= s;\r\n                        remote->buf->idx  = s;\r\n\r\n                        ev_io_server_recv(EV_A_ server, remote);\r\n                        ev_timer_start(EV_A_ & remote->send_ctx->watcher);\r\n                        return;\r\n                    } else {\r\n                        // Just connected\r\n                        remote->buf->idx = 0;\r\n                        remote->buf->len = 0;\r\n#ifdef __APPLE__\r\n                        ev_io_server_recv(EV_A_ server, remote);\r\n                        ev_timer_start(EV_A_ & remote->send_ctx->watcher);\r\n#else\r\n                        remote->send_ctx->connected = 1;\r\n                        ev_timer_stop(EV_A_ & remote->send_ctx->watcher);\r\n                        ev_timer_start(EV_A_ & remote->recv_ctx->watcher);\r\n                        ev_io_start(EV_A_ & remote->recv_ctx->io);\r\n                        return;\r\n#endif\r\n                    }\r\n#else\r\n                    // if TCP_FASTOPEN is not defined, fast_open will always be 0\r\n                    LOGE(\"can't come here\");\r\n                    exit(1);\r\n#endif\r\n                }\r\n            } else {\r\n                if (r > 0 && remote->buf->len == 0) {\r\n                    remote->buf->idx = 0;\r\n                    ev_io_stop(EV_A_ &server_recv_ctx->io);\r\n                    return;\r\n                }\r\n                int s = send(remote->fd, remote->buf->array, remote->buf->len, 0);\r\n                if (s == -1) {\r\n                    if (errno == EAGAIN || errno == EWOULDBLOCK) {\r\n                        // no data, wait for send\r\n                        remote->buf->idx = 0;\r\n                        ev_io_server_recv(EV_A_ server, remote);\r\n                        return;\r\n                    } else {\r\n                        ERROR(\"server_recv_cb_send\");\r\n                        close_and_free_remote(EV_A_ remote);\r\n                        close_and_free_server(EV_A_ server);\r\n                        return;\r\n                    }\r\n                } else if (s < (int) (remote->buf->len)) {\r\n                    remote->buf->len -= s;\r\n                    remote->buf->idx = s;\r\n                    ev_io_server_recv(EV_A_ server, remote);\r\n                    return;\r\n                } else {\r\n                    remote->buf->idx = 0;\r\n                    remote->buf->len = 0;\r\n                }\r\n            }\r\n\r\n            // all processed\r\n            return;\r\n        } else if (server->stage == STAGE_INIT) {\r\n            struct method_select_response response;\r\n            response.ver = SVERSION;\r\n            response.method = 0;\r\n            char *send_buf = (char *) &response;\r\n            send(server->fd, send_buf, sizeof(response), 0);\r\n            server->stage = STAGE_HANDSHAKE;\r\n\r\n            int off = (buf->array[1] & 0xff) + 2;\r\n            if (buf->array[0] == 0x05 && off < (int) (buf->len)) {\r\n                memmove(buf->array, buf->array + off, buf->len - off);\r\n                buf->len -= off;\r\n                continue;\r\n            }\r\n\r\n            buf->len = 0;\r\n\r\n            return;\r\n        } else if (server->stage == STAGE_HANDSHAKE || server->stage == STAGE_PARSE) {\r\n            struct socks5_request *request = (struct socks5_request *) buf->array;\r\n            struct sockaddr_in sock_addr;\r\n            memset(&sock_addr, 0, sizeof(sock_addr));\r\n\r\n            int udp_assc = 0;\r\n\r\n            if (request->cmd == 3) {\r\n                udp_assc = 1;\r\n                socklen_t addr_len = sizeof(sock_addr);\r\n                getsockname(server->fd, (struct sockaddr *) &sock_addr,\r\n                            &addr_len);\r\n                if (verbose) {\r\n                    LOGI(\"udp assc request accepted\");\r\n                }\r\n            } else if (request->cmd != 1) {\r\n                LOGE(\"unsupported cmd: %d\", request->cmd);\r\n                struct socks5_response response;\r\n                response.ver = SVERSION;\r\n                response.rep = CMD_NOT_SUPPORTED;\r\n                response.rsv = 0;\r\n                response.atyp = 1;\r\n                char *send_buf = (char *) &response;\r\n                send(server->fd, send_buf, 4, 0);\r\n                close_and_free_remote(EV_A_ remote);\r\n                close_and_free_server(EV_A_ server);\r\n                return;\r\n            }\r\n\r\n            // Fake reply\r\n            if (server->stage == STAGE_HANDSHAKE) {\r\n                struct socks5_response response;\r\n                response.ver = SVERSION;\r\n                response.rep = 0;\r\n                response.rsv = 0;\r\n                response.atyp = 1;\r\n\r\n                buffer_t resp_to_send;\r\n                buffer_t *resp_buf = &resp_to_send;\r\n                balloc(resp_buf, BUF_SIZE);\r\n\r\n                memcpy(resp_buf->array, &response, sizeof(struct socks5_response));\r\n                memcpy(resp_buf->array + sizeof(struct socks5_response),\r\n                       &sock_addr.sin_addr, sizeof(sock_addr.sin_addr));\r\n                memcpy(resp_buf->array + sizeof(struct socks5_response) +\r\n                       sizeof(sock_addr.sin_addr),\r\n                       &sock_addr.sin_port, sizeof(sock_addr.sin_port));\r\n\r\n                int reply_size = sizeof(struct socks5_response) +\r\n                                 sizeof(sock_addr.sin_addr) + sizeof(sock_addr.sin_port);\r\n\r\n                int s = send(server->fd, resp_buf->array, reply_size, 0);\r\n\r\n                bfree(resp_buf);\r\n\r\n                if (s < reply_size) {\r\n                    LOGE(\"failed to send fake reply\");\r\n                    close_and_free_remote(EV_A_ remote);\r\n                    close_and_free_server(EV_A_ server);\r\n                    return;\r\n                }\r\n                if (udp_assc) {\r\n                    // Wait until client closes the connection\r\n                    return;\r\n                }\r\n            }\r\n\r\n            char host[257], ip[INET6_ADDRSTRLEN], port[16];\r\n\r\n            buffer_t ss_addr_to_send;\r\n            buffer_t *abuf = &ss_addr_to_send;\r\n            balloc(abuf, BUF_SIZE);\r\n\r\n            abuf->array[abuf->len++] = request->atyp;\r\n            int atyp = request->atyp;\r\n\r\n            // get remote addr and port\r\n            if (atyp == 1) {\r\n                // IP V4\r\n                size_t in_addr_len = sizeof(struct in_addr);\r\n                memcpy(abuf->array + abuf->len, buf->array + 4, in_addr_len + 2);\r\n                abuf->len += in_addr_len + 2;\r\n\r\n                if (acl || verbose) {\r\n                    uint16_t p = ntohs(*(uint16_t *) (buf->array + 4 + in_addr_len));\r\n                    dns_ntop(AF_INET,\r\n                             (const void *) (buf->array + 4),\r\n                             ip,\r\n                             INET_ADDRSTRLEN\r\n                    );\r\n                    sprintf(port, \"%d\", p);\r\n                }\r\n            } else if (atyp == 3) {\r\n                // Domain name\r\n                uint8_t name_len = *(uint8_t *) (buf->array + 4);\r\n                abuf->array[abuf->len++] = name_len;\r\n                memcpy(abuf->array + abuf->len, buf->array + 4 + 1, name_len + 2);\r\n                abuf->len += name_len + 2;\r\n\r\n                if (acl || verbose) {\r\n                    uint16_t p = ntohs(*(uint16_t *) (buf->array + 4 + 1 + name_len));\r\n                    memcpy(host, buf->array + 4 + 1, name_len);\r\n                    host[name_len] = '\\0';\r\n                    sprintf(port, \"%d\", p);\r\n                }\r\n            } else if (atyp == 4) {\r\n                // IP V6\r\n                size_t in6_addr_len = sizeof(struct in6_addr);\r\n                memcpy(abuf->array + abuf->len, buf->array + 4, in6_addr_len + 2);\r\n                abuf->len += in6_addr_len + 2;\r\n\r\n                if (acl || verbose) {\r\n                    uint16_t p = ntohs(*(uint16_t *) (buf->array + 4 + in6_addr_len));\r\n                    dns_ntop(AF_INET6,\r\n                             (const void *) (buf->array + 4),\r\n                             ip,\r\n                             INET6_ADDRSTRLEN\r\n                    );\r\n                    sprintf(port, \"%d\", p);\r\n                }\r\n            } else {\r\n                bfree(abuf);\r\n                LOGE(\"unsupported addrtype: %d\", request->atyp);\r\n                close_and_free_remote(EV_A_ remote);\r\n                close_and_free_server(EV_A_ server);\r\n                return;\r\n            }\r\n\r\n            size_t abuf_len = abuf->len;\r\n            int sni_detected = 0;\r\n\r\n            if (atyp == 1 || atyp == 4) {\r\n                char *hostname;\r\n                uint16_t p = ntohs(*(uint16_t *) (abuf->array + abuf->len - 2));\r\n                int ret = 0;\r\n                if (p == http_protocol->default_port)\r\n                    ret = http_protocol->parse_packet(buf->array + 3 + abuf->len,\r\n                                                      buf->len - 3 - abuf->len, &hostname);\r\n                else if (p == tls_protocol->default_port)\r\n                    ret = tls_protocol->parse_packet(buf->array + 3 + abuf->len,\r\n                                                     buf->len - 3 - abuf->len, &hostname);\r\n                if (ret == -1 && buf->len < BUF_SIZE) {\r\n                    server->stage = STAGE_PARSE;\r\n                    bfree(abuf);\r\n                    return;\r\n                } else if (ret > 0) {\r\n                    sni_detected = 1;\r\n\r\n                    // Reconstruct address buffer\r\n                    abuf->len = 0;\r\n                    abuf->array[abuf->len++] = 3;\r\n                    abuf->array[abuf->len++] = ret;\r\n                    memcpy(abuf->array + abuf->len, hostname, ret);\r\n                    abuf->len += ret;\r\n                    p = htons(p);\r\n                    memcpy(abuf->array + abuf->len, &p, 2);\r\n                    abuf->len += 2;\r\n\r\n                    if (acl || verbose) {\r\n                        memcpy(host, hostname, ret);\r\n                        host[ret] = '\\0';\r\n                    }\r\n\r\n                    ss_free(hostname);\r\n                } else {\r\n                    strncpy(host, ip, sizeof(ip));\r\n                }\r\n            }\r\n\r\n            server->stage = STAGE_STREAM;\r\n\r\n            buf->len -= (3 + abuf_len);\r\n            if (buf->len > 0) {\r\n                memmove(buf->array, buf->array + 3 + abuf_len, buf->len);\r\n            }\r\n\r\n            if (acl) {\r\n                if (outbound_block_match_host(host) == 1) {\r\n                    if (verbose)\r\n                        LOGI(\"outbound blocked %s\", host);\r\n                    close_and_free_remote(EV_A_ remote);\r\n                    close_and_free_server(EV_A_ server);\r\n                    return;\r\n                }\r\n\r\n                int host_match = acl_match_host(host);\r\n                int bypass = 0;\r\n                int resolved = 0;\r\n                struct sockaddr_storage storage;\r\n                memset(&storage, 0, sizeof(struct sockaddr_storage));\r\n                int err;\r\n\r\n                if (verbose)\r\n                    LOGI(\"acl_match_host %s result %d\", host, host_match);\r\n                if (host_match > 0)\r\n                    bypass = 0;                 // bypass hostnames in black list\r\n                else if (host_match < 0)\r\n                    bypass = 1;                 // proxy hostnames in white list\r\n                else {\r\n#ifndef ANDROID\r\n                    if (atyp == 3) {            // resolve domain so we can bypass domain with geoip\r\n                        err = get_sockaddr(host, port, &storage, 0, ipv6first);\r\n                        if (err != -1) {\r\n                            resolved = 1;\r\n                            switch (((struct sockaddr *) &storage)->sa_family) {\r\n                                case AF_INET: {\r\n                                    struct sockaddr_in *addr_in = (struct sockaddr_in *) &storage;\r\n                                    dns_ntop(AF_INET, &(addr_in->sin_addr), ip, INET_ADDRSTRLEN);\r\n                                    break;\r\n                                }\r\n                                case AF_INET6: {\r\n                                    struct sockaddr_in6 *addr_in6 = (struct sockaddr_in6 *) &storage;\r\n                                    dns_ntop(AF_INET6, &(addr_in6->sin6_addr), ip, INET6_ADDRSTRLEN);\r\n                                    break;\r\n                                }\r\n                                default:\r\n                                    break;\r\n                            }\r\n                        }\r\n                    }\r\n#endif\r\n                    if (outbound_block_match_host(ip) == 1) {\r\n                        if (verbose)\r\n                            LOGI(\"outbound blocked %s\", ip);\r\n                        close_and_free_remote(EV_A_ remote);\r\n                        close_and_free_server(EV_A_ server);\r\n                        return;\r\n                    }\r\n\r\n                    int ip_match = acl_match_host(ip);// -1 if IP in white list or 1 if IP in black list\r\n                    if (verbose)\r\n                        LOGI(\"acl_match_host ip %s result %d mode %d\", ip, ip_match, get_acl_mode());\r\n                    if (ip_match < 0)\r\n                        bypass = 1;\r\n                    else if (ip_match > 0)\r\n                        bypass = 0;\r\n                    else\r\n                        bypass = (get_acl_mode() == BLACK_LIST);\r\n                }\r\n\r\n                if (bypass) {\r\n                    if (verbose) {\r\n                        if (sni_detected || atyp == 3)\r\n                            LOGI(\"bypass %s:%s\", host, port);\r\n                        else if (atyp == 1)\r\n                            LOGI(\"bypass %s:%s\", ip, port);\r\n                        else if (atyp == 4)\r\n                            LOGI(\"bypass [%s]:%s\", ip, port);\r\n                    }\r\n                    struct sockaddr_storage storage;\r\n                    memset(&storage, 0, sizeof(struct sockaddr_storage));\r\n                    int err;\r\n#ifndef ANDROID\r\n                    if (atyp == 3 && resolved != 1)\r\n                        err = get_sockaddr(host, port, &storage, 0, ipv6first);\r\n                    else\r\n#endif\r\n                        err = get_sockaddr(ip, port, &storage, 0, ipv6first);\r\n                    if (err != -1) {\r\n                        remote = create_remote(server->listener, (struct sockaddr *) &storage);\r\n                        if (remote != NULL) remote->direct = 1;\r\n                    }\r\n                }\r\n            }\r\n\r\n            // Not match ACL\r\n            if (remote == NULL) {\r\n                // pick a server\r\n                listen_ctx_t *profile = server->listener;\r\n                int index = rand() % profile->server_num;\r\n                server_def_t *server_env = &profile->servers[index];\r\n\r\n                if (verbose) {\r\n                    if (sni_detected || atyp == 3)\r\n                        LOGI(\"connect to %s:%s via %s:%d\", host, port, server_env->host, server_env->port);\r\n                    else if (atyp == 1)\r\n                        LOGI(\"connect to %s:%s via %s:%d\", ip, port, server_env->host, server_env->port);\r\n                    else if (atyp == 4)\r\n                        LOGI(\"connect to [%s]:%s via %s:%d\", ip, port, server_env->host, server_env->port);\r\n                }\r\n\r\n                server->server_env = server_env;\r\n\r\n                remote = create_remote(profile, (struct sockaddr *) server_env->addr);\r\n            }\r\n\r\n            if (remote == NULL) {\r\n                bfree(abuf);\r\n                LOGE(\"invalid remote addr\");\r\n                close_and_free_server(EV_A_ server);\r\n                return;\r\n            }\r\n\r\n            if (!remote->direct) {\r\n                server_def_t *server_env = server->server_env;\r\n\r\n                // expelled from eden\r\n                { cork_dllist_remove(&server->entries); };\r\n                { cork_dllist_add(&server_env->connections, &server->entries); };\r\n\r\n                // init server cipher\r\n                if (server_env->cipher.enc_method > TABLE) {\r\n                    server->e_ctx = ss_malloc(sizeof(struct enc_ctx));\r\n                    server->d_ctx = ss_malloc(sizeof(struct enc_ctx));\r\n                    enc_ctx_init(&server_env->cipher, server->e_ctx, 1);\r\n                    enc_ctx_init(&server_env->cipher, server->d_ctx, 0);\r\n                } else {\r\n                    server->e_ctx = NULL;\r\n                    server->d_ctx = NULL;\r\n                }\r\n                // SSR beg\r\n                server_info _server_info;\r\n                memset(&_server_info, 0, sizeof(server_info));\r\n                if (server_env->hostname)\r\n                    strcpy(_server_info.host, server_env->hostname);\r\n                else\r\n                    strcpy(_server_info.host, server_env->host);\r\n                if (verbose) {\r\n                    LOGI(\"server_info host %s\", _server_info.host);\r\n                }\r\n                _server_info.port = server_env->port;\r\n                _server_info.head_len = get_head_size(ss_addr_to_send.array, 320, 30);\r\n                _server_info.iv = server->e_ctx->evp.iv;\r\n                _server_info.iv_len = enc_get_iv_len(&server_env->cipher);\r\n                _server_info.key = enc_get_key(&server_env->cipher);\r\n                _server_info.key_len = enc_get_key_len(&server_env->cipher);\r\n                _server_info.tcp_mss = 1452;\r\n                _server_info.buffer_size = BUF_SIZE;\r\n                _server_info.cipher_env = &server_env->cipher;\r\n\r\n                _server_info.param = server_env->obfs_param;\r\n                _server_info.g_data = server_env->obfs_global;\r\n\r\n                if (server_env->obfs_plugin) {\r\n                    server->obfs = server_env->obfs_plugin->new_obfs();\r\n                    server_env->obfs_plugin->set_server_info(server->obfs, &_server_info);\r\n                }\r\n\r\n                _server_info.param = server_env->protocol_param;\r\n                _server_info.g_data = server_env->protocol_global;\r\n\r\n                if (server_env->protocol_plugin) {\r\n                    server->protocol = server_env->protocol_plugin->new_obfs();\r\n                    // overhead must count on this\r\n                    _server_info.overhead = (uint16_t)\r\n                            (\r\n                                    (server_env->protocol_plugin ?\r\n                                     server_env->protocol_plugin->get_overhead(server->protocol) : 0)\r\n                                    +\r\n                                    (server_env->obfs_plugin ?\r\n                                     server_env->obfs_plugin->get_overhead(server->obfs) : 0)\r\n                            );\r\n                    server_env->protocol_plugin->set_server_info(server->protocol, &_server_info);\r\n                }\r\n                // SSR end\r\n\r\n                brealloc(remote->buf, buf->len + abuf->len, BUF_SIZE);\r\n                memcpy(remote->buf->array, abuf->array, abuf->len);\r\n                remote->buf->len = buf->len + abuf->len;\r\n\r\n                if (buf->len > 0) {\r\n                    memcpy(remote->buf->array + abuf->len, buf->array, buf->len);\r\n                }\r\n            } else {\r\n                if (buf->len > 0) {\r\n                    memcpy(remote->buf->array, buf->array, buf->len);\r\n                    remote->buf->len = buf->len;\r\n                }\r\n            }\r\n\r\n            server->remote = remote;\r\n            remote->server = server;\r\n\r\n            bfree(abuf);\r\n        }\r\n    }\r\n}\r\n\r\n\r\nstatic void\r\nserver_send_cb(EV_P_ ev_io *w, int revents) {\r\n    server_ctx_t *server_send_ctx = (server_ctx_t *) w;\r\n    server_t *server = server_send_ctx->server;\r\n    remote_t *remote = server->remote;\r\n    if (server->buf->len == 0) {\r\n        // close and free\r\n        close_and_free_remote(EV_A_ remote);\r\n        close_and_free_server(EV_A_ server);\r\n        return;\r\n    } else {\r\n        // has data to send\r\n        ssize_t s = send(server->fd, server->buf->array + server->buf->idx,\r\n                         server->buf->len, 0);\r\n        if (s == -1) {\r\n            if (errno != EAGAIN && errno != EWOULDBLOCK) {\r\n                ERROR(\"server_send_cb_send\");\r\n                close_and_free_remote(EV_A_ remote);\r\n                close_and_free_server(EV_A_ server);\r\n            }\r\n            return;\r\n        } else if (s < (ssize_t) (server->buf->len)) {\r\n            // partly sent, move memory, wait for the next time to send\r\n            server->buf->len -= s;\r\n            server->buf->idx += s;\r\n            return;\r\n        } else {\r\n            // all sent out, wait for reading\r\n            server->buf->len = 0;\r\n            server->buf->idx = 0;\r\n            ev_io_server_send(EV_A_ server, remote);\r\n            return;\r\n        }\r\n    }\r\n}\r\n\r\n#ifdef ANDROID\r\nstatic void\r\nstat_update_cb()\r\n{\r\n    if (log_tx_rx) {\r\n        ev_tstamp now = ev_time();\r\n        if (now - last > 1.0) {\r\n            send_traffic_stat(tx, rx);\r\n            last = now;\r\n        }\r\n    }\r\n}\r\n\r\n#endif\r\n\r\nstatic void\r\nremote_timeout_cb(EV_P_ ev_timer *watcher, int revents) {\r\n    remote_ctx_t *remote_ctx\r\n            = cork_container_of(watcher, remote_ctx_t, watcher);\r\n\r\n    remote_t *remote = remote_ctx->remote;\r\n    server_t *server = remote->server;\r\n\r\n    if (verbose) {\r\n        LOGI(\"TCP connection timeout\");\r\n    }\r\n\r\n    close_and_free_remote(EV_A_ remote);\r\n    close_and_free_server(EV_A_ server);\r\n}\r\n\r\nstatic void\r\nremote_recv_cb(EV_P_ ev_io *w, int revents) {\r\n    remote_ctx_t *remote_recv_ctx = (remote_ctx_t *) w;\r\n    remote_t *remote = remote_recv_ctx->remote;\r\n    server_t *server = remote->server;\r\n    server_def_t *server_env = server->server_env;\r\n\r\n    ev_timer_again(EV_A_ &remote->recv_ctx->watcher);\r\n\r\n#ifdef ANDROID\r\n    stat_update_cb();\r\n#endif\r\n\r\n    ssize_t r = recv(remote->fd, server->buf->array, BUF_SIZE, 0);\r\n\r\n    if (r == 0) {\r\n        // connection closed\r\n        close_and_free_remote(EV_A_ remote);\r\n        close_and_free_server(EV_A_ server);\r\n        return;\r\n    } else if (r == -1) {\r\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\r\n            // no data\r\n            // continue to wait for recv\r\n            return;\r\n        } else {\r\n            ERROR(\"remote_recv_cb_recv\");\r\n            close_and_free_remote(EV_A_ remote);\r\n            close_and_free_server(EV_A_ server);\r\n            return;\r\n        }\r\n    }\r\n\r\n    server->buf->len = r;\r\n\r\n    if (!remote->direct) {\r\n#ifdef ANDROID\r\n        if (log_tx_rx)\r\n            rx += server->buf->len;\r\n#endif\r\n        if (r == 0)\r\n            return;\r\n        // SSR beg\r\n        if (server_env->obfs_plugin) {\r\n            obfs_class *obfs_plugin = server_env->obfs_plugin;\r\n            if (obfs_plugin->client_decode) {\r\n                int needsendback;\r\n                server->buf->len =\r\n                        (size_t) obfs_plugin->client_decode(\r\n                                server->obfs,\r\n                                &server->buf->array,\r\n                                server->buf->len,\r\n                                &server->buf->capacity,\r\n                                &needsendback\r\n                        );\r\n                if ((int) server->buf->len < 0) {\r\n                    LOGE(\"client_decode\");\r\n                    close_and_free_remote(EV_A_ remote);\r\n                    close_and_free_server(EV_A_ server);\r\n                    return;\r\n                }\r\n                if (needsendback) {\r\n                    if (obfs_plugin->client_encode) {\r\n                        remote->buf->len =\r\n                                (size_t) obfs_plugin->client_encode(\r\n                                        server->obfs,\r\n                                        &remote->buf->array,\r\n                                        0,\r\n                                        &remote->buf->capacity\r\n                                );\r\n                        ssize_t s = send(remote->fd, remote->buf->array, remote->buf->len, 0);\r\n                        if (s == -1) {\r\n                            if (errno != EAGAIN && errno != EWOULDBLOCK) {\r\n                                ERROR(\"remote_recv_cb_send\");\r\n                                // close and free\r\n                                close_and_free_remote(EV_A_ remote);\r\n                                close_and_free_server(EV_A_ server);\r\n                            }\r\n                            return;\r\n                        } else if (s < (ssize_t) (remote->buf->len)) {\r\n                            // partly sent, move memory, wait for the next time to send\r\n                            remote->buf->len -= s;\r\n                            remote->buf->idx += s;\r\n                            return;\r\n                        } else {\r\n                            // all sent out, wait for reading\r\n                            remote->buf->len = 0;\r\n                            remote->buf->idx = 0;\r\n                            ev_io_remote_send(EV_A_ server, remote);\r\n                        }\r\n                    }\r\n                }\r\n            }\r\n        }\r\n        if (server->buf->len > 0) {\r\n            int err = ss_decrypt(&server_env->cipher, server->buf, server->d_ctx, BUF_SIZE);\r\n            if (err) {\r\n                LOGE(\"remote invalid password or cipher\");\r\n                close_and_free_remote(EV_A_ remote);\r\n                close_and_free_server(EV_A_ server);\r\n                return;\r\n            }\r\n        }\r\n        if (server_env->protocol_plugin) {\r\n            obfs_class *protocol_plugin = server_env->protocol_plugin;\r\n            if (protocol_plugin->client_post_decrypt) {\r\n                server->buf->len =\r\n                        (size_t) protocol_plugin->client_post_decrypt(\r\n                                server->protocol,\r\n                                &server->buf->array,\r\n                                server->buf->len,\r\n                                &server->buf->capacity\r\n                        );\r\n                if ((int) server->buf->len < 0) {\r\n                    LOGE(\"client_post_decrypt\");\r\n                    close_and_free_remote(EV_A_ remote);\r\n                    close_and_free_server(EV_A_ server);\r\n                    return;\r\n                }\r\n                if (server->buf->len == 0)\r\n                    return;\r\n            }\r\n        }\r\n        // SSR end\r\n    }\r\n\r\n    int s = send(server->fd, server->buf->array, server->buf->len, 0);\r\n\r\n    if (s == -1) {\r\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\r\n            // no data, wait for send\r\n            server->buf->idx = 0;\r\n            ev_io_remote_recv(EV_A_ server, remote);\r\n        } else {\r\n            ERROR(\"remote_recv_cb_send\");\r\n            close_and_free_remote(EV_A_ remote);\r\n            close_and_free_server(EV_A_ server);\r\n        }\r\n    } else if (s < (int) (server->buf->len)) {\r\n        server->buf->len -= s;\r\n        server->buf->idx = s;\r\n        ev_io_remote_recv(EV_A_ server, remote);\r\n    }\r\n}\r\n\r\nstatic void\r\nremote_send_cb(EV_P_ ev_io *w, int revents) {\r\n    remote_ctx_t *remote_send_ctx = (remote_ctx_t *) w;\r\n    remote_t *remote = remote_send_ctx->remote;\r\n    server_t *server = remote->server;\r\n\r\n    if (!remote_send_ctx->connected) {\r\n        int err_no = 0;\r\n        socklen_t len = sizeof err_no;\r\n#ifdef __MINGW32__\r\n        int r = getsockopt(remote->fd, SOL_SOCKET, SO_ERROR, (char *) &err_no, &len);\r\n#else\r\n        int r = getsockopt(remote->fd, SOL_SOCKET, SO_ERROR, &err_no, &len);\r\n#endif\r\n        if (r == 0 && err_no == 0) {\r\n            remote_send_ctx->connected = 1;\r\n            ev_timer_stop(EV_A_ &remote_send_ctx->watcher);\r\n            ev_timer_start(EV_A_ &remote->recv_ctx->watcher);\r\n            ev_io_start(EV_A_ &remote->recv_ctx->io);\r\n\r\n            // no need to send any data\r\n            if (remote->buf->len == 0) {\r\n                ev_io_remote_send(EV_A_ server, remote);\r\n                return;\r\n            }\r\n        } else {\r\n            // not connected\r\n            LOGE(\"getsockopt error code %d %d\", r, err_no);\r\n            ERROR(\"getsockopt\");\r\n            close_and_free_remote(EV_A_ remote);\r\n            close_and_free_server(EV_A_ server);\r\n            return;\r\n        }\r\n    }\r\n\r\n    if (remote->buf->len == 0) {\r\n        // close and free\r\n        close_and_free_remote(EV_A_ remote);\r\n        close_and_free_server(EV_A_ server);\r\n        return;\r\n    } else {\r\n        // has data to send\r\n        ssize_t s = send(remote->fd, remote->buf->array + remote->buf->idx,\r\n                         remote->buf->len, 0);\r\n        if (s == -1) {\r\n            if (errno != EAGAIN && errno != EWOULDBLOCK) {\r\n                ERROR(\"remote_send_cb_send\");\r\n                // close and free\r\n                close_and_free_remote(EV_A_ remote);\r\n                close_and_free_server(EV_A_ server);\r\n            }\r\n            return;\r\n        } else if (s < (ssize_t) (remote->buf->len)) {\r\n            // partly sent, move memory, wait for the next time to send\r\n            remote->buf->len -= s;\r\n            remote->buf->idx += s;\r\n            return;\r\n        } else {\r\n            // all sent out, wait for reading\r\n            remote->buf->len = 0;\r\n            remote->buf->idx = 0;\r\n            ev_io_remote_send(EV_A_ server, remote);\r\n        }\r\n    }\r\n}\r\n\r\nstatic remote_t *\r\nnew_remote(int fd, int timeout) {\r\n    remote_t *remote;\r\n    remote = ss_malloc(sizeof(remote_t));\r\n\r\n    memset(remote, 0, sizeof(remote_t));\r\n\r\n    remote->buf = ss_malloc(sizeof(buffer_t));\r\n    remote->recv_ctx = ss_malloc(sizeof(remote_ctx_t));\r\n    remote->send_ctx = ss_malloc(sizeof(remote_ctx_t));\r\n    balloc(remote->buf, BUF_SIZE);\r\n    memset(remote->recv_ctx, 0, sizeof(remote_ctx_t));\r\n    memset(remote->send_ctx, 0, sizeof(remote_ctx_t));\r\n    remote->recv_ctx->connected = 0;\r\n    remote->send_ctx->connected = 0;\r\n    remote->fd = fd;\r\n    remote->recv_ctx->remote = remote;\r\n    remote->send_ctx->remote = remote;\r\n\r\n    ev_io_init(&remote->recv_ctx->io, remote_recv_cb, fd, EV_READ);\r\n    ev_io_init(&remote->send_ctx->io, remote_send_cb, fd, EV_WRITE);\r\n    ev_timer_init(&remote->send_ctx->watcher, remote_timeout_cb,\r\n                  min(MAX_CONNECT_TIMEOUT, timeout), 0);\r\n    ev_timer_init(&remote->recv_ctx->watcher, remote_timeout_cb,\r\n                  timeout, timeout);\r\n\r\n    return remote;\r\n}\r\n\r\nstatic void\r\nfree_remote(remote_t *remote) {\r\n    if (remote->server != NULL) {\r\n        remote->server->remote = NULL;\r\n    }\r\n    if (remote->buf != NULL) {\r\n        bfree(remote->buf);\r\n        ss_free(remote->buf);\r\n    }\r\n    ss_free(remote->recv_ctx);\r\n    ss_free(remote->send_ctx);\r\n    ss_free(remote);\r\n}\r\n\r\nstatic void\r\nclose_and_free_remote(EV_P_ remote_t *remote) {\r\n    if (remote != NULL) {\r\n        ev_timer_stop(EV_A_ &remote->send_ctx->watcher);\r\n        ev_timer_stop(EV_A_ &remote->recv_ctx->watcher);\r\n        ev_io_stop(EV_A_ &remote->send_ctx->io);\r\n        ev_io_stop(EV_A_ &remote->recv_ctx->io);\r\n        close(remote->fd);\r\n        free_remote(remote);\r\n    }\r\n}\r\n\r\nstatic server_t *\r\nnew_server(int fd, listen_ctx_t *profile) {\r\n    server_t *server;\r\n    server = ss_malloc(sizeof(server_t));\r\n\r\n    memset(server, 0, sizeof(server_t));\r\n\r\n    server->listener = profile;\r\n    server->recv_ctx = ss_malloc(sizeof(server_ctx_t));\r\n    server->send_ctx = ss_malloc(sizeof(server_ctx_t));\r\n    server->buf = ss_malloc(sizeof(buffer_t));\r\n    balloc(server->buf, BUF_SIZE);\r\n    memset(server->recv_ctx, 0, sizeof(server_ctx_t));\r\n    memset(server->send_ctx, 0, sizeof(server_ctx_t));\r\n    server->stage = STAGE_INIT;\r\n    server->recv_ctx->connected = 0;\r\n    server->send_ctx->connected = 0;\r\n    server->fd = fd;\r\n    server->recv_ctx->server = server;\r\n    server->send_ctx->server = server;\r\n\r\n    ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ);\r\n    ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE);\r\n\r\n            cork_dllist_add(&profile->connections_eden, &server->entries);\r\n            cork_dllist_add(&all_connections, &server->entries_all);\r\n\r\n    return server;\r\n}\r\n\r\nstatic void\r\nrelease_profile(listen_ctx_t *profile) {\r\n    int i;\r\n\r\n    ss_free(profile->iface);\r\n\r\n    for (i = 0; i < profile->server_num; i++) {\r\n        server_def_t *server_env = &profile->servers[i];\r\n\r\n        ss_free(server_env->host);\r\n\r\n        if (server_env->addr != server_env->addr_udp) {\r\n            ss_free(server_env->addr_udp);\r\n        }\r\n        ss_free(server_env->addr);\r\n\r\n        ss_free(server_env->psw);\r\n\r\n        ss_free(server_env->protocol_name);\r\n        ss_free(server_env->obfs_name);\r\n        ss_free(server_env->protocol_param);\r\n        ss_free(server_env->obfs_param);\r\n        ss_free(server_env->protocol_global);\r\n        ss_free(server_env->obfs_global);\r\n        if (server_env->protocol_plugin) {\r\n            free_obfs_class(server_env->protocol_plugin);\r\n        }\r\n        if (server_env->obfs_plugin) {\r\n            free_obfs_class(server_env->obfs_plugin);\r\n        }\r\n        ss_free(server_env->id);\r\n        ss_free(server_env->group);\r\n\r\n        enc_release(&server_env->cipher);\r\n    }\r\n    ss_free(profile);\r\n}\r\n\r\nstatic void\r\ncheck_and_free_profile(listen_ctx_t *profile) {\r\n    int i;\r\n\r\n    if (profile == current_profile) {\r\n        return;\r\n    }\r\n    // if this connection is created from an inactive profile, then we need to free the profile\r\n    // when the last connection of that profile is colsed\r\n    if (!cork_dllist_is_empty(&profile->connections_eden)) {\r\n        return;\r\n    }\r\n\r\n    for (i = 0; i < profile->server_num; i++) {\r\n        if (!cork_dllist_is_empty(&profile->servers[i].connections)) {\r\n            return;\r\n        }\r\n    }\r\n\r\n    // No connections anymore\r\n    cork_dllist_remove(&profile->entries);\r\n    release_profile(profile);\r\n}\r\n\r\nstatic void\r\nfree_server(server_t *server) {\r\n    listen_ctx_t *profile = server->listener;\r\n    server_def_t *server_env = server->server_env;\r\n\r\n    cork_dllist_remove(&server->entries);\r\n    cork_dllist_remove(&server->entries_all);\r\n\r\n    if (server->remote != NULL) {\r\n        server->remote->server = NULL;\r\n    }\r\n    if (server->buf != NULL) {\r\n        bfree(server->buf);\r\n        ss_free(server->buf);\r\n    }\r\n\r\n    if (server_env) {\r\n        if (server->e_ctx != NULL) {\r\n            enc_ctx_release(&server_env->cipher, server->e_ctx);\r\n            ss_free(server->e_ctx);\r\n        }\r\n        if (server->d_ctx != NULL) {\r\n            enc_ctx_release(&server_env->cipher, server->d_ctx);\r\n            ss_free(server->d_ctx);\r\n        }\r\n        // SSR beg\r\n        if (server_env->obfs_plugin) {\r\n            server_env->obfs_plugin->dispose(server->obfs);\r\n            server->obfs = NULL;\r\n        }\r\n        if (server_env->protocol_plugin) {\r\n            server_env->protocol_plugin->dispose(server->protocol);\r\n            server->protocol = NULL;\r\n        }\r\n        // SSR end\r\n    }\r\n\r\n    ss_free(server->recv_ctx);\r\n    ss_free(server->send_ctx);\r\n    ss_free(server);\r\n\r\n    // after free server, we need to check the profile\r\n    check_and_free_profile(profile);\r\n}\r\n\r\nstatic void\r\nclose_and_free_server(EV_P_ server_t *server) {\r\n    if (server != NULL) {\r\n        ev_io_stop(EV_A_ &server->send_ctx->io);\r\n        ev_io_stop(EV_A_ &server->recv_ctx->io);\r\n        close(server->fd);\r\n        free_server(server);\r\n    }\r\n}\r\n\r\nstatic remote_t *\r\ncreate_remote(listen_ctx_t *profile, struct sockaddr *addr) {\r\n    int remotefd = socket(addr->sa_family, SOCK_STREAM, IPPROTO_TCP);\r\n\r\n    if (remotefd == -1) {\r\n        ERROR(\"socket\");\r\n        return NULL;\r\n    }\r\n\r\n    int opt = 1;\r\n    setsockopt(remotefd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\r\n#ifdef SO_NOSIGPIPE\r\n    setsockopt(remotefd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\r\n#endif\r\n\r\n    if (profile->mptcp == 1) {\r\n        int err = setsockopt(remotefd, SOL_TCP, MPTCP_ENABLED, &opt, sizeof(opt));\r\n        if (err == -1) {\r\n            ERROR(\"failed to enable multipath TCP\");\r\n        }\r\n    }\r\n\r\n    // Setup\r\n    setnonblocking(remotefd);\r\n#ifdef SET_INTERFACE\r\n    if (profile->iface) {\r\n        if (setinterface(remotefd, profile->iface) == -1)\r\n            ERROR(\"setinterface\");\r\n    }\r\n#endif\r\n\r\n    remote_t *remote = new_remote(remotefd, profile->timeout);\r\n    remote->direct_addr.addr_len = get_sockaddr_len(addr);\r\n    memcpy(&(remote->direct_addr.addr), addr, remote->direct_addr.addr_len);\r\n//    remote->direct_addr.remote_index = index;\r\n\r\n    return remote;\r\n}\r\n\r\nstatic void\r\nsignal_cb(EV_P_ ev_signal *w, int revents) {\r\n    if (revents & EV_SIGNAL) {\r\n        switch (w->signum) {\r\n            case SIGINT:\r\n            case SIGTERM:\r\n#ifndef __MINGW32__\r\n                case SIGUSR1:\r\n#endif\r\n                ev_unloop(EV_A_ EVUNLOOP_ALL);\r\n        }\r\n    }\r\n}\r\n\r\nvoid\r\naccept_cb(EV_P_ ev_io *w, int revents) {\r\n    listen_ctx_t *listener = (listen_ctx_t *) w;\r\n    int serverfd = accept(listener->fd, NULL, NULL);\r\n    if (serverfd == -1) {\r\n        ERROR(\"accept\");\r\n        return;\r\n    }\r\n    setnonblocking(serverfd);\r\n    int opt = 1;\r\n    setsockopt(serverfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\r\n#ifdef SO_NOSIGPIPE\r\n    setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\r\n#endif\r\n\r\n    server_t *server = new_server(serverfd, listener);\r\n\r\n    ev_io_start(EV_A_ &server->recv_ctx->io);\r\n}\r\n\r\nvoid\r\nresolve_int_cb(int dummy) {\r\n    keep_resolving = 0;\r\n}\r\n\r\nstatic void\r\ninit_obfs(server_def_t *serv, char *protocol, char *protocol_param, char *obfs, char *obfs_param) {\r\n    serv->protocol_name = protocol;\r\n    serv->protocol_param = protocol_param;\r\n    serv->protocol_plugin = new_obfs_class(protocol);\r\n    serv->obfs_name = obfs;\r\n    serv->obfs_param = obfs_param;\r\n    serv->obfs_plugin = new_obfs_class(obfs);\r\n\r\n    if (serv->obfs_plugin) {\r\n        serv->obfs_global = serv->obfs_plugin->init_data();\r\n    }\r\n    if (serv->protocol_plugin) {\r\n        serv->protocol_global = serv->protocol_plugin->init_data();\r\n    }\r\n}\r\n\r\n#ifndef LIB_ONLY\r\nint\r\nmain(int argc, char **argv)\r\n{\r\n    int i, c;\r\n    int pid_flags    = 0;\r\n    int mtu          = 0;\r\n    int mptcp        = 0;\r\n    char *user       = NULL;\r\n    char *local_port = NULL;\r\n    char *local_addr = NULL;\r\n    char *password = NULL;\r\n    char *timeout = NULL;\r\n    char *protocol = NULL; // SSR\r\n    char *protocol_param = NULL; // SSR\r\n    char *method = NULL;\r\n    char *obfs = NULL; // SSR\r\n    char *obfs_param = NULL; // SSR\r\n    char *pid_path = NULL;\r\n    char *conf_path = NULL;\r\n    char *iface = NULL;\r\n    int remote_num = 0;\r\n    char *hostnames[MAX_REMOTE_NUM] = {NULL};\r\n    ss_addr_t remote_addr[MAX_REMOTE_NUM];\r\n    char *remote_port = NULL;\r\n    int use_new_profile = 0;\r\n    jconf_t *conf = NULL;\r\n\r\n    ss_addr_t tunnel_addr = { .host = NULL, .port = NULL };\r\n    char *tunnel_addr_str = NULL;\r\n\r\n    int option_index                    = 0;\r\n    static struct option long_options[] = {\r\n            { \"fast-open\", no_argument,       0, 0 },\r\n            { \"acl\",       required_argument, 0, 0 },\r\n            { \"mtu\",       required_argument, 0, 0 },\r\n            { \"mptcp\",     no_argument,       0, 0 },\r\n            { \"help\",      no_argument,       0, 0 },\r\n            { \"host\",      required_argument, 0, 0 },\r\n            {           0,                 0, 0, 0 }\r\n    };\r\n\r\n    opterr = 0;\r\n\r\n    USE_TTY();\r\n\r\n#ifdef ANDROID\r\n    while ((c = getopt_long(argc, argv, \"f:s:p:l:k:t:m:i:c:b:L:a:n:P:xhuUvVA6\"\r\n                            \"O:o:G:g:\",\r\n                            long_options, &option_index)) != -1)\r\n#else\r\n    while ((c = getopt_long(argc, argv, \"f:s:p:l:k:t:m:i:c:b:L:a:n:huUvA6\"\r\n                            \"O:o:G:g:\",\r\n                            long_options, &option_index)) != -1)\r\n#endif\r\n    {\r\n        switch (c) {\r\n            case 0:\r\n                if (option_index == 0) {\r\n                    fast_open = 1;\r\n                } else if (option_index == 1) {\r\n                    LOGI(\"initializing acl...\");\r\n                    acl = !init_acl(optarg);\r\n                } else if (option_index == 2) {\r\n                    mtu = atoi(optarg);\r\n                    LOGI(\"set MTU to %d\", mtu);\r\n                } else if (option_index == 3) {\r\n                    mptcp = 1;\r\n                    LOGI(\"enable multipath TCP\");\r\n                } else if (option_index == 4) {\r\n                    usage();\r\n                    exit(EXIT_SUCCESS);\r\n                } else if (option_index == 5) {\r\n                    hostnames[remote_num] = optarg;\r\n                }\r\n                break;\r\n            case 's':\r\n                if (remote_num < MAX_REMOTE_NUM) {\r\n                    remote_addr[remote_num].host   = optarg;\r\n                    remote_addr[remote_num++].port = NULL;\r\n                }\r\n                break;\r\n            case 'p':\r\n                remote_port = optarg;\r\n                break;\r\n            case 'l':\r\n                local_port = optarg;\r\n                break;\r\n            case 'k':\r\n                password = optarg;\r\n                break;\r\n            case 'f':\r\n                pid_flags = 1;\r\n                pid_path  = optarg;\r\n                break;\r\n            case 't':\r\n                timeout = optarg;\r\n                break;\r\n                // SSR beg\r\n            case 'O':\r\n                protocol = optarg;\r\n                break;\r\n            case 'm':\r\n                method = optarg;\r\n                break;\r\n            case 'o':\r\n                obfs = optarg;\r\n                break;\r\n            case 'G':\r\n                protocol_param = optarg;\r\n                break;\r\n            case 'g':\r\n                obfs_param = optarg;\r\n                break;\r\n                // SSR end\r\n            case 'c':\r\n                conf_path = optarg;\r\n                break;\r\n            case 'i':\r\n                iface = optarg;\r\n                break;\r\n            case 'b':\r\n                local_addr = optarg;\r\n                break;\r\n            case 'L':\r\n                tunnel_addr_str = optarg;\r\n                break;\r\n            case 'a':\r\n                user = optarg;\r\n                break;\r\n#ifdef HAVE_SETRLIMIT\r\n            case 'n':\r\n            nofile = atoi(optarg);\r\n            break;\r\n#endif\r\n            case 'u':\r\n                mode = TCP_AND_UDP;\r\n                break;\r\n            case 'U':\r\n                mode = UDP_ONLY;\r\n                break;\r\n            case 'v':\r\n                verbose = 1;\r\n                break;\r\n            case 'h':\r\n                usage();\r\n                exit(EXIT_SUCCESS);\r\n            case 'A':\r\n                LOGI(\"The 'A' argument is deprecate! Ignored.\");\r\n                break;\r\n            case '6':\r\n                ipv6first = 1;\r\n                break;\r\n#ifdef ANDROID\r\n            case 'V':\r\n            vpn = 1;\r\n            break;\r\n        case 'P':\r\n            prefix = optarg;\r\n            break;\r\n        case 'x':\r\n            log_tx_rx = 1;\r\n            break;\r\n#endif\r\n            case '?':\r\n                // The option character is not recognized.\r\n                LOGE(\"Unrecognized option: %s\", optarg);\r\n                opterr = 1;\r\n                break;\r\n        }\r\n    }\r\n\r\n    if (opterr) {\r\n        usage();\r\n        exit(EXIT_FAILURE);\r\n    }\r\n\r\n    if (argc == 1) {\r\n        if (conf_path == NULL) {\r\n            conf_path = DEFAULT_CONF_PATH;\r\n        }\r\n    }\r\n\r\n    if (conf_path != NULL) {\r\n        conf = read_jconf(conf_path);\r\n        if(conf->conf_ver != CONF_VER_LEGACY){\r\n            use_new_profile = 1;\r\n        } else {\r\n            if (remote_num == 0) {\r\n                remote_num = conf->server_legacy.remote_num;\r\n                for (i = 0; i < remote_num; i++)\r\n                    remote_addr[i] = conf->server_legacy.remote_addr[i];\r\n            }\r\n            if (remote_port == NULL) {\r\n                remote_port = conf->server_legacy.remote_port;\r\n            }\r\n            if (local_addr == NULL) {\r\n                local_addr = conf->server_legacy.local_addr;\r\n            }\r\n            if (local_port == NULL) {\r\n                local_port = conf->server_legacy.local_port;\r\n            }\r\n            if (password == NULL) {\r\n                password = conf->server_legacy.password;\r\n            }\r\n            // SSR beg\r\n            if (protocol == NULL) {\r\n                protocol = conf->server_legacy.protocol;\r\n                LOGI(\"protocol %s\", protocol);\r\n            }\r\n            if (protocol_param == NULL) {\r\n                protocol_param = conf->server_legacy.protocol_param;\r\n                LOGI(\"protocol_param %s\", protocol_param);\r\n            }\r\n            if (method == NULL) {\r\n                method = conf->server_legacy.method;\r\n                LOGI(\"method %s\", method);\r\n            }\r\n            if (obfs == NULL) {\r\n                obfs = conf->server_legacy.obfs;\r\n                LOGI(\"obfs %s\", obfs);\r\n            }\r\n            if (obfs_param == NULL) {\r\n                obfs_param = conf->server_legacy.obfs_param;\r\n                LOGI(\"obfs_param %s\", obfs_param);\r\n            }\r\n            // SSR end\r\n        }\r\n\r\n        if (timeout == NULL) {\r\n            timeout = conf->timeout;\r\n        }\r\n        if (user == NULL) {\r\n            user = conf->user;\r\n        }\r\n        if (tunnel_addr_str == NULL) {\r\n            tunnel_addr_str = conf->tunnel_address;\r\n        }\r\n        if (fast_open == 0) {\r\n            fast_open = conf->fast_open;\r\n        }\r\n        if (mode == TCP_ONLY) {\r\n            mode = conf->mode;\r\n        }\r\n        if (mtu == 0) {\r\n            mtu = conf->mtu;\r\n        }\r\n        if (mptcp == 0) {\r\n            mptcp = conf->mptcp;\r\n        }\r\n#ifdef HAVE_SETRLIMIT\r\n        if (nofile == 0) {\r\n            nofile = conf->nofile;\r\n        }\r\n#endif\r\n    }\r\n    if (protocol && strcmp(protocol, \"verify_sha1\") == 0) {\r\n        LOGI(\"The verify_sha1 protocol is deprecate! Fallback to origin protocol.\");\r\n        protocol = NULL;\r\n    }\r\n\r\n    if (remote_num == 0 || remote_port == NULL ||\r\n#ifndef HAVE_LAUNCHD\r\n        local_port == NULL ||\r\n#endif\r\n        password == NULL) {\r\n        usage();\r\n        exit(EXIT_FAILURE);\r\n    }\r\n\r\n    if (method == NULL) {\r\n        method = \"rc4-md5\";\r\n    }\r\n\r\n    if (timeout == NULL) {\r\n        timeout = \"60\";\r\n    }\r\n\r\n#ifdef HAVE_SETRLIMIT\r\n    /*\r\n     * no need to check the return value here since we will show\r\n     * the user an error message if setrlimit(2) fails\r\n     */\r\n    if (nofile > 1024) {\r\n        if (verbose) {\r\n            LOGI(\"setting NOFILE to %d\", nofile);\r\n        }\r\n        set_nofile(nofile);\r\n    }\r\n#endif\r\n\r\n    if (local_addr == NULL) {\r\n        local_addr = \"127.0.0.1\";\r\n    }\r\n\r\n    if (pid_flags) {\r\n        USE_SYSLOG(argv[0]);\r\n        daemonize(pid_path);\r\n    }\r\n\r\n    if (fast_open == 1) {\r\n#ifdef TCP_FASTOPEN\r\n        LOGI(\"using tcp fast open\");\r\n#else\r\n        LOGE(\"tcp fast open is not supported by this environment\");\r\n        fast_open = 0;\r\n#endif\r\n    }\r\n\r\n    if (ipv6first) {\r\n        LOGI(\"resolving hostname to IPv6 address first\");\r\n    }\r\n    srand(time(NULL));\r\n\r\n    // parse tunnel addr\r\n    if (tunnel_addr_str) {\r\n        parse_addr(tunnel_addr_str, &tunnel_addr);\r\n    }\r\n\r\n#ifdef __MINGW32__\r\n    winsock_init();\r\n#else\r\n    // ignore SIGPIPE\r\n    signal(SIGPIPE, SIG_IGN);\r\n    signal(SIGABRT, SIG_IGN);\r\n    signal(SIGINT,  resolve_int_cb);\r\n    signal(SIGTERM, resolve_int_cb);\r\n#endif\r\n\r\n    // Setup profiles\r\n    listen_ctx_t *profile = (listen_ctx_t *)ss_malloc(sizeof(listen_ctx_t));\r\n    memset(profile, 0, sizeof(listen_ctx_t));\r\n\r\n    cork_dllist_init(&profile->connections_eden);\r\n\r\n    profile->timeout = atoi(timeout);\r\n    profile->iface = ss_strdup(iface);\r\n    profile->mptcp = mptcp;\r\n    profile->tunnel_addr = tunnel_addr;\r\n\r\n    if(use_new_profile) {\r\n        char port[6];\r\n\r\n        ss_server_new_1_t *servers = &conf->server_new_1;\r\n        profile->server_num = servers->server_num;\r\n        for(i = 0; i < servers->server_num; i++) {\r\n            server_def_t *serv = &profile->servers[i];\r\n            ss_server_t *serv_cfg = &servers->servers[i];\r\n\r\n            struct sockaddr_storage *storage = ss_malloc(sizeof(struct sockaddr_storage));\r\n\r\n            char *host = serv_cfg->server;\r\n            snprintf(port, sizeof(port), \"%d\", serv_cfg->server_port);\r\n            if (get_sockaddr(host, port, storage, 1, ipv6first) == -1) {\r\n                FATAL(\"failed to resolve the provided hostname\");\r\n            }\r\n\r\n            serv->addr = serv->addr_udp = storage;\r\n            serv->addr_len = serv->addr_udp_len = get_sockaddr_len((struct sockaddr *) storage);\r\n            serv->port = serv->udp_port = serv_cfg->server_port;\r\n\r\n            // set udp port\r\n            if (serv_cfg->server_udp_port != 0 && serv_cfg->server_udp_port != serv_cfg->server_port) {\r\n                storage = ss_malloc(sizeof(struct sockaddr_storage));\r\n                snprintf(port, sizeof(port), \"%d\", serv_cfg->server_udp_port);\r\n                if (get_sockaddr(host, port, storage, 1, ipv6first) == -1) {\r\n                    FATAL(\"failed to resolve the provided hostname\");\r\n                }\r\n                serv->addr_udp = storage;\r\n                serv->addr_udp_len = get_sockaddr_len((struct sockaddr *) storage);\r\n                serv->udp_port = serv_cfg->server_udp_port;\r\n            }\r\n            serv->host = ss_strdup(host);\r\n            if (hostnames[i])\r\n                serv->hostname = hostnames[i];\r\n\r\n            // Setup keys\r\n            LOGI(\"initializing ciphers... %s\", serv_cfg->method);\r\n            enc_init(&serv->cipher, serv_cfg->password, serv_cfg->method);\r\n            serv->psw = ss_strdup(serv_cfg->password);\r\n            if (serv_cfg->protocol && strcmp(serv_cfg->protocol, \"verify_sha1\") == 0) {\r\n                ss_free(serv_cfg->protocol);\r\n            }\r\n\r\n            cork_dllist_init(&serv->connections);\r\n\r\n            // init obfs\r\n            init_obfs(serv, ss_strdup(serv_cfg->protocol), ss_strdup(serv_cfg->protocol_param), ss_strdup(serv_cfg->obfs), ss_strdup(serv_cfg->obfs_param));\r\n\r\n            serv->enable = serv_cfg->enable;\r\n            serv->id = ss_strdup(serv_cfg->id);\r\n            serv->group = ss_strdup(serv_cfg->group);\r\n            serv->udp_over_tcp = serv_cfg->udp_over_tcp;\r\n        }\r\n    } else {\r\n        profile->server_num = remote_num;\r\n        for(i = 0; i < remote_num; i++) {\r\n            server_def_t *serv = &profile->servers[i];\r\n            char *host = remote_addr[i].host;\r\n            char *port = remote_addr[i].port == NULL ? remote_port :\r\n                         remote_addr[i].port;\r\n\r\n            struct sockaddr_storage *storage = ss_malloc(sizeof(struct sockaddr_storage));\r\n            if (get_sockaddr(host, port, storage, 1, ipv6first) == -1) {\r\n                FATAL(\"failed to resolve the provided hostname\");\r\n            }\r\n            serv->host = ss_strdup(host);\r\n            if (hostnames[i])\r\n                serv->hostname = hostnames[i];\r\n            serv->addr = serv->addr_udp = storage;\r\n            serv->addr_len = serv->addr_udp_len = get_sockaddr_len((struct sockaddr *)storage);\r\n            serv->port = serv->udp_port = atoi(port);\r\n\r\n            // Setup keys\r\n            LOGI(\"initializing ciphers... %s\", method);\r\n            enc_init(&serv->cipher, password, method);\r\n            serv->psw = ss_strdup(password);\r\n\r\n            cork_dllist_init(&serv->connections);\r\n\r\n            // init obfs\r\n            init_obfs(serv, ss_strdup(protocol), ss_strdup(protocol_param), ss_strdup(obfs), ss_strdup(obfs_param));\r\n\r\n            serv->enable = 1;\r\n        }\r\n    }\r\n\r\n    // Init profiles\r\n    cork_dllist_init(&inactive_profiles);\r\n    current_profile = profile;\r\n\r\n    // Setup signal handler\r\n    struct ev_signal sigint_watcher;\r\n    struct ev_signal sigterm_watcher;\r\n    ev_signal_init(&sigint_watcher, signal_cb, SIGINT);\r\n    ev_signal_init(&sigterm_watcher, signal_cb, SIGTERM);\r\n    ev_signal_start(EV_DEFAULT, &sigint_watcher);\r\n    ev_signal_start(EV_DEFAULT, &sigterm_watcher);\r\n\r\n    struct ev_loop *loop = EV_DEFAULT;\r\n\r\n    listen_ctx_t *listen_ctx = current_profile;\r\n\r\n    if (mode != UDP_ONLY) {\r\n        // Setup socket\r\n        int listenfd;\r\n#ifdef HAVE_LAUNCHD\r\n        listenfd = launch_or_create(local_addr, local_port);\r\n#else\r\n        listenfd = create_and_bind(local_addr, local_port);\r\n#endif\r\n        if (listenfd == -1) {\r\n            FATAL(\"bind() error\");\r\n        }\r\n        if (listen(listenfd, SOMAXCONN) == -1) {\r\n            FATAL(\"listen() error\");\r\n        }\r\n        setnonblocking(listenfd);\r\n\r\n        listen_ctx->fd = listenfd;\r\n\r\n        ev_io_init(&listen_ctx->io, accept_cb, listenfd, EV_READ);\r\n        ev_io_start(loop, &listen_ctx->io);\r\n    }\r\n\r\n    // Setup UDP\r\n    if (mode != TCP_ONLY) {\r\n        LOGI(\"udprelay enabled\");\r\n        init_udprelay(local_addr, local_port, (struct sockaddr*)listen_ctx->servers[0].addr_udp,\r\n                      listen_ctx->servers[0].addr_udp_len, tunnel_addr, mtu, listen_ctx->timeout, profile->iface, &listen_ctx->servers[0].cipher, listen_ctx->servers[0].protocol_name, listen_ctx->servers[0].protocol_param);\r\n    }\r\n\r\n#ifdef HAVE_LAUNCHD\r\n    if (local_port == NULL)\r\n        LOGI(\"listening through launchd\");\r\n    else\r\n#endif\r\n    if (strcmp(local_addr, \":\") > 0)\r\n        LOGI(\"listening at [%s]:%s\", local_addr, local_port);\r\n    else\r\n        LOGI(\"listening at %s:%s\", local_addr, local_port);\r\n\r\n    // setuid\r\n    if (user != NULL && ! run_as(user)) {\r\n        FATAL(\"failed to switch user\");\r\n    }\r\n\r\n#ifndef __MINGW32__\r\n    if (geteuid() == 0){\r\n        LOGI(\"running from root user\");\r\n    }\r\n#endif\r\n\r\n    cork_dllist_init(&all_connections);\r\n\r\n    free_jconf(conf);\r\n\r\n    // Enter the loop\r\n    ev_run(loop, 0);\r\n\r\n    if (verbose) {\r\n        LOGI(\"closed gracefully\");\r\n    }\r\n\r\n    // Clean up\r\n    if (mode != TCP_ONLY) {\r\n        free_udprelay(); // udp relay use some data from profile, so we need to release udp first\r\n    }\r\n\r\n    if (mode != UDP_ONLY) {\r\n        ev_io_stop(loop, &listen_ctx->io);\r\n        free_connections(loop); // after this, all inactive profile should be released already, so we only need to release the current_profile\r\n        release_profile(current_profile);\r\n    }\r\n\r\n#ifdef __MINGW32__\r\n    winsock_cleanup();\r\n#endif\r\n\r\n    ev_signal_stop(EV_DEFAULT, &sigint_watcher);\r\n    ev_signal_stop(EV_DEFAULT, &sigterm_watcher);\r\n\r\n    return 0;\r\n}\r\n\r\n#else\r\n\r\nint\r\nstart_ss_local_server(profile_t profile) {\r\n    srand(time(NULL));\r\n\r\n    char *remote_host = profile.remote_host;\r\n    char *local_addr = profile.local_addr;\r\n    char *method = profile.method;\r\n    char *password = profile.password;\r\n    char *log = profile.log;\r\n    int remote_port = profile.remote_port;\r\n    int local_port = profile.local_port;\r\n    int timeout = profile.timeout;\r\n    int mtu = 0;\r\n    int mptcp = 0;\r\n\r\n    ss_addr_t tunnel_addr = {.host = NULL, .port = NULL};\r\n\r\n    mode = profile.mode;\r\n    fast_open = profile.fast_open;\r\n    verbose = profile.verbose;\r\n    mtu = profile.mtu;\r\n    mptcp = profile.mptcp;\r\n\r\n    char local_port_str[16];\r\n    char remote_port_str[16];\r\n    sprintf(local_port_str, \"%d\", local_port);\r\n    sprintf(remote_port_str, \"%d\", remote_port);\r\n\r\n    USE_LOGFILE(log);\r\n\r\n    if (profile.acl != NULL) {\r\n        acl = !init_acl(profile.acl);\r\n    }\r\n\r\n    if (local_addr == NULL) {\r\n        local_addr = \"127.0.0.1\";\r\n    }\r\n\r\n#ifdef __MINGW32__\r\n    winsock_init();\r\n#else\r\n    // ignore SIGPIPE\r\n    signal(SIGPIPE, SIG_IGN);\r\n    signal(SIGABRT, SIG_IGN);\r\n#endif\r\n\r\n    struct ev_signal sigint_watcher;\r\n    struct ev_signal sigterm_watcher;\r\n    ev_signal_init(&sigint_watcher, signal_cb, SIGINT);\r\n    ev_signal_init(&sigterm_watcher, signal_cb, SIGTERM);\r\n    ev_signal_start(EV_DEFAULT, &sigint_watcher);\r\n    ev_signal_start(EV_DEFAULT, &sigterm_watcher);\r\n#ifndef __MINGW32__\r\n    struct ev_signal sigusr1_watcher;\r\n    ev_signal_init(&sigusr1_watcher, signal_cb, SIGUSR1);\r\n    ev_signal_start(EV_DEFAULT, &sigusr1_watcher);\r\n#endif\r\n\r\n    struct sockaddr_storage *storage = ss_malloc(sizeof(struct sockaddr_storage));\r\n    memset(storage, 0, sizeof(struct sockaddr_storage));\r\n    if (get_sockaddr(remote_host, remote_port_str, storage, 0, ipv6first) == -1) {\r\n        return -1;\r\n    }\r\n\r\n    // Setup proxy context\r\n    struct ev_loop *loop = EV_DEFAULT;\r\n\r\n    listen_ctx_t listen_ctx;\r\n    listen_ctx.server_num = 1;\r\n    server_def_t *serv = &listen_ctx.servers[0];\r\n    ss_server_t server_cfg;\r\n    ss_server_t *serv_cfg = &server_cfg;\r\n    server_cfg.protocol = 0;\r\n    server_cfg.protocol_param = 0;\r\n    server_cfg.obfs = 0;\r\n    server_cfg.obfs_param = 0;\r\n    serv->addr = serv->addr_udp = storage;\r\n    serv->addr_len = serv->addr_udp_len = get_sockaddr_len((struct sockaddr *) storage);\r\n    listen_ctx.timeout = timeout;\r\n    listen_ctx.iface = NULL;\r\n    listen_ctx.mptcp = mptcp;\r\n\r\n    if (mode != UDP_ONLY) {\r\n        // Setup socket\r\n        int listenfd;\r\n        listenfd = create_and_bind(local_addr, local_port_str);\r\n        if (listenfd == -1) {\r\n            ERROR(\"bind()\");\r\n            return -1;\r\n        }\r\n        if (listen(listenfd, SOMAXCONN) == -1) {\r\n            ERROR(\"listen()\");\r\n            return -1;\r\n        }\r\n        setnonblocking(listenfd);\r\n\r\n        listen_ctx.fd = listenfd;\r\n\r\n        ev_io_init(&listen_ctx.io, accept_cb, listenfd, EV_READ);\r\n        ev_io_start(loop, &listen_ctx.io);\r\n    }\r\n\r\n    // Setup UDP\r\n    if (mode != TCP_ONLY) {\r\n        LOGI(\"udprelay enabled\");\r\n        init_udprelay(\r\n                local_addr,\r\n                local_port_str,\r\n                (struct sockaddr *) listen_ctx.servers[0].addr_udp,\r\n                listen_ctx.servers[0].addr_udp_len,\r\n                tunnel_addr,\r\n                mtu,\r\n                listen_ctx.timeout,\r\n                listen_ctx.iface,\r\n                &listen_ctx.servers[0].cipher,\r\n                listen_ctx.servers[0].protocol_name,\r\n                listen_ctx.servers[0].protocol_param\r\n        );\r\n    }\r\n\r\n    if (strcmp(local_addr, \":\") > 0)\r\n        LOGI(\"listening at [%s]:%s\", local_addr, local_port_str);\r\n    else\r\n        LOGI(\"listening at %s:%s\", local_addr, local_port_str);\r\n\r\n    // Setup keys\r\n    LOGI(\"initializing ciphers... %s\", method);\r\n    enc_init(&serv->cipher, password, method);\r\n\r\n    // init obfs\r\n    init_obfs(\r\n            serv,\r\n            ss_strdup(serv_cfg->protocol),\r\n            ss_strdup(serv_cfg->protocol_param),\r\n            ss_strdup(serv_cfg->obfs),\r\n            ss_strdup(serv_cfg->obfs_param)\r\n    );\r\n\r\n    // Init connections\r\n    cork_dllist_init(&serv->connections);\r\n\r\n    cork_dllist_init(&inactive_profiles); //\r\n\r\n    // Enter the loop\r\n    ev_run(loop, 0);\r\n\r\n    if (verbose) {\r\n        LOGI(\"closed gracefully\");\r\n    }\r\n\r\n    // Clean up\r\n    if (mode != TCP_ONLY) {\r\n        free_udprelay();\r\n    }\r\n\r\n    if (mode != UDP_ONLY) {\r\n        ev_io_stop(loop, &listen_ctx.io);\r\n        free_connections(loop);\r\n        close(listen_ctx.fd);\r\n    }\r\n\r\n    ss_free(serv->addr);\r\n\r\n#ifdef __MINGW32__\r\n    winsock_cleanup();\r\n#endif\r\n\r\n    ev_signal_stop(EV_DEFAULT, &sigint_watcher);\r\n    ev_signal_stop(EV_DEFAULT, &sigterm_watcher);\r\n#ifndef __MINGW32__\r\n    ev_signal_stop(EV_DEFAULT, &sigusr1_watcher);\r\n#endif\r\n\r\n    // cannot reach here\r\n    return 0;\r\n}\r\n\r\n#endif\r\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/local.h",
    "content": "/*\n * local.h - Define the client's buffers and callbacks\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _LOCAL_H\n#define _LOCAL_H\n\n#include <ev.h>\n#include <libcork/ds.h>\n\n#include \"encrypt.h\"\n#include \"jconf.h\"\n#include \"protocol.h\"\n\n#include \"common.h\"\n\n// use this as a profile or environment\ntypedef struct listen_ctx{\n    ev_io io;\n    ss_addr_t tunnel_addr;\n\n    struct cork_dllist_item entries; // for inactive profile list\n    struct cork_dllist connections_eden; // For connections just created but not attach to a server\n\n    char *iface;\n    int timeout;\n    int fd;\n    int mptcp;\n\n    int server_num;\n    server_def_t servers[MAX_SERVER_NUM];\n} listen_ctx_t;\n\ntypedef struct server_ctx {\n    ev_io io;\n    int connected;\n    struct server *server;\n} server_ctx_t;\n\ntypedef struct remote_ctx {\n    ev_io io;\n    ev_timer watcher;\n    int connected;\n    struct remote *remote;\n} remote_ctx_t;\n\ntypedef struct remote {\n    int fd;\n    buffer_t *buf;\n    remote_ctx_t *recv_ctx;\n    remote_ctx_t *send_ctx;\n    uint32_t counter;\n    struct server *server;\n\n    int direct;\n    struct { // direct = 1\n        struct sockaddr_storage addr;\n        int addr_len;\n    } direct_addr;\n} remote_t;\n\ntypedef struct server {\n    int fd;\n    char stage;\n    enc_ctx_t *e_ctx;\n    enc_ctx_t *d_ctx;\n    server_ctx_t *recv_ctx;\n    server_ctx_t *send_ctx;\n    listen_ctx_t *listener;\n    remote_t *remote;\n\n    buffer_t *buf;\n\n    struct cork_dllist_item entries;\n    struct cork_dllist_item entries_all; // for all_connections\n\n    server_def_t *server_env;\n\n    // SSR\n    obfs *protocol;\n    obfs *obfs;\n} server_t;\n\n#endif // _LOCAL_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/manager.c",
    "content": "/*\n * server.c - Provide shadowsocks service\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <fcntl.h>\n#include <locale.h>\n#include <signal.h>\n#include <string.h>\n#include <strings.h>\n#include <time.h>\n#include <unistd.h>\n#include <getopt.h>\n#include <math.h>\n#include <ctype.h>\n#include <limits.h>\n#include <dirent.h>\n\n#ifndef __MINGW32__\n#include <netdb.h>\n#include <errno.h>\n#include <arpa/inet.h>\n#include <netdb.h>\n#include <netinet/in.h>\n#include <netinet/tcp.h>\n#include <pthread.h>\n#include <sys/un.h>\n#include <sys/socket.h>\n#include <pwd.h>\n#endif\n\n#include <libcork/core.h>\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#endif\n\n#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_NET_IF_H) && defined(__linux__)\n#include <net/if.h>\n#include <sys/ioctl.h>\n#define SET_INTERFACE\n#endif\n\n#include \"json.h\"\n#include \"utils.h\"\n#include \"manager.h\"\n\n#ifndef BUF_SIZE\n#define BUF_SIZE 65535\n#endif\n\nint verbose          = 0;\nchar *executable     = \"ss-server\";\nchar *working_dir    = NULL;\nint working_dir_size = 0;\n\nstatic struct cork_hash_table *server_table;\n\n#ifndef __MINGW32__\nstatic int\nsetnonblocking(int fd)\n{\n    int flags;\n    if (-1 == (flags = fcntl(fd, F_GETFL, 0))) {\n        flags = 0;\n    }\n    return fcntl(fd, F_SETFL, flags | O_NONBLOCK);\n}\n\n#endif\n\nstatic void\nbuild_config(char *prefix, struct server *server)\n{\n    char *path    = NULL;\n    int path_size = strlen(prefix) + strlen(server->port) + 20;\n\n    path = ss_malloc(path_size);\n    snprintf(path, path_size, \"%s/.shadowsocks_%s.conf\", prefix, server->port);\n    FILE *f = fopen(path, \"w+\");\n    if (f == NULL) {\n        if (verbose) {\n            LOGE(\"unable to open config file\");\n        }\n        ss_free(path);\n        return;\n    }\n    fprintf(f, \"{\\n\");\n    fprintf(f, \"\\\"server_port\\\":\\\"%s\\\",\\n\", server->port);\n    fprintf(f, \"\\\"password\\\":\\\"%s\\\",\\n\", server->password);\n    fprintf(f, \"}\\n\");\n    fclose(f);\n    ss_free(path);\n}\n\nstatic char *\nconstruct_command_line(struct manager_ctx *manager, struct server *server)\n{\n    static char cmd[BUF_SIZE];\n    int i;\n\n    build_config(working_dir, server);\n\n    memset(cmd, 0, BUF_SIZE);\n    snprintf(cmd, BUF_SIZE,\n             \"%s -m %s --manager-address %s -f %s/.shadowsocks_%s.pid -c %s/.shadowsocks_%s.conf\",\n             executable, manager->method, manager->manager_address,\n             working_dir, server->port, working_dir, server->port);\n\n    if (manager->acl != NULL) {\n        int len = strlen(cmd);\n        snprintf(cmd + len, BUF_SIZE - len, \" --acl %s\", manager->acl);\n    }\n    if (manager->timeout != NULL) {\n        int len = strlen(cmd);\n        snprintf(cmd + len, BUF_SIZE - len, \" -t %s\", manager->timeout);\n    }\n#ifdef HAVE_SETRLIMIT\n    if (manager->nofile) {\n        int len = strlen(cmd);\n        snprintf(cmd + len, BUF_SIZE - len, \" -n %d\", manager->nofile);\n    }\n#endif\n    if (manager->user != NULL) {\n        int len = strlen(cmd);\n        snprintf(cmd + len, BUF_SIZE - len, \" -a %s\", manager->user);\n    }\n    if (manager->verbose) {\n        int len = strlen(cmd);\n        snprintf(cmd + len, BUF_SIZE - len, \" -v\");\n    }\n    if (manager->mode == UDP_ONLY) {\n        int len = strlen(cmd);\n        snprintf(cmd + len, BUF_SIZE - len, \" -U\");\n    }\n    if (manager->mode == TCP_AND_UDP) {\n        int len = strlen(cmd);\n        snprintf(cmd + len, BUF_SIZE - len, \" -u\");\n    }\n    if (manager->fast_open) {\n        int len = strlen(cmd);\n        snprintf(cmd + len, BUF_SIZE - len, \" --fast-open\");\n    }\n    if (manager->mtu) {\n        int len = strlen(cmd);\n        snprintf(cmd + len, BUF_SIZE - len, \" --mtu %d\", manager->mtu);\n    }\n    for (i = 0; i < manager->nameserver_num; i++) {\n        int len = strlen(cmd);\n        snprintf(cmd + len, BUF_SIZE - len, \" -d %s\", manager->nameservers[i]);\n    }\n    for (i = 0; i < manager->host_num; i++) {\n        int len = strlen(cmd);\n        snprintf(cmd + len, BUF_SIZE - len, \" -s %s\", manager->hosts[i]);\n    }\n\n    if (verbose) {\n        LOGI(\"cmd: %s\", cmd);\n    }\n\n    return cmd;\n}\n\nstatic char *\nget_data(char *buf, int len)\n{\n    char *data;\n    int pos = 0;\n\n    while (buf[pos] != '{' && pos < len)\n        pos++;\n    if (pos == len) {\n        return NULL;\n    }\n    data = buf + pos - 1;\n\n    return data;\n}\n\nstatic char *\nget_action(char *buf, int len)\n{\n    char *action;\n    int pos = 0;\n\n    while (isspace((unsigned char)buf[pos]) && pos < len)\n        pos++;\n    if (pos == len) {\n        return NULL;\n    }\n    action = buf + pos;\n\n    while ((!isspace((unsigned char)buf[pos]) && buf[pos] != ':') && pos < len)\n        pos++;\n    buf[pos] = '\\0';\n\n    return action;\n}\n\nstatic struct server *\nget_server(char *buf, int len)\n{\n    char *data = get_data(buf, len);\n    char error_buf[512];\n\n    if (data == NULL) {\n        LOGE(\"No data found\");\n        return NULL;\n    }\n\n    json_settings settings = { 0 };\n    json_value *obj        = json_parse_ex(&settings, data, strlen(data), error_buf);\n\n    if (obj == NULL) {\n        LOGE(\"%s\", error_buf);\n        return NULL;\n    }\n\n    struct server *server = ss_malloc(sizeof(struct server));\n    memset(server, 0, sizeof(struct server));\n    if (obj->type == json_object) {\n        int i = 0;\n        for (i = 0; i < obj->u.object.length; i++) {\n            char *name        = obj->u.object.values[i].name;\n            json_value *value = obj->u.object.values[i].value;\n            if (strcmp(name, \"server_port\") == 0) {\n                if (value->type == json_string) {\n                    strncpy(server->port, value->u.string.ptr, 8);\n                } else if (value->type == json_integer) {\n                    snprintf(server->port, 8, \"%\" PRIu64 \"\", value->u.integer);\n                }\n            } else if (strcmp(name, \"password\") == 0) {\n                if (value->type == json_string) {\n                    strncpy(server->password, value->u.string.ptr, 128);\n                }\n            } else {\n                LOGE(\"invalid data: %s\", data);\n                break;\n            }\n        }\n    }\n\n    json_value_free(obj);\n    return server;\n}\n\nstatic int\nparse_traffic(char *buf, int len, char *port, uint64_t *traffic)\n{\n    char *data = get_data(buf, len);\n    char error_buf[512];\n    json_settings settings = { 0 };\n\n    if (data == NULL) {\n        LOGE(\"No data found\");\n        return -1;\n    }\n\n    json_value *obj = json_parse_ex(&settings, data, strlen(data), error_buf);\n    if (obj == NULL) {\n        LOGE(\"%s\", error_buf);\n        return -1;\n    }\n\n    if (obj->type == json_object) {\n        int i = 0;\n        for (i = 0; i < obj->u.object.length; i++) {\n            char *name        = obj->u.object.values[i].name;\n            json_value *value = obj->u.object.values[i].value;\n            if (value->type == json_integer) {\n                strncpy(port, name, 8);\n                *traffic = value->u.integer;\n            }\n        }\n    }\n\n    json_value_free(obj);\n    return 0;\n}\n\nstatic void\nadd_server(struct manager_ctx *manager, struct server *server)\n{\n    bool new = false;\n    cork_hash_table_put(server_table, (void *)server->port, (void *)server, &new, NULL, NULL);\n\n    char *cmd = construct_command_line(manager, server);\n    if (system(cmd) == -1) {\n        ERROR(\"add_server_system\");\n    }\n}\n\nstatic void\nkill_server(char *prefix, char *pid_file)\n{\n    char *path = NULL;\n    int pid, path_size = strlen(prefix) + strlen(pid_file) + 2;\n    path = ss_malloc(path_size);\n    snprintf(path, path_size, \"%s/%s\", prefix, pid_file);\n    FILE *f = fopen(path, \"r\");\n    if (f == NULL) {\n        if (verbose) {\n            LOGE(\"unable to open pid file\");\n        }\n        ss_free(path);\n        return;\n    }\n    if (fscanf(f, \"%d\", &pid) != EOF) {\n        kill(pid, SIGTERM);\n    }\n    fclose(f);\n    remove(path);\n    ss_free(path);\n}\n\nstatic void\nstop_server(char *prefix, char *port)\n{\n    char *path = NULL;\n    int pid, path_size = strlen(prefix) + strlen(port) + 20;\n    path = ss_malloc(path_size);\n    snprintf(path, path_size, \"%s/.shadowsocks_%s.pid\", prefix, port);\n    FILE *f = fopen(path, \"r\");\n    if (f == NULL) {\n        if (verbose) {\n            LOGE(\"unable to open pid file\");\n        }\n        ss_free(path);\n        return;\n    }\n    if (fscanf(f, \"%d\", &pid) != EOF) {\n        kill(pid, SIGTERM);\n    }\n    fclose(f);\n    ss_free(path);\n}\n\nstatic void\nremove_server(char *prefix, char *port)\n{\n    char *old_port            = NULL;\n    struct server *old_server = NULL;\n\n    cork_hash_table_delete(server_table, (void *)port, (void **)&old_port, (void **)&old_server);\n\n    if (old_server != NULL) {\n        ss_free(old_server);\n    }\n\n    stop_server(prefix, port);\n}\n\nstatic void\nupdate_stat(char *port, uint64_t traffic)\n{\n    void *ret = cork_hash_table_get(server_table, (void *)port);\n    if (ret != NULL) {\n        struct server *server = (struct server *)ret;\n        server->traffic = traffic;\n    }\n}\n\nstatic void\nmanager_recv_cb(EV_P_ ev_io *w, int revents)\n{\n    struct manager_ctx *manager = (struct manager_ctx *)w;\n    socklen_t len;\n    size_t r;\n    struct sockaddr_un claddr;\n    char buf[BUF_SIZE];\n\n    memset(buf, 0, BUF_SIZE);\n\n    len = sizeof(struct sockaddr_un);\n    r   = recvfrom(manager->fd, buf, BUF_SIZE, 0, (struct sockaddr *)&claddr, &len);\n    if (r == -1) {\n        ERROR(\"manager_recvfrom\");\n        return;\n    }\n\n    if (r > BUF_SIZE / 2) {\n        LOGE(\"too large request: %d\", (int)r);\n        return;\n    }\n\n    char *action = get_action(buf, r);\n    if (action == NULL) {\n        return;\n    }\n\n    if (strcmp(action, \"add\") == 0) {\n        struct server *server = get_server(buf, r);\n\n        if (server == NULL || server->port[0] == 0 || server->password[0] == 0) {\n            LOGE(\"invalid command: %s:%s\", buf, get_data(buf, r));\n            if (server != NULL) {\n                ss_free(server);\n            }\n            goto ERROR_MSG;\n        }\n\n        remove_server(working_dir, server->port);\n        add_server(manager, server);\n\n        char msg[3] = \"ok\";\n        if (sendto(manager->fd, msg, 2, 0, (struct sockaddr *)&claddr, len) != 2) {\n            ERROR(\"add_sendto\");\n        }\n    } else if (strcmp(action, \"remove\") == 0) {\n        struct server *server = get_server(buf, r);\n\n        if (server == NULL || server->port[0] == 0) {\n            LOGE(\"invalid command: %s:%s\", buf, get_data(buf, r));\n            if (server != NULL) {\n                ss_free(server);\n            }\n            goto ERROR_MSG;\n        }\n\n        remove_server(working_dir, server->port);\n        ss_free(server);\n\n        char msg[3] = \"ok\";\n        if (sendto(manager->fd, msg, 2, 0, (struct sockaddr *)&claddr, len) != 2) {\n            ERROR(\"remove_sendto\");\n        }\n    } else if (strcmp(action, \"stat\") == 0) {\n        char port[8];\n        uint64_t traffic = 0;\n\n        if (parse_traffic(buf, r, port, &traffic) == -1) {\n            LOGE(\"invalid command: %s:%s\", buf, get_data(buf, r));\n            return;\n        }\n\n        update_stat(port, traffic);\n    } else if (strcmp(action, \"ping\") == 0) {\n        struct cork_hash_table_entry *entry;\n        struct cork_hash_table_iterator server_iter;\n\n        char buf[BUF_SIZE];\n\n        memset(buf, 0, BUF_SIZE);\n        sprintf(buf, \"stat: {\");\n\n        cork_hash_table_iterator_init(server_table, &server_iter);\n\n        while ((entry = cork_hash_table_iterator_next(&server_iter)) != NULL) {\n            struct server *server = (struct server *)entry->value;\n            size_t pos            = strlen(buf);\n            if (pos > BUF_SIZE / 2) {\n                buf[pos - 1] = '}';\n                if (sendto(manager->fd, buf, pos, 0, (struct sockaddr *)&claddr, len)\n                    != pos) {\n                    ERROR(\"ping_sendto\");\n                }\n                memset(buf, 0, BUF_SIZE);\n            } else {\n                sprintf(buf + pos, \"\\\"%s\\\":%\" PRIu64 \",\", server->port, server->traffic);\n            }\n        }\n\n        size_t pos = strlen(buf);\n        if (pos > 7) {\n            buf[pos - 1] = '}';\n        } else {\n            buf[pos] = '}';\n            pos++;\n        }\n\n        if (sendto(manager->fd, buf, pos, 0, (struct sockaddr *)&claddr, len)\n            != pos) {\n            ERROR(\"ping_sendto\");\n        }\n    }\n\n    return;\n\nERROR_MSG:\n    strcpy(buf, \"err\");\n    if (sendto(manager->fd, buf, 3, 0, (struct sockaddr *)&claddr, len) != 3) {\n        ERROR(\"error_sendto\");\n    }\n}\n\nstatic void\nsignal_cb(EV_P_ ev_signal *w, int revents)\n{\n    if (revents & EV_SIGNAL) {\n        switch (w->signum) {\n        case SIGINT:\n        case SIGTERM:\n            ev_unloop(EV_A_ EVUNLOOP_ALL);\n        }\n    }\n}\n\nint\ncreate_server_socket(const char *host, const char *port)\n{\n    struct addrinfo hints;\n    struct addrinfo *result, *rp, *ipv4v6bindall;\n    int s, server_sock;\n\n    memset(&hints, 0, sizeof(struct addrinfo));\n    hints.ai_family   = AF_UNSPEC;               /* Return IPv4 and IPv6 choices */\n    hints.ai_socktype = SOCK_DGRAM;              /* We want a UDP socket */\n    hints.ai_flags    = AI_PASSIVE | AI_ADDRCONFIG; /* For wildcard IP address */\n    hints.ai_protocol = IPPROTO_UDP;\n\n    s = getaddrinfo(host, port, &hints, &result);\n    if (s != 0) {\n        LOGE(\"getaddrinfo: %s\", gai_strerror(s));\n        return -1;\n    }\n\n    rp = result;\n\n    /*\n     * On Linux, with net.ipv6.bindv6only = 0 (the default), getaddrinfo(NULL) with\n     * AI_PASSIVE returns 0.0.0.0 and :: (in this order). AI_PASSIVE was meant to\n     * return a list of addresses to listen on, but it is impossible to listen on\n     * 0.0.0.0 and :: at the same time, if :: implies dualstack mode.\n     */\n    if (!host) {\n        ipv4v6bindall = result;\n\n        /* Loop over all address infos found until a IPV6 address is found. */\n        while (ipv4v6bindall) {\n            if (ipv4v6bindall->ai_family == AF_INET6) {\n                rp = ipv4v6bindall; /* Take first IPV6 address available */\n                break;\n            }\n            ipv4v6bindall = ipv4v6bindall->ai_next; /* Get next address info, if any */\n        }\n    }\n\n    for (/*rp = result*/; rp != NULL; rp = rp->ai_next) {\n        server_sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);\n        if (server_sock == -1) {\n            continue;\n        }\n\n        if (rp->ai_family == AF_INET6) {\n            int ipv6only = host ? 1 : 0;\n            setsockopt(server_sock, IPPROTO_IPV6, IPV6_V6ONLY, &ipv6only, sizeof(ipv6only));\n        }\n\n        int opt = 1;\n        setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));\n\n        s = bind(server_sock, rp->ai_addr, rp->ai_addrlen);\n        if (s == 0) {\n            /* We managed to bind successfully! */\n            break;\n        } else {\n            ERROR(\"bind\");\n        }\n\n        close(server_sock);\n    }\n\n    if (rp == NULL) {\n        LOGE(\"cannot bind\");\n        return -1;\n    }\n\n    freeaddrinfo(result);\n\n    return server_sock;\n}\n\nint\nmain(int argc, char **argv)\n{\n    int i, c;\n    int pid_flags         = 0;\n    char *acl             = NULL;\n    char *user            = NULL;\n    char *password        = NULL;\n    char *timeout         = NULL;\n    char *method          = NULL;\n    char *pid_path        = NULL;\n    char *conf_path       = NULL;\n    char *iface           = NULL;\n    char *manager_address = NULL;\n\n    int fast_open = 0;\n    int mode      = TCP_ONLY;\n    int mtu       = 0;\n\n#ifdef HAVE_SETRLIMIT\n    static int nofile = 0;\n#endif\n\n    int server_num = 0;\n    char *server_host[MAX_REMOTE_NUM];\n\n    char *nameservers[MAX_DNS_NUM + 1];\n    int nameserver_num = 0;\n\n    jconf_t *conf = NULL;\n\n    int option_index                    = 0;\n    static struct option long_options[] = {\n        { \"fast-open\",       no_argument,       0, 0 },\n        { \"acl\",             required_argument, 0, 0 },\n        { \"manager-address\", required_argument, 0, 0 },\n        { \"executable\",      required_argument, 0, 0 },\n        { \"mtu\",             required_argument, 0, 0 },\n        { \"help\",            no_argument,       0, 0 },\n        {                 0,                 0, 0, 0 }\n    };\n\n    opterr = 0;\n\n    USE_TTY();\n\n    while ((c = getopt_long(argc, argv, \"f:s:l:k:t:m:c:i:d:a:n:huUvA\",\n                            long_options, &option_index)) != -1)\n        switch (c) {\n        case 0:\n            if (option_index == 0) {\n                fast_open = 1;\n            } else if (option_index == 1) {\n                acl = optarg;\n            } else if (option_index == 2) {\n                manager_address = optarg;\n            } else if (option_index == 3) {\n                executable = optarg;\n            } else if (option_index == 4) {\n                mtu = atoi(optarg);\n                LOGI(\"set MTU to %d\", mtu);\n            } else if (option_index == 5) {\n                usage();\n                exit(EXIT_SUCCESS);\n            }\n            break;\n        case 's':\n            if (server_num < MAX_REMOTE_NUM) {\n                server_host[server_num++] = optarg;\n            }\n            break;\n        case 'k':\n            password = optarg;\n            break;\n        case 'f':\n            pid_flags = 1;\n            pid_path  = optarg;\n            break;\n        case 't':\n            timeout = optarg;\n            break;\n        case 'm':\n            method = optarg;\n            break;\n        case 'c':\n            conf_path = optarg;\n            break;\n        case 'i':\n            iface = optarg;\n            break;\n        case 'd':\n            if (nameserver_num < MAX_DNS_NUM) {\n                nameservers[nameserver_num++] = optarg;\n            }\n            break;\n        case 'a':\n            user = optarg;\n            break;\n        case 'u':\n            mode = TCP_AND_UDP;\n            break;\n        case 'U':\n            mode = UDP_ONLY;\n            break;\n        case 'v':\n            verbose = 1;\n            break;\n        case 'h':\n            usage();\n            exit(EXIT_SUCCESS);\n        case 'A':\n            LOGI(\"The 'A' argument is deprecate! Ignored.\");\n            break;\n#ifdef HAVE_SETRLIMIT\n        case 'n':\n            nofile = atoi(optarg);\n            break;\n#endif\n        case '?':\n            // The option character is not recognized.\n            LOGE(\"Unrecognized option: %s\", optarg);\n            opterr = 1;\n            break;\n        }\n\n    if (opterr) {\n        usage();\n        exit(EXIT_FAILURE);\n    }\n\n    if (conf_path != NULL) {\n        conf = read_jconf(conf_path);\n        if (server_num == 0) {\n            server_num = conf->server_new_1.server_num;\n            //for (i = 0; i < server_num; i++)\n            //    server_host[i].host = conf->server_new_1.servers[i].server;\n            //    server_host[i].port = conf->server_new_1.servers[i].server_port;\n            //}\n        } else {\n            conf->server_new_1.server_num = 1;\n        }\n        if (password == NULL) {\n            password = conf->server_new_1.servers[0].password;\n        }\n        if (method == NULL) {\n            method = conf->server_new_1.servers[0].method;\n        }\n        if (timeout == NULL) {\n            timeout = conf->timeout;\n        }\n        if (user == NULL) {\n            user = conf->user;\n        }\n#ifdef TCP_FASTOPEN\n        if (fast_open == 0) {\n            fast_open = conf->fast_open;\n        }\n#endif\n        if (conf->nameserver != NULL) {\n            nameservers[nameserver_num++] = conf->nameserver;\n        }\n        if (mode == TCP_ONLY) {\n            mode = conf->mode;\n        }\n        if (mtu == 0) {\n            mtu = conf->mtu;\n        }\n#ifdef HAVE_SETRLIMIT\n        if (nofile == 0) {\n            nofile = conf->nofile;\n        }\n#endif\n    }\n\n    if (server_num == 0) {\n        server_host[server_num++] = \"0.0.0.0\";\n    }\n\n    if (method == NULL) {\n        method = \"table\";\n    }\n\n    if (timeout == NULL) {\n        timeout = \"60\";\n    }\n\n    if (pid_flags) {\n        USE_SYSLOG(argv[0]);\n        daemonize(pid_path);\n    }\n\n    if (server_num == 0 || manager_address == NULL) {\n        usage();\n        exit(EXIT_FAILURE);\n    }\n\n    if (fast_open == 1) {\n#ifdef TCP_FASTOPEN\n        LOGI(\"using tcp fast open\");\n#else\n        LOGE(\"tcp fast open is not supported by this environment\");\n#endif\n    }\n\n#ifdef __MINGW32__\n    winsock_init();\n#else\n    // ignore SIGPIPE\n    signal(SIGPIPE, SIG_IGN);\n    signal(SIGCHLD, SIG_IGN);\n    signal(SIGABRT, SIG_IGN);\n#endif\n\n    struct ev_signal sigint_watcher;\n    struct ev_signal sigterm_watcher;\n    ev_signal_init(&sigint_watcher, signal_cb, SIGINT);\n    ev_signal_init(&sigterm_watcher, signal_cb, SIGTERM);\n    ev_signal_start(EV_DEFAULT, &sigint_watcher);\n    ev_signal_start(EV_DEFAULT, &sigterm_watcher);\n\n    struct manager_ctx manager;\n    memset(&manager, 0, sizeof(struct manager_ctx));\n\n    manager.fast_open       = fast_open;\n    manager.verbose         = verbose;\n    manager.mode            = mode;\n    manager.password        = password;\n    manager.timeout         = timeout;\n    manager.method          = method;\n    manager.iface           = iface;\n    manager.acl             = acl;\n    manager.user            = user;\n    manager.manager_address = manager_address;\n    manager.hosts           = server_host;\n    manager.host_num        = server_num;\n    manager.nameservers     = nameservers;\n    manager.nameserver_num  = nameserver_num;\n    manager.mtu             = mtu;\n#ifdef HAVE_SETRLIMIT\n    manager.nofile = nofile;\n#endif\n\n    // initialize ev loop\n    struct ev_loop *loop = EV_DEFAULT;\n\n    // setuid\n    if (user != NULL && ! run_as(user)) {\n        FATAL(\"failed to switch user\");\n    }\n\n#ifndef __MINGW32__\n    if (geteuid() == 0){\n        LOGI(\"running from root user\");\n    }\n#endif\n\n    struct passwd *pw   = getpwuid(getuid());\n    const char *homedir = pw->pw_dir;\n    working_dir_size = strlen(homedir) + 15;\n    working_dir      = ss_malloc(working_dir_size);\n    snprintf(working_dir, working_dir_size, \"%s/.shadowsocks\", homedir);\n\n    int err = mkdir(working_dir, S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH);\n    if (err != 0 && errno != EEXIST) {\n        ERROR(\"mkdir\");\n        ss_free(working_dir);\n        FATAL(\"unable to create working directory\");\n    }\n\n    // Clean up all existed processes\n    DIR *dp;\n    struct dirent *ep;\n    dp = opendir(working_dir);\n    if (dp != NULL) {\n        while ((ep = readdir(dp)) != NULL) {\n            size_t len = strlen(ep->d_name);\n            if (strcmp(ep->d_name + len - 3, \"pid\") == 0) {\n                kill_server(working_dir, ep->d_name);\n                if (verbose)\n                    LOGI(\"kill %s\", ep->d_name);\n            }\n        }\n        closedir(dp);\n    } else {\n        ss_free(working_dir);\n        FATAL(\"Couldn't open the directory\");\n    }\n\n    server_table = cork_string_hash_table_new(MAX_PORT_NUM, 0);\n\n    if (conf != NULL) {\n        for (i = 0; i < conf->server_new_1.server_num; i++) {\n            struct server *server = ss_malloc(sizeof(struct server));\n            memset(server, 0, sizeof(struct server));\n            //strncpy(server->port, conf->server_new_1.servers[i].server_port, 8);\n            snprintf(server->port, 8, \"%d\", conf->server_new_1.servers[i].server_port);\n            strncpy(server->password, conf->server_new_1.servers[i].password, 128);\n            add_server(&manager, server);\n        }\n    }\n\n    int sfd;\n    ss_addr_t ip_addr = { .host = NULL, .port = NULL };\n    parse_addr(manager_address, &ip_addr);\n\n    if (ip_addr.host == NULL || ip_addr.port == NULL) {\n        struct sockaddr_un svaddr;\n        sfd = socket(AF_UNIX, SOCK_DGRAM, 0);       /*  Create server socket */\n        if (sfd == -1) {\n            ss_free(working_dir);\n            FATAL(\"socket\");\n        }\n\n        setnonblocking(sfd);\n\n        if (remove(manager_address) == -1 && errno != ENOENT) {\n            ERROR(\"bind\");\n            ss_free(working_dir);\n            exit(EXIT_FAILURE);\n        }\n\n        memset(&svaddr, 0, sizeof(struct sockaddr_un));\n        svaddr.sun_family = AF_UNIX;\n        strncpy(svaddr.sun_path, manager_address, sizeof(svaddr.sun_path) - 1);\n\n        if (bind(sfd, (struct sockaddr *)&svaddr, sizeof(struct sockaddr_un)) == -1) {\n            ERROR(\"bind\");\n            ss_free(working_dir);\n            exit(EXIT_FAILURE);\n        }\n    } else {\n        sfd = create_server_socket(ip_addr.host, ip_addr.port);\n        if (sfd == -1) {\n            ss_free(working_dir);\n            FATAL(\"socket\");\n        }\n    }\n\n    manager.fd = sfd;\n    ev_io_init(&manager.io, manager_recv_cb, manager.fd, EV_READ);\n    ev_io_start(loop, &manager.io);\n\n    // start ev loop\n    ev_run(loop, 0);\n\n    if (verbose) {\n        LOGI(\"closed gracefully\");\n    }\n\n    // Clean up\n    struct cork_hash_table_entry *entry;\n    struct cork_hash_table_iterator server_iter;\n\n    cork_hash_table_iterator_init(server_table, &server_iter);\n\n    while ((entry = cork_hash_table_iterator_next(&server_iter)) != NULL) {\n        struct server *server = (struct server *)entry->value;\n        stop_server(working_dir, server->port);\n    }\n\n#ifdef __MINGW32__\n    winsock_cleanup();\n#endif\n\n    ev_signal_stop(EV_DEFAULT, &sigint_watcher);\n    ev_signal_stop(EV_DEFAULT, &sigterm_watcher);\n    ss_free(working_dir);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/manager.h",
    "content": "/*\n * server.h - Define shadowsocks server's buffers and callbacks\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _MANAGER_H\n#define _MANAGER_H\n\n#include <ev.h>\n#include <time.h>\n#include <libcork/ds.h>\n\n#include \"jconf.h\"\n\n#include \"common.h\"\n\nstruct manager_ctx {\n    ev_io io;\n    int fd;\n    int fast_open;\n    int verbose;\n    int mode;\n    char *password;\n    char *timeout;\n    char *method;\n    char *iface;\n    char *acl;\n    char *user;\n    char *manager_address;\n    char **hosts;\n    int host_num;\n    char **nameservers;\n    int nameserver_num;\n    int mtu;\n#ifdef HAVE_SETRLIMIT\n    int nofile;\n#endif\n};\n\nstruct server {\n    char port[8];\n    char password[128];\n    uint64_t traffic;\n};\n\n#endif // _MANAGER_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/netutils.c",
    "content": "/*\n * netutils.c - Network utilities\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#include <math.h>\n\n#include <libcork/core.h>\n#include <udns.h>\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#define sleep(n) Sleep(1000 * (n))\n#else\n#include <sys/socket.h>\n#include <netdb.h>\n#include <netinet/in.h>\n#include <unistd.h>\n#endif\n\n#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_NET_IF_H) && defined(__linux__)\n#include <net/if.h>\n#include <sys/ioctl.h>\n#define SET_INTERFACE\n#endif\n\n#include \"netutils.h\"\n#include \"utils.h\"\n\n#ifndef SO_REUSEPORT\n#define SO_REUSEPORT 15\n#endif\n\nextern int verbose;\n\nstatic const char valid_label_bytes[] =\n    \"-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\";\n\n#if defined(MODULE_LOCAL)\nextern int keep_resolving;\n#endif\n\nint\nset_reuseport(int socket)\n{\n    int opt = 1;\n    return setsockopt(socket, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt));\n}\n\nsize_t\nget_sockaddr_len(struct sockaddr *addr)\n{\n    if (addr->sa_family == AF_INET) {\n        return sizeof(struct sockaddr_in);\n    } else if (addr->sa_family == AF_INET6) {\n        return sizeof(struct sockaddr_in6);\n    }\n    return 0;\n}\n\n#ifdef SET_INTERFACE\nint\nsetinterface(int socket_fd, const char *interface_name)\n{\n    struct ifreq interface;\n    memset(&interface, 0, sizeof(struct ifreq));\n    strncpy(interface.ifr_name, interface_name, IFNAMSIZ);\n    int res = setsockopt(socket_fd, SOL_SOCKET, SO_BINDTODEVICE, &interface,\n                         sizeof(struct ifreq));\n    return res;\n}\n\n#endif\n\nint\nbind_to_address(int socket_fd, const char *host)\n{\n    if (host != NULL) {\n        struct cork_ip ip;\n        struct sockaddr_storage storage;\n        memset(&storage, 0, sizeof(struct sockaddr_storage));\n        if (cork_ip_init(&ip, host) != -1) {\n            if (ip.version == 4) {\n                struct sockaddr_in *addr = (struct sockaddr_in *)&storage;\n                dns_pton(AF_INET, host, &addr->sin_addr);\n                addr->sin_family = AF_INET;\n                return bind(socket_fd, (struct sockaddr *)addr, sizeof(struct sockaddr_in));\n            } else if (ip.version == 6) {\n                struct sockaddr_in6 *addr = (struct sockaddr_in6 *)&storage;\n                dns_pton(AF_INET6, host, &addr->sin6_addr);\n                addr->sin6_family = AF_INET6;\n                return bind(socket_fd, (struct sockaddr *)addr, sizeof(struct sockaddr_in6));\n            }\n        }\n    }\n    return -1;\n}\n\nssize_t\nget_sockaddr(char *host, char *port,\n             struct sockaddr_storage *storage, int block,\n             int ipv6first)\n{\n    struct cork_ip ip;\n    if (cork_ip_init(&ip, host) != -1) {\n        if (ip.version == 4) {\n            struct sockaddr_in *addr = (struct sockaddr_in *)storage;\n            addr->sin_family = AF_INET;\n            dns_pton(AF_INET, host, &(addr->sin_addr));\n            if (port != NULL) {\n                addr->sin_port = htons(atoi(port));\n            }\n        } else if (ip.version == 6) {\n            struct sockaddr_in6 *addr = (struct sockaddr_in6 *)storage;\n            addr->sin6_family = AF_INET6;\n            dns_pton(AF_INET6, host, &(addr->sin6_addr));\n            if (port != NULL) {\n                addr->sin6_port = htons(atoi(port));\n            }\n        }\n        return 0;\n    } else {\n        struct addrinfo hints;\n        struct addrinfo *result, *rp;\n\n        memset(&hints, 0, sizeof(struct addrinfo));\n        hints.ai_family   = AF_UNSPEC;   /* Return IPv4 and IPv6 choices */\n        hints.ai_socktype = SOCK_STREAM; /* We want a TCP socket */\n\n        int err, i;\n\n        for (i = 1; i < 8; i++) {\n            err = getaddrinfo(host, port, &hints, &result);\n#if defined(MODULE_LOCAL)\n            if (!keep_resolving)\n                break;\n#endif\n            if ((!block || !err)) {\n                break;\n            } else {\n                sleep(pow(2, i));\n                LOGE(\"failed to resolve server name, wait %.0f seconds\", pow(2, i));\n            }\n        }\n\n        if (err != 0) {\n            LOGE(\"getaddrinfo: %s\", gai_strerror(err));\n            return -1;\n        }\n\n        int prefer_af = ipv6first ? AF_INET6 : AF_INET;\n        for (rp = result; rp != NULL; rp = rp->ai_next)\n            if (rp->ai_family == prefer_af) {\n                if (rp->ai_family == AF_INET)\n                    memcpy(storage, rp->ai_addr, sizeof(struct sockaddr_in));\n                else if (rp->ai_family == AF_INET6)\n                    memcpy(storage, rp->ai_addr, sizeof(struct sockaddr_in6));\n                break;\n            }\n\n        if (rp == NULL) {\n            for (rp = result; rp != NULL; rp = rp->ai_next) {\n                if (rp->ai_family == AF_INET)\n                    memcpy(storage, rp->ai_addr, sizeof(struct sockaddr_in));\n                else if (rp->ai_family == AF_INET6)\n                    memcpy(storage, rp->ai_addr, sizeof(struct sockaddr_in6));\n                break;\n            }\n        }\n\n        if (rp == NULL) {\n            LOGE(\"failed to resolve remote addr\");\n            return -1;\n        }\n\n        freeaddrinfo(result);\n        return 0;\n    }\n\n    return -1;\n}\n\nint\nsockaddr_cmp(struct sockaddr_storage *addr1,\n             struct sockaddr_storage *addr2, socklen_t len)\n{\n    struct sockaddr_in *p1_in   = (struct sockaddr_in *)addr1;\n    struct sockaddr_in *p2_in   = (struct sockaddr_in *)addr2;\n    struct sockaddr_in6 *p1_in6 = (struct sockaddr_in6 *)addr1;\n    struct sockaddr_in6 *p2_in6 = (struct sockaddr_in6 *)addr2;\n    if (p1_in->sin_family < p2_in->sin_family)\n        return -1;\n    if (p1_in->sin_family > p2_in->sin_family)\n        return 1;\n    /* compare ip4 */\n    if (p1_in->sin_family == AF_INET) {\n        /* just order it, ntohs not required */\n        if (p1_in->sin_port < p2_in->sin_port)\n            return -1;\n        if (p1_in->sin_port > p2_in->sin_port)\n            return 1;\n        return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);\n    } else if (p1_in6->sin6_family == AF_INET6) {\n        /* just order it, ntohs not required */\n        if (p1_in6->sin6_port < p2_in6->sin6_port)\n            return -1;\n        if (p1_in6->sin6_port > p2_in6->sin6_port)\n            return 1;\n        return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,\n                      INET6_SIZE);\n    } else {\n        /* eek unknown type, perform this comparison for sanity. */\n        return memcmp(addr1, addr2, len);\n    }\n}\n\nint\nsockaddr_cmp_addr(struct sockaddr_storage *addr1,\n                  struct sockaddr_storage *addr2, socklen_t len)\n{\n    struct sockaddr_in *p1_in   = (struct sockaddr_in *)addr1;\n    struct sockaddr_in *p2_in   = (struct sockaddr_in *)addr2;\n    struct sockaddr_in6 *p1_in6 = (struct sockaddr_in6 *)addr1;\n    struct sockaddr_in6 *p2_in6 = (struct sockaddr_in6 *)addr2;\n    if (p1_in->sin_family < p2_in->sin_family)\n        return -1;\n    if (p1_in->sin_family > p2_in->sin_family)\n        return 1;\n    /* compare ip4 */\n    if (p1_in->sin_family == AF_INET) {\n        return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);\n    } else if (p1_in6->sin6_family == AF_INET6) {\n        return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,\n                      INET6_SIZE);\n    } else {\n        /* eek unknown type, perform this comparison for sanity. */\n        return memcmp(addr1, addr2, len);\n    }\n}\n\nint\nvalidate_hostname(const char *hostname, const int hostname_len)\n{\n    if (hostname == NULL)\n        return 0;\n\n    if (hostname_len < 1 || hostname_len > 255)\n        return 0;\n\n    if (hostname[0] == '.')\n        return 0;\n\n    const char *label = hostname;\n    while (label < hostname + hostname_len) {\n        size_t label_len = hostname_len - (label - hostname);\n        char *next_dot   = strchr(label, '.');\n        if (next_dot != NULL)\n            label_len = next_dot - label;\n\n        if (label + label_len > hostname + hostname_len)\n            return 0;\n\n        if (label_len > 63 || label_len < 1)\n            return 0;\n\n        if (label[0] == '-' || label[label_len - 1] == '-')\n            return 0;\n\n        if (strspn(label, valid_label_bytes) < label_len)\n            return 0;\n\n        label += label_len + 1;\n    }\n\n    return 1;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/netutils.h",
    "content": "/*\n * netutils.h - Network utilities\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _NETUTILS_H\n#define _NETUTILS_H\n\n#if defined(__linux__)\n#include <netdb.h>\n#elif !defined(__MINGW32__)\n#include <netinet/tcp.h>\n#endif\n\n// only enable TCP_FASTOPEN on linux\n#if defined(__linux__)\n#include <linux/tcp.h>\n/*  conditional define for TCP_FASTOPEN */\n#ifndef TCP_FASTOPEN\n#define TCP_FASTOPEN   23\n#endif\n/*  conditional define for MSG_FASTOPEN */\n#ifndef MSG_FASTOPEN\n#define MSG_FASTOPEN   0x20000000\n#endif\n#elif !defined(__APPLE__)\n#ifdef TCP_FASTOPEN\n#undef TCP_FASTOPEN\n#endif\n#endif\n\n/* Backward compatibility for MPTCP_ENABLED between kernel 3 & 4 */\n#ifndef MPTCP_ENABLED\n#ifdef TCP_CC_INFO\n#define MPTCP_ENABLED 42\n#else\n#define MPTCP_ENABLED 26\n#endif\n#endif\n\n/** byte size of ip4 address */\n#define INET_SIZE 4\n/** byte size of ip6 address */\n#define INET6_SIZE 16\n\nsize_t get_sockaddr_len(struct sockaddr *addr);\nssize_t get_sockaddr(char *host, char *port,\n                     struct sockaddr_storage *storage, int block,\n                     int ipv6first);\nint set_reuseport(int socket);\n\n#ifdef SET_INTERFACE\nint setinterface(int socket_fd, const char *interface_name);\n#endif\n\nint bind_to_address(int socket_fd, const char *address);\n\n/**\n * Compare two sockaddrs. Imposes an ordering on the addresses.\n * Compares address and port.\n * @param addr1: address 1.\n * @param addr2: address 2.\n * @param len: lengths of addr.\n * @return: 0 if addr1 == addr2. -1 if addr1 is smaller, +1 if larger.\n */\nint sockaddr_cmp(struct sockaddr_storage *addr1,\n                 struct sockaddr_storage *addr2, socklen_t len);\n\n/**\n * Compare two sockaddrs. Compares address, not the port.\n * @param addr1: address 1.\n * @param addr2: address 2.\n * @param len: lengths of addr.\n * @return: 0 if addr1 == addr2. -1 if addr1 is smaller, +1 if larger.\n */\nint sockaddr_cmp_addr(struct sockaddr_storage *addr1,\n                      struct sockaddr_storage *addr2, socklen_t len);\n\nint validate_hostname(const char *hostname, const int hostname_len);\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/auth.c",
    "content": "#include <string.h>\n#include <time.h>\n#include \"auth.h\"\n#include \"obfsutil.h\"\n#include \"crc32.h\"\n#include \"base64.h\"\n#include \"encrypt.h\"\n\nstatic int auth_simple_pack_unit_size = 2000;\ntypedef int (*hmac_with_key_func)(char *auth, char *msg, int msg_len, uint8_t *auth_key, int key_len);\ntypedef int (*hash_func)(char *auth, char *msg, int msg_len);\n\ntypedef struct auth_simple_global_data {\n    uint8_t local_client_id[8];\n    uint32_t connection_id;\n}auth_simple_global_data;\n\ntypedef struct auth_simple_local_data {\n    int has_sent_header;\n    char * recv_buffer;\n    int recv_buffer_size;\n    uint32_t recv_id;\n    uint32_t pack_id;\n    char * salt;\n    uint8_t * user_key;\n    char uid[4];\n    int user_key_len;\n    hmac_with_key_func hmac;\n    hash_func hash;\n    int hash_len;\n    int last_data_len;\n}auth_simple_local_data;\n\nvoid auth_simple_local_data_init(auth_simple_local_data* local) {\n    local->has_sent_header = 0;\n    local->recv_buffer = (char*)malloc(16384);\n    local->recv_buffer_size = 0;\n    local->recv_id = 1;\n    local->pack_id = 1;\n    local->salt = \"\";\n    local->user_key = 0;\n    local->user_key_len = 0;\n    local->hmac = 0;\n    local->hash = 0;\n    local->hash_len = 0;\n    local->salt = \"\";\n}\n\nvoid * auth_simple_init_data() {\n    auth_simple_global_data *global = (auth_simple_global_data*)malloc(sizeof(auth_simple_global_data));\n    rand_bytes(global->local_client_id, 8);\n    rand_bytes((uint8_t*)&global->connection_id, 4);\n    global->connection_id &= 0xFFFFFF;\n    return global;\n}\n\nobfs * auth_simple_new_obfs() {\n    obfs * self = new_obfs();\n    self->l_data = malloc(sizeof(auth_simple_local_data));\n    auth_simple_local_data_init((auth_simple_local_data*)self->l_data);\n    return self;\n}\n\nobfs * auth_aes128_md5_new_obfs() {\n    obfs * self = new_obfs();\n    self->l_data = malloc(sizeof(auth_simple_local_data));\n    auth_simple_local_data_init((auth_simple_local_data*)self->l_data);\n    ((auth_simple_local_data*)self->l_data)->hmac = ss_md5_hmac_with_key;\n    ((auth_simple_local_data*)self->l_data)->hash = ss_md5_hash_func;\n    ((auth_simple_local_data*)self->l_data)->hash_len = 16;\n    ((auth_simple_local_data*)self->l_data)->salt = \"auth_aes128_md5\";\n    return self;\n}\n\nobfs * auth_aes128_sha1_new_obfs() {\n    obfs * self = new_obfs();\n    self->l_data = malloc(sizeof(auth_simple_local_data));\n    auth_simple_local_data_init((auth_simple_local_data*)self->l_data);\n    ((auth_simple_local_data*)self->l_data)->hmac = ss_sha1_hmac_with_key;\n    ((auth_simple_local_data*)self->l_data)->hash = ss_sha1_hash_func;\n    ((auth_simple_local_data*)self->l_data)->hash_len = 20;\n    ((auth_simple_local_data*)self->l_data)->salt = \"auth_aes128_sha1\";\n    return self;\n}\n\nint auth_aes128_sha1_get_overhead(obfs *self) {\n    return 9;\n}\n\nvoid auth_simple_dispose(obfs *self) {\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    if (local->recv_buffer != NULL) {\n        free(local->recv_buffer);\n        local->recv_buffer = NULL;\n    }\n    if (local->user_key != NULL) {\n        free(local->user_key);\n        local->user_key = NULL;\n    }\n    free(local);\n    self->l_data = NULL;\n    dispose_obfs(self);\n}\n\nint auth_simple_pack_data(char *data, int datalength, char *outdata) {\n    unsigned char rand_len = (xorshift128plus() & 0xF) + 1;\n    int out_size = rand_len + datalength + 6;\n    outdata[0] = (char)(out_size >> 8);\n    outdata[1] = (char)(out_size);\n    outdata[2] = (char)(rand_len);\n    memmove(outdata + rand_len + 2, data, datalength);\n    fillcrc32((unsigned char *)outdata, (unsigned int)out_size);\n    return out_size;\n}\n\nint auth_simple_pack_auth_data(auth_simple_global_data *global, char *data, int datalength, char *outdata) {\n    unsigned char rand_len = (xorshift128plus() & 0xF) + 1;\n    int out_size = rand_len + datalength + 6 + 12;\n    outdata[0] = (char)(out_size >> 8);\n    outdata[1] = (char)(out_size);\n    outdata[2] = (char)(rand_len);\n    ++global->connection_id;\n    if (global->connection_id > 0xFF000000) {\n        rand_bytes(global->local_client_id, 8);\n        rand_bytes((uint8_t*)&global->connection_id, 4);\n        global->connection_id &= 0xFFFFFF;\n    }\n    time_t t = time(NULL);\n    memintcopy_lt(outdata + rand_len + 2, (uint32_t)t);\n    memmove(outdata + rand_len + 2 + 4, global->local_client_id, 4);\n    memintcopy_lt(outdata + rand_len + 2 + 8, global->connection_id);\n    memmove(outdata + rand_len + 2 + 12, data, datalength);\n    fillcrc32((unsigned char *)outdata, (unsigned int)out_size);\n    return out_size;\n}\n\nint auth_simple_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc((size_t)(datalength * 2 + 64));\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    if (len > 0 && local->has_sent_header == 0) {\n        int head_size = get_head_size(plaindata, datalength, 30);\n        if (head_size > datalength)\n            head_size = datalength;\n        pack_len = auth_simple_pack_auth_data((auth_simple_global_data *)self->server.g_data, data, head_size, buffer);\n        buffer += pack_len;\n        data += head_size;\n        len -= head_size;\n        local->has_sent_header = 1;\n    }\n    while ( len > auth_simple_pack_unit_size ) {\n        pack_len = auth_simple_pack_data(data, auth_simple_pack_unit_size, buffer);\n        buffer += pack_len;\n        data += auth_simple_pack_unit_size;\n        len -= auth_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = auth_simple_pack_data(data, len, buffer);\n        buffer += pack_len;\n    }\n    len = (int)(buffer - out_buffer);\n    if ((int)(*capacity) < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = (size_t)(len * 2));\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_simple_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    char * out_buffer = (char*)malloc((size_t)local->recv_buffer_size);\n    char * buffer = out_buffer;\n    while (local->recv_buffer_size > 2) {\n        int length = ((int)recv_buffer[0] << 8) | recv_buffer[1];\n        if (length >= 8192 || length < 7) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        int crc = (int) crc32((unsigned char*)recv_buffer, (unsigned int)length);\n        if (crc != -1) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        int data_size = length - recv_buffer[2] - 6;\n        memmove(buffer, recv_buffer + 2 + recv_buffer[2], data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len = (int)(buffer - out_buffer);\n    if ((int)*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = (size_t)(len * 2));\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\n\nint auth_sha1_pack_data(char *data, int datalength, char *outdata) {\n    unsigned char rand_len = (xorshift128plus() & 0xF) + 1;\n    int out_size = rand_len + datalength + 6;\n    outdata[0] = (char)(out_size >> 8);\n    outdata[1] = (char)out_size;\n    outdata[2] = (char)rand_len;\n    memmove(outdata + rand_len + 2, data, datalength);\n    filladler32((unsigned char *)outdata, (unsigned int)out_size);\n    return out_size;\n}\n\nint auth_sha1_pack_auth_data(auth_simple_global_data *global, server_info *server, char *data, int datalength, char *outdata) {\n    unsigned char rand_len = (xorshift128plus() & 0x7F) + 1;\n    int data_offset = rand_len + 4 + 2;\n    int out_size = data_offset + datalength + 12 + OBFS_HMAC_SHA1_LEN;\n    fillcrc32to((unsigned char *)server->key, (unsigned int)server->key_len, (unsigned char *)outdata);\n    outdata[4] = (char)(out_size >> 8);\n    outdata[5] = (char)out_size;\n    outdata[6] = (char)rand_len;\n    ++global->connection_id;\n    if (global->connection_id > 0xFF000000) {\n        rand_bytes(global->local_client_id, 8);\n        rand_bytes((uint8_t*)&global->connection_id, 4);\n        global->connection_id &= 0xFFFFFF;\n    }\n    time_t t = time(NULL);\n    memintcopy_lt(outdata + data_offset, (uint32_t)t);\n    memmove(outdata + data_offset + 4, global->local_client_id, 4);\n    memintcopy_lt(outdata + data_offset + 8, global->connection_id);\n    memmove(outdata + data_offset + 12, data, datalength);\n    char hash[SHA1_BYTES];\n    ss_sha1_hmac(hash, outdata, out_size - OBFS_HMAC_SHA1_LEN, server->iv, (int)server->iv_len, server->key, (int)server->key_len);\n    memcpy(outdata + out_size - OBFS_HMAC_SHA1_LEN, hash, OBFS_HMAC_SHA1_LEN);\n    return out_size;\n}\n\nint auth_sha1_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc((size_t)(datalength * 2 + 256));\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    if (len > 0 && local->has_sent_header == 0) {\n        int head_size = get_head_size(plaindata, datalength, 30);\n        if (head_size > datalength)\n            head_size = datalength;\n        pack_len = auth_sha1_pack_auth_data((auth_simple_global_data *)self->server.g_data, &self->server, data, head_size, buffer);\n        buffer += pack_len;\n        data += head_size;\n        len -= head_size;\n        local->has_sent_header = 1;\n    }\n    while ( len > auth_simple_pack_unit_size ) {\n        pack_len = auth_sha1_pack_data(data, auth_simple_pack_unit_size, buffer);\n        buffer += pack_len;\n        data += auth_simple_pack_unit_size;\n        len -= auth_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = auth_sha1_pack_data(data, len, buffer);\n        buffer += pack_len;\n    }\n    len = (int)(buffer - out_buffer);\n    if ((int)*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = (size_t)(len * 2));\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_sha1_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    char * out_buffer = (char*)malloc((size_t)local->recv_buffer_size);\n    char * buffer = out_buffer;\n    while (local->recv_buffer_size > 2) {\n        int length = ((int)recv_buffer[0] << 8) | recv_buffer[1];\n        if (length >= 8192 || length < 7) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        if (checkadler32((unsigned char*)recv_buffer, (unsigned int)length) == 0) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        int pos = recv_buffer[2] + 2;\n        int data_size = length - pos - 4;\n        memmove(buffer, recv_buffer + pos, data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len = (int)(buffer - out_buffer);\n    if ((int)*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = (size_t)(len * 2));\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_sha1_v2_pack_data(char *data, int datalength, char *outdata) {\n    unsigned int rand_len = (datalength > 1300 ? 0 : datalength > 400 ? (xorshift128plus() & 0x7F) : (xorshift128plus() & 0x3FF)) + 1;\n    int out_size = (int)rand_len + datalength + 6;\n    outdata[0] = (char)(out_size >> 8);\n    outdata[1] = (char)out_size;\n    if (rand_len < 128)\n    {\n        outdata[2] = (char)rand_len;\n    }\n    else\n    {\n        outdata[2] = (char)0xFF;\n        outdata[3] = (char)(rand_len >> 8);\n        outdata[4] = (char)rand_len;\n    }\n    memmove(outdata + rand_len + 2, data, datalength);\n    filladler32((unsigned char *)outdata, (unsigned int)out_size);\n    return out_size;\n}\n\nint auth_sha1_v2_pack_auth_data(auth_simple_global_data *global, server_info *server, char *data, int datalength, char *outdata) {\n    unsigned int rand_len = (datalength > 1300 ? 0 : datalength > 400 ? (xorshift128plus() & 0x7F) : (xorshift128plus() & 0x3FF)) + 1;\n    int data_offset = (int)rand_len + 4 + 2;\n    int out_size = data_offset + datalength + 12 + OBFS_HMAC_SHA1_LEN;\n    const char* salt = \"auth_sha1_v2\";\n    int salt_len = (int) strlen(salt);\n    unsigned char *crc_salt = (unsigned char*)malloc((size_t)salt_len + server->key_len);\n    memcpy(crc_salt, salt, salt_len);\n    memcpy(crc_salt + salt_len, server->key, server->key_len);\n    fillcrc32to(crc_salt, (unsigned int)((size_t)salt_len + server->key_len), (unsigned char *)outdata);\n    free(crc_salt);\n    outdata[4] = (char)(out_size >> 8);\n    outdata[5] = (char)out_size;\n    if (rand_len < 128)\n    {\n        outdata[6] = (char)rand_len;\n    }\n    else\n    {\n        outdata[6] = (char)0xFF;\n        outdata[7] = (char)(rand_len >> 8);\n        outdata[8] = (char)rand_len;\n    }\n    ++global->connection_id;\n    if (global->connection_id > 0xFF000000) {\n        rand_bytes(global->local_client_id, 8);\n        rand_bytes((uint8_t*)&global->connection_id, 4);\n        global->connection_id &= 0xFFFFFF;\n    }\n    memmove(outdata + data_offset, global->local_client_id, 8);\n    memintcopy_lt(outdata + data_offset + 8, global->connection_id);\n    memmove(outdata + data_offset + 12, data, datalength);\n    char hash[SHA1_BYTES];\n    ss_sha1_hmac(hash, outdata, out_size - OBFS_HMAC_SHA1_LEN, server->iv, (int)server->iv_len, server->key, (int)server->key_len);\n    memcpy(outdata + out_size - OBFS_HMAC_SHA1_LEN, hash, OBFS_HMAC_SHA1_LEN);\n    return out_size;\n}\n\nint auth_sha1_v2_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc((size_t)(datalength * 2 + 4096));\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    if (len > 0 && local->has_sent_header == 0) {\n        int head_size = get_head_size(plaindata, datalength, 30);\n        if (head_size > datalength)\n            head_size = datalength;\n        pack_len = auth_sha1_v2_pack_auth_data((auth_simple_global_data *)self->server.g_data, &self->server, data, head_size, buffer);\n        buffer += pack_len;\n        data += head_size;\n        len -= head_size;\n        local->has_sent_header = 1;\n    }\n    while ( len > auth_simple_pack_unit_size ) {\n        pack_len = auth_sha1_v2_pack_data(data, auth_simple_pack_unit_size, buffer);\n        buffer += pack_len;\n        data += auth_simple_pack_unit_size;\n        len -= auth_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = auth_sha1_v2_pack_data(data, len, buffer);\n        buffer += pack_len;\n    }\n    len = (int)(buffer - out_buffer);\n    if ((int)*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = (size_t)(len * 2));\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_sha1_v2_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    char * out_buffer = (char*)malloc((size_t)local->recv_buffer_size);\n    char * buffer = out_buffer;\n    char error = 0;\n    while (local->recv_buffer_size > 2) {\n        int length = ((int)recv_buffer[0] << 8) | recv_buffer[1];\n        if (length >= 8192 || length < 7) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        if (checkadler32((unsigned char*)recv_buffer, (unsigned int)length) == 0) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        int pos = recv_buffer[2];\n        if (pos < 255)\n        {\n            pos += 2;\n        }\n        else\n        {\n            pos = ((recv_buffer[3] << 8) | recv_buffer[4]) + 2;\n        }\n        int data_size = length - pos - 4;\n        memmove(buffer, recv_buffer + pos, data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len;\n    if (error == 0) {\n        len = (int)(buffer - out_buffer);\n        if ((int)*capacity < len) {\n            *pplaindata = (char*)realloc(*pplaindata, *capacity = (size_t)(len * 2));\n            plaindata = *pplaindata;\n        }\n        memmove(plaindata, out_buffer, len);\n    } else {\n        len = -1;\n    }\n    free(out_buffer);\n    return len;\n}\n\nint auth_sha1_v4_pack_data(char *data, int datalength, char *outdata) {\n    unsigned int rand_len = (datalength > 1300 ? 0 : datalength > 400 ? (xorshift128plus() & 0x7F) : (xorshift128plus() & 0x3FF)) + 1;\n    int out_size = (int)rand_len + datalength + 8;\n    outdata[0] = (char)(out_size >> 8);\n    outdata[1] = (char)out_size;\n    uint32_t crc_val = crc32((unsigned char*)outdata, 2);\n    outdata[2] = (char)crc_val;\n    outdata[3] = (char)(crc_val >> 8);\n    if (rand_len < 128)\n    {\n        outdata[4] = (char)rand_len;\n    }\n    else\n    {\n        outdata[4] = (char)0xFF;\n        outdata[5] = (char)(rand_len >> 8);\n        outdata[6] = (char)rand_len;\n    }\n    memmove(outdata + rand_len + 4, data, datalength);\n    filladler32((unsigned char *)outdata, (unsigned int)out_size);\n    return out_size;\n}\n\nint auth_sha1_v4_pack_auth_data(auth_simple_global_data *global, server_info *server, char *data, int datalength, char *outdata) {\n    unsigned int rand_len = (datalength > 1300 ? 0 : datalength > 400 ? (xorshift128plus() & 0x7F) : (xorshift128plus() & 0x3FF)) + 1;\n    int data_offset = (int)rand_len + 4 + 2;\n    int out_size = data_offset + datalength + 12 + OBFS_HMAC_SHA1_LEN;\n    const char* salt = \"auth_sha1_v4\";\n    int salt_len = (int)strlen(salt);\n    unsigned char *crc_salt = (unsigned char*)malloc((size_t)salt_len + server->key_len + 2);\n    crc_salt[0] = (unsigned char)(outdata[0] = (char)(out_size >> 8));\n    crc_salt[1] = (unsigned char)(outdata[1] = (char)out_size);\n\n    memcpy(crc_salt + 2, salt, salt_len);\n    memcpy(crc_salt + salt_len + 2, server->key, server->key_len);\n    fillcrc32to(crc_salt, (unsigned int)((size_t)salt_len + server->key_len + 2), (unsigned char *)outdata + 2);\n    free(crc_salt);\n    if (rand_len < 128)\n    {\n        outdata[6] = (char)rand_len;\n    }\n    else\n    {\n        outdata[6] = (char)0xFF;\n        outdata[7] = (char)(rand_len >> 8);\n        outdata[8] = (char)rand_len;\n    }\n    ++global->connection_id;\n    if (global->connection_id > 0xFF000000) {\n        rand_bytes(global->local_client_id, 8);\n        rand_bytes((uint8_t*)&global->connection_id, 4);\n        global->connection_id &= 0xFFFFFF;\n    }\n    time_t t = time(NULL);\n    memintcopy_lt(outdata + data_offset, (uint32_t)t);\n    memmove(outdata + data_offset + 4, global->local_client_id, 4);\n    memintcopy_lt(outdata + data_offset + 8, global->connection_id);\n    memmove(outdata + data_offset + 12, data, datalength);\n    char hash[SHA1_BYTES];\n    ss_sha1_hmac(hash, outdata, out_size - OBFS_HMAC_SHA1_LEN, server->iv, (int)server->iv_len, server->key, (int)server->key_len);\n    memcpy(outdata + out_size - OBFS_HMAC_SHA1_LEN, hash, OBFS_HMAC_SHA1_LEN);\n    return out_size;\n}\n\nint auth_sha1_v4_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc((size_t)(datalength * 2 + 4096));\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    if (len > 0 && local->has_sent_header == 0) {\n        int head_size = get_head_size(plaindata, datalength, 30);\n        if (head_size > datalength)\n            head_size = datalength;\n        pack_len = auth_sha1_v4_pack_auth_data((auth_simple_global_data *)self->server.g_data, &self->server, data, head_size, buffer);\n        buffer += pack_len;\n        data += head_size;\n        len -= head_size;\n        local->has_sent_header = 1;\n    }\n    while ( len > auth_simple_pack_unit_size ) {\n        pack_len = auth_sha1_v4_pack_data(data, auth_simple_pack_unit_size, buffer);\n        buffer += pack_len;\n        data += auth_simple_pack_unit_size;\n        len -= auth_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = auth_sha1_v4_pack_data(data, len, buffer);\n        buffer += pack_len;\n    }\n    len = (int)(buffer - out_buffer);\n    if ((int)*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = (size_t)(len * 2));\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_sha1_v4_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    char * out_buffer = (char*)malloc((size_t)local->recv_buffer_size);\n    char * buffer = out_buffer;\n    char error = 0;\n    while (local->recv_buffer_size > 4) {\n        uint32_t crc_val = crc32((unsigned char*)recv_buffer, 2);\n        if ((((uint32_t)recv_buffer[3] << 8) | recv_buffer[2]) != (crc_val & 0xffff)) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        int length = ((int)recv_buffer[0] << 8) | recv_buffer[1];\n        if (length >= 8192 || length < 7) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        if (checkadler32((unsigned char*)recv_buffer, (unsigned int)length) == 0) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        int pos = recv_buffer[4];\n        if (pos < 255)\n        {\n            pos += 4;\n        }\n        else\n        {\n            pos = (((int)recv_buffer[5] << 8) | recv_buffer[6]) + 4;\n        }\n        int data_size = length - pos - 4;\n        memmove(buffer, recv_buffer + pos, data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len;\n    if (error == 0) {\n        len = (int)(buffer - out_buffer);\n        if ((int)*capacity < len) {\n            *pplaindata = (char*)realloc(*pplaindata, *capacity = (size_t)(len * 2));\n            plaindata = *pplaindata;\n        }\n        memmove(plaindata, out_buffer, len);\n    } else {\n        len = -1;\n    }\n    free(out_buffer);\n    return len;\n}\n\nunsigned int get_rand_len(int datalength, int fulldatalength, auth_simple_local_data *local, server_info *server) {\n    if (datalength > 1300 || local->last_data_len > 1300 || fulldatalength >= (int)server->buffer_size)\n        return 0;\n    if (datalength > 1100)\n        return xorshift128plus() & 0x7F;\n    if (datalength > 900)\n        return xorshift128plus() & 0xFF;\n    if (datalength > 400)\n        return xorshift128plus() & 0x1FF;\n    return xorshift128plus() & 0x3FF;\n}\n\nint auth_aes128_sha1_pack_data(char *data, int datalength, int fulldatalength, char *outdata, auth_simple_local_data *local, server_info *server) {\n    unsigned int rand_len = get_rand_len(datalength, fulldatalength, local, server) + 1;\n    int out_size = (int)rand_len + datalength + 8;\n    memcpy(outdata + rand_len + 4, data, datalength);\n    outdata[0] = (char)out_size;\n    outdata[1] = (char)(out_size >> 8);\n    uint8_t key_len = (uint8_t)(local->user_key_len + 4);\n    uint8_t *key = (uint8_t*)malloc(key_len);\n    memcpy(key, local->user_key, local->user_key_len);\n    memintcopy_lt(key + key_len - 4, local->pack_id);\n\n    {\n        uint8_t *rnd_data = (uint8_t *)malloc(rand_len);\n        rand_bytes(rnd_data, (int)rand_len);\n        memcpy(outdata + 4, rnd_data, rand_len);\n        free(rnd_data);\n    }\n\n    {\n        char hash[20];\n        local->hmac(hash, outdata, 2, key, key_len);\n        memcpy(outdata + 2, hash, 2);\n    }\n\n    if (rand_len < 128)\n    {\n        outdata[4] = (char)rand_len;\n    }\n    else\n    {\n        outdata[4] = (char)0xFF;\n        outdata[5] = (char)rand_len;\n        outdata[6] = (char)(rand_len >> 8);\n    }\n    ++local->pack_id;\n\n    {\n        char hash[20];\n        local->hmac(hash, outdata, out_size - 4, key, key_len);\n        memcpy(outdata + out_size - 4, hash, 4);\n    }\n    free(key);\n\n    return out_size;\n}\n\nint auth_aes128_sha1_pack_auth_data(auth_simple_global_data *global, server_info *server, auth_simple_local_data *local, char *data, int datalength, char *outdata) {\n    unsigned int rand_len = (datalength > 400 ? (xorshift128plus() & 0x1FF) : (xorshift128plus() & 0x3FF));\n    int data_offset = (int)rand_len + 16 + 4 + 4 + 7;\n    int out_size = data_offset + datalength + 4;\n    const char* salt = local->salt;\n\n    char encrypt[24];\n    char encrypt_data[16];\n\n    uint8_t *key = (uint8_t*)malloc(server->iv_len + server->key_len);\n    uint8_t key_len = (uint8_t)(server->iv_len + server->key_len);\n    memcpy(key, server->iv, server->iv_len);\n    memcpy(key + server->iv_len, server->key, server->key_len);\n\n    {\n        uint8_t *rnd_data = (uint8_t *)malloc(rand_len);\n        rand_bytes(rnd_data, (int)rand_len);\n        memcpy(outdata + data_offset - rand_len, rnd_data, rand_len);\n        free(rnd_data);\n    }\n\n    ++global->connection_id;\n    if (global->connection_id > 0xFF000000) {\n        rand_bytes(global->local_client_id, 8);\n        rand_bytes((uint8_t*)&global->connection_id, 4);\n        global->connection_id &= 0xFFFFFF;\n    }\n    time_t t = time(NULL);\n    memintcopy_lt(encrypt, (uint32_t)t);\n    memcpy(encrypt + 4, global->local_client_id, 4);\n    memintcopy_lt(encrypt + 8, global->connection_id);\n    encrypt[12] = (char)out_size;\n    encrypt[13] = (char)(out_size >> 8);\n    encrypt[14] = (char)rand_len;\n    encrypt[15] = (char)(rand_len >> 8);\n\n    {\n        if (local->user_key == NULL) {\n            if(server->param != NULL && server->param[0] != 0) {\n                char *param = server->param;\n                char *delim = strchr(param, ':');\n                if(delim != NULL) {\n                    char uid_str[16] = \"\";\n                    strncpy(uid_str, param, delim - param);\n                    char key_str[128];\n                    strcpy(key_str, delim + 1);\n                    long uid_long = strtol(uid_str, NULL, 10);\n                    memintcopy_lt(local->uid, (uint32_t)uid_long);\n\n                    char hash[21] = {0};\n                    local->hash(hash, key_str, (int)strlen(key_str));\n\n                    local->user_key_len = local->hash_len;\n                    local->user_key = (uint8_t*)malloc((size_t)local->user_key_len);\n                    memcpy(local->user_key, hash, local->hash_len);\n                }\n            }\n            if (local->user_key == NULL) {\n                rand_bytes((uint8_t *)local->uid, 4);\n\n                local->user_key_len = (int)server->key_len;\n                local->user_key = (uint8_t*)malloc((size_t)local->user_key_len);\n                memcpy(local->user_key, server->key, local->user_key_len);\n            }\n        }\n\n        char encrypt_key_base64[256] = {0};\n        unsigned char *encrypt_key = (unsigned char *)malloc(local->user_key_len);\n        memcpy(encrypt_key, local->user_key, local->user_key_len);\n        base64_encode(encrypt_key, (unsigned int)local->user_key_len, encrypt_key_base64);\n        free(encrypt_key);\n\n        int base64_len;\n        base64_len = (local->user_key_len + 2) / 3 * 4;\n        memcpy(encrypt_key_base64 + base64_len, salt, strlen(salt));\n\n        char enc_key[16];\n        int enc_key_len = base64_len + (int)strlen(salt);\n        bytes_to_key_with_size(encrypt_key_base64, (size_t)enc_key_len, (uint8_t*)enc_key, 16);\n        ss_aes_128_cbc(encrypt, encrypt_data, enc_key);\n        memcpy(encrypt + 4, encrypt_data, 16);\n        memcpy(encrypt, local->uid, 4);\n    }\n\n    {\n        char hash[20];\n        local->hmac(hash, encrypt, 20, key, key_len);\n        memcpy(encrypt + 20, hash, 4);\n    }\n\n    {\n        rand_bytes((uint8_t*)outdata, 1);\n        char hash[20];\n        local->hmac(hash, (char *)outdata, 1, key, key_len);\n        memcpy(outdata + 1, hash, 6);\n    }\n\n    memcpy(outdata + 7, encrypt, 24);\n    memcpy(outdata + data_offset, data, datalength);\n\n    {\n        char hash[20];\n        local->hmac(hash, outdata, out_size - 4, local->user_key, local->user_key_len);\n        memmove(outdata + out_size - 4, hash, 4);\n    }\n    free(key);\n\n    return out_size;\n}\n\nint auth_aes128_sha1_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc((size_t)(datalength * 2 + 4096));\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    if (len > 0 && local->has_sent_header == 0) {\n        int head_size = 1200;\n        if (head_size > datalength)\n            head_size = datalength;\n        pack_len = auth_aes128_sha1_pack_auth_data((auth_simple_global_data *)self->server.g_data, &self->server, local, data, head_size, buffer);\n        buffer += pack_len;\n        data += head_size;\n        len -= head_size;\n        local->has_sent_header = 1;\n    }\n    while ( len > auth_simple_pack_unit_size ) {\n        pack_len = auth_aes128_sha1_pack_data(data, auth_simple_pack_unit_size, datalength, buffer, local, &self->server);\n        buffer += pack_len;\n        data += auth_simple_pack_unit_size;\n        len -= auth_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = auth_aes128_sha1_pack_data(data, len, datalength, buffer, local, &self->server);\n        buffer += pack_len;\n    }\n    len = (int)(buffer - out_buffer);\n    if ((int)*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = (size_t)(len * 2));\n        plaindata = *pplaindata;\n    }\n    local->last_data_len = datalength;\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_aes128_sha1_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    //server_info *server = (server_info*)&self->server;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    int key_len = local->user_key_len + 4;\n    uint8_t *key = (uint8_t*)malloc((size_t)key_len);\n    memcpy(key, local->user_key, local->user_key_len);\n\n    char * out_buffer = (char*)malloc((size_t)local->recv_buffer_size);\n    char * buffer = out_buffer;\n    char error = 0;\n    while (local->recv_buffer_size > 4) {\n        memintcopy_lt(key + key_len - 4, local->recv_id);\n\n        {\n            char hash[20];\n            local->hmac(hash, (char*)recv_buffer, 2, key, key_len);\n\n            if (memcmp(hash, recv_buffer + 2, 2)) {\n                local->recv_buffer_size = 0;\n                error = 1;\n                break;\n            }\n        }\n\n        int length = ((int)recv_buffer[1] << 8) + recv_buffer[0];\n        if (length >= 8192 || length < 8) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        {\n            char hash[20];\n            local->hmac(hash, (char *)recv_buffer, length - 4, key, key_len);\n            if (memcmp(hash, recv_buffer + length - 4, 4))\n            {\n                local->recv_buffer_size = 0;\n                error = 1;\n                break;\n            }\n        }\n\n        ++local->recv_id;\n        int pos = recv_buffer[4];\n        if (pos < 255)\n        {\n            pos += 4;\n        }\n        else\n        {\n            pos = (((int)recv_buffer[6] << 8) | recv_buffer[5]) + 4;\n        }\n        int data_size = length - pos - 4;\n        memmove(buffer, recv_buffer + pos, data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len;\n    if (error == 0) {\n        len = (int)(buffer - out_buffer);\n        if ((int)*capacity < len) {\n            *pplaindata = (char*)realloc(*pplaindata, *capacity = (size_t)(len * 2));\n            plaindata = *pplaindata;\n        }\n        memmove(plaindata, out_buffer, len);\n    } else {\n        len = -1;\n    }\n    free(out_buffer);\n    free(key);\n    return len;\n}\n\nint auth_aes128_sha1_client_udp_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc((size_t)(datalength + 8));\n\n    if (local->user_key == NULL) {\n        if(self->server.param != NULL && self->server.param[0] != 0) {\n            char *param = self->server.param;\n            char *delim = strchr(param, ':');\n            if(delim != NULL) {\n                char uid_str[16] = \"\";\n                strncpy(uid_str, param, delim - param);\n                char key_str[128];\n                strcpy(key_str, delim + 1);\n                long uid_long = strtol(uid_str, NULL, 10);\n                memintcopy_lt(local->uid, (uint32_t)uid_long);\n\n                char hash[21] = {0};\n                local->hash(hash, key_str, (int)strlen(key_str));\n\n                local->user_key_len = local->hash_len;\n                local->user_key = (uint8_t*)malloc((size_t)local->user_key_len);\n                memcpy(local->user_key, hash, local->hash_len);\n            }\n        }\n        if (local->user_key == NULL) {\n            rand_bytes((uint8_t *)local->uid, 4);\n\n            local->user_key_len = (int)self->server.key_len;\n            local->user_key = (uint8_t*)malloc((size_t)local->user_key_len);\n            memcpy(local->user_key, self->server.key, local->user_key_len);\n        }\n    }\n\n    int outlength = datalength + 8;\n    memmove(out_buffer, plaindata, datalength);\n    memmove(out_buffer + datalength, local->uid, 4);\n\n    {\n        char hash[20];\n        local->hmac(hash, out_buffer, outlength - 4, local->user_key, local->user_key_len);\n        memmove(out_buffer + outlength - 4, hash, 4);\n    }\n\n    if ((int)*capacity < outlength) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = (size_t)(outlength * 2));\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, outlength);\n    free(out_buffer);\n    return outlength;\n}\n\nint auth_aes128_sha1_client_udp_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    if (datalength <= 4)\n        return 0;\n\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n\n    char hash[20];\n    local->hmac(hash, plaindata, datalength - 4, self->server.key, (int)self->server.key_len);\n\n    if (memcmp(hash, plaindata + datalength - 4, 4))\n    {\n        return 0;\n    }\n\n    return datalength - 4;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/auth.h",
    "content": "/*\n * auth.h - Define shadowsocksR server's buffers and callbacks\n *\n * Copyright (C) 2015 - 2016, Break Wa11 <mmgac001@gmail.com>\n */\n\n#ifndef _OBFS_AUTH_H\n#define _OBFS_AUTH_H\n\n#include \"obfs.h\"\n\nvoid * auth_simple_init_data();\nobfs * auth_simple_new_obfs();\nobfs * auth_aes128_md5_new_obfs();\nobfs * auth_aes128_sha1_new_obfs();\nvoid auth_simple_dispose(obfs *self);\n\n//int auth_simple_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n//int auth_simple_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\nint auth_sha1_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint auth_sha1_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\nint auth_sha1_v2_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint auth_sha1_v2_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\nint auth_sha1_v4_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint auth_sha1_v4_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\nint auth_aes128_sha1_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint auth_aes128_sha1_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\nint auth_aes128_sha1_client_udp_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint auth_aes128_sha1_client_udp_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\nint auth_aes128_sha1_get_overhead(obfs *self);\n#endif // _OBFS_AUTH_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/auth_chain.c",
    "content": "#include <string.h>\n#include <time.h>\n#include <stdlib.h>\n#include <limits.h>\n#include \"auth.h\"\n#include \"obfsutil.h\"\n#include \"crc32.h\"\n#include \"base64.h\"\n#include \"encrypt.h\"\n#include \"obfs.h\"\n\nuint32_t g_endian_test = 1;\n\ntypedef struct shift128plus_ctx {\n    uint64_t v[2];\n} shift128plus_ctx;\n\nuint64_t shift128plus_next(shift128plus_ctx *ctx) {\n    uint64_t x = ctx->v[0];\n    uint64_t y = ctx->v[1];\n    ctx->v[0] = y;\n    x ^= x << 23;\n    x ^= (y ^ (x >> 17) ^ (y >> 26));\n    ctx->v[1] = x;\n    return x + y;\n}\n\nvoid i64_memcpy(uint8_t *target, uint8_t *source) {\n    for (int i = 0; i < 8; ++i)\n        target[i] = source[7 - i];\n}\n\nint find_pos(int arr[], int length, int key) {\n    int low = 0;\n    int high = length - 1;\n    int middle = -1;\n\n    if (key > arr[high])\n        return length;\n\n    while (low < high) {\n        middle = (low + high) / 2;\n        if (key > arr[middle]) {\n            low = middle + 1;\n        } else if (key <= arr[middle]) {\n            high = middle;\n        }\n    }\n    return low;\n}\n\nint data_size_list_compare(const void *a, const void *b) {\n    return (*(int *) a - *(int *) b);\n}\n\nvoid shift128plus_init_from_bin(shift128plus_ctx *ctx, uint8_t *bin, int bin_size) {\n    uint8_t fill_bin[16] = {0};\n    memcpy(fill_bin, bin, bin_size);\n    if (*(uint8_t *) &g_endian_test == 1) {\n        memcpy(ctx, fill_bin, 16);\n    } else {\n        i64_memcpy((uint8_t *) ctx, fill_bin);\n        i64_memcpy((uint8_t *) ctx + 8, fill_bin + 8);\n    }\n}\n\nvoid shift128plus_init_from_bin_datalen(shift128plus_ctx *ctx, uint8_t *bin, int bin_size, int datalen) {\n    uint8_t fill_bin[16] = {0};\n    memcpy(fill_bin, bin, bin_size);\n    fill_bin[0] = datalen;\n    fill_bin[1] = datalen >> 8;\n    if (*(uint8_t *) &g_endian_test == 1) {\n        memcpy(ctx, fill_bin, 16);\n    } else {\n        i64_memcpy((uint8_t *) ctx, fill_bin);\n        i64_memcpy((uint8_t *) ctx + 8, fill_bin + 8);\n    }\n    for (int i = 0; i < 4; ++i) {\n        shift128plus_next(ctx);\n    }\n}\n\ntypedef struct auth_chain_global_data {\n    uint8_t local_client_id[4];\n    uint32_t connection_id;\n} auth_chain_global_data;\n\ntypedef struct auth_chain_b_data {\n    int *data_size_list;\n    int data_size_list_length;\n    int *data_size_list2;\n    int data_size_list2_length;\n} auth_chain_b_data;\n\ntypedef struct auth_chain_c_data {\n    int *data_size_list0;\n    int data_size_list0_length;\n} auth_chain_c_data;\n\ntypedef struct auth_chain_local_data {\n    int has_sent_header;\n    char *recv_buffer;\n    int recv_buffer_size;\n    uint32_t recv_id;\n    uint32_t pack_id;\n    char *salt;\n    uint8_t *user_key;\n    char uid[4];\n    int user_key_len;\n    int last_data_len;\n    uint8_t last_client_hash[16];\n    uint8_t last_server_hash[16];\n    shift128plus_ctx random_client;\n    shift128plus_ctx random_server;\n    int cipher_init_flag;\n    cipher_env_t cipher;\n    enc_ctx_t *cipher_client_ctx;\n    enc_ctx_t *cipher_server_ctx;\n\n    unsigned int (*get_tcp_rand_len)(\n            struct auth_chain_local_data *local,\n            server_info *server,\n            int datalength,\n            shift128plus_ctx *random,\n            uint8_t *last_hash\n    );\n\n    void *auth_chain_special_data;\n} auth_chain_local_data;\n\nvoid auth_chain_local_data_init(auth_chain_local_data *local) {\n    local->has_sent_header = 0;\n    local->recv_buffer = (char *) malloc(16384);\n    local->recv_buffer_size = 0;\n    local->recv_id = 1;\n    local->pack_id = 1;\n    local->salt = \"\";\n    local->user_key = 0;\n    local->user_key_len = 0;\n    local->cipher_init_flag = 0;\n    local->cipher_client_ctx = 0;\n    local->cipher_server_ctx = 0;\n    local->get_tcp_rand_len = NULL;\n}\n\nunsigned int auth_chain_a_get_rand_len(\n        auth_chain_local_data *local,\n        server_info *server,\n        int datalength,\n        shift128plus_ctx *random,\n        uint8_t *last_hash\n) {\n    if (datalength > 1440)\n        return 0;\n    shift128plus_init_from_bin_datalen(random, last_hash, 16, datalength);\n    if (datalength > 1300)\n        return (unsigned int) (shift128plus_next(random) % 31);\n    if (datalength > 900)\n        return (unsigned int) (shift128plus_next(random) % 127);\n    if (datalength > 400)\n        return (unsigned int) (shift128plus_next(random) % 521);\n    return (unsigned int) (shift128plus_next(random) % 1021);\n}\n\nunsigned int auth_chain_b_get_rand_len(\n        auth_chain_local_data *local,\n        server_info *server,\n        int datalength,\n        shift128plus_ctx *random,\n        uint8_t *last_hash\n) {\n    if (datalength > 1440)\n        return 0;\n    uint16_t overhead = server->overhead;\n    auth_chain_b_data *special_data = (auth_chain_b_data *) local->auth_chain_special_data;\n\n    int other_data_size = datalength + overhead;\n\n    // auth_chain_b_get_rand_len\n    shift128plus_init_from_bin_datalen(random, last_hash, 16, datalength);\n    int pos = find_pos(special_data->data_size_list, special_data->data_size_list_length, other_data_size);\n    uint64_t final_pos = pos + shift128plus_next(random) % special_data->data_size_list_length;\n    if (final_pos < special_data->data_size_list_length) {\n        return special_data->data_size_list[final_pos] - other_data_size;\n    }\n\n    int pos2 = find_pos(special_data->data_size_list2, special_data->data_size_list2_length, other_data_size);\n    uint64_t final_pos2 = pos2 + shift128plus_next(random) % special_data->data_size_list2_length;\n    if (final_pos2 < special_data->data_size_list2_length) {\n        return special_data->data_size_list2[final_pos2] - other_data_size;\n    }\n    if (final_pos2 < pos2 + special_data->data_size_list2_length - 1) {\n        return 0;\n    }\n\n    if (datalength > 1300)\n        return (unsigned int) (shift128plus_next(random) % 31);\n    if (datalength > 900)\n        return (unsigned int) (shift128plus_next(random) % 127);\n    if (datalength > 400)\n        return (unsigned int) (shift128plus_next(random) % 521);\n    return (unsigned int) (shift128plus_next(random) % 1021);\n}\n\nunsigned int auth_chain_c_get_rand_len(\n        auth_chain_local_data *local,\n        server_info *server,\n        int datalength,\n        shift128plus_ctx *random,\n        uint8_t *last_hash\n) {\n    uint16_t overhead = server->overhead;\n    auth_chain_c_data *special_data = (auth_chain_c_data *) local->auth_chain_special_data;\n\n    int other_data_size = datalength + overhead;\n\n    // must init random in here to make sure output sync in server and client\n    shift128plus_init_from_bin_datalen(random, last_hash, 16, datalength);\n    if (other_data_size >= special_data->data_size_list0[special_data->data_size_list0_length - 1]) {\n        if (datalength > 1440)\n            return 0;\n        if (datalength > 1300)\n            return (unsigned int) (shift128plus_next(random) % 31);\n        if (datalength > 900)\n            return (unsigned int) (shift128plus_next(random) % 127);\n        if (datalength > 400)\n            return (unsigned int) (shift128plus_next(random) % 521);\n        return (unsigned int) (shift128plus_next(random) % 1021);\n    }\n\n    int pos = find_pos(special_data->data_size_list0, special_data->data_size_list0_length, other_data_size);\n    // random select a size in the leftover data_size_list0\n    uint64_t final_pos = pos + shift128plus_next(random) % (special_data->data_size_list0_length - pos);\n    return special_data->data_size_list0[final_pos] - other_data_size;\n}\n\nunsigned int auth_chain_d_get_rand_len(\n        auth_chain_local_data *local,\n        server_info *server,\n        int datalength,\n        shift128plus_ctx *random,\n        uint8_t *last_hash\n) {\n    uint16_t overhead = server->overhead;\n    auth_chain_c_data *special_data = (auth_chain_c_data *) local->auth_chain_special_data;\n\n    int other_data_size = datalength + overhead;\n\n    // if other_data_size > the bigest item in data_size_list0, not padding any data\n    if (other_data_size >= special_data->data_size_list0[special_data->data_size_list0_length - 1]) {\n        return 0;\n    }\n\n    shift128plus_init_from_bin_datalen(random, last_hash, 16, datalength);\n    int pos = find_pos(special_data->data_size_list0, special_data->data_size_list0_length, other_data_size);\n    // random select a size in the leftover data_size_list0\n    uint64_t final_pos = pos + shift128plus_next(random) % (special_data->data_size_list0_length - pos);\n    return special_data->data_size_list0[final_pos] - other_data_size;\n}\n\nunsigned int auth_chain_e_get_rand_len(\n        auth_chain_local_data *local,\n        server_info *server,\n        int datalength,\n        shift128plus_ctx *random,\n        uint8_t *last_hash\n) {\n    shift128plus_init_from_bin_datalen(random, last_hash, 16, datalength);\n    uint16_t overhead = server->overhead;\n    auth_chain_c_data *special_data = (auth_chain_c_data *) local->auth_chain_special_data;\n\n    int other_data_size = datalength + overhead;\n\n    // if other_data_size > the bigest item in data_size_list0, not padding any data\n    if (other_data_size >= special_data->data_size_list0[special_data->data_size_list0_length - 1]) {\n        return 0;\n    }\n\n    // use the mini size in the data_size_list0\n    int pos = find_pos(special_data->data_size_list0, special_data->data_size_list0_length, other_data_size);\n    return special_data->data_size_list0[pos] - other_data_size;\n}\n\nunsigned int auth_chain_f_get_rand_len(\n        auth_chain_local_data *local,\n        server_info *server,\n        int datalength,\n        shift128plus_ctx *random,\n        uint8_t *last_hash\n) {\n    return auth_chain_e_get_rand_len(\n            local,\n            server,\n            datalength,\n            random,\n            last_hash\n    );\n}\n\nvoid auth_chain_b_init_data_size(obfs *self, server_info *server) {\n    auth_chain_b_data *special_data = (auth_chain_b_data *)\n            ((auth_chain_local_data *) self->l_data)->auth_chain_special_data;\n\n    shift128plus_ctx *random = (shift128plus_ctx *) malloc(sizeof(shift128plus_ctx));\n\n    shift128plus_init_from_bin(random, server->key, 16);\n    special_data->data_size_list_length = shift128plus_next(random) % 8 + 4;\n    special_data->data_size_list = (int *) malloc(special_data->data_size_list_length * sizeof(int));\n    for (int i = 0; i < special_data->data_size_list_length; i++) {\n        special_data->data_size_list[i] = shift128plus_next(random) % 2340 % 2040 % 1440;\n    }\n    // stdlib qsort\n    qsort(special_data->data_size_list,\n          special_data->data_size_list_length,\n          sizeof(int),\n          data_size_list_compare\n    );\n\n    special_data->data_size_list2_length = shift128plus_next(random) % 16 + 8;\n    special_data->data_size_list2 = (int *) malloc(special_data->data_size_list2_length * sizeof(int));\n    for (int i = 0; i < special_data->data_size_list2_length; i++) {\n        special_data->data_size_list2[i] = shift128plus_next(random) % 2340 % 2040 % 1440;\n    }\n    // stdlib qsort\n    qsort(special_data->data_size_list2,\n          special_data->data_size_list2_length,\n          sizeof(int),\n          data_size_list_compare\n    );\n\n    free(random);\n}\n\nvoid auth_chain_c_init_data_size(obfs *self, server_info *server) {\n\n    auth_chain_c_data *special_data = (auth_chain_c_data *)\n            ((auth_chain_local_data *) self->l_data)->auth_chain_special_data;\n\n    shift128plus_ctx *random = (shift128plus_ctx *) malloc(sizeof(shift128plus_ctx));\n\n    shift128plus_init_from_bin(random, server->key, 16);\n    special_data->data_size_list0_length = shift128plus_next(random) % (8 + 16) + (4 + 8);\n    special_data->data_size_list0 = (int *) malloc(special_data->data_size_list0_length * sizeof(int));\n    for (int i = 0; i < special_data->data_size_list0_length; i++) {\n        special_data->data_size_list0[i] = shift128plus_next(random) % 2340 % 2040 % 1440;\n    }\n    // stdlib qsort\n    qsort(special_data->data_size_list0,\n          special_data->data_size_list0_length,\n          sizeof(int),\n          data_size_list_compare\n    );\n\n    free(random);\n}\n\n#define AUTH_CHAIN_D_MAX_DATA_SIZE_LIST_LIMIT_SIZE 64\n\nvoid auth_chain_d_check_and_patch_data_size(obfs *self, shift128plus_ctx *random) {\n    auth_chain_c_data *special_data = (auth_chain_c_data *)\n            ((auth_chain_local_data *) self->l_data)->auth_chain_special_data;\n\n    while (special_data->data_size_list0[special_data->data_size_list0_length - 1] < 1300\n           && special_data->data_size_list0_length < AUTH_CHAIN_D_MAX_DATA_SIZE_LIST_LIMIT_SIZE) {\n\n        // data_size_list0.size + 1\n        special_data->data_size_list0[special_data->data_size_list0_length] =\n                shift128plus_next(random) % 2340 % 2040 % 1440;\n        ++(special_data->data_size_list0_length);\n    }\n}\n\nvoid auth_chain_d_init_data_size(obfs *self, server_info *server) {\n\n    auth_chain_c_data *special_data = (auth_chain_c_data *)\n            ((auth_chain_local_data *) self->l_data)->auth_chain_special_data;\n\n    shift128plus_ctx *random = (shift128plus_ctx *) malloc(sizeof(shift128plus_ctx));\n\n    shift128plus_init_from_bin(random, server->key, 16);\n    special_data->data_size_list0_length = shift128plus_next(random) % (8 + 16) + (4 + 8);\n    special_data->data_size_list0 = (int *) malloc(AUTH_CHAIN_D_MAX_DATA_SIZE_LIST_LIMIT_SIZE * sizeof(int));\n    for (int i = 0; i < special_data->data_size_list0_length; i++) {\n        special_data->data_size_list0[i] = shift128plus_next(random) % 2340 % 2040 % 1440;\n    }\n    // stdlib qsort\n    qsort(special_data->data_size_list0,\n          special_data->data_size_list0_length,\n          sizeof(int),\n          data_size_list_compare\n    );\n\n    int old_len = special_data->data_size_list0_length;\n    auth_chain_d_check_and_patch_data_size(self, random);\n    if (old_len != special_data->data_size_list0_length) {\n        // if check_and_patch_data_size are work, re-sort again.\n        // stdlib qsort\n        qsort(special_data->data_size_list0,\n              special_data->data_size_list0_length,\n              sizeof(int),\n              data_size_list_compare\n        );\n    }\n\n    free(random);\n}\n\nvoid auth_chain_f_init_data_size(obfs *self, server_info *server, const uint8_t *key_change_datetime_key_bytes) {\n\n    auth_chain_c_data *special_data = (auth_chain_c_data *)\n            ((auth_chain_local_data *) self->l_data)->auth_chain_special_data;\n\n    shift128plus_ctx *random = (shift128plus_ctx *) malloc(sizeof(shift128plus_ctx));\n\n    uint8_t *newKey = (uint8_t *) malloc(sizeof(uint8_t) * server->key_len);\n    memcpy(newKey, server->key, server->key_len);\n    for (int i = 0; i != 8; ++i) {\n        newKey[i] ^= key_change_datetime_key_bytes[i];\n    }\n\n    shift128plus_init_from_bin(random, newKey, 16);\n    free(newKey);\n    newKey = NULL;\n\n    special_data->data_size_list0_length = shift128plus_next(random) % (8 + 16) + (4 + 8);\n    special_data->data_size_list0 = (int *) malloc(AUTH_CHAIN_D_MAX_DATA_SIZE_LIST_LIMIT_SIZE * sizeof(int));\n    for (int i = 0; i < special_data->data_size_list0_length; i++) {\n        special_data->data_size_list0[i] = shift128plus_next(random) % 2340 % 2040 % 1440;\n    }\n    // stdlib qsort\n    qsort(special_data->data_size_list0,\n          special_data->data_size_list0_length,\n          sizeof(int),\n          data_size_list_compare\n    );\n\n    int old_len = special_data->data_size_list0_length;\n    auth_chain_d_check_and_patch_data_size(self, random);\n    if (old_len != special_data->data_size_list0_length) {\n        // if check_and_patch_data_size are work, re-sort again.\n        // stdlib qsort\n        qsort(special_data->data_size_list0,\n              special_data->data_size_list0_length,\n              sizeof(int),\n              data_size_list_compare\n        );\n    }\n\n    free(random);\n}\n\nvoid *auth_chain_a_init_data() {\n    auth_chain_global_data *global = (auth_chain_global_data *) malloc(sizeof(auth_chain_global_data));\n    rand_bytes(global->local_client_id, 4);\n    rand_bytes((uint8_t *) &global->connection_id, 4);\n    global->connection_id &= 0xFFFFFF;\n    return global;\n}\n\nvoid *auth_chain_b_init_data() {\n    return auth_chain_a_init_data();\n}\n\nvoid *auth_chain_c_init_data() {\n    return auth_chain_a_init_data();\n}\n\nvoid *auth_chain_d_init_data() {\n    return auth_chain_c_init_data();\n}\n\nvoid *auth_chain_e_init_data() {\n    return auth_chain_d_init_data();\n}\n\nvoid *auth_chain_f_init_data() {\n    return auth_chain_e_init_data();\n}\n\nobfs *auth_chain_a_new_obfs() {\n    obfs *self = new_obfs();\n    self->l_data = malloc(sizeof(auth_chain_local_data));\n    auth_chain_local_data_init((auth_chain_local_data *) self->l_data);\n    ((auth_chain_local_data *) self->l_data)->salt = \"auth_chain_a\";\n    ((auth_chain_local_data *) self->l_data)->get_tcp_rand_len = auth_chain_a_get_rand_len;\n    return self;\n}\n\nobfs *auth_chain_b_new_obfs() {\n    obfs *self = new_obfs();\n    self->l_data = malloc(sizeof(auth_chain_local_data));\n    auth_chain_local_data_init((auth_chain_local_data *) self->l_data);\n    ((auth_chain_local_data *) self->l_data)->salt = \"auth_chain_b\";\n    ((auth_chain_local_data *) self->l_data)->get_tcp_rand_len = auth_chain_b_get_rand_len;\n    auth_chain_b_data *special_data = (auth_chain_b_data *) malloc(sizeof(auth_chain_b_data));\n    special_data->data_size_list = NULL;\n    special_data->data_size_list_length = 0;\n    special_data->data_size_list2 = NULL;\n    special_data->data_size_list2_length = 0;\n    ((auth_chain_local_data *) self->l_data)->auth_chain_special_data = special_data;\n    return self;\n}\n\nobfs *auth_chain_c_new_obfs() {\n    obfs *self = new_obfs();\n    self->l_data = malloc(sizeof(auth_chain_local_data));\n    auth_chain_local_data_init((auth_chain_local_data *) self->l_data);\n    ((auth_chain_local_data *) self->l_data)->salt = \"auth_chain_c\";\n    ((auth_chain_local_data *) self->l_data)->get_tcp_rand_len = auth_chain_c_get_rand_len;\n    auth_chain_c_data *special_data = (auth_chain_c_data *) malloc(sizeof(auth_chain_c_data));\n    special_data->data_size_list0 = NULL;\n    special_data->data_size_list0_length = 0;\n    ((auth_chain_local_data *) self->l_data)->auth_chain_special_data = special_data;\n    return self;\n}\n\nobfs *auth_chain_d_new_obfs() {\n    obfs *self = auth_chain_c_new_obfs();\n    ((auth_chain_local_data *) self->l_data)->salt = \"auth_chain_d\";\n    ((auth_chain_local_data *) self->l_data)->get_tcp_rand_len = auth_chain_d_get_rand_len;\n    return self;\n}\n\nobfs *auth_chain_e_new_obfs() {\n    obfs *self = auth_chain_d_new_obfs();\n    ((auth_chain_local_data *) self->l_data)->salt = \"auth_chain_e\";\n    ((auth_chain_local_data *) self->l_data)->get_tcp_rand_len = auth_chain_e_get_rand_len;\n    return self;\n}\n\nobfs *auth_chain_f_new_obfs() {\n    obfs *self = auth_chain_e_new_obfs();\n    ((auth_chain_local_data *) self->l_data)->salt = \"auth_chain_f\";\n    ((auth_chain_local_data *) self->l_data)->get_tcp_rand_len = auth_chain_f_get_rand_len;\n    return self;\n}\n\nint auth_chain_a_get_overhead(obfs *self) {\n    return 4;\n}\n\nint auth_chain_b_get_overhead(obfs *self) {\n    return auth_chain_a_get_overhead(self);\n}\n\nint auth_chain_c_get_overhead(obfs *self) {\n    return auth_chain_a_get_overhead(self);\n}\n\nint auth_chain_d_get_overhead(obfs *self) {\n    return auth_chain_c_get_overhead(self);\n}\n\nint auth_chain_e_get_overhead(obfs *self) {\n    return auth_chain_d_get_overhead(self);\n}\n\nint auth_chain_f_get_overhead(obfs *self) {\n    return auth_chain_e_get_overhead(self);\n}\n\nvoid auth_chain_a_dispose(obfs *self) {\n    auth_chain_local_data *local = (auth_chain_local_data *) self->l_data;\n    if (local->recv_buffer != NULL) {\n        free(local->recv_buffer);\n        local->recv_buffer = NULL;\n    }\n    if (local->user_key != NULL) {\n        free(local->user_key);\n        local->user_key = NULL;\n    }\n    if (local->cipher_init_flag) {\n        if (local->cipher_client_ctx) {\n            enc_ctx_release(&local->cipher, local->cipher_client_ctx);\n        }\n        if (local->cipher_server_ctx) {\n            enc_ctx_release(&local->cipher, local->cipher_server_ctx);\n        }\n        enc_release(&local->cipher);\n        local->cipher_init_flag = 0;\n    }\n    free(local);\n    self->l_data = NULL;\n    dispose_obfs(self);\n}\n\nvoid auth_chain_b_dispose(obfs *self) {\n    auth_chain_local_data *local = (auth_chain_local_data *) self->l_data;\n    auth_chain_b_data *special_data = (auth_chain_b_data *) local->auth_chain_special_data;\n    if (local->auth_chain_special_data != NULL) {\n        if (special_data->data_size_list != NULL) {\n            free(special_data->data_size_list);\n            special_data->data_size_list = NULL;\n            special_data->data_size_list_length = 0;\n        }\n        if (special_data->data_size_list2 != NULL) {\n            free(special_data->data_size_list2);\n            special_data->data_size_list2 = NULL;\n            special_data->data_size_list2_length = 0;\n        }\n        free(local->auth_chain_special_data);\n        local->auth_chain_special_data = NULL;\n    }\n    auth_chain_a_dispose(self);\n}\n\nvoid auth_chain_c_dispose(obfs *self) {\n    auth_chain_local_data *local = (auth_chain_local_data *) self->l_data;\n    auth_chain_c_data *special_data = (auth_chain_c_data *) local->auth_chain_special_data;\n    if (local->auth_chain_special_data != NULL) {\n        if (special_data->data_size_list0 != NULL) {\n            free(special_data->data_size_list0);\n            special_data->data_size_list0 = NULL;\n            special_data->data_size_list0_length = 0;\n        }\n        free(local->auth_chain_special_data);\n        local->auth_chain_special_data = NULL;\n    }\n    auth_chain_a_dispose(self);\n}\n\nvoid auth_chain_d_dispose(obfs *self) {\n    auth_chain_c_dispose(self);\n}\n\nvoid auth_chain_e_dispose(obfs *self) {\n    auth_chain_d_dispose(self);\n}\n\nvoid auth_chain_f_dispose(obfs *self) {\n    auth_chain_e_dispose(self);\n}\n\nvoid auth_chain_a_set_server_info(obfs *self, server_info *server) {\n    // dont change server.overhead in there\n    // the server.overhead are counted from the local.c\n    // the input's server.overhead is the total server.overhead that sum of all the plugin's overhead\n    memmove(&self->server, server, sizeof(server_info));\n}\n\nvoid auth_chain_b_set_server_info(obfs *self, server_info *server) {\n    memmove(&self->server, server, sizeof(server_info));\n    // auth_chain_b_init_data_size() init in there\n    auth_chain_b_init_data_size(self, &self->server);\n}\n\nvoid auth_chain_c_set_server_info(obfs *self, server_info *server) {\n    memmove(&self->server, server, sizeof(server_info));\n    // auth_chain_c_init_data_size() init in there\n    auth_chain_c_init_data_size(self, &self->server);\n}\n\nvoid auth_chain_d_set_server_info(obfs *self, server_info *server) {\n    memmove(&self->server, server, sizeof(server_info));\n    // auth_chain_d_init_data_size() init in there\n    auth_chain_d_init_data_size(self, &self->server);\n}\n\nvoid auth_chain_e_set_server_info(obfs *self, server_info *server) {\n    auth_chain_d_set_server_info(self, server);\n}\n\nvoid auth_chain_f_set_server_info(obfs *self, server_info *server) {\n    memmove(&self->server, server, sizeof(server_info));\n\n    uint64_t key_change_interval = 60 * 60 * 24;     // a day by second\n    if (server->param != NULL && server->param[0] != 0) {\n        char *delim1 = strchr(server->param, '#');\n        if (delim1 != NULL && delim1[1] != '\\0') {\n            ++delim1;\n            char *delim2 = strchr(delim1, '#');\n            if (delim2 == NULL) {\n                delim2 = strchr(delim1, '\\0');\n            }\n            unsigned long l = delim2 - delim1;\n            if (l > 2) {\n                long long n = strtoll(delim1, &delim2, 0);\n                if (n != 0 && n != LLONG_MAX && n != LLONG_MIN && n > 0) {\n                    key_change_interval = (uint64_t) n;\n                }\n            }\n        }\n    }\n\n    uint8_t *key_change_datetime_key_bytes = (uint8_t *) malloc(sizeof(uint8_t) * 8);\n    uint64_t key_change_datetime_key = (uint64_t) (time(NULL)) / key_change_interval;\n    for (int i = 7; i >= 0; --i) {\n        key_change_datetime_key_bytes[7 - i] = (uint8_t) ((key_change_datetime_key >> (8 * i)) & 0xFF);\n    }\n\n    auth_chain_f_init_data_size(self, &self->server, key_change_datetime_key_bytes);\n\n    free(key_change_datetime_key_bytes);\n    key_change_datetime_key_bytes = NULL;\n}\n\nunsigned int udp_get_rand_len(shift128plus_ctx *random, uint8_t *last_hash) {\n    shift128plus_init_from_bin(random, last_hash, 16);\n    return shift128plus_next(random) % 127;\n}\n\nunsigned int get_rand_start_pos(int rand_len, shift128plus_ctx *random) {\n    if (rand_len > 0)\n        return shift128plus_next(random) % 8589934609 % rand_len;\n    return 0;\n}\n\nunsigned int get_client_rand_len(auth_chain_local_data *local, server_info *server, int datalength) {\n    return local->get_tcp_rand_len(local, server, datalength, &local->random_client, local->last_client_hash);\n}\n\nunsigned int get_server_rand_len(auth_chain_local_data *local, server_info *server, int datalength) {\n    return local->get_tcp_rand_len(local, server, datalength, &local->random_server, local->last_server_hash);\n}\n\nint auth_chain_a_pack_data(char *data, int datalength, char *outdata, auth_chain_local_data *local,\n                           server_info *server) {\n    unsigned int rand_len = get_client_rand_len(local, server, datalength);\n    int out_size = (int) rand_len + datalength + 2;\n    outdata[0] = (char) ((uint8_t) datalength ^ local->last_client_hash[14]);\n    outdata[1] = (char) ((uint8_t) (datalength >> 8) ^ local->last_client_hash[15]);\n\n    {\n        uint8_t *rnd_data = (uint8_t *)malloc(rand_len);\r\n        rand_bytes(rnd_data, (int) rand_len);\n        if (datalength > 0) {\n            int start_pos = get_rand_start_pos(rand_len, &local->random_client);\n            size_t out_len;\n            ss_encrypt_buffer(&local->cipher, local->cipher_client_ctx,\n                              data, datalength, &outdata[2 + start_pos], &out_len);\n            memcpy(outdata + 2, rnd_data, start_pos);\n            memcpy(outdata + 2 + start_pos + datalength, rnd_data + start_pos, rand_len - start_pos);\n        } else {\n            memcpy(outdata + 2, rnd_data, rand_len);\n        }\n        free(rnd_data);\n    }\n\n    uint8_t key_len = (uint8_t) (local->user_key_len + 4);\n    uint8_t *key = (uint8_t *)malloc(key_len);\n    memcpy(key, local->user_key, local->user_key_len);\n    memintcopy_lt(key + key_len - 4, local->pack_id);\n    ++local->pack_id;\n\n    ss_md5_hmac_with_key((char *) local->last_client_hash, outdata, out_size, key, key_len);\n    memcpy(outdata + out_size, local->last_client_hash, 2);\n    free(key);\n    return out_size + 2;\n}\n\nint auth_chain_a_pack_auth_data(auth_chain_global_data *global, server_info *server, auth_chain_local_data *local,\n                                char *data, int datalength, char *outdata) {\n    const int authhead_len = 4 + 8 + 4 + 16 + 4;\n    const char *salt = local->salt;\n    int out_size = authhead_len;\n\n    ++global->connection_id;\n    if (global->connection_id > 0xFF000000) {\n        rand_bytes(global->local_client_id, 8);\n        rand_bytes((uint8_t *) &global->connection_id, 4);\n        global->connection_id &= 0xFFFFFF;\n    }\n\n    char encrypt[20];\n\n    uint8_t *key = (uint8_t *)malloc(server->iv_len + server->key_len);\n    uint8_t key_len = (uint8_t) (server->iv_len + server->key_len);\n    memcpy(key, server->iv, server->iv_len);\n    memcpy(key + server->iv_len, server->key, server->key_len);\n\n    time_t t = time(NULL);\n    memintcopy_lt(encrypt, (uint32_t) t);\n    memcpy(encrypt + 4, global->local_client_id, 4);\n    memintcopy_lt(encrypt + 8, global->connection_id);\n    encrypt[12] = (char) server->overhead;\n    encrypt[13] = (char) (server->overhead >> 8);\n    encrypt[14] = 0;\n    encrypt[15] = 0;\n\n    // first 12 bytes\n    {\n        rand_bytes((uint8_t *) outdata, 4);\n        ss_md5_hmac_with_key((char *) local->last_client_hash, (char *) outdata, 4, key, key_len);\n        memcpy(outdata + 4, local->last_client_hash, 8);\n    }\n    free(key);\n    // uid & 16 bytes auth data\n    {\n        uint8_t uid[4];\n        if (local->user_key == NULL) {\n            if (server->param != NULL && server->param[0] != 0) {\n                char *param = server->param;\n                char *delim = strchr(param, ':');\n                if (delim != NULL) {\n                    char uid_str[16] = \"\";\n                    strncpy(uid_str, param, delim - param);\n                    char key_str[128];\n                    strcpy(key_str, delim + 1);\n                    long uid_long = strtol(uid_str, NULL, 10);\n                    memintcopy_lt((char *) local->uid, (uint32_t) uid_long);\n\n                    local->user_key_len = (int) strlen(key_str);\n                    local->user_key = (uint8_t *) malloc((size_t) local->user_key_len);\n                    memcpy(local->user_key, key_str, local->user_key_len);\n                }\n            }\n            if (local->user_key == NULL) {\n                rand_bytes((uint8_t *) local->uid, 4);\n\n                local->user_key_len = (int) server->key_len;\n                local->user_key = (uint8_t *) malloc((size_t) local->user_key_len);\n                memcpy(local->user_key, server->key, local->user_key_len);\n            }\n        }\n        for (int i = 0; i < 4; ++i) {\n            uid[i] = local->uid[i] ^ local->last_client_hash[8 + i];\n        }\n\n        char encrypt_key_base64[256] = {0};\n        unsigned char *encrypt_key = (unsigned char *)malloc(local->user_key_len);\n        memcpy(encrypt_key, local->user_key, local->user_key_len);\n        base64_encode(encrypt_key, (unsigned int) local->user_key_len, encrypt_key_base64);\n        free(encrypt_key);\n\n        int salt_len = (int)strlen(salt);\n        int base64_len = (local->user_key_len + 2) / 3 * 4;\n        memcpy(encrypt_key_base64 + base64_len, salt, salt_len);\n\n        char enc_key[16];\n        int enc_key_len = base64_len + salt_len;\n        bytes_to_key_with_size(encrypt_key_base64, (size_t) enc_key_len, (uint8_t *) enc_key, 16);\n        char encrypt_data[16];\n        ss_aes_128_cbc(encrypt, encrypt_data, enc_key);\n        memcpy(encrypt, uid, 4);\n        memcpy(encrypt + 4, encrypt_data, 16);\n    }\n    // final HMAC\n    {\n        ss_md5_hmac_with_key((char *) local->last_server_hash, encrypt, 20, local->user_key, local->user_key_len);\n        memcpy(outdata + 12, encrypt, 20);\n        memcpy(outdata + 12 + 20, local->last_server_hash, 4);\n    }\n\n    char password[256] = {0};\n    base64_encode(local->user_key, local->user_key_len, password);\n    base64_encode(local->last_client_hash, 16, password + strlen(password));\n    local->cipher_init_flag = 1;\n    enc_init(&local->cipher, password, \"rc4\");\n    local->cipher_client_ctx = malloc(sizeof(enc_ctx_t));\n    local->cipher_server_ctx = malloc(sizeof(enc_ctx_t));\n    enc_ctx_init(&local->cipher, local->cipher_client_ctx, 1);\n    enc_ctx_init(&local->cipher, local->cipher_server_ctx, 0);\n\n    out_size += auth_chain_a_pack_data(data, datalength, outdata + out_size, local, server);\n\n    return out_size;\n}\n\nint auth_chain_a_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity) {\n    char *plaindata = *pplaindata;\n    server_info *server = (server_info *) &self->server;\n    auth_chain_local_data *local = (auth_chain_local_data *) self->l_data;\n    char *out_buffer = (char *) malloc((size_t) (datalength * 2 + 4096));\n    char *buffer = out_buffer;\n    char *data = plaindata;\n    int len = datalength;\n    int pack_len;\n    if (len > 0 && local->has_sent_header == 0) {\n        int head_size = 1200;\n        if (head_size > datalength)\n            head_size = datalength;\n        pack_len = auth_chain_a_pack_auth_data((auth_chain_global_data *) self->server.g_data, &self->server, local,\n                                               data, head_size, buffer);\n        buffer += pack_len;\n        data += head_size;\n        len -= head_size;\n        local->has_sent_header = 1;\n    }\n    int unit_size = server->tcp_mss - server->overhead;\n    while (len > unit_size) {\n        pack_len = auth_chain_a_pack_data(data, unit_size, buffer, local, &self->server);\n        buffer += pack_len;\n        data += unit_size;\n        len -= unit_size;\n    }\n    if (len > 0) {\n        pack_len = auth_chain_a_pack_data(data, len, buffer, local, &self->server);\n        buffer += pack_len;\n    }\n    len = (int) (buffer - out_buffer);\n    if ((int) *capacity < len) {\n        *pplaindata = (char *) realloc(*pplaindata, *capacity = (size_t) (len * 2));\n        // TODO check realloc failed\n        plaindata = *pplaindata;\n    }\n    local->last_data_len = datalength;\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_chain_a_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity) {\n    char *plaindata = *pplaindata;\n    auth_chain_local_data *local = (auth_chain_local_data *) self->l_data;\n    server_info *server = (server_info *) &self->server;\n    uint8_t *recv_buffer = (uint8_t *) local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    int key_len = local->user_key_len + 4;\n    uint8_t *key = (uint8_t *) malloc((size_t) key_len);\n    memcpy(key, local->user_key, local->user_key_len);\n\n    char *out_buffer = (char *) malloc((size_t) local->recv_buffer_size);\n    char *buffer = out_buffer;\n    char error = 0;\n    while (local->recv_buffer_size > 4) {\n        memintcopy_lt(key + key_len - 4, local->recv_id);\n\n        int data_len = (int) (((unsigned) (recv_buffer[1] ^ local->last_server_hash[15]) << 8) +\n                              (recv_buffer[0] ^ local->last_server_hash[14]));\n        int rand_len = get_server_rand_len(local, server, data_len);\n        int len = rand_len + data_len;\n        if (len >= 4096) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        if ((len += 4) > local->recv_buffer_size)\n            break;\n\n        char hash[16];\n        ss_md5_hmac_with_key(hash, (char *) recv_buffer, len - 2, key, key_len);\n        if (memcmp(hash, recv_buffer + len - 2, 2)) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n\n        int pos;\n        if (data_len > 0 && rand_len > 0) {\n            pos = 2 + get_rand_start_pos(rand_len, &local->random_server);\n        } else {\n            pos = 2;\n        }\n        size_t out_len;\n        ss_decrypt_buffer(&local->cipher, local->cipher_server_ctx,\n                          (char *) recv_buffer + pos, data_len, buffer, &out_len);\n\n        if (local->recv_id == 1) {\n            server->tcp_mss = (uint8_t) buffer[0] | ((uint8_t) buffer[1] << 8);\n            memmove(buffer, buffer + 2, out_len -= 2);\n        }\n        memcpy(local->last_server_hash, hash, 16);\n        ++local->recv_id;\n        buffer += out_len;\n        memmove(recv_buffer, recv_buffer + len, local->recv_buffer_size -= len);\n    }\n    int len;\n    if (error == 0) {\n        len = (int) (buffer - out_buffer);\n        if ((int) *capacity < len) {\n            *pplaindata = (char *) realloc(*pplaindata, *capacity = (size_t) (len * 2));\n            plaindata = *pplaindata;\n        }\n        memmove(plaindata, out_buffer, len);\n    } else {\n        len = -1;\n    }\n    free(out_buffer);\n    free(key);\n    return len;\n}\n\nint auth_chain_a_client_udp_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity) {\n    char *plaindata = *pplaindata;\n    server_info *server = (server_info *) &self->server;\n    auth_chain_local_data *local = (auth_chain_local_data *) self->l_data;\n    char *out_buffer = (char *)malloc(datalength + 1024);\n\n    if (local->user_key == NULL) {\n        if (self->server.param != NULL && self->server.param[0] != 0) {\n            char *param = self->server.param;\n            char *delim = strchr(param, ':');\n            if (delim != NULL) {\n                char uid_str[16] = \"\";\n                strncpy(uid_str, param, delim - param);\n                char key_str[128];\n                strcpy(key_str, delim + 1);\n                long uid_long = strtol(uid_str, NULL, 10);\n                memintcopy_lt(local->uid, (uint32_t) uid_long);\n\n                local->user_key_len = (int) strlen(key_str);\n                local->user_key = (uint8_t *) malloc((size_t) local->user_key_len);\n                memcpy(local->user_key, key_str, local->user_key_len);\n            }\n        }\n        if (local->user_key == NULL) {\n            rand_bytes((uint8_t *) local->uid, 4);\n\n            local->user_key_len = (int) self->server.key_len;\n            local->user_key = (uint8_t *) malloc((size_t) local->user_key_len);\n            memcpy(local->user_key, self->server.key, local->user_key_len);\n        }\n    }\n\n    char auth_data[3];\n    uint8_t hash[16];\n    ss_md5_hmac_with_key((char *) hash, auth_data, 3, server->key, server->key_len);\n    int rand_len = udp_get_rand_len(&local->random_client, hash);\n    uint8_t *rnd_data = (uint8_t *)malloc(rand_len);\n    rand_bytes(rnd_data, (int) rand_len);\n    int outlength = datalength + rand_len + 8;\n\n    char password[256] = {0};\n    base64_encode(local->user_key, local->user_key_len, password);\n    base64_encode(hash, 16, password + strlen(password));\n\n    {\n        enc_init(&local->cipher, password, \"rc4\");\n        enc_ctx_t ctx;\n        enc_ctx_init(&local->cipher, &ctx, 1);\n        size_t out_len;\n        ss_encrypt_buffer(&local->cipher, &ctx,\n                          plaindata, datalength, out_buffer, &out_len);\n        enc_ctx_release(&local->cipher, &ctx);\n        enc_release(&local->cipher);\n    }\n    uint8_t uid[4];\n    for (int i = 0; i < 4; ++i) {\n        uid[i] = local->uid[i] ^ hash[i];\n    }\n    memmove(out_buffer + datalength, rnd_data, rand_len);\n    memmove(out_buffer + outlength - 8, auth_data, 3);\n    memmove(out_buffer + outlength - 5, uid, 4);\n    free(rnd_data);\n\n    ss_md5_hmac_with_key((char *) hash, out_buffer, outlength - 1, local->user_key, local->user_key_len);\n    memmove(out_buffer + outlength - 1, hash, 1);\n\n    if ((int) *capacity < outlength) {\n        *pplaindata = (char *) realloc(*pplaindata, *capacity = (size_t) (outlength * 2));\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, outlength);\n    free(out_buffer);\n    return outlength;\n}\n\nint auth_chain_a_client_udp_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity) {\n    if (datalength <= 8)\n        return 0;\n\n    char *plaindata = *pplaindata;\n    server_info *server = (server_info *) &self->server;\n    auth_chain_local_data *local = (auth_chain_local_data *) self->l_data;\n\n    uint8_t hash[16];\n    ss_md5_hmac_with_key((char *) hash, plaindata, datalength - 1, local->user_key, local->user_key_len);\n\n    if (*hash != ((uint8_t *) plaindata)[datalength - 1])\n        return 0;\n\n    ss_md5_hmac_with_key((char *) hash, plaindata + datalength - 8, 7, server->key, server->key_len);\n\n    int rand_len = udp_get_rand_len(&local->random_server, hash);\n    int outlength = datalength - rand_len - 8;\n\n    char password[256] = {0};\n    base64_encode(local->user_key, local->user_key_len, password);\n    base64_encode(hash, 16, password + strlen(password));\n\n    {\n        enc_init(&local->cipher, password, \"rc4\");\n        enc_ctx_t ctx;\n        enc_ctx_init(&local->cipher, &ctx, 0);\n        size_t out_len;\n        ss_decrypt_buffer(&local->cipher, &ctx, plaindata, outlength, plaindata, &out_len);\n        enc_ctx_release(&local->cipher, &ctx);\n        enc_release(&local->cipher);\n    }\n\n    return outlength;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/auth_chain.h",
    "content": "/*\n * auth.h - Define shadowsocksR server's buffers and callbacks\n *\n * Copyright (C) 2015 - 2016, Break Wa11 <mmgac001@gmail.com>\n */\n\n#ifndef _OBFS_AUTH_CHAIN_H\n#define _OBFS_AUTH_CHAIN_H\n\n#include \"obfs.h\"\n\n\nvoid *auth_chain_a_init_data();\n\nvoid *auth_chain_b_init_data();\n\nvoid *auth_chain_c_init_data();\n\nvoid *auth_chain_d_init_data();\n\nvoid *auth_chain_e_init_data();\n\nvoid *auth_chain_f_init_data();\n\n\nobfs *auth_chain_a_new_obfs();\n\nobfs *auth_chain_b_new_obfs();\n\nobfs *auth_chain_c_new_obfs();\n\nobfs *auth_chain_d_new_obfs();\n\nobfs *auth_chain_e_new_obfs();\n\nobfs *auth_chain_f_new_obfs();\n\n\nvoid auth_chain_a_dispose(obfs *self);\n\nvoid auth_chain_b_dispose(obfs *self);\n\nvoid auth_chain_c_dispose(obfs *self);\n\nvoid auth_chain_d_dispose(obfs *self);\n\nvoid auth_chain_e_dispose(obfs *self);\n\nvoid auth_chain_f_dispose(obfs *self);\n\n\nvoid auth_chain_a_set_server_info(obfs *self, server_info *server);\n\nvoid auth_chain_b_set_server_info(obfs *self, server_info *server);\n\nvoid auth_chain_c_set_server_info(obfs *self, server_info *server);\n\nvoid auth_chain_d_set_server_info(obfs *self, server_info *server);\n\nvoid auth_chain_e_set_server_info(obfs *self, server_info *server);\n\nvoid auth_chain_f_set_server_info(obfs *self, server_info *server);\n\n\nint auth_chain_a_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity);\n\nint auth_chain_a_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity);\n\nint auth_chain_a_client_udp_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity);\n\nint auth_chain_a_client_udp_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity);\n\n\nint auth_chain_a_get_overhead(obfs *self);\n\nint auth_chain_b_get_overhead(obfs *self);\n\nint auth_chain_c_get_overhead(obfs *self);\n\nint auth_chain_d_get_overhead(obfs *self);\n\nint auth_chain_e_get_overhead(obfs *self);\n\nint auth_chain_f_get_overhead(obfs *self);\n\n\n#endif // _OBFS_AUTH_CHAIN_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/base64.c",
    "content": "#include \"base64.h\"\n\n/* BASE 64 encode table */\nstatic const char base64en[] = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n#define BASE64_PAD  '='\n\n#define BASE64DE_FIRST  '+'\n#define BASE64DE_LAST   'z'\n\n/* ASCII order for BASE 64 decode, -1 in unused character */\nstatic const signed char base64de[] = {\n        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,\n        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,\n        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,\n        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,\n        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,\n    /*                '+', ',', '-', '.', '/', */\n        -1,  -1,  -1,  62,  -1,  -1,  -1,  63,\n    /* '0', '1', '2', '3', '4', '5', '6', '7', */\n        52,  53,  54,  55,  56,  57,  58,  59,\n    /* '8', '9', ':', ';', '<', '=', '>', '?', */\n        60,  61,  -1,  -1,  -1,  -1,  -1,  -1,\n    /* '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', */\n        -1,   0,   1,   2,   3,   4,   5,   6,\n    /* 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', */\n         7,   8,   9,  10,  11,  12,  13,  14,\n    /* 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', */\n        15,  16,  17,  18,  19,  20,  21,  22,\n    /* 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', */\n        23,  24,  25,  -1,  -1,  -1,  -1,  -1,\n    /* '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', */\n        -1,  26,  27,  28,  29,  30,  31,  32,\n    /* 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', */\n        33,  34,  35,  36,  37,  38,  39,  40,\n    /* 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', */\n        41,  42,  43,  44,  45,  46,  47,  48,\n    /* 'x', 'y', 'z', */\n        49,  50,  51,\n};\n\nint\nbase64_encode(const unsigned char *in, unsigned int inlen, char *out)\n{\n    unsigned int i, j;\n\n    for (i = j = 0; i < inlen; i++) {\n        int s = i % 3;          /* from 6/gcd(6, 8) */\n\n        switch (s) {\n        case 0:\n            out[j++] = base64en[(in[i] >> 2) & 0x3F];\n            continue;\n        case 1:\n            out[j++] = base64en[((in[i-1] & 0x3) << 4) + ((in[i] >> 4) & 0xF)];\n            continue;\n        case 2:\n            out[j++] = base64en[((in[i-1] & 0xF) << 2) + ((in[i] >> 6) & 0x3)];\n            out[j++] = base64en[in[i] & 0x3F];\n        }\n    }\n\n    /* move back */\n    i -= 1;\n\n    /* check the last and add padding */\n    if ((i % 3) == 0) {\n        out[j++] = base64en[(in[i] & 0x3) << 4];\n        out[j++] = BASE64_PAD;\n        out[j++] = BASE64_PAD;\n    } else if ((i % 3) == 1) {\n        out[j++] = base64en[(in[i] & 0xF) << 2];\n        out[j++] = BASE64_PAD;\n    }\n\n    return BASE64_OK;\n}\n\nint\nbase64_decode(const char *in, unsigned int inlen, unsigned char *out)\n{\n    unsigned int i, j;\n\n    for (i = j = 0; i < inlen; i++) {\n        int c;\n        int s = i % 4;          /* from 8/gcd(6, 8) */\n\n        if (in[i] == '=')\n            return BASE64_OK;\n\n        if (in[i] < BASE64DE_FIRST || in[i] > BASE64DE_LAST ||\n            (c = base64de[(int)in[i]]) == -1)\n            return BASE64_INVALID;\n\n        switch (s) {\n        case 0:\n            out[j] = ((unsigned int)c << 2) & 0xFF;\n            continue;\n        case 1:\n            out[j++] += ((unsigned int)c >> 4) & 0x3;\n\n            /* if not last char with padding */\n            if (i < (inlen - 3) || in[inlen - 2] != '=')\n                out[j] = (unsigned char)(((unsigned int)c & 0xF) << 4);\n            continue;\n        case 2:\n            out[j++] += ((unsigned int)c >> 2) & 0xF;\n\n            /* if not last char with padding */\n            if (i < (inlen - 2) || in[inlen - 1] != '=')\n                out[j] =  (unsigned char)(((unsigned int)c & 0x3) << 6);\n            continue;\n        case 3:\n            out[j++] += (unsigned char)c;\n        }\n    }\n\n    return BASE64_OK;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/base64.h",
    "content": "#ifndef _OBFS_BASE64_H\n#define _OBFS_BASE64_H\n\nenum {BASE64_OK = 0, BASE64_INVALID};\n\n#define BASE64_ENCODE_OUT_SIZE(s)\t(((s) + 2) / 3 * 4)\n#define BASE64_DECODE_OUT_SIZE(s)\t(((s)) / 4 * 3)\n\nint\nbase64_encode(const unsigned char *in, unsigned int inlen, char *out);\n\nint\nbase64_decode(const char *in, unsigned int inlen, unsigned char *out);\n\n\n#endif // _OBFS_BASE64_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/crc32.c",
    "content": "#include <stdlib.h>\n#include <stdint.h>\n#include \"crc32.h\"\n\nstatic uint32_t crc32_table[256] = {0};\n\nvoid init_crc32_table(void) {\n    uint32_t c, i, j;\n    if (crc32_table[0] == 0) {\n        for (i = 0; i < 256; i++) {\n            c = i;\n            for (j = 0; j < 8; j++) {\n                if (c & 1)\n                    c = 0xedb88320L ^ (c >> 1);\n                else\n                    c = c >> 1;\n            }\n            crc32_table[i] = c;\n        }\n    }\n}\n\nuint32_t crc32(unsigned char *buffer, unsigned int size) {\n    uint32_t crc = 0xFFFFFFFF;\n    unsigned int i;\n    for (i = 0; i < size; i++) {\n        crc = crc32_table[(crc ^ buffer[i]) & 0xFF] ^ (crc >> 8);\n    }\n    return crc ^ 0xFFFFFFFF;\n}\n\nvoid fillcrc32to(unsigned char *buffer, unsigned int size, unsigned char *outbuffer) {\n    uint32_t crc = 0xFFFFFFFF;\n    unsigned int i;\n    for (i = 0; i < size; i++) {\n        crc = crc32_table[(crc ^ buffer[i]) & 0xff] ^ (crc >> 8);\n    }\n    crc ^= 0xFFFFFFFF;\n    outbuffer[0] = (unsigned char)crc;\n    outbuffer[1] = (unsigned char)(crc >> 8);\n    outbuffer[2] = (unsigned char)(crc >> 16);\n    outbuffer[3] = (unsigned char)(crc >> 24);\n}\n\nvoid fillcrc32(unsigned char *buffer, unsigned int size) {\n    uint32_t crc = 0xFFFFFFFF;\n    unsigned int i;\n    size -= 4;\n    for (i = 0; i < size; i++) {\n        crc = crc32_table[(crc ^ buffer[i]) & 0xff] ^ (crc >> 8);\n    }\n    buffer += size;\n    buffer[0] = (unsigned char)crc;\n    buffer[1] = (unsigned char)(crc >> 8);\n    buffer[2] = (unsigned char)(crc >> 16);\n    buffer[3] = (unsigned char)(crc >> 24);\n}\n\nvoid adler32_short(unsigned char *buffer, unsigned int size, uint32_t *a, uint32_t *b) {\n    for (int i = 0; i < (int)size; i++) {\n        *a += buffer[i];\n        *b += *a;\n    }\n    *a %= 65521;\n    *b %= 65521;\n}\n\n#define NMAX 5552\nuint32_t adler32(unsigned char *buffer, unsigned int size) {\n    uint32_t a = 1;\n    uint32_t b = 0;\n    while ( size >= NMAX ) {\n        adler32_short(buffer, NMAX, &a, &b);\n        buffer += NMAX;\n        size -= NMAX;\n    }\n    adler32_short(buffer, size, &a, &b);\n    return (b << 16) + a;\n}\n#undef NMAX\n\nvoid filladler32(unsigned char *buffer, unsigned int size) {\n    size -= 4;\n    uint32_t checksum = adler32(buffer, size);\n    buffer += size;\n    buffer[0] = (unsigned char)checksum;\n    buffer[1] = (unsigned char)(checksum >> 8);\n    buffer[2] = (unsigned char)(checksum >> 16);\n    buffer[3] = (unsigned char)(checksum >> 24);\n}\n\nint checkadler32(unsigned char *buffer, unsigned int size) {\n    size -= 4;\n    uint32_t checksum = adler32(buffer, size);\n    buffer += size;\n    return checksum == (((uint32_t)buffer[3] << 24)\n            | ((uint32_t)buffer[2] << 16)\n            | ((uint32_t)buffer[1] << 8)\n            | (uint32_t)buffer[0]);\n}\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/crc32.h",
    "content": "#ifndef _OBFS_CRC32_H\n#define _OBFS_CRC32_H\n\nvoid init_crc32_table(void);\n\nuint32_t crc32(unsigned char *buffer, unsigned int size);\n\nvoid fillcrc32to(unsigned char *buffer, unsigned int size, unsigned char *outbuffer);\n\nvoid fillcrc32(unsigned char *buffer, unsigned int size);\n\nvoid filladler32(unsigned char *buffer, unsigned int size);\n\nint checkadler32(unsigned char *buffer, unsigned int size);\n\n#endif // _OBFS_CRC32_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/http_simple.c",
    "content": "#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <time.h>\n\n#include \"http_simple.h\"\n#include \"obfsutil.h\"\n\nstatic char* g_useragent[] = {\n    \"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0\",\n    \"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:40.0) Gecko/20100101 Firefox/44.0\",\n    \"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36\",\n    \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/27.0.1453.93 Chrome/27.0.1453.93 Safari/537.36\",\n    \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0\",\n    \"Mozilla/5.0 (compatible; WOW64; MSIE 10.0; Windows NT 6.2)\",\n    \"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\",\n    \"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C)\",\n    \"Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko\",\n    \"Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/BuildID) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36\",\n    \"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3\",\n    \"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3\",\n};\n\nstatic int g_useragent_index = -1;\n\ntypedef struct http_simple_local_data {\n    int has_sent_header;\n    int has_recv_header;\n    char *encode_buffer;\n}http_simple_local_data;\n\nvoid http_simple_local_data_init(http_simple_local_data* local) {\n    local->has_sent_header = 0;\n    local->has_recv_header = 0;\n    local->encode_buffer = NULL;\n\n    if (g_useragent_index == -1) {\n        g_useragent_index = xorshift128plus() % (sizeof(g_useragent) / sizeof(*g_useragent));\n    }\n}\n\nobfs * http_simple_new_obfs() {\n    obfs * self = new_obfs();\n    self->l_data = malloc(sizeof(http_simple_local_data));\n    http_simple_local_data_init((http_simple_local_data*)self->l_data);\n    return self;\n}\n\nvoid http_simple_dispose(obfs *self) {\n    http_simple_local_data *local = (http_simple_local_data*)self->l_data;\n    if (local->encode_buffer != NULL) {\n        free(local->encode_buffer);\n        local->encode_buffer = NULL;\n    }\n    free(local);\n    dispose_obfs(self);\n}\n\nchar http_simple_hex(char c) {\n    if (c < 10) return c + '0';\n    return c - 10 + 'a';\n}\n\nvoid http_simple_encode_head(http_simple_local_data *local, char *data, int datalength) {\n    if (local->encode_buffer == NULL) {\n        local->encode_buffer = (char*)malloc((size_t)(datalength * 3 + 1));\n    }\n    int pos = 0;\n    for (; pos < datalength; ++pos) {\n        local->encode_buffer[pos * 3] = '%';\n        local->encode_buffer[pos * 3 + 1] = http_simple_hex(((unsigned char)data[pos] >> 4));\n        local->encode_buffer[pos * 3 + 2] = http_simple_hex(data[pos] & 0xF);\n    }\n    local->encode_buffer[pos * 3] = 0;\n}\n\nint http_simple_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity) {\n    char *encryptdata = *pencryptdata;\n    http_simple_local_data *local = (http_simple_local_data*)self->l_data;\n    if (local->has_sent_header) {\n        return datalength;\n    }\n    char hosts[1024];\n    char * phost[128];\n    int host_num = 0;\n    int pos;\n    char hostport[128];\n    int head_size = self->server.head_len + (int)(xorshift128plus() & 0x3F);\n    int outlength;\n    char * out_buffer = (char*)malloc((size_t)(datalength + 2048));\n    char * body_buffer = NULL;\n    if (head_size > datalength)\n        head_size = datalength;\n    http_simple_encode_head(local, encryptdata, head_size);\n    if (self->server.param && strlen(self->server.param) == 0)\n        self->server.param = NULL;\n    strncpy(hosts, self->server.param ? self->server.param : self->server.host, sizeof hosts);\n    phost[host_num++] = hosts;\n    for (pos = 0; hosts[pos]; ++pos) {\n        if (hosts[pos] == ',') {\n            phost[host_num++] = &hosts[pos + 1];\n            hosts[pos] = 0;\n        } else if (hosts[pos] == '#') {\n            char * body_pointer = &hosts[pos + 1];\n            char * p;\n            int trans_char = 0;\n            p = body_buffer = (char*)malloc(2048);\n            for ( ; *body_pointer; ++body_pointer) {\n                if (trans_char) {\n                    if (*body_pointer == '\\\\' ) {\n                        *p = '\\\\';\n                    } else if (*body_pointer == 'n' ) {\n                        *p = '\\r';\n                        *++p = '\\n';\n                    } else {\n                        *p = '\\\\';\n                        *++p = *body_pointer;\n                    }\n                    trans_char = 0;\n                } else {\n                    if (*body_pointer == '\\\\') {\n                        trans_char = 1;\n                        continue;\n                    } else if (*body_pointer == '\\n') {\n                        *p++ = '\\r';\n                    }\n                    *p = *body_pointer;\n                }\n                ++p;\n            }\n            *p = 0;\n            hosts[pos] = 0;\n            break;\n        }\n    }\n    host_num = (int)(xorshift128plus() % (uint64_t)host_num);\n    if (self->server.port == 80)\n        sprintf(hostport, \"%s\", phost[host_num]);\n    else\n        sprintf(hostport, \"%s:%d\", phost[host_num], self->server.port);\n    if (body_buffer) {\n        sprintf(out_buffer,\n            \"GET /%s HTTP/1.1\\r\\n\"\n            \"Host: %s\\r\\n\"\n            \"%s\\r\\n\\r\\n\",\n            local->encode_buffer,\n            hostport,\n            body_buffer);\n    } else {\n        sprintf(out_buffer,\n            \"GET /%s HTTP/1.1\\r\\n\"\n            \"Host: %s\\r\\n\"\n            \"User-Agent: %s\\r\\n\"\n            \"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\\r\\n\"\n            \"Accept-Language: en-US,en;q=0.8\\r\\n\"\n            \"Accept-Encoding: gzip, deflate\\r\\n\"\n            \"DNT: 1\\r\\n\"\n            \"Connection: keep-alive\\r\\n\"\n            \"\\r\\n\",\n            local->encode_buffer,\n            hostport,\n            g_useragent[g_useragent_index]\n            );\n    }\n    //LOGI(\"http header: %s\", out_buffer);\n    outlength = (int)strlen(out_buffer);\n    memmove(out_buffer + outlength, encryptdata + head_size, datalength - head_size);\n    outlength += datalength - head_size;\n    local->has_sent_header = 1;\n    if ((int)*capacity < outlength) {\n        *pencryptdata = (char*)realloc(*pencryptdata, *capacity = (size_t)(outlength * 2));\n        encryptdata = *pencryptdata;\n    }\n    memmove(encryptdata, out_buffer, outlength);\n    free(out_buffer);\n    if (body_buffer != NULL)\n        free(body_buffer);\n    if (local->encode_buffer != NULL) {\n        free(local->encode_buffer);\n        local->encode_buffer = NULL;\n    }\n    return outlength;\n}\n\nint http_simple_client_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback) {\n    char *encryptdata = *pencryptdata;\n    http_simple_local_data *local = (http_simple_local_data*)self->l_data;\n    *needsendback = 0;\n    if (local->has_recv_header) {\n        return datalength;\n    }\n    char* data_begin = strstr(encryptdata, \"\\r\\n\\r\\n\");\n    if (data_begin) {\n        int outlength;\n        data_begin += 4;\n        local->has_recv_header = 1;\n        outlength = datalength - (int)(data_begin - encryptdata);\n        memmove(encryptdata, data_begin, outlength);\n        return outlength;\n    } else {\n        return 0;\n    }\n}\n\nvoid boundary(char result[])\n{\n    char *str = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n    int i,lstr;\n    char ss[3] = {0};\n    lstr = (int)strlen(str);\n    srand((unsigned int)time((time_t *)NULL));\n    for(i = 0; i < 32; ++i)\n    {\n        sprintf(ss, \"%c\", str[(rand()%lstr)]);\n        strcat(result, ss);\n    }\n}\n\nint http_post_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity) {\n    char *encryptdata = *pencryptdata;\n    http_simple_local_data *local = (http_simple_local_data*)self->l_data;\n    if (local->has_sent_header) {\n        return datalength;\n    }\n    char hosts[1024];\n    char * phost[128];\n    int host_num = 0;\n    int pos;\n    char hostport[128];\n    int head_size = self->server.head_len + (int)(xorshift128plus() & 0x3F);\n    int outlength;\n    char * out_buffer = (char*)malloc((size_t)(datalength + 4096));\n    char * body_buffer = NULL;\n    if (head_size > datalength)\n        head_size = datalength;\n    http_simple_encode_head(local, encryptdata, head_size);\n    if (self->server.param && strlen(self->server.param) == 0)\n        self->server.param = NULL;\n    strncpy(hosts, self->server.param ? self->server.param : self->server.host, sizeof hosts);\n    phost[host_num++] = hosts;\n    for (pos = 0; hosts[pos]; ++pos) {\n        if (hosts[pos] == ',') {\n            phost[host_num++] = &hosts[pos + 1];\n            hosts[pos] = 0;\n        } else if (hosts[pos] == '#') {\n            char * body_pointer = &hosts[pos + 1];\n            char * p;\n            int trans_char = 0;\n            p = body_buffer = (char*)malloc(2048);\n            for ( ; *body_pointer; ++body_pointer) {\n                if (trans_char) {\n                    if (*body_pointer == '\\\\' ) {\n                        *p = '\\\\';\n                    } else if (*body_pointer == 'n' ) {\n                        *p = '\\r';\n                        *++p = '\\n';\n                    } else {\n                        *p = '\\\\';\n                        *++p = *body_pointer;\n                    }\n                    trans_char = 0;\n                } else {\n                    if (*body_pointer == '\\\\') {\n                        trans_char = 1;\n                        continue;\n                    } else if (*body_pointer == '\\n') {\n                        *p++ = '\\r';\n                    }\n                    *p = *body_pointer;\n                }\n                ++p;\n            }\n            *p = 0;\n            hosts[pos] = 0;\n            break;\n        }\n    }\n    host_num = (int)(xorshift128plus() % (uint64_t)host_num);\n    if (self->server.port == 80)\n        snprintf(hostport, sizeof(hostport), \"%s\", phost[host_num]);\n    else\n        snprintf(hostport, sizeof(hostport), \"%s:%d\", phost[host_num], self->server.port);\n    if (body_buffer) {\n        snprintf(out_buffer, 2048,\n            \"POST /%s HTTP/1.1\\r\\n\"\n            \"Host: %s\\r\\n\"\n            \"%s\\r\\n\\r\\n\",\n            local->encode_buffer,\n            hostport,\n            body_buffer);\n    } else {\n        char result[33] = {0};\n        boundary(result);\n        snprintf(out_buffer, 2048,\n            \"POST /%s HTTP/1.1\\r\\n\"\n            \"Host: %s\\r\\n\"\n            \"User-Agent: %s\\r\\n\"\n            \"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\\r\\n\"\n            \"Accept-Language: en-US,en;q=0.8\\r\\n\"\n            \"Accept-Encoding: gzip, deflate\\r\\n\"\n            \"Content-Type: multipart/form-data; boundary=%s\\r\\n\"\n            \"DNT: 1\\r\\n\"\n            \"Connection: keep-alive\\r\\n\"\n            \"\\r\\n\",\n            local->encode_buffer,\n            hostport,\n            g_useragent[g_useragent_index],\n            result\n            );\n    }\n    //LOGI(\"http header: %s\", out_buffer);\n    outlength = (int)strlen(out_buffer);\n    memmove(out_buffer + outlength, encryptdata + head_size, datalength - head_size);\n    outlength += datalength - head_size;\n    local->has_sent_header = 1;\n    if ((int)*capacity < outlength) {\n        *pencryptdata = (char*)realloc(*pencryptdata, *capacity = (size_t)(outlength * 2));\n        encryptdata = *pencryptdata;\n    }\n    memmove(encryptdata, out_buffer, outlength);\n    free(out_buffer);\n    if (body_buffer != NULL)\n        free(body_buffer);\n    if (local->encode_buffer != NULL) {\n        free(local->encode_buffer);\n        local->encode_buffer = NULL;\n    }\n    return outlength;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/http_simple.h",
    "content": "/*\n * http_simple.h - Define shadowsocksR server's buffers and callbacks\n *\n * Copyright (C) 2015 - 2016, Break Wa11 <mmgac001@gmail.com>\n */\n\n#ifndef _OBFS_HTTP_SIMPLE_H\n#define _OBFS_HTTP_SIMPLE_H\n\n#include \"obfs.h\"\n\nobfs * http_simple_new_obfs();\nvoid http_simple_dispose(obfs *self);\n\nint http_simple_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity);\nint http_simple_client_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback);\n\nint http_post_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity);\n\n#endif // _OBFS_HTTP_SIMPLE_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/obfs.c",
    "content": "#include <string.h>\n#include <stdlib.h>\n#include \"obfs.h\"\n\nint rand_bytes(uint8_t *output, int len);\n\n#include \"obfsutil.h\"\n#include \"crc32.h\"\n#include \"http_simple.h\"\n#include \"tls1.2_ticket.h\"\n#include \"verify.h\"\n#include \"auth.h\"\n#include \"auth_chain.h\"\n\n#include \"../utils.h\"\n\nvoid *init_data() {\n    return malloc(1);\n}\n\nobfs *new_obfs() {\n    obfs *self = (obfs *) malloc(sizeof(obfs));\n    self->l_data = NULL;\n    return self;\n}\n\nint get_overhead(obfs *self) {\n    return 0;\n}\n\nvoid set_server_info(obfs *self, server_info *server) {\n    memmove(&self->server, server, sizeof(server_info));\n}\n\nvoid get_server_info(obfs *self, server_info *server) {\n    memmove(server, &self->server, sizeof(server_info));\n}\n\nvoid dispose_obfs(obfs *self) {\n    free(self);\n}\n\nobfs_class *new_obfs_class(const char *plugin_name) {\n    if (plugin_name == NULL)\n        return NULL;\n    if (strcmp(plugin_name, \"origin\") == 0)\n        return NULL;\n    if (strcmp(plugin_name, \"plain\") == 0)\n        return NULL;\n    init_crc32_table();\n    init_shift128plus();\n    if (strcmp(plugin_name, \"http_simple\") == 0) {\n        obfs_class *plugin = (obfs_class *) malloc(sizeof(obfs_class));\n        plugin->init_data = init_data;\n        plugin->new_obfs = http_simple_new_obfs;\n        plugin->get_overhead = get_overhead;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = http_simple_dispose;\n\n        plugin->client_encode = http_simple_client_encode;\n        plugin->client_decode = http_simple_client_decode;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"http_post\") == 0) {\n        obfs_class *plugin = (obfs_class *) malloc(sizeof(obfs_class));\n        plugin->init_data = init_data;\n        plugin->new_obfs = http_simple_new_obfs;\n        plugin->get_overhead = get_overhead;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = http_simple_dispose;\n\n        plugin->client_encode = http_post_client_encode;\n        plugin->client_decode = http_simple_client_decode;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"tls1.2_ticket_auth\") == 0) {\n        obfs_class *plugin = (obfs_class *) malloc(sizeof(obfs_class));\n        plugin->init_data = tls12_ticket_auth_init_data;\n        plugin->new_obfs = tls12_ticket_auth_new_obfs;\n        plugin->get_overhead = tls12_ticket_auth_get_overhead;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = tls12_ticket_auth_dispose;\n\n        plugin->client_encode = tls12_ticket_auth_client_encode;\n        plugin->client_decode = tls12_ticket_auth_client_decode;\n\n        return plugin;\n        /*} else if (strcmp(plugin_name, \"verify_simple\") == 0) {\n            obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs_class));\n            plugin->init_data = init_data;\n            plugin->new_obfs = verify_simple_new_obfs;\n            plugin->get_server_info = get_server_info;\n            plugin->set_server_info = set_server_info;\n            plugin->dispose = verify_simple_dispose;\n\n            plugin->client_pre_encrypt = verify_simple_client_pre_encrypt;\n            plugin->client_post_decrypt = verify_simple_client_post_decrypt;\n            plugin->client_udp_pre_encrypt = NULL;\n            plugin->client_udp_post_decrypt = NULL;\n\n            return plugin;\n        } else if (strcmp(plugin_name, \"auth_simple\") == 0) {\n            obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs_class));\n            plugin->init_data = auth_simple_init_data;\n            plugin->new_obfs = auth_simple_new_obfs;\n            plugin->get_server_info = get_server_info;\n            plugin->set_server_info = set_server_info;\n            plugin->dispose = auth_simple_dispose;\n\n            plugin->client_pre_encrypt = auth_simple_client_pre_encrypt;\n            plugin->client_post_decrypt = auth_simple_client_post_decrypt;\n            plugin->client_udp_pre_encrypt = NULL;\n            plugin->client_udp_post_decrypt = NULL;\n\n            return plugin;*/\n    } else if (strcmp(plugin_name, \"auth_sha1\") == 0) {\n        obfs_class *plugin = (obfs_class *) malloc(sizeof(obfs_class));\n        plugin->init_data = auth_simple_init_data;\n        plugin->new_obfs = auth_simple_new_obfs;\n        plugin->get_overhead = get_overhead;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = auth_simple_dispose;\n\n        plugin->client_pre_encrypt = auth_sha1_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_sha1_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = NULL;\n        plugin->client_udp_post_decrypt = NULL;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_sha1_v2\") == 0) {\n        obfs_class *plugin = (obfs_class *) malloc(sizeof(obfs_class));\n        plugin->init_data = auth_simple_init_data;\n        plugin->new_obfs = auth_simple_new_obfs;\n        plugin->get_overhead = get_overhead;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = auth_simple_dispose;\n\n        plugin->client_pre_encrypt = auth_sha1_v2_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_sha1_v2_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = NULL;\n        plugin->client_udp_post_decrypt = NULL;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_sha1_v4\") == 0) {\n        obfs_class *plugin = (obfs_class *) malloc(sizeof(obfs_class));\n        plugin->init_data = auth_simple_init_data;\n        plugin->new_obfs = auth_simple_new_obfs;\n        plugin->get_overhead = get_overhead;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = auth_simple_dispose;\n\n        plugin->client_pre_encrypt = auth_sha1_v4_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_sha1_v4_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = NULL;\n        plugin->client_udp_post_decrypt = NULL;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_aes128_md5\") == 0 || strcmp(plugin_name, \"auth_aes128_sha1\") == 0) {\n        obfs_class *plugin = (obfs_class *) malloc(sizeof(obfs_class));\n        plugin->init_data = auth_simple_init_data;\n        plugin->new_obfs = strcmp(plugin_name, \"auth_aes128_md5\") == 0 ?\n                           auth_aes128_md5_new_obfs : auth_aes128_sha1_new_obfs;\n        plugin->get_overhead = auth_aes128_sha1_get_overhead;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = auth_simple_dispose;\n\n        plugin->client_pre_encrypt = auth_aes128_sha1_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_aes128_sha1_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = auth_aes128_sha1_client_udp_pre_encrypt;\n        plugin->client_udp_post_decrypt = auth_aes128_sha1_client_udp_post_decrypt;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_chain_a\") == 0) {\n        obfs_class *plugin = (obfs_class *) malloc(sizeof(obfs_class));\n        plugin->init_data = auth_chain_a_init_data;\n        plugin->new_obfs = auth_chain_a_new_obfs;\n        plugin->get_overhead = auth_chain_a_get_overhead;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = auth_chain_a_set_server_info;\n        plugin->dispose = auth_chain_a_dispose;\n\n        plugin->client_pre_encrypt = auth_chain_a_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_chain_a_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = auth_chain_a_client_udp_pre_encrypt;\n        plugin->client_udp_post_decrypt = auth_chain_a_client_udp_post_decrypt;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_chain_b\") == 0) {\n        obfs_class *plugin = (obfs_class *) malloc(sizeof(obfs_class));\n        plugin->init_data = auth_chain_b_init_data;\n        plugin->new_obfs = auth_chain_b_new_obfs;\n        plugin->get_overhead = auth_chain_b_get_overhead;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = auth_chain_b_set_server_info;\n        plugin->dispose = auth_chain_b_dispose;\n\n        plugin->client_pre_encrypt = auth_chain_a_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_chain_a_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = auth_chain_a_client_udp_pre_encrypt;\n        plugin->client_udp_post_decrypt = auth_chain_a_client_udp_post_decrypt;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_chain_c\") == 0) {\n        obfs_class *plugin = (obfs_class *) malloc(sizeof(obfs_class));\n        plugin->init_data = auth_chain_c_init_data;\n        plugin->new_obfs = auth_chain_c_new_obfs;\n        plugin->get_overhead = auth_chain_c_get_overhead;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = auth_chain_c_set_server_info;\n        plugin->dispose = auth_chain_c_dispose;\n\n        plugin->client_pre_encrypt = auth_chain_a_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_chain_a_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = auth_chain_a_client_udp_pre_encrypt;\n        plugin->client_udp_post_decrypt = auth_chain_a_client_udp_post_decrypt;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_chain_d\") == 0) {\n        obfs_class *plugin = (obfs_class *) malloc(sizeof(obfs_class));\n        plugin->init_data = auth_chain_d_init_data;\n        plugin->new_obfs = auth_chain_d_new_obfs;\n        plugin->get_overhead = auth_chain_d_get_overhead;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = auth_chain_d_set_server_info;\n        plugin->dispose = auth_chain_d_dispose;\n\n        plugin->client_pre_encrypt = auth_chain_a_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_chain_a_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = auth_chain_a_client_udp_pre_encrypt;\n        plugin->client_udp_post_decrypt = auth_chain_a_client_udp_post_decrypt;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_chain_e\") == 0) {\n        obfs_class *plugin = (obfs_class *) malloc(sizeof(obfs_class));\n        plugin->init_data = auth_chain_e_init_data;\n        plugin->new_obfs = auth_chain_e_new_obfs;\n        plugin->get_overhead = auth_chain_e_get_overhead;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = auth_chain_e_set_server_info;\n        plugin->dispose = auth_chain_e_dispose;\n\n        plugin->client_pre_encrypt = auth_chain_a_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_chain_a_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = auth_chain_a_client_udp_pre_encrypt;\n        plugin->client_udp_post_decrypt = auth_chain_a_client_udp_post_decrypt;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_chain_f\") == 0) {\n        obfs_class *plugin = (obfs_class *) malloc(sizeof(obfs_class));\n        plugin->init_data = auth_chain_f_init_data;\n        plugin->new_obfs = auth_chain_f_new_obfs;\n        plugin->get_overhead = auth_chain_f_get_overhead;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = auth_chain_f_set_server_info;\n        plugin->dispose = auth_chain_f_dispose;\n\n        plugin->client_pre_encrypt = auth_chain_a_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_chain_a_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = auth_chain_a_client_udp_pre_encrypt;\n        plugin->client_udp_post_decrypt = auth_chain_a_client_udp_post_decrypt;\n\n        return plugin;\n    }\n    LOGE(\"Load obfs '%s' failed\", plugin_name);\n    return NULL;\n}\n\nvoid free_obfs_class(obfs_class *plugin) {\n    free(plugin);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/obfs.h",
    "content": "/*\n * obfs.h - Define shadowsocksR server's buffers and callbacks\n *\n * Copyright (C) 2015 - 2016, Break Wa11 <mmgac001@gmail.com>\n */\n\n#ifndef _OBFS_OBFS_H\n#define _OBFS_OBFS_H\n\n#include <stdint.h>\n#include <unistd.h>\n#include \"encrypt.h\"\n\n#define OBFS_HMAC_SHA1_LEN 10\n\ntypedef struct {\n    char host[256];\n    uint16_t port;\n    char *param;\n    void *g_data;\n    uint8_t *iv;\n    uint16_t iv_len;\n    uint8_t *recv_iv;\n    uint16_t recv_iv_len;\n    uint8_t *key;\n    uint16_t key_len;\n    int head_len;\n    uint16_t tcp_mss;\n    uint16_t overhead;\n    uint32_t buffer_size;\n    cipher_env_t *cipher_env;\n}server_info;\n\ntypedef struct {\n    server_info server;\n    void *l_data;\n}obfs;\n\ntypedef struct {\n    void * (*init_data)();\n    obfs * (*new_obfs)();\n    int  (*get_overhead)(obfs *self);\n    void (*get_server_info)(obfs *self, server_info *server);\n    void (*set_server_info)(obfs *self, server_info *server);\n    void (*dispose)(obfs *self);\n\n    int (*client_pre_encrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*client_encode)(obfs *self,\n            char **pencryptdata,\n            int datalength,\n            size_t* capacity);\n    int (*client_decode)(obfs *self,\n            char **pencryptdata,\n            int datalength,\n            size_t* capacity,\n            int *needsendback);\n    int (*client_post_decrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*client_udp_pre_encrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*client_udp_post_decrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n}obfs_class;\n\nobfs_class * new_obfs_class(const char *plugin_name);\nvoid free_obfs_class(obfs_class *plugin);\n\nvoid set_server_info(obfs *self, server_info *server);\nvoid get_server_info(obfs *self, server_info *server);\nobfs * new_obfs();\nvoid dispose_obfs(obfs *self);\n\n#endif // _OBFS_OBFS_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/obfsutil.c",
    "content": "#include <stdint.h>\r\n#include <time.h>\r\n\r\n#include \"obfsutil.h\"\r\n#include \"encrypt.h\"\r\n\r\nint get_head_size(char *plaindata, int size, int def_size) {\r\n    if (plaindata == NULL || size < 2)\r\n        return def_size;\r\n    int head_type = plaindata[0] & 0x7;\r\n    if (head_type == 1)\r\n        return 7;\r\n    if (head_type == 4)\r\n        return 19;\r\n    if (head_type == 3)\r\n        return 4 + plaindata[1];\r\n    return def_size;\r\n}\r\n\r\nstatic int shift128plus_init_flag = 0;\r\nstatic uint64_t shift128plus_s[2] = {0x10000000, 0xFFFFFFFF};\r\n\r\nvoid init_shift128plus(void) {\r\n    if (shift128plus_init_flag == 0) {\r\n        shift128plus_init_flag = 1;\r\n        uint32_t seed = (uint32_t)time(NULL);\r\n        shift128plus_s[0] = seed | 0x100000000L;\r\n        shift128plus_s[1] = ((uint64_t)seed << 32) | 0x1;\r\n    }\r\n}\r\n\r\nuint64_t xorshift128plus(void) {\r\n    uint64_t x = shift128plus_s[0];\r\n    uint64_t const y = shift128plus_s[1];\r\n    shift128plus_s[0] = y;\r\n    x ^= x << 23; // a\r\n    x ^= x >> 17; // b\r\n    x ^= y ^ (y >> 26); // c\r\n    shift128plus_s[1] = x;\r\n    return x + y;\r\n}\r\n\r\nint ss_md5_hmac(char *auth, char *msg, int msg_len, uint8_t *iv, int enc_iv_len, uint8_t *enc_key, int enc_key_len)\r\n{\r\n    uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH];\r\n    memcpy(auth_key, iv, enc_iv_len);\r\n    memcpy(auth_key + enc_iv_len, enc_key, enc_key_len);\r\n    return ss_md5_hmac_with_key(auth, msg, msg_len, auth_key, enc_iv_len + enc_key_len);\r\n}\r\n\r\nint ss_sha1_hmac(char *auth, char *msg, int msg_len, uint8_t *iv, int enc_iv_len, uint8_t *enc_key, int enc_key_len)\r\n{\r\n    uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH];\r\n    memcpy(auth_key, iv, enc_iv_len);\r\n    memcpy(auth_key + enc_iv_len, enc_key, enc_key_len);\r\n    return ss_sha1_hmac_with_key(auth, msg, msg_len, auth_key, enc_iv_len + enc_key_len);\r\n}\r\n\r\nvoid memintcopy_lt(void *mem, uint32_t val) {\r\n    ((uint8_t *)mem)[0] = (uint8_t)(val);\r\n    ((uint8_t *)mem)[1] = (uint8_t)(val >> 8);\r\n    ((uint8_t *)mem)[2] = (uint8_t)(val >> 16);\r\n    ((uint8_t *)mem)[3] = (uint8_t)(val >> 24);\r\n}\r\n\r\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/obfsutil.h",
    "content": "#ifndef _OBFS_OBFSUTIL_H\n#define _OBFS_OBFSUTIL_H\n\nint get_head_size(char *plaindata, int size, int def_size);\n\nvoid init_shift128plus(void);\n\nuint64_t xorshift128plus(void);\n\nint ss_md5_hmac(char *auth, char *msg, int msg_len, uint8_t *iv, int enc_iv_len, uint8_t *enc_key, int enc_key_len);\n\nint ss_sha1_hmac(char *auth, char *msg, int msg_len, uint8_t *iv, int enc_iv_len, uint8_t *enc_key, int enc_key_len);\n\nvoid memintcopy_lt(void *mem, uint32_t val);\n\n#endif // _OBFS_OBFSUTIL_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/tls1.2_ticket.c",
    "content": "#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <time.h>\n\n#include \"tls1.2_ticket.h\"\n#include \"obfsutil.h\"\n#include \"encrypt.h\"\n\ntypedef struct tls12_ticket_auth_global_data {\n    uint8_t local_client_id[32];\n} tls12_ticket_auth_global_data;\n\ntypedef struct tls12_ticket_auth_local_data {\n    int handshake_status;\n    char *send_buffer;\n    int send_buffer_size;\n    char *recv_buffer;\n    int recv_buffer_size;\n} tls12_ticket_auth_local_data;\n\nvoid tls12_ticket_auth_local_data_init(tls12_ticket_auth_local_data *local) {\n    local->handshake_status = 0;\n    local->send_buffer = malloc(0);\n    local->send_buffer_size = 0;\n    local->recv_buffer = malloc(0);\n    local->recv_buffer_size = 0;\n}\n\nvoid *tls12_ticket_auth_init_data() {\n    tls12_ticket_auth_global_data *global =\n            (tls12_ticket_auth_global_data *) malloc(sizeof(tls12_ticket_auth_global_data));\n    rand_bytes(global->local_client_id, 32);\n    return global;\n}\n\nobfs *tls12_ticket_auth_new_obfs() {\n    obfs *self = new_obfs();\n    self->l_data = malloc(sizeof(tls12_ticket_auth_local_data));\n    tls12_ticket_auth_local_data_init((tls12_ticket_auth_local_data *) self->l_data);\n    return self;\n}\n\nint tls12_ticket_auth_get_overhead(obfs *self) {\n    return 5;\n}\n\nvoid tls12_ticket_auth_dispose(obfs *self) {\n    tls12_ticket_auth_local_data *local = (tls12_ticket_auth_local_data *) self->l_data;\n    if (local->send_buffer != NULL) {\n        free(local->send_buffer);\n        local->send_buffer = NULL;\n    }\n    if (local->recv_buffer != NULL) {\n        free(local->recv_buffer);\n        local->recv_buffer = NULL;\n    }\n    free(local);\n    dispose_obfs(self);\n}\n\nint tls12_ticket_pack_auth_data(tls12_ticket_auth_global_data *global, server_info *server, char *outdata) {\n    int out_size = 32;\n    time_t t = time(NULL);\n    outdata[0] = (char) (t >> 24);\n    outdata[1] = (char) (t >> 16);\n    outdata[2] = (char) (t >> 8);\n    outdata[3] = (char) t;\n    rand_bytes((uint8_t *) outdata + 4, 18);\n\n    uint8_t *key = (uint8_t *) malloc(server->key_len + 32);\n    char hash[SHA1_BYTES];\n    memcpy(key, server->key, server->key_len);\n    memcpy(key + server->key_len, global->local_client_id, 32);\n    ss_sha1_hmac_with_key(hash, outdata, out_size - OBFS_HMAC_SHA1_LEN, key, (int) (server->key_len + 32));\n    free(key);\n    memcpy(outdata + out_size - OBFS_HMAC_SHA1_LEN, hash, OBFS_HMAC_SHA1_LEN);\n    return out_size;\n}\n\nvoid tls12_ticket_auth_pack_data(char *encryptdata, int start, int len, char *out_buffer, int outlength) {\n    out_buffer[outlength] = 0x17;\n    out_buffer[outlength + 1] = 0x3;\n    out_buffer[outlength + 2] = 0x3;\n    out_buffer[outlength + 3] = (char) (len >> 8);\n    out_buffer[outlength + 4] = (char) len;\n    memcpy(out_buffer + outlength + 5, encryptdata + start, len);\n}\n\nint tls12_ticket_auth_client_encode(obfs *self, char **pencryptdata, int datalength, size_t *capacity) {\n    char *encryptdata = *pencryptdata;\n    tls12_ticket_auth_local_data *local = (tls12_ticket_auth_local_data *) self->l_data;\n    tls12_ticket_auth_global_data *global = (tls12_ticket_auth_global_data *) self->server.g_data;\n    char *out_buffer = NULL;\n\n    if (local->handshake_status == 8) {\n        if (datalength < 1024) {\n            if ((int) *capacity < datalength + 5) {\n                *pencryptdata = (char *) realloc(*pencryptdata, *capacity = (size_t) ((datalength + 5) * 2));\n                encryptdata = *pencryptdata;\n            }\n            memmove(encryptdata + 5, encryptdata, datalength);\n            encryptdata[0] = 0x17;\n            encryptdata[1] = 0x3;\n            encryptdata[2] = 0x3;\n            encryptdata[3] = (char) (datalength >> 8);\n            encryptdata[4] = (char) datalength;\n            return datalength + 5;\n        } else {\n            out_buffer = (char *) malloc((size_t) (datalength + 4096));\n            int start = 0;\n            int outlength = 0;\n            int len;\n            while (datalength - start > 2048) {\n                len = xorshift128plus() % 4096 + 100;\n                if (len > datalength - start)\n                    len = datalength - start;\n                tls12_ticket_auth_pack_data(encryptdata, start, len, out_buffer, outlength);\n                outlength += len + 5;\n                start += len;\n            }\n            if (datalength - start > 0) {\n                len = datalength - start;\n                tls12_ticket_auth_pack_data(encryptdata, start, len, out_buffer, outlength);\n                outlength += len + 5;\n            }\n            if ((int) *capacity < outlength) {\n                *pencryptdata = (char *) realloc(*pencryptdata, *capacity = (size_t) (outlength * 2));\n                encryptdata = *pencryptdata;\n            }\n            memcpy(encryptdata, out_buffer, outlength);\n            free(out_buffer);\n            return outlength;\n        }\n    }\n\n    if (datalength > 0) {\n        if (datalength < 1024) {\n            local->send_buffer = (char *) realloc(local->send_buffer,\n                                                  (size_t) (local->send_buffer_size + datalength + 5));\n            tls12_ticket_auth_pack_data(encryptdata, 0, datalength, local->send_buffer, local->send_buffer_size);\n            local->send_buffer_size += datalength + 5;\n        } else {\n            out_buffer = (char *) malloc((size_t) (datalength + 4096));\n            int start = 0;\n            int outlength = 0;\n            int len;\n            while (datalength - start > 2048) {\n                len = xorshift128plus() % 4096 + 100;\n                if (len > datalength - start)\n                    len = datalength - start;\n                tls12_ticket_auth_pack_data(encryptdata, start, len, out_buffer, outlength);\n                outlength += len + 5;\n                start += len;\n            }\n            if (datalength - start > 0) {\n                len = datalength - start;\n                tls12_ticket_auth_pack_data(encryptdata, start, len, out_buffer, outlength);\n                outlength += len + 5;\n            }\n            if ((int) *capacity < outlength) {\n                *pencryptdata = (char *) realloc(*pencryptdata, *capacity = (size_t) (outlength * 2));\n                encryptdata = *pencryptdata;\n            }\n            local->send_buffer = (char *) realloc(local->send_buffer, (size_t) (local->send_buffer_size + outlength));\n            memcpy(local->send_buffer + local->send_buffer_size, out_buffer, outlength);\n            local->send_buffer_size += outlength;\n            free(out_buffer);\n        }\n    }\n\n    if (local->handshake_status == 0) {\n#define CSTR_DECL(name, len, str) const char* name = str; const int (len) = sizeof(str) - 1;\n        CSTR_DECL(tls_data0, tls_data0_len,\n                  \"\\x00\\x1c\\xc0\\x2b\\xc0\\x2f\\xcc\\xa9\\xcc\\xa8\\xcc\\x14\\xcc\\x13\\xc0\\x0a\\xc0\\x14\\xc0\\x09\\xc0\\x13\\x00\\x9c\\x00\\x35\\x00\\x2f\\x00\\x0a\\x01\\x00\"\n        );\n        CSTR_DECL(tls_data1, tls_data1_len,\n                  \"\\xff\\x01\\x00\\x01\\x00\"\n        );\n        CSTR_DECL(tls_data2, tls_data2_len,\n                  \"\\x00\\x17\\x00\\x00\\x00\\x23\\x00\\xd0\"\n        );\n        CSTR_DECL(tls_data3, tls_data3_len,\n                  \"\\x00\\x0d\\x00\\x16\\x00\\x14\\x06\\x01\\x06\\x03\\x05\\x01\\x05\\x03\\x04\\x01\\x04\\x03\\x03\\x01\\x03\\x03\\x02\\x01\\x02\\x03\\x00\\x05\\x00\\x05\\x01\\x00\\x00\\x00\\x00\\x00\\x12\\x00\\x00\\x75\\x50\\x00\\x00\\x00\\x0b\\x00\\x02\\x01\\x00\\x00\\x0a\\x00\\x06\\x00\\x04\\x00\\x17\\x00\\x18\"\n        //\"00150066000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\" // padding\n        );\n        uint8_t tls_data[2048];\n        int tls_data_len = 0;\n        memcpy(tls_data, tls_data1, tls_data1_len);\n        tls_data_len += tls_data1_len;\n\n        char hosts[1024];\n        char *phost[128];\n        int host_num = 0;\n        int pos;\n\n        char sni[256] = {0};\n        char *param = NULL;\n        if (self->server.param && strlen(self->server.param) > 0)\n            param = self->server.param;\n        else\n            param = self->server.host;\n        strncpy(hosts, param, sizeof hosts);\n        phost[host_num++] = hosts;\n        for (pos = 0; hosts[pos]; ++pos) {\n            if (hosts[pos] == ',') {\n                phost[host_num++] = &hosts[pos + 1];\n                hosts[pos] = 0;\n            }\n        }\n        host_num = (int) (xorshift128plus() % (uint64_t) host_num);\n\n        snprintf(sni, sizeof sni, \"%s\", phost[host_num]);\n        int sni_len = (int) strlen(sni);\n        if (sni_len > 0 && sni[sni_len - 1] >= '0' && sni[sni_len - 1] <= '9')\n            sni_len = 0;\n        tls_data[tls_data_len] = '\\0';\n        tls_data[tls_data_len + 1] = '\\0';\n        tls_data[tls_data_len + 2] = (uint8_t) ((sni_len + 5) >> 8);\n        tls_data[tls_data_len + 3] = (uint8_t) (sni_len + 5);\n        tls_data[tls_data_len + 4] = (uint8_t) ((sni_len + 3) >> 8);\n        tls_data[tls_data_len + 5] = (uint8_t) (sni_len + 3);\n        tls_data[tls_data_len + 6] = '\\0';\n        tls_data[tls_data_len + 7] = (uint8_t) (sni_len >> 8);\n        tls_data[tls_data_len + 8] = (uint8_t) sni_len;\n        memcpy(tls_data + tls_data_len + 9, sni, sni_len);\n        tls_data_len += 9 + sni_len;\n        memcpy(tls_data + tls_data_len, tls_data2, tls_data2_len);\n        tls_data_len += tls_data2_len;\n        unsigned ticket_len = (unsigned) (xorshift128plus() % (uint64_t) 164) * 2 + 64;\n        tls_data[tls_data_len - 1] = (uint8_t) (ticket_len & 0xff);\n        tls_data[tls_data_len - 2] = (uint8_t) (ticket_len >> 8);\n        rand_bytes(tls_data + tls_data_len, ticket_len);\n        tls_data_len += ticket_len;\n        memcpy(tls_data + tls_data_len, tls_data3, tls_data3_len);\n        tls_data_len += tls_data3_len;\n\n        datalength = 11 + 32 + 1 + 32 + tls_data0_len + 2 + tls_data_len;\n        out_buffer = (char *) malloc((size_t) datalength);\n        char *pdata = out_buffer + datalength - tls_data_len;\n        int len = tls_data_len;\n        memcpy(pdata, tls_data, tls_data_len);\n        pdata[-1] = (char) tls_data_len;\n        pdata[-2] = (char) (tls_data_len >> 8);\n        pdata -= 2;\n        len += 2;\n        memcpy(pdata - tls_data0_len, tls_data0, tls_data0_len);\n        pdata -= tls_data0_len;\n        len += tls_data0_len;\n        memcpy(pdata - 32, global->local_client_id, 32);\n        pdata -= 32;\n        len += 32;\n        pdata[-1] = 0x20;\n        pdata -= 1;\n        len += 1;\n        tls12_ticket_pack_auth_data(global, &self->server, pdata - 32);\n        pdata -= 32;\n        len += 32;\n        pdata[-1] = 0x3;\n        pdata[-2] = 0x3; // tls version\n        pdata -= 2;\n        len += 2;\n        pdata[-1] = (char) len;\n        pdata[-2] = (char) (len >> 8);\n        pdata[-3] = 0;\n        pdata[-4] = 1;\n        pdata -= 4;\n        len += 4;\n\n        pdata[-1] = (char) len;\n        pdata[-2] = (char) (len >> 8);\n        pdata -= 2;\n        len += 2;\n        pdata[-1] = 0x1;\n        pdata[-2] = 0x3; // tls version\n        pdata -= 2;\n        len += 2;\n        pdata[-1] = 0x16; // tls handshake\n        pdata -= 1;\n        len += 1;\n\n        local->handshake_status = 1;\n    } else if (datalength == 0) {\n        datalength = local->send_buffer_size + 43;\n        out_buffer = (char *) malloc((size_t) datalength);\n        char *pdata = out_buffer;\n        memcpy(pdata, \"\\x14\\x03\\x03\\x00\\x01\\x01\", 6);\n        pdata += 6;\n        memcpy(pdata, \"\\x16\\x03\\x03\\x00\\x20\", 5);\n        pdata += 5;\n        rand_bytes((uint8_t *) pdata, 22);\n        pdata += 22;\n\n        uint8_t *key = (uint8_t *) malloc(self->server.key_len + 32);\n        char hash[SHA1_BYTES];\n        memcpy(key, self->server.key, self->server.key_len);\n        memcpy(key + self->server.key_len, global->local_client_id, 32);\n        ss_sha1_hmac_with_key(hash, out_buffer, (int) (pdata - out_buffer), key, (int) (self->server.key_len + 32));\n        free(key);\n        memcpy(pdata, hash, OBFS_HMAC_SHA1_LEN);\n\n        pdata += OBFS_HMAC_SHA1_LEN;\n        memcpy(pdata, local->send_buffer, local->send_buffer_size);\n        free(local->send_buffer);\n        local->send_buffer = NULL;\n\n        local->handshake_status = 8;\n    } else {\n        return 0;\n    }\n    if ((int) *capacity < datalength) {\n        *pencryptdata = (char *) realloc(*pencryptdata, *capacity = (size_t) (datalength * 2));\n        encryptdata = *pencryptdata;\n    }\n    memmove(encryptdata, out_buffer, datalength);\n    free(out_buffer);\n    return datalength;\n}\n\nint\ntls12_ticket_auth_client_decode(obfs *self, char **pencryptdata, int datalength, size_t *capacity, int *needsendback) {\n    char *encryptdata = *pencryptdata;\n    tls12_ticket_auth_local_data *local = (tls12_ticket_auth_local_data *) self->l_data;\n    tls12_ticket_auth_global_data *global = (tls12_ticket_auth_global_data *) self->server.g_data;\n\n    *needsendback = 0;\n    if (local->handshake_status == 8) {\n        local->recv_buffer_size += datalength;\n        local->recv_buffer = (char *) realloc(local->recv_buffer, (size_t) local->recv_buffer_size);\n        memcpy(local->recv_buffer + local->recv_buffer_size - datalength, encryptdata, datalength);\n        datalength = 0;\n        while (local->recv_buffer_size > 5) {\n            if (local->recv_buffer[0] != 0x17)\n                return -1;\n            int size = ((int) (unsigned char) local->recv_buffer[3] << 8) + (unsigned char) local->recv_buffer[4];\n            if (size + 5 > local->recv_buffer_size)\n                break;\n            if ((int) *capacity < datalength + size) {\n                *pencryptdata = (char *) realloc(*pencryptdata, *capacity = (size_t) ((datalength + size) * 2));\n                encryptdata = *pencryptdata;\n            }\n            memcpy(encryptdata + datalength, local->recv_buffer + 5, size);\n            datalength += size;\n            local->recv_buffer_size -= 5 + size;\n            memmove(local->recv_buffer, local->recv_buffer + 5 + size, local->recv_buffer_size);\n        }\n        return datalength;\n    }\n    if (datalength < 11 + 32 + 1 + 32) {\n        return -1;\n    }\n\n    uint8_t *key = (uint8_t *) malloc(self->server.key_len + 32);\n    char hash[SHA1_BYTES];\n    memcpy(key, self->server.key, self->server.key_len);\n    memcpy(key + self->server.key_len, global->local_client_id, 32);\n    ss_sha1_hmac_with_key(hash, encryptdata + 11, 22, key, (int) self->server.key_len + 32);\n    free(key);\n\n    if (memcmp(encryptdata + 33, hash, OBFS_HMAC_SHA1_LEN)) {\n        return -1;\n    }\n\n    *needsendback = 1;\n    return 0;\n}\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/tls1.2_ticket.h",
    "content": "/*\n * tls1.2_ticket.h - Define shadowsocksR server's buffers and callbacks\n *\n * Copyright (C) 2015 - 2017, Break Wa11 <mmgac001@gmail.com>\n */\n\n#ifndef _OBFS_TLS1_2_TICKET_H\n#define _OBFS_TLS1_2_TICKET_H\n\n#include \"obfs.h\"\n\nvoid * tls12_ticket_auth_init_data();\nobfs * tls12_ticket_auth_new_obfs();\nvoid tls12_ticket_auth_dispose(obfs *self);\n\nint tls12_ticket_auth_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity);\nint tls12_ticket_auth_client_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback);\n\nint tls12_ticket_auth_get_overhead(obfs *self);\n#endif // _OBFS_TLS1_2_TICKET_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/verify.c",
    "content": "#include <stdlib.h>\n#include <string.h>\n#include \"verify.h\"\n#include \"obfsutil.h\"\n#include \"crc32.h\"\n\nstatic int verify_simple_pack_unit_size = 2000;\n\ntypedef struct verify_simple_local_data {\n    char * recv_buffer;\n    int recv_buffer_size;\n}verify_simple_local_data;\n\nvoid verify_simple_local_data_init(verify_simple_local_data* local) {\n    local->recv_buffer = (char*)malloc(16384);\n    local->recv_buffer_size = 0;\n}\n\nobfs * verify_simple_new_obfs() {\n    obfs * self = new_obfs();\n    self->l_data = malloc(sizeof(verify_simple_local_data));\n    verify_simple_local_data_init((verify_simple_local_data*)self->l_data);\n    return self;\n}\n\nvoid verify_simple_dispose(obfs *self) {\n    verify_simple_local_data *local = (verify_simple_local_data*)self->l_data;\n    if (local->recv_buffer != NULL) {\n        free(local->recv_buffer);\n        local->recv_buffer = NULL;\n    }\n    free(local);\n    self->l_data = NULL;\n    dispose_obfs(self);\n}\n\nint verify_simple_pack_data(char *data, int datalength, char *outdata) {\n    unsigned char rand_len = (xorshift128plus() & 0xF) + 1;\n    int out_size = rand_len + datalength + 6;\n    outdata[0] = (char)(out_size >> 8);\n    outdata[1] = (char)out_size;\n    outdata[2] = (char)rand_len;\n    memmove(outdata + rand_len + 2, data, datalength);\n    fillcrc32((unsigned char *)outdata, (unsigned int)out_size);\n    return out_size;\n}\n\nint verify_simple_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity) {\n    char *plaindata = *pplaindata;\n    //verify_simple_local_data *local = (verify_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc((size_t)(datalength * 2 + 32));\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    while ( len > verify_simple_pack_unit_size ) {\n        pack_len = verify_simple_pack_data(data, verify_simple_pack_unit_size, buffer);\n        buffer += pack_len;\n        data += verify_simple_pack_unit_size;\n        len -= verify_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = verify_simple_pack_data(data, len, buffer);\n        buffer += pack_len;\n    }\n    len = (int)(buffer - out_buffer);\n    if ((int)*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = (size_t)(len * 2));\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint verify_simple_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity) {\n    char *plaindata = *pplaindata;\n    verify_simple_local_data *local = (verify_simple_local_data*)self->l_data;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    char * out_buffer = (char*)malloc((size_t)local->recv_buffer_size);\n    char * buffer = out_buffer;\n    while (local->recv_buffer_size > 2) {\n        int length = ((int)recv_buffer[0] << 8) | recv_buffer[1];\n        if (length >= 8192 || length < 7) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        int crc = (int)crc32((unsigned char*)recv_buffer, (unsigned int)length);\n        if (crc != -1) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        int data_size = length - recv_buffer[2] - 6;\n        memmove(buffer, recv_buffer + 2 + recv_buffer[2], data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len = (int)(buffer - out_buffer);\n    if ((int)*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = (size_t)(len * 2));\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/obfs/verify.h",
    "content": "/*\n * verify.h - Define shadowsocksR server's buffers and callbacks\n *\n * Copyright (C) 2015 - 2016, Break Wa11 <mmgac001@gmail.com>\n */\n\n#ifndef _OBFS_VERIFY_H\n#define _OBFS_VERIFY_H\n\n#include \"obfs.h\"\n\nobfs * verify_simple_new_obfs();\nvoid verify_simple_dispose(obfs *self);\n\nint verify_simple_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint verify_simple_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\n#endif // _OBFS_VERIFY_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/protocol.h",
    "content": "/*\n * Copyright (c) 2014, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef PROTOCOL_H\n#define PROTOCOL_H\n\ntypedef struct protocol {\n    const int default_port;\n    int(*const parse_packet)(const char *, size_t, char **);\n} protocol_t;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/redir.c",
    "content": "/*\n * redir.c - Provide a transparent TCP proxy through remote shadowsocks\n *            server\n *\n * Copyright (C) 2013 - 2015, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <arpa/inet.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <locale.h>\n#include <netdb.h>\n#include <netinet/in.h>\n#include <pthread.h>\n#include <signal.h>\n#include <string.h>\n#include <strings.h>\n#include <time.h>\n#include <unistd.h>\n#include <getopt.h>\n#include <limits.h>\n#include <linux/if.h>\n#include <linux/netfilter_ipv4.h>\n#include <linux/netfilter_ipv6/ip6_tables.h>\n\n#include <udns.h>\n#include <libcork/core.h>\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include \"http.h\"\n#include \"tls.h\"\n#include \"netutils.h\"\n#include \"utils.h\"\n#include \"redir.h\"\n#include \"common.h\"\n\n#ifndef EAGAIN\n#define EAGAIN EWOULDBLOCK\n#endif\n\n#ifndef EWOULDBLOCK\n#define EWOULDBLOCK EAGAIN\n#endif\n\n#ifndef BUF_SIZE\n#define BUF_SIZE 2048\n#endif\n\n#ifndef IP6T_SO_ORIGINAL_DST\n#define IP6T_SO_ORIGINAL_DST 80\n#endif\n\n#include \"includeobfs.h\" // I don't want to modify makefile\n#include \"jconf.h\"\n\nstatic void accept_cb(EV_P_ ev_io *w, int revents);\nstatic void server_recv_cb(EV_P_ ev_io *w, int revents);\nstatic void server_send_cb(EV_P_ ev_io *w, int revents);\nstatic void remote_recv_cb(EV_P_ ev_io *w, int revents);\nstatic void remote_send_cb(EV_P_ ev_io *w, int revents);\n\nstatic remote_t *new_remote(int fd, int timeout);\nstatic server_t *new_server(int fd, listen_ctx_t* profile);\n\nstatic void free_remote(remote_t *remote);\nstatic void close_and_free_remote(EV_P_ remote_t *remote);\nstatic void free_server(server_t *server);\nstatic void close_and_free_server(EV_P_ server_t *server);\n\nint verbose        = 0;\nint keep_resolving = 1;\n\nstatic int ipv6first = 0;\nstatic int mode = TCP_ONLY;\n#ifdef HAVE_SETRLIMIT\nstatic int nofile = 0;\n#endif\n\nstatic struct cork_dllist inactive_profiles;\nstatic listen_ctx_t *current_profile;\nstatic struct cork_dllist all_connections;\n\nint\ngetdestaddr(int fd, struct sockaddr_storage *destaddr)\n{\n    socklen_t socklen = sizeof(*destaddr);\n    int error         = 0;\n\n    error = getsockopt(fd, SOL_IPV6, IP6T_SO_ORIGINAL_DST, destaddr, &socklen);\n    if (error) { // Didn't find a proper way to detect IP version.\n        error = getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, destaddr, &socklen);\n        if (error) {\n            return -1;\n        }\n    }\n    return 0;\n}\n\nint\nsetnonblocking(int fd)\n{\n    int flags;\n    if (-1 == (flags = fcntl(fd, F_GETFL, 0))) {\n        flags = 0;\n    }\n    return fcntl(fd, F_SETFL, flags | O_NONBLOCK);\n}\n\nint\ncreate_and_bind(const char *addr, const char *port)\n{\n    struct addrinfo hints;\n    struct addrinfo *result, *rp;\n    int s, listen_sock;\n\n    memset(&hints, 0, sizeof(struct addrinfo));\n    hints.ai_family   = AF_UNSPEC;   /* Return IPv4 and IPv6 choices */\n    hints.ai_socktype = SOCK_STREAM; /* We want a TCP socket */\n\n    s = getaddrinfo(addr, port, &hints, &result);\n    if (s != 0) {\n        LOGI(\"getaddrinfo: %s\", gai_strerror(s));\n        return -1;\n    }\n\n    if (result == NULL) {\n        LOGE(\"Could not bind\");\n        return -1;\n    }\n\n    for (rp = result; rp != NULL; rp = rp->ai_next) {\n        listen_sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);\n        if (listen_sock == -1) {\n            continue;\n        }\n\n        int opt = 1;\n        setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));\n#ifdef SO_NOSIGPIPE\n        setsockopt(listen_sock, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n#endif\n        int err = set_reuseport(listen_sock);\n        if (err == 0) {\n            LOGI(\"tcp port reuse enabled\");\n        }\n\n        s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);\n        if (s == 0) {\n            /* We managed to bind successfully! */\n            break;\n        } else {\n            ERROR(\"bind\");\n        }\n\n        close(listen_sock);\n        listen_sock = -1;\n    }\n\n    freeaddrinfo(result);\n\n    return listen_sock;\n}\n\nstatic void\nserver_recv_cb(EV_P_ ev_io *w, int revents)\n{\n    server_ctx_t *server_recv_ctx = (server_ctx_t *)w;\n    server_t *server              = server_recv_ctx->server;\n    remote_t *remote              = server->remote;\n    server_def_t *server_env = server->server_env;\n\n    ssize_t r = recv(server->fd, remote->buf->array + remote->buf->len,\n                     BUF_SIZE - remote->buf->len, 0);\n\n    if (r == 0) {\n        // connection closed\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else if (r == -1) {\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n            // no data\n            // continue to wait for recv\n            return;\n        } else {\n            ERROR(\"server recv\");\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    }\n\n    remote->buf->len += r;\n\n    if (verbose) {\n        uint16_t port = 0;\n        char ipstr[INET6_ADDRSTRLEN];\n        memset(&ipstr, 0, INET6_ADDRSTRLEN);\n\n        if (AF_INET == server->destaddr.ss_family) {\n            struct sockaddr_in *sa = (struct sockaddr_in *)&(server->destaddr);\n            dns_ntop(AF_INET, &(sa->sin_addr), ipstr, INET_ADDRSTRLEN);\n            port = ntohs(sa->sin_port);\n        } else {\n            // TODO: The code below need to be test in IPv6 envirment, which I\n            //       don't have.\n            struct sockaddr_in6 *sa = (struct sockaddr_in6 *)&(server->destaddr);\n            dns_ntop(AF_INET6, &(sa->sin6_addr), ipstr, INET6_ADDRSTRLEN);\n            port = ntohs(sa->sin6_port);\n        }\n\n        LOGI(\"redir to %s:%d, len=%zu, recv=%zd\", ipstr, port, remote->buf->len, r);\n    }\n\n    if (!remote->send_ctx->connected) {\n        // SNI\n        int ret       = 0;\n        uint16_t port = 0;\n\n        if (AF_INET6 == server->destaddr.ss_family) { // IPv6\n            port = ntohs(((struct sockaddr_in6 *)&(server->destaddr))->sin6_port);\n        } else {                             // IPv4\n            port = ntohs(((struct sockaddr_in *)&(server->destaddr))->sin_port);\n        }\n        if (port == http_protocol->default_port)\n            ret = http_protocol->parse_packet(remote->buf->array,\n                                              remote->buf->len, &server->hostname);\n        else if (port == tls_protocol->default_port)\n            ret = tls_protocol->parse_packet(remote->buf->array,\n                                             remote->buf->len, &server->hostname);\n        if (ret > 0) {\n            server->hostname_len = ret;\n        }\n\n        ev_io_stop(EV_A_ & server_recv_ctx->io);\n        ev_io_start(EV_A_ & remote->send_ctx->io);\n        return;\n    }\n    // SSR beg\n    if (server_env->protocol_plugin) {\n        obfs_class *protocol_plugin = server_env->protocol_plugin;\n        if (protocol_plugin->client_pre_encrypt) {\n            remote->buf->len = protocol_plugin->client_pre_encrypt(server->protocol, &remote->buf->array, remote->buf->len, &remote->buf->capacity);\n        }\n    }\n    int err = ss_encrypt(&server_env->cipher, remote->buf, server->e_ctx, BUF_SIZE);\n\n    if (err) {\n        LOGE(\"invalid password or cipher\");\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    if (server_env->obfs_plugin) {\n        obfs_class *obfs_plugin = server_env->obfs_plugin;\n        if (obfs_plugin->client_encode) {\n            remote->buf->len = obfs_plugin->client_encode(server->obfs, &remote->buf->array, remote->buf->len, &remote->buf->capacity);\n        }\n    }\n    // SSR end\n\n    if (!remote->send_ctx->connected) {\n        ev_io_stop(EV_A_ & server_recv_ctx->io);\n        ev_io_start(EV_A_ & remote->send_ctx->io);\n        return;\n    }\n\n    if (r > 0 && remote->buf->len == 0) { // SSR pause recv\n        remote->buf->idx = 0;\n        ev_io_stop(EV_A_ & server_recv_ctx->io);\n        return;\n    }\n    int s = send(remote->fd, remote->buf->array, remote->buf->len, 0);\n\n    if (s == -1) {\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n            // no data, wait for send\n            remote->buf->idx = 0;\n            ev_io_stop(EV_A_ & server_recv_ctx->io);\n            ev_io_start(EV_A_ & remote->send_ctx->io);\n            return;\n        } else {\n            ERROR(\"send\");\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    } else if (s < remote->buf->len) {\n        remote->buf->len -= s;\n        remote->buf->idx  = s;\n        ev_io_stop(EV_A_ & server_recv_ctx->io);\n        ev_io_start(EV_A_ & remote->send_ctx->io);\n        return;\n    } else {\n        remote->buf->idx = 0;\n        remote->buf->len = 0;\n    }\n}\n\nstatic void\nserver_send_cb(EV_P_ ev_io *w, int revents)\n{\n    server_ctx_t *server_send_ctx = (server_ctx_t *)w;\n    server_t *server              = server_send_ctx->server;\n    remote_t *remote              = server->remote;\n    if (server->buf->len == 0) {\n        // close and free\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else {\n        // has data to send\n        ssize_t s = send(server->fd, server->buf->array + server->buf->idx,\n                         server->buf->len, 0);\n        if (s == -1) {\n            if (errno != EAGAIN && errno != EWOULDBLOCK) {\n                ERROR(\"send\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n            }\n            return;\n        } else if (s < server->buf->len) {\n            // partly sent, move memory, wait for the next time to send\n            server->buf->len -= s;\n            server->buf->idx += s;\n            return;\n        } else {\n            // all sent out, wait for reading\n            server->buf->len = 0;\n            server->buf->idx = 0;\n            ev_io_stop(EV_A_ & server_send_ctx->io);\n            ev_io_start(EV_A_ & remote->recv_ctx->io);\n        }\n    }\n}\n\nstatic void\nremote_timeout_cb(EV_P_ ev_timer *watcher, int revents)\n{\n    remote_ctx_t *remote_ctx\n        = cork_container_of(watcher, remote_ctx_t, watcher);\n\n    remote_t *remote = remote_ctx->remote;\n    server_t *server = remote->server;\n\n    ev_timer_stop(EV_A_ watcher);\n\n    close_and_free_remote(EV_A_ remote);\n    close_and_free_server(EV_A_ server);\n}\n\nstatic void\nremote_recv_cb(EV_P_ ev_io *w, int revents)\n{\n    remote_ctx_t *remote_recv_ctx = (remote_ctx_t *)w;\n    remote_t *remote              = remote_recv_ctx->remote;\n    server_t *server              = remote->server;\n    server_def_t *server_env      = server->server_env;\n\n    ev_timer_again(EV_A_ & remote->recv_ctx->watcher);\n\n    ssize_t r = recv(remote->fd, server->buf->array, BUF_SIZE, 0);\n\n    if (r == 0) {\n        // connection closed\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else if (r == -1) {\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n            // no data\n            // continue to wait for recv\n            return;\n        } else {\n            ERROR(\"remote recv\");\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    }\n\n    server->buf->len = r;\n\n    // SSR beg\n    if (server_env->obfs_plugin) {\n        obfs_class *obfs_plugin = server_env->obfs_plugin;\n        if (obfs_plugin->client_decode) {\n            int needsendback;\n            server->buf->len = obfs_plugin->client_decode(server->obfs, &server->buf->array, server->buf->len, &server->buf->capacity, &needsendback);\n            if ((int)server->buf->len < 0) {\n                LOGE(\"client_decode\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n            if (needsendback) {\n                obfs_class *obfs_plugin = server_env->obfs_plugin;\n                if (obfs_plugin->client_encode) {\n                    remote->buf->len = obfs_plugin->client_encode(server->obfs, &remote->buf->array, 0, &remote->buf->capacity);\n                    ssize_t s = send(remote->fd, remote->buf->array, remote->buf->len, 0);\n                    if (s == -1) {\n                        if (errno != EAGAIN && errno != EWOULDBLOCK) {\n                            ERROR(\"remote_send_cb_send\");\n                            // close and free\n                            close_and_free_remote(EV_A_ remote);\n                            close_and_free_server(EV_A_ server);\n                        }\n                        return;\n                    } else if (s < (ssize_t)(remote->buf->len)) {\n                        // partly sent, move memory, wait for the next time to send\n                        remote->buf->len -= s;\n                        remote->buf->idx += s;\n                        return;\n                    } else {\n                        // all sent out, wait for reading\n                        remote->buf->len = 0;\n                        remote->buf->idx = 0;\n                        ev_io_stop(EV_A_ & remote->send_ctx->io);\n                        ev_io_start(EV_A_ & server->recv_ctx->io);\n                    }\n                }\n            }\n        }\n    }\n    if ( server->buf->len == 0 )\n        return;\n\n    int err = ss_decrypt(&server_env->cipher, server->buf, server->d_ctx, BUF_SIZE);\n    if (err) {\n        LOGE(\"invalid password or cipher\");\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    if (server_env->protocol_plugin) {\n        obfs_class *protocol_plugin = server_env->protocol_plugin;\n        if (protocol_plugin->client_post_decrypt) {\n            server->buf->len = protocol_plugin->client_post_decrypt(server->protocol, &server->buf->array, server->buf->len, &server->buf->capacity);\n            if ((int)server->buf->len < 0) {\n                LOGE(\"client_post_decrypt\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n            if ( server->buf->len == 0 )\n                return;\n        }\n    }\n    // SSR end\n\n    int s = send(server->fd, server->buf->array, server->buf->len, 0);\n\n    if (s == -1) {\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n            // no data, wait for send\n            server->buf->idx = 0;\n            ev_io_stop(EV_A_ & remote_recv_ctx->io);\n            ev_io_start(EV_A_ & server->send_ctx->io);\n        } else {\n            ERROR(\"send\");\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n        }\n    } else if (s < server->buf->len) {\n        server->buf->len -= s;\n        server->buf->idx  = s;\n        ev_io_stop(EV_A_ & remote_recv_ctx->io);\n        ev_io_start(EV_A_ & server->send_ctx->io);\n    }\n}\n\nstatic void\nremote_send_cb(EV_P_ ev_io *w, int revents)\n{\n    remote_ctx_t *remote_send_ctx = (remote_ctx_t *)w;\n    remote_t *remote              = remote_send_ctx->remote;\n    server_t *server              = remote->server;\n    server_def_t *server_env = server->server_env;\n\n    if (!remote_send_ctx->connected) {\n        struct sockaddr_storage addr;\n        memset(&addr, 0, sizeof(struct sockaddr_storage));\n        socklen_t len = sizeof addr;\n        int r         = getpeername(remote->fd, (struct sockaddr *)&addr, &len);\n        if (r == 0) {\n            remote_send_ctx->connected = 1;\n            ev_io_stop(EV_A_ & remote_send_ctx->io);\n            //ev_io_stop(EV_A_ & server->recv_ctx->io);\n            ev_timer_stop(EV_A_ & remote_send_ctx->watcher);\n            ev_timer_start(EV_A_ & remote->recv_ctx->watcher);\n\n            // send destaddr\n            buffer_t ss_addr_to_send;\n            buffer_t *abuf = &ss_addr_to_send;\n            balloc(abuf, BUF_SIZE);\n\n            if (server->hostname_len > 0\n                    && validate_hostname(server->hostname, server->hostname_len)) { // HTTP/SNI\n                uint16_t port;\n                if (AF_INET6 == server->destaddr.ss_family) { // IPv6\n                    port = (((struct sockaddr_in6 *)&(server->destaddr))->sin6_port);\n                } else {                             // IPv4\n                    port = (((struct sockaddr_in *)&(server->destaddr))->sin_port);\n                }\n\n                abuf->array[abuf->len++] = 3;          // Type 3 is hostname\n                abuf->array[abuf->len++] = server->hostname_len;\n                memcpy(abuf->array + abuf->len, server->hostname, server->hostname_len);\n                abuf->len += server->hostname_len;\n                memcpy(abuf->array + abuf->len, &port, 2);\n            } else if (AF_INET6 == server->destaddr.ss_family) { // IPv6\n                abuf->array[abuf->len++] = 4;          // Type 4 is IPv6 address\n\n                size_t in6_addr_len = sizeof(struct in6_addr);\n                memcpy(abuf->array + abuf->len,\n                       &(((struct sockaddr_in6 *)&(server->destaddr))->sin6_addr),\n                       in6_addr_len);\n                abuf->len += in6_addr_len;\n                memcpy(abuf->array + abuf->len,\n                       &(((struct sockaddr_in6 *)&(server->destaddr))->sin6_port),\n                       2);\n            } else {                             // IPv4\n                abuf->array[abuf->len++] = 1; // Type 1 is IPv4 address\n\n                size_t in_addr_len = sizeof(struct in_addr);\n                memcpy(abuf->array + abuf->len,\n                       &((struct sockaddr_in *)&(server->destaddr))->sin_addr, in_addr_len);\n                abuf->len += in_addr_len;\n                memcpy(abuf->array + abuf->len,\n                       &((struct sockaddr_in *)&(server->destaddr))->sin_port, 2);\n            }\n\n            abuf->len += 2;\n\n            if (remote->buf->len > 0) {\n                brealloc(remote->buf, remote->buf->len + abuf->len, BUF_SIZE);\n                memmove(remote->buf->array + abuf->len, remote->buf->array, remote->buf->len);\n                memcpy(remote->buf->array, abuf->array, abuf->len);\n                remote->buf->len += abuf->len;\n            } else {\n                brealloc(remote->buf, abuf->len, BUF_SIZE);\n                memcpy(remote->buf->array, abuf->array, abuf->len);\n                remote->buf->len = abuf->len;\n            }\n            bfree(abuf);\n            \n            // SSR beg\n            server_info _server_info;\n            if (server_env->obfs_plugin) {\n                server_env->obfs_plugin->get_server_info(server->obfs, &_server_info);\n                _server_info.head_len = get_head_size(remote->buf->array, remote->buf->len, 30);\n                server_env->obfs_plugin->set_server_info(server->obfs, &_server_info);\n            }\n            if (server_env->protocol_plugin) {\n                obfs_class *protocol_plugin = server_env->protocol_plugin;\n                if (protocol_plugin->client_pre_encrypt) {\n                    remote->buf->len = protocol_plugin->client_pre_encrypt(server->protocol, &remote->buf->array, remote->buf->len, &remote->buf->capacity);\n                }\n            }\n\n            int err = ss_encrypt(&server_env->cipher, remote->buf, server->e_ctx, BUF_SIZE);\n            if (err) {\n                LOGE(\"invalid password or cipher\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n\n            if (server_env->obfs_plugin) {\n                obfs_class *obfs_plugin = server_env->obfs_plugin;\n                if (obfs_plugin->client_encode) {\n                    remote->buf->len = obfs_plugin->client_encode(server->obfs, &remote->buf->array, remote->buf->len, &remote->buf->capacity);\n                }\n            }\n            // SSR end\n\n            ev_io_start(EV_A_ & remote->recv_ctx->io);\n        } else {\n            ERROR(\"getpeername\");\n            // not connected\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    }\n\n    if (remote->buf->len == 0) {\n        // close and free\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else {\n        // has data to send\n        ssize_t s = send(remote->fd, remote->buf->array + remote->buf->idx,\n                         remote->buf->len, 0);\n        if (s == -1) {\n            if (errno != EAGAIN && errno != EWOULDBLOCK) {\n                ERROR(\"send\");\n                // close and free\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n            }\n            return;\n        } else if (s < remote->buf->len) {\n            // partly sent, move memory, wait for the next time to send\n            remote->buf->len -= s;\n            remote->buf->idx += s;\n            return;\n        } else {\n            // all sent out, wait for reading\n            remote->buf->len = 0;\n            remote->buf->idx = 0;\n            ev_io_stop(EV_A_ & remote_send_ctx->io);\n            ev_io_start(EV_A_ & server->recv_ctx->io);\n        }\n    }\n}\n\nstatic remote_t *\nnew_remote(int fd, int timeout)\n{\n    remote_t *remote = ss_malloc(sizeof(remote_t));\n    memset(remote, 0, sizeof(remote_t));\n\n    remote->buf                 = ss_malloc(sizeof(buffer_t));\n    remote->recv_ctx            = ss_malloc(sizeof(remote_ctx_t));\n    remote->send_ctx            = ss_malloc(sizeof(remote_ctx_t));\n    balloc(remote->buf, BUF_SIZE);\n    memset(remote->recv_ctx, 0, sizeof(remote_ctx_t));\n    memset(remote->send_ctx, 0, sizeof(remote_ctx_t));\n    remote->recv_ctx->connected = 0;\n    remote->send_ctx->connected = 0;\n    remote->fd                  = fd;\n    remote->recv_ctx->remote    = remote;\n    remote->send_ctx->remote    = remote;\n\n    ev_io_init(&remote->recv_ctx->io, remote_recv_cb, fd, EV_READ);\n    ev_io_init(&remote->send_ctx->io, remote_send_cb, fd, EV_WRITE);\n    ev_timer_init(&remote->send_ctx->watcher, remote_timeout_cb,\n                  min(MAX_CONNECT_TIMEOUT, timeout), 0);\n    ev_timer_init(&remote->recv_ctx->watcher, remote_timeout_cb,\n                  timeout, 0);\n\n    return remote;\n}\n\nstatic void\nfree_remote(remote_t *remote)\n{\n    if (remote != NULL) {\n        if (remote->server != NULL) {\n            remote->server->remote = NULL;\n        }\n        if (remote->buf != NULL) {\n            bfree(remote->buf);\n            ss_free(remote->buf);\n        }\n        ss_free(remote->recv_ctx);\n        ss_free(remote->send_ctx);\n        ss_free(remote);\n    }\n}\n\nstatic void\nclose_and_free_remote(EV_P_ remote_t *remote)\n{\n    if (remote != NULL) {\n        ev_timer_stop(EV_A_ & remote->send_ctx->watcher);\n        ev_timer_stop(EV_A_ & remote->recv_ctx->watcher);\n        ev_io_stop(EV_A_ & remote->send_ctx->io);\n        ev_io_stop(EV_A_ & remote->recv_ctx->io);\n        close(remote->fd);\n        free_remote(remote);\n    }\n}\n\nstatic server_t *\nnew_server(int fd, listen_ctx_t* profile) {\n    server_t *server = ss_malloc(sizeof(server_t));\n    memset(server, 0, sizeof(server_t));\n\n    server->listener = profile;\n    server->recv_ctx = ss_malloc(sizeof(server_ctx_t));\n    server->send_ctx = ss_malloc(sizeof(server_ctx_t));\n    server->buf = ss_malloc(sizeof(buffer_t));\n    balloc(server->buf, BUF_SIZE);\n    memset(server->recv_ctx, 0, sizeof(server_ctx_t));\n    memset(server->send_ctx, 0, sizeof(server_ctx_t));\n    server->recv_ctx->connected = 0;\n    server->send_ctx->connected = 0;\n    server->fd = fd;\n    server->recv_ctx->server = server;\n    server->send_ctx->server = server;\n\n    server->hostname     = NULL;\n    server->hostname_len = 0;\n\n    ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ);\n    ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE);\n\n    cork_dllist_add(&profile->connections_eden, &server->entries);\n    cork_dllist_add(&all_connections, &server->entries_all);\n\n    return server;\n}\n\nstatic void\nrelease_profile(listen_ctx_t *profile)\n{\n    int i;\n\n    for(i = 0; i < profile->server_num; i++)\n    {\n        server_def_t *server_env = &profile->servers[i];\n\n        ss_free(server_env->host);\n\n        if(server_env->addr != server_env->addr_udp)\n        {\n            ss_free(server_env->addr_udp);\n        }\n        ss_free(server_env->addr);\n\n        ss_free(server_env->psw);\n\n        ss_free(server_env->protocol_name);\n        ss_free(server_env->obfs_name);\n        ss_free(server_env->protocol_param);\n        ss_free(server_env->obfs_param);\n        ss_free(server_env->protocol_global);\n        ss_free(server_env->obfs_global);\n        if(server_env->protocol_plugin){\n            free_obfs_class(server_env->protocol_plugin);\n        }\n        if(server_env->obfs_plugin){\n            free_obfs_class(server_env->obfs_plugin);\n        }\n        ss_free(server_env->id);\n        ss_free(server_env->group);\n\n        enc_release(&server_env->cipher);\n    }\n    ss_free(profile);\n}\n\nstatic void\ncheck_and_free_profile(listen_ctx_t *profile)\n{\n    int i;\n\n    if(profile == current_profile)\n    {\n        return;\n    }\n    // if this connection is created from an inactive profile, then we need to free the profile\n    // when the last connection of that profile is colsed\n    if(!cork_dllist_is_empty(&profile->connections_eden))\n    {\n        return;\n    }\n\n    for(i = 0; i < profile->server_num; i++)\n    {\n        if(!cork_dllist_is_empty(&profile->servers[i].connections))\n        {\n            return;\n        }\n    }\n\n    // No connections anymore\n    cork_dllist_remove(&profile->entries);\n    release_profile(profile);\n}\n\nstatic void\nfree_server(server_t *server)\n{\n    if(server != NULL) {\n        listen_ctx_t *profile = server->listener;\n        server_def_t *server_env = server->server_env;\n\n        cork_dllist_remove(&server->entries);\n        cork_dllist_remove(&server->entries_all);\n\n        if (server->remote != NULL) {\n            server->remote->server = NULL;\n        }\n        if (server->buf != NULL) {\n            bfree(server->buf);\n            ss_free(server->buf);\n        }\n        if (server->hostname != NULL) {\n            ss_free(server->hostname);\n        }\n\n//        if (server != NULL) {\n//            if (server->remote != NULL) {\n//                server->remote->server = NULL;\n//            }\n        if (server_env) {\n            if (server->e_ctx != NULL) {\n                enc_ctx_release(&server_env->cipher, server->e_ctx);\n                ss_free(server->e_ctx);\n            }\n            if (server->d_ctx != NULL) {\n                enc_ctx_release(&server_env->cipher, server->d_ctx);\n                ss_free(server->d_ctx);\n            }\n//            if (server->buf != NULL) {\n//                bfree(server->buf);\n//                ss_free(server->buf);\n//            }\n            // SSR beg\n            if (server_env->obfs_plugin) {\n                server_env->obfs_plugin->dispose(server->obfs);\n                server->obfs = NULL;\n//                free_obfs_class(server->obfs_plugin);\n//                server->obfs_plugin = NULL;\n            }\n            if (server_env->protocol_plugin) {\n                server_env->protocol_plugin->dispose(server->protocol);\n                server->protocol = NULL;\n//                free_obfs_class(server->protocol_plugin);\n//                server->protocol_plugin = NULL;\n            }\n            // SSR end\n        }\n\n        ss_free(server->recv_ctx);\n        ss_free(server->send_ctx);\n        ss_free(server);\n\n        // after free server, we need to check the profile\n        check_and_free_profile(profile);\n    }\n}\n\nstatic void\nclose_and_free_server(EV_P_ server_t *server)\n{\n    if (server != NULL) {\n        ev_io_stop(EV_A_ & server->send_ctx->io);\n        ev_io_stop(EV_A_ & server->recv_ctx->io);\n        close(server->fd);\n        free_server(server);\n    }\n}\n\nstatic void\naccept_cb(EV_P_ ev_io *w, int revents)\n{\n    listen_ctx_t *listener = (listen_ctx_t *)w;\n    struct sockaddr_storage destaddr;\n    memset(&destaddr, 0, sizeof(struct sockaddr_storage));\n\n    int err;\n\n    int serverfd = accept(listener->fd, NULL, NULL);\n    if (serverfd == -1) {\n        ERROR(\"accept\");\n        return;\n    }\n\n    err = getdestaddr(serverfd, &destaddr);\n    if (err) {\n        ERROR(\"getdestaddr\");\n        return;\n    }\n\n    setnonblocking(serverfd);\n    int opt = 1;\n    setsockopt(serverfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\n#ifdef SO_NOSIGPIPE\n    setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n#endif\n\n    // pick a server\n    int index = rand() % listener->server_num;\n    server_def_t *server_env = &listener->servers[index];\n\n    struct sockaddr *remote_addr = (struct sockaddr *) server_env->addr;\n\n    int remotefd = socket(remote_addr->sa_family, SOCK_STREAM, IPPROTO_TCP);\n    if (remotefd == -1) {\n        ERROR(\"socket\");\n        return;\n    }\n\n    // Set flags\n    setsockopt(remotefd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\n#ifdef SO_NOSIGPIPE\n    setsockopt(remotefd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n#endif\n\n    // Setup\n    int keepAlive    = 1;\n    int keepIdle     = 40;\n    int keepInterval = 20;\n    int keepCount    = 5;\n    setsockopt(remotefd, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));\n    setsockopt(remotefd, SOL_TCP, TCP_KEEPIDLE, (void *)&keepIdle, sizeof(keepIdle));\n    setsockopt(remotefd, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));\n    setsockopt(remotefd, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));\n\n    // Setup\n    setnonblocking(remotefd);\n\n    // Enable MPTCP\n    if (listener->mptcp == 1) {\n        int err = setsockopt(remotefd, SOL_TCP, MPTCP_ENABLED, &opt, sizeof(opt));\n        if (err == -1) {\n            ERROR(\"failed to enable multipath TCP\");\n        }\n    }\n\n    server_t *server = new_server(serverfd, listener);\n    remote_t *remote = new_remote(remotefd, listener->timeout);\n    server->destaddr = destaddr;\n    server->server_env = server_env;\n\n    // expelled from eden\n    cork_dllist_remove(&server->entries);\n    cork_dllist_add(&server_env->connections, &server->entries);\n\n    int r = connect(remotefd, remote_addr, get_sockaddr_len(remote_addr));\n\n    if (r == -1 && errno != CONNECT_IN_PROGRESS) {\n        ERROR(\"connect\");\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    // init server cipher\n    if (server_env->cipher.enc_method > TABLE) {\n        server->e_ctx = ss_malloc(sizeof(struct enc_ctx));\n        server->d_ctx = ss_malloc(sizeof(struct enc_ctx));\n        enc_ctx_init(&server_env->cipher, server->e_ctx, 1);\n        enc_ctx_init(&server_env->cipher, server->d_ctx, 0);\n    } else {\n        server->e_ctx = NULL;\n        server->d_ctx = NULL;\n    }\n\n    // SSR beg\n//    remote->remote_index = index;\n//    server->obfs_plugin = new_obfs_class(listener->obfs_name);\n//    if (server->obfs_plugin) {\n//        server->obfs = server->obfs_plugin->new_obfs();\n//    }\n//    server->protocol_plugin = new_obfs_class(listener->protocol_name);\n//    if (server->protocol_plugin) {\n//        server->protocol = server->protocol_plugin->new_obfs();\n//    }\n//    if (listener->list_obfs_global[remote->remote_index] == NULL && server->obfs_plugin) {\n//        listener->list_obfs_global[remote->remote_index] = server->obfs_plugin->init_data();\n//    }\n//    if (listener->list_protocol_global[remote->remote_index] == NULL && server->protocol_plugin) {\n//        listener->list_protocol_global[remote->remote_index] = server->protocol_plugin->init_data();\n//    }\n    server_info _server_info;\n    memset(&_server_info, 0, sizeof(server_info));\n    strcpy(_server_info.host, server_env->host);\n    _server_info.port = server_env->port;\n    _server_info.param = server_env->obfs_param;\n    _server_info.g_data = server_env->obfs_global;\n    _server_info.head_len = (AF_INET6 == server->destaddr.ss_family ? 19 : 7);\n    _server_info.iv = server->e_ctx->evp.iv;\n    _server_info.iv_len = enc_get_iv_len(&server_env->cipher);\n    _server_info.key = enc_get_key(&server_env->cipher);\n    _server_info.key_len = enc_get_key_len(&server_env->cipher);\n    _server_info.tcp_mss = 1452;\n    _server_info.buffer_size = BUF_SIZE;\n    _server_info.cipher_env = &server_env->cipher;\n\n    if (server_env->obfs_plugin) {\n        server->obfs = server_env->obfs_plugin->new_obfs();\n        server_env->obfs_plugin->set_server_info(server->obfs, &_server_info);\n    }\n\n    _server_info.param = server_env->protocol_param;\n    _server_info.g_data = server_env->protocol_global;\n\n    if (server_env->protocol_plugin) {\n        server->protocol = server_env->protocol_plugin->new_obfs();\n        _server_info.overhead = server_env->protocol_plugin->get_overhead(server->protocol)\n            + (server_env->obfs_plugin ? server_env->obfs_plugin->get_overhead(server->obfs) : 0);\n        server_env->protocol_plugin->set_server_info(server->protocol, &_server_info);\n    }\n    // SSR end\n\n    server->remote   = remote;\n    remote->server   = server;\n\n    if (verbose) {\n        int port = ((struct sockaddr_in*)&destaddr)->sin_port;\n        port = (uint16_t)(port >> 8 | port << 8);\n        LOGI(\"connect to %s:%d\", inet_ntoa(((struct sockaddr_in*)&destaddr)->sin_addr), port);\n    }\n\n    // listen to remote connected event\n    ev_io_start(EV_A_ & remote->send_ctx->io);\n    ev_timer_start(EV_A_ & remote->send_ctx->watcher);\n    ev_io_start(EV_A_ & server->recv_ctx->io);\n}\n\nvoid\nsignal_cb(int dummy)\n{\n    keep_resolving = 0;\n    exit(-1);\n}\n\nstatic void\ninit_obfs(server_def_t *serv, char *protocol, char *protocol_param, char *obfs, char *obfs_param)\n{\n    serv->protocol_name = protocol;\n    serv->protocol_param = protocol_param;\n    serv->protocol_plugin = new_obfs_class(protocol);\n    serv->obfs_name = obfs;\n    serv->obfs_param = obfs_param;\n    serv->obfs_plugin = new_obfs_class(obfs);\n\n    if (serv->obfs_plugin) {\n        serv->obfs_global = serv->obfs_plugin->init_data();\n    }\n    if (serv->protocol_plugin) {\n        serv->protocol_global = serv->protocol_plugin->init_data();\n    }\n}\n\nint\nmain(int argc, char **argv)\n{\n    srand(time(NULL));\n\n    int i, c;\n    int pid_flags    = 0;\n    int mptcp        = 0;\n    int mtu          = 0;\n    char *user       = NULL;\n    char *local_port = NULL;\n    char *local_addr = NULL;\n    char *password = NULL;\n    char *timeout = NULL;\n    char *protocol = NULL; // SSR\n    char *protocol_param = NULL; // SSR\n    char *method = NULL;\n    char *obfs = NULL; // SSR\n    char *obfs_param = NULL; // SSR\n    char *pid_path = NULL;\n    char *conf_path = NULL;\n    int use_new_profile = 0;\n    jconf_t *conf = NULL;\n\n    int remote_num = 0;\n    ss_addr_t remote_addr[MAX_REMOTE_NUM];\n    char *remote_port = NULL;\n\n    ss_addr_t tunnel_addr = { .host = NULL, .port = NULL };\n\n    int option_index                    = 0;\n    static struct option long_options[] = {\n        { \"mtu\",   required_argument, 0, 0 },\n        { \"mptcp\", no_argument,       0, 0 },\n        { \"help\",  no_argument,       0, 0 },\n        {       0,                 0, 0, 0 }\n    };\n\n    opterr = 0;\n\n    USE_TTY();\n\n    while ((c = getopt_long(argc, argv, \"f:s:p:l:k:t:m:c:b:a:n:huUvA6\"\n                            \"O:o:G:g:\",\n                            long_options, &option_index)) != -1) {\n        switch (c) {\n        case 0:\n            if (option_index == 0) {\n                mtu = atoi(optarg);\n                LOGI(\"set MTU to %d\", mtu);\n            } else if (option_index == 1) {\n                mptcp = 1;\n                LOGI(\"enable multipath TCP\");\n            } else if (option_index == 2) {\n                usage();\n                exit(EXIT_SUCCESS);\n            }\n            break;\n        case 's':\n            if (remote_num < MAX_REMOTE_NUM) {\n                remote_addr[remote_num].host   = optarg;\n                remote_addr[remote_num++].port = NULL;\n            }\n            break;\n        case 'p':\n            remote_port = optarg;\n            break;\n        case 'l':\n            local_port = optarg;\n            break;\n        case 'k':\n            password = optarg;\n            break;\n        case 'f':\n            pid_flags = 1;\n            pid_path  = optarg;\n            break;\n        case 't':\n            timeout = optarg;\n            break;\n        // SSR beg\n        case 'O':\n            protocol = optarg;\n            break;\n        case 'm':\n            method = optarg;\n            break;\n        case 'o':\n            obfs = optarg;\n            break;\n        case 'G':\n            protocol_param = optarg;\n            break;\n        case 'g':\n            obfs_param = optarg;\n            break;\n        // SSR end\n        case 'c':\n            conf_path = optarg;\n            break;\n        case 'b':\n            local_addr = optarg;\n            break;\n        case 'a':\n            user = optarg;\n            break;\n#ifdef HAVE_SETRLIMIT\n        case 'n':\n            nofile = atoi(optarg);\n            break;\n#endif\n        case 'u':\n            mode = TCP_AND_UDP;\n            break;\n        case 'U':\n            mode = UDP_ONLY;\n            break;\n        case 'v':\n            verbose = 1;\n            break;\n        case 'h':\n            usage();\n            exit(EXIT_SUCCESS);\n        case 'A':\n            LOGI(\"The 'A' argument is deprecate! Ignored.\");\n            break;\n        case '6':\n            ipv6first = 1;\n            break;\n        case '?':\n            // The option character is not recognized.\n            LOGE(\"Unrecognized option: %s\", optarg);\n            opterr = 1;\n            break;\n        }\n    }\n\n    if (opterr) {\n        usage();\n        exit(EXIT_FAILURE);\n    }\n\n    if (argc == 1) {\n        if (conf_path == NULL) {\n            conf_path = DEFAULT_CONF_PATH;\n        }\n    }\n\n    if (conf_path != NULL) {\n        conf = read_jconf(conf_path);\n        if(conf->conf_ver != CONF_VER_LEGACY){\n            use_new_profile = 1;\n        } else {\n            if (remote_num == 0) {\n                remote_num = conf->server_legacy.remote_num;\n                for (i = 0; i < remote_num; i++)\n                    remote_addr[i] = conf->server_legacy.remote_addr[i];\n            }\n            if (remote_port == NULL) {\n                remote_port = conf->server_legacy.remote_port;\n            }\n            if (local_addr == NULL) {\n                local_addr = conf->server_legacy.local_addr;\n            }\n            if (local_port == NULL) {\n                local_port = conf->server_legacy.local_port;\n            }\n            if (password == NULL) {\n                password = conf->server_legacy.password;\n            }\n            // SSR beg\n            if (protocol == NULL) {\n                protocol = conf->server_legacy.protocol;\n                LOGI(\"protocol %s\", protocol);\n            }\n            if (protocol_param == NULL) {\n                protocol_param = conf->server_legacy.protocol_param;\n                LOGI(\"protocol_param %s\", protocol_param);\n            }\n            if (method == NULL) {\n                method = conf->server_legacy.method;\n                LOGI(\"method %s\", method);\n            }\n            if (obfs == NULL) {\n                obfs = conf->server_legacy.obfs;\n                LOGI(\"obfs %s\", obfs);\n            }\n            if (obfs_param == NULL) {\n                obfs_param = conf->server_legacy.obfs_param;\n                LOGI(\"obfs_param %s\", obfs_param);\n            }\n            // SSR end\n        }\n\n        if (timeout == NULL) {\n            timeout = conf->timeout;\n        }\n        if (user == NULL) {\n            user = conf->user;\n        }\n        if (mtu == 0) {\n            mtu = conf->mtu;\n        }\n        if (mptcp == 0) {\n            mptcp = conf->mptcp;\n        }\n#ifdef HAVE_SETRLIMIT\n        if (nofile == 0) {\n            nofile = conf->nofile;\n        }\n        /*\n         * no need to check the return value here since we will show\n         * the user an error message if setrlimit(2) fails\n         */\n        if (nofile > 1024) {\n            if (verbose) {\n                LOGI(\"setting NOFILE to %d\", nofile);\n            }\n            set_nofile(nofile);\n        }\n#endif\n    }\n    if (protocol && strcmp(protocol, \"verify_sha1\") == 0) {\n        LOGI(\"The verify_sha1 protocol is deprecate! Fallback to origin protocol.\");\n        protocol = NULL;\n    }\n\n    if (remote_num == 0 || remote_port == NULL ||\n        local_port == NULL || password == NULL) {\n        usage();\n        exit(EXIT_FAILURE);\n    }\n\n    if (method == NULL) {\n        method = \"rc4-md5\";\n    }\n\n    if (timeout == NULL) {\n        timeout = \"600\";\n    }\n\n#ifdef HAVE_SETRLIMIT\n    /*\n     * no need to check the return value here since we will show\n     * the user an error message if setrlimit(2) fails\n     */\n    if (nofile > 1024) {\n        if (verbose) {\n            LOGI(\"setting NOFILE to %d\", nofile);\n        }\n        set_nofile(nofile);\n    }\n#endif\n\n    if (local_addr == NULL) {\n        local_addr = \"127.0.0.1\";\n    }\n\n    if (pid_flags) {\n        USE_SYSLOG(argv[0]);\n        daemonize(pid_path);\n    }\n\n    if (ipv6first) {\n        LOGI(\"resolving hostname to IPv6 address first\");\n    }\n\n    // ignore SIGPIPE\n    signal(SIGPIPE, SIG_IGN);\n    signal(SIGABRT, SIG_IGN);\n    signal(SIGINT, signal_cb);\n    signal(SIGTERM, signal_cb);\n\n    // Setup profiles\n    listen_ctx_t *profile = (listen_ctx_t *)ss_malloc(sizeof(listen_ctx_t));\n    memset(profile, 0, sizeof(listen_ctx_t));\n\n    cork_dllist_init(&all_connections);\n    cork_dllist_init(&profile->connections_eden);\n\n    profile->timeout = atoi(timeout);\n    profile->mptcp = mptcp;\n\n    if(use_new_profile) {\n        char port[6];\n\n        ss_server_new_1_t *servers = &conf->server_new_1;\n        profile->server_num = servers->server_num;\n        for(i = 0; i < servers->server_num; i++){\n            server_def_t *serv = &profile->servers[i];\n            ss_server_t *serv_cfg = &servers->servers[i];\n\n            struct sockaddr_storage *storage = ss_malloc(sizeof(struct sockaddr_storage));\n\n            char *host = serv_cfg->server;\n            snprintf(port, sizeof(port), \"%d\", serv_cfg->server_port);\n            if (get_sockaddr(host, port, storage, 1, ipv6first) == -1) {\n                FATAL(\"failed to resolve the provided hostname\");\n            }\n\n            serv->addr = serv->addr_udp = storage;\n            serv->addr_len = serv->addr_udp_len = get_sockaddr_len((struct sockaddr *) storage);\n            serv->port = serv->udp_port = serv_cfg->server_port;\n\n            // set udp port\n            if (serv_cfg->server_udp_port != 0 && serv_cfg->server_udp_port != serv_cfg->server_port) {\n                storage = ss_malloc(sizeof(struct sockaddr_storage));\n                snprintf(port, sizeof(port), \"%d\", serv_cfg->server_udp_port);\n                if (get_sockaddr(host, port, storage, 1, ipv6first) == -1) {\n                    FATAL(\"failed to resolve the provided hostname\");\n                }\n                serv->addr_udp = storage;\n                serv->addr_udp_len = get_sockaddr_len((struct sockaddr *) storage);\n                serv->udp_port = serv_cfg->server_udp_port;\n            }\n            serv->host = ss_strdup(host);\n\n            // Setup keys\n            LOGI(\"initializing ciphers... %s\", serv_cfg->method);\n            enc_init(&serv->cipher, serv_cfg->password, serv_cfg->method);\n            serv->psw = ss_strdup(serv_cfg->password);\n            if (serv_cfg->protocol && strcmp(serv_cfg->protocol, \"verify_sha1\") == 0) {\n                ss_free(serv_cfg->protocol);\n            }\n\n            cork_dllist_init(&serv->connections);\n\n            // init obfs\n            init_obfs(serv, ss_strdup(serv_cfg->protocol), ss_strdup(serv_cfg->protocol_param), ss_strdup(serv_cfg->obfs), ss_strdup(serv_cfg->obfs_param));\n\n            serv->enable = serv_cfg->enable;\n            serv->id = ss_strdup(serv_cfg->id);\n            serv->group = ss_strdup(serv_cfg->group);\n            serv->udp_over_tcp = serv_cfg->udp_over_tcp;\n        }\n    } else {\n        profile->server_num = remote_num;\n        for(i = 0; i < remote_num; i++) {\n            server_def_t *serv = &profile->servers[i];\n            char *host = remote_addr[i].host;\n            char *port = remote_addr[i].port == NULL ? remote_port :\n                         remote_addr[i].port;\n\n            struct sockaddr_storage *storage = ss_malloc(sizeof(struct sockaddr_storage));\n            if (get_sockaddr(host, port, storage, 1, ipv6first) == -1) {\n                FATAL(\"failed to resolve the provided hostname\");\n            }\n            serv->host = ss_strdup(host);\n            serv->addr = serv->addr_udp = storage;\n            serv->addr_len = serv->addr_udp_len = get_sockaddr_len((struct sockaddr *)storage);\n            serv->port = serv->udp_port = atoi(port);\n\n            // Setup keys\n            LOGI(\"initializing ciphers... %s\", method);\n            enc_init(&serv->cipher, password, method);\n            serv->psw = ss_strdup(password);\n\n            cork_dllist_init(&serv->connections);\n\n            // init obfs\n            init_obfs(serv, ss_strdup(protocol), ss_strdup(protocol_param), ss_strdup(obfs), ss_strdup(obfs_param));\n\n            serv->enable = 1;\n        }\n    }\n\n    // Init profiles\n    cork_dllist_init(&inactive_profiles);\n    current_profile = profile;\n\n\n    struct ev_loop *loop = EV_DEFAULT;\n\n    listen_ctx_t *listen_ctx = current_profile;\n\n    if (mode != UDP_ONLY) {\n        // Setup socket\n        int listenfd;\n        listenfd = create_and_bind(local_addr, local_port);\n        if (listenfd == -1) {\n            FATAL(\"bind() error\");\n        }\n        if (listen(listenfd, SOMAXCONN) == -1) {\n            FATAL(\"listen() error\");\n        }\n        setnonblocking(listenfd);\n\n        listen_ctx->fd = listenfd;\n\n        ev_io_init(&listen_ctx->io, accept_cb, listenfd, EV_READ);\n        ev_io_start(loop, &listen_ctx->io);\n    }\n\n    // Setup UDP\n    if (mode != TCP_ONLY) {\n        LOGI(\"UDP relay enabled\");\n        init_udprelay(local_addr, local_port, (struct sockaddr*)listen_ctx->servers[0].addr_udp,\n                      listen_ctx->servers[0].addr_udp_len, tunnel_addr, mtu, listen_ctx->timeout, NULL, &listen_ctx->servers[0].cipher, listen_ctx->servers[0].protocol_name, listen_ctx->servers[0].protocol_param);\n    }\n\n    if (mode == UDP_ONLY) {\n        LOGI(\"TCP relay disabled\");\n    }\n\n    LOGI(\"listening at %s:%s\", local_addr, local_port);\n\n    // setuid\n    if (user != NULL && ! run_as(user)) {\n        FATAL(\"failed to switch user\");\n    }\n\n    if (geteuid() == 0){\n        LOGI(\"running from root user\");\n    }\n\n    ev_run(loop, 0);\n\n    // TODO: release?\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/redir.h",
    "content": "/*\n * redir.h - Define the redirector's buffers and callbacks\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _LOCAL_H\n#define _LOCAL_H\n\n#include <ev.h>\n#include \"encrypt.h\"\n#include \"obfs/obfs.h\"\n#include \"jconf.h\"\n\n#include \"common.h\"\n\ntypedef struct listen_ctx {\n    ev_io io;\n\n    struct cork_dllist_item entries; // for inactive profile list\n    struct cork_dllist connections_eden; // For connections just created but not attach to a server\n\n//    int remote_num;\n    int timeout;\n    int fd;\n//    int method;\n    int mptcp;\n//    struct sockaddr **remote_addr;\n\n//    // SSR\n//    char *protocol_name;\n//    char *protocol_param;\n//    char *obfs_name;\n//    char *obfs_param;\n//    void **list_protocol_global;\n//    void **list_obfs_global;\n\n    int server_num;\n    server_def_t servers[MAX_SERVER_NUM];\n} listen_ctx_t;\n\ntypedef struct server_ctx {\n    ev_io io;\n    int connected;\n    struct server *server;\n} server_ctx_t;\n\ntypedef struct remote_ctx {\n    ev_io io;\n    ev_timer watcher;\n    int connected;\n    struct remote *remote;\n} remote_ctx_t;\n\ntypedef struct remote {\n    int fd;\n    buffer_t *buf;\n    struct remote_ctx *recv_ctx;\n    struct remote_ctx *send_ctx;\n    uint32_t counter;\n    struct server *server;\n\n//       //     SSR\n//    int remote_index;\n} remote_t;\n\ntypedef struct server {\n    int fd;\n    buffer_t *buf;\n    struct sockaddr_storage destaddr;\n    enc_ctx_t *e_ctx;\n    enc_ctx_t *d_ctx;\n    server_ctx_t *recv_ctx;\n    server_ctx_t *send_ctx;\n    listen_ctx_t *listener;\n    remote_t *remote;\n\n    char *hostname;\n    size_t hostname_len;\n\n    struct cork_dllist_item entries;\n    struct cork_dllist_item entries_all; // for all_connections\n\n    server_def_t *server_env;\n\n    // SSR\n    obfs *protocol;\n    obfs *obfs;\n//    obfs_class *protocol_plugin;\n//    obfs_class *obfs_plugin;\n} server_t;\n\n#endif // _LOCAL_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/resolv.c",
    "content": "/*\n * Copyright (c) 2014, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <fcntl.h>\n#include <ev.h>\n#include <udns.h>\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#else\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <errno.h>\n#include <unistd.h>\n#endif\n\n#include \"resolv.h\"\n#include \"utils.h\"\n#include \"netutils.h\"\n\n/*\n * Implement DNS resolution interface using libudns\n */\n\nstruct ResolvQuery {\n    void (*client_cb)(struct sockaddr *, void *);\n    void (*client_free_cb)(void *);\n    void *client_cb_data;\n    struct dns_query *queries[2];\n    size_t response_count;\n    struct sockaddr **responses;\n    uint16_t port;\n};\n\nextern int verbose;\n\nstatic struct ev_io resolv_io_watcher;\nstatic struct ev_timer resolv_timeout_watcher;\nstatic const int MODE_IPV4_ONLY  = 0;\nstatic const int MODE_IPV6_ONLY  = 1;\nstatic const int MODE_IPV4_FIRST = 2;\nstatic const int MODE_IPV6_FIRST = 3;\nstatic int resolv_mode           = 0;\n\nstatic void resolv_sock_cb(struct ev_loop *, struct ev_io *, int);\nstatic void resolv_timeout_cb(struct ev_loop *, struct ev_timer *, int);\nstatic void dns_query_v4_cb(struct dns_ctx *, struct dns_rr_a4 *, void *);\nstatic void dns_query_v6_cb(struct dns_ctx *, struct dns_rr_a6 *, void *);\nstatic void dns_timer_setup_cb(struct dns_ctx *, int, void *);\nstatic void process_client_callback(struct ResolvQuery *);\nstatic inline int all_queries_are_null(struct ResolvQuery *);\nstatic struct sockaddr *choose_ipv4_first(struct ResolvQuery *);\nstatic struct sockaddr *choose_ipv6_first(struct ResolvQuery *);\nstatic struct sockaddr *choose_any(struct ResolvQuery *);\n\nint\nresolv_init(struct ev_loop *loop, char **nameservers, int nameserver_num, int ipv6first)\n{\n    if (ipv6first)\n        resolv_mode = MODE_IPV6_FIRST;\n    else\n        resolv_mode = MODE_IPV4_FIRST;\n\n    struct dns_ctx *ctx = &dns_defctx;\n    if (nameservers == NULL) {\n        /* Nameservers not specified, use system resolver config */\n        dns_init(ctx, 0);\n    } else {\n        dns_reset(ctx);\n\n        for (int i = 0; i < nameserver_num; i++) {\n            char *server = nameservers[i];\n            dns_add_serv(ctx, server);\n        }\n    }\n\n    int sockfd = dns_open(ctx);\n    if (sockfd < 0) {\n        FATAL(\"Failed to open DNS resolver socket\");\n    }\n\n    if (nameserver_num == 1 && nameservers != NULL) {\n        if (strncmp(\"127.0.0.1\", nameservers[0], 9) == 0\n            || strncmp(\"::1\", nameservers[0], 3) == 0) {\n            if (verbose) {\n                LOGI(\"bind UDP resolver to %s\", nameservers[0]);\n            }\n            if (bind_to_address(sockfd, nameservers[0]) == -1)\n                ERROR(\"bind_to_address\");\n        }\n    }\n\n#ifdef __MINGW32__\n    setnonblocking(sockfd);\n#else\n    int flags = fcntl(sockfd, F_GETFL, 0);\n    fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);\n#endif\n\n    ev_io_init(&resolv_io_watcher, resolv_sock_cb, sockfd, EV_READ);\n    resolv_io_watcher.data = ctx;\n\n    ev_io_start(loop, &resolv_io_watcher);\n\n    ev_timer_init(&resolv_timeout_watcher, resolv_timeout_cb, 0.0, 0.0);\n    resolv_timeout_watcher.data = ctx;\n\n    dns_set_tmcbck(ctx, dns_timer_setup_cb, loop);\n\n    return sockfd;\n}\n\nvoid\nresolv_shutdown(struct ev_loop *loop)\n{\n    struct dns_ctx *ctx = (struct dns_ctx *)resolv_io_watcher.data;\n\n    ev_io_stop(loop, &resolv_io_watcher);\n\n    if (ev_is_active(&resolv_timeout_watcher)) {\n        ev_timer_stop(loop, &resolv_timeout_watcher);\n    }\n\n    dns_close(ctx);\n}\n\nstruct ResolvQuery *\nresolv_query(const char *hostname, void (*client_cb)(struct sockaddr *, void *),\n             void (*client_free_cb)(void *), void *client_cb_data,\n             uint16_t port)\n{\n    struct dns_ctx *ctx = (struct dns_ctx *)resolv_io_watcher.data;\n\n    /*\n     * Wrap udns's call back in our own\n     */\n    struct ResolvQuery *cb_data = ss_malloc(sizeof(struct ResolvQuery));\n    if (cb_data == NULL) {\n        LOGE(\"Failed to allocate memory for DNS query callback data.\");\n        return NULL;\n    }\n    memset(cb_data, 0, sizeof(struct ResolvQuery));\n\n    cb_data->client_cb      = client_cb;\n    cb_data->client_free_cb = client_free_cb;\n    cb_data->client_cb_data = client_cb_data;\n    memset(cb_data->queries, 0, sizeof(cb_data->queries));\n    cb_data->response_count = 0;\n    cb_data->responses      = NULL;\n    cb_data->port           = port;\n\n    /* Submit A and AAAA queries */\n    if (resolv_mode != MODE_IPV6_ONLY) {\n        cb_data->queries[0] = dns_submit_a4(ctx,\n                                            hostname, 0,\n                                            dns_query_v4_cb, cb_data);\n        if (cb_data->queries[0] == NULL) {\n            LOGE(\"Failed to submit DNS query: %s\",\n                 dns_strerror(dns_status(ctx)));\n        }\n    }\n\n    if (resolv_mode != MODE_IPV4_ONLY) {\n        cb_data->queries[1] = dns_submit_a6(ctx,\n                                            hostname, 0,\n                                            dns_query_v6_cb, cb_data);\n        if (cb_data->queries[1] == NULL) {\n            LOGE(\"Failed to submit DNS query: %s\",\n                 dns_strerror(dns_status(ctx)));\n        }\n    }\n\n    if (all_queries_are_null(cb_data)) {\n        if (cb_data->client_free_cb != NULL) {\n            cb_data->client_free_cb(cb_data->client_cb_data);\n        }\n        ss_free(cb_data);\n    }\n\n    return cb_data;\n}\n\nvoid\nresolv_cancel(struct ResolvQuery *query_handle)\n{\n    struct ResolvQuery *cb_data = (struct ResolvQuery *)query_handle;\n    struct dns_ctx *ctx         = (struct dns_ctx *)resolv_io_watcher.data;\n\n    for (int i = 0; i < sizeof(cb_data->queries) / sizeof(cb_data->queries[0]);\n         i++)\n        if (cb_data->queries[i] != NULL) {\n            dns_cancel(ctx, cb_data->queries[i]);\n            ss_free(cb_data->queries[i]);\n        }\n\n    if (cb_data->client_free_cb != NULL) {\n        cb_data->client_free_cb(cb_data->client_cb_data);\n    }\n\n    ss_free(cb_data);\n}\n\n/*\n * DNS UDP socket activity callback\n */\nstatic void\nresolv_sock_cb(struct ev_loop *loop, struct ev_io *w, int revents)\n{\n    struct dns_ctx *ctx = (struct dns_ctx *)w->data;\n\n    if (revents & EV_READ) {\n        dns_ioevent(ctx, ev_now(loop));\n    }\n}\n\n/*\n * Wrapper for client callback we provide to udns\n */\nstatic void\ndns_query_v4_cb(struct dns_ctx *ctx, struct dns_rr_a4 *result, void *data)\n{\n    struct ResolvQuery *cb_data = (struct ResolvQuery *)data;\n\n    if (result == NULL) {\n        if (verbose) {\n            LOGI(\"IPv4 resolv: %s\", dns_strerror(dns_status(ctx)));\n        }\n    } else if (result->dnsa4_nrr > 0) {\n        struct sockaddr **new_responses = ss_realloc(cb_data->responses,\n                                                     (cb_data->response_count +\n                                                      result->dnsa4_nrr) *\n                                                     sizeof(struct sockaddr *));\n        if (new_responses == NULL) {\n            LOGE(\"Failed to allocate memory for additional DNS responses\");\n        } else {\n            cb_data->responses = new_responses;\n\n            for (int i = 0; i < result->dnsa4_nrr; i++) {\n                struct sockaddr_in *sa = ss_malloc(sizeof(struct sockaddr_in));\n                memset(sa, 0, sizeof(struct sockaddr_in));\n                sa->sin_family = AF_INET;\n                sa->sin_port   = cb_data->port;\n                sa->sin_addr   = result->dnsa4_addr[i];\n\n                cb_data->responses[cb_data->response_count] =\n                    (struct sockaddr *)sa;\n                if (cb_data->responses[cb_data->response_count] == NULL) {\n                    LOGE(\n                        \"Failed to allocate memory for DNS query result address\");\n                } else {\n                    cb_data->response_count++;\n                }\n            }\n        }\n    }\n\n    ss_free(result);\n    cb_data->queries[0] = NULL; /* mark A query as being completed */\n\n    /* Once all queries have completed, call client callback */\n    if (all_queries_are_null(cb_data)) {\n        return process_client_callback(cb_data);\n    }\n}\n\nstatic void\ndns_query_v6_cb(struct dns_ctx *ctx, struct dns_rr_a6 *result, void *data)\n{\n    struct ResolvQuery *cb_data = (struct ResolvQuery *)data;\n\n    if (result == NULL) {\n        if (verbose) {\n            LOGI(\"IPv6 resolv: %s\", dns_strerror(dns_status(ctx)));\n        }\n    } else if (result->dnsa6_nrr > 0) {\n        struct sockaddr **new_responses = ss_realloc(cb_data->responses,\n                                                     (cb_data->response_count +\n                                                      result->dnsa6_nrr) *\n                                                     sizeof(struct sockaddr *));\n        if (new_responses == NULL) {\n            LOGE(\"Failed to allocate memory for additional DNS responses\");\n        } else {\n            cb_data->responses = new_responses;\n\n            for (int i = 0; i < result->dnsa6_nrr; i++) {\n                struct sockaddr_in6 *sa = ss_malloc(sizeof(struct sockaddr_in6));\n                memset(sa, 0, sizeof(struct sockaddr_in6));\n                sa->sin6_family = AF_INET6;\n                sa->sin6_port   = cb_data->port;\n                sa->sin6_addr   = result->dnsa6_addr[i];\n\n                cb_data->responses[cb_data->response_count] =\n                    (struct sockaddr *)sa;\n                if (cb_data->responses[cb_data->response_count] == NULL) {\n                    LOGE(\n                        \"Failed to allocate memory for DNS query result address\");\n                } else {\n                    cb_data->response_count++;\n                }\n            }\n        }\n    }\n\n    ss_free(result);\n    cb_data->queries[1] = NULL; /* mark AAAA query as being completed */\n\n    /* Once all queries have completed, call client callback */\n    if (all_queries_are_null(cb_data)) {\n        return process_client_callback(cb_data);\n    }\n}\n\n/*\n * Called once all queries have been completed\n */\nstatic void\nprocess_client_callback(struct ResolvQuery *cb_data)\n{\n    struct sockaddr *best_address = NULL;\n\n    if (resolv_mode == MODE_IPV4_FIRST) {\n        best_address = choose_ipv4_first(cb_data);\n    } else if (resolv_mode == MODE_IPV6_FIRST) {\n        best_address = choose_ipv6_first(cb_data);\n    } else {\n        best_address = choose_any(cb_data);\n    }\n\n    cb_data->client_cb(best_address, cb_data->client_cb_data);\n\n    for (int i = 0; i < cb_data->response_count; i++)\n        ss_free(cb_data->responses[i]);\n\n    ss_free(cb_data->responses);\n    if (cb_data->client_free_cb != NULL) {\n        cb_data->client_free_cb(cb_data->client_cb_data);\n    }\n    ss_free(cb_data);\n}\n\nstatic struct sockaddr *\nchoose_ipv4_first(struct ResolvQuery *cb_data)\n{\n    for (int i = 0; i < cb_data->response_count; i++)\n        if (cb_data->responses[i]->sa_family == AF_INET) {\n            return cb_data->responses[i];\n        }\n\n    return choose_any(cb_data);\n}\n\nstatic struct sockaddr *\nchoose_ipv6_first(struct ResolvQuery *cb_data)\n{\n    for (int i = 0; i < cb_data->response_count; i++)\n        if (cb_data->responses[i]->sa_family == AF_INET6) {\n            return cb_data->responses[i];\n        }\n\n    return choose_any(cb_data);\n}\n\nstatic struct sockaddr *\nchoose_any(struct ResolvQuery *cb_data)\n{\n    if (cb_data->response_count >= 1) {\n        return cb_data->responses[0];\n    }\n\n    return NULL;\n}\n\n/*\n * DNS timeout callback\n */\nstatic void\nresolv_timeout_cb(struct ev_loop *loop, struct ev_timer *w, int revents)\n{\n    struct dns_ctx *ctx = (struct dns_ctx *)w->data;\n\n    if (revents & EV_TIMER) {\n        dns_timeouts(ctx, 30, ev_now(loop));\n    }\n}\n\n/*\n * Callback to setup DNS timeout callback\n */\nstatic void\ndns_timer_setup_cb(struct dns_ctx *ctx, int timeout, void *data)\n{\n    struct ev_loop *loop = (struct ev_loop *)data;\n\n    if (ev_is_active(&resolv_timeout_watcher)) {\n        ev_timer_stop(loop, &resolv_timeout_watcher);\n    }\n\n    if (ctx != NULL && timeout >= 0) {\n        ev_timer_set(&resolv_timeout_watcher, timeout, 0.0);\n        ev_timer_start(loop, &resolv_timeout_watcher);\n    }\n}\n\nstatic inline int\nall_queries_are_null(struct ResolvQuery *cb_data)\n{\n    int result = 1;\n\n    for (int i = 0; i < sizeof(cb_data->queries) / sizeof(cb_data->queries[0]);\n         i++)\n        result = result && cb_data->queries[i] == NULL;\n\n    return result;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/resolv.h",
    "content": "/*\n * Copyright (c) 2014, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef RESOLV_H\n#define RESOLV_H\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdint.h>\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#else\n#include <sys/socket.h>\n#endif\n\nstruct ResolvQuery;\n\nint resolv_init(struct ev_loop *, char **, int, int);\nstruct ResolvQuery *resolv_query(const char *, void (*)(struct sockaddr *,\n                                                        void *), void (*)(\n                                     void *), void *, uint16_t);\nvoid resolv_cancel(struct ResolvQuery *);\nvoid resolv_shutdown(struct ev_loop *);\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/rule.c",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * Copyright (c) 2011 Manuel Kasper <mk@neon1.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <string.h>\n\n#ifdef __MINGW32__\nextern void ss_error(const char *s);\n#endif\n\n#include \"rule.h\"\n#include \"utils.h\"\n\nstatic void free_rule(rule_t *);\n\nrule_t *\nnew_rule()\n{\n    rule_t *rule;\n\n    rule = calloc(1, sizeof(rule_t));\n    if (rule == NULL) {\n        ERROR(\"malloc\");\n        return NULL;\n    }\n\n    return rule;\n}\n\nint\naccept_rule_arg(rule_t *rule, const char *arg)\n{\n    if (rule->pattern == NULL) {\n        rule->pattern = strdup(arg);\n        if (rule->pattern == NULL) {\n            ERROR(\"strdup failed\");\n            return -1;\n        }\n    } else {\n        LOGE(\"Unexpected table rule argument: %s\", arg);\n        return -1;\n    }\n\n    return 1;\n}\n\nvoid\nadd_rule(struct cork_dllist *rules, rule_t *rule)\n{\n    cork_dllist_add(rules, &rule->entries);\n}\n\nint\ninit_rule(rule_t *rule)\n{\n    if (rule->pattern_re == NULL) {\n        const char *reerr;\n        int reerroffset;\n\n        rule->pattern_re =\n            pcre_compile(rule->pattern, 0, &reerr, &reerroffset, NULL);\n        if (rule->pattern_re == NULL) {\n            LOGE(\"Regex compilation of \\\"%s\\\" failed: %s, offset %d\",\n                 rule->pattern, reerr, reerroffset);\n            return 0;\n        }\n    }\n\n    return 1;\n}\n\nrule_t *\nlookup_rule(const struct cork_dllist *rules, const char *name, size_t name_len)\n{\n    struct cork_dllist_item *curr, *next;\n\n    if (name == NULL) {\n        name     = \"\";\n        name_len = 0;\n    }\n\n    cork_dllist_foreach_void(rules, curr, next) {\n        rule_t *rule = cork_container_of(curr, rule_t, entries);\n        if (pcre_exec(rule->pattern_re, NULL,\n                      name, name_len, 0, 0, NULL, 0) >= 0)\n            return rule;\n    }\n\n    return NULL;\n}\n\nvoid\nremove_rule(rule_t *rule)\n{\n    cork_dllist_remove(&rule->entries);\n    free_rule(rule);\n}\n\nstatic void\nfree_rule(rule_t *rule)\n{\n    if (rule == NULL)\n        return;\n\n    ss_free(rule->pattern);\n    if (rule->pattern_re != NULL)\n        pcre_free(rule->pattern_re);\n    ss_free(rule);\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/rule.h",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * Copyright (c) 2011 Manuel Kasper <mk@neon1.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef RULE_H\n#define RULE_H\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <libcork/ds.h>\n\n#ifdef HAVE_PCRE_H\n#include <pcre.h>\n#elif HAVE_PCRE_PCRE_H\n#include <pcre/pcre.h>\n#endif\n\ntypedef struct rule {\n    char *pattern;\n\n    /* Runtime fields */\n    pcre *pattern_re;\n\n    struct cork_dllist_item entries;\n} rule_t;\n\nvoid add_rule(struct cork_dllist *, rule_t *);\nint init_rule(rule_t *);\nrule_t *lookup_rule(const struct cork_dllist *, const char *, size_t);\nvoid remove_rule(rule_t *);\nrule_t *new_rule();\nint accept_rule_arg(rule_t *, const char *);\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/server.c",
    "content": "/*\n * server.c - Provide shadowsocks service\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <fcntl.h>\n#include <locale.h>\n#include <signal.h>\n#include <string.h>\n#include <strings.h>\n#include <time.h>\n#include <unistd.h>\n#include <getopt.h>\n#include <math.h>\n\n#ifndef __MINGW32__\n#include <netdb.h>\n#include <errno.h>\n#include <arpa/inet.h>\n#include <netinet/in.h>\n#include <pthread.h>\n#include <sys/un.h>\n#endif\n\n#include <libcork/core.h>\n#include <udns.h>\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#endif\n\n#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_NET_IF_H) && defined(__linux__)\n#include <net/if.h>\n#include <sys/ioctl.h>\n#define SET_INTERFACE\n#endif\n\n#include \"netutils.h\"\n#include \"utils.h\"\n#include \"acl.h\"\n#include \"server.h\"\n\n#ifndef EAGAIN\n#define EAGAIN EWOULDBLOCK\n#endif\n\n#ifndef EWOULDBLOCK\n#define EWOULDBLOCK EAGAIN\n#endif\n\n#ifndef BUF_SIZE\n#define BUF_SIZE 2048\n#endif\n\n#ifndef SSMAXCONN\n#define SSMAXCONN 1024\n#endif\n\n#ifndef UPDATE_INTERVAL\n#define UPDATE_INTERVAL 30\n#endif\n\nstatic void signal_cb(EV_P_ ev_signal *w, int revents);\nstatic void accept_cb(EV_P_ ev_io *w, int revents);\nstatic void server_send_cb(EV_P_ ev_io *w, int revents);\nstatic void server_recv_cb(EV_P_ ev_io *w, int revents);\nstatic void remote_recv_cb(EV_P_ ev_io *w, int revents);\nstatic void remote_send_cb(EV_P_ ev_io *w, int revents);\nstatic void server_timeout_cb(EV_P_ ev_timer *watcher, int revents);\nstatic void block_list_clear_cb(EV_P_ ev_timer *watcher, int revents);\n\nstatic remote_t *new_remote(int fd);\nstatic server_t *new_server(int fd, listen_ctx_t *listener);\nstatic remote_t *connect_to_remote(EV_P_ struct addrinfo *res,\n                                   server_t *server);\n\nstatic void free_remote(remote_t *remote);\nstatic void close_and_free_remote(EV_P_ remote_t *remote);\nstatic void free_server(server_t *server);\nstatic void close_and_free_server(EV_P_ server_t *server);\nstatic void server_resolve_cb(struct sockaddr *addr, void *data);\nstatic void query_free_cb(void *data);\n\nstatic int is_header_complete(const buffer_t *buf);\n\nint verbose = 0;\n\nstatic int acl       = 0;\nstatic int mode      = TCP_ONLY;\nstatic int ipv6first = 0;\n\nstatic int fast_open = 0;\n#ifdef HAVE_SETRLIMIT\nstatic int nofile = 0;\n#endif\nstatic int remote_conn = 0;\nstatic int server_conn = 0;\n\nstatic char *bind_address    = NULL;\nstatic char *server_port     = NULL;\nstatic char *manager_address = NULL;\nuint64_t tx                  = 0;\nuint64_t rx                  = 0;\nev_timer stat_update_watcher;\nev_timer block_list_watcher;\n\nstatic struct cork_dllist connections;\n\nstatic void\nstat_update_cb(EV_P_ ev_timer *watcher, int revents)\n{\n#ifndef __MINGW32__\n    struct sockaddr_un svaddr, claddr;\n#endif\n\n    int sfd = -1;\n    size_t msgLen;\n    char resp[BUF_SIZE];\n\n    if (verbose) {\n        LOGI(\"update traffic stat: tx: %\" PRIu64 \" rx: %\" PRIu64 \"\", tx, rx);\n    }\n\n    snprintf(resp, BUF_SIZE, \"stat: {\\\"%s\\\":%\" PRIu64 \"}\", server_port, tx + rx);\n    msgLen = strlen(resp) + 1;\n\n    ss_addr_t ip_addr = { .host = NULL, .port = NULL };\n    parse_addr(manager_address, &ip_addr);\n\n    if (ip_addr.host == NULL || ip_addr.port == NULL) {\n#ifndef __MINGW32__\n        sfd = socket(AF_UNIX, SOCK_DGRAM, 0);\n        if (sfd == -1) {\n            ERROR(\"stat_socket\");\n            return;\n        }\n\n        memset(&claddr, 0, sizeof(struct sockaddr_un));\n        claddr.sun_family = AF_UNIX;\n        snprintf(claddr.sun_path, sizeof(claddr.sun_path), \"/tmp/shadowsocks.%s\", server_port);\n\n        unlink(claddr.sun_path);\n\n        if (bind(sfd, (struct sockaddr *)&claddr, sizeof(struct sockaddr_un)) == -1) {\n            ERROR(\"stat_bind\");\n            close(sfd);\n            return;\n        }\n\n        memset(&svaddr, 0, sizeof(struct sockaddr_un));\n        svaddr.sun_family = AF_UNIX;\n        strncpy(svaddr.sun_path, manager_address, sizeof(svaddr.sun_path) - 1);\n\n        if (sendto(sfd, resp, strlen(resp) + 1, 0, (struct sockaddr *)&svaddr,\n                   sizeof(struct sockaddr_un)) != msgLen) {\n            ERROR(\"stat_sendto\");\n            close(sfd);\n            return;\n        }\n\n        unlink(claddr.sun_path);\n#else\n        ERROR(\"unsupported platform\");\n        return;\n#endif\n    } else {\n        struct sockaddr_storage storage;\n        memset(&storage, 0, sizeof(struct sockaddr_storage));\n        if (get_sockaddr(ip_addr.host, ip_addr.port, &storage, 0, ipv6first) == -1) {\n            ERROR(\"failed to parse the manager addr\");\n            return;\n        }\n\n        sfd = socket(storage.ss_family, SOCK_DGRAM, 0);\n\n        if (sfd == -1) {\n            ERROR(\"stat_socket\");\n            return;\n        }\n\n        size_t addr_len = get_sockaddr_len((struct sockaddr *)&storage);\n        if (sendto(sfd, resp, strlen(resp) + 1, 0, (struct sockaddr *)&storage,\n                   addr_len) != msgLen) {\n            ERROR(\"stat_sendto\");\n            close(sfd);\n            return;\n        }\n    }\n\n    close(sfd);\n}\n\nstatic void\nfree_connections(struct ev_loop *loop)\n{\n    struct cork_dllist_item *curr, *next;\n    cork_dllist_foreach_void(&connections, curr, next) {\n        server_t *server = cork_container_of(curr, server_t, entries);\n        remote_t *remote = server->remote;\n        close_and_free_server(loop, server);\n        close_and_free_remote(loop, remote);\n    }\n}\n\nstatic int\nis_header_complete(const buffer_t *buf)\n{\n    size_t header_len = 0;\n    size_t buf_len    = buf->len;\n\n    char atyp = buf->array[header_len];\n\n    // 1 byte for atyp\n    header_len++;\n\n    if ((atyp & ADDRTYPE_MASK) == 1) {\n        // IP V4\n        header_len += sizeof(struct in_addr);\n    } else if ((atyp & ADDRTYPE_MASK) == 3) {\n        // Domain name\n        // domain len + len of domain\n        if (buf_len < header_len + 1)\n            return 0;\n        uint8_t name_len = *(uint8_t *)(buf->array + header_len);\n        header_len += name_len + 1;\n    } else if ((atyp & ADDRTYPE_MASK) == 4) {\n        // IP V6\n        header_len += sizeof(struct in6_addr);\n    } else {\n        return -1;\n    }\n\n    // len of port\n    header_len += 2;\n\n    return buf_len >= header_len ? 1 : 0;\n}\n\nstatic char *\nget_peer_name(int fd)\n{\n    static char peer_name[INET6_ADDRSTRLEN] = { 0 };\n    struct sockaddr_storage addr;\n    socklen_t len = sizeof(struct sockaddr_storage);\n    memset(&addr, 0, len);\n    memset(peer_name, 0, INET6_ADDRSTRLEN);\n    int err = getpeername(fd, (struct sockaddr *)&addr, &len);\n    if (err == 0) {\n        if (addr.ss_family == AF_INET) {\n            struct sockaddr_in *s = (struct sockaddr_in *)&addr;\n            dns_ntop(AF_INET, &s->sin_addr, peer_name, INET_ADDRSTRLEN);\n        } else if (addr.ss_family == AF_INET6) {\n            struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;\n            dns_ntop(AF_INET6, &s->sin6_addr, peer_name, INET6_ADDRSTRLEN);\n        }\n    } else {\n        return NULL;\n    }\n    return peer_name;\n}\n\n#ifdef __linux__\nstatic void\nset_linger(int fd)\n{\n    struct linger so_linger;\n    memset(&so_linger, 0, sizeof(struct linger));\n    so_linger.l_onoff  = 1;\n    so_linger.l_linger = 0;\n    setsockopt(fd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof so_linger);\n}\n#endif\n\nstatic void\nreset_addr(int fd)\n{\n    char *peer_name;\n    peer_name = get_peer_name(fd);\n    if (peer_name != NULL) {\n        remove_from_block_list(peer_name);\n    }\n}\n\nstatic void\nreport_addr(int fd, int err_level)\n{\n#ifdef __linux__\n    set_linger(fd);\n#endif\n\n    char *peer_name;\n    peer_name = get_peer_name(fd);\n    if (peer_name != NULL) {\n        LOGE(\"failed to handshake with %s\", peer_name);\n        update_block_list(peer_name, err_level);\n    }\n}\n\nint\nsetfastopen(int fd)\n{\n    int s = 0;\n#ifdef TCP_FASTOPEN\n    if (fast_open) {\n#ifdef __APPLE__\n        int opt = 1;\n#else\n        int opt = 5;\n#endif\n        s = setsockopt(fd, IPPROTO_TCP, TCP_FASTOPEN, &opt, sizeof(opt));\n\n        if (s == -1) {\n            if (errno == EPROTONOSUPPORT || errno == ENOPROTOOPT) {\n                LOGE(\"fast open is not supported on this platform\");\n                fast_open = 0;\n            } else {\n                ERROR(\"setsockopt\");\n            }\n        }\n    }\n#endif\n    return s;\n}\n\n#ifndef __MINGW32__\nint\nsetnonblocking(int fd)\n{\n    int flags;\n    if (-1 == (flags = fcntl(fd, F_GETFL, 0))) {\n        flags = 0;\n    }\n    return fcntl(fd, F_SETFL, flags | O_NONBLOCK);\n}\n\n#endif\n\nint\ncreate_and_bind(const char *host, const char *port, int mptcp)\n{\n    struct addrinfo hints;\n    struct addrinfo *result, *rp, *ipv4v6bindall;\n    int s, listen_sock;\n\n    memset(&hints, 0, sizeof(struct addrinfo));\n    hints.ai_family   = AF_UNSPEC;               /* Return IPv4 and IPv6 choices */\n    hints.ai_socktype = SOCK_STREAM;             /* We want a TCP socket */\n    hints.ai_flags    = AI_PASSIVE | AI_ADDRCONFIG; /* For wildcard IP address */\n    hints.ai_protocol = IPPROTO_TCP;\n\n    for (int i = 1; i < 8; i++) {\n        s = getaddrinfo(host, port, &hints, &result);\n        if (s == 0) {\n            break;\n        } else {\n            sleep(pow(2, i));\n            LOGE(\"failed to resolve server name, wait %.0f seconds\", pow(2, i));\n        }\n    }\n\n    if (s != 0) {\n        LOGE(\"getaddrinfo: %s\", gai_strerror(s));\n        return -1;\n    }\n\n    rp = result;\n\n    /*\n     * On Linux, with net.ipv6.bindv6only = 0 (the default), getaddrinfo(NULL) with\n     * AI_PASSIVE returns 0.0.0.0 and :: (in this order). AI_PASSIVE was meant to\n     * return a list of addresses to listen on, but it is impossible to listen on\n     * 0.0.0.0 and :: at the same time, if :: implies dualstack mode.\n     */\n    if (!host) {\n        ipv4v6bindall = result;\n\n        /* Loop over all address infos found until a IPV6 address is found. */\n        while (ipv4v6bindall) {\n            if (ipv4v6bindall->ai_family == AF_INET6) {\n                rp = ipv4v6bindall; /* Take first IPV6 address available */\n                break;\n            }\n            ipv4v6bindall = ipv4v6bindall->ai_next; /* Get next address info, if any */\n        }\n    }\n\n    for (/*rp = result*/; rp != NULL; rp = rp->ai_next) {\n        listen_sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);\n        if (listen_sock == -1) {\n            continue;\n        }\n\n        if (rp->ai_family == AF_INET6) {\n            int ipv6only = host ? 1 : 0;\n            setsockopt(listen_sock, IPPROTO_IPV6, IPV6_V6ONLY, &ipv6only, sizeof(ipv6only));\n        }\n\n        int opt = 1;\n        setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));\n#ifdef SO_NOSIGPIPE\n        setsockopt(listen_sock, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n#endif\n        int err = set_reuseport(listen_sock);\n        if (err == 0) {\n            LOGI(\"tcp port reuse enabled\");\n        }\n\n        if (mptcp == 1) {\n            int err = setsockopt(listen_sock, SOL_TCP, MPTCP_ENABLED, &opt, sizeof(opt));\n            if (err == -1) {\n                ERROR(\"failed to enable multipath TCP\");\n            }\n        }\n\n        s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);\n        if (s == 0) {\n            /* We managed to bind successfully! */\n            break;\n        } else {\n            ERROR(\"bind\");\n        }\n\n        close(listen_sock);\n    }\n\n    if (rp == NULL) {\n        LOGE(\"Could not bind\");\n        return -1;\n    }\n\n    freeaddrinfo(result);\n\n    return listen_sock;\n}\n\nstatic remote_t *\nconnect_to_remote(EV_P_ struct addrinfo *res,\n                  server_t *server)\n{\n    int sockfd;\n#ifdef SET_INTERFACE\n    const char *iface = server->listen_ctx->iface;\n#endif\n\n    if (acl) {\n        char ipstr[INET6_ADDRSTRLEN];\n        memset(ipstr, 0, INET6_ADDRSTRLEN);\n\n        if (res->ai_addr->sa_family == AF_INET) {\n            struct sockaddr_in *s = (struct sockaddr_in *)res->ai_addr;\n            dns_ntop(AF_INET, &s->sin_addr, ipstr, INET_ADDRSTRLEN);\n        } else if (res->ai_addr->sa_family == AF_INET6) {\n            struct sockaddr_in6 *s = (struct sockaddr_in6 *)res->ai_addr;\n            dns_ntop(AF_INET6, &s->sin6_addr, ipstr, INET6_ADDRSTRLEN);\n        }\n\n        if (outbound_block_match_host(ipstr) == 1) {\n            if (verbose)\n                LOGI(\"outbound blocked %s\", ipstr);\n            return NULL;\n        }\n    }\n\n    // initialize remote socks\n    sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);\n    if (sockfd == -1) {\n        ERROR(\"socket\");\n        close(sockfd);\n        return NULL;\n    }\n\n    int opt = 1;\n    setsockopt(sockfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\n#ifdef SO_NOSIGPIPE\n    setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n#endif\n    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));\n\n    // setup remote socks\n\n    if (setnonblocking(sockfd) == -1)\n        ERROR(\"setnonblocking\");\n\n    if (bind_address != NULL)\n        if (bind_to_address(sockfd, bind_address) == -1) {\n            ERROR(\"bind_to_address\");\n            close(sockfd);\n            return NULL;\n        }\n\n#ifdef SET_INTERFACE\n    if (iface) {\n        if (setinterface(sockfd, iface) == -1) {\n            ERROR(\"setinterface\");\n            close(sockfd);\n            return NULL;\n        }\n    }\n#endif\n\n    remote_t *remote = new_remote(sockfd);\n\n#ifdef TCP_FASTOPEN\n    if (fast_open) {\n#ifdef __APPLE__\n        ((struct sockaddr_in *)(res->ai_addr))->sin_len = sizeof(struct sockaddr_in);\n        sa_endpoints_t endpoints;\n        memset((char *)&endpoints, 0, sizeof(endpoints));\n        endpoints.sae_dstaddr    = res->ai_addr;\n        endpoints.sae_dstaddrlen = res->ai_addrlen;\n\n        struct iovec iov;\n        iov.iov_base = server->buf->array + server->buf->idx;\n        iov.iov_len  = server->buf->len;\n        size_t len;\n        int s = connectx(sockfd, &endpoints, SAE_ASSOCID_ANY, CONNECT_DATA_IDEMPOTENT,\n                         &iov, 1, &len, NULL);\n        if (s == 0) {\n            s = len;\n        }\n#else\n        ssize_t s = sendto(sockfd, server->buf->array + server->buf->idx,\n                           server->buf->len, MSG_FASTOPEN, res->ai_addr,\n                           res->ai_addrlen);\n#endif\n        if (s == -1) {\n            if (errno == CONNECT_IN_PROGRESS || errno == EAGAIN\n                || errno == EWOULDBLOCK) {\n                // The remote server doesn't support tfo or it's the first connection to the server.\n                // It will automatically fall back to conventional TCP.\n            } else if (errno == EOPNOTSUPP || errno == EPROTONOSUPPORT ||\n                       errno == ENOPROTOOPT) {\n                // Disable fast open as it's not supported\n                fast_open = 0;\n                LOGE(\"fast open is not supported on this platform\");\n            } else {\n                ERROR(\"sendto\");\n            }\n        } else if (s <= server->buf->len) {\n            server->buf->idx += s;\n            server->buf->len -= s;\n        } else {\n            server->buf->idx = 0;\n            server->buf->len = 0;\n        }\n    }\n#endif\n\n    if (!fast_open) {\n        int r = connect(sockfd, res->ai_addr, res->ai_addrlen);\n\n        if (r == -1 && errno != CONNECT_IN_PROGRESS) {\n            ERROR(\"connect\");\n            close_and_free_remote(EV_A_ remote);\n            return NULL;\n        }\n    }\n\n    return remote;\n}\n\nstatic void\nserver_recv_cb(EV_P_ ev_io *w, int revents)\n{\n    server_ctx_t *server_recv_ctx = (server_ctx_t *)w;\n    server_t *server              = server_recv_ctx->server;\n    remote_t *remote              = NULL;\n\n    int len       = server->buf->len;\n    buffer_t *buf = server->buf;\n\n    if (server->stage > STAGE_PARSE) {\n        remote = server->remote;\n        buf    = remote->buf;\n        len    = 0;\n\n        ev_timer_again(EV_A_ & server->recv_ctx->watcher);\n    }\n\n    if (len > BUF_SIZE) {\n        ERROR(\"out of recv buffer\");\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    ssize_t r = recv(server->fd, buf->array + len, BUF_SIZE - len, 0);\n\n    if (r == 0) {\n        // connection closed\n        if (verbose) {\n            LOGI(\"server_recv close the connection\");\n        }\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else if (r == -1) {\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n            // no data\n            // continue to wait for recv\n            return;\n        } else {\n            ERROR(\"server recv\");\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    }\n\n    tx += r;\n\n    if (server->stage == STAGE_ERROR) {\n        server->buf->len = 0;\n        server->buf->idx = 0;\n        return;\n    }\n\n    // handle incomplete header part 1\n    if (server->stage == STAGE_INIT) {\n        buf->len += r;\n        if (buf->len <= enc_get_iv_len(&cipher_env) + 1) {\n            // wait for more\n            return;\n        }\n    } else {\n        buf->len = r;\n    }\n\n    int err = ss_decrypt(&cipher_env, buf, server->d_ctx, BUF_SIZE);\n\n    if (err) {\n        report_addr(server->fd, MALICIOUS);\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    // handle incomplete header part 2\n    if (server->stage == STAGE_INIT) {\n        int ret = is_header_complete(server->buf);\n        if (ret == 1) {\n            bfree(server->header_buf);\n            ss_free(server->header_buf);\n            server->stage = STAGE_PARSE;\n        } else if (ret == -1) {\n            server->stage = STAGE_ERROR;\n            report_addr(server->fd, MALFORMED);\n            server->buf->len = 0;\n            server->buf->idx = 0;\n            return;\n        } else {\n            server->stage = STAGE_HANDSHAKE;\n        }\n    }\n\n    if (server->stage == STAGE_HANDSHAKE) {\n        size_t header_len = server->header_buf->len;\n        brealloc(server->header_buf, server->buf->len + header_len, BUF_SIZE);\n        memcpy(server->header_buf->array + header_len,\n               server->buf->array, server->buf->len);\n        server->header_buf->len = server->buf->len + header_len;\n\n        int ret = is_header_complete(server->buf);\n\n        if (ret == 1) {\n            brealloc(server->buf, server->header_buf->len, BUF_SIZE);\n            memcpy(server->buf->array, server->header_buf->array, server->header_buf->len);\n            server->buf->len = server->header_buf->len;\n            bfree(server->header_buf);\n            ss_free(server->header_buf);\n            server->stage = STAGE_PARSE;\n        } else {\n            if (ret == -1)\n                server->stage = STAGE_ERROR;\n            server->buf->len = 0;\n            server->buf->idx = 0;\n            return;\n        }\n    }\n\n    // handshake and transmit data\n    if (server->stage == STAGE_STREAM) {\n        int s = send(remote->fd, remote->buf->array, remote->buf->len, 0);\n        if (s == -1) {\n            if (errno == EAGAIN || errno == EWOULDBLOCK) {\n                // no data, wait for send\n                remote->buf->idx = 0;\n                ev_io_stop(EV_A_ & server_recv_ctx->io);\n                ev_io_start(EV_A_ & remote->send_ctx->io);\n            } else {\n                ERROR(\"server_recv_send\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n            }\n        } else if (s < remote->buf->len) {\n            remote->buf->len -= s;\n            remote->buf->idx  = s;\n            ev_io_stop(EV_A_ & server_recv_ctx->io);\n            ev_io_start(EV_A_ & remote->send_ctx->io);\n        }\n        return;\n    } else if (server->stage == STAGE_PARSE) {\n        /*\n         * Shadowsocks TCP Relay Header:\n         *\n         *    +------+----------+----------+\n         *    | ATYP | DST.ADDR | DST.PORT |\n         *    +------+----------+----------+\n         *    |  1   | Variable |    2     |\n         *    +------+----------+----------+\n         */\n\n        /*\n         * TCP Relay's payload\n         *\n         *    +-------------+------+\n         *    |    DATA     |      ...\n         *    +-------------+------+\n         *    |  Variable   |      ...\n         *    +-------------+------+\n         */\n\n        int offset     = 0;\n        int need_query = 0;\n        char atyp      = server->buf->array[offset++];\n        char host[257] = { 0 };\n        uint16_t port  = 0;\n        struct addrinfo info;\n        struct sockaddr_storage storage;\n        memset(&info, 0, sizeof(struct addrinfo));\n        memset(&storage, 0, sizeof(struct sockaddr_storage));\n\n        // get remote addr and port\n        if ((atyp & ADDRTYPE_MASK) == 1) {\n            // IP V4\n            struct sockaddr_in *addr = (struct sockaddr_in *)&storage;\n            size_t in_addr_len       = sizeof(struct in_addr);\n            addr->sin_family = AF_INET;\n            if (server->buf->len >= in_addr_len + 3) {\n                addr->sin_addr = *(struct in_addr *)(server->buf->array + offset);\n                dns_ntop(AF_INET, (const void *)(server->buf->array + offset),\n                         host, INET_ADDRSTRLEN);\n                offset += in_addr_len;\n            } else {\n                LOGE(\"invalid header with addr type %d\", atyp);\n                report_addr(server->fd, MALFORMED);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n            addr->sin_port   = *(uint16_t *)(server->buf->array + offset);\n            info.ai_family   = AF_INET;\n            info.ai_socktype = SOCK_STREAM;\n            info.ai_protocol = IPPROTO_TCP;\n            info.ai_addrlen  = sizeof(struct sockaddr_in);\n            info.ai_addr     = (struct sockaddr *)addr;\n        } else if ((atyp & ADDRTYPE_MASK) == 3) {\n            // Domain name\n            uint8_t name_len = *(uint8_t *)(server->buf->array + offset);\n            if (name_len + 4 <= server->buf->len) {\n                memcpy(host, server->buf->array + offset + 1, name_len);\n                offset += name_len + 1;\n            } else {\n                LOGE(\"invalid name length: %d\", name_len);\n                report_addr(server->fd, MALFORMED);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n            if (acl && outbound_block_match_host(host) == 1) {\n                if (verbose)\n                    LOGI(\"outbound blocked %s\", host);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n            struct cork_ip ip;\n            if (cork_ip_init(&ip, host) != -1) {\n                info.ai_socktype = SOCK_STREAM;\n                info.ai_protocol = IPPROTO_TCP;\n                if (ip.version == 4) {\n                    struct sockaddr_in *addr = (struct sockaddr_in *)&storage;\n                    dns_pton(AF_INET, host, &(addr->sin_addr));\n                    addr->sin_port   = *(uint16_t *)(server->buf->array + offset);\n                    addr->sin_family = AF_INET;\n                    info.ai_family   = AF_INET;\n                    info.ai_addrlen  = sizeof(struct sockaddr_in);\n                    info.ai_addr     = (struct sockaddr *)addr;\n                } else if (ip.version == 6) {\n                    struct sockaddr_in6 *addr = (struct sockaddr_in6 *)&storage;\n                    dns_pton(AF_INET6, host, &(addr->sin6_addr));\n                    addr->sin6_port   = *(uint16_t *)(server->buf->array + offset);\n                    addr->sin6_family = AF_INET6;\n                    info.ai_family    = AF_INET6;\n                    info.ai_addrlen   = sizeof(struct sockaddr_in6);\n                    info.ai_addr      = (struct sockaddr *)addr;\n                }\n            } else {\n                if (!validate_hostname(host, name_len)) {\n                    LOGE(\"invalid host name\");\n                    report_addr(server->fd, MALFORMED);\n                    close_and_free_server(EV_A_ server);\n                    return;\n                }\n                need_query = 1;\n            }\n        } else if ((atyp & ADDRTYPE_MASK) == 4) {\n            // IP V6\n            struct sockaddr_in6 *addr = (struct sockaddr_in6 *)&storage;\n            size_t in6_addr_len       = sizeof(struct in6_addr);\n            addr->sin6_family = AF_INET6;\n            if (server->buf->len >= in6_addr_len + 3) {\n                addr->sin6_addr = *(struct in6_addr *)(server->buf->array + offset);\n                dns_ntop(AF_INET6, (const void *)(server->buf->array + offset),\n                         host, INET6_ADDRSTRLEN);\n                offset += in6_addr_len;\n            } else {\n                LOGE(\"invalid header with addr type %d\", atyp);\n                report_addr(server->fd, MALFORMED);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n            addr->sin6_port  = *(uint16_t *)(server->buf->array + offset);\n            info.ai_family   = AF_INET6;\n            info.ai_socktype = SOCK_STREAM;\n            info.ai_protocol = IPPROTO_TCP;\n            info.ai_addrlen  = sizeof(struct sockaddr_in6);\n            info.ai_addr     = (struct sockaddr *)addr;\n        }\n\n        if (offset == 1) {\n            LOGE(\"invalid header with addr type %d\", atyp);\n            report_addr(server->fd, MALFORMED);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n\n        port = (*(uint16_t *)(server->buf->array + offset));\n\n        offset += 2;\n\n        if (server->buf->len < offset) {\n            report_addr(server->fd, MALFORMED);\n            close_and_free_server(EV_A_ server);\n            return;\n        } else {\n            server->buf->len -= offset;\n            memmove(server->buf->array, server->buf->array + offset, server->buf->len);\n        }\n\n        if (verbose) {\n            if ((atyp & ADDRTYPE_MASK) == 4)\n                LOGI(\"connect to [%s]:%d\", host, ntohs(port));\n            else\n                LOGI(\"connect to %s:%d\", host, ntohs(port));\n        }\n\n        if (!need_query) {\n            remote_t *remote = connect_to_remote(EV_A_ &info, server);\n\n            if (remote == NULL) {\n                LOGE(\"connect error\");\n                close_and_free_server(EV_A_ server);\n                return;\n            } else {\n                server->remote = remote;\n                remote->server = server;\n\n                // XXX: should handle buffer carefully\n                if (server->buf->len > 0) {\n                    memcpy(remote->buf->array, server->buf->array, server->buf->len);\n                    remote->buf->len = server->buf->len;\n                    remote->buf->idx = 0;\n                    server->buf->len = 0;\n                    server->buf->idx = 0;\n                }\n\n                // waiting on remote connected event\n                ev_io_stop(EV_A_ & server_recv_ctx->io);\n                ev_io_start(EV_A_ & remote->send_ctx->io);\n            }\n        } else {\n            query_t *query = ss_malloc(sizeof(query_t));\n            memset(query, 0, sizeof(query_t));\n            query->server = server;\n            snprintf(query->hostname, 256, \"%s\", host);\n\n            server->stage = STAGE_RESOLVE;\n            server->query = resolv_query(host, server_resolve_cb,\n                                         query_free_cb, query, port);\n\n            ev_io_stop(EV_A_ & server_recv_ctx->io);\n        }\n\n        return;\n    }\n    // should not reach here\n    FATAL(\"server context error\");\n}\n\nstatic void\nserver_send_cb(EV_P_ ev_io *w, int revents)\n{\n    server_ctx_t *server_send_ctx = (server_ctx_t *)w;\n    server_t *server              = server_send_ctx->server;\n    remote_t *remote              = server->remote;\n\n    if (remote == NULL) {\n        LOGE(\"invalid server\");\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    if (server->buf->len == 0) {\n        // close and free\n        if (verbose) {\n            LOGI(\"server_send close the connection\");\n        }\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else {\n        // has data to send\n        ssize_t s = send(server->fd, server->buf->array + server->buf->idx,\n                         server->buf->len, 0);\n        if (s == -1) {\n            if (errno != EAGAIN && errno != EWOULDBLOCK) {\n                ERROR(\"server_send_send\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n            }\n            return;\n        } else if (s < server->buf->len) {\n            // partly sent, move memory, wait for the next time to send\n            server->buf->len -= s;\n            server->buf->idx += s;\n            return;\n        } else {\n            // all sent out, wait for reading\n            server->buf->len = 0;\n            server->buf->idx = 0;\n            ev_io_stop(EV_A_ & server_send_ctx->io);\n            if (remote != NULL) {\n                ev_io_start(EV_A_ & remote->recv_ctx->io);\n                return;\n            } else {\n                LOGE(\"invalid remote\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n        }\n    }\n}\n\nstatic void\nblock_list_clear_cb(EV_P_ ev_timer *watcher, int revents)\n{\n    clear_block_list();\n}\n\nstatic void\nserver_timeout_cb(EV_P_ ev_timer *watcher, int revents)\n{\n    server_ctx_t *server_ctx\n        = cork_container_of(watcher, server_ctx_t, watcher);\n    server_t *server = server_ctx->server;\n    remote_t *remote = server->remote;\n\n    if (verbose) {\n        LOGI(\"TCP connection timeout\");\n    }\n\n    if (server->stage < STAGE_PARSE) {\n        if (verbose) {\n            size_t len = server->stage ?\n                         server->header_buf->len : server->buf->len;\n#ifdef __MINGW32__\n            LOGI(\"incomplete header: %u\", len);\n#else\n            LOGI(\"incomplete header: %zu\", len);\n#endif\n        }\n        report_addr(server->fd, SUSPICIOUS);\n    }\n\n    close_and_free_remote(EV_A_ remote);\n    close_and_free_server(EV_A_ server);\n}\n\nstatic void\nquery_free_cb(void *data)\n{\n    if (data != NULL) {\n        ss_free(data);\n    }\n}\n\nstatic void\nserver_resolve_cb(struct sockaddr *addr, void *data)\n{\n    query_t *query       = (query_t *)data;\n    server_t *server     = query->server;\n    struct ev_loop *loop = server->listen_ctx->loop;\n\n    server->query = NULL;\n\n    if (addr == NULL) {\n        LOGE(\"unable to resolve %s\", query->hostname);\n        close_and_free_server(EV_A_ server);\n    } else {\n        if (verbose) {\n            LOGI(\"successfully resolved %s\", query->hostname);\n        }\n\n        struct addrinfo info;\n        memset(&info, 0, sizeof(struct addrinfo));\n        info.ai_socktype = SOCK_STREAM;\n        info.ai_protocol = IPPROTO_TCP;\n        info.ai_addr     = addr;\n\n        if (addr->sa_family == AF_INET) {\n            info.ai_family  = AF_INET;\n            info.ai_addrlen = sizeof(struct sockaddr_in);\n        } else if (addr->sa_family == AF_INET6) {\n            info.ai_family  = AF_INET6;\n            info.ai_addrlen = sizeof(struct sockaddr_in6);\n        }\n\n        remote_t *remote = connect_to_remote(EV_A_ &info, server);\n\n        if (remote == NULL) {\n            close_and_free_server(EV_A_ server);\n        } else {\n            server->remote = remote;\n            remote->server = server;\n\n            // XXX: should handle buffer carefully\n            if (server->buf->len > 0) {\n                memcpy(remote->buf->array, server->buf->array + server->buf->idx,\n                       server->buf->len);\n                remote->buf->len = server->buf->len;\n                remote->buf->idx = 0;\n                server->buf->len = 0;\n                server->buf->idx = 0;\n            }\n\n            // listen to remote connected event\n            ev_io_start(EV_A_ & remote->send_ctx->io);\n        }\n    }\n}\n\nstatic void\nremote_recv_cb(EV_P_ ev_io *w, int revents)\n{\n    remote_ctx_t *remote_recv_ctx = (remote_ctx_t *)w;\n    remote_t *remote              = remote_recv_ctx->remote;\n    server_t *server              = remote->server;\n\n    if (server == NULL) {\n        LOGE(\"invalid server\");\n        close_and_free_remote(EV_A_ remote);\n        return;\n    }\n\n    ev_timer_again(EV_A_ & server->recv_ctx->watcher);\n\n    ssize_t r = recv(remote->fd, server->buf->array, BUF_SIZE, 0);\n\n    if (r == 0) {\n        // connection closed\n        if (verbose) {\n            LOGI(\"remote_recv close the connection\");\n        }\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else if (r == -1) {\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n            // no data\n            // continue to wait for recv\n            return;\n        } else {\n            ERROR(\"remote recv\");\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    }\n\n    rx += r;\n\n    server->buf->len = r;\n    int err = ss_encrypt(&cipher_env, server->buf, server->e_ctx, BUF_SIZE);\n\n    if (err) {\n        LOGE(\"invalid password or cipher\");\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    int s = send(server->fd, server->buf->array, server->buf->len, 0);\n\n    if (s == -1) {\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n            // no data, wait for send\n            server->buf->idx = 0;\n            ev_io_stop(EV_A_ & remote_recv_ctx->io);\n            ev_io_start(EV_A_ & server->send_ctx->io);\n        } else {\n            ERROR(\"remote_recv_send\");\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n        }\n    } else if (s < server->buf->len) {\n        server->buf->len -= s;\n        server->buf->idx  = s;\n        ev_io_stop(EV_A_ & remote_recv_ctx->io);\n        ev_io_start(EV_A_ & server->send_ctx->io);\n    }\n\n    // Disable TCP_NODELAY after the first response are sent\n    int opt = 0;\n    setsockopt(server->fd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\n    setsockopt(remote->fd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\n}\n\nstatic void\nremote_send_cb(EV_P_ ev_io *w, int revents)\n{\n    remote_ctx_t *remote_send_ctx = (remote_ctx_t *)w;\n    remote_t *remote              = remote_send_ctx->remote;\n    server_t *server              = remote->server;\n\n    if (server == NULL) {\n        LOGE(\"invalid server\");\n        close_and_free_remote(EV_A_ remote);\n        return;\n    }\n\n    if (!remote_send_ctx->connected) {\n        struct sockaddr_storage addr;\n        socklen_t len = sizeof(struct sockaddr_storage);\n        memset(&addr, 0, len);\n        int r = getpeername(remote->fd, (struct sockaddr *)&addr, &len);\n        if (r == 0) {\n            if (verbose) {\n                LOGI(\"remote connected\");\n            }\n            remote_send_ctx->connected = 1;\n\n            // Clear the state of this address in the block list\n            reset_addr(server->fd);\n\n            if (remote->buf->len == 0) {\n                server->stage = STAGE_STREAM;\n                ev_io_stop(EV_A_ & remote_send_ctx->io);\n                ev_io_start(EV_A_ & server->recv_ctx->io);\n                ev_io_start(EV_A_ & remote->recv_ctx->io);\n                return;\n            }\n        } else {\n            ERROR(\"getpeername\");\n            // not connected\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    }\n\n    if (remote->buf->len == 0) {\n        // close and free\n        if (verbose) {\n            LOGI(\"remote_send close the connection\");\n        }\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else {\n        // has data to send\n        ssize_t s = send(remote->fd, remote->buf->array + remote->buf->idx,\n                         remote->buf->len, 0);\n        if (s == -1) {\n            if (errno != EAGAIN && errno != EWOULDBLOCK) {\n                ERROR(\"remote_send_send\");\n                // close and free\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n            }\n            return;\n        } else if (s < remote->buf->len) {\n            // partly sent, move memory, wait for the next time to send\n            remote->buf->len -= s;\n            remote->buf->idx += s;\n            return;\n        } else {\n            // all sent out, wait for reading\n            remote->buf->len = 0;\n            remote->buf->idx = 0;\n            ev_io_stop(EV_A_ & remote_send_ctx->io);\n            if (server != NULL) {\n                ev_io_start(EV_A_ & server->recv_ctx->io);\n                if (server->stage != STAGE_STREAM) {\n                    server->stage = STAGE_STREAM;\n                    ev_io_start(EV_A_ & remote->recv_ctx->io);\n                }\n            } else {\n                LOGE(\"invalid server\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n            }\n            return;\n        }\n    }\n}\n\nstatic remote_t *\nnew_remote(int fd)\n{\n    if (verbose) {\n        remote_conn++;\n    }\n\n    remote_t *remote = ss_malloc(sizeof(remote_t));\n    memset(remote, 0, sizeof(remote_t));\n\n    remote->recv_ctx            = ss_malloc(sizeof(remote_ctx_t));\n    remote->send_ctx            = ss_malloc(sizeof(remote_ctx_t));\n    remote->buf                 = ss_malloc(sizeof(buffer_t));\n    balloc(remote->buf, BUF_SIZE);\n    memset(remote->recv_ctx, 0, sizeof(remote_ctx_t));\n    memset(remote->send_ctx, 0, sizeof(remote_ctx_t));\n    remote->fd                  = fd;\n    remote->recv_ctx->remote    = remote;\n    remote->recv_ctx->connected = 0;\n    remote->send_ctx->remote    = remote;\n    remote->send_ctx->connected = 0;\n    remote->server              = NULL;\n\n    ev_io_init(&remote->recv_ctx->io, remote_recv_cb, fd, EV_READ);\n    ev_io_init(&remote->send_ctx->io, remote_send_cb, fd, EV_WRITE);\n\n    return remote;\n}\n\nstatic void\nfree_remote(remote_t *remote)\n{\n    if (remote->server != NULL) {\n        remote->server->remote = NULL;\n    }\n    if (remote->buf != NULL) {\n        bfree(remote->buf);\n        ss_free(remote->buf);\n    }\n    ss_free(remote->recv_ctx);\n    ss_free(remote->send_ctx);\n    ss_free(remote);\n}\n\nstatic void\nclose_and_free_remote(EV_P_ remote_t *remote)\n{\n    if (remote != NULL) {\n        ev_io_stop(EV_A_ & remote->send_ctx->io);\n        ev_io_stop(EV_A_ & remote->recv_ctx->io);\n        close(remote->fd);\n        free_remote(remote);\n        if (verbose) {\n            remote_conn--;\n            LOGI(\"current remote connection: %d\", remote_conn);\n        }\n    }\n}\n\nstatic server_t *\nnew_server(int fd, listen_ctx_t *listener)\n{\n    if (verbose) {\n        server_conn++;\n    }\n\n    server_t *server;\n    server = ss_malloc(sizeof(server_t));\n\n    memset(server, 0, sizeof(server_t));\n\n    server->recv_ctx            = ss_malloc(sizeof(server_ctx_t));\n    server->send_ctx            = ss_malloc(sizeof(server_ctx_t));\n    server->buf                 = ss_malloc(sizeof(buffer_t));\n    server->header_buf          = ss_malloc(sizeof(buffer_t));\n    memset(server->recv_ctx, 0, sizeof(server_ctx_t));\n    memset(server->send_ctx, 0, sizeof(server_ctx_t));\n    balloc(server->buf, BUF_SIZE);\n    balloc(server->header_buf, BUF_SIZE);\n    server->fd                  = fd;\n    server->recv_ctx->server    = server;\n    server->recv_ctx->connected = 0;\n    server->send_ctx->server    = server;\n    server->send_ctx->connected = 0;\n    server->stage               = STAGE_INIT;\n    server->query               = NULL;\n    server->listen_ctx          = listener;\n    server->remote              = NULL;\n\n    if (listener->method) {\n        server->e_ctx = ss_malloc(sizeof(enc_ctx_t));\n        server->d_ctx = ss_malloc(sizeof(enc_ctx_t));\n        enc_ctx_init(&cipher_env, server->e_ctx, 1);\n        enc_ctx_init(&cipher_env, server->d_ctx, 0);\n    } else {\n        server->e_ctx = NULL;\n        server->d_ctx = NULL;\n    }\n\n    int request_timeout = min(MAX_REQUEST_TIMEOUT, listener->timeout)\n                          + rand() % MAX_REQUEST_TIMEOUT;\n\n    ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ);\n    ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE);\n    ev_timer_init(&server->recv_ctx->watcher, server_timeout_cb,\n                  request_timeout, listener->timeout);\n\n    server->chunk = ss_malloc(sizeof(chunk_t));\n    memset(server->chunk, 0, sizeof(chunk_t));\n    server->chunk->buf = ss_malloc(sizeof(buffer_t));\n    memset(server->chunk->buf, 0, sizeof(buffer_t));\n\n    cork_dllist_add(&connections, &server->entries);\n\n    return server;\n}\n\nstatic void\nfree_server(server_t *server)\n{\n    cork_dllist_remove(&server->entries);\n\n    if (server->chunk != NULL) {\n        if (server->chunk->buf != NULL) {\n            bfree(server->chunk->buf);\n            ss_free(server->chunk->buf);\n        }\n        ss_free(server->chunk);\n    }\n    if (server->remote != NULL) {\n        server->remote->server = NULL;\n    }\n    if (server->e_ctx != NULL) {\n        enc_ctx_release(&cipher_env, server->e_ctx);\n        ss_free(server->e_ctx);\n    }\n    if (server->d_ctx != NULL) {\n        enc_ctx_release(&cipher_env, server->d_ctx);\n        ss_free(server->d_ctx);\n    }\n    if (server->buf != NULL) {\n        bfree(server->buf);\n        ss_free(server->buf);\n    }\n    if (server->header_buf != NULL) {\n        bfree(server->header_buf);\n        ss_free(server->header_buf);\n    }\n\n    ss_free(server->recv_ctx);\n    ss_free(server->send_ctx);\n    ss_free(server);\n}\n\nstatic void\nclose_and_free_server(EV_P_ server_t *server)\n{\n    if (server != NULL) {\n        if (server->query != NULL) {\n            resolv_cancel(server->query);\n            server->query = NULL;\n        }\n        ev_io_stop(EV_A_ & server->send_ctx->io);\n        ev_io_stop(EV_A_ & server->recv_ctx->io);\n        ev_timer_stop(EV_A_ & server->recv_ctx->watcher);\n        close(server->fd);\n        free_server(server);\n        if (verbose) {\n            server_conn--;\n            LOGI(\"current server connection: %d\", server_conn);\n        }\n    }\n}\n\nstatic void\nsignal_cb(EV_P_ ev_signal *w, int revents)\n{\n    if (revents & EV_SIGNAL) {\n        switch (w->signum) {\n        case SIGINT:\n        case SIGTERM:\n            ev_unloop(EV_A_ EVUNLOOP_ALL);\n        }\n    }\n}\n\nstatic void\naccept_cb(EV_P_ ev_io *w, int revents)\n{\n    listen_ctx_t *listener = (listen_ctx_t *)w;\n    int serverfd           = accept(listener->fd, NULL, NULL);\n    if (serverfd == -1) {\n        ERROR(\"accept\");\n        return;\n    }\n\n    char *peer_name = get_peer_name(serverfd);\n    if (peer_name != NULL) {\n        int in_white_list = 0;\n        if (acl) {\n            if ((get_acl_mode() == BLACK_LIST && acl_match_host(peer_name) == 1)\n                || (get_acl_mode() == WHITE_LIST && acl_match_host(peer_name) >= 0)) {\n                LOGE(\"Access denied from %s\", peer_name);\n                close(serverfd);\n                return;\n            } else if (acl_match_host(peer_name) == -1) {\n                in_white_list = 1;\n            }\n        }\n        if (!in_white_list && check_block_list(peer_name)) {\n            LOGE(\"block all requests from %s\", peer_name);\n#ifdef __linux__\n            set_linger(serverfd);\n#endif\n            close(serverfd);\n            return;\n        }\n    }\n\n    int opt = 1;\n    setsockopt(serverfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\n#ifdef SO_NOSIGPIPE\n    setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n#endif\n    setnonblocking(serverfd);\n\n    if (verbose) {\n        LOGI(\"accept a connection\");\n    }\n\n    server_t *server = new_server(serverfd, listener);\n    ev_io_start(EV_A_ & server->recv_ctx->io);\n    ev_timer_start(EV_A_ & server->recv_ctx->watcher);\n}\n\nint\nmain(int argc, char **argv)\n{\n    int i, c;\n    int pid_flags   = 0;\n    int mptcp       = 0;\n    int firewall    = 0;\n    int mtu         = 0;\n    char *user      = NULL;\n    char *password  = NULL;\n    char *timeout   = NULL;\n    char *method    = NULL;\n    char *pid_path  = NULL;\n    char *conf_path = NULL;\n    char *iface     = NULL;\n\n    int server_num = 0;\n    const char *server_host[MAX_REMOTE_NUM];\n\n    char *nameservers[MAX_DNS_NUM + 1];\n    int nameserver_num = 0;\n\n    int option_index                    = 0;\n    static struct option long_options[] = {\n        { \"fast-open\",       no_argument,       0, 0 },\n        { \"acl\",             required_argument, 0, 0 },\n        { \"manager-address\", required_argument, 0, 0 },\n        { \"mtu\",             required_argument, 0, 0 },\n        { \"help\",            no_argument,       0, 0 },\n#ifdef __linux__\n        { \"mptcp\",           no_argument,       0, 0 },\n        { \"firewall\",        no_argument,       0, 0 },\n#endif\n        {                 0,                 0, 0, 0 }\n    };\n\n    opterr = 0;\n\n    USE_TTY();\n\n    while ((c = getopt_long(argc, argv, \"f:s:p:l:k:t:m:b:c:i:d:a:n:huUvA6\",\n                            long_options, &option_index)) != -1) {\n        switch (c) {\n        case 0:\n            if (option_index == 0) {\n                fast_open = 1;\n            } else if (option_index == 1) {\n                LOGI(\"initializing acl...\");\n                acl = !init_acl(optarg);\n            } else if (option_index == 2) {\n                manager_address = optarg;\n            } else if (option_index == 3) {\n                mtu = atoi(optarg);\n                LOGI(\"set MTU to %d\", mtu);\n            } else if (option_index == 4) {\n                usage();\n                exit(EXIT_SUCCESS);\n            } else if (option_index == 5) {\n                mptcp = 1;\n                LOGI(\"enable multipath TCP\");\n            } else if (option_index == 6) {\n                firewall = 1;\n                LOGI(\"enable firewall rules\");\n            }\n            break;\n        case 's':\n            if (server_num < MAX_REMOTE_NUM) {\n                server_host[server_num++] = optarg;\n            }\n            break;\n        case 'b':\n            bind_address = optarg;\n            break;\n        case 'p':\n            server_port = optarg;\n            break;\n        case 'k':\n            password = optarg;\n            break;\n        case 'f':\n            pid_flags = 1;\n            pid_path  = optarg;\n            break;\n        case 't':\n            timeout = optarg;\n            break;\n        case 'm':\n            method = optarg;\n            break;\n        case 'c':\n            conf_path = optarg;\n            break;\n        case 'i':\n            iface = optarg;\n            break;\n        case 'd':\n            if (nameserver_num < MAX_DNS_NUM) {\n                nameservers[nameserver_num++] = optarg;\n            }\n            break;\n        case 'a':\n            user = optarg;\n            break;\n#ifdef HAVE_SETRLIMIT\n        case 'n':\n            nofile = atoi(optarg);\n            break;\n#endif\n        case 'u':\n            mode = TCP_AND_UDP;\n            break;\n        case 'U':\n            mode = UDP_ONLY;\n            break;\n        case 'v':\n            verbose = 1;\n            break;\n        case 'h':\n            usage();\n            exit(EXIT_SUCCESS);\n        case 'A':\n            LOGI(\"The 'A' argument is deprecate! Ignored.\");\n            break;\n        case '6':\n            ipv6first = 1;\n            break;\n        case '?':\n            // The option character is not recognized.\n            LOGE(\"Unrecognized option: %s\", optarg);\n            opterr = 1;\n            break;\n        }\n    }\n\n    if (opterr) {\n        usage();\n        exit(EXIT_FAILURE);\n    }\n\n    if (argc == 1) {\n        if (conf_path == NULL) {\n            conf_path = DEFAULT_CONF_PATH;\n        }\n    }\n\n    if (conf_path != NULL) {\n        jconf_t *conf = read_jconf(conf_path);\n        if (server_num == 0) {\n            server_num = conf->remote_num;\n            for (i = 0; i < server_num; i++)\n                server_host[i] = conf->remote_addr[i].host;\n        }\n        if (server_port == NULL) {\n            server_port = conf->remote_port;\n        }\n        if (password == NULL) {\n            password = conf->password;\n        }\n        if (method == NULL) {\n            method = conf->method;\n        }\n        if (timeout == NULL) {\n            timeout = conf->timeout;\n        }\n        if (user == NULL) {\n            user = conf->user;\n        }\n        if (mode == TCP_ONLY) {\n            mode = conf->mode;\n        }\n        if (mtu == 0) {\n            mtu = conf->mtu;\n        }\n        if (mptcp == 0) {\n            mptcp = conf->mptcp;\n        }\n#ifdef TCP_FASTOPEN\n        if (fast_open == 0) {\n            fast_open = conf->fast_open;\n        }\n#endif\n#ifdef HAVE_SETRLIMIT\n        if (nofile == 0) {\n            nofile = conf->nofile;\n        }\n#endif\n        if (conf->nameserver != NULL) {\n            nameservers[nameserver_num++] = conf->nameserver;\n        }\n        if (ipv6first == 0) {\n            ipv6first = conf->ipv6_first;\n        }\n    }\n\n    if (server_num == 0) {\n        server_host[server_num++] = NULL;\n    }\n\n    if (server_num == 0 || server_port == NULL || password == NULL) {\n        usage();\n        exit(EXIT_FAILURE);\n    }\n\n    if (method == NULL) {\n        method = \"rc4-md5\";\n    }\n\n    if (timeout == NULL) {\n        timeout = \"60\";\n    }\n\n#ifdef HAVE_SETRLIMIT\n    /*\n     * no need to check the return value here since we will show\n     * the user an error message if setrlimit(2) fails\n     */\n    if (nofile > 1024) {\n        if (verbose) {\n            LOGI(\"setting NOFILE to %d\", nofile);\n        }\n        set_nofile(nofile);\n    }\n#endif\n\n    if (pid_flags) {\n        USE_SYSLOG(argv[0]);\n        daemonize(pid_path);\n    }\n\n    if (ipv6first) {\n        LOGI(\"resolving hostname to IPv6 address first\");\n    }\n\n    if (fast_open == 1) {\n#ifdef TCP_FASTOPEN\n        LOGI(\"using tcp fast open\");\n#else\n        LOGE(\"tcp fast open is not supported by this environment\");\n        fast_open = 0;\n#endif\n    }\n\n    if (mode != TCP_ONLY) {\n        LOGI(\"UDP relay enabled\");\n    }\n\n    if (mode == UDP_ONLY) {\n        LOGI(\"TCP relay disabled\");\n    }\n\n#ifdef __MINGW32__\n    winsock_init();\n#else\n    // ignore SIGPIPE\n    signal(SIGPIPE, SIG_IGN);\n    signal(SIGCHLD, SIG_IGN);\n    signal(SIGABRT, SIG_IGN);\n#endif\n\n    struct ev_signal sigint_watcher;\n    struct ev_signal sigterm_watcher;\n    ev_signal_init(&sigint_watcher, signal_cb, SIGINT);\n    ev_signal_init(&sigterm_watcher, signal_cb, SIGTERM);\n    ev_signal_start(EV_DEFAULT, &sigint_watcher);\n    ev_signal_start(EV_DEFAULT, &sigterm_watcher);\n\n    // setup keys\n    LOGI(\"initializing ciphers... %s\", method);\n    int m = enc_init(&cipher_env, password, method);\n\n    // initialize ev loop\n    struct ev_loop *loop = EV_DEFAULT;\n\n    // setup udns\n    if (nameserver_num == 0) {\n#ifdef __MINGW32__\n        nameservers[nameserver_num++] = \"8.8.8.8\";\n        resolv_init(loop, nameservers, nameserver_num, ipv6first);\n#else\n        resolv_init(loop, NULL, 0, ipv6first);\n#endif\n    } else {\n        resolv_init(loop, nameservers, nameserver_num, ipv6first);\n    }\n\n    for (int i = 0; i < nameserver_num; i++)\n        LOGI(\"using nameserver: %s\", nameservers[i]);\n\n    // initialize listen context\n    listen_ctx_t listen_ctx_list[server_num];\n\n    // bind to each interface\n    while (server_num > 0) {\n        int index        = --server_num;\n        const char *host = server_host[index];\n\n        if (mode != UDP_ONLY) {\n            // Bind to port\n            int listenfd;\n            listenfd = create_and_bind(host, server_port, mptcp);\n            if (listenfd == -1) {\n                FATAL(\"bind() error\");\n            }\n            if (listen(listenfd, SSMAXCONN) == -1) {\n                FATAL(\"listen() error\");\n            }\n            setfastopen(listenfd);\n            setnonblocking(listenfd);\n            listen_ctx_t *listen_ctx = &listen_ctx_list[index];\n\n            // Setup proxy context\n            listen_ctx->timeout = atoi(timeout);\n            listen_ctx->fd      = listenfd;\n            listen_ctx->method  = m;\n            listen_ctx->iface   = iface;\n            listen_ctx->loop    = loop;\n\n            ev_io_init(&listen_ctx->io, accept_cb, listenfd, EV_READ);\n            ev_io_start(loop, &listen_ctx->io);\n        }\n\n        // Setup UDP\n        if (mode != TCP_ONLY) {\n            init_udprelay(server_host[index], server_port, mtu,\n                          atoi(timeout), iface, NULL, NULL);\n        }\n\n        if (host && strcmp(host, \":\") > 0)\n            LOGI(\"listening at [%s]:%s\", host, server_port);\n        else\n            LOGI(\"listening at %s:%s\", host ? host : \"*\", server_port);\n    }\n\n    if (manager_address != NULL) {\n        ev_timer_init(&stat_update_watcher, stat_update_cb, UPDATE_INTERVAL, UPDATE_INTERVAL);\n        ev_timer_start(EV_DEFAULT, &stat_update_watcher);\n    }\n\n    ev_timer_init(&block_list_watcher, block_list_clear_cb, UPDATE_INTERVAL, UPDATE_INTERVAL);\n    ev_timer_start(EV_DEFAULT, &block_list_watcher);\n\n    // setuid\n    if (user != NULL && ! run_as(user)) {\n        FATAL(\"failed to switch user\");\n    }\n\n#ifndef __MINGW32__\n    if (geteuid() == 0){\n        LOGI(\"running from root user\");\n    } else if (firewall) {\n        LOGE(\"firewall setup requires running from root user\");\n        exit(-1);\n    }\n#endif\n\n    // init block list\n    init_block_list(firewall);\n\n    // Init connections\n    cork_dllist_init(&connections);\n\n    // start ev loop\n    ev_run(loop, 0);\n\n    if (verbose) {\n        LOGI(\"closed gracefully\");\n    }\n\n    // Free block list\n    free_block_list();\n\n    if (manager_address != NULL) {\n        ev_timer_stop(EV_DEFAULT, &stat_update_watcher);\n    }\n    ev_timer_stop(EV_DEFAULT, &block_list_watcher);\n\n    // Clean up\n    for (int i = 0; i <= server_num; i++) {\n        listen_ctx_t *listen_ctx = &listen_ctx_list[i];\n        if (mode != UDP_ONLY) {\n            ev_io_stop(loop, &listen_ctx->io);\n            close(listen_ctx->fd);\n        }\n    }\n\n    if (mode != UDP_ONLY) {\n        free_connections(loop);\n    }\n\n    if (mode != TCP_ONLY) {\n        free_udprelay();\n    }\n\n    resolv_shutdown(loop);\n\n#ifdef __MINGW32__\n    winsock_cleanup();\n#endif\n\n    ev_signal_stop(EV_DEFAULT, &sigint_watcher);\n    ev_signal_stop(EV_DEFAULT, &sigterm_watcher);\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/server.h",
    "content": "/*\n * server.h - Define shadowsocks server's buffers and callbacks\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _SERVER_H\n#define _SERVER_H\n\n#include <ev.h>\n#include <time.h>\n#include <libcork/ds.h>\n\n#include \"encrypt.h\"\n#include \"jconf.h\"\n#include \"resolv.h\"\n\n#include \"common.h\"\n\ntypedef struct listen_ctx {\n    ev_io io;\n    int fd;\n    int timeout;\n    int method;\n    char *iface;\n    struct ev_loop *loop;\n} listen_ctx_t;\n\ntypedef struct server_ctx {\n    ev_io io;\n    ev_timer watcher;\n    int connected;\n    struct server *server;\n} server_ctx_t;\n\ntypedef struct server {\n    int fd;\n    int stage;\n    buffer_t *buf;\n    ssize_t buf_capacity;\n    buffer_t *header_buf;\n\n    struct chunk *chunk;\n\n    struct enc_ctx *e_ctx;\n    struct enc_ctx *d_ctx;\n    struct server_ctx *recv_ctx;\n    struct server_ctx *send_ctx;\n    struct listen_ctx *listen_ctx;\n    struct remote *remote;\n\n    struct ResolvQuery *query;\n\n    struct cork_dllist_item entries;\n} server_t;\n\ntypedef struct query {\n    server_t *server;\n    char hostname[257];\n} query_t;\n\ntypedef struct remote_ctx {\n    ev_io io;\n    int connected;\n    struct remote *remote;\n} remote_ctx_t;\n\ntypedef struct remote {\n    int fd;\n    buffer_t *buf;\n    ssize_t buf_capacity;\n    struct remote_ctx *recv_ctx;\n    struct remote_ctx *send_ctx;\n    struct server *server;\n} remote_t;\n\n#endif // _SERVER_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/shadowsocks.h",
    "content": "/*\n * shadowsocks.h - Header files of library interfaces\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _SHADOWSOCKS_H\n#define _SHADOWSOCKS_H\n\ntypedef struct {\n    /*  Required  */\n    char *remote_host;    // hostname or ip of remote server\n    char *local_addr;     // local ip to bind\n    char *method;         // encryption method\n    char *password;       // password of remote server\n    int remote_port;      // port number of remote server\n    int local_port;       // port number of local server\n    int timeout;          // connection timeout\n\n    /*  Optional, set NULL if not valid   */\n    char *acl;            // file path to acl\n    char *log;            // file path to log\n    int fast_open;        // enable tcp fast open\n    int mode;             // enable udp relay\n    int mtu;              // MTU of interface\n    int mptcp;            // enable multipath TCP\n    int verbose;          // verbose mode\n} profile_t;\n\n/* An example profile\n *\n * const profile_t EXAMPLE_PROFILE = {\n *  .remote_host = \"example.com\",\n *  .local_addr = \"127.0.0.1\",\n *  .method = \"bf-cfb\",\n *  .password = \"barfoo!\",\n *  .remote_port = 8338,\n *  .local_port = 1080,\n *  .timeout = 600;\n *  .acl = NULL,\n *  .log = NULL,\n *  .fast_open = 0,\n *  .mode = 0,\n *  .verbose = 0\n * };\n */\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/*\n * Create and start a shadowsocks local server.\n *\n * Calling this function will block the current thread forever if the server\n * starts successfully.\n *\n * Make sure start the server in a separate process to avoid any potential\n * memory and socket leak.\n *\n * If failed, -1 is returned. Errors will output to the log file.\n */\nint start_ss_local_server(profile_t profile);\n\n#ifdef __cplusplus\n}\n#endif\n\n// To stop the service on posix system, just kill the daemon process\n// kill(pid, SIGKILL);\n// Otherwise, If you start the service in a thread, you may need to send a signal SIGUSER1 to the thread.\n// pthread_kill(pthread_t, SIGUSR1);\n\n#endif // _SHADOWSOCKS_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/socks5.h",
    "content": "/*\n * socks5.h - Define SOCKS5's header\n *\n * Copyright (C) 2013, clowwindy <clowwindy42@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _SOCKS5_H\n#define _SOCKS5_H\n\n#define SVERSION 0x05\n#define CONNECT 0x01\n#define IPV4 0x01\n#define DOMAIN 0x03\n#define IPV6 0x04\n#define CMD_NOT_SUPPORTED 0x07\n\n#pragma pack(push)\n#pragma pack(1)\n\nstruct method_select_request {\n    char ver;\n    char nmethods;\n    char methods[255];\n};\n\nstruct method_select_response {\n    char ver;\n    char method;\n};\n\nstruct socks5_request {\n    char ver;\n    char cmd;\n    char rsv;\n    char atyp;\n};\n\nstruct socks5_response {\n    char ver;\n    char rep;\n    char rsv;\n    char atyp;\n};\n\n#pragma pack(pop)\n\n#endif // _SOCKS5_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/ss-nat",
    "content": "#!/bin/bash\n#\n# Copyright (C) 2015 OpenWrt-dist\n# Copyright (C) 2015 Jian Chang <aa65535@live.com>\n#\n# This is free software, licensed under the GNU General Public License v3.\n# See /LICENSE for more information.\n#\n\nTAG=\"SS_SPEC\"          # iptables tag\nIPT=\"iptables -t nat\"  # alias of iptables\nFWI=$(uci get firewall.shadowsocks.path 2>/dev/null)  # firewall include file\n\nusage() {\n\tcat <<-EOF\n\n    Copyright (C) 2015 OpenWrt-dist\n    Copyright (C) 2015 Jian Chang <aa65535@live.com>\n\n    Usage: ss-nat [options]\n\n    Valid options are:\n\n        -s <server_ip>          ip address of shadowsocks remote server\n        -l <local_port>         port number of shadowsocks local server\n        -S <server_ip>          ip address of shadowsocks remote UDP server\n        -L <local_port>         port number of shadowsocks local UDP server\n        -i <ip_list_file>       a file content is bypassed ip list\n        -a <lan_ips>            lan ip of access control, need a prefix to\n        define access control mode\n        -b <wan_ips>            wan ip of will be bypassed\n        -w <wan_ips>            wan ip of will be forwarded\n        -e <extra_options>      extra options for iptables\n        -o                      apply the rules to the OUTPUT chain\n        -u                      enable udprelay mode, TPROXY is required\n        -U                      enable udprelay mode, using different IP\n        and ports for TCP and UDP\n        -f                      flush the rules\n        -h                      show this help message and exit\n\n    This is free software, licensed under the GNU General Public License v3.\n    See /LICENSE for more information.\n\nEOF\n\texit $1\n}\n\nloger() {\n\t# 1.alert 2.crit 3.err 4.warn 5.notice 6.info 7.debug\n\tlogger -st ss-rules[$$] -p$1 $2\n}\n\nflush_r() {\n\tiptables-save -c | grep -v \"$TAG\" | iptables-restore -c\n\tip rule del fwmark 0x01/0x01 table 100 2>/dev/null\n\tip route del local 0.0.0.0/0 dev lo table 100 2>/dev/null\n\tipset -X ss_spec_lan_ac 2>/dev/null\n\tipset -X ss_spec_wan_ac 2>/dev/null\n\t[ -n \"$FWI\" ] && echo '#!/bin/sh' >$FWI\n\treturn 0\n}\n\nipset_r() {\n\tipset -! -R <<-EOF || return 1\n\t\tcreate ss_spec_wan_ac hash:net\n\t\t$(gen_iplist | sed \"/^\\s*$/d\" | sed -e \"s/^/add ss_spec_wan_ac /\")\n\t\t$(for ip in $WAN_FW_IP; do echo \"add ss_spec_wan_ac $ip nomatch\"; done)\nEOF\n\t$IPT -N SS_SPEC_WAN_AC && \\\n\t$IPT -A SS_SPEC_WAN_AC -m set --match-set ss_spec_wan_ac dst -j RETURN && \\\n\t$IPT -A SS_SPEC_WAN_AC -j SS_SPEC_WAN_FW\n\treturn $?\n}\n\nfw_rule() {\n\t$IPT -N SS_SPEC_WAN_FW && \\\n\t$IPT -A SS_SPEC_WAN_FW -p tcp \\\n\t\t-j REDIRECT --to-ports $local_port 2>/dev/null || {\n\t\tloger 3 \"Can't redirect, please check the iptables.\"\n\t\texit 1\n\t}\n\treturn $?\n}\n\nac_rule() {\n\tif [ -n \"$LAN_AC_IP\" ]; then\n\t\tcase \"${LAN_AC_IP:0:1}\" in\n\t\t\tw|W)\n\t\t\t\tMATCH_SET=\"-m set --match-set ss_spec_lan_ac src\"\n\t\t\t\t;;\n\t\t\tb|B)\n\t\t\t\tMATCH_SET=\"-m set ! --match-set ss_spec_lan_ac src\"\n\t\t\t\t;;\n\t\t\t*)\n\t\t\t\tloger 3 \"Illegal argument \\`-a $LAN_AC_IP\\`.\"\n\t\t\t\treturn 2\n\t\t\t\t;;\n\t\tesac\n\tfi\n\tIFNAME=eth0\n\tipset -! -R <<-EOF || return 1\n\t\tcreate ss_spec_lan_ac hash:net\n\t\t$(for ip in ${LAN_AC_IP:1}; do echo \"add ss_spec_lan_ac $ip\"; done)\nEOF\n\t$IPT -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p tcp $EXT_ARGS $MATCH_SET \\\n\t\t-j SS_SPEC_WAN_AC\n\tif [ \"$OUTPUT\" = 1 ]; then\n\t\t$IPT -I OUTPUT 1 -p tcp $EXT_ARGS -j SS_SPEC_WAN_AC\n\tfi\n\treturn $?\n}\n\ntp_rule() {\n\tlsmod | grep -q TPROXY || return 0\n\t[ -n \"$TPROXY\" ] || return 0\n\tip rule add fwmark 0x01/0x01 table 100\n\tip route add local 0.0.0.0/0 dev lo table 100\n\tlocal ipt=\"iptables -t mangle\"\n\t$ipt -N SS_SPEC_TPROXY\n\t$ipt -A SS_SPEC_TPROXY -p udp -m set ! --match-set ss_spec_wan_ac dst \\\n\t\t-j TPROXY --on-port \"$LOCAL_PORT\" --tproxy-mark 0x01/0x01\n\t$ipt -I PREROUTING 1 ${IFNAME:+-i $IFNAME} -p udp $EXT_ARGS $MATCH_SET \\\n\t\t-j SS_SPEC_TPROXY\n\treturn $?\n}\n\nget_wan_ip() {\n\tcat <<-EOF | grep -E \"^([0-9]{1,3}\\.){3}[0-9]{1,3}\"\n\t\t$server\n\t\t$SERVER\n\t\t$WAN_BP_IP\nEOF\n}\n\ngen_iplist() {\n\tcat <<-EOF\n\t\t0.0.0.0/8\n\t\t10.0.0.0/8\n\t\t100.64.0.0/10\n\t\t127.0.0.0/8\n\t\t169.254.0.0/16\n\t\t172.16.0.0/12\n\t\t192.0.0.0/24\n\t\t192.0.2.0/24\n\t\t192.88.99.0/24\n\t\t192.168.0.0/16\n\t\t198.18.0.0/15\n\t\t198.51.100.0/24\n\t\t203.0.113.0/24\n\t\t224.0.0.0/4\n\t\t240.0.0.0/4\n\t\t255.255.255.255\n\t\t$(get_wan_ip)\n\t\t$(cat ${IGNORE_LIST:=/dev/null} 2>/dev/null)\nEOF\n}\n\ngen_include() {\n\t[ -n \"$FWI\" ] || return 0\n\tcat <<-EOF >>$FWI\n\tiptables-restore -n <<-EOT\n\t$(iptables-save | grep -E \"$TAG|^\\*|^COMMIT\" |\\\n\t\t\tsed -e \"s/^-A \\(OUTPUT\\|PREROUTING\\)/-I \\1 1/\")\n\tEOT\nEOF\n\treturn $?\n}\n\nwhile getopts \":s:l:S:L:i:e:a:b:w:ouUfh\" arg; do\n\tcase \"$arg\" in\n\t\ts)\n\t\t\tserver=$OPTARG\n\t\t\t;;\n\t\tl)\n\t\t\tlocal_port=$OPTARG\n\t\t\t;;\n\t\tS)\n\t\t\tSERVER=$OPTARG\n\t\t\t;;\n\t\tL)\n\t\t\tLOCAL_PORT=$OPTARG\n\t\t\t;;\n\t\ti)\n\t\t\tIGNORE_LIST=$OPTARG\n\t\t\t;;\n\t\te)\n\t\t\tEXT_ARGS=$OPTARG\n\t\t\t;;\n\t\ta)\n\t\t\tLAN_AC_IP=$OPTARG\n\t\t\t;;\n\t\tb)\n\t\t\tWAN_BP_IP=$(for ip in $OPTARG; do echo $ip; done)\n\t\t\t;;\n\t\tw)\n\t\t\tWAN_FW_IP=$OPTARG\n\t\t\t;;\n\t\to)\n\t\t\tOUTPUT=1\n\t\t\t;;\n\t\tu)\n\t\t\tTPROXY=1\n\t\t\t;;\n\t\tU)\n\t\t\tTPROXY=2\n\t\t\t;;\n\t\tf)\n\t\t\tflush_r\n\t\t\texit 0\n\t\t\t;;\n\t\th)\n\t\t\tusage 0\n\t\t\t;;\n\tesac\ndone\n\nif [ -z \"$server\" -o -z \"$local_port\" ]; then\n\tusage 2\nfi\n\nif [ \"$TPROXY\" = 1 ]; then\n\tSERVER=$server\n\tLOCAL_PORT=$local_port\nelif [ \"$TPROXY\" = 2 ]; then\n\t: ${SERVER:?\"You must assign an ip for the udp relay server.\"}\n\t: ${LOCAL_PORT:?\"You must assign a port for the udp relay server.\"}\nfi\n\nflush_r && fw_rule && ipset_r && ac_rule && tp_rule && gen_include\n[ \"$?\" = 0 ] || loger 3 \"Start failed!\"\nexit $?\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/ssrlink.py",
    "content": "#!/usr/bin/python\n# -*- coding: UTF-8 -*-\n\nimport traceback\nimport random\nimport getopt\nimport sys\nimport json\nimport base64\n\ndef to_bytes(s):\n\tif bytes != str:\n\t\tif type(s) == str:\n\t\t\treturn s.encode('utf-8')\n\treturn s\n\ndef to_str(s):\n\tif bytes != str:\n\t\tif type(s) == bytes:\n\t\t\treturn s.decode('utf-8')\n\treturn s\n\ndef b64decode(data):\n\tif b':' in data:\n\t\treturn data\n\tif len(data) % 4 == 2:\n\t\tdata += b'=='\n\telif len(data) % 4 == 3:\n\t\tdata += b'='\n\treturn base64.urlsafe_b64decode(data)\n\ndef fromlink(link):\n\tif link[:6] == 'ssr://':\n\t\tlink = to_bytes(link[6:])\n\t\tlink = to_str(b64decode(link))\n\t\tparams_dict = {}\n\t\tif '/' in link:\n\t\t\tdatas = link.split('/', 1)\n\t\t\tlink = datas[0]\n\t\t\tparam = datas[1]\n\t\t\tpos = param.find('?')\n\t\t\tif pos >= 0:\n\t\t\t\tparam = param[pos + 1:]\n\t\t\tparams = param.split('&')\n\t\t\tfor param in params:\n\t\t\t\tpart = param.split('=', 1)\n\t\t\t\tif len(part) == 2:\n\t\t\t\t\tif part[0] in ['obfsparam', 'protoparam']:\n\t\t\t\t\t\tparams_dict[part[0]] = to_str(b64decode(to_bytes(part[1])))\n\t\t\t\t\telse:\n\t\t\t\t\t\tparams_dict[part[0]] = part[1]\n\n\t\tdatas = link.split(':')\n\t\tif len(datas) == 6:\n\t\t\thost = datas[0]\n\t\t\tport = int(datas[1])\n\t\t\tprotocol = datas[2]\n\t\t\tmethod = datas[3]\n\t\t\tobfs = datas[4]\n\t\t\tpasswd = to_str(b64decode(to_bytes(datas[5])))\n\n\t\t\tresult = {}\n\t\t\tresult['server'] = host\n\t\t\tresult['server_port'] = port\n\t\t\tresult['local_address'] = '0.0.0.0'\n\t\t\tresult['local_port'] = 1080\n\t\t\tresult['password'] = passwd\n\t\t\tresult['protocol'] = protocol\n\t\t\tresult['method'] = method\n\t\t\tresult['obfs'] = obfs\n\t\t\tresult['timeout'] = 300\n\t\t\tif 'obfsparam' in params_dict:\n\t\t\t\tresult['obfs_param'] = params_dict['obfsparam']\n\t\t\tif 'protoparam' in params_dict:\n\t\t\t\tresult['protocol_param'] = params_dict['protoparam']\n\t\t\toutput = json.dumps(result, sort_keys=True, indent=4, separators=(',', ': '))\n\t\t\tprint(output)\n\ndef main():\n\tlink = sys.argv[1]\n\tfromlink(link)\n\nif __name__ == '__main__':\n\tmain()\n\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/tls.c",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/*\n * This is a minimal TLS implementation intended only to parse the server name\n * extension.  This was created based primarily on Wireshark dissection of a\n * TLS handshake and RFC4366.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <stdlib.h> /* malloc() */\n#include <string.h> /* strncpy() */\n\n#ifndef __MINGW32__\n#include <sys/socket.h>\n#else\n#include \"win32.h\"\n#endif\n\n#include \"tls.h\"\n#include \"protocol.h\"\n#include \"utils.h\"\n\n#define SERVER_NAME_LEN 256\n#define TLS_HEADER_LEN 5\n#define TLS_HANDSHAKE_CONTENT_TYPE 0x16\n#define TLS_HANDSHAKE_TYPE_CLIENT_HELLO 0x01\n\n#ifndef MIN\n#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))\n#endif\n\nextern int verbose;\n\nstatic int parse_tls_header(const char *, size_t, char **);\nstatic int parse_extensions(const char *, size_t, char **);\nstatic int parse_server_name_extension(const char *, size_t, char **);\n\nstatic const protocol_t tls_protocol_st = {\n    .default_port =               443,\n    .parse_packet = &parse_tls_header,\n};\nconst protocol_t *const tls_protocol = &tls_protocol_st;\n\n/* Parse a TLS packet for the Server Name Indication extension in the client\n * hello handshake, returning the first servername found (pointer to static\n * array)\n *\n * Returns:\n *  >=0  - length of the hostname and updates *hostname\n *         caller is responsible for freeing *hostname\n *  -1   - Incomplete request\n *  -2   - No Host header included in this request\n *  -3   - Invalid hostname pointer\n *  -4   - malloc failure\n *  < -4 - Invalid TLS client hello\n */\nstatic int\nparse_tls_header(const char *data, size_t data_len, char **hostname)\n{\n    char tls_content_type;\n    char tls_version_major;\n    char tls_version_minor;\n    size_t pos = TLS_HEADER_LEN;\n    size_t len;\n\n    if (hostname == NULL)\n        return -3;\n\n    /* Check that our TCP payload is at least large enough for a TLS header */\n    if (data_len < TLS_HEADER_LEN)\n        return -1;\n\n    /* SSL 2.0 compatible Client Hello\n     *\n     * High bit of first byte (length) and content type is Client Hello\n     *\n     * See RFC5246 Appendix E.2\n     */\n    if (data[0] & 0x80 && data[2] == 1) {\n        if (verbose)\n            LOGI(\"Received SSL 2.0 Client Hello which can not support SNI.\");\n        return -2;\n    }\n\n    tls_content_type = data[0];\n    if (tls_content_type != TLS_HANDSHAKE_CONTENT_TYPE) {\n        if (verbose)\n            LOGI(\"Request did not begin with TLS handshake.\");\n        return -5;\n    }\n\n    tls_version_major = data[1];\n    tls_version_minor = data[2];\n    if (tls_version_major < 3) {\n        if (verbose)\n            LOGI(\"Received SSL %d.%d handshake which can not support SNI.\",\n                 tls_version_major, tls_version_minor);\n\n        return -2;\n    }\n\n    /* TLS record length */\n    len = ((unsigned char)data[3] << 8) +\n          (unsigned char)data[4] + TLS_HEADER_LEN;\n    data_len = MIN(data_len, len);\n\n    /* Check we received entire TLS record length */\n    if (data_len < len)\n        return -1;\n\n    /*\n     * Handshake\n     */\n    if (pos + 1 > data_len) {\n        return -5;\n    }\n    if (data[pos] != TLS_HANDSHAKE_TYPE_CLIENT_HELLO) {\n        if (verbose)\n            LOGI(\"Not a client hello\");\n\n        return -5;\n    }\n\n    /* Skip past fixed length records:\n     * 1\tHandshake Type\n     * 3\tLength\n     * 2\tVersion (again)\n     * 32\tRandom\n     * to\tSession ID Length\n     */\n    pos += 38;\n\n    /* Session ID */\n    if (pos + 1 > data_len)\n        return -5;\n    len  = (unsigned char)data[pos];\n    pos += 1 + len;\n\n    /* Cipher Suites */\n    if (pos + 2 > data_len)\n        return -5;\n    len  = ((unsigned char)data[pos] << 8) + (unsigned char)data[pos + 1];\n    pos += 2 + len;\n\n    /* Compression Methods */\n    if (pos + 1 > data_len)\n        return -5;\n    len  = (unsigned char)data[pos];\n    pos += 1 + len;\n\n    if (pos == data_len && tls_version_major == 3 && tls_version_minor == 0) {\n        if (verbose)\n            LOGI(\"Received SSL 3.0 handshake without extensions\");\n        return -2;\n    }\n\n    /* Extensions */\n    if (pos + 2 > data_len)\n        return -5;\n    len  = ((unsigned char)data[pos] << 8) + (unsigned char)data[pos + 1];\n    pos += 2;\n\n    if (pos + len > data_len)\n        return -5;\n    return parse_extensions(data + pos, len, hostname);\n}\n\nstatic int\nparse_extensions(const char *data, size_t data_len, char **hostname)\n{\n    size_t pos = 0;\n    size_t len;\n\n    /* Parse each 4 bytes for the extension header */\n    while (pos + 4 <= data_len) {\n        /* Extension Length */\n        len = ((unsigned char)data[pos + 2] << 8) +\n              (unsigned char)data[pos + 3];\n\n        /* Check if it's a server name extension */\n        if (data[pos] == 0x00 && data[pos + 1] == 0x00) {\n            /* There can be only one extension of each type, so we break\n             * our state and move p to beinnging of the extension here */\n            if (pos + 4 + len > data_len)\n                return -5;\n            return parse_server_name_extension(data + pos + 4, len, hostname);\n        }\n        pos += 4 + len; /* Advance to the next extension header */\n    }\n    /* Check we ended where we expected to */\n    if (pos != data_len)\n        return -5;\n\n    return -2;\n}\n\nstatic int\nparse_server_name_extension(const char *data, size_t data_len,\n                            char **hostname)\n{\n    size_t pos = 2; /* skip server name list length */\n    size_t len;\n\n    while (pos + 3 < data_len) {\n        len = ((unsigned char)data[pos + 1] << 8) +\n              (unsigned char)data[pos + 2];\n\n        if (pos + 3 + len > data_len)\n            return -5;\n\n        switch (data[pos]) { /* name type */\n        case 0x00:     /* host_name */\n            *hostname = malloc(len + 1);\n            if (*hostname == NULL) {\n                ERROR(\"malloc() failure\");\n                return -4;\n            }\n\n            strncpy(*hostname, data + pos + 3, len);\n\n            (*hostname)[len] = '\\0';\n\n            return len;\n        default:\n            if (verbose)\n                LOGI(\"Unknown server name extension name type: %d\",\n                     data[pos]);\n        }\n        pos += 3 + len;\n    }\n    /* Check we ended where we expected to */\n    if (pos != data_len)\n        return -5;\n\n    return -2;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/tls.h",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef TLS_H\n#define TLS_H\n\n#include \"protocol.h\"\n\nconst protocol_t *const tls_protocol;\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/tunnel.c",
    "content": "/*\n * tunnel.c - Setup a local port forwarding through remote shadowsocks server\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <fcntl.h>\n#include <locale.h>\n#include <signal.h>\n#include <string.h>\n#include <strings.h>\n#include <unistd.h>\n#include <getopt.h>\n\n#ifndef __MINGW32__\n#include <errno.h>\n#include <arpa/inet.h>\n#include <netdb.h>\n#include <netinet/in.h>\n#include <pthread.h>\n#endif\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_NET_IF_H) && defined(__linux__)\n#include <net/if.h>\n#include <sys/ioctl.h>\n#define SET_INTERFACE\n#endif\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#endif\n\n#include <libcork/core.h>\n#include <udns.h>\n\n#include \"netutils.h\"\n#include \"utils.h\"\n#include \"tunnel.h\"\n\n#ifndef EAGAIN\n#define EAGAIN EWOULDBLOCK\n#endif\n\n#ifndef EWOULDBLOCK\n#define EWOULDBLOCK EAGAIN\n#endif\n\n#ifndef BUF_SIZE\n#define BUF_SIZE 2048\n#endif\n\n#include \"includeobfs.h\" // I don't want to modify makefile\n\nstatic void accept_cb(EV_P_ ev_io *w, int revents);\nstatic void server_recv_cb(EV_P_ ev_io *w, int revents);\nstatic void server_send_cb(EV_P_ ev_io *w, int revents);\nstatic void remote_recv_cb(EV_P_ ev_io *w, int revents);\nstatic void remote_send_cb(EV_P_ ev_io *w, int revents);\n\nstatic remote_t *new_remote(int fd, int timeout);\nstatic server_t *new_server(int fd, int method);\n\nstatic void free_remote(remote_t *remote);\nstatic void close_and_free_remote(EV_P_ remote_t *remote);\nstatic void free_server(server_t *server);\nstatic void close_and_free_server(EV_P_ server_t *server);\n\n#ifdef ANDROID\nint vpn = 0;\nchar *prefix;\n#endif\n\nint verbose        = 0;\nint keep_resolving = 1;\n\nstatic int ipv6first = 0;\nstatic int mode = TCP_ONLY;\n#ifdef HAVE_SETRLIMIT\nstatic int nofile = 0;\n#endif\n\n#ifndef __MINGW32__\nstatic int\nsetnonblocking(int fd)\n{\n    int flags;\n    if (-1 == (flags = fcntl(fd, F_GETFL, 0))) {\n        flags = 0;\n    }\n    return fcntl(fd, F_SETFL, flags | O_NONBLOCK);\n}\n\n#endif\n\nint\ncreate_and_bind(const char *addr, const char *port)\n{\n    struct addrinfo hints;\n    struct addrinfo *result, *rp;\n    int s, listen_sock;\n\n    memset(&hints, 0, sizeof(struct addrinfo));\n    hints.ai_family   = AF_UNSPEC;   /* Return IPv4 and IPv6 choices */\n    hints.ai_socktype = SOCK_STREAM; /* We want a TCP socket */\n\n    s = getaddrinfo(addr, port, &hints, &result);\n    if (s != 0) {\n        LOGI(\"getaddrinfo: %s\", gai_strerror(s));\n        return -1;\n    }\n\n    for (rp = result; rp != NULL; rp = rp->ai_next) {\n        listen_sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);\n        if (listen_sock == -1) {\n            continue;\n        }\n\n        int opt = 1;\n        setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));\n#ifdef SO_NOSIGPIPE\n        setsockopt(listen_sock, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n#endif\n        int err = set_reuseport(listen_sock);\n        if (err == 0) {\n            LOGI(\"tcp port reuse enabled\");\n        }\n\n        s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);\n        if (s == 0) {\n            /* We managed to bind successfully! */\n            break;\n        } else {\n            ERROR(\"bind\");\n        }\n\n        close(listen_sock);\n    }\n\n    if (rp == NULL) {\n        LOGE(\"Could not bind\");\n        return -1;\n    }\n\n    freeaddrinfo(result);\n\n    return listen_sock;\n}\n\nstatic void\nserver_recv_cb(EV_P_ ev_io *w, int revents)\n{\n    server_ctx_t *server_recv_ctx = (server_ctx_t *)w;\n    server_t *server              = server_recv_ctx->server;\n    remote_t *remote              = server->remote;\n\n    if (remote == NULL) {\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    ssize_t r = recv(server->fd, remote->buf->array, BUF_SIZE, 0);\n\n    if (r == 0) {\n        // connection closed\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else if (r == -1) {\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n            // no data\n            // continue to wait for recv\n            return;\n        } else {\n            ERROR(\"server recv\");\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    }\n\n    remote->buf->len = r;\n\n    // SSR beg\n    if (server->protocol_plugin) {\n        obfs_class *protocol_plugin = server->protocol_plugin;\n        if (protocol_plugin->client_pre_encrypt) {\n            remote->buf->len = protocol_plugin->client_pre_encrypt(server->protocol, &remote->buf->array, remote->buf->len, &remote->buf->capacity);\n        }\n    }\n    int err = ss_encrypt(&cipher_env, remote->buf, server->e_ctx, BUF_SIZE);\n\n    if (err) {\n        LOGE(\"server invalid password or cipher\");\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    if (server->obfs_plugin) {\n        obfs_class *obfs_plugin = server->obfs_plugin;\n        if (obfs_plugin->client_encode) {\n            remote->buf->len = obfs_plugin->client_encode(server->obfs, &remote->buf->array, remote->buf->len, &remote->buf->capacity);\n        }\n    }\n    // SSR end\n\n    if (r > 0 && remote->buf->len == 0) { // SSR pause recv\n         remote->buf->idx = 0;\n         ev_io_stop(EV_A_ & server_recv_ctx->io);\n         return;\n    }\n\n    int s = send(remote->fd, remote->buf->array, remote->buf->len, 0);\n\n    if (s == -1) {\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n            // no data, wait for send\n            remote->buf->idx = 0;\n            ev_io_stop(EV_A_ & server_recv_ctx->io);\n            ev_io_start(EV_A_ & remote->send_ctx->io);\n            return;\n        } else {\n            ERROR(\"send\");\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    } else if (s < remote->buf->len) {\n        remote->buf->len -= s;\n        remote->buf->idx  = s;\n        ev_io_stop(EV_A_ & server_recv_ctx->io);\n        ev_io_start(EV_A_ & remote->send_ctx->io);\n        return;\n    }\n}\n\nstatic void\nserver_send_cb(EV_P_ ev_io *w, int revents)\n{\n    server_ctx_t *server_send_ctx = (server_ctx_t *)w;\n    server_t *server              = server_send_ctx->server;\n    remote_t *remote              = server->remote;\n    if (server->buf->len == 0) {\n        // close and free\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else {\n        // has data to send\n        ssize_t s = send(server->fd, server->buf->array + server->buf->idx,\n                         server->buf->len, 0);\n        if (s == -1) {\n            if (errno != EAGAIN && errno != EWOULDBLOCK) {\n                ERROR(\"send\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n            }\n            return;\n        } else if (s < server->buf->len) {\n            // partly sent, move memory, wait for the next time to send\n            server->buf->len -= s;\n            server->buf->idx += s;\n            return;\n        } else {\n            // all sent out, wait for reading\n            server->buf->len = 0;\n            server->buf->idx = 0;\n            ev_io_stop(EV_A_ & server_send_ctx->io);\n            if (remote != NULL) {\n                ev_io_start(EV_A_ & remote->recv_ctx->io);\n            } else {\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n        }\n    }\n}\n\nstatic void\nremote_timeout_cb(EV_P_ ev_timer *watcher, int revents)\n{\n    remote_ctx_t *remote_ctx\n        = cork_container_of(watcher, remote_ctx_t, watcher);\n\n    remote_t *remote = remote_ctx->remote;\n    server_t *server = remote->server;\n\n    if (verbose) {\n        LOGI(\"TCP connection timeout\");\n    }\n\n    ev_timer_stop(EV_A_ watcher);\n\n    close_and_free_remote(EV_A_ remote);\n    close_and_free_server(EV_A_ server);\n}\n\nstatic void\nremote_recv_cb(EV_P_ ev_io *w, int revents)\n{\n    remote_ctx_t *remote_recv_ctx = (remote_ctx_t *)w;\n    remote_t *remote              = remote_recv_ctx->remote;\n    server_t *server              = remote->server;\n\n    ssize_t r = recv(remote->fd, server->buf->array, BUF_SIZE, 0);\n\n    if (r == 0) {\n        // connection closed\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else if (r == -1) {\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n            // no data\n            // continue to wait for recv\n            return;\n        } else {\n            ERROR(\"remote recv\");\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    }\n\n    server->buf->len = r;\n\n    // SSR beg\n    if (server->obfs_plugin) {\n        obfs_class *obfs_plugin = server->obfs_plugin;\n        if (obfs_plugin->client_decode) {\n            int needsendback;\n            server->buf->len = obfs_plugin->client_decode(server->obfs, &server->buf->array, server->buf->len, &server->buf->capacity, &needsendback);\n            if ((int)server->buf->len < 0) {\n                LOGE(\"client_decode\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n            if (needsendback) {\n                obfs_class *obfs_plugin = server->obfs_plugin;\n                if (obfs_plugin->client_encode) {\n                    remote->buf->len = obfs_plugin->client_encode(server->obfs, &remote->buf->array, 0, &remote->buf->capacity);\n                    ssize_t s = send(remote->fd, remote->buf->array, remote->buf->len, 0);\n                    if (s == -1) {\n                        if (errno != EAGAIN && errno != EWOULDBLOCK) {\n                            ERROR(\"remote_send_cb_send\");\n                            // close and free\n                            close_and_free_remote(EV_A_ remote);\n                            close_and_free_server(EV_A_ server);\n                        }\n                        return;\n                    } else if (s < (ssize_t)(remote->buf->len)) {\n                        // partly sent, move memory, wait for the next time to send\n                        remote->buf->len -= s;\n                        remote->buf->idx += s;\n                        return;\n                    } else {\n                        // all sent out, wait for reading\n                        remote->buf->len = 0;\n                        remote->buf->idx = 0;\n                        ev_io_stop(EV_A_ & remote->send_ctx->io);\n                        ev_io_start(EV_A_ & server->recv_ctx->io);\n                    }\n                }\n            }\n        }\n    }\n    if ( server->buf->len == 0 )\n        return;\n\n    int err = ss_decrypt(&cipher_env, server->buf, server->d_ctx, BUF_SIZE);\n\n    if (err) {\n        LOGE(\"invalid password or cipher\");\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    if (server->protocol_plugin) {\n        obfs_class *protocol_plugin = server->protocol_plugin;\n        if (protocol_plugin->client_post_decrypt) {\n            server->buf->len = protocol_plugin->client_post_decrypt(server->protocol, &server->buf->array, server->buf->len, &server->buf->capacity);\n            if ((int)server->buf->len < 0) {\n                LOGE(\"client_post_decrypt\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n            if ( server->buf->len == 0 )\n                return;\n        }\n    }\n    // SSR end\n\n    int s = send(server->fd, server->buf->array, server->buf->len, 0);\n\n    if (s == -1) {\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n            // no data, wait for send\n            server->buf->idx = 0;\n            ev_io_stop(EV_A_ & remote_recv_ctx->io);\n            ev_io_start(EV_A_ & server->send_ctx->io);\n        } else {\n            ERROR(\"send\");\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n        }\n    } else if (s < server->buf->len) {\n        server->buf->len -= s;\n        server->buf->idx  = s;\n        ev_io_stop(EV_A_ & remote_recv_ctx->io);\n        ev_io_start(EV_A_ & server->send_ctx->io);\n    }\n}\n\nstatic void\nremote_send_cb(EV_P_ ev_io *w, int revents)\n{\n    remote_ctx_t *remote_send_ctx = (remote_ctx_t *)w;\n    remote_t *remote              = remote_send_ctx->remote;\n    server_t *server              = remote->server;\n\n    if (!remote_send_ctx->connected) {\n        struct sockaddr_storage addr;\n        socklen_t len = sizeof(struct sockaddr_storage);\n\n        int r = getpeername(remote->fd, (struct sockaddr *)&addr, &len);\n        if (r == 0) {\n            remote_send_ctx->connected = 1;\n            ev_io_stop(EV_A_ & remote_send_ctx->io);\n            ev_timer_stop(EV_A_ & remote_send_ctx->watcher);\n\n            buffer_t ss_addr_to_send;\n            buffer_t *abuf = &ss_addr_to_send;\n            balloc(abuf, BUF_SIZE);\n\n            ss_addr_t *sa = &server->destaddr;\n            struct cork_ip ip;\n            if (cork_ip_init(&ip, sa->host) != -1) {\n                if (ip.version == 4) {\n                    // send as IPv4\n                    struct in_addr host;\n                    memset(&host, 0, sizeof(struct in_addr));\n                    int host_len = sizeof(struct in_addr);\n\n                    if (dns_pton(AF_INET, sa->host, &host) == -1) {\n                        FATAL(\"IP parser error\");\n                    }\n                    abuf->array[abuf->len++] = 1;\n                    memcpy(abuf->array + abuf->len, &host, host_len);\n                    abuf->len += host_len;\n                } else if (ip.version == 6) {\n                    // send as IPv6\n                    struct in6_addr host;\n                    memset(&host, 0, sizeof(struct in6_addr));\n                    int host_len = sizeof(struct in6_addr);\n\n                    if (dns_pton(AF_INET6, sa->host, &host) == -1) {\n                        FATAL(\"IP parser error\");\n                    }\n                    abuf->array[abuf->len++] = 4;\n                    memcpy(abuf->array + abuf->len, &host, host_len);\n                    abuf->len += host_len;\n                } else {\n                    FATAL(\"IP parser error\");\n                }\n            } else {\n                // send as domain\n                int host_len = strlen(sa->host);\n\n                abuf->array[abuf->len++] = 3;\n                abuf->array[abuf->len++] = host_len;\n                memcpy(abuf->array + abuf->len, sa->host, host_len);\n                abuf->len += host_len;\n            }\n\n            uint16_t port = htons(atoi(sa->port));\n            memcpy(abuf->array + abuf->len, &port, 2);\n            abuf->len += 2;\n\n            if (remote->buf->len > 0) {\n                brealloc(remote->buf, remote->buf->len + abuf->len, BUF_SIZE);\n                memmove(remote->buf->array + abuf->len, remote->buf->array, remote->buf->len);\n                memcpy(remote->buf->array, abuf->array, abuf->len);\n                remote->buf->len += abuf->len;\n            } else {\n                brealloc(remote->buf, abuf->len, BUF_SIZE);\n                memcpy(remote->buf->array, abuf->array, abuf->len);\n                remote->buf->len = abuf->len;\n            }\n            bfree(abuf);\n\n            // SSR beg\n            server_info _server_info;\n            if (server->obfs_plugin) {\n                server->obfs_plugin->get_server_info(server->obfs, &_server_info);\n                _server_info.head_len = get_head_size(remote->buf->array, remote->buf->len, 30);\n                server->obfs_plugin->set_server_info(server->obfs, &_server_info);\n            }\n            if (server->protocol_plugin) {\n                obfs_class *protocol_plugin = server->protocol_plugin;\n                if (protocol_plugin->client_pre_encrypt) {\n                    remote->buf->len = protocol_plugin->client_pre_encrypt(server->protocol, &remote->buf->array, remote->buf->len, &remote->buf->capacity);\n                }\n            }\n\n            int err = ss_encrypt(&cipher_env, remote->buf, server->e_ctx, BUF_SIZE);\n            if (err) {\n                LOGE(\"invalid password or cipher\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n\n            if (server->obfs_plugin) {\n                obfs_class *obfs_plugin = server->obfs_plugin;\n                if (obfs_plugin->client_encode) {\n                    remote->buf->len = obfs_plugin->client_encode(server->obfs, &remote->buf->array, remote->buf->len, &remote->buf->capacity);\n                }\n            }\n\n            int s = send(remote->fd, remote->buf->array, remote->buf->len, 0);\n\n            if (s < remote->buf->len) {\n                LOGE(\"failed to send addr\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n            remote->buf->len = 0;\n            remote->buf->idx = 0;\n            // SSR end\n\n            ev_io_start(EV_A_ & remote->recv_ctx->io);\n            ev_io_start(EV_A_ & server->recv_ctx->io);\n\n            return;\n        } else {\n            ERROR(\"getpeername\");\n            // not connected\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    } else {\n        if (remote->buf->len == 0) {\n            // close and free\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        } else {\n            // has data to send\n            ssize_t s = send(remote->fd, remote->buf->array + remote->buf->idx,\n                             remote->buf->len, 0);\n            if (s == -1) {\n                if (errno != EAGAIN && errno != EWOULDBLOCK) {\n                    ERROR(\"send\");\n                    // close and free\n                    close_and_free_remote(EV_A_ remote);\n                    close_and_free_server(EV_A_ server);\n                }\n                return;\n            } else if (s < remote->buf->len) {\n                // partly sent, move memory, wait for the next time to send\n                remote->buf->len -= s;\n                remote->buf->idx += s;\n                return;\n            } else {\n                // all sent out, wait for reading\n                remote->buf->len = 0;\n                remote->buf->idx = 0;\n                ev_io_stop(EV_A_ & remote_send_ctx->io);\n                ev_io_start(EV_A_ & server->recv_ctx->io);\n            }\n        }\n    }\n}\n\nstatic remote_t *\nnew_remote(int fd, int timeout)\n{\n    remote_t *remote = ss_malloc(sizeof(remote_t));\n\n    memset(remote, 0, sizeof(remote_t));\n\n    remote->buf                 = ss_malloc(sizeof(buffer_t));\n    remote->recv_ctx            = ss_malloc(sizeof(remote_ctx_t));\n    remote->send_ctx            = ss_malloc(sizeof(remote_ctx_t));\n    balloc(remote->buf, BUF_SIZE);\n    memset(remote->recv_ctx, 0, sizeof(remote_ctx_t));\n    memset(remote->send_ctx, 0, sizeof(remote_ctx_t));\n    remote->fd                  = fd;\n    remote->recv_ctx->remote    = remote;\n    remote->recv_ctx->connected = 0;\n    remote->send_ctx->remote    = remote;\n    remote->send_ctx->connected = 0;\n\n    ev_io_init(&remote->recv_ctx->io, remote_recv_cb, fd, EV_READ);\n    ev_io_init(&remote->send_ctx->io, remote_send_cb, fd, EV_WRITE);\n    ev_timer_init(&remote->send_ctx->watcher, remote_timeout_cb,\n                  min(MAX_CONNECT_TIMEOUT, timeout), 0);\n\n    return remote;\n}\n\nstatic void\nfree_remote(remote_t *remote)\n{\n    if (remote != NULL) {\n        if (remote->server != NULL) {\n            remote->server->remote = NULL;\n        }\n        if (remote->buf) {\n            bfree(remote->buf);\n            ss_free(remote->buf);\n        }\n        ss_free(remote->recv_ctx);\n        ss_free(remote->send_ctx);\n        ss_free(remote);\n    }\n}\n\nstatic void\nclose_and_free_remote(EV_P_ remote_t *remote)\n{\n    if (remote != NULL) {\n        ev_timer_stop(EV_A_ & remote->send_ctx->watcher);\n        ev_io_stop(EV_A_ & remote->send_ctx->io);\n        ev_io_stop(EV_A_ & remote->recv_ctx->io);\n        close(remote->fd);\n        free_remote(remote);\n    }\n}\n\nstatic server_t *\nnew_server(int fd, int method)\n{\n    server_t *server = ss_malloc(sizeof(server_t));\n    memset(server, 0, sizeof(server_t));\n\n    server->buf                 = ss_malloc(sizeof(buffer_t));\n    server->recv_ctx            = ss_malloc(sizeof(server_ctx_t));\n    server->send_ctx            = ss_malloc(sizeof(server_ctx_t));\n    balloc(server->buf, BUF_SIZE);\n    memset(server->recv_ctx, 0, sizeof(server_ctx_t));\n    memset(server->send_ctx, 0, sizeof(server_ctx_t));\n    server->fd                  = fd;\n    server->recv_ctx->server    = server;\n    server->recv_ctx->connected = 0;\n    server->send_ctx->server    = server;\n    server->send_ctx->connected = 0;\n\n    if (method) {\n        server->e_ctx = ss_malloc(sizeof(struct enc_ctx));\n        server->d_ctx = ss_malloc(sizeof(struct enc_ctx));\n        enc_ctx_init(&cipher_env, server->e_ctx, 1);\n        enc_ctx_init(&cipher_env, server->d_ctx, 0);\n    } else {\n        server->e_ctx = NULL;\n        server->d_ctx = NULL;\n    }\n\n    ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ);\n    ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE);\n\n    return server;\n}\n\nstatic void\nfree_server(server_t *server)\n{\n    if (server != NULL) {\n        if (server->remote != NULL) {\n            server->remote->server = NULL;\n        }\n        if (server->e_ctx != NULL) {\n            enc_ctx_release(&cipher_env, server->e_ctx);\n            ss_free(server->e_ctx);\n        }\n        if (server->d_ctx != NULL) {\n            enc_ctx_release(&cipher_env, server->d_ctx);\n            ss_free(server->d_ctx);\n        }\n        if (server->buf) {\n            bfree(server->buf);\n            ss_free(server->buf);\n        }\n        // SSR beg\n        if (server->obfs_plugin) {\n            server->obfs_plugin->dispose(server->obfs);\n            server->obfs = NULL;\n            free_obfs_class(server->obfs_plugin);\n            server->obfs_plugin = NULL;\n        }\n        if (server->protocol_plugin) {\n            server->protocol_plugin->dispose(server->protocol);\n            server->protocol = NULL;\n            free_obfs_class(server->protocol_plugin);\n            server->protocol_plugin = NULL;\n        }\n        // SSR end\n        ss_free(server->recv_ctx);\n        ss_free(server->send_ctx);\n        ss_free(server);\n    }\n}\n\nstatic void\nclose_and_free_server(EV_P_ server_t *server)\n{\n    if (server != NULL) {\n        ev_io_stop(EV_A_ & server->send_ctx->io);\n        ev_io_stop(EV_A_ & server->recv_ctx->io);\n        close(server->fd);\n        free_server(server);\n    }\n}\n\nstatic void\naccept_cb(EV_P_ ev_io *w, int revents)\n{\n    struct listen_ctx *listener = (struct listen_ctx *)w;\n    int serverfd                = accept(listener->fd, NULL, NULL);\n    if (serverfd == -1) {\n        ERROR(\"accept\");\n        return;\n    }\n    setnonblocking(serverfd);\n    int opt = 1;\n    setsockopt(serverfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\n#ifdef SO_NOSIGPIPE\n    setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n#endif\n\n    int index                    = rand() % listener->remote_num;\n    struct sockaddr *remote_addr = listener->remote_addr[index];\n\n    int remotefd = socket(remote_addr->sa_family, SOCK_STREAM, IPPROTO_TCP);\n    if (remotefd == -1) {\n        ERROR(\"socket\");\n        return;\n    }\n\n#ifdef ANDROID\n    if (vpn) {\n        int not_protect = 0;\n        if (remote_addr->sa_family == AF_INET) {\n            struct sockaddr_in *s = (struct sockaddr_in *)remote_addr;\n            if (s->sin_addr.s_addr == inet_addr(\"127.0.0.1\"))\n                not_protect = 1;\n        }\n        if (!not_protect) {\n            if (protect_socket(remotefd) == -1) {\n                ERROR(\"protect_socket\");\n                close(remotefd);\n                return;\n            }\n        }\n    }\n#endif\n\n    setsockopt(remotefd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\n#ifdef SO_NOSIGPIPE\n    setsockopt(remotefd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n#endif\n\n    if (listener->mptcp == 1) {\n        int err = setsockopt(remotefd, SOL_TCP, MPTCP_ENABLED, &opt, sizeof(opt));\n        if (err == -1) {\n            ERROR(\"failed to enable multipath TCP\");\n        }\n    }\n\n    // Setup\n    setnonblocking(remotefd);\n#ifdef SET_INTERFACE\n    if (listener->iface) {\n        if (setinterface(remotefd, listener->iface) == -1)\n            ERROR(\"setinterface\");\n    }\n#endif\n\n    server_t *server = new_server(serverfd, listener->method);\n    remote_t *remote = new_remote(remotefd, listener->timeout);\n    server->destaddr = listener->tunnel_addr;\n    server->remote   = remote;\n    remote->server   = server;\n\n    int r = connect(remotefd, remote_addr, get_sockaddr_len(remote_addr));\n\n    if (r == -1 && errno != CONNECT_IN_PROGRESS) {\n        ERROR(\"connect\");\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n    \n    // listen to remote connected event\n    ev_io_start(EV_A_ & remote->send_ctx->io);\n    ev_timer_start(EV_A_ & remote->send_ctx->watcher);\n}\n\nvoid\nsignal_cb(int dummy)\n{\n    keep_resolving = 0;\n    exit(-1);\n}\n\nint\nmain(int argc, char **argv)\n{\n    srand(time(NULL));\n\n    int i, c;\n    int pid_flags    = 0;\n    int mptcp        = 0;\n    int mtu          = 0;\n    char *user       = NULL;\n    char *local_port = NULL;\n    char *local_addr = NULL;\n    char *password   = NULL;\n    char *timeout    = NULL;\n    char *protocol = NULL; // SSR\n    char *protocol_param = NULL; // SSR\n    char *method = NULL;\n    char *obfs = NULL; // SSR\n    char *obfs_param = NULL; // SSR\n    char *pid_path   = NULL;\n    char *conf_path  = NULL;\n    char *iface      = NULL;\n\n    int remote_num = 0;\n    ss_addr_t remote_addr[MAX_REMOTE_NUM];\n    char *remote_port = NULL;\n\n    ss_addr_t tunnel_addr = { .host = NULL, .port = NULL };\n    char *tunnel_addr_str = NULL;\n\n    int option_index                    = 0;\n    static struct option long_options[] = {\n        { \"mtu\",   required_argument, 0, 0 },\n        { \"mptcp\", no_argument,       0, 0 },\n        { \"help\",  no_argument,       0, 0 },\n        {       0,                 0, 0, 0 }\n    };\n\n    opterr = 0;\n\n    USE_TTY();\n\n#ifdef ANDROID\n    while ((c = getopt_long(argc, argv, \"f:s:p:l:k:t:m:i:c:b:L:a:n:P:huUvVA6\"\n                            \"O:o:G:g:\",\n                            long_options, &option_index)) != -1) {\n#else\n    while ((c = getopt_long(argc, argv, \"f:s:p:l:k:t:m:i:c:b:L:a:n:huUvA6\"\n                            \"O:o:G:g:\",\n                            long_options, &option_index)) != -1) {\n#endif\n        switch (c) {\n        case 0:\n            if (option_index == 0) {\n                mtu = atoi(optarg);\n                LOGI(\"set MTU to %d\", mtu);\n            } else if (option_index == 1) {\n                mptcp = 1;\n                LOGI(\"enable multipath TCP\");\n            } else if (option_index == 2) {\n                usage();\n                exit(EXIT_SUCCESS);\n            }\n            break;\n        case 's':\n            if (remote_num < MAX_REMOTE_NUM) {\n                remote_addr[remote_num].host   = optarg;\n                remote_addr[remote_num++].port = NULL;\n            }\n            break;\n        case 'p':\n            remote_port = optarg;\n            break;\n        case 'l':\n            local_port = optarg;\n            break;\n        case 'k':\n            password = optarg;\n            break;\n        case 'f':\n            pid_flags = 1;\n            pid_path  = optarg;\n            break;\n        case 't':\n            timeout = optarg;\n            break;\n        // SSR beg\n        case 'O':\n            protocol = optarg;\n            break;\n        case 'm':\n            method = optarg;\n            break;\n        case 'o':\n            obfs = optarg;\n            break;\n        case 'G':\n            protocol_param = optarg;\n            break;\n        case 'g':\n            obfs_param = optarg;\n            break;\n        // SSR end\n        case 'c':\n            conf_path = optarg;\n            break;\n        case 'i':\n            iface = optarg;\n            break;\n        case 'b':\n            local_addr = optarg;\n            break;\n        case 'u':\n            mode = TCP_AND_UDP;\n            break;\n        case 'U':\n            mode = UDP_ONLY;\n            break;\n        case 'L':\n            tunnel_addr_str = optarg;\n            break;\n        case 'a':\n            user = optarg;\n            break;\n#ifdef HAVE_SETRLIMIT\n        case 'n':\n            nofile = atoi(optarg);\n            break;\n#endif\n        case 'v':\n            verbose = 1;\n            break;\n        case 'h':\n            usage();\n            exit(EXIT_SUCCESS);\n        case 'A':\n            LOGI(\"The 'A' argument is deprecate! Ignored.\");\n            break;\n        case '6':\n            ipv6first = 1;\n            break;\n#ifdef ANDROID\n        case 'V':\n            vpn = 1;\n            break;\n        case 'P':\n            prefix = optarg;\n            break;\n#endif\n        case '?':\n            // The option character is not recognized.\n            LOGE(\"Unrecognized option: %s\", optarg);\n            opterr = 1;\n            break;\n        }\n    }\n\n    if (opterr) {\n        usage();\n        exit(EXIT_FAILURE);\n    }\n\n    if (argc == 1) {\n        if (conf_path == NULL) {\n            conf_path = DEFAULT_CONF_PATH;\n        }\n    }\n\n    if (conf_path != NULL) {\n        jconf_t *conf = read_jconf(conf_path);\n        if (remote_num == 0) {\n            remote_num = conf->remote_num;\n            for (i = 0; i < remote_num; i++)\n                remote_addr[i] = conf->remote_addr[i];\n        }\n        if (remote_port == NULL) {\n            remote_port = conf->remote_port;\n        }\n        if (local_addr == NULL) {\n            local_addr = conf->local_addr;\n        }\n        if (local_port == NULL) {\n            local_port = conf->local_port;\n        }\n        if (password == NULL) {\n            password = conf->password;\n        }\n        // SSR beg\n        if (protocol == NULL) {\n            protocol = conf->protocol;\n            LOGI(\"protocol %s\", protocol);\n        }\n        if (protocol_param == NULL) {\n            protocol_param = conf->protocol_param;\n            LOGI(\"protocol_param %s\", protocol_param);\n        }\n        if (method == NULL) {\n            method = conf->method;\n            LOGI(\"method %s\", method);\n        }\n        if (obfs == NULL) {\n            obfs = conf->obfs;\n            LOGI(\"obfs %s\", obfs);\n        }\n        if (obfs_param == NULL) {\n            obfs_param = conf->obfs_param;\n            LOGI(\"obfs_param %s\", obfs_param);\n        }\n        // SSR end\n        if (timeout == NULL) {\n            timeout = conf->timeout;\n        }\n        if (user == NULL) {\n            user = conf->user;\n        }\n        if (tunnel_addr_str == NULL) {\n            tunnel_addr_str = conf->tunnel_address;\n        }\n        if (mode == TCP_ONLY) {\n            mode = conf->mode;\n        }\n        if (mtu == 0) {\n            mtu = conf->mtu;\n        }\n        if (mptcp == 0) {\n            mptcp = conf->mptcp;\n        }\n#ifdef HAVE_SETRLIMIT\n        if (nofile == 0) {\n            nofile = conf->nofile;\n        }\n#endif\n    }\n    if (protocol && strcmp(protocol, \"verify_sha1\") == 0) {\n        LOGI(\"The verify_sha1 protocol is deprecate! Fallback to origin protocol.\");\n        protocol = NULL;\n    }\n\n    if (remote_num == 0 || remote_port == NULL || tunnel_addr_str == NULL ||\n        local_port == NULL || password == NULL) {\n        usage();\n        exit(EXIT_FAILURE);\n    }\n\n    if (method == NULL) {\n        method = \"rc4-md5\";\n    }\n\n    if (timeout == NULL) {\n        timeout = \"60\";\n    }\n\n#ifdef HAVE_SETRLIMIT\n    /*\n     * no need to check the return value here since we will show\n     * the user an error message if setrlimit(2) fails\n     */\n    if (nofile > 1024) {\n        if (verbose) {\n            LOGI(\"setting NOFILE to %d\", nofile);\n        }\n        set_nofile(nofile);\n    }\n#endif\n\n    if (local_addr == NULL) {\n        local_addr = \"127.0.0.1\";\n    }\n\n    if (pid_flags) {\n        USE_SYSLOG(argv[0]);\n        daemonize(pid_path);\n    }\n\n    if (ipv6first) {\n        LOGI(\"resolving hostname to IPv6 address first\");\n    }\n\n    // parse tunnel addr\n    parse_addr(tunnel_addr_str, &tunnel_addr);\n\n    if (tunnel_addr.port == NULL) {\n        FATAL(\"tunnel port is not defined\");\n    }\n\n#ifdef __MINGW32__\n    winsock_init();\n#else\n    // ignore SIGPIPE\n    signal(SIGPIPE, SIG_IGN);\n    signal(SIGABRT, SIG_IGN);\n    signal(SIGINT, signal_cb);\n    signal(SIGTERM, signal_cb);\n#endif\n\n    // Setup keys\n    LOGI(\"initializing ciphers... %s\", method);\n    int m = enc_init(&cipher_env, password, method);\n\n    // Setup proxy context\n    struct listen_ctx listen_ctx;\n    memset(&listen_ctx, 0, sizeof(struct listen_ctx));\n    listen_ctx.tunnel_addr = tunnel_addr;\n    listen_ctx.remote_num  = remote_num;\n    listen_ctx.remote_addr = ss_malloc(sizeof(struct sockaddr *) * remote_num);\n    memset(listen_ctx.remote_addr, 0, sizeof(struct sockaddr *) * remote_num);\n    for (i = 0; i < remote_num; i++) {\n        char *host = remote_addr[i].host;\n        char *port = remote_addr[i].port == NULL ? remote_port :\n                     remote_addr[i].port;\n        struct sockaddr_storage *storage = ss_malloc(sizeof(struct sockaddr_storage));\n        memset(storage, 0, sizeof(struct sockaddr_storage));\n        if (get_sockaddr(host, port, storage, 1, ipv6first) == -1) {\n            FATAL(\"failed to resolve the provided hostname\");\n        }\n        listen_ctx.remote_addr[i] = (struct sockaddr *)storage;\n    }\n    listen_ctx.timeout = atoi(timeout);\n    listen_ctx.iface   = iface;\n    // SSR beg\n    listen_ctx.protocol_name = protocol;\n    listen_ctx.protocol_param = protocol_param;\n    listen_ctx.method = m;\n    listen_ctx.obfs_name = obfs;\n    listen_ctx.obfs_param = obfs_param;\n    listen_ctx.list_protocol_global = malloc(sizeof(void *) * remote_num);\n    listen_ctx.list_obfs_global = malloc(sizeof(void *) * remote_num);\n    memset(listen_ctx.list_protocol_global, 0, sizeof(void *) * remote_num);\n    memset(listen_ctx.list_obfs_global, 0, sizeof(void *) * remote_num);\n    // SSR end\n    listen_ctx.mptcp   = mptcp;\n\n    struct ev_loop *loop = EV_DEFAULT;\n\n    if (mode != UDP_ONLY) {\n        // Setup socket\n        int listenfd;\n        listenfd = create_and_bind(local_addr, local_port);\n        if (listenfd == -1) {\n            FATAL(\"bind() error:\");\n        }\n        if (listen(listenfd, SOMAXCONN) == -1) {\n            FATAL(\"listen() error:\");\n        }\n        setnonblocking(listenfd);\n\n        listen_ctx.fd = listenfd;\n\n        ev_io_init(&listen_ctx.io, accept_cb, listenfd, EV_READ);\n        ev_io_start(loop, &listen_ctx.io);\n    }\n\n    // Setup UDP\n    if (mode != TCP_ONLY) {\n        LOGI(\"UDP relay enabled\");\n        init_udprelay(local_addr, local_port, listen_ctx.remote_addr[0],\n                      get_sockaddr_len(listen_ctx.remote_addr[0]),\n                      tunnel_addr, mtu, listen_ctx.timeout, iface, protocol, protocol_param);\n    }\n\n    if (mode == UDP_ONLY) {\n        LOGI(\"TCP relay disabled\");\n    }\n\n    LOGI(\"listening at %s:%s\", local_addr, local_port);\n\n    // setuid\n    if (user != NULL && ! run_as(user)) {\n        FATAL(\"failed to switch user\");\n    }\n\n#ifndef __MINGW32__\n    if (geteuid() == 0){\n        LOGI(\"running from root user\");\n    }\n#endif\n\n    ev_run(loop, 0);\n\n#ifdef __MINGW32__\n    winsock_cleanup();\n#endif\n\n    return 0;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/tunnel.h",
    "content": "/*\n * tunnel.h - Define tunnel's buffers and callbacks\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _TUNNEL_H\n#define _TUNNEL_H\n\n#include <ev.h>\n#include \"encrypt.h\"\n#include \"obfs/obfs.h\"\n#include \"jconf.h\"\n\n#include \"common.h\"\n\ntypedef struct listen_ctx {\n    ev_io io;\n    ss_addr_t tunnel_addr;\n    char *iface;\n    int remote_num;\n    int method;\n    int timeout;\n    int fd;\n    int mptcp;\n    struct sockaddr **remote_addr;\n\n    // SSR\n    char *protocol_name;\n    char *protocol_param;\n    char *obfs_name;\n    char *obfs_param;\n    void **list_protocol_global;\n    void **list_obfs_global;\n} listen_ctx_t;\n\ntypedef struct server_ctx {\n    ev_io io;\n    int connected;\n    struct server *server;\n} server_ctx_t;\n\ntypedef struct server {\n    int fd;\n    buffer_t *buf;\n    ssize_t buf_capacity;\n    struct enc_ctx *e_ctx;\n    struct enc_ctx *d_ctx;\n    struct server_ctx *recv_ctx;\n    struct server_ctx *send_ctx;\n    struct remote *remote;\n    ss_addr_t destaddr;\n\n    // SSR\n    obfs *protocol;\n    obfs *obfs;\n    obfs_class *protocol_plugin;\n    obfs_class *obfs_plugin;\n} server_t;\n\ntypedef struct remote_ctx {\n    ev_io io;\n    ev_timer watcher;\n    int connected;\n    struct remote *remote;\n} remote_ctx_t;\n\ntypedef struct remote {\n    int fd;\n    buffer_t *buf;\n    ssize_t buf_capacity;\n    struct remote_ctx *recv_ctx;\n    struct remote_ctx *send_ctx;\n    struct server *server;\n    uint32_t counter;\n\n    // SSR\n    int remote_index;\n} remote_t;\n\n#endif // _TUNNEL_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/udprelay.c",
    "content": "/*\r\n * udprelay.c - Setup UDP relay for both client and server\r\n *\r\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\r\n *\r\n * This file is part of the shadowsocks-libev.\r\n *\r\n * shadowsocks-libev is free software; you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation; either version 3 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * shadowsocks-libev is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with shadowsocks-libev; see the file COPYING. If not, see\r\n * <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#include <sys/stat.h>\r\n#include <sys/types.h>\r\n#include <fcntl.h>\r\n#include <locale.h>\r\n#include <signal.h>\r\n#include <string.h>\r\n#include <strings.h>\r\n#include <time.h>\r\n#include <unistd.h>\r\n\r\n#ifndef __MINGW32__\r\n#include <arpa/inet.h>\r\n#include <errno.h>\r\n#include <netdb.h>\r\n#include <netinet/in.h>\r\n#include <pthread.h>\r\n#endif\r\n\r\n#ifdef HAVE_CONFIG_H\r\n#include \"config.h\"\r\n#endif\r\n\r\n#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_NET_IF_H) && defined(__linux__)\r\n#include <net/if.h>\r\n#include <sys/ioctl.h>\r\n#define SET_INTERFACE\r\n#endif\r\n\r\n#ifdef __MINGW32__\r\n#include \"win32.h\"\r\n#endif\r\n\r\n#include <libcork/core.h>\r\n#include <udns.h>\r\n\r\n#include \"utils.h\"\r\n#include \"netutils.h\"\r\n#include \"cache.h\"\r\n#include \"udprelay.h\"\r\n#include \"encrypt.h\"\r\n\r\n#ifdef MODULE_REMOTE\r\n#define MAX_UDP_CONN_NUM 512\r\n#else\r\n#define MAX_UDP_CONN_NUM 256\r\n#endif\r\n\r\n#ifdef MODULE_REMOTE\r\n#ifdef MODULE_\r\n#error \"MODULE_REMOTE and MODULE_LOCAL should not be both defined\"\r\n#endif\r\n#endif\r\n\r\n#ifndef EAGAIN\r\n#define EAGAIN EWOULDBLOCK\r\n#endif\r\n\r\n#ifndef EWOULDBLOCK\r\n#define EWOULDBLOCK EAGAIN\r\n#endif\r\n\r\nstatic void server_recv_cb(EV_P_ ev_io *w, int revents);\r\nstatic void remote_recv_cb(EV_P_ ev_io *w, int revents);\r\nstatic void remote_timeout_cb(EV_P_ ev_timer *watcher, int revents);\r\n\r\nstatic char *hash_key(const int af, const struct sockaddr_storage *addr);\r\n#ifdef MODULE_REMOTE\r\nstatic void query_resolve_cb(struct sockaddr *addr, void *data);\r\n#endif\r\nstatic void close_and_free_remote(EV_P_ remote_ctx_t *ctx);\r\nstatic remote_ctx_t *new_remote(int fd, server_ctx_t *server_ctx);\r\n\r\n#ifdef ANDROID\r\nextern int log_tx_rx;\r\nextern uint64_t tx;\r\nextern uint64_t rx;\r\nextern int vpn;\r\n#endif\r\n\r\nextern int verbose;\r\n#ifdef MODULE_REMOTE\r\nextern uint64_t tx;\r\nextern uint64_t rx;\r\n#endif\r\n\r\nstatic int packet_size                               = DEFAULT_PACKET_SIZE;\r\nstatic int buf_size                                  = DEFAULT_PACKET_SIZE * 2;\r\nstatic int server_num                                = 0;\r\nstatic server_ctx_t *server_ctx_list[MAX_REMOTE_NUM] = { NULL };\r\n\r\n#ifndef __MINGW32__\r\nstatic int\r\nsetnonblocking(int fd)\r\n{\r\n    int flags;\r\n    if (-1 == (flags = fcntl(fd, F_GETFL, 0))) {\r\n        flags = 0;\r\n    }\r\n    return fcntl(fd, F_SETFL, flags | O_NONBLOCK);\r\n}\r\n\r\n#endif\r\n\r\n#if defined(MODULE_REMOTE) && defined(SO_BROADCAST)\r\nstatic int\r\nset_broadcast(int socket_fd)\r\n{\r\n    int opt = 1;\r\n    return setsockopt(socket_fd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));\r\n}\r\n\r\n#endif\r\n\r\n#ifdef SO_NOSIGPIPE\r\nstatic int\r\nset_nosigpipe(int socket_fd)\r\n{\r\n    int opt = 1;\r\n    return setsockopt(socket_fd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\r\n}\r\n\r\n#endif\r\n\r\n#ifdef MODULE_REDIR\r\n\r\n#ifndef IP_TRANSPARENT\r\n#define IP_TRANSPARENT       19\r\n#endif\r\n\r\n#ifndef IP_RECVORIGDSTADDR\r\n#ifdef  IP_ORIGDSTADDR\r\n#   define IP_RECVORIGDSTADDR   IP_ORIGDSTADDR\r\n#else\r\n#   define IP_RECVORIGDSTADDR   20\r\n#   endif\r\n#endif\r\n\r\n#ifndef IPV6_RECVORIGDSTADDR\r\n#ifdef  IPV6_ORIGDSTADDR\r\n#define IPV6_RECVORIGDSTADDR   IPV6_ORIGDSTADDR\r\n#else\r\n#define IPV6_RECVORIGDSTADDR   74\r\n#endif\r\n#endif\r\n\r\nstatic int\r\nget_dstaddr(struct msghdr *msg, struct sockaddr_storage *dstaddr)\r\n{\r\n    struct cmsghdr *cmsg;\r\n\r\n    for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) {\r\n        if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVORIGDSTADDR) {\r\n            memcpy(dstaddr, CMSG_DATA(cmsg), sizeof(struct sockaddr_in));\r\n            dstaddr->ss_family = AF_INET;\r\n            return 0;\r\n        } else if (cmsg->cmsg_level == SOL_IPV6 && cmsg->cmsg_type == IPV6_RECVORIGDSTADDR) {\r\n            memcpy(dstaddr, CMSG_DATA(cmsg), sizeof(struct sockaddr_in6));\r\n            dstaddr->ss_family = AF_INET6;\r\n            return 0;\r\n        }\r\n    }\r\n\r\n    return 1;\r\n}\r\n\r\n#endif\r\n\r\n#define HASH_KEY_LEN sizeof(struct sockaddr_storage) + sizeof(int)\r\nstatic char *\r\nhash_key(const int af, const struct sockaddr_storage *addr)\r\n{\r\n    size_t addr_len = sizeof(struct sockaddr_storage);\r\n    static char key[HASH_KEY_LEN];\r\n\r\n    memset(key, 0, HASH_KEY_LEN);\r\n    memcpy(key, &af, sizeof(int));\r\n    memcpy(key + sizeof(int), (const uint8_t *)addr, addr_len);\r\n\r\n    return key;\r\n}\r\n\r\n#if defined(MODULE_REDIR) || defined(MODULE_REMOTE)\r\nstatic int\r\nconstruct_udprealy_header(const struct sockaddr_storage *in_addr,\r\n                          char *addr_header)\r\n{\r\n    int addr_header_len = 0;\r\n    if (in_addr->ss_family == AF_INET) {\r\n        struct sockaddr_in *addr = (struct sockaddr_in *)in_addr;\r\n        size_t addr_len          = sizeof(struct in_addr);\r\n        addr_header[addr_header_len++] = 1;\r\n        memcpy(addr_header + addr_header_len, &addr->sin_addr, addr_len);\r\n        addr_header_len += addr_len;\r\n        memcpy(addr_header + addr_header_len, &addr->sin_port, 2);\r\n        addr_header_len += 2;\r\n    } else if (in_addr->ss_family == AF_INET6) {\r\n        struct sockaddr_in6 *addr = (struct sockaddr_in6 *)in_addr;\r\n        size_t addr_len           = sizeof(struct in6_addr);\r\n        addr_header[addr_header_len++] = 4;\r\n        memcpy(addr_header + addr_header_len, &addr->sin6_addr, addr_len);\r\n        addr_header_len += addr_len;\r\n        memcpy(addr_header + addr_header_len, &addr->sin6_port, 2);\r\n        addr_header_len += 2;\r\n    } else {\r\n        return 0;\r\n    }\r\n    return addr_header_len;\r\n}\r\n\r\n#endif\r\n\r\nstatic int\r\nparse_udprealy_header(const char *buf, const size_t buf_len,\r\n                      char *host, char *port, struct sockaddr_storage *storage)\r\n{\r\n    const uint8_t atyp = *(uint8_t *)buf;\r\n    int offset         = 1;\r\n\r\n    // get remote addr and port\r\n    if ((atyp & ADDRTYPE_MASK) == 1) {\r\n        // IP V4\r\n        size_t in_addr_len = sizeof(struct in_addr);\r\n        if (buf_len >= in_addr_len + 3) {\r\n            if (storage != NULL) {\r\n                struct sockaddr_in *addr = (struct sockaddr_in *)storage;\r\n                addr->sin_family = AF_INET;\r\n                addr->sin_addr   = *(struct in_addr *)(buf + offset);\r\n                addr->sin_port   = *(uint16_t *)(buf + offset + in_addr_len);\r\n            }\r\n            if (host != NULL) {\r\n                dns_ntop(AF_INET, (const void *)(buf + offset),\r\n                         host, INET_ADDRSTRLEN);\r\n            }\r\n            offset += in_addr_len;\r\n        }\r\n    } else if ((atyp & ADDRTYPE_MASK) == 3) {\r\n        // Domain name\r\n        uint8_t name_len = *(uint8_t *)(buf + offset);\r\n        if (name_len + 4 <= buf_len) {\r\n            if (storage != NULL) {\r\n                char tmp[257] = { 0 };\r\n                struct cork_ip ip;\r\n                memcpy(tmp, buf + offset + 1, name_len);\r\n                if (cork_ip_init(&ip, tmp) != -1) {\r\n                    if (ip.version == 4) {\r\n                        struct sockaddr_in *addr = (struct sockaddr_in *)storage;\r\n                        dns_pton(AF_INET, tmp, &(addr->sin_addr));\r\n                        addr->sin_port   = *(uint16_t *)(buf + offset + 1 + name_len);\r\n                        addr->sin_family = AF_INET;\r\n                    } else if (ip.version == 6) {\r\n                        struct sockaddr_in6 *addr = (struct sockaddr_in6 *)storage;\r\n                        dns_pton(AF_INET, tmp, &(addr->sin6_addr));\r\n                        addr->sin6_port   = *(uint16_t *)(buf + offset + 1 + name_len);\r\n                        addr->sin6_family = AF_INET6;\r\n                    }\r\n                }\r\n            }\r\n            if (host != NULL) {\r\n                memcpy(host, buf + offset + 1, name_len);\r\n            }\r\n            offset += 1 + name_len;\r\n        }\r\n    } else if ((atyp & ADDRTYPE_MASK) == 4) {\r\n        // IP V6\r\n        size_t in6_addr_len = sizeof(struct in6_addr);\r\n        if (buf_len >= in6_addr_len + 3) {\r\n            if (storage != NULL) {\r\n                struct sockaddr_in6 *addr = (struct sockaddr_in6 *)storage;\r\n                addr->sin6_family = AF_INET6;\r\n                addr->sin6_addr   = *(struct in6_addr *)(buf + offset);\r\n                addr->sin6_port   = *(uint16_t *)(buf + offset + in6_addr_len);\r\n            }\r\n            if (host != NULL) {\r\n                dns_ntop(AF_INET6, (const void *)(buf + offset),\r\n                         host, INET6_ADDRSTRLEN);\r\n            }\r\n            offset += in6_addr_len;\r\n        }\r\n    }\r\n\r\n    if (offset == 1) {\r\n        LOGE(\"[udp] invalid header with addr type %d\", atyp);\r\n        return 0;\r\n    }\r\n\r\n    if (port != NULL) {\r\n        sprintf(port, \"%d\", ntohs(*(uint16_t *)(buf + offset)));\r\n    }\r\n    offset += 2;\r\n\r\n    return offset;\r\n}\r\n\r\nstatic char *\r\nget_addr_str(const struct sockaddr *sa)\r\n{\r\n    static char s[SS_ADDRSTRLEN];\r\n    memset(s, 0, SS_ADDRSTRLEN);\r\n    char addr[INET6_ADDRSTRLEN] = { 0 };\r\n    char port[PORTSTRLEN]       = { 0 };\r\n    uint16_t p;\r\n\r\n    switch (sa->sa_family) {\r\n    case AF_INET:\r\n        dns_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr),\r\n                 addr, INET_ADDRSTRLEN);\r\n        p = ntohs(((struct sockaddr_in *)sa)->sin_port);\r\n        sprintf(port, \"%d\", p);\r\n        break;\r\n\r\n    case AF_INET6:\r\n        dns_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr),\r\n                 addr, INET6_ADDRSTRLEN);\r\n        p = ntohs(((struct sockaddr_in *)sa)->sin_port);\r\n        sprintf(port, \"%d\", p);\r\n        break;\r\n\r\n    default:\r\n        strncpy(s, \"Unknown AF\", SS_ADDRSTRLEN);\r\n    }\r\n\r\n    int addr_len = strlen(addr);\r\n    int port_len = strlen(port);\r\n    memcpy(s, addr, addr_len);\r\n    memcpy(s + addr_len + 1, port, port_len);\r\n    s[addr_len] = ':';\r\n\r\n    return s;\r\n}\r\n\r\nint\r\ncreate_remote_socket(int ipv6)\r\n{\r\n    int remote_sock;\r\n\r\n    if (ipv6) {\r\n        // Try to bind IPv6 first\r\n        struct sockaddr_in6 addr;\r\n        memset(&addr, 0, sizeof(struct sockaddr_in6));\r\n        addr.sin6_family = AF_INET6;\r\n        addr.sin6_addr   = in6addr_any;\r\n        addr.sin6_port   = 0;\r\n        remote_sock      = socket(AF_INET6, SOCK_DGRAM, 0);\r\n        if (remote_sock == -1) {\r\n            ERROR(\"[udp] cannot create socket\");\r\n            return -1;\r\n        }\r\n        if (bind(remote_sock, (struct sockaddr *)&addr, sizeof(addr)) != 0) {\r\n            FATAL(\"[udp] cannot bind remote\");\r\n            return -1;\r\n        }\r\n    } else {\r\n        // Or else bind to IPv4\r\n        struct sockaddr_in addr;\r\n        memset(&addr, 0, sizeof(struct sockaddr_in));\r\n        addr.sin_family      = AF_INET;\r\n        addr.sin_addr.s_addr = INADDR_ANY;\r\n        addr.sin_port        = 0;\r\n        remote_sock          = socket(AF_INET, SOCK_DGRAM, 0);\r\n        if (remote_sock == -1) {\r\n            ERROR(\"[udp] cannot create socket\");\r\n            return -1;\r\n        }\r\n\r\n        if (bind(remote_sock, (struct sockaddr *)&addr, sizeof(addr)) != 0) {\r\n            FATAL(\"[udp] cannot bind remote\");\r\n            return -1;\r\n        }\r\n    }\r\n    return remote_sock;\r\n}\r\n\r\nint\r\ncreate_server_socket(const char *host, const char *port)\r\n{\r\n    struct addrinfo hints;\r\n    struct addrinfo *result, *rp, *ipv4v6bindall;\r\n    int s, server_sock;\r\n\r\n    memset(&hints, 0, sizeof(struct addrinfo));\r\n    hints.ai_family   = AF_UNSPEC;               /* Return IPv4 and IPv6 choices */\r\n    hints.ai_socktype = SOCK_DGRAM;              /* We want a UDP socket */\r\n    hints.ai_flags    = AI_PASSIVE | AI_ADDRCONFIG; /* For wildcard IP address */\r\n    hints.ai_protocol = IPPROTO_UDP;\r\n\r\n    s = getaddrinfo(host, port, &hints, &result);\r\n    if (s != 0) {\r\n        LOGE(\"[udp] getaddrinfo: %s\", gai_strerror(s));\r\n        return -1;\r\n    }\r\n\r\n    rp = result;\r\n\r\n    /*\r\n     * On Linux, with net.ipv6.bindv6only = 0 (the default), getaddrinfo(NULL) with\r\n     * AI_PASSIVE returns 0.0.0.0 and :: (in this order). AI_PASSIVE was meant to\r\n     * return a list of addresses to listen on, but it is impossible to listen on\r\n     * 0.0.0.0 and :: at the same time, if :: implies dualstack mode.\r\n     */\r\n    if (!host) {\r\n        ipv4v6bindall = result;\r\n\r\n        /* Loop over all address infos found until a IPV6 address is found. */\r\n        while (ipv4v6bindall) {\r\n            if (ipv4v6bindall->ai_family == AF_INET6) {\r\n                rp = ipv4v6bindall; /* Take first IPV6 address available */\r\n                break;\r\n            }\r\n            ipv4v6bindall = ipv4v6bindall->ai_next; /* Get next address info, if any */\r\n        }\r\n    }\r\n\r\n    if (result == NULL) {\r\n        LOGE(\"[udp] cannot bind\");\r\n        return -1;\r\n    }\r\n\r\n    for (/*rp = result*/; rp != NULL; rp = rp->ai_next) {\r\n        server_sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);\r\n        if (server_sock == -1) {\r\n            continue;\r\n        }\r\n\r\n        if (rp->ai_family == AF_INET6) {\r\n            int ipv6only = host ? 1 : 0;\r\n            setsockopt(server_sock, IPPROTO_IPV6, IPV6_V6ONLY, &ipv6only, sizeof(ipv6only));\r\n        }\r\n\r\n        int opt = 1;\r\n        setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));\r\n#ifdef SO_NOSIGPIPE\r\n        set_nosigpipe(server_sock);\r\n#endif\r\n        int err = set_reuseport(server_sock);\r\n        if (err == 0) {\r\n            LOGI(\"udp port reuse enabled\");\r\n        }\r\n#ifdef IP_TOS\r\n        // Set QoS flag\r\n        int tos = 46;\r\n        setsockopt(server_sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));\r\n#endif\r\n\r\n#ifdef MODULE_REDIR\r\n        if (setsockopt(server_sock, SOL_IP, IP_TRANSPARENT, &opt, sizeof(opt))) {\r\n            ERROR(\"[udp] setsockopt IP_TRANSPARENT\");\r\n            exit(EXIT_FAILURE);\r\n        }\r\n        if (rp->ai_family == AF_INET) {\r\n            if (setsockopt(server_sock, SOL_IP, IP_RECVORIGDSTADDR, &opt, sizeof(opt))) {\r\n                FATAL(\"[udp] setsockopt IP_RECVORIGDSTADDR\");\r\n            }\r\n        } else if (rp->ai_family == AF_INET6) {\r\n            if (setsockopt(server_sock, SOL_IPV6, IPV6_RECVORIGDSTADDR, &opt, sizeof(opt))) {\r\n                FATAL(\"[udp] setsockopt IPV6_RECVORIGDSTADDR\");\r\n            }\r\n        }\r\n#endif\r\n\r\n        s = bind(server_sock, rp->ai_addr, rp->ai_addrlen);\r\n        if (s == 0) {\r\n            /* We managed to bind successfully! */\r\n            break;\r\n        } else {\r\n            ERROR(\"[udp] bind\");\r\n        }\r\n\r\n        close(server_sock);\r\n        server_sock = -1;\r\n    }\r\n\r\n    freeaddrinfo(result);\r\n\r\n    return server_sock;\r\n}\r\n\r\nremote_ctx_t *\r\nnew_remote(int fd, server_ctx_t *server_ctx)\r\n{\r\n    remote_ctx_t *ctx = ss_malloc(sizeof(remote_ctx_t));\r\n    memset(ctx, 0, sizeof(remote_ctx_t));\r\n\r\n    ctx->fd         = fd;\r\n    ctx->server_ctx = server_ctx;\r\n\r\n    ev_io_init(&ctx->io, remote_recv_cb, fd, EV_READ);\r\n    ev_timer_init(&ctx->watcher, remote_timeout_cb, server_ctx->timeout,\r\n                  server_ctx->timeout);\r\n\r\n    return ctx;\r\n}\r\n\r\nserver_ctx_t *\r\nnew_server_ctx(int fd)\r\n{\r\n    server_ctx_t *ctx = ss_malloc(sizeof(server_ctx_t));\r\n    memset(ctx, 0, sizeof(server_ctx_t));\r\n\r\n    ctx->fd = fd;\r\n\r\n    ev_io_init(&ctx->io, server_recv_cb, fd, EV_READ);\r\n\r\n    return ctx;\r\n}\r\n\r\n#ifdef MODULE_REMOTE\r\nstruct query_ctx *\r\nnew_query_ctx(char *buf, size_t len)\r\n{\r\n    struct query_ctx *ctx = ss_malloc(sizeof(struct query_ctx));\r\n    memset(ctx, 0, sizeof(struct query_ctx));\r\n    ctx->buf = ss_malloc(sizeof(buffer_t));\r\n    balloc(ctx->buf, len);\r\n    memcpy(ctx->buf->array, buf, len);\r\n    ctx->buf->len = len;\r\n    return ctx;\r\n}\r\n\r\nvoid\r\nclose_and_free_query(EV_P_ struct query_ctx *ctx)\r\n{\r\n    if (ctx != NULL) {\r\n        if (ctx->query != NULL) {\r\n            resolv_cancel(ctx->query);\r\n            ctx->query = NULL;\r\n        }\r\n        if (ctx->buf != NULL) {\r\n            bfree(ctx->buf);\r\n            ss_free(ctx->buf);\r\n        }\r\n        ss_free(ctx);\r\n    }\r\n}\r\n\r\n#endif\r\n\r\nvoid\r\nclose_and_free_remote(EV_P_ remote_ctx_t *ctx)\r\n{\r\n    if (ctx != NULL) {\r\n        ev_timer_stop(EV_A_ & ctx->watcher);\r\n        ev_io_stop(EV_A_ & ctx->io);\r\n        close(ctx->fd);\r\n        ss_free(ctx);\r\n    }\r\n}\r\n\r\nstatic void\r\nremote_timeout_cb(EV_P_ ev_timer *watcher, int revents)\r\n{\r\n    remote_ctx_t *remote_ctx\r\n        = cork_container_of(watcher, remote_ctx_t, watcher);\r\n\r\n    if (verbose) {\r\n        LOGI(\"[udp] connection timeout\");\r\n    }\r\n\r\n    char *key = hash_key(remote_ctx->af, &remote_ctx->src_addr);\r\n    cache_remove(remote_ctx->server_ctx->conn_cache, key, HASH_KEY_LEN);\r\n}\r\n\r\n#ifdef MODULE_REMOTE\r\nstatic void\r\nquery_resolve_cb(struct sockaddr *addr, void *data)\r\n{\r\n    struct query_ctx *query_ctx = (struct query_ctx *)data;\r\n    struct ev_loop *loop        = query_ctx->server_ctx->loop;\r\n\r\n    if (verbose) {\r\n        LOGI(\"[udp] udns resolved\");\r\n    }\r\n\r\n    query_ctx->query = NULL;\r\n\r\n    if (addr == NULL) {\r\n        LOGE(\"[udp] udns returned an error\");\r\n    } else {\r\n        remote_ctx_t *remote_ctx = query_ctx->remote_ctx;\r\n        int cache_hit            = 0;\r\n\r\n        // Lookup in the conn cache\r\n        if (remote_ctx == NULL) {\r\n            char *key = hash_key(AF_UNSPEC, &query_ctx->src_addr);\r\n            cache_lookup(query_ctx->server_ctx->conn_cache, key, HASH_KEY_LEN, (void *)&remote_ctx);\r\n        }\r\n\r\n        if (remote_ctx == NULL) {\r\n            int remotefd = create_remote_socket(addr->sa_family == AF_INET6);\r\n            if (remotefd != -1) {\r\n                setnonblocking(remotefd);\r\n#ifdef SO_BROADCAST\r\n                set_broadcast(remotefd);\r\n#endif\r\n#ifdef SO_NOSIGPIPE\r\n                set_nosigpipe(remotefd);\r\n#endif\r\n#ifdef IP_TOS\r\n                // Set QoS flag\r\n                int tos = 46;\r\n                setsockopt(remotefd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));\r\n#endif\r\n#ifdef SET_INTERFACE\r\n                if (query_ctx->server_ctx->iface) {\r\n                    if (setinterface(remotefd, query_ctx->server_ctx->iface) == -1)\r\n                        ERROR(\"setinterface\");\r\n                }\r\n#endif\r\n                remote_ctx                  = new_remote(remotefd, query_ctx->server_ctx);\r\n                remote_ctx->src_addr        = query_ctx->src_addr;\r\n                remote_ctx->server_ctx      = query_ctx->server_ctx;\r\n                remote_ctx->addr_header_len = query_ctx->addr_header_len;\r\n                memcpy(remote_ctx->addr_header, query_ctx->addr_header,\r\n                       query_ctx->addr_header_len);\r\n            } else {\r\n                ERROR(\"[udp] bind() error\");\r\n            }\r\n        } else {\r\n            cache_hit = 1;\r\n        }\r\n\r\n        if (remote_ctx != NULL) {\r\n            memcpy(&remote_ctx->dst_addr, addr, sizeof(struct sockaddr_storage));\r\n\r\n            size_t addr_len = get_sockaddr_len(addr);\r\n            int s           = sendto(remote_ctx->fd, query_ctx->buf->array, query_ctx->buf->len,\r\n                                     0, addr, addr_len);\r\n\r\n            if (s == -1) {\r\n                ERROR(\"[udp] sendto_remote\");\r\n                if (!cache_hit) {\r\n                    close_and_free_remote(EV_A_ remote_ctx);\r\n                }\r\n            } else {\r\n                if (!cache_hit) {\r\n                    // Add to conn cache\r\n                    char *key = hash_key(AF_UNSPEC, &remote_ctx->src_addr);\r\n                    cache_insert(query_ctx->server_ctx->conn_cache, key, HASH_KEY_LEN, (void *)remote_ctx);\r\n                    ev_io_start(EV_A_ & remote_ctx->io);\r\n                    ev_timer_start(EV_A_ & remote_ctx->watcher);\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    // clean up\r\n    close_and_free_query(EV_A_ query_ctx);\r\n}\r\n\r\n#endif\r\n\r\nstatic void\r\nremote_recv_cb(EV_P_ ev_io *w, int revents)\r\n{\r\n    ssize_t r;\r\n    remote_ctx_t *remote_ctx = (remote_ctx_t *)w;\r\n    server_ctx_t *server_ctx = remote_ctx->server_ctx;\r\n\r\n    // server has been closed\r\n    if (server_ctx == NULL) {\r\n        LOGE(\"[udp] invalid server\");\r\n        close_and_free_remote(EV_A_ remote_ctx);\r\n        return;\r\n    }\r\n\r\n    struct sockaddr_storage src_addr;\r\n    socklen_t src_addr_len = sizeof(struct sockaddr_storage);\r\n    memset(&src_addr, 0, src_addr_len);\r\n\r\n    buffer_t *buf = ss_malloc(sizeof(buffer_t));\r\n    balloc(buf, buf_size);\r\n\r\n    // recv\r\n    r = recvfrom(remote_ctx->fd, buf->array, buf_size, 0, (struct sockaddr *)&src_addr, &src_addr_len);\r\n\r\n    if (r == -1) {\r\n        // error on recv\r\n        // simply drop that packet\r\n        ERROR(\"[udp] remote_recv_recvfrom\");\r\n        goto CLEAN_UP;\r\n    } else if (r > packet_size) {\r\n        LOGE(\"[udp] remote_recv_recvfrom fragmentation\");\r\n        goto CLEAN_UP;\r\n    }\r\n\r\n    buf->len = r;\r\n\r\n#ifdef MODULE_LOCAL\r\n    int err = ss_decrypt_all(server_ctx->cipher_env, buf, buf_size);\r\n    if (err) {\r\n        // drop the packet silently\r\n        goto CLEAN_UP;\r\n    }\r\n\r\n    //SSR beg\r\n    if (server_ctx->protocol_plugin) {\r\n        obfs_class *protocol_plugin = server_ctx->protocol_plugin;\r\n        if (protocol_plugin->client_udp_post_decrypt) {\r\n            buf->len = protocol_plugin->client_udp_post_decrypt(server_ctx->protocol, &buf->array, buf->len, &buf->capacity);\r\n            if ((int)buf->len < 0) {\r\n                LOGE(\"client_udp_post_decrypt\");\r\n                close_and_free_remote(EV_A_ remote_ctx);\r\n                return;\r\n            }\r\n            if ( buf->len == 0 )\r\n                return;\r\n        }\r\n    }\r\n    // SSR end\r\n\r\n#ifdef MODULE_REDIR\r\n    struct sockaddr_storage dst_addr;\r\n    memset(&dst_addr, 0, sizeof(struct sockaddr_storage));\r\n    int len = parse_udprealy_header(buf->array, buf->len, NULL, NULL, &dst_addr);\r\n\r\n    if (dst_addr.ss_family != AF_INET && dst_addr.ss_family != AF_INET6) {\r\n        LOGI(\"[udp] ss-redir does not support domain name\");\r\n        goto CLEAN_UP;\r\n    }\r\n\r\n    if (verbose) {\r\n        char src[SS_ADDRSTRLEN];\r\n        char dst[SS_ADDRSTRLEN];\r\n        strcpy(src, get_addr_str((struct sockaddr *)&src_addr));\r\n        strcpy(dst, get_addr_str((struct sockaddr *)&dst_addr));\r\n        LOGI(\"[udp] recv %s via %s\", dst, src);\r\n    }\r\n#else\r\n    int len = parse_udprealy_header(buf->array, buf->len, NULL, NULL, NULL);\r\n#endif\r\n\r\n    if (len == 0) {\r\n        LOGI(\"[udp] error in parse header\");\r\n        // error in parse header\r\n        goto CLEAN_UP;\r\n    }\r\n\r\n    // server may return using a different address type other than the type we\r\n    // have used during sending\r\n#if defined(MODULE_TUNNEL) || defined(MODULE_REDIR)\r\n    // Construct packet\r\n    buf->len -= len;\r\n    memmove(buf->array, buf->array + len, buf->len);\r\n#else\r\n#ifdef ANDROID\r\n    if (r > 0 && log_tx_rx)\r\n        rx += r;\r\n#endif\r\n    // Construct packet\r\n    if (server_ctx->tunnel_addr.host && server_ctx->tunnel_addr.port) {\r\n        buf->len -= len;\r\n        memmove(buf->array, buf->array + len, buf->len);\r\n    } else {\r\n        brealloc(buf, buf->len + 3, buf_size);\r\n        memmove(buf->array + 3, buf->array, buf->len);\r\n        memset(buf->array, 0, 3);\r\n        buf->len += 3;\r\n    }\r\n#endif\r\n\r\n#endif\r\n\r\n#ifdef MODULE_REMOTE\r\n\r\n    rx += buf->len;\r\n\r\n    char addr_header_buf[512];\r\n    char *addr_header   = remote_ctx->addr_header;\r\n    int addr_header_len = remote_ctx->addr_header_len;\r\n\r\n    if (remote_ctx->af == AF_INET || remote_ctx->af == AF_INET6) {\r\n        addr_header_len = construct_udprealy_header(&src_addr, addr_header_buf);\r\n        addr_header     = addr_header_buf;\r\n    }\r\n\r\n    // Construct packet\r\n    brealloc(buf, buf->len + addr_header_len, buf_size);\r\n    memmove(buf->array + addr_header_len, buf->array, buf->len);\r\n    memcpy(buf->array, addr_header, addr_header_len);\r\n    buf->len += addr_header_len;\r\n\r\n    int err = ss_decrypt_all(server_ctx->cipher_env, buf, buf_size);\r\n    if (err) {\r\n        // drop the packet silently\r\n        goto CLEAN_UP;\r\n    }\r\n\r\n#endif\r\n\r\n    if (buf->len > packet_size) {\r\n        LOGE(\"[udp] remote_recv_sendto fragmentation\");\r\n        goto CLEAN_UP;\r\n    }\r\n\r\n    size_t remote_src_addr_len = get_sockaddr_len((struct sockaddr *)&remote_ctx->src_addr);\r\n\r\n#ifdef MODULE_REDIR\r\n\r\n    size_t remote_dst_addr_len = get_sockaddr_len((struct sockaddr *)&dst_addr);\r\n\r\n    int src_fd = socket(remote_ctx->src_addr.ss_family, SOCK_DGRAM, 0);\r\n    if (src_fd < 0) {\r\n        ERROR(\"[udp] remote_recv_socket\");\r\n        goto CLEAN_UP;\r\n    }\r\n    int opt = 1;\r\n    if (setsockopt(src_fd, SOL_IP, IP_TRANSPARENT, &opt, sizeof(opt))) {\r\n        ERROR(\"[udp] remote_recv_setsockopt\");\r\n        close(src_fd);\r\n        goto CLEAN_UP;\r\n    }\r\n    if (setsockopt(src_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {\r\n        ERROR(\"[udp] remote_recv_setsockopt\");\r\n        close(src_fd);\r\n        goto CLEAN_UP;\r\n    }\r\n#ifdef IP_TOS\r\n    // Set QoS flag\r\n    int tos = 46;\r\n    setsockopt(src_fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));\r\n#endif\r\n    if (bind(src_fd, (struct sockaddr *)&dst_addr, remote_dst_addr_len) != 0) {\r\n        ERROR(\"[udp] remote_recv_bind\");\r\n        close(src_fd);\r\n        goto CLEAN_UP;\r\n    }\r\n\r\n    int s = sendto(src_fd, buf->array, buf->len, 0,\r\n                   (struct sockaddr *)&remote_ctx->src_addr, remote_src_addr_len);\r\n    if (s == -1) {\r\n        ERROR(\"[udp] remote_recv_sendto\");\r\n        close(src_fd);\r\n        goto CLEAN_UP;\r\n    }\r\n    close(src_fd);\r\n\r\n#else\r\n\r\n    int s = sendto(server_ctx->fd, buf->array, buf->len, 0,\r\n                   (struct sockaddr *)&remote_ctx->src_addr, remote_src_addr_len);\r\n    if (s == -1) {\r\n        ERROR(\"[udp] remote_recv_sendto\");\r\n        goto CLEAN_UP;\r\n    }\r\n\r\n#endif\r\n\r\n    // handle the UDP packet successfully,\r\n    // triger the timer\r\n    ev_timer_again(EV_A_ & remote_ctx->watcher);\r\n\r\nCLEAN_UP:\r\n\r\n    bfree(buf);\r\n    ss_free(buf);\r\n}\r\n\r\nstatic void\r\nserver_recv_cb(EV_P_ ev_io *w, int revents)\r\n{\r\n    server_ctx_t *server_ctx = (server_ctx_t *)w;\r\n    struct sockaddr_storage src_addr;\r\n    memset(&src_addr, 0, sizeof(struct sockaddr_storage));\r\n\r\n    buffer_t *buf = ss_malloc(sizeof(buffer_t));\r\n    balloc(buf, buf_size);\r\n\r\n    socklen_t src_addr_len = sizeof(struct sockaddr_storage);\r\n    unsigned int offset    = 0;\r\n\r\n#ifdef MODULE_REDIR\r\n    char control_buffer[64] = { 0 };\r\n    struct msghdr msg;\r\n    memset(&msg, 0, sizeof(struct msghdr));\r\n    struct iovec iov[1];\r\n    struct sockaddr_storage dst_addr;\r\n    memset(&dst_addr, 0, sizeof(struct sockaddr_storage));\r\n\r\n    msg.msg_name       = &src_addr;\r\n    msg.msg_namelen    = src_addr_len;\r\n    msg.msg_control    = control_buffer;\r\n    msg.msg_controllen = sizeof(control_buffer);\r\n\r\n    iov[0].iov_base = buf->array;\r\n    iov[0].iov_len  = buf_size;\r\n    msg.msg_iov     = iov;\r\n    msg.msg_iovlen  = 1;\r\n\r\n    buf->len = recvmsg(server_ctx->fd, &msg, 0);\r\n    if (buf->len == -1) {\r\n        ERROR(\"[udp] server_recvmsg\");\r\n        goto CLEAN_UP;\r\n    } else if (buf->len > packet_size) {\r\n        ERROR(\"[udp] UDP server_recv_recvmsg fragmentation\");\r\n        goto CLEAN_UP;\r\n    }\r\n\r\n    if (get_dstaddr(&msg, &dst_addr)) {\r\n        LOGE(\"[udp] unable to get dest addr\");\r\n        goto CLEAN_UP;\r\n    }\r\n\r\n    src_addr_len = msg.msg_namelen;\r\n#else\r\n    ssize_t r;\r\n    r = recvfrom(server_ctx->fd, buf->array, buf_size,\r\n                 0, (struct sockaddr *)&src_addr, &src_addr_len);\r\n\r\n    if (r == -1) {\r\n        // error on recv\r\n        // simply drop that packet\r\n        ERROR(\"[udp] server_recv_recvfrom\");\r\n        goto CLEAN_UP;\r\n    } else if (r > packet_size) {\r\n        ERROR(\"[udp] server_recv_recvfrom fragmentation\");\r\n        goto CLEAN_UP;\r\n    }\r\n\r\n    buf->len = r;\r\n#endif\r\n\r\n#ifdef MODULE_REMOTE\r\n    tx += buf->len;\r\n\r\n    int err = ss_decrypt_all(server_ctx->cipher_env, buf, buf_size);\r\n    if (err) {\r\n        // drop the packet silently\r\n        goto CLEAN_UP;\r\n    }\r\n#endif\r\n\r\n    /*\r\n     *\r\n     * SOCKS5 UDP Request\r\n     * +----+------+------+----------+----------+----------+\r\n     * |RSV | FRAG | ATYP | DST.ADDR | DST.PORT |   DATA   |\r\n     * +----+------+------+----------+----------+----------+\r\n     * | 2  |  1   |  1   | Variable |    2     | Variable |\r\n     * +----+------+------+----------+----------+----------+\r\n     *\r\n     * SOCKS5 UDP Response\r\n     * +----+------+------+----------+----------+----------+\r\n     * |RSV | FRAG | ATYP | DST.ADDR | DST.PORT |   DATA   |\r\n     * +----+------+------+----------+----------+----------+\r\n     * | 2  |  1   |  1   | Variable |    2     | Variable |\r\n     * +----+------+------+----------+----------+----------+\r\n     *\r\n     * shadowsocks UDP Request (before encrypted)\r\n     * +------+----------+----------+----------+\r\n     * | ATYP | DST.ADDR | DST.PORT |   DATA   |\r\n     * +------+----------+----------+----------+\r\n     * |  1   | Variable |    2     | Variable |\r\n     * +------+----------+----------+----------+\r\n     *\r\n     * shadowsocks UDP Response (before encrypted)\r\n     * +------+----------+----------+----------+\r\n     * | ATYP | DST.ADDR | DST.PORT |   DATA   |\r\n     * +------+----------+----------+----------+\r\n     * |  1   | Variable |    2     | Variable |\r\n     * +------+----------+----------+----------+\r\n     *\r\n     * shadowsocks UDP Request and Response (after encrypted)\r\n     * +-------+--------------+\r\n     * |   IV  |    PAYLOAD   |\r\n     * +-------+--------------+\r\n     * | Fixed |   Variable   |\r\n     * +-------+--------------+\r\n     *\r\n     */\r\n\r\n#ifdef MODULE_REDIR\r\n    if (verbose) {\r\n        char src[SS_ADDRSTRLEN];\r\n        char dst[SS_ADDRSTRLEN];\r\n        strcpy(src, get_addr_str((struct sockaddr *)&src_addr));\r\n        strcpy(dst, get_addr_str((struct sockaddr *)&dst_addr));\r\n        LOGI(\"[udp] redir to %s from %s\", dst, src);\r\n    }\r\n\r\n    char addr_header[512] = { 0 };\r\n    int addr_header_len   = construct_udprealy_header(&dst_addr, addr_header);\r\n\r\n    if (addr_header_len == 0) {\r\n        LOGE(\"[udp] failed to parse tproxy addr\");\r\n        goto CLEAN_UP;\r\n    }\r\n\r\n    // reconstruct the buffer\r\n    brealloc(buf, buf->len + addr_header_len, buf_size);\r\n    memmove(buf->array + addr_header_len, buf->array, buf->len);\r\n    memcpy(buf->array, addr_header, addr_header_len);\r\n    buf->len += addr_header_len;\r\n\r\n#else\r\n\r\n    char addr_header[512] = { 0 };\r\n    int addr_header_len   = 0;\r\n    uint8_t frag = 0;\r\n\r\n    char host[257] = { 0 };\r\n    char port[65]  = { 0 };\r\n    if (server_ctx->tunnel_addr.host && server_ctx->tunnel_addr.port) {\r\n        strncpy(host, server_ctx->tunnel_addr.host, 256);\r\n        strncpy(port, server_ctx->tunnel_addr.port, 64);\r\n        uint16_t port_num     = (uint16_t)atoi(port);\r\n        uint16_t port_net_num = htons(port_num);\r\n\r\n        struct cork_ip ip;\r\n        if (cork_ip_init(&ip, host) != -1) {\r\n            if (ip.version == 4) {\r\n                // send as IPv4\r\n                struct in_addr host_addr;\r\n                memset(&host_addr, 0, sizeof(struct in_addr));\r\n                int host_len = sizeof(struct in_addr);\r\n\r\n                if (dns_pton(AF_INET, host, &host_addr) == -1) {\r\n                    FATAL(\"IP parser error\");\r\n                }\r\n                addr_header[addr_header_len++] = 1;\r\n                memcpy(addr_header + addr_header_len, &host_addr, host_len);\r\n                addr_header_len += host_len;\r\n            } else if (ip.version == 6) {\r\n                // send as IPv6\r\n                struct in6_addr host_addr;\r\n                memset(&host_addr, 0, sizeof(struct in6_addr));\r\n                int host_len = sizeof(struct in6_addr);\r\n\r\n                if (dns_pton(AF_INET6, host, &host_addr) == -1) {\r\n                    FATAL(\"IP parser error\");\r\n                }\r\n                addr_header[addr_header_len++] = 4;\r\n                memcpy(addr_header + addr_header_len, &host_addr, host_len);\r\n                addr_header_len += host_len;\r\n            } else {\r\n                FATAL(\"IP parser error\");\r\n            }\r\n        } else {\r\n            // send as domain\r\n            int host_len = strlen(host);\r\n\r\n            addr_header[addr_header_len++] = 3;\r\n            addr_header[addr_header_len++] = host_len;\r\n            memcpy(addr_header + addr_header_len, host, host_len);\r\n            addr_header_len += host_len;\r\n        }\r\n        memcpy(addr_header + addr_header_len, &port_net_num, 2);\r\n        addr_header_len += 2;\r\n\r\n        // reconstruct the buffer\r\n        brealloc(buf, buf->len + addr_header_len, buf_size);\r\n        memmove(buf->array + addr_header_len, buf->array, buf->len);\r\n        memcpy(buf->array, addr_header, addr_header_len);\r\n        buf->len += addr_header_len;\r\n\r\n    } else {\r\n\r\n        frag = *(uint8_t *)(buf->array + 2);\r\n        offset += 3;\r\n        struct sockaddr_storage dst_addr;\r\n        memset(&dst_addr, 0, sizeof(struct sockaddr_storage));\r\n\r\n        addr_header_len = parse_udprealy_header(buf->array + offset, buf->len - offset,\r\n                                                    host, port, &dst_addr);\r\n        if (addr_header_len == 0) {\r\n            // error in parse header\r\n            goto CLEAN_UP;\r\n        }\r\n\r\n        strncpy(addr_header, buf->array + offset, addr_header_len);\r\n    }\r\n#endif\r\n\r\n#ifdef MODULE_LOCAL\r\n    char *key = hash_key(server_ctx->remote_addr->sa_family, &src_addr);\r\n#else\r\n    char *key = hash_key(dst_addr.ss_family, &src_addr);\r\n#endif\r\n\r\n    struct cache *conn_cache = server_ctx->conn_cache;\r\n\r\n    remote_ctx_t *remote_ctx = NULL;\r\n    cache_lookup(conn_cache, key, HASH_KEY_LEN, (void *)&remote_ctx);\r\n\r\n    if (remote_ctx != NULL) {\r\n        if (sockaddr_cmp(&src_addr, &remote_ctx->src_addr, sizeof(src_addr))) {\r\n            remote_ctx = NULL;\r\n        }\r\n    }\r\n\r\n    // reset the timer\r\n    if (remote_ctx != NULL) {\r\n        ev_timer_again(EV_A_ & remote_ctx->watcher);\r\n    }\r\n\r\n    if (remote_ctx == NULL) {\r\n        if (verbose) {\r\n#ifdef MODULE_REDIR\r\n            char src[SS_ADDRSTRLEN];\r\n            char dst[SS_ADDRSTRLEN];\r\n            strcpy(src, get_addr_str((struct sockaddr *)&src_addr));\r\n            strcpy(dst, get_addr_str((struct sockaddr *)&dst_addr));\r\n            LOGI(\"[udp] cache miss: %s <-> %s\", dst, src);\r\n#else\r\n            LOGI(\"[udp] cache miss: %s:%s <-> %s\", host, port,\r\n                 get_addr_str((struct sockaddr *)&src_addr));\r\n#endif\r\n        }\r\n    } else {\r\n        if (verbose) {\r\n#ifdef MODULE_REDIR\r\n            char src[SS_ADDRSTRLEN];\r\n            char dst[SS_ADDRSTRLEN];\r\n            strcpy(src, get_addr_str((struct sockaddr *)&src_addr));\r\n            strcpy(dst, get_addr_str((struct sockaddr *)&dst_addr));\r\n            LOGI(\"[udp] cache hit: %s <-> %s\", dst, src);\r\n#else\r\n            LOGI(\"[udp] cache hit: %s:%s <-> %s\", host, port,\r\n                 get_addr_str((struct sockaddr *)&src_addr));\r\n#endif\r\n        }\r\n    }\r\n\r\n#ifdef MODULE_LOCAL\r\n\r\n#if !defined(MODULE_TUNNEL) && !defined(MODULE_REDIR)\r\n    if (frag) {\r\n        LOGE(\"[udp] drop a message since frag is not 0, but %d\", frag);\r\n        goto CLEAN_UP;\r\n    }\r\n#endif\r\n\r\n    const struct sockaddr *remote_addr = server_ctx->remote_addr;\r\n    const int remote_addr_len          = server_ctx->remote_addr_len;\r\n\r\n    if (remote_ctx == NULL) {\r\n        // Bind to any port\r\n        int remotefd = create_remote_socket(remote_addr->sa_family == AF_INET6);\r\n        if (remotefd < 0) {\r\n            ERROR(\"[udp] udprelay bind() error\");\r\n            goto CLEAN_UP;\r\n        }\r\n        setnonblocking(remotefd);\r\n\r\n#ifdef SO_NOSIGPIPE\r\n        set_nosigpipe(remotefd);\r\n#endif\r\n#ifdef IP_TOS\r\n        // Set QoS flag\r\n        int tos = 46;\r\n        setsockopt(remotefd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));\r\n#endif\r\n#ifdef SET_INTERFACE\r\n        if (server_ctx->iface) {\r\n            if (setinterface(remotefd, server_ctx->iface) == -1)\r\n                ERROR(\"setinterface\");\r\n        }\r\n#endif\r\n\r\n#ifdef ANDROID\r\n        if (vpn) {\r\n            if (protect_socket(remotefd) == -1) {\r\n                ERROR(\"protect_socket\");\r\n                close(remotefd);\r\n                goto CLEAN_UP;\r\n            }\r\n        }\r\n#endif\r\n\r\n        // Init remote_ctx\r\n        remote_ctx                  = new_remote(remotefd, server_ctx);\r\n        remote_ctx->src_addr        = src_addr;\r\n        remote_ctx->af              = remote_addr->sa_family;\r\n        remote_ctx->addr_header_len = addr_header_len;\r\n        memcpy(remote_ctx->addr_header, addr_header, addr_header_len);\r\n\r\n        // Add to conn cache\r\n        cache_insert(conn_cache, key, HASH_KEY_LEN, (void *)remote_ctx);\r\n\r\n        // Start remote io\r\n        ev_io_start(EV_A_ & remote_ctx->io);\r\n        ev_timer_start(EV_A_ & remote_ctx->watcher);\r\n    }\r\n\r\n    if (offset > 0) {\r\n        buf->len -= offset;\r\n        memmove(buf->array, buf->array + offset, buf->len);\r\n    }\r\n\r\n    // SSR beg\r\n    if (server_ctx->protocol_plugin) {\r\n        obfs_class *protocol_plugin = server_ctx->protocol_plugin;\r\n        if (protocol_plugin->client_udp_pre_encrypt) {\r\n            buf->len = protocol_plugin->client_udp_pre_encrypt(server_ctx->protocol, &buf->array, buf->len, &buf->capacity);\r\n        }\r\n    }\r\n    //SSR end\r\n\r\n    int err = ss_encrypt_all(server_ctx->cipher_env, buf, buf->len);\r\n\r\n    if (err) {\r\n        // drop the packet silently\r\n        goto CLEAN_UP;\r\n    }\r\n\r\n    if (buf->len > packet_size) {\r\n        LOGE(\"[udp] server_recv_sendto fragmentation\");\r\n        goto CLEAN_UP;\r\n    }\r\n\r\n    int s = sendto(remote_ctx->fd, buf->array, buf->len, 0, remote_addr, remote_addr_len);\r\n\r\n    if (s == -1) {\r\n        ERROR(\"[udp] server_recv_sendto\");\r\n    }\r\n#if !defined(MODULE_TUNNEL) && !defined(MODULE_REDIR)\r\n#ifdef ANDROID\r\n    if (log_tx_rx)\r\n        tx += buf->len;\r\n#endif\r\n#endif\r\n\r\n#else\r\n\r\n    int cache_hit  = 0;\r\n    int need_query = 0;\r\n\r\n    if (buf->len - addr_header_len > packet_size) {\r\n        LOGE(\"[udp] server_recv_sendto fragmentation\");\r\n        goto CLEAN_UP;\r\n    }\r\n\r\n    if (remote_ctx != NULL) {\r\n        cache_hit = 1;\r\n        // detect destination mismatch\r\n        if (remote_ctx->addr_header_len != addr_header_len\r\n            || memcmp(addr_header, remote_ctx->addr_header, addr_header_len) != 0) {\r\n            if (dst_addr.ss_family != AF_INET && dst_addr.ss_family != AF_INET6) {\r\n                need_query = 1;\r\n            }\r\n        } else {\r\n            memcpy(&dst_addr, &remote_ctx->dst_addr, sizeof(struct sockaddr_storage));\r\n        }\r\n    } else {\r\n        if (dst_addr.ss_family == AF_INET || dst_addr.ss_family == AF_INET6) {\r\n            int remotefd = create_remote_socket(dst_addr.ss_family == AF_INET6);\r\n            if (remotefd != -1) {\r\n                setnonblocking(remotefd);\r\n#ifdef SO_BROADCAST\r\n                set_broadcast(remotefd);\r\n#endif\r\n#ifdef SO_NOSIGPIPE\r\n                set_nosigpipe(remotefd);\r\n#endif\r\n#ifdef IP_TOS\r\n                // Set QoS flag\r\n                int tos = 46;\r\n                setsockopt(remotefd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));\r\n#endif\r\n#ifdef SET_INTERFACE\r\n                if (server_ctx->iface) {\r\n                    if (setinterface(remotefd, server_ctx->iface) == -1)\r\n                        ERROR(\"setinterface\");\r\n                }\r\n#endif\r\n                remote_ctx                  = new_remote(remotefd, server_ctx);\r\n                remote_ctx->src_addr        = src_addr;\r\n                remote_ctx->server_ctx      = server_ctx;\r\n                remote_ctx->addr_header_len = addr_header_len;\r\n                memcpy(remote_ctx->addr_header, addr_header, addr_header_len);\r\n                memcpy(&remote_ctx->dst_addr, &dst_addr, sizeof(struct sockaddr_storage));\r\n            } else {\r\n                ERROR(\"[udp] bind() error\");\r\n                goto CLEAN_UP;\r\n            }\r\n        }\r\n    }\r\n\r\n    if (remote_ctx != NULL && !need_query) {\r\n        size_t addr_len = get_sockaddr_len((struct sockaddr *)&dst_addr);\r\n        int s           = sendto(remote_ctx->fd, buf->array + addr_header_len,\r\n                                 buf->len - addr_header_len, 0,\r\n                                 (struct sockaddr *)&dst_addr, addr_len);\r\n\r\n        if (s == -1) {\r\n            ERROR(\"[udp] sendto_remote\");\r\n            if (!cache_hit) {\r\n                close_and_free_remote(EV_A_ remote_ctx);\r\n            }\r\n        } else {\r\n            if (!cache_hit) {\r\n                // Add to conn cache\r\n                remote_ctx->af = dst_addr.ss_family;\r\n                char *key = hash_key(remote_ctx->af, &remote_ctx->src_addr);\r\n                cache_insert(server_ctx->conn_cache, key, HASH_KEY_LEN, (void *)remote_ctx);\r\n\r\n                ev_io_start(EV_A_ & remote_ctx->io);\r\n                ev_timer_start(EV_A_ & remote_ctx->watcher);\r\n            }\r\n        }\r\n    } else {\r\n        struct addrinfo hints;\r\n        memset(&hints, 0, sizeof(struct addrinfo));\r\n        hints.ai_family   = AF_UNSPEC;\r\n        hints.ai_socktype = SOCK_DGRAM;\r\n        hints.ai_protocol = IPPROTO_UDP;\r\n\r\n        struct query_ctx *query_ctx = new_query_ctx(buf->array + addr_header_len,\r\n                                                    buf->len - addr_header_len);\r\n        query_ctx->server_ctx      = server_ctx;\r\n        query_ctx->addr_header_len = addr_header_len;\r\n        query_ctx->src_addr        = src_addr;\r\n        memcpy(query_ctx->addr_header, addr_header, addr_header_len);\r\n\r\n        if (need_query) {\r\n            query_ctx->remote_ctx = remote_ctx;\r\n        }\r\n\r\n        struct ResolvQuery *query = resolv_query(host, query_resolve_cb,\r\n                                                 NULL, query_ctx, htons(atoi(port)));\r\n        if (query == NULL) {\r\n            ERROR(\"[udp] unable to create DNS query\");\r\n            close_and_free_query(EV_A_ query_ctx);\r\n            goto CLEAN_UP;\r\n        }\r\n        query_ctx->query = query;\r\n    }\r\n#endif\r\n\r\nCLEAN_UP:\r\n    bfree(buf);\r\n    ss_free(buf);\r\n}\r\n\r\nvoid\r\nfree_cb(void *key, void *element)\r\n{\r\n    remote_ctx_t *remote_ctx = (remote_ctx_t *)element;\r\n\r\n    if (verbose) {\r\n        LOGI(\"[udp] one connection freed\");\r\n    }\r\n\r\n    close_and_free_remote(EV_DEFAULT, remote_ctx);\r\n}\r\n\r\nint\r\ninit_udprelay(const char *server_host, const char *server_port,\r\n#ifdef MODULE_LOCAL\r\n              const struct sockaddr *remote_addr, const int remote_addr_len,\r\n              const ss_addr_t tunnel_addr,\r\n#endif\r\n              int mtu, int timeout, const char *iface,\r\n              cipher_env_t* cipher_env, const char *protocol, const char *protocol_param)\r\n{\r\n    // Initialize ev loop\r\n    struct ev_loop *loop = EV_DEFAULT;\r\n\r\n    // Initialize MTU\r\n    if (mtu > 0) {\r\n        packet_size = mtu - 1 - 28 - 2 - 64;\r\n        buf_size    = packet_size * 2;\r\n    }\r\n\r\n    // Initialize cache\r\n    struct cache *conn_cache;\r\n    cache_create(&conn_cache, MAX_UDP_CONN_NUM, free_cb);\r\n\r\n    // ////////////////////////////////////////////////\r\n    // Setup server context\r\n\r\n    // Bind to port\r\n    int serverfd = create_server_socket(server_host, server_port);\r\n    if (serverfd < 0) {\r\n        FATAL(\"[udp] bind() error\");\r\n    }\r\n    setnonblocking(serverfd);\r\n\r\n    server_ctx_t *server_ctx = new_server_ctx(serverfd);\r\n\r\n    server_ctx->cipher_env = cipher_env;\r\n#ifdef MODULE_REMOTE\r\n    server_ctx->loop = loop;\r\n#endif\r\n    server_ctx->timeout    = max(timeout, MIN_UDP_TIMEOUT);\r\n    server_ctx->iface      = iface;\r\n    server_ctx->conn_cache = conn_cache;\r\n#ifdef MODULE_LOCAL\r\n    server_ctx->remote_addr     = remote_addr;\r\n    server_ctx->remote_addr_len = remote_addr_len;\r\n    //SSR beg\r\n    server_ctx->protocol_plugin = new_obfs_class((char *)protocol);\r\n    if (server_ctx->protocol_plugin) {\r\n        server_ctx->protocol = server_ctx->protocol_plugin->new_obfs();\r\n        server_ctx->protocol_global = server_ctx->protocol_plugin->init_data();\r\n    }\r\n\r\n    server_info _server_info;\r\n    memset(&_server_info, 0, sizeof(server_info));\r\n    strcpy(_server_info.host, server_host);\r\n    _server_info.port = atoi(server_port);\r\n    _server_info.g_data = server_ctx->protocol_global;\r\n    _server_info.param = (char *)protocol_param;\r\n    _server_info.key = enc_get_key(cipher_env);\r\n    _server_info.key_len = enc_get_key_len(cipher_env);\r\n\r\n    if (server_ctx->protocol_plugin)\r\n        server_ctx->protocol_plugin->set_server_info(server_ctx->protocol, &_server_info);\r\n    //SSR end\r\n    server_ctx->tunnel_addr = tunnel_addr;\r\n#endif\r\n\r\n    ev_io_start(loop, &server_ctx->io);\r\n\r\n    server_ctx_list[server_num++] = server_ctx;\r\n\r\n    return 0;\r\n}\r\n\r\nvoid\r\nfree_udprelay()\r\n{\r\n    struct ev_loop *loop = EV_DEFAULT;\r\n    while (server_num-- > 0) {\r\n        server_ctx_t *server_ctx = server_ctx_list[server_num];\r\n\r\n#ifdef MODULE_LOCAL\r\n        //SSR beg\r\n        if (server_ctx->protocol_plugin) {\r\n            server_ctx->protocol_plugin->dispose(server_ctx->protocol);\r\n            server_ctx->protocol = NULL;\r\n            free_obfs_class(server_ctx->protocol_plugin);\r\n            server_ctx->protocol_plugin = NULL;\r\n        }\r\n        //SSR end\r\n#endif\r\n\r\n        ev_io_stop(loop, &server_ctx->io);\r\n        close(server_ctx->fd);\r\n        cache_delete(server_ctx->conn_cache, 0);\r\n        ss_free(server_ctx);\r\n        server_ctx_list[server_num] = NULL;\r\n    }\r\n}\r\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/udprelay.h",
    "content": "/*\r\n * udprelay.h - Define UDP relay's buffers and callbacks\r\n *\r\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\r\n *\r\n * This file is part of the shadowsocks-libev.\r\n *\r\n * shadowsocks-libev is free software; you can redistribute it and/or modify\r\n * it under the terms of the GNU General Public License as published by\r\n * the Free Software Foundation; either version 3 of the License, or\r\n * (at your option) any later version.\r\n *\r\n * shadowsocks-libev is distributed in the hope that it will be useful,\r\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\r\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\r\n * GNU General Public License for more details.\r\n *\r\n * You should have received a copy of the GNU General Public License\r\n * along with shadowsocks-libev; see the file COPYING. If not, see\r\n * <http://www.gnu.org/licenses/>.\r\n */\r\n\r\n#ifndef _UDPRELAY_H\r\n#define _UDPRELAY_H\r\n\r\n#include <ev.h>\r\n#include <time.h>\r\n\r\n#include \"encrypt.h\"\r\n#include \"jconf.h\"\r\n#include \"obfs/obfs.h\"\r\n\r\n#ifdef MODULE_REMOTE\r\n#include \"resolv.h\"\r\n#endif\r\n\r\n#include \"cache.h\"\r\n\r\n#include \"common.h\"\r\n\r\n#define MAX_UDP_PACKET_SIZE (65507)\r\n\r\n#define DEFAULT_PACKET_SIZE MAX_UDP_PACKET_SIZE // 1492 - 1 - 28 - 2 - 64 = 1397, the default MTU for UDP relay\r\n\r\ntypedef struct server_ctx {\r\n    ev_io io;\r\n    int fd;\r\n//    int method;\r\n    int timeout;\r\n    const char *iface;\r\n    struct cache *conn_cache;\r\n#ifdef MODULE_LOCAL\r\n    const struct sockaddr *remote_addr;\r\n    int remote_addr_len;\r\n    ss_addr_t tunnel_addr;\r\n#endif\r\n#ifdef MODULE_REMOTE\r\n    struct ev_loop *loop;\r\n#endif\r\n    cipher_env_t* cipher_env;\r\n    // SSR\r\n    obfs *protocol;\r\n    obfs_class *protocol_plugin;\r\n    void *protocol_global;\r\n} server_ctx_t;\r\n\r\n#ifdef MODULE_REMOTE\r\ntypedef struct query_ctx {\r\n    struct ResolvQuery *query;\r\n    struct sockaddr_storage src_addr;\r\n    buffer_t *buf;\r\n    int addr_header_len;\r\n    char addr_header[384];\r\n    struct server_ctx *server_ctx;\r\n    struct remote_ctx *remote_ctx;\r\n} query_ctx_t;\r\n#endif\r\n\r\ntypedef struct remote_ctx {\r\n    ev_io io;\r\n    ev_timer watcher;\r\n    int af;\r\n    int fd;\r\n    int addr_header_len;\r\n    char addr_header[384];\r\n    struct sockaddr_storage src_addr;\r\n#ifdef MODULE_REMOTE\r\n    struct sockaddr_storage dst_addr;\r\n#endif\r\n    struct server_ctx *server_ctx;\r\n} remote_ctx_t;\r\n\r\n#endif // _UDPRELAY_H\r\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/uthash.h",
    "content": "/*\nCopyright (c) 2003-2016, Troy D. Hanson     http://troydhanson.github.com/uthash/\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER\nOR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\nEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\nPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef UTHASH_H\n#define UTHASH_H\n\n#define UTHASH_VERSION 2.0.1\n\n#include <string.h>   /* memcmp,strlen */\n#include <stddef.h>   /* ptrdiff_t */\n#include <stdlib.h>   /* exit() */\n\n/* These macros use decltype or the earlier __typeof GNU extension.\n   As decltype is only available in newer compilers (VS2010 or gcc 4.3+\n   when compiling c++ source) this code uses whatever method is needed\n   or, for VS2008 where neither is available, uses casting workarounds. */\n#if defined(_MSC_VER)   /* MS compiler */\n#if _MSC_VER >= 1600 && defined(__cplusplus)  /* VS2010 or newer in C++ mode */\n#define DECLTYPE(x) (decltype(x))\n#else                   /* VS2008 or older (or VS2010 in C mode) */\n#define NO_DECLTYPE\n#define DECLTYPE(x)\n#endif\n#elif defined(__BORLANDC__) || defined(__LCC__) || defined(__WATCOMC__)\n#define NO_DECLTYPE\n#define DECLTYPE(x)\n#else                   /* GNU, Sun and other compilers */\n#define DECLTYPE(x) (__typeof(x))\n#endif\n\n#ifdef NO_DECLTYPE\n#define DECLTYPE_ASSIGN(dst,src)                                                 \\\ndo {                                                                             \\\n  char **_da_dst = (char**)(&(dst));                                             \\\n  *_da_dst = (char*)(src);                                                       \\\n} while (0)\n#else\n#define DECLTYPE_ASSIGN(dst,src)                                                 \\\ndo {                                                                             \\\n  (dst) = DECLTYPE(dst)(src);                                                    \\\n} while (0)\n#endif\n\n/* a number of the hash function use uint32_t which isn't defined on Pre VS2010 */\n#if defined(_WIN32)\n#if defined(_MSC_VER) && _MSC_VER >= 1600\n#include <stdint.h>\n#elif defined(__WATCOMC__) || defined(__MINGW32__) || defined(__CYGWIN__)\n#include <stdint.h>\n#else\ntypedef unsigned int uint32_t;\ntypedef unsigned char uint8_t;\n#endif\n#elif defined(__GNUC__) && !defined(__VXWORKS__)\n#include <stdint.h>\n#else\ntypedef unsigned int uint32_t;\ntypedef unsigned char uint8_t;\n#endif\n\n#ifndef uthash_fatal\n#define uthash_fatal(msg) exit(-1)        /* fatal error (out of memory,etc) */\n#endif\n#ifndef uthash_malloc\n#define uthash_malloc(sz) malloc(sz)      /* malloc fcn                      */\n#endif\n#ifndef uthash_free\n#define uthash_free(ptr,sz) free(ptr)     /* free fcn                        */\n#endif\n#ifndef uthash_strlen\n#define uthash_strlen(s) strlen(s)\n#endif\n#ifndef uthash_memcmp\n#define uthash_memcmp(a,b,n) memcmp(a,b,n)\n#endif\n\n#ifndef uthash_noexpand_fyi\n#define uthash_noexpand_fyi(tbl)          /* can be defined to log noexpand  */\n#endif\n#ifndef uthash_expand_fyi\n#define uthash_expand_fyi(tbl)            /* can be defined to log expands   */\n#endif\n\n/* initial number of buckets */\n#define HASH_INITIAL_NUM_BUCKETS 32U     /* initial number of buckets        */\n#define HASH_INITIAL_NUM_BUCKETS_LOG2 5U /* lg2 of initial number of buckets */\n#define HASH_BKT_CAPACITY_THRESH 10U     /* expand when bucket count reaches */\n\n/* calculate the element whose hash handle address is hhp */\n#define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho)))\n/* calculate the hash handle from element address elp */\n#define HH_FROM_ELMT(tbl,elp) ((UT_hash_handle *)(((char*)(elp)) + ((tbl)->hho)))\n\n#define HASH_VALUE(keyptr,keylen,hashv)                                          \\\ndo {                                                                             \\\n  HASH_FCN(keyptr, keylen, hashv);                                               \\\n} while (0)\n\n#define HASH_FIND_BYHASHVALUE(hh,head,keyptr,keylen,hashval,out)                 \\\ndo {                                                                             \\\n  (out) = NULL;                                                                  \\\n  if (head) {                                                                    \\\n    unsigned _hf_bkt;                                                            \\\n    HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _hf_bkt);                  \\\n    if (HASH_BLOOM_TEST((head)->hh.tbl, hashval) != 0) {                         \\\n      HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], keyptr, keylen, hashval, out); \\\n    }                                                                            \\\n  }                                                                              \\\n} while (0)\n\n#define HASH_FIND(hh,head,keyptr,keylen,out)                                     \\\ndo {                                                                             \\\n  unsigned _hf_hashv;                                                            \\\n  HASH_VALUE(keyptr, keylen, _hf_hashv);                                         \\\n  HASH_FIND_BYHASHVALUE(hh, head, keyptr, keylen, _hf_hashv, out);               \\\n} while (0)\n\n#ifdef HASH_BLOOM\n#define HASH_BLOOM_BITLEN (1UL << HASH_BLOOM)\n#define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8UL) + (((HASH_BLOOM_BITLEN%8UL)!=0UL) ? 1UL : 0UL)\n#define HASH_BLOOM_MAKE(tbl)                                                     \\\ndo {                                                                             \\\n  (tbl)->bloom_nbits = HASH_BLOOM;                                               \\\n  (tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN);                 \\\n  if (!((tbl)->bloom_bv))  { uthash_fatal( \"out of memory\"); }                   \\\n  memset((tbl)->bloom_bv, 0, HASH_BLOOM_BYTELEN);                                \\\n  (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE;                                       \\\n} while (0)\n\n#define HASH_BLOOM_FREE(tbl)                                                     \\\ndo {                                                                             \\\n  uthash_free((tbl)->bloom_bv, HASH_BLOOM_BYTELEN);                              \\\n} while (0)\n\n#define HASH_BLOOM_BITSET(bv,idx) (bv[(idx)/8U] |= (1U << ((idx)%8U)))\n#define HASH_BLOOM_BITTEST(bv,idx) (bv[(idx)/8U] & (1U << ((idx)%8U)))\n\n#define HASH_BLOOM_ADD(tbl,hashv)                                                \\\n  HASH_BLOOM_BITSET((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1U)))\n\n#define HASH_BLOOM_TEST(tbl,hashv)                                               \\\n  HASH_BLOOM_BITTEST((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1U)))\n\n#else\n#define HASH_BLOOM_MAKE(tbl)\n#define HASH_BLOOM_FREE(tbl)\n#define HASH_BLOOM_ADD(tbl,hashv)\n#define HASH_BLOOM_TEST(tbl,hashv) (1)\n#define HASH_BLOOM_BYTELEN 0U\n#endif\n\n#define HASH_MAKE_TABLE(hh,head)                                                 \\\ndo {                                                                             \\\n  (head)->hh.tbl = (UT_hash_table*)uthash_malloc(                                \\\n                  sizeof(UT_hash_table));                                        \\\n  if (!((head)->hh.tbl))  { uthash_fatal( \"out of memory\"); }                    \\\n  memset((head)->hh.tbl, 0, sizeof(UT_hash_table));                              \\\n  (head)->hh.tbl->tail = &((head)->hh);                                          \\\n  (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS;                        \\\n  (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2;              \\\n  (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head);                    \\\n  (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc(                      \\\n          HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket));               \\\n  if (! (head)->hh.tbl->buckets) { uthash_fatal( \"out of memory\"); }             \\\n  memset((head)->hh.tbl->buckets, 0,                                             \\\n          HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket));               \\\n  HASH_BLOOM_MAKE((head)->hh.tbl);                                               \\\n  (head)->hh.tbl->signature = HASH_SIGNATURE;                                    \\\n} while (0)\n\n#define HASH_REPLACE_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,replaced,cmpfcn) \\\ndo {                                                                             \\\n  (replaced) = NULL;                                                             \\\n  HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \\\n  if (replaced) {                                                                \\\n     HASH_DELETE(hh, head, replaced);                                            \\\n  }                                                                              \\\n  HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn); \\\n} while (0)\n\n#define HASH_REPLACE_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add,replaced) \\\ndo {                                                                             \\\n  (replaced) = NULL;                                                             \\\n  HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \\\n  if (replaced) {                                                                \\\n     HASH_DELETE(hh, head, replaced);                                            \\\n  }                                                                              \\\n  HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add); \\\n} while (0)\n\n#define HASH_REPLACE(hh,head,fieldname,keylen_in,add,replaced)                   \\\ndo {                                                                             \\\n  unsigned _hr_hashv;                                                            \\\n  HASH_VALUE(&((add)->fieldname), keylen_in, _hr_hashv);                         \\\n  HASH_REPLACE_BYHASHVALUE(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced); \\\n} while (0)\n\n#define HASH_REPLACE_INORDER(hh,head,fieldname,keylen_in,add,replaced,cmpfcn)    \\\ndo {                                                                             \\\n  unsigned _hr_hashv;                                                            \\\n  HASH_VALUE(&((add)->fieldname), keylen_in, _hr_hashv);                         \\\n  HASH_REPLACE_BYHASHVALUE_INORDER(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced, cmpfcn); \\\n} while (0)\n\n#define HASH_APPEND_LIST(hh, head, add)                                          \\\ndo {                                                                             \\\n  (add)->hh.next = NULL;                                                         \\\n  (add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail);           \\\n  (head)->hh.tbl->tail->next = (add);                                            \\\n  (head)->hh.tbl->tail = &((add)->hh);                                           \\\n} while (0)\n\n#define HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh,head,keyptr,keylen_in,hashval,add,cmpfcn) \\\ndo {                                                                             \\\n  unsigned _ha_bkt;                                                              \\\n  (add)->hh.hashv = (hashval);                                                   \\\n  (add)->hh.key = (char*) (keyptr);                                              \\\n  (add)->hh.keylen = (unsigned) (keylen_in);                                     \\\n  if (!(head)) {                                                                 \\\n    (add)->hh.next = NULL;                                                       \\\n    (add)->hh.prev = NULL;                                                       \\\n    (head) = (add);                                                              \\\n    HASH_MAKE_TABLE(hh, head);                                                   \\\n  } else {                                                                       \\\n    struct UT_hash_handle *_hs_iter = &(head)->hh;                               \\\n    (add)->hh.tbl = (head)->hh.tbl;                                              \\\n    do {                                                                         \\\n      if (cmpfcn(DECLTYPE(head) ELMT_FROM_HH((head)->hh.tbl, _hs_iter), add) > 0) \\\n        break;                                                                   \\\n    } while ((_hs_iter = _hs_iter->next));                                       \\\n    if (_hs_iter) {                                                              \\\n      (add)->hh.next = _hs_iter;                                                 \\\n      if (((add)->hh.prev = _hs_iter->prev)) {                                   \\\n        HH_FROM_ELMT((head)->hh.tbl, _hs_iter->prev)->next = (add);              \\\n      } else {                                                                   \\\n        (head) = (add);                                                          \\\n      }                                                                          \\\n      _hs_iter->prev = (add);                                                    \\\n    } else {                                                                     \\\n      HASH_APPEND_LIST(hh, head, add);                                           \\\n    }                                                                            \\\n  }                                                                              \\\n  (head)->hh.tbl->num_items++;                                                   \\\n  HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt);                    \\\n  HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], &(add)->hh);                 \\\n  HASH_BLOOM_ADD((head)->hh.tbl, hashval);                                       \\\n  HASH_EMIT_KEY(hh, head, keyptr, keylen_in);                                    \\\n  HASH_FSCK(hh, head);                                                           \\\n} while (0)\n\n#define HASH_ADD_KEYPTR_INORDER(hh,head,keyptr,keylen_in,add,cmpfcn)             \\\ndo {                                                                             \\\n  unsigned _hs_hashv;                                                            \\\n  HASH_VALUE(keyptr, keylen_in, _hs_hashv);                                      \\\n  HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, keyptr, keylen_in, _hs_hashv, add, cmpfcn); \\\n} while (0)\n\n#define HASH_ADD_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,cmpfcn) \\\n  HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn)\n\n#define HASH_ADD_INORDER(hh,head,fieldname,keylen_in,add,cmpfcn)                 \\\n  HASH_ADD_KEYPTR_INORDER(hh, head, &((add)->fieldname), keylen_in, add, cmpfcn)\n\n#define HASH_ADD_KEYPTR_BYHASHVALUE(hh,head,keyptr,keylen_in,hashval,add)        \\\ndo {                                                                             \\\n  unsigned _ha_bkt;                                                              \\\n  (add)->hh.hashv = (hashval);                                                   \\\n  (add)->hh.key = (char*) (keyptr);                                              \\\n  (add)->hh.keylen = (unsigned) (keylen_in);                                     \\\n  if (!(head)) {                                                                 \\\n    (add)->hh.next = NULL;                                                       \\\n    (add)->hh.prev = NULL;                                                       \\\n    (head) = (add);                                                              \\\n    HASH_MAKE_TABLE(hh, head);                                                   \\\n  } else {                                                                       \\\n    (add)->hh.tbl = (head)->hh.tbl;                                              \\\n    HASH_APPEND_LIST(hh, head, add);                                             \\\n  }                                                                              \\\n  (head)->hh.tbl->num_items++;                                                   \\\n  HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt);                    \\\n  HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], &(add)->hh);                 \\\n  HASH_BLOOM_ADD((head)->hh.tbl, hashval);                                       \\\n  HASH_EMIT_KEY(hh, head, keyptr, keylen_in);                                    \\\n  HASH_FSCK(hh, head);                                                           \\\n} while (0)\n\n#define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add)                            \\\ndo {                                                                             \\\n  unsigned _ha_hashv;                                                            \\\n  HASH_VALUE(keyptr, keylen_in, _ha_hashv);                                      \\\n  HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, keyptr, keylen_in, _ha_hashv, add);      \\\n} while (0)\n\n#define HASH_ADD_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add)            \\\n  HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add)\n\n#define HASH_ADD(hh,head,fieldname,keylen_in,add)                                \\\n  HASH_ADD_KEYPTR(hh, head, &((add)->fieldname), keylen_in, add)\n\n#define HASH_TO_BKT(hashv,num_bkts,bkt)                                          \\\ndo {                                                                             \\\n  bkt = ((hashv) & ((num_bkts) - 1U));                                           \\\n} while (0)\n\n/* delete \"delptr\" from the hash table.\n * \"the usual\" patch-up process for the app-order doubly-linked-list.\n * The use of _hd_hh_del below deserves special explanation.\n * These used to be expressed using (delptr) but that led to a bug\n * if someone used the same symbol for the head and deletee, like\n *  HASH_DELETE(hh,users,users);\n * We want that to work, but by changing the head (users) below\n * we were forfeiting our ability to further refer to the deletee (users)\n * in the patch-up process. Solution: use scratch space to\n * copy the deletee pointer, then the latter references are via that\n * scratch pointer rather than through the repointed (users) symbol.\n */\n#define HASH_DELETE(hh,head,delptr)                                              \\\ndo {                                                                             \\\n    struct UT_hash_handle *_hd_hh_del;                                           \\\n    if ( ((delptr)->hh.prev == NULL) && ((delptr)->hh.next == NULL) )  {         \\\n        uthash_free((head)->hh.tbl->buckets,                                     \\\n                    (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \\\n        HASH_BLOOM_FREE((head)->hh.tbl);                                         \\\n        uthash_free((head)->hh.tbl, sizeof(UT_hash_table));                      \\\n        head = NULL;                                                             \\\n    } else {                                                                     \\\n        unsigned _hd_bkt;                                                        \\\n        _hd_hh_del = &((delptr)->hh);                                            \\\n        if ((delptr) == ELMT_FROM_HH((head)->hh.tbl,(head)->hh.tbl->tail)) {     \\\n            (head)->hh.tbl->tail =                                               \\\n                (UT_hash_handle*)((ptrdiff_t)((delptr)->hh.prev) +               \\\n                (head)->hh.tbl->hho);                                            \\\n        }                                                                        \\\n        if ((delptr)->hh.prev != NULL) {                                         \\\n            ((UT_hash_handle*)((ptrdiff_t)((delptr)->hh.prev) +                  \\\n                    (head)->hh.tbl->hho))->next = (delptr)->hh.next;             \\\n        } else {                                                                 \\\n            DECLTYPE_ASSIGN(head,(delptr)->hh.next);                             \\\n        }                                                                        \\\n        if (_hd_hh_del->next != NULL) {                                          \\\n            ((UT_hash_handle*)((ptrdiff_t)_hd_hh_del->next +                     \\\n                    (head)->hh.tbl->hho))->prev =                                \\\n                    _hd_hh_del->prev;                                            \\\n        }                                                                        \\\n        HASH_TO_BKT( _hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt);   \\\n        HASH_DEL_IN_BKT(hh,(head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del);        \\\n        (head)->hh.tbl->num_items--;                                             \\\n    }                                                                            \\\n    HASH_FSCK(hh,head);                                                          \\\n} while (0)\n\n\n/* convenience forms of HASH_FIND/HASH_ADD/HASH_DEL */\n#define HASH_FIND_STR(head,findstr,out)                                          \\\n    HASH_FIND(hh,head,findstr,(unsigned)uthash_strlen(findstr),out)\n#define HASH_ADD_STR(head,strfield,add)                                          \\\n    HASH_ADD(hh,head,strfield[0],(unsigned)uthash_strlen(add->strfield),add)\n#define HASH_REPLACE_STR(head,strfield,add,replaced)                             \\\n    HASH_REPLACE(hh,head,strfield[0],(unsigned)uthash_strlen(add->strfield),add,replaced)\n#define HASH_FIND_INT(head,findint,out)                                          \\\n    HASH_FIND(hh,head,findint,sizeof(int),out)\n#define HASH_ADD_INT(head,intfield,add)                                          \\\n    HASH_ADD(hh,head,intfield,sizeof(int),add)\n#define HASH_REPLACE_INT(head,intfield,add,replaced)                             \\\n    HASH_REPLACE(hh,head,intfield,sizeof(int),add,replaced)\n#define HASH_FIND_PTR(head,findptr,out)                                          \\\n    HASH_FIND(hh,head,findptr,sizeof(void *),out)\n#define HASH_ADD_PTR(head,ptrfield,add)                                          \\\n    HASH_ADD(hh,head,ptrfield,sizeof(void *),add)\n#define HASH_REPLACE_PTR(head,ptrfield,add,replaced)                             \\\n    HASH_REPLACE(hh,head,ptrfield,sizeof(void *),add,replaced)\n#define HASH_DEL(head,delptr)                                                    \\\n    HASH_DELETE(hh,head,delptr)\n\n/* HASH_FSCK checks hash integrity on every add/delete when HASH_DEBUG is defined.\n * This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined.\n */\n#ifdef HASH_DEBUG\n#define HASH_OOPS(...) do { fprintf(stderr,__VA_ARGS__); exit(-1); } while (0)\n#define HASH_FSCK(hh,head)                                                       \\\ndo {                                                                             \\\n    struct UT_hash_handle *_thh;                                                 \\\n    if (head) {                                                                  \\\n        unsigned _bkt_i;                                                         \\\n        unsigned _count;                                                         \\\n        char *_prev;                                                             \\\n        _count = 0;                                                              \\\n        for( _bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; _bkt_i++) {       \\\n            unsigned _bkt_count = 0;                                             \\\n            _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head;                      \\\n            _prev = NULL;                                                        \\\n            while (_thh) {                                                       \\\n               if (_prev != (char*)(_thh->hh_prev)) {                            \\\n                   HASH_OOPS(\"invalid hh_prev %p, actual %p\\n\",                  \\\n                    _thh->hh_prev, _prev );                                      \\\n               }                                                                 \\\n               _bkt_count++;                                                     \\\n               _prev = (char*)(_thh);                                            \\\n               _thh = _thh->hh_next;                                             \\\n            }                                                                    \\\n            _count += _bkt_count;                                                \\\n            if ((head)->hh.tbl->buckets[_bkt_i].count !=  _bkt_count) {          \\\n               HASH_OOPS(\"invalid bucket count %u, actual %u\\n\",                 \\\n                (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count);              \\\n            }                                                                    \\\n        }                                                                        \\\n        if (_count != (head)->hh.tbl->num_items) {                               \\\n            HASH_OOPS(\"invalid hh item count %u, actual %u\\n\",                   \\\n                (head)->hh.tbl->num_items, _count );                             \\\n        }                                                                        \\\n        /* traverse hh in app order; check next/prev integrity, count */         \\\n        _count = 0;                                                              \\\n        _prev = NULL;                                                            \\\n        _thh =  &(head)->hh;                                                     \\\n        while (_thh) {                                                           \\\n           _count++;                                                             \\\n           if (_prev !=(char*)(_thh->prev)) {                                    \\\n              HASH_OOPS(\"invalid prev %p, actual %p\\n\",                          \\\n                    _thh->prev, _prev );                                         \\\n           }                                                                     \\\n           _prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh);                    \\\n           _thh = ( _thh->next ?  (UT_hash_handle*)((char*)(_thh->next) +        \\\n                                  (head)->hh.tbl->hho) : NULL );                 \\\n        }                                                                        \\\n        if (_count != (head)->hh.tbl->num_items) {                               \\\n            HASH_OOPS(\"invalid app item count %u, actual %u\\n\",                  \\\n                (head)->hh.tbl->num_items, _count );                             \\\n        }                                                                        \\\n    }                                                                            \\\n} while (0)\n#else\n#define HASH_FSCK(hh,head)\n#endif\n\n/* When compiled with -DHASH_EMIT_KEYS, length-prefixed keys are emitted to\n * the descriptor to which this macro is defined for tuning the hash function.\n * The app can #include <unistd.h> to get the prototype for write(2). */\n#ifdef HASH_EMIT_KEYS\n#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen)                                   \\\ndo {                                                                             \\\n    unsigned _klen = fieldlen;                                                   \\\n    write(HASH_EMIT_KEYS, &_klen, sizeof(_klen));                                \\\n    write(HASH_EMIT_KEYS, keyptr, (unsigned long)fieldlen);                      \\\n} while (0)\n#else\n#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen)\n#endif\n\n/* default to Jenkin's hash unless overridden e.g. DHASH_FUNCTION=HASH_SAX */\n#ifdef HASH_FUNCTION\n#define HASH_FCN HASH_FUNCTION\n#else\n#define HASH_FCN HASH_JEN\n#endif\n\n/* The Bernstein hash function, used in Perl prior to v5.6. Note (x<<5+x)=x*33. */\n#define HASH_BER(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned _hb_keylen=(unsigned)keylen;                                          \\\n  const unsigned char *_hb_key=(const unsigned char*)(key);                      \\\n  (hashv) = 0;                                                                   \\\n  while (_hb_keylen-- != 0U) {                                                   \\\n      (hashv) = (((hashv) << 5) + (hashv)) + *_hb_key++;                         \\\n  }                                                                              \\\n} while (0)\n\n\n/* SAX/FNV/OAT/JEN hash functions are macro variants of those listed at\n * http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx */\n#define HASH_SAX(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned _sx_i;                                                                \\\n  const unsigned char *_hs_key=(const unsigned char*)(key);                      \\\n  hashv = 0;                                                                     \\\n  for(_sx_i=0; _sx_i < keylen; _sx_i++) {                                        \\\n      hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i];                     \\\n  }                                                                              \\\n} while (0)\n/* FNV-1a variation */\n#define HASH_FNV(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned _fn_i;                                                                \\\n  const unsigned char *_hf_key=(const unsigned char*)(key);                      \\\n  hashv = 2166136261U;                                                           \\\n  for(_fn_i=0; _fn_i < keylen; _fn_i++) {                                        \\\n      hashv = hashv ^ _hf_key[_fn_i];                                            \\\n      hashv = hashv * 16777619U;                                                 \\\n  }                                                                              \\\n} while (0)\n\n#define HASH_OAT(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned _ho_i;                                                                \\\n  const unsigned char *_ho_key=(const unsigned char*)(key);                      \\\n  hashv = 0;                                                                     \\\n  for(_ho_i=0; _ho_i < keylen; _ho_i++) {                                        \\\n      hashv += _ho_key[_ho_i];                                                   \\\n      hashv += (hashv << 10);                                                    \\\n      hashv ^= (hashv >> 6);                                                     \\\n  }                                                                              \\\n  hashv += (hashv << 3);                                                         \\\n  hashv ^= (hashv >> 11);                                                        \\\n  hashv += (hashv << 15);                                                        \\\n} while (0)\n\n#define HASH_JEN_MIX(a,b,c)                                                      \\\ndo {                                                                             \\\n  a -= b; a -= c; a ^= ( c >> 13 );                                              \\\n  b -= c; b -= a; b ^= ( a << 8 );                                               \\\n  c -= a; c -= b; c ^= ( b >> 13 );                                              \\\n  a -= b; a -= c; a ^= ( c >> 12 );                                              \\\n  b -= c; b -= a; b ^= ( a << 16 );                                              \\\n  c -= a; c -= b; c ^= ( b >> 5 );                                               \\\n  a -= b; a -= c; a ^= ( c >> 3 );                                               \\\n  b -= c; b -= a; b ^= ( a << 10 );                                              \\\n  c -= a; c -= b; c ^= ( b >> 15 );                                              \\\n} while (0)\n\n#define HASH_JEN(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned _hj_i,_hj_j,_hj_k;                                                    \\\n  unsigned const char *_hj_key=(unsigned const char*)(key);                      \\\n  hashv = 0xfeedbeefu;                                                           \\\n  _hj_i = _hj_j = 0x9e3779b9u;                                                   \\\n  _hj_k = (unsigned)(keylen);                                                    \\\n  while (_hj_k >= 12U) {                                                         \\\n    _hj_i +=    (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 )                      \\\n        + ( (unsigned)_hj_key[2] << 16 )                                         \\\n        + ( (unsigned)_hj_key[3] << 24 ) );                                      \\\n    _hj_j +=    (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 )                      \\\n        + ( (unsigned)_hj_key[6] << 16 )                                         \\\n        + ( (unsigned)_hj_key[7] << 24 ) );                                      \\\n    hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 )                         \\\n        + ( (unsigned)_hj_key[10] << 16 )                                        \\\n        + ( (unsigned)_hj_key[11] << 24 ) );                                     \\\n                                                                                 \\\n     HASH_JEN_MIX(_hj_i, _hj_j, hashv);                                          \\\n                                                                                 \\\n     _hj_key += 12;                                                              \\\n     _hj_k -= 12U;                                                               \\\n  }                                                                              \\\n  hashv += (unsigned)(keylen);                                                   \\\n  switch ( _hj_k ) {                                                             \\\n     case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); /* FALLTHROUGH */        \\\n     case 10: hashv += ( (unsigned)_hj_key[9] << 16 );  /* FALLTHROUGH */        \\\n     case 9:  hashv += ( (unsigned)_hj_key[8] << 8 );   /* FALLTHROUGH */        \\\n     case 8:  _hj_j += ( (unsigned)_hj_key[7] << 24 );  /* FALLTHROUGH */        \\\n     case 7:  _hj_j += ( (unsigned)_hj_key[6] << 16 );  /* FALLTHROUGH */        \\\n     case 6:  _hj_j += ( (unsigned)_hj_key[5] << 8 );   /* FALLTHROUGH */        \\\n     case 5:  _hj_j += _hj_key[4];                      /* FALLTHROUGH */        \\\n     case 4:  _hj_i += ( (unsigned)_hj_key[3] << 24 );  /* FALLTHROUGH */        \\\n     case 3:  _hj_i += ( (unsigned)_hj_key[2] << 16 );  /* FALLTHROUGH */        \\\n     case 2:  _hj_i += ( (unsigned)_hj_key[1] << 8 );   /* FALLTHROUGH */        \\\n     case 1:  _hj_i += _hj_key[0];                                               \\\n  }                                                                              \\\n  HASH_JEN_MIX(_hj_i, _hj_j, hashv);                                             \\\n} while (0)\n\n/* The Paul Hsieh hash function */\n#undef get16bits\n#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__)             \\\n  || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)\n#define get16bits(d) (*((const uint16_t *) (d)))\n#endif\n\n#if !defined (get16bits)\n#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)             \\\n                       +(uint32_t)(((const uint8_t *)(d))[0]) )\n#endif\n#define HASH_SFH(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned const char *_sfh_key=(unsigned const char*)(key);                     \\\n  uint32_t _sfh_tmp, _sfh_len = (uint32_t)keylen;                                \\\n                                                                                 \\\n  unsigned _sfh_rem = _sfh_len & 3U;                                             \\\n  _sfh_len >>= 2;                                                                \\\n  hashv = 0xcafebabeu;                                                           \\\n                                                                                 \\\n  /* Main loop */                                                                \\\n  for (;_sfh_len > 0U; _sfh_len--) {                                             \\\n    hashv    += get16bits (_sfh_key);                                            \\\n    _sfh_tmp  = ((uint32_t)(get16bits (_sfh_key+2)) << 11) ^ hashv;              \\\n    hashv     = (hashv << 16) ^ _sfh_tmp;                                        \\\n    _sfh_key += 2U*sizeof (uint16_t);                                            \\\n    hashv    += hashv >> 11;                                                     \\\n  }                                                                              \\\n                                                                                 \\\n  /* Handle end cases */                                                         \\\n  switch (_sfh_rem) {                                                            \\\n    case 3: hashv += get16bits (_sfh_key);                                       \\\n            hashv ^= hashv << 16;                                                \\\n            hashv ^= (uint32_t)(_sfh_key[sizeof (uint16_t)]) << 18;              \\\n            hashv += hashv >> 11;                                                \\\n            break;                                                               \\\n    case 2: hashv += get16bits (_sfh_key);                                       \\\n            hashv ^= hashv << 11;                                                \\\n            hashv += hashv >> 17;                                                \\\n            break;                                                               \\\n    case 1: hashv += *_sfh_key;                                                  \\\n            hashv ^= hashv << 10;                                                \\\n            hashv += hashv >> 1;                                                 \\\n  }                                                                              \\\n                                                                                 \\\n    /* Force \"avalanching\" of final 127 bits */                                  \\\n    hashv ^= hashv << 3;                                                         \\\n    hashv += hashv >> 5;                                                         \\\n    hashv ^= hashv << 4;                                                         \\\n    hashv += hashv >> 17;                                                        \\\n    hashv ^= hashv << 25;                                                        \\\n    hashv += hashv >> 6;                                                         \\\n} while (0)\n\n#ifdef HASH_USING_NO_STRICT_ALIASING\n/* The MurmurHash exploits some CPU's (x86,x86_64) tolerance for unaligned reads.\n * For other types of CPU's (e.g. Sparc) an unaligned read causes a bus error.\n * MurmurHash uses the faster approach only on CPU's where we know it's safe.\n *\n * Note the preprocessor built-in defines can be emitted using:\n *\n *   gcc -m64 -dM -E - < /dev/null                  (on gcc)\n *   cc -## a.c (where a.c is a simple test file)   (Sun Studio)\n */\n#if (defined(__i386__) || defined(__x86_64__)  || defined(_M_IX86))\n#define MUR_GETBLOCK(p,i) p[i]\n#else /* non intel */\n#define MUR_PLUS0_ALIGNED(p) (((unsigned long)p & 3UL) == 0UL)\n#define MUR_PLUS1_ALIGNED(p) (((unsigned long)p & 3UL) == 1UL)\n#define MUR_PLUS2_ALIGNED(p) (((unsigned long)p & 3UL) == 2UL)\n#define MUR_PLUS3_ALIGNED(p) (((unsigned long)p & 3UL) == 3UL)\n#define WP(p) ((uint32_t*)((unsigned long)(p) & ~3UL))\n#if (defined(__BIG_ENDIAN__) || defined(SPARC) || defined(__ppc__) || defined(__ppc64__))\n#define MUR_THREE_ONE(p) ((((*WP(p))&0x00ffffff) << 8) | (((*(WP(p)+1))&0xff000000) >> 24))\n#define MUR_TWO_TWO(p)   ((((*WP(p))&0x0000ffff) <<16) | (((*(WP(p)+1))&0xffff0000) >> 16))\n#define MUR_ONE_THREE(p) ((((*WP(p))&0x000000ff) <<24) | (((*(WP(p)+1))&0xffffff00) >>  8))\n#else /* assume little endian non-intel */\n#define MUR_THREE_ONE(p) ((((*WP(p))&0xffffff00) >> 8) | (((*(WP(p)+1))&0x000000ff) << 24))\n#define MUR_TWO_TWO(p)   ((((*WP(p))&0xffff0000) >>16) | (((*(WP(p)+1))&0x0000ffff) << 16))\n#define MUR_ONE_THREE(p) ((((*WP(p))&0xff000000) >>24) | (((*(WP(p)+1))&0x00ffffff) <<  8))\n#endif\n#define MUR_GETBLOCK(p,i) (MUR_PLUS0_ALIGNED(p) ? ((p)[i]) :           \\\n                            (MUR_PLUS1_ALIGNED(p) ? MUR_THREE_ONE(p) : \\\n                             (MUR_PLUS2_ALIGNED(p) ? MUR_TWO_TWO(p) :  \\\n                                                      MUR_ONE_THREE(p))))\n#endif\n#define MUR_ROTL32(x,r) (((x) << (r)) | ((x) >> (32 - (r))))\n#define MUR_FMIX(_h) \\\ndo {                 \\\n  _h ^= _h >> 16;    \\\n  _h *= 0x85ebca6bu; \\\n  _h ^= _h >> 13;    \\\n  _h *= 0xc2b2ae35u; \\\n  _h ^= _h >> 16;    \\\n} while (0)\n\n#define HASH_MUR(key,keylen,hashv)                                     \\\ndo {                                                                   \\\n  const uint8_t *_mur_data = (const uint8_t*)(key);                    \\\n  const int _mur_nblocks = (int)(keylen) / 4;                          \\\n  uint32_t _mur_h1 = 0xf88D5353u;                                      \\\n  uint32_t _mur_c1 = 0xcc9e2d51u;                                      \\\n  uint32_t _mur_c2 = 0x1b873593u;                                      \\\n  uint32_t _mur_k1 = 0;                                                \\\n  const uint8_t *_mur_tail;                                            \\\n  const uint32_t *_mur_blocks = (const uint32_t*)(_mur_data+(_mur_nblocks*4)); \\\n  int _mur_i;                                                          \\\n  for(_mur_i = -_mur_nblocks; _mur_i!=0; _mur_i++) {                   \\\n    _mur_k1 = MUR_GETBLOCK(_mur_blocks,_mur_i);                        \\\n    _mur_k1 *= _mur_c1;                                                \\\n    _mur_k1 = MUR_ROTL32(_mur_k1,15);                                  \\\n    _mur_k1 *= _mur_c2;                                                \\\n                                                                       \\\n    _mur_h1 ^= _mur_k1;                                                \\\n    _mur_h1 = MUR_ROTL32(_mur_h1,13);                                  \\\n    _mur_h1 = (_mur_h1*5U) + 0xe6546b64u;                              \\\n  }                                                                    \\\n  _mur_tail = (const uint8_t*)(_mur_data + (_mur_nblocks*4));          \\\n  _mur_k1=0;                                                           \\\n  switch((keylen) & 3U) {                                              \\\n    case 3: _mur_k1 ^= (uint32_t)_mur_tail[2] << 16; /* FALLTHROUGH */ \\\n    case 2: _mur_k1 ^= (uint32_t)_mur_tail[1] << 8;  /* FALLTHROUGH */ \\\n    case 1: _mur_k1 ^= (uint32_t)_mur_tail[0];                         \\\n    _mur_k1 *= _mur_c1;                                                \\\n    _mur_k1 = MUR_ROTL32(_mur_k1,15);                                  \\\n    _mur_k1 *= _mur_c2;                                                \\\n    _mur_h1 ^= _mur_k1;                                                \\\n  }                                                                    \\\n  _mur_h1 ^= (uint32_t)(keylen);                                       \\\n  MUR_FMIX(_mur_h1);                                                   \\\n  hashv = _mur_h1;                                                     \\\n} while (0)\n#endif  /* HASH_USING_NO_STRICT_ALIASING */\n\n/* iterate over items in a known bucket to find desired item */\n#define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,hashval,out)               \\\ndo {                                                                             \\\n  if ((head).hh_head != NULL) {                                                  \\\n    DECLTYPE_ASSIGN(out, ELMT_FROM_HH(tbl, (head).hh_head));                     \\\n  } else {                                                                       \\\n    (out) = NULL;                                                                \\\n  }                                                                              \\\n  while ((out) != NULL) {                                                        \\\n    if ((out)->hh.hashv == (hashval) && (out)->hh.keylen == (keylen_in)) {       \\\n      if (uthash_memcmp((out)->hh.key, keyptr, keylen_in) == 0) {                \\\n        break;                                                                   \\\n      }                                                                          \\\n    }                                                                            \\\n    if ((out)->hh.hh_next != NULL) {                                             \\\n      DECLTYPE_ASSIGN(out, ELMT_FROM_HH(tbl, (out)->hh.hh_next));                \\\n    } else {                                                                     \\\n      (out) = NULL;                                                              \\\n    }                                                                            \\\n  }                                                                              \\\n} while (0)\n\n/* add an item to a bucket  */\n#define HASH_ADD_TO_BKT(head,addhh)                                              \\\ndo {                                                                             \\\n head.count++;                                                                   \\\n (addhh)->hh_next = head.hh_head;                                                \\\n (addhh)->hh_prev = NULL;                                                        \\\n if (head.hh_head != NULL) { (head).hh_head->hh_prev = (addhh); }                \\\n (head).hh_head=addhh;                                                           \\\n if ((head.count >= ((head.expand_mult+1U) * HASH_BKT_CAPACITY_THRESH))          \\\n     && ((addhh)->tbl->noexpand != 1U)) {                                        \\\n       HASH_EXPAND_BUCKETS((addhh)->tbl);                                        \\\n }                                                                               \\\n} while (0)\n\n/* remove an item from a given bucket */\n#define HASH_DEL_IN_BKT(hh,head,hh_del)                                          \\\n    (head).count--;                                                              \\\n    if ((head).hh_head == hh_del) {                                              \\\n      (head).hh_head = hh_del->hh_next;                                          \\\n    }                                                                            \\\n    if (hh_del->hh_prev) {                                                       \\\n        hh_del->hh_prev->hh_next = hh_del->hh_next;                              \\\n    }                                                                            \\\n    if (hh_del->hh_next) {                                                       \\\n        hh_del->hh_next->hh_prev = hh_del->hh_prev;                              \\\n    }\n\n/* Bucket expansion has the effect of doubling the number of buckets\n * and redistributing the items into the new buckets. Ideally the\n * items will distribute more or less evenly into the new buckets\n * (the extent to which this is true is a measure of the quality of\n * the hash function as it applies to the key domain).\n *\n * With the items distributed into more buckets, the chain length\n * (item count) in each bucket is reduced. Thus by expanding buckets\n * the hash keeps a bound on the chain length. This bounded chain\n * length is the essence of how a hash provides constant time lookup.\n *\n * The calculation of tbl->ideal_chain_maxlen below deserves some\n * explanation. First, keep in mind that we're calculating the ideal\n * maximum chain length based on the *new* (doubled) bucket count.\n * In fractions this is just n/b (n=number of items,b=new num buckets).\n * Since the ideal chain length is an integer, we want to calculate\n * ceil(n/b). We don't depend on floating point arithmetic in this\n * hash, so to calculate ceil(n/b) with integers we could write\n *\n *      ceil(n/b) = (n/b) + ((n%b)?1:0)\n *\n * and in fact a previous version of this hash did just that.\n * But now we have improved things a bit by recognizing that b is\n * always a power of two. We keep its base 2 log handy (call it lb),\n * so now we can write this with a bit shift and logical AND:\n *\n *      ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0)\n *\n */\n#define HASH_EXPAND_BUCKETS(tbl)                                                 \\\ndo {                                                                             \\\n    unsigned _he_bkt;                                                            \\\n    unsigned _he_bkt_i;                                                          \\\n    struct UT_hash_handle *_he_thh, *_he_hh_nxt;                                 \\\n    UT_hash_bucket *_he_new_buckets, *_he_newbkt;                                \\\n    _he_new_buckets = (UT_hash_bucket*)uthash_malloc(                            \\\n             2UL * tbl->num_buckets * sizeof(struct UT_hash_bucket));            \\\n    if (!_he_new_buckets) { uthash_fatal( \"out of memory\"); }                    \\\n    memset(_he_new_buckets, 0,                                                   \\\n            2UL * tbl->num_buckets * sizeof(struct UT_hash_bucket));             \\\n    tbl->ideal_chain_maxlen =                                                    \\\n       (tbl->num_items >> (tbl->log2_num_buckets+1U)) +                          \\\n       (((tbl->num_items & ((tbl->num_buckets*2U)-1U)) != 0U) ? 1U : 0U);        \\\n    tbl->nonideal_items = 0;                                                     \\\n    for(_he_bkt_i = 0; _he_bkt_i < tbl->num_buckets; _he_bkt_i++)                \\\n    {                                                                            \\\n        _he_thh = tbl->buckets[ _he_bkt_i ].hh_head;                             \\\n        while (_he_thh != NULL) {                                                \\\n           _he_hh_nxt = _he_thh->hh_next;                                        \\\n           HASH_TO_BKT( _he_thh->hashv, tbl->num_buckets*2U, _he_bkt);           \\\n           _he_newbkt = &(_he_new_buckets[ _he_bkt ]);                           \\\n           if (++(_he_newbkt->count) > tbl->ideal_chain_maxlen) {                \\\n             tbl->nonideal_items++;                                              \\\n             _he_newbkt->expand_mult = _he_newbkt->count /                       \\\n                                        tbl->ideal_chain_maxlen;                 \\\n           }                                                                     \\\n           _he_thh->hh_prev = NULL;                                              \\\n           _he_thh->hh_next = _he_newbkt->hh_head;                               \\\n           if (_he_newbkt->hh_head != NULL) { _he_newbkt->hh_head->hh_prev =     \\\n                _he_thh; }                                                       \\\n           _he_newbkt->hh_head = _he_thh;                                        \\\n           _he_thh = _he_hh_nxt;                                                 \\\n        }                                                                        \\\n    }                                                                            \\\n    uthash_free( tbl->buckets, tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \\\n    tbl->num_buckets *= 2U;                                                      \\\n    tbl->log2_num_buckets++;                                                     \\\n    tbl->buckets = _he_new_buckets;                                              \\\n    tbl->ineff_expands = (tbl->nonideal_items > (tbl->num_items >> 1)) ?         \\\n        (tbl->ineff_expands+1U) : 0U;                                            \\\n    if (tbl->ineff_expands > 1U) {                                               \\\n        tbl->noexpand=1;                                                         \\\n        uthash_noexpand_fyi(tbl);                                                \\\n    }                                                                            \\\n    uthash_expand_fyi(tbl);                                                      \\\n} while (0)\n\n\n/* This is an adaptation of Simon Tatham's O(n log(n)) mergesort */\n/* Note that HASH_SORT assumes the hash handle name to be hh.\n * HASH_SRT was added to allow the hash handle name to be passed in. */\n#define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn)\n#define HASH_SRT(hh,head,cmpfcn)                                                 \\\ndo {                                                                             \\\n  unsigned _hs_i;                                                                \\\n  unsigned _hs_looping,_hs_nmerges,_hs_insize,_hs_psize,_hs_qsize;               \\\n  struct UT_hash_handle *_hs_p, *_hs_q, *_hs_e, *_hs_list, *_hs_tail;            \\\n  if (head != NULL) {                                                            \\\n      _hs_insize = 1;                                                            \\\n      _hs_looping = 1;                                                           \\\n      _hs_list = &((head)->hh);                                                  \\\n      while (_hs_looping != 0U) {                                                \\\n          _hs_p = _hs_list;                                                      \\\n          _hs_list = NULL;                                                       \\\n          _hs_tail = NULL;                                                       \\\n          _hs_nmerges = 0;                                                       \\\n          while (_hs_p != NULL) {                                                \\\n              _hs_nmerges++;                                                     \\\n              _hs_q = _hs_p;                                                     \\\n              _hs_psize = 0;                                                     \\\n              for ( _hs_i = 0; _hs_i  < _hs_insize; _hs_i++ ) {                  \\\n                  _hs_psize++;                                                   \\\n                  _hs_q = (UT_hash_handle*)((_hs_q->next != NULL) ?              \\\n                          ((void*)((char*)(_hs_q->next) +                        \\\n                          (head)->hh.tbl->hho)) : NULL);                         \\\n                  if (! (_hs_q) ) { break; }                                     \\\n              }                                                                  \\\n              _hs_qsize = _hs_insize;                                            \\\n              while ((_hs_psize > 0U) || ((_hs_qsize > 0U) && (_hs_q != NULL))) {\\\n                  if (_hs_psize == 0U) {                                         \\\n                      _hs_e = _hs_q;                                             \\\n                      _hs_q = (UT_hash_handle*)((_hs_q->next != NULL) ?          \\\n                              ((void*)((char*)(_hs_q->next) +                    \\\n                              (head)->hh.tbl->hho)) : NULL);                     \\\n                      _hs_qsize--;                                               \\\n                  } else if ( (_hs_qsize == 0U) || (_hs_q == NULL) ) {           \\\n                      _hs_e = _hs_p;                                             \\\n                      if (_hs_p != NULL){                                        \\\n                        _hs_p = (UT_hash_handle*)((_hs_p->next != NULL) ?        \\\n                                ((void*)((char*)(_hs_p->next) +                  \\\n                                (head)->hh.tbl->hho)) : NULL);                   \\\n                       }                                                         \\\n                      _hs_psize--;                                               \\\n                  } else if ((                                                   \\\n                      cmpfcn(DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_p)), \\\n                             DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_q))) \\\n                             ) <= 0) {                                           \\\n                      _hs_e = _hs_p;                                             \\\n                      if (_hs_p != NULL){                                        \\\n                        _hs_p = (UT_hash_handle*)((_hs_p->next != NULL) ?        \\\n                               ((void*)((char*)(_hs_p->next) +                   \\\n                               (head)->hh.tbl->hho)) : NULL);                    \\\n                       }                                                         \\\n                      _hs_psize--;                                               \\\n                  } else {                                                       \\\n                      _hs_e = _hs_q;                                             \\\n                      _hs_q = (UT_hash_handle*)((_hs_q->next != NULL) ?          \\\n                              ((void*)((char*)(_hs_q->next) +                    \\\n                              (head)->hh.tbl->hho)) : NULL);                     \\\n                      _hs_qsize--;                                               \\\n                  }                                                              \\\n                  if ( _hs_tail != NULL ) {                                      \\\n                      _hs_tail->next = ((_hs_e != NULL) ?                        \\\n                            ELMT_FROM_HH((head)->hh.tbl,_hs_e) : NULL);          \\\n                  } else {                                                       \\\n                      _hs_list = _hs_e;                                          \\\n                  }                                                              \\\n                  if (_hs_e != NULL) {                                           \\\n                  _hs_e->prev = ((_hs_tail != NULL) ?                            \\\n                     ELMT_FROM_HH((head)->hh.tbl,_hs_tail) : NULL);              \\\n                  }                                                              \\\n                  _hs_tail = _hs_e;                                              \\\n              }                                                                  \\\n              _hs_p = _hs_q;                                                     \\\n          }                                                                      \\\n          if (_hs_tail != NULL){                                                 \\\n            _hs_tail->next = NULL;                                               \\\n          }                                                                      \\\n          if ( _hs_nmerges <= 1U ) {                                             \\\n              _hs_looping=0;                                                     \\\n              (head)->hh.tbl->tail = _hs_tail;                                   \\\n              DECLTYPE_ASSIGN(head,ELMT_FROM_HH((head)->hh.tbl, _hs_list));      \\\n          }                                                                      \\\n          _hs_insize *= 2U;                                                      \\\n      }                                                                          \\\n      HASH_FSCK(hh,head);                                                        \\\n }                                                                               \\\n} while (0)\n\n/* This function selects items from one hash into another hash.\n * The end result is that the selected items have dual presence\n * in both hashes. There is no copy of the items made; rather\n * they are added into the new hash through a secondary hash\n * hash handle that must be present in the structure. */\n#define HASH_SELECT(hh_dst, dst, hh_src, src, cond)                              \\\ndo {                                                                             \\\n  unsigned _src_bkt, _dst_bkt;                                                   \\\n  void *_last_elt=NULL, *_elt;                                                   \\\n  UT_hash_handle *_src_hh, *_dst_hh, *_last_elt_hh=NULL;                         \\\n  ptrdiff_t _dst_hho = ((char*)(&(dst)->hh_dst) - (char*)(dst));                 \\\n  if (src != NULL) {                                                             \\\n    for(_src_bkt=0; _src_bkt < (src)->hh_src.tbl->num_buckets; _src_bkt++) {     \\\n      for(_src_hh = (src)->hh_src.tbl->buckets[_src_bkt].hh_head;                \\\n          _src_hh != NULL;                                                       \\\n          _src_hh = _src_hh->hh_next) {                                          \\\n          _elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh);                       \\\n          if (cond(_elt)) {                                                      \\\n            _dst_hh = (UT_hash_handle*)(((char*)_elt) + _dst_hho);               \\\n            _dst_hh->key = _src_hh->key;                                         \\\n            _dst_hh->keylen = _src_hh->keylen;                                   \\\n            _dst_hh->hashv = _src_hh->hashv;                                     \\\n            _dst_hh->prev = _last_elt;                                           \\\n            _dst_hh->next = NULL;                                                \\\n            if (_last_elt_hh != NULL) { _last_elt_hh->next = _elt; }             \\\n            if (dst == NULL) {                                                   \\\n              DECLTYPE_ASSIGN(dst,_elt);                                         \\\n              HASH_MAKE_TABLE(hh_dst,dst);                                       \\\n            } else {                                                             \\\n              _dst_hh->tbl = (dst)->hh_dst.tbl;                                  \\\n            }                                                                    \\\n            HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt);    \\\n            HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt],_dst_hh);            \\\n            (dst)->hh_dst.tbl->num_items++;                                      \\\n            _last_elt = _elt;                                                    \\\n            _last_elt_hh = _dst_hh;                                              \\\n          }                                                                      \\\n      }                                                                          \\\n    }                                                                            \\\n  }                                                                              \\\n  HASH_FSCK(hh_dst,dst);                                                         \\\n} while (0)\n\n#define HASH_CLEAR(hh,head)                                                      \\\ndo {                                                                             \\\n  if (head != NULL) {                                                            \\\n    uthash_free((head)->hh.tbl->buckets,                                         \\\n                (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket));      \\\n    HASH_BLOOM_FREE((head)->hh.tbl);                                             \\\n    uthash_free((head)->hh.tbl, sizeof(UT_hash_table));                          \\\n    (head)=NULL;                                                                 \\\n  }                                                                              \\\n} while (0)\n\n#define HASH_OVERHEAD(hh,head)                                                   \\\n ((head != NULL) ? (                                                             \\\n (size_t)(((head)->hh.tbl->num_items   * sizeof(UT_hash_handle))   +             \\\n          ((head)->hh.tbl->num_buckets * sizeof(UT_hash_bucket))   +             \\\n           sizeof(UT_hash_table)                                   +             \\\n           (HASH_BLOOM_BYTELEN))) : 0U)\n\n#ifdef NO_DECLTYPE\n#define HASH_ITER(hh,head,el,tmp)                                                \\\nfor(((el)=(head)), ((*(char**)(&(tmp)))=(char*)((head!=NULL)?(head)->hh.next:NULL)); \\\n  (el) != NULL; ((el)=(tmp)), ((*(char**)(&(tmp)))=(char*)((tmp!=NULL)?(tmp)->hh.next:NULL)))\n#else\n#define HASH_ITER(hh,head,el,tmp)                                                \\\nfor(((el)=(head)), ((tmp)=DECLTYPE(el)((head!=NULL)?(head)->hh.next:NULL));      \\\n  (el) != NULL; ((el)=(tmp)), ((tmp)=DECLTYPE(el)((tmp!=NULL)?(tmp)->hh.next:NULL)))\n#endif\n\n/* obtain a count of items in the hash */\n#define HASH_COUNT(head) HASH_CNT(hh,head)\n#define HASH_CNT(hh,head) ((head != NULL)?((head)->hh.tbl->num_items):0U)\n\ntypedef struct UT_hash_bucket {\n   struct UT_hash_handle *hh_head;\n   unsigned count;\n\n   /* expand_mult is normally set to 0. In this situation, the max chain length\n    * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If\n    * the bucket's chain exceeds this length, bucket expansion is triggered).\n    * However, setting expand_mult to a non-zero value delays bucket expansion\n    * (that would be triggered by additions to this particular bucket)\n    * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH.\n    * (The multiplier is simply expand_mult+1). The whole idea of this\n    * multiplier is to reduce bucket expansions, since they are expensive, in\n    * situations where we know that a particular bucket tends to be overused.\n    * It is better to let its chain length grow to a longer yet-still-bounded\n    * value, than to do an O(n) bucket expansion too often.\n    */\n   unsigned expand_mult;\n\n} UT_hash_bucket;\n\n/* random signature used only to find hash tables in external analysis */\n#define HASH_SIGNATURE 0xa0111fe1u\n#define HASH_BLOOM_SIGNATURE 0xb12220f2u\n\ntypedef struct UT_hash_table {\n   UT_hash_bucket *buckets;\n   unsigned num_buckets, log2_num_buckets;\n   unsigned num_items;\n   struct UT_hash_handle *tail; /* tail hh in app order, for fast append    */\n   ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */\n\n   /* in an ideal situation (all buckets used equally), no bucket would have\n    * more than ceil(#items/#buckets) items. that's the ideal chain length. */\n   unsigned ideal_chain_maxlen;\n\n   /* nonideal_items is the number of items in the hash whose chain position\n    * exceeds the ideal chain maxlen. these items pay the penalty for an uneven\n    * hash distribution; reaching them in a chain traversal takes >ideal steps */\n   unsigned nonideal_items;\n\n   /* ineffective expands occur when a bucket doubling was performed, but\n    * afterward, more than half the items in the hash had nonideal chain\n    * positions. If this happens on two consecutive expansions we inhibit any\n    * further expansion, as it's not helping; this happens when the hash\n    * function isn't a good fit for the key domain. When expansion is inhibited\n    * the hash will still work, albeit no longer in constant time. */\n   unsigned ineff_expands, noexpand;\n\n   uint32_t signature; /* used only to find hash tables in external analysis */\n#ifdef HASH_BLOOM\n   uint32_t bloom_sig; /* used only to test bloom exists in external analysis */\n   uint8_t *bloom_bv;\n   uint8_t bloom_nbits;\n#endif\n\n} UT_hash_table;\n\ntypedef struct UT_hash_handle {\n   struct UT_hash_table *tbl;\n   void *prev;                       /* prev element in app order      */\n   void *next;                       /* next element in app order      */\n   struct UT_hash_handle *hh_prev;   /* previous hh in bucket order    */\n   struct UT_hash_handle *hh_next;   /* next hh in bucket order        */\n   void *key;                        /* ptr to enclosing struct's key  */\n   unsigned keylen;                  /* enclosing struct's key len     */\n   unsigned hashv;                   /* result of hash-fcn(key)        */\n} UT_hash_handle;\n\n#endif /* UTHASH_H */\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/utils.c",
    "content": "/*\n * utils.c - Misc utilities\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdlib.h>\n#include <unistd.h>\n#include <string.h>\n#include <errno.h>\n#include <ctype.h>\n#ifndef __MINGW32__\n#include <pwd.h>\n#include <grp.h>\n#endif\n\n#include <sys/types.h>\n#include <sys/stat.h>\n\n#include \"utils.h\"\n\n#ifdef HAVE_SETRLIMIT\n#include <sys/time.h>\n#include <sys/resource.h>\n#endif\n\n#define INT_DIGITS 19           /* enough for 64 bit integer */\n\n#ifdef LIB_ONLY\nFILE *logfile;\n#endif\n\n#ifdef HAS_SYSLOG\nint use_syslog = 0;\n#endif\n\n#ifndef __MINGW32__\nvoid\nERROR(const char *s)\n{\n    char *msg = strerror(errno);\n    LOGE(\"%s: %s\", s, msg);\n}\n\n#endif\n\nint use_tty = 1;\n\nchar *\nss_itoa(int i)\n{\n    /* Room for INT_DIGITS digits, - and '\\0' */\n    static char buf[INT_DIGITS + 2];\n    char *p = buf + INT_DIGITS + 1;     /* points to terminating '\\0' */\n    if (i >= 0) {\n        do {\n            *--p = '0' + (i % 10);\n            i   /= 10;\n        } while (i != 0);\n        return p;\n    } else {                     /* i < 0 */\n        do {\n            *--p = '0' - (i % 10);\n            i   /= 10;\n        } while (i != 0);\n        *--p = '-';\n    }\n    return p;\n}\n\nint\nss_isnumeric(const char *s) {\n    if (!s || !*s)\n        return 0;\n    while (isdigit(*s))\n        ++s;\n    return *s == '\\0';\n}\n\n/*\n * setuid() and setgid() for a specified user.\n */\nint\nrun_as(const char *user)\n{\n#ifndef __MINGW32__\n    if (user[0]) {\n        /* Convert user to a long integer if it is a non-negative number.\n         * -1 means it is a user name. */\n        long uid = -1;\n        if (ss_isnumeric(user)) {\n            errno = 0;\n            char *endptr;\n            uid = strtol(user, &endptr, 10);\n            if (errno || endptr == user)\n                uid = -1;\n        }\n\n#ifdef HAVE_GETPWNAM_R\n        struct passwd pwdbuf, *pwd;\n        memset(&pwdbuf, 0, sizeof(struct passwd));\n        size_t buflen;\n        int err;\n\n        for (buflen = 128;; buflen *= 2) {\n            char buf[buflen];  /* variable length array */\n\n            /* Note that we use getpwnam_r() instead of getpwnam(),\n             * which returns its result in a statically allocated buffer and\n             * cannot be considered thread safe. */\n            err = uid >= 0 ? getpwuid_r((uid_t)uid, &pwdbuf, buf, buflen, &pwd)\n                : getpwnam_r(user, &pwdbuf, buf, buflen, &pwd);\n\n            if (err == 0 && pwd) {\n                /* setgid first, because we may not be allowed to do it anymore after setuid */\n                if (setgid(pwd->pw_gid) != 0) {\n                    LOGE(\n                        \"Could not change group id to that of run_as user '%s': %s\",\n                        pwd->pw_name, strerror(errno));\n                    return 0;\n                }\n\n                if (initgroups(pwd->pw_name, pwd->pw_gid) == -1) {\n                    LOGE(\"Could not change supplementary groups for user '%s'.\", pwd->pw_name);\n                    return 0;\n                }\n\n                if (setuid(pwd->pw_uid) != 0) {\n                    LOGE(\n                        \"Could not change user id to that of run_as user '%s': %s\",\n                        pwd->pw_name, strerror(errno));\n                    return 0;\n                }\n                break;\n            } else if (err != ERANGE) {\n                if (err) {\n                    LOGE(\"run_as user '%s' could not be found: %s\", user,\n                            strerror(err));\n                } else {\n                    LOGE(\"run_as user '%s' could not be found.\", user);\n                }\n                return 0;\n            } else if (buflen >= 16 * 1024) {\n                /* If getpwnam_r() seems defective, call it quits rather than\n                 * keep on allocating ever larger buffers until we crash. */\n                LOGE(\n                    \"getpwnam_r() requires more than %u bytes of buffer space.\",\n                    (unsigned)buflen);\n                return 0;\n            }\n            /* Else try again with larger buffer. */\n        }\n#else\n        /* No getpwnam_r() :-(  We'll use getpwnam() and hope for the best. */\n        struct passwd *pwd;\n\n        if (!(pwd = uid >=0 ? getpwuid((uid_t)uid) : getpwnam(user))) {\n            LOGE(\"run_as user %s could not be found.\", user);\n            return 0;\n        }\n        /* setgid first, because we may not allowed to do it anymore after setuid */\n        if (setgid(pwd->pw_gid) != 0) {\n            LOGE(\"Could not change group id to that of run_as user '%s': %s\",\n                 pwd->pw_name, strerror(errno));\n            return 0;\n        }\n        if (initgroups(pwd->pw_name, pwd->pw_gid) == -1) {\n            LOGE(\"Could not change supplementary groups for user '%s'.\", pwd->pw_name);\n            return 0;\n        }\n        if (setuid(pwd->pw_uid) != 0) {\n            LOGE(\"Could not change user id to that of run_as user '%s': %s\",\n                 pwd->pw_name, strerror(errno));\n            return 0;\n        }\n#endif\n    }\n\n#endif // __MINGW32__\n    return 1;\n}\n\nchar *\nss_strndup(const char *s, size_t n)\n{\n    size_t len = strlen(s);\n    char *ret;\n\n    if (len <= n) {\n        return strdup(s);\n    }\n\n    ret = ss_malloc(n + 1);\n    strncpy(ret, s, n);\n    ret[n] = '\\0';\n    return ret;\n}\n\nchar *\nss_strdup(const char *s) {\n    if (!s) {\n        return NULL;\n    }\n\n    return strdup(s);\n}\n\nvoid\nFATAL(const char *msg)\n{\n    LOGE(\"%s\", msg);\n    exit(-1);\n}\n\nvoid *\nss_malloc(size_t size)\n{\n    void *tmp = malloc(size);\n    if (tmp == NULL)\n        exit(EXIT_FAILURE);\n    return tmp;\n}\n\nvoid *\nss_realloc(void *ptr, size_t new_size)\n{\n    void *new = realloc(ptr, new_size);\n    if (new == NULL) {\n        free(ptr);\n        ptr = NULL;\n        exit(EXIT_FAILURE);\n    }\n    return new;\n}\n\nvoid\nusage()\n{\n    printf(\"\\n\");\n    printf(\"shadowsocks-libev %s with %s\\n\\n\", VERSION, USING_CRYPTO);\n    printf(\n        \"  maintained by Max Lv <max.c.lv@gmail.com> and Linus Yang <laokongzi@gmail.com>\\n\\n\");\n    printf(\"  usage:\\n\\n\");\n#ifdef MODULE_LOCAL\n    printf(\"    ss-local\\n\");\n#elif MODULE_REMOTE\n    printf(\"    ss-server\\n\");\n#elif MODULE_TUNNEL\n    printf(\"    ss-tunnel\\n\");\n#elif MODULE_REDIR\n    printf(\"    ss-redir\\n\");\n#elif MODULE_MANAGER\n    printf(\"    ss-manager\\n\");\n#endif\n    printf(\"\\n\");\n    printf(\n        \"       -s <server_host>           Host name or IP address of your remote server.\\n\");\n    printf(\n        \"       -p <server_port>           Port number of your remote server.\\n\");\n    printf(\n        \"       -l <local_port>            Port number of your local server.\\n\");\n    printf(\n        \"       -k <password>              Password of your remote server.\\n\");\n    printf(\n        \"       -m <encrypt_method>        Encrypt method: table, rc4, rc4-md5,\\n\");\n    printf(\n        \"                                  aes-128-cfb, aes-192-cfb, aes-256-cfb,\\n\");\n    printf(\n        \"                                  aes-128-ctr, aes-192-ctr, aes-256-ctr,\\n\");\n    printf(\n        \"                                  bf-cfb, camellia-128-cfb, camellia-192-cfb,\\n\");\n    printf(\n        \"                                  camellia-256-cfb, cast5-cfb, des-cfb,\\n\");\n    printf(\n        \"                                  idea-cfb, rc2-cfb, seed-cfb, salsa20,\\n\");\n    printf(\n        \"                                  chacha20 and chacha20-ietf.\\n\");\n    printf(\n        \"                                  The default cipher is rc4-md5.\\n\");\n    printf(\"\\n\");\n    printf(\n        \"       [-a <user>]                Run as another user.\\n\");\n    printf(\n        \"       [-f <pid_file>]            The file path to store pid.\\n\");\n    printf(\n        \"       [-t <timeout>]             Socket timeout in seconds.\\n\");\n    printf(\n        \"       [-c <config_file>]         The path to config file.\\n\");\n#ifdef HAVE_SETRLIMIT\n    printf(\n        \"       [-n <number>]              Max number of open files.\\n\");\n#endif\n#ifndef MODULE_REDIR\n    printf(\n        \"       [-i <interface>]           Network interface to bind.\\n\");\n#endif\n    printf(\n        \"       [-b <local_address>]       Local address to bind.\\n\");\n    printf(\"\\n\");\n    printf(\n        \"       [-u]                       Enable UDP relay.\\n\");\n#ifdef MODULE_REDIR\n    printf(\n        \"                                  TPROXY is required in redir mode.\\n\");\n#endif\n    printf(\n        \"       [-U]                       Enable UDP relay and disable TCP relay.\\n\");\n#ifdef MODULE_REMOTE\n    printf(\n        \"       [-6]                       Resovle hostname to IPv6 address first.\\n\");\n#endif\n    printf(\"\\n\");\n#ifdef MODULE_TUNNEL\n    printf(\n        \"       [-L <addr>:<port>]         Destination server address and port\\n\");\n    printf(\n        \"                                  for local port forwarding.\\n\");\n#endif\n#ifdef MODULE_REMOTE\n    printf(\n        \"       [-d <addr>]                Name servers for internal DNS resolver.\\n\");\n#endif\n#if defined(MODULE_REMOTE) || defined(MODULE_LOCAL)\n    printf(\n        \"       [--fast-open]              Enable TCP fast open.\\n\");\n    printf(\n        \"                                  with Linux kernel > 3.7.0.\\n\");\n    printf(\n        \"       [--acl <acl_file>]         Path to ACL (Access Control List).\\n\");\n#endif\n#if defined(MODULE_REMOTE) || defined(MODULE_MANAGER)\n    printf(\n        \"       [--manager-address <addr>] UNIX domain socket address.\\n\");\n#endif\n#ifdef MODULE_MANAGER\n    printf(\n        \"       [--executable <path>]      Path to the executable of ss-server.\\n\");\n#endif\n    printf(\n        \"       [--mtu <MTU>]              MTU of your network interface.\\n\");\n#ifdef __linux__\n    printf(\n        \"       [--mptcp]                  Enable Multipath TCP on MPTCP Kernel.\\n\");\n#ifdef MODULE_REMOTE\n    printf(\n        \"       [--firewall]               Setup firewall rules for auto blocking.\\n\");\n#endif\n#endif\n    printf(\"\\n\");\n    printf(\n        \"       [-v]                       Verbose mode.\\n\");\n    printf(\n        \"       [-h, --help]               Print this message.\\n\");\n    printf(\"\\n\");\n}\n\nvoid\ndaemonize(const char *path)\n{\n#ifndef __MINGW32__\n    /* Our process ID and Session ID */\n    pid_t pid, sid;\n\n    /* Fork off the parent process */\n    pid = fork();\n    if (pid < 0) {\n        exit(EXIT_FAILURE);\n    }\n\n    /* If we got a good PID, then\n     * we can exit the parent process. */\n    if (pid > 0) {\n        FILE *file = fopen(path, \"w\");\n        if (file == NULL) {\n            FATAL(\"Invalid pid file\\n\");\n        }\n\n        fprintf(file, \"%d\", (int)pid);\n        fclose(file);\n        exit(EXIT_SUCCESS);\n    }\n\n    /* Change the file mode mask */\n    umask(0);\n\n    /* Open any logs here */\n\n    /* Create a new SID for the child process */\n    sid = setsid();\n    if (sid < 0) {\n        /* Log the failure */\n        exit(EXIT_FAILURE);\n    }\n\n    /* Change the current working directory */\n    if ((chdir(\"/\")) < 0) {\n        /* Log the failure */\n        exit(EXIT_FAILURE);\n    }\n\n    /* Close out the standard file descriptors */\n    close(STDIN_FILENO);\n    close(STDOUT_FILENO);\n    close(STDERR_FILENO);\n#endif\n}\n\n#ifdef HAVE_SETRLIMIT\nint\nset_nofile(int nofile)\n{\n    struct rlimit limit = { nofile, nofile }; /* set both soft and hard limit */\n\n    if (nofile <= 0) {\n        FATAL(\"nofile must be greater than 0\\n\");\n    }\n\n    if (setrlimit(RLIMIT_NOFILE, &limit) < 0) {\n        if (errno == EPERM) {\n            LOGE(\n                \"insufficient permission to change NOFILE, not starting as root?\");\n            return -1;\n        } else if (errno == EINVAL) {\n            LOGE(\"invalid nofile, decrease nofile and try again\");\n            return -1;\n        } else {\n            LOGE(\"setrlimit failed: %s\", strerror(errno));\n            return -1;\n        }\n    }\n\n    return 0;\n}\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/utils.h",
    "content": "/*\n * utils.h - Misc utilities\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#if defined(USE_CRYPTO_OPENSSL)\n\n#include <openssl/opensslv.h>\n#define USING_CRYPTO OPENSSL_VERSION_TEXT\n\n#elif defined(USE_CRYPTO_POLARSSL)\n#include <polarssl/version.h>\n#define USING_CRYPTO POLARSSL_VERSION_STRING_FULL\n\n#elif defined(USE_CRYPTO_MBEDTLS)\n#include <mbedtls/version.h>\n#define USING_CRYPTO MBEDTLS_VERSION_STRING_FULL\n\n#endif\n\n#ifndef _UTILS_H\n#define _UTILS_H\n\n#include <stddef.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <time.h>\n\n#define PORTSTRLEN 16\n#define SS_ADDRSTRLEN (INET6_ADDRSTRLEN + PORTSTRLEN + 1)\n\n#ifdef ANDROID\n\n#include <android/log.h>\n\n#define USE_TTY()\n#define USE_SYSLOG(ident)\n#define LOGI(...)                                                \\\n    ((void)__android_log_print(ANDROID_LOG_DEBUG, \"shadowsocks\", \\\n                               __VA_ARGS__))\n#define LOGE(...)                                                \\\n    ((void)__android_log_print(ANDROID_LOG_ERROR, \"shadowsocks\", \\\n                               __VA_ARGS__))\n\n#else\n\n#define STR(x) # x\n#define TOSTR(x) STR(x)\n\n#ifdef LIB_ONLY\n\nextern FILE *logfile;\n\n#define TIME_FORMAT \"%Y-%m-%d %H:%M:%S\"\n\n#define USE_TTY()\n\n#define USE_SYSLOG(ident)\n\n#define USE_LOGFILE(ident)                                     \\\n    do {                                                       \\\n        if (ident != NULL) { logfile = fopen(ident, \"w+\"); } } \\\n    while (0)\n\n#define CLOSE_LOGFILE                               \\\n    do {                                            \\\n        if (logfile != NULL) { fclose(logfile); } } \\\n    while (0)\n\n#define LOGI(format, ...)                                                        \\\n    do {                                                                         \\\n        if (logfile != NULL) {                                                   \\\n            time_t now = time(NULL);                                             \\\n            char timestr[20];                                                    \\\n            strftime(timestr, 20, TIME_FORMAT, localtime(&now));                 \\\n            fprintf(logfile, \" %s INFO: \" format \"\\n\", timestr, ## __VA_ARGS__); \\\n            fflush(logfile); }                                                   \\\n    }                                                                            \\\n    while (0)\n\n#define LOGE(format, ...)                                        \\\n    do {                                                         \\\n        if (logfile != NULL) {                                   \\\n            time_t now = time(NULL);                             \\\n            char timestr[20];                                    \\\n            strftime(timestr, 20, TIME_FORMAT, localtime(&now)); \\\n            fprintf(logfile, \" %s ERROR: \" format \"\\n\", timestr, \\\n                    ## __VA_ARGS__);                             \\\n            fflush(logfile); }                                   \\\n    }                                                            \\\n    while (0)\n\n#elif defined(_WIN32)\n\n#define TIME_FORMAT \"%Y-%m-%d %H:%M:%S\"\n\n#define USE_TTY()\n\n#define USE_SYSLOG(ident)\n\n#define LOGI(format, ...)                                                   \\\n    do {                                                                    \\\n        time_t now = time(NULL);                                            \\\n        char timestr[20];                                                   \\\n        strftime(timestr, 20, TIME_FORMAT, localtime(&now));                \\\n        fprintf(stderr, \" %s INFO: \" format \"\\n\", timestr, ## __VA_ARGS__); \\\n        fflush(stderr); }                                                   \\\n    while (0)\n\n#define LOGE(format, ...)                                                    \\\n    do {                                                                     \\\n        time_t now = time(NULL);                                             \\\n        char timestr[20];                                                    \\\n        strftime(timestr, 20, TIME_FORMAT, localtime(&now));                 \\\n        fprintf(stderr, \" %s ERROR: \" format \"\\n\", timestr, ## __VA_ARGS__); \\\n        fflush(stderr); }                                                    \\\n    while (0)\n\n#else\n\n#include <syslog.h>\n\nextern int use_tty;\n#define USE_TTY()                        \\\n    do {                                 \\\n        use_tty = isatty(STDERR_FILENO); \\\n    } while (0)                          \\\n\n#define HAS_SYSLOG\nextern int use_syslog;\n\n#define TIME_FORMAT \"%F %T\"\n\n#define USE_SYSLOG(ident)                          \\\n    do {                                           \\\n        use_syslog = 1;                            \\\n        openlog((ident), LOG_CONS | LOG_PID, 0); } \\\n    while (0)\n\n#define LOGI(format, ...)                                                        \\\n    do {                                                                         \\\n        if (use_syslog) {                                                        \\\n            syslog(LOG_INFO, format, ## __VA_ARGS__);                            \\\n        } else {                                                                 \\\n            time_t now = time(NULL);                                             \\\n            char timestr[20];                                                    \\\n            strftime(timestr, 20, TIME_FORMAT, localtime(&now));                 \\\n            if (use_tty) {                                                       \\\n                fprintf(stderr, \"\\e[01;32m %s INFO: \\e[0m\" format \"\\n\", timestr, \\\n                        ## __VA_ARGS__);                                         \\\n            } else {                                                             \\\n                fprintf(stderr, \" %s INFO: \" format \"\\n\", timestr,               \\\n                        ## __VA_ARGS__);                                         \\\n            }                                                                    \\\n        }                                                                        \\\n    }                                                                            \\\n    while (0)\n\n#define LOGE(format, ...)                                                         \\\n    do {                                                                          \\\n        if (use_syslog) {                                                         \\\n            syslog(LOG_ERR, format, ## __VA_ARGS__);                              \\\n        } else {                                                                  \\\n            time_t now = time(NULL);                                              \\\n            char timestr[20];                                                     \\\n            strftime(timestr, 20, TIME_FORMAT, localtime(&now));                  \\\n            if (use_tty) {                                                        \\\n                fprintf(stderr, \"\\e[01;35m %s ERROR: \\e[0m\" format \"\\n\", timestr, \\\n                        ## __VA_ARGS__);                                          \\\n            } else {                                                              \\\n                fprintf(stderr, \" %s ERROR: \" format \"\\n\", timestr,               \\\n                        ## __VA_ARGS__);                                          \\\n            }                                                                     \\\n        } }                                                                       \\\n    while (0)\n\n#endif\n/* _WIN32 */\n\n#endif\n\n#ifdef __MINGW32__\n\n#ifdef ERROR\n#undef ERROR\n#endif\n#define ERROR(s) ss_error(s)\n\n#else\n\nvoid ERROR(const char *s);\n\n#endif\n\nchar *ss_itoa(int i);\nint ss_isnumeric(const char *s);\nint run_as(const char *user);\nvoid FATAL(const char *msg);\nvoid usage(void);\nvoid daemonize(const char *path);\nchar *ss_strndup(const char *s, size_t n);\nchar *ss_strdup(const char *s);\n#ifdef HAVE_SETRLIMIT\nint set_nofile(int nofile);\n#endif\n\nvoid *ss_malloc(size_t size);\nvoid *ss_realloc(void *ptr, size_t new_size);\n\n#define ss_free(ptr)     \\\n    do {                 \\\n        free(ptr);       \\\n        ptr = NULL;      \\\n    } while (0)\n\n#endif // _UTILS_H\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/win32.c",
    "content": "/*\n * win32.c - Win32 port helpers\n *\n * Copyright (C) 2014, Linus Yang <linusyang@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#include \"win32.h\"\n#include \"utils.h\"\n\n#ifdef setsockopt\n#undef setsockopt\n#endif\n\nvoid\nwinsock_init(void)\n{\n    WORD wVersionRequested;\n    WSADATA wsaData;\n    int ret;\n    wVersionRequested = MAKEWORD(1, 1);\n    ret               = WSAStartup(wVersionRequested, &wsaData);\n    if (ret != 0) {\n        FATAL(\"Could not initialize winsock\");\n    }\n    if (LOBYTE(wsaData.wVersion) != 1 || HIBYTE(wsaData.wVersion) != 1) {\n        WSACleanup();\n        FATAL(\"Could not find a usable version of winsock\");\n    }\n}\n\nvoid\nwinsock_cleanup(void)\n{\n    WSACleanup();\n}\n\nvoid\nss_error(const char *s)\n{\n    LPVOID *msg = NULL;\n    FormatMessage(\n        FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,\n        NULL, WSAGetLastError(),\n        MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),\n        (LPTSTR)&msg, 0, NULL);\n    if (msg != NULL) {\n        LOGE(\"%s: %s\", s, (char *)msg);\n        LocalFree(msg);\n    }\n}\n\nint\nsetnonblocking(int fd)\n{\n    u_long iMode = 1;\n    long int iResult;\n    iResult = ioctlsocket(fd, FIONBIO, &iMode);\n    if (iResult != NO_ERROR) {\n        LOGE(\"ioctlsocket failed with error: %ld\\n\", iResult);\n    }\n    return iResult;\n}\n\nsize_t\nstrnlen(const char *s, size_t maxlen)\n{\n    const char *end = memchr(s, 0, maxlen);\n    return end ? (size_t)(end - s) : maxlen;\n}\n\nconst char *\ninet_ntop(int af, const void *src, char *dst, socklen_t size)\n{\n    struct sockaddr_storage ss;\n    unsigned long s = size;\n    ZeroMemory(&ss, sizeof(ss));\n    ss.ss_family = af;\n    switch (af) {\n    case AF_INET:\n        ((struct sockaddr_in *)&ss)->sin_addr = *(struct in_addr *)src;\n        break;\n    case AF_INET6:\n        ((struct sockaddr_in6 *)&ss)->sin6_addr = *(struct in6_addr *)src;\n        break;\n    default:\n        return NULL;\n    }\n    return (WSAAddressToString((struct sockaddr *)&ss, sizeof(ss), NULL, dst,\n                               &s) == 0) ? dst : NULL;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/shadowsocksr-libev/src/src/win32.h",
    "content": "/*\n * win32.h - Win32 port helpers\n *\n * Copyright (C) 2014, Linus Yang <linusyang@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _WIN32_H\n#define _WIN32_H\n\n#ifdef _WIN32_WINNT\n#undef _WIN32_WINNT\n#endif\n\n#define _WIN32_WINNT 0x0501\n\n#include <winsock2.h>\n#include <ws2tcpip.h>\n\n#ifdef EWOULDBLOCK\n#undef EWOULDBLOCK\n#endif\n\n#ifdef errno\n#undef errno\n#endif\n\n#ifdef ERROR\n#undef ERROR\n#endif\n\n#ifndef AI_ALL\n#define AI_ALL 0x00000100\n#endif\n\n#ifndef AI_ADDRCONFIG\n#define AI_ADDRCONFIG 0x00000400\n#endif\n\n#ifndef AI_V4MAPPED\n#define AI_V4MAPPED 0x00000800\n#endif\n\n#ifndef IPV6_V6ONLY\n#define IPV6_V6ONLY 27 // Treat wildcard bind as AF_INET6-only.\n#endif\n\n#define EWOULDBLOCK WSAEWOULDBLOCK\n#define errno WSAGetLastError()\n#define close(fd) closesocket(fd)\n#define ERROR(s) ss_error(s)\n#define setsockopt(a, b, c, d, e) setsockopt(a, b, c, (char *)(d), e)\n\nvoid winsock_init(void);\nvoid winsock_cleanup(void);\nvoid ss_error(const char *s);\nsize_t strnlen(const char *s, size_t maxlen);\nint setnonblocking(int fd);\nconst char *inet_ntop(int af, const void *src, char *dst, socklen_t size);\n\n#endif\n"
  },
  {
    "path": "luci-app-ssr-plus/simple-obfs/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-or-later\n#\n# Copyright (C) 2017-2019 Jian Chang <aa65535@live.com>\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=simple-obfs\nPKG_VERSION:=0.0.5\nPKG_RELEASE:=1\n\nPKG_SOURCE_PROTO:=git\nPKG_SOURCE_URL:=https://github.com/shadowsocks/simple-obfs.git\nPKG_SOURCE_DATE:=2019-08-17\nPKG_SOURCE_VERSION:=486bebd9208539058e57e23a12f23103016e09b4\nPKG_MIRROR_HASH:=bc97eba511b86a089ab4bcf0ac78d9e4a39c59046d5cde77b79a118245daa0ba\n\nPKG_LICENSE:=GPL-3.0-or-later\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=Jian Chang <aa65535@live.com>\n\nPKG_BUILD_DEPENDS:=libev\nPKG_FIXUP:=autoreconf\nPKG_BUILD_PARALLEL:=1\nPKG_INSTALL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/simple-obfs/template\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=A simple obfuscating tool\n  URL:=https://github.com/shadowsocks/simple-obfs\n  DEPENDS:=+libpthread +libev\nendef\n\ndefine Package/simple-obfs-client\n  $(call Package/simple-obfs/template)\n  TITLE+= (client)\n  PROVIDES:=simple-obfs\nendef\n\ndefine Package/simple-obfs-server\n  $(call Package/simple-obfs/template)\n  TITLE+= (server)\nendef\n\ndefine Package/simple-obfs/description\n  Simple-obfs is a simple obfusacting tool, designed as plugin server of shadowsocks.\nendef\n\nPackage/simple-obfs-client/description = $(Package/simple-obfs/description)\nPackage/simple-obfs-server/description = $(Package/simple-obfs/description)\n\nCONFIGURE_ARGS += \\\n\t--disable-ssp \\\n\t--disable-documentation \\\n\t--disable-assert\n\ndefine Package/simple-obfs-client/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/obfs-local $(1)/usr/bin/\nendef\n\ndefine Package/simple-obfs-server/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/obfs-server $(1)/usr/bin/\nendef\n\n$(eval $(call BuildPackage,simple-obfs-client))\n$(eval $(call BuildPackage,simple-obfs-server))\n"
  },
  {
    "path": "luci-app-ssr-plus/tcping/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=tcping\nPKG_VERSION:=1\nPKG_RELEASE:=1\n\nPKG_LICENSE:=GPL-2.0-only\nPKG_LICENSE_FILES:=license.txt\n\nPKG_BUILD_PARALLEL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/tcping\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=tcping measures the latency of a tcp-connection\n  URL:=https://github.com/jlyo/tcping\nendef\n\ndefine Package/tcping/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/tcping $(1)/usr/bin/\nendef\n\n$(eval $(call BuildPackage,tcping))\n"
  },
  {
    "path": "luci-app-ssr-plus/tcping/src/Makefile",
    "content": "CC=gcc\n\nLDFLAGS=\nCFLAGS=-g -Wall -Wextra -Werror -pedantic\n\nVERSION=0.3\n\nOBJS=main.o tcp.o\n\nall: tcping\n\ntcping: $(OBJS)\n\t$(CC) $(OBJS) $(LDFLAGS) -o tcping\n\ninstall: tcping\n\tcp tcping $(DESTDIR)/usr/bin\n\nclean:\n\trm -f $(OBJS) core tcping\n\npackage: clean\n\t# source package\n\trm -rf tcping-$(VERSION)*\n\tmkdir tcping-$(VERSION)\n\tcp *.c *.h Makefile readme.txt license.txt tcping-$(VERSION)\n\ttar czf tcping-$(VERSION).tgz tcping-$(VERSION)\n\trm -rf tcping-$(VERSION)\n"
  },
  {
    "path": "luci-app-ssr-plus/tcping/src/license.txt",
    "content": "\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n                       59 Temple Place, Suite 330, Boston, MA  02111-1307  USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Library General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\f\n\t\t    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\f\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\f\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\f\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n"
  },
  {
    "path": "luci-app-ssr-plus/tcping/src/main.c",
    "content": "#include <stdio.h>\n#include <errno.h>\n#include <stdlib.h>\n#include <string.h>\n#include <signal.h>\n#include <unistd.h>\n#include <sys/time.h>\n\n#include \"tcp.h\"\n\n#define abs(x) ((x) < 0 ? -(x) : (x))\n\nstatic volatile int stop = 0;\n\nvoid usage(void)\n{\n\tfprintf(stderr, \"tcping version 0.3\\n\");\n\n\tfprintf(stderr,\n\t\t\"Usage: tcping [-fqhv] [-p port] [-c count] [-i interval] [-t timeout] destination\\n\");\n\tfprintf(stderr,\n\t\t\"-p port\t\tPort number (default port 80)\\n\");\n\tfprintf(stderr, \"-c count\tHow many times to connect\\n\");\n\tfprintf(stderr, \"-i interval\tDelay between each connect\\n\");\n\tfprintf(stderr, \"-f\t\tFlood connect (no delays)\\n\");\n\tfprintf(stderr, \"-q\t\tQuiet, only returncode\\n\");\n\tfprintf(stderr, \"-t              Set timeout when connecting\\n\");\n\tfprintf(stderr, \"-h\t\tThis help text\\n\");\n}\n\nvoid handler(int sig)\n{\n\tfprintf(stderr, \"\\nreceive signal:[%d]\\n\", sig);\n\tstop = 1;\n}\n\nint main(int argc, char *argv[])\n{\n\tchar *hostname = NULL;\n\tchar *portnr = \"80\";\n\tint c;\n\tint count = -1, curncount = 0;\n\tint wait = 1, quiet = 0;\n\tint ok = 0, err = 0;\n\tint timeout = 3;\n\tdouble min = 999999999999999.0, avg = 0.0, max = 0.0;\n\tstruct addrinfo *resolved;\n\tint errcode;\n\tint seen_addrnotavail;\n\n\twhile ((c = getopt(argc, argv, \"t:hp:c:i:fq?\")) != -1) {\n\t\tswitch (c) {\n\t\tcase 'p':\n\t\t\tportnr = optarg;\n\t\t\tbreak;\n\n\t\tcase 'c':\n\t\t\tcount = atoi(optarg);\n\t\t\tbreak;\n\n\t\tcase 't':\n            \t        timeout = atoi(optarg);\n\t\t        break;\n\n\t\tcase 'i':\n\t\t\twait = atoi(optarg);\n\t\t\tbreak;\n\n\t\tcase 'f':\n\t\t\twait = 0;\n\t\t\tbreak;\n\n\t\tcase 'q':\n\t\t\tquiet = 1;\n\t\t\tbreak;\n\n\t\tcase '?':\n\t\tdefault:\n\t\t\tusage();\n\t\t\treturn 0;\n\t\t}\n\t}\n\n\tif (optind >= argc) {\n\t  /*\n\t\tfprintf(stderr, \"No hostname given\\n\");\n\t  */\n\t\tusage();\n\t\treturn 3;\n\t}\n\thostname = argv[optind];\n\n\tsignal(SIGINT, handler);\n\tsignal(SIGTERM, handler);\n\n\tif ((errcode = lookup(hostname, portnr, &resolved)) != 0) {\n\t\tfprintf(stderr, \"%s\\n\", gai_strerror(errcode));\n\t\treturn 2;\n\t}\n\n\tif (!quiet)\n\t\tprintf(\"TCPING %s:%s\\n\", hostname, portnr);\n\n\twhile ((curncount < count || count == -1) && stop == 0) {\n\t\tdouble ms;\n\t\tstruct timeval rtt;\n\n\t\tif ((errcode = connect_to(resolved, &rtt, timeout)) != 0) {\n\t\t\tif (errcode != -EADDRNOTAVAIL) {\n\t\t\t\tprintf\n\t\t\t\t    (\"error connecting to host (%d): %s\",\n\t\t\t\t     -errcode, strerror(-errcode));\n\t\t\t\tif(-errcode == EINPROGRESS){\n\t\t\t\t  printf(\" [Timeout]\\n\");\n\t\t\t\t}else{\n\t\t\t\t  printf(\"\\n\");\n\t\t\t\t}\n\t\t\t\terr++;\n\t\t\t} else {\n\t\t\t\tif (seen_addrnotavail) {\n\t\t\t\t\tprintf(\".\");\n\t\t\t\t\tfflush(stdout);\n\t\t\t\t} else {\n\t\t\t\t\tprintf\n\t\t\t\t\t    (\"error connecting to host (%d): %s\\n\",\n\t\t\t\t\t     -errcode, strerror(-errcode));\n\t\t\t\t}\n\t\t\t\tseen_addrnotavail = 1;\n\t\t\t}\n\t\t} else {\n\t\t\tseen_addrnotavail = 0;\n\t\t\tok++;\n\n\t\t\tms = ((double) rtt.tv_sec * 1000.0) +\n\t\t\t    ((double) rtt.tv_usec / 1000.0);\n\t\t\tavg += ms;\n\t\t\tmin = min > ms ? ms : min;\n\t\t\tmax = max < ms ? ms : max;\n\n\t\t\tprintf\n\t\t\t    (\"response from %s:%s, seq=%d time=%.2f ms\\n\",\n\t\t\t     hostname, portnr, curncount, ms);\n\t\t\tif (ms > 500)\n\t\t\t\tbreak;\t/* Stop the test on the first long connect() */\n\t\t}\n\n\t\tcurncount++;\n\n\t\tif (curncount != count)\n\t\t\tsleep(wait);\n\t}\n\n\tif (!quiet) {\n\t\tprintf(\"--- %s:%s tcping statistics ---\\n\", hostname,\n\t\t       portnr);\n\t\tprintf(\"%d responses, %d ok, %3.2f%% failed\\n\", curncount,\n\t\t       ok,\n\t\t       (((double) err) / abs(((double) count)) * 100.0));\n\t\tprintf(\"round-trip min/avg/max = %.1f/%.1f/%.1f ms\\n\", min,\n\t\t       avg / (double) ok, max);\n\t}\n\n\tfreeaddrinfo(resolved);\n\tif (ok)\n\t\treturn 0;\n\telse\n\t\treturn 127;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/tcping/src/readme.txt",
    "content": "Installation:\n------------\nmake install\n\n\nUsage:\n-----\nRoutine tasks\n\ntcping Web Server:\n\ttcping localhost \n\ttcping -p 80 127.0.0.1\n\ttcping -p 8080 localhost\n\ntcping once:\n\ttcping -p port -c 1 hostname\n\ntcping returns:\n\t0 on success\n\t2 if the host or service could not be resolved\n\t127 on other errors\n\nfix bug:\n\t1:add timeout option  [2012年6月1日16:16:42]\n\nTodo list:\n\n"
  },
  {
    "path": "luci-app-ssr-plus/tcping/src/tcp.c",
    "content": "#include <errno.h>\n#include <netdb.h>\n#include <netinet/in.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <sys/socket.h>\n#include <sys/time.h>\n#include <sys/types.h>\n#include <unistd.h>\n#include <fcntl.h>\n\n#include \"tcp.h\"\n\nint lookup(char *host, char *portnr, struct addrinfo **res)\n{\n\tstruct addrinfo hints;\n\tmemset(&hints, 0, sizeof(struct addrinfo));\n\thints.ai_family = AF_UNSPEC;\n\thints.ai_socktype = SOCK_STREAM;\n\thints.ai_flags = AI_NUMERICSERV;\n\thints.ai_protocol = 0;\n\n\treturn getaddrinfo(host, portnr, &hints, res);\n}\n\nint connect_to(struct addrinfo *addr, struct timeval *rtt, int timeout)\n{\n\tint fd;\n\tstruct timeval start;\n\tint connect_result;\n\tconst int on = 1;\n\tstruct timeval tm;\n\tfd_set set;\n\tint flags;\n\tint ret;\n\t/* int flags; */\n\tint rv = 0;\n\n\t/* try to connect for each of the entries: */\n\twhile (addr != NULL) {\n\t\t/* create socket */\n\t\tif ((fd =\n\t\t     socket(addr->ai_family, addr->ai_socktype,\n\t\t\t    addr->ai_protocol)) == -1)\n\t\t\tgoto next_addr0;\n\t\tif (setsockopt\n\t\t    (fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)) < 0)\n\t\t\tgoto next_addr1;\n\n\t\tif ((flags = fcntl(fd, F_GETFL, 0)) == -1)\n\t\t\tgoto next_addr1;\n\t\tif (fcntl(fd, F_SETFL, flags | O_NONBLOCK) == -1)\n\t\t\tgoto next_addr1;\n\n\t\tif (gettimeofday(&start, NULL) == -1)\n\t\t\tgoto next_addr1;\n\n\t\t/* connect to peer */\n\t\tconnect_result = connect(fd, addr->ai_addr, addr->ai_addrlen);\n\t\tif (connect_result == -1 && errno != EINPROGRESS) {\n\t\t  goto next_addr1;\n\t\t}\n\t\t\t\n\t\ttm.tv_sec  = timeout;\n\t\ttm.tv_usec = 0;\n\n\t\tFD_ZERO(&set);\n\t\tFD_SET(fd, &set);\n\t\tret = select(fd+1, NULL, &set, NULL, &tm);\n\t\tswitch(ret){\n\t\tcase 0:/* timeout */\n\t\tcase -1:\n\t\t  goto next_addr1;\n\t\t  break;\n\t\tdefault:/* Connection ok or refused*/\n\t\t  ret = write(fd, \"\", 0);/* only test, no data send */\n\t\t  if(ret <0) goto next_addr1;\n\t\t  break;\n\t\t}\n\t\t\n\t\tif (gettimeofday(rtt, NULL) == -1)\n\t\t  goto next_addr1;\n\t\trtt->tv_sec = rtt->tv_sec - start.tv_sec;\n\t\trtt->tv_usec = rtt->tv_usec - start.tv_usec;\n\t\tclose(fd);\n\t\treturn 0;\n\t\n\tnext_addr1:\n\t\tclose(fd);\n\tnext_addr0:\n\t\taddr = addr->ai_next;\n\t}\n\t\n\trv = rv ? rv : -errno;\n\treturn rv;\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/tcping/src/tcp.h",
    "content": "#include <sys/types.h>\n#include <sys/socket.h>\n#include <netdb.h>\n#include <sys/time.h>\n\n#ifndef TCP_H_DEFINED\n#define TCP_H_DEFINED\nint lookup(char *host, char *portnr, struct addrinfo **res);\nint connect_to(struct addrinfo *addr, struct timeval *rtt, int timeout);\n#endif\t\t\t\t/* TCP_H_DEFINED */\n"
  },
  {
    "path": "luci-app-ssr-plus/trojan/Makefile",
    "content": "#\n# Copyright (C) 2018-2019 wongsyrone\n#\n# This is free software, licensed under the GNU General Public License v3.\n# See /LICENSE for more information.\n#\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=trojan\nPKG_VERSION:=1.16.0\nPKG_RELEASE:=2\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/trojan-gfw/trojan/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=86cdb2685bb03a63b62ce06545c41189952f1ec4a0cd9147450312ed70956cbc\n\nPKG_BUILD_PARALLEL:=1\nPKG_BUILD_DEPENDS:=openssl\n\nPKG_LICENSE:=GPL-3.0\nPKG_LICENSE_FILE:=LICENSE\nPKG_MAINTAINER:=GreaterFire\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(INCLUDE_DIR)/cmake.mk\ninclude ./boost-version.mk\n\nTARGET_CXXFLAGS += -Wall -Wextra\nTARGET_CXXFLAGS += $(FPIC)\n\n# LTO\nTARGET_CXXFLAGS += -flto\nTARGET_LDFLAGS += -flto\n\n# CXX standard\nTARGET_CXXFLAGS += -std=c++11\nTARGET_CXXFLAGS := $(filter-out -O%,$(TARGET_CXXFLAGS)) -O3\nTARGET_CXXFLAGS += -ffunction-sections -fdata-sections\nTARGET_LDFLAGS += -Wl,--gc-sections\n\nCMAKE_OPTIONS += \\\n\t-DENABLE_MYSQL=OFF \\\n\t-DENABLE_NAT=ON \\\n\t-DENABLE_REUSE_PORT=ON \\\n\t-DENABLE_SSL_KEYLOG=ON \\\n\t-DENABLE_TLS13_CIPHERSUITES=ON \\\n\t-DFORCE_TCP_FASTOPEN=OFF \\\n\t-DSYSTEMD_SERVICE=OFF \\\n\t-DOPENSSL_USE_STATIC_LIBS=FALSE \\\n\t-DBoost_DEBUG=ON \\\n\t-DBoost_NO_BOOST_CMAKE=ON\n\ndefine Package/trojan\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=Web Servers/Proxies\n  TITLE:=An unidentifiable mechanism that helps you bypass GFW\n  URL:=https://github.com/trojan-gfw/trojan\n  DEPENDS:= \\\n    +libpthread +libstdcpp +libopenssl \\\n    +boost +boost-program_options +boost-date_time \\\n    $(if $(filter y,$(NEED_BOOST_SYSTEM)),,+boost-system)\nendef\n\ndefine Package/trojan/install\n\t$(INSTALL_DIR) $(1)/usr/sbin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/trojan $(1)/usr/sbin/trojan\nendef\n\n$(eval $(call BuildPackage,trojan))\n"
  },
  {
    "path": "luci-app-ssr-plus/trojan/boost-version.mk",
    "content": "# boost-version.mk\nBOOST_MAKEFILE := $(firstword $(shell find -L $(TOPDIR) -type f -path \"*/boost/Makefile\"))\n\nBOOST_PKG_VERSION := $(shell grep '^PKG_VERSION:=' $(BOOST_MAKEFILE) | head -n1 | cut -d= -f2)\n\nBOOST_VER_MAJOR := $(word 1,$(subst ., ,$(BOOST_PKG_VERSION)))\nBOOST_VER_MINOR := $(word 2,$(subst ., ,$(BOOST_PKG_VERSION)))\nBOOST_VER_PATCH := $(word 3,$(subst ., ,$(BOOST_PKG_VERSION)))\n\nBOOST_VERSION_CODE := $(shell echo $$(($(BOOST_VER_MAJOR)*100000 + $(BOOST_VER_MINOR)*100 + $(BOOST_VER_PATCH))))\n\nNEED_BOOST_SYSTEM := $(if $(shell [ $(BOOST_VERSION_CODE) -ge 108900 ] && echo y),y,n)\n"
  },
  {
    "path": "luci-app-ssr-plus/trojan/patches/001-force-openssl-version.patch",
    "content": "--- a/CMakeLists.txt\n+++ b/CMakeLists.txt\n@@ -43,7 +43,7 @@ if(MSVC)\n     add_definitions(-DBOOST_DATE_TIME_NO_LIB)\n endif()\n \n-find_package(OpenSSL 1.1.0 REQUIRED)\n+find_package(OpenSSL 1.1.1 REQUIRED)\n include_directories(${OPENSSL_INCLUDE_DIR})\n target_link_libraries(trojan ${OPENSSL_LIBRARIES})\n if(OPENSSL_VERSION VERSION_GREATER_EQUAL 1.1.1)\n"
  },
  {
    "path": "luci-app-ssr-plus/trojan/patches/002-Fix-boost1.89-build.patch",
    "content": "--- a/CMakeLists.txt\n+++ b/CMakeLists.txt\n@@ -36,7 +36,12 @@ set(THREADS_PREFER_PTHREAD_FLAG ON)\n find_package(Threads REQUIRED)\n target_link_libraries(trojan ${CMAKE_THREAD_LIBS_INIT})\n \n-find_package(Boost 1.66.0 REQUIRED COMPONENTS system program_options)\n+find_package(Boost 1.66.0 REQUIRED)\n+if (Boost_MAJOR_VERSION LESS_EQUAL 1 AND Boost_MINOR_VERSION LESS 89)\n+    find_package(Boost 1.66.0 REQUIRED COMPONENTS system program_options)\n+else()\n+    find_package(Boost 1.66.0 REQUIRED COMPONENTS program_options)\n+endif()\n include_directories(${Boost_INCLUDE_DIR})\n target_link_libraries(trojan ${Boost_LIBRARIES})\n if(MSVC)\n"
  },
  {
    "path": "luci-app-ssr-plus/tuic-client/Makefile",
    "content": "# SPDX-License-Identifier: GPL-2.0-only\n#\n# Copyright (C) 2025 ImmortalWrt.org\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=tuic-client\nPKG_VERSION:=1.7.2\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/Itsusinn/tuic/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=7a08641826cb7e166ae6db06f367ffeeeddd17f11ee5ae23435ec5701099149a\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)\n\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\nPKG_LICENSE:=GPL-3.0-only\nPKG_LICENSE_FILES:=LICENSE\n\nPKG_BUILD_DEPENDS:=rust/host\nPKG_BUILD_PARALLEL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/rust/rust-package.mk\n\nTAR_OPTIONS += --strip-components 1\nTAR_CMD=$(HOST_TAR) -C $(1) $(TAR_OPTIONS)\n\ndefine Package/tuic-client\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=Web Servers/Proxies\n  TITLE:=TUIC proxy protocol client\n  URL:=https://github.com/EAimTY/tuic\n  DEPENDS:=@(aarch64||arm||x86_64||i686||riscv64||loongarch64)\nendef\n\ndefine Package/tuic-client/description\n  Delicately-TUICed 0-RTT proxy protocol client.\nendef\n\ndefine Select/Features\n$(strip \\\n  $(if $(or \\\n    $(findstring i686,$(RUSTC_TARGET_ARCH)), \\\n    $(findstring arm,$(RUSTC_TARGET_ARCH)), \\\n    $(findstring riscv64,$(RUSTC_TARGET_ARCH)), \\\n    $(findstring loongarch64,$(RUSTC_TARGET_ARCH)) \\\n  ),--no-default-features --features ring) \\\n  $(if $(or \\\n    $(findstring x86_64,$(RUSTC_TARGET_ARCH)), \\\n    $(findstring aarch64,$(RUSTC_TARGET_ARCH)) \\\n  ),--features jemallocator) \\\n)\nendef\n\ndefine Build/Compile\n\t( \\\n\t\tpushd $(PKG_BUILD_DIR) ; \\\n\t\t$(CARGO_PKG_CONFIG_VARS) \\\n\t\tcargo build --release \\\n\t\t\t-p tuic-client \\\n\t\t\t--target $(RUSTC_TARGET_ARCH) \\\n\t\t\t$(call Select/Features) ; \\\n\t\tpopd ; \\\n\t)\nendef\n\ndefine Package/tuic-client/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/target/$(RUSTC_TARGET_ARCH)/release/tuic-client $(1)/usr/bin/\nendef\n\n$(eval $(call RustBinPackage,tuic-client))\n$(eval $(call BuildPackage,tuic-client))\n"
  },
  {
    "path": "luci-app-ssr-plus/tuic-client/patches/001-Fix-rust-stable-build.patch",
    "content": "--- a/tuic-client/src/main.rs\n+++ b/tuic-client/src/main.rs\n@@ -1,5 +1,3 @@\n-#![feature(ip)]\n-\n use std::{process, str::FromStr};\n \n use chrono::{Offset, TimeZone};\n"
  },
  {
    "path": "luci-app-ssr-plus/v2ray-core/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=v2ray-core\nPKG_VERSION:=5.47.0\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/v2fly/v2ray-core/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=90ef85f8f2c5478fc1e4f455b40eaf35a1738e06ef519b85a62c0763e2391405\n\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/v2fly/v2ray-core/v5\nGO_PKG_BUILD_PKG:=$(GO_PKG)/main\nGO_PKG_LDFLAGS_X:= \\\n\t$(GO_PKG).build=OpenWrt \\\n\t$(GO_PKG).version=$(PKG_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/v2ray/template\n  TITLE:=A proxy platform to bypass network restrictions\n  SECTION:=net\n  CATEGORY:=Network\n  URL:=https://www.v2fly.org\nendef\n\ndefine Package/v2ray-core\n  $(call Package/v2ray/template)\n  DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle\nendef\n\ndefine Package/v2ray-extra\n  $(call Package/v2ray/template)\n  TITLE+= (extra resources)\n  DEPENDS:=v2ray-core\n  PKGARCH:=all\nendef\n\ndefine Package/v2ray/description\n  Project V is a set of network tools that help you to build your own computer network.\n  It secures your network connections and thus protects your privacy.\nendef\n\ndefine Package/v2ray-core/description\n  $(call Package/v2ray/description)\nendef\n\ndefine Package/v2ray-extra/description\n  $(call Package/v2ray/description)\n\n  This includes extra resources for v2ray-core.\nendef\n\ndefine Package/v2ray-core/install\n\t$(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR))\n\t$(INSTALL_DIR) $(1)/usr/bin/\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/main $(1)/usr/bin/v2ray\nendef\n\ndefine Package/v2ray-extra/install\n\t$(INSTALL_DIR) $(1)/usr/share/v2ray/\n\t$(CP) $(PKG_BUILD_DIR)/release/extra/* $(1)/usr/share/v2ray/\nendef\n\n$(eval $(call BuildPackage,v2ray-core))\n$(eval $(call BuildPackage,v2ray-extra))\n"
  },
  {
    "path": "luci-app-ssr-plus/v2ray-plugin/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2020 SharerMax\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=v2ray-plugin\nPKG_VERSION:=5.48.0\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/teddysun/v2ray-plugin/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=cb7d1fefc9c5f30f5dd2b966e5a2a0846857da9c239febe8c676a0e096eeed7c\n\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=madeye <max.c.lv@gmail.com>\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/teddysun/v2ray-plugin\nGO_PKG_LDFLAGS_X:=main.VERSION=v$(PKG_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/v2ray-plugin\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=Web Servers/Proxies\n  TITLE:=SIP003 plugin for shadowsocks, based on v2ray\n  URL:=https://github.com/teddysun/v2ray-plugin\n  DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle\nendef\n\n$(eval $(call GoBinPackage,v2ray-plugin))\n$(eval $(call BuildPackage,v2ray-plugin))\n"
  },
  {
    "path": "luci-app-ssr-plus/v2raya/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=v2rayA\nPKG_VERSION:=2.2.7.5\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/v2rayA/v2rayA/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=d0daccace51572d730fb710f7df190beed47d51ec1091d2fba38719b9417b385\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)/service\n\nPKG_LICENSE:=AGPL-3.0-only\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/v2rayA/v2rayA\nGO_PKG_LDFLAGS_X:= \\\n\t$(GO_PKG)/conf.Version=$(PKG_VERSION) \\\n\t$(GO_PKG)/core/iptables.TproxyNotSkipBr=true\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\nTAR_OPTIONS+= --strip-components 1\nTAR_CMD=$(HOST_TAR) -C $(1)/.. $(TAR_OPTIONS)\n\ndefine Package/v2raya\n  TITLE:=A Linux web GUI client of Project V\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=Web Servers/Proxies\n  DEPENDS:=$(GO_ARCH_DEPENDS) \\\n    +ca-bundle \\\n    +kmod-nft-tproxy \\\n    +xray-core\n  URL:=https://v2raya.org\nendef\n\ndefine Package/v2raya/description\n  v2rayA is a V2Ray Linux client supporting global transparent proxy,\n  compatible with SS, SSR, Trojan(trojan-go), PingTunnel protocols.\nendef\n\ndefine Package/v2raya/conffiles\n/etc/v2raya/\n/etc/config/v2raya\nendef\n\nWEB_FILE:=$(PKG_NAME)-web-$(PKG_VERSION).tar.gz\ndefine Download/v2raya-web\n\tURL:=https://github.com/v2rayA/v2rayA/releases/download/v$(PKG_VERSION)/\n\tURL_FILE:=web.tar.gz\n\tFILE:=$(WEB_FILE)\n\tHASH:=89bff9248a9cba8b7bda6e1202ac565dbca377319423868835235deddbfb182a\nendef\n\ndefine Build/Prepare\n\t$(call Build/Prepare/Default)\n\n\t( \\\n\t\tmkdir -p $(PKG_BUILD_DIR)/server/router/web ; \\\n\t\tgzip -dc $(DL_DIR)/$(WEB_FILE) | $(HOST_TAR) -C $(PKG_BUILD_DIR)/server/router/web $(TAR_OPTIONS) ; \\\n\t)\nendef\n\ndefine Package/v2raya/install\n\t$(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR))\n\t$(INSTALL_DIR) $(1)/usr/bin/\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/v2rayA $(1)/usr/bin/v2raya\n\n\t$(INSTALL_DIR) $(1)/etc/config/\n\t$(INSTALL_CONF) $(CURDIR)/files/v2raya.config $(1)/etc/config/v2raya\n\t$(INSTALL_DIR) $(1)/etc/init.d/\n\t$(INSTALL_BIN) $(CURDIR)/files/v2raya.init $(1)/etc/init.d/v2raya\nendef\n\n$(eval $(call Download,v2raya-web))\n$(eval $(call GoBinPackage,v2raya))\n$(eval $(call BuildPackage,v2raya))\n"
  },
  {
    "path": "luci-app-ssr-plus/v2raya/files/v2raya.config",
    "content": "\nconfig v2raya 'config'\n\toption enabled '0'\n\n\t# Listening address\n\toption address '0.0.0.0:2017'\n\n\t# Make sure your IPv6 network works fine before you turn it on.\n\t# Optional values: auto, on, off.\n\toption ipv6_support 'auto'\n\n\t# Experimental feature. Make sure you have installed nftables.\n\t# Optional values: auto, on, off.\n\toption nftables_support 'auto'\n\n\t# Optional values: trace, debug, info, warn or error\n\toption log_level 'info'\n\n\t# Maximum number of days to keep log files\n\toption log_max_days '3'\n\n\toption log_disable_color '1'\n\n\toption log_disable_timestamp '0'\n\n\t# Executable v2ray binary path. Auto-detect if put it empty\n\toption v2ray_bin ''\n\n\t# Additional v2ray config directory, files in it will be combined with config generated by v2rayA\n\toption v2ray_confdir ''\n\n\t# The executable file to run in the transparent proxy life-cycle.\n\t# v2rayA will pass in the --transparent-type (tproxy, redirect)\n\t#   and --stage (pre-start, post-start, pre-stop, post-stop) arguments.\n\toption transparent_hook ''\n\n\t# The executable file to run in the v2ray-core life-cycle.\n\t# v2rayA will pass in the --stage (pre-start, post-start, pre-stop, post-stop) argument.\n\toption core_hook ''\n\n\t# The executable file to run in the v2ray-core life-cycle.\n\t# v2rayA will pass in the --stage (pre-start, post-start, pre-stop, post-stop) argument.\n\toption plugin_manager ''\n\n"
  },
  {
    "path": "luci-app-ssr-plus/v2raya/files/v2raya.init",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2021 Tianling Shen <cnsztl@immortalwrt.org>\n\nUSE_PROCD=1\nSTART=99\n\nCONF=\"v2raya\"\nPROG=\"/usr/bin/v2raya\"\n\nis_enabled() {\n\tlocal enabled\n\tconfig_get_bool enabled \"$1\" \"$2\" \"${3:-0}\"\n\tif [ \"$enabled\" -eq \"1\" ]; then\n\t\treturn 0\n\telse\n\t\treturn 1\n\tfi\n}\n\nappend_env() {\n\tprocd_append_param env \"V2RAYA_$(echo \"$1\" | tr \"[a-z]\" \"[A-Z]\")\"=\"$2\"\n}\n\nappend_env_arg() {\n\tlocal value\n\tconfig_get value \"$1\" \"$2\" $3\n\t[ -n \"$value\" ] && append_env \"$2\" \"$value\"\n}\n\nappend_env_bool() {\n\tis_enabled \"$1\" \"$2\" && append_env \"$2\" \"true\"\n}\n\nstart_service() {\n\tconfig_load \"$CONF\"\n\n\tis_enabled \"config\" \"enabled\" || return 1\n\n\tprocd_open_instance \"$CONF\"\n\tprocd_set_param command \"$PROG\"\n\tprocd_set_param env XDG_DATA_HOME=\"/usr/share\"\n\n\tappend_env \"config\" \"/etc/v2raya\"\n\tappend_env \"log_file\" \"/var/log/v2raya/v2raya.log\"\n\n\tappend_env_arg \"config\" \"address\" \"0.0.0.0:2017\"\n\tappend_env_arg \"config\" \"ipv6_support\" \"auto\"\n\tappend_env_arg \"config\" \"nftables_support\" \"auto\"\n\tappend_env_arg \"config\" \"log_level\" \"info\"\n\tappend_env_arg \"config\" \"log_max_days\" \"3\"\n\tappend_env_arg \"config\" \"v2ray_bin\"\n\tappend_env_arg \"config\" \"v2ray_confdir\"\n\tappend_env_arg \"config\" \"transparent_hook\"\n\tappend_env_arg \"config\" \"core_hook\"\n\tappend_env_arg \"config\" \"plugin_manager\"\n\tappend_env_bool \"config\" \"log_disable_color\"\n\tappend_env_bool \"config\" \"log_disable_timestamp\"\n\n\tprocd_set_param limits core=\"unlimited\"\n\tprocd_set_param limits nofile=\"1000000 1000000\"\n\tprocd_set_param respawn\n\tprocd_set_param stdout 1\n\tprocd_set_param stderr 1\n\n\tprocd_close_instance\n}\n\nreload_service() {\n\tstop\n\tstart\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"$CONF\"\n}\n"
  },
  {
    "path": "luci-app-ssr-plus/xray-core/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=xray-core\nPKG_VERSION:=26.4.25\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/XTLS/Xray-core/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=924516ad4e9827cbe53431065cfccbd4febb20006ff4764323a28dbdb9496c35\n\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\nPKG_LICENSE:=MPL-2.0\nPKG_LICENSE_FILES:=LICENSE\n\nPKG_BUILD_DIR:=$(BUILD_DIR)/Xray-core-$(PKG_VERSION)\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/xtls/xray-core\nGO_PKG_LDFLAGS:=-s -w\nGO_PKG_BUILD_PKG:=$(GO_PKG)/main\nGO_PKG_LDFLAGS_X:= \\\n\t$(GO_PKG)/core.build=OpenWrt \\\n\t$(GO_PKG)/core.version=$(PKG_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/xray-core\n  TITLE:=A platform for building proxies to bypass network restrictions\n  SECTION:=net\n  CATEGORY:=Network\n  URL:=https://xtls.github.io\n  DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle\nendef\n\ndefine Package/xray-core/description\n  Xray, Penetrates Everything. It helps you to build your own computer network.\n  It secures your network connections and thus protects your privacy.\nendef\n\ndefine Package/xray-core/install\n\t$(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR))\n\t$(INSTALL_DIR) $(1)/usr/bin/\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/main $(1)/usr/bin/xray\nendef\n\n$(eval $(call BuildPackage,xray-core))\n"
  },
  {
    "path": "luci-app-ssr-plus/xray-plugin/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2022 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=xray-plugin\nPKG_VERSION:=1.8.24\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/teddysun/xray-plugin/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=1150968f8791df884ce0ab5b2dbc870496088c90b5ffcc7f21497075aab7b1b5\n\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/teddysun/xray-plugin\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/xray-plugin\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=Web Servers/Proxies\n  TITLE:=SIP003 plugin for Shadowsocks, based on Xray\n  URL:=https://github.com/teddysun/xray-plugin\n  DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle\nendef\n\n$(eval $(call GoBinPackage,xray-plugin))\n$(eval $(call BuildPackage,xray-plugin))\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/Makefile",
    "content": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI based ipk store\nLUCI_DESCRIPTION:=luci-app-store is a ipk store developed by LinkEase team\nLUCI_DEPENDS:=+curl +opkg +luci-lib-ipkg +tar +libuci-lua +mount-utils +luci-lib-taskd\nLUCI_EXTRA_DEPENDS:=luci-lib-taskd (>=1.0.19)\nLUCI_PKGARCH:=all\n\nPKG_VERSION:=0.1.32-1\n# PKG_RELEASE MUST be empty for luci.mk\nPKG_RELEASE:=\n\nISTORE_UI_VERSION:=0.1.32\nISTORE_UI_RELEASE:=1\nPKG_HASH:=d4f86a88bfd2d6fdd59d5e7f356c1bd51d333f70271f4f28e45feecee9bc1578\n\nPKG_SOURCE_URL_FILE:=v$(ISTORE_UI_VERSION)-$(ISTORE_UI_RELEASE).tar.gz\nPKG_SOURCE:=istore-ui-$(PKG_SOURCE_URL_FILE)\nPKG_SOURCE_URL:=https://github.com/linkease/istore-ui/archive/refs/tags\n\nPKG_MAINTAINER:=jjm2473 <jjm2473@gmail.com>\n\nTARGET_CONFIGURE_OPTS= FRONTEND_DIST=\"$(BUILD_DIR)/istore-ui-$(ISTORE_UI_VERSION)-$(ISTORE_UI_RELEASE)/app-store-ui/src/dist\" APP_STORE_VERSION=\"$(PKG_VERSION)\"\nTARGET_CONFIGURE_OPTS+= SED=\"$(SED)\"\n\ndefine Package/luci-app-store/conffiles\n/etc/.app_store.id\n/etc/config/istore\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/luasrc/controller/store.lua",
    "content": "module(\"luci.controller.store\", package.seeall)\n\nlocal myopkg = \"is-opkg\"\nlocal is_backup = \"/usr/libexec/istore/backup\"\nlocal is_overlay_backup = \"/usr/libexec/istore/overlay-backup\"\nlocal page_index = {\"admin\", \"store\", \"pages\"}\n\nfunction index()\n    local function store_api(action, onlypost)\n        local e = entry({\"admin\", \"store\", action}, onlypost and post(\"store_action\", {action = action}) or call(\"store_action\", {action = action}))\n        e.dependent = false -- 父节点不是必须的\n        e.leaf = true -- 没有子节点\n    end\n\n    local action\n\n    entry({\"admin\", \"store\"}, call(\"redirect_index\"), _(\"iStore\"), 31)\n    entry({\"admin\", \"store\", \"pages\"}, call(\"store_index\")).leaf = true\n    if nixio.fs.access(\"/usr/lib/lua/luci/view/store/main_dev.htm\") then\n        entry({\"admin\", \"store\", \"dev\"}, call(\"store_dev\")).leaf = true\n    end\n    entry({\"admin\", \"store\", \"token\"}, call(\"store_token\"))\n    entry({\"admin\", \"store\", \"log\"}, call(\"store_log\"))\n    entry({\"admin\", \"store\", \"uid\"}, call(\"action_user_id\"))\n    entry({\"admin\", \"store\", \"upload\"}, post(\"store_upload\"))\n    entry({\"admin\", \"store\", \"del_record\"}, post(\"store_del_record\"))\n    entry({\"admin\", \"store\", \"unrun\"}, post(\"store_unrun\"))\n    entry({\"admin\", \"store\", \"run_records\"}, call(\"store_run_records\"))\n\n    entry({\"admin\", \"store\", \"check_self_upgrade\"}, call(\"check_self_upgrade\"))\n    entry({\"admin\", \"store\", \"do_self_upgrade\"}, post(\"do_self_upgrade\"))\n    entry({\"admin\", \"store\", \"toggle_docker\"}, post(\"toggle_docker\"))\n    entry({\"admin\", \"store\", \"toggle_arch\"}, post(\"toggle_arch\"))\n    entry({\"admin\", \"store\", \"toggle_ipv4\"}, post(\"toggle_ipv4\"))\n    entry({\"admin\", \"store\", \"get_block_devices\"}, call(\"get_block_devices\"))\n\n    entry({\"admin\", \"store\", \"configured\"}, call(\"configured\"))\n    entry({\"admin\", \"store\", \"entrysh\"}, post(\"entrysh\"))\n\n    -- docker\n    entry({\"admin\", \"store\", \"docker_check_dir\"}, call(\"docker_check_dir\"))\n    entry({\"admin\", \"store\", \"docker_check_migrate\"}, call(\"docker_check_migrate\"))\n    entry({\"admin\", \"store\", \"docker_migrate\"}, post(\"docker_migrate\"))\n\n    -- package\n    for _, action in ipairs({\"update\", \"install\", \"upgrade\", \"remove\", \"autoconf\"}) do\n        store_api(action, true)\n    end\n    for _, action in ipairs({\"status\", \"installed\"}) do\n        store_api(action, false)\n    end\n\n    -- istore backup\n    if nixio.fs.access(\"/usr/libexec/istore/backup\") then\n        entry({\"admin\", \"store\", \"get_support_backup_features\"}, call(\"get_support_backup_features\"))\n        entry({\"admin\", \"store\", \"light_backup\"}, post(\"light_backup\"))\n        entry({\"admin\", \"store\", \"get_light_backup_file\"}, call(\"get_light_backup_file\"))\n        entry({\"admin\", \"store\", \"light_restore\"}, post(\"light_restore\"))\n        entry({\"admin\", \"store\", \"get_backup_app_list_file_path\"}, call(\"get_backup_app_list_file_path\"))\n        entry({\"admin\", \"store\", \"get_backup_app_list\"}, call(\"get_backup_app_list\"))\n    end\n    if nixio.fs.access(\"/usr/libexec/istore/backup\") or nixio.fs.access(\"/usr/libexec/istore/overlay-backup\") then\n        entry({\"admin\", \"store\", \"local_backup\"}, post(\"local_backup\"))\n        entry({\"admin\", \"store\", \"local_restore\"}, post(\"local_restore\"))\n        entry({\"admin\", \"store\", \"get_available_backup_file_list\"}, call(\"get_available_backup_file_list\"))\n        entry({\"admin\", \"store\", \"set_local_backup_dir_path\"}, post(\"set_local_backup_dir_path\"))\n        entry({\"admin\", \"store\", \"get_local_backup_dir_path\"}, call(\"get_local_backup_dir_path\"))\n    end\nend\n\nlocal function user_id()\n    local jsonc = require \"luci.jsonc\"\n    local json_parse = jsonc.parse\n    local fs   = require \"nixio.fs\"\n\tlocal data = fs.readfile(\"/etc/.app_store.id\")\n\n    local id\n    if data ~= nil then\n        id = json_parse(data)\n    end\n    if id == nil then\n        fs.unlink(\"/etc/.app_store.id\")\n        id = {arch=\"\",uid=\"\"}\n    end\n\n    id.version = (fs.readfile(\"/etc/.app_store.version\") or \"?\"):gsub(\"[\\r\\n]\", \"\")\n\n    return id\nend\n\nlocal function user_config()\n    local uci  = require \"luci.model.uci\".cursor()\n\n    local data = {\n        hide_docker = uci:get(\"istore\", \"istore\", \"hide_docker\") == \"1\",\n        ignore_arch = uci:get(\"istore\", \"istore\", \"ignore_arch\") == \"1\",\n        ipv4 = uci:get(\"istore\", \"istore\", \"ipv4\") == \"1\",\n        last_path = uci:get(\"istore\", \"istore\", \"last_path\"),\n        super_arch = uci:get(\"istore\", \"istore\", \"super_arch\"),\n        channel = uci:get(\"istore\", \"istore\", \"channel\")\n    }\n    return data\nend\n\nlocal function vue_lang()\n    local i18n = require(\"luci.i18n\")\n    local lang = i18n.translate(\"istore_vue_lang\")\n    if lang == \"istore_vue_lang\" or lang == \"\" then\n        lang = \"en\"\n    end\n    return lang\nend\n\nlocal function flock(file, type)\n    local nixio = require \"nixio\"\n    local oflags = nixio.open_flags(\"wronly\", \"creat\")\n    local lock, code, msg = nixio.open(file, oflags)\n    if not lock then\n        return nil, \"Open lock failed: \" .. msg\n    end\n\n    -- Acquire lock\n    local stat, code, msg = lock:lock(type)\n    if not stat then\n        lock:close()\n        return nil, \"Lock failed: \" .. msg\n    end\n    return lock, nil\nend\n\nlocal function is_exec(cmd, async)\n    local nixio = require \"nixio\"\n    local os   = require \"os\"\n    local fs   = require \"nixio.fs\"\n    local rshift  = nixio.bit.rshift\n\n    local lock, msg = flock(\"/var/lock/istore.lock\", \"tlock\")\n    if lock == nil then\n        return 255, \"\", msg\n    end\n\n    if async then\n        cmd = \"/etc/init.d/tasks task_add istore \" .. luci.util.shellquote(cmd)\n    end\n    local r = os.execute(cmd .. \" >/var/log/istore.stdout 2>/var/log/istore.stderr\")\n    local e = fs.readfile(\"/var/log/istore.stderr\")\n    local o = fs.readfile(\"/var/log/istore.stdout\")\n\n    fs.unlink(\"/var/log/istore.stderr\")\n    fs.unlink(\"/var/log/istore.stdout\")\n\n    lock:lock(\"ulock\")\n    lock:close()\n\n    e = e or \"\"\n    if r == 256 and e == \"\" then\n        e = \"os.execute exit code 1\"\n    end\n    return rshift(r,8), o or \"\", e or \"\"\nend\n\nfunction redirect_index()\n    luci.http.redirect(luci.dispatcher.build_url(unpack(page_index)))\nend\n\nfunction store_index()\n    local fs   = require \"nixio.fs\"\n    local features = { \"_lua_force_array_\" }\n    if fs.access(\"/usr/libexec/istore/backup\") then\n        features[#features+1] = \"backup\"\n    end\n    if luci.sys.call(is_overlay_backup .. \" supports_overlay_backup >/dev/null 2>&1\") == 0 then\n        features[#features+1] = \"overlay\"\n    end\n    if luci.sys.call(\"which docker >/dev/null 2>&1\") == 0 then\n        features[#features+1] = \"docker\"\n    end\n    if luci.sys.call(\"[ -d /ext_overlay ] >/dev/null 2>&1\") == 0 then\n        features[#features+1] = \"sandbox\"\n    end\n    if luci.sys.call(\"[ -f /www/luci-static/resources/luci.js ] >/dev/null 2>&1\") == 0 then\n        features[#features+1] = \"luci-js\"\n    end\n    luci.template.render(\"store/main\", {prefix=luci.dispatcher.build_url(unpack(page_index)),id=user_id(),lang=vue_lang(),user_config=user_config(),features=features})\nend\n\nfunction store_dev()\n    luci.template.render(\"store/main_dev\", {prefix=luci.dispatcher.build_url(unpack({\"admin\", \"store\", \"dev\"})),id=user_id(),lang=vue_lang(),user_config=user_config()})\nend\n\nfunction store_log()\n    local fs   = require \"nixio.fs\"\n    local code = 0\n    local e = fs.readfile(\"/var/log/istore.stderr\")\n    local o = fs.readfile(\"/var/log/istore.stdout\")\n    if o ~= nil then\n        code = 206\n    end\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json({code=code,stdout=o or \"\",stderr=e or \"\"})\nend\n\nfunction action_user_id()\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json(user_id())\nend\n\nfunction check_self_upgrade()\n    local ret = {\n        code = 500,\n        msg = \"Unknown\"\n    }\n    local r,o,e = is_exec(myopkg .. \" check_self_upgrade\")\n    if r ~= 0 then\n        ret.msg = e\n    else\n        ret.code = o == \"\" and 304 or 200\n        ret.msg = o:gsub(\"[\\r\\n]\", \"\")\n    end\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json(ret)\nend\n\nfunction do_self_upgrade()\n    local code, out, err, ret\n    code,out,err = is_exec(myopkg .. \" do_self_upgrade\")\n    ret = {\n        code = code,\n        stdout = out,\n        stderr = err\n    }\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json(ret)\nend\n\n-- Internal action function\nlocal function _action(exe, cmd, ...)\n\n    local pkg = \"\"\n    for k, v in pairs({...}) do\n        pkg = pkg .. \" \" .. luci.util.shellquote(v)\n    end\n\n    local c = \"%s %s %s\" %{ exe, cmd, pkg }\n\n    return is_exec(c, true)\nend\n\nfunction validate_pkgname(val)\n\treturn (val ~= nil and val:match(\"^[a-zA-Z0-9_-]+$\") ~= nil)\nend\n\nlocal function get_installed_and_cache()\n    local metadir = \"/usr/lib/opkg/meta\"\n    local cachedir = \"/tmp/cache/istore\"\n    local cachefile = cachedir .. \"/installed.json\"\n    local metapkgpre = \"app-meta-\"\n    local nixio = require \"nixio\"\n    local fs   = require \"nixio.fs\"\n    local ipkg = require \"luci.model.ipkg\"\n    local jsonc = require \"luci.jsonc\"\n    local result = {}\n    local lock, msg = flock(\"/var/lock/istore-installed.lock\", \"lock\")\n    local ms = fs.stat(metadir)\n    local cs = fs.stat(cachefile)\n    if not ms then\n        result = {}\n    elseif not cs or ms[\"mtime\"] > cs[\"mtime\"] then\n        local cacheable = true\n        local itr = fs.dir(metadir)\n        local data = {}\n        if itr then\n            local i18n = require(\"luci.i18n\")\n            local pkg\n            for pkg in itr do\n                if pkg:match(\"^.*%.json$\") then\n                    local metadata = fs.readfile(metadir .. \"/\" .. pkg)\n                    if metadata ~= nil then\n                        local meta = jsonc.parse(metadata)\n                        if meta == nil then\n                            local name = pkg:gsub(\"^(.-)%.json$\", \"%1\")\n                            meta = {\n                                name = name,\n                                title = \"{ \" .. name .. \" }\",\n                                author = \"<UNKNOWN>\",\n                                version = \"0.0.0\",\n                                description = i18n.translate(\"This package is broken! Please reinstall or uninstall it.\"),\n                                depends = {},\n                                tags = {\"broken\"},\n                                broken = true,\n                            }\n                        end\n                        local time = nil\n                        local metapkg = metapkgpre .. meta.name\n                        local status = ipkg.status(metapkg)\n                        if next(status) ~= nil then\n                            time = status[metapkg][\"Installed-Time\"]\n                        else\n                            local istat = fs.stat(\"/usr/lib/opkg/info/\" .. metapkg .. \".list\")\n                            if istat ~= nil then\n                                time = istat[\"mtime\"]\n                            end\n                            cacheable = false\n                        end\n                        if time ~= nil then\n                            meta.time = tonumber(time)\n                            data[#data+1] = meta\n                        end\n                    end\n                end\n            end\n        end\n        result = data\n        if cacheable then\n            fs.mkdirr(cachedir)\n            local oflags = nixio.open_flags(\"rdwr\", \"creat\")\n            local mfile, code, msg = nixio.open(cachefile, oflags)\n            mfile:writeall(jsonc.stringify(result))\n            mfile:close()\n        end\n    else\n        result = jsonc.parse(fs.readfile(cachefile) or \"\")\n    end\n    lock:lock(\"ulock\")\n    lock:close()\n    return result\nend\n\nfunction store_action(param)\n    local metadir = \"/usr/lib/opkg/meta\"\n    local metapkgpre = \"app-meta-\"\n    local code, out, err, ret\n    local fs = require \"nixio.fs\"\n    local ipkg = require \"luci.model.ipkg\"\n    local jsonc = require \"luci.jsonc\"\n    local json_parse = jsonc.parse\n    local action = param.action or \"\"\n\n    if action == \"status\" then\n        local pkg = luci.http.formvalue(\"package\")\n        if not validate_pkgname(pkg) then\n            luci.http.status(400, \"Bad Request\")\n            return\n        end\n        local metapkg = metapkgpre .. pkg\n        local meta = {}\n        local metadata = fs.readfile(metadir .. \"/\" .. pkg .. \".json\")\n\n        if metadata ~= nil then\n            meta = json_parse(metadata) or {}\n        end\n        meta.installed = false\n        local status = ipkg.status(metapkg)\n        if next(status) ~= nil then\n            meta.installed=true\n            meta.time=tonumber(status[metapkg][\"Installed-Time\"])\n        end\n\n        ret = meta\n    elseif action == \"installed\" then\n        local data = get_installed_and_cache()\n        ret = data\n    else\n        local pkg = luci.http.formvalue(\"package\")\n        if not validate_pkgname(pkg) then\n            luci.http.status(400, \"Bad Request\")\n            return\n        end\n        local metapkg = pkg and (metapkgpre .. pkg) or \"\"\n        if action == \"update\" or pkg then\n            if action == \"update\" or action == \"install\" or action == \"autoconf\" then\n                if (action == \"install\" and \"1\" == luci.http.formvalue(\"autoconf\")) or action == \"autoconf\" then\n                    local autoenv = \"AUTOCONF=\" .. pkg\n                    local autopath = luci.http.formvalue(\"path\")\n                    local autoenable = luci.http.formvalue(\"enable\")\n                    if autopath ~= nil then\n                        autoenv = autoenv .. \" path=\" .. luci.util.shellquote(autopath)\n                        local uci  = require \"luci.model.uci\".cursor()\n                        uci:set(\"istore\", \"istore\", \"last_path\", autopath)\n                        uci:commit(\"istore\")\n                    end\n                    if autoenable ~= nil then\n                        autoenv = autoenv .. \" enable=\" .. autoenable\n                    end\n                    code, out, err = _action(myopkg, luci.util.shellquote(autoenv), action, metapkg)\n                else\n                    code, out, err = _action(myopkg, action, metapkg)\n                end\n            else\n                local meta = json_parse(fs.readfile(metadir .. \"/\" .. pkg .. \".json\"))\n                local pkgs = {}\n                if meta == nil then\n                    meta = {\n                        depends = {},\n                    }\n                end\n                if action == \"upgrade\" then\n                    pkgs = meta.depends\n                    table.insert(pkgs, metapkg)\n                    code, out, err = _action(myopkg, action, unpack(pkgs))\n                else -- remove\n                    for _, dep in ipairs(meta.depends) do\n                        if dep ~= \"docker-deps\" and dep ~= \"luci-js-deps\" then\n                            pkgs[#pkgs+1] = dep\n                        end\n                    end\n                    table.insert(pkgs, metapkg)\n                    code, out, err = _action(myopkg, action, unpack(pkgs))\n                    fs.unlink(\"/tmp/luci-indexcache\")\n                end\n            end\n        else\n            code = 400\n            err = \"package is null\"\n        end\n\n        ret = {\n            code = code,\n            stdout = out,\n            stderr = err\n        }\n    end\n\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json(ret)\nend\n\nfunction store_token()\n    luci.http.prepare_content(\"application/json\")\n    require \"luci.template\".render_string(\"{\\\"token\\\":\\\"<%=token%>\\\"}\")\nend\n\nfunction store_upload()\n    local fd\n    local path\n    local finished = false\n    local tmpdir = \"/tmp/is-root/tmp\"\n    luci.http.setfilehandler(\n        function(meta, chunk, eof)\n            if not fd then\n                path = tmpdir .. \"/\" .. meta.file\n                nixio.fs.mkdirr(tmpdir)\n                fd = io.open(path, \"w\")\n            end\n            if chunk then\n                fd:write(chunk)\n            end\n            if eof then\n                fd:close()\n                finished = true\n            end\n        end\n    )\n    local code, out, err\n    out = \"\"\n    if finished then\n        code, out, err = _action(myopkg, \"dotrun\", path)\n    else\n        code = 500\n        err = \"upload failed!\"\n    end\n    --nixio.fs.unlink(path)\n    local ret = {\n        code = code,\n        stdout = out,\n        stderr = err\n    }\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json(ret)\nend\n\nfunction store_unrun()\n    local record_id = luci.http.formvalue(\"id\")\n    if record_id == nil or record_id == \"\" then\n        luci.http.status(400, \"Bad Request\")\n        return\n    end\n    local code, out, err = _action(myopkg, \"unrun\", record_id)\n    local ret = {\n        code = code,\n        stdout = out,\n        stderr = err\n    }\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json(ret)\nend\n\nfunction store_run_records()\n\tlocal util  = require \"luci.util\"\n\tlocal run_records = util.exec(myopkg .. \" run_records\")\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write(\"{\\n\\\"code\\\":200,\\n\\\"records\\\":\")\n    luci.http.write(run_records)\n    luci.http.write(\"\\n}\\n\")\nend\n\nfunction store_del_record()\n    local nixio = require \"nixio\"\n    local os   = require \"os\"\n    local rshift  = nixio.bit.rshift\n\n    local record_id = luci.http.formvalue(\"id\")\n    if record_id == nil or record_id == \"\" then\n        luci.http.status(400, \"Bad Request\")\n        return\n    end\n    local r = os.execute(myopkg..\" del_record \"..luci.util.shellquote(record_id)..\" >/dev/null 2>&1\")\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json({code=rshift(r,8)})\nend\n\nfunction configured()\n    local uci = luci.http.formvalue(\"uci\")\n    if not validate_pkgname(uci) then\n        luci.http.status(400, \"Bad Request\")\n        return\n    end\n    local configured = nixio.fs.access(\"/etc/config/\" .. uci)\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json({code=200, configured=configured})\nend\n\nfunction entrysh()\n    local package = luci.http.formvalue(\"package\")\n    local update = luci.http.formvalue(\"update\")\n    local hostname = luci.http.formvalue(\"hostname\")\n    if hostname == nil or hostname == \"\" or not hostname:match(\"^[a-zA-Z0-9_%[][a-zA-Z0-9_%-%.%:%]]*$\") then\n        luci.http.status(400, \"Bad Request\")\n        return\n    end\n    local nixio = require \"nixio\"\n    local fs   = require \"nixio.fs\"\n    local hostnameq = luci.util.shellquote(hostname)\n    local cachedir = \"/tmp/cache/istore/entrysh/\" .. hostname\n    fs.mkdirr(cachedir)\n\n    local jsonc = require \"luci.jsonc\"\n    local results = {}\n    local errors = {}\n    local force = update == \"1\"\n    local candidate = nil\n    if package ~= nil and package ~= \"\" then\n        candidate = luci.util.split(package, \",\")\n    end\n    local installed  = get_installed_and_cache()\n    local lock, msg = flock(\"/var/lock/istore-entrysh.lock\", \"lock\")\n    local meta\n    for _, meta in ipairs(installed) do\n        if meta.flags ~= nil and meta.uci ~= nil and luci.util.contains(meta.flags, \"entrysh\")\n            and (candidate == nil or luci.util.contains(candidate, meta.name)) then\n            local entryfile = \"/usr/libexec/istoree/\" .. meta.name .. \".sh\"\n            local ucifile = \"/etc/config/\" .. meta.uci\n            local cachefile = cachedir .. \"/\" .. meta.name .. \".json\"\n            local status = nil\n            if not force then\n                local us = fs.stat(ucifile)\n                local cs = fs.stat(cachefile)\n                if cs ~= nil and us[\"mtime\"] <= cs[\"mtime\"] then\n                    status = jsonc.parse(fs.readfile(cachefile) or \"\")\n                end\n            end\n            if status ~= nil then\n                results[#results+1] = status\n            elseif fs.access(entryfile) then\n                local o = luci.util.exec(entryfile .. \" status \" .. hostnameq)\n                if o == nil or o == \"\" then\n                    errors[#errors+1] = {app=meta.name, code=500, msg=\"entrysh execute failed\"}\n                else\n                    status = jsonc.parse(o)\n                    if status == nil then\n                        errors[#errors+1] = {app=meta.name, code=500, msg=\"json parse failed: \" .. o}\n                    else\n                        results[#results+1] = status\n                        local oflags = nixio.open_flags(\"rdwr\", \"creat\")\n                        local mfile, code, msg = nixio.open(cachefile, oflags)\n                        mfile:writeall(jsonc.stringify(status))\n                        mfile:close()\n                    end\n                end\n            else\n                errors[#errors+1] = {app=meta.name, code=404, msg=\"entrysh of this package not found\"}\n            end\n        end\n    end\n    lock:lock(\"ulock\")\n    lock:close()\n\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json({code=200, status=results, errors=errors})\nend\n\nfunction docker_check_dir()\n    local docker_on_system = luci.sys.call(\"/usr/libexec/istore/docker check_dir >/dev/null 2>&1\") ~= 0\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json({code=200, docker_on_system=docker_on_system})\nend\n\nfunction docker_check_migrate()\n    local path = luci.http.formvalue(\"path\")\n    if path == nil or path == \"\" then\n        luci.http.status(400, \"Bad Request\")\n        return\n    end\n    local r,o,e = is_exec(\"/usr/libexec/istore/docker migrate_check \" .. luci.util.shellquote(path))\n    local result = \"good\"\n    if r == 1 then\n        result = \"bad\"\n    elseif r == 2 then\n        result = \"existed\"\n    end\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json({code=200, result=result, error=e})\nend\n\nfunction docker_migrate()\n    local path = luci.http.formvalue(\"path\")\n    if path == nil or path == \"\" then\n        luci.http.status(400, \"Bad Request\")\n        return\n    end\n\n    local action = \"migrate\"\n    local overwrite = luci.http.formvalue(\"overwrite\")\n    if overwrite == \"chdir\" then\n        action = \"change_dir\"\n    end\n    local r,o,e = is_exec(\"/usr/libexec/istore/docker \" .. action .. \" \" .. luci.util.shellquote(path), true)\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json({code=r, stdout=o, stderr=e})\nend\n\nlocal function split(str,reps)\n    local resultStrList = {}\n    string.gsub(str,'[^'..reps..']+',function (w)\n        table.insert(resultStrList,w)\n    end)\n    return resultStrList\nend\n\nlocal function ltn12_popen(command)\n\n\tlocal fdi, fdo = nixio.pipe()\n\tlocal pid = nixio.fork()\n\n\tif pid > 0 then\n\t\tfdo:close()\n\t\tlocal close\n\t\treturn function()\n\t\t\tlocal buffer = fdi:read(2048)\n\t\t\tlocal wpid, stat = nixio.waitpid(pid, \"nohang\")\n\t\t\tif not close and wpid and stat == \"exited\" then\n\t\t\t\tclose = true\n\t\t\tend\n\n\t\t\tif buffer and #buffer > 0 then\n\t\t\t\treturn buffer\n\t\t\telseif close then\n\t\t\t\tfdi:close()\n\t\t\t\treturn nil\n\t\t\tend\n\t\tend\n\telseif pid == 0 then\n\t\tnixio.dup(fdo, nixio.stdout)\n\t\tfdi:close()\n\t\tfdo:close()\n\t\tnixio.exec(\"/bin/sh\", \"-c\", command)\n\tend\nend\n\n-- call get_support_backup_features\nfunction get_support_backup_features()\n    local jsonc = require \"luci.jsonc\"\n    local error_ret = {code = 500, msg = \"Unknown\"}\n    local success_ret = {code = 200, msg = \"Unknown\"}\n    local r,o,e = is_exec(is_backup .. \" get_support_backup_features\")\n    if r ~= 0 then\n        error_ret.msg = e\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json(error_ret)\n    else\n        success_ret.code = 200\n        success_ret.msg = jsonc.stringify(split(o,'\\n'))\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json(success_ret)\n    end\nend\n\n-- post light_backup\nfunction light_backup()\n    local jsonc = require \"luci.jsonc\"\n    local error_ret = {code = 500, msg = \"Unknown\"}\n    local success_ret = {code = 200,msg = \"Unknown\"}\n    local r,o,e = is_exec(is_backup .. \" backup\")\n\n    if r ~= 0 then\n        error_ret.msg = e\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json(error_ret)\n    else\n        success_ret.code = 200\n        success_ret.msg = o:gsub(\"[\\r\\n]\", \"\")\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json(success_ret)\n    end\nend\n\n-- call get_light_backup_file\nfunction get_light_backup_file()\n    local light_backup_cmd  = \"tar -c %s | gzip 2>/dev/null\"\n    local loght_backup_filelist = \"/etc/istore/app.list\"\n    local reader = ltn12_popen(light_backup_cmd:format(loght_backup_filelist))\n    luci.http.header('Content-Disposition', 'attachment; filename=\"light-backup-%s-%s.tar.gz\"' % {\n        luci.sys.hostname(), os.date(\"%Y-%m-%d\")})\n    luci.http.prepare_content(\"application/x-targz\")\n    luci.ltn12.pump.all(reader, luci.http.write)\nend\n\nlocal function update_local_backup_path(path)\n    local uci = require \"uci\"\n    local fs = require \"nixio.fs\"\n    local x = uci.cursor()\n    local local_backup_path\n\n    if fs.access(\"/etc/config/istore\") then\n        local_backup_path = x:get(\"istore\",\"istore\",\"local_backup_path\")\n    else\n        --create config file\n        local f=io.open(\"/etc/config/istore\",\"a+\")\n        f:write(\"config istore \\'istore\\'\\n\\toption local_backup_path \\'\\'\")\n        f:flush()\n        f:close()\n    end\n\n    if path ~= local_backup_path then\n        -- set uci config\n        x:set(\"istore\",\"istore\",\"local_backup_path\",path)\n        x:commit(\"istore\")\n    end\nend\n\n-- post local_backup\nfunction local_backup()\n    local code, out, err, ret\n    local error_ret\n    local path = luci.http.formvalue(\"path\")\n    local type = luci.http.formvalue(\"type\") or \"istore\"\n    if path ~= \"\" then\n        -- judge path\n        local fs   = require \"nixio.fs\"\n        fs.mkdirr(path)\n        code,out,err = is_exec(\"findmnt -T \" .. path .. \" -o TARGET|sed -n 2p\")\n        local mp = out:gsub(\"[\\r\\n]\", \"\")\n        if mp == \"/\" or mp == \"/tmp\" then\n            -- error\n            error_ret = {code = 500, stderr = \"Path Error,Can not be / or tmp.\"}\n            luci.http.prepare_content(\"application/json\")\n            luci.http.write_json(error_ret)\n        elseif type == \"overlay\" and ( mp == \"/overlay\" or mp == \"/ext_overlay\" ) then\n            -- error\n            error_ret = {code = 500, stderr = \"Path Error,Can not be /overlay or /ext_overlay.\"}\n            luci.http.prepare_content(\"application/json\")\n            luci.http.write_json(error_ret)\n        else\n            -- update local backup path\n            update_local_backup_path(path)\n            code,out,err = _action(type == \"overlay\" and is_overlay_backup or is_backup, \"backup\", path)\n            ret = {\n                code = code,\n                stdout = out,\n                stderr = err\n            }\n            luci.http.prepare_content(\"application/json\")\n            luci.http.write_json(ret)\n        end\n    else\n        -- error\n        error_ret = {code = 500, stderr = \"Path Unknown\"}\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json(error_ret)\n    end\nend\n\n-- post light_restore\nfunction light_restore()\n    local fd\n    local path\n    local finished = false\n    local tmpdir = \"/tmp/\"\n    luci.http.setfilehandler(\n        function(meta, chunk, eof)\n            if not fd then\n                path = tmpdir .. \"/\" .. meta.file\n                fd = io.open(path, \"w\")\n            end\n            if chunk then\n                fd:write(chunk)\n            end\n            if eof then\n                fd:close()\n                finished = true\n            end\n        end\n    )\n\n    local code, out, err, ret\n\n    if finished then\n        is_exec(\"rm /etc/istore/app.list;tar -xzf \" .. path .. \" -C /\")\n        nixio.fs.unlink(path)\n        if nixio.fs.access(\"/etc/istore/app.list\") then\n            code,out,err = _action(is_backup, \"restore\")\n            ret = {\n                code = code,\n                stdout = out,\n                stderr = err\n            }\n            luci.http.prepare_content(\"application/json\")\n            luci.http.write_json(ret)\n        else\n            local error_ret = {code = 500, stderr = \"File is error!\"}\n            luci.http.prepare_content(\"application/json\")\n            luci.http.write_json(error_ret)\n        end\n    else\n        ret = {code = 500, stderr = \"upload failed!\"}\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json(ret)\n    end\nend\n\n-- post local_restore\nfunction local_restore()\n    local path = luci.http.formvalue(\"path\")\n    local type = luci.http.formvalue(\"type\") or \"istore\"\n    local code, out, err, ret\n    if path ~= \"\" then\n        code,out,err = _action(type == \"overlay\" and is_overlay_backup or is_backup, \"restore\", path)\n        ret = {\n            code = code,\n            stdout = out,\n            stderr = err\n        }\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json(ret)\n    else\n        -- error\n        error_ret = {code = 500, stderr = \"Path Unknown\"}\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json(error_ret)\n    end\nend\n\n-- call get_backup_app_list_file_path\nfunction get_backup_app_list_file_path()\n    local jsonc = require \"luci.jsonc\"\n    local error_ret = {code = 500, msg = \"Unknown\"}\n    local success_ret = {code = 200,msg = \"Unknown\"}\n    local r,o,e = is_exec(is_backup .. \" get_backup_app_list_file_path\")\n    if r ~= 0 then\n        error_ret.msg = e\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json(error_ret)\n    else\n        success_ret.code = 200\n        success_ret.msg = o:gsub(\"[\\r\\n]\", \"\")\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json(success_ret)\n    end\nend\n\n-- call get_backup_app_list\nfunction get_backup_app_list()\n    local jsonc = require \"luci.jsonc\"\n    local error_ret = {code = 500, msg = \"Unknown\"}\n    local success_ret = {code = 200,msg = \"Unknown\"}\n    local r,o,e = is_exec(is_backup .. \" get_backup_app_list\")\n    if r ~= 0 then\n        error_ret.msg = e\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json(error_ret)\n    else\n        success_ret.code = 200\n        success_ret.msg = jsonc.stringify(split(o,'\\n'))\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json(success_ret)\n    end\nend\n\n-- call get_available_backup_file_list\nfunction get_available_backup_file_list()\n    local jsonc = require \"luci.jsonc\"\n    local error_ret = {code = 500, msg = \"Unknown\"}\n    local success_ret = {code = 200,msg = \"Unknown\"}\n    local path = luci.http.formvalue(\"path\")\n    local type = luci.http.formvalue(\"type\") or \"istore\"\n    local r,o,e\n\n    if path ~= \"\" then\n        -- update local backup path\n        update_local_backup_path(path)\n        r,o,e = is_exec((type == \"overlay\" and is_overlay_backup or is_backup) .. \" get_available_backup_file_list \" .. luci.util.shellquote(path))\n        if r ~= 0 then\n            error_ret.msg = e\n            luci.http.prepare_content(\"application/json\")\n            luci.http.write_json(error_ret)\n        else\n            success_ret.code = 200\n            success_ret.msg = jsonc.stringify(split(o,'\\n'))\n            luci.http.prepare_content(\"application/json\")\n            luci.http.write_json(success_ret)\n        end\n    else\n        -- set error code\n        error_ret.msg = \"Path Unknown\"\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json(error_ret)\n    end\nend\n\n-- post set_local_backup_dir_path\nfunction set_local_backup_dir_path()\n    local path = luci.http.formvalue(\"path\")\n    local success_ret = {code = 200, msg = \"Success\"}\n    local error_ret = {code = 500, msg = \"Unknown\"}\n\n    if path ~= \"\" then\n        -- update local backup path\n        update_local_backup_path(path)\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json(success_ret)\n    else\n        -- set error code\n        error_ret.msg = \"Path Unknown\"\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json(error_ret)\n    end        \nend\n\n-- call get_local_backup_dir_path\nfunction get_local_backup_dir_path()\n    local uci = require \"uci\"\n    local fs = require \"nixio.fs\"\n    local x = uci.cursor()\n    local local_backup_path = nil\n    local success_ret = {code = 200,msg = \"Unknown\"}\n    local error_ret = {code = 500, msg = \"Path Unknown\"}\n\n    if fs.access(\"/etc/config/istore\") then\n        local_backup_path = x:get(\"istore\",\"istore\",\"local_backup_path\")\n        if local_backup_path == nil then\n            luci.http.prepare_content(\"application/json\")\n            luci.http.write_json(error_ret)\n        else\n            success_ret.msg = local_backup_path:gsub(\"[\\r\\n]\", \"\")\n            luci.http.prepare_content(\"application/json\")\n            luci.http.write_json(success_ret)\n        end \n    else\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json(error_ret)\n    end\nend\n\n-- copy from /usr/lib/lua/luci/model/diskman.lua\nlocal function byte_format(byte)\n  local suff = {\"B\", \"KB\", \"MB\", \"GB\", \"TB\"}\n  for i=1, 5 do\n    if byte > 1024 and i < 5 then\n      byte = byte / 1024\n    else\n      return string.format(\"%.2f %s\", byte, suff[i]) \n    end \n  end\nend\n\n-- copy from /usr/libexec/rpcd/luci\nlocal function getBlockDevices()\n    local fs = require \"nixio.fs\"\n\n    local block = io.popen(\"/sbin/block info\", \"r\")\n    if block then\n        local rv = {}\n\n        while true do\n            local ln = block:read(\"*l\")\n            if not ln then\n                break\n            end\n\n            local dev = ln:match(\"^/dev/(.-):\")\n            if dev then\n                local s = tonumber((fs.readfile(\"/sys/class/block/\" .. dev ..\"/size\")))\n                local e = {\n                    dev = \"/dev/\" .. dev,\n                    size = s and byte_format(s * 512)\n                }\n\n                local key, val = { }\n                for key, val in ln:gmatch([[(%w+)=\"(.-)\"]]) do\n                    e[key:lower()] = val\n                end\n\n                rv[dev] = e\n            end\n        end\n\n        block:close()\n\n        return rv\n    else\n        return\n    end\nend\n\nfunction get_block_devices()\n    local error_ret = {code = 500, msg = \"Unable to execute block utility\"}\n    local devices = getBlockDevices()\n    if devices ~= nil then\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json({code = 200, data = devices})\n    else\n        luci.http.prepare_content(\"application/json\")\n        luci.http.write_json(error_ret)\n    end\nend\n\nfunction toggle_docker()\n    local uci  = require \"luci.model.uci\".cursor()\n    local hide = luci.http.formvalue(\"hide\")\n    uci:set(\"istore\", \"istore\", \"hide_docker\", hide == \"true\" and \"1\" or \"0\")\n    uci:commit(\"istore\")\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json({code = 200, msg = \"Success\"})\nend\n\nfunction toggle_arch()\n    local uci  = require \"luci.model.uci\".cursor()\n    local ignore = luci.http.formvalue(\"ignore\")\n    uci:set(\"istore\", \"istore\", \"ignore_arch\", ignore == \"true\" and \"1\" or \"0\")\n    uci:commit(\"istore\")\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json({code = 200, msg = \"Success\"})\nend\n\nfunction toggle_ipv4()\n    local uci  = require \"luci.model.uci\".cursor()\n    local ipv4 = luci.http.formvalue(\"ipv4\")\n    uci:set(\"istore\", \"istore\", \"ipv4\", ipv4 == \"true\" and \"1\" or \"0\")\n    uci:commit(\"istore\")\n    luci.http.prepare_content(\"application/json\")\n    luci.http.write_json({code = 200, msg = \"Success\"})\nend\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/luasrc/view/store/main.htm",
    "content": "<%+header%>\n<%\n    local jsonc = require \"luci.jsonc\"\n%>\n<script>\n    (function(){\n        var vue_prefix=\"<%=prefix%>\";\n        var myurl = window.location.pathname;\n        window.addEventListener('popstate', function(){\n            if (myurl != window.location.pathname \n              && window.location.pathname != vue_prefix \n              && ! window.location.pathname.startsWith(vue_prefix+'/')) {\n                window.location.href = window.location.pathname;\n            }\n        });\n        window.vue_base = vue_prefix + '/';\n        // window.istore_api_base = \"https://istore.istoreos.com\";\n        // window.istore_icon_base = \"https://istore.linkease.com.cdn.koolcenter.com\";\n        window.vue_lang_data = '/luci-static/istore/i18n/<%=lang%>.json?v=<%=id.version%>';\n        window.vue_lang = '<%=lang%>';\n        window.token = \"<%=token%>\";\n        window.device_id = {arch:\"<%=id.arch%>\",uid:\"<%=id.uid%>\",version:\"<%=id.version%>\"};\n        window.istore_features = <%=jsonc.stringify(features)%>.filter(f => f !== '_lua_force_array_');\n        window.istore_config = <%=jsonc.stringify(user_config or {})%>;\n    })();\n</script>\n<h2 name=\"content\"><%:iStore%> \n    <a onclick=\"void(0)\" href=\"https://github.com/linkease/istore/issues/22\" target=\"_blank\" style=\"text-decoration: none;\">\n        v<%=id.version%>\n    </a>\n</h2>\n<link rel=\"stylesheet\" href=\"/luci-static/istore/style.css?v=<%=id.version%>\">\n<div id=\"app\">\n</div>\n<%+tasks/embed%>\n\n<script>\n    (function() {\n        let beforeunloadRegistered = false;\n        taskd.show_mask_on_stopped = true;\n        window.istore_log = function(flush_menu_onclose, onExit) {\n            if (flush_menu_onclose && !beforeunloadRegistered) {\n                beforeunloadRegistered = true;\n                window.addEventListener(\"beforeunload\", function(event) {\n                    try { window.L.ui.menu.flushCache() } catch (e) { }\n                    return true;\n                });\n            }\n            taskd.show_log(\"istore\", true, onExit);\n        };\n    })();\n<%\nlocal taskd = require \"luci.model.tasks\"\nlocal status = taskd.status(\"istore\")\nif status.running or status.exit_code ~= 404 then\n-%>\n    window.istore_log(true);\n<%\nend\n%>\n</script>\n\n<script type=\"module\" crossorigin src=\"/luci-static/istore/index.js?v=<%=id.version%>\"></script>\n<%+footer%>"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/root/bin/is-opkg",
    "content": "#!/bin/sh\n# this script MUST supports executting without luci-app-store installed,\n# so we can use this script to install luci-app-store itself\n\naction=${1}\nshift\nif [ \"${action:0:9}\" = \"AUTOCONF=\" ]; then\n    export \"ISTORE_${action}\"\n    exec \"$0\" \"$@\"\nfi\n\nIS_ROOT=/tmp/is-root\nDL_DIR=${IS_ROOT}/tmp/dl\nLISTS_DIR_O=/tmp/opkg-lists\nLISTS_DIR=${IS_ROOT}${LISTS_DIR_O}\nOPKG_CONF_DIR=${IS_ROOT}/etc/opkg\nOPKG_CONF_DIR_M=${IS_ROOT}/etc/opkg_m\nFEEDS_SERVER=https://istore.istoreos.com/repo\nFEEDS_SERVER_MIRRORS=\"https://repo.istoreos.com/repo\"\nDISABLE_MIRROR=false\nARCH=`sed -n -e 's/^Architecture: *\\([^ ]\\+\\) *$/\\1/p' /rom/usr/lib/opkg/info/libc.control /usr/lib/opkg/info/libc.control 2>/dev/null | head -1`\n\n# for istore self upgrade\nISTORE_PKG=luci-app-store\nISTORE_DEP_PKGS=\"luci-lib-taskd luci-lib-xterm taskd\"\nISTORE_INDEX=https://istore.istoreos.com/repo/all/store/Packages.gz\n\nNEWLINE=$'\\n'\n\nis_init() {\n    mkdir -p ${DL_DIR} ${LISTS_DIR} ${IS_ROOT}/etc ${IS_ROOT}/var\n\n    cat /etc/opkg.conf | grep -Fv lists_dir | grep -Fv check_signature > ${IS_ROOT}/etc/opkg.conf\n\n    cp ${IS_ROOT}/etc/opkg.conf ${IS_ROOT}/etc/opkg_o.conf\n\n    echo >> ${IS_ROOT}/etc/opkg.conf\n    echo \"lists_dir ext ${LISTS_DIR}\" >> ${IS_ROOT}/etc/opkg.conf\n    # create opkg_o.conf for executting 'opkg update' with offline-root, so we don't overwrite system opkg list\n    echo >> ${IS_ROOT}/etc/opkg_o.conf\n    echo \"lists_dir ext ${LISTS_DIR_O}\" >> ${IS_ROOT}/etc/opkg_o.conf\n\n    cp -au /etc/opkg ${IS_ROOT}/etc/\n    [ -e ${IS_ROOT}/var/lock ] || ln -s /var/lock ${IS_ROOT}/var/lock\n}\n\nopkg_wrap() {\n    OPKG_CONF_DIR=${OPKG_CONF_DIR} opkg -f ${IS_ROOT}/etc/opkg.conf \"$@\"\n}\n\nopkg_wrap_mirrors() {\n    local server\n    local file\n    if ! $DISABLE_MIRROR; then\n        for server in $FEEDS_SERVER_MIRRORS ; do\n            rm -rf \"${OPKG_CONF_DIR_M}\" 2>/dev/null\n            mkdir -p \"${OPKG_CONF_DIR_M}\" 2>/dev/null\n            ls \"${OPKG_CONF_DIR}/\" | while read; do\n                file=\"$REPLY\"\n                if [ -f \"${OPKG_CONF_DIR}/$file\" -a \"${file: -5}\" = \".conf\" ]; then\n                    sed \"s#$FEEDS_SERVER/#$server/#g\" \"${OPKG_CONF_DIR}/$file\" >\"${OPKG_CONF_DIR_M}/$file\"\n                    touch -r \"${OPKG_CONF_DIR}/$file\" \"${OPKG_CONF_DIR_M}/$file\" 2>/dev/null\n                else\n                    cp -a \"${OPKG_CONF_DIR}/$file\" \"${OPKG_CONF_DIR_M}/\"\n                fi\n            done\n            echo \"Try mirror server $server\"\n            OPKG_CONF_DIR=${OPKG_CONF_DIR_M} opkg -f ${IS_ROOT}/etc/opkg.conf \"$@\" && return 0\n        done\n        DISABLE_MIRROR=true\n    fi\n    echo \"Try origin server $FEEDS_SERVER\"\n    OPKG_CONF_DIR=${OPKG_CONF_DIR} opkg -f ${IS_ROOT}/etc/opkg.conf \"$@\"\n}\n\nalias fcurl='curl -L --fail --show-error'\n\ncheck_space() {\n    local free=\"$((`df -kP / | awk 'NR==2 {print $4}'` >> 10 ))\"\n    if [ \"$free\" -lt 1 ]; then\n        echo \"Root disk full!\" >&2\n        exit 1\n    fi\n    return 0\n}\n\nupdate() {\n    if [ -z \"${ARCH}\" ]; then\n        echo \"Get architecture failed\" >&2\n        return 1\n    fi\n\n    echo \"Fetch feed list for ${ARCH}\"\n    fcurl --no-progress-meter -o ${OPKG_CONF_DIR}/meta.conf \"${FEEDS_SERVER}/all/meta.conf\" && \\\n      fcurl --no-progress-meter -o ${OPKG_CONF_DIR}/all.conf \"${FEEDS_SERVER}/all/isfeeds.conf\" && \\\n      fcurl --no-progress-meter -o ${OPKG_CONF_DIR}/arch.conf \"${FEEDS_SERVER}/${ARCH}/isfeeds.conf\" || \\\n      return 1\n\n    echo \"Update feeds index\"\n    opkg -f ${IS_ROOT}/etc/opkg_o.conf --offline-root ${IS_ROOT} update\n\n    return 0\n}\n\nupdate_if_outdate() {\n    local idle_t=$((`date '+%s'` - `date -r ${IS_ROOT}/.last_force_ts '+%s' 2>/dev/null || echo '0'`))\n    [ $idle_t -gt ${1:-120} ] || return 2\n    update || return 1\n    touch ${IS_ROOT}/.last_force_ts\n    return 0\n}\n\ncheck_self_upgrade() {\n    local newest=`curl --connect-timeout 2 --max-time 5 -s ${ISTORE_INDEX} | gunzip | grep -FA10 \"Package: ${ISTORE_PKG}\" | grep -Fm1 'Version: ' | sed 's/^Version: //'`\n    local current=`grep -Fm1 'Version: ' /usr/lib/opkg/info/${ISTORE_PKG}.control | sed 's/^Version: //'`\n    if [ \"v$newest\" = \"v\" -o \"v$current\" = \"v\" ]; then\n        echo \"Check version failed!\" >&2\n        exit 255\n    fi\n    if [ \"$newest\" != \"$current\" ]; then\n        echo \"$newest\"\n    fi\n    return 0\n}\n\ndo_self_upgrade_0() {\n    opkg_wrap upgrade ${ISTORE_DEP_PKGS} && opkg_wrap upgrade ${ISTORE_PKG}\n}\n\ndo_self_upgrade() {\n    check_mtime || return 1\n    local newest=`curl --connect-timeout 2 --max-time 5 -s ${ISTORE_INDEX} | gunzip | grep -FA10 \"Package: ${ISTORE_PKG}\" | grep -Fm1 'Version: ' | sed 's/^Version: //'`\n    local current=`grep -Fm1 'Version: ' /usr/lib/opkg/info/${ISTORE_PKG}.control | sed 's/^Version: //'`\n    if [ \"v$newest\" = \"v\" -o \"v$current\" = \"v\" ]; then\n        echo \"Check version failed!\" >&2\n        return 1\n    fi\n    if [ \"$newest\" = \"$current\" ]; then\n        echo \"Already the latest version!\" >&2\n        return 1\n    fi\n    if opkg_wrap info ${ISTORE_PKG} | grep -qFm1 \"Version: $newest\"; then\n        do_self_upgrade_0 && return 0\n        update_if_outdate || return 1\n        do_self_upgrade_0\n    else\n        update_if_outdate || return 1\n        do_self_upgrade_0\n    fi\n}\n\ncheck_mtime() {\n    find ${OPKG_CONF_DIR}/arch.conf -mtime -1 2>/dev/null | grep -q .  || update\n}\n\nwrapped_in_update() {\n    check_mtime || return 1\n    eval \"$@\" && return 0\n    update_if_outdate || return 1\n    eval \"$@\"\n}\n\nstep_upgrade() {\n    local pkg\n    local pkgs=\"\"\n    local metapkg=\"\"\n    for pkg in $@; do\n        if [[ $pkg == app-meta-* ]]; then\n            metapkg=\"$metapkg $pkg\"\n        else\n            pkgs=\"$pkgs $pkg\"\n        fi\n    done\n    if [ -n \"$pkgs\" ]; then\n        opkg_wrap_mirrors upgrade $pkgs || return 1\n    fi\n    if [ -n \"$metapkg\" ]; then\n        opkg_wrap_mirrors upgrade $metapkg || return 1\n    fi\n    return 0\n}\n\nnew_upgrade() {\n    check_mtime || return 1\n    local metapkg=`echo \"$@\" | sed 's/ /\\n/g' | grep -F app-meta-`\n    if [ -z \"$metapkg\" ] || opkg_wrap info $metapkg | grep -qF not-installed ; then\n        true\n    else\n        update_if_outdate\n    fi\n    wrapped_in_update step_upgrade \"$@\"\n}\n\nremove() {\n    opkg_wrap --autoremove --force-removal-of-dependent-packages remove \"$@\"\n}\n\nautoconf_to_env() {\n    local autoconf path enable\n    eval \"local autoconf=$ISTORE_AUTOCONF\"\n    export -n ISTORE_AUTOCONF\n    export -n ISTORE_DONT_START\n    export -n ISTORE_CONF_DIR\n    export -n ISTORE_CACHE_DIR\n    export -n ISTORE_PUBLIC_DIR\n    export -n ISTORE_DL_DIR\n\n    ISTORE_AUTOCONF=$autoconf\n\n    if [ -n \"$path\" ]; then\n        export ISTORE_CONF_DIR=\"$path/Configs\"\n        export ISTORE_CACHE_DIR=\"$path/Caches\"\n        export ISTORE_PUBLIC_DIR=\"$path/Public\"\n        export ISTORE_DL_DIR=\"$ISTORE_PUBLIC_DIR/Downloads\"\n    fi\n    [ \"$enable\" = 0 ] && export ISTORE_DONT_START=\"1\"\n}\n\ntry_autoconf() {\n    [ -n \"$ISTORE_AUTOCONF\" ] || return 0\n    autoconf_to_env\n    [ -n \"$ISTORE_AUTOCONF\" ] || return 1\n    echo \"Auto configure $ISTORE_AUTOCONF\"\n    PATH=\"$CLEANPATH\" /usr/libexec/istorea/${ISTORE_AUTOCONF}.sh\n}\n\ntry_upgrade_depends() {\n    local pkg=\"$1\"\n    if [[ $pkg == app-meta-* ]]; then\n        local deps=$(grep '^Depends: ' /usr/lib/opkg/info/$pkg.control | busybox sed -e 's/^Depends: //' -e 's/,/\\n/g' -e 's/ //g' | grep -vFw libc | xargs echo)\n        [ -z \"$deps\" ] || opkg_wrap_mirrors install $deps\n    fi\n    return 0\n}\n\nCMD_INSTALLED=\"opkg list-installed | cut -d' ' -f1 | sort -u\"\ndotrun() {\n    local path=\"$1\"\n    [ -f \"$path\" ] || { echo \"file not found: $path\" >&2; return 1; }\n    ls -l \"$path\"\n    local md5=$(md5sum \"$path\" 2>/dev/null | cut -d' ' -f1)\n    local ts=$(date '+%s')\n    #local date=$(date '+%Y-%m-%d_%H-%M-%S')\n    echo \"MD5: $md5\"\n    echo \"Save installed pkg list before installing\"\n    sh -c \"$CMD_INSTALLED\" > \"/tmp/is-root/tmp/pre_$md5.txt\"\n    if echo \"$path\" | grep -q '\\.run$'; then\n        echo \"Executing .run file\"\n        chmod 0755 \"$path\" && \"$path\"\n    else\n        echo \"Installing .ipk file\"\n        opkg install \"$path\"\n    fi\n    local RET=$?\n    rm -f \"$path\"\n    if [ -s \"/tmp/is-root/tmp/pre_$md5.txt\" ]; then\n        echo \"Save installed pkg list after installing\"\n        sh -c \"$CMD_INSTALLED\" > \"/tmp/is-root/tmp/post_$md5.txt\"\n        grep -Fxf \"/tmp/is-root/tmp/pre_$md5.txt\" -v \"/tmp/is-root/tmp/post_$md5.txt\" > \"/tmp/is-root/tmp/added_$md5.txt\"\n        if [ -s \"/tmp/is-root/tmp/added_$md5.txt\" ]; then\n            echo \"The following packages were added:\"\n            cat \"/tmp/is-root/tmp/added_$md5.txt\"\n            mkdir -p /usr/share/istore/run-records\n            path=\"${path##*/}\"\n            path=\"${path//\\\\/\\\\\\\\}\" #\\\n            path=\"${path//\\\"/\\\\\\\"}\" #\"\n            path=\"${path//$NEWLINE/\\\\n}\" # \\n\n            path=\"${path//^M/\\\\r}\" # \\r\n            echo \"{\\\"id\\\":\\\"$ts-$md5\\\",\\\"ts\\\":$ts,\\\"md5\\\":\\\"$md5\\\",\\\"file\\\":\\\"$path\\\"}\" > /usr/share/istore/run-records/$ts-$md5.txt\n            cat \"/tmp/is-root/tmp/added_$md5.txt\" >> /usr/share/istore/run-records/$ts-$md5.txt\n        fi\n    fi\n    rm -f \"/tmp/is-root/tmp/pre_$md5.txt\" \"/tmp/is-root/tmp/post_$md5.txt\" \"/tmp/is-root/tmp/added_$md5.txt\"\n    return $RET\n}\n\nrun_records() {\n    local record\n    local file\n    echo \"[\"\n    for record in /usr/share/istore/run-records/*.txt; do\n        [ -f \"$record\" ] || continue\n        echo \"`head -1 \"$record\"`,\"\n    done | head -c -2\n    echo \"\"\n    echo \"]\"\n}\n\nunrun() {\n    local id=\"$1\"\n    [ -s \"/usr/share/istore/run-records/$id.txt\" ] || { echo \"record not found: $id\" >&2; return 1; }\n    echo \"The following packages will be removed:\"\n    tail -n +2 \"/usr/share/istore/run-records/$id.txt\" > \"/tmp/is-root/tmp/to_unrun_$id.txt\"\n    cat \"/tmp/is-root/tmp/to_unrun_$id.txt\"\n    local round max_round=6\n    for round in `seq 1 $max_round`; do\n        if [ $round == $max_round ]; then\n            opkg --autoremove remove `cat \"/tmp/is-root/tmp/to_unrun_$id.txt\"`\n        else\n            opkg --autoremove remove `cat \"/tmp/is-root/tmp/to_unrun_$id.txt\"` 2>/dev/null && break\n        fi\n    done\n    sh -c \"$CMD_INSTALLED\" > \"/tmp/is-root/tmp/post_unrun_$id.txt\"\n    grep -Fxf \"/tmp/is-root/tmp/post_unrun_$id.txt\" \"/tmp/is-root/tmp/to_unrun_$id.txt\" > \"/tmp/is-root/tmp/remain_unrun_$id.txt\"\n    if [ -s \"/tmp/is-root/tmp/remain_unrun_$id.txt\" ]; then\n        echo \"The following packages failed to be removed:\"\n        cat \"/tmp/is-root/tmp/remain_unrun_$id.txt\"\n    else\n        echo \"All packages removed successfully.\"\n        rm -f \"/usr/share/istore/run-records/$id.txt\"\n    fi\n    rm -f \"/tmp/is-root/tmp/to_unrun_$id.txt\" \"/tmp/is-root/tmp/post_unrun_$id.txt\" \"/tmp/is-root/tmp/remain_unrun_$id.txt\"\n    return 0\n}\n\n\nusage() {\n    echo \"usage: is-opkg sub-command [arguments...]\"\n    echo \"where sub-command is one of:\"\n    echo \"      update                          Update list of available packages\"\n    echo \"      upgrade <pkgs>                  Upgrade package(s)\"\n    echo \"      install <pkgs>                  Install package(s)\"\n    echo \"      remove <pkgs|regexp>            Remove package(s)\"\n    echo \"      info [pkg|regexp]               Display all info for <pkg>\"\n    echo \"      list-upgradable                 List installed and upgradable packages\"\n    echo \"      check_self_upgrade              Check iStore upgrade\"\n    echo \"      do_self_upgrade                 Upgrade iStore\"\n    echo \"      arch                            Show libc architecture\"\n    echo \"      opkg                            sys opkg wrap\"\n    echo \"      dotrun {path}                   install .run/.ipk\"\n    echo \"      run_records                     list .run/.ipk install records\"\n    echo \"      del_record {id}                 delete .run/.ipk install record\"\n    echo \"      unrun {id}                      Remove installed packages by .run/.ipk\"\n    exit 1\n}\n\nis_init >/dev/null 2>&1\n\nCLEANPATH=\"$PATH\"\n\ncase $action in\n    \"update\"|\"install\"|\"upgrade\"|\"opkg\"|\"check_self_upgrade\"|\"do_self_upgrade\"|\"dotrun\")\n        if [[ \"`uci -q get istore.istore.ipv4`\" = \"1\" ]]; then\n            export PATH=\"/usr/libexec/istore/ipv4-bin:$CLEANPATH\"\n        fi\n    ;;\nesac\n\ncase $action in\n    \"update\")\n        update\n    ;;\n    \"install\")\n        check_space\n        wrapped_in_update opkg_wrap_mirrors install \"$@\" && try_upgrade_depends \"$1\" && try_autoconf\n    ;;\n    \"autoconf\")\n        try_autoconf\n    ;;\n    \"upgrade\")\n        new_upgrade \"$@\"\n    ;;\n    \"remove\")\n        remove \"$@\" || remove \"$@\"\n    ;;\n    \"info\")\n        opkg_wrap info \"$@\"\n    ;;\n    \"list-upgradable\")\n        opkg_wrap list-upgradable\n    ;;\n    \"check_self_upgrade\")\n        check_self_upgrade\n    ;;\n    \"do_self_upgrade\")\n        check_space\n        do_self_upgrade\n    ;;\n    \"arch\")\n        echo \"$ARCH\"\n    ;;\n    \"opkg\")\n        opkg_wrap \"$@\"\n    ;;\n    \"dotrun\")\n        dotrun \"$@\"\n    ;;\n    \"run_records\")\n        run_records\n    ;;\n    \"del_record\")\n        rm -f \"/usr/share/istore/run-records/$1.txt\"\n    ;;\n    \"unrun\")\n        unrun \"$1\"\n    ;;\n    *)\n        usage\n    ;;\nesac\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/root/etc/config/istore",
    "content": "config istore 'istore'\n#    option hide_docker '0'\n#    option ignore_arch '0'\n#    option last_path '/mnt/nvme'\n#    option channel 'istore'\n#    option super_arch 'x86_64'\n#    option super_arch 'aarch64'\n#    option ipv4 '0'\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/root/etc/init.d/istore",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2016 OpenWrt.org\n\nSTART=45\n\nboot() {\n    local ARCH=`/bin/is-opkg arch`\n    generate_store_id $ARCH\n    generate_super_arch $ARCH\n}\n\ngenerate_store_id() {\n    [ -s /etc/.app_store.id ] && return 0\n    local ARCH=$1\n    local iface HASH\n\n    for iface in eth0 br-lan; do\n        if [ -e /sys/class/net/$iface/address ]; then\n            HASH=`md5sum /sys/class/net/$iface/address | cut -d ' ' -f1`\n            break\n        fi\n    done\n\n    if [ -z \"$HASH\" ]; then\n        HASH=`dd if=/dev/urandom bs=512 count=1 2>/dev/null | md5sum | cut -d ' ' -f1`\n    fi\n\n    echo \"{\\\"arch\\\":\\\"${ARCH}\\\", \\\"uid\\\":\\\"${HASH}\\\"}\" > /etc/.app_store.id\n}\n\ngenerate_super_arch() {\n    local ARCH=$1\n    local super_arch\n    case \"$ARCH\" in\n    arm*)\n        super_arch=\"arm\"\n        ;;\n    i386)\n        super_arch=\"x86\"\n        ;;\n    x86_64)\n        super_arch=\"x86_64\"\n        ;;\n    *)\n        super_arch=\"${ARCH%%_*}\"\n        ;;\n    esac\n    local old=`uci -q get istore.istore.super_arch`\n    [ \"$old\" = \"$super_arch\" ] && return 0\n    uci -q batch <<-EOF >/dev/null\n        set istore.istore.super_arch=$super_arch\n        commit istore\nEOF\n}\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/root/etc/uci-defaults/luci-app-store",
    "content": "#!/bin/sh\n\n/etc/init.d/istore boot\n\nif [ -z \"`uci -q get istore.istore.hide_docker`\" ] && ! which docker >/dev/null; then\n    uci -q batch <<-EOF >/dev/null\n        set istore.istore.hide_docker=1\n        commit istore\nEOF\nfi\n\nrm -rf /tmp/luci-indexcache /tmp/luci-modulecache\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/root/usr/libexec/istore/backup",
    "content": "#!/bin/sh\n#set -x\n#IS_DEBUG=1\n\nIS_ROOT=/tmp/is-backup\nAPP_LIST_FILE=/etc/istore/app.list\nBACKUP_CONFIG_FILE=/etc/config/istore\n\naction=${1}\nshift\n\n\nis_init() {\n    mkdir -p ${IS_ROOT}\n}\n\nopkg_list_installed_packages() {\n    local target=$1\n    local dir\n    local OPKG_INFO_DIR\n    case $target in\n        \"preinstalled\")\n            OPKG_INFO_DIR=\"/rom/usr/lib/opkg/info\"\n        ;;\n        \"userinstalled\")\n            OPKG_INFO_DIR=\"/overlay/upper/usr/lib/opkg/info /ext_overlay/upper/usr/lib/opkg/info\"\n        ;;\n        \"allinstalled\")\n            OPKG_INFO_DIR=\"/usr/lib/opkg/info\"\n        ;;\n        *)\n            echo \"invalid target\"\n            exit\n        ;;\n    esac\n    for dir in $OPKG_INFO_DIR ; do\n        [ -d \"$dir\" ] || continue\n        (cd \"$dir\" && find . -depth -maxdepth 1 -name \"*.list\" -type f | sed 's#^\\./\\(.*\\)\\.list$#\\1#g')\n    done\n}\n\nipk_build() {\n    PKG_NAME_TEMP=$1\n    IPK_OUTPUT_DIR=$2\n\n    UCI_BAK_DIR=\"/etc/istore/uci-defaults_bak/\"\n    UCI_DEF_DIR=\"etc/uci-defaults\"\n    local OPKG_INFO_DIR=\"/usr/lib/opkg/info/\"\n\n    [ -n \"${PKG_NAME_TEMP}\" ] || exit 1\n    #get real pkg name in opkg\n    PKG_NAME_TEMP=`cat ${IS_ROOT}/all_installed_package.list | sort -u | grep \"^${PKG_NAME_TEMP}\" | head -n 1`\n    [ -n \"${PKG_NAME_TEMP}\" ] || exit 1\n\n    PKG_NAME=`cat ${OPKG_INFO_DIR}${PKG_NAME_TEMP}.control | grep \"^Package: \" |  cut -d ' ' -f2`\n    PKG_VER=`cat ${OPKG_INFO_DIR}${PKG_NAME}.control | grep \"^Version: \" |  cut -d ' ' -f2`\n    PKG_ARCH=`cat ${OPKG_INFO_DIR}${PKG_NAME}.control | grep \"^Architecture: \" |  cut -d ' ' -f2`\n    IPK_FILE_NAME=\"${PKG_NAME}_${PKG_VER}_${PKG_ARCH}\"\n\n    rm -rf ${IS_ROOT}/${IPK_FILE_NAME}\n    mkdir -p ${IS_ROOT}/${IPK_FILE_NAME}\n\n    #(1)make CONTROL dir; (2)copy control file to dir\n    cd ${IS_ROOT}/${IPK_FILE_NAME}\n    mkdir -p CONTROL\n    for control_file in `ls  ${OPKG_INFO_DIR}${PKG_NAME}.* | grep -v \".list$\"`; do\n        file=${control_file##*/}\n        suffix=${file##*.}\n        cp ${control_file} CONTROL/${suffix}\n    done\n\n    #(1)make DATA depend dir; (2)copy uci-defaults_bak file to dir; (3)copy other file to dir\n    for pkgfile in `cat ${OPKG_INFO_DIR}${PKG_NAME}.list | cut -b 2-`; do\n        file=${pkgfile##*/}\n        path=${pkgfile%/*}\n        mkdir -p ${path}\n        if [ `echo \"${path}\" | grep \"^${UCI_DEF_DIR}\"` ]; then\n            cp \"${UCI_BAK_DIR}${file}\" \"${pkgfile}\"\n        else\n            cp \"/${pkgfile}\" \"${pkgfile}\"\n        fi\n    done\n\n    #call ipkg-build script to build ipk\n    /usr/libexec/istore/ipkg-build ${IS_ROOT}/${IPK_FILE_NAME} ${IPK_OUTPUT_DIR}\n    echo \"${IPK_FILE_NAME}.ipk\" >> ${IPK_OUTPUT_DIR}/appdepipk.list\n\n    [ -n \"${IS_DEBUG}\" ] || rm -rf ${IS_ROOT}/${IPK_FILE_NAME}\n}\n\n# if arg is NULL, use light backup, otherwise use local backup\nbackup() {\n    [ -n \"$1\" ] && BACKUP_PATH=$1\n\n    #1.add all istore self data to sysupgrade config file,\n    #sysupgrade will backup/restore it auto when flash new firmware\n    echo \"/etc/.app_store.id\" > /lib/upgrade/keep.d/luci-app-store\n    cat /usr/lib/opkg/info/luci-app-store.list >> /lib/upgrade/keep.d/luci-app-store\n    echo \"/etc/rc.d/S45istore\" >> /lib/upgrade/keep.d/luci-app-store\n    echo \"/etc/istore/uci-defaults_bak\" >> /lib/upgrade/keep.d/luci-app-store\n    echo \"${APP_LIST_FILE}\" >> /lib/upgrade/keep.d/luci-app-store\n    echo \"${BACKUP_CONFIG_FILE}\" >> /lib/upgrade/keep.d/luci-app-store\n\n    #write user installed package list to file\n    opkg_list_installed_packages \"userinstalled\" 2>/dev/null | sort -u > ${IS_ROOT}/user_installed_package.list\n\n    #write installed package list by istore feed to file\n    cat ${IS_ROOT}/user_installed_package.list | \\\n        grep '^app-meta-' > ${IS_ROOT}/istore_installed_package.list\n\n    #if no input backup path, only back app.list\n    mkdir -p /etc/istore\n    cp ${IS_ROOT}/istore_installed_package.list ${APP_LIST_FILE}\n    echo \"backup installed package list to ${APP_LIST_FILE}\"\n\n    if [ ! -n \"${BACKUP_PATH}\" ]; then\n        echo \"backup success\"\n        exit 0\n    fi\n\n    if [ ! -d \"${BACKUP_PATH}\" ] && ! mkdir -p \"${BACKUP_PATH}\" ; then\n        echo \"invalid backup path, can not backup ipk\"\n        exit 1\n    fi\n\n    #write all installed package list to file\n    opkg_list_installed_packages \"allinstalled\" 2>/dev/null | sort -u > ${IS_ROOT}/all_installed_package.list\n\n    #write system pre installed package list to file\n    opkg_list_installed_packages \"preinstalled\" 2>/dev/null | sort -u > ${IS_ROOT}/pre_installed_package.list\n\n    #write installed packages and depends list by istore feed to file by depend sequence\n    appdep_list=\"\"\n    temp_list=`cat ${IS_ROOT}/istore_installed_package.list | sed 's/^/\\t/'`\n    while [ -n \"${temp_list}\" ]\n    do\n        #get real pkg name\n        for PKG_NAME_TEMP in ${temp_list}; do\n            REAL_PKG_NAME=`cat ${IS_ROOT}/all_installed_package.list | sort -u | grep \"^${PKG_NAME_TEMP}\" | head -n 1`\n            if [ \"${REAL_PKG_NAME}\" != \"${PKG_NAME_TEMP}\" ]; then\n                temp_list=`echo \"${temp_list}\" | sed 's/^\\t'\"${PKG_NAME_TEMP}\"'$/\\t'\"${REAL_PKG_NAME}\"'/'`\n            fi\n        done\n\n        appdep_list=`echo -e \"${temp_list}\\n${appdep_list}\"`\n        [ -n \"${IS_DEBUG}\" ] && echo -e \"temp_list:\\n\"\"${temp_list}\"\n        [ -n \"${IS_DEBUG}\" ] && echo -e \"appdep_list:\\n\"\"${appdep_list}\"\n\n        temp_list=`echo \"${temp_list}\" | xargs opkg depends | grep -v \"depends on:\" | grep -v \" (>= \" | grep -v \" (= \" | sort -u`\n    done\n\n    appdep_list_all=`echo \"${appdep_list}\" | cut -f2 | grep -v \"^$\" | awk '!seen[$0]++'`\n    [ -n \"${IS_DEBUG}\" ] && echo -e \"appdep_list_all:\\n\"\"${appdep_list_all}\"\n    echo \"${appdep_list_all}\" > ${IS_ROOT}/appdep.list\n\n    #3.rebuild all istore installed package to ipk and backup to userdata partation\n\n    # 4. create dir\n    date=$(date +%Y-%m%d-%H%M)\n    if [ ! -d \"$BACKUP_PATH/backup_istore_$date\" ];then\n        mkdir $BACKUP_PATH/backup_istore_$date\n    fi\n    cp ${IS_ROOT}/istore_installed_package.list $BACKUP_PATH/backup_istore_$date/app.list\n    cp ${IS_ROOT}/appdep.list $BACKUP_PATH/backup_istore_$date/appdep.list\n\n    #only backup non pre installed ipk\n    cp ${IS_ROOT}/appdep.list ${IS_ROOT}/appdep_strip.list\n    for pre_installed_pkg in `cat ${IS_ROOT}/appdep.list ${IS_ROOT}/pre_installed_package.list | sort -n | uniq -d`; do\n        sed -i '/^'\"$pre_installed_pkg\"'$/d' ${IS_ROOT}/appdep_strip.list\n    done\n\n    rm -f $BACKUP_PATH/backup_istore_$date/appdepipk.list\n    echo \"build ipk\"\n    for pkg_name in `cat ${IS_ROOT}/appdep_strip.list`; do\n        ipk_build ${pkg_name} $BACKUP_PATH/backup_istore_$date\n    done\n\n    # 5. create tar.gz file,and remove dir\n    cd $BACKUP_PATH\n    echo \"write backup file to $BACKUP_PATH/backup_istore_$date.backup.tar.gz\"\n    tar -czf $BACKUP_PATH/backup_istore_$date.backup.tar.gz backup_istore_$date\n    rm -rf $BACKUP_PATH/backup_istore_$date\n    echo \"backup success\"\n}\n\n# if arg is NULL, use light backup, otherwise use local backup\nrestore() {\n    if [ -n \"$1\" ]; then\n        BACKUP_PATH_FILE=$1\n    else\n        echo \"install package by ${APP_LIST_FILE}\"\n        is-opkg update\n        for app in `cat ${APP_LIST_FILE}`; do\n            #skip resotre istore self\n            [ \"A${app}\" == \"A\"\"luci-app-store\" ] && continue\n            is-opkg install ${app}\n        done\n        exit 0\n    fi\n\n    if [ ! -f \"${BACKUP_PATH_FILE}\" ];then\n        echo \"invalid backup file, can not restore ipk\"\n        exit 1\n    fi\n\n    #1. Unzip file to dir\n    BACKUP_PATH_FILE_NAME=${BACKUP_PATH_FILE##*/}\n    BACKUP_PATH=/tmp/${BACKUP_PATH_FILE_NAME%.backup.tar.gz*}\n    if [ -d \"$BACKUP_PATH\" ];then\n        rm -rf $BACKUP_PATH\n    fi\n    mkdir -p $BACKUP_PATH\n    echo \"unpack input file...\"\n    # fix tar path error\n    tar -zxf ${BACKUP_PATH_FILE} -C /tmp/\n\n    echo \"check file\"\n    if [ ! -f \"${BACKUP_PATH}/appdep.list\" ];then\n        echo \"no available appdep.list, can not restore ipk\"\n        exit 1\n    fi\n    echo \"check success\"\n\n    #2. install ipk by backup path\n    echo \"restore begin\"\n    ( cd ${BACKUP_PATH}; opkg install `cat ${BACKUP_PATH}/appdepipk.list` )\n\n    #3. rm dir\n    rm -rf ${BACKUP_PATH}\n    echo \"restore success\"\n}\n\nget_support_backup_features() {\n    echo \"light_backup\"\n    #istore custom img mean support local_backup\n    if [ -f /etc/istore_img_flag ];then\n        echo \"local_backup\"\n    fi\n}\n\nget_backup_app_list_file_path() {\n    echo \"${APP_LIST_FILE}\"\n}\n\nget_backup_app_list() {\n    if [ ! -f \"${APP_LIST_FILE}\" ];then\n        echo \"no app.list, can not get backup app list\"\n        exit 1\n    fi\n    cat ${APP_LIST_FILE}\n}\n\nget_available_backup_file_list() {\n    local backup_file\n    if [ -n \"$1\" ]; then\n        for backup_file in `cd $1 && ls backup_istore_*.backup.tar.gz`; do\n            echo \"${backup_file}\"\n        done\n    else\n        echo \"input backup path is null\"\n        exit 1\n    fi\n}\n\nusage() {\n    echo \"usage: backup sub-command [arguments...]\"\n    echo \"where sub-command is one of:\"\n    echo \"      backup [dir]                    Backup all installed package(s) to [directory]\"\n    echo \"      restore [dir]                   Restore package(s) by [directory]\"\n    echo \"      get_support_backup_features     get device support backup features\"\n    echo \"      get_backup_app_list_file_path   get light backup app list file path\"\n    echo \"      get_backup_app_list             get light backup app list\"\n    echo \"      get_available_backup_file_list  get local available backup file list\"\n}\n\nis_init >/dev/null 2>&1\n\ncase $action in\n    \"get_support_backup_features\")\n        get_support_backup_features\n    ;;\n    \"backup\")\n        backup \"$@\"\n    ;;\n    \"restore\")\n        restore \"$@\"\n    ;;\n    \"get_backup_app_list_file_path\")\n        get_backup_app_list_file_path\n    ;;\n    \"get_backup_app_list\")\n        get_backup_app_list\n    ;;\n    \"get_available_backup_file_list\")\n        get_available_backup_file_list \"$@\"\n    ;;\n    *)\n        usage\n    ;;\nesac\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/root/usr/libexec/istore/docker",
    "content": "#!/bin/sh\n\nhandle_part() {\n    case \"$MOUNT\" in\n        \"/overlay\")\n            return 1\n        ;;\n    esac\n    return 0\n}\n\ncheck_dir() {\n    local data_root=$(uci -q get dockerd.globals.data_root)\n    [ -n \"$data_root\" ] || return 0\n    local block_dev=$(findmnt -T \"$data_root\" -v -o SOURCE | sed -n 2p)\n    [ -n \"$block_dev\" ] || return 0\n    [ \"overlayfs:/overlay\" = \"$block_dev\" ] && return 1\n    local line=$(block info \"$block_dev\" 2>/dev/null)\n    [ -n \"$line\" ] || return 0\n    eval \"${line##*: } handle_part ${line%%: *}\"\n}\n\nmigrate_check(){\n    local dest=\"$1\"\n    [ -n \"$dest\" ] || {\n        echo \"dest dir not specified!\" >&2\n        return 1\n    }\n    local data_root=\"$2\"\n    [ -n \"$data_root\" ] || data_root=$(uci -q get dockerd.globals.data_root)\n    [ -n \"$data_root\" ] || {\n        echo \"get docker data_root failed!\" >&2\n        return 1\n    }\n\n    [ \"$data_root\" = \"/\" ] || data_root=\"${data_root%%/}\"\n    [ \"$dest\" = \"/\" ] || dest=\"${dest%%/}\"\n\n    [ \"$data_root\" = \"$dest\" ] && {\n        echo \"dest dir is the same as data_root!\" >&2\n        return 1\n    }\n\n    [ 1 = \"$FORCE\" ] && return 0\n    [ -e \"$dest\" ] || return 0\n    [ -d \"$dest\" ] || {\n        echo \"$dest is existed and it's not a dir, use FORCE=1 to overwrite it\" >&2\n        return 2\n    }\n    [ 0 = \"$(ls -A \"$dest\" | head -1 | wc -l)\" ] || {\n        echo \"$dest is existed and it's not empty, use FORCE=1 to overwrite it\" >&2\n        return 2\n    }\n    return 0\n}\n\nmigrate() {\n    local dest=\"$1\"\n    local data_root=$(uci -q get dockerd.globals.data_root)\n    [ -n \"$data_root\" ] || {\n        echo \"get docker data_root failed!\" >&2\n        return 1\n    }\n    [ \"$data_root\" = \"/\" ] || data_root=\"${data_root%%/}\"\n    [ \"$dest\" = \"/\" ] || dest=\"${dest%%/}\"\n\n    FORCE=1 migrate_check \"$dest\" \"$data_root\"\n    local check_result=$?\n    [ 0 = $check_result ] || return $check_result\n\n    if [ \"$UCI_ONLY\" != 1 ]; then\n        rm -rf \"$dest\"\n        mkdir -p \"$dest\"\n        echo \"Copy $data_root to $dest ...\"\n        cp -a \"$data_root/.\" \"$dest/\" || return 1\n    fi\n\n    echo \"Change dockerd data_root to $dest and restart\"\n    uci set dockerd.globals.data_root=\"$dest\"\n    uci commit dockerd\n    /etc/init.d/dockerd restart\n\n    echo \"Done\"\n}\n\naction=${1}\nshift\n\nusage() {\n    echo \"usage: $1 sub-command [arguments...]\"\n    echo \"where sub-command is one of:\"\n    echo \"      check_dir                    Check docker data_root is on extrnal disk\"\n    echo \"      migrate_check {target_dir}   Check target_dir is valid for migration, return 2 if target_dir existed and not empty\"\n    echo \"      migrate {target_dir}         Migrate docker data_root to target_dir\"\n    echo \"      change_dir {target_dir}      Migrate docker data_root to target_dir but change dir only (no data copy)\"\n}\n\ncase $action in\n    \"check_dir\")\n        check_dir\n    ;;\n    \"migrate\")\n        migrate \"$@\"\n    ;;\n    \"migrate_check\")\n        migrate_check \"$@\"\n    ;;\n    \"change_dir\")\n        UCI_ONLY=1 migrate \"$@\"\n    ;;\n    *)\n        usage \"$0\"\n    ;;\nesac\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/root/usr/libexec/istore/ipkg-build",
    "content": "#!/bin/sh\n\n# ipkg-build -- construct a .ipk from a directory\n# Carl Worth <cworth@east.isi.edu>\n# based on a script by Steve Redler IV, steve@sr-tech.com 5-21-2001\n# 2003-04-25 rea@sr.unh.edu\n#   Updated to work on Familiar Pre0.7rc1, with busybox tar.\n#   Note it Requires: binutils-ar (since the busybox ar can't create)\n#   For UID debugging it needs a better \"find\".\nset -e\n\nversion=1.0\nFIND=\"$(command -v find)\"\nFIND=\"${FIND:-$(command -v gfind)}\"\nTAR=\"${TAR:-$(command -v tar)}\"\nGZIP=\"$(command -v gzip)\"\n\n# try to use fixed source epoch\nif [ -n \"$PKG_SOURCE_DATE_EPOCH\" ]; then\n\tTIMESTAMP=$(date --date=\"@$PKG_SOURCE_DATE_EPOCH\")\nelif [ -n \"$SOURCE_DATE_EPOCH\" ]; then\n\tTIMESTAMP=$(date --date=\"@$SOURCE_DATE_EPOCH\")\nelse\n\tTIMESTAMP=$(date)\nfi\n\nipkg_extract_value() {\n\tsed -e \"s/^[^:]*:[[:space:]]*//\"\n}\n\nrequired_field() {\n\tfield=$1\n\n\tgrep \"^$field:\" < $CONTROL/control | ipkg_extract_value\n}\n\npkg_appears_sane() {\n\tlocal pkg_dir=$1\n\n\tlocal owd=$PWD\n\tcd $pkg_dir\n\n\tPKG_ERROR=0\n\tpkg=`required_field Package`\n\tversion=`required_field Version | sed 's/Version://; s/^.://g;'`\n\tarch=`required_field Architecture`\n\n\tif echo $pkg | grep '[^a-zA-Z0-9_.+-]'; then\n\t\techo \"*** Error: Package name $name contains illegal characters, (other than [a-z0-9.+-])\" >&2\n\t\tPKG_ERROR=1;\n\tfi\n\n\tif [ -f $CONTROL/conffiles ]; then\n\t\trm -f $CONTROL/conffiles.resolved\n\n\t\tfor cf in `$FIND $(sed -e \"s!^/!$pkg_dir/!\" $CONTROL/conffiles) -type f`; do\n\t\t\techo \"${cf#$pkg_dir}\" >> $CONTROL/conffiles.resolved\n\t\tdone\n\n\t\trm $CONTROL/conffiles\n\t\tif [ -f $CONTROL/conffiles.resolved ]; then\n\t\t\tmv $CONTROL/conffiles.resolved $CONTROL/conffiles\n\t\t\tchmod 0644 $CONTROL/conffiles\n\t\tfi\n\tfi\n\n\tcd $owd\n\treturn $PKG_ERROR\n}\n\nresolve_file_mode_id() {\n\tlocal var=$1 type=$2 name=$3 id\n\n\tcase \"$name\" in\n\t\troot)\n\t\t\tid=0\n\t\t;;\n\t\t*[!0-9]*)\n\t\t\tid=$(sed -ne \"s#^$type $name \\\\([0-9]\\\\+\\\\)\\\\b.*\\$#\\\\1#p\" \"$TOPDIR/tmp/.packageusergroup\" 2>/dev/null)\n\t\t;;\n\t\t*)\n\t\t\tid=$name\n\t\t;;\n\tesac\n\n\texport \"$var=$id\"\n\n\t[ -n \"$id\" ]\n}\n\n###\n# ipkg-build \"main\"\n###\nfile_modes=\"\"\nusage=\"Usage: $0 [-v] [-h] [-m] <pkg_directory> [<destination_directory>]\"\nwhile getopts \"hvm:\" opt; do\n    case $opt in\n\tv ) echo $version\n\t    exit 0\n\t    ;;\n\th ) \techo $usage  >&2 ;;\n\tm )\tfile_modes=$OPTARG ;;\n\t\\? ) \techo $usage  >&2\n\tesac\ndone\n\n\nshift $(($OPTIND - 1))\n\n# continue on to process additional arguments\n\ncase $# in\n1)\n\tdest_dir=$PWD\n\t;;\n2)\n\tdest_dir=$2\n\tif [ \"$dest_dir\" = \".\" -o \"$dest_dir\" = \"./\" ] ; then\n\t    dest_dir=$PWD\n\tfi\n\t;;\n*)\n\techo $usage >&2\n\texit 1\n\t;;\nesac\n\npkg_dir=$1\n\nif [ ! -d $pkg_dir ]; then\n\techo \"*** Error: Directory $pkg_dir does not exist\" >&2\n\texit 1\nfi\n\n# CONTROL is second so that it takes precedence\nCONTROL=\n[ -d $pkg_dir/CONTROL ] && CONTROL=CONTROL\nif [ -z \"$CONTROL\" ]; then\n\techo \"*** Error: Directory $pkg_dir has no CONTROL subdirectory.\" >&2\n\texit 1\nfi\n\nif ! pkg_appears_sane $pkg_dir; then\n\techo >&2\n\techo \"ipkg-build: Please fix the above errors and try again.\" >&2\n\texit 1\nfi\n\ntmp_dir=$dest_dir/IPKG_BUILD.$$\nmkdir $tmp_dir\n\necho $CONTROL > $tmp_dir/tarX\ncd $pkg_dir\nfor file_mode in $file_modes; do\n\tcase $file_mode in\n\t/*:*:*:*)\n\t    ;;\n\t*)\n\t    echo \"ERROR: file modes must use absolute path and contain user:group:mode\"\n\t    echo \"$file_mode\"\n\t    exit 1\n\t    ;;\n\tesac\n\n\tmode=${file_mode##*:}; path=${file_mode%:*}\n\tgroup=${path##*:};     path=${path%:*}\n\tuser=${path##*:};      path=${path%:*}\n\n\tif ! resolve_file_mode_id uid user \"$user\"; then\n\t\techo \"ERROR: unable to resolve uid of $user\" >&2\n\t\texit 1\n\tfi\n\n\tif ! resolve_file_mode_id gid group \"$group\"; then\n\t\techo \"ERROR: unable to resolve gid of $group\" >&2\n\t\texit 1\n\tfi\n\n\tchown \"$uid:$gid\" \"$pkg_dir/$path\"\n\tchmod  \"$mode\" \"$pkg_dir/$path\"\ndone\n$TAR -X $tmp_dir/tarX --format=gnu --sort=name -cpf - --mtime=\"$TIMESTAMP\" . | $GZIP -n - > $tmp_dir/data.tar.gz\n\ninstalled_size=`ls -ln $tmp_dir/data.tar.gz | awk 'NR==1 {print $5}'`\nsed -i -e \"s/^Installed-Size: .*/Installed-Size: $installed_size/\" \\\n\t$pkg_dir/$CONTROL/control\n\n( cd $pkg_dir/$CONTROL && $TAR --format=gnu --sort=name -cf -  --mtime=\"$TIMESTAMP\" . | $GZIP -n - > $tmp_dir/control.tar.gz )\nrm $tmp_dir/tarX\n\necho \"2.0\" > $tmp_dir/debian-binary\n\npkg_file=$dest_dir/${pkg}_${version}_${arch}.ipk\nrm -f $pkg_file\n( cd $tmp_dir && $TAR --format=gnu --sort=name -cf -  --mtime=\"$TIMESTAMP\" ./debian-binary ./data.tar.gz ./control.tar.gz | $GZIP -n - > $pkg_file )\n\nrm $tmp_dir/debian-binary $tmp_dir/data.tar.gz $tmp_dir/control.tar.gz\nrmdir $tmp_dir\n\necho \"Packaged contents of $pkg_dir into $pkg_file\"\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/root/usr/libexec/istore/ipv4-bin/curl",
    "content": "#!/bin/sh\n\nnewpath=$(echo \":$PATH:\" | sed -e 's#:/usr/libexec/istore/ipv4-bin:#:#g' -e 's/^:*//' -e 's/:*$//')\n[ -z \"$newpath\" ] && newpath=\"/usr/sbin:/usr/bin:/sbin:/bin\"\n\nexport PATH=\"$newpath\"\n\nexec curl --ipv4 \"$@\"\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/root/usr/libexec/istore/ipv4-bin/wget",
    "content": "#!/bin/sh\n\nnewpath=$(echo \":$PATH:\" | sed -e 's#:/usr/libexec/istore/ipv4-bin:#:#g' -e 's/^:*//' -e 's/:*$//')\n[ -z \"$newpath\" ] && newpath=\"/usr/sbin:/usr/bin:/sbin:/bin\"\n\nexport PATH=\"$newpath\"\n\nexec wget -4 \"$@\"\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/root/usr/libexec/istore/overlay-backup",
    "content": "#!/bin/sh\n\nTMP_SELF_COPY=/var/run/cloned-overlay-backup\n\naction=${1}\nshift\n\nhas_overlay() {\n    [ -d \"/overlay/upper\" ] || return 1\n    [ \"overlay\" = \"$(/bin/mount | awk '($3 ~ /^\\/$/) && ($5 !~ /rootfs/) { print $5 }')\" ] || return 1\n\n    return 0\n}\n\nhas_ext_overlay() {\n    [ -d \"/ext_overlay/upper\" ] || return 1\n    grep '^overlayfs:/overlay / ' /proc/mounts | grep -Fq 'upperdir=/ext_overlay/upper' || return 1\n\n    return 0\n}\n\nbackup() {\n    if ! has_overlay; then\n        echo \"only supports squashfs firmware\"\n        exit 1\n    fi\n    if [ -z \"$1\" ]; then\n        echo \"input backup path is null\"\n        exit 1\n    fi\n    local BACKUP_PATH=\"$1\"\n\n    if echo \"$BACKUP_PATH\" | grep -q -e '^/overlay/upper' -e '^/ext_overlay/upper' ; then\n        echo \"can not backup to /overlay/upper, /ext_overlay/upper\"\n        exit 1\n    fi\n\n    if [ ! -d \"${BACKUP_PATH}\" ] && ! mkdir -p \"${BACKUP_PATH}\" ; then\n        echo \"backup path does not exist and can not be create\"\n        exit 1\n    fi\n\n    local realpath=\"$(cd \"${BACKUP_PATH}\"; pwd -P)\"\n    if [ -z \"$realpath\" ]; then\n        echo \"cannot get absolute path of ${BACKUP_PATH}\"\n        exit 1\n    fi\n\n    local mountpoint=$(findmnt -T $realpath -o TARGET | sed -n 2p)\n    # while read -r; do\n    #     if [[ \"x$realpath\" == \"x$REPLY\" || \"x${realpath#$REPLY/}\" != \"x$realpath\" ]]; then\n    #         mountpoint=\"$REPLY\"\n    #         break\n    #     fi\n    # done < <(\n    #     cat /proc/mounts | grep -v '^overlay ' | awk 'NR>1 {print $2}' | grep -v '^/$' | \\\n    #         sort -u | \\\n    #         while read -r; do printf \"%b\\n\" \"$REPLY\" ; done | \\\n    #         awk '{print length, $0}' | sort -nr | cut -d' ' -f2-\n    # )\n\n    if [ \"/\" = \"$mountpoint\" ]; then\n        echo \"can not backup to /\"\n        exit 1\n    else\n        echo \"found mount point $mountpoint\"\n    fi\n\n    local filename_suffix=\n    local tar_extra_args=\n    if has_ext_overlay; then\n        tar_extra_args=\"$tar_extra_args ext_overlay/upper\"\n        filename_suffix=\"${filename_suffix}.s\"\n    fi\n\n    local hostname=$(cat /proc/sys/kernel/hostname)\n    local fwver=$(. /etc/openwrt_release; echo $DISTRIB_ID-$DISTRIB_RELEASE)\n\n    local date=$(date +%Y-%m%d-%H%M)\n    local backup_name=\"backup_overlay_${hostname}_${fwver}_${date}${filename_suffix}.overlay.tar.gz\"\n    local backup_full_path=\"$BACKUP_PATH/$backup_name\"\n    echo \"writing backup to $backup_full_path\"\n    if tar -C / -cz overlay/upper $tar_extra_args > \"$backup_full_path\" ; then\n        sync \"$BACKUP_PATH\"\n        echo \"backup success\"\n        return 0\n    else\n        rm -f \"$backup_full_path\"\n        echo \"backup failed\"\n        exit 1\n    fi\n}\n\npatch_sandbox_device() {\n    local overlay=\"$1\"\n    local ucidir=\"$overlay/upper/etc/config\"\n    local uci_section=$(uci -c \"$ucidir\" -q show fstab | grep '^fstab\\.@mount\\[[0-9]*\\]\\.target='\"'/overlay'\\$\" | head -1 | grep -o '^fstab\\.@mount\\[[0-9]*\\]')\n    if [ -n \"$uci_section\" ]; then\n        if [ \"x1\" = \"x$(uci -c \"$ucidir\" get \"$uci_section.enabled\")\" ]; then\n            uci -c \"$ucidir\" -q delete \"$uci_section.uuid\"\n            uci -c \"$ucidir\" -q delete \"$uci_section.label\"\n            uci -c \"$ucidir\" -q delete \"$uci_section.device\"\n            if [ -n \"$SANDBOX_UUID\" ]; then\n                uci -c \"$ucidir\" set \"$uci_section.uuid=$SANDBOX_UUID\"\n            elif [ -n \"$SANDBOX_LABEL\" ]; then\n                uci -c \"$ucidir\" set \"$uci_section.label=$SANDBOX_LABEL\"\n            else\n                uci -c \"$ucidir\" set \"$uci_section.device=$SANDBOX_DEVICE\"\n            fi\n            uci -c \"$ucidir\" commit fstab\n            echo \"found and patched $overlay\"\n            return 0\n        fi\n    fi\n    return 1\n}\n\nrestore() {\n    if ! has_overlay; then\n        echo \"only supports squashfs firmware\"\n        exit 1\n    fi\n    if [ -z \"$1\" ]; then\n        echo \"input backup path is null\"\n        exit 1\n    fi\n    local BACKUP_PATH_FILE=\"$1\"\n\n    if [ ! -f \"${BACKUP_PATH_FILE}\" ]; then\n        echo \"invalid backup file, can not restore\"\n        exit 1\n    fi\n\n    # prevent uci cache\n    rm -rf /var/run/uci\n\n    SANDBOX_UUID=\n    SANDBOX_LABEL=\n    SANDBOX_DEVICE=\n    local tar_extra_args=overlay/upper\n    if has_ext_overlay; then\n        tar_extra_args=\n        if echo \"${BACKUP_PATH_FILE}\" | grep -q '\\.s\\.overlay\\.tar\\.gz$' ; then\n            local uuid label device line\n            local uci_section=$(uci -c /overlay/upper/etc/config show fstab | grep '^fstab\\.@mount\\[[0-9]*\\]\\.target='\"'/overlay'\\$\" | head -1 | grep -o '^fstab\\.@mount\\[[0-9]*\\]')\n            if [ -z \"$uci_section\" ]; then\n                echo \"failed to find sandbox config, there is debug info:\"\n                uci -c /overlay/upper/etc/config show fstab | grep '^fstab\\.[^.]*\\.target='\"'/overlay'\\$\"\n                exit 1\n            fi\n            while read line; do\n                export -n \"$line\"\n            done <<EOF\n                $(uci -c /overlay/upper/etc/config show \"$uci_section\" | sed -e '/^fstab\\.[^\\.]*=/d' -e 's/^fstab\\.[^\\.]*\\.//g' | grep -e '^uuid=' -e '^label=' -e '^device=' | sed \"s/'//g\")\nEOF\n            SANDBOX_UUID=$uuid\n            SANDBOX_LABEL=$label\n            SANDBOX_DEVICE=$device\n        fi\n    fi\n\n    sync /\n    echo \"restoring from ${BACKUP_PATH_FILE}\"\n    if tar -C / -xz $tar_extra_args < \"${BACKUP_PATH_FILE}\" ; then\n        if [ -n \"$SANDBOX_UUID\" -o -n \"$SANDBOX_LABEL\" -o -n \"$SANDBOX_DEVICE\" ]; then\n            echo \"patch sandbox device ${SANDBOX_UUID}${SANDBOX_LABEL}${SANDBOX_DEVICE}\"\n            patch_sandbox_device /overlay && patch_sandbox_device /ext_overlay\n        fi\n        sync /overlay /ext_overlay\n        echo \"restore success\"\n        echo \"schedule to restart after 5 seconds!\"\n        /etc/init.d/tasks task_add reboot 'reboot -d 5'\n        return 0\n    else\n        echo \"restore failed\"\n        exit 1\n    fi\n}\n\nsupports_overlay_backup() {\n    has_overlay || return 1\n    echo \"overlay\"\n    has_ext_overlay && echo \"ext_overlay\"\n    return 0\n}\n\nfilter_backups() {\n    if has_ext_overlay; then\n        cat\n    else\n        # do not support restoring sandbox backup on non sandbox env\n        grep -v '\\.s\\.overlay\\.tar\\.gz$'\n    fi\n}\n\nget_backup_file_list() {\n    if [ -n \"$1\" ]; then\n        ( cd \"$1\" && ls backup_overlay_*.overlay.tar.gz | filter_backups )\n        return 0\n    else\n        echo \"input backup path is null\"\n        exit 1\n    fi\n}\n\nusage() {\n    echo \"usage: overlay-backup sub-command [arguments...]\"\n    echo \"where sub-command is one of:\"\n    echo \"      backup [dir]                    Backup all installed package(s) to [directory]\"\n    echo \"      restore [dir]                   Restore package(s) by [directory]\"\n    echo \"      supports_overlay_backup         check system supports overlay backup\"\n    echo \"      get_backup_file_list [dir]      get local available backup file list in [dir]\"\n}\n\ncase $action in\n    \"supports_overlay_backup\")\n        supports_overlay_backup\n    ;;\n    \"backup\")\n        backup \"$@\"\n    ;;\n    \"restore\")\n        if [ \"$0\" = \"$TMP_SELF_COPY\" ]; then\n            restore \"$@\"\n        else\n            echo \"copy self $0 to $TMP_SELF_COPY when restore\"\n            cp -af \"$0\" \"$TMP_SELF_COPY\"\n            exec \"$TMP_SELF_COPY\" restore \"$@\"\n        fi\n    ;;\n    \"get_available_backup_file_list\")\n        get_backup_file_list \"$@\"\n    ;;\n    *)\n        usage\n    ;;\nesac\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/root/usr/share/opkg/intercept/rm",
    "content": "#!/bin/sh\nfor i in \"$@\"; do\n\techo \"$i\" | grep -s -q \"/etc/uci-defaults/\" \\\n\t\t&& mkdir -p /etc/istore/uci-defaults_bak \\\n\t\t&& cp -f \"$i\" /etc/istore/uci-defaults_bak/\ndone\n/bin/rm \"$@\"\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/src/Makefile",
    "content": "clean:\ncompile:\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_NAME:=luci-lib-dummy\nINCLUDE_DIR:=./dummy\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\ninstall:\n\t[ -n \"$(APP_STORE_VERSION)\" ]\n\tmkdir -p \"$(DESTDIR)/www/luci-static\"\n\tcp -a \"$(FRONTEND_DIST)/luci-static/istore\" \"$(DESTDIR)/www/luci-static/\"\n\t$(SED) 's#\\.js\"#.js?v=$(APP_STORE_VERSION)\"#g' \"$(DESTDIR)/www/luci-static/istore/index.js\"\n\tmkdir -p \"$(DESTDIR)/etc/opkg/keys\"\n\techo \"$(APP_STORE_VERSION)\" > \"$(DESTDIR)/etc/.app_store.version\"\n\tcp -a ./compat.conf \"$(DESTDIR)/etc/opkg/compatfeeds.conf\"\n\tcp -a ./key-build.pub $(DESTDIR)/etc/opkg/keys/`$(STAGING_DIR_HOST)/bin/usign -F -p ./key-build.pub`\n\tmkdir -p \"$(DESTDIR)$(LUCI_LIBRARYDIR)/i18n\"\n\t$(foreach lang,$(LUCI_LANGUAGES),$(foreach po,$(wildcard ${CURDIR}/po/$(lang)/*.po), \\\n\tpo2lmo $(po) \\\n\t\t$(DESTDIR)$(LUCI_LIBRARYDIR)/i18n/$(basename $(notdir $(po))).$(lang).lmo;))\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/src/compat.conf",
    "content": "src/gz istore_compat https://istore.istoreos.com/repo/all/compat"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/src/dummy/package.mk",
    "content": "define BuildPackage\nendef"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/src/key-build.pub",
    "content": "untrusted comment: istore key\nRWSlbxYnTG1Ia0BvB+xd7YdP7QDQACljfpve7sx9KYq94QgIqtlljuME\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/src/po/templates/iStore.pot",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\nmsgid \"istore_vue_lang\"\nmsgstr \"en\"\n\nmsgid \"iStore\"\nmsgstr \"\"\n\nmsgid \"This package is broken! Please reinstall or uninstall it.\"\nmsgstr \"\"\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/src/po/zh-tw/iStore.po",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\nmsgid \"istore_vue_lang\"\nmsgstr \"zh-cn\"\n\nmsgid \"iStore\"\nmsgstr \"iStore\"\n\nmsgid \"This package is broken! Please reinstall or uninstall it.\"\nmsgstr \"此軟體包已損壞！請重新安裝或卸載它。\"\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/src/po/zh_Hans/iStore.po",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\nmsgid \"istore_vue_lang\"\nmsgstr \"zh-cn\"\n\nmsgid \"iStore\"\nmsgstr \"iStore\"\n\nmsgid \"This package is broken! Please reinstall or uninstall it.\"\nmsgstr \"此软件包已损坏！请重新安装或卸载它。\"\n"
  },
  {
    "path": "luci-app-store/luci/luci-app-store/swagger.yaml",
    "content": "swagger: \"2.0\"\ninfo:\n  description: Store API V1\n  title: Store API V1\n  version: 3.0.0\npaths:\n  /cgi-bin/luci/admin/store/token:\n    get:\n      tags:\n        - token\n      summary: 获取csrfToken（用于POST请求）\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseStoreToken\"\n  /cgi-bin/luci/admin/store/installed:\n    get:\n      tags:\n        - installed\n      summary: 获取已安装的插件\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseStoreInstalled\"\n  /cgi-bin/luci/admin/store/install:\n    post:\n      tags:\n        - install\n      summary: 安装插件。安装过程中使用taskd接口获取日志\n      parameters:\n        - in: \"query\"\n          name: \"token\"\n          type: string\n          required: true\n        - in: \"query\"\n          name: \"package\"\n          type: string\n          required: true\n        - in: \"query\"\n          name: \"autoconf\"\n          type: string\n          description: \"可选参数,表示安装完以后是否自动配置插件\"\n        - in: \"query\"\n          name: \"path\"\n          type: string\n          description: \"可选参数,表示安装完以后是否自动配置插件\"\n        - in: \"query\"\n          name: \"enable\"\n          type: string\n          description: \"可选参数,表示安装完以后是否自动配置插件\"\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseStore\"\n  /cgi-bin/luci/admin/store/autoconf:\n    post:\n      tags:\n        - install\n      summary: 自动配置插件\n      parameters:\n        - in: \"query\"\n          name: \"token\"\n          type: string\n          required: true\n        - in: \"query\"\n          name: \"package\"\n          type: string\n          required: true\n        - in: \"query\"\n          name: \"path\"\n          type: string\n          description: \"可选参数\"\n        - in: \"query\"\n          name: \"enable\"\n          type: string\n          description: \"可选参数\"\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseStore\"\n  /cgi-bin/luci/admin/store/remove:\n    post:\n      tags:\n        - remove\n      summary: 卸载插件\n      parameters:\n        - in: \"query\"\n          name: \"token\"\n          type: string\n          required: true\n        - in: \"query\"\n          name: \"package\"\n          type: string\n          required: true\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseStore\"\n  /cgi-bin/luci/admin/store/upgrade:\n    post:\n      tags:\n        - upgrade\n      summary: 更新插件\n      parameters:\n        - in: \"query\"\n          name: \"token\"\n          type: string\n          required: true\n        - in: \"query\"\n          name: \"package\"\n          type: string\n          required: true\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseStore\"\n  /cgi-bin/luci/admin/store/upload:\n    post:\n      tags:\n        - upload\n      summary: 上传插件\n      description: \"(文件上传表单，支持文件扩展名 .ipk,.run )\"\n      consumes:\n        - multipart/form-data\n      parameters:\n        - in: formData\n          name: file\n          type: file\n          description: The file to upload.\n        - in: \"query\"\n          name: \"token\"\n          type: string\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseStore\"\n  /cgi-bin/luci/admin/store/update:\n    post:\n      tags:\n        - update\n      summary: 刷新可用软件列表\n      parameters:\n        - in: \"query\"\n          name: \"token\"\n          type: string\n          required: true\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseStore\"\n  /cgi-bin/luci/admin/store/status:\n    get:\n      tags:\n        - status\n      summary: 查询特定软件状态\n      parameters:\n        - in: \"query\"\n          name: \"package\"\n          type: string\n          required: true\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseStoreStatus\"\n  /cgi-bin/luci/admin/store/log:\n    get:\n      tags:\n        - log\n      summary: 任务日志，已废弃\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseStore\"\n  /cgi-bin/luci/admin/store/check_self_upgrade:\n    get:\n      tags:\n        - check_self_upgrade\n      summary: 检查iStore自身更新\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseStoreCheckSelfUpgrade\"\n  /cgi-bin/luci/admin/store/do_self_upgrade:\n    post:\n      tags:\n        - do_self_upgrade\n      summary: 更新iStore自身\n      parameters:\n        - in: \"query\"\n          name: \"token\"\n          type: string\n          required: true\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseStore\"\n  /cgi-bin/luci/admin/store/get_block_devices:\n    get:\n      tags:\n        - get_block_devices\n      summary: 枚举块设备\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseStoreGetBlockDevices\"\n  /cgi-bin/luci/admin/store/configured:\n    get:\n      tags:\n        - configured\n      summary: 检查插件是否已经配置过\n      parameters:\n        - in: \"query\"\n          name: \"uci\"\n          type: string\n          required: true\n          description: \"要检查的uci配置文件名称\"\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseStoreConfigured\"\n  /cgi-bin/luci/admin/store/entrysh:\n    post:\n      tags:\n        - entrysh\n      summary: 查询插件运行状态，主要为了获取入口信息。\n      description: 调用前应该检查meta数据中flags数组包含entrysh，注意如果是安装插件则检查服务器端的flags，如果是调用已安装插件则检查路由器端的flags。\n      parameters:\n        - in: \"query\"\n          name: \"token\"\n          type: string\n          required: true\n        - in: \"query\"\n          name: \"package\"\n          type: string\n          description: \"包名，例如aria2。支持英文逗号分隔多个包名。如果未提供，则返回所有支持entrysh的包\"\n        - in: \"query\"\n          name: \"hostname\"\n          type: string\n          required: true\n          description: \"主机名，不包含端口。前端应该使用location.hostname获取\"\n        - in: \"query\"\n          name: \"update\"\n          type: integer\n          description: \"如果为1则强制更新缓存\"\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseStoreEntrysh\"\n        \"400\":\n          description: Bad Request。hostname不合法\n  /cgi-bin/luci/admin/store/docker_check_dir:\n    get:\n      tags:\n        - docker_check_dir\n      summary: 检查docker目录是否在系统盘\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseDockerCheckDir\"\n  /cgi-bin/luci/admin/store/docker_check_migrate:\n    get:\n      tags:\n        - docker_check_migrate\n      summary: 检查docker迁移目标目录是否有效\n      parameters:\n        - in: \"query\"\n          name: \"path\"\n          type: string\n          required: true\n          description: \"完整目标路径\"\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseDockerCheckMigrate\"\n  /cgi-bin/luci/admin/store/docker_migrate:\n    post:\n      tags:\n        - docker_migrate\n      summary: docker迁移到目标目录，异步\n      description: 当返回code为0的时候，可以使用taskd接口展示日志，跟安装插件时一样\n      parameters:\n        - in: \"query\"\n          name: \"token\"\n          type: string\n          required: true\n        - in: \"query\"\n          name: \"path\"\n          type: string\n          required: true\n          description: \"完整目标路径\"\n        - in: \"query\"\n          name: \"overwrite\"\n          type: string\n          description: \"如果docker_check_migrate返回的result是existed，使用此参数指定解决方案：‘true’表示覆盖目标目录；‘chdir’表示只修改路径不复制文件\"\n      responses:\n        \"200\":\n          description: OK\n          schema:\n            $ref: \"#/definitions/ResponseStore\"\n  \ndefinitions:\n  ResponseStoreToken:\n   type: object\n   properties:\n    token:\n     type: string\n  StoreInstalledApp:\n    type: object\n    properties:\n      tutorial:\n        type: string\n        description: \"教程\"\n      arch:\n        type: array\n        description: \"适用的架构平台\"\n        items:\n          type: string\n      entry:\n        type: string\n        description: \"对于的页面地址\"\n      author:\n        type: string\n        description: \"作者\"\n      depends:\n        type: array\n        description: \"关联的依赖\"\n        items:\n          type: string\n      time:\n        type: integer\n        description: \"更新日期\"\n      tags:\n        type: array\n        description: \"标签\"\n        items:\n          type: string\n      description_en:\n        type: string\n        description: \"简介，英文\"\n      description:\n        type: string\n        description: \"简介，英文\"\n      title:\n        type: string\n        description: \"标题\"\n      release:\n        type: integer\n        description: \"发布\"\n      website:\n        type: string\n        description: \"官网\"\n      version:\n        type: string\n        description: \"版本号\"\n      name:\n        type: string\n        description: \"名称\"\n  ResponseStoreInstalled:\n    type: array\n    items:\n      $ref: \"#/definitions/StoreInstalledApp\"\n  ResponseStore:\n    type: object\n    properties:\n      code:\n        type: integer\n      stdout:\n        type: string\n      stderr:\n        type: string\n  ResponseStoreStatus:\n    type: object\n    allOf:\n      - $ref: \"#/definitions/StoreInstalledApp\"\n    properties:\n      installed:\n        type: boolean\n  ResponseStoreCheckSelfUpgrade:\n    type: object\n    properties:\n      code:\n        type: integer\n        description: \"为200时,msg会显示版本号\"\n      msg:\n        type: string\n        description: \"内容\"\n  GetBlockDevice:\n    type: object\n    properties:\n      dev:\n        type: string\n      uuid:\n        type: string\n      version:\n        type: string\n      label:\n        type: string\n      mount:\n        type: string\n      type:\n        type: string\n      size:\n        type: string\n  ResponseStoreGetBlockDevices:\n    type: object\n    properties:\n      code:\n        type: integer\n        description: \"为200时\"\n      msg:\n        type: string\n        description: \"内容\"\n      data:\n        type: object\n        additionalProperties:\n          $ref: \"#/definitions/GetBlockDevice\"\n  ResponseStoreConfigured:\n    type: object\n    properties:\n      code:\n        type: integer\n        description: \"为200时\"\n      configured:\n        type: boolean\n  ResponseDockerCheckDir:\n    type: object\n    properties:\n      code:\n        type: integer\n        description: \"为200时\"\n      docker_on_system:\n        type: boolean\n        description: \"docker数据在系统盘\"\n  ResponseDockerCheckMigrate:\n    type: object\n    properties:\n      code:\n        type: integer\n        description: \"为200时\"\n      result:\n        type: string\n        description: \"检查结果。可能值‘good’，‘bad’，‘existed’\"\n      error:\n        type: string\n        description: \"当result为bad时，此处返回错误日志\"\n  StoreEntrysh:\n    type: object\n    description: \"状态和入口信息，不同插件可能有些不一样，仅列出常用公共参数\"\n    properties:\n      app:\n        type: string\n        description: \"插件名称\"\n      docker:\n        type: boolean\n        description: \"如果是docker插件\"\n      running:\n        type: boolean\n        description: \"是否运行中\"\n      deployed:\n        type: boolean\n        description: \"如果是docker插件且未运行，则是否已经部署\"\n      web:\n        type: string\n        description: \"url\"\n      href:\n        type: string\n        description: \"web端直接跳转url\"\n    \n  ResponseStoreEntrysh:\n    type: object\n    properties:\n      code:\n        type: integer\n        description: \"为200时\"\n      status:\n        description: \"处理成功的结果集\"\n        type: array\n        items:\n          $ref: \"#/definitions/StoreEntrysh\"\n      errors:\n        description: \"处理失败的结果集\"\n        type: array\n        items:\n          type: object\n          description: \"失败信息\"\n          properties:\n            app:\n              type: string\n              description: \"插件名称\"\n            code:\n              type: integer\n              description: \"404或500\"\n            msg:\n              type: string\n              description: \"错误信息\"\n\n"
  },
  {
    "path": "luci-app-store/luci/luci-lib-taskd/Makefile",
    "content": "#\n# Copyright (C) 2022 jjm2473 <jjm2473@gmail.com>\n#\n# This is free software, licensed under the MIT License.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=Task library\nLUCI_DEPENDS:=+luci-lib-xterm +taskd\nLUCI_EXTRA_DEPENDS:=taskd (>=1.0.3)\nLUCI_PKGARCH:=all\n\nPKG_VERSION:=1.0.25\nPKG_RELEASE:=\nPKG_MAINTAINER:=jjm2473 <jjm2473@gmail.com>\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-store/luci/luci-lib-taskd/htdocs/luci-static/resources/tasks/tasks.css",
    "content": "[hidden] {\n    display: none !important;\n}\n\n#tasks_detail_container {\n    position: fixed;\n    z-index: 1000;\n    top: 0;\n    left: 0;\n    width: 100%;\n    height: 100%;\n    overflow: hidden;\n    background-color: #0008;\n}\n#tasks_dialog {\n    position: absolute;\n    width: 770px;\n    max-width: 100%;\n    max-height: 100%;\n    left: 50%;\n    top: 50%;\n    transform: translate(-50%, -50%);\n    background-color: #000;\n\n    border-radius: 10px;\n    box-shadow: 2px 2px 6px #000a;\n    padding: 20px;\n\n    color: white;\n}\n.dialog-title-bar {\n    margin-top: -10px;\n    margin-right: -10px;\n    margin-bottom: 5px;\n    display: flex;\n    flex-direction: row;\n    justify-content: space-between;\n    flex-wrap: nowrap;\n    align-items: center;\n}\n.dialog-title-bar .dialog-title {\n    word-break: break-all;\n    text-overflow: ellipsis;\n    white-space: nowrap;\n    overflow: hidden;\n}\n.dialog-content {\n    position: relative;\n    max-height: 500px;\n    overflow-y: scroll;\n    margin-right: -10px;\n}\n.dialog-icons {\n    align-self: center;\n    display: flex;\n    justify-content: flex-end;\n}\n.dialog-icon {\n    display: flex;\n    align-items: center;\n    flex-wrap: nowrap;\n\n    width: 20px;\n    height: 20px;\n    background-color: white;\n    color: black;\n    border-radius: 50%;\n    font-size: 10px;\n    font-weight: bold;\n    user-select: none;\n    margin-left: 10px;\n    line-height: 1;\n    font-family: sans-serif;\n    justify-content: center;\n    cursor: pointer;\n}\n.dialog-icon.dialog-icon-min {\n    background-color: darkorange;\n}\n.dialog-icon.dialog-icon-close {\n    background-color: #ff5f56;\n}\n.dialog-icons:hover .dialog-icon.dialog-icon-min:before {\n    content: \"_\";\n}\n.dialog-icons:hover .dialog-icon.dialog-icon-close:before {\n    content: \"X\";\n}\n\n.tasks_stopped .dialog-icon.dialog-icon-close {\n    background-color: #27c840;\n}\n.tasks_stopped #tasks_dialog, .tasks_unknown #tasks_dialog {\n    padding: 19px;\n    border: 1px #27c840 solid;\n\n    animation: border-blink 1s;\n    animation-iteration-count: infinite;\n}\n\n.tasks_failed #tasks_dialog {\n    border-color: #ff0000;\n}\n\n.tasks_failed .dialog-icon.dialog-icon-close {\n    background-color: #ff0000;\n}\n\n.tasks_unknown #tasks_dialog {\n    border-color: darkorange;\n}\n\n#tasks_result_mask {\n    display: none;\n    background-color: #000d;\n    position: absolute;\n    left: 0;\n    top: 0;\n    z-index: 100;\n    width: 100%;\n    height: 100%;\n\n    cursor: default;\n    user-select: none;\n\n    font-size: small;\n}\n\n.tasks_stopped #tasks_result_mask {\n    display: flex;\n    flex-direction: column;\n    justify-content: center;\n    align-items: center;\n}\n\n.tasks_result_success, .tasks_stopped.tasks_failed .tasks_result_success, .tasks_result_failed {\n    display: none;\n    font-size: xx-large;\n}\n\n.tasks_stopped .tasks_result_success {\n    display: initial;\n    color: #27c840;\n}\n\n.tasks_failed .tasks_result_failed {\n    display: initial;\n    color: darkorange;\n}\n\n@keyframes border-blink { 50% { border-color:#fff ; }  }\n"
  },
  {
    "path": "luci-app-store/luci/luci-lib-taskd/htdocs/luci-static/resources/tasks/tasks.js",
    "content": "\n(function(){\n    const taskd={};\n    const $gettext = function(str) {\n        return taskd.i18n[str] || str;\n    };\n    const retryPromise = function(fn) {\n        return new Promise((resolve, reject) => {\n            const retry = function() {\n                fn(resolve, reject, retry);\n            };\n            retry();\n        });\n    };\n    const retry403XHR = function(url, method, responseType) {\n        return retryPromise((resolve, reject, retry) => {\n            var oReq = new XMLHttpRequest();\n            oReq.onerror = reject;\n            oReq.open(method || 'GET', url, true);\n            if (responseType) {\n                oReq.responseType = responseType;\n            }\n            oReq.onload = function (oEvent) {\n                if (oReq.status == 403) {\n                    alert($gettext(\"Lost login status\"));\n                    location.href = location.href.replace(/#.*$/,'');\n                } else if (oReq.status >= 400) {\n                    reject(oEvent);\n                } else {\n                    resolve(oReq);\n                }\n            };\n            if (method=='POST') {\n                oReq.setRequestHeader(\"Content-type\", \"application/x-www-form-urlencoded\");\n            }\n            oReq.send(method=='POST'?(\"token=\"+taskd.csrfToken):null);\n        });\n    };\n    const request = function(url, method) {\n        return retry403XHR(url, method).then(oReq => oReq.responseText);\n    };\n    const getBin = function(url) {\n        return retry403XHR(url, null, \"arraybuffer\").then(oReq => {return {status: oReq.status, buffer: new Uint8Array(oReq.response)}});\n    };\n    const getTaskDetail = function(task_id) {\n        return request(\"/cgi-bin/luci/admin/system/tasks/status?task_id=\"+task_id).then(data=>JSON.parse(data));\n    };\n    const create_dialog = function(cfg) {\n        const container = document.createElement('div');\n        container.id = \"tasks_detail_container\";\n        container.innerHTML = taskd.dialog_template;\n\n        document.body.appendChild(container);\n        const title_view = container.querySelector(\".dialog-title-bar .dialog-title\");\n        title_view.innerText = cfg.title;\n\n        const term = new Terminal({convertEol: cfg.convertEol||false});\n        if (cfg.nohide) {\n            container.querySelector(\".dialog-icon-min\").hidden = true;\n        } else {\n            container.querySelector(\".dialog-icon-min\").onclick = function(){\n                container.hidden=true;\n                term.dispose();\n                document.body.removeChild(container);\n                cfg.onhide && cfg.onhide();\n                return false;\n            };\n        }\n        const tasks_result_mask = container.querySelector(\"#tasks_result_mask\");\n        if (taskd.show_mask_on_stopped) {\n            tasks_result_mask.onclick = function(){\n                tasks_result_mask.hidden=true;\n            };\n        } else {\n            tasks_result_mask.hidden=true;\n        }\n        term.open(document.getElementById(\"tasks_xterm_log\"));\n\n        return {term,container};\n    };\n    const show_log_txt = function(title, content, onclose) {\n        const dialog = create_dialog({title, convertEol:true, onhine:onclose});\n        const container = dialog.container;\n        const term = dialog.term;\n        container.querySelector(\".dialog-icon-close\").hidden = true;\n        term.write(content);\n    };\n    const show_log = function(task_id, nohide, onExit) {\n        let showing = true;\n        let running = true;\n        const dialog = create_dialog({title:task_id, nohide, onhide:function(){showing=false;}});\n        const container = dialog.container;\n        const term = dialog.term;\n\n        const title_view = container.querySelector(\".dialog-title-bar .dialog-title\");\n        container.querySelector(\".dialog-icon-close\").onclick = function(){\n            if (!running || confirm($gettext(\"Stop running task?\"))) {\n                running=false;\n                showing=false;\n                del_task(task_id).then(()=>{\n                    location.href = location.href.replace(/#.*$/,'');\n                });\n            }\n            return false;\n        };\n        const checkTask = function() {\n            if (!showing) {\n                return Promise.resolve(false);\n            }\n            return getTaskDetail(task_id).then(data=>{\n                if (!running) {\n                    return false;\n                }\n                running = data.running;\n                let title = task_id;\n                if (!data.running && data.stop) {\n                    title += \" (\" + (data.exit_code?$gettext(\"Failed at:\"):$gettext(\"Finished at:\")) + \" \" + new Date(data.stop * 1000).toLocaleString() + \")\";\n                }\n                title += \" > \" + (data.command || '');\n                title_view.title = title;\n                title_view.innerText = title;\n                if (!data.running) {\n                    container.classList.add('tasks_stopped');\n                    if (data.exit_code) {\n                        container.classList.add('tasks_failed');\n                    }\n                    onExit && onExit(data.exit_code);\n                }\n                // last pull\n                return showing;\n            });\n        };\n        let logoffset = 0;\n        const pulllog = function(check) {\n            let starter = Promise.resolve(showing);\n            if (check) {\n                starter = checkTask();\n            }\n            starter.then(again => {\n                if (again)\n                    return getBin(\"/cgi-bin/luci/admin/system/tasks/log?task_id=\"+task_id+\"&offset=\"+logoffset);\n                else\n                    return {status: 204};\n            }).then(function(res){\n                if (!showing) {\n                    return false;\n                }\n                switch(res.status){\n                    case 205:\n                        term.reset();\n                        logoffset = 0;\n                        return running;\n                        break;\n                    case 204:\n                        return running && checkTask();\n                        break;\n                    case 200:\n                        logoffset += res.buffer.byteLength;\n                        term.write(res.buffer);\n                        return running;\n                        break;\n                }\n            }).then(again => {\n                if (again) {\n                    setTimeout(pulllog, 0);\n                }\n            }).catch(err => {\n                if (showing) {\n                    console.error(err);\n                    if (err.target) {\n                        if (err.target.status == 0 || err.target.status == 502) {\n                            title_view.innerText = task_id + ' (' + $gettext(\"Fetch log failed, retrying...\") + ')';\n                        } else if (err.target.status == 403 || err.target.status == 404) {\n                            title_view.innerText = task_id + ' (' + $gettext(err.target.status == 403?\"Lost login status\":\"Task does not exist or has been deleted\") + ')';\n                            container.querySelector(\".dialog-icon-close\").hidden = true;\n                            container.classList.add('tasks_unknown');\n                            return\n                        }\n                    }\n                    setTimeout(()=>pulllog(true), 1000);\n                }\n            });\n        };\n        pulllog(true);\n    };\n    const del_task = function(task_id) {\n        return request(\"/cgi-bin/luci/admin/system/tasks/stop?task_id=\"+task_id, \"POST\");\n    };\n    taskd.show_log = show_log;\n    taskd.remove = del_task;\n    taskd.show_log_txt = show_log_txt;\n    window.taskd=taskd;\n})();\n\n(function(){\n    // compat\n    if (typeof(window.findParent) !== 'function') {\n        const elem = function(e) {\n            return (e != null && typeof(e) == 'object' && 'nodeType' in e);\n        };\n        const matches = function(node, selector) {\n            var m = elem(node) ? node.matches || node.msMatchesSelector : null;\n            return m ? m.call(node, selector) : false;\n        };\n        window.findParent = function (node, selector) {\n            if (elem(node) && node.closest)\n                return node.closest(selector);\n\n            while (elem(node))\n                if (matches(node, selector))\n                    return node;\n                else\n                    node = node.parentNode;\n\n            return null;\n        };\n    }\n    if (typeof(window.cbi_submit) !== 'function') {\n        const makeHidden = function(name) {\n            const input = document.createElement('input');\n            input.type = 'hidden';\n            input.name = name;\n            return input;\n        };\n        window.cbi_submit = function(elem, name, value, action) {\n            var form = elem.form || findParent(elem, 'form');\n\n            if (!form)\n                return false;\n\n            if (action)\n                form.action = action;\n\n            if (name) {\n                var hidden = form.querySelector('input[type=\"hidden\"][name=\"%s\"]'.format(name)) ||\n                    makeHidden(name);\n\n                hidden.value = value || '1';\n                form.appendChild(hidden);\n            }\n\n            form.submit();\n            return true;\n        };\n    }\n})();"
  },
  {
    "path": "luci-app-store/luci/luci-lib-taskd/luasrc/controller/tasks-lib.lua",
    "content": "\nmodule(\"luci.controller.tasks-lib\", package.seeall)\n\n\nfunction index()\n  entry({\"admin\", \"system\", \"tasks\"}, call(\"tasks_ping\")).dependent=false -- just for compatible\n  entry({\"admin\", \"system\", \"tasks\", \"status\"}, call(\"tasks_status\")).dependent=false\n  entry({\"admin\", \"system\", \"tasks\", \"log\"}, call(\"tasks_log\")).dependent=false\n  entry({\"admin\", \"system\", \"tasks\", \"stop\"}, post(\"tasks_stop\")).dependent=false\nend\n\nlocal util  = require \"luci.util\"\nlocal jsonc = require \"luci.jsonc\"\nlocal ltn12 = require \"luci.ltn12\"\n\nlocal taskd = require \"luci.model.tasks\"\n\nfunction tasks_ping()\n  luci.http.prepare_content(\"application/json\")\n  luci.http.write_json({})\nend\n\nfunction tasks_status()\n  local data = taskd.status(luci.http.formvalue(\"task_id\"))\n  luci.http.prepare_content(\"application/json\")\n  luci.http.write_json(data)\nend\n\nfunction tasks_log()\n  local wait = 107\n  local task_id = luci.http.formvalue(\"task_id\")\n  local offset = luci.http.formvalue(\"offset\")\n  offset = offset and tonumber(offset) or 0\n  local logpath = \"/var/log/tasks/\"..task_id..\".log\"\n  local i\n  local logfd = io.open(logpath, \"rb\")\n  if logfd == nil then\n    luci.http.status(404)\n    luci.http.write(\"log not found\")\n    return\n  end\n\n  local size = logfd:seek(\"end\")\n\n  if size < offset then\n    luci.http.status(205, \"Reset Content\")\n    luci.http.write(\"reset offset\")\n    return\n  end\n\n  i = 0\n  while (i < wait)\n  do\n    if size > offset then\n      break\n    end\n    nixio.nanosleep(0, 10000000) -- sleep 10ms\n    size = logfd:seek(\"end\")\n    i = i+1\n  end\n  if i == wait then\n    logfd:close()\n    luci.http.status(204)\n    luci.http.prepare_content(\"application/octet-stream\")\n    return\n  end\n  logfd:seek(\"set\", offset)\n\n  local write_log = function()\n    local buffer = logfd:read(4096)\n    if buffer and #buffer > 0 then\n        return buffer\n    else\n        logfd:close()\n        return nil\n    end\n  end\n\n  luci.http.prepare_content(\"application/octet-stream\")\n\n  if logfd then\n    ltn12.pump.all(write_log, luci.http.write)\n  end\nend\n\nfunction tasks_stop()\n  local sys = require(\"luci.sys\")\n  local task_id = luci.http.formvalue(\"task_id\") or \"\"\n  if task_id == \"\" then\n    luci.http.status(400)\n    luci.http.write(\"task_id is empty\")\n    return\n  end\n  if sys.call(\"/etc/init.d/tasks task_del \"..task_id..\" >/dev/null 2>&1\") ~= 0 then\n    nixio.nanosleep(2, 10000000)\n  end\n  luci.http.status(204)\nend\n"
  },
  {
    "path": "luci-app-store/luci/luci-lib-taskd/luasrc/model/tasks.lua",
    "content": "local util  = require \"luci.util\"\nlocal jsonc = require \"luci.jsonc\"\n\nlocal taskd = {}\n\nlocal function output(data)\n    local ret={}\n    ret.running=data.running\n    if not data.running then\n      ret.exit_code=data.exit_code\n      if nil == ret.exit_code then\n        if data[\"data\"] and data[\"data\"][\"exit_code\"] and data[\"data\"][\"exit_code\"] ~= \"\" then\n          ret.exit_code=tonumber(data[\"data\"][\"exit_code\"])\n        else\n          ret.exit_code=143\n        end\n      end\n    end\n    ret.command=data[\"command\"] and data[\"command\"][4] or '#'\n    if data[\"data\"] then\n        ret.start=tonumber(data[\"data\"][\"start\"])\n        if not data.running and data[\"data\"][\"stop\"] then\n            ret.stop=tonumber(data[\"data\"][\"stop\"])\n        end\n    end\n    return ret\nend\n\ntaskd.status = function (task_id)\n  task_id = task_id or \"\"\n  local data = util.trim(util.exec(\"/etc/init.d/tasks task_status \"..task_id..\" 2>/dev/null\")) or \"\"\n  if data ~= \"\" then\n    data = jsonc.parse(data)\n  else\n    if task_id == \"\" then\n      data = {}\n    else\n      data = {running=false, exit_code=404}\n    end\n  end\n  if task_id ~= \"\" then\n    return output(data)\n  end\n  local ary={}\n  for k, v in pairs(data) do\n    ary[k] = output(v)\n  end\n  return ary\nend\n\ntaskd.docker_map = function(config, task_id, script_path, title, desc)\n  require(\"luci.cbi\")\n  require(\"luci.http\")\n  require(\"luci.sys\")\n  local translate = require(\"luci.i18n\").translate\n  local m\n  m = luci.cbi.Map(config, title, desc)\n  m.template = \"tasks/docker\"\n  -- hide default buttons\n  m.pageaction = false\n  -- we want hook 'on_after_apply' works, 'apply_on_parse' can be true (rollback) or false (no rollback),\n  -- but 'apply_on_parse' must be true for luci 17.01 and below\n  m.apply_on_parse = true\n  m.script_path = script_path\n  m.task_id = task_id\n  m.auto_show_task = true\n  m.on_before_apply = function(self)\n    if self.uci.rollback then\n      -- luci 18.06+ has 'rollback' function\n      -- rollback dialog will show because 'apply_on_parse' is true,\n      -- hide rollback dialog by hook 'apply' function\n      local apply = self.uci.apply\n      self.uci.apply = function(uci, rollback)\n        apply(uci, false)\n      end\n    end\n  end\n  m.on_after_apply = function(self)\n    local cmd\n    local action = luci.http.formvalue(\"cbi.apply\") or \"null\"\n    if \"upgrade\" == action or \"install\" == action\n        or \"start\" == action or \"stop\" == action or \"restart\" == action or \"rm\" == action then\n      cmd = string.format(\"\\\"%s\\\" %s\", script_path, action)\n    end\n    if cmd then\n      if luci.sys.call(\"/etc/init.d/tasks task_add \" .. task_id .. \" \" .. luci.util.shellquote(cmd) .. \" >/dev/null 2>&1\") ~= 0 then\n        self.task_start_failed = true\n        self.message = translate(\"Config saved, but apply failed\")\n      end\n    else\n      self.message = translate(\"Unknown command: \") .. action\n    end\n    if self.message then\n      self.auto_show_task = false\n    end\n  end\n  return m\nend\n\nreturn taskd\n"
  },
  {
    "path": "luci-app-store/luci/luci-lib-taskd/luasrc/view/tasks/docker.htm",
    "content": "\n<% if self.task_start_failed then %>\n<div class=\"alert-message warning\"><%:Another task running, try again later.%> <a href=\"javascript:void(taskd.show_log('<%=self.task_id%>'))\"><%:Click here to check running task%></a></div>\n<% end %>\n\n<%+cbi/map%>\n<%\nlocal task_running = false\nlocal taskd = require \"luci.model.tasks\"\nlocal status = taskd.status(self.task_id)\ntask_running = status.running\n-%>\n<div class=\"cbi-page-actions control-group\">\n<%\nif not task_running then\n%>\n    <%\n    local util  = require \"luci.util\"\n    local container_status = util.trim(util.exec(self.script_path..\" status\"))\n    local container_install = (string.len(container_status) > 0)\n    local container_running = container_status == \"running\"\n    if container_install then\n    -%>\n    <input class=\"btn cbi-button cbi-button-apply\" type=\"button\" value=\"<%:Upgrade%>/<%:Apply%>\" onclick=\"cbi_submit(this, 'cbi.apply', 'upgrade')\" />\n    <%\n        if container_running then\n    -%>\n    <input class=\"btn cbi-button cbi-button-remove\" type=\"button\" value=\"<%:Stop%>\" onclick=\"cbi_submit(this, 'cbi.apply', 'stop')\" />\n\n    <input class=\"btn cbi-button cbi-button-reload\" type=\"button\" value=\"<%:Restart%>\" onclick=\"cbi_submit(this, 'cbi.apply', 'restart')\" />\n        <% else %>\n    <input class=\"btn cbi-button cbi-button-apply\" type=\"button\" value=\"<%:Start%>\" onclick=\"cbi_submit(this, 'cbi.apply', 'start')\" />\n\n    <input class=\"btn cbi-button cbi-button-remove\" type=\"button\" value=\"<%:Remove%>\" onclick=\"cbi_submit(this, 'cbi.apply', 'rm')\" />\n        <% end\n      else %>\n    <input class=\"btn cbi-button cbi-button-apply\" type=\"button\" value=\"<%:Install%>\" onclick=\"cbi_submit(this, 'cbi.apply', 'install')\" />\n    <% end\nelse\n    %>\n    <input class=\"btn cbi-button cbi-button-apply\" type=\"button\" value=\"<%:Task Running%>&hellip;\" onclick=\"taskd.show_log('<%=self.task_id%>')\" />\n<%\nend\n%>\n</div>\n\n<%+tasks/embed%>\n<%\nif self.auto_show_task and task_running then\n-%>\n<script>\n    taskd.show_log(\"<%=self.task_id%>\");\n</script>\n<%\nend\n%>\n"
  },
  {
    "path": "luci-app-store/luci/luci-lib-taskd/luasrc/view/tasks/embed.htm",
    "content": "<%+xterm/embed%>\n<link rel=\"stylesheet\" href=\"<%=resource%>/tasks/tasks.css<%# ?v=PKG_VERSION %>\">\n<script src=\"<%=resource%>/tasks/tasks.js<%# ?v=PKG_VERSION %>\"></script>\n<%\n    local i18n = {}\n    local function tr(str)\n        i18n[str]=translate(str)\n    end\n    tr(\"Stop running task?\")\n    tr(\"Stopped at:\")\n    tr(\"Finished at:\")\n    tr(\"Failed at:\")\n    tr(\"Lost login status\")\n    tr(\"Fetch log failed, retrying...\")\n    tr(\"Task does not exist or has been deleted\")\n-%>\n<script>\n    window.taskd.csrfToken=\"<%=token%>\";\n    window.taskd.i18n=<% luci.http.write_json(i18n) %>;\n    window.taskd.dialog_template=`\n    <div id=\"tasks_dialog\">\n        <div class=\"dialog-title-bar\">\n            <span class=\"dialog-title\" id=\"tasks_id\"></span>\n            <span class=\"dialog-icons\">\n                <span class=\"dialog-icon dialog-icon-close\" title=\"<%:Stop and Remove%>\"></span>\n                <span class=\"dialog-icon dialog-icon-min\" title=\"<%:Hide%>\"></span>\n            </span>\n        </div>\n        <div class=\"dialog-content\">\n            <div id=\"tasks_xterm_log\"></div>\n            <div id=\"tasks_result_mask\">\n                <span class=\"tasks_result_success\"><%:Task execution successful !%></span>\n                <span class=\"tasks_result_failed\"><%:Task execution failed !%></span>\n                <br/>\n                <span><%:Click the button in the upper right corner of the dialog box to close it, or click here to view the log%></span>\n            </div>\n        </div>\n    </div>\n    `;\n</script>\n"
  },
  {
    "path": "luci-app-store/luci/luci-lib-taskd/src/Makefile",
    "content": "clean:\ncompile:\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_NAME:=luci-lib-dummy\nINCLUDE_DIR:=./dummy\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\ninstall:\n\tmkdir -p \"$(DESTDIR)$(LUCI_LIBRARYDIR)/i18n\"\n\t$(foreach lang,$(LUCI_LANGUAGES),$(foreach po,$(wildcard ${CURDIR}/po/$(lang)/*.po), \\\n\tpo2lmo $(po) \\\n\t\t$(DESTDIR)$(LUCI_LIBRARYDIR)/i18n/$(basename $(notdir $(po))).$(lang).lmo;))\n"
  },
  {
    "path": "luci-app-store/luci/luci-lib-taskd/src/dummy/package.mk",
    "content": "define BuildPackage\nendef"
  },
  {
    "path": "luci-app-store/luci/luci-lib-taskd/src/po/zh_Hans/lib-tasks.po",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\nmsgid \"Stop running task?\"\nmsgstr \"删除运行中的任务？\"\n\nmsgid \"Finished at:\"\nmsgstr \"完成于：\"\n\nmsgid \"Failed at:\"\nmsgstr \"失败于：\"\n\nmsgid \"Lost login status\"\nmsgstr \"丢失登陆状态\"\n\nmsgid \"Fetch log failed, retrying...\"\nmsgstr \"拉取日志失败，正在重试...\"\n\nmsgid \"Task does not exist or has been deleted\"\nmsgstr \"任务不存在或已删除\"\n\nmsgid \"Stop and Remove\"\nmsgstr \"停止并删除\"\n\nmsgid \"Hide\"\nmsgstr \"隐藏\"\n\nmsgid \"Config saved, but apply failed\"\nmsgstr \"配置已保存，但应用失败\"\n\nmsgid \"Unknown command: \"\nmsgstr \"未知命令：\"\n\nmsgid \"Another task running, try again later.\"\nmsgstr \"已有后台任务运行中，请稍后重试。\"\n\nmsgid \"Click here to check running task\"\nmsgstr \"点此查看运行中的任务\"\n\nmsgid \"Task Running\"\nmsgstr \"任务执行中\"\n\nmsgid \"Task execution successful !\"\nmsgstr \"任务执行成功！\"\n\nmsgid \"Task execution failed !\"\nmsgstr \"任务执行失败！\"\n\nmsgid \"Click the button in the upper right corner of the dialog box to close it, or click here to view the log\"\nmsgstr \"点击对话框右上角按钮关闭，或者点此查看日志\"\n"
  },
  {
    "path": "luci-app-store/luci/luci-lib-xterm/Makefile",
    "content": "#\n# Copyright (c) 2017-2019, The xterm.js authors (MIT License)\n# Copyright (c) 2014-2017, SourceLair, Private Company (www.sourcelair.com) (MIT License)\n# Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n#\n# This is free software, licensed under the MIT License.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=Xterm.js library\nLUCI_DEPENDS:=\n\nPKG_LICENSE:=MIT\nPKG_VERSION:=4.18.0\nPKG_RELEASE:=\nPKG_MAINTAINER:=jjm2473 <jjm2473@gmail.com>\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-store/luci/luci-lib-xterm/htdocs/luci-static/resources/xterm/xterm.css",
    "content": "/**\n * Copyright (c) 2014 The xterm.js authors. All rights reserved.\n * Copyright (c) 2012-2013, Christopher Jeffrey (MIT License)\n * https://github.com/chjj/term.js\n * @license MIT\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n * THE SOFTWARE.\n *\n * Originally forked from (with the author's permission):\n *   Fabrice Bellard's javascript vt100 for jslinux:\n *   http://bellard.org/jslinux/\n *   Copyright (c) 2011 Fabrice Bellard\n *   The original design remains. The terminal itself\n *   has been extended to include xterm CSI codes, among\n *   other features.\n */\n\n/**\n *  Default styles for xterm.js\n */\n\n.xterm {\n    position: relative;\n    user-select: none;\n    -ms-user-select: none;\n    -webkit-user-select: none;\n}\n\n.xterm.focus,\n.xterm:focus {\n    outline: none;\n}\n\n.xterm .xterm-helpers {\n    position: absolute;\n    top: 0;\n    /**\n     * The z-index of the helpers must be higher than the canvases in order for\n     * IMEs to appear on top.\n     */\n    z-index: 5;\n}\n\n.xterm .xterm-helper-textarea {\n    padding: 0;\n    border: 0;\n    margin: 0;\n    /* Move textarea out of the screen to the far left, so that the cursor is not visible */\n    position: absolute;\n    opacity: 0;\n    left: -9999em;\n    top: 0;\n    width: 0;\n    height: 0;\n    z-index: -5;\n    /** Prevent wrapping so the IME appears against the textarea at the correct position */\n    white-space: nowrap;\n    overflow: hidden;\n    resize: none;\n}\n\n.xterm .composition-view {\n    /* TODO: Composition position got messed up somewhere */\n    background: #000;\n    color: #FFF;\n    display: none;\n    position: absolute;\n    white-space: nowrap;\n    z-index: 1;\n}\n\n.xterm .composition-view.active {\n    display: block;\n}\n\n.xterm .xterm-viewport {\n    /* On OS X this is required in order for the scroll bar to appear fully opaque */\n    background-color: #000;\n    overflow-y: scroll;\n    cursor: default;\n    position: absolute;\n    right: 0;\n    left: 0;\n    top: 0;\n    bottom: 0;\n}\n\n.xterm .xterm-screen {\n    position: relative;\n}\n\n.xterm .xterm-screen canvas {\n    position: absolute;\n    left: 0;\n    top: 0;\n}\n\n.xterm .xterm-scroll-area {\n    visibility: hidden;\n}\n\n.xterm-char-measure-element {\n    display: inline-block;\n    visibility: hidden;\n    position: absolute;\n    top: 0;\n    left: -9999em;\n    line-height: normal;\n}\n\n.xterm {\n    cursor: text;\n}\n\n.xterm.enable-mouse-events {\n    /* When mouse events are enabled (eg. tmux), revert to the standard pointer cursor */\n    cursor: default;\n}\n\n.xterm.xterm-cursor-pointer,\n.xterm .xterm-cursor-pointer {\n    cursor: pointer;\n}\n\n.xterm.column-select.focus {\n    /* Column selection mode */\n    cursor: crosshair;\n}\n\n.xterm .xterm-accessibility,\n.xterm .xterm-message {\n    position: absolute;\n    left: 0;\n    top: 0;\n    bottom: 0;\n    right: 0;\n    z-index: 10;\n    color: transparent;\n}\n\n.xterm .live-region {\n    position: absolute;\n    left: -9999px;\n    width: 1px;\n    height: 1px;\n    overflow: hidden;\n}\n\n.xterm-dim {\n    opacity: 0.5;\n}\n\n.xterm-underline {\n    text-decoration: underline;\n}\n\n.xterm-strikethrough {\n    text-decoration: line-through;\n}\n\n.xterm-screen .xterm-decoration-container .xterm-decoration {\n\tz-index: 6;\n\tposition: absolute;\n}\n"
  },
  {
    "path": "luci-app-store/luci/luci-lib-xterm/htdocs/luci-static/resources/xterm/xterm.js",
    "content": "!function(e,t){if(\"object\"==typeof exports&&\"object\"==typeof module)module.exports=t();else if(\"function\"==typeof define&&define.amd)define([],t);else{var r=t();for(var i in r)(\"object\"==typeof exports?exports:e)[i]=r[i]}}(self,(function(){return(()=>{\"use strict\";var e={4567:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,\"__esModule\",{value:!0}),t.AccessibilityManager=void 0;var o=r(9042),s=r(6114),a=r(9924),c=r(3656),l=r(844),h=r(5596),u=r(9631),f=function(e){function t(t,r){var i=e.call(this)||this;i._terminal=t,i._renderService=r,i._liveRegionLineCount=0,i._charsToConsume=[],i._charsToAnnounce=\"\",i._accessibilityTreeRoot=document.createElement(\"div\"),i._accessibilityTreeRoot.classList.add(\"xterm-accessibility\"),i._accessibilityTreeRoot.tabIndex=0,i._rowContainer=document.createElement(\"div\"),i._rowContainer.setAttribute(\"role\",\"list\"),i._rowContainer.classList.add(\"xterm-accessibility-tree\"),i._rowElements=[];for(var n=0;n<i._terminal.rows;n++)i._rowElements[n]=i._createAccessibilityTreeNode(),i._rowContainer.appendChild(i._rowElements[n]);if(i._topBoundaryFocusListener=function(e){return i._onBoundaryFocus(e,0)},i._bottomBoundaryFocusListener=function(e){return i._onBoundaryFocus(e,1)},i._rowElements[0].addEventListener(\"focus\",i._topBoundaryFocusListener),i._rowElements[i._rowElements.length-1].addEventListener(\"focus\",i._bottomBoundaryFocusListener),i._refreshRowsDimensions(),i._accessibilityTreeRoot.appendChild(i._rowContainer),i._renderRowsDebouncer=new a.TimeBasedDebouncer(i._renderRows.bind(i)),i._refreshRows(),i._liveRegion=document.createElement(\"div\"),i._liveRegion.classList.add(\"live-region\"),i._liveRegion.setAttribute(\"aria-live\",\"assertive\"),i._accessibilityTreeRoot.appendChild(i._liveRegion),!i._terminal.element)throw new Error(\"Cannot enable accessibility before Terminal.open\");return i._terminal.element.insertAdjacentElement(\"afterbegin\",i._accessibilityTreeRoot),i.register(i._renderRowsDebouncer),i.register(i._terminal.onResize((function(e){return i._onResize(e.rows)}))),i.register(i._terminal.onRender((function(e){return i._refreshRows(e.start,e.end)}))),i.register(i._terminal.onScroll((function(){return i._refreshRows()}))),i.register(i._terminal.onA11yChar((function(e){return i._onChar(e)}))),i.register(i._terminal.onLineFeed((function(){return i._onChar(\"\\n\")}))),i.register(i._terminal.onA11yTab((function(e){return i._onTab(e)}))),i.register(i._terminal.onKey((function(e){return i._onKey(e.key)}))),i.register(i._terminal.onBlur((function(){return i._clearLiveRegion()}))),i.register(i._renderService.onDimensionsChange((function(){return i._refreshRowsDimensions()}))),i._screenDprMonitor=new h.ScreenDprMonitor,i.register(i._screenDprMonitor),i._screenDprMonitor.setListener((function(){return i._refreshRowsDimensions()})),i.register((0,c.addDisposableDomListener)(window,\"resize\",(function(){return i._refreshRowsDimensions()}))),i}return n(t,e),t.prototype.dispose=function(){e.prototype.dispose.call(this),(0,u.removeElementFromParent)(this._accessibilityTreeRoot),this._rowElements.length=0},t.prototype._onBoundaryFocus=function(e,t){var r=e.target,i=this._rowElements[0===t?1:this._rowElements.length-2];if(r.getAttribute(\"aria-posinset\")!==(0===t?\"1\":\"\"+this._terminal.buffer.lines.length)&&e.relatedTarget===i){var n,o;if(0===t?(n=r,o=this._rowElements.pop(),this._rowContainer.removeChild(o)):(n=this._rowElements.shift(),o=r,this._rowContainer.removeChild(n)),n.removeEventListener(\"focus\",this._topBoundaryFocusListener),o.removeEventListener(\"focus\",this._bottomBoundaryFocusListener),0===t){var s=this._createAccessibilityTreeNode();this._rowElements.unshift(s),this._rowContainer.insertAdjacentElement(\"afterbegin\",s)}else s=this._createAccessibilityTreeNode(),this._rowElements.push(s),this._rowContainer.appendChild(s);this._rowElements[0].addEventListener(\"focus\",this._topBoundaryFocusListener),this._rowElements[this._rowElements.length-1].addEventListener(\"focus\",this._bottomBoundaryFocusListener),this._terminal.scrollLines(0===t?-1:1),this._rowElements[0===t?1:this._rowElements.length-2].focus(),e.preventDefault(),e.stopImmediatePropagation()}},t.prototype._onResize=function(e){this._rowElements[this._rowElements.length-1].removeEventListener(\"focus\",this._bottomBoundaryFocusListener);for(var t=this._rowContainer.children.length;t<this._terminal.rows;t++)this._rowElements[t]=this._createAccessibilityTreeNode(),this._rowContainer.appendChild(this._rowElements[t]);for(;this._rowElements.length>e;)this._rowContainer.removeChild(this._rowElements.pop());this._rowElements[this._rowElements.length-1].addEventListener(\"focus\",this._bottomBoundaryFocusListener),this._refreshRowsDimensions()},t.prototype._createAccessibilityTreeNode=function(){var e=document.createElement(\"div\");return e.setAttribute(\"role\",\"listitem\"),e.tabIndex=-1,this._refreshRowDimensions(e),e},t.prototype._onTab=function(e){for(var t=0;t<e;t++)this._onChar(\" \")},t.prototype._onChar=function(e){var t=this;this._liveRegionLineCount<21&&(this._charsToConsume.length>0?this._charsToConsume.shift()!==e&&(this._charsToAnnounce+=e):this._charsToAnnounce+=e,\"\\n\"===e&&(this._liveRegionLineCount++,21===this._liveRegionLineCount&&(this._liveRegion.textContent+=o.tooMuchOutput)),s.isMac&&this._liveRegion.textContent&&this._liveRegion.textContent.length>0&&!this._liveRegion.parentNode&&setTimeout((function(){t._accessibilityTreeRoot.appendChild(t._liveRegion)}),0))},t.prototype._clearLiveRegion=function(){this._liveRegion.textContent=\"\",this._liveRegionLineCount=0,s.isMac&&(0,u.removeElementFromParent)(this._liveRegion)},t.prototype._onKey=function(e){this._clearLiveRegion(),this._charsToConsume.push(e)},t.prototype._refreshRows=function(e,t){this._renderRowsDebouncer.refresh(e,t,this._terminal.rows)},t.prototype._renderRows=function(e,t){for(var r=this._terminal.buffer,i=r.lines.length.toString(),n=e;n<=t;n++){var o=r.translateBufferLineToString(r.ydisp+n,!0),s=(r.ydisp+n+1).toString(),a=this._rowElements[n];a&&(0===o.length?a.innerText=\" \":a.textContent=o,a.setAttribute(\"aria-posinset\",s),a.setAttribute(\"aria-setsize\",i))}this._announceCharacters()},t.prototype._refreshRowsDimensions=function(){if(this._renderService.dimensions.actualCellHeight){this._rowElements.length!==this._terminal.rows&&this._onResize(this._terminal.rows);for(var e=0;e<this._terminal.rows;e++)this._refreshRowDimensions(this._rowElements[e])}},t.prototype._refreshRowDimensions=function(e){e.style.height=this._renderService.dimensions.actualCellHeight+\"px\"},t.prototype._announceCharacters=function(){0!==this._charsToAnnounce.length&&(this._liveRegion.textContent+=this._charsToAnnounce,this._charsToAnnounce=\"\")},t}(l.Disposable);t.AccessibilityManager=f},3614:(e,t)=>{function r(e){return e.replace(/\\r?\\n/g,\"\\r\")}function i(e,t){return t?\"\u001b[200~\"+e+\"\u001b[201~\":e}function n(e,t,n){e=i(e=r(e),n.decPrivateModes.bracketedPasteMode),n.triggerDataEvent(e,!0),t.value=\"\"}function o(e,t,r){var i=r.getBoundingClientRect(),n=e.clientX-i.left-10,o=e.clientY-i.top-10;t.style.width=\"20px\",t.style.height=\"20px\",t.style.left=n+\"px\",t.style.top=o+\"px\",t.style.zIndex=\"1000\",t.focus()}Object.defineProperty(t,\"__esModule\",{value:!0}),t.rightClickHandler=t.moveTextAreaUnderMouseCursor=t.paste=t.handlePasteEvent=t.copyHandler=t.bracketTextForPaste=t.prepareTextForTerminal=void 0,t.prepareTextForTerminal=r,t.bracketTextForPaste=i,t.copyHandler=function(e,t){e.clipboardData&&e.clipboardData.setData(\"text/plain\",t.selectionText),e.preventDefault()},t.handlePasteEvent=function(e,t,r){e.stopPropagation(),e.clipboardData&&n(e.clipboardData.getData(\"text/plain\"),t,r)},t.paste=n,t.moveTextAreaUnderMouseCursor=o,t.rightClickHandler=function(e,t,r,i,n){o(e,t,r),n&&i.rightClickSelect(e),t.value=i.selectionText,t.select()}},4774:(e,t)=>{var r,i,n,o;function s(e){var t=e.toString(16);return t.length<2?\"0\"+t:t}function a(e,t){return e<t?(t+.05)/(e+.05):(e+.05)/(t+.05)}Object.defineProperty(t,\"__esModule\",{value:!0}),t.contrastRatio=t.toPaddedHex=t.rgba=t.rgb=t.css=t.color=t.channels=void 0,function(e){e.toCss=function(e,t,r,i){return void 0!==i?\"#\"+s(e)+s(t)+s(r)+s(i):\"#\"+s(e)+s(t)+s(r)},e.toRgba=function(e,t,r,i){return void 0===i&&(i=255),(e<<24|t<<16|r<<8|i)>>>0}}(r=t.channels||(t.channels={})),(i=t.color||(t.color={})).blend=function(e,t){var i=(255&t.rgba)/255;if(1===i)return{css:t.css,rgba:t.rgba};var n=t.rgba>>24&255,o=t.rgba>>16&255,s=t.rgba>>8&255,a=e.rgba>>24&255,c=e.rgba>>16&255,l=e.rgba>>8&255,h=a+Math.round((n-a)*i),u=c+Math.round((o-c)*i),f=l+Math.round((s-l)*i);return{css:r.toCss(h,u,f),rgba:r.toRgba(h,u,f)}},i.isOpaque=function(e){return 255==(255&e.rgba)},i.ensureContrastRatio=function(e,t,r){var i=o.ensureContrastRatio(e.rgba,t.rgba,r);if(i)return o.toColor(i>>24&255,i>>16&255,i>>8&255)},i.opaque=function(e){var t=(255|e.rgba)>>>0,i=o.toChannels(t),n=i[0],s=i[1],a=i[2];return{css:r.toCss(n,s,a),rgba:t}},i.opacity=function(e,t){var i=Math.round(255*t),n=o.toChannels(e.rgba),s=n[0],a=n[1],c=n[2];return{css:r.toCss(s,a,c,i),rgba:r.toRgba(s,a,c,i)}},i.toColorRGB=function(e){return[e.rgba>>24&255,e.rgba>>16&255,e.rgba>>8&255]},(t.css||(t.css={})).toColor=function(e){switch(e.length){case 7:return{css:e,rgba:(parseInt(e.slice(1),16)<<8|255)>>>0};case 9:return{css:e,rgba:parseInt(e.slice(1),16)>>>0}}throw new Error(\"css.toColor: Unsupported css format\")},function(e){function t(e,t,r){var i=e/255,n=t/255,o=r/255;return.2126*(i<=.03928?i/12.92:Math.pow((i+.055)/1.055,2.4))+.7152*(n<=.03928?n/12.92:Math.pow((n+.055)/1.055,2.4))+.0722*(o<=.03928?o/12.92:Math.pow((o+.055)/1.055,2.4))}e.relativeLuminance=function(e){return t(e>>16&255,e>>8&255,255&e)},e.relativeLuminance2=t}(n=t.rgb||(t.rgb={})),function(e){function t(e,t,r){for(var i=e>>24&255,o=e>>16&255,s=e>>8&255,c=t>>24&255,l=t>>16&255,h=t>>8&255,u=a(n.relativeLuminance2(c,h,l),n.relativeLuminance2(i,o,s));u<r&&(c>0||l>0||h>0);)c-=Math.max(0,Math.ceil(.1*c)),l-=Math.max(0,Math.ceil(.1*l)),h-=Math.max(0,Math.ceil(.1*h)),u=a(n.relativeLuminance2(c,h,l),n.relativeLuminance2(i,o,s));return(c<<24|l<<16|h<<8|255)>>>0}function i(e,t,r){for(var i=e>>24&255,o=e>>16&255,s=e>>8&255,c=t>>24&255,l=t>>16&255,h=t>>8&255,u=a(n.relativeLuminance2(c,h,l),n.relativeLuminance2(i,o,s));u<r&&(c<255||l<255||h<255);)c=Math.min(255,c+Math.ceil(.1*(255-c))),l=Math.min(255,l+Math.ceil(.1*(255-l))),h=Math.min(255,h+Math.ceil(.1*(255-h))),u=a(n.relativeLuminance2(c,h,l),n.relativeLuminance2(i,o,s));return(c<<24|l<<16|h<<8|255)>>>0}e.ensureContrastRatio=function(e,r,o){var s=n.relativeLuminance(e>>8),c=n.relativeLuminance(r>>8);if(a(s,c)<o)return c<s?t(e,r,o):i(e,r,o)},e.reduceLuminance=t,e.increaseLuminance=i,e.toChannels=function(e){return[e>>24&255,e>>16&255,e>>8&255,255&e]},e.toColor=function(e,t,i){return{css:r.toCss(e,t,i),rgba:r.toRgba(e,t,i)}}}(o=t.rgba||(t.rgba={})),t.toPaddedHex=s,t.contrastRatio=a},7239:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.ColorContrastCache=void 0;var r=function(){function e(){this._color={},this._rgba={}}return e.prototype.clear=function(){this._color={},this._rgba={}},e.prototype.setCss=function(e,t,r){this._rgba[e]||(this._rgba[e]={}),this._rgba[e][t]=r},e.prototype.getCss=function(e,t){return this._rgba[e]?this._rgba[e][t]:void 0},e.prototype.setColor=function(e,t,r){this._color[e]||(this._color[e]={}),this._color[e][t]=r},e.prototype.getColor=function(e,t){return this._color[e]?this._color[e][t]:void 0},e}();t.ColorContrastCache=r},5680:function(e,t,r){var i=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var i,n=0,o=t.length;n<o;n++)!i&&n in t||(i||(i=Array.prototype.slice.call(t,0,n)),i[n]=t[n]);return e.concat(i||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.ColorManager=t.DEFAULT_ANSI_COLORS=void 0;var n=r(4774),o=r(7239),s=n.css.toColor(\"#ffffff\"),a=n.css.toColor(\"#000000\"),c=n.css.toColor(\"#ffffff\"),l=n.css.toColor(\"#000000\"),h={css:\"rgba(255, 255, 255, 0.3)\",rgba:4294967117};t.DEFAULT_ANSI_COLORS=Object.freeze(function(){for(var e=[n.css.toColor(\"#2e3436\"),n.css.toColor(\"#cc0000\"),n.css.toColor(\"#4e9a06\"),n.css.toColor(\"#c4a000\"),n.css.toColor(\"#3465a4\"),n.css.toColor(\"#75507b\"),n.css.toColor(\"#06989a\"),n.css.toColor(\"#d3d7cf\"),n.css.toColor(\"#555753\"),n.css.toColor(\"#ef2929\"),n.css.toColor(\"#8ae234\"),n.css.toColor(\"#fce94f\"),n.css.toColor(\"#729fcf\"),n.css.toColor(\"#ad7fa8\"),n.css.toColor(\"#34e2e2\"),n.css.toColor(\"#eeeeec\")],t=[0,95,135,175,215,255],r=0;r<216;r++){var i=t[r/36%6|0],o=t[r/6%6|0],s=t[r%6];e.push({css:n.channels.toCss(i,o,s),rgba:n.channels.toRgba(i,o,s)})}for(r=0;r<24;r++){var a=8+10*r;e.push({css:n.channels.toCss(a,a,a),rgba:n.channels.toRgba(a,a,a)})}return e}());var u=function(){function e(e,r){this.allowTransparency=r;var i=e.createElement(\"canvas\");i.width=1,i.height=1;var u=i.getContext(\"2d\");if(!u)throw new Error(\"Could not get rendering context\");this._ctx=u,this._ctx.globalCompositeOperation=\"copy\",this._litmusColor=this._ctx.createLinearGradient(0,0,1,1),this._contrastCache=new o.ColorContrastCache,this.colors={foreground:s,background:a,cursor:c,cursorAccent:l,selectionTransparent:h,selectionOpaque:n.color.blend(a,h),ansi:t.DEFAULT_ANSI_COLORS.slice(),contrastCache:this._contrastCache},this._updateRestoreColors()}return e.prototype.onOptionsChange=function(e){\"minimumContrastRatio\"===e&&this._contrastCache.clear()},e.prototype.setTheme=function(e){void 0===e&&(e={}),this.colors.foreground=this._parseColor(e.foreground,s),this.colors.background=this._parseColor(e.background,a),this.colors.cursor=this._parseColor(e.cursor,c,!0),this.colors.cursorAccent=this._parseColor(e.cursorAccent,l,!0),this.colors.selectionTransparent=this._parseColor(e.selection,h,!0),this.colors.selectionOpaque=n.color.blend(this.colors.background,this.colors.selectionTransparent),n.color.isOpaque(this.colors.selectionTransparent)&&(this.colors.selectionTransparent=n.color.opacity(this.colors.selectionTransparent,.3)),this.colors.ansi[0]=this._parseColor(e.black,t.DEFAULT_ANSI_COLORS[0]),this.colors.ansi[1]=this._parseColor(e.red,t.DEFAULT_ANSI_COLORS[1]),this.colors.ansi[2]=this._parseColor(e.green,t.DEFAULT_ANSI_COLORS[2]),this.colors.ansi[3]=this._parseColor(e.yellow,t.DEFAULT_ANSI_COLORS[3]),this.colors.ansi[4]=this._parseColor(e.blue,t.DEFAULT_ANSI_COLORS[4]),this.colors.ansi[5]=this._parseColor(e.magenta,t.DEFAULT_ANSI_COLORS[5]),this.colors.ansi[6]=this._parseColor(e.cyan,t.DEFAULT_ANSI_COLORS[6]),this.colors.ansi[7]=this._parseColor(e.white,t.DEFAULT_ANSI_COLORS[7]),this.colors.ansi[8]=this._parseColor(e.brightBlack,t.DEFAULT_ANSI_COLORS[8]),this.colors.ansi[9]=this._parseColor(e.brightRed,t.DEFAULT_ANSI_COLORS[9]),this.colors.ansi[10]=this._parseColor(e.brightGreen,t.DEFAULT_ANSI_COLORS[10]),this.colors.ansi[11]=this._parseColor(e.brightYellow,t.DEFAULT_ANSI_COLORS[11]),this.colors.ansi[12]=this._parseColor(e.brightBlue,t.DEFAULT_ANSI_COLORS[12]),this.colors.ansi[13]=this._parseColor(e.brightMagenta,t.DEFAULT_ANSI_COLORS[13]),this.colors.ansi[14]=this._parseColor(e.brightCyan,t.DEFAULT_ANSI_COLORS[14]),this.colors.ansi[15]=this._parseColor(e.brightWhite,t.DEFAULT_ANSI_COLORS[15]),this._contrastCache.clear(),this._updateRestoreColors()},e.prototype.restoreColor=function(e){if(void 0!==e)switch(e){case 256:this.colors.foreground=this._restoreColors.foreground;break;case 257:this.colors.background=this._restoreColors.background;break;case 258:this.colors.cursor=this._restoreColors.cursor;break;default:this.colors.ansi[e]=this._restoreColors.ansi[e]}else for(var t=0;t<this._restoreColors.ansi.length;++t)this.colors.ansi[t]=this._restoreColors.ansi[t]},e.prototype._updateRestoreColors=function(){this._restoreColors={foreground:this.colors.foreground,background:this.colors.background,cursor:this.colors.cursor,ansi:i([],this.colors.ansi,!0)}},e.prototype._parseColor=function(e,t,r){if(void 0===r&&(r=this.allowTransparency),void 0===e)return t;if(this._ctx.fillStyle=this._litmusColor,this._ctx.fillStyle=e,\"string\"!=typeof this._ctx.fillStyle)return console.warn(\"Color: \"+e+\" is invalid using fallback \"+t.css),t;this._ctx.fillRect(0,0,1,1);var i=this._ctx.getImageData(0,0,1,1).data;if(255!==i[3]){if(!r)return console.warn(\"Color: \"+e+\" is using transparency, but allowTransparency is false. Using fallback \"+t.css+\".\"),t;var o=this._ctx.fillStyle.substring(5,this._ctx.fillStyle.length-1).split(\",\").map((function(e){return Number(e)})),s=o[0],a=o[1],c=o[2],l=o[3],h=Math.round(255*l);return{rgba:n.channels.toRgba(s,a,c,h),css:e}}return{css:this._ctx.fillStyle,rgba:n.channels.toRgba(i[0],i[1],i[2],i[3])}},e}();t.ColorManager=u},9631:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.removeElementFromParent=void 0,t.removeElementFromParent=function(){for(var e,t=[],r=0;r<arguments.length;r++)t[r]=arguments[r];for(var i=0,n=t;i<n.length;i++){var o=n[i];null===(e=null==o?void 0:o.parentElement)||void 0===e||e.removeChild(o)}}},3656:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.addDisposableDomListener=void 0,t.addDisposableDomListener=function(e,t,r,i){e.addEventListener(t,r,i);var n=!1;return{dispose:function(){n||(n=!0,e.removeEventListener(t,r,i))}}}},3551:function(e,t,r){var i=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},n=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.MouseZone=t.Linkifier=void 0;var o=r(8460),s=r(2585),a=function(){function e(e,t,r){this._bufferService=e,this._logService=t,this._unicodeService=r,this._linkMatchers=[],this._nextLinkMatcherId=0,this._onShowLinkUnderline=new o.EventEmitter,this._onHideLinkUnderline=new o.EventEmitter,this._onLinkTooltip=new o.EventEmitter,this._rowsToLinkify={start:void 0,end:void 0}}return Object.defineProperty(e.prototype,\"onShowLinkUnderline\",{get:function(){return this._onShowLinkUnderline.event},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"onHideLinkUnderline\",{get:function(){return this._onHideLinkUnderline.event},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"onLinkTooltip\",{get:function(){return this._onLinkTooltip.event},enumerable:!1,configurable:!0}),e.prototype.attachToDom=function(e,t){this._element=e,this._mouseZoneManager=t},e.prototype.linkifyRows=function(t,r){var i=this;this._mouseZoneManager&&(void 0===this._rowsToLinkify.start||void 0===this._rowsToLinkify.end?(this._rowsToLinkify.start=t,this._rowsToLinkify.end=r):(this._rowsToLinkify.start=Math.min(this._rowsToLinkify.start,t),this._rowsToLinkify.end=Math.max(this._rowsToLinkify.end,r)),this._mouseZoneManager.clearAll(t,r),this._rowsTimeoutId&&clearTimeout(this._rowsTimeoutId),this._rowsTimeoutId=setTimeout((function(){return i._linkifyRows()}),e._timeBeforeLatency))},e.prototype._linkifyRows=function(){this._rowsTimeoutId=void 0;var e=this._bufferService.buffer;if(void 0!==this._rowsToLinkify.start&&void 0!==this._rowsToLinkify.end){var t=e.ydisp+this._rowsToLinkify.start;if(!(t>=e.lines.length)){for(var r=e.ydisp+Math.min(this._rowsToLinkify.end,this._bufferService.rows)+1,i=Math.ceil(2e3/this._bufferService.cols),n=this._bufferService.buffer.iterator(!1,t,r,i,i);n.hasNext();)for(var o=n.next(),s=0;s<this._linkMatchers.length;s++)this._doLinkifyRow(o.range.first,o.content,this._linkMatchers[s]);this._rowsToLinkify.start=void 0,this._rowsToLinkify.end=void 0}}else this._logService.debug(\"_rowToLinkify was unset before _linkifyRows was called\")},e.prototype.registerLinkMatcher=function(e,t,r){if(void 0===r&&(r={}),!t)throw new Error(\"handler must be defined\");var i={id:this._nextLinkMatcherId++,regex:e,handler:t,matchIndex:r.matchIndex,validationCallback:r.validationCallback,hoverTooltipCallback:r.tooltipCallback,hoverLeaveCallback:r.leaveCallback,willLinkActivate:r.willLinkActivate,priority:r.priority||0};return this._addLinkMatcherToList(i),i.id},e.prototype._addLinkMatcherToList=function(e){if(0!==this._linkMatchers.length){for(var t=this._linkMatchers.length-1;t>=0;t--)if(e.priority<=this._linkMatchers[t].priority)return void this._linkMatchers.splice(t+1,0,e);this._linkMatchers.splice(0,0,e)}else this._linkMatchers.push(e)},e.prototype.deregisterLinkMatcher=function(e){for(var t=0;t<this._linkMatchers.length;t++)if(this._linkMatchers[t].id===e)return this._linkMatchers.splice(t,1),!0;return!1},e.prototype._doLinkifyRow=function(e,t,r){for(var i,n=this,o=new RegExp(r.regex.source,(r.regex.flags||\"\")+\"g\"),s=-1,a=function(){var a=i[\"number\"!=typeof r.matchIndex?0:r.matchIndex];if(!a)return c._logService.debug(\"match found without corresponding matchIndex\",i,r),\"break\";if(s=t.indexOf(a,s+1),o.lastIndex=s+a.length,s<0)return\"break\";var l=c._bufferService.buffer.stringIndexToBufferIndex(e,s);if(l[0]<0)return\"break\";var h=c._bufferService.buffer.lines.get(l[0]);if(!h)return\"break\";var u=h.getFg(l[1]),f=u?u>>9&511:void 0;r.validationCallback?r.validationCallback(a,(function(e){n._rowsTimeoutId||e&&n._addLink(l[1],l[0]-n._bufferService.buffer.ydisp,a,r,f)})):c._addLink(l[1],l[0]-c._bufferService.buffer.ydisp,a,r,f)},c=this;null!==(i=o.exec(t))&&\"break\"!==a(););},e.prototype._addLink=function(e,t,r,i,n){var o=this;if(this._mouseZoneManager&&this._element){var s=this._unicodeService.getStringCellWidth(r),a=e%this._bufferService.cols,l=t+Math.floor(e/this._bufferService.cols),h=(a+s)%this._bufferService.cols,u=l+Math.floor((a+s)/this._bufferService.cols);0===h&&(h=this._bufferService.cols,u--),this._mouseZoneManager.add(new c(a+1,l+1,h+1,u+1,(function(e){if(i.handler)return i.handler(e,r);var t=window.open();t?(t.opener=null,t.location.href=r):console.warn(\"Opening link blocked as opener could not be cleared\")}),(function(){o._onShowLinkUnderline.fire(o._createLinkHoverEvent(a,l,h,u,n)),o._element.classList.add(\"xterm-cursor-pointer\")}),(function(e){o._onLinkTooltip.fire(o._createLinkHoverEvent(a,l,h,u,n)),i.hoverTooltipCallback&&i.hoverTooltipCallback(e,r,{start:{x:a,y:l},end:{x:h,y:u}})}),(function(){o._onHideLinkUnderline.fire(o._createLinkHoverEvent(a,l,h,u,n)),o._element.classList.remove(\"xterm-cursor-pointer\"),i.hoverLeaveCallback&&i.hoverLeaveCallback()}),(function(e){return!i.willLinkActivate||i.willLinkActivate(e,r)})))}},e.prototype._createLinkHoverEvent=function(e,t,r,i,n){return{x1:e,y1:t,x2:r,y2:i,cols:this._bufferService.cols,fg:n}},e._timeBeforeLatency=200,e=i([n(0,s.IBufferService),n(1,s.ILogService),n(2,s.IUnicodeService)],e)}();t.Linkifier=a;var c=function(e,t,r,i,n,o,s,a,c){this.x1=e,this.y1=t,this.x2=r,this.y2=i,this.clickCallback=n,this.hoverCallback=o,this.tooltipCallback=s,this.leaveCallback=a,this.willLinkActivate=c};t.MouseZone=c},6465:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},s=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.Linkifier2=void 0;var a=r(2585),c=r(8460),l=r(844),h=r(3656),u=function(e){function t(t){var r=e.call(this)||this;return r._bufferService=t,r._linkProviders=[],r._linkCacheDisposables=[],r._isMouseOut=!0,r._activeLine=-1,r._onShowLinkUnderline=r.register(new c.EventEmitter),r._onHideLinkUnderline=r.register(new c.EventEmitter),r.register((0,l.getDisposeArrayDisposable)(r._linkCacheDisposables)),r}return n(t,e),Object.defineProperty(t.prototype,\"currentLink\",{get:function(){return this._currentLink},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onShowLinkUnderline\",{get:function(){return this._onShowLinkUnderline.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onHideLinkUnderline\",{get:function(){return this._onHideLinkUnderline.event},enumerable:!1,configurable:!0}),t.prototype.registerLinkProvider=function(e){var t=this;return this._linkProviders.push(e),{dispose:function(){var r=t._linkProviders.indexOf(e);-1!==r&&t._linkProviders.splice(r,1)}}},t.prototype.attachToDom=function(e,t,r){var i=this;this._element=e,this._mouseService=t,this._renderService=r,this.register((0,h.addDisposableDomListener)(this._element,\"mouseleave\",(function(){i._isMouseOut=!0,i._clearCurrentLink()}))),this.register((0,h.addDisposableDomListener)(this._element,\"mousemove\",this._onMouseMove.bind(this))),this.register((0,h.addDisposableDomListener)(this._element,\"click\",this._onClick.bind(this)))},t.prototype._onMouseMove=function(e){if(this._lastMouseEvent=e,this._element&&this._mouseService){var t=this._positionFromMouseEvent(e,this._element,this._mouseService);if(t){this._isMouseOut=!1;for(var r=e.composedPath(),i=0;i<r.length;i++){var n=r[i];if(n.classList.contains(\"xterm\"))break;if(n.classList.contains(\"xterm-hover\"))return}this._lastBufferCell&&t.x===this._lastBufferCell.x&&t.y===this._lastBufferCell.y||(this._onHover(t),this._lastBufferCell=t)}}},t.prototype._onHover=function(e){if(this._activeLine!==e.y)return this._clearCurrentLink(),void this._askForLink(e,!1);this._currentLink&&this._linkAtPosition(this._currentLink.link,e)||(this._clearCurrentLink(),this._askForLink(e,!0))},t.prototype._askForLink=function(e,t){var r,i=this;this._activeProviderReplies&&t||(null===(r=this._activeProviderReplies)||void 0===r||r.forEach((function(e){null==e||e.forEach((function(e){e.link.dispose&&e.link.dispose()}))})),this._activeProviderReplies=new Map,this._activeLine=e.y);var n=!1;this._linkProviders.forEach((function(r,o){var s;t?(null===(s=i._activeProviderReplies)||void 0===s?void 0:s.get(o))&&(n=i._checkLinkProviderResult(o,e,n)):r.provideLinks(e.y,(function(t){var r,s;if(!i._isMouseOut){var a=null==t?void 0:t.map((function(e){return{link:e}}));null===(r=i._activeProviderReplies)||void 0===r||r.set(o,a),n=i._checkLinkProviderResult(o,e,n),(null===(s=i._activeProviderReplies)||void 0===s?void 0:s.size)===i._linkProviders.length&&i._removeIntersectingLinks(e.y,i._activeProviderReplies)}}))}))},t.prototype._removeIntersectingLinks=function(e,t){for(var r=new Set,i=0;i<t.size;i++){var n=t.get(i);if(n)for(var o=0;o<n.length;o++)for(var s=n[o],a=s.link.range.start.y<e?0:s.link.range.start.x,c=s.link.range.end.y>e?this._bufferService.cols:s.link.range.end.x,l=a;l<=c;l++){if(r.has(l)){n.splice(o--,1);break}r.add(l)}}},t.prototype._checkLinkProviderResult=function(e,t,r){var i,n=this;if(!this._activeProviderReplies)return r;for(var o=this._activeProviderReplies.get(e),s=!1,a=0;a<e;a++)this._activeProviderReplies.has(a)&&!this._activeProviderReplies.get(a)||(s=!0);if(!s&&o){var c=o.find((function(e){return n._linkAtPosition(e.link,t)}));c&&(r=!0,this._handleNewLink(c))}if(this._activeProviderReplies.size===this._linkProviders.length&&!r)for(a=0;a<this._activeProviderReplies.size;a++){var l=null===(i=this._activeProviderReplies.get(a))||void 0===i?void 0:i.find((function(e){return n._linkAtPosition(e.link,t)}));if(l){r=!0,this._handleNewLink(l);break}}return r},t.prototype._onClick=function(e){if(this._element&&this._mouseService&&this._currentLink){var t=this._positionFromMouseEvent(e,this._element,this._mouseService);t&&this._linkAtPosition(this._currentLink.link,t)&&this._currentLink.link.activate(e,this._currentLink.link.text)}},t.prototype._clearCurrentLink=function(e,t){this._element&&this._currentLink&&this._lastMouseEvent&&(!e||!t||this._currentLink.link.range.start.y>=e&&this._currentLink.link.range.end.y<=t)&&(this._linkLeave(this._element,this._currentLink.link,this._lastMouseEvent),this._currentLink=void 0,(0,l.disposeArray)(this._linkCacheDisposables))},t.prototype._handleNewLink=function(e){var t=this;if(this._element&&this._lastMouseEvent&&this._mouseService){var r=this._positionFromMouseEvent(this._lastMouseEvent,this._element,this._mouseService);r&&this._linkAtPosition(e.link,r)&&(this._currentLink=e,this._currentLink.state={decorations:{underline:void 0===e.link.decorations||e.link.decorations.underline,pointerCursor:void 0===e.link.decorations||e.link.decorations.pointerCursor},isHovered:!0},this._linkHover(this._element,e.link,this._lastMouseEvent),e.link.decorations={},Object.defineProperties(e.link.decorations,{pointerCursor:{get:function(){var e,r;return null===(r=null===(e=t._currentLink)||void 0===e?void 0:e.state)||void 0===r?void 0:r.decorations.pointerCursor},set:function(e){var r,i;(null===(r=t._currentLink)||void 0===r?void 0:r.state)&&t._currentLink.state.decorations.pointerCursor!==e&&(t._currentLink.state.decorations.pointerCursor=e,t._currentLink.state.isHovered&&(null===(i=t._element)||void 0===i||i.classList.toggle(\"xterm-cursor-pointer\",e)))}},underline:{get:function(){var e,r;return null===(r=null===(e=t._currentLink)||void 0===e?void 0:e.state)||void 0===r?void 0:r.decorations.underline},set:function(r){var i,n,o;(null===(i=t._currentLink)||void 0===i?void 0:i.state)&&(null===(o=null===(n=t._currentLink)||void 0===n?void 0:n.state)||void 0===o?void 0:o.decorations.underline)!==r&&(t._currentLink.state.decorations.underline=r,t._currentLink.state.isHovered&&t._fireUnderlineEvent(e.link,r))}}}),this._renderService&&this._linkCacheDisposables.push(this._renderService.onRenderedBufferChange((function(e){var r=0===e.start?0:e.start+1+t._bufferService.buffer.ydisp;t._clearCurrentLink(r,e.end+1+t._bufferService.buffer.ydisp)}))))}},t.prototype._linkHover=function(e,t,r){var i;(null===(i=this._currentLink)||void 0===i?void 0:i.state)&&(this._currentLink.state.isHovered=!0,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(t,!0),this._currentLink.state.decorations.pointerCursor&&e.classList.add(\"xterm-cursor-pointer\")),t.hover&&t.hover(r,t.text)},t.prototype._fireUnderlineEvent=function(e,t){var r=e.range,i=this._bufferService.buffer.ydisp,n=this._createLinkUnderlineEvent(r.start.x-1,r.start.y-i-1,r.end.x,r.end.y-i-1,void 0);(t?this._onShowLinkUnderline:this._onHideLinkUnderline).fire(n)},t.prototype._linkLeave=function(e,t,r){var i;(null===(i=this._currentLink)||void 0===i?void 0:i.state)&&(this._currentLink.state.isHovered=!1,this._currentLink.state.decorations.underline&&this._fireUnderlineEvent(t,!1),this._currentLink.state.decorations.pointerCursor&&e.classList.remove(\"xterm-cursor-pointer\")),t.leave&&t.leave(r,t.text)},t.prototype._linkAtPosition=function(e,t){var r=e.range.start.y===e.range.end.y,i=e.range.start.y<t.y,n=e.range.end.y>t.y;return(r&&e.range.start.x<=t.x&&e.range.end.x>=t.x||i&&e.range.end.x>=t.x||n&&e.range.start.x<=t.x||i&&n)&&e.range.start.y<=t.y&&e.range.end.y>=t.y},t.prototype._positionFromMouseEvent=function(e,t,r){var i=r.getCoords(e,t,this._bufferService.cols,this._bufferService.rows);if(i)return{x:i[0],y:i[1]+this._bufferService.buffer.ydisp}},t.prototype._createLinkUnderlineEvent=function(e,t,r,i,n){return{x1:e,y1:t,x2:r,y2:i,cols:this._bufferService.cols,fg:n}},o([s(0,a.IBufferService)],t)}(l.Disposable);t.Linkifier2=u},9042:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.tooMuchOutput=t.promptLabel=void 0,t.promptLabel=\"Terminal input\",t.tooMuchOutput=\"Too much output to announce, navigate to rows manually to read\"},6954:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},s=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.MouseZoneManager=void 0;var a=r(844),c=r(3656),l=r(4725),h=r(2585),u=function(e){function t(t,r,i,n,o,s){var a=e.call(this)||this;return a._element=t,a._screenElement=r,a._bufferService=i,a._mouseService=n,a._selectionService=o,a._optionsService=s,a._zones=[],a._areZonesActive=!1,a._lastHoverCoords=[void 0,void 0],a._initialSelectionLength=0,a.register((0,c.addDisposableDomListener)(a._element,\"mousedown\",(function(e){return a._onMouseDown(e)}))),a._mouseMoveListener=function(e){return a._onMouseMove(e)},a._mouseLeaveListener=function(e){return a._onMouseLeave(e)},a._clickListener=function(e){return a._onClick(e)},a}return n(t,e),t.prototype.dispose=function(){e.prototype.dispose.call(this),this._deactivate()},t.prototype.add=function(e){this._zones.push(e),1===this._zones.length&&this._activate()},t.prototype.clearAll=function(e,t){if(0!==this._zones.length){e&&t||(e=0,t=this._bufferService.rows-1);for(var r=0;r<this._zones.length;r++){var i=this._zones[r];(i.y1>e&&i.y1<=t+1||i.y2>e&&i.y2<=t+1||i.y1<e&&i.y2>t+1)&&(this._currentZone&&this._currentZone===i&&(this._currentZone.leaveCallback(),this._currentZone=void 0),this._zones.splice(r--,1))}0===this._zones.length&&this._deactivate()}},t.prototype._activate=function(){this._areZonesActive||(this._areZonesActive=!0,this._element.addEventListener(\"mousemove\",this._mouseMoveListener),this._element.addEventListener(\"mouseleave\",this._mouseLeaveListener),this._element.addEventListener(\"click\",this._clickListener))},t.prototype._deactivate=function(){this._areZonesActive&&(this._areZonesActive=!1,this._element.removeEventListener(\"mousemove\",this._mouseMoveListener),this._element.removeEventListener(\"mouseleave\",this._mouseLeaveListener),this._element.removeEventListener(\"click\",this._clickListener))},t.prototype._onMouseMove=function(e){this._lastHoverCoords[0]===e.pageX&&this._lastHoverCoords[1]===e.pageY||(this._onHover(e),this._lastHoverCoords=[e.pageX,e.pageY])},t.prototype._onHover=function(e){var t=this,r=this._findZoneEventAt(e);r!==this._currentZone&&(this._currentZone&&(this._currentZone.leaveCallback(),this._currentZone=void 0,this._tooltipTimeout&&clearTimeout(this._tooltipTimeout)),r&&(this._currentZone=r,r.hoverCallback&&r.hoverCallback(e),this._tooltipTimeout=window.setTimeout((function(){return t._onTooltip(e)}),this._optionsService.rawOptions.linkTooltipHoverDuration)))},t.prototype._onTooltip=function(e){this._tooltipTimeout=void 0;var t=this._findZoneEventAt(e);null==t||t.tooltipCallback(e)},t.prototype._onMouseDown=function(e){if(this._initialSelectionLength=this._getSelectionLength(),this._areZonesActive){var t=this._findZoneEventAt(e);(null==t?void 0:t.willLinkActivate(e))&&(e.preventDefault(),e.stopImmediatePropagation())}},t.prototype._onMouseLeave=function(e){this._currentZone&&(this._currentZone.leaveCallback(),this._currentZone=void 0,this._tooltipTimeout&&clearTimeout(this._tooltipTimeout))},t.prototype._onClick=function(e){var t=this._findZoneEventAt(e),r=this._getSelectionLength();t&&r===this._initialSelectionLength&&(t.clickCallback(e),e.preventDefault(),e.stopImmediatePropagation())},t.prototype._getSelectionLength=function(){var e=this._selectionService.selectionText;return e?e.length:0},t.prototype._findZoneEventAt=function(e){var t=this._mouseService.getCoords(e,this._screenElement,this._bufferService.cols,this._bufferService.rows);if(t)for(var r=t[0],i=t[1],n=0;n<this._zones.length;n++){var o=this._zones[n];if(o.y1===o.y2){if(i===o.y1&&r>=o.x1&&r<o.x2)return o}else if(i===o.y1&&r>=o.x1||i===o.y2&&r<o.x2||i>o.y1&&i<o.y2)return o}},o([s(2,h.IBufferService),s(3,l.IMouseService),s(4,l.ISelectionService),s(5,h.IOptionsService)],t)}(a.Disposable);t.MouseZoneManager=u},6193:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.RenderDebouncer=void 0;var r=function(){function e(e){this._renderCallback=e}return e.prototype.dispose=function(){this._animationFrame&&(window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)},e.prototype.refresh=function(e,t,r){var i=this;this._rowCount=r,e=void 0!==e?e:0,t=void 0!==t?t:this._rowCount-1,this._rowStart=void 0!==this._rowStart?Math.min(this._rowStart,e):e,this._rowEnd=void 0!==this._rowEnd?Math.max(this._rowEnd,t):t,this._animationFrame||(this._animationFrame=window.requestAnimationFrame((function(){return i._innerRefresh()})))},e.prototype._innerRefresh=function(){if(void 0!==this._rowStart&&void 0!==this._rowEnd&&void 0!==this._rowCount){var e=Math.max(this._rowStart,0),t=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._animationFrame=void 0,this._renderCallback(e,t)}},e}();t.RenderDebouncer=r},5596:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,\"__esModule\",{value:!0}),t.ScreenDprMonitor=void 0;var o=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t._currentDevicePixelRatio=window.devicePixelRatio,t}return n(t,e),t.prototype.setListener=function(e){var t=this;this._listener&&this.clearListener(),this._listener=e,this._outerListener=function(){t._listener&&(t._listener(window.devicePixelRatio,t._currentDevicePixelRatio),t._updateDpr())},this._updateDpr()},t.prototype.dispose=function(){e.prototype.dispose.call(this),this.clearListener()},t.prototype._updateDpr=function(){var e;this._outerListener&&(null===(e=this._resolutionMediaMatchList)||void 0===e||e.removeListener(this._outerListener),this._currentDevicePixelRatio=window.devicePixelRatio,this._resolutionMediaMatchList=window.matchMedia(\"screen and (resolution: \"+window.devicePixelRatio+\"dppx)\"),this._resolutionMediaMatchList.addListener(this._outerListener))},t.prototype.clearListener=function(){this._resolutionMediaMatchList&&this._listener&&this._outerListener&&(this._resolutionMediaMatchList.removeListener(this._outerListener),this._resolutionMediaMatchList=void 0,this._listener=void 0,this._outerListener=void 0)},t}(r(844).Disposable);t.ScreenDprMonitor=o},3236:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,\"__esModule\",{value:!0}),t.Terminal=void 0;var o=r(2950),s=r(1680),a=r(3614),c=r(2584),l=r(5435),h=r(3525),u=r(3551),f=r(9312),_=r(6114),d=r(3656),p=r(9042),v=r(357),g=r(6954),y=r(4567),m=r(1296),S=r(7399),C=r(8460),b=r(8437),w=r(5680),L=r(3230),E=r(4725),x=r(428),k=r(8934),M=r(6465),A=r(5114),R=r(8969),O=r(4774),T=r(4269),D=r(5941),B=r(7641),P=\"undefined\"!=typeof window?window.document:null,I=function(e){function t(t){void 0===t&&(t={});var r=e.call(this,t)||this;return r.browser=_,r._keyDownHandled=!1,r._keyPressHandled=!1,r._unprocessedDeadKey=!1,r._onCursorMove=new C.EventEmitter,r._onKey=new C.EventEmitter,r._onRender=new C.EventEmitter,r._onSelectionChange=new C.EventEmitter,r._onTitleChange=new C.EventEmitter,r._onBell=new C.EventEmitter,r._onFocus=new C.EventEmitter,r._onBlur=new C.EventEmitter,r._onA11yCharEmitter=new C.EventEmitter,r._onA11yTabEmitter=new C.EventEmitter,r._setup(),r.linkifier=r._instantiationService.createInstance(u.Linkifier),r.linkifier2=r.register(r._instantiationService.createInstance(M.Linkifier2)),r.decorationService=r.register(r._instantiationService.createInstance(B.DecorationService)),r.register(r._inputHandler.onRequestBell((function(){return r.bell()}))),r.register(r._inputHandler.onRequestRefreshRows((function(e,t){return r.refresh(e,t)}))),r.register(r._inputHandler.onRequestSendFocus((function(){return r._reportFocus()}))),r.register(r._inputHandler.onRequestReset((function(){return r.reset()}))),r.register(r._inputHandler.onRequestWindowsOptionsReport((function(e){return r._reportWindowsOptions(e)}))),r.register(r._inputHandler.onColor((function(e){return r._handleColorEvent(e)}))),r.register((0,C.forwardEvent)(r._inputHandler.onCursorMove,r._onCursorMove)),r.register((0,C.forwardEvent)(r._inputHandler.onTitleChange,r._onTitleChange)),r.register((0,C.forwardEvent)(r._inputHandler.onA11yChar,r._onA11yCharEmitter)),r.register((0,C.forwardEvent)(r._inputHandler.onA11yTab,r._onA11yTabEmitter)),r.register(r._bufferService.onResize((function(e){return r._afterResize(e.cols,e.rows)}))),r}return n(t,e),Object.defineProperty(t.prototype,\"onCursorMove\",{get:function(){return this._onCursorMove.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onKey\",{get:function(){return this._onKey.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onRender\",{get:function(){return this._onRender.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onSelectionChange\",{get:function(){return this._onSelectionChange.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onTitleChange\",{get:function(){return this._onTitleChange.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onBell\",{get:function(){return this._onBell.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onFocus\",{get:function(){return this._onFocus.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onBlur\",{get:function(){return this._onBlur.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onA11yChar\",{get:function(){return this._onA11yCharEmitter.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onA11yTab\",{get:function(){return this._onA11yTabEmitter.event},enumerable:!1,configurable:!0}),t.prototype._handleColorEvent=function(e){var t,r;if(this._colorManager){for(var i=0,n=e;i<n.length;i++){var o=n[i],s=void 0,a=\"\";switch(o.index){case 256:s=\"foreground\",a=\"10\";break;case 257:s=\"background\",a=\"11\";break;case 258:s=\"cursor\",a=\"12\";break;default:s=\"ansi\",a=\"4;\"+o.index}if(s)switch(o.type){case 0:var l=O.color.toColorRGB(\"ansi\"===s?this._colorManager.colors.ansi[o.index]:this._colorManager.colors[s]);this.coreService.triggerDataEvent(c.C0.ESC+\"]\"+a+\";\"+(0,D.toRgbString)(l)+c.C0.BEL);break;case 1:\"ansi\"===s?this._colorManager.colors.ansi[o.index]=O.rgba.toColor.apply(O.rgba,o.color):this._colorManager.colors[s]=O.rgba.toColor.apply(O.rgba,o.color);break;case 2:this._colorManager.restoreColor(o.index)}}null===(t=this._renderService)||void 0===t||t.setColors(this._colorManager.colors),null===(r=this.viewport)||void 0===r||r.onThemeChange(this._colorManager.colors)}},t.prototype.dispose=function(){var t,r,i;this._isDisposed||(e.prototype.dispose.call(this),null===(t=this._renderService)||void 0===t||t.dispose(),this._customKeyEventHandler=void 0,this.write=function(){},null===(i=null===(r=this.element)||void 0===r?void 0:r.parentNode)||void 0===i||i.removeChild(this.element))},t.prototype._setup=function(){e.prototype._setup.call(this),this._customKeyEventHandler=void 0},Object.defineProperty(t.prototype,\"buffer\",{get:function(){return this.buffers.active},enumerable:!1,configurable:!0}),t.prototype.focus=function(){this.textarea&&this.textarea.focus({preventScroll:!0})},t.prototype._updateOptions=function(t){var r,i,n,o;switch(e.prototype._updateOptions.call(this,t),t){case\"fontFamily\":case\"fontSize\":null===(r=this._renderService)||void 0===r||r.clear(),null===(i=this._charSizeService)||void 0===i||i.measure();break;case\"cursorBlink\":case\"cursorStyle\":this.refresh(this.buffer.y,this.buffer.y);break;case\"customGlyphs\":case\"drawBoldTextInBrightColors\":case\"letterSpacing\":case\"lineHeight\":case\"fontWeight\":case\"fontWeightBold\":case\"minimumContrastRatio\":this._renderService&&(this._renderService.clear(),this._renderService.onResize(this.cols,this.rows),this.refresh(0,this.rows-1));break;case\"rendererType\":this._renderService&&(this._renderService.setRenderer(this._createRenderer()),this._renderService.onResize(this.cols,this.rows));break;case\"scrollback\":null===(n=this.viewport)||void 0===n||n.syncScrollArea();break;case\"screenReaderMode\":this.optionsService.rawOptions.screenReaderMode?!this._accessibilityManager&&this._renderService&&(this._accessibilityManager=new y.AccessibilityManager(this,this._renderService)):(null===(o=this._accessibilityManager)||void 0===o||o.dispose(),this._accessibilityManager=void 0);break;case\"tabStopWidth\":this.buffers.setupTabStops();break;case\"theme\":this._setTheme(this.optionsService.rawOptions.theme)}},t.prototype._onTextAreaFocus=function(e){this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(c.C0.ESC+\"[I\"),this.updateCursorStyle(e),this.element.classList.add(\"focus\"),this._showCursor(),this._onFocus.fire()},t.prototype.blur=function(){var e;return null===(e=this.textarea)||void 0===e?void 0:e.blur()},t.prototype._onTextAreaBlur=function(){this.textarea.value=\"\",this.refresh(this.buffer.y,this.buffer.y),this.coreService.decPrivateModes.sendFocus&&this.coreService.triggerDataEvent(c.C0.ESC+\"[O\"),this.element.classList.remove(\"focus\"),this._onBlur.fire()},t.prototype._syncTextArea=function(){if(this.textarea&&this.buffer.isCursorInViewport&&!this._compositionHelper.isComposing&&this._renderService){var e=this.buffer.ybase+this.buffer.y,t=this.buffer.lines.get(e);if(t){var r=Math.min(this.buffer.x,this.cols-1),i=this._renderService.dimensions.actualCellHeight,n=t.getWidth(r),o=this._renderService.dimensions.actualCellWidth*n,s=this.buffer.y*this._renderService.dimensions.actualCellHeight,a=r*this._renderService.dimensions.actualCellWidth;this.textarea.style.left=a+\"px\",this.textarea.style.top=s+\"px\",this.textarea.style.width=o+\"px\",this.textarea.style.height=i+\"px\",this.textarea.style.lineHeight=i+\"px\",this.textarea.style.zIndex=\"-5\"}}},t.prototype._initGlobal=function(){var e=this;this._bindKeys(),this.register((0,d.addDisposableDomListener)(this.element,\"copy\",(function(t){e.hasSelection()&&(0,a.copyHandler)(t,e._selectionService)})));var t=function(t){return(0,a.handlePasteEvent)(t,e.textarea,e.coreService)};this.register((0,d.addDisposableDomListener)(this.textarea,\"paste\",t)),this.register((0,d.addDisposableDomListener)(this.element,\"paste\",t)),_.isFirefox?this.register((0,d.addDisposableDomListener)(this.element,\"mousedown\",(function(t){2===t.button&&(0,a.rightClickHandler)(t,e.textarea,e.screenElement,e._selectionService,e.options.rightClickSelectsWord)}))):this.register((0,d.addDisposableDomListener)(this.element,\"contextmenu\",(function(t){(0,a.rightClickHandler)(t,e.textarea,e.screenElement,e._selectionService,e.options.rightClickSelectsWord)}))),_.isLinux&&this.register((0,d.addDisposableDomListener)(this.element,\"auxclick\",(function(t){1===t.button&&(0,a.moveTextAreaUnderMouseCursor)(t,e.textarea,e.screenElement)})))},t.prototype._bindKeys=function(){var e=this;this.register((0,d.addDisposableDomListener)(this.textarea,\"keyup\",(function(t){return e._keyUp(t)}),!0)),this.register((0,d.addDisposableDomListener)(this.textarea,\"keydown\",(function(t){return e._keyDown(t)}),!0)),this.register((0,d.addDisposableDomListener)(this.textarea,\"keypress\",(function(t){return e._keyPress(t)}),!0)),this.register((0,d.addDisposableDomListener)(this.textarea,\"compositionstart\",(function(){return e._compositionHelper.compositionstart()}))),this.register((0,d.addDisposableDomListener)(this.textarea,\"compositionupdate\",(function(t){return e._compositionHelper.compositionupdate(t)}))),this.register((0,d.addDisposableDomListener)(this.textarea,\"compositionend\",(function(){return e._compositionHelper.compositionend()}))),this.register((0,d.addDisposableDomListener)(this.textarea,\"input\",(function(t){return e._inputEvent(t)}),!0)),this.register(this.onRender((function(){return e._compositionHelper.updateCompositionElements()}))),this.register(this.onRender((function(t){return e._queueLinkification(t.start,t.end)})))},t.prototype.open=function(e){var t=this;if(!e)throw new Error(\"Terminal requires a parent element.\");e.isConnected||this._logService.debug(\"Terminal.open was called on an element that was not attached to the DOM\"),this._document=e.ownerDocument,this.element=this._document.createElement(\"div\"),this.element.dir=\"ltr\",this.element.classList.add(\"terminal\"),this.element.classList.add(\"xterm\"),this.element.setAttribute(\"tabindex\",\"0\"),e.appendChild(this.element);var r=P.createDocumentFragment();this._viewportElement=P.createElement(\"div\"),this._viewportElement.classList.add(\"xterm-viewport\"),r.appendChild(this._viewportElement),this._viewportScrollArea=P.createElement(\"div\"),this._viewportScrollArea.classList.add(\"xterm-scroll-area\"),this._viewportElement.appendChild(this._viewportScrollArea),this.screenElement=P.createElement(\"div\"),this.screenElement.classList.add(\"xterm-screen\"),this._helperContainer=P.createElement(\"div\"),this._helperContainer.classList.add(\"xterm-helpers\"),this.screenElement.appendChild(this._helperContainer),r.appendChild(this.screenElement),this.textarea=P.createElement(\"textarea\"),this.textarea.classList.add(\"xterm-helper-textarea\"),this.textarea.setAttribute(\"aria-label\",p.promptLabel),this.textarea.setAttribute(\"aria-multiline\",\"false\"),this.textarea.setAttribute(\"autocorrect\",\"off\"),this.textarea.setAttribute(\"autocapitalize\",\"off\"),this.textarea.setAttribute(\"spellcheck\",\"false\"),this.textarea.tabIndex=0,this.register((0,d.addDisposableDomListener)(this.textarea,\"focus\",(function(e){return t._onTextAreaFocus(e)}))),this.register((0,d.addDisposableDomListener)(this.textarea,\"blur\",(function(){return t._onTextAreaBlur()}))),this._helperContainer.appendChild(this.textarea);var i=this._instantiationService.createInstance(A.CoreBrowserService,this.textarea);this._instantiationService.setService(E.ICoreBrowserService,i),this._charSizeService=this._instantiationService.createInstance(x.CharSizeService,this._document,this._helperContainer),this._instantiationService.setService(E.ICharSizeService,this._charSizeService),this._theme=this.options.theme||this._theme,this._colorManager=new w.ColorManager(P,this.options.allowTransparency),this.register(this.optionsService.onOptionChange((function(e){return t._colorManager.onOptionsChange(e)}))),this._colorManager.setTheme(this._theme),this._characterJoinerService=this._instantiationService.createInstance(T.CharacterJoinerService),this._instantiationService.setService(E.ICharacterJoinerService,this._characterJoinerService);var n=this._createRenderer();this._renderService=this.register(this._instantiationService.createInstance(L.RenderService,n,this.rows,this.screenElement)),this._instantiationService.setService(E.IRenderService,this._renderService),this.register(this._renderService.onRenderedBufferChange((function(e){return t._onRender.fire(e)}))),this.onResize((function(e){return t._renderService.resize(e.cols,e.rows)})),this._compositionView=P.createElement(\"div\"),this._compositionView.classList.add(\"composition-view\"),this._compositionHelper=this._instantiationService.createInstance(o.CompositionHelper,this.textarea,this._compositionView),this._helperContainer.appendChild(this._compositionView),this.element.appendChild(r),this._soundService=this._instantiationService.createInstance(v.SoundService),this._instantiationService.setService(E.ISoundService,this._soundService),this._mouseService=this._instantiationService.createInstance(k.MouseService),this._instantiationService.setService(E.IMouseService,this._mouseService),this.viewport=this._instantiationService.createInstance(s.Viewport,(function(e){return t.scrollLines(e,!0,1)}),this._viewportElement,this._viewportScrollArea,this.element),this.viewport.onThemeChange(this._colorManager.colors),this.register(this._inputHandler.onRequestSyncScrollBar((function(){return t.viewport.syncScrollArea()}))),this.register(this.viewport),this.register(this.onCursorMove((function(){t._renderService.onCursorMove(),t._syncTextArea()}))),this.register(this.onResize((function(){return t._renderService.onResize(t.cols,t.rows)}))),this.register(this.onBlur((function(){return t._renderService.onBlur()}))),this.register(this.onFocus((function(){return t._renderService.onFocus()}))),this.register(this._renderService.onDimensionsChange((function(){return t.viewport.syncScrollArea()}))),this._selectionService=this.register(this._instantiationService.createInstance(f.SelectionService,this.element,this.screenElement,this.linkifier2)),this._instantiationService.setService(E.ISelectionService,this._selectionService),this.register(this._selectionService.onRequestScrollLines((function(e){return t.scrollLines(e.amount,e.suppressScrollEvent)}))),this.register(this._selectionService.onSelectionChange((function(){return t._onSelectionChange.fire()}))),this.register(this._selectionService.onRequestRedraw((function(e){return t._renderService.onSelectionChanged(e.start,e.end,e.columnSelectMode)}))),this.register(this._selectionService.onLinuxMouseSelection((function(e){t.textarea.value=e,t.textarea.focus(),t.textarea.select()}))),this.register(this._onScroll.event((function(e){t.viewport.syncScrollArea(),t._selectionService.refresh()}))),this.register((0,d.addDisposableDomListener)(this._viewportElement,\"scroll\",(function(){return t._selectionService.refresh()}))),this._mouseZoneManager=this._instantiationService.createInstance(g.MouseZoneManager,this.element,this.screenElement),this.register(this._mouseZoneManager),this.register(this.onScroll((function(){return t._mouseZoneManager.clearAll()}))),this.linkifier.attachToDom(this.element,this._mouseZoneManager),this.linkifier2.attachToDom(this.screenElement,this._mouseService,this._renderService),this.decorationService.attachToDom(this.screenElement,this._renderService,this._bufferService),this.register((0,d.addDisposableDomListener)(this.element,\"mousedown\",(function(e){return t._selectionService.onMouseDown(e)}))),this.coreMouseService.areMouseEventsActive?(this._selectionService.disable(),this.element.classList.add(\"enable-mouse-events\")):this._selectionService.enable(),this.options.screenReaderMode&&(this._accessibilityManager=new y.AccessibilityManager(this,this._renderService)),this._charSizeService.measure(),this.refresh(0,this.rows-1),this._initGlobal(),this.bindMouse()},t.prototype._createRenderer=function(){switch(this.options.rendererType){case\"canvas\":return this._instantiationService.createInstance(h.Renderer,this._colorManager.colors,this.screenElement,this.linkifier,this.linkifier2);case\"dom\":return this._instantiationService.createInstance(m.DomRenderer,this._colorManager.colors,this.element,this.screenElement,this._viewportElement,this.linkifier,this.linkifier2);default:throw new Error('Unrecognized rendererType \"'+this.options.rendererType+'\"')}},t.prototype._setTheme=function(e){var t,r,i;this._theme=e,null===(t=this._colorManager)||void 0===t||t.setTheme(e),null===(r=this._renderService)||void 0===r||r.setColors(this._colorManager.colors),null===(i=this.viewport)||void 0===i||i.onThemeChange(this._colorManager.colors)},t.prototype.bindMouse=function(){var e=this,t=this,r=this.element;function i(e){var r,i,n=t._mouseService.getRawByteCoords(e,t.screenElement,t.cols,t.rows);if(!n)return!1;switch(e.overrideType||e.type){case\"mousemove\":i=32,void 0===e.buttons?(r=3,void 0!==e.button&&(r=e.button<3?e.button:3)):r=1&e.buttons?0:4&e.buttons?1:2&e.buttons?2:3;break;case\"mouseup\":i=0,r=e.button<3?e.button:3;break;case\"mousedown\":i=1,r=e.button<3?e.button:3;break;case\"wheel\":0!==e.deltaY&&(i=e.deltaY<0?0:1),r=4;break;default:return!1}return!(void 0===i||void 0===r||r>4)&&t.coreMouseService.triggerMouseEvent({col:n.x-33,row:n.y-33,button:r,action:i,ctrl:e.ctrlKey,alt:e.altKey,shift:e.shiftKey})}var n={mouseup:null,wheel:null,mousedrag:null,mousemove:null},o=function(t){return i(t),t.buttons||(e._document.removeEventListener(\"mouseup\",n.mouseup),n.mousedrag&&e._document.removeEventListener(\"mousemove\",n.mousedrag)),e.cancel(t)},s=function(t){return i(t),e.cancel(t,!0)},a=function(e){e.buttons&&i(e)},l=function(e){e.buttons||i(e)};this.register(this.coreMouseService.onProtocolChange((function(t){t?(\"debug\"===e.optionsService.rawOptions.logLevel&&e._logService.debug(\"Binding to mouse events:\",e.coreMouseService.explainEvents(t)),e.element.classList.add(\"enable-mouse-events\"),e._selectionService.disable()):(e._logService.debug(\"Unbinding from mouse events.\"),e.element.classList.remove(\"enable-mouse-events\"),e._selectionService.enable()),8&t?n.mousemove||(r.addEventListener(\"mousemove\",l),n.mousemove=l):(r.removeEventListener(\"mousemove\",n.mousemove),n.mousemove=null),16&t?n.wheel||(r.addEventListener(\"wheel\",s,{passive:!1}),n.wheel=s):(r.removeEventListener(\"wheel\",n.wheel),n.wheel=null),2&t?n.mouseup||(n.mouseup=o):(e._document.removeEventListener(\"mouseup\",n.mouseup),n.mouseup=null),4&t?n.mousedrag||(n.mousedrag=a):(e._document.removeEventListener(\"mousemove\",n.mousedrag),n.mousedrag=null)}))),this.coreMouseService.activeProtocol=this.coreMouseService.activeProtocol,this.register((0,d.addDisposableDomListener)(r,\"mousedown\",(function(t){if(t.preventDefault(),e.focus(),e.coreMouseService.areMouseEventsActive&&!e._selectionService.shouldForceSelection(t))return i(t),n.mouseup&&e._document.addEventListener(\"mouseup\",n.mouseup),n.mousedrag&&e._document.addEventListener(\"mousemove\",n.mousedrag),e.cancel(t)}))),this.register((0,d.addDisposableDomListener)(r,\"wheel\",(function(t){if(!n.wheel){if(!e.buffer.hasScrollback){var r=e.viewport.getLinesScrolled(t);if(0===r)return;for(var i=c.C0.ESC+(e.coreService.decPrivateModes.applicationCursorKeys?\"O\":\"[\")+(t.deltaY<0?\"A\":\"B\"),o=\"\",s=0;s<Math.abs(r);s++)o+=i;return e.coreService.triggerDataEvent(o,!0),e.cancel(t,!0)}return e.viewport.onWheel(t)?e.cancel(t):void 0}}),{passive:!1})),this.register((0,d.addDisposableDomListener)(r,\"touchstart\",(function(t){if(!e.coreMouseService.areMouseEventsActive)return e.viewport.onTouchStart(t),e.cancel(t)}),{passive:!0})),this.register((0,d.addDisposableDomListener)(r,\"touchmove\",(function(t){if(!e.coreMouseService.areMouseEventsActive)return e.viewport.onTouchMove(t)?void 0:e.cancel(t)}),{passive:!1}))},t.prototype.refresh=function(e,t){var r;null===(r=this._renderService)||void 0===r||r.refreshRows(e,t)},t.prototype._queueLinkification=function(e,t){var r;null===(r=this.linkifier)||void 0===r||r.linkifyRows(e,t)},t.prototype.updateCursorStyle=function(e){var t;(null===(t=this._selectionService)||void 0===t?void 0:t.shouldColumnSelect(e))?this.element.classList.add(\"column-select\"):this.element.classList.remove(\"column-select\")},t.prototype._showCursor=function(){this.coreService.isCursorInitialized||(this.coreService.isCursorInitialized=!0,this.refresh(this.buffer.y,this.buffer.y))},t.prototype.scrollLines=function(t,r,i){void 0===i&&(i=0),e.prototype.scrollLines.call(this,t,r,i),this.refresh(0,this.rows-1)},t.prototype.paste=function(e){(0,a.paste)(e,this.textarea,this.coreService)},t.prototype.attachCustomKeyEventHandler=function(e){this._customKeyEventHandler=e},t.prototype.registerLinkMatcher=function(e,t,r){var i=this.linkifier.registerLinkMatcher(e,t,r);return this.refresh(0,this.rows-1),i},t.prototype.deregisterLinkMatcher=function(e){this.linkifier.deregisterLinkMatcher(e)&&this.refresh(0,this.rows-1)},t.prototype.registerLinkProvider=function(e){return this.linkifier2.registerLinkProvider(e)},t.prototype.registerCharacterJoiner=function(e){if(!this._characterJoinerService)throw new Error(\"Terminal must be opened first\");var t=this._characterJoinerService.register(e);return this.refresh(0,this.rows-1),t},t.prototype.deregisterCharacterJoiner=function(e){if(!this._characterJoinerService)throw new Error(\"Terminal must be opened first\");this._characterJoinerService.deregister(e)&&this.refresh(0,this.rows-1)},Object.defineProperty(t.prototype,\"markers\",{get:function(){return this.buffer.markers},enumerable:!1,configurable:!0}),t.prototype.addMarker=function(e){if(this.buffer===this.buffers.normal)return this.buffer.addMarker(this.buffer.ybase+this.buffer.y+e)},t.prototype.registerDecoration=function(e){return this.decorationService.registerDecoration(e)},t.prototype.hasSelection=function(){return!!this._selectionService&&this._selectionService.hasSelection},t.prototype.select=function(e,t,r){this._selectionService.setSelection(e,t,r)},t.prototype.getSelection=function(){return this._selectionService?this._selectionService.selectionText:\"\"},t.prototype.getSelectionPosition=function(){if(this._selectionService&&this._selectionService.hasSelection)return{startColumn:this._selectionService.selectionStart[0],startRow:this._selectionService.selectionStart[1],endColumn:this._selectionService.selectionEnd[0],endRow:this._selectionService.selectionEnd[1]}},t.prototype.clearSelection=function(){var e;null===(e=this._selectionService)||void 0===e||e.clearSelection()},t.prototype.selectAll=function(){var e;null===(e=this._selectionService)||void 0===e||e.selectAll()},t.prototype.selectLines=function(e,t){var r;null===(r=this._selectionService)||void 0===r||r.selectLines(e,t)},t.prototype._keyDown=function(e){if(this._keyDownHandled=!1,this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return!1;if(!this._compositionHelper.keydown(e))return this.buffer.ybase!==this.buffer.ydisp&&this._bufferService.scrollToBottom(),!1;\"Dead\"!==e.key&&\"AltGraph\"!==e.key||(this._unprocessedDeadKey=!0);var t=(0,S.evaluateKeyboardEvent)(e,this.coreService.decPrivateModes.applicationCursorKeys,this.browser.isMac,this.options.macOptionIsMeta);if(this.updateCursorStyle(e),3===t.type||2===t.type){var r=this.rows-1;return this.scrollLines(2===t.type?-r:r),this.cancel(e,!0)}return 1===t.type&&this.selectAll(),!!this._isThirdLevelShift(this.browser,e)||(t.cancel&&this.cancel(e,!0),!t.key||(this._unprocessedDeadKey?(this._unprocessedDeadKey=!1,!0):(t.key!==c.C0.ETX&&t.key!==c.C0.CR||(this.textarea.value=\"\"),this._onKey.fire({key:t.key,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(t.key,!0),this.optionsService.rawOptions.screenReaderMode?void(this._keyDownHandled=!0):this.cancel(e,!0))))},t.prototype._isThirdLevelShift=function(e,t){var r=e.isMac&&!this.options.macOptionIsMeta&&t.altKey&&!t.ctrlKey&&!t.metaKey||e.isWindows&&t.altKey&&t.ctrlKey&&!t.metaKey||e.isWindows&&t.getModifierState(\"AltGraph\");return\"keypress\"===t.type?r:r&&(!t.keyCode||t.keyCode>47)},t.prototype._keyUp=function(e){this._customKeyEventHandler&&!1===this._customKeyEventHandler(e)||(function(e){return 16===e.keyCode||17===e.keyCode||18===e.keyCode}(e)||this.focus(),this.updateCursorStyle(e),this._keyPressHandled=!1)},t.prototype._keyPress=function(e){var t;if(this._keyPressHandled=!1,this._keyDownHandled)return!1;if(this._customKeyEventHandler&&!1===this._customKeyEventHandler(e))return!1;if(this.cancel(e),e.charCode)t=e.charCode;else if(null===e.which||void 0===e.which)t=e.keyCode;else{if(0===e.which||0===e.charCode)return!1;t=e.which}return!(!t||(e.altKey||e.ctrlKey||e.metaKey)&&!this._isThirdLevelShift(this.browser,e)||(t=String.fromCharCode(t),this._onKey.fire({key:t,domEvent:e}),this._showCursor(),this.coreService.triggerDataEvent(t,!0),this._keyPressHandled=!0,this._unprocessedDeadKey=!1,0))},t.prototype._inputEvent=function(e){if(e.data&&\"insertText\"===e.inputType&&!e.composed&&!this.optionsService.rawOptions.screenReaderMode){if(this._keyPressHandled)return!1;this._unprocessedDeadKey=!1;var t=e.data;return this.coreService.triggerDataEvent(t,!0),this.cancel(e),!0}return!1},t.prototype.bell=function(){var e;this._soundBell()&&(null===(e=this._soundService)||void 0===e||e.playBellSound()),this._onBell.fire()},t.prototype.resize=function(t,r){t!==this.cols||r!==this.rows?e.prototype.resize.call(this,t,r):this._charSizeService&&!this._charSizeService.hasValidSize&&this._charSizeService.measure()},t.prototype._afterResize=function(e,t){var r,i;null===(r=this._charSizeService)||void 0===r||r.measure(),null===(i=this.viewport)||void 0===i||i.syncScrollArea(!0)},t.prototype.clear=function(){if(0!==this.buffer.ybase||0!==this.buffer.y){this.buffer.clearMarkers(),this.buffer.lines.set(0,this.buffer.lines.get(this.buffer.ybase+this.buffer.y)),this.buffer.lines.length=1,this.buffer.ydisp=0,this.buffer.ybase=0,this.buffer.y=0;for(var e=1;e<this.rows;e++)this.buffer.lines.push(this.buffer.getBlankLine(b.DEFAULT_ATTR_DATA));this.refresh(0,this.rows-1),this._onScroll.fire({position:this.buffer.ydisp,source:0})}},t.prototype.reset=function(){var t,r;this.options.rows=this.rows,this.options.cols=this.cols;var i=this._customKeyEventHandler;this._setup(),e.prototype.reset.call(this),null===(t=this._selectionService)||void 0===t||t.reset(),this._customKeyEventHandler=i,this.refresh(0,this.rows-1),null===(r=this.viewport)||void 0===r||r.syncScrollArea()},t.prototype.clearTextureAtlas=function(){var e;null===(e=this._renderService)||void 0===e||e.clearTextureAtlas()},t.prototype._reportFocus=function(){var e;(null===(e=this.element)||void 0===e?void 0:e.classList.contains(\"focus\"))?this.coreService.triggerDataEvent(c.C0.ESC+\"[I\"):this.coreService.triggerDataEvent(c.C0.ESC+\"[O\")},t.prototype._reportWindowsOptions=function(e){if(this._renderService)switch(e){case l.WindowsOptionsReportType.GET_WIN_SIZE_PIXELS:var t=this._renderService.dimensions.scaledCanvasWidth.toFixed(0),r=this._renderService.dimensions.scaledCanvasHeight.toFixed(0);this.coreService.triggerDataEvent(c.C0.ESC+\"[4;\"+r+\";\"+t+\"t\");break;case l.WindowsOptionsReportType.GET_CELL_SIZE_PIXELS:var i=this._renderService.dimensions.scaledCellWidth.toFixed(0),n=this._renderService.dimensions.scaledCellHeight.toFixed(0);this.coreService.triggerDataEvent(c.C0.ESC+\"[6;\"+n+\";\"+i+\"t\")}},t.prototype.cancel=function(e,t){if(this.options.cancelEvents||t)return e.preventDefault(),e.stopPropagation(),!1},t.prototype._visualBell=function(){return!1},t.prototype._soundBell=function(){return\"sound\"===this.options.bellStyle},t}(R.CoreTerminal);t.Terminal=I},9924:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.TimeBasedDebouncer=void 0;var r=function(){function e(e,t){void 0===t&&(t=1e3),this._renderCallback=e,this._debounceThresholdMS=t,this._lastRefreshMs=0,this._additionalRefreshRequested=!1}return e.prototype.dispose=function(){this._refreshTimeoutID&&clearTimeout(this._refreshTimeoutID)},e.prototype.refresh=function(e,t,r){var i=this;this._rowCount=r,e=void 0!==e?e:0,t=void 0!==t?t:this._rowCount-1,this._rowStart=void 0!==this._rowStart?Math.min(this._rowStart,e):e,this._rowEnd=void 0!==this._rowEnd?Math.max(this._rowEnd,t):t;var n=Date.now();if(n-this._lastRefreshMs>=this._debounceThresholdMS)this._lastRefreshMs=n,this._innerRefresh();else if(!this._additionalRefreshRequested){var o=n-this._lastRefreshMs,s=this._debounceThresholdMS-o;this._additionalRefreshRequested=!0,this._refreshTimeoutID=window.setTimeout((function(){i._lastRefreshMs=Date.now(),i._innerRefresh(),i._additionalRefreshRequested=!1,i._refreshTimeoutID=void 0}),s)}},e.prototype._innerRefresh=function(){if(void 0!==this._rowStart&&void 0!==this._rowEnd&&void 0!==this._rowCount){var e=Math.max(this._rowStart,0),t=Math.min(this._rowEnd,this._rowCount-1);this._rowStart=void 0,this._rowEnd=void 0,this._renderCallback(e,t)}},e}();t.TimeBasedDebouncer=r},1680:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},s=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.Viewport=void 0;var a=r(844),c=r(3656),l=r(4725),h=r(2585),u=function(e){function t(t,r,i,n,o,s,a,l){var h=e.call(this)||this;return h._scrollLines=t,h._viewportElement=r,h._scrollArea=i,h._element=n,h._bufferService=o,h._optionsService=s,h._charSizeService=a,h._renderService=l,h.scrollBarWidth=0,h._currentRowHeight=0,h._currentScaledCellHeight=0,h._lastRecordedBufferLength=0,h._lastRecordedViewportHeight=0,h._lastRecordedBufferHeight=0,h._lastTouchY=0,h._lastScrollTop=0,h._lastHadScrollBar=!1,h._wheelPartialScroll=0,h._refreshAnimationFrame=null,h._ignoreNextScrollEvent=!1,h.scrollBarWidth=h._viewportElement.offsetWidth-h._scrollArea.offsetWidth||15,h._lastHadScrollBar=!0,h.register((0,c.addDisposableDomListener)(h._viewportElement,\"scroll\",h._onScroll.bind(h))),h._activeBuffer=h._bufferService.buffer,h.register(h._bufferService.buffers.onBufferActivate((function(e){return h._activeBuffer=e.activeBuffer}))),h._renderDimensions=h._renderService.dimensions,h.register(h._renderService.onDimensionsChange((function(e){return h._renderDimensions=e}))),setTimeout((function(){return h.syncScrollArea()}),0),h}return n(t,e),t.prototype.onThemeChange=function(e){this._viewportElement.style.backgroundColor=e.background.css},t.prototype._refresh=function(e){var t=this;if(e)return this._innerRefresh(),void(null!==this._refreshAnimationFrame&&cancelAnimationFrame(this._refreshAnimationFrame));null===this._refreshAnimationFrame&&(this._refreshAnimationFrame=requestAnimationFrame((function(){return t._innerRefresh()})))},t.prototype._innerRefresh=function(){if(this._charSizeService.height>0){this._currentRowHeight=this._renderService.dimensions.scaledCellHeight/window.devicePixelRatio,this._currentScaledCellHeight=this._renderService.dimensions.scaledCellHeight,this._lastRecordedViewportHeight=this._viewportElement.offsetHeight;var e=Math.round(this._currentRowHeight*this._lastRecordedBufferLength)+(this._lastRecordedViewportHeight-this._renderService.dimensions.canvasHeight);this._lastRecordedBufferHeight!==e&&(this._lastRecordedBufferHeight=e,this._scrollArea.style.height=this._lastRecordedBufferHeight+\"px\")}var t=this._bufferService.buffer.ydisp*this._currentRowHeight;this._viewportElement.scrollTop!==t&&(this._ignoreNextScrollEvent=!0,this._viewportElement.scrollTop=t),0===this._optionsService.rawOptions.scrollback?this.scrollBarWidth=0:this.scrollBarWidth=this._viewportElement.offsetWidth-this._scrollArea.offsetWidth||15,this._lastHadScrollBar=this.scrollBarWidth>0;var r=window.getComputedStyle(this._element),i=parseInt(r.paddingLeft)+parseInt(r.paddingRight);this._viewportElement.style.width=(this._renderService.dimensions.actualCellWidth*this._bufferService.cols+this.scrollBarWidth+(this._lastHadScrollBar?i:0)).toString()+\"px\",this._refreshAnimationFrame=null},t.prototype.syncScrollArea=function(e){if(void 0===e&&(e=!1),this._lastRecordedBufferLength!==this._bufferService.buffer.lines.length)return this._lastRecordedBufferLength=this._bufferService.buffer.lines.length,void this._refresh(e);this._lastRecordedViewportHeight===this._renderService.dimensions.canvasHeight&&this._lastScrollTop===this._activeBuffer.ydisp*this._currentRowHeight&&this._renderDimensions.scaledCellHeight===this._currentScaledCellHeight?this._lastHadScrollBar!==this._optionsService.rawOptions.scrollback>0&&this._refresh(e):this._refresh(e)},t.prototype._onScroll=function(e){if(this._lastScrollTop=this._viewportElement.scrollTop,this._viewportElement.offsetParent){if(this._ignoreNextScrollEvent)return this._ignoreNextScrollEvent=!1,void this._scrollLines(0);var t=Math.round(this._lastScrollTop/this._currentRowHeight)-this._bufferService.buffer.ydisp;this._scrollLines(t)}},t.prototype._bubbleScroll=function(e,t){var r=this._viewportElement.scrollTop+this._lastRecordedViewportHeight;return!(t<0&&0!==this._viewportElement.scrollTop||t>0&&r<this._lastRecordedBufferHeight)||(e.cancelable&&e.preventDefault(),!1)},t.prototype.onWheel=function(e){var t=this._getPixelsScrolled(e);return 0!==t&&(this._viewportElement.scrollTop+=t,this._bubbleScroll(e,t))},t.prototype._getPixelsScrolled=function(e){if(0===e.deltaY||e.shiftKey)return 0;var t=this._applyScrollModifier(e.deltaY,e);return e.deltaMode===WheelEvent.DOM_DELTA_LINE?t*=this._currentRowHeight:e.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(t*=this._currentRowHeight*this._bufferService.rows),t},t.prototype.getLinesScrolled=function(e){if(0===e.deltaY||e.shiftKey)return 0;var t=this._applyScrollModifier(e.deltaY,e);return e.deltaMode===WheelEvent.DOM_DELTA_PIXEL?(t/=this._currentRowHeight+0,this._wheelPartialScroll+=t,t=Math.floor(Math.abs(this._wheelPartialScroll))*(this._wheelPartialScroll>0?1:-1),this._wheelPartialScroll%=1):e.deltaMode===WheelEvent.DOM_DELTA_PAGE&&(t*=this._bufferService.rows),t},t.prototype._applyScrollModifier=function(e,t){var r=this._optionsService.rawOptions.fastScrollModifier;return\"alt\"===r&&t.altKey||\"ctrl\"===r&&t.ctrlKey||\"shift\"===r&&t.shiftKey?e*this._optionsService.rawOptions.fastScrollSensitivity*this._optionsService.rawOptions.scrollSensitivity:e*this._optionsService.rawOptions.scrollSensitivity},t.prototype.onTouchStart=function(e){this._lastTouchY=e.touches[0].pageY},t.prototype.onTouchMove=function(e){var t=this._lastTouchY-e.touches[0].pageY;return this._lastTouchY=e.touches[0].pageY,0!==t&&(this._viewportElement.scrollTop+=t,this._bubbleScroll(e,t))},o([s(4,h.IBufferService),s(5,h.IOptionsService),s(6,l.ICharSizeService),s(7,l.IRenderService)],t)}(a.Disposable);t.Viewport=u},2950:function(e,t,r){var i=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},n=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.CompositionHelper=void 0;var o=r(4725),s=r(2585),a=function(){function e(e,t,r,i,n,o){this._textarea=e,this._compositionView=t,this._bufferService=r,this._optionsService=i,this._coreService=n,this._renderService=o,this._isComposing=!1,this._isSendingComposition=!1,this._compositionPosition={start:0,end:0},this._dataAlreadySent=\"\"}return Object.defineProperty(e.prototype,\"isComposing\",{get:function(){return this._isComposing},enumerable:!1,configurable:!0}),e.prototype.compositionstart=function(){this._isComposing=!0,this._compositionPosition.start=this._textarea.value.length,this._compositionView.textContent=\"\",this._dataAlreadySent=\"\",this._compositionView.classList.add(\"active\")},e.prototype.compositionupdate=function(e){var t=this;this._compositionView.textContent=e.data,this.updateCompositionElements(),setTimeout((function(){t._compositionPosition.end=t._textarea.value.length}),0)},e.prototype.compositionend=function(){this._finalizeComposition(!0)},e.prototype.keydown=function(e){if(this._isComposing||this._isSendingComposition){if(229===e.keyCode)return!1;if(16===e.keyCode||17===e.keyCode||18===e.keyCode)return!1;this._finalizeComposition(!1)}return 229!==e.keyCode||(this._handleAnyTextareaChanges(),!1)},e.prototype._finalizeComposition=function(e){var t=this;if(this._compositionView.classList.remove(\"active\"),this._isComposing=!1,e){var r={start:this._compositionPosition.start,end:this._compositionPosition.end};this._isSendingComposition=!0,setTimeout((function(){if(t._isSendingComposition){t._isSendingComposition=!1;var e;r.start+=t._dataAlreadySent.length,(e=t._isComposing?t._textarea.value.substring(r.start,r.end):t._textarea.value.substring(r.start)).length>0&&t._coreService.triggerDataEvent(e,!0)}}),0)}else{this._isSendingComposition=!1;var i=this._textarea.value.substring(this._compositionPosition.start,this._compositionPosition.end);this._coreService.triggerDataEvent(i,!0)}},e.prototype._handleAnyTextareaChanges=function(){var e=this,t=this._textarea.value;setTimeout((function(){if(!e._isComposing){var r=e._textarea.value.replace(t,\"\");r.length>0&&(e._dataAlreadySent=r,e._coreService.triggerDataEvent(r,!0))}}),0)},e.prototype.updateCompositionElements=function(e){var t=this;if(this._isComposing){if(this._bufferService.buffer.isCursorInViewport){var r=Math.min(this._bufferService.buffer.x,this._bufferService.cols-1),i=this._renderService.dimensions.actualCellHeight,n=this._bufferService.buffer.y*this._renderService.dimensions.actualCellHeight,o=r*this._renderService.dimensions.actualCellWidth;this._compositionView.style.left=o+\"px\",this._compositionView.style.top=n+\"px\",this._compositionView.style.height=i+\"px\",this._compositionView.style.lineHeight=i+\"px\",this._compositionView.style.fontFamily=this._optionsService.rawOptions.fontFamily,this._compositionView.style.fontSize=this._optionsService.rawOptions.fontSize+\"px\";var s=this._compositionView.getBoundingClientRect();this._textarea.style.left=o+\"px\",this._textarea.style.top=n+\"px\",this._textarea.style.width=Math.max(s.width,1)+\"px\",this._textarea.style.height=Math.max(s.height,1)+\"px\",this._textarea.style.lineHeight=s.height+\"px\"}e||setTimeout((function(){return t.updateCompositionElements(!0)}),0)}},i([n(2,s.IBufferService),n(3,s.IOptionsService),n(4,s.ICoreService),n(5,o.IRenderService)],e)}();t.CompositionHelper=a},9806:(e,t)=>{function r(e,t){var r=t.getBoundingClientRect();return[e.clientX-r.left,e.clientY-r.top]}Object.defineProperty(t,\"__esModule\",{value:!0}),t.getRawByteCoords=t.getCoords=t.getCoordsRelativeToElement=void 0,t.getCoordsRelativeToElement=r,t.getCoords=function(e,t,i,n,o,s,a,c){if(o){var l=r(e,t);if(l)return l[0]=Math.ceil((l[0]+(c?s/2:0))/s),l[1]=Math.ceil(l[1]/a),l[0]=Math.min(Math.max(l[0],1),i+(c?1:0)),l[1]=Math.min(Math.max(l[1],1),n),l}},t.getRawByteCoords=function(e){if(e)return{x:e[0]+32,y:e[1]+32}}},9504:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.moveToCellSequence=void 0;var i=r(2584);function n(e,t,r,i){var n=e-o(r,e),a=t-o(r,t),h=Math.abs(n-a)-function(e,t,r){for(var i=0,n=e-o(r,e),a=t-o(r,t),c=0;c<Math.abs(n-a);c++){var l=\"A\"===s(e,t)?-1:1,h=r.buffer.lines.get(n+l*c);(null==h?void 0:h.isWrapped)&&i++}return i}(e,t,r);return l(h,c(s(e,t),i))}function o(e,t){for(var r=0,i=e.buffer.lines.get(t),n=null==i?void 0:i.isWrapped;n&&t>=0&&t<e.rows;)r++,n=null==(i=e.buffer.lines.get(--t))?void 0:i.isWrapped;return r}function s(e,t){return e>t?\"A\":\"B\"}function a(e,t,r,i,n,o){for(var s=e,a=t,c=\"\";s!==r||a!==i;)s+=n?1:-1,n&&s>o.cols-1?(c+=o.buffer.translateBufferLineToString(a,!1,e,s),s=0,e=0,a++):!n&&s<0&&(c+=o.buffer.translateBufferLineToString(a,!1,0,e+1),e=s=o.cols-1,a--);return c+o.buffer.translateBufferLineToString(a,!1,e,s)}function c(e,t){var r=t?\"O\":\"[\";return i.C0.ESC+r+e}function l(e,t){e=Math.floor(e);for(var r=\"\",i=0;i<e;i++)r+=t;return r}t.moveToCellSequence=function(e,t,r,i){var s,h=r.buffer.x,u=r.buffer.y;if(!r.buffer.hasScrollback)return function(e,t,r,i,s,h){return 0===n(t,i,s,h).length?\"\":l(a(e,t,e,t-o(s,t),!1,s).length,c(\"D\",h))}(h,u,0,t,r,i)+n(u,t,r,i)+function(e,t,r,i,s,h){var u;u=n(t,i,s,h).length>0?i-o(s,i):t;var f=i,_=function(e,t,r,i,s,a){var c;return c=n(r,i,s,a).length>0?i-o(s,i):t,e<r&&c<=i||e>=r&&c<i?\"C\":\"D\"}(e,t,r,i,s,h);return l(a(e,u,r,f,\"C\"===_,s).length,c(_,h))}(h,u,e,t,r,i);if(u===t)return s=h>e?\"D\":\"C\",l(Math.abs(h-e),c(s,i));s=u>t?\"D\":\"C\";var f=Math.abs(u-t);return l(function(e,t){return t.cols-e}(u>t?e:h,r)+(f-1)*r.cols+1+((u>t?h:e)-1),c(s,i))}},4389:function(e,t,r){var i=this&&this.__assign||function(){return i=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},i.apply(this,arguments)};Object.defineProperty(t,\"__esModule\",{value:!0}),t.Terminal=void 0;var n=r(3236),o=r(9042),s=r(7975),a=r(7090),c=r(5741),l=r(8285),h=[\"cols\",\"rows\"],u=function(){function e(e){var t=this;this._core=new n.Terminal(e),this._addonManager=new c.AddonManager,this._publicOptions=i({},this._core.options);var r=function(e){return t._core.options[e]},o=function(e,r){t._checkReadonlyOptions(e),t._core.options[e]=r};for(var s in this._core.options){var a={get:r.bind(this,s),set:o.bind(this,s)};Object.defineProperty(this._publicOptions,s,a)}}return e.prototype._checkReadonlyOptions=function(e){if(h.includes(e))throw new Error('Option \"'+e+'\" can only be set in the constructor')},e.prototype._checkProposedApi=function(){if(!this._core.optionsService.rawOptions.allowProposedApi)throw new Error(\"You must set the allowProposedApi option to true to use proposed API\")},Object.defineProperty(e.prototype,\"onBell\",{get:function(){return this._core.onBell},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"onBinary\",{get:function(){return this._core.onBinary},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"onCursorMove\",{get:function(){return this._core.onCursorMove},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"onData\",{get:function(){return this._core.onData},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"onKey\",{get:function(){return this._core.onKey},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"onLineFeed\",{get:function(){return this._core.onLineFeed},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"onRender\",{get:function(){return this._core.onRender},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"onResize\",{get:function(){return this._core.onResize},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"onScroll\",{get:function(){return this._core.onScroll},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"onSelectionChange\",{get:function(){return this._core.onSelectionChange},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"onTitleChange\",{get:function(){return this._core.onTitleChange},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"element\",{get:function(){return this._core.element},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"parser\",{get:function(){return this._checkProposedApi(),this._parser||(this._parser=new s.ParserApi(this._core)),this._parser},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"unicode\",{get:function(){return this._checkProposedApi(),new a.UnicodeApi(this._core)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"textarea\",{get:function(){return this._core.textarea},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"rows\",{get:function(){return this._core.rows},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"cols\",{get:function(){return this._core.cols},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"buffer\",{get:function(){return this._checkProposedApi(),this._buffer||(this._buffer=new l.BufferNamespaceApi(this._core)),this._buffer},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"markers\",{get:function(){return this._checkProposedApi(),this._core.markers},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"modes\",{get:function(){var e=this._core.coreService.decPrivateModes,t=\"none\";switch(this._core.coreMouseService.activeProtocol){case\"X10\":t=\"x10\";break;case\"VT200\":t=\"vt200\";break;case\"DRAG\":t=\"drag\";break;case\"ANY\":t=\"any\"}return{applicationCursorKeysMode:e.applicationCursorKeys,applicationKeypadMode:e.applicationKeypad,bracketedPasteMode:e.bracketedPasteMode,insertMode:this._core.coreService.modes.insertMode,mouseTrackingMode:t,originMode:e.origin,reverseWraparoundMode:e.reverseWraparound,sendFocusMode:e.sendFocus,wraparoundMode:e.wraparound}},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"options\",{get:function(){return this._publicOptions},set:function(e){for(var t in e)this._publicOptions[t]=e[t]},enumerable:!1,configurable:!0}),e.prototype.blur=function(){this._core.blur()},e.prototype.focus=function(){this._core.focus()},e.prototype.resize=function(e,t){this._verifyIntegers(e,t),this._core.resize(e,t)},e.prototype.open=function(e){this._core.open(e)},e.prototype.attachCustomKeyEventHandler=function(e){this._core.attachCustomKeyEventHandler(e)},e.prototype.registerLinkMatcher=function(e,t,r){return this._checkProposedApi(),this._core.registerLinkMatcher(e,t,r)},e.prototype.deregisterLinkMatcher=function(e){this._checkProposedApi(),this._core.deregisterLinkMatcher(e)},e.prototype.registerLinkProvider=function(e){return this._checkProposedApi(),this._core.registerLinkProvider(e)},e.prototype.registerCharacterJoiner=function(e){return this._checkProposedApi(),this._core.registerCharacterJoiner(e)},e.prototype.deregisterCharacterJoiner=function(e){this._checkProposedApi(),this._core.deregisterCharacterJoiner(e)},e.prototype.registerMarker=function(e){return void 0===e&&(e=0),this._checkProposedApi(),this._verifyIntegers(e),this._core.addMarker(e)},e.prototype.registerDecoration=function(e){var t,r,i;return this._checkProposedApi(),this._verifyPositiveIntegers(null!==(t=e.x)&&void 0!==t?t:0,null!==(r=e.width)&&void 0!==r?r:0,null!==(i=e.height)&&void 0!==i?i:0),this._core.registerDecoration(e)},e.prototype.addMarker=function(e){return this.registerMarker(e)},e.prototype.hasSelection=function(){return this._core.hasSelection()},e.prototype.select=function(e,t,r){this._verifyIntegers(e,t,r),this._core.select(e,t,r)},e.prototype.getSelection=function(){return this._core.getSelection()},e.prototype.getSelectionPosition=function(){return this._core.getSelectionPosition()},e.prototype.clearSelection=function(){this._core.clearSelection()},e.prototype.selectAll=function(){this._core.selectAll()},e.prototype.selectLines=function(e,t){this._verifyIntegers(e,t),this._core.selectLines(e,t)},e.prototype.dispose=function(){this._addonManager.dispose(),this._core.dispose()},e.prototype.scrollLines=function(e){this._verifyIntegers(e),this._core.scrollLines(e)},e.prototype.scrollPages=function(e){this._verifyIntegers(e),this._core.scrollPages(e)},e.prototype.scrollToTop=function(){this._core.scrollToTop()},e.prototype.scrollToBottom=function(){this._core.scrollToBottom()},e.prototype.scrollToLine=function(e){this._verifyIntegers(e),this._core.scrollToLine(e)},e.prototype.clear=function(){this._core.clear()},e.prototype.write=function(e,t){this._core.write(e,t)},e.prototype.writeUtf8=function(e,t){this._core.write(e,t)},e.prototype.writeln=function(e,t){this._core.write(e),this._core.write(\"\\r\\n\",t)},e.prototype.paste=function(e){this._core.paste(e)},e.prototype.getOption=function(e){return this._core.optionsService.getOption(e)},e.prototype.setOption=function(e,t){this._checkReadonlyOptions(e),this._core.optionsService.setOption(e,t)},e.prototype.refresh=function(e,t){this._verifyIntegers(e,t),this._core.refresh(e,t)},e.prototype.reset=function(){this._core.reset()},e.prototype.clearTextureAtlas=function(){this._core.clearTextureAtlas()},e.prototype.loadAddon=function(e){return this._addonManager.loadAddon(this,e)},Object.defineProperty(e,\"strings\",{get:function(){return o},enumerable:!1,configurable:!0}),e.prototype._verifyIntegers=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var r=0,i=e;r<i.length;r++){var n=i[r];if(n===1/0||isNaN(n)||n%1!=0)throw new Error(\"This API only accepts integers\")}},e.prototype._verifyPositiveIntegers=function(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];for(var r=0,i=e;r<i.length;r++){var n=i[r];if(n&&(n===1/0||isNaN(n)||n%1!=0||n<0))throw new Error(\"This API only accepts positive integers\")}},e}();t.Terminal=u},1546:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BaseRenderLayer=void 0;var i=r(643),n=r(8803),o=r(1420),s=r(3734),a=r(1752),c=r(4774),l=r(9631),h=r(8978),u=function(){function e(e,t,r,i,n,o,s,a){this._container=e,this._alpha=i,this._colors=n,this._rendererId=o,this._bufferService=s,this._optionsService=a,this._scaledCharWidth=0,this._scaledCharHeight=0,this._scaledCellWidth=0,this._scaledCellHeight=0,this._scaledCharLeft=0,this._scaledCharTop=0,this._currentGlyphIdentifier={chars:\"\",code:0,bg:0,fg:0,bold:!1,dim:!1,italic:!1},this._canvas=document.createElement(\"canvas\"),this._canvas.classList.add(\"xterm-\"+t+\"-layer\"),this._canvas.style.zIndex=r.toString(),this._initCanvas(),this._container.appendChild(this._canvas)}return e.prototype.dispose=function(){var e;(0,l.removeElementFromParent)(this._canvas),null===(e=this._charAtlas)||void 0===e||e.dispose()},e.prototype._initCanvas=function(){this._ctx=(0,a.throwIfFalsy)(this._canvas.getContext(\"2d\",{alpha:this._alpha})),this._alpha||this._clearAll()},e.prototype.onOptionsChanged=function(){},e.prototype.onBlur=function(){},e.prototype.onFocus=function(){},e.prototype.onCursorMove=function(){},e.prototype.onGridChanged=function(e,t){},e.prototype.onSelectionChanged=function(e,t,r){void 0===r&&(r=!1)},e.prototype.setColors=function(e){this._refreshCharAtlas(e)},e.prototype._setTransparency=function(e){if(e!==this._alpha){var t=this._canvas;this._alpha=e,this._canvas=this._canvas.cloneNode(),this._initCanvas(),this._container.replaceChild(this._canvas,t),this._refreshCharAtlas(this._colors),this.onGridChanged(0,this._bufferService.rows-1)}},e.prototype._refreshCharAtlas=function(e){this._scaledCharWidth<=0&&this._scaledCharHeight<=0||(this._charAtlas=(0,o.acquireCharAtlas)(this._optionsService.rawOptions,this._rendererId,e,this._scaledCharWidth,this._scaledCharHeight),this._charAtlas.warmUp())},e.prototype.resize=function(e){this._scaledCellWidth=e.scaledCellWidth,this._scaledCellHeight=e.scaledCellHeight,this._scaledCharWidth=e.scaledCharWidth,this._scaledCharHeight=e.scaledCharHeight,this._scaledCharLeft=e.scaledCharLeft,this._scaledCharTop=e.scaledCharTop,this._canvas.width=e.scaledCanvasWidth,this._canvas.height=e.scaledCanvasHeight,this._canvas.style.width=e.canvasWidth+\"px\",this._canvas.style.height=e.canvasHeight+\"px\",this._alpha||this._clearAll(),this._refreshCharAtlas(this._colors)},e.prototype.clearTextureAtlas=function(){var e;null===(e=this._charAtlas)||void 0===e||e.clear()},e.prototype._fillCells=function(e,t,r,i){this._ctx.fillRect(e*this._scaledCellWidth,t*this._scaledCellHeight,r*this._scaledCellWidth,i*this._scaledCellHeight)},e.prototype._fillMiddleLineAtCells=function(e,t,r){void 0===r&&(r=1);var i=Math.ceil(.5*this._scaledCellHeight);this._ctx.fillRect(e*this._scaledCellWidth,(t+1)*this._scaledCellHeight-i-window.devicePixelRatio,r*this._scaledCellWidth,window.devicePixelRatio)},e.prototype._fillBottomLineAtCells=function(e,t,r){void 0===r&&(r=1),this._ctx.fillRect(e*this._scaledCellWidth,(t+1)*this._scaledCellHeight-window.devicePixelRatio-1,r*this._scaledCellWidth,window.devicePixelRatio)},e.prototype._fillLeftLineAtCell=function(e,t,r){this._ctx.fillRect(e*this._scaledCellWidth,t*this._scaledCellHeight,window.devicePixelRatio*r,this._scaledCellHeight)},e.prototype._strokeRectAtCell=function(e,t,r,i){this._ctx.lineWidth=window.devicePixelRatio,this._ctx.strokeRect(e*this._scaledCellWidth+window.devicePixelRatio/2,t*this._scaledCellHeight+window.devicePixelRatio/2,r*this._scaledCellWidth-window.devicePixelRatio,i*this._scaledCellHeight-window.devicePixelRatio)},e.prototype._clearAll=function(){this._alpha?this._ctx.clearRect(0,0,this._canvas.width,this._canvas.height):(this._ctx.fillStyle=this._colors.background.css,this._ctx.fillRect(0,0,this._canvas.width,this._canvas.height))},e.prototype._clearCells=function(e,t,r,i){this._alpha?this._ctx.clearRect(e*this._scaledCellWidth,t*this._scaledCellHeight,r*this._scaledCellWidth,i*this._scaledCellHeight):(this._ctx.fillStyle=this._colors.background.css,this._ctx.fillRect(e*this._scaledCellWidth,t*this._scaledCellHeight,r*this._scaledCellWidth,i*this._scaledCellHeight))},e.prototype._fillCharTrueColor=function(e,t,r){this._ctx.font=this._getFont(!1,!1),this._ctx.textBaseline=n.TEXT_BASELINE,this._clipRow(r);var i=!1;!1!==this._optionsService.rawOptions.customGlyphs&&(i=(0,h.tryDrawCustomChar)(this._ctx,e.getChars(),t*this._scaledCellWidth,r*this._scaledCellHeight,this._scaledCellWidth,this._scaledCellHeight)),i||this._ctx.fillText(e.getChars(),t*this._scaledCellWidth+this._scaledCharLeft,r*this._scaledCellHeight+this._scaledCharTop+this._scaledCharHeight)},e.prototype._drawChars=function(e,t,r){var o,s,a,c=this._getContrastColor(e);c||e.isFgRGB()||e.isBgRGB()?this._drawUncachedChars(e,t,r,c):(e.isInverse()?(s=e.isBgDefault()?n.INVERTED_DEFAULT_COLOR:e.getBgColor(),a=e.isFgDefault()?n.INVERTED_DEFAULT_COLOR:e.getFgColor()):(a=e.isBgDefault()?i.DEFAULT_COLOR:e.getBgColor(),s=e.isFgDefault()?i.DEFAULT_COLOR:e.getFgColor()),s+=this._optionsService.rawOptions.drawBoldTextInBrightColors&&e.isBold()&&s<8?8:0,this._currentGlyphIdentifier.chars=e.getChars()||i.WHITESPACE_CELL_CHAR,this._currentGlyphIdentifier.code=e.getCode()||i.WHITESPACE_CELL_CODE,this._currentGlyphIdentifier.bg=a,this._currentGlyphIdentifier.fg=s,this._currentGlyphIdentifier.bold=!!e.isBold(),this._currentGlyphIdentifier.dim=!!e.isDim(),this._currentGlyphIdentifier.italic=!!e.isItalic(),(null===(o=this._charAtlas)||void 0===o?void 0:o.draw(this._ctx,this._currentGlyphIdentifier,t*this._scaledCellWidth+this._scaledCharLeft,r*this._scaledCellHeight+this._scaledCharTop))||this._drawUncachedChars(e,t,r))},e.prototype._drawUncachedChars=function(e,t,r,i){if(this._ctx.save(),this._ctx.font=this._getFont(!!e.isBold(),!!e.isItalic()),this._ctx.textBaseline=n.TEXT_BASELINE,e.isInverse())if(i)this._ctx.fillStyle=i.css;else if(e.isBgDefault())this._ctx.fillStyle=c.color.opaque(this._colors.background).css;else if(e.isBgRGB())this._ctx.fillStyle=\"rgb(\"+s.AttributeData.toColorRGB(e.getBgColor()).join(\",\")+\")\";else{var o=e.getBgColor();this._optionsService.rawOptions.drawBoldTextInBrightColors&&e.isBold()&&o<8&&(o+=8),this._ctx.fillStyle=this._colors.ansi[o].css}else if(i)this._ctx.fillStyle=i.css;else if(e.isFgDefault())this._ctx.fillStyle=this._colors.foreground.css;else if(e.isFgRGB())this._ctx.fillStyle=\"rgb(\"+s.AttributeData.toColorRGB(e.getFgColor()).join(\",\")+\")\";else{var a=e.getFgColor();this._optionsService.rawOptions.drawBoldTextInBrightColors&&e.isBold()&&a<8&&(a+=8),this._ctx.fillStyle=this._colors.ansi[a].css}this._clipRow(r),e.isDim()&&(this._ctx.globalAlpha=n.DIM_OPACITY);var l=!1;!1!==this._optionsService.rawOptions.customGlyphs&&(l=(0,h.tryDrawCustomChar)(this._ctx,e.getChars(),t*this._scaledCellWidth,r*this._scaledCellHeight,this._scaledCellWidth,this._scaledCellHeight)),l||this._ctx.fillText(e.getChars(),t*this._scaledCellWidth+this._scaledCharLeft,r*this._scaledCellHeight+this._scaledCharTop+this._scaledCharHeight),this._ctx.restore()},e.prototype._clipRow=function(e){this._ctx.beginPath(),this._ctx.rect(0,e*this._scaledCellHeight,this._bufferService.cols*this._scaledCellWidth,this._scaledCellHeight),this._ctx.clip()},e.prototype._getFont=function(e,t){return(t?\"italic\":\"\")+\" \"+(e?this._optionsService.rawOptions.fontWeightBold:this._optionsService.rawOptions.fontWeight)+\" \"+this._optionsService.rawOptions.fontSize*window.devicePixelRatio+\"px \"+this._optionsService.rawOptions.fontFamily},e.prototype._getContrastColor=function(e){if(1!==this._optionsService.rawOptions.minimumContrastRatio){var t=this._colors.contrastCache.getColor(e.bg,e.fg);if(void 0!==t)return t||void 0;var r=e.getFgColor(),i=e.getFgColorMode(),n=e.getBgColor(),o=e.getBgColorMode(),s=!!e.isInverse(),a=!!e.isInverse();if(s){var l=r;r=n,n=l;var h=i;i=o,o=h}var u=this._resolveBackgroundRgba(o,n,s),f=this._resolveForegroundRgba(i,r,s,a),_=c.rgba.ensureContrastRatio(u,f,this._optionsService.rawOptions.minimumContrastRatio);if(_){var d={css:c.channels.toCss(_>>24&255,_>>16&255,_>>8&255),rgba:_};return this._colors.contrastCache.setColor(e.bg,e.fg,d),d}this._colors.contrastCache.setColor(e.bg,e.fg,null)}},e.prototype._resolveBackgroundRgba=function(e,t,r){switch(e){case 16777216:case 33554432:return this._colors.ansi[t].rgba;case 50331648:return t<<8;default:return r?this._colors.foreground.rgba:this._colors.background.rgba}},e.prototype._resolveForegroundRgba=function(e,t,r,i){switch(e){case 16777216:case 33554432:return this._optionsService.rawOptions.drawBoldTextInBrightColors&&i&&t<8&&(t+=8),this._colors.ansi[t].rgba;case 50331648:return t<<8;default:return r?this._colors.background.rgba:this._colors.foreground.rgba}},e}();t.BaseRenderLayer=u},2512:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},s=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.CursorRenderLayer=void 0;var a=r(1546),c=r(511),l=r(2585),h=r(4725),u=600,f=function(e){function t(t,r,i,n,o,s,a,l,h){var u=e.call(this,t,\"cursor\",r,!0,i,n,s,a)||this;return u._onRequestRedraw=o,u._coreService=l,u._coreBrowserService=h,u._cell=new c.CellData,u._state={x:0,y:0,isFocused:!1,style:\"\",width:0},u._cursorRenderers={bar:u._renderBarCursor.bind(u),block:u._renderBlockCursor.bind(u),underline:u._renderUnderlineCursor.bind(u)},u}return n(t,e),t.prototype.dispose=function(){this._cursorBlinkStateManager&&(this._cursorBlinkStateManager.dispose(),this._cursorBlinkStateManager=void 0),e.prototype.dispose.call(this)},t.prototype.resize=function(t){e.prototype.resize.call(this,t),this._state={x:0,y:0,isFocused:!1,style:\"\",width:0}},t.prototype.reset=function(){var e;this._clearCursor(),null===(e=this._cursorBlinkStateManager)||void 0===e||e.restartBlinkAnimation(),this.onOptionsChanged()},t.prototype.onBlur=function(){var e;null===(e=this._cursorBlinkStateManager)||void 0===e||e.pause(),this._onRequestRedraw.fire({start:this._bufferService.buffer.y,end:this._bufferService.buffer.y})},t.prototype.onFocus=function(){var e;null===(e=this._cursorBlinkStateManager)||void 0===e||e.resume(),this._onRequestRedraw.fire({start:this._bufferService.buffer.y,end:this._bufferService.buffer.y})},t.prototype.onOptionsChanged=function(){var e,t=this;this._optionsService.rawOptions.cursorBlink?this._cursorBlinkStateManager||(this._cursorBlinkStateManager=new _(this._coreBrowserService.isFocused,(function(){t._render(!0)}))):(null===(e=this._cursorBlinkStateManager)||void 0===e||e.dispose(),this._cursorBlinkStateManager=void 0),this._onRequestRedraw.fire({start:this._bufferService.buffer.y,end:this._bufferService.buffer.y})},t.prototype.onCursorMove=function(){var e;null===(e=this._cursorBlinkStateManager)||void 0===e||e.restartBlinkAnimation()},t.prototype.onGridChanged=function(e,t){!this._cursorBlinkStateManager||this._cursorBlinkStateManager.isPaused?this._render(!1):this._cursorBlinkStateManager.restartBlinkAnimation()},t.prototype._render=function(e){if(this._coreService.isCursorInitialized&&!this._coreService.isCursorHidden){var t=this._bufferService.buffer.ybase+this._bufferService.buffer.y,r=t-this._bufferService.buffer.ydisp;if(r<0||r>=this._bufferService.rows)this._clearCursor();else{var i=Math.min(this._bufferService.buffer.x,this._bufferService.cols-1);if(this._bufferService.buffer.lines.get(t).loadCell(i,this._cell),void 0!==this._cell.content){if(!this._coreBrowserService.isFocused){this._clearCursor(),this._ctx.save(),this._ctx.fillStyle=this._colors.cursor.css;var n=this._optionsService.rawOptions.cursorStyle;return n&&\"block\"!==n?this._cursorRenderers[n](i,r,this._cell):this._renderBlurCursor(i,r,this._cell),this._ctx.restore(),this._state.x=i,this._state.y=r,this._state.isFocused=!1,this._state.style=n,void(this._state.width=this._cell.getWidth())}if(!this._cursorBlinkStateManager||this._cursorBlinkStateManager.isCursorVisible){if(this._state){if(this._state.x===i&&this._state.y===r&&this._state.isFocused===this._coreBrowserService.isFocused&&this._state.style===this._optionsService.rawOptions.cursorStyle&&this._state.width===this._cell.getWidth())return;this._clearCursor()}this._ctx.save(),this._cursorRenderers[this._optionsService.rawOptions.cursorStyle||\"block\"](i,r,this._cell),this._ctx.restore(),this._state.x=i,this._state.y=r,this._state.isFocused=!1,this._state.style=this._optionsService.rawOptions.cursorStyle,this._state.width=this._cell.getWidth()}else this._clearCursor()}}}else this._clearCursor()},t.prototype._clearCursor=function(){this._state&&(window.devicePixelRatio<1?this._clearAll():this._clearCells(this._state.x,this._state.y,this._state.width,1),this._state={x:0,y:0,isFocused:!1,style:\"\",width:0})},t.prototype._renderBarCursor=function(e,t,r){this._ctx.save(),this._ctx.fillStyle=this._colors.cursor.css,this._fillLeftLineAtCell(e,t,this._optionsService.rawOptions.cursorWidth),this._ctx.restore()},t.prototype._renderBlockCursor=function(e,t,r){this._ctx.save(),this._ctx.fillStyle=this._colors.cursor.css,this._fillCells(e,t,r.getWidth(),1),this._ctx.fillStyle=this._colors.cursorAccent.css,this._fillCharTrueColor(r,e,t),this._ctx.restore()},t.prototype._renderUnderlineCursor=function(e,t,r){this._ctx.save(),this._ctx.fillStyle=this._colors.cursor.css,this._fillBottomLineAtCells(e,t),this._ctx.restore()},t.prototype._renderBlurCursor=function(e,t,r){this._ctx.save(),this._ctx.strokeStyle=this._colors.cursor.css,this._strokeRectAtCell(e,t,r.getWidth(),1),this._ctx.restore()},o([s(5,l.IBufferService),s(6,l.IOptionsService),s(7,l.ICoreService),s(8,h.ICoreBrowserService)],t)}(a.BaseRenderLayer);t.CursorRenderLayer=f;var _=function(){function e(e,t){this._renderCallback=t,this.isCursorVisible=!0,e&&this._restartInterval()}return Object.defineProperty(e.prototype,\"isPaused\",{get:function(){return!(this._blinkStartTimeout||this._blinkInterval)},enumerable:!1,configurable:!0}),e.prototype.dispose=function(){this._blinkInterval&&(window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)},e.prototype.restartBlinkAnimation=function(){var e=this;this.isPaused||(this._animationTimeRestarted=Date.now(),this.isCursorVisible=!0,this._animationFrame||(this._animationFrame=window.requestAnimationFrame((function(){e._renderCallback(),e._animationFrame=void 0}))))},e.prototype._restartInterval=function(e){var t=this;void 0===e&&(e=u),this._blinkInterval&&(window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout=window.setTimeout((function(){if(t._animationTimeRestarted){var e=u-(Date.now()-t._animationTimeRestarted);if(t._animationTimeRestarted=void 0,e>0)return void t._restartInterval(e)}t.isCursorVisible=!1,t._animationFrame=window.requestAnimationFrame((function(){t._renderCallback(),t._animationFrame=void 0})),t._blinkInterval=window.setInterval((function(){if(t._animationTimeRestarted){var e=u-(Date.now()-t._animationTimeRestarted);return t._animationTimeRestarted=void 0,void t._restartInterval(e)}t.isCursorVisible=!t.isCursorVisible,t._animationFrame=window.requestAnimationFrame((function(){t._renderCallback(),t._animationFrame=void 0}))}),u)}),e)},e.prototype.pause=function(){this.isCursorVisible=!0,this._blinkInterval&&(window.clearInterval(this._blinkInterval),this._blinkInterval=void 0),this._blinkStartTimeout&&(window.clearTimeout(this._blinkStartTimeout),this._blinkStartTimeout=void 0),this._animationFrame&&(window.cancelAnimationFrame(this._animationFrame),this._animationFrame=void 0)},e.prototype.resume=function(){this.pause(),this._animationTimeRestarted=void 0,this._restartInterval(),this.restartBlinkAnimation()},e}()},8978:(e,t,r)=>{var i,n,o,s,a,c,l,h,u,f,_,d,p,v,g,y,m,S,C,b,w,L,E,x,k,M,A,R,O,T,D,B,P,I,H,F,j,W,U,q,N,z,K,G,V,X,Y,Z,J,$,Q,ee,te,re,ie,ne,oe,se,ae,ce,le,he,ue,fe,_e,de,pe,ve,ge,ye,me,Se,Ce,be,we,Le,Ee,xe,ke,Me,Ae,Re,Oe,Te,De,Be,Pe,Ie,He,Fe,je,We,Ue,qe,Ne,ze,Ke,Ge,Ve,Xe,Ye,Ze,Je,$e,Qe,et,tt,rt,it,nt,ot,st,at,ct,lt,ht,ut,ft,_t,dt,pt,vt,gt,yt,mt,St,Ct,bt;Object.defineProperty(t,\"__esModule\",{value:!0}),t.tryDrawCustomChar=t.boxDrawingDefinitions=t.blockElementDefinitions=void 0;var wt=r(1752);t.blockElementDefinitions={\"▀\":[{x:0,y:0,w:8,h:4}],\"▁\":[{x:0,y:7,w:8,h:1}],\"▂\":[{x:0,y:6,w:8,h:2}],\"▃\":[{x:0,y:5,w:8,h:3}],\"▄\":[{x:0,y:4,w:8,h:4}],\"▅\":[{x:0,y:3,w:8,h:5}],\"▆\":[{x:0,y:2,w:8,h:6}],\"▇\":[{x:0,y:1,w:8,h:7}],\"█\":[{x:0,y:0,w:8,h:8}],\"▉\":[{x:0,y:0,w:7,h:8}],\"▊\":[{x:0,y:0,w:6,h:8}],\"▋\":[{x:0,y:0,w:5,h:8}],\"▌\":[{x:0,y:0,w:4,h:8}],\"▍\":[{x:0,y:0,w:3,h:8}],\"▎\":[{x:0,y:0,w:2,h:8}],\"▏\":[{x:0,y:0,w:1,h:8}],\"▐\":[{x:4,y:0,w:4,h:8}],\"▔\":[{x:0,y:0,w:9,h:1}],\"▕\":[{x:7,y:0,w:1,h:8}],\"▖\":[{x:0,y:4,w:4,h:4}],\"▗\":[{x:4,y:4,w:4,h:4}],\"▘\":[{x:0,y:0,w:4,h:4}],\"▙\":[{x:0,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}],\"▚\":[{x:0,y:0,w:4,h:4},{x:4,y:4,w:4,h:4}],\"▛\":[{x:0,y:0,w:4,h:8},{x:0,y:0,w:4,h:8}],\"▜\":[{x:0,y:0,w:8,h:4},{x:4,y:0,w:4,h:8}],\"▝\":[{x:4,y:0,w:4,h:4}],\"▞\":[{x:4,y:0,w:4,h:4},{x:0,y:4,w:4,h:4}],\"▟\":[{x:4,y:0,w:4,h:8},{x:0,y:4,w:8,h:4}],\"🭰\":[{x:1,y:0,w:1,h:8}],\"🭱\":[{x:2,y:0,w:1,h:8}],\"🭲\":[{x:3,y:0,w:1,h:8}],\"🭳\":[{x:4,y:0,w:1,h:8}],\"🭴\":[{x:5,y:0,w:1,h:8}],\"🭵\":[{x:6,y:0,w:1,h:8}],\"🭶\":[{x:0,y:1,w:8,h:1}],\"🭷\":[{x:0,y:2,w:8,h:1}],\"🭸\":[{x:0,y:3,w:8,h:1}],\"🭹\":[{x:0,y:4,w:8,h:1}],\"🭺\":[{x:0,y:5,w:8,h:1}],\"🭻\":[{x:0,y:6,w:8,h:1}],\"🭼\":[{x:0,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}],\"🭽\":[{x:0,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}],\"🭾\":[{x:7,y:0,w:1,h:8},{x:0,y:0,w:8,h:1}],\"🭿\":[{x:7,y:0,w:1,h:8},{x:0,y:7,w:8,h:1}],\"🮀\":[{x:0,y:0,w:8,h:1},{x:0,y:7,w:8,h:1}],\"🮁\":[{x:0,y:0,w:8,h:1},{x:0,y:2,w:8,h:1},{x:0,y:4,w:8,h:1},{x:0,y:7,w:8,h:1}],\"🮂\":[{x:0,y:0,w:8,h:2}],\"🮃\":[{x:0,y:0,w:8,h:3}],\"🮄\":[{x:0,y:0,w:8,h:5}],\"🮅\":[{x:0,y:0,w:8,h:6}],\"🮆\":[{x:0,y:0,w:8,h:7}],\"🮇\":[{x:6,y:0,w:2,h:8}],\"🮈\":[{x:5,y:0,w:3,h:8}],\"🮉\":[{x:3,y:0,w:5,h:8}],\"🮊\":[{x:2,y:0,w:6,h:8}],\"🮋\":[{x:1,y:0,w:7,h:8}],\"🮕\":[{x:0,y:0,w:2,h:2},{x:4,y:0,w:2,h:2},{x:2,y:2,w:2,h:2},{x:6,y:2,w:2,h:2},{x:0,y:4,w:2,h:2},{x:4,y:4,w:2,h:2},{x:2,y:6,w:2,h:2},{x:6,y:6,w:2,h:2}],\"🮖\":[{x:2,y:0,w:2,h:2},{x:6,y:0,w:2,h:2},{x:0,y:2,w:2,h:2},{x:4,y:2,w:2,h:2},{x:2,y:4,w:2,h:2},{x:6,y:4,w:2,h:2},{x:0,y:6,w:2,h:2},{x:4,y:6,w:2,h:2}],\"🮗\":[{x:0,y:2,w:8,h:2},{x:0,y:6,w:8,h:2}]};var Lt={\"░\":[[1,0,0,0],[0,0,0,0],[0,0,1,0],[0,0,0,0]],\"▒\":[[1,0],[0,0],[0,1],[0,0]],\"▓\":[[0,1],[1,1],[1,0],[1,1]]};t.boxDrawingDefinitions={\"─\":(i={},i[1]=\"M0,.5 L1,.5\",i),\"━\":(n={},n[3]=\"M0,.5 L1,.5\",n),\"│\":(o={},o[1]=\"M.5,0 L.5,1\",o),\"┃\":(s={},s[3]=\"M.5,0 L.5,1\",s),\"┌\":(a={},a[1]=\"M0.5,1 L.5,.5 L1,.5\",a),\"┏\":(c={},c[3]=\"M0.5,1 L.5,.5 L1,.5\",c),\"┐\":(l={},l[1]=\"M0,.5 L.5,.5 L.5,1\",l),\"┓\":(h={},h[3]=\"M0,.5 L.5,.5 L.5,1\",h),\"└\":(u={},u[1]=\"M.5,0 L.5,.5 L1,.5\",u),\"┗\":(f={},f[3]=\"M.5,0 L.5,.5 L1,.5\",f),\"┘\":(_={},_[1]=\"M.5,0 L.5,.5 L0,.5\",_),\"┛\":(d={},d[3]=\"M.5,0 L.5,.5 L0,.5\",d),\"├\":(p={},p[1]=\"M.5,0 L.5,1 M.5,.5 L1,.5\",p),\"┣\":(v={},v[3]=\"M.5,0 L.5,1 M.5,.5 L1,.5\",v),\"┤\":(g={},g[1]=\"M.5,0 L.5,1 M.5,.5 L0,.5\",g),\"┫\":(y={},y[3]=\"M.5,0 L.5,1 M.5,.5 L0,.5\",y),\"┬\":(m={},m[1]=\"M0,.5 L1,.5 M.5,.5 L.5,1\",m),\"┳\":(S={},S[3]=\"M0,.5 L1,.5 M.5,.5 L.5,1\",S),\"┴\":(C={},C[1]=\"M0,.5 L1,.5 M.5,.5 L.5,0\",C),\"┻\":(b={},b[3]=\"M0,.5 L1,.5 M.5,.5 L.5,0\",b),\"┼\":(w={},w[1]=\"M0,.5 L1,.5 M.5,0 L.5,1\",w),\"╋\":(L={},L[3]=\"M0,.5 L1,.5 M.5,0 L.5,1\",L),\"╴\":(E={},E[1]=\"M.5,.5 L0,.5\",E),\"╸\":(x={},x[3]=\"M.5,.5 L0,.5\",x),\"╵\":(k={},k[1]=\"M.5,.5 L.5,0\",k),\"╹\":(M={},M[3]=\"M.5,.5 L.5,0\",M),\"╶\":(A={},A[1]=\"M.5,.5 L1,.5\",A),\"╺\":(R={},R[3]=\"M.5,.5 L1,.5\",R),\"╷\":(O={},O[1]=\"M.5,.5 L.5,1\",O),\"╻\":(T={},T[3]=\"M.5,.5 L.5,1\",T),\"═\":(D={},D[1]=function(e,t){return\"M0,\"+(.5-t)+\" L1,\"+(.5-t)+\" M0,\"+(.5+t)+\" L1,\"+(.5+t)},D),\"║\":(B={},B[1]=function(e,t){return\"M\"+(.5-e)+\",0 L\"+(.5-e)+\",1 M\"+(.5+e)+\",0 L\"+(.5+e)+\",1\"},B),\"╒\":(P={},P[1]=function(e,t){return\"M.5,1 L.5,\"+(.5-t)+\" L1,\"+(.5-t)+\" M.5,\"+(.5+t)+\" L1,\"+(.5+t)},P),\"╓\":(I={},I[1]=function(e,t){return\"M\"+(.5-e)+\",1 L\"+(.5-e)+\",.5 L1,.5 M\"+(.5+e)+\",.5 L\"+(.5+e)+\",1\"},I),\"╔\":(H={},H[1]=function(e,t){return\"M1,\"+(.5-t)+\" L\"+(.5-e)+\",\"+(.5-t)+\" L\"+(.5-e)+\",1 M1,\"+(.5+t)+\" L\"+(.5+e)+\",\"+(.5+t)+\" L\"+(.5+e)+\",1\"},H),\"╕\":(F={},F[1]=function(e,t){return\"M0,\"+(.5-t)+\" L.5,\"+(.5-t)+\" L.5,1 M0,\"+(.5+t)+\" L.5,\"+(.5+t)},F),\"╖\":(j={},j[1]=function(e,t){return\"M\"+(.5+e)+\",1 L\"+(.5+e)+\",.5 L0,.5 M\"+(.5-e)+\",.5 L\"+(.5-e)+\",1\"},j),\"╗\":(W={},W[1]=function(e,t){return\"M0,\"+(.5+t)+\" L\"+(.5-e)+\",\"+(.5+t)+\" L\"+(.5-e)+\",1 M0,\"+(.5-t)+\" L\"+(.5+e)+\",\"+(.5-t)+\" L\"+(.5+e)+\",1\"},W),\"╘\":(U={},U[1]=function(e,t){return\"M.5,0 L.5,\"+(.5+t)+\" L1,\"+(.5+t)+\" M.5,\"+(.5-t)+\" L1,\"+(.5-t)},U),\"╙\":(q={},q[1]=function(e,t){return\"M1,.5 L\"+(.5-e)+\",.5 L\"+(.5-e)+\",0 M\"+(.5+e)+\",.5 L\"+(.5+e)+\",0\"},q),\"╚\":(N={},N[1]=function(e,t){return\"M1,\"+(.5-t)+\" L\"+(.5+e)+\",\"+(.5-t)+\" L\"+(.5+e)+\",0 M1,\"+(.5+t)+\" L\"+(.5-e)+\",\"+(.5+t)+\" L\"+(.5-e)+\",0\"},N),\"╛\":(z={},z[1]=function(e,t){return\"M0,\"+(.5+t)+\" L.5,\"+(.5+t)+\" L.5,0 M0,\"+(.5-t)+\" L.5,\"+(.5-t)},z),\"╜\":(K={},K[1]=function(e,t){return\"M0,.5 L\"+(.5+e)+\",.5 L\"+(.5+e)+\",0 M\"+(.5-e)+\",.5 L\"+(.5-e)+\",0\"},K),\"╝\":(G={},G[1]=function(e,t){return\"M0,\"+(.5-t)+\" L\"+(.5-e)+\",\"+(.5-t)+\" L\"+(.5-e)+\",0 M0,\"+(.5+t)+\" L\"+(.5+e)+\",\"+(.5+t)+\" L\"+(.5+e)+\",0\"},G),\"╞\":(V={},V[1]=function(e,t){return\"M.5,0 L.5,1 M.5,\"+(.5-t)+\" L1,\"+(.5-t)+\" M.5,\"+(.5+t)+\" L1,\"+(.5+t)},V),\"╟\":(X={},X[1]=function(e,t){return\"M\"+(.5-e)+\",0 L\"+(.5-e)+\",1 M\"+(.5+e)+\",0 L\"+(.5+e)+\",1 M\"+(.5+e)+\",.5 L1,.5\"},X),\"╠\":(Y={},Y[1]=function(e,t){return\"M\"+(.5-e)+\",0 L\"+(.5-e)+\",1 M1,\"+(.5+t)+\" L\"+(.5+e)+\",\"+(.5+t)+\" L\"+(.5+e)+\",1 M1,\"+(.5-t)+\" L\"+(.5+e)+\",\"+(.5-t)+\" L\"+(.5+e)+\",0\"},Y),\"╡\":(Z={},Z[1]=function(e,t){return\"M.5,0 L.5,1 M0,\"+(.5-t)+\" L.5,\"+(.5-t)+\" M0,\"+(.5+t)+\" L.5,\"+(.5+t)},Z),\"╢\":(J={},J[1]=function(e,t){return\"M0,.5 L\"+(.5-e)+\",.5 M\"+(.5-e)+\",0 L\"+(.5-e)+\",1 M\"+(.5+e)+\",0 L\"+(.5+e)+\",1\"},J),\"╣\":($={},$[1]=function(e,t){return\"M\"+(.5+e)+\",0 L\"+(.5+e)+\",1 M0,\"+(.5+t)+\" L\"+(.5-e)+\",\"+(.5+t)+\" L\"+(.5-e)+\",1 M0,\"+(.5-t)+\" L\"+(.5-e)+\",\"+(.5-t)+\" L\"+(.5-e)+\",0\"},$),\"╤\":(Q={},Q[1]=function(e,t){return\"M0,\"+(.5-t)+\" L1,\"+(.5-t)+\" M0,\"+(.5+t)+\" L1,\"+(.5+t)+\" M.5,\"+(.5+t)+\" L.5,1\"},Q),\"╥\":(ee={},ee[1]=function(e,t){return\"M0,.5 L1,.5 M\"+(.5-e)+\",.5 L\"+(.5-e)+\",1 M\"+(.5+e)+\",.5 L\"+(.5+e)+\",1\"},ee),\"╦\":(te={},te[1]=function(e,t){return\"M0,\"+(.5-t)+\" L1,\"+(.5-t)+\" M0,\"+(.5+t)+\" L\"+(.5-e)+\",\"+(.5+t)+\" L\"+(.5-e)+\",1 M1,\"+(.5+t)+\" L\"+(.5+e)+\",\"+(.5+t)+\" L\"+(.5+e)+\",1\"},te),\"╧\":(re={},re[1]=function(e,t){return\"M.5,0 L.5,\"+(.5-t)+\" M0,\"+(.5-t)+\" L1,\"+(.5-t)+\" M0,\"+(.5+t)+\" L1,\"+(.5+t)},re),\"╨\":(ie={},ie[1]=function(e,t){return\"M0,.5 L1,.5 M\"+(.5-e)+\",.5 L\"+(.5-e)+\",0 M\"+(.5+e)+\",.5 L\"+(.5+e)+\",0\"},ie),\"╩\":(ne={},ne[1]=function(e,t){return\"M0,\"+(.5+t)+\" L1,\"+(.5+t)+\" M0,\"+(.5-t)+\" L\"+(.5-e)+\",\"+(.5-t)+\" L\"+(.5-e)+\",0 M1,\"+(.5-t)+\" L\"+(.5+e)+\",\"+(.5-t)+\" L\"+(.5+e)+\",0\"},ne),\"╪\":(oe={},oe[1]=function(e,t){return\"M.5,0 L.5,1 M0,\"+(.5-t)+\" L1,\"+(.5-t)+\" M0,\"+(.5+t)+\" L1,\"+(.5+t)},oe),\"╫\":(se={},se[1]=function(e,t){return\"M0,.5 L1,.5 M\"+(.5-e)+\",0 L\"+(.5-e)+\",1 M\"+(.5+e)+\",0 L\"+(.5+e)+\",1\"},se),\"╬\":(ae={},ae[1]=function(e,t){return\"M0,\"+(.5+t)+\" L\"+(.5-e)+\",\"+(.5+t)+\" L\"+(.5-e)+\",1 M1,\"+(.5+t)+\" L\"+(.5+e)+\",\"+(.5+t)+\" L\"+(.5+e)+\",1 M0,\"+(.5-t)+\" L\"+(.5-e)+\",\"+(.5-t)+\" L\"+(.5-e)+\",0 M1,\"+(.5-t)+\" L\"+(.5+e)+\",\"+(.5-t)+\" L\"+(.5+e)+\",0\"},ae),\"╱\":(ce={},ce[1]=\"M1,0 L0,1\",ce),\"╲\":(le={},le[1]=\"M0,0 L1,1\",le),\"╳\":(he={},he[1]=\"M1,0 L0,1 M0,0 L1,1\",he),\"╼\":(ue={},ue[1]=\"M.5,.5 L0,.5\",ue[3]=\"M.5,.5 L1,.5\",ue),\"╽\":(fe={},fe[1]=\"M.5,.5 L.5,0\",fe[3]=\"M.5,.5 L.5,1\",fe),\"╾\":(_e={},_e[1]=\"M.5,.5 L1,.5\",_e[3]=\"M.5,.5 L0,.5\",_e),\"╿\":(de={},de[1]=\"M.5,.5 L.5,1\",de[3]=\"M.5,.5 L.5,0\",de),\"┍\":(pe={},pe[1]=\"M.5,.5 L.5,1\",pe[3]=\"M.5,.5 L1,.5\",pe),\"┎\":(ve={},ve[1]=\"M.5,.5 L1,.5\",ve[3]=\"M.5,.5 L.5,1\",ve),\"┑\":(ge={},ge[1]=\"M.5,.5 L.5,1\",ge[3]=\"M.5,.5 L0,.5\",ge),\"┒\":(ye={},ye[1]=\"M.5,.5 L0,.5\",ye[3]=\"M.5,.5 L.5,1\",ye),\"┕\":(me={},me[1]=\"M.5,.5 L.5,0\",me[3]=\"M.5,.5 L1,.5\",me),\"┖\":(Se={},Se[1]=\"M.5,.5 L1,.5\",Se[3]=\"M.5,.5 L.5,0\",Se),\"┙\":(Ce={},Ce[1]=\"M.5,.5 L.5,0\",Ce[3]=\"M.5,.5 L0,.5\",Ce),\"┚\":(be={},be[1]=\"M.5,.5 L0,.5\",be[3]=\"M.5,.5 L.5,0\",be),\"┝\":(we={},we[1]=\"M.5,0 L.5,1\",we[3]=\"M.5,.5 L1,.5\",we),\"┞\":(Le={},Le[1]=\"M0.5,1 L.5,.5 L1,.5\",Le[3]=\"M.5,.5 L.5,0\",Le),\"┟\":(Ee={},Ee[1]=\"M.5,0 L.5,.5 L1,.5\",Ee[3]=\"M.5,.5 L.5,1\",Ee),\"┠\":(xe={},xe[1]=\"M.5,.5 L1,.5\",xe[3]=\"M.5,0 L.5,1\",xe),\"┡\":(ke={},ke[1]=\"M.5,.5 L.5,1\",ke[3]=\"M.5,0 L.5,.5 L1,.5\",ke),\"┢\":(Me={},Me[1]=\"M.5,.5 L.5,0\",Me[3]=\"M0.5,1 L.5,.5 L1,.5\",Me),\"┥\":(Ae={},Ae[1]=\"M.5,0 L.5,1\",Ae[3]=\"M.5,.5 L0,.5\",Ae),\"┦\":(Re={},Re[1]=\"M0,.5 L.5,.5 L.5,1\",Re[3]=\"M.5,.5 L.5,0\",Re),\"┧\":(Oe={},Oe[1]=\"M.5,0 L.5,.5 L0,.5\",Oe[3]=\"M.5,.5 L.5,1\",Oe),\"┨\":(Te={},Te[1]=\"M.5,.5 L0,.5\",Te[3]=\"M.5,0 L.5,1\",Te),\"┩\":(De={},De[1]=\"M.5,.5 L.5,1\",De[3]=\"M.5,0 L.5,.5 L0,.5\",De),\"┪\":(Be={},Be[1]=\"M.5,.5 L.5,0\",Be[3]=\"M0,.5 L.5,.5 L.5,1\",Be),\"┭\":(Pe={},Pe[1]=\"M0.5,1 L.5,.5 L1,.5\",Pe[3]=\"M.5,.5 L0,.5\",Pe),\"┮\":(Ie={},Ie[1]=\"M0,.5 L.5,.5 L.5,1\",Ie[3]=\"M.5,.5 L1,.5\",Ie),\"┯\":(He={},He[1]=\"M.5,.5 L.5,1\",He[3]=\"M0,.5 L1,.5\",He),\"┰\":(Fe={},Fe[1]=\"M0,.5 L1,.5\",Fe[3]=\"M.5,.5 L.5,1\",Fe),\"┱\":(je={},je[1]=\"M.5,.5 L1,.5\",je[3]=\"M0,.5 L.5,.5 L.5,1\",je),\"┲\":(We={},We[1]=\"M.5,.5 L0,.5\",We[3]=\"M0.5,1 L.5,.5 L1,.5\",We),\"┵\":(Ue={},Ue[1]=\"M.5,0 L.5,.5 L1,.5\",Ue[3]=\"M.5,.5 L0,.5\",Ue),\"┶\":(qe={},qe[1]=\"M.5,0 L.5,.5 L0,.5\",qe[3]=\"M.5,.5 L1,.5\",qe),\"┷\":(Ne={},Ne[1]=\"M.5,.5 L.5,0\",Ne[3]=\"M0,.5 L1,.5\",Ne),\"┸\":(ze={},ze[1]=\"M0,.5 L1,.5\",ze[3]=\"M.5,.5 L.5,0\",ze),\"┹\":(Ke={},Ke[1]=\"M.5,.5 L1,.5\",Ke[3]=\"M.5,0 L.5,.5 L0,.5\",Ke),\"┺\":(Ge={},Ge[1]=\"M.5,.5 L0,.5\",Ge[3]=\"M.5,0 L.5,.5 L1,.5\",Ge),\"┽\":(Ve={},Ve[1]=\"M.5,0 L.5,1 M.5,.5 L1,.5\",Ve[3]=\"M.5,.5 L0,.5\",Ve),\"┾\":(Xe={},Xe[1]=\"M.5,0 L.5,1 M.5,.5 L0,.5\",Xe[3]=\"M.5,.5 L1,.5\",Xe),\"┿\":(Ye={},Ye[1]=\"M.5,0 L.5,1\",Ye[3]=\"M0,.5 L1,.5\",Ye),\"╀\":(Ze={},Ze[1]=\"M0,.5 L1,.5 M.5,.5 L.5,1\",Ze[3]=\"M.5,.5 L.5,0\",Ze),\"╁\":(Je={},Je[1]=\"M.5,.5 L.5,0 M0,.5 L1,.5\",Je[3]=\"M.5,.5 L.5,1\",Je),\"╂\":($e={},$e[1]=\"M0,.5 L1,.5\",$e[3]=\"M.5,0 L.5,1\",$e),\"╃\":(Qe={},Qe[1]=\"M0.5,1 L.5,.5 L1,.5\",Qe[3]=\"M.5,0 L.5,.5 L0,.5\",Qe),\"╄\":(et={},et[1]=\"M0,.5 L.5,.5 L.5,1\",et[3]=\"M.5,0 L.5,.5 L1,.5\",et),\"╅\":(tt={},tt[1]=\"M.5,0 L.5,.5 L1,.5\",tt[3]=\"M0,.5 L.5,.5 L.5,1\",tt),\"╆\":(rt={},rt[1]=\"M.5,0 L.5,.5 L0,.5\",rt[3]=\"M0.5,1 L.5,.5 L1,.5\",rt),\"╇\":(it={},it[1]=\"M.5,.5 L.5,1\",it[3]=\"M.5,.5 L.5,0 M0,.5 L1,.5\",it),\"╈\":(nt={},nt[1]=\"M.5,.5 L.5,0\",nt[3]=\"M0,.5 L1,.5 M.5,.5 L.5,1\",nt),\"╉\":(ot={},ot[1]=\"M.5,.5 L1,.5\",ot[3]=\"M.5,0 L.5,1 M.5,.5 L0,.5\",ot),\"╊\":(st={},st[1]=\"M.5,.5 L0,.5\",st[3]=\"M.5,0 L.5,1 M.5,.5 L1,.5\",st),\"╌\":(at={},at[1]=\"M.1,.5 L.4,.5 M.6,.5 L.9,.5\",at),\"╍\":(ct={},ct[3]=\"M.1,.5 L.4,.5 M.6,.5 L.9,.5\",ct),\"┄\":(lt={},lt[1]=\"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5\",lt),\"┅\":(ht={},ht[3]=\"M.0667,.5 L.2667,.5 M.4,.5 L.6,.5 M.7333,.5 L.9333,.5\",ht),\"┈\":(ut={},ut[1]=\"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5\",ut),\"┉\":(ft={},ft[3]=\"M.05,.5 L.2,.5 M.3,.5 L.45,.5 M.55,.5 L.7,.5 M.8,.5 L.95,.5\",ft),\"╎\":(_t={},_t[1]=\"M.5,.1 L.5,.4 M.5,.6 L.5,.9\",_t),\"╏\":(dt={},dt[3]=\"M.5,.1 L.5,.4 M.5,.6 L.5,.9\",dt),\"┆\":(pt={},pt[1]=\"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333\",pt),\"┇\":(vt={},vt[3]=\"M.5,.0667 L.5,.2667 M.5,.4 L.5,.6 M.5,.7333 L.5,.9333\",vt),\"┊\":(gt={},gt[1]=\"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95\",gt),\"┋\":(yt={},yt[3]=\"M.5,.05 L.5,.2 M.5,.3 L.5,.45 L.5,.55 M.5,.7 L.5,.95\",yt),\"╭\":(mt={},mt[1]=\"C.5,1,.5,.5,1,.5\",mt),\"╮\":(St={},St[1]=\"C.5,1,.5,.5,0,.5\",St),\"╯\":(Ct={},Ct[1]=\"C.5,0,.5,.5,0,.5\",Ct),\"╰\":(bt={},bt[1]=\"C.5,0,.5,.5,1,.5\",bt)},t.tryDrawCustomChar=function(e,r,i,n,o,s){var a=t.blockElementDefinitions[r];if(a)return function(e,t,r,i,n,o){for(var s=0;s<t.length;s++){var a=t[s],c=n/8,l=o/8;e.fillRect(r+a.x*c,i+a.y*l,a.w*c,a.h*l)}}(e,a,i,n,o,s),!0;var c=Lt[r];if(c)return function(e,t,r,i,n,o){var s,a=Et.get(t);a||(a=new Map,Et.set(t,a));var c=e.fillStyle;if(\"string\"!=typeof c)throw new Error('Unexpected fillStyle type \"'+c+'\"');var l=a.get(c);if(!l){var h=t[0].length,u=t.length,f=document.createElement(\"canvas\");f.width=h,f.height=u;var _=(0,wt.throwIfFalsy)(f.getContext(\"2d\")),d=new ImageData(h,u),p=void 0,v=void 0,g=void 0,y=void 0;if(c.startsWith(\"#\"))p=parseInt(c.substr(1,2),16),v=parseInt(c.substr(3,2),16),g=parseInt(c.substr(5,2),16),y=c.length>7&&parseInt(c.substr(7,2),16)||1;else{if(!c.startsWith(\"rgba\"))throw new Error('Unexpected fillStyle color format \"'+c+'\" when drawing pattern glyph');p=(s=c.substring(5,c.length-1).split(\",\").map((function(e){return parseFloat(e)})))[0],v=s[1],g=s[2],y=s[3]}for(var m=0;m<u;m++)for(var S=0;S<h;S++)d.data[4*(m*h+S)]=p,d.data[4*(m*h+S)+1]=v,d.data[4*(m*h+S)+2]=g,d.data[4*(m*h+S)+3]=t[m][S]*(255*y);_.putImageData(d,0,0),l=(0,wt.throwIfFalsy)(e.createPattern(f,null)),a.set(c,l)}e.fillStyle=l,e.fillRect(r,i,n,o)}(e,c,i,n,o,s),!0;var l=t.boxDrawingDefinitions[r];return!!l&&(function(e,t,r,i,n,o){e.strokeStyle=e.fillStyle;for(var s=0,a=Object.entries(t);s<a.length;s++){var c=a[s],l=c[0],h=c[1];e.beginPath(),e.lineWidth=window.devicePixelRatio*Number.parseInt(l);for(var u=0,f=(\"function\"==typeof h?h(.15,.15/o*n):h).split(\" \");u<f.length;u++){var _=f[u],d=_[0],p=kt[d];if(p){var v=_.substring(1).split(\",\");v[0]&&v[1]&&p(e,Mt(v,n,o,r,i))}else console.error('Could not find drawing instructions for \"'+d+'\"')}e.stroke(),e.closePath()}}(e,l,i,n,o,s),!0)};var Et=new Map;function xt(e,t,r){return void 0===r&&(r=0),Math.max(Math.min(e,t),r)}var kt={C:function(e,t){return e.bezierCurveTo(t[0],t[1],t[2],t[3],t[4],t[5])},L:function(e,t){return e.lineTo(t[0],t[1])},M:function(e,t){return e.moveTo(t[0],t[1])}};function Mt(e,t,r,i,n){var o=e.map((function(e){return parseFloat(e)||parseInt(e)}));if(o.length<2)throw new Error(\"Too few arguments for instruction\");for(var s=0;s<o.length;s+=2)o[s]*=t,0!==o[s]&&(o[s]=xt(Math.round(o[s]+.5)-.5,t,0)),o[s]+=i;for(var a=1;a<o.length;a+=2)o[a]*=r,0!==o[a]&&(o[a]=xt(Math.round(o[a]+.5)-.5,r,0)),o[a]+=n;return o}},3700:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.GridCache=void 0;var r=function(){function e(){this.cache=[]}return e.prototype.resize=function(e,t){for(var r=0;r<e;r++){this.cache.length<=r&&this.cache.push([]);for(var i=this.cache[r].length;i<t;i++)this.cache[r].push(void 0);this.cache[r].length=t}this.cache.length=e},e.prototype.clear=function(){for(var e=0;e<this.cache.length;e++)for(var t=0;t<this.cache[e].length;t++)this.cache[e][t]=void 0},e}();t.GridCache=r},5098:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},s=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.LinkRenderLayer=void 0;var a=r(1546),c=r(8803),l=r(2040),h=r(2585),u=function(e){function t(t,r,i,n,o,s,a,c){var l=e.call(this,t,\"link\",r,!0,i,n,a,c)||this;return o.onShowLinkUnderline((function(e){return l._onShowLinkUnderline(e)})),o.onHideLinkUnderline((function(e){return l._onHideLinkUnderline(e)})),s.onShowLinkUnderline((function(e){return l._onShowLinkUnderline(e)})),s.onHideLinkUnderline((function(e){return l._onHideLinkUnderline(e)})),l}return n(t,e),t.prototype.resize=function(t){e.prototype.resize.call(this,t),this._state=void 0},t.prototype.reset=function(){this._clearCurrentLink()},t.prototype._clearCurrentLink=function(){if(this._state){this._clearCells(this._state.x1,this._state.y1,this._state.cols-this._state.x1,1);var e=this._state.y2-this._state.y1-1;e>0&&this._clearCells(0,this._state.y1+1,this._state.cols,e),this._clearCells(0,this._state.y2,this._state.x2,1),this._state=void 0}},t.prototype._onShowLinkUnderline=function(e){if(e.fg===c.INVERTED_DEFAULT_COLOR?this._ctx.fillStyle=this._colors.background.css:e.fg&&(0,l.is256Color)(e.fg)?this._ctx.fillStyle=this._colors.ansi[e.fg].css:this._ctx.fillStyle=this._colors.foreground.css,e.y1===e.y2)this._fillBottomLineAtCells(e.x1,e.y1,e.x2-e.x1);else{this._fillBottomLineAtCells(e.x1,e.y1,e.cols-e.x1);for(var t=e.y1+1;t<e.y2;t++)this._fillBottomLineAtCells(0,t,e.cols);this._fillBottomLineAtCells(0,e.y2,e.x2)}this._state=e},t.prototype._onHideLinkUnderline=function(e){this._clearCurrentLink()},o([s(6,h.IBufferService),s(7,h.IOptionsService)],t)}(a.BaseRenderLayer);t.LinkRenderLayer=u},3525:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},s=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.Renderer=void 0;var a=r(9596),c=r(4149),l=r(2512),h=r(5098),u=r(844),f=r(4725),_=r(2585),d=r(1420),p=r(8460),v=1,g=function(e){function t(t,r,i,n,o,s,u,f){var _=e.call(this)||this;_._colors=t,_._screenElement=r,_._bufferService=s,_._charSizeService=u,_._optionsService=f,_._id=v++,_._onRequestRedraw=new p.EventEmitter;var d=_._optionsService.rawOptions.allowTransparency;return _._renderLayers=[o.createInstance(a.TextRenderLayer,_._screenElement,0,_._colors,d,_._id),o.createInstance(c.SelectionRenderLayer,_._screenElement,1,_._colors,_._id),o.createInstance(h.LinkRenderLayer,_._screenElement,2,_._colors,_._id,i,n),o.createInstance(l.CursorRenderLayer,_._screenElement,3,_._colors,_._id,_._onRequestRedraw)],_.dimensions={scaledCharWidth:0,scaledCharHeight:0,scaledCellWidth:0,scaledCellHeight:0,scaledCharLeft:0,scaledCharTop:0,scaledCanvasWidth:0,scaledCanvasHeight:0,canvasWidth:0,canvasHeight:0,actualCellWidth:0,actualCellHeight:0},_._devicePixelRatio=window.devicePixelRatio,_._updateDimensions(),_.onOptionsChanged(),_}return n(t,e),Object.defineProperty(t.prototype,\"onRequestRedraw\",{get:function(){return this._onRequestRedraw.event},enumerable:!1,configurable:!0}),t.prototype.dispose=function(){for(var t=0,r=this._renderLayers;t<r.length;t++)r[t].dispose();e.prototype.dispose.call(this),(0,d.removeTerminalFromCache)(this._id)},t.prototype.onDevicePixelRatioChange=function(){this._devicePixelRatio!==window.devicePixelRatio&&(this._devicePixelRatio=window.devicePixelRatio,this.onResize(this._bufferService.cols,this._bufferService.rows))},t.prototype.setColors=function(e){this._colors=e;for(var t=0,r=this._renderLayers;t<r.length;t++){var i=r[t];i.setColors(this._colors),i.reset()}},t.prototype.onResize=function(e,t){this._updateDimensions();for(var r=0,i=this._renderLayers;r<i.length;r++)i[r].resize(this.dimensions);this._screenElement.style.width=this.dimensions.canvasWidth+\"px\",this._screenElement.style.height=this.dimensions.canvasHeight+\"px\"},t.prototype.onCharSizeChanged=function(){this.onResize(this._bufferService.cols,this._bufferService.rows)},t.prototype.onBlur=function(){this._runOperation((function(e){return e.onBlur()}))},t.prototype.onFocus=function(){this._runOperation((function(e){return e.onFocus()}))},t.prototype.onSelectionChanged=function(e,t,r){void 0===r&&(r=!1),this._runOperation((function(i){return i.onSelectionChanged(e,t,r)}))},t.prototype.onCursorMove=function(){this._runOperation((function(e){return e.onCursorMove()}))},t.prototype.onOptionsChanged=function(){this._runOperation((function(e){return e.onOptionsChanged()}))},t.prototype.clear=function(){this._runOperation((function(e){return e.reset()}))},t.prototype._runOperation=function(e){for(var t=0,r=this._renderLayers;t<r.length;t++)e(r[t])},t.prototype.renderRows=function(e,t){for(var r=0,i=this._renderLayers;r<i.length;r++)i[r].onGridChanged(e,t)},t.prototype.clearTextureAtlas=function(){for(var e=0,t=this._renderLayers;e<t.length;e++)t[e].clearTextureAtlas()},t.prototype._updateDimensions=function(){this._charSizeService.hasValidSize&&(this.dimensions.scaledCharWidth=Math.floor(this._charSizeService.width*window.devicePixelRatio),this.dimensions.scaledCharHeight=Math.ceil(this._charSizeService.height*window.devicePixelRatio),this.dimensions.scaledCellHeight=Math.floor(this.dimensions.scaledCharHeight*this._optionsService.rawOptions.lineHeight),this.dimensions.scaledCharTop=1===this._optionsService.rawOptions.lineHeight?0:Math.round((this.dimensions.scaledCellHeight-this.dimensions.scaledCharHeight)/2),this.dimensions.scaledCellWidth=this.dimensions.scaledCharWidth+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.scaledCharLeft=Math.floor(this._optionsService.rawOptions.letterSpacing/2),this.dimensions.scaledCanvasHeight=this._bufferService.rows*this.dimensions.scaledCellHeight,this.dimensions.scaledCanvasWidth=this._bufferService.cols*this.dimensions.scaledCellWidth,this.dimensions.canvasHeight=Math.round(this.dimensions.scaledCanvasHeight/window.devicePixelRatio),this.dimensions.canvasWidth=Math.round(this.dimensions.scaledCanvasWidth/window.devicePixelRatio),this.dimensions.actualCellHeight=this.dimensions.canvasHeight/this._bufferService.rows,this.dimensions.actualCellWidth=this.dimensions.canvasWidth/this._bufferService.cols)},o([s(4,_.IInstantiationService),s(5,_.IBufferService),s(6,f.ICharSizeService),s(7,_.IOptionsService)],t)}(u.Disposable);t.Renderer=g},1752:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.throwIfFalsy=void 0,t.throwIfFalsy=function(e){if(!e)throw new Error(\"value must not be falsy\");return e}},4149:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},s=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.SelectionRenderLayer=void 0;var a=r(1546),c=r(2585),l=function(e){function t(t,r,i,n,o,s){var a=e.call(this,t,\"selection\",r,!0,i,n,o,s)||this;return a._clearState(),a}return n(t,e),t.prototype._clearState=function(){this._state={start:void 0,end:void 0,columnSelectMode:void 0,ydisp:void 0}},t.prototype.resize=function(t){e.prototype.resize.call(this,t),this._clearState()},t.prototype.reset=function(){this._state.start&&this._state.end&&(this._clearState(),this._clearAll())},t.prototype.onSelectionChanged=function(e,t,r){if(this._didStateChange(e,t,r,this._bufferService.buffer.ydisp))if(this._clearAll(),e&&t){var i=e[1]-this._bufferService.buffer.ydisp,n=t[1]-this._bufferService.buffer.ydisp,o=Math.max(i,0),s=Math.min(n,this._bufferService.rows-1);if(o>=this._bufferService.rows||s<0)this._state.ydisp=this._bufferService.buffer.ydisp;else{if(this._ctx.fillStyle=this._colors.selectionTransparent.css,r){var a=e[0],c=t[0]-a,l=s-o+1;this._fillCells(a,o,c,l)}else{a=i===o?e[0]:0;var h=o===n?t[0]:this._bufferService.cols;this._fillCells(a,o,h-a,1);var u=Math.max(s-o-1,0);if(this._fillCells(0,o+1,this._bufferService.cols,u),o!==s){var f=n===s?t[0]:this._bufferService.cols;this._fillCells(0,s,f,1)}}this._state.start=[e[0],e[1]],this._state.end=[t[0],t[1]],this._state.columnSelectMode=r,this._state.ydisp=this._bufferService.buffer.ydisp}}else this._clearState()},t.prototype._didStateChange=function(e,t,r,i){return!this._areCoordinatesEqual(e,this._state.start)||!this._areCoordinatesEqual(t,this._state.end)||r!==this._state.columnSelectMode||i!==this._state.ydisp},t.prototype._areCoordinatesEqual=function(e,t){return!(!e||!t)&&e[0]===t[0]&&e[1]===t[1]},o([s(4,c.IBufferService),s(5,c.IOptionsService)],t)}(a.BaseRenderLayer);t.SelectionRenderLayer=l},9596:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},s=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.TextRenderLayer=void 0;var a=r(3700),c=r(1546),l=r(3734),h=r(643),u=r(511),f=r(2585),_=r(4725),d=r(4269),p=function(e){function t(t,r,i,n,o,s,c,l){var h=e.call(this,t,\"text\",r,n,i,o,s,c)||this;return h._characterJoinerService=l,h._characterWidth=0,h._characterFont=\"\",h._characterOverlapCache={},h._workCell=new u.CellData,h._state=new a.GridCache,h}return n(t,e),t.prototype.resize=function(t){e.prototype.resize.call(this,t);var r=this._getFont(!1,!1);this._characterWidth===t.scaledCharWidth&&this._characterFont===r||(this._characterWidth=t.scaledCharWidth,this._characterFont=r,this._characterOverlapCache={}),this._state.clear(),this._state.resize(this._bufferService.cols,this._bufferService.rows)},t.prototype.reset=function(){this._state.clear(),this._clearAll()},t.prototype._forEachCell=function(e,t,r){for(var i=e;i<=t;i++)for(var n=i+this._bufferService.buffer.ydisp,o=this._bufferService.buffer.lines.get(n),s=this._characterJoinerService.getJoinedCharacters(n),a=0;a<this._bufferService.cols;a++){o.loadCell(a,this._workCell);var c=this._workCell,l=!1,u=a;if(0!==c.getWidth()){if(s.length>0&&a===s[0][0]){l=!0;var f=s.shift();c=new d.JoinedCellData(this._workCell,o.translateToString(!0,f[0],f[1]),f[1]-f[0]),u=f[1]-1}!l&&this._isOverlapping(c)&&u<o.length-1&&o.getCodePoint(u+1)===h.NULL_CELL_CODE&&(c.content&=-12582913,c.content|=2<<22),r(c,a,i),a=u}}},t.prototype._drawBackground=function(e,t){var r=this,i=this._ctx,n=this._bufferService.cols,o=0,s=0,a=null;i.save(),this._forEachCell(e,t,(function(e,t,c){var h=null;e.isInverse()?h=e.isFgDefault()?r._colors.foreground.css:e.isFgRGB()?\"rgb(\"+l.AttributeData.toColorRGB(e.getFgColor()).join(\",\")+\")\":r._colors.ansi[e.getFgColor()].css:e.isBgRGB()?h=\"rgb(\"+l.AttributeData.toColorRGB(e.getBgColor()).join(\",\")+\")\":e.isBgPalette()&&(h=r._colors.ansi[e.getBgColor()].css),null===a&&(o=t,s=c),c!==s?(i.fillStyle=a||\"\",r._fillCells(o,s,n-o,1),o=t,s=c):a!==h&&(i.fillStyle=a||\"\",r._fillCells(o,s,t-o,1),o=t,s=c),a=h})),null!==a&&(i.fillStyle=a,this._fillCells(o,s,n-o,1)),i.restore()},t.prototype._drawForeground=function(e,t){var r=this;this._forEachCell(e,t,(function(e,t,i){if(!e.isInvisible()&&(r._drawChars(e,t,i),e.isUnderline()||e.isStrikethrough())){if(r._ctx.save(),e.isInverse())if(e.isBgDefault())r._ctx.fillStyle=r._colors.background.css;else if(e.isBgRGB())r._ctx.fillStyle=\"rgb(\"+l.AttributeData.toColorRGB(e.getBgColor()).join(\",\")+\")\";else{var n=e.getBgColor();r._optionsService.rawOptions.drawBoldTextInBrightColors&&e.isBold()&&n<8&&(n+=8),r._ctx.fillStyle=r._colors.ansi[n].css}else if(e.isFgDefault())r._ctx.fillStyle=r._colors.foreground.css;else if(e.isFgRGB())r._ctx.fillStyle=\"rgb(\"+l.AttributeData.toColorRGB(e.getFgColor()).join(\",\")+\")\";else{var o=e.getFgColor();r._optionsService.rawOptions.drawBoldTextInBrightColors&&e.isBold()&&o<8&&(o+=8),r._ctx.fillStyle=r._colors.ansi[o].css}e.isStrikethrough()&&r._fillMiddleLineAtCells(t,i,e.getWidth()),e.isUnderline()&&r._fillBottomLineAtCells(t,i,e.getWidth()),r._ctx.restore()}}))},t.prototype.onGridChanged=function(e,t){0!==this._state.cache.length&&(this._charAtlas&&this._charAtlas.beginFrame(),this._clearCells(0,e,this._bufferService.cols,t-e+1),this._drawBackground(e,t),this._drawForeground(e,t))},t.prototype.onOptionsChanged=function(){this._setTransparency(this._optionsService.rawOptions.allowTransparency)},t.prototype._isOverlapping=function(e){if(1!==e.getWidth())return!1;if(e.getCode()<256)return!1;var t=e.getChars();if(this._characterOverlapCache.hasOwnProperty(t))return this._characterOverlapCache[t];this._ctx.save(),this._ctx.font=this._characterFont;var r=Math.floor(this._ctx.measureText(t).width)>this._characterWidth;return this._ctx.restore(),this._characterOverlapCache[t]=r,r},o([s(5,f.IBufferService),s(6,f.IOptionsService),s(7,_.ICharacterJoinerService)],t)}(c.BaseRenderLayer);t.TextRenderLayer=p},9616:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BaseCharAtlas=void 0;var r=function(){function e(){this._didWarmUp=!1}return e.prototype.dispose=function(){},e.prototype.warmUp=function(){this._didWarmUp||(this._doWarmUp(),this._didWarmUp=!0)},e.prototype._doWarmUp=function(){},e.prototype.clear=function(){},e.prototype.beginFrame=function(){},e}();t.BaseCharAtlas=r},1420:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.removeTerminalFromCache=t.acquireCharAtlas=void 0;var i=r(2040),n=r(1906),o=[];t.acquireCharAtlas=function(e,t,r,s,a){for(var c=(0,i.generateConfig)(s,a,e,r),l=0;l<o.length;l++){var h=(u=o[l]).ownedBy.indexOf(t);if(h>=0){if((0,i.configEquals)(u.config,c))return u.atlas;1===u.ownedBy.length?(u.atlas.dispose(),o.splice(l,1)):u.ownedBy.splice(h,1);break}}for(l=0;l<o.length;l++){var u=o[l];if((0,i.configEquals)(u.config,c))return u.ownedBy.push(t),u.atlas}var f={atlas:new n.DynamicCharAtlas(document,c),config:c,ownedBy:[t]};return o.push(f),f.atlas},t.removeTerminalFromCache=function(e){for(var t=0;t<o.length;t++){var r=o[t].ownedBy.indexOf(e);if(-1!==r){1===o[t].ownedBy.length?(o[t].atlas.dispose(),o.splice(t,1)):o[t].ownedBy.splice(r,1);break}}}},2040:function(e,t,r){var i=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var i,n=0,o=t.length;n<o;n++)!i&&n in t||(i||(i=Array.prototype.slice.call(t,0,n)),i[n]=t[n]);return e.concat(i||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.is256Color=t.configEquals=t.generateConfig=void 0;var n=r(643);t.generateConfig=function(e,t,r,n){var o={foreground:n.foreground,background:n.background,cursor:void 0,cursorAccent:void 0,selection:void 0,ansi:i([],n.ansi,!0)};return{devicePixelRatio:window.devicePixelRatio,scaledCharWidth:e,scaledCharHeight:t,fontFamily:r.fontFamily,fontSize:r.fontSize,fontWeight:r.fontWeight,fontWeightBold:r.fontWeightBold,allowTransparency:r.allowTransparency,colors:o}},t.configEquals=function(e,t){for(var r=0;r<e.colors.ansi.length;r++)if(e.colors.ansi[r].rgba!==t.colors.ansi[r].rgba)return!1;return e.devicePixelRatio===t.devicePixelRatio&&e.fontFamily===t.fontFamily&&e.fontSize===t.fontSize&&e.fontWeight===t.fontWeight&&e.fontWeightBold===t.fontWeightBold&&e.allowTransparency===t.allowTransparency&&e.scaledCharWidth===t.scaledCharWidth&&e.scaledCharHeight===t.scaledCharHeight&&e.colors.foreground===t.colors.foreground&&e.colors.background===t.colors.background},t.is256Color=function(e){return e<n.DEFAULT_COLOR}},8803:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.CHAR_ATLAS_CELL_SPACING=t.TEXT_BASELINE=t.DIM_OPACITY=t.INVERTED_DEFAULT_COLOR=void 0;var i=r(6114);t.INVERTED_DEFAULT_COLOR=257,t.DIM_OPACITY=.5,t.TEXT_BASELINE=i.isFirefox||i.isLegacyEdge?\"bottom\":\"ideographic\",t.CHAR_ATLAS_CELL_SPACING=1},1906:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,\"__esModule\",{value:!0}),t.NoneCharAtlas=t.DynamicCharAtlas=t.getGlyphCacheKey=void 0;var o=r(8803),s=r(9616),a=r(5680),c=r(7001),l=r(6114),h=r(1752),u=r(4774),f=1024,_=1024,d={css:\"rgba(0, 0, 0, 0)\",rgba:0};function p(e){return e.code<<21|e.bg<<12|e.fg<<3|(e.bold?0:4)+(e.dim?0:2)+(e.italic?0:1)}t.getGlyphCacheKey=p;var v=function(e){function t(t,r){var i=e.call(this)||this;i._config=r,i._drawToCacheCount=0,i._glyphsWaitingOnBitmap=[],i._bitmapCommitTimeout=null,i._bitmap=null,i._cacheCanvas=t.createElement(\"canvas\"),i._cacheCanvas.width=f,i._cacheCanvas.height=_,i._cacheCtx=(0,h.throwIfFalsy)(i._cacheCanvas.getContext(\"2d\",{alpha:!0}));var n=t.createElement(\"canvas\");n.width=i._config.scaledCharWidth,n.height=i._config.scaledCharHeight,i._tmpCtx=(0,h.throwIfFalsy)(n.getContext(\"2d\",{alpha:i._config.allowTransparency})),i._width=Math.floor(f/i._config.scaledCharWidth),i._height=Math.floor(_/i._config.scaledCharHeight);var o=i._width*i._height;return i._cacheMap=new c.LRUMap(o),i._cacheMap.prealloc(o),i}return n(t,e),t.prototype.dispose=function(){null!==this._bitmapCommitTimeout&&(window.clearTimeout(this._bitmapCommitTimeout),this._bitmapCommitTimeout=null)},t.prototype.beginFrame=function(){this._drawToCacheCount=0},t.prototype.clear=function(){if(this._cacheMap.size>0){var e=this._width*this._height;this._cacheMap=new c.LRUMap(e),this._cacheMap.prealloc(e)}this._cacheCtx.clearRect(0,0,f,_),this._tmpCtx.clearRect(0,0,this._config.scaledCharWidth,this._config.scaledCharHeight)},t.prototype.draw=function(e,t,r,i){if(32===t.code)return!0;if(!this._canCache(t))return!1;var n=p(t),o=this._cacheMap.get(n);if(null!=o)return this._drawFromCache(e,o,r,i),!0;if(this._drawToCacheCount<100){var s;s=this._cacheMap.size<this._cacheMap.capacity?this._cacheMap.size:this._cacheMap.peek().index;var a=this._drawToCache(t,s);return this._cacheMap.set(n,a),this._drawFromCache(e,a,r,i),!0}return!1},t.prototype._canCache=function(e){return e.code<256},t.prototype._toCoordinateX=function(e){return e%this._width*this._config.scaledCharWidth},t.prototype._toCoordinateY=function(e){return Math.floor(e/this._width)*this._config.scaledCharHeight},t.prototype._drawFromCache=function(e,t,r,i){if(!t.isEmpty){var n=this._toCoordinateX(t.index),o=this._toCoordinateY(t.index);e.drawImage(t.inBitmap?this._bitmap:this._cacheCanvas,n,o,this._config.scaledCharWidth,this._config.scaledCharHeight,r,i,this._config.scaledCharWidth,this._config.scaledCharHeight)}},t.prototype._getColorFromAnsiIndex=function(e){return e<this._config.colors.ansi.length?this._config.colors.ansi[e]:a.DEFAULT_ANSI_COLORS[e]},t.prototype._getBackgroundColor=function(e){return this._config.allowTransparency?d:e.bg===o.INVERTED_DEFAULT_COLOR?this._config.colors.foreground:e.bg<256?this._getColorFromAnsiIndex(e.bg):this._config.colors.background},t.prototype._getForegroundColor=function(e){return e.fg===o.INVERTED_DEFAULT_COLOR?u.color.opaque(this._config.colors.background):e.fg<256?this._getColorFromAnsiIndex(e.fg):this._config.colors.foreground},t.prototype._drawToCache=function(e,t){this._drawToCacheCount++,this._tmpCtx.save();var r=this._getBackgroundColor(e);this._tmpCtx.globalCompositeOperation=\"copy\",this._tmpCtx.fillStyle=r.css,this._tmpCtx.fillRect(0,0,this._config.scaledCharWidth,this._config.scaledCharHeight),this._tmpCtx.globalCompositeOperation=\"source-over\";var i=e.bold?this._config.fontWeightBold:this._config.fontWeight,n=e.italic?\"italic\":\"\";this._tmpCtx.font=n+\" \"+i+\" \"+this._config.fontSize*this._config.devicePixelRatio+\"px \"+this._config.fontFamily,this._tmpCtx.textBaseline=o.TEXT_BASELINE,this._tmpCtx.fillStyle=this._getForegroundColor(e).css,e.dim&&(this._tmpCtx.globalAlpha=o.DIM_OPACITY),this._tmpCtx.fillText(e.chars,0,this._config.scaledCharHeight);var s=this._tmpCtx.getImageData(0,0,this._config.scaledCharWidth,this._config.scaledCharHeight),a=!1;if(this._config.allowTransparency||(a=y(s,r)),a&&\"_\"===e.chars&&!this._config.allowTransparency)for(var c=1;c<=5&&(this._tmpCtx.fillText(e.chars,0,this._config.scaledCharHeight-c),a=y(s=this._tmpCtx.getImageData(0,0,this._config.scaledCharWidth,this._config.scaledCharHeight),r));c++);this._tmpCtx.restore();var l=this._toCoordinateX(t),h=this._toCoordinateY(t);this._cacheCtx.putImageData(s,l,h);var u={index:t,isEmpty:a,inBitmap:!1};return this._addGlyphToBitmap(u),u},t.prototype._addGlyphToBitmap=function(e){var t=this;!(\"createImageBitmap\"in window)||l.isFirefox||l.isSafari||(this._glyphsWaitingOnBitmap.push(e),null===this._bitmapCommitTimeout&&(this._bitmapCommitTimeout=window.setTimeout((function(){return t._generateBitmap()}),100)))},t.prototype._generateBitmap=function(){var e=this,t=this._glyphsWaitingOnBitmap;this._glyphsWaitingOnBitmap=[],window.createImageBitmap(this._cacheCanvas).then((function(r){e._bitmap=r;for(var i=0;i<t.length;i++)t[i].inBitmap=!0})),this._bitmapCommitTimeout=null},t}(s.BaseCharAtlas);t.DynamicCharAtlas=v;var g=function(e){function t(t,r){return e.call(this)||this}return n(t,e),t.prototype.draw=function(e,t,r,i){return!1},t}(s.BaseCharAtlas);function y(e,t){for(var r=!0,i=t.rgba>>>24,n=t.rgba>>>16&255,o=t.rgba>>>8&255,s=0;s<e.data.length;s+=4)e.data[s]===i&&e.data[s+1]===n&&e.data[s+2]===o?e.data[s+3]=0:r=!1;return r}t.NoneCharAtlas=g},7001:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.LRUMap=void 0;var r=function(){function e(e){this.capacity=e,this._map={},this._head=null,this._tail=null,this._nodePool=[],this.size=0}return e.prototype._unlinkNode=function(e){var t=e.prev,r=e.next;e===this._head&&(this._head=r),e===this._tail&&(this._tail=t),null!==t&&(t.next=r),null!==r&&(r.prev=t)},e.prototype._appendNode=function(e){var t=this._tail;null!==t&&(t.next=e),e.prev=t,e.next=null,this._tail=e,null===this._head&&(this._head=e)},e.prototype.prealloc=function(e){for(var t=this._nodePool,r=0;r<e;r++)t.push({prev:null,next:null,key:null,value:null})},e.prototype.get=function(e){var t=this._map[e];return void 0!==t?(this._unlinkNode(t),this._appendNode(t),t.value):null},e.prototype.peekValue=function(e){var t=this._map[e];return void 0!==t?t.value:null},e.prototype.peek=function(){var e=this._head;return null===e?null:e.value},e.prototype.set=function(e,t){var r=this._map[e];if(void 0!==r)r=this._map[e],this._unlinkNode(r),r.value=t;else if(this.size>=this.capacity)r=this._head,this._unlinkNode(r),delete this._map[r.key],r.key=e,r.value=t,this._map[e]=r;else{var i=this._nodePool;i.length>0?((r=i.pop()).key=e,r.value=t):r={prev:null,next:null,key:e,value:t},this._map[e]=r,this.size++}this._appendNode(r)},e}();t.LRUMap=r},1296:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},s=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.DomRenderer=void 0;var a=r(3787),c=r(8803),l=r(844),h=r(4725),u=r(2585),f=r(8460),_=r(4774),d=r(9631),p=\"xterm-dom-renderer-owner-\",v=\"xterm-fg-\",g=\"xterm-bg-\",y=\"xterm-focus\",m=1,S=function(e){function t(t,r,i,n,o,s,c,l,h,u){var f=e.call(this)||this;return f._colors=t,f._element=r,f._screenElement=i,f._viewportElement=n,f._linkifier=o,f._linkifier2=s,f._charSizeService=l,f._optionsService=h,f._bufferService=u,f._terminalClass=m++,f._rowElements=[],f._rowContainer=document.createElement(\"div\"),f._rowContainer.classList.add(\"xterm-rows\"),f._rowContainer.style.lineHeight=\"normal\",f._rowContainer.setAttribute(\"aria-hidden\",\"true\"),f._refreshRowElements(f._bufferService.cols,f._bufferService.rows),f._selectionContainer=document.createElement(\"div\"),f._selectionContainer.classList.add(\"xterm-selection\"),f._selectionContainer.setAttribute(\"aria-hidden\",\"true\"),f.dimensions={scaledCharWidth:0,scaledCharHeight:0,scaledCellWidth:0,scaledCellHeight:0,scaledCharLeft:0,scaledCharTop:0,scaledCanvasWidth:0,scaledCanvasHeight:0,canvasWidth:0,canvasHeight:0,actualCellWidth:0,actualCellHeight:0},f._updateDimensions(),f._injectCss(),f._rowFactory=c.createInstance(a.DomRendererRowFactory,document,f._colors),f._element.classList.add(p+f._terminalClass),f._screenElement.appendChild(f._rowContainer),f._screenElement.appendChild(f._selectionContainer),f._linkifier.onShowLinkUnderline((function(e){return f._onLinkHover(e)})),f._linkifier.onHideLinkUnderline((function(e){return f._onLinkLeave(e)})),f._linkifier2.onShowLinkUnderline((function(e){return f._onLinkHover(e)})),f._linkifier2.onHideLinkUnderline((function(e){return f._onLinkLeave(e)})),f}return n(t,e),Object.defineProperty(t.prototype,\"onRequestRedraw\",{get:function(){return(new f.EventEmitter).event},enumerable:!1,configurable:!0}),t.prototype.dispose=function(){this._element.classList.remove(p+this._terminalClass),(0,d.removeElementFromParent)(this._rowContainer,this._selectionContainer,this._themeStyleElement,this._dimensionsStyleElement),e.prototype.dispose.call(this)},t.prototype._updateDimensions=function(){this.dimensions.scaledCharWidth=this._charSizeService.width*window.devicePixelRatio,this.dimensions.scaledCharHeight=Math.ceil(this._charSizeService.height*window.devicePixelRatio),this.dimensions.scaledCellWidth=this.dimensions.scaledCharWidth+Math.round(this._optionsService.rawOptions.letterSpacing),this.dimensions.scaledCellHeight=Math.floor(this.dimensions.scaledCharHeight*this._optionsService.rawOptions.lineHeight),this.dimensions.scaledCharLeft=0,this.dimensions.scaledCharTop=0,this.dimensions.scaledCanvasWidth=this.dimensions.scaledCellWidth*this._bufferService.cols,this.dimensions.scaledCanvasHeight=this.dimensions.scaledCellHeight*this._bufferService.rows,this.dimensions.canvasWidth=Math.round(this.dimensions.scaledCanvasWidth/window.devicePixelRatio),this.dimensions.canvasHeight=Math.round(this.dimensions.scaledCanvasHeight/window.devicePixelRatio),this.dimensions.actualCellWidth=this.dimensions.canvasWidth/this._bufferService.cols,this.dimensions.actualCellHeight=this.dimensions.canvasHeight/this._bufferService.rows;for(var e=0,t=this._rowElements;e<t.length;e++){var r=t[e];r.style.width=this.dimensions.canvasWidth+\"px\",r.style.height=this.dimensions.actualCellHeight+\"px\",r.style.lineHeight=this.dimensions.actualCellHeight+\"px\",r.style.overflow=\"hidden\"}this._dimensionsStyleElement||(this._dimensionsStyleElement=document.createElement(\"style\"),this._screenElement.appendChild(this._dimensionsStyleElement));var i=this._terminalSelector+\" .xterm-rows span { display: inline-block; height: 100%; vertical-align: top; width: \"+this.dimensions.actualCellWidth+\"px}\";this._dimensionsStyleElement.textContent=i,this._selectionContainer.style.height=this._viewportElement.style.height,this._screenElement.style.width=this.dimensions.canvasWidth+\"px\",this._screenElement.style.height=this.dimensions.canvasHeight+\"px\"},t.prototype.setColors=function(e){this._colors=e,this._injectCss()},t.prototype._injectCss=function(){var e=this;this._themeStyleElement||(this._themeStyleElement=document.createElement(\"style\"),this._screenElement.appendChild(this._themeStyleElement));var t=this._terminalSelector+\" .xterm-rows { color: \"+this._colors.foreground.css+\"; font-family: \"+this._optionsService.rawOptions.fontFamily+\"; font-size: \"+this._optionsService.rawOptions.fontSize+\"px;}\";t+=this._terminalSelector+\" span:not(.\"+a.BOLD_CLASS+\") { font-weight: \"+this._optionsService.rawOptions.fontWeight+\";}\"+this._terminalSelector+\" span.\"+a.BOLD_CLASS+\" { font-weight: \"+this._optionsService.rawOptions.fontWeightBold+\";}\"+this._terminalSelector+\" span.\"+a.ITALIC_CLASS+\" { font-style: italic;}\",t+=\"@keyframes blink_box_shadow_\"+this._terminalClass+\" { 50% {  box-shadow: none; }}\",t+=\"@keyframes blink_block_\"+this._terminalClass+\" { 0% {  background-color: \"+this._colors.cursor.css+\";  color: \"+this._colors.cursorAccent.css+\"; } 50% {  background-color: \"+this._colors.cursorAccent.css+\";  color: \"+this._colors.cursor.css+\"; }}\",t+=this._terminalSelector+\" .xterm-rows:not(.xterm-focus) .\"+a.CURSOR_CLASS+\".\"+a.CURSOR_STYLE_BLOCK_CLASS+\" { outline: 1px solid \"+this._colors.cursor.css+\"; outline-offset: -1px;}\"+this._terminalSelector+\" .xterm-rows.xterm-focus .\"+a.CURSOR_CLASS+\".\"+a.CURSOR_BLINK_CLASS+\":not(.\"+a.CURSOR_STYLE_BLOCK_CLASS+\") { animation: blink_box_shadow_\"+this._terminalClass+\" 1s step-end infinite;}\"+this._terminalSelector+\" .xterm-rows.xterm-focus .\"+a.CURSOR_CLASS+\".\"+a.CURSOR_BLINK_CLASS+\".\"+a.CURSOR_STYLE_BLOCK_CLASS+\" { animation: blink_block_\"+this._terminalClass+\" 1s step-end infinite;}\"+this._terminalSelector+\" .xterm-rows.xterm-focus .\"+a.CURSOR_CLASS+\".\"+a.CURSOR_STYLE_BLOCK_CLASS+\" { background-color: \"+this._colors.cursor.css+\"; color: \"+this._colors.cursorAccent.css+\";}\"+this._terminalSelector+\" .xterm-rows .\"+a.CURSOR_CLASS+\".\"+a.CURSOR_STYLE_BAR_CLASS+\" { box-shadow: \"+this._optionsService.rawOptions.cursorWidth+\"px 0 0 \"+this._colors.cursor.css+\" inset;}\"+this._terminalSelector+\" .xterm-rows .\"+a.CURSOR_CLASS+\".\"+a.CURSOR_STYLE_UNDERLINE_CLASS+\" { box-shadow: 0 -1px 0 \"+this._colors.cursor.css+\" inset;}\",t+=this._terminalSelector+\" .xterm-selection { position: absolute; top: 0; left: 0; z-index: 1; pointer-events: none;}\"+this._terminalSelector+\" .xterm-selection div { position: absolute; background-color: \"+this._colors.selectionTransparent.css+\";}\",this._colors.ansi.forEach((function(r,i){t+=e._terminalSelector+\" .\"+v+i+\" { color: \"+r.css+\"; }\"+e._terminalSelector+\" .\"+g+i+\" { background-color: \"+r.css+\"; }\"})),t+=this._terminalSelector+\" .\"+v+c.INVERTED_DEFAULT_COLOR+\" { color: \"+_.color.opaque(this._colors.background).css+\"; }\"+this._terminalSelector+\" .\"+g+c.INVERTED_DEFAULT_COLOR+\" { background-color: \"+this._colors.foreground.css+\"; }\",this._themeStyleElement.textContent=t},t.prototype.onDevicePixelRatioChange=function(){this._updateDimensions()},t.prototype._refreshRowElements=function(e,t){for(var r=this._rowElements.length;r<=t;r++){var i=document.createElement(\"div\");this._rowContainer.appendChild(i),this._rowElements.push(i)}for(;this._rowElements.length>t;)this._rowContainer.removeChild(this._rowElements.pop())},t.prototype.onResize=function(e,t){this._refreshRowElements(e,t),this._updateDimensions()},t.prototype.onCharSizeChanged=function(){this._updateDimensions()},t.prototype.onBlur=function(){this._rowContainer.classList.remove(y)},t.prototype.onFocus=function(){this._rowContainer.classList.add(y)},t.prototype.onSelectionChanged=function(e,t,r){for(;this._selectionContainer.children.length;)this._selectionContainer.removeChild(this._selectionContainer.children[0]);if(e&&t){var i=e[1]-this._bufferService.buffer.ydisp,n=t[1]-this._bufferService.buffer.ydisp,o=Math.max(i,0),s=Math.min(n,this._bufferService.rows-1);if(!(o>=this._bufferService.rows||s<0)){var a=document.createDocumentFragment();if(r)a.appendChild(this._createSelectionElement(o,e[0],t[0],s-o+1));else{var c=i===o?e[0]:0,l=o===n?t[0]:this._bufferService.cols;a.appendChild(this._createSelectionElement(o,c,l));var h=s-o-1;if(a.appendChild(this._createSelectionElement(o+1,0,this._bufferService.cols,h)),o!==s){var u=n===s?t[0]:this._bufferService.cols;a.appendChild(this._createSelectionElement(s,0,u))}}this._selectionContainer.appendChild(a)}}},t.prototype._createSelectionElement=function(e,t,r,i){void 0===i&&(i=1);var n=document.createElement(\"div\");return n.style.height=i*this.dimensions.actualCellHeight+\"px\",n.style.top=e*this.dimensions.actualCellHeight+\"px\",n.style.left=t*this.dimensions.actualCellWidth+\"px\",n.style.width=this.dimensions.actualCellWidth*(r-t)+\"px\",n},t.prototype.onCursorMove=function(){},t.prototype.onOptionsChanged=function(){this._updateDimensions(),this._injectCss()},t.prototype.clear=function(){for(var e=0,t=this._rowElements;e<t.length;e++)t[e].innerText=\"\"},t.prototype.renderRows=function(e,t){for(var r=this._bufferService.buffer.ybase+this._bufferService.buffer.y,i=Math.min(this._bufferService.buffer.x,this._bufferService.cols-1),n=this._optionsService.rawOptions.cursorBlink,o=e;o<=t;o++){var s=this._rowElements[o];s.innerText=\"\";var a=o+this._bufferService.buffer.ydisp,c=this._bufferService.buffer.lines.get(a),l=this._optionsService.rawOptions.cursorStyle;s.appendChild(this._rowFactory.createRow(c,a,a===r,l,i,n,this.dimensions.actualCellWidth,this._bufferService.cols))}},Object.defineProperty(t.prototype,\"_terminalSelector\",{get:function(){return\".\"+p+this._terminalClass},enumerable:!1,configurable:!0}),t.prototype._onLinkHover=function(e){this._setCellUnderline(e.x1,e.x2,e.y1,e.y2,e.cols,!0)},t.prototype._onLinkLeave=function(e){this._setCellUnderline(e.x1,e.x2,e.y1,e.y2,e.cols,!1)},t.prototype._setCellUnderline=function(e,t,r,i,n,o){for(;e!==t||r!==i;){var s=this._rowElements[r];if(!s)return;var a=s.children[e];a&&(a.style.textDecoration=o?\"underline\":\"none\"),++e>=n&&(e=0,r++)}},o([s(6,u.IInstantiationService),s(7,h.ICharSizeService),s(8,u.IOptionsService),s(9,u.IBufferService)],t)}(l.Disposable);t.DomRenderer=S},3787:function(e,t,r){var i=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},n=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.DomRendererRowFactory=t.CURSOR_STYLE_UNDERLINE_CLASS=t.CURSOR_STYLE_BAR_CLASS=t.CURSOR_STYLE_BLOCK_CLASS=t.CURSOR_BLINK_CLASS=t.CURSOR_CLASS=t.STRIKETHROUGH_CLASS=t.UNDERLINE_CLASS=t.ITALIC_CLASS=t.DIM_CLASS=t.BOLD_CLASS=void 0;var o=r(8803),s=r(643),a=r(511),c=r(2585),l=r(4774),h=r(4725),u=r(4269);t.BOLD_CLASS=\"xterm-bold\",t.DIM_CLASS=\"xterm-dim\",t.ITALIC_CLASS=\"xterm-italic\",t.UNDERLINE_CLASS=\"xterm-underline\",t.STRIKETHROUGH_CLASS=\"xterm-strikethrough\",t.CURSOR_CLASS=\"xterm-cursor\",t.CURSOR_BLINK_CLASS=\"xterm-cursor-blink\",t.CURSOR_STYLE_BLOCK_CLASS=\"xterm-cursor-block\",t.CURSOR_STYLE_BAR_CLASS=\"xterm-cursor-bar\",t.CURSOR_STYLE_UNDERLINE_CLASS=\"xterm-cursor-underline\";var f=function(){function e(e,t,r,i,n){this._document=e,this._colors=t,this._characterJoinerService=r,this._optionsService=i,this._coreService=n,this._workCell=new a.CellData}return e.prototype.setColors=function(e){this._colors=e},e.prototype.createRow=function(e,r,i,n,a,c,h,f){for(var d=this._document.createDocumentFragment(),p=this._characterJoinerService.getJoinedCharacters(r),v=0,g=Math.min(e.length,f)-1;g>=0;g--)if(e.loadCell(g,this._workCell).getCode()!==s.NULL_CELL_CODE||i&&g===a){v=g+1;break}for(g=0;g<v;g++){e.loadCell(g,this._workCell);var y=this._workCell.getWidth();if(0!==y){var m=!1,S=g,C=this._workCell;if(p.length>0&&g===p[0][0]){m=!0;var b=p.shift();C=new u.JoinedCellData(this._workCell,e.translateToString(!0,b[0],b[1]),b[1]-b[0]),S=b[1]-1,y=C.getWidth()}var w=this._document.createElement(\"span\");if(y>1&&(w.style.width=h*y+\"px\"),m&&(w.style.display=\"inline\",a>=g&&a<=S&&(a=g)),!this._coreService.isCursorHidden&&i&&g===a)switch(w.classList.add(t.CURSOR_CLASS),c&&w.classList.add(t.CURSOR_BLINK_CLASS),n){case\"bar\":w.classList.add(t.CURSOR_STYLE_BAR_CLASS);break;case\"underline\":w.classList.add(t.CURSOR_STYLE_UNDERLINE_CLASS);break;default:w.classList.add(t.CURSOR_STYLE_BLOCK_CLASS)}C.isBold()&&w.classList.add(t.BOLD_CLASS),C.isItalic()&&w.classList.add(t.ITALIC_CLASS),C.isDim()&&w.classList.add(t.DIM_CLASS),C.isUnderline()&&w.classList.add(t.UNDERLINE_CLASS),C.isInvisible()?w.textContent=s.WHITESPACE_CELL_CHAR:w.textContent=C.getChars()||s.WHITESPACE_CELL_CHAR,C.isStrikethrough()&&w.classList.add(t.STRIKETHROUGH_CLASS);var L=C.getFgColor(),E=C.getFgColorMode(),x=C.getBgColor(),k=C.getBgColorMode(),M=!!C.isInverse();if(M){var A=L;L=x,x=A;var R=E;E=k,k=R}switch(E){case 16777216:case 33554432:C.isBold()&&L<8&&this._optionsService.rawOptions.drawBoldTextInBrightColors&&(L+=8),this._applyMinimumContrast(w,this._colors.background,this._colors.ansi[L])||w.classList.add(\"xterm-fg-\"+L);break;case 50331648:var O=l.rgba.toColor(L>>16&255,L>>8&255,255&L);this._applyMinimumContrast(w,this._colors.background,O)||this._addStyle(w,\"color:#\"+_(L.toString(16),\"0\",6));break;default:this._applyMinimumContrast(w,this._colors.background,this._colors.foreground)||M&&w.classList.add(\"xterm-fg-\"+o.INVERTED_DEFAULT_COLOR)}switch(k){case 16777216:case 33554432:w.classList.add(\"xterm-bg-\"+x);break;case 50331648:this._addStyle(w,\"background-color:#\"+_(x.toString(16),\"0\",6));break;default:M&&w.classList.add(\"xterm-bg-\"+o.INVERTED_DEFAULT_COLOR)}d.appendChild(w),g=S}}return d},e.prototype._applyMinimumContrast=function(e,t,r){if(1===this._optionsService.rawOptions.minimumContrastRatio)return!1;var i=this._colors.contrastCache.getColor(this._workCell.bg,this._workCell.fg);return void 0===i&&(i=l.color.ensureContrastRatio(t,r,this._optionsService.rawOptions.minimumContrastRatio),this._colors.contrastCache.setColor(this._workCell.bg,this._workCell.fg,null!=i?i:null)),!!i&&(this._addStyle(e,\"color:\"+i.css),!0)},e.prototype._addStyle=function(e,t){e.setAttribute(\"style\",\"\"+(e.getAttribute(\"style\")||\"\")+t+\";\")},i([n(2,h.ICharacterJoinerService),n(3,c.IOptionsService),n(4,c.ICoreService)],e)}();function _(e,t,r){for(;e.length<r;)e=t+e;return e}t.DomRendererRowFactory=f},456:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.SelectionModel=void 0;var r=function(){function e(e){this._bufferService=e,this.isSelectAllActive=!1,this.selectionStartLength=0}return e.prototype.clearSelection=function(){this.selectionStart=void 0,this.selectionEnd=void 0,this.isSelectAllActive=!1,this.selectionStartLength=0},Object.defineProperty(e.prototype,\"finalSelectionStart\",{get:function(){return this.isSelectAllActive?[0,0]:this.selectionEnd&&this.selectionStart&&this.areSelectionValuesReversed()?this.selectionEnd:this.selectionStart},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"finalSelectionEnd\",{get:function(){if(this.isSelectAllActive)return[this._bufferService.cols,this._bufferService.buffer.ybase+this._bufferService.rows-1];if(this.selectionStart){if(!this.selectionEnd||this.areSelectionValuesReversed()){var e=this.selectionStart[0]+this.selectionStartLength;return e>this._bufferService.cols?e%this._bufferService.cols==0?[this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)-1]:[e%this._bufferService.cols,this.selectionStart[1]+Math.floor(e/this._bufferService.cols)]:[e,this.selectionStart[1]]}return this.selectionStartLength&&this.selectionEnd[1]===this.selectionStart[1]?[Math.max(this.selectionStart[0]+this.selectionStartLength,this.selectionEnd[0]),this.selectionEnd[1]]:this.selectionEnd}},enumerable:!1,configurable:!0}),e.prototype.areSelectionValuesReversed=function(){var e=this.selectionStart,t=this.selectionEnd;return!(!e||!t)&&(e[1]>t[1]||e[1]===t[1]&&e[0]>t[0])},e.prototype.onTrim=function(e){return this.selectionStart&&(this.selectionStart[1]-=e),this.selectionEnd&&(this.selectionEnd[1]-=e),this.selectionEnd&&this.selectionEnd[1]<0?(this.clearSelection(),!0):(this.selectionStart&&this.selectionStart[1]<0&&(this.selectionStart[1]=0),!1)},e}();t.SelectionModel=r},428:function(e,t,r){var i=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},n=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.CharSizeService=void 0;var o=r(2585),s=r(8460),a=function(){function e(e,t,r){this._optionsService=r,this.width=0,this.height=0,this._onCharSizeChange=new s.EventEmitter,this._measureStrategy=new c(e,t,this._optionsService)}return Object.defineProperty(e.prototype,\"hasValidSize\",{get:function(){return this.width>0&&this.height>0},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"onCharSizeChange\",{get:function(){return this._onCharSizeChange.event},enumerable:!1,configurable:!0}),e.prototype.measure=function(){var e=this._measureStrategy.measure();e.width===this.width&&e.height===this.height||(this.width=e.width,this.height=e.height,this._onCharSizeChange.fire())},i([n(2,o.IOptionsService)],e)}();t.CharSizeService=a;var c=function(){function e(e,t,r){this._document=e,this._parentElement=t,this._optionsService=r,this._result={width:0,height:0},this._measureElement=this._document.createElement(\"span\"),this._measureElement.classList.add(\"xterm-char-measure-element\"),this._measureElement.textContent=\"W\",this._measureElement.setAttribute(\"aria-hidden\",\"true\"),this._parentElement.appendChild(this._measureElement)}return e.prototype.measure=function(){this._measureElement.style.fontFamily=this._optionsService.rawOptions.fontFamily,this._measureElement.style.fontSize=this._optionsService.rawOptions.fontSize+\"px\";var e=this._measureElement.getBoundingClientRect();return 0!==e.width&&0!==e.height&&(this._result.width=e.width,this._result.height=Math.ceil(e.height)),this._result},e}()},4269:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},s=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.CharacterJoinerService=t.JoinedCellData=void 0;var a=r(3734),c=r(643),l=r(511),h=r(2585),u=function(e){function t(t,r,i){var n=e.call(this)||this;return n.content=0,n.combinedData=\"\",n.fg=t.fg,n.bg=t.bg,n.combinedData=r,n._width=i,n}return n(t,e),t.prototype.isCombined=function(){return 2097152},t.prototype.getWidth=function(){return this._width},t.prototype.getChars=function(){return this.combinedData},t.prototype.getCode=function(){return 2097151},t.prototype.setFromCharData=function(e){throw new Error(\"not implemented\")},t.prototype.getAsCharData=function(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]},t}(a.AttributeData);t.JoinedCellData=u;var f=function(){function e(e){this._bufferService=e,this._characterJoiners=[],this._nextCharacterJoinerId=0,this._workCell=new l.CellData}return e.prototype.register=function(e){var t={id:this._nextCharacterJoinerId++,handler:e};return this._characterJoiners.push(t),t.id},e.prototype.deregister=function(e){for(var t=0;t<this._characterJoiners.length;t++)if(this._characterJoiners[t].id===e)return this._characterJoiners.splice(t,1),!0;return!1},e.prototype.getJoinedCharacters=function(e){if(0===this._characterJoiners.length)return[];var t=this._bufferService.buffer.lines.get(e);if(!t||0===t.length)return[];for(var r=[],i=t.translateToString(!0),n=0,o=0,s=0,a=t.getFg(0),l=t.getBg(0),h=0;h<t.getTrimmedLength();h++)if(t.loadCell(h,this._workCell),0!==this._workCell.getWidth()){if(this._workCell.fg!==a||this._workCell.bg!==l){if(h-n>1)for(var u=this._getJoinedRanges(i,s,o,t,n),f=0;f<u.length;f++)r.push(u[f]);n=h,s=o,a=this._workCell.fg,l=this._workCell.bg}o+=this._workCell.getChars().length||c.WHITESPACE_CELL_CHAR.length}if(this._bufferService.cols-n>1)for(u=this._getJoinedRanges(i,s,o,t,n),f=0;f<u.length;f++)r.push(u[f]);return r},e.prototype._getJoinedRanges=function(t,r,i,n,o){var s=t.substring(r,i),a=[];try{a=this._characterJoiners[0].handler(s)}catch(e){console.error(e)}for(var c=1;c<this._characterJoiners.length;c++)try{for(var l=this._characterJoiners[c].handler(s),h=0;h<l.length;h++)e._mergeRanges(a,l[h])}catch(e){console.error(e)}return this._stringRangesToCellRanges(a,n,o),a},e.prototype._stringRangesToCellRanges=function(e,t,r){var i=0,n=!1,o=0,s=e[i];if(s){for(var a=r;a<this._bufferService.cols;a++){var l=t.getWidth(a),h=t.getString(a).length||c.WHITESPACE_CELL_CHAR.length;if(0!==l){if(!n&&s[0]<=o&&(s[0]=a,n=!0),s[1]<=o){if(s[1]=a,!(s=e[++i]))break;s[0]<=o?(s[0]=a,n=!0):n=!1}o+=h}}s&&(s[1]=this._bufferService.cols)}},e._mergeRanges=function(e,t){for(var r=!1,i=0;i<e.length;i++){var n=e[i];if(r){if(t[1]<=n[0])return e[i-1][1]=t[1],e;if(t[1]<=n[1])return e[i-1][1]=Math.max(t[1],n[1]),e.splice(i,1),e;e.splice(i,1),i--}else{if(t[1]<=n[0])return e.splice(i,0,t),e;if(t[1]<=n[1])return n[0]=Math.min(t[0],n[0]),e;t[0]<n[1]&&(n[0]=Math.min(t[0],n[0]),r=!0)}}return r?e[e.length-1][1]=t[1]:e.push(t),e},e=o([s(0,h.IBufferService)],e)}();t.CharacterJoinerService=f},5114:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.CoreBrowserService=void 0;var r=function(){function e(e){this._textarea=e}return Object.defineProperty(e.prototype,\"isFocused\",{get:function(){return(this._textarea.getRootNode?this._textarea.getRootNode():document).activeElement===this._textarea&&document.hasFocus()},enumerable:!1,configurable:!0}),e}();t.CoreBrowserService=r},7641:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},s=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.Decoration=t.DecorationService=void 0;var a=r(8460),c=r(844),l=r(2585),h=function(e){function t(t){var r=e.call(this)||this;return r._instantiationService=t,r._decorations=[],r}return n(t,e),t.prototype.attachToDom=function(e,t){var r=this;this._renderService=t,this._screenElement=e,this._container=document.createElement(\"div\"),this._container.classList.add(\"xterm-decoration-container\"),e.appendChild(this._container),this.register(this._renderService.onRenderedBufferChange((function(){return r.refresh()}))),this.register(this._renderService.onDimensionsChange((function(){return r.refresh(!0)})))},t.prototype.registerDecoration=function(e){var t=this;if(!e.marker.isDisposed&&this._container){var r=this._instantiationService.createInstance(u,e,this._container);return this._decorations.push(r),r.onDispose((function(){return t._decorations.splice(t._decorations.indexOf(r),1)})),this._queueRefresh(),r}},t.prototype._queueRefresh=function(){var e=this;void 0===this._animationFrame&&(this._animationFrame=window.requestAnimationFrame((function(){e.refresh(),e._animationFrame=void 0})))},t.prototype.refresh=function(e){if(this._renderService)for(var t=0,r=this._decorations;t<r.length;t++)r[t].render(this._renderService,e)},t.prototype.dispose=function(){for(var e=0,t=this._decorations;e<t.length;e++)t[e].dispose();this._screenElement&&this._container&&this._screenElement.contains(this._container)&&this._screenElement.removeChild(this._container)},o([s(0,l.IInstantiationService)],t)}(c.Disposable);t.DecorationService=h;var u=function(e){function t(t,r,i){var n,o=e.call(this)||this;return o._container=r,o._bufferService=i,o.isDisposed=!1,o._onDispose=new a.EventEmitter,o._onRender=new a.EventEmitter,o.x=null!==(n=t.x)&&void 0!==n?n:0,o._marker=t.marker,o._marker.onDispose((function(){return o.dispose()})),o.anchor=t.anchor||\"left\",o.width=t.width||1,o.height=t.height||1,o}return n(t,e),Object.defineProperty(t.prototype,\"element\",{get:function(){return this._element},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"marker\",{get:function(){return this._marker},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onDispose\",{get:function(){return this._onDispose.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onRender\",{get:function(){return this._onRender.event},enumerable:!1,configurable:!0}),t.prototype.render=function(e,t){this._element&&!t||this._createElement(e,t),this._container&&this._element&&!this._container.contains(this._element)&&this._container.append(this._element),this._refreshStyle(e),this._element&&this._onRender.fire(this._element)},t.prototype._createElement=function(e,t){t&&this._element&&this._container.contains(this._element)&&this._container.removeChild(this._element),this._element=document.createElement(\"div\"),this._element.classList.add(\"xterm-decoration\"),this._element.style.width=this.width*e.dimensions.actualCellWidth+\"px\",this._element.style.height=this.height*e.dimensions.actualCellHeight+\"px\",this._element.style.top=(this.marker.line-this._bufferService.buffers.active.ydisp)*e.dimensions.actualCellHeight+\"px\",this._element.style.lineHeight=e.dimensions.actualCellHeight+\"px\",this.x&&this.x>this._bufferService.cols&&(this._element.style.display=\"none\"),\"right\"===this.anchor?this._element.style.right=this.x?this.x*e.dimensions.actualCellWidth+\"px\":\"\":this._element.style.left=this.x?this.x*e.dimensions.actualCellWidth+\"px\":\"\"},t.prototype._refreshStyle=function(e){if(this._element){var t=this.marker.line-this._bufferService.buffers.active.ydisp;t<0||t>this._bufferService.rows?this._element.style.display=\"none\":(this._element.style.top=t*e.dimensions.actualCellHeight+\"px\",this._element.style.display=this._bufferService.buffer===this._bufferService.buffers.alt?\"none\":\"block\")}},t.prototype.dispose=function(){this.isDisposed||(this._element&&this._container.contains(this._element)&&this._container.removeChild(this._element),this.isDisposed=!0,this._onDispose.fire())},o([s(2,l.IBufferService)],t)}(c.Disposable);t.Decoration=u},8934:function(e,t,r){var i=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},n=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.MouseService=void 0;var o=r(4725),s=r(9806),a=function(){function e(e,t){this._renderService=e,this._charSizeService=t}return e.prototype.getCoords=function(e,t,r,i,n){return(0,s.getCoords)(e,t,r,i,this._charSizeService.hasValidSize,this._renderService.dimensions.actualCellWidth,this._renderService.dimensions.actualCellHeight,n)},e.prototype.getRawByteCoords=function(e,t,r,i){var n=this.getCoords(e,t,r,i);return(0,s.getRawByteCoords)(n)},i([n(0,o.IRenderService),n(1,o.ICharSizeService)],e)}();t.MouseService=a},3230:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},s=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.RenderService=void 0;var a=r(6193),c=r(8460),l=r(844),h=r(5596),u=r(3656),f=r(2585),_=r(4725),d=function(e){function t(t,r,i,n,o,s){var l=e.call(this)||this;if(l._renderer=t,l._rowCount=r,l._charSizeService=o,l._isPaused=!1,l._needsFullRefresh=!1,l._isNextRenderRedrawOnly=!0,l._needsSelectionRefresh=!1,l._canvasWidth=0,l._canvasHeight=0,l._selectionState={start:void 0,end:void 0,columnSelectMode:!1},l._onDimensionsChange=new c.EventEmitter,l._onRender=new c.EventEmitter,l._onRefreshRequest=new c.EventEmitter,l.register({dispose:function(){return l._renderer.dispose()}}),l._renderDebouncer=new a.RenderDebouncer((function(e,t){return l._renderRows(e,t)})),l.register(l._renderDebouncer),l._screenDprMonitor=new h.ScreenDprMonitor,l._screenDprMonitor.setListener((function(){return l.onDevicePixelRatioChange()})),l.register(l._screenDprMonitor),l.register(s.onResize((function(){return l._fullRefresh()}))),l.register(s.buffers.onBufferActivate((function(){var e;return null===(e=l._renderer)||void 0===e?void 0:e.clear()}))),l.register(n.onOptionChange((function(){return l._renderer.onOptionsChanged()}))),l.register(l._charSizeService.onCharSizeChange((function(){return l.onCharSizeChanged()}))),l._renderer.onRequestRedraw((function(e){return l.refreshRows(e.start,e.end,!0)})),l.register((0,u.addDisposableDomListener)(window,\"resize\",(function(){return l.onDevicePixelRatioChange()}))),\"IntersectionObserver\"in window){var f=new IntersectionObserver((function(e){return l._onIntersectionChange(e[e.length-1])}),{threshold:0});f.observe(i),l.register({dispose:function(){return f.disconnect()}})}return l}return n(t,e),Object.defineProperty(t.prototype,\"onDimensionsChange\",{get:function(){return this._onDimensionsChange.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onRenderedBufferChange\",{get:function(){return this._onRender.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onRefreshRequest\",{get:function(){return this._onRefreshRequest.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"dimensions\",{get:function(){return this._renderer.dimensions},enumerable:!1,configurable:!0}),t.prototype._onIntersectionChange=function(e){this._isPaused=void 0===e.isIntersecting?0===e.intersectionRatio:!e.isIntersecting,this._isPaused||this._charSizeService.hasValidSize||this._charSizeService.measure(),!this._isPaused&&this._needsFullRefresh&&(this.refreshRows(0,this._rowCount-1),this._needsFullRefresh=!1)},t.prototype.refreshRows=function(e,t,r){void 0===r&&(r=!1),this._isPaused?this._needsFullRefresh=!0:(r||(this._isNextRenderRedrawOnly=!1),this._renderDebouncer.refresh(e,t,this._rowCount))},t.prototype._renderRows=function(e,t){this._renderer.renderRows(e,t),this._needsSelectionRefresh&&(this._renderer.onSelectionChanged(this._selectionState.start,this._selectionState.end,this._selectionState.columnSelectMode),this._needsSelectionRefresh=!1),this._isNextRenderRedrawOnly||this._onRender.fire({start:e,end:t}),this._isNextRenderRedrawOnly=!0},t.prototype.resize=function(e,t){this._rowCount=t,this._fireOnCanvasResize()},t.prototype.changeOptions=function(){this._renderer.onOptionsChanged(),this.refreshRows(0,this._rowCount-1),this._fireOnCanvasResize()},t.prototype._fireOnCanvasResize=function(){this._renderer.dimensions.canvasWidth===this._canvasWidth&&this._renderer.dimensions.canvasHeight===this._canvasHeight||this._onDimensionsChange.fire(this._renderer.dimensions)},t.prototype.dispose=function(){e.prototype.dispose.call(this)},t.prototype.setRenderer=function(e){var t=this;this._renderer.dispose(),this._renderer=e,this._renderer.onRequestRedraw((function(e){return t.refreshRows(e.start,e.end,!0)})),this._needsSelectionRefresh=!0,this._fullRefresh()},t.prototype._fullRefresh=function(){this._isPaused?this._needsFullRefresh=!0:this.refreshRows(0,this._rowCount-1)},t.prototype.clearTextureAtlas=function(){var e,t;null===(t=null===(e=this._renderer)||void 0===e?void 0:e.clearTextureAtlas)||void 0===t||t.call(e),this._fullRefresh()},t.prototype.setColors=function(e){this._renderer.setColors(e),this._fullRefresh()},t.prototype.onDevicePixelRatioChange=function(){this._charSizeService.measure(),this._renderer.onDevicePixelRatioChange(),this.refreshRows(0,this._rowCount-1)},t.prototype.onResize=function(e,t){this._renderer.onResize(e,t),this._fullRefresh()},t.prototype.onCharSizeChanged=function(){this._renderer.onCharSizeChanged()},t.prototype.onBlur=function(){this._renderer.onBlur()},t.prototype.onFocus=function(){this._renderer.onFocus()},t.prototype.onSelectionChanged=function(e,t,r){this._selectionState.start=e,this._selectionState.end=t,this._selectionState.columnSelectMode=r,this._renderer.onSelectionChanged(e,t,r)},t.prototype.onCursorMove=function(){this._renderer.onCursorMove()},t.prototype.clear=function(){this._renderer.clear()},o([s(3,f.IOptionsService),s(4,_.ICharSizeService),s(5,f.IBufferService)],t)}(l.Disposable);t.RenderService=d},9312:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},s=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.SelectionService=void 0;var a=r(6114),c=r(456),l=r(511),h=r(8460),u=r(4725),f=r(2585),_=r(9806),d=r(9504),p=r(844),v=r(4841),g=String.fromCharCode(160),y=new RegExp(g,\"g\"),m=function(e){function t(t,r,i,n,o,s,a,u){var f=e.call(this)||this;return f._element=t,f._screenElement=r,f._linkifier=i,f._bufferService=n,f._coreService=o,f._mouseService=s,f._optionsService=a,f._renderService=u,f._dragScrollAmount=0,f._enabled=!0,f._workCell=new l.CellData,f._mouseDownTimeStamp=0,f._oldHasSelection=!1,f._oldSelectionStart=void 0,f._oldSelectionEnd=void 0,f._onLinuxMouseSelection=f.register(new h.EventEmitter),f._onRedrawRequest=f.register(new h.EventEmitter),f._onSelectionChange=f.register(new h.EventEmitter),f._onRequestScrollLines=f.register(new h.EventEmitter),f._mouseMoveListener=function(e){return f._onMouseMove(e)},f._mouseUpListener=function(e){return f._onMouseUp(e)},f._coreService.onUserInput((function(){f.hasSelection&&f.clearSelection()})),f._trimListener=f._bufferService.buffer.lines.onTrim((function(e){return f._onTrim(e)})),f.register(f._bufferService.buffers.onBufferActivate((function(e){return f._onBufferActivate(e)}))),f.enable(),f._model=new c.SelectionModel(f._bufferService),f._activeSelectionMode=0,f}return n(t,e),Object.defineProperty(t.prototype,\"onLinuxMouseSelection\",{get:function(){return this._onLinuxMouseSelection.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onRequestRedraw\",{get:function(){return this._onRedrawRequest.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onSelectionChange\",{get:function(){return this._onSelectionChange.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onRequestScrollLines\",{get:function(){return this._onRequestScrollLines.event},enumerable:!1,configurable:!0}),t.prototype.dispose=function(){this._removeMouseDownListeners()},t.prototype.reset=function(){this.clearSelection()},t.prototype.disable=function(){this.clearSelection(),this._enabled=!1},t.prototype.enable=function(){this._enabled=!0},Object.defineProperty(t.prototype,\"selectionStart\",{get:function(){return this._model.finalSelectionStart},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"selectionEnd\",{get:function(){return this._model.finalSelectionEnd},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"hasSelection\",{get:function(){var e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;return!(!e||!t||e[0]===t[0]&&e[1]===t[1])},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"selectionText\",{get:function(){var e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd;if(!e||!t)return\"\";var r=this._bufferService.buffer,i=[];if(3===this._activeSelectionMode){if(e[0]===t[0])return\"\";for(var n=e[1];n<=t[1];n++){var o=r.translateBufferLineToString(n,!0,e[0],t[0]);i.push(o)}}else{var s=e[1]===t[1]?t[0]:void 0;for(i.push(r.translateBufferLineToString(e[1],!0,e[0],s)),n=e[1]+1;n<=t[1]-1;n++){var c=r.lines.get(n);o=r.translateBufferLineToString(n,!0),(null==c?void 0:c.isWrapped)?i[i.length-1]+=o:i.push(o)}e[1]!==t[1]&&(c=r.lines.get(t[1]),o=r.translateBufferLineToString(t[1],!0,0,t[0]),c&&c.isWrapped?i[i.length-1]+=o:i.push(o))}return i.map((function(e){return e.replace(y,\" \")})).join(a.isWindows?\"\\r\\n\":\"\\n\")},enumerable:!1,configurable:!0}),t.prototype.clearSelection=function(){this._model.clearSelection(),this._removeMouseDownListeners(),this.refresh(),this._onSelectionChange.fire()},t.prototype.refresh=function(e){var t=this;this._refreshAnimationFrame||(this._refreshAnimationFrame=window.requestAnimationFrame((function(){return t._refresh()}))),a.isLinux&&e&&this.selectionText.length&&this._onLinuxMouseSelection.fire(this.selectionText)},t.prototype._refresh=function(){this._refreshAnimationFrame=void 0,this._onRedrawRequest.fire({start:this._model.finalSelectionStart,end:this._model.finalSelectionEnd,columnSelectMode:3===this._activeSelectionMode})},t.prototype._isClickInSelection=function(e){var t=this._getMouseBufferCoords(e),r=this._model.finalSelectionStart,i=this._model.finalSelectionEnd;return!!(r&&i&&t)&&this._areCoordsInSelection(t,r,i)},t.prototype._areCoordsInSelection=function(e,t,r){return e[1]>t[1]&&e[1]<r[1]||t[1]===r[1]&&e[1]===t[1]&&e[0]>=t[0]&&e[0]<r[0]||t[1]<r[1]&&e[1]===r[1]&&e[0]<r[0]||t[1]<r[1]&&e[1]===t[1]&&e[0]>=t[0]},t.prototype._selectWordAtCursor=function(e,t){var r,i,n=null===(i=null===(r=this._linkifier.currentLink)||void 0===r?void 0:r.link)||void 0===i?void 0:i.range;if(n)return this._model.selectionStart=[n.start.x-1,n.start.y-1],this._model.selectionStartLength=(0,v.getRangeLength)(n,this._bufferService.cols),this._model.selectionEnd=void 0,!0;var o=this._getMouseBufferCoords(e);return!!o&&(this._selectWordAt(o,t),this._model.selectionEnd=void 0,!0)},t.prototype.selectAll=function(){this._model.isSelectAllActive=!0,this.refresh(),this._onSelectionChange.fire()},t.prototype.selectLines=function(e,t){this._model.clearSelection(),e=Math.max(e,0),t=Math.min(t,this._bufferService.buffer.lines.length-1),this._model.selectionStart=[0,e],this._model.selectionEnd=[this._bufferService.cols,t],this.refresh(),this._onSelectionChange.fire()},t.prototype._onTrim=function(e){this._model.onTrim(e)&&this.refresh()},t.prototype._getMouseBufferCoords=function(e){var t=this._mouseService.getCoords(e,this._screenElement,this._bufferService.cols,this._bufferService.rows,!0);if(t)return t[0]--,t[1]--,t[1]+=this._bufferService.buffer.ydisp,t},t.prototype._getMouseEventScrollAmount=function(e){var t=(0,_.getCoordsRelativeToElement)(e,this._screenElement)[1],r=this._renderService.dimensions.canvasHeight;return t>=0&&t<=r?0:(t>r&&(t-=r),t=Math.min(Math.max(t,-50),50),(t/=50)/Math.abs(t)+Math.round(14*t))},t.prototype.shouldForceSelection=function(e){return a.isMac?e.altKey&&this._optionsService.rawOptions.macOptionClickForcesSelection:e.shiftKey},t.prototype.onMouseDown=function(e){if(this._mouseDownTimeStamp=e.timeStamp,(2!==e.button||!this.hasSelection)&&0===e.button){if(!this._enabled){if(!this.shouldForceSelection(e))return;e.stopPropagation()}e.preventDefault(),this._dragScrollAmount=0,this._enabled&&e.shiftKey?this._onIncrementalClick(e):1===e.detail?this._onSingleClick(e):2===e.detail?this._onDoubleClick(e):3===e.detail&&this._onTripleClick(e),this._addMouseDownListeners(),this.refresh(!0)}},t.prototype._addMouseDownListeners=function(){var e=this;this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.addEventListener(\"mousemove\",this._mouseMoveListener),this._screenElement.ownerDocument.addEventListener(\"mouseup\",this._mouseUpListener)),this._dragScrollIntervalTimer=window.setInterval((function(){return e._dragScroll()}),50)},t.prototype._removeMouseDownListeners=function(){this._screenElement.ownerDocument&&(this._screenElement.ownerDocument.removeEventListener(\"mousemove\",this._mouseMoveListener),this._screenElement.ownerDocument.removeEventListener(\"mouseup\",this._mouseUpListener)),clearInterval(this._dragScrollIntervalTimer),this._dragScrollIntervalTimer=void 0},t.prototype._onIncrementalClick=function(e){this._model.selectionStart&&(this._model.selectionEnd=this._getMouseBufferCoords(e))},t.prototype._onSingleClick=function(e){if(this._model.selectionStartLength=0,this._model.isSelectAllActive=!1,this._activeSelectionMode=this.shouldColumnSelect(e)?3:0,this._model.selectionStart=this._getMouseBufferCoords(e),this._model.selectionStart){this._model.selectionEnd=void 0;var t=this._bufferService.buffer.lines.get(this._model.selectionStart[1]);t&&t.length!==this._model.selectionStart[0]&&0===t.hasWidth(this._model.selectionStart[0])&&this._model.selectionStart[0]++}},t.prototype._onDoubleClick=function(e){this._selectWordAtCursor(e,!0)&&(this._activeSelectionMode=1)},t.prototype._onTripleClick=function(e){var t=this._getMouseBufferCoords(e);t&&(this._activeSelectionMode=2,this._selectLineAt(t[1]))},t.prototype.shouldColumnSelect=function(e){return e.altKey&&!(a.isMac&&this._optionsService.rawOptions.macOptionClickForcesSelection)},t.prototype._onMouseMove=function(e){if(e.stopImmediatePropagation(),this._model.selectionStart){var t=this._model.selectionEnd?[this._model.selectionEnd[0],this._model.selectionEnd[1]]:null;if(this._model.selectionEnd=this._getMouseBufferCoords(e),this._model.selectionEnd){2===this._activeSelectionMode?this._model.selectionEnd[1]<this._model.selectionStart[1]?this._model.selectionEnd[0]=0:this._model.selectionEnd[0]=this._bufferService.cols:1===this._activeSelectionMode&&this._selectToWordAt(this._model.selectionEnd),this._dragScrollAmount=this._getMouseEventScrollAmount(e),3!==this._activeSelectionMode&&(this._dragScrollAmount>0?this._model.selectionEnd[0]=this._bufferService.cols:this._dragScrollAmount<0&&(this._model.selectionEnd[0]=0));var r=this._bufferService.buffer;if(this._model.selectionEnd[1]<r.lines.length){var i=r.lines.get(this._model.selectionEnd[1]);i&&0===i.hasWidth(this._model.selectionEnd[0])&&this._model.selectionEnd[0]++}t&&t[0]===this._model.selectionEnd[0]&&t[1]===this._model.selectionEnd[1]||this.refresh(!0)}else this.refresh(!0)}},t.prototype._dragScroll=function(){if(this._model.selectionEnd&&this._model.selectionStart&&this._dragScrollAmount){this._onRequestScrollLines.fire({amount:this._dragScrollAmount,suppressScrollEvent:!1});var e=this._bufferService.buffer;this._dragScrollAmount>0?(3!==this._activeSelectionMode&&(this._model.selectionEnd[0]=this._bufferService.cols),this._model.selectionEnd[1]=Math.min(e.ydisp+this._bufferService.rows,e.lines.length-1)):(3!==this._activeSelectionMode&&(this._model.selectionEnd[0]=0),this._model.selectionEnd[1]=e.ydisp),this.refresh()}},t.prototype._onMouseUp=function(e){var t=e.timeStamp-this._mouseDownTimeStamp;if(this._removeMouseDownListeners(),this.selectionText.length<=1&&t<500&&e.altKey&&this._optionsService.getOption(\"altClickMovesCursor\")){if(this._bufferService.buffer.ybase===this._bufferService.buffer.ydisp){var r=this._mouseService.getCoords(e,this._element,this._bufferService.cols,this._bufferService.rows,!1);if(r&&void 0!==r[0]&&void 0!==r[1]){var i=(0,d.moveToCellSequence)(r[0]-1,r[1]-1,this._bufferService,this._coreService.decPrivateModes.applicationCursorKeys);this._coreService.triggerDataEvent(i,!0)}}}else this._fireEventIfSelectionChanged()},t.prototype._fireEventIfSelectionChanged=function(){var e=this._model.finalSelectionStart,t=this._model.finalSelectionEnd,r=!(!e||!t||e[0]===t[0]&&e[1]===t[1]);r?e&&t&&(this._oldSelectionStart&&this._oldSelectionEnd&&e[0]===this._oldSelectionStart[0]&&e[1]===this._oldSelectionStart[1]&&t[0]===this._oldSelectionEnd[0]&&t[1]===this._oldSelectionEnd[1]||this._fireOnSelectionChange(e,t,r)):this._oldHasSelection&&this._fireOnSelectionChange(e,t,r)},t.prototype._fireOnSelectionChange=function(e,t,r){this._oldSelectionStart=e,this._oldSelectionEnd=t,this._oldHasSelection=r,this._onSelectionChange.fire()},t.prototype._onBufferActivate=function(e){var t=this;this.clearSelection(),this._trimListener.dispose(),this._trimListener=e.activeBuffer.lines.onTrim((function(e){return t._onTrim(e)}))},t.prototype._convertViewportColToCharacterIndex=function(e,t){for(var r=t[0],i=0;t[0]>=i;i++){var n=e.loadCell(i,this._workCell).getChars().length;0===this._workCell.getWidth()?r--:n>1&&t[0]!==i&&(r+=n-1)}return r},t.prototype.setSelection=function(e,t,r){this._model.clearSelection(),this._removeMouseDownListeners(),this._model.selectionStart=[e,t],this._model.selectionStartLength=r,this.refresh()},t.prototype.rightClickSelect=function(e){this._isClickInSelection(e)||(this._selectWordAtCursor(e,!1)&&this.refresh(!0),this._fireEventIfSelectionChanged())},t.prototype._getWordAt=function(e,t,r,i){if(void 0===r&&(r=!0),void 0===i&&(i=!0),!(e[0]>=this._bufferService.cols)){var n=this._bufferService.buffer,o=n.lines.get(e[1]);if(o){var s=n.translateBufferLineToString(e[1],!1),a=this._convertViewportColToCharacterIndex(o,e),c=a,l=e[0]-a,h=0,u=0,f=0,_=0;if(\" \"===s.charAt(a)){for(;a>0&&\" \"===s.charAt(a-1);)a--;for(;c<s.length&&\" \"===s.charAt(c+1);)c++}else{var d=e[0],p=e[0];0===o.getWidth(d)&&(h++,d--),2===o.getWidth(p)&&(u++,p++);var v=o.getString(p).length;for(v>1&&(_+=v-1,c+=v-1);d>0&&a>0&&!this._isCharWordSeparator(o.loadCell(d-1,this._workCell));){o.loadCell(d-1,this._workCell);var g=this._workCell.getChars().length;0===this._workCell.getWidth()?(h++,d--):g>1&&(f+=g-1,a-=g-1),a--,d--}for(;p<o.length&&c+1<s.length&&!this._isCharWordSeparator(o.loadCell(p+1,this._workCell));){o.loadCell(p+1,this._workCell);var y=this._workCell.getChars().length;2===this._workCell.getWidth()?(u++,p++):y>1&&(_+=y-1,c+=y-1),c++,p++}}c++;var m=a+l-h+f,S=Math.min(this._bufferService.cols,c-a+h+u-f-_);if(t||\"\"!==s.slice(a,c).trim()){if(r&&0===m&&32!==o.getCodePoint(0)){var C=n.lines.get(e[1]-1);if(C&&o.isWrapped&&32!==C.getCodePoint(this._bufferService.cols-1)){var b=this._getWordAt([this._bufferService.cols-1,e[1]-1],!1,!0,!1);if(b){var w=this._bufferService.cols-b.start;m-=w,S+=w}}}if(i&&m+S===this._bufferService.cols&&32!==o.getCodePoint(this._bufferService.cols-1)){var L=n.lines.get(e[1]+1);if((null==L?void 0:L.isWrapped)&&32!==L.getCodePoint(0)){var E=this._getWordAt([0,e[1]+1],!1,!1,!0);E&&(S+=E.length)}}return{start:m,length:S}}}}},t.prototype._selectWordAt=function(e,t){var r=this._getWordAt(e,t);if(r){for(;r.start<0;)r.start+=this._bufferService.cols,e[1]--;this._model.selectionStart=[r.start,e[1]],this._model.selectionStartLength=r.length}},t.prototype._selectToWordAt=function(e){var t=this._getWordAt(e,!0);if(t){for(var r=e[1];t.start<0;)t.start+=this._bufferService.cols,r--;if(!this._model.areSelectionValuesReversed())for(;t.start+t.length>this._bufferService.cols;)t.length-=this._bufferService.cols,r++;this._model.selectionEnd=[this._model.areSelectionValuesReversed()?t.start:t.start+t.length,r]}},t.prototype._isCharWordSeparator=function(e){return 0!==e.getWidth()&&this._optionsService.rawOptions.wordSeparator.indexOf(e.getChars())>=0},t.prototype._selectLineAt=function(e){var t=this._bufferService.buffer.getWrappedRangeForLine(e);this._model.selectionStart=[0,t.first],this._model.selectionEnd=[this._bufferService.cols,t.last],this._model.selectionStartLength=0},o([s(3,f.IBufferService),s(4,f.ICoreService),s(5,u.IMouseService),s(6,f.IOptionsService),s(7,u.IRenderService)],t)}(p.Disposable);t.SelectionService=m},4725:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.IDecorationService=t.ICharacterJoinerService=t.ISoundService=t.ISelectionService=t.IRenderService=t.IMouseService=t.ICoreBrowserService=t.ICharSizeService=void 0;var i=r(8343);t.ICharSizeService=(0,i.createDecorator)(\"CharSizeService\"),t.ICoreBrowserService=(0,i.createDecorator)(\"CoreBrowserService\"),t.IMouseService=(0,i.createDecorator)(\"MouseService\"),t.IRenderService=(0,i.createDecorator)(\"RenderService\"),t.ISelectionService=(0,i.createDecorator)(\"SelectionService\"),t.ISoundService=(0,i.createDecorator)(\"SoundService\"),t.ICharacterJoinerService=(0,i.createDecorator)(\"CharacterJoinerService\"),t.IDecorationService=(0,i.createDecorator)(\"DecorationService\")},357:function(e,t,r){var i=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},n=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.SoundService=void 0;var o=r(2585),s=function(){function e(e){this._optionsService=e}return Object.defineProperty(e,\"audioContext\",{get:function(){if(!e._audioContext){var t=window.AudioContext||window.webkitAudioContext;if(!t)return console.warn(\"Web Audio API is not supported by this browser. Consider upgrading to the latest version\"),null;e._audioContext=new t}return e._audioContext},enumerable:!1,configurable:!0}),e.prototype.playBellSound=function(){var t=e.audioContext;if(t){var r=t.createBufferSource();t.decodeAudioData(this._base64ToArrayBuffer(this._removeMimeType(this._optionsService.rawOptions.bellSound)),(function(e){r.buffer=e,r.connect(t.destination),r.start(0)}))}},e.prototype._base64ToArrayBuffer=function(e){for(var t=window.atob(e),r=t.length,i=new Uint8Array(r),n=0;n<r;n++)i[n]=t.charCodeAt(n);return i.buffer},e.prototype._removeMimeType=function(e){return e.split(\",\")[1]},e=i([n(0,o.IOptionsService)],e)}();t.SoundService=s},6349:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.CircularList=void 0;var i=r(8460),n=function(){function e(e){this._maxLength=e,this.onDeleteEmitter=new i.EventEmitter,this.onInsertEmitter=new i.EventEmitter,this.onTrimEmitter=new i.EventEmitter,this._array=new Array(this._maxLength),this._startIndex=0,this._length=0}return Object.defineProperty(e.prototype,\"onDelete\",{get:function(){return this.onDeleteEmitter.event},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"onInsert\",{get:function(){return this.onInsertEmitter.event},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"onTrim\",{get:function(){return this.onTrimEmitter.event},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"maxLength\",{get:function(){return this._maxLength},set:function(e){if(this._maxLength!==e){for(var t=new Array(e),r=0;r<Math.min(e,this.length);r++)t[r]=this._array[this._getCyclicIndex(r)];this._array=t,this._maxLength=e,this._startIndex=0}},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"length\",{get:function(){return this._length},set:function(e){if(e>this._length)for(var t=this._length;t<e;t++)this._array[t]=void 0;this._length=e},enumerable:!1,configurable:!0}),e.prototype.get=function(e){return this._array[this._getCyclicIndex(e)]},e.prototype.set=function(e,t){this._array[this._getCyclicIndex(e)]=t},e.prototype.push=function(e){this._array[this._getCyclicIndex(this._length)]=e,this._length===this._maxLength?(this._startIndex=++this._startIndex%this._maxLength,this.onTrimEmitter.fire(1)):this._length++},e.prototype.recycle=function(){if(this._length!==this._maxLength)throw new Error(\"Can only recycle when the buffer is full\");return this._startIndex=++this._startIndex%this._maxLength,this.onTrimEmitter.fire(1),this._array[this._getCyclicIndex(this._length-1)]},Object.defineProperty(e.prototype,\"isFull\",{get:function(){return this._length===this._maxLength},enumerable:!1,configurable:!0}),e.prototype.pop=function(){return this._array[this._getCyclicIndex(this._length---1)]},e.prototype.splice=function(e,t){for(var r=[],i=2;i<arguments.length;i++)r[i-2]=arguments[i];if(t){for(var n=e;n<this._length-t;n++)this._array[this._getCyclicIndex(n)]=this._array[this._getCyclicIndex(n+t)];this._length-=t,this.onDeleteEmitter.fire({index:e,amount:t})}for(n=this._length-1;n>=e;n--)this._array[this._getCyclicIndex(n+r.length)]=this._array[this._getCyclicIndex(n)];for(n=0;n<r.length;n++)this._array[this._getCyclicIndex(e+n)]=r[n];if(r.length&&this.onInsertEmitter.fire({index:e,amount:r.length}),this._length+r.length>this._maxLength){var o=this._length+r.length-this._maxLength;this._startIndex+=o,this._length=this._maxLength,this.onTrimEmitter.fire(o)}else this._length+=r.length},e.prototype.trimStart=function(e){e>this._length&&(e=this._length),this._startIndex+=e,this._length-=e,this.onTrimEmitter.fire(e)},e.prototype.shiftElements=function(e,t,r){if(!(t<=0)){if(e<0||e>=this._length)throw new Error(\"start argument out of range\");if(e+r<0)throw new Error(\"Cannot shift elements in list beyond index 0\");if(r>0){for(var i=t-1;i>=0;i--)this.set(e+i+r,this.get(e+i));var n=e+t+r-this._length;if(n>0)for(this._length+=n;this._length>this._maxLength;)this._length--,this._startIndex++,this.onTrimEmitter.fire(1)}else for(i=0;i<t;i++)this.set(e+i+r,this.get(e+i))}},e.prototype._getCyclicIndex=function(e){return(this._startIndex+e)%this._maxLength},e}();t.CircularList=n},1439:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.clone=void 0,t.clone=function e(t,r){if(void 0===r&&(r=5),\"object\"!=typeof t)return t;var i=Array.isArray(t)?[]:{};for(var n in t)i[n]=r<=1?t[n]:t[n]&&e(t[n],r-1);return i}},8969:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,\"__esModule\",{value:!0}),t.CoreTerminal=void 0;var o=r(844),s=r(2585),a=r(4348),c=r(7866),l=r(744),h=r(7302),u=r(6975),f=r(8460),_=r(1753),d=r(3730),p=r(1480),v=r(7994),g=r(9282),y=r(5435),m=r(5981),S=!1,C=function(e){function t(t){var r=e.call(this)||this;return r._onBinary=new f.EventEmitter,r._onData=new f.EventEmitter,r._onLineFeed=new f.EventEmitter,r._onResize=new f.EventEmitter,r._onScroll=new f.EventEmitter,r._instantiationService=new a.InstantiationService,r.optionsService=new h.OptionsService(t),r._instantiationService.setService(s.IOptionsService,r.optionsService),r._bufferService=r.register(r._instantiationService.createInstance(l.BufferService)),r._instantiationService.setService(s.IBufferService,r._bufferService),r._logService=r._instantiationService.createInstance(c.LogService),r._instantiationService.setService(s.ILogService,r._logService),r.coreService=r.register(r._instantiationService.createInstance(u.CoreService,(function(){return r.scrollToBottom()}))),r._instantiationService.setService(s.ICoreService,r.coreService),r.coreMouseService=r._instantiationService.createInstance(_.CoreMouseService),r._instantiationService.setService(s.ICoreMouseService,r.coreMouseService),r._dirtyRowService=r._instantiationService.createInstance(d.DirtyRowService),r._instantiationService.setService(s.IDirtyRowService,r._dirtyRowService),r.unicodeService=r._instantiationService.createInstance(p.UnicodeService),r._instantiationService.setService(s.IUnicodeService,r.unicodeService),r._charsetService=r._instantiationService.createInstance(v.CharsetService),r._instantiationService.setService(s.ICharsetService,r._charsetService),r._inputHandler=new y.InputHandler(r._bufferService,r._charsetService,r.coreService,r._dirtyRowService,r._logService,r.optionsService,r.coreMouseService,r.unicodeService),r.register((0,f.forwardEvent)(r._inputHandler.onLineFeed,r._onLineFeed)),r.register(r._inputHandler),r.register((0,f.forwardEvent)(r._bufferService.onResize,r._onResize)),r.register((0,f.forwardEvent)(r.coreService.onData,r._onData)),r.register((0,f.forwardEvent)(r.coreService.onBinary,r._onBinary)),r.register(r.optionsService.onOptionChange((function(e){return r._updateOptions(e)}))),r.register(r._bufferService.onScroll((function(e){r._onScroll.fire({position:r._bufferService.buffer.ydisp,source:0}),r._dirtyRowService.markRangeDirty(r._bufferService.buffer.scrollTop,r._bufferService.buffer.scrollBottom)}))),r.register(r._inputHandler.onScroll((function(e){r._onScroll.fire({position:r._bufferService.buffer.ydisp,source:0}),r._dirtyRowService.markRangeDirty(r._bufferService.buffer.scrollTop,r._bufferService.buffer.scrollBottom)}))),r._writeBuffer=new m.WriteBuffer((function(e,t){return r._inputHandler.parse(e,t)})),r}return n(t,e),Object.defineProperty(t.prototype,\"onBinary\",{get:function(){return this._onBinary.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onData\",{get:function(){return this._onData.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onLineFeed\",{get:function(){return this._onLineFeed.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onResize\",{get:function(){return this._onResize.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onScroll\",{get:function(){var e=this;return this._onScrollApi||(this._onScrollApi=new f.EventEmitter,this.register(this._onScroll.event((function(t){var r;null===(r=e._onScrollApi)||void 0===r||r.fire(t.position)})))),this._onScrollApi.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"cols\",{get:function(){return this._bufferService.cols},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"rows\",{get:function(){return this._bufferService.rows},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"buffers\",{get:function(){return this._bufferService.buffers},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"options\",{get:function(){return this.optionsService.options},set:function(e){for(var t in e)this.optionsService.options[t]=e[t]},enumerable:!1,configurable:!0}),t.prototype.dispose=function(){var t;this._isDisposed||(e.prototype.dispose.call(this),null===(t=this._windowsMode)||void 0===t||t.dispose(),this._windowsMode=void 0)},t.prototype.write=function(e,t){this._writeBuffer.write(e,t)},t.prototype.writeSync=function(e,t){this._logService.logLevel<=s.LogLevelEnum.WARN&&!S&&(this._logService.warn(\"writeSync is unreliable and will be removed soon.\"),S=!0),this._writeBuffer.writeSync(e,t)},t.prototype.resize=function(e,t){isNaN(e)||isNaN(t)||(e=Math.max(e,l.MINIMUM_COLS),t=Math.max(t,l.MINIMUM_ROWS),this._bufferService.resize(e,t))},t.prototype.scroll=function(e,t){void 0===t&&(t=!1),this._bufferService.scroll(e,t)},t.prototype.scrollLines=function(e,t,r){this._bufferService.scrollLines(e,t,r)},t.prototype.scrollPages=function(e){this._bufferService.scrollPages(e)},t.prototype.scrollToTop=function(){this._bufferService.scrollToTop()},t.prototype.scrollToBottom=function(){this._bufferService.scrollToBottom()},t.prototype.scrollToLine=function(e){this._bufferService.scrollToLine(e)},t.prototype.registerEscHandler=function(e,t){return this._inputHandler.registerEscHandler(e,t)},t.prototype.registerDcsHandler=function(e,t){return this._inputHandler.registerDcsHandler(e,t)},t.prototype.registerCsiHandler=function(e,t){return this._inputHandler.registerCsiHandler(e,t)},t.prototype.registerOscHandler=function(e,t){return this._inputHandler.registerOscHandler(e,t)},t.prototype._setup=function(){this.optionsService.rawOptions.windowsMode&&this._enableWindowsMode()},t.prototype.reset=function(){this._inputHandler.reset(),this._bufferService.reset(),this._charsetService.reset(),this.coreService.reset(),this.coreMouseService.reset()},t.prototype._updateOptions=function(e){var t;switch(e){case\"scrollback\":this.buffers.resize(this.cols,this.rows);break;case\"windowsMode\":this.optionsService.rawOptions.windowsMode?this._enableWindowsMode():(null===(t=this._windowsMode)||void 0===t||t.dispose(),this._windowsMode=void 0)}},t.prototype._enableWindowsMode=function(){var e=this;if(!this._windowsMode){var t=[];t.push(this.onLineFeed(g.updateWindowsModeWrappedState.bind(null,this._bufferService))),t.push(this.registerCsiHandler({final:\"H\"},(function(){return(0,g.updateWindowsModeWrappedState)(e._bufferService),!1}))),this._windowsMode={dispose:function(){for(var e=0,r=t;e<r.length;e++)r[e].dispose()}}}},t}(o.Disposable);t.CoreTerminal=C},8460:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.forwardEvent=t.EventEmitter=void 0;var r=function(){function e(){this._listeners=[],this._disposed=!1}return Object.defineProperty(e.prototype,\"event\",{get:function(){var e=this;return this._event||(this._event=function(t){return e._listeners.push(t),{dispose:function(){if(!e._disposed)for(var r=0;r<e._listeners.length;r++)if(e._listeners[r]===t)return void e._listeners.splice(r,1)}}}),this._event},enumerable:!1,configurable:!0}),e.prototype.fire=function(e,t){for(var r=[],i=0;i<this._listeners.length;i++)r.push(this._listeners[i]);for(i=0;i<r.length;i++)r[i].call(void 0,e,t)},e.prototype.dispose=function(){this._listeners&&(this._listeners.length=0),this._disposed=!0},e}();t.EventEmitter=r,t.forwardEvent=function(e,t){return e((function(e){return t.fire(e)}))}},5435:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,\"__esModule\",{value:!0}),t.InputHandler=t.WindowsOptionsReportType=void 0;var o,s=r(2584),a=r(7116),c=r(2015),l=r(844),h=r(8273),u=r(482),f=r(8437),_=r(8460),d=r(643),p=r(511),v=r(3734),g=r(2585),y=r(6242),m=r(6351),S=r(5941),C={\"(\":0,\")\":1,\"*\":2,\"+\":3,\"-\":1,\".\":2},b=131072;function w(e,t){if(e>24)return t.setWinLines||!1;switch(e){case 1:return!!t.restoreWin;case 2:return!!t.minimizeWin;case 3:return!!t.setWinPosition;case 4:return!!t.setWinSizePixels;case 5:return!!t.raiseWin;case 6:return!!t.lowerWin;case 7:return!!t.refreshWin;case 8:return!!t.setWinSizeChars;case 9:return!!t.maximizeWin;case 10:return!!t.fullscreenWin;case 11:return!!t.getWinState;case 13:return!!t.getWinPosition;case 14:return!!t.getWinSizePixels;case 15:return!!t.getScreenSizePixels;case 16:return!!t.getCellSizePixels;case 18:return!!t.getWinSizeChars;case 19:return!!t.getScreenSizeChars;case 20:return!!t.getIconTitle;case 21:return!!t.getWinTitle;case 22:return!!t.pushTitle;case 23:return!!t.popTitle;case 24:return!!t.setWinLines}return!1}!function(e){e[e.GET_WIN_SIZE_PIXELS=0]=\"GET_WIN_SIZE_PIXELS\",e[e.GET_CELL_SIZE_PIXELS=1]=\"GET_CELL_SIZE_PIXELS\"}(o=t.WindowsOptionsReportType||(t.WindowsOptionsReportType={}));var L=function(){function e(e,t,r,i){this._bufferService=e,this._coreService=t,this._logService=r,this._optionsService=i,this._data=new Uint32Array(0)}return e.prototype.hook=function(e){this._data=new Uint32Array(0)},e.prototype.put=function(e,t,r){this._data=(0,h.concat)(this._data,e.subarray(t,r))},e.prototype.unhook=function(e){if(!e)return this._data=new Uint32Array(0),!0;var t=(0,u.utf32ToString)(this._data);switch(this._data=new Uint32Array(0),t){case'\"q':this._coreService.triggerDataEvent(s.C0.ESC+'P1$r0\"q'+s.C0.ESC+\"\\\\\");break;case'\"p':this._coreService.triggerDataEvent(s.C0.ESC+'P1$r61;1\"p'+s.C0.ESC+\"\\\\\");break;case\"r\":var r=this._bufferService.buffer.scrollTop+1+\";\"+(this._bufferService.buffer.scrollBottom+1)+\"r\";this._coreService.triggerDataEvent(s.C0.ESC+\"P1$r\"+r+s.C0.ESC+\"\\\\\");break;case\"m\":this._coreService.triggerDataEvent(s.C0.ESC+\"P1$r0m\"+s.C0.ESC+\"\\\\\");break;case\" q\":var i={block:2,underline:4,bar:6}[this._optionsService.rawOptions.cursorStyle];i-=this._optionsService.rawOptions.cursorBlink?1:0,this._coreService.triggerDataEvent(s.C0.ESC+\"P1$r\"+i+\" q\"+s.C0.ESC+\"\\\\\");break;default:this._logService.debug(\"Unknown DCS $q %s\",t),this._coreService.triggerDataEvent(s.C0.ESC+\"P0$r\"+s.C0.ESC+\"\\\\\")}return!0},e}(),E=function(e){function t(t,r,i,n,o,l,h,d,v){void 0===v&&(v=new c.EscapeSequenceParser);var g=e.call(this)||this;g._bufferService=t,g._charsetService=r,g._coreService=i,g._dirtyRowService=n,g._logService=o,g._optionsService=l,g._coreMouseService=h,g._unicodeService=d,g._parser=v,g._parseBuffer=new Uint32Array(4096),g._stringDecoder=new u.StringToUtf32,g._utf8Decoder=new u.Utf8ToUtf32,g._workCell=new p.CellData,g._windowTitle=\"\",g._iconName=\"\",g._windowTitleStack=[],g._iconNameStack=[],g._curAttrData=f.DEFAULT_ATTR_DATA.clone(),g._eraseAttrDataInternal=f.DEFAULT_ATTR_DATA.clone(),g._onRequestBell=new _.EventEmitter,g._onRequestRefreshRows=new _.EventEmitter,g._onRequestReset=new _.EventEmitter,g._onRequestSendFocus=new _.EventEmitter,g._onRequestSyncScrollBar=new _.EventEmitter,g._onRequestWindowsOptionsReport=new _.EventEmitter,g._onA11yChar=new _.EventEmitter,g._onA11yTab=new _.EventEmitter,g._onCursorMove=new _.EventEmitter,g._onLineFeed=new _.EventEmitter,g._onScroll=new _.EventEmitter,g._onTitleChange=new _.EventEmitter,g._onColor=new _.EventEmitter,g._parseStack={paused:!1,cursorStartX:0,cursorStartY:0,decodedLength:0,position:0},g._specialColors=[256,257,258],g.register(g._parser),g._activeBuffer=g._bufferService.buffer,g.register(g._bufferService.buffers.onBufferActivate((function(e){return g._activeBuffer=e.activeBuffer}))),g._parser.setCsiHandlerFallback((function(e,t){g._logService.debug(\"Unknown CSI code: \",{identifier:g._parser.identToString(e),params:t.toArray()})})),g._parser.setEscHandlerFallback((function(e){g._logService.debug(\"Unknown ESC code: \",{identifier:g._parser.identToString(e)})})),g._parser.setExecuteHandlerFallback((function(e){g._logService.debug(\"Unknown EXECUTE code: \",{code:e})})),g._parser.setOscHandlerFallback((function(e,t,r){g._logService.debug(\"Unknown OSC code: \",{identifier:e,action:t,data:r})})),g._parser.setDcsHandlerFallback((function(e,t,r){\"HOOK\"===t&&(r=r.toArray()),g._logService.debug(\"Unknown DCS code: \",{identifier:g._parser.identToString(e),action:t,payload:r})})),g._parser.setPrintHandler((function(e,t,r){return g.print(e,t,r)})),g._parser.registerCsiHandler({final:\"@\"},(function(e){return g.insertChars(e)})),g._parser.registerCsiHandler({intermediates:\" \",final:\"@\"},(function(e){return g.scrollLeft(e)})),g._parser.registerCsiHandler({final:\"A\"},(function(e){return g.cursorUp(e)})),g._parser.registerCsiHandler({intermediates:\" \",final:\"A\"},(function(e){return g.scrollRight(e)})),g._parser.registerCsiHandler({final:\"B\"},(function(e){return g.cursorDown(e)})),g._parser.registerCsiHandler({final:\"C\"},(function(e){return g.cursorForward(e)})),g._parser.registerCsiHandler({final:\"D\"},(function(e){return g.cursorBackward(e)})),g._parser.registerCsiHandler({final:\"E\"},(function(e){return g.cursorNextLine(e)})),g._parser.registerCsiHandler({final:\"F\"},(function(e){return g.cursorPrecedingLine(e)})),g._parser.registerCsiHandler({final:\"G\"},(function(e){return g.cursorCharAbsolute(e)})),g._parser.registerCsiHandler({final:\"H\"},(function(e){return g.cursorPosition(e)})),g._parser.registerCsiHandler({final:\"I\"},(function(e){return g.cursorForwardTab(e)})),g._parser.registerCsiHandler({final:\"J\"},(function(e){return g.eraseInDisplay(e)})),g._parser.registerCsiHandler({prefix:\"?\",final:\"J\"},(function(e){return g.eraseInDisplay(e)})),g._parser.registerCsiHandler({final:\"K\"},(function(e){return g.eraseInLine(e)})),g._parser.registerCsiHandler({prefix:\"?\",final:\"K\"},(function(e){return g.eraseInLine(e)})),g._parser.registerCsiHandler({final:\"L\"},(function(e){return g.insertLines(e)})),g._parser.registerCsiHandler({final:\"M\"},(function(e){return g.deleteLines(e)})),g._parser.registerCsiHandler({final:\"P\"},(function(e){return g.deleteChars(e)})),g._parser.registerCsiHandler({final:\"S\"},(function(e){return g.scrollUp(e)})),g._parser.registerCsiHandler({final:\"T\"},(function(e){return g.scrollDown(e)})),g._parser.registerCsiHandler({final:\"X\"},(function(e){return g.eraseChars(e)})),g._parser.registerCsiHandler({final:\"Z\"},(function(e){return g.cursorBackwardTab(e)})),g._parser.registerCsiHandler({final:\"`\"},(function(e){return g.charPosAbsolute(e)})),g._parser.registerCsiHandler({final:\"a\"},(function(e){return g.hPositionRelative(e)})),g._parser.registerCsiHandler({final:\"b\"},(function(e){return g.repeatPrecedingCharacter(e)})),g._parser.registerCsiHandler({final:\"c\"},(function(e){return g.sendDeviceAttributesPrimary(e)})),g._parser.registerCsiHandler({prefix:\">\",final:\"c\"},(function(e){return g.sendDeviceAttributesSecondary(e)})),g._parser.registerCsiHandler({final:\"d\"},(function(e){return g.linePosAbsolute(e)})),g._parser.registerCsiHandler({final:\"e\"},(function(e){return g.vPositionRelative(e)})),g._parser.registerCsiHandler({final:\"f\"},(function(e){return g.hVPosition(e)})),g._parser.registerCsiHandler({final:\"g\"},(function(e){return g.tabClear(e)})),g._parser.registerCsiHandler({final:\"h\"},(function(e){return g.setMode(e)})),g._parser.registerCsiHandler({prefix:\"?\",final:\"h\"},(function(e){return g.setModePrivate(e)})),g._parser.registerCsiHandler({final:\"l\"},(function(e){return g.resetMode(e)})),g._parser.registerCsiHandler({prefix:\"?\",final:\"l\"},(function(e){return g.resetModePrivate(e)})),g._parser.registerCsiHandler({final:\"m\"},(function(e){return g.charAttributes(e)})),g._parser.registerCsiHandler({final:\"n\"},(function(e){return g.deviceStatus(e)})),g._parser.registerCsiHandler({prefix:\"?\",final:\"n\"},(function(e){return g.deviceStatusPrivate(e)})),g._parser.registerCsiHandler({intermediates:\"!\",final:\"p\"},(function(e){return g.softReset(e)})),g._parser.registerCsiHandler({intermediates:\" \",final:\"q\"},(function(e){return g.setCursorStyle(e)})),g._parser.registerCsiHandler({final:\"r\"},(function(e){return g.setScrollRegion(e)})),g._parser.registerCsiHandler({final:\"s\"},(function(e){return g.saveCursor(e)})),g._parser.registerCsiHandler({final:\"t\"},(function(e){return g.windowOptions(e)})),g._parser.registerCsiHandler({final:\"u\"},(function(e){return g.restoreCursor(e)})),g._parser.registerCsiHandler({intermediates:\"'\",final:\"}\"},(function(e){return g.insertColumns(e)})),g._parser.registerCsiHandler({intermediates:\"'\",final:\"~\"},(function(e){return g.deleteColumns(e)})),g._parser.setExecuteHandler(s.C0.BEL,(function(){return g.bell()})),g._parser.setExecuteHandler(s.C0.LF,(function(){return g.lineFeed()})),g._parser.setExecuteHandler(s.C0.VT,(function(){return g.lineFeed()})),g._parser.setExecuteHandler(s.C0.FF,(function(){return g.lineFeed()})),g._parser.setExecuteHandler(s.C0.CR,(function(){return g.carriageReturn()})),g._parser.setExecuteHandler(s.C0.BS,(function(){return g.backspace()})),g._parser.setExecuteHandler(s.C0.HT,(function(){return g.tab()})),g._parser.setExecuteHandler(s.C0.SO,(function(){return g.shiftOut()})),g._parser.setExecuteHandler(s.C0.SI,(function(){return g.shiftIn()})),g._parser.setExecuteHandler(s.C1.IND,(function(){return g.index()})),g._parser.setExecuteHandler(s.C1.NEL,(function(){return g.nextLine()})),g._parser.setExecuteHandler(s.C1.HTS,(function(){return g.tabSet()})),g._parser.registerOscHandler(0,new y.OscHandler((function(e){return g.setTitle(e),g.setIconName(e),!0}))),g._parser.registerOscHandler(1,new y.OscHandler((function(e){return g.setIconName(e)}))),g._parser.registerOscHandler(2,new y.OscHandler((function(e){return g.setTitle(e)}))),g._parser.registerOscHandler(4,new y.OscHandler((function(e){return g.setOrReportIndexedColor(e)}))),g._parser.registerOscHandler(10,new y.OscHandler((function(e){return g.setOrReportFgColor(e)}))),g._parser.registerOscHandler(11,new y.OscHandler((function(e){return g.setOrReportBgColor(e)}))),g._parser.registerOscHandler(12,new y.OscHandler((function(e){return g.setOrReportCursorColor(e)}))),g._parser.registerOscHandler(104,new y.OscHandler((function(e){return g.restoreIndexedColor(e)}))),g._parser.registerOscHandler(110,new y.OscHandler((function(e){return g.restoreFgColor(e)}))),g._parser.registerOscHandler(111,new y.OscHandler((function(e){return g.restoreBgColor(e)}))),g._parser.registerOscHandler(112,new y.OscHandler((function(e){return g.restoreCursorColor(e)}))),g._parser.registerEscHandler({final:\"7\"},(function(){return g.saveCursor()})),g._parser.registerEscHandler({final:\"8\"},(function(){return g.restoreCursor()})),g._parser.registerEscHandler({final:\"D\"},(function(){return g.index()})),g._parser.registerEscHandler({final:\"E\"},(function(){return g.nextLine()})),g._parser.registerEscHandler({final:\"H\"},(function(){return g.tabSet()})),g._parser.registerEscHandler({final:\"M\"},(function(){return g.reverseIndex()})),g._parser.registerEscHandler({final:\"=\"},(function(){return g.keypadApplicationMode()})),g._parser.registerEscHandler({final:\">\"},(function(){return g.keypadNumericMode()})),g._parser.registerEscHandler({final:\"c\"},(function(){return g.fullReset()})),g._parser.registerEscHandler({final:\"n\"},(function(){return g.setgLevel(2)})),g._parser.registerEscHandler({final:\"o\"},(function(){return g.setgLevel(3)})),g._parser.registerEscHandler({final:\"|\"},(function(){return g.setgLevel(3)})),g._parser.registerEscHandler({final:\"}\"},(function(){return g.setgLevel(2)})),g._parser.registerEscHandler({final:\"~\"},(function(){return g.setgLevel(1)})),g._parser.registerEscHandler({intermediates:\"%\",final:\"@\"},(function(){return g.selectDefaultCharset()})),g._parser.registerEscHandler({intermediates:\"%\",final:\"G\"},(function(){return g.selectDefaultCharset()}));var m=function(e){S._parser.registerEscHandler({intermediates:\"(\",final:e},(function(){return g.selectCharset(\"(\"+e)})),S._parser.registerEscHandler({intermediates:\")\",final:e},(function(){return g.selectCharset(\")\"+e)})),S._parser.registerEscHandler({intermediates:\"*\",final:e},(function(){return g.selectCharset(\"*\"+e)})),S._parser.registerEscHandler({intermediates:\"+\",final:e},(function(){return g.selectCharset(\"+\"+e)})),S._parser.registerEscHandler({intermediates:\"-\",final:e},(function(){return g.selectCharset(\"-\"+e)})),S._parser.registerEscHandler({intermediates:\".\",final:e},(function(){return g.selectCharset(\".\"+e)})),S._parser.registerEscHandler({intermediates:\"/\",final:e},(function(){return g.selectCharset(\"/\"+e)}))},S=this;for(var C in a.CHARSETS)m(C);return g._parser.registerEscHandler({intermediates:\"#\",final:\"8\"},(function(){return g.screenAlignmentPattern()})),g._parser.setErrorHandler((function(e){return g._logService.error(\"Parsing error: \",e),e})),g._parser.registerDcsHandler({intermediates:\"$\",final:\"q\"},new L(g._bufferService,g._coreService,g._logService,g._optionsService)),g}return n(t,e),Object.defineProperty(t.prototype,\"onRequestBell\",{get:function(){return this._onRequestBell.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onRequestRefreshRows\",{get:function(){return this._onRequestRefreshRows.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onRequestReset\",{get:function(){return this._onRequestReset.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onRequestSendFocus\",{get:function(){return this._onRequestSendFocus.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onRequestSyncScrollBar\",{get:function(){return this._onRequestSyncScrollBar.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onRequestWindowsOptionsReport\",{get:function(){return this._onRequestWindowsOptionsReport.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onA11yChar\",{get:function(){return this._onA11yChar.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onA11yTab\",{get:function(){return this._onA11yTab.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onCursorMove\",{get:function(){return this._onCursorMove.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onLineFeed\",{get:function(){return this._onLineFeed.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onScroll\",{get:function(){return this._onScroll.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onTitleChange\",{get:function(){return this._onTitleChange.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onColor\",{get:function(){return this._onColor.event},enumerable:!1,configurable:!0}),t.prototype.dispose=function(){e.prototype.dispose.call(this)},t.prototype._preserveStack=function(e,t,r,i){this._parseStack.paused=!0,this._parseStack.cursorStartX=e,this._parseStack.cursorStartY=t,this._parseStack.decodedLength=r,this._parseStack.position=i},t.prototype._logSlowResolvingAsync=function(e){this._logService.logLevel<=g.LogLevelEnum.WARN&&Promise.race([e,new Promise((function(e,t){return setTimeout((function(){return t(\"#SLOW_TIMEOUT\")}),5e3)}))]).catch((function(e){if(\"#SLOW_TIMEOUT\"!==e)throw e;console.warn(\"async parser handler taking longer than 5000 ms\")}))},t.prototype.parse=function(e,t){var r,i=this._activeBuffer.x,n=this._activeBuffer.y,o=0,s=this._parseStack.paused;if(s){if(r=this._parser.parse(this._parseBuffer,this._parseStack.decodedLength,t))return this._logSlowResolvingAsync(r),r;i=this._parseStack.cursorStartX,n=this._parseStack.cursorStartY,this._parseStack.paused=!1,e.length>b&&(o=this._parseStack.position+b)}if(this._logService.logLevel<=g.LogLevelEnum.DEBUG&&this._logService.debug(\"parsing data\"+(\"string\"==typeof e?' \"'+e+'\"':' \"'+Array.prototype.map.call(e,(function(e){return String.fromCharCode(e)})).join(\"\")+'\"'),\"string\"==typeof e?e.split(\"\").map((function(e){return e.charCodeAt(0)})):e),this._parseBuffer.length<e.length&&this._parseBuffer.length<b&&(this._parseBuffer=new Uint32Array(Math.min(e.length,b))),s||this._dirtyRowService.clearRange(),e.length>b)for(var a=o;a<e.length;a+=b){var c=a+b<e.length?a+b:e.length,l=\"string\"==typeof e?this._stringDecoder.decode(e.substring(a,c),this._parseBuffer):this._utf8Decoder.decode(e.subarray(a,c),this._parseBuffer);if(r=this._parser.parse(this._parseBuffer,l))return this._preserveStack(i,n,l,a),this._logSlowResolvingAsync(r),r}else if(!s&&(l=\"string\"==typeof e?this._stringDecoder.decode(e,this._parseBuffer):this._utf8Decoder.decode(e,this._parseBuffer),r=this._parser.parse(this._parseBuffer,l)))return this._preserveStack(i,n,l,0),this._logSlowResolvingAsync(r),r;this._activeBuffer.x===i&&this._activeBuffer.y===n||this._onCursorMove.fire(),this._onRequestRefreshRows.fire(this._dirtyRowService.start,this._dirtyRowService.end)},t.prototype.print=function(e,t,r){var i,n,o=this._charsetService.charset,s=this._optionsService.rawOptions.screenReaderMode,a=this._bufferService.cols,c=this._coreService.decPrivateModes.wraparound,l=this._coreService.modes.insertMode,h=this._curAttrData,f=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);this._dirtyRowService.markDirty(this._activeBuffer.y),this._activeBuffer.x&&r-t>0&&2===f.getWidth(this._activeBuffer.x-1)&&f.setCellFromCodePoint(this._activeBuffer.x-1,0,1,h.fg,h.bg,h.extended);for(var _=t;_<r;++_){if(i=e[_],n=this._unicodeService.wcwidth(i),i<127&&o){var p=o[String.fromCharCode(i)];p&&(i=p.charCodeAt(0))}if(s&&this._onA11yChar.fire((0,u.stringFromCodePoint)(i)),n||!this._activeBuffer.x){if(this._activeBuffer.x+n-1>=a)if(c){for(;this._activeBuffer.x<a;)f.setCellFromCodePoint(this._activeBuffer.x++,0,1,h.fg,h.bg,h.extended);this._activeBuffer.x=0,this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData(),!0)):(this._activeBuffer.y>=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!0),f=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y)}else if(this._activeBuffer.x=a-1,2===n)continue;if(l&&(f.insertCells(this._activeBuffer.x,n,this._activeBuffer.getNullCell(h),h),2===f.getWidth(a-1)&&f.setCellFromCodePoint(a-1,d.NULL_CELL_CODE,d.NULL_CELL_WIDTH,h.fg,h.bg,h.extended)),f.setCellFromCodePoint(this._activeBuffer.x++,i,n,h.fg,h.bg,h.extended),n>0)for(;--n;)f.setCellFromCodePoint(this._activeBuffer.x++,0,0,h.fg,h.bg,h.extended)}else f.getWidth(this._activeBuffer.x-1)?f.addCodepointToCell(this._activeBuffer.x-1,i):f.addCodepointToCell(this._activeBuffer.x-2,i)}r-t>0&&(f.loadCell(this._activeBuffer.x-1,this._workCell),2===this._workCell.getWidth()||this._workCell.getCode()>65535?this._parser.precedingCodepoint=0:this._workCell.isCombined()?this._parser.precedingCodepoint=this._workCell.getChars().charCodeAt(0):this._parser.precedingCodepoint=this._workCell.content),this._activeBuffer.x<a&&r-t>0&&0===f.getWidth(this._activeBuffer.x)&&!f.hasContent(this._activeBuffer.x)&&f.setCellFromCodePoint(this._activeBuffer.x,0,1,h.fg,h.bg,h.extended),this._dirtyRowService.markDirty(this._activeBuffer.y)},t.prototype.registerCsiHandler=function(e,t){var r=this;return\"t\"!==e.final||e.prefix||e.intermediates?this._parser.registerCsiHandler(e,t):this._parser.registerCsiHandler(e,(function(e){return!w(e.params[0],r._optionsService.rawOptions.windowOptions)||t(e)}))},t.prototype.registerDcsHandler=function(e,t){return this._parser.registerDcsHandler(e,new m.DcsHandler(t))},t.prototype.registerEscHandler=function(e,t){return this._parser.registerEscHandler(e,t)},t.prototype.registerOscHandler=function(e,t){return this._parser.registerOscHandler(e,new y.OscHandler(t))},t.prototype.bell=function(){return this._onRequestBell.fire(),!0},t.prototype.lineFeed=function(){return this._dirtyRowService.markDirty(this._activeBuffer.y),this._optionsService.rawOptions.convertEol&&(this._activeBuffer.x=0),this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData())):this._activeBuffer.y>=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._activeBuffer.x>=this._bufferService.cols&&this._activeBuffer.x--,this._dirtyRowService.markDirty(this._activeBuffer.y),this._onLineFeed.fire(),!0},t.prototype.carriageReturn=function(){return this._activeBuffer.x=0,!0},t.prototype.backspace=function(){var e;if(!this._coreService.decPrivateModes.reverseWraparound)return this._restrictCursor(),this._activeBuffer.x>0&&this._activeBuffer.x--,!0;if(this._restrictCursor(this._bufferService.cols),this._activeBuffer.x>0)this._activeBuffer.x--;else if(0===this._activeBuffer.x&&this._activeBuffer.y>this._activeBuffer.scrollTop&&this._activeBuffer.y<=this._activeBuffer.scrollBottom&&(null===(e=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y))||void 0===e?void 0:e.isWrapped)){this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y).isWrapped=!1,this._activeBuffer.y--,this._activeBuffer.x=this._bufferService.cols-1;var t=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);t.hasWidth(this._activeBuffer.x)&&!t.hasContent(this._activeBuffer.x)&&this._activeBuffer.x--}return this._restrictCursor(),!0},t.prototype.tab=function(){if(this._activeBuffer.x>=this._bufferService.cols)return!0;var e=this._activeBuffer.x;return this._activeBuffer.x=this._activeBuffer.nextStop(),this._optionsService.rawOptions.screenReaderMode&&this._onA11yTab.fire(this._activeBuffer.x-e),!0},t.prototype.shiftOut=function(){return this._charsetService.setgLevel(1),!0},t.prototype.shiftIn=function(){return this._charsetService.setgLevel(0),!0},t.prototype._restrictCursor=function(e){void 0===e&&(e=this._bufferService.cols-1),this._activeBuffer.x=Math.min(e,Math.max(0,this._activeBuffer.x)),this._activeBuffer.y=this._coreService.decPrivateModes.origin?Math.min(this._activeBuffer.scrollBottom,Math.max(this._activeBuffer.scrollTop,this._activeBuffer.y)):Math.min(this._bufferService.rows-1,Math.max(0,this._activeBuffer.y)),this._dirtyRowService.markDirty(this._activeBuffer.y)},t.prototype._setCursor=function(e,t){this._dirtyRowService.markDirty(this._activeBuffer.y),this._coreService.decPrivateModes.origin?(this._activeBuffer.x=e,this._activeBuffer.y=this._activeBuffer.scrollTop+t):(this._activeBuffer.x=e,this._activeBuffer.y=t),this._restrictCursor(),this._dirtyRowService.markDirty(this._activeBuffer.y)},t.prototype._moveCursor=function(e,t){this._restrictCursor(),this._setCursor(this._activeBuffer.x+e,this._activeBuffer.y+t)},t.prototype.cursorUp=function(e){var t=this._activeBuffer.y-this._activeBuffer.scrollTop;return t>=0?this._moveCursor(0,-Math.min(t,e.params[0]||1)):this._moveCursor(0,-(e.params[0]||1)),!0},t.prototype.cursorDown=function(e){var t=this._activeBuffer.scrollBottom-this._activeBuffer.y;return t>=0?this._moveCursor(0,Math.min(t,e.params[0]||1)):this._moveCursor(0,e.params[0]||1),!0},t.prototype.cursorForward=function(e){return this._moveCursor(e.params[0]||1,0),!0},t.prototype.cursorBackward=function(e){return this._moveCursor(-(e.params[0]||1),0),!0},t.prototype.cursorNextLine=function(e){return this.cursorDown(e),this._activeBuffer.x=0,!0},t.prototype.cursorPrecedingLine=function(e){return this.cursorUp(e),this._activeBuffer.x=0,!0},t.prototype.cursorCharAbsolute=function(e){return this._setCursor((e.params[0]||1)-1,this._activeBuffer.y),!0},t.prototype.cursorPosition=function(e){return this._setCursor(e.length>=2?(e.params[1]||1)-1:0,(e.params[0]||1)-1),!0},t.prototype.charPosAbsolute=function(e){return this._setCursor((e.params[0]||1)-1,this._activeBuffer.y),!0},t.prototype.hPositionRelative=function(e){return this._moveCursor(e.params[0]||1,0),!0},t.prototype.linePosAbsolute=function(e){return this._setCursor(this._activeBuffer.x,(e.params[0]||1)-1),!0},t.prototype.vPositionRelative=function(e){return this._moveCursor(0,e.params[0]||1),!0},t.prototype.hVPosition=function(e){return this.cursorPosition(e),!0},t.prototype.tabClear=function(e){var t=e.params[0];return 0===t?delete this._activeBuffer.tabs[this._activeBuffer.x]:3===t&&(this._activeBuffer.tabs={}),!0},t.prototype.cursorForwardTab=function(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;for(var t=e.params[0]||1;t--;)this._activeBuffer.x=this._activeBuffer.nextStop();return!0},t.prototype.cursorBackwardTab=function(e){if(this._activeBuffer.x>=this._bufferService.cols)return!0;for(var t=e.params[0]||1;t--;)this._activeBuffer.x=this._activeBuffer.prevStop();return!0},t.prototype._eraseInBufferLine=function(e,t,r,i){void 0===i&&(i=!1);var n=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);n.replaceCells(t,r,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),i&&(n.isWrapped=!1)},t.prototype._resetBufferLine=function(e){var t=this._activeBuffer.lines.get(this._activeBuffer.ybase+e);t.fill(this._activeBuffer.getNullCell(this._eraseAttrData())),this._bufferService.buffer.clearMarkers(this._activeBuffer.ybase+e),t.isWrapped=!1},t.prototype.eraseInDisplay=function(e){var t;switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:for(t=this._activeBuffer.y,this._dirtyRowService.markDirty(t),this._eraseInBufferLine(t++,this._activeBuffer.x,this._bufferService.cols,0===this._activeBuffer.x);t<this._bufferService.rows;t++)this._resetBufferLine(t);this._dirtyRowService.markDirty(t);break;case 1:for(t=this._activeBuffer.y,this._dirtyRowService.markDirty(t),this._eraseInBufferLine(t,0,this._activeBuffer.x+1,!0),this._activeBuffer.x+1>=this._bufferService.cols&&(this._activeBuffer.lines.get(t+1).isWrapped=!1);t--;)this._resetBufferLine(t);this._dirtyRowService.markDirty(0);break;case 2:for(t=this._bufferService.rows,this._dirtyRowService.markDirty(t-1);t--;)this._resetBufferLine(t);this._dirtyRowService.markDirty(0);break;case 3:var r=this._activeBuffer.lines.length-this._bufferService.rows;r>0&&(this._activeBuffer.lines.trimStart(r),this._activeBuffer.ybase=Math.max(this._activeBuffer.ybase-r,0),this._activeBuffer.ydisp=Math.max(this._activeBuffer.ydisp-r,0),this._onScroll.fire(0))}return!0},t.prototype.eraseInLine=function(e){switch(this._restrictCursor(this._bufferService.cols),e.params[0]){case 0:this._eraseInBufferLine(this._activeBuffer.y,this._activeBuffer.x,this._bufferService.cols,0===this._activeBuffer.x);break;case 1:this._eraseInBufferLine(this._activeBuffer.y,0,this._activeBuffer.x+1,!1);break;case 2:this._eraseInBufferLine(this._activeBuffer.y,0,this._bufferService.cols,!0)}return this._dirtyRowService.markDirty(this._activeBuffer.y),!0},t.prototype.insertLines=function(e){this._restrictCursor();var t=e.params[0]||1;if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;for(var r=this._activeBuffer.ybase+this._activeBuffer.y,i=this._bufferService.rows-1-this._activeBuffer.scrollBottom,n=this._bufferService.rows-1+this._activeBuffer.ybase-i+1;t--;)this._activeBuffer.lines.splice(n-1,1),this._activeBuffer.lines.splice(r,0,this._activeBuffer.getBlankLine(this._eraseAttrData()));return this._dirtyRowService.markRangeDirty(this._activeBuffer.y,this._activeBuffer.scrollBottom),this._activeBuffer.x=0,!0},t.prototype.deleteLines=function(e){this._restrictCursor();var t=e.params[0]||1;if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;var r,i=this._activeBuffer.ybase+this._activeBuffer.y;for(r=this._bufferService.rows-1-this._activeBuffer.scrollBottom,r=this._bufferService.rows-1+this._activeBuffer.ybase-r;t--;)this._activeBuffer.lines.splice(i,1),this._activeBuffer.lines.splice(r,0,this._activeBuffer.getBlankLine(this._eraseAttrData()));return this._dirtyRowService.markRangeDirty(this._activeBuffer.y,this._activeBuffer.scrollBottom),this._activeBuffer.x=0,!0},t.prototype.insertChars=function(e){this._restrictCursor();var t=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);return t&&(t.insertCells(this._activeBuffer.x,e.params[0]||1,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),this._dirtyRowService.markDirty(this._activeBuffer.y)),!0},t.prototype.deleteChars=function(e){this._restrictCursor();var t=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);return t&&(t.deleteCells(this._activeBuffer.x,e.params[0]||1,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),this._dirtyRowService.markDirty(this._activeBuffer.y)),!0},t.prototype.scrollUp=function(e){for(var t=e.params[0]||1;t--;)this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollTop,1),this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollBottom,0,this._activeBuffer.getBlankLine(this._eraseAttrData()));return this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0},t.prototype.scrollDown=function(e){for(var t=e.params[0]||1;t--;)this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollBottom,1),this._activeBuffer.lines.splice(this._activeBuffer.ybase+this._activeBuffer.scrollTop,0,this._activeBuffer.getBlankLine(f.DEFAULT_ATTR_DATA));return this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0},t.prototype.scrollLeft=function(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;for(var t=e.params[0]||1,r=this._activeBuffer.scrollTop;r<=this._activeBuffer.scrollBottom;++r){var i=this._activeBuffer.lines.get(this._activeBuffer.ybase+r);i.deleteCells(0,t,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),i.isWrapped=!1}return this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0},t.prototype.scrollRight=function(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;for(var t=e.params[0]||1,r=this._activeBuffer.scrollTop;r<=this._activeBuffer.scrollBottom;++r){var i=this._activeBuffer.lines.get(this._activeBuffer.ybase+r);i.insertCells(0,t,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),i.isWrapped=!1}return this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0},t.prototype.insertColumns=function(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;for(var t=e.params[0]||1,r=this._activeBuffer.scrollTop;r<=this._activeBuffer.scrollBottom;++r){var i=this._activeBuffer.lines.get(this._activeBuffer.ybase+r);i.insertCells(this._activeBuffer.x,t,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),i.isWrapped=!1}return this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0},t.prototype.deleteColumns=function(e){if(this._activeBuffer.y>this._activeBuffer.scrollBottom||this._activeBuffer.y<this._activeBuffer.scrollTop)return!0;for(var t=e.params[0]||1,r=this._activeBuffer.scrollTop;r<=this._activeBuffer.scrollBottom;++r){var i=this._activeBuffer.lines.get(this._activeBuffer.ybase+r);i.deleteCells(this._activeBuffer.x,t,this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),i.isWrapped=!1}return this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom),!0},t.prototype.eraseChars=function(e){this._restrictCursor();var t=this._activeBuffer.lines.get(this._activeBuffer.ybase+this._activeBuffer.y);return t&&(t.replaceCells(this._activeBuffer.x,this._activeBuffer.x+(e.params[0]||1),this._activeBuffer.getNullCell(this._eraseAttrData()),this._eraseAttrData()),this._dirtyRowService.markDirty(this._activeBuffer.y)),!0},t.prototype.repeatPrecedingCharacter=function(e){if(!this._parser.precedingCodepoint)return!0;for(var t=e.params[0]||1,r=new Uint32Array(t),i=0;i<t;++i)r[i]=this._parser.precedingCodepoint;return this.print(r,0,r.length),!0},t.prototype.sendDeviceAttributesPrimary=function(e){return e.params[0]>0||(this._is(\"xterm\")||this._is(\"rxvt-unicode\")||this._is(\"screen\")?this._coreService.triggerDataEvent(s.C0.ESC+\"[?1;2c\"):this._is(\"linux\")&&this._coreService.triggerDataEvent(s.C0.ESC+\"[?6c\")),!0},t.prototype.sendDeviceAttributesSecondary=function(e){return e.params[0]>0||(this._is(\"xterm\")?this._coreService.triggerDataEvent(s.C0.ESC+\"[>0;276;0c\"):this._is(\"rxvt-unicode\")?this._coreService.triggerDataEvent(s.C0.ESC+\"[>85;95;0c\"):this._is(\"linux\")?this._coreService.triggerDataEvent(e.params[0]+\"c\"):this._is(\"screen\")&&this._coreService.triggerDataEvent(s.C0.ESC+\"[>83;40003;0c\")),!0},t.prototype._is=function(e){return 0===(this._optionsService.rawOptions.termName+\"\").indexOf(e)},t.prototype.setMode=function(e){for(var t=0;t<e.length;t++)4===e.params[t]&&(this._coreService.modes.insertMode=!0);return!0},t.prototype.setModePrivate=function(e){for(var t=0;t<e.length;t++)switch(e.params[t]){case 1:this._coreService.decPrivateModes.applicationCursorKeys=!0;break;case 2:this._charsetService.setgCharset(0,a.DEFAULT_CHARSET),this._charsetService.setgCharset(1,a.DEFAULT_CHARSET),this._charsetService.setgCharset(2,a.DEFAULT_CHARSET),this._charsetService.setgCharset(3,a.DEFAULT_CHARSET);break;case 3:this._optionsService.rawOptions.windowOptions.setWinLines&&(this._bufferService.resize(132,this._bufferService.rows),this._onRequestReset.fire());break;case 6:this._coreService.decPrivateModes.origin=!0,this._setCursor(0,0);break;case 7:this._coreService.decPrivateModes.wraparound=!0;break;case 12:break;case 45:this._coreService.decPrivateModes.reverseWraparound=!0;break;case 66:this._logService.debug(\"Serial port requested application keypad.\"),this._coreService.decPrivateModes.applicationKeypad=!0,this._onRequestSyncScrollBar.fire();break;case 9:this._coreMouseService.activeProtocol=\"X10\";break;case 1e3:this._coreMouseService.activeProtocol=\"VT200\";break;case 1002:this._coreMouseService.activeProtocol=\"DRAG\";break;case 1003:this._coreMouseService.activeProtocol=\"ANY\";break;case 1004:this._coreService.decPrivateModes.sendFocus=!0,this._onRequestSendFocus.fire();break;case 1005:this._logService.debug(\"DECSET 1005 not supported (see #2507)\");break;case 1006:this._coreMouseService.activeEncoding=\"SGR\";break;case 1015:this._logService.debug(\"DECSET 1015 not supported (see #2507)\");break;case 25:this._coreService.isCursorHidden=!1;break;case 1048:this.saveCursor();break;case 1049:this.saveCursor();case 47:case 1047:this._bufferService.buffers.activateAltBuffer(this._eraseAttrData()),this._coreService.isCursorInitialized=!0,this._onRequestRefreshRows.fire(0,this._bufferService.rows-1),this._onRequestSyncScrollBar.fire();break;case 2004:this._coreService.decPrivateModes.bracketedPasteMode=!0}return!0},t.prototype.resetMode=function(e){for(var t=0;t<e.length;t++)4===e.params[t]&&(this._coreService.modes.insertMode=!1);return!0},t.prototype.resetModePrivate=function(e){for(var t=0;t<e.length;t++)switch(e.params[t]){case 1:this._coreService.decPrivateModes.applicationCursorKeys=!1;break;case 3:this._optionsService.rawOptions.windowOptions.setWinLines&&(this._bufferService.resize(80,this._bufferService.rows),this._onRequestReset.fire());break;case 6:this._coreService.decPrivateModes.origin=!1,this._setCursor(0,0);break;case 7:this._coreService.decPrivateModes.wraparound=!1;break;case 12:break;case 45:this._coreService.decPrivateModes.reverseWraparound=!1;break;case 66:this._logService.debug(\"Switching back to normal keypad.\"),this._coreService.decPrivateModes.applicationKeypad=!1,this._onRequestSyncScrollBar.fire();break;case 9:case 1e3:case 1002:case 1003:this._coreMouseService.activeProtocol=\"NONE\";break;case 1004:this._coreService.decPrivateModes.sendFocus=!1;break;case 1005:this._logService.debug(\"DECRST 1005 not supported (see #2507)\");break;case 1006:this._coreMouseService.activeEncoding=\"DEFAULT\";break;case 1015:this._logService.debug(\"DECRST 1015 not supported (see #2507)\");break;case 25:this._coreService.isCursorHidden=!0;break;case 1048:this.restoreCursor();break;case 1049:case 47:case 1047:this._bufferService.buffers.activateNormalBuffer(),1049===e.params[t]&&this.restoreCursor(),this._coreService.isCursorInitialized=!0,this._onRequestRefreshRows.fire(0,this._bufferService.rows-1),this._onRequestSyncScrollBar.fire();break;case 2004:this._coreService.decPrivateModes.bracketedPasteMode=!1}return!0},t.prototype._updateAttrColor=function(e,t,r,i,n){return 2===t?(e|=50331648,e&=-16777216,e|=v.AttributeData.fromColorRGB([r,i,n])):5===t&&(e&=-50331904,e|=33554432|255&r),e},t.prototype._extractColor=function(e,t,r){var i=[0,0,-1,0,0,0],n=0,o=0;do{if(i[o+n]=e.params[t+o],e.hasSubParams(t+o)){var s=e.getSubParams(t+o),a=0;do{5===i[1]&&(n=1),i[o+a+1+n]=s[a]}while(++a<s.length&&a+o+1+n<i.length);break}if(5===i[1]&&o+n>=2||2===i[1]&&o+n>=5)break;i[1]&&(n=1)}while(++o+t<e.length&&o+n<i.length);for(a=2;a<i.length;++a)-1===i[a]&&(i[a]=0);switch(i[0]){case 38:r.fg=this._updateAttrColor(r.fg,i[1],i[3],i[4],i[5]);break;case 48:r.bg=this._updateAttrColor(r.bg,i[1],i[3],i[4],i[5]);break;case 58:r.extended=r.extended.clone(),r.extended.underlineColor=this._updateAttrColor(r.extended.underlineColor,i[1],i[3],i[4],i[5])}return o},t.prototype._processUnderline=function(e,t){t.extended=t.extended.clone(),(!~e||e>5)&&(e=1),t.extended.underlineStyle=e,t.fg|=268435456,0===e&&(t.fg&=-268435457),t.updateExtended()},t.prototype.charAttributes=function(e){if(1===e.length&&0===e.params[0])return this._curAttrData.fg=f.DEFAULT_ATTR_DATA.fg,this._curAttrData.bg=f.DEFAULT_ATTR_DATA.bg,!0;for(var t,r=e.length,i=this._curAttrData,n=0;n<r;n++)(t=e.params[n])>=30&&t<=37?(i.fg&=-50331904,i.fg|=16777216|t-30):t>=40&&t<=47?(i.bg&=-50331904,i.bg|=16777216|t-40):t>=90&&t<=97?(i.fg&=-50331904,i.fg|=16777224|t-90):t>=100&&t<=107?(i.bg&=-50331904,i.bg|=16777224|t-100):0===t?(i.fg=f.DEFAULT_ATTR_DATA.fg,i.bg=f.DEFAULT_ATTR_DATA.bg):1===t?i.fg|=134217728:3===t?i.bg|=67108864:4===t?(i.fg|=268435456,this._processUnderline(e.hasSubParams(n)?e.getSubParams(n)[0]:1,i)):5===t?i.fg|=536870912:7===t?i.fg|=67108864:8===t?i.fg|=1073741824:9===t?i.fg|=2147483648:2===t?i.bg|=134217728:21===t?this._processUnderline(2,i):22===t?(i.fg&=-134217729,i.bg&=-134217729):23===t?i.bg&=-67108865:24===t?i.fg&=-268435457:25===t?i.fg&=-536870913:27===t?i.fg&=-67108865:28===t?i.fg&=-1073741825:29===t?i.fg&=2147483647:39===t?(i.fg&=-67108864,i.fg|=16777215&f.DEFAULT_ATTR_DATA.fg):49===t?(i.bg&=-67108864,i.bg|=16777215&f.DEFAULT_ATTR_DATA.bg):38===t||48===t||58===t?n+=this._extractColor(e,n,i):59===t?(i.extended=i.extended.clone(),i.extended.underlineColor=-1,i.updateExtended()):100===t?(i.fg&=-67108864,i.fg|=16777215&f.DEFAULT_ATTR_DATA.fg,i.bg&=-67108864,i.bg|=16777215&f.DEFAULT_ATTR_DATA.bg):this._logService.debug(\"Unknown SGR attribute: %d.\",t);return!0},t.prototype.deviceStatus=function(e){switch(e.params[0]){case 5:this._coreService.triggerDataEvent(s.C0.ESC+\"[0n\");break;case 6:var t=this._activeBuffer.y+1,r=this._activeBuffer.x+1;this._coreService.triggerDataEvent(s.C0.ESC+\"[\"+t+\";\"+r+\"R\")}return!0},t.prototype.deviceStatusPrivate=function(e){if(6===e.params[0]){var t=this._activeBuffer.y+1,r=this._activeBuffer.x+1;this._coreService.triggerDataEvent(s.C0.ESC+\"[?\"+t+\";\"+r+\"R\")}return!0},t.prototype.softReset=function(e){return this._coreService.isCursorHidden=!1,this._onRequestSyncScrollBar.fire(),this._activeBuffer.scrollTop=0,this._activeBuffer.scrollBottom=this._bufferService.rows-1,this._curAttrData=f.DEFAULT_ATTR_DATA.clone(),this._coreService.reset(),this._charsetService.reset(),this._activeBuffer.savedX=0,this._activeBuffer.savedY=this._activeBuffer.ybase,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,this._coreService.decPrivateModes.origin=!1,!0},t.prototype.setCursorStyle=function(e){var t=e.params[0]||1;switch(t){case 1:case 2:this._optionsService.options.cursorStyle=\"block\";break;case 3:case 4:this._optionsService.options.cursorStyle=\"underline\";break;case 5:case 6:this._optionsService.options.cursorStyle=\"bar\"}var r=t%2==1;return this._optionsService.options.cursorBlink=r,!0},t.prototype.setScrollRegion=function(e){var t,r=e.params[0]||1;return(e.length<2||(t=e.params[1])>this._bufferService.rows||0===t)&&(t=this._bufferService.rows),t>r&&(this._activeBuffer.scrollTop=r-1,this._activeBuffer.scrollBottom=t-1,this._setCursor(0,0)),!0},t.prototype.windowOptions=function(e){if(!w(e.params[0],this._optionsService.rawOptions.windowOptions))return!0;var t=e.length>1?e.params[1]:0;switch(e.params[0]){case 14:2!==t&&this._onRequestWindowsOptionsReport.fire(o.GET_WIN_SIZE_PIXELS);break;case 16:this._onRequestWindowsOptionsReport.fire(o.GET_CELL_SIZE_PIXELS);break;case 18:this._bufferService&&this._coreService.triggerDataEvent(s.C0.ESC+\"[8;\"+this._bufferService.rows+\";\"+this._bufferService.cols+\"t\");break;case 22:0!==t&&2!==t||(this._windowTitleStack.push(this._windowTitle),this._windowTitleStack.length>10&&this._windowTitleStack.shift()),0!==t&&1!==t||(this._iconNameStack.push(this._iconName),this._iconNameStack.length>10&&this._iconNameStack.shift());break;case 23:0!==t&&2!==t||this._windowTitleStack.length&&this.setTitle(this._windowTitleStack.pop()),0!==t&&1!==t||this._iconNameStack.length&&this.setIconName(this._iconNameStack.pop())}return!0},t.prototype.saveCursor=function(e){return this._activeBuffer.savedX=this._activeBuffer.x,this._activeBuffer.savedY=this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.savedCurAttrData.fg=this._curAttrData.fg,this._activeBuffer.savedCurAttrData.bg=this._curAttrData.bg,this._activeBuffer.savedCharset=this._charsetService.charset,!0},t.prototype.restoreCursor=function(e){return this._activeBuffer.x=this._activeBuffer.savedX||0,this._activeBuffer.y=Math.max(this._activeBuffer.savedY-this._activeBuffer.ybase,0),this._curAttrData.fg=this._activeBuffer.savedCurAttrData.fg,this._curAttrData.bg=this._activeBuffer.savedCurAttrData.bg,this._charsetService.charset=this._savedCharset,this._activeBuffer.savedCharset&&(this._charsetService.charset=this._activeBuffer.savedCharset),this._restrictCursor(),!0},t.prototype.setTitle=function(e){return this._windowTitle=e,this._onTitleChange.fire(e),!0},t.prototype.setIconName=function(e){return this._iconName=e,!0},t.prototype.setOrReportIndexedColor=function(e){for(var t=[],r=e.split(\";\");r.length>1;){var i=r.shift(),n=r.shift();if(/^\\d+$/.exec(i)){var o=parseInt(i);if(0<=o&&o<256)if(\"?\"===n)t.push({type:0,index:o});else{var s=(0,S.parseColor)(n);s&&t.push({type:1,index:o,color:s})}}}return t.length&&this._onColor.fire(t),!0},t.prototype._setOrReportSpecialColor=function(e,t){for(var r=e.split(\";\"),i=0;i<r.length&&!(t>=this._specialColors.length);++i,++t)if(\"?\"===r[i])this._onColor.fire([{type:0,index:this._specialColors[t]}]);else{var n=(0,S.parseColor)(r[i]);n&&this._onColor.fire([{type:1,index:this._specialColors[t],color:n}])}return!0},t.prototype.setOrReportFgColor=function(e){return this._setOrReportSpecialColor(e,0)},t.prototype.setOrReportBgColor=function(e){return this._setOrReportSpecialColor(e,1)},t.prototype.setOrReportCursorColor=function(e){return this._setOrReportSpecialColor(e,2)},t.prototype.restoreIndexedColor=function(e){if(!e)return this._onColor.fire([{type:2}]),!0;for(var t=[],r=e.split(\";\"),i=0;i<r.length;++i)if(/^\\d+$/.exec(r[i])){var n=parseInt(r[i]);0<=n&&n<256&&t.push({type:2,index:n})}return t.length&&this._onColor.fire(t),!0},t.prototype.restoreFgColor=function(e){return this._onColor.fire([{type:2,index:256}]),!0},t.prototype.restoreBgColor=function(e){return this._onColor.fire([{type:2,index:257}]),!0},t.prototype.restoreCursorColor=function(e){return this._onColor.fire([{type:2,index:258}]),!0},t.prototype.nextLine=function(){return this._activeBuffer.x=0,this.index(),!0},t.prototype.keypadApplicationMode=function(){return this._logService.debug(\"Serial port requested application keypad.\"),this._coreService.decPrivateModes.applicationKeypad=!0,this._onRequestSyncScrollBar.fire(),!0},t.prototype.keypadNumericMode=function(){return this._logService.debug(\"Switching back to normal keypad.\"),this._coreService.decPrivateModes.applicationKeypad=!1,this._onRequestSyncScrollBar.fire(),!0},t.prototype.selectDefaultCharset=function(){return this._charsetService.setgLevel(0),this._charsetService.setgCharset(0,a.DEFAULT_CHARSET),!0},t.prototype.selectCharset=function(e){return 2!==e.length?(this.selectDefaultCharset(),!0):(\"/\"===e[0]||this._charsetService.setgCharset(C[e[0]],a.CHARSETS[e[1]]||a.DEFAULT_CHARSET),!0)},t.prototype.index=function(){return this._restrictCursor(),this._activeBuffer.y++,this._activeBuffer.y===this._activeBuffer.scrollBottom+1?(this._activeBuffer.y--,this._bufferService.scroll(this._eraseAttrData())):this._activeBuffer.y>=this._bufferService.rows&&(this._activeBuffer.y=this._bufferService.rows-1),this._restrictCursor(),!0},t.prototype.tabSet=function(){return this._activeBuffer.tabs[this._activeBuffer.x]=!0,!0},t.prototype.reverseIndex=function(){if(this._restrictCursor(),this._activeBuffer.y===this._activeBuffer.scrollTop){var e=this._activeBuffer.scrollBottom-this._activeBuffer.scrollTop;this._activeBuffer.lines.shiftElements(this._activeBuffer.ybase+this._activeBuffer.y,e,1),this._activeBuffer.lines.set(this._activeBuffer.ybase+this._activeBuffer.y,this._activeBuffer.getBlankLine(this._eraseAttrData())),this._dirtyRowService.markRangeDirty(this._activeBuffer.scrollTop,this._activeBuffer.scrollBottom)}else this._activeBuffer.y--,this._restrictCursor();return!0},t.prototype.fullReset=function(){return this._parser.reset(),this._onRequestReset.fire(),!0},t.prototype.reset=function(){this._curAttrData=f.DEFAULT_ATTR_DATA.clone(),this._eraseAttrDataInternal=f.DEFAULT_ATTR_DATA.clone()},t.prototype._eraseAttrData=function(){return this._eraseAttrDataInternal.bg&=-67108864,this._eraseAttrDataInternal.bg|=67108863&this._curAttrData.bg,this._eraseAttrDataInternal},t.prototype.setgLevel=function(e){return this._charsetService.setgLevel(e),!0},t.prototype.screenAlignmentPattern=function(){var e=new p.CellData;e.content=1<<22|\"E\".charCodeAt(0),e.fg=this._curAttrData.fg,e.bg=this._curAttrData.bg,this._setCursor(0,0);for(var t=0;t<this._bufferService.rows;++t){var r=this._activeBuffer.ybase+this._activeBuffer.y+t,i=this._activeBuffer.lines.get(r);i&&(i.fill(e),i.isWrapped=!1)}return this._dirtyRowService.markAllDirty(),this._setCursor(0,0),!0},t}(l.Disposable);t.InputHandler=E},844:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.getDisposeArrayDisposable=t.disposeArray=t.Disposable=void 0;var r=function(){function e(){this._disposables=[],this._isDisposed=!1}return e.prototype.dispose=function(){this._isDisposed=!0;for(var e=0,t=this._disposables;e<t.length;e++)t[e].dispose();this._disposables.length=0},e.prototype.register=function(e){return this._disposables.push(e),e},e.prototype.unregister=function(e){var t=this._disposables.indexOf(e);-1!==t&&this._disposables.splice(t,1)},e}();function i(e){for(var t=0,r=e;t<r.length;t++)r[t].dispose();e.length=0}t.Disposable=r,t.disposeArray=i,t.getDisposeArrayDisposable=function(e){return{dispose:function(){return i(e)}}}},6114:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.isLinux=t.isWindows=t.isIphone=t.isIpad=t.isMac=t.isSafari=t.isLegacyEdge=t.isFirefox=void 0;var r=\"undefined\"==typeof navigator,i=r?\"node\":navigator.userAgent,n=r?\"node\":navigator.platform;t.isFirefox=i.includes(\"Firefox\"),t.isLegacyEdge=i.includes(\"Edge\"),t.isSafari=/^((?!chrome|android).)*safari/i.test(i),t.isMac=[\"Macintosh\",\"MacIntel\",\"MacPPC\",\"Mac68K\"].includes(n),t.isIpad=\"iPad\"===n,t.isIphone=\"iPhone\"===n,t.isWindows=[\"Windows\",\"Win16\",\"Win32\",\"WinCE\"].includes(n),t.isLinux=n.indexOf(\"Linux\")>=0},8273:(e,t)=>{function r(e,t,r,i){if(void 0===r&&(r=0),void 0===i&&(i=e.length),r>=e.length)return e;r=(e.length+r)%e.length,i=i>=e.length?e.length:(e.length+i)%e.length;for(var n=r;n<i;++n)e[n]=t;return e}Object.defineProperty(t,\"__esModule\",{value:!0}),t.concat=t.fillFallback=t.fill=void 0,t.fill=function(e,t,i,n){return e.fill?e.fill(t,i,n):r(e,t,i,n)},t.fillFallback=r,t.concat=function(e,t){var r=new e.constructor(e.length+t.length);return r.set(e),r.set(t,e.length),r}},9282:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.updateWindowsModeWrappedState=void 0;var i=r(643);t.updateWindowsModeWrappedState=function(e){var t=e.buffer.lines.get(e.buffer.ybase+e.buffer.y-1),r=null==t?void 0:t.get(e.cols-1),n=e.buffer.lines.get(e.buffer.ybase+e.buffer.y);n&&r&&(n.isWrapped=r[i.CHAR_DATA_CODE_INDEX]!==i.NULL_CELL_CODE&&r[i.CHAR_DATA_CODE_INDEX]!==i.WHITESPACE_CELL_CODE)}},3734:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.ExtendedAttrs=t.AttributeData=void 0;var r=function(){function e(){this.fg=0,this.bg=0,this.extended=new i}return e.toColorRGB=function(e){return[e>>>16&255,e>>>8&255,255&e]},e.fromColorRGB=function(e){return(255&e[0])<<16|(255&e[1])<<8|255&e[2]},e.prototype.clone=function(){var t=new e;return t.fg=this.fg,t.bg=this.bg,t.extended=this.extended.clone(),t},e.prototype.isInverse=function(){return 67108864&this.fg},e.prototype.isBold=function(){return 134217728&this.fg},e.prototype.isUnderline=function(){return 268435456&this.fg},e.prototype.isBlink=function(){return 536870912&this.fg},e.prototype.isInvisible=function(){return 1073741824&this.fg},e.prototype.isItalic=function(){return 67108864&this.bg},e.prototype.isDim=function(){return 134217728&this.bg},e.prototype.isStrikethrough=function(){return 2147483648&this.fg},e.prototype.getFgColorMode=function(){return 50331648&this.fg},e.prototype.getBgColorMode=function(){return 50331648&this.bg},e.prototype.isFgRGB=function(){return 50331648==(50331648&this.fg)},e.prototype.isBgRGB=function(){return 50331648==(50331648&this.bg)},e.prototype.isFgPalette=function(){return 16777216==(50331648&this.fg)||33554432==(50331648&this.fg)},e.prototype.isBgPalette=function(){return 16777216==(50331648&this.bg)||33554432==(50331648&this.bg)},e.prototype.isFgDefault=function(){return 0==(50331648&this.fg)},e.prototype.isBgDefault=function(){return 0==(50331648&this.bg)},e.prototype.isAttributeDefault=function(){return 0===this.fg&&0===this.bg},e.prototype.getFgColor=function(){switch(50331648&this.fg){case 16777216:case 33554432:return 255&this.fg;case 50331648:return 16777215&this.fg;default:return-1}},e.prototype.getBgColor=function(){switch(50331648&this.bg){case 16777216:case 33554432:return 255&this.bg;case 50331648:return 16777215&this.bg;default:return-1}},e.prototype.hasExtendedAttrs=function(){return 268435456&this.bg},e.prototype.updateExtended=function(){this.extended.isEmpty()?this.bg&=-268435457:this.bg|=268435456},e.prototype.getUnderlineColor=function(){if(268435456&this.bg&&~this.extended.underlineColor)switch(50331648&this.extended.underlineColor){case 16777216:case 33554432:return 255&this.extended.underlineColor;case 50331648:return 16777215&this.extended.underlineColor;default:return this.getFgColor()}return this.getFgColor()},e.prototype.getUnderlineColorMode=function(){return 268435456&this.bg&&~this.extended.underlineColor?50331648&this.extended.underlineColor:this.getFgColorMode()},e.prototype.isUnderlineColorRGB=function(){return 268435456&this.bg&&~this.extended.underlineColor?50331648==(50331648&this.extended.underlineColor):this.isFgRGB()},e.prototype.isUnderlineColorPalette=function(){return 268435456&this.bg&&~this.extended.underlineColor?16777216==(50331648&this.extended.underlineColor)||33554432==(50331648&this.extended.underlineColor):this.isFgPalette()},e.prototype.isUnderlineColorDefault=function(){return 268435456&this.bg&&~this.extended.underlineColor?0==(50331648&this.extended.underlineColor):this.isFgDefault()},e.prototype.getUnderlineStyle=function(){return 268435456&this.fg?268435456&this.bg?this.extended.underlineStyle:1:0},e}();t.AttributeData=r;var i=function(){function e(e,t){void 0===e&&(e=0),void 0===t&&(t=-1),this.underlineStyle=e,this.underlineColor=t}return e.prototype.clone=function(){return new e(this.underlineStyle,this.underlineColor)},e.prototype.isEmpty=function(){return 0===this.underlineStyle},e}();t.ExtendedAttrs=i},9092:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferStringIterator=t.Buffer=t.MAX_BUFFER_SIZE=void 0;var i=r(6349),n=r(8437),o=r(511),s=r(643),a=r(4634),c=r(4863),l=r(7116),h=r(3734);t.MAX_BUFFER_SIZE=4294967295;var u=function(){function e(e,t,r){this._hasScrollback=e,this._optionsService=t,this._bufferService=r,this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.savedY=0,this.savedX=0,this.savedCurAttrData=n.DEFAULT_ATTR_DATA.clone(),this.savedCharset=l.DEFAULT_CHARSET,this.markers=[],this._nullCell=o.CellData.fromCharData([0,s.NULL_CELL_CHAR,s.NULL_CELL_WIDTH,s.NULL_CELL_CODE]),this._whitespaceCell=o.CellData.fromCharData([0,s.WHITESPACE_CELL_CHAR,s.WHITESPACE_CELL_WIDTH,s.WHITESPACE_CELL_CODE]),this._isClearing=!1,this._cols=this._bufferService.cols,this._rows=this._bufferService.rows,this.lines=new i.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()}return e.prototype.getNullCell=function(e){return e?(this._nullCell.fg=e.fg,this._nullCell.bg=e.bg,this._nullCell.extended=e.extended):(this._nullCell.fg=0,this._nullCell.bg=0,this._nullCell.extended=new h.ExtendedAttrs),this._nullCell},e.prototype.getWhitespaceCell=function(e){return e?(this._whitespaceCell.fg=e.fg,this._whitespaceCell.bg=e.bg,this._whitespaceCell.extended=e.extended):(this._whitespaceCell.fg=0,this._whitespaceCell.bg=0,this._whitespaceCell.extended=new h.ExtendedAttrs),this._whitespaceCell},e.prototype.getBlankLine=function(e,t){return new n.BufferLine(this._bufferService.cols,this.getNullCell(e),t)},Object.defineProperty(e.prototype,\"hasScrollback\",{get:function(){return this._hasScrollback&&this.lines.maxLength>this._rows},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"isCursorInViewport\",{get:function(){var e=this.ybase+this.y-this.ydisp;return e>=0&&e<this._rows},enumerable:!1,configurable:!0}),e.prototype._getCorrectBufferLength=function(e){if(!this._hasScrollback)return e;var r=e+this._optionsService.rawOptions.scrollback;return r>t.MAX_BUFFER_SIZE?t.MAX_BUFFER_SIZE:r},e.prototype.fillViewportRows=function(e){if(0===this.lines.length){void 0===e&&(e=n.DEFAULT_ATTR_DATA);for(var t=this._rows;t--;)this.lines.push(this.getBlankLine(e))}},e.prototype.clear=function(){this.ydisp=0,this.ybase=0,this.y=0,this.x=0,this.lines=new i.CircularList(this._getCorrectBufferLength(this._rows)),this.scrollTop=0,this.scrollBottom=this._rows-1,this.setupTabStops()},e.prototype.resize=function(e,t){var r=this.getNullCell(n.DEFAULT_ATTR_DATA),i=this._getCorrectBufferLength(t);if(i>this.lines.maxLength&&(this.lines.maxLength=i),this.lines.length>0){if(this._cols<e)for(var o=0;o<this.lines.length;o++)this.lines.get(o).resize(e,r);var s=0;if(this._rows<t)for(var a=this._rows;a<t;a++)this.lines.length<t+this.ybase&&(this._optionsService.rawOptions.windowsMode?this.lines.push(new n.BufferLine(e,r)):this.ybase>0&&this.lines.length<=this.ybase+this.y+s+1?(this.ybase--,s++,this.ydisp>0&&this.ydisp--):this.lines.push(new n.BufferLine(e,r)));else for(a=this._rows;a>t;a--)this.lines.length>t+this.ybase&&(this.lines.length>this.ybase+this.y+1?this.lines.pop():(this.ybase++,this.ydisp++));if(i<this.lines.maxLength){var c=this.lines.length-i;c>0&&(this.lines.trimStart(c),this.ybase=Math.max(this.ybase-c,0),this.ydisp=Math.max(this.ydisp-c,0),this.savedY=Math.max(this.savedY-c,0)),this.lines.maxLength=i}this.x=Math.min(this.x,e-1),this.y=Math.min(this.y,t-1),s&&(this.y+=s),this.savedX=Math.min(this.savedX,e-1),this.scrollTop=0}if(this.scrollBottom=t-1,this._isReflowEnabled&&(this._reflow(e,t),this._cols>e))for(o=0;o<this.lines.length;o++)this.lines.get(o).resize(e,r);this._cols=e,this._rows=t},Object.defineProperty(e.prototype,\"_isReflowEnabled\",{get:function(){return this._hasScrollback&&!this._optionsService.rawOptions.windowsMode},enumerable:!1,configurable:!0}),e.prototype._reflow=function(e,t){this._cols!==e&&(e>this._cols?this._reflowLarger(e,t):this._reflowSmaller(e,t))},e.prototype._reflowLarger=function(e,t){var r=(0,a.reflowLargerGetLinesToRemove)(this.lines,this._cols,e,this.ybase+this.y,this.getNullCell(n.DEFAULT_ATTR_DATA));if(r.length>0){var i=(0,a.reflowLargerCreateNewLayout)(this.lines,r);(0,a.reflowLargerApplyNewLayout)(this.lines,i.layout),this._reflowLargerAdjustViewport(e,t,i.countRemoved)}},e.prototype._reflowLargerAdjustViewport=function(e,t,r){for(var i=this.getNullCell(n.DEFAULT_ATTR_DATA),o=r;o-- >0;)0===this.ybase?(this.y>0&&this.y--,this.lines.length<t&&this.lines.push(new n.BufferLine(e,i))):(this.ydisp===this.ybase&&this.ydisp--,this.ybase--);this.savedY=Math.max(this.savedY-r,0)},e.prototype._reflowSmaller=function(e,t){for(var r=this.getNullCell(n.DEFAULT_ATTR_DATA),i=[],o=0,s=this.lines.length-1;s>=0;s--){var c=this.lines.get(s);if(!(!c||!c.isWrapped&&c.getTrimmedLength()<=e)){for(var l=[c];c.isWrapped&&s>0;)c=this.lines.get(--s),l.unshift(c);var h=this.ybase+this.y;if(!(h>=s&&h<s+l.length)){var u,f=l[l.length-1].getTrimmedLength(),_=(0,a.reflowSmallerGetNewLineLengths)(l,this._cols,e),d=_.length-l.length;u=0===this.ybase&&this.y!==this.lines.length-1?Math.max(0,this.y-this.lines.maxLength+d):Math.max(0,this.lines.length-this.lines.maxLength+d);for(var p=[],v=0;v<d;v++){var g=this.getBlankLine(n.DEFAULT_ATTR_DATA,!0);p.push(g)}p.length>0&&(i.push({start:s+l.length+o,newLines:p}),o+=p.length),l.push.apply(l,p);var y=_.length-1,m=_[y];0===m&&(m=_[--y]);for(var S=l.length-d-1,C=f;S>=0;){var b=Math.min(C,m);if(void 0===l[y])break;if(l[y].copyCellsFrom(l[S],C-b,m-b,b,!0),0==(m-=b)&&(m=_[--y]),0==(C-=b)){S--;var w=Math.max(S,0);C=(0,a.getWrappedLineTrimmedLength)(l,w,this._cols)}}for(v=0;v<l.length;v++)_[v]<e&&l[v].setCell(_[v],r);for(var L=d-u;L-- >0;)0===this.ybase?this.y<t-1?(this.y++,this.lines.pop()):(this.ybase++,this.ydisp++):this.ybase<Math.min(this.lines.maxLength,this.lines.length+o)-t&&(this.ybase===this.ydisp&&this.ydisp++,this.ybase++);this.savedY=Math.min(this.savedY+d,this.ybase+t-1)}}}if(i.length>0){var E=[],x=[];for(v=0;v<this.lines.length;v++)x.push(this.lines.get(v));var k=this.lines.length,M=k-1,A=0,R=i[A];this.lines.length=Math.min(this.lines.maxLength,this.lines.length+o);var O=0;for(v=Math.min(this.lines.maxLength-1,k+o-1);v>=0;v--)if(R&&R.start>M+O){for(var T=R.newLines.length-1;T>=0;T--)this.lines.set(v--,R.newLines[T]);v++,E.push({index:M+1,amount:R.newLines.length}),O+=R.newLines.length,R=i[++A]}else this.lines.set(v,x[M--]);var D=0;for(v=E.length-1;v>=0;v--)E[v].index+=D,this.lines.onInsertEmitter.fire(E[v]),D+=E[v].amount;var B=Math.max(0,k+o-this.lines.maxLength);B>0&&this.lines.onTrimEmitter.fire(B)}},e.prototype.stringIndexToBufferIndex=function(e,t,r){for(void 0===r&&(r=!1);t;){var i=this.lines.get(e);if(!i)return[-1,-1];for(var n=r?i.getTrimmedLength():i.length,o=0;o<n;++o)if(i.get(o)[s.CHAR_DATA_WIDTH_INDEX]&&(t-=i.get(o)[s.CHAR_DATA_CHAR_INDEX].length||1),t<0)return[e,o];e++}return[e,0]},e.prototype.translateBufferLineToString=function(e,t,r,i){void 0===r&&(r=0);var n=this.lines.get(e);return n?n.translateToString(t,r,i):\"\"},e.prototype.getWrappedRangeForLine=function(e){for(var t=e,r=e;t>0&&this.lines.get(t).isWrapped;)t--;for(;r+1<this.lines.length&&this.lines.get(r+1).isWrapped;)r++;return{first:t,last:r}},e.prototype.setupTabStops=function(e){for(null!=e?this.tabs[e]||(e=this.prevStop(e)):(this.tabs={},e=0);e<this._cols;e+=this._optionsService.rawOptions.tabStopWidth)this.tabs[e]=!0},e.prototype.prevStop=function(e){for(null==e&&(e=this.x);!this.tabs[--e]&&e>0;);return e>=this._cols?this._cols-1:e<0?0:e},e.prototype.nextStop=function(e){for(null==e&&(e=this.x);!this.tabs[++e]&&e<this._cols;);return e>=this._cols?this._cols-1:e<0?0:e},e.prototype.clearMarkers=function(e){if(this._isClearing=!0,void 0!==e)for(var t=0;t<this.markers.length;t++)this.markers[t].line===e&&(this.markers[t].dispose(),this.markers.splice(t--,1));else{for(var r=0,i=this.markers;r<i.length;r++)i[r].dispose();this.markers=[]}this._isClearing=!1},e.prototype.addMarker=function(e){var t=this,r=new c.Marker(e);return this.markers.push(r),r.register(this.lines.onTrim((function(e){r.line-=e,r.line<0&&r.dispose()}))),r.register(this.lines.onInsert((function(e){r.line>=e.index&&(r.line+=e.amount)}))),r.register(this.lines.onDelete((function(e){r.line>=e.index&&r.line<e.index+e.amount&&r.dispose(),r.line>e.index&&(r.line-=e.amount)}))),r.register(r.onDispose((function(){return t._removeMarker(r)}))),r},e.prototype._removeMarker=function(e){this._isClearing||this.markers.splice(this.markers.indexOf(e),1)},e.prototype.iterator=function(e,t,r,i,n){return new f(this,e,t,r,i,n)},e}();t.Buffer=u;var f=function(){function e(e,t,r,i,n,o){void 0===r&&(r=0),void 0===i&&(i=e.lines.length),void 0===n&&(n=0),void 0===o&&(o=0),this._buffer=e,this._trimRight=t,this._startIndex=r,this._endIndex=i,this._startOverscan=n,this._endOverscan=o,this._startIndex<0&&(this._startIndex=0),this._endIndex>this._buffer.lines.length&&(this._endIndex=this._buffer.lines.length),this._current=this._startIndex}return e.prototype.hasNext=function(){return this._current<this._endIndex},e.prototype.next=function(){var e=this._buffer.getWrappedRangeForLine(this._current);e.first<this._startIndex-this._startOverscan&&(e.first=this._startIndex-this._startOverscan),e.last>this._endIndex+this._endOverscan&&(e.last=this._endIndex+this._endOverscan),e.first=Math.max(e.first,0),e.last=Math.min(e.last,this._buffer.lines.length);for(var t=\"\",r=e.first;r<=e.last;++r)t+=this._buffer.translateBufferLineToString(r,this._trimRight);return this._current=e.last+1,{range:e,content:t}},e}();t.BufferStringIterator=f},8437:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferLine=t.DEFAULT_ATTR_DATA=void 0;var i=r(482),n=r(643),o=r(511),s=r(3734);t.DEFAULT_ATTR_DATA=Object.freeze(new s.AttributeData);var a=function(){function e(e,t,r){void 0===r&&(r=!1),this.isWrapped=r,this._combined={},this._extendedAttrs={},this._data=new Uint32Array(3*e);for(var i=t||o.CellData.fromCharData([0,n.NULL_CELL_CHAR,n.NULL_CELL_WIDTH,n.NULL_CELL_CODE]),s=0;s<e;++s)this.setCell(s,i);this.length=e}return e.prototype.get=function(e){var t=this._data[3*e+0],r=2097151&t;return[this._data[3*e+1],2097152&t?this._combined[e]:r?(0,i.stringFromCodePoint)(r):\"\",t>>22,2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):r]},e.prototype.set=function(e,t){this._data[3*e+1]=t[n.CHAR_DATA_ATTR_INDEX],t[n.CHAR_DATA_CHAR_INDEX].length>1?(this._combined[e]=t[1],this._data[3*e+0]=2097152|e|t[n.CHAR_DATA_WIDTH_INDEX]<<22):this._data[3*e+0]=t[n.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|t[n.CHAR_DATA_WIDTH_INDEX]<<22},e.prototype.getWidth=function(e){return this._data[3*e+0]>>22},e.prototype.hasWidth=function(e){return 12582912&this._data[3*e+0]},e.prototype.getFg=function(e){return this._data[3*e+1]},e.prototype.getBg=function(e){return this._data[3*e+2]},e.prototype.hasContent=function(e){return 4194303&this._data[3*e+0]},e.prototype.getCodePoint=function(e){var t=this._data[3*e+0];return 2097152&t?this._combined[e].charCodeAt(this._combined[e].length-1):2097151&t},e.prototype.isCombined=function(e){return 2097152&this._data[3*e+0]},e.prototype.getString=function(e){var t=this._data[3*e+0];return 2097152&t?this._combined[e]:2097151&t?(0,i.stringFromCodePoint)(2097151&t):\"\"},e.prototype.loadCell=function(e,t){var r=3*e;return t.content=this._data[r+0],t.fg=this._data[r+1],t.bg=this._data[r+2],2097152&t.content&&(t.combinedData=this._combined[e]),268435456&t.bg&&(t.extended=this._extendedAttrs[e]),t},e.prototype.setCell=function(e,t){2097152&t.content&&(this._combined[e]=t.combinedData),268435456&t.bg&&(this._extendedAttrs[e]=t.extended),this._data[3*e+0]=t.content,this._data[3*e+1]=t.fg,this._data[3*e+2]=t.bg},e.prototype.setCellFromCodePoint=function(e,t,r,i,n,o){268435456&n&&(this._extendedAttrs[e]=o),this._data[3*e+0]=t|r<<22,this._data[3*e+1]=i,this._data[3*e+2]=n},e.prototype.addCodepointToCell=function(e,t){var r=this._data[3*e+0];2097152&r?this._combined[e]+=(0,i.stringFromCodePoint)(t):(2097151&r?(this._combined[e]=(0,i.stringFromCodePoint)(2097151&r)+(0,i.stringFromCodePoint)(t),r&=-2097152,r|=2097152):r=t|1<<22,this._data[3*e+0]=r)},e.prototype.insertCells=function(e,t,r,i){if((e%=this.length)&&2===this.getWidth(e-1)&&this.setCellFromCodePoint(e-1,0,1,(null==i?void 0:i.fg)||0,(null==i?void 0:i.bg)||0,(null==i?void 0:i.extended)||new s.ExtendedAttrs),t<this.length-e){for(var n=new o.CellData,a=this.length-e-t-1;a>=0;--a)this.setCell(e+t+a,this.loadCell(e+a,n));for(a=0;a<t;++a)this.setCell(e+a,r)}else for(a=e;a<this.length;++a)this.setCell(a,r);2===this.getWidth(this.length-1)&&this.setCellFromCodePoint(this.length-1,0,1,(null==i?void 0:i.fg)||0,(null==i?void 0:i.bg)||0,(null==i?void 0:i.extended)||new s.ExtendedAttrs)},e.prototype.deleteCells=function(e,t,r,i){if(e%=this.length,t<this.length-e){for(var n=new o.CellData,a=0;a<this.length-e-t;++a)this.setCell(e+a,this.loadCell(e+t+a,n));for(a=this.length-t;a<this.length;++a)this.setCell(a,r)}else for(a=e;a<this.length;++a)this.setCell(a,r);e&&2===this.getWidth(e-1)&&this.setCellFromCodePoint(e-1,0,1,(null==i?void 0:i.fg)||0,(null==i?void 0:i.bg)||0,(null==i?void 0:i.extended)||new s.ExtendedAttrs),0!==this.getWidth(e)||this.hasContent(e)||this.setCellFromCodePoint(e,0,1,(null==i?void 0:i.fg)||0,(null==i?void 0:i.bg)||0,(null==i?void 0:i.extended)||new s.ExtendedAttrs)},e.prototype.replaceCells=function(e,t,r,i){for(e&&2===this.getWidth(e-1)&&this.setCellFromCodePoint(e-1,0,1,(null==i?void 0:i.fg)||0,(null==i?void 0:i.bg)||0,(null==i?void 0:i.extended)||new s.ExtendedAttrs),t<this.length&&2===this.getWidth(t-1)&&this.setCellFromCodePoint(t,0,1,(null==i?void 0:i.fg)||0,(null==i?void 0:i.bg)||0,(null==i?void 0:i.extended)||new s.ExtendedAttrs);e<t&&e<this.length;)this.setCell(e++,r)},e.prototype.resize=function(e,t){if(e!==this.length){if(e>this.length){var r=new Uint32Array(3*e);this.length&&(3*e<this._data.length?r.set(this._data.subarray(0,3*e)):r.set(this._data)),this._data=r;for(var i=this.length;i<e;++i)this.setCell(i,t)}else if(e){(r=new Uint32Array(3*e)).set(this._data.subarray(0,3*e)),this._data=r;var n=Object.keys(this._combined);for(i=0;i<n.length;i++){var o=parseInt(n[i],10);o>=e&&delete this._combined[o]}}else this._data=new Uint32Array(0),this._combined={};this.length=e}},e.prototype.fill=function(e){this._combined={},this._extendedAttrs={};for(var t=0;t<this.length;++t)this.setCell(t,e)},e.prototype.copyFrom=function(e){for(var t in this.length!==e.length?this._data=new Uint32Array(e._data):this._data.set(e._data),this.length=e.length,this._combined={},e._combined)this._combined[t]=e._combined[t];for(var t in this._extendedAttrs={},e._extendedAttrs)this._extendedAttrs[t]=e._extendedAttrs[t];this.isWrapped=e.isWrapped},e.prototype.clone=function(){var t=new e(0);for(var r in t._data=new Uint32Array(this._data),t.length=this.length,this._combined)t._combined[r]=this._combined[r];for(var r in this._extendedAttrs)t._extendedAttrs[r]=this._extendedAttrs[r];return t.isWrapped=this.isWrapped,t},e.prototype.getTrimmedLength=function(){for(var e=this.length-1;e>=0;--e)if(4194303&this._data[3*e+0])return e+(this._data[3*e+0]>>22);return 0},e.prototype.copyCellsFrom=function(e,t,r,i,n){var o=e._data;if(n)for(var s=i-1;s>=0;s--)for(var a=0;a<3;a++)this._data[3*(r+s)+a]=o[3*(t+s)+a];else for(s=0;s<i;s++)for(a=0;a<3;a++)this._data[3*(r+s)+a]=o[3*(t+s)+a];var c=Object.keys(e._combined);for(a=0;a<c.length;a++){var l=parseInt(c[a],10);l>=t&&(this._combined[l-t+r]=e._combined[l])}},e.prototype.translateToString=function(e,t,r){void 0===e&&(e=!1),void 0===t&&(t=0),void 0===r&&(r=this.length),e&&(r=Math.min(r,this.getTrimmedLength()));for(var o=\"\";t<r;){var s=this._data[3*t+0],a=2097151&s;o+=2097152&s?this._combined[t]:a?(0,i.stringFromCodePoint)(a):n.WHITESPACE_CELL_CHAR,t+=s>>22||1}return o},e}();t.BufferLine=a},4841:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.getRangeLength=void 0,t.getRangeLength=function(e,t){if(e.start.y>e.end.y)throw new Error(\"Buffer range end (\"+e.end.x+\", \"+e.end.y+\") cannot be before start (\"+e.start.x+\", \"+e.start.y+\")\");return t*(e.end.y-e.start.y)+(e.end.x-e.start.x+1)}},4634:(e,t)=>{function r(e,t,r){if(t===e.length-1)return e[t].getTrimmedLength();var i=!e[t].hasContent(r-1)&&1===e[t].getWidth(r-1),n=2===e[t+1].getWidth(0);return i&&n?r-1:r}Object.defineProperty(t,\"__esModule\",{value:!0}),t.getWrappedLineTrimmedLength=t.reflowSmallerGetNewLineLengths=t.reflowLargerApplyNewLayout=t.reflowLargerCreateNewLayout=t.reflowLargerGetLinesToRemove=void 0,t.reflowLargerGetLinesToRemove=function(e,t,i,n,o){for(var s=[],a=0;a<e.length-1;a++){var c=a,l=e.get(++c);if(l.isWrapped){for(var h=[e.get(a)];c<e.length&&l.isWrapped;)h.push(l),l=e.get(++c);if(n>=a&&n<c)a+=h.length-1;else{for(var u=0,f=r(h,u,t),_=1,d=0;_<h.length;){var p=r(h,_,t),v=p-d,g=i-f,y=Math.min(v,g);h[u].copyCellsFrom(h[_],d,f,y,!1),(f+=y)===i&&(u++,f=0),(d+=y)===p&&(_++,d=0),0===f&&0!==u&&2===h[u-1].getWidth(i-1)&&(h[u].copyCellsFrom(h[u-1],i-1,f++,1,!1),h[u-1].setCell(i-1,o))}h[u].replaceCells(f,i,o);for(var m=0,S=h.length-1;S>0&&(S>u||0===h[S].getTrimmedLength());S--)m++;m>0&&(s.push(a+h.length-m),s.push(m)),a+=h.length-1}}}return s},t.reflowLargerCreateNewLayout=function(e,t){for(var r=[],i=0,n=t[i],o=0,s=0;s<e.length;s++)if(n===s){var a=t[++i];e.onDeleteEmitter.fire({index:s-o,amount:a}),s+=a-1,o+=a,n=t[++i]}else r.push(s);return{layout:r,countRemoved:o}},t.reflowLargerApplyNewLayout=function(e,t){for(var r=[],i=0;i<t.length;i++)r.push(e.get(t[i]));for(i=0;i<r.length;i++)e.set(i,r[i]);e.length=t.length},t.reflowSmallerGetNewLineLengths=function(e,t,i){for(var n=[],o=e.map((function(i,n){return r(e,n,t)})).reduce((function(e,t){return e+t})),s=0,a=0,c=0;c<o;){if(o-c<i){n.push(o-c);break}s+=i;var l=r(e,a,t);s>l&&(s-=l,a++);var h=2===e[a].getWidth(s-1);h&&s--;var u=h?i-1:i;n.push(u),c+=u}return n},t.getWrappedLineTrimmedLength=r},5295:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferSet=void 0;var o=r(9092),s=r(8460),a=function(e){function t(t,r){var i=e.call(this)||this;return i._optionsService=t,i._bufferService=r,i._onBufferActivate=i.register(new s.EventEmitter),i.reset(),i}return n(t,e),Object.defineProperty(t.prototype,\"onBufferActivate\",{get:function(){return this._onBufferActivate.event},enumerable:!1,configurable:!0}),t.prototype.reset=function(){this._normal=new o.Buffer(!0,this._optionsService,this._bufferService),this._normal.fillViewportRows(),this._alt=new o.Buffer(!1,this._optionsService,this._bufferService),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}),this.setupTabStops()},Object.defineProperty(t.prototype,\"alt\",{get:function(){return this._alt},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"active\",{get:function(){return this._activeBuffer},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"normal\",{get:function(){return this._normal},enumerable:!1,configurable:!0}),t.prototype.activateNormalBuffer=function(){this._activeBuffer!==this._normal&&(this._normal.x=this._alt.x,this._normal.y=this._alt.y,this._alt.clear(),this._activeBuffer=this._normal,this._onBufferActivate.fire({activeBuffer:this._normal,inactiveBuffer:this._alt}))},t.prototype.activateAltBuffer=function(e){this._activeBuffer!==this._alt&&(this._alt.fillViewportRows(e),this._alt.x=this._normal.x,this._alt.y=this._normal.y,this._activeBuffer=this._alt,this._onBufferActivate.fire({activeBuffer:this._alt,inactiveBuffer:this._normal}))},t.prototype.resize=function(e,t){this._normal.resize(e,t),this._alt.resize(e,t)},t.prototype.setupTabStops=function(e){this._normal.setupTabStops(e),this._alt.setupTabStops(e)},t}(r(844).Disposable);t.BufferSet=a},511:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,\"__esModule\",{value:!0}),t.CellData=void 0;var o=r(482),s=r(643),a=r(3734),c=function(e){function t(){var t=null!==e&&e.apply(this,arguments)||this;return t.content=0,t.fg=0,t.bg=0,t.extended=new a.ExtendedAttrs,t.combinedData=\"\",t}return n(t,e),t.fromCharData=function(e){var r=new t;return r.setFromCharData(e),r},t.prototype.isCombined=function(){return 2097152&this.content},t.prototype.getWidth=function(){return this.content>>22},t.prototype.getChars=function(){return 2097152&this.content?this.combinedData:2097151&this.content?(0,o.stringFromCodePoint)(2097151&this.content):\"\"},t.prototype.getCode=function(){return this.isCombined()?this.combinedData.charCodeAt(this.combinedData.length-1):2097151&this.content},t.prototype.setFromCharData=function(e){this.fg=e[s.CHAR_DATA_ATTR_INDEX],this.bg=0;var t=!1;if(e[s.CHAR_DATA_CHAR_INDEX].length>2)t=!0;else if(2===e[s.CHAR_DATA_CHAR_INDEX].length){var r=e[s.CHAR_DATA_CHAR_INDEX].charCodeAt(0);if(55296<=r&&r<=56319){var i=e[s.CHAR_DATA_CHAR_INDEX].charCodeAt(1);56320<=i&&i<=57343?this.content=1024*(r-55296)+i-56320+65536|e[s.CHAR_DATA_WIDTH_INDEX]<<22:t=!0}else t=!0}else this.content=e[s.CHAR_DATA_CHAR_INDEX].charCodeAt(0)|e[s.CHAR_DATA_WIDTH_INDEX]<<22;t&&(this.combinedData=e[s.CHAR_DATA_CHAR_INDEX],this.content=2097152|e[s.CHAR_DATA_WIDTH_INDEX]<<22)},t.prototype.getAsCharData=function(){return[this.fg,this.getChars(),this.getWidth(),this.getCode()]},t}(a.AttributeData);t.CellData=c},643:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.WHITESPACE_CELL_CODE=t.WHITESPACE_CELL_WIDTH=t.WHITESPACE_CELL_CHAR=t.NULL_CELL_CODE=t.NULL_CELL_WIDTH=t.NULL_CELL_CHAR=t.CHAR_DATA_CODE_INDEX=t.CHAR_DATA_WIDTH_INDEX=t.CHAR_DATA_CHAR_INDEX=t.CHAR_DATA_ATTR_INDEX=t.DEFAULT_ATTR=t.DEFAULT_COLOR=void 0,t.DEFAULT_COLOR=256,t.DEFAULT_ATTR=256|t.DEFAULT_COLOR<<9,t.CHAR_DATA_ATTR_INDEX=0,t.CHAR_DATA_CHAR_INDEX=1,t.CHAR_DATA_WIDTH_INDEX=2,t.CHAR_DATA_CODE_INDEX=3,t.NULL_CELL_CHAR=\"\",t.NULL_CELL_WIDTH=1,t.NULL_CELL_CODE=0,t.WHITESPACE_CELL_CHAR=\" \",t.WHITESPACE_CELL_WIDTH=1,t.WHITESPACE_CELL_CODE=32},4863:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,\"__esModule\",{value:!0}),t.Marker=void 0;var o=r(8460),s=function(e){function t(r){var i=e.call(this)||this;return i.line=r,i._id=t._nextId++,i.isDisposed=!1,i._onDispose=new o.EventEmitter,i}return n(t,e),Object.defineProperty(t.prototype,\"id\",{get:function(){return this._id},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onDispose\",{get:function(){return this._onDispose.event},enumerable:!1,configurable:!0}),t.prototype.dispose=function(){this.isDisposed||(this.isDisposed=!0,this.line=-1,this._onDispose.fire(),e.prototype.dispose.call(this))},t._nextId=1,t}(r(844).Disposable);t.Marker=s},7116:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.DEFAULT_CHARSET=t.CHARSETS=void 0,t.CHARSETS={},t.DEFAULT_CHARSET=t.CHARSETS.B,t.CHARSETS[0]={\"`\":\"◆\",a:\"▒\",b:\"␉\",c:\"␌\",d:\"␍\",e:\"␊\",f:\"°\",g:\"±\",h:\"␤\",i:\"␋\",j:\"┘\",k:\"┐\",l:\"┌\",m:\"└\",n:\"┼\",o:\"⎺\",p:\"⎻\",q:\"─\",r:\"⎼\",s:\"⎽\",t:\"├\",u:\"┤\",v:\"┴\",w:\"┬\",x:\"│\",y:\"≤\",z:\"≥\",\"{\":\"π\",\"|\":\"≠\",\"}\":\"£\",\"~\":\"·\"},t.CHARSETS.A={\"#\":\"£\"},t.CHARSETS.B=void 0,t.CHARSETS[4]={\"#\":\"£\",\"@\":\"¾\",\"[\":\"ij\",\"\\\\\":\"½\",\"]\":\"|\",\"{\":\"¨\",\"|\":\"f\",\"}\":\"¼\",\"~\":\"´\"},t.CHARSETS.C=t.CHARSETS[5]={\"[\":\"Ä\",\"\\\\\":\"Ö\",\"]\":\"Å\",\"^\":\"Ü\",\"`\":\"é\",\"{\":\"ä\",\"|\":\"ö\",\"}\":\"å\",\"~\":\"ü\"},t.CHARSETS.R={\"#\":\"£\",\"@\":\"à\",\"[\":\"°\",\"\\\\\":\"ç\",\"]\":\"§\",\"{\":\"é\",\"|\":\"ù\",\"}\":\"è\",\"~\":\"¨\"},t.CHARSETS.Q={\"@\":\"à\",\"[\":\"â\",\"\\\\\":\"ç\",\"]\":\"ê\",\"^\":\"î\",\"`\":\"ô\",\"{\":\"é\",\"|\":\"ù\",\"}\":\"è\",\"~\":\"û\"},t.CHARSETS.K={\"@\":\"§\",\"[\":\"Ä\",\"\\\\\":\"Ö\",\"]\":\"Ü\",\"{\":\"ä\",\"|\":\"ö\",\"}\":\"ü\",\"~\":\"ß\"},t.CHARSETS.Y={\"#\":\"£\",\"@\":\"§\",\"[\":\"°\",\"\\\\\":\"ç\",\"]\":\"é\",\"`\":\"ù\",\"{\":\"à\",\"|\":\"ò\",\"}\":\"è\",\"~\":\"ì\"},t.CHARSETS.E=t.CHARSETS[6]={\"@\":\"Ä\",\"[\":\"Æ\",\"\\\\\":\"Ø\",\"]\":\"Å\",\"^\":\"Ü\",\"`\":\"ä\",\"{\":\"æ\",\"|\":\"ø\",\"}\":\"å\",\"~\":\"ü\"},t.CHARSETS.Z={\"#\":\"£\",\"@\":\"§\",\"[\":\"¡\",\"\\\\\":\"Ñ\",\"]\":\"¿\",\"{\":\"°\",\"|\":\"ñ\",\"}\":\"ç\"},t.CHARSETS.H=t.CHARSETS[7]={\"@\":\"É\",\"[\":\"Ä\",\"\\\\\":\"Ö\",\"]\":\"Å\",\"^\":\"Ü\",\"`\":\"é\",\"{\":\"ä\",\"|\":\"ö\",\"}\":\"å\",\"~\":\"ü\"},t.CHARSETS[\"=\"]={\"#\":\"ù\",\"@\":\"à\",\"[\":\"é\",\"\\\\\":\"ç\",\"]\":\"ê\",\"^\":\"î\",_:\"è\",\"`\":\"ô\",\"{\":\"ä\",\"|\":\"ö\",\"}\":\"ü\",\"~\":\"û\"}},2584:(e,t)=>{var r,i;Object.defineProperty(t,\"__esModule\",{value:!0}),t.C1=t.C0=void 0,(i=t.C0||(t.C0={})).NUL=\"\\0\",i.SOH=\"\u0001\",i.STX=\"\u0002\",i.ETX=\"\u0003\",i.EOT=\"\u0004\",i.ENQ=\"\u0005\",i.ACK=\"\u0006\",i.BEL=\"\u0007\",i.BS=\"\\b\",i.HT=\"\\t\",i.LF=\"\\n\",i.VT=\"\\v\",i.FF=\"\\f\",i.CR=\"\\r\",i.SO=\"\u000e\",i.SI=\"\u000f\",i.DLE=\"\u0010\",i.DC1=\"\u0011\",i.DC2=\"\u0012\",i.DC3=\"\u0013\",i.DC4=\"\u0014\",i.NAK=\"\u0015\",i.SYN=\"\u0016\",i.ETB=\"\u0017\",i.CAN=\"\u0018\",i.EM=\"\u0019\",i.SUB=\"\u001a\",i.ESC=\"\u001b\",i.FS=\"\u001c\",i.GS=\"\u001d\",i.RS=\"\u001e\",i.US=\"\u001f\",i.SP=\" \",i.DEL=\"\",(r=t.C1||(t.C1={})).PAD=\"\",r.HOP=\"\",r.BPH=\"\",r.NBH=\"\",r.IND=\"\",r.NEL=\"\",r.SSA=\"\",r.ESA=\"\",r.HTS=\"\",r.HTJ=\"\",r.VTS=\"\",r.PLD=\"\",r.PLU=\"\",r.RI=\"\",r.SS2=\"\",r.SS3=\"\",r.DCS=\"\",r.PU1=\"\",r.PU2=\"\",r.STS=\"\",r.CCH=\"\",r.MW=\"\",r.SPA=\"\",r.EPA=\"\",r.SOS=\"\",r.SGCI=\"\",r.SCI=\"\",r.CSI=\"\",r.ST=\"\",r.OSC=\"\",r.PM=\"\",r.APC=\"\"},7399:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.evaluateKeyboardEvent=void 0;var i=r(2584),n={48:[\"0\",\")\"],49:[\"1\",\"!\"],50:[\"2\",\"@\"],51:[\"3\",\"#\"],52:[\"4\",\"$\"],53:[\"5\",\"%\"],54:[\"6\",\"^\"],55:[\"7\",\"&\"],56:[\"8\",\"*\"],57:[\"9\",\"(\"],186:[\";\",\":\"],187:[\"=\",\"+\"],188:[\",\",\"<\"],189:[\"-\",\"_\"],190:[\".\",\">\"],191:[\"/\",\"?\"],192:[\"`\",\"~\"],219:[\"[\",\"{\"],220:[\"\\\\\",\"|\"],221:[\"]\",\"}\"],222:[\"'\",'\"']};t.evaluateKeyboardEvent=function(e,t,r,o){var s={type:0,cancel:!1,key:void 0},a=(e.shiftKey?1:0)|(e.altKey?2:0)|(e.ctrlKey?4:0)|(e.metaKey?8:0);switch(e.keyCode){case 0:\"UIKeyInputUpArrow\"===e.key?s.key=t?i.C0.ESC+\"OA\":i.C0.ESC+\"[A\":\"UIKeyInputLeftArrow\"===e.key?s.key=t?i.C0.ESC+\"OD\":i.C0.ESC+\"[D\":\"UIKeyInputRightArrow\"===e.key?s.key=t?i.C0.ESC+\"OC\":i.C0.ESC+\"[C\":\"UIKeyInputDownArrow\"===e.key&&(s.key=t?i.C0.ESC+\"OB\":i.C0.ESC+\"[B\");break;case 8:if(e.shiftKey){s.key=i.C0.BS;break}if(e.altKey){s.key=i.C0.ESC+i.C0.DEL;break}s.key=i.C0.DEL;break;case 9:if(e.shiftKey){s.key=i.C0.ESC+\"[Z\";break}s.key=i.C0.HT,s.cancel=!0;break;case 13:s.key=e.altKey?i.C0.ESC+i.C0.CR:i.C0.CR,s.cancel=!0;break;case 27:s.key=i.C0.ESC,e.altKey&&(s.key=i.C0.ESC+i.C0.ESC),s.cancel=!0;break;case 37:if(e.metaKey)break;a?(s.key=i.C0.ESC+\"[1;\"+(a+1)+\"D\",s.key===i.C0.ESC+\"[1;3D\"&&(s.key=i.C0.ESC+(r?\"b\":\"[1;5D\"))):s.key=t?i.C0.ESC+\"OD\":i.C0.ESC+\"[D\";break;case 39:if(e.metaKey)break;a?(s.key=i.C0.ESC+\"[1;\"+(a+1)+\"C\",s.key===i.C0.ESC+\"[1;3C\"&&(s.key=i.C0.ESC+(r?\"f\":\"[1;5C\"))):s.key=t?i.C0.ESC+\"OC\":i.C0.ESC+\"[C\";break;case 38:if(e.metaKey)break;a?(s.key=i.C0.ESC+\"[1;\"+(a+1)+\"A\",r||s.key!==i.C0.ESC+\"[1;3A\"||(s.key=i.C0.ESC+\"[1;5A\")):s.key=t?i.C0.ESC+\"OA\":i.C0.ESC+\"[A\";break;case 40:if(e.metaKey)break;a?(s.key=i.C0.ESC+\"[1;\"+(a+1)+\"B\",r||s.key!==i.C0.ESC+\"[1;3B\"||(s.key=i.C0.ESC+\"[1;5B\")):s.key=t?i.C0.ESC+\"OB\":i.C0.ESC+\"[B\";break;case 45:e.shiftKey||e.ctrlKey||(s.key=i.C0.ESC+\"[2~\");break;case 46:s.key=a?i.C0.ESC+\"[3;\"+(a+1)+\"~\":i.C0.ESC+\"[3~\";break;case 36:s.key=a?i.C0.ESC+\"[1;\"+(a+1)+\"H\":t?i.C0.ESC+\"OH\":i.C0.ESC+\"[H\";break;case 35:s.key=a?i.C0.ESC+\"[1;\"+(a+1)+\"F\":t?i.C0.ESC+\"OF\":i.C0.ESC+\"[F\";break;case 33:e.shiftKey?s.type=2:s.key=i.C0.ESC+\"[5~\";break;case 34:e.shiftKey?s.type=3:s.key=i.C0.ESC+\"[6~\";break;case 112:s.key=a?i.C0.ESC+\"[1;\"+(a+1)+\"P\":i.C0.ESC+\"OP\";break;case 113:s.key=a?i.C0.ESC+\"[1;\"+(a+1)+\"Q\":i.C0.ESC+\"OQ\";break;case 114:s.key=a?i.C0.ESC+\"[1;\"+(a+1)+\"R\":i.C0.ESC+\"OR\";break;case 115:s.key=a?i.C0.ESC+\"[1;\"+(a+1)+\"S\":i.C0.ESC+\"OS\";break;case 116:s.key=a?i.C0.ESC+\"[15;\"+(a+1)+\"~\":i.C0.ESC+\"[15~\";break;case 117:s.key=a?i.C0.ESC+\"[17;\"+(a+1)+\"~\":i.C0.ESC+\"[17~\";break;case 118:s.key=a?i.C0.ESC+\"[18;\"+(a+1)+\"~\":i.C0.ESC+\"[18~\";break;case 119:s.key=a?i.C0.ESC+\"[19;\"+(a+1)+\"~\":i.C0.ESC+\"[19~\";break;case 120:s.key=a?i.C0.ESC+\"[20;\"+(a+1)+\"~\":i.C0.ESC+\"[20~\";break;case 121:s.key=a?i.C0.ESC+\"[21;\"+(a+1)+\"~\":i.C0.ESC+\"[21~\";break;case 122:s.key=a?i.C0.ESC+\"[23;\"+(a+1)+\"~\":i.C0.ESC+\"[23~\";break;case 123:s.key=a?i.C0.ESC+\"[24;\"+(a+1)+\"~\":i.C0.ESC+\"[24~\";break;default:if(!e.ctrlKey||e.shiftKey||e.altKey||e.metaKey)if(r&&!o||!e.altKey||e.metaKey)!r||e.altKey||e.ctrlKey||e.shiftKey||!e.metaKey?e.key&&!e.ctrlKey&&!e.altKey&&!e.metaKey&&e.keyCode>=48&&1===e.key.length?s.key=e.key:e.key&&e.ctrlKey&&\"_\"===e.key&&(s.key=i.C0.US):65===e.keyCode&&(s.type=1);else{var c=n[e.keyCode],l=null==c?void 0:c[e.shiftKey?1:0];if(l)s.key=i.C0.ESC+l;else if(e.keyCode>=65&&e.keyCode<=90){var h=e.ctrlKey?e.keyCode-64:e.keyCode+32;s.key=i.C0.ESC+String.fromCharCode(h)}}else e.keyCode>=65&&e.keyCode<=90?s.key=String.fromCharCode(e.keyCode-64):32===e.keyCode?s.key=i.C0.NUL:e.keyCode>=51&&e.keyCode<=55?s.key=String.fromCharCode(e.keyCode-51+27):56===e.keyCode?s.key=i.C0.DEL:219===e.keyCode?s.key=i.C0.ESC:220===e.keyCode?s.key=i.C0.FS:221===e.keyCode&&(s.key=i.C0.GS)}return s}},482:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.Utf8ToUtf32=t.StringToUtf32=t.utf32ToString=t.stringFromCodePoint=void 0,t.stringFromCodePoint=function(e){return e>65535?(e-=65536,String.fromCharCode(55296+(e>>10))+String.fromCharCode(e%1024+56320)):String.fromCharCode(e)},t.utf32ToString=function(e,t,r){void 0===t&&(t=0),void 0===r&&(r=e.length);for(var i=\"\",n=t;n<r;++n){var o=e[n];o>65535?(o-=65536,i+=String.fromCharCode(55296+(o>>10))+String.fromCharCode(o%1024+56320)):i+=String.fromCharCode(o)}return i};var r=function(){function e(){this._interim=0}return e.prototype.clear=function(){this._interim=0},e.prototype.decode=function(e,t){var r=e.length;if(!r)return 0;var i=0,n=0;this._interim&&(56320<=(a=e.charCodeAt(n++))&&a<=57343?t[i++]=1024*(this._interim-55296)+a-56320+65536:(t[i++]=this._interim,t[i++]=a),this._interim=0);for(var o=n;o<r;++o){var s=e.charCodeAt(o);if(55296<=s&&s<=56319){if(++o>=r)return this._interim=s,i;var a;56320<=(a=e.charCodeAt(o))&&a<=57343?t[i++]=1024*(s-55296)+a-56320+65536:(t[i++]=s,t[i++]=a)}else 65279!==s&&(t[i++]=s)}return i},e}();t.StringToUtf32=r;var i=function(){function e(){this.interim=new Uint8Array(3)}return e.prototype.clear=function(){this.interim.fill(0)},e.prototype.decode=function(e,t){var r=e.length;if(!r)return 0;var i,n,o,s,a=0,c=0,l=0;if(this.interim[0]){var h=!1,u=this.interim[0];u&=192==(224&u)?31:224==(240&u)?15:7;for(var f=0,_=void 0;(_=63&this.interim[++f])&&f<4;)u<<=6,u|=_;for(var d=192==(224&this.interim[0])?2:224==(240&this.interim[0])?3:4,p=d-f;l<p;){if(l>=r)return 0;if(128!=(192&(_=e[l++]))){l--,h=!0;break}this.interim[f++]=_,u<<=6,u|=63&_}h||(2===d?u<128?l--:t[a++]=u:3===d?u<2048||u>=55296&&u<=57343||65279===u||(t[a++]=u):u<65536||u>1114111||(t[a++]=u)),this.interim.fill(0)}for(var v=r-4,g=l;g<r;){for(;!(!(g<v)||128&(i=e[g])||128&(n=e[g+1])||128&(o=e[g+2])||128&(s=e[g+3]));)t[a++]=i,t[a++]=n,t[a++]=o,t[a++]=s,g+=4;if((i=e[g++])<128)t[a++]=i;else if(192==(224&i)){if(g>=r)return this.interim[0]=i,a;if(128!=(192&(n=e[g++]))){g--;continue}if((c=(31&i)<<6|63&n)<128){g--;continue}t[a++]=c}else if(224==(240&i)){if(g>=r)return this.interim[0]=i,a;if(128!=(192&(n=e[g++]))){g--;continue}if(g>=r)return this.interim[0]=i,this.interim[1]=n,a;if(128!=(192&(o=e[g++]))){g--;continue}if((c=(15&i)<<12|(63&n)<<6|63&o)<2048||c>=55296&&c<=57343||65279===c)continue;t[a++]=c}else if(240==(248&i)){if(g>=r)return this.interim[0]=i,a;if(128!=(192&(n=e[g++]))){g--;continue}if(g>=r)return this.interim[0]=i,this.interim[1]=n,a;if(128!=(192&(o=e[g++]))){g--;continue}if(g>=r)return this.interim[0]=i,this.interim[1]=n,this.interim[2]=o,a;if(128!=(192&(s=e[g++]))){g--;continue}if((c=(7&i)<<18|(63&n)<<12|(63&o)<<6|63&s)<65536||c>1114111)continue;t[a++]=c}}return a},e}();t.Utf8ToUtf32=i},225:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.UnicodeV6=void 0;var i,n=r(8273),o=[[768,879],[1155,1158],[1160,1161],[1425,1469],[1471,1471],[1473,1474],[1476,1477],[1479,1479],[1536,1539],[1552,1557],[1611,1630],[1648,1648],[1750,1764],[1767,1768],[1770,1773],[1807,1807],[1809,1809],[1840,1866],[1958,1968],[2027,2035],[2305,2306],[2364,2364],[2369,2376],[2381,2381],[2385,2388],[2402,2403],[2433,2433],[2492,2492],[2497,2500],[2509,2509],[2530,2531],[2561,2562],[2620,2620],[2625,2626],[2631,2632],[2635,2637],[2672,2673],[2689,2690],[2748,2748],[2753,2757],[2759,2760],[2765,2765],[2786,2787],[2817,2817],[2876,2876],[2879,2879],[2881,2883],[2893,2893],[2902,2902],[2946,2946],[3008,3008],[3021,3021],[3134,3136],[3142,3144],[3146,3149],[3157,3158],[3260,3260],[3263,3263],[3270,3270],[3276,3277],[3298,3299],[3393,3395],[3405,3405],[3530,3530],[3538,3540],[3542,3542],[3633,3633],[3636,3642],[3655,3662],[3761,3761],[3764,3769],[3771,3772],[3784,3789],[3864,3865],[3893,3893],[3895,3895],[3897,3897],[3953,3966],[3968,3972],[3974,3975],[3984,3991],[3993,4028],[4038,4038],[4141,4144],[4146,4146],[4150,4151],[4153,4153],[4184,4185],[4448,4607],[4959,4959],[5906,5908],[5938,5940],[5970,5971],[6002,6003],[6068,6069],[6071,6077],[6086,6086],[6089,6099],[6109,6109],[6155,6157],[6313,6313],[6432,6434],[6439,6440],[6450,6450],[6457,6459],[6679,6680],[6912,6915],[6964,6964],[6966,6970],[6972,6972],[6978,6978],[7019,7027],[7616,7626],[7678,7679],[8203,8207],[8234,8238],[8288,8291],[8298,8303],[8400,8431],[12330,12335],[12441,12442],[43014,43014],[43019,43019],[43045,43046],[64286,64286],[65024,65039],[65056,65059],[65279,65279],[65529,65531]],s=[[68097,68099],[68101,68102],[68108,68111],[68152,68154],[68159,68159],[119143,119145],[119155,119170],[119173,119179],[119210,119213],[119362,119364],[917505,917505],[917536,917631],[917760,917999]],a=function(){function e(){if(this.version=\"6\",!i){i=new Uint8Array(65536),(0,n.fill)(i,1),i[0]=0,(0,n.fill)(i,0,1,32),(0,n.fill)(i,0,127,160),(0,n.fill)(i,2,4352,4448),i[9001]=2,i[9002]=2,(0,n.fill)(i,2,11904,42192),i[12351]=1,(0,n.fill)(i,2,44032,55204),(0,n.fill)(i,2,63744,64256),(0,n.fill)(i,2,65040,65050),(0,n.fill)(i,2,65072,65136),(0,n.fill)(i,2,65280,65377),(0,n.fill)(i,2,65504,65511);for(var e=0;e<o.length;++e)(0,n.fill)(i,0,o[e][0],o[e][1]+1)}}return e.prototype.wcwidth=function(e){return e<32?0:e<127?1:e<65536?i[e]:function(e,t){var r,i=0,n=t.length-1;if(e<t[0][0]||e>t[n][1])return!1;for(;n>=i;)if(e>t[r=i+n>>1][1])i=r+1;else{if(!(e<t[r][0]))return!0;n=r-1}return!1}(e,s)?0:e>=131072&&e<=196605||e>=196608&&e<=262141?2:1},e}();t.UnicodeV6=a},5981:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.WriteBuffer=void 0;var r=\"undefined\"==typeof queueMicrotask?function(e){Promise.resolve().then(e)}:queueMicrotask,i=function(){function e(e){this._action=e,this._writeBuffer=[],this._callbacks=[],this._pendingData=0,this._bufferOffset=0,this._isSyncWriting=!1,this._syncCalls=0}return e.prototype.writeSync=function(e,t){if(void 0!==t&&this._syncCalls>t)this._syncCalls=0;else if(this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(void 0),this._syncCalls++,!this._isSyncWriting){var r;for(this._isSyncWriting=!0;r=this._writeBuffer.shift();){this._action(r);var i=this._callbacks.shift();i&&i()}this._pendingData=0,this._bufferOffset=2147483647,this._isSyncWriting=!1,this._syncCalls=0}},e.prototype.write=function(e,t){var r=this;if(this._pendingData>5e7)throw new Error(\"write data discarded, use flow control to avoid losing data\");this._writeBuffer.length||(this._bufferOffset=0,setTimeout((function(){return r._innerWrite()}))),this._pendingData+=e.length,this._writeBuffer.push(e),this._callbacks.push(t)},e.prototype._innerWrite=function(e,t){var i=this;void 0===e&&(e=0),void 0===t&&(t=!0);for(var n=e||Date.now();this._writeBuffer.length>this._bufferOffset;){var o=this._writeBuffer[this._bufferOffset],s=this._action(o,t);if(s)return void s.catch((function(e){return r((function(){throw e})),Promise.resolve(!1)})).then((function(e){return Date.now()-n>=12?setTimeout((function(){return i._innerWrite(0,e)})):i._innerWrite(n,e)}));var a=this._callbacks[this._bufferOffset];if(a&&a(),this._bufferOffset++,this._pendingData-=o.length,Date.now()-n>=12)break}this._writeBuffer.length>this._bufferOffset?(this._bufferOffset>50&&(this._writeBuffer=this._writeBuffer.slice(this._bufferOffset),this._callbacks=this._callbacks.slice(this._bufferOffset),this._bufferOffset=0),setTimeout((function(){return i._innerWrite()}))):(this._writeBuffer.length=0,this._callbacks.length=0,this._pendingData=0,this._bufferOffset=0)},e}();t.WriteBuffer=i},5941:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.toRgbString=t.parseColor=void 0;var r=/^([\\da-f]{1})\\/([\\da-f]{1})\\/([\\da-f]{1})$|^([\\da-f]{2})\\/([\\da-f]{2})\\/([\\da-f]{2})$|^([\\da-f]{3})\\/([\\da-f]{3})\\/([\\da-f]{3})$|^([\\da-f]{4})\\/([\\da-f]{4})\\/([\\da-f]{4})$/,i=/^[\\da-f]+$/;function n(e,t){var r=e.toString(16),i=r.length<2?\"0\"+r:r;switch(t){case 4:return r[0];case 8:return i;case 12:return(i+i).slice(0,3);default:return i+i}}t.parseColor=function(e){if(e){var t=e.toLowerCase();if(0===t.indexOf(\"rgb:\")){t=t.slice(4);var n=r.exec(t);if(n){var o=n[1]?15:n[4]?255:n[7]?4095:65535;return[Math.round(parseInt(n[1]||n[4]||n[7]||n[10],16)/o*255),Math.round(parseInt(n[2]||n[5]||n[8]||n[11],16)/o*255),Math.round(parseInt(n[3]||n[6]||n[9]||n[12],16)/o*255)]}}else if(0===t.indexOf(\"#\")&&(t=t.slice(1),i.exec(t)&&[3,6,9,12].includes(t.length))){for(var s=t.length/3,a=[0,0,0],c=0;c<3;++c){var l=parseInt(t.slice(s*c,s*c+s),16);a[c]=1===s?l<<4:2===s?l:3===s?l>>4:l>>8}return a}}},t.toRgbString=function(e,t){void 0===t&&(t=16);var r=e[0],i=e[1],o=e[2];return\"rgb:\"+n(r,t)+\"/\"+n(i,t)+\"/\"+n(o,t)}},5770:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.PAYLOAD_LIMIT=void 0,t.PAYLOAD_LIMIT=1e7},6351:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.DcsHandler=t.DcsParser=void 0;var i=r(482),n=r(8742),o=r(5770),s=[],a=function(){function e(){this._handlers=Object.create(null),this._active=s,this._ident=0,this._handlerFb=function(){},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}return e.prototype.dispose=function(){this._handlers=Object.create(null),this._handlerFb=function(){},this._active=s},e.prototype.registerHandler=function(e,t){void 0===this._handlers[e]&&(this._handlers[e]=[]);var r=this._handlers[e];return r.push(t),{dispose:function(){var e=r.indexOf(t);-1!==e&&r.splice(e,1)}}},e.prototype.clearHandler=function(e){this._handlers[e]&&delete this._handlers[e]},e.prototype.setHandlerFallback=function(e){this._handlerFb=e},e.prototype.reset=function(){if(this._active.length)for(var e=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;e>=0;--e)this._active[e].unhook(!1);this._stack.paused=!1,this._active=s,this._ident=0},e.prototype.hook=function(e,t){if(this.reset(),this._ident=e,this._active=this._handlers[e]||s,this._active.length)for(var r=this._active.length-1;r>=0;r--)this._active[r].hook(t);else this._handlerFb(this._ident,\"HOOK\",t)},e.prototype.put=function(e,t,r){if(this._active.length)for(var n=this._active.length-1;n>=0;n--)this._active[n].put(e,t,r);else this._handlerFb(this._ident,\"PUT\",(0,i.utf32ToString)(e,t,r))},e.prototype.unhook=function(e,t){if(void 0===t&&(t=!0),this._active.length){var r=!1,i=this._active.length-1,n=!1;if(this._stack.paused&&(i=this._stack.loopPosition-1,r=t,n=this._stack.fallThrough,this._stack.paused=!1),!n&&!1===r){for(;i>=0&&!0!==(r=this._active[i].unhook(e));i--)if(r instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=i,this._stack.fallThrough=!1,r;i--}for(;i>=0;i--)if((r=this._active[i].unhook(!1))instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=i,this._stack.fallThrough=!0,r}else this._handlerFb(this._ident,\"UNHOOK\",e);this._active=s,this._ident=0},e}();t.DcsParser=a;var c=new n.Params;c.addParam(0);var l=function(){function e(e){this._handler=e,this._data=\"\",this._params=c,this._hitLimit=!1}return e.prototype.hook=function(e){this._params=e.length>1||e.params[0]?e.clone():c,this._data=\"\",this._hitLimit=!1},e.prototype.put=function(e,t,r){this._hitLimit||(this._data+=(0,i.utf32ToString)(e,t,r),this._data.length>o.PAYLOAD_LIMIT&&(this._data=\"\",this._hitLimit=!0))},e.prototype.unhook=function(e){var t=this,r=!1;if(this._hitLimit)r=!1;else if(e&&(r=this._handler(this._data,this._params))instanceof Promise)return r.then((function(e){return t._params=c,t._data=\"\",t._hitLimit=!1,e}));return this._params=c,this._data=\"\",this._hitLimit=!1,r},e}();t.DcsHandler=l},2015:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)});Object.defineProperty(t,\"__esModule\",{value:!0}),t.EscapeSequenceParser=t.VT500_TRANSITION_TABLE=t.TransitionTable=void 0;var o=r(844),s=r(8273),a=r(8742),c=r(6242),l=r(6351),h=function(){function e(e){this.table=new Uint8Array(e)}return e.prototype.setDefault=function(e,t){(0,s.fill)(this.table,e<<4|t)},e.prototype.add=function(e,t,r,i){this.table[t<<8|e]=r<<4|i},e.prototype.addMany=function(e,t,r,i){for(var n=0;n<e.length;n++)this.table[t<<8|e[n]]=r<<4|i},e}();t.TransitionTable=h;var u=160;t.VT500_TRANSITION_TABLE=function(){var e=new h(4095),t=Array.apply(null,Array(256)).map((function(e,t){return t})),r=function(e,r){return t.slice(e,r)},i=r(32,127),n=r(0,24);n.push(25),n.push.apply(n,r(28,32));var o,s=r(0,14);for(o in e.setDefault(1,0),e.addMany(i,0,2,0),s)e.addMany([24,26,153,154],o,3,0),e.addMany(r(128,144),o,3,0),e.addMany(r(144,152),o,3,0),e.add(156,o,0,0),e.add(27,o,11,1),e.add(157,o,4,8),e.addMany([152,158,159],o,0,7),e.add(155,o,11,3),e.add(144,o,11,9);return e.addMany(n,0,3,0),e.addMany(n,1,3,1),e.add(127,1,0,1),e.addMany(n,8,0,8),e.addMany(n,3,3,3),e.add(127,3,0,3),e.addMany(n,4,3,4),e.add(127,4,0,4),e.addMany(n,6,3,6),e.addMany(n,5,3,5),e.add(127,5,0,5),e.addMany(n,2,3,2),e.add(127,2,0,2),e.add(93,1,4,8),e.addMany(i,8,5,8),e.add(127,8,5,8),e.addMany([156,27,24,26,7],8,6,0),e.addMany(r(28,32),8,0,8),e.addMany([88,94,95],1,0,7),e.addMany(i,7,0,7),e.addMany(n,7,0,7),e.add(156,7,0,0),e.add(127,7,0,7),e.add(91,1,11,3),e.addMany(r(64,127),3,7,0),e.addMany(r(48,60),3,8,4),e.addMany([60,61,62,63],3,9,4),e.addMany(r(48,60),4,8,4),e.addMany(r(64,127),4,7,0),e.addMany([60,61,62,63],4,0,6),e.addMany(r(32,64),6,0,6),e.add(127,6,0,6),e.addMany(r(64,127),6,0,0),e.addMany(r(32,48),3,9,5),e.addMany(r(32,48),5,9,5),e.addMany(r(48,64),5,0,6),e.addMany(r(64,127),5,7,0),e.addMany(r(32,48),4,9,5),e.addMany(r(32,48),1,9,2),e.addMany(r(32,48),2,9,2),e.addMany(r(48,127),2,10,0),e.addMany(r(48,80),1,10,0),e.addMany(r(81,88),1,10,0),e.addMany([89,90,92],1,10,0),e.addMany(r(96,127),1,10,0),e.add(80,1,11,9),e.addMany(n,9,0,9),e.add(127,9,0,9),e.addMany(r(28,32),9,0,9),e.addMany(r(32,48),9,9,12),e.addMany(r(48,60),9,8,10),e.addMany([60,61,62,63],9,9,10),e.addMany(n,11,0,11),e.addMany(r(32,128),11,0,11),e.addMany(r(28,32),11,0,11),e.addMany(n,10,0,10),e.add(127,10,0,10),e.addMany(r(28,32),10,0,10),e.addMany(r(48,60),10,8,10),e.addMany([60,61,62,63],10,0,11),e.addMany(r(32,48),10,9,12),e.addMany(n,12,0,12),e.add(127,12,0,12),e.addMany(r(28,32),12,0,12),e.addMany(r(32,48),12,9,12),e.addMany(r(48,64),12,0,11),e.addMany(r(64,127),12,12,13),e.addMany(r(64,127),10,12,13),e.addMany(r(64,127),9,12,13),e.addMany(n,13,13,13),e.addMany(i,13,13,13),e.add(127,13,0,13),e.addMany([27,156,24,26],13,14,0),e.add(u,0,2,0),e.add(u,8,5,8),e.add(u,6,0,6),e.add(u,11,0,11),e.add(u,13,13,13),e}();var f=function(e){function r(r){void 0===r&&(r=t.VT500_TRANSITION_TABLE);var i=e.call(this)||this;return i._transitions=r,i._parseStack={state:0,handlers:[],handlerPos:0,transition:0,chunkPos:0},i.initialState=0,i.currentState=i.initialState,i._params=new a.Params,i._params.addParam(0),i._collect=0,i.precedingCodepoint=0,i._printHandlerFb=function(e,t,r){},i._executeHandlerFb=function(e){},i._csiHandlerFb=function(e,t){},i._escHandlerFb=function(e){},i._errorHandlerFb=function(e){return e},i._printHandler=i._printHandlerFb,i._executeHandlers=Object.create(null),i._csiHandlers=Object.create(null),i._escHandlers=Object.create(null),i._oscParser=new c.OscParser,i._dcsParser=new l.DcsParser,i._errorHandler=i._errorHandlerFb,i.registerEscHandler({final:\"\\\\\"},(function(){return!0})),i}return n(r,e),r.prototype._identifier=function(e,t){void 0===t&&(t=[64,126]);var r=0;if(e.prefix){if(e.prefix.length>1)throw new Error(\"only one byte as prefix supported\");if((r=e.prefix.charCodeAt(0))&&60>r||r>63)throw new Error(\"prefix must be in range 0x3c .. 0x3f\")}if(e.intermediates){if(e.intermediates.length>2)throw new Error(\"only two bytes as intermediates are supported\");for(var i=0;i<e.intermediates.length;++i){var n=e.intermediates.charCodeAt(i);if(32>n||n>47)throw new Error(\"intermediate must be in range 0x20 .. 0x2f\");r<<=8,r|=n}}if(1!==e.final.length)throw new Error(\"final must be a single byte\");var o=e.final.charCodeAt(0);if(t[0]>o||o>t[1])throw new Error(\"final must be in range \"+t[0]+\" .. \"+t[1]);return(r<<=8)|o},r.prototype.identToString=function(e){for(var t=[];e;)t.push(String.fromCharCode(255&e)),e>>=8;return t.reverse().join(\"\")},r.prototype.dispose=function(){this._csiHandlers=Object.create(null),this._executeHandlers=Object.create(null),this._escHandlers=Object.create(null),this._oscParser.dispose(),this._dcsParser.dispose()},r.prototype.setPrintHandler=function(e){this._printHandler=e},r.prototype.clearPrintHandler=function(){this._printHandler=this._printHandlerFb},r.prototype.registerEscHandler=function(e,t){var r=this._identifier(e,[48,126]);void 0===this._escHandlers[r]&&(this._escHandlers[r]=[]);var i=this._escHandlers[r];return i.push(t),{dispose:function(){var e=i.indexOf(t);-1!==e&&i.splice(e,1)}}},r.prototype.clearEscHandler=function(e){this._escHandlers[this._identifier(e,[48,126])]&&delete this._escHandlers[this._identifier(e,[48,126])]},r.prototype.setEscHandlerFallback=function(e){this._escHandlerFb=e},r.prototype.setExecuteHandler=function(e,t){this._executeHandlers[e.charCodeAt(0)]=t},r.prototype.clearExecuteHandler=function(e){this._executeHandlers[e.charCodeAt(0)]&&delete this._executeHandlers[e.charCodeAt(0)]},r.prototype.setExecuteHandlerFallback=function(e){this._executeHandlerFb=e},r.prototype.registerCsiHandler=function(e,t){var r=this._identifier(e);void 0===this._csiHandlers[r]&&(this._csiHandlers[r]=[]);var i=this._csiHandlers[r];return i.push(t),{dispose:function(){var e=i.indexOf(t);-1!==e&&i.splice(e,1)}}},r.prototype.clearCsiHandler=function(e){this._csiHandlers[this._identifier(e)]&&delete this._csiHandlers[this._identifier(e)]},r.prototype.setCsiHandlerFallback=function(e){this._csiHandlerFb=e},r.prototype.registerDcsHandler=function(e,t){return this._dcsParser.registerHandler(this._identifier(e),t)},r.prototype.clearDcsHandler=function(e){this._dcsParser.clearHandler(this._identifier(e))},r.prototype.setDcsHandlerFallback=function(e){this._dcsParser.setHandlerFallback(e)},r.prototype.registerOscHandler=function(e,t){return this._oscParser.registerHandler(e,t)},r.prototype.clearOscHandler=function(e){this._oscParser.clearHandler(e)},r.prototype.setOscHandlerFallback=function(e){this._oscParser.setHandlerFallback(e)},r.prototype.setErrorHandler=function(e){this._errorHandler=e},r.prototype.clearErrorHandler=function(){this._errorHandler=this._errorHandlerFb},r.prototype.reset=function(){this.currentState=this.initialState,this._oscParser.reset(),this._dcsParser.reset(),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingCodepoint=0,0!==this._parseStack.state&&(this._parseStack.state=2,this._parseStack.handlers=[])},r.prototype._preserveStack=function(e,t,r,i,n){this._parseStack.state=e,this._parseStack.handlers=t,this._parseStack.handlerPos=r,this._parseStack.transition=i,this._parseStack.chunkPos=n},r.prototype.parse=function(e,t,r){var i,n=0,o=0,s=0;if(this._parseStack.state)if(2===this._parseStack.state)this._parseStack.state=0,s=this._parseStack.chunkPos+1;else{if(void 0===r||1===this._parseStack.state)throw this._parseStack.state=1,new Error(\"improper continuation due to previous async handler, giving up parsing\");var a=this._parseStack.handlers,c=this._parseStack.handlerPos-1;switch(this._parseStack.state){case 3:if(!1===r&&c>-1)for(;c>=0&&!0!==(i=a[c](this._params));c--)if(i instanceof Promise)return this._parseStack.handlerPos=c,i;this._parseStack.handlers=[];break;case 4:if(!1===r&&c>-1)for(;c>=0&&!0!==(i=a[c]());c--)if(i instanceof Promise)return this._parseStack.handlerPos=c,i;this._parseStack.handlers=[];break;case 6:if(n=e[this._parseStack.chunkPos],i=this._dcsParser.unhook(24!==n&&26!==n,r))return i;27===n&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0;break;case 5:if(n=e[this._parseStack.chunkPos],i=this._oscParser.end(24!==n&&26!==n,r))return i;27===n&&(this._parseStack.transition|=1),this._params.reset(),this._params.addParam(0),this._collect=0}this._parseStack.state=0,s=this._parseStack.chunkPos+1,this.precedingCodepoint=0,this.currentState=15&this._parseStack.transition}for(var l=s;l<t;++l){switch(n=e[l],(o=this._transitions.table[this.currentState<<8|(n<160?n:u)])>>4){case 2:for(var h=l+1;;++h){if(h>=t||(n=e[h])<32||n>126&&n<u){this._printHandler(e,l,h),l=h-1;break}if(++h>=t||(n=e[h])<32||n>126&&n<u){this._printHandler(e,l,h),l=h-1;break}if(++h>=t||(n=e[h])<32||n>126&&n<u){this._printHandler(e,l,h),l=h-1;break}if(++h>=t||(n=e[h])<32||n>126&&n<u){this._printHandler(e,l,h),l=h-1;break}}break;case 3:this._executeHandlers[n]?this._executeHandlers[n]():this._executeHandlerFb(n),this.precedingCodepoint=0;break;case 0:break;case 1:if(this._errorHandler({position:l,code:n,currentState:this.currentState,collect:this._collect,params:this._params,abort:!1}).abort)return;break;case 7:for(var f=(a=this._csiHandlers[this._collect<<8|n])?a.length-1:-1;f>=0&&!0!==(i=a[f](this._params));f--)if(i instanceof Promise)return this._preserveStack(3,a,f,o,l),i;f<0&&this._csiHandlerFb(this._collect<<8|n,this._params),this.precedingCodepoint=0;break;case 8:do{switch(n){case 59:this._params.addParam(0);break;case 58:this._params.addSubParam(-1);break;default:this._params.addDigit(n-48)}}while(++l<t&&(n=e[l])>47&&n<60);l--;break;case 9:this._collect<<=8,this._collect|=n;break;case 10:for(var _=this._escHandlers[this._collect<<8|n],d=_?_.length-1:-1;d>=0&&!0!==(i=_[d]());d--)if(i instanceof Promise)return this._preserveStack(4,_,d,o,l),i;d<0&&this._escHandlerFb(this._collect<<8|n),this.precedingCodepoint=0;break;case 11:this._params.reset(),this._params.addParam(0),this._collect=0;break;case 12:this._dcsParser.hook(this._collect<<8|n,this._params);break;case 13:for(var p=l+1;;++p)if(p>=t||24===(n=e[p])||26===n||27===n||n>127&&n<u){this._dcsParser.put(e,l,p),l=p-1;break}break;case 14:if(i=this._dcsParser.unhook(24!==n&&26!==n))return this._preserveStack(6,[],0,o,l),i;27===n&&(o|=1),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingCodepoint=0;break;case 4:this._oscParser.start();break;case 5:for(var v=l+1;;v++)if(v>=t||(n=e[v])<32||n>127&&n<u){this._oscParser.put(e,l,v),l=v-1;break}break;case 6:if(i=this._oscParser.end(24!==n&&26!==n))return this._preserveStack(5,[],0,o,l),i;27===n&&(o|=1),this._params.reset(),this._params.addParam(0),this._collect=0,this.precedingCodepoint=0}this.currentState=15&o}},r}(o.Disposable);t.EscapeSequenceParser=f},6242:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.OscHandler=t.OscParser=void 0;var i=r(5770),n=r(482),o=[],s=function(){function e(){this._state=0,this._active=o,this._id=-1,this._handlers=Object.create(null),this._handlerFb=function(){},this._stack={paused:!1,loopPosition:0,fallThrough:!1}}return e.prototype.registerHandler=function(e,t){void 0===this._handlers[e]&&(this._handlers[e]=[]);var r=this._handlers[e];return r.push(t),{dispose:function(){var e=r.indexOf(t);-1!==e&&r.splice(e,1)}}},e.prototype.clearHandler=function(e){this._handlers[e]&&delete this._handlers[e]},e.prototype.setHandlerFallback=function(e){this._handlerFb=e},e.prototype.dispose=function(){this._handlers=Object.create(null),this._handlerFb=function(){},this._active=o},e.prototype.reset=function(){if(2===this._state)for(var e=this._stack.paused?this._stack.loopPosition-1:this._active.length-1;e>=0;--e)this._active[e].end(!1);this._stack.paused=!1,this._active=o,this._id=-1,this._state=0},e.prototype._start=function(){if(this._active=this._handlers[this._id]||o,this._active.length)for(var e=this._active.length-1;e>=0;e--)this._active[e].start();else this._handlerFb(this._id,\"START\")},e.prototype._put=function(e,t,r){if(this._active.length)for(var i=this._active.length-1;i>=0;i--)this._active[i].put(e,t,r);else this._handlerFb(this._id,\"PUT\",(0,n.utf32ToString)(e,t,r))},e.prototype.start=function(){this.reset(),this._state=1},e.prototype.put=function(e,t,r){if(3!==this._state){if(1===this._state)for(;t<r;){var i=e[t++];if(59===i){this._state=2,this._start();break}if(i<48||57<i)return void(this._state=3);-1===this._id&&(this._id=0),this._id=10*this._id+i-48}2===this._state&&r-t>0&&this._put(e,t,r)}},e.prototype.end=function(e,t){if(void 0===t&&(t=!0),0!==this._state){if(3!==this._state)if(1===this._state&&this._start(),this._active.length){var r=!1,i=this._active.length-1,n=!1;if(this._stack.paused&&(i=this._stack.loopPosition-1,r=t,n=this._stack.fallThrough,this._stack.paused=!1),!n&&!1===r){for(;i>=0&&!0!==(r=this._active[i].end(e));i--)if(r instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=i,this._stack.fallThrough=!1,r;i--}for(;i>=0;i--)if((r=this._active[i].end(!1))instanceof Promise)return this._stack.paused=!0,this._stack.loopPosition=i,this._stack.fallThrough=!0,r}else this._handlerFb(this._id,\"END\",e);this._active=o,this._id=-1,this._state=0}},e}();t.OscParser=s;var a=function(){function e(e){this._handler=e,this._data=\"\",this._hitLimit=!1}return e.prototype.start=function(){this._data=\"\",this._hitLimit=!1},e.prototype.put=function(e,t,r){this._hitLimit||(this._data+=(0,n.utf32ToString)(e,t,r),this._data.length>i.PAYLOAD_LIMIT&&(this._data=\"\",this._hitLimit=!0))},e.prototype.end=function(e){var t=this,r=!1;if(this._hitLimit)r=!1;else if(e&&(r=this._handler(this._data))instanceof Promise)return r.then((function(e){return t._data=\"\",t._hitLimit=!1,e}));return this._data=\"\",this._hitLimit=!1,r},e}();t.OscHandler=a},8742:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.Params=void 0;var r=2147483647,i=function(){function e(e,t){if(void 0===e&&(e=32),void 0===t&&(t=32),this.maxLength=e,this.maxSubParamsLength=t,t>256)throw new Error(\"maxSubParamsLength must not be greater than 256\");this.params=new Int32Array(e),this.length=0,this._subParams=new Int32Array(t),this._subParamsLength=0,this._subParamsIdx=new Uint16Array(e),this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1}return e.fromArray=function(t){var r=new e;if(!t.length)return r;for(var i=Array.isArray(t[0])?1:0;i<t.length;++i){var n=t[i];if(Array.isArray(n))for(var o=0;o<n.length;++o)r.addSubParam(n[o]);else r.addParam(n)}return r},e.prototype.clone=function(){var t=new e(this.maxLength,this.maxSubParamsLength);return t.params.set(this.params),t.length=this.length,t._subParams.set(this._subParams),t._subParamsLength=this._subParamsLength,t._subParamsIdx.set(this._subParamsIdx),t._rejectDigits=this._rejectDigits,t._rejectSubDigits=this._rejectSubDigits,t._digitIsSub=this._digitIsSub,t},e.prototype.toArray=function(){for(var e=[],t=0;t<this.length;++t){e.push(this.params[t]);var r=this._subParamsIdx[t]>>8,i=255&this._subParamsIdx[t];i-r>0&&e.push(Array.prototype.slice.call(this._subParams,r,i))}return e},e.prototype.reset=function(){this.length=0,this._subParamsLength=0,this._rejectDigits=!1,this._rejectSubDigits=!1,this._digitIsSub=!1},e.prototype.addParam=function(e){if(this._digitIsSub=!1,this.length>=this.maxLength)this._rejectDigits=!0;else{if(e<-1)throw new Error(\"values lesser than -1 are not allowed\");this._subParamsIdx[this.length]=this._subParamsLength<<8|this._subParamsLength,this.params[this.length++]=e>r?r:e}},e.prototype.addSubParam=function(e){if(this._digitIsSub=!0,this.length)if(this._rejectDigits||this._subParamsLength>=this.maxSubParamsLength)this._rejectSubDigits=!0;else{if(e<-1)throw new Error(\"values lesser than -1 are not allowed\");this._subParams[this._subParamsLength++]=e>r?r:e,this._subParamsIdx[this.length-1]++}},e.prototype.hasSubParams=function(e){return(255&this._subParamsIdx[e])-(this._subParamsIdx[e]>>8)>0},e.prototype.getSubParams=function(e){var t=this._subParamsIdx[e]>>8,r=255&this._subParamsIdx[e];return r-t>0?this._subParams.subarray(t,r):null},e.prototype.getSubParamsAll=function(){for(var e={},t=0;t<this.length;++t){var r=this._subParamsIdx[t]>>8,i=255&this._subParamsIdx[t];i-r>0&&(e[t]=this._subParams.slice(r,i))}return e},e.prototype.addDigit=function(e){var t;if(!(this._rejectDigits||!(t=this._digitIsSub?this._subParamsLength:this.length)||this._digitIsSub&&this._rejectSubDigits)){var i=this._digitIsSub?this._subParams:this.params,n=i[t-1];i[t-1]=~n?Math.min(10*n+e,r):e}},e}();t.Params=i},5741:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.AddonManager=void 0;var r=function(){function e(){this._addons=[]}return e.prototype.dispose=function(){for(var e=this._addons.length-1;e>=0;e--)this._addons[e].instance.dispose()},e.prototype.loadAddon=function(e,t){var r=this,i={instance:t,dispose:t.dispose,isDisposed:!1};this._addons.push(i),t.dispose=function(){return r._wrappedAddonDispose(i)},t.activate(e)},e.prototype._wrappedAddonDispose=function(e){if(!e.isDisposed){for(var t=-1,r=0;r<this._addons.length;r++)if(this._addons[r]===e){t=r;break}if(-1===t)throw new Error(\"Could not dispose an addon that has not been loaded\");e.isDisposed=!0,e.dispose.apply(e.instance),this._addons.splice(t,1)}},e}();t.AddonManager=r},8771:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferApiView=void 0;var i=r(3785),n=r(511),o=function(){function e(e,t){this._buffer=e,this.type=t}return e.prototype.init=function(e){return this._buffer=e,this},Object.defineProperty(e.prototype,\"cursorY\",{get:function(){return this._buffer.y},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"cursorX\",{get:function(){return this._buffer.x},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"viewportY\",{get:function(){return this._buffer.ydisp},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"baseY\",{get:function(){return this._buffer.ybase},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"length\",{get:function(){return this._buffer.lines.length},enumerable:!1,configurable:!0}),e.prototype.getLine=function(e){var t=this._buffer.lines.get(e);if(t)return new i.BufferLineApiView(t)},e.prototype.getNullCell=function(){return new n.CellData},e}();t.BufferApiView=o},3785:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferLineApiView=void 0;var i=r(511),n=function(){function e(e){this._line=e}return Object.defineProperty(e.prototype,\"isWrapped\",{get:function(){return this._line.isWrapped},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"length\",{get:function(){return this._line.length},enumerable:!1,configurable:!0}),e.prototype.getCell=function(e,t){if(!(e<0||e>=this._line.length))return t?(this._line.loadCell(e,t),t):this._line.loadCell(e,new i.CellData)},e.prototype.translateToString=function(e,t,r){return this._line.translateToString(e,t,r)},e}();t.BufferLineApiView=n},8285:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferNamespaceApi=void 0;var i=r(8771),n=r(8460),o=function(){function e(e){var t=this;this._core=e,this._onBufferChange=new n.EventEmitter,this._normal=new i.BufferApiView(this._core.buffers.normal,\"normal\"),this._alternate=new i.BufferApiView(this._core.buffers.alt,\"alternate\"),this._core.buffers.onBufferActivate((function(){return t._onBufferChange.fire(t.active)}))}return Object.defineProperty(e.prototype,\"onBufferChange\",{get:function(){return this._onBufferChange.event},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"active\",{get:function(){if(this._core.buffers.active===this._core.buffers.normal)return this.normal;if(this._core.buffers.active===this._core.buffers.alt)return this.alternate;throw new Error(\"Active buffer is neither normal nor alternate\")},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"normal\",{get:function(){return this._normal.init(this._core.buffers.normal)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"alternate\",{get:function(){return this._alternate.init(this._core.buffers.alt)},enumerable:!1,configurable:!0}),e}();t.BufferNamespaceApi=o},7975:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.ParserApi=void 0;var r=function(){function e(e){this._core=e}return e.prototype.registerCsiHandler=function(e,t){return this._core.registerCsiHandler(e,(function(e){return t(e.toArray())}))},e.prototype.addCsiHandler=function(e,t){return this.registerCsiHandler(e,t)},e.prototype.registerDcsHandler=function(e,t){return this._core.registerDcsHandler(e,(function(e,r){return t(e,r.toArray())}))},e.prototype.addDcsHandler=function(e,t){return this.registerDcsHandler(e,t)},e.prototype.registerEscHandler=function(e,t){return this._core.registerEscHandler(e,t)},e.prototype.addEscHandler=function(e,t){return this.registerEscHandler(e,t)},e.prototype.registerOscHandler=function(e,t){return this._core.registerOscHandler(e,t)},e.prototype.addOscHandler=function(e,t){return this.registerOscHandler(e,t)},e}();t.ParserApi=r},7090:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.UnicodeApi=void 0;var r=function(){function e(e){this._core=e}return e.prototype.register=function(e){this._core.unicodeService.register(e)},Object.defineProperty(e.prototype,\"versions\",{get:function(){return this._core.unicodeService.versions},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"activeVersion\",{get:function(){return this._core.unicodeService.activeVersion},set:function(e){this._core.unicodeService.activeVersion=e},enumerable:!1,configurable:!0}),e}();t.UnicodeApi=r},744:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},s=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.BufferService=t.MINIMUM_ROWS=t.MINIMUM_COLS=void 0;var a=r(2585),c=r(5295),l=r(8460),h=r(844);t.MINIMUM_COLS=2,t.MINIMUM_ROWS=1;var u=function(e){function r(r){var i=e.call(this)||this;return i._optionsService=r,i.isUserScrolling=!1,i._onResize=new l.EventEmitter,i._onScroll=new l.EventEmitter,i.cols=Math.max(r.rawOptions.cols||0,t.MINIMUM_COLS),i.rows=Math.max(r.rawOptions.rows||0,t.MINIMUM_ROWS),i.buffers=new c.BufferSet(r,i),i}return n(r,e),Object.defineProperty(r.prototype,\"onResize\",{get:function(){return this._onResize.event},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,\"onScroll\",{get:function(){return this._onScroll.event},enumerable:!1,configurable:!0}),Object.defineProperty(r.prototype,\"buffer\",{get:function(){return this.buffers.active},enumerable:!1,configurable:!0}),r.prototype.dispose=function(){e.prototype.dispose.call(this),this.buffers.dispose()},r.prototype.resize=function(e,t){this.cols=e,this.rows=t,this.buffers.resize(e,t),this.buffers.setupTabStops(this.cols),this._onResize.fire({cols:e,rows:t})},r.prototype.reset=function(){this.buffers.reset(),this.isUserScrolling=!1},r.prototype.scroll=function(e,t){void 0===t&&(t=!1);var r,i=this.buffer;(r=this._cachedBlankLine)&&r.length===this.cols&&r.getFg(0)===e.fg&&r.getBg(0)===e.bg||(r=i.getBlankLine(e,t),this._cachedBlankLine=r),r.isWrapped=t;var n=i.ybase+i.scrollTop,o=i.ybase+i.scrollBottom;if(0===i.scrollTop){var s=i.lines.isFull;o===i.lines.length-1?s?i.lines.recycle().copyFrom(r):i.lines.push(r.clone()):i.lines.splice(o+1,0,r.clone()),s?this.isUserScrolling&&(i.ydisp=Math.max(i.ydisp-1,0)):(i.ybase++,this.isUserScrolling||i.ydisp++)}else{var a=o-n+1;i.lines.shiftElements(n+1,a-1,-1),i.lines.set(o,r.clone())}this.isUserScrolling||(i.ydisp=i.ybase),this._onScroll.fire(i.ydisp)},r.prototype.scrollLines=function(e,t,r){var i=this.buffer;if(e<0){if(0===i.ydisp)return;this.isUserScrolling=!0}else e+i.ydisp>=i.ybase&&(this.isUserScrolling=!1);var n=i.ydisp;i.ydisp=Math.max(Math.min(i.ydisp+e,i.ybase),0),n!==i.ydisp&&(t||this._onScroll.fire(i.ydisp))},r.prototype.scrollPages=function(e){this.scrollLines(e*(this.rows-1))},r.prototype.scrollToTop=function(){this.scrollLines(-this.buffer.ydisp)},r.prototype.scrollToBottom=function(){this.scrollLines(this.buffer.ybase-this.buffer.ydisp)},r.prototype.scrollToLine=function(e){var t=e-this.buffer.ydisp;0!==t&&this.scrollLines(t)},o([s(0,a.IOptionsService)],r)}(h.Disposable);t.BufferService=u},7994:(e,t)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.CharsetService=void 0;var r=function(){function e(){this.glevel=0,this._charsets=[]}return e.prototype.reset=function(){this.charset=void 0,this._charsets=[],this.glevel=0},e.prototype.setgLevel=function(e){this.glevel=e,this.charset=this._charsets[e]},e.prototype.setgCharset=function(e,t){this._charsets[e]=t,this.glevel===e&&(this.charset=t)},e}();t.CharsetService=r},1753:function(e,t,r){var i=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},n=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.CoreMouseService=void 0;var o=r(2585),s=r(8460),a={NONE:{events:0,restrict:function(){return!1}},X10:{events:1,restrict:function(e){return 4!==e.button&&1===e.action&&(e.ctrl=!1,e.alt=!1,e.shift=!1,!0)}},VT200:{events:19,restrict:function(e){return 32!==e.action}},DRAG:{events:23,restrict:function(e){return 32!==e.action||3!==e.button}},ANY:{events:31,restrict:function(e){return!0}}};function c(e,t){var r=(e.ctrl?16:0)|(e.shift?4:0)|(e.alt?8:0);return 4===e.button?(r|=64,r|=e.action):(r|=3&e.button,4&e.button&&(r|=64),8&e.button&&(r|=128),32===e.action?r|=32:0!==e.action||t||(r|=3)),r}var l=String.fromCharCode,h={DEFAULT:function(e){var t=[c(e,!1)+32,e.col+32,e.row+32];return t[0]>255||t[1]>255||t[2]>255?\"\":\"\u001b[M\"+l(t[0])+l(t[1])+l(t[2])},SGR:function(e){var t=0===e.action&&4!==e.button?\"m\":\"M\";return\"\u001b[<\"+c(e,!0)+\";\"+e.col+\";\"+e.row+t}},u=function(){function e(e,t){this._bufferService=e,this._coreService=t,this._protocols={},this._encodings={},this._activeProtocol=\"\",this._activeEncoding=\"\",this._onProtocolChange=new s.EventEmitter,this._lastEvent=null;for(var r=0,i=Object.keys(a);r<i.length;r++){var n=i[r];this.addProtocol(n,a[n])}for(var o=0,c=Object.keys(h);o<c.length;o++){var l=c[o];this.addEncoding(l,h[l])}this.reset()}return e.prototype.addProtocol=function(e,t){this._protocols[e]=t},e.prototype.addEncoding=function(e,t){this._encodings[e]=t},Object.defineProperty(e.prototype,\"activeProtocol\",{get:function(){return this._activeProtocol},set:function(e){if(!this._protocols[e])throw new Error('unknown protocol \"'+e+'\"');this._activeProtocol=e,this._onProtocolChange.fire(this._protocols[e].events)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"areMouseEventsActive\",{get:function(){return 0!==this._protocols[this._activeProtocol].events},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"activeEncoding\",{get:function(){return this._activeEncoding},set:function(e){if(!this._encodings[e])throw new Error('unknown encoding \"'+e+'\"');this._activeEncoding=e},enumerable:!1,configurable:!0}),e.prototype.reset=function(){this.activeProtocol=\"NONE\",this.activeEncoding=\"DEFAULT\",this._lastEvent=null},Object.defineProperty(e.prototype,\"onProtocolChange\",{get:function(){return this._onProtocolChange.event},enumerable:!1,configurable:!0}),e.prototype.triggerMouseEvent=function(e){if(e.col<0||e.col>=this._bufferService.cols||e.row<0||e.row>=this._bufferService.rows)return!1;if(4===e.button&&32===e.action)return!1;if(3===e.button&&32!==e.action)return!1;if(4!==e.button&&(2===e.action||3===e.action))return!1;if(e.col++,e.row++,32===e.action&&this._lastEvent&&this._compareEvents(this._lastEvent,e))return!1;if(!this._protocols[this._activeProtocol].restrict(e))return!1;var t=this._encodings[this._activeEncoding](e);return t&&(\"DEFAULT\"===this._activeEncoding?this._coreService.triggerBinaryEvent(t):this._coreService.triggerDataEvent(t,!0)),this._lastEvent=e,!0},e.prototype.explainEvents=function(e){return{down:!!(1&e),up:!!(2&e),drag:!!(4&e),move:!!(8&e),wheel:!!(16&e)}},e.prototype._compareEvents=function(e,t){return e.col===t.col&&e.row===t.row&&e.button===t.button&&e.action===t.action&&e.ctrl===t.ctrl&&e.alt===t.alt&&e.shift===t.shift},i([n(0,o.IBufferService),n(1,o.ICoreService)],e)}();t.CoreMouseService=u},6975:function(e,t,r){var i,n=this&&this.__extends||(i=function(e,t){return i=Object.setPrototypeOf||{__proto__:[]}instanceof Array&&function(e,t){e.__proto__=t}||function(e,t){for(var r in t)Object.prototype.hasOwnProperty.call(t,r)&&(e[r]=t[r])},i(e,t)},function(e,t){if(\"function\"!=typeof t&&null!==t)throw new TypeError(\"Class extends value \"+String(t)+\" is not a constructor or null\");function r(){this.constructor=e}i(e,t),e.prototype=null===t?Object.create(t):(r.prototype=t.prototype,new r)}),o=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},s=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.CoreService=void 0;var a=r(2585),c=r(8460),l=r(1439),h=r(844),u=Object.freeze({insertMode:!1}),f=Object.freeze({applicationCursorKeys:!1,applicationKeypad:!1,bracketedPasteMode:!1,origin:!1,reverseWraparound:!1,sendFocus:!1,wraparound:!0}),_=function(e){function t(t,r,i,n){var o=e.call(this)||this;return o._bufferService=r,o._logService=i,o._optionsService=n,o.isCursorInitialized=!1,o.isCursorHidden=!1,o._onData=o.register(new c.EventEmitter),o._onUserInput=o.register(new c.EventEmitter),o._onBinary=o.register(new c.EventEmitter),o._scrollToBottom=t,o.register({dispose:function(){return o._scrollToBottom=void 0}}),o.modes=(0,l.clone)(u),o.decPrivateModes=(0,l.clone)(f),o}return n(t,e),Object.defineProperty(t.prototype,\"onData\",{get:function(){return this._onData.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onUserInput\",{get:function(){return this._onUserInput.event},enumerable:!1,configurable:!0}),Object.defineProperty(t.prototype,\"onBinary\",{get:function(){return this._onBinary.event},enumerable:!1,configurable:!0}),t.prototype.reset=function(){this.modes=(0,l.clone)(u),this.decPrivateModes=(0,l.clone)(f)},t.prototype.triggerDataEvent=function(e,t){if(void 0===t&&(t=!1),!this._optionsService.rawOptions.disableStdin){var r=this._bufferService.buffer;r.ybase!==r.ydisp&&this._scrollToBottom(),t&&this._onUserInput.fire(),this._logService.debug('sending data \"'+e+'\"',(function(){return e.split(\"\").map((function(e){return e.charCodeAt(0)}))})),this._onData.fire(e)}},t.prototype.triggerBinaryEvent=function(e){this._optionsService.rawOptions.disableStdin||(this._logService.debug('sending binary \"'+e+'\"',(function(){return e.split(\"\").map((function(e){return e.charCodeAt(0)}))})),this._onBinary.fire(e))},o([s(1,a.IBufferService),s(2,a.ILogService),s(3,a.IOptionsService)],t)}(h.Disposable);t.CoreService=_},3730:function(e,t,r){var i=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},n=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}};Object.defineProperty(t,\"__esModule\",{value:!0}),t.DirtyRowService=void 0;var o=r(2585),s=function(){function e(e){this._bufferService=e,this.clearRange()}return Object.defineProperty(e.prototype,\"start\",{get:function(){return this._start},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"end\",{get:function(){return this._end},enumerable:!1,configurable:!0}),e.prototype.clearRange=function(){this._start=this._bufferService.buffer.y,this._end=this._bufferService.buffer.y},e.prototype.markDirty=function(e){e<this._start?this._start=e:e>this._end&&(this._end=e)},e.prototype.markRangeDirty=function(e,t){if(e>t){var r=e;e=t,t=r}e<this._start&&(this._start=e),t>this._end&&(this._end=t)},e.prototype.markAllDirty=function(){this.markRangeDirty(0,this._bufferService.rows-1)},i([n(0,o.IBufferService)],e)}();t.DirtyRowService=s},4348:function(e,t,r){var i=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var i,n=0,o=t.length;n<o;n++)!i&&n in t||(i||(i=Array.prototype.slice.call(t,0,n)),i[n]=t[n]);return e.concat(i||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.InstantiationService=t.ServiceCollection=void 0;var n=r(2585),o=r(8343),s=function(){function e(){for(var e=[],t=0;t<arguments.length;t++)e[t]=arguments[t];this._entries=new Map;for(var r=0,i=e;r<i.length;r++){var n=i[r],o=n[0],s=n[1];this.set(o,s)}}return e.prototype.set=function(e,t){var r=this._entries.get(e);return this._entries.set(e,t),r},e.prototype.forEach=function(e){this._entries.forEach((function(t,r){return e(r,t)}))},e.prototype.has=function(e){return this._entries.has(e)},e.prototype.get=function(e){return this._entries.get(e)},e}();t.ServiceCollection=s;var a=function(){function e(){this._services=new s,this._services.set(n.IInstantiationService,this)}return e.prototype.setService=function(e,t){this._services.set(e,t)},e.prototype.getService=function(e){return this._services.get(e)},e.prototype.createInstance=function(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];for(var n=(0,o.getServiceDependencies)(e).sort((function(e,t){return e.index-t.index})),s=[],a=0,c=n;a<c.length;a++){var l=c[a],h=this._services.get(l.id);if(!h)throw new Error(\"[createInstance] \"+e.name+\" depends on UNKNOWN service \"+l.id+\".\");s.push(h)}var u=n.length>0?n[0].index:t.length;if(t.length!==u)throw new Error(\"[createInstance] First service dependency of \"+e.name+\" at position \"+(u+1)+\" conflicts with \"+t.length+\" static arguments\");return new(e.bind.apply(e,i([void 0],i(i([],t,!0),s,!0),!1)))},e}();t.InstantiationService=a},7866:function(e,t,r){var i=this&&this.__decorate||function(e,t,r,i){var n,o=arguments.length,s=o<3?t:null===i?i=Object.getOwnPropertyDescriptor(t,r):i;if(\"object\"==typeof Reflect&&\"function\"==typeof Reflect.decorate)s=Reflect.decorate(e,t,r,i);else for(var a=e.length-1;a>=0;a--)(n=e[a])&&(s=(o<3?n(s):o>3?n(t,r,s):n(t,r))||s);return o>3&&s&&Object.defineProperty(t,r,s),s},n=this&&this.__param||function(e,t){return function(r,i){t(r,i,e)}},o=this&&this.__spreadArray||function(e,t,r){if(r||2===arguments.length)for(var i,n=0,o=t.length;n<o;n++)!i&&n in t||(i||(i=Array.prototype.slice.call(t,0,n)),i[n]=t[n]);return e.concat(i||Array.prototype.slice.call(t))};Object.defineProperty(t,\"__esModule\",{value:!0}),t.LogService=void 0;var s=r(2585),a={debug:s.LogLevelEnum.DEBUG,info:s.LogLevelEnum.INFO,warn:s.LogLevelEnum.WARN,error:s.LogLevelEnum.ERROR,off:s.LogLevelEnum.OFF},c=function(){function e(e){var t=this;this._optionsService=e,this.logLevel=s.LogLevelEnum.OFF,this._updateLogLevel(),this._optionsService.onOptionChange((function(e){\"logLevel\"===e&&t._updateLogLevel()}))}return e.prototype._updateLogLevel=function(){this.logLevel=a[this._optionsService.rawOptions.logLevel]},e.prototype._evalLazyOptionalParams=function(e){for(var t=0;t<e.length;t++)\"function\"==typeof e[t]&&(e[t]=e[t]())},e.prototype._log=function(e,t,r){this._evalLazyOptionalParams(r),e.call.apply(e,o([console,\"xterm.js: \"+t],r,!1))},e.prototype.debug=function(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];this.logLevel<=s.LogLevelEnum.DEBUG&&this._log(console.log,e,t)},e.prototype.info=function(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];this.logLevel<=s.LogLevelEnum.INFO&&this._log(console.info,e,t)},e.prototype.warn=function(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];this.logLevel<=s.LogLevelEnum.WARN&&this._log(console.warn,e,t)},e.prototype.error=function(e){for(var t=[],r=1;r<arguments.length;r++)t[r-1]=arguments[r];this.logLevel<=s.LogLevelEnum.ERROR&&this._log(console.error,e,t)},i([n(0,s.IOptionsService)],e)}();t.LogService=c},7302:function(e,t,r){var i=this&&this.__assign||function(){return i=Object.assign||function(e){for(var t,r=1,i=arguments.length;r<i;r++)for(var n in t=arguments[r])Object.prototype.hasOwnProperty.call(t,n)&&(e[n]=t[n]);return e},i.apply(this,arguments)};Object.defineProperty(t,\"__esModule\",{value:!0}),t.OptionsService=t.DEFAULT_OPTIONS=t.DEFAULT_BELL_SOUND=void 0;var n=r(8460),o=r(6114);t.DEFAULT_BELL_SOUND=\"data:audio/mp3;base64,SUQzBAAAAAAAI1RTU0UAAAAPAAADTGF2ZjU4LjMyLjEwNAAAAAAAAAAAAAAA//tQxAADB8AhSmxhIIEVCSiJrDCQBTcu3UrAIwUdkRgQbFAZC1CQEwTJ9mjRvBA4UOLD8nKVOWfh+UlK3z/177OXrfOdKl7pyn3Xf//WreyTRUoAWgBgkOAGbZHBgG1OF6zM82DWbZaUmMBptgQhGjsyYqc9ae9XFz280948NMBWInljyzsNRFLPWdnZGWrddDsjK1unuSrVN9jJsK8KuQtQCtMBjCEtImISdNKJOopIpBFpNSMbIHCSRpRR5iakjTiyzLhchUUBwCgyKiweBv/7UsQbg8isVNoMPMjAAAA0gAAABEVFGmgqK////9bP/6XCykxBTUUzLjEwMKqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq\",t.DEFAULT_OPTIONS={cols:80,rows:24,cursorBlink:!1,cursorStyle:\"block\",cursorWidth:1,customGlyphs:!0,bellSound:t.DEFAULT_BELL_SOUND,bellStyle:\"none\",drawBoldTextInBrightColors:!0,fastScrollModifier:\"alt\",fastScrollSensitivity:5,fontFamily:\"courier-new, courier, monospace\",fontSize:15,fontWeight:\"normal\",fontWeightBold:\"bold\",lineHeight:1,linkTooltipHoverDuration:500,letterSpacing:0,logLevel:\"info\",scrollback:1e3,scrollSensitivity:1,screenReaderMode:!1,macOptionIsMeta:!1,macOptionClickForcesSelection:!1,minimumContrastRatio:1,disableStdin:!1,allowProposedApi:!0,allowTransparency:!1,tabStopWidth:8,theme:{},rightClickSelectsWord:o.isMac,rendererType:\"canvas\",windowOptions:{},windowsMode:!1,wordSeparator:\" ()[]{}',\\\"`\",altClickMovesCursor:!0,convertEol:!1,termName:\"xterm\",cancelEvents:!1};var s=[\"normal\",\"bold\",\"100\",\"200\",\"300\",\"400\",\"500\",\"600\",\"700\",\"800\",\"900\"],a=function(){function e(e){this._onOptionChange=new n.EventEmitter;var r=i({},t.DEFAULT_OPTIONS);for(var o in e)if(o in r)try{var s=e[o];r[o]=this._sanitizeAndValidateOption(o,s)}catch(e){console.error(e)}this.rawOptions=r,this.options=i({},r),this._setupOptions()}return Object.defineProperty(e.prototype,\"onOptionChange\",{get:function(){return this._onOptionChange.event},enumerable:!1,configurable:!0}),e.prototype._setupOptions=function(){var e=this,r=function(r){if(!(r in t.DEFAULT_OPTIONS))throw new Error('No option with key \"'+r+'\"');return e.rawOptions[r]},i=function(r,i){if(!(r in t.DEFAULT_OPTIONS))throw new Error('No option with key \"'+r+'\"');i=e._sanitizeAndValidateOption(r,i),e.rawOptions[r]!==i&&(e.rawOptions[r]=i,e._onOptionChange.fire(r))};for(var n in this.rawOptions){var o={get:r.bind(this,n),set:i.bind(this,n)};Object.defineProperty(this.options,n,o)}},e.prototype.setOption=function(e,t){this.options[e]=t},e.prototype._sanitizeAndValidateOption=function(e,r){switch(e){case\"bellStyle\":case\"cursorStyle\":case\"rendererType\":case\"wordSeparator\":r||(r=t.DEFAULT_OPTIONS[e]);break;case\"fontWeight\":case\"fontWeightBold\":if(\"number\"==typeof r&&1<=r&&r<=1e3)break;r=s.includes(r)?r:t.DEFAULT_OPTIONS[e];break;case\"cursorWidth\":r=Math.floor(r);case\"lineHeight\":case\"tabStopWidth\":if(r<1)throw new Error(e+\" cannot be less than 1, value: \"+r);break;case\"minimumContrastRatio\":r=Math.max(1,Math.min(21,Math.round(10*r)/10));break;case\"scrollback\":if((r=Math.min(r,4294967295))<0)throw new Error(e+\" cannot be less than 0, value: \"+r);break;case\"fastScrollSensitivity\":case\"scrollSensitivity\":if(r<=0)throw new Error(e+\" cannot be less than or equal to 0, value: \"+r);case\"rows\":case\"cols\":if(!r&&0!==r)throw new Error(e+\" must be numeric, value: \"+r)}return r},e.prototype.getOption=function(e){return this.options[e]},e}();t.OptionsService=a},8343:(e,t)=>{function r(e,t,r){t.di$target===t?t.di$dependencies.push({id:e,index:r}):(t.di$dependencies=[{id:e,index:r}],t.di$target=t)}Object.defineProperty(t,\"__esModule\",{value:!0}),t.createDecorator=t.getServiceDependencies=t.serviceRegistry=void 0,t.serviceRegistry=new Map,t.getServiceDependencies=function(e){return e.di$dependencies||[]},t.createDecorator=function(e){if(t.serviceRegistry.has(e))return t.serviceRegistry.get(e);var i=function(e,t,n){if(3!==arguments.length)throw new Error(\"@IServiceName-decorator can only be used to decorate a parameter\");r(i,e,n)};return i.toString=function(){return e},t.serviceRegistry.set(e,i),i}},2585:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.IUnicodeService=t.IOptionsService=t.ILogService=t.LogLevelEnum=t.IInstantiationService=t.IDirtyRowService=t.ICharsetService=t.ICoreService=t.ICoreMouseService=t.IBufferService=void 0;var i,n=r(8343);t.IBufferService=(0,n.createDecorator)(\"BufferService\"),t.ICoreMouseService=(0,n.createDecorator)(\"CoreMouseService\"),t.ICoreService=(0,n.createDecorator)(\"CoreService\"),t.ICharsetService=(0,n.createDecorator)(\"CharsetService\"),t.IDirtyRowService=(0,n.createDecorator)(\"DirtyRowService\"),t.IInstantiationService=(0,n.createDecorator)(\"InstantiationService\"),(i=t.LogLevelEnum||(t.LogLevelEnum={}))[i.DEBUG=0]=\"DEBUG\",i[i.INFO=1]=\"INFO\",i[i.WARN=2]=\"WARN\",i[i.ERROR=3]=\"ERROR\",i[i.OFF=4]=\"OFF\",t.ILogService=(0,n.createDecorator)(\"LogService\"),t.IOptionsService=(0,n.createDecorator)(\"OptionsService\"),t.IUnicodeService=(0,n.createDecorator)(\"UnicodeService\")},1480:(e,t,r)=>{Object.defineProperty(t,\"__esModule\",{value:!0}),t.UnicodeService=void 0;var i=r(8460),n=r(225),o=function(){function e(){this._providers=Object.create(null),this._active=\"\",this._onChange=new i.EventEmitter;var e=new n.UnicodeV6;this.register(e),this._active=e.version,this._activeProvider=e}return Object.defineProperty(e.prototype,\"onChange\",{get:function(){return this._onChange.event},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"versions\",{get:function(){return Object.keys(this._providers)},enumerable:!1,configurable:!0}),Object.defineProperty(e.prototype,\"activeVersion\",{get:function(){return this._active},set:function(e){if(!this._providers[e])throw new Error('unknown Unicode version \"'+e+'\"');this._active=e,this._activeProvider=this._providers[e],this._onChange.fire(e)},enumerable:!1,configurable:!0}),e.prototype.register=function(e){this._providers[e.version]=e},e.prototype.wcwidth=function(e){return this._activeProvider.wcwidth(e)},e.prototype.getStringCellWidth=function(e){for(var t=0,r=e.length,i=0;i<r;++i){var n=e.charCodeAt(i);if(55296<=n&&n<=56319){if(++i>=r)return t+this.wcwidth(n);var o=e.charCodeAt(i);56320<=o&&o<=57343?n=1024*(n-55296)+o-56320+65536:t+=this.wcwidth(o)}t+=this.wcwidth(n)}return t},e}();t.UnicodeService=o}},t={};return function r(i){var n=t[i];if(void 0!==n)return n.exports;var o=t[i]={exports:{}};return e[i].call(o.exports,o,o.exports,r),o.exports}(4389)})()}));\n//# sourceMappingURL=xterm.js.map"
  },
  {
    "path": "luci-app-store/luci/luci-lib-xterm/luasrc/view/xterm/embed.htm",
    "content": "\n<link rel=\"stylesheet\" href=\"<%=resource%>/xterm/xterm.css<%# ?v=PKG_VERSION %>\">\n<script src=\"<%=resource%>/xterm/xterm.js<%# ?v=PKG_VERSION %>\"></script>\n"
  },
  {
    "path": "luci-app-store/luci/taskd/Makefile",
    "content": "#\n# Copyright (C) 2022 jjm2473 <jjm2473@gmail.com>\n#\n# This is free software, licensed under the MIT License.\n#\n\ninclude $(TOPDIR)/rules.mk\n\n\nPKG_NAME:=taskd\nPKG_VERSION:=1.0.3\nPKG_RELEASE:=2\nPKG_MAINTAINER:=jjm2473 <jjm2473@gmail.com>\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n\tSECTION:=utils\n\tCATEGORY:=Utilities\n\tTITLE:=Simple Task Manager\n\tDEPENDS:=+procd +script-utils +coreutils +coreutils-stty\n\tPKGARCH:=all\nendef\n\ndefine Package/$(PKG_NAME)/description\n\tSimple Task Manager based on procd\nendef\n\ndefine Build/Configure\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/etc/init.d $(1)/usr/libexec\n\t$(INSTALL_BIN) ./files/tasks.init $(1)/etc/init.d/tasks\n\t$(INSTALL_BIN) ./files/taskd.sh $(1)/usr/libexec/taskd\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "luci-app-store/luci/taskd/files/taskd.sh",
    "content": "#!/bin/sh\n\nTASK_ID=\"$1\"\nTASK_CMD=\"$2\"\n\nexec </dev/null >>\"/var/log/tasks/$TASK_ID.log\" 2>&1\n\nexport HOME=/root\nexport TERM=xterm-256color\n\nexec script -efqc 'onexit() {\n    /etc/init.d/tasks _task_onstop \"'\"$TASK_ID\"'\" \"$?\"\n}\ntrap onexit EXIT;\nstty cols 80 rows 24;\n'\"$TASK_CMD\" /dev/null\n"
  },
  {
    "path": "luci-app-store/luci/taskd/files/tasks.init",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2022 jjm2473@gmail.com\n\nUSE_PROCD=1\nSTART=49\n\nextra_command \"task_add\" \"<task_id> <task_cmd> [<time_wait>] Add and run a task, time_wait is wait time before auto delete stopped task, in seconds, -1 means forever\"\nextra_command \"task_del\" \"<task_id> Stop and delete task\"\nextra_command \"task_status\" \"[<task_id>] Dump task status, dump all tasks if no task_id specified\"\nextra_command \"task_gc\" \"Auto delete exipred (stopped and after timw_wait) tasks\"\nextra_command \"_task_onstop\" \"<task_id> Update stop time, for internal usage\"\n\n_task_add() {\n\tlocal task_id=\"${1}\"\n\tlocal task_cmd=\"${2}\"\n\tlocal time_wait=\"${3}\"\n\t> \"/var/log/tasks/$task_id.log\"\n\tprocd_open_instance \"$task_id\"\n\tprocd_set_param data start=`date +'%s'` time_wait=\"$time_wait\"\n\tprocd_set_param command sh -c \"exec /usr/libexec/taskd '$task_id' \\\"\\$0\\\"\" \"$task_cmd\"\n\tprocd_set_param stderr 1\n\tprocd_close_instance\n}\n\ntask_add() {\n\tlocal task_id=\"${1}\"\n\tlocal task_cmd=\"${2}\"\n\tlocal time_wait=\"${3}\"\n\t[ -z \"$task_id\" -o -z \"$task_cmd\" ] && return 127\n\n\tif service_running \"$task_id\"; then\n\t\techo \"already running\" >&2\n\t\treturn 1\n\tfi\n\tif ! mkdir -p /var/log/tasks; then\n\t\techo \"create /var/log/tasks failed!\" >&2\n\t\treturn 1\n\tfi\n\trc_procd _task_add \"$task_id\" \"$task_cmd\" \"$time_wait\"\n\treturn 0\n}\n\n_task_del() {\n\tlocal service=\"${1}\"\n\tlocal task_id=\"${2}\"\n\tprocd_kill \"$service\" \"$task_id\"\n\t> \"/var/log/tasks/$task_id.log\"\n\trm -f \"/var/log/tasks/$task_id.log\"\n}\n\ntask_del() {\n\tlocal task_id=\"${1}\"\n\t[ -z \"$task_id\" ] && return 127\n\tprocd_lock\n\t_task_del \"$(basename ${basescript:-$initscript})\" \"$task_id\"\n\tif [ \"$(_task_status \"$task_id\" | jsonfilter -e '$.running' 2>/dev/null)\" = \"true\" ]; then\n\t\treturn 1\n\telse\n\t\treturn 0\n\tfi\n}\n\n_task_status() {\n\tlocal service=\"$(basename ${basescript:-$initscript})\"\n\tlocal instance=\"$1\"\n\tlocal data\n\n\tjson_init\n\tjson_add_string name \"$service\"\n\n\tdata=$(_procd_ubus_call list | jsonfilter -e '@[\"'\"$service\"'\"]')\n\t[ -z \"$data\" ] && return 1\n\n\tdata=$(echo \"$data\" | jsonfilter -e '$.instances')\n\tif [ -z \"$data\" ]; then\n\t\tif [ -z \"$instance\" ]; then\n\t\t\techo \"{}\"\n\t\t\treturn 0\n\t\tfi\n\t\treturn 1\n\tfi\n\n\tif [ -z \"$instance\" ]; then\n\t\techo \"$data\"\n\telse\n\t\tinstance=\"\\\"$instance\\\"\"\n\t\techo \"$data\" | jsonfilter -e '$['\"$instance\"']'\n\tfi\n\treturn 0\n}\n\ntask_status() {\n\tlocal task_id=\"${1}\"\n\t_task_status \"$task_id\"\n}\n\ntask_gc() {\n\tlocal service=\"$(basename ${basescript:-$initscript})\"\n\tlocal task_id instance time_wait\n\tlocal data\n\n\tjson_init\n\t[ -n \"$service\" ] && json_add_string name \"$service\"\n\n\tdata=$(_procd_ubus_call list | jsonfilter -e '@[\"'\"$service\"'\"]')\n\t[ -z \"$data\" ] && return 1\n\n\tdata=$(echo \"$data\" | jsonfilter -e '$.instances')\n\t[ -z \"$data\" ] && return 1\n\n\tprocd_lock\n\n\tls /var/log/tasks/ | sed 's/.log$//g' | while read task_id; do\n\t\tinstance=$(echo \"$data\" | jsonfilter -e '$[\"'\"$task_id\"'\"]')\n\t\t[ \"$(echo \"$instance\" | jsonfilter -e '$.running')\" = \"false\" ] || continue\n\t\ttime_wait=$(echo \"$instance\" | jsonfilter -e '$.data.time_wait')\n\t\t[ \"$time_wait\" = \"-1\" ] && continue\n\t\t[ $(($(date +'%s' -r \"/var/log/tasks/$task_id.log\") + ${time_wait:-0})) -lt `date +'%s'` ] && _task_del \"$service\" \"$task_id\"\n\tdone\n}\n\n_insert_exit() {\n\tlocal exit_code=\"$2\"\n\teval \"`jshn -r \"$1\" | grep -v json_init`\"\n\tjson_select data || {\n\t\t_procd_set_param data stop=`date +'%s'` exit_code=\"$exit_code\"\n\t\treturn\n\t}\n\tjson_add_string stop `date +'%s'`\n\tjson_add_string exit_code \"$exit_code\"\n\tjson_select ..\n}\n\n_task_exit() {\n\tlocal task_id=\"$1\"\n\tlocal exit_code=\"$2\"\n\tlocal inst_json=\"$3\"\n\n\t_procd_call json_add_object \"$task_id\"\n\t_procd_call _insert_exit \"$inst_json\" \"$exit_code\"\n\t_procd_call json_close_object\n}\n\n_task_onstop() {\n\tlocal task_id=\"${1}\"\n\tlocal exit_code=\"${2}\"\n\t[ -z \"$task_id\" ] && return 127\n\tlocal service=\"$(basename ${basescript:-$initscript})\"\n\n\tjson_init\n\tjson_add_string name \"$service\"\n\tdata=$(_procd_ubus_call list | jsonfilter -e '@[\"'\"$service\"'\"].instances[\"'\"$task_id\"'\"]')\n\t[ -z \"$data\" ] && return 1\n\tjson_cleanup\n\n\trc_procd _task_exit \"$task_id\" \"$exit_code\" \"$data\"\n}\n"
  },
  {
    "path": "luci-app-store/translations/en/app.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: istore 0.1\\n\"\n\"Last-Translator: jjm2473\\n\"\n\"Language-Team: none\\n\"\n\"Language: en\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=2; plural=(n != 1);\\n\"\n\n#: src/components/app/index.vue:25\nmsgid \"%{ num } download\"\nmsgid_plural \"%{ num } downloads\"\nmsgstr[0] \"%{ num } download\"\nmsgstr[1] \"%{ num } downloads\"\n\n#: src/components/app/index.vue:32\nmsgid \"%{ num } like\"\nmsgid_plural \"%{ num } likes\"\nmsgstr[0] \"%{ num } like\"\nmsgstr[1] \"%{ num } likes\"\n\n#: src/components/tabs/index.vue:27\nmsgid \"all app\"\nmsgstr \"all app\"\n\n#: src/pages/maintance/index.vue:12\nmsgid \"app backup\"\nmsgstr \"app backup\"\n\n#: src/components/app/index.vue:168\nmsgid \"are you sure you want to uninstall %{name}?\"\nmsgstr \"are you sure you want to uninstall %{name}?\"\n\n#: src/components/app/index.vue:51\nmsgid \"author\"\nmsgstr \"author\"\n\n#: src/pages/maintance/lightBackup.vue:41\nmsgid \"backup fail\"\nmsgstr \"backup fail\"\n\n#: src/pages/maintance/localBackup.vue:198\n#: src/pages/maintance/localBackup.vue:203\nmsgid \"backup fail with error code\"\nmsgstr \"backup fail with error code\"\n\n#: src/pages/maintance/lightBackup.vue:18\n#: src/pages/maintance/localBackup.vue:34\nmsgid \"backup now\"\nmsgstr \"backup now\"\n\n#: src/pages/maintance/localBackup.vue:61\nmsgid \"\"\n\"backup now backs up installed software (unlimited installation sources) to \"\n\"external storage\"\nmsgstr \"\"\n\"backup now backs up installed software (unlimited installation sources) to \"\n\"external storage\"\n\n#: src/pages/maintance/lightBackup.vue:9\nmsgid \"backup now will download a list of iStore installed software\"\nmsgstr \"backup now will download a list of iStore installed software\"\n\n#: src/pages/maintance/lightBackup.vue:40\nmsgid \"backup success\"\nmsgstr \"backup success\"\n\n#: src/pages/maintance/lightBackup.vue:39\nmsgid \"backuping\"\nmsgstr \"backuping\"\n\n#: src/plugins/i18n/index.ts:45\nmsgid \"Broken\"\nmsgstr \"Broken\"\n\n#: src/pages/store/components/sort.vue:24\nmsgid \"By download\"\nmsgstr \"By download\"\n\n#: src/pages/store/components/sort.vue:28\nmsgid \"By rating\"\nmsgstr \"By rating\"\n\n#: src/pages/maintance/update.vue:4\nmsgid \"checking for latest version\"\nmsgstr \"checking for latest version\"\n\n#: src/pages/maintance/localBackup.vue:22\nmsgid \"choose\"\nmsgstr \"choose\"\n\n#: src/pages/maintance/localBackup.vue:41\nmsgid \"choose backup file\"\nmsgstr \"choose backup file\"\n\n#: src/pages/maintance/lightBackup.vue:42\nmsgid \"click to download\"\nmsgstr \"click to download\"\n\n#: src/pages/maintance/update.vue:11\nmsgid \"click to update\"\nmsgstr \"click to update\"\n\n#: src/components/toast/index.vue:3\nmsgid \"closed\"\nmsgstr \"closed\"\n\n#: src/pages/maintance/index.vue:8\nmsgid \"config\"\nmsgstr \"config\"\n\n#: src/pages/maintance/localBackup.vue:26\nmsgid \"customize\"\nmsgstr \"customize\"\n\n#: src/pages/store/components/sort.vue:20 src/pages/store/components/tag.vue:8\nmsgid \"default\"\nmsgstr \"default\"\n\n#: src/components/app/index.vue:148\nmsgid \"Docker is not installed on the system, try to install it?\"\nmsgstr \"Docker is not installed on the system, try to install it?\"\n\n#: src/plugins/i18n/index.ts:38\nmsgid \"download\"\nmsgstr \"Download\"\n\n#: src/pages/maintance/lightBackup.vue:4 src/pages/maintance/localBackup.vue:4\nmsgid \"explain\"\nmsgstr \"explain\"\n\n#: src/pages/maintance/localBackup.vue:16\nmsgid \"external storage directory\"\nmsgstr \"external storage directory\"\n\n#: src/pages/maintance/config.vue:5\nmsgid \"hide docker packages\"\nmsgstr \"hide docker packages\"\n\n#: src/pages/maintance/config.vue:7\nmsgid \"hide incompatible packages\"\nmsgstr \"hide incompatible packages\"\n\n#: src/components/app/index.vue:6\nmsgid \"Icon is gone\"\nmsgstr \"Icon is gone\"\n\n#: src/pages/upload/index.vue:6\nmsgid \"in this page, you can upload and install packages\"\nmsgstr \"in this page, you can upload and install packages\"\n\n#: src/components/app/index.vue:89\nmsgid \"install\"\nmsgstr \"install\"\n\n#: src/components/app/index.vue:154 src/components/app/index.vue:164\nmsgid \"installation failed, error code\"\nmsgstr \"installation failed, error code\"\n\n#: src/components/tabs/index.vue:23\nmsgid \"installed\"\nmsgstr \"installed\"\n\n#: src/pages/maintance/update.vue:9\nmsgid \"last version\"\nmsgstr \"last version\"\n\n#: src/pages/store/components/sort.vue:32\nmsgid \"Latest update\"\nmsgstr \"Latest date\"\n\n#: src/pages/maintance/index.vue:17\nmsgid \"light backup\"\nmsgstr \"light backup\"\n\n#: src/components/app/index.vue:41\nmsgid \"like\"\nmsgstr \"like\"\n\n#: src/components/app/index.vue:38\nmsgid \"liked\"\nmsgstr \"liked\"\n\n#: src/pages/store/components/apps.vue:6\nmsgid \"loading data\"\nmsgstr \"loading data\"\n\n#: src/pages/maintance/index.vue:22\nmsgid \"local backup\"\nmsgstr \"local backup\"\n\n#: src/components/tabs/index.vue:35\nmsgid \"maintain\"\nmsgstr \"maintain\"\n\n#: src/components/tabs/index.vue:31\nmsgid \"manual install\"\nmsgstr \"manual install\"\n\n#: src/plugins/i18n/index.ts:42\nmsgid \"monitor\"\nmsgstr \"Monitor\"\n\n#: src/plugins/i18n/index.ts:40\nmsgid \"multimedia\"\nmsgstr \"Multimedia\"\n\n#: src/plugins/i18n/index.ts:41\nmsgid \"nas\"\nmsgstr \"NAS\"\n\n#: src/plugins/i18n/index.ts:36\nmsgid \"net\"\nmsgstr \"Net\"\n\n#: src/plugins/i18n/index.ts:44\nmsgid \"networking\"\nmsgstr \"Networking\"\n\n#: src/pages/upload/index.vue:17 src/pages/upload/index.vue:18\nmsgid \"no files selected\"\nmsgstr \"no files selected\"\n\n#: src/pages/maintance/localBackup.vue:12\nmsgid \"no internet required for recovery\"\nmsgstr \"no internet required for recovery\"\n\n#: src/pages/upload/index.vue:4\nmsgid \"offline install\"\nmsgstr \"offline install\"\n\n#: src/pages/upload/index.vue:92 src/pages/upload/index.vue:97\nmsgid \"offline installation failed with error code\"\nmsgstr \"offline installation failed with error code\"\n\n#: src/components/app/index.vue:80\nmsgid \"open\"\nmsgstr \"open\"\n\n#: src/pages/store/components/sort.vue:3\nmsgid \"order\"\nmsgstr \"order\"\n\n#: src/pages/upload/index.vue:12\nmsgid \"packages installed offline may not appear in iStore\"\nmsgstr \"packages installed offline may not appear in iStore\"\n\n#: src/pages/maintance/localBackup.vue:29\nmsgid \"please enter an absolute path starting with %{name}\"\nmsgstr \"please enter an absolute path starting with %{name}\"\n\n#: src/pages/maintance/localBackup.vue:139\nmsgid \"please enter the path, give up the input, please clear the input box\"\nmsgstr \"please enter the path, give up the input, please clear the input box\"\n\n#: src/pages/store/components/search.vue:6\nmsgid \"please enter the search keyword\"\nmsgstr \"please enter the search keyword\"\n\n#: src/pages/maintance/localBackup.vue:157\n#: src/pages/maintance/localBackup.vue:191\nmsgid \"please fill in the external storage directory\"\nmsgstr \"please fill in the external storage directory\"\n\n#: src/pages/maintance/localBackup.vue:218\nmsgid \"please select a backup file to restore\"\nmsgstr \"please select a backup file to restore\"\n\n#: src/pages/maintance/lightBackup.vue:21\n#: src/pages/maintance/localBackup.vue:36\nmsgid \"restore backup\"\nmsgstr \"restore backup\"\n\n#: src/pages/maintance/lightBackup.vue:76\n#: src/pages/maintance/lightBackup.vue:81\n#: src/pages/maintance/localBackup.vue:224\n#: src/pages/maintance/localBackup.vue:229\nmsgid \"restore failed with error code\"\nmsgstr \"restore failed with error code\"\n\n#: src/pages/maintance/localBackup.vue:47\nmsgid \"restore now\"\nmsgstr \"restore now\"\n\n#: src/pages/upload/index.vue:20\nmsgid \"select or drag and drop files\"\nmsgstr \"select or drag and drop files\"\n\n#: src/plugins/i18n/index.ts:39\nmsgid \"service\"\nmsgstr \"Service\"\n\n#: src/pages/maintance/config.vue:5\nmsgid \"show docker packages\"\nmsgstr \"show docker packages\"\n\n#: src/pages/maintance/config.vue:7\nmsgid \"show incompatible packages\"\nmsgstr \"show incompatible packages\"\n\n#: src/components/app/index.vue:92\nmsgid \"Stick to the top\"\nmsgstr \"Stick to the top\"\n\n#: src/pages/upload/index.vue:9\nmsgid \"supports .ipk packages, .run self-extracting packages\"\nmsgstr \"supports .ipk packages, .run self-extracting packages\"\n\n#: src/plugins/i18n/index.ts:43\nmsgid \"system\"\nmsgstr \"System\"\n\n#: src/pages/store/components/tag.vue:4\nmsgid \"tag\"\nmsgstr \"Tag\"\n\n#: src/pages/maintance/update.vue:13\nmsgid \"the is last version\"\nmsgstr \"the is last version\"\n\n#: src/pages/maintance/localBackup.vue:167\nmsgid \"there are no backup files in this path\"\nmsgstr \"there are no backup files in this path\"\n\n#: src/plugins/i18n/index.ts:37\nmsgid \"tool\"\nmsgstr \"Tool\"\n\n#: src/components/app/index.vue:62\nmsgid \"tutorial\"\nmsgstr \"tutorial\"\n\n#: src/components/app/index.vue:83 src/components/app/index.vue:84\nmsgid \"uninstall\"\nmsgstr \"uninstall\"\n\n#: src/components/app/index.vue:177 src/components/app/index.vue:182\nmsgid \"uninstall failed, error code\"\nmsgstr \"uninstall failed, error code\"\n\n#: src/components/app/index.vue:55\nmsgid \"update date\"\nmsgstr \"update date\"\n\n#: src/pages/maintance/update.vue:49\nmsgid \"update error\"\nmsgstr \"update error\"\n\n#: src/components/app/index.vue:138 src/components/app/index.vue:143\nmsgid \"update failed with error code\"\nmsgstr \"update failed with error code\"\n\n#: src/pages/maintance/update.vue:37\nmsgid \"update success, reloading\"\nmsgstr \"update success, reloading\"\n\n#: src/pages/maintance/update.vue:32\nmsgid \"updateing\"\nmsgstr \"updateing\"\n\n#: src/components/app/index.vue:74 src/pages/maintance/index.vue:4\nmsgid \"upgrade\"\nmsgstr \"upgrade\"\n\n#: src/pages/maintance/lightBackup.vue:13\nmsgid \"upload software list and install from iStore when restoring backup\"\nmsgstr \"upload software list and install from iStore when restoring backup\"\n\n#: src/pages/maintance/lightBackup.vue:72 src/pages/upload/index.vue:88\nmsgid \"uploading\"\nmsgstr \"uploading\"\n\n#: src/components/app/index.vue:65\nmsgid \"website\"\nmsgstr \"website\"\n\n#: src/components/app/index.vue:201\nmsgid \"you have already liked\"\nmsgstr \"you have already liked\"\n\n#~ msgid \"do not refresh this page during plugin installation/uninstallation\"\n#~ msgstr \"do not refresh this page during plugin installation/uninstallation\"\n\n#~ msgid \"installation is complete, please close the current window\"\n#~ msgstr \"installation is complete, please close the current window\"\n\n#~ msgid \"installing plugin\"\n#~ msgstr \"installing plugin\"\n\n#~ msgid \"offline installation is successful, please close the current window\"\n#~ msgstr \"offline installation is successful, please close the current window\"\n\n#~ msgid \"restoring backup\"\n#~ msgstr \"restoring backup\"\n\n#~ msgid \"the backup was restored fail\"\n#~ msgstr \"the backup was restored fail\"\n\n#~ msgid \"the backup was restored success\"\n#~ msgstr \"the backup was restored success\"\n\n#~ msgid \"the update is success, please close the current window\"\n#~ msgstr \"the update is success, please close the current window\"\n\n#~ msgid \"uninstallation succeeded, please close the current window\"\n#~ msgstr \"uninstallation succeeded, please close the current window\"\n\n#~ msgid \"uninstalling plugin\"\n#~ msgstr \"uninstalling plugin\"\n\n#~ msgid \"updating plugin\"\n#~ msgstr \"updating plugin\"\n"
  },
  {
    "path": "luci-app-store/translations/templates/app.pot",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\n#: src/components/app/index.vue:25\nmsgid \"%{ num } download\"\nmsgid_plural \"%{ num } downloads\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: src/components/app/index.vue:32\nmsgid \"%{ num } like\"\nmsgid_plural \"%{ num } likes\"\nmsgstr[0] \"\"\nmsgstr[1] \"\"\n\n#: src/components/tabs/index.vue:27\nmsgid \"all app\"\nmsgstr \"\"\n\n#: src/pages/maintance/index.vue:12\nmsgid \"app backup\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:168\nmsgid \"are you sure you want to uninstall %{name}?\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:51\nmsgid \"author\"\nmsgstr \"\"\n\n#: src/pages/maintance/lightBackup.vue:41\nmsgid \"backup fail\"\nmsgstr \"\"\n\n#: src/pages/maintance/localBackup.vue:198\n#: src/pages/maintance/localBackup.vue:203\nmsgid \"backup fail with error code\"\nmsgstr \"\"\n\n#: src/pages/maintance/lightBackup.vue:18\n#: src/pages/maintance/localBackup.vue:34\nmsgid \"backup now\"\nmsgstr \"\"\n\n#: src/pages/maintance/localBackup.vue:61\nmsgid \"backup now backs up installed software (unlimited installation sources) to external storage\"\nmsgstr \"\"\n\n#: src/pages/maintance/lightBackup.vue:9\nmsgid \"backup now will download a list of iStore installed software\"\nmsgstr \"\"\n\n#: src/pages/maintance/lightBackup.vue:40\nmsgid \"backup success\"\nmsgstr \"\"\n\n#: src/pages/maintance/lightBackup.vue:39\nmsgid \"backuping\"\nmsgstr \"\"\n\n#: src/plugins/i18n/index.ts:45\nmsgid \"Broken\"\nmsgstr \"\"\n\n#: src/pages/store/components/sort.vue:24\nmsgid \"By download\"\nmsgstr \"\"\n\n#: src/pages/store/components/sort.vue:28\nmsgid \"By rating\"\nmsgstr \"\"\n\n#: src/pages/maintance/update.vue:4\nmsgid \"checking for latest version\"\nmsgstr \"\"\n\n#: src/pages/maintance/localBackup.vue:22\nmsgid \"choose\"\nmsgstr \"\"\n\n#: src/pages/maintance/localBackup.vue:41\nmsgid \"choose backup file\"\nmsgstr \"\"\n\n#: src/pages/maintance/lightBackup.vue:42\nmsgid \"click to download\"\nmsgstr \"\"\n\n#: src/pages/maintance/update.vue:11\nmsgid \"click to update\"\nmsgstr \"\"\n\n#: src/components/toast/index.vue:3\nmsgid \"closed\"\nmsgstr \"\"\n\n#: src/pages/maintance/index.vue:8\nmsgid \"config\"\nmsgstr \"\"\n\n#: src/pages/maintance/localBackup.vue:26\nmsgid \"customize\"\nmsgstr \"\"\n\n#: src/pages/store/components/sort.vue:20\n#: src/pages/store/components/tag.vue:8\nmsgid \"default\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:148\nmsgid \"Docker is not installed on the system, try to install it?\"\nmsgstr \"\"\n\n#: src/plugins/i18n/index.ts:38\nmsgid \"download\"\nmsgstr \"\"\n\n#: src/pages/maintance/lightBackup.vue:4\n#: src/pages/maintance/localBackup.vue:4\nmsgid \"explain\"\nmsgstr \"\"\n\n#: src/pages/maintance/localBackup.vue:16\nmsgid \"external storage directory\"\nmsgstr \"\"\n\n#: src/pages/maintance/config.vue:5\nmsgid \"hide docker packages\"\nmsgstr \"\"\n\n#: src/pages/maintance/config.vue:7\nmsgid \"hide incompatible packages\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:6\nmsgid \"Icon is gone\"\nmsgstr \"\"\n\n#: src/pages/upload/index.vue:6\nmsgid \"in this page, you can upload and install packages\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:89\nmsgid \"install\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:154\n#: src/components/app/index.vue:164\nmsgid \"installation failed, error code\"\nmsgstr \"\"\n\n#: src/components/tabs/index.vue:23\nmsgid \"installed\"\nmsgstr \"\"\n\n#: src/pages/maintance/update.vue:9\nmsgid \"last version\"\nmsgstr \"\"\n\n#: src/pages/store/components/sort.vue:32\nmsgid \"Latest update\"\nmsgstr \"\"\n\n#: src/pages/maintance/index.vue:17\nmsgid \"light backup\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:41\nmsgid \"like\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:38\nmsgid \"liked\"\nmsgstr \"\"\n\n#: src/pages/store/components/apps.vue:6\nmsgid \"loading data\"\nmsgstr \"\"\n\n#: src/pages/maintance/index.vue:22\nmsgid \"local backup\"\nmsgstr \"\"\n\n#: src/components/tabs/index.vue:35\nmsgid \"maintain\"\nmsgstr \"\"\n\n#: src/components/tabs/index.vue:31\nmsgid \"manual install\"\nmsgstr \"\"\n\n#: src/plugins/i18n/index.ts:42\nmsgid \"monitor\"\nmsgstr \"\"\n\n#: src/plugins/i18n/index.ts:40\nmsgid \"multimedia\"\nmsgstr \"\"\n\n#: src/plugins/i18n/index.ts:41\nmsgid \"nas\"\nmsgstr \"\"\n\n#: src/plugins/i18n/index.ts:36\nmsgid \"net\"\nmsgstr \"\"\n\n#: src/plugins/i18n/index.ts:44\nmsgid \"networking\"\nmsgstr \"\"\n\n#: src/pages/upload/index.vue:17\n#: src/pages/upload/index.vue:18\nmsgid \"no files selected\"\nmsgstr \"\"\n\n#: src/pages/maintance/localBackup.vue:12\nmsgid \"no internet required for recovery\"\nmsgstr \"\"\n\n#: src/pages/upload/index.vue:4\nmsgid \"offline install\"\nmsgstr \"\"\n\n#: src/pages/upload/index.vue:92\n#: src/pages/upload/index.vue:97\nmsgid \"offline installation failed with error code\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:80\nmsgid \"open\"\nmsgstr \"\"\n\n#: src/pages/store/components/sort.vue:3\nmsgid \"order\"\nmsgstr \"\"\n\n#: src/pages/upload/index.vue:12\nmsgid \"packages installed offline may not appear in iStore\"\nmsgstr \"\"\n\n#: src/pages/maintance/localBackup.vue:29\nmsgid \"please enter an absolute path starting with %{name}\"\nmsgstr \"\"\n\n#: src/pages/maintance/localBackup.vue:139\nmsgid \"please enter the path, give up the input, please clear the input box\"\nmsgstr \"\"\n\n#: src/pages/store/components/search.vue:6\nmsgid \"please enter the search keyword\"\nmsgstr \"\"\n\n#: src/pages/maintance/localBackup.vue:157\n#: src/pages/maintance/localBackup.vue:191\nmsgid \"please fill in the external storage directory\"\nmsgstr \"\"\n\n#: src/pages/maintance/localBackup.vue:218\nmsgid \"please select a backup file to restore\"\nmsgstr \"\"\n\n#: src/pages/maintance/lightBackup.vue:21\n#: src/pages/maintance/localBackup.vue:36\nmsgid \"restore backup\"\nmsgstr \"\"\n\n#: src/pages/maintance/lightBackup.vue:76\n#: src/pages/maintance/lightBackup.vue:81\n#: src/pages/maintance/localBackup.vue:224\n#: src/pages/maintance/localBackup.vue:229\nmsgid \"restore failed with error code\"\nmsgstr \"\"\n\n#: src/pages/maintance/localBackup.vue:47\nmsgid \"restore now\"\nmsgstr \"\"\n\n#: src/pages/upload/index.vue:20\nmsgid \"select or drag and drop files\"\nmsgstr \"\"\n\n#: src/plugins/i18n/index.ts:39\nmsgid \"service\"\nmsgstr \"\"\n\n#: src/pages/maintance/config.vue:5\nmsgid \"show docker packages\"\nmsgstr \"\"\n\n#: src/pages/maintance/config.vue:7\nmsgid \"show incompatible packages\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:92\nmsgid \"Stick to the top\"\nmsgstr \"\"\n\n#: src/pages/upload/index.vue:9\nmsgid \"supports .ipk packages, .run self-extracting packages\"\nmsgstr \"\"\n\n#: src/plugins/i18n/index.ts:43\nmsgid \"system\"\nmsgstr \"\"\n\n#: src/pages/store/components/tag.vue:4\nmsgid \"tag\"\nmsgstr \"\"\n\n#: src/pages/maintance/update.vue:13\nmsgid \"the is last version\"\nmsgstr \"\"\n\n#: src/pages/maintance/localBackup.vue:167\nmsgid \"there are no backup files in this path\"\nmsgstr \"\"\n\n#: src/plugins/i18n/index.ts:37\nmsgid \"tool\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:62\nmsgid \"tutorial\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:83\n#: src/components/app/index.vue:84\nmsgid \"uninstall\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:177\n#: src/components/app/index.vue:182\nmsgid \"uninstall failed, error code\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:55\nmsgid \"update date\"\nmsgstr \"\"\n\n#: src/pages/maintance/update.vue:49\nmsgid \"update error\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:138\n#: src/components/app/index.vue:143\nmsgid \"update failed with error code\"\nmsgstr \"\"\n\n#: src/pages/maintance/update.vue:37\nmsgid \"update success, reloading\"\nmsgstr \"\"\n\n#: src/pages/maintance/update.vue:32\nmsgid \"updateing\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:74\n#: src/pages/maintance/index.vue:4\nmsgid \"upgrade\"\nmsgstr \"\"\n\n#: src/pages/maintance/lightBackup.vue:13\nmsgid \"upload software list and install from iStore when restoring backup\"\nmsgstr \"\"\n\n#: src/pages/maintance/lightBackup.vue:72\n#: src/pages/upload/index.vue:88\nmsgid \"uploading\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:65\nmsgid \"website\"\nmsgstr \"\"\n\n#: src/components/app/index.vue:201\nmsgid \"you have already liked\"\nmsgstr \"\"\n"
  },
  {
    "path": "luci-app-store/translations/zh_Hans/app.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: istore 0.1\\n\"\n\"Last-Translator: jjm2473\\n\"\n\"Language-Team: none\\n\"\n\"Language: zh-cn\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: src/components/app/index.vue:25\nmsgid \"%{ num } download\"\nmsgid_plural \"%{ num } downloads\"\nmsgstr[0] \"%{ num } 次下载\"\nmsgstr[1] \"%{ num } 次下载\"\n\n#: src/components/app/index.vue:32\nmsgid \"%{ num } like\"\nmsgid_plural \"%{ num } likes\"\nmsgstr[0] \"%{ num } 次点赞\"\nmsgstr[1] \"%{ num } 次点赞\"\n\n#: src/components/tabs/index.vue:27\nmsgid \"all app\"\nmsgstr \"全部软件\"\n\n#: src/pages/maintance/index.vue:12\nmsgid \"app backup\"\nmsgstr \"软件备份\"\n\n#: src/components/app/index.vue:168\nmsgid \"are you sure you want to uninstall %{name}?\"\nmsgstr \"确定要卸载 %{name} 吗?\"\n\n#: src/components/app/index.vue:51\nmsgid \"author\"\nmsgstr \"作者\"\n\n#: src/pages/maintance/lightBackup.vue:41\nmsgid \"backup fail\"\nmsgstr \"备份失败\"\n\n#: src/pages/maintance/localBackup.vue:198\n#: src/pages/maintance/localBackup.vue:203\nmsgid \"backup fail with error code\"\nmsgstr \"备份失败，错误代码\"\n\n#: src/pages/maintance/lightBackup.vue:18\n#: src/pages/maintance/localBackup.vue:34\nmsgid \"backup now\"\nmsgstr \"立即备份\"\n\n#: src/pages/maintance/localBackup.vue:61\nmsgid \"\"\n\"backup now backs up installed software (unlimited installation sources) to \"\n\"external storage\"\nmsgstr \"立即备份将备份已安装软件（不限安装来源）到外部存储\"\n\n#: src/pages/maintance/lightBackup.vue:9\nmsgid \"backup now will download a list of iStore installed software\"\nmsgstr \"立即备份将下载iStore已安装的软件列表\"\n\n#: src/pages/maintance/lightBackup.vue:40\nmsgid \"backup success\"\nmsgstr \"备份成功\"\n\n#: src/pages/maintance/lightBackup.vue:39\nmsgid \"backuping\"\nmsgstr \"正在备份\"\n\n#: src/plugins/i18n/index.ts:45\nmsgid \"Broken\"\nmsgstr \"已损坏\"\n\n#: src/pages/store/components/sort.vue:24\nmsgid \"By download\"\nmsgstr \"按下载\"\n\n#: src/pages/store/components/sort.vue:28\nmsgid \"By rating\"\nmsgstr \"按评分\"\n\n#: src/pages/maintance/update.vue:4\nmsgid \"checking for latest version\"\nmsgstr \"正在检查最新版本\"\n\n#: src/pages/maintance/localBackup.vue:22\nmsgid \"choose\"\nmsgstr \"请选择\"\n\n#: src/pages/maintance/localBackup.vue:41\nmsgid \"choose backup file\"\nmsgstr \"选择备份文件\"\n\n#: src/pages/maintance/lightBackup.vue:42\nmsgid \"click to download\"\nmsgstr \"点此下载\"\n\n#: src/pages/maintance/update.vue:11\nmsgid \"click to update\"\nmsgstr \"点我更新\"\n\n#: src/components/toast/index.vue:3\nmsgid \"closed\"\nmsgstr \"关闭\"\n\n#: src/pages/maintance/index.vue:8\nmsgid \"config\"\nmsgstr \"配置\"\n\n#: src/pages/maintance/localBackup.vue:26\nmsgid \"customize\"\nmsgstr \"自定义\"\n\n#: src/pages/store/components/sort.vue:20 src/pages/store/components/tag.vue:8\nmsgid \"default\"\nmsgstr \"默认\"\n\n#: src/components/app/index.vue:148\nmsgid \"Docker is not installed on the system, try to install it?\"\nmsgstr \"系统中未安装Docker，是否尝试安装？\"\n\n#: src/plugins/i18n/index.ts:38\nmsgid \"download\"\nmsgstr \"下载\"\n\n#: src/pages/maintance/lightBackup.vue:4 src/pages/maintance/localBackup.vue:4\nmsgid \"explain\"\nmsgstr \"说明\"\n\n#: src/pages/maintance/localBackup.vue:16\nmsgid \"external storage directory\"\nmsgstr \"外部存储目录\"\n\n#: src/pages/maintance/config.vue:5\nmsgid \"hide docker packages\"\nmsgstr \"隐藏 Docker 插件\"\n\n#: src/pages/maintance/config.vue:7\nmsgid \"hide incompatible packages\"\nmsgstr \"隐藏架构不兼容插件\"\n\n#: src/components/app/index.vue:6\nmsgid \"Icon is gone\"\nmsgstr \"图标出走啦\"\n\n#: src/pages/upload/index.vue:6\nmsgid \"in this page, you can upload and install packages\"\nmsgstr \"通过本页面，你可以上传并安装插件包\"\n\n#: src/components/app/index.vue:89\nmsgid \"install\"\nmsgstr \"安装\"\n\n#: src/components/app/index.vue:154 src/components/app/index.vue:164\nmsgid \"installation failed, error code\"\nmsgstr \"安装失败,错误码\"\n\n#: src/components/tabs/index.vue:23\nmsgid \"installed\"\nmsgstr \"已安装\"\n\n#: src/pages/maintance/update.vue:9\nmsgid \"last version\"\nmsgstr \"最新版本\"\n\n#: src/pages/store/components/sort.vue:32\nmsgid \"Latest update\"\nmsgstr \"最近更新\"\n\n#: src/pages/maintance/index.vue:17\nmsgid \"light backup\"\nmsgstr \"轻量备份\"\n\n#: src/components/app/index.vue:41\nmsgid \"like\"\nmsgstr \"点赞\"\n\n#: src/components/app/index.vue:38\nmsgid \"liked\"\nmsgstr \"已点赞\"\n\n#: src/pages/store/components/apps.vue:6\nmsgid \"loading data\"\nmsgstr \"正在努力的获取数据\"\n\n#: src/pages/maintance/index.vue:22\nmsgid \"local backup\"\nmsgstr \"本地备份\"\n\n#: src/components/tabs/index.vue:35\nmsgid \"maintain\"\nmsgstr \"维护\"\n\n#: src/components/tabs/index.vue:31\nmsgid \"manual install\"\nmsgstr \"手动安装\"\n\n#: src/plugins/i18n/index.ts:42\nmsgid \"monitor\"\nmsgstr \"监控\"\n\n#: src/plugins/i18n/index.ts:40\nmsgid \"multimedia\"\nmsgstr \"多媒体\"\n\n#: src/plugins/i18n/index.ts:41\nmsgid \"nas\"\nmsgstr \"NAS\"\n\n#: src/plugins/i18n/index.ts:36\nmsgid \"net\"\nmsgstr \"网络\"\n\n#: src/plugins/i18n/index.ts:44\nmsgid \"networking\"\nmsgstr \"组网\"\n\n#: src/pages/upload/index.vue:17 src/pages/upload/index.vue:18\nmsgid \"no files selected\"\nmsgstr \"未选择任何文件\"\n\n#: src/pages/maintance/localBackup.vue:12\nmsgid \"no internet required for recovery\"\nmsgstr \"恢复时不需要网络\"\n\n#: src/pages/upload/index.vue:4\nmsgid \"offline install\"\nmsgstr \"离线安装\"\n\n#: src/pages/upload/index.vue:92 src/pages/upload/index.vue:97\nmsgid \"offline installation failed with error code\"\nmsgstr \"离线安装失败,错误码\"\n\n#: src/components/app/index.vue:80\nmsgid \"open\"\nmsgstr \"打开\"\n\n#: src/pages/store/components/sort.vue:3\nmsgid \"order\"\nmsgstr \"排序\"\n\n#: src/pages/upload/index.vue:12\nmsgid \"packages installed offline may not appear in iStore\"\nmsgstr \"离线安装的插件可能不会出现在iStore中\"\n\n#: src/pages/maintance/localBackup.vue:29\nmsgid \"please enter an absolute path starting with %{name}\"\nmsgstr \"请输入 %{name} 开头的绝对路径\"\n\n#: src/pages/maintance/localBackup.vue:139\nmsgid \"please enter the path, give up the input, please clear the input box\"\nmsgstr \"请输入路径，放弃输入请清空输入框\"\n\n#: src/pages/store/components/search.vue:6\nmsgid \"please enter the search keyword\"\nmsgstr \"请输入搜索关键词\"\n\n#: src/pages/maintance/localBackup.vue:157\n#: src/pages/maintance/localBackup.vue:191\nmsgid \"please fill in the external storage directory\"\nmsgstr \"请填写外部存储目录\"\n\n#: src/pages/maintance/localBackup.vue:218\nmsgid \"please select a backup file to restore\"\nmsgstr \"请选择要恢复的备份文件\"\n\n#: src/pages/maintance/lightBackup.vue:21\n#: src/pages/maintance/localBackup.vue:36\nmsgid \"restore backup\"\nmsgstr \"恢复备份\"\n\n#: src/pages/maintance/lightBackup.vue:76\n#: src/pages/maintance/lightBackup.vue:81\n#: src/pages/maintance/localBackup.vue:224\n#: src/pages/maintance/localBackup.vue:229\nmsgid \"restore failed with error code\"\nmsgstr \"恢复失败，错误代码\"\n\n#: src/pages/maintance/localBackup.vue:47\nmsgid \"restore now\"\nmsgstr \"立即恢复\"\n\n#: src/pages/upload/index.vue:20\nmsgid \"select or drag and drop files\"\nmsgstr \"选择或拖放文件\"\n\n#: src/plugins/i18n/index.ts:39\nmsgid \"service\"\nmsgstr \"服务\"\n\n#: src/pages/maintance/config.vue:5\nmsgid \"show docker packages\"\nmsgstr \"显示 Docker 插件\"\n\n#: src/pages/maintance/config.vue:7\nmsgid \"show incompatible packages\"\nmsgstr \"显示架构不兼容插件\"\n\n#: src/components/app/index.vue:92\nmsgid \"Stick to the top\"\nmsgstr \"置顶\"\n\n#: src/pages/upload/index.vue:9\nmsgid \"supports .ipk packages, .run self-extracting packages\"\nmsgstr \"支持 .ipk 包，.run 自解压格式\"\n\n#: src/plugins/i18n/index.ts:43\nmsgid \"system\"\nmsgstr \"系统\"\n\n#: src/pages/store/components/tag.vue:4\nmsgid \"tag\"\nmsgstr \"标签\"\n\n#: src/pages/maintance/update.vue:13\nmsgid \"the is last version\"\nmsgstr \"当前已经是最新版本\"\n\n#: src/pages/maintance/localBackup.vue:167\nmsgid \"there are no backup files in this path\"\nmsgstr \"此路径下没有备份文件\"\n\n#: src/plugins/i18n/index.ts:37\nmsgid \"tool\"\nmsgstr \"工具\"\n\n#: src/components/app/index.vue:62\nmsgid \"tutorial\"\nmsgstr \"教程\"\n\n#: src/components/app/index.vue:83 src/components/app/index.vue:84\nmsgid \"uninstall\"\nmsgstr \"卸载\"\n\n#: src/components/app/index.vue:177 src/components/app/index.vue:182\nmsgid \"uninstall failed, error code\"\nmsgstr \"卸载失败,错误码\"\n\n#: src/components/app/index.vue:55\nmsgid \"update date\"\nmsgstr \"更新日期\"\n\n#: src/pages/maintance/update.vue:49\nmsgid \"update error\"\nmsgstr \"更新失败\"\n\n#: src/components/app/index.vue:138 src/components/app/index.vue:143\nmsgid \"update failed with error code\"\nmsgstr \"更新失败，错误代码\"\n\n#: src/pages/maintance/update.vue:37\nmsgid \"update success, reloading\"\nmsgstr \"更新成功，重新加载页面\"\n\n#: src/pages/maintance/update.vue:32\nmsgid \"updateing\"\nmsgstr \"正在更新中\"\n\n#: src/components/app/index.vue:74 src/pages/maintance/index.vue:4\nmsgid \"upgrade\"\nmsgstr \"更新\"\n\n#: src/pages/maintance/lightBackup.vue:13\nmsgid \"upload software list and install from iStore when restoring backup\"\nmsgstr \"恢复备份时上传软件列表并从iStore安装\"\n\n#: src/pages/maintance/lightBackup.vue:72 src/pages/upload/index.vue:88\nmsgid \"uploading\"\nmsgstr \"上传中\"\n\n#: src/components/app/index.vue:65\nmsgid \"website\"\nmsgstr \"官网\"\n\n#: src/components/app/index.vue:201\nmsgid \"you have already liked\"\nmsgstr \"您已经点赞过啦\"\n\n#~ msgid \"do not refresh this page during plugin installation/uninstallation\"\n#~ msgstr \"插件安装/卸载过程中请勿刷新此页面\"\n\n#~ msgid \"installation is complete, please close the current window\"\n#~ msgstr \"安装完成，请关闭当前窗口\"\n\n#~ msgid \"installing plugin\"\n#~ msgstr \"正在安装插件\"\n\n#~ msgid \"offline installation is successful, please close the current window\"\n#~ msgstr \"离线安装成功，请关闭当前窗口\"\n\n#~ msgid \"restoring backup\"\n#~ msgstr \"正在恢复备份\"\n\n#~ msgid \"the backup was restored fail\"\n#~ msgstr \"恢复备份失败\"\n\n#~ msgid \"the backup was restored success\"\n#~ msgstr \"恢复备份成功\"\n\n#~ msgid \"the update is success, please close the current window\"\n#~ msgstr \"更新成功，请关闭当前窗口\"\n\n#~ msgid \"uninstallation succeeded, please close the current window\"\n#~ msgstr \"卸载完成，请关闭当前窗口\"\n\n#~ msgid \"uninstalling plugin\"\n#~ msgstr \"正在卸载插件\"\n\n#~ msgid \"updating plugin\"\n#~ msgstr \"正在更新插件\"\n"
  },
  {
    "path": "luci-app-supervisord/Makefile",
    "content": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for NginxManager From sundaqiang\nLUCI_PKGARCH:=all\nPKG_VERSION:=1.0\nPKG_RELEASE:=20211102\nPKG_MAINTAINER:=sundaqiang\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-supervisord/luasrc/controller/supervisord.lua",
    "content": "module(\"luci.controller.supervisord\", package.seeall)\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/supervisord\") then return end\n    entry({\"admin\", \"services\", \"supervisord\"}, cbi(\"supervisord\"), _(\"Supervisord\"), 95).dependent = true\n    entry({\"admin\", \"services\", \"supervisord\", \"status\"}, call(\"status\")).leaf = true\n    entry({\"admin\", \"services\", \"supervisord\", \"getver\"}, call(\"getver\")).leaf = true\n    entry({\"admin\", \"services\", \"supervisord\", \"update\"}, call(\"update\")).leaf = true\n    entry({\"admin\", \"services\", \"supervisord\", \"gettask\"}, call(\"gettask\")).leaf = true\n    entry({\"admin\", \"services\", \"supervisord\", \"starttask\"}, call(\"starttask\")).leaf = true\n    entry({\"admin\", \"services\", \"supervisord\", \"restarttask\"}, call(\"restarttask\")).leaf = true\n    entry({\"admin\", \"services\", \"supervisord\", \"stoptask\"}, call(\"stoptask\")).leaf = true\n    entry({\"admin\", \"services\", \"supervisord\", \"removetask\"}, call(\"removetask\")).leaf = true\n    entry({\"admin\", \"services\", \"supervisord\", \"addtask\"}, call(\"addtask\")).leaf = true\n    entry({\"admin\", \"services\", \"supervisord\", \"savetask\"}, call(\"savetask\")).leaf = true\n    entry({\"admin\", \"services\", \"supervisord\", \"getlog\"}, call(\"getlog\")).leaf = true\nend\n\nfunction Split(str, delim, maxNb)  \n    -- Eliminate bad cases...  \n    if string.find(str, delim) == nil then \n        return { str } \n    end \n    if maxNb == nil or maxNb < 1 then \n        maxNb = 0    -- No limit  \n    end \n    local result = {} \n    local pat = \"(.-)\" .. delim .. \"()\"  \n    local nb = 0 \n    local lastPos  \n    for part, pos in string.gfind(str, pat) do \n        nb = nb + 1 \n        result[nb] = part  \n        lastPos = pos  \n        if nb == maxNb then break end \n    end \n    -- Handle the last field  \n    if nb ~= maxNb then \n        result[nb + 1] = string.sub(str, lastPos)  \n    end \n    return result  \nend \n\nfunction status()\n\tlocal e = {}\n\te.running = luci.sys.call(\"ps | grep supervisord | grep -v grep >/dev/null\") == 0\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n\nfunction getver()\n\tlocal e = {}\n\tlocal c=luci.model.uci.cursor()\n    local d=c:get(\"supervisord\", \"main\", \"filepath\")\n    e.nowver=luci.sys.exec(d .. \" version\")\n    e.newver=luci.sys.exec(\"uclient-fetch -qO- 'https://api.github.com/repos/ochinchina/supervisord/releases/latest' | jsonfilter -e '@.tag_name'\")\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n\nfunction update()\n\tlocal e = {}\n\tlocal c=luci.model.uci.cursor()\n    local d=c:get(\"supervisord\", \"main\", \"filepath\")\n    local version = luci.http.formvalue('version')\n    local arch = nixio.uname().machine or \"\"\n\tversion = version:gsub(\"\\n\", \"\")\n    if nixio.fs.access(\"/usr/lib/os-release\") then\n        LEDE_BOARD = luci.sys.exec(\"echo -n $(grep 'LEDE_BOARD' /usr/lib/os-release | awk -F '[\\\\042\\\\047]' '{print $2}')\")\n    end\n    if nixio.fs.access(\"/etc/openwrt_release\") then\n        DISTRIB_TARGET = luci.sys.exec(\"echo -n $(grep 'DISTRIB_TARGET' /etc/openwrt_release | awk -F '[\\\\042\\\\047]' '{print $2}')\")\n    end\n    arch=luci.util.trim(arch)\n    if arch == \"x86_64\" then\n        arch = \"64-bit\"\n    end\n    filename = \"supervisord_\" .. version:gsub(\"v\", \"\") .. \"_Linux_\" .. arch .. \".tar.gz\"\n    nixio.fs.remove(\"/tmp/\" .. filename)\n    u=c:get(\"supervisord\", \"main\", \"usechinamirror\")\n    e.error=luci.sys.call(\"uclient-fetch -qO- -O '/tmp/\" .. filename .. \"' '\" .. u .. \"https://github.com/ochinchina/supervisord/releases/download/\" .. version .. \"/\" .. filename .. \"'\")\n    if e.error == 0 then\n        e.error=luci.sys.exec(\"tar -xzvf '/tmp/\" .. filename .. \"' -C /tmp\")\n        if e.error then\n            e.error=nixio.fs.mover(\"/tmp/\" .. filename:gsub(\".tar.gz\", \"\") .. \"/supervisord\", d)\n            if e.error then\n                e.error=0\n\t\t\t\tsysupgrade=nixio.fs.readfile(\"/etc/sysupgrade.conf\")\n\t\t\t\tif not sysupgrade:find(d) then\n\t\t\t\t\tsysupgrade=sysupgrade .. '\\n' .. d\n\t\t\t\t\tnixio.fs.writefile (\"/etc/sysupgrade.conf\", sysupgrade)\n\t\t\t\tend\n                luci.http.prepare_content(\"application/json\")\n    \t        luci.http.write_json(e)\n            end\n        else\n            luci.http.prepare_content(\"application/json\")\n\t        luci.http.write_json(e)\n        end\n    else\n        luci.http.prepare_content(\"application/json\")\n\t    luci.http.write_json(e)\n    end\nend\n\nfunction gettask()\n\tlocal e = {}\n\tlocal name = luci.http.formvalue('name')\n\tlocal data = luci.sys.exec(\"supervisord ctl status \" .. name)\n\te.status=string.gsub(string.sub(data, 34, 50), \" \", \"\")\n\te.description=string.sub(data, 51)\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n\nfunction starttask()\n\tlocal e = {}\n\tlocal name = luci.http.formvalue('name')\n\tlocal data = luci.sys.exec(\"supervisord ctl start \" .. name)\n    if string.find(data,\"started\") ~= nil then\n        e.code=1\n    else\n        e.code=0\n\tend\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n\nfunction restarttask()\n\tlocal e = {}\n\tlocal name = luci.http.formvalue('name')\n\tlocal data = luci.sys.exec(\"supervisord ctl stop \" .. name .. \" && supervisord ctl start \" .. name)\n    if string.find(data,\"started\") ~= nil then\n        e.code=1\n    else\n        e.code=0\n\tend\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n\nfunction stoptask()\n\tlocal e = {}\n\tlocal name = luci.http.formvalue('name')\n\tlocal data = luci.sys.exec(\"supervisord ctl stop \" .. name)\n    if string.find(data,\"stopped\") ~= nil then\n        e.code=1\n    else\n        e.code=0\n\tend\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n\nfunction removetask()\n\tlocal e = {}\n\tlocal name = luci.http.formvalue('name')\n\te.code=nixio.fs.remove('/etc/supervisord/program/' .. name .. '.ini')\n    if e.code then\n        luci.sys.call(\"supervisord ctl reload\")\n        e.code=1\n    else\n        e.code=0\n\tend\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n\nfunction addtask()\n\tlocal e = {}\n\tlocal name = luci.http.formvalue('name')\n\tif nixio.fs.access('/etc/supervisord/program/' .. name .. '.ini') then\n    \te.code=2\n    \tluci.http.prepare_content(\"application/json\")\n    \tluci.http.write_json(e)\n    \treturn\n\tend\n\tfile=nixio.fs.readfile(\"/etc/supervisord/program/templates\")\n\tfile=file:gsub(\"demo\", name)\n\te.code=nixio.fs.writefile('/etc/supervisord/program/' .. name .. '.ini', file)\n    if e.code then\n        luci.sys.call(\"supervisord ctl reload\")\n        e.code=1\n        e.data=file\n    else\n        e.code=0\n\tend\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n\nfunction savetask()\n\tlocal e = {}\n\tlocal name = luci.http.formvalue('name')\n\tlocal data = luci.http.formvalue('data')\n\tdata = data:gsub(\"\\r\\n?\", \"\\n\")\n\tfile = '/etc/supervisord/program/' .. name .. '.ini'\n\te.code=nixio.fs.writefile (file, data)\n    if e.code then\n        sysupgrade=nixio.fs.readfile(\"/etc/sysupgrade.conf\")\n        if not sysupgrade:find(file) then\n            sysupgrade=sysupgrade .. '\\n' .. file\n        end\n        backupfile=data:match(\"backupfile=([%a%d%p]+)\")\n        backupfile=Split(backupfile, \"||\")\n        for k, v in ipairs(backupfile) do      \n            if not sysupgrade:find(v:gsub(\"%p\", \"%%%1\")) then\n                sysupgrade=sysupgrade .. '\\n' .. v\n            end\n        end\n        nixio.fs.writefile (\"/etc/sysupgrade.conf\", sysupgrade)\n        luci.sys.call(\"supervisord ctl reload\")\n        e.code=1\n    else\n        e.code=0\n\tend\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n\nfunction getlog()\n\tlocal e = {}\n\tlocal name = luci.http.formvalue('name')\n\tif name==\"main\" then\n    \tlocal data = nixio.fs.readfile ('/etc/supervisord/supervisord.conf')\n    \tdata = string.match(data, \"logfile=([%a%d%p]+)\")\n    \te.data=nixio.fs.readfile (data)\n\telse\n    \tlocal data = nixio.fs.readfile ('/etc/supervisord/program/' .. name .. '.ini')\n    \tdata = string.match(data, \"stdout_logfile=([%a%d%p]+)\")\n    \te.data=nixio.fs.readfile (data)\n\tend\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend"
  },
  {
    "path": "luci-app-supervisord/luasrc/model/cbi/supervisord.lua",
    "content": "local fs = require \"nixio.fs\"\nlocal sys = require \"luci.sys\"\n\nlocal m = Map(\"supervisord\",translate(\"Supervisord\"), translate(\"A golang development process management\") .. [[<br /><br /><a href=\"https://github.com/sundaqiang/openwrt-packages\" target=\"_blank\"></a>]])\nm:section(SimpleSection).template  = \"supervisord/index\"\n\ns = m:section(TypedSection, \"supervisord\")\ns.addremove = false\ns.anonymous = true\ns:tab(\"general\", translate(\"General Settings\"))\ns:tab(\"advanced\", translate(\"Configuration File\"))\ns:tab(\"list\", translate(\"Task List\"))\ns:tab(\"log\", translate(\"Log List\"))\n\nf = s:taboption(\"general\", Flag, \"enabled\", translate(\"Enabled\"))\nf.rmempty = false\nv = s:taboption(\"general\", Value, \"filepath\", translate(\"File Path\"))\nv.rmempty = false\nv = s:taboption(\"general\", Flag, \"usechinamirror\", translate(\"Use China Mirror\"))\nv.rmempty = false\nb = s:taboption(\"general\", Button, \"\")\nb.template = \"supervisord/version\"\n\nfile=s:taboption(\"advanced\", TextValue, \"\")\nfile.template = \"cbi/tvalue\"\nfile.rows = 15\nfile.wrap = \"off\"\nfile.rmempty = false\n\nl=s:taboption(\"list\", DummyValue, \"\")\nl.template = \"supervisord/list\"\nl.list={}\nindex=1\nfor filelist in fs.dir(\"/etc/supervisord/program\") do\n    if filelist:find(\".ini$\") ~= nil then\n        name=fs.readfile(\"/etc/supervisord/program/\" .. filelist)\n        l.list[index]={}\n        l.list[index][1]=name:match(\"program:(%a+)\")\n        l.list[index][2]=\"/etc/supervisord/program/\" .. filelist\n        local cmd=name:match(\"directory=([%a%d%p ]+)\") .. \"/\" .. name:match(\"getversions=([%a%d%p ]+)\")\n        l.list[index][3]=sys.exec(cmd)\n        index=index+1\n    end\nend\n\ng=s:taboption(\"log\", DummyValue, \"\")\ng.template = \"supervisord/log\"\ng.list=l.list\n\nfunction s.create(self,section)\n    return TypedSection.create(self,section)\nend\nfunction s.remove(self,section)\n    return TypedSection.remove(self,section)\nend\nfunction sync_value_to_file(self, section, value, file)\n\tvalue = value:gsub(\"\\r\\n?\", \"\\n\")\n\tlocal old_value = fs.readfile(file)\n\tif value ~= old_value then\n\t\tfs.writefile(file, value)\n\t\tself.map:set(section, \"amend\", \"1\")\n\tend\nend\nfunction file.cfgvalue(self,section)\n\treturn fs.readfile(\"/etc/supervisord/supervisord.conf\") or \"\"\nend\nfunction file.write(self, section, value)\n\tsync_value_to_file(self, section, value, \"/etc/supervisord/supervisord.conf\")\nend\nreturn m"
  },
  {
    "path": "luci-app-supervisord/luasrc/view/supervisord/index.htm",
    "content": "<script type=\"text/javascript\">\nXHR.poll(3, '<%=url([[admin]], [[services]], [[supervisord]], [[status]])%>', null,\n\tfunction(x, data) {\n\t\tvar tb = document.getElementById('status');\n\t\tif (data && tb) {\n\t\t\tif (data.running) {\n\t\t\t\tvar links = '<em><b><font color=green>Supervisord <%:RUNNING%></font></b></em>';\n\t\t\t\ttb.innerHTML = links;\n\t\t\t} else {\n\t\t\t\ttb.innerHTML = '<em><b><font color=red>Supervisord <%:NOT RUNNING%></font></b></em>';\n\t\t\t}\n\t\t}\n\t}\n);\n</script>\n<style></style>\n<fieldset class=\"cbi-section\">\n\t<p id=\"status\">\n\t\t<em><%:Collecting data...%></em>\n\t</p>\n</fieldset>"
  },
  {
    "path": "luci-app-supervisord/luasrc/view/supervisord/list.htm",
    "content": "<%local fs = require \"nixio.fs\"%>\n<%+cbi/valueheader%>\n<div class=\"cbi-section-node\">\n  <table class=\"cbi-section-table\" id=\"task-list\">\n    <tbody>\n    <tr class=\"cbi-section-table-titles\">\n      <th class=\"cbi-section-table-cell\" style=\"width:120px!important\"><%:Name%></th>\n      <th class=\"cbi-section-table-cell\" style=\"width:120px!important\"><%:Versions%></th>\n      <th class=\"cbi-section-table-cell\" style=\"width:100px!important\"><%:Status%></th>\n      <th class=\"cbi-section-table-cell\" style=\"width:300px!important\"><%:Description%></th>\n      <th class=\"cbi-section-table-cell\"><%:Configuration File%></th>\n      <th class=\"cbi-section-table-cell\" style=\"width:355px!important\"><%:Action%></th>\n    </tr>\n    <% for _,item in pairs(self.list) do %>\n    <tr class=\"cbi-section-table-row\" id=\"<%=item[2]:gsub('/etc/supervisord/program/', \"\"):gsub('.ini', \"\")%>-main\">\n    <td class=\"cbi-value-field\">\n      <%=item[1]%>\n    </td>\n    <td class=\"cbi-value-field\">\n      <%=item[3]%>\n    </td>\n    <td class=\"cbi-value-field\" id=\"<%=item[1]%>-status\">\n    </td>\n    <td class=\"cbi-value-field\" id=\"<%=item[1]%>-description\">\n    </td>\n    <td class=\"cbi-value-field\">\n      <textarea class=\"cbi-input-textarea\" id=\"<%=item[1]%>-text\" rows=\"15\" wrap=\"off\"><%=fs.readfile(item[2])%></textarea>\n    </td>\n    <td class=\"cbi-value-field\">\n      <input class=\"cbi-button cbi-input-apply\" style=\"font-size: 100%;background-color: green!important;\" type=\"button\" id=\"<%=item[1]%>-start\" disabled\n             onclick=\"actions('starttask','<%=item[1]%>')\" value=\"<%:Start%>\" size=\"0\">\n      <input class=\"cbi-button cbi-input-remove\" style=\"font-size: 100%;background-color: #333333!important;\" type=\"button\" id=\"<%=item[1]%>-stop\" disabled\n             onclick=\"actions('stoptask','<%=item[1]%>')\" value=\"<%:Stop%>\" size=\"0\">\n      <input class=\"cbi-button cbi-input-apply\" style=\"font-size: 100%;\" type=\"button\"\n             onclick=\"actions('restarttask','<%=item[1]%>')\" value=\"<%:Reboot%>\" size=\"0\">\n      <input class=\"cbi-button cbi-input-remove\" style=\"font-size: 100%;\" type=\"button\"\n             onclick=\"actions('savetask','<%=item[2]:gsub('/etc/supervisord/program/', ''):gsub('.ini', '')%>')\" value=\"<%:Save%>\" size=\"0\">\n      <input class=\"cbi-button cbi-button-remove\" style=\"font-size: 100%;\" type=\"button\"\n             onclick=\"actions('removetask','<%=item[2]:gsub('/etc/supervisord/program/', ''):gsub('.ini', '')%>')\" value=\"<%:Delete%>\" size=\"0\">\n    </td>\n    </tr>\n    <% end %>\n    </tbody>\n  </table>\n  <div class=\"cbi-section-create\">\n    <input type=\"text\" class=\"cbi-section-create-name\" id=\"addtext\" value=\"\" maxlength=\"20\" size=\"0\">\n    <input class=\"cbi-button cbi-button-add\" onclick=\"addtask()\" type=\"button\" value=\"<%:Add%>\" size=\"0\">\n  </div>\n</div>\n<script type=\"text/javascript\">\n<% for _,item in pairs(self.list) do -%>\nXHR.poll(5, '<%=url([[admin]], [[services]], [[supervisord]], [[gettask]])%>', {name: '<%=item[1]%>'},\n\tfunction(x, data) {\n\t\tconst st = document.getElementById('<%=item[1]%>-status');\n\t\tconst des = document.getElementById('<%=item[1]%>-description');\n\t\tif (data) {\n\t\t    st.innerHTML = data.status;\n\t\t    if (data.status == \"Exited\" || data.status == \"Backoff\"){\n\t\t        st.style.color=\"red\"\n\t\t        document.getElementById('<%=item[1]%>-start').disabled = false;\n\t\t        document.getElementById('<%=item[1]%>-stop').disabled = true;\n\t\t    }else{\n\t\t        \n\t\t        st.style.color=\"green\"\n\t\t        document.getElementById('<%=item[1]%>-start').disabled = true;\n\t\t        document.getElementById('<%=item[1]%>-stop').disabled = false;\n\t\t    }\n\t\t    des.innerHTML = data.description;\n\t\t}\n\t}\n)\n<% end %>\n\nfunction addtask(){\n    const name = document.getElementById(\"addtext\").value\n    const isletter = /^[a-zA-Z]+$/.test(name);\n    if (!isletter) {\n        alert(\"<%:Only letters can be used for names!%>\")\n        return\n    }\n    if (name.length > 20) {\n        alert(\"<%:Cannot exceed 20 characters!%>\")\n        return\n    }\n    XHR.get('<%=url([[admin]], [[services]], [[supervisord]], [[addtask]])%>', {name: name},\n    \tfunction(x, data) {\n    \t    if (data.code == 0) {\n    \t\t    alert(\"<%:Creation failed. Please try again!%>\")\n                return\n    \t    }else if (data.code == 1){\n                const currentRows = document.getElementById(\"task-list\").rows.length; \n                const insertTr = document.getElementById(\"task-list\").insertRow(currentRows);\n                insertTr.className = 'cbi-section-table-row';\n                insertTr.id = name + '-main';\n                insertTr.innerHTML = \"<td class='cbi-value-field'>\"+name+\"</td><td class='cbi-value-field' id='\"+name+\"-status'></td><td class='cbi-value-field' id='\"+name+\"-description'></td><td class='cbi-value-field'><textarea class='cbi-input-textarea' id='\"+name+\"-text' rows='15' wrap='off'>\"+data.data+\"</textarea></td><td class='cbi-value-field'><input class='cbi-button cbi-input-apply' style='font-size: 100%;background-color: green!important;' type='button' id='\"+name+\"-start' disabled onclick='actions(&quot;starttask&quot;,&quot;\"+name+\"&quot;)' value='<%:Start%>' size='0'><input class='cbi-button cbi-input-remove' style='font-size: 100%;background-color: #333333!important;' type='button' id='\"+name+\"-stop' disabled onclick='actions(&quot;stoptask&quot;,&quot;\"+name+\"&quot;)' value='<%:Stop%>' size='0'><input class='cbi-button cbi-input-apply' style='font-size: 100%;' type='button' onclick='actions(&quot;restarttask&quot;,&quot;\"+name+\"&quot;)' value='<%:Reboot%>' size='0'><input class='cbi-button cbi-input-remove' style='font-size: 100%;' type='button' onclick='actions(&quot;savetask&quot;,&quot;\"+name+\"&quot;)' value='<%:Save%>' size='0'><input class='cbi-button cbi-button-remove' style='font-size: 100%;' type='button' onclick='actions(&quot;removetask&quot;,&quot;\"+name+\"&quot;)' value='<%:Delete%>' size='0'></td>\";\n                document.getElementById(\"addtext\").value=\"\";\n                XHR.poll(5, '<%=url([[admin]], [[services]], [[supervisord]], [[gettask]])%>', {name: name},\n                \tfunction(x, data) {\n                \t\tconst st = document.getElementById(name + '-status');\n                \t\tconst des = document.getElementById(name + '-description');\n                \t\tif (data) {\n                \t\t    st.innerHTML = data.status;\n                \t\t    if (data.status == \"Exited\" || data.status == \"Backoff\"){\n                \t\t        st.style.color=\"red\"\n                \t\t        document.getElementById(name + '-start').disabled = false;\n                \t\t        document.getElementById(name + '-stop').disabled = true;\n                \t\t    }else{\n                \t\t        st.style.color=\"green\"\n                \t\t        document.getElementById(name + '-start').disabled = true;\n                \t\t        document.getElementById(name + '-stop').disabled = false;\n                \t\t    }\n                \t\t    des.innerHTML = data.description;\n                \t\t}\n                \t}\n                )\n    \t    }else if (data.code == 2){\n    \t\t    alert(\"<%:A task with this name already exists!%>\")\n                return\n    \t    }\n    \t}\n    )\n}\n\n\nfunction actions(mode,name){\n    if (mode==\"savetask\"){\n        const x = new XHR()\n        x.post('<%=url([[admin]], [[services]], [[supervisord]], [[savetask]])%>', {name: name, data: $('#' + name + '-text').val()},\n        \tfunction(x) {\n        \t\tif (JSON.parse(x.response).code) {\n                    alert(\"<%:Save success!%>\")\n        \t\t}else{\n        \t\t    alert(\"<%:Save failed!%>\")\n        \t\t}\n        \t}\n        )\n    }else{\n        if (mode==\"removetask\") {\n            const ret=confirm(\"<%:Are you sure you want to delete this task?%>\")\n            if (!ret) return\n        }\n        XHR.get('<%=url([[admin]], [[services]], [[supervisord]], [[mode]])%>'.replace(\"mode\",mode), {name: name},\n        \tfunction(x, data) {\n        \t\tif (data.code) {\n        \t\t    if (mode == \"starttask\"){\n        \t\t    \tdocument.getElementById(name + '-start').disabled = true;\n        \t\t        document.getElementById(name + '-stop').disabled = false;\n        \t\t    }\n        \t\t    if (mode == \"stoptask\"){\n                        document.getElementById(name + '-start').disabled = false;\n                        document.getElementById(name + '-stop').disabled = true;\n        \t\t    }\n        \t\t    if (mode == \"removetask\"){\n                        document.getElementById(name + '-main').remove();\n    \n        \t\t    }\n        \t\t}\n        \t}\n        )\n    }\n}\n</script>\n<%+cbi/valuefooter%>"
  },
  {
    "path": "luci-app-supervisord/luasrc/view/supervisord/log.htm",
    "content": "<%local fs = require \"nixio.fs\"%>\n<%+cbi/valueheader%>\n<div class=\"cbi-value\">\n    <label class=\"cbi-value-title\">\n        <p style=\"color: red\">日记列表</p>\n    </label>\n    <div class=\"cbi-value-field\">\n        <select class=\"cbi-input-select\" size=\"1\">\n            <option value=\"main\">supervisord</option>\n            <% for _,item in pairs(self.list) do %>\n            <option value=\"<%=item[2]:gsub('/etc/supervisord/program/', ''):gsub('.ini', '')%>\">\n                <%=item[2]:gsub('/etc/supervisord/program/', ''):gsub('.ini', '')%>\n            </option>\n            <% end %>\n        </select>\n    </div>\n</div>\n<textarea class=\"cbi-input-textarea\" id=\"log-text\" rows=\"30\" wrap=\"off\" readonly></textarea>\n<script type=\"text/javascript\">\n    getlog('main')\n    $(\".cbi-input-select\").change(function (e) {\n        getlog($(this).val())\n    });\n\n    function getlog(name) {\n        XHR.get('<%=url([[admin]], [[services]], [[supervisord]], [[getlog]])%>', {name: name},\n            function (x, data) {\n                if (data.data) {\n                    document.getElementById(\"log-text\").value = data.data;\n                }\n            }\n        )\n    }\n</script>\n<%+cbi/valuefooter%>"
  },
  {
    "path": "luci-app-supervisord/luasrc/view/supervisord/version.htm",
    "content": "<%+cbi/valueheader%>\n<label class=\"cbi-value-title\"><%= translate(\"Update the core\") %></label>\n<div class=\"cbi-value-field\">\n    <input class=\"btn cbi-button cbi-button-reload\" id=\"update\" type=\"button\" size=\"0\" onclick=\"check_version()\" value=\"<%:Collecting data...%>\" />\n    <div class=\"cbi-value-description\">\n\t<span class=\"cbi-value-helpicon\"><img src=\"/luci-static/resources/cbi/help.gif\" alt=\"帮助\"></span>\n\t<%:If repeated failures occur, you can download the binaries for the corresponding schemas at the following url.%>\n\t</br>&nbsp;&nbsp;&nbsp;&nbsp;\n\t<%:https://github.com/ochinchina/supervisord/releases%>\n\t</br>&nbsp;&nbsp;&nbsp;&nbsp;\n\t<%:Unpack the package and place it in the top path.%>\n\t</br>&nbsp;&nbsp;&nbsp;&nbsp;\n\t<%:The author binary version number may not have changed.%>\n\t</br>&nbsp;&nbsp;&nbsp;&nbsp;\n\t<%:If you successfully update, the refresh page is still lower than the latest version.%>\n\t</br>&nbsp;&nbsp;&nbsp;&nbsp;\n\t<%:This is normal.%>\n\t</div>\n</div>\n<script type=\"text/javascript\">\nfunction getver() {\n    XHR.get('<%=url([[admin]], [[services]], [[supervisord]], [[getver]])%>', null,\n    \tfunction(x, data) {\n            const tb = document.getElementById('update');\n            if (data && tb) {\n                if (data.newver) {\n                    tb.value = '<%:Local version is %>' + data.nowver + '<%:, New version is %>' + data.newver;\n                    tb.setAttribute('newver', data.newver); \n                }else{\n                    tb.value = '<%:The check failed. Please try again%>';\n                }\n            }\n        }\n    );\n}\ngetver()\nfunction check_version() {\n    const tb = document.getElementById('update');\n    const newver= tb.getAttribute(\"newver\")\n    if (newver){\n        tb.disabled = true;\n        XHR.get('<%=url([[admin]], [[services]], [[supervisord]], [[update]])%>', {version: newver}, (x, r) => {\n            if (r.error == 0) {\n                tb.disabled = false;\n                tb.value = '<%:Local version is %>' + newver + '<%:, New version is %>' + newver;\n            } else {\n                tb.disabled = false;\n                tb.value = '<%:The update failed. Please try again%>';\n            }\n        });\n    }else{\n        getver()\n    }\n}\n</script>\n<%+cbi/valuefooter%>"
  },
  {
    "path": "luci-app-supervisord/po/zh_Hans/supervisord.po",
    "content": "msgid \"Supervisord\"\nmsgstr \"进程管理器\"\n\nmsgid \"A golang development process management\"\nmsgstr \"一款golang开发的进程管理\"\n\nmsgid \"General Settings\"\nmsgstr \"基础设置\"\n\nmsgid \"Configuration File\"\nmsgstr \"配置文件\"\n\nmsgid \"Task List\"\nmsgstr \"任务列表\"\n\nmsgid \"Log List\"\nmsgstr \"日志列表\"\n\nmsgid \"Enabled\"\nmsgstr \"启用\"\n\nmsgid \"File Path\"\nmsgstr \"文件路径\"\n\nmsgid \"Use China Mirror\"\nmsgstr \"使用中国镜像\"\n\nmsgid \"Update the core\"\nmsgstr \"更新核心\"\n\nmsgid \"If repeated failures occur, you can download the binaries for the corresponding schemas at the following url.\"\nmsgstr \"如果重复失败，您可以从以下url下载对应模式的二进制文件。\"\n\nmsgid \"Unpack the package and place it in the top path.\"\nmsgstr \"解压后并将其放置在上方设置的路径中。\"\n\nmsgid \"The author binary version number may not have changed.\"\nmsgstr \"作者二进制版本号可能没有改变。\"\n\nmsgid \"If you successfully update, the refresh page is still lower than the latest version.\"\nmsgstr \"如果更新成功，刷新页面仍然低于最新版本。\"\n\nmsgid \"This is normal.\"\nmsgstr \"这是正常的。\"\n\nmsgid \"Local version is\"\nmsgstr \"本地版本是\"\n\nmsgid \", New version is\"\nmsgstr \"，最新版本是\"\n\nmsgid \"The check failed. Please try again\"\nmsgstr \"检查失败。请再试一次\"\n\nmsgid \"The update failed. Please try again\"\nmsgstr \"更新失败。请再试一次\"\n\nmsgid \"Versions\"\nmsgstr \"版本\"\n\nmsgid \"Only letters can be used for names!\"\nmsgstr \"只有字母可以用来命名！\"\n\nmsgid \"Cannot exceed 20 characters!\"\nmsgstr \"不能超过20个字符！\"\n\nmsgid \"Creation failed. Please try again!\"\nmsgstr \"创建失败了。请再试一次！\"\n\nmsgid \"A task with this name already exists!\"\nmsgstr \"已经存在此名称的任务！\"\n\nmsgid \"Save success!\"\nmsgstr \"保存成功！\"\n\nmsgid \"Save failed!\"\nmsgstr \"保存失败！\"\n\nmsgid \"Are you sure you want to delete this task?\"\nmsgstr \"您确定要删除该任务吗？\""
  },
  {
    "path": "luci-app-supervisord/root/etc/config/supervisord",
    "content": "\nconfig supervisord 'main'\n\toption filepath '/usr/bin/supervisord'\n\toption enabled '1'\n\toption amend '0'\n\n"
  },
  {
    "path": "luci-app-supervisord/root/etc/init.d/supervisord",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2015 OpenWrt.org\n\nSTART=90\n\nget_config() {\n\tconfig_get_bool enabled $1 enabled 0\n\tconfig_get_bool amend $1 amend 0\n\tconfig_get filepath $1 filepath /usr/bin/supervisord\n}\n\nstart() {\n\tconfig_load supervisord\n\tconfig_foreach get_config supervisord\n\t[ $enabled -eq 0 ] && exit 0\n\t$filepath -c /etc/supervisord/supervisord.conf -d\n}\n\nstop() {\n\tconfig_load supervisord\n\tconfig_foreach get_config supervisord\n\t$filepath ctl shutdown\n}\n\nreload() {\n    config_load supervisord\n\tconfig_foreach get_config supervisord\n\t[ $enabled -eq 0 ] && logger -t supervisord disabled to stop && stop && exit 0\n    status=$(ps | grep supervisord | grep -v grep | grep -v luci | grep -v init | grep -v version | wc -l)\n    [ $status -eq 0 ] && logger -t supervisord unstarted to start && start && exit 0\n    if [ $amend -eq 1 ]; then\n        logger -t supervisord amend to restart\n        stop\n        sleep 1\n        uci set supervisord.main.amend=0\n        uci commit supervisord\n        start\n    else\n        logger -t supervisord fixed to reload\n        $filepath ctl reload\n    fi\n}\n"
  },
  {
    "path": "luci-app-supervisord/root/etc/supervisord/program/templates",
    "content": ";更多参数查看https://github.com/ochinchina/supervisord/\n\n;程序名称，没事别乱改\n[program:demo]\n\n;程序启动命令，必须\n;command=xxxxx\ncommand=\n\n;执行命令的路径，必须\n;directory=/usr/bin\ndirectory=\n\n;需要备份文件的完整路径，多个文件以||分割，必须\n;backupfile=/usr/bin/xxxxx||/etc/yyyyy\nbackupfile=\n\n;获取版本号命令，必须\n;getversions=xxxxx version\ngetversions=\n\n;在supervisord启动的时候也自动启动\nautostart=true\n\n;启动10秒后没有异常退出，就表示进程正常启动了，默认为1秒\nstartsecs=10\n\n;程序退出后自动重启,可选值：[unexpected,true,false]\n;默认为unexpected，表示进程意外杀死后才重启\nautorestart=true\n\n;启动失败自动重试次数，默认是3\nstartretries=3\n\n;用哪个用户启动进程，默认是root\nuser=root\n\n;进程启动优先级，默认999，值小的优先启动\npriority=999\n\n;把stderr重定向到stdout，默认false\nredirect_stderr=true\n\n;stdout日志文件大小，默认1MB\nstdout_logfile_maxbytes=1MB\n\n;stdout日志文件备份数，默认是10\nstdout_logfile_backups=10\n\n;stdout日志文件，需要注意当指定目录不存在时无法正常启动，所以需手动创建目录\nstdout_logfile=/var/log/demo.log\n\n;日志的级别\nloglevel=info\n\n;默认为false,进程被杀死时，是否向这个进程组发送stop信号，包括子进程\nstopasgroup=false\n\n;默认为false，向进程组发送kill信号，包括子进程\nkillasgroup=false\n"
  },
  {
    "path": "luci-app-supervisord/root/etc/supervisord/supervisord.conf",
    "content": ";更多参数查看https://github.com/ochinchina/supervisord/\n[supervisord]\n\n;主日志文件;默认路径是$CWD/supervisord.log\nlogfile=/var/log/supervisord.log\n\n;最大主日志文件尺寸;默认3MB\nlogfile_maxbytes=3MB\n\n;主日志文件备份的数量;默认10\nlogfile_backups=10\n\n;日志等级;默认info;其他:debug,warn,trace\nloglevel=debug\n\n;supervisord的pid文件;默认supervisord.pid\npidfile=/var/run/supervisord.pid\n\n;如果为true，从前台开始;默认false\nnodaemon=false\n\n;最小效用启动文件描述符;默认1024\nminfds=1024\n\n;最小效用过程描述符;默认200\nminprocs=200\n\n;启用web界面，默认仅本地访问且不设置密码\n[inet_http_server]\nport=127.0.0.1:9001\n;username=admin\n;password=admin\n\n;启用命令行操作任务，需启用web界面且未设置密码\n[supervisorctl]\nserverurl=http://127.0.0.1:9001\n\n;加载任务配置文件\n[include]\nfiles = /etc/supervisord/program/*.ini"
  },
  {
    "path": "luci-app-supervisord/root/etc/uci-defaults/luci-supervisord",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@supervisord[-1]\n\tadd ucitrack supervisord\n\tset ucitrack.@supervisord[-1].init=supervisord\n\tcommit ucitrack\nEOF\n\nrm -f /tmp/luci-indexcache\nexit 0\n"
  },
  {
    "path": "luci-app-syncthing/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for syncthing\nLUCI_DEPENDS:=+syncthing\nLUCI_PKGARCH:=all\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n\n"
  },
  {
    "path": "luci-app-syncthing/luasrc/controller/syncthing.lua",
    "content": "\nmodule(\"luci.controller.syncthing\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/syncthing\") then\n\t\treturn\n\tend\n\t\n\tlocal page = entry({\"admin\", \"nas\", \"syncthing\"}, cbi(\"syncthing\"), _(\"Syncthing\"))\n\tpage.order = 10\n\tpage.dependent = true\n\tpage.acl_depends = { \"luci-app-syncthing\" }\n\tentry({\"admin\",\"nas\",\"syncthing\",\"status\"},call(\"act_status\")).leaf=true\nend\n\nfunction act_status()\n  local e={}\n  e.running=luci.sys.call(\"pgrep syncthing >/dev/null\")==0\n  luci.http.prepare_content(\"application/json\")\n  luci.http.write_json(e)\nend\n"
  },
  {
    "path": "luci-app-syncthing/luasrc/model/cbi/syncthing.lua",
    "content": "-- Copyright 2008 Yanira <forum-2008@email.de>\n-- Licensed to the public under the Apache License 2.0.\n\nrequire(\"nixio.fs\")\n\nm = Map(\"syncthing\", translate(\"Syncthing Synchronization Tool\"))\n\nm:section(SimpleSection).template  = \"syncthing/syncthing_status\"\n\ns = m:section(TypedSection, \"syncthing\")\ns.addremove = false\ns.anonymous = true\n\no = s:option(Flag, \"enabled\", translate(\"Enabled\"))\no.default = 0\no.rmempty = false\n\ngui_address = s:option(Value, \"gui_address\", translate(\"GUI access address\"))\ngui_address.description = translate(\"Use 0.0.0.0:8384 to monitor all access.\")\ngui_address.default = \"http://0.0.0.0:8384\"\ngui_address.placeholder = \"http://0.0.0.0:8384\"\ngui_address.rmempty = false\n\nhome = s:option(Value, \"home\", translate(\"Configuration file directory\"))\nhome.description = translate(\"Only the configuration saved in /etc/syncthing will be automatically backed up!\")\nhome.default = \"/etc/syncthing\"\nhome.placeholder = \"/etc/syncthing\"\nhome.rmempty = false\n\nuser = s:option(ListValue, \"user\", translate(\"User\"))\nuser.description = translate(\"The default is syncthing, but it may cause permission denied. Syncthing officially does not recommend running as root.\")\nuser:value(\"\", translate(\"syncthing\"))\nfor u in luci.util.execi(\"cat /etc/passwd | cut -d ':' -f1\") do\n\tuser:value(u)\nend\n\nmacprocs = s:option(Value, \"macprocs\", translate(\"Thread limit\"))\nmacprocs.description = translate(\"0 to match the number of CPUs (default), >0 to explicitly specify concurrency.\")\nmacprocs.default = \"0\"\nmacprocs.placeholder = \"0\"\nmacprocs.datatype=\"range(0,32)\"\nmacprocs.rmempty = false\n\nnice = s:option(Value, \"nice\", \"Nice\")\nnice.description = translate(\"Explicitly specify nice. 0 is the highest and 19 is the lowest. (negative values are not allowed to be set temporarily)\")\nnice.default = \"19\"\nnice.placeholder = \"19\"\nnice.datatype=\"range(0,19)\"\nnice.rmempty = false\n\n\nreturn m\n"
  },
  {
    "path": "luci-app-syncthing/luasrc/view/syncthing/syncthing_status.htm",
    "content": "<script type=\"text/javascript\">//<![CDATA[\n\tXHR.poll(1, '<%=url([[admin]], [[nas]], [[syncthing]], [[status]])%>', null,\n\t\tfunction (x, data) {\n\t\t\tvar tb = document.getElementById('syncthing_status');\n\t\t\tif (data && tb) {\n\t\t\t\tif (data.running) {\n\t\t\t\t\tvar links = '<em><b><font color=\"green\">Syncthing <%:RUNNING%></font></b></em><input class=\"btn cbi-button mar-10\" type=\"button\" value=\"<%:Open Syncthing page%>\" onclick=\"openwebui();\" />';\n\t\t\t\t\ttb.innerHTML = links;\n\t\t\t\t} else {\n\t\t\t\t\ttb.innerHTML = '<em><b><font color=\"red\">Syncthing <%:NOT RUNNING%></font></b></em>';\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t);\n\nfunction openwebui(){\n\tvar url = window.location.host+\":<%=luci.sys.exec(\"uci -q get syncthing.syncthing.gui_address\"):match(\":[0-9]+\"):gsub(\":\", \"\")%>\";\n\twindow.open('http://'+url,'target','');\n}\n//]]>\n</script>\n<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>\n<fieldset class=\"cbi-section\">\n\t<p id=\"syncthing_status\">\n\t\t<em><%:Collecting data...%></em>\n\t</p>\n</fieldset>\n"
  },
  {
    "path": "luci-app-syncthing/po/zh_Hans/syncthing.po",
    "content": "msgid \"Syncthing\"\nmsgstr \"Syncthing\"\n\nmsgid \"Syncthing Synchronization Tool\"\nmsgstr \"Syncthing 存储同步工具\"\n\nmsgid \"Open Syncthing page\"\nmsgstr \"打开储存同步页面\"\n\nmsgid \"GUI access address\"\nmsgstr \"GUI访问地址\"\n\nmsgid \"Use 0.0.0.0:8384 to monitor all access.\"\nmsgstr \"使用0.0.0.0:8384监听所有访问。\"\n\nmsgid \"Configuration file directory\"\nmsgstr \"配置文件存储目录\"\n\nmsgid \"Only the configuration saved in /etc/syncthing will be automatically backed up!\"\nmsgstr \"只有保存在 /etc/syncthing 的配置会被自动备份！\"\n\nmsgid \"User\"\nmsgstr \"用户\"\n\nmsgid \"The default is syncthing, but it may cause permission denied. Syncthing officially does not recommend running as root.\"\nmsgstr \"默认为syncthing，但可能引起权限不足问题。Syncthing官方不建议以root身份运行。\"\n\nmsgid \"Thread limit\"\nmsgstr \"线程限制\"\n\nmsgid \"0 to match the number of CPUs (default), >0 to explicitly specify concurrency.\"\nmsgstr \"使用0来匹配CPU核心数，或输入大于0的数来显式指定并发数。\"\n\nmsgid \"Explicitly specify nice. 0 is the highest and 19 is the lowest. (negative values are not allowed to be set temporarily)\"\nmsgstr \"显式指定进程Nice值。其中0最高，19最低。（暂不允许设置负值）\"\n"
  },
  {
    "path": "luci-app-syncthing/root/etc/uci-defaults/luci-syncthing",
    "content": "#!/bin/sh\ntouch /etc/config/syncthing\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@syncthing[-1]\n\tadd ucitrack syncthing\n\tset ucitrack.@syncthing[-1].exec='/etc/init.d/syncthing restart'\n\tcommit ucitrack\nEOF\n# remove LuCI cache\nrm -f /tmp/luci*\nexit 0\n"
  },
  {
    "path": "luci-app-syncthing/root/usr/share/rpcd/acl.d/luci-app-syncthing.json",
    "content": "{\n\t\"luci-app-syncthing\": {\n\t\t\"description\": \"Grant UCI access for luci-app-syncthing\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"syncthing\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"syncthing\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-taskplan/Makefile",
    "content": "#\n# Copyright 2019-2026 sirpdboy \n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-taskplan\nPKG_VERSION:=3.0.0\nPKG_RELEASE:=20260303\n\n\nPKG_LICENSE:=GPL-2.0\nPKG_MAINTAINER:=sirpdboy\n\nLUCI_PKGARCH:=all\n\ndefine Package/luci-app-taskplan\n  SECTION:=luci\n  CATEGORY:=LuCI\n  SUBMENU:=3. Applications\n  TITLE:=LuCI Support for Task Plan\n  PKGARCH:=all\n  DEPENDS:=+rpcd +luci-base +bash\nendef\n\ndefine Package/luci-app-taskplan/description\n  Scheduled tasks and startup tasks management.\n  Includes restart, shutdown, network restart, memory release,\n  system cleaning, and custom scripts.\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/taskplan\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n\n"
  },
  {
    "path": "luci-app-taskplan/htdocs/luci-static/resources/view/taskplan/log.js",
    "content": "'use strict';\n'require view';\n'require ui';\n'require poll';\n'require fs';\n\nreturn view.extend({\n    load: function() {\n        return fs.read('/etc/taskplan/taskplan.log').catch(function(err) {\n            console.error('Failed to read log file:', err);\n            return '';\n        });\n    },\n\n    handleClearLog: function() {\n        var self = this;\n        return fs.write('/etc/taskplan/taskplan.log', '').then(function() {\n            ui.addNotification(null, E('p', {}, _('Log cleared')));\n            self.updateLogDisplay();\n        }).catch(function(err) {\n            ui.addNotification(null, E('p', { 'class': 'alert-message' }, _('Failed to clear log: ') + err.message));\n        });\n    },\n\n    handleReverseLog: function() {\n        this.reverse = !this.reverse;\n        this.updateLogDisplay();\n    },\n\n    handleDownloadLog: function() {\n        var self = this;\n        fs.read('/etc/taskplan/taskplan.log').then(function(content) {\n            if (content) {\n                var blob = new Blob([content], { type: 'text/plain' });\n                var url = URL.createObjectURL(blob);\n                var a = document.createElement('a');\n                a.href = url;\n                a.download = 'taskplan.log';\n                a.click();\n                URL.revokeObjectURL(url);\n            } else {\n                ui.addNotification(null, E('p', {}, _('Log is empty')));\n            }\n        });\n    },\n\n    updateLogDisplay: function() {\n        var self = this;\n        fs.read('/etc/taskplan/taskplan.log').then(function(content) {\n            var logArea = document.getElementById('log_content');\n            if (logArea) {\n                if (self.reverse) {\n                    logArea.value = content.split('\\n').reverse().join('\\n');\n                } else {\n                    logArea.value = content;\n                }\n                // 如果不是反向模式，自动滚动到底部\n                if (!self.reverse) {\n                    logArea.scrollTop = logArea.scrollHeight;\n                }\n            }\n        });\n    },\n\n    render: function(logContent) {\n        this.reverse = false;\n\n        return E('div', { 'class': 'view' }, [\n            E('div', { 'class': 'cbi-map' }, [\n                // 标题\n                E('h2', {}, _('Task Plan Log Viewer')),\n\n                E('div', { 'class': 'cbi-section', 'style': 'margin-bottom:10px;' }, [\n                    E('div', { 'class': 'cbi-section-actions' }, [\n                        E('button', {\n                            'class': 'btn cbi-button cbi-button-apply',\n                            'click': ui.createHandlerFn(this, 'handleClearLog')\n                        }, [ _('Clear Log') ]),\n                        ' ',\n                        E('button', {\n                            'class': 'btn cbi-button cbi-button-edit',\n                            'click': ui.createHandlerFn(this, 'handleReverseLog')\n                        }, [ _('Reverse Order') ])\n                    ])\n                ]),\n                \n                // 日志显示区域\n                E('div', { 'class': 'cbi-section' }, [\n                    E('textarea', {\n                        'id': 'log_content',\n                        'class': 'cbi-input-textarea',\n                        'style': 'width:100%; height:500px; font-family:monospace; font-size:12px; padding:10px; border-radius:4px;',\n                        'readonly': 'readonly',\n                        'wrap': 'off'\n                    }, logContent || '')\n                ])\n            ])\n        ]);\n    },\n\n    handle: function(ev) {\n        var self = this;\n        \n        poll.add(function() {\n            return fs.read('/etc/taskplan/taskplan.log').then(function(content) {\n                var logArea = document.getElementById('log_content');\n                if (logArea) {\n                    if (self.reverse) {\n                        logArea.value = content.split('\\n').reverse().join('\\n');\n                    } else {\n                        logArea.value = content;\n                        logArea.scrollTop = logArea.scrollHeight;\n                    }\n                }\n            });\n        }, 5);\n        \n        return this.render.apply(this, arguments);\n    }\n});\n"
  },
  {
    "path": "luci-app-taskplan/htdocs/luci-static/resources/view/taskplan/scheduled.js",
    "content": "'use strict';\n'require view';\n'require form';\n'require ui';\n'require uci';\n'require rpc';\n\nvar callExec = rpc.declare({\n    object: 'luci',\n    method: 'exec',\n    params: ['command'],\n    expect: { result: 0 }\n});\n\nreturn view.extend({\n    load: function() {\n        return uci.load('taskplan');\n    },\n\n    render: function(data) {\n        var m = new form.Map('taskplan', _('Scheduled Tasks'), \n            _('<b>The original [Timing Settings] includes scheduled task execution and startup task execution. Presets include over 10 functions, including restart, shutdown, network restart, memory release, system cleaning, network sharing, network shutdown, automatic detection of network disconnects and reconnection, MWAN3 load balancing detection of reconnection, and custom scripts</b></br>') +\n            _('N1-N5 is continuous, N1, N3, N5 is discontinuous, */N represents every N hours or every N minutes.The week can only be 0~6, the hour can only be 0~23, the minute can only be 0~59, the unavailable time is 48 hours.'));\n\n        var s = m.section(form.TypedSection, 'global');\n        s.anonymous = true;\n\n        var e = s.option(form.TextValue, 'customscript', _('Edit Custom Script'));\n        e.description = _('Shell commands for [Customscript] task type');\n        e.rows = 5;\n        e.default = '#!/bin/bash\\n# Add your commands here';\n        e.optional = false;\n\n        e = s.option(form.TextValue, 'customscript2', _('Edit Custom Script2'));\n        e.description = _('Shell commands for [Customscript2] task type');\n        e.rows = 5;\n        e.default = '#!/bin/bash\\n# Add your commands here';\n        e.optional = false;\n\n        var ss = m.section(form.TypedSection, 'stime', '');\n        ss.addremove = true;\n        ss.anonymous = true;\n        ss.sortable = true;\n        ss.template = 'cbi/tblsection';\n\n        var remarks = ss.option(form.Value, 'remarks', _('Remarks'));\n        remarks.optional = false;\n\n        var enable = ss.option(form.Flag, 'enable', _('Enable'));\n        enable.rmempty = false;\n        enable.default = 1;\n\n        var stype = ss.option(form.ListValue, 'stype', _('Scheduled Type'));\n        stype.value(1, _('Scheduled Reboot'));\n        stype.value(2, _('Scheduled Poweroff'));\n        stype.value(3, _('Scheduled ReNetwork'));\n        stype.value(4, _('Scheduled RestartSamba'));\n        stype.value(5, _('Scheduled Restartwan'));\n        stype.value(6, _('Scheduled Closewan'));\n        stype.value(7, _('Scheduled Clearmem'));\n        stype.value(8, _('Scheduled Sysfree'));\n        stype.value(9, _('Scheduled DisReconn'));\n        stype.value(10, _('Scheduled DisRereboot'));\n        stype.value(11, _('Scheduled Restartmwan3'));\n        stype.value(13, _('Scheduled Wifiup'));\n        stype.value(14, _('Scheduled Wifidown'));\n        stype.value(12, _('Scheduled Customscript'));\n        stype.value(15, _('Scheduled Customscript2'));\n        stype.default = 1;\n\n        var month = ss.option(form.Value, 'month', _('Month(0~11)'));\n        month.rmempty = false;\n        month.default = '*';\n        month.datatype = 'string';\n\n        var week = ss.option(form.Value, 'week', _('Week Day(0~6)'));\n        week.rmempty = true;\n        week.value('*', _('Everyday'));\n        week.value('0', _('Sunday'));\n        week.value('1', _('Monday'));\n        week.value('2', _('Tuesday'));\n        week.value('3', _('Wednesday'));\n        week.value('4', _('Thursday'));\n        week.value('5', _('Friday'));\n        week.value('6', _('Saturday'));\n        week.default = '*';\n        week.datatype = 'string';\n\n        var hour = ss.option(form.Value, 'hour', _('Hour(0~23)'));\n        hour.description = _('1-8 is the continuous time from 1-8 clock; 11,12,16 clock are discontinuous; */3 represents every 3 hours; * every hour.');\n        hour.rmempty = false;\n        hour.default = 0;\n        hour.datatype = 'string';\n\n        var minute = ss.option(form.Value, 'minute', _('Minute(0~59)'));\n        minute.description = _('1-30 is continuous 1-30 minutes; 7,8,9 minutes discontinuous ; */5 means every 5 minutes ; * every minutes.');\n        minute.rmempty = false;\n        minute.default = 0;\n        minute.datatype = 'string';\n\n        m.apply_on_parse = true;\n        m.on_after_apply = function() {\n            return callExec('/etc/init.d/taskplan start').then(function() {\n                ui.addNotification(null, E('p', {}, _('Tasks updated')));\n            });\n        };\n\n        return m.render();\n    }\n});\n"
  },
  {
    "path": "luci-app-taskplan/htdocs/luci-static/resources/view/taskplan/startup.js",
    "content": "'use strict';\n'require view';\n'require form';\n'require ui';\n'require uci';\n'require rpc';\n\nvar callExec = rpc.declare({\n    object: 'luci',\n    method: 'exec',\n    params: ['command'],\n    expect: { result: 0 }\n});\n\nreturn view.extend({\n    load: function() {\n        return uci.load('taskplan');\n    },\n\n    render: function(data) {\n        var m = new form.Map('taskplan', _('Startup Tasks'), \n            _('<b>The original [Timing Settings] includes scheduled task execution and startup task execution. Presets include over 10 functions, including restart, shutdown, network restart, memory release, system cleaning, network sharing, network shutdown, automatic detection of network disconnects and reconnection, MWAN3 load balancing detection of reconnection, and custom scripts</b></br>') +\n            _('The task to be executed upon startup, with a startup delay time unit of seconds.'));\n\n        var s = m.section(form.TypedSection, 'global');\n        s.anonymous = true;\n\n        var e = s.option(form.TextValue, 'customscript', _('Edit Custom Script'));\n        e.description = _('Shell commands for Customscript task type');\n        e.rows = 5;\n        e.default = '#!/bin/sh\\n# Add your commands here';\n        e.optional = false;\n\n        e = s.option(form.TextValue, 'customscript2', _('Edit Custom Script2'));\n        e.description = _('Shell commands for Customscript2 task type');\n        e.rows = 5;\n        e.default = '#!/bin/sh\\n# Add your commands here';\n        e.optional = false;\n\n        var ls = m.section(form.TypedSection, 'ltime', '');\n        ls.addremove = true;\n        ls.anonymous = true;\n        ls.sortable = true;\n        ls.template = 'cbi/tblsection';\n\n        var remarks = ls.option(form.Value, 'remarks', _('Remarks'));\n        remarks.optional = false;\n\n        var enable = ls.option(form.Flag, 'enable', _('Enable'));\n        enable.rmempty = false;\n        enable.default = 1;\n\n        var stype = ls.option(form.ListValue, 'stype', _('Startup Type'));\n        stype.description = _('Action to perform at system startup');\n        stype.value(1, _('Scheduled Reboot'));\n        stype.value(2, _('Scheduled Poweroff'));\n        stype.value(3, _('Scheduled ReNetwork'));\n        stype.value(4, _('Scheduled RestartSamba'));\n        stype.value(5, _('Scheduled Restartwan'));\n        stype.value(6, _('Scheduled Closewan'));\n        stype.value(7, _('Scheduled Clearmem'));\n        stype.value(8, _('Scheduled Sysfree'));\n        stype.value(9, _('Scheduled DisReconn'));\n        stype.value(10, _('Scheduled DisRereboot'));\n        stype.value(11, _('Scheduled Restartmwan3'));\n        stype.value(13, _('Scheduled Wifiup'));\n        stype.value(14, _('Scheduled Wifidown'));\n        stype.value(12, _('Scheduled Customscript'));\n        stype.value(15, _('Scheduled Customscript2'));\n        stype.default = 12;\n\n        var delay = ls.option(form.Value, 'delay', _('Delayed Start(seconds)'));\n        delay.description = _('Seconds to wait after boot before execution');\n        delay.datatype = 'uinteger';\n        delay.default = 10;\n        delay.optional = false;\n\n        m.apply_on_parse = true;\n        m.on_after_apply = function() {\n            return callExec('/etc/init.d/taskplan start').then(function() {\n                ui.addNotification(null, E('p', {}, _('Tasks updated')));\n            });\n        };\n\n        return m.render();\n    }\n});\n"
  },
  {
    "path": "luci-app-taskplan/po/zh_Hans/taskplan.po",
    "content": "# Translation file for taskplan.js\n# Copyright (C) 2022-2026 Sirpdboy <herboy2008@gmail.com>\n# Licensed to the public under the Apache License 2.0\n#\n\n\nmsgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: luci-app-taskplan\\n\"\n\"Language: zh_Hans\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\nmsgid \"Control\"\nmsgstr \"管控\"\n\nmsgid \"Task Plan\"\nmsgstr \"任务设置\"\n\nmsgid \"Scheduled Tasks\"\nmsgstr \"定时执行任务\"\n\nmsgid \"Startup Tasks\"\nmsgstr \"开机启动任务\"\n\nmsgid \"<b>The original [Timing Settings] includes scheduled task execution and startup task execution. Presets include over 10 functions, including restart, shutdown, network restart, memory release, system cleaning, network sharing, network shutdown, automatic detection of network disconnects and reconnection, MWAN3 load balancing detection of reconnection, and custom scripts</b></br>\"\nmsgstr \"<b>原【定时设置】包括定时任务执行和启动任务执行。预设了重启、关机、网络重启、释放内存、系统清理、网络共享、网络关闭、自动检测断网重连、MWAN3负载均衡检测重连、自定义脚本等10余种功能</b></br>\"\n\nmsgid \"N1-N5 is continuous, N1, N3, N5 is discontinuous, */N represents every N hours or every N minutes.The week can only be 0~6, the hour can only be 0~23, the minute can only be 0~59, the unavailable time is 48 hours.\"\nmsgstr \"N1-N5为连续，N1、N3、N5为不连续，*/N表示每N小时或每N分钟。星期只能0~6，小时只能0~23，分钟只能0~59，不可用时间为48小时。\"\n\nmsgid \"Edit Custom Script\"\nmsgstr \"编辑自定义脚本\"\n\nmsgid \"Shell commands for [Customscript] task type\"\nmsgstr \"【自定义脚本】任务类型的Shell命令\"\n\nmsgid \"Edit Custom Script2\"\nmsgstr \"编辑自定义脚本2\"\n\nmsgid \"Shell commands for [Customscript2] task type\"\nmsgstr \"【自定义脚本2】任务类型的Shell命令\"\n\n# scheduled.js - 任务列表\nmsgid \"Remarks\"\nmsgstr \"备注\"\n\nmsgid \"Task description\"\nmsgstr \"任务描述\"\n\nmsgid \"Enable\"\nmsgstr \"启用\"\n\nmsgid \"Scheduled Type\"\nmsgstr \"定时类型\"\n\n\n# scheduled.js - 任务类型值\nmsgid \"Scheduled Reboot\"\nmsgstr \"定时重启\"\n\nmsgid \"Scheduled Poweroff\"\nmsgstr \"定时关机\"\n\nmsgid \"Scheduled ReNetwork\"\nmsgstr \"定时重启网络\"\n\nmsgid \"Scheduled RestartSamba\"\nmsgstr \"定时重启Samba\"\n\nmsgid \"Scheduled Restartwan\"\nmsgstr \"定时重启WAN\"\n\nmsgid \"Scheduled Closewan\"\nmsgstr \"定时关闭WAN\"\n\nmsgid \"Scheduled Clearmem\"\nmsgstr \"定时清理内存\"\n\nmsgid \"Scheduled Sysfree\"\nmsgstr \"定时系统清理\"\n\nmsgid \"Scheduled DisReconn\"\nmsgstr \"定时断网重连\"\n\nmsgid \"Scheduled DisRereboot\"\nmsgstr \"定时断网重启\"\n\nmsgid \"Scheduled Restartmwan3\"\nmsgstr \"定时重启MWAN3\"\n\nmsgid \"Scheduled Wifiup\"\nmsgstr \"定时开启WiFi\"\n \nmsgid \"Scheduled Wifidown\"\nmsgstr \"定时关闭WiFi\"\n\nmsgid \"Scheduled Customscript\"\nmsgstr \"定时 自定义脚本\"\n\nmsgid \"Scheduled Customscript2\"\nmsgstr \"定时 自定义脚本2\"\n\n# scheduled.js - 时间设置\nmsgid \"Month(0~11)\"\nmsgstr \"月份(0~11)\"\n\nmsgid \"Week Day(0~6)\"\nmsgstr \"星期(0~6)\"\n\nmsgid \"Everyday\"\nmsgstr \"每天\"\n\nmsgid \"Sunday\"\nmsgstr \"星期日\"\n\nmsgid \"Monday\"\nmsgstr \"星期一\"\n\nmsgid \"Tuesday\"\nmsgstr \"星期二\"\n\nmsgid \"Wednesday\"\nmsgstr \"星期三\"\n\nmsgid \"Thursday\"\nmsgstr \"星期四\"\n\nmsgid \"Friday\"\nmsgstr \"星期五\"\n\nmsgid \"Saturday\"\nmsgstr \"星期六\"\n\nmsgid \"Hour(0~23)\"\nmsgstr \"小时(0~23)\"\n\nmsgid \"1-8 is the continuous time from 1-8 clock; 11,12,16 clock are discontinuous; */3 represents every 3 hours; * every hour.\"\nmsgstr \"1-8是从1点到8点的连续时间；11、12、16点钟不连续；*/3表示每3小时一次；*每小时。\"\n\nmsgid \"Minute(0~59)\"\nmsgstr \"分钟(0~59)\"\n\nmsgid \"1-30 is continuous 1-30 minutes; 7,8,9 minutes discontinuous ; */5 means every 5 minutes ; * every minutes.\"\nmsgstr \"1-30是连续的1-30分钟；7,8,9分钟不连续；*/5表示每5分钟一次；*每分钟。\"\n\nmsgid \"Tasks updated\"\nmsgstr \"任务已更新\"\n\n# startup.js - 页面标题和说明\nmsgid \"Startup task\"\nmsgstr \"启动任务\"\n\nmsgid \"The task to be executed upon startup, with a startup delay time unit of seconds.\"\nmsgstr \"在启动时执行的任务，启动延迟时间单位为秒。\"\n\n# startup.js - 任务类型\nmsgid \"Startup Type\"\nmsgstr \"启动类型\"\n\nmsgid \"Action to perform at system startup\"\nmsgstr \"系统启动时要执行的操作\"\n\n# startup.js - 延迟设置\nmsgid \"Delayed Start(seconds)\"\nmsgstr \"延迟启动(秒)\"\n\nmsgid \"Seconds to wait after boot before execution\"\nmsgstr \"启动后等待执行的秒数\"\n\n# startup.js - 提示\nmsgid \"⚠️ DANGEROUS - Will reboot system after boot\"\nmsgstr \"⚠️ 危险 - 启动后会重启系统\"\n\nmsgid \"⚠️ DANGEROUS - Will shutdown system after boot\"\nmsgstr \"⚠️ 危险 - 启动后会关闭系统\"\n\nmsgid \"⚠️ May disrupt connectivity\"\nmsgstr \"⚠️ 可能会中断连接\"\n\nmsgid \"✓ Safe - Restart file sharing\"\nmsgstr \"✓ 安全 - 重启文件共享\"\n\nmsgid \"✓ Safe - Restart WAN connection\"\nmsgstr \"✓ 安全 - 重启WAN连接\"\n\nmsgid \"⚠️ Will disable internet - use with delay\"\nmsgstr \"⚠️ 会禁用网络 - 请使用延迟\"\n\nmsgid \"✓ Safe - Clear memory cache\"\nmsgstr \"✓ 安全 - 清理内存缓存\"\n\nmsgid \"⚠️ Will clean system and reboot - careful\"\nmsgstr \"⚠️ 会清理系统并重启 - 小心使用\"\n\nmsgid \"✓ Safe - Check and reconnect internet\"\nmsgstr \"✓ 安全 - 检查并重连网络\"\n\nmsgid \"⚠️ May reboot if no internet - use delay\"\nmsgstr \"⚠️ 无网络时可能重启 - 请使用延迟\"\n\nmsgid \"✓ Safe - Restart MWAN3\"\nmsgstr \"✓ 安全 - 重启MWAN3\"\n\nmsgid \"✓ Safe - Enable WiFi\"\nmsgstr \"✓ 安全 - 开启WiFi\"\n\nmsgid \"✓ Safe - Disable WiFi\"\nmsgstr \"✓ 安全 - 关闭WiFi\"\n\nmsgid \"✓ Recommended - Run custom script 1\"\nmsgstr \"✓ 推荐 - 运行自定义脚本1\"\n\nmsgid \"✓ Recommended - Run custom script 2\"\nmsgstr \"✓ 推荐 - 运行自定义脚本2\"\n\n# log.js - 页面标题和按钮\n\nmsgid \"Log Viewer\"\nmsgstr \"日志查看\"\n\nmsgid \"Task Plan Log Viewer\"\nmsgstr \"任务设置日志查看\"\n\nmsgid \"Clear Log\"\nmsgstr \"清空日志\"\n\nmsgid \"Reverse Order\"\nmsgstr \"反向显示\"\n\nmsgid \"Download Log\"\nmsgstr \"下载日志\"\n\nmsgid \"Execution Log\"\nmsgstr \"执行日志\"\n\nmsgid \"Log cleared\"\nmsgstr \"日志已清空\"\n\nmsgid \"Failed to clear log: \"\nmsgstr \"清空日志失败：\"\n\nmsgid \"Log is empty\"\nmsgstr \"日志为空\"\n\n# log.js - 状态卡片\nmsgid \"Service\"\nmsgstr \"服务\"\n\nmsgid \"Running\"\nmsgstr \"运行中\"\n\nmsgid \"Stopped\"\nmsgstr \"已停止\"\n\nmsgid \"Scheduled\"\nmsgstr \"定时任务\"\n\nmsgid \"Startup\"\nmsgstr \"启动任务\"\n\nmsgid \"Cron\"\nmsgstr \"定时条目\"\n\nmsgid \"Status\"\nmsgstr \"状态\"\n\nmsgid \"Type\"\nmsgstr \"类型\"\n\nmsgid \"Schedule\"\nmsgstr \"调度时间\"\n\nmsgid \"Delay\"\nmsgstr \"延迟\"\n\nmsgid \"No scheduled tasks\"\nmsgstr \"没有定时任务\"\n\nmsgid \"No startup tasks\"\nmsgstr \"没有启动任务\"\n\n# log.js - 任务状态指示\nmsgid \"● Enabled\"\nmsgstr \"● 已启用\"\n\nmsgid \"○ Disabled\"\nmsgstr \"○ 已禁用\"\n\n# 通用\nmsgid \"Unknown\"\nmsgstr \"未知\"\n\nmsgid \"Error\"\nmsgstr \"错误\"\n\nmsgid \"Success\"\nmsgstr \"成功\"\n\nmsgid \"Failed\"\nmsgstr \"失败\"\n\nmsgid \"Please wait...\"\nmsgstr \"请稍候...\"\n\nmsgid \"Operation completed\"\nmsgstr \"操作完成\"\n\nmsgid \"Operation failed\"\nmsgstr \"操作失败\""
  },
  {
    "path": "luci-app-taskplan/root/etc/config/taskplan",
    "content": "\nconfig global\n\toption enabled '0'\n\toption customscript '# Sh script rules'\n\toption customscript2 '# Sh script rules'\n\nconfig stime\n\toption week '*'\n\toption stype '2'\n\toption month '*'\n\toption enable '0'\n\toption ttype '0'\n\toption delay '10'\n\toption remarks '每天22:30执行'\n\toption hour '22'\n\toption minute '30'\nconfig stime\n\toption week '*'\n\toption month '*'\n\toption stype '11'\n\toption ttype '1'\n\toption delay '20'\n\toption enable '0'\n\toption hour '*'\n\toption remarks '每月每天每过4分钟执行'\n\toption minute '*/4'\n\nconfig ltime\n\toption remarks '开机启动延时30秒执行'\n\toption stype '11'\n\toption delay '30'\n\toption enable '0'\n\n"
  },
  {
    "path": "luci-app-taskplan/root/etc/init.d/taskplan",
    "content": "#!/bin/sh /etc/rc.common\n# copyright by sirpdboy\n# Converted for OpenWrt 25.10\n\nSTART=99\nSTOP=10\nTMP=/etc/taskplan\nLOG=$TMP/taskplan.log\nTT=/etc/taskplan/taskplanrun\nCR=/etc/crontabs/root\n\n# 确保目录存在\n[ ! -d $TMP ] && mkdir -p $TMP 2>/dev/null\n[ ! -s $LOG ] && echo '' > $LOG\n\nrun_taskplan()\n{\n    [ -n \"$(uci -q get taskplan.@global[0].customscript)\" ] && \\\n        uci -q get taskplan.@global[0].customscript > /etc/taskplan/taskplancustomscript && \\\n        sed -i 's/\\r$//' /etc/taskplan/taskplancustomscript\n    \n    [ -n \"$(uci -q get taskplan.@global[0].customscript2)\" ] && \\\n        uci -q get taskplan.@global[0].customscript2 > /etc/taskplan/taskplancustomscript2 && \\\n        sed -i 's/\\r$//' /etc/taskplan/taskplancustomscript2\n    \n    ssum=$(uci -q show taskplan | grep -c \"stime\\[[0-9]\\]\" || echo 0)\n    lsum=$(uci -q show taskplan | grep -c \"ltime\\[[0-9]\\]\" || echo 0)\n    \n    # 清空crontab中的taskplan条目\n    sed -i '/taskplanhandler/d' $CR >/dev/null 2>&1\n    \n    # 处理定时任务\n    for i in $(seq 0 $((ssum-1)) 2>/dev/null); do\n        enable=$(uci -q get taskplan.@stime[$i].enable)\n        if [ \"x$enable\" = \"x1\" ]; then\n            month=$(uci -q get taskplan.@stime[$i].month || echo \"*\")\n            stype=$(uci -q get taskplan.@stime[$i].stype)\n            week=$(uci -q get taskplan.@stime[$i].week || echo \"*\")\n            minute=$(uci -q get taskplan.@stime[$i].minute || echo \"0\")\n            hour=$(uci -q get taskplan.@stime[$i].hour || echo \"*\")\n            \n            # 格式化时间\n            [ \"$hour\" = \"0\" ] && hour=\"0\"\n            [ \"$minute\" = \"0\" ] && minute=\"0\"\n            \n            case \"$stype\" in\n                1) cmd=\"$minute $hour * $month $week /usr/bin/taskplanhandler reboot Scheduled_task\" ;;\n                2) cmd=\"$minute $hour * $month $week /usr/bin/taskplanhandler poweroff Scheduled_task\" ;;\n                3) cmd=\"$minute $hour * $month $week /usr/bin/taskplanhandler network Scheduled_task\" ;;\n                4) cmd=\"$minute $hour * $month $week /usr/bin/taskplanhandler restartsamba Scheduled_task\" ;;\n                5) cmd=\"$minute $hour * $month $week /usr/bin/taskplanhandler restartwan Scheduled_task\" ;;\n                6) cmd=\"$minute $hour * $month $week /usr/bin/taskplanhandler closewan Scheduled_task\" ;;\n                7) cmd=\"$minute $hour * $month $week /usr/bin/taskplanhandler clearmem Scheduled_task\" ;;\n                8) cmd=\"$minute $hour * $month $week /usr/bin/taskplanhandler sysfree Scheduled_task\" ;;\n                9) cmd=\"$minute $hour * $month $week /usr/bin/taskplanhandler disreconn Scheduled_task\" ;;\n                10) cmd=\"$minute $hour * $month $week /usr/bin/taskplanhandler disrereboot Scheduled_task\" ;;\n                11) cmd=\"$minute $hour * $month $week /usr/bin/taskplanhandler restartmwan3 Scheduled_task\" ;;\n                12) cmd=\"$minute $hour * $month $week /usr/bin/taskplanhandler customscript Scheduled_task\" ;;\n                13) cmd=\"$minute $hour * $month $week /usr/bin/taskplanhandler upwifi Scheduled_task\" ;;\n                14) cmd=\"$minute $hour * $month $week /usr/bin/taskplanhandler downwifi Scheduled_task\" ;;\n                15) cmd=\"$minute $hour * $month $week /usr/bin/taskplanhandler customscript2 Scheduled_task\" ;;\n                16) cmd=\"$minute $hour * $month $week /usr/bin/taskplanhandler restartlan Scheduled_task\" ;;\n            esac\n            echo \"$cmd\" >> $CR\n        fi\n    done\n\n    # 创建启动任务脚本\n    echo \"#!/bin/sh\" > $TT\n    chmod +x $TT\n    \n    for i in $(seq 0 $((lsum-1)) 2>/dev/null); do\n        enable=$(uci -q get taskplan.@ltime[$i].enable)\n        if [ \"x$enable\" = \"x1\" ]; then\n            stype=$(uci -q get taskplan.@ltime[$i].stype)\n            delay=$(uci -q get taskplan.@ltime[$i].delay || echo 10)\n            \n            case \"$stype\" in\n                1) echo \"(sleep $delay && /usr/bin/taskplanhandler reboot Startup_task) &\" >>$TT ;;\n                2) echo \"(sleep $delay && /usr/bin/taskplanhandler poweroff Startup_task) &\" >>$TT ;;\n                3) echo \"(sleep $delay && /usr/bin/taskplanhandler network Startup_task) &\" >>$TT ;;\n                4) echo \"(sleep $delay && /usr/bin/taskplanhandler restartsamba Startup_task) &\" >>$TT ;;\n                5) echo \"(sleep $delay && /usr/bin/taskplanhandler restartwan Startup_task) &\" >>$TT ;;\n                6) echo \"(sleep $delay && /usr/bin/taskplanhandler closewan Startup_task) &\" >>$TT ;;\n                7) echo \"(sleep $delay && /usr/bin/taskplanhandler clearmem Startup_task) &\" >>$TT ;;\n                8) echo \"(sleep $delay && /usr/bin/taskplanhandler sysfree Startup_task) &\" >>$TT ;;\n                9) echo \"(sleep $delay && /usr/bin/taskplanhandler disreconn Startup_task) &\" >>$TT ;;\n                10) echo \"(sleep $delay && /usr/bin/taskplanhandler disrereboot Startup_task) &\" >>$TT ;;\n                11) echo \"(sleep $delay && /usr/bin/taskplanhandler restartmwan3 Startup_task) &\" >>$TT ;;\n                12) echo \"(sleep $delay && /usr/bin/taskplanhandler customscript Startup_task) &\" >>$TT ;;\n                13) echo \"(sleep $delay && /usr/bin/taskplanhandler upwifi Startup_task) &\" >>$TT ;;\n                14) echo \"(sleep $delay && /usr/bin/taskplanhandler downwifi Startup_task) &\" >>$TT ;;\n                15) echo \"(sleep $delay && /usr/bin/taskplanhandler customscript2 Startup_task) &\" >>$TT ;;\n                16) echo  \"(sleep $delay && /usr/bin/taskplanhandler restartlan Startup_task) &\" >>$TT ;;\n            esac\n        fi\n    done\n\n    echo 'exit 0' >> $TT\n}\n\nstart()\n{\n    del_cru\n    run_taskplan\n    /etc/init.d/cron reload\n    echo \"$(date): taskplan started\" >> $LOG\n}\n\nboot()\n{\n    # 启动时执行\n    del_cru\n    run_taskplan\n    /etc/init.d/cron reload\n\n    if [ -f $TT ] && [ -s $TT ]; then\n        echo \"$(date +'%Y-%m-%d %H:%M:%S'): Executing taskplanrun at boot\" >> $LOG\n        bash $TT >> $LOG 2>&1 &\n    else\n        echo \"$(date +'%Y-%m-%d %H:%M:%S'): taskplanrun file not found or empty at boot\" >> $LOG\n    fi\n}\n\nstop()\n{\n    del_cru\n    /etc/init.d/cron reload\n}\n\nrestart()\n{\n    stop\n    sleep 2\n    start\n}\ndel_cru()\n{   \n    sed -i '/taskplanhandler/d' $CR >/dev/null 2>&1 || true\n    echo \"#!/bin/sh\" > $TT  # 清空文件但保留基本结构\n    chmod +x $TT\n}\n"
  },
  {
    "path": "luci-app-taskplan/root/etc/taskplan/taskplancustomscript",
    "content": "#!/bin/bash\\n# Add your commands here\n"
  },
  {
    "path": "luci-app-taskplan/root/etc/taskplan/taskplancustomscript2",
    "content": "#!/bin/bash\\n# Add your commands here"
  },
  {
    "path": "luci-app-taskplan/root/etc/taskplan/taskplanrun",
    "content": "#!/bin/bash\n\necho \"\"\nexit 0"
  },
  {
    "path": "luci-app-taskplan/root/etc/uci-defaults/luci-taskplan",
    "content": "#!/bin/sh\nif [ ! -f /etc/config/taskplan ]; then\n    cat > /etc/config/taskplan << EOF\nconfig global 'global'\n\toption customscript ' '\n\toption customscript2 ' '\n\nEOF\nfi\nmkdir -p /etc/taskplan\ntouch /etc/taskplan/taskplan.log\nchmod +x /usr/libexec/rpcd/luci.taskplan /etc/init.d/taskplan /etc/taskplan/taskplanrun /usr/bin/taskplanhandler\nrm -rf /tmp/luci-modulecache /tmp/luci-indexcache*\n\nexit 0\n"
  },
  {
    "path": "luci-app-taskplan/root/usr/bin/taskplanhandler",
    "content": "#!/bin/sh\n# author 2021 jjm2473\n# author 2020-2026 sirpdboy\n# Converted for OpenWrt 25.10\n\nTMP_T=/var/taskplan/taskplan.tmp\nLOG=/etc/taskplan/taskplan.log\n\nlog(){\n    echo \"$(date +'%Y-%m-%d %H:%M:%S') $*\" >> $LOG\n}\n\nlimit_log() {\n    local logf=$1\n    [ ! -f \"$logf\" ] && return\n    local sc=100\n    [ -n \"$2\" ] && sc=$2\n    local count=$(grep -c \"\" $logf 2>/dev/null || echo 0)\n    if [ $count -gt $sc ]; then\n        let count=count-$sc\n        sed -i \"1,$count d\" $logf 2>/dev/null\n    fi\n}\n\nremwan3() {\n    while true; do   \n        status=$(/usr/sbin/mwan3 status 2>/dev/null | grep -i error)\n        if [ -z \"$status\" ]; then\n            log \"Mwan3 is OK\"\n            exit 0\n        else\n            log \"mwan3 restarting ...\"  \n            /usr/sbin/mwan3 restart\n        fi \n        sleep 60\n    done\n}\n\ndisreconnwan() {\n    i=0\n    PingA=114.114.114.114\n    PingB=223.5.5.5\n    PingErr=1\n    \n    while [ $i -lt 5 ]; do\n        if ping -c 1 -W 3 $PingA >/dev/null 2>&1; then\n            PingErr=0\n            break\n        elif ping -c 1 -W 3 $PingB >/dev/null 2>&1; then\n            PingErr=0\n            break\n        else\n            i=$((i + 1))\n            sleep 10\n        fi\n    done\n}\n\ntrigger() {\n    case \"$1\" in\n        reboot)\n            reboot\n            ;;\n        poweroff)\n            poweroff\n            ;;\n        network)\n            /etc/init.d/network restart\n            ;;\n        clearmem)\n            sync && echo 3 > /proc/sys/vm/drop_caches\n            ;;\n        sysfree)\n            cd /overlay\n            rm -rf $(ls | egrep -v '(upper|.fs_state)') 2>/dev/null\n            cd upper 2>/dev/null\n            rm -rf $(ls | egrep -v '(etc)') 2>/dev/null\n            cd etc 2>/dev/null\n            rm -rf $(ls | egrep -v '(config|ssr|bench.log|shadow)') 2>/dev/null\n            rm -rf /var/luci-modulecache 2>/dev/null\n            rm -rf /var/luci-indexcache 2>/dev/null\n            rm -rf /tmp/cache/* 2>/dev/null\n            reboot\n            ;;\n        restartsamba)\n            /etc/init.d/ksmdb restart 2>/dev/null\n            /etc/init.d/samba restart 2>/dev/null\n            /etc/init.d/samba4 restart 2>/dev/null\n            log \"Samba restarted\"\n            ;;\n        restartlan)\n            ifdown lan && ifup lan\n            log \"restart lan succeeded!\"\n            ;;\n        restartwan)\n            ifup wan\n            log \"restart wan succeeded!\"\n            ;;\n        closewan)\n            ifdown wan\n            ;;\n        disreconn)\n            disreconnwan\n            if [ $PingErr = 1 ]; then\n                ifup wan\n                log \"Redial succeeded!\"\n            fi\n            ;;\n        disrereboot)\n            disreconnwan\n            if [ $PingErr = 1 ]; then\n                log \"Reboot succeeded!\"\n                reboot\n            fi\n            ;;\n        restartmwan3)\n            [ -x /usr/sbin/mwan3 ] && remwan3\n            ;;\n        customscript)\n            if [ -s /etc/taskplan/taskplancustomscript ]; then\n                bash /etc/taskplan/taskplancustomscript\n                log \"CustomScript succeeded!\"\n            else\n                log \"CustomScript run Error!\"\n            fi\n            ;;\n        customscript2)\n            if [ -s /etc/taskplan/taskplancustomscript2 ]; then\n                bash /etc/taskplan/taskplancustomscript2\n                log \"CustomScript2 succeeded!\"\n            else\n                log \"CustomScript2 run Error!\"\n            fi\n            ;;\n        upwifi)\n            ifconfig wlan0 up 2>/dev/null\n            uci set wireless.radio0.disabled=0 2>/dev/null\n            uci set wireless.radio1.disabled=0 2>/dev/null\n            uci commit wireless 2>/dev/null\n            wifi up\n            ;;\n        downwifi)\n            ifconfig wlan0 down 2>/dev/null\n            uci set wireless.radio0.disabled=1 2>/dev/null\n            uci set wireless.radio1.disabled=1 2>/dev/null\n            uci commit wireless 2>/dev/null\n            wifi down\n            ;;\n    esac\n}\n\nlimit_log $LOG 500\nPingErr=0\nlog  \"Scheduled operation $2: $1\" && trigger $1\n\n"
  },
  {
    "path": "luci-app-taskplan/root/usr/libexec/rpcd/luci.taskplan",
    "content": "#!/bin/sh\n# UBUS RPC module for Task Plan\n# Path: /usr/libexec/rpcd/luci.taskplan\n\n. /usr/share/libubox/jshn.sh\n\nLOG_FILE=\"/etc/taskplan/taskplan.log\"\nCONFIG_FILE=\"/etc/config/taskplan\"\nCRON_FILE=\"/etc/crontabs/root\"\n\n# 主函数 - 处理所有RPC调用\nmain() {\n    local method\n    \n    # 读取输入\n    json_load \"$1\"\n    json_get_var method method\n    \n    case \"$method\" in\n        status)\n            status\n            ;;\n        list)\n            list\n            ;;\n        task_list)\n            task_list\n            ;;\n        start)\n            start_service\n            ;;\n        stop)\n            stop_service\n            ;;\n        restart)\n            restart_service\n            ;;\n        reload)\n            reload_service\n            ;;\n        *)\n            json_init\n            json_add_int \"error\" 1\n            json_add_string \"message\" \"Unknown method: $method\"\n            json_dump\n            ;;\n    esac\n}\n\n# 获取服务状态\nstatus() {\n    local running=0\n    local cron_tasks=0\n    local log_content=\"\"\n    local scheduled=0\n    local startup=0\n    \n    # 检查进程是否运行\n    if pidof taskplan >/dev/null 2>&1 || pgrep -f taskplan >/dev/null 2>&1; then\n        running=1\n    fi\n    \n    # 统计cron任务\n    if [ -f \"$CRON_FILE\" ]; then\n        cron_tasks=$(grep -c \"taskplanhandler\" \"$CRON_FILE\" 2>/dev/null || echo 0)\n    fi\n    \n    # 统计配置\n    if [ -f \"$CONFIG_FILE\" ]; then\n        scheduled=$(grep -c \"stime\" \"$CONFIG_FILE\" 2>/dev/null || echo 0)\n        startup=$(grep -c \"ltime\" \"$CONFIG_FILE\" 2>/dev/null || echo 0)\n    fi\n    \n    # 获取日志最后50行\n    if [ -f \"$LOG_FILE\" ]; then\n        log_content=$(tail -n 50 \"$LOG_FILE\" 2>/dev/null)\n    fi\n    \n    json_init\n    json_add_int \"running\" $running\n    json_add_int \"cron_tasks\" $cron_tasks\n    json_add_int \"scheduled_tasks\" $scheduled\n    json_add_int \"startup_tasks\" $startup\n    json_add_string \"log\" \"$log_content\"\n    json_dump\n}\n\n# 获取配置统计\nlist() {\n    local ssum=0\n    local lsum=0\n    \n    if [ -f \"$CONFIG_FILE\" ]; then\n        ssum=$(grep -c \"stime\" \"$CONFIG_FILE\" 2>/dev/null || echo 0)\n        lsum=$(grep -c \"ltime\" \"$CONFIG_FILE\" 2>/dev/null || echo 0)\n    fi\n    \n    json_init\n    json_add_int \"scheduled\" $ssum\n    json_add_int \"startup\" $lsum\n    json_dump\n}\n\n# 获取任务列表\ntask_list() {\n    json_init\n    json_add_array \"tasks\"\n    \n    # 获取定时任务\n    if [ -f \"$CONFIG_FILE\" ]; then\n        local index=0\n        while true; do\n            local section=$(uci -q get taskplan.@stime[$index] 2>/dev/null)\n            [ -z \"$section\" ] && break\n            \n            local enable=$(uci -q get taskplan.@stime[$index].enable || echo 0)\n            local remarks=$(uci -q get taskplan.@stime[$index].remarks || echo \"\")\n            local stype=$(uci -q get taskplan.@stime[$index].stype || echo \"\")\n            local month=$(uci -q get taskplan.@stime[$index].month || echo \"*\")\n            local week=$(uci -q get taskplan.@stime[$index].week || echo \"*\")\n            local hour=$(uci -q get taskplan.@stime[$index].hour || echo \"*\")\n            local minute=$(uci -q get taskplan.@stime[$index].minute || echo \"*\")\n            \n            json_add_object\n            json_add_string \"type\" \"scheduled\"\n            json_add_int \"index\" $index\n            json_add_int \"enable\" $enable\n            json_add_string \"remarks\" \"$remarks\"\n            json_add_string \"stype\" \"$stype\"\n            json_add_string \"schedule\" \"$minute $hour $week $month\"\n            json_close_object\n            \n            index=$((index + 1))\n        done\n        \n        # 获取启动任务\n        local index=0\n        while true; do\n            local section=$(uci -q get taskplan.@ltime[$index] 2>/dev/null)\n            [ -z \"$section\" ] && break\n            \n            local enable=$(uci -q get taskplan.@ltime[$index].enable || echo 0)\n            local remarks=$(uci -q get taskplan.@ltime[$index].remarks || echo \"\")\n            local stype=$(uci -q get taskplan.@ltime[$index].stype || echo \"\")\n            local delay=$(uci -q get taskplan.@ltime[$index].delay || echo \"10\")\n            \n            json_add_object\n            json_add_string \"type\" \"startup\"\n            json_add_int \"index\" $index\n            json_add_int \"enable\" $enable\n            json_add_string \"remarks\" \"$remarks\"\n            json_add_string \"stype\" \"$stype\"\n            json_add_int \"delay\" $delay\n            json_close_object\n            \n            index=$((index + 1))\n        done\n    fi\n    \n    json_close_array\n    json_dump\n}\n\n# 启动服务\nstart_service() {\n    /etc/init.d/taskplan start >/dev/null 2>&1\n    local ret=$?\n    json_init\n    json_add_int \"result\" $ret\n    [ $ret -eq 0 ] && json_add_string \"message\" \"Service started\"\n    json_dump\n}\n\n# 停止服务\nstop_service() {\n    /etc/init.d/taskplan stop >/dev/null 2>&1\n    local ret=$?\n    json_init\n    json_add_int \"result\" $ret\n    [ $ret -eq 0 ] && json_add_string \"message\" \"Service stopped\"\n    json_dump\n}\n\n# 重启服务\nrestart_service() {\n    /etc/init.d/taskplan restart >/dev/null 2>&1\n    local ret=$?\n    json_init\n    json_add_int \"result\" $ret\n    [ $ret -eq 0 ] && json_add_string \"message\" \"Service restarted\"\n    json_dump\n}\n\n# 重新加载\nreload_service() {\n    /etc/init.d/taskplan reload >/dev/null 2>&1\n    local ret=$?\n    json_init\n    json_add_int \"result\" $ret\n    [ $ret -eq 0 ] && json_add_string \"message\" \"Service reloaded\"\n    json_dump\n}\n\n# 执行主函数\nmain \"$@\"\n"
  },
  {
    "path": "luci-app-taskplan/root/usr/share/luci/menu.d/luci-app-taskplan.json",
    "content": "{\n\t\"admin/control\": {\n\t\t\"title\": \"Control\",\n\t\t\"order\": 44,\n\t\t\"action\": {\n\t\t\t\"type\": \"firstchild\"\n\t\t}\n\t},\n\t\"admin/control/taskplan\": {\n\t\t\"title\": \"Task Plan\",\n\t\t\"order\": 60,\n\t\t\"action\": {\n\t\t\t\"type\": \"firstchild\"\n\t\t},\n\t\t\"depends\": {\n\t\t\t\"acl\": [ \"luci-app-taskplan\" ],\n\t\t\t\"uci\": { \"taskplan\": true }\n\t\t}\n\t},\n\t\"admin/control/taskplan/scheduled\": {\n\t\t\"title\": \"Scheduled Tasks\",\n\t\t\"order\": 10,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"taskplan/scheduled\"\n\t\t}\n\t},\n\t\"admin/control/taskplan/startup\": {\n\t\t\"title\": \"Startup Tasks\",\n\t\t\"order\": 20,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"taskplan/startup\"\n\t\t}\n\t},\n\t\"admin/control/taskplan/log\": {\n\t\t\"title\": \"Log Viewer\",\n\t\t\"order\": 30,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"taskplan/log\"\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-taskplan/root/usr/share/rpcd/acl.d/luci-app-taskplan.json",
    "content": "{\n\t\"luci-app-taskplan\": {\n\t\t\"description\": \"Grant access to Task Plan procedures\",\n\t\t\"read\": {\n\t\t\t\"ubus\": {\n\t\t\t\t\"luci.taskplan\": [ \"status\", \"list\", \"task_list\" ]\n\t\t\t},\n\t\t\t\"file\": {\n\t\t\t\t\"/etc/taskplan/taskplan.log\": [ \"read\" ],\n\t\t\t\t\"/etc/config/taskplan\": [ \"read\" ],\n\t\t\t\t\"/etc/taskplan/taskplan.log\": [ \"read\" ],\n\t\t\t\t\"/etc/taskplan/taskplancustomscript\": [ \"read\" ],\n\t\t\t\t\"/etc/taskplan/taskplancustomscript2\": [ \"read\" ]\n\t\t\t}\n\t\t},\n\t\t\"write\": {\n\t\t\t\"ubus\": {\n\t\t\t\t\"luci.taskplan\": [ \"start\", \"stop\", \"restart\", \"reload\" ]\n\t\t\t},\n\t\t\t\"file\": {\n\t\t\t\t\"/etc/config/taskplan\": [ \"write\" ],\n\t\t\t\t\"/etc/taskplan/taskplancustomscript\": [ \"write\" ],\n\t\t\t\t\"/etc/taskplan/taskplancustomscript2\": [ \"write\" ]\n\t\t\t},\n\t\t\t\"execute\": {\n\t\t\t\t\"/etc/init.d/taskplan\": [ \"start\", \"stop\", \"restart\", \"reload\" ]\n\t\t\t}\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-tcpdump/Makefile",
    "content": "# Copyright (C) 2016 Openwrt.org\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n# Copyright (C) 2019, KFERMercer <iMercer@yeah.net>\n# \n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for tcpdump\nLUCI_DEPENDS:=+tcpdump\nLUCI_PKGARCH:=all\nPKG_NAME:=luci-app-tcpdump\nPKG_VERSION:=1.0\nPKG_RELEASE:=2\nPKG_MAINTAINER:=<https://github.com/KFERMercer/luci-app-tcpdump>\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-tcpdump/luasrc/controller/tcpdump.lua",
    "content": "--[[\nLuCI - Lua Configuration Interface\n\n\nCopyright 2013-2014 Diego Manas <diegomanas.dev@gmail.com>\n\nCopyright (C) 2019, KFERMercer <iMercer@yeah.net>\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n$Id$\n\n2019-07-12  modified by KFERMercer <iMercer@yeah.com>:\n\tformat code\n\n]] --\nmodule(\"luci.controller.tcpdump\", package.seeall)\n\ntcpdump_root_folder = \"/tmp/tcpdump/\"\ntcpdump_cap_folder = tcpdump_root_folder .. \"cap/\"\ntcpdump_filter_folder = tcpdump_root_folder .. \"filter/\"\npid_file = tcpdump_root_folder .. \"tcpdump.pid\"\nlog_file = tcpdump_root_folder .. \"tcpdump.log\"\nout_file = tcpdump_root_folder .. \"tcpdump.out\"\nsleep_file = tcpdump_root_folder .. \"tcpdump.sleep\"\n\nfunction index()\n\ttemplate(\"myapp-mymodule/helloworld\")\n\tentry({\"admin\", \"network\", \"tcpdump\"}, template(\"tcpdump\"), _ \"Tcpdump\", 70).dependent =\n\t\tfalse\n\n\tpage = entry({\"admin\", \"network\", \"tcpdump\", \"capture_start\"},\n\t\t\t\t call(\"capture_start\"), nil)\n\tpage.leaf = true\n\n\tpage = entry({\"admin\", \"network\", \"tcpdump\", \"capture_stop\"},\n\t\t\t\t call(\"capture_stop\"), nil)\n\tpage.leaf = true\n\n\tpage = entry({\"admin\", \"network\", \"tcpdump\", \"update\"}, call(\"update\"), nil)\n\tpage.leaf = true\n\n\tpage = entry({\"admin\", \"network\", \"tcpdump\", \"capture_get\"},\n\t\t\t\t call(\"capture_get\"), nil)\n\tpage.leaf = true\n\n\tpage = entry({\"admin\", \"network\", \"tcpdump\", \"capture_remove\"},\n\t\t\t\t call(\"capture_remove\"), nil)\n\tpage.leaf = true\n\nend\n\nfunction param_check(ifname, stop_value, stop_unit, filter)\n\tlocal check = false\n\tlocal message = {}\n\t-- Check interface\n\t-- Check for empty interface\n\tif ifname == nil or ifname == '' then\n\t\ttable.insert(message, \"Interface name is null or blank.\")\n\tend\n\t-- Check for existing interface\n\tlocal nixio = require \"nixio\"\n\tfor k, v in ipairs(nixio.getifaddrs()) do\n\t\tif v.family == \"packet\" then\n\t\t\tif ifname == v.name then\n\t\t\t\tcheck = true\n\t\t\t\tbreak\n\t\t\tend\n\t\tend\n\tend\n\t-- Check special interface name \"any\"\n\tif iface == 'any' then check = true end\n\t-- ERROR interface name not found\n\tif not check then\n\t\ttable.insert(message, \"Interface does not exist or is not valid.\")\n\tend\n\t-- Check stop condition value\n\tif tonumber(stop_value) == nil then\n\t\tcheck = false\n\t\ttable.insert(message, \"Capture length parameter must be a number.\")\n\tend\n\t-- Check stop condition flag\n\tif stop_unit == nil then\n\t\tcheck = false\n\t\ttable.insert(message, \"Capture unit is null or blank.\")\n\telse\n\t\tstop_unit = string.upper(stop_unit)\n\t\tif stop_unit ~= \"T\" and stop_unit ~= \"P\" then\n\t\t\tcheck = false\n\t\t\ttable.insert(message, \"Capture unit must be Time(T) or packet(P).\")\n\t\tend\n\tend\n\treturn check, message\nend\n\nfunction capture_start(ifname, stop_value, stop_unit, filter)\n\tlocal active, pid = capture_active()\n\tlocal res = {}\n\tlocal cmd = {}\n\tif active then\n\t\tcmd[\"ok\"] = false\n\t\tcmd[\"msg\"] = {\"Previous capture is still ongoing!\"}\n\telse\n\t\tlocal check, msg = param_check(ifname, stop_value, stop_unit, filter)\n\t\tif not check then\n\t\t\tcmd[\"ok\"] = false\n\t\t\tcmd[\"msg\"] = msg\n\t\telse\n\t\t\t-- Create temporal folders\n\t\t\tos.execute(\"mkdir -p \" .. tcpdump_cap_folder)\n\t\t\tos.execute(\"mkdir -p \" .. tcpdump_filter_folder)\n\t\t\tlocal prefix = \"capture_\" .. os.date(\"%Y-%m-%d_%H.%M.%S\")\n\t\t\tlocal pcap_file = tcpdump_cap_folder .. prefix .. \".pcap\"\n\t\t\tlocal filter_file = tcpdump_filter_folder .. prefix .. \".filter\"\n\t\t\tstring_to_file(filter_file, filter)\n\t\t\tstring_to_file(out_file, prefix)\n\t\t\ttcpdump_start(ifname, stop_value, stop_unit, filter_file, pcap_file)\n\t\t\tres[\"filter\"] = filter\n\t\t\tcmd[\"ok\"] = true\n\t\t\tcmd[\"msg\"] = {\"Capture in progress..\"}\n\t\tend\n\tend\n\tres[\"cmd\"] = cmd\n\tres[\"capture\"] = capture()\n\tres[\"list\"] = list()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(res)\nend\n\nfunction string_to_file(file, data)\n\tif data == nil then data = \"\" end\n\tlocal f = io.open(file, \"w\")\n\tf:write(data)\n\tf:close()\nend\n\nfunction tcpdump_start(ifname, stop_value, stop_unit, filter_file, pcap_file)\n\tlocal cmd = \"tcpdump -i %s -F %s -w %s\"\n\tcmd = string.format(cmd, ifname, filter_file, pcap_file)\n\t-- Packet limit if required\n\tif tonumber(stop_value) ~= 0 and stop_unit == \"P\" then\n\t\tcmd = cmd .. \" -c \" .. stop_value\n\tend\n\t-- Mute output and record PID on pid_file\n\tcmd = string.format(\"%s &> %s & echo $! > %s\", cmd, log_file, pid_file)\n\tos.execute(cmd)\n\t-- Time limit if required\n\tif tonumber(stop_value) ~= 0 and stop_unit == \"T\" then\n\t\tlocal f = io.open(pid_file, \"r\")\n\t\tif f ~= nil then\n\t\t\tlocal pid = f:read()\n\t\t\tf:close()\n\t\t\tlocal t_out =\n\t\t\t\tstring.format(\"sleep %s && kill %s &\", stop_value, pid)\n\t\t\tos.execute(t_out)\n\t\tend\n\tend\nend\n\nfunction capture_stop()\n\tlocal res = {}\n\tlocal cmd = {}\n\tlocal _, active, pid = capture()\n\tif active then\n\t\tluci.sys.process.signal(pid, 9)\n\t\tcmd[\"ok\"] = true\n\t\tcmd[\"msg\"] = {\"Capture has been terminated\"}\n\telse\n\t\tcmd[\"ok\"] = false\n\t\tcmd[\"msg\"] = {\"There was not active capture!\"}\n\tend\n\tcapture_cleanup()\n\tres[\"cmd\"] = cmd\n\tres[\"capture\"] = capture()\n\tres[\"list\"] = list()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(res)\nend\n\nfunction capture_active()\n\tlocal f = io.open(pid_file, \"r\")\n\tif f ~= nil then\n\t\tpid = f:read()\n\t\tf:close()\n\t\t-- Check it is a legal PID and still alive\n\t\tif tonumber(pid) ~= nil and luci.sys.process.signal(pid, 0) then\n\t\t\treturn true, pid\n\t\tend\n\tend\n\treturn false, nil\nend\n\nfunction capture_log()\n\tlocal log\n\tlocal f = io.open(log_file, \"r\")\n\tif f ~= nil then\n\t\tlog = f:read(\"*all\")\n\t\tf:close()\n\telse\n\t\tlog = \"\"\n\tend\n\treturn log\nend\n\nfunction capture_name()\n\tlocal cap_name = nil\n\tlocal f = io.open(out_file, \"r\")\n\tif f ~= nil then\n\t\tcap_name = f:read()\n\t\tf:close()\n\tend\n\treturn cap_name\nend\n\nfunction capture()\n\tlocal fs = require \"nixio.fs\"\n\tlocal res = {}\n\tlocal active, pid = capture_active()\n\tlocal msg\n\tres[\"active\"] = active\n\tres[\"log\"] = capture_log()\n\tif active then\n\t\tres[\"msg\"] = \"Capture in progress..\"\n\t\tres[\"cap_name\"] = capture_name()\n\telseif fs.access(pid_file) then\n\t\tcapture_cleanup()\n\t\tres[\"msg\"] = \"Process seems to be dead, removing pid file!\"\n\telse\n\t\tres[\"msg\"] = \"No capture in progress\"\n\tend\n\treturn res, active, pid\nend\n\nfunction capture_cleanup()\n\t-- Careless file removal\n\tos.remove(pid_file)\n\tos.remove(log_file)\n\tos.remove(out_file)\n\tlocal f = io.open(sleep_file, \"r\")\n\tif f ~= nil then\n\t\tpid = f:read()\n\t\tf:close()\n\t\t-- Kill sleep process if still alive\n\t\tif tonumber(pid) ~= nil or not luci.sys.process.signal(pid, 0) then\n\t\t\tluci.sys.process.signal(pid, 9)\n\t\tend\n\tend\n\t-- Careless file removal\n\tos.remove(sleep_file)\nend\n\nfunction list_entries(cap_name)\n\tlocal fs = require \"nixio.fs\"\n\tlocal entries = {}\n\tlocal name\n\tlocal size\n\tlocal mtime\n\tlocal filter\n\tlocal glob_str\n\tif cap_name == nil then\n\t\tglob_str = tcpdump_cap_folder .. \"*.pcap\"\n\telse\n\t\tglob_str = tcpdump_cap_folder .. cap_name .. \".pcap\"\n\tend\n\tfor file in fs.glob(glob_str) do\n\t\tname = string.sub(fs.basename(file), 1, -6)\n\t\tsize = fs.stat(file, \"size\")\n\t\tmtime = fs.stat(file, \"ctime\")\n\t\t-- Figure out if there's an associated filter\n\t\tif fs.access(tcpdump_filter_folder .. name .. \".filter\") then\n\t\t\tfilter = true\n\t\telse\n\t\t\tfilter = false\n\t\tend\n\t\ttable.insert(entries,\n\t\t\t\t\t {name = name, size = size, mtime = mtime, filter = filter})\n\tend\n\treturn entries\nend\n\nfunction list(cap_name)\n\tres = {}\n\tres[\"entries\"] = list_entries(cap_name)\n\tres[\"update\"] = (cap_name ~= nil)\n\treturn res\nend\n\nfunction update(cap_name)\n\tlocal res = {}\n\tlocal cmd = {}\n\tcmd[\"ok\"] = true\n\tres[\"cmd\"] = cmd\n\tres[\"capture\"] = capture()\n\tres[\"list\"] = list(cap_name)\n\t-- Build response\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(res)\nend\n\nfunction pump_file(file, mime_str)\n\tlocal fh = io.open(file)\n\tlocal reader = luci.ltn12.source.file(fh)\n\tluci.http.header(\"Content-Disposition\", \"attachment; filename=\\\"\" ..\n\t\t\t\t\t\t nixio.fs.basename(file) .. \"\\\"\")\n\tif mime_str ~= nil then\n\t\tluci.http.prepare_content(mime_str)\n\telse\n\t\tluci.http.prepare_content(\"application/octet-stream\")\n\tend\n\tluci.ltn12.pump.all(reader, luci.http.write)\n\tfh:close()\nend\n\nfunction capture_get(file_type, cap_name)\n\tif file_type == \"all\" then\n\t\tlocal system = require \"luci.controller.admin.system\"\n\t\tlocal tar_captures_cmd = \"tar -c \" .. tcpdump_cap_folder ..\n\t\t\t\t\t\t\t\t\t \"*.pcap 2>/dev/null\"\n\t\tlocal reader = system.ltn12_popen(tar_captures_cmd)\n\t\tluci.http.header('Content-Disposition',\n\t\t\t\t\t\t 'attachment; filename=\"captures-%s.tar\"' %\n\t\t\t\t\t\t\t {os.date(\"%Y-%m-%d_%H.%M.%S\")})\n\t\tluci.http.prepare_content(\"application/x-tar\")\n\t\tluci.ltn12.pump.all(reader, luci.http.write)\n\telseif file_type == \"pcap\" then\n\t\tlocal file = tcpdump_cap_folder .. cap_name .. '.pcap'\n\t\tpump_file(file)\n\telseif file_type == \"filter\" then\n\t\tlocal file = tcpdump_filter_folder .. cap_name .. '.filter'\n\t\tpump_file(file, \"text/plain\")\n\telse\n\t\t-- TODO\n\tend\nend\n\nfunction capture_remove(cap_name)\n\tif cap_name == 'all' then\n\t\tlocal fs = require \"nixio.fs\"\n\t\tfor file in fs.glob(tcpdump_cap_folder .. \"*.pcap\") do\n\t\t\tos.remove(file)\n\t\tend\n\t\tfor file in fs.glob(tcpdump_filter_folder .. \"*.filter\") do\n\t\t\tos.remove(file)\n\t\tend\n\telse\n\t\t-- Remove both, capture and filter file\n\t\tos.remove(tcpdump_cap_folder .. cap_name .. \".pcap\")\n\t\tos.remove(tcpdump_filter_folder .. cap_name .. \".filter\")\n\tend\n\t-- Return current status and list\n\tupdate()\nend\n"
  },
  {
    "path": "luci-app-tcpdump/luasrc/view/tcpdump.htm",
    "content": "<%#\nLuCI - Lua Configuration Interface\n\nCopyright (C) 2013-2014, Diego Manas <diegomanas.dev@gmail.com>\n\nInitial layout based on cshark project: https://github.com/cloudshark/cshark\nCopyright (C) 2014, QA Cafe, Inc.\n\nCopyright (C) 2019, KFERMercer <iMercer@yeah.net>\n\nLicensed under the Apache License, Version 2.0 (the \"License\");\nyou may not use this file except in compliance with the License.\nYou may obtain a copy of the License at\n\n   http://www.apache.org/licenses/LICENSE-2.0\n\n$Id$\n\n2019-07-12  modified by KFERMercer <iMercer@yeah.com>:\n\tformat code & change tag name\n\n-%>\n<%+header%>\n\n<fieldset class=\"cbi-section\">\n\t<legend><%:Start network capture%></legend>\n\t<div class=\"cbi-section-node\">\n\t\t<table class=\"cbi-section-table\">\n\t\t\t<tr>\n\t\t\t\t<th><%:Interface%></th>\n\t\t\t\t<th colspan='2'><%:seconds, packets%></th>\n\t\t\t\t<th><%:Filter%></th>\n\t\t\t\t<th><%:Actions%></th>\n\t\t\t</tr>\n\t\t\t<tr>\n\t\t\t\t<td>\n\t\t\t\t\t<select title=\"<%:Interface%>\" style=\"width:auto\" id=\"cap_ifname\">\n\t\t\t\t\t\t<%\n\t\t\t\t\t local nixio = require \"nixio\"\n\t\t\t\t\t for k, v in ipairs(nixio.getifaddrs()) do\n\t\t\t\t\t\tif v.family == \"packet\" then\n\t\t\t\t  %>\n\t\t\t\t\t\t<option value=\"<%=v.name%>\"><%=v.name%> </option>\n\t\t\t\t\t\t<%\n\t\t\t\t\t\tend\n\t\t\t\t\t  end\n\t\t\t\t  %>\n\t\t\t\t\t\t<option value=\"any\"><%:any%></option>\n\t\t\t\t\t</select>\n\t\t\t\t</td>\n\t\t\t\t<td colspan='2'>\n\t\t\t\t\t<input id=\"cap_stop_value\" type=\"text\" value=\"0\" />\n\t\t\t\t\t<select title=\"<%:timeout, bytes, seconds%>\" id=\"cap_stop_unit\" style=\"width:auto\">\n\t\t\t\t\t\t<option value=\"T\"><%:seconds%></option>\n\t\t\t\t\t\t<option value=\"P\"><%:packets%></option>\n\t\t\t\t\t</select>\n\t\t\t\t</td>\n\t\t\t\t<td>\n\t\t\t\t\t<input style=\"margin: 5px 0\" type=\"text\" title=\"<%:Filter%>\" placeholder=\"filter\" id=\"cap_filter\" />\n\t\t\t\t</td>\n\t\t\t\t<td>\n\t\t\t\t\t<input type=\"button\" id=\"bt_capture\" value=\"<%:Disabled%>\" class=\"cbi-button\" disabled />\n\t\t\t\t</td>\n\t\t\t</tr>\n\t\t</table>\n\t</div>\n</fieldset>\n\n<fieldset class=\"cbi-section\">\n\t<legend><%:Output%></legend>\n\t<span id=\"tcpdump-message\"></span>\n\t<span id=\"tcpdump-log\"></span>\n</fieldset>\n\n<hr />\n\n<fieldset class=\"cbi-section\">\n\t<legend><%:Capture links%></legend>\n\t<div class=\"cbi-section-node\">\n\t\t<table id=\"t_list\" class=\"cbi-section-table\">\n\t\t\t<tr class=\"cbi-section-table-titles\">\n\t\t\t\t<th class=\"cbi-section-table-cell\"><%:Capture file%></th>\n\t\t\t\t<th class=\"cbi-section-table-cell\"><%:Modification date%></th>\n\t\t\t\t<th class=\"cbi-section-table-cell\"><%:Capture size%></th>\n\t\t\t\t<th class=\"cbi-section-table-cell\"><%:Actions%></th>\n\t\t\t</tr>\n\t\t</table>\n\t</div>\n</fieldset>\n\n<hr />\n\n<script type=\"text/javascript\" src=\"<%=resource%>/cbi.js\"></script>\n<script type=\"text/javascript\">//<![CDATA[\n\n\tvar capture_active = false;\n\tvar capture_name;\n\n\tfunction update_button() {\n\t\tvar bt_capture = document.getElementById('bt_capture');\n\t\tif (!capture_active) {\n\t\t\tbt_capture.value = '<%:Start capture%>';\n\t\t\tbt_capture.onclick = capture_start;\n\t\t} else {\n\t\t\tbt_capture.value = '<%:Stop capture%>';\n\t\t\tbt_capture.onclick = capture_stop;\n\t\t}\n\t\tbt_capture.disabled = false;\n\t}\n\n\tfunction capture_start() {\n\t\tvar elem_ifname = document.getElementById('cap_ifname');\n\t\tvar elem_stop_value = document.getElementById('cap_stop_value');\n\t\tvar elem_stop_unit = document.getElementById('cap_stop_unit');\n\t\tvar elem_filter = document.getElementById('cap_filter');\n\n\t\tvar ifname = elem_ifname.options[elem_ifname.selectedIndex].value;\n\t\tvar stop_value = elem_stop_value.value;\n\t\tvar stop_unit = elem_stop_unit.options[elem_stop_unit.selectedIndex].value;\n\t\tvar filter = elem_filter.value;\n\t\t// TODO Implement checks?\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"network\", \"tcpdump\")%>/capture_start/' +\n\t\t\tifname + '/' + stop_value + '/' + stop_unit + '/' + filter,\n\t\t\tnull, update_callback)\n\t}\n\n\tfunction capture_stop() {\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"network\", \"tcpdump\")%>/capture_stop',\n\t\t\tnull, update_callback)\n\t}\n\n\tfunction update_poll() {\n\t\tXHR.poll(10, '<%=luci.dispatcher.build_url(\"admin\", \"network\", \"tcpdump\")%>/update',\n\t\t\tnull, update_callback)\n\t}\n\n\tfunction update_callback(xhr, json) {\n\t\tconsole.log(xhr)\n\t\tconsole.log(json)\n\t\tupdate_table(xhr, json)\n\t\tupdate_status(xhr, json)\n\t}\n\n\tfunction update_table(xhr, json) {\n\t\tvar table = document.getElementById(\"t_list\");\n\t\tif (!table) return;\n\t\t// Remove all rows except headers\n\t\twhile (table.rows.length > 1) {\n\t\t\ttable.deleteRow(-1);\n\t\t}\n\n\t\tif (!xhr) {\n\t\t\tvar cell = table.insertRow(-1).insertCell(0);\n\t\t\tcell.colSpan = table.rows[0].cells.length;\n\t\t\tcell.innerHTML = '<em><br />Could not retrieve captures.</em>';\n\t\t\treturn;\n\t\t}\n\t\tvar entries = json.list.entries;\n\t\tif (!entries || !entries.length) {\n\t\t\tvar cell = table.insertRow(-1).insertCell(0);\n\t\t\tcell.colSpan = table.rows[0].cells.length;\n\t\t\tcell.innerHTML = '<em><br />There are no captures available yet.</em>';\n\t\t\treturn;\n\t\t}\n\t\t// Add rows\n\t\tvar total_size = 0\n\t\tfor (var i = 0; i < entries.length; i++) {\n\t\t\tvar row = table.insertRow(-1);\n\t\t\ttotal_size += entries[i].size;\n\t\t\tvar url = '<%=luci.dispatcher.build_url(\"admin\", \"network\", \"tcpdump\")%>'\n\t\t\trow.insertCell().innerHTML = '<a href=\"#\"  onclick=\"capture_get(\\'pcap\\', \\'' + entries[i].name + '\\')\">' + entries[i].name + '</a>';\n\t\t\trow.insertCell().innerHTML = human_date(entries[i].mtime);\n\t\t\trow.insertCell().innerHTML = human_size(entries[i].size);\n\t\t\tvar cell = row.insertCell();\n\t\t\tcell.innerHTML += '<input type=\"button\" onclick=\"capture_get(\\'pcap\\', \\'' + entries[i].name + '\\')\" class=\"cbi-button cbi-button-download\" value =\"<%:pcap file%>\" />';\n\t\t\tcell.innerHTML += '<input type=\"button\" onclick=\"capture_get(\\'filter\\', \\'' + entries[i].name + '\\')\" class=\"cbi-button cbi-button-download\" value =\"<%:filter file%>\" />';\n\t\t\tcell.lastChild.disabled = !entries[i].filter;\n\t\t\tcell.innerHTML += '<input type=\"button\" onclick=\"capture_remove(\\'' + entries[i].name + '\\')\" class=\"cbi-button cbi-button-reset\" value =\"<%:Remove%>\" />';\n\t\t}\n\t\t// Add summary row at the end\n\t\tvar row = table.insertRow(-1);\n\t\trow.insertCell().innerHTML = '<b><%:All files%></b>';\n\t\trow.insertCell();\n\t\trow.insertCell().innerHTML = human_size(total_size);\n\t\trow.insertCell().innerHTML = '<input type=\"button\" onclick=\"capture_get(\\'all\\')\" class=\"cbi-button cbi-button-download\" value =\"<%:Download%>\" />';\n\t\trow.cells[row.cells.length - 1].innerHTML += '<input type=\"button\" onclick=\"capture_remove(\\'all\\')\" class=\"cbi-button cbi-button-reset\" value =\"<%:Remove%>\" />';\n\t}\n\n\tfunction update_status(xhr, json) {\n\t\tcapture_active = json.capture.active;\n\t\tcapture_name = json.capture.cap_name;\n\t\tvar in_use;\n\t\tin_use = document.getElementById(\"tcpdump-message\");\n\t\tvar msg = \"\"\n\t\tif (json.cmd.hasOwnProperty(\"msg\")) {\n\t\t\tfor (var i = 0; i < json.cmd.msg.length; i++) {\n\t\t\t\tmsg += json.cmd.msg[i] + \"\\n\";\n\t\t\t}\n\t\t} else {\n\t\t\tmsg = json.capture.msg;\n\t\t}\n\t\tin_use.innerHTML = \"<pre>\" + msg + \"</pre>\";\n\t\tin_use = document.getElementById(\"tcpdump-log\");\n\t\tif (capture_active) {\n\t\t\tin_use.innerHTML = \"<pre>\" + json.capture.log + \"</pre>\";\n\t\t} else {\n\t\t\tin_use.innerHTML = \"\"\n\t\t}\n\t\tupdate_button()\n\t}\n\n\tfunction human_size(size) {\n\t\tvar units = [\"B\", \"KiB\", \"MiB\", \"GiB\"]\n\t\tvar unit_index = 0\n\t\twhile (size > 1024 && unit_index < 3) {\n\t\t\tunit_index += 1\n\t\t\tsize /= 1024\n\t\t}\n\t\treturn Math.round(size * 100) / 100 + \" \" + units[unit_index]\n\t}\n\n\tfunction human_date(date_seconds) {\n\t\tvar date = new Date(date_seconds * 1000)\n\t\treturn date.getDate() + \"/\" + (date.getMonth() + 1) + \"/\" + date.getFullYear() + \" \" +\n\t\t\tdate.getHours() + \":\" + date.getMinutes() + \":\" + date.getSeconds()\n\t}\n\n\tfunction capture_get(type, cap_name) {\n\t\tvar iframe;\n\t\tiframe = document.getElementById(\"hiddenDownloader\");\n\t\tif (iframe == null) {\n\t\t\tiframe = document.createElement('iframe');\n\t\t\tiframe.id = \"hiddenDownloader\";\n\t\t\tiframe.style.visibility = 'hidden';\n\t\t\tdocument.body.appendChild(iframe);\n\t\t}\n\t\tiframe.src = '<%=luci.dispatcher.build_url(\"admin\", \"network\", \"tcpdump\")%>/capture_get/' + type + '/' + cap_name;\n\t}\n\n\tfunction capture_remove(cap_name) {\n\t\tXHR.get('<%=luci.dispatcher.build_url(\"admin\", \"network\", \"tcpdump\")%>/capture_remove/' + cap_name, null, update_callback)\n\t}\n\n\tdocument.onload = update_poll();\n//]]></script>\n<%+footer%>\n"
  },
  {
    "path": "luci-app-tcpdump/po/zh_Hans/tcpdump.po",
    "content": "msgid \"Tcpdump\"\nmsgstr \"Tcpdump 流量监控\"\n\nmsgid \"Start network capture\"\nmsgstr \"Tcpdump 流量监控\"\n\nmsgid \"Interface\"\nmsgstr \"捕获指定的接口\"\n\nmsgid \"seconds, packets\"\nmsgstr \"捕获限制\"\n\nmsgid \"Filter\"\nmsgstr \"过滤\"\n\nmsgid \"Actions\"\nmsgstr \"操作\"\n\nmsgid \"any\"\nmsgstr \"所有\"\n\nmsgid \"timeout, bytes, seconds\"\nmsgstr \"超时, 字节, 秒\"\n\nmsgid \"seconds\"\nmsgstr \"秒\"\n\nmsgid \"packets\"\nmsgstr \"数据包\"\n\nmsgid \"Disabled\"\nmsgstr \"已禁用\"\n\nmsgid \"Output\"\nmsgstr \"输出\"\n\nmsgid \"Capture links\"\nmsgstr \"捕获结果\"\n\nmsgid \"Capture file\"\nmsgstr \"文件名\"\n\nmsgid \"Modification date\"\nmsgstr \"停止时间\"\n\nmsgid \"Capture size\"\nmsgstr \"文件大小\"\n\nmsgid \"Start capture\"\nmsgstr \"开始捕获\"\n\nmsgid \"Stop capture\"\nmsgstr \"停止捕获\"\n\nmsgid \"pcap file\"\nmsgstr \".pcap文件\"\n\nmsgid \"filter file\"\nmsgstr \".filter文件\"\n\nmsgid \"Remove\"\nmsgstr \"删除\"\n\nmsgid \"All files\"\nmsgstr \"所有文件\"\n\nmsgid \"Download\"\nmsgstr \"下载\"\n\nmsgid \"Interface name is null or blank.\"\nmsgstr \"请指定要捕获的接口.\"\n\nmsgid \"Interface does not exist or is not valid.\"\nmsgstr \"接口不存在或无效.\"\n\nmsgid \"Capture length parameter must be a number.\"\nmsgstr \"捕获长度参数必须是数字.\"\n\nmsgid \"Capture unit is null or blank.\"\nmsgstr \"捕获单位为空或空白.\"\n\nmsgid \"Capture unit must be Time(T) or packet(P).\"\nmsgstr \"捕获单位必须是时间(T)或包(P).\"\n\nmsgid \"Previous capture is still ongoing!\"\nmsgstr \"先前的捕获未停止!\"\n\nmsgid \"Capture in progress..\"\nmsgstr \"正在捕获...\"\n\nmsgid \"Capture has been terminated\"\nmsgstr \"捕获已被终止\"\n\nmsgid \"There was not active capture!\"\nmsgstr \"捕获活动未运行!\"\n\nmsgid \"Process seems to be dead, removing pid file!\"\nmsgstr \"进程失去响应, 正在删除pid文件!\"\n\nmsgid \"No capture in progress\"\nmsgstr \"没有正在进行的捕获\"\n\nmsgid \"Could not retrieve captures.\"\nmsgstr \"无法检索捕获.\"\n\nmsgid \"There are no captures available yet.\"\nmsgstr \"目前没有可用的捕获.\"\n"
  },
  {
    "path": "luci-app-tencentddns/Makefile",
    "content": "#\n# Copyright (C) 2020 tencentcloud <https://github.com/Tencent-Cloud-Plugins>\n#\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-tencentddns\nPKG_VERSION:=0.1.0\nPKG_RELEASE:=3\n\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=tencentcloud <https://github.com/Tencent-Cloud-Plugins>\n\nLUCI_TITLE:=LuCI Support for tencentddns\nLUCI_DESCRIPTION:=LuCI Support for TencentDDNS\nLUCI_DEPENDS:=+bash +curl +openssl-util\nLUCI_PKGARCH:=all\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-tencentddns/luasrc/controller/tencentddns.lua",
    "content": "module(\"luci.controller.tencentddns\",package.seeall)\nfunction index()\n    local page = entry({\"admin\", \"services\", \"tencentddns\"},cbi(\"tencentddns\"),_(\"TencentDDNS\"))\n    page.order = 30\n    page.dependent = false\n    page.acl_depends = { \"luci-app-tencentddns\" }\nend\n"
  },
  {
    "path": "luci-app-tencentddns/luasrc/model/cbi/tencentddns.lua",
    "content": "local a=require\"luci.sys\"\nlocal e=luci.model.uci.cursor()\nlocal e=require\"nixio.fs\"\nrequire(\"luci.sys\")\nlocal t,e,o\n\nt=Map(\"tencentddns\",translate(\"TencentDDNS\"))\n\ne=t:section(TypedSection,\"base\",translate(\"Base\"))\ne.anonymous=true\n\nenable=e:option(Flag,\"enable\",translate(\"enable\"))\nenable.rmempty=false\n\nenable=e:option(Flag,\"clean\",translate(\"Clean Before Update\"),translate(\"Clean Before Update mean\"))\nenable.rmempty=false\n\ntoken=e:option(Value,\"key_id\",translate(\"Key ID\"),translate(\"Key ID Mean\"))\nemail=e:option(Value,\"key_token\",translate(\"Key Token\"),translate(\"Key Token Mean\"))\nemail.password = true\n\niface=e:option(ListValue,\"interface\",translate(\"WAN-IP Source\"),translate(\"Select the WAN-IP Source for TencentDDNS, like wan/internet\"))\niface:value(\"\",translate(\"Select WAN-IP Source\"))\niface:value(\"internet\")\niface:value(\"wan\")\n\niface.rmempty=false\nmain=e:option(Value,\"main_domain\",translate(\"Main Domain\"),translate(\"For example: test.github.com -> github.com\"))\nmain.rmempty=false\nsub=e:option(Value,\"sub_domain\",translate(\"Sub Domain\"),translate(\"For example: test.github.com -> test\"))\nsub.rmempty=false\ntime=e:option(Value,\"time\",translate(\"Inspection Time\"),translate(\"Unit: Minute, Range: 1-59\"))\ntime.rmempty=false\n\ne=t:section(TypedSection,\"base\",translate(\"Update Log\"))\ne.anonymous=true\nlocal a=\"/var/log/tencentddns.log\"\ntvlog=e:option(TextValue,\"sylogtext\")\ntvlog.rows=16\ntvlog.readonly=\"readonly\"\ntvlog.wrap=\"off\"\n\nfunction tvlog.cfgvalue(e,e)\n\tsylogtext=\"\"\n\tif a and nixio.fs.access(a) then\n\t\tsylogtext=luci.sys.exec(\"tail -n 100 %s\"%a)\n\tend\n\treturn sylogtext\nend\n\n\ntvlog.write=function(e,e,e)\nend\nlocal e=luci.http.formvalue(\"cbi.apply\")\nif e then\n    local key, val\n    local Enable\n    local Keyid\n    local Keytoken\n    local Domain\n    local Subdomian\n    for key, val in pairs(luci.http.formvalue()) do\n           if(string.find(key,\"enable\"))\n           then\n              Enable=val\n           elseif(string.find(key,\"key_id\"))\n           then\n              Keyid=val\n           elseif(string.find(key,\"key_token\"))\n           then\n              Keytoken=val\n          elseif(string.find(key,\"main_domain\"))\n          then\n              Domain=val\n          elseif(string.find(key,\"sub_domain\"))\n          then\n              Subdomian=val\n          end\n    end\n\tio.popen(\"/etc/init.d/tencentddns restart\")\nend\nreturn t\n"
  },
  {
    "path": "luci-app-tencentddns/po/zh_Hans/tencentddns.po",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\\n\"\n\nmsgid \"TencentDDNS\"\nmsgstr \"腾讯云DDNS\"\n\nmsgid \"enable\"\nmsgstr \"启用\"\n\nmsgid \"Clean Before Update\"\nmsgstr \"清除所有同名记录\"\n\nmsgid \"Clean Before Update mean\"\nmsgstr \"如果有相同的域名的A解析记录，DDNS会将其覆盖\"\n\nmsgid \"Base\"\nmsgstr \"基本设置\"\n\nmsgid \"Key ID\"\nmsgstr \"密钥ID\"\n\nmsgid \"Key ID Mean\"\nmsgstr \"DNSPod后台密钥管理中的ID\"\n\nmsgid \"Key Token\"\nmsgstr \"密钥Token\"\n\nmsgid \"Key Token Mean\"\nmsgstr \"DNSPod后台密钥管理中的Token\"\n\n\nmsgid \"WAN-IP Source\"\nmsgstr \"WAN-IP来源\"\n\nmsgid \"Select WAN-IP Source\"\nmsgstr \"选择WAN-IP来源\"\n\nmsgid \"Select the WAN-IP Source for TencentDDNS, like wan/internet\"\nmsgstr \"动态域名的IP来源，如wan/internet\"\n\nmsgid \"Main Domain\"\nmsgstr \"主域名\"\n\nmsgid \"Sub Domain\"\nmsgstr \"子域名\"\n\nmsgid \"For example: test.github.com -> github.com\"\nmsgstr \"例如: test.github.com 则填: github.com\"\n\nmsgid \"For example: test.github.com -> test\"\nmsgstr \"例如: test.github.com, 则填: test\"\n\nmsgid \"Inspection Time\"\nmsgstr \"检查时间\"\n\nmsgid \"Unit: Minute, Range: 1-59\"\nmsgstr \"域名检查间隔时间，单位分钟，范围1-59\"\n\nmsgid \"Update Log\"\nmsgstr \"更新记录\"\n"
  },
  {
    "path": "luci-app-tencentddns/root/etc/config/tencentddns",
    "content": "\nconfig base 'base'\n\toption enable '0'\n\toption time '10'\n\toption siteid ''\n"
  },
  {
    "path": "luci-app-tencentddns/root/etc/init.d/tencentddns",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=80\nNAME=tencentddns\n\nNE_TIPS='TencentDDNS NOT ENABLED'\n\nrestart() {\n\tstart\n}\n\nuci_get_by_name() {\n\tlocal ret=$(uci get $NAME.$1.$2 2>/dev/null)\n\techo ${ret:=$3}\n}\n\nuci_bool_by_name() {\n\tcase \"$(uci_get_by_name $1 $2)\" in\n\t\t1|on|true|yes|enabled) return 0;;\n\tesac\n\treturn 1\n}\n\nadd_hotplug() {\n\tcat <<EOF > \"/etc/hotplug.d/iface/${START}-${NAME}\"\n#!/bin/sh /etc/rc.common\n\n[ \"Z\\$ACTION\" = \"Zifup\" -a \"Z\\$INTERFACE\" = \"Zwan\" ] || exit 0\n\nDATE=\\$(date +'%Y-%m-%d %H:%M:%S')\n( sleep 10 && ( echo \"\\$DATE IFUP-WAN\" && /usr/sbin/tencentddns ) >> /var/log/tencentddns.log 2>&1 ) &\n\nexit 0\nEOF\n\tchmod +x \"/etc/hotplug.d/iface/${START}-${NAME}\"\n}\n\nstart() {\n\t$(uci_bool_by_name base enable) || {\n\t\tstop\n\t\treturn 0\n\t}\n\n\tadd_hotplug\n\n\tsed -i \"/${NE_TIPS}/d\" /var/log/tencentddns.log\n\n\ttime=$(uci_get_by_name base time 10)\n\t[ 0 -lt $time -a $time -lt 60 ] || time=10\n\n\t[ -f /etc/crontabs/root ] || mkdir -p /etc/crontabs && touch /etc/crontabs/root\n\tsed -i '/tencentddns/d' /etc/crontabs/root\n\techo \"*/$time * * * * /usr/sbin/tencentddns >> /var/log/tencentddns.log 2>&1\" >> /etc/crontabs/root\n\t/etc/init.d/cron restart\n\n\t( /usr/sbin/tencentddns >> /var/log/tencentddns.log 2>&1 ) &\n}\n\nstop() {\n\trm -rf \"/etc/hotplug.d/iface/${START}-${NAME}\"\n\tsed -i '/tencentddns/d' /etc/crontabs/root >/dev/null 2>&1\n\t/etc/init.d/cron restart\n\techo \"${NE_TIPS}\" > /var/log/tencentddns.log\n}\n\n"
  },
  {
    "path": "luci-app-tencentddns/root/etc/uci-defaults/luci-tencentddns",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@tencentddns[-1]\n\tadd ucitrack tencentddns\n\tset ucitrack.@tencentddns[-1].init=tencentddns\n\tcommit ucitrack\nEOF\n\nexit 0\n"
  },
  {
    "path": "luci-app-tencentddns/root/usr/sbin/tencentddns",
    "content": "#!/bin/sh\n\nNAME=tencentddns\nlog_file=/var/log/$NAME.log\n\nuci_bool_by_name() {\n\tcase \"$(uci get $NAME.$1.$2 2>/dev/null)\" in\n\t\t1|on|true|yes|enabled) return 0;;\n\tesac\n\treturn 1\n}\n\nintelnetip() {\n\ttmp_ip=`curl -sL -m 5 -4 myip.ipip.net/s | grep -oE '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}' | tail -n1`\n\tif [ \"Z$tmp_ip\" == \"Z\" ]; then\n\t\ttmp_ip=`curl -sL -m 5 -4 www.cip.cc | grep -oE '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}' | tail -n1`\n\tfi\n\tif [ \"Z$tmp_ip\" == \"Z\" ]; then\n\t\ttmp_ip=`curl -sL -m 5 -4 ip.3322.net | grep -oE '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}' | tail -n1`\n\tfi\n\tif [ \"Z$tmp_ip\" == \"Z\" ]; then\n\t\ttmp_ip=`curl -sL -m 5 -4 ifcfg.cn | grep -oE '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}' | tail -n1`\n\tfi\n\techo -n $tmp_ip\n}\n\nresolve2ip() {\n\t# resolve2ip domain<string>\n\tdomain=$1\n\ttmp_ip=`nslookup $domain ambulance.dnspod.net 2>/dev/null | sed '/^Server/d; /#53$/d' | grep -oE '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}' | tail -n1`\n\tif [ \"Z$tmp_ip\" == \"Z\" ]; then\n\t\ttmp_ip=`nslookup $domain lupus.dnspod.net  2>/dev/null | sed '/^Server/d; /#53$/d' | grep -oE '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}' | tail -n1`\n\tfi\n\tif [ \"Z$tmp_ip\" == \"Z\" ]; then\n\t\ttmp_ip=`curl -sL -m 5 -4 \"119.29.29.29/d?dn=$domain\" | grep -oE '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}' | tail -n1`\n\tfi\n\techo -n $tmp_ip\n}\n\ncheck_tencentddns() {\n\techo \"$DATE WAN-IP: ${ip}\"\n\tif [ \"Z$ip\" == \"Z\" ]; then\n\t\techo \"$DATE ERROR, cant get WAN-IP...\"\n\t\treturn 0\n\tfi\n\tcurrent_ip=$(resolve2ip \"$sub_dm.$main_dm\")\n\tif [ \"Z$current_ip\" == \"Z\" ]; then\n\t\trrid='' # NO Resolve IP Means new Record_ID\n\tfi\n\techo \"$DATE DOMAIN-IP: ${current_ip}\"\n\tif [ \"Z$ip\" == \"Z$current_ip\" ]; then\n\t\techo \"$DATE IP dont need UPDATE...\"\n\t\treturn 0\n\telse\n\t\techo \"$DATE UPDATING...\"\n\t\treturn 1\n\tfi\n}\n\nurlencode() {\n\t# urlencode url<string>\n\tout=''\n\tfor c in $(echo -n $1 | sed 's/[^\\n]/&\\n/g'); do\n\t\tcase $c in\n\t\t\t[a-zA-Z0-9._-]) out=\"$out$c\" ;;\n\t\t\t*) out=\"$out$(printf '%%%02X' \"'$c\")\" ;;\n\t\tesac\n\tdone\n\techo -n $out\n}\n\nsend_request() {\n        curl -s -X POST https://dnsapi.cn/$1 -d \"login_token=$ak_id,$ak_token&format=json&\"$2\n}\n\nget_recordid() {\n        sed 's/\"records\"/\\n/g' | sed -n '2p' | sed 's/ttl/\\n/g' | sed -n 's/.*\"id[^0-9]*\\([0-9]*\\).*/\\1\\n/p' | sort -ru | sed /^$/d\n}\n\nget_recordid2() {\n        sed 's/\"record\"/\\n/g' | sed -n '2p' |  sed -n 's/.*\"id[^0-9]*\\([0-9]*\\).*/\\1\\n/p' | sort -ru | sed /^$/d\n}\n\nquery_recordid() {\n        send_request \"Record.List\" \"domain=$main_dm&sub_domain=$sub_dm&record_type=A\"\n}\n\nupdate_record() {\n        send_request \"Record.Ddns\" \"domain=$main_dm&sub_domain=$sub_dm&record_id=$1&record_type=A&record_line=%e9%bb%98%e8%ae%a4&value=$ip\"\n}\n\nadd_record() {\n        send_request \"Record.Create\" \"domain=$main_dm&sub_domain=$sub_dm&record_type=A&record_line=%e9%bb%98%e8%ae%a4&value=$ip\"\n}\n\ndel_record() {\n        send_request \"Record.Remove\" \"domain=$main_dm&record_id=$1\"\n}\n\ndo_ddns_record() {\n\tif uci_bool_by_name base clean ; then\n\t\tquery_recordid | get_recordid | while read rr; do\n\t\t\techo \"$DATE Clean record $sub_dm.$main_dm: $rr\"\n\t\t\tdel_record $rr >/dev/null\n\t\t\ttimestamp=$(date -u \"+%Y-%m-%dT%H%%3A%M%%3A%SZ\")\n\t\tdone\n\t\trrid=''\n\tfi\n\tif [ \"Z$rrid\" == \"Z\" ]; then\n\t\trrid=`query_recordid | get_recordid`\n\tfi\n\tif [ \"Z$rrid\" == \"Z\" ]; then\n\t\trrid=`add_record | get_recordid2`\n\t\techo \"$DATE ADD record $rrid\"\n\telse\n\t\tupdate_record $rrid >/dev/null 2>&1\n\t\techo \"$DATE UPDATE record $rrid\"\n\tfi\n\tif [ \"Z$rrid\" == \"Z\" ]; then\n\t\t# failed\n\t\techo \"$DATE # ERROR, Please Check Config/Time\"\n\telse\n\t\t# save rrid\n\t\tuci set tencentddns.base.record_id=$rrid\n\t\tuci commit tencentddns\n\t\techo \"$DATE # UPDATED($ip)\"\n\tfi\n}\n\nclean_log() {\n\tif [ $(cat $log_file 2>/dev/null | wc -l) -ge 16 ]; then\n\t\trm -f $log_file && touch $log_file\n\t\techo \"$DATE Log Cleaned\"\n\tfi\n}\n\n[ -x /usr/bin/openssl -a -x /usr/bin/curl -a -x /bin/sed ] ||\n\t( echo \"Need [ openssl + curl + sed ]\" && exit 1 )\n\nak_id=$(uci get $NAME.base.key_id 2>/dev/null)\nak_token=$(uci get $NAME.base.key_token 2>/dev/null)\nrrid=$(uci get $NAME.base.record_id 2>/dev/null)\nmain_dm=$(uci get $NAME.base.main_domain 2>/dev/null)\nsub_dm=$(uci get $NAME.base.sub_domain 2>/dev/null)\n\niface=$(uci get $NAME.base.interface 2>/dev/null)\nif [ \"Z$iface\" == \"Zinternet\" -o \"Z$iface\" == \"Z\" ]; then\n\tip=$(intelnetip)\nelse\n\tip=$(ubus call network.interface.$iface status | grep '\"address\"' | grep -oE '[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}' | head -1)\nfi\n\nDATE=$(date +'%Y-%m-%d %H:%M:%S')\ntimestamp=$(date -u \"+%Y-%m-%dT%H%%3A%M%%3A%SZ\")\n\nclean_log\ncheck_tencentddns || do_ddns_record\n"
  },
  {
    "path": "luci-app-tencentddns/root/usr/share/rpcd/acl.d/luci-app-tencentddns.json",
    "content": "{\n\t\"luci-app-tencentddns\": {\n\t\t\"description\": \"Grant UCI access for luci-app-tencentddns\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"tencentddns\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"tencentddns\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-timecontrol/luci-app-timecontrol/Makefile",
    "content": "#\n# Copyright (C) 2006-2017 OpenWrt.org\n# Copyright (C) 2022-2026 sirpdboy <herboy2008@gmail.com>\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nTHEME_NAME:=timecontrol\nPKG_NAME:=luci-app-$(THEME_NAME)\n\nPKG_LICENSE:=Apache-2.0\n\nLUCI_TITLE:=LuCI support for timecontrol for nftables\nLUCI_DESCRIPTION:=LuCI support for Easy timecontrol for nftables(Internet time control).\nLUCI_DEPENDS:=+bc +nftables +bash +conntrack\nLUCI_PKGARCH:=all\n\nPKG_VERSION:=3.2.4\nPKG_RELEASE:=20260322\nPKG_MAINTAINER:=sirpdboy <herboy2008@gmail.com>\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/postinst\n#!/bin/sh\nrm -f /tmp/luci-*\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/timecontrol\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n\n"
  },
  {
    "path": "luci-app-timecontrol/luci-app-timecontrol/htdocs/luci-static/resources/view/timecontrol/basic.js",
    "content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n * Copyright (C) 2022-2026 sirpdboy <herboy2008@gmail.com>\n */\n'use strict';\n'require view';\n'require fs';\n'require ui';\n'require uci';\n'require form';\n'require poll';\n'require rpc';\n'require network';\n\nfunction checkTimeControlProcess() {\n    return fs.exec('/bin/ps', ['w']).then(function(res) {\n        if (res.code !== 0) {\n            return { running: false, pid: null };\n        }\n        \n        var lines = res.stdout.split('\\n');\n        var running = false;\n        var pid = null;\n        \n        for (var i = 0; i < lines.length; i++) {\n            var line = lines[i];\n            if (line.includes('timecontrolctrl')) {\n                running = true;\n                // 提取PID\n                var match = line.match(/^\\s*(\\d+)/);\n                if (match) {\n                    pid = match[1];\n                }\n                break;\n            }\n        }\n        \n        return { running: running, pid: null };\n    }).catch(function() {\n        return { running: false, pid: null };\n    });\n}\n\nfunction renderServiceStatus(isRunning, pid) {\n    var statusText = isRunning ? _('RUNNING') : _('NOT RUNNING');\n    var color = isRunning ? 'green' : 'red';\n    var icon = isRunning ? '✓' : '✗'; \n    \n    var statusHtml = String.format(\n        '<em><span style=\"color:%s\">%s <strong>%s %s</strong></span></em>',\n        color, icon, _('TimeControl Service'), statusText\n    );\n    \n    if (isRunning && pid) {\n        statusHtml += ' <small>(PID: ' + pid + ')</small>';\n    }\n    \n    return statusHtml;\n}\n\nfunction getHostList() {\n    return L.resolveDefault(network.getHostHints(), [])\n        .then(function(hosts) {\n            var hostList = [];\n            if (hosts && hosts.length > 0) {\n                hosts.forEach(function(host) {\n                    if (host.ipv4 && host.mac) {\n                        hostList.push({\n                            ipv4: host.ipv4,\n                            mac: host.mac,\n                            name: host.name || '',\n                            ipv6: host.ipv6 || ''\n                        });\n                    }\n                });\n            }\n            return hostList;\n        })\n        .catch(function() {\n            return [];\n        });\n}\n\nvar cbiRichListValue = form.ListValue.extend({\n    renderWidget: function(section_id, option_index, cfgvalue) {\n        var choices = this.transformChoices();\n        var widget = new ui.Dropdown((cfgvalue != null) ? cfgvalue : this.default, choices, {\n            id: this.cbid(section_id),\n            sort: this.keylist,\n            optional: true,\n            select_placeholder: this.select_placeholder || this.placeholder,\n            custom_placeholder: this.custom_placeholder || this.placeholder,\n            validate: L.bind(this.validate, this, section_id),\n            disabled: (this.readonly != null) ? this.readonly : this.map.readonly\n        });\n\n        return widget.render();\n    },\n\n    value: function(value, title, description) {\n        if (description) {\n            form.ListValue.prototype.value.call(this, value, E([], [\n                E('span', { 'class': 'hide-open' }, [title]),\n                E('div', { 'class': 'hide-close', 'style': 'min-width:25vw' }, [\n                    E('strong', [title]),\n                    E('br'),\n                    E('span', { 'style': 'white-space:normal' }, description)\n                ])\n            ]));\n        } else {\n            form.ListValue.prototype.value.call(this, value, title);\n        }\n    }\n});\n\nreturn view.extend({\n    load: function() {\n        return Promise.all([\n            uci.load('timecontrol'),\n            network.getHostHints()\n        ]);\n    },\n\n    render: function(data) {\n        var m, s, o;\n        let hosts = data[1]?.hosts;\n\n        m = new form.Map('timecontrol', _('Internet Time Control'),\n            _('Users can limit their internet usage time through MAC and IP, with available IP ranges such as 192.168.110.00 to 192.168.10.200') + '<br/>' +\n            _('黑名单模式时间控制方式:') + '<br/>' +\n            _('1. 时间段控制: 指定的机器在设定时间段内可以上网，其他时间不能上网') + '<br/>' +\n            _('2. 允许上机时长: 指定的机器上线后可以上网指定时长，超过时长后不能上网') + '<br/>' +\n            _('3. 组合控制: 在时间段内+时长限制（在允许的时间段内限制上网时长）') + '<br/>' +\n            _('Suggested feedback:') + ' <a href=\"https://github.com/sirpdboy/luci-app-timecontrol.git\" target=\"_blank\">GitHub @timecontrol</a>');\n\n        s = m.section(form.TypedSection);\n        s.anonymous = true;\n        s.render = function() {\n            var statusView = E('p', { id: 'service_status' }, \n                '<span class=\"spinning\"> </span> ' + _('Checking service status...'));\n            \n            checkTimeControlProcess()\n                .then(function(res) {\n                    var status = renderServiceStatus(res.running, res.pid);\n                    statusView.innerHTML = status;\n                })\n                .catch(function(err) {\n                    statusView.innerHTML = '<span style=\"color:orange\">⚠ ' + \n                        _('Status check failed') + '</span>';\n                    console.error('Status check error:', err);\n                });\n            \n            poll.add(function() {\n                return checkTimeControlProcess()\n                    .then(function(res) {\n                        var status = renderServiceStatus(res.running, res.pid);\n                        statusView.innerHTML = status;\n                    })\n                    .catch(function(err) {\n                        statusView.innerHTML = '<span style=\"color:orange\">⚠ ' + \n                            _('Status check failed') + '</span>';\n                        console.error('Status check error:', err);\n                    });\n            }, 5); \n\n            poll.start();\n            return E('div', { class: 'cbi-section', id: 'status_bar' }, [ \n                statusView,\n                E('div', { 'style': 'text-align: right; font-style: italic;' }, [\n                    E('span', {}, [\n                        _('© github '),\n                        E('a', { \n                            'href': 'https://github.com/sirpdboy', \n                            'target': '_blank',\n                            'style': 'text-decoration: none;'\n                        }, 'by sirpdboy')\n                    ])\n                ])\n            ]);\n        };\n        s = m.section(form.TypedSection, 'timecontrol');\n        s.anonymous = true;\n        s.addremove = false;\n\n        o = s.option(cbiRichListValue, 'list_type', _('Control Mode'),\n            _('blacklist: Block the networking of the target address, whitelist: Only allow networking for the target address and block all other addresses.'));\n        o.rmempty = false;\n        o.value('blacklist', _('Blacklist'));\n        // o.value('whitelist', _('Whitelist'));\n        o.default = 'blacklist';\n\n        o = s.option(cbiRichListValue, 'chain', _('Control Intensity'),\n            _('Pay attention to strong control: machines under control will not be able to connect to the software router backend!'));\n        o.value('forward', _('Ordinary forward control'));\n        o.value('input', _('Strong input control'));\n        o.default = 'forward';\n        o.rmempty = false;\n\n        var s = m.section(form.TableSection, 'device',  _('Device Rules'));\n        s.addremove = true;\n        s.anonymous = true;\n        s.sortable = false;\n\n        o = s.option(form.Value, 'comment', _('Comment'));\n        o.optional = true;\n        o.placeholder = _('Description');\n\n        o = s.option(form.Flag, 'enable', _('Enabled'));\n        o.rmempty = false;\n        o.default = '1';\n        \n        o = s.option(form.Value, 'mac', _('IP/MAC Address'));\n        o.rmempty = false;\n        if (hosts) {\n            var hostOptions = {};\n            \n            Object.keys(hosts).forEach(function(mac) {\n                var host = hosts[mac];\n                var name = host.name || _(' ');\n                var ips = L.toArray(host.ipaddrs || host.ipv4 || []);\n\n                if (ips.length > 0) {\n                    ips.forEach(function(ip) {\n                        var macDisplay = 'MAC: %s (%s - %s)'.format(mac,ip, name);\n                        hostOptions['mac:' + mac] = macDisplay;\n                        var ipDisplay = 'IP: %s (%s - %s)'.format(ip, mac, name);\n                        hostOptions['ip:' + ip] = ipDisplay;\n                    });\n                }\n            });\n            var sortedKeys = Object.keys(hostOptions).sort(function(a, b) {\n                return hostOptions[a].localeCompare(hostOptions[b]);\n            });\n            \n            sortedKeys.forEach(function(key) {\n                if (key.startsWith('ip:')) {\n                    o.value(key.substring(3), hostOptions[key]);\n                }\n            });\n\n            sortedKeys.forEach(function(key) {\n                if (key.startsWith('mac:')) {\n                    o.value(key.substring(4), hostOptions[key]);\n                }\n            });\n        }\n\n        // 时间控制方式选择\n        o = s.option(cbiRichListValue, 'time_mode', _('Time Control Mode'));\n        o.value('period', _('Time Period Control (allow in period)'));\n        o.value('duration', _('Allow Duration Control (allow limited time)'));\n        o.value('combined', _('Combined Control (allow in period + limit duration)'));\n        o.default = 'period';\n        o.rmempty = false;\n        o.onchange = function(ev, mode) {\n            var row = this.map.findElement('id', this.cbid(this.section_id));\n            if (row) {\n                // 显示/隐藏相关字段\n                var startTime = row.querySelector('[data-field=\"timestart\"]');\n                var endTime = row.querySelector('[data-field=\"timeend\"]');\n                var duration = row.querySelector('[data-field=\"duration\"]');\n                var useDuration = row.querySelector('[data-field=\"use_duration\"]');\n                var resetCycle = row.querySelector('[data-field=\"reset_cycle\"]');\n                \n                if (startTime) startTime.parentElement.style.display = \n                    (mode === 'period' || mode === 'combined') ? '' : 'none';\n                if (endTime) endTime.parentElement.style.display = \n                    (mode === 'period' || mode === 'combined') ? '' : 'none';\n                if (duration) duration.parentElement.style.display = \n                    (mode === 'duration' || mode === 'combined') ? '' : 'none';\n                if (useDuration) useDuration.parentElement.style.display = \n                    (mode === 'combined') ? '' : 'none';\n                if (resetCycle) resetCycle.parentElement.style.display = \n                    (mode === 'duration' || mode === 'combined') ? '' : 'none';\n            }\n        };\n\n        // 时间段控制字段\n        o = s.option(form.Value, 'timestart', _('Allow Start Time'));\n        o.placeholder = '00:00';\n        o.default = '00:00';\n        o.depends({ 'time_mode': 'period', '!contains': true });\n        o.depends({ 'time_mode': 'combined', '!contains': true });\n\n        o = s.option(form.Value, 'timeend', _('Allow End Time'));\n        o.placeholder = '00:00';\n        o.default = '00:00';\n        o.depends({ 'time_mode': 'period', '!contains': true });\n        o.depends({ 'time_mode': 'combined', '!contains': true });\n\n        // 持续时间控制字段\n        o = s.option(form.Value, 'duration', _('Allowed Duration (minutes)'));\n        o.placeholder = '60';\n        o.default = '60';\n        o.datatype = 'min(1)';\n        o.depends({ 'time_mode': 'duration', '!contains': true });\n        o.depends({ 'time_mode': 'combined', '!contains': true });\n        o.description = _('设备上线后允许上网的分钟数，超过后将被禁止上网');\n\n        // 重置周期\n        o = s.option(cbiRichListValue, 'reset_cycle', _('Reset Cycle'));\n        o.value('daily', _('Daily Reset'));\n        o.value('weekly', _('Weekly Reset'));\n        o.value('monthly', _('Monthly Reset'));\n        o.value('never', _('Never Reset (until manual reset)'));\n        o.default = 'daily';\n        o.depends({ 'time_mode': 'duration', '!contains': true });\n        o.depends({ 'time_mode': 'combined', '!contains': true });\n        o.description = _('时长重置周期');\n\n        // 组合控制：是否在时间段内启用时长限制\n        o = s.option(form.Flag, 'use_duration', _('Enable Duration Limit in Period'));\n        o.default = '0';\n        o.depends({ 'time_mode': 'combined', '!contains': true });\n        o.description = _('在允许的时间段内限制上网时长');\n\n        o = s.option(form.Value, 'week', _('Week Day (1~7)'));\n        o.value('0', _('Everyday'));\n        o.value('1', _('Monday'));\n        o.value('2', _('Tuesday'));\n        o.value('3', _('Wednesday'));\n        o.value('4', _('Thursday'));\n        o.value('5', _('Friday'));\n        o.value('6', _('Saturday'));\n        o.value('7', _('Sunday'));\n        o.value('1,2,3,4,5', _('Workday'));\n        o.value('6,7', _('Rest Day'));\n        o.default = '0';\n        o.rmempty = false;\n        o.description = _('允许上网的星期');\n\n        return m.render();\n    }\n});"
  },
  {
    "path": "luci-app-timecontrol/luci-app-timecontrol/htdocs/luci-static/resources/view/timecontrol/log.js",
    "content": "// SPDX-License-Identifier: Apache-2.0\n/*\n\n * Copyright (C) 2022-2026 sirpdboy <herboy2008@gmail.com>\n */\n'use strict';\n'require dom';\n'require fs';\n'require poll';\n'require uci';\n'require view';\n'require form';\n\nreturn view.extend({\n\trender: function () {\n\t\tvar css = `\n\t\t\t#log_textarea pre {\n\t\t\t\tpadding: 10px; /* 内边距 */\n\t\t\t\tborder-bottom: 1px solid #ddd; /* 边框颜色 */\n\t\t\t\tfont-size: small;\n\t\t\t\tline-height: 1.3; /* 行高 */\n\t\t\t\twhite-space: pre-wrap;\n\t\t\t\tword-wrap: break-word;\n\t\t\t\toverflow-y: auto;\n\t\t\t}\n\t\t\t.cbi-section small {\n\t\t\t\tmargin-left: 1rem;\n\t\t\t\tfont-size: small; \n\t\t\t}\n\t\t\t.log-container {\n\t\t\t\tdisplay: flex;\n\t\t\t\tflex-direction: column;\n\t\t\t\tmax-height: 1200px;\n\t\t\t\toverflow-y: auto;\n\t\t\t\tborder-radius: 3px;\n\t\t\t\tmargin-top: 10px;\n\t\t\t\tpadding: 5px;\n\t\t\t}\n\t\t\t.log-line {\n\t\t\t\tpadding: 3px 0;\n\t\t\t\tfont-family: monospace;\n\t\t\t\tfont-size: 12px;\n\t\t\t\tline-height: 1.4;\n\t\t\t}\n\t\t\t.log-line:last-child {\n\t\t\t\tborder-bottom: none;\n\t\t\t}\n\t\t\t.log-timestamp {\n\t\t\t\tmargin-right: 10px;\n\t\t\t}\n\t\t`;\n\n\t\tvar log_container = E('div', { 'class': 'log-container', 'id': 'log_container' },\n\t\t\tE('img', {\n\t\t\t\t'src': L.resource(['icons/loading.gif']),\n\t\t\t\t'alt': _('Loading...'),\n\t\t\t\t'style': 'vertical-align:middle'\n\t\t\t}, _('Collecting data ...'))\n\t\t);\n\n\t\tvar log_path = '/var/log/timecontrol.log';\n\t\tvar lastLogContent = '';\n\t\tvar lastScrollTop = 0;\n\t\tvar isScrolledToTop = true; \n\n\t\t// 解析日志行的时间戳，用于排序\n\t\tfunction parseLogTimestamp(logLine) {\n\t\t\t// 假设日志格式为: [2024-01-01 12:00:00] INFO: some message\n\t\t\tvar timestampMatch = logLine.match(/^\\[(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})\\]/);\n\t\t\tif (timestampMatch) {\n\t\t\t\treturn new Date(timestampMatch[1]).getTime();\n\t\t\t}\n\t\t\treturn Date.now();\n\t\t}\n\n\t\tfunction reverseLogLines(logContent) {\n\t\t\tif (!logContent || logContent.trim() === '') {\n\t\t\t\treturn logContent;\n\t\t\t}\n\t\t\t\n\t\t\tvar lines = logContent.split('\\n');\n\t\t\t\n\t\t\tlines = lines.filter(function(line) {\n\t\t\t\treturn line.trim() !== '';\n\t\t\t});\n\t\t\t\n\t\t\tlines.sort(function(a, b) {\n\t\t\t\tvar timeA = parseLogTimestamp(a);\n\t\t\t\tvar timeB = parseLogTimestamp(b);\n\t\t\t\treturn timeB - timeA; // 降序排列\n\t\t\t});\n\t\t\t\n\t\t\treturn lines.join('\\n');\n\t\t}\n\n\t\tfunction formatLogLines(logContent, isNewContent) {\n\t\t\tif (!logContent || logContent.trim() === '') {\n\t\t\t\treturn E('div', { 'class': 'log-line' }, _('Log is clean.'));\n\t\t\t}\n\t\t\t\n\t\t\tvar lines = logContent.split('\\n');\n\t\t\tvar formattedLines = [];\n\t\t\t\n\t\t\tfor (var i = 0; i < lines.length; i++) {\n\t\t\t\tvar line = lines[i].trim();\n\t\t\t\tif (line === '') continue;\n\t\t\t\t\n\t\t\t\tvar timestampMatch = line.match(/^\\[(\\d{4}-\\d{2}-\\d{2} \\d{2}:\\d{2}:\\d{2})\\]/);\n\t\t\t\tvar timestampSpan = null;\n\t\t\t\tvar messageSpan = null;\n\t\t\t\tvar lineClass = 'log-line';\n\t\t\t\t\n\t\t\t\tif (timestampMatch) {\n\t\t\t\t\ttimestampSpan = E('span', { \n\t\t\t\t\t\t'class': 'log-timestamp',\n\t\t\t\t\t\t'title': timestampMatch[1]\n\t\t\t\t\t}, timestampMatch[0] + ' ');\n\t\t\t\t\tmessageSpan = E('span', {}, line.substring(timestampMatch[0].length + 1));\n\t\t\t\t} else {\n\t\t\t\t\tmessageSpan = E('span', {}, line);\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tvar lineDiv = E('div', { 'class': lineClass }, [\n\t\t\t\t\ttimestampSpan,\n\t\t\t\t\tmessageSpan\n\t\t\t\t].filter(function(el) { return el !== null; }));\n\t\t\t\t\n\t\t\t\tformattedLines.push(lineDiv);\n\t\t\t}\n\t\t\t\n\t\t\treturn E('div', {}, formattedLines);\n\t\t}\n\n\t\tvar clear_log_button = E('div', {}, [\n\t\t\tE('button', {\n\t\t\t\t'class': 'cbi-button cbi-button-remove',\n\t\t\t\t'click': function (ev) {\n\t\t\t\t\tev.preventDefault();\n\t\t\t\t\tvar button = ev.target;\n\t\t\t\t\tbutton.disabled = true;\n\t\t\t\t\tbutton.textContent = _('Clear Logs...');\n\t\t\t\t\tfs.exec_direct('/usr/libexec/timecontrol-call', ['clear_log'])\n\t\t\t\t\t\t.then(function () {\n\t\t\t\t\t\t\tbutton.textContent = _('Logs cleared successfully!');\n\t\t\t\t\t\t\tbutton.disabled = false;\n\t\t\t\t\t\t\tbutton.textContent = _('Clear Logs');\n\t\t\t\t\t\t\t// 立即刷新日志显示框\n\t\t\t\t\t\t\tvar logContent = _('Log is clean.');\n\t\t\t\t\t\t\tlastLogContent = logContent;\n\t\t\t\t\t\t\tdom.content(log_container, formatLogLines(logContent, false));\n\t\t\t\t\t\t\tisScrolledToTop = true; // 清空日志后，保持在顶部\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(function () {\n\t\t\t\t\t\t\tbutton.textContent = _('Failed to clear log.');\n\t\t\t\t\t\t\tbutton.disabled = false;\n\t\t\t\t\t\t\tbutton.textContent = _('Clear Logs');\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}, _('Clear Logs'))\n\t\t]);\n\t\tlog_container.addEventListener('scroll', function() {\n\t\t\tlastScrollTop = this.scrollTop;\n\t\t\tisScrolledToTop = this.scrollTop <= 1;\n\t\t});\n\n\t\tpoll.add(L.bind(function () {\n\t\t\treturn fs.read_direct(log_path, 'text')\n\t\t\t\t.then(function (res) {\n\t\t\t\t\tvar logContent = res.trim();\n\t\t\t\t\tif (logContent === '') {\n\t\t\t\t\t\tlogContent = _('Log is clean.');\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\t// 检查内容是否有变化\n\t\t\t\t\tif (logContent !== lastLogContent) {\n\t\t\t\t\t\tvar isNewContent = lastLogContent !== '' && lastLogContent !== _('Log is clean.');\n\t\t\t\t\t\tvar reversedLog = reverseLogLines(logContent);\n\t\t\t\t\t\t// 格式化为HTML\n\t\t\t\t\t\tvar formattedLog = formatLogLines(reversedLog, isNewContent);\n\t\t\t\t\t\t\n\t\t\t\t\t\tvar prevScrollHeight = log_container.scrollHeight;\n\t\t\t\t\t\tvar prevScrollTop = log_container.scrollTop;\n\t\t\t\t\t\t\n\t\t\t\t\t\tdom.content(log_container, formattedLog);\n\t\t\t\t\t\tlastLogContent = logContent;\n\t\t\t\t\t\t\n\t\t\t\t\t\tif (isScrolledToTop || isNewContent) {\n\t\t\t\t\t\t\tlog_container.scrollTop = 0;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tvar newScrollHeight = log_container.scrollHeight;\n\t\t\t\t\t\t\tvar heightDiff = newScrollHeight - prevScrollHeight;\n\t\t\t\t\t\t\tlog_container.scrollTop = prevScrollTop + heightDiff;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}).catch(function (err) {\n\t\t\t\t\tvar logContent;\n\t\t\t\t\tif (err.toString().includes('NotFoundError')) {\n\t\t\t\t\t\tlogContent = _('Log file does not exist.');\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlogContent = _('Unknown error: %s').format(err);\n\t\t\t\t\t}\n\t\t\t\t\t\n\t\t\t\t\tif (logContent !== lastLogContent) {\n\t\t\t\t\t\tdom.content(log_container, formatLogLines(logContent, false));\n\t\t\t\t\t\tlastLogContent = logContent;\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t}));\n\n\t\t// 启动轮询\n\t\tpoll.start();\n\t\treturn E('div', { 'class': 'cbi-map' }, [\n\t\t\tE('style', [css]),\n\t\t\tE('div', { 'class': 'cbi-section' }, [\n\t\t\t\tclear_log_button,\n\t\t\t\tlog_container,\n\t\t\t\tE('small', {}, _('Refresh every 5 seconds.').format(L.env.pollinterval)),\n\t\t\t\tE('div', { 'class': 'cbi-section-actions cbi-section-actions-right' })\n\t\t\t]),\n\t\tE('div', { 'style': 'text-align: right;  font-style: italic;' }, [\n                E('span', {}, [\n                    _('© github '),\n                    E('a', { \n                        'href': 'https://github.com/sirpdboy', \n                        'target': '_blank',\n                        'style': 'text-decoration: none;'\n                    }, 'by sirpdboy')\n                ])\n            ])\n\n\n\t\t]);\n\t},\n\n\thandleSaveApply: null,\n\thandleSave: null,\n\thandleReset: null\n});\n"
  },
  {
    "path": "luci-app-timecontrol/luci-app-timecontrol/po/zh_Hans/timecontrol.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\nmsgid \"Control\"\nmsgstr \"管控\"\n\nmsgid \"Time Control\"\nmsgstr \"时间控制\"\n\nmsgid \"Internet Time Control\"\nmsgstr \"上网时间控制\"\n\nmsgid \"Users can limit their internet usage time through MAC and IP, with available IP ranges such as 192.168.110.00 to 192.168.10.200\"\nmsgstr \"用户可以通过MAC和IP限制其上网时间，可用IP范围如192.168.110.00至192.168.10.200\"\n\nmsgid \"Suggested feedback:\"\nmsgstr \"问题反馈:\"\n\nmsgid \"Checking service status...\"\nmsgstr \"正在检查服务状态...\"\n\nmsgid \"Status check failed\"\nmsgstr \"状态检查失败\"\n\nmsgid \"RUNNING\"\nmsgstr \"运行中\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\nmsgid \"TimeControl Service\"\nmsgstr \"时间控制服务\"\n\nmsgid \"Control Mode\"\nmsgstr \"控制模式\"\n\nmsgid \"blacklist: Block the networking of the target address, whitelist: Only allow networking for the target address and block all other addresses.\"\nmsgstr \"黑名单：阻断目标地址的上网；白名单：仅允许目标地址上网，阻断其他所有地址。\"\n\nmsgid \"Blacklist\"\nmsgstr \"黑名单\"\n\nmsgid \"Whitelist\"\nmsgstr \"白名单\"\n\nmsgid \"Control Intensity\"\nmsgstr \"控制强度\"\n\nmsgid \"Pay attention to strong control: machines under control will not be able to connect to the software router backend!\"\nmsgstr \"注意强控制：被控制的机器将无法连接软件路由器后台！\"\n\nmsgid \"Ordinary forward control\"\nmsgstr \"普通管制\"\n\nmsgid \"Strong input control\"\nmsgstr \"强力管制\"\n\nmsgid \"Device Rules\"\nmsgstr \"设备规则\"\n\nmsgid \"Comment\"\nmsgstr \"备注\"\n\nmsgid \"Description\"\nmsgstr \"描述\"\n\nmsgid \"Enabled\"\nmsgstr \"启用\"\n\nmsgid \"IP/MAC Address\"\nmsgstr \"IP/MAC地址\"\n\nmsgid \"192.168.10.100 or 00:11:22:33:44:55\"\nmsgstr \"192.168.10.100 或 00:11:22:33:44:55\"\n\nmsgid \"-- Please select or enter manually --\"\nmsgstr \"-- 请选择或手动输入 --\"\n\nmsgid \"Start Control Time\"\nmsgstr \"控制开始时间\"\n\nmsgid \"00:00\"\nmsgstr \"00:00\"\n\nmsgid \"Stop Control Time\"\nmsgstr \"控制结束时间\"\n\nmsgid \"Week Day (1~7)\"\nmsgstr \"星期（1~7）\"\n\nmsgid \"Everyday\"\nmsgstr \"每天\"\n\nmsgid \"Monday\"\nmsgstr \"星期一\"\n\nmsgid \"Tuesday\"\nmsgstr \"星期二\"\n\nmsgid \"Wednesday\"\nmsgstr \"星期三\"\n\nmsgid \"Thursday\"\nmsgstr \"星期四\"\n\nmsgid \"Friday\"\nmsgstr \"星期五\"\n\nmsgid \"Saturday\"\nmsgstr \"星期六\"\n\nmsgid \"Sunday\"\nmsgstr \"星期日\"\n\nmsgid \"Workday\"\nmsgstr \"工作日\"\n\nmsgid \"Rest Day\"\nmsgstr \"休息日\"\n\nmsgid \"© github \"\nmsgstr \"© 作者 \"\n"
  },
  {
    "path": "luci-app-timecontrol/luci-app-timecontrol/root/etc/config/timecontrol",
    "content": "\nconfig timecontrol\n\toption enabled '0'\n\toption control_mode 'blacklist'\n\toption list_type 'blacklist'\n\toption chain 'input'\n\t\nconfig device\n\toption timestart '00:00'\n\toption week '0'\n\toption timeend '23:55'\n\toption mac ''\n\toption enable '0'\n\nconfig device\n\toption mac '192.168.10.10/24'\n\toption timestart '00:00'\n\toption timeend '00:00'\n\toption week '0'\n\toption enable '0'\n\n"
  },
  {
    "path": "luci-app-timecontrol/luci-app-timecontrol/root/etc/init.d/timecontrol",
    "content": "#!/bin/sh /etc/rc.common\n\n#\n# Copyright (C) 2022-2026 sirpdboy herboy2008@gmail.com\n#\n\nSTART=99\nUSE_PROCD=1\n\nNAME=timecontrol\nLOCK=\"/var/lock/$NAME.lock\"\n\nstart_instance() {\n\t procd_open_instance\n\t procd_set_param command /usr/bin/timecontrolctrl\n\t procd_set_param respawn\n\t procd_set_param stderr 1\n\t procd_close_instance\n}\n\n_timecontrol_start() {\n\t if [ \"$(grep -c 'option enable .1.' /etc/config/$NAME 2>/dev/null)\" -gt \"0\" ]; then\n\t    touch $LOCK\n\t    timecontrol start\n\t    sleep 2\n\t    start_instance\n\t else\n\t    stop_service\n\t fi\n}\n\nstart_service(){\n\t[ -f $LOCK ] && exit\n\t_timecontrol_start\n\trm -f $LOCK\n}\n\nservice_triggers() {\n \t procd_add_reload_trigger 'timecontrol'\n}\n\nstop_service(){\n\tkill -9 $(busybox ps -w | grep 'timecontrolctrl' | grep -v 'grep' | awk '{print $1}') >/dev/null 2>&1\n\tkillall timecontrolctrl 2>/dev/null\n\trm -f $LOCK 2>/dev/null\n\ttimecontrol stop\n}\n"
  },
  {
    "path": "luci-app-timecontrol/luci-app-timecontrol/root/etc/uci-defaults/luci-timecontrol",
    "content": "#!/bin/sh\nchmod +x  /etc/init.d/timecontrol /usr/bin/timecontrol* /usr/libexec/timecontrol-call\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@timecontrol[-1]\n\tadd ucitrack timecontrol\n\tset ucitrack.@timecontrol[-1].init=timecontrol\n\tcommit ucitrack\nEOF\n\n[ -s /etc/config/timecontrol ] ||  echo \"config timecontrol\" > /etc/config/timecontrol\n\n/etc/init.d/rpcd restart\nrm -f /tmp/luci-indexcache\nexit 0\n"
  },
  {
    "path": "luci-app-timecontrol/luci-app-timecontrol/root/usr/bin/timecontrol",
    "content": "#!/bin/bash\n\n# Copyright (C) 2006 OpenWrt.org\n# Copyright 2022-2026 sirpdboy <herboy2008@gmail.com>\n\ncrrun=$1\ncrid=$2\nNAME=timecontrol\nDEBUG=1  # 开启调试\n\nconfig_t_get() {\n    local index=${3:-0}\n    local ret=$(uci -q get \"${NAME}.@${1}[${index}].${2}\")\n    echo \"${ret:-$4}\"\n}\n\nLOG_FILE=\"/var/log/timecontrol.log\"\nIDLIST=\"/var/$NAME.idlist\"\n\nbin_nft=$(which nft 2>/dev/null)\nbin_iptables=$(which iptables 2>/dev/null)\nbin_ip6tables=$(which ip6tables 2>/dev/null)\nbin_conntrack=$(which conntrack 2>/dev/null)\n\n# 获取配置\nchain=$(config_t_get timecontrol chain 0 \"forward\")\nlist_type=$(config_t_get timecontrol list_type 0 \"blacklist\")\n\nif [ \"$chain\" = \"input\" ]; then\n    StrongCHAIN=1\nelse\n    StrongCHAIN=0\nfi\n\ndbg() {\n    if [ \"$DEBUG\" -eq 1 ]; then\n        local d=\"$(date '+%Y-%m-%d %H:%M:%S')\"\n        echo \"[$d] FW-DEBUG: $@\" >> \"$LOG_FILE\"\n        echo \"FW-DEBUG: $@\"\n    fi\n}\n\ninfo() {\n    local d=\"$(date '+%Y-%m-%d %H:%M:%S')\"\n    echo \"[$d] FW-INFO: $@\" >> \"$LOG_FILE\"\n    echo \"FW-INFO: $@\"\n}\n\n# 地址解析函数 - 修复格式问题\nparse_target() {\n    local target=\"$1\"\n    \n    # 去除空格\n    target=$(echo \"${target}\" | xargs)\n    \n    dbg \"解析目标地址: $target\"\n    \n    # IPv4单个地址\n    if echo \"$target\" | grep -qE '^([0-9]{1,3}\\.){3}[0-9]{1,3}$'; then\n        local octets=(${target//./ })\n        local valid=1\n        for octet in \"${octets[@]}\"; do\n            if [ \"$octet\" -gt 255 ] || [ \"$octet\" -lt 0 ]; then\n                valid=0\n                break\n            fi\n        done\n        [ \"$valid\" -eq 1 ] && {\n            echo \"ipv4:single:$target\"\n            return 0\n        }\n    \n    # IPv4范围\n    elif echo \"$target\" | grep -qE '^([0-9]{1,3}\\.){3}[0-9]{1,3}-([0-9]{1,3}\\.){3}[0-9]{1,3}$'; then\n        local start_ip=${target%-*}\n        local end_ip=${target#*-}\n        echo \"ipv4:range:$start_ip-$end_ip\"\n        return 0\n    \n    # CIDR\n    elif echo \"$target\" | grep -qE '^([0-9]{1,3}\\.){3}[0-9]{1,3}/[0-9]{1,2}$'; then\n        local ip=${target%/*}\n        local mask=${target#*/}\n        [ \"$mask\" -le 32 ] && [ \"$mask\" -ge 0 ] && {\n            echo \"ipv4:cidr:$target\"\n            return 0\n        }\n    \n    # MAC地址\n    elif echo \"$target\" | grep -qE '^([0-9A-Fa-f]{2}:){5}[0-9A-Fa-f]{2}$'; then\n        echo \"mac:single:$(echo \"$target\" | tr '[:upper:]' '[:lower:]')\"\n        return 0\n    \n    # IPv6地址\n    elif echo \"$target\" | grep -qE '^([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}$'; then\n        echo \"ipv6:single:$target\"\n        return 0\n    \n    # IPv6 CIDR\n    elif echo \"$target\" | grep -qE '^([0-9a-fA-F]{0,4}:){2,7}[0-9a-fA-F]{0,4}/[0-9]{1,3}$'; then\n        local ipv6=${target%/*}\n        local mask=${target#*/}\n        [ \"$mask\" -le 128 ] && [ \"$mask\" -ge 0 ] && {\n            echo \"ipv6:cidr:$target\"\n            return 0\n        }\n    fi\n    \n    dbg \"无法解析地址: $target\"\n    return 1\n}\n\n# 清理现有连接\nflush_connections() {\n    local target=\"$1\"\n    \n    [ -x \"$bin_conntrack\" ] || {\n        dbg \"conntrack不可用\"\n        return\n    }\n    \n    local parsed_result=$(parse_target \"$target\")\n    [ $? -eq 0 ] || {\n        dbg \"无法解析地址用于清理连接: $target\"\n        return\n    }\n    \n    IFS=':' read -r type subtype value <<< \"$parsed_result\"\n    \n    dbg \"清理连接: type=$type, value=$value\"\n    \n    case \"$type\" in\n        \"ipv4\")\n            $bin_conntrack -D -s \"$value\" 2>/dev/null && dbg \"清理源连接: $value\"\n            $bin_conntrack -D -d \"$value\" 2>/dev/null && dbg \"清理目标连接: $value\"\n            ;;\n        \"mac\")\n            # MAC地址需要先转换为IP\n            if [ -f \"/proc/net/arp\" ]; then\n                local ip_addr=$(grep -i \"$value\" /proc/net/arp 2>/dev/null | awk '{print $1}' | head -1)\n                if [ -n \"$ip_addr\" ]; then\n                    $bin_conntrack -D -s \"$ip_addr\" 2>/dev/null && dbg \"清理MAC源连接: $value -> $ip_addr\"\n                    $bin_conntrack -D -d \"$ip_addr\" 2>/dev/null && dbg \"清理MAC目标连接: $value -> $ip_addr\"\n                fi\n            fi\n            ;;\n    esac\n}\n\n# 检查防火墙工具\ncheck_firewall_tool() {\n    if [ -x \"$bin_nft\" ]; then\n        nftables_ver=1\n        dbg \"检测到nftables: $bin_nft\"\n    elif [ -x \"$bin_iptables\" ] && [ -x \"$bin_ip6tables\" ]; then\n        iptables_ver=1\n        dbg \"检测到iptables: $bin_iptables, $bin_ip6tables\"\n    else\n        info \"错误: 未找到可用的防火墙工具\"\n        return 1\n    fi\n    return 0\n}\n\n# 初始化防火墙\ninit_firewall() {\n    check_firewall_tool || return 1\n    \n    info \"初始化防火墙规则 (模式: $list_type, 强度: $chain)\"\n    \n    if [ -n \"$nftables_ver\" ]; then\n        # 使用nftables\n        dbg \"初始化nftables\"\n        \n        # 删除可能存在的旧表\n        nft delete table inet timecontrol 2>/dev/null\n        sleep 1\n        \n        # 创建新表\n        nft add table inet timecontrol\n        nft add chain inet timecontrol forward \"{ type filter hook forward priority -100; policy accept; }\"\n        \n        # 创建黑名单集合\n        nft add set inet timecontrol blacklist \"{ type ipv4_addr; flags interval; }\"\n        nft add set inet timecontrol blacklist6 \"{ type ipv6_addr; flags interval; }\"\n        nft add set inet timecontrol blacklist_mac \"{ type ether_addr; }\"\n        \n        # 添加规则（黑名单模式：匹配到就DROP）\n        nft add rule inet timecontrol forward ip saddr @blacklist drop\n        nft add rule inet timecontrol forward ip6 saddr @blacklist6 drop\n        nft add rule inet timecontrol forward ether saddr @blacklist_mac drop\n        \n        # 强控制模式\n        if [ \"$StrongCHAIN\" -eq 1 ]; then\n            nft add chain inet timecontrol input \"{ type filter hook input priority -100; policy accept; }\"\n            nft add rule inet timecontrol input ip saddr @blacklist drop\n            nft add rule inet timecontrol input ip6 saddr @blacklist6 drop\n            nft add rule inet timecontrol input ether saddr @blacklist_mac drop\n            dbg \"已启用强控制模式 (INPUT链)\"\n        fi\n        \n        info \"nftables初始化完成\"\n        \n    elif [ -n \"$iptables_ver\" ]; then\n        # 使用iptables\n        dbg \"初始化iptables\"\n        \n        # 创建ipset（如果不存在）\n        ipset create timecontrol_blacklist hash:net 2>/dev/null || {\n            ipset flush timecontrol_blacklist\n            dbg \"已存在的ipset timecontrol_blacklist已清空\"\n        }\n        \n        ipset create timecontrol_blacklist6 hash:net family inet6 2>/dev/null || {\n            ipset flush timecontrol_blacklist6\n            dbg \"已存在的ipset timecontrol_blacklist6已清空\"\n        }\n        \n        # 删除可能存在的旧规则\n        iptables -D FORWARD -m set --match-set timecontrol_blacklist src -j DROP 2>/dev/null\n        ip6tables -D FORWARD -m set --match-set timecontrol_blacklist6 src -j DROP 2>/dev/null\n        \n        # 添加新规则（黑名单模式）\n        iptables -I FORWARD -m set --match-set timecontrol_blacklist src -j DROP\n        ip6tables -I FORWARD -m set --match-set timecontrol_blacklist6 src -j DROP\n        \n        dbg \"已添加FORWARD规则\"\n        \n        # 强控制模式\n        if [ \"$StrongCHAIN\" -eq 1 ]; then\n            iptables -D INPUT -m set --match-set timecontrol_blacklist src -j DROP 2>/dev/null\n            ip6tables -D INPUT -m set --match-set timecontrol_blacklist6 src -j DROP 2>/dev/null\n            \n            iptables -I INPUT -m set --match-set timecontrol_blacklist src -j DROP\n            ip6tables -I INPUT -m set --match-set timecontrol_blacklist6 src -j DROP\n            \n            dbg \"已启用强控制模式 (INPUT链)\"\n        fi\n        \n        info \"iptables初始化完成\"\n    fi\n    \n    return 0\n}\n\n# 停止防火墙规则\nstop_firewall() {\n    info \"停止防火墙规则\"\n    \n    if [ -n \"$nftables_ver\" ]; then\n        nft delete table inet timecontrol 2>/dev/null && info \"nftables规则已删除\"\n    fi\n    \n    if [ -n \"$iptables_ver\" ]; then\n        # 删除iptables规则\n        iptables -D FORWARD -m set --match-set timecontrol_blacklist src -j DROP 2>/dev/null\n        iptables -D INPUT -m set --match-set timecontrol_blacklist src -j DROP 2>/dev/null\n        ip6tables -D FORWARD -m set --match-set timecontrol_blacklist6 src -j DROP 2>/dev/null\n        ip6tables -D INPUT -m set --match-set timecontrol_blacklist6 src -j DROP 2>/dev/null\n        \n        # 删除ipset\n        ipset destroy timecontrol_blacklist 2>/dev/null\n        ipset destroy timecontrol_blacklist6 2>/dev/null\n        \n        info \"iptables规则已删除\"\n    fi\n    \n    # 清理ID列表\n    rm -f \"$IDLIST\"\n}\n\n# 添加设备到防火墙\nadd_device() {\n    local id=\"$1\"\n    local target=$(config_t_get device mac \"$id\")\n    [ -z \"$target\" ] && {\n        dbg \"添加设备失败: ID $id 的目标地址为空\"\n        return\n    }\n    \n    local comment=$(config_t_get device comment \"$id\" \"设备$id\")\n    info \"添加设备到防火墙: $comment ($target)\"\n    \n    local parsed_result=$(parse_target \"$target\")\n    if [ $? -ne 0 ]; then\n        info \"添加失败: 无法解析地址 $target\"\n        return\n    fi\n    \n    IFS=':' read -r type subtype value <<< \"$parsed_result\"\n    dbg \"解析结果: type=$type, subtype=$subtype, value=$value\"\n    \n    if [ -n \"$nftables_ver\" ]; then\n        # nftables处理\n        case \"$type\" in\n            \"ipv4\")\n                nft add element inet timecontrol blacklist \"{ $value }\" 2>&1 | while read line; do dbg \"nft: $line\"; done\n                dbg \"已添加到nftables黑名单(IPv4): $value\"\n                ;;\n            \"ipv6\")\n                nft add element inet timecontrol blacklist6 \"{ $value }\" 2>&1 | while read line; do dbg \"nft: $line\"; done\n                dbg \"已添加到nftables黑名单(IPv6): $value\"\n                ;;\n            \"mac\")\n                nft add element inet timecontrol blacklist_mac \"{ $value }\" 2>&1 | while read line; do dbg \"nft: $line\"; done\n                dbg \"已添加到nftables黑名单(MAC): $value\"\n                ;;\n        esac\n        \n    elif [ -n \"$iptables_ver\" ]; then\n        # iptables处理\n        case \"$type\" in\n            \"ipv4\")\n                ipset add timecontrol_blacklist \"$value\" 2>&1 | while read line; do dbg \"ipset: $line\"; done\n                dbg \"已添加到ipset黑名单(IPv4): $value\"\n                ;;\n            \"ipv6\")\n                ipset add timecontrol_blacklist6 \"$value\" 2>&1 | while read line; do dbg \"ipset: $line\"; done\n                dbg \"已添加到ipset黑名单(IPv6): $value\"\n                ;;\n            \"mac\")\n                # iptables不支持MAC地址直接过滤，记录日志\n                info \"警告: iptables不支持MAC地址过滤，设备 $target 可能无法被阻止\"\n                ;;\n        esac\n    fi\n    \n    # 强控制模式清理连接\n    if [ \"$StrongCHAIN\" -eq 1 ]; then\n        dbg \"强控制模式，清理现有连接\"\n        flush_connections \"$target\"\n    fi\n    \n    # 验证规则\n    verify_firewall_rule \"$target\"\n}\n\n# 验证防火墙规则\nverify_firewall_rule() {\n    local target=\"$1\"\n    \n    dbg \"验证防火墙规则: $target\"\n    \n    if [ -n \"$nftables_ver\" ]; then\n        nft list table inet timecontrol 2>/dev/null | grep -q \"$target\" && {\n            dbg \"验证成功: $target 在nftables规则中\"\n            return 0\n        }\n    elif [ -n \"$iptables_ver\" ]; then\n        ipset test timecontrol_blacklist \"$target\" 2>/dev/null && {\n            dbg \"验证成功: $target 在ipset中\"\n            return 0\n        }\n    fi\n    \n    dbg \"验证失败: $target 不在防火墙规则中\"\n    return 1\n}\n\n# 从防火墙移除设备\ndel_device() {\n    local id=\"$1\"\n    local target=$(config_t_get device mac \"$id\")\n    [ -z \"$target\" ] && {\n        dbg \"移除设备失败: ID $id 的目标地址为空\"\n        return\n    }\n    \n    local comment=$(config_t_get device comment \"$id\" \"设备$id\")\n    info \"从防火墙移除设备: $comment ($target)\"\n    \n    local parsed_result=$(parse_target \"$target\")\n    [ $? -eq 0 ] || {\n        info \"移除失败: 无法解析地址 $target\"\n        return\n    }\n    \n    IFS=':' read -r type subtype value <<< \"$parsed_result\"\n    \n    if [ -n \"$nftables_ver\" ]; then\n        case \"$type\" in\n            \"ipv4\")\n                nft delete element inet timecontrol blacklist \"{ $value }\" 2>/dev/null\n                dbg \"已从nftables移除(IPv4): $value\"\n                ;;\n            \"ipv6\")\n                nft delete element inet timecontrol blacklist6 \"{ $value }\" 2>/dev/null\n                dbg \"已从nftables移除(IPv6): $value\"\n                ;;\n            \"mac\")\n                nft delete element inet timecontrol blacklist_mac \"{ $value }\" 2>/dev/null\n                dbg \"已从nftables移除(MAC): $value\"\n                ;;\n        esac\n        \n    elif [ -n \"$iptables_ver\" ]; then\n        case \"$type\" in\n            \"ipv4\")\n                ipset del timecontrol_blacklist \"$value\" 2>/dev/null\n                dbg \"已从ipset移除(IPv4): $value\"\n                ;;\n            \"ipv6\")\n                ipset del timecontrol_blacklist6 \"$value\" 2>/dev/null\n                dbg \"已从ipset移除(IPv6): $value\"\n                ;;\n        esac\n    fi\n}\n\n# 显示防火墙状态\nshow_firewall_status() {\n    echo \"\"\n    echo \"防火墙状态:\"\n    echo \"控制模式: $list_type\"\n    echo \"控制强度: $chain $( [ \"$StrongCHAIN\" -eq 1 ] && echo \"(强控制)\" )\"\n    echo \"\"\n    \n    if [ -n \"$nftables_ver\" ]; then\n        echo \"nftables规则:\"\n        nft list table inet timecontrol 2>/dev/null || echo \"  未找到timecontrol表\"\n    elif [ -n \"$iptables_ver\" ]; then\n        echo \"iptables规则:\"\n        echo \"FORWARD链:\"\n        iptables -L FORWARD -n | grep -i timecontrol || echo \"  未找到timecontrol规则\"\n        ip6tables -L FORWARD -n | grep -i timecontrol || echo \"  未找到IPv6 timecontrol规则\"\n        \n        if [ \"$StrongCHAIN\" -eq 1 ]; then\n            echo \"\"\n            echo \"INPUT链:\"\n            iptables -L INPUT -n | grep -i timecontrol || echo \"  未找到timecontrol规则\"\n            ip6tables -L INPUT -n | grep -i timecontrol || echo \"  未找到IPv6 timecontrol规则\"\n        fi\n        \n        echo \"\"\n        echo \"ipset内容:\"\n        ipset list timecontrol_blacklist 2>/dev/null | head -20 || echo \"  timecontrol_blacklist未找到\"\n        echo \"\"\n        ipset list timecontrol_blacklist6 2>/dev/null | head -20 || echo \"  timecontrol_blacklist6未找到\"\n    fi\n}\n\n# 诊断函数\ndiagnose() {\n    echo \"\"\n    echo \"=== 时间控制系统诊断 ===\"\n    echo \"\"\n    \n    # 检查服务\n    echo \"1. 服务状态:\"\n    if ps | grep -q \"timecontrolctrl\"; then\n        echo \"   ✓ timecontrolctrl 正在运行\"\n    else\n        echo \"   ✗ timecontrolctrl 未运行\"\n    fi\n    \n    # 检查配置文件\n    echo \"\"\n    echo \"2. 配置文件:\"\n    if [ -f \"/etc/config/timecontrol\" ]; then\n        echo \"   ✓ 配置文件存在\"\n        uci show timecontrol 2>/dev/null | grep -c \"device\" | while read count; do\n            echo \"   配置了 $count 个设备\"\n        done\n    else\n        echo \"   ✗ 配置文件不存在\"\n    fi\n    \n    # 检查防火墙工具\n    echo \"\"\n    echo \"3. 防火墙工具:\"\n    if [ -x \"$bin_nft\" ]; then\n        echo \"   ✓ nftables: $bin_nft\"\n        echo \"   版本: $($bin_nft --version 2>/dev/null | head -1)\"\n    elif [ -x \"$bin_iptables\" ]; then\n        echo \"   ✓ iptables: $bin_iptables\"\n        echo \"   版本: $($bin_iptables --version 2>/dev/null | head -1)\"\n    else\n        echo \"   ✗ 未找到防火墙工具\"\n    fi\n    \n    # 显示当前规则\n    show_firewall_status\n    \n    # 检查ID列表\n    echo \"\"\n    echo \"4. 当前控制列表:\"\n    if [ -f \"$IDLIST\" ] && [ -s \"$IDLIST\" ]; then\n        echo \"   当前禁止的设备:\"\n        cat \"$IDLIST\" | sed 's/!//g' | while read id; do\n            local target=$(config_t_get device mac \"$id\")\n            local comment=$(config_t_get device comment \"$id\" \"设备$id\")\n            echo \"   ID$id: $comment ($target)\"\n        done\n    else\n        echo \"   当前没有设备被禁止\"\n    fi\n    \n    echo \"\"\n    echo \"=== 诊断完成 ===\"\n}\n\n# 主命令处理\ncase \"$crrun\" in\n    \"start\")\n        info \"启动时间控制\"\n        stop_firewall\n        init_firewall\n        if [ $? -eq 0 ]; then\n            info \"时间控制启动成功\"\n            show_firewall_status\n        else\n            info \"时间控制启动失败\"\n        fi\n        ;;\n        \n    \"stop\")\n        info \"停止时间控制\"\n        stop_firewall\n        info \"时间控制已停止\"\n        ;;\n        \n    \"add\")\n        [ -z \"$crid\" ] && {\n            echo \"错误: 需要指定设备ID\"\n            exit 1\n        }\n        info \"添加设备控制: ID=$crid\"\n        add_device \"$crid\"\n        show_firewall_status\n        ;;\n        \n    \"del\")\n        [ -z \"$crid\" ] && {\n            echo \"错误: 需要指定设备ID\"\n            exit 1\n        }\n        info \"移除设备控制: ID=$crid\"\n        del_device \"$crid\"\n        show_firewall_status\n        ;;\n        \n    \"status\")\n        show_firewall_status\n        ;;\n        \n    \"diagnose\")\n        diagnose\n        ;;\n        \n    \"test\")\n        # 测试地址解析\n        echo \"测试地址解析:\"\n        for test in \"192.168.1.100\" \"192.168.1.0/24\" \"00:11:22:33:44:55\" \"invalid\"; do\n            echo -n \"$test: \"\n            if parse_target \"$test\" >/dev/null; then\n                echo \"✓ 有效\"\n                parse_target \"$test\"\n            else\n                echo \"✗ 无效\"\n            fi\n        done\n        ;;\n        \n    \"flush\")\n        # 清理所有连接\n        info \"清理所有连接\"\n        if [ -x \"$bin_conntrack\" ]; then\n            $bin_conntrack -F\n            info \"连接已清理\"\n        else\n            info \"conntrack不可用\"\n        fi\n        ;;\n        \n    \"help\"|\"\")\n        echo \"时间控制系统命令工具\"\n        echo \"\"\n        echo \"用法: $0 {start|stop|add <id>|del <id>|status|diagnose|test|flush|help}\"\n        echo \"\"\n        echo \"命令说明:\"\n        echo \"  start           - 初始化防火墙规则\"\n        echo \"  stop            - 停止并清理所有防火墙规则\"\n        echo \"  add <id>        - 添加设备到控制列表\"\n        echo \"  del <id>        - 从控制列表移除设备\"\n        echo \"  status          - 显示防火墙状态\"\n        echo \"  diagnose        - 系统诊断\"\n        echo \"  test            - 测试地址解析\"\n        echo \"  flush           - 清理所有网络连接\"\n        echo \"  help            - 显示此帮助信息\"\n        ;;\n        \n    *)\n        echo \"错误: 未知命令 '$crrun'\"\n        echo \"使用: $0 help 查看帮助\"\n        exit 1\n        ;;\nesac\n"
  },
  {
    "path": "luci-app-timecontrol/luci-app-timecontrol/root/usr/bin/timecontrol-log",
    "content": "#!/bin/bash\n\n# 时间控制日志查看工具\n\nNAME=timecontrol\nLOG_FILE=\"/var/log/$NAME.log\"\nSTATUS_LOG=\"/var/lib/$NAME/status.log\"\nCONNECTION_LOG=\"/var/lib/$NAME/connections.log\"\n\nshow_realtime_log() {\n    echo \"正在显示实时日志，按 Ctrl+C 退出...\"\n    echo \"\"\n    tail -f \"$LOG_FILE\" | while read line; do\n        # 高亮显示重要信息\n        if echo \"$line\" | grep -q \"STATUS-CHANGE\\|TIME_EXCEEDED\\|RESET\"; then\n            echo -e \"\\033[1;31m$line\\033[0m\"  # 红色显示重要变更\n        elif echo \"$line\" | grep -q \"ALLOW_ACCESS\\|解除限制\"; then\n            echo -e \"\\033[1;32m$line\\033[0m\"  # 绿色显示允许访问\n        elif echo \"$line\" | grep -q \"BLOCK_ACCESS\\|添加限制\"; then\n            echo -e \"\\033[1;33m$line\\033[0m\"  # 黄色显示禁止访问\n        else\n            echo \"$line\"\n        fi\n    done\n}\n\nshow_status_log() {\n    echo \"最近状态变更记录:\"\n    echo \"────────────────────────────────────────────────────────────────────\"\n    if [ -f \"$STATUS_LOG\" ]; then\n        tail -n 20 \"$STATUS_LOG\" | while read line; do\n            local time=$(echo \"$line\" | cut -d']' -f1 | sed 's/\\[//')\n            local message=$(echo \"$line\" | cut -d']' -f2-)\n            printf \"%-20s %s\\n\" \"$time\" \"$message\"\n        done\n    else\n        echo \"暂无状态记录\"\n    fi\n}\n\nshow_connection_log() {\n    echo \"设备连接记录:\"\n    echo \"────────────────────────────────────────────────────────────────────\"\n    echo \"时间                 设备             状态\"\n    echo \"────────────────────────────────────────────────────────────────────\"\n    \n    if [ -f \"$CONNECTION_LOG\" ]; then\n        tail -n 20 \"$CONNECTION_LOG\" | while read line; do\n            local timestamp=$(echo \"$line\" | cut -d',' -f1)\n            local target=$(echo \"$line\" | cut -d',' -f2)\n            local action=$(echo \"$line\" | cut -d',' -f3)\n            \n            local time_str=$(date -d \"@$timestamp\" '+%Y-%m-%d %H:%M:%S' 2>/dev/null || echo \"$timestamp\")\n            local action_text=\"\"\n            \n            case \"$action\" in\n                \"connect\") action_text=\"上线\" ;;\n                \"disconnect\") action_text=\"下线\" ;;\n                *) action_text=\"$action\" ;;\n            esac\n            \n            printf \"%-20s %-18s %s\\n\" \"$time_str\" \"$target\" \"$action_text\"\n        done\n    else\n        echo \"暂无连接记录\"\n    fi\n}\n\nshow_summary() {\n    local summary_file=\"/tmp/timecontrol_status.txt\"\n    if [ -f \"$summary_file\" ]; then\n        cat \"$summary_file\"\n    else\n        echo \"状态摘要文件不存在，正在生成...\"\n        timecontrol status\n    fi\n}\n\nshow_help() {\n    echo \"时间控制日志查看工具\"\n    echo \"\"\n    echo \"用法: timecontrol-log {realtime|status|connections|summary|help}\"\n    echo \"\"\n    echo \"命令:\"\n    echo \"  realtime    - 实时显示日志（彩色高亮）\"\n    echo \"  status      - 显示状态变更记录\"\n    echo \"  connections - 显示设备连接记录\"\n    echo \"  summary     - 显示状态摘要\"\n    echo \"  help        - 显示此帮助\"\n    echo \"\"\n    echo \"示例:\"\n    echo \"  timecontrol-log realtime    # 实时监控\"\n    echo \"  timecontrol-log status      # 查看状态变更\"\n}\n\ncase \"$1\" in\n    \"realtime\")\n        show_realtime_log\n        ;;\n    \"status\")\n        show_status_log\n        ;;\n    \"connections\")\n        show_connection_log\n        ;;\n    \"summary\")\n        show_summary\n        ;;\n    \"help\"|\"\")\n        show_help\n        ;;\n    *)\n        echo \"未知命令: $1\"\n        show_help\n        exit 1\n        ;;\nesac\n"
  },
  {
    "path": "luci-app-timecontrol/luci-app-timecontrol/root/usr/bin/timecontrolctrl",
    "content": "#!/bin/sh\n\n# Copyright (C) 2006 OpenWrt.org\n# Copyright 2022-2026 sirpdboy <herboy2008@gmail.com>\n\nNAME=timecontrol\nLOG_FILE=\"/var/log/timecontrol.log\"\nDEBUG=1\n\n# 时长数据库目录\nDURATION_DIR=\"/var/lib/timecontrol\"\nDURATION_DB=\"$DURATION_DIR/duration.db\"\nCONNECTION_LOG=\"$DURATION_DIR/connections.log\"\n\n# 状态文件\nIDLIST=\"/var/$NAME.idlist\"\nSTATUS_DB=\"$DURATION_DIR/status.db\"\n\n# 初始化目录\ninit_dirs() {\n    mkdir -p \"$DURATION_DIR\"\n    touch \"$DURATION_DB\" \"$CONNECTION_LOG\" \"$STATUS_DB\" 2>/dev/null\n}\n\n# 日志函数\ndbg() {\n    [ \"$DEBUG\" -eq 1 ] && {\n        local d=\"$(date '+%Y-%m-%d %H:%M:%S')\"\n        echo \"[$d] CTRL-DEBUG: $@\" >> \"$LOG_FILE\"\n    }\n}\n\ninfo() {\n    local d=\"$(date '+%Y-%m-%d %H:%M:%S')\"\n    echo \"[$d] CTRL-INFO: $@\" >> \"$LOG_FILE\"\n}\n\n# 配置文件读取\nconfig_t_get() {\n    local index=${3:-0}\n    local ret=$(uci -q get \"${NAME}.@${1}[${index}].${2}\")\n    echo \"${ret:=${4}}\"\n}\n\n# 获取启用设备\nget_enabled_devices() {\n    uci show $NAME 2>/dev/null | grep \"enable='1'\" | grep \"device\" | grep -oE '\\[.*?\\]' | grep -o '[0-9]' | sort -n\n}\n\n# 时间检查函数\nis_time_in_range() {\n    local start_time=$1\n    local end_time=$2\n    local current_time=$(date +%H:%M)\n\n    if [ \"$start_time\" = \"$end_time\" ]; then\n        return 0\n    elif [ \"$start_time\" \\< \"$end_time\" ]; then\n        [ \"$current_time\" \\> \"$start_time\" ] && [ \"$current_time\" \\< \"$end_time\" ] && return 0\n    else\n        [ \"$current_time\" \\> \"$start_time\" ] || [ \"$current_time\" \\< \"$end_time\" ] && return 0\n    fi\n    return 1\n}\n\nis_weekday_in_range() {\n    local configured_weekdays=$1\n    local current_weekday=$(date +%u)\n\n    [ \"$configured_weekdays\" = \"0\" ] && return 0\n    \n    for ww in $(echo $configured_weekdays | sed 's/,/ /g'); do\n        [ \"$current_weekday\" = \"$ww\" ] && return 0\n    done\n    return 1\n}\n\n# 时长管理\nrecord_connection_time() {\n    local target=\"$1\"\n    local action=\"$2\"\n    local timestamp=$(date +%s)\n    \n    echo \"$timestamp,$target,$action\" >> \"$CONNECTION_LOG\"\n    \n    if [ \"$action\" = \"connect\" ]; then\n        if ! grep -q \"^$target,\" \"$DURATION_DB\" 2>/dev/null; then\n            echo \"$target,$timestamp,0,0\" >> \"$DURATION_DB\"\n            dbg \"初始化时长: $target\"\n        fi\n    elif [ \"$action\" = \"disconnect\" ]; then\n        if grep -q \"^$target,\" \"$DURATION_DB\" 2>/dev/null; then\n            local last_connect=$(grep \"^$target,\" \"$DURATION_DB\" | cut -d',' -f2)\n            local total_used=$(grep \"^$target,\" \"$DURATION_DB\" | cut -d',' -f3)\n            local last_reset=$(grep \"^$target,\" \"$DURATION_DB\" | cut -d',' -f4)\n            \n            local session_duration=$((timestamp - last_connect))\n            local new_total=$((total_used + session_duration))\n            \n            sed -i \"/^$target,/d\" \"$DURATION_DB\"\n            echo \"$target,$timestamp,$new_total,$last_reset\" >> \"$DURATION_DB\"\n        fi\n    fi\n}\n\nget_connection_time() {\n    local target=\"$1\"\n    local current_time=$(date +%s)\n    \n    if grep -q \"^$target,\" \"$DURATION_DB\" 2>/dev/null; then\n        local last_connect=$(grep \"^$target,\" \"$DURATION_DB\" | cut -d',' -f2)\n        local total_used=$(grep \"^$target,\" \"$DURATION_DB\" | cut -d',' -f3)\n        \n        if tail -n 5 \"$CONNECTION_LOG\" 2>/dev/null | grep -q \"^[0-9]*,$target,connect$\"; then\n            local session_duration=$((current_time - last_connect))\n            total_used=$((total_used + session_duration))\n        fi\n        \n        echo \"$total_used\"\n    else\n        echo \"0\"\n    fi\n}\n\n# 重置检查\nshould_reset_duration() {\n    local target=\"$1\"\n    local reset_cycle=\"$2\"\n    local last_reset_file=\"$DURATION_DIR/last_reset_$target\"\n    \n    [ ! -f \"$last_reset_file\" ] && return 0\n    \n    local last_reset=$(cat \"$last_reset_file\" 2>/dev/null)\n    local current_time=$(date +%s)\n    \n    case \"$reset_cycle\" in\n        \"daily\")\n            local last_date=$(date -d \"@$last_reset\" +%Y%m%d 2>/dev/null || echo \"0\")\n            local current_date=$(date +%Y%m%d)\n            [ \"$last_date\" != \"$current_date\" ]\n            ;;\n        \"weekly\")\n            local last_week=$(date -d \"@$last_reset\" +%Y%W 2>/dev/null || echo \"0\")\n            local current_week=$(date +%Y%W)\n            [ \"$last_week\" != \"$current_week\" ]\n            ;;\n        \"monthly\")\n            local last_month=$(date -d \"@$last_reset\" +%Y%m 2>/dev/null || echo \"0\")\n            local current_month=$(date +%Y%m)\n            [ \"$last_month\" != \"$current_month\" ]\n            ;;\n        *)\n            false\n            ;;\n    esac\n}\n\nreset_duration_counter() {\n    local target=\"$1\"\n    local reset_cycle=\"$2\"\n    local current_time=$(date +%s)\n    \n    if grep -q \"^$target,\" \"$DURATION_DB\" 2>/dev/null; then\n        sed -i \"/^$target,/d\" \"$DURATION_DB\"\n    fi\n    \n    echo \"$target,$current_time,0,$current_time\" >> \"$DURATION_DB\"\n    echo \"$current_time\" > \"$DURATION_DIR/last_reset_$target\"\n    \n    info \"重置时长: $target (周期: $reset_cycle)\"\n}\n\n# 主检查函数\ncheck_device_control() {\n    local id=\"$1\"\n    local target=$(config_t_get device mac \"$id\")\n    local time_mode=$(config_t_get device time_mode \"$id\" \"period\")\n    local weekdays=$(config_t_get device week \"$id\" \"0\")\n    \n    # 检查星期\n    is_weekday_in_range \"$weekdays\" || {\n        dbg \"星期不允许: $target\"\n        return 1\n    }\n    \n    case \"$time_mode\" in\n        \"period\")\n            local start_time=$(config_t_get device timestart \"$id\" \"00:00\")\n            local end_time=$(config_t_get device timeend \"$id\" \"00:00\")\n            is_time_in_range \"$start_time\" \"$end_time\" || {\n                dbg \"时间段外: $target ($start_time-$end_time)\"\n                return 1\n            }\n            dbg \"时间段内: $target\"\n            return 0\n            ;;\n            \n        \"duration\")\n            local duration=$(config_t_get device duration \"$id\" \"60\")\n            local reset_cycle=$(config_t_get device reset_cycle \"$id\" \"daily\")\n            \n            # 重置检查\n            if should_reset_duration \"$target\" \"$reset_cycle\"; then\n                reset_duration_counter \"$target\" \"$reset_cycle\"\n            fi\n            \n            # 记录连接\n            local last_action=$(grep \",$target,\" \"$CONNECTION_LOG\" 2>/dev/null | tail -1 | cut -d',' -f3)\n            if [ \"$last_action\" != \"connect\" ]; then\n                record_connection_time \"$target\" \"connect\"\n            fi\n            \n            # 检查时长\n            local used_seconds=$(get_connection_time \"$target\")\n            local used_minutes=$((used_seconds / 60))\n            local max_minutes=$duration\n            \n            dbg \"时长检查: $target 已用=${used_minutes}分钟, 限制=${max_minutes}分钟\"\n            \n            if [ \"$used_minutes\" -ge \"$max_minutes\" ]; then\n                dbg \"已超时: $target\"\n                return 1\n            fi\n            dbg \"未超时: $target\"\n            return 0\n            ;;\n            \n        \"combined\")\n            local start_time=$(config_t_get device timestart \"$id\" \"00:00\")\n            local end_time=$(config_t_get device timeend \"$id\" \"00:00\")\n            local use_duration=$(config_t_get device use_duration \"$id\" \"0\")\n            \n            # 时间段检查\n            is_time_in_range \"$start_time\" \"$end_time\" || {\n                dbg \"时间段外: $target\"\n                return 1\n            }\n            \n            # 时长检查\n            if [ \"$use_duration\" = \"1\" ]; then\n                local duration=$(config_t_get device duration \"$id\" \"60\")\n                local reset_cycle=$(config_t_get device reset_cycle \"$id\" \"daily\")\n                \n                if should_reset_duration \"$target\" \"$reset_cycle\"; then\n                    reset_duration_counter \"$target\" \"$reset_cycle\"\n                fi\n                \n                local last_action=$(grep \",$target,\" \"$CONNECTION_LOG\" 2>/dev/null | tail -1 | cut -d',' -f3)\n                if [ \"$last_action\" != \"connect\" ]; then\n                    record_connection_time \"$target\" \"connect\"\n                fi\n                \n                local used_seconds=$(get_connection_time \"$target\")\n                local used_minutes=$((used_seconds / 60))\n                local max_minutes=$duration\n                \n                if [ \"$used_minutes\" -ge \"$max_minutes\" ]; then\n                    dbg \"时间段内但已超时: $target\"\n                    return 1\n                fi\n            fi\n            \n            dbg \"时间段内允许: $target\"\n            return 0\n            ;;\n            \n        *)\n            # 默认时间段控制\n            local start_time=$(config_t_get device timestart \"$id\" \"00:00\")\n            local end_time=$(config_t_get device timeend \"$id\" \"00:00\")\n            is_time_in_range \"$start_time\" \"$end_time\"\n            return $?\n            ;;\n    esac\n}\n\n# 更新设备状态\nupdate_device_status() {\n    local id=\"$1\"\n    local should_allow=\"$2\"  # 0=允许, 1=禁止\n    local target=$(config_t_get device mac \"$id\")\n    local comment=$(config_t_get device comment \"$id\" \"设备$id\")\n    \n    # 检查当前状态\n    local current_blocked=0\n    if [ -f \"$IDLIST\" ] && grep -q \"!${id}!\" \"$IDLIST\" 2>/dev/null; then\n        current_blocked=1\n    fi\n    \n    dbg \"设备状态: $target, 应该允许=$should_allow, 当前阻止=$current_blocked\"\n    \n    if [ \"$should_allow\" -eq 0 ]; then\n        # 应该允许\n        if [ \"$current_blocked\" -eq 1 ]; then\n            dbg \"解除阻止: $target\"\n            timecontrol del \"$id\"\n            sed -i \"/!$id!/d\" \"$IDLIST\" 2>/dev/null\n            info \"允许上网: $comment ($target)\"\n            record_connection_time \"$target\" \"disconnect\"\n        fi\n    else\n        # 应该阻止\n        if [ \"$current_blocked\" -eq 0 ]; then\n            dbg \"添加阻止: $target\"\n            timecontrol add \"$id\"\n            if ! grep -q \"!$id!\" \"$IDLIST\" 2>/dev/null; then\n                echo \"!$id!\" >> \"$IDLIST\"\n            fi\n            info \"阻止上网: $comment ($target)\"\n            record_connection_time \"$target\" \"disconnect\"\n        fi\n    fi\n}\n\n# 主处理循环\nmain_loop() {\n    info \"时间控制守护进程启动\"\n    init_dirs\n    while :; do\n        dbg \"开始检查设备\"\n        [ `uci show $NAME 2>/dev/null | grep \"enable='1'\" | grep \"device\" | grep -oE '\\[.*?\\]' | grep -o '[0-9]' | sort -n | wc -l` eq 0 ] && timecontrol stop && break\n        for id in $(get_enabled_devices); do\n            if check_device_control \"$id\"; then\n                update_device_status \"$id\" 0  # 允许\n            else\n                update_device_status \"$id\" 1  # 阻止\n            fi\n        done\n        \n        sleep 60\n    done\n}\n\n# 启动\nmain_loop\n"
  },
  {
    "path": "luci-app-timecontrol/luci-app-timecontrol/root/usr/libexec/timecontrol-call",
    "content": "#!/bin/sh\n#\n# Copyright (C) 2025 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-timecontrol\n# \n\nlogfile=\"/var/log/timecontrol.log\"\nlang=$(uci get luci.main.lang 2>/dev/null)\nif [ -z \"$lang\" ] || [[ \"$lang\" == \"auto\" ]]; then\n\tlang=$(echo \"${LANG:-${LANGUAGE:-${LC_ALL:-${LC_MESSAGES:-zh_cn}}}}\" | awk -F'[ .@]' '{print tolower($1)}' | sed 's/-/_/' 2>/dev/null)\nfi\n\ntranslate() {\n\t# 处理特殊字符\n\tlocal lua_script=$(cat <<LUA\n\trequire \"luci.i18n\".setlanguage(\"$lang\")\n\tprint(require \"luci.i18n\".translate([==[$1]==]))\nLUA\n\t)\n\n\tlua -e \"$lua_script\"\n}\n\nif [ \"$1\" == \"clear_log\" ]; then\n\t# 清空日志\n\t>\"${logfile}\"\n\nelif [ \"$1\" == \"child\" ]; then\n\tshift\n\tcommand_name=$1\n\tshift\n\t\"$command_name\" \"$@\"\nfi\n"
  },
  {
    "path": "luci-app-timecontrol/luci-app-timecontrol/root/usr/share/luci/menu.d/luci-app-timecontrol.json",
    "content": "{\n  \"admin/control/timecontrol\": {\n    \"title\": \"Time Control\",\n    \"order\": 10,\n    \"action\": {\n      \"type\": \"firstchild\"\n    },\n    \"acl\": [ \"read\" ], \n    \"depends\": {\n      \"acl\": [ \"luci-app-timecontrol\" ]\n    },\n    \"recurse\": true\n  },\n  \"admin/control/timecontrol/basic\": {\n\t\t\"title\": \"Time Control\",\n\t\t\"order\": 10,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"timecontrol/basic\"\n    },\n    \"acl\": [ \"read\" ]\n  },\n  \"admin/control/timecontrol/log\": {\n    \"title\": \"Log\",\n    \"order\": 40,\n    \"action\": {\n      \"type\": \"view\",\n      \"path\": \"timecontrol/log\"\n    },\n    \"acl\": [ \"read\" ]\n  }\n}\n"
  },
  {
    "path": "luci-app-timecontrol/luci-app-timecontrol/root/usr/share/rpcd/acl.d/luci-app-timecontrol.json",
    "content": "{\n   \"luci-app-timecontrol\": {\n\t\"description\": \"Grant UCI Internet time control for luci-app-timecontrol\",\n\t\"read\": {\n\n            \"ubus\": {\n\n                        \"file\": [\"exec\", \"list\", \"stat\", \"read\"],\n                        \"uci\": [ \"*\" ],\n                        \"timecontrol\": [\"*\"]\n            }\n\t},\n\t\"write\": {\n            \"ubus\": {\n                \"timecontrol\": [\"*\"],\n                \"file\": [\"write\"],\n                \"uci\": [\"*\"]\n      }\n    }\n  }\n}"
  },
  {
    "path": "luci-app-udp2raw/Makefile",
    "content": "#\n# Copyright (C) 2016-2017 Jian Chang <aa65535@live.com>\n#\n# This is free software, licensed under the GNU General Public License v3.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI Support for udp2raw-tunnel\nLUCI_DESCRIPTION:=LuCI Support for udp2raw-tunnel.\nLUCI_DEPENDS:=+udp2raw-tunnel\nLUCI_PKGARCH:=all\n\nPKG_NAME:=luci-app-udp2raw\nPKG_VERSION:=1.0.0\nPKG_RELEASE:=6\n\nPKG_LICENSE:=GPLv3\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=Jian Chang <aa65535@live.com>\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-udp2raw/luasrc/controller/udp2raw.lua",
    "content": "module(\"luci.controller.udp2raw\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/udp2raw\") then\n\t\treturn\n\tend\n\n\tlocal page = entry({\"admin\", \"services\", \"udp2raw\"},\n\t\tfirstchild(), _(\"udp2raw-tunnel\"))\n\tpage.dependent = false\n\tpage.acl_depends = { \"luci-app-udp2raw\" }\n\n\tentry({\"admin\", \"services\", \"udp2raw\", \"general\"},\n\t\tcbi(\"udp2raw/general\"), _(\"Settings\"), 1)\n\n\tentry({\"admin\", \"services\", \"udp2raw\", \"servers\"},\n\t\tarcombine(cbi(\"udp2raw/servers\"), cbi(\"udp2raw/servers-details\")),\n\t\t_(\"Servers Manage\"), 2).leaf = true\n\n\tentry({\"admin\", \"services\", \"udp2raw\", \"status\"}, call(\"action_status\"))\nend\n\nlocal function is_running(name)\n\treturn luci.sys.call(\"pidof %s >/dev/null\" %{name}) == 0\nend\n\nfunction action_status()\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json({\n\t\trunning = is_running(\"udp2raw\")\n\t})\nend\n"
  },
  {
    "path": "luci-app-udp2raw/luasrc/model/cbi/udp2raw/general.lua",
    "content": "local m, s, o\nlocal uci = luci.model.uci.cursor()\nlocal servers = {}\n\nlocal function has_bin(name)\n\treturn luci.sys.call(\"command -v %s >/dev/null\" %{name}) == 0\nend\n\nif not has_bin(\"udp2raw\") then\n\treturn Map(\"udp2raw\", \"%s - %s\" %{translate(\"udp2raw-tunnel\"),\n\t\ttranslate(\"Settings\")}, '<b style=\"color:red\">udp2raw-tunnel binary file not found. install udp2raw-tunnel package, or copy binary to /usr/bin/udp2raw manually. </b>')\nend\n\nuci:foreach(\"udp2raw\", \"servers\", function(s)\n\tif s.server_addr and s.server_port then\n\t\tservers[#servers+1] = {name = s[\".name\"], alias = s.alias or \"%s:%s\" %{s.server_addr, s.server_port}}\n\tend\nend)\n\nm = Map(\"udp2raw\", \"%s - %s\" %{translate(\"udp2raw-tunnel\"), translate(\"Settings\")})\nm:append(Template(\"udp2raw/status\"))\n\ns = m:section(NamedSection, \"general\", \"general\", translate(\"General Settings\"))\ns.anonymous = true\ns.addremove = false\n\no = s:option(DynamicList, \"server\", translate(\"Server\"))\no.template = \"udp2raw/dynamiclist\"\no:value(\"nil\", translate(\"Disable\"))\nfor _, s in ipairs(servers) do o:value(s.name, s.alias) end\no.default = \"nil\"\no.rmempty = false\n\no = s:option(ListValue, \"daemon_user\", translate(\"Run Daemon as User\"))\nfor u in luci.util.execi(\"cat /etc/passwd | cut -d ':' -f1\") do o:value(u) end\no.default = \"root\"\no.rmempty = false\n\nreturn m\n"
  },
  {
    "path": "luci-app-udp2raw/luasrc/model/cbi/udp2raw/servers-details.lua",
    "content": "local m, s, o\nlocal sid = arg[1]\n\nlocal raw_modes = {\n\t\"faketcp\",\n\t\"udp\",\n\t\"icmp\",\n}\n\nlocal cipher_modes = {\n\t\"aes128cbc\",\n\t\"xor\",\n\t\"none\",\n}\n\nlocal auth_modes = {\n\t\"md5\",\n\t\"crc32\",\n\t\"simple\",\n\t\"none\",\n}\n\nm = Map(\"udp2raw\", \"%s - %s\" %{translate(\"udp2raw-tunnel\"), translate(\"Edit Server\")})\nm.redirect = luci.dispatcher.build_url(\"admin/services/udp2raw/servers\")\nm.sid = sid\n\nif m.uci:get(\"udp2raw\", sid) ~= \"servers\" then\n\tluci.http.redirect(m.redirect)\n\treturn\nend\n\ns = m:section(NamedSection, sid, \"servers\")\ns.anonymous = true\ns.addremove = false\n\no = s:option(Value, \"alias\", translate(\"Alias(optional)\"))\n\no = s:option(Value, \"server_addr\", translate(\"Server\"))\no.datatype = \"host\"\no.rmempty = false\n\no = s:option(Value, \"server_port\", translate(\"Server Port\"))\no.datatype = \"port\"\no.placeholder = \"8080\"\n\no = s:option(Value, \"listen_addr\", translate(\"Local Listen Host\"))\no.datatype = \"ipaddr\"\no.placeholder = \"127.0.0.1\"\n\no = s:option(Value, \"listen_port\", translate(\"Local Listen Port\"))\no.datatype = \"port\"\no.placeholder = \"2080\"\n\no = s:option(ListValue, \"raw_mode\", translate(\"Raw Mode\"))\nfor _, v in ipairs(raw_modes) do o:value(v, v:lower()) end\no.default = \"faketcp\"\no.rmempty = false\n\no = s:option(Value, \"key\", translate(\"Password\"))\no.password = true\n\no = s:option(ListValue, \"cipher_mode\", translate(\"Cipher Mode\"))\nfor _, v in ipairs(cipher_modes) do o:value(v, v:lower()) end\no.default = \"aes128cbc\"\n\no = s:option(ListValue, \"auth_mode\", translate(\"Auth Mode\"))\nfor _, v in ipairs(auth_modes) do o:value(v, v:lower()) end\no.default = \"md5\"\n\no = s:option(Flag, \"auto_rule\", translate(\"Auto Rule\"), translate(\"Auto add (and delete) iptables rule.\"))\no.default = \"1\"\n\no = s:option(Flag, \"keep_rule\", translate(\"Keep Rule\"), translate(\"Monitor iptables and auto re-add if necessary.\"))\no:depends(\"auto_rule\", \"1\")\n\no = s:option(Value, \"seq_mode\", translate(\"seq Mode\"), translate(\"seq increase mode for faketcp.\"))\no.datatype = \"range(0,4)\"\no.placeholder = \"3\"\n\no = s:option(Value, \"lower_level\", translate(\"Lower Level\"), translate(\"Send packets at OSI level 2, format: \\\"eth0#00:11:22:33:44:55\\\", or \\\"auto\\\".\"))\n\no = s:option(Value, \"source_ip\", translate(\"Source-IP\"), translate(\"Force source-ip for Raw Socket.\"))\no.datatype = \"ipaddr\"\n\no = s:option(Value, \"source_port\", translate(\"Source-Port\"), translate(\"Force source-port for Raw Socket, TCP/UDP only.\"))\no.datatype = \"port\"\n\no = s:option(Value, \"log_level\", translate(\"Log Level\"))\no.datatype = \"range(0,6)\"\no.placeholder = \"4\"\n\nreturn m\n"
  },
  {
    "path": "luci-app-udp2raw/luasrc/model/cbi/udp2raw/servers.lua",
    "content": "local m, s, o\n\nm = Map(\"udp2raw\", \"%s - %s\" %{translate(\"udp2raw-tunnel\"), translate(\"Servers Manage\")})\n\ns = m:section(TypedSection, \"servers\")\ns.anonymous = true\ns.addremove = true\ns.sortable = true\ns.template = \"cbi/tblsection\"\ns.extedit = luci.dispatcher.build_url(\"admin/services/udp2raw/servers/%s\")\nfunction s.create(...)\n\tlocal sid = TypedSection.create(...)\n\tif sid then\n\t\tluci.http.redirect(s.extedit % sid)\n\t\treturn\n\tend\nend\n\no = s:option(DummyValue, \"alias\", translate(\"Alias\"))\nfunction o.cfgvalue(...)\n\treturn Value.cfgvalue(...) or translate(\"None\")\nend\n\no = s:option(DummyValue, \"_server_address\", translate(\"Server Address\"))\nfunction o.cfgvalue(self, section)\n\tlocal server_addr = m.uci:get(\"udp2raw\", section, \"server_addr\") or \"?\"\n\tlocal server_port = m.uci:get(\"udp2raw\", section, \"server_port\") or \"8080\"\n\treturn \"%s:%s\" %{server_addr, server_port}\nend\n\no = s:option(DummyValue, \"_listen_address\", translate(\"Listen Address\"))\nfunction o.cfgvalue(self, section)\n\tlocal listen_addr = m.uci:get(\"udp2raw\", section, \"listen_addr\") or \"127.0.0.1\"\n\tlocal listen_port = m.uci:get(\"udp2raw\", section, \"listen_port\") or \"2080\"\n\treturn \"%s:%s\" %{listen_addr, listen_port}\nend\n\no = s:option(DummyValue, \"raw_mode\", translate(\"Raw Mode\"))\nfunction o.cfgvalue(...)\n\tlocal v = Value.cfgvalue(...)\n\treturn v and v:lower() or \"faketcp\"\nend\n\no = s:option(DummyValue, \"cipher_mode\", translate(\"Cipher Mode\"))\nfunction o.cfgvalue(...)\n\tlocal v = Value.cfgvalue(...)\n\treturn v and v:lower() or \"aes128cbc\"\nend\n\no = s:option(DummyValue, \"auth_mode\", translate(\"Auth Mode\"))\nfunction o.cfgvalue(...)\n\tlocal v = Value.cfgvalue(...)\n\treturn v and v:lower() or \"md5\"\nend\n\nreturn m\n"
  },
  {
    "path": "luci-app-udp2raw/luasrc/view/udp2raw/dynamiclist.htm",
    "content": "<%#\n Copyright (C) 2017 Jian Chang <aa65535@live.com>\n Licensed to the public under the GNU General Public License v3.\n-%>\n\n<%+cbi/valueheader%>\n\n<%-\n\tlocal values = self:formvalue(section)\n\tif not values then\n\t\tvalues = self:cfgvalue(section) or {self.default}\n\tend\n\n\tlocal function serialize_json(x, cb)\n\t\tlocal rv, push = nil, cb\n\t\tif not push then\n\t\t\trv = { }\n\t\t\tpush = function(tok) rv[#rv+1] = tok end\n\t\tend\n\n\t\tif x == nil then\n\t\t\tpush(\"null\")\n\t\telseif type(x) == \"table\" then\n\t\t\tpush(\"[\")\n\t\t\tfor k = 1, #x do\n\t\t\t\tif k > 1 then\n\t\t\t\t\tpush(\",\")\n\t\t\t\tend\n\t\t\t\tserialize_json(x[k], push)\n\t\t\tend\n\t\t\tpush(\"]\")\n\t\telse\n\t\t\tpush('\"%s\"' % tostring(x):gsub('[\"%z\\1-\\31\\\\]',\n\t\t\t\tfunction(c) return '\\\\u%04x' % c:byte(1) end))\n\t\tend\n\n\t\tif not cb then\n\t\t\treturn table.concat(rv, \"\")\n\t\tend\n\tend\n-%>\n\n<div<%=attr(\"id\", cbid .. \".value.field\")%>></div>\n<script type=\"text/javascript\">//<![CDATA[\n\t(function() {\n\t\tvar values = <%=serialize_json(values)%>;\n\t\tvar keylist = <%=serialize_json(self.keylist)%>;\n\t\tvar vallist = <%=serialize_json(self.vallist)%>;\n\t\tvar parent = document.getElementById(\"<%=cbid%>.value.field\");\n\n\t\tvar dynamiclist_cbi_init = function() {\n\t\t\twhile (parent.firstChild) {\n\t\t\t\tparent.removeChild(parent.firstChild);\n\t\t\t}\n\n\t\t\tfor (var i = 0; i < values.length; i++) {\n\t\t\t\tvar sel = document.createElement(\"select\");\n\t\t\t\tsel.id = \"<%=cbid%>.\" + (i + 1);\n\t\t\t\tsel.name = \"<%=cbid%>\";\n\t\t\t\tsel.index = i;\n\t\t\t\tsel.className = \"cbi-input-select\";\n\t\t\t\tsel.onchange = function() {\n\t\t\t\t\tvalues[this.index] = this.value;\n\t\t\t\t};\n\t\t\t\tparent.appendChild(sel);\n\n\t\t\t\tfor (var j = 0; j < keylist.length; j++) {\n\t\t\t\t\tvar opt = document.createElement(\"option\");\n\t\t\t\t\topt.value = keylist[j];\n\t\t\t\t\tif (opt.value == values[i]) {\n\t\t\t\t\t\topt.selected = \"selected\";\n\t\t\t\t\t}\n\t\t\t\t\topt.appendChild(document.createTextNode(vallist[j]));\n\t\t\t\t\tsel.appendChild(opt);\n\t\t\t\t}\n\n\t\t\t\tvar btn = document.createElement('img');\n\t\t\t\tbtn.src = \"<%=resource%>\" + ((i + 1) < values.length ? \"/cbi/remove.gif\" : \"/cbi/add.gif\");\n\t\t\t\tbtn.index = i;\n\t\t\t\tbtn.className = 'cbi-image-button';\n\t\t\t\tbtn.onclick = function() {\n\t\t\t\t\tif (this.src.indexOf('remove') > -1) {\n\t\t\t\t\t\tvalues.splice(this.index, 1);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tvalues.push(\"<%=self.default%>\");\n\t\t\t\t\t}\n\t\t\t\t\tdynamiclist_cbi_init();\n\t\t\t\t\treturn false;\n\t\t\t\t};\n\t\t\t\tparent.appendChild(btn);\n\t\t\t\tparent.appendChild(document.createElement('br'));\n\t\t\t}\n\t\t};\n\t\tdynamiclist_cbi_init();\n\t}());\n//]]></script>\n\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "luci-app-udp2raw/luasrc/view/udp2raw/status.htm",
    "content": "\n<fieldset class=\"cbi-section\">\n\t<legend><%:Running Status%></legend>\n\t<table width=\"100%\" cellspacing=\"10\" id=\"_udp2raw_status_table\">\n\t\t<tr>\n\t\t\t<td width=\"33%\"><%:Binary Version%></td>\n\t\t\t<td>\n\t\t\t\t<% if udp2raw_version == \"\" then -%>\n\t\t\t\t<em><%:Invalid Binary File.%></em>\n\t\t\t\t<% else -%>\n\t\t\t\t<%=pcdata(udp2raw_version)%>\n\t\t\t\t<%- end %>\n\t\t\t</td>\n\t\t</tr>\n\t\t<% if udp2raw_build ~= \"\" then -%>\n\t\t<tr><td width=\"33%\"><%:Build Time%></td><td><%=pcdata(udp2raw_build)%></td></tr>\n\t\t<% end -%>\n\t\t<tr><td width=\"33%\"><%:Running Status%></td><td id=\"_udp2raw_status\"><em><%:Collecting data...%></em></td></tr>\n\t</table>\n</fieldset>\n\n<script type=\"text/javascript\">//<![CDATA[\n\tvar udp2raw_status = document.getElementById('_udp2raw_status');\n\tXHR.poll(5, '<%=luci.dispatcher.build_url(\"admin\", \"services\", \"udp2raw\", \"status\")%>', null, function(x, status) {\n\t\tif ( x && x.status == 200 ) {\n\t\t\tudp2raw_status.innerHTML = status.running ? '<%:RUNNING%>' : '<%:NOT RUNNING%>';\n\t\t}\n\t});\n//]]></script>\n"
  },
  {
    "path": "luci-app-udp2raw/po/zh_Hans/udp2raw.po",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\\n\"\n\nmsgid \"udp2raw-tunnel\"\nmsgstr \"udp2raw 隧道\"\n\nmsgid \"Settings\"\nmsgstr \"设置\"\n\nmsgid \"Servers Manage\"\nmsgstr \"服务器管理\"\n\nmsgid \"Running Status\"\nmsgstr \"运行状态\"\n\nmsgid \"Binary Version\"\nmsgstr \"文件版本\"\n\nmsgid \"Build Time\"\nmsgstr \"编译时间\"\n\nmsgid \"Invalid Binary File.\"\nmsgstr \"可执行文件无效。\"\n\nmsgid \"RUNNING\"\nmsgstr \"运行中\"\n\nmsgid \"NOT RUNNING\"\nmsgstr \"未运行\"\n\nmsgid \"General Settings\"\nmsgstr \"基本设置\"\n\nmsgid \"Server\"\nmsgstr \"服务器\"\n\nmsgid \"Disable\"\nmsgstr \"停用\"\n\nmsgid \"Run Daemon as User\"\nmsgstr \"以该用户启动\"\n\nmsgid \"Alias\"\nmsgstr \"别名\"\n\nmsgid \"None\"\nmsgstr \"无\"\n\nmsgid \"Server Address\"\nmsgstr \"服务器地址\"\n\nmsgid \"Listen Address\"\nmsgstr \"监听地址\"\n\nmsgid \"Edit Server\"\nmsgstr \"编辑服务器\"\n\nmsgid \"Alias(optional)\"\nmsgstr \"别名(可选)\"\n\nmsgid \"Server Port\"\nmsgstr \"服务器端口\"\n\nmsgid \"Local Listen Host\"\nmsgstr \"本地监听地址\"\n\nmsgid \"Local Listen Port\"\nmsgstr \"本地监听端口\"\n\nmsgid \"Raw Mode\"\nmsgstr \"Raw 方式\"\n\nmsgid \"Password\"\nmsgstr \"密码\"\n\nmsgid \"Cipher Mode\"\nmsgstr \"加密方式\"\n\nmsgid \"Auth Mode\"\nmsgstr \"验证方式\"\n\nmsgid \"Auto Rule\"\nmsgstr \"自动规则\"\n\nmsgid \"Auto add (and delete) iptables rule.\"\nmsgstr \"自动添加/删除 iptables 规则。\"\n\nmsgid \"Keep Rule\"\nmsgstr \"保持规则\"\n\nmsgid \"Monitor iptables and auto re-add if necessary.\"\nmsgstr \"定期检查 iptables 并在必要时重新添加规则。\"\n\nmsgid \"seq Mode\"\nmsgstr \"seq 模式\"\n\nmsgid \"seq increase mode for faketcp.\"\nmsgstr \"用于 faketcp 的 seq 增加方式。\"\n\nmsgid \"Lower Level\"\nmsgstr \"\"\n\nmsgid \"Send packets at OSI level 2, format: \\\"eth0#00:11:22:33:44:55\\\", or \\\"auto\\\".\"\nmsgstr \"在 OSI 模型第二层发送数据包，格式：\\\"eth0#00:11:22:33:44:55\\\"，或 \\\"auto\\\"。\"\n\nmsgid \"Source-IP\"\nmsgstr \"源IP\"\n\nmsgid \"Force source-ip for Raw Socket.\"\nmsgstr \"在原始数据包中强制指定源IP。\"\n\nmsgid \"Source-Port\"\nmsgstr \"源端口\"\n\nmsgid \"Force source-port for Raw Socket, TCP/UDP only.\"\nmsgstr \"在原始数据包中强制指定源端口，仅用于 TCP/UDP。\"\n\nmsgid \"Log Level\"\nmsgstr \"日志级别\"\n\n"
  },
  {
    "path": "luci-app-udp2raw/root/etc/config/udp2raw",
    "content": "\nconfig general 'general'\n\tlist server 'nil'\n\toption daemon_user 'root'\n\nconfig servers 'default'\n\toption server_addr ''\n\toption server_port '8080'\n\toption listen_addr '127.0.0.1'\n\toption listen_port '2080'\n\toption raw_mode 'faketcp'\n\toption key ''\n\toption cipher_mode 'aes128cbc'\n\toption auth_mode 'md5'\n\toption auto_rule '1'\n\n"
  },
  {
    "path": "luci-app-udp2raw/root/etc/init.d/udp2raw",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=88\nSTOP=15\nUSE_PROCD=1\n\nNAME=udp2raw\n\n_log() {\n\tlogger -p \"daemon.$1\" -t \"$NAME\" \"$2\"\n}\n\nhas_valid_server() {\n\tlocal server\n\tfor server in $@; do\n\t\t[ \"$(uci_get $NAME $server)\" = \"servers\" ] && return 0\n\tdone\n\treturn 1\n}\n\nadd_ipt_rule() {\n\tif [ -z \"$ipt_cmd\" ]; then\n\t\tcommand -v iptables >/dev/null 2>&1 || return 1\n\t\tipt_cmd='iptables'\n\t\t[ -n \"$(iptables -h 2> /dev/null | grep -e '--wait')\" ] && ipt_cmd=\"$ipt_cmd --wait\"\n\t\techo \"# firewall include file\" > \"/var/etc/$NAME.include\"\n\telse\n\t\techo \"$ipt_cmd\" | grep -q -e '--wait'\n\t\t[ $? -ne 0 ] && sleep 2\n\tfi\n\n\t$ipt_cmd -I INPUT -s \"$server_addr\"/32 -p tcp -m tcp --sport \"$server_port\" -m comment --comment \"${NAME}DwrW\" -j DROP\n}\n\nflush_ipt_rules() {\n\tiptables-save -c | grep -v \"${NAME}DwrW\" | iptables-restore -c\n\t[ -f \"/var/etc/$NAME.include\" ] && rm -f \"/var/etc/$NAME.include\"\n}\n\nexport_ipt_rules() {\n\t[ -f \"/var/etc/$NAME.include\" ] || return\n\tcat <<-CAT >> \"/var/etc/$NAME.include\"\n\tiptables-save -c | grep -v \"${NAME}DwrW\" | iptables-restore -c\n\tiptables-restore -n <<-EOF\n\t$(iptables-save -t filter | grep -E \"${NAME}DwrW|^\\*|^COMMIT\" | sed 's/^-A /-I /')\n\tEOF\nCAT\n}\n\ncreate_config() {\n\tlocal config_file=\"$1\"\n\techo \"# auto-generated config file from /etc/config/udp2raw\" > $config_file\n\n\techo \"-c\" >> $config_file\n\techo \"-l ${listen_addr}:${listen_port}\" >> $config_file && _log \"info\" \"listening on: ${listen_addr}:${listen_port}\"\n\techo \"-r ${server_addr}:${server_port}\" >> $config_file\n\n\t[ -n \"$raw_mode\" ] && echo \"--raw-mode ${raw_mode}\" >> $config_file && _log \"info\" \"raw-mode: ${raw_mode}\"\n\t[ -n \"$key\" ] && echo \"--key ${key}\" >> $config_file\n\t[ -n \"$cipher_mode\" ] && echo \"--cipher-mode ${cipher_mode}\" >> $config_file\n\t[ -n \"$auth_mode\" ] && echo \"--auth-mode ${auth_mode}\" >> $config_file\n\n\t[ $auto_rule -eq 1 -a $keep_rule -eq 1 ] && echo \"--auto-rule\" >> $config_file\n\t[ $auto_rule -eq 1 -a $keep_rule -eq 1 ] && echo \"--keep-rule\" >> $config_file\n\n\t[ -n \"$seq_mode\" ] && echo \"--seq-mode ${seq_mode}\" >> $config_file\n\t[ -n \"$lower_level\" ] && echo \"--lower-level ${lower_level}\" >> $config_file\n\t[ -n \"$source_ip\" ] && echo \"--source-ip ${source_ip}\" >> $config_file\n\t[ -n \"$source_port\" ] && echo \"--source-port ${source_port}\" >> $config_file\n\techo \"--retry-on-error\" >> $config_file\n\n\t[ -n \"$log_level\" ] && echo \"--log-level ${log_level}\" >> $config_file\n\techo \"--disable-color\" >> $config_file\n}\n\nvalidate_config_section() {\n\tuci_validate_section \"$NAME\" general \"$1\" \\\n\t\t'server:uciname' \\\n\t\t'daemon_user:string:root'\n}\n\nvalidate_server_section() {\n\tuci_validate_section \"$NAME\" servers \"$1\" \\\n\t\t'server_addr:host' \\\n\t\t'server_port:port:8080' \\\n\t\t'listen_addr:ipaddr:127.0.0.1' \\\n\t\t'listen_port:port:2080' \\\n\t\t'raw_mode:or(\"faketcp\", \"udp\", \"icmp\"):faketcp' \\\n\t\t'key:string' \\\n\t\t'cipher_mode:or(\"aes128cbc\", \"xor\", \"none\"):aes128cbc' \\\n\t\t'auth_mode:or(\"md5\", \"crc32\", \"simple\", \"none\"):md5' \\\n\t\t'auto_rule:bool:1' \\\n\t\t'keep_rule:bool:0' \\\n\t\t'seq_mode:range(0,4)' \\\n\t\t'lower_level:string' \\\n\t\t'source_ip:ipaddr' \\\n\t\t'source_port:port' \\\n\t\t'log_level:range(0,6)'\n}\n\nstart_instance() {\n\tlocal server=\"$1\"\n\n\tif [ -z \"$server\" -o \"$server\" == \"nil\" ]; then\n\t\treturn 0\n\telif ! validate_server_section \"$server\"; then\n\t\t_log \"err\" \"Server config validation failed.\"\n\t\treturn 1\n\tfi\n\n\t/sbin/validate_data \"ipaddr\" \"$server_addr\" >/dev/null 2>&1\n\t[ $? -ne 0 ] && server_addr=$(nslookup \"$server_addr\" | \\\n\t\tsed -n 's/^Address[[:space:]]*[0-9]*:[[:space:]]*\\(\\([0-9]\\{1,3\\}\\.\\)\\{3\\}[0-9]\\{1,3\\}\\)$/\\1/p')\n\tif [ -z \"$server_addr\" ]; then\n\t\t_log \"err\" \"Server address validation failed.\"\n\t\treturn 1\n\tfi\n\n\t[ -d /var/etc ] || mkdir -p /var/etc\n\tlocal config_file=\"/var/etc/${NAME}.${server}.conf\"\n\tcreate_config \"$config_file\" || return 1\n\n\tif [ $auto_rule -eq 1 -a $keep_rule -ne 1 ]; then\n\t\tadd_ipt_rule || { _log \"err\" \"added iptables rule failed.\"; return 1; }\n\tfi\n\n\tprocd_open_instance\n\tprocd_set_param command /usr/bin/udp2raw\n\tprocd_append_param command --conf-file \"$config_file\"\n\tprocd_set_param respawn\n\tprocd_set_param file \"$config_file\"\n\t[ -n \"$daemon_user\" ] && procd_set_param user \"$daemon_user\" && _log \"info\" \"running from ${daemon_user} user\"\n\tprocd_set_param pidfile \"/var/run/${NAME}.${server}.pid\"\n\tprocd_close_instance\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"$NAME\"\n}\n\nstart_service() {\n\tif ! validate_config_section \"general\" ; then\n\t\t_log \"err\" \"Config validate failed.\"\n\t\treturn 1\n\tfi\n\thas_valid_server $server || return 1\n\tflush_ipt_rules\n\tfor srv in $server; do\n\t\tstart_instance $srv\n\tdone\n\texport_ipt_rules\n}\n\nstop_service() {\n\tflush_ipt_rules\n}\n"
  },
  {
    "path": "luci-app-udp2raw/root/etc/uci-defaults/luci-udp2raw",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF > /dev/null\n\tdelete ucitrack.@udp2raw[-1]\n\tadd ucitrack udp2raw\n\tset ucitrack.@udp2raw[-1].init=udp2raw\n\tcommit ucitrack\n\tdelete firewall.udp2raw\n\tset firewall.udp2raw=include\n\tset firewall.udp2raw.type=script\n\tset firewall.udp2raw.path=/var/etc/udp2raw.include\n\tset firewall.udp2raw.reload=1\n\tcommit firewall\nEOF\n\ngeneral=$(uci -q get udp2raw.@general[-1])\nif [ -z \"$general\" ]; then\n\tuci -q add udp2raw general\nfi\nif [ \"$general\"x != \"general\"x ]; then\n\tuci -q batch <<-EOF > /dev/null\n\t\trename udp2raw.@general[-1]=\"general\"\n\t\tset udp2raw.@general[-1].server=\"nil\"\n\t\tcommit udp2raw\n\tEOF\nfi\n\nrm -rf /tmp/luci-indexcache /tmp/luci-modulecache\nexit 0\n"
  },
  {
    "path": "luci-app-udp2raw/root/usr/share/rpcd/acl.d/luci-app-udp2raw.json",
    "content": "{\n\t\"luci-app-udp2raw\": {\n\t\t\"description\": \"Grant UCI access for luci-app-udp2raw\",\n\t\t\"read\": {\n\t\t\t\"uci\": [ \"udp2raw\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"uci\": [ \"udp2raw\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-unblockneteasemusic/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2019-2022 Tianling Shen <cnsztl@immortalwrt.org>\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for UnblockNeteaseMusic (JavaScript)\nLUCI_DEPENDS:=+dnsmasq-full +node \\\n\t+PACKAGE_firewall:ipset \\\n\t@(PACKAGE_libustream-mbedtls||PACKAGE_libustream-openssl||PACKAGE_libustream-wolfssl)\nLUCI_PKGARCH:=all\n\nPKG_NAME:=luci-app-unblockneteasemusic\nPKG_VERSION:=3.4\nPKG_RELEASE:=1\n\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\n\ndefine Package/luci-app-unblockneteasemusic/conffiles\n/etc/config/unblockneteasemusic\n/usr/share/unblockneteasemusic/core/\n/usr/share/unblockneteasemusic/core_local_ver\n/usr/share/unblockneteasemusic/server.crt\n/usr/share/unblockneteasemusic/server.key\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-unblockneteasemusic/htdocs/luci-static/resources/view/unblockneteasemusic/config.js",
    "content": "/* SPDX-License-Identifier: GPL-3.0-only\n *\n * Copyright (C) 2022-2023 ImmortalWrt.org\n */\n\n'use strict';\n'require form';\n'require fs';\n'require network';\n'require poll';\n'require rpc';\n'require uci';\n'require ui';\n'require view';\n\nvar callServiceList = rpc.declare({\n\tobject: 'service',\n\tmethod: 'list',\n\tparams: ['name'],\n\texpect: { '': {} }\n});\n\nfunction getServiceStatus() {\n\treturn L.resolveDefault(callServiceList('unblockneteasemusic'), {}).then(function (res) {\n\t\tvar isRunning = false;\n\t\ttry {\n\t\t\tisRunning = res['unblockneteasemusic']['instances']['unblockneteasemusic']['running'];\n\t\t} catch (e) { }\n\t\treturn isRunning;\n\t});\n}\n\nfunction renderStatus(isRunning) {\n\tvar spanTemp = '<em><span style=\"color:%s\"><strong>%s %s</strong></span></em>';\n\tvar renderHTML;\n\tif (isRunning) {\n\t\trenderHTML = spanTemp.format('green', _('UnblockNeteaseMusic'), _('运行中'));\n\t} else {\n\t\trenderHTML = spanTemp.format('red', _('UnblockNeteaseMusic'), _('未运行'));\n\t}\n\n\treturn renderHTML;\n}\n\nfunction uploadCertificate(type, filename, ev) {\n\treturn ui.uploadFile('/usr/share/unblockneteasemusic/' + filename, ev.target)\n\t.then(L.bind(function(btn, res) {\n\t\tbtn.firstChild.data = _('检查 %s 中...').format(type);\n\n\t\tif (res.size <= 0) {\n\t\t\tui.addNotification(null, E('p', _('上传的 %s 为空。').format(tyupe)));\n\t\t\treturn fs.remove('/usr/share/unblockneteasemusic/' + filename);\n\t\t}\n\n\t\tui.addNotification(null, E('p', _('您的 %s 已成功上传。大小：%sB。').format(type, res.size)));\n\t}, this, ev.target))\n\t.catch(function(e) { ui.addNotification(null, E('p', e.message)) })\n\t.finally(L.bind(function(btn, input) {\n\t\tbtn.firstChild.data = _('上传...');\n\t}, this, ev.target));\n}\n\nreturn view.extend({\n\tload: function() {\n\t\treturn Promise.all([\n\t\t\tuci.load('unblockneteasemusic'),\n\t\t\tnetwork.getHostHints()\n\t\t]);\n\t},\n\n\trender: function(data) {\n\t\tvar m, s, o;\n\t\tvar hosts = data[1]?.hosts;\n\n\t\tm = new form.Map('unblockneteasemusic', _('解除网易云音乐播放限制'),\n\t\t\t_('原理：采用 [Bilibili/JOOX/酷狗/酷我/咪咕/pyncmd/QQ/Youtube] 等音源，替换网易云音乐 无版权/收费 歌曲链接<br/>' +\n\t\t\t'具体使用方法参见：<a href=\"https://github.com/UnblockNeteaseMusic/luci-app-unblockneteasemusic\" target=\"_blank\">GitHub @UnblockNeteaseMusic/luci-app-unblockneteasemusic</a>'));\n\n\t\ts = m.section(form.TypedSection);\n\t\ts.anonymous = true;\n\t\ts.render = function () {\n\t\t\tpoll.add(function () {\n\t\t\t\treturn L.resolveDefault(getServiceStatus()).then(function (res) {\n\t\t\t\t\tvar view = document.getElementById('service_status');\n\t\t\t\t\tview.innerHTML = renderStatus(res);\n\t\t\t\t});\n\t\t\t});\n\n\t\t\treturn E('div', { class: 'cbi-section', id: 'status_bar' }, [\n\t\t\t\t\tE('p', { id: 'service_status' }, _('收集数据中...'))\n\t\t\t]);\n\t\t}\n\n\t\ts = m.section(form.NamedSection, 'config', 'unblockneteasemusic');\n\n\t\to = s.option(form.Flag, 'enable', _('启用服务'));\n\t\to.default = o.disabled;\n\t\to.rmempty = false;\n\n\t\to = s.option(form.DynamicList, 'music_source', _('音源接口'),\n\t\t\t_('留空以使用默认音源。'));\n\t\to.value('bilibili', _('Bilibili 音乐'));\n\t\to.value('bilivideo', _('Bilibili 音乐 (bilivideo)'));\n\t\to.value('bodian', _('波点音乐'));\n\t\to.value('joox', _('JOOX 音乐'));\n\t\to.value('kugou', _('酷狗音乐'));\n\t\to.value('kuwo', _('酷我音乐'));\n\t\to.value('migu', _('咪咕音乐'));\n\t\to.value('pyncmd', _('网易云音乐（pyncmd）'));\n\t\to.value('qq', _('QQ 音乐'));\n\t\to.value('youtube', _('Youtube 音乐'));\n\t\to.value('youtubedl', _('Youtube 音乐（youtube-dl）'));\n\t\to.value('ytdlp', _('Youtube 音乐（yt-dlp）'));\n\t\to.renderWidget = function(/* ... */) {\n\t\t\tlet dl = form.DynamicList.prototype.renderWidget.apply(this, arguments);\n\t\t\tdl?.querySelector('.add-item ul > li[data-value=\"-\"]')?.remove();\n\t\t\treturn dl;\n\t\t}\n\n\t\to = s.option(form.Value, 'joox_cookie', _('JOOX Cookie'),\n\t\t\t_('在 joox.com 获取，需要 wmid 和 session_key 值。'));\n\t\to.placeholder = 'wmid=; session_key=';\n\t\to.password = true;\n\t\to.rmempty = false;\n\t\to.depends({'music_source': 'joox', '!contains': true});\n\n\t\to = s.option(form.Value, 'migu_cookie', _('Migu Cookie'),\n\t\t\t_('通过抓包手机客户端请求获取，需要 aversionid 值。'));\n\t\to.password = true;\n\t\to.depends({'music_source': 'migu', '!contains': true});\n\n\t\to = s.option(form.Value, 'qq_cookie', _('QQ Cookie'),\n\t\t\t_('在 y.qq.com 获取，需要 uin 和 qm_keyst 值。'));\n\t\to.placeholder = 'uin=; qm_keyst=';\n\t\to.password = true;\n\t\to.rmempty = false;\n\t\to.depends({'music_source': 'qq', '!contains': true});\n\n\t\to = s.option(form.Value, 'youtube_key', _('Youtube API Key'),\n\t\t\t_('API Key 申请地址：https://developers.google.com/youtube/v3/getting-started#before-you-start'));\n\t\to.password = true;\n\t\to.depends({'music_source': 'youtube', '!contains': true});\n\n\t\to = s.option(form.Flag, 'follow_source_order', _('顺序查询'),\n\t\t\t_('默认为并行查询并返回第一个结果，开启后将严格按照配置音源的顺序进行查询。'))\n\t\to.default = o.disabled;\n\n\t\to = s.option(form.Flag, 'search_album', _('附加专辑名'),\n\t\t\t_('在其他音源搜索歌曲时携带专辑名称（默认搜索条件 <code>歌曲名 - 歌手</code>，启用后搜索条件 <code>歌曲名 - 歌手 专辑名</code>）。'));\n\t\to.default = o.disabled;\n\n\t\to = s.option(form.Flag, 'enable_flac', _('启用无损音质'),\n\t\t\t_('目前仅支持酷狗、酷我、咪咕、pyncmd、QQ 音源。'));\n\t\to.default = o.disabled;\n\t\to.depends('music_source', []);\n\t\to.depends({'music_source': 'kugou', '!contains': true});\n\t\to.depends({'music_source': 'kuwo', '!contains': true});\n\t\to.depends({'music_source': 'migu', '!contains': true});\n\t\to.depends({'music_source': 'pyncmd', '!contains': true});\n\t\to.depends({'music_source': 'qq', '!contains': true});\n\n\t\to = s.option(form.Flag, 'select_max_br', _('选取最高音质'),\n\t\t\t_('选择所有音源中的最高码率替换音频。'));\n\t\to.default = o.disabled;\n\t\to.depends('enable_flac', '1');\n\n\t\to = s.option(form.ListValue, 'replace_music_source', _('音源替换'),\n\t\t\t_('当源音乐音质低于指定数值时，尝试强制使用其他平台的高音质版本进行替换。'));\n\t\to.value('dont_replace', _('不强制替换音乐音源'));\n\t\to.value('lower_than_192kbps', _('当音质低于 192 Kbps（中）时'));\n\t\to.value('lower_than_320kbps', _('当音质低于 320 Kbps（高）时'));\n\t\to.value('lower_than_999kbps', _('当音质低于 999 Kbps（无损）时'));\n\t\to.value('replace_all', _('替换所有音乐音源'));\n\t\to.default = 'dont_replace';\n\n\t\to = s.option(form.Flag, 'disable_upgrade_check', _('禁用更新检查'),\n\t\t\t_('拦截网易云音乐客户端更新请求，全平台支持。'));\n\t\to.default = o.disabled;\n\n\t\to = s.option(form.Flag, 'block_ads', _('屏蔽广告'),\n\t\t\t('启用后，可屏蔽应用内<strong>部分</strong>广告。'));\n\t\to.default = o.disabled;\n\n\t\to = s.option(form.ListValue, 'local_vip', _('伪装本地 VIP'),\n\t\t\t_('设置后，可以使用去广告、个性换肤、鲸云音效等本地功能。'));\n\t\to.value('', _('禁用'));\n\t\to.value('cvip', _('CVIP'));\n\t\to.value('svip', _('SVIP'));\n\n\t\to = s.option(form.Flag, 'auto_update', _('启用自动更新'),\n\t\t\t_('启用后，每天将定时自动检查最新核心版本并更新。'));\n\t\to.default = o.disabled;\n\n\t\to = s.option(form.ListValue, 'update_time', '检查更新时间',\n\t\t\t_('设定每天自动检查更新时间。'));\n\t\tfor (var i = 0; i < 24; i++)\n\t\t\to.value(i, i + ':00');\n\t\to.default = '3';\n\t\to.depends('auto_update', '1');\n\n\t\to = s.option(form.Button, '_download_cert', _('CA 根证书'),\n\t\t\t_('Linux / iOS / MacOSX 在信任根证书后方可正常使用。'));\n\t\to.inputstyle = 'apply';\n\t\to.inputtitle = _('下载 ca.crt');\n\t\to.onclick = function() {\n\t\t\treturn fs.read_direct('/usr/share/unblockneteasemusic/core/ca.crt', 'blob').then(function(blob) {\n\t\t\t\tvar url = window.URL.createObjectURL(blob);\n\t\t\t\tvar link = E('a', { 'style': 'display:none', 'href': url, 'download': 'ca.crt' });\n\n\t\t\t\tdocument.body.appendChild(link);\n\t\t\t\tlink.click();\n\t\t\t\tdocument.body.removeChild(link);\n\t\t\t\twindow.URL.revokeObjectURL(url);\n\t\t\t}).catch(function(err) {\n\t\t\t\tui.addNotification(null, E('p', [ _('下载文件失败：%s。').format(err.message) ]));\n\t\t\t});\n\t\t}\n\n\t\to = s.option(form.Flag, 'advanced_mode', _('启用进阶设置'),\n\t\t\t_('非必要不推荐启用。'));\n\t\to.default = o.disabled,\n\n\t\to = s.option(form.ListValue, 'log_level', _('日志等级'));\n\t\to.value('debug', _('调试'));\n\t\to.value('info', _('信息（默认）'));\n\t\to.value('silent', _('静默'));\n\t\to.default = 'info';\n\t\to.depends('advanced_mode', '1');\n\n\t\to = s.option(form.Value, 'http_port', _('HTTP 监听端口'));\n\t\to.datatype = 'port';\n\t\to.default = '5200';\n\t\to.rmempty = false;\n\t\to.depends('hijack_ways', 'dont_hijack');\n\t\to.depends('hijack_ways', 'use_ipset');\n\n\t\to = s.option(form.Value, 'https_port', _('HTTPS 监听端口'));\n\t\to.datatype = 'port';\n\t\to.default = '5201';\n\t\to.rmempty = false;\n\t\to.depends('hijack_ways', 'dont_hijack');\n\t\to.depends('hijack_ways', 'use_ipset');\n\n\t\to = s.option(form.Value, 'endpoint_url', _('EndPoint'),\n\t\t\t_('音源地址反代（包装）。'));\n\t\to.default = 'https://music.163.com';\n\t\to.rmempty = false;\n\t\to.depends('advanced_mode', '1');\n\n\t\to = s.option(form.Value, 'cnrelay', _('UNM Bridge 服务器'),\n\t\t\t_('使用 UnblockNeteaseMusic 中继桥（bridge）以获取音源信息。'));\n\t\to.placeholder = 'http(s)://host:port'\n\t\to.depends('advanced_mode', '1');\n\n\t\to = s.option(form.ListValue, 'hijack_ways', _('劫持方法'),\n\t\t\t _('如果使用 Hosts 劫持，监听端口将固定为 80/443，请注意更改您的 webUI 端口。'));\n\t\to.value('dont_hijack', _('不开启劫持'));\n\t\to.value('use_ipset', _('使用 IPSet 劫持'));\n\t\to.value('use_hosts', _('使用 Hosts 劫持'));\n\t\to.default = 'dont_hijack';\n\t\to.rmempty = false;\n\t\to.depends('advanced_mode', '1');\n\n\t\to = s.option(form.Flag, 'pub_access', _('部署到公网'),\n\t\t\t_('默认仅放行局域网请求，如需提供公开访问请勾选此选项。'));\n\t\to.default = o.disabled;\n\t\to.depends('advanced_mode', '1');\n\n\t\to = s.option(form.Flag, 'strict_mode', _('启用严格模式'),\n\t\t\t_('若将服务部署到公网，则强烈建议使用严格模式，此模式下仅放行网易云音乐所属域名的请求。<br/>注意：该模式下不能使用全局代理。'));\n\t\to.default = o.disabled;\n\t\to.depends('advanced_mode', '1');\n\n\t\to = s.option(form.Value, 'netease_server_ip', _('网易云服务器 IP'));\n\t\to.datatype = 'ipaddr';\n\t\to.depends('advanced_mode', '1');\n\n\t\to = s.option(form.Value, 'proxy_server_ip', _('代理服务器地址'),\n\t\t\t_('使用代理服务器获取音乐信息。'));\n\t\to.placeholder = 'http(s)://host:port';\n\t\to.depends('advanced_mode', '1');\n\n\t\to = s.option(form.Value, 'self_issue_cert_crt', _('自签发证书公钥位置'));\n\t\to.value('/usr/share/unblockneteasemusic/core/server.crt', _('内置公钥'));\n\t\to.value('/usr/share/unblockneteasemusic/server.crt');\n\t\to.default = '/usr/share/unblockneteasemusic/core/server.crt';\n\t\to.datatype = 'file';\n\t\to.depends('advanced_mode', '1');\n\n\t\to = s.option(form.Button, '_upload_cert', _('上传公钥'));\n\t\to.inputstyle = 'action';\n\t\to.inputtitle = _('上传...');\n\t\to.depends('self_issue_cert_crt', '/usr/share/unblockneteasemusic/server.crt');\n\t\to.onclick = L.bind(uploadCertificate, this, _('公钥'), 'server.crt');\n\t\to.modalonly = true;\n\n\t\to = s.option(form.Value, 'self_issue_cert_key', _('自签发证书私钥位置'));\n\t\to.value('/usr/share/unblockneteasemusic/core/server.key', _('内置私钥'));\n\t\to.value('/usr/share/unblockneteasemusic/server.key');\n\t\to.default = '/usr/share/unblockneteasemusic/core/server.key';\n\t\to.datatype = 'file'\n\t\to.depends('advanced_mode', '1');\n\n\t\to = s.option(form.Button, '_upload_key', _('上传私钥'));\n\t\to.inputstyle = 'action';\n\t\to.inputtitle = _('上传...');\n\t\to.depends('self_issue_cert_key', '/usr/share/unblockneteasemusic/server.key');\n\t\to.onclick = L.bind(uploadCertificate, this, _('私钥'), 'server.key');\n\t\to.modalonly = true;\n\n\t\ts = m.section(form.TableSection, 'acl_rule', _('例外客户端规则'),\n\t\t\t_('可以为局域网客户端分别设置不同的例外模式。'));\n\t\ts.addremove = true;\n\t\ts.anonymous = true;\n\t\ts.sortable = true;\n\n\t\to = s.option(form.Flag, 'enable', _('启用'));\n\t\to.default = o.enabled;\n\t\to.rmempty = false;\n\n\t\to = s.option(form.Value, 'mac_addr', _('MAC 地址'));\n\t\to.datatype = 'macaddr';\n\t\tObject.keys(hosts).forEach(function(mac) {\n\t\t\tvar hint = hosts[mac].name || L.toArray(hosts[mac].ipaddrs || hosts[mac].ipv4)[0];\n\t\t\to.value(mac, hint ? '%s (%s)'.format(mac, hint) : mac);\n\t\t});\n\t\to.rmempty = false;\n\n\t\to = s.option(form.ListValue, 'filter_mode', _('规则'));\n\t\to.value('disable_all', _('不代理 HTTP 和 HTTPS'));\n\t\to.value('disable_http', _('不代理 HTTP'));\n\t\to.value('disable_https', _('不代理 HTTPS'));\n\t\to.default = 'disable_all';\n\t\to.rmempty = false;\n\n\t\treturn m.render();\n\t}\n});\n"
  },
  {
    "path": "luci-app-unblockneteasemusic/htdocs/luci-static/resources/view/unblockneteasemusic/status.js",
    "content": "/* SPDX-License-Identifier: GPL-3.0-only\n *\n * Copyright (C) 2022 ImmortalWrt.org\n */\n\n'use strict';\n'require dom';\n'require form';\n'require fs';\n'require poll';\n'require rpc';\n'require ui';\n'require view';\n\nreturn view.extend({\n\trender: function() {\n\t\tvar m, s, o;\n\n\t\tvar unm_helper = '/usr/share/unblockneteasemusic/update.sh';\n\n\t\tm = new form.Map('unblockneteasemusic');\n\n\t\ts = m.section(form.NamedSection, 'config', 'unblockneteasemusic', _('核心管理'));\n\t\ts.anonymous = true;\n\n\t\to = s.option(form.DummyValue, '_core_version', _('核心版本'));\n\t\to.cfgvalue = function() {\n\t\t\tvar _this = this;\n\t\t\tvar spanTemp = '<div style=\"color:%s;margin-top:5px;\"><strong>%s</strong></div>';\n\n\t\t\treturn fs.exec(unm_helper, [ 'check_version' ]).then(function(res) {\n\t\t\t\tif (res.code === 0)\n\t\t\t\t\t_this.default = String.format(spanTemp, 'green', res.stdout.trim());\n\t\t\t\telse if (res.code === 2)\n\t\t\t\t\t_this.default = String.format(spanTemp, 'red', _('未安装'));\n\t\t\t\telse {\n\t\t\t\t\tui.addNotification(null, E('p', [ _('获取版本信息失败：%s。').format(res) ]));\n\t\t\t\t\t_this.default = String.format(spanTemp, 'red', _('未知错误'));\n\t\t\t\t}\n\n\t\t\t\treturn null;\n\t\t\t}).catch(function(err) {\n\t\t\t\tui.addNotification(null, E('p', [ _('未知错误：%s。').format(err) ]));\n\t\t\t\t_this.default = String.format(spanTemp, 'red', _('未知错误'));\n\n\t\t\t\treturn null;\n\t\t\t});\n\t\t}\n\t\to.rawhtml = true;\n\n\t\to = s.option(form.Button, '_remove_core', _('删除核心'),\n\t\t\t_('删除核心后，需手动点击下面的按钮重新下载，有助于解决版本冲突问题。'));\n\t\to.inputstyle = 'remove';\n\t\to.onclick = function() {\n\t\t\tvar _this = this;\n\n\t\t\treturn fs.exec(unm_helper, [ 'remove_core' ]).then(function(res) {\n\t\t\t\t_this.description = '删除完毕。'\n\t\t\t\treturn _this.map.reset();\n\t\t\t}).catch(function(err) {\n\t\t\t\tui.addNotification(null, E('p', [ _('未知错误：%s。').format(err) ]));\n\t\t\t\t_this.description = '删除失败。'\n\t\t\t\treturn _this.map.reset();\n\t\t\t});\n\t\t}\n\n\t\to = s.option(form.Button, '_update_core', _('更新核心'),\n\t\t\t_('更新完毕后会自动在后台重启插件，无需手动重启。'));\n\t\to.inputstyle = 'action';\n\t\to.onclick = function() {\n\t\t\tvar _this = this;\n\n\t\t\treturn fs.exec(unm_helper, [ 'update_core' ]).then(function (res) {\n\t\t\t\tif (res.code === 0)\n\t\t\t\t\t_this.description = _('更新成功。');\n\t\t\t\telse if (res.code === 1)\n\t\t\t\t\t_this.description = _('更新失败。');\n\t\t\t\telse if (res.code === 2)\n\t\t\t\t\t_this.description = _('更新程序正在运行中。');\n\t\t\t\telse if (res.code === 3)\n\t\t\t\t\t_this.description = _('当前已是最新版本。');\n\n\t\t\t\treturn _this.map.reset();\n\t\t\t}).catch(function (err) {\n\t\t\t\tui.addNotification(null, E('p', [ _('未知错误：%s。').format(err) ]));\n\t\t\t\t_this.description = _('更新失败。');\n\t\t\t\treturn _this.map.reset();\n\t\t\t});\n\t\t}\n\n\t\to = s.option(form.Button, '_debug_log', _('调试报告'),\n\t\t\t_('若您遇到使用上的问题，请点此打印调试报告，并将其附在您的 issue 中。'));\n\t\to.inputstyle = 'action';\n\t\to.inputtitle = _('打印报告');\n\t\to.onclick = function() {\n\t\t\tvar log_modal = ui.showModal(_('打印调试报告'), [\n\t\t\t\tE('p', { 'class': 'spinning' },\n\t\t\t\t\t_('正在打印调试报告中...'))\n\t\t\t]);\n\n\t\t\treturn fs.exec_direct('/usr/bin/unm-debug', 'text').then(function (res) {\n\t\t\t\tlog_modal.removeChild(log_modal.lastChild);\n\n\t\t\t\tif (res) {\n\t\t\t\t\tlog_modal.appendChild(E('p', _('提交 issue 时，您只需附上最后的链接，无需提供整个输出。')));\n\t\t\t\t\tlog_modal.appendChild(E('textarea', {\n\t\t\t\t\t\t'id': 'content_debugLog',\n\t\t\t\t\t\t'class': 'cbi-input-textarea',\n\t\t\t\t\t\t'style': 'font-size:13px; resize: none',\n\t\t\t\t\t\t'readonly': 'readonly',\n\t\t\t\t\t\t'wrap': 'soft',\n\t\t\t\t\t\t'rows': '30'\n\t\t\t\t\t\t}, [ res.trim() ])\n\t\t\t\t\t);\n\t\t\t\t} else {\n\t\t\t\t\tlog_modal.appendChild(E('p', _('错误')));\n\t\t\t\t\tlog_modal.appendChild(E('pre', { 'class': 'errors' }, [ _('无法打印调试报告。') ]));\n\t\t\t\t}\n\n\t\t\t\tvar log_element = document.getElementById('content_debugLog') || null;\n\t\t\t\tif (log_element)\n\t\t\t\t\tlog_element.scrollTop = log_element.scrollHeight;\n\n\t\t\t\tlog_modal.appendChild(E('div', { 'class': 'right' }, [\n\t\t\t\t\tlog_element ? E('button', {\n\t\t\t\t\t\t'class': 'btn cbi-button-action',\n\t\t\t\t\t\t'click': ui.createHandlerFn(this, function() {\n\t\t\t\t\t\t\tvar links = log_element.value.match(/https:\\/\\/(litter.catbox.moe|transfer.sh)\\/.*.txt/g);\n\n\t\t\t\t\t\t\tvar textarea = document.createElement('textarea');\n\t\t\t\t\t\t\tdocument.body.appendChild(textarea);\n\n\t\t\t\t\t\t\ttextarea.style.position = 'absolute';\n\t\t\t\t\t\t\ttextarea.style.clip = 'rect(0 0 0 0)';\n\t\t\t\t\t\t\ttextarea.value = links ? links.join('\\n'): log_element.value;\n\t\t\t\t\t\t\ttextarea.select()\n\n\t\t\t\t\t\t\tdocument.execCommand('copy', true);\n\t\t\t\t\t\t\tdocument.body.removeChild(textarea);\n\t\t\t\t\t\t})\n\t\t\t\t\t}, _('复制')) : '',\n\t\t\t\t\tE('button', {\n\t\t\t\t\t\t'class': 'btn',\n\t\t\t\t\t\t'click': ui.hideModal\n\t\t\t\t\t}, _('关闭'))\n\t\t\t\t]));\n\n\t\t\t\treturn null;\n\t\t\t}).catch(function (err) {\n\t\t\t\tui.addNotification(null, E('p', _('无法打印调试报告：%s。').format(err)));\n\t\t\t\tui.hideModal();\n\n\t\t\t\treturn null;\n\t\t\t});\n\t\t}\n\n\t\to = s.option(form.DummyValue, '_logview');\n\t\to.render = function() {\n\t\t\t/* Thanks to luci-app-aria2 */\n\t\t\tvar css = '\t\t\t\t\t\\\n\t\t\t\t#log_textarea {\t\t\t\t\\\n\t\t\t\t\tpadding: 10px;\t\t\t\\\n\t\t\t\t\ttext-align: left;\t\t\\\n\t\t\t\t}\t\t\t\t\t\\\n\t\t\t\t#log_textarea pre {\t\t\t\\\n\t\t\t\t\tpadding: .5rem;\t\t\t\\\n\t\t\t\t\tword-break: break-all;\t\t\\\n\t\t\t\t\tmargin: 0;\t\t\t\\\n\t\t\t\t}\t\t\t\t\t\\\n\t\t\t\t.description {\t\t\t\t\\\n\t\t\t\t\tbackground-color: #33ccff;\t\\\n\t\t\t\t}';\n\n\t\t\tvar log_textarea = E('div', { 'id': 'log_textarea' },\n\t\t\t\tE('img', {\n\t\t\t\t\t'src': L.resource('icons/loading.gif'),\n\t\t\t\t\t'alt': _('Loading'),\n\t\t\t\t\t'style': 'vertical-align:middle'\n\t\t\t\t}, _('Collecting data...'))\n\t\t\t);\n\n\t\t\tpoll.add(L.bind(function() {\n\t\t\t\treturn fs.read('/var/run/unblockneteasemusic/run.log', 'text')\n\t\t\t\t.then(function(res) {\n\t\t\t\t\tvar log = E('pre', { 'wrap': 'pre' }, [\n\t\t\t\t\t\tres.trim() || _('当前无日志。')\n\t\t\t\t\t]);\n\n\t\t\t\t\tdom.content(log_textarea, log);\n\t\t\t\t}).catch(function(err) {\n\t\t\t\t\tif (err.toString().includes('NotFoundError'))\n\t\t\t\t\t\tvar log = E('pre', { 'wrap': 'pre' }, [\n\t\t\t\t\t\t\t_('日志文件不存在。')\n\t\t\t\t\t\t]);\n\t\t\t\t\telse\n\t\t\t\t\t\tvar log = E('pre', { 'wrap': 'pre' }, [\n\t\t\t\t\t\t\t_('未知错误：%s。').format(err)\n\t\t\t\t\t\t]);\n\n\t\t\t\t\tdom.content(log_textarea, log);\n\t\t\t\t});\n\t\t\t}));\n\n\t\t\treturn E([\n\t\t\t\tE('style', [ css ]),\n\t\t\t\tE('div', {'class': 'cbi-map'}, [\n\t\t\t\t\tE('h3', {'name': 'content'}, _('运行日志')),\n\t\t\t\t\tE('div', {'class': 'cbi-section'}, [\n\t\t\t\t\t\tlog_textarea,\n\t\t\t\t\t\tE('div', {'style': 'text-align:right'},\n\t\t\t\t\t\t\tE('small', {}, _('每 %s 秒刷新。').format(L.env.pollinterval))\n\t\t\t\t\t\t)\n\t\t\t\t\t])\n\t\t\t\t])\n\t\t\t]);\n\t\t}\n\n\t\treturn m.render();\n\t},\n\n\thandleSaveApply: null,\n\thandleSave: null,\n\thandleReset: null\n});\n"
  },
  {
    "path": "luci-app-unblockneteasemusic/root/etc/config/unblockneteasemusic",
    "content": "\nconfig unblockneteasemusic 'config'\n\toption enable '0'\n\toption disable_upgrade_check '1'\n\toption auto_update '1'\n\toption update_time '3'\n\n"
  },
  {
    "path": "luci-app-unblockneteasemusic/root/etc/init.d/unblockneteasemusic",
    "content": "#!/bin/sh /etc/rc.common\n# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2019-2023 Tianling Shen <cnsztl@immortalwrt.org>\n\nUSE_PROCD=1\n\nSTART=99\nSTOP=10\n\nNAME=\"unblockneteasemusic\"\nUNM_DIR=\"/usr/share/$NAME\"\nRUN_DIR=\"/var/run/$NAME\"\n\nIPT_N=\"iptables -t nat\"\nIPT_INPUT_RULE=\"unm_input_rule\"\nFW4=\"$(command -v fw4)\"\n\n# we don't know which is the default server, just take the first one\nDNSMASQ_UCI_CONFIG=\"$(uci -q show \"dhcp.@dnsmasq[0]\" | awk 'NR==1 {split($0, conf, /[.=]/); print conf[2]}')\"\nif [ -f \"/tmp/etc/dnsmasq.conf.$DNSMASQ_UCI_CONFIG\" ]; then\n\tDNSMASQ_DIR=\"$(awk -F '=' '/^conf-dir=/ {print $2}' \"/tmp/etc/dnsmasq.conf.$DNSMASQ_UCI_CONFIG\")\"\nelse\n\tDNSMASQ_DIR=\"/tmp/dnsmasq.d\"\nfi\n\nis_enabled() {\n\tlocal enabled\n\tconfig_get_bool enabled \"$1\" \"$2\" \"${3:-0}\"\n\tif [ \"$enabled\" -eq \"1\" ]; then\n\t\treturn 0\n\telse\n\t\treturn 1\n\tfi\n}\n\nappend_param() {\n\tprocd_append_param command \"$1\" $2\n}\n\nappend_param_arg() {\n\tlocal value\n\tconfig_get value \"$1\" \"$2\" \"$4\"\n\t[ -n \"$value\" ] && append_param \"$3\" \"$value\"\n}\n\nappend_param_env() {\n\tlocal value\n\tconfig_get value \"$1\" \"$2\" $4\n\t[ -n \"$value\" ] && procd_append_param env \"$3\"=\"$value\"\n}\n\nappend_param_boolenv() {\n\tis_enabled \"$1\" \"$2\" \"$4\" && procd_append_param env \"$3\"=\"true\"\n}\n\nappend_filter_client() {\n\tlocal cfg=\"$1\"\n\n\tis_enabled \"$cfg\" \"enable\" || return 1\n\n\tlocal mac_addr filter_mode\n\tconfig_get mac_addr \"$cfg\" \"mac_addr\"\n\tconfig_get filter_mode \"$cfg\" \"filter_mode\"\n\t[ -n \"$mac_addr\" -a -n \"$filter_mode\" ] || return 1\n\n\tcase \"${filter_mode}\" in\n\t\"disable_http\")\n\t\tif [ -n \"$FW4\" ]; then\n\t\t\tacl_http_addr=\"${acl_http_addr:+$acl_http_addr\\n}${mac_addr}\"\n\t\telse\n\t\t\tipset -! add \"acl_neteasemusic_http\" \"${mac_addr}\"\n\t\tfi\n\t\t;;\n\t\"disable_https\")\n\t\tif [ -n \"$FW4\" ]; then\n\t\t\tacl_https_addr=\"${acl_https_addr:+$acl_https_addr\\n}${mac_addr}\"\n\t\telse\n\t\t\tipset -! add \"acl_neteasemusic_https\" \"${mac_addr}\"\n\t\tfi\n\t\t;;\n\t\"disable_all\")\n\t\tif [ -n \"$FW4\" ]; then\n\t\t\tacl_http_addr=\"${acl_http_addr:+$acl_http_addr\\n}${mac_addr}\"\n\t\t\tacl_https_addr=\"${acl_https_addr:+$acl_https_addr\\n}${mac_addr}\"\n\t\telse\n\t\t\tipset -! add \"acl_neteasemusic_http\" \"${mac_addr}\"\n\t\t\tipset -! add \"acl_neteasemusic_https\" \"${mac_addr}\"\n\t\tfi\n\t\t;;\n\tesac\n}\n\nstart_service() {\n\tconfig_load \"$NAME\"\n\tis_enabled \"config\" \"enable\" || return 1\n\n\tlocal update_time\n\tconfig_get update_time \"config\" \"update_time\" \"3\"\n\tsed -i \"/$NAME/d\" /etc/crontabs/root\n\t! is_enabled \"config\" \"auto_update\" || echo -e \"0 ${update_time} * * * $UNM_DIR/update.sh update_core\" >> \"/etc/crontabs/root\"\n\t/etc/init.d/cron restart\n\n\tmkdir -p \"$RUN_DIR\"\n\t[ -s \"$UNM_DIR/core/app.js\" ] || { rm -f \"$UNM_DIR/local_ver\"; sh \"$UNM_DIR/update.sh\" \"update_core_non_restart\"; }\n\t[ -s \"$UNM_DIR/core/app.js\" ] || { echo \"Core Not Found, please download it before starting.\" >> \"$RUN_DIR/run.log\"; return 1; }\n\n\tprocd_open_instance \"$NAME\"\n\tprocd_set_param command node \"$UNM_DIR/core/app.js\"\n\tappend_param \"-a\" \"::\"\n\n\tlocal http_port https_port hijack_ways\n\tconfig_get http_port \"config\" \"http_port\" \"5200\"\n\tconfig_get https_port \"config\" \"https_port\" \"5201\"\n\tconfig_get hijack_ways \"config\" \"hijack_ways\" \"use_ipset\"\n\t[ \"$hijack_ways\" != \"use_hosts\" ] || { http_port=\"80\"; https_port=\"443\"; }\n\tappend_param \"-p\" \"${http_port}\":\"${https_port}\"\n\n\tif [ -n \"$FW4\" ]; then\n\t\tjson_init\n\t\tjson_add_int http_port \"${http_port}\"\n\t\tjson_add_int https_port \"${https_port}\"\n\t\tjson_add_string hijack_ways \"${hijack_ways}\"\n\telse\n\t\tif is_enabled \"config\" \"pub_access\"; then\n\t\t\tiptables -N \"$IPT_INPUT_RULE\"\n\t\t\tiptables -t filter -I INPUT -j \"$IPT_INPUT_RULE\"\n\t\t\tiptables -t filter -A \"$IPT_INPUT_RULE\" -p tcp --dport \"${http_port}\" -j ACCEPT\n\t\t\tiptables -t filter -A \"$IPT_INPUT_RULE\" -p tcp --dport \"${https_port}\" -j ACCEPT\n\n\t\t\techo \"/etc/init.d/$NAME restart\" > \"$RUN_DIR/fw3.include\"\n\t\tfi\n\tfi\n\n\tappend_param_arg \"config\" \"music_source\" \"-o\" \"kugou kuwo migu pyncmd\"\n\tappend_param_arg \"config\" \"cnrelay\" \"-c\"\n\tappend_param_arg \"config\" \"endpoint_url\" \"-e\" \"https://music.163.com\"\n\tappend_param_arg \"config\" \"netease_server_ip\" \"-f\"\n\tappend_param_arg \"config\" \"proxy_server_ip\" \"-u\"\n\tis_enabled \"config\" \"strict_mode\" && append_param \"-s\"\n\n\tlocal log_level\n\tconfig_get log_level \"config\" \"log_level\" \"info\"\n\tprocd_set_param env LOG_FILE=\"$RUN_DIR/run.log\"\n\tprocd_append_param env LOG_LEVEL=\"$log_level\"\n\n\tappend_param_env \"config\" \"joox_cookie\" \"JOOX_COOKIE\"\n\tappend_param_env \"config\" \"migu_cookie\" \"MIGU_COOKIE\"\n\tappend_param_env \"config\" \"qq_cookie\" \"QQ_COOKIE\"\n\tappend_param_env \"config\" \"youtube_key\" \"YOUTUBE_KEY\"\n\tappend_param_env \"config\" \"self_issue_cert_crt\" \"SIGN_CERT\" \"$UNM_DIR/core/server.crt\"\n\tappend_param_env \"config\" \"self_issue_cert_key\" \"SIGN_KEY\" \"$UNM_DIR/core/server.key\"\n\tappend_param_env \"config\" \"local_vip\" \"ENABLE_LOCAL_VIP\"\n\n\tappend_param_boolenv \"config\" \"follow_source_order\" \"FOLLOW_SOURCE_ORDER\"\n\tappend_param_boolenv \"config\" \"search_album\" \"SEARCH_ALBUM\"\n\tappend_param_boolenv \"config\" \"enable_flac\" \"ENABLE_FLAC\"\n\tappend_param_boolenv \"config\" \"select_max_br\" \"SELECT_MAX_BR\"\n\tappend_param_boolenv \"config\" \"disable_upgrade_check\" \"DISABLE_UPGRADE_CHECK\"\n\tappend_param_boolenv \"config\" \"block_ads\" \"BLOCK_ADS\"\n\tcase \"$(config_get \"config\" \"replace_music_source\")\" in\n\t\t\"lower_than_192kbps\") procd_append_param env MIN_BR=\"192000\" ;;\n\t\t\"lower_than_320kbps\") procd_append_param env MIN_BR=\"320000\" ;;\n\t\t\"lower_than_999kbps\") procd_append_param env MIN_BR=\"600000\" ;;\n\t\t\"replace_all\") procd_append_param env MIN_BR=\"9999999\" ;;\n\tesac\n\n\tprocd_set_param stdout 1\n\tprocd_set_param stderr 1\n\tprocd_set_param respawn\n\n\tlocal lan_addr=\"$(uci -q get network.lan.ipaddr)\"\n\tif [ \"${hijack_ways}\" = \"use_ipset\" ]; then\n\t\tlocal settype setname\n\t\tif [ -n \"$FW4\" ]; then\n\t\t\tsettype=\"nftset\"\n\t\t\tsetname=\"inet#fw4#neteasemusic,6#inet#fw4#neteasemusic6\"\n\t\telse\n\t\t\tsettype=\"ipset\"\n\t\t\tsetname=\"neteasemusic\"\n\t\tfi\n\t\tmkdir -p \"$DNSMASQ_DIR\"\n\t\trm -f \"$DNSMASQ_DIR/dnsmasq-$NAME.conf\"\n\t\tcat <<-EOF > \"$DNSMASQ_DIR/dnsmasq-$NAME.conf\"\n\t\t\tdhcp-option=252,http://${lan_addr}:${http_port}/proxy.pac\n\t\t\t${settype}=/.music.163.com/${setname}\n\t\t\t${settype}=/interface.music.163.com/${setname}\n\t\t\t${settype}=/interface3.music.163.com/${setname}\n\t\t\t${settype}=/apm.music.163.com/${setname}\n\t\t\t${settype}=/apm3.music.163.com/${setname}\n\t\t\t${settype}=/clientlog.music.163.com/${setname}\n\t\t\t${settype}=/clientlog3.music.163.com/${setname}\n\t\tEOF\n\t\t/etc/init.d/dnsmasq restart 2>\"/dev/null\"\n\n\t\tif [ -z \"$FW4\" ]; then\n\t\t\tipset create \"acl_neteasemusic_http\" hash:mac\n\t\t\tipset create \"acl_neteasemusic_https\" hash:mac\n\t\t\tipset create \"neteasemusic\" hash:ip timeout 7200\n\t\tfi\n\t\tconfig_foreach append_filter_client \"acl_rule\"\n\n\t\tlocal netease_music_ips=\"$(wget -T10 -qO- \"http://httpdns.n.netease.com/httpdns/v2/d?domain=music.163.com,interface.music.163.com,interface3.music.163.com,apm.music.163.com,apm3.music.163.com,clientlog.music.163.com,clientlog3.music.163.com\")\"\n\t\tif [ -n \"$FW4\" ]; then\n\t\t\tjson_add_string acl_http_addr \"$(echo -e \"${acl_http_addr}\" | sort -u)\"\n\t\t\tjson_add_string acl_https_addr \"$(echo -e \"${acl_https_addr}\" | sort -u)\"\n\t\t\tjson_add_string neteasemusic_addr \"$(echo -e \"${netease_music_ips}\" | jsonfilter -e '@.data.*.ip.*' | sort -u)\"\n\t\t\tjson_add_string neteasemusic_addr6 \"$(echo -e \"${netease_music_ips}\" | jsonfilter -e '@.data.*.ipv6.*' | sort -u)\"\n\n\t\t\tjson_dump > \"$RUN_DIR/fw4.info\"\n\t\t\tjson_cleanup\n\t\t\tutpl -F \"$RUN_DIR/fw4.info\" -S \"$UNM_DIR/nftables.ut\" > \"$RUN_DIR/fw4.nft\"\n\n\t\t\tif is_enabled \"config\" \"pub_access\"; then\n\t\t\t\tprocd_open_data\n\t\t\t\tjson_add_array firewall\n\t\t\t\t\tjson_add_object \"\"\n\t\t\t\t\tjson_add_string type rule\n\t\t\t\t\tjson_add_string name \"Allow-access-UNM-http-$http_port\"\n\t\t\t\t\tjson_add_string src \"*\"\n\t\t\t\t\tjson_add_string dest_port \"$http_port\"\n\t\t\t\t\tjson_add_string proto tcp\n\t\t\t\t\tjson_add_string target ACCEPT\n\t\t\t\t\tjson_close_object\n\n\t\t\t\t\tjson_add_object \"\"\n\t\t\t\t\tjson_add_string type rule\n\t\t\t\t\tjson_add_string name \"Allow-access-UNM-https-$https_port\"\n\t\t\t\t\tjson_add_string src \"*\"\n\t\t\t\t\tjson_add_string dest_port \"$https_port\"\n\t\t\t\t\tjson_add_string proto tcp\n\t\t\t\t\tjson_add_string target ACCEPT\n\t\t\t\t\tjson_close_object\n\t\t\t\tjson_close_array\n\t\t\t\tprocd_close_data\n\t\t\tfi\n\t\telse\n\t\t\techo -e \"${netease_music_ips}\" | jsonfilter -e '@.data.*.ip.*' | sort -u | awk '{print \"ipset add neteasemusic \"$1}' | sh\n\n\t\t\t$IPT_N -N \"netease_cloud_music\"\n\t\t\tfor local_addr in \"0.0.0.0/8\" \"10.0.0.0/8\" \"127.0.0.0/8\" \"169.254.0.0/16\" \"172.16.0.0/12\" \"192.168.0.0/16\" \"224.0.0.0/4\" \"240.0.0.0/4\"; do\n\t\t\t\t$IPT_N -A \"netease_cloud_music\" -d \"${local_addr}\" -j \"RETURN\"\n\t\t\tdone\n\n\t\t\t$IPT_N -A \"netease_cloud_music\" -p \"tcp\" -m \"set\" ! --match-set \"acl_neteasemusic_http\" \"src\" --dport \"80\" -j \"REDIRECT\" --to-ports \"${http_port}\"\n\t\t\t$IPT_N -A \"netease_cloud_music\" -p \"tcp\" -m \"set\" ! --match-set \"acl_neteasemusic_https\" \"src\" --dport \"443\" -j \"REDIRECT\" --to-ports \"${https_port}\"\n\t\t\t$IPT_N -I \"PREROUTING\" -p \"tcp\" -m \"set\" --match-set \"neteasemusic\" \"dst\" -j \"netease_cloud_music\"\n\n\t\t\techo \"/etc/init.d/$NAME restart\" > \"$RUN_DIR/fw3.include\"\n\t\tfi\n\telif [ \"${hijack_ways}\" = \"use_hosts\" ]; then\n\t\tmkdir -p \"$DNSMASQ_DIR\"\n\t\trm -f \"$DNSMASQ_DIR/dnsmasq-$NAME.conf\"\n\t\tcat <<-EOF > \"$DNSMASQ_DIR/dnsmasq-$NAME.conf\"\n\t\t\tdhcp-option=252,http://${lan_addr}:${http_port}/proxy.pac\n\t\t\taddress=/music.163.com/${lan_addr}\n\t\t\taddress=/interface.music.163.com/${lan_addr}\n\t\t\taddress=/interface3.music.163.com/${lan_addr}\n\t\t\taddress=/apm.music.163.com/${lan_addr}\n\t\t\taddress=/apm3.music.163.com/${lan_addr}\n\t\t\taddress=/clientlog.music.163.com/${lan_addr}\n\t\t\taddress=/clientlog3.music.163.com/${lan_addr}\n\t\t\taddress=/music.httpdns.c.163.com/0.0.0.0\n\t\tEOF\n\t\t/etc/init.d/dnsmasq restart 2>\"/dev/null\"\n\tfi\n\n\tprocd_close_instance\n\n\tprocd_open_instance \"log-check\"\n\tprocd_set_param command \"$UNM_DIR/log_check.sh\"\n\tprocd_set_param respawn\n\tprocd_close_instance\n}\n\nservice_started() {\n\t[ -z \"$FW4\" ] || procd_set_config_changed firewall\n}\n\nstop_service() {\n\tconfig_load \"$NAME\"\n\n\tsed -i \"/$NAME/d\" \"/etc/crontabs/root\"\n\t/etc/init.d/cron restart\n\n\tlocal chain settable\n\tif [ -n \"$FW4\" ]; then\n\t\tfor chain in \"netease_cloud_music_redir\" \"netease_cloud_music\"; do\n\t\t\tnft flush chain inet fw4 \"$chain\" 2>\"/dev/null\"\n\t\t\tnft delete chain inet fw4 \"$chain\" 2>\"/dev/null\"\n\t\tdone\n\t\tfor settable in \"acl_neteasemusic_http\" \"acl_neteasemusic_https\" \"neteasemusic\" \"neteasemusic6\"; do\n\t\t\tnft flush set inet fw4 \"$settable\" 2>\"/dev/null\"\n\t\t\tnft delete set inet fw4 \"$settable\" 2>\"/dev/null\"\n\t\tdone\n\n\t\trm -f \"$RUN_DIR/fw4.info\"\n\t\techo > \"$RUN_DIR/fw4.nft\"\n\telse\n\t\tiptables -t filter -D INPUT -j \"$IPT_INPUT_RULE\" 2>\"/dev/null\"\n\t\tiptables -F \"$IPT_INPUT_RULE\" 2>\"/dev/null\"\n\t\tiptables -X \"$IPT_INPUT_RULE\" 2>\"/dev/null\"\n\n\t\t$IPT_N -D \"PREROUTING\" -p \"tcp\" -m set --match-set \"neteasemusic\" \"dst\" -j \"netease_cloud_music\" 2>\"/dev/null\"\n\t\t$IPT_N -F \"netease_cloud_music\" 2>\"/dev/null\"\n\t\t$IPT_N -X \"netease_cloud_music\" 2>\"/dev/null\"\n\n\t\tfor settable in \"acl_neteasemusic_http\" \"acl_neteasemusic_https\" \"neteasemusic\"; do\n\t\t\tipset destroy \"$settable\" 2>\"/dev/null\"\n\t\tdone\n\n\t\techo > \"$RUN_DIR/fw3.include\"\n\tfi\n\n\trm -f \"$DNSMASQ_DIR/dnsmasq-$NAME.conf\"\n\t/etc/init.d/dnsmasq restart 2>\"/dev/null\"\n\n\trm -f \"$RUN_DIR/run.log\"\n}\n\nservice_stopped() {\n\t[ -z \"$FW4\" ] || procd_set_config_changed firewall\n}\n\nreload_service() {\n\tstop\n\tstart\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"$NAME\"\n}\n"
  },
  {
    "path": "luci-app-unblockneteasemusic/root/etc/uci-defaults/luci-unblockneteasemusic",
    "content": "#!/bin/sh\n\nsed -e \"s,local_vip '1',local_vip 'cvip',g\" \\\n    -e \"/local_vip '0'/d\" \\\n    -e \"/music_source 'default'/d\" \\\n\t-i \"/etc/config/unblockneteasemusic\"\n\nuci -q batch <<-EOF >\"/dev/null\"\n\tdelete ucitrack.@unblockneteasemusic[-1]\n\tcommit ucitrack\nEOF\n\nif [ -e \"$(command -v fw4)\" ]; then\n\tuci -q batch <<-EOF >\"/dev/null\"\n\t\tdelete firewall.unblockneteasemusic\n\t\tset firewall.unblockneteasemusic=include\n\t\tset firewall.unblockneteasemusic.type=nftables\n\t\tset firewall.unblockneteasemusic.path=/var/run/unblockneteasemusic/fw4.nft\n\t\tset firewall.unblockneteasemusic.position=table-post\n\t\tcommit firewall\n\tEOF\nelse\n\tuci -q batch <<-EOF >\"/dev/null\"\n\t\tdelete firewall.unblockneteasemusic\n\t\tset firewall.unblockneteasemusic=include\n\t\tset firewall.unblockneteasemusic.type=script\n\t\tset firewall.unblockneteasemusic.path=/var/run/unblockneteasemusic/fw3.include\n\t\tset firewall.unblockneteasemusic.reload=1\n\t\tcommit firewall\n\tEOF\nfi\n\nrm -f /tmp/luci-indexcache\nexit 0\n"
  },
  {
    "path": "luci-app-unblockneteasemusic/root/usr/bin/unm-debug",
    "content": "#!/bin/sh\n# Copyright (C) 2021-2022 Tianling Shen <cnsztl@immortalwrt.org>\n\ncommand -v \"curl\" >\"/dev/null\" || { echo -e \"curl is not found.\"; exit 1; }\n\nRUN_DIR=\"/var/run/unblockneteasemusic\"\nmkdir -p \"$RUN_DIR\"\n/usr/share/unblockneteasemusic/debugging.sh 2>&1 | tee \"$RUN_DIR/unm-debugging-output.txt\"\n\ncatbox_link=\"$(curl -fsS -F \"reqtype=fileupload\" -F \"time=72h\" -F \"fileToUpload=@$RUN_DIR/unm-debugging-output.txt\" \"https://litterbox.catbox.moe/resources/internals/api.php\")\"\ntransfer_link=\"$(curl -fsS --upload-file \"$RUN_DIR/unm-debugging-output.txt\" \"https://transfer.sh/unm-debugging-output.txt\")\"\necho -e \"\\n\"\necho -e \"Log is available at:\"\necho -e \"$catbox_link\"\necho -e \"$transfer_link\"\n\nrm -f \"$RUN_DIR/unm-debugging-output.txt\"\n"
  },
  {
    "path": "luci-app-unblockneteasemusic/root/usr/share/luci/menu.d/luci-app-unblockneteasemusic.json",
    "content": "{\n\t\"admin/services/unblockneteasemusic\": {\n\t\t\"title\": \"解除网易云音乐播放限制\",\n\t\t\"order\": 50,\n\t\t\"action\": {\n\t\t\t\"type\": \"firstchild\"\n\t\t},\n\t\t\"depends\": {\n\t\t\t\"acl\": [ \"luci-app-unblockneteasemusic\" ],\n\t\t\t\"uci\": { \"unblockneteasemusic\": true }\n\t\t}\n\t},\n\t\"admin/services/unblockneteasemusic/config\": {\n\t\t\"title\": \"基本设定\",\n\t\t\"order\": 10,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"unblockneteasemusic/config\"\n\t\t}\n\t},\n\t\"admin/services/unblockneteasemusic/status\": {\n\t\t\"title\": \"状态信息\",\n\t\t\"order\": 20,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"unblockneteasemusic/status\"\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-unblockneteasemusic/root/usr/share/rpcd/acl.d/luci-app-unblockneteasemusic.json",
    "content": "{\n\t\"luci-app-unblockneteasemusic\": {\n\t\t\"description\": \"Grant access to UnblockNeteaseMusic configuration\",\n\t\t\"read\": {\n\t\t\t\"file\": {\n\t\t\t\t\"/etc/init.d/unblockneteasemusic\": [ \"exec\" ],\n\t\t\t\t\"/usr/bin/unm-debug\": [ \"exec\" ],\n\t\t\t\t\"/usr/share/unblockneteasemusic/update.sh\": [ \"exec\" ],\n\t\t\t\t\"/usr/share/unblockneteasemusic/core/ca.crt\": [ \"read\" ],\n\t\t\t\t\"/var/run/unblockneteasemusic/run.log\": [ \"read\" ]\n\t\t\t},\n\t\t\t\"ubus\": {\n\t\t\t\t\"service\": [ \"list\" ]\n\t\t\t},\n\t\t\t\"uci\": [ \"unblockneteasemusic\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"file\": {\n\t\t\t\t\"/usr/share/unblockneteasemusic/server.crt\": [ \"write\" ],\n\t\t\t\t\"/usr/share/unblockneteasemusic/server.key\": [ \"write\" ]\n\t\t\t},\n\t\t\t\"uci\": [ \"unblockneteasemusic\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/debugging.sh",
    "content": "#!/bin/sh\n# Copyright (C) 2021-2022 Tianling Shen <cnsztl@immortalwrt.org>\n\n. /lib/functions.sh\n\nNAME=\"unblockneteasemusic\"\n\ncommand -v \"curl\" >\"/dev/null\" || { echo -e \"curl is not found.\"; exit 1; }\n\necho -e \"Launching luci-app-unblockneteasmusic Debugging Tool...\"\necho -e \"\\n\"\n\necho -e \"OpenWrt info:\"\nubus call system board || cat \"/etc/openwrt_release\"\necho -e \"\\n\"\n\necho -e \"uclient-fetch info:\"\nopkg info uclient-fetch\nopkg info libustream-*\nopkg info wget-ssl\nwget -T10 -O- 'https://api.github.com/repos/UnblockNeteaseMusic/server/commits?sha=enhanced&path=precompiled' | jsonfilter -e '@[0].sha' || echo -e \"Failed to connect to GitHub with uclient-fetch.\"\necho -e \"\\n\"\n\necho -e \"Node.js info:\"\nopkg info node\necho -e \"Node.js is placed at $(command -v node || echo \"Not Found\")\"\necho -e \"Node.js version: $(node -v 2>\"/dev/null\" || echo \"Not Found\")\"\necho -e \"\\n\"\n\necho -e \"luci-app-unblockneteasmusic info:\"\nopkg info \"luci-app-unblockneteasemusic\"\nls -lh \"/etc/config/$NAME\" \"/etc/init.d/$NAME\" \"/usr/share/$NAME\"\ncat \"/etc/config/$NAME\" | sed -e \"s,joox_cookie .*,joox_cookie 'set',g\" \\\n\t-e \"s,migu_cookie .*,migu_cookie 'set',g\" \\\n\t-e \"s,qq_cookie .*,qq_cookie 'set',g\" \\\n\t-e \"s,youtube_key .*,youtube_key 'set',g\" \\\n\t-e \"s,proxy_server_ip .*,proxy_server_ip 'set',g\"\necho -e \"\\n\"\n\necho -e \"UnblockNeteaseMusic Node.js info:\"\necho -e \"Git HEAD version: $(cat \"/usr/share/$NAME/core_local_ver\" 2>\"/dev/null\" || echo \"Not Found\")\"\necho -e \"Core version: $(node \"/usr/share/$NAME/core/app.js\" -v 2>\"/dev/null\" || echo \"Not Found\")\"\nls -lh \"/usr/share/$NAME/core\" 2>\"/dev/null\"\necho -e \"\\n\"\n\necho -e \"Netease networking info:\"\ncurl -fsv \"http://music.163.com/song/media/outer/url?id=641644.mp3\" 2>&1 | grep \"Location\" || echo -e \"Cannot connect to NeteaseMusic.\"\ncurl -sSL \"http://httpdns.n.netease.com/httpdns/v2/d?domain=music.163.com\" || echo -e \"Cannot connect to Netease HTTPDNS.\"\nconfig_load \"$NAME\"\nconfig_get custom_proxy \"config\" \"proxy_server_ip\"\n[ -n \"$custom_proxy\" ] && { curl -sL -x \"$custom_proxy\" \"http://music.163.com/song/media/outer/url?id=641644.mp3\" 2>&1 | grep \"Location\" || echo -e \"Cannot connect to NeteaseMusic via proxy.\"; }\necho -e \"\\n\"\n\necho -e \"Port status:\"\nconfig_get unm_port \"config\" \"http_port\" \"5200\"\nconfig_get unm_ports \"config\" \"https_port\" \"5201\"\n[ \"$(config_get \"config\" \"hijack_ways\")\" = \"use_hosts\" ] && { unm_port=\"80\"; unm_ports=\"443\"; }\nnetstat -tlpen | grep \"$unm_port\" || echo -e \"No instance found on port $unm_port.\"\nnetstat -tlpen | grep \"$unm_ports\" || echo -e \"No instance found on port $unm_ports.\"\necho -e \"\\n\"\n\necho -e \"PROCD running info:\"\nrunning_stat=\"$(ubus call service list '{\"name\": \"unblockneteasemusic\", \"verbose\": true}' | \\\n\tsed -e 's,\"JOOX_COOKIE\".*\",\"JOOX_COOKIE\": \"set\",g' \\\n\t    -e 's,\"MIGU_COOKIE\".*\",\"MIGU_COOKIE\": \"set\",g' \\\n\t    -e 's,\"QQ_COOKIE\".*\",\"QQ_COOKIE\": \"set\",g' \\\n\t    -e 's,\"YOUTUBE_KEY\".*\",\"YOUTUBE_KEY\": \"set\",g')\"\n[ \"$(echo -e \"$running_stat\" | jsonfilter -e \"@.$NAME.instances.$NAME.running\")\" == \"true\" ] || is_stopped=1\necho -e \"$running_stat\"\n\necho -e \"\\n\"\n\n[ -n \"$is_stopped\" ] || {\n\techo -e \"Firewall info:\"\n\tif [ -e \"$(command -v fw4)\" ]; then\n\t\t[ -e \"/var/run/$NAME/fw4.nft\" ] || echo -e 'netease_cloud_music nft rule file not found.'\n\t\techo -e \"\"\n\t\tnft list set inet fw4 \"acl_neteasemusic_http\" 2>&1\n\t\techo -e \"\"\n\t\tnft list set inet fw4 \"acl_neteasemusic_https\" 2>&1\n\t\techo -e \"\"\n\t\tnft list set inet fw4 \"neteasemusic\" 2>&1\n\t\techo -e \"\"\n\t\tnft list set inet fw4 \"neteasemusic6\" 2>&1\n\t\techo -e \"\"\n\t\tnft list chain inet fw4 \"netease_cloud_music\" 2>&1\n\t\techo -e \"\"\n\t\tnft list chain inet fw4 \"netease_cloud_music_redir\" 2>&1\n\telse\n\t\tiptables -t \"nat\" -L \"netease_cloud_music\" 2>\"/dev/null\" || echo -e 'Chain \"netease_cloud_music\" not found.'\n\t\techo -e \"\"\n\t\tipset list \"neteasemusic\" 2>\"/dev/null\" || echo -e 'Table \"neteasemusic\" not found.'\n\t\techo -e \"\"\n\t\tipset list \"acl_neteasemusic_http\" 2>\"/dev/null\" || echo -e 'Table \"acl_neteasemusic_http\" not found.'\n\t\techo -e \"\"\n\t\tipset list \"acl_neteasemusic_https\" 2>\"/dev/null\" || echo -e 'Table \"acl_neteasemusic_https\" not found.'\n\tfi\n\techo -e \"\"\n\tdnsmasq_uci_config=\"$(uci -q show \"dhcp.@dnsmasq[0]\" | awk 'NR==1 {split($0, conf, /[.=]/); print conf[2]}')\"\n\tif [ -f \"/tmp/etc/dnsmasq.conf.$dnsmasq_uci_config\" ]; then\n\t\tdnsmasq_dir=\"$(awk -F '=' '/^conf-dir=/ {print $2}' \"/tmp/etc/dnsmasq.conf.$dnsmasq_uci_config\")\"\n\telse\n\t\tdnsmasq_dir=\"/tmp/dnsmasq.d\"\n\tfi\n\tcat \"$dnsmasq_dir/dnsmasq-$NAME.conf\"\n\techo -e \"\\n\"\n\n\techo -e \"Testing source replacing...\"\n\tlan_ip=\"$(uci -q get \"network.lan.ipaddr\" || echo \"127.0.0.1\")\"\n\n\tcurl -sSL -X \"POST\" \"https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token=\" --data \"params=bf3kf%2BOyalbxNS%2FeHAXquH8D2nt2YrhBzww4zy5rj2H%2BeAhdOIaGh4HHHzcoREFcu9Ve35LUgc%2BGE1YJD1HxrJ87ucm5zK%2FFn1lLvHFv1A8ZAuyU1afjG28s2Xja6zpfg00T0EcCeqkK61OpTfAaqw%3D%3D&encSecKey=6bab0dfa7ee3b292f9263a7af466636731cdbbd1d8747c9178c17477e70be899b7788c4a4e315c9fdb8c6e787603db6f9dff62c356f164d35b16b7f2d9ad5ede3cc7336130605521a8f916d308ce86b15c32b81c883ae2ba9c244444d91e1683be93fa0ea3e2a85207c9d693b86b5bb31adb002dd56c0bbcce9c73ec3bf5c105\"\n\techo -e \"\"\n\tcurl -ksSL -X \"POST\" -x \"http://$lan_ip:$unm_port\" \"https://music.163.com/weapi/song/enhance/player/url/v1?csrf_token=\" --data \"params=bf3kf%2BOyalbxNS%2FeHAXquH8D2nt2YrhBzww4zy5rj2H%2BeAhdOIaGh4HHHzcoREFcu9Ve35LUgc%2BGE1YJD1HxrJ87ucm5zK%2FFn1lLvHFv1A8ZAuyU1afjG28s2Xja6zpfg00T0EcCeqkK61OpTfAaqw%3D%3D&encSecKey=6bab0dfa7ee3b292f9263a7af466636731cdbbd1d8747c9178c17477e70be899b7788c4a4e315c9fdb8c6e787603db6f9dff62c356f164d35b16b7f2d9ad5ede3cc7336130605521a8f916d308ce86b15c32b81c883ae2ba9c244444d91e1683be93fa0ea3e2a85207c9d693b86b5bb31adb002dd56c0bbcce9c73ec3bf5c105\"\n\techo -e \"\"\n}\n\ncat \"/var/run/$NAME/run.log\" 2>\"/dev/null\" || echo -e \"Log is not avaiable.\"\n"
  },
  {
    "path": "luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/log_check.sh",
    "content": "#!/bin/sh\n# SPDX-License-Identifier: GPL-3.0-only\n# Copyright (C) 2019-2023 Tianling Shen <cnsztl@immortalwrt.org>\n\nNAME=\"unblockneteasemusic\"\n\nlog_max_size=\"10\" #使用KB计算\nlog_file=\"/var/run/$NAME/run.log\"\n\nwhile true; do\n\tsleep 300\n\t[ -s \"$log_file\" ] || continue\n\t[ \"$(( $(ls -l \"$log_file\" | awk -F ' ' '{print $5}') / 1024 >= log_max_size))\" -eq \"0\" ] || echo \"\" > \"$log_file\"\ndone\n"
  },
  {
    "path": "luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/nftables.ut",
    "content": "#!/usr/bin/utpl -S\n\nset acl_neteasemusic_http {\n\ttype ether_addr;\n\tflags interval;\n\tauto-merge;\n\n\t{% if (acl_http_addr): %}\n\telements = { {{ join(', ', split(trim(acl_http_addr), '\\n')) }} }\n\t{% endif %}\n}\n\nset acl_neteasemusic_https {\n\ttype ether_addr;\n\tflags interval;\n\tauto-merge;\n\n\t{% if (acl_https_addr): %}\n\telements = { {{ join(', ', split(trim(acl_https_addr), '\\n')) }} }\n\t{% endif %}\n}\n\nset neteasemusic {\n\ttype ipv4_addr;\n\tflags interval, timeout;\n\ttimeout 2h;\n\tauto-merge;\n\n\t{% if (neteasemusic_addr): %}\n\telements = { {{ join(', ', split(trim(neteasemusic_addr), '\\n')) }} }\n\t{% endif %}\n}\n\nset neteasemusic6 {\n\ttype ipv6_addr;\n\tflags interval, timeout;\n\ttimeout 2h;\n\tauto-merge;\n\n\t{% if (neteasemusic_addr6): %}\n\telements = { {{ join(', ', split(trim(neteasemusic_addr6), '\\n')) }} }\n\t{% endif %}\n}\n\nchain netease_cloud_music {\n\ttype nat hook prerouting priority -1; policy accept;\n\tmeta l4proto tcp ip daddr @neteasemusic counter jump netease_cloud_music_redir;\n\tmeta l4proto tcp ip6 daddr @neteasemusic6 counter jump netease_cloud_music_redir;\n}\n\nchain netease_cloud_music_redir {\n\tip daddr { 0.0.0.0/8, 10.0.0.0/8, 100.64.0.0/10, 127.0.0.0/8,\n\t\t169.254.0.0/16, 172.16.0.0/12, 192.0.0.0/24,\n\t\t192.0.2.0/24, 192.31.196.0/24, 192.52.193.0/24,\n\t\t192.88.99.0/24, 192.168.0.0/16, 192.175.48.0/24,\n\t\t198.18.0.0/15, 198.51.100.0/24, 203.0.113.0/24,\n\t\t224.0.0.0/4, 240.0.0.0/4 } counter return;\n\n\tip6 daddr { ::/128, ::1/128, ::ffff:0:0/96, 100::/64, 64:ff9b::/96,\n\t\t2001::/32, 2001:10::/28, 2001:20::/28, 2001:db8::/28, 2002::/16,\n\t\tfc00::/7, fe80::/10, ff00::/8 } counter return;\n\n\tether saddr @acl_neteasemusic_http tcp dport 80 counter return;\n\tether saddr @acl_neteasemusic_https tcp dport 443 counter return;\n\n\ttcp dport 80 counter redirect to :{{ http_port }};\n\ttcp dport 443 counter redirect to :{{ https_port }};\n}\n"
  },
  {
    "path": "luci-app-unblockneteasemusic/root/usr/share/unblockneteasemusic/update.sh",
    "content": "#!/bin/sh\n# SPDX-License-Identifier: GPL-3.0-only\n# Copyright (C) 2019-2023 Tianling Shen <cnsztl@immortalwrt.org>\n\nNAME=\"unblockneteasemusic\"\nUNM_DIR=\"/usr/share/$NAME\"\nRUN_DIR=\"/var/run/$NAME\"\nmkdir -p \"$RUN_DIR\"\n\nLOCK=\"$RUN_DIR/update_core.lock\"\nLOG=\"$RUN_DIR/run.log\"\n\nclean_log(){\n\techo \"\" > \"$LOG\"\n}\n\ncheck_core_latest_version() {\n\texec 200>\"$LOCK\"\n\tif ! flock -n 200 &> /dev/null; then\n\t\techo -e \"\\nA task is already running.\" >> \"$LOG\"\n\t\texit 2\n\tfi\n\n\tcore_latest_ver=\"$(wget -T10 -qO- 'https://api.github.com/repos/UnblockNeteaseMusic/server/commits?sha=enhanced&path=precompiled' | jsonfilter -e '@[0].sha')\"\n\t[ -n \"$core_latest_ver\" ] || { echo -e \"\\nFailed to check latest core version, please try again later.\" >> \"$LOG\"; exit 1; }\n\tif [ ! -e \"$UNM_DIR/core_local_ver\" ]; then\n\t\tclean_log\n\t\techo -e \"Local version: NOT FOUND, latest version: $core_latest_ver.\" >> \"$LOG\"\n\t\tupdate_core\n\telse\n\t\tif [ \"$(cat $UNM_DIR/core_local_ver)\" != \"$core_latest_ver\" ]; then\n\t\t\tclean_log\n\t\t\techo -e \"Local version: $(cat $UNM_DIR/core_local_ver 2>\"/dev/null\"), latest version: $core_latest_ver.\" >> \"$LOG\"\n\t\t\tupdate_core\n\t\telse\n\t\t\techo -e \"\\nLocal version: $(cat $UNM_DIR/core_local_ver 2>\"/dev/null\"), latest version: $core_latest_ver.\" >> \"$LOG\"\n\t\t\techo -e \"You're already using the latest version.\" >> \"$LOG\"\n\t\t\texit 3\n\t\tfi\n\tfi\n}\n\nupdate_core() {\n\techo -e \"Updating core...\" >> \"$LOG\"\n\n\tmkdir -p \"$UNM_DIR/core\"\n\trm -rf \"$UNM_DIR/core\"/*\n\n\tfor file in $(wget -T10 -qO- \"https://api.github.com/repos/UnblockNeteaseMusic/server/contents/precompiled\" | jsonfilter -e '@[*].path')\n\tdo\n\t\twget -T10 \"https://fastly.jsdelivr.net/gh/UnblockNeteaseMusic/server@$core_latest_ver/$file\" -qO \"$UNM_DIR/core/${file##*/}\"\n\t\t[ -s \"$UNM_DIR/core/${file##*/}\" ] || {\n\t\t\techo -e \"Failed to download ${file##*/}.\" >> \"$LOG\"\n\t\t\texit 1\n\t\t}\n\tdone\n\n\tfor cert in \"ca.crt\" \"server.crt\" \"server.key\"\n\tdo\n\t\twget -T10 \"https://fastly.jsdelivr.net/gh/UnblockNeteaseMusic/server@$core_latest_ver/$cert\" -qO \"$UNM_DIR/core/$cert\"\n\t\t[ -s \"$UNM_DIR/core/${cert}\" ] || {\n\t\t\techo -e \"Failed to download ${cert}.\" >> \"$LOG\"\n\t\t\texit 1\n\t\t}\n\tdone\n\n\techo -e \"$core_latest_ver\" > \"$UNM_DIR/core_local_ver\"\n\t[ -n \"$non_restart\" ] || /etc/init.d/\"$NAME\" restart\n\n\techo -e \"Succeeded in updating core.\" > \"$LOG\"\n\techo -e \"Current core version: $core_latest_ver.\\n\" >> \"$LOG\"\n}\n\ncase \"$1\" in\n\t\"check_version\")\n\t\tif [ ! -e \"$UNM_DIR/core_local_ver\" ] || [ ! -e \"$UNM_DIR/core/app.js\" ]; then\n\t\t\techo -e \"Not installed.\"\n\t\t\texit 2\n\t\telse\n\t\t\tversion=\"$(node \"$UNM_DIR/core/app.js\" -v)\"\n\t\t\tcommit=\"$(cat \"$UNM_DIR/core_local_ver\" | head -c7)\"\n\t\t\techo \"$version ($commit)\"\n\t\t\texit 0\n\t\tfi\n\t\t;;\n\t\"update_core\")\n\t\tcheck_core_latest_version\n\t\t;;\n\t\"update_core_non_restart\")\n\t\tnon_restart=1\n\t\tcheck_core_latest_version\n\t\t;;\n\t\"remove_core\")\n\t\t\"/etc/init.d/$NAME\" stop\n\t\trm -rf \"$UNM_DIR/core\" \"$UNM_DIR/core_local_ver\" \"$LOCK\"\n\t\t;;\n\t*)\n\t\techo -e \"Usage: $0 check_version | update_core | remove_core\"\n\t\t;;\nesac\n"
  },
  {
    "path": "luci-app-unishare/Makefile",
    "content": "\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI for UniShare\nLUCI_PKGARCH:=all\nLUCI_DEPENDS:=+unishare\nPKG_VERSION:=1.0.2-r1\nPKG_RELEASE:=\nPKG_MAINTAINER:=jjm2473 <jjm2473@gmail.com>\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-unishare/luasrc/controller/unishare.lua",
    "content": "\nmodule(\"luci.controller.unishare\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/unishare\") then\n\t\treturn\n\tend\n\n\tentry({\"admin\", \"nas\", \"unishare\"}, alias(\"admin\", \"nas\", \"unishare\", \"index\"), _(\"UniShare\"), 2).dependent = true\n\tentry({\"admin\", \"nas\", \"unishare\", \"index\"}, cbi(\"unishare/index\"), _(\"UniShare\"), 1)\n\tentry({\"admin\", \"nas\", \"unishare\", \"users\"}, cbi(\"unishare/users\"), _(\"Users\"), 2)\n\tentry({\"admin\", \"nas\", \"unishare\", \"share\"}, cbi(\"unishare/share\", {hideapplybtn=true})).leaf = true\nend\n"
  },
  {
    "path": "luci-app-unishare/luasrc/model/cbi/unishare/index.lua",
    "content": "local xml = require \"luci.xml\"\nlocal pcdata = xml.pcdata\n\nlocal uci = luci.model.uci.cursor()\n\nlocal usersmap = {}\nusersmap[\"everyone\"] = \"{\" .. translate(\"Everyone\") .. \"}\"\nusersmap[\"users\"] = \"{\" .. translate(\"Logged Users\") .. \"}\"\nuci:foreach(\"unishare\", \"user\", function(e)\n\tlocal username = e[\"username\"]\n\tif not username or username == \"\" then\n\t\treturn\n\tend\n\tlocal comment = e[\"comment\"]\n\tusersmap[username] = username .. (comment and (\" (\" .. comment .. \")\") or \"\")\nend)\n\nm = Map(\"unishare\", nil, translate(\"Configure multiple file sharing protocols in one page (Samba, WebDAV, maybe more in the future?)\"))\n\ns = m:section(TypedSection, \"global\", translate(\"Global\"))\ns:tab(\"general\", translate(\"General Setup\"))\ns:tab(\"webdav\", translate(\"WebDAV\"))\ns.anonymous = true\ns.addremove = false\n\no = s:taboption(\"general\", Flag, \"enabled\", translate(\"Enabled\"))\no.default = 0\n\no = s:taboption(\"general\", Flag, \"anonymous\", translate(\"Allow Anonymous\"),\n    translatef(\"For logged in users, please manage on the '%s' page\",\n        \"<a href=\\\"\"..luci.dispatcher.build_url(\"admin\", \"nas\", \"unishare\", \"users\")..\"\\\" >\"..translate(\"Users\")..\"</a>\"))\no.default = 0\n\no = s:taboption(\"webdav\", Value, \"webdav_port\", translate(\"WebDAV Port\"))\no.datatype = \"port\"\n\ns = m:section(TypedSection, \"share\", translate(\"Shares\"), translate(\"(The user marked in <b>Bold</b> has write access)\"))\ns.anonymous = true\ns.addremove = true\ns.template = \"cbi/tblsection\"\ns.extedit = luci.dispatcher.build_url(\"admin\", \"nas\", \"unishare\", \"share\", \"%s\")\nfunction s.create(...)\n\tlocal sid = TypedSection.create(...)\n\tluci.http.redirect(s.extedit % sid)\nend\n\nlocal path = s:option(Value, \"path\", translate(\"Path\"))\npath.datatype = \"string\"\npath.rmempty = false\n\nlocal name = s:option(Value, \"name\", translate(\"Name\"))\nname.datatype = \"string\"\nname.rmempty = true\nname.validate = function(self, value, section)\n    if value and string.match(value, \"[`&|;<>/\\\\*?$#]\") then\n        return nil, translatef(\"Name must not contains '%s'\", \"`&|;<>/\\\\*?$#\")\n    end\n    return AbstractValue.validate(self, value, section)\nend\n\npath.validate = function(self, value, section)\n    if value then\n        if value == \"/\" or string.match(value, \"^/.+[^/]$\") then\n            if value == \"/\" and (nil == name:formvalue(section) or \"\" == name:formvalue(section)) then\n                return nil, translate(\"Name cannot be empty when Path is /\")\n            end\n            return value\n        else\n            return nil, translate(\"Path must starts with '/' and not ends with '/'\")\n        end\n    end\n    return AbstractValue.validate(self, value, section)\nend\n\nlocal function uci2string(v, s)\n    if v == nil then\n        return \"&#8212;\"\n    end\n    if type(v) == \"table\" then\n\t\tlocal i, u\n\t\tlocal d = {}\n\t\tfor i, u in ipairs(v) do\n\t\t\td[#d+1] = pcdata(usersmap[u] or u)\n\t\tend\n        return table.concat(d, s)\n    else\n        return pcdata(usersmap[v] or v)\n    end\nend\n\no = s:option(DummyValue, \"users\", translate(\"Users\"))\no.rawhtml = true\nfunction o.cfgvalue(self, s)\n\treturn \"<b>\" .. uci2string(self.map:get(s, \"rw\"), \" \") .. \"</b><br><i>\" .. uci2string(self.map:get(s, \"ro\"), \" \") .. \"</i>\"\nend\n\no = s:option(StaticList, \"proto\", translate(\"Protocol\"))\no:value(\"samba\", \"Samba\")\no:value(\"webdav\", \"WebDAV\")\n\nreturn m\n"
  },
  {
    "path": "luci-app-unishare/luasrc/model/cbi/unishare/share.lua",
    "content": "\nlocal uci = luci.model.uci.cursor()\n\nlocal users = {}\nuci:foreach(\"unishare\", \"user\", function(e)\n\tlocal username = e[\"username\"]\n\tif not username or username == \"\" then\n\t\treturn\n\tend\n\tlocal comment = e[\"comment\"]\n\tusers[#users+1] = {username=username, displayname=username .. (comment and (\" (\" .. comment .. \")\") or \"\")}\nend)\n\nm = Map(\"unishare\", translate(\"Configure Share\"))\nm.redirect = luci.dispatcher.build_url(\"admin\", \"nas\", \"unishare\", \"index\")\nfunction m.on_save()\n    luci.http.redirect(m.redirect)\nend\n\ns = m:section(NamedSection, arg[1], \"share\", \"\")\ns.addremove = false\ns.dynamic = false\n\nlocal path = s:option(Value, \"path\", translate(\"Path\"), \n    translate(\"Note: '/mnt' is not suitable as a writable share, because Windows will recognize the wrong capacity\"))\npath.datatype = \"string\"\npath.rmempty = false\n\nlocal name = s:option(Value, \"name\", translate(\"Name\"))\nname.datatype = \"string\"\nname.rmempty = true\nname.validate = function(self, value, section)\n    if value and string.match(value, \"[`&|;<>/\\\\*?$#]\") then\n        return nil, translatef(\"Name must not contains '%s'\", \"`&|;<>/\\\\*?$#\")\n    end\n    return AbstractValue.validate(self, value, section)\nend\n\npath.validate = function(self, value, section)\n    if value then\n        if value == \"/\" or string.match(value, \"^/.+[^/]$\") then\n            if value == \"/\" and (nil == name:formvalue(section) or \"\" == name:formvalue(section)) then\n                return nil, translate(\"Name cannot be empty when Path is /\")\n            end\n            return value\n        else\n            return nil, translate(\"Path must starts with '/' and not ends with '/'\")\n        end\n    end\n    return AbstractValue.validate(self, value, section)\nend\n\nlocal i, u\no = s:option(StaticList, \"rw\", translate(\"Read/Write Users\"),\n    translatef(\"'Everyone' includes anonymous if enabled, 'Logged Users' includes all users configured in '%s' tab\", \n        \"<a href=\\\"\"..luci.dispatcher.build_url(\"admin\", \"nas\", \"unishare\", \"users\")..\"\\\" >\"..translate(\"Users\")..\"</a>\"))\no:value(\"everyone\", \"{\" .. translate(\"Everyone\") .. \"}\")\no:value(\"users\", \"{\" .. translate(\"Logged Users\") .. \"}\")\nfor i, u in ipairs(users) do\n    o:value(u.username, u.displayname)\nend\n\no = s:option(StaticList, \"ro\", translate(\"Read Only Users\"))\no:value(\"everyone\", \"{\" .. translate(\"Everyone\") .. \"}\")\no:value(\"users\", \"{\" .. translate(\"Logged Users\") .. \"}\")\nfor i, u in ipairs(users) do\n    o:value(u.username, u.displayname)\nend\n\no = s:option(StaticList, \"proto\", translate(\"Protocol\"))\no:value(\"samba\", \"Samba\")\no:value(\"webdav\", \"WebDAV\")\n\nreturn m\n"
  },
  {
    "path": "luci-app-unishare/luasrc/model/cbi/unishare/users.lua",
    "content": "\nm = Map(\"unishare\")\n\ns = m:section(TypedSection, \"user\", translate(\"Users\"))\ns.anonymous = true\ns.addremove = true\ns.template = \"cbi/tblsection\"\n\no = s:option(Value, \"username\", translate(\"Username\"),\n    translate(\"Note: Do not use the 'root' user, as Samba forbids 'root' user login by default\"))\no.datatype = \"string\"\no.rmempty = false\no.validate = function(self, value)\n    if value and string.match(value, \"^%l[%l%d_-]*$\") then\n        return value\n    else\n        return nil, translatef(\"Username must matchs regex '%s'\", \"^[a-z][a-z0-9_-]*$\")\n    end\nend\n\no = s:option(Value, \"password\", translate(\"Password\"))\no.datatype = \"string\"\no.password = true\no.rmempty = true\n\no = s:option(Value, \"comment\", translate(\"Comment\"))\no.datatype = \"string\"\n\nreturn m\n"
  },
  {
    "path": "luci-app-unishare/po/zh_Hans/unishare.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\nmsgid \"UniShare\"\nmsgstr \"统一文件共享\"\n\nmsgid \"Configure multiple file sharing protocols in one page (Samba, WebDAV, maybe more in the future?)\"\nmsgstr \"在一个页面中配置多种文件共享协议（Samba，WebDAV，也许以后会支持更多？）\"\n\nmsgid \"Global\"\nmsgstr \"全局\"\n\nmsgid \"Allow Anonymous\"\nmsgstr \"允许匿名用户\"\n\nmsgid \"For logged in users, please manage on the '%s' page\"\nmsgstr \"对于登录用户，请在 '%s' 页面进行管理\"\n\nmsgid \"WebDAV Port\"\nmsgstr \"WebDAV 端口\"\n\nmsgid \"Shares\"\nmsgstr \"共享\"\n\nmsgid \"(The user marked in <b>Bold</b> has write access)\"\nmsgstr \"（<b>加粗</b>的用户具有写权限）\"\n\nmsgid \"Users\"\nmsgstr \"用户\"\n\nmsgid \"Configure Share\"\nmsgstr \"配置共享\"\n\nmsgid \"Read/Write Users\"\nmsgstr \"读写用户\"\n\nmsgid \"Read Only Users\"\nmsgstr \"只读用户\"\n\nmsgid \"Everyone\"\nmsgstr \"任何人\"\n\nmsgid \"Logged Users\"\nmsgstr \"登录用户\"\n\nmsgid \"'Everyone' includes anonymous if enabled, 'Logged Users' includes all users configured in '%s' tab\"\nmsgstr \"'任何人'包括所有登录用户和匿名用户（如果允许匿名用户），'登录用户'包括所有在'%s'标签页配置的用户\"\n\nmsgid \"Note: '/mnt' is not suitable as a writable share, because Windows will recognize the wrong capacity\"\nmsgstr \"注意：'/mnt' 不适合作为可写共享，因为 Windows 会认错容量\"\n\nmsgid \"Name cannot be empty when Path is /\"\nmsgstr \"路径是/时，名称不能为空\"\n\nmsgid \"Path must starts with '/' and not ends with '/'\"\nmsgstr \"路径必须以/开头，且不能以/结尾\"\n\nmsgid \"Name must not contains '%s'\"\nmsgstr \"名称不能包含这些特殊字符'%s'\"\n\nmsgid \"Username must matchs regex '%s'\"\nmsgstr \"用户名必须满足正则表达式'%s'\"\n\nmsgid \"Note: Do not use the 'root' user, as Samba forbids 'root' user login by default\"\nmsgstr \"注意：不要使用 'root' 用户，因为 Samba 默认禁止 'root' 用户登录\"\n"
  },
  {
    "path": "luci-app-watchdog/luci-app-watchdog/Makefile",
    "content": "#\n# Copyright (C) 2025 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-watchdog\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-watchdog\nPKG_VERSION:=1.0.8\nPKG_RELEASE:=20260312\n\nPKG_MAINTAINER:=sirpdboy  <herboy2008@gmail.com>\nPKG_CONFIG_DEPENDS:=\n\nLUCI_TITLE:=LuCI support for watchdog\nLUCI_PKGARCH:=all\nLUCI_DEPENDS:=+watchdog\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-watchdog/luci-app-watchdog/htdocs/luci-static/resources/view/watchdog/basic.js",
    "content": "/*   Copyright (C) 2025 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-watchdog */\n\n'use strict';\n'require view';\n'require fs';\n'require ui';\n'require uci';\n'require form';\n'require poll';\n\nfunction checkProcess() {\n    return fs.exec('/bin/pidof', ['watchdog']).then(function(res) {\n        return {\n            running: res.code === 0,\n            pid: res.code === 0 ? res.stdout.trim() : null\n        };\n    }).catch(function() {\n        return { running: false, pid: null };\n    });\n}\n\nfunction renderStatus(isRunning) {\n    var statusText = isRunning ? _('RUNNING') : _('NOT RUNNING');\n    var color = isRunning ? 'green' : 'red';\n    var icon = isRunning ? '✓' : '✗'; \n    \n    return String.format(\n        '<em><span style=\"color:%s\">%s <strong>%s %s</strong></span></em>',\n        color, icon, _('Watch Dog'), statusText\n    );\n}\n\nvar cbiRichListValue = form.ListValue.extend({\n    renderWidget: function (section_id, option_index, cfgvalue) {\n        var choices = this.transformChoices();\n        var widget = new ui.Dropdown((cfgvalue != null) ? cfgvalue : this.default, choices, {\n            id: this.cbid(section_id),\n            sort: this.keylist,\n            optional: true,\n            select_placeholder: this.select_placeholder || this.placeholder,\n            custom_placeholder: this.custom_placeholder || this.placeholder,\n            validate: L.bind(this.validate, this, section_id),\n            disabled: (this.readonly != null) ? this.readonly : this.map.readonly\n        });\n\n        return widget.render();\n    },\n\n    value: function (value, title, description) {\n        if (description) {\n            form.ListValue.prototype.value.call(this, value, E([], [\n                E('span', { 'class': 'hide-open' }, [title]),\n                E('div', { 'class': 'hide-close', 'style': 'min-width:25vw' }, [\n                    E('strong', [title]),\n                    E('br'),\n                    E('span', { 'style': 'white-space:normal' }, description)\n                ])\n            ]));\n        }\n        else {\n            form.ListValue.prototype.value.call(this, value, title);\n        }\n    }\n});\n\nreturn view.extend({\n\n    render: function() {\n\n        var m, s, o;\n        m = new form.Map('watchdog', _('Watch Dog'), _('This is the security watchdog plugin for OpenWRT, which monitors and guards web login, SSH connections, and other situations.<br /><br />If you encounter any issues while using it, please submit them here:') + '<a href=\"https://github.com/sirpdboy/luci-app-watchdog\" target=\"_blank\">' + _('GitHub Project Address') + '</a>');\n        \n        s = m.section(form.TypedSection);\n        s.anonymous = true;\n        s.render = function() {\n            var statusView = E('p', { id: 'control_status' }, \n                '<span class=\"spinning\"> </span> ' + _('Checking status...'));\n            \n            poll.add(function() {\n                return checkProcess()\n                    .then(function(res) {\n                        var status = renderStatus(res.running);\n                        if (res.running && res.pid) {\n                            status += ' <small>(PID: ' + res.pid + ')</small>';\n                        }\n                        statusView.innerHTML = status;\n                    })\n                    .catch(function(err) {\n                        statusView.innerHTML = '<span style=\"color:orange\">⚠ ' + \n                            _('Status check failed') + '</span>';\n                        console.error('Status check error:', err);\n                    });\n            });\n\n            poll.start();\n            return E('div', { class: 'cbi-section', id: 'status_bar' }, statusView );\n        }\n\n        s = m.section(form.NamedSection, 'config', 'watchdog', _(''));\n        s.tab('basic', _('Basic Settings'));\n        s.tab('blacklist', _('Black list'));\n        s.addremove = false;\n        s.anonymous = true;\n\n        o = s.taboption('basic', form.Flag, 'enable', _('Enabled'));\n        \n        o = s.taboption('basic', form.Value, 'sleeptime', _('Check Interval (s)'));\n        o.rmempty = false;\n        o.placeholder = '60';\n        o.datatype = 'and(uinteger,min(10))';\n        o.description = _('Shorter intervals provide quicker response but consume more system resources.');\n\n        o = s.taboption('basic', form.MultiValue, 'login_control', _('Login control'));\n        o.value('web_logged', _('Web Login'));\n        o.value('ssh_logged', _('SSH Login'));\n        o.value('web_login_failed', _('Frequent Web Login Errors'));\n        o.value('ssh_login_failed', _('Frequent SSH Login Errors'));\n        o.modalonly = true;\n\n        o = s.taboption('basic', form.Value, 'login_max_num', _('Login failure count'));\n        o.default = '3';\n        o.rmempty = false;\n        o.datatype = 'and(uinteger,min(1))';\n        o.depends({ login_control: \"web_login_failed\", '!contains': true });\n        o.depends({ login_control: \"ssh_login_failed\", '!contains': true });\n        o.description = _('Reminder and optional automatic IP ban after exceeding the number of times');\n\n        o = s.taboption('blacklist', form.Flag, 'login_web_black', _('Auto-ban unauthorized login devices'));\n        o.default = '0';\n        o.depends({ login_control: \"web_login_failed\", '!contains': true });\n        o.depends({ login_control: \"ssh_login_failed\", '!contains': true });\n        \n        o = s.taboption('blacklist', form.Value, 'login_ip_black_timeout', _('Blacklisting time (s)'));\n        o.default = '86400';\n        o.rmempty = false;\n        o.datatype = 'and(uinteger,min(0))';\n        o.depends('login_web_black', '1');\n        o.description = _('\\\"0\\\" in ipset means permanent blacklist, use with caution. If misconfigured, change the device IP and clear rules in LUCI.');\n\n        o = s.taboption('blacklist', form.TextValue, 'ip_black_list', _('IP blacklist'));\n        o.rows = 8;\n        o.wrap = 'soft';\n        \n        o.cfgvalue = function(section_id) {\n            return fs.read('/usr/share/watchdog/api/ip_blacklist')\n                .then(function(content) {\n                    return content || '';\n                })\n                .catch(function(err) {\n                    console.error('Failed to read blacklist:', err);\n                    return '';\n                });\n        };\n        \n        o.write = function(section_id, formvalue) {\n            var self = this;\n            \n            return self.cfgvalue(section_id).then(function(oldValue) {\n                var newValue = (formvalue || '').trim();\n                \n                if (oldValue === newValue) {\n                    return;\n                }\n                if (newValue === '') {\n                    return fs.write('/usr/share/watchdog/api/ip_blacklist', '')\n                        .then(function() {\n                            \n                            return fs.exec('/etc/init.d/watchdog', ['restart'])\n                                .then(function() {\n                                    console.log('Watchdog restarted successfully');\n                                })\n                                .catch(function(err) {\n                                    console.error('Failed to restart watchdog:', err);\n                                    return fs.exec('/usr/bin/logger', ['-t', 'watchdog', 'Blacklist cleared via web interface']);\n                                });\n                        });\n                }\n                \n                var lines = newValue.split('\\n');\n                var validLines = [];\n                \n                for (var i = 0; i < lines.length; i++) {\n                    var line = lines[i].trim();\n                    if (line === '') {\n                        continue;\n                    }\n                    validLines.push(line);\n                }\n                \n                if (validLines.length === 0) {\n                    return fs.write('/usr/share/watchdog/api/ip_blacklist', '')\n                        .then(function() {\n                            \n                            return fs.exec('/etc/init.d/watchdog', ['restart'])\n                                .then(function() {\n                                    console.log('Watchdog restarted successfully');\n                                })\n                                .catch(function(err) {\n                                    console.error('Failed to restart watchdog:', err);\n                                    return fs.exec('/usr/bin/logger', ['-t', 'watchdog', 'Blacklist cleared via web interface']);\n                                });\n                        });\n                }\n                \n                var oldLines = oldValue ? oldValue.split('\\n').map(function(line) { return line.trim(); }).filter(function(line) { return line !== ''; }) : [];\n                var removedIPs = oldLines.filter(function(ip) {\n                    return validLines.indexOf(ip) === -1;\n                });\n                \n                var content = validLines.join('\\n') + '\\n';\n                return fs.write('/usr/share/watchdog/api/ip_blacklist', content)\n                    .then(function() {\n                        var message = _('Blacklist updated successfully');\n                        if (removedIPs.length > 0) {\n                            message += ' ' + _('Removed %s IP(s)').replace('%s', removedIPs.length);\n                            return fs.exec('/usr/bin/logger', ['-t', 'watchdog', 'Removed IPs from blacklist: ' + removedIPs.join(', ')])\n                                .then(function() {\n                                    return fs.exec('/etc/init.d/watchdog', ['restart']);\n                                });\n                        } else {\n                            return fs.exec('/etc/init.d/watchdog', ['restart']);\n                        }\n                    })\n                    .catch(function(err) {\n                        return Promise.reject(err);\n                    });\n            }).catch(function(err) {\n                return Promise.reject(err);\n            });\n        };\n        \n        o.description = _('Automatic ban blacklist list, with the ban time following the IP address. Delete all entries to clear the blacklist.');\n\n        return m.render();\n    }\n});"
  },
  {
    "path": "luci-app-watchdog/luci-app-watchdog/htdocs/luci-static/resources/view/watchdog/log.js",
    "content": "\n'use strict';\n'require dom';\n'require fs';\n'require poll';\n'require uci';\n'require view';\n'require form';\n\nreturn view.extend({\n\trender: function () {\n\t\tvar css = `\n\t\t\t#log_textarea pre {\n\t\t\t\tpadding: 10px; /* 内边距 */\n\t\t\t\tborder-bottom: 1px solid #ddd; /* 边框颜色 */\n\t\t\t\tfont-size: small;\n\t\t\t\tline-height: 1.3; /* 行高 */\n\t\t\t\twhite-space: pre-wrap;\n\t\t\t\tword-wrap: break-word;\n\t\t\t\toverflow-y: auto;\n\t\t\t}\n\t\t\t.cbi-section small {\n\t\t\t\tmargin-left: 1rem;\n\t\t\t\tfont-size: small; \n\t\t\t\tcolor: #666; /* 深灰色文字 */\n\t\t\t}\n\t\t`;\n\n\t\tvar log_textarea = E('div', { 'id': 'log_textarea' },\n\t\t\tE('img', {\n\t\t\t\t'src': L.resource(['icons/loading.gif']),\n\t\t\t\t'alt': _('Loading...'),\n\t\t\t\t'style': 'vertical-align:middle'\n\t\t\t}, _('Collecting data ...'))\n\t\t);\n\n\t\tvar log_path = '/tmp/watchdog/watchdog.log';\n\t\tvar lastLogContent = '';\n\n\t\tvar clear_log_button = E('div', {}, [\n\t\t\tE('button', {\n\t\t\t\t'class': 'cbi-button cbi-button-remove',\n\t\t\t\t'click': function (ev) {\n\t\t\t\t\tev.preventDefault();\n\t\t\t\t\tvar button = ev.target;\n\t\t\t\t\tbutton.disabled = true;\n\t\t\t\t\tbutton.textContent = _('Clear Logs...');\n\t\t\t\t\tfs.exec_direct('/usr/libexec/watchdog-call', ['clear_log'])\n\t\t\t\t\t\t.then(function () {\n\t\t\t\t\t\t\tbutton.textContent = _('Logs cleared successfully!');\n\t\t\t\t\t\t\tbutton.disabled = false;\n\t\t\t\t\t\t\tbutton.textContent = _('Clear Logs');\n\t\t\t\t\t\t\t// 立即刷新日志显示框\n\t\t\t\t\t\t\tvar log = E('pre', { 'wrap': 'pre' }, [_('Log is clean.')]);\n\t\t\t\t\t\t\tdom.content(log_textarea, log);\n\t\t\t\t\t\t\tlastLogContent = '';\n\t\t\t\t\t\t})\n\t\t\t\t\t\t.catch(function () {\n\t\t\t\t\t\t\tbutton.textContent = _('Failed to clear log.');\n\t\t\t\t\t\t\tbutton.disabled = false;\n\t\t\t\t\t\t\tbutton.textContent = _('Clear Logs');\n\t\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}, _('Clear Logs'))\n\t\t]);\n\n\t\tpoll.add(L.bind(function () {\n\t\t\treturn fs.read_direct(log_path, 'text')\n\t\t\t\t.then(function (res) {\n\t\t\t\t\tvar newContent = res.trim() || _('Log is clean.');\n\n\t\t\t\t\tif (newContent !== lastLogContent) {\n\t\t\t\t\t\tvar log = E('pre', { 'wrap': 'pre' }, [newContent]);\n\t\t\t\t\t\tdom.content(log_textarea, log);\n\t\t\t\t\t\tlog.scrollTop = log.scrollHeight;\n\t\t\t\t\t\tlastLogContent = newContent;\n\t\t\t\t\t}\n\t\t\t\t}).catch(function (err) {\n\t\t\t\t\tvar log;\n\t\t\t\t\tif (err.toString().includes('NotFoundError')) {\n\t\t\t\t\t\tlog = E('pre', { 'wrap': 'pre' }, [_('Log file does not exist.')]);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tlog = E('pre', { 'wrap': 'pre' }, [_('Unknown error: %s').format(err)]);\n\t\t\t\t\t}\n\t\t\t\t\tdom.content(log_textarea, log);\n\t\t\t\t});\n\t\t}));\n\n\t\treturn E('div', { 'class': 'cbi-map' }, [\n\t\t\tE('style', [css]),\n\t\t\tE('div', { 'class': 'cbi-section' }, [\n\t\t\t\tclear_log_button,\n\t\t\t\tlog_textarea,\n\t\t\t\tE('small', {}, _('Refresh every 5 seconds.').format(L.env.pollinterval)),\n\t\t\t\tE('div', { 'class': 'cbi-section-actions cbi-section-actions-right' })\n\t\t\t])\n\n\n\t\t]);\n\t},\n\n\thandleSaveApply: null,\n\thandleSave: null,\n\thandleReset: null\n});\n"
  },
  {
    "path": "luci-app-watchdog/luci-app-watchdog/po/templates/watchdog.pot",
    "content": "msgid \"\"\nmsgstr \"\"\n\"PO-Revision-Date: 2024-2025\\n\"\n\"Last-Translator: https://github.com/sirpdboy/luci-app-watchdog \\n\"\n\"Language-Team: \\n\"\n\"Language: zh_Hans\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: Weblate 4.18-dev\\n\"\n\nmsgid \"watchdog\"\nmsgstr \"\"\n\nmsgid \"Watch Dog\"\nmsgstr \"\"\n\nmsgid \"Basic Settings\"\nmsgstr \"\"\n\nmsgid \"Advance Setting\"\nmsgstr \"\"\n\nmsgid \"Checking status...\"\nmsgstr \"\"\n\nmsgid \"Log\"\nmsgstr \"\"\n\nmsgid \"This is the security watchdog plugin for OpenWRT, which monitors and guards web login, SSH connections, and other situations.<br /><br />If you encounter any issues while using it, please submit them here:\"\nmsgstr \"\"\n\nmsgid \"GitHub Project Address\"\nmsgstr \"\"\n\nmsgid \"Login control\"\nmsgstr \"\"\n\nmsgid \"Black list\"\nmsgstr \"\"\n\nmsgid \"White list\"\nmsgstr \"\"\n\nmsgid \"You may need to save the configuration before sending.\"\nmsgstr \"\"\n\nmsgid \"Unknown error: %s.\"\nmsgstr \"\"\n\nmsgid \"Check Interval (s)\"\nmsgstr \"\"\n\nmsgid \"Shorter intervals provide quicker response but consume more system resources.\"\nmsgstr \"\"\n\n\nmsgid \"Web Login\"\nmsgstr \"\"\n\nmsgid \"SSH Login\"\nmsgstr \"\"\n\nmsgid \"Frequent Web Login Errors\"\nmsgstr \"\"\n\nmsgid \"Frequent SSH Login Errors\"\nmsgstr \"\"\n\nmsgid \"Login failure count\"\nmsgstr \"\"\n\nmsgid \"Reminder and optional automatic IP ban after exceeding the number of times\"\nmsgstr \"\"\n\n\n\nmsgid \"Please select device MAC\"\nmsgstr \"\"\n\nmsgid \"Auto-ban unauthorized login devices\"\nmsgstr \"\"\n\nmsgid \"Blacklisting time (s)\"\nmsgstr \"\"\n\nmsgid \"\\\"0\\\" in ipset means permanent blacklist, use with caution. If misconfigured, change the device IP and clear rules in LUCI.\"\nmsgstr \"\"\n\nmsgid \"Release port\"\nmsgstr \"\"\n\nmsgid \"Port\"\nmsgstr \"\"\n\nmsgid \"Open port after successful login<br/>example\\\"22\\\"\\\"21:25\\\"\\\"21:25,135:139\\\"\"\nmsgstr \"\"\n\nmsgid \"If you have disabled LAN port inbound and forwarding in Firewall - Zone Settings, it won't work.\"\nmsgstr \"\"\n\nmsgid \"Example: Forward port 13389 of this device (IPv4:10.0.0.1 / IPv6:fe80::10:0:0:2) to port 3389 of (IPv4:10.0.0.2 / IPv6:fe80::10:0:0:8)<br/>\\\"10.0.0.1,13389,10.0.0.2,3389\\\"<br/>\\\"fe80::10:0:0:1,13389,fe80::10:0:0:2,3389\\\"\"\nmsgstr \"\"\n\nmsgid \"Release time (s)\"\nmsgstr \"\"\n\nmsgid \"\\\"0\\\" in ipset means permanent release, use with caution\"\nmsgstr \"\"\n\nmsgid \"IP blacklist\"\nmsgstr \"\"\n\nmsgid \"Automatic ban blacklist list, with the ban time following the IP address\"\nmsgstr \"\"\n\n\nmsgid \"MAC Filtering Mode\"\nmsgstr \"\"\n\nmsgid \"Ignore devices in the list\"\nmsgstr \"\"\n\nmsgid \"Ignored devices will not logged\"\nmsgstr \"\"\n\nmsgid \"Notify only devices in the list\"\nmsgstr \"\"\n\nmsgid \"Notify only devices using this interface\"\nmsgstr \"\"\n\nmsgid \"Multiple choice is not currently supported\"\nmsgstr \"\"\n\nmsgid \"Ignored device list\"\nmsgstr \"\"\n\nmsgid \"Followed device list\"\nmsgstr \"\"\n\nmsgid \"Notify only devices using this interface\"\nmsgstr \"\"\n\n\nmsgid \"Login (Auto-Ban) Whitelist\"\nmsgstr \"\"\n\nmsgid \"Add the IP addresses in the list to the whitelist for the blocking function (if available), Only record in the log. Mask notation is currently not supported.\"\nmsgstr \"\"\n\nmsgid \"If you are not familiar with the meanings of these options, please do not modify them.<br/><br/>\"\nmsgstr \"\"\n\nmsgid \"Advanced Settings\"\nmsgstr \"\"\n\nmsgid \"Device online detection timeout (s)\"\nmsgstr \"\"\n\nmsgid \"Device offline detection timeout (s)\"\nmsgstr \"\"\n\nmsgid \"Offline detection count\"\nmsgstr \"\"\n\nmsgid \"If the device has good signal strength and no Wi-Fi sleep issues, you can reduce the above values.<br/>Due to the mysterious nature of Wi-Fi sleep during the night, if you encounter frequent disconnections, please adjust the parameters accordingly.<br/>..r(s_tq..\"\nmsgstr \"\"\n\n\nmsgid \"Devices\"\nmsgstr \"\"\n\nmsgid \"Disable active detection\"\nmsgstr \"\"\n\nmsgid \"Maximum concurrent processes\"\nmsgstr \"\"\n\nmsgid \"Do not change the setting value for low-performance devices, or reduce the parameters as appropriate.\"\nmsgstr \"\"\n\n\nmsgid \"Online time\"\nmsgstr \"\"\n\nmsgid \"Clear Logs...\"\nmsgstr \"\"\n\nmsgid \"Logs cleared successfully!\"\nmsgstr \"\"\n\nmsgid \"Clear Logs\"\nmsgstr \"\"\n\nmsgid \"Refresh every 5 seconds.\"\nmsgstr \"\"\n\nmsgid \"Content 1\"\nmsgstr \"\"\n\nmsgid \"Content 2\"\nmsgstr \"\"\n\nmsgid \"Device 1\"\nmsgstr \"\"\n\nmsgid \"Device 2\"\nmsgstr \"\"\n\nmsgid \"Device 3\"\nmsgstr \"\"\n\nmsgid \"Device 4\"\nmsgstr \"\"\n\n\nmsgid \"Device %s logged into router via %s\"\nmsgstr \"\"\n\nmsgid \"/ (Homepage login)\"\nmsgstr \"\"\n\nmsgid \"%s frequent %s login attempts\"\nmsgstr \"\"\n\nmsgid \"Block Information\"\nmsgstr \"\"\n\nmsgid \"Device %s (%s) frequently attempted %s %s login\"\nmsgstr \"\"\n\nmsgid \"%s logged into router via %s\"\nmsgstr \"\"\n\nmsgid \"Login Information\"\nmsgstr \"\"\n\nmsgid \"Device %s (%s) logged into router via %s %s\"\nmsgstr \"\"\n\nmsgid \"Time:\"\nmsgstr \"\"\n\nmsgid \"Device IP:\"\nmsgstr \"\"\n\nmsgid \"Login Method:\"\nmsgstr \"\"\n\n\nmsgid \"Initialization completed\"\nmsgstr \"\"\n\nmsgid \"Start running...\"\nmsgstr \"\"\n\n\nmsgid \"[Ban information]Cancel the ban IP:%s\"\nmsgstr \"\"\n\nmsgid \"[Block Information]Add to blacklist IP: %s Attempts:%s Time:%s\"\nmsgstr \"\"\n\n\nmsgid \"Failed to add to blacklist, invalid IP format: %s (removed from list)\"\nmsgstr \"\"\n\n"
  },
  {
    "path": "luci-app-watchdog/luci-app-watchdog/po/zh_Hans/watchdog.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"PO-Revision-Date: 2024-2025\\n\"\n\"Last-Translator: https://github.com/sirpdboy/luci-app-watchdog \\n\"\n\"Language-Team: \\n\"\n\"Language: zh_Hans\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"X-Generator: Weblate 4.18-dev\\n\"\n\nmsgid \"Control\"\nmsgstr \"管控\"\n\nmsgid \"Watch Dog\"\nmsgstr \"看门狗\"\n\nmsgid \"Watch Dog\"\nmsgstr \"看门狗\"\n\nmsgid \"Basic Settings\"\nmsgstr \"基本设置\"\n\nmsgid \"Advance Setting\"\nmsgstr \"高级设置\"\n\nmsgid \"Checking status...\"\nmsgstr \"检查状态...\"\n\nmsgid \"Log\"\nmsgstr \"日志\"\n\nmsgid \"This is the security watchdog plugin for OpenWRT, which monitors and guards web login, SSH connections, and other situations.<br /><br />If you encounter any issues while using it, please submit them here:\"\nmsgstr \"这是openwrt的安全看门狗插件，监视和守护WEB登陆SSH连接等情况<br /><br />如果你在使用中遇到问题，请到这里提交：\"\n\nmsgid \"GitHub Project Address\"\nmsgstr \"GitHub 项目地址\"\n\nmsgid \"Login control\"\nmsgstr \"管控内容\"\n\nmsgid \"Black list\"\nmsgstr \"黑名单\"\n\nmsgid \"White list\"\nmsgstr \"白名单\"\n\nmsgid \"You may need to save the configuration before sending.\"\nmsgstr \"你可能需要先保存配置再进行发送\"\n\nmsgid \"Unknown error: %s.\"\nmsgstr \"未知错误：%s\"\n\nmsgid \"Check Interval (s)\"\nmsgstr \"检测间隔时间（秒）\"\n\nmsgid \"Shorter intervals provide quicker response but consume more system resources.\"\nmsgstr \"越短的间隔时间响应越快，但会占用更多的系统资源\"\n\n\nmsgid \"Web Login\"\nmsgstr \"Web 登录\"\n\nmsgid \"SSH Login\"\nmsgstr \"SSH 登录\"\n\nmsgid \"Frequent Web Login Errors\"\nmsgstr \"Web 频繁错误登录\"\n\nmsgid \"Frequent SSH Login Errors\"\nmsgstr \"SSH 频繁错误登录\"\n\nmsgid \"Login failure count\"\nmsgstr \"登录失败次数\"\n\nmsgid \"Reminder and optional automatic IP ban after exceeding the number of times\"\nmsgstr \"超过次数后记录并可选自动封禁IP\"\n\n\n\nmsgid \"Please select device MAC\"\nmsgstr \"请选择设备 MAC\"\n\nmsgid \"Auto-ban unauthorized login devices\"\nmsgstr \"自动封禁非法登录设备\"\n\nmsgid \"Blacklisting time (s)\"\nmsgstr \"拉黑时间（秒）\"\n\nmsgid \"\\\"0\\\" in ipset means permanent blacklist, use with caution. If misconfigured, change the device IP and clear rules in LUCI.\"\nmsgstr \"\\\"0\\\" 为永久拉黑，慎用。如不幸误操作，请更改设备 IP 进入 LUCI 界面清空规则。\"\n\nmsgid \"Release port\"\nmsgstr \"放行端口\"\n\nmsgid \"Port\"\nmsgstr \"端口\"\n\nmsgid \"Open port after successful login<br/>example：\\\"22\\\"、\\\"21:25\\\"、\\\"21:25,135:139\\\"\"\nmsgstr \"登录成功后开放端口<br/>例：\\\"22\\\"、\\\"21:25\\\"、\\\"21:25,135:139\\\"\"\n\nmsgid \"If you have disabled LAN port inbound and forwarding in Firewall - Zone Settings, it won't work.\"\nmsgstr \"如在 防火墙 - 区域设置 中禁用了 LAN 口入站和转发，该功能将不起作用\"\n\nmsgid \"Example: Forward port 13389 of this device (IPv4:10.0.0.1 / IPv6:fe80::10:0:0:2) to port 3389 of (IPv4:10.0.0.2 / IPv6:fe80::10:0:0:8)<br/>\\\"10.0.0.1,13389,10.0.0.2,3389\\\"<br/>\\\"fe80::10:0:0:1,13389,fe80::10:0:0:2,3389\\\"\"\nmsgstr \"例：将本机 (IPv4:10.0.0.1 / IPv6:fe80::10:0:0:2) 的 13389 端口转发到 (IPv4:10.0.0.2 / IPv6:fe80::10:0:0:8) 的 3389 端口:<br/>\\\"10.0.0.1,13389,10.0.0.2,3389\\\"<br/>\\\"fe80::10:0:0:2,13389,fe80::10:0:0:8,3389\\\"\"\n\nmsgid \"Release time (s)\"\nmsgstr \"放行时间（秒）\"\n\nmsgid \"\\\"0\\\" in ipset means permanent release, use with caution\"\nmsgstr \"\\\"0\\\" 为永久放行，慎用\"\n\nmsgid \"IP blacklist\"\nmsgstr \"IP黑名单列表\"\n\nmsgid \"Automatic ban blacklist list, with the ban time following the IP address\"\nmsgstr \"自动封禁黑名单列表，IP后面是封禁时间\"\n\n\nmsgid \"MAC Filtering Mode\"\nmsgstr \"MAC 过滤模式\"\n\nmsgid \"Ignore devices in the list\"\nmsgstr \"忽略列表内设备\"\n\nmsgid \"Ignored devices will not logged\"\nmsgstr \"被忽略设备不做日志记录\"\n\nmsgid \"Notify only devices in the list\"\nmsgstr \"仅通知列表内设备\"\n\nmsgid \"Notify only devices using this interface\"\nmsgstr \"仅通知此接口设备\"\n\nmsgid \"Multiple choice is not currently supported\"\nmsgstr \"暂不支持多选\"\n\nmsgid \"Ignored device list\"\nmsgstr \"忽略设备列表\"\n\nmsgid \"Followed device list\"\nmsgstr \"关注设备列表\"\n\nmsgid \"Notify only devices using this interface\"\nmsgstr \"仅通知此接口设备\"\n\n\nmsgid \"Login (Auto-Ban) Whitelist\"\nmsgstr \"登录（自动封禁）白名单\"\n\nmsgid \"Add the IP addresses in the list to the whitelist for the blocking function (if available), Only record in the log. Mask notation is currently not supported.\"\nmsgstr \"列表内 IP 加入封禁功能白名单(如果可用)，仅在日志中记录，暂不支持掩码位表示\"\n\nmsgid \"If you are not familiar with the meanings of these options, please do not modify them.<br/><br/>\"\nmsgstr \"如果你不了解这些选项的含义，请不要修改这些选项<br/><br/>\"\n\nmsgid \"Advanced Settings\"\nmsgstr \"高级设置\"\n\nmsgid \"Device online detection timeout (s)\"\nmsgstr \"设备上线检测超时（秒）\"\n\nmsgid \"Device offline detection timeout (s)\"\nmsgstr \"设备离线检测超时（秒）\"\n\nmsgid \"Offline detection count\"\nmsgstr \"离线检测次数\"\n\nmsgid \"If the device has good signal strength and no Wi-Fi sleep issues, you can reduce the above values.<br/>Due to the mysterious nature of Wi-Fi sleep during the night, if you encounter frequent disconnections, please adjust the parameters accordingly.<br/>..╮(╯_╰）╭..\"\nmsgstr \"若设备信号强度良好，无息屏 WiFi 休眠问题，可以减少以上数值<br/>因夜间 WiFi 息屏休眠较为玄学，遇到设备频繁推送断开，烦请自行调整参数<br/>..╮(╯_╰）╭..\"\n\n\nmsgid \"Devices\"\nmsgstr \"设备\"\n\nmsgid \"Disable active detection\"\nmsgstr \"关闭主动探测\"\n\nmsgid \"Maximum concurrent processes\"\nmsgstr \"最大并发进程数\"\n\nmsgid \"Do not change the setting value for low-performance devices, or reduce the parameters as appropriate.\"\nmsgstr \"低性能设备请勿更改设置值，或酌情减少参数\"\n\n\nmsgid \"Online time\"\nmsgstr \"在线时间\"\n\nmsgid \"Clear Logs...\"\nmsgstr \"清除日志...\"\n\nmsgid \"Logs cleared successfully!\"\nmsgstr \"日志清除成功！\"\n\nmsgid \"Clear Logs\"\nmsgstr \"清除日志\"\n\nmsgid \"Refresh every 5 seconds.\"\nmsgstr \"每 5 秒刷新\"\n\nmsgid \"Content 1\"\nmsgstr \"内容1\"\n\nmsgid \"Content 2\"\nmsgstr \"内容2\"\n\nmsgid \"Device 1\"\nmsgstr \"设备1\"\n\nmsgid \"Device 2\"\nmsgstr \"设备2\"\n\nmsgid \"Device 3\"\nmsgstr \"设备3\"\n\nmsgid \"Device 4\"\nmsgstr \"设备4\"\n\nmsgid \"Device %s logged into router via %s\"\nmsgstr \"设备 %s 通过 %s 登录了路由器\"\n\nmsgid \"/ (Homepage login)\"\nmsgstr \"/ (首页登录)\"\n\nmsgid \"%s frequent %s login attempts\"\nmsgstr \"%s 频繁尝试 %s 登录\"\n\nmsgid \"Block Information\"\nmsgstr \"封禁信息\"\n\nmsgid \"Device %s (%s) frequently attempted %s %s login\"\nmsgstr \"设备 %s (%s) 频繁尝试 %s %s 登录\"\n\nmsgid \"%s logged into router via %s\"\nmsgstr \"%s 通过 %s 登录路由器\"\n\nmsgid \"Login Information\"\nmsgstr \"登录信息\"\n\nmsgid \"Device %s (%s) logged into router via %s %s\"\nmsgstr \"设备 %s (%s) 通过 %s %s 登录路由器\"\n\nmsgid \"Time:\"\nmsgstr \"时间：\"\n\nmsgid \"Device IP:\"\nmsgstr \"设备 IP：\"\n\nmsgid \"Login Method:\"\nmsgstr \"登录方式：\"\n\nmsgid \"Initialization completed\"\nmsgstr \"初始化完成\"\n\nmsgid \"Start running\"\nmsgstr \"开始运行\"\n\nmsgid \"[Ban information]Cancel the ban IP:%s\"\nmsgstr \"[封禁信息]取消封禁IP：%s \"\n\nmsgid \"[Block Information]Add to blacklist IP: %s Attempts:%s Time:%s\"\nmsgstr \"[封禁信息]添加黑名单IP：%s 尝试次数: %s 时间：%s\"\n\nmsgid \"Failed to add to blacklist, invalid IP format: %s (removed from list)\"\nmsgstr \"黑名单添加失败，IP %s 格式错误，已从列表中移除\"\n\nmsgid \"Multiple interfaces detected or configuration error\"\nmsgstr \"检测到多个接口或配置错误\"\n\nmsgid \"Failed to read settings, please check configuration.\"\nmsgstr \"读取设置失败，请检查配置。\"\n\nmsgid \"Log exceeded limit, keeping last 300 entries\"\nmsgstr \"日志超出限制，保留最后300条记录\"\n\nmsgid \"Whitelist add failed, IP format error\"\nmsgstr \"白名单添加失败，IP格式错误\"\n\nmsgid \"Failed to add to blacklist, invalid IP format: %s (removed from list)\"\nmsgstr \"添加到黑名单失败，IP格式无效：%s（已从列表中删除）\"\n\nmsgid \"[Ban information]Cancel the ban IP:%s\"\nmsgstr \"[封禁信息]取消封禁IP:%s\"\n\nmsgid \"[Block Information]Add to blacklist IP: %s Attempts:%s Time:%s\"\nmsgstr \"[阻止信息]添加到黑名单IP:%s尝试次数：%s时间：%s\"\n\nmsgid \"\"\nmsgstr \"\"\n\nmsgid \"\"\nmsgstr \"\"\n\n"
  },
  {
    "path": "luci-app-watchdog/luci-app-watchdog/root/usr/share/luci/menu.d/luci-app-watchdog.json",
    "content": "{\n\t\"admin/control\": {\n\t\t\"title\": \"Control\",\n\t\t\"order\": 44,\n\t\t\"action\": {\n\t\t\t\"type\": \"firstchild\",\n\t\t\t\"recurse\": true\n\t\t}\n\t},\n\t\"admin/control/watchdog\": {\n\t\t\"title\": \"Watch Dog\",\n\t\t\"order\": 10,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"watchdog/basic\"\n\t\t},\n\t\t\"depends\": {\n\t\t\t\"acl\": [ \"luci-app-watchdog\" ],\n\t\t\t\"uci\": { \"watchdog\": true }\n\t\t}\n\t},\n\n\t\"admin/control/watchdog/config\": {\n\t\t\"title\": \"Basic Settings\",\n\t\t\"order\": 20,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"watchdog/basic\"\n\t\t}\n\t},\n\t\"admin/control/watchdog/log\": {\n\t\t\"title\": \"Log\",\n\t\t\"order\": 30,\n\t\t\"action\": {\n\t\t\t\"type\": \"view\",\n\t\t\t\"path\": \"watchdog/log\"\n\t\t}\n\t}\n\n}\n"
  },
  {
    "path": "luci-app-watchdog/luci-app-watchdog/root/usr/share/rpcd/acl.d/luci-app-watchdog.json",
    "content": "{\n\t\"luci-app-watchdog\": {\n\t\t\"description\": \"Grant UCI access for luci-app-watchdog\",\n\t\t\"read\": {\n\t\t\t\"file\": {\n\t\t\t\t\"/etc/init.d/watchdog\": [ \"exec\" ],\n\t\t\t\t\"/usr/share/watchdog/watchdog\": [ \"exec\" ],\n\t\t\t\t\"/tmp/watchdog/*\": [ \"read\" ],\n\t\t\t\t\"/usr/libexec/watchdog-call\": [ \"exec\" ],\n\t\t\t\t\"/bin/pidof\": [ \"exec\" ]\n\t\t\t},\n\t\t\t\"ubus\": {\n\t\t\t\t\"control\": [ \"list\" ]\n\t\t\t},\n\t\t\t\"uci\": [ \"watchdog\" ]\n\t\t},\n\t\t\"write\": {\n\t\t\t\"file\": {\n\t\t\t\t\"/tmp/watchdog/*\": [ \"write\" ],\n\t\t\t\t\"/usr/share/watchdog/api/*\": [ \"write\" ]\n\t\t\t},\n\t\t\t\"uci\": [ \"watchdog\" ]\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "luci-app-watchdog/luci-app-watchdog/root/usr/share/watchdog/api/device_aliases.list",
    "content": "#  Examples :\n#XX:XX:XX:XX:XX:XX\tMy Phone\n#192.168.1.2\tMy PC\n"
  },
  {
    "path": "luci-app-watchdog/luci-app-watchdog/root/usr/share/watchdog/api/ip_attribution.list",
    "content": "https://ip.rss.ink/v1/qqwry?ip=${ip} | jq -r '.data.area'\nip.plus/${ip} | sed -n 's/.*来自: //p'\nhttp://ip-api.com/json/${ip}?lang=zh-CN | jq -r '\"\\(.country) \\(.regionName) \\(.city)\"'"
  },
  {
    "path": "luci-app-watchdog/luci-app-watchdog/root/usr/share/watchdog/api/ip_blacklist",
    "content": " "
  },
  {
    "path": "luci-app-watchdog/luci-app-watchdog/root/usr/share/watchdog/api/ipv4.list",
    "content": "ddns.oray.com/checkip\nwww.net.cn/static/customercare/yourip.asp\nip.3322.net\nip.threep.top\nip.atomo.cn\nip.ddnspod.com\n4.ipw.cn\nipv4.ip.mir6.com"
  },
  {
    "path": "luci-app-watchdog/luci-app-watchdog/root/usr/share/watchdog/api/ipv6.list",
    "content": "speed.neu6.edu.cn/getIP.php\n6.ipw.cn\nip.atomo.cn\nip.ddnspod.com\nv6.ip.zxinc.org/getip\nipv6.ip.mir6.com"
  },
  {
    "path": "luci-app-watchdog/watchdog/Makefile",
    "content": "#\n# Copyright (C) 2025-2026 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-watchdog\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=watchdog\nPKG_VERSION:=1\nPKG_RELEASE:=6\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n\tSECTION:=utils\n\tCATEGORY:=Utilities\n\tTITLE:=Routing Security Watchdog for OpenWrt\n\tDEPENDS:=+curl +bash\nendef\n\ndefine Package/$(PKG_NAME)/description\n\tRouting Security Watchdog for OpenWrt  @sirpdboy  <herboy2008@gmail.com>\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/watchdog\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/etc/config\n\t$(CP) ./files/watchdog.config $(1)/etc/config/watchdog\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_BIN) $(CURDIR)/files/watchdog.init $(1)/etc/init.d/watchdog\n\t$(INSTALL_DIR) $(1)/usr/libexec\n\t$(INSTALL_BIN) $(CURDIR)/files/watchdog-call.libexec $(1)/usr/libexec/watchdog-call\n\t$(INSTALL_DIR) $(1)/usr/share/watchdog\n\t$(INSTALL_BIN) $(CURDIR)/files/watchdog.share $(1)/usr/share/watchdog/watchdog\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "luci-app-watchdog/watchdog/files/watchdog-call.libexec",
    "content": "#!/bin/sh\n#\n# Copyright (C) 2025 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-watchdog\n# \n\nlogfile=\"/tmp/watchdog/watchdog.log\"\ndir=\"/tmp/watchdog\" && mkdir -p \"${dir}\"\nlang=$(uci get luci.main.lang 2>/dev/null)\nif [ -z \"$lang\" ] || [[ \"$lang\" == \"auto\" ]]; then\n\tlang=$(echo \"${LANG:-${LANGUAGE:-${LC_ALL:-${LC_MESSAGES:-zh_cn}}}}\" | awk -F'[ .@]' '{print tolower($1)}' | sed 's/-/_/' 2>/dev/null)\nfi\n\ntranslate() {\n\t# 处理特殊字符\n\tlocal lua_script=$(cat <<LUA\n\trequire \"luci.i18n\".setlanguage(\"$lang\")\n\tprint(require \"luci.i18n\".translate([==[$1]==]))\nLUA\n\t)\n\n\tlua -e \"$lua_script\"\n}\n\nif [ \"$1\" == \"clear_log\" ]; then\n\t# 清空日志\n\t>\"${logfile}\"\n\nelif [ \"$1\" == \"child\" ]; then\n\tshift\n\tcommand_name=$1\n\tshift\n\t\"$command_name\" \"$@\"\nfi\n"
  },
  {
    "path": "luci-app-watchdog/watchdog/files/watchdog.config",
    "content": "\nconfig watchdog 'config'\n\toption sleeptime '60'\n\toption debuglevel '1'\n\toption up_timeout '2'\n\toption down_timeout '10'\n\toption timeout_retry_count '2'\n\toption thread_num '3'\n\tlist login_control 'web_logged'\n\tlist login_control 'ssh_logged'\n\tlist login_control 'web_login_failed'\n\tlist login_control 'ssh_login_failed'\n\toption login_max_num '3'\n\toption enable '0'\n\toption login_web_black '1'\n\toption login_ip_black_timeout '86400'\n\n"
  },
  {
    "path": "luci-app-watchdog/watchdog/files/watchdog.init",
    "content": "#!/bin/sh /etc/rc.common\n#\n# Copyright (C) 2025-2026 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-watchdog\n# \n\nSTART=99\nSTOP=10\nUSE_PROCD=1\nconfig=watchdog\ndir=\"/tmp/$config/\"\n\nstart_service() {\n    clear_rule\n    procd_open_instance\n    enable_value=$(uci get $config.config.enable 2>/dev/null || echo \"0\")\n    [ \"$enable_value\" -ne \"0\" ] && procd_set_param command /usr/share/$config/$config && echo \"$config is starting now ...\"\n    procd_close_instance\n}\n\nreload_service() {\n    stop\n    sleep 1\n    start\n}\n\ndetect_firewall_type() {\n    if command -v nft >/dev/null && [ -x /sbin/fw4 ]; then\n        echo \"nft\"\n    elif command -v iptables >/dev/null || command -v ip6tables >/dev/null; then\n        echo \"iptables\"\n    else\n        echo \"unknown\"\n    fi\n}\nclear_rule(){\n\n\n    local fw_type=$(detect_firewall_type)\n\n    if [ \"$fw_type\" = \"nft\" ]; then\n\n        local drop_handles=$(nft -a list ruleset 2>/dev/null | grep -E \"watchdog Drop rule\" | awk '{print $NF}')\n        for handle in $drop_handles; do\n            nft delete rule inet fw4 input handle $handle 2>/dev/null\n        done\n        nft delete rule inet fw4 watchdog_input ip saddr @watchdog_blacklist 2>/dev/null\n        nft delete rule inet fw4 watchdog_input ip6 saddr @watchdog_blacklistv6 2>/dev/null\n        nft delete rule inet fw4 watchdog_input ether saddr @watchdog_blacklistbridge 2>/dev/null\n        nft delete chain inet fw4 watchdog_input 2>/dev/null\n        nft delete set inet fw4 watchdog_blacklist 2>/dev/null\n        nft delete set inet fw4 watchdog_blacklistv6 2>/dev/null\n        nft delete set inet fw4 watchdog_blacklistbridge 2>/dev/null\n    elif [ \"$fw_type\" = \"iptables\" ]; then\n        iptables -D INPUT -m set --match-set watchdog_blacklist src -j DROP 2>/dev/null\n        iptables -D INPUT -m set --match-set watchdog_range src -j DROP 2>/dev/null\n        ip6tables -D INPUT -m set --match-set watchdog_blacklistv6 src -j DROP 2>/dev/null\n        ipset destroy watchdog_blacklist 2>/dev/null\n        ipset destroy watchdog_blacklistv6 2>/dev/null\n        ipset destroy watchdog_range 2>/dev/null\n    fi\n\n}\nstop_service() {\n    [ -f ${dir}child_pid ] && parent_pid=$(cat ${dir}child_pid)\n    clear_rule\n    [ -n \"$parent_pid\" ] && {\n        child_pids=$(pgrep -P $parent_pid)\n        echo \"Terminating child processes of $config...\"\n        for child_pid in $child_pids; do\n            kill $child_pid\n        done\n    }\n    local pids=$(ps | grep \"$config\" | grep -v grep | grep -v $$ | awk '{print $1}')\n\t[ -n \"$pids\" ] && echo \"$pids\" | xargs kill 2>/dev/null\n    echo \"Terminating $config process...\"\n}\n\nservice_triggers() {\n    procd_add_reload_trigger $config\n}\n"
  },
  {
    "path": "luci-app-watchdog/watchdog/files/watchdog.share",
    "content": "#!/bin/bash\n#\n# Copyright (C) 2025 sirpdboy herboy2008@gmail.com https://github.com/sirpdboy/luci-app-watchdog\n# \n\nAPP=watchdog\nbase_dir=\"/usr/share/$APP\"\napi_dir=\"$base_dir/api\"\n\n# 检测防火墙类型\ndetect_firewall_type() {\n    if command -v nft >/dev/null && [ -x /sbin/fw4 ]; then\n        echo \"nft\"\n    elif command -v iptables >/dev/null; then\n        echo \"iptables\"\n    else\n        echo \"unknown\"\n    fi\n}\n\n# 读取设置文件\nget_config() {\n\twhile [[ \"$*\" != \"\" ]]; do\n\t\t[[ \"$1\" == \"lang\" ]] && {\n\t\t\tlang=$(uci get luci.main.lang 2>/dev/null)\n\t\t\tif [ -z \"$lang\" ] || [[ \"$lang\" == \"auto\" ]]; then\n\t\t\t\tlang=$(echo \"${LANG:-${LANGUAGE:-${LC_ALL:-${LC_MESSAGES:-zh_cn}}}}\" | awk -F'[ .@]' '{print tolower($1)}' | sed 's/-/_/' 2>/dev/null)\n\t\t\tfi\n\t\t} || {\n\t\t\teval \"${1}='$(uci get $APP.config.$1 2>/dev/null)'\"\n\t\t}\n\t\tshift\n\tdone\n}\n\n\n\n# 初始化设置信息\nread_config() {\n\tget_config \\\n\t\t\"enable\" \"sleeptime\" \"lang\" \\\n\t\t\"login_control\" \"login_max_num\" \\\n        \"login_web_black\" \"login_ip_black_timeout\"\n\n\t(echo \"$login_control\" | grep -q \"web_logged\") && web_logged=\"true\"\n\t(echo \"$login_control\" | grep -q \"ssh_logged\") && ssh_logged=\"true\"\n\t(echo \"$login_control\" | grep -q \"web_login_failed\") && web_login_failed=\"true\"\n\t(echo \"$login_control\" | grep -q \"ssh_login_failed\") && ssh_login_failed=\"true\"\n\n\t(opkg list-installed | grep -w -q \"^firewall4\") && nftables_version=\"true\"\n    ip_blacklist_path=\"$api_dir/ip_blacklist\"\n\n\tipv4_urllist=$(cat /usr/share/$APP/api/ipv4.list) 2>/dev/null\n\tipv6_urllist=$(cat /usr/share/$APP/api/ipv6.list) 2>/dev/null\n\t[ -z \"$sleeptime\" ] && sleeptime=\"60\"\n\t[ -z \"$login_ip_black_timeout\" ] && login_ip_black_timeout=\"86400\"\n\tdeltemp\n}\n\n# 初始化\ninit() {\n\t# 检测程序开关\n\tenable_test\n\t[ -f \"$logfile\" ] && local logrow=$(grep -c \"\" \"$logfile\") || local logrow=\"0\"\n\t[ \"$logrow\" -ne 0 ] && echo \"----------------------------------\" >>${logfile}\n\tlog \"[INFO] $(translate \"Start running\")\"\n\tif [ -f \"/usr/share/$APP/errlog\" ]; then\n\t\tcat /usr/share/$APP/errlog >${logfile}\n\t\tlog \"[ERROR] $(translate \"Loaded logs from previous restart\")\"\n\tfi\n\n\t# 文件清理\n\trm -f  \"/usr/share/$APP/errlog\"  >/dev/null 2>&1\n\tLockFile unlock\n\n\t# 防火墙初始化\n\t[ -n \"$login_web_black\" ] && [ \"$login_web_black\" -eq \"1\" ] && init_ip_black \"ipv4\"\n\t[ -n \"$login_web_black\" ] && [ \"$login_web_black\" -eq \"1\" ] && init_ip_black \"ipv6\"\n\tset_ip_black\n\n\treturn 0\n}\n\n# 主程序\nmain() {\n\t# 限制并发进程\n\tdir=\"/tmp/$APP\"\n\tlogfile=\"${dir}/$APP.log\"\n\tmkdir -p \"$(dirname \"$logfile\")\"\n\tget_config \"thread_num\"\n\t[ -z \"$thread_num\" ] || [ \"$thread_num\" -eq \"0\" ] && thread_num=5\n\t[ \"$1\" ] && [ $1 == \"t1\" ] && thread_num=1\n\tmax_thread_num=\"$thread_num\"\n\n\tFIFO_PATH=\"${dir}/fifo.$$\"\n\tmkfifo \"$FIFO_PATH\"\n\texec 5<>\"$FIFO_PATH\"\n\trm \"$FIFO_PATH\" >/dev/null 2>&1\n\n\tfor i in $(seq 1 \"$max_thread_num\"); do\n\t\techo >&5\n\tdone\n\tunset i\n\n\t# 定义锁文件\n\tlock_file=\"${dir}/$APP.lock\"\n\ttouch \"$lock_file\"\n\n\t# 设置信号处理\n\ttrap cleanup SIGINT SIGTERM EXIT\n\tMAIN_PID=$$\n\tPROCESS_TAG=\"{watchdog}_${MAIN_PID}\"\n\n\tsilent_run read_config\n\n\t# 载入在线设备\n\tinit\n\t[ $? -eq 1 ] && log \"[ERROR] $(translate \"Failed to read settings, please check configuration.\")\" && exit\n\tif [ -n \"$web_logged\" ] || [ -n \"$ssh_logged\" ] || [ -n \"$web_login_failed\" ] || [ -n \"$ssh_login_failed\" ]; then\n\t\t# 声明关联数组\n\t\tdeclare -A web_login_counts\n\t\tdeclare -A ssh_login_counts\n\t\tdeclare -A web_failed_counts\n\t\tdeclare -A ssh_failed_counts\n\tfi\n\n\t>\"${dir}/send_enable.lock\"  && deltemp\n\tlog \"[INFO] $(translate \"Initialization completed\")\"\n\twhile [ \"$enable\" -eq \"1\" ]; do\n\t\tdeltemp\n\n\n\t\tsilent_run run_logins\n\t\tset_ip_black\n\t\tsleep $sleeptime\n\tdone\n}\n\n# 隐藏输出\nsilent_run() {\n\t\"$@\" >/dev/null 2>&1\n}\n\n\n# 计算字符串显示宽度\nlength_str() {\n\t[ -z \"$1\" ] && return\n\n\tlocal result\n\t{\n\t\tlocal str=\"$1\"\n\t\tlocal length=0\n\n\t\twhile IFS= read -r -n1 char; do\n\t\t\tlocal char_width\n\t\t\tchar_width=$(printf \"%s\" \"$char\" | awk '{\n\t\t\t\tif (match($0, /[一-龥]/)) print 2;\n\t\t\t\telse print 1;\n\t\t\t}')\n\n\t\t\tlength=$((length + char_width))\n\t\tdone <<< \"$str\"\n\n\t\tresult=\"$length\"\n\t} > /dev/null 2>&1\n\n\techo \"$result\"\n}\n\n# 字符串显示宽度处理\ncut_str() {\n\t[ -z \"$1\" ] && return\n\t\t[ -z \"$2\" ] && return\n\tlocal result\n\t# 调试模式不要输出信息\n\t{\n\t\tlocal str=\"$1\"\n\t\tlocal max_width=\"$2\"\n\t\tlocal current_width=0\n\n\t\t# 遍历字符串的每个字符\n\t\tfor ((i = 0; i < ${#str}; i++)); do\n\t\t\tlocal char=\"${str:$i:1}\"\n\t\t\tlocal char_width=$(length_str \"$char\")\n\n\t\t\t# 如果当前宽度加上当前字符的宽度超过最大宽度，则停止\n\t\t\tif [ $((current_width + char_width)) -gt \"$max_width\" ]; then\n\t\t\t\tbreak\n\t\t\tfi\n\n\t\t\tresult=\"${result}${char}\"\n\t\t\tcurrent_width=$((current_width + char_width))\n\t\tdone\n\n\t\t# 如果裁剪了字符串，则添加 \"..\"\n\t\tif [ \"$current_width\" -lt $(length_str \"$str\") ]; then\n\t\t\tresult=$(echo \"$result\" | sed 's/ *$//')\n\t\t\tresult=\"${result}..\"\n\t\tfi\n\t} > /dev/null 2>&1\n\n\techo \"$result\"\n}\n\n# 翻译\ntranslate() {\n\tlocal template=\"$1\"\n\tshift  # 移出第一个参数，剩余参数作为变量\n\t\n\t# 获取基础翻译\n\t\n\tlocal lua_script=$(cat <<LUA\n\trequire \"luci.i18n\".setlanguage(\"$lang\")\n\tprint(require \"luci.i18n\".translate([==[$template]==]))\nLUA\n\t)\n\tlocal translated=$(lua -e \"$lua_script\")\n\t\n\t# 如果有额外参数则进行格式化\n\tif [ $# -gt 0 ]; then\n\t\tprintf \"$translated\" \"$@\"\n\telse\n\t\techo \"$translated\"\n\tfi\n}\n\n# 随机数\nrand() {\n\tlocal min=$1\n\tlocal max=$(($2 - $min + 1))\n\tlocal num=$(date +%s%N)\n\techo $(($num % $max + $min))\n}\n# 初始化日志\nlog() {\n    echo \"$(date \"+%Y-%m-%d %H:%M:%S\") - $1\" >> \"$logfile\"\n}\n\n\n\n# 文件锁\nLockFile() {\n\tlocal fd=200\n\n\tif [ \"$1\" = \"lock\" ]; then\n\t\teval \"exec $fd>$lock_file\"\n\t\tflock -n $fd\n\t\tif [ $? -ne 0 ]; then\n\t\t\twhile ! flock -n $fd; do\n\t\t\t\tsleep 1\n\t\t\tdone\n\t\tfi\n\telif [ \"$1\" = \"unlock\" ]; then\n\t\teval \"exec $fd>&-\"\n\tfi\n}\n\n# 检测退出信号\ncleanup() {\n\tlocal pids=$(ps | grep -E \"\\{watchdog\\}_${MAIN_PID}|\\{watchdog-call\\}\" | grep -v grep | awk '{print $1}')\n\t[ -n \"$pids\" ] && echo \"$pids\" | xargs kill 2>/dev/null\n\tLockFile unlock\n\t$EXIT_FLAG && exit 0\n}\n\n# 子进程调用\nrun_with_tag() {\n\t[ -z \"$1\" ] && return\n\tlocal command_name=$1  # 第一个参数是命令名称\n\tshift # 移除第一个参数，剩下的参数传递给命令\n\tlocal command_path=$(readlink -f \"$(which \"$command_name\")\") # 检查命令路径\n\t\n\t# 如果是 BusyBox 的 applet，调用 watchdog-call\n\tif [[ \"$command_path\" == *\"busybox\"* ]]; then\n\t\t/usr/libexec/watchdog-call child \"$command_name\" \"$@\"\n\telse\n\t\tbash -c 'exec -a \"$0\" \"$@\"' \"${PROCESS_TAG} ${command_name}\" \"$command_name\" \"$@\"\n\tfi\n}\n\n\n# 清理临时文件\ndeltemp() {\n\trm -f \"${dir}/send_enable.lock\"   >/dev/null 2>&1\n\t[ -f \"$logfile\" ] && local logrow=$(grep -c \"\" \"$logfile\") || local logrow=\"0\"\n\t[ \"$logrow\" -gt 500 ] && tail -n 300 \"$logfile\" >\"${logfile}.tmp\" && mv \"${logfile}.tmp\" \"$logfile\" && log \"[DEBUG] $(translate \"Log exceeded limit, keeping last 300 entries\")\"\n}\n\n# ------------------------------------\n# 信息获取类\n\n\n# 查询 IP 归属地\nget_ip_attribution() {\n\tip=\"$1\"\n\tjq -e --arg ip \"$ip\" '.devices[] | select(.ip == $ip)' \"$devices_json\" >/dev/null 2>&1 && echo \"本地局域网\" && return\n\tlocal ip_attribution_urls=$(cat /usr/share/watchdog/api/ip_attribution.list)\n\tlocal sorted_attribution_urls=$(echo \"$ip_attribution_urls\" | awk 'BEGIN {srand()} {print rand() \"\\t\" $0}' | sort -k1,1n | cut -f2-)\n\tlocal ip_attribution_url\n\twhile IFS= read -r ip_attribution_url; do\n\t\tlocal login_ip_attribution=$(eval curl --connect-timeout 2 -m 2 -k -s \"$ip_attribution_url\" 2>/dev/null)\n\t\t[ -n \"$login_ip_attribution\" ] && echo \"$login_ip_attribution\" && break\n\tdone <<<\"$sorted_attribution_urls\"\n}\n\n\n# 检测程序开关\nenable_test() {\n\t[ -z \"$1\" ] && local time_n=1\n\tfor i in $(seq 1 $time_n); do\n\t\tget_config enable\n\t\t[ -z \"$enable\" ] || [ \"$enable\" -eq \"0\" ] && exit || sleep 1\n\tdone\n\tunset i\n}\n\n\n\n# 初始化黑名单规则\ninit_ip_black() {\n\t[ -n \"$login_web_black\" ] && [ \"$login_web_black\" -eq \"1\" ] || return\n\t# 设置 IP 版本变量\n\tif [ $1 == \"ipv4\" ]; then\n\t\tipset_name=\"watchdog_blacklist\"\n\t\tip_version=\"ip\"\n\telif [ $1 == \"ipv6\" ]; then\n\t\tipset_name=\"watchdog_blacklistv6\"\n\t\tip_version=\"ip6\"\n\t\tnat_table_cmd=\"family inet6\"\n\tfi\n\n\t[ -n \"$nftables_version\" ] && {\n\t\t! nft list set inet fw4 ${ipset_name} >/dev/null 2>&1 && nft add set inet fw4 ${ipset_name} { type ${1}_addr\\; flags timeout\\; timeout ${login_ip_black_timeout}s\\; }\n\t\t! nft list ruleset | grep \"$ip_version saddr @${ipset_name} counter .* comment \\\"\\!watchdog Drop rule\\\"\" >/dev/null 2>&1 && nft insert rule inet fw4 input $ip_version saddr @${ipset_name} counter drop comment \\\"\\!watchdog Drop rule\\\" >/dev/null 2>&1\n\t} || {\n\t\tipset list $ipset_name >/dev/null 2>&1 || ipset create ${ipset_name} hash:ip timeout ${login_ip_black_timeout} ${nat_table_cmd} >/dev/null 2>&1\n\t\t${ip_version}tables -C INPUT -m set --match-set ${ipset_name} src -j DROP >/dev/null 2>&1 || ${ip_version}tables -I INPUT -m set --match-set ${ipset_name} src -j DROP >/dev/null 2>&1\n\t}\n}\n\n# 添加黑名单\nadd_ip_black() {\n\tlocal login_ip=$1\n\t[ -z \"$login_ip\" ] && return 0\n\t# 检查 IP 版本\n\tunset ipset_name\n\t(echo \"$login_ip\" | grep -Eq '^([0-9]{1,3}\\.){3}[0-9]{1,3}$') && ipset_name=\"watchdog_blacklist\"\n\t(echo \"$login_ip\" | grep -Eq '^([\\da-fA-F0-9]{1,4}(:{1,2})){1,15}[\\da-fA-F0-9]{1,4}$') && ipset_name=\"watchdog_blacklistv6\"\n\t[ -z \"$ipset_name\" ] && sed -i \"/^$login_ip /d\" \"$ip_blacklist_path\" && log \"[WARN] $(translate \"Failed to add to blacklist, invalid IP format: %s (removed from list)\" \"$login_ip\")\" && return 1\n\n\t! cat \"$ip_blacklist_path\" | grep -q -w -i $login_ip && echo \"$login_ip timeout $login_ip_black_timeout\" >>\"$ip_blacklist_path\"\n\t[ -n \"$nftables_version\" ] && {\n\t\tnft list set inet fw4 ${ipset_name} | grep -qw \"${login_ip}\" && return 1 # IP 已存在\n\t\tnft add element inet fw4 $ipset_name { $login_ip expires ${login_ip_black_timeout}s } >/dev/null 2>&1\n\t} || {\n\t\tipset -exist add $ipset_name $login_ip timeout ${login_ip_black_timeout} >/dev/null 2>&1\n\t}\n}\n\n# 移出黑名单\ndel_ip_black() {\n\t[ -z \"$1\" ] && return\n\tsed -i \"/^${1}/d\" ${ip_blacklist_path}\n\n\t# 检查 IP 版本\n\tunset ipset_name\n\t(echo \"$1\" | grep -Eq '^([0-9]{1,3}\\.){3}[0-9]{1,3}$') && ipset_name=\"watchdog_blacklist\"\n\t(echo \"$1\" | grep -Eq '^([\\da-fA-F0-9]{1,4}(:{1,2})){1,15}[\\da-fA-F0-9]{1,4}$') && ipset_name=\"watchdog_blacklistv6\"\n\t[ -z \"$ipset_name\" ] && return\n\n\t[ -n \"$nftables_version\" ] && {\n\t\tnft delete element inet fw4 ${ipset_name} { $1 } >/dev/null 2>&1\n\t} || {\n\t\tipset list ${ipset_name} >/dev/null 2>&1 && ipset -! del ${ipset_name} ${1}\n\t}\n}\n\n# 设置防火墙列表\nset_ip_black() {\n\t# 检查换行，避免出错\n\t[ $(tail -n1 \"${ip_blacklist_path}\" | wc -l) -eq \"0\" ] && echo -e >>${ip_blacklist_path}\n\n\t# 从 ip_blacklist 文件逐行添加黑名单，add_ip_black() 处验证是否重复，此处不在验证\n\tfor ip_black in $(cat ${ip_blacklist_path} | awk '{print $1}'); do\n\t\tadd_ip_black \"$ip_black\"\n\tdone\n\t# 当 ip_blacklist 文件清除 IP 时，从集合中清除 IP\n\t[ -n \"$nftables_version\" ] && fw_info_blacklist=$(nft list set inet fw4 watchdog_blacklist | tr -d '\\n' | grep -oE 'elements = \\{[^}]*\\}' | grep -oE '[^{}]+ expires [^,}]+[,\\}]' | tr ',}' '\\n' | tr -s ' ' | sed -e 's/^[[:space:]]*//')\n\t[ -n \"$nftables_version\" ] && fw_info_blacklistv6=$(nft list set inet fw4 watchdog_blacklistv6 | tr -d '\\n' | grep -oE 'elements = \\{[^}]*\\}' | grep -oE '[^{}]+ expires [^,}]+[,\\}]' | tr ',}' '\\n' | tr -s ' ' | sed -e 's/^[[:space:]]*//')\n\t[ -z \"$nftables_version\" ] && fw_info_blacklist=$(ipset list watchdog_blacklist | grep \"timeout\" 2>/dev/null)\n\t[ -z \"$nftables_version\" ] && fw_info_blacklistv6=$(ipset list watchdog_blacklistv6 | grep \"timeout\" 2>/dev/null)\n\n\t[ -n \"$fw_info_blacklist\" ] && [ -n \"$fw_info_blacklistv6\" ] && combined_fw_info_blacklist=\"${fw_info_blacklist}\\n${fw_info_blacklistv6}\"\n\t[ -z \"$fw_info_blacklist\" ] && combined_fw_info_blacklist=\"${fw_info_blacklistv6}\" || combined_fw_info_blacklist=\"${fw_info_blacklist}\"\n\n\twhile IFS= read -r ip_black_info; do\n\t\tip_black=$(echo \"$ip_black_info\" | grep -Eo \"[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\")\n\t\t[ -z \"$ip_black\" ] && ip_black=$(echo \"$ip_black_info\" | grep -Eo \"([\\da-fA-F0-9]{1,4}(:{1,2})){1,15}[\\da-fA-F0-9]{1,4}\")\n\t\t[ -z \"$ip_black\" ] && continue\n\t\tcat ${ip_blacklist_path} | grep -q -w -i ${ip_black} && sed -i \"/^${ip_black}/d\" ${ip_blacklist_path} && echo ${ip_black_info} >>${ip_blacklist_path} || {\n\t\t    del_ip_black ${ip_black}\n\t\t    log \"$(translate \"[Ban information]Cancel the ban IP:%s\" \"$ip_black\")\"\n\t\t}\n\tdone <<<\"$combined_fw_info_blacklist\"\n}\n\n# 监听登录事件\nrun_logins() {\n\tif [ -n \"$web_logged\" ] || [ -n \"$ssh_logged\" ] || [ -n \"$web_login_failed\" ] || [ -n \"$ssh_login_failed\" ]; then\n\t\t\t# 监听系统日志，-f 表示跟随实时日志，-p 表示日志级别为 notice\n\t\t\trun_with_tag logread -f -p notice | while IFS= read -r line; do\n\t\t\t\t[ -n \"$web_logged\" ] && {\n\t\t\t\t\tweb_login_ip=$(echo \"$line\" | grep -i \"accepted login\" | awk '{print $NF}')\n\t\t\t\t\t[ -n \"$web_login_ip\" ] && process_login \"$web_login_ip\" $(echo \"$line\" | awk '{print $4}') web_login_counts\n\t\t\t\t}\n\n\t\t\t\t[ -n \"$ssh_logged\" ] && {\n\t\t\t\t\tssh_login_ip=$(echo \"$line\" | grep -i \"Password auth succeeded\\|Pubkey auth succeeded\" | awk '{print $NF}' | sed -nr 's#^(.*):.[0-9]{1,5}#\\1#gp' | sed -e 's/%.*//')\n\t\t\t\t\t[ -n \"$ssh_login_ip\" ] && process_login \"$ssh_login_ip\" $(echo \"$line\" | awk '{print $4}') ssh_login_counts\n\t\t\t\t}\n\n\t\t\t\t[ -n \"$web_login_failed\" ] && {\n\t\t\t\t\tweb_failed_ip=$(echo \"$line\" | grep -i \"failed login\" | awk '{print $NF}')\n\t\t\t\t\t[ -n \"$web_failed_ip\" ] && process_login \"$web_failed_ip\" $(echo \"$line\" | awk '{print $4}') web_failed_counts\n\t\t\t\t}\n\n\t\t\t\t[ -n \"$ssh_login_failed\" ] && {\n\t\t\t\t\t# 匹配特定的 SSH 登录失败情况并提取 IP 地址和时间\n\t\t\t\t\tssh_failed_ip=$(echo \"$line\" | grep -iE \"Bad password attempt|Login attempt for nonexistent user|Max auth tries reached\" | awk '{print $NF}' | sed -nr 's#^(.*):[0-9]{1,5}#\\1#gp' | sed -e 's/%.*//')\n\n\t\t\t\t\t# 如果未能提取到 IP，从日志标识符提取失败用户的 ID，并再次提取 IP\n\t\t\t\t\tif [ -z \"$ssh_failed_ip\" ]; then\n\t\t\t\t\t\tssh_failed_num=$(echo \"$line\" | sed -n 's/.*authpriv\\.warn dropbear\\[\\([0-9]\\+\\)\\]: Login attempt for nonexistent user/\\1/p')\n\t\t\t\t\t\t[ -n \"$ssh_failed_num\" ] && ssh_failed_ip=$(logread notice | grep \"authpriv\\.info dropbear\\[${ssh_failed_num}\\].*Child connection from\" | awk '{print $NF}' | sed -nr 's#^(.*):[0-9]{1,5}#\\1#gp' | sed -e 's/%.*//' | tail -n 1)\n\t\t\t\t\tfi\n\n\t\t\t\t\t# 如果成功提取到 IP 地址，调用 process_login 处理\n\t\t\t\t\t[ -n \"$ssh_failed_ip\" ] && process_login \"$ssh_failed_ip\" $(echo \"$line\" | awk '{print $4}') ssh_failed_counts\n\t\t\t\t}\n\n\t\t\tdone\n\t\tsleep 1\n\tfi\n}\n\n\n# 处理登录事件\n# 参数:\n#   $1: IP\n#   $2: 日志时间 - 从日志中读取而不是使用当前时间，避免秒对应不上\n#   $3: 数组名 - 记录 IP 和登录次数的关联数组名\nprocess_login() {\n\tlocal login_ip=$1\n\tlocal login_time=$2\n\tlocal -n login_counts=$3\n\n\t# 如果数组中不存在此 IP，初始化为 0\n\tif [ -z \"${login_counts[\"$login_ip\"]}\" ]; then\n\t\tlogin_counts[\"$login_ip\"]=0\n\tfi\n\t# +1\n\tlogin_counts[\"$login_ip\"]=$((login_counts[\"$login_ip\"] + 1))\n\tlocal count=${login_counts[\"$login_ip\"]}\n\n\t# 封禁\n\tif [[ (\"$3\" == \"web_failed_counts\" || \"$3\" == \"ssh_failed_counts\") ]]; then\n\t    if [[ $count -ge $login_max_num ]] ;then\n\t\tadd_ip_black ${login_ip} && {\n\t\t\tunset login_counts[\"$login_ip\"]\n\t\t\tlogin_send \"$login_ip\" \"$login_time\" \"$3\"\n\t\t\tlog \"$(translate \"[Block Information]Add to blacklist IP: %s Attempts:%s Time:%s\" \"$login_ip\" \"$count\" \"$login_time\" )\"\n\t\t}\n\t    else\n\t     \tlogin_send \"$login_ip\" \"$login_time\" \"$3\"\n\t    fi\n\t    \n\tfi\n\n\t# 正常登录\n\tif [[ \"$3\" == \"web_login_counts\" || \"$3\" == \"ssh_login_counts\" ]]; then\n\t\tdel_ip_black ${login_ip} # 白名单已经优先于黑名单，但白名单集合有超时限制，防止下次修改代码忘记，上保险\n\t\tunset web_failed_counts[\"$login_ip\"]\n\t\tunset ssh_failed_counts[\"$login_ip\"]\n\t\tunset login_counts[\"$login_ip\"]\n\t\tlogin_send \"$login_ip\" \"$login_time\" \"$3\"\n\tfi\n\t[ \"${#login_counts[@]}\" -gt \"100\" ] && login_counts=(\"${login_counts[@]: -100}\")\n}\n\n# 登录提醒\nlogin_send() {\n\tlocal login_ip=$1\n\tlocal login_time=$2\n\tlocal log_type=$3\n\n\tlocal login_title\n\tlocal login_content\n\n\t>\"${dir}/send_enable.lock\"\n\n\t[ -z \"$login_ip\" ] && return\n\n\t[[ \"$log_type\" == \"web\"* ]] && local log_type_short=\"Web\" || local log_type_short=\"SSH\"\n\t[ -f \"$logfile\" ] && login_log=$(grep -w \"$login_ip\" \"$logfile\" | grep -v \"\\[info\\]\" | tail -n 1)\n\t[ -n \"$login_log\" ] && log_timestamp=$(date -d \"$(echo \"$login_log\" | awk '{print $1, $2}')\" +%s) || log_timestamp=0\n\n\t# 查询 IP 归属地\n\tlocal login_ip_attribution=$(get_ip_attribution \"${login_ip}\")\n\t# 登录方式\n\tif [[ \"$log_type\" == \"web\"* ]]; then\n\t\t# Web 登录、非法登录\n\t\tlocal login_mode=$(logread notice | grep -E \".* $login_time.*$login_ip.*\" | awk '{print $13}' | tail -n 1)\n\t\t[ \"$login_mode\" = \"/\" ] && login_mode=\"$(translate \"/ (Homepage login)\")\"\n\telif [[ \"$log_type\" == \"ssh_login\"* ]]; then\n\t\t# SSH 登录\n\t\tlocal login_mode=$(logread notice | grep -E \".* $login_time.*$login_ip.*\" | awk '{print $8}' | tail -n 1)\n\telse\n\t\tlocal login_mode=$(logread notice | grep -E \".* $login_time.*$login_ip.*\" | awk '{for(i=8;i<NF;i++) if($i==\"from\") break; else printf $i \" \"}' | tail -n 1)\n\tfi\n\t\tif [[ \"$log_type\" == *\"failed\"* ]]; then\n\t\t\tlocal login_title=$(translate \"%s frequent %s login attempts\" \"$login_ip\" \"$log_type_short\")\n\t\t\tlocal login_content_info=\"${str_splitline}${str_title_start}$(translate \"Block Information\")${str_title_end}\"\n\t\t\tlog \"$(translate \"Device %s (%s) frequently attempted %s %s login\" \"$login_ip\" \"$login_ip_attribution\" \"$log_type_short\" \"$login_mode\")\"\n\t\telse\n\t\t\tlocal login_title=$(translate \"%s logged into router via %s\" \"$login_ip\" \"$log_type_short\")\n\t\t\tlocal login_content_info=\"${str_splitline}${str_title_start}$(translate \"Login Information\")${str_title_end}\"\n\t\t\tlog \"$(translate \"Device %s (%s) logged into router via %s %s\" \"$login_ip\" \"$login_ip_attribution\" \"$log_type_short\" \"$login_mode\")\"\n\t\tfi\n}\n\n\n\nmain \"$@\"\n"
  },
  {
    "path": "luci-app-webd/Makefile",
    "content": "# Copyright (C) 2020-2021 Hyy2001X <https://github.com/Hyy2001X>\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=luci-app-webd\nPKG_VERSION:=1.4\nPKG_RELEASE:=1\n\nLUCI_TITLE:=LuCI support for Webd Netdisk\nLUCI_PKGARCH:=all\n\nLUCI_DEPENDS:= \\\n\t+PACKAGE_$(PKG_NAME)_INCLUDE_WEBD_BINARY:webd\n\ndefine Package/$(PKG_NAME)/config\n\nconfig PACKAGE_$(PKG_NAME)_INCLUDE_WEBD_BINARY\n\tbool \"Include webd Binary\"\n\tdefault y\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "luci-app-webd/luasrc/controller/webd.lua",
    "content": "module(\"luci.controller.webd\",package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/webd\") then\n\t\treturn\n\tend\n\n\tentry({\"admin\", \"nas\", \"webd\"}, cbi(\"webd\"), _(\"Webd Netdisk\"),99)\n\tentry({\"admin\", \"nas\", \"webd\", \"status\"}, call(\"act_status\")).leaf = true\nend\n\nfunction act_status()\n\tlocal e = {}\n\te.running = luci.sys.call(\"pgrep webd > /dev/null\") == 0\n\tluci.http.prepare_content(\"application/json\")\n\tluci.http.write_json(e)\nend\n"
  },
  {
    "path": "luci-app-webd/luasrc/model/cbi/webd.lua",
    "content": "m = Map(\"webd\", translate(\"Webd Netdisk\"),\ntranslate(\"Webd - A lightweight self hosted netdisk\")\n.. [[  <a href=\"https://webd.cf/\">]]\n.. translate(\"Official Website\")\n.. [[</a>]]\n)\n\nm:section(SimpleSection).template  = \"webd/webd_status\"\n\ns = m:section(TypedSection, \"webd\", translate(\"Basic Settings\"), translate(\"Set the basic settings of Webd\"))\ns.anonymous = true\n\nenable = s:option(Flag, \"enable\", translate(\"Enable\"))\nenable.default = 0\n\nport = s:option(Value, \"webd_port\", translate(\"Listening Port\"))\nport.datatype = \"port\"\nport.default = \"9212\"\nport.rmempty = false\n\nenable_ipv6 = s:option(Flag, \"enable_ipv6\", translate(\"Listen IPv6\"), translatef(\"Listen both IPv4 and IPv6 Address\"))\nenable_ipv6.default = 0\n\nroot = s:option(Value, \"webd_root\", translate(\"Local Directory\"), translatef(\"Directory of Webd\"))\nroot.default = \"/mnt\"\nroot.rmempty = false\n\nenable_recyclebin = s:option(Flag, \"enable_recyclebin\", translate(\"Recycle Bin\"), translatef(\"Automatically create recycle bin directory\"))\nenable_recyclebin.default = 1\n\nenable_anonymous = s:option(Flag, \"enable_anonymous\", translate(\"Enable Anonymous Access\"), translatef(\"Anonymous access is allowed when enabled (Not Safe)\"))\nenable_anonymous.default = 0\n\nanonymous_perm = s:option(MultiValue, \"anonymous_perm\", translate(\"Anonymous Permission\"))\nanonymous_perm:value(\"r\", translate(\"Read files\"))\nanonymous_perm:value(\"l\", translate(\"Obtain file list\"))\nanonymous_perm:value(\"u\", translate(\"Upload files\"))\nanonymous_perm:value(\"m\", translate(\"Remove files\"))\nanonymous_perm:value(\"S\", translate(\"Show hidden files\"))\nanonymous_perm:value(\"D\", translate(\"Append download attribute\"))\nanonymous_perm:value(\"T\", translate(\"Play media\"))\nanonymous_perm:depends(\"enable_anonymous\", \"1\")\nanonymous_perm.description = translate(\"At least one permission must be choosed to allow anonymous access\")\n\nwebd_bin = s:option(Value, \"webd_bin\", translate(\"Binary Path\"), translatef(\"Webd binary Path\"))\nwebd_bin.default = \"/usr/bin/webd\"\nwebd_bin.rmempty = false\n\nwebd_conf = s:option(Value, \"webd_conf\", translate(\"Config Path\"), translatef(\"Webd config Path\"))\nwebd_conf.default = \"/etc/webd.conf\"\nwebd_conf.rmempty = false\n\ns = m:section(TypedSection, \"users\", translate(\"User Settings\"), translate(\"Set the username, password and permissions. Maximum for 2 accounts\"))\ns.anonymous = true\ns.addremove = true\ns.template = \"cbi/tblsection\"\n\nusername = s:option(Value, \"username\", translate(\"Username\"))\nusername.rmempty = false\n\npassword = s:option(Value, \"password\", translate(\"Password\"))\npassword.rmempty = false\npassword.password=false\n\nenable_read = s:option(Flag, \"enable_read\", translate(\"Read files\"))\nenable_read.default = 1\n\nenable_read_list = s:option(Flag, \"enable_read_list\", translate(\"Obtain file list\"))\nenable_read_list.default = 1\n\nenable_upload = s:option(Flag, \"enable_upload\", translate(\"Upload files\"))\nenable_upload.default = 1\n\nenable_move = s:option(Flag, \"enable_move\", translate(\"Remove files\"))\nenable_move.default = 1\n\nenable_showhide = s:option(Flag, \"enable_showhide\", translate(\"Show hidden files\"))\nenable_showhide.default = 0\n\nenable_play = s:option(Flag, \"enable_play\", translate(\"Play media\"))\nenable_play.default = 1\n\nreturn m\n"
  },
  {
    "path": "luci-app-webd/luasrc/view/webd/webd_status.htm",
    "content": "<script type=\"text/javascript\">//<![CDATA[\nXHR.poll(3, '<%=url([[admin]], [[nas]], [[webd]], [[status]])%>', null,\n\tfunction(x, data) {\n\t\tvar tb = document.getElementById('webd_status');\n\t\tif (data && tb) {\n\t\t\tif (data.running) {\n\t\t\t\tvar links = '<em><b><font color=green>Webd Netdisk <%:RUNNING%></font></b></em><input class=\"cbi-button-reload mar-10\" type=\"button\" value=\"<%:Open Web Interface%>\" onclick=\"WebUI();\" />';\n\t\t\t\ttb.innerHTML = links;\n\t\t\t} else {\n\t\t\t\ttb.innerHTML = '<em><b><font color=red>Webd Netdisk <%:NOT RUNNING%></font></b></em>';\n\t\t\t}\n\t\t}\n\t}\n);\n\nfunction WebUI(){\n\tvar url = window.location.host+\":<%=luci.sys.exec(\"uci -q get webd.@webd[0].webd_port\"):gsub(\"^%s*(.-)%s*$\", \"%1\")%>\";\n\twindow.open('http://'+url,'target','');\n}\n//]]>\n</script>\n<style>.mar-10 {margin-left: 50px; margin-right: 10px;}</style>\n<fieldset class=\"cbi-section\">\n\t<p id=\"webd_status\">\n\t\t<em><%:Collecting data...%></em>\n\t</p>\n</fieldset>"
  },
  {
    "path": "luci-app-webd/po/zh_Hans/webd.po",
    "content": "msgid \"Webd Netdisk\"\nmsgstr \"Webd 网盘\"\n\nmsgid \"Official Website\"\nmsgstr \"官网\"\n\nmsgid \"Basic Settings\"\nmsgstr \"基础设置\"\n\nmsgid \"Set the basic settings of Webd\"\nmsgstr \"配置 Webd 的基础设置\"\n\nmsgid \"Listening Port\"\nmsgstr \"监听端口\"\n\nmsgid \"Webd - A lightweight self hosted netdisk\"\nmsgstr \"Webd 是一款轻量级的 (self-hosted) 自建网盘软件, 界面简洁易用, 速度快资源占用低\"\n\nmsgid \"Listen IPv6\"\nmsgstr \"监听 IPv6\"\n\nmsgid \"Listen both IPv4 and IPv6 Address\"\nmsgstr \"同时监听 IPv4 和 IPv6 地址\"\n\nmsgid \"Enable Anonymous Access\"\nmsgstr \"允许匿名访问\"\n\nmsgid \"Anonymous Permission\"\nmsgstr \"匿名访问权限\"\n\nmsgid \"Anonymous access is allowed when enabled (Not Safe)\"\nmsgstr \"启用后将允许匿名用户访问 (不安全)\"\n\nmsgid \"At least one permission must be choosed to allow anonymous access\"\nmsgstr \"若要允许匿名访问则勾选至少一个权限\"\n\nmsgid \"Binary Path\"\nmsgstr \"程序路径\"\n\nmsgid \"Webd binary Path\"\nmsgstr \"Webd 程序路径\"\n\nmsgid \"Config Path\"\nmsgstr \"配置文件路径\"\n\nmsgid \"Webd config Path\"\nmsgstr \"Webd 配置文件路径\"\n\nmsgid \"Local Directory\"\nmsgstr \"本地路径\"\n\nmsgid \"Directory of Webd\"\nmsgstr \"Webd 监听路径\"\n\nmsgid \"Recycle Bin\"\nmsgstr \"回收站\"\n\nmsgid \"Automatically create recycle bin directory\"\nmsgstr \"允许自动创建回收站目录\"\n\nmsgid \"Set the username, password and permissions. Maximum for 2 accounts\"\nmsgstr \"设置用户名和密码, 以及单个用户的权限, 最多支持设置两个账号\"\n\nmsgid \"Read files\"\nmsgstr \"读取文件\"\n\nmsgid \"Obtain file list\"\nmsgstr \"获取文件列表\"\n\nmsgid \"Upload files\"\nmsgstr \"上传文件\"\n\nmsgid \"Remove files\"\nmsgstr \"删除或移动文件\"\n\nmsgid \"Show hidden files\"\nmsgstr \"显示隐藏文件\"\n\nmsgid \"Play media\"\nmsgstr \"播放媒体\"\n\nmsgid \"Append download attribute\"\nmsgstr \"附加下载属性\"\n"
  },
  {
    "path": "luci-app-webd/root/etc/config/webd",
    "content": "\nconfig webd\n\toption enable '0'\n\toption webd_port '9212'\n\nconfig users\n\toption enable_read '1'\n\toption enable_read_list '1'\n\toption enable_upload '1'\n\toption enable_move '1'\n\toption enable_showhide '0'\n\toption username 'root'\n\toption password 'password'\n"
  },
  {
    "path": "luci-app-webd/root/etc/init.d/webd",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=99\nUSE_PROCD=1\nLOGGER=\"logger -t [Webd]\"\n\nstart_service() {\n\tlocal basic_list=\"enable webd_conf webd_bin webd_port webd_root enable_recyclebin enable_anonymous anonymous_perm enable_ipv6\"\n\tlocal users_list=\"enable_read enable_read_list enable_upload enable_move enable_showhide\"\n\tfor i in $(echo $basic_list);do\n\t\tlocal eval $i=\"$(uci_get_by_type webd 0 $i)\"\n\tdone;unset i\n\tif [ \"$enable\" == 1 ]\n\tthen\n\t\t[ ! -r \"$webd_root\" -o ! -d \"$webd_root\" ] && EXIT \"Unable to access $webd_root,exit ...\"\n\t\t[ ! -x \"$webd_bin\" ] && EXIT \"Unable to access $webd_bin,exit ...\"\n\t\tif [ \"$enable_recyclebin\" == 1 -a ! -d \"$webd_root/.Trash\" ]\n\t\tthen\n\t\t\t${LOGGER} \"Creating Recycle Bin directory ...\"\n\t\t\tmkdir -p $webd_root/.Trash || EXIT \"Failed to create Recycle Bin directory,exit ...\"\n\t\tfi\n\t\t${LOGGER} \"Removing old config file ...\"\n\t\trm -f $webd_conf\n\t\ttouch -a $webd_conf || EXIT \"Failed to create config,exit ...\"\n\t\t[ \"$enable_ipv6\" == 1 ] && webd_port=\"[::]:${webd_port}\"\n\t\tif [ \"$enable_anonymous\" != 0 ]\n\t\tthen\n\t\t\tif [ -n \"$anonymous_perm\" ]\n\t\t\tthen\n\t\t\t\t\n\t\t\t\tunset enable_anonymous\n\t\t\t\tfor i in $(echo $anonymous_perm);do\n\t\t\t\t\tenable_anonymous=\"$enable_anonymous$i\"\n\t\t\t\tdone\n\t\t\t\tunset i\n\t\t\telse\n\t\t\t\tenable_anonymous=0\n\t\t\t\tuci set webd.@webd[0].enable_anonymous=0\n\t\t\t\tuci commit webd\n\t\t\tfi\n\t\tfi\n\t\techo \"Webd.Listen $webd_port\" >> $webd_conf\n\t\techo \"Webd.Root $webd_root\" >> $webd_conf\n\t\techo \"Webd.Guest $enable_anonymous\" >> $webd_conf\n\t\t\n\t\tfor u in 0 1;do\n\t\t\tfor i in $(echo $users_list);do\n\t\t\t\teval ${i}=$(uci_get_by_type users $u $i 0)\n\t\t\t\techo \"$users_list\" | grep -q $i\n\t\t\t\t[ \"$?\" == 0 ] && eval perm_bin=$(eval echo '$'perm_bin)$(uci_get_by_type users $u $i)\n\t\t\tdone\n\t\t\tunset i\n\t\t\tusername=$(uci_get_by_type users $u username)\n\t\t\tpassword=$(uci_get_by_type users $u password)\n\t\t\tif [ -n \"$username\" ]\n\t\t\tthen\n\t\t\t\teval perm=$(perm_converter $(eval echo '$'perm_bin) | tail -n 1)\n\t\t\t\tif [ -n \"$(eval echo '$'perm)\" ]\n\t\t\t\tthen\n\t\t\t\t\t${LOGGER} \"Creating account for User $username ...\"\n\t\t\t\t\techo \"Webd.User $(eval echo '$'perm) $username $password\" >> $webd_conf\n\t\t\t\telse\n\t\t\t\t\t${LOGGER} \"Removing excessive user config ...\"\n\t\t\t\t\tuci delete webd.@users[$u]\n\t\t\t\t\tuci commit webd\n\t\t\t\tfi\n\t\t\t\tunset perm_bin\n\t\t\tfi\n\t\tdone\n\t\tunset u\n\t\tps -efww | grep \"$webd_bin\" | awk '{print $1}' | xargs kill -9 2> /dev/null\n\t\t${LOGGER} \"Starting Webd Service ...\"\n\t\tprocd_open_instance\n\t\tprocd_set_param command $webd_bin -c $webd_conf\n\t\tprocd_set_param respawn\n\t\tprocd_close_instance\n\telse\n\t\tstop_service\n\t\t${LOGGER} \"Webd Service is now disabled ...\"\n\tfi\n}\n\nstop_service() {\n\t${LOGGER} \"Stopping Webd Service ...\"\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"webd\"\n}\n\nuci_get_by_type() {\n\tlocal ret=$(uci get webd.@$1[$2].$3 2>/dev/null)\n\techo ${ret:=$4}\n}\n\nEXIT() {\n\t${LOGGER} $*\n\texit\n}\n\nperm_converter() {\n\tlocal u i=1\n\techo $1 | egrep -o [0-1] | while read X\n\tdo\n\t\tif [ \"$X\" == 1 ]\n\t\tthen\n\t\t\tcase $i in\n\t\t\t1)u=r;;\n\t\t\t2)u=l;;\n\t\t\t3)u=u;;\n\t\t\t4)u=m;;\n\t\t\t5)u=S;;\n\t\t\tesac\n\t\t\t[ -n \"$u\" ] && a=\"$a$u\"\n\t\t\techo \"$a\"\n\t\tfi\n\t\ti=$(($i + 1))\t\n\tdone\n}\n"
  },
  {
    "path": "luci-app-webd/root/etc/uci-defaults/luci-webd",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@webd[-1]\n\tadd ucitrack webd\n\tset ucitrack.@webd[-1].init=webd\n\tcommit ucitrack\nEOF\n\nrm -f /tmp/luci-indexcache\nexit 0\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/Makefile",
    "content": "\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=LuCI support for OAF\nLUCI_PKGARCH:=all\nLUCI_DEPENDS:=+appfilter +kmod-oaf +luci-compat\nPKG_NAME:=luci-app-oaf\nPKG_VERSION:=6.1.4\nPKG_RELEASE:=1\ninclude $(TOPDIR)/feeds/luci/luci.mk\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/htdocs/luci-static/resources/css/common.css",
    "content": "\nbody {\n    font-family: Arial, sans-serif;\n}\nh1, h2 {\n    color: #333;\n}\n\n\n\n.button-check {\n    padding: 3px 8px;\n    background-color: transparent; \n    color: green; \n    border: 1px solid green; \n    border-radius: 3px;\n    cursor: pointer;\n    font-size: 12px;\n}\n.button-container {\n    display: flex;\n    justify-content: right; \n    margin-top: 5px; \n}\n\n.submit-button {\n    margin-top: 30px;\n    width: 150px; \n    height: 30px; \n    background-color: #2885e8;\n    color: white;\n    border: none;\n    border-radius: 5px;\n    cursor: pointer;\n}\n.submit-button:hover {\n    background-color: #0f77e6;\n}\n\n.switch {\n    position: relative;\n    display: inline-block;\n    width: 40px;\n    height: 20px;\n}\n\n.switch input {\n    opacity: 0;\n    width: 0;\n    height: 0;\n}\n\n.slider {\n    position: absolute;\n    cursor: pointer;\n    top: 0;\n    left: 0;\n    right: 0;\n    bottom: 0;\n    background-color: #ccc;\n    transition: .4s;\n    border-radius: 20px;\n}\n\n.slider:before {\n    position: absolute;\n    content: \"\";\n    height: 16px;\n    width: 16px;\n    left: 2px;\n    bottom: 2px;\n    background-color: white;\n    transition: .4s;\n    border-radius: 50%;\n}\n\ninput:checked + .slider {\n    background-color: #2196F3;\n}\n\ninput:checked + .slider:before {\n    transform: translateX(20px);\n}"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/controller/appfilter.lua",
    "content": "module(\"luci.controller.appfilter\", package.seeall)\nlocal utl = require \"luci.util\"\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/appfilter\") then\n\t\treturn\n\tend\n\t\n\tlocal page\n\tentry({\"admin\", \"services\", \"appfilter\"}, alias(\"admin\", \"services\", \"appfilter\", \"user_list\"),_(\"App Filter\"), 10).dependent = true\n\n\n\tentry({\"admin\", \"services\", \"appfilter\", \"user_list\"}, \n\t\tarcombine(cbi(\"appfilter/user_list\",{hideapplybtn=true, hidesavebtn=true, hideresetbtn=true}), \n\t\tcbi(\"appfilter/dev_status\", {hideapplybtn=true, hidesavebtn=true, hideresetbtn=true})),\n\t\t_(\"User List\"), 20).leaf=true\n\n\tentry({\"admin\", \"services\", \"appfilter\", \"time\"}, cbi(\"appfilter/time\", {hideapplybtn=true, hidesavebtn=true, hideresetbtn=true}), _(\"Time Configuration\"), 25).leaf=true\n\tentry({\"admin\", \"services\", \"appfilter\", \"app_filter\"}, cbi(\"appfilter/app_filter\", {hideapplybtn=true, hidesavebtn=true, hideresetbtn=true}), _(\"App Filter\"), 21).leaf=true\n\tentry({\"admin\", \"services\", \"appfilter\", \"feature\"}, cbi(\"appfilter/feature\", {hideapplybtn=true, hidesavebtn=true, hideresetbtn=true}), _(\"App Feature Library\"), 26).leaf=true\n\n\tentry({\"admin\", \"services\", \"appfilter\", \"user\"}, cbi(\"appfilter/user\", {hideapplybtn=true, hidesavebtn=true, hideresetbtn=true}), _(\"User Configuration\"), 24).leaf=true\n\tentry({\"admin\", \"services\", \"appfilter\", \"advance\"}, cbi(\"appfilter/advance\", {hideapplybtn=true, hidesavebtn=true, hideresetbtn=true}), _(\"Advanced Settings\"), 27).leaf=true\n\tentry({\"admin\", \"network\", \"user_status\"}, call(\"user_status\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"get_user_list\"}, call(\"get_user_list\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"dev_visit_list\"}, call(\"get_dev_visit_list\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"feature_upgrade\"}, call(\"handle_feature_upgrade\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"dev_visit_time\"}, call(\"get_dev_visit_time\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"app_class_visit_time\"}, call(\"get_app_class_visit_time\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"class_list\"}, call(\"get_class_list\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"set_app_filter\"}, call(\"set_app_filter\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"get_app_filter\"}, call(\"get_app_filter\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"get_app_filter_base\"}, call(\"get_app_filter_base\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"set_app_filter_base\"}, call(\"set_app_filter_base\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"set_app_filter_time\"}, call(\"set_app_filter_time\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"get_app_filter_time\"}, call(\"get_app_filter_time\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"get_all_users\"}, call(\"get_all_users\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"get_app_filter_user\"}, call(\"get_app_filter_user\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"set_app_filter_user\"}, call(\"set_app_filter_user\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"del_app_filter_user\"}, call(\"del_app_filter_user\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"add_app_filter_user\"}, call(\"add_app_filter_user\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"get_whitelist_user\"}, call(\"get_whitelist_user\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"add_whitelist_user\"}, call(\"add_whitelist_user\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"del_whitelist_user\"}, call(\"del_whitelist_user\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"upload_file\"}, call(\"handle_file_upload\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"set_nickname\"}, call(\"set_nickname\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"get_oaf_status\"}, call(\"get_oaf_status\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"get_app_filter_adv\"}, call(\"get_app_filter_adv\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"set_app_filter_adv\"}, call(\"set_app_filter_adv\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"disable_flow_offloading\"}, call(\"disable_flow_offloading\"), nil).leaf = true\n\tentry({\"admin\", \"network\", \"cmd\"}, call(\"handle_cmd\"), nil).leaf = true\n\n\n\tentry({\"admin\", \"appfilter\", \"feature\", \"info\"}, call(\"get_feature_info\"), nil).leaf = true\n\tentry({\"admin\", \"appfilter\", \"feature\", \"class_list\"}, call(\"get_feature_class_list\"), nil).leaf = true\n\tentry({\"admin\", \"appfilter\", \"feature\", \"upgrade_status\"}, call(\"get_feature_upgrade_status\"), nil).leaf = true\n\n\n\n\nend\n\nfunction get_hostname_by_mac(dst_mac)\n    leasefile=\"/tmp/dhcp.leases\"\n    local fd = io.open(leasefile, \"r\")\n\tif not fd then return end\n    while true do\n        local ln = fd:read(\"*l\")\n        if not ln then\n            break\n        end\n        local ts, mac, ip, name, duid = ln:match(\"^(%d+) (%S+) (%S+) (%S+) (%S+)\")\n        if  dst_mac == mac then\n            fd:close()\n            return name\n        end\n    end\n\tfd:close()\n    return \"\"\nend\n\n\nfunction handle_feature_upgrade()\n\tlocal fs = require \"nixio.fs\"\n\tlocal http = require \"luci.http\"\n\tlocal image_tmp = \"/tmp/feature.cfg\"\n\n\tlocal fp\n\thttp.setfilehandler(\n\t\tfunction(meta, chunk, eof)\n\t\n\t\t\tfp = io.open(image_tmp, \"w\")\n\t\t\t\n\t\t\tif fp and chunk then\n\t\t\t\tfp:write(chunk)\n\t\t\tend\n\t\t\tif fp and eof then\n\t\t\t\tfp:close()\n\t\t\tend\n\t\tend\n\t)\n\n\nend\n\nfunction get_app_name_by_id(appid)\n\tlocal class_fd = io.popen(\"find /tmp/appfilter/ -type f -name *.class |xargs cat |grep \"..appid..\"|awk '{print $2}'\")\n\tif class_fd then\n\t\tlocal name = class_fd:read(\"*l\")\n\t\tclass_fd:close()\n\t\treturn name\n\tend\n\treturn \"\"\nend\n\nfunction cmp_func(a,b)\n\treturn a.latest_time > b.latest_time\nend\n\n\nfunction user_status()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal fd = io.open(\"/proc/net/af_client\",\"r\")\n\tstatus_buf=fd:read('*a')\n\tfd:close()\n\tuser_array=json.parse(status_buf)\n\t\n\tlocal visit_obj=utl.ubus(\"appfilter\", \"visit_list\", {});\n\tlocal user_array=visit_obj.dev_list\n\tlocal history={}\n\tfor i, v in pairs(user_array) do\n\t\tvisit_array=user_array[i].visit_info\n\t\tfor j,s in pairs(visit_array) do\n\t\t\tprint(user_array[i].mac, user_array[i].ip,visit_array[j].appid, visit_array[j].latest_time)\n\t\t\ttotal_time=visit_array[j].latest_time - visit_array[j].first_time;\n\t\t\thistory[#history+1]={\n\t\t\t\tmac=user_array[i].mac,\n\t\t\t\tip=user_array[i].ip,\n\t\t\t\thostname=get_hostname_by_mac(user_array[i].mac),\n\t\t\t\tappid=visit_array[j].appid,\n\t\t\t\tappname=get_app_name_by_id(visit_array[j].appid),\n\t\t\t\ttotal_num=0,\n\t\t\t\tdrop_num=0,\n\t\t\t\tlatest_action=visit_array[j].latest_action,\n\t\t\t\tlatest_time=os.date(\"%Y/%m/%d %H:%M:%S\", visit_array[j].latest_time),\n\t\t\t\tfirst_time=os.date(\"%Y/%m/%d %H:%M:%S\", visit_array[j].first_time),\n\t\t\t\ttotal_time=total_time\n\t\t\t}\n\t\tend\n\tend\n\ttable.sort(history, cmp_func)\n\tluci.http.write_json(history);\nend\n\n\nfunction get_user_list()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal visit_obj=utl.ubus(\"appfilter\", \"dev_list\", {});\n\tluci.http.write_json(visit_obj);\nend\n\nfunction get_class_list()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal class_obj=utl.ubus(\"appfilter\", \"class_list\", {});\n\tllog(\"get class list\");\n\tluci.http.write_json(class_obj);\nend\n\nfunction get_all_users()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal flag = luci.http.formvalue(\"flag\")\n\tlocal page = luci.http.formvalue(\"page\")\n\tlocal page_size = luci.http.formvalue(\"page_size\")\n\tlocal params = {flag=flag, page=page}\n\tif page_size then\n\t\tparams.page_size = page_size\n\tend\n\tlocal class_obj=utl.ubus(\"appfilter\", \"get_all_users\", params);\n\tluci.http.write_json(class_obj);\nend\n\nfunction get_oaf_status()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"get_oaf_status\", {});\n\tluci.http.write_json(resp_obj);\nend\n\nfunction get_app_filter_user()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"get_app_filter_user\", {});\n\tluci.http.write_json(resp_obj);\nend\n\nfunction del_app_filter_user()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal req_obj = {}\n\treq_obj.mac = luci.http.formvalue(\"mac\")\n\tllog(\"del appfilter user \"..req_obj.mac);\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"del_app_filter_user\", req_obj);\n\tluci.http.write_json(resp_obj);\nend\n\nfunction add_app_filter_user()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal req_obj = {}\n\tlocal data_str = luci.http.formvalue(\"data\")\n\treq_obj = json.parse(data_str)\n\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"add_app_filter_user\", req_obj);\n\tluci.http.write_json(resp_obj);\nend\n\nfunction get_whitelist_user()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"get_whitelist_user\", {});\n\tluci.http.write_json(resp_obj);\nend\n\nfunction add_whitelist_user()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal req_obj = {}\n\tlocal data_str = luci.http.formvalue(\"data\")\n\treq_obj = json.parse(data_str)\n\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"add_whitelist_user\", req_obj);\n\tluci.http.write_json(resp_obj);\nend\n\nfunction del_whitelist_user()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal req_obj = {}\n\treq_obj.mac = luci.http.formvalue(\"mac\")\n\tllog(\"del whitelist user \"..req_obj.mac);\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"del_whitelist_user\", req_obj);\n\tluci.http.write_json(resp_obj);\nend\n\nfunction get_app_filter()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"get_app_filter\", {});\n\tluci.http.write_json(resp_obj);\nend\n\nfunction set_app_filter()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\t\n\tlocal app_list_str = luci.http.formvalue(\"app_list\")\n\n\tlocal app_list = {}\n\tfor id in app_list_str:gmatch(\"([^,]+)\") do\n\t\ttable.insert(app_list, tonumber(id))\n\tend\n\t\n\tlocal req_obj = {\n\t\tapp_list = app_list\n\t}\n\n\tlocal resp_obj = utl.ubus(\"appfilter\", \"set_app_filter\", req_obj)\n\tluci.http.write_json(resp_obj)\nend\n\nfunction set_nickname()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal req_obj = {}\n\treq_obj.mac = luci.http.formvalue(\"mac\")\n\treq_obj.nickname = luci.http.formvalue(\"nickname\")\n\tllog(\"set nickname \"..req_obj.mac..\" \"..req_obj.nickname);\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"set_nickname\", req_obj);\n\tluci.http.write_json(resp_obj);\nend\n\nfunction get_app_filter_base()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"get_app_filter_base\", {});\n\tluci.http.write_json(resp_obj);\nend\n\nfunction set_app_filter_user()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal req_obj = {}\n\treq_obj.mode = luci.http.formvalue(\"mode\")\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"set_app_filter_user\", req_obj);\n\tluci.http.write_json(resp_obj);\nend\n\nfunction set_app_filter_base()\n\tlocal json = require \"luci.jsonc\"\n\tllog(\"set appfilter base\");\n\tluci.http.prepare_content(\"application/json\")\n\tlocal req_obj = {}\n\n\n\tlocal enable = luci.http.formvalue(\"enable\")\n\tlocal work_mode = luci.http.formvalue(\"work_mode\")\n\tlocal record_enable = luci.http.formvalue(\"record_enable\")\n\tlocal disable_quic = luci.http.formvalue(\"disable_quic\")\n\tlocal app_filter_mode = luci.http.formvalue(\"app_filter_mode\")\n\n\tllog(\"enable: \"..enable..\" work_mode: \"..work_mode..\" record_enable: \"..record_enable..\" disable_quic: \"..(disable_quic or \"nil\")..\" app_filter_mode: \"..(app_filter_mode or \"nil\"))\n\treq_obj.enable = enable\n\treq_obj.work_mode = work_mode\n\treq_obj.record_enable = record_enable\n\tif disable_quic then\n\t\treq_obj.disable_quic = disable_quic\n\tend\n\tif app_filter_mode then\n\t\treq_obj.app_filter_mode = app_filter_mode\n\tend\n\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"set_app_filter_base\", req_obj);\n\tluci.http.write_json(resp_obj);\nend\n\nfunction get_app_filter_adv()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"get_app_filter_adv\", {});\n\tluci.http.write_json(resp_obj);\nend\nfunction set_app_filter_adv()\n\tlocal json = require \"luci.jsonc\"\n\tllog(\"set appfilter base\");\n\tluci.http.prepare_content(\"application/json\")\n\tlocal req_obj = {}\n\treq_obj.lan_ifname = luci.http.formvalue(\"lan_ifname\")\n\treq_obj.disable_hnat = luci.http.formvalue(\"disable_hnat\")\n\treq_obj.auto_load_engine = luci.http.formvalue(\"auto_load_engine\")\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"set_app_filter_adv\", req_obj);\n\tluci.http.write_json(resp_obj);\nend\n\nfunction disable_flow_offloading()\n\tlocal json = require \"luci.jsonc\"\n\tllog(\"disable flow offloading\");\n\tluci.http.prepare_content(\"application/json\")\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"disable_flow_offloading\", {});\n\tluci.http.write_json(resp_obj);\nend\n\nfunction handle_cmd()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal action = luci.http.formvalue(\"action\")\n\tif not action then\n\t\tluci.http.write_json({code = -1, message = \"action parameter is required\"});\n\t\treturn\n\tend\n\tlocal req_obj = {}\n\treq_obj.action = action\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"cmd\", req_obj);\n\tluci.http.write_json(resp_obj);\nend\n\n-- data: {\"mode\":1,\"weekday_list\":[1,2,3,4,5,6,0],\"start_time\":\"22:22\",\"end_time\":\"12:00\",\"allow_time\":30,\"deny_time\":5}\nfunction set_app_filter_time()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal req_obj = {}\n\treq_obj = json.parse(luci.http.formvalue(\"data\"))\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"set_app_filter_time\", req_obj);\n\tluci.http.write_json(resp_obj);\nend\n\nfunction get_app_filter_time()\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"get_app_filter_time\", {});\n\tllog(\"controller get_app_filter_time: ubus response received\");\n\tif resp_obj and resp_obj.data then\n\t\tllog(\"controller get_app_filter_time: mode=\" .. tostring(resp_obj.data.mode or \"nil\"));\n\t\tif resp_obj.data.time_list then\n\t\t\tllog(\"controller get_app_filter_time: time_list length=\" .. tostring(#resp_obj.data.time_list));\n\t\t\tfor i, time_item in ipairs(resp_obj.data.time_list) do\n\t\t\t\tlocal weekday_str = \"nil\"\n\t\t\t\tif time_item.weekday_list then\n\t\t\t\t\tweekday_str = table.concat(time_item.weekday_list, \",\")\n\t\t\t\tend\n\n\t\t\tend\n\t\telse\n\t\t\tllog(\"controller get_app_filter_time: time_list is nil\");\n\t\tend\n\t\tlocal response_json = json.stringify(resp_obj);\n\t\tif response_json then\n\t\t\tllog(\"controller get_app_filter_time: final JSON response length=\" .. tostring(string.len(response_json)));\n\t\telse\n\t\t\tllog(\"controller get_app_filter_time: failed to encode JSON\");\n\t\tend\n\telse\n\t\tllog(\"controller get_app_filter_time: resp_obj or resp_obj.data is nil\");\n\tend\n\tluci.http.write_json(resp_obj);\nend\n\nfunction get_dev_visit_time(mac)\n\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\t\tlocal req_obj = {}\n\treq_obj.mac = mac;\n\tlocal visit_obj=utl.ubus(\"appfilter\", \"dev_visit_time\", req_obj);\n\n\tlocal visit_list=visit_obj.list\n\tluci.http.write_json(visit_list);\nend\n\nfunction get_app_class_visit_time(mac)\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal req_obj = {}\n\treq_obj.mac = mac;\n\tlocal visit_obj=utl.ubus(\"appfilter\", \"app_class_visit_time\", req_obj);\n\tlocal class_array=visit_obj.class_list\n\tluci.http.write_json(class_array);\nend\n\n\nfunction get_dev_visit_list(mac)\n\tlocal json = require \"luci.jsonc\"\n\tluci.http.prepare_content(\"application/json\")\n\tlocal req_obj = {}\n\treq_obj.mac = mac;\n\tlocal page = luci.http.formvalue(\"page\")\n\tlocal page_size = luci.http.formvalue(\"page_size\")\n\tif page then\n\t\treq_obj.page = page\n\tend\n\tif page_size then\n\t\treq_obj.page_size = page_size\n\tend\n\tlocal resp_obj=utl.ubus(\"appfilter\", \"dev_visit_list\", req_obj);\n\tluci.http.write_json(resp_obj);\nend\n\nfunction handle_file_upload()\n    local http = require \"luci.http\"\n    local fs = require \"nixio.fs\"\n    local upload_dir = \"/tmp/uploads/\"\n    local file_name = \"uploaded_file\"\n    llog(\"handle_file_upload started\");\n\n    -- Ensure the upload directory exists\n    if not fs.access(upload_dir) then\n        fs.mkdir(upload_dir)\n    end\n\n    llog(\"Upload directory checked/created\");\n\n    local file_path = upload_dir .. file_name\n    local fp\n\n    llog(\"file_path: \" .. file_path);\n    http.setfilehandler(\n        function(meta, chunk, eof)\n            -- Log metadata information\n            llog(\"File upload metadata: \" .. (meta and meta.name or \"nil\") .. \", \" .. (meta and meta.file or \"nil\"))\n            llog(\"File upload chunk size: \" .. (chunk and #chunk or 0))\n\n            if not fp then\n                fp = io.open(file_path, \"w\")\n                llog(\"File opened for writing: \" .. file_path)\n            end\n            if fp and chunk then\n                fp:write(chunk)\n                llog(\"Chunk written to file\")\n            end\n            if fp and eof then\n                fp:close()\n                llog(\"File upload completed and file closed\")\n                -- Ensure the file is processed or moved to the correct location\n                process_uploaded_file(file_path)\n                luci.http.prepare_content(\"application/json\")\n                luci.http.write_json({ success = true, message = \"File uploaded successfully\" })\n            end\n        end\n    )\n    llog(\"handle_file_upload setup complete\");\nend\n\nfunction process_uploaded_file(file_path)\n    -- Add logic here to process the uploaded file\n    llog(\"Processing uploaded file: \" .. file_path)\n    -- Example: Move the file to a permanent location\n    local permanent_path = \"/etc/config/\" .. file_name\n    os.execute(\"mv \" .. file_path .. \" \" .. permanent_path)\n    llog(\"File moved to: \" .. permanent_path)\nend\n\nfunction llog(message)\n    local log_file = \"/tmp/log/oaf_luci.log\"  \n    local fd = io.open(log_file, \"a\") \n    if fd then\n        local timestamp = os.date(\"%Y-%m-%d %H:%M:%S\") \n        fd:write(string.format(\"[%s] %s\\n\", timestamp, message))  \n        fd:close()  \n    end\nend\n\n\n\nfunction get_feature_upgrade_status()\n\tlocal fs   = require \"nixio.fs\"\n\tlocal json = require \"luci.jsonc\"\n\tlocal http = require \"luci.http\"\n\n\tlocal status_file = \"/tmp/feature_upgrade.status\"\n\tlocal status = 0\n\n\tif fs.access(status_file) then\n\t\tlocal content = fs.readfile(status_file) or \"\"\n\t\tstatus = tonumber(content:match(\"(%d+)\")) or 0\n\t\tfs.writefile(status_file, \"0\")\n\tend\n\n\thttp.prepare_content(\"application/json\")\n\thttp.write(json.stringify({code = 0, status = status}))\nend\n\n\n\nfunction get_feature_info()\n\tlocal json = require \"luci.jsonc\"\n\tlocal nfs = require \"nixio.fs\"\n\tlocal sys = require \"luci.sys\"\n\tluci.http.prepare_content(\"application/json\")\n\n\tlocal info = {\n\t\tversion = \"\",\n\t\tformat = \"v3.0\",\n\t\tapp_count = 0\n\t}\n\n\tif nfs.access(\"/tmp/feature.cfg\") then\n\t\tinfo.app_count = tonumber(sys.exec(\"cat /tmp/feature.cfg | grep -v ^$ |grep -v ^# | wc -l\")) or 0\n\t\tinfo.version = sys.exec(\"cat /tmp/feature.cfg |grep \\\"#version\\\" | awk '{print $2}'\") or \"\"\n\tend\n\n\tluci.http.write(json.stringify({code = 0, data = info, message = \"success\"}))\nend\n\nfunction get_feature_class_list()\n\tlocal json = require \"luci.jsonc\"\n\tlocal utl = require \"luci.util\"\n\tluci.http.prepare_content(\"application/json\")\n\n\tlocal req_obj = {}\n\treq_obj.api = \"class_list\"\n\treq_obj.data = {}\n\n\tlocal resp_obj = utl.ubus(\"fwx\", \"common\", req_obj)\n\n\tif resp_obj and resp_obj.code == 2000 and resp_obj.data then\n\t\tluci.http.write(json.stringify(resp_obj.data))\n\telse\n\t\tluci.http.write(json.stringify({class_list = {}}))\n\tend\nend"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/model/cbi/appfilter/advance.lua",
    "content": "local ds = require \"luci.dispatcher\"\nlocal nxo = require \"nixio\"\nlocal nfs = require \"nixio.fs\"\nlocal ipc = require \"luci.ip\"\nlocal sys = require \"luci.sys\"\nlocal utl = require \"luci.util\"\nlocal dsp = require \"luci.dispatcher\"\nlocal uci = require \"luci.model.uci\"\nlocal lng = require \"luci.i18n\"\nlocal jsc = require \"luci.jsonc\"\n\nlocal m, s\narg[1] = arg[1] or \"\"\nm = Map(\"appfilter\", translate(\"\"), translate(\"\"))\n\nlocal v\nv = m:section(SimpleSection)\nv.template = \"admin_network/advance\"\nreturn m\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/model/cbi/appfilter/app_filter.lua",
    "content": "local ds = require \"luci.dispatcher\"\nlocal nxo = require \"nixio\"\nlocal nfs = require \"nixio.fs\"\nlocal ipc = require \"luci.ip\"\nlocal sys = require \"luci.sys\"\nlocal utl = require \"luci.util\"\nlocal dsp = require \"luci.dispatcher\"\nlocal uci = require \"luci.model.uci\"\nlocal lng = require \"luci.i18n\"\nlocal jsc = require \"luci.jsonc\"\n\nlocal m, s\narg[1] = arg[1] or \"\"\nm = Map(\"appfilter\", translate(\"\"), translate(\"\"))\n\n\nlocal v\nv = m:section(SimpleSection)\nv.template = \"admin_network/app_filter\"\nreturn m\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/model/cbi/appfilter/dev_status.lua",
    "content": "local ds = require \"luci.dispatcher\"\nlocal nxo = require \"nixio\"\nlocal nfs = require \"nixio.fs\"\nlocal ipc = require \"luci.ip\"\nlocal sys = require \"luci.sys\"\nlocal utl = require \"luci.util\"\nlocal dsp = require \"luci.dispatcher\"\nlocal uci = require \"luci.model.uci\"\nlocal lng = require \"luci.i18n\"\nlocal jsc = require \"luci.jsonc\"\n\nlocal m, s\narg[1] = arg[1] or \"\"\nm = Map(\"appfilter\", translate(\"Data Statistics\") .. \"(\" .. arg[1] .. \")\", translate(\"\"))\n\nlocal v\nv = m:section(SimpleSection)\nv.template = \"admin_network/dev_status\"\nv.mac = arg[1]\nm.redirect = luci.dispatcher.build_url(\"admin\", \"services\", \"appfilter\")\nreturn m\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/model/cbi/appfilter/feature.lua",
    "content": "\nlocal nfs = require \"nixio.fs\"\nlocal sys = require \"luci.sys\"\nlocal SYS = require \"luci.sys\"\nlocal http = luci.http\n\nlocal m, s\n\nm = Map(\"appfilter\", translate(\"App Feature Library\"), translate(\"The App feature library is used to describe the packet protocol of applications, including port, domain, and Layer7 payload. It is the core of the DPI engine and affects the effectiveness of OAF. You can also add or modify App features according to the official website tutorial.\"))\ns = m:section(SimpleSection)\ns.template = \"admin_network/feature\"\ns.anonymous = true\n\nlocal dir, fd\ndir = \"/tmp/upload/\"\nnixio.fs.mkdir(dir)\n\nlocal STATUS_FILE = \"/tmp/feature_upgrade.status\"\nlocal MAX_SIZE = 20 * 1024 * 1024\n\nlocal function write_status(code)\n    local f = io.open(STATUS_FILE, \"w+\")\n    if f then\n        f:write(tostring(code))\n        f:close()\n    end\nend\n\nlocal function log(msg)\n    local f = io.open(\"/tmp/log/luci.log\", \"a+\")\n    if f then\n        f:write(os.date(\"%Y-%m-%d %H:%M:%S\") .. \" [fwx_feature_upload] \" .. tostring(msg) .. \"\\n\")\n        f:close()\n    end\nend\n\nlocal function get_overlay_free_space()\n    local df_output = SYS.exec(\"df -k /overlay 2>/dev/null | tail -1 | awk '{print $4}'\")\n    if df_output then\n        df_output = string.gsub(df_output, \"%s+\", \"\")\n        local free_kb = tonumber(df_output)\n        if free_kb then\n            return free_kb * 1024  -- 转换为字节\n        end\n    end\n    return 0\nend\n\nlocal function get_dir_size(dir_path)\n    local du_output = SYS.exec(\"du -sb \" .. dir_path .. \" 2>/dev/null | awk '{print $1}'\")\n    if du_output then\n        du_output = string.gsub(du_output, \"%s+\", \"\")\n        local size_bytes = tonumber(du_output)\n        if size_bytes then\n            return size_bytes\n        end\n    end\n    return 0\nend\n\nhttp.setfilehandler(function(meta, chunk, eof)\n    local feature_file = \"/etc/appfilter/feature.cfg\"\n    local f_format = \"v3.0\"\n    local format = \"v3.0\"\n    if not fd then\n        if not meta then\n            return\n        end\n        if meta and chunk then\n            log(\"start upload filename=\" .. (meta.file or \"\"))\n            fd = nixio.open(dir .. meta.file, \"w\")\n            write_status(1)\n        end\n        if not fd then\n            log(\"open file failed: \" .. (dir .. (meta.file or \"\")))\n            write_status(401)\n            return\n        end\n    end\n    if chunk and fd then\n        fd:write(chunk)\n    end\n    if eof and fd then\n        fd:close()\n        log(\"upload finished, saved to \" .. dir .. (meta.file or \"\"))\n        local meta_size = 0\n        do\n            local file_path = dir .. (meta.file or \"\")\n            local stat = nixio.fs.stat(file_path)\n            if stat and stat.size then\n                meta_size = stat.size\n            end\n        end\n        log(\"meta_size: \" .. tostring(meta_size) .. \", MAX_SIZE: \" .. tostring(MAX_SIZE))\n        if meta_size > MAX_SIZE then\n            log(\"file too large: \" .. tostring(meta_size))\n            write_status(402)\n            os.execute(\"rm /tmp/upload/* -fr\")\n            return\n        end\n\n        local tar_cmd = \"tar -zxvf /tmp/upload/\" .. meta.file .. \" -C /tmp/upload/ >/dev/null\"\n        local success = os.execute(tar_cmd)\n        if success ~= 0 then\n            log(\"tar extract failed: \" .. tar_cmd)\n            write_status(401)\n            return\n        end\n\n        local feature_dir = \"/tmp/upload/feature\"\n        local fd2 = io.open(\"/tmp/upload/feature.cfg\")\n        if not fd2 then\n            log(\"feature.cfg not found after extract\")\n            write_status(401)\n            os.execute(\"rm /tmp/upload/* -fr\")\n            return\n        end\n        local version_line = fd2:read(\"*l\")\n        local format_line = fd2:read(\"*l\")\n        fd2:close()\n        local ret = string.match(version_line, \"#version\")\n        if ret ~= nil then\n            if string.match(format_line, \"#format\") then\n                f_format = SYS.exec(\"echo '\"..format_line..\"'|awk '{print $2}'\")\n            end\n            if not string.match(f_format, format) then\n                log(\"format mismatch: got \" .. f_format .. \", expected \" .. format)\n                write_status(401)\n                os.execute(\"rm /tmp/upload/* -fr\")\n                return\n            end\n            local cmd = \"cp /tmp/upload/feature.cfg \" .. feature_file\n            os.execute(cmd)\n            \n            local app_icons_src = \"/tmp/upload/app_icons\"\n            local app_icons_dst = \"/www/luci-static/resources/app_icons\"\n            \n            if nixio.fs.stat(app_icons_src) then\n                local app_icons_size = get_dir_size(app_icons_src)\n                local overlay_free = get_overlay_free_space()\n                \n                log(\"app_icons size: \" .. tostring(app_icons_size) .. \" bytes, overlay free: \" .. tostring(overlay_free) .. \" bytes\")\n                \n                if overlay_free >= app_icons_size then\n                    log(\"overlay space sufficient, copying app_icons to /www\")\n                    os.execute(\"rm -rf \" .. app_icons_dst .. \"/*\")\n                    cmd = \"cp -r \" .. app_icons_src .. \"/* \" .. app_icons_dst .. \"/ >/dev/null 2>&1\"\n                    os.execute(cmd)\n                    log(\"app_icons copied to /www/luci-static/resources/app_icons\")\n                else\n                    log(\"overlay space insufficient (\" .. tostring(overlay_free) .. \" < \" .. tostring(app_icons_size) .. \"), skipping app_icons copy\")\n                end\n            else\n                log(\"app_icons directory not found in upload package, skipping\")\n            end\n            os.execute(\"chmod 666 \" .. feature_file)\n            luci.sys.exec(\"killall -SIGUSR1 oafd\")\n            log(\"feature updated successfully\")\n            write_status(200)\n        else\n            log(\"missing #version marker\")\n            write_status(401)\n        end\n        os.execute(\"rm /tmp/upload/* -fr\")\n    end\n\nend)\n\nif luci.http.formvalue(\"upload\") then\n    local f = luci.http.formvalue(\"ulfile\")\n    if #f <= 0 then\n    end\nelseif luci.http.formvalue(\"download\") then\nend\n\nreturn m\n\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/model/cbi/appfilter/time.lua",
    "content": "local ds = require \"luci.dispatcher\"\nlocal nxo = require \"nixio\"\nlocal nfs = require \"nixio.fs\"\nlocal ipc = require \"luci.ip\"\nlocal sys = require \"luci.sys\"\nlocal utl = require \"luci.util\"\nlocal dsp = require \"luci.dispatcher\"\nlocal uci = require \"luci.model.uci\"\nlocal lng = require \"luci.i18n\"\nlocal jsc = require \"luci.jsonc\"\n\nlocal m, s\narg[1] = arg[1] or \"\"\nm = Map(\"appfilter\", translate(\"\"), translate(\"\"))\n\nlocal v\nv = m:section(SimpleSection)\nv.template = \"admin_network/time\"\nreturn m\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/model/cbi/appfilter/time_setting.lua",
    "content": "local ds = require \"luci.dispatcher\"\nlocal nxo = require \"nixio\"\nlocal nfs = require \"nixio.fs\"\nlocal ipc = require \"luci.ip\"\nlocal sys = require \"luci.sys\"\nlocal utl = require \"luci.util\"\nlocal dsp = require \"luci.dispatcher\"\nlocal uci = require \"luci.model.uci\"\nlocal lng = require \"luci.i18n\"\nlocal jsc = require \"luci.jsonc\"\nlocal http = luci.http\nlocal SYS = require \"luci.sys\"\nlocal m, s\n\nm = Map(\"appfilter\", translate(\"\"), translate(\"\"))\n\ns = m:section(TypedSection, \"time\", translate(\"Time Setting\"),translate(\"The second time is optional, the end time must be greater than the start time\"))\ns.anonymous = true\n\n\no=s:option(ListValue, \"time_mode\", translate(\"Time Mode\"),translate(\"\")) \no.default=0\no:value(0,translate(\"Blacklist mode\"))\no:value(1,translate(\"Whitelist mode\"))\n\ndays = s:option(MultiValue, \"days\", \"\", translate(\"\"))\ndays.widget = \"checkbox\"\ndays.size = 10\ndays:value(\"0\", translate(\"Sun\"));\ndays:value(\"1\", translate(\"Mon\"));\ndays:value(\"2\", translate(\"Tue\"));\ndays:value(\"3\", translate(\"Wed\"));\ndays:value(\"4\", translate(\"Thur\"));\ndays:value(\"5\", translate(\"Fri\"));\ndays:value(\"6\", translate(\"Sat\"));\n\nhv = s:option(Value, \"start_time\", translate(\"Start Time1\"),translate(\"xx:xx\"))\nhv.optional = false\nhv = s:option(Value, \"end_time\", translate(\"End Time1\"))\nhv.optional = false\n\nhv = s:option(Value, \"start_time2\", translate(\"Start Time2\"))\nhv.optional = false\nhv = s:option(Value, \"end_time2\", translate(\"End Time2\"))\nhv.optional = false\n\n\n\nreturn m\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/model/cbi/appfilter/user.lua",
    "content": "local ds = require \"luci.dispatcher\"\nlocal nxo = require \"nixio\"\nlocal nfs = require \"nixio.fs\"\nlocal ipc = require \"luci.ip\"\nlocal sys = require \"luci.sys\"\nlocal utl = require \"luci.util\"\nlocal dsp = require \"luci.dispatcher\"\nlocal uci = require \"luci.model.uci\"\nlocal lng = require \"luci.i18n\"\nlocal jsc = require \"luci.jsonc\"\n\nlocal m, s\narg[1] = arg[1] or \"\"\nm = Map(\"appfilter\", translate(\"\"), translate(\"\"))\n\nlocal v\nv = m:section(SimpleSection)\nv.template = \"admin_network/user\"\nreturn m"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/model/cbi/appfilter/user_list.lua",
    "content": "local ds = require \"luci.dispatcher\"\nlocal nxo = require \"nixio\"\nlocal nfs = require \"nixio.fs\"\nlocal ipc = require \"luci.ip\"\nlocal sys = require \"luci.sys\"\nlocal utl = require \"luci.util\"\nlocal dsp = require \"luci.dispatcher\"\nlocal uci = require \"luci.model.uci\"\nlocal lng = require \"luci.i18n\"\nlocal jsc = require \"luci.jsonc\"\nlocal http = luci.http\nlocal SYS = require \"luci.sys\"\nlocal m, s\n\nm = Map(\"appfilter\", translate(\"\"), translate(\"\"))\n\nm:section(SimpleSection).template = \"admin_network/user_status\"\n\nreturn m\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/view/admin_network/advance.htm",
    "content": "<link rel=\"stylesheet\" href=\"<%=resource%>/css/common.css\">\n<style>\n    /* 页面卡片边框 */\n    .cbi-section.cbi-tblsection {\n        border: 1px solid var(--border-color-low, #e0e0e0);\n        border-radius: 8px;\n        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n        margin-top: 20px;\n        padding: 4px;\n    }\n\n    .config-label {\n        font-weight: 500;\n        font-size: 14px;\n        width: 150px;\n        flex-shrink: 0;\n    }\n\n    .config-row {\n        margin-top: 14px;\n        display: flex;\n        align-items: center;\n    }\n\n    .config-row input[type=\"text\"] {\n        padding: 6px 10px;\n        border: 1px solid var(--border-color-medium, #dadce0);\n        border-radius: 4px;\n        font-size: 13px;\n        width: 200px;\n    }\n\n    .desc {\n        margin-top: 8px;\n        max-width: 650px;\n        padding: 10px 14px;\n        border-radius: 6px;\n        border-left: 3px solid #1a73e8;\n        opacity: 0.75;\n    }\n    .desc span {\n        font-size: 13px;\n        line-height: 1.5;\n        display: block;\n    }\n\n    .submit-button {\n        padding: 8px 20px;\n        width: 150px;\n        height: auto;\n        margin-top: 0;\n        background-color: #1a73e8;\n        color: white;\n        border: none;\n        border-radius: 4px;\n        cursor: pointer;\n        font-size: 13px;\n        font-weight: 500;\n        line-height: 1.4;\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        transition: background-color 0.2s;\n    }\n    .submit-button:hover {\n        background-color: #1557b0;\n    }\n\n    .version-value {\n        font-size: 14px;\n        font-weight: 500;\n    }\n\n    .switch {\n        position: relative;\n        display: inline-block;\n        width: 44px;\n        height: 24px;\n    }\n    .switch input {\n        opacity: 0;\n        width: 0;\n        height: 0;\n    }\n    .slider {\n        position: absolute;\n        cursor: pointer;\n        top: 0;\n        left: 0;\n        right: 0;\n        bottom: 0;\n        background-color: #ccc;\n        transition: .4s;\n        border-radius: 24px;\n    }\n    .slider:before {\n        position: absolute;\n        content: \"\";\n        height: 18px;\n        width: 18px;\n        left: 3px;\n        bottom: 3px;\n        background-color: white;\n        transition: .4s;\n        border-radius: 50%;\n    }\n    input:checked + .slider {\n        background-color: #1a73e8;\n    }\n    input:checked + .slider:before {\n        transform: translateX(20px);\n    }\n</style>\n\n<script type=\"text/javascript\">//<![CDATA[\n\n\t\tfunction init_data() {\n\t\t\tgetAppFilterAdvData(); \n\t\t}\n        function showSuccessMessage(message = '<%:Settings saved successfully%>') {\n\t\t\tconst modal = document.getElementById('modal');\n\t\t\tconst messageElement = modal.querySelector('p');\n\t\t\tmessageElement.textContent = message;\n\t\t\tmodal.style.display = 'flex';\n\t\t\tsetTimeout(() => {\n\t\t\t\tmodal.style.display = 'none';\n\t\t\t}, 1000);\n\t\t}\n\n\t\t\n\n        function validateLanIfname(lanIfname) {\n            const regex = /^[a-zA-Z0-9.-]{2,8}$/;\n            return regex.test(lanIfname);\n        }\n\n        function submitAppFilterAdv() {\n            const lanIfname = document.getElementById('lan_ifname').value;\n            const autoLoadEngineSwitch = document.getElementById('autoLoadEngineSwitch').checked;\n            const disableHnatSwitch = document.getElementById('disableHnatSwitch').checked;\n\n            if (!validateLanIfname(lanIfname)) {\n                alert('<%:Invalid LAN interface name. Please ensure it is no more than 8 characters long and contains only letters, numbers, dot, and -.%>');\n                return;\n            }\n\n\n\n            new XHR().post('<%=url('admin/network/set_app_filter_adv')%>', {\n                lan_ifname: lanIfname,\n                auto_load_engine: autoLoadEngineSwitch ? 1 : 0,\n                disable_hnat: disableHnatSwitch ? 1 : 0,\n            },\n            function (x, data) {\n                showSuccessMessage();\n            });\n        }\n\n        function disableFlowOffloading() {\n            new XHR().post('<%=url('admin/network/disable_flow_offloading')%>', {},\n            function (x, data) {\n                showSuccessMessage('<%:关闭成功%>');\n            });\n        }\n\n        function clearActiveTime() {\n            if (!confirm('<%:Are you sure you want to clear active time of all users?%>')) {\n                return;\n            }\n            new XHR().post('<%=url('admin/network/cmd')%>', {\n                action: 'clear_active_time'\n            },\n            function (x, data) {\n                if (data && data.code === 0) {\n                    showSuccessMessage('<%:Active time cleared successfully%>');\n                } else {\n                    alert(data ? (data.message || '<%:Failed to clear active time%>') : '<%:Failed to clear active time%>');\n                }\n            });\n        }\n\n        function clearOfflineUsers() {\n            if (!confirm('<%:Are you sure you want to clear all offline users?%>')) {\n                return;\n            }\n            new XHR().post('<%=url('admin/network/cmd')%>', {\n                action: 'clear_offline_users'\n            },\n            function (x, data) {\n                if (data && data.code === 0) {\n                    showSuccessMessage('<%:Offline users cleared successfully%>');\n                } else {\n                    alert(data ? (data.message || '<%:Failed to clear offline users%>') : '<%:Failed to clear offline users%>');\n                }\n            });\n        }\n \n\t\tfunction submitHandle() {\n\t\t\tsubmitAppFilterAdv();\n\t\t}\n\n\t\tfunction openModal() {\n\t\t\tdocument.getElementById('modal').style.display = 'block';\n            setTimeout(closeModal, 2000);\n\t\t}\n\n\t\tfunction closeModal() {\n\t\t\tdocument.getElementById('modal').style.display = 'none';\n\t\t}\n\n        function getAppFilterAdvData() {\n\t\t\tconsole.log(\"getAppFilterAdvData\");\n            new XHR().get('<%=url('admin/network/get_app_filter_adv')%>', null,\n                function (x, data) {\n                    document.getElementById('lan_ifname').value = data.data.lan_ifname;\n                    if (data.data.auto_load_engine == 1) {\n                        document.getElementById('autoLoadEngineSwitch').checked = true;\n                    } else {\n                        document.getElementById('autoLoadEngineSwitch').checked = false;\n                    }\n                    if (data.data.disable_hnat == 1) {\n                        document.getElementById('disableHnatSwitch').checked = true;\n                    } else {\n                        document.getElementById('disableHnatSwitch').checked = false;\n                    }\n                }\n            );\n            \n            new XHR().get('<%=url('admin/network/get_oaf_status')%>', null,\n                function (x, data) {\n                    if (data && data.data) {\n                        document.getElementById('oafVersion').textContent = data.data.version || '--';\n                        document.getElementById('engineVersion').textContent = data.data.engine_version || '--';\n                    }\n                }\n            );\n        }\n\n\n        window.onload = function() {\n            init_data();\n        };\n//]]></script>\n\n<div id=\"modal\" style=\"display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: transparent; z-index: 1000; justify-content: center; align-items: center;\">\n    <div style=\"background-color: rgba(0, 0, 0, 0.65); padding: 14px 24px; border-radius: 6px; text-align: center; color: white; display: flex; justify-content: center; align-items: center;\">\n        <p style=\"margin: 0; color: white; font-size: 14px;\"><%:Settings saved successfully%></p>\n    </div>\n</div>\n\n<div class=\"cbi-section cbi-tblsection\">\n    <div style=\"max-width: 1000px; margin-left: 10px; padding: 10px 15px;\">\n\n        <div class=\"config-row\">\n            <label class=\"config-label\"><%:OAF Version%></label>\n            <span id=\"oafVersion\" class=\"version-value\">--</span>\n        </div>\n        \n        <div class=\"config-row\">\n            <label class=\"config-label\"><%:OAF Driver Version%></label>\n            <span id=\"engineVersion\" class=\"version-value\">--</span>\n        </div>\n        \n        <div class=\"config-row\">\n            <label for=\"autoLoadEngineSwitch\" class=\"config-label\" style=\"cursor: pointer;\"><%:Auto-load OAF driver%></label>\n            <label class=\"switch\">\n                <input type=\"checkbox\" id=\"autoLoadEngineSwitch\" name=\"autoLoadEngineSwitch\" />\n                <span class=\"slider\"></span>\n            </label>\n        </div>\n\n        <div class=\"desc\">\n            <span><%:If the OAF driver cannot be manually unloaded or the current driver is unstable, you can turn off auto-loading at startup and manually install a suitable driver. It is recommended to use the official stable OpenWrt firmware.%></span>\n        </div>\n\n        <div class=\"config-row\">\n            <label for=\"disableHnatSwitch\" class=\"config-label\" style=\"cursor: pointer;\"><%:Disable Hardware Acceleration%></label>\n            <label class=\"switch\">\n                <input type=\"checkbox\" id=\"disableHnatSwitch\" name=\"disableHnatSwitch\" />\n                <span class=\"slider\"></span>\n            </label>\n        </div>\n\n        <div class=\"desc\">\n            <span><%:Disable hardware acceleration (HNAT/ECM) and flow offloading to ensure application filtering works correctly. When enabled, this will automatically disable hardware acceleration and flow offloading features.%></span>\n        </div>\n\n        <div class=\"config-row\">\n            <label for=\"lan_ifname\" class=\"config-label\"><%:LAN Interface%></label>\n            <input type=\"text\" id=\"lan_ifname\">\n        </div>\n\n        <div class=\"desc\">\n            <span><%:The name of the LAN interface, used for detecting client info, supports fuzzy matching, but a complete interface name must be specified in bypass mode %></span>\n        </div>\n<!-- \n        <div class=\"config-row\">\n            <label class=\"config-label\"><%:Flow Offloading%></label>\n            <button type=\"button\" class=\"submit-button\" onclick=\"disableFlowOffloading()\"><%:Disable Flow Offloading%></button>\n        </div> \n\n        <div class=\"desc\">\n            <span><%:Flow offloading may affect filtering function. If the filtering feature does not work, you can disable flow offloading here and test again. Note: This only disables flow offloading temporarily. To permanently disable flow offloading, please turn it off in the firewall settings.%></span>\n        </div> -->\n\n        <div class=\"config-row\">\n            <label class=\"config-label\"><%:Clear Active Time%></label>\n            <button type=\"button\" class=\"submit-button\" onclick=\"clearActiveTime()\" style=\"background-color: #ea4335;\"><%:Clear Active Time%></button>\n        </div>\n\n        <div class=\"config-row\">\n            <label class=\"config-label\"><%:Clear Offline Users%></label>\n            <button type=\"button\" class=\"submit-button\" onclick=\"clearOfflineUsers()\" style=\"background-color: #ea4335;\"><%:Clear Offline Users%></button>\n        </div>\n        \n        <div style=\"margin-top: 20px; display: flex; justify-content: flex-end; gap: 10px;\">\n            <button type=\"button\" class=\"submit-button\" onclick=\"location.reload()\" style=\"background: transparent; color: #1a73e8; border: 1px solid var(--border-color-medium, #d1d5db);\"><%:Refresh%></button>\n            <button type=\"button\" class=\"submit-button\" onclick=\"submitHandle()\"><%:Save%></button>\n        </div>\n    </div>\n</div>\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/view/admin_network/app_filter.htm",
    "content": "<link rel=\"stylesheet\" href=\"<%=resource%>/css/common.css\">\n\n<style>\n \n    #appContainer {\n        display: flex;\n        flex-wrap: wrap;\n        margin-top: 20px;\n    }\n    \n\n.arrow {\n    width: 12px; \n    height: 12px; \n    background-image: url('<%=resource%>/icons/arrow.png'); \n    background-size: contain; \n    background-repeat: no-repeat; \n    transition: transform 0.3s ease; \n    display: inline-block; \n    transform: rotate(0deg); \n}\n.arrow.expanded {\n    transform: rotate(90deg); \n}\n\n    .category {\n        width: 100%;\n        margin-bottom: 20px;\n    }\n    .app-list {\n        display: flex;\n        flex-wrap: wrap;\n        justify-content: flex-start;\n        margin-top: 5px;\n        flex-direction: column;\n    }\n    .app-item {\n        width: 140px; \n        box-sizing: border-box;\n        padding: 5px;\n        display: flex;\n        align-items: center; \n    }\n    .app-items-row {\n        display: flex;\n        flex-wrap: wrap;\n        justify-content: flex-start;\n    }\n    .app-item label {\n        display: flex;\n        align-items: center; \n        width: 100%; \n        text-align: left; \n    }\n    \n    .app-item input[type=\"checkbox\"] {\n        margin: 0;\n        vertical-align: middle;\n        position: relative;\n        top: 0;\n        cursor: pointer;\n        -webkit-appearance: none;\n        -moz-appearance: none;\n        appearance: none;\n        border: 1px solid #aca9a9;\n    }\n    .app-item img {\n        vertical-align: middle;\n        display: inline-block;\n    }\n    \n    .app-item label div {\n        display: flex;\n        align-items: center;\n        gap: 5px;\n    }\n\n    h2 {\n        margin-bottom: 10px; \n    }\n    .category-title {\n        display: flex;\n        justify-content: space-between;\n        align-items: center; \n        width: 100%;\n        cursor: pointer; \n        margin-bottom: 10px; \n    }\n    .category-name {\n        font-size: 14px; \n        font-weight: normal;\n    }\n\n    .category-title div {\n        gap: 6px; \n    }\n\n    .select-all-btn {\n        background-color: #4CAF50;\n        color: white;\n        border: none;\n        padding: 4px 8px;\n        border-radius: 3px;\n        cursor: pointer;\n        font-size: 12px;\n        margin-left: 10px;\n    }\n\n    .select-all-btn:hover {\n        background-color: #45a049;\n    }\n\n    .select-all-btn.selected {\n        background-color: #f44336;\n    }\n\n    .select-all-btn.selected:hover {\n        background-color: #da190b;\n    }\n\n    .select-all-container {\n        display: flex;\n        align-items: center;\n        margin: 5px 0;\n        padding: 3px 0;\n        border-bottom: 1px solid var(--border-color-low, #e5e7eb);\n        width: 100%;\n        gap: 5px;\n    }\n    \n    .select-all-container input[type=\"checkbox\"] {\n        margin: 0;\n        vertical-align: middle;\n        position: relative;\n        top: 0;\n    }\n\n    .select-all-label {\n        font-size: 12px;\n        opacity: 0.7;\n        cursor: pointer;\n    }\n\n    @media (max-width: 600px) {\n        .app-item {\n            width: 100%; \n        }\n    }\n    \n    .config-row {\n        display: flex;\n        align-items: center;\n        margin-bottom: 16px;\n        flex-wrap: wrap;\n        gap: 4px 0;\n    }\n    \n    .config-label {\n        font-weight: 500;\n        font-size: 14px;\n        margin-right: 6px;\n    }\n    \n\n    .filter-mode-group {\n        display: flex;\n        align-items: center;\n        gap: 16px;\n    }\n    .filter-mode-option {\n        display: inline-flex;\n        align-items: center;\n        gap: 6px;\n        cursor: pointer;\n        font-size: 14px;\n        line-height: 1.4;\n        margin: 0;\n        padding: 0;\n    }\n    .filter-mode-option input[type=\"radio\"] {\n        margin: 0;\n        vertical-align: middle;\n        flex-shrink: 0;\n        position: relative;\n        top: 0;\n    }\n    \n    .help-icon {\n        position: relative;\n        display: inline-block;\n        margin-left: 8px;\n        cursor: help;\n        vertical-align: middle;\n    }\n    \n    .help-question {\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        width: 16px;\n        height: 16px;\n        border-radius: 50%;\n        background-color: #9aa0a6;\n        color: white;\n        font-size: 11px;\n        font-weight: bold;\n        transition: background-color 0.2s;\n    }\n    \n    .help-icon:hover .help-question {\n        background-color: #5f6368;\n    }\n    \n    .help-tooltip {\n        visibility: hidden;\n        width: 280px;\n        background-color: #3c4043;\n        color: #fff;\n        text-align: left;\n        border-radius: 4px;\n        padding: 12px;\n        position: absolute;\n        z-index: 1000;\n        top: 130%;\n        left: 50%;\n        transform: translateX(-50%);\n        font-size: 12px;\n        line-height: 1.5;\n        opacity: 0;\n        transition: opacity 0.2s;\n        box-shadow: 0 4px 8px rgba(0,0,0,0.15);\n    }\n    \n    .help-tooltip::after {\n        content: \"\";\n        position: absolute;\n        bottom: 100%;\n        left: 50%;\n        margin-left: -6px;\n        border-width: 6px;\n        border-style: solid;\n        border-color: transparent transparent #3c4043 transparent;\n    }\n    \n    .help-icon:hover .help-tooltip {\n        visibility: visible;\n        opacity: 1;\n    }\n\n    /* Module card styles - 简洁美观风格 */\n    .config-module {\n        margin-top: 5px;\n        border: 1px solid var(--border-color-low, #e0e0e0);\n        border-radius: 8px;\n        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n    }\n    \n    .module-header {\n        display: flex;\n        align-items: center;\n        cursor: pointer;\n        padding: 16px 20px;\n        border-bottom: 1px solid var(--border-color-low, #f0f0f0);\n        border-radius: 8px 8px 0 0;\n        transition: opacity 0.2s ease;\n    }\n    \n    .module-header:hover {\n        opacity: 0.85;\n    }\n    \n    .module-header .arrow {\n        margin-right: 12px;\n        width: 12px;\n        height: 12px;\n        background-image: url('<%=resource%>/icons/arrow.png');\n        background-size: contain;\n        background-repeat: no-repeat;\n        transition: transform 0.3s ease;\n        display: inline-block;\n        transform: rotate(0deg);\n        opacity: 0.6; /* 降低箭头透明度 */\n    }\n    \n    .module-header.expanded .arrow {\n        transform: rotate(90deg);\n    }\n    \n    .module-title {\n        font-size: 15px;\n        font-weight: 600;\n        flex: 1;\n    }\n    \n    .module-content {\n        padding: 18px 20px;\n        display: none;\n    }\n    \n    .module-content.expanded {\n        display: block;\n    }\n    \n    .status-module {\n        border: 1px solid var(--border-color-low, #e5e7eb);\n        border-radius: 8px;\n        padding: 18px 20px;\n        margin-top: 5px;\n        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n    }\n\n    /* 描述文字样式优化 */\n    .desc {\n        margin-top: 15px;\n        width: 100%;\n        max-width: 800px;\n        padding: 12px 16px;\n        border-radius: 6px;\n        box-sizing: border-box;\n        border-left: 3px solid #1a73e8;\n        opacity: 0.75;\n    }\n    .desc span {\n        font-size: 13px;\n        line-height: 1.6;\n        display: block;\n    }\n\n    /* 按钮样式 - 扁平化 */\n    .submit-button {\n        padding: 8px 20px;\n        width: 150px;\n        height: auto;\n        margin-top: 0;\n        background-color: #1a73e8;\n        color: white;\n        border: none;\n        border-radius: 4px;\n        cursor: pointer;\n        font-size: 13px;\n        font-weight: 500;\n        line-height: 1.4;\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        transition: background-color 0.2s;\n    }\n    \n    .submit-button:hover {\n        background-color: #1557b0;\n    }\n\n    .button-check {\n        padding: 6px 16px;\n        background: transparent;\n        color: #1a73e8;\n        border: 1px solid var(--border-color-medium, #d1d5db);\n        border-radius: 4px;\n        cursor: pointer;\n        font-size: 13px;\n        font-weight: 500;\n        transition: all 0.2s;\n    }\n    \n    .button-check:hover {\n        background-color: var(--background-color-low, #f5f5f5);\n        border-color: #1a73e8;\n        color: #174ea6;\n    }\n\n    /* 开关样式微调 */\n    .switch {\n        width: 36px;\n        height: 20px;\n    }\n    \n    .slider {\n        border-radius: 20px;\n    }\n    \n    .slider:before {\n        height: 16px;\n        width: 16px;\n        left: 2px;\n        bottom: 2px;\n    }\n    \n    input:checked + .slider {\n        background-color: #1a73e8;\n    }\n    \n    input:checked + .slider:before {\n        transform: translateX(16px);\n    }\n\n    /* Dialog styles */\n    .view-dialog {\n        display: none;\n        position: fixed;\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        background-color: rgba(0, 0, 0, 0.5);\n        z-index: 2000;\n        justify-content: center;\n        align-items: center;\n    }\n\n    .view-dialog-content {\n        background-color: var(--background-color-high, #fff);\n        border-radius: 8px;\n        padding: 20px 20px 0 20px;\n        max-width: 90%;\n        max-height: 90%;\n        box-shadow: 0 4px 6px rgba(0, 0, 0, 0.1);\n        position: relative;\n        display: flex;\n        flex-direction: column;\n        overflow: hidden;\n    }\n\n    .view-dialog-header {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        margin-bottom: 10px;\n        padding-bottom: 10px;\n        border-bottom: 1px solid var(--border-color-low, #e5e7eb);\n        flex-shrink: 0;\n    }\n\n    .view-dialog-title {\n        font-size: 18px;\n        font-weight: bold;\n    }\n\n    .view-dialog-close {\n        cursor: pointer;\n        font-size: 24px;\n        opacity: 0.5;\n        line-height: 1;\n    }\n\n    .view-dialog-close:hover {\n        opacity: 1;\n    }\n\n    .view-dialog-body {\n        padding: 10px 0 20px 0;\n        overflow: hidden;\n        flex: 1;\n        min-height: 0;\n        display: flex;\n        flex-direction: column;\n    }\n\n    .user-list-table {\n        width: 100%;\n        border-collapse: collapse;\n        margin-top: 10px;\n    }\n\n    .user-list-table th,\n    .user-list-table td {\n        padding: 8px;\n        border: 1px solid var(--border-color-low, #e5e7eb);\n        text-align: left;\n    }\n\n    .user-list-table th {\n        background-color: var(--background-color-low, #f5f5f5);\n        font-weight: bold;\n    }\n\n    .user-list-container {\n        flex: 1;\n        overflow-y: auto;\n        margin-top: 10px;\n        min-height: 0;\n    }\n\n    .time-display {\n        margin-top: 10px;\n    }\n\n    .time-period-item {\n        margin: 8px 0;\n        padding: 15px;\n        border: 1px solid var(--border-color-low, #e5e7eb);\n        border-radius: 6px;\n        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n        transition: box-shadow 0.2s;\n    }\n\n    .time-period-item:hover {\n        box-shadow: 0 2px 6px rgba(0, 0, 0, 0.15);\n    }\n\n    .time-period-item strong {\n        font-size: 14px;\n        display: block;\n        margin-bottom: 8px;\n    }\n\n    .time-period-item div {\n        margin: 5px 0;\n        opacity: 0.7;\n        font-size: 13px;\n    }\n\n    .time-period-item div strong {\n        font-weight: 600;\n        display: inline;\n        margin-right: 5px;\n        opacity: 1;\n    }\n\n    .dynamic-time-item {\n        margin: 8px 0;\n        padding: 15px;\n        border: 1px solid var(--border-color-low, #e5e7eb);\n        border-radius: 6px;\n        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1);\n    }\n\n    /* 时间进度条样式 */\n    .time-progress-row {\n        display: flex;\n        align-items: center;\n        margin-top: 6px;\n    }\n    .time-progress-label {\n        width: 32px;\n        font-size: 12px;\n        color: #666;\n        opacity: 0.9;\n        flex-shrink: 0;\n        font-weight: 500;\n    }\n    .time-progress-bar {\n        flex: 1;\n        height: 6px;\n        background-color: #d1d5db;\n        border-radius: 3px;\n        overflow: hidden;\n        margin: 0 8px;\n        min-width: 80px;\n        max-width: 220px;\n    }\n    .time-progress-fill {\n        height: 100%;\n        border-radius: 3px;\n        background-color: #1a73e8;\n        transition: width 0.5s ease;\n    }\n    .time-progress-text {\n        font-size: 12px;\n        white-space: nowrap;\n        flex-shrink: 0;\n    }\n\n    /* 清除按钮样式 */\n    .clear-time-btn {\n        padding: 4px 12px;\n        background-color: #ea4335;\n        color: white;\n        border: none;\n        border-radius: 4px;\n        cursor: pointer;\n        font-size: 12px;\n        font-weight: 500;\n        transition: background-color 0.2s;\n    }\n    .clear-time-btn:hover {\n        background-color: #c5221f;\n    }\n\n    .dynamic-time-item div {\n        margin: 8px 0;\n        opacity: 0.7;\n        font-size: 13px;\n    }\n\n    .dynamic-time-item div strong {\n        font-weight: 600;\n        display: inline;\n        margin-right: 5px;\n        opacity: 1;\n    }\n\n</style>\n\n<script type=\"text/javascript\">//<![CDATA[\n\t\tconst data = {\n            \"class_list\": [\n            ]\n        };\n\t\tlet app_filter_data = [];\n        const selectedAppIds = [];\n\n\n\t\tfunction init_data() {\n\t\t\tgetAppFilterData().then(() => {\n\t\t\t\tgetClassListData();\n\t\t\t});\n\t\t\tgetAppFilterBaseData(); \n\t\t}\n\n\t\tfunction getAppFilterData() {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tnew XHR().get('<%=url('admin/network/get_app_filter')%>', null,\n\t\t\t\t\tfunction (x, data) {\n\t\t\t\t\t\tif (Array.isArray(data.app_list)) {\n\t\t\t\t\t\t\tapp_filter_data = data.app_list;\n\t\t\t\t\t\t}\n\t\t\t\t\t\tresolve(); \n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\n\t\tfunction getClassListData() {\n\t\t\tnew XHR().get('<%=url('admin/network/class_list')%>', null,\n\t\t\t\tfunction (x, data) {\n\t\t\t\t\trenderAppList(data);\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n        function renderAppList(data) {\n            const container = document.getElementById('appContainer');\n            container.innerHTML = ''; \n\n            data.class_list.forEach((category, index) => {\n                const categoryTitle = document.createElement('div');\n                categoryTitle.className = 'category-title'; \n\n                const categoryName = document.createElement('span');\n                categoryName.textContent = `${category.name} (${category.app_list.length} <%:items%>)`;\n                categoryName.className = 'category-name';\n\n                const rightContainer = document.createElement('div');\n                rightContainer.style.display = 'flex'; \n                rightContainer.style.alignItems = 'center'; \n\n                const appCount = document.createElement('span');\n                const selectedCount = category.app_list.filter(app => \n                    app_filter_data.includes(parseInt(app.split(',')[0]))\n                ).length;\n                appCount.textContent = `<%:Selected%> ${selectedCount} <%:items%>`; \n                appCount.className = 'app-count'; \n\n                const arrow = document.createElement('span');\n                arrow.className = 'arrow'; \n\n                rightContainer.appendChild(appCount);\n                rightContainer.appendChild(arrow);\n\n                categoryTitle.appendChild(categoryName);\n                categoryTitle.appendChild(rightContainer);\n                container.appendChild(categoryTitle);\n\n                const appList = document.createElement('div');\n                appList.className = 'app-list';\n                appList.style.display = 'none';\n\n                const selectAllContainer = document.createElement('div');\n                selectAllContainer.className = 'select-all-container';\n\n                const selectAllCheckbox = document.createElement('input');\n                selectAllCheckbox.type = 'checkbox';\n                selectAllCheckbox.checked = selectedCount === category.app_list.length;\n                selectAllCheckbox.title = selectedCount === category.app_list.length ? '<%:Deselect All%>' : '<%:Select All%>';\n\n                const selectAllLabel = document.createElement('span');\n                selectAllLabel.className = 'select-all-label';\n                selectAllLabel.textContent = '<%:Select All%>';\n\n                selectAllContainer.appendChild(selectAllCheckbox);\n                selectAllContainer.appendChild(selectAllLabel);\n                appList.appendChild(selectAllContainer);\n\n                const appItemsRow = document.createElement('div');\n                appItemsRow.className = 'app-items-row';\n\n                categoryTitle.onclick = function(e) {\n                    if (appList.style.display === 'none') {\n                        appList.style.display = 'flex';\n                        arrow.classList.add('expanded');\n                    } else {\n                        appList.style.display = 'none';\n                        arrow.classList.remove('expanded');\n                    }\n                };\n\n                selectAllCheckbox.onchange = function(e) {\n                    e.stopPropagation();\n                    toggleSelectAll(category, selectAllCheckbox, appCount);\n                };\n\n                selectAllLabel.onclick = function(e) {\n                    e.stopPropagation(); \n                    selectAllCheckbox.checked = !selectAllCheckbox.checked;\n                    toggleSelectAll(category, selectAllCheckbox, appCount);\n                };\n\n                category.app_list.forEach(app => {\n                    const appItem = document.createElement('div');\n                    appItem.className = 'app-item';\n\n                    const label = document.createElement('label');\n\n                    const containerDiv = document.createElement('div');\n                    containerDiv.style.display = 'flex'; \n                    containerDiv.style.alignItems = 'center';\n                    containerDiv.style.gap = '5px';\n\n                    const checkbox = document.createElement('input');\n                    checkbox.type = 'checkbox';\n                    checkbox.name = 'app';\n                    checkbox.value = app.split(',')[0];\n                    \n                    if (app_filter_data.includes(parseInt(checkbox.value))) {\n                        checkbox.checked = true;\n                    }\n\n                    checkbox.onchange = function() {\n                        updateCategorySelection(category, selectAllCheckbox, appCount);\n                    };\n\n                    const appDetails = app.split(',');\n                    const appId = appDetails[0];\n                    const appName = appDetails[1];\n                    const withIcon = appDetails[2] === '1';\n\n                    const icon = document.createElement('img');\n                    icon.src = withIcon ? `<%=resource%>/app_icons/${appId}.png` : `<%=resource%>/app_icons/default.png`; \n                    icon.alt = `Icon for ${appName}`;\n                    icon.style.width = '20px'; \n                    icon.style.height = '20px'; \n                    icon.style.borderRadius = '7px';\n                    icon.style.verticalAlign = 'middle';\n                    containerDiv.appendChild(checkbox);\n                    containerDiv.appendChild(icon);\n                    containerDiv.appendChild(document.createTextNode(appName));\n\n                    label.appendChild(containerDiv);\n                    appItem.appendChild(label);\n                    appItemsRow.appendChild(appItem);\n                });\n                \n                appList.appendChild(appItemsRow);\n                container.appendChild(appList);\n            });\n            updateTotalSelectedCount();\n        }\n\n        function toggleSelectAll(category, selectAllCheckbox, appCount) {\n            const checkboxes = document.querySelectorAll(`input[name=\"app\"]`);\n            const categoryAppIds = category.app_list.map(app => parseInt(app.split(',')[0]));\n            const isAllSelected = selectAllCheckbox.checked;\n            \n            checkboxes.forEach(checkbox => {\n                const appId = parseInt(checkbox.value);\n                if (categoryAppIds.includes(appId)) {\n                    checkbox.checked = isAllSelected;\n                }\n            });\n            \n            updateCategorySelection(category, selectAllCheckbox, appCount);\n            updateTotalSelectedCount();\n        }\n\n        function updateCategorySelection(category, selectAllCheckbox, appCount) {\n            const checkboxes = document.querySelectorAll(`input[name=\"app\"]`);\n            const categoryAppIds = category.app_list.map(app => parseInt(app.split(',')[0]));\n            let selectedCount = 0;\n            \n            checkboxes.forEach(checkbox => {\n                const appId = parseInt(checkbox.value);\n                if (categoryAppIds.includes(appId) && checkbox.checked) {\n                    selectedCount++;\n                }\n            });\n            \n            appCount.textContent = `<%:Selected%> ${selectedCount} <%:items%>`;\n            \n            selectAllCheckbox.checked = selectedCount === category.app_list.length;\n            updateTotalSelectedCount();\n        }\n\n        function updateTotalSelectedCount() {\n            const checkboxes = document.querySelectorAll('input[name=\"app\"]:checked');\n            const totalCount = checkboxes.length;\n            const totalCountElement = document.getElementById('totalSelectedCount');\n            if (totalCountElement) {\n                totalCountElement.textContent = totalCount;\n            }\n        }\n\n        function submitAppSelection() {\n            const selectedApps = [];\n            const checkboxes = document.querySelectorAll('input[name=\"app\"]:checked');\n            checkboxes.forEach(checkbox => {\n                selectedApps.push(parseInt(checkbox.value));\n            });\n\n            const selectedAppsStr = selectedApps.join(',');\n\n            console.log(\"app_filter_data is \" + selectedAppsStr);\n            new XHR().post('<%=url('admin/network/set_app_filter')%>', {\n                app_list: selectedAppsStr \n            },\n            function (x, data) {\n                console.log(\"set ok\");\n                console.log(\"set_app_filter data is \" + data);\n                init_data();\n                const modal = document.getElementById('modal');\n                modal.style.display = 'flex'; \n                setTimeout(() => {\n                    modal.style.display = 'none'; \n                }, 1000);\n            }\n            );\n        }\n\n        function submitAppFilterBase(callback) {\n            const filterSwitch = document.getElementById('filterSwitch').checked;\n            const workMode = parseInt(document.getElementById('workMode').value, 10);\n            const recordSwitch = document.getElementById('recordSwitch').checked;\n            const quicProtocol = parseInt(document.getElementById('quicProtocol').value, 10);\n            const appFilterMode = parseInt(document.querySelector('input[name=\"appFilterMode\"]:checked').value, 10);\n            const data = {\n                data: {\n                    enable: filterSwitch ? 1 : 0, \n                    work_mode: workMode,\n                    record_enable: recordSwitch ? 1 : 0,\n                    disable_quic: quicProtocol,\n                    app_filter_mode: appFilterMode\n                }\n            };\n            console.log(\"submitAppFilterBase\");\n            new XHR().post('<%=url('admin/network/set_app_filter_base')%>', {\n                \n                enable: filterSwitch ? 1 : 0, \n                work_mode: workMode,\n                record_enable: recordSwitch ? 1 : 0,\n                disable_quic: quicProtocol,\n                app_filter_mode: appFilterMode\n                \n            },\n\n\n            function (x, data) {\n                console.log(\"Base filter settings updated\");\n                if (callback && typeof callback === 'function') {\n                    callback();\n                }\n            }\n            );\n\n        }\n \n\t\tfunction submitHandle() {\n\t\t\tconst appFilterMode = parseInt(document.querySelector('input[name=\"appFilterMode\"]:checked').value, 10);\n\t\t\t\n\t\t\tif (appFilterMode == 0) {\n\t\t\t\t// Specified apps mode: submit both base and app selection\n\t\t\t\tsubmitAppFilterBase();\n\t\t\t\tsubmitAppSelection();\n\t\t\t} else {\n\t\t\t\t// All apps mode: only submit base, then show success dialog\n\t\t\t\tsubmitAppFilterBase(function() {\n\t\t\t\t\tinit_data();\n\t\t\t\t\tconst modal = document.getElementById('modal');\n\t\t\t\t\tmodal.style.display = 'flex'; \n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tmodal.style.display = 'none'; \n\t\t\t\t\t}, 1000);\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\tfunction openModal() {\n\t\t\tdocument.getElementById('modal').style.display = 'block';\n\t\t}\n\n\t\tfunction closeModal() {\n\t\t\tdocument.getElementById('modal').style.display = 'none';\n\t\t}\n\n        function clearActiveTime() {\n            if (!confirm('<%:Are you sure you want to clear active time of all users?%>')) {\n                return;\n            }\n            new XHR().post('<%=url('admin/network/cmd')%>', {\n                action: 'clear_active_time'\n            },\n            function (x, data) {\n                if (data && data.code === 0) {\n                    const modal = document.getElementById('modal');\n                    modal.style.display = 'flex'; \n                    setTimeout(() => {\n                        modal.style.display = 'none';\n                    }, 1000);\n                    // Refresh status to update display\n                    setTimeout(() => {\n                        updateRunStatus();\n                    }, 500);\n                } else {\n                    alert(data ? (data.message || '<%:Failed to clear active time%>') : '<%:Failed to clear active time%>');\n                }\n            });\n        }\n\n        function switchAppFilterMode(mode) {\n            const allAppsWarning = document.getElementById('allAppsWarning');\n            const specificAppsSection = document.getElementById('specificAppsSection');\n            \n            if (mode == 1) {\n                // All Apps mode: hide app selection and QUIC\n                allAppsWarning.style.display = 'block';\n                specificAppsSection.style.display = 'none';\n            } else {\n                // Specified Apps mode: show app selection and QUIC\n                allAppsWarning.style.display = 'none';\n                specificAppsSection.style.display = 'block';\n            }\n        }\n\n        function getAppFilterBaseData() {\n\t\t\tconsole.log(\"getAppFilterBaseData\");\n            new XHR().get('<%=url('admin/network/get_app_filter_base')%>', null,\n                function (x, data) {\n                    if (data.data.enable == 1) {\n                        document.getElementById('filterSwitch').checked = true;\n                    } else {\n                        document.getElementById('filterSwitch').checked = false;\n                    }\n                    if (data.data.record_enable == 1) {\n                        document.getElementById('recordSwitch').checked = true;\n                    } else {\n                        document.getElementById('recordSwitch').checked = false;\n                    }\n                    document.getElementById('workMode').value = data.data.work_mode;\n                    document.getElementById('quicProtocol').value = data.data.disable_quic || 0;\n                    \n                    // Load app filter mode (0 = specified apps, 1 = all apps)\n                    const appFilterMode = data.data.app_filter_mode || 0;\n                    if (appFilterMode == 1) {\n                        document.getElementById('appFilterModeAll').checked = true;\n                    } else {\n                        document.getElementById('appFilterModeSpecific').checked = true;\n                    }\n                    switchAppFilterMode(appFilterMode);\n                    \n                    updateBypassModeHint();\n                }\n            );\n        }\n        \n        function updateBypassModeHint() {\n            var workMode = parseInt(document.getElementById('workMode').value, 10);\n            var hintDiv = document.getElementById('bypassModeHint');\n            if (hintDiv) {\n                if (workMode === 1) {\n                    hintDiv.style.display = 'block';\n                } else {\n                    hintDiv.style.display = 'none';\n                }\n            }\n        }\n\n        function redirectToUserConfig() {\n            window.location.href = '<%=url('admin/services/appfilter/user')%>';\n        }\n        function redirectToTimeConfig() {\n            window.location.href = '<%=url('admin/services/appfilter/time')%>';\n        }\n\n        function toggleModule(header) {\n            const content = header.nextElementSibling;\n            header.classList.toggle('expanded');\n            content.classList.toggle('expanded');\n        }\n\n        let timeMode = 0; // Store current time mode\n        let whitelistUsers = []; // Store whitelist users\n\n        function showTimeDialog() {\n            const dialog = document.getElementById('timeDialog');\n            const content = document.getElementById('timeDialogContent');\n            \n            // Get time configuration\n            new XHR().get('<%=url('admin/network/get_app_filter_time')%>', null,\n                function (x, data) {\n                    timeMode = data.data.mode || 0;\n                    content.innerHTML = '';\n                    \n                    if (timeMode == 0) {\n                        // Fixed time mode - show time list\n                        if (data.data.time_list && data.data.time_list.length > 0) {\n                            data.data.time_list.forEach((period, index) => {\n                                const periodDiv = document.createElement('div');\n                                periodDiv.className = 'time-period-item';\n                                \n                                const weekdays = period.weekday_list || [];\n                                const weekdayNames = ['<%:Sun%>', '<%:Mon%>', '<%:Tue%>', '<%:Wed%>', '<%:Thur%>', '<%:Fri%>', '<%:Sat%>'];\n                                const weekdayStr = weekdays.map(wd => weekdayNames[wd]).join(', ') || '<%:All Days%>';\n                                \n                                periodDiv.innerHTML = `\n                                    <strong><%:Period%> ${index + 1}</strong>\n                                    <div><strong><%:Weekdays%>:</strong> ${weekdayStr}</div>\n                                    <div><strong><%:Time Range%>:</strong> ${period.start} - ${period.end}</div>\n                                `;\n                                content.appendChild(periodDiv);\n                            });\n                        } else {\n                            const noData = document.createElement('div');\n                            noData.style.cssText = 'text-align: center; padding: 30px; opacity: 0.5; font-size: 14px;';\n                            noData.textContent = '<%:No time periods configured%>';\n                            content.appendChild(noData);\n                        }\n                    } else if (timeMode == 1) {\n                        // Dynamic time mode\n                        const dynamicDiv = document.createElement('div');\n                        dynamicDiv.className = 'dynamic-time-item';\n                        \n                        const weekdays = data.data.weekday_list || [];\n                        const weekdayNames = ['<%:Sun%>', '<%:Mon%>', '<%:Tue%>', '<%:Wed%>', '<%:Thur%>', '<%:Fri%>', '<%:Sat%>'];\n                        const weekdayStr = weekdays.map(wd => weekdayNames[wd]).join(', ') || '<%:All Days%>';\n                        \n                        dynamicDiv.innerHTML = `\n                            <div><strong><%:Time Range%>:</strong> ${data.data.start_time || '00:00'} - ${data.data.end_time || '23:59'}</div>\n                            <div><strong><%:Weekdays%>:</strong> ${weekdayStr}</div>\n                            <div><strong><%:Deny Time%>:</strong> ${data.data.deny_time || 60} <%:minutes%></div>\n                            <div><strong><%:Allow Time%>:</strong> ${data.data.allow_time || 20} <%:minutes%></div>\n                        `;\n                        content.appendChild(dynamicDiv);\n                    } else if (timeMode == 2 || timeMode == 3) {\n                        // Daily time limit mode (mode 2 or 3) - show in table format\n                        if (data.data.daily_time_list && Array.isArray(data.data.daily_time_list) && data.data.daily_time_list.length === 7) {\n                            const weekdayNames = ['<%:Sunday%>', '<%:Monday%>', '<%:Tuesday%>', '<%:Wednesday%>', '<%:Thursday%>', '<%:Friday%>', '<%:Saturday%>'];\n                            const weekdayDisplayOrder = [1, 2, 3, 4, 5, 6, 0]; // Monday to Sunday for display\n                            \n                            const table = document.createElement('table');\n                            table.style.cssText = 'width: 100%; border-collapse: collapse; margin-top: 10px;';\n                            table.innerHTML = `\n                                <thead>\n                                    <tr>\n                                        <th style=\"border: 1px solid var(--border-color-low, #e5e7eb); padding: 8px; text-align: center; width: 25%;\"><%:Weekday%></th>\n                                        <th style=\"border: 1px solid var(--border-color-low, #e5e7eb); padding: 8px; text-align: center; width: 15%;\"><%:Enable%></th>\n                                        <th style=\"border: 1px solid var(--border-color-low, #e5e7eb); padding: 8px; text-align: center; width: 30%;\"><%:Morning Time Limit (minutes)%></th>\n                                        <th style=\"border: 1px solid var(--border-color-low, #e5e7eb); padding: 8px; text-align: center; width: 30%;\"><%:Afternoon Time Limit (minutes)%></th>\n                                    </tr>\n                                </thead>\n                                <tbody id=\"dailyTimeTableBody\"></tbody>\n                            `;\n                            content.appendChild(table);\n                            \n                            const tbody = document.getElementById('dailyTimeTableBody');\n                            weekdayDisplayOrder.forEach((dayValue) => {\n                                const arrayIndex = dayValue; // Array index matches weekday value\n                                const dayData = data.data.daily_time_list[arrayIndex];\n                                \n                                const tr = document.createElement('tr');\n                                const amTime = (dayData && dayData.am_time !== undefined) ? dayData.am_time : 0;\n                                const pmTime = (dayData && dayData.pm_time !== undefined) ? dayData.pm_time : 0;\n                                const isEnabled = (dayData && dayData.enable == 1);\n                                \n                                tr.innerHTML = `\n                                    <td style=\"border: 1px solid #ddd; padding: 8px; text-align: center;\">${weekdayNames[dayValue]}</td>\n                                    <td style=\"border: 1px solid #ddd; padding: 8px; text-align: center;\">${isEnabled ? '<%:Yes%>' : '<%:No%>'}</td>\n                                    <td style=\"border: 1px solid #ddd; padding: 8px; text-align: center;\">${amTime}</td>\n                                    <td style=\"border: 1px solid #ddd; padding: 8px; text-align: center;\">${pmTime}</td>\n                                `;\n                                tbody.appendChild(tr);\n                            });\n                        } else {\n                            const noData = document.createElement('div');\n                            noData.style.cssText = 'text-align: center; padding: 30px; opacity: 0.5; font-size: 14px;';\n                            noData.textContent = '<%:No daily time limits configured%>';\n                            content.appendChild(noData);\n                        }\n                    }\n                    \n                    dialog.style.display = 'flex';\n                }\n            );\n        }\n\n        function showUserDialog() {\n            const dialog = document.getElementById('userDialog');\n            const content = document.getElementById('userDialogContent');\n            \n            // First get whitelist users if in dynamic mode\n            new XHR().get('<%=url('admin/network/get_oaf_status')%>', null,\n                function (x, statusData) {\n                    const isDynamicMode = statusData.data.time_mode == 1;\n                    \n                    if (isDynamicMode) {\n                        // Get whitelist users\n                        new XHR().get('<%=url('admin/network/get_whitelist_user')%>', null,\n                            function (x, whitelistData) {\n                                whitelistUsers = [];\n                                if (whitelistData.data && whitelistData.data.user_list) {\n                                    whitelistUsers = whitelistData.data.user_list.map(u => u.mac || u);\n                                }\n                                loadUserList(dialog, content, isDynamicMode);\n                            }\n                        );\n                    } else {\n                        whitelistUsers = [];\n                        loadUserList(dialog, content, isDynamicMode);\n                    }\n                }\n            );\n        }\n\n        function loadUserList(dialog, content, isDynamicMode) {\n            content.innerHTML = '<div style=\"text-align: center; padding: 20px;\"><%:Loading...%></div>';\n            \n            // First get user_mode to determine which users to show\n            new XHR().get('<%=url('admin/network/get_app_filter_user')%>', null,\n                function (x, userConfigData) {\n                    const userMode = userConfigData.data.mode || 0; // 0 = automatic, 1 = manual\n                    // Ensure manualUserList is an array\n                    let manualUserList = [];\n                    if (userConfigData.data && userConfigData.data.list) {\n                        if (Array.isArray(userConfigData.data.list)) {\n                            manualUserList = userConfigData.data.list;\n                        }\n                    }\n                    const manualUserMacs = manualUserList.map(u => u.mac || u);\n                    \n                    // Get all users with full information\n                    new XHR().get('<%=url('admin/network/get_all_users')%>', {flag: 3, page: 0, page_size: 0},\n                        function (x, data) {\n                            content.innerHTML = '';\n                            \n                            if (isDynamicMode) {\n                                const hint = document.createElement('div');\n                                hint.style.cssText = 'margin-bottom: 10px; padding: 10px; border-radius: 4px; opacity: 0.7; border-left: 3px solid #e8a317;';\n                                hint.textContent = '<%:Dynamic time mode: Whitelist users are excluded%>';\n                                content.appendChild(hint);\n                            }\n                            \n                            const container = document.createElement('div');\n                            container.className = 'user-list-container';\n                            \n                            const table = document.createElement('table');\n                            table.className = 'user-list-table';\n                            table.innerHTML = `\n                                <thead>\n                                    <tr>\n                                        <th><%:Device Info%></th>\n                                        <th><%:IP Address%></th>\n                                        <th><%:Online Status%></th>\n                                    </tr>\n                                </thead>\n                                <tbody id=\"userListBody\"></tbody>\n                            `;\n                            container.appendChild(table);\n                            content.appendChild(container);\n                            \n                            const tbody = document.getElementById('userListBody');\n                            let userList = data.data.list || [];\n                            \n                            // Filter users based on user_mode\n                            if (userMode == 0) {\n                                // Automatic mode: show all users except whitelist\n                                userList = userList.filter(user => user.is_whitelist !== 1);\n                            } else {\n                                // Manual mode: only show manually added users\n                                userList = userList.filter(user => manualUserMacs.includes(user.mac));\n                            }\n                            \n                            // Filter out whitelist users in dynamic mode (additional filter)\n                            if (isDynamicMode && whitelistUsers.length > 0) {\n                                userList = userList.filter(user => !whitelistUsers.includes(user.mac));\n                            }\n                            \n                            if (userList.length === 0) {\n                                container.style.display = 'none';\n                                const noData = document.createElement('div');\n                                noData.style.cssText = 'text-align: center; padding: 20px; opacity: 0.5;';\n                                noData.textContent = '<%:No users found%>';\n                                content.appendChild(noData);\n                            } else {\n                                userList.forEach(user => {\n                                    const tr = document.createElement('tr');\n                                    const nickname = user.nickname || \"\";\n                                    const hostname = user.hostname || \"\";\n                                    const displayName = nickname || hostname || \"--\";\n                                    \n                                    if (user.online == 0) {\n                                        tr.style.color = '#A9A9A9';\n                                    }\n                                    \n                                    let onlineStatusHtml = '<span style=\"opacity: 0.5;\"><%:Offline%></span>';\n                                    if (user.online == 2) {\n                                        onlineStatusHtml = '<span style=\"color: #1a73e8;\"><%:Active%></span>';\n                                    } else if (user.online == 1) {\n                                        onlineStatusHtml = '<span style=\"color: green;\"><%:Online%></span>';\n                                    }\n                                    \n                                    tr.innerHTML = `\n                                        <td>\n                                            <div>${displayName}</div>\n                                            <div style=\"font-size: 12px; opacity: 0.5;\">${user.mac}</div>\n                                        </td>\n                                        <td>${user.ip || '--'}</td>\n                                        <td>${onlineStatusHtml}</td>\n                                    `;\n                                    tbody.appendChild(tr);\n                                });\n                            }\n                            \n                            if (dialog) {\n                                dialog.style.display = 'flex';\n                            }\n                        }\n                    );\n                }\n            );\n        }\n\n        function closeTimeDialog() {\n            document.getElementById('timeDialog').style.display = 'none';\n        }\n\n        function closeUserDialog() {\n            document.getElementById('userDialog').style.display = 'none';\n        }\n\n        // Close dialog when clicking outside\n        window.onclick = function(event) {\n            const timeDialog = document.getElementById('timeDialog');\n            const userDialog = document.getElementById('userDialog');\n            if (event.target == timeDialog) {\n                closeTimeDialog();\n            }\n            if (event.target == userDialog) {\n                closeUserDialog();\n            }\n        }\n\n        function formatTime(minutes) {\n            // 如果值为空或undefined，显示0min\n            if (minutes === undefined || minutes === null || minutes === '') {\n                return '0<%:min%>';\n            }\n            var mins = parseInt(minutes);\n            if (isNaN(mins) || mins < 0) {\n                return '0<%:min%>';\n            }\n            // 如果小于60分钟，直接显示分钟\n            if (mins < 60) {\n                return mins + '<%:min%>';\n            }\n            // 大于等于60分钟，转换为小时和分钟\n            var hours = Math.floor(mins / 60);\n            var remainingMins = mins % 60;\n            if (remainingMins === 0) {\n                return hours + '<%:h%>';\n            } else {\n                return hours + '<%:h%> ' + remainingMins + '<%:min%>';\n            }\n        }\n   \n        function buildProgressBar(label, used, limit) {\n            if (limit <= 0) return `<div class=\"time-progress-row\"><span class=\"time-progress-label\">${label}</span><span class=\"time-progress-text\" style=\"opacity:0.5;\"><%:Not set%></span></div>`;\n            var pct = Math.min(Math.round((used / limit) * 100), 100);\n            var text = used >= limit ? `<span style=\"color:#d93025;\"><%:Used up%></span> <span style=\"opacity:0.5;\">(<%:Total%>: ${limit} <%:min%>)</span>` : `${used} / ${limit} <%:min%>`;\n            return `<div class=\"time-progress-row\"><span class=\"time-progress-label\">${label}</span><div class=\"time-progress-bar\"><div class=\"time-progress-fill\" style=\"width:${pct}%\"></div></div><span class=\"time-progress-text\">${text}</span></div>`;\n        }\n\n        function updateRunStatus() {\n            new XHR().get('<%=url('admin/network/get_oaf_status')%>', null,\n                function (x, data) {\n                    const runStatusElement = document.getElementById('run_status');\n                    const runDescElement = document.getElementById('run_desc');\n                    const engineStatusContainer = document.querySelector('.app_filter_status:first-child');\n                    const mode2InfoDiv = document.getElementById('mode2TimeUsageInfo');\n                    const mode2ContentDiv = document.getElementById('mode2TimeUsageContent');\n                    const hnatWarningDiv = document.getElementById('hnatWarning');\n\n                    if (data.data.engine_status === 1) {\n                        if (data.data.config_enable == 0) {\n                            runStatusElement.textContent = '<%:Not Configured%>';\n                            runStatusElement.style.color = 'red';\n                        } else {\n                            if (data.data.enable === 1) {\n                                runStatusElement.textContent = '<%:Running%>';\n                                runStatusElement.style.color = 'green'; \n                                if (data.data.time_mode == 1 && data.data.filter == 1) {\n                                    runDescElement.textContent = `(<%:Currently in dynamic time mode,will close in%> ${data.data.remain_time} <%:minutes%>)`;\n                                }\n                            } else {\n                                runStatusElement.textContent = '<%:Not Running%>';\n                                runStatusElement.style.color = 'red'; \n                                if (data.data.time_mode == 1) {\n                                    if (data.data.match_time == 0) {\n                                        runDescElement.textContent = `(<%:Current time is not within the time range%>)`;\n                                    } else {\n                                        runDescElement.textContent = `(<%:Currently in dynamic time mode,will start in%> ${data.data.remain_time} <%:minutes%>)`;\n                                    }\n                                } else if (data.data.time_mode == 2) {\n                                    // Mode 2: 不在运行状态后显示用量，下方有进度条展示\n                                } else {\n                                    runDescElement.textContent = `(<%:Current time is not within the time range%>)`;\n                                }\n                            }\n                        }\n                    }\n                    else{\n                        runStatusElement.textContent = '<%:Not Running%>';\n                        runStatusElement.style.color = 'red'; \n                        runDescElement.textContent = `(<%:oaf driver not loaded, please download the oaf.ko driver file corresponding to the kernel version of this firmware for installation, and enable auto-loading. Current kernel version is%> ${data.data.kernel_version})`;\n                    }\n                    \n                    // 显示 Mode 2 的详细信息\n                    if (data.data.time_mode == 2 && mode2InfoDiv && mode2ContentDiv) {\n                        if (data.data.current_weekday !== undefined) {\n                            const weekdayNames = ['<%:Sunday%>', '<%:Monday%>', '<%:Tuesday%>', '<%:Wednesday%>', '<%:Thursday%>', '<%:Friday%>', '<%:Saturday%>'];\n                            const currentWeekday = data.data.current_weekday;\n                            const currentWeekdayName = weekdayNames[currentWeekday] || '';\n                            \n                            const amUsed = data.data.current_am_used_time || 0;\n                            const pmUsed = data.data.current_pm_used_time || 0;\n                            const amLimit = data.data.current_am_limit || 0;\n                            const pmLimit = data.data.current_pm_limit || 0;\n                            const dayEnabled = data.data.current_day_enabled || 0;\n                            const selectedUserCount = data.data.selected_user_count || 0;\n                            \n                            mode2InfoDiv.style.display = 'block';\n                            let html = `<div style=\"display:flex; align-items:center; justify-content:space-between;\"><strong><%:Today is%>: ${currentWeekdayName}</strong><span style=\"opacity:0.6; font-size:12px;\"><%:Active Users%>: ${selectedUserCount}</span></div>`;\n                            if (dayEnabled) {\n                                html += buildProgressBar('<%:AM%>', amUsed, amLimit);\n                                html += buildProgressBar('<%:PM%>', pmUsed, pmLimit);\n                            } else {\n                                html += `<div style=\"margin-top: 8px; opacity: 0.6;\"><%:Time limit not enabled for today%></div>`;\n                            }\n                            mode2ContentDiv.innerHTML = html;\n                        } else {\n                            mode2InfoDiv.style.display = 'none';\n                        }\n                    } else if (mode2InfoDiv) {\n                        mode2InfoDiv.style.display = 'none';\n                    }\n                    \n                    // 检查 disable_hnat 配置，只有在过滤功能开启时才显示提示\n                    if (hnatWarningDiv && data.data.disable_hnat !== undefined) {\n                        // 只有在过滤功能开启时（enable === 1）才显示提示\n                        if (data.data.enable === 1 && data.data.disable_hnat == 0) {\n                            hnatWarningDiv.style.display = 'block';\n                        } else {\n                            hnatWarningDiv.style.display = 'none';\n                        }\n                    }\n                }\n            );\n        }\n\n        window.onload = function() {\n            init_data();\n            updateRunStatus();\n            setInterval(updateRunStatus, 5000); \n        };\n//]]></script>\n\n<div id=\"modal\" style=\"display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: transparent; z-index: 1000; justify-content: center; align-items: center;\">\n    <div style=\"background-color: rgba(0, 0, 0, 0.65); padding: 14px 24px; border-radius: 6px; text-align: center; color: white; display: flex; justify-content: center; align-items: center;\">\n        <p style=\"margin: 0; color: white; font-size: 14px;\"><%:Settings saved successfully%></p>\n    </div>\n</div>\n\n<div class=\"cbi-section cbi-tblsection\">\n    <div style=\"max-width: 1000px; margin-left: 5px;padding: 5px;\">\n\n        <!-- Status Module -->\n        <div class=\"status-module\">\n            <div style=\"display: flex; align-items: center; margin-bottom: 10px;\">\n                <span style=\"font-size: 14px; font-weight: 500;\"><%:App Filter is a powerful parental control software%></span>\n                <span class=\"help-icon\">\n                    <span class=\"help-question\">?</span>\n                    <span class=\"help-tooltip\">\n                        <%:OAF is now relatively stable. If the test fails, please disable ad filtering, proxy, acceleration, and other modules. If you are unsure which modules are conflicting, it is recommended to reset the device and then disable the acceleration module in the firewall for testing. If only some Apps are not working, you need to update the App feature library, as the filtering effect is related to the App feature library.%>\n                    </span>\n                </span>\n            </div>\n            \n            <div style=\"display: flex; align-items: baseline; margin-bottom: 4px; font-size: 14px; line-height: 1.4;\">\n                <label class=\"config-label\" style=\"line-height: 1.4;\"><%:Filter Status%>:</label>\n                <span id=\"run_status\" style=\"font-weight: 600; margin-right: 6px; font-size: 14px; line-height: 1.4;\"><%:Running%></span>\n                <span id=\"run_desc\" style=\"opacity: 0.6; font-size: 13px; line-height: 1.4;\"></span>\n            </div>\n            \n            <!-- HNAT 加速模块提示 -->\n            <div id=\"hnatWarning\" style=\"display: none; margin-top: 12px; margin-bottom: 12px; padding: 12px 16px; border-radius: 6px; background-color: #fff3cd; border-left: 3px solid #ffc107;\">\n                <span style=\"color: #856404; font-size: 13px; line-height: 1.6;\"><%:Current hardware acceleration module is not disabled, which may affect filtering functionality. For better filtering results, please disable the acceleration module in Advanced Settings.%></span>\n            </div>\n            \n            <!-- Mode 2 当前上网时长信息显示 -->\n            <div id=\"mode2TimeUsageInfo\" style=\"margin-top: 16px; border: 1px solid #1a73e8; border-radius: 5px; padding: 15px; margin-bottom: 15px; display: none;\">\n                <div style=\"font-weight: 600; margin-bottom: 10px; font-size: 14px; display: flex; align-items: center; justify-content: space-between;\">\n                    <div style=\"display: flex; align-items: center; font-weight: bold; color: #1a73e8;\">\n                        <span style=\"margin-right: 8px;\">⏱</span> <%:Today Time Usage%>\n                    </div>\n                    <button type=\"button\" class=\"clear-time-btn\" onclick=\"clearActiveTime()\"><%:Clear%></button>\n                </div>\n                <div id=\"mode2TimeUsageContent\" style=\"font-size: 13px; line-height: 1.8;\">\n                    <!-- 内容将通过JavaScript填充 -->\n                </div>\n            </div>\n        </div>\n\n        <!-- Basic Settings Module -->\n        <div class=\"config-module\">\n            <div class=\"module-header expanded\" onclick=\"toggleModule(this)\">\n                <span class=\"arrow\"></span>\n                <span class=\"module-title\"><%:Basic Settings%></span>\n            </div>\n            <div class=\"module-content expanded\">\n                <div class=\"config-row\">\n                    <div style=\"display: flex; align-items: center; margin-right: 24px;\">\n                        <label for=\"filterSwitch\" class=\"config-label\" style=\"cursor: pointer;\"><%:App Filter%></label>\n                        <label class=\"switch\">\n                            <input type=\"checkbox\" id=\"filterSwitch\" name=\"filterSwitch\" />\n                            <span class=\"slider\"></span>\n                        </label>\n                    </div>\n                    \n                    <div style=\"display: flex; align-items: center;\">\n                        <label for=\"recordSwitch\" class=\"config-label\" style=\"cursor: pointer;\"><%:App Record%></label>\n                        <label class=\"switch\">\n                            <input type=\"checkbox\" id=\"recordSwitch\" name=\"recordSwitch\" />\n                            <span class=\"slider\"></span>\n                        </label>\n                    </div>\n                </div>\n\n                <div class=\"config-row\">\n                    <label for=\"workMode\" class=\"config-label\"><%:Work Mode%>:</label>\n                    <select id=\"workMode\" name=\"workMode\" onchange=\"updateBypassModeHint()\" style=\"min-width: 160px; padding: 6px 10px; border-radius: 4px; border: 1px solid #dadce0;\">\n                        <option value=\"0\"><%:Gateway Mode%></option>\n                        <option value=\"1\"><%:Bypass Mode%></option>\n                    </select>\n                </div>\n                \n                <div id=\"bypassModeHint\" class=\"desc\" style=\"display: none; margin-top: 0; margin-bottom: 20px;\">\n                    <span><%:In bypass mode, down rate cannot be measured, because data is directly forwarded from the gateway to the terminal.%></span>\n                </div>\n\n                <div class=\"config-row\" style=\"margin-bottom: 0;\">\n                    <div style=\"display: flex; align-items: center; margin-right: 24px;\">\n                        <label class=\"config-label\"><%:Effective Time%>:</label>\n                        <button type=\"button\" class=\"button-check\" onclick=\"showTimeDialog()\"><%:View%></button>\n                    </div>\n\n                    <div style=\"display: flex; align-items: center;\">\n                        <label class=\"config-label\"><%:Effective User%>:</label>\n                        <button type=\"button\" class=\"button-check\" onclick=\"showUserDialog()\"><%:View%></button>\n                    </div>\n                </div>\n            </div>\n        </div>\n\n        <!-- Filter Rules Module -->\n        <div class=\"config-module\">\n            <div class=\"module-header expanded\" onclick=\"toggleModule(this)\">\n                <span class=\"arrow\"></span>\n                <span class=\"module-title\"><%:Filter Rules%></span>\n            </div>\n            <div class=\"module-content expanded\">\n                <div class=\"config-row\">\n                    <label class=\"config-label\"><%:Filter Mode%>:</label>\n                    <div class=\"filter-mode-group\">\n                        <label class=\"filter-mode-option\">\n                            <input type=\"radio\" name=\"appFilterMode\" value=\"0\" id=\"appFilterModeSpecific\" checked onchange=\"switchAppFilterMode(0)\">\n                            <span><%:Specified Apps%></span>\n                        </label>\n                        <label class=\"filter-mode-option\">\n                            <input type=\"radio\" name=\"appFilterMode\" value=\"1\" id=\"appFilterModeAll\" onchange=\"switchAppFilterMode(1)\">\n                            <span><%:All Apps%></span>\n                        </label>\n                    </div>\n                </div>\n\n                <div id=\"allAppsWarning\" style=\"display: none; margin-top: 10px; margin-bottom: 20px; padding: 12px 16px; border-radius: 6px; border-left: 3px solid #ea4335;\">\n                    <span style=\"color: #ea4335; font-size: 13px; font-weight: 500;\"><%:In this mode, after the rule takes effect, all apps will be unable to connect to the network, similar to scheduled internet disconnection%></span>\n                </div>\n\n                <div id=\"specificAppsSection\">\n                    <div class=\"config-row\">\n                        <label for=\"quicProtocol\" class=\"config-label\"><%:Filter the QUIC protocol%>:</label>\n                        <select id=\"quicProtocol\" name=\"quicProtocol\" style=\"min-width: 120px; padding: 6px 10px; border-radius: 4px; border: 1px solid #dadce0;\">\n                            <option value=\"0\"><%:Disable%></option>\n                            <option value=\"1\"><%:Enable%></option>\n                        </select>\n                    </div>\n\n                    <div class=\"desc\" style=\"margin-top: 0; margin-bottom: 20px;\">\n                        <span><%:Some Apps use encrypted QUIC protocol, which cannot be distinguished for filtering, Such as Youtube, Instagram, etc. For better filtering results, you can try disabling the QUIC protocol.%></span>\n                    </div>\n\n                    <div style=\"margin-bottom: 15px; border-bottom: 1px solid #f0f0f0; padding-bottom: 10px;\">\n                        <span style=\"font-size: 15px; font-weight: 600;\"><%:App Selection%></span>\n                        <span style=\"font-size: 13px; opacity: 0.6; margin-left: 8px;\">(<%:Selected %> <span id=\"totalSelectedCount\" style=\"color: #1a73e8; font-weight: 600;\">0</span> <%:items%>)</span>\n                    </div>\n                    \n                    <div style=\"margin-bottom: 20px;\">\n                        <span style=\"font-size: 13px; opacity: 0.6; padding: 6px 10px; border-radius: 4px;\"><%:If the App you want is not in the list, you can upgrade the feature library of the official website or customize the App%></span>\n                    </div>\n                    \n                    <div id=\"appContainer\"></div>\n                </div>\n            </div>\n        </div>\n\n        <div style=\"margin-top: 20px; display: flex; justify-content: flex-end; gap: 10px;\">\n            <button type=\"button\" class=\"submit-button\" onclick=\"location.reload()\" style=\"background: transparent; color: #1a73e8; border: 1px solid var(--border-color-medium, #d1d5db);\"><%:Refresh%></button>\n            <button type=\"button\" class=\"submit-button\" onclick=\"submitHandle()\"><%:Save%></button>\n        </div>\n    </div>\n</div>\n\n<!-- Time View Dialog -->\n<div id=\"timeDialog\" class=\"view-dialog\">\n    <div class=\"view-dialog-content\" style=\"width: 600px; max-height: 80%;\">\n        <div class=\"view-dialog-header\">\n            <div class=\"view-dialog-title\"><%:Time Configuration%></div>\n            <span class=\"view-dialog-close\" onclick=\"closeTimeDialog()\">&times;</span>\n        </div>\n        <div class=\"view-dialog-body\" id=\"timeDialogContent\"></div>\n    </div>\n</div>\n\n<!-- User View Dialog -->\n<div id=\"userDialog\" class=\"view-dialog\">\n    <div class=\"view-dialog-content\" style=\"width: 800px; max-height: 80%;\">\n        <div class=\"view-dialog-header\">\n            <div class=\"view-dialog-title\"><%:Effective Users%></div>\n            <span class=\"view-dialog-close\" onclick=\"closeUserDialog()\">&times;</span>\n        </div>\n        <div class=\"view-dialog-body\" id=\"userDialogContent\"></div>\n    </div>\n</div>\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/view/admin_network/dev_status.htm",
    "content": "<link rel=\"stylesheet\" href=\"<%=resource%>/css/common.css\">\n<style type=\"text/css\">\n    <% local dsp=require \"luci.dispatcher\"\n\n    -%>#display {\n        display: flex;\n        flex-direction: row;\n        flex-wrap: wrap;\n        padding: 20px;\n    }\n\n    #main {\n        min-width: 600px;\n        height: 300px;\n        display: inline-block;\n        flex: 2 2 10%;\n    }\n\n    #main2 {\n        min-width: 600px;\n        height: 300px;\n        display: inline-block;\n        flex: 2 2 10%;\n    }\n\n    table.imagetable {\n        font-family: verdana, arial, sans-serif;\n        font-size: 11px;\n        color: #333333;\n        border-width: 1px;\n        border-color: #999999;\n        border-collapse: collapse;\n        padding-top: 10px;\n    }\n\n    < !-- table.imagetable th {\n        background: #f5f5f5 border-width: 0px;\n        padding: 5px;\n        border-style: solid;\n        border-color: #999999;\n    }\n\n    table.imagetable td {\n        background: #ffffffff border-width: 0px;\n        padding: 5px;\n        border-style: solid;\n        border-color: #999999;\n    }\n\n    -->\n</style>\n\n\n\n<script type=\"text/javascript\" src=\"<%=resource%>/echarts.min.js?v=5.0\"></script>\n\n<script type=\"text/javascript\">//<![CDATA[\n    window.onload = function () {\n\n    }\n    var app_class_data;\n    var app_time_data;\n    var mac = '<%=self.mac%>';\n    function get_display_time(total_time) {\n        var hour = parseInt(total_time / 3600);\n        var seconds = total_time % 3600;\n        var min = parseInt(seconds / 60)\n        var seconds2 = seconds % 60;\n        var total_time_str;\n\n        if (hour > 0)\n            total_time_str = hour + \"<%:h%>\" + min + \"<%:m%>\"\n        else {\n            if (min == 0 && seconds2 != 0)\n                min = 1;\n            total_time_str = min + \"<%:m%>\"\n        }\n        return total_time_str;\n    }\n\n    function display_app_visit_view(data) {\n        var myChart = echarts.init(document.getElementById('main2'));\n        var dev_array = new Array();\n        var m2R2Data = new Array()\n        var total_time = 0\n        for (var i = 0; i < data.length; i++) {\n            var dev_obj = data[i];\n            var m2_obj = {};\n            m2_obj.value = dev_obj.visit_time;\n            m2_obj.legendname = dev_obj.app_id;\n\n            var tmp_time = get_display_time(dev_obj.visit_time);\n\n            m2_obj.name = dev_obj.app_id + \"  \" + tmp_time;\n            total_time += dev_obj.visit_time\n            m2R2Data.push(m2_obj);\n        }\n\n        var total_time_str = get_display_time(total_time);\n        option = {\n            title: [\n                {\n                    text: \"<%:App Time Statistics%>\",\n                    textStyle: {\n                        fontSize: 16,\n                        color: \"black\"\n                    },\n                    left: \"2%\"\n                },\n                {\n                    text: '',\n                    subtext: total_time_str,\n                    textStyle: {\n                        fontSize: 15,\n                        color: \"black\"\n                    },\n                    subtextStyle: {\n                        fontSize: 15,\n                        color: 'black'\n                    },\n                    textAlign: \"center\",\n                    x: '34.5%',\n                    y: '44%',\n                }],\n            tooltip: {\n                trigger: 'item',\n                formatter: function (parms) {\n                    var total_time = get_display_time(parms.data.value);\n                    var str = parms.seriesName + \"</br>\" +\n                        parms.marker + \"\" + parms.data.legendname + \"</br>\" +\n                        \"<%:Visit Time%>: \" + total_time + \"</br>\" +\n                        \"<%:Percentage%>: \" + parms.percent + \"%\";\n                    return str;\n                }\n            },\n            legend: {\n                type: \"scroll\",\n                orient: 'vertical',\n                left: '70%',\n                align: 'left',\n                top: 'middle',\n                textStyle: {\n                    color: '#8C8C8C'\n                },\n                height: 250\n            },\n            series: [\n                {\n                    name: \"<%:Visit Time%>\",\n                    type: 'pie',\n                    center: ['35%', '50%'],\n                    radius: ['58%', '70%'],\n                    clockwise: false,\n                    avoidLabelOverlap: false,\n                    itemStyle: {\n                        borderRadius: 2,\n                        borderColor: \"#fff\",\n                        borderWidth: 1,\n                    },\n\n                    label: {\n                        normal: {\n                            show: true,\n                            position: 'outter',\n                            formatter: function (parms) {\n                                return parms.data.legendname\n                            }\n                        }\n                    },\n                    labelLine: {\n                        normal: {\n                            length: 8,\n                            length2: 7,\n                            smooth: true,\n                        }\n                    },\n                    data: m2R2Data\n                }\n            ]\n        };\n        myChart.setOption(option);\n    }\n\n    function display_app_class_view(data) {\n        console.log(\"begin display.\");\n        var myChart = echarts.init(document.getElementById('main'));\n        var dev_array = new Array();\n        var m2R2Data = new Array()\n        var total_time = 0\n        for (var i = 0; i < data.length; i++) {\n            var dev_obj = data[i];\n            if (dev_obj.visit_time == 0)\n                continue;\n\n            var m2_obj = {};\n            m2_obj.value = dev_obj.visit_time;\n            m2_obj.legendname = dev_obj.name;\n\n            var tmp_time = get_display_time(dev_obj.visit_time);\n\n            m2_obj.name = dev_obj.name + \"  \" + tmp_time;\n            total_time += dev_obj.visit_time\n            m2R2Data.push(m2_obj);\n        }\n\n        var total_time_str = get_display_time(total_time);\n\n        option = {\n            title: [\n                {\n                    text: \"<%:App classification time statistics%>\",\n                    textStyle: {\n                        fontSize: 16,\n                        color: \"black\"\n                    },\n                    left: \"2%\"\n                },\n                {\n                    text: '',\n                    subtext: total_time_str,\n                    textStyle: {\n                        fontSize: 15,\n                        color: \"black\"\n                    },\n                    subtextStyle: {\n                        fontSize: 15,\n                        color: 'black'\n                    },\n                    textAlign: \"center\",\n                    x: '34.5%',\n                    y: '44%',\n                }],\n            tooltip: {\n                trigger: 'item',\n                formatter: function (parms) {\n                    var total_time = get_display_time(parms.data.value);\n                    var str = parms.seriesName + \"</br>\" +\n                        parms.marker + \"\" + parms.data.legendname + \"</br>\" + \"<%:Visit Time%>: \" + total_time + \"</br>\" +\n                        \"<%:Percentage%>: \" + parms.percent + \"%\";\n                    return str;\n                }\n            },\n            legend: {\n                type: \"scroll\",\n                orient: 'vertical',\n                left: '70%',\n                align: 'left',\n                top: 'middle',\n                textStyle: {\n                    color: '#8C8C8C'\n                },\n                height: 250\n            },\n            series: [\n                {\n                    name: \"<%:Visit Time%>\",\n                    type: 'pie',\n                    center: ['35%', '50%'],\n                    radius: ['58%', '70%'],\n                    clockwise: false,\n                    avoidLabelOverlap: false,\n                    itemStyle: {\n                        borderRadius: 2,\n                        borderColor: \"#fff\",\n                        borderWidth: 1,\n                    },\n                    label: {\n                        normal: {\n                            show: true,\n                            position: 'outter',\n                            formatter: function (parms) {\n                                return parms.data.legendname\n                            }\n                        }\n                    },\n                    labelLine: {\n                        normal: {\n                            length: 8,\n                            length2: 7,\n                            smooth: true,\n                        }\n                    },\n                    data: m2R2Data\n                }\n            ]\n        };\n        myChart.setOption(option);\n    }\n    new XHR().get('<%=url('admin/network/app_class_visit_time')%>/' + mac, null,\n        function (x, st) {\n            display_app_class_view(st);\n        }\n    );\n\n    new XHR().get('<%=url('admin/network/dev_visit_time')%>/' + mac, null,\n        function (x, st) {\n            display_app_visit_view(st);\n        }\n    );\n\n\n    new XHR().get('<%=url('admin/network/dev_visit_list')%>/' + mac, null,\n        function (x, st) {\n            var tb = document.getElementById('user_status_table');\n            var str = JSON.stringify(st);\n            if (st && tb) {\n                /* clear all rows */\n                while (tb.rows.length > 1)\n                    tb.deleteRow(1);\n                for (var i = 0; i < st.length; i++) {\n                    var action_status = \"\"\n                    if (st[i].latest_action == 1)\n                        action_status = \"<%:Filtered%>\"\n                    else\n                        action_status = \"<%:Unfiltered%>\"\n                    var hostname = \"\"\n                    if (st[i].hostname == \"\" || st[i].hostname == \"*\") {\n                        hostname = \"--\";\n                    }\n                    else {\n                        hostname = st[i].hostname;\n                    }\n                    var tr = tb.insertRow(-1);\n                    tr.className = 'tr cbi-rowstyle-' + ((i % 2) + 1);\n                    tr.insertCell(-1).innerHTML = st[i].appname;\n                    tr.insertCell(-1).innerHTML = hostname;\n                    tr.insertCell(-1).innerHTML = st[i].mac;\n                    tr.insertCell(-1).innerHTML = st[i].first_time;\n                    var hour = parseInt(st[i].total_time / 3600);\n                    var seconds = st[i].total_time % 3600;\n                    var min = parseInt(seconds / 60)\n                    var total_time_str;\n                    if (st[i].latest_action == 1)\n                        total_time_str = \"-\"\n                    else {\n                        if (hour > 0)\n                            total_time_str = hour + \"<%:h%>\" + min + \"<%:m%>\"\n                        else {\n                            if (min == 0)\n                                min = 1;\n                            total_time_str = min + \"<%:m%>\"\n                        }\n                    }\n\n                    tr.insertCell(-1).innerHTML = total_time_str;\n                    tr.insertCell(-1).innerHTML = action_status;\n                    var childs = tr.childNodes;\n                    Array.prototype.forEach.call(childs, function (child) {\n                        child.className = 'td';\n\n                    });\n\n                }\n            }\n        }\n    );\n\n//]]></script>\n\n\n<div class=\"cbi-section cbi-tblsection\">\n    <div id=\"display\">\n        <div id=\"main\" class=\"main left\"></div>\n        <div id=\"main2\" class=\"main2 left\"></div>\n    </div>\n    <table class=\"table cbi-section-table\" id=\"user_status_table\">\n        <tr class=\"tr table-titles\">\n            <th class=\"th\">\n                <%:App Name%>\n            </th>\n            <th class=\"th\">\n                <%:Hostname%>\n            </th>\n            <th class=\"th\">\n                <%:Mac%>\n            </th>\n            <th class=\"th\">\n                <%:Start Time%>\n            </th>\n            <th class=\"th\">\n                <%:Visit Time%>\n            </th>\n            <th class=\"th\">\n                <%:Filter Status%>\n            </th>\n        </tr>\n        <tr class=\"tr table-titles\">\n            <td class=\"td\" colspan=\"8\"><em><br />\n                    <%:Collecting data...%>\n                </em></td>\n        </tr>\n    </table>\n\n</div>"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/view/admin_network/feature.htm",
    "content": "<link rel=\"stylesheet\" href=\"<%=resource%>/css/common.css\">\n\n<div class=\"feature-container\">\n\t<!-- 基本信息卡片 -->\n\t<div id=\"feature-info\" class=\"feature-info-card\">\n\t\t\t<div class=\"feature-info-grid\">\n\t\t\t\t<div class=\"feature-info-item\">\n\t\t\t\t\t<span class=\"feature-info-label\"><%:Current version%></span>\n\t\t\t\t\t<span class=\"feature-info-value\" id=\"info-version\">--</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"feature-info-item\">\n\t\t\t\t\t<span class=\"feature-info-label\"><%:Feature format%></span>\n\t\t\t\t\t<span class=\"feature-info-value\" id=\"info-format\">--</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"feature-info-item\">\n\t\t\t\t\t<span class=\"feature-info-label\"><%:App number%></span>\n\t\t\t\t\t<span class=\"feature-info-value\" id=\"info-appnum\">--</span>\n\t\t\t\t</div>\n\t\t\t\t<div class=\"feature-info-item\">\n\t\t\t\t\t<span class=\"feature-info-label\"><%:Feature download%></span>\n\t\t\t\t\t<span class=\"feature-info-value\"><a href=\"https://www.openappfilter.com\" target=\"_blank\">www.openappfilter.com</a></span>\n\t\t\t\t</div>\n\t\t\t</div>\n\n\n\t\t<div class=\"feature-card\">\n\t\t\t<div class=\"feature-row\">\n\t\t\t\t<label class=\"feature-label\" for=\"ulfile\"><%:Feature Upgrade%>:</label>\n\t\t\t\t<div class=\"feature-inputs\">\n\t\t\t\t\t<input class=\"cbi-input-file feature-file\" type=\"file\" id=\"ulfile\" name=\"ulfile\" />\n\t\t\t\t\t<input type=\"submit\" class=\"cbi-button cbi-input-apply feature-btn\" name=\"upload\" value=\"<%:Upload%>\" onclick=\"startUpgradeStatusPoll(); return true;\"/>\n\t\t\t\t</div>\n\t\t\t</div>\n\t\t\t<div class=\"feature-hint\" id=\"upload-hint\">\n\t\t\t\t<%:You can download the App feature library from the website(www.openappfilter.com),then upload it here.Please note that after downloading, you need to extract the files and select the one in .bin format.%>\n\t\t\t</div>\n\t\t\t<div class=\"feature-status\" id=\"upgrade-status\" style=\"display:none;\"></div>\n\t\t</div>\n\n\t<div class=\"feature-card\" style=\"margin-top: 16px;\">\n\t\t<div class=\"feature-row\" style=\"margin-bottom: 8px;\">\n\t\t\t<label class=\"feature-label\"><%:App List%>:</label>\n\t\t</div>\n\t\t<div id=\"app-list\" class=\"app-list\"></div>\n\t</div>\n\n\t<div style=\"margin-top: 20px; display: flex; justify-content: flex-end;\">\n\t\t<button type=\"button\" class=\"submit-button\" onclick=\"location.reload()\" style=\"padding: 8px 20px; width: 150px; background: transparent; color: #1a73e8; border: 1px solid var(--border-color-medium, #d1d5db); border-radius: 4px; cursor: pointer; font-size: 13px; font-weight: 500; display: inline-flex; align-items: center; justify-content: center; line-height: 1.4;\"><%:Refresh%></button>\n\t</div>\n</div>\n\n<div id=\"modal\" class=\"feature-modal\">\n\t<div class=\"feature-modal-content\">\n\t\t<p><%:Updating, please wait...%></p>\n\t</div>\n</div>\n\n<style>\n/* 让顶部描述和下方内容左侧对齐 */\n.cbi-map-descr {\n    margin: 0 10px 10px 10px;\n    font-size: 13px;\n    line-height: 1.6;\n}\n\n.feature-container { padding: 10px; }\n.feature-info-card{padding:16px;border:1px solid var(--border-color-low, #e5e7eb);border-radius:8px;background:var(--background-color-high, #ffffff);margin-bottom:12px;}\n.feature-info-grid{display:grid;grid-template-columns:repeat(auto-fit,minmax(180px,1fr));gap:12px;}\n.feature-info-item{padding:10px 12px;border:1px solid var(--border-color-low, #e5e7eb);border-radius:6px;background:var(--background-color-low, #f5f5f5);}\n.feature-info-label{display:block;font-size:13px;color:var(--text-color-medium, #6b7280);margin-bottom:4px;}\n.feature-info-value{font-weight:600;font-size:15px;color:var(--text-color-high, #333);}\n.feature-card {background: var(--background-color-high, #ffffff);border: 1px solid var(--border-color-low, #e5e7eb);border-radius: 8px;padding: 16px;margin-top: 12px;}\n.feature-row {display: flex;align-items: center;gap: 12px;flex-wrap: wrap;}\n.feature-label {min-width: 120px;font-weight: 600;}\n.feature-inputs {display: flex;align-items: center;gap: 10px;flex: 1;}\n.feature-file {width: 100%;max-width: 360px;}\n.feature-btn {min-width: 110px;}\n.feature-hint {margin-top: 10px;color: var(--text-color-medium, #6b7280);font-size: 13px;line-height: 1.5;}\n.feature-status {margin-top: 8px;font-size: 14px;font-weight: 600;}\n.feature-status.success {color: #34d399;}\n.feature-status.error {color: #f87171;}\n.feature-modal {display: none;position: fixed;top: 0; left: 0; right: 0; bottom: 0;background-color: rgba(0, 0, 0, 0.5);z-index: 1000;justify-content: center;align-items: center;}\n.feature-modal-content {background: var(--background-color-high, #ffffff);padding: 16px 20px;border-radius: 6px;color: var(--text-color-high, #333);min-width: 200px;text-align: center;box-shadow: 0 4px 12px rgba(0,0,0,0.4);border: 1px solid var(--border-color-low, #e5e7eb);}\n.app-list {margin-top: 10px;}\n.class-card {margin-bottom: 16px;border:1px solid var(--border-color-low, #e5e7eb);border-radius:8px;background:var(--background-color-high, #ffffff);}\n.class-header {padding:12px 16px;font-weight:600;font-size:15px;border-bottom:1px solid var(--border-color-low, #e5e7eb);color:var(--text-color-high, #333);}\n.app-items {display:grid;grid-template-columns:repeat(4,1fr);gap:10px;padding:12px 16px;}\n.app-item {display:flex;align-items:center;gap:8px;padding:8px 12px;border:1px solid var(--border-color-medium, #d1d5db);border-radius:6px;background:var(--background-color-low, #f5f5f5);font-size:13px;cursor:default;transition:all 0.2s ease;}\n.app-item:hover {background:var(--background-color-medium, #eeeeee);border-color:var(--border-color-high, #9ca3af);transform:translateY(-1px);}\n.app-item img {width:20px;height:20px;object-fit:contain;border-radius:4px;}\n.app-item span {color:var(--text-color-medium, #6b7280);white-space:nowrap;overflow:hidden;text-overflow:ellipsis;max-width:100px;}\n@media (min-width: 800px) {\n\t.app-items {grid-template-columns:repeat(6,1fr);}\n}\n@media (min-width: 1200px) {\n\t.app-items {grid-template-columns:repeat(8,1fr);}\n}\n</style>\n\n<script>\n\tvar pollTimer = null;\n\tvar pollTimeout = null;\n\tvar classListLoaded = false;\n\n\t// Helper functions\n\tfunction $(selector) {\n\t\treturn document.querySelector(selector);\n\t}\n\n\tfunction $$(selector) {\n\t\treturn document.querySelectorAll(selector);\n\t}\n\n\tfunction showModal() {\n\t\tvar modal = $('#modal');\n\t\tif (modal) {\n\t\t\tmodal.style.display = 'flex';\n\t\t\tsetTimeout(function() {\n\t\t\t\tmodal.style.display = 'none';\n\t\t\t}, 15000);\n\t\t}\n\t}\n\n\tfunction hideModal() {\n\t\tvar modal = $('#modal');\n\t\tif (modal) {\n\t\t\tmodal.style.display = 'none';\n\t\t}\n\t}\n\n\tfunction showToast(msg, type) {\n\t\tvar hint = $('#upload-hint');\n\t\tif (!hint) return;\n\t\thint.textContent = msg || '';\n\t\thint.classList.remove('text-error', 'text-success');\n\t\tif (type === 'error') {\n\t\t\thint.classList.add('text-error');\n\t\t} else if (type === 'success') {\n\t\t\thint.classList.add('text-success');\n\t\t}\n\t}\n\n\tfunction stopPoll() {\n\t\tif (pollTimer) {\n\t\t\tclearInterval(pollTimer);\n\t\t\tpollTimer = null;\n\t\t}\n\t\tif (pollTimeout) {\n\t\t\tclearTimeout(pollTimeout);\n\t\t\tpollTimeout = null;\n\t\t}\n\t}\n\n\tfunction statusMessage(status) {\n\t\tif (status === 200) return '<%:Update the feature file successfully%>';\n\t\tif (status === 401) return '<%:Failed to update feature file, format error%>';\n\t\tif (status === 402) return '<%:Failed to update feature file%> (<%:File too large%>)';\n\t\tif (status === 1) return '<%:Updating, please wait...%>';\n\t\treturn '<%:Failed to update feature file%>';\n\t}\n\n\tfunction renderUpgradeStatus(status) {\n\t\tvar box = $('#upgrade-status');\n\t\tif (!box) return;\n\t\t\n\t\tif (!status || status === 0) {\n\t\t\tbox.style.display = 'none';\n\t\t\tbox.textContent = '';\n\t\t\tbox.classList.remove('success', 'error');\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tvar msg = statusMessage(status);\n\t\tbox.textContent = msg;\n\t\tbox.style.display = '';\n\t\tbox.classList.remove('success', 'error');\n\t\tif (status === 200) {\n\t\t\tbox.classList.add('success');\n\t\t} else {\n\t\t\tbox.classList.add('error');\n\t\t}\n\t}\n\n\tfunction fetchUpgradeStatusOnce() {\n\t\tfetch('<%=url(\"admin/appfilter/feature/upgrade_status\")%>')\n\t\t\t.then(function(response) {\n\t\t\t\treturn response.json();\n\t\t\t})\n\t\t\t.then(function(resp) {\n\t\t\t\tvar status = (resp && resp.status) ? resp.status : 0;\n\t\t\t\trenderUpgradeStatus(status);\n\t\t\t})\n\t\t\t.catch(function(error) {\n\t\t\t\tconsole.error('Failed to fetch upgrade status:', error);\n\t\t\t});\n\t}\n\n\tfunction startUpgradeStatusPoll() {\n\t\tshowModal();\n\t\tpollTimeout = setTimeout(function() {\n\t\t\tstopPoll();\n\t\t\thideModal();\n\t\t}, 60000);\n\t}\n\n\tfunction loadFeatureInfo() {\n\t\tnew XHR().get('<%=url(\"admin/appfilter/feature/info\")%>', null, function(x, data) {\n\t\t\tif (data && data.code === 0 && data.data) {\n\t\t\t\tvar versionEl = $('#info-version');\n\t\t\t\tvar formatEl = $('#info-format');\n\t\t\t\tvar appnumEl = $('#info-appnum');\n\t\t\t\tif (versionEl) versionEl.textContent = data.data.version || '--';\n\t\t\t\tif (formatEl) formatEl.textContent = data.data.format || '--';\n\t\t\t\tif (appnumEl) appnumEl.textContent = data.data.app_count || 0;\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction loadClassList() {\n\t\tfetch('<%=url(\"admin/network/class_list\")%>')\n\t\t\t.then(function(response) {\n\t\t\t\treturn response.json();\n\t\t\t})\n\t\t\t.then(function(data) {\n\t\t\t\tvar list = [];\n\t\t\t\tif (data && data.class_list) {\n\t\t\t\t\tlist = data.class_list;\n\t\t\t\t} else if (data && data.data && Array.isArray(data.data)) {\n\t\t\t\t\tlist = data.data;\n\t\t\t\t} else if (data && data.classes && Array.isArray(data.classes)) {\n\t\t\t\t\tlist = data.classes;\n\t\t\t\t}\n\t\t\t\trenderClassList(list);\n\t\t\t\tclassListLoaded = true;\n\t\t\t})\n\t\t\t.catch(function(error) {\n\t\t\t\tconsole.error('Failed to load class list:', error);\n\t\t\t\tvar appList = $('#app-list');\n\t\t\t\tif (appList) {\n\t\t\t\t\tappList.innerHTML = '<div class=\"feature-hint\"><%:Failed to load app list%></div>';\n\t\t\t\t}\n\t\t\t});\n\t}\n\n\tfunction updateAppItemsColumns() {\n\t\tvar container = $('.feature-container');\n\t\tvar containerWidth = container ? container.offsetWidth : window.innerWidth;\n\t\tvar appItems = $$('.app-items');\n\n\t\tvar cols = 4;\n\t\tif (containerWidth >= 1200) {\n\t\t\tcols = 8;\n\t\t} else if (containerWidth >= 800) {\n\t\t\tcols = 6;\n\t\t}\n\n\t\tappItems.forEach(function(item) {\n\t\t\titem.style.gridTemplateColumns = 'repeat(' + cols + ', 1fr)';\n\t\t});\n\t}\n\n\tfunction renderClassList(list) {\n\t\tvar container = $('#app-list');\n\t\tif (!container) return;\n\t\t\n\t\tcontainer.innerHTML = '';\n\t\t\n\t\tif (!list || list.length === 0) {\n\t\t\tvar noDataDiv = document.createElement('div');\n\t\t\tnoDataDiv.className = 'feature-hint';\n\t\t\tnoDataDiv.textContent = '<%:No data%>';\n\t\t\tcontainer.appendChild(noDataDiv);\n\t\t\treturn;\n\t\t}\n\t\t\n\t\tlist.forEach(function(category) {\n\t\t\tvar appList = category.app_list || [];\n\t\t\tvar card = document.createElement('div');\n\t\t\tcard.className = 'class-card';\n\t\t\t\n\t\t\tvar categoryName = category.name || ('Class ' + (category.id || ''));\n\t\t\tvar appCount = appList.length;\n\t\t\t\n\t\t\tvar header = document.createElement('div');\n\t\t\theader.className = 'class-header';\n\t\t\theader.textContent = categoryName + ' (' + appCount + ')';\n\t\t\tcard.appendChild(header);\n\t\t\t\n\t\t\tvar apps = document.createElement('div');\n\t\t\tapps.className = 'app-items';\n\t\t\t\n\t\t\tif (appList.length === 0) {\n\t\t\t\tvar noAppsDiv = document.createElement('div');\n\t\t\t\tnoAppsDiv.className = 'feature-hint';\n\t\t\t\tnoAppsDiv.textContent = '<%:No apps%>';\n\t\t\t\tapps.appendChild(noAppsDiv);\n\t\t\t} else {\n\t\t\t\tappList.forEach(function(app) {\n\t\t\t\t\tvar parts = app.split(',');\n\t\t\t\t\tvar appId = parts[0] || '';\n\t\t\t\t\tvar appName = parts[1] || 'Unknown';\n\t\t\t\t\tvar hasIcon = parts[2] === '1';\n\t\t\t\t\t\n\t\t\t\t\tvar appItem = document.createElement('div');\n\t\t\t\t\tappItem.className = 'app-item';\n\t\t\t\t\t\n\t\t\t\t\tvar iconSrc = hasIcon ? '<%=resource%>/app_icons/' + appId + '.png' : '<%=resource%>/app_icons/default.png';\n\t\t\t\t\tvar icon = document.createElement('img');\n\t\t\t\t\ticon.src = iconSrc;\n\t\t\t\t\ticon.alt = appName;\n\t\t\t\t\ticon.onerror = function() {\n\t\t\t\t\t\tthis.src = '<%=resource%>/app_icons/default.png';\n\t\t\t\t\t};\n\t\t\t\t\t\n\t\t\t\t\tvar name = document.createElement('span');\n\t\t\t\t\tname.textContent = appName;\n\t\t\t\t\t\n\t\t\t\t\tappItem.appendChild(icon);\n\t\t\t\t\tappItem.appendChild(name);\n\t\t\t\t\tapps.appendChild(appItem);\n\t\t\t\t});\n\t\t\t}\n\t\t\t\n\t\t\tcard.appendChild(apps);\n\t\t\tcontainer.appendChild(card);\n\t\t});\n\t\t\n\t\tsetTimeout(function() {\n\t\t\tupdateAppItemsColumns();\n\t\t}, 100);\n\t}\n\n\tdocument.addEventListener('DOMContentLoaded', function() {\n\t\tfetchUpgradeStatusOnce();\n\t\tloadFeatureInfo();\n\t\tloadClassList();\n\n\t\tvar resizeTimer;\n\t\twindow.addEventListener('resize', function() {\n\t\t\tclearTimeout(resizeTimer);\n\t\t\tresizeTimer = setTimeout(function() {\n\t\t\t\tupdateAppItemsColumns();\n\t\t\t}, 200);\n\t\t});\n\t});\n</script>\n\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/view/admin_network/time.htm",
    "content": "<link rel=\"stylesheet\" href=\"<%=resource%>/css/common.css\">\n<style>\n    /* 页面最小宽度保证手机端正常显示 */\n    .cbi-section.cbi-tblsection {\n        overflow-x: auto;\n    }\n\n    /* 保存按钮样式 - 覆盖 common.css */\n    .submit-button {\n        padding: 8px 20px;\n        width: 150px;\n        height: auto;\n        margin-top: 0;\n        background-color: #1a73e8;\n        color: white;\n        border: none;\n        border-radius: 4px;\n        cursor: pointer;\n        font-size: 13px;\n        font-weight: 500;\n        line-height: 1.4;\n        display: inline-flex;\n        align-items: center;\n        justify-content: center;\n        transition: background-color 0.2s;\n    }\n    .submit-button:hover {\n        background-color: #1557b0;\n    }\n\n    /* 时间进度条样式 */\n    .time-progress-row {\n        display: flex;\n        align-items: center;\n        margin-top: 6px;\n    }\n    .time-progress-label {\n        width: 32px;\n        font-size: 12px;\n        color: #666;\n        opacity: 0.9;\n        flex-shrink: 0;\n        font-weight: 500;\n    }\n    .time-progress-bar {\n        flex: 1;\n        height: 6px;\n        background-color: #d1d5db;\n        border-radius: 3px;\n        overflow: hidden;\n        margin: 0 8px;\n        min-width: 80px;\n        max-width: 220px;\n    }\n    .time-progress-fill {\n        height: 100%;\n        border-radius: 3px;\n        background-color: #1a73e8;\n        transition: width 0.5s ease;\n    }\n    .time-progress-text {\n        font-size: 12px;\n        white-space: nowrap;\n        flex-shrink: 0;\n    }\n\n    /* 清除按钮样式 */\n    .clear-time-btn {\n        padding: 4px 12px;\n        background-color: #ea4335;\n        color: white;\n        border: none;\n        border-radius: 4px;\n        cursor: pointer;\n        font-size: 12px;\n        font-weight: 500;\n        transition: background-color 0.2s;\n    }\n    .clear-time-btn:hover {\n        background-color: #c5221f;\n    }\n\n    .time-rules {\n        margin-top: 20px;\n        border: 1px solid #ddd;\n        padding: 15px;\n        border-radius: 5px;\n        min-width: 600px;\n    }\n    .weekday-selector {\n        margin-bottom: 15px;\n    }\n    .weekday-item {\n        display: inline-block;\n        margin-right: 10px;\n    }\n    .time-table {\n        width: 100%;\n        border-collapse: collapse;\n        margin-top: 10px;\n        table-layout: fixed;\n    }\n    .time-table th, .time-table td {\n        padding: 8px;\n        border: 1px solid #ddd;\n        text-align: center;\n        overflow: visible;\n    }\n    \n    .time-table td {\n        vertical-align: top;\n    }\n    \n    .daily-limit-input-wrapper {\n        display: flex;\n        flex-direction: column;\n        align-items: center;\n    }\n    \n    .daily-limit-input-wrapper input {\n        width: 150px;\n    }\n    \n    .daily-limit-error {\n        color: red;\n        font-size: 11px;\n        margin-top: 2px;\n        display: none;\n        text-align: center;\n        line-height: 1.2;\n    }\n    .time-table th:nth-child(1),\n    .time-table td:nth-child(1) {\n        width: 50%;\n    }\n    .time-table th:nth-child(2),\n    .time-table td:nth-child(2) {\n        width: 20%;\n    }\n    .time-table th:nth-child(3),\n    .time-table td:nth-child(3) {\n        width: 20%;\n    }\n    .time-table th:nth-child(4),\n    .time-table td:nth-child(4) {\n        width: 10%;\n    }\n    .time-table input[type=\"time\"] {\n        width: 100%;\n        max-width: 100%;\n        box-sizing: border-box;\n    }\n    .add-time-btn {\n        margin-top: 10px;\n        padding: 5px 15px;\n        background-color: #2885e8;\n        color: white;\n        border: none;\n        border-radius: 3px;\n        cursor: pointer;\n    }\n    .delete-time-btn {\n        padding: 3px 8px;\n        background-color: #ff4444;\n        color: white;\n        border: none;\n        border-radius: 3px;\n        cursor: pointer;\n    }\n    .whitelist-settings {\n        margin-top: 20px;\n    }\n    .setting-item {\n        margin-bottom: 10px;\n    }\n    .setting-item label {\n        display: inline-block;\n        width: 170px;\n    }\n    .setting-item input {\n        width: 100px;\n        padding: 5px;\n    }\n    .dynamic-time-settings {\n        margin-top: 20px;\n    }\n\n    .advanced-settings {\n        margin-top: 20px;\n        border-top: 1px solid #ddd;\n        padding-top: 15px;\n    }\n    \n    .advanced-toggle {\n        display: flex;\n        align-items: center;\n        cursor: pointer;\n        color: #2885e8;\n        font-size: 14px;\n        margin-bottom: 15px;\n    }\n    \n    .advanced-toggle .arrow {\n        margin-right: 8px;\n        width: 12px;\n        height: 12px;\n        background-image: url('<%=resource%>/icons/arrow.png');\n        background-size: contain;\n        background-repeat: no-repeat;\n        transition: transform 0.3s ease;\n        display: inline-block;\n        transform: rotate(0deg);\n    }\n    \n    .advanced-toggle.expanded .arrow {\n        transform: rotate(90deg);\n    }\n    \n    .advanced-content {\n        display: block;\n    }\n    \n    .advanced-content.expanded {\n        display: block;\n    }\n\n</style>\n\n<script type=\"text/javascript\">//<![CDATA[\n\n        let time_data1 = {\n            \"time_list\":[{\"start\":\"00:00\",\"end\":\"23:59\"}, {\"start\":\"00:00\",\"end\":\"23:59\"}],\n            \"weekday_list\":[1,2,3,4,5,6,0],\n            \"mode\":1\n        }\n        let time_data = {}\n        \n        function formatTime(minutes) {\n            // 如果值为空或undefined，显示0min\n            if (minutes === undefined || minutes === null || minutes === '') {\n                return '0<%:min%>';\n            }\n            var mins = parseInt(minutes);\n            if (isNaN(mins) || mins < 0) {\n                return '0<%:min%>';\n            }\n            // 如果小于60分钟，直接显示分钟\n            if (mins < 60) {\n                return mins + '<%:min%>';\n            }\n            // 大于等于60分钟，转换为小时和分钟\n            var hours = Math.floor(mins / 60);\n            var remainingMins = mins % 60;\n            if (remainingMins === 0) {\n                return hours + '<%:h%>';\n            } else {\n                return hours + '<%:h%> ' + remainingMins + '<%:min%>';\n            }\n        }\n\n        function buildProgressBar(label, used, limit) {\n            if (limit <= 0) return `<div class=\"time-progress-row\"><span class=\"time-progress-label\">${label}</span><span class=\"time-progress-text\" style=\"color:#999;\"><%:Not set%></span></div>`;\n            var pct = Math.min(Math.round((used / limit) * 100), 100);\n            var text = used >= limit ? `<span style=\"color:#d93025;\"><%:Used up%></span> <span style=\"color:#999;\">(<%:Total%>: ${limit} <%:min%>)</span>` : `${used} / ${limit} <%:min%>`;\n            return `<div class=\"time-progress-row\"><span class=\"time-progress-label\">${label}</span><div class=\"time-progress-bar\"><div class=\"time-progress-fill\" style=\"width:${pct}%\"></div></div><span class=\"time-progress-text\">${text}</span></div>`;\n        }\n\n\t\tfunction init_data() {\n            getAppFilterTimeData().then(() => {\n                renderTimeData();\n            });\n\t\t}\n\n\t\tfunction getAppFilterTimeData() {\n\t\t\treturn new Promise((resolve, reject) => {\n\t\t\t\tnew XHR().get('<%=url('admin/network/get_app_filter_time')%>', null,\n\t\t\t\t\tfunction (x, data) {\n\t\t\t\t\t\ttime_data = data.data;\n                        console.log(data.data);\n                        \n                        // Display current time\n                        if (data.data.current_time) {\n                            const currentTimeDisplay = document.getElementById('currentTimeDisplay');\n                            const currentTimeValue = document.getElementById('currentTimeValue');\n                            if (currentTimeDisplay && currentTimeValue) {\n                                currentTimeValue.textContent = data.data.current_time;\n                                currentTimeDisplay.style.display = 'block';\n                            }\n                        }\n                        \n\t\t\t\t\t\tresolve(); \n\t\t\t\t\t}\n\t\t\t\t);\n\t\t\t});\n\t\t}\n\n\n\t\tfunction submitHandle() {\n\t\t\tconst time_data = getTimeFormData();\n\t\t\tconst maxEntries = 64;\n\t\t\tconst mode = document.getElementById('timeMode').value;\n\n\t\t\tif (mode === \"0\") {\n\t\t\t\tif (!time_data.time_list || time_data.time_list.length === 0) {\n\t\t\t\t\tconst errorContainer = document.getElementById('errorContainer');\n\t\t\t\t\terrorContainer.innerHTML = '<%:Please add at least one time period%>';\n\t\t\t\t\treturn;\n\t\t\t\t}\n\n\t\t\t\tif (time_data.time_list.length > maxEntries) {\n\t\t\t\t\tconst errorContainer = document.getElementById('errorContainer');\n\t\t\t\t\terrorContainer.innerHTML = '<%:Time periods cannot exceed 64 entries%>';\n\t\t\t\t\treturn; \n\t\t\t\t}\n\n\t\t\t\t// Check each time period has at least one weekday selected\n\t\t\t\tfor (let i = 0; i < time_data.time_list.length; i++) {\n\t\t\t\t\tif (!time_data.time_list[i].weekday_list || time_data.time_list[i].weekday_list.length === 0) {\n\t\t\t\t\t\tconst errorContainer = document.getElementById('errorContainer');\n\t\t\t\t\t\terrorContainer.innerHTML = '<%:Please select at least one weekday%>';\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t} else if (mode === \"1\") {\n\t\t\t\t// Dynamic time mode validation\n\t\t\t\tif (!time_data.weekday_list || time_data.weekday_list.length === 0) {\n\t\t\t\t\tconst dynamicWeekdayErrorContainer = document.getElementById('dynamicWeekdayErrorContainer');\n\t\t\t\t\tdynamicWeekdayErrorContainer.innerHTML = '<%:Please select at least one weekday%>';\n\t\t\t\t\tdynamicWeekdayErrorContainer.style.display = 'block';\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\tif (!time_data.start_time || !time_data.end_time) {\n\t\t\t\t\tconst dynamicErrorContainer = document.getElementById('dynamicErrorContainer');\n\t\t\t\t\tdynamicErrorContainer.innerHTML = '<%:Please set start and end time%>';\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t\t\n\t\t\t\tif (time_data.start_time >= time_data.end_time) {\n\t\t\t\t\tconst dynamicErrorContainer = document.getElementById('dynamicErrorContainer');\n\t\t\t\t\tdynamicErrorContainer.innerHTML = '<%:End time must be greater than start time%>';\n\t\t\t\t\treturn;\n\t\t\t\t}\n            } else if (mode === \"2\") {\n                // Daily time limit mode validation\n                if (!time_data.daily_time_list || time_data.daily_time_list.length !== 7) {\n                    console.error(\"daily_time_list is invalid\");\n                    return;\n                }\n                \n                // Validate all enabled inputs before submission\n                const weekdayValues = [0, 1, 2, 3, 4, 5, 6];\n                let firstErrorInput = null;\n                \n                for (let i = 0; i < weekdayValues.length; i++) {\n                    const dayValue = weekdayValues[i];\n                    const enableCheckbox = document.getElementById(`dailyLimit_${dayValue}_enable`);\n                    \n                    if (enableCheckbox && enableCheckbox.checked) {\n                        // Validate AM input\n                        const amInput = document.getElementById(`dailyLimit_${dayValue}_am`);\n                        if (amInput) {\n                            validateDailyLimit(dayValue, 'am');\n                            const amError = document.getElementById(`dailyLimit_${dayValue}_am_error`);\n                            if (amError && amError.style.display !== 'none' && amError.textContent) {\n                                if (!firstErrorInput) {\n                                    firstErrorInput = amInput;\n                                }\n                            }\n                        }\n                        \n                        // Validate PM input\n                        const pmInput = document.getElementById(`dailyLimit_${dayValue}_pm`);\n                        if (pmInput) {\n                            validateDailyLimit(dayValue, 'pm');\n                            const pmError = document.getElementById(`dailyLimit_${dayValue}_pm_error`);\n                            if (pmError && pmError.style.display !== 'none' && pmError.textContent) {\n                                if (!firstErrorInput) {\n                                    firstErrorInput = pmInput;\n                                }\n                            }\n                        }\n                    }\n                }\n                \n                // If any error found, prevent submission\n                if (firstErrorInput) {\n                    firstErrorInput.focus();\n                    firstErrorInput.scrollIntoView({ behavior: 'smooth', block: 'center' });\n                    return;\n                }\n            }\n\n\n\n            var data_str=JSON.stringify(time_data);\n\n            var xhr = new XHR();\n            xhr.post('<%=url('admin/network/set_app_filter_time')%>', {\n                data:data_str\n            },\n\t\t\t\tfunction (x, data) {\n\t\t\t\t\tconst modal = document.getElementById('modal');\n\t\t\t\t\tmodal.style.display = 'flex'; \n\t\t\t\t\tsetTimeout(() => {\n\t\t\t\t\t\tmodal.style.display = 'none';\n\t\t\t\t\t\t// Refresh the entire page to ensure all data is updated\n\t\t\t\t\t\tlocation.reload();\n\t\t\t\t\t}, 1000);\n\t\t\t\t}\n\t\t\t);\n\n\n\t\t}\n\n\t\tfunction openModal() {\n\t\t\tdocument.getElementById('modal').style.display = 'block';\n\t\t}\n\n\t\tfunction closeModal() {\n\t\t\tdocument.getElementById('modal').style.display = 'none';\n\t\t}\n\n        function clearActiveTime() {\n            if (!confirm('<%:Are you sure you want to clear active time of all users?%>')) {\n                return;\n            }\n            new XHR().post('<%=url('admin/network/cmd')%>', {\n                action: 'clear_active_time'\n            },\n            function (x, data) {\n                if (data && data.code === 0) {\n                    const modal = document.getElementById('modal');\n                    modal.style.display = 'flex'; \n                    setTimeout(() => {\n                        modal.style.display = 'none';\n                    }, 1000);\n                    // Refresh time data to update display\n                    getAppFilterTimeData().then(() => {\n                        renderTimeData();\n                    });\n                } else {\n                    alert(data ? (data.message || '<%:Failed to clear active time%>') : '<%:Failed to clear active time%>');\n                }\n            });\n        }\n\n        function getAppFilterBaseData() {\n            new XHR().get('<%=url('admin/network/get_app_filter_base')%>', null,\n                function (x, data) {\n                    if (data.data.enable == 1) {\n                        document.getElementById('filterSwitch').checked = true;\n                    } else {\n                        document.getElementById('filterSwitch').checked = false;\n                    }\n                    document.getElementById('workMode').value = data.data.work_mode;\n       \n                }\n            );\n        }\n\n        function addTimeRow() {\n            const tbody = document.getElementById('timeTableBody');\n            const row = document.createElement('tr');\n            const weekdayCell = document.createElement('td');\n            weekdayCell.innerHTML = `\n                <div class=\"weekday-selector\" style=\"margin: 0;\">\n                    <div class=\"weekday-item\" style=\"display: inline-block; margin-right: 8px;\"><input type=\"checkbox\" class=\"weekday-checkbox\" value=\"1\"> <%:Mon%></div>\n                    <div class=\"weekday-item\" style=\"display: inline-block; margin-right: 8px;\"><input type=\"checkbox\" class=\"weekday-checkbox\" value=\"2\"> <%:Tue%></div>\n                    <div class=\"weekday-item\" style=\"display: inline-block; margin-right: 8px;\"><input type=\"checkbox\" class=\"weekday-checkbox\" value=\"3\"> <%:Wed%></div>\n                    <div class=\"weekday-item\" style=\"display: inline-block; margin-right: 8px;\"><input type=\"checkbox\" class=\"weekday-checkbox\" value=\"4\"> <%:Thur%></div>\n                    <div class=\"weekday-item\" style=\"display: inline-block; margin-right: 8px;\"><input type=\"checkbox\" class=\"weekday-checkbox\" value=\"5\"> <%:Fri%></div>\n                    <div class=\"weekday-item\" style=\"display: inline-block; margin-right: 8px;\"><input type=\"checkbox\" class=\"weekday-checkbox\" value=\"6\"> <%:Sat%></div>\n                    <div class=\"weekday-item\" style=\"display: inline-block; margin-right: 8px;\"><input type=\"checkbox\" class=\"weekday-checkbox\" value=\"0\"> <%:Sun%></div>\n                </div>\n            `;\n            row.appendChild(weekdayCell);\n            row.innerHTML += `\n                <td><input type=\"time\" class=\"start-time\" required></td>\n                <td><input type=\"time\" class=\"end-time\" required></td>\n                <td><button type=\"button\" class=\"delete-time-btn\" onclick=\"deleteTimeRow(this)\"><%:Delete%></button></td>\n            `;\n            tbody.appendChild(row);\n\n            setTimeout(() => {\n                const startTimeInput = row.querySelector('.start-time');\n                const endTimeInput = row.querySelector('.end-time');\n                startTimeInput.value = \"00:00\";\n                endTimeInput.value = \"23:59\";\n                row.querySelectorAll('.weekday-checkbox').forEach(cb => cb.checked = true);\n            }, 0);\n\n            addTimeValidation();\n        }\n\n        function deleteTimeRow(btn) {\n            const row = btn.closest('tr');\n            row.remove();\n        }\n\n        function toggleModeContent() {\n            const mode = document.getElementById('timeMode').value;\n            const staticTimeContent = document.getElementById('staticTimeContent');\n            const dynamicTimeContent = document.getElementById('dynamicTimeContent');\n            const dailyTimeContent = document.getElementById('dailyTimeContent');\n\n            if (mode === \"1\") {\n                staticTimeContent.style.display = 'none';\n                dynamicTimeContent.style.display = 'block';\n                dailyTimeContent.style.display = 'none';\n            } else if (mode === \"2\") {\n                staticTimeContent.style.display = 'none';\n                dynamicTimeContent.style.display = 'none';\n                dailyTimeContent.style.display = 'block';\n            } else {\n                staticTimeContent.style.display = 'block';\n                dynamicTimeContent.style.display = 'none';\n                dailyTimeContent.style.display = 'none';\n            }\n        }\n\n        function getTimeFormData() {\n            const mode = document.getElementById('timeMode').value;\n            \n            let timeData = {\n                mode: parseInt(mode),\n                weekday_list: [] // Keep for backward compatibility, but not used in mode 0\n            };\n\n            if (mode === \"0\") {\n                const time_list = Array.from(document.getElementById('timeTableBody').rows)\n                    .map(row => {\n                        const weekdays = Array.from(row.querySelectorAll('.weekday-checkbox:checked'))\n                            .map(cb => parseInt(cb.value));\n                        return {\n                            start: row.querySelector('.start-time').value,\n                            end: row.querySelector('.end-time').value,\n                            weekday_list: weekdays\n                        };\n                    });\n                timeData.time_list = time_list;\n            } else if (mode === \"1\") { \n                // Dynamic mode: still use global weekday_list\n                const weekdays = Array.from(document.querySelectorAll('.advanced-content input[name=\"weekday\"]:checked'))\n                    .map(cb => parseInt(cb.value));\n                timeData.weekday_list = weekdays;\n                timeData.start_time = document.getElementById('startTime').value;\n                timeData.end_time = document.getElementById('endTime').value;\n                timeData.allow_time = parseInt(document.getElementById('allowTime').value);\n                timeData.deny_time = parseInt(document.getElementById('denyTime').value);\n            } else if (mode === \"2\") {\n                // Daily time limit mode: weekday duration settings\n                // Array order: 0(Sun), 1(Mon), 2(Tue), 3(Wed), 4(Thu), 5(Fri), 6(Sat)\n                const dailyTimeList = [];\n                const weekdayValues = [0, 1, 2, 3, 4, 5, 6]; // Sunday first in array\n                \n                weekdayValues.forEach((dayValue) => {\n                    const enableCheckbox = document.getElementById(`dailyLimit_${dayValue}_enable`);\n                    const amInput = document.getElementById(`dailyLimit_${dayValue}_am`);\n                    const pmInput = document.getElementById(`dailyLimit_${dayValue}_pm`);\n                    if (enableCheckbox && amInput && pmInput) {\n                        dailyTimeList.push({\n                            enable: enableCheckbox.checked ? 1 : 0,\n                            am_time: parseInt(amInput.value) || 0,\n                            pm_time: parseInt(pmInput.value) || 0\n                        });\n                    }\n                });\n                timeData.daily_time_list = dailyTimeList;\n            }\n\n            return timeData;\n        }\n\n        function toggleAdvanced(element) {\n            element.classList.toggle('expanded');\n            element.nextElementSibling.classList.toggle('expanded');\n        }\n\n        function clearDynamicWeekdayError() {\n            const dynamicWeekdayErrorContainer = document.getElementById('dynamicWeekdayErrorContainer');\n            if (dynamicWeekdayErrorContainer) {\n                dynamicWeekdayErrorContainer.style.display = 'none';\n                dynamicWeekdayErrorContainer.innerHTML = '';\n            }\n        }\n\n        function addTimeValidation() {\n            document.querySelectorAll('.start-time, .end-time').forEach(input => {\n                input.addEventListener('blur', validateTime);\n            });\n        }\n\n        function validateTime(event) {\n            const row = event.target.closest('tr');\n            const startTimeInput = row.querySelector('.start-time');\n            const endTimeInput = row.querySelector('.end-time');\n\n            const startTime = startTimeInput.value;\n            const endTime = endTimeInput.value;\n\n            const errorContainer = document.getElementById('errorContainer');\n            errorContainer.innerHTML = '';\n\n            let errorMessage = '';\n\n            if (!isValidTimeFormat(startTime) || !isValidTimeFormat(endTime)) {\n                errorMessage = '<%:Invalid time format, please enter a valid time format (HH:MM)%>';\n            } else if (startTime >= endTime) {\n                errorMessage = '<%:End time must be greater than start time%>';\n            }\n\n            if (errorMessage) {\n                const errorElement = document.createElement('div');\n                errorElement.className = 'error-message';\n                errorElement.style.color = 'red';\n                errorElement.style.fontSize = '12px';\n                errorElement.textContent = errorMessage;\n                errorContainer.appendChild(errorElement);\n            }\n        }\n\n        function isValidTimeFormat(time) {\n            const timePattern = /^([01]\\d|2[0-3]):([0-5]\\d)$/;\n            return timePattern.test(time);\n        }\n\n        function renderTimeData() {\n            const timeMode = document.getElementById('timeMode');\n            timeMode.value = time_data.mode;\n\n            // Clear dynamic mode weekday checkboxes\n            document.querySelectorAll('.advanced-content input[name=\"weekday\"]').forEach(cb => cb.checked = false);\n\n            // Set dynamic mode weekday checkboxes if weekday_list exists and is an array\n            if (time_data.weekday_list && Array.isArray(time_data.weekday_list)) {\n                time_data.weekday_list.forEach(day => {\n                    const dynamicCheckbox = document.querySelector(`.advanced-content input[name=\"weekday\"][value=\"${day}\"]`);\n                    if (dynamicCheckbox) dynamicCheckbox.checked = true;\n                });\n            }\n\n            const tbody = document.getElementById('timeTableBody');\n            tbody.innerHTML = '';\n            if (time_data.time_list) {\n                time_data.time_list.forEach(timeRange => {\n                    const row = document.createElement('tr');\n                    const weekdayCell = document.createElement('td');\n                    weekdayCell.innerHTML = `\n                        <div class=\"weekday-selector\" style=\"margin: 0;\">\n                            <div class=\"weekday-item\" style=\"display: inline-block; margin-right: 8px;\"><input type=\"checkbox\" class=\"weekday-checkbox\" value=\"1\"> <%:Mon%></div>\n                            <div class=\"weekday-item\" style=\"display: inline-block; margin-right: 8px;\"><input type=\"checkbox\" class=\"weekday-checkbox\" value=\"2\"> <%:Tue%></div>\n                            <div class=\"weekday-item\" style=\"display: inline-block; margin-right: 8px;\"><input type=\"checkbox\" class=\"weekday-checkbox\" value=\"3\"> <%:Wed%></div>\n                            <div class=\"weekday-item\" style=\"display: inline-block; margin-right: 8px;\"><input type=\"checkbox\" class=\"weekday-checkbox\" value=\"4\"> <%:Thur%></div>\n                            <div class=\"weekday-item\" style=\"display: inline-block; margin-right: 8px;\"><input type=\"checkbox\" class=\"weekday-checkbox\" value=\"5\"> <%:Fri%></div>\n                            <div class=\"weekday-item\" style=\"display: inline-block; margin-right: 8px;\"><input type=\"checkbox\" class=\"weekday-checkbox\" value=\"6\"> <%:Sat%></div>\n                            <div class=\"weekday-item\" style=\"display: inline-block; margin-right: 8px;\"><input type=\"checkbox\" class=\"weekday-checkbox\" value=\"0\"> <%:Sun%></div>\n                        </div>\n                    `;\n                    row.appendChild(weekdayCell);\n                    row.innerHTML += `\n                        <td><input type=\"time\" class=\"start-time\" value=\"${timeRange.start}\" required></td>\n                        <td><input type=\"time\" class=\"end-time\" value=\"${timeRange.end}\" required></td>\n                        <td><button type=\"button\" class=\"delete-time-btn\" onclick=\"deleteTimeRow(this)\"><%:Delete%></button></td>\n                    `;\n                    tbody.appendChild(row);\n                    \n                    // Set weekday checkboxes for this time period\n                    if (timeRange.weekday_list && timeRange.weekday_list.length > 0) {\n                        timeRange.weekday_list.forEach(day => {\n                            const checkbox = row.querySelector(`.weekday-checkbox[value=\"${day}\"]`);\n                            if (checkbox) checkbox.checked = true;\n                        });\n                    } else {\n                        // If no weekday_list, use global weekday_list as fallback (for backward compatibility)\n                        if (time_data.weekday_list && Array.isArray(time_data.weekday_list) && time_data.weekday_list.length > 0) {\n                            time_data.weekday_list.forEach(day => {\n                                const checkbox = row.querySelector(`.weekday-checkbox[value=\"${day}\"]`);\n                                if (checkbox) checkbox.checked = true;\n                            });\n                        } else {\n                            // Default: select all weekdays\n                            row.querySelectorAll('.weekday-checkbox').forEach(cb => cb.checked = true);\n                        }\n                    }\n                });\n            }\n\n            // Render dynamic mode data\n            if (time_data.start_time) {\n                document.getElementById('startTime').value = time_data.start_time;\n            }\n            if (time_data.end_time) {\n                document.getElementById('endTime').value = time_data.end_time;\n            }\n            if (time_data.allow_time) {\n                document.getElementById('allowTime').value = time_data.allow_time;\n            }\n            if (time_data.deny_time) {\n                document.getElementById('denyTime').value = time_data.deny_time;\n            }\n\n            // Render daily time limit mode data\n            // Array order: 0(Sun), 1(Mon), 2(Tue), 3(Wed), 4(Thu), 5(Fri), 6(Sat)\n            if (time_data.daily_time_list && Array.isArray(time_data.daily_time_list)) {\n                const weekdayValues = [0, 1, 2, 3, 4, 5, 6]; // Sunday first in array\n                weekdayValues.forEach((dayValue, index) => {\n                    if (time_data.daily_time_list[index]) {\n                        const enableCheckbox = document.getElementById(`dailyLimit_${dayValue}_enable`);\n                        const amInput = document.getElementById(`dailyLimit_${dayValue}_am`);\n                        const pmInput = document.getElementById(`dailyLimit_${dayValue}_pm`);\n                        \n                        if (enableCheckbox) {\n                            enableCheckbox.checked = (time_data.daily_time_list[index].enable == 1);\n                            toggleDailyLimitInputs(dayValue);\n                        }\n                        if (amInput) {\n                            amInput.value = time_data.daily_time_list[index].am_time || 0;\n                        }\n                        if (pmInput) {\n                            pmInput.value = time_data.daily_time_list[index].pm_time || 0;\n                        }\n                    }\n                });\n                \n                // 显示当前上网时长信息\n                if (time_data.current_weekday !== undefined) {\n                    const currentWeekday = time_data.current_weekday;\n                    const weekdayNames = ['<%:Sunday%>', '<%:Monday%>', '<%:Tuesday%>', '<%:Wednesday%>', '<%:Thursday%>', '<%:Friday%>', '<%:Saturday%>'];\n                    const currentWeekdayName = weekdayNames[currentWeekday] || '';\n                    \n                    const amUsed = time_data.current_am_used_time || 0;\n                    const pmUsed = time_data.current_pm_used_time || 0;\n                    const amLimit = time_data.current_am_limit || 0;\n                    const pmLimit = time_data.current_pm_limit || 0;\n                    const dayEnabled = time_data.current_day_enabled || 0;\n                    \n                    const infoDiv = document.getElementById('currentTimeUsageInfo');\n                    const contentDiv = document.getElementById('currentTimeUsageContent');\n                    \n                    if (infoDiv && contentDiv) {\n                        if (dayEnabled) {\n                            infoDiv.style.display = 'block';\n                            let html = `<div><strong><%:Today is%>: ${currentWeekdayName}</strong></div>`;\n                            html += buildProgressBar('<%:AM%>', amUsed, amLimit);\n                            html += buildProgressBar('<%:PM%>', pmUsed, pmLimit);\n                            contentDiv.innerHTML = html;\n                        } else {\n                            infoDiv.style.display = 'block';\n                            contentDiv.innerHTML = `<div><strong><%:Today is%>: ${currentWeekdayName}</strong></div><div style=\"margin-top: 8px; opacity: 0.6;\"><%:Time limit not enabled for today%></div>`;\n                        }\n                    }\n                    \n                    // 高亮当前星期几的行\n                    const currentRow = document.querySelector(`#dailyLimit_${currentWeekday}_enable`)?.closest('tr');\n                    if (currentRow) {\n                        currentRow.style.backgroundColor = '#e8f0fe';\n                        currentRow.style.fontWeight = 'bold';\n                    }\n                }\n            }\n\n            toggleModeContent();\n            addTimeValidation();\n        }\n\n        function validateDynamicTime() {\n            const startTimeInput = document.getElementById('startTime');\n            const endTimeInput = document.getElementById('endTime');\n            const dynamicErrorContainer = document.getElementById('dynamicErrorContainer');\n            dynamicErrorContainer.innerHTML = ''; \n\n            const startTime = startTimeInput.value;\n            const endTime = endTimeInput.value;\n            let errorMessage = '';\n\n            if (!isValidTimeFormat(startTime) || !isValidTimeFormat(endTime)) {\n                errorMessage = '<%:Invalid time format, please enter a valid time format (HH:MM)%>';\n            } else if (startTime >= endTime) {\n                errorMessage = '<%:End time must be greater than start time%>';\n            }\n\n            if (errorMessage) {\n                const errorElement = document.createElement('div');\n                errorElement.className = 'error-message';\n                errorElement.style.color = 'red';\n                errorElement.style.fontSize = '12px';\n                errorElement.textContent = errorMessage;\n                dynamicErrorContainer.appendChild(errorElement);\n            }\n        }\n\n        function isValidTimeFormat(time) {\n            const timePattern = /^([01]\\d|2[0-3]):([0-5]\\d)$/;\n            return timePattern.test(time);\n        }\n\n        function toggleDailyLimitInputs(weekday) {\n            const enableCheckbox = document.getElementById(`dailyLimit_${weekday}_enable`);\n            const amInput = document.getElementById(`dailyLimit_${weekday}_am`);\n            const pmInput = document.getElementById(`dailyLimit_${weekday}_pm`);\n            \n            if (enableCheckbox && amInput && pmInput) {\n                const isEnabled = enableCheckbox.checked;\n                amInput.disabled = !isEnabled;\n                pmInput.disabled = !isEnabled;\n                \n                // Clear errors when disabled\n                if (!isEnabled) {\n                    const amError = document.getElementById(`dailyLimit_${weekday}_am_error`);\n                    const pmError = document.getElementById(`dailyLimit_${weekday}_pm_error`);\n                    if (amError) {\n                        amError.style.display = 'none';\n                        amError.textContent = '';\n                    }\n                    if (pmError) {\n                        pmError.style.display = 'none';\n                        pmError.textContent = '';\n                    }\n                }\n            }\n        }\n\n        function validateDailyLimit(weekday, period) {\n            const input = document.getElementById(`dailyLimit_${weekday}_${period}`);\n            const errorSpan = document.getElementById(`dailyLimit_${weekday}_${period}_error`);\n            \n            if (!input || !errorSpan) return;\n            \n            // Check if input is empty\n            if (input.value === '' || input.value === null || input.value === undefined) {\n                errorSpan.textContent = '<%:Value cannot be empty%>';\n                errorSpan.style.display = 'block';\n                input.style.borderColor = 'red';\n                return;\n            }\n            \n            const value = parseInt(input.value);\n            const maxMinutes = 720; // 12 hours = 720 minutes\n            \n            if (isNaN(value)) {\n                errorSpan.textContent = '<%:Please enter a valid number%>';\n                errorSpan.style.display = 'block';\n                input.style.borderColor = 'red';\n            } else if (value < 0) {\n                errorSpan.textContent = '<%:Value cannot be negative%>';\n                errorSpan.style.display = 'block';\n                input.style.borderColor = 'red';\n            } else if (value > maxMinutes) {\n                errorSpan.textContent = '<%:Value cannot exceed 720 minutes (12 hours)%>';\n                errorSpan.style.display = 'block';\n                input.style.borderColor = 'red';\n            } else {\n                errorSpan.style.display = 'none';\n                errorSpan.textContent = '';\n                input.style.borderColor = '';\n            }\n        }\n\n        window.onload = init_data;\n//]]></script>\n\n<div id=\"modal\" style=\"display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); z-index: 1000; justify-content: center; align-items: center;\">\n    <div style=\"background-color: rgba(0, 0, 0, 0.5); padding: 10px; border-radius: 5px; text-align: center; width: 100px; height: 70px; color: white; display: flex; justify-content: center; align-items: center;\">\n        <p style=\"margin: 0;color: white;\"><%:Settings saved successfully%></p>\n    </div>\n</div>\n\n\n\n<div class=\"cbi-section cbi-tblsection\">\n\n\n    <div style=\"max-width: 1000px; margin-left: 5px;padding: 5px;\">\n\n    <div class=\"time-rules\">\n        <h3><%:Time Rules%></h3>\n        \n        <div id=\"currentTimeDisplay\" style=\"margin-bottom: 12px; font-size: 13px; opacity: 0.7; display: none;\">\n            <%:Current Time%>: <span id=\"currentTimeValue\"></span>\n        </div>\n        \n        <div class=\"mode-selector\" style=\"margin-bottom: 15px;\">\n            <label><%:Mode Selection%>：</label>\n            <select id=\"timeMode\" onchange=\"toggleModeContent()\">\n                <option value=\"0\"><%:Fixed Time%></option>\n                <option value=\"1\"><%:Dynamic Time%></option>\n                <option value=\"2\"><%:Daily Time Limit%></option>\n            </select>\n        </div>\n\n        <div id=\"staticTimeContent\">\n            <table class=\"time-table\">\n                <thead>\n                    <tr>\n                        <th><%:Weekdays%></th>\n                        <th><%:Start Time%></th>\n                        <th><%:End Time%></th>\n                        <th><%:Actions%></th>\n                    </tr>\n                </thead>\n                <tbody id=\"timeTableBody\">\n                </tbody>\n\n               \n            </table>\n            <div id=\"errorContainer\" style=\"color: red; font-size: 12px; margin-top: 10px;\"></div>\n            <button class=\"add-time-btn\" onclick=\"addTimeRow()\"><%:Add Time Period%></button>\n        </div>\n\n        <div id=\"dynamicTimeContent\" style=\"display: none;\">\n            <div style=\"opacity: 0.6; font-size: 13px; margin-bottom: 15px;\">\n                <%:Dynamic time mode refers to dynamically adjusting app filter switches, such as allowing children to play games for 20 minutes after studying for 1 hour, automatically enabling filtering after exceeding entertainment time, and repeating the cycle.%>\n            </div>\n            \n            <div class=\"dynamic-time-settings\">\n                <div class=\"setting-item\">\n                    <label><%:Enable Duration Each Time (Study Time)%>:</label>\n                    <input type=\"number\" id=\"denyTime\" min=\"1\" value=\"60\">\n                    <span><%:minutes%></span>\n                </div>\n                <div class=\"setting-item\" style=\"margin-bottom: 15px;\">\n                    <label><%:Disable Duration Each Time (Break Time)%>:</label>\n                    <input type=\"number\" id=\"allowTime\" min=\"1\" value=\"10\">\n                    <span><%:minutes%></span>\n                </div>\n          \n                <div class=\"advanced-settings\">\n                    <div class=\"advanced-toggle expanded\" onclick=\"toggleAdvanced(this)\">\n                        <span class=\"arrow\"></span>\n                        <span><%:Advanced Settings%></span>\n                    </div>\n                    <div class=\"advanced-content expanded\">\n                        <div class=\"weekday-selector\" style=\"margin-bottom: 15px;\">\n                            <label><%:Weekday Selection%>：</label>\n                            <div class=\"weekday-item\"><input type=\"checkbox\" name=\"weekday\" value=\"1\" onchange=\"clearDynamicWeekdayError()\"> <%:Mon%></div>\n                            <div class=\"weekday-item\"><input type=\"checkbox\" name=\"weekday\" value=\"2\" onchange=\"clearDynamicWeekdayError()\"> <%:Tue%></div>\n                            <div class=\"weekday-item\"><input type=\"checkbox\" name=\"weekday\" value=\"3\" onchange=\"clearDynamicWeekdayError()\"> <%:Wed%></div>\n                            <div class=\"weekday-item\"><input type=\"checkbox\" name=\"weekday\" value=\"4\" onchange=\"clearDynamicWeekdayError()\"> <%:Thur%></div>\n                            <div class=\"weekday-item\"><input type=\"checkbox\" name=\"weekday\" value=\"5\" onchange=\"clearDynamicWeekdayError()\"> <%:Fri%></div>\n                            <div class=\"weekday-item\"><input type=\"checkbox\" name=\"weekday\" value=\"6\" onchange=\"clearDynamicWeekdayError()\"> <%:Sat%></div>\n                            <div class=\"weekday-item\"><input type=\"checkbox\" name=\"weekday\" value=\"0\" onchange=\"clearDynamicWeekdayError()\"> <%:Sun%></div>\n                        </div>\n                        <div id=\"dynamicWeekdayErrorContainer\" style=\"color: red; font-size: 12px; margin-top: 5px; display: none;\"></div>\n                        \n                        <div class=\"setting-item\">\n                            <label><%:Daily Study Time Range%>：</label>\n                            <input type=\"time\" id=\"startTime\" required style=\"margin-right: 5px;\" onchange=\"validateDynamicTime()\">\n                            <span>-</span>\n                            <input type=\"time\" id=\"endTime\" required style=\"margin-left: 5px;\" onchange=\"validateDynamicTime()\">\n                        </div>\n                        <div class=\"setting-item\" style=\"opacity: 0.6; font-size: 12px; margin-top: 5px;\">\n                            <span><%:This time range represents the daily school time period, which is a continuous time period. During this time period, filtering rules are dynamically enabled and disabled. Outside the time range, filtering is disabled by default.%></span>\n                        </div>\n                    </div>\n                </div>\n            </div>\n            <div id=\"dynamicErrorContainer\" style=\"color: red; font-size: 12px; margin-top: 10px;\"></div>\n        </div>\n\n        <div id=\"dailyTimeContent\" style=\"display: none;\">\n            <div style=\"opacity: 0.6; font-size: 13px; margin-bottom: 15px;\">\n                <%:Daily time limit mode allows you to set a daily internet time limit for each weekday. Once the limit is reached, internet access will be restricted.%>\n            </div>\n            \n            <!-- 当前上网时长信息显示 -->\n            <div id=\"currentTimeUsageInfo\" style=\"border: 1px solid #1a73e8; border-radius: 5px; padding: 15px; margin-bottom: 15px; display: none;\">\n                <div style=\"display: flex; justify-content: space-between; align-items: center; margin-bottom: 10px;\">\n                    <div style=\"font-weight: bold; color: #1a73e8; font-size: 14px;\">\n                        <%:Today Time Usage%>\n                    </div>\n                    <button type=\"button\" class=\"clear-time-btn\" onclick=\"clearActiveTime()\"><%:Clear%></button>\n                </div>\n                <div id=\"currentTimeUsageContent\" style=\"font-size: 13px; line-height: 1.8;\">\n                    <!-- 内容将通过JavaScript填充 -->\n                </div>\n            </div>\n            \n            <table class=\"time-table\" style=\"margin-top: 10px;\">\n                <thead>\n                    <tr>\n                        <th style=\"width: 15%;\"><%:Weekday%></th>\n                        <th style=\"width: 15%;\"><%:Enable%></th>\n                        <th style=\"width: 35%;\"><%:Morning Time Limit (minutes)%></th>\n                        <th style=\"width: 35%;\"><%:Afternoon Time Limit (minutes)%></th>\n                    </tr>\n                </thead>\n                <tbody>\n                    <tr>\n                        <td><%:Monday%></td>\n                        <td><label class=\"switch\"><input type=\"checkbox\" id=\"dailyLimit_1_enable\" onchange=\"toggleDailyLimitInputs(1)\"><span class=\"slider\"></span></label></td>\n                        <td>\n                            <div class=\"daily-limit-input-wrapper\">\n                                <input type=\"number\" id=\"dailyLimit_1_am\" min=\"0\" max=\"720\" value=\"0\" style=\"padding: 5px;\" disabled onblur=\"validateDailyLimit(1, 'am')\">\n                                <div id=\"dailyLimit_1_am_error\" class=\"daily-limit-error\"></div>\n                            </div>\n                        </td>\n                        <td>\n                            <div class=\"daily-limit-input-wrapper\">\n                                <input type=\"number\" id=\"dailyLimit_1_pm\" min=\"0\" max=\"720\" value=\"0\" style=\"padding: 5px;\" disabled onblur=\"validateDailyLimit(1, 'pm')\">\n                                <div id=\"dailyLimit_1_pm_error\" class=\"daily-limit-error\"></div>\n                            </div>\n                        </td>\n                    </tr>\n                    <tr>\n                        <td><%:Tuesday%></td>\n                        <td><label class=\"switch\"><input type=\"checkbox\" id=\"dailyLimit_2_enable\" onchange=\"toggleDailyLimitInputs(2)\"><span class=\"slider\"></span></label></td>\n                        <td>\n                            <div class=\"daily-limit-input-wrapper\">\n                                <input type=\"number\" id=\"dailyLimit_2_am\" min=\"0\" max=\"720\" value=\"0\" style=\"padding: 5px;\" disabled onblur=\"validateDailyLimit(2, 'am')\">\n                                <div id=\"dailyLimit_2_am_error\" class=\"daily-limit-error\"></div>\n                            </div>\n                        </td>\n                        <td>\n                            <div class=\"daily-limit-input-wrapper\">\n                                <input type=\"number\" id=\"dailyLimit_2_pm\" min=\"0\" max=\"720\" value=\"0\" style=\"padding: 5px;\" disabled onblur=\"validateDailyLimit(2, 'pm')\">\n                                <div id=\"dailyLimit_2_pm_error\" class=\"daily-limit-error\"></div>\n                            </div>\n                        </td>\n                    </tr>\n                    <tr>\n                        <td><%:Wednesday%></td>\n                        <td><label class=\"switch\"><input type=\"checkbox\" id=\"dailyLimit_3_enable\" onchange=\"toggleDailyLimitInputs(3)\"><span class=\"slider\"></span></label></td>\n                        <td>\n                            <div class=\"daily-limit-input-wrapper\">\n                                <input type=\"number\" id=\"dailyLimit_3_am\" min=\"0\" max=\"720\" value=\"0\" style=\"padding: 5px;\" disabled onblur=\"validateDailyLimit(3, 'am')\">\n                                <div id=\"dailyLimit_3_am_error\" class=\"daily-limit-error\"></div>\n                            </div>\n                        </td>\n                        <td>\n                            <div class=\"daily-limit-input-wrapper\">\n                                <input type=\"number\" id=\"dailyLimit_3_pm\" min=\"0\" max=\"720\" value=\"0\" style=\"padding: 5px;\" disabled onblur=\"validateDailyLimit(3, 'pm')\">\n                                <div id=\"dailyLimit_3_pm_error\" class=\"daily-limit-error\"></div>\n                            </div>\n                        </td>\n                    </tr>\n                    <tr>\n                        <td><%:Thursday%></td>\n                        <td><label class=\"switch\"><input type=\"checkbox\" id=\"dailyLimit_4_enable\" onchange=\"toggleDailyLimitInputs(4)\"><span class=\"slider\"></span></label></td>\n                        <td>\n                            <div class=\"daily-limit-input-wrapper\">\n                                <input type=\"number\" id=\"dailyLimit_4_am\" min=\"0\" max=\"720\" value=\"0\" style=\"padding: 5px;\" disabled onblur=\"validateDailyLimit(4, 'am')\">\n                                <div id=\"dailyLimit_4_am_error\" class=\"daily-limit-error\"></div>\n                            </div>\n                        </td>\n                        <td>\n                            <div class=\"daily-limit-input-wrapper\">\n                                <input type=\"number\" id=\"dailyLimit_4_pm\" min=\"0\" max=\"720\" value=\"0\" style=\"padding: 5px;\" disabled onblur=\"validateDailyLimit(4, 'pm')\">\n                                <div id=\"dailyLimit_4_pm_error\" class=\"daily-limit-error\"></div>\n                            </div>\n                        </td>\n                    </tr>\n                    <tr>\n                        <td><%:Friday%></td>\n                        <td><label class=\"switch\"><input type=\"checkbox\" id=\"dailyLimit_5_enable\" onchange=\"toggleDailyLimitInputs(5)\"><span class=\"slider\"></span></label></td>\n                        <td>\n                            <div class=\"daily-limit-input-wrapper\">\n                                <input type=\"number\" id=\"dailyLimit_5_am\" min=\"0\" max=\"720\" value=\"0\" style=\"padding: 5px;\" disabled onblur=\"validateDailyLimit(5, 'am')\">\n                                <div id=\"dailyLimit_5_am_error\" class=\"daily-limit-error\"></div>\n                            </div>\n                        </td>\n                        <td>\n                            <div class=\"daily-limit-input-wrapper\">\n                                <input type=\"number\" id=\"dailyLimit_5_pm\" min=\"0\" max=\"720\" value=\"0\" style=\"padding: 5px;\" disabled onblur=\"validateDailyLimit(5, 'pm')\">\n                                <div id=\"dailyLimit_5_pm_error\" class=\"daily-limit-error\"></div>\n                            </div>\n                        </td>\n                    </tr>\n                    <tr>\n                        <td><%:Saturday%></td>\n                        <td><label class=\"switch\"><input type=\"checkbox\" id=\"dailyLimit_6_enable\" onchange=\"toggleDailyLimitInputs(6)\"><span class=\"slider\"></span></label></td>\n                        <td>\n                            <div class=\"daily-limit-input-wrapper\">\n                                <input type=\"number\" id=\"dailyLimit_6_am\" min=\"0\" max=\"720\" value=\"0\" style=\"padding: 5px;\" disabled onblur=\"validateDailyLimit(6, 'am')\">\n                                <div id=\"dailyLimit_6_am_error\" class=\"daily-limit-error\"></div>\n                            </div>\n                        </td>\n                        <td>\n                            <div class=\"daily-limit-input-wrapper\">\n                                <input type=\"number\" id=\"dailyLimit_6_pm\" min=\"0\" max=\"720\" value=\"0\" style=\"padding: 5px;\" disabled onblur=\"validateDailyLimit(6, 'pm')\">\n                                <div id=\"dailyLimit_6_pm_error\" class=\"daily-limit-error\"></div>\n                            </div>\n                        </td>\n                    </tr>\n                    <tr>\n                        <td><%:Sunday%></td>\n                        <td><label class=\"switch\"><input type=\"checkbox\" id=\"dailyLimit_0_enable\" onchange=\"toggleDailyLimitInputs(0)\"><span class=\"slider\"></span></label></td>\n                        <td>\n                            <div class=\"daily-limit-input-wrapper\">\n                                <input type=\"number\" id=\"dailyLimit_0_am\" min=\"0\" max=\"720\" value=\"0\" style=\"padding: 5px;\" disabled onblur=\"validateDailyLimit(0, 'am')\">\n                                <div id=\"dailyLimit_0_am_error\" class=\"daily-limit-error\"></div>\n                            </div>\n                        </td>\n                        <td>\n                            <div class=\"daily-limit-input-wrapper\">\n                                <input type=\"number\" id=\"dailyLimit_0_pm\" min=\"0\" max=\"720\" value=\"0\" style=\"padding: 5px;\" disabled onblur=\"validateDailyLimit(0, 'pm')\">\n                                <div id=\"dailyLimit_0_pm_error\" class=\"daily-limit-error\"></div>\n                            </div>\n                        </td>\n                    </tr>\n                </tbody>\n            </table>\n            <div style=\"color: #000; font-size: 12px; margin-top: 10px;\">\n                <span><%:Note: Set to 0 to disable time limit for that period.%></span>\n            </div>\n        </div>\n    </div>\n\n    <div style=\"margin-top: 20px; display: flex; justify-content: flex-end; gap: 10px;\">\n        <button type=\"button\" class=\"submit-button\" onclick=\"location.reload()\" style=\"background: transparent; color: #1a73e8; border: 1px solid var(--border-color-medium, #d1d5db);\"><%:Refresh%></button>\n        <button type=\"button\" class=\"submit-button\" onclick=\"submitHandle()\"><%:Save%></button>\n    </div>\n\n    </div>\n</div>"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/view/admin_network/user.htm",
    "content": "<link rel=\"stylesheet\" href=\"<%=resource%>/css/common.css\">\n<style>\n    /* 固定按钮样式，不受主题影响 - 蓝色背景，白色文字 */\n    .cbi-button.cbi-button-add {\n        background-color: #1a73e8 !important;\n        color: #ffffff !important;\n        border: none !important;\n        padding: 6px 12px !important;\n        border-radius: 4px !important;\n        cursor: pointer !important;\n        font-size: 13px !important;\n        font-weight: 500 !important;\n        transition: background-color 0.2s ease !important;\n    }\n    .cbi-button.cbi-button-add:hover {\n        background-color: #1557b0 !important;\n        color: #ffffff !important;\n    }\n    .cbi-button.cbi-button-add:active {\n        background-color: #0d47a1 !important;\n        color: #ffffff !important;\n    }\n    \n    /* 页面卡片边框 */\n    .cbi-section.cbi-tblsection {\n        border: 1px solid var(--border-color-low, #e5e7eb);\n        border-radius: 8px;\n        box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);\n        margin-top: 20px;\n        padding: 4px;\n        overflow-x: auto;\n    }\n    .cbi-section.cbi-tblsection > div {\n        min-width: 600px;\n    }\n\n    /* 确保表格在手机端也保持正常表格布局 */\n    .cbi-section-table .tr {\n        display: table-row !important;\n    }\n    .cbi-section-table .th,\n    .cbi-section-table .td {\n        display: table-cell !important;\n    }\n    .cbi-section-table thead {\n        display: table-header-group !important;\n    }\n    .cbi-section-table tbody {\n        display: table-row-group !important;\n    }\n\n    /* Table styles - 表格美化 */\n    .cbi-section-table {\n        width: 100%;\n        border-collapse: collapse;\n        margin: 15px 0;\n        border: none;\n        display: table;\n    }\n    \n    .cbi-section-table th, .cbi-section-table td {\n        padding: 10px 16px;\n        text-align: left;\n        border-bottom: 1px solid var(--border-color-low, #e5e7eb);\n    }\n    \n    .cbi-section-table th {\n        background: var(--background-color-low, #f5f5f5);\n        color: var(--text-color-medium, #6b7280);\n        font-weight: 600;\n        font-size: 12.5px;\n        letter-spacing: 0.2px;\n        border-bottom: 1px solid var(--border-color-medium, #d1d5db);\n        white-space: nowrap;\n    }\n    \n    .cbi-section-table tr:hover td {\n        background-color: var(--background-color-low, #f5f5f5);\n    }\n    \n    .cbi-section-table tr:last-child td {\n        border-bottom: none;\n    }\n    \n    /* 单元格内容样式 */\n    .cbi-section-table td {\n        font-size: 13px;\n        vertical-align: middle;\n        line-height: 1.5;\n    }\n\n    .mode-selection {\n        margin-bottom: 20px;\n        margin-top: 10px;\n        display: flex !important;\n        align-items: center !important;\n        gap: 16px;\n    }\n    .mode-selection label {\n        display: inline-flex !important;\n        align-items: center !important;\n        gap: 6px;\n        cursor: pointer;\n        font-size: 14px;\n        line-height: 1.4;\n        margin: 0 !important;\n        padding: 0 !important;\n    }\n    .mode-selection label input[type=\"radio\"] {\n        margin: 0 !important;\n        vertical-align: middle !important;\n        flex-shrink: 0;\n        position: relative !important;\n        top: 0 !important;\n        transform: none !important;\n    }\n    .mode-selection label span,\n    .mode-selection label {\n        vertical-align: middle !important;\n    }\n\n    /* 按钮样式优化 */\n    .delete-button {\n        padding: 5px 12px;\n        color: #d93025;\n        border: 1px solid var(--border-color-medium, #d1d5db);\n        border-radius: 4px;\n        cursor: pointer;\n        font-size: 12px;\n        font-weight: 500;\n        transition: all 0.2s;\n        background: transparent;\n    }\n    \n    .delete-button:hover {\n        background-color: #fce8e6;\n        border-color: #d93025;\n        color: #c5221f;\n    }\n\n    /* 表格内操作按钮 */\n    .cbi-section-table .cbi-button,\n    .cbi-section-table .cbi-button-add {\n        padding: 5px 12px;\n        font-size: 12px;\n        border-radius: 4px;\n        border: 1px solid var(--border-color-medium, #d1d5db);\n        background: transparent;\n        color: #1a73e8;\n        cursor: pointer;\n        transition: all 0.2s;\n        font-weight: 500;\n    }\n\n    .cbi-section-table .cbi-button:hover,\n    .cbi-section-table .cbi-button-add:hover {\n        background-color: #e8f0fe;\n        border-color: #1a73e8;\n    }\n    \n    /* 独立的添加按钮 - 蓝底白字 */\n    .cbi-section-create .cbi-button-add,\n    .cbi-section-create input.cbi-button-add {\n        padding: 8px 16px !important;\n        background-color: #1a73e8 !important;\n        color: white !important;\n        border: none !important;\n        border-radius: 4px;\n        cursor: pointer;\n        font-size: 13px;\n        font-weight: 500;\n        transition: background-color 0.2s;\n    }\n    \n    .cbi-section-create .cbi-button-add:hover,\n    .cbi-section-create input.cbi-button-add:hover {\n        background-color: #1557b0 !important;\n    }\n\n    /* Modal styles - 与 user_status 完全一致 */\n    .oaf-modal-overlay {\n        display: none;\n        position: fixed;\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        background-color: rgba(0, 0, 0, 0.45);\n        backdrop-filter: blur(3px);\n        z-index: 1000;\n        justify-content: center;\n        align-items: center;\n    }\n    \n    .oaf-modal-box {\n        background-color: var(--background-color-high, #fff);\n        padding: 28px;\n        border-radius: 12px;\n        text-align: left;\n        display: flex;\n        flex-direction: column;\n        position: relative;\n        box-shadow: 0 8px 30px rgba(0, 0, 0, 0.18);\n        width: 450px;\n        max-width: 90%;\n    }\n    \n    .user-selection {\n        max-height: 300px;\n        overflow-y: auto;\n        margin: 15px 0;\n        border: 1px solid var(--border-color-low, #e5e7eb);\n        border-radius: 4px;\n    }\n    \n    .user-item {\n        padding: 12px;\n        border-bottom: 1px solid var(--border-color-low, #e5e7eb);\n        display: flex;\n        align-items: center;\n        transition: background-color 0.2s;\n    }\n\n    .user-item:last-child {\n        border-bottom: none;\n    }\n\n    .user-item:hover {\n        background-color: var(--background-color-low, #f5f5f5);\n    }\n\n    h3 {\n        font-weight: 600;\n        font-size: 16px;\n    }\n\n    /* Keyframes */\n    @keyframes fadeIn {\n        from { opacity: 0; }\n        to { opacity: 1; }\n    }\n    \n    @keyframes slideUp {\n        from { transform: translateY(20px); opacity: 0; }\n        to { transform: translateY(0); opacity: 1; }\n    }\n</style>\n\n<script type=\"text/javascript\">//<![CDATA[\n    let userData = {\n        users: [],\n        mode: 1\n    };\n\n    let whitelistData = {\n        users: []\n    };\n            \n    let allUsers = [];\n    function initData() {\n        userData.list = [];\n        getAppFilterUserData();\n        getAllUsersData();\n        getWhitelistData();\n    }\n\n\n    function getAllUsersData() {\n        new XHR().get('<%=url('admin/network/get_all_users')%>', {flag: 2, page: 0},\n            function (x, data) {\n \t\t\t\tif (Array.isArray(data.data.list))  \n                \tallUsers = data.data.list;\n                renderAutoUserData();\n            }\n        );\n    }\n\n\n    function getAppFilterUserData() {\n        new XHR().get('<%=url('admin/network/get_app_filter_user')%>', null,\n            function (x, data) {\n\n                userData = data.data;\n\t\t\t\tif (!Array.isArray(userData.list))                                  \n                \tuserData.list=[]   \n                renderUserData();\n                render_mode_description(userData.mode);\n            }\n        );\n    }\n\n\n    function renderUserData() {\n        const table = document.getElementById('user_table');\n        let tbody = table.querySelector('tbody');\n        if (!tbody) {\n            tbody = document.createElement('tbody');\n            table.appendChild(tbody);\n        }\n        tbody.innerHTML = '';\n        \n\n        const modeRadios = document.querySelectorAll('input[name=\"mode\"]');\n        modeRadios.forEach(radio => {\n            radio.checked = parseInt(radio.value) === userData.mode;\n        });\n        if (userData.mode === 1) {\n            document.getElementById('user_table').style.display = 'table';\n            document.getElementById('auto_user_section').style.display = 'none';\n            document.getElementById('whitelist_section').style.display = 'none';\n        } else {\n            document.getElementById('user_table').style.display = 'none';\n            document.getElementById('auto_user_section').style.display = 'block';\n            document.getElementById('whitelist_section').style.display = 'block';\n        }\n\n        // Hide add button and actions column header in manual mode\n        const manualAddButton = document.getElementById('manualAddUserBtn');\n        const whitelistAddButton = document.getElementById('whitelistAddUserBtn');\n        const actionsHeader = document.querySelector('#user_table .th:last-child');\n        \n        if (manualAddButton) {\n            manualAddButton.style.display = userData.mode === 1 ? 'inline-block' : 'none';\n        }\n        if (whitelistAddButton) {\n            whitelistAddButton.style.display = userData.mode === 0 ? 'inline-block' : 'none';\n        }\n        if (actionsHeader) {\n            actionsHeader.style.display = userData.mode === 1 ? '' : 'none';\n        }\n        \n        const displayList = userData.mode === 1 ? userData.list : allUsers;\n        \n        let html = '';\n        displayList.forEach((user, index) => {\n            const hostname = user.hostname || '--';\n            const nickname = user.nickname || '--';\n            html += `<tr class=\"tr\">\n                <td class=\"td\">${user.mac}</td>\n                <td class=\"td\">${hostname}</td>\n                <td class=\"td\">${nickname}</td>\n                <td class=\"td\" style=\"${userData.mode === 1 ? '' : 'display: none;'}\">\n                    <div style=\"display: flex; white-space: nowrap;\">\n                    ${userData.mode === 1 ? `<button type=\"button\" class=\"delete-button\" onclick=\"removeUser(${index})\"><%:Delete%></button>` : ''}\n                    </div>\n                </td>\n            </tr>`;\n        });\n        tbody.innerHTML = html;\n    }\n\n\n    function renderAutoUserData() {\n        const table = document.getElementById('auto_user_table');\n        let tbody = table.querySelector('tbody');\n        if (!tbody) {\n            tbody = document.createElement('tbody');\n            table.appendChild(tbody);\n        }\n        tbody.innerHTML = '';\n        \n        // Get whitelist MAC addresses\n        const whitelistMacs = whitelistData.users.map(user => user.mac || user);\n        \n        // Filter out users already in whitelist and users with is_whitelist flag\n        const displayList = allUsers.filter(user => {\n            return user.is_whitelist !== 1 && !whitelistMacs.includes(user.mac);\n        });\n        \n        if (displayList.length === 0) {\n      \n            document.getElementById('no_users_message').style.display = 'block';\n        } else {\n      \n            document.getElementById('no_users_message').style.display = 'none';\n            \n      \n            let html = '';\n            displayList.forEach((user, index) => {\n                const hostname = user.hostname || '--';\n                const nickname = user.nickname || '--';\n                \n                html += `<tr class=\"tr\">\n                    <td class=\"td\">${user.mac}</td>\n                    <td class=\"td\">${hostname}</td>\n                    <td class=\"td\">${nickname}</td>\n                    <td class=\"td\">\n                        <div style=\"display: flex; white-space: nowrap;\">\n                        <button type=\"button\" class=\"cbi-button cbi-button-add\" onclick=\"addUserToWhitelist('${user.mac}')\"><%:Add to Whitelist%></button>\n                        </div>\n                    </td>\n                </tr>`;\n            });\n            tbody.innerHTML = html;\n        }\n    }\n\n    function addUserToWhitelist(mac) {\n        // Check if user is already in whitelist\n        const whitelistMacs = whitelistData.users.map(user => user.mac || user);\n        if (whitelistMacs.includes(mac)) {\n            showSuccessMessage('<%:User already in whitelist%>');\n            return;\n        }\n        \n        const data = {\n            mac_list: [mac]\n        };\n        const data_str = JSON.stringify(data);\n        \n        new XHR().post('<%=url('admin/network/add_whitelist_user')%>', \n            { data: data_str },\n            function(x, data) {\n                setTimeout(() => {\n                    getWhitelistData();\n                    getAllUsersData(); \n                    renderAutoUserData(); \n                }, 500); \n                showSuccessMessage('<%:Add to whitelist successful%>');\n            }\n        );\n    }\n\n    function showSuccessMessage(message = '<%:Settings saved successfully%>') {\n        const modal = document.getElementById('modal');\n        const messageElement = modal.querySelector('p');\n        messageElement.textContent = message;\n        modal.style.display = 'flex';\n        setTimeout(() => {\n            modal.style.display = 'none';\n        }, 1000);\n    }\n\n    function removeUser(index) {\n        const userToRemove = userData.list[index];\n        new XHR().post('<%=url('admin/network/del_app_filter_user')%>', \n            { mac: userToRemove.mac },\n            function(x, data) {\n                getAppFilterUserData();\n                showSuccessMessage('<%:Delete successful%>');\n            }\n        );\n    }\n    \n\n    function showUserModal() {\n        console.log(\"showUserModal\");\n        const modal = document.getElementById('userModal');\n        modal.style.display = 'flex';\n        \n        const userList = document.getElementById('userList');\n        userList.innerHTML = '';\n\n        allUsers.forEach(user => {\n            const userElement = document.createElement('div');\n            userElement.className = 'user-item';\n            \n            // Determine the display name\n            const displayName = user.nickname || user.hostname || '';\n            \n            userElement.innerHTML = `\n                <label style=\"display: flex; align-items: center;\">\n                    <input type=\"checkbox\" value=\"${user.mac}\" style=\"margin-right: 8px;\">\n                    <span>${user.mac}</span>\n                    <span style=\"opacity: 0.6; margin-left: 8px;\">${displayName ? `(${displayName})` : ''}</span>\n                </label>\n            `;\n            userList.appendChild(userElement);\n        });\n    }\n    \n    function closeUserModal() {\n        const modal = document.getElementById('userModal');\n        modal.style.display = 'none';\n    }\n\n    function addSelectedUsers() {\n        const userList = document.getElementById('userList');\n        const checkboxes = userList.querySelectorAll('input[type=\"checkbox\"]:checked');\n        \n        const selectedMacs = Array.from(checkboxes).map(checkbox => checkbox.value);\n        \n        var data = {\n            mac_list: selectedMacs\n        }\n        var data_str = JSON.stringify(data);\n\n        console.log(selectedMacs);\n        new XHR().post('<%=url('admin/network/add_app_filter_user')%>', \n            { data: data_str },\n            function(x, data) {\n                getAppFilterUserData();\n                closeUserModal();\n                showSuccessMessage('<%:Add successful%>');\n            }\n        );\n    }\n\n    function render_mode_description(newMode) {\n        const modeDescription = document.getElementById('modeDescription');\n        if (newMode === 0) {\n            modeDescription.textContent = '<%:In automatic mode, all newly joined terminals will be controlled, and random MAC addresses on mobile phones are also applicable%>';\n        } else {\n            modeDescription.textContent = '<%:In manual mode, only specified terminals are controlled%>';\n        }\n    }\n\n    function switchMode(newMode) {\n        userData.mode = newMode;\n        renderUserData();\n        render_mode_description(newMode);\n\n        new XHR().post('<%=url('admin/network/set_app_filter_user')%>', \n        { mode: newMode },\n        function(x, data) {\n            console.log('Mode updated successfully');\n            showSuccessMessage('<%:Mode switch successful%>');\n        });\n    }\n\n    function getWhitelistData() {\n        new XHR().get('<%=url('admin/network/get_whitelist_user')%>', null,\n            function (x, data) {\n                if (data.data && Array.isArray(data.data.list)) {\n                    whitelistData.users = data.data.list;\n                } else {\n                    whitelistData.users = [];\n                }\n                renderWhitelistData();\n            }\n        );\n    }\n\n    function renderWhitelistData() {\n        const table = document.getElementById('whitelist_table');\n        if (!table) return;\n        \n        let tbody = table.querySelector('tbody');\n        if (!tbody) {\n            tbody = document.createElement('tbody');\n            table.appendChild(tbody);\n        }\n        tbody.innerHTML = '';\n        \n        let html = '';\n        whitelistData.users.forEach((user, index) => {\n            const hostname = user.hostname || '--';\n            const nickname = user.nickname || '--';\n            html += `<tr class=\"tr\">\n                <td class=\"td\">${user.mac}</td>\n                <td class=\"td\">${hostname}</td>\n                <td class=\"td\">${nickname}</td>\n                <td class=\"td\">\n                    <div style=\"display: flex; white-space: nowrap;\">\n                    <button type=\"button\" class=\"delete-button\" onclick=\"removeWhitelistUser(${index})\"><%:Delete%></button>\n                    </div>\n                </td>\n            </tr>`;\n        });\n        tbody.innerHTML = html;\n    }\n\n    function showWhitelistModal() {\n        console.log(\"showWhitelistModal\");\n        const modal = document.getElementById('whitelistModal');\n        modal.style.display = 'flex';\n        \n        const userList = document.getElementById('whitelistUserList');\n        userList.innerHTML = '';\n\n        // Get whitelist MAC addresses\n        const whitelistMacs = whitelistData.users.map(user => user.mac || user);\n        \n        // Filter out users already in whitelist\n        const availableUsers = allUsers.filter(user => {\n            return !whitelistMacs.includes(user.mac);\n        });\n\n        if (availableUsers.length === 0) {\n            userList.innerHTML = '<div style=\"text-align: center; padding: 20px; opacity: 0.6;\"><%:No available users to add%></div>';\n            return;\n        }\n\n        availableUsers.forEach(user => {\n            const userElement = document.createElement('div');\n            userElement.className = 'user-item';\n            \n            // Determine the display name\n            const displayName = user.nickname || user.hostname || '';\n            \n            userElement.innerHTML = `\n                <label style=\"display: flex; align-items: center;\">\n                    <input type=\"checkbox\" value=\"${user.mac}\" style=\"margin-right: 8px;\">\n                    <span>${user.mac}</span>\n                    <span style=\"opacity: 0.6; margin-left: 8px;\">${displayName ? `(${displayName})` : ''}</span>\n                </label>\n            `;\n            userList.appendChild(userElement);\n        });\n    }\n    \n    function closeWhitelistModal() {\n        const modal = document.getElementById('whitelistModal');\n        modal.style.display = 'none';\n    }\n\n    function addSelectedWhitelistUsers() {\n        console.log(\"addSelectedWhitelistUsers\");\n        const userList = document.getElementById('whitelistUserList');\n        const checkboxes = userList.querySelectorAll('input[type=\"checkbox\"]:checked');\n        \n        const selectedMacs = Array.from(checkboxes).map(checkbox => checkbox.value);\n        \n        if (selectedMacs.length === 0) {\n            showSuccessMessage('<%:Please select at least one user%>');\n            return;\n        }\n        \n        // Check if any selected user is already in whitelist\n        const whitelistMacs = whitelistData.users.map(user => user.mac || user);\n        const alreadyInWhitelist = selectedMacs.filter(mac => whitelistMacs.includes(mac));\n        \n        if (alreadyInWhitelist.length > 0) {\n            showSuccessMessage('<%:Some users are already in whitelist%>');\n            return;\n        }\n        \n        var data = {\n            mac_list: selectedMacs\n        }\n        var data_str = JSON.stringify(data);\n\n        console.log(selectedMacs);\n        new XHR().post('<%=url('admin/network/add_whitelist_user')%>', \n            { data: data_str },\n            function(x, data) {\n          \n                setTimeout(() => {\n                    getWhitelistData();\n                    getAllUsersData(); \n                    renderAutoUserData(); \n                }, 500); \n                closeWhitelistModal();\n                showSuccessMessage('<%:Add to whitelist successful%>');\n            }\n        );\n    }\n\n    function removeWhitelistUser(index) {\n        const userToRemove = whitelistData.users[index];\n        new XHR().post('<%=url('admin/network/del_whitelist_user')%>', \n            { mac: userToRemove.mac },\n            function(x, data) {\n \n                setTimeout(() => {\n                    getWhitelistData();\n                    getAllUsersData(); \n                    renderAutoUserData();\n                }, 500);\n                showSuccessMessage('<%:Remove from whitelist successful%>');\n            }\n        );\n    }\n\n    window.onload = initData;\n//]]></script>\n\n<div class=\"cbi-section cbi-tblsection\">\n    <div style=\"max-width: 1000px; margin-left: 5px;padding: 5px;\">\n        <div class=\"mode-selection\">\n            <label><input type=\"radio\" name=\"mode\" value=\"0\" onclick=\"switchMode(0)\"> <%:Automatic Mode%></label>\n            <label><input type=\"radio\" name=\"mode\" value=\"1\" checked onclick=\"switchMode(1)\"> <%:Manual Mode%></label>\n        </div>\n\n\n    <div id=\"modeDescription\" style=\"margin-bottom: 15px;\">\n        <%:In manual mode, only the following added terminals are controlled%>\n    </div>\n    \n    <table class=\"cbi-section-table\" id=\"user_table\" style=\"display: none;\">\n        <thead>\n            <tr class=\"tr table-titles\">\n                <th class=\"th\"><%:MAC%></th>\n                <th class=\"th\"><%:Hostname%></th>\n                <th class=\"th\"><%:Remark%></th>\n                <th class=\"th\"><%:Actions%></th>\n            </tr>\n        </thead>\n        <tbody></tbody>\n    </table>\n\n    <div id=\"auto_user_section\" style=\"display: none; margin-top: 20px;\">\n        <h3 style=\"margin-bottom: 15px;\"><%:Effective Users%></h3>\n        <table class=\"cbi-section-table\" id=\"auto_user_table\">\n            <thead>\n                <tr class=\"tr table-titles\">\n                    <th class=\"th\"><%:MAC%></th>\n                    <th class=\"th\"><%:Hostname%></th>\n                    <th class=\"th\"><%:Remark%></th>\n                    <th class=\"th\"><%:Actions%></th>\n                </tr>\n            </thead>\n            <tbody></tbody>\n        </table>\n\n        <div id=\"no_users_message\" style=\"display: none; text-align: center; padding: 40px 0; opacity: 0.6; font-size: 14px;\">\n            <%:No Users Available%>\n        </div>\n    </div>\n\n\n    <div id=\"whitelist_section\" style=\"display: none; margin-top: 20px;\">\n        <h3 style=\"margin-bottom: 15px;\"><%:Whitelist Users%></h3>\n        <div style=\"margin-bottom: 15px; opacity: 0.6; font-size: 13px;\"><%:Users in whitelist are not controlled%></div>\n        <table class=\"cbi-section-table\" id=\"whitelist_table\">\n            <thead>\n                <tr class=\"tr table-titles\">\n                    <th class=\"th\"><%:MAC%></th>\n                    <th class=\"th\"><%:Hostname%></th>\n                    <th class=\"th\"><%:Remark%></th>\n                    <th class=\"th\"><%:Actions%></th>\n                </tr>\n            </thead>\n            <tbody></tbody>\n        </table>\n    </div>\n\n     <div class=\"cbi-section-create\" style=\"margin-top: 15px;\">\n        <input type=\"button\" value=\"<%:Add User%>\" onclick=\"showUserModal()\" id=\"manualAddUserBtn\" style=\"padding: 8px 16px; background-color: #1a73e8; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 13px; font-weight: 500; display: none;\" />\n        <input type=\"button\" value=\"<%:Add to Whitelist%>\" onclick=\"showWhitelistModal()\" id=\"whitelistAddUserBtn\" style=\"padding: 8px 16px; background-color: #1a73e8; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 13px; font-weight: 500; display: none;\" />\n    </div> \n\n    <div style=\"margin-top: 20px; display: flex; justify-content: flex-end;\">\n        <button type=\"button\" onclick=\"location.reload()\" style=\"padding: 8px 20px; width: 150px; background: transparent; color: #1a73e8; border: 1px solid var(--border-color-medium, #d1d5db); border-radius: 4px; cursor: pointer; font-size: 13px; font-weight: 500; display: inline-flex; align-items: center; justify-content: center; line-height: 1.4;\"><%:Refresh%></button>\n    </div>\n\n    </div>\n</div>\n\n    <div id=\"userModal\" class=\"oaf-modal-overlay\">\n        <div class=\"oaf-modal-box\">\n            <h3><%:Select Device%></h3>\n            <div id=\"userList\" class=\"user-selection\">\n            </div>\n            <div style=\"margin-top: 20px; display: flex; justify-content: flex-end; gap: 10px;\">\n                <button type=\"button\" onclick=\"closeUserModal()\" style=\"padding: 7px 16px; border: 1px solid var(--border-color-medium, #d1d5db); border-radius: 4px; cursor: pointer; font-size: 13px; background: transparent;\"><%:Cancel%></button>\n                <button type=\"button\" onclick=\"addSelectedUsers()\" style=\"padding: 7px 16px; background-color: #1a73e8; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 13px; font-weight: 500;\"><%:OK%></button>\n            </div>\n        </div>\n    </div> \n\n    <div id=\"whitelistModal\" class=\"oaf-modal-overlay\">\n        <div class=\"oaf-modal-box\">\n            <h3><%:Select Device for Whitelist%></h3>\n            <div id=\"whitelistUserList\" class=\"user-selection\">\n            </div>\n            <div style=\"margin-top: 20px; display: flex; justify-content: flex-end; gap: 10px;\">\n                <button type=\"button\" onclick=\"closeWhitelistModal()\" style=\"padding: 7px 16px; border: 1px solid var(--border-color-medium, #d1d5db); border-radius: 4px; cursor: pointer; font-size: 13px; background: transparent;\"><%:Cancel%></button>\n                <button type=\"button\" onclick=\"addSelectedWhitelistUsers()\" style=\"padding: 7px 16px; background-color: #1a73e8; color: white; border: none; border-radius: 4px; cursor: pointer; font-size: 13px; font-weight: 500;\"><%:OK%></button>\n            </div>\n        </div>\n    </div>\n\n    <div id=\"modal\" style=\"display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: transparent; z-index: 1000; justify-content: center; align-items: center;\">\n        <div style=\"background-color: rgba(0, 0, 0, 0.65); padding: 14px 24px; border-radius: 6px; text-align: center; color: white; display: flex; justify-content: center; align-items: center;\">\n            <p style=\"margin: 0; color: white; font-size: 14px;\"><%:Settings saved successfully%></p>\n        </div>\n    </div>\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/view/admin_network/user_status.htm",
    "content": "<link rel=\"stylesheet\" href=\"<%=resource%>/css/common.css\">\n<% local dsp=require \"luci.dispatcher\" -%>\n\n<script type=\"text/javascript\" src=\"<%=resource%>/echarts.min.js?v=5.0\"></script>\n\n\t<script type=\"text/javascript\">//<![CDATA[\n\t\tlet visit_time_data = []; \n\t\tlet user_list_data = {\n\t\t\tlist: [\n\t\t\t\t\n\t\t\t]\n\t\t}\n\t\tlet cur_page = 1; // Start from page 1\n\t\tlet page_size = 10; // Fixed page size\n\t\tlet total_pages = 1;\n\t\tlet total_count = 0;\n\t\t\n\t\t// Visit list pagination variables\n\t\tlet visit_cur_page = 1;\n\t\tlet visit_page_size = 10;\n\t\tlet visit_total_pages = 1;\n\t\tlet visit_total_count = 0;\n\t\tlet current_mac = '';\n\n\t\tfunction getAllUsersData(page, size) {\n\t\t\tif (page === undefined) page = cur_page;\n\t\t\tif (size === undefined) size = page_size;\n\t\t\tnew XHR().get('<%=url('admin/network/get_all_users')%>', {flag: 3, page: page, page_size: size},\n\t\t\t\tfunction (x, data) {\n\t\t\t\t\tuser_list_data = data.data;\n\t\t\t\t\tif (data.data.total !== undefined) {\n\t\t\t\t\t\ttotal_count = data.data.total;\n\t\t\t\t\t\ttotal_pages = data.data.total_pages || 1;\n\t\t\t\t\t\tcur_page = data.data.page || 1;\n\t\t\t\t\t\t// page_size is fixed at 15, don't update from response\n\t\t\t\t\t}\n\t\t\t\t\trender_user_list(user_list_data);\n\t\t\t\t\tupdatePagination();\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\n\t\tfunction updatePagination() {\n\t\t\tvar paginationDiv = document.getElementById('pagination');\n\t\t\tif (!paginationDiv || total_pages <= 0) {\n\t\t\t\tif (paginationDiv) paginationDiv.innerHTML = '';\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t// Calculate page numbers to display (max 10 pages)\n\t\t\t// Try to show 5 pages on left and 5 pages on right of current page\n\t\t\tvar startPage = Math.max(1, cur_page - 5);\n\t\t\tvar endPage = Math.min(total_pages, cur_page + 5);\n\t\t\t\n\t\t\t// Adjust if we don't have 10 pages\n\t\t\tvar pageCount = endPage - startPage + 1;\n\t\t\tif (pageCount < 10) {\n\t\t\t\tif (startPage == 1) {\n\t\t\t\t\t// If at the beginning, extend to the right\n\t\t\t\t\tendPage = Math.min(total_pages, startPage + 9);\n\t\t\t\t} else if (endPage == total_pages) {\n\t\t\t\t\t// If at the end, extend to the left\n\t\t\t\t\tstartPage = Math.max(1, endPage - 9);\n\t\t\t\t} else {\n\t\t\t\t\t// In the middle, try to balance\n\t\t\t\t\tvar needed = 10 - pageCount;\n\t\t\t\t\tvar canExtendLeft = startPage - 1;\n\t\t\t\t\tvar canExtendRight = total_pages - endPage;\n\t\t\t\t\tif (canExtendLeft >= canExtendRight) {\n\t\t\t\t\t\tstartPage = Math.max(1, startPage - Math.min(needed, canExtendLeft));\n\t\t\t\t\t\tendPage = Math.min(total_pages, startPage + 9);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tendPage = Math.min(total_pages, endPage + Math.min(needed, canExtendRight));\n\t\t\t\t\t\tstartPage = Math.max(1, endPage - 9);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tvar html = '<div style=\"display: flex; align-items: center; justify-content: center; margin-top: 20px; padding: 15px 0;\">';\n\t\t\thtml += '<div style=\"display: flex; align-items: center; gap: 4px;\">';\n\t\t\t\n\t\t\t// Previous page link\n\t\t\tif (cur_page > 1) {\n\t\t\t\thtml += '<a href=\"javascript:void(0)\" onclick=\"goToPage(' + (cur_page - 1) + ')\" style=\"padding: 8px 12px; color: #1a73e8; text-decoration: none; cursor: pointer; border-radius: 4px;\"><%:Previous%></a>';\n\t\t\t} else {\n\t\t\t\thtml += '<span style=\"padding: 8px 12px; opacity: 0.4; cursor: default;\"><%:Previous%></span>';\n\t\t\t}\n\t\t\t\n\t\t\t// Page numbers\n\t\t\tfor (var i = startPage; i <= endPage; i++) {\n\t\t\t\tif (i == cur_page) {\n\t\t\t\t\thtml += '<span style=\"padding: 8px 12px; color: #1a73e8; font-weight: 500; cursor: default; border-radius: 4px;\">' + i + '</span>';\n\t\t\t\t} else {\n\t\t\t\t\thtml += '<a href=\"javascript:void(0)\" onclick=\"goToPage(' + i + ')\" style=\"padding: 8px 12px; text-decoration: none; cursor: pointer; border-radius: 4px;\">' + i + '</a>';\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// Next page link\n\t\t\tif (cur_page < total_pages) {\n\t\t\t\thtml += '<a href=\"javascript:void(0)\" onclick=\"goToPage(' + (cur_page + 1) + ')\" style=\"padding: 8px 12px; color: #1a73e8; text-decoration: none; cursor: pointer; border-radius: 4px;\"><%:Next%></a>';\n\t\t\t} else {\n\t\t\t\thtml += '<span style=\"padding: 8px 12px; opacity: 0.4; cursor: default;\"><%:Next%></span>';\n\t\t\t}\n\t\t\t\n\t\t\thtml += '</div>';\n\t\t\thtml += '<div style=\"margin-left: 20px; opacity: 0.6; font-size: 14px;\">';\n\t\t\thtml += '<%:Total%>: ' + total_count + ' | <%:Page%>: ' + cur_page + ' / ' + total_pages;\n\t\t\thtml += '</div>';\n\t\t\thtml += '</div>';\n\t\t\t\n\t\t\tpaginationDiv.innerHTML = html;\n\t\t}\n\n\t\tfunction goToPage(page) {\n\t\t\tif (page < 1) page = 1;\n\t\t\tif (page > total_pages && total_pages > 0) page = total_pages;\n\t\t\tcur_page = page;\n\t\t\tgetAllUsersData(cur_page, page_size);\n\t\t}\n\n\t\t\tlet currentView = 'table'; // 'table' or 'card'\n\n\t\tfunction switchView(view) {\n\t\t\tcurrentView = view;\n\t\t\tvar tableWrapper = document.getElementById('tableViewWrapper');\n\t\t\tvar cardWrapper = document.getElementById('cardViewWrapper');\n\t\t\tvar btnTable = document.getElementById('btnTableView');\n\t\t\tvar btnCard = document.getElementById('btnCardView');\n\n\t\t\tif (view === 'card') {\n\t\t\t\ttableWrapper.style.display = 'none';\n\t\t\t\tcardWrapper.style.display = 'grid';\n\t\t\t\tbtnTable.classList.remove('active');\n\t\t\t\tbtnCard.classList.add('active');\n\t\t\t} else {\n\t\t\t\ttableWrapper.style.display = 'block';\n\t\t\t\tcardWrapper.style.display = 'none';\n\t\t\t\tbtnTable.classList.add('active');\n\t\t\t\tbtnCard.classList.remove('active');\n\t\t\t}\n\t\t\tif (user_list_data && user_list_data.list) {\n\t\t\t\tif (view === 'card') render_card_view(user_list_data);\n\t\t\t}\n\t\t}\n\n\t\tfunction render_card_view(data) {\n\t\t\tvar container = document.getElementById('cardViewWrapper');\n\t\t\tif (!container || !data || !data.list) return;\n\t\t\tvar user_list = data.list;\n\t\t\tvar html = '';\n\n\t\t\tfor (var i = 0; i < user_list.length; i++) {\n\t\t\t\tvar u = user_list[i];\n\t\t\t\tvar nickname = u.nickname || \"\";\n\t\t\t\tvar hostname = u.hostname || \"\";\n\t\t\t\tvar displayName = nickname || hostname || \"--\";\n\t\t\t\tvar mac = u.mac || \"--\";\n\n\t\t\t\t// 在线状态\n\t\t\t\tvar statusClass = 'offline';\n\t\t\t\tvar statusText = '<%:Offline%>';\n\t\t\t\tif (u.online == 2) { statusClass = 'active'; statusText = '<%:Active%>'; }\n\t\t\t\telse if (u.online == 1) { statusClass = 'online'; statusText = '<%:Online%>'; }\n\n\t\t\t\tvar upRate = formatRate(u.up_rate, u.online);\n\t\t\t\tvar downRate = formatRate(u.down_rate, u.online);\n\n\t\t\t\tvar am_time = u.today_am_active_time || 0;\n\t\t\t\tvar pm_time = u.today_pm_active_time || 0;\n\t\t\t\tvar total_time = am_time + pm_time;\n\t\t\t\tvar time_str = formatTime(total_time);\n\t\t\t\tvar tooltip_text = \"<%:Morning%>: \" + formatTime(am_time) + \", <%:Afternoon%>: \" + formatTime(pm_time);\n\n\t\t\t\t// 今日流量\n\t\t\t\tvar today_up_flow = u.today_up_flow || 0;\n\t\t\t\tvar today_down_flow = u.today_down_flow || 0;\n\t\t\t\tvar total_flow = today_up_flow + today_down_flow;\n\t\t\t\tvar flow_str = formatFlow(total_flow);\n\n\t\t\t\tif (!Array.isArray(u.applist)) u.applist = [];\n\t\t\t\tvar app_icons = u.applist.slice(0, 5).map(function(app) {\n\t\t\t\t\tvar iconSrc = app.icon === 0 ? '<%=resource%>/app_icons/default.png' : '<%=resource%>/app_icons/' + app.id + '.png';\n\t\t\t\t\treturn '<img src=\"' + iconSrc + '\" alt=\"' + app.name + '\" title=\"' + app.name + '\" class=\"card-app-icon\">';\n\t\t\t\t}).join('');\n\t\t\t\tif (!app_icons) app_icons = '<span style=\"opacity:0.4;font-size:12px;\">--</span>';\n\n\t\t\t\thtml += '<div class=\"user-card ' + (u.online == 0 ? 'user-card--offline' : '') + '\" onclick=\"showDetails(\\'' + mac + '\\')\">';\n\t\t\t\thtml += '<span class=\"card-status card-status--' + statusClass + '\">' + statusText + '</span>';\n\t\t\t\thtml += '<div class=\"card-device\">';\n\t\t\t\thtml += '<div class=\"card-name\">' + displayName + '</div>';\n\t\t\t\thtml += '<div class=\"card-mac\">' + mac + '</div>';\n\t\t\t\thtml += '</div>';\n\t\t\t\thtml += '<div class=\"card-rate\">';\n\t\t\t\thtml += '<span class=\"card-rate-item\" title=\"<%:Up Rate%>\"><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"#34a853\"><path d=\"M6 1L10 6H7v5H5V6H2z\"/></svg> ' + upRate + '</span>';\n\t\t\t\thtml += '<span class=\"card-rate-item\" title=\"<%:Down Rate%>\"><svg width=\"12\" height=\"12\" viewBox=\"0 0 12 12\" fill=\"#4285f4\"><path d=\"M6 11L2 6h3V1h2v5h3z\"/></svg> ' + downRate + '</span>';\n\t\t\t\thtml += '</div>';\n\t\t\t\tvar current_app = u.app || \"\";\n\t\t\t\tvar current_url = u.url || \"\";\n\t\t\t\tvar display_url = current_url;\n\t\t\t\tif (current_url.length > 18) {\n\t\t\t\t\tdisplay_url = current_url.substring(0, 8) + '...' + current_url.substring(current_url.length - 8);\n\t\t\t\t}\n\t\t\t\thtml += '<div class=\"card-visiting\">';\n\t\t\t\thtml += '<span class=\"card-visiting-label\"><%:Visiting%>: </span>';\n\t\t\t\tif (current_app || current_url) {\n\t\t\t\t\tif (current_app) html += '<span class=\"card-visiting-app\">' + current_app + '</span>';\n\t\t\t\t\tif (current_url) html += '<span class=\"card-visiting-url\" title=\"' + current_url + '\">' + display_url + '</span>';\n\t\t\t\t} else {\n\t\t\t\t\thtml += '<span class=\"card-visiting-none\">--</span>';\n\t\t\t\t}\n\t\t\t\thtml += '</div>';\n\t\t\t\thtml += '<div class=\"card-info\">';\n\t\t\t\thtml += '<div class=\"card-apps\">' + app_icons + '</div>';\n\t\t\t\thtml += '<div style=\"display: flex; gap: 12px; align-items: center;\">';\n\t\t\t\thtml += '<div class=\"card-time\" title=\"' + tooltip_text + '\">' + time_str + '</div>';\n\t\t\t\thtml += '<div class=\"card-flow\" title=\"<%:Today Flow%>\">' + flow_str + '</div>';\n\t\t\t\thtml += '</div>';\n\t\t\t\thtml += '</div>';\n\t\t\t\thtml += '</div>';\n\t\t\t}\n\n\t\t\tcontainer.innerHTML = html;\n\t\t}\n\n\t\twindow.onload = function() {\n\t\t\tcur_page = 1;\n\t\t\tgetAllUsersData(cur_page, page_size);\n\t\t\tif (window.innerWidth <= 768) {\n\t\t\t\tswitchView('card');\n\t\t\t}\n\n\t\t\tsetInterval(function() {\n\t\t\t\tgetAllUsersData(cur_page, page_size);\n\t\t\t}, 3000);\n\t\t}\n\n\t\tfunction showSuccessMessage(message = '<%:Settings saved successfully%>') {\n\t\t\tconst modal = document.getElementById('modal');\n\t\t\tconst messageElement = modal.querySelector('p');\n\t\t\tmessageElement.textContent = message;\n\t\t\tmodal.style.display = 'flex';\n\t\t\tsetTimeout(() => {\n\t\t\t\tmodal.style.display = 'none';\n\t\t\t}, 1000);\n\t\t}\n\n\t\tfunction formatTime(minutes) {\n\t\n\t\t\tif (minutes === undefined || minutes === null || minutes === '') {\n\t\t\t\treturn '0m';\n\t\t\t}\n\t\t\tvar mins = parseInt(minutes);\n\t\t\tif (isNaN(mins) || mins < 0) {\n\t\t\t\treturn '0m';\n\t\t\t}\n\n\t\t\tif (mins < 60) {\n\t\t\t\treturn mins + 'm';\n\t\t\t}\n\t\t\n\t\t\tvar hours = Math.floor(mins / 60);\n\t\t\tvar remainingMins = mins % 60;\n\t\t\tif (remainingMins === 0) {\n\t\t\t\treturn hours + 'h';\n\t\t\t} else {\n\t\t\t\treturn hours + 'h ' + remainingMins + 'm';\n\t\t\t}\n\t\t}\n\n\t\tfunction formatRate(kbps, isOnline) {\n\t\t\tif (isOnline !== undefined && isOnline == 0) {\n\t\t\t\treturn '--';\n\t\t\t}\n\n\t\t\tvar rate = 0;\n\t\t\tif (kbps !== undefined && kbps !== null && kbps !== '') {\n\t\t\t\trate = parseFloat(kbps);\n\t\t\t\tif (isNaN(rate) || rate < 0) {\n\t\t\t\t\trate = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\trate = Math.round(rate);\n\t\t\tif (rate >= 1024) {\n\t\t\t\treturn (rate / 1024).toFixed(1) + ' MB/s';\n\t\t\t} else {\n\t\t\t\treturn rate + ' KB/s';\n\t\t\t}\n\t\t}\n\n\t\tfunction formatFlow(kb) {\n\t\t\tif (kb === undefined || kb === null || kb === '') {\n\t\t\t\treturn '0 KB';\n\t\t\t}\n\t\t\t// Use parseFloat to handle large numbers correctly\n\t\t\tvar totalKB = parseFloat(kb);\n\t\t\tif (isNaN(totalKB) || totalKB < 0) {\n\t\t\t\treturn '0 KB';\n\t\t\t}\n\t\t\t// Round to integer for KB\n\t\t\ttotalKB = Math.round(totalKB);\n\t\t\tif (totalKB === 0) {\n\t\t\t\treturn '0 KB';\n\t\t\t}\n\t\t\t// Convert to appropriate unit (input is in KB)\n\t\t\tif (totalKB < 1024) {\n\t\t\t\t// KB - no decimal\n\t\t\t\treturn totalKB + ' KB';\n\t\t\t} else if (totalKB < 1024 * 1024) {\n\t\t\t\t// MB - one decimal\n\t\t\t\treturn (totalKB / 1024).toFixed(1) + ' MB';\n\t\t\t} else if (totalKB < 1024 * 1024 * 1024) {\n\t\t\t\t// GB - one decimal\n\t\t\t\treturn (totalKB / (1024 * 1024)).toFixed(1) + ' GB';\n\t\t\t} else {\n\t\t\t\t// TB - one decimal\n\t\t\t\treturn (totalKB / (1024 * 1024 * 1024)).toFixed(1) + ' TB';\n\t\t\t}\n\t\t}\n\n\t\tfunction render_user_list(data) {\n\t\t\tvar tb = document.getElementById('user_status_table');\n\t\t\tvar tbody = tb ? tb.querySelector('tbody') : null;\n\t\t\tvar user_list = data.list;\n\t\t\tif (user_list && tbody) {\n\t\t\t\ttbody.innerHTML = '';\n\t\t\t\tfor (var i = 0; i < user_list.length; i++) {\n\t\t\t\t\tvar nickname = user_list[i].nickname || \"\";\n\t\t\t\t\tvar hostname = user_list[i].hostname || \"\";\n\t\t\t\t\tvar displayName = nickname || hostname || \"--\";\n\n\t\t\t\t\tvar tr = tbody.insertRow(-1);\n\t\t\t\t\ttr.className = 'tr';\n\t\t\t\t\tif (user_list[i].online == 0) {\n\t\t\t\t\t\ttr.style.color = '#A9A9A9'; \n\t\t\t\t\t}\n\t\t\t\t\ttr.insertCell(-1).innerHTML = `\n\t\t\t\t\t\t<div style=\"display: flex; align-items: center;\">\n\t\t\t\t\t\t\t<div>\n\t\t\t\t\t\t\t\t<div>${displayName}</div>\n\t\t\t\t\t\t\t\t<div>${user_list[i].mac}</div>\n\t\t\t\t\t\t\t</div>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;\n\t\t\t\t\ttr.insertCell(-1).innerHTML = user_list[i].ip;\n\t\t\t\t\ttr.insertCell(-1).innerHTML = formatRate(user_list[i].up_rate, user_list[i].online);\n\t\t\t\t\ttr.insertCell(-1).innerHTML = formatRate(user_list[i].down_rate, user_list[i].online);\n\t\t\t\t\t\n\t\t\t\t\tvar am_time = user_list[i].today_am_active_time || 0;\n\t\t\t\t\tvar pm_time = user_list[i].today_pm_active_time || 0;\n\t\t\t\t\tvar total_time = am_time + pm_time;\n\t\t\t\t\tvar time_str = formatTime(total_time);\n\t\t\t\t\tvar tooltip_text = \"<%:Morning%>: \" + formatTime(am_time) + \", <%:Afternoon%>: \" + formatTime(pm_time);\n\t\t\t\t\ttr.insertCell(-1).innerHTML = `<span title=\"${tooltip_text}\" style=\"cursor: help;\">${time_str}</span>`;\n\t\t\t\t\t\n\t\t\t\t\t// 今日流量\n\t\t\t\t\tvar today_up_flow = user_list[i].today_up_flow || 0;\n\t\t\t\t\tvar today_down_flow = user_list[i].today_down_flow || 0;\n\t\t\t\t\tvar total_flow = today_up_flow + today_down_flow;\n\t\t\t\t\tvar flow_str = formatFlow(total_flow);\n\t\t\t\t\ttr.insertCell(-1).innerHTML = flow_str;\n\t\t\t\t\t\n\t\t\t\t     if (!Array.isArray(user_list[i].applist))           \n                         user_list[i].applist = [] \n\t\t\t\t\tvar app_list_str = user_list[i].applist.map(app => {\n\t\t\t\t\t\tvar iconSrc = app.icon === 0 ? '<%=resource%>/app_icons/default.png' : `<%=resource%>/app_icons/${app.id}.png`;\n\t\t\t\t\t\treturn `<img src=\"${iconSrc}\" alt=\"${app.name}\" title=\"${app.name}\" style=\"width: 20px; height: 20px; border-radius: 5px; margin-right: 8px;\">`;\n\t\t\t\t\t}).join(\"\") || \"--\";\n\t\t\t\t\ttr.insertCell(-1).innerHTML = app_list_str;\n\t\t\t\t\tvar current_app = user_list[i].app || \"--\";\n\t\t\t\t\ttr.insertCell(-1).innerHTML = current_app;\n\t\t\t\t\tvar current_url = user_list[i].url || \"--\";\n\t\t\t\t\tvar display_url = current_url;\n\t\t\t\t\tif (current_url !== \"--\" && current_url.length > 18) {\n\t\t\t\t\t\tdisplay_url = current_url.substring(0, 8) + \"...\" + current_url.substring(current_url.length - 8);\n\t\t\t\t\t}\n\t\t\t\t\ttr.insertCell(-1).innerHTML = `<span title=\"${current_url}\">${display_url}</span>`;\n\t\t\t\t\tvar online_status_html = \"\";\n\t\t\t\t\tif (user_list[i].online == 2) {\n\t\t\t\t\t\tonline_status_html = `<span style=\"color: #1a73e8;\"><%:Active%></span>`;\n\t\t\t\t\t} else if (user_list[i].online == 1) {\n\t\t\t\t\t\tonline_status_html = `<span style=\"color: green;\"><%:Online%></span>`;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tonline_status_html = \"<%:Offline%>\";\n\t\t\t\t\t}\n\t\t\t\t\ttr.insertCell(-1).innerHTML = online_status_html;\n\t\t\t\t\ttr.insertCell(-1).innerHTML = `\n\t\t\t\t\t\t<button type=\"button\" class=\"cbi-button cbi-button-add\" onclick=\"showDetails('${user_list[i].mac}')\" style=\"margin-right: 5px;\"><%:Details%></button>\n\t\t\t\t\t\t<button type=\"button\" class=\"cbi-button cbi-button-add\" onclick=\"showModifyNickname('${user_list[i].mac}')\"><%:Remark%></button>\n\t\t\t\t\t`;\n\n\t\t\t\t\t\n\t\t\t\t\tvar childs = tr.childNodes;\n\t\t\t\t\tArray.prototype.forEach.call(childs, function (child) {\n\t\t\t\t\t\tchild.className = 'td';\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (currentView === 'card') {\n\t\t\t\trender_card_view(data);\n\t\t\t}\n\t\t}\n\n\t\tfunction render_visit_list_table(data) {\n\t\t\tvar tb = document.getElementById('visit_list_table');\n\t\t\tvar tbody = tb ? tb.querySelector('tbody') : null;\n\t\t\tvar visit_list = data.list;\n\t\t\tif (visit_list && tbody) {\n\t\t\t\ttbody.innerHTML = '';\n\t\t\t\tfor (var i = 0; i < visit_list.length; i++) {\n\t\t\t\t\tvar action_status = visit_list[i].act == 1 ? \n\t\t\t\t\t\t'<span style=\"color: red;\"><%:Filtered%></span>' : \n\t\t\t\t\t\t'<span style=\"color: green;\"><%:Unfiltered%></span>';\n\t\t\t\t\tvar hostname = visit_list[i].hostname == \"\" || visit_list[i].hostname == \"*\" ? \"--\" : visit_list[i].hostname;\n\t\t\t\t\tvar tr = tbody.insertRow(-1);\n\t\t\t\t\ttr.className = 'tr';\n\n\t\t\t\t\tvar iconSrc = visit_list[i].icon === 0 ? '<%=resource%>/app_icons/default.png' : `<%=resource%>/app_icons/${visit_list[i].id}.png`;\n\t\t\t\t\ttr.insertCell(-1).innerHTML = `\n\t\t\t\t\t\t<div style=\"height: 24px; display: flex; align-items: center;\">\n\t\t\t\t\t\t\t<img src=\"${iconSrc}\" alt=\"${visit_list[i].name}\" title=\"${visit_list[i].name}\" style=\"width: 20px; height: 20px; border-radius: 5px; margin-right: 4px;\">\n\t\t\t\t\t\t\t<span>${visit_list[i].name}</span>\n\t\t\t\t\t\t</div>\n\t\t\t\t\t`;\n\n\n\t\t\t\t\tvar first_time_date = new Date(visit_list[i].ft * 1000);\n\t\t\t\t\tvar first_time_str = first_time_date.toLocaleString(); \n\n\t\t\t\t\tvar latest_time_date = new Date(visit_list[i].lt * 1000); \n\t\t\t\t\tvar latest_time_str = latest_time_date.toLocaleString(); \n\n\t\t\t\t\ttr.insertCell(-1).innerHTML = first_time_str;\n\t\t\t\t\ttr.insertCell(-1).innerHTML = latest_time_str;\n\t\t\t\t\tvar hour = parseInt(visit_list[i].tt / 3600);\n\t\t\t\t\tvar seconds = visit_list[i].tt % 3600;\n\t\t\t\t\tvar min = parseInt(seconds / 60)\n\t\t\t\t\tvar total_time_str;\n\t\t\t\t\tif (visit_list[i].act == 1)\n\t\t\t\t\t\ttotal_time_str = \"-\"\n\t\t\t\t\telse {\n\t\t\t\t\t\tif (hour > 0)\n\t\t\t\t\t\t\ttotal_time_str = hour + \"<%:h%>\" + min + \"<%:m%>\"\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tif (min == 0)\n\t\t\t\t\t\t\t\tmin = 1;\n\t\t\t\t\t\t\ttotal_time_str = min + \"<%:m%>\"\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t\ttr.insertCell(-1).innerHTML = total_time_str;\n\t\t\t\t\ttr.insertCell(-1).innerHTML = action_status;\n\n\t\t\t\t\tvar childs = tr.childNodes;\n\t\t\t\t\tArray.prototype.forEach.call(childs, function (child) {\n\t\t\t\t\t\tchild.className = 'td';\n\t\t\t\t\t});\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\n\t\tfunction showDetails(mac) {\n\t\t\tvar modal = document.getElementById('detailsModal');\n\t\t\tmodal.style.display = 'flex';\n\t\t\tupdateDeviceInfoTitle(mac);\n\t\t\tcurrent_mac = mac;\n\t\t\tvisit_cur_page = 1; // Reset to first page when opening details\n\n\t\t\tnew XHR().get('<%=url('admin/network/dev_visit_time')%>/' + mac, null,\n\t\t\t\tfunction (x, st) {\n\t\t\t\t\tvisit_time_data = st;\n\t\t\t\t\tdisplay_app_visit_view(visit_time_data);\n\t\t\t\t}\n\t\t\t);\n\n\t\t\tgetVisitListData(mac, visit_cur_page, visit_page_size);\n\t\t}\n\t\t\n\t\tfunction getVisitListData(mac, page, size) {\n\t\t\tif (page === undefined) page = visit_cur_page;\n\t\t\tif (size === undefined) size = visit_page_size;\n\t\t\tnew XHR().get('<%=url('admin/network/dev_visit_list')%>/' + mac, {page: page, page_size: size},\n\t\t\t\tfunction (x, st) {\n\t\t\t\t\tvisit_list_data = st;\n\t\t\t\t\tif (st.total !== undefined) {\n\t\t\t\t\t\tvisit_total_count = st.total;\n\t\t\t\t\t\tvisit_total_pages = st.total_pages || 1;\n\t\t\t\t\t\tvisit_cur_page = st.page || 1;\n\t\t\t\t\t\tvisit_page_size = st.page_size || 10;\n\t\t\t\t\t}\n\t\t\t\t\trender_visit_list_table(visit_list_data);\n\t\t\t\t\tupdateVisitListPagination();\n\t\t\t\t}\n\t\t\t);\n\t\t}\n\t\t\n\t\tfunction updateVisitListPagination() {\n\t\t\tvar paginationDiv = document.getElementById('visitListPagination');\n\t\t\tif (!paginationDiv || visit_total_pages <= 0) {\n\t\t\t\tif (paginationDiv) paginationDiv.innerHTML = '';\n\t\t\t\treturn;\n\t\t\t}\n\t\t\t\n\t\t\t// Calculate page numbers to display (max 10 pages)\n\t\t\t// Try to show 5 pages on left and 5 pages on right of current page\n\t\t\tvar startPage = Math.max(1, visit_cur_page - 5);\n\t\t\tvar endPage = Math.min(visit_total_pages, visit_cur_page + 5);\n\t\t\t\n\t\t\t// Adjust if we don't have 10 pages\n\t\t\tvar pageCount = endPage - startPage + 1;\n\t\t\tif (pageCount < 10) {\n\t\t\t\tif (startPage == 1) {\n\t\t\t\t\t// If at the beginning, extend to the right\n\t\t\t\t\tendPage = Math.min(visit_total_pages, startPage + 9);\n\t\t\t\t} else if (endPage == visit_total_pages) {\n\t\t\t\t\t// If at the end, extend to the left\n\t\t\t\t\tstartPage = Math.max(1, endPage - 9);\n\t\t\t\t} else {\n\t\t\t\t\t// In the middle, try to balance\n\t\t\t\t\tvar needed = 10 - pageCount;\n\t\t\t\t\tvar canExtendLeft = startPage - 1;\n\t\t\t\t\tvar canExtendRight = visit_total_pages - endPage;\n\t\t\t\t\tif (canExtendLeft >= canExtendRight) {\n\t\t\t\t\t\tstartPage = Math.max(1, startPage - Math.min(needed, canExtendLeft));\n\t\t\t\t\t\tendPage = Math.min(visit_total_pages, startPage + 9);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tendPage = Math.min(visit_total_pages, endPage + Math.min(needed, canExtendRight));\n\t\t\t\t\t\tstartPage = Math.max(1, endPage - 9);\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tvar html = '<div style=\"display: flex; align-items: center; justify-content: center; margin-top: 20px; padding: 15px 0;\">';\n\t\t\thtml += '<div style=\"display: flex; align-items: center; gap: 4px;\">';\n\t\t\t\n\t\t\t// Previous page link\n\t\t\tif (visit_cur_page > 1) {\n\t\t\t\thtml += '<a href=\"javascript:void(0)\" onclick=\"goToVisitPage(' + (visit_cur_page - 1) + ')\" style=\"padding: 8px 12px; color: #1a73e8; text-decoration: none; cursor: pointer; border-radius: 4px;\"><%:Previous%></a>';\n\t\t\t} else {\n\t\t\t\thtml += '<span style=\"padding: 8px 12px; opacity: 0.4; cursor: default;\"><%:Previous%></span>';\n\t\t\t}\n\t\t\t\n\t\t\t// Page numbers\n\t\t\tfor (var i = startPage; i <= endPage; i++) {\n\t\t\t\tif (i == visit_cur_page) {\n\t\t\t\t\thtml += '<span style=\"padding: 8px 12px; color: #1a73e8; font-weight: 500; cursor: default; border-radius: 4px;\">' + i + '</span>';\n\t\t\t\t} else {\n\t\t\t\t\thtml += '<a href=\"javascript:void(0)\" onclick=\"goToVisitPage(' + i + ')\" style=\"padding: 8px 12px; text-decoration: none; cursor: pointer; border-radius: 4px;\">' + i + '</a>';\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\t// Next page link\n\t\t\tif (visit_cur_page < visit_total_pages) {\n\t\t\t\thtml += '<a href=\"javascript:void(0)\" onclick=\"goToVisitPage(' + (visit_cur_page + 1) + ')\" style=\"padding: 8px 12px; color: #1a73e8; text-decoration: none; cursor: pointer; border-radius: 4px;\"><%:Next%></a>';\n\t\t\t} else {\n\t\t\t\thtml += '<span style=\"padding: 8px 12px; opacity: 0.4; cursor: default;\"><%:Next%></span>';\n\t\t\t}\n\t\t\t\n\t\t\thtml += '</div>';\n\t\t\thtml += '<div style=\"margin-left: 20px; opacity: 0.6; font-size: 14px;\">';\n\t\t\thtml += '<%:Total%>: ' + visit_total_count + ' | <%:Page%>: ' + visit_cur_page + ' / ' + visit_total_pages;\n\t\t\thtml += '</div>';\n\t\t\thtml += '</div>';\n\t\t\t\n\t\t\tpaginationDiv.innerHTML = html;\n\t\t}\n\t\t\n\t\tfunction goToVisitPage(page) {\n\t\t\tif (page < 1) page = 1;\n\t\t\tif (page > visit_total_pages && visit_total_pages > 0) page = visit_total_pages;\n\t\t\tvisit_cur_page = page;\n\t\t\tgetVisitListData(current_mac, visit_cur_page, visit_page_size);\n\t\t}\n\n\t\tfunction updateDeviceInfoTitle(mac) {\n\t\t\tvar deviceInfo = '(' + mac + ')';\n\t\t\t\n\t\t\tif (user_list_data && user_list_data.list) {\n\t\t\t\tvar device = user_list_data.list.find(function(user) {\n\t\t\t\t\treturn user.mac === mac;\n\t\t\t\t});\n\t\t\t\t\n\t\t\t\tif (device) {\n\t\t\t\t\tif (device.nickname && device.nickname.trim() !== '') {\n\t\t\t\t\t\tdeviceInfo = '(' + device.nickname + ')';\n\t\t\t\t\t} else if (device.hostname && device.hostname.trim() !== '') {\n\t\t\t\t\t\tdeviceInfo = '(' + device.hostname + ')';\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\t\n\t\t\tdocument.getElementById('deviceInfo').textContent = deviceInfo;\n\t\t}\n\n\t\tfunction showModifyNickname(mac) {\n\t\t\tvar modal = document.getElementById('nicknameModal');\n\t\t\tmodal.style.display = 'flex';\n\t\t\tdocument.getElementById('nicknameMac').value = mac;\n\t\t\tdocument.getElementById('nicknameMacDisplay').textContent = mac;\n\t\t\tdocument.getElementById('nicknameInput').value = '';\n\t\t}\n\n\t\tfunction validateNickname(nickname) {\n\t\t\tconst invalidChars = /[\\s'\"]/;\n\t\t\treturn !invalidChars.test(nickname) && nickname.length <= 32;\n\t\t}\n\n\t\tfunction submitNicknameChange() {\n\t\t\tvar mac = document.getElementById('nicknameMac').value;\n\t\t\tvar nickname = document.getElementById('nicknameInput').value;\n\n\t\t\tif (!validateNickname(nickname)) {\n\t\t\t\talert('<%:Please enter a valid remark%>');\n\t\t\t\treturn;\n\t\t\t}\n\n\t\t\tnew XHR().post('<%=url('admin/network/set_nickname')%>', \n\t\t\t{ mac: mac, nickname: nickname },\n\t\t\tfunction(x, data) {\n\t\t\t\tconsole.log('Nickname updated successfully');\n\t\t\t\tcloseModal('nicknameModal');\n\t\t\t\tshowSuccessMessage('<%:Settings saved successfully%>');\n\t\t\t\tgetAllUsersData(cur_page, page_size);\n\t\t\t});\n\t\t}\n\n\t\tfunction closeModal(modalId) {\n\t\t\tvar modal = document.getElementById(modalId);\n\t\t\tif (modal) {\n\t\t\t\tmodal.style.display = 'none';\n\t\t\t}\n\t\t}\n\n\t\tfunction showTabContent(tabId) {\n\t\t\tvar tabs = document.querySelectorAll('.tab-body');\n\t\t\tvar tabItems = document.querySelectorAll('.tab-item');\n\n\t\t\ttabs.forEach(function(tab) {\n\t\t\t\ttab.classList.remove('active');\n\t\t\t});\n\n\t\t\ttabItems.forEach(function(item) {\n\t\t\t\titem.classList.remove('active');\n\t\t\t});\n\n\t\t\tdocument.getElementById(tabId).classList.add('active');\n\t\t\tdocument.querySelector('.tab-item[onclick=\"showTabContent(\\'' + tabId + '\\')\"]').classList.add('active');\n\t\t}\n\n    function get_display_time(total_time) {\n        var hour = parseInt(total_time / 3600);\n        var seconds = total_time % 3600;\n        var min = parseInt(seconds / 60)\n        var seconds2 = seconds % 60;\n        var total_time_str;\n\n        if (hour > 0)\n            total_time_str = hour + \"<%:h%>\" + min + \"<%:m%>\"\n        else {\n            if (min == 0 && seconds2 != 0)\n                min = 1;\n            total_time_str = min + \"<%:m%>\"\n        }\n        return total_time_str;\n    }\n\n    function display_app_visit_view(data) {\n        var chartElement = document.getElementById('app_time_chart');\n        if (!chartElement) {\n            console.error(\"Chart element not found\");\n            return;\n        }\n        var myChart = echarts.init(chartElement);\n        if (!data) {\n            return;\n        }\n\t\tvar total_time = 0\n\t\tvar app_stat_array = new Array();\n\t\tif (data.length == 0){\n\t\t\tvar app_obj ={}\n\t\t\tapp_obj.name = \"<%:Unknown App%>\"\n\t\t\tapp_obj.value = 0\n\t\t\tapp_obj.legendname = app_obj.name\n\t\t\tapp_stat_array.push(app_obj)\n\t\t}\n\t\telse{\n\t\t\tfor (var i = 0; i < data.length; i++) {\n\t\t\t\tvar app_obj = {};\n\t\t\t\tapp_obj.value = data[i].t;\n\t\t\t\tapp_obj.legendname = data[i].name;\n\t\t\t\tvar tmp_time = get_display_time(data[i].t);\n\t\t\t\tapp_obj.name = data[i].name + \"  \" + tmp_time;\n\t\t\t\ttotal_time += data[i].t\n\t\t\t\tapp_stat_array.push(app_obj);\n\t\t\t}\n\t\t}\n        var total_time_str = get_display_time(total_time);\n        var option = {\n\t\t\tgrid:{\n\t\t\t},\n \n            color: [\n                '#5470c6', '#91cc75', '#fac858', '#ee6666', '#73c0de',\n                '#3ba272', '#fc8452', '#9a60b4', '#ea7ccc', '#ff9f7f',\n                '#ffdb5c', '#c23531', '#2f4554', '#61a0a8', '#d48265',\n                '#91c7ae', '#749f83', '#ca8622', '#bda29a', '#6e7074'\n            ],\n            title: [\n                {\n                    text: \"<%:App Time Statistics%>\",\n                    textStyle: {\n                        fontSize: 16,\n                        color: \"black\"\n                    },\n                    left: \"2%\"\n                },\n                {\n                    text: '',\n                    subtext: total_time_str,\n                    textStyle: {\n                        fontSize: 15,\n                        color: \"black\"\n                    },\n                    subtextStyle: {\n                        fontSize: 15,\n                        color: 'black'\n                    },\n                    textAlign: \"center\",\n                    x: '34.5%',\n                    y: '44%',\n                }],\n            tooltip: {\n                trigger: 'item',\n                formatter: function (parms) {\n                    var total_time = get_display_time(parms.data.value);\n                    var str = parms.seriesName + \"</br>\" +\n                        parms.marker + \"\" + parms.data.legendname + \"</br>\" +\n                        \"<%:Visit Time%>: \" + total_time + \"</br>\" +\n                        \"<%:Percentage%>: \" + parms.percent + \"%\";\n                    return str;\n                }\n            },\n            legend: {\n                type: \"scroll\",\n                orient: 'vertical',\n                left: '75%',\n                align: 'left',\n                top: 'middle',\n                textStyle: {\n                    color: '#8C8C8C'\n                },\n                height: 250\n            },\n            series: [\n                {\n                    name: \"<%:Visit Time%>\",\n                    type: 'pie',\n                    radius: ['58%', '70%'],\n                    center: ['35%', '50%'], \n                    clockwise: false,\n                    avoidLabelOverlap: true,\n                    itemStyle: {\n                        borderRadius: 1,\n                        borderColor: \"#fff\",\n                        borderWidth: 1,\n                    },\n                    label: {\n                        show: true,\n                        position: 'outside',\n                        formatter: '{b}: {c} ({d}%)',\n                        normal: {\n                            show: true,\n                            position: 'outter',\n                            formatter: function (parms) {\n                                return parms.data.legendname\n                            }\n                        }\n                    },\n                    labelLine: {\n                        show: true,\n                        length: 8,\n                        length2: 7,\n                        smooth: true,\n                    },\n                    data: app_stat_array\n                }\n            ]\n        };\n\n        myChart.setOption(option);\n    }\n\n//]]></script>\n\n<div class=\"view-toggle\">\n\t<button type=\"button\" class=\"view-toggle-btn active\" id=\"btnTableView\" onclick=\"switchView('table')\" title=\"<%:Table View%>\">\n\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M0 2a2 2 0 0 1 2-2h12a2 2 0 0 1 2 2v12a2 2 0 0 1-2 2H2a2 2 0 0 1-2-2V2zm15 2h-4v3h4V4zm0 4h-4v3h4V8zm0 4h-4v3h3a1 1 0 0 0 1-1v-2zm-5 3v-3H6v3h4zm-5 0v-3H1v2a1 1 0 0 0 1 1h3zm-4-4h4V8H1v3zm0-4h4V4H1v3zm5-3v3h4V4H6zm4 4H6v3h4V8z\"/></svg>\n\t</button>\n\t<button type=\"button\" class=\"view-toggle-btn\" id=\"btnCardView\" onclick=\"switchView('card')\" title=\"<%:Card View%>\">\n\t\t<svg width=\"16\" height=\"16\" viewBox=\"0 0 16 16\" fill=\"currentColor\"><path d=\"M1 2a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V2zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V2zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1V2zM1 7a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1V7zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1V7zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1V7zM1 12a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H2a1 1 0 0 1-1-1v-2zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1H7a1 1 0 0 1-1-1v-2zm5 0a1 1 0 0 1 1-1h2a1 1 0 0 1 1 1v2a1 1 0 0 1-1 1h-2a1 1 0 0 1-1-1v-2z\"/></svg>\n\t</button>\n</div>\n\n<div style=\"max-height: 750px; overflow-y: auto;padding-right: 20px;\">\n\n\t<div class=\"cbi-section cbi-tblsection\">\n\n\t\t<div id=\"tableViewWrapper\" style=\"overflow-x: auto; min-width: 1200px;\">\n\n\t\t<table class=\"table cbi-section-table\" id=\"user_status_table\" style=\"table-layout: fixed; min-width: 1200px; width: 100%;\">\n\t\t\t<thead>\n\t\t\t\t<tr class=\"tr\">\n\t\t\t\t\t<th class=\"th\" style=\"width: 115px;\">\n\t\t\t\t\t\t<%:Device Info%>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th class=\"th\" style=\"width: 100px;\">\n\t\t\t\t\t\t<%:IP Address%>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th class=\"th\" style=\"width: 80px;\">\n\t\t\t\t\t\t<%:Up Rate%>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th class=\"th\" style=\"width: 80px;\">\n\t\t\t\t\t\t<%:Down Rate%>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th class=\"th\" style=\"width: 100px;\">\n\t\t\t\t\t\t<%:Today Active Time%>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th class=\"th\" style=\"width: 100px;\">\n\t\t\t\t\t\t<%:Today Flow%>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th class=\"th\" style=\"width: 160px; white-space: nowrap;\">\n\t\t\t\t\t\t<%:Common App(TOP5)%>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th class=\"th\" style=\"width: 85px;\">\n\t\t\t\t\t\t<%:Active App%>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th class=\"th\" style=\"width: 155px; white-space: nowrap;\">\n\t\t\t\t\t\t<%:Current URL%>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th class=\"th\" style=\"width: 70px;\">\n\t\t\t\t\t\t<%:Online Status%>\n\t\t\t\t\t</th>\n\t\t\t\t\t<th class=\"th\" style=\"width: 120px;\">\n\t\t\t\t\t\t<%:Actions%>\n\t\t\t\t\t</th>\n\t\t\t\t</tr>\n\t\t\t</thead>\n\t\t\t<tbody>\n\t\t\t\t<tr class=\"tr\">\n\t\t\t\t\t<td class=\"td\" colspan=\"11\"><em><br />\n\t\t\t\t\t\t\t<%:Collecting data...%>\n\t\t\t\t\t\t</em></td>\n\t\t\t\t</tr>\n\t\t\t</tbody>\n\t\t</table>\n\n\t\t</div>\n\n\t\t<div id=\"cardViewWrapper\" class=\"card-grid\" style=\"display: none;\"></div>\n\t\t\n\t\t<!-- Pagination -->\n\t\t<div id=\"pagination\"></div>\n\t</div>\n</div>\n<!-- Details Modal -->\n<div id=\"detailsModal\" class=\"oaf-modal-overlay\">\n    <div class=\"oaf-modal-box\" style=\"width: 820px; height: 620px;\">\n        <button type=\"button\" onclick=\"closeModal('detailsModal')\" class=\"oaf-modal-close\">&times;</button>\n        <h4 class=\"oaf-modal-title\"><%:Device Details%> <span id=\"deviceInfo\" style=\"opacity: 0.5; font-size: 14px; font-weight: normal;\"></span></h4>\n        \n        <!-- Tab List -->\n        <ul class=\"tab-list\">\n            <!-- <li class=\"tab-item onclick=\"showTabContent('tab1')\">基本信息</li> -->\n            <li class=\"tab-item active\" onclick=\"showTabContent('tab2')\"><%:App Statistics%></li>\n\t\t\t<li class=\"tab-item\" onclick=\"showTabContent('tab3')\"><%:Access Records%></li>\n        </ul>\n\n        <div id=\"tab2\" class=\"tab-body active\">\n\t\t\t<div class=\"pie-chart\">\n\t\t\t\t<div id=\"app_time_chart\" style=\"width:100%;height: 350px;\">\n\t\t\t\t</div>\n\t\t\t</div>\n        </div>\n\n\t\t<div id=\"tab3\" class=\"tab-body\">\n\t\t\t<div style=\"max-height: 320px; overflow-y: auto;padding-right: 20px;\"> <!-- Added container with fixed height and overflow, reduced height to make room for pagination -->\n\t\t\t\t<table class=\"table cbi-section-table\" id=\"visit_list_table\">\n\t\t\t\t\t<thead>\n\t\t\t\t\t\t<tr class=\"tr table-titles\">\n\t\t\t\t\t\t\t<th class=\"th\">\n\t\t\t\t\t\t\t\t<%:App Name%>\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th class=\"th\">\n\t\t\t\t\t\t\t\t<%:Start Visit Time%>\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th class=\"th\">\n\t\t\t\t\t\t\t\t<%:Last Visit Time%>\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th class=\"th\">\n\t\t\t\t\t\t\t\t<%:Duration%>\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t\t<th class=\"th\">\n\t\t\t\t\t\t\t\t<%:Filter Status%>\n\t\t\t\t\t\t\t</th>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</thead>\n\t\t\t\t\t<tbody>\n\t\t\t\t\t\t<tr class=\"tr\">\n\t\t\t\t\t\t\t<td class=\"td\" colspan=\"5\"><em><br />\n\t\t\t\t\t\t\t\t\t<%:Collecting data...%>\n\t\t\t\t\t\t\t\t</em></td>\n\t\t\t\t\t\t</tr>\n\t\t\t\t\t</tbody>\n\t\t\t\t</table>\n\t\t\t</div>\n\t\t\t\n\t\t\t<!-- Visit List Pagination -->\n\t\t\t<div id=\"visitListPagination\" style=\"flex-shrink: 0; margin-top: 10px;\"></div>\n\t\t</div>\n\n    </div>\n</div>\n\n<!-- Nickname Modal -->\n<div id=\"nicknameModal\" class=\"oaf-modal-overlay\">\n    <div class=\"oaf-modal-box\" style=\"width: 460px;\">\n        <button type=\"button\" onclick=\"closeModal('nicknameModal')\" class=\"oaf-modal-close\">&times;</button>\n        \n        <h4 class=\"oaf-modal-title\"><%:Modify Remark%></h4>\n        \n        <div style=\"margin-bottom: 20px;\">\n            <p style=\"margin: 0 0 8px 0; opacity: 0.7; font-size: 14px;\"><span class=\"field-label\"><%:MAC Address%>:</span> <span id=\"nicknameMacDisplay\" style=\"font-weight: 500; opacity: 1;\">--</span></p>\n        </div>\n        \n        <input type=\"hidden\" id=\"nicknameMac\" value=\"\">\n        \n        <div style=\"margin-bottom: 30px;\">\n            <p style=\"margin: 0 0 8px 0; opacity: 0.7; font-size: 14px;\"><span class=\"field-label\"><%:Remark%>:</span></p>\n            <input type=\"text\" id=\"nicknameInput\" class=\"oaf-input\" placeholder=\"请输入备注信息\">\n        </div>\n        \n        <div style=\"display: flex; justify-content: flex-end; gap: 10px; margin-top: 10px;\">\n            <button type=\"button\" class=\"oaf-btn oaf-btn-cancel\" onclick=\"closeModal('nicknameModal')\"><%:Cancel%></button>\n            <button type=\"button\" class=\"oaf-btn oaf-btn-primary\" onclick=\"submitNicknameChange()\"><%:OK%></button>\n        </div>\n    </div>\n</div>\n\n<div id=\"modal\" style=\"display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: transparent; z-index: 1000; justify-content: center; align-items: center;\">\n\t<div style=\"background-color: rgba(0, 0, 0, 0.65); padding: 14px 24px; border-radius: 6px; text-align: center; color: white; display: flex; justify-content: center; align-items: center;\">\n\t\t<p style=\"margin: 0; color: white; font-size: 14px;\"><%:Settings saved successfully%></p>\n\t</div>\n</div>\n<style>\n    .cbi-button.cbi-button-add {\n        background-color: #1a73e8 !important;\n        color: #ffffff !important;\n        border: none !important;\n        padding: 6px 12px !important;\n        border-radius: 4px !important;\n        cursor: pointer !important;\n        font-size: 13px !important;\n        font-weight: 500 !important;\n        transition: background-color 0.2s ease !important;\n    }\n    .cbi-button.cbi-button-add:hover {\n        background-color: #1557b0 !important;\n        color: #ffffff !important;\n    }\n    .cbi-button.cbi-button-add:active {\n        background-color: #0d47a1 !important;\n        color: #ffffff !important;\n    }\n    .cbi-section-table {\n        width: 100%;\n        border-collapse: collapse;\n        border-radius: 0;\n        border: none;\n    }\n\n    .cbi-section-table thead .th {\n        background: var(--background-color-low, #f5f5f5);\n        color: var(--text-color-medium, #6b7280);\n        font-weight: 600;\n        font-size: 12.5px;\n        letter-spacing: 0.2px;\n        text-transform: none;\n        padding: 10px 12px;\n        border-top: none;\n        border-bottom: 1px solid var(--border-color-medium, #d1d5db);\n        white-space: nowrap;\n        position: sticky;\n        top: 0;\n        z-index: 1;\n        text-align: left;\n    }\n\n    .cbi-section-table tbody .td {\n        padding: 10px 12px;\n        border-bottom: 1px solid var(--border-color-low, #e5e7eb);\n        font-size: 13px;\n        vertical-align: middle;\n        line-height: 1.5;\n        text-align: left;\n    }\n\n    .cbi-section-table tbody tr:last-child .td {\n        border-bottom: none;\n    }\n\n    .cbi-section-table tbody tr:hover .td {\n        background-color: var(--background-color-low, #f5f5f5);\n    }\n\n\n    .cbi-section-table tbody tr:nth-child(even) .td {\n        background-color: var(--background-color-low, #fafbfc);\n    }\n    .cbi-section-table tbody tr:nth-child(even):hover .td {\n        background-color: var(--background-color-low, #f5f5f5);\n    }\n\n   \n    #user_status_table {\n        min-width: 1000px;\n    }\n\n    #user_status_table .td {\n        padding-left: 12px !important;\n    }\n\n\n    #user_status_table .td:last-child {\n        white-space: nowrap;\n    }\n\n\n    #user_status_table td:nth-child(8),\n    #user_status_table .td:nth-child(8) {\n        white-space: nowrap;\n        min-width: 175px;\n    }\n\n\n    #user_status_table .cbi-button {\n        padding: 5px 12px;\n        font-size: 12px;\n        border-radius: 4px;\n        border: 1px solid var(--border-color-medium, #d1d5db);\n        background: transparent;\n        color: #1a73e8;\n        cursor: pointer;\n        transition: all 0.2s;\n        font-weight: 500;\n    }\n\n    #user_status_table .cbi-button:hover {\n        background-color: var(--background-color-low, #f5f5f5);\n        border-color: #1a73e8;\n    }\n\n\n    #visit_list_table .td {\n        padding: 6px 10px !important;\n        height: 32px !important;\n        vertical-align: middle !important;\n        font-size: 12.5px;\n    }\n\n    #visit_list_table .th {\n        padding: 8px 10px !important;\n        height: 36px !important;\n        vertical-align: middle !important;\n    }\n\n \n    .tab-container {\n        margin-top: 10px;\n    }\n    .tab-list {\n        display: flex;\n        list-style-type: none;\n        padding: 0;\n        margin: 0 0 0 0;\n        border-bottom: 2px solid var(--border-color-low, #e5e7eb);\n        gap: 2px;\n    }\n    .tab-item {\n        padding: 8px 18px;\n        cursor: pointer;\n        border: none;\n        background-color: transparent;\n        border-radius: 6px 6px 0 0;\n        transition: all 0.2s ease;\n        opacity: 0.6;\n        font-size: 13px;\n        font-weight: 500;\n        position: relative;\n    }\n    .tab-item.active {\n        color: #1a73e8;\n        font-weight: 600;\n        opacity: 1;\n    }\n    .tab-item.active::after {\n        content: '';\n        position: absolute;\n        bottom: -2px;\n        left: 0;\n        right: 0;\n        height: 2px;\n        background-color: #1a73e8;\n        border-radius: 2px 2px 0 0;\n    }\n    .tab-item:hover {\n        background-color: var(--background-color-low, #f5f5f5);\n        opacity: 0.8;\n    }\n\n    .tab-body {\n        margin-top: 5px;\n        display: none;\n        padding: 20px;\n    }\n    .tab-body.active {\n        display: block;\n    }\n\n    .pie-chart {\n        width: 600px;\n        max-width: 100%;\n    }\n\n    .oaf-modal-overlay {\n        display: none;\n        position: fixed;\n        top: 0;\n        left: 0;\n        width: 100%;\n        height: 100%;\n        background-color: rgba(0, 0, 0, 0.45);\n        backdrop-filter: blur(3px);\n        z-index: 1000;\n        justify-content: center;\n        align-items: center;\n        animation: oafFadeIn 0.25s ease;\n    }\n\n    .oaf-modal-box {\n        background-color: var(--background-color-high, #fff);\n        padding: 28px;\n        border-radius: 12px;\n        text-align: left;\n        display: flex;\n        flex-direction: column;\n        position: relative;\n        box-shadow: 0 8px 30px rgba(0, 0, 0, 0.18);\n        animation: oafSlideUp 0.3s ease;\n        max-width: 95vw;\n        max-height: 90vh;\n        overflow: hidden;\n    }\n\n    .oaf-modal-close {\n        position: absolute;\n        top: 14px;\n        right: 14px;\n        background-color: transparent;\n        border: none;\n        font-size: 22px;\n        opacity: 0.5;\n        cursor: pointer;\n        width: 32px;\n        height: 32px;\n        border-radius: 50%;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        transition: all 0.2s;\n        line-height: 1;\n    }\n\n    .oaf-modal-close:hover {\n        background-color: var(--background-color-low, #f5f5f5);\n        opacity: 1;\n    }\n\n    .oaf-modal-title {\n        margin: 0 0 20px 0;\n        font-size: 17px;\n        font-weight: 600;\n    }\n\n    .oaf-btn {\n        padding: 8px 20px;\n        border-radius: 6px;\n        font-size: 13px;\n        font-weight: 500;\n        cursor: pointer;\n        transition: all 0.2s;\n        border: none;\n    }\n\n    .oaf-btn-primary {\n        background-color: #1a73e8;\n        color: #fff;\n    }\n    .oaf-btn-primary:hover {\n        background-color: #1557b0;\n        box-shadow: 0 2px 6px rgba(26, 115, 232, 0.3);\n    }\n\n    .oaf-btn-cancel {\n        background: transparent;\n        border: 1px solid var(--border-color-medium, #d1d5db);\n    }\n    .oaf-btn-cancel:hover {\n        background-color: var(--background-color-low, #f5f5f5);\n    }\n\n    .oaf-input {\n        padding: 10px 12px;\n        background: transparent;\n        border: 1px solid var(--border-color-medium, #d1d5db);\n        border-radius: 6px;\n        width: 100%;\n        font-size: 14px;\n        transition: border-color 0.2s, box-shadow 0.2s;\n        box-sizing: border-box;\n        color: inherit;\n    }\n    .oaf-input:focus {\n        outline: none;\n        border-color: #1a73e8;\n        box-shadow: 0 0 0 3px rgba(26, 115, 232, 0.12);\n    }\n\n\n    #pagination, #visitListPagination {\n        display: flex;\n        align-items: center;\n        justify-content: center;\n        padding: 12px 0;\n        margin-top: 8px;\n    }\n\n \n    .field-label {\n        font-weight: 600;\n        width: 75px;\n        display: inline-block;\n    }\n    .field-value {\n        color: #4CAF50;\n    }\n    .info-container {\n        display: flex;\n        flex-direction: column;\n        gap: 10px;\n        margin-left: 20px;\n    }\n    .info-row {\n        display: flex;\n    }\n    .info-column {\n        width: 50%;\n        text-align: left;\n    }\n    .info-column p {\n        margin-bottom: 20px;\n    }\n\n  \n    .view-toggle {\n        position: relative;\n        display: flex;\n        justify-content: flex-end;\n        gap: 4px;\n        margin-bottom: 10px;\n        margin-left: auto;\n        width: fit-content;\n    }\n    .view-toggle-btn {\n        padding: 6px 10px;\n        border: 1px solid var(--border-color-medium, #d1d5db);\n        background: transparent;\n        opacity: 0.5;\n        cursor: pointer;\n        transition: all 0.2s;\n        display: flex;\n        align-items: center;\n        justify-content: center;\n    }\n    .view-toggle-btn:first-child {\n        border-radius: 4px 0 0 4px;\n    }\n    .view-toggle-btn:last-child {\n        border-radius: 0 4px 4px 0;\n        margin-left: -1px;\n    }\n    .view-toggle-btn.active {\n        color: #1a73e8;\n        border-color: #1a73e8;\n        z-index: 1;\n        position: relative;\n        opacity: 1;\n    }\n    .view-toggle-btn:hover:not(.active) {\n        opacity: 0.7;\n    }\n\n\n    .card-grid {\n        display: grid;\n        grid-template-columns: repeat(auto-fill, minmax(260px, 1fr));\n        gap: 12px;\n        padding: 4px 0;\n    }\n\n\n    .user-card {\n        border: 1px solid var(--border-color-low, #e5e7eb);\n        border-radius: 10px;\n        padding: 14px 16px;\n        position: relative;\n        cursor: pointer;\n        transition: box-shadow 0.2s, border-color 0.2s;\n        display: flex;\n        flex-direction: column;\n        gap: 10px;\n    }\n    .user-card:hover {\n        box-shadow: 0 2px 12px rgba(0, 0, 0, 0.08);\n        border-color: var(--border-color-medium, #d1d5db);\n    }\n    .user-card--offline {\n        opacity: 0.55;\n    }\n    .user-card--offline:hover {\n        opacity: 0.75;\n    }\n\n    .card-status {\n        position: absolute;\n        top: 10px;\n        right: 12px;\n        font-size: 11px;\n        font-weight: 500;\n        padding: 2px 8px;\n        border-radius: 10px;\n        line-height: 1.4;\n    }\n    .card-status--active {\n        background: #e8f0fe;\n        color: #1a73e8;\n    }\n    .card-status--online {\n        background: #e6f4ea;\n        color: #1e8e3e;\n    }\n    .card-status--offline {\n        background: var(--background-color-low, #f5f5f5);\n        opacity: 0.6;\n    }\n\n    .card-device {\n        padding-right: 60px;\n    }\n    .card-name {\n        font-size: 14px;\n        font-weight: 600;\n        line-height: 1.3;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        white-space: nowrap;\n    }\n    .card-mac {\n        font-size: 11.5px;\n        opacity: 0.5;\n        margin-top: 2px;\n        font-family: monospace;\n    }\n\n    .card-rate {\n        display: flex;\n        gap: 16px;\n        align-items: center;\n    }\n    .card-rate-item {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n        font-size: 12.5px;\n        opacity: 0.7;\n        font-variant-numeric: tabular-nums;\n    }\n    .card-rate-item svg {\n        flex-shrink: 0;\n    }\n\n    .card-visiting {\n        display: flex;\n        align-items: center;\n        gap: 6px;\n        font-size: 12px;\n        opacity: 0.6;\n        overflow: hidden;\n        white-space: nowrap;\n    }\n    .card-visiting-label {\n        opacity: 0.7;\n        flex-shrink: 0;\n    }\n    .card-visiting-app {\n        font-weight: 500;\n        flex-shrink: 0;\n        opacity: 1;\n    }\n    .card-visiting-none {\n        opacity: 0.4;\n    }\n    .card-visiting-url {\n        opacity: 0.7;\n        overflow: hidden;\n        text-overflow: ellipsis;\n        cursor: help;\n    }\n\n    .card-info {\n        display: flex;\n        justify-content: space-between;\n        align-items: center;\n        border-top: 1px solid var(--border-color-low, #e5e7eb);\n        padding-top: 8px;\n    }\n    .card-apps {\n        display: flex;\n        align-items: center;\n        gap: 4px;\n        flex: 1;\n        min-width: 0;\n        overflow: hidden;\n    }\n    .card-app-icon {\n        width: 20px;\n        height: 20px;\n        border-radius: 4px;\n        flex-shrink: 0;\n    }\n    .card-time {\n        font-size: 12px;\n        opacity: 0.6;\n        cursor: help;\n        flex-shrink: 0;\n        padding: 2px 8px;\n        border-radius: 4px;\n    }\n    .card-flow {\n        font-size: 12px;\n        opacity: 0.6;\n        cursor: help;\n        flex-shrink: 0;\n        padding: 2px 8px;\n        border-radius: 4px;\n    }\n\n    @media (max-width: 768px) {\n        .oaf-modal-box {\n            width: 100vw !important;\n            height: 100vh !important;\n            max-width: 100vw !important;\n            max-height: 100vh !important;\n            border-radius: 0 !important;\n            padding: 16px !important;\n            margin: 0 !important;\n        }\n        .oaf-modal-overlay {\n            align-items: stretch !important;\n        }\n        .oaf-modal-close {\n            top: 10px !important;\n            right: 10px !important;\n            z-index: 10;\n            background-color: var(--background-color-low, #f5f5f5) !important;\n        }\n        .oaf-modal-title {\n            font-size: 15px !important;\n            padding-right: 40px;\n        }\n        .pie-chart {\n            width: 100% !important;\n        }\n        #tab2 .pie-chart #app_time_chart {\n            height: 260px !important;\n        }\n        #tab3 > div {\n            max-height: none !important;\n            overflow: auto !important;\n        }\n        .tab-body {\n            padding: 10px 0 !important;\n        }\n        #visit_list_table {\n            min-width: 500px;\n        }\n        .tab-body {\n            flex: 1;\n            overflow-y: auto;\n            min-height: 0;\n        }\n        #tableViewWrapper {\n            display: none !important;\n        }\n        #cardViewWrapper {\n            display: grid !important;\n        }\n        .view-toggle {\n            display: none;\n        }\n        .card-grid {\n            grid-template-columns: 1fr;\n        }\n    }\n\n    @media (min-width: 769px) and (max-width: 1200px) {\n        .card-grid {\n            grid-template-columns: repeat(auto-fill, minmax(240px, 1fr));\n        }\n    }\n\n    @keyframes oafFadeIn {\n        from { opacity: 0; }\n        to { opacity: 1; }\n    }\n    @keyframes oafSlideUp {\n        from { transform: translateY(16px); opacity: 0; }\n        to { transform: translateY(0); opacity: 1; }\n    }\n</style>\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/view/cbi/oaf_dvalue.htm",
    "content": "<%+cbi/valueheader%>\n<span style=\"color: green\">\n<%\n\tlocal val = self:cfgvalue(section) or self.default or \"\"\n\twrite(pcdata(val))\n%>\n</span>\n\n\n<%+cbi/valuefooter%>\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/luasrc/view/cbi/oaf_upload.htm",
    "content": "<%+cbi/valueheader%>\n\n<div style=\"display: flex; align-items: center;height: 30px;margin-top: 20px;\">\n\t<label class=\"cbi-value\" style=\"width: 110px;margin-top:10px;\" for=\"ulfile\"><%:Feature Library Update%>:</label>\n\t<input class=\"cbi-input-file\" style=\"width: 400px\" type=\"file\" id=\"ulfile\" name=\"ulfile\" />\n\t<input type=\"submit\" class=\"cbi-button cbi-input-apply \" name=\"upload\" value=\"<%:Upload%>\"  onclick=\"showModal()\"/>\n\t</div>\n\n    <div id=\"modal\" style=\"display: none; position: fixed; top: 0; left: 0; width: 100%; height: 100%; background-color: rgba(0, 0, 0, 0.5); z-index: 1000; justify-content: center; align-items: center;\">\n        <div style=\"background-color: rgba(0, 0, 0, 0.5); padding: 10px; border-radius: 5px; text-align: center; width: 200px; height: 100px; color: white; display: flex; justify-content: center; align-items: center;\">\n            <p style=\"margin: 0;color: white;\"><%:Updating, please wait...%></p>\n        </div>\n    </div>\n\t<div style=\"margin-top: 10px;\">\n\t\t<span style=\"color: gray;font-size: 13px;\"><%:Feature library files can be downloaded from the official website. After downloading, upload to upgrade. Note the feature code format version, which needs to be consistent with the current feature code format!%></span>\n\t</div>\n<%+cbi/valuefooter%>\n\n<style>\n\n</style>\n\n<script>\n    function showModal() {\n        var modal = document.getElementById('modal');\n        modal.style.display = 'flex'; // Show the modal\n\n        setTimeout(function() {\n            modal.style.display = 'none'; // Hide the modal after 10 seconds\n        }, 15000); // 10000 milliseconds = 10 seconds\n    }\n</script>\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/po/zh_Hans/oaf.po",
    "content": "msgid \"website\"\nmsgstr \"常用网站\"\n\nmsgid \"appfilter\"\nmsgstr \"应用过滤\"\n\nmsgid \"App Filter\"\nmsgstr \"应用过滤\"\n\nmsgid \"game\"\nmsgstr \"游戏\"\n\nmsgid \"web\"\nmsgstr \"网页\"\n\nmsgid \"video\"\nmsgstr \"视频\"\n\nmsgid \"chat\"\nmsgstr \"聊天\"\n\nmsgid \"download\"\nmsgstr \"下载\"\n\nmsgid \"p2p\"\nmsgstr \"p2p\"\n\nmsgid \"music\"\nmsgstr \"音乐\"\n\nmsgid \"shopping\"\nmsgstr \"购物\"\n\nmsgid \"working\"\nmsgstr \"办公\"\n\nmsgid \"employee\"\nmsgstr \"招聘\"\n\nmsgid \"Basic Settings\"\nmsgstr \"基本设置\"\n\nmsgid \"App Filter Rules\"\nmsgstr \"应用过滤规则\"\n\nmsgid \"It takes effect for all users by default, and only takes effect for the selected users when checked\"\nmsgstr \"默认对所有用户生效，勾选后只对选择的用户生效\"\n\nmsgid \"Select users\"\nmsgstr \"选择用户\"\n\nmsgid \"Id\"\nmsgstr \"编号\"\n\nmsgid \"Hostname\"\nmsgstr \"主机名\"\n\nmsgid \"Common App(TOP5)\"\nmsgstr \"常用APP(TOP5)\"\n\nmsgid \"Online Status\"\nmsgstr \"在线状态\"\n\nmsgid \"Client List\"\nmsgstr \"终端列表\"\n\nmsgid \"Online\"\nmsgstr \"在线\"\n\nmsgid \"Offline\"\nmsgstr \"离线\"\n\nmsgid \"App Time Statistics\"\nmsgstr \"App 时间统计\"\n\nmsgid \"Filter Status\"\nmsgstr \"过滤状态\"\n\nmsgid \"Data Statistics\"\nmsgstr \"数据统计\"\n\nmsgid \"Current Version\"\nmsgstr \"当前版本\"\n\nmsgid \"App Feature Num\"\nmsgstr \"特征码个数\"\n\nmsgid \"Update feature\"\nmsgstr \"特征库更新\"\n\nmsgid \"Feature Upgrade\"\nmsgstr \"特征库升级\"\n\nmsgid \"Time Setting\"\nmsgstr \"时间控制\"\n\nmsgid \"Sun\"\nmsgstr \"周日\"\n\nmsgid \"Mon\"\nmsgstr \"周一\"\n\nmsgid \"Tue\"\nmsgstr \"周二\"\n\nmsgid \"Wed\"\nmsgstr \"周三\"\n\nmsgid \"Thur\"\nmsgstr \"周四\"\n\nmsgid \"Fri\"\nmsgstr \"周五\"\n\nmsgid \"Sat\"\nmsgstr \"周六\"\n\nmsgid \"Up Rate\"\nmsgstr \"上行速率\"\n\nmsgid \"Down Rate\"\nmsgstr \"下行速率\"\n\nmsgid \"Refresh\"\nmsgstr \"刷新\"\n\nmsgid \"Visiting\"\nmsgstr \"正在访问\"\n\nmsgid \"Update the feature file successfully, please refresh the page\"\nmsgstr \"更新特征库成功，请刷新页面!\"\n\nmsgid \"Update the feature file successfully\"\nmsgstr \"特征库文件更新成功\"\n\nmsgid \"Failed to update feature file, format error\"\nmsgstr \"更新特征库失败，格式错误!\"\n\nmsgid \"Select feature file:\"\nmsgstr \"选择本地特征库文件:\"\n\nmsgid \"Start Time1\"\nmsgstr \"开始时间1\"\n\nmsgid \"End Time1\"\nmsgstr \"结束时间1\"\n\nmsgid \"Start Time2\"\nmsgstr \"开始时间2\"\n\nmsgid \"End Time2\"\nmsgstr \"结束时间2\"\n\nmsgid \"App Name\"\nmsgstr \"App名称\"\n\nmsgid \"Visit Time\"\nmsgstr \"访问时间\"\n\nmsgid \"App classification time statistics\"\nmsgstr \"App分类时间统计\"\n\nmsgid \"Percentage\"\nmsgstr \"占比\"\n\nmsgid \"Filtered\"\nmsgstr \"已过滤\"\n\nmsgid \"Unfiltered\"\nmsgstr \"未过滤\"\n\nmsgid \"h\"\nmsgstr \"小时\"\n\nmsgid \"m\"\nmsgstr \"分\"\n\nmsgid \"Enable App Filter\"\nmsgstr \"开启应用过滤\"\n\nmsgid \"App Feature Library\"\nmsgstr \"应用特征库\"\n\nmsgid \"Effective User\"\nmsgstr \"生效用户\"\n\nmsgid \"Effective Time\"\nmsgstr \"生效时间\"\n\nmsgid \"Basic Settings\"\nmsgstr \"基本设置\"\n\nmsgid \"Please close the modules that may conflict, such as acceleration, ad filtering, and multi-dial\"\nmsgstr \"请先关闭加速、广告过滤、多拨等可能冲突的模块\"\n\nmsgid \"Work Mode\"\nmsgstr \"工作模式\"\n\nmsgid \"Gateway Mode\"\nmsgstr \"网关模式\"\n\nmsgid \"Bypass Mode\"\nmsgstr \"旁路模式\"\n\nmsgid \"App Filter is a powerful parental control software\"\nmsgstr \"应用过滤是一款强大的家长控制软件\"\n\nmsgid \"OAF is now relatively stable. If the test fails, please disable ad filtering, proxy, acceleration, and other modules. If you are unsure which modules are conflicting, it is recommended to reset the device and then disable the acceleration module in the firewall for testing. If only some Apps are not working, you need to update the App feature library, as the filtering effect is related to the App feature library.\"\nmsgstr \"OAF目前已经相对稳定，如果测试失效，请关闭广告过滤、代理、加速等模块，如果不确定哪些模块冲突，建议将设备复位，然后关闭防火墙中的加速模块进行测试，如果只是部分应用无法生效，需要更新特征库，过滤的效果和特征库有关。\"\n\nmsgid \"In bypass mode, down rate cannot be measured, because data is directly forwarded from the gateway to the terminal.\"\nmsgstr \"旁路模式下无法统计下行速率，因为数据直接通过网关转发到了终端。\"\n\n\nmsgid \"Current version\"\nmsgstr \"当前版本\"\n\nmsgid \"App number\"\nmsgstr \"App个数\"\n\nmsgid \"Feature download\"\nmsgstr \"特征库下载\"\n\n\nmsgid \"Time Mode\"\nmsgstr \"时间匹配模式\"\n\nmsgid \"Blacklist mode\"\nmsgstr \"黑名单模式\"\n\nmsgid \"Whitelist mode\"\nmsgstr \"白名单模式\"\n\n\nmsgid \"The App feature library is used to describe the packet protocol of applications, including port, domain, and Layer7 payload. It is the core of the DPI engine and affects the effectiveness of OAF. You can also add or modify App features according to the official website tutorial.\"\nmsgstr \"特征库用于描述应用的协议特征，包括端口、域名、七层内容等，它是DPI引擎的核心，影响到OAF的识别和过滤效果，也可以根据官网教程自行添加或者修改应用特征库。\"\n\n\nmsgid \"User List\"\nmsgstr \"用户列表\"\n\nmsgid \"If there is no App you want, you can add the App by updating the App feature file\"\nmsgstr \"如果没有你想要的App，可以通过升级特征库增加App\"\n\nmsgid \"Feature format\"\nmsgstr \"特征码格式\"\n\nmsgid \"Settings saved successfully\"\nmsgstr \"设置成功\"\n\nmsgid \"Invalid LAN interface name. Please ensure it is no more than 8 characters long and contains only letters, numbers, and -.\"\nmsgstr \"LAN接口名称无效。请确保其长度不超过8，并且只包含字母、数字和-。\"\n\nmsgid \"Flow Offloading\"\nmsgstr \"流量卸载\"\n\nmsgid \"Disable Flow Offloading\"\nmsgstr \"关闭流量卸载\"\n\nmsgid \"The name of the LAN interface, used for detecting client info, supports fuzzy matching, but a complete interface name must be specified in bypass mode\"\nmsgstr \"LAN接口名称，用于探测客户端列表，支持模糊匹配，但是在桥模式下只能设置完整的接口名称。\"\n\n\nmsgid \"Flow offloading may affect filtering function. If the filtering feature does not work, you can disable flow offloading here and test again. Note: This only disables flow offloading temporarily. To permanently disable flow offloading, please turn it off in the firewall settings.\"\nmsgstr \"流量卸载可能会影响过滤功能，如果过滤功能失效，请尝试关闭流量卸载模块，注意这里只是临时关闭，如果要永久关闭，请在防火墙中进行设置。\"\n\nmsgid \"Auto-load OAF driver\"\nmsgstr \"自动加载OAF驱动\"\n\n\nmsgid \"If the OAF driver cannot be manually unloaded or the current driver is unstable, you can turn off auto-loading at startup and manually install a suitable driver. It is recommended to use the official stable OpenWrt firmware.\"\nmsgstr \"如果OAF驱动无法手动卸载或者当前驱动不稳定，可以关闭开机自动加载，然后手动安装合适的驱动，建议用openwrt官方稳定版固件。\"\n\nmsgid \"LAN Interface\"\nmsgstr \"LAN接口\"\n\n\nmsgid \"Save\"\nmsgstr \"保存\"\n\nmsgid \"Please add at least one time period\"\nmsgstr \"至少添加一个时间段\"\n\nmsgid \"Time periods cannot exceed 64 entries\"\nmsgstr \"时间段不能超过64条\"\n\nmsgid \"Delete\"\nmsgstr \"删除\"\n\nmsgid \"Invalid time format, please enter a valid time format (HH:MM)\"\nmsgstr \"时间格式不合法，请输入有效的时间格式 (HH:MM)\"\n\nmsgid \"End time must be greater than start time\"\nmsgstr \"结束时间必须大于开始时间\"\n\nmsgid \"Time Rules\"\nmsgstr \"时间规则\"\n\nmsgid \"Mode Selection\"\nmsgstr \"模式选择\"\n\nmsgid \"Fixed Time\"\nmsgstr \"固定时间\"\n\nmsgid \"Dynamic Time\"\nmsgstr \"动态时间\"\n\nmsgid \"Weekday Selection\"\nmsgstr \"星期选择\"\n\nmsgid \"Weekdays\"\nmsgstr \"星期\"\n\nmsgid \"Start Time\"\nmsgstr \"开始时间\"\n\nmsgid \"End Time\"\nmsgstr \"结束时间\"\n\nmsgid \"Actions\"\nmsgstr \"操作\"\n\nmsgid \"Add Time Period\"\nmsgstr \"添加时间段\"\n\nmsgid \"Dynamic time mode refers to dynamically adjusting app filter switches, such as allowing children to play games for 20 minutes after studying for 1 hour, automatically enabling filtering after exceeding entertainment time, and repeating the cycle.\"\nmsgstr \"动态时间模式是指动态调整应用过滤开关，比如小孩学习1个小时后奖励20分钟玩游戏，超过娱乐时间后自动开启过滤，反复循环。\"\n\nmsgid \"Enable Duration Each Time (Study Time)\"\nmsgstr \"每次启用时长(学习时间)\"\n\nmsgid \"minutes\"\nmsgstr \"分\"\n\nmsgid \"Disable Duration Each Time (Break Time)\"\nmsgstr \"每次关闭时长(课余时间)\"\n\nmsgid \"Advanced Settings\"\nmsgstr \"高级设置\"\n\nmsgid \"Daily Study Time Range\"\nmsgstr \"每天学习时间范围\"\n\nmsgid \"This time range represents the daily school time period, which is a continuous time period. During this time period, filtering rules are dynamically enabled and disabled. Outside the time range, filtering is disabled by default.\"\nmsgstr \"该时间范围表示每天上学的时间段，是一段连续时间，在该时间段内实行过滤规则动态开启关闭，时间范围外默认关闭过滤\"\n\nmsgid \"Delete successful\"\nmsgstr \"删除成功\"\n\nmsgid \"Add successful\"\nmsgstr \"添加成功\"\n\nmsgid \"In automatic mode, all newly joined terminals will be controlled, and random MAC addresses on mobile phones are also applicable\"\nmsgstr \"自动模式下，所有新加入的终端将会被管控，手机随机MAC也适用\"\n\nmsgid \"In manual mode, only specified terminals are controlled\"\nmsgstr \"手动模式下，只有指定终端被管控\"\n\nmsgid \"Mode switch successful\"\nmsgstr \"模式切换成功\"\n\nmsgid \"Automatic Mode\"\nmsgstr \"自动模式\"\n\nmsgid \"Manual Mode\"\nmsgstr \"手动模式\"\n\nmsgid \"In manual mode, only the following added terminals are controlled\"\nmsgstr \"手动模式下，只有以下添加的终端被管控\"\n\nmsgid \"Remark\"\nmsgstr \"备注\"\n\nmsgid \"Add User\"\nmsgstr \"添加用户\"\n\nmsgid \"Select Device\"\nmsgstr \"选择设备\"\n\nmsgid \"OK\"\nmsgstr \"确定\"\n\nmsgid \"Cancel\"\nmsgstr \"取消\"\n\nmsgid \"Details\"\nmsgstr \"详情\"\n\nmsgid \"Please enter a valid remark\"\nmsgstr \"请输入合法的备注\"\n\nmsgid \"Device Info\"\nmsgstr \"设备信息\"\n\nmsgid \"IP Address\"\nmsgstr \"IP地址\"\n\nmsgid \"Active App\"\nmsgstr \"活跃APP\"\n\nmsgid \"Current URL\"\nmsgstr \"正在访问URL\"\n\nmsgid \"Device Details\"\nmsgstr \"设备详情\"\n\nmsgid \"App Statistics\"\nmsgstr \"APP统计\"\n\nmsgid \"Access Records\"\nmsgstr \"访问记录\"\n\nmsgid \"App Name\"\nmsgstr \"APP名称\"\n\nmsgid \"Start Time\"\nmsgstr \"开始时间\"\n\nmsgid \"Start Visit Time\"\nmsgstr \"开始访问时间\"\n\nmsgid \"Last Visit Time\"\nmsgstr \"最后访问时间\"\n\nmsgid \"Duration\"\nmsgstr \"访问时长\"\n\nmsgid \"Modify Remark\"\nmsgstr \"修改备注\"\n\nmsgid \"MAC Address\"\nmsgstr \"MAC地址\"\n\nmsgid \"Time Configuration\"\nmsgstr \"时间配置\"\n\nmsgid \"User Configuration\"\nmsgstr \"用户配置\"\n\nmsgid \"items\"\nmsgstr \"个\"\n\nmsgid \"Selected\"\nmsgstr \"已选\"\n\nmsgid \"Select All\"\nmsgstr \"全选\"\n\nmsgid \"Deselect All\"\nmsgstr \"取消全选\"\n\nmsgid \"Not Configured\"\nmsgstr \"未配置\"\n\nmsgid \"Running\"\nmsgstr \"运行中\"\n\nmsgid \"Currently in dynamic time mode,will close in\"\nmsgstr \"当前为动态时间模式，下次关闭等待时间:\"\n\nmsgid \"Not Running\"\nmsgstr \"未运行\"\n\nmsgid \"Current time is not within the time range\"\nmsgstr \"当前时间不在时间范围内\"\n\nmsgid \"Currently in dynamic time mode,will start in\"\nmsgstr \"当前为动态时间模式，下次开启等待时间:\"\n\nmsgid \"Remaining online time\"\nmsgstr \"剩余上网时长\"\n\nmsgid \"oaf driver not loaded, please download the oaf.ko driver file corresponding to the kernel version of this firmware for installation, and enable auto-loading. Current kernel version is\"\nmsgstr \"oaf驱动未加载,请下载该固件对应内核版本的oaf.ko驱动文件进行安装，并开启自动加载，当前内核版本为\"\n\nmsgid \"Running Status\"\nmsgstr \"运行状态\"\n\nmsgid \"App Record\"\nmsgstr \"应用记录\"\n\nmsgid \"App Selection\"\nmsgstr \"应用选择\"\n\nmsgid \"View\"\nmsgstr \"查看\"\n\nmsgid \"Advanced Settings\"\nmsgstr \"高级设置\"\n\nmsgid \"Feature Library Update\"\nmsgstr \"特征库升级\"\n\nmsgid \"Updating, please wait...\"\nmsgstr \"正在更新，请稍后...\"\n\nmsgid \"If the App you want is not in the list, you can upgrade the feature library of the official website or customize the App\"\nmsgstr \"如果列表中没有你想要的App，可以通过升级官网的特征库或者自定义App\"\n\nmsgid \"Effective Users\"\nmsgstr \"生效的用户\"\n\nmsgid \"No Users Available\"\nmsgstr \"暂无用户\"\n\nmsgid \"Users in whitelist are not controlled\"\nmsgstr \"白名单中的用户不受管控\"\n\nmsgid \"Whitelist Users\"\nmsgstr \"白名单用户\"\n\nmsgid \"Add to Whitelist\"\nmsgstr \"添加到白名单\"\n\nmsgid \"Select Device for Whitelist\"\nmsgstr \"选择设备添加到白名单\"\n\nmsgid \"Add to whitelist successful\"\nmsgstr \"添加到白名单成功\"\n\nmsgid \"Remove from whitelist successful\"\nmsgstr \"从白名单移除成功\"\n\nmsgid \"Please select at least one weekday\"\nmsgstr \"请至少选择一个星期\"\n\nmsgid \"Please set start and end time\"\nmsgstr \"请设置开始和结束时间\"\n\nmsgid \"Unknown App\"\nmsgstr \"未知App\"\n\nmsgid \"OAF Version\"\nmsgstr \"OAF版本\"\n\nmsgid \"OAF Driver Version\"\nmsgstr \"OAF驱动版本\"\n\nmsgid \"Basic Info\"\nmsgstr \"基本信息\"\n\nmsgid \"App List\"\nmsgstr \"应用列表\"\n\nmsgid \"You can download the App feature library from the website(www.openappfilter.com),then upload it here.Please note that after downloading, you need to extract the files and select the one in .bin format.\"\nmsgstr \"可以通过OAF官网(www.openappfilter.com)下载最新特征库，注意下载后需要先解压然后选择.bin格式的文件升级。\"\n\nmsgid \"QUIC Protocol\"\nmsgstr \"QUIC协议\"\n\n\nmsgid \"Filter the QUIC protocol\"\nmsgstr \"过滤QUIC协议\"\n\nmsgid \"Some Apps use encrypted QUIC protocol, which cannot be distinguished for filtering, Such as Youtube, Instagram, etc. For better filtering results, you can try disabling the QUIC protocol.\"\nmsgstr \"部分应用采用了加密的QUIC协议，无法区分实现完全过滤，比如淘宝、京东等，如需要达到更好的效果，可尝试禁用QUIC协议。\"\n\nmsgid \"Total\"\nmsgstr \"总计\"\n\nmsgid \"Page\"\nmsgstr \"页\"\n\nmsgid \"First\"\nmsgstr \"首页\"\n\nmsgid \"Previous\"\nmsgstr \"上一页\"\n\nmsgid \"Next\"\nmsgstr \"下一页\"\n\nmsgid \"Last\"\nmsgstr \"末页\"\n\nmsgid \"Show All\"\nmsgstr \"显示全部\"\n\nmsgid \"Page Size\"\nmsgstr \"每页数量\"\n\nmsgid \"Upload Rate\"\nmsgstr \"上行速率\"\n\nmsgid \"Download Rate\"\nmsgstr \"下行速率\"\n\nmsgid \"Filter Rules\"\nmsgstr \"过滤规则\"\n\nmsgid \"Filter Mode\"\nmsgstr \"过滤模式\"\n\nmsgid \"Specified Apps\"\nmsgstr \"指定应用\"\n\nmsgid \"All Apps\"\nmsgstr \"所有应用\"\n\nmsgid \"After the rule takes effect, all apps will be unable to connect to the network\"\nmsgstr \"规则生效后所有应用将会无法联网\"\n\nmsgid \"In this mode, after the rule takes effect, all apps will be unable to connect to the network, similar to scheduled internet disconnection\"\nmsgstr \"该模式下规则生效后所有应用将会无法联网，类似定时断网功能\"\n\nmsgid \"No available users to add\"\nmsgstr \"没有可添加的用户\"\n\nmsgid \"User already in whitelist\"\nmsgstr \"用户已在白名单中\"\n\nmsgid \"Please select at least one user\"\nmsgstr \"请至少选择一个用户\"\n\nmsgid \"Some users are already in whitelist\"\nmsgstr \"部分用户已在白名单中\"\n\nmsgid \"Clear Active Time\"\nmsgstr \"清除上网时长\"\n\nmsgid \"Are you sure you want to clear active time of all users?\"\nmsgstr \"确定要清除所有用户的上网时长吗？\"\n\nmsgid \"Active time cleared successfully\"\nmsgstr \"上网时长清除成功\"\n\nmsgid \"Failed to clear active time\"\nmsgstr \"清除上网时长失败\"\n\nmsgid \"Clear Offline Users\"\nmsgstr \"清除离线用户\"\n\nmsgid \"Are you sure you want to clear all offline users?\"\nmsgstr \"确定要清除所有离线用户吗？\"\n\nmsgid \"Offline users cleared successfully\"\nmsgstr \"离线用户清除成功\"\n\nmsgid \"Failed to clear offline users\"\nmsgstr \"清除离线用户失败\"\n\n\n\nmsgid \"Fixed Time Mode\"\nmsgstr \"固定时间模式\"\n\nmsgid \"Dynamic Time Mode\"\nmsgstr \"动态时间模式\"\n\nmsgid \"Period\"\nmsgstr \"时间段\"\n\nmsgid \"Time Range\"\nmsgstr \"时间范围\"\n\nmsgid \"Weekdays\"\nmsgstr \"星期\"\n\nmsgid \"Weekday\"\nmsgstr \"星期\"\n\nmsgid \"All Days\"\nmsgstr \"全部\"\n\nmsgid \"No time periods configured\"\nmsgstr \"未配置时间段\"\n\nmsgid \"Effective Users\"\nmsgstr \"生效用户\"\n\nmsgid \"Dynamic time mode: Whitelist users are excluded\"\nmsgstr \"动态时间模式：已排除白名单用户\"\n\nmsgid \"No users found\"\nmsgstr \"未找到用户\"\n\nmsgid \"Time Configuration\"\nmsgstr \"时间配置\"\n\nmsgid \"User Configuration\"\nmsgstr \"用户配置\"\n\nmsgid \"Loading...\"\nmsgstr \"加载中...\"\n\nmsgid \"Daily Time Limit\"\nmsgstr \"上网时长模式\"\n\nmsgid \"Daily time limit mode allows you to set a daily internet time limit for each weekday. Once the limit is reached, internet access will be restricted.\"\nmsgstr \"上网时长模式允许您为每个星期设置每日上网时长限制，达到限制后将限制网络访问。\"\n\nmsgid \"Daily Time Limit (minutes)\"\nmsgstr \"每日上网时长（分钟）\"\n\nmsgid \"Monday\"\nmsgstr \"星期一\"\n\nmsgid \"Tuesday\"\nmsgstr \"星期二\"\n\nmsgid \"Wednesday\"\nmsgstr \"星期三\"\n\nmsgid \"Thursday\"\nmsgstr \"星期四\"\n\nmsgid \"Friday\"\nmsgstr \"星期五\"\n\nmsgid \"Saturday\"\nmsgstr \"星期六\"\n\nmsgid \"Sunday\"\nmsgstr \"星期日\"\n\nmsgid \"Note: Set to 0 to disable time limit for that day.\"\nmsgstr \"提示：设置为0表示该天不限制上网时长。\"\n\nmsgid \"Morning Time Limit (minutes)\"\nmsgstr \"上午限制时长（分钟）\"\n\nmsgid \"Afternoon Time Limit (minutes)\"\nmsgstr \"下午限制时长（分钟）\"\n\nmsgid \"Note: Set to 0 to disable time limit for that period.\"\nmsgstr \"提示：设置为0表示该时段不限制上网时长。\"\n\nmsgid \"Value cannot be negative\"\nmsgstr \"值不能为负数\"\n\nmsgid \"Value cannot exceed 720 minutes (12 hours)\"\nmsgstr \"值不能超过720分钟（12小时）\"\n\nmsgid \"Value cannot be empty\"\nmsgstr \"值不能为空\"\n\nmsgid \"Please enter a valid number\"\nmsgstr \"请输入有效的数字\"\n\nmsgid \"Morning Time Limit\"\nmsgstr \"上午时长\"\n\nmsgid \"Afternoon Time Limit\"\nmsgstr \"下午时长\"\n\nmsgid \"No daily time limits configured\"\nmsgstr \"未配置每日时长限制\"\n\nmsgid \"Yes\"\nmsgstr \"是\"\n\nmsgid \"No\"\nmsgstr \"否\"\n\nmsgid \"Today Active Time\"\nmsgstr \"今日活跃时长\"\n\nmsgid \"Morning\"\nmsgstr \"上午\"\n\nmsgid \"Afternoon\"\nmsgstr \"下午\"\n\nmsgid \"Morning limit\"\nmsgstr \"上午限制\"\n\nmsgid \"Afternoon limit\"\nmsgstr \"下午限制\"\n\nmsgid \"min\"\nmsgstr \"分\"\n\nmsgid \"Used\"\nmsgstr \"已使用\"\n\nmsgid \"Active\"\nmsgstr \"活跃\"\n\nmsgid \"Current Time Usage\"\nmsgstr \"当前上网时长\"\n\nmsgid \"Today Time Usage\"\nmsgstr \"今日上网时长\"\n\nmsgid \"Today is\"\nmsgstr \"今天是\"\n\nmsgid \"Time limit not enabled for today\"\nmsgstr \"今日未启用时间限制\"\n\nmsgid \"Active Users\"\nmsgstr \"生效用户数\"\n\nmsgid \"AM\"\nmsgstr \"上午\"\n\nmsgid \"PM\"\nmsgstr \"下午\"\n\nmsgid \"Not set\"\nmsgstr \"未设置\"\n\nmsgid \"Used up\"\nmsgstr \"已用完\"\n\nmsgid \"Clear\"\nmsgstr \"清除\"\n\nmsgid \"Current Time\"\nmsgstr \"当前时间\"\n\nmsgid \"Disable Hardware Acceleration\"\nmsgstr \"禁用硬件加速\"\n\nmsgid \"Disable hardware acceleration (HNAT/ECM) and flow offloading to ensure application filtering works correctly. When enabled, this will automatically disable hardware acceleration and flow offloading features.\"\nmsgstr \"禁用硬件加速（HNAT/ECM）和流加速，以确保应用过滤功能正常工作。启用后，将自动禁用硬件加速和流加速功能，注意这里只是尝试关闭常用的加速模块。\"\n\nmsgid \"Current hardware acceleration module is not disabled, which may affect filtering functionality. For better filtering results, please disable the acceleration module in Advanced Settings.\"\nmsgstr \"当前未关闭加速模块，可能影响过滤功能，为了更好的过滤效果，请在高级设置中关闭加速模块。\"\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/root/etc/uci-defaults/94_feature_3.0",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n        set appfilter.feature.format='v3.0'\n        set appfilter.rule='rule'\n        set appfilter.global.tcp_rst='1'\n        set appfilter.global.lan_ifname='br-lan'\n        set appfilter.global.auto_load_engine='1'\n        commit appfilter\nEOF"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/root/etc/uci-defaults/95_time_daily_limit",
    "content": "#!/bin/sh\n\nif ! uci -q get appfilter.time.daily_limit_0 >/dev/null 2>&1; then\n\tuci -q batch <<-EOF >/dev/null\n\t\tset appfilter.time.daily_limit_0='0:0:0'\n\t\tset appfilter.time.daily_limit_1='0:0:0'\n\t\tset appfilter.time.daily_limit_2='0:0:0'\n\t\tset appfilter.time.daily_limit_3='0:0:0'\n\t\tset appfilter.time.daily_limit_4='0:0:0'\n\t\tset appfilter.time.daily_limit_5='0:0:0'\n\t\tset appfilter.time.daily_limit_6='0:0:0'\n\t\tset appfilter.global.disable_quic='0'\n\t\tcommit appfilter\n\tEOF\nfi\n\n"
  },
  {
    "path": "relevance/OpenAppFilter/luci-app-oaf/root/usr/share/rpcd/acl.d/luci-app-oaf.json",
    "content": "{\n    \"luci-app-oaf\": {\n        \"description\": \"Grant access to OpenAppFilter configuration\",\n        \"read\": {\n            \"uci\": [ \"appfilter\", \"user_info\" ],\n  \t\t\t\"ubus\": {\n                \"appfilter\": [ \"get_all_users\", \"get_oaf_status\", \"get_app_filter\", \"set_app_filter\", \"class_list\", \"dev_list\", \"app_class_visit_time\", \"dev_visit_time\", \"dev_visit_list\", \"set_app_filter_base\", \"get_app_filter_base\", \"set_app_filter_adv\", \"get_app_filter_adv\", \"set_app_filter_time\", \"get_app_filter_time\", \"get_app_filter_user\", \"set_app_filter_user\", \"del_app_filter_user\", \"add_app_filter_user\", \"set_nickname\", \"get_whitelist_user\", \"add_whitelist_user\", \"del_whitelist_user\", \"disable_flow_offloading\", \"cmd\", \"service_config\"]\n             }\n\n        },  \n        \"write\": {\n            \"cgi-io\": [ \"upload\" ],\n            \"file\": {\n                \"/etc/appfilter/*\": [ \"write\" ]\n            },  \n            \"uci\": [ \"appfilter\" ]\n        }   \n    }   \n}\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/Makefile",
    "content": "\ninclude $(TOPDIR)/rules.mk\ninclude $(INCLUDE_DIR)/kernel.mk\n\nPKG_NAME:=oaf\ninclude $(INCLUDE_DIR)/package.mk\n\nPKG_AUTOLOAD:=oaf\nRSTRIP:=:\n\ndefine KernelPackage/oaf\n  SECTION:=TT Apps\n  CATEGORY:=TT Apps\n  TITLE:=OAF kernel DPI driver\n  FILES:=$(PKG_BUILD_DIR)/oaf.ko \n  DEPENDS:=+kmod-ipt-conntrack\n  KCONFIG:=\n  # AUTOLOAD:=$(call AutoLoad,0,$(PKG_AUTOLOAD))\nendef\n\ndefine KernelPackage/oaf/description\n  open appfilter kernel module \nendef\n\n\nEXTRA_CFLAGS:=-Wno-declaration-after-statement -Wno-strict-prototypes -Wno-unused-variable -Wno-implicit-fallthrough -Wno-missing-braces -Wno-parentheses -Wno-format -Wno-missing-prototypes -Wno-missing-declarations\n\n\n\nMAKE_OPTS:= \\\n\t$(KERNEL_MAKE_FLAGS) \\\n\tM=\"$(PKG_BUILD_DIR)\" \\\n\tEXTRA_CFLAGS=\"$(EXTRA_CFLAGS)\" \\\n\t$(EXTRA_KCONFIG)\n\ndefine Build/Compile\n\t$(MAKE) -C \"$(LINUX_DIR)\" \\\n\t\t$(MAKE_OPTS) \\\n\t\tmodules\nendef\n\n$(eval $(call KernelPackage,oaf))\n\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/Makefile",
    "content": "oaf-objs := app_filter.o af_utils.o  af_config.o regexp.o cJSON.o af_log.o af_client.o af_client_fs.o af_conntrack.o af_rule_config.o af_user_config.o af_whitelist_config.o\r\nobj-m += oaf.o\r\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_client.c",
    "content": "/*\n\tAuthor:Derry\n\tDate: 2019/11/12\n*/\n#include <linux/init.h>\n#include <linux/module.h>\n#include <linux/version.h>\n#include <net/tcp.h>\n#include <linux/netfilter.h>\n#include <net/netfilter/nf_conntrack.h>\n#include <net/netfilter/nf_conntrack_acct.h>\n#include <linux/skbuff.h>\n#include <net/ip.h>\n#include <linux/types.h>\n#include <net/sock.h>\n#include <linux/etherdevice.h>\n#include <linux/cdev.h>\n#include <linux/device.h>\n#include <linux/list.h>\n#include <linux/netfilter_ipv6.h>\n#include <linux/ipv6.h>\n#include <linux/in6.h>\n#include <linux/timer.h>\n\n#include \"af_client.h\"\n#include \"af_client_fs.h\"\n#include \"af_log.h\"\n#include \"af_utils.h\"\n#include \"app_filter.h\"\n#include \"cJSON.h\"\n\nDEFINE_RWLOCK(af_client_lock);\n\nu32 total_client = 0;\nstruct list_head af_client_list_table[MAX_AF_CLIENT_HASH_SIZE];\n\nint af_send_msg_to_user(char *pbuf, uint16_t len);\nextern char *ipv6_to_str(const struct in6_addr *addr, char *str);\n\nstatic void init_client_timer(af_client_info_t *client);\nstatic void stop_client_timer(af_client_info_t *client);\n\n\nstatic void\nnf_client_list_init(void)\n{\n\tint i;\n\tAF_CLIENT_LOCK_W();\n\tfor (i = 0; i < MAX_AF_CLIENT_HASH_SIZE; i++)\n\t{\n\t\tINIT_LIST_HEAD(&af_client_list_table[i]);\n\t}\n\tAF_CLIENT_UNLOCK_W();\n\tAF_INFO(\"client list init......ok\\n\");\n}\n\nstatic void\nnf_client_list_clear(void)\n{\n\tint i;\n\taf_client_info_t *p = NULL;\n\tchar mac_str[32] = {0};\n\n\tAF_DEBUG(\"clean list\\n\");\n\tAF_CLIENT_LOCK_W();\n\tfor (i = 0; i < MAX_AF_CLIENT_HASH_SIZE; i++)\n\t{\n\t\twhile (!list_empty(&af_client_list_table[i]))\n\t\t{\n\t\t\tp = list_first_entry(&af_client_list_table[i], af_client_info_t, hlist);\n\t\t\tmemset(mac_str, 0x0, sizeof(mac_str));\n\t\t\tsprintf(mac_str, MAC_FMT, MAC_ARRAY(p->mac));\n\t\t\tAF_DEBUG(\"clean mac:%s\\n\", mac_str);\n\t\t\tstop_client_timer(p);\n\t\t\tlist_del(&(p->hlist));\n\t\t\tkfree(p);\n\t\t}\n\t}\n\tAF_CLIENT_UNLOCK_W();\n}\n\nvoid af_client_list_reset_report_num(void)\n{\n\tint i;\n\taf_client_info_t *node = NULL;\n\tAF_CLIENT_LOCK_W();\n\tfor (i = 0; i < MAX_AF_CLIENT_HASH_SIZE; i++)\n\t{\n\t\tlist_for_each_entry(node, &af_client_list_table[i], hlist)\n\t\t{\n\t\t\tnode->report_count = 0;\n\t\t}\n\t}\n\tAF_CLIENT_UNLOCK_W();\n}\n\nint get_mac_hash_code(unsigned char *mac)\n{\n\tif (!mac)\n\t\treturn 0;\n\telse\n\t\treturn mac[5] & (MAX_AF_CLIENT_HASH_SIZE - 1);\n}\n\naf_client_info_t *find_af_client(unsigned char *mac)\n{\n\taf_client_info_t *node;\n\tunsigned int index;\n\n\tindex = get_mac_hash_code(mac);\n\tlist_for_each_entry(node, &af_client_list_table[index], hlist)\n\t{\n\t\tif (0 == memcmp(node->mac, mac, 6))\n\t\t{\n\t\t\treturn node;\n\t\t}\n\t}\n\treturn NULL;\n}\t\n\naf_client_info_t *find_and_add_af_client(unsigned char *mac)\n{\n\taf_client_info_t *nfc;\n\tnfc = find_af_client(mac);\n\tif (!nfc){\n\t\tnfc = nf_client_add(mac);\n\t}\n\treturn nfc;\n}\t\n\n\naf_client_info_t *find_af_client_by_ip(unsigned int ip)\n{\n\taf_client_info_t *node;\n\tint i;\n\n\tfor (i = 0; i < MAX_AF_CLIENT_HASH_SIZE; i++)\n\t{\n\t\tlist_for_each_entry(node, &af_client_list_table[i], hlist)\n\t\t{\n\t\t\tif (node->ip == ip)\n\t\t\t{\n\t\t\t\tAF_LMT_DEBUG(\"match node->ip=%pI4, ip=%pI4\\n\", &node->ip, &ip);\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t}\n\treturn NULL;\n}\naf_client_info_t *find_af_client_by_ipv6(struct in6_addr *ipv6)\n{\n\taf_client_info_t *node;\n\tint i;\n\tchar addr_str[64] = {0};\n\n\tfor (i = 0; i < MAX_AF_CLIENT_HASH_SIZE; i++)\n\t{\n\t\tlist_for_each_entry(node, &af_client_list_table[i], hlist)\n\t\t{\n\t\t\tif (ipv6_addr_equal(&node->ipv6, ipv6))\n\t\t\t{\n\t\t\t\tAF_INFO(\"match node->ipv6=%s\\n\", ipv6_to_str(&node->ipv6, addr_str));\n\t\t\t\treturn node;\n\t\t\t}\n\t\t}\n\t}\n\treturn NULL;\n}\naf_client_info_t *\nnf_client_add(unsigned char *mac)\n{\n\taf_client_info_t *node;\n\tint index = 0;\n\n\tnode = (af_client_info_t *)kmalloc(sizeof(af_client_info_t), GFP_ATOMIC);\n\tif (node == NULL)\n\t{\n\t\tAF_ERROR(\"kmalloc failed\\n\");\n\t\treturn NULL;\n\t}\n\n\tmemset(node, 0, sizeof(af_client_info_t));\n\tmemcpy(node->mac, mac, MAC_ADDR_LEN);\n\n\tnode->create_jiffies = jiffies;\n\tnode->update_jiffies = jiffies;\n\tindex = get_mac_hash_code(mac);\n\n\tAF_LMT_INFO(\"new client mac=\" MAC_FMT \"\\n\", MAC_ARRAY(node->mac));\n\ttotal_client++;\n\tinit_client_timer(node);\n\tlist_add(&(node->hlist), &af_client_list_table[index]);\n\treturn node;\n}\n\n\n\n\nvoid check_client_expire(void)\n{\n\taf_client_info_t *node;\n\tint i;\n\tAF_CLIENT_LOCK_W();\n\tfor (i = 0; i < MAX_AF_CLIENT_HASH_SIZE; i++)\n\t{\n\t\tlist_for_each_entry(node, &af_client_list_table[i], hlist)\n\t\t{\n\t\t\tAF_DEBUG(\"mac:\" MAC_FMT \" update:%lu interval:%lu\\n\", MAC_ARRAY(node->mac),\n\t\t\t\t\t node->update_jiffies, (jiffies - node->update_jiffies) / HZ);\n\t\t\tif (jiffies > (node->update_jiffies + MAX_CLIENT_ACTIVE_TIME * HZ))\n\t\t\t{\n\t\t\t\tAF_INFO(\"del client:\" MAC_FMT \"\\n\", MAC_ARRAY(node->mac));\n\t\t\t\tstop_client_timer(node);\n\t\t\t\tlist_del(&(node->hlist));\n\t\t\t\tkfree(node);\n\t\t\t\tAF_CLIENT_UNLOCK_W();\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t}\n\tAF_CLIENT_UNLOCK_W();\n}\n\n#define MAX_EXPIRED_VISIT_INFO_COUNT 10\nvoid flush_expired_visit_info(af_client_info_t *node)\n{\n\tint i;\n\tint count = 0;\n\tu_int32_t cur_timep = 0;\n\tint timeout = 0;\n\tcur_timep = af_get_timestamp_sec();\n\tfor (i = 0; i < MAX_RECORD_APP_NUM; i++)\n\t{\n\t\tif (node->visit_info[i].app_id == 0)\n\t\t{\n\t\t\treturn;\n\t\t}\n\t}\n\tfor (i = 0; i < MAX_RECORD_APP_NUM; i++)\n\t{\n\t\tif (count >= MAX_EXPIRED_VISIT_INFO_COUNT)\n\t\t\tbreak;\n\n\t\tif (node->visit_info[i].total_num > 3)\n\t\t{\n\t\t\ttimeout = 180;\n\t\t}\n\t\telse\n\t\t{\n\t\t\ttimeout = 60;\n\t\t}\n\n\t\tif (cur_timep - node->visit_info[i].latest_time > timeout)\n\t\t{\n\t\t\t// 3?��o?��??3y????\n\t\t\tmemset(&node->visit_info[i], 0x0, sizeof(app_visit_info_t));\n\t\t\tcount++;\n\t\t}\n\t}\n}\n\nint __af_visit_info_report(af_client_info_t *node)\n{\n\tunsigned char mac_str[32] = {0};\n\tunsigned char ip_str[32] = {0};\n\tint i;\n\tint count = 0;\n\tchar *out = NULL;\n\tcJSON *visit_obj = NULL;\n\tcJSON *visit_info_array = NULL;\n\tcJSON *root_obj = NULL;\n\n\troot_obj = cJSON_CreateObject();\n\tif (!root_obj)\n\t{\n\t\tAF_ERROR(\"create json obj failed\");\n\t\treturn 0;\n\t}\n\tsprintf(mac_str, MAC_FMT, MAC_ARRAY(node->mac));\n\tsprintf(ip_str, \"%pI4\", &node->ip);\n\tcJSON_AddStringToObject(root_obj, \"mac\", mac_str);\n\tcJSON_AddStringToObject(root_obj, \"ip\", ip_str);\n\tcJSON_AddNumberToObject(root_obj, \"app_num\", node->visit_app_num);\n\tcJSON_AddNumberToObject(root_obj, \"up_flow\", (u32)(node->period_flow.up_bytes >> 10));\n\tcJSON_AddNumberToObject(root_obj, \"down_flow\", (u32)(node->period_flow.down_bytes >> 10));\n\tcJSON_AddNumberToObject(root_obj, \"active\", node->active);\n\n\tvisit_info_array = cJSON_CreateArray();\n\tfor (i = 0; i < MAX_RECORD_APP_NUM; i++)\n\t{\n\t\tif (node->visit_info[i].app_id == 0)\n\t\t\tcontinue;\n\t\tcount++;\n\t\tvisit_obj = cJSON_CreateObject();\n\t\tcJSON_AddNumberToObject(visit_obj, \"appid\", node->visit_info[i].app_id);\n\t\tcJSON_AddNumberToObject(visit_obj, \"latest_action\", node->visit_info[i].latest_action);\n\t\tmemset((char *)&node->visit_info[i], 0x0, sizeof(app_visit_info_t));\n\t\tcJSON_AddItemToArray(visit_info_array, visit_obj);\n\t}\n\n\tcJSON_AddItemToObject(root_obj, \"visit_info\", visit_info_array);\n\tout = cJSON_Print(root_obj);\n\tif (!out) {\n\t\tcJSON_Delete(root_obj);\n\t\treturn 0;\n\t}\n\tcJSON_Minify(out);\n\n\tAF_INFO(\"report:%s count=%d\\n\", out, node->report_count);\n\tnode->report_count++;\n\taf_send_msg_to_user(out, strlen(out));\n\tcJSON_Delete(root_obj);\n\n\tmemset(&node->period_flow, 0x0, sizeof(node->period_flow));\n\n\tkfree(out);\n\treturn 0;\n}\n\nstatic inline int get_packet_dir(struct net_device *in)\n{\n\tif (strstr(in->name, g_lan_ifname))\n\t{\n\t\treturn PKT_DIR_UP;\n\t}\n\telse\n\t{\n\t\treturn PKT_DIR_DOWN;\n\t}\n}\n\n\n\nvoid af_update_client_status(af_client_info_t *node)\n{\n\tif (node->last_flow.down_bytes > 0){\n\t\tnode->period_flow.down_bytes += (node->flow.down_bytes - node->last_flow.down_bytes);\n\t}\n\tif (node->last_flow.up_bytes > 0){\n\t\tnode->period_flow.up_bytes += (node->flow.up_bytes - node->last_flow.up_bytes);\n\t}\t\n\tAF_LMT_DEBUG(\"period flow down:%llu up: %llu pkg up %d\\n\", node->period_flow.down_bytes, \n\t\tnode->period_flow.up_bytes, node->rate.pkt_up_rate);\n\t// 2s\t\n\tnode->rate.up_rate = (node->flow.up_bytes - node->last_flow.up_bytes) >> 1;\n\tnode->rate.down_rate = (node->flow.down_bytes - node->last_flow.down_bytes) >> 1;\n\tnode->rate.pkt_up_rate  = (node->flow.up_pkts - node->last_flow.up_pkts) >> 1;\n\tnode->rate.pkt_down_rate  = (node->flow.down_pkts - node->last_flow.down_pkts) >> 1;\n\n\tnode->last_flow.up_bytes = node->flow.up_bytes;\n\tnode->last_flow.down_bytes = node->flow.down_bytes;\n\tnode->last_flow.up_pkts  = node->flow.up_pkts;\n\tnode->last_flow.down_pkts = node->flow.down_pkts;\n\tif (node->rate.pkt_down_rate > 10 || node->rate.pkt_up_rate > 5){\n\t\tnode->active_time++;\n\t\tnode->inactive_time = 0;\n\t\tnode->active = 1;\n\t}\n\telse{\n\t\tnode->inactive_time++;\n\t\tnode->active_time = 0;\n\t\tif (node->active && node->inactive_time > 30){\n\t\t\tnode->active = 0;\n\t\t}\n\t}\n}\n\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)\nstatic u_int32_t af_client_hook(void *priv,\n\t\t\t\t\t\t\t\tstruct sk_buff *skb,\n\t\t\t\t\t\t\t\tconst struct nf_hook_state *state)\n{\n#else\nstatic u_int32_t af_client_hook(unsigned int hook,\n\t\t\t\t\t\t\t\tstruct sk_buff *skb,\n\t\t\t\t\t\t\t\tconst struct net_device *in,\n\t\t\t\t\t\t\t\tconst struct net_device *out,\n\t\t\t\t\t\t\t\tint (*okfn)(struct sk_buff *))\n{\n#endif\n\tstruct ethhdr *ethhdr = NULL;\n\tunsigned char smac[ETH_ALEN];\n\taf_client_info_t *nfc = NULL;\n\tint pkt_dir = 0;\n\tstruct iphdr *iph = NULL;\n\tunsigned int ip = 0;\n\tstruct ipv6hdr *ip6h = NULL;\n\tenum ip_conntrack_info ctinfo;\n\n\tstruct nf_conn *ct = nf_ct_get(skb, &ctinfo);\n\tif (NULL == ct)\n\t\treturn NF_ACCEPT;\n\tif (skb->protocol == htons(ETH_P_IPV6) && AF_MODE_GATEWAY != af_work_mode){\n\t\treturn NF_ACCEPT;\n\t}\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)\n\tif (!skb->dev)\n\t\treturn NF_ACCEPT;\n\n\tpkt_dir = get_packet_dir(skb->dev);\n#else\n\tif (!in)\n\t{\n\t\tAF_ERROR(\"in is NULL\\n\");\n\t\treturn NF_ACCEPT;\n\t}\n\tpkt_dir = get_packet_dir(in);\n#endif\n\n\tif (PKT_DIR_UP != pkt_dir)\n\t\treturn NF_ACCEPT;\n\n\tethhdr = eth_hdr(skb);\n\tif (ethhdr)\n\t{\n\t\tmemcpy(smac, ethhdr->h_source, ETH_ALEN);\n\t}\n\telse\n\t{\n\t\tmemcpy(smac, &skb->cb[40], ETH_ALEN);\n\t}\n\n\n\tAF_CLIENT_LOCK_W();\n\tnfc = find_af_client(smac);\n\tif (!nfc)\n\t{\n\t\tif (skb->dev)\n\t\t\tAF_DEBUG(\"from dev:%s %pI4\", skb->dev->name, &ip);\n\t\tnfc = nf_client_add(smac);\n\t}\n\n\tif (nfc) {\n\t\tif (skb->protocol == htons(ETH_P_IP)) {\n\t\t\tiph = ip_hdr(skb);\n\t\t\tif (iph && nfc->ip != iph->saddr) {\n\t\t\t\tAF_DEBUG(\"update node \" MAC_FMT \" ipv4 %pI4--->%pI4\\n\", \n\t\t\t\t\tMAC_ARRAY(nfc->mac), &nfc->ip, &iph->saddr);\n\t\t\t\tnfc->ip = iph->saddr;\n\t\t\t}\n\t\t}\n\t\telse if (skb->protocol == htons(ETH_P_IPV6)) {\n\t\t\tip6h = ipv6_hdr(skb);\n\t\t\tif (ip6h && !ipv6_addr_equal(&nfc->ipv6, &ip6h->saddr)) {\n\t\t\t\tnfc->ipv6 = ip6h->saddr;\n\t\t\t}\n\t\t}\n\t\tnfc->flow.up_bytes += skb->len;\n\t\tnfc->flow.up_pkts++;\n\t}\n\n\tAF_CLIENT_UNLOCK_W();\n\t\n\treturn NF_ACCEPT;\n}\n\n\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)\nstatic u_int32_t af_client_hook2(void *priv,\n\t\t\t\t\t\t\t\t struct sk_buff *skb,\n\t\t\t\t\t\t\t\t const struct nf_hook_state *state)\n{\n#else\nstatic u_int32_t af_client_hook2(unsigned int hook,\n\t\t\t\t\t\t\t\t struct sk_buff *skb,\n\t\t\t\t\t\t\t\t const struct net_device *in,\n\t\t\t\t\t\t\t\t const struct net_device *out,\n\t\t\t\t\t\t\t\t int (*okfn)(struct sk_buff *))\n{\n#endif\n\tstruct ethhdr *ethhdr = NULL;\n\tunsigned char smac[ETH_ALEN];\n\taf_client_info_t *nfc = NULL;\n\tint pkt_dir = 0;\n\tstruct iphdr *iph = NULL;\n\tstruct ipv6hdr *ip6h = NULL;\n\tenum ip_conntrack_info ctinfo;\n\n\tstruct nf_conn *ct = nf_ct_get(skb, &ctinfo);\n\tif (ct == NULL)\n\t{\n\t\treturn NF_ACCEPT;\n\t}\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)\n\tif (!skb->dev)\n\t\treturn NF_ACCEPT;\n\n\tpkt_dir = get_packet_dir(skb->dev);\n#else\n\tif (!in)\n\t{\n\t\tAF_ERROR(\"in is NULL\\n\");\n\t\treturn NF_ACCEPT;\n\t}\n\tpkt_dir = get_packet_dir(in);\n#endif\n\tif (!skb->dev)\n\t{\n\t\treturn NF_ACCEPT;\n\t}\n\n\n\tif (PKT_DIR_DOWN != pkt_dir)\n\t\treturn NF_ACCEPT;\n\n\tAF_CLIENT_LOCK_R();\n\t\n\tif (skb->protocol == htons(ETH_P_IP)) {\n\t\tiph = ip_hdr(skb);\n\t\tnfc = find_af_client_by_ip(iph->daddr);\n\t}\n\telse if (skb->protocol == htons(ETH_P_IPV6)) {\n\t\tip6h = ipv6_hdr(skb);\n\t\tnfc = find_af_client_by_ipv6(&ip6h->daddr);\n\t\tif (nfc){\n\t\t\tAF_LMT_DEBUG(\"found ipv6 %pI6 client\\n\", &ip6h->daddr);\n\t\t}\n\t\telse{\n\t\t\tAF_LMT_DEBUG(\"not found ipv6 %pI6 client\\n\", &ip6h->daddr);\n\t\t}\n\t}\n\tif (nfc){\n\t\tnfc->flow.down_bytes += skb->len;\n\t\tnfc->flow.down_pkts++;\n\t}\n\n\tAF_CLIENT_UNLOCK_R();\n\treturn NF_ACCEPT;\n}\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0)\nstatic struct nf_hook_ops af_client_ops[] = {\n\t{\n\t\t.hook = af_client_hook,\n\t\t.pf = NFPROTO_INET,\n\t\t.hooknum = NF_INET_FORWARD,\n\t\t.priority = NF_IP_PRI_FIRST + 1,\n\t},\n\t{\n\t\t.hook = af_client_hook2,\n\t\t.pf = NFPROTO_INET,\n\t\t.hooknum = NF_INET_FORWARD,\n\t\t.priority = NF_IP_PRI_LAST - 1,\n\t},\n\n};\n#else\nstatic struct nf_hook_ops af_client_ops[] = {\n\t{\n\t\t.hook = af_client_hook,\n#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0)\n\t\t.owner = THIS_MODULE,\n#endif\n\t\t.pf = NFPROTO_IPV4,\n\t\t.hooknum = NF_INET_FORWARD,\n\t\t.priority = NF_IP_PRI_FIRST + 1,\n\t},\n\t{\n\t\t.hook = af_client_hook,\n#if LINUX_VERSION_CODE < KERNEL_VERSION(4, 4, 0)\n\t\t.owner = THIS_MODULE,\n#endif\n\t\t.pf = NFPROTO_IPV6,\n\t\t.hooknum = NF_INET_FORWARD,\n\t\t.priority = NF_IP_PRI_FIRST + 1,\n\t},\n};\n#endif\n\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)\nstatic void client_timer_handler(struct timer_list *t)\n{\n#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 16, 0)\n    af_client_info_t *client = from_timer(client, t, client_timer);\n#else\n    af_client_info_t *client = timer_container_of(client, t, client_timer);\n#endif\n#else\nstatic void client_timer_handler(unsigned long data)\n{\n    af_client_info_t *client = (af_client_info_t *)data;\n#endif\n    if (!client) {\n        AF_ERROR(\"client timer handler: invalid client\\n\");\n        return;\n    }\n\t\n\tif (client->timer_count >= 30) {\n\t\t__af_visit_info_report(client);\n\t\tclient->timer_count = 0;\n\t}\n\n\taf_update_client_status(client);\n\tclient->timer_count++;\n    mod_timer(&client->client_timer, jiffies + HZ * 2); \n}\n\n void init_client_timer(af_client_info_t *client)\n{\n    if (!client) {\n        AF_ERROR(\"init_client_timer: invalid client\\n\");\n        return;\n    }\n    \n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)\n    timer_setup(&client->client_timer, client_timer_handler, 0);\n#else\n    setup_timer(&client->client_timer, client_timer_handler, (unsigned long)client);\n#endif\n    \n    mod_timer(&client->client_timer, jiffies + HZ * 1); \n}\n\n void stop_client_timer(af_client_info_t *client)\n{\n\t\n    if (!client) {\n        AF_ERROR(\"stop_client_timer: invalid client\\n\");\n        return;\n    }\n    \n#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 16, 0)\n    del_timer_sync(&client->client_timer);\n#else\n    timer_delete_sync(&client->client_timer);\n#endif\n}\n\n\n\n\nint af_client_init(void)\n{\n\tint err;\n\tnf_client_list_init();\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)\n\terr = nf_register_net_hooks(&init_net, af_client_ops, ARRAY_SIZE(af_client_ops));\n#else\n\terr = nf_register_hooks(af_client_ops, ARRAY_SIZE(af_client_ops));\n#endif\n\tif (err) {\n\t\tAF_ERROR(\"oaf register client hooks failed!\\n\");\n\t}\n\tAF_INFO(\"init app afclient ........ok\\n\");\n\n\treturn 0;\n}\n\nvoid af_client_exit(void)\n{\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)\n\tnf_unregister_net_hooks(&init_net, af_client_ops, ARRAY_SIZE(af_client_ops));\n#else\n\tnf_unregister_hooks(af_client_ops, ARRAY_SIZE(af_client_ops));\n#endif\n\tnf_client_list_clear();\n\treturn;\n}\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_client.h",
    "content": "#ifndef __AF_CLIENT_H__\n#define __AF_CLIENT_H__\n#include \"app_filter.h\"\n\nextern rwlock_t af_client_lock;\n\nextern u32 nfc_debug_level;\n\n#define MAX_AF_CLIENT_HASH_SIZE 64\n#define NF_CLIENT_TIMER_EXPIRE 1\n#define MAX_CLIENT_ACTIVE_TIME 90\n\n#define AF_CLIENT_LOCK_R() read_lock_bh(&af_client_lock);\n#define AF_CLIENT_UNLOCK_R() read_unlock_bh(&af_client_lock);\n#define AF_CLIENT_LOCK_W() write_lock_bh(&af_client_lock);\n#define AF_CLIENT_UNLOCK_W() write_unlock_bh(&af_client_lock);\n\n#define NIPQUAD(addr)                \\\n\t((unsigned char *)&addr)[0],     \\\n\t\t((unsigned char *)&addr)[1], \\\n\t\t((unsigned char *)&addr)[2], \\\n\t\t((unsigned char *)&addr)[3]\n#define NIPQUAD_FMT \"%u.%u.%u.%u\"\n\nenum NFC_PKT_DIR\n{\n\tPKT_DIR_DOWN,\n\tPKT_DIR_UP\n};\n\n#define MAX_VISIT_HISTORY_TIME 24\n#define MAX_RECORD_APP_NUM 64\n#define MIN_REPORT_URL_LEN 4\n#define MAX_REPORT_URL_LEN 64\n\ntypedef struct flow_stat\n{\n\tlong long up_bytes;\n\tlong long down_bytes;\n\tlong long up_pkts;\n\tlong long down_pkts;\n} flow_stat_t;\n\ntypedef struct flow_rate\n{\n\tunsigned int up_rate;\n\tunsigned int down_rate;\n\tunsigned int pkt_up_rate;\n\tunsigned int pkt_down_rate;\n}flow_rate_t;\ntypedef struct app_visit_info\n{\n\tunsigned int app_id;\n\tunsigned int total_num;\n\tunsigned int drop_num;\n\tunsigned long latest_time;\n\tunsigned int latest_action;\n} app_visit_info_t;\n\ntypedef struct visiting_info{\n    int visiting_app;\n    int app_time;\n    char visiting_url[MAX_REPORT_URL_LEN];\n    int url_time;\n}visiting_info_t;\n\ntypedef struct af_client_info\n{\n\tstruct list_head hlist;\n\tunsigned char mac[MAC_ADDR_LEN];\n\tunsigned int ip;\n\tstruct in6_addr ipv6;\n\tunsigned long create_jiffies;\n\tunsigned long update_jiffies;\n\tflow_stat_t flow;\n\tflow_stat_t last_flow;\n\tflow_stat_t period_flow; \n\tflow_rate_t rate;\n\tstruct timer_list client_timer;\n\tunsigned int visit_app_num;\n\tint active_time;\n\tint inactive_time;\n\tint active;\n\tvisiting_info_t visiting;\n\tint timer_count;\n\tint report_count;\n\tapp_visit_info_t visit_info[MAX_RECORD_APP_NUM];\n} af_client_info_t;\n\nint af_client_init(void);\n\nvoid af_client_exit(void);\naf_client_info_t *find_af_client_by_ip(unsigned int ip);\naf_client_info_t *find_af_client_by_ipv6(struct in6_addr *addr);\n\naf_client_info_t *find_af_client(unsigned char *mac);\n\nvoid check_client_expire(void);\n\nvoid af_visit_info_report(void);\n\nvoid af_client_list_reset_report_num(void);\naf_client_info_t *nf_client_add(unsigned char *mac);\naf_client_info_t *find_and_add_af_client(unsigned char *mac);\n\n#endif\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_client_fs.c",
    "content": "#include <linux/init.h>\r\n#include <linux/fs.h>\r\n#include <linux/netlink.h>\r\n#include <linux/module.h>\r\n#include <linux/skbuff.h>\r\n#include <linux/netdevice.h>\r\n#include <linux/netfilter.h>\r\n#include <linux/version.h>\r\n#include <net/sock.h>\r\n#include <linux/ip.h>\r\n#include <linux/udp.h>\r\n#include <linux/tcp.h>\r\n#include <linux/netfilter_bridge.h>\r\n#include <linux/version.h>\r\n#include <linux/time.h>\r\n#include <linux/seq_file.h>\r\n#include <linux/list.h>\r\n#include <linux/etherdevice.h>\r\n#include <linux/proc_fs.h>\r\n#include <linux/sysctl.h>\r\n#include \"af_utils.h\"\r\n\r\n#include \"cJSON.h\"\r\n#include \"af_log.h\"\r\n#include \"af_client.h\"\r\nextern char *ipv6_to_str(const struct in6_addr *addr, char *str);\r\n\r\nextern struct list_head af_client_list_table[MAX_AF_CLIENT_HASH_SIZE];\r\nstruct af_client_iter_state\r\n{\r\n    unsigned int bucket;\r\n    void *head;\r\n};\r\n\r\nstatic void *af_client_get_first(struct seq_file *seq)\r\n{\r\n    struct af_client_iter_state *st = seq->private;\r\n    for (st->bucket = 0; st->bucket < MAX_AF_CLIENT_HASH_SIZE; st->bucket++)\r\n    {\r\n        if (!list_empty(&(af_client_list_table[st->bucket])))\r\n        {\r\n            st->head = &(af_client_list_table[st->bucket]);\r\n            return af_client_list_table[st->bucket].next;\r\n        }\r\n    }\r\n    return NULL;\r\n}\r\n\r\nstatic void *af_client_get_next(struct seq_file *seq,\r\n                                void *head)\r\n{\r\n    struct af_client_iter_state *st = seq->private;\r\n    struct hlist_node *node = (struct hlist_node *)head;\r\n\r\n    node = node->next;\r\n    if (node != st->head)\r\n    {\r\n        return node;\r\n    }\r\n    else\r\n    {\r\n        st->bucket++;\r\n        for (; st->bucket < MAX_AF_CLIENT_HASH_SIZE; st->bucket++)\r\n        {\r\n            if (!list_empty(&(af_client_list_table[st->bucket])))\r\n            {\r\n                st->head = &(af_client_list_table[st->bucket]);\r\n                return af_client_list_table[st->bucket].next;\r\n            }\r\n        }\r\n        return NULL;\r\n    }\r\n}\r\n\r\nstatic void *af_client_get_idx(struct seq_file *seq, loff_t pos)\r\n{\r\n    void *head = af_client_get_first(seq);\r\n\r\n    if (head)\r\n        while (pos && (head = af_client_get_next(seq, head)))\r\n            pos--;\r\n\r\n    return pos ? NULL : head;\r\n}\r\n\r\nstatic void *af_client_seq_start(struct seq_file *s, loff_t *pos)\r\n{\r\n    AF_CLIENT_LOCK_R();\r\n    if (*pos == 0)\r\n    {\r\n        return SEQ_START_TOKEN;\r\n    }\r\n\r\n    return af_client_get_idx(s, *pos - 1);\r\n}\r\n\r\nstatic void *af_client_seq_next(struct seq_file *s, void *v, loff_t *pos)\r\n{\r\n    (*pos)++;\r\n    if (v == SEQ_START_TOKEN)\r\n        return af_client_get_idx(s, 0);\r\n\r\n    return af_client_get_next(s, v);\r\n}\r\n\r\nstatic void af_client_seq_stop(struct seq_file *s, void *v)\r\n{\r\n    AF_CLIENT_UNLOCK_R();\r\n}\r\n\r\nstatic int af_client_seq_show(struct seq_file *s, void *v)\r\n{\r\n    unsigned char mac_str[32] = {0};\r\n    unsigned char ip_str[32] = {0};\r\n\tunsigned char ipv6_str[128];\r\n\r\n    static int index = 0;\r\n    af_client_info_t *node = (af_client_info_t *)v;\r\n    if (v == SEQ_START_TOKEN)\r\n    {\r\n        index = 0;\r\n        seq_printf(s, \"%-4s %-20s %-20s %-32s  %-16s %-16s\\n\", \"Id\", \"Mac\", \"IP\", \"IPv6\", \"UpRate\", \"DownRate\");\r\n        return 0;\r\n    }\r\n    index++;\r\n    sprintf(mac_str, MAC_FMT, MAC_ARRAY(node->mac));\r\n    sprintf(ip_str, \"%pI4\", &node->ip);\r\n\tipv6_to_str(&node->ipv6, ipv6_str);\r\n\r\n\r\n    seq_printf(s, \"%-4d %-20s %-20s %-32s %-16d %-16d\\n\", index, mac_str, ip_str, ipv6_str, node->rate.up_rate, node->rate.down_rate);\r\n    return 0;\r\n}\r\n\r\nstatic const struct seq_operations nf_client_seq_ops = {\r\n    .start = af_client_seq_start,\r\n    .next = af_client_seq_next,\r\n    .stop = af_client_seq_stop,\r\n    .show = af_client_seq_show};\r\n\r\nstatic int af_client_open(struct inode *inode, struct file *file)\r\n{\r\n    struct seq_file *seq;\r\n    struct af_client_iter_state *iter;\r\n    int err;\r\n\r\n    iter = kzalloc(sizeof(*iter), GFP_KERNEL);\r\n    if (!iter)\r\n        return -ENOMEM;\r\n\r\n    err = seq_open(file, &nf_client_seq_ops);\r\n    if (err)\r\n    {\r\n        kfree(iter);\r\n        return err;\r\n    }\r\n\r\n    seq = file->private_data;\r\n    seq->private = iter;\r\n    return 0;\r\n}\r\n\r\n#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 5, 0)\r\nstatic const struct file_operations af_client_fops = {\r\n    .owner = THIS_MODULE,\r\n    .open = af_client_open,\r\n    .read = seq_read,\r\n    .llseek = seq_lseek,\r\n    .release = seq_release_private,\r\n};\r\n#else\r\nstatic const struct proc_ops af_client_fops = {\r\n    .proc_flags = PROC_ENTRY_PERMANENT,\r\n    .proc_read = seq_read,\r\n    .proc_open = af_client_open,\r\n    .proc_lseek = seq_lseek,\r\n    .proc_release = seq_release_private,\r\n};\r\n#endif\r\n\r\n#define AF_CLIENT_PROC_STR \"af_client\"\r\n\r\n\r\n\r\n\r\nstatic int af_visiting_seq_show(struct seq_file *s, void *v)\r\n{\r\n    unsigned char mac_str[32] = {0};\r\n    unsigned char ip_str[32] = {0};\r\n    static int index = 0;\r\n\tint i;\r\n    af_client_info_t *node = (af_client_info_t *)v;\r\n    if (v == SEQ_START_TOKEN)\r\n    {\r\n        index = 0;\r\n        seq_printf(s, \"%-20s %-12s %-32s\\n\", \"Mac\", \"Appid\", \"Url\");\r\n        return 0;\r\n    }\r\n\tindex++;\r\n\t\r\n\tsprintf(mac_str, MAC_FMT, MAC_ARRAY(node->mac));\r\n\tint visiting_app = 0;\r\n\tchar visiting_url[64] = {0};\r\n\tif (af_get_timestamp_sec()  - node->visiting.app_time < 120){\r\n\t\tvisiting_app = node->visiting.visiting_app;\r\n\t}\r\n\tif ( af_get_timestamp_sec()  - node->visiting.url_time < 120 ){\r\n\t\tstrncpy(visiting_url, node->visiting.visiting_url, sizeof(visiting_url));\r\n\t}\r\n\telse{\r\n\t\tstrcpy(visiting_url, \"none\");\r\n\t}\r\n\tseq_printf(s, \"%-20s %-12d %-32s\\n\", mac_str, visiting_app, visiting_url);\r\n\t\r\n    return 0;\r\n}\r\n\r\nstatic const struct seq_operations nf_visiting_seq_ops = {\r\n    .start = af_client_seq_start,\r\n    .next = af_client_seq_next,\r\n    .stop = af_client_seq_stop,\r\n    .show = af_visiting_seq_show\r\n};\r\n\r\n\r\nstatic int af_visiting_open(struct inode *inode, struct file *file)\r\n{\r\n    struct seq_file *seq;\r\n    struct af_client_iter_state *iter;\r\n    int err;\r\n\r\n    iter = kzalloc(sizeof(*iter), GFP_KERNEL);\r\n    if (!iter)\r\n        return -ENOMEM;\r\n\r\n    err = seq_open(file, &nf_visiting_seq_ops);\r\n    if (err)\r\n    {\r\n        kfree(iter);\r\n        return err;\r\n    }\r\n\r\n    seq = file->private_data;\r\n    seq->private = iter;\r\n    return 0;\r\n}\r\n\r\n\r\n\r\n\r\n#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 5, 0)\r\nstatic const struct file_operations af_visiting_fops = {\r\n    .owner = THIS_MODULE,\r\n    .open = af_visiting_open,\r\n    .read = seq_read,\r\n    .llseek = seq_lseek,\r\n    .release = seq_release_private,\r\n};\r\n#else\r\nstatic const struct proc_ops af_visiting_fops = {\r\n    .proc_flags = PROC_ENTRY_PERMANENT,\r\n    .proc_read = seq_read,\r\n    .proc_open = af_visiting_open,\r\n    .proc_lseek = seq_lseek,\r\n    .proc_release = seq_release_private,\r\n};\r\n#endif\r\n#define AF_VISIT_INFO \"af_visit\"\r\n\r\nint init_af_client_procfs(void)\r\n{\r\n    struct proc_dir_entry *pde;\r\n    struct net *net = &init_net;\r\n    pde = proc_create(AF_CLIENT_PROC_STR, 0440, net->proc_net, &af_client_fops);\r\n\r\n    if (!pde)\r\n    {\r\n        AF_ERROR(\"nf_client proc file created error\\n\");\r\n        return -1;\r\n    }\r\n    pde = proc_create(AF_VISIT_INFO, 0440, net->proc_net, &af_visiting_fops);\r\n\r\n    if (!pde)\r\n    {\r\n        AF_ERROR(\"client visiting proc file created error\\n\");\r\n        return -1;\r\n    }\r\n    return 0;\r\n}\r\n\r\nvoid finit_af_client_procfs(void)\r\n{\r\n    struct net *net = &init_net;\r\n    remove_proc_entry(AF_CLIENT_PROC_STR, net->proc_net);\r\n    remove_proc_entry(AF_VISIT_INFO, net->proc_net);\r\n}\r\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_client_fs.h",
    "content": "#ifndef __AF_CLIENT_FS_H__\r\n#define __AF_CLIENT_FS_H__\r\n\r\nint init_af_client_procfs(void);\r\nvoid finit_af_client_procfs(void);\r\n\r\n#endif\r\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_config.c",
    "content": "#include <linux/init.h>\n#include <linux/module.h>\n#include <net/tcp.h>\n#include <linux/netfilter.h>\n#include <net/netfilter/nf_conntrack.h>\n#include <linux/skbuff.h>\n#include <net/ip.h>\n#include <linux/types.h>\n#include <net/sock.h>\n#include <linux/etherdevice.h>\n#include <linux/cdev.h>\n#include <linux/vmalloc.h>\n#include <linux/device.h>\n#include <linux/version.h>\n#include \"cJSON.h\"\n#include \"app_filter.h\"\n#include \"af_config.h\"\n#include \"af_utils.h\"\n#include \"af_log.h\"\n#include \"af_rule_config.h\"\n#include \"af_user_config.h\"\n#include \"af_whitelist_config.h\"\n\n#define AF_DEV_NAME \"appfilter\"\n\nextern u_int32_t g_update_jiffies;\n\nstatic struct mutex af_cdev_mutex;\nstruct af_config_dev\n{\n\tdev_t id;\n\tstruct cdev char_dev;\n\tstruct class *c;\n};\nstruct af_config_dev g_af_dev;\n\nstruct af_cdev_file\n{\n\tsize_t size;\n\tchar buf[256 << 10];\n};\n\nstatic struct af_config_interface af_config_interfaces[] = {\n\t{AF_CMD_ADD_APPID, af_config_add_appid, \"Add App ID\"},\n\t{AF_CMD_DEL_APPID, af_config_del_appid, \"Delete App ID\"},\n\t{AF_CMD_CLEAN_APPID, af_config_clean_appid, \"Clean App ID\"},\n\t{AF_CMD_SET_MAC_LIST, af_config_set_mac_list, \"Set MAC List\"},\n\t{AF_CMD_SET_WHITELIST_MAC_LIST, af_config_set_whitelist_mac_list, \"Set Whitelist MAC List\"},\n\t{0, NULL, NULL} \n};\n\nstatic af_config_handler_t af_find_handler(enum AF_CONFIG_CMD cmd)\n{\n\tstruct af_config_interface *interface = af_config_interfaces;\n\t\n\twhile (interface->handler != NULL) {\n\t\tif (interface->cmd == cmd) {\n\t\t\treturn interface->handler;\n\t\t}\n\t\tinterface++;\n\t}\n\treturn NULL;\n}\n\n/*\nadd:\n{\n\t\"op\":1,\n\t\"data\":{\n\t\t\"apps\":[]\n\t}\n}\nclean\n{\n\t\"op\":3,\n}\n*/\nint af_config_handle(char *config, unsigned int len)\n{\n\tcJSON *config_obj = NULL;\n\tcJSON *cmd_obj = NULL;\n\tcJSON *data_obj = NULL;\n\tint ret = 0;\n\taf_config_handler_t handler = NULL;\n\t\n\tif (!config || len == 0)\n\t{\n\t\tAF_ERROR(\"config or len is invalid\\n\");\n\t\treturn -1;\n\t}\n\t\n\tAF_DEBUG(\"config = %s\\n\", config);\n\tconfig_obj = cJSON_Parse(config);\n\tif (!config_obj)\n\t{\n\t\tAF_ERROR(\"config_obj is NULL\\n\");\n\t\treturn -1;\n\t}\n\t\n\tcmd_obj = cJSON_GetObjectItem(config_obj, \"op\");\n\tif (!cmd_obj)\n\t{\n\t\tAF_ERROR(\"not find op object\\n\");\n\t\tcJSON_Delete(config_obj);\n\t\treturn -1;\n\t}\n\t\n\tdata_obj = cJSON_GetObjectItem(config_obj, \"data\");\n\n\thandler = af_find_handler(cmd_obj->valueint);\n\tif (handler) {\n\t\tret = handler(data_obj);\n\t\tg_update_jiffies = jiffies;\n\t\tcJSON_Delete(config_obj);\n\t\treturn ret;\n\t} else {\n\t\tAF_ERROR(\"invalid cmd %d\\n\", cmd_obj->valueint);\n\t\tcJSON_Delete(config_obj);\n\t\treturn -1;\n\t}\n}\n\n\nstatic int af_cdev_open(struct inode *inode, struct file *filp)\n{\n\tstruct af_cdev_file *file;\n\tfile = vzalloc(sizeof(*file));\n\tif (!file)\n\t\treturn -EINVAL;\n\n\tmutex_lock(&af_cdev_mutex);\n\tfilp->private_data = file;\n\treturn 0;\n}\n\nstatic ssize_t af_cdev_read(struct file *filp, char *buf, size_t count, loff_t *off)\n{\n\treturn 0;\n}\n\nstatic int af_cdev_release(struct inode *inode, struct file *filp)\n{\n\tstruct af_cdev_file *file = filp->private_data;\n\tAF_DEBUG(\"config size: %d,data = %s\\n\", (int)file->size, file->buf);\n\taf_config_handle(file->buf, file->size);\n\tfilp->private_data = NULL;\n\tmutex_unlock(&af_cdev_mutex);\n\tvfree(file);\n\treturn 0;\n}\n\nstatic ssize_t af_cdev_write(struct file *filp, const char *buffer, size_t count, loff_t *off)\n{\n\tstruct af_cdev_file *file = filp->private_data;\n\tint ret;\n\tif (file->size + count > sizeof(file->buf))\n\t{\n\t\tAF_ERROR(\"config overflow, cur_size: %d, block_size: %d, max_size: %d\",\n\t\t\t\t (int)file->size, (int)count, (int)sizeof(file->buf));\n\t\treturn -EINVAL;\n\t}\n\n\tret = copy_from_user(file->buf + file->size, buffer, count);\n\tif (ret != 0)\n\t\treturn -EINVAL;\n\n\tfile->size += count;\n\treturn count;\n}\n\nstatic struct file_operations af_cdev_ops = {\n\towner : THIS_MODULE,\n\trelease : af_cdev_release,\n\topen : af_cdev_open,\n\twrite : af_cdev_write,\n\tread : af_cdev_read,\n};\n\nint af_register_dev(void)\n{\n\tstruct device *dev;\n\tint res;\n\tmutex_init(&af_cdev_mutex);\n\n\tres = alloc_chrdev_region(&g_af_dev.id, 0, 1, AF_DEV_NAME);\n\tif (res != 0)\n\t{\n\t\treturn -EINVAL;\n\t}\n\n\tcdev_init(&g_af_dev.char_dev, &af_cdev_ops);\n\tres = cdev_add(&g_af_dev.char_dev, g_af_dev.id, 1);\n\tif (res < 0)\n\t{\n\t\tgoto REGION_OUT;\n\t}\n\n#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0)\n\tg_af_dev.c = class_create(THIS_MODULE, AF_DEV_NAME);\n#else\n    g_af_dev.c = class_create(AF_DEV_NAME);\n#endif\n\tif (IS_ERR_OR_NULL(g_af_dev.c))\n\t{\n\t\tgoto CDEV_OUT;\n\t}\n\n\tdev = device_create(g_af_dev.c, NULL, g_af_dev.id, NULL, AF_DEV_NAME);\n\tif (IS_ERR_OR_NULL(dev))\n\t{\n\t\tgoto CLASS_OUT;\n\t}\n\tAF_INFO(\"register char dev....ok\\n\");\n\treturn 0;\n\nCLASS_OUT:\n\tclass_destroy(g_af_dev.c);\nCDEV_OUT:\n\tcdev_del(&g_af_dev.char_dev);\nREGION_OUT:\n\tunregister_chrdev_region(g_af_dev.id, 1);\n\n\tAF_ERROR(\"register char dev....fail\\n\");\n\treturn -EINVAL;\n}\n\nvoid af_unregister_dev(void)\n{\n\tdevice_destroy(g_af_dev.c, g_af_dev.id);\n\tclass_destroy(g_af_dev.c);\n\tcdev_del(&g_af_dev.char_dev);\n\tunregister_chrdev_region(g_af_dev.id, 1);\n\tAF_INFO(\"unregister char dev....ok\\n\");\n}\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_config.h",
    "content": "#ifndef __AF_CONFIG_H__\n#define __AF_CONFIG_H__\n#include \"app_filter.h\"\n\nenum AF_CONFIG_CMD\n{\n\tAF_CMD_ADD_APPID = 1,\n\tAF_CMD_DEL_APPID,\n\tAF_CMD_CLEAN_APPID,\n\tAF_CMD_SET_MAC_LIST,\n\tAF_CMD_SET_WHITELIST_MAC_LIST,\n};\n\ntypedef int (*af_config_handler_t)(cJSON *data);\n\nstruct af_config_interface\n{\n\tenum AF_CONFIG_CMD cmd;\n\taf_config_handler_t handler;\n\tconst char *description;\n};\n\nint af_register_dev(void);\nvoid af_unregister_dev(void);\n\nint af_config_add_appid(cJSON *data);\nint af_config_del_appid(cJSON *data);\nint af_config_clean_appid(cJSON *data);\nint af_config_set_mac_list(cJSON *data);\nint af_config_set_whitelist_mac_list(cJSON *data);\n\n\n#endif"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_conntrack.c",
    "content": "#include <linux/init.h>\r\n#include <linux/module.h>\r\n#include <linux/version.h>\r\n#include <linux/types.h>\r\n#include <linux/device.h>\r\n#include <linux/module.h>\r\n#include <linux/slab.h>\r\n#include <linux/list.h>\r\n#include <linux/spinlock.h>\r\n#include <linux/jhash.h>\r\n#include <linux/seq_file.h>\r\n#include <linux/proc_fs.h>\r\n#include <linux/sysctl.h>\r\n#include <net/ip.h>\r\n#include <linux/types.h>\r\n#include <net/sock.h>\r\n#include <linux/etherdevice.h>\r\n#include <linux/cdev.h>\r\n#include \"af_conntrack.h\"\r\n#include \"af_log.h\"\r\n\r\nstruct hlist_head af_conn_table[AF_CONN_HASH_SIZE];\r\n\r\nDEFINE_SPINLOCK(af_conn_lock);\r\n\r\nstatic u32 af_conn_hash(u32 src_ip, u32 dst_ip, \r\n                       u16 src_port, u16 dst_port, \r\n                       u8 protocol)\r\n{\r\n    return jhash_3words(src_ip, dst_ip,\r\n                       ((u32)protocol << 16) | src_port,\r\n                       dst_port) % AF_CONN_HASH_SIZE;\r\n}\r\n\r\n\r\nvoid af_conn_cleanup(void)\r\n{\r\n    int i;\r\n    spin_lock(&af_conn_lock);\r\n\taf_conn_t *p = NULL;\r\n\tstruct hlist_node *n;\r\n\r\n\tfor (i = 0; i < AF_CONN_HASH_SIZE; i++)\r\n\t{\r\n\t\thlist_for_each_entry_safe(p, n, &af_conn_table[i], node)\r\n\t\t{\r\n\t\t\thlist_del(&p->node);\r\n\t\t\tkfree(p);\r\n\t\t}\r\n\t}\r\n    spin_unlock(&af_conn_lock);\r\n}\r\n\r\naf_conn_t *af_conn_add(u32 src_ip, u32 dst_ip, u16 src_port, u16 dst_port, u8 protocol)\r\n{\r\n    u32 hash;\r\n    af_conn_t *conn;\r\n    hash = af_conn_hash(src_ip, dst_ip, src_port, dst_port, protocol);\r\n    conn = kmalloc(sizeof(af_conn_t), GFP_ATOMIC);\r\n    if (!conn) {\r\n        return NULL;\r\n    }\r\n    \r\n    conn->src_ip = src_ip;\r\n    conn->dst_ip = dst_ip;\r\n    conn->src_port = src_port;\r\n    conn->dst_port = dst_port;\r\n    conn->protocol = protocol;\r\n    conn->total_pkts = 0;\r\n    conn->app_id = 0;\r\n\tconn->client_hello = 0;\r\n    conn->drop = 0;\r\n    conn->state = AF_CONN_NEW;\r\n    conn->last_jiffies = jiffies;\r\n    hlist_add_head(&conn->node, &af_conn_table[hash]);\r\n    AF_LMT_INFO(\"add new conn ok...%pI4:%d->%pI4:%d %d\\n\",\r\n        &conn->src_ip, conn->src_port, &conn->dst_ip, conn->dst_port, conn->protocol);\r\n    return conn;\r\n}\r\n\r\n\r\naf_conn_t* af_conn_find(u32 src_ip, u32 dst_ip, u16 src_port, u16 dst_port, u8 protocol)\r\n{\r\n    u32 hash;\r\n    af_conn_t *conn;\r\n    \r\n    hash = af_conn_hash(src_ip, dst_ip, src_port, dst_port, protocol);\r\n\thlist_for_each_entry(conn, &af_conn_table[hash], node)\r\n\t{\r\n\t\tif (conn->src_ip == src_ip && conn->dst_ip == dst_ip &&\r\n            conn->src_port == src_port && conn->dst_port == dst_port &&\r\n            conn->protocol == protocol) {\r\n            return conn;\r\n        }\r\n\t}\r\n    return NULL;\r\n}\r\n\r\n\r\naf_conn_t* af_conn_find_and_add(u32 src_ip, u32 dst_ip, u16 src_port, u16 dst_port, u8 protocol)\r\n{\r\n    af_conn_t *conn;\r\n    conn = af_conn_find(src_ip, dst_ip, src_port, dst_port, protocol);\r\n    if (!conn)\r\n    {\r\n        conn = af_conn_add(src_ip, dst_ip, src_port, dst_port, protocol);\r\n    }\r\n    return conn;\r\n}\r\n\r\n\r\nvoid af_conn_update(af_conn_t *conn, u32 app_id, u8 drop)\r\n{\r\n    spin_lock(&af_conn_lock);\r\n    conn->app_id = app_id;\r\n    conn->drop = drop;\r\n    conn->last_jiffies = jiffies;\r\n    spin_unlock(&af_conn_lock);\r\n}\r\n\r\n#define MAX_AF_CONN_CHECK_COUNT 5\r\nvoid af_conn_clean_timeout(void)\r\n{\r\n    int i;\r\n    af_conn_t *conn;\r\n    struct hlist_node *n;\r\n    unsigned long timeout = AF_CONN_TIMEOUT * HZ;\r\n    static int last_bucket = 0;\r\n    int count = 0;\r\n    spin_lock(&af_conn_lock);\r\n    for (i = last_bucket; i < AF_CONN_HASH_SIZE; i++)\r\n    {\r\n        hlist_for_each_entry_safe(conn, n, &af_conn_table[i], node)\r\n        {\r\n            if (time_after(jiffies, conn->last_jiffies + timeout)) {\r\n                AF_LMT_INFO(\"clean timeout conn ok...%pI4:%d->%pI4:%d %d\\n\",\r\n                 &conn->src_ip, conn->src_port, &conn->dst_ip, conn->dst_port, conn->protocol);\r\n                hlist_del(&(conn->node));\r\n                kfree(conn);\r\n            }\r\n        }\r\n        last_bucket = i;\r\n        count++;\r\n        if (count > MAX_AF_CONN_CHECK_COUNT)\r\n            break;\r\n    }\r\n    if (last_bucket == AF_CONN_HASH_SIZE - 1)\r\n    {\r\n        last_bucket = 0;\r\n    }\r\n    spin_unlock(&af_conn_lock);\r\n} \r\n\r\nstruct af_conn_iter_state\r\n{\r\n    unsigned int bucket;\r\n};\r\n\r\n\r\nstatic void *af_conn_seq_start(struct seq_file *s, loff_t *pos)\r\n{\r\n    if (*pos == 0)\r\n    {\r\n        return SEQ_START_TOKEN;\r\n    }\r\n    struct af_conn_iter_state *st = s->private;\r\n    while (st->bucket < AF_CONN_HASH_SIZE){\r\n        if (!hlist_empty(&(af_conn_table[st->bucket])))\r\n        {\r\n            return &af_conn_table[st->bucket++].first->next;\r\n        }\r\n        st->bucket++;\r\n    }\r\n    return NULL;\r\n}\r\n\r\nstatic void *af_conn_seq_next(struct seq_file *s, void *v, loff_t *pos)\r\n{\r\n    (*pos)++;\r\n    if (v == SEQ_START_TOKEN){\r\n        return NULL;\r\n    }\r\n    struct hlist_node *node = (struct hlist_node *)v;\r\n    node = node->next;\r\n    if (node != NULL)\r\n        return node;\r\n    return NULL;\r\n}\r\n\r\nstatic void af_conn_seq_stop(struct seq_file *s, void *v)\r\n{\r\n}\r\n\r\nstatic int af_conn_seq_show(struct seq_file *s, void *v)\r\n{\r\n    unsigned char src_ip_str[32] = {0};\r\n    unsigned char dst_ip_str[32] = {0};\r\n    static int index = 0;\r\n    af_conn_t *node = (af_conn_t *)v;\r\n    if (v == SEQ_START_TOKEN)\r\n    {\r\n        index = 0;\r\n        seq_printf(s, \"%-4s %-20s %-20s %-12s %-12s %-12s %-12s %-12s %-12s %-12s\\n\", \r\n        \"Id\", \"src_ip\", \"dst_ip\", \"src_port\", \"dst_port\", \"protocol\", \"app_id\", \"drop\", \"inactive\", \"total_pkts\");\r\n        return 0;\r\n    }\r\n\r\n    index++;\r\n    sprintf(src_ip_str, \"%pI4\", &node->src_ip);\r\n    sprintf(dst_ip_str, \"%pI4\", &node->dst_ip);\r\n    u_int32_t inactive_time = jiffies - node->last_jiffies;\r\n\r\n    seq_printf(s, \"%-4d %-20s %-20s %-12d %-12d %-12d %-12d %-12d %-12d %-12d\\n\", index, src_ip_str, dst_ip_str,\r\n               node->src_port, node->dst_port, node->protocol, node->app_id, node->drop, inactive_time, node->total_pkts);\r\n    return 0;\r\n}\r\nstatic const struct seq_operations af_conn_seq_ops = {\r\n    .start = af_conn_seq_start,\r\n    .next = af_conn_seq_next,\r\n    .stop = af_conn_seq_stop,\r\n    .show = af_conn_seq_show\r\n};\r\n\r\n\r\nstatic int af_conn_open(struct inode *inode, struct file *file)\r\n{\r\n    struct seq_file *seq;\r\n    struct af_conn_iter_state *iter;\r\n    int err;\r\n\r\n    iter = kzalloc(sizeof(*iter), GFP_KERNEL);\r\n    if (!iter)\r\n        return -ENOMEM;\r\n\r\n    err = seq_open(file, &af_conn_seq_ops);\r\n    if (err)\r\n    {\r\n        kfree(iter);\r\n        return err;\r\n    }\r\n\r\n    seq = file->private_data;\r\n    seq->private = iter;\r\n    return 0;\r\n}\r\n\r\n#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 5, 0)\r\nstatic const struct file_operations af_conn_fops = {\r\n    .owner = THIS_MODULE,\r\n    .open = af_conn_open,\r\n    .read = seq_read,\r\n    .llseek = seq_lseek,\r\n    .release = seq_release_private,\r\n};\r\n#else\r\nstatic const struct proc_ops af_conn_fops = {\r\n    .proc_flags = PROC_ENTRY_PERMANENT,\r\n    .proc_read = seq_read,\r\n    .proc_open = af_conn_open,\r\n    .proc_lseek = seq_lseek,\r\n    .proc_release = seq_release_private,\r\n};\r\n#endif\r\n\r\n#define AF_CONN_PROC_STR \"af_conn\"\r\n\r\nint af_conn_init_procfs(void)\r\n{\r\n    struct proc_dir_entry *pde;\r\n    struct net *net = &init_net;\r\n    pde = proc_create(AF_CONN_PROC_STR, 0644, net->proc_net, &af_conn_fops);\r\n    if (!pde)\r\n    {\r\n        printk(\"af_conn seq file created error\\n\");\r\n        return -1;\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nvoid af_conn_remove_procfs(void)\r\n{\r\n    struct net *net = &init_net;\r\n    remove_proc_entry(AF_CONN_PROC_STR, net->proc_net);\r\n}\r\n\r\n\r\nint af_conn_init(void)\r\n{\r\n    int i;\r\n    for (i = 0; i < AF_CONN_HASH_SIZE; i++)\r\n\t{\r\n\t\tINIT_HLIST_HEAD(&af_conn_table[i]);\r\n\t}\r\n    af_conn_init_procfs(); \r\n    return 0;\r\n}\r\n\r\nvoid af_conn_exit(void){\r\n    af_conn_remove_procfs();\r\n    af_conn_cleanup();\r\n}\r\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_conntrack.h",
    "content": "#ifndef __AF_SIMPLE_CONNTRACK_H__\r\n#define __AF_SIMPLE_CONNTRACK_H__\r\n\r\n#include <linux/types.h>\r\n#include <linux/list.h>\r\n#define AF_CONN_TIMEOUT 30  \r\n#define AF_CONN_HASH_SIZE 256\r\n\r\nextern spinlock_t af_conn_lock;\r\ntypedef enum {\r\n    AF_CONN_NEW = 0,\r\n    AF_CONN_ESTABLISHED,\r\n    AF_CONN_DPI_FINISHED,\r\n} af_conn_state_t;\r\n\r\ntypedef struct {\r\n    struct hlist_node node;     \r\n    u32 src_ip;\r\n    u32 dst_ip;\r\n    u16 src_port;\r\n    u16 dst_port;\r\n    u8  protocol;\r\n    u32 total_pkts;\r\n    u32 app_id;\r\n\tu8 client_hello;\r\n    u8  drop;\r\n    u8 ignore;\r\n    af_conn_state_t state;      \r\n    unsigned long last_jiffies;\r\n} af_conn_t;\r\n\r\nint af_conn_init(void);\r\n\r\nvoid af_conn_cleanup(void);\r\naf_conn_t* af_conn_add(u32 src_ip, u32 dst_ip, \r\n                       u16 src_port, u16 dst_port, \r\n                       u8 protocol);\r\n\r\naf_conn_t* af_conn_find(u32 src_ip, u32 dst_ip, \r\n                       u16 src_port, u16 dst_port, \r\n                       u8 protocol);\r\n\r\naf_conn_t* af_conn_find_and_add(u32 src_ip, u32 dst_ip, \r\n                       u16 src_port, u16 dst_port, \r\n                       u8 protocol);\r\n\r\nvoid af_conn_update(af_conn_t *conn, u32 app_id, u8 drop);\r\n\r\nvoid af_conn_clean_timeout(void);\r\n\r\n\r\nvoid af_conn_exit(void);\r\n#endif \r\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_log.c",
    "content": "#include <linux/init.h>\r\n#include <linux/fs.h>\r\n#include <linux/version.h>\r\n#include <linux/seq_file.h>\r\n#include <linux/list.h>\r\n#include <linux/sysctl.h>\r\n#include \"app_filter.h\"\r\n#include \"af_log.h\"\r\nint af_log_lvl = 1;\r\nint af_test_mode = 0;\r\n// todo: rename af_log.c\r\nint g_oaf_filter_enable __read_mostly = 0;\r\nint g_oaf_record_enable __read_mostly = 0;\r\nint g_by_pass_accl = 1;\r\nint g_user_mode = 0;\r\nint af_work_mode = AF_MODE_GATEWAY;\r\nunsigned int af_lan_ip = 0;\r\nunsigned int af_lan_mask = 0;\r\nchar g_lan_ifname[64] = \"br-lan\";\r\nint g_tcp_rst = 1;\r\nint g_feature_init = 0;\r\nchar g_oaf_version[64] = AF_VERSION;\r\nint g_disable_quic = 0;\r\nint g_app_filter_mode = 0; // 0 = specified apps, 1 = all apps\r\n/* \r\n\tcat /proc/sys/oaf/debug\r\n*/\r\nstatic struct ctl_table oaf_table[] = {\r\n\t{\r\n\t\t.procname\t= \"debug\",\r\n\t\t.data\t\t= &af_log_lvl,\r\n\t\t.maxlen \t= sizeof(int),\r\n\t\t.mode\t\t= 0666,\r\n\t\t.proc_handler\t= proc_dointvec,\r\n\t},\r\n\t{\r\n\t\t.procname\t= \"feature_init\",\r\n\t\t.data\t\t= &g_feature_init,\r\n\t\t.maxlen \t= sizeof(int),\r\n\t\t.mode\t\t= 0666,\r\n\t\t.proc_handler\t= proc_dointvec,\r\n\t},\r\n\t{\r\n\t\t.procname\t= \"version\",\r\n\t\t.data\t\t= g_oaf_version,\r\n\t\t.maxlen \t= 64,\r\n\t\t.mode\t\t= 0444,\r\n\t\t.proc_handler = proc_dostring,\r\n\t},\r\n\t{\r\n\t\t.procname\t= \"test_mode\",\r\n\t\t.data\t\t= &af_test_mode,\r\n\t\t.maxlen \t= sizeof(int),\r\n\t\t.mode\t\t= 0666,\r\n\t\t.proc_handler\t= proc_dointvec,\r\n\t},\r\n\t{\r\n\t\t.procname\t= \"enable\",\r\n\t\t.data\t\t= &g_oaf_filter_enable,\r\n\t\t.maxlen \t= sizeof(int),\r\n\t\t.mode\t\t= 0666,\r\n\t\t.proc_handler\t= proc_dointvec,\r\n\t},\r\n\t{\r\n\t\t.procname\t= \"by_pass_accl\",\r\n\t\t.data\t\t= &g_by_pass_accl,\r\n\t\t.maxlen \t= sizeof(int),\r\n\t\t.mode\t\t= 0666,\r\n\t\t.proc_handler\t= proc_dointvec,\r\n\t},\r\n\t{\r\n\t\t.procname\t= \"tcp_rst\",\r\n\t\t.data\t\t= &g_tcp_rst,\r\n\t\t.maxlen \t= sizeof(int),\r\n\t\t.mode\t\t= 0666,\r\n\t\t.proc_handler\t= proc_dointvec,\r\n\t},\r\n\t{\r\n\t\t.procname\t= \"lan_ifname\",\r\n\t\t.data\t\t= g_lan_ifname,\r\n\t\t.maxlen \t= 64,\r\n\t\t.mode\t\t= 0666,\r\n\t\t.proc_handler = proc_dostring,\r\n\t},\r\n\t{\r\n\t\t.procname\t= \"record_enable\",\r\n\t\t.data\t\t= &g_oaf_record_enable,\r\n\t\t.maxlen \t= sizeof(int),\r\n\t\t.mode\t\t= 0666,\r\n\t\t.proc_handler\t= proc_dointvec,\r\n\t},\r\n\t{\r\n\t\t.procname\t= \"user_mode\",\r\n\t\t.data\t\t= &g_user_mode,\r\n\t\t.maxlen \t= sizeof(int),\r\n\t\t.mode\t\t= 0666,\r\n\t\t.proc_handler\t= proc_dointvec,\r\n\t},\r\n\t{\r\n\t\t.procname\t= \"work_mode\",\r\n\t\t.data\t\t= &af_work_mode,\r\n\t\t.maxlen \t= sizeof(int),\r\n\t\t.mode\t\t= 0666,\r\n\t\t.proc_handler\t= proc_dointvec,\r\n\t},\r\n\t{\r\n\t\t.procname\t= \"lan_ip\",\r\n\t\t.data\t\t= &af_lan_ip,\r\n\t\t.maxlen = \tsizeof(unsigned int),\r\n\t\t.mode\t\t= 0666,\r\n\t\t.proc_handler\t= proc_douintvec,\r\n\t},\r\n\t{\r\n\t\t.procname = \"lan_mask\",\r\n\t\t.data = &af_lan_mask,\r\n\t\t.maxlen = sizeof(unsigned int),\r\n\t\t.mode = 0666,\r\n\t\t.proc_handler = proc_douintvec,\r\n\t},\r\n\t{\r\n\t\t.procname\t= \"disable_quic\",\r\n\t\t.data\t\t= &g_disable_quic,\r\n\t\t.maxlen \t= sizeof(int),\r\n\t\t.mode\t\t= 0666,\r\n\t\t.proc_handler\t= proc_dointvec,\r\n\t},\r\n\t{\r\n\t\t.procname\t= \"app_filter_mode\",\r\n\t\t.data\t\t= &g_app_filter_mode,\r\n\t\t.maxlen \t= sizeof(int),\r\n\t\t.mode\t\t= 0666,\r\n\t\t.proc_handler\t= proc_dointvec,\r\n\t},\r\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 12, 0))\r\n\t{\r\n\t}\r\n#endif\r\n};\r\n#define OAF_SYS_PROC_DIR \"oaf\"\r\n\r\nstatic struct ctl_table oaf_root_table[] = {\r\n\t{\r\n\t\t.procname\t= OAF_SYS_PROC_DIR,\r\n\t\t.mode\t\t= 0555,\r\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0))\r\n\t\t.child\t\t= oaf_table,\r\n#endif\r\n\t},\r\n\t{}\r\n};\r\nstatic struct ctl_table_header *oaf_table_header;\r\n\r\n\r\nstatic int af_init_log_sysctl(void)\r\n{\r\n#if (LINUX_VERSION_CODE < KERNEL_VERSION(6, 4, 0))\r\n\toaf_table_header = register_sysctl_table(oaf_root_table);\r\n#else\r\n\toaf_table_header = register_sysctl(OAF_SYS_PROC_DIR, oaf_table);\r\n#endif\r\n\tif (oaf_table_header == NULL){\r\n\t\tprintk(\"init log sysctl...failed\\n\");\r\n\t\treturn -ENOMEM;\r\n\t}\r\n\treturn 0;\r\n}\r\n\r\nstatic int af_fini_log_sysctl(void)\r\n{\r\n\tif (oaf_table_header)\r\n\t\tunregister_sysctl_table(oaf_table_header);\r\n\treturn 0;\r\n}\r\n\r\nint af_log_init(void){\r\n\taf_init_log_sysctl();\r\n\treturn 0;\r\n}\r\n\r\nint af_log_exit(void){\r\n\taf_fini_log_sysctl();\r\n\treturn 0;\r\n}\r\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_log.h",
    "content": "#ifndef __AF_DEBUG_H__\r\n#define __AF_DEBUG_H__\r\nextern int af_log_lvl;\r\nextern int af_test_mode;\r\nextern int af_work_mode;\r\nextern int g_oaf_filter_enable;\r\nextern int g_oaf_record_enable;\r\nextern int g_by_pass_accl;\r\nextern unsigned int af_lan_ip;\r\nextern unsigned int af_lan_mask;\r\nextern int g_feature_init;\r\nextern int g_user_mode;\r\nextern int g_disable_quic;\r\nextern int g_app_filter_mode;\r\nextern char g_lan_ifname[64];\r\nextern int g_tcp_rst;\r\n#define LOG(level, fmt, ...) do { \\\r\n    if ((level) <= af_log_lvl) { \\\r\n        printk(fmt, ##__VA_ARGS__); \\\r\n    } \\\r\n} while (0)\r\n\r\n#define LLOG(level, fmt, ...) do { \\\r\n\tif ((level) <= af_log_lvl) { \\\r\n\t\tpr_info_ratelimited(fmt, ##__VA_ARGS__); \\\r\n\t} \\\r\n} while (0)\r\n\r\n\r\n#define AF_ERROR(...)\t\t\tLOG(0, ##__VA_ARGS__)\r\n#define AF_WARN(...)         \tLOG(1, ##__VA_ARGS__)\r\n#define AF_INFO(...)         \tLOG(2, ##__VA_ARGS__)\r\n#define AF_DEBUG(...)       \tLOG(3, ##__VA_ARGS__)\r\n\r\n#define AF_LMT_ERROR(...)      \tLLOG(0, ##__VA_ARGS__)\r\n#define AF_LMT_WARN(...)       \tLLOG(1, ##__VA_ARGS__)\r\n#define AF_LMT_INFO(...)       \tLLOG(2, ##__VA_ARGS__)\r\n#define AF_LMT_DEBUG(...)     \tLLOG(3, ##__VA_ARGS__)\r\n\r\n\r\n#define TEST_MODE() (af_test_mode)\r\nint af_log_init(void);\r\nint af_log_exit(void);\r\n#endif\r\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_rule_config.c",
    "content": "#include <linux/init.h>\n#include <linux/module.h>\n#include <linux/types.h>\n#include <linux/version.h>\n#include \"cJSON.h\"\n#include \"app_filter.h\"\n#include \"af_utils.h\"\n#include \"af_log.h\"\n\n#define AF_MAX_APP_TYPE_NUM 32\n#define AF_MAX_APP_NUM 512\n\nDEFINE_RWLOCK(af_rule_lock);\n\n#define af_rule_read_lock() read_lock_bh(&af_rule_lock);\n#define af_rule_read_unlock() read_unlock_bh(&af_rule_lock);\n#define af_rule_write_lock() write_lock_bh(&af_rule_lock);\n#define af_rule_write_unlock() write_unlock_bh(&af_rule_lock);\n\nextern u_int32_t g_update_jiffies;\n\nchar g_app_id_array[AF_MAX_APP_TYPE_NUM][AF_MAX_APP_NUM] = {0};\n\nvoid af_show_app_status(void)\n{\n\tint i, j;\n\tfor (i = 0; i < AF_MAX_APP_TYPE_NUM; i++)\n\t{\n\t\tfor (j = 0; j < AF_MAX_APP_NUM; j++)\n\t\t{\n\t\t\taf_rule_read_lock();\n\t\t\tif (g_app_id_array[i][j] == AF_TRUE)\n\t\t\t{\n\t\t\t\tAF_DEBUG(\"%d, %d\\n\", i, j);\n\t\t\t}\n\t\t\taf_rule_read_unlock();\n\t\t}\n\t}\n\n\tAF_DEBUG(\"\\n\\n\\n\");\n}\n\nint af_change_app_status(cJSON *data_obj, int status)\n{\n\tint i;\n\tint id;\n\tint type;\n\tcJSON *appid_arr = NULL;\n\tif (!data_obj)\n\t{\n\t\tAF_ERROR(\"data obj is null\\n\");\n\t\treturn -1;\n\t}\n\tappid_arr = cJSON_GetObjectItem(data_obj, \"apps\");\n\tif (!appid_arr)\n\t{\n\t\tAF_ERROR(\"apps obj is null\\n\");\n\t\treturn -1;\n\t}\n\tfor (i = 0; i < cJSON_GetArraySize(appid_arr); i++)\n\t{\n\t\tcJSON *appid_obj = cJSON_GetArrayItem(appid_arr, i);\n\t\tif (!appid_obj)\n\t\t\treturn -1;\n\t\tid = AF_APP_ID(appid_obj->valueint);\n\t\ttype = AF_APP_TYPE(appid_obj->valueint);\n\t\taf_rule_write_lock();\n\t\tg_app_id_array[type][id] = status;\n\t\taf_rule_write_unlock();\n\t}\n\n\treturn 0;\n}\n\n\n\nvoid af_init_app_status(void)\n{\n\tint i, j;\n\n\tfor (i = 0; i < AF_MAX_APP_TYPE_NUM; i++)\n\t{\n\t\tfor (j = 0; j < AF_MAX_APP_NUM; j++)\n\t\t{\n\t\t\taf_rule_write_lock();\n\t\t\tg_app_id_array[i][j] = AF_FALSE;\n\t\t\taf_rule_write_unlock();\n\t\t}\n\t}\n}\nint af_get_app_status(int appid)\n{\n\tint status = 0;\n\tint id = AF_APP_ID(appid);\n\tint type = AF_APP_TYPE(appid);\n\taf_rule_read_lock();\n\tstatus = g_app_id_array[type][id];\n\taf_rule_read_unlock();\n\treturn status;\n}\n\nint af_config_add_appid(cJSON *data)\n{\n\treturn af_change_app_status(data, 1);\n}\n\nint af_config_del_appid(cJSON *data)\n{\n\treturn af_change_app_status(data, 0);\n}\n\nint af_config_clean_appid(cJSON *data)\n{\n\taf_init_app_status();\n\treturn 0;\n}"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_rule_config.h",
    "content": "#ifndef __AF_RULE_CONFIG_H__\n#define __AF_RULE_CONFIG_H__\n#include \"app_filter.h\"\n#include \"af_utils.h\"\n#include \"af_log.h\"\nvoid af_init_app_status(void);\nint af_get_app_status(int appid);\n\n#endif"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_user_config.c",
    "content": "#include <linux/init.h>\n#include <linux/module.h>\n#include <linux/types.h>\n#include <linux/vmalloc.h>\n#include <linux/version.h>\n#include \"app_filter.h\"\n#include \"af_utils.h\"\n#include \"af_log.h\"\n#include \"cJSON.h\"\n#include \"af_whitelist_config.h\"\n#include \"af_user_config.h\"\n\nDEFINE_RWLOCK(af_mac_lock);\n\nu32 total_mac = 0;\nstruct list_head af_mac_htable[MAX_AF_MAC_HASH_SIZE];\nvoid af_mac_list_init(void)\n{\n\tint i;\n\twrite_lock_bh(&af_mac_lock);\n\tfor (i = 0; i < MAX_AF_MAC_HASH_SIZE; i++)\n\t{\n\t\tINIT_LIST_HEAD(&af_mac_htable[i]);\n\t}\n\twrite_unlock_bh(&af_mac_lock);\n}\n\nvoid af_mac_list_flush(void)\n{\n\tint i;\n\taf_mac_node_t *p = NULL;\n\tchar mac_str[32] = {0};\n\twrite_lock_bh(&af_mac_lock);\n\tfor (i = 0; i < MAX_AF_MAC_HASH_SIZE; i++)\n\t{\n\t\twhile (!list_empty(&af_mac_htable[i]))\n\t\t{\n\t\t\tp = list_first_entry(&af_mac_htable[i], af_mac_node_t, list);\n\t\t\tmemset(mac_str, 0x0, sizeof(mac_str));\n\t\t\tsprintf(mac_str, MAC_FMT, MAC_ARRAY(p->mac));\n\t\t\tlist_del(&(p->list));\n\t\t\tkfree(p);\n\t\t}\n\t}\n\ttotal_mac = 0;\n\twrite_unlock_bh(&af_mac_lock);\n}\n\naf_mac_node_t *af_mac_find(unsigned char *mac)\n{\n\taf_mac_node_t *node;\n\tunsigned int index;\n\n\tindex = hash_mac(mac);\n\tread_lock_bh(&af_mac_lock);\n\tlist_for_each_entry(node, &af_mac_htable[index], list)\n\t{\n\t\tif (0 == memcmp(node->mac, mac, 6))\n\t\t{\n\t\t\tread_unlock_bh(&af_mac_lock);\n\t\t\treturn node;\n\t\t}\n\t}\n\tread_unlock_bh(&af_mac_lock);\n\treturn NULL;\n}\n\naf_mac_node_t *af_mac_add(unsigned char *mac)\n{\n\taf_mac_node_t *node;\n\tint index = 0;\n\n\tnode = (af_mac_node_t *)kmalloc(sizeof(af_mac_node_t), GFP_ATOMIC);\n\tif (node == NULL)\n\t{\n\t\treturn NULL;\n\t}\n\n\tmemset(node, 0, sizeof(af_mac_node_t));\n\tmemcpy(node->mac, mac, MAC_ADDR_LEN);\n\n\tindex = hash_mac(mac);\n\n\tprintk(\"add user mac=\" MAC_FMT \"\\n\", MAC_ARRAY(node->mac));\n\ttotal_mac++;\n\twrite_lock_bh(&af_mac_lock);\n\tlist_add(&(node->list), &af_mac_htable[index]);\n\twrite_unlock_bh(&af_mac_lock);\n\treturn node;\n}\n\nint is_user_match_enable(void)\n{\n\treturn total_mac > 0;\n}\n\n\n\nint af_config_set_mac_list(cJSON *data_obj)\n{\n\tint i;\n\tcJSON *mac_arr = NULL;\n\tu8 mac_hex[MAC_ADDR_LEN] = {0};\n\tif (!data_obj)\n\t{\n\t\tAF_ERROR(\"data obj is null\\n\");\n\t\treturn -1;\n\t}\n\tmac_arr = cJSON_GetObjectItem(data_obj, \"mac_list\");\n\tif (!mac_arr)\n\t{\n\t\tAF_ERROR(\"mac_list obj is null\\n\");\n\t\treturn -1;\n\t}\n\taf_mac_list_flush();\n\tfor (i = 0; i < cJSON_GetArraySize(mac_arr); i++)\n\t{\n\t\tcJSON *mac_obj = cJSON_GetArrayItem(mac_arr, i);\n\t\tif (!mac_obj)\n\t\t{\n\t\t\tAF_ERROR(\"mac obj is null\\n\");\n\t\t\treturn -1;\n\t\t}\n\t\tif (-1 == mac_to_hex(mac_obj->valuestring, mac_hex))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\taf_mac_add(mac_hex);\n\t}\n\tAF_DEBUG(\"## mac num = %d\\n\", total_mac);\n\treturn 0;\n}\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_user_config.h",
    "content": "#ifndef __AF_USER_CONFIG_H__\n#define __AF_USER_CONFIG_H__\n#include \"app_filter.h\"\n#include \"af_utils.h\"\n\ntypedef struct af_mac_node {\n    struct list_head list;\n    unsigned char mac[MAC_ADDR_LEN];\n}af_mac_node_t;\n\nvoid af_mac_list_init(void);\nvoid af_mac_list_flush(void);\naf_mac_node_t *af_mac_find(unsigned char *mac);\naf_mac_node_t *af_mac_add(unsigned char *mac);\n\n#endif"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_utils.c",
    "content": "#include <linux/init.h>\r\n#include <linux/module.h>\r\n#include <linux/types.h>\r\n#include <linux/kernel.h>\r\n#include <linux/ctype.h>\r\n#include <linux/string.h>\r\n#include <linux/version.h>\r\n#include \"af_utils.h\"\r\n#define MAX_DUMP_STR_LEN 256\r\n\r\nu_int32_t af_get_timestamp_sec(void)\r\n{\r\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4,17,0)\r\n\tstruct timespec64 ts;\r\n\tktime_get_real_ts64(&ts);\r\n\treturn (u_int32_t)ts.tv_sec;\r\n#else\r\n\tstruct timespec ts;\r\n\tts = current_kernel_time();\r\n\treturn ts.tv_sec;\r\n#endif\r\n\r\n}\r\n\r\nint k_atoi(const char *str) {\r\n    int result = 0;\r\n\r\n    // Skip whitespace\r\n    while (*str == ' ' || *str == '\\t') {\r\n        str++;\r\n    }\r\n\r\n    // Convert characters to integer\r\n    while (*str >= '0' && *str <= '9') {\r\n        result = result * 10 + (*str - '0');\r\n        str++;\r\n    }\r\n\r\n    return result;\r\n}\r\n\r\nchar *k_trim(char *s)\r\n{\r\n\tchar *start, *last, *bk;\r\n\tint len;\r\n\r\n\tstart = s;\r\n\twhile (isspace(*start))\r\n\t\tstart++;\r\n\r\n\tbk = last = s + strlen(s) - 1;\r\n\twhile (last > start && isspace(*last))\r\n\t\tlast--;\r\n\r\n\tif ((s != start) || (bk != last))\r\n\t{\r\n\t\tlen = last - start + 1;\r\n\t\tstrncpy(s, start, len);\r\n\t\ts[len] = '\\0';\r\n\t}\r\n\treturn s;\r\n}\r\n\r\nint check_local_network_ip(unsigned int ip)\r\n{\r\n\tif ((ip & 0xffff0000) == 0xc0a80000)\r\n\t\treturn 1;\r\n\telse if ((ip & 0xfff00000) == 0xac100000)\r\n\t\treturn 1;\r\n\telse if ((ip & 0xff000000) == 0x0a000000)\r\n\t\treturn 1;\r\n\telse\r\n\t\treturn 0;\r\n}\r\n\r\nvoid dump_str(char *name, unsigned char *p, int len)\r\n{\r\n\tchar buf[MAX_DUMP_STR_LEN] = {0};\r\n\tif (len > MAX_DUMP_STR_LEN) {\r\n\t\tlen = MAX_DUMP_STR_LEN - 1;\r\n\t}\r\n\tprintk(\"%s: \",name);\r\n\tstrncpy(buf, p, len);\r\n\tprintk(\"[%s]\\n\", buf);\r\n}\r\nint isprint_char(unsigned char c)\r\n{\r\n    if (c >= 0x20 && c <= 0x7e)\r\n        return 1;\r\n    else\r\n        return 0;\r\n}\r\n\r\nvoid print_hex_ascii(const unsigned char *data, size_t size) {\r\n    size_t i, j;\r\n\r\n    for (i = 0; i < size; i += 16) {\r\n        printk(KERN_CONT\"%08lx  \", (unsigned long)i);\r\n        for (j = 0; j < 16; ++j) {\r\n            if (i + j < size) {\r\n                printk(KERN_CONT\"%02x \", data[i + j]);\r\n            } else {\r\n                printk(KERN_CONT\"   \"); \r\n            }   \r\n        }   \r\n\r\n        printk(KERN_CONT\" \");\r\n\r\n        for (j = 0; j < 16; ++j) {\r\n            if (i + j < size) {\r\n                unsigned char c = data[i + j]; \r\n                printk(KERN_CONT\"%c\", isprint_char(c) ? c : '.'); \r\n            }   \r\n        }   \r\n\r\n        printk(KERN_CONT\"\\n\");\r\n    }   \r\n    printk(KERN_CONT\"---------------------------------------\\n\");\r\n}\r\n\r\n\r\nvoid dump_hex(char *name, unsigned char *p, int len)\r\n{\r\n\tint i;\r\n\tif (len > MAX_DUMP_STR_LEN) {\r\n\t\tlen = MAX_DUMP_STR_LEN - 1;\r\n\t}\r\n\tprintk(\"%s: \",name);\r\n\tfor (i = 0; i < len; i++) {\r\n\t\tif (i % 16 == 0)\r\n\t\t\tprintk(KERN_CONT \"\\n\");\r\n\t\tprintk(KERN_CONT \"%02X \",*(p + i));\r\n\t}\r\n\tprintk(KERN_CONT \"\\n\");\r\n}\r\n\r\n#ifndef va_arg\r\ntypedef signed int acpi_native_int;\r\n#ifndef _VALIST\r\n#define _VALIST\r\ntypedef char *va_list;\r\n#endif\t\r\n\r\n#define  _AUPBND                (sizeof (acpi_native_int) - 1)\r\n#define  _ADNBND                (sizeof (acpi_native_int) - 1)\r\n\r\n\r\n#define _bnd(X, bnd)            (((sizeof (X)) + (bnd)) & (~(bnd)))\r\n#define va_arg(ap, T)           (*(T *)(((ap) += (_bnd (T, _AUPBND))) - (_bnd (T,_ADNBND))))\r\n#define va_end(ap)              (void) 0\r\n#define va_start(ap, A)         (void) ((ap) = (((char *) &(A)) + (_bnd (A,_AUPBND))))\r\n\r\n#endif\t\t\t\r\n\r\n#ifndef TOLOWER\r\n#define TOLOWER(x) ((x) | 0x20)\r\n#endif\r\n\r\n\r\nstatic long long k_simple_strtoll(const char *cp, char **endp, unsigned int base)\r\n{\r\n\tif (*cp == '-')\r\n\t\treturn -simple_strtoull(cp + 1, endp, base);\r\n\r\n\treturn simple_strtoull(cp, endp, base);\r\n}\r\n\r\nstatic int skip_atoi(const char **s)\r\n{\r\n\tint i=0;\r\n\twhile (isdigit(**s))\r\n\t\ti = i*10 + *((*s)++) - '0';\r\n\treturn i;\r\n}\r\n\r\nchar *skip_spaces(const char *str)\r\n{\r\n\twhile (isspace(*str) && ((unsigned char )*str != 0xa0))\r\n\t\t++str;\r\n\treturn (char *)str;\r\n}\r\nstatic int k_vsscanf(const char *buf, const char *fmt, va_list args)\r\n{\r\n\tconst char *str = buf;\r\n\tchar *next;\r\n\tchar digit;\r\n\tint num = 0;\r\n\tu8 qualifier;\r\n\tu8 base;\r\n#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,22)\r\n\tint field_width;\r\n#else \r\n\ts16 field_width;\r\n#endif\r\n\tbool is_sign;\r\n\twhile (*fmt && *str) {\r\n\t\tif (isspace(*fmt)) {\r\n\t\t\tfmt = skip_spaces(++fmt);\r\n\t\t\tstr = skip_spaces(str);\r\n\t\t}\r\n\r\n\t\tif (*fmt != '%' && *fmt) {\r\n\t\t\tif (*fmt++ != *str++)\r\n\t\t\t\tbreak;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tif (!*fmt)\r\n\t\t\tbreak;\r\n\t\t++fmt;\r\n\r\n\t\tif (*fmt == '*') {\r\n\t\t\twhile (!isspace(*fmt) && *fmt != '%' && *fmt)\r\n\t\t\t\tfmt++;\r\n\t\t\twhile (!isspace(*str) && *str)\r\n\t\t\t\tstr++;\r\n\t\t\tcontinue;\r\n\t\t}\r\n\t\tfield_width = -1;\r\n\t\tif (isdigit(*fmt))\r\n\t\t\tfield_width = skip_atoi(&fmt);\r\n\t\tqualifier = -1;\r\n\t\tif (*fmt == 'h' || TOLOWER(*fmt) == 'l' ||\r\n\t\t    TOLOWER(*fmt) == 'z') {\r\n\t\t\tqualifier = *fmt++;\r\n\t\t\tif (unlikely(qualifier == *fmt)) {\r\n\t\t\t\tif (qualifier == 'h') {\r\n\t\t\t\t\tqualifier = 'H';\r\n\t\t\t\t\tfmt++;\r\n\t\t\t\t} else if (qualifier == 'l') {\r\n\t\t\t\t\tqualifier = 'L';\r\n\t\t\t\t\tfmt++;\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t}\r\n\t\tif (!*fmt || !*str)\r\n\t\t\tbreak;\r\n\t\tbase = 10;\r\n\t\tis_sign = 0;\r\n\t\tswitch (*fmt++) {\r\n\t\tcase 'c':\r\n\t\t{\r\n\t\t\tchar *s = (char *)va_arg(args, char*);\r\n\t\t\tif (field_width == -1)\r\n\t\t\t\tfield_width = 1;\r\n\t\t\tdo {\r\n\t\t\t\t*s++ = *str++;\r\n\t\t\t} while (--field_width > 0 && *str);\r\n\t\t\tnum++;\r\n\t\t}\r\n\t\tcontinue;\r\n\t\tcase 's':\r\n\t\t{\r\n\t\t\tchar *s = (char *)va_arg(args, char *);\r\n#if LINUX_VERSION_CODE <= KERNEL_VERSION(2,6,22)\r\n\t\t\tif(field_width == -1)\r\n\t\t\t\tfield_width = INT_MAX;\r\n#else\r\n\t\t\tif (field_width == -1)\r\n\t\t\t\tfield_width = SHRT_MAX;\r\n#endif\r\n\t\t\tstr = skip_spaces(str);\r\n\r\n\t\t\twhile (*str && (!isspace(*str)  || ((unsigned char )*str == 0xA0) )&& field_width--)\r\n\t\t\t\t*s++ = *str++;\r\n\t\t\t*s = '\\0';\r\n\t\t\tnum++;\r\n\t\t}\r\n\t\tcontinue;\r\n\t\tcase 'n':\r\n\t\t{\r\n\t\t\tint *i = (int *)va_arg(args, int*);\r\n\t\t\t*i = str - buf;\r\n\t\t}\r\n\t\tcontinue;\r\n\t\tcase 'o':\r\n\t\t\tbase = 8;\r\n\t\t\tbreak;\r\n\t\tcase 'x':\r\n\t\tcase 'X':\r\n\t\t\tbase = 16;\r\n\t\t\tbreak;\r\n\t\tcase 'i':\r\n\t\t\tbase = 0;\r\n\t\tcase 'd':\r\n\t\t\tis_sign = 1;\r\n\t\tcase 'u':\r\n\t\t\tbreak;\r\n\t\tcase '%':\r\n\t\t\tif (*str++ != '%')\r\n\t\t\t\treturn num;\r\n\t\t\tcontinue;\r\n\t\tdefault:\r\n\t\t\treturn num;\r\n\t\t}\r\n\t\tstr = skip_spaces(str);\r\n\t\tdigit = *str;\r\n\t\tif (is_sign && digit == '-')\r\n\t\t\tdigit = *(str + 1);\r\n\t\tif (!digit\r\n\t\t    || (base == 16 && !isxdigit(digit))\r\n\t\t    || (base == 10 && !isdigit(digit))\r\n\t\t    || (base == 8 && (!isdigit(digit) || digit > '7'))\r\n\t\t    || (base == 0 && !isdigit(digit)))\r\n\t\t\tbreak;\r\n\r\n\t\tswitch (qualifier) {\r\n\t\tcase 'H':\t\r\n\t\t\tif (is_sign) {\r\n\t\t\t\tsigned char *s = (signed char *)va_arg(args, signed char *);\r\n\t\t\t\t*s = (signed char)simple_strtol(str, &next, base);\r\n\t\t\t} else {\r\n\t\t\t\tunsigned char *s = (unsigned char *)va_arg(args, unsigned char *);\r\n\t\t\t\t*s = (unsigned char)simple_strtoul(str, &next, base);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 'h':\r\n\t\t\tif (is_sign) {\r\n\t\t\t\tshort *s = (short *)va_arg(args, short *);\r\n\t\t\t\t*s = (short)simple_strtol(str, &next, base);\r\n\t\t\t} else {\r\n\t\t\t\tunsigned short *s = (unsigned short *)va_arg(args, unsigned short *);\r\n\t\t\t\t*s = (unsigned short)simple_strtoul(str, &next, base);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 'l':\r\n\t\t\tif (is_sign) {\r\n\t\t\t\tlong *l = (long *)va_arg(args, long *);\r\n\t\t\t\t*l = simple_strtol(str, &next, base);\r\n\t\t\t} else {\r\n\t\t\t\tunsigned long *l = (unsigned long *)va_arg(args, unsigned long *);\r\n\t\t\t\t*l = simple_strtoul(str, &next, base);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 'L':\r\n\t\t\tif (is_sign) {\r\n\t\t\t\tlong long *l = (long long *)va_arg(args, long long *);\r\n\t\t\t\t*l = k_simple_strtoll(str, &next, base);\r\n\t\t\t} else {\r\n\t\t\t\tunsigned long long *l = (unsigned long long *)va_arg(args, unsigned long long *);\r\n\t\t\t\t*l = simple_strtoull(str, &next, base);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\tcase 'Z':\r\n\t\tcase 'z':\r\n\t\t{\r\n\t\t\tsize_t *s = (size_t *)va_arg(args, size_t *);\r\n\t\t\t*s = (size_t)simple_strtoul(str, &next, base);\r\n\t\t}\r\n\t\tbreak;\r\n\t\tdefault:\r\n\t\t\tif (is_sign) {\r\n\t\t\t\tint *i = (int *)va_arg(args, int *);\r\n\t\t\t\t*i = (int)simple_strtol(str, &next, base);\r\n\t\t\t} else {\r\n\t\t\t\tunsigned int *i = (unsigned int *)va_arg(args, unsigned int*);\r\n\t\t\t\t*i = (unsigned int)simple_strtoul(str, &next, base);\r\n\t\t\t}\r\n\t\t\tbreak;\r\n\t\t}\r\n\t\tnum++;\r\n\t\tif (!next)\r\n\t\t\tbreak;\r\n\t\tstr = next;\r\n\t}\r\n\tif (*fmt == '%' && *(fmt + 1) == 'n') {\r\n\t\tint *p = (int *)va_arg(args, int *);\r\n\t\t*p = str - buf;\r\n\t}\r\n\treturn num;\r\n}\r\n\r\n\r\nint k_sscanf(const char *buf, const char *fmt, ...)\r\n{\r\n\tva_list args;\r\n\tint i;\r\n\tva_start(args, fmt);\r\n\ti = k_vsscanf(buf, fmt, args);\r\n\tva_end(args);\r\n\treturn i;\r\n}\r\n\r\n\r\nint mac_to_hex(u8 *mac, u8 *mac_hex)\r\n{\r\n\tu32 mac_tmp[6];\r\n\tint ret = 0, i = 0;\r\n\tret = sscanf(mac, \"%02x:%02x:%02x:%02x:%02x:%02x\",\r\n\t\t\t\t (unsigned int *)&mac_tmp[0],\r\n\t\t\t\t (unsigned int *)&mac_tmp[1],\r\n\t\t\t\t (unsigned int *)&mac_tmp[2],\r\n\t\t\t\t (unsigned int *)&mac_tmp[3],\r\n\t\t\t\t (unsigned int *)&mac_tmp[4],\r\n\t\t\t\t (unsigned int *)&mac_tmp[5]);\r\n\tif (6 != ret)\r\n\t\treturn -1;\r\n\tfor (i = 0; i < 6; i++)\r\n\t{\r\n\t\tmac_hex[i] = mac_tmp[i];\r\n\t}\r\n\treturn 0;\r\n}"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_utils.h",
    "content": "#ifndef AF_UTILS_H\r\n#define AF_UTILS_H\r\nu_int32_t af_get_timestamp_sec(void);\r\n\r\nchar *k_trim(char *s);\r\n\r\nint check_local_network_ip(unsigned int ip);\r\n\r\nvoid dump_str(char *name, unsigned char *p, int len);\r\n\r\nvoid dump_hex(char *name, unsigned char *p, int len);\r\n\r\nint k_sscanf(const char *buf, const char *fmt, ...);\r\nint k_atoi(const char *str);\r\nvoid print_hex_ascii(const unsigned char *data, size_t size);\r\nint hash_mac(unsigned char *mac);\r\nint mac_to_hex(u8 *mac, u8 *mac_hex);\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_whitelist_config.c",
    "content": "#include <linux/init.h>\n#include <linux/module.h>\n#include <linux/types.h>\n#include <linux/vmalloc.h>\n#include <linux/version.h>\n#include \"app_filter.h\"\n#include \"af_utils.h\"\n#include \"af_log.h\"\n#include \"cJSON.h\"\n#include \"af_whitelist_config.h\"\n\n\nDEFINE_RWLOCK(af_whitelist_mac_lock);\n\nstruct list_head af_whitelist_mac_htable[MAX_AF_MAC_HASH_SIZE];\n\nvoid af_whitelist_mac_init(void)\n{\n\tint i;\n\twrite_lock_bh(&af_whitelist_mac_lock);\n\tfor (i = 0; i < MAX_AF_MAC_HASH_SIZE; i++)\n\t{\n\t\tINIT_LIST_HEAD(&af_whitelist_mac_htable[i]);\n\t}\n\twrite_unlock_bh(&af_whitelist_mac_lock);\n}\n\nvoid af_whitelist_mac_flush(void)\n{\n\tint i;\n\taf_whitelist_mac_node_t *p = NULL;\n\tchar mac_str[32] = {0};\n\twrite_lock_bh(&af_whitelist_mac_lock);\n\tfor (i = 0; i < MAX_AF_MAC_HASH_SIZE; i++)\n\t{\n\t\twhile (!list_empty(&af_whitelist_mac_htable[i]))\n\t\t{\n\t\t\tp = list_first_entry(&af_whitelist_mac_htable[i], af_whitelist_mac_node_t, list);\n\t\t\tmemset(mac_str, 0x0, sizeof(mac_str));\n\t\t\tsprintf(mac_str, MAC_FMT, MAC_ARRAY(p->mac));\n\t\t\tlist_del(&(p->list));\n\t\t\tkfree(p);\n\t\t}\n\t}\n\twrite_unlock_bh(&af_whitelist_mac_lock);\n}\n\naf_whitelist_mac_node_t *af_whitelist_mac_find(unsigned char *mac)\n{\n\taf_whitelist_mac_node_t *node = NULL;\n\tunsigned int index = 0;\n\n\tindex = hash_mac(mac);\n\tread_lock_bh(&af_whitelist_mac_lock);\n\tlist_for_each_entry(node, &af_whitelist_mac_htable[index], list)\n\t{\n\t\tif (0 == memcmp(node->mac, mac, 6))\n\t\t{\n\t\t\tread_unlock_bh(&af_whitelist_mac_lock);\n\t\t\treturn node;\n\t\t}\n\t}\n\tread_unlock_bh(&af_whitelist_mac_lock);\n\treturn NULL;\n}\n\naf_whitelist_mac_node_t *af_whitelist_mac_add(unsigned char *mac)\n{\n\taf_whitelist_mac_node_t *node = NULL;\n\tint index = 0;\n\n\tnode = (af_whitelist_mac_node_t *)kmalloc(sizeof(af_whitelist_mac_node_t), GFP_ATOMIC);\n\tif (node == NULL)\n\t{\n\t\treturn NULL;\n\t}\n\n\tmemset(node, 0, sizeof(af_whitelist_mac_node_t));\n\tmemcpy(node->mac, mac, MAC_ADDR_LEN);\n\tindex = hash_mac(mac);\n\n\tAF_DEBUG(\"add whitelist mac=\" MAC_FMT \"\\n\", MAC_ARRAY(node->mac));\n\twrite_lock_bh(&af_whitelist_mac_lock);\n\tlist_add(&(node->list), &af_whitelist_mac_htable[index]);\n\twrite_unlock_bh(&af_whitelist_mac_lock);\n\treturn node;\n}\n\n\nint af_config_set_whitelist_mac_list(cJSON *data_obj)\n{\n\tint i;\n\tcJSON *mac_arr = NULL;\n\tu8 mac_hex[MAC_ADDR_LEN] = {0};\n\tif (!data_obj)\n\t{\n\t\tAF_ERROR(\"data obj is null\\n\");\n\t\treturn -1;\n\t}\n\tmac_arr = cJSON_GetObjectItem(data_obj, \"mac_list\");\n\tif (!mac_arr)\n\t{\n\t\tAF_ERROR(\"mac_list obj is null\\n\");\n\t\treturn -1;\n\t}\t\n\taf_whitelist_mac_flush();\n\tfor (i = 0; i < cJSON_GetArraySize(mac_arr); i++)\n\t{\n\t\tcJSON *mac_obj = cJSON_GetArrayItem(mac_arr, i);\n\t\tif (!mac_obj)\n\t\t{\n\t\t\tAF_ERROR(\"mac obj is null\\n\");\n\t\t\treturn -1;\n\t\t}\n\t\tif (-1 == mac_to_hex(mac_obj->valuestring, mac_hex))\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\taf_whitelist_mac_add(mac_hex);\n\t}\n\treturn 0;\n}\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/af_whitelist_config.h",
    "content": "#ifndef __AF_WHITELIST_CONFIG_H__\n#define __AF_WHITELIST_CONFIG_H__\n#include \"app_filter.h\"\n#include \"af_utils.h\"\n\n#define MAX_AF_WHITELIST_MAC_HASH_SIZE 64\n\ntypedef struct af_whitelist_mac_node{\n    struct list_head list;\n    unsigned char mac[MAC_ADDR_LEN];\n}af_whitelist_mac_node_t;\n\nvoid af_whitelist_mac_init(void);\nvoid af_whitelist_mac_flush(void);\naf_whitelist_mac_node_t *af_whitelist_mac_find(unsigned char *mac);\naf_whitelist_mac_node_t *af_whitelist_mac_add(unsigned char *mac);\nint af_config_set_whitelist_mac_list(cJSON *data_obj);\n\n#endif"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/app_filter.c",
    "content": "/*\n\tauthor: derry\n\tdate:2019/1/10\n*/\n#include <linux/init.h>\n#include <linux/module.h>\n#include <linux/version.h>\n#include <net/tcp.h>\n#include <linux/netfilter.h>\n#include <net/netfilter/nf_conntrack.h>\n#include <net/netfilter/nf_conntrack_acct.h>\n#include <linux/skbuff.h>\n#include <net/ip.h>\n#include <uapi/linux/ipv6.h>\n#include <linux/types.h>\n#include <net/sock.h>\n#include <linux/etherdevice.h>\n#include <linux/cdev.h>\n#include <linux/device.h>\n#include <linux/tcp.h>\n#include <linux/ip.h>\n#include <linux/netfilter_ipv4.h>\n#include <linux/netfilter_ipv6.h>\n#include <linux/ipv6.h>\n#include <linux/in6.h>\n#include <linux/timer.h>\n#include \"app_filter.h\"\n#include \"af_utils.h\"\n#include \"af_log.h\"\n#include \"af_client.h\"\n#include \"af_client_fs.h\"\n#include \"cJSON.h\"\n#include \"af_conntrack.h\"\n#include \"af_config.h\"\n#include \"af_rule_config.h\"\n#include \"af_user_config.h\"\n#include \"af_whitelist_config.h\"\n\nMODULE_LICENSE(\"GPL\");\nMODULE_AUTHOR(\"destan19@126.com\");\nMODULE_DESCRIPTION(\"app filter module\");\nMODULE_VERSION(AF_VERSION);\nstruct list_head af_feature_head = LIST_HEAD_INIT(af_feature_head);\n\nDEFINE_RWLOCK(af_feature_lock);\n\nu_int32_t g_update_jiffies = 0;\n\n#define feature_list_read_lock() read_lock_bh(&af_feature_lock);\n#define feature_list_read_unlock() read_unlock_bh(&af_feature_lock);\n#define feature_list_write_lock() write_lock_bh(&af_feature_lock);\n#define feature_list_write_unlock() write_unlock_bh(&af_feature_lock);\n\n#define SET_APPID(mark, appid) (mark = appid)\n#define GET_APPID(mark) (mark)\n#define MAX_OAF_NETLINK_MSG_LEN 1024\n#define MAX_AF_SUPPORT_DATA_LEN 3000\n#define MAX_HOST_LEN 64\n#define MIN_HOST_LEN 4\n#define APPID_QUIC 10\n\n\n#if LINUX_VERSION_CODE > KERNEL_VERSION(5,10,197)\nextern void nf_send_reset(struct net *net, struct sock *sk, struct sk_buff *oldskb, int hook);\n#elif LINUX_VERSION_CODE > KERNEL_VERSION(4,4,1)\nextern void nf_send_reset(struct net *net,  struct sk_buff *oldskb, int hook);\n#else\nextern void nf_send_reset(sk_buff *oldskb, int hook);\n#endif\n\nchar *ipv6_to_str(const struct in6_addr *addr, char *str)\n{\n    sprintf(str, \"%pI6c\", addr);\n    return str;\n}\nint hash_mac(unsigned char *mac)\n{\n\tif (!mac)\n\t\treturn 0;\n\treturn ((mac[0] ^ mac[1]) + (mac[2] ^ mac[3]) + (mac[4] ^ mac[5])) % MAX_AF_MAC_HASH_SIZE;\n}\n\nint __add_app_feature(char *feature, int appid, char *name, int proto, int src_port,\n\t\t\t\t\t  port_info_t dport_info, char *host_url, char *request_url, char *dict, char *search_str, int ignore)\n{\n\taf_feature_node_t *node = NULL;\n\tchar *p = dict;\n\tchar *begin = dict;\n\tchar pos[64] = {0};\n\tint index = 0;\n\tint value = 0;\n\tnode = kzalloc(sizeof(af_feature_node_t), GFP_ATOMIC);\n\tif (node == NULL)\n\t{\n\t\tprintk(\"malloc feature memory error\\n\");\n\t\treturn -1;\n\t}\n\telse\n\t{\n\t\tnode->app_id = appid;\n\t\tstrcpy(node->app_name, name);\n\t\tnode->proto = proto;\n\t\tnode->dport_info = dport_info;\n\t\tnode->sport = src_port;\n\t\tstrcpy(node->host_url, host_url);\n\t\tstrcpy(node->request_url, request_url);\n\t\tstrcpy(node->search_str, search_str);\n\t\tnode->ignore = ignore;\n\t\tstrcpy(node->feature, feature);\n\t\tif (ignore)\n\t\t\tAF_DEBUG(\"add feature %s, ignore = %d\\n\", feature, ignore);\n\n\t\t// 00:0a-01:11\n\t\tp = dict;\n\t\tbegin = dict;\n\t\tindex = 0;\n\t\tvalue = 0;\n\t\twhile (*p++)\n\t\t{\n\t\t\tif (*p == '|')\n\t\t\t{\n\t\t\t\tmemset(pos, 0x0, sizeof(pos));\n\t\t\t\tstrncpy(pos, begin, p - begin);\n\t\t\t\tk_sscanf(pos, \"%d:%x\", &index, &value);\n\t\t\t\tbegin = p + 1;\n\t\t\t\tnode->pos_info[node->pos_num].pos = index;\n\t\t\t\tnode->pos_info[node->pos_num].value = value;\n\t\t\t\tnode->pos_num++;\n\t\t\t\tif (node->pos_num >= MAX_POS_INFO_PER_FEATURE - 1)\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\n\t\tif (begin != dict)\n\t\t\tstrncpy(pos, begin, p - begin);\n\t\telse\n\t\t\tstrcpy(pos, dict);\n\n\t\tint ret = k_sscanf(pos, \"%d:%x\", &index, &value);\n\t\tif (ret == 2){\n\t\t\tnode->pos_info[node->pos_num].pos = index;\n\t\t\tnode->pos_info[node->pos_num].value = value;\n\t\t\tnode->pos_num++;\n\t\t}\n\t\n\t\tfeature_list_write_lock();\n\t\tlist_add(&(node->head), &af_feature_head);\n\t\tfeature_list_write_unlock();\n\t}\n\treturn 0;\n}\nint validate_range_value(char *range_str)\n{\n\tif (!range_str)\n\t\treturn 0;\n\tchar *p = range_str;\n\twhile (*p)\n\t{\n\t\tif (*p == ' ' || *p == '!' || *p == '-' ||\n\t\t\t((*p >= '0') && (*p <= '9')))\n\t\t{\n\t\t\tp++;\n\t\t\tcontinue;\n\t\t}\n\t\telse\n\t\t{\n\t\t\treturn 0;\n\t\t}\n\t}\n\treturn 1;\n}\n\nint parse_range_value(char *range_str, range_value_t *range)\n{\n\tchar pure_range[128] = {0};\n\tif (!validate_range_value(range_str))\n\t{\n\t\tprintk(\"validate range str failed, value = %s\\n\", range_str);\n\t\treturn -1;\n\t}\n\tk_trim(range_str);\n\tif (range_str[0] == '!')\n\t{\n\t\trange->not = 1;\n\t\tstrcpy(pure_range, range_str + 1);\n\t}\n\telse\n\t{\n\t\trange->not = 0;\n\t\tstrcpy(pure_range, range_str);\n\t}\n\tk_trim(pure_range);\n\tint start, end;\n\tif (strstr(pure_range, \"-\"))\n\t{\n\t\tif (2 != sscanf(pure_range, \"%d-%d\", &start, &end))\n\t\t\treturn -1;\n\t}\n\telse\n\t{\n\t\tif (1 != sscanf(pure_range, \"%d\", &start))\n\t\t\treturn -1;\n\t\tend = start;\n\t}\n\trange->start = start;\n\trange->end = end;\n\treturn 0;\n}\n\nint parse_port_info(char *port_str, port_info_t *info)\n{\n\tchar *p = port_str;\n\tchar *begin = port_str;\n\tint param_num = 0;\n\tchar one_port_buf[128] = {0};\n\tk_trim(port_str);\n\tif (strlen(port_str) == 0)\n\t\treturn -1;\n\n\twhile (*p++)\n\t{\n\t\tif (*p != '|')\n\t\t\tcontinue;\n\t\tmemset(one_port_buf, 0x0, sizeof(one_port_buf));\n\t\tstrncpy(one_port_buf, begin, p - begin);\n\t\tif (0 == parse_range_value(one_port_buf, &info->range_list[info->num]))\n\t\t{\n\t\t\tinfo->num++;\n\t\t}\n\t\tparam_num++;\n\t\tbegin = p + 1;\n\t}\n\tmemset(one_port_buf, 0x0, sizeof(one_port_buf));\n\tstrncpy(one_port_buf, begin, p - begin);\n\tif (0 == parse_range_value(one_port_buf, &info->range_list[info->num]))\n\t{\n\t\tinfo->num++;\n\t}\n\treturn 0;\n}\n\nint af_match_port(port_info_t *info, int port)\n{\n\tint i;\n\tint with_not = 0;\n\tif (info->num == 0)\n\t\treturn 1;\n\tfor (i = 0; i < info->num; i++)\n\t{\n\t\tif (info->range_list[i].not )\n\t\t{\n\t\t\twith_not = 1;\n\t\t\tbreak;\n\t\t}\n\t}\n\tfor (i = 0; i < info->num; i++)\n\t{\n\t\tif (with_not)\n\t\t{\n\t\t\tif (info->range_list[i].not &&port >= info->range_list[i].start && port <= info->range_list[i].end)\n\t\t\t{\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t\telse\n\t\t{\n\t\t\tif (port >= info->range_list[i].start && port <= info->range_list[i].end)\n\t\t\t{\n\t\t\t\treturn 1;\n\t\t\t}\n\t\t}\n\t}\n\tif (with_not)\n\t\treturn 1;\n\telse\n\t\treturn 0;\n}\n//[tcp;;443;baidu.com;;]\nint add_app_feature(int appid, char *name, char *feature)\n{\n\tchar proto_str[16] = {0};\n\tchar src_port_str[16] = {0};\n\tport_info_t dport_info;\n\tchar dst_port_str[16] = {0};\n\tchar host_url[32] = {0};\n\tchar request_url[128] = {0};\n\tchar dict[128] = {0};\n\tint proto = IPPROTO_TCP;\n\tint param_num = 0;\n\tint dst_port = 0;\n\tint src_port = 0;\n\tchar tmp_buf[128] = {0};\n\tint ignore = 0;\n\tchar search_str[128] = {0};\n\tchar *p = feature;\n\tchar *begin = feature;\n\n\tif (!name || !feature)\n\t{\n\t\tAF_ERROR(\"error, name or feature is null\\n\");\n\t\treturn -1;\n\t}\n\t\n\tif (strlen(feature) < MIN_FEATURE_STR_LEN){\n\t\treturn -1;\n\t}\n\t// tcp;8000;www.sina.com;0:get_name;00:0a-01:11\n\tmemset(&dport_info, 0x0, sizeof(dport_info));\n\twhile (*p++)\n\t{\n\t\tif (*p != ';')\n\t\t\tcontinue;\n\n\t\tswitch (param_num)\n\t\t{\n\n\t\tcase AF_PROTO_PARAM_INDEX:\n\t\t\tstrncpy(proto_str, begin, p - begin);\n\t\t\tbreak;\n\t\tcase AF_SRC_PORT_PARAM_INDEX:\n\t\t\tstrncpy(src_port_str, begin, p - begin);\n\t\t\tbreak;\n\t\tcase AF_DST_PORT_PARAM_INDEX:\n\t\t\tstrncpy(dst_port_str, begin, p - begin);\n\t\t\tbreak;\n\n\t\tcase AF_HOST_URL_PARAM_INDEX:\n\t\t\tstrncpy(host_url, begin, p - begin);\n\t\t\tbreak;\n\n\t\tcase AF_REQUEST_URL_PARAM_INDEX:\n\t\t\tstrncpy(request_url, begin, p - begin);\n\t\t\tbreak;\n\t\tcase AF_DICT_PARAM_INDEX:\n\t\t\tstrncpy(dict, begin, p - begin);\n\t\t\tbreak;\n\t\tcase AF_STR_PARAM_INDEX:\n\t\t\tstrncpy(search_str, begin, p - begin);\n\t\t\tbreak;\n\t\tcase AF_IGNORE_PARAM_INDEX:\n\t\t\tstrncpy(tmp_buf, begin, p - begin);\n\t\t\tignore = k_atoi(tmp_buf);\n\t\t\tbreak;\n\t\t}\n\t\tparam_num++;\n\t\tbegin = p + 1;\n\t}\n\n\t// old version\n\tif (param_num == AF_DICT_PARAM_INDEX){\n\t\tstrncpy(dict, begin, p - begin);\n\t}\n\t// new version\n\tif (param_num == AF_IGNORE_PARAM_INDEX){\n\t\tstrncpy(tmp_buf, begin, p - begin);\n\t\tignore = k_atoi(tmp_buf);\n\t}\n\n\tif (0 == strcmp(proto_str, \"tcp\"))\n\t\tproto = IPPROTO_TCP;\n\telse if (0 == strcmp(proto_str, \"udp\"))\n\t\tproto = IPPROTO_UDP;\n\telse\n\t{\n\t\tprintk(\"proto %s is not support, feature = %s\\n\", proto_str, feature);\n\t\treturn -1;\n\t}\n\tsscanf(src_port_str, \"%d\", &src_port);\n\t//\tsscanf(dst_port_str, \"%d\", &dst_port);\n\tparse_port_info(dst_port_str, &dport_info);\n\n\t__add_app_feature(feature, appid, name, proto, src_port, dport_info, host_url, request_url, dict, search_str, ignore);\n\treturn 0;\n}\n\nvoid af_init_feature(char *feature_str)\n{\n\tint app_id;\n\tchar app_name[128] = {0};\n\tchar *feature_buf = NULL;\n\tchar feature[MAX_FEATURE_STR_LEN] = {0};\n\tchar *p = feature_str;\n\tchar *pos = NULL;\n\tint len = 0;\n\tchar *begin = NULL;\n\n\tfeature_buf = kmalloc(MAX_FEATURE_LINE_LEN, GFP_KERNEL);\n\tif (!feature_buf) {\n\t\tAF_ERROR(\"Failed to allocate memory for feature_buf\\n\");\n\t\treturn;\n\t}\n\tmemset(feature_buf, 0, MAX_FEATURE_LINE_LEN);\n\n\tif (strstr(feature_str, \"#\")) {\n\t\tkfree(feature_buf);\n\t\treturn;\n\t}\n\n\tk_sscanf(feature_str, \"%d%[^:]\", &app_id, app_name);\n\twhile (*p++)\n\t{\n\t\tif (*p == '[')\n\t\t{\n\t\t\tpos = p + 1;\n\t\t\tcontinue;\n\t\t}\n\t\tif (*p == ']' && pos != NULL)\n\t\t{\n\t\t\tlen = p - pos;\n\t\t}\n\t}\n\n\tif (pos && len)\n\t\tstrncpy(feature_buf, pos, len);\n\tp = feature_buf;\n\tbegin = feature_buf;\n\n\twhile (*p++)\n\t{\n\t\tif (*p == ',')\n\t\t{\n\t\t\tif (p - begin > MAX_FEATURE_STR_LEN){\n\t\t\t\tprintk(\"error, feature len error %d\\n\", p - len);\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tmemcpy((char *)feature, begin, p - begin);\n\t\t\tfeature[p - begin] = '\\0';\n\t\t\tadd_app_feature(app_id, app_name, feature);\n\t\t\tbegin = p + 1;\n\t\t}\n\t}\n\tif (p != begin)\n\t{\n\t\t\n\t\tif (p - begin > MAX_FEATURE_STR_LEN){\n\t\t\tprintk(\"error, feature len error %d\\n\", p - len);\n\t\t}\n\t\telse{\n\t\t\tmemcpy((char *)feature, begin, p - begin);\n\t\t\tfeature[p - begin] = '\\0';\n\t\t\tadd_app_feature(app_id, app_name, feature);\n\t\t}\n\t}\n \n\n\tif (feature_buf)\n\t\tkfree(feature_buf);\n}\n\nvoid load_feature_buf_from_file(char **config_buf)\n{\n\tstruct inode *inode = NULL;\n\tstruct file *fp = NULL;\n#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 7, 19)\n\tmm_segment_t fs;\n#endif\n\toff_t size;\n\tfp = filp_open(AF_FEATURE_CONFIG_FILE, O_RDONLY, 0);\n\t\n\n\tif (IS_ERR(fp))\n\t{\n\t\treturn;\n\t}\n\n\tinode = fp->f_inode;\n\tsize = inode->i_size;\n\tif (size == 0)\n\t{\n\t\treturn;\n\t}\n\t*config_buf = (char *)kzalloc(sizeof(char) * size, GFP_ATOMIC);\n\tif (NULL == *config_buf)\n\t{\n\t\tAF_ERROR(\"alloc buf fail\\n\");\n\t\tfilp_close(fp, NULL);\n\t\treturn;\n\t}\n\n#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 7, 19)\n\tfs = get_fs();\n\tset_fs(KERNEL_DS);\n#endif\n// 4.14rc3 vfs_read-->kernel_read\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 14, 0)\n\tkernel_read(fp, *config_buf, size, &(fp->f_pos));\n#else\n\tvfs_read(fp, *config_buf, size, &(fp->f_pos));\n#endif\n\n#if LINUX_VERSION_CODE <= KERNEL_VERSION(5, 7, 19)\n\tset_fs(fs);\n#endif\n\tfilp_close(fp, NULL);\n}\n\nint load_feature_config(void)\n{\n\tchar *feature_buf = NULL;\n\tchar *p;\n\tchar *begin;\n\tchar line[MAX_FEATURE_LINE_LEN] = {0};\n\n\tload_feature_buf_from_file(&feature_buf);\n\tif (!feature_buf)\n\t{\n\t\treturn -1;\n\t}\n\tp = begin = feature_buf;\n\twhile (*p++)\n\t{\n\t\tif (*p == '\\n')\n\t\t{\n\t\t\tif (p - begin < MIN_FEATURE_LINE_LEN || p - begin > MAX_FEATURE_LINE_LEN)\n\t\t\t{\n\t\t\t\tbegin = p + 1;\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tmemset(line, 0x0, sizeof(line));\n\t\t\tstrncpy(line, begin, p - begin);\n\t\t\taf_init_feature(line);\n\t\t\tbegin = p + 1;\n\t\t}\n\t}\n\n\tif (p != begin)\n\t{\n\t\tif (p - begin < MIN_FEATURE_LINE_LEN || p - begin > MAX_FEATURE_LINE_LEN)\n\t\t\treturn 0;\n\t\tmemset(line, 0x0, sizeof(line));\n\t\tstrncpy(line, begin, p - begin);\n\t\taf_init_feature(line);\n\t\tbegin = p + 1;\n\t}\n\tif (feature_buf)\n\t\tkfree(feature_buf);\n\treturn 0;\n}\n\n\nstatic void af_clean_feature_list(void)\n{\n\taf_feature_node_t *node;\n\tint count = 0;\n\tfeature_list_write_lock();\n\twhile (!list_empty(&af_feature_head))\n\t{\n\t\tnode = list_first_entry(&af_feature_head, af_feature_node_t, head);\n\t\tlist_del(&(node->head));\n\t\tkfree(node);\n\t\tcount++;\n\t}\n\tfeature_list_write_unlock();\n}\n\nvoid af_add_feature_msg_handle(char *data, int len)\n{\n\tchar feature[MAX_FEATURE_LINE_LEN] = {0};\n\tif (len <= 0 || len >= MAX_FEATURE_LINE_LEN){\n\t\tprintk(\"warn, feature data len = %d\\n\", len);\n\t\treturn;\n\t}\n\tstrncpy(feature, data, len);\n\tAF_INFO(\"add feature %s\\n\", feature);\n\taf_init_feature(feature);\n}\n// free by caller\nstatic unsigned char *read_skb(struct sk_buff *skb, unsigned int from, unsigned int len)\n{\n\tstruct skb_seq_state state;\n\tunsigned char *msg_buf = NULL;\n\tunsigned int consumed = 0;\n#if 0\n\tif (from <= 0 || from > 1500)\n\t\treturn NULL;\n\n\tif (len <= 0 || from+len > 1500)\n\t\treturn NULL;\n#endif\n\n\tmsg_buf = kmalloc(len, GFP_KERNEL);\n\tif (!msg_buf)\n\t\treturn NULL;\n\n\tskb_prepare_seq_read(skb, from, from + len, &state);\n\twhile (1)\n\t{\n\t\tunsigned int avail;\n\t\tconst u8 *ptr;\n\t\tavail = skb_seq_read(consumed, &ptr, &state);\n\t\tif (avail == 0)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t\tmemcpy(msg_buf + consumed, ptr, avail);\n\t\tconsumed += avail;\n\t\tif (consumed >= len)\n\t\t{\n\t\t\tskb_abort_seq_read(&state);\n\t\t\tbreak;\n\t\t}\n\t}\n\treturn msg_buf;\n}\n\nint parse_flow_proto(struct sk_buff *skb, flow_info_t *flow)\n{\n\tunsigned char *ipp;\n\tint ipp_len;\n\tstruct tcphdr *tcph = NULL;\n\tstruct udphdr *udph = NULL;\n\tstruct nf_conn *ct = NULL;\n\tstruct iphdr *iph = NULL;\n\tstruct ipv6hdr *ip6h = NULL;\n\tif (!skb)\n\t\treturn -1;\n\tswitch (skb->protocol)\n\t{\n\tcase htons(ETH_P_IP):\n\t\tiph = ip_hdr(skb);\n\t\tflow->src = iph->saddr;\n\t\tflow->dst = iph->daddr;\n\t\tflow->l4_protocol = iph->protocol;\n\t\tipp = ((unsigned char *)iph) + iph->ihl * 4;\n\t\tipp_len = ((unsigned char *)iph) + ntohs(iph->tot_len) - ipp;\n\t\tbreak;\n\tcase htons(ETH_P_IPV6):\n\t\tip6h = ipv6_hdr(skb);\n\t\tflow->src6 = &ip6h->saddr;\n\t\tflow->dst6 = &ip6h->daddr;\n\t\tflow->l4_protocol = ip6h->nexthdr;\n\t\tipp = ((unsigned char *)ip6h) + sizeof(struct ipv6hdr);\n\t\tipp_len = ntohs(ip6h->payload_len);\n\t\tbreak;\n\tdefault:\n\t\treturn -1;\n\t}\n\n\tswitch (flow->l4_protocol)\n\t{\n\tcase IPPROTO_TCP:\n\t\ttcph = (struct tcphdr *)ipp;\n\t\tflow->l4_len = ipp_len - tcph->doff * 4;\n\t\tflow->l4_data = ipp + tcph->doff * 4;\n\t\tflow->dport = ntohs(tcph->dest);\n\t\tflow->sport = ntohs(tcph->source);\n\t\treturn 0;\n\tcase IPPROTO_UDP:\n\t\tudph = (struct udphdr *)ipp;\n\t\tflow->l4_len = ntohs(udph->len) - 8;\n\t\tflow->l4_data = ipp + 8;\n\t\tflow->dport = ntohs(udph->dest);\n\t\tflow->sport = ntohs(udph->source);\n\t\treturn 0;\n\tcase IPPROTO_ICMP:\n\t\tbreak;\n\tdefault:\n\t\treturn -1;\n\t}\n\treturn -1;\n}\n\nint check_domain(char *h, int len)\n{\n\tint i;\n\tfor (i = 0; i < len; i++)\n\t{\n\t\tif ((h[i] >= 'a' && h[i] <= 'z') || (h[i] >= 'A' && h[i] <= 'Z') ||\n\t\t\t(h[i] >= '0' && h[i] <= '9') || h[i] == '.' || h[i] == '-' ||  h[i] == ':')\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\telse\n\t\t\treturn 0;\n\t}\n\treturn 1;\n}\n\nint dpi_https_proto(flow_info_t *flow)\n{\n\tint i;\n\tshort url_len = 0;\n\tchar *p = flow->l4_data;\n\tint data_len = flow->l4_len;\n\n\tif (NULL == flow)\n\t{\n\t\tAF_ERROR(\"flow is NULL\\n\");\n\t\treturn -1;\n\t}\n\tif (NULL == p || data_len < 16)\n\t{\n\t\treturn -1;\n\t}\n\tif (!((p[0] == 0x16 && p[1] == 0x03 && p[5] == 0x01) || flow->client_hello))\n\t\treturn -1;\n\n\tfor (i = 0; i < data_len; i++)\n\t{\n\t\tif (i + HTTPS_URL_OFFSET >= data_len)\n\t\t{\n\t\t\tAF_LMT_INFO(\"match https host failed, data_len = %d, sport:%d, dport:%d\\n\", data_len, flow->sport,flow->dport);\n\t\n\t\t\tflow->client_hello = 1;\t\n\t\t\treturn -1;\n\t\t}\n\n\t\tif (p[i] == 0x0 && p[i + 1] == 0x0 && p[i + 2] == 0x0 && p[i + 3] != 0x0)\n\t\t{\n\t\t\t// 2 bytes\n\t\t\tmemcpy(&url_len, p + i + HTTPS_LEN_OFFSET, 2);\n\n\t\t\tif (ntohs(url_len) <= MIN_HOST_LEN || ntohs(url_len) > data_len || ntohs(url_len) > MAX_HOST_LEN)\n\t\t\t{\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tif (i + HTTPS_URL_OFFSET + ntohs(url_len) < data_len)\n\t\t\t{\n\t\t\t\tif (!check_domain( p + i + HTTPS_URL_OFFSET, ntohs(url_len))){\n\t\t\t\t\tAF_INFO(\"invalid url, len = %d\\n\", ntohs(url_len));\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tflow->https.match = AF_TRUE;\n\t\t\t\tflow->https.url_pos = p + i + HTTPS_URL_OFFSET;\n\t\t\t\tflow->https.url_len = ntohs(url_len);\n\t\t\t\tflow->client_hello = 0;\n\t\t\t\treturn 0;\n\t\t\t}\n\t\t}\n\t}\n\treturn -1;\n}\n\nvoid dpi_http_proto(flow_info_t *flow)\n{\n\tint i = 0;\n\tint start = 0;\n\tchar *data = NULL;\n\tint data_len = 0;\n\tif (!flow)\n\t{\n\t\tAF_ERROR(\"flow is null\\n\");\n\t\treturn;\n\t}\n\tif (flow->l4_protocol != IPPROTO_TCP)\n\t{\n\t\treturn;\n\t}\n\n\tdata = flow->l4_data;\n\tdata_len = flow->l4_len;\n\tif (data_len < MIN_HTTP_DATA_LEN)\n\t{\n\t\treturn;\n\t}\n\n\tfor (i = 0; i < data_len; i++)\n\t{\n\t\tif (data[i] == 0x0d && data[i + 1] == 0x0a)\n\t\t{\n\t\t\tif (0 == memcmp(&data[start], \"POST \", 5))\n\t\t\t{\n\t\t\t\tflow->http.match = AF_TRUE;\n\t\t\t\tflow->http.method = HTTP_METHOD_POST;\n\t\t\t\tflow->http.url_pos = data + start + 5;\n\t\t\t\tflow->http.url_len = i - start - 5;\n\t\t\t}\n\t\t\telse if (0 == memcmp(&data[start], \"GET \", 4))\n\t\t\t{\n\t\t\t\tflow->http.match = AF_TRUE;\n\t\t\t\tflow->http.method = HTTP_METHOD_GET;\n\t\t\t\tflow->http.url_pos = data + start + 4;\n\t\t\t\tflow->http.url_len = i - start - 4;\n\t\t\t}\n\t\t\telse if (0 == memcmp(&data[start], \"Host:\", 5))\n\t\t\t{\n\t\t\t\tflow->http.host_pos = data + start + 6;\n\t\t\t\tflow->http.host_len = i - start - 6;\n\t\t\t}\n\t\t\tif (data[i + 2] == 0x0d && data[i + 3] == 0x0a)\n\t\t\t{\n\t\t\t\tflow->http.data_pos = data + i + 4;\n\t\t\t\tflow->http.data_len = data_len - i - 4;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\t// 0x0d 0x0a\n\t\t\tstart = i + 2;\n\t\t}\n\t}\n}\n\nstatic void dump_http_flow_info(http_proto_t *http)\n{\n\tif (!http)\n\t{\n\t\tAF_ERROR(\"http ptr is NULL\\n\");\n\t\treturn;\n\t}\n\tif (!http->match)\n\t\treturn;\n\tif (http->method == HTTP_METHOD_GET)\n\t{\n\t\tprintk(\"Http method: \" HTTP_GET_METHOD_STR \"\\n\");\n\t}\n\telse if (http->method == HTTP_METHOD_POST)\n\t{\n\t\tprintk(\"Http method: \" HTTP_POST_METHOD_STR \"\\n\");\n\t}\n\tif (http->url_len > 0 && http->url_pos)\n\t{\n\t\tdump_str(\"Request url\", http->url_pos, http->url_len);\n\t}\n\n\tif (http->host_len > 0 && http->host_pos)\n\t{\n\t\tdump_str(\"Host\", http->host_pos, http->host_len);\n\t}\n\n\tprintk(\"--------------------------------------------------------\\n\\n\\n\");\n}\n\nstatic void dump_https_flow_info(https_proto_t *https)\n{\n\tif (!https)\n\t{\n\t\tAF_ERROR(\"https ptr is NULL\\n\");\n\t\treturn;\n\t}\n\tif (!https->match)\n\t\treturn;\n\n\tif (https->url_len > 0 && https->url_pos)\n\t{\n\t\tdump_str(\"https server name\", https->url_pos, https->url_len);\n\t}\n\n\tprintk(\"--------------------------------------------------------\\n\\n\\n\");\n}\nstatic void dump_flow_info(flow_info_t *flow)\n{\n\tif (!flow)\n\t{\n\t\tAF_ERROR(\"flow is null\\n\");\n\t\treturn;\n\t}\n\tif (flow->l4_len > 0)\n\t{\n\t\tAF_LMT_INFO(\"src=\" NIPQUAD_FMT \",dst=\" NIPQUAD_FMT \",sport: %d, dport: %d, data_len: %d\\n\",\n\t\t\t\t\tNIPQUAD(flow->src), NIPQUAD(flow->dst), flow->sport, flow->dport, flow->l4_len);\n\t}\n\n\tif (flow->l4_protocol == IPPROTO_TCP)\n\t{\n\t\tif (AF_TRUE == flow->http.match)\n\t\t{\n\t\t\tprintk(\"-------------------http protocol-------------------------\\n\");\n\t\t\tprintk(\"protocol:TCP , sport: %-8d, dport: %-8d, data_len: %-8d\\n\",\n\t\t\t\t   flow->sport, flow->dport, flow->l4_len);\n\t\t\tdump_http_flow_info(&flow->http);\n\t\t}\n\t\tif (AF_TRUE == flow->https.match)\n\t\t{\n\t\t\tprintk(\"-------------------https protocol-------------------------\\n\");\n\t\t\tdump_https_flow_info(&flow->https);\n\t\t}\n\t}\n}\n\n\nchar *k_memstr(char *data, char *str, int size)\n{\n\tchar *p;\n\tchar len = strlen(str);\n\tfor (p = data; p <= (data - len + size); p++)\n\t{\n\t\tif (memcmp(p, str, len) == 0)\n\t\t\treturn p; \n\t}\n\treturn NULL;\n}\n\nint af_match_by_pos(flow_info_t *flow, af_feature_node_t *node)\n{\n\tint i;\n\tunsigned int pos = 0;\n\n\tif (!flow || !node)\n\t\treturn AF_FALSE;\n\tif (node->pos_num > 0)\n\t{\n\t\t\n\t\tfor (i = 0; i < node->pos_num && i < MAX_POS_INFO_PER_FEATURE; i++)\n\t\t{\n\t\t\t// -1\n\t\t\tif (node->pos_info[i].pos < 0)\n\t\t\t{\n\t\t\t\tpos = flow->l4_len + node->pos_info[i].pos;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\tpos = node->pos_info[i].pos;\n\t\t\t}\n\t\t\tif (pos >= flow->l4_len)\n\t\t\t{\n\t\t\t\treturn AF_FALSE;\n\t\t\t}\n\t\t\tif (flow->l4_data[pos] != node->pos_info[i].value)\n\t\t\t{\n\t\t\t\treturn AF_FALSE;\n\t\t\t}\n\t\t\telse{\n\t\t\t\tAF_DEBUG(\"match pos[%d] = %x\\n\", pos, node->pos_info[i].value);\n\t\t\t}\n\t\t}\n\t\tif (strlen(node->search_str) > 0){\n\t\t\tif (k_memstr(flow->l4_data, node->search_str, flow->l4_len)){\n\t\t\t\tAF_DEBUG(\"match by search str, appid=%d, search_str=%s\\n\", node->app_id, node->search_str);\n\t\t\t\treturn AF_TRUE;\n\t\t\t}\n\t\t\telse{\n\t\t\t\treturn AF_FALSE;\n\t\t\t}\n\t\t}\n\t\treturn AF_TRUE;\n\t}\n\treturn AF_FALSE;\n}\n\nint af_match_by_url(flow_info_t *flow, af_feature_node_t *node)\n{\n\tchar reg_url_buf[MAX_URL_MATCH_LEN] = {0};\n\n\tif (!flow || !node)\n\t\treturn AF_FALSE;\n\t// match host or https url\n\tif (flow->https.match == AF_TRUE && flow->https.url_pos)\n\t{\n\t\tif (flow->https.url_len >= MAX_URL_MATCH_LEN)\n\t\t\tstrncpy(reg_url_buf, flow->https.url_pos, MAX_URL_MATCH_LEN - 1);\n\t\telse\n\t\t\tstrncpy(reg_url_buf, flow->https.url_pos, flow->https.url_len);\n\t}\n\telse if (flow->http.match == AF_TRUE && flow->http.host_pos)\n\t{\n\t\tif (flow->http.host_len >= MAX_URL_MATCH_LEN)\n\t\t\tstrncpy(reg_url_buf, flow->http.host_pos, MAX_URL_MATCH_LEN - 1);\n\t\telse\n\t\t\tstrncpy(reg_url_buf, flow->http.host_pos, flow->http.host_len);\n\t}\n\tif (strlen(reg_url_buf) > 0 && strlen(node->host_url) > 0 && regexp_match(node->host_url, reg_url_buf))\n\t{\n\t\tAF_DEBUG(\"match url:%s\t reg = %s, appid=%d\\n\",\n\t\t\t\t reg_url_buf, node->host_url, node->app_id);\n\t\treturn AF_TRUE;\n\t}\n\n\t// match request url\n\tif (flow->http.match == AF_TRUE && flow->http.url_pos)\n\t{\n\t\tmemset(reg_url_buf, 0x0, sizeof(reg_url_buf));\n\t\tif (flow->http.url_len >= MAX_URL_MATCH_LEN)\n\t\t\tstrncpy(reg_url_buf, flow->http.url_pos, MAX_URL_MATCH_LEN - 1);\n\t\telse\n\t\t\tstrncpy(reg_url_buf, flow->http.url_pos, flow->http.url_len);\n\t\tif (strlen(reg_url_buf) > 0 && strlen(node->request_url) && regexp_match(node->request_url, reg_url_buf))\n\t\t{\n\t\t\tAF_DEBUG(\"match request:%s   reg:%s appid=%d\\n\",\n\t\t\t\t\t reg_url_buf, node->request_url, node->app_id);\n\t\t\treturn AF_TRUE;\n\t\t}\n\t}\n\treturn AF_FALSE;\n}\n\nint af_match_one(flow_info_t *flow, af_feature_node_t *node)\n{\n\tint ret = AF_FALSE;\n\tif (!flow || !node)\n\t{\n\t\tAF_ERROR(\"node or flow is NULL\\n\");\n\t\treturn AF_FALSE;\n\t}\n\tif (node->proto > 0 && flow->l4_protocol != node->proto)\n\t\treturn AF_FALSE;\n\tif (flow->l4_len == 0)\n\t\treturn AF_FALSE;\n\n\tif (node->sport != 0 && flow->sport != node->sport)\n\t{\n\t\treturn AF_FALSE;\n\t}\n\n\tif (!af_match_port(&node->dport_info, flow->dport))\n\t{\n\t\treturn AF_FALSE;\n\t}\n\n\tif (strlen(node->request_url) > 0 ||\n\t\tstrlen(node->host_url) > 0)\n\t{\n\t\tret = af_match_by_url(flow, node);\n\t}\n\telse if (node->pos_num > 0)\n\t{\n\t\t\n\t\tret = af_match_by_pos(flow, node);\n\t}\n\telse\n\t{\n\t\tAF_DEBUG(\"node is empty, match sport:%d,dport:%d, appid = %d\\n\",\n\t\t\t\t node->sport, node->dport, node->app_id);\n\t\treturn AF_TRUE;\n\t}\n\n\treturn ret;\n}\n\n\nint af_match_quic(flow_info_t *flow)\n{\n\tunsigned char *data;\n\tunsigned char first_byte;\n\tunsigned int version;\n\t\n\tif (flow->l4_protocol != IPPROTO_UDP) {\n\t\treturn AF_FALSE;\n\t}\n\t\n\tif (!flow->l4_data || flow->l4_len < 8) {\n\t\treturn AF_FALSE;\n\t}\n\t\n\tdata = flow->l4_data;\n\tfirst_byte = data[0];\n\t\n\tif (first_byte & 0x80) {\n\t\tif (flow->l4_len >= 5) {\n\t\t\tversion = (data[1] << 24) | (data[2] << 16) | (data[3] << 8) | data[4];\n\n\t\t\tif (version == 0x00000001 ||\n\t\t\t\tversion == 0x00000000 ||  \n\t\t\t\tversion == 0x6b3343cf || \n\t\t\t\t(version >= 0xff000000 && version <= 0xffffffff)) { \n\t\t\t\tAF_LMT_DEBUG(\"match quic, version = %x\\n\", version);\n\t\t\t\treturn AF_TRUE;\n\t\t\t}\n\t\t}\n\t\tif (flow->dport == 443) {\n\t\t\treturn AF_TRUE;\n\t\t}\n\t\treturn AF_FALSE;\n\t}\n\treturn AF_FALSE;\n}\n\n\nint match_feature(flow_info_t *flow)\n{\n\taf_feature_node_t *n, *node;\n\n\tfeature_list_read_lock();\n\tif (!list_empty(&af_feature_head))\n\t{\n\t\tlist_for_each_entry_safe(node, n, &af_feature_head, head)\n\t\t{\n\t\t\tif (af_match_one(flow, node))\n\t\t\t{\n\t\t\t\tAF_LMT_INFO(\"match feature, appid=%d, feature = %s\\n\", node->app_id, node->feature);\n\t\t\t\tflow->app_id = node->app_id;\n\t\t\t\tflow->feature = node;\n\t\t\t\tstrncpy(flow->app_name, node->app_name, sizeof(flow->app_name) - 1);\n\t\t\t\tfeature_list_read_unlock();\n\t\t\t\treturn AF_TRUE;\n\t\t\t}\n\t\t}\n\t}\n\tfeature_list_read_unlock();\n\treturn AF_FALSE;\n}\n\n\nint match_app_filter_user(af_client_info_t *client){\n\tif (!g_user_mode){ // auto mode\n\t\tif (af_whitelist_mac_find(client->mac)){\n\t\t\tAF_LMT_DEBUG(\"match whitelist mac = \" MAC_FMT \"\\n\", MAC_ARRAY(client->mac));\n\t\t\treturn AF_FALSE;\n\t\t}\n\t}\n\telse{ // manual mode\n\t\tif (!af_mac_find(client->mac))\n\t\t\treturn AF_FALSE;\n\t}\n\treturn AF_TRUE;\n}\n\n\nint match_app_filter_rule(int appid, af_client_info_t *client)\n{\n\tif (!match_app_filter_user(client))\n\t\treturn AF_FALSE;\n\n\t// All apps mode: skip appid check, match user only\n\tif (g_app_filter_mode == 1) {\n\t\treturn AF_TRUE;\n\t}\n\n\t// Specified apps mode: check appid status\n\tif (af_get_app_status(appid))\n\t{\n\t\treturn AF_TRUE;\n\t}\n\treturn AF_FALSE;\n}\n\n\n/*1000 0000 0000 0000 0000 0000 0000 0000*/\n#define NF_DROP_BIT 0x80000000\n/*0100 0000 0000 0000 0000 0000 0000 0000*/\n#define NF_CLIENT_HELLO_BIT 0x40000000\n/*0010 0000 0000 0000 0000 0000 0000 0000*/\n#define NF_IGNORE_BIT 0x20000000\n\n\nstatic int af_get_visit_index(af_client_info_t *node, int app_id)\n{\n\tint i;\n\tfor (i = 0; i < MAX_RECORD_APP_NUM; i++)\n\t{\n\t\tif (node->visit_info[i].app_id == app_id || node->visit_info[i].app_id == 0)\n\t\t{\n\t\t\treturn i;\n\t\t}\n\t}\n\t// default 0\n\treturn 0;\n}\n\nint af_update_client_app_info(af_client_info_t *node, int app_id, int drop)\n{\n\tint index = -1;\n\tif (!node)\n\t\treturn -1;\n\n\tindex = af_get_visit_index(node, app_id);\n\tif (index < 0 || index >= MAX_RECORD_APP_NUM)\n\t\treturn 0;\n\tnode->visit_info[index].total_num++;\n\tif (drop)\n\t\tnode->visit_info[index].drop_num++;\n\tnode->visit_info[index].app_id = app_id;\n\tnode->visit_info[index].latest_time = af_get_timestamp_sec();\n\tnode->visit_info[index].latest_action = drop;\n\tif (app_id > 0){\n\t\tnode->visiting.app_time = af_get_timestamp_sec();\n\t\tnode->visiting.visiting_app = app_id;\n\t}\n\treturn 0;\n}\n\nint af_send_msg_to_user(char *pbuf, uint16_t len);\nint af_match_bcast_packet(flow_info_t *f)\n{\n\tif (!f)\n\t\treturn 0;\n\tif (0 == f->src || 0 == f->dst || 0xffffffff == f->dst || 0 == f->dst)\n\t\treturn 1;\n\treturn 0;\n}\n\nint af_match_local_packet(flow_info_t *f)\n{\n\tif (!f)\n\t\treturn 0;\n\tif (0x0100007f == f->src || 0x0100007f == f->dst)\n\t{\n\t\treturn 1;\n\t}\n\treturn 0;\n}\n\nint update_url_visiting_info(af_client_info_t *client, flow_info_t *flow)\n{\n\tchar *host = NULL;\n\tunsigned int len = 0;\n    if (!client || !flow)\n        return -1;\n\t\n    if (flow->https.match){\n        host = flow->https.url_pos;\n        len = flow->https.url_len;\n    }\n    else if (flow->http.match){\n        host = flow->http.host_pos;\n        len = flow->http.host_len;\n    }\n    if (!host || len < MIN_REPORT_URL_LEN || len >= MAX_REPORT_URL_LEN)\n        return -1;\n\n    memcpy(client->visiting.visiting_url, host, len);\n    client->visiting.visiting_url[len] = 0x0; \n    client->visiting.url_time = af_get_timestamp_sec();\n    return 0;\n}\n\n\nint dpi_main(struct sk_buff *skb, flow_info_t *flow)\n{\n\tdpi_http_proto(flow);\n\tdpi_https_proto(flow);\n\tif (TEST_MODE())\n\t\tdump_flow_info(flow);\n\treturn 0;\n}\n\nvoid af_get_smac(struct sk_buff *skb, u_int8_t *smac)\n{\n\tstruct ethhdr *ethhdr = NULL;\n\tethhdr = eth_hdr(skb);\n\tif (ethhdr)\n\t\tmemcpy(smac, ethhdr->h_source, ETH_ALEN);\n\telse\n\t\tmemcpy(smac, &skb->cb[40], ETH_ALEN);\n}\nint is_ipv4_broadcast(uint32_t ip)\n{\n\treturn (ip & 0x00FFFFFF) == 0x00FFFFFF;\n}\n\nint is_ipv4_multicast(uint32_t ip)\n{\n\treturn (ip & 0xF0000000) == 0xE0000000;\n}\nint af_check_bcast_ip(flow_info_t *f)\n{\n\n\tif (0 == f->src || 0 == f->dst)\n\t\treturn 1;\n\tif (is_ipv4_broadcast(ntohl(f->src)) || is_ipv4_broadcast(ntohl(f->dst)))\n\t{\n\t\treturn 1;\n\t}\n\tif (is_ipv4_multicast(ntohl(f->src)) || is_ipv4_multicast(ntohl(f->dst)))\n\t{\n\t\treturn 1;\n\t}\n\n\treturn 0;\n}\n\n/*\n\taction: 0: accept, 1: drop\n\treturn: 0: no change, 1: change\n*/\nu_int32_t check_app_action_changed(int action, u_int32_t app_id, af_client_info_t *client)\n{\n\tu_int8_t drop = 0;\n\tint changed = 0;\n\tu_int32_t max_jiffies = 30 * HZ;\n\tu_int32_t interval_jiffies = jiffies - g_update_jiffies;\n\tif (interval_jiffies < max_jiffies){     \n\t\tAF_LMT_DEBUG(\"config changed, update app action\\n\");\n\t\tif (match_app_filter_rule(app_id, client)){\n\t\t\tAF_LMT_DEBUG(\"match appid = %d, action = %d\\n\", app_id, action);\n\t\t\tif (!action) \n\t\t\t\tchanged = 1;\n\t\t}    \n\t\telse{\n\t\t\tif (action) \n\t\t\t\tchanged = 1;\n\t\t}    \n\t} \n\treturn changed;\n}\n\nu_int32_t app_filter_hook_bypass_handle(struct sk_buff *skb, struct net_device *dev)\n{\n\tflow_info_t flow;\n\taf_conn_t *conn;\n\tu_int8_t smac[ETH_ALEN];\n\taf_client_info_t *client = NULL;\n\tu_int32_t ret = NF_ACCEPT;\n\tu_int8_t malloc_data = 0;\n\n\tif (!skb || !dev)\n\t\treturn NF_ACCEPT;\n\tif (0 == af_lan_ip || 0 == af_lan_mask)\n\t\treturn NF_ACCEPT;\n\tif (strstr(dev->name, \"docker\"))\n\t\treturn NF_ACCEPT;\n\n\tmemset((char *)&flow, 0x0, sizeof(flow_info_t));\n\tif (parse_flow_proto(skb, &flow) < 0)\n\t\treturn NF_ACCEPT;\n\t// bypass mode, only handle ipv4\n\tif (flow.src || flow.dst)\n\t{\n\t\tif (af_lan_ip == flow.src || af_lan_ip == flow.dst)\n\t\t{\n\t\t\treturn NF_ACCEPT;\n\t\t}\n\t\tif (af_check_bcast_ip(&flow) || af_match_local_packet(&flow))\n\t\t\treturn NF_ACCEPT;\n\n\t\tif ((flow.src & af_lan_mask) != (af_lan_ip & af_lan_mask))\n\t\t{\n\t\t\treturn NF_ACCEPT;\n\t\t}\n\t}\n\telse\n\t{\n\t\treturn NF_ACCEPT;\n\t}\n\taf_get_smac(skb, smac);\n\n\tAF_CLIENT_LOCK_W();\n\tclient = find_and_add_af_client(smac);\n\tif (!client)\n\t{\n\t\tAF_CLIENT_UNLOCK_W();\n\t\treturn NF_ACCEPT;\n\t}\n\tclient->update_jiffies = jiffies;\n\tif (flow.src)\n\t\tclient->ip = flow.src;\n\tAF_CLIENT_UNLOCK_W();\n\n\n\tspin_lock(&af_conn_lock);\n   \tconn = af_conn_find_and_add(flow.src, flow.dst, flow.sport, flow.dport, flow.l4_protocol);\n\tif (!conn){\n\t\treturn NF_ACCEPT;\n\t}\n\n\tconn->last_jiffies = jiffies;\n\tconn->total_pkts++;\n    spin_unlock(&af_conn_lock);\n\n\tif (conn->drop && g_app_filter_mode){\n\t\tAF_LMT_INFO(\"bypass mod drop all app\\n\");\n\t\treturn NF_DROP;\n\t}\n\n\tif (conn->app_id != 0)\n\t{\n\t\tflow.app_id = conn->app_id;\n\t\tflow.drop = conn->drop;\n\t\tif (g_disable_quic && flow.drop && flow.app_id == APPID_QUIC){\n\t\t\tAF_LMT_INFO(\"bypass drop quic\\n\");\n\t\t\treturn NF_DROP;\n\t\t}\n\n\t\tif (check_app_action_changed(flow.drop, flow.app_id, client)){\n\t\t\tflow.drop = !flow.drop;\n\t\t\tAF_LMT_DEBUG(\"update appid %d action, new action = %s\\n\", flow.app_id, flow.drop ? \"drop\" : \"accept\");\n\t\t}\n\t}\n\telse{\n\t\tif (g_by_pass_accl) {\n\t\t\tif (conn->total_pkts > 256)\t{\n\t\t\t\treturn NF_ACCEPT;\n\t\t\t}\n\t\t}\n\n\t\t\n\t\tif (g_disable_quic && af_match_quic(&flow) && match_app_filter_user(client)){\n\t\t\tconn->app_id = APPID_QUIC;\n\t\t\tconn->drop = 1;\n\t\t\tAF_LMT_INFO(\"match quic proto, drop\\n\");\n\t\t\treturn NF_DROP;\n\t\t}\n\n\n\t\t\n\t\tif (skb_is_nonlinear(skb) && flow.l4_len < MAX_AF_SUPPORT_DATA_LEN)\n\t\t{\n\t\t\tflow.l4_data = read_skb(skb, flow.l4_data - skb->data, flow.l4_len);\n\t\t\tif (!flow.l4_data)\n\t\t\t\treturn NF_ACCEPT;\n\t\t\tAF_LMT_DEBUG(\"##match nonlinear skb, len = %d\\n\", flow.l4_len);\n\t\t\tmalloc_data = 1;\n\t\t}\n\t\tflow.client_hello = conn->client_hello;\n\n\t\tdpi_main(skb, &flow);\n\t\tconn->client_hello = flow.client_hello;\n\t\tupdate_url_visiting_info(client, &flow);\n\n\t\tif (!match_feature(&flow) && 0 == g_app_filter_mode)\n\t\t\tgoto EXIT;\n\t\t\n\t\tif (g_oaf_filter_enable){\n\t\t\tif (match_app_filter_rule(flow.app_id, client)){\n\t\t\t\tflow.drop = 1;\n\t\t\t\tAF_INFO(\"##Drop appid %d\\n\",flow.app_id);\n\t\t\t\tif (skb->protocol == htons(ETH_P_IP) && g_tcp_rst){\n\t\t\t\t#if LINUX_VERSION_CODE > KERNEL_VERSION(5,10,197)\n\t\t\t\t\tnf_send_reset(&init_net, skb->sk, skb, NF_INET_PRE_ROUTING);\n\t\t\t\t#elif LINUX_VERSION_CODE > KERNEL_VERSION(4,4,1)\n\t\t\t\t// 5.4 kernel panic\n\t\t\t//\t\tnf_send_reset(&init_net, skb, NF_INET_PRE_ROUTING);\n\t\t\t\t#else\n\t\t\t\t\tnf_send_reset(skb, NF_INET_PRE_ROUTING);\n\t\t\t\t#endif\n\t\t\t\t}\n\n\t\t\t}\n\t\t}\n\t\tconn->app_id = flow.app_id;\n\t\tconn->drop = flow.drop;\n\t\tif (flow.feature && flow.feature->ignore){\n\t\t\tAF_LMT_DEBUG(\"match ignore feature, feature = %s, appid = %d\\n\", flow.feature->feature ,flow.app_id);\n\t\t\tconn->ignore = 1;\n\t\t}\n\t\telse{\n\t\t\tconn->ignore = 0;\n\t\t}\n\t\tconn->state = AF_CONN_DPI_FINISHED;\n\t}\n\n\tif (g_oaf_record_enable\t){\n\t\tif (!conn->ignore){\n\t\t\taf_update_client_app_info(client, flow.app_id, flow.drop);\n\t\t}\n\t\telse{\n\t\t\tAF_LMT_DEBUG(\"update ignore appid = %d, drop = %d\\n\", flow.app_id, flow.drop);\n\t\t}\n\t\n\t}\n\n\tif (flow.drop && g_oaf_filter_enable)\n\t{\n\t\tAF_LMT_INFO(\"drop appid = %d\\n\", flow.app_id);\n\t\tret = NF_DROP;\n\t}\n\nEXIT:\n\tif (malloc_data)\n\t{\n\t\tif (flow.l4_data)\n\t\t{\n\t\t\tkfree(flow.l4_data);\n\t\t}\n\t}\n\treturn ret;\n}\n\n\nu_int32_t app_filter_hook_gateway_handle(struct sk_buff *skb, struct net_device *dev)\n{\n\tunsigned long long total_packets = 0;\n\tflow_info_t flow;\n\tu_int8_t smac[ETH_ALEN];\n\tenum ip_conntrack_info ctinfo;\n\tstruct nf_conn *ct = NULL;\n\tstruct nf_conn_acct *acct;\n\taf_client_info_t *client = NULL;\n\tu_int32_t ret = NF_ACCEPT;\n\tu_int32_t app_id = 0;\n\tu_int8_t drop = 0;\n\tu_int8_t malloc_data = 0;\n\n\tif (!strstr(dev->name, g_lan_ifname))\n\t\treturn NF_ACCEPT;\n\n\tmemset((char *)&flow, 0x0, sizeof(flow_info_t));\n\tif (parse_flow_proto(skb, &flow) < 0)\n\t\treturn NF_ACCEPT;\n\n\tct = nf_ct_get(skb, &ctinfo);\n\tif (ct == NULL)\n\t\treturn NF_ACCEPT;\n\n\tif (flow.l4_protocol == IPPROTO_TCP && !nf_ct_is_confirmed(ct)){\n\t\treturn NF_ACCEPT;\n\t}\n\n\tAF_CLIENT_LOCK_R();\n\tif (flow.src){\n\t\tclient = find_af_client_by_ip(flow.src);\n\t}\n\telse if (flow.src6){\n\t\tclient = find_af_client_by_ipv6(flow.src6);\n\t}\n\n\tif (!client)\n\t{\n\t\tAF_CLIENT_UNLOCK_R();\n\t\treturn NF_ACCEPT;\n\t}\n\tclient->update_jiffies = jiffies;\n\tAF_CLIENT_UNLOCK_R();\n\n\n\n\tif (ct->mark != 0)\n\t{\n\t\tapp_id = ct->mark & 0xffff;\n\t\tu_int32_t orig_mark = ct->mark;\n\t\t// 1: drop , 0: accept\n\t\tint ct_action = (NF_DROP_BIT == (ct->mark & NF_DROP_BIT)) ? 1 : 0;\n\t\tflow.ignore = (NF_IGNORE_BIT == (ct->mark & NF_IGNORE_BIT)) ? 1 : 0;\n\t\tif (flow.ignore){\n\t\t\tAF_LMT_DEBUG(\"match ignore appid = %d, drop = %d\\n\", app_id, ct_action);\n\t\t}\n\t\t\n\t\tif (g_oaf_filter_enable){\n\t\t\t// quic proto\n\t\t\tif (g_disable_quic && app_id == APPID_QUIC && ct_action){\n\t\t\t\tAF_LMT_INFO(\"mark = %x,drop appid = %d\\n\", ct->mark, app_id);\n\t\t\t\treturn NF_DROP;\n\t\t\t}\n\n\t\t\tif (g_app_filter_mode && ct_action){\n\t\t\t\tAF_LMT_INFO(\"ct drop all app\\n\");\n\t\t\t\treturn NF_DROP;\n\t\t\t}\n\t\t}\n\t\n\t\tif (app_id > 1000 && app_id < 32000)\n\t\t{\n\t\t\tAF_LMT_DEBUG(\"appid = %d, ct_action = %d\\n\", app_id, ct_action);\n\t\t\tif (check_app_action_changed(ct_action, app_id, client)){\n\t\t\t\tif (ct_action) // drop --> accept\n\t\t\t\t\tct->mark &= ~NF_DROP_BIT;\n\t\t\t\telse\n\t\t\t\t\tct->mark |= NF_DROP_BIT;\n\t\t\t\tct_action = !ct_action;\n\t\t\t\tAF_LMT_DEBUG(\"update appid %d action to %s, mark = %x-->%x\\n\",\n\t\t\t\t\t app_id, ct_action ? \"drop\" : \"accept\", orig_mark, ct->mark);\n\t\t\t}\n\n\t\t\tif (g_oaf_record_enable){\n\t\t\t\tAF_CLIENT_LOCK_W();\n\t\t\t\tif (!flow.ignore){\n\t\t\t\t\taf_update_client_app_info(client, app_id, ct_action);\n\t\t\t\t}\n\t\t\t\telse{\n\t\t\t\t\tAF_LMT_DEBUG(\" ignore appid = %d, drop = %d, not update status\\n\", app_id, ct_action);\n\t\t\t\t}\n\t\t\t\tAF_CLIENT_UNLOCK_W();\n\t\t\t}\n\t\t\tif (g_oaf_filter_enable && ct_action) {\n\t\t\t\tAF_LMT_DEBUG(\"drop appid = %d, ct_action = %d\\n\", app_id, ct_action);\n\t\t\t\treturn NF_DROP;\n\t\t\t}\n\t\t\telse{\n\t\t\t\tAF_LMT_DEBUG(\"accept appid = %d, ct_action = %d\\n\", app_id, ct_action);\n\t\t\t\treturn NF_ACCEPT;\n\t\t\t}\n\t\t}\n\t\telse {\n\t\t\tAF_LMT_DEBUG(\"ct->mark = %x\\n\", ct->mark);\n\t\t\tif (ct->mark & NF_CLIENT_HELLO_BIT) {\n\t\t\t\tAF_LMT_INFO(\"match ct client hello...\\n\");\n\t\t\t\tflow.client_hello = 1;\n\t\t\t}\n\t\t}\n\t}\n\n\tacct = nf_conn_acct_find(ct);\n\tif (!acct)\n\t\treturn NF_ACCEPT;\n\ttotal_packets = (unsigned long long)atomic64_read(&acct->counter[IP_CT_DIR_ORIGINAL].packets) + (unsigned long long)atomic64_read(&acct->counter[IP_CT_DIR_REPLY].packets);\n\n\tif (total_packets > MAX_DPI_PKT_NUM)\n\t\treturn NF_ACCEPT;\n\n\n\tif (g_oaf_filter_enable && g_disable_quic && af_match_quic(&flow) && match_app_filter_user(client)){\n\t\tct->mark = (ct->mark & 0xFFFF0000) | (APPID_QUIC & 0xFFFF);\n\t\tct->mark |= NF_DROP_BIT;\t\n\t\tAF_LMT_INFO(\"match quick drop,  %s %pI4(%d)--> %pI4(%d) len = %d [%02x %02x %02x %02x %02x %02x %02x %02x] \\n \", IPPROTO_TCP == flow.l4_protocol ? \"tcp\" : \"udp\",\n\t\t\t\t\t&flow.src, flow.sport, &flow.dst, flow.dport, flow.l4_len, flow.l4_data[0], flow.l4_data[1],flow.l4_data[2], flow.l4_data[3],flow.l4_data[4], flow.l4_data[5],flow.l4_data[6], flow.l4_data[7]);\t\n\t\treturn NF_DROP;\n\t}\n\n\n\tif (skb_is_nonlinear(skb) && flow.l4_len < MAX_AF_SUPPORT_DATA_LEN)\n\t{\n\t\tflow.l4_data = read_skb(skb, flow.l4_data - skb->data, flow.l4_len);\n\t\tif (!flow.l4_data)\n\t\t\treturn NF_ACCEPT;\n\t\tmalloc_data = 1;\n\t}\n\tdpi_main(skb, &flow);\n\n\tupdate_url_visiting_info(client, &flow);\n\tif (flow.client_hello) {\n\t\tct->mark |= NF_CLIENT_HELLO_BIT;\n\t}\n\telse {\n\t\tct->mark &= ~NF_CLIENT_HELLO_BIT;\n\t}\n\n\n\tif (!match_feature(&flow) && 0 == g_app_filter_mode)\n\t\tgoto EXIT;\n\t\n\n\t if (TEST_MODE()){\n\t\tif (flow.l4_protocol == IPPROTO_UDP){\n\t\t\tif (flow.dport > 5000 && flow.l4_len > 16 && flow.l4_len < 500){\t\n\t\t\t\tprintk(\" %s %pI4(%d)--> %pI4(%d) len = %d [%02x %02x %02x %02x %02x %02x %02x %02x] \\n \", IPPROTO_TCP == flow.l4_protocol ? \"tcp\" : \"udp\",\n\t\t\t\t\t&flow.src, flow.sport, &flow.dst, flow.dport, flow.l4_len, flow.l4_data[0], flow.l4_data[1],flow.l4_data[2], flow.l4_data[3],flow.l4_data[4], flow.l4_data[5],flow.l4_data[6], flow.l4_data[7]);\t\t\t\t\n\t\t\t}\n\t\t}\n\t}\n\n\n\tct->mark = (ct->mark & 0xFFFF0000) | (flow.app_id & 0xFFFF);\n\tif (flow.feature && flow.feature->ignore){\n\t\tct->mark |= NF_IGNORE_BIT;\n\t\tflow.ignore = 1;\n\t\tAF_LMT_DEBUG(\"gateway set ignore bit, ct->mark = %x\\n\", ct->mark);\n\t}\n\t\n\tif (g_oaf_filter_enable){\n\t\tif (match_app_filter_rule(flow.app_id, client))\n\t\t{\n\t\t\tct->mark |= NF_DROP_BIT;\n\t\t\tflow.drop = 1;\n\t\t\tAF_LMT_INFO(\"##Drop app %s flow, appid is %d\\n\", flow.app_name, flow.app_id);\n\t\t\tif (skb->protocol == htons(ETH_P_IP) && g_tcp_rst){\n\t\t\t#if LINUX_VERSION_CODE > KERNEL_VERSION(5,10,197)\n\t\t\t\tnf_send_reset(&init_net, skb->sk, skb, NF_INET_PRE_ROUTING);\n\t\t\t#elif LINUX_VERSION_CODE > KERNEL_VERSION(4,4,1)\n\t\t\t\t//5.4 kernel panic\n\t\t\t\t//nf_send_reset(&init_net, skb, NF_INET_PRE_ROUTING);\n\t\t\t#else\n\t\t\t\tnf_send_reset(skb, NF_INET_PRE_ROUTING);\n\t\t\t#endif\n\t\t\t}\n\t\t\tret = NF_DROP;\n\t\t}\n\t}\n\n\tif (g_oaf_record_enable){\n\t\tAF_CLIENT_LOCK_W();\n\t\tif (!flow.ignore){\n\t\t\taf_update_client_app_info(client, flow.app_id, flow.drop);\n\t\t}\n\n\t\tAF_CLIENT_UNLOCK_W();\n\t\tAF_LMT_INFO(\"match %s %pI4(%d)--> %pI4(%d) len = %d, %d\\n \", IPPROTO_TCP == flow.l4_protocol ? \"tcp\" : \"udp\",\n\t\t\t\t\t&flow.src, flow.sport, &flow.dst, flow.dport, skb->len, flow.app_id);\n\t}\n\t\nEXIT:\n\tif (malloc_data)\n\t{\n\t\tif (flow.l4_data)\n\t\t{\n\t\t\tkfree(flow.l4_data);\n\t\t}\n\t}\n\treturn ret;\n}\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)\nstatic u_int32_t app_filter_hook(void *priv,\n\t\t\t\t\t\t\t\t struct sk_buff *skb,\n\t\t\t\t\t\t\t\t const struct nf_hook_state *state)\n{\n#else\nstatic u_int32_t app_filter_hook(unsigned int hook,\n\t\t\t\t\t\t\t\t struct sk_buff *skb,\n\t\t\t\t\t\t\t\t const struct net_device *in,\n\t\t\t\t\t\t\t\t const struct net_device *out,\n\t\t\t\t\t\t\t\t int (*okfn)(struct sk_buff *))\n{\n#endif\n\n\tif (AF_MODE_BYPASS == af_work_mode)\n\t\treturn NF_ACCEPT;\n\treturn app_filter_hook_gateway_handle(skb, skb->dev);\n}\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)\nstatic u_int32_t app_filter_by_pass_hook(void *priv,\n\t\t\t\t\t\t\t\t\t\t struct sk_buff *skb,\n\t\t\t\t\t\t\t\t\t\t const struct nf_hook_state *state)\n{\n#else\nstatic u_int32_t app_filter_by_pass_hook(unsigned int hook,\n\t\t\t\t\t\t\t\t\t\t struct sk_buff *skb,\n\t\t\t\t\t\t\t\t\t\t const struct net_device *in,\n\t\t\t\t\t\t\t\t\t\t const struct net_device *out,\n\t\t\t\t\t\t\t\t\t\t int (*okfn)(struct sk_buff *))\n{\n#endif\n\tif (AF_MODE_GATEWAY == af_work_mode)\n\t\treturn NF_ACCEPT;\n\treturn app_filter_hook_bypass_handle(skb, skb->dev);\n}\n\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 16, 0)\nstatic struct nf_hook_ops app_filter_ops[] __read_mostly = {\n\t{\n\t\t.hook = app_filter_hook,\n\t\t.pf = NFPROTO_INET,\n\t\t.hooknum = NF_INET_FORWARD,\n\t\t.priority = NF_IP_PRI_MANGLE + 1,\n\n\t},\n\t{\n\t\t.hook = app_filter_by_pass_hook,\n\t\t.pf = NFPROTO_INET,\n\t\t.hooknum = NF_INET_PRE_ROUTING,\n\t\t.priority = NF_IP_PRI_MANGLE + 1,\n\t},\n};\n#elif LINUX_VERSION_CODE >= KERNEL_VERSION(4, 4, 0)\nstatic struct nf_hook_ops app_filter_ops[] __read_mostly = {\n\t{\n\t\t.hook = app_filter_hook,\n\t\t.pf = NFPROTO_IPV4,\n\t\t.hooknum = NF_INET_FORWARD,\n\t\t.priority = NF_IP_PRI_MANGLE + 1,\n\t},\n\t{\n\t\t.hook = app_filter_by_pass_hook,\n\t\t.pf = NFPROTO_IPV4,\n\t\t.hooknum = NF_INET_PRE_ROUTING,\n\t\t.priority = NF_IP_PRI_MANGLE + 1,\n\t},\n\t{\n\t\t.hook = app_filter_hook,\n\t\t.pf = NFPROTO_IPV6,\n\t\t.hooknum = NF_INET_FORWARD,\n\t\t.priority = NF_IP_PRI_MANGLE + 1,\n\n\t},\n\t{\n\t\t.hook = app_filter_by_pass_hook,\n\t\t.pf = NFPROTO_IPV6,\n\t\t.hooknum = NF_INET_PRE_ROUTING,\n\t\t.priority = NF_IP_PRI_MANGLE + 1,\n\t},\n};\n#else\nstatic struct nf_hook_ops app_filter_ops[] __read_mostly = {\n\t{\n\t\t.hook = app_filter_hook,\n\t\t.owner = THIS_MODULE,\n\t\t.pf = NFPROTO_IPV4,\n\t\t.hooknum = NF_INET_FORWARD,\n\t\t.priority = NF_IP_PRI_MANGLE + 1,\n\t},\n\t{\n\t\t.hook = app_filter_hook,\n\t\t.owner = THIS_MODULE,\n\t\t.pf = NFPROTO_IPV6,\n\t\t.hooknum = NF_INET_FORWARD,\n\t\t.priority = NF_IP_PRI_MANGLE + 1,\n\t},\n};\n#endif\n\nstruct timer_list oaf_timer;\nint report_flag = 0;\n#define OAF_TIMER_INTERVAL 1\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)\nstatic void oaf_timer_func(struct timer_list *t)\n#else\nstatic void oaf_timer_func(unsigned long ptr)\n#endif\n{\n\tstatic int count = 0;\n\tif (count % 60 == 0)\n\t\tcheck_client_expire();\n\n\tcount++;\n\taf_conn_clean_timeout();\n\n\tmod_timer(&oaf_timer, jiffies + OAF_TIMER_INTERVAL * HZ);\n}\n\nvoid init_oaf_timer(void)\n{\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 15, 0)\n\ttimer_setup(&oaf_timer, oaf_timer_func, 0);\n#else\n\tsetup_timer(&oaf_timer, oaf_timer_func, OAF_TIMER_INTERVAL * HZ);\n#endif\n\tmod_timer(&oaf_timer, jiffies + OAF_TIMER_INTERVAL * HZ);\n\tAF_INFO(\"init oaf timer...ok\");\n}\n\nvoid fini_oaf_timer(void)\n{\n#if LINUX_VERSION_CODE < KERNEL_VERSION(6, 16, 0)\n\tdel_timer_sync(&oaf_timer);\n#else\n\ttimer_delete_sync(&oaf_timer);\n#endif\n\tAF_INFO(\"del oaf timer...ok\");\n}\n\nstatic struct sock *oaf_sock = NULL;\n\n#define OAF_EXTRA_MSG_BUF_LEN 128\nint af_send_msg_to_user(char *pbuf, uint16_t len)\n{\n\tstruct sk_buff *nl_skb;\n\tstruct nlmsghdr *nlh;\n\tint buf_len = OAF_EXTRA_MSG_BUF_LEN + len;\n\tchar *msg_buf = NULL;\n\tstruct af_msg_hdr *hdr = NULL;\n\tchar *p_data = NULL;\n\tint ret;\n\tif (len >= MAX_OAF_NL_MSG_LEN)\n\t\treturn -1;\n\n\tmsg_buf = kmalloc(buf_len, GFP_ATOMIC);\n\tif (!msg_buf)\n\t\treturn -1;\n\n\tmemset(msg_buf, 0x0, buf_len);\n\tnl_skb = nlmsg_new(len + sizeof(struct af_msg_hdr), GFP_ATOMIC);\n\tif (!nl_skb)\n\t{\n\t\tret = -1;\n\t\tgoto fail;\n\t}\n\n\tnlh = nlmsg_put(nl_skb, 0, 0, OAF_NETLINK_ID, len + sizeof(struct af_msg_hdr), 0);\n\tif (nlh == NULL)\n\t{\n\t\tnlmsg_free(nl_skb);\n\t\tret = -1;\n\t\tgoto fail;\n\t}\n\n\thdr = (struct af_msg_hdr *)msg_buf;\n\thdr->magic = 0xa0b0c0d0;\n\thdr->len = len;\n\tp_data = msg_buf + sizeof(struct af_msg_hdr);\n\tmemcpy(p_data, pbuf, len);\n\tmemcpy(nlmsg_data(nlh), msg_buf, len + sizeof(struct af_msg_hdr));\n\tret = netlink_unicast(oaf_sock, nl_skb, 999, MSG_DONTWAIT);\n\nfail:\n\tkfree(msg_buf);\n\treturn ret;\n}\n\nstatic void oaf_user_msg_handle(char *data, int len)\n{\n\tchar *msg_data = data + sizeof(af_msg_t);\n\tif (len < sizeof(af_msg_t))\n\t\treturn;\n\taf_msg_t *msg = (af_msg_t *)data;\n\tAF_INFO(\"msg action = %d\\n\", msg->action);\n\tswitch (msg->action)\n\t{\n\tcase AF_MSG_INIT:\n\t\taf_client_list_reset_report_num();\n\t\treport_flag = 1;\n\t\tbreak;\n\tcase AF_MSG_ADD_FEATURE:\n\t\taf_add_feature_msg_handle(msg_data, len - sizeof(af_msg_t));\n\t\tbreak;\n\tcase AF_MSG_CLEAN_FEATURE:\n\t\tAF_INFO(\"clean feature\\n\");\n\t\taf_clean_feature_list();\n\t\tbreak;\n\tdefault:\n\t\tbreak;\n\t}\n}\nstatic void oaf_msg_rcv(struct sk_buff *skb)\n{\n\tstruct nlmsghdr *nlh = NULL;\n\tchar *umsg = NULL;\n\tvoid *udata = NULL;\n\tstruct af_msg_hdr *af_hdr = NULL;\n\tif (skb->len >= nlmsg_total_size(0))\n\t{\n\t\tnlh = nlmsg_hdr(skb);\n\t\tumsg = NLMSG_DATA(nlh);\n\t\taf_hdr = (struct af_msg_hdr *)umsg;\n\t\tif (af_hdr->magic != 0xa0b0c0d0)\n\t\t\treturn;\n\t\tif (af_hdr->len <= 0 || af_hdr->len >= MAX_OAF_NETLINK_MSG_LEN)\n\t\t\treturn;\n\t\tudata = umsg + sizeof(struct af_msg_hdr);\n\n\t\tif (udata)\n\t\t\toaf_user_msg_handle(udata, af_hdr->len);\n\t}\n}\n\nint netlink_oaf_init(void)\n{\n\tstruct netlink_kernel_cfg nl_cfg = {0};\n\tnl_cfg.input = oaf_msg_rcv;\n\toaf_sock = netlink_kernel_create(&init_net, OAF_NETLINK_ID, &nl_cfg);\n\n\tif (NULL == oaf_sock)\n\t{\n\t\tAF_ERROR(\"init oaf netlink failed, id=%d\\n\", OAF_NETLINK_ID);\n\t\treturn -1;\n\t}\n\tAF_INFO(\"init oaf netlink ok, id = %d\\n\", OAF_NETLINK_ID);\n\treturn 0;\n}\n\nstatic int __init app_filter_init(void)\n{\n\tint err;\n\taf_conn_init();\n\tnetlink_oaf_init();\n\taf_log_init();\n\taf_register_dev();\n\taf_mac_list_init();\n\taf_whitelist_mac_init();\n\n\taf_init_app_status();\n\tinit_af_client_procfs();\n\taf_client_init();\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)\n\terr = nf_register_net_hooks(&init_net, app_filter_ops, ARRAY_SIZE(app_filter_ops));\n#else\n\terr = nf_register_hooks(app_filter_ops, ARRAY_SIZE(app_filter_ops));\n#endif\n\tif (err)\n\t{\n\t\tAF_ERROR(\"oaf register filter hooks failed!\\n\");\n\t}\n\tinit_oaf_timer();\n\tprintk(\"oaf: Driver ver. %s - Copyright(c) 2019-2026, destan19(TT), <www.openappfilter.com>\\n\", AF_VERSION);\n\tprintk(\"oaf: init ok\\n\");\n\treturn 0;\n}\n\nstatic void app_filter_fini(void)\n{\n\tAF_INFO(\"app filter module exit\\n\");\n\tfini_oaf_timer();\n#if LINUX_VERSION_CODE >= KERNEL_VERSION(4, 3, 0)\n\tnf_unregister_net_hooks(&init_net, app_filter_ops, ARRAY_SIZE(app_filter_ops));\n#else\n\tnf_unregister_hooks(app_filter_ops, ARRAY_SIZE(app_filter_ops));\n#endif\n\tfinit_af_client_procfs();\n\taf_clean_feature_list();\n\taf_mac_list_flush();\n\taf_whitelist_mac_flush();\n\taf_unregister_dev();\n\taf_log_exit();\n\taf_client_exit();\n\tif (oaf_sock)\n\t\tnetlink_kernel_release(oaf_sock);\n\taf_conn_exit();\n\treturn;\n}\n\nmodule_init(app_filter_init);\nmodule_exit(app_filter_fini);\n\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/app_filter.h",
    "content": "#ifndef APP_FILTER_H\n#define APP_FILTER_H\n\n#define AF_VERSION \"5.3.3\"\n#define AF_FEATURE_CONFIG_FILE \"/tmp/feature.cfg\"\n\n#define MAX_DPI_PKT_NUM 64\n#define MIN_HTTP_DATA_LEN 16\n#define MAX_APP_NAME_LEN 64\n#define MAX_FEATURE_NUM_PER_APP 16 \n#define MIN_FEATURE_STR_LEN 8\n#define MAX_FEATURE_STR_LEN 128\n#define MAX_HOST_URL_LEN 128\n#define MAX_REQUEST_URL_LEN 128\n#define MAX_FEATURE_BITS 16\n#define MAX_POS_INFO_PER_FEATURE 16\n#define MAX_FEATURE_LINE_LEN 600\n#define MIN_FEATURE_LINE_LEN 16\n#define MAX_URL_MATCH_LEN 64\n#define MAX_BYPASS_DPI_PKT_LEN 600\n#define MAX_AF_MAC_HASH_SIZE 64\n\n#define HTTP_GET_METHOD_STR \"GET\"\n#define HTTP_POST_METHOD_STR \"POST\"\n#define HTTP_HEADER \"HTTP\"\n#define NIPQUAD(addr) \\\n\t((unsigned char *)&addr)[0], \\\n\t((unsigned char *)&addr)[1], \\\n\t((unsigned char *)&addr)[2], \\\n\t((unsigned char *)&addr)[3]\n#define NIPQUAD_FMT \"%u.%u.%u.%u\"\n#define MAC_ARRAY(a) (a)[0], (a)[1], (a)[2], (a)[3], (a)[4], (a)[5]\n#define MAC_FMT \"%02x:%02x:%02x:%02x:%02x:%02x\"\n\n#define AF_TRUE 1\n#define AF_FALSE 0\n\n#define AF_APP_TYPE(a) (a) / 1000\n#define AF_APP_ID(a) (a) % 1000\n#define MAC_ADDR_LEN      \t\t6\n\n#define HTTPS_URL_OFFSET\t\t9\n#define HTTPS_LEN_OFFSET\t\t7\n\n#define MAX_SEARCH_STR_LEN 32\n\nenum AF_FEATURE_PARAM_INDEX{\n\tAF_PROTO_PARAM_INDEX,\n\tAF_SRC_PORT_PARAM_INDEX,\n\tAF_DST_PORT_PARAM_INDEX,\n\tAF_HOST_URL_PARAM_INDEX,\n\tAF_REQUEST_URL_PARAM_INDEX,\n\tAF_DICT_PARAM_INDEX,\n\tAF_STR_PARAM_INDEX,\n\tAF_IGNORE_PARAM_INDEX,\n};\n\n\n#define OAF_NETLINK_ID 29\n#define MAX_OAF_NL_MSG_LEN 1024\n\nenum E_MSG_TYPE{\n\tAF_MSG_INIT,\n\tAF_MSG_ADD_FEATURE,\n\tAF_MSG_CLEAN_FEATURE,\n\tAF_MSG_MAX\n};\nenum AF_WORK_MODE {\n\tAF_MODE_GATEWAY,\n\tAF_MODE_BYPASS,\n\tAF_MODE_BRIDGE,\n};\n#define MAX_AF_MSG_DATA_LEN 800\ntypedef struct af_msg{\n\tint action;\n}af_msg_t;\n\nstruct af_msg_hdr{\n    int magic;\n    int len;\n};\n\nenum e_http_method{\n\tHTTP_METHOD_GET = 1,\n\tHTTP_METHOD_POST,\n};\ntypedef struct http_proto{\n\tint match;\n\tint method;\n\tchar *url_pos;\n\tint url_len;\n\tchar *host_pos;\n\tint host_len;\n\tchar *data_pos;\n\tint data_len;\n}http_proto_t;\n\ntypedef struct https_proto{\n\tint match;\n\tchar *url_pos;\n\tint url_len;\n}https_proto_t;\n\n\n\n\ntypedef struct af_pos_info{\n\tint pos;\n\tunsigned char value;\n}af_pos_info_t;\n\n#define MAX_PORT_RANGE_NUM 5\n\ntypedef struct range_value\n{\n\tint not ;\n\tint start;\n\tint end;\n} range_value_t;\n\ntypedef struct port_info\n{\n\tu_int8_t mode; // 0: match, 1: not match\n\tint num;\n\trange_value_t range_list[MAX_PORT_RANGE_NUM];\n} port_info_t;\n\ntypedef struct af_feature_node{\n\tstruct list_head  \t\thead;\n\tu_int32_t app_id;\n\tchar app_name[MAX_APP_NAME_LEN];\n\tchar feature[MAX_FEATURE_STR_LEN];\n\tu_int32_t proto;\n\tu_int32_t sport;\n\tu_int32_t dport;\n\tport_info_t dport_info;\n\tchar host_url[MAX_HOST_URL_LEN];\n\tchar request_url[MAX_REQUEST_URL_LEN];\n\tint pos_num;\n\tchar search_str[MAX_SEARCH_STR_LEN];\n\tint ignore;\n\taf_pos_info_t pos_info[MAX_POS_INFO_PER_FEATURE];\n}af_feature_node_t;\n\n\n\n\ntypedef struct flow_info{\n\tstruct nf_conn *ct;\n\tu_int32_t src; \n\tu_int32_t dst;\n\tstruct in6_addr *src6;\n\tstruct in6_addr *dst6;\n\tint l4_protocol;\n\tu_int16_t sport;\n\tu_int16_t dport;\n\tunsigned char *l4_data;\n\tint l4_len;\n\thttp_proto_t http;\n\thttps_proto_t https;\n\tu_int32_t app_id;\n\tu_int8_t app_name[MAX_APP_NAME_LEN];\n\tu_int8_t drop;\n\tu_int8_t ignore;\n\tu_int8_t dir;\n\tu_int16_t total_len;\n\tu_int8_t client_hello;\n\taf_feature_node_t *feature;\n}flow_info_t;\n\n\n\nint regexp_match(char *reg, char *text);\nint hash_mac(unsigned char *mac);\n\n#endif\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/cJSON.c",
    "content": "/*\n  Copyright (c) 2009 Dave Gamble\n\n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n\n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n*/\n\n// cJSON\n// JSON parser in C.\n\n#if 0\n#include <string.h>\n#include <stdio.h>\n#include <math.h>\n#include <stdlib.h>\n#include <float.h>\n#endif\n\n#include \"cJSON.h\"\n\n#include <linux/module.h>\n#include <linux/slab.h>\n\n#if 0\n#if defined(WINDOWS) || defined(__WIN32__) || defined(WIN32) || defined(_WIN32)\n#define strcasecmp stricmp\n#define strdup _strdup\n#endif\n#endif\n\n\n#if 0\nstatic void *(*cJSON_malloc)(size_t sz) = malloc;\nstatic void *(*cJSON_realloc)(void *ptr, size_t sz) = realloc;\nstatic void (*cJSON_free)(void *ptr) = free;\n#endif\n\nstatic void *cJSON_malloc(size_t sz) {\n\treturn kmalloc(sz, GFP_KERNEL);\n}\n\nstatic void *cJSON_realloc(void *ptr, size_t sz) \n{\n\treturn krealloc(ptr, sz, GFP_KERNEL);\n}\n\nstatic void cJSON_free(void *ptr) \n{\n\t kfree(ptr);\n}\n\nstatic char* cJSON_strdup(const char* str)\n{\n      size_t len;\n      char* copy;\n\n      len = strlen(str) + 1;\n      if (!(copy = (char*)cJSON_malloc(len))) return 0;\n      memcpy(copy,str,len);\n      return copy;\n}\n\n#if 0\nvoid cJSON_InitHooks(cJSON_Hooks* hooks)\n{\n    if (!hooks) { /* Reset hooks */\n        cJSON_malloc = malloc;\n        cJSON_realloc = realloc;\n        cJSON_free = free;\n        return;\n    }\n\n\tcJSON_malloc = (hooks->malloc_fn)?hooks->malloc_fn:malloc;\n\tcJSON_realloc= (hooks->realloc_fn)?hooks->realloc_fn:realloc;\n\tcJSON_free\t = (hooks->free_fn)?hooks->free_fn:free;\n}\n#endif\n\n// Internal constructor.\nstatic cJSON *cJSON_New_Item(void)\n{\n\tcJSON* node = (cJSON*)cJSON_malloc(sizeof(cJSON));\n\tif (node) memset(node,0,sizeof(cJSON));\n\treturn node;\n}\n\n// Delete a cJSON structure.\nvoid cJSON_Delete(cJSON *c)\n{\n\tcJSON *next;\n\twhile (c)\n\t{\n\t\tnext=c->next;\n\t\tif (c->child) cJSON_Delete(c->child);\n\t\tif (c->valuestring) cJSON_free(c->valuestring);\n\t\tif (c->string) cJSON_free(c->string);\n\t\tcJSON_free(c);\n\t\tc=next;\n\t}\n}\n\n\n/* Parse the input text to generate a number, and populate the result into item. */\nstatic const char *parse_number(cJSON *item,const char *num)\n{\n\tint n=0,sign=1;\n\n\tif (*num=='-') sign=-1,num++;\t/* Has sign? */\n\tif (*num=='0') num++;\t\t\t/* is zero */\n\tif (*num>='1' && *num<='9')\tdo\tn=(n*10)+(*num++ -'0');\twhile (*num>='0' && *num<='9');\t/* Number? */\n\titem->valueint=(int)n;\n\titem->type=cJSON_Number;\n\treturn num;\n}\n\n/* Render the number nicely from the given item into a string. */\nstatic char *print_number(cJSON *item)\n{\n\tchar *str;\n\tstr=(char*)cJSON_malloc(21);\n\tif (str)\n\t\tsprintf(str,\"%d\",item->valueint);\n\treturn str;\n}\n\n\n// Parse the input text into an unescaped cstring, and populate item.\nstatic const char firstByteMark[7] = { 0x00, 0x00, 0xC0, 0xE0, 0xF0, 0xF8, 0xFC };\nstatic const char *parse_string(cJSON *item,const char *str)\n{\n\tconst char *ptr=str+1;char *ptr2;char *out;int len=0;unsigned uc;\n\tif (*str!='\\\"') return 0;\t// not a string!\n\t\n\twhile (*ptr!='\\\"' && *ptr>31 && ++len) if (*ptr++ == '\\\\') ptr++;\t// Skip escaped quotes.\n\t\n\tout=(char*)cJSON_malloc(len+1);\t// This is how long we need for the string, roughly.\n\tif (!out) return 0;\n\t\n\tptr=str+1;ptr2=out;\n\twhile (*ptr!='\\\"' && *ptr>31)\n\t{\n\t\tif (*ptr!='\\\\') *ptr2++=*ptr++;\n\t\telse\n\t\t{\n\t\t\tptr++;\n\t\t\tswitch (*ptr)\n\t\t\t{\n\t\t\t\tcase 'b': *ptr2++='\\b';\tbreak;\n\t\t\t\tcase 'f': *ptr2++='\\f';\tbreak;\n\t\t\t\tcase 'n': *ptr2++='\\n';\tbreak;\n\t\t\t\tcase 'r': *ptr2++='\\r';\tbreak;\n\t\t\t\tcase 't': *ptr2++='\\t';\tbreak;\n\t\t\t\tcase 'u':\t // transcode utf16 to utf8. DOES NOT SUPPORT SURROGATE PAIRS CORRECTLY.\n\t\t\t\t\tsscanf(ptr+1,\"%4x\",&uc);\t// get the unicode char.\n\t\t\t\t\tlen=3;if (uc<0x80) len=1;else if (uc<0x800) len=2;ptr2+=len;\n\t\t\t\t\t\n\t\t\t\t\tswitch (len) {\n\t\t\t\t\t\tcase 3: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;\n\t\t\t\t\t\tcase 2: *--ptr2 =((uc | 0x80) & 0xBF); uc >>= 6;\n\t\t\t\t\t\tcase 1: *--ptr2 =(uc | firstByteMark[len]);\n\t\t\t\t\t}\n\t\t\t\t\tptr2+=len;ptr+=4;\n\t\t\t\t\tbreak;\n\t\t\t\tdefault:  *ptr2++=*ptr; break;\n\t\t\t}\n\t\t\tptr++;\n\t\t}\n\t}\n\t*ptr2=0;\n\tif (*ptr=='\\\"') ptr++;\n\titem->valuestring=out;\n\titem->type=cJSON_String;\n\treturn ptr;\n}\n\n// Render the cstring provided to an escaped version that can be printed.\nstatic char *print_string_ptr(const char *str)\n{\n\tconst char *ptr;char *ptr2,*out;int len=0;\n\t\n\tptr=str;while (*ptr && ++len) {if (*ptr<32 || *ptr=='\\\"' || *ptr=='\\\\') len++;ptr++;}\n\t\n\tout=(char*)cJSON_malloc(len+3);\n\tptr2=out;ptr=str;\n\t*ptr2++='\\\"';\n\twhile (*ptr)\n\t{\n\t\tif (*ptr>31 && *ptr!='\\\"' && *ptr!='\\\\') *ptr2++=*ptr++;\n\t\telse\n\t\t{\n\t\t\t*ptr2++='\\\\';\n\t\t\tswitch (*ptr++)\n\t\t\t{\n\t\t\t\tcase '\\\\':\t*ptr2++='\\\\';\tbreak;\n\t\t\t\tcase '\\\"':\t*ptr2++='\\\"';\tbreak;\n\t\t\t\tcase '\\b':\t*ptr2++='b';\tbreak;\n\t\t\t\tcase '\\f':\t*ptr2++='f';\tbreak;\n\t\t\t\tcase '\\n':\t*ptr2++='n';\tbreak;\n\t\t\t\tcase '\\r':\t*ptr2++='r';\tbreak;\n\t\t\t\tcase '\\t':\t*ptr2++='t';\tbreak;\n\t\t\t\tdefault: ptr2--;\tbreak;\t// eviscerate with prejudice.\n\t\t\t}\n\t\t}\n\t}\n\t*ptr2++='\\\"';*ptr2++=0;\n\treturn out;\n}\n// Invote print_string_ptr (which is useful) on an item.\nstatic char *print_string(cJSON *item)\t{return print_string_ptr(item->valuestring);}\n\n// Predeclare these prototypes.\nstatic const char *parse_value(cJSON *item,const char *value);\nstatic char *print_value(cJSON *item,int depth);\nstatic const char *parse_array(cJSON *item,const char *value);\nstatic char *print_array(cJSON *item,int depth);\nstatic const char *parse_object(cJSON *item,const char *value);\nstatic char *print_object(cJSON *item,int depth);\n\n// Utility to jump whitespace and cr/lf\nstatic const char *skip(const char *in) {while (in && *in<=32) in++; return in;}\n\n// Parse an object - create a new root, and populate.\ncJSON *cJSON_Parse(const char *value)\n{\n\tcJSON *c=cJSON_New_Item();\n\tif (!c) return 0;       /* memory fail */\n\n\tif (!parse_value(c,skip(value))) {cJSON_Delete(c);return 0;}\n\treturn c;\n}\n\n// Render a cJSON item/entity/structure to text.\nchar *cJSON_Print(cJSON *item)\t\t\t{return print_value(item,0);}\n\n// Parser core - when encountering text, process appropriately.\nstatic const char *parse_value(cJSON *item,const char *value)\n{\n\tif (!value)\t\t\t\t\t\treturn 0;\t// Fail on null.\n\tif (!strncmp(value,\"null\",4))\t{ item->type=cJSON_NULL;  return value+4; }\n\tif (!strncmp(value,\"false\",5))\t{ item->type=cJSON_False; return value+5; }\n\tif (!strncmp(value,\"true\",4))\t{ item->type=cJSON_True; item->valueint=1;\treturn value+4; }\n\tif (*value=='\\\"')\t\t\t\t{ return parse_string(item,value); }\n\tif (*value=='-' || (*value>='0' && *value<='9'))\t{ return parse_number(item,value); }\n\tif (*value=='[')\t\t\t\t{ return parse_array(item,value); }\n\tif (*value=='{')\t\t\t\t{ return parse_object(item,value); }\n\n\treturn 0;\t// failure.\n}\n\n// Render a value to text.\nstatic char *print_value(cJSON *item,int depth)\n{\n\tchar *out=0;\n\tswitch (item->type)\n\t{\n\t\tcase cJSON_NULL:\tout=cJSON_strdup(\"null\");\tbreak;\n\t\tcase cJSON_False:\tout=cJSON_strdup(\"false\");break;\n\t\tcase cJSON_True:\tout=cJSON_strdup(\"true\"); break;\n\t\tcase cJSON_Number:\tout=print_number(item);break;\n\t\tcase cJSON_String:\tout=print_string(item);break;\n\t\tcase cJSON_Array:\tout=print_array(item,depth);break;\n\t\tcase cJSON_Object:\tout=print_object(item,depth);break;\n\t}\n\treturn out;\n}\n\n// Build an array from input text.\nstatic const char *parse_array(cJSON *item,const char *value)\n{\n\tcJSON *child;\n\tif (*value!='[')\treturn 0;\t// not an array!\n\n\titem->type=cJSON_Array;\n\tvalue=skip(value+1);\n\tif (*value==']') return value+1;\t// empty array.\n\n\titem->child=child=cJSON_New_Item();\n\tif (!item->child) return 0;\t\t // memory fail\n\tvalue=skip(parse_value(child,skip(value)));\t// skip any spacing, get the value.\n\tif (!value) return 0;\n\n\twhile (*value==',')\n\t{\n\t\tcJSON *new_item;\n\t\tif (!(new_item=cJSON_New_Item())) return 0; \t// memory fail\n\t\tchild->next=new_item;new_item->prev=child;child=new_item;\n\t\tvalue=skip(parse_value(child,skip(value+1)));\n\t\tif (!value) return 0;\t// memory fail\n\t}\n\n\tif (*value==']') return value+1;\t// end of array\n\treturn 0;\t// malformed.\n}\n\n// Render an array to text\nstatic char *print_array(cJSON *item,int depth)\n{\n\tchar *out,*ptr,*ret;int len=5;\n\tcJSON *child=item->child;\n\t\n\tout=(char*)cJSON_malloc(len);*out='[';\n\tptr=out+1;*ptr=0;\n\twhile (child)\n\t{\n\t\tret=print_value(child,depth+1);\n\t\tif (!ret) {cJSON_free(out);return 0;}\t// Check for failure!\n\t\tlen+=strlen(ret)+3;\n\t\tout=(char*)cJSON_realloc(out,len);\n\t\tptr=out+strlen(out);\n\t\tptr+=sprintf(ptr,ret);\n\t\tif (child->next) {*ptr++=',';*ptr++=' ';*ptr=0;}\n\t\tchild=child->next;\n\t\tcJSON_free(ret);\n\t}\n\t*ptr++=']';*ptr++=0;\n\treturn out;\t\n}\n\n// Build an object from the text.\nstatic const char *parse_object(cJSON *item,const char *value)\n{\n\tcJSON *child;\n\tif (*value!='{')\treturn 0;\t// not an object!\n\t\n\titem->type=cJSON_Object;\n\tvalue=skip(value+1);\n\tif (*value=='}') return value+1;\t// empty array.\n\t\n\titem->child=child=cJSON_New_Item();\n\tvalue=skip(parse_string(child,skip(value)));\n\tif (!value) return 0;\n\tchild->string=child->valuestring;child->valuestring=0;\n\tif (*value!=':') return 0;\t// fail!\n\tvalue=skip(parse_value(child,skip(value+1)));\t// skip any spacing, get the value.\n\tif (!value) return 0;\n\t\n\twhile (*value==',')\n\t{\n\t\tcJSON *new_item;\n\t\tif (!(new_item=cJSON_New_Item()))\treturn 0; // memory fail\n\t\tchild->next=new_item;new_item->prev=child;child=new_item;\n\t\tvalue=skip(parse_string(child,skip(value+1)));\n\t\tif (!value) return 0;\n\t\tchild->string=child->valuestring;child->valuestring=0;\n\t\tif (*value!=':') return 0;\t// fail!\n\t\tvalue=skip(parse_value(child,skip(value+1)));\t// skip any spacing, get the value.\t\t\n\t\tif (!value) return 0;\n\t}\n\t\n\tif (*value=='}') return value+1;\t// end of array\n\treturn 0;\t// malformed.\t\n}\n\n// Render an object to text.\nstatic char *print_object(cJSON *item,int depth)\n{\n\tchar *out,*ptr,*ret,*str;int len=7,i;\n\tcJSON *child=item->child;\n\t\n\tdepth++;len+=depth;out=(char*)cJSON_malloc(len);*out='{';\n\tptr=out+1;*ptr++='\\n';*ptr=0;\n\twhile (child)\n\t{\n\t\tstr=print_string_ptr(child->string);\n\t\tif (!str) {cJSON_free(out);return 0;}\n\t\tret=print_value(child,depth);\n\t\tif (!ret) {cJSON_free(str);cJSON_free(out);return 0;}\t// Check for failure!\n\t\tlen+=strlen(ret)+strlen(str)+4+depth;\n\t\tout=(char*)cJSON_realloc(out,len);\n\t\tptr=out+strlen(out);\n\t\tfor (i=0;i<depth;i++) *ptr++='\\t';\n\t\tptr+=sprintf(ptr,str);\n\t\t*ptr++=':';*ptr++='\\t';\n\t\tptr+=sprintf(ptr,ret);\n\t\tif (child->next) *ptr++=',';\n\t\t*ptr++='\\n';*ptr=0;\n\t\tchild=child->next;\n\t\tcJSON_free(str);cJSON_free(ret);\n\t}\n\tfor (i=0;i<depth-1;i++) *ptr++='\\t';\n\t*ptr++='}';*ptr++=0;\n\treturn out;\t\n}\n#define static_strlen(string_literal) (sizeof(string_literal) - sizeof(\"\"))\n\nstatic void skip_oneline_comment(char **input)\n{\n    *input += static_strlen(\"//\");\n\n    for (; (*input)[0] != '\\0'; ++(*input))\n    {\n        if ((*input)[0] == '\\n') {\n            *input += static_strlen(\"\\n\");\n            return;\n        }\n    }\n}\nstatic void skip_multiline_comment(char **input)\n{\n    *input += static_strlen(\"/*\");\n\n    for (; (*input)[0] != '\\0'; ++(*input))\n    {\n        if (((*input)[0] == '*') && ((*input)[1] == '/'))\n        {\n            *input += static_strlen(\"*/\");\n            return;\n        }\n    }\n}\nstatic void minify_string(char **input, char **output) {\n    (*output)[0] = (*input)[0];\n    *input += static_strlen(\"\\\"\");\n    *output += static_strlen(\"\\\"\");\n\n\n    for (; (*input)[0] != '\\0'; (void)++(*input), ++(*output)) {\n        (*output)[0] = (*input)[0];\n\n        if ((*input)[0] == '\\\"') {\n            (*output)[0] = '\\\"';\n            *input += static_strlen(\"\\\"\");\n            *output += static_strlen(\"\\\"\");\n            return;\n        } else if (((*input)[0] == '\\\\') && ((*input)[1] == '\\\"')) {\n            (*output)[1] = (*input)[1];\n            *input += static_strlen(\"\\\"\");\n            *output += static_strlen(\"\\\"\");\n        }\n    }\n}\n\nvoid cJSON_Minify(char *json)\n{\n    char *into = json;\n\n    if (json == NULL)\n    {\n        return;\n    }\n\n    while (json[0] != '\\0')\n    {\n        switch (json[0])\n        {\n            case ' ':\n            case '\\t':\n            case '\\r':\n            case '\\n':\n                json++;\n                break;\n\n            case '/':\n                if (json[1] == '/')\n                {\n                    skip_oneline_comment(&json);\n                }\n                else if (json[1] == '*')\n                {\n                    skip_multiline_comment(&json);\n                } else {\n                    json++;\n                }\n                break;\n\n            case '\\\"':\n                minify_string(&json, (char**)&into);\n                break;\n\n            default:\n                into[0] = json[0];\n                json++;\n                into++;\n        }\n    }\n\n    /* and null-terminate. */\n    *into = '\\0';\n}\n\n// Get Array size/item / object item.\nint    cJSON_GetArraySize(cJSON *array)\t\t\t\t\t\t\t{cJSON *c=array->child;int i=0;while(c)i++,c=c->next;return i;}\ncJSON *cJSON_GetArrayItem(cJSON *array,int item)\t\t\t\t{cJSON *c=array->child;  while (c && item) item--,c=c->next; return c;}\ncJSON *cJSON_GetObjectItem(cJSON *object,const char *string)\t{cJSON *c=object->child; while (c && strcasecmp(c->string,string)) c=c->next; return c;}\n\n// Utility for array list handling.\nstatic void suffix_object(cJSON *prev,cJSON *item) {prev->next=item;item->prev=prev;}\n\n// Add item to array/object.\nvoid   cJSON_AddItemToArray(cJSON *array, cJSON *item)\t\t\t\t\t\t{cJSON *c=array->child;if (!c) {array->child=item;} else {while (c && c->next) c=c->next; suffix_object(c,item);}}\nvoid   cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item)\t{if (item->string) cJSON_free(item->string);item->string=cJSON_strdup(string);cJSON_AddItemToArray(object,item);}\n\n// Create basic types:\ncJSON *cJSON_CreateNull()\t\t\t\t\t\t{cJSON *item=cJSON_New_Item();item->type=cJSON_NULL;return item;}\ncJSON *cJSON_CreateTrue()\t\t\t\t\t\t{cJSON *item=cJSON_New_Item();item->type=cJSON_True;return item;}\ncJSON *cJSON_CreateFalse()\t\t\t\t\t\t{cJSON *item=cJSON_New_Item();item->type=cJSON_False;return item;}\ncJSON *cJSON_CreateNumber(int num)\t\t\t{cJSON *item=cJSON_New_Item();item->type=cJSON_Number;item->valueint=(int)num;return item;}\ncJSON *cJSON_CreateString(const char *string)\t{cJSON *item=cJSON_New_Item();item->type=cJSON_String;item->valuestring=cJSON_strdup(string);return item;}\ncJSON *cJSON_CreateArray()\t\t\t\t\t\t{cJSON *item=cJSON_New_Item();item->type=cJSON_Array;return item;}\ncJSON *cJSON_CreateObject()\t\t\t\t\t\t{cJSON *item=cJSON_New_Item();item->type=cJSON_Object;return item;}\n\n// Create Arrays:\ncJSON *cJSON_CreateIntArray(int *numbers,int count)\t\t\t\t{int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;i<count;i++){n=cJSON_CreateNumber(numbers[i]);if(!i)a->child=n;else suffix_object(p,n);p=n;}return a;}\ncJSON *cJSON_CreateStringArray(const char **strings,int count)\t{int i;cJSON *n=0,*p=0,*a=cJSON_CreateArray();for(i=0;i<count;i++){n=cJSON_CreateString(strings[i]);if(!i)a->child=n;else suffix_object(p,n);p=n;}return a;}\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/cJSON.h",
    "content": "/*\n  Copyright (c) 2009 Dave Gamble\n \n  Permission is hereby granted, free of charge, to any person obtaining a copy\n  of this software and associated documentation files (the \"Software\"), to deal\n  in the Software without restriction, including without limitation the rights\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n  copies of the Software, and to permit persons to whom the Software is\n  furnished to do so, subject to the following conditions:\n \n  The above copyright notice and this permission notice shall be included in\n  all copies or substantial portions of the Software.\n \n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\n  THE SOFTWARE.\n*/\n\n#ifndef cJSON__h\n#define cJSON__h\n#include <linux/slab.h>\n\n// cJSON Types:\n#define cJSON_False 0\n#define cJSON_True 1\n#define cJSON_NULL 2\n#define cJSON_Number 3\n#define cJSON_String 4\n#define cJSON_Array 5\n#define cJSON_Object 6\n\n// The cJSON structure:\ntypedef struct cJSON {\n\tstruct cJSON *next,*prev;\t// next/prev allow you to walk array/object chains. Alternatively, use GetArraySize/GetArrayItem/GetObjectItem\n\tstruct cJSON *child;\t\t// An array or object item will have a child pointer pointing to a chain of the items in the array/object.\n\n\tint type;\t\t\t\t\t// The type of the item, as above.\n\n\tchar *valuestring;\t\t\t// The item's string, if type==cJSON_String\n\tint valueint;\t\t\t\t// The item's number, if type==cJSON_Number\n\tchar *string;\t\t\t\t// The item's name string, if this item is the child of, or is in the list of subitems of an object.\n} cJSON;\n\ntypedef struct cJSON_Hooks {\n      void *(*malloc_fn)(size_t sz);\n      void *(*realloc_fn)(void *ptr, size_t sz);\n      void (*free_fn)(void *ptr);\n} cJSON_Hooks;\n\n// Supply malloc, realloc and free functions to cJSON\nextern void cJSON_InitHooks(cJSON_Hooks* hooks);\n\n\n// Supply a block of JSON, and this returns a cJSON object you can interrogate. Call cJSON_Delete when finished.\nextern cJSON *cJSON_Parse(const char *value);\n// Render a cJSON entity to text for transfer/storage. Free the char* when finished.\nextern char  *cJSON_Print(cJSON *item);\n// Delete a cJSON entity and all subentities.\nextern void   cJSON_Delete(cJSON *c);\n\n// Returns the number of items in an array (or object).\nextern int\t  cJSON_GetArraySize(cJSON *array);\n// Retrieve item number \"item\" from array \"array\". Returns NULL if unsuccessful.\nextern cJSON *cJSON_GetArrayItem(cJSON *array,int item);\n// Get item \"string\" from object. Case insensitive.\nextern cJSON *cJSON_GetObjectItem(cJSON *object,const char *string);\n\n// These calls create a cJSON item of the appropriate type.\nextern cJSON *cJSON_CreateNull(void);\nextern cJSON *cJSON_CreateTrue(void);\nextern cJSON *cJSON_CreateFalse(void);\nextern cJSON *cJSON_CreateNumber(int num);\nextern cJSON *cJSON_CreateString(const char *string);\nextern cJSON *cJSON_CreateArray(void);\nextern cJSON *cJSON_CreateObject(void);\nextern void cJSON_Minify(char *json);\n// These utilities create an Array of count items.\nextern cJSON *cJSON_CreateIntArray(int *numbers,int count);\n\n// Append item to the specified array/object.\nextern void   cJSON_AddItemToArray(cJSON *array, cJSON *item);\nextern void\t  cJSON_AddItemToObject(cJSON *object,const char *string,cJSON *item);\n\n#define cJSON_AddNullToObject(object,name)\tcJSON_AddItemToObject(object, name, cJSON_CreateNull())\n#define cJSON_AddTrueToObject(object,name)\tcJSON_AddItemToObject(object, name, cJSON_CreateTrue())\n#define cJSON_AddFalseToObject(object,name)\t\tcJSON_AddItemToObject(object, name, cJSON_CreateFalse())\n#define cJSON_AddNumberToObject(object,name,n)\tcJSON_AddItemToObject(object, name, cJSON_CreateNumber(n))\n#define cJSON_AddStringToObject(object,name,s)\tcJSON_AddItemToObject(object, name, cJSON_CreateString(s))\n\n#endif\n"
  },
  {
    "path": "relevance/OpenAppFilter/oaf/src/regexp.c",
    "content": "#include <linux/init.h>\n#include <linux/module.h>\n#include <linux/types.h>\n#include <linux/mm.h>\n#include <linux/slab.h>\n//#include \"regexp.h\"\n\ntypedef enum{CHAR, DOT, BEGIN, END, STAR, PLUS, QUES, LIST, TYPENUM}TYPE;\n\ntypedef struct RE{\n\tTYPE type;\n\tint ch;\n\tchar *ccl;\n\tint nccl;\n\tstruct RE *next;\n}RE;\n\nint match_longest = 0;\nchar *match_first = NULL;\n\n\nstatic void * getmem(size_t size)\n{\n\tvoid *tmp;\n\tif((tmp = kmalloc(size, GFP_ATOMIC))==NULL)\n\t{\n\t\tprintk(\"malloc failed\");\n\t\treturn NULL;\n\t}\n\treturn tmp;\n}\n\nstatic size_t creat_list(char *str, int start, int end)\n{\n\tsize_t cnt = end - start + 1;\n\tfor(; start <= end ;start++)\n\t\t*str++ = start;\n\treturn (cnt > 0)?cnt:0;\n}\n\nstatic int in_list(char ch, RE *regexp)\n{\n\tchar *str = regexp->ccl;\n\tif(regexp->type != LIST)\n\t\treturn 0;\n\tfor(; *str && ch != *str; str++)\n\t\t;\n\treturn (*str != '\\0') ^ regexp->nccl;\n}\n\nstatic void regexp_free(RE *regexp)\n{\n\tRE *tmp;\n\tfor(; regexp; regexp = tmp)\n\t{\n\t\ttmp = regexp->next;\n\t\tkfree(regexp);\n\t}\n}\n\nstatic RE* compile(char *regexp)\n{\n\tRE head, *tail, *tmp;\n\tchar *pstr;\n\tint err_flag = 0;\n\n\tfor(tail = &head; *regexp != '\\0' && err_flag == 0; regexp++)\n\t{\n\t\ttmp = getmem(sizeof(RE));\n\t\tswitch(*regexp){\n\t\t\tcase '\\\\':\n\t\t\t\tregexp++;\n\t\t\t\tif(*regexp == 'd')\n\t\t\t\t{\n\t\t\t\t\ttmp->type = LIST;\n\t\t\t\t\ttmp->nccl = 0;\n\t\t\t\t\ttmp->ccl = getmem(11);\n\t\t\t\t\tcreat_list(tmp->ccl, '0','9');\n\t\t\t\t\ttmp->ccl[11] = '\\0';\n\t\t\t\t}else if(*regexp == 'D')\n\t\t\t\t{\n\t\t\t\t\ttmp->type = LIST;\n\t\t\t\t\ttmp->nccl = 1;\n\t\t\t\t\ttmp->ccl = getmem(11);\n\t\t\t\t\tcreat_list(tmp->ccl, '0','9');\n\t\t\t\t\ttmp->ccl[11] = '\\0';\n\t\t\t\t}else\n\t\t\t\t{\n\t\t\t\t\ttmp->type = CHAR;\n\t\t\t\t\ttmp->ch = *regexp;\n\t\t\t\t}\n\t\t\t\tbreak;\n\t\t\tcase '.':\n\t\t\t\ttmp->type = DOT;\n\t\t\t\tbreak;\n\t\t\tcase '^':\n\t\t\t\ttmp->type = BEGIN;\n\t\t\t\ttmp->ch = '^';\n\t\t\t\tbreak;\n\t\t\tcase '$':\n\t\t\t\ttmp->type = END;\n\t\t\t\ttmp->ch = '$';\n\t\t\t\tbreak;\n\t\t\tcase '*':\n\t\t\t\ttmp->type = STAR;\n\t\t\t\tbreak;\n\t\t\tcase '+':\n\t\t\t\ttmp->type = PLUS;\n\t\t\t\tbreak;\n\t\t\tcase '?':\n\t\t\t\ttmp->type = QUES;\n\t\t\t\tbreak;\n\t\t\tcase '[':\n\t\t\t\tpstr = tmp->ccl = getmem(256);\n\t\t\t\ttmp->nccl = 0;\n\t\t\t\tif(*++regexp == '^')\n\t\t\t\t{\n\t\t\t\t\ttmp->nccl = 1;\n\t\t\t\t\tregexp++;\n\t\t\t\t}\n\t\t\t\twhile(*regexp != '\\0' && *regexp != ']')\n\t\t\t\t{\n\t\t\t\t\tif(*regexp != '-')\n\t\t\t\t\t{\n\t\t\t\t\t\t*pstr++ = *regexp++;\n\t\t\t\t\t\tcontinue;\n\t\t\t\t\t}\n\t\t\t\t\tif(pstr == tmp->ccl || *(regexp + 1) == ']')\n\t\t\t\t\t{\n\t\t\t\t\t\terr_flag = 1;\n\t\t\t\t\t\tbreak;\n\t\t\t\t\t}\n\t\t\t\t\tpstr += creat_list(pstr, *(regexp - 1) + 1, *(regexp + 1));\n\t\t\t\t\tregexp += 2;\n\t\t\t\t}\n\t\t\t\t*pstr = '\\0';\n\t\t\t\tif(*regexp == '\\0')\n\t\t\t\t\terr_flag = 1;\n\t\t\t\ttmp->type = LIST;\n\t\t\t\tbreak;\n\t\t\tdefault:\n\t\t\t\ttmp->type = CHAR;\n\t\t\t\ttmp->ch = *regexp;\n\t\t}\n\n\t\ttail->next = tmp;\n\t\ttail = tmp;\n\t}\n\n\ttail->next = NULL;\n\tif(err_flag)\n\t{\n\t\tregexp_free(head.next);\n\t\treturn NULL;\n\t}\n\treturn head.next;\n}\n\n#define MATCH_ONE(reg, text) \\\n   \t(reg->type == DOT || in_list(*text, reg) || *text == reg->ch)\n#define MATCH_ONE_P(reg, text) \\\n   \t(in_list(*text++, reg) || *(text - 1) == reg->ch || reg->type == DOT)\n\nstatic int matchhere(RE *regexp, char *text);\n\nstatic int matchstar(RE *cur, RE *regexp, char *text)\n{\n\tdo{\n\t\tif(matchhere(regexp, text))\n\t\t\treturn 1;\n\t}while(*text != '\\0' && MATCH_ONE_P(cur, text));\n\treturn 0;\n}\n\nstatic int matchstar_l(RE *cur, RE *regexp, char *text)\n{\n\tchar *t;\n\tfor(t = text; *t != '\\0' && MATCH_ONE(cur, t); t++)\n\t\t;\n\tdo{\n\t\tif(matchhere(regexp, t))\n\t\t\treturn 1;\n\t}while(t-- > text);\n\treturn 0;\n}\n\nstatic int matchplus(RE *cur, RE *regexp, char *text)\n{\n\twhile(*text != '\\0' && MATCH_ONE_P(cur, text))\n\t{\n\t\tif(matchhere(regexp, text))\n\t\t\treturn 1;\n\t}\n\treturn 0;\n}\n\nstatic int matchplus_l(RE *cur, RE *regexp, char *text)\n{\n\tchar *t;\n\tfor(t = text; *t != '\\0' && MATCH_ONE(cur, t); t++)\n\t\t;\n\tfor(; t > text; t--)\n\t{\n\t\tif(matchhere(regexp, t))\n\t\t\treturn 1;\n\t}\n\treturn 0;\n}\n\nstatic int matchques(RE *cur, RE *regexp, char *text)\n{\n\tint cnt = 1;\n\tchar *t = text;\n\tif(*t != '\\0' && cnt-- && MATCH_ONE(cur, t))\n\t\tt++;\n\tdo{\n\t\tif(matchhere(regexp, t))\n\t\t\treturn 1;\n\t}while(t-- > text);\n\treturn 0;\n}\n\nstatic int (*matchfun[TYPENUM][2])(RE *, RE *, char *) = {\n\t0, 0, 0, 0, 0, 0, 0, 0,\n\tmatchstar, matchstar_l,\n\tmatchplus, matchplus_l,\n\tmatchques, matchques,\n};\n\nstatic int matchhere(RE *regexp, char *text)\n{\n\tif(regexp == NULL)\n\t\treturn 1;\n\tif(regexp->type == END && regexp->next == NULL)\n\t\treturn *text == '\\0';\n\tif(regexp->next && matchfun[regexp->next->type][match_longest])\n\t\treturn matchfun[regexp->next->type][match_longest](regexp, regexp->next->next, text);\n\n\tif(*text != '\\0' && MATCH_ONE(regexp, text))\n\t\treturn matchhere(regexp->next, text + 1);\n\treturn 0;\n}\n\n/* \n * return value:\n *\t\t-1\t\terror\n *\t\t0\t\tnot match\n *\t\t1\t\tmatched\n */\nint regexp_match(char *reg, char *text)\n{\n\tint ret;\n\tRE *regexp = compile(reg);\n\tif(regexp == NULL)\n\t\treturn -1;\n\n\tif(regexp->type == BEGIN)\n\t{\n\t\tret = matchhere(regexp->next, text);\n\t\tgoto out;\n\t}\n\n\tdo{\n\t\tif(ret = matchhere(regexp, text))\n\t\t{\n\t\t\tgoto out;\n\t\t}\n\t}while(*text++ != '\\0');\n\nout:\n\tregexp_free(regexp);\n\treturn ret;\n}\n\n\nvoid TEST_reg_func(char *reg, char * str, int ret)\n{\n\t\n\tif (ret != regexp_match(reg, str)) {\n\t\tif (reg)\n\t\t\tprintk(\"reg = %s,\", reg);\n\t\telse\n\t\t\tprintk(\"reg = null\");\n\t\tif (str)\n\t\t\tprintk(\"str = %s \", str);\n\t\telse\n\t\t\tprintk(\"str= null\");\n\t\tprintk(\"error, unit test.... failed, ret = %d\\n\",ret);\n\t}\n\telse {\n\t\tif (reg && str)\n\t\t\tprintk(\"[unit test] %s %s......ok,ret = %d\\n\", reg, str, ret);\n\t}\n}\n\nvoid TEST_regexp(void)\n{\n\tTEST_reg_func(\".*baidu.com$\", \"www.baidu.com\", 1);\n\tTEST_reg_func(\"^sina.com\", \"www.sina.com.cn\", 0);\n\tTEST_reg_func(\"^sina.com\", \"sina.com.cn\", 1);\n\tTEST_reg_func(\".*baidu.com$\", \"www.baidu.com223\", 0);\n}\n"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/Makefile",
    "content": "\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=appfilter\nPKG_VERSION:=6.1.8\nPKG_RELEASE:=1\n\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)\ninclude $(INCLUDE_DIR)/package.mk\n\nTARGET_CFLAGS +=-Werror=implicit-function-declaration\ndefine Package/appfilter\n  SECTION:=TT Apps\n  CATEGORY:=TT Apps\n  DEPENDS:=+libubox +libubus +libuci +libpthread +libjson-c +libblobmsg-json\n  TITLE:=OAF client and config service\nendef\n\ndefine Build/Prepare\n\tmkdir -p $(PKG_BUILD_DIR)\n\tcp -rf ./src/* $(PKG_BUILD_DIR)\nendef\n\ndefine Build/Compile\n\t$(MAKE) -C $(PKG_BUILD_DIR)/ \\\n\tCC=\"$(TARGET_CROSS)gcc\" \\\n\tCFLAGS=\"$(TARGET_CFLAGS)\" \\\n\tLIBS=\"$(TARGET_LDFLAGS) -lm -lpthread -lubox -luci -lubus -ljson-c -lblobmsg_json\" \\\n\tall\nendef\t\n\n\ndefine Build/Compile/Default\n\nendef\n\ndefine Package/appfilter/description\n  openappfilter app\nendef\n\ndefine Package/appfilter/conffiles\n/etc/config/appfilter\n/etc/config/user_info\nendef\n\ndefine Package/appfilter/install\n\t$(INSTALL_DIR) $(1)/usr/bin $(1)/etc/init.d\n\t$(INSTALL_DIR) $(1)/etc/appfilter\n\t$(INSTALL_DIR) $(1)/etc/config\n\t$(CP) ./files/*.cfg $(1)/etc/appfilter/ \n\t$(INSTALL_BIN) ./files/appfilter.init $(1)/etc/init.d/appfilter\n\t$(INSTALL_BIN) ./files/oaf_rule $(1)/usr/bin\n\t$(INSTALL_BIN) ./files/gen_class.sh $(1)/usr/bin\n\t$(INSTALL_DATA) ./files/appfilter.config $(1)/etc/config/appfilter\n\t$(INSTALL_DATA) ./files/user_info.config $(1)/etc/config/user_info\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/oafd $(1)/usr/bin\n\t$(INSTALL_BIN) ./files/hnat.sh $(1)/usr/bin\nendef\n\n\n$(eval $(call BuildPackage,appfilter))\n\n"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/files/appfilter.config",
    "content": "config global global\n\toption enable '0'\n\toption work_mode '0'\n\toption record_enable '1'\n\toption disable_hnat '0'\n\toption tcp_rst '1'\n\toption lan_ifname 'br-lan'\n\toption auto_load_engine '1'\n\toption disable_quic '0'\n\t\nconfig appfilter appfilter\n\nconfig feature feature\n\toption update 0\n\toption format 'v3.0'\n\nconfig time 'time'\n\toption deny_time '60'\n\toption start_time '00:00'\n\toption end_time '23:59'\n\toption allow_time '20'\n\toption time_mode '0'\n\toption days '1 2 3 4 5 6 0'\n\tlist time '00:00-23:59'\n\toption daily_limit_0 '0:0:0'\n\toption daily_limit_1 '0:0:0'\n\toption daily_limit_2 '0:0:0'\n\toption daily_limit_3 '0:0:0'\n\toption daily_limit_4 '0:0:0'\n\toption daily_limit_5 '0:0:0'\n\toption daily_limit_6 '0:0:0'\n\nconfig user user\n\n\nconfig rule 'rule'"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/files/appfilter.init",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=96\nUSE_PROCD=1\nOAFD_BIN=\"/usr/bin/oafd\"\nFEATURE_FILE=\"/tmp/feature.cfg\"\n\nstop_service(){\n\tkillall -9 oafd\n}\n\nstart_service(){\n\ttest -f $FEATURE_FILE &&{\n\t\trm $FEATURE_FILE\n\t}\n\n\tif [ ! -f /etc/appfilter/feature.cfg ]; then\n\t\tcp /etc/appfilter/feature_cn.cfg /etc/appfilter/feature.cfg\n\tfi\n\thnat.sh 1\n\tln -s /etc/appfilter/feature.cfg $FEATURE_FILE\n\tprocd_open_instance\n\tprocd_set_param respawn 60 5 5\n\tprocd_set_param stderr 1\n\tprocd_set_param command \"$OAFD_BIN\"\n\tprocd_close_instance\n}\n"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/files/feature.cfg",
    "content": "#version v22.3.24\n#format v3.0\n#id name:[proto;sport;dport;host url;request;dict]\n#class chat 1 聊天\n1003 微博:[tcp;;;weibo;;] \n1004 陌陌:[tcp;;;momo;;,tcp;;;;;04:2f|05:66|06:65|07:65;;1,tcp;;;;;00:03|01:03|02:00;;1] \n1005 支付宝:[tcp;;;alipay.com;;,tcp;;;alipayobjects.com;;,tcp;;;alive.alipay.com;;,udp;;1100-1200;;;00:00|01:01|02:00,tcp;;80;;;00:50|01:52|02:49] \n1006 钉钉:[tcp;;;dingtalk;;,tcp;;;;d?host=;,tcp;;;;/man/api;] \n1007 Soul:[tcp;;;soulapp;;] \n1008 伊对:[tcp;;;520yidui;;] \n1009 探探:[tcp;;;tancdn;;,tcp;;;tantanapp;;] \n1010 多闪:[tcp;;;ppkankan;;]\n1012 Instagram:[tcp;;;instagram;;]  \n1013 Facebook:[tcp;;;facebook;;]  \n1014 WhatsApp:[tcp;;;whatsapp;;] \n\n#class game 2 游戏\n2001 王者荣耀:[tcp;;6000-9000;;;00:33|1:66|02:00|03:0a]\n2027 英雄联盟手游:[tcp;;10001;;;00:33|1:66|02:00|03:0b,tcp;;11001;;;00:33|1:66|02:00|03:0b] \n2005 欢乐斗地主:[tcp;;12000;;;00:43|01:66|02:aa|03:00,tcp;;;huanle.qq.com;;] \n2015 我的世界:[tcp;;443;g79mclobt.nie.netease;;,tcp;;443;x19.*.netease.com;;,tcp;;443;mc.*.netease;;]  \n2006 梦幻西游:[tcp;;;;;00:0e|01:00|02:fe|03:ff,tcp;;;g18.proxima.nie;;] \n2007 明日之后:[tcp;;12500-14000;;;00:02|01:00|02:00|03:00|04:00|05:00,tcp;;;g66.update.netease;;]  \n2008 QQ飞车:[udp;;;;;00:28|01:28,tcp;;10000;;;00:33|01:66|02:00|03:08]\n2009 跑跑卡丁车:[tcp;;8888;;;00:33|01:66|02:00|03:0b,tcp;;49150-49159;;wepop/;] \n2010 开心消消乐:[tcp;;80;happyelements;;]  \n2011 狂野飙车:[tcp;;;asphalt9;;] \n2012 率土之滨:[tcp;;10001;;;00:00|01:00,tcp;;8001;;;00:00|01:00]  \n2013 一刀传世:[tcp;;8040;;;00:47|01:45] \n2014 第五人格:[tcp;;;h55.proxima;;,tcp;;;h55.update;;]\n2016 皇室战争:[udp;;9339;;;] \n2017 炉石传说:[tcp;;3724;;;00:73:01:00:02:00]\n2023 原神:[tcp;;443;yuanshen.com;;] \n2025 天涯明月刀:[tcp;;10000;;;00:43|01:66|02:aa] \n2026 微信小游戏:[tcp;;443;mmgame;;,tcp;;443;game.weixin.qq;;] \n2033 我叫MT4:[tcp;;21248;;;,tcp;;;dir.mt4.qq.com;;] \n2034 神都夜行录:[udp;;;;;00:00|01:00|02:00|03:00|04:56|05:40] \n2041 光遇:[udp;;10000-15000;;;00:8f|01:ff,tcp;;;ma75.update.netease.com;;,tcp;;;ma75.proxima.nie.netease;;] \n2042 保卫萝卜4:[tcp;;;s4.luobo.cn;;] \n2040 哈利波特:[tcp;;10021-12000;;;00:02|01:00|02:00|03:00|04:00|05:00,tcp;;443;g92.proxima;;] \n2067 9377游戏:[tcp;;;www.9377.com;;] \n2068 4399游戏:[tcp;;;4399.com;;] \n2069 7k7k游戏:[tcp;;;7k7k.com;;] \n2070 17173游戏:[tcp;;;17173.com;;] \n2071 37网游:[tcp;;;37.com;;] \n2074 hao123游戏:[tcp;;;game.hao123.com;;] \n2075 51游戏:[tcp;;;www.51.com;;] \n2050 uu加速器:[tcp;;;mg.uu.163.com;;] \n2051 腾讯加速器:[tcp;;;m.acc.qq.com;;] \n2080 乐逗游戏:[tcp;;;.uu.cc;;] \n\n#class video 3 视频\n3001 抖音:[tcp;;;-dy-;;,tcp;;;-dy.;;,tcp;;;douyin;;,tcp;;;amemv.com;;,tcp;;;pstatp.com;;,tcp;;;volcsirius.com;;,tcp;;80;;^/pull.*.douyincdn.com;,tcp;;;ecombdapi.com;;,udp;;443;;;09:51|10:30|11:34;amemv.com;0,udp;;16000;;;00:00|01:01,udp;;1000-2000;;;00:00|01:01] \n3049 Youtube:[tcp;;;youtube;;] \n3006 斗鱼:[tcp;;;douyu;;,tcp;;;douyu;;-2:2f|-1:00] \n3004 爱奇艺:[tcp;;;iqiyi;;,tcp;;;qy.net;;,tcp;;;inter.71edge.com;;,tcp;;;;^/videos;,tcp;;80;;;00:51|01:48|02:54,tcp;;80;;;09:00|10:00|11:00]\n3043 Netflix:[tcp;;;netflix.com;;]\n3008 虎牙直播:[tcp;;;huya;;,udp;;;;;01:00|02:00|03:00|04:23,udp;;;;;01:00|02:00|03:00|04:24] \n3010 小红书:[tcp;;;xiaohongshu;;,tcp;;;xhscdn;;] \n3011 花椒直播:[tcp;;;huajiao;;]  \n3012 映客直播:[tcp;;;;.inke.cn;]  \n3016 芒果tv:[tcp;;443;mgtv;;,tcp;;80;mgtv;;,tcp;;443;hitv;;]  \n3017 西瓜视频:[tcp;;;ixigua;;,tcp;;443;snsdk;;,tcp;;;xg-p.ixigua;;,tcp;;;bdxigua;;]  \n3018 搜狐视频:[tcp;;;aty.sohu.com;;,tcp;;;tv.itc.cn;;]  \n3020 咪咕视频:[tcp;;;miguvideo;;,tcp;;;migu.cn;;]  \n3022 人人视频:[tcp;;;rr.tv;;]  \n3023 央视影音:[tcp;;;cntv;;]  \n3024 优酷&酷喵:[tcp;;;youku;;,tcp;;;ykimg;;,tcp;;;;/youku;,tcp;;;galitv.alicdn.com;;,tcp;;;cibntv.;;,tcp;;;miaozhen.com;;;;1]\n3025 最右:[tcp;;;izuiyou;;]  \n3026 风行视频:[tcp;;;funshion;;]  \n3019 播聊:[tcp;;80;randlove.cn;;,tcp;;;yueliao;;,tcp;;;5glive;;]  \n3021 韩剧TV:[tcp;;;hanju.koudaibaobao;;]  \n3027 企鹅电竞:[tcp;;;egame.qq;;,tcp;;;liveplay;;,tcp;;;;pggame;]  \n3028 波波视频:[tcp;;;miaopai;;]  \n3029 酷狗短酷:[tcp;;;bssdl.kugou;;]  \n3030 酷狗直播:[tcp;;;rt-m.kugou;;,tcp;;;kgimg.com;;]\n3023 央视影音:[tcp;;;cntv;;]\n3026 风行视频:[tcp;;;funshion;;] \n3089 华数TV:[tcp;;;wasu.cn;;] \n3121 梨视频:[tcp;;;pearvideo.com;;]  \n3094 南瓜电影:[tcp;;;vcinema.cn;;] \n3084 六间房:[tcp;;;v.6.cn;;] \n3085 百度直播:[tcp;;;live.baidu.com;;] \n3086 度小视:[tcp;;;quanmin.baidu.com;;]\n\n#class shopping 4 购物\n4001 淘宝:[tcp;;;taobao;;,tcp;;;alicdn.com;;,tcp;;;tmall.com;;,tcp;;443;;;00:d1|01:00,tcp;;443;;;00:d2|01:00,tcp;;443;;;00:d3|01:00,tcp;;443;;;00:d4|01:00,tcp;;443;;;00:d5|01:00,tcp;;443;;;00:b1|01:00,tcp;;443;;;00:b2|01:00,tcp;;443;;;00:b3|01:00,tcp;;443;;;00:b4|01:00,tcp;;443;;;00:b5|01:00,udp;;1000-1200;;;00:82|01:cc,tcp;;;;/mediaplatform;] \n4002 京东:[tcp;;;360buyimg;;,tcp;;;jd.com;;,tcp;;;jdcdn.com;;,tcp;;;vod.300hu.com;;] \n4003 唯品会:[tcp;;;vips-mobile;;,tcp;;;vipshop;;,tcp;;;vip.com;;,tcp;;;vipstatic.com;;,tcp;;;appsimg.com;;]  \n4004 拼多多:[tcp;;;pinduoduo;;,tcp;;;yangkeduo.com;;,tcp;;;s1p.cdntip.com;;]  \n4010 饿了么:[tcp;;;eleme;;]  \n4012 闲鱼:[tcp;;;xianyu;;]  \n4021 转转:[tcp;;;zhuanzhuan;;,tcp;;;zhuanstatic;;]  \n4005 蘑菇街:[tcp;;;mogujie;;,tcp;;;mogucdn;;,tcp;;;;;00:73|01:ea|02:68|03:fb|04:3f]  \n4006 苏宁易购:[tcp;;;.suning.;;]  \n4007 当当网:[tcp;;;.dangdang.com;;]  \n4008 1号店:[tcp;;;.yhd.com;;]  \n4009 朴朴超市:[tcp;;;pupumall;;,tcp;;;pupuapi;;]  \n4013 叮咚买菜:[tcp;;;ddxq.mobi;;]  \n4014 小米有品:[tcp;;;youpin;;,tcp;;;shopapi.io.mi.com;;]  \n4015 微店:[tcp;;;weidian;;]  \n4016 折800:[tcp;;;zhe800.com;;]  \n4018 好省:[tcp;;;hzhstb.com;;]  \n4019 什么值得买:[tcp;;;smzdm.com;;]  \n4022 网易严选:[tcp;;;yanxuan;;]  \n4023 识货:[tcp;;;shihuo;;]  \n4024 考拉海购:[tcp;;;kaola;;]  \n4025 宜家家居:[tcp;;;ikea.cn;;]  \n4026 小象优品:[tcp;;;xiaoxiangyoupin;;]  \n4040 国美:[tcp;;;gome.com;;] \n4041 酒仙网:[tcp;;;jiuxian.com;;] \n4052 1688:[tcp;;;1688.com;;] \n4053 亚马逊:[tcp;;;amazon.cn;;] \n4054 Lazada:[tcp;;;lazada.com;;] \n\n#class music 5 音乐\n5001 网易云音乐:[tcp;;;music.163;;,tcp;;;music.126;;]\n5002 QQ音乐:[tcp;;;;^/amobile.music.tc.qq.com;,tcp;;;qqmusic;;]\n5003 酷狗音乐:[tcp;;;kugou;;,tcp;;;kgimg;;,tcp;;;fanxing;;]\n5004 酷我音乐:[tcp;;;.kuwo.cn;;]\n5005 喜马拉雅:[tcp;;;.ximalaya.com;;]\n5006 千千音乐:[tcp;;;music.taihe.com;;]\n5007 虾米音乐:[tcp;;;xiami;;]\n5008 音悦台:[tcp;;;yinyuetai.com;;]\n5009 豆瓣FM:[tcp;;;douban.fm;;]\n5010 唱吧:[tcp;;;changba.com;;]\n5011 音乐随心听:[tcp;;;fm.taihe.com;;]\n5012 懒人听书:[tcp;;;lrts.me;;]\n\n#class employee 6 招聘\n6001 前程无忧:[tcp;;;51job;;]\n6002 智联招聘:[tcp;;;zhaopin;;]\n6003 猎聘:[tcp;;;liepin;;]\n6004 赶集网:[tcp;;;58.com;;,tcp;;;58cdn;;]\n6005 同城急聘:[tcp;;;xiaomei;;]\n6006 领英:[tcp;;;linkedin;;]\n6007 斗米:[tcp;;;doumi;;]\n6008 看准:[tcp;;;kanzhun.com;;]\n6009 应届生求职:[tcp;;;yingjiesheng.com;;]\n6010 中华英才网:[tcp;;;chinahr.com;;]\n6011 拉勾网:[tcp;;;lagou.com;;]\n6012 大街网:[tcp;;;dajie.com;;]\n6013 boss直聘:[tcp;;;zhipin.com;;]\n6014 实习僧:[tcp;;;shixiseng.com;;]\n\n#class download 7 下载\n7002 AppStore:[tcp;;;itunes.apple.com;;]\n7004 ftp文件传输:[tcp;;21;;;]\n7005 vivo应用商店:[tcp;;443;appstore.vivo;;,tcp;;443;apkappdefwsdl.vivo;;]\n7006 王者荣耀更新:[tcp;;80;;/sgame/;]   \n7007 天翼云盘:[tcp;;;ctyunapi;;]   \n7008 腾讯微云:[tcp;;;weiyun.com;;,tcp;;;aegis.qq.com;;,tcp;;;pingtas.qq.com;;,tcp;;443;;;00:77|01:6e|02:73]  \n7009 坚果云:[tcp;;;jianguoyun;;]   \n7010 蓝奏云:[tcp;;;pan.lanzou.com;;]   \n7011 华为云:[tcp;;;cloud.huawei.com;;,tcp;;;hicloud.com;;,tcp;;;myhuaweicloud.cn;;]  \n7020 windows更新:[tcp;;80;update.microsoft.com;;,tcp;;;windowsupdate.com;;]   \n7030 向日葵:[tcp;;;oray.com;;,tcp;;;oray.net;;]  \n7031 TeamViewer:[tcp;;;teamviewer;;]  \n7032 阿里云盘:[tcp;;;aliyundrive;;]  \n\n\n#class website 8 常用网站\n8079 Google:[tcp;;;google.com;;] \n8001 百度:[tcp;;;www.baidu.com;;,tcp;;;m.baidu.com;;] \n8112 Apple:[tcp;;;www.apple.com;;,tcp;;;m.apple.com;;] \n8002 新浪:[tcp;;;www.sina.com;;,tcp;;;m.sina.com;;] \n8003 搜狐:[tcp;;;www.sohu.com;;,tcp;;;m.sohu.com;;] \n8004 网易:[tcp;;;www.163.com;;,tcp;;443;www.126.com;;] \n8005 凤凰网:[tcp;;;ifeng.com;;] \n8009 hao123:[tcp;;;www.hao123.com;;,tcp;;;m.hao123.com;;] \n8010 2345:[tcp;;;www.2345.com;;,tcp;;;m.2345.com;;] \n8006 人民网:[tcp;;;people.com.cn;;] \n8008 中华网:[tcp;;;www.china.com;;] \n8020 天涯社区:[tcp;;;tianya.cn;;] \n8026 穷游网:[tcp;;;qyer.com;;] \n8027 驴妈妈:[tcp;;;lvmama.com;;] \n8029 太平洋汽车:[tcp;;;pcauto.com.cn;;] \n8030 易车网:[tcp;;;bitauto.com;;] \n8031 爱卡汽车:[tcp;;;xcar.com.cn;;] \n8035 和讯:[tcp;;;hexun.com;;] \n8036 第一财经:[tcp;;;yicai.com;;] \n8037 全景网:[tcp;;;p5w.net;;] \n8038 中彩网:[tcp;;;zhcw.com;;] \n8039 体育彩票:[tcp;;;lottery.gov.cn;;] \n8041 豆丁:[tcp;;;docin.com;;] \n8044 缤客:[tcp;;;booking.com;;] \n8046 猫扑:[tcp;;;mop.com;;] \n8064 潇湘书院:[tcp;;;xxsy.net;;] \n8065 cctv5:[tcp;;;sports.cctv.com;;] \n8066 虎扑体育:[tcp;;;hupu.com;;] \n8077 知网:[tcp;;;www.cnki.net;;] \n8087 github:[tcp;;;github.com;;] \n8089 gitee:[tcp;;;gitee.com;;] \n8090 必应:[tcp;;;bing.com;;] \n8092 中国福利彩:[tcp;;;www.cwl.gov.cn;;] \n8093 新浪彩票:[tcp;;;lottery.sina.com.cn;;] \n8094 竞彩网:[tcp;;;www.sporttery.cn;;] \n8096 新浪体育:[tcp;;;sports.sina.com.cn;;] \n8098 小米官网:[tcp;;;www.mi.com;;] \n8099 BBC:[tcp;;;www.bbc.com;;]\n8100 腾讯智影:[tcp;;;zenvideo.qq.com;;]\n8103 IT之家:[tcp;;;www.ithome.com;;] \n8104 太平洋电脑:[tcp;;;www.pconline.com.cn;;] \n8105 中国移动:[tcp;;;www.10086.cn;;] \n8106 中国联通:[tcp;;;www.10010.com;;] \n8107 中国电信:[tcp;;;www.189.cn;;] \n8108 华为商城:[tcp;;;www.vmall.com;;] \n8110 vivo官网:[tcp;;;www.vivo.com.cn;;] \n8111 华为官网:[tcp;;;www.huawei.com;;] \n\n\n#class life 10 生活\n10003 京东钱包:[tcp;;;jdpay.com;;]\n10034 饿了么:[tcp;;;eleme.com;;]\n10035 美团:[tcp;;;meituan;;]\n10004 豆瓣:[tcp;;;douban.com;;]\n10005 知乎:[tcp;;;zhihu.com;;]\n10006 链家:[tcp;;;lianjia.com;;]\n10007 天眼查:[tcp;;;tianyancha.com;;]\n10008 有道词典:[tcp;;;dict.youdao.com;;]\n10010 萤石云:[tcp;;;ys7.com;;,udp;;;;;00:e2|01:62|02:0c,tcp;;11001;;;00:24|01:0a]\n10011 掌阅:[tcp;;;ireader.com;;,tcp;;;zhangyue;;]\n10012 安居客:[tcp;;;anjuke.com;;]\n10013 房天下:[tcp;;;fang.com;;]\n10014 58同城:[tcp;;;58.com;;]\n10015 动漫之家:[tcp;;;dmzj.com;;]\n10016 汽车之家:[tcp;;;autohome.com.cn;;]\n10017 飞猪:[tcp;;;fliggy.com;;]\n10018 12306:[tcp;;;12306.cn;;]\n10019 马蜂窝:[tcp;;;mafengwo.cn;;]\n10020 途牛:[tcp;;;tuniu.com;;]\n10021 小爱音箱:[tcp;;;ai.xiaomi.com;;,tcp;;;mina.mi.com;;]\n10022 搜狗拼音:[tcp;;;pinyin.sogou.com;;]:5:1\n\n\n#class finance 14 金融\n14001 建设银行:[tcp;;;ccb.com;;]\n14002 农业银行:[tcp;;;abchina.com;;]\n14003 中国银行:[tcp;;;boc.cn;;]\n14004 交通银行:[tcp;;;bankcomm.com;;]\n14005 招商银行:[tcp;;;cmbchina.com;;]\n14006 邮政储蓄:[tcp;;;psbc.com;;]\n14007 兴业银行:[tcp;;;cib.com.cn;;]\n14008 浦发银行:[tcp;;;spdb.com.cn;;]\n14009 中信银行:[tcp;;;citicbank.com;;]\n14010 上海银行:[tcp;;;bosc.cn;;]\n14011 平安银行:[tcp;;;pingan.com.cn;;]\n14012 人民银行:[tcp;;;pbc.gov.cn;;]\n14013 北京银行:[tcp;;;bankofbeijing;;]\n14014 银联在线:[tcp;;;95516.com;;]\n\n\n#class tools 11 工具\n11001 samba共享:[tcp;;445;;;]\n11002 ftp文件传输:[tcp;;21;;;]\n11003 SSH:[tcp;;;;;00:53|01:53|02:48]"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/files/feature_cn.cfg",
    "content": "#version v22.3.24\n#format v2.0\n#id name:[proto;sport;dport;host url;request;dict]\n#class chat 1 聊天\n1003 微博:[tcp;;443;weibo;;] \n1004 陌陌:[tcp;;;momo;;,tcp;;;;;04:2f|05:66|06:65|07:65,tcp;;;;;00:03|01:03|02:00]\n1005 支付宝:[tcp;;443;alipay.com;;] \n1006 钉钉:[tcp;;;dingtalk;;,tcp;;;;d?host=;,tcp;;;;/man/api;,tcp;;;;/beacon;]  \n1007 Soul:[tcp;;;soulapp;;] \n1008 伊对:[tcp;;;520yidui;;] \n1009 探探:[tcp;;;tancdn;;,tcp;;;tantanapp;;] \n1010 多闪:[tcp;;;ppkankan;;] \n\n#class game 2 游戏\n2001 王者荣耀:[tcp;;;;;00:33|1:66|02:00|03:0b]\n2002 和平精英:[tcp;;17500;;;00:33|1:66|03:0a|05:0a]\n2003 英雄联盟手游:[tcp;;;;;00:33|01:66|02:00|03:0b,tcp;;443;;;00:01|01:00|10:86|11:47] \n2015 我的世界:[tcp;;443;g79mclobt.nie.netease;;]\n2005 欢乐斗地主:[tcp;;8000;;;00:74|01:67|02:77|03:5f]\n2006 梦幻西游:[tcp;;;;;00:0e|01:00|02:fe|03:ff]\n2007 明日之后:[udp;;;;;00:05|01:09|02:00,tcp;;;;;00:02|01:00|02:00|03:00|04:00|05:00] \n2008 QQ飞车:[udp;;;;;00:28|01:28,tcp;;10000;;;00:33|01:66|02:00|03:08]\n2009 跑跑卡丁车:[tcp;;8888;;;00:33|01:66|02:00|03:08]\n2010 开心消消乐:[tcp;;80;happyelements;;] \n2011 狂野飙车:[tcp;;;asphalt9;;] \n2012 率土之滨:[tcp;;10001;;;00:00|01:00,tcp;;8001;;;00:00|01:00] \n2013 一刀传世:[tcp;;8040;;;00:47|01:45] \n2014 第五人格:[tcp;;4010;;;,tcp;;4010;;;,tcp;;4020;;;,tcp;;4030;;;,tcp;;4040;;;,tcp;;4050;;;,tcp;;4060;;;,tcp;;4070;;;,tcp;;4080;;;,tcp;;4090;;;] \n2016 皇室战争:[udp;;9339;;;] \n2017 炉石传说:[tcp;;3724;;;00:73:01:00:02:00]\n2023 原神:[tcp;;443;yuanshen.com;;] \n2025 天涯明月刀:[tcp;;10000;;;00:43|01:66|02:aa] \n2026 微信小游戏:[tcp;;443;mmgame;;,tcp;;443;game.weixin.qq;;] \n2033 我叫MT4:[tcp;;21248;;;,tcp;;;dir.mt4.qq.com;;] \n2034 神都夜行录:[udp;;;;;00:00|01:00|02:00|03:00|04:56|05:40] \n2041 光遇:[udp;;10000-15000;;;00:8f|01:ff,tcp;;;ma75.update.netease.com;;,tcp;;;ma75.proxima.nie.netease;;] \n2042 保卫萝卜4:[tcp;;;s4.luobo.cn;;] \n2040 哈利波特:[tcp;;10021-12000;;;00:02|01:00|02:00|03:00|04:00|05:00,tcp;;443;g92.proxima;;] \n2067 9377游戏:[tcp;;;www.9377.com;;] \n2068 4399游戏:[tcp;;;4399.com;;] \n2069 7k7k游戏:[tcp;;;7k7k.com;;] \n2070 17173游戏:[tcp;;;17173.com;;] \n2071 37网游:[tcp;;;37.com;;] \n2072 游民星空:[tcp;;;gamersky.com;;] \n2073 游侠网:[tcp;;;ali213.net;;] \n2074 hao123游戏:[tcp;;;game.hao123.com;;] \n2075 51游戏:[tcp;;;www.51.com;;] \n2050 uu加速器:[tcp;;;mg.uu.163.com;;] \n2051 腾讯加速器:[tcp;;;m.acc.qq.com;;] \n2080 乐逗游戏:[tcp;;;.uu.cc;;] \n\n#class video 3 视频\n3001 抖音短视频:[tcp;;;-dy-;;,tcp;;;-dy.;;,tcp;;;douyin;;]  \n3002 火山小视频:[tcp;;;.huoshan.com;;,tcp;;;hs.pstatp.com;;,tcp;;;hs.ixigua.com;;]  \n3003 腾讯视频:[tcp;;443;v.qq.com;;,tcp;;443;video.qq.com;;,tcp;;443;btrace.qq.com;;]  \n3004 爱奇艺:[tcp;;;iqiyi;;,tcp;;;qy.net;;]  \n3005 微视:[tcp;;80;;;00:34|01:16|02:75,tcp;;80;weishi.qq.com;;]  \n3006 斗鱼直播:[tcp;;;douyu;;,tcp;;;douyu;;-2:2f|-1:00]  \n3008 虎牙直播:[tcp;;;huya;;,udp;;;;;01:00|02:00|03:00|04:23,udp;;;;;01:00|02:00|03:00|04:24]  \n3009 快手:[tcp;;;kuaishou;;,tcp;;;ksyuncdn.com;;,tcp;;;.gifshow.com;;,tcp;;;yximgs.com;;,tcp;;80;;/ksc;,tcp;;;kwaicdn;;,tcp;;;kwimgs;;]  \n3010 小红书:[tcp;;;xiaohongshu;;,tcp;;;xhscdn;;]  \n3011 花椒直播:[tcp;;;huajiao;;]  \n3012 映客直播:[tcp;;;;.inke.cn;]  \n3013 YY:[udp;;;;;02:00|03:00|04:08,udp;;;;;00:4f|01:00|02:00]    \n3014 哔哩哔哩:[tcp;;;bilivideo;;,tcp;;;bilibili.com;;,tcp;;;;;00:47|05:75|06:70|07:67,tcp;;;;/bfs/emote/;,,tcp;;;hdslb.com;;]  \n3016 芒果tv:[tcp;;443;mgtv;;,tcp;;80;mgtv;;,tcp;;443;hitv;;]  \n3017 西瓜视频:[tcp;;;ixigua;;,tcp;;443;snsdk;;,tcp;;;xg-p.ixigua;;,tcp;;;bdxigua;;]  \n3018 搜狐视频:[tcp;;;aty.sohu.com;;,tcp;;;tv.itc.cn;;]  \n3019 播聊:[tcp;;80;randlove.cn;;,tcp;;;yueliao;;,tcp;;;5glive;;]  \n3020 咪咕视频:[tcp;;;miguvideo;;,tcp;;;migu.cn;;]  \n3021 韩剧TV:[tcp;;;hanju.koudaibaobao;;]  \n3022 人人视频:[tcp;;;rr.tv;;]  \n3023 央视影音:[tcp;;;cntv;;]  \n3024 土豆视频:[tcp;;;youku;;,tcp;;;ykimg;;]  \n3025 最右:[tcp;;;izuiyou;;]  \n3026 风行视频:[tcp;;;funshion;;]  \n3027 企鹅电竞:[tcp;;;egame.qq;;,tcp;;;liveplay;;,tcp;;;;pggame;]  \n3028 波波视频:[tcp;;;miaopai;;]  \n3029 酷狗短酷:[tcp;;;bssdl.kugou;;]  \n3030 酷狗直播:[tcp;;;rt-m.kugou;;,tcp;;;kgimg.com;;]  \n\n#class shopping 4 购物\n4001 淘宝:[tcp;;;taobao;;,tcp;;;alicdn.com;;,tcp;;;tmall.com;;,tcp;;;;;00:d3|01:00,,tcp;;;;;00:d4|01:00,,tcp;;;;;00:d3|01:00]  \n4002 京东:[tcp;;;360buyimg;;,tcp;;;jd.com;;,tcp;;;jdcdn.com;;,tcp;;;;;00:d5|01:00]  \n4003 唯品会:[tcp;;;vips-mobile;;,tcp;;;vipshop;;,tcp;;;vip.com;;,tcp;;;vipstatic.com;;,tcp;;;appsimg.com;;]  \n4004 拼多多:[tcp;;;pinduoduo;;,tcp;;;yangkeduo.com;;,tcp;;;s1p.cdntip.com;;]  \n4010 饿了么:[tcp;;;eleme;;]  \n4011 美团:[tcp;;;meituan;;]  \n4012 闲鱼:[tcp;;;xianyu;;]  \n4021 转转:[tcp;;;zhuanzhuan;;,tcp;;;zhuanstatic;;]  \n4005 蘑菇街:[tcp;;;mogujie;;,tcp;;;mogucdn;;,tcp;;;;;00:73|01:ea|02:68|03:fb|04:3f]  \n4006 苏宁易购:[tcp;;;.suning.;;]  \n4007 当当网:[tcp;;;.dangdang.com;;]  \n4008 1号店:[tcp;;;.yhd.com;;]  \n4009 朴朴超市:[tcp;;;pupumall;;,tcp;;;pupuapi;;]  \n4013 叮咚买菜:[tcp;;;ddxq.mobi;;]  \n4014 小米有品:[tcp;;;youpin;;,tcp;;;shopapi.io.mi.com;;]  \n4015 微店:[tcp;;;weidian;;]  \n4016 折800:[tcp;;;zhe800.com;;]  \n4017 HM:[tcp;;;www.hm.com;;,tcp;;;measurement.com;;]  \n4018 好省:[tcp;;;hzhstb.com;;]  \n4019 什么值得买:[tcp;;;smzdm.com;;]  \n4020 大众点评:[tcp;;;dianping.com;;]  \n4022 网易严选:[tcp;;;yanxuan;;]  \n4023 识货:[tcp;;;shihuo;;]  \n4024 考拉海购:[tcp;;;kaola;;]  \n4025 宜家家居:[tcp;;;ikea.cn;;]  \n4026 小象优品:[tcp;;;xiaoxiangyoupin;;]  \n\n#class music 5 音乐\n5001 网易云音乐:[tcp;;;music.163;;,tcp;;;music.126;;]\n5002 QQ音乐:[tcp;;;;^/amobile.music.tc.qq.com;,tcp;;;qqmusic;;]\n5003 酷狗音乐:[tcp;;;kugou;;,tcp;;;kgimg;;,tcp;;;fanxing;;]\n5004 酷我音乐:[tcp;;;.kuwo.cn;;]\n5005 喜马拉雅:[tcp;;;.ximalaya.com;;]\n5006 千千音乐:[tcp;;;music.taihe.com;;]\n5007 虾米音乐:[tcp;;;xiami;;]\n5008 音悦台:[tcp;;;yinyuetai.com;;]\n5009 豆瓣FM:[tcp;;;douban.fm;;]\n5010 唱吧:[tcp;;;changba.com;;]\n5011 音乐随心听:[tcp;;;fm.taihe.com;;]\n5012 懒人听书:[tcp;;;lrts.me;;]\n\n#class employee 6 招聘\n6001 前程无忧:[tcp;;;51job;;]\n6002 智联招聘:[tcp;;;zhaopin;;]\n6003 猎聘:[tcp;;;liepin;;]\n6004 赶集网:[tcp;;;58.com;;,tcp;;;58cdn;;]\n6005 同城急聘:[tcp;;;xiaomei;;]\n6006 领英:[tcp;;;linkedin;;]\n6007 斗米:[tcp;;;doumi;;]\n6008 看准:[tcp;;;kanzhun.com;;]\n6009 应届生求职:[tcp;;;yingjiesheng.com;;]\n6010 中华英才网:[tcp;;;chinahr.com;;]\n6011 拉勾网:[tcp;;;lagou.com;;]\n6012 大街网:[tcp;;;dajie.com;;]\n6013 boss直聘:[tcp;;;zhipin.com;;]\n6014 实习僧:[tcp;;;shixiseng.com;;]\n\n#class download 7 下载\n7001 迅雷:[udp;12345;;;;,udp;15000;;;;,tcp;;54321;;;,tcp;;12345;;;,udp;6881;;;;,udp;;12346;;;,udp;12346;;;;]  \n7002 AppStore:[tcp;;;itunes.apple.com;;] HIDE:0\n7003 samba共享:[tcp;;445;;;] HIDE:0\n7004 ftp文件传输:[tcp;;21;;;] HIDE:0\n7005 vivo应用商店:[tcp;;443;appstore.vivo;;,tcp;;443;apkappdefwsdl.vivo;;] HIDE:0\n7006 王者荣耀更新:[tcp;;80;;/sgame/;]   \n7007 天翼云盘:[tcp;;;ctyunapi;;]   \n7008 腾讯微云:[tcp;;;weiyun.com;;,tcp;;;aegis.qq.com;;,tcp;;;pingtas.qq.com;;,tcp;;443;;;00:77|01:6e|02:73]  \n7009 坚果云:[tcp;;;jianguoyun;;]   \n7010 蓝奏云:[tcp;;;pan.lanzou.com;;]   \n7011 华为云:[tcp;;;cloud.huawei.com;;,tcp;;;hicloud.com;;,tcp;;;myhuaweicloud.cn;;]  \n7020 windows更新:[tcp;;80;update.microsoft.com;;,tcp;;;windowsupdate.com;;]   \n7030 向日葵:[tcp;;;oray.com;;,tcp;;;oray.net;;]  \n7031 TeamViewer:[tcp;;;teamviewer;;]  \n7032 阿里云盘:[tcp;;;aliyundrive;;]  \n7035 SSH:[tcp;;;;;00:53|01:53|02:48]  \n\n#class website 8 常用网站\n8001 百度:[tcp;;;baidu.com;;]\n8002 新浪:[tcp;;;sina.com;;]\n8003 搜狐:[tcp;;;sohu.com;;]\n8004 网易:[tcp;;;163.com;;,tcp;;443;126.com;;]\n8005 凤凰网:[tcp;;;ifeng.com;;]\n8006 人民网:[tcp;;;people.com.cn;;]\n8007 凤凰网:[tcp;;;ifeng.com;;]\n8008 中华网:[tcp;;;china.com;;]\n8009 hao123:[tcp;;;hao123.com;;,]\n8010 2345:[tcp;;;2345.com;;,]\n8011 4399游戏:[tcp;;;4399.com;;]\n8012 7k7k游戏:[tcp;;;7k7k.com;;]\n8013 17173游戏:[tcp;;;17173.com;;]\n8014 37网游:[tcp;;;37.com;;]\n8015 游民星空:[tcp;;;gamersky.com;;]\n8016 游侠网:[tcp;;;ali213.net;;]\n8017 世纪佳缘:[tcp;;;jiayuan.com;;]\n8018 珍爱网:[tcp;;;zhenai.com;;]\n8019 百合网:[tcp;;;baihe.com;;]\n8020 天涯社区:[tcp;;;tianya.cn;;]\n8021 携程网:[tcp;;;ctrip.com;;]\n8022 飞猪:[tcp;;;fliggy.com;;]\n8023 12306:[tcp;;;12306.cn;;]\n8024 马蜂窝:[tcp;;;mafengwo.cn;;]\n8025 途牛:[tcp;;;tuniu.com;;]\n8026 穷游网:[tcp;;;qyer.com;;]\n8027 驴妈妈:[tcp;;;lvmama.com;;]\n8028 同程旅游:[tcp;;;ly.com;;]\n8029 太平洋汽车:[tcp;;;pcauto.com.cn;;]\n8030 易车网:[tcp;;;bitauto.com;;]\n8031 爱卡汽车:[tcp;;;xcar.com.cn;;]\n8032 雪球:[tcp;;;xueqiu.com;;]\n8033 东方财富:[tcp;;;eastmoney.com;;]\n8034 证券之星:[tcp;;;stockstar.com;;]\n8035 和讯:[tcp;;;hexun.com;;]\n8036 第一财经:[tcp;;;yicai.com;;]\n8037 全景网:[tcp;;;p5w.net;;]\n8038 中彩网:[tcp;;;zhcw.com;;]\n8039 中国体育彩票:[tcp;;;lottery.gov.cn;;]\n8040 竞彩网:[tcp;;;sporttery.cn;;]\n8041 豆丁:[tcp;;;docin.com;;]\n8042 豆瓣:[tcp;;;douban.com;;]\n8043 知乎:[tcp;;;zhihu.com;;]\n8044 缤客:[tcp;;;booking.com;;]\n8046 猫扑:[tcp;;;mop.com;;]\n8047 赶集网:[tcp;;;ganji.com;;]\n8048 安居客:[tcp;;;anjuke.com;;]\n8049 房天下:[tcp;;;fang.com;;]\n8050 链家:[tcp;;;lianjia.com;;]\n8051 百姓网:[tcp;;;baixing.com;;]\n8052 下厨房:[tcp;;;xiachufang.com;;]\n8053 大众点评:[tcp;;;dianping.com;;]\n8054 58同城:[tcp;;;58.com;;]\n8055 天眼查:[tcp;;;tianyancha.com;;]\n8056 千图网:[tcp;;;58pic.com;;]\n8057 csdn社区:[tcp;;;csdn.net;;]\n8058 有道词典:[tcp;;;dict.youdao.com;;]\n8059 动漫之家:[tcp;;;dmzj.com;;]\n8060 汽车之家:[tcp;;;autohome.com.cn;;]\n8061 纵横中文网:[tcp;;;zongheng.com;;]\n8062 起点中文网:[tcp;;;qidian.com;;]\n8063 飞卢:[tcp;;;faloo.com;;]\n8064 潇湘书院:[tcp;;;xxsy.net;;]\n8065 cctv5:[tcp;;;sports.cctv.com;;]\n8066 虎扑体育:[tcp;;;www.hupu.com;;]\n8067 建设银行:[tcp;;;ccb.com;;]\n8068 农业银行:[tcp;;;abchina.com;;]\n8069 中国银行:[tcp;;;boc.cn;;]\n8070 交通银行:[tcp;;;bankcomm.com;;]\n8071 招商银行:[tcp;;;cmbchina.com;;]\n8072 邮政储蓄:[tcp;;;psbc.com;;]\n8073 兴业银行:[tcp;;;cib.com.cn;;]\n8074 浦发银行:[tcp;;;spdb.com.cn;;]\n8075 中信银行:[tcp;;;citicbank.com;;]\n8076 上海银行:[tcp;;;bosc.cn;;]\n\n"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/files/feature_en.cfg",
    "content": "#version v22.11.11\n#format v2.0\n#id name:[proto;sport;dport;host url;request;dict]\n#class chat 1 Chat\n1001 Facebook:[tcp;;;facebook.com;;]\n1002 Whatsapp:[tcp;;;whatsapp;;]\n1003 Twitter:[tcp;;;twitter.com;;]\n1004 Instagram:[tcp;;;instagram.com;;]\n1005 VK:[tcp;;;vk.com;;]\n1006 Line:[tcp;;;line;;]\n1007 Snapchat:[tcp;;;snapchat.com;;]\n1008 Tinder:[tcp;;;tinder.com;;]\n\n#class video 3 Video\n3001 YouTube:[tcp;;;youtube;;]\n3002 Tiktok:[tcp;;;tiktok;;]\n3003 NetFlix:[tcp;;;netflix;;]\n3004 Vimeo:[tcp;;;vimeo;;]\n3005 DailyMotion:[tcp;;;dailymotion;;]\n3006 Hulu:[tcp;;;hulu;;]\n3007 Vube:[tcp;;;vube;;]\n3008 Twitch:[tcp;;;twitch;;]\n3009 LiveLeak:[tcp;;;itemfix;;]\n3010 Spotify:[tcp;;;spotify.com;;]\n3050 Xvideos:[tcp;;;xvideos.com;;]\n3051 Pornhub:[tcp;;;pornhub.com;;]\n3052 Xnxx:[tcp;;;xnxx.com;;]\n\n#class shopping 4 Shopping\n4001 Amazon:[tcp;;;amazon.com;;]\n4002 eBay:[tcp;;;ebay.com;;]\n4003 Etsy:[tcp;;;etsy.com;;]\n4004 Wish:[tcp;;;wish.com;;]\n4005 Alibaba:[tcp;;;alibaba;;]\n4006 Aliexpress:[tcp;;;aliexpress.com;;]\n4007 Walmart:[tcp;;;walmart.com;;]\n4008 Sears:[tcp;;;sears.com;;]\n4009 Kohls:[tcp;;;kohls.com;;]\n4010 Costco:[tcp;;;costco.com;;]\n4011 Asos:[tcp;;;asos.com;;]\n4012 Cuyana:[tcp;;;cuyana.com;;]\n\n#class download 7 Download\n7001 GooglePlay:[tcp;;;play.google.com;;]\n7002 AppStore:[tcp;;;iosapps.itunes.apple.com;;]\n7003 WindowsUpdate:[tcp;;80;update.microsoft.com;;,tcp;;;windowsupdate.com;;]  \n7050 Speedtest:[tcp;;;speedtest.net;;]\n7060 samba:[tcp;;445;;;]\n7061 ftp:[tcp;;21;;;]\n7062 ssh:[tcp;;22;;;]\n\n#class website 8 Website\n8001 Google:[tcp;;;www.google.com;;]\n8002 Wiki:[tcp;;;wikipedia.com;;]\n8003 Yahoo:[tcp;;;yahoo;;]\n8004 Apple:[tcp;;;www.apple.com;;]\n8010 Reddit:[tcp;;;reddit.com;;]\n8011 Outlook:[tcp;;;outlook.live.com;;]\n8012 Naver:[tcp;;;naver.com;;]\n8013 Fandom:[tcp;;;fandom.com;;]\n8015 Globo:[tcp;;;globo.com;;]\n8016 Yelp:[tcp;;;yelp.com;;]\n8017 Pinterest:[tcp;;;www.pinterest.com;;]\n8018 BBC:[tcp;;;www.bbc.com;;]\n8020 Linkedin:[tcp;;;linkedin.com;;]\n8022 Merriam-webster:[tcp;;;merriam-webster.com;;]\n8027 Dictionary:[tcp;;;dictionary.com;;]\n8028 Tripadvisor:[tcp;;;tripadvisor.com;;]\n8029 Britannica:[tcp;;;britannica.com;;]\n8030 Cambridge:[tcp;;;cambridge.org;;]\n8032 Weather:[tcp;;;weather.com;;]\n8033 Wiktionary:[tcp;;;wiktionary.org;;]\n8034 Espn:[tcp;;;espn.com;;]\n8035 Microsoft:[tcp;;;microsoft.com;;]\n8038 Gsmarena:[tcp;;;gsmarena.com;;]\n8039 Webmd:[tcp;;;webmd.com;;]\n8040 Craigslist:[tcp;;;craigslist.org;;]\n8041 Cricbuzz:[tcp;;;cricbuzz.com;;]\n8042 Mayoclinic:[tcp;;;mayoclinic.org;;]\n8043 Timeanddate:[tcp;;;timeanddate.com;;]\n8044 Espncricinfo:[tcp;;;espncricinfo.com;;]\n8045 Healthline:[tcp;;;healthline.com;;]\n8047 Rottentomatoes:[tcp;;;rottentomatoes.com;;]\n8049 Thefreedictionary:[tcp;;;thefreedictionary.com;;]\n8052 Bestbuy:[tcp;;;bestbuy.com;;]\n8053 Indeed:[tcp;;;indeed.com;;]\n8058 Samsung:[tcp;;;samsung.com;;]\n8059 Investopedia:[tcp;;;investopedia.com;;]\n8060 Flashscore:[tcp;;;flashscore.com;;]\n8061 Steampowered:[tcp;;;steampowered.com;;]\n8064 Roblox:[tcp;;;roblox.com;;]\n8065 Nordstrom:[tcp;;;nordstrom.com;;]\n8066 Thepiratebay:[tcp;;;thepiratebay.org;;]\n8067 Indiatimes:[tcp;;;indiatimes.com;;]\n8068 Cnbc:[tcp;;;cnbc.com;;]\n8069 Ssyoutube:[tcp;;;ssyoutube.com;;]\n8070 Adobe:[tcp;;;adobe.com;;]\n8071 Speedtest:[tcp;;;speedtest.net;;]\n8072 Lowes:[tcp;;;lowes.com;;]\n"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/files/gen_class.sh",
    "content": "#!/bin/sh\nCLASS_NAME_FILE=\"/tmp/app_class.txt\"\nf_file=$1\ntest -z \"$f_file\" && return\n\ntest -f $CLASS_NAME_FILE &&{\n\trm $CLASS_NAME_FILE\n}\ncat $f_file  |grep \"#class\" | awk '{print $3 \" \" $2 \" \" $4}' >$CLASS_NAME_FILE\n\n"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/files/hnat.sh",
    "content": ". /usr/share/libubox/jshn.sh\n. /lib/functions.sh\n\n\nIS_BOOT=0\nif [ \"$1\" = \"1\" ] ; then\n    IS_BOOT=1\nfi\n\nDISABLE_HNAT=$(uci -q get appfilter.global.disable_hnat)\nif [ \"$DISABLE_HNAT\" != \"1\" ]; then\n    exit 0\nfi\n\necho \"DISABLE_HNAT: $DISABLE_HNAT\"\n\n# mt798x     \ntest -d /sys/kernel/debug/hnat  && {              \n    echo 0 >/sys/kernel/debug/hnat/hook_toggle    \n}                                                                                 \n# qca ecm                                                                         \ntest -d /sys/kernel/debug/ecm/ && {                                               \n    echo \"1000000\" > /sys/kernel/debug/ecm/ecm_classifier_default/accel_delay_pkts\n}   \n                                   \nif [ $IS_BOOT -ne 1 ] ; then\n    # turbo acc\n    test -f /etc/config/turboacc && {\n        uci -q set \"turboacc.config.fastpath_fo_hw\"=\"0\"\n        uci -q set \"turboacc.config.fastpath_fc_ipv6\"=\"0\"\n        uci -q set \"turboacc.config.fastpath\"=\"none\"\n        uci -q set \"turboacc.config.fullcone\"=\"0\"\n        uci commit turboacc\n        /etc/init.d/turboacc restart\n    }\n\n    uci -q set \"firewall.@defaults[0].flow_offloading_hw\"='0'\n    uci -q set \"firewall.@defaults[0].flow_offloading\"='0'\n    uci -q set \"firewall.@defaults[0].fullcone\"='0'\n    uci commit firewall\n\n    /etc/init.d/firewall reload\n\nfi"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/files/oaf_rule",
    "content": ". /usr/share/libubox/jshn.sh\n. /lib/functions.sh\n\n\nconfig_apply()\n{\n    test -z \"$1\" && return 1\n\tif [ -e \"/dev/appfilter\" ];then\n    \techo \"$1\" >/dev/appfilter\n\tfi\n}\n\nclean_rule()\n{\n    json_init\n    json_add_int \"op\" 3\n    json_add_object \"data\"\n    json_str=`json_dump`\n    config_apply \"$json_str\"\n    json_cleanup\n}\n\nload_rule()\n{          \n    json_init\n    json_add_int \"op\" 1\n    json_add_object \"data\"\n    json_add_array \"apps\" \n    config_get appid_list rule app_list\n    if ! test -z \"$appid_list\";then    \n        for appid in $appid_list:  \n        do                         \n            json_add_int \"\" $appid\n        done                      \n    fi                            \n    json_str=`json_dump`\n    config_apply \"$json_str\"\n    json_cleanup               \n}\n              \nload_whitelist_mac()                          \n{                                             \n    json_init                          \n    config_load appfilter            \n    json_add_int \"op\" 5                             \n    json_add_object \"data\"\n    json_add_array \"mac_list\"\n                      \n    config_foreach add_mac_to_array_callback whitelist\n             \n    json_str=`json_dump`\n    config_apply \"$json_str\"             \n    json_cleanup         \n}                                            \n       \n\n\nadd_mac_to_array_callback() {\n    local section=\"$1\"\n    local mac\n    config_get mac \"$section\" \"mac\"\n    if [ -n \"$mac\" ]; then\n        json_add_string \"\" \"$mac\"\n    fi\n}\n\nload_mac_list()\n{\n    json_init\n    config_load appfilter\n    json_add_int \"op\" 4\n    json_add_object \"data\"\n    json_add_array \"mac_list\"\n    \n    local user_mode=`uci get appfilter.global.user_mode`\n    if [ x\"1\" == x\"$user_mode\" ];then\n        config_foreach add_mac_to_array_callback af_user\n    fi\n\n    json_str=`json_dump`\n    config_apply \"$json_str\"\n    json_cleanup\n}\n\n\n\nreload_rule(){\n    config_load appfilter\n    clean_rule\n    load_rule\n    load_mac_list\n\tload_whitelist_mac\n}\n\nreload_base_config(){\n\t! test -d /proc/sys/oaf && return\n    config_load appfilter \n    config_get work_mode \"global\" \"work_mode\"\n    config_get lan_ifname \"global\" \"lan_ifname\"\n    config_get user_mode \"global\" \"user_mode\"\n    config_get app_filter_mode \"global\" \"app_filter_mode\"\n\n    echo \"$work_mode\" >/proc/sys/oaf/work_mode\n    echo \"$user_mode\" >/proc/sys/oaf/user_mode\n    echo \"${app_filter_mode:-0}\" >/proc/sys/oaf/app_filter_mode\n      \n    if [ x\"\" != x\"$lan_ifname\" ];then\n        echo \"$lan_ifname\" >/proc/sys/oaf/lan_ifname\n    fi                   \n}       \n\ncase $1 in\n\"reload\")\n    reload_base_config\n\treload_rule\n;;\nesac\n"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/files/user_info.config",
    "content": ""
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/src/Makefile",
    "content": "OBJS:=appfilter_user.o appfilter_netlink.o appfilter_ubus.o appfilter_config.o utils.o main.o\r\nEXEC:=oafd\r\nall: $(OBJS)\r\n\t$(CC) -o $(EXEC) $(OBJS) $(LIBS)\r\nclean:\r\n\trm $(EXEC) *.o\r\n"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/src/appfilter.h",
    "content": "#ifndef __APPFILTER_H__\r\n#define __APPFILTER_H__\r\n#define MIN_INET_ADDR_LEN 7\r\n\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <time.h>\r\n#include <stdarg.h>\r\n#include \"utils.h\"\r\n\r\n#define LOG_FILE_PATH \"/tmp/log/appfilter.log\"\r\n#define OAF_VERSION \"6.1.8\"\r\n\r\ntypedef enum {\r\n    LOG_LEVEL_ERROR,\r\n\tLOG_LEVEL_WARN,\r\n    LOG_LEVEL_INFO,\r\n    LOG_LEVEL_DEBUG\r\n} LogLevel;\r\n\r\nextern int current_log_level;\r\n\r\n static void af_log(LogLevel level, const char *format, ...){\r\n    if (level > current_log_level) \r\n        return;\r\n    \r\n    FILE *log_file = fopen(LOG_FILE_PATH, \"a\");\r\n    if (!log_file) {\r\n        perror(\"Failed to open log file\");\r\n        return;\r\n    }\r\n\r\n    time_t now = time(NULL);\r\n    struct tm *t = localtime(&now);\r\n    char time_str[20];\r\n    strftime(time_str, sizeof(time_str), \"%Y-%m-%d %H:%M:%S\", t);\r\n\r\n    const char *level_str;\r\n    switch (level) {\r\n        case LOG_LEVEL_DEBUG: level_str = \"DEBUG\"; break;\r\n        case LOG_LEVEL_INFO:  level_str = \"INFO\";  break;\r\n        case LOG_LEVEL_WARN:  level_str = \"WARN\";  break;\r\n        case LOG_LEVEL_ERROR: level_str = \"ERROR\"; break;\r\n        default: level_str = \"UNKNOWN\"; break;\r\n    }\r\n\r\n    fprintf(log_file, \"[%s] [%s] \", time_str, level_str);\r\n\r\n    va_list args;\r\n    va_start(args, format);\r\n    vfprintf(log_file, format, args);\r\n    va_end(args);\r\n    fclose(log_file);\r\n}\r\n\r\n#define LOG_DEBUG(format, ...) af_log(LOG_LEVEL_DEBUG, format, ##__VA_ARGS__)\r\n#define LOG_INFO(format, ...)  af_log(LOG_LEVEL_INFO, format, ##__VA_ARGS__)\r\n#define LOG_WARN(format, ...)  af_log(LOG_LEVEL_WARN, format, ##__VA_ARGS__)\r\n#define LOG_ERROR(format, ...) af_log(LOG_LEVEL_ERROR, format, ##__VA_ARGS__)\r\n\r\n\r\n\r\n#define MAX_TIME_LIST_LEN 1024\r\n#define MAX_TIME_LIST 64\r\ntypedef struct af_time\r\n{\r\n    int hour;\r\n    int min;\r\n} af_time_t;\r\n\r\ntypedef struct af_global_config_t{\r\n    int enable;\r\n    int user_mode;\r\n    int work_mode;\r\n    int record_enable;\r\n\tint disable_hnat;\r\n    int auto_load_engine;\r\n\tint tcp_rst;\r\n\tint disable_quic;\r\n\tint app_filter_mode; // 0 = specified apps, 1 = all apps\r\n\tchar lan_ifname[16];\r\n}af_global_config_t;\r\n\r\ntypedef struct time_config{\r\n\taf_time_t start_time;\r\n\taf_time_t end_time;\r\n\tint days[7];\r\n}time_config_t;\r\n\r\ntypedef struct daily_limit_config {\r\n    int enable;\r\n    int am_time;\r\n    int pm_time;\r\n} daily_limit_config_t;\r\n\r\ntypedef struct af_time_config_t{\r\n\tint time_mode;\r\n\ttime_config_t seg_time;\r\n    int deny_time;\r\n    int allow_time;\r\n\tint days[7];\r\n    int time_num;\r\n\ttime_config_t time_list[MAX_TIME_LIST];\r\n    daily_limit_config_t daily_limit[7];\r\n}af_time_config_t;\r\n\r\ntypedef struct af_config_t{\r\n    af_global_config_t global;\r\n    af_time_config_t time;\r\n}af_config_t;\r\n\r\ntypedef struct af_run_time_status{\r\n    int deny_time;\r\n    int allow_time;\r\n    int filter;\r\n    int match_time;\r\n    int remain_time; \r\n    int used_time; \r\n    int period_blocked;\r\n}af_run_time_status_t;\r\n\r\n\r\nextern af_config_t g_af_config;\r\n#endif\r\n"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/src/appfilter_config.c",
    "content": "/*\nCopyright (C) 2020 Derry <destan19@126.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n#include <stdio.h>\n#include <string.h>\n#include <stdlib.h>\n#include \"appfilter_config.h\"\n#include \"appfilter.h\"\n#include <uci.h>\n\napp_name_info_t app_name_table[MAX_SUPPORT_APP_NUM];\nint g_app_count = 0;\nint g_cur_class_num = 0;\nchar CLASS_NAME_TABLE[MAX_APP_TYPE][MAX_CLASS_NAME_LEN];\n\nconst char *config_path = \"./config\";\nstatic struct uci_context *uci_ctx = NULL;\nstatic struct uci_package *uci_appfilter;\n\n\nint af_uci_get_int_value(struct uci_context *ctx, char *key)\n{\n    struct uci_element *e;\n    struct uci_ptr ptr;\n    int ret = -1;\n    int dummy;\n    char *parameters ;\n    char param_tmp[128] = {0};\n    strcpy(param_tmp, key);\n    if (uci_lookup_ptr(ctx, &ptr, param_tmp, true) != UCI_OK) {\n        return ret;\n    }\n    \n    if (!(ptr.flags & UCI_LOOKUP_COMPLETE)) {\n        ctx->err = UCI_ERR_NOTFOUND;\n        goto done;\n    }\n    \n    e = ptr.last;\n    switch(e->type) {\n        case UCI_TYPE_SECTION:\n            ret = -1;\n\t\t\tgoto done;\n        case UCI_TYPE_OPTION:\n            ret = atoi(ptr.o->v.string);\n\t\t\tgoto done;\n        default:\n            break;\n    }\ndone:\n\t\n\tif (ptr.p)\n\t\tuci_unload(ctx, ptr.p);\n    return ret;\n}\n\n\nint af_uci_get_value(struct uci_context *ctx, char *key, char *output, int out_len)\n{\n    struct uci_element *e;\n    struct uci_ptr ptr;\n    int ret = UCI_OK;\n    int dummy;\n    char *parameters ;\n    char param_tmp[128] = {0};\n    strcpy(param_tmp, key);\n    if (uci_lookup_ptr(ctx, &ptr, param_tmp, true) != UCI_OK) {\n        ret = 1;\n        return ret;\n    }\n    \n    if (!(ptr.flags & UCI_LOOKUP_COMPLETE)) {\n        ctx->err = UCI_ERR_NOTFOUND;\n        ret = 1;\n        goto done;\n    }\n    \n    e = ptr.last;\n    switch(e->type) {\n        case UCI_TYPE_SECTION:\n            snprintf(output, out_len, \"%s\", ptr.s->type);\n            break;\n        case UCI_TYPE_OPTION:\n            snprintf(output, out_len, \"%s\", ptr.o->v.string);\n\t\t\tbreak;\n        default:\n\t\t\tret = 1;\n            break;\n    }\ndone:    \n\tif (ptr.p)\n\t\tuci_unload(ctx, ptr.p);\n    return ret;\n}\n\n\nint af_uci_delete(struct uci_context *ctx, char *key)\n{\n    struct uci_element *e;\n    struct uci_ptr ptr;\n    int ret = UCI_OK;\n    int dummy;\n    char *parameters ;\n    char param_tmp[128] = {0};    \n    strcpy(param_tmp, key);\n    if (uci_lookup_ptr(ctx, &ptr, param_tmp, true) != UCI_OK) {\n        ret = 1;\n        return ret;\n    }\n    ret = uci_delete(ctx, &ptr);\n    if (ret == UCI_OK)\n       ret = uci_save(ctx, ptr.p);\n\n\tif (ptr.p)\n\t\tuci_unload(ctx, ptr.p);\n    return ret;\n}\n\n\n\nint af_uci_add_list(struct uci_context *ctx, char *key, char *value)\n{\n    struct uci_element *e;\n    struct uci_ptr ptr;\n    int ret = UCI_OK;\n    int dummy;\n    char *parameters;\n    if (strlen(value) + strlen(key) >= MAX_PARAM_LIST_LEN  - 1) {\n        printf(\"value too long\\n\");\n        return -1;\n    }\n    char param_tmp[MAX_PARAM_LIST_LEN] = {0};    \n    sprintf(param_tmp, \"%s=%s\", key, value);\n    if (uci_lookup_ptr(ctx, &ptr, param_tmp, true) != UCI_OK) {\n        ret = 1;\n        return ret;\n    }\n    ret = uci_add_list(ctx, &ptr);\n    if (ret == UCI_OK)\n       ret = uci_save(ctx, ptr.p);\n\n\tif (ptr.p)\n\t\tuci_unload(ctx, ptr.p);\n    return ret;\n}\n\n\nint af_uci_get_list_value(struct uci_context *ctx, char *key, char *output, int out_len, char *delimt)\n{\n    struct uci_element *e;\n    struct uci_ptr ptr;\n    int ret = -1;\n    int dummy;\n    char *parameters ;\n    char param_tmp[128] = {0};\n    strcpy(param_tmp, key);\n    if (uci_lookup_ptr(ctx, &ptr, param_tmp, true) != UCI_OK) {\n        return ret;\n    }\n    \n    if (!(ptr.flags & UCI_LOOKUP_COMPLETE)) {\n        ctx->err = UCI_ERR_NOTFOUND;\n        goto done;\n    }\n    int sep = 0;\n    e = ptr.last;\n\tint len = 0;\n    switch(e->type) {\n        case UCI_TYPE_SECTION:\n            ret = -1;\n\t\t\tgoto done;\n        case UCI_TYPE_OPTION:\n\t\t\tif (UCI_TYPE_LIST == ptr.o->type){\n\t\t\t\tmemset(output, 0x0, out_len);\n\t\t\t\tuci_foreach_element(&ptr.o->v.list, e) {\n\t\t\t\t\tlen = strlen(output);\n\t\t\t\t\tif (sep){\n\t\t\t\t\t\tstrncat(output + len, delimt, out_len);\n\t\t\t\t\t}\n\t\t\t\t\tlen = strlen(output);\n\t\t\t\t\tsprintf(output + len, \"%s\", e->name);\n\t\t\t\t\tsep = 1;\n\t\t\t\t}\n\t\t\t\tret = 0;\n\t\t\t}\n\t\t\tgoto done;\n        default:\n            break;\n    }\ndone:\t\n\tif (ptr.p)\n\t\tuci_unload(ctx, ptr.p);\n    return ret;\n}\n\n\nint af_uci_add_int_list(struct uci_context *ctx, char *key, int value)\n{\n    struct uci_element *e;\n    struct uci_ptr ptr;\n    int ret = UCI_OK;\n    int dummy;\n    char *parameters ;\n    char param_tmp[128] = {0};    \n    sprintf(param_tmp, \"%s=%d\", key, value);\n    if (uci_lookup_ptr(ctx, &ptr, param_tmp, true) != UCI_OK) {\n        ret = 1;\n        return ret;\n    }\n    ret = uci_add_list(ctx, &ptr);\n    if (ret == UCI_OK)\n       ret = uci_save(ctx, ptr.p);\n\n\tif (ptr.p)\n\t\tuci_unload(ctx, ptr.p);\n    return ret;\n}\n\nint af_uci_del_list(struct uci_context *ctx, char *key, char *value)\n{\n    struct uci_element *e;\n    struct uci_ptr ptr;\n    int ret = UCI_OK;\n    int dummy;\n    char *parameters ;\n    char param_tmp[128] = {0};    \n    sprintf(param_tmp, \"%s=%s\", key, value);\n    if (uci_lookup_ptr(ctx, &ptr, param_tmp, true) != UCI_OK) {\n        ret = 1;\n        return ret;\n    }\n    ret = uci_del_list(ctx, &ptr);\n    if (ret == UCI_OK)\n       ret = uci_save(ctx, ptr.p);\n\n\tif (ptr.p)\n\t\tuci_unload(ctx, ptr.p);\n    return ret;\n}\n\n\nint af_uci_set_value(struct uci_context *ctx, char *key, char *value)\n{\n    struct uci_element *e;\n    struct uci_ptr ptr;\n    int ret = UCI_OK;\n    int dummy;\n    char *parameters ;\n    char param_tmp[2048] = {0};    \n    sprintf(param_tmp, \"%s=%s\", key, value);\n    if (uci_lookup_ptr(ctx, &ptr, param_tmp, true) != UCI_OK) {\n        ret = 1;\n        return ret;\n    }\n    \n    e = ptr.last;\n    ret = uci_set(ctx, &ptr);\n    if (ret == UCI_OK)\n       ret = uci_save(ctx, ptr.p);\n\n\tif (ptr.p)\n\t\tuci_unload(ctx, ptr.p);\n    return ret;\n}\n\nint af_uci_set_int_value(struct uci_context *ctx, char *key, int value)\n{\n    struct uci_element *e;\n    struct uci_ptr ptr;\n    int ret = UCI_OK;\n    int dummy;\n    char *parameters ;\n    char param_tmp[128] = {0};    \n    sprintf(param_tmp, \"%s=%d\", key, value);\n    if (uci_lookup_ptr(ctx, &ptr, param_tmp, true) != UCI_OK) {\n        ret = 1;\n        return ret;\n    }\n    e = ptr.last;\n    ret = uci_set(ctx, &ptr);\n    if (ret == UCI_OK)\n       ret = uci_save(ctx, ptr.p);\n\n    if (ptr.p)\n        uci_unload(ctx, ptr.p);\n    return ret;\n}\n\nint af_uci_del_array_value(struct uci_context *ctx, char *key_fmt, int index){\n    char key[128] = {0};\n    sprintf(key, key_fmt, index);\n    return af_uci_delete(ctx, key);\n}\n\nint af_uci_set_array_value(struct uci_context *ctx, char *key_fmt, int index, char *value){\n    char key[128] = {0};\n    sprintf(key, key_fmt, index);\n    return af_uci_set_value(ctx, key, value);\n}\n\nint af_uci_commit(struct uci_context *ctx, const char * package) {\n    struct uci_ptr ptr;\n    int ret = UCI_OK;\n    if (!package){\n        return -1;\n    }\n    if (uci_lookup_ptr(ctx, &ptr, package, true) != UCI_OK) {\n        return -1;\n    }   \n\n    if (uci_commit(ctx, &ptr.p, false) != UCI_OK) {\n    \tret = -1;\n        goto done;\n    }\ndone:\n\tif (ptr.p)\n\t\tuci_unload(ctx, ptr.p);\n\n    return UCI_OK;\n}\n\nint af_get_uci_list_num(struct uci_context * ctx, char *package, char *section){\n    int count = 0;\n    struct uci_ptr p;\n    struct uci_element *e; \n    struct uci_package *pkg = NULL;\n\n    if (UCI_OK != uci_load(ctx, package, &pkg)){\n        return -1; \n    }   \n    uci_foreach_element(&pkg->sections, e){ \n        struct uci_section *s = uci_to_section(e);\n        if (strcmp(s->type, section)){\n            continue;\n        }\n        count++;\n    }   \n    uci_unload(ctx, pkg);\n    return count;\n}\nint af_uci_get_array_value(struct uci_context *ctx, char *key_fmt, int index, char *output, int out_len)\n{\n    char key[128] = {0};\n    sprintf(key, key_fmt, index);\n    return af_uci_get_value(ctx, key, output, out_len);\n}\n\nint af_uci_add_section(struct uci_context * ctx, char *package_name, char *section)\n{\n    struct uci_section *s = NULL;\n    struct uci_package *p = NULL;\n    int ret;\n    ret = uci_load(ctx, package_name , &p);\n    if (ret != UCI_OK)\n        goto done;\n\n    ret = uci_add_section(ctx, p, section, &s);\n    if (ret != UCI_OK)\n        goto done;\n    ret = uci_save(ctx, p); \ndone:\n    if (s) \n        fprintf(stdout, \"%s\\n\", s->e.name);\n    return ret;\n}\n//\nstatic struct uci_package *\nconfig_init_package(const char *config)\n{\n    struct uci_context *ctx = uci_ctx;\n    struct uci_package *p = NULL;\n\n    if (!ctx)\n    {\n        ctx = uci_alloc_context();\n        uci_ctx = ctx;\n        ctx->flags &= ~UCI_FLAG_STRICT;\n        //if (config_path)\n        //\tuci_set_confdir(ctx, config_path);\n    }\n    else\n    {\n        p = uci_lookup_package(ctx, config);\n        if (p)\n            uci_unload(ctx, p);\n    }\n\n    if (uci_load(ctx, config, &p))\n        return NULL;\n\n    return p;\n}\nchar *get_app_name_by_id(int id)\n{\n    int i;\n    for (i = 0; i < g_app_count; i++)\n    {\n        if (id == app_name_table[i].id)\n            return app_name_table[i].name;\n    }\n    return \"\";\n}\n\nvoid init_app_name_table(void)\n{\n    int count = 0;\n    char line_buf[2048] = {0};\n\n    FILE *fp = fopen(\"/tmp/feature.cfg\", \"r\");\n    if (!fp)\n    {\n        printf(\"open file failed\\n\");\n        return;\n    }\n    g_app_count = 0;\n    while (fgets(line_buf, sizeof(line_buf), fp))\n    {\n        if (strstr(line_buf, \"#\"))\n            continue;\n        if (strlen(line_buf) < 10)\n            continue;\n        if (!strstr(line_buf, \":\"))\n            continue;\n        char *pos1 = strstr(line_buf, \":\");\n        char app_info_buf[128] = {0};\n        int app_id;\n        char app_name[64] = {0};\n        memset(app_name, 0x0, sizeof(app_name));\n        strncpy(app_info_buf, line_buf, pos1 - line_buf);\n        sscanf(app_info_buf, \"%d %s\", &app_id, app_name);\n        app_name_table[g_app_count].id = app_id;\n        strcpy(app_name_table[g_app_count].name, app_name);\n        g_app_count++;\n    }\n    fclose(fp);\n}\n\nvoid init_app_class_name_table(void)\n{\n    char line_buf[2048] = {0};\n    int class_id;\n    char class_name[64] = {0};\n    FILE *fp = fopen(\"/tmp/app_class.txt\", \"r\");\n    if (!fp)\n    {\n        printf(\"open file failed\\n\");\n        return;\n    }\n    g_cur_class_num = 0;\n    while (fgets(line_buf, sizeof(line_buf), fp))\n    {\n        sscanf(line_buf, \"%d %*s %s\", &class_id, class_name);\n        strcpy(CLASS_NAME_TABLE[class_id - 1], class_name);\n        g_cur_class_num++;\n    }\n    fclose(fp);\n}\n//00:00 9:1\nint check_time_valid(char *t)\n{\n    if (!t)\n        return 0;\n    if (strlen(t) < 3 || strlen(t) > 5 || (!strstr(t, \":\")))\n        return 0;\n    else\n        return 1;\n}\n\n\nint config_get_appfilter_enable(void)\n{\n    int enable = 0;\n    struct uci_context *ctx = uci_alloc_context();\n    if (!ctx)\n        return -1;\n\tenable = af_uci_get_int_value(ctx, \"appfilter.global.enable\");\n    if (enable < 0)\n        enable = 0;\n    \n\tuci_free_context(ctx);\n    return enable;\n}\n\nint config_get_lan_ip(char *lan_ip, int len)\n{\n    int ret = 0;\n    struct uci_context *ctx = uci_alloc_context();\n    if (!ctx)\n        return -1;\n    ret = af_uci_get_value(ctx, \"network.lan.ipaddr\", lan_ip, len);\n    uci_free_context(ctx);\n    return ret;\n}\n\nint config_get_lan_mask(char *lan_mask, int len)\n{\n    int ret = 0;\n    struct uci_context *ctx = uci_alloc_context();\n    if (!ctx)\n        return -1;\n    ret = af_uci_get_value(ctx, \"network.lan.netmask\", lan_mask, len);\n    uci_free_context(ctx);\n    return ret;\n}\n\n\nint appfilter_config_alloc(void)\n{\n    char *err;\n    uci_appfilter = config_init_package(\"appfilter\");\n    if (!uci_appfilter)\n    {\n        uci_get_errorstr(uci_ctx, &err, NULL);\n        printf(\"Failed to load appfilter config (%s)\\n\", err);\n        free(err);\n        return -1;\n    }\n\n    return 0;\n}\n\nint appfilter_config_free(void)\n{\n    if (uci_appfilter)\n    {\n        uci_unload(uci_ctx, uci_appfilter);\n        uci_appfilter = NULL;\n    }\n    if (uci_ctx)\n    {\n        uci_free_context(uci_ctx);\n        uci_ctx = NULL;\n    }\n}\n"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/src/appfilter_config.h",
    "content": "/*\r\nCopyright (C) 2020 Derry <destan19@126.com>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n#ifndef __APPFILTER_CONFIG_H__\r\n#define __APPFILTER_CONFIG_H__\r\n#include <uci.h>\r\n\r\n#define MAX_SUPPORT_APP_NUM 1024\r\n#define MAX_CLASS_NAME_LEN 32\r\n#define MAX_PARAM_LIST_LEN 1024\r\n\r\n#include \"appfilter_user.h\"\r\nextern int g_cur_class_num;\r\nextern int g_app_count;\r\nextern char CLASS_NAME_TABLE[MAX_APP_TYPE][MAX_CLASS_NAME_LEN];\r\n\r\ntypedef struct app_name_info\r\n{\r\n    int id;\r\n    char name[64];\r\n} app_name_info_t;\r\nvoid init_app_name_table(void);\r\nvoid init_app_class_name_table(void);\r\nchar *get_app_name_by_id(int id);\r\n\r\nint appfilter_config_alloc(void);\r\n\r\nint appfilter_config_free(void);\r\nint config_get_appfilter_enable(void);\r\nint config_get_lan_ip(char *lan_ip, int len);\r\nint config_get_lan_mask(char *lan_mask, int len);\r\nint af_uci_delete(struct uci_context *ctx, char *key);\r\nint af_uci_add_list(struct uci_context *ctx, char *key, char *value);\r\nint af_uci_add_int_list(struct uci_context *ctx, char *key, int value);\r\nint af_uci_del_list(struct uci_context *ctx, char *key, char *value);\r\nint af_uci_get_list_value(struct uci_context *ctx, char *key, char *output, int out_len, char *delimt);\r\nint af_uci_set_value(struct uci_context *ctx, char *key, char *value);\r\nint af_uci_set_int_value(struct uci_context *ctx, char *key, int value);\r\nint af_uci_del_array_value(struct uci_context *ctx, char *key_fmt, int index);\r\nint af_uci_set_array_value(struct uci_context *ctx, char *key_fmt, int index, char *value);\r\nint af_get_uci_list_num(struct uci_context * ctx, char *package, char *section);\r\nint af_uci_get_array_value(struct uci_context *ctx, char *key_fmt, int index, char *output, int out_len);\r\nint af_uci_get_int_value(struct uci_context *ctx, char *key);\r\nint af_uci_get_value(struct uci_context *ctx, char *key, char *output, int out_len);\r\nint af_uci_add_section(struct uci_context * ctx, char *package_name, char *section);\r\nint af_uci_commit(struct uci_context *ctx, const char * package);\r\nchar *get_app_name_by_id(int id);\r\n\r\n#endif\r\n\r\n"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/src/appfilter_netlink.c",
    "content": "/*\r\nCopyright (C) 2020 Derry <destan19@126.com>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n#include <unistd.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <time.h>\r\n#include <sys/socket.h>\r\n#include <linux/netlink.h>\r\n#include <linux/socket.h>\r\n#include <sys/socket.h>\r\n#include <sys/time.h>\r\n#include <libubox/uloop.h>\r\n#include <libubox/utils.h>\r\n#include <libubus.h>\r\n#include <json-c/json.h>\r\n#include \"appfilter_user.h\"\r\n#include \"appfilter_netlink.h\"\r\n#include \"appfilter.h\"\r\n#include \"appfilter_config.h\"\r\n\r\n#define MAX_NL_RCV_BUF_SIZE 4096\r\n\r\n#define REPORT_INTERVAL_SECS 60\r\nextern int hash_appid(int appid);\r\nextern unsigned int g_feature_update_time;\r\nvoid appfilter_nl_handler(struct uloop_fd *u, unsigned int ev)\r\n{\r\n    int ret;\r\n    int i;\r\n    char buf[MAX_NL_RCV_BUF_SIZE];\r\n    struct sockaddr_nl nladdr;\r\n    struct iovec iov = {buf, sizeof(buf)};\r\n    struct nlmsghdr *h;\r\n    int type;\r\n    int id;\r\n    char *mac = NULL;\r\n    u_int32_t cur_time = get_timestamp();\r\n\r\n    struct msghdr msg = {\r\n        .msg_name = &nladdr,\r\n        .msg_namelen = sizeof(nladdr),\r\n        .msg_iov = &iov,\r\n        .msg_iovlen = 1,\r\n    };\r\n\r\n    do\r\n    {\r\n        ret = recvmsg(u->fd, &msg, 0);\r\n    } while ((-1 == ret) && (EINTR == errno));\r\n\r\n    if (ret < 0)\r\n    {\r\n        printf(\"recv msg error\\n\");\r\n        return;\r\n    }\r\n    else if (0 == ret)\r\n    {\r\n        return;\r\n    }\r\n\r\n    h = (struct nlmsghdr *)buf;\r\n    char *kmsg = (char *)NLMSG_DATA(h);\r\n    struct af_msg_hdr *af_hdr = (struct af_msg_hdr *)kmsg;\r\n    if (af_hdr->magic != 0xa0b0c0d0)\r\n    {\r\n        printf(\"magic error %x\\n\", af_hdr->magic);\r\n        return;\r\n    }\r\n\r\n    if (af_hdr->len <= 0 || af_hdr->len >= MAX_OAF_NETLINK_MSG_LEN)\r\n    {\r\n        printf(\"data len error\\n\");\r\n        return;\r\n    }\r\n\r\n    char *kdata = kmsg + sizeof(struct af_msg_hdr);\r\n    struct json_object *root = json_tokener_parse(kdata);\r\n    if (!root)\r\n    {\r\n        printf(\"parse json failed:%s\", kdata);\r\n        return;\r\n    }\r\n\r\n    LOG_DEBUG(\"report %s\\n\", kdata);\r\n    struct json_object *mac_obj = json_object_object_get(root, \"mac\");\r\n\r\n    if (!mac_obj)\r\n    {\r\n        printf(\"parse mac obj failed\\n\");\r\n        json_object_put(root);\r\n        return;\r\n    }\r\n\r\n    mac = json_object_get_string(mac_obj);\r\n\r\n    dev_node_t *node = find_dev_node(mac);\r\n\r\n    if (!node)\r\n    {\r\n        node = add_dev_node(mac);\r\n        if (!node)\r\n        {\r\n            goto EXIT;\r\n        }\r\n    }\r\n\r\n    struct json_object *ip_obj = json_object_object_get(root, \"ip\");\r\n    if (ip_obj)\r\n        strncpy(node->ip, json_object_get_string(ip_obj), sizeof(node->ip));\r\n\r\n\r\n    struct json_object *active_obj = json_object_object_get(root, \"active\");\r\n    if (active_obj) {\r\n        node->active = json_object_get_int(active_obj);\r\n\t\tif (node->active)\r\n\t\t{\r\n\t\t\t// 根据当前时间判断是上午还是下午，分别累加\r\n\t\t\ttime_t now = time(NULL);\r\n\t\t\tstruct tm *tm_info = localtime(&now);\r\n\t\t\tint current_hour = tm_info->tm_hour;\r\n\t\t\t\r\n\t\t\tif (current_hour < 12) {\r\n\t\t\t\t// 上午：0:00-11:59\r\n\t\t\t\tnode->today_am_active_time += 1; //min\r\n\t\t\t} else {\r\n\t\t\t\t// 下午：12:00-23:59\r\n\t\t\t\tnode->today_pm_active_time += 1; //min\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t}\r\n    \r\n    \r\n    struct json_object *up_flow_obj = json_object_object_get(root, \"up_flow\");\r\n    struct json_object *down_flow_obj = json_object_object_get(root, \"down_flow\");\r\n    unsigned long long total_up_bytes = 0;\r\n    unsigned long long total_down_bytes = 0;\r\n    \r\n    if (up_flow_obj) {\r\n        node->today_up_bytes += (unsigned long long)json_object_get_int64(up_flow_obj) * 1024;\r\n    }\r\n\t\r\n    if (down_flow_obj) {\r\n        node->today_down_bytes += (unsigned long long)json_object_get_int64(down_flow_obj) * 1024;\r\n    }\r\n\r\n\r\n    struct json_object *visit_array = json_object_object_get(root, \"visit_info\");\r\n    if (!visit_array)\r\n    {\r\n       goto EXIT;\r\n    }\r\n\r\n\r\n    for (i = 0; i < json_object_array_length(visit_array); i++)\r\n    {\r\n        struct json_object *visit_obj = json_object_array_get_idx(visit_array, i);\r\n        struct json_object *appid_obj = json_object_object_get(visit_obj, \"appid\");\r\n        struct json_object *action_obj = json_object_object_get(visit_obj, \"latest_action\");\r\n\r\n        // old appid may be not in the feature list\r\n        if (cur_time - g_feature_update_time < 300){\r\n            if (strlen(get_app_name_by_id(json_object_get_int(appid_obj))) == 0){\r\n                LOG_INFO(\"ignore appid %d because it is not in the feature list\\n\", json_object_get_int(appid_obj)); \r\n                continue;\r\n            }\r\n        }\r\n\r\n        int appid = json_object_get_int(appid_obj);\r\n        int action = json_object_get_int(action_obj);\r\n\r\n        type = appid / 1000;\r\n        id = appid % 1000;\r\n        if (id <= 0 || type <= 0)\r\n            continue;\r\n        node->stat[type - 1][id - 1].total_time += REPORT_INTERVAL_SECS;\r\n        int hash = hash_appid(appid);\r\n        visit_info_t *head = node->visit_htable[hash];\r\n        visit_info_t *p = head;\r\n        while(p){\r\n            if((p->appid == appid) && (cur_time - p->latest_time < 300)){\r\n                LOG_DEBUG(\"match appid = %d\\n\", appid, cur_time - p->latest_time);\r\n                break;\r\n            }\r\n            p = p->next;\r\n        }\r\n        if (!p){\r\n            p = (visit_info_t *)calloc(1, sizeof(visit_info_t));\r\n            p->appid = appid;\r\n            p->next = NULL;\r\n            p->first_time = cur_time;\r\n            add_visit_info_node(&node->visit_htable[hash], p);\r\n        }\r\n        p->action = action;\r\n        p->latest_time = cur_time;\r\n    }\r\nEXIT:\r\n    json_object_put(root);\r\n}\r\n\r\n#define MAX_NL_MSG_LEN 1024\r\nint send_msg_to_kernel(int fd, void *msg, int len)\r\n{\r\n    struct sockaddr_nl saddr, daddr;\r\n    memset(&daddr, 0, sizeof(daddr));\r\n    daddr.nl_family = AF_NETLINK;\r\n    daddr.nl_pid = 0; // to kernel\r\n    daddr.nl_groups = 0;\r\n    int ret = 0;\r\n    struct nlmsghdr *nlh = NULL;\r\n    nlh = (struct nlmsghdr *)malloc(NLMSG_SPACE(MAX_NL_MSG_LEN));\r\n    nlh->nlmsg_len = NLMSG_SPACE(MAX_NL_MSG_LEN);\r\n    nlh->nlmsg_flags = 0;\r\n    nlh->nlmsg_type = 0;\r\n    nlh->nlmsg_seq = 0;\r\n    nlh->nlmsg_pid = DEFAULT_USR_NL_PID;\r\n\r\n    char msg_buf[MAX_NL_MSG_LEN] = {0};\r\n    struct af_msg_hdr *hdr = (struct af_msg_hdr *)msg_buf;\r\n    hdr->magic = 0xa0b0c0d0;\r\n    hdr->len = len;\r\n    char *p_data = msg_buf + sizeof(struct af_msg_hdr);\r\n    memcpy(p_data, msg, len);\r\n\r\n    memcpy(NLMSG_DATA(nlh), msg_buf, len + sizeof(struct af_msg_hdr));\r\n\r\n    ret = sendto(fd, nlh, nlh->nlmsg_len, 0, (struct sockaddr *)&daddr, sizeof(struct sockaddr_nl));\r\n\tfree(nlh);\r\n    if (!ret)\r\n    {\r\n        perror(\"sendto error\\n\");\r\n        return -1;\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nint appfilter_nl_init(void)\r\n{\r\n    int fd;\r\n    struct sockaddr_nl nls;\r\n    fd = socket(AF_NETLINK, SOCK_RAW, OAF_NETLINK_ID);\r\n    if (fd < 0)\r\n    {\r\n        LOG_DEBUG(\"Connect netlink %d failed %s\\n\", OAF_NETLINK_ID, strerror(errno));\r\n        return -1;\r\n    }\r\n    memset(&nls, 0, sizeof(struct sockaddr_nl));\r\n    nls.nl_pid = DEFAULT_USR_NL_PID;\r\n    nls.nl_groups = 0;\r\n    nls.nl_family = AF_NETLINK;\r\n\r\n    if (bind(fd, (void *)&nls, sizeof(struct sockaddr_nl)))\r\n    {\r\n        LOG_DEBUG(\"Bind failed %s\\n\", strerror(errno));\r\n        return -1;\r\n    }\r\n\r\n    return fd;\r\n}\r\n"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/src/appfilter_netlink.h",
    "content": "/*\r\nCopyright (C) 2020 Derry <destan19@126.com>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n#ifndef __APPFILTER_NETLINK_H__\r\n#define __APPFILTER_NETLINK_H__\r\n#define DEFAULT_USR_NL_PID 999\r\n#define OAF_NETLINK_ID 29\r\n#define MAX_OAF_NETLINK_MSG_LEN 1024\r\n#define MAX_AF_MSG_DATA_LEN 800\r\n#define MAX_FEATURE_LINE_LEN 600\r\n\r\nstruct af_msg_hdr\r\n{\r\n    int magic;\r\n    int len;\r\n};\r\n\r\nenum E_MSG_TYPE\r\n{\r\n    AF_MSG_INIT,\r\n    AF_MSG_ADD_FEATURE,\r\n    AF_MSG_CLEAN_FEATURE,\r\n    AF_MSG_MAX\r\n};\r\n\r\ntypedef struct af_msg\r\n{\r\n    int action;\r\n} af_msg_t;\r\n\r\ntypedef struct af_feature_msg{\r\n    af_msg_t hdr;\r\n    char feature[MAX_FEATURE_LINE_LEN];\r\n} af_feature_msg_t;\r\n\r\nint appfilter_nl_init(void);\r\nvoid appfilter_nl_handler(struct uloop_fd *u, unsigned int ev);\r\nint send_msg_to_kernel(int fd, void *msg, int len);\r\n#endif"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/src/appfilter_ubus.c",
    "content": "/*\r\nCopyright (C) 2020 Derry <destan19@126.com>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n#include <unistd.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <libubox/uloop.h>\r\n#include <libubox/utils.h>\r\n#include <libubus.h>\r\n#include <sys/socket.h>\r\n#include <linux/netlink.h>\r\n#include <linux/socket.h>\r\n#include <sys/socket.h>\r\n#include <json-c/json.h>\r\n#include <sys/time.h>\r\n#include <libubox/blobmsg_json.h>\r\n#include <libubox/blobmsg.h>\r\n#include \"appfilter_user.h\"\r\n#include \"appfilter_config.h\"\r\n#include <uci.h>\r\n#include \"appfilter.h\"\r\n#include \"utils.h\"\r\n\r\nextern int g_oaf_config_change;\r\nint g_enable_agent = 0;\r\n\r\nstruct ubus_context *ubus_ctx = NULL;\r\nstatic struct blob_buf b;\r\n\r\nextern char *format_time(int timetamp);\r\n\r\nvoid reload_oaf_rule(){\r\n    system(\"/usr/bin/oaf_rule reload\");\r\n}\r\n\r\nvoid get_hostname_by_mac(char *mac, char *hostname)\r\n{\r\n    if (!mac || !hostname)\r\n        return;\r\n    FILE *fp = fopen(\"/tmp/dhcp.leases\", \"r\");\r\n    if (!fp)\r\n    {\r\n        printf(\"open dhcp lease file....failed\\n\");\r\n        return;\r\n    }\r\n    char line_buf[256] = {0};\r\n    while (fgets(line_buf, sizeof(line_buf), fp))\r\n    {\r\n        char hostname_buf[128] = {0};\r\n        char mac_buf[32] = {0};\r\n        sscanf(line_buf, \"%*s %s %*s %s\", mac_buf, hostname_buf);\r\n        if (0 == strcmp(mac, mac_buf))\r\n        {\r\n            strcpy(hostname, hostname_buf);\r\n        }\r\n    }\r\n    fclose(fp);\r\n}\r\n\r\nint check_app_icon_exist(int app_id)\r\n{\r\n    char icon_path[512];\r\n    snprintf(icon_path, sizeof(icon_path), \"/www/luci-static/resources/app_icons/%d.png\", app_id);\r\n    int with_icon = access(icon_path, F_OK) == 0 ? 1 : 0; \r\n    return with_icon;\r\n}\r\n\r\nvoid ubus_dump_visit_list(struct blob_buf *b, char *mac)\r\n{\r\n    int i, j;\r\n    void *c, *array;\r\n    void *t;\r\n    void *s;\r\n\r\n    array = blobmsg_open_array(b, \"dev_list\");\r\n\r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++)\r\n    {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        while (node)\r\n        {\r\n            if (mac && strcmp(mac, node->mac))\r\n            {\r\n                node = node->next;\r\n                continue;\r\n            }\r\n            t = blobmsg_open_table(b, NULL);\r\n            blobmsg_add_string(b, \"hostname\", \"unknown\");\r\n            blobmsg_add_string(b, \"mac\", node->mac);\r\n            blobmsg_add_string(b, \"ip\", node->ip);\r\n            void *visit_array;\r\n\r\n            visit_array = blobmsg_open_array(b, \"visit_info\");\r\n            for (j = 0; j < MAX_VISIT_HASH_SIZE; j++)\r\n            {\r\n                visit_info_t *p_info = node->visit_htable[j];\r\n                while (p_info)\r\n                {\r\n                    char *first_time_str = format_time(p_info->first_time);\r\n                    char *latest_time_str = format_time(p_info->latest_time);\r\n                    int total_time = p_info->latest_time - p_info->first_time;\r\n                    s = blobmsg_open_table(b, NULL);\r\n                    blobmsg_add_string(b, \"appname\", \"unknown\");\r\n                    blobmsg_add_u32(b, \"appid\", p_info->appid);\r\n                    blobmsg_add_u32(b, \"latest_action\", p_info->action);\r\n                    blobmsg_add_u32(b, \"first_time\", p_info->first_time);\r\n                    blobmsg_add_u32(b, \"latest_time\", p_info->latest_time);\r\n                    blobmsg_close_table(b, s);\r\n                    if (first_time_str)\r\n                        free(first_time_str);\r\n                    if (latest_time_str)\r\n                        free(latest_time_str);\r\n                    p_info = p_info->next;\r\n                }\r\n            }\r\n\r\n            blobmsg_close_array(b, visit_array);\r\n            blobmsg_close_table(b, t);\r\n            node = node->next;\r\n        }\r\n    }\r\n    blobmsg_close_array(b, array);\r\n}\r\n\r\n// Function to compare JSON objects based on the \"lt\" field\r\nint compare_lt(const void *a, const void *b) {\r\n    struct json_object *obj_a = *(struct json_object **)a;\r\n    struct json_object *obj_b = *(struct json_object **)b;\r\n\r\n    struct json_object *lt_a, *lt_b;\r\n    json_object_object_get_ex(obj_a, \"lt\", &lt_a);\r\n    json_object_object_get_ex(obj_b, \"lt\", &lt_b);\r\n\r\n    int lt_val_a = json_object_get_int(lt_a);\r\n    int lt_val_b = json_object_get_int(lt_b);\r\n\r\n    return lt_val_b - lt_val_a;\r\n}\r\n\r\n\r\nstatic int\r\nappfilter_handle_dev_visit_list(struct ubus_context *ctx, struct ubus_object *obj,\r\n                          struct ubus_request_data *req, const char *method,\r\n                          struct blob_attr *msg)\r\n{\r\n    int i, j;\r\n    struct json_object *root_obj = json_object_new_object();\r\n    struct json_object *visit_array = json_object_new_array();\r\n    int page = 0;\r\n    int page_size = 20; // Default page size\r\n\r\n    char *msg_obj_str = blobmsg_format_json(msg, true);\r\n    if (!msg_obj_str)\r\n    {\r\n        printf(\"format json failed\\n\");\r\n        return 0;\r\n    }\r\n\r\n    printf(\"msg_obj_str:%s\\n\", msg_obj_str);\r\n    struct json_object *req_obj = json_tokener_parse(msg_obj_str);\r\n    struct json_object *mac_obj = json_object_object_get(req_obj, \"mac\");\r\n    if (!mac_obj)\r\n    {\r\n        printf(\"mac is null\\n\");\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        return 0;\r\n    }\r\n\r\n    // Parse pagination parameters\r\n    struct json_object *page_obj = json_object_object_get(req_obj, \"page\");\r\n    struct json_object *page_size_obj = json_object_object_get(req_obj, \"page_size\");\r\n    if (page_obj) {\r\n        page = json_object_get_int(page_obj);\r\n    }\r\n    if (page_size_obj) {\r\n        page_size = json_object_get_int(page_size_obj);\r\n        if (page_size <= 0) {\r\n            page_size = 20; // Default to 20 if invalid\r\n        }\r\n    }\r\n\r\n    char *mac = json_object_get_string(mac_obj);\r\n    dev_node_t *node = find_dev_node(mac);\r\n\r\n    if (!node)\r\n    {\r\n        printf(\"not found mac:%s\\n\", mac);\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        return 0;\r\n    }\r\n\r\n    json_object_object_add(root_obj, \"hostname\", json_object_new_string(node->hostname));\r\n    json_object_object_add(root_obj, \"mac\", json_object_new_string(node->mac));\r\n    json_object_object_add(root_obj, \"ip\", json_object_new_string(node->ip));\r\n\r\n    for (j = 0; j < MAX_VISIT_HASH_SIZE; j++)\r\n    { \r\n        visit_info_t *p_info = node->visit_htable[j];\r\n        while (p_info)\r\n        {\r\n            char *first_time_str = format_time(p_info->first_time);\r\n            char *latest_time_str = format_time(p_info->latest_time);\r\n            int total_time = p_info->latest_time - p_info->first_time;\r\n            if (strlen(get_app_name_by_id(p_info->appid)) == 0){\r\n                p_info = p_info->next;\r\n                if (first_time_str)\r\n                    free(first_time_str);\r\n                if (latest_time_str)\r\n                    free(latest_time_str);\r\n                continue;\r\n            }\r\n            struct json_object *visit_obj = json_object_new_object();\r\n            json_object_object_add(visit_obj, \"name\", json_object_new_string(get_app_name_by_id(p_info->appid)));\r\n            json_object_object_add(visit_obj, \"id\", json_object_new_int(p_info->appid));\r\n            if (check_app_icon_exist(p_info->appid)) {\r\n                json_object_object_add(visit_obj, \"icon\", json_object_new_int(1));\r\n            }\r\n            else\r\n                json_object_object_add(visit_obj, \"icon\", json_object_new_int(0));\r\n            json_object_object_add(visit_obj, \"act\", json_object_new_int(p_info->action));\r\n            json_object_object_add(visit_obj, \"ft\", json_object_new_int(p_info->first_time));\r\n            json_object_object_add(visit_obj, \"lt\", json_object_new_int(p_info->latest_time));\r\n            json_object_object_add(visit_obj, \"tt\", json_object_new_int(total_time));\r\n            json_object_array_add(visit_array, visit_obj);\r\n\r\n            if (first_time_str)\r\n                free(first_time_str);\r\n            if (latest_time_str)\r\n                free(latest_time_str);\r\n            p_info = p_info->next;\r\n        }\r\n    }\r\n\r\n    json_object_array_sort(visit_array, compare_lt);\r\n\r\n    int total_count = json_object_array_length(visit_array);\r\n\r\n    struct json_object *paged_array = NULL;\n    if (page <= 0) {\n        /* Reuse visit_array as response data while keeping a local reference for cleanup. */\n        paged_array = json_object_get(visit_array);\n    } else {\n        paged_array = json_object_new_array();\n        int start_idx = (page - 1) * page_size;\n        int end_idx = start_idx + page_size;\n        int i;\n        for (i = start_idx; i < end_idx && i < total_count; i++) {\n            struct json_object *visit_obj = json_object_array_get_idx(visit_array, i);\r\n            if (visit_obj) {\r\n                json_object_get(visit_obj);\r\n                json_object_array_add(paged_array, visit_obj);\r\n            }\r\n        }\r\n    }\r\n\r\n    json_object_object_add(root_obj, \"total\", json_object_new_int(total_count));\r\n    json_object_object_add(root_obj, \"list\", paged_array);\r\n    json_object_object_add(root_obj, \"page\", json_object_new_int(page));\r\n    json_object_object_add(root_obj, \"page_size\", json_object_new_int(page_size));\r\n    \r\n    int total_pages = 0;\r\n    if (page_size > 0) {\r\n        total_pages = (total_count + page_size - 1) / page_size; // Ceiling division\r\n    }\r\n    json_object_object_add(root_obj, \"total_pages\", json_object_new_int(total_pages));\n    json_object_put(visit_array);\n\r\n    if (req_obj) {\r\n        json_object_put(req_obj);\r\n    }\r\n    if (msg_obj_str) {\r\n        free(msg_obj_str);\r\n    }\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, root_obj);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    json_object_put(root_obj);\r\n    return 0;\r\n}\r\n\r\n\r\nvoid update_app_visit_time_list(char *mac, struct app_visit_stat_info *visit_info)\r\n{\r\n    int i, j, s;\r\n    int num = 0;\r\n\r\n    dev_node_t *node = find_dev_node(mac);\r\n    if (!node)\r\n    {\r\n        printf(\"not found mac:%s\\n\", mac);\r\n        return;\r\n    }\r\n    for (i = 0; i < MAX_APP_TYPE; i++)\r\n    {\r\n        for (j = 0; j < MAX_APP_ID_NUM; j++)\r\n        {\r\n            unsigned long long min = visit_info->visit_list[0].total_time;\r\n            int min_index = 0;\r\n            if (node->stat[i][j].total_time == 0)\r\n                continue;\r\n            if (num < MAX_APP_STAT_NUM)\r\n            {\r\n                min_index = num;\r\n            }\r\n            else\r\n            {\r\n                for (s = 0; s < MAX_APP_STAT_NUM; s++)\r\n                {\r\n                    if (visit_info->visit_list[s].total_time < min)\r\n                    {\r\n                        min_index = s;\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n            num++;\r\n            if (node->stat[i][j].total_time > visit_info->visit_list[min_index].total_time)\r\n            {\r\n                visit_info->visit_list[min_index].total_time = node->stat[i][j].total_time;\r\n                visit_info->visit_list[min_index].app_id = (i + 1) * 1000 + j + 1;\r\n            }\r\n        }\r\n    }\r\n    if (num < MAX_APP_STAT_NUM)\r\n        visit_info->num = num;\r\n    else\r\n        visit_info->num = MAX_APP_STAT_NUM;\r\n}\r\n\r\nvoid update_app_class_visit_time_list(char *mac, int *visit_time)\r\n{\r\n    int i, j, s;\r\n    int num = 0;\r\n\r\n    dev_node_t *node = find_dev_node(mac);\r\n    if (!node)\r\n    {\r\n        printf(\"not found mac:%s\\n\", mac);\r\n        return;\r\n    }\r\n    for (i = 0; i < MAX_APP_TYPE; i++)\r\n    {\r\n        for (j = 0; j < MAX_APP_ID_NUM; j++)\r\n        {\r\n            if (node->stat[i][j].total_time == 0)\r\n                continue;\r\n            visit_time[i] += node->stat[i][j].total_time;\r\n        }\r\n    }\r\n}\r\n\r\nvoid ubus_get_dev_visit_time_info(char *mac, struct blob_buf *b)\r\n{\r\n    int i, j;\r\n    void *c, *array;\r\n    void *t;\r\n    void *s;\r\n    struct app_visit_stat_info info;\r\n    memset((char *)&info, 0x0, sizeof(info));\r\n    update_app_visit_time_list(mac, &info);\r\n}\r\n\r\nstatic int\r\nappfilter_handle_visit_list(struct ubus_context *ctx, struct ubus_object *obj,\r\n                            struct ubus_request_data *req, const char *method,\r\n                            struct blob_attr *msg)\r\n{\r\n    int ret;\r\n    blob_buf_init(&b, 0);\r\n    char *msg_obj_str = blobmsg_format_json(msg, true);\r\n    if (!msg_obj_str)\r\n    {\r\n        printf(\"format json failed\\n\");\r\n        return 0;\r\n    }\r\n\r\n    struct json_object *req_obj = json_tokener_parse(msg_obj_str);\r\n    struct json_object *mac_obj = json_object_object_get(req_obj, \"mac\");\r\n\r\n    if (!mac_obj)\r\n    {\r\n        ubus_dump_visit_list(&b, NULL);\r\n    }\r\n    else\r\n        ubus_dump_visit_list(&b, json_object_get_string(mac_obj));\r\n    ubus_send_reply(ctx, req, b.head);\r\n    json_object_put(req_obj);\r\n    free(msg_obj_str);\r\n    return 0;\r\n}\r\nstatic int handle_debug(struct ubus_context *ctx, struct ubus_object *obj,\r\n                            struct ubus_request_data *req, const char *method,\r\n                            struct blob_attr *msg)\r\n{\r\n    int ret;\r\n    blob_buf_init(&b, 0);\r\n    char *msg_obj_str = blobmsg_format_json(msg, true);\r\n    if (!msg_obj_str)\r\n    {\r\n        printf(\"format json failed\\n\");\r\n        return 0;\r\n    }\r\n\r\n    struct json_object *req_obj = json_tokener_parse(msg_obj_str);\r\n    struct json_object *debug_obj = json_object_object_get(req_obj, \"debug\");\r\n\r\n    if (debug_obj)\r\n    {\r\n        current_log_level = json_object_get_int(debug_obj);\r\n        LOG_WARN(\"debug level set to %d\\n\", current_log_level);\r\n    }\r\n\r\n    ubus_send_reply(ctx, req, b.head);\r\n    json_object_put(req_obj);\r\n    free(msg_obj_str);\r\n    return 0;\r\n}\r\n\r\n\r\n\r\ntypedef struct app_visit_time_info\r\n{\r\n    int app_id;\r\n    unsigned long long total_time;\r\n} app_visit_time_info_t;\r\n\r\nint visit_time_compare(const void *a, const void *b)\r\n{\r\n    app_visit_time_info_t *p1 = (app_visit_time_info_t *)a;\r\n    app_visit_time_info_t *p2 = (app_visit_time_info_t *)b;\r\n    return p1->total_time < p2->total_time ? 1 : -1;\r\n}\r\n\r\n#define MAX_STAT_APP_NUM 128\r\nvoid update_top5_app(dev_node_t *node, app_visit_time_info_t top5_app_list[])\r\n{\r\n    int i, j;\r\n    app_visit_time_info_t app_visit_array[MAX_STAT_APP_NUM];\r\n    memset(app_visit_array, 0x0, sizeof(app_visit_array));\r\n    int app_visit_num = 0;\r\n\r\n    for (i = 0; i < MAX_APP_TYPE; i++)\r\n    {\r\n        for (j = 0; j < MAX_APP_ID_NUM; j++)\r\n        {\r\n            if (node->stat[i][j].total_time == 0)\r\n                continue;\r\n            app_visit_array[app_visit_num].app_id = (i + 1) * 1000 + j + 1;\r\n            app_visit_array[app_visit_num].total_time = node->stat[i][j].total_time;\r\n            app_visit_num++;\r\n        }\r\n    }\r\n\r\n    qsort((void *)app_visit_array, app_visit_num, sizeof(app_visit_time_info_t), visit_time_compare);\r\n#if 0\r\nfor (i = 0; i < app_visit_num; i++){\r\nprintf(\"appid %d-----------total time %llu\\n\", app_visit_array[i].app_id,\r\napp_visit_array[i].total_time);\r\n}\r\n#endif\r\n    for (i = 0; i < 5; i++)\r\n    {\r\n        top5_app_list[i] = app_visit_array[i];\r\n    }\r\n}\r\n\r\nstatic int\r\nappfilter_handle_dev_list(struct ubus_context *ctx, struct ubus_object *obj,\r\n                          struct ubus_request_data *req, const char *method,\r\n                          struct blob_attr *msg)\r\n{\r\n    int i, j;\r\n    struct json_object *root_obj = json_object_new_object();\r\n\r\n    struct json_object *dev_array = json_object_new_array();\r\n    int count = 0;\r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++)\r\n    {\r\n\r\n        dev_node_t *node = dev_hash_table[i];\r\n        while (node)\r\n        {\r\n            struct json_object *dev_obj = json_object_new_object();\r\n            struct json_object *app_array = json_object_new_array();\r\n            app_visit_time_info_t top5_app_list[5];\r\n            memset(top5_app_list, 0x0, sizeof(top5_app_list));\r\n            update_top5_app(node, top5_app_list);\r\n\r\n            for (j = 0; j < 5; j++)\r\n            {\r\n                if (top5_app_list[j].app_id == 0 || strlen(get_app_name_by_id(top5_app_list[j].app_id)) == 0)\r\n                    break;\r\n                struct json_object *app_obj = json_object_new_object();\r\n                json_object_object_add(app_obj, \"id\", json_object_new_int(top5_app_list[j].app_id));\r\n                json_object_object_add(app_obj, \"name\", json_object_new_string(get_app_name_by_id(top5_app_list[j].app_id)));\r\n                json_object_array_add(app_array, app_obj);\r\n            }\r\n\r\n            json_object_object_add(dev_obj, \"applist\", app_array);\r\n            json_object_object_add(dev_obj, \"mac\", json_object_new_string(node->mac));\r\n            char hostname[128] = {0};\r\n            get_hostname_by_mac(node->mac, hostname);\r\n            json_object_object_add(dev_obj, \"ip\", json_object_new_string(node->ip));\r\n\r\n            json_object_object_add(dev_obj, \"online\", json_object_new_int(1));\r\n            json_object_object_add(dev_obj, \"hostname\", json_object_new_string(hostname));\r\n            json_object_object_add(dev_obj, \"nickname\", json_object_new_string(\"\"));\r\n\r\n\r\n            json_object_array_add(dev_array, dev_obj);\r\n\r\n            node = node->next;\r\n            count++;\r\n        }\r\n    }\r\n\r\nEND:\r\n\r\n    json_object_object_add(root_obj, \"devlist\", dev_array);\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, root_obj);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    json_object_put(root_obj);\r\n    return 0;\r\n}\r\n\r\n\r\nstatic int appfilter_handle_visit_time(struct ubus_context *ctx, struct ubus_object *obj,\r\n                            struct ubus_request_data *req, const char *method,\r\n                            struct blob_attr *msg)\r\n{\r\n    int ret;\r\n    struct app_visit_stat_info info;\r\n    blob_buf_init(&b, 0);\r\n    memset((char *)&info, 0x0, sizeof(info));\r\n    char *msg_obj_str = blobmsg_format_json(msg, true);\r\n    if (!msg_obj_str)\r\n    {\r\n        printf(\"format json failed\\n\");\r\n        return 0;\r\n    }\r\n\r\n    struct json_object *req_obj = json_tokener_parse(msg_obj_str);\r\n    struct json_object *mac_obj = json_object_object_get(req_obj, \"mac\");\r\n    if (!mac_obj)\r\n    {\r\n        printf(\"mac is NULL\\n\");\r\n        return 0;\r\n    }\r\n    update_app_visit_time_list(json_object_get_string(mac_obj), &info);\r\n\r\n    struct json_object *resp_obj = json_object_new_object();\r\n    struct json_object *app_info_array = json_object_new_array();\r\n    json_object_object_add(resp_obj, \"list\", app_info_array);\r\n    json_object_object_add(resp_obj, \"total_num\", json_object_new_int(info.num));\r\n    int i;\r\n    for (i = 0; i < info.num; i++)\r\n    {\r\n        if (strlen(get_app_name_by_id(info.visit_list[i].app_id)) == 0){\r\n            continue;\r\n        }\r\n        struct json_object *app_info_obj = json_object_new_object();\r\n        json_object_object_add(app_info_obj, \"id\", json_object_new_int(info.visit_list[i].app_id));\r\n        json_object_object_add(app_info_obj, \"name\", json_object_new_string(get_app_name_by_id(info.visit_list[i].app_id)));\r\n        json_object_object_add(app_info_obj, \"t\", json_object_new_int(info.visit_list[i].total_time));\r\n        json_object_array_add(app_info_array, app_info_obj);\r\n    }\r\n\r\n    blobmsg_add_object(&b, resp_obj);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    json_object_put(resp_obj);\r\n    json_object_put(req_obj);\r\n    free(msg_obj_str);\r\n    return 0;\r\n}\r\n\r\nstatic int\r\nhandle_app_class_visit_time(struct ubus_context *ctx, struct ubus_object *obj,\r\n                            struct ubus_request_data *req, const char *method,\r\n                            struct blob_attr *msg)\r\n{\r\n    int ret;\r\n    int i;\r\n    blob_buf_init(&b, 0);\r\n    char *msg_obj_str = blobmsg_format_json(msg, true);\r\n    if (!msg_obj_str)\r\n    {\r\n        printf(\"format json failed\\n\");\r\n        return 0;\r\n    }\r\n\r\n    struct json_object *req_obj = json_tokener_parse(msg_obj_str);\r\n    struct json_object *mac_obj = json_object_object_get(req_obj, \"mac\");\r\n    if (!mac_obj)\r\n    {\r\n        printf(\"mac is NULL\\n\");\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        return 0;\r\n    }\r\n    int app_class_visit_time[MAX_APP_TYPE];\r\n    memset(app_class_visit_time, 0x0, sizeof(app_class_visit_time));\r\n    update_app_class_visit_time_list(json_object_get_string(mac_obj), app_class_visit_time);\r\n\r\n    struct json_object *resp_obj = json_object_new_object();\r\n    struct json_object *app_class_array = json_object_new_array();\r\n    json_object_object_add(resp_obj, \"class_list\", app_class_array);\r\n    for (i = 0; i < MAX_APP_TYPE; i++)\r\n    {\r\n        if (i >= g_cur_class_num)\r\n            break;\r\n        struct json_object *app_class_obj = json_object_new_object();\r\n        json_object_object_add(app_class_obj, \"type\", json_object_new_int(i));\r\n        json_object_object_add(app_class_obj, \"name\", json_object_new_string(CLASS_NAME_TABLE[i]));\r\n        json_object_object_add(app_class_obj, \"visit_time\", json_object_new_int(app_class_visit_time[i]));\r\n        json_object_array_add(app_class_array, app_class_obj);\r\n    }\r\n\r\n    blobmsg_add_object(&b, resp_obj);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    json_object_put(resp_obj);\r\n    json_object_put(req_obj);\r\n    free(msg_obj_str);\r\n    return 0;\r\n}\r\n\r\n\r\nstatic int parse_feature_cfg(struct json_object *class_list) {\r\n    FILE *file = fopen(\"/tmp/feature.cfg\", \"r\");\r\n    if (!file) {\r\n        perror(\"Failed to open /tmp/feature.cfg\");\r\n        return -1;\r\n    }\r\n\r\n\tchar line[1024];\r\n    char app_buf[128];\r\n    struct json_object *current_class = NULL;\r\n    struct json_object *app_list = NULL;\r\n\r\n    while (fgets(line, sizeof(line), file)) {\r\n        line[strcspn(line, \"\\n\")] = 0;\r\n\r\n        if (strncmp(line, \"#class\", 6) == 0) {\r\n            if (current_class) {\r\n                json_object_object_add(current_class, \"app_list\", app_list);\r\n                json_object_array_add(class_list, current_class);\r\n            }\r\n\r\n            char *name = strtok(line + 7, \" \");\r\n            char *class_name = NULL;\r\n            while (name != NULL) {\r\n                class_name = name; \r\n                name = strtok(NULL, \" \");\r\n            }\r\n            current_class = json_object_new_object();\r\n            json_object_object_add(current_class, \"name\", json_object_new_string(class_name));\r\n            app_list = json_object_new_array();\r\n        } else if (current_class) {\r\n            char *p_end = strstr(line, \":\");\r\n            if (!p_end) {\r\n                continue;\r\n            }\r\n            strncpy(app_buf, line, p_end - line);\r\n            app_buf[p_end - line] = '\\0';\r\n            char *appid_str = strtok(app_buf, \" \");\r\n            char *name = strtok(NULL, \" \");\r\n            if (appid_str && name) {\r\n                char combined[256];\r\n                char icon_path[512];\r\n                snprintf(icon_path, sizeof(icon_path), \"/www/luci-static/resources/app_icons/%s.png\", appid_str);\r\n                int with_icon = access(icon_path, F_OK) == 0 ? 1 : 0; \r\n                snprintf(combined, sizeof(combined), \"%s,%s,%d\", appid_str, name, with_icon);\r\n                json_object_array_add(app_list, json_object_new_string(combined));\r\n            }\r\n        }\r\n    }\r\n\r\n    // Add the last class to the class list\r\n    if (current_class) {\r\n        json_object_object_add(current_class, \"app_list\", app_list);\r\n        json_object_array_add(class_list, current_class);\r\n    }\r\n\r\n    fclose(file);\r\n    return 0;\r\n}\r\n\r\nstatic int handle_get_class_list(struct ubus_context *ctx, struct ubus_object *obj,\r\n                                 struct ubus_request_data *req, const char *method,\r\n                                 struct blob_attr *msg) {\r\n    struct json_object *response = json_object_new_object();\r\n    struct json_object *class_list = json_object_new_array();\r\n\r\n    if (parse_feature_cfg(class_list) != 0) {\r\n        json_object_put(response);\r\n        return UBUS_STATUS_UNKNOWN_ERROR;\r\n    }\r\n\r\n    json_object_object_add(response, \"class_list\", class_list);\r\n\r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n\r\n    return 0;\r\n}\r\n#define MAX_APPFILTER_STR_LEN 8192\r\nstatic int handle_get_app_filter(struct ubus_context *ctx, struct ubus_object *obj,\r\n                                 struct ubus_request_data *req, const char *method,\r\n                                 struct blob_attr *msg) {\r\n\r\n    int i;\r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        printf(\"Failed to allocate UCI context\\n\");\r\n        return 0;\r\n    }\r\n    char *appfilter_buf = (char *)malloc(MAX_APPFILTER_STR_LEN);\r\n    if (!appfilter_buf){\r\n        return 0;\r\n    }\r\n    appfilter_buf[0] = '\\0';\r\n    struct json_object *response = json_object_new_object();\r\n    struct json_object *app_list = json_object_new_array();\r\n    af_uci_get_list_value(uci_ctx, \"appfilter.rule.app_list\", appfilter_buf, MAX_APPFILTER_STR_LEN - 1, \" \");\r\n    char *app_id_str = strtok(appfilter_buf, \" \");\r\n    while (app_id_str) {\r\n        json_object_array_add(app_list, json_object_new_int(atoi(app_id_str)));\r\n        app_id_str = strtok(NULL, \" \");\r\n    }\r\n    json_object_object_add(response, \"app_list\", app_list);\r\n    uci_free_context(uci_ctx);\r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    free(appfilter_buf);\r\n    json_object_put(response);\r\n    return 0;\r\n}\r\n\r\n\r\n\r\nvoid af_forward_msg_to_agent(char *api, char *msg_str, int msg_len)\r\n{\r\n\tif (!api || !msg_str || !msg_len)\r\n\t\treturn;\r\n\tchar *cmd_buf = (char *)malloc(msg_len + 128);\r\n\tif (!cmd_buf)\r\n\t\treturn;\r\n\tsprintf(cmd_buf, \"ubus -t 2 call oaf_agent %s '%s'\", api, msg_str);\r\n\tprintf(\"exec %s\\n\", cmd_buf);\r\n\tsystem(cmd_buf);\r\n\tfree(cmd_buf);\r\n}\r\n\r\n\r\nstatic int handle_set_app_filter(struct ubus_context *ctx, struct ubus_object *obj,\r\n                                 struct ubus_request_data *req, const char *method,\r\n                                 struct blob_attr *msg) {\r\n    printf(\"handle_set_app_filter\\n\");\r\n    struct json_object *response = json_object_new_object();\r\n    int i;\r\n    char *msg_obj_str = blobmsg_format_json(msg, true);\r\n    if (!msg_obj_str) {\r\n        printf(\"format json failed\\n\");\r\n        return 0;\r\n    }\r\n    printf(\"msg_obj_str: %s\\n\", msg_obj_str);\r\n    struct json_object *req_obj = json_tokener_parse(msg_obj_str);\r\n    struct json_object *app_list = json_object_object_get(req_obj, \"app_list\");\r\n    if (!app_list) {\r\n        printf(\"app_list is NULL\\n\");\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return 0;\r\n    }\r\n\r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        printf(\"Failed to allocate UCI context\\n\");\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return 0;\r\n    }\r\n\r\n   af_uci_delete(uci_ctx, \"appfilter.rule.app_list\");\r\n\r\n   int len = json_object_array_length(app_list);\r\n    for (i = 0; i < json_object_array_length(app_list); i++) {\r\n        struct json_object *app_id_obj = json_object_array_get_idx(app_list, i);\r\n        af_uci_add_int_list(uci_ctx, \"appfilter.rule.app_list\", json_object_get_int(app_id_obj));\r\n    }\r\n    af_uci_commit(uci_ctx, \"appfilter\");\r\n    reload_oaf_rule();\r\n    g_oaf_config_change = 1;\r\n\r\n    uci_free_context(uci_ctx);\r\n    json_object_put(req_obj);\r\n    free(msg_obj_str);\r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n    return 0;\r\n}\r\n\r\n\r\n\r\n\r\nstatic int handle_get_app_filter_base(struct ubus_context *ctx, struct ubus_object *obj,\r\n                                 struct ubus_request_data *req, const char *method,\r\n                                 struct blob_attr *msg) {\r\n    struct json_object *response = json_object_new_object();\r\n    struct json_object *data_obj = json_object_new_object();\r\n    int i;\r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        printf(\"Failed to allocate UCI context\\n\");\r\n        return 0;\r\n    }\r\n    int enable = 0;\r\n    int work_mode = 0;\r\n    int record_enable = 0;\r\n    int disable_quic = 0;\r\n    int app_filter_mode = 0;\r\n    enable = af_uci_get_int_value(uci_ctx, \"appfilter.global.enable\");\r\n    work_mode = af_uci_get_int_value(uci_ctx, \"appfilter.global.work_mode\");\r\n    record_enable = af_uci_get_int_value(uci_ctx, \"appfilter.global.record_enable\");\r\n    disable_quic = af_uci_get_int_value(uci_ctx, \"appfilter.global.disable_quic\");\r\n    app_filter_mode = af_uci_get_int_value(uci_ctx, \"appfilter.global.app_filter_mode\");\r\n    if (app_filter_mode < 0) {\r\n        app_filter_mode = 0; // Default to specified apps mode\r\n    }\r\n\r\n\r\n    json_object_object_add(data_obj, \"enable\", json_object_new_int(enable));\r\n    json_object_object_add(data_obj, \"work_mode\", json_object_new_int(work_mode));\r\n    json_object_object_add(data_obj, \"record_enable\", json_object_new_int(record_enable));\r\n    json_object_object_add(data_obj, \"disable_quic\", json_object_new_int(disable_quic));\r\n    json_object_object_add(data_obj, \"app_filter_mode\", json_object_new_int(app_filter_mode));\r\n\r\n\r\n    json_object_object_add(response, \"data\", data_obj);\r\n    uci_free_context(uci_ctx);\r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n    return 0;\r\n}\r\n\r\nstatic int handle_set_app_filter_base(struct ubus_context *ctx, struct ubus_object *obj,\r\n                                 struct ubus_request_data *req, const char *method,\r\n                                 struct blob_attr *msg) {\r\n    printf(\"handle_set_app_filter_base\\n\");\r\n    struct json_object *response = json_object_new_object();\r\n    int i;\r\n    char *msg_obj_str = blobmsg_format_json(msg, true);\r\n    if (!msg_obj_str) {\r\n        printf(\"format json failed\\n\");\r\n        return 0;\r\n    }\r\n    printf(\"msg_obj_str: %s\\n\", msg_obj_str);\r\n    struct json_object *req_obj = json_tokener_parse(msg_obj_str);\r\n    struct json_object *enable_obj = json_object_object_get(req_obj, \"enable\");\r\n    struct json_object *record_enable_obj = json_object_object_get(req_obj, \"record_enable\");\r\n    struct json_object *work_mode_obj = json_object_object_get(req_obj, \"work_mode\");\r\n    struct json_object *disable_quic_obj = json_object_object_get(req_obj, \"disable_quic\");\r\n    struct json_object *app_filter_mode_obj = json_object_object_get(req_obj, \"app_filter_mode\");\r\n    if (!enable_obj || !work_mode_obj) {\r\n        printf(\"enable_obj or work_mode_obj is NULL\\n\");\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return 0;\r\n    }\r\n    printf(\"enable_obj: %d\\n\", json_object_get_int(enable_obj));\r\n    printf(\"work_mode_obj: %d\\n\", json_object_get_int(work_mode_obj));\r\n\r\n\r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        printf(\"Failed to allocate UCI context\\n\");\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return 0;\r\n    }\r\n\r\n    af_uci_set_int_value(uci_ctx, \"appfilter.global.enable\", json_object_get_int(enable_obj));\r\n    af_uci_set_int_value(uci_ctx, \"appfilter.global.work_mode\", json_object_get_int(work_mode_obj));\r\n    \r\n    if (record_enable_obj)\r\n        af_uci_set_int_value(uci_ctx, \"appfilter.global.record_enable\", json_object_get_int(record_enable_obj));\r\n    else\r\n        af_uci_set_int_value(uci_ctx, \"appfilter.global.record_enable\", 0);\r\n    \r\n    if (disable_quic_obj)\r\n        af_uci_set_int_value(uci_ctx, \"appfilter.global.disable_quic\", json_object_get_int(disable_quic_obj));\r\n    else\r\n        af_uci_set_int_value(uci_ctx, \"appfilter.global.disable_quic\", 0);\r\n    \r\n    if (app_filter_mode_obj)\r\n        af_uci_set_int_value(uci_ctx, \"appfilter.global.app_filter_mode\", json_object_get_int(app_filter_mode_obj));\r\n    else\r\n        af_uci_set_int_value(uci_ctx, \"appfilter.global.app_filter_mode\", 0);\r\n\r\n\r\n    af_uci_commit(uci_ctx, \"appfilter\");\r\n    reload_oaf_rule();\r\n    g_oaf_config_change = 1;\r\n    uci_free_context(uci_ctx);\r\n    json_object_put(req_obj);\r\n    free(msg_obj_str);\r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n    return 0;\r\n}\r\n\r\n\r\nstatic int handle_get_app_filter_adv(struct ubus_context *ctx, struct ubus_object *obj,\r\n                                 struct ubus_request_data *req, const char *method,\r\n                                 struct blob_attr *msg) {\r\n    struct json_object *response = json_object_new_object();\r\n    struct json_object *data_obj = json_object_new_object();\r\n\r\n    int i;\r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        printf(\"Failed to allocate UCI context\\n\");\r\n        return 0;\r\n    }\r\n    char lan_ifname[16];\r\n\r\n    int tcp_rst = af_uci_get_int_value(uci_ctx, \"appfilter.global.tcp_rst\");\r\n    af_uci_get_value(uci_ctx, \"appfilter.global.lan_ifname\", lan_ifname, sizeof(lan_ifname));\r\n    int disable_hnat = af_uci_get_int_value(uci_ctx, \"appfilter.global.disable_hnat\");\r\n    int auto_load_engine = af_uci_get_int_value(uci_ctx, \"appfilter.global.auto_load_engine\");\r\n\r\n    json_object_object_add(data_obj, \"tcp_rst\", json_object_new_int(tcp_rst));\r\n    json_object_object_add(data_obj, \"lan_ifname\", json_object_new_string(lan_ifname));\r\n    json_object_object_add(data_obj, \"disable_hnat\", json_object_new_int(disable_hnat));\r\n    json_object_object_add(data_obj, \"auto_load_engine\", json_object_new_int(auto_load_engine));\r\n\r\n    json_object_object_add(response, \"data\", data_obj);\r\n    uci_free_context(uci_ctx);\r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n    return 0;\r\n}\r\nstatic int handle_set_app_filter_adv(struct ubus_context *ctx, struct ubus_object *obj,\r\n                                 struct ubus_request_data *req, const char *method,\r\n                                 struct blob_attr *msg) {\r\n    struct json_object *response = json_object_new_object();\r\n    int i;\r\n    char *msg_obj_str = blobmsg_format_json(msg, true);\r\n    if (!msg_obj_str) {\r\n        printf(\"format json failed\\n\");\r\n        return 0;\r\n    }\r\n    printf(\"msg_obj_str: %s\\n\", msg_obj_str);\r\n    struct json_object *req_obj = json_tokener_parse(msg_obj_str);\r\n    struct json_object *tcp_rst_obj = json_object_object_get(req_obj, \"tcp_rst\");\r\n    struct json_object *lan_ifname_obj = json_object_object_get(req_obj, \"lan_ifname\");\r\n    struct json_object *disable_hnat_obj = json_object_object_get(req_obj, \"disable_hnat\");\r\n    struct json_object *auto_load_engine_obj = json_object_object_get(req_obj, \"auto_load_engine\");\r\n\r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        printf(\"Failed to allocate UCI context\\n\");\r\n        return 0;\r\n    }\r\n\r\n    if (tcp_rst_obj)\r\n        af_uci_set_int_value(uci_ctx, \"appfilter.global.tcp_rst\", json_object_get_int(tcp_rst_obj));\r\n    if (lan_ifname_obj)\r\n        af_uci_set_value(uci_ctx, \"appfilter.global.lan_ifname\", json_object_get_string(lan_ifname_obj));\r\n    if (disable_hnat_obj)\r\n        af_uci_set_int_value(uci_ctx, \"appfilter.global.disable_hnat\", json_object_get_int(disable_hnat_obj));\r\n    if (auto_load_engine_obj){\r\n        af_uci_set_int_value(uci_ctx, \"appfilter.global.auto_load_engine\", json_object_get_int(auto_load_engine_obj));\r\n        if (json_object_get_int(auto_load_engine_obj) == 0){\r\n            system(\"rm /etc/modules.d/oaf\");\r\n        }\r\n    }\r\n\r\n\r\n    af_uci_commit(uci_ctx, \"appfilter\");\r\n    g_oaf_config_change = 1;\r\n    reload_oaf_rule();\r\n    system(\"/usr/bin/hnat.sh &\");\r\n    if (g_enable_agent) {\r\n        af_forward_msg_to_agent(\"set_app_filter_adv\", msg_obj_str, strlen(msg_obj_str));\r\n    }\r\n    uci_free_context(uci_ctx);\r\n    json_object_put(req_obj);\r\n    free(msg_obj_str);\r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n    return 0;\r\n}\r\n\r\n\r\nstatic int handle_get_app_filter_time(struct ubus_context *ctx, struct ubus_object *obj,\r\n                                 struct ubus_request_data *req, const char *method,\r\n                                 struct blob_attr *msg) {\r\n    struct json_object *response = json_object_new_object();\r\n    struct json_object *data_obj = json_object_new_object();\r\n    \r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        printf(\"Failed to allocate UCI context\\n\");\r\n        return 0;\r\n    }\r\n\r\n    // Get current system time (format: 2025/2/27 10:00)\r\n    time_t now = time(NULL);\r\n    struct tm *current_time = localtime(&now);\r\n    char current_time_str[64] = {0};\r\n    snprintf(current_time_str, sizeof(current_time_str), \"%d/%d/%d %d:%02d\",\r\n             current_time->tm_year + 1900,\r\n             current_time->tm_mon + 1,\r\n             current_time->tm_mday,\r\n             current_time->tm_hour,\r\n             current_time->tm_min);\r\n    json_object_object_add(data_obj, \"current_time\", json_object_new_string(current_time_str));\r\n\r\n    // Get time_mode\r\n    int time_mode = af_uci_get_int_value(uci_ctx, \"appfilter.time.time_mode\");\r\n    json_object_object_add(data_obj, \"mode\", json_object_new_int(time_mode));\r\n\r\n    // Get days (global weekday_list)\r\n    char days_str[128] = {0};\r\n    af_uci_get_value(uci_ctx, \"appfilter.time.days\", days_str, sizeof(days_str));\r\n    printf(\"days_str: %s\\n\", days_str);\r\n    struct json_object *days_array = json_object_new_array();\r\n    char *day = strtok(days_str, \" \");\r\n    while (day) {\r\n        json_object_array_add(days_array, json_object_new_int(atoi(day)));\r\n        day = strtok(NULL, \" \");\r\n    }\r\n    json_object_object_add(data_obj, \"weekday_list\", days_array);\r\n\r\n    // Get start_time and end_time\r\n    char start_time[32] = {0};\r\n    char end_time[32] = {0};\r\n    af_uci_get_value(uci_ctx, \"appfilter.time.start_time\", start_time, sizeof(start_time));\r\n    af_uci_get_value(uci_ctx, \"appfilter.time.end_time\", end_time, sizeof(end_time));\r\n    json_object_object_add(data_obj, \"start_time\", json_object_new_string(start_time));\r\n    json_object_object_add(data_obj, \"end_time\", json_object_new_string(end_time));\r\n\r\n    // Get deny_time and allow_time\r\n    int deny_time = af_uci_get_int_value(uci_ctx, \"appfilter.time.deny_time\");\r\n    int allow_time = af_uci_get_int_value(uci_ctx, \"appfilter.time.allow_time\");\r\n    json_object_object_add(data_obj, \"deny_time\", json_object_new_int(deny_time));\r\n    json_object_object_add(data_obj, \"allow_time\", json_object_new_int(allow_time));\r\n\r\n    // Get time list and parse into objects with start_time and end_time\r\n    char time_str[MAX_TIME_LIST_LEN] = {0};\r\n    af_uci_get_list_value(uci_ctx, \"appfilter.time.time\", time_str, sizeof(time_str), \" \");\r\n    printf(\"time_str from uci: %s\\n\", time_str);\r\n    struct json_object *time_array = json_object_new_array();\r\n    \r\n    // Parse global weekday_list (used as fallback if time period doesn't have weekdays)\r\n    int global_weekdays[7] = {0};\r\n    char days_str_copy[128] = {0};\r\n    strncpy(days_str_copy, days_str, sizeof(days_str_copy) - 1);\r\n    char *day_token = strtok(days_str_copy, \" \");\r\n    while (day_token) {\r\n        int day_val = atoi(day_token);\r\n        if (day_val >= 0 && day_val < 7) {\r\n            global_weekdays[day_val] = 1;\r\n        }\r\n        day_token = strtok(NULL, \" \");\r\n    }\r\n    \r\n    char time_str_copy[MAX_TIME_LIST_LEN] = {0};\r\n    strncpy(time_str_copy, time_str, sizeof(time_str_copy) - 1);\r\n    printf(\"ubus parsing time_str_copy: %s\\n\", time_str_copy);\r\n    \r\n    // Use strtok_r (reentrant version) to avoid issues with nested strtok calls\r\n    char *saveptr1 = NULL;\r\n    char *time_period = strtok_r(time_str_copy, \" \", &saveptr1);\r\n    int period_count = 0;\r\n    \r\n    while (time_period) {\r\n        period_count++;\r\n        printf(\"ubus parsing period[%d]: %s\\n\", period_count, time_period);\r\n        \r\n        char start[16] = {0};\r\n        char end[16] = {0};\r\n        char weekdays_str[64] = {0};\r\n        int has_weekdays = 0;\r\n        \r\n        char *semicolon = strchr(time_period, ';');\r\n        if (semicolon) {\r\n            has_weekdays = 1;\r\n            strncpy(weekdays_str, time_period, semicolon - time_period);\r\n            weekdays_str[semicolon - time_period] = '\\0';\r\n            time_period = semicolon + 1;\r\n            printf(\"ubus period[%d] has weekdays: %s, time_part: %s\\n\", period_count, weekdays_str, time_period);\r\n        }\r\n        \r\n        char *delimiter = strchr(time_period, '-');\r\n        if (delimiter) {\r\n            strncpy(start, time_period, delimiter - time_period);\r\n            start[delimiter - time_period] = '\\0';\r\n            \r\n            strcpy(end, delimiter + 1);\r\n            \r\n            printf(\"ubus period[%d] parsed: start=%s, end=%s\\n\", period_count, start, end);\r\n\r\n            struct json_object *period_obj = json_object_new_object();\r\n            json_object_object_add(period_obj, \"start\", json_object_new_string(start));\r\n            json_object_object_add(period_obj, \"end\", json_object_new_string(end));\r\n            \r\n            struct json_object *period_weekdays = json_object_new_array();\r\n            if (has_weekdays) {\r\n                char weekdays_copy[64] = {0};\r\n                strncpy(weekdays_copy, weekdays_str, sizeof(weekdays_copy) - 1);\r\n                char *saveptr2 = NULL;\r\n                char *wd = strtok_r(weekdays_copy, \",\", &saveptr2);\r\n                while (wd) {\r\n                    json_object_array_add(period_weekdays, json_object_new_int(atoi(wd)));\r\n                    wd = strtok_r(NULL, \",\", &saveptr2);\r\n                }\r\n                printf(\"ubus period[%d] weekday_list size: %d\\n\", period_count, json_object_array_length(period_weekdays));\r\n            } else {\r\n                // Use global weekdays as fallback\r\n                int i;\r\n                for (i = 0; i < 7; i++) {\r\n                    if (global_weekdays[i]) {\r\n                        json_object_array_add(period_weekdays, json_object_new_int(i));\r\n                    }\r\n                }\r\n            }\r\n            json_object_object_add(period_obj, \"weekday_list\", period_weekdays);\r\n            \r\n            json_object_array_add(time_array, period_obj);\r\n            printf(\"ubus period[%d] added to array, current array length: %d\\n\", period_count, json_object_array_length(time_array));\r\n        } else {\r\n            printf(\"ubus period[%d] ERROR: no delimiter found\\n\", period_count);\r\n        }\r\n        \r\n        // Get next period using strtok_r\r\n        time_period = strtok_r(NULL, \" \", &saveptr1);\r\n        if (time_period) {\r\n            printf(\"ubus next period will be: %s\\n\", time_period);\r\n        } else {\r\n            printf(\"ubus no more periods\\n\");\r\n        }\r\n    }\r\n    json_object_object_add(data_obj, \"time_list\", time_array);\r\n\r\n\r\n    if (time_mode == 2) {\r\n        struct json_object *daily_time_list_array = json_object_new_array();\r\n        \r\n        // Initialize array with 7 elements (Sunday to Saturday)\r\n        int weekday;\r\n        for (weekday = 0; weekday < 7; weekday++) {\r\n            char uci_key[64] = {0};\r\n            snprintf(uci_key, sizeof(uci_key), \"appfilter.time.daily_limit_%d\", weekday);\r\n            \r\n            char daily_limit_str[128] = {0};\r\n            af_uci_get_value(uci_ctx, uci_key, daily_limit_str, sizeof(daily_limit_str));\r\n            \r\n\r\n            int enable = 0;\r\n            int am_time = 0;\r\n            int pm_time = 0;\r\n            if (strlen(daily_limit_str) > 0) {\r\n                char *first_colon = strchr(daily_limit_str, ':');\r\n                if (first_colon) {\r\n                    char *second_colon = strchr(first_colon + 1, ':');\r\n                    if (second_colon) {\r\n                        // New format: \"enable:am_time:pm_time\"\r\n                        enable = atoi(daily_limit_str);\r\n                        am_time = atoi(first_colon + 1);\r\n                        pm_time = atoi(second_colon + 1);\r\n                    } else {\r\n                        enable = 1; // Default to enabled for old format\r\n                        am_time = atoi(daily_limit_str);\r\n                        pm_time = atoi(first_colon + 1);\r\n                    }\r\n                } else {\r\n                    enable = 1; // Default to enabled\r\n                    am_time = atoi(daily_limit_str);\r\n                }\r\n            }\r\n            \r\n            struct json_object *day_obj = json_object_new_object();\r\n            json_object_object_add(day_obj, \"enable\", json_object_new_int(enable));\r\n            json_object_object_add(day_obj, \"am_time\", json_object_new_int(am_time));\r\n            json_object_object_add(day_obj, \"pm_time\", json_object_new_int(pm_time));\r\n            json_object_array_add(daily_time_list_array, day_obj);\r\n        }\r\n        \r\n        json_object_object_add(data_obj, \"daily_time_list\", daily_time_list_array);\r\n        \r\n        time_t now = time(NULL);\r\n        struct tm *current_time = localtime(&now);\r\n        int current_weekday = current_time->tm_wday; // 0=Sunday, 1=Monday, ..., 6=Saturday\r\n        int current_hour = current_time->tm_hour;\r\n        \r\n        json_object_object_add(data_obj, \"current_weekday\", json_object_new_int(current_weekday));\r\n    \r\n        int total_am_time = 0;\r\n        int total_pm_time = 0;\r\n        int i;\r\n        for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++) {\r\n            dev_node_t *node = dev_hash_table[i];\r\n            while (node) {\r\n                if (node->is_selected) {\r\n                    total_am_time += node->today_am_active_time;\r\n                    total_pm_time += node->today_pm_active_time;\r\n                }\r\n                node = node->next;\r\n            }\r\n        }\r\n        \r\n        json_object_object_add(data_obj, \"current_am_used_time\", json_object_new_int(total_am_time));\r\n        json_object_object_add(data_obj, \"current_pm_used_time\", json_object_new_int(total_pm_time));\r\n        \r\n        daily_limit_config_t *daily_limit = &g_af_config.time.daily_limit[current_weekday];\r\n        json_object_object_add(data_obj, \"current_am_limit\", json_object_new_int(daily_limit->am_time));\r\n        json_object_object_add(data_obj, \"current_pm_limit\", json_object_new_int(daily_limit->pm_time));\r\n        json_object_object_add(data_obj, \"current_day_enabled\", json_object_new_int(daily_limit->enable));\r\n    }\r\n\r\n    json_object_object_add(response, \"data\", data_obj);\r\n    \r\n    printf(\"response_json: %s\\n\", json_object_to_json_string(response));\r\n    uci_free_context(uci_ctx);\r\n    \r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n    return 0;\r\n}\r\n\r\n\r\n//  {\"end_time\":\"12:00\",\"weekday_list\":[1,2,3,4,5,6,0],\"deny_time\":5,\"start_time\":\"22:22\",\"allow_time\":30,\"mode\":1}\r\n// {\"mode\":0,\"weekday_list\":[1,2],\"time_list\":[{\"start\":\"00:11\",\"end\":\"00:12\"},{\"start\":\"12:00\",\"end\":\"14:00\"}]}\r\nstatic int handle_set_app_filter_time(struct ubus_context *ctx, struct ubus_object *obj,\r\n                                 struct ubus_request_data *req, const char *method,\r\n                                 struct blob_attr *msg) {\r\n    printf(\"set appfilter time\\n\");\r\n    int mode = 0;\r\n    struct json_object *response = json_object_new_object();\r\n    int i;\r\n    char *msg_obj_str = blobmsg_format_json(msg, true);\r\n    if (!msg_obj_str) {\r\n        printf(\"format json failed\\n\");\r\n        return 0;\r\n    }\r\n     printf(\"msg_obj_str: %s\\n\", msg_obj_str);\r\n    struct json_object *req_obj = json_tokener_parse(msg_obj_str);\r\n    \r\n    struct json_object *mode_obj = json_object_object_get(req_obj, \"mode\");\r\n    if (!mode_obj) {\r\n        printf(\"mode_obj is NULL\\n\");\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        return 0;\r\n    }\r\n    printf(\"mode_obj: %d\\n\", json_object_get_int(mode_obj));\r\n\r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        printf(\"Failed to allocate UCI context\\n\");\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        return 0;\r\n    }\r\n    mode = json_object_get_int(mode_obj);\r\n    af_uci_set_int_value(uci_ctx, \"appfilter.time.time_mode\", mode);\r\n\r\n    struct json_object *weekday_list_obj = json_object_object_get(req_obj, \"weekday_list\");\r\n    if (weekday_list_obj && (mode == 0 || mode == 1)) {\r\n        char days_str[128] = {0};\r\n        for (i = 0; i < json_object_array_length(weekday_list_obj); i++) {\r\n            struct json_object *weekday_obj = json_object_array_get_idx(weekday_list_obj, i);\r\n            char tmp[8];\r\n            snprintf(tmp, sizeof(tmp), \"%d\", json_object_get_int(weekday_obj));\r\n            if (i > 0) strcat(days_str, \" \");\r\n            strcat(days_str, tmp);\r\n        }\r\n        af_uci_set_value(uci_ctx, \"appfilter.time.days\", days_str);\r\n    }\r\n\r\n    if (mode == 0) {\r\n        struct json_object *time_list_obj = json_object_object_get(req_obj, \"time_list\");\r\n        if (!time_list_obj) {\r\n            printf(\"time_list_obj is NULL\\n\");\r\n            goto EXIT;\r\n        }\r\n        af_uci_delete(uci_ctx, \"appfilter.time.time\");\r\n        int time_list_len = json_object_array_length(time_list_obj);\r\n        for (i = 0; i < time_list_len; i++) {\r\n            struct json_object *time_obj = json_object_array_get_idx(time_list_obj, i);\r\n            struct json_object *start_time_obj = json_object_object_get(time_obj, \"start\");\r\n            struct json_object *end_time_obj = json_object_object_get(time_obj, \"end\");\r\n            if (!start_time_obj || !end_time_obj) {\r\n                printf(\"start_time_obj or end_time_obj is NULL\\n\");\r\n                goto EXIT;\r\n            }\r\n            \r\n            char time_str[256] = {0};\r\n            \r\n            struct json_object *period_weekday_list_obj = json_object_object_get(time_obj, \"weekday_list\");\r\n            if (period_weekday_list_obj && json_object_array_length(period_weekday_list_obj) > 0) {\r\n                // Build weekday string: \"1,2,4,5\"\r\n                char weekday_str[64] = {0};\r\n                int j;\r\n                for (j = 0; j < json_object_array_length(period_weekday_list_obj); j++) {\r\n                    struct json_object *wd_obj = json_object_array_get_idx(period_weekday_list_obj, j);\r\n                    if (j > 0) strcat(weekday_str, \",\");\r\n                    char tmp[8];\r\n                    snprintf(tmp, sizeof(tmp), \"%d\", json_object_get_int(wd_obj));\r\n                    strcat(weekday_str, tmp);\r\n                }\r\n                sprintf(time_str, \"%s;%s-%s\", weekday_str, \r\n                        json_object_get_string(start_time_obj), \r\n                        json_object_get_string(end_time_obj));\r\n            } else {\r\n                // No weekday_list in time_obj: use global weekday_list (fallback to old format)\r\n                sprintf(time_str, \"%s-%s\", \r\n                        json_object_get_string(start_time_obj), \r\n                        json_object_get_string(end_time_obj));\r\n            }\r\n            \r\n            printf(\"time_str: %s\\n\", time_str);\r\n            af_uci_add_list(uci_ctx, \"appfilter.time.time\", time_str);\r\n        }\r\n    }\r\n    else if (mode == 1) {\r\n        struct json_object *deny_time_obj = json_object_object_get(req_obj, \"deny_time\");\r\n        struct json_object *allow_time_obj = json_object_object_get(req_obj, \"allow_time\");\r\n        struct json_object *start_time_obj = json_object_object_get(req_obj, \"start_time\");\r\n        struct json_object *end_time_obj = json_object_object_get(req_obj, \"end_time\");\r\n        if (!deny_time_obj || !allow_time_obj || !start_time_obj || !end_time_obj) {\r\n            printf(\"deny_time_obj or allow_time_obj or start_time_obj or end_time_obj is NULL\\n\");\r\n            goto EXIT;\r\n        }\r\n        af_uci_set_int_value(uci_ctx, \"appfilter.time.deny_time\", json_object_get_int(deny_time_obj));\r\n        af_uci_set_int_value(uci_ctx, \"appfilter.time.allow_time\", json_object_get_int(allow_time_obj));\r\n        af_uci_set_value(uci_ctx, \"appfilter.time.start_time\", json_object_get_string(start_time_obj));\r\n        af_uci_set_value(uci_ctx, \"appfilter.time.end_time\", json_object_get_string(end_time_obj));\r\n    }\r\n    else if (mode == 2) {\r\n\r\n        struct json_object *daily_time_list_obj = json_object_object_get(req_obj, \"daily_time_list\");\r\n        if (!daily_time_list_obj) {\r\n            printf(\"daily_time_list_obj is NULL\\n\");\r\n            goto EXIT;\r\n        }\r\n        \r\n        int daily_time_list_len = json_object_array_length(daily_time_list_obj);\r\n        if (daily_time_list_len != 7) {\r\n            printf(\"daily_time_list length should be 7, got %d\\n\", daily_time_list_len);\r\n            goto EXIT;\r\n        }\r\n        \r\n        for (i = 0; i < 7; i++) {\r\n            char uci_key[64] = {0};\r\n            snprintf(uci_key, sizeof(uci_key), \"appfilter.time.daily_limit_%d\", i);\r\n            af_uci_delete(uci_ctx, uci_key);\r\n        }\r\n        \r\n        for (i = 0; i < 7; i++) {\r\n            struct json_object *day_obj = json_object_array_get_idx(daily_time_list_obj, i);\r\n            struct json_object *enable_obj = json_object_object_get(day_obj, \"enable\");\r\n            struct json_object *am_time_obj = json_object_object_get(day_obj, \"am_time\");\r\n            struct json_object *pm_time_obj = json_object_object_get(day_obj, \"pm_time\");\r\n            \r\n            if (enable_obj && am_time_obj && pm_time_obj) {\r\n                int enable = json_object_get_int(enable_obj);\r\n                int am_time = json_object_get_int(am_time_obj);\r\n                int pm_time = json_object_get_int(pm_time_obj);\r\n                \r\n                // Format: \"enable:am_time:pm_time\" (e.g., \"1:100:200\")\r\n                char limit_str[32] = {0};\r\n                snprintf(limit_str, sizeof(limit_str), \"%d:%d:%d\", enable, am_time, pm_time);\r\n                \r\n                char uci_key[64] = {0};\r\n                snprintf(uci_key, sizeof(uci_key), \"appfilter.time.daily_limit_%d\", i);\r\n                printf(\"daily_limit_%d: %s\\n\", i, limit_str);\r\n                af_uci_set_value(uci_ctx, uci_key, limit_str);\r\n            }\r\n        }\r\n    }\r\n    af_uci_commit(uci_ctx, \"appfilter\");\r\n    g_oaf_config_change = 1;\r\n    if (g_enable_agent) {\r\n        af_forward_msg_to_agent(\"set_app_filter_time\", msg_obj_str, strlen(msg_obj_str));\r\n    }\r\nEXIT:\r\n    uci_free_context(uci_ctx);\r\n    json_object_put(req_obj);\r\n    free(msg_obj_str);\r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n    return 0;\r\n}\r\n\r\ntypedef struct all_users_info {\r\n    int flag;\r\n    struct json_object *users_array;\r\n} all_users_info_t;\r\n\r\n\r\n\r\nvoid all_users_callback(void *arg, dev_node_t *dev)\r\n{\r\n    int flag = 0;\r\n    int i;\r\n    all_users_info_t *au_info = (all_users_info_t *)arg;\r\n    flag = au_info->flag;\r\n    struct json_object *users_array = au_info->users_array;\r\n\r\n    struct json_object *user_obj = json_object_new_object();\r\n    json_object_object_add(user_obj, \"mac\", json_object_new_string(dev->mac));\r\n    \r\n    int online_status = dev->online;\r\n    if (dev->active == 1 && dev->online == 1) {\r\n        online_status = 2; \r\n    }\r\n    json_object_object_add(user_obj, \"online\", json_object_new_int(online_status));\r\n    json_object_object_add(user_obj, \"online_time\", json_object_new_int(dev->online_time));\r\n    json_object_object_add(user_obj, \"offline_time\", json_object_new_int(dev->offline_time));\r\n    json_object_object_add(user_obj, \"today_am_active_time\", json_object_new_int(dev->today_am_active_time));\r\n    json_object_object_add(user_obj, \"today_pm_active_time\", json_object_new_int(dev->today_pm_active_time));\r\n\r\n    if (flag > 0) {\r\n        json_object_object_add(user_obj, \"ip\", json_object_new_string(dev->ip));\r\n      \r\n    }\r\n\r\n    if (flag > 1){\r\n        json_object_object_add(user_obj, \"hostname\", json_object_new_string(dev->hostname));\r\n        json_object_object_add(user_obj, \"nickname\", json_object_new_string(dev->nickname));\r\n        json_object_object_add(user_obj, \"is_whitelist\", json_object_new_int(dev->is_whitelist));\r\n        json_object_object_add(user_obj, \"is_selected\", json_object_new_int(dev->is_selected));\r\n    }\r\n\r\n    if (flag > 2){\r\n        struct json_object *app_array = json_object_new_array();\r\n        app_visit_time_info_t top5_app_list[5];\r\n        memset(top5_app_list, 0x0, sizeof(top5_app_list));\r\n        update_top5_app(dev, top5_app_list);\r\n        for (i = 0; i < 5; i++)\r\n        {\r\n            if (top5_app_list[i].app_id == 0 || strlen(get_app_name_by_id(top5_app_list[i].app_id)) == 0)\r\n                break;\r\n\r\n            struct json_object *app_obj = json_object_new_object();\r\n            json_object_object_add(app_obj, \"id\", json_object_new_int(top5_app_list[i].app_id));\r\n\r\n            if (check_app_icon_exist(top5_app_list[i].app_id)) {\r\n                json_object_object_add(app_obj, \"icon\", json_object_new_int(1));\r\n            }\r\n            else\r\n                json_object_object_add(app_obj, \"icon\", json_object_new_int(0));\r\n\r\n            \r\n            json_object_object_add(app_obj, \"name\", json_object_new_string(get_app_name_by_id(top5_app_list[i].app_id)));\r\n\r\n            json_object_array_add(app_array, app_obj);\r\n        }\r\n        json_object_object_add(user_obj, \"applist\", app_array);\r\n\r\n        if (strlen(dev->visiting_url) > 0)\r\n            json_object_object_add(user_obj, \"url\", json_object_new_string(dev->visiting_url));\r\n        else\r\n            json_object_object_add(user_obj, \"url\", json_object_new_string(\"\"));\r\n        if (dev->visiting_app > 0 && strlen(get_app_name_by_id(dev->visiting_app)) > 0)\r\n            json_object_object_add(user_obj, \"app\", json_object_new_string(get_app_name_by_id(dev->visiting_app)));\r\n        else\r\n            json_object_object_add(user_obj, \"app\", json_object_new_string(\"\"));\r\n        \r\n        json_object_object_add(user_obj, \"up_rate\", json_object_new_int(dev->up_rate / 1024));\r\n        json_object_object_add(user_obj, \"down_rate\", json_object_new_int(dev->down_rate / 1024));\r\n\t\tu_int32_t up_flow = (u_int32_t)(dev->today_up_bytes / 1024);\r\n\t\tu_int32_t down_flow = (u_int32_t)(dev->today_down_bytes / 1024);\r\n        json_object_object_add(user_obj, \"up_rate\", json_object_new_int(dev->up_rate / 1024));\r\n        json_object_object_add(user_obj, \"down_rate\", json_object_new_int(dev->down_rate / 1024));\r\n        json_object_object_add(user_obj, \"today_up_flow\", json_object_new_int(up_flow));\r\n        json_object_object_add(user_obj, \"today_down_flow\", json_object_new_int(down_flow));\r\n    }\r\n    json_object_array_add(users_array, user_obj);\r\n}\r\n\r\nint compare_users(const void *a, const void *b)\r\n{\r\n    struct json_object *user_a = *(struct json_object **)a;\r\n    struct json_object *user_b = *(struct json_object **)b;\r\n\r\n    struct json_object *online_a, *online_b;\r\n    json_object_object_get_ex(user_a, \"online\", &online_a);\r\n    json_object_object_get_ex(user_b, \"online\", &online_b);\r\n\r\n    int online_val_a = json_object_get_int(online_a);\r\n    int online_val_b = json_object_get_int(online_b);\r\n\r\n    if (online_val_a != online_val_b)\r\n        return online_val_b - online_val_a;\r\n\r\n    struct json_object *online_time_a, *online_time_b;\r\n    json_object_object_get_ex(user_a, \"online_time\", &online_time_a);\r\n    json_object_object_get_ex(user_b, \"online_time\", &online_time_b);\r\n\r\n    int online_time_val_a = json_object_get_int(online_time_a);\r\n    int online_time_val_b = json_object_get_int(online_time_b);\r\n\r\n    if (online_val_a == 1 && online_val_b == 1) {\r\n        // Both are online, sort by online_time\r\n        return online_time_val_a - online_time_val_b;\r\n    } else {\r\n        // Both are offline, sort by offline_time\r\n        struct json_object *offline_time_a, *offline_time_b;\r\n        json_object_object_get_ex(user_a, \"offline_time\", &offline_time_a);\r\n        json_object_object_get_ex(user_b, \"offline_time\", &offline_time_b);\r\n\r\n        int offline_time_val_a = json_object_get_int(offline_time_a);\r\n        int offline_time_val_b = json_object_get_int(offline_time_b);\r\n\r\n        return offline_time_val_a - offline_time_val_b;\r\n    }\r\n}\r\n\r\nstatic int handle_get_all_users(struct ubus_context *ctx, struct ubus_object *obj,\r\n                                 struct ubus_request_data *req, const char *method,\r\n                                 struct blob_attr *msg) {\r\n    struct json_object *response = json_object_new_object();\r\n    struct json_object *data_obj = json_object_new_object();\r\n    int flag = 0;\r\n    int page = 0;\r\n    int page_size = 20; // Default page size\r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        printf(\"Failed to allocate UCI context\\n\");\r\n        json_object_put(response);\r\n        json_object_put(data_obj);\r\n        return 0;\r\n    }\r\n\r\n    char *msg_obj_str = blobmsg_format_json(msg, true);\r\n    struct json_object *req_obj = NULL;\r\n    if (msg_obj_str)\r\n    {\r\n        req_obj = json_tokener_parse(msg_obj_str);\r\n        struct json_object *flag_obj = json_object_object_get(req_obj, \"flag\");\r\n        struct json_object *page_obj = json_object_object_get(req_obj, \"page\");\r\n        struct json_object *page_size_obj = json_object_object_get(req_obj, \"page_size\");\r\n        if (flag_obj) {\r\n            flag = json_object_get_int(flag_obj);\r\n        }\r\n        if (page_obj) {\r\n            page = json_object_get_int(page_obj);\r\n        }\r\n        if (page_size_obj) {\r\n            page_size = json_object_get_int(page_size_obj);\r\n            if (page_size <= 0) {\r\n                page_size = 20; // Default to 20 if invalid\r\n            }\r\n        }\r\n    }\r\n\r\n    printf(\"flag: %d, page: %d, page_size: %d\\n\", flag, page, page_size);\r\n    all_users_info_t au_info;\r\n    au_info.flag = flag;\r\n    au_info.users_array = json_object_new_array();\r\n\r\n    update_dev_nickname();\r\n    update_dev_visiting_info();\r\n    update_dev_whitelist_flag();\r\n    dev_foreach(&au_info, all_users_callback);\r\n    \r\n    json_object_array_sort(au_info.users_array, compare_users);\r\n\r\n    int total_count = json_object_array_length(au_info.users_array);\r\n    \r\n    struct json_object *paged_array = NULL;\n    if (page <= 0) {\n        /* Reuse users_array as response data while keeping a local reference for cleanup. */\n        paged_array = json_object_get(au_info.users_array);\n    } else {\n        paged_array = json_object_new_array();\n        int start_idx = (page - 1) * page_size;\n        int end_idx = start_idx + page_size;\n        int i;\n        for (i = start_idx; i < end_idx && i < total_count; i++) {\n            struct json_object *user_obj = json_object_array_get_idx(au_info.users_array, i);\r\n            if (user_obj) {\r\n                json_object_get(user_obj); // Increment reference count\r\n                json_object_array_add(paged_array, user_obj);\r\n            }\r\n        }\r\n    }\r\n\r\n    json_object_object_add(data_obj, \"list\", paged_array);\r\n    json_object_object_add(data_obj, \"total\", json_object_new_int(total_count));\r\n    json_object_object_add(data_obj, \"page\", json_object_new_int(page));\r\n    json_object_object_add(data_obj, \"page_size\", json_object_new_int(page_size));\r\n    \r\n    // Calculate total pages\r\n    int total_pages = 0;\r\n    if (page_size > 0) {\r\n        total_pages = (total_count + page_size - 1) / page_size; // Ceiling division\r\n    }\r\n    json_object_object_add(data_obj, \"total_pages\", json_object_new_int(total_pages));\n    json_object_put(au_info.users_array);\n\r\n    json_object_object_add(response, \"data\", data_obj);\r\n    \r\n    if (req_obj) {\r\n        json_object_put(req_obj);\r\n    }\r\n    if (msg_obj_str) {\r\n        free(msg_obj_str);\r\n    }\r\n    uci_free_context(uci_ctx);\r\n    \r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n    return 0;\r\n}\r\n\r\n\r\nstatic int handle_get_app_filter_user(struct ubus_context *ctx, struct ubus_object *obj,\r\n                                 struct ubus_request_data *req, const char *method,\r\n                                 struct blob_attr *msg) {\r\n    struct json_object *response = json_object_new_object();\r\n    struct json_object *data_obj = json_object_new_object();\r\n    \r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        printf(\"Failed to allocate UCI context\\n\");\r\n        json_object_put(response);\r\n        json_object_put(data_obj);\r\n        return 0;\r\n    }\r\n\r\n    int mode = af_uci_get_int_value(uci_ctx, \"appfilter.global.user_mode\");\r\n    if (mode < 0)\r\n        mode = 0;\r\n    json_object_object_add(data_obj, \"mode\", json_object_new_int(mode));\r\n\r\n    struct json_object *user_array = json_object_new_array();\r\n    char mac_str[128] = {0};\r\n    int num = af_get_uci_list_num(uci_ctx, \"appfilter\", \"af_user\");\r\n    for (int i = 0; i < num; i++) {\r\n        af_uci_get_array_value(uci_ctx, \"appfilter.@af_user[%d].mac\", i, mac_str, sizeof(mac_str));\r\n        \r\n        struct json_object *user_obj = json_object_new_object();\r\n        json_object_object_add(user_obj, \"mac\", json_object_new_string(mac_str));\r\n        dev_node_t *dev = find_dev_node(mac_str);\r\n        if (dev){\r\n            json_object_object_add(user_obj, \"nickname\", json_object_new_string(dev->nickname));\r\n            json_object_object_add(user_obj, \"hostname\", json_object_new_string(dev->hostname));\r\n        }else{\r\n            json_object_object_add(user_obj, \"nickname\", json_object_new_string(\"\"));\r\n            json_object_object_add(user_obj, \"hostname\", json_object_new_string(\"\"));\r\n        }\r\n        json_object_array_add(user_array, user_obj);\r\n    }\r\n\r\n    json_object_object_add(data_obj, \"list\", user_array);\r\n    json_object_object_add(response, \"data\", data_obj);\r\n    \r\n    uci_free_context(uci_ctx);\r\n    \r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n    return 0;\r\n\r\n}\r\n\r\n\r\nstatic int handle_set_app_filter_user(struct ubus_context *ctx, struct ubus_object *obj,\r\n                                 struct ubus_request_data *req, const char *method,\r\n                                 struct blob_attr *msg) {\r\n    struct json_object *response = json_object_new_object();\r\n    int i;\r\n    char *msg_obj_str = blobmsg_format_json(msg, true);\r\n    if (!msg_obj_str) {\r\n        printf(\"format json failed\\n\");\r\n        return 0;\r\n    }\r\n    printf(\"msg_obj_str: %s\\n\", msg_obj_str);\r\n    struct json_object *req_obj = json_tokener_parse(msg_obj_str);\r\n    struct json_object *mode_object = json_object_object_get(req_obj, \"mode\");\r\n    if (!mode_object) {\r\n        printf(\"mode_object is NULL\\n\");\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return 0;\r\n    }\r\n    printf(\"mode_object: %d\\n\", json_object_get_int(mode_object));\r\n\r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        printf(\"Failed to allocate UCI context\\n\");\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return 0;\r\n    }\r\n\r\n    af_uci_set_int_value(uci_ctx, \"appfilter.global.user_mode\", json_object_get_int(mode_object));\r\n    af_uci_commit(uci_ctx, \"appfilter\");\r\n    reload_oaf_rule();\r\n    if (g_enable_agent) {\r\n        af_forward_msg_to_agent(\"set_app_filter_user\", msg_obj_str, strlen(msg_obj_str));\r\n    }\r\n\r\n    uci_free_context(uci_ctx);\r\n    json_object_put(req_obj);\r\n    free(msg_obj_str);\r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n    return 0;\r\n}\r\n\r\n\r\n\r\n\r\nstatic int handle_del_app_filter_user(struct ubus_context *ctx, struct ubus_object *obj,\r\n                                 struct ubus_request_data *req, const char *method,\r\n                                 struct blob_attr *msg) {\r\n    printf(\"handle_del_app_filter_user\\n\");\r\n    struct json_object *response = json_object_new_object();\r\n    int i;\r\n    char *msg_obj_str = blobmsg_format_json(msg, true);\r\n    if (!msg_obj_str) {\r\n        printf(\"format json failed\\n\");\r\n        return 0;\r\n    }\r\n    printf(\"msg_obj_str: %s\\n\", msg_obj_str);\r\n    struct json_object *req_obj = json_tokener_parse(msg_obj_str);\r\n    struct json_object *mac_obj = json_object_object_get(req_obj, \"mac\");\r\n    if (!mac_obj) {\r\n        printf(\"mac_obj is NULL\\n\");\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return 0;\r\n    }\r\n    printf(\"mac: %s\\n\", json_object_get_string(mac_obj));\r\n\r\n \r\n\r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        printf(\"Failed to allocate UCI context\\n\");\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return 0;\r\n    }\r\n    char mac_str[128] = {0};\r\n       int num = af_get_uci_list_num(uci_ctx, \"appfilter\", \"af_user\");\r\n    for (int i = 0; i < num; i++) {\r\n        af_uci_get_array_value(uci_ctx, \"appfilter.@af_user[%d].mac\", i, mac_str, sizeof(mac_str));\r\n        if (strcmp(mac_str, json_object_get_string(mac_obj)) == 0) {\r\n            printf(\"delete af_user[%d]\\n\", i);\r\n\r\n            char buf[128] = {0};\r\n            sprintf(buf, \"appfilter.@af_user[%d]\", i);\r\n            af_uci_delete(uci_ctx, buf);\r\n            break;\r\n        }\r\n    }\r\n\r\n    af_uci_commit(uci_ctx, \"appfilter\");\r\n    reload_oaf_rule();\r\n    if (g_enable_agent) {\r\n        af_forward_msg_to_agent(\"del_app_filter_user\", msg_obj_str, strlen(msg_obj_str));\r\n    }\r\n\r\n    uci_free_context(uci_ctx);\r\n    json_object_put(req_obj);\r\n    free(msg_obj_str);\r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n    return 0;\r\n}\r\n\r\n\r\n\r\n\r\nstatic int handle_add_app_filter_user(struct ubus_context *ctx, struct ubus_object *obj,\r\n                                 struct ubus_request_data *req, const char *method,\r\n                                 struct blob_attr *msg) {\r\n    printf(\"handle_add_app_filter_user\\n\");\r\n    struct json_object *response = json_object_new_object();\r\n    int i;\r\n    char *msg_obj_str = blobmsg_format_json(msg, true);\r\n    if (!msg_obj_str) {\r\n        printf(\"format json failed\\n\");\r\n        json_object_put(response);\r\n        return -1;\r\n    }\r\n    printf(\"msg_obj_str: %s\\n\", msg_obj_str);\r\n    struct json_object *req_obj = json_tokener_parse(msg_obj_str);\r\n    if (!req_obj) {\r\n        printf(\"parse json failed\\n\");\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return -1;\r\n    }\r\n    struct json_object *mac_array = json_object_object_get(req_obj, \"mac_list\");\r\n    if (!mac_array) {\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return -1;\r\n    }\r\n    \r\n    \r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        printf(\"Failed to allocate UCI context\\n\");\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return -1;\r\n    }\r\n\r\n    int len = json_object_array_length(mac_array);\r\n    printf(\"len: %d\\n\", len);\r\n    for (int i = 0; i < len; i++) {\r\n        struct json_object *mac_obj = json_object_array_get_idx(mac_array, i);\r\n        af_uci_add_section(uci_ctx, \"appfilter\", \"af_user\");\r\n        af_uci_set_value(uci_ctx, \"appfilter.@af_user[-1].mac\", json_object_get_string(mac_obj));\r\n    }\r\n    printf(\"add af_user ok\\n\");\r\n    af_uci_commit(uci_ctx, \"appfilter\");\r\n    reload_oaf_rule();\r\n    if (g_enable_agent) {\r\n        af_forward_msg_to_agent(\"add_app_filter_user\", msg_obj_str, strlen(msg_obj_str));\r\n    }\r\n    uci_free_context(uci_ctx);\r\n    json_object_put(req_obj);\r\n    free(msg_obj_str);\r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n    return 0;\r\n}\r\n\r\nstatic int handle_set_nickname(struct ubus_context *ctx, struct ubus_object *obj,\r\n                                 struct ubus_request_data *req, const char *method,\r\n                                 struct blob_attr *msg) {\r\n\r\n    struct json_object *response = json_object_new_object();\r\n    int i;\r\n    char *msg_obj_str = blobmsg_format_json(msg, true);\r\n    if (!msg_obj_str) {\r\n        printf(\"format json failed\\n\");\r\n        json_object_put(response);\r\n        return -1;\r\n    }\r\n    printf(\"msg_obj_str: %s\\n\", msg_obj_str);\r\n    struct json_object *req_obj = json_tokener_parse(msg_obj_str);\r\n    if (!req_obj) {\r\n        printf(\"parse json failed\\n\");\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return -1;\r\n    }\r\n    struct json_object *mac_obj = json_object_object_get(req_obj, \"mac\");\r\n   \r\n    struct json_object *nickname_obj = json_object_object_get(req_obj, \"nickname\");\r\n    if (!nickname_obj || !mac_obj) {\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return -1;\r\n    }\r\n    \r\n    \r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        printf(\"Failed to allocate UCI context\\n\");\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return -1;\r\n    }\r\n    int num = af_get_uci_list_num(uci_ctx, \"user_info\", \"user_info\");\r\n    char mac_str[128] = {0};\r\n    int index = -1;\r\n    for (i = 0; i < num; i++) {\r\n        af_uci_get_array_value(uci_ctx, \"user_info.@user_info[%d].mac\", i, mac_str, sizeof(mac_str));\r\n        if (strcmp(mac_str, json_object_get_string(mac_obj)) == 0) {\r\n            index = i;\r\n            printf(\"found nickname index: %d\\n\", index);\r\n            break;\r\n        }\r\n    }\r\n\r\n    if (strlen(json_object_get_string(nickname_obj)) > 0) {\r\n        if (index == -1) {\r\n            af_uci_add_section(uci_ctx, \"user_info\", \"user_info\");\r\n        }\r\n        af_uci_set_array_value(uci_ctx, \"user_info.@user_info[%d].mac\", index, json_object_get_string(mac_obj));\r\n        af_uci_set_array_value(uci_ctx, \"user_info.@user_info[%d].nickname\", index, json_object_get_string(nickname_obj));\r\n    }\r\n    else{\r\n        char uci_option[128] = {0};\r\n        sprintf(uci_option, \"user_info.@user_info[%d]\", index);\r\n        af_uci_delete(uci_ctx, uci_option);\r\n        printf(\"delete nickname mac = %s\\n\", json_object_get_string(mac_obj));\r\n    }\r\n\r\n  \r\n    af_uci_commit(uci_ctx, \"user_info\");\r\n    reload_oaf_rule();\r\n    if (g_enable_agent) {\r\n        af_forward_msg_to_agent(\"set_nickname\", msg_obj_str, strlen(msg_obj_str));\r\n    }\r\n    uci_free_context(uci_ctx);\r\n    json_object_put(req_obj);\r\n    free(msg_obj_str);\r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n    return 0;\r\n}\r\n\r\nextern af_run_time_status_t g_af_status;\r\n\r\n\r\nstatic int handle_get_oaf_status(struct ubus_context *ctx, struct ubus_object *obj,\r\n                                 struct ubus_request_data *req, const char *method,\r\n                                 struct blob_attr *msg) {\r\n    struct json_object *response = json_object_new_object();\r\n    struct json_object *data_obj = json_object_new_object();\r\n    char result[128] = {0};\r\n    char kernel_version[128] = {0};\r\n    int enable = 0;\r\n    int ret = 0;\r\n    int engine_status = 0;\r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n\r\n    ret = af_read_file_value(\"/proc/sys/oaf/enable\", result, sizeof(result));\r\n    if (ret !=0 || strlen(result) == 0){\r\n        engine_status = 0;\r\n        enable = 0;\r\n    }\r\n    else{\r\n        enable = atoi(result);\r\n        engine_status = 1;\r\n    }\r\n \r\n    json_object_object_add(data_obj, \"enable\", json_object_new_int(enable));\r\n    json_object_object_add(data_obj, \"version\", json_object_new_string(OAF_VERSION));\r\n\r\n    json_object_object_add(data_obj, \"engine_status\", json_object_new_int(engine_status));\r\n\r\n    // Read disable_hnat configuration\r\n    if (uci_ctx) {\r\n        int disable_hnat = af_uci_get_int_value(uci_ctx, \"appfilter.global.disable_hnat\");\r\n        json_object_object_add(data_obj, \"disable_hnat\", json_object_new_int(disable_hnat));\r\n        uci_free_context(uci_ctx);\r\n    } else {\r\n        json_object_object_add(data_obj, \"disable_hnat\", json_object_new_int(0));\r\n    }\r\n\r\n    ret = exec_with_result_line(\"cat /proc/sys/oaf/version\", kernel_version, sizeof(kernel_version));\r\n    if (ret >= 0){\r\n        json_object_object_add(data_obj, \"engine_version\", json_object_new_string(kernel_version));\r\n    }\r\n    else{\r\n        json_object_object_add(data_obj, \"engine_version\", json_object_new_string(\"\"));\r\n    }\r\n\r\n    ret = exec_with_result_line(\"uname -r\", kernel_version, sizeof(kernel_version));\r\n    if (ret >= 0){\r\n        json_object_object_add(data_obj, \"kernel_version\", json_object_new_string(kernel_version));\r\n    }   \r\n    else{\r\n        json_object_object_add(data_obj, \"kernel_version\", json_object_new_string(\"\"));\r\n    }\r\n\r\n\r\n    json_object_object_add(data_obj, \"config_enable\", json_object_new_int(g_af_config.global.enable));\r\n    json_object_object_add(data_obj, \"time_mode\", json_object_new_int(g_af_config.time.time_mode));\r\n    json_object_object_add(data_obj, \"match_time\", json_object_new_int(g_af_status.match_time));\r\n\r\n    if (g_af_config.time.time_mode == 1) {\r\n        json_object_object_add(data_obj, \"filter\", json_object_new_int(g_af_status.filter));\r\n        if (g_af_status.filter == 1) {\r\n            json_object_object_add(data_obj, \"remain_time\", json_object_new_int(g_af_config.time.deny_time - g_af_status.deny_time));\r\n        }\r\n        else {\r\n            json_object_object_add(data_obj, \"remain_time\", json_object_new_int(g_af_config.time.allow_time - g_af_status.allow_time));\r\n        }\r\n    } else if (g_af_config.time.time_mode == 2) {\r\n        json_object_object_add(data_obj, \"remain_time\", json_object_new_int(g_af_status.remain_time));\r\n        json_object_object_add(data_obj, \"used_time\", json_object_new_int(g_af_status.used_time));\r\n        json_object_object_add(data_obj, \"period_blocked\", json_object_new_int(g_af_status.period_blocked));\r\n        \r\n        time_t now = time(NULL);\r\n        struct tm *current_time = localtime(&now);\r\n        int current_weekday = current_time->tm_wday;\r\n        int current_hour = current_time->tm_hour;\r\n        \r\n        json_object_object_add(data_obj, \"current_weekday\", json_object_new_int(current_weekday));\r\n        \r\n        daily_limit_config_t *daily_limit = &g_af_config.time.daily_limit[current_weekday];\r\n        if (daily_limit->enable) {\r\n            if (current_hour < 12) {\r\n                json_object_object_add(data_obj, \"am_time_limit\", json_object_new_int(daily_limit->am_time));\r\n                json_object_object_add(data_obj, \"pm_time_limit\", json_object_new_int(daily_limit->pm_time));\r\n            } else {\r\n                json_object_object_add(data_obj, \"am_time_limit\", json_object_new_int(daily_limit->am_time));\r\n                json_object_object_add(data_obj, \"pm_time_limit\", json_object_new_int(daily_limit->pm_time));\r\n            }\r\n        } else {\r\n            json_object_object_add(data_obj, \"am_time_limit\", json_object_new_int(0));\r\n            json_object_object_add(data_obj, \"pm_time_limit\", json_object_new_int(0));\r\n        }\r\n        \r\n\r\n        int total_am_time = 0;\r\n        int total_pm_time = 0;\r\n        int selected_user_count = 0;\r\n        int i;\r\n        for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++) {\r\n            dev_node_t *node = dev_hash_table[i];\r\n            while (node) {\r\n                if (node->is_selected) {\r\n                    total_am_time += node->today_am_active_time;\r\n                    total_pm_time += node->today_pm_active_time;\r\n                    if (node->online) {\r\n                        selected_user_count++;\r\n                    }\r\n                }\r\n                node = node->next;\r\n            }\r\n        }\r\n        \r\n        json_object_object_add(data_obj, \"current_am_used_time\", json_object_new_int(total_am_time));\r\n        json_object_object_add(data_obj, \"current_pm_used_time\", json_object_new_int(total_pm_time));\r\n        json_object_object_add(data_obj, \"selected_user_count\", json_object_new_int(selected_user_count));\r\n        json_object_object_add(data_obj, \"current_am_limit\", json_object_new_int(daily_limit->am_time));\r\n        json_object_object_add(data_obj, \"current_pm_limit\", json_object_new_int(daily_limit->pm_time));\r\n        json_object_object_add(data_obj, \"current_day_enabled\", json_object_new_int(daily_limit->enable));\r\n    }\r\n\r\n\r\n    json_object_object_add(response, \"data\", data_obj);\r\n    \r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n    return 0;\r\n\r\n}\r\n\r\nstatic int handle_get_whitelist_user(struct ubus_context *ctx, struct ubus_object *obj,\r\n                                 struct ubus_request_data *req, const char *method,\r\n                                 struct blob_attr *msg) {\r\n    struct json_object *response = json_object_new_object();\r\n    struct json_object *data_obj = json_object_new_object();\r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        printf(\"Failed to allocate UCI context\\n\");\r\n        json_object_put(response);\r\n        json_object_put(data_obj);\r\n        return 0;\r\n    }\r\n\r\n    struct json_object *user_array = json_object_new_array();\r\n    char mac_str[128] = {0};\r\n    int num = af_get_uci_list_num(uci_ctx, \"appfilter\", \"whitelist\");\r\n    for (int i = 0; i < num; i++) {\r\n        af_uci_get_array_value(uci_ctx, \"appfilter.@whitelist[%d].mac\", i, mac_str, sizeof(mac_str));\r\n        struct json_object *user_obj = json_object_new_object();\r\n        json_object_object_add(user_obj, \"mac\", json_object_new_string(mac_str));\r\n        dev_node_t *dev = find_dev_node(mac_str);\r\n        if (dev){\r\n            json_object_object_add(user_obj, \"nickname\", json_object_new_string(dev->nickname));\r\n            json_object_object_add(user_obj, \"hostname\", json_object_new_string(dev->hostname));\r\n        }else{\r\n            json_object_object_add(user_obj, \"nickname\", json_object_new_string(\"\"));\r\n            json_object_object_add(user_obj, \"hostname\", json_object_new_string(\"\"));\r\n        }       \r\n        json_object_array_add(user_array, user_obj);\r\n    }\r\n    json_object_object_add(data_obj, \"list\", user_array);\r\n    json_object_object_add(response, \"data\", data_obj);\r\n    \r\n    uci_free_context(uci_ctx);\r\n    \r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n    return 0;\r\n}\r\n\r\n\r\nstatic int handle_add_whitelist_user(struct ubus_context *ctx, struct ubus_object *obj,\r\n                    struct ubus_request_data *req, const char *method,\r\n                    struct blob_attr *msg) \r\n{\r\n    struct json_object *response = json_object_new_object();\r\n    int i;\r\n    char *msg_obj_str = blobmsg_format_json(msg, true);\r\n    if (!msg_obj_str) {\r\n        printf(\"format json failed\\n\");\r\n        json_object_put(response);\r\n        return -1;\r\n    }\r\n    struct json_object *req_obj = json_tokener_parse(msg_obj_str);\r\n    if (!req_obj) {\r\n        printf(\"parse json failed\\n\");\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return -1;\r\n    }\r\n    struct json_object *mac_array = json_object_object_get(req_obj, \"mac_list\");\r\n    if (!mac_array) {\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return -1;\r\n    }\r\n\r\n\r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return -1;\r\n    }\r\n\r\n    int len = json_object_array_length(mac_array);\r\n    for (int i = 0; i < len; i++) {\r\n        struct json_object *mac_obj = json_object_array_get_idx(mac_array, i);\r\n        af_uci_add_section(uci_ctx, \"appfilter\", \"whitelist\");\r\n        af_uci_set_value(uci_ctx, \"appfilter.@whitelist[-1].mac\", json_object_get_string(mac_obj));\r\n    }\r\n    af_uci_commit(uci_ctx, \"appfilter\");\r\n    reload_oaf_rule();\r\n\r\n    if (g_enable_agent) {\r\n        af_forward_msg_to_agent(\"add_whitelist_user\", msg_obj_str, strlen(msg_obj_str));\r\n    }\r\n    uci_free_context(uci_ctx);\r\n    json_object_put(req_obj);\r\n    free(msg_obj_str);\r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n    return 0;\r\n}\r\n\r\n\t\t\t\t\t\r\nstatic int handle_service_config(struct ubus_context *ctx, struct ubus_object *obj,\r\n\t\t\t\t\tstruct ubus_request_data *req, const char *method,\r\n\t\t\t\t\tstruct blob_attr *msg) \r\n{\r\n\tstruct json_object *response = json_object_new_object();\r\n\tint i;\r\n\tchar *msg_obj_str = blobmsg_format_json(msg, true);\r\n\tif (!msg_obj_str) {\r\n\t\tprintf(\"format json failed\\n\");\r\n\t\tjson_object_put(response);\r\n\t\treturn -1;\r\n\t}\r\n\tstruct json_object *req_obj = json_tokener_parse(msg_obj_str);\r\n\tif (!req_obj) {\r\n\t\tprintf(\"parse json failed\\n\");\r\n\t\tfree(msg_obj_str);\r\n\t\tjson_object_put(response);\r\n\t\treturn -1;\r\n\t}\r\n\tstruct json_object *agent_enable_obj = json_object_object_get(req_obj, \"agent_enable\");\r\n\tif (!agent_enable_obj) {\r\n\t\tjson_object_put(req_obj);\r\n\t\tfree(msg_obj_str);\r\n\t\tjson_object_put(response);\r\n\t\treturn -1;\r\n\t}\r\n\r\n\tg_enable_agent = json_object_get_int(agent_enable_obj);\r\n\r\n    printf(\"g_enable_agent: %d\\n\", g_enable_agent);\r\n\r\n\tjson_object_put(req_obj);\r\n\tfree(msg_obj_str);\r\n\tstruct blob_buf b = {};\r\n\tblob_buf_init(&b, 0);\r\n\tblobmsg_add_object(&b, response);\r\n\tubus_send_reply(ctx, req, b.head);\r\n\tblob_buf_free(&b);\r\n\tjson_object_put(response);\r\n\treturn 0;\r\n}\r\n\r\n\r\n\t\t\t\t\t\r\n\r\nstatic int handle_del_whitelist_user(struct ubus_context *ctx, struct ubus_object *obj,\r\n                    struct ubus_request_data *req, const char *method,\r\n                    struct blob_attr *msg) {\r\n    struct json_object *response = json_object_new_object();\r\n    int i;\r\n    char *msg_obj_str = blobmsg_format_json(msg, true);\r\n    if (!msg_obj_str) {\r\n        printf(\"format json failed\\n\");\r\n        return 0;\r\n    }\r\n    printf(\"msg_obj_str: %s\\n\", msg_obj_str);\r\n    struct json_object *req_obj = json_tokener_parse(msg_obj_str);\r\n    struct json_object *mac_obj = json_object_object_get(req_obj, \"mac\");\r\n    if (!mac_obj) {\r\n        printf(\"mac_obj is NULL\\n\");\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return 0;\r\n    }\r\n\r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        printf(\"Failed to allocate UCI context\\n\");\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return 0;\r\n    }\r\n    char mac_str[128] = {0};\r\n    int num = af_get_uci_list_num(uci_ctx, \"appfilter\", \"whitelist\");\r\n    for (int i = 0; i < num; i++) {\r\n        af_uci_get_array_value(uci_ctx, \"appfilter.@whitelist[%d].mac\", i, mac_str, sizeof(mac_str));\r\n        if (strcmp(mac_str, json_object_get_string(mac_obj)) == 0) {\r\n            char buf[128] = {0};\r\n            sprintf(buf, \"appfilter.@whitelist[%d]\", i);\r\n            af_uci_delete(uci_ctx, buf);\r\n            break;\r\n        }\r\n    }\r\n\r\n    af_uci_commit(uci_ctx, \"appfilter\");\r\n    reload_oaf_rule();\r\n\r\n    if (g_enable_agent) {\r\n        af_forward_msg_to_agent(\"del_whitelist_user\", msg_obj_str, strlen(msg_obj_str));\r\n    }\r\n\r\n    uci_free_context(uci_ctx);\r\n    json_object_put(req_obj);\r\n    free(msg_obj_str);\r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    json_object_put(response);\r\n    return 0;\r\n}\r\n\r\n\r\n\r\nstatic int handle_cmd(struct ubus_context *ctx, struct ubus_object *obj,\r\n                      struct ubus_request_data *req, const char *method,\r\n                      struct blob_attr *msg) {\r\n    struct json_object *response = json_object_new_object();\r\n    char *msg_obj_str = blobmsg_format_json(msg, true);\r\n    if (!msg_obj_str) {\r\n        printf(\"format json failed\\n\");\r\n        json_object_put(response);\r\n        return 0;\r\n    }\r\n    printf(\"handle_cmd: msg_obj_str: %s\\n\", msg_obj_str);\r\n    \r\n    struct json_object *req_obj = json_tokener_parse(msg_obj_str);\r\n    if (!req_obj) {\r\n        printf(\"parse json failed\\n\");\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return 0;\r\n    }\r\n    \r\n    struct json_object *action_obj = json_object_object_get(req_obj, \"action\");\r\n    if (!action_obj) {\r\n        printf(\"action is NULL\\n\");\r\n        json_object_put(req_obj);\r\n        free(msg_obj_str);\r\n        json_object_put(response);\r\n        return 0;\r\n    }\r\n    \r\n    const char *action = json_object_get_string(action_obj);\r\n    printf(\"handle_cmd: action = %s\\n\", action);\r\n    \r\n    int ret = 0;\r\n    const char *result_msg = NULL;\r\n    \r\n    if (strcmp(action, \"clear_active_time\") == 0) {\r\n        // Clear all users' today active time (AM and PM)\r\n        reset_all_users_today_active_time();\r\n        result_msg = \"Successfully cleared all users' active time\";\r\n        ret = 0;\r\n        printf(\"handle_cmd: cleared all users' active time\\n\");\r\n    } else if (strcmp(action, \"clear_offline_users\") == 0) {\r\n        // Clear all offline users\r\n        flush_offline_users();\r\n        result_msg = \"Successfully cleared all offline users\";\r\n        ret = 0;\r\n        printf(\"handle_cmd: cleared all offline users\\n\");\r\n    } else {\r\n        result_msg = \"Unknown action\";\r\n        ret = -1;\r\n        printf(\"handle_cmd: unknown action: %s\\n\", action);\r\n    }\r\n    \r\n    json_object_object_add(response, \"code\", json_object_new_int(ret));\r\n    json_object_object_add(response, \"message\", json_object_new_string(result_msg));\r\n    \r\n    struct blob_buf b = {};\r\n    blob_buf_init(&b, 0);\r\n    blobmsg_add_object(&b, response);\r\n    ubus_send_reply(ctx, req, b.head);\r\n    blob_buf_free(&b);\r\n    \r\n    json_object_put(req_obj);\r\n    free(msg_obj_str);\r\n    json_object_put(response);\r\n    return 0;\r\n}\r\n\r\nstatic const struct blobmsg_policy empty_policy[1] = {\r\n    //[DEV_NAME] = { .name = \"name\", .type = BLOBMSG_TYPE_STRING },\r\n};\r\n\r\nstatic struct ubus_method appfilter_object_methods[] = {\r\n    UBUS_METHOD(\"dev_visit_list\", appfilter_handle_dev_visit_list, empty_policy),\r\n    UBUS_METHOD(\"dev_visit_time\", appfilter_handle_visit_time, empty_policy),\r\n    UBUS_METHOD(\"app_class_visit_time\", handle_app_class_visit_time, empty_policy),\r\n    UBUS_METHOD(\"dev_list\", appfilter_handle_dev_list, empty_policy),\r\n    UBUS_METHOD(\"class_list\", handle_get_class_list, empty_policy),\r\n    UBUS_METHOD(\"set_app_filter\", handle_set_app_filter, empty_policy),\r\n    UBUS_METHOD(\"get_app_filter\", handle_get_app_filter, empty_policy),\r\n    UBUS_METHOD(\"set_app_filter_base\", handle_set_app_filter_base, empty_policy),\r\n    UBUS_METHOD(\"get_app_filter_base\", handle_get_app_filter_base, empty_policy),\r\n    UBUS_METHOD(\"set_app_filter_adv\", handle_set_app_filter_adv, empty_policy),\r\n    UBUS_METHOD(\"get_app_filter_adv\", handle_get_app_filter_adv, empty_policy),\r\n    UBUS_METHOD(\"set_app_filter_time\", handle_set_app_filter_time, empty_policy),\r\n    UBUS_METHOD(\"get_app_filter_time\", handle_get_app_filter_time, empty_policy),\r\n    UBUS_METHOD(\"get_all_users\", handle_get_all_users, empty_policy),\r\n    UBUS_METHOD(\"get_app_filter_user\", handle_get_app_filter_user, empty_policy),\r\n    UBUS_METHOD(\"set_app_filter_user\", handle_set_app_filter_user, empty_policy),\r\n    UBUS_METHOD(\"del_app_filter_user\", handle_del_app_filter_user, empty_policy),\r\n    UBUS_METHOD(\"add_app_filter_user\", handle_add_app_filter_user, empty_policy),\r\n    UBUS_METHOD(\"set_nickname\", handle_set_nickname, empty_policy),\r\n    UBUS_METHOD(\"get_oaf_status\", handle_get_oaf_status, empty_policy),\r\n    UBUS_METHOD(\"debug\", handle_debug, empty_policy),\r\n    UBUS_METHOD(\"get_whitelist_user\", handle_get_whitelist_user, empty_policy),\r\n    UBUS_METHOD(\"add_whitelist_user\", handle_add_whitelist_user, empty_policy),\r\n    UBUS_METHOD(\"del_whitelist_user\", handle_del_whitelist_user, empty_policy),\r\n    UBUS_METHOD(\"service_config\", handle_service_config, empty_policy),\r\n    UBUS_METHOD(\"cmd\", handle_cmd, empty_policy),\r\n};\r\n\r\n\r\n\r\n\r\nstatic struct ubus_object_type main_object_type =\r\n    UBUS_OBJECT_TYPE(\"appfilter\", appfilter_object_methods);\r\n\r\nstatic struct ubus_object main_object = {\r\n    .name = \"appfilter\",\r\n    .type = &main_object_type,\r\n    .methods = appfilter_object_methods,\r\n    .n_methods = ARRAY_SIZE(appfilter_object_methods),\r\n};\r\n\r\nstatic void appfilter_add_object(struct ubus_object *obj)\r\n{\r\n    ubus_add_object(ubus_ctx, obj);\r\n}\r\n\r\nint appfilter_ubus_init(void)\r\n{\r\n\tubus_ctx = ubus_connect(\"/var/run/ubus/ubus.sock\");\r\n    if (!ubus_ctx){\r\n\t\tubus_ctx = ubus_connect(\"/var/run/ubus.sock\");\r\n\t}\r\n\tif (!ubus_ctx){\r\n\t\treturn -EIO;\r\n\t}\r\n\r\n    appfilter_add_object(&main_object);\r\n    ubus_add_uloop(ubus_ctx);\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/src/appfilter_ubus.h",
    "content": "/*\r\n  Copyright (C) 2020 Derry <destan19@126.com>\r\n\r\n  Permission is hereby granted, free of charge, to any person obtaining a copy\r\n  of this software and associated documentation files (the \"Software\"), to deal\r\n  in the Software without restriction, including without limitation the rights\r\n  to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\n  copies of the Software, and to permit persons to whom the Software is\r\n  furnished to do so, subject to the following conditions:\r\n\r\n  The above copyright notice and this permission notice shall be included in\r\n  all copies or substantial portions of the Software.\r\n\r\n  THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\n  IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\n  FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\n  AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\n  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\n  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\n  THE SOFTWARE.\r\n*/\r\n#ifndef __APPFILTER_UBUS_H__\r\n#define __APPFILTER_UBUS_H__\r\nint appfilter_ubus_init(void);\r\n#endif"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/src/appfilter_user.c",
    "content": "/*\r\nCopyright (C) 2020 Derry <destan19@126.com>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n#include <unistd.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <time.h>\r\n#include <libubox/uloop.h>\r\n#include <libubox/utils.h>\r\n#include <libubus.h>\r\n#include <sys/socket.h>\r\n#include <linux/netlink.h>\r\n#include <json-c/json.h>\r\n#include <linux/socket.h>\r\n#include <sys/socket.h>\r\n#include \"appfilter_config.h\"\r\n#include \"appfilter.h\"\r\n#include \"appfilter_user.h\"\r\n\r\ndev_node_t *dev_hash_table[MAX_DEV_NODE_HASH_SIZE];\r\nint g_cur_user_num = 0;\r\nunsigned int hash_mac(unsigned char *mac)\r\n{\r\n    unsigned int hash = 0;\r\n    int i;\r\n    if (!mac)\r\n        return 0;\r\n    for (i = 0; mac[i] != '\\0' && i < MAX_MAC_LEN; i++) {\r\n        hash = hash * 31 + mac[i]; \r\n    }\r\n    return hash & (MAX_DEV_NODE_HASH_SIZE - 1);\r\n}\r\n\r\nint hash_appid(int appid)\r\n{\r\n    return appid % (MAX_VISIT_HASH_SIZE - 1);\r\n}\r\n\r\nvoid add_visit_info_node(visit_info_t **head, visit_info_t *node)\r\n{\r\n    if (*head == NULL)\r\n    {\r\n        *head = node;\r\n    }\r\n    else\r\n    {\r\n        node->next = *head;\r\n        *head = node;\r\n    }\r\n}\r\n\r\nvoid init_dev_node_htable()\r\n{\r\n    int i;\r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++)\r\n    {\r\n        dev_hash_table[i] = NULL;\r\n    }\r\n    printf(\"init dev node htable ok...\\n\");\r\n}\r\n\r\ndev_node_t *add_dev_node(char *mac)\r\n{\r\n    unsigned int hash = 0;\r\n    hash = hash_mac(mac);\r\n    if (hash >= MAX_DEV_NODE_HASH_SIZE)\r\n    {\r\n        printf(\"hash code error %d\\n\", hash);\r\n        return NULL;\r\n    }\r\n    dev_node_t *node = (dev_node_t *)calloc(1, sizeof(dev_node_t));\r\n    if (!node)\r\n        return NULL;\r\n    strncpy(node->mac, mac, sizeof(node->mac));\r\n    node->online = 1;\r\n    node->online_time = get_timestamp();\r\n    if (dev_hash_table[hash] == NULL)\r\n        dev_hash_table[hash] = node;\r\n    else\r\n    {\r\n        node->next = dev_hash_table[hash];\r\n        dev_hash_table[hash] = node;\r\n    }\r\n    g_cur_user_num++;\r\n    printf(\"add mac:%s to htable[%d]....success\\n\", mac, hash);\r\n    return node;\r\n}\r\n\r\ndev_node_t *find_dev_node(char *mac)\r\n{\r\n    unsigned int hash = 0;\r\n    dev_node_t *p = NULL;\r\n    hash = hash_mac(mac);\r\n    if (hash >= MAX_DEV_NODE_HASH_SIZE)\r\n    {\r\n        printf(\"hash code error %d\\n\", hash);\r\n        return NULL;\r\n    }\r\n    p = dev_hash_table[hash];\r\n    while (p)\r\n    {\r\n        if (0 == strncmp(p->mac, mac, sizeof(p->mac)))\r\n        {\r\n            return p;\r\n        }\r\n        p = p->next;\r\n    }\r\n    return NULL;\r\n}\r\n\r\nvoid dev_foreach(void *arg, iter_func iter)\r\n{\r\n    int i, j;\r\n    dev_node_t *node = NULL;\r\n\r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++)\r\n    {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        while (node)\r\n        {\r\n            iter(arg, node);\r\n            node = node->next;\r\n        }\r\n    }\r\n}\r\n\r\nchar *format_time(int timetamp)\r\n{\r\n    char time_buf[64] = {0};\r\n    time_t seconds = timetamp;\r\n    struct tm *auth_tm = localtime(&seconds);\r\n    strftime(time_buf, sizeof(time_buf), \"%Y %m %d %H:%M:%S\", auth_tm);\r\n    return strdup(time_buf);\r\n}\r\n\r\nvoid update_dev_hostname(void)\r\n{\r\n    char line_buf[256] = {0};\r\n    char hostname_buf[128] = {0};\r\n    char mac_buf[32] = {0};\r\n    char ip_buf[32] = {0};\r\n\r\n    FILE *fp = fopen(\"/tmp/dhcp.leases\", \"r\");\r\n    if (!fp)\r\n    {\r\n        printf(\"open dhcp lease file....failed\\n\");\r\n        return;\r\n    }\r\n    while (fgets(line_buf, sizeof(line_buf), fp))\r\n    {\r\n        if (strlen(line_buf) <= 16)\r\n            continue;\r\n        sscanf(line_buf, \"%*s %s %s %s\", mac_buf, ip_buf, hostname_buf);\r\n        dev_node_t *node = find_dev_node(mac_buf);\r\n        if (!node)\r\n        {\r\n            node = add_dev_node(mac_buf);\r\n\t\t\tif (!node)\r\n\t\t\t\tcontinue;\r\n            strncpy(node->ip, ip_buf, sizeof(node->ip));\r\n            node->online = 0;\r\n            node->offline_time = get_timestamp();\r\n        }\r\n\r\n        if (strlen(hostname_buf) > 0 && hostname_buf[0] != '*')\r\n        {\r\n            strncpy(node->hostname, hostname_buf, sizeof(node->hostname));\r\n        }\r\n    }\r\n    fclose(fp);\r\n}\r\n\r\nvoid clean_dev_nickname_iter(void *arg, dev_node_t *node)\r\n{\r\n    node->nickname[0] = '\\0';\r\n}\r\n\r\nvoid clean_dev_nickname(void)\r\n{\r\n    dev_foreach(NULL, clean_dev_nickname_iter);\r\n}\r\n\r\nvoid update_dev_nickname(void)\r\n{\r\n    char nickname_buf[128] = {0};\r\n    char mac_str[128] = {0};\r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    clean_dev_nickname();\r\n    int num = af_get_uci_list_num(uci_ctx, \"user_info\", \"user_info\");\r\n\r\n    for (int i = 0; i < num; i++) {\r\n        af_uci_get_array_value(uci_ctx, \"user_info.@user_info[%d].mac\", i, mac_str, sizeof(mac_str));\r\n        dev_node_t *node = find_dev_node(mac_str);\r\n        if (!node)\r\n            continue;\r\n\r\n        af_uci_get_array_value(uci_ctx, \"user_info.@user_info[%d].nickname\", i, nickname_buf, sizeof(nickname_buf));\r\n        strncpy(node->nickname, nickname_buf, sizeof(node->nickname));\r\n    }   \r\n    uci_free_context(uci_ctx);\r\n}\r\n\r\n\r\nvoid clean_dev_whitelist_flag_iter(void *arg, dev_node_t *node)\r\n{\r\n    node->is_whitelist = 0;\r\n}\r\n\r\nvoid clean_dev_whitelist_flag(void)\r\n{\r\n    dev_foreach(NULL, clean_dev_whitelist_flag_iter);\r\n}\r\n\r\n\r\nvoid update_dev_whitelist_flag(void)\r\n{\r\n    clean_dev_whitelist_flag();\r\n    dev_node_t *node = NULL;\r\n    struct uci_context *uci_ctx = uci_alloc_context();\r\n    if (!uci_ctx) {\r\n        return;\r\n    }\r\n    char mac_str[128] = {0};\r\n    int num = af_get_uci_list_num(uci_ctx, \"appfilter\", \"whitelist\");\r\n    for (int i = 0; i < num; i++) {\r\n        af_uci_get_array_value(uci_ctx, \"appfilter.@whitelist[%d].mac\", i, mac_str, sizeof(mac_str));\r\n        node = find_dev_node(mac_str);\r\n        if (node) {\r\n            node->is_whitelist = 1;\r\n        }\r\n    }\r\n    uci_free_context(uci_ctx);\r\n}\r\n\r\nvoid clean_dev_selected_flag_iter(void *arg, dev_node_t *node)\r\n{\r\n    node->is_selected = 0;\r\n}\r\n\r\nvoid clean_dev_selected_flag(void)\r\n{\r\n    dev_foreach(NULL, clean_dev_selected_flag_iter);\r\n}\r\n\r\nvoid update_dev_selected_flag(void)\r\n{\r\n    extern af_config_t g_af_config;\r\n    int user_mode = g_af_config.global.user_mode;\r\n    \r\n    clean_dev_selected_flag();\r\n    \r\n    if (user_mode == 0) {\r\n        int i;\r\n        for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++) {\r\n            dev_node_t *node = dev_hash_table[i];\r\n            while (node) {\r\n                if (!node->is_whitelist) {\r\n                    node->is_selected = 1;\r\n                }\r\n                node = node->next;\r\n            }\r\n        }\r\n        LOG_DEBUG(\"Auto mode: all users except whitelist are selected\\n\");\r\n    } else {\r\n        struct uci_context *uci_ctx = uci_alloc_context();\r\n        if (!uci_ctx) {\r\n            LOG_ERROR(\"Failed to allocate UCI context in update_dev_selected_flag\\n\");\r\n            return;\r\n        }\r\n        \r\n        char mac_str[128] = {0};\r\n        int num = af_get_uci_list_num(uci_ctx, \"appfilter\", \"af_user\");\r\n        for (int i = 0; i < num; i++) {\r\n            af_uci_get_array_value(uci_ctx, \"appfilter.@af_user[%d].mac\", i, mac_str, sizeof(mac_str));\r\n            dev_node_t *node = find_dev_node(mac_str);\r\n            if (node) {\r\n                node->is_selected = 1;\r\n            }\r\n        }\r\n        uci_free_context(uci_ctx);\r\n        LOG_DEBUG(\"Manual mode: %d users from af_user config are selected\\n\", num);\r\n    }\r\n}\r\n\r\n\r\n\r\nvoid clean_dev_online_status(void)\r\n{\r\n    int i;\r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++)\r\n    {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        while (node)\r\n        {\r\n\r\n            if (node->online)\r\n            {\r\n                node->offline_time = get_timestamp();\r\n                node->online = 0;\r\n            }\r\n            node = node->next;\r\n        }\r\n    }\r\n\r\n}\r\n\r\n\r\nvoid update_dev_from_kernel(void)\r\n{\r\n    char line_buf[256] = {0};\r\n    char mac_buf[32] = {0};\r\n    char ip_buf[32] = {0};\r\n    char ipv6_buf[128] = {0};\r\n    unsigned int up_rate = 0;\r\n    unsigned int down_rate = 0;\r\n\r\n    FILE *fp = fopen(\"/proc/net/af_client\", \"r\");\r\n    if (!fp)\r\n    {\r\n        printf(\"open client file....failed\\n\");\r\n        return;\r\n    }\r\n    fgets(line_buf, sizeof(line_buf), fp); // title\r\n    while (fgets(line_buf, sizeof(line_buf), fp))\r\n    {\r\n        int id;\r\n        int parsed = sscanf(line_buf, \"%d %s %s %s %u %u\", &id, mac_buf, ip_buf, ipv6_buf, &up_rate, &down_rate);\r\n        if (parsed < 3) \r\n        {\r\n            printf(\"invalid line format:%s\\n\", line_buf);\r\n            continue;\r\n        }\r\n        if (strlen(mac_buf) < 17)\r\n        {\r\n            printf(\"invalid mac:%s\\n\", mac_buf);\r\n            continue;\r\n        }\r\n        dev_node_t *node = find_dev_node(mac_buf);\r\n        if (!node)\r\n        {\r\n            node = add_dev_node(mac_buf);\r\n            if (!node)\r\n                continue;\r\n            strncpy(node->ip, ip_buf, sizeof(node->ip));\r\n        }\r\n\r\n        strncpy(node->ip, ip_buf, sizeof(node->ip));\r\n\r\n        if (parsed >= 4 && strlen(ipv6_buf) > 0)\r\n        {\r\n            strncpy(node->ipv6, ipv6_buf, sizeof(node->ipv6));\r\n        }\r\n        else\r\n        {\r\n            node->ipv6[0] = '\\0'; \r\n        }\r\n\r\n        if (parsed >= 5)\r\n        {\r\n            node->up_rate = up_rate;\r\n        }\r\n        else\r\n        {\r\n            node->up_rate = 0;\r\n        }\r\n        if (parsed >= 6)\r\n        {\r\n            node->down_rate = down_rate;\r\n        }\r\n        else\r\n        {\r\n            node->down_rate = 0;\r\n        }\r\n        node->online = 1;\r\n    }\r\n    fclose(fp);\r\n}\r\n\r\n\r\nvoid update_dev_online_status(void)\r\n{\r\n    update_dev_from_kernel();\r\n}\r\n\r\n#define DEV_OFFLINE_TIME (SECONDS_PER_DAY * 7)\r\n\r\nint check_dev_expire(void)\r\n{\r\n    int i, j;\r\n    int count = 0;\r\n    int cur_time = get_timestamp();\r\n    int offline_time = 0;\r\n    int expire_count = 0;\r\n    int visit_count = 0;\r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++)\r\n    {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        while (node)\r\n        {\r\n            if (node->online)\r\n                goto NEXT;\r\n            visit_count = 0;\r\n            offline_time = cur_time - node->offline_time;\r\n            if (offline_time > DEV_OFFLINE_TIME)\r\n            {\r\n                node->expire = 1;\r\n                for (j = 0; j < MAX_VISIT_HASH_SIZE; j++)\r\n                {\r\n                    visit_info_t *p_info = node->visit_htable[j];\r\n                    while (p_info)\r\n                    {\r\n                        p_info->expire = 1;\r\n                        visit_count++;\r\n                        p_info = p_info->next;\r\n                    }\r\n                }\r\n                expire_count++;\r\n                LOG_WARN(\"dev:%s expired, offline time = %ds, count=%d, visit_count=%d\\n\",\r\n                       node->mac, offline_time, expire_count, visit_count);\r\n            }\r\n        NEXT:\r\n            node = node->next;\r\n        }\r\n    }\r\n    return expire_count;\r\n}\r\n\r\nvoid flush_dev_expire_node(void)\r\n{\r\n    int i, j;\r\n    int count = 0;\r\n    dev_node_t *node = NULL;\r\n    dev_node_t *prev = NULL;\r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++)\r\n    {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        prev = NULL;\r\n        while (node)\r\n        {\r\n            if (node->expire)\r\n            {\r\n                if (NULL == prev)\r\n                {\r\n                    dev_hash_table[i] = node->next;\r\n                    free(node);\r\n                    node = dev_hash_table[i];\r\n                    prev = NULL;\r\n                }\r\n                else\r\n                {\r\n                    prev->next = node->next;\r\n                    free(node);\r\n                    node = prev->next;\r\n                }\r\n            }\r\n            else\r\n            {\r\n                prev = node;\r\n                node = node->next;\r\n            }\r\n        }\r\n    }\r\n}\r\n\r\nvoid flush_offline_users(void)\r\n{\r\n    int i, j;\r\n    int count = 0;\r\n    dev_node_t *node = NULL;\r\n    dev_node_t *prev = NULL;\r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++)\r\n    {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        prev = NULL;\r\n        while (node)\r\n        {\r\n            if (!node->online)  // Clear all offline users\r\n            {\r\n                // Free visit info first\r\n                for (j = 0; j < MAX_VISIT_HASH_SIZE; j++)\r\n                {\r\n                    visit_info_t *p_info = node->visit_htable[j];\r\n                    while (p_info)\r\n                    {\r\n                        visit_info_t *next = p_info->next;\r\n                        free(p_info);\r\n                        p_info = next;\r\n                    }\r\n                }\r\n                \r\n                // Remove node from hash table\r\n                if (NULL == prev)\r\n                {\r\n                    dev_hash_table[i] = node->next;\r\n                    free(node);\r\n                    node = dev_hash_table[i];\r\n                    prev = NULL;\r\n                }\r\n                else\r\n                {\r\n                    prev->next = node->next;\r\n                    free(node);\r\n                    node = prev->next;\r\n                }\r\n                count++;\r\n            }\r\n            else\r\n            {\r\n                prev = node;\r\n                node = node->next;\r\n            }\r\n        }\r\n    }\r\n    LOG_WARN(\"Cleared %d offline users\\n\", count);\r\n}\r\n\r\nvoid save_user_time_to_file(void)\r\n{\r\n    int i;\r\n    int count = 0;\r\n    FILE *fp = fopen(OAF_USER_FILE, \"w\");\r\n    if (!fp) {\r\n        LOG_ERROR(\"Failed to open file %s for writing\\n\", OAF_USER_FILE);\r\n        return;\r\n    }\r\n    \r\n    fprintf(fp, \"MAC,AM_Time,PM_Time\\n\");\r\n    \r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++) {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        while (node) {\r\n            fprintf(fp, \"%s,%u,%u\\n\", \r\n                    node->mac, \r\n                    node->today_am_active_time, \r\n                    node->today_pm_active_time);\r\n            count++;\r\n            node = node->next;\r\n        }\r\n    }\r\n    \r\n    fclose(fp);\r\n    LOG_DEBUG(\"Saved %d users' time data to %s\\n\", count, OAF_USER_FILE);\r\n}\r\n\r\nvoid load_user_time_from_file(void)\r\n{\r\n    FILE *fp = fopen(OAF_USER_FILE, \"r\");\r\n    if (!fp) {\r\n        LOG_DEBUG(\"File %s not found or cannot be opened, starting with empty data\\n\", OAF_USER_FILE);\r\n        return;\r\n    }\r\n    \r\n    char line_buf[256] = {0};\r\n    int count = 0;\r\n    \r\n    if (fgets(line_buf, sizeof(line_buf), fp) == NULL) {\r\n        fclose(fp);\r\n        return;\r\n    }\r\n    \r\n    while (fgets(line_buf, sizeof(line_buf), fp)) {\r\n        char mac[32] = {0};\r\n        unsigned int am_time = 0;\r\n        unsigned int pm_time = 0;\r\n        \r\n        if (sscanf(line_buf, \"%31[^,],%u,%u\", mac, &am_time, &pm_time) == 3) {\r\n            dev_node_t *node = find_dev_node(mac);\r\n            if (!node) {\r\n                // If node doesn't exist, create a new one\r\n                node = add_dev_node(mac);\r\n                if (!node) {\r\n                    LOG_WARN(\"Failed to create device node for MAC=%s\\n\", mac);\r\n                    continue;\r\n                }\r\n                LOG_DEBUG(\"Created new device node for MAC=%s\\n\", mac);\r\n            }\r\n            node->today_am_active_time = am_time;\r\n            node->today_pm_active_time = pm_time;\r\n            count++;\r\n            LOG_DEBUG(\"Loaded user time: MAC=%s, AM=%u, PM=%u\\n\", mac, am_time, pm_time);\r\n        } else {\r\n            LOG_WARN(\"Failed to parse line: %s\\n\", line_buf);\r\n        }\r\n    }\r\n    \r\n    fclose(fp);\r\n    LOG_WARN(\"Loaded %d users' time data from %s\\n\", count, OAF_USER_FILE);\r\n}\r\n\r\nvoid update_dev_visiting_info(void){\r\n    char line_buf[256] = {0};\r\n    char mac_buf[32] = {0};\r\n    char url_buf[32] = {0};\r\n    char app_buf[32] = {0};\r\n    char time_buf[32] = {0};\r\n\r\n    FILE *fp = fopen(\"/proc/net/af_visit\", \"r\");    \r\n    if (!fp)\r\n    {\r\n        printf(\"open af_visit file....failed\\n\");\r\n        return;\r\n    }\r\n    fgets(line_buf, sizeof(line_buf), fp); // title\r\n    while (fgets(line_buf, sizeof(line_buf), fp))   \r\n    {\r\n        sscanf(line_buf, \"%s %s %s\", mac_buf, app_buf, url_buf);\r\n        dev_node_t *node = find_dev_node(mac_buf);\r\n        if (!node)\r\n            continue;\r\n        if (strcmp(url_buf, \"none\") == 0) {\r\n            node->visiting_url[0] = '\\0';\r\n        }\r\n        else {\r\n            strncpy(node->visiting_url, url_buf, sizeof(node->visiting_url));\r\n        }\r\n        node->visiting_app = atoi(app_buf);\r\n    }\r\n    fclose(fp);\r\n}\r\n\r\nvoid update_dev_list(void)\r\n{\r\n    clean_dev_online_status();\r\n    update_dev_hostname();\r\n    update_dev_nickname();\r\n    update_dev_online_status();\r\n    update_dev_visiting_info();\r\n    update_dev_selected_flag(); \r\n}\r\n\r\n\r\nvoid dump_dev_list(void)\r\n\r\n{\r\n    int i, j;\r\n    int count = 0;\r\n    char hostname_buf[MAX_HOSTNAME_SIZE] = {0};\r\n    char ip_buf[MAX_IP_LEN] = {0};\r\n\r\n    FILE *fp = fopen(OAF_DEV_LIST_FILE, \"w\");\r\n    if (!fp)\r\n    {\r\n        return;\r\n    }\r\n    fprintf(fp, \"%-4s %-20s %-20s %-32s %-8s\\n\", \"Id\", \"Mac Addr\", \"Ip Addr\", \"Hostname\", \"Online\");\r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++)\r\n    {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        while (node)\r\n        {\r\n            if (node->online != 0)\r\n            {\r\n                if (strlen(node->hostname) == 0)\r\n                    strcpy(hostname_buf, \"*\");\r\n                else\r\n                    strcpy(hostname_buf, node->hostname);\r\n                if (strlen(node->ip) == 0)\r\n                    strcpy(ip_buf, \"*\");\r\n                else\r\n                    strcpy(ip_buf, node->ip);\r\n                fprintf(fp, \"%-4d %-20s %-20s %-32s %-8d\\n\",\r\n                        i + 1, node->mac, ip_buf, hostname_buf, node->online);\r\n                count++;\r\n            }\r\n\r\n            node = node->next;\r\n        }\r\n    }\r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++)\r\n    {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        while (node)\r\n        {\r\n            if (node->online == 0)\r\n            {\r\n                if (strlen(node->hostname) == 0)\r\n                    strcpy(hostname_buf, \"*\");\r\n                else\r\n                    strcpy(hostname_buf, node->hostname);\r\n\r\n                if (strlen(node->ip) == 0)\r\n                    strcpy(ip_buf, \"*\");\r\n                else\r\n                    strcpy(ip_buf, node->ip);\r\n\r\n                fprintf(fp, \"%-4d %-20s %-20s %-32s %-8d\\n\",\r\n                        i + 1, node->mac, ip_buf, hostname_buf, node->online);\r\n            }\r\n\r\n            node = node->next;\r\n        }\r\n    }\r\nEXIT:\r\n    fclose(fp);\r\n}\r\n\r\n#define MAX_RECORD_TIME (1 * 24 * 60 * 60) // 1day\r\n#define RECORD_REMAIN_TIME (60 * 60) // 1hour\r\n#define INVALID_RECORD_TIME (5 * 60)      // 5min\r\nvoid check_dev_visit_info_expire(void)\r\n{\r\n    int i, j;\r\n    int count = 0;\r\n    int cur_time = get_timestamp();\r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++)\r\n    {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        while (node)\r\n        {\r\n            for (j = 0; j < MAX_VISIT_HASH_SIZE; j++)\r\n            {\r\n                visit_info_t *p_info = node->visit_htable[j];\r\n                while (p_info)\r\n                {\r\n\t\t\t\t\t\r\n                    int total_time = p_info->latest_time - p_info->first_time;\r\n                    int interval_time = cur_time - p_info->first_time;\r\n                    if (interval_time > MAX_RECORD_TIME || interval_time < 0)\r\n                    {\r\n                        p_info->expire = 1;\r\n                    }\r\n                    else if (interval_time > RECORD_REMAIN_TIME)\r\n                    {\r\n                        if (total_time < INVALID_RECORD_TIME)\r\n                            p_info->expire = 1;\r\n                    }\r\n\t\t\t\t\tLOG_DEBUG(\"[%s] appid:%d total_time:%ds interval:%ds, expire = %d\\n\", node->mac, p_info->appid, total_time, interval_time, p_info->expire);\r\n                    p_info = p_info->next;\r\n                }\r\n            }\r\n            node = node->next;\r\n        }\r\n    }\r\n}\r\n\r\nvoid flush_expire_visit_info(void)\r\n{\r\n    int i, j;\r\n    int count = 0;\r\n    visit_info_t *prev = NULL;\r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++)\r\n    {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        while (node)\r\n        {\r\n            for (j = 0; j < MAX_VISIT_HASH_SIZE; j++)\r\n            {\r\n                visit_info_t *p_info = node->visit_htable[j];\r\n                prev = NULL;\r\n                while (p_info)\r\n                {\r\n                    if (p_info->expire)\r\n                    {\r\n                        LOG_DEBUG(\"check expire,flush expire visit info: %s, appid=%d\\n\", node->mac, p_info->appid);\r\n                        if (NULL == prev)\r\n                        {\r\n                            node->visit_htable[j] = p_info->next;\r\n                            free(p_info);\r\n                            p_info = node->visit_htable[j];\r\n                            prev = NULL;\r\n                        }\r\n                        else\r\n                        {\r\n                            prev->next = p_info->next;\r\n                            free(p_info);\r\n                            p_info = prev->next;\r\n                        }\r\n                    }\r\n                    else\r\n                    {\r\n                        prev = p_info;\r\n                        p_info = p_info->next;\r\n                    }\r\n                }\r\n            }\r\n            node = node->next;\r\n        }\r\n    }\r\n}\r\n\r\nvoid dump_dev_visit_list(void)\r\n{\r\n    int i, j;\r\n    int count = 0;\r\n    FILE *fp = fopen(OAF_VISIT_LIST_FILE, \"w\");\r\n    if (!fp)\r\n    {\r\n        return;\r\n    }\r\n\r\n    fprintf(fp, \"%-4s %-20s %-20s %-8s %-32s %-32s %-32s %-8s\\n\", \"Id\", \"Mac Addr\",\r\n            \"Ip Addr\", \"Appid\", \"First Time\", \"Latest Time\", \"Total Time(s)\", \"Expire\");\r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++)\r\n    {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        while (node)\r\n        {\r\n            for (j = 0; j < MAX_VISIT_HASH_SIZE; j++)\r\n            {\r\n                visit_info_t *p_info = node->visit_htable[j];\r\n                while (p_info)\r\n                {\r\n                    char *first_time_str = format_time(p_info->first_time);\r\n                    char *latest_time_str = format_time(p_info->latest_time);\r\n                    int total_time = p_info->latest_time - p_info->first_time;\r\n                    fprintf(fp, \"%-4d %-20s %-20s %-8d %-32s %-32s %-32d %-4d\\n\",\r\n                            count, node->mac, node->ip, p_info->appid, first_time_str,\r\n                            latest_time_str, total_time, p_info->expire);\r\n                    if (first_time_str)\r\n                        free(first_time_str);\r\n                    if (latest_time_str)\r\n                        free(latest_time_str);\r\n                    p_info = p_info->next;\r\n                    count++;\r\n                    if (count > 50)\r\n                        goto EXIT;\r\n                }\r\n            }\r\n            node = node->next;\r\n        }\r\n    }\r\nEXIT:\r\n    fclose(fp);\r\n}\r\n\r\nvoid clean_invalid_app_records(void)\r\n{\r\n    int i, j;\r\n    int invalid_count = 0;\r\n    int total_count = 0;\r\n    \r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++)\r\n    {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        while (node)\r\n        {\r\n            for (j = 0; j < MAX_VISIT_HASH_SIZE; j++)\r\n            {\r\n                visit_info_t *p_info = node->visit_htable[j];\r\n                while (p_info)\r\n                {\r\n                    total_count++;\r\n                    char *app_name = get_app_name_by_id(p_info->appid);\r\n                    if (app_name && strlen(app_name) == 0)\r\n                    {\r\n                        p_info->expire = 1;\r\n                        invalid_count++;\r\n                        LOG_DEBUG(\"clean: MAC=%s, AppID=%d\\n\", node->mac, p_info->appid);\r\n                    }\r\n                    p_info = p_info->next;\r\n                }\r\n            }\r\n            node = node->next;\r\n        }\r\n    }\r\n    if (invalid_count > 0)\r\n    {\r\n        flush_expire_visit_info();\r\n    }\r\n}\r\n\r\nvoid clear_device_app_statistics(void)\r\n{\r\n    int i;\r\n    \r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++)\r\n    {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        while (node)\r\n        {\r\n            memset(node->stat, 0, sizeof(node->stat));\r\n            node = node->next;\r\n        }\r\n    }\r\n    \r\n}\r\n\r\nvoid check_and_reset_today_active_time(dev_node_t *node)\r\n{\r\n    if (!node)\r\n        return;\r\n    \r\n    time_t now = time(NULL);\r\n    struct tm *tm_info = localtime(&now);\r\n    int current_hour = tm_info->tm_hour;\r\n    int current_min = tm_info->tm_min;\r\n    \r\n\r\n    static int last_reset_hour = -1;\r\n    static int last_reset_min = -1;\r\n    \r\n    if (current_hour == 12 && current_min == 0) {\r\n        if (last_reset_hour != 12 || last_reset_min != 0) {\r\n            LOG_DEBUG(\"Reset today_am_active_time for %s: %d -> 0 (12:00 reset)\\n\", \r\n                     node->mac, node->today_am_active_time);\r\n            node->today_am_active_time = 0;\r\n            last_reset_hour = 12;\r\n            last_reset_min = 0;\r\n        }\r\n    } else {\r\n        last_reset_hour = current_hour;\r\n        last_reset_min = current_min;\r\n    }\r\n}\r\n\r\nvoid reset_all_users_today_active_time(void)\r\n{\r\n    extern af_run_time_status_t g_af_status;\r\n    int i;\r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++) {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        while (node) {\r\n            LOG_DEBUG(\"Reset today active time for %s: am=%d->0, pm=%d->0 (day changed)\\n\", \r\n                     node->mac, node->today_am_active_time, node->today_pm_active_time);\r\n            node->today_am_active_time = 0;\r\n            node->today_pm_active_time = 0;\r\n            node = node->next;\r\n        }\r\n    }\r\n    g_af_status.period_blocked = 0;\r\n}\r\n\r\n\r\nvoid reset_all_users_today_flow(void)\r\n{\r\n    int i;\r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++) {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        while (node) {\r\n\r\n            node->today_down_bytes = 0;\r\n            node->today_up_bytes = 0;\r\n            node = node->next;\r\n        }\r\n    }\r\n}\r\n\r\n\r\nvoid check_all_users_period_time(void)\r\n{\r\n    int i;\r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++)\r\n    {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        while (node)\r\n        {\r\n            check_and_reset_today_active_time(node);\r\n            \r\n            node = node->next;\r\n        }\r\n    }\r\n}\r\n\r\nvoid save_user_active_time_to_file(void)\r\n{\r\n    FILE *fp = fopen(OAF_USER_FILE, \"w\");\r\n    if (!fp) {\r\n        LOG_ERROR(\"Failed to open file for writing: %s\\n\", OAF_USER_FILE);\r\n        return;\r\n    }\r\n    \r\n    fprintf(fp, \"mac,today_am_active_time,today_pm_active_time\\n\");\r\n    \r\n    int i;\r\n    int count = 0;\r\n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++) {\r\n        dev_node_t *node = dev_hash_table[i];\r\n        while (node) {\r\n            if (node->today_am_active_time > 0 || node->today_pm_active_time > 0) {\r\n                fprintf(fp, \"%s,%u,%u\\n\", \r\n                        node->mac, \r\n                        node->today_am_active_time, \r\n                        node->today_pm_active_time);\r\n                count++;\r\n            }\r\n            node = node->next;\r\n        }\r\n    }\r\n    \r\n    fclose(fp);\r\n    LOG_DEBUG(\"Saved %d users' active time to %s\\n\", count, OAF_USER_FILE);\r\n}\r\n"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/src/appfilter_user.h",
    "content": "/*\r\nCopyright (C) 2020 Derry <destan19@126.com>\r\n\r\nPermission is hereby granted, free of charge, to any person obtaining a copy\r\nof this software and associated documentation files (the \"Software\"), to deal\r\nin the Software without restriction, including without limitation the rights\r\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\r\ncopies of the Software, and to permit persons to whom the Software is\r\nfurnished to do so, subject to the following conditions:\r\n\r\nThe above copyright notice and this permission notice shall be included in\r\nall copies or substantial portions of the Software.\r\n\r\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\r\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\r\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\r\nTHE SOFTWARE.\r\n*/\r\n\r\n#ifndef __FILTER_USER_H__\r\n#define __FILTER_USER_H__\r\n#include <sys/types.h>\r\n#define MAX_IP_LEN 32\r\n#define MAX_MAC_LEN 32\r\n#define MAX_VISIT_HASH_SIZE 64\r\n#define MAX_DEV_NODE_HASH_SIZE 64\r\n#define MAX_HOSTNAME_SIZE 64\r\n#define OAF_VISIT_LIST_FILE \"/tmp/visit_list\"\r\n#define OAF_DEV_LIST_FILE \"/tmp/dev_list\"\r\n#define OAF_USER_FILE \"/etc/user_list.dat\"\r\n#define MIN_VISIT_TIME 5 // default 5s\r\n#define MAX_APP_STAT_NUM 8\r\n#define MAX_VISITLIST_DUMP_NUM 16\r\n#define MAX_APP_TYPE 32\r\n#define MAX_APP_ID_NUM 512\r\n#define MAX_SUPPORT_DEV_NUM 256\r\n#define SECONDS_PER_DAY (24 * 3600)\r\n#define MAX_NICKNAME_SIZE 64\r\n#define MAX_REPORT_URL_LEN 64\r\n\r\n\r\ntypedef struct visit_info\r\n{\r\n    int appid;\r\n    u_int32_t first_time;\r\n    u_int32_t latest_time;\r\n    int action;\r\n    int expire; \r\n    struct visit_info *next;\r\n} visit_info_t;\r\n\r\ntypedef struct visit_stat\r\n{\r\n    u_int32_t total_time;\r\n} visit_stat_t;\r\n\r\ntypedef struct dev_node\r\n{\r\n    char mac[MAX_MAC_LEN];\r\n    char ip[MAX_IP_LEN];\r\n\tchar ipv6[64];\r\n    char hostname[MAX_HOSTNAME_SIZE];\r\n    char nickname[MAX_NICKNAME_SIZE];\r\n    int online;\r\n    int expire;\r\n    u_int32_t offline_time;\r\n    u_int32_t online_time;\r\n    visit_info_t *visit_htable[MAX_VISIT_HASH_SIZE];\r\n    visit_stat_t stat[MAX_APP_TYPE][MAX_APP_ID_NUM]; // todo: list\r\n    char visiting_url[MAX_REPORT_URL_LEN];\r\n    int visiting_app;\r\n    int is_whitelist;\r\n\tu_int32_t up_rate;\r\n\tu_int32_t down_rate;\r\n\tu_int64_t today_up_bytes;\r\n\tu_int64_t today_down_bytes;\r\n\tint active;\r\n\tu_int32_t today_am_active_time;\r\n\tu_int32_t today_pm_active_time;\r\n\tint is_selected; \r\n    struct dev_node *next;\r\n} dev_node_t;\r\n\r\nstruct app_visit_info\r\n{\r\n    int app_id;\r\n    char app_name[32];\r\n    int total_time;\r\n};\r\n\r\nstruct app_visit_stat_info\r\n{\r\n    int num;\r\n    struct app_visit_info visit_list[MAX_APP_STAT_NUM];\r\n};\r\ntypedef void (*iter_func)(void *arg, dev_node_t *dev);\r\n//todo:dev for each\r\nextern dev_node_t *dev_hash_table[MAX_DEV_NODE_HASH_SIZE];\r\n\r\ndev_node_t *add_dev_node(char *mac);\r\nvoid init_dev_node_htable();\r\nvoid dump_dev_list(void);\r\nvoid dump_dev_visit_list(void);\r\ndev_node_t *find_dev_node(char *mac);\r\nvoid dev_foreach(void *arg, iter_func iter);\r\nvoid add_visit_info_node(visit_info_t **head, visit_info_t *node);\r\nvoid check_dev_visit_info_expire(void);\r\nvoid flush_expire_visit_info();\r\nint check_dev_expire(void);\r\nvoid flush_dev_expire_node(void);\r\nvoid flush_expire_visit_info(void);\r\nvoid flush_offline_users(void);\r\nvoid save_user_time_to_file(void);\r\nvoid load_user_time_from_file(void);\r\nvoid update_dev_list(void);\r\nvoid update_dev_nickname(void);\r\nvoid update_dev_visiting_info(void);\r\nvoid update_dev_whitelist_flag(void);\r\nvoid update_dev_selected_flag(void); \r\nvoid clean_invalid_app_records(void);\r\n\r\nvoid clear_device_app_statistics(void);\r\n\r\nvoid check_and_reset_today_active_time(dev_node_t *node);\r\nvoid reset_all_users_today_active_time(void);\r\n\r\nvoid reset_all_users_today_flow(void);\r\n\r\nvoid check_all_users_period_time(void);\r\nvoid update_dev_online_status(void);\r\n\r\n\r\n#endif\r\n"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/src/main.c",
    "content": "/*\nCopyright (C) 2020 Derry <destan19@126.com>\n\nPermission is hereby granted, free of charge, to any person obtaining a copy\nof this software and associated documentation files (the \"Software\"), to deal\nin the Software without restriction, including without limitation the rights\nto use, copy, modify, merge, publish, distribute, sublicense, and/or sell\ncopies of the Software, and to permit persons to whom the Software is\nfurnished to do so, subject to the following conditions:\n\nThe above copyright notice and this permission notice shall be included in\nall copies or substantial portions of the Software.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\nIMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\nFITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\nAUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\nLIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\nOUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN\nTHE SOFTWARE.\n*/\n#include <unistd.h>\n#include <stdlib.h>\n#include <string.h>\n#include <libubox/uloop.h>\n#include <libubox/utils.h>\n#include <libubus.h>\n#include \"appfilter_user.h\"\n#include \"appfilter_netlink.h\"\n#include \"appfilter_ubus.h\"\n#include \"appfilter_config.h\"\n#include <time.h>\n#include <signal.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include \"appfilter.h\"\n#include <stdio.h>\n#include \"utils.h\"\n\n#define CMD_GET_LAN_IP_FMT   \"ifconfig %s | grep 'inet addr' | awk '{print $2}' | awk -F: '{print $2}'\"\n#define CMD_GET_LAN_MASK_FMT \"ifconfig %s | grep 'inet addr' | awk '{print $4}' | awk -F: '{print $2}'\"\n\n\nint current_log_level = LOG_LEVEL_INFO;\naf_run_time_status_t g_af_status;\nint g_oaf_config_change = 1;\naf_config_t g_af_config;\nint g_hnat_init = 0;\nint g_feature_update = 0;\nint g_feature_update_time = 0;\nvoid oaf_timeout_handler(struct uloop_timeout *t);\n\nvoid af_init_time_status(void){\n    g_af_status.filter = 0;\n    g_af_status.deny_time = 0;\n    g_af_status.allow_time = 0;\n    g_af_status.match_time = 0;\n    g_af_status.remain_time = 0;\n    g_af_status.used_time = 0;\n    g_af_status.period_blocked = 0;\n}\n\n\nvoid af_init_status(void){\n    af_init_time_status();\n}\nstruct uloop_timeout dev_tm = {\n    .cb = oaf_timeout_handler};\n\n\nstatic struct uloop_fd appfilter_nl_fd = {\n    .cb = appfilter_nl_handler,\n};\n\n\nvoid apply_time_config_to_uci(af_time_config_t *time_config){\n\tstruct uci_context *uci_ctx = uci_alloc_context();\n\tif (!uci_ctx) {\n\t\tprintf(\"Failed to allocate UCI context\\n\");\n\t\treturn;\n\t}\n\taf_uci_set_int_value(uci_ctx, \"appfilter.time.time_mode\", time_config->time_mode);\n\n\t// Build days string from global weekday array (used as fallback)\n\tchar days_str[128] = {0};\n\tint first = 1;\n\tint i, j;\n\tfor (i = 0; i < 7; i++) {\n\t\tif (time_config->days[i] == 1) {\n\t\t\tif (!first) {\n\t\t\t\tstrcat(days_str, \" \");\n\t\t\t}\n\t\t\tchar tmp[8];\n\t\t\tsnprintf(tmp, sizeof(tmp), \"%d\", i);\n\t\t\tstrcat(days_str, tmp);\n\t\t\tfirst = 0;\n\t\t}\n\t}\n\taf_uci_set_value(uci_ctx, \"appfilter.time.days\", days_str);\n\n\tif (time_config->time_mode == 0) {\n\t\t// Manual mode: write time_list\n\t\taf_uci_delete(uci_ctx, \"appfilter.time.time\");\n\t\tint time_list_len = time_config->time_num;\n\t\tfor (i = 0; i < time_list_len; i++) {\n\t\t\tchar time_str[256] = {0};\n\t\t\t// Build weekday string: \"1,2,4,5\"\n\t\t\tchar weekday_str[64] = {0};\n\t\t\tfirst = 1;\n\t\t\tfor (j = 0; j < 7; j++) {\n\t\t\t\tif (time_config->time_list[i].days[j] == 1) {\n\t\t\t\t\tif (!first) {\n\t\t\t\t\t\tstrcat(weekday_str, \",\");\n\t\t\t\t\t}\n\t\t\t\t\tchar tmp[8];\n\t\t\t\t\tsnprintf(tmp, sizeof(tmp), \"%d\", j);\n\t\t\t\t\tstrcat(weekday_str, tmp);\n\t\t\t\t\tfirst = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\t// Format time: \"HH:MM\" with zero padding\n\t\t\tchar start_time_str[16] = {0};\n\t\t\tchar end_time_str[16] = {0};\n\t\t\tsnprintf(start_time_str, sizeof(start_time_str), \"%02d:%02d\", \n\t\t\t\t\ttime_config->time_list[i].start_time.hour, \n\t\t\t\t\ttime_config->time_list[i].start_time.min);\n\t\t\tsnprintf(end_time_str, sizeof(end_time_str), \"%02d:%02d\", \n\t\t\t\t\ttime_config->time_list[i].end_time.hour, \n\t\t\t\t\ttime_config->time_list[i].end_time.min);\n\t\t\t\n\t\t\t// Format: \"1,2,4,5;00:00-23:59\"\n\t\t\tsnprintf(time_str, sizeof(time_str), \"%s;%s-%s\", weekday_str, start_time_str, end_time_str);\n\t\t\t\n\t\t\tprintf(\"time_str: %s\\n\", time_str);\n\t\t\taf_uci_add_list(uci_ctx, \"appfilter.time.time\", time_str);\n\t\t}\n\t} else {\n\t\t// Dynamic mode: write seg_time, deny_time, allow_time\n\t\taf_uci_set_int_value(uci_ctx, \"appfilter.time.deny_time\", time_config->deny_time);\n\t\taf_uci_set_int_value(uci_ctx, \"appfilter.time.allow_time\", time_config->allow_time);\n\n\t\tchar start_time_str[16] = {0};\n\t\tchar end_time_str[16] = {0};\n\t\t// Format time: \"HH:MM\" with zero padding\n\t\tsnprintf(start_time_str, sizeof(start_time_str), \"%02d:%02d\", \n\t\t\t\ttime_config->seg_time.start_time.hour, \n\t\t\t\ttime_config->seg_time.start_time.min);\n\t\tsnprintf(end_time_str, sizeof(end_time_str), \"%02d:%02d\", \n\t\t\t\ttime_config->seg_time.end_time.hour, \n\t\t\t\ttime_config->seg_time.end_time.min);\n\t\t\n\t\taf_uci_set_value(uci_ctx, \"appfilter.time.start_time\", start_time_str);\n\t\taf_uci_set_value(uci_ctx, \"appfilter.time.end_time\", end_time_str);\n\t}\n\taf_uci_commit(uci_ctx, \"appfilter\");\n\n\tuci_free_context(uci_ctx);\n}\n\n\nint af_load_time_config(af_time_config_t *t_config)\n{\n    char time_list_buf[MAX_TIME_LIST_LEN] = {0};\n    char days_buf[128] = {0};\n    char start_time_buf[128] = {0};\n    char end_time_buf[128] = {0};\n    struct uci_context *ctx = uci_alloc_context();\n\tint old_ver_config = 0;\n    printf(\"af_load_time_config: start\\n\");\n    if (!ctx)\n        return -1;\n    memset(t_config, 0, sizeof(af_time_config_t));\n    t_config->time_mode = af_uci_get_int_value(ctx, \"appfilter.time.time_mode\");\n    t_config->deny_time = af_uci_get_int_value(ctx, \"appfilter.time.deny_time\");\n    t_config->allow_time = af_uci_get_int_value(ctx, \"appfilter.time.allow_time\");\n    \n    af_uci_get_value(ctx, \"appfilter.time.start_time\", start_time_buf, sizeof(start_time_buf));\n    af_uci_get_value(ctx, \"appfilter.time.end_time\", end_time_buf, sizeof(end_time_buf));\n    af_uci_get_value(ctx, \"appfilter.time.days\", days_buf, sizeof(days_buf));\n    sscanf(start_time_buf, \"%d:%d\", &t_config->seg_time.start_time.hour, &t_config->seg_time.start_time.min);\n    sscanf(end_time_buf, \"%d:%d\", &t_config->seg_time.end_time.hour, &t_config->seg_time.end_time.min);\n    t_config->time_num = 0;\n    // Parse global days (may be empty, continue even if empty)\n    char *saveptr2 = NULL;\n    char *p = strtok_r(days_buf, \" \", &saveptr2);\n    if (p) {\n        do {\n            t_config->days[atoi(p)] = 1;\n            printf(\"af_load_time_config: day[%d] = 1\\n\", atoi(p));\n            p = strtok_r(NULL, \" \", &saveptr2);\n        } while (p != NULL);\n    }\n\n    af_uci_get_list_value(ctx, \"appfilter.time.time\", time_list_buf, sizeof(time_list_buf), \" \");\n    printf(\"af_load_time_config: time_list_buf from uci: %s\\n\", time_list_buf);\n    \n    char time_list_copy[MAX_TIME_LIST_LEN] = {0};\n    strncpy(time_list_copy, time_list_buf, sizeof(time_list_copy) - 1);\n    \n    // Use strtok_r to avoid issues with nested strtok calls\n    char *saveptr1 = NULL;\n    p = strtok_r(time_list_copy, \" \", &saveptr1);\n    if (!p) {\n        printf(\"af_load_time_config: no time periods found\\n\");\n        goto EXIT;\n    }\n    \n    int period_idx = 0;\n    do\n    {\n        printf(\"af_load_time_config: parsing period[%d]: %s\\n\", period_idx, p);\n        \n        char *time_part = p;\n        // Initialize days array for this time period (use global days as default)\n        int i;\n        for (i = 0; i < 7; i++) {\n            t_config->time_list[t_config->time_num].days[i] = t_config->days[i];\n        }\n        \n        // Check if format is new (with weekdays): \"1,2,4,5;00:00-23:59\"\n        char *semicolon = strchr(p, ';');\n        if (semicolon) {\n            // New format: parse weekdays and store in this time period's days array\n            char weekday_str[64] = {0};\n            strncpy(weekday_str, p, semicolon - p);\n            weekday_str[semicolon - p] = '\\0';\n            time_part = semicolon + 1;\n            \n            printf(\"af_load_time_config: period[%d] has weekdays: %s, time_part: %s\\n\", period_idx, weekday_str, time_part);\n            \n            // Clear days array for this time period first\n            for (i = 0; i < 7; i++) {\n                t_config->time_list[t_config->time_num].days[i] = 0;\n            }\n            \n            // Parse weekdays: \"1,2,4,5\" using strtok_r\n            char weekday_copy[64] = {0};\n            strncpy(weekday_copy, weekday_str, sizeof(weekday_copy) - 1);\n            char *saveptr2 = NULL;\n            char *wd = strtok_r(weekday_copy, \",\", &saveptr2);\n            while (wd) {\n                int day_val = atoi(wd);\n                if (day_val >= 0 && day_val < 7) {\n                    t_config->time_list[t_config->time_num].days[day_val] = 1;\n                    printf(\"af_load_time_config: period[%d] set day %d\\n\", period_idx, day_val);\n                }\n                wd = strtok_r(NULL, \",\", &saveptr2);\n            }\n        } else {\n            LOG_WARN(\"af_load_time_config: period[%d] no weekdays, using global days\\n\", period_idx);\n\t\t\told_ver_config = 1;\n        }\n        // If no semicolon, use global days (already copied above)\n        \n        // Parse time: \"00:00-23:59\" or \"1,2,4,5;00:00-23:59\" (time_part already points to time part)\n        int ret = sscanf(time_part, \"%d:%d-%d:%d\", &t_config->time_list[t_config->time_num].start_time.hour,\n             &t_config->time_list[t_config->time_num].start_time.min, &t_config->time_list[t_config->time_num].end_time.hour, &t_config->time_list[t_config->time_num].end_time.min);\n        if (ret != 4) {\n            printf(\"af_load_time_config: period[%d] ERROR: failed to parse time from %s\\n\", period_idx, time_part);\n        } else {\n            printf(\"af_load_time_config: time[%d] %d:%d-%d:%d, days: \", t_config->time_num, t_config->time_list[t_config->time_num].start_time.hour, t_config->time_list[t_config->time_num].start_time.min,\n                     t_config->time_list[t_config->time_num].end_time.hour, t_config->time_list[t_config->time_num].end_time.min);\n            for (i = 0; i < 7; i++) {\n                if (t_config->time_list[t_config->time_num].days[i]) {\n                    printf(\"%d \", i);\n                }\n            }\n            printf(\"\\n\");\n            t_config->time_num++;\n        }\n        period_idx++;\n    } while (p = strtok_r(NULL, \" \", &saveptr1));\n    \n    printf(\"af_load_time_config: total periods loaded: %d\\n\", t_config->time_num);\n    \n    // Load mode 2 daily limit config (if time_mode is 2)\n    if (t_config->time_mode == 2) {\n        int weekday;\n        for (weekday = 0; weekday < 7; weekday++) {\n            char uci_key[64] = {0};\n            snprintf(uci_key, sizeof(uci_key), \"appfilter.time.daily_limit_%d\", weekday);\n            \n            char daily_limit_str[128] = {0};\n            af_uci_get_value(ctx, uci_key, daily_limit_str, sizeof(daily_limit_str));\n            \n            // Initialize to default values\n            t_config->daily_limit[weekday].enable = 0;\n            t_config->daily_limit[weekday].am_time = 0;\n            t_config->daily_limit[weekday].pm_time = 0;\n            \n            // Parse format: \"enable:am_time:pm_time\"\n            if (strlen(daily_limit_str) > 0) {\n                char *first_colon = strchr(daily_limit_str, ':');\n                if (first_colon) {\n                    char *second_colon = strchr(first_colon + 1, ':');\n                    if (second_colon) {\n                        // New format: \"enable:am_time:pm_time\"\n                        t_config->daily_limit[weekday].enable = atoi(daily_limit_str);\n                        t_config->daily_limit[weekday].am_time = atoi(first_colon + 1);\n                        t_config->daily_limit[weekday].pm_time = atoi(second_colon + 1);\n                    } else {\n                        // Old format: \"am_time:pm_time\"\n                        t_config->daily_limit[weekday].enable = 1;\n                        t_config->daily_limit[weekday].am_time = atoi(daily_limit_str);\n                        t_config->daily_limit[weekday].pm_time = atoi(first_colon + 1);\n                    }\n                } else {\n                    t_config->daily_limit[weekday].enable = 1;\n                    t_config->daily_limit[weekday].am_time = atoi(daily_limit_str);\n                }\n            }\n            printf(\"af_load_time_config: daily_limit[%d] enable=%d, am_time=%d, pm_time=%d\\n\", \n                   weekday, t_config->daily_limit[weekday].enable, \n                   t_config->daily_limit[weekday].am_time, t_config->daily_limit[weekday].pm_time);\n        }\n    }\n    \nEXIT:\n    uci_free_context(ctx);\n    return old_ver_config;\n}\n\n\nvoid af_load_global_config(af_global_config_t *config){\n    int ret = 0;\n\tchar lan_ifname[32] = {0};\n    struct uci_context *ctx = uci_alloc_context();\n    if (!ctx)\n        return;\n    ret = af_uci_get_int_value(ctx, \"appfilter.global.enable\");\n    if (ret < 0)\n        config->enable = 0;\n    else\n        config->enable = ret;\n\n    ret = af_uci_get_int_value(ctx, \"appfilter.global.record_enable\");\n    if (ret < 0)\n        config->record_enable = 0;\n    else\n        config->record_enable = ret;\n\n    ret = af_uci_get_int_value(ctx, \"appfilter.global.user_mode\");\n    if (ret < 0)\n        config->user_mode = 0;\n    else\n        config->user_mode = ret;\n\n    ret = af_uci_get_int_value(ctx, \"appfilter.global.work_mode\");\n    if (ret < 0)\n        config->work_mode = 0;\n    else\n        config->work_mode = ret;\n    ret = af_uci_get_int_value(ctx, \"appfilter.global.tcp_rst\");\n    if (ret < 0)\n        config->tcp_rst = 1;\n    else\n        config->tcp_rst = ret;\n\n    ret = af_uci_get_int_value(ctx, \"appfilter.global.disable_hnat\");\n    if (ret < 0)\n        config->disable_hnat = 1;\n    else\n        config->disable_hnat = ret;\n\n    ret = af_uci_get_int_value(ctx, \"appfilter.global.auto_load_engine\");\n    if (ret < 0)\n        config->auto_load_engine = 0;\n    else\n        config->auto_load_engine = ret;\n\n    ret = af_uci_get_int_value(ctx, \"appfilter.global.disable_quic\");\n    if (ret < 0)\n        config->disable_quic = 0;\n    else\n        config->disable_quic = ret;\n\n    ret = af_uci_get_int_value(ctx, \"appfilter.global.app_filter_mode\");\n    if (ret < 0)\n        config->app_filter_mode = 0; // Default to specified apps mode\n    else\n        config->app_filter_mode = ret;\n\n    ret = af_uci_get_value(ctx, \"appfilter.global.lan_ifname\", lan_ifname, sizeof(lan_ifname));\n\tif (ret < 0)\n\t\tstrncpy(config->lan_ifname, \"br-lan\", sizeof(config->lan_ifname) - 1);\n\telse\n\t\tstrncpy(config->lan_ifname, lan_ifname, sizeof(config->lan_ifname) - 1);\n\n    uci_free_context(ctx);\n    LOG_DEBUG(\"enable=%d, user_mode=%d, work_mode=%d, disable_quic=%d, app_filter_mode=%d\\n\", config->enable, config->user_mode, config->work_mode, config->disable_quic, config->app_filter_mode);\n}\n\nvoid af_load_config(af_config_t *config){\n    memset(config, 0, sizeof(af_config_t));\n    af_load_global_config(&config->global);\n    if (1 == af_load_time_config(&config->time)){\n\t\tapply_time_config_to_uci(&config->time);\n\t}\n}\n\n\nvoid update_oaf_proc_value(char *key, char *value){\n    char cmd_buf[128] = {0};\n    char file_path[128] = {0};\n    char old_value[128] = {0};\n    sprintf(file_path, \"/proc/sys/oaf/%s\", key);\n\n    if (af_read_file_value(file_path, old_value, sizeof(old_value)) == -1)\n        return;\n    if (strcmp(old_value, value) != 0){\n        sprintf(cmd_buf, \"echo %s >/proc/sys/oaf/%s\", value, key);\n        system(cmd_buf);\n        LOG_DEBUG(\"update %s %s-->%s\\n\", key, old_value, value);\n    }\n}\n\nvoid update_oaf_proc_u32_value(char *key, u_int32_t value){\n    char buf[32] = {0};\n    sprintf(buf, \"%u\", value);\n    update_oaf_proc_value(key, buf);\n}\n\nvoid update_lan_ip(void){\n    char ip_str[32] = {0};\n\tchar mask_str[32] = {0};\n    struct in_addr addr;\n\tstruct in_addr mask_addr;\n    char cmd_buf[128] = {0};\n    u_int32_t lan_ip = 0;\n\tu_int32_t lan_mask = 0;\n    char lan_ifname[32] = {0};\n    char ip_cmd_buf[128] = {0};\n    char mask_cmd_buf[128] = {0};\n    struct uci_context *ctx = uci_alloc_context();\n    if (!ctx)\n        return;\n\t\n    int ret = af_uci_get_value(ctx, \"appfilter.global.lan_ifname\", lan_ifname, sizeof(lan_ifname) - 1);\n    if (ret != 0){\n        strcpy(lan_ifname, \"br-lan\");\n    }\n    sprintf(ip_cmd_buf, CMD_GET_LAN_IP_FMT , lan_ifname);\n    sprintf(mask_cmd_buf, CMD_GET_LAN_MASK_FMT , lan_ifname);\n\n    exec_with_result_line(ip_cmd_buf, ip_str, sizeof(ip_str));\n    if (strlen(ip_str) < MIN_INET_ADDR_LEN){\n        update_oaf_proc_u32_value(\"lan_ip\", 0);\n    }\n    else{\n        inet_aton(ip_str, &addr);\n        lan_ip = addr.s_addr;\n        update_oaf_proc_u32_value(\"lan_ip\", lan_ip);\n    }\n\n    exec_with_result_line(mask_cmd_buf, mask_str, sizeof(mask_str));\n\n    if (strlen(mask_str) < MIN_INET_ADDR_LEN){\n        update_oaf_proc_u32_value(\"lan_mask\", 0);\n    }\n    else{\n        inet_aton(mask_str, &mask_addr);\n        lan_mask = mask_addr.s_addr;\n        update_oaf_proc_u32_value(\"lan_mask\", lan_mask);\n    }\n\tuci_free_context(ctx);\n}\n\n\n\n\nint af_check_time_manual(af_time_config_t *t_config) {\n    time_t now = time(NULL);\n    struct tm *current_time = localtime(&now);\n    int current_minutes = current_time->tm_hour * 60 + current_time->tm_min;\n    int current_wday = current_time->tm_wday;\n\n    int i;\n    for (i = 0; i < t_config->time_num; i++) {\n        if (!t_config->time_list[i].days[current_wday]) {\n            printf(\"current day %d not in time[%d] days\\n\", current_wday, i);\n            continue;\n        }\n        \n        int start_minutes = t_config->time_list[i].start_time.hour * 60 + t_config->time_list[i].start_time.min;\n        int end_minutes = t_config->time_list[i].end_time.hour * 60 + t_config->time_list[i].end_time.min;\n        printf(\"check time: %02d:%02d-%02d:%02d\\n\", \n               t_config->time_list[i].start_time.hour, t_config->time_list[i].start_time.min,\n               t_config->time_list[i].end_time.hour, t_config->time_list[i].end_time.min);\n        \n        if (current_minutes >= start_minutes && current_minutes <= end_minutes) {\n            printf(\"current time in time list\\n\");\n            g_af_status.match_time = 1;\n            return 1;\n        }\n    }\n    g_af_status.match_time = 0;\n    return 0;\n}\n\nint af_check_time_dynamic(af_time_config_t *t_config) {\n    return g_af_status.filter;\n}\n\n\nint update_dynamic_used_time(af_time_config_t *t_config){\n    if (t_config->time_mode != 1) \n\t\treturn -1;\n\ttime_t now = time(NULL);\n    struct tm *current_time = localtime(&now);\n\n\tif (!t_config->days[current_time->tm_wday]) {\n\t   LOG_DEBUG(\"current day not in configured days\\n\");\n\t   af_init_time_status();\n\t   return -1;\n    }\n\n\t\n    int current_minutes = current_time->tm_hour * 60 + current_time->tm_min;\n\n    int start_minutes = t_config->seg_time.start_time.hour * 60 + t_config->seg_time.start_time.min;\n    int end_minutes = t_config->seg_time.end_time.hour * 60 + t_config->seg_time.end_time.min;\n    LOG_DEBUG(\"check seg_time: %02d:%02d-%02d:%02d\\n\", \n           t_config->seg_time.start_time.hour, t_config->seg_time.start_time.min,\n           t_config->seg_time.end_time.hour, t_config->seg_time.end_time.min);\n    if (!(current_minutes >= start_minutes && current_minutes <= end_minutes)) {\n        LOG_DEBUG(\"current time not in seg_time\\n\");\n        af_init_time_status();\n        return 0; \n    }\n\n    g_af_status.match_time = 1;\n    if (g_af_status.filter == 1) {\n        g_af_status.deny_time++;\n        if (g_af_status.deny_time >= t_config->deny_time) {\n            g_af_status.filter = 0;\n            g_af_status.deny_time = 0;\n        }\n    } else {\n        g_af_status.allow_time++;\n        if (g_af_status.allow_time >= t_config->allow_time) {\n            g_af_status.filter = 1;\n            g_af_status.allow_time = 0;\n        }\n    }\n\treturn 0;\n}\n\n\nint af_check_time_period_limit(af_time_config_t *t_config) {\n    int total_active_time = 0;\n    int selected_user_count = 0;\n    int i;\n\n    time_t now = time(NULL);\n    struct tm *current_time = localtime(&now);\n    int current_weekday = current_time->tm_wday; \n    int current_hour = current_time->tm_hour;\n    \n    LOG_DEBUG(\"check period limit mode: weekday=%d, hour=%d\\n\", current_weekday, current_hour);\n    \n    daily_limit_config_t *daily_limit = &t_config->daily_limit[current_weekday];\n    \n    if (!daily_limit->enable) {\n        LOG_DEBUG(\"Time limit not enabled for weekday %d\\n\", current_weekday);\n        g_af_status.match_time = 0;\n        g_af_status.remain_time = 0;\n        g_af_status.used_time = 0;\n        g_af_status.period_blocked = 0; \n        return 0;\n    }\n    \n    int max_allowed_time = 0;\n    int is_morning = (current_hour < 12);\n    \n    if (is_morning) {\n        max_allowed_time = daily_limit->am_time;\n        LOG_DEBUG(\"Morning period: max_allowed_time=%d\\n\", max_allowed_time);\n    } else {\n        max_allowed_time = daily_limit->pm_time;\n        LOG_DEBUG(\"Afternoon period: max_allowed_time=%d\\n\", max_allowed_time);\n    }\n    \n    if (max_allowed_time <= 0) {\n        LOG_DEBUG(\"No time limit set for current period\\n\");\n        g_af_status.match_time = 0;\n        g_af_status.remain_time = 0;\n        g_af_status.used_time = 0;\n        g_af_status.period_blocked = 0;\n        return 0;\n    }\n    \n    check_all_users_period_time();\n    \n    for (i = 0; i < MAX_DEV_NODE_HASH_SIZE; i++) {\n        dev_node_t *node = dev_hash_table[i];\n        while (node) {\n            if (node->is_selected) {\n                if (is_morning) {\n                    total_active_time += node->today_am_active_time;\n                    LOG_DEBUG(\"Selected user %s (online=%d): today_am_active_time=%d, total=%d\\n\", \n                             node->mac, node->online, node->today_am_active_time, total_active_time);\n                } else {\n                    total_active_time += node->today_pm_active_time;\n                    LOG_DEBUG(\"Selected user %s (online=%d): today_pm_active_time=%d, total=%d\\n\", \n                             node->mac, node->online, node->today_pm_active_time, total_active_time);\n                }\n                if (node->online) {\n                    selected_user_count++;\n                }\n            }\n            node = node->next;\n        }\n    }\n    \n    g_af_status.used_time = total_active_time;\n    \n    int remain_time = max_allowed_time - total_active_time;\n    if (remain_time < 0) {\n        remain_time = 0;\n    }\n    g_af_status.remain_time = remain_time;\n    \n    LOG_DEBUG(\"Selected users count: %d, total_active_time=%d, max_allowed=%d, remain_time=%d\\n\", \n             selected_user_count, total_active_time, max_allowed_time, remain_time);\n    \n    if (total_active_time >= max_allowed_time) {\n        g_af_status.match_time = 1;\n        g_af_status.period_blocked = 1; \n        LOG_DEBUG(\"Period limit mode: enable filter (total time exceeded: %d >= %d)\\n\", \n                 total_active_time, max_allowed_time);\n        return 1; \n    } else {\n        g_af_status.match_time = 1;\n        g_af_status.period_blocked = 0; \n        LOG_DEBUG(\"Period limit mode: disable filter (total time: %d < %d, remain: %d)\\n\", \n                 total_active_time, max_allowed_time, remain_time);\n        return 0; \n    }\n}\n\nint af_check_time_valid(af_time_config_t *t_config) {\n    time_t now = time(NULL);\n    struct tm *current_time = localtime(&now);\n\t\n    if (t_config->time_mode == 0) {\n        return af_check_time_manual(t_config);\n    } else if (t_config->time_mode == 1) {\n\t\treturn af_check_time_dynamic(t_config);\n    } else if (t_config->time_mode == 2) {\n\t\treturn af_check_time_period_limit(t_config);\n    }else{\n\t\treturn 0;\n\t}\n}\n\n\nvoid update_oaf_status(void){\n    int ret = 0;\n    int cur_enable = 0;\n    if(g_af_config.global.enable == 1){\n\t\tret = af_check_time_valid(&g_af_config.time);\n\t}\n    update_oaf_proc_value(\"enable\", ret == 1 ? \"1\" : \"0\");\n}\n\nvoid update_oaf_record_status(void){\n    update_oaf_proc_value(\"record_enable\", g_af_config.global.record_enable==1?\"1\":\"0\");\n}\n\nvoid update_oaf_disable_quic_status(void){\n    update_oaf_proc_value(\"disable_quic\", g_af_config.global.disable_quic==1?\"1\":\"0\");\n}\n\nvoid update_oaf_app_filter_mode_status(void){\n    update_oaf_proc_value(\"app_filter_mode\", g_af_config.global.app_filter_mode==1?\"1\":\"0\");\n}\n\n\nint af_nl_clean_feature(void){\n    af_msg_t msg;\n    if (appfilter_nl_fd.fd < 0){\n        return -1;\n    }\n    msg.action = AF_MSG_CLEAN_FEATURE;\n  \n    send_msg_to_kernel(appfilter_nl_fd.fd,(void *)&msg, sizeof(msg));\n    return 0;\n}\n\nint af_nl_add_feature(char *feature){\n    char msg_buf[1024] = {0};\n    if (appfilter_nl_fd.fd < 0){\n        return -1;\n    }\n    char *p_data = msg_buf + sizeof(af_msg_t);\n    memset(msg_buf, 0, sizeof(msg_buf));\n\n    af_msg_t *hdr = (af_msg_t *)msg_buf;\n    hdr->action = AF_MSG_ADD_FEATURE;\n    strncpy(p_data, feature, strlen(feature));\n    send_msg_to_kernel(appfilter_nl_fd.fd,(void *)msg_buf, sizeof(af_msg_t) + strlen(feature) + 1);\n    return 0;\n}\n\n\n\nint af_load_feature_to_kernel(void){\n\tchar line_buf[MAX_FEATURE_LINE_LEN] = {0};\n\tFILE *fp = fopen(\"/tmp/feature.cfg\", \"r\");\n\tif (!fp)\n\t{\n\t\tprintf(\"open file failed\\n\");\n\t\treturn -1;\n\t}\n\tif (af_nl_clean_feature() < 0){\n        return -1;\n    }\n\twhile (fgets(line_buf, sizeof(line_buf), fp))\n\t{\n\t\tstr_trim(line_buf);\n\t\tif (strlen(line_buf) < 8)\n\t\t\tcontinue;\n\t\tif (strstr(line_buf, \"#\"))\n\t\t\tcontinue;\n\t\t\n\t\tif (strlen(line_buf) >= MAX_FEATURE_LINE_LEN - 1){\n\t\t\tcontinue;\n\t\t}\n\t\taf_nl_add_feature(line_buf);\n\t}\n\tfclose(fp);\n    return 0;\n}\n\nint reload_feature(void){\n    system(\"gen_class.sh /tmp/feature.cfg\");\n    init_app_name_table();\n    init_app_class_name_table();\n    if (af_load_feature_to_kernel() < 0){\n        LOG_ERROR(\"Failed to load feature to kernel\\n\");\n        return -1;\n    }\n    clean_invalid_app_records();\n    clear_device_app_statistics();\n    LOG_WARN(\"reload feature success\\n\");\n    g_feature_update_time = get_timestamp();\n    return 0;\n}\n\n\nvoid check_date_change(void)\n{\n    static int last_day = -1;\n    time_t now = time(NULL);\n    struct tm *tm_info = localtime(&now);\n    int current_day = tm_info->tm_mday;\n    if (last_day != current_day )\n    {\n        LOG_WARN(\"day changed: %d -> %d\\n\",last_day, current_day);\n        if (last_day != -1){\n            clear_device_app_statistics();\n            reset_all_users_today_active_time();\n\t\t\treset_all_users_today_flow();\n        }\n        last_day = current_day;\n    }\n}\n\n\nvoid oaf_timeout_handler(struct uloop_timeout *t)\n{\n    static int count = 0;\n    if (count % 10 == 0){\n        update_dev_list();\n\t\tupdate_oaf_status();\n    }\n    if (count % 60 == 0){\n\t\tLOG_DEBUG(\"begin check dev count = %d\\n\", count);\n        check_dev_visit_info_expire();\n        flush_expire_visit_info();\n\t\tupdate_dynamic_used_time(&g_af_config.time);\n\t\tupdate_oaf_status();\n        update_lan_ip();\n        if (check_dev_expire()){\n            flush_dev_expire_node();\n        }\n        check_date_change();\n        check_all_users_period_time();\n        dump_dev_list();\n    }\n    if (count % 300 == 0 && count > 0 && g_af_config.time.time_mode == 2){\n        save_user_time_to_file();\n    }\n    if (g_oaf_config_change == 1){\n\t\tLOG_WARN(\"config changed\\n\");\n        update_lan_ip();\n        af_load_config(&g_af_config);\n        update_dev_selected_flag(); \n\t\tupdate_dynamic_used_time(&g_af_config.time);\n        update_oaf_status();\n        update_oaf_record_status();\n        update_oaf_disable_quic_status();\n        update_oaf_app_filter_mode_status();\n        g_oaf_config_change = 0;\n    }\n\n    if (appfilter_nl_fd.fd < 0 && access(\"/proc/sys/oaf\", F_OK) == 0){\n        appfilter_nl_fd.fd = appfilter_nl_init();\n        if (appfilter_nl_fd.fd > 0){\n            uloop_fd_add(&appfilter_nl_fd, ULOOP_READ);\n            system(\"oaf_rule reload &\");\n            LOG_INFO(\"netlink connect success\\n\");\n        }\n    }\n\n    if (g_feature_update == 1 && appfilter_nl_fd.fd > 0){\n        if (0 == reload_feature()){\n            g_feature_update = 0;\n        }\n    }\n    count++;\n    uloop_timeout_set(t, 1000);\n}\n\nvoid af_load_engine(void){\n    if (g_af_config.global.auto_load_engine == 1){\n        if (access(\"/lib/modules/oaf.ko\", F_OK) == 0) {\n            system(\"insmod /lib/modules/oaf.ko\");\n            LOG_WARN(\"insmod /lib/modules/oaf.ko\");\n        } else {\n            system(\"modprobe oaf\");\n            LOG_WARN(\"modprobe oaf\");\n        }\n    }\n    else{\n        LOG_WARN(\"auto load disabled, not load oaf.ko\\n\");\n    }\n}\n\n\nvoid handle_sigusr1(int sig) {\n    LOG_WARN(\"Received SIGUSR1 signal\\n\");\n    g_feature_update = 1;\n}\n\nvoid handle_sigusr2(int sig) {\n    LOG_INFO(\"Received SIGUSR2 signal\\n\");\n\tif (current_log_level >= LOG_LEVEL_ERROR)\n   \t\tcurrent_log_level = LOG_LEVEL_DEBUG;\n\telse\n\t\tcurrent_log_level++;\n\tLOG_WARN(\"change log level to %d\\n\", current_log_level);\n}\n\n\nint main(int argc, char **argv)\n{\n    int ret = 0;\n    LOG_INFO(\"appfilter start\");\n    g_feature_update = 1;\n    af_load_config(&g_af_config);\n    af_load_engine();\n    af_init_status();\n    uloop_init();\n    signal(SIGUSR1, handle_sigusr1);\n    signal(SIGUSR2, handle_sigusr2);\n    signal(SIGCHLD, SIG_IGN);\n    init_dev_node_htable();\n    \n    load_user_time_from_file();\n    \n    if (appfilter_ubus_init() < 0)\n    {\n        LOG_ERROR(\"Failed to connect to ubus\\n\");\n        return 1;\n    }  \n    appfilter_nl_fd.fd = -1;\n    uloop_timeout_set(&dev_tm, 5000);\n    uloop_timeout_add(&dev_tm);\n    uloop_run();\n    uloop_done();\n    return 0;\n}\n"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/src/utils.c",
    "content": "\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <unistd.h>\r\n#include <ctype.h>\r\n#include <stdio.h>\r\n#include <string.h>\r\n#include <stdlib.h>\r\n#include <arpa/inet.h>\r\n#include <sys/time.h>\r\n\r\n\r\nchar *str_trim(char *s) {\r\n    char *start, *last, *bk;\r\n    int len;\r\n\r\n    start = s;\r\n    while (isspace(*start))\r\n        start++;\r\n\r\n    bk = last = s + strlen(s) - 1;\r\n    while (last > start && isspace(*last))\r\n        last--;\r\n\r\n    if ((s != start) || (bk != last)) {\r\n        len = last - start + 1;\r\n        strncpy(s, start, len);\r\n        s[len] = '\\0';\r\n    }   \r\n    return s;\r\n}\r\n\r\nint exec_with_result_line(char *cmd, char *result, int len)\r\n{\r\n    FILE *fp = NULL;\r\n\tif (!cmd || !result || !len)\r\n\t\treturn -1;\r\n    fp = popen(cmd, \"r\");\r\n    if (!fp) \r\n        return -1;\r\n    fgets(result, len, fp);   \r\n    str_trim(result);\r\n    pclose(fp);\r\n\treturn 0;\r\n}\r\nunsigned int get_timestamp(void)\r\n{\r\n    struct timeval cur_time;\r\n    gettimeofday(&cur_time, NULL);\r\n    return cur_time.tv_sec;\r\n}\r\n\r\nint check_same_network(char *ip1, char *netmask, char *ip2) {\r\n    struct in_addr addr1, addr2, mask;\r\n\r\n    if (inet_pton(AF_INET, ip1, &addr1) != 1) {\r\n        printf(\"Invalid IP address: %s\\n\", ip1);\r\n        return -1;\r\n    }\r\n    if (inet_pton(AF_INET, netmask, &mask) != 1) {\r\n        printf(\"Invalid netmask: %s\\n\", netmask);\r\n        return -1;\r\n    }\r\n    if (inet_pton(AF_INET, ip2, &addr2) != 1) {\r\n        printf(\"Invalid IP address: %s\\n\", ip2);\r\n        return -1;\r\n    }\r\n\r\n    if ((addr1.s_addr & mask.s_addr) == (addr2.s_addr & mask.s_addr)) {\r\n        return 1;\r\n    } else {\r\n        return 0;\r\n    }\r\n}\r\n\r\n\r\nint af_read_file_value(const char *file_path, char *value, int value_len) {\r\n    FILE *file = fopen(file_path, \"r\");\r\n    if (!file) {\r\n        //perror(\"Failed to open file\");\r\n        return -1;\r\n    }\r\n\r\n    if (fgets(value, value_len, file) == NULL) {\r\n        perror(\"Failed to read line from file\");\r\n        fclose(file);\r\n        return -2;\r\n    }\r\n\r\n    size_t len = strlen(value);\r\n    if (len > 0 && value[len - 1] == '\\n') {\r\n        value[len - 1] = '\\0';\r\n    }\r\n\r\n    fclose(file);\r\n    return 0;\r\n}\r\n\r\nint af_read_file_int_value(const char *file_path, int *value) {\r\n    char line_buf[128] = {0};\r\n    if (af_read_file_value(file_path, line_buf, sizeof(line_buf)) < 0){\r\n        return -1;\r\n    }\r\n    *value = atoi(line_buf);\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "relevance/OpenAppFilter/open-app-filter/src/utils.h",
    "content": "#ifndef __UTILS_H__\r\n#define __UTILS_H__\r\nchar *str_trim(char *s);\r\nint exec_with_result_line(char *cmd, char *result, int len);\r\nint check_same_network(char *ip1, char *netmask, char *ip2);\r\nint af_read_file_value(const char *file_path, char *value, int value_len);\r\nint af_read_file_int_value(const char *file_path, int *value);\r\nunsigned int get_timestamp(void);\r\n#endif"
  },
  {
    "path": "relevance/WiFiPortal/autokick-wiwiz/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=autokick-wiwiz\nPKG_VERSION:=20250205\nPKG_RELEASE:=1\nLUCI_DIR:=/usr/lib/lua/luci\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/autokick-wiwiz\n  SUBMENU:=Portal\n  SECTION:=net\n  CATEGORY:=Wiwiz/PinPinWiFi\n  DEPENDS:=\n  TITLE:= Disconnects wireless user when the user is authenticated and expired via Portal\n  PKGARCH:=all\nendef\n\ndefine Package/autokick-wiwiz/conffiles\n/etc/config/autokick\nendef\n\ndefine Build/Prepare\nendef\n\ndefine Build/Configure\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/autokick-wiwiz/install\n\t$(INSTALL_DIR) $(1)/usr/bin $(1)/etc/config $(1)/etc/init.d\n\t$(INSTALL_DIR) $(1)/usr/lib\n\t$(INSTALL_DIR) $(1)/usr/lib/lua\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci/model\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi\n    \n\t$(INSTALL_BIN) ./files/usr/bin/autokick.sh $(1)/usr/bin/autokick.sh\n\t$(INSTALL_CONF) ./files/etc/config/autokick $(1)/etc/config/autokick\n\t$(INSTALL_BIN) ./files/etc/init.d/autokick $(1)/etc/init.d/autokick  \n\t$(INSTALL_DATA) ./files/usr/lib/lua/luci/controller/autokick.lua $(1)/usr/lib/lua/luci/controller/autokick.lua\n\t$(INSTALL_DATA) ./files/usr/lib/lua/luci/model/cbi/autokick.lua $(1)/usr/lib/lua/luci/model/cbi/autokick.lua\n\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n\n\tpo2lmo ./po/zh_Hans/autokick.po $(1)/usr/lib/lua/luci/i18n/autokick.zh-cn.lmo\t\nendef\n\ndefine Package/autokick-wiwiz/postinst\nendef\n\ndefine Package/autokick-wiwiz/postrm\nendef\n\n$(eval $(call BuildPackage,autokick-wiwiz))\n"
  },
  {
    "path": "relevance/WiFiPortal/autokick-wiwiz/files/etc/config/autokick",
    "content": "config autokick autokick\n        option enabled 0\n        option gw_ip '127.0.0.1'\n        option save_log '1'\n\n"
  },
  {
    "path": "relevance/WiFiPortal/autokick-wiwiz/files/etc/init.d/autokick",
    "content": "#!/bin/sh /etc/rc.common\n#!/bin/sh /etc/rc.common\nUSE_PROCD=1\nSTART=399\n\nstart_service() {\n    procd_open_instance\n    procd_set_param command /usr/bin/autokick.sh\n    procd_set_param respawn\n    procd_close_instance\n}"
  },
  {
    "path": "relevance/WiFiPortal/autokick-wiwiz/files/usr/bin/autokick.sh",
    "content": "#!/bin/sh\n# Wiwiz HotSpot Builder Utility\n# Copyright wiwiz.com. All rights reserved.\n. /usr/share/libubox/jshn.sh\n\nLOGFILE=/tmp/wiwiz_autokick.log\nSLEEPTIME=20\n\ncount_interfaces() {\n    echo $2\n}\n\nmakekickjson() {\n    echo `. /usr/share/libubox/jshn.sh\n    json_init;\n    json_add_string \"addr\" \"$1\";\n    json_add_int \"reason\" 15;\n    json_add_boolean \"deauth\" 1;\n    json_add_string \"ban_time\" \"3000\";\n    json_dump`\n}\n\ndokick() {\n    MAC=$1\n    KICKED=0\n\n    json_load \"$(ubus call network.wireless status)\"\n    json_get_keys keys\n    for DEV in $keys; do\n        echo $DEV\n        if [ \"$DEV\" == \"\" ]; then\n            continue\n        fi\n\n        json_select \"$DEV\"\n        for i in $(json_for_each_item \"count_interfaces\" \"interfaces\"); do\n            echo json_select \"interfaces\"\n            json_select \"interfaces\"\n\n            echo json_select $i\n            json_select $i\n\n            echo json_get_var IFNAME \"ifname\"\n            json_get_var IFNAME \"ifname\"\n\n            echo json_select config\n            json_select config\n            json_get_var MODE \"mode\"\n\n            echo MODE = $MODE, IFNAME = $IFNAME\n            if [ \"$MODE\" == \"ap\" ]; then\n                ACCOCLIST=$(iwinfo $IFNAME assoclist | grep dBm | grep ':' | awk '{print $1}')\n                FINDMAC=$(echo \"$ACCOCLIST\" | grep -i \"$MAC\")\n                if [ \"$FINDMAC\" != \"\" ]; then\n                    echo found $MAC\n                    KICKED=1\n                    # kicks off wireless user\n                    #MSG_JSON=$(sh /usr/bin/makekickjson.sh $MAC 2>/dev/null)\n                    MSG_JSON=$(makekickjson $MAC 2>/dev/null)\n                    echo \"$MSG_JSON\"\n                    ubus call hostapd.$IFNAME del_client \"$MSG_JSON\"\n                    sleep 1\n                    ubus call hostapd.$IFNAME del_client \"$MSG_JSON\"\n\n                    echo ubus call \"hostapd.$IFNAME\" del_client \"$MSG_JSON\"\n                fi\n            fi\n\n            json_select ..\n            json_select ..\n            json_select ..\n            echo 'loop end'\n        done\n        json_select ..\n        echo 'LOOP end'\n    done\n\n    if [ \"$KICKED\" == \"1\" ]; then\n        # tells GW I kicked it\n        _ss=$(curl -m 5 \"http://$GW_IP/cgi-bin/kickmac?act=kick&mac=$MAC\" 2>/dev/null)\n                \n        OUTPUT=\"kick $MAC, GW said: $_ss\"\n        echo $OUTPUT\n        if [ \"$SAVE_LOG\" = \"1\" ]; then\n            echo $OUTPUT>>$LOGFILE\n        fi\n    fi\n}\n\nwhile :\ndo\n    ENABLED=$(uci get autokick.autokick.enabled 2>/dev/null)\n    if [ \"$ENABLED\" != \"1\" ]; then\n        echo \"ENABLED = $ENABLED\"\n        sleep $SLEEPTIME\n        continue\n    fi\n\n    GW_IP=$(uci get autokick.autokick.gw_ip 2>/dev/null)\n    SAVE_LOG=$(uci get autokick.autokick.save_log 2>/dev/null)\n\n    _s=$(curl -m 5 \"http://$GW_IP/cgi-bin/kickmac?act=list\" 2>/dev/null)\n    if [ \"$_s\" == \"\" ]; then\n        echo \"GW says: $_s\"\n        sleep $SLEEPTIME\n        continue\n    fi\n\n    #NOW=$(date +%s)\n    TIMESTAMP=$(echo \"$_s\" | grep 'timestamp' | awk '{print $2}')\n\n    echo \"$_s\" | grep -v 'timestamp' | while read LINE; do\n        if [ \"$LINE\" == \"\" ]; then\n            echo \"LINE is empty\"\n            continue\n        fi\n\n        MAC=$(echo \"$LINE\" | awk '{print $1}')\n        if [ \"$MAC\" == \"\" ]; then\n            echo \"MAC is empty\"\n            continue\n        fi\n        MAC_TIMESTAMP=$(echo \"$LINE\" | awk '{print $2}')\n        if [ \"$MAC_TIMESTAMP\" == \"\" ]; then\n            echo \"MAC_TIMESTAMP is empty\"\n            continue\n        fi\n\n        TIMEDIFF=$(expr \"$TIMESTAMP\" - \"$MAC_TIMESTAMP\")\n        echo \"TIMEDIFF = $TIMEDIFF\"\n        if [ \"$TIMEDIFF\" -lt 60 ]; then # if TIMEDIFF < 60\n            dokick $MAC\n            sleep 4\n            dokick $MAC\n        fi\n    done\n\n\tsleep $SLEEPTIME\ndone\n"
  },
  {
    "path": "relevance/WiFiPortal/autokick-wiwiz/files/usr/lib/lua/luci/controller/autokick.lua",
    "content": "module(\"luci.controller.autokick\", package.seeall)\n\nfunction index()\n\tentry({\"admin\", \"wiwiz_menu\"}, firstchild(), \"Wiwiz\", 60).dependent=true\n\tentry({\"admin\", \"wiwiz_menu\", \"autokick\"}, cbi(\"autokick\"), translate(\"AutoKick\"), 52).dependent = true\nend\n"
  },
  {
    "path": "relevance/WiFiPortal/autokick-wiwiz/files/usr/lib/lua/luci/model/cbi/autokick.lua",
    "content": "m = Map(\"autokick\", translate(\"Wiwiz\"), \n    translate(\"Enabling this feature will automatically disconnect the wireless client after portal authentication expires\")) \n\nautokick = m:section(TypedSection, \"autokick\", \"\")\n\nenabled = autokick:option(Flag, \"enabled\", translate(\"Enable\"));\nenabled.optional = false \nenabled.rmempty = false\n\ngw_ip = autokick:option(Value, \"gw_ip\", translate(\"Portal Gateway Address\"));\ngw_ip.optional = false\ngw_ip.rmempty = false\ngw_ip.default = \"127.0.0.1\"\n\nreturn m\n"
  },
  {
    "path": "relevance/WiFiPortal/autokick-wiwiz/po/zh_Hans/autokick.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: LuCi Chinese Translation\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"Language: zh_Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Pootle 2.0.6\\n\"\n\nmsgid \"AutoKick\"\nmsgstr \"自动断开无线终端\"\n\nmsgid \"Enable\"\nmsgstr \"启用\"\n\nmsgid \"Enabling this feature will automatically disconnect the wireless client after portal authentication expires\"\nmsgstr \"开启本功能后可使终端设备在Portal认证到期后自动断开无线连接\"\n\nmsgid \"Portal Gateway Address\"\nmsgstr \"Portal认证设备地址\"\n\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=dcc2-wiwiz\nPKG_VERSION:=20260205\nPKG_RELEASE:=1\n\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(BUILD_VARIANT)/$(PKG_NAME)-$(PKG_VERSION)\nCMAKE_INSTALL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(INCLUDE_DIR)/cmake.mk\n\ndefine Package/dcc2-wiwiz/Default\n  SUBMENU:=Utilities\n  SECTION:=net\n  CATEGORY:=Wiwiz/PinPinWiFi\n  TITLE:=Access your device from anywhere via the web\n#  SECTION:=utils\n#  CATEGORY:=Utilities\n#  SUBMENU:=Terminal\n  DEPENDS:=+libev $(2)\n  VARIANT:=$(1)\n  PROVIDES:=dcc2-wiwiz\nendef\n\n#Package/dcc2-wiwiz-openssl=$(call Package/dcc2-wiwiz/Default,openssl,+PACKAGE_dcc2-wiwiz-openssl:libopenssl)\n#Package/dcc2-wiwiz-wolfssl=$(call Package/dcc2-wiwiz/Default,wolfssl,+PACKAGE_dcc2-wiwiz-wolfssl:libwolfssl)\n#Package/dcc2-wiwiz-mbedtls=$(call Package/dcc2-wiwiz/Default,mbedtls,+PACKAGE_dcc2-wiwiz-mbedtls:libmbedtls +PACKAGE_dcc2-wiwiz-mbedtls:zlib)\nPackage/dcc2-wiwiz-nossl=$(call Package/dcc2-wiwiz/Default,nossl)\n\ndefine Package/dcc2-wiwiz-openssl/conffiles\n/etc/config/rtty\nendef\n\n#Package/dcc2-wiwiz-wolfssl/conffiles = $(Package/dcc2-wiwiz-openssl/conffiles)\n#Package/dcc2-wiwiz-mbedtls/conffiles = $(Package/dcc2-wiwiz-openssl/conffiles)\nPackage/dcc2-wiwiz-nossl/conffiles = $(Package/dcc2-wiwiz-openssl/conffiles)\n\nifeq ($(BUILD_VARIANT),openssl)\n  CMAKE_OPTIONS += -DUSE_OPENSSL=ON\nelse ifeq ($(BUILD_VARIANT),wolfssl)\n  CMAKE_OPTIONS += -DUSE_WOLFSSL=ON\nelse ifeq ($(BUILD_VARIANT),mbedtls)\n  CMAKE_OPTIONS += -DUSE_MBEDTLS=ON\nelse\n  CMAKE_OPTIONS += -DSSL_SUPPORT=OFF\nendif\n\ndefine Package/dcc2-wiwiz-$(BUILD_VARIANT)/install\n\t$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/init.d $(1)/etc/config $(1)/www/cgi-bin $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/rtty $(1)/usr/sbin\n\t$(INSTALL_BIN) ./files/rtty.init $(1)/etc/init.d/rtty\n\t$(INSTALL_CONF) ./files/rtty.config $(1)/etc/config/rtty\n\n\t$(INSTALL_DIR) $(1)/usr/lib\n\t$(INSTALL_DIR) $(1)/usr/lib/lua\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci/model\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi\n\t$(INSTALL_DATA) ./files/usr/lib/lua/luci/controller/rtty.lua $(1)/usr/lib/lua/luci/controller/rtty.lua\n\t$(INSTALL_DATA) ./files/usr/lib/lua/luci/model/cbi/rtty.lua $(1)/usr/lib/lua/luci/model/cbi/rtty.lua\n\t$(INSTALL_BIN) ./files/www/cgi-bin/dvstatus $(1)/www/cgi-bin/dvstatus\n\t$(INSTALL_BIN) ./files/usr/bin/assocnum.sh $(1)/usr/bin/assocnum.sh\n\n\t$(INSTALL_DIR) $(1)/etc/uci-defaults\n\t$(INSTALL_BIN) ./files/uci-defaults-rtty $(1)/etc/uci-defaults/rtty\n\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n\n\tpo2lmo ./po/zh_Hans/dcc2-wiwiz.po $(1)/usr/lib/lua/luci/i18n/dcc2-wiwiz.zh-cn.lmo\nendef\n\ndefine Package/dcc2-wiwiz-$(BUILD_VARIANT)/postinst\n#!/bin/sh\nwhich uci > /dev/null || exit 0\nuci -q get ucitrack.@rtty[0] > /dev/null || {\n  uci add ucitrack rtty > /dev/null\n  uci set ucitrack.@rtty[0].init=rtty\n  uci commit\n}\nendef\n\ndefine Package/dcc2-wiwiz-$(BUILD_VARIANT)/postrm\n#!/bin/sh\nwhich uci > /dev/null || exit 0\nuci -q get ucitrack.@rtty[0] > /dev/null && {\n  uci delete ucitrack.@rtty[0]\n  uci commit\n}\nendef\n\n#$(eval $(call BuildPackage,dcc2-wiwiz-openssl))\n#$(eval $(call BuildPackage,dcc2-wiwiz-wolfssl))\n#$(eval $(call BuildPackage,dcc2-wiwiz-mbedtls))\n$(eval $(call BuildPackage,dcc2-wiwiz-nossl))\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/files/rtty.config",
    "content": "# You must specify an interface or id,\n# If the id is not specified, RTTY will uses the MAC address\n# of the interface you specify as its ID, otherwise the id\n# you specify is used as its ID\n\nconfig rtty dcc2\n   option interface   'lan'\n   option id          ''\n   option description 'Description of your device'\n   option host        'dcc2.wiwiz.com'  # Server host\n   option port        '5912'              # Server Port\n#   option ssl         1                   # Whether to use ssl\n#   option insecure    '1'                 # Allow insecure server connections when using SSL\n   option token       'YourToken'        # generated by rttys\n#   option username    'root'              # Skip a second login authentication. See man login(1) about the details\n#   option verbose     '1'                 # verbose log"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/files/rtty.init",
    "content": "#!/bin/sh /etc/rc.common\n\nUSE_PROCD=1\nSTART=99\n\nBIN=/usr/sbin/rtty\n\nvalidate_rtty_section() {\n\tuci_load_validate rtty rtty \"$1\" \"$2\" \\\n\t\t'interface:uci(\"network\", \"@interface\"):lan' \\\n\t\t'id:maxlength(63)' \\\n\t\t'description:maxlength(126)' \\\n\t\t'host:host' \\\n\t\t'port:port' \\\n\t\t'ssl:bool:0' \\\n\t\t'insecure:bool:0' \\\n\t\t'token:maxlength(32)' \\\n\t\t'username:string' \\\n\t\t'verbose:bool:0' \\\n\t\t'enabled:bool:0' \n}\n\nstart_rtty() {\n\t. /lib/functions/network.sh\n\n\tlocal ifname\n\n\t[ \"$2\" = 0 ] || {\n\t\techo \"validation failed\" >&2\n\t\treturn 1\n\t}\n\t\n\t#echo \"enabled = $enabled\"\t\n\t[ \"$enabled\" = \"1\" ] || {\n\t\techo \"Disabled\" >&2\n\t\treturn 1\n\t}\n\t\n\t[ -n \"$interface\" ] && network_get_device ifname \"$interface\"\n\n\t[ -z \"$ifname\" -a -z \"$id\" ] && {\n\t\techo \"You must specify an interface or ID\" >&2\n\t\treturn 1\n\t}\n\n\t[ -z \"$host\" ] && {\n\t\techo \"host required\" >&2\n\t\treturn 1\n\t}\n\n\t[ -z \"$id\" ] && {\n\t\tid=$(sed 's/://g' /sys/class/net/$ifname/address | tr 'a-z' 'A-Z')\n\t}\n\n\tid=$(echo \"$token--$id\")\n\t#echo $id\n\n\tprocd_open_instance\n\tprocd_set_param command $BIN -h $host -I \"$id\" -a\n\t[ -n \"$port\" ] && procd_append_param command -p \"$port\"\n\t[ -n \"$description\" ] && procd_append_param command -d \"$description\"\n\t[ \"$ssl\" = \"1\" ] && procd_append_param command -s\n\t[ \"$insecure\" = \"1\" ] && procd_append_param command -x\n\t[ -n \"$token\" ] && procd_append_param command -t \"$token\"\n\t[ -n \"$username\" ] && procd_append_param command -f \"$username\"\n\t[ \"$verbose\" = \"1\" ] && procd_append_param command -v\n\tprocd_set_param respawn\n\tprocd_close_instance\n\n\t# otherwise web in dcc2 will forward to https://dcc2.wiwiz.com\n\tuci set uhttpd.main.redirect_https='0'\n\tuci commit uhttpd\n\t/etc/init.d/uhttpd restart\n}\n\nstart_service() {\n\tconfig_load rtty\n\tconfig_foreach validate_rtty_section rtty start_rtty\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"rtty\"\n\tprocd_add_validation validate_rtty_section\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/files/uci-defaults-rtty",
    "content": "#!/bin/sh\n\nuci -q get ucitrack.@rtty[0] > /dev/null || {\n  uci add ucitrack rtty > /dev/null\n  uci set ucitrack.@rtty[0].init=rtty\n  uci commit\n}\n\nexit 0\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/files/usr/bin/assocnum.sh",
    "content": "#!/bin/sh\n# Wiwiz HotSpot Builder Utility\n# Copyright wiwiz.com. All rights reserved.\n. /usr/share/libubox/jshn.sh\n\ncount_interfaces() {\n    echo $2\n}\n\njson_load \"$(ubus call network.wireless status)\"\njson_get_keys keys\nfor DEV in $keys; do\n    #echo $DEV\n    if [ \"$DEV\" == \"\" ]; then\n        continue\n    fi\n\n    json_select \"$DEV\"\n    for i in $(json_for_each_item \"count_interfaces\" \"interfaces\"); do\n        #echo json_select \"interfaces\"\n        json_select \"interfaces\"\n\n        #echo json_select $i\n        json_select $i\n\n        #echo json_get_var IFNAME \"ifname\"\n        json_get_var IFNAME \"ifname\"\n\n        #echo json_select config\n        json_select config\n        json_get_var MODE \"mode\"\n\n        #echo MODE = $MODE, IFNAME = $IFNAME\n        if [ \"$MODE\" == \"ap\" ]; then\n            ACCOCLIST=\"$(iwinfo $IFNAME assoclist | grep dBm | grep ':' | awk '{print $1}')\"\n            if [ \"$ACCOCLIST\" != \"\" ]; then\n                echo \"$ACCOCLIST\"\n            fi\n        fi\n\n        json_select ..\n        json_select ..\n        json_select ..\n        #echo 'loop end'\n    done\n    json_select ..\n    #echo 'LOOP end'\ndone\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/files/usr/lib/lua/luci/controller/rtty.lua",
    "content": "module(\"luci.controller.rtty\", package.seeall)\n\nfunction index()\n\tentry({\"admin\", \"wiwiz_menu\"}, firstchild(), \"Wiwiz\", 60).dependent=true\n\tentry({\"admin\", \"wiwiz_menu\", \"rtty\"}, cbi(\"rtty\"), translate(\"Remote Control (DCC2)\"), 59).dependent = true\nend\n\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/files/usr/lib/lua/luci/model/cbi/rtty.lua",
    "content": "m = Map(\"rtty\", translate(\"Wiwiz\"), translate(\"Remote Control (DCC2)\") ..\" ver 1.2.6 <a href='http://www.wiwiz.com/pinpinwifi/wiwiz-ipk.htm' target='_blank'>\".. translate(\"Readme\") ..\"</a>\") \n\nrtty = m:section(TypedSection, \"rtty\", \"\")\n\nenabled = rtty:option(Flag, \"enabled\", translate(\"Enable\"));\nenabled.optional = false \nenabled.rmempty = false\n\nid = rtty:option(Value, \"id\", \"设备ID\", translate(\"mac address will be Device ID if empty\"));\nid.optional = true \nid.rmempty = false\nid.addremove = false\n\ntoken = rtty:option(Value, \"token\", translate(\"Token\"));\ntoken.optional = false \ntoken.rmempty = false\n\ndescription = rtty:option(Value, \"description\", translate(\"Description\")); \ndescription.optional = true \ndescription.rmempty = false\ndescription.addremove = false\n\nhost = rtty:option(Value, \"host\", translate(\"Server Address\")); \nhost.optional = false \nhost.rmempty = false\n\nport = rtty:option(Value, \"port\", translate(\"Server Port\")); \nport.optional = false \nport.rmempty = false\nport.default = \"5912\"\n\nreturn m\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/files/www/cgi-bin/dvstatus",
    "content": "#!/usr/bin/lua\nrequire(\"luci.sys\")\nrequire(\"luci.util\")\n\nfunction exec(cmd)\n\treturn string.gsub(luci.sys.exec(cmd), \"\\n\", \"\")\nend\n\nfunction getFormPara( varname )\n    local value\n    local query = luci.sys.getenv(\"QUERY_STRING\")\n    if query ~= nil then\n      query = '&' .. query\n      varname = '&' .. varname .. '='\n      local p, q = string.find( query, varname )\n      if q ~= nil then\n        p = string.find( query, '&', q )\n        if p == nil then p = -1 else p = p - 1 end\n        value = string.sub( query, q + 1, p )\n      end\n    end\n    value = value or 'No such variable'\n    return value\nend\n\nlocal token = getFormPara(\"token\")\nlocal id = getFormPara(\"id\")\nlocal mytoken = exec(\"uci get rtty.dcc2.token 2>/dev/null\")\nif token ~= mytoken then\n\treturn\nend\n\nlocal sysinfo = luci.util.ubus(\"system\", \"info\") or { }\n--local stat = require \"luci.tools.status\"\n\n--leases = stat.dhcp_leases()  -- #leases is number\nlocal leasesNum = exec(\"cat /tmp/dhcp.leases 2>/dev/null | wc -l 2>/dev/null\")\nlocal loadavg    = sysinfo.load or { 0, 0, 0 }\nlocal clientNum = exec(\"cat /proc/net/arp | grep 'br-lan' | grep '0x2' | wc -l\")\nlocal assocNum = exec(\"sh /usr/bin/assocnum.sh | wc -l\")\nlocal conn_count = exec(\"cat /proc/sys/net/netfilter/nf_conntrack_count\")\nlocal conn_max = exec(\"sysctl -n -e net.nf_conntrack_max net.ipv4.netfilter.ip_conntrack_max\")\n\nprint(\"Content-type: application/javascript\\n\")\nprint(\"{\\\"id\\\":\\\"\".. id ..\"\\\", \\\"clientNum\\\": \\\"\".. clientNum ..\"\\\", \\\"assocNum\\\": \\\"\".. \n\tassocNum ..\"\\\", \\\"leasesNum\\\": \\\"\".. leasesNum ..\"\\\", \\\"loadavg\\\":\".. \n\tluci.util.serialize_json(loadavg) ..\", \\\"conn_count\\\": \\\"\".. conn_count ..\"\\\", \\\"conn_max\\\": \\\"\".. conn_max ..\"\\\"}\")\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/po/zh_Hans/dcc2-wiwiz.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: LuCi Chinese Translation\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"Language: zh_Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Pootle 2.0.6\\n\"\n\nmsgid \"Remote Control (DCC2)\"\nmsgstr \"远程管理(DCC2)\"\n\nmsgid \"Enable\"\nmsgstr \"启用\"\n\nmsgid \"Device ID\"\nmsgstr \"设备ID\"\n\nmsgid \"mac address will be Device ID if empty\"\nmsgstr \"若为空则使用设备的mac地址作为设备ID\"\n\nmsgid \"Token\"\nmsgstr \"Token\"\n\nmsgid \"Description\"\nmsgstr \"备注\"\n\nmsgid \"Server Address\"\nmsgstr \"服务器地址\"\n\nmsgid \"Server Port\"\nmsgstr \"服务器端口\"\n\nmsgid \"Readme\"\nmsgstr \"使用说明\"\n\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.5)\n\nproject(rtty C)\n\nlist(APPEND CMAKE_MODULE_PATH \"${CMAKE_SOURCE_DIR}/cmake/Modules/\")\n\n#set(CMAKE_VERBOSE_MAKEFILE ON)\n\nadd_subdirectory(src)\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/cmake/Modules/FindLibev.cmake",
    "content": "# - Try to find libev\n# Once done this will define\n#  LIBEV_FOUND          - System has libev\n#  LIBEV_INCLUDE_DIR    - The libev include directories\n#  LIBEV_LIBRARY        - The libraries needed to use libev\n\nfind_path(LIBEV_INCLUDE_DIR ev.h)\nfind_library(LIBEV_LIBRARY ev PATH_SUFFIXES lib64)\n\nif(LIBEV_INCLUDE_DIR)\n  file(STRINGS \"${LIBEV_INCLUDE_DIR}/ev.h\"\n      LIBEV_VERSION_MAJOR REGEX \"^#define[ \\t]+EV_VERSION_MAJOR[ \\t]+[0-9]+\")\n  file(STRINGS \"${LIBEV_INCLUDE_DIR}/ev.h\"\n      LIBEV_VERSION_MINOR REGEX \"^#define[ \\t]+EV_VERSION_MINOR[ \\t]+[0-9]+\")\n  string(REGEX REPLACE \"[^0-9]+\" \"\" LIBEV_VERSION_MAJOR \"${LIBEV_VERSION_MAJOR}\")\n  string(REGEX REPLACE \"[^0-9]+\" \"\" LIBEV_VERSION_MINOR \"${LIBEV_VERSION_MINOR}\")\n  set(LIBEV_VERSION \"${LIBEV_VERSION_MAJOR}.${LIBEV_VERSION_MINOR}\")\n  unset(LIBEV_VERSION_MINOR)\n  unset(LIBEV_VERSION_MAJOR)\nendif()\n\ninclude(FindPackageHandleStandardArgs)\n# handle the QUIETLY and REQUIRED arguments and set LIBEV_FOUND to TRUE\n# if all listed variables are TRUE and the requested version matches.\nfind_package_handle_standard_args(Libev REQUIRED_VARS\n                                  LIBEV_LIBRARY LIBEV_INCLUDE_DIR\n                                  VERSION_VAR LIBEV_VERSION)\n\nmark_as_advanced(LIBEV_INCLUDE_DIR LIBEV_LIBRARY)\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/CMakeLists.txt",
    "content": "# The version number.\nset(RTTY_VERSION_MAJOR 8)\nset(RTTY_VERSION_MINOR 0)\nset(RTTY_VERSION_PATCH 0)\n\n# Check the third party Libraries\nfind_package(Libev REQUIRED)\n\naux_source_directory(. SRCS)\naux_source_directory(log SRCS)\naux_source_directory(buffer SRCS)\n\nadd_executable(rtty ${SRCS})\ntarget_compile_definitions(rtty PRIVATE _GNU_SOURCE)\ntarget_compile_options(rtty PRIVATE -O -Wall -Werror --std=gnu99)\ntarget_include_directories(rtty PRIVATE ${CMAKE_CURRENT_BINARY_DIR} ${CMAKE_CURRENT_SOURCE_DIR}/buffer ${LIBEV_INCLUDE_DIR})\ntarget_link_libraries(rtty PRIVATE ${LIBEV_LIBRARY} util crypt m)\n\nadd_subdirectory(ssl)\n\nif(SSL_SUPPORT)\n    target_link_libraries(rtty PRIVATE ${SSL_TARGET})\nendif()\n\n# configure a header file to pass some of the CMake settings to the source code\nconfigure_file(${CMAKE_CURRENT_SOURCE_DIR}/config.h.in ${CMAKE_CURRENT_BINARY_DIR}/config.h)\n\ninstall(\n    TARGETS rtty\n    DESTINATION bin\n)\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/buffer/buffer.c",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2019 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#ifndef _GNU_SOURCE\n#define _GNU_SOURCE\n#endif\n\n#include <stdlib.h>\n#include <string.h>\n#include <stdio.h>\n#include <errno.h>\n#include <fcntl.h>\n\n#include \"buffer.h\"\n\nint buffer_resize(struct buffer *b, size_t size)\n{\n    uint8_t *head;\n    size_t new_size = getpagesize();\n    int data_len = buffer_length(b);\n\n    while (new_size < size)\n        new_size <<= 1u;\n\n    if (b->limit > 0 && new_size > b->limit)\n        return 1;\n\n    if (likely(b->head)) {\n        if (buffer_headroom(b) > 0) {\n            memmove(b->head, b->data, data_len);\n            b->data = b->head;\n            b->tail = b->data + data_len;\n        }\n\n        head = realloc(b->head, new_size);\n    } else {\n        head = malloc(new_size);\n    }\n\n    if (unlikely(!head))\n        return -1;\n\n    b->head = b->data = head;\n    b->tail = b->data + data_len;\n    b->end = b->head + new_size;\n\n    if (unlikely(b->tail > b->end))\n        b->tail = b->end;\n\n    return 0;\n}\n\nint buffer_init(struct buffer *b, size_t size)\n{\n    memset(b, 0, sizeof(struct buffer));\n\n    if (size > 0)\n        return buffer_resize(b, size);\n\n    return 0;\n}\n\nvoid buffer_free(struct buffer *b)\n{\n    if (b->head) {\n        free(b->head);\n        memset(b, 0, sizeof(struct buffer));\n    }\n}\n\nvoid buffer_set_limit(struct buffer *b, size_t size)\n{\n    size_t new_size = getpagesize();\n\n    while (new_size < size)\n        new_size <<= 1u;\n\n    b->limit = new_size;\n}\n\nvoid *buffer_put(struct buffer *b, size_t len)\n{\n    void *tmp;\n\n    if (buffer_length(b) == 0)\n        b->tail = b->data = b->head;\n\n    if (buffer_tailroom(b) < len && buffer_grow(b, len))\n        return NULL;\n\n    tmp = b->tail;\n    b->tail += len;\n\n    return tmp;\n}\n\nint buffer_put_vprintf(struct buffer *b, const char *fmt, va_list ap)\n{\n    for (;;) {\n        int ret;\n        va_list local_ap;\n        size_t tail_room = buffer_tailroom(b);\n\n        va_copy(local_ap, ap);\n        ret = vsnprintf((char *)b->tail, tail_room, fmt, local_ap);\n        va_end(local_ap);\n\n        if (ret < 0)\n            return -1;\n\n        if (likely(ret < tail_room)) {\n            b->tail += ret;\n            return 0;\n        }\n\n        if (unlikely(buffer_grow(b, 1)))\n            return -1;\n    }\n}\n\nint buffer_put_printf(struct buffer *b, const char *fmt, ...)\n{\n    va_list ap;\n    int ret;\n\n    va_start(ap, fmt);\n    ret = buffer_put_vprintf(b, fmt, ap);\n    va_end(ap);\n\n    return ret;\n}\n\nstatic inline bool fd_is_nonblock(int fd)\n{\n    return (fcntl(fd, F_GETFL) & O_NONBLOCK) == O_NONBLOCK;\n}\n\nint buffer_put_fd_ex(struct buffer *b, int fd, ssize_t len, bool *eof,\n                     int (*rd)(int fd, void *buf, size_t count, void *arg), void *arg)\n{\n    bool nonblock = fd_is_nonblock(fd);\n    ssize_t remain;\n\n    if (len < 0)\n        len = INT_MAX;\n\n    remain = len;\n\n    if (eof)\n        *eof = false;\n\n    do {\n        size_t tail_room = buffer_tailroom(b);\n        size_t want;\n        ssize_t ret;\n\n        if (unlikely(!tail_room)) {\n            ret = buffer_grow(b, 1);\n            if (ret < 0)\n                return -1;\n            if (ret > 0)\n                break;\n            tail_room = buffer_tailroom(b);\n        }\n\n        want = tail_room;\n        if (want > remain)\n            want = remain;\n\n        if (rd) {\n            ret = rd(fd, b->tail, want, arg);\n            if (ret == P_FD_ERR)\n                return -1;\n            else if (ret == P_FD_PENDING)\n                break;\n        } else {\n            ret = read(fd, b->tail, want);\n            if (unlikely(ret < 0)) {\n                if (errno == EINTR)\n                    continue;\n\n                if (errno == EAGAIN || errno == ENOTCONN)\n                    break;\n\n                return -1;\n            }\n        }\n\n        if (!ret) {\n            if (eof)\n                *eof = true;\n            break;\n        }\n\n        b->tail += ret;\n        remain -= ret;\n    } while (remain && nonblock);\n\n    return len - remain;\n}\n\nvoid buffer_truncate(struct buffer *b, size_t len)\n{\n    if (buffer_length(b) > len) {\n        b->tail = b->data + len;\n        buffer_reclaim(b);\n    }\n}\n\nsize_t buffer_pull(struct buffer *b, void *dest, size_t len)\n{\n    if (len > buffer_length(b))\n        len = buffer_length(b);\n\n    if (dest)\n        memcpy(dest, b->data, len);\n\n    b->data += len;\n\n    buffer_reclaim(b);\n\n    return len;\n}\n\nsize_t buffer_get(struct buffer *b, ssize_t offset, void *dest, size_t len)\n{\n    if (unlikely(buffer_length(b) - 1 < offset))\n        return 0;\n\n    if (unlikely(len > buffer_length(b) - offset))\n        len = buffer_length(b) - offset;\n\n    if (likely(len > 0))\n        memcpy(dest, b->data + offset, len);\n\n    return len;\n}\n\nint buffer_pull_to_fd_ex(struct buffer *b, int fd, ssize_t len,\n                         int (*wr)(int fd, void *buf, size_t count, void *arg), void *arg)\n{\n    bool nonblock = fd_is_nonblock(fd);\n    ssize_t remain;\n\n    if (len < 0)\n        len = buffer_length(b);\n\n    remain = len;\n\n    if (remain > buffer_length(b))\n        remain = buffer_length(b);\n\n    do {\n        ssize_t ret;\n\n        if (wr) {\n            ret = wr(fd, b->data, remain, arg);\n            if (ret == P_FD_ERR)\n                return -1;\n            else if (ret == P_FD_PENDING)\n                break;\n        } else {\n            ret = write(fd, b->data, remain);\n            if (ret < 0) {\n                if (errno == EINTR)\n                    continue;\n\n                if (errno == EAGAIN || errno == EWOULDBLOCK || errno == ENOTCONN)\n                    break;\n\n                return -1;\n            }\n        }\n\n        remain -= ret;\n        b->data += ret;\n    } while (remain && nonblock);\n\n    buffer_reclaim(b);\n\n    return len - remain;\n}\n\nvoid buffer_hexdump(struct buffer *b, size_t offset, size_t len)\n{\n    int i;\n    size_t data_len = buffer_length(b);\n    uint8_t *data = buffer_data(b);\n\n    if (offset > data_len - 1)\n        return;\n\n    if (len > data_len)\n        len = data_len;\n\n    for (i = offset; i < len; i++) {\n        printf(\"%02X \", data[i]);\n        if (i && i % 16 == 0)\n            printf(\"\\n\");\n    }\n    printf(\"\\n\");\n}\n\nint buffer_find(struct buffer *b, size_t offset, size_t limit, void *sep, size_t seplen)\n{\n    const uint8_t *begin = b->data;\n    const uint8_t *end;\n\n    if (offset >= buffer_length(b))\n        return -1;\n\n    if (limit == 0 || limit > buffer_length(b))\n        limit = buffer_length(b);\n\n    end = begin + limit - seplen;\n\n    for (; begin <= end; ++begin) {\n        if (begin[0] == ((uint8_t *)sep)[0] &&\n                !memcmp(begin + 1, sep + 1, seplen - 1))\n            return begin - b->data;\n    }\n\n    return -1;\n}\n\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/buffer/buffer.h",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2019 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#ifndef _BUFFER_H\n#define _BUFFER_H\n\n#include <stdint.h>\n#include <stdarg.h>\n#include <string.h>\n#include <unistd.h>\n#include <limits.h>\n#include <endian.h>\n#include <stdbool.h>\n#include <sys/types.h>\n\n/* Test for GCC < 2.96 */\n#if __GNUC__ < 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ < 96))\n#define __builtin_expect(x) (x)\n#endif\n\n#ifndef likely\n#define likely(x)\t__builtin_expect(!!(x), 1)\n#endif\n\n#ifndef unlikely\n#define unlikely(x)\t__builtin_expect(!!(x), 0)\n#endif\n\nenum {\n    P_FD_EOF = 0,\n    P_FD_ERR = -1,\n    P_FD_PENDING = -2\n};\n\nstruct buffer {\n    uint8_t *head;  /* Head of buffer */\n    uint8_t *data;  /* Data head pointer */\n    uint8_t *tail;  /* Data tail pointer */\n    uint8_t *end;   /* End of buffer */\n    size_t limit;   /* The limit of total size */\n};\n\nint buffer_init(struct buffer *b, size_t size);\n\n/**\n * buffer_resize - realloc memory to specially size\n * @return: 0(success), -1(system error), 1(larger than limit)\n */\nint buffer_resize(struct buffer *b, size_t size);\nvoid buffer_free(struct buffer *b);\nvoid buffer_set_limit(struct buffer *b, size_t size);\n\n\n\n/* Actual data Length */\nstatic inline size_t buffer_length(const struct buffer *b)\n{\n    return b->tail - b->data;\n}\n\n/* The total buffer size  */\nstatic inline size_t buffer_size(const struct buffer *b)\n{\n    return b->end - b->head;\n}\n\n/**\n * buffer_grow - grow memory of the buffer\n * @return: 0(success), -1(system error), 1(larger than limit)\n */\nstatic inline int buffer_grow(struct buffer *b, size_t len)\n{\n    return buffer_resize(b, buffer_size(b) + len);\n}\n\nstatic inline size_t buffer_headroom(const struct buffer *b)\n{\n    return b->data - b->head;\n}\n\nstatic inline size_t buffer_tailroom(const struct buffer *b)\n{\n    return b->end - b->tail;\n}\n\nstatic inline void *buffer_data(const struct buffer *b)\n{\n    return b->data;\n}\n\nstatic inline void buffer_reclaim(struct buffer *b)\n{\n    buffer_resize(b, buffer_length(b));\n}\n\nstatic inline size_t buffer_free_size(struct buffer *b)\n{\n    if (b->limit == 0)\n        return UINT_MAX;\n    return b->limit - buffer_length(b);\n}\n\n/**\n *\tbuffer_put - append data to a buffer\n *\n *\tThis function extends the used data area of the buffer. A pointer to the\n *\tfirst byte of the extra data is returned.\n *  If this would exceed the total buffer size the buffer will grow automatically.\n */\nvoid *buffer_put(struct buffer *b, size_t len);\n\nstatic inline void *buffer_put_zero(struct buffer *b, size_t len)\n{\n    void *tmp = buffer_put(b, len);\n\n    if (likely(tmp))\n        memset(tmp, 0, len);\n    return tmp;\n}\n\nstatic inline void *buffer_put_data(struct buffer *b, const void *data,   size_t len)\n{\n    void *tmp = buffer_put(b, len);\n\n    if (likely(tmp))\n        memcpy(tmp, data, len);\n    return tmp;\n}\n\nstatic inline int buffer_put_u8(struct buffer *b, uint8_t val)\n{\n    if (buffer_put_data(b, &val, sizeof(val)))\n        return 0;\n\n    return -1;\n}\n\nstatic inline int buffer_put_u16(struct buffer *b, uint16_t val)\n{\n    if (buffer_put_data(b, &val, sizeof(val)))\n        return 0;\n\n    return -1;\n}\n\nstatic inline int buffer_put_u16be(struct buffer *b, uint16_t val)\n{\n    return buffer_put_u16(b, htobe16(val));\n}\n\nstatic inline int buffer_put_u16le(struct buffer *b, uint16_t val)\n{\n    return buffer_put_u16(b, htole16(val));\n}\n\nstatic inline int buffer_put_u32(struct buffer *b, uint32_t val)\n{\n    if (buffer_put_data(b, &val, sizeof(val)))\n        return 0;\n\n    return -1;\n}\n\nstatic inline int buffer_put_u32be(struct buffer *b, uint32_t val)\n{\n    return buffer_put_u32(b, htobe32(val));\n}\n\nstatic inline int buffer_put_u32le(struct buffer *b, uint32_t val)\n{\n    return buffer_put_u32(b, htole32(val));\n}\n\nstatic inline int buffer_put_u64(struct buffer *b, uint64_t val)\n{\n    if (buffer_put_data(b, &val, sizeof(val)))\n        return 0;\n\n    return -1;\n}\n\nstatic inline int buffer_put_u64be(struct buffer *b, uint64_t val)\n{\n    return buffer_put_u64(b, htobe64(val));\n}\n\nstatic inline int buffer_put_u64le(struct buffer *b, uint64_t val)\n{\n    return buffer_put_u64(b, htole64(val));\n}\n\nstatic inline int buffer_put_string(struct buffer *b, const char *s)\n{\n    size_t len = strlen(s);\n    char *p = (char *)buffer_put(b, len);\n\n    if (likely(p)) {\n        memcpy(p, s, len);\n        return 0;\n    }\n\n    return -1;\n}\n\nint buffer_put_vprintf(struct buffer *b, const char *fmt, va_list ap) __attribute__((format(printf, 2, 0)));\nint buffer_put_printf(struct buffer *b, const char *fmt, ...) __attribute__((format(printf, 2, 3)));\n\n/**\n *  buffer_put_fd_ex - Append data from a file to the end of a buffer.\n *  @param fd: file descriptor\n *  @param len: how much data to read, or -1 to read as much as possible.\n *  @param eof: indicates end of file\n *  @param rd: A customized read function. Generally used for SSL.\n *       The customized read function should be return:\n *       P_FD_EOF/P_FD_ERR/P_FD_PENDING or number of bytes read.\n *  @return: Return the number of bytes append\n */\nint buffer_put_fd_ex(struct buffer *b, int fd, ssize_t len, bool *eof,\n                     int (*rd)(int fd, void *buf, size_t count, void *arg), void *arg);\n\nstatic inline int buffer_put_fd(struct buffer *b, int fd, ssize_t len, bool *eof)\n{\n    return buffer_put_fd_ex(b, fd, len, eof, NULL, NULL);\n}\n\n/**\n *\tbuffer_truncate - remove end from a buffer\n *\n *\tCut the length of a buffer down by removing data from the tail. If\n *\tthe buffer is already under the length specified it is not modified.\n */\nvoid buffer_truncate(struct buffer *b, size_t len);\n\n/* Discards data from tail */\nstatic inline void buffer_discard(struct buffer *b, size_t len)\n{\n    size_t data_len = buffer_length(b);\n\n    if (len > data_len)\n        len = data_len;\n\n    buffer_truncate(b, data_len - len);\n}\n\n/**\n *\tbuffer_pull - remove data from the start of a buffer\n *\n *\tThis function removes data from the start of a buffer,\n *  returning the actual length removed.\n *  Just remove the data if the dest is NULL.\n */\nsize_t buffer_pull(struct buffer *b, void *dest, size_t len);\n\nstatic inline uint8_t buffer_pull_u8(struct buffer *b)\n{\n    uint8_t val = 0;\n\n    buffer_pull(b, &val, sizeof(val));\n\n    return val;\n}\n\nstatic inline uint16_t buffer_pull_u16(struct buffer *b)\n{\n    uint16_t val = 0;\n\n    buffer_pull(b, &val, sizeof(val));\n\n    return val;\n}\n\nstatic inline uint16_t buffer_pull_u16be(struct buffer *b)\n{\n    return be16toh(buffer_pull_u16(b));\n}\n\nstatic inline uint16_t buffer_pull_u16le(struct buffer *b)\n{\n    return le16toh(buffer_pull_u16(b));\n}\n\nstatic inline uint32_t buffer_pull_u32(struct buffer *b)\n{\n    uint32_t val = 0;\n\n    buffer_pull(b, &val, sizeof(val));\n\n    return val;\n}\n\nstatic inline uint32_t buffer_pull_u32be(struct buffer *b)\n{\n    return be32toh(buffer_pull_u32(b));\n}\n\nstatic inline uint32_t buffer_pull_u32le(struct buffer *b)\n{\n    return le32toh(buffer_pull_u32(b));\n}\n\nstatic inline uint64_t buffer_pull_u64(struct buffer *b)\n{\n    uint64_t val = 0;\n\n    buffer_pull(b, &val, sizeof(val));\n\n    return val;\n}\n\nstatic inline uint64_t buffer_pull_u64be(struct buffer *b)\n{\n    return be64toh(buffer_pull_u64(b));\n}\n\nstatic inline uint64_t buffer_pull_u64le(struct buffer *b)\n{\n    return le64toh(buffer_pull_u64(b));\n}\n\n/* Similar to buffer_pull, but does not remove the data */\nsize_t buffer_get(struct buffer *b, ssize_t offset, void *dest, size_t len);\n\nstatic inline uint8_t buffer_get_u8(struct buffer *b, ssize_t offset)\n{\n    uint8_t val = 0;\n\n    buffer_get(b, offset, &val, sizeof(val));\n\n    return val;\n}\n\nstatic inline uint16_t buffer_get_u16(struct buffer *b, ssize_t offset)\n{\n    uint16_t val = 0;\n\n    buffer_get(b, offset, &val, sizeof(val));\n\n    return val;\n}\n\nstatic inline uint16_t buffer_get_u16be(struct buffer *b, ssize_t offset)\n{\n    return be16toh(buffer_get_u16(b, offset));\n}\n\nstatic inline uint16_t buffer_get_u16le(struct buffer *b, ssize_t offset)\n{\n    return le16toh(buffer_get_u16(b, offset));\n}\n\nstatic inline uint32_t buffer_get_u32(struct buffer *b, ssize_t offset)\n{\n    uint32_t val = 0;\n\n    buffer_get(b, offset, &val, sizeof(val));\n\n    return val;\n}\n\nstatic inline uint32_t buffer_get_u32be(struct buffer *b, ssize_t offset)\n{\n    return be32toh(buffer_get_u32(b, offset));\n}\n\nstatic inline uint32_t buffer_get_u32le(struct buffer *b, ssize_t offset)\n{\n    return le32toh(buffer_get_u32(b, offset));\n}\n\nstatic inline uint64_t buffer_get_u64(struct buffer *b, ssize_t offset)\n{\n    uint64_t val = 0;\n\n    buffer_get(b, offset, &val, sizeof(val));\n\n    return val;\n}\n\nstatic inline uint64_t buffer_get_u64be(struct buffer *b, ssize_t offset)\n{\n    return be64toh(buffer_get_u64(b, offset));\n}\n\nstatic inline uint64_t buffer_get_u64le(struct buffer *b, ssize_t offset)\n{\n    return le64toh(buffer_get_u64(b, offset));\n}\n\n/**\n *  buffer_pull_to_fd_ex - remove data from the start of a buffer and write to a file\n *  @param fd: file descriptor\n *  @param len: how much data to remove, or -1 to remove as much as possible.\n *  @param wr: A customized write function. Generally used for SSL.\n *       The customized write function should be return:\n *       P_FD_EOF/P_FD_ERR/P_FD_PENDING or number of bytes write.\n *  @return: the number of bytes removed\n */\nint buffer_pull_to_fd_ex(struct buffer *b, int fd, ssize_t len,\n                         int (*wr)(int fd, void *buf, size_t count, void *arg), void *arg);\n\nstatic inline int buffer_pull_to_fd(struct buffer *b, int fd, ssize_t len)\n{\n    return buffer_pull_to_fd_ex(b, fd, len, NULL, NULL);\n}\n\nvoid buffer_hexdump(struct buffer *b, size_t offset, size_t len);\n\n/**\n *\tbuffer_find - finds the start of the first occurrence of the sep of length seplen in the buffer\n *  @limit: 0 indicates unlimited\n *\tReturn -1 if sep is not present in the buffer\n */\nint buffer_find(struct buffer *b, size_t offset, size_t limit, void *sep, size_t seplen);\n\n#endif\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/command.c",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2019 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <unistd.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <limits.h>\n#include <shadow.h>\n#include <sys/stat.h>\n#include <math.h>\n#include <pwd.h>\n\n#include \"log/log.h\"\n#include \"list.h\"\n#include \"utils.h\"\n#include \"command.h\"\n\nstatic int nrunning;\nstatic LIST_HEAD(task_pending);\n\nstatic void run_task(struct task *t);\n\n/* For execute command */\nstatic bool login_test(const char *username, const char *password)\n{\n    struct spwd *sp;\n\n    if (!username || *username == 0)\n        return false;\n\n    sp = getspnam(username);\n    if (!sp || !sp->sp_pwdp[1])\n        return false;\n\n    if (!password)\n        password = \"\";\n\n    return !strcmp(crypt(password, sp->sp_pwdp), sp->sp_pwdp);\n}\n\nstatic const char *cmd_lookup(const char *cmd)\n{\n    struct stat s;\n    int plen = 0, clen = strlen(cmd) + 1;\n    char *search, *p;\n    static char path[PATH_MAX];\n\n    if (!stat(cmd, &s) && S_ISREG(s.st_mode))\n        return cmd;\n\n    search = getenv(\"PATH\");\n\n    if (!search)\n        search = \"/bin:/usr/bin:/sbin:/usr/sbin\";\n\n    p = search;\n\n    do {\n        if (*p != ':' && *p != '\\0')\n            continue;\n\n        plen = p - search;\n\n        if ((plen + clen) >= sizeof(path))\n            continue;\n\n        strncpy(path, search, plen);\n        sprintf(path + plen, \"/%s\", cmd);\n\n        if (!stat(path, &s) && S_ISREG(s.st_mode))\n            return path;\n\n        search = p + 1;\n    } while (*p++);\n\n    return NULL;\n}\n\nstatic const char *cmderr2str(int err)\n{\n    switch (err) {\n    case RTTY_CMD_ERR_PERMIT:\n        return \"operation not permitted\";\n    case RTTY_CMD_ERR_NOT_FOUND:\n        return \"not found\";\n    case RTTY_CMD_ERR_NOMEM:\n        return \"no mem\";\n    case RTTY_CMD_ERR_SYSERR:\n        return \"sys error\";\n    case RTTY_CMD_ERR_RESP_TOOBIG:\n        return \"stdout+stderr is too big\";\n    default:\n        return \"\";\n    }\n}\n\nstatic void task_free(struct task *t)\n{\n    int i;\n\n    /* stdout watcher */\n    if (t->ioo.fd > 0) {\n        ev_io_stop(t->rtty->loop, &t->ioo);\n        close(t->ioo.fd);\n    }\n\n    /* stderr watcher */\n    if (t->ioe.fd > 0) {\n        ev_io_stop(t->rtty->loop, &t->ioe);\n        close(t->ioe.fd);\n    }\n\n    ev_child_stop(t->rtty->loop, &t->cw);\n    ev_timer_stop(t->rtty->loop, &t->timer);\n\n    buffer_free(&t->ob);\n    buffer_free(&t->eb);\n\n    for (i = 0; i < t->nparams; i++)\n        free(t->params[i + 1]);\n    free(t->params);\n\n    free(t);\n}\n\nstatic void cmd_err_reply(struct rtty *rtty, const char *token, int err)\n{\n    char str[256] = \"\";\n\n    snprintf(str, sizeof(str) - 1, \"{\\\"token\\\":\\\"%s\\\",\"\n             \"\\\"attrs\\\":{\\\"err\\\":%d,\\\"msg\\\":\\\"%s\\\"}}\", token, err, cmderr2str(err));\n\n    rtty_send_msg(rtty, MSG_TYPE_CMD, str, strlen(str));\n}\n\nstatic void cmd_reply(struct task *t, int code)\n{\n    size_t len = buffer_length(&t->ob) + buffer_length(&t->eb);\n    struct rtty *rtty = t->rtty;\n    char *str, *pos;\n    int ret;\n\n    len = ceil(len * 4.0 / 3) + 200;\n\n    str = calloc(1, len);\n    if (!str) {\n        cmd_err_reply(t->rtty, t->token, RTTY_CMD_ERR_NOMEM);\n        return;\n    }\n\n    pos = str;\n\n    ret = snprintf(pos, len, \"{\\\"token\\\":\\\"%s\\\",\"\n                   \"\\\"attrs\\\":{\\\"code\\\":%d,\\\"stdout\\\":\\\"\", t->token, code);\n\n    len -= ret;\n    pos += ret;\n\n    ret = b64_encode(buffer_data(&t->ob), buffer_length(&t->ob), pos, len);\n    len -= ret;\n    pos += ret;\n\n    ret = snprintf(pos, len, \"\\\",\\\"stderr\\\":\\\"\");\n    len -= ret;\n    pos += ret;\n\n    ret = b64_encode(buffer_data(&t->eb), buffer_length(&t->eb), pos, len);\n    len -= ret;\n    pos += ret;\n\n    ret = snprintf(pos, len, \"\\\"}}\");\n    pos += ret;\n\n    rtty_send_msg(rtty, MSG_TYPE_CMD, str, pos - str);\n\n    free(str);\n}\n\nstatic void ev_child_exit(struct ev_loop *loop, struct ev_child *w, int revents)\n{\n    struct task *t = container_of(w, struct task, cw);\n\n    cmd_reply(t, WEXITSTATUS(w->rstatus));\n    task_free(t);\n\n    nrunning--;\n\n    if (list_empty(&task_pending))\n        return;\n\n    t = list_first_entry(&task_pending, struct task, list);\n    if (t) {\n        list_del(&t->list);\n        run_task(t);\n    }\n}\n\nstatic void ev_timer_cb(struct ev_loop *loop, struct ev_timer *w, int revents)\n{\n    struct task *t = container_of(w, struct task, timer);\n\n    task_free(t);\n    nrunning--;\n\n    log_err(\"exec '%s' timeout\\n\", t->cmd);\n}\n\nstatic void ev_io_stdout_cb(struct ev_loop *loop, struct ev_io *w, int revents)\n{\n    struct task *t = container_of(w, struct task, ioo);\n    bool eof;\n\n    buffer_put_fd(&t->ob, w->fd, -1, &eof);\n}\n\nstatic void ev_io_stderr_cb(struct ev_loop *loop, struct ev_io *w, int revents)\n{\n    struct task *t = container_of(w, struct task, ioe);\n    bool eof;\n\n    buffer_put_fd(&t->eb, w->fd, -1, &eof);\n}\n\nstatic void run_task(struct task *t)\n{\n    int opipe[2];\n    int epipe[2];\n    pid_t pid;\n    int err;\n\n    if (pipe2(opipe, O_CLOEXEC | O_NONBLOCK) < 0 ||\n            pipe2(epipe, O_CLOEXEC | O_NONBLOCK) < 0) {\n        log_err(\"pipe2 failed: %s\\n\", strerror(errno));\n        err = RTTY_CMD_ERR_SYSERR;\n        goto ERR;\n    }\n\n    pid = fork();\n    if (pid < 0) {\n        log_err(\"fork: %s\\n\", strerror(errno));\n        err = RTTY_CMD_ERR_SYSERR;\n        goto ERR;\n    } else if (pid == 0) {\n        /* Close unused read end */\n        close(opipe[0]);\n        close(epipe[0]);\n\n        /* Redirect */\n        dup2(opipe[1], STDOUT_FILENO);\n        dup2(epipe[1], STDERR_FILENO);\n        close(opipe[1]);\n        close(epipe[1]);\n\n        if (setuid(t->uid) < 0)\n            exit(1);\n\n        execv(t->cmd, t->params);\n    } else {\n        /* Close unused write end */\n        close(opipe[1]);\n        close(epipe[1]);\n\n        /* Watch child's status */\n        ev_child_init(&t->cw, ev_child_exit, pid, 0);\n        ev_child_start(t->rtty->loop, &t->cw);\n\n        ev_io_init(&t->ioo, ev_io_stdout_cb, opipe[0], EV_READ);\n        ev_io_start(t->rtty->loop, &t->ioo);\n\n        ev_io_init(&t->ioe, ev_io_stderr_cb, epipe[0], EV_READ);\n        ev_io_start(t->rtty->loop, &t->ioe);\n\n        ev_timer_init(&t->timer, ev_timer_cb, RTTY_CMD_EXEC_TIMEOUT, 0);\n        ev_timer_start(t->rtty->loop, &t->timer);\n\n        nrunning++;\n        return;\n    }\n\nERR:\n    cmd_err_reply(t->rtty, t->token, err);\n    task_free(t);\n}\n\nstatic void add_task(struct rtty *rtty, const char *token, uid_t uid, const char *cmd, const char *data)\n{\n    struct task *t;\n    int i;\n\n    t = calloc(1, sizeof(struct task) + strlen(cmd) + 1);\n    if (!t) {\n        cmd_err_reply(rtty, token, RTTY_CMD_ERR_NOMEM);\n        return;\n    }\n\n    t->rtty = rtty;\n    t->uid = uid;\n\n    strcpy(t->cmd, cmd);\n    strcpy(t->token, token);\n\n    t->nparams = *data++;\n    t->params = calloc(t->nparams + 2, sizeof(char *));\n\n    t->params[0] = t->cmd;\n\n    for (i = 0; i < t->nparams; i++) {\n        t->params[i + 1] = strdup(data);\n        data += strlen(t->params[i + 1]) + 1;\n    }\n\n    if (nrunning < RTTY_CMD_MAX_RUNNING)\n        run_task(t);\n    else\n        list_add_tail(&t->list, &task_pending);\n}\n\nvoid run_command(struct rtty *rtty, const char *data)\n{\n    const char *username = data;\n    const char *password = username + strlen(username) + 1;\n    const char *cmd = password + strlen(password) + 1;\n    const char *token = cmd + strlen(cmd) + 1;\n    struct passwd *pw;\n    int err = 0;\n\n    data = token + strlen(token) + 1;\n\n    if (!username[0] || !login_test(username, password)) {\n        err = RTTY_CMD_ERR_PERMIT;\n        goto ERR;\n    }\n\n    pw = getpwnam(username);\n    if (!pw) {\n        err = RTTY_CMD_ERR_PERMIT;\n        goto ERR;\n    }\n\n    cmd = cmd_lookup(cmd);\n    if (!cmd) {\n        err = RTTY_CMD_ERR_NOT_FOUND;\n        goto ERR;\n    }\n\n    add_task(rtty, token, pw->pw_uid, cmd, data);\n    return;\n\nERR:\n    cmd_err_reply(rtty, token, err);\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/command.h",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2019 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#ifndef _COMMAND_H\n#define _COMMAND_H\n\n#include \"rtty.h\"\n\n#define RTTY_CMD_MAX_RUNNING     5\n#define RTTY_CMD_EXEC_TIMEOUT    30\n\nenum {\n    RTTY_CMD_ERR_PERMIT = 1,\n    RTTY_CMD_ERR_NOT_FOUND,\n    RTTY_CMD_ERR_NOMEM,\n    RTTY_CMD_ERR_SYSERR,\n    RTTY_CMD_ERR_RESP_TOOBIG\n};\n\nstruct task {\n    struct list_head list;\n    struct rtty *rtty;\n    struct ev_child cw;\n    struct ev_timer timer;\n    struct ev_io ioo;   /* Watch stdout of child */\n    struct ev_io ioe;   /* Watch stderr of child */\n    struct buffer ob;   /* buffer for stdout */\n    struct buffer eb;   /* buffer for stderr */\n    uid_t uid;\n    int nparams;\n    char **params;\n    char token[33];\n    char cmd[0];\n};\n\nvoid run_command(struct rtty *rtty, const char *data);\n\n#endif\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/config.h.in",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2019 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#ifndef _RTTY_CONFIG_H\n#define _RTTY_CONFIG_H\n\n#define RTTY_VERSION_MAJOR  @RTTY_VERSION_MAJOR@\n#define RTTY_VERSION_MINOR  @RTTY_VERSION_MINOR@\n#define RTTY_VERSION_PATCH  @RTTY_VERSION_PATCH@\n#define RTTY_VERSION_STRING \"@RTTY_VERSION_MAJOR@.@RTTY_VERSION_MINOR@.@RTTY_VERSION_PATCH@\"\n\n#cmakedefine SSL_SUPPORT\n\n#endif\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/file.c",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2019 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#include <stdio.h>\n#include <fcntl.h>\n#include <errno.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <mntent.h>\n#include <inttypes.h>\n#include <sys/statvfs.h>\n#include <linux/limits.h>\n#include <libgen.h>\n\n#include \"log/log.h\"\n#include \"file.h\"\n#include \"list.h\"\n#include \"rtty.h\"\n#include \"utils.h\"\n\nstatic uint8_t RTTY_FILE_MAGIC[] = {0xb6, 0xbc, 0xbd};\nstatic char savepath[PATH_MAX];\n\nstatic int send_file_control_msg(int fd, int type, void *buf, int len)\n{\n    struct file_control_msg msg = {\n        .type = type\n    };\n\n    if (len > sizeof(msg.buf)) {\n        len = sizeof(msg.buf);\n        log_err(\"file control msg too long\\n\");\n    }\n\n    if (buf)\n        memcpy(msg.buf, buf, len);\n\n    if (write(fd, &msg, sizeof(msg)) < 0)\n        return -1;\n\n    return 0;\n}\n\nvoid file_context_reset(struct file_context *ctx)\n{\n    if (ctx->fd > 0) {\n        close(ctx->fd);\n        ctx->fd = -1;\n    }\n\n    if (ctx->ctlfd > 0) {\n        close(ctx->ctlfd);\n        ctx->ctlfd = -1;\n    }\n\n    ctx->busy = false;\n\n    if (ctx->buf) {\n        free(ctx->buf);\n        ctx->buf = NULL;\n    }\n}\n\nstatic void notify_user_canceled(struct tty *tty)\n{\n    struct rtty *rtty = tty->rtty;\n\n    buffer_put_u8(&rtty->wb, MSG_TYPE_FILE);\n    buffer_put_u16be(&rtty->wb, 33);\n    buffer_put_data(&rtty->wb, tty->file.sid, 32);\n    buffer_put_u8(&rtty->wb, RTTY_FILE_MSG_ABORT);\n    ev_io_start(rtty->loop, &rtty->iow);\n}\n\nstatic int notify_progress(struct file_context *ctx)\n{\n    if (send_file_control_msg(ctx->ctlfd, RTTY_FILE_MSG_PROGRESS, &ctx->remain_size, 4) < 0)\n        return -1;\n\n    return 0;\n}\n\nstatic void send_file_data(struct file_context *ctx)\n{\n    struct tty *tty = container_of(ctx, struct tty, file);\n    struct rtty *rtty = tty->rtty;\n    int ret;\n\n    if (!ctx->buf) {\n        ctx->buf = malloc(UPLOAD_FILE_BUF_SIZE);\n        if (!ctx->buf) {\n            log_err(\"malloc: %s\\n\", strerror(errno));\n            send_file_control_msg(ctx->ctlfd, RTTY_FILE_MSG_ERR, NULL, 0);\n            goto err;\n        }\n    }\n\n    if (ctx->fd < 0)\n        return;\n\n    ret = read(ctx->fd, ctx->buf, UPLOAD_FILE_BUF_SIZE);\n    if (ret < 0) {\n        send_file_control_msg(ctx->ctlfd, RTTY_FILE_MSG_ERR, NULL, 0);\n        goto err;\n    }\n\n    ctx->remain_size -= ret;\n\n    buffer_put_u8(&rtty->wb, MSG_TYPE_FILE);\n    buffer_put_u16be(&rtty->wb, 33 + ret);\n    buffer_put_data(&rtty->wb, ctx->sid, 32);\n    buffer_put_u8(&rtty->wb, RTTY_FILE_MSG_DATA);\n    buffer_put_data(&rtty->wb, ctx->buf, ret);\n    ev_io_start(rtty->loop, &rtty->iow);\n\n    if (ret == 0) {\n        file_context_reset(ctx);\n        return;\n    }\n\n    if (notify_progress(ctx) < 0)\n        goto err;\n\n    return;\n\nerr:\n    notify_user_canceled(tty);\n    file_context_reset(ctx);\n}\n\nstatic int start_upload_file(struct file_context *ctx, const char *path)\n{\n    struct tty *tty = container_of(ctx, struct tty, file);\n    struct rtty *rtty = tty->rtty;\n    const char *name;\n    struct stat st;\n    int fd;\n    char *dirc;\n\n    dirc = strdup(path);\n    name = basename(dirc);\n\n    fd = open(path, O_RDONLY);\n    if (fd < 0) {\n        log_err(\"open '%s' fail: %s\\n\", path, strerror(errno));\n        free(dirc);\n        return -1;\n    }\n\n    fstat(fd, &st);\n\n    buffer_put_u8(&rtty->wb, MSG_TYPE_FILE);\n    buffer_put_u16be(&rtty->wb, 33 + strlen(name));\n    buffer_put_data(&rtty->wb, ctx->sid, 32);\n    buffer_put_u8(&rtty->wb, RTTY_FILE_MSG_SEND);\n    buffer_put_string(&rtty->wb, name);\n    ev_io_start(rtty->loop, &rtty->iow);\n\n    ctx->fd = fd;\n    ctx->total_size = st.st_size;\n    ctx->remain_size = st.st_size;\n\n    log_info(\"upload file: %s, size: %\" PRIu64 \"\\n\", path, (uint64_t)st.st_size);\n\n    free(dirc);\n    return 0;\n}\n\nbool detect_file_operation(uint8_t *buf, int len, const char *sid, struct file_context *ctx)\n{\n    struct tty *tty = container_of(ctx, struct tty, file);\n    struct rtty *rtty = tty->rtty;\n    char fifo_name[128];\n    pid_t pid;\n    int ctlfd;\n    uid_t uid;\n    gid_t gid;\n\n    if (len != 12)\n        return false;\n\n    if (memcmp(buf, RTTY_FILE_MAGIC, 3))\n        return false;\n\n    memcpy(&pid, buf + 4, 4);\n\n    if (!getuid_by_pid(pid, &uid)) {\n        kill(pid, SIGTERM);\n        return true;\n    }\n\n    if (!getgid_by_pid(pid, &gid)) {\n        kill(pid, SIGTERM);\n        return true;\n    }\n\n    sprintf(fifo_name, \"/tmp/rtty-file-%d.fifo\", pid);\n\n    ctlfd = open(fifo_name, O_WRONLY);\n    if (ctlfd < 0) {\n        log_err(\"Could not open fifo %s\\n\", fifo_name);\n        kill(pid, SIGTERM);\n        return true;\n    }\n\n    if (ctx->busy) {\n        send_file_control_msg(ctlfd, RTTY_FILE_MSG_BUSY, NULL, 0);\n        close(ctlfd);\n\n        return true;\n    }\n\n    ctx->ctlfd = ctlfd;\n    strcpy(ctx->sid, sid);\n\n    if (buf[3] == 'R') {\n        buffer_put_u8(&rtty->wb, MSG_TYPE_FILE);\n        buffer_put_u16be(&rtty->wb, 33);\n        buffer_put_data(&rtty->wb, ctx->sid, 32);\n        buffer_put_u8(&rtty->wb, RTTY_FILE_MSG_RECV);\n        ev_io_start(rtty->loop, &rtty->iow);\n\n        send_file_control_msg(ctlfd, RTTY_FILE_MSG_REQUEST_ACCEPT, NULL, 0);\n\n        memset(savepath, 0, sizeof(savepath));\n        getcwd_by_pid(pid, savepath, sizeof(savepath) - 1);\n        strcat(savepath, \"/\");\n\n        ctx->uid = uid;\n        ctx->gid = gid;\n    } else {\n        char path[PATH_MAX] = \"\";\n        char link[128];\n        int fd;\n\n        memcpy(&fd, buf + 8, 4);\n\n        sprintf(link, \"/proc/%d/fd/%d\", pid, fd);\n\n        if (readlink(link, path, sizeof(path) - 1) < 0) {\n            log_err(\"readlink: %s\\n\", strerror(errno));\n\n            send_file_control_msg(ctlfd, RTTY_FILE_MSG_ERR, NULL, 0);\n            close(ctlfd);\n\n            return true;\n        }\n\n        send_file_control_msg(ctlfd, RTTY_FILE_MSG_REQUEST_ACCEPT, NULL, 0);\n\n        if (start_upload_file(ctx, path) < 0) {\n            send_file_control_msg(ctlfd, RTTY_FILE_MSG_ERR, NULL, 0);\n            close(ctlfd);\n\n            return true;\n        }\n    }\n\n    ctx->busy = true;\n\n    return true;\n}\n\nstatic void start_download_file(struct file_context *ctx, struct buffer *info, int len)\n{\n    char *name = savepath + strlen(savepath);\n    struct mntent *ment;\n    struct statvfs sfs;\n    char buf[512];\n    int fd;\n\n    ctx->total_size = ctx->remain_size = buffer_pull_u32be(info);\n\n    ment = find_mount_point(savepath);\n    if (ment) {\n        if (statvfs(ment->mnt_dir, &sfs) == 0 && ctx->total_size > sfs.f_bavail * sfs.f_frsize) {\n            send_file_control_msg(ctx->ctlfd, RTTY_FILE_MSG_NO_SPACE, NULL, 0);\n            log_err(\"download file fail: no enough space\\n\");\n            goto check_space_fail;\n        }\n    } else {\n        send_file_control_msg(ctx->ctlfd, RTTY_FILE_MSG_NO_SPACE, NULL, 0);\n        log_err(\"download file fail: not found mount point of '%s'\\n\", savepath);\n        goto check_space_fail;\n    }\n\n    buffer_pull(info, name, len - 4);\n\n    if (!access(savepath, F_OK)) {\n        send_file_control_msg(ctx->ctlfd, RTTY_FILE_MSG_ERR_EXIST, NULL, 0);\n        log_err(\"the file '%s' already exists\\n\", name);\n        goto open_fail;\n    }\n\n    fd = open(savepath, O_WRONLY | O_TRUNC | O_CREAT, 0644);\n    if (fd < 0) {\n        send_file_control_msg(ctx->ctlfd, RTTY_FILE_MSG_ERR, NULL, 0);\n        log_err(\"create file '%s' fail: %s\\n\", name, strerror(errno));\n        goto open_fail;\n    }\n\n    log_info(\"download file: %s, size: %u\\n\", savepath, ctx->total_size);\n\n    if (fchown(fd, ctx->uid, ctx->gid) < 0)\n        log_err(\"fchown %s fail: %s\\n\", savepath, strerror(errno));\n\n    if (ctx->total_size == 0)\n        close(fd);\n    else\n        ctx->fd = fd;\n\n    memcpy(buf, &ctx->total_size, 4);\n    strcpy(buf + 4, name);\n\n    send_file_control_msg(ctx->ctlfd, RTTY_FILE_MSG_INFO, buf, 4 + strlen(name));\n\n    return;\n\ncheck_space_fail:\n    buffer_pull(info, name, len - 4);\nopen_fail:\n    file_context_reset(ctx);\n}\n\nstatic void send_file_data_ack(struct tty *tty)\n{\n    struct rtty *rtty = tty->rtty;\n\n    buffer_put_u8(&rtty->wb, MSG_TYPE_FILE);\n    buffer_put_u16be(&rtty->wb, 33);\n    buffer_put_data(&rtty->wb, tty->file.sid, 32);\n    buffer_put_u8(&rtty->wb, RTTY_FILE_MSG_ACK);\n    ev_io_start(rtty->loop, &rtty->iow);\n}\n\nvoid parse_file_msg(struct file_context *ctx, struct buffer *data, int len)\n{\n    struct tty *tty = container_of(ctx, struct tty, file);\n    int type = buffer_pull_u8(data);\n\n    len--;\n\n    switch (type) {\n    case RTTY_FILE_MSG_INFO:\n        start_download_file(ctx, data, len);\n        break;\n\n    case RTTY_FILE_MSG_DATA:\n        if (len > 0) {\n            if (ctx->fd > -1) {\n                buffer_pull_to_fd(data, ctx->fd, len);\n                ctx->remain_size -= len;\n\n                if (notify_progress(ctx) < 0) {\n                    file_context_reset(ctx);\n                } else {\n                    if (ctx->remain_size == 0)\n                        file_context_reset(ctx);\n                    else\n                        send_file_data_ack(tty);\n                }\n            } else {\n                buffer_pull(data, NULL, len);\n            }\n        } else {\n            file_context_reset(ctx);\n        }\n        break;\n\n    case RTTY_FILE_MSG_ACK:\n        send_file_data(ctx);\n        break;\n\n    case RTTY_FILE_MSG_ABORT:\n        send_file_control_msg(ctx->ctlfd, RTTY_FILE_MSG_ABORT, NULL, 0);\n        file_context_reset(ctx);\n        break;\n\n    default:\n        break;\n    }\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/file.h",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2019 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#ifndef RTTY_FILE_H\n#define RTTY_FILE_H\n\n#include <ev.h>\n\n#include \"buffer.h\"\n\nenum {\n    RTTY_FILE_MSG_SEND,\n    RTTY_FILE_MSG_RECV,\n    RTTY_FILE_MSG_INFO,\n    RTTY_FILE_MSG_DATA,\n    RTTY_FILE_MSG_ACK,\n    RTTY_FILE_MSG_ABORT,\n    RTTY_FILE_MSG_BUSY,\n    RTTY_FILE_MSG_PROGRESS,\n    RTTY_FILE_MSG_REQUEST_ACCEPT,\n    RTTY_FILE_MSG_NO_SPACE,\n    RTTY_FILE_MSG_ERR_EXIST,\n    RTTY_FILE_MSG_ERR\n};\n\n#define UPLOAD_FILE_BUF_SIZE (1024 * 16)\n\nstruct file_control_msg {\n    int type;\n    uint8_t buf[128];\n};\n\nstruct file_context {\n    int fd;\n    bool busy;\n    int ctlfd;\n    uid_t uid;\n    gid_t gid;\n    char sid[33];\n    uint8_t *buf;\n    uint32_t total_size;\n    uint32_t remain_size;\n};\n\nvoid request_transfer_file(char type, const char *path);\n\nbool detect_file_operation(uint8_t *buf, int len, const char *sid, struct file_context *ctx);\n\nvoid parse_file_msg(struct file_context *ctx, struct buffer *data, int len);\n\nvoid file_context_reset(struct file_context *ctx);\n\n#endif\n\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/filectl.c",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2019 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#include <sys/time.h>\n#include <sys/stat.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <signal.h>\n#include <errno.h>\n#include <stdio.h>\n#include <fcntl.h>\n#include <libgen.h>\n\n#include \"utils.h\"\n#include \"file.h\"\n\nstatic uint8_t RTTY_FILE_MAGIC[12] = {0xb6, 0xbc, 0xbd};\n\nstatic struct timeval start_time;\n\nstatic uint32_t total_size;\n\nstatic char fifo_name[128];\n\nstatic void clear_fifo()\n{\n    unlink(fifo_name);\n}\n\nstatic void signal_handler(int sig)\n{\n    puts(\"\");\n    exit(0);\n}\n\nstatic u_int32_t update_progress(uint8_t *buf)\n{\n    struct timeval now;\n    uint32_t remain;\n\n    gettimeofday(&now, NULL);\n\n    memcpy(&remain, buf, 4);\n\n    printf(\"%100c\\r\", ' ');\n    printf(\"  %lu%%    %s     %.3fs\\r\", (total_size - remain) * 100UL / total_size,\n           format_size(total_size - remain),\n           (now.tv_sec + now.tv_usec / 1000.0 / 1000) - (start_time.tv_sec + start_time.tv_usec / 1000.0 / 1000));\n    fflush(stdout);\n\n    return remain;\n}\n\nstatic void handle_file_control_msg(int fd, int sfd, const char *path)\n{\n    struct file_control_msg msg;\n    struct buffer b = {};\n    char *dirc;\n\n    while (true) {\n        if (buffer_put_fd(&b, fd, -1, NULL) < 0)\n            break;\n        \n        if (buffer_length(&b) < sizeof(msg))\n            continue;\n\n        buffer_pull(&b, &msg, sizeof(msg));\n\n        switch (msg.type) {\n        case RTTY_FILE_MSG_REQUEST_ACCEPT:\n            if (sfd > -1) {\n                close(sfd);\n                gettimeofday(&start_time, NULL);\n                dirc = strdup(path);\n                printf(\"Transferring '%s'...Press Ctrl+C to cancel\\n\", basename(dirc));\n                free(dirc);\n\n                if (total_size == 0) {\n                    printf(\"  100%%    0 B     0s\\n\");\n                    goto done;\n                }\n            } else {\n                printf(\"Waiting to receive. Press Ctrl+C to cancel\\n\");\n            }\n            break;\n        \n        case RTTY_FILE_MSG_INFO:\n            memcpy(&total_size, msg.buf, 4);\n            \n            printf(\"Transferring '%s'...\\n\", (char *)(msg.buf + 4));\n\n            if (total_size == 0) {\n                printf(\"  100%%    0 B     0s\\n\");\n                goto done;\n            }\n            \n            gettimeofday(&start_time, NULL);\n\n            break;\n        \n        case RTTY_FILE_MSG_PROGRESS:\n            if (update_progress(msg.buf) == 0) {\n                puts(\"\");\n                goto done;\n            }\n            break;\n        \n        case RTTY_FILE_MSG_ABORT:\n            puts(\"\");\n            goto done;\n\n        case RTTY_FILE_MSG_BUSY:\n            printf(\"\\033[31mRtty is busy to transfer file\\033[0m\\n\");\n            goto done;\n\n        case RTTY_FILE_MSG_NO_SPACE:\n            printf(\"\\033[31mNo enough space\\033[0m\\n\");\n            goto done;\n\n        case RTTY_FILE_MSG_ERR_EXIST:\n            printf(\"\\033[31mThe file already exists\\033[0m\\n\");\n            goto done;\n\n        default:\n            goto done;\n        }\n    }\n\ndone:\n    buffer_free(&b);\n}\n\nvoid request_transfer_file(char type, const char *path)\n{\n    pid_t pid = getpid();\n    struct stat st;\n    int sfd = -1;\n    int ctlfd;\n\n    if (type == 'R') {\n        if (access(\".\", W_OK | X_OK)) {\n            printf(\"Permission denied\\n\");\n            exit(EXIT_FAILURE);\n        }\n    } else {\n        sfd = open(path, O_RDONLY);\n        if (sfd < 0) {\n            printf(\"open '%s' failed: \", path);\n            if (errno == ENOENT)\n                printf(\"No such filen\\n\");\n            else\n                printf(\"%s\\n\", strerror(errno));\n            exit(EXIT_FAILURE);\n        }\n\n        fstat(sfd, &st);\n        if (!(st.st_mode & S_IFREG)) {\n            printf(\"'%s' is not a regular file\\n\", path);\n            close(sfd);\n            exit(EXIT_FAILURE);\n        }\n\n        if (st.st_size > UINT32_MAX) {\n            printf(\"'%s' is too large(> %u Byte)\\n\", path, UINT32_MAX);\n            close(sfd);\n            exit(EXIT_FAILURE);\n        }\n\n        total_size = st.st_size;\n    }\n\n    sprintf(fifo_name, \"/tmp/rtty-file-%d.fifo\", pid);\n\n    if (mkfifo(fifo_name, 0644) < 0) {\n        fprintf(stderr, \"Could not create fifo %s\\n\", fifo_name);\n        exit(EXIT_FAILURE);\n    }\n\n    signal(SIGINT, signal_handler);\n\n    atexit(clear_fifo);\n\n    usleep(10000);\n\n    RTTY_FILE_MAGIC[3] = type;\n\n    memcpy(RTTY_FILE_MAGIC + 4, &pid, 4);\n\n    if (type == 'S')\n        memcpy(RTTY_FILE_MAGIC + 8, &sfd, 4);\n\n    fwrite(RTTY_FILE_MAGIC, sizeof(RTTY_FILE_MAGIC), 1, stdout);\n    fflush(stdout);\n\n    ctlfd = open(fifo_name, O_RDONLY | O_NONBLOCK);\n    if (ctlfd < 0) {\n        fprintf(stderr, \"Could not open fifo %s\\n\", fifo_name);\n        exit(EXIT_FAILURE);\n    }\n\n    handle_file_control_msg(ctlfd, sfd, path);\n\n    close(ctlfd);\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/http.c",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2019 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n\n#include \"http.h\"\n#include \"net.h\"\n#include \"log/log.h\"\n\nstatic void send_http_msg(struct http_connection *conn, size_t len, uint8_t *data)\n{\n    struct rtty *rtty = conn->rtty;\n    struct buffer *wb = &rtty->wb;\n\n    buffer_put_u8(wb, MSG_TYPE_HTTP);\n    buffer_put_u16be(wb, 18 + len);\n    buffer_put_data(wb, conn->addr, 18);\n    buffer_put_data(wb, data, len);\n    ev_io_start(rtty->loop, &rtty->iow);\n\n    conn->active = ev_now(rtty->loop);\n}\n\nvoid http_conn_free(struct http_connection *conn)\n{\n    struct rtty *rtty = conn->rtty;\n    struct ev_loop *loop = rtty->loop;\n\n    send_http_msg(conn, 0, NULL);\n\n    if (conn->sock > 0) {\n        ev_io_stop(loop, &conn->ior);\n        ev_io_stop(loop, &conn->iow);\n        ev_timer_stop(loop, &conn->tmr);\n        close(conn->sock);\n    }\n\n    buffer_free(&conn->rb);\n    buffer_free(&conn->wb);\n\n    list_del(&conn->head);\n\n    free(conn);\n}\n\nstatic void on_net_read(struct ev_loop *loop, struct ev_io *w, int revents)\n{\n    struct http_connection *conn = container_of(w, struct http_connection, ior);\n    uint8_t buf[4096];\n    int ret;\n\n    ret = read(w->fd, buf, 4096);\n    if (ret <= 0)\n        goto done;\n\n    send_http_msg(conn, ret, buf);\n\n    return;\n\ndone:\n    http_conn_free(conn);\n}\n\nstatic void on_net_write(struct ev_loop *loop, struct ev_io *w, int revents)\n{\n    struct http_connection *conn = container_of(w, struct http_connection, iow);\n\n    if (buffer_pull_to_fd(&conn->wb, w->fd, -1) < 0)\n        goto err;\n\n    if (buffer_length(&conn->wb) > 0)\n        return;\n\nerr:\n    ev_io_stop(loop, w);\n}\n\nstatic void on_timer_cb(struct ev_loop *loop, struct ev_timer *w, int revents)\n{\n    struct http_connection *conn = container_of(w, struct http_connection, tmr);\n    ev_tstamp now = ev_now(loop);\n\n    if (now - conn->active < 30)\n        return;\n\n    http_conn_free(conn);\n}\n\nstatic void on_connected(int sock, void *arg)\n{\n    struct http_connection *conn = (struct http_connection *)arg;\n    struct ev_loop *loop = conn->rtty->loop;\n\n    if (sock < 0) {\n        http_conn_free(conn);\n        return;\n    }\n\n    ev_io_init(&conn->ior, on_net_read, sock, EV_READ);\n    ev_io_start(loop, &conn->ior);\n\n    ev_io_init(&conn->iow, on_net_write, sock, EV_WRITE);\n    ev_io_start(loop, &conn->iow);\n\n    ev_timer_init(&conn->tmr, on_timer_cb, 3, 3);\n    ev_timer_start(loop, &conn->tmr);\n\n    conn->sock = sock;\n}\n\nstatic struct http_connection *find_exist_connection(struct list_head *conns, uint8_t *addr)\n{\n    struct http_connection *conn;\n\n    list_for_each_entry(conn, conns, head) {\n        if (!memcmp(conn->addr, addr, 18))\n            return conn;\n    }\n\n    return NULL;\n}\n\nvoid http_request(struct rtty *rtty, int len)\n{\n    struct http_connection *conn;\n    struct sockaddr_in addrin = {\n        .sin_family = AF_INET\n    };\n    int sock, req_len;\n    uint8_t addr[18];\n    void *data;\n\n    buffer_pull(&rtty->rb, addr, 18);\n\n    req_len = len - 18;\n\n    if (req_len == 0)\n        return;\n\n    conn = find_exist_connection(&rtty->http_conns, addr);\n    if (conn) {\n        buffer_pull(&rtty->rb, NULL, 6);\n        req_len -= 6;\n\n        data = buffer_put(&conn->wb, req_len);\n        buffer_pull(&rtty->rb, data, req_len);\n\n        if (conn->sock > 0)\n            ev_io_start(rtty->loop, &conn->iow);\n        return;\n    }\n\n    addrin.sin_addr.s_addr = buffer_pull_u32(&rtty->rb);\n    addrin.sin_port = buffer_pull_u16(&rtty->rb);\n\n    req_len -= 6;\n\n    conn = (struct http_connection *)calloc(1, sizeof(struct http_connection));\n    conn->rtty = rtty;\n    conn->active = ev_now(rtty->loop);\n\n    memcpy(conn->addr, addr, 18);\n\n    data = buffer_put(&conn->wb, req_len);\n    buffer_pull(&rtty->rb, data, req_len);\n\n    list_add(&conn->head, &rtty->http_conns);\n\n    sock = tcp_connect_sockaddr(rtty->loop, (struct sockaddr *)&addrin, sizeof(addrin), on_connected, conn);\n    if (sock < 0)\n        http_conn_free(conn);\n}\n\nvoid http_conns_free(struct list_head *reqs)\n{\n    struct http_connection *con, *tmp;\n\n    list_for_each_entry_safe(con, tmp, reqs, head)\n        http_conn_free(con);\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/http.h",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2019 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#ifndef _WEB_H\n#define _WEB_H\n\n#include \"rtty.h\"\n\nstruct http_connection {\n    struct list_head head;\n    struct rtty *rtty;\n    struct ev_timer tmr;\n    struct ev_io ior;\n    struct ev_io iow;\n    struct buffer rb;\n    struct buffer wb;\n    ev_tstamp active;\n    int sock;\n    uint8_t addr[18];   /* upstream connection address: [port ip] */\n};\n\nvoid http_request(struct rtty *rtty, int len);\nvoid web_request_free(struct http_connection *ctx);\nvoid http_conns_free(struct list_head *reqs);\n\n#endif"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/list.h",
    "content": "/*-\n * Copyright (c) 2011 Felix Fietkau <nbd@openwrt.org>\n * Copyright (c) 2010 Isilon Systems, Inc.\n * Copyright (c) 2010 iX Systems, Inc.\n * Copyright (c) 2010 Panasas, Inc.\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n * 1. Redistributions of source code must retain the above copyright\n *    notice unmodified, this list of conditions, and the following\n *    disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR\n * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES\n * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.\n * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,\n * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT\n * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,\n * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY\n * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT\n * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF\n * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef _LINUX_LIST_H_\n#define _LINUX_LIST_H_\n\n#include <stddef.h>\n#include <stdbool.h>\n\n#define\tprefetch(x)\n\n#ifndef container_of\n#define container_of(ptr, type, member)\t\t\t\t\t\\\n\t({\t\t\t\t\t\t\t\t\\\n\t\tconst __typeof__(((type *) NULL)->member) *__mptr = (ptr);\t\\\n\t\t(type *) ((char *) __mptr - offsetof(type, member));\t\\\n\t})\n#endif\n\nstruct list_head {\n    struct list_head *next;\n    struct list_head *prev;\n};\n\n#define LIST_HEAD_INIT(name) { &(name), &(name) }\n#undef LIST_HEAD\n#define LIST_HEAD(name)\tstruct list_head name = LIST_HEAD_INIT(name)\n\nstatic inline void INIT_LIST_HEAD(struct list_head *list)\n{\n    list->next = list->prev = list;\n}\n\nstatic inline bool list_empty(const struct list_head *head)\n{\n    return (head->next == head);\n}\n\nstatic inline bool list_is_first(const struct list_head *list,\n                                 const struct list_head *head)\n{\n    return list->prev == head;\n}\n\nstatic inline bool list_is_last(const struct list_head *list,\n                                const struct list_head *head)\n{\n    return list->next == head;\n}\n\nstatic inline void _list_del(struct list_head *entry)\n{\n    entry->next->prev = entry->prev;\n    entry->prev->next = entry->next;\n}\n\nstatic inline void list_del(struct list_head *entry)\n{\n    _list_del(entry);\n    entry->next = entry->prev = NULL;\n}\n\nstatic inline void _list_add(struct list_head *_new, struct list_head *prev,\n                             struct list_head *next)\n{\n\n    next->prev = _new;\n    _new->next = next;\n    _new->prev = prev;\n    prev->next = _new;\n}\n\nstatic inline void list_del_init(struct list_head *entry)\n{\n    _list_del(entry);\n    INIT_LIST_HEAD(entry);\n}\n\n#define\tlist_entry(ptr, type, field)\tcontainer_of(ptr, type, field)\n#define\tlist_first_entry(ptr, type, field)\tlist_entry((ptr)->next, type, field)\n#define\tlist_last_entry(ptr, type, field)\tlist_entry((ptr)->prev, type, field)\n\n#define\tlist_for_each(p, head)\t\t\t\t\t\t\\\n\tfor (p = (head)->next; p != (head); p = p->next)\n\n#define\tlist_for_each_safe(p, n, head)\t\t\t\t\t\\\n\tfor (p = (head)->next, n = p->next; p != (head); p = n, n = p->next)\n\n#define list_for_each_entry(p, h, field)\t\t\t\t\\\n\tfor (p = list_first_entry(h, __typeof__(*p), field); &p->field != (h); \\\n\t    p = list_entry(p->field.next, __typeof__(*p), field))\n\n#define list_for_each_entry_safe(p, n, h, field)\t\t\t\\\n\tfor (p = list_first_entry(h, __typeof__(*p), field),\t\t\\\n\t    n = list_entry(p->field.next, __typeof__(*p), field); &p->field != (h);\\\n\t    p = n, n = list_entry(n->field.next, __typeof__(*n), field))\n\n#define\tlist_for_each_entry_reverse(p, h, field)\t\t\t\\\n\tfor (p = list_last_entry(h, __typeof__(*p), field); &p->field != (h); \\\n\t    p = list_entry(p->field.prev, __typeof__(*p), field))\n\n#define\tlist_for_each_prev(p, h) for (p = (h)->prev; p != (h); p = p->prev)\n#define\tlist_for_each_prev_safe(p, n, h) for (p = (h)->prev, n = p->prev; p != (h); p = n, n = p->prev)\n\nstatic inline void list_add(struct list_head *_new, struct list_head *head)\n{\n    _list_add(_new, head, head->next);\n}\n\nstatic inline void list_add_tail(struct list_head *_new, struct list_head *head)\n{\n    _list_add(_new, head->prev, head);\n}\n\nstatic inline void list_move(struct list_head *list, struct list_head *head)\n{\n    _list_del(list);\n    list_add(list, head);\n}\n\nstatic inline void list_move_tail(struct list_head *entry, struct list_head *head)\n{\n    _list_del(entry);\n    list_add_tail(entry, head);\n}\n\nstatic inline void _list_splice(const struct list_head *list, struct list_head *prev,\n                                struct list_head *next)\n{\n    struct list_head *first;\n    struct list_head *last;\n\n    if (list_empty(list))\n        return;\n\n    first = list->next;\n    last = list->prev;\n    first->prev = prev;\n    prev->next = first;\n    last->next = next;\n    next->prev = last;\n}\n\nstatic inline void list_splice(const struct list_head *list, struct list_head *head)\n{\n    _list_splice(list, head, head->next);\n}\n\nstatic inline void list_splice_tail(struct list_head *list, struct list_head *head)\n{\n    _list_splice(list, head->prev, head);\n}\n\nstatic inline void list_splice_init(struct list_head *list, struct list_head *head)\n{\n    _list_splice(list, head, head->next);\n    INIT_LIST_HEAD(list);\n}\n\nstatic inline void list_splice_tail_init(struct list_head *list, struct list_head *head)\n{\n    _list_splice(list, head->prev, head);\n    INIT_LIST_HEAD(list);\n}\n\n#endif /* _LINUX_LIST_H_ */\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/log/log.c",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2021 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#include <time.h>\n#include <stdio.h>\n#include <stdarg.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <string.h>\n#include <stdbool.h>\n\n#include \"log.h\"\n\nint __log_level__ = LOG_ERR;\nstatic const char *ident;\n\nvoid (*log_write)(int priority, const char *fmt, va_list ap);\n\nstatic const char *prioritynames[] = {\n    [LOG_EMERG] = \"emerg\",\n    [LOG_ALERT] = \"alert\",\n    [LOG_CRIT] = \"crit\",\n    [LOG_ERR] = \"err\",\n    [LOG_WARNING] = \"warn\",\n    [LOG_NOTICE] = \"notice\",\n    [LOG_INFO] = \"info\",\n    [LOG_DEBUG] = \"debug\"\n};\n\nvoid log_level(int level)\n{\n    __log_level__ = level;\n}\n\nvoid ___log(const char *filename, int line, int priority, const char *fmt, ...)\n{\n    char new_fmt[256];\n    va_list ap;\n\n    priority = LOG_PRI(priority);\n\n    if (priority > __log_level__)\n        return;\n\n    snprintf(new_fmt, sizeof(new_fmt), \"(%s:%d) %s\", filename, line, fmt);\n\n    va_start(ap, fmt);\n    log_write(priority, new_fmt, ap);\n    va_end(ap);\n}\n\nstatic inline void log_to_stdout(int priority, const char *fmt, va_list ap)\n{\n    time_t now;\n    struct tm tm;\n    char buf[32];\n\n    now = time(NULL);\n    localtime_r(&now, &tm);\n    strftime(buf, sizeof(buf), \"%Y/%m/%d %H:%M:%S\", &tm);\n\n    fprintf(stderr, \"%s %s \", buf, prioritynames[priority]);\n    vfprintf(stderr, fmt, ap);\n}\n\nstatic inline void log_to_syslog(int priority, const char *fmt, va_list ap)\n{\n    vsyslog(priority, fmt, ap);\n}\n\nstatic void __attribute__((constructor)) init()\n{\n    static char line[64];\n    FILE *self;\n    char *p = NULL;\n    char *sbuf;\n\n    if ((self = fopen(\"/proc/self/status\", \"r\")) != NULL) {\n        while (fgets(line, sizeof(line), self)) {\n            if (!strncmp(line, \"Name:\", 5)) {\n                strtok_r(line, \"\\t\\n\", &sbuf);\n                p = strtok_r(NULL, \"\\t\\n\", &sbuf);\n                break;\n            }\n        }\n        fclose(self);\n    }\n\n    ident = p;\n\n    if (isatty(STDOUT_FILENO)) {\n        log_write = log_to_stdout;\n    } else {\n        log_write = log_to_syslog;\n\n        openlog(ident, 0, LOG_DAEMON);\n    }\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/log/log.h",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2021 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#ifndef __LOG_H\n#define __LOG_H\n\n#include <syslog.h>\n#include <string.h>\n\nextern int __log_level__;\n\nvoid log_level(int level);\n\n#define __FILENAME__ (strrchr(__FILE__, '/') ? strrchr(__FILE__, '/') + 1 : __FILE__)\n\n/* This is useful. The code in the parameter is not executed when the log level is lower than the set value */\n#define log(priority, fmt...)                          \\\n    do {                                               \\\n        int pri = LOG_PRI(priority);                   \\\n                                                       \\\n        if (pri <= __log_level__)                      \\\n            ___log(__FILENAME__, __LINE__, pri, fmt);  \\\n    } while (0)\n\n#define log_debug(fmt...)     log(LOG_DEBUG, fmt)\n#define log_info(fmt...)      log(LOG_INFO, fmt)\n#define log_warn(fmt...)      log(LOG_WARNING, fmt)\n#define log_err(fmt...)       log(LOG_ERR, fmt)\n\n__attribute__((format(printf, 4, 5)))\nvoid ___log(const char *filename, int line, int priority, const char *fmt, ...);\n\n#endif\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/main.c",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2019 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#include <errno.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <getopt.h>\n#include <glob.h>\n\n#include \"log/log.h\"\n#include \"rtty.h\"\n\nenum {\n    LONG_OPT_HELP = 1\n};\n\n#ifdef SSL_SUPPORT\nstatic void load_default_ca_cert(struct ssl_context *ctx)\n{\n\tglob_t gl;\n\tsize_t i;\n\n\tglob(\"/etc/ssl/certs/*.crt\", 0, NULL, &gl);\n\n\tfor (i = 0; i < gl.gl_pathc; i++)\n\t\tssl_load_ca_crt_file(ctx, gl.gl_pathv[i]);\n\n\tglobfree(&gl);\n}\n#endif\n\nstatic void signal_cb(struct ev_loop *loop, ev_signal *w, int revents)\n{\n    if (w->signum == SIGINT) {\n        ev_break(loop, EVBREAK_ALL);\n        log_info(\"Normal quit\\n\");\n    }\n}\n\nstatic struct option long_options[] = {\n    {\"id\",          required_argument, NULL, 'I'},\n    {\"host\",        required_argument, NULL, 'h'},\n    {\"port\",        required_argument, NULL, 'p'},\n    {\"description\", required_argument, NULL, 'd'},\n    {\"token\",       required_argument, NULL, 't'},\n#ifdef SSL_SUPPORT\n    {\"cacert\",      required_argument, NULL, 'C'},\n    {\"insecure\",    no_argument, NULL, 'x'},\n    {\"cert\",        required_argument, NULL, 'c'},\n    {\"key\",         required_argument, NULL, 'k'},\n#endif\n    {\"verbose\",     no_argument,       NULL, 'v'},\n    {\"version\",     no_argument,       NULL, 'V'},\n    {\"help\",        no_argument,       NULL, LONG_OPT_HELP},\n    {0, 0, 0, 0}\n};\n\nstatic void usage(const char *prog)\n{\n    fprintf(stderr, \"Usage: %s [option]\\n\"\n            \"      -I, --id=string          Set an ID for the device(Maximum 63 bytes, valid\\n\"\n            \"                               character:letter, number, underline and short line)\\n\"\n            \"      -h, --host=string        Server's host or ipaddr(Default is localhost)\\n\"\n            \"      -p, --port=number        Server port(Default is 5912)\\n\"\n            \"      -d, --description=string Add a description to the device(Maximum 126 bytes)\\n\"\n            \"      -a                       Auto reconnect to the server\\n\"\n#ifdef SSL_SUPPORT\n            \"      -s                       SSL on\\n\"\n            \"      -C, --cacert             CA certificate to verify peer against\\n\"\n            \"      -x, --insecure           Allow insecure server connections when using SSL\\n\"\n            \"      -c, --cert               Certificate file to use\\n\"\n            \"      -k, --key                Private key file to use\\n\"\n#endif\n            \"      -D                       Run in the background\\n\"\n            \"      -t, --token=string       Authorization token\\n\"\n            \"      -f username              Skip a second login authentication. See man login(1) about the details\\n\"\n            \"      -R                       Receive file\\n\"\n            \"      -S file                  Send file\\n\"\n            \"      -v, --verbose            verbose\\n\"\n            \"      -V, --version            Show version\\n\"\n            \"      --help                   Show usage\\n\",\n            prog);\n    exit(1);\n}\n\nint main(int argc, char **argv)\n{\n    char shortopts[32] = \"I:h:p:d:aDt:f:RS:vV\";\n    struct ev_loop *loop = EV_DEFAULT;\n    struct ev_signal signal_watcher;\n    bool background = false;\n    bool verbose = false;\n    struct rtty rtty = {\n        .host = \"localhost\",\n        .port = 5912,\n        .loop = loop,\n        .sock = -1\n    };\n#ifdef SSL_SUPPORT\n    bool has_cacert = false;\n#endif\n    int option_index;\n    int c;\n\n    log_level(LOG_DEBUG);\n\n#ifdef SSL_SUPPORT\n    rtty.ssl_ctx = ssl_context_new(false);\n    if (!rtty.ssl_ctx)\n        return -1;\n\n    strcat(shortopts, \"sC:xc:k:\");\n#endif\n\n    while (true) {\n        c = getopt_long(argc, argv, shortopts, long_options, &option_index);\n        if (c == -1)\n            break;\n\n        switch (c) {\n        case 'I':\n            rtty.devid = optarg;\n            break;\n        case 'h':\n            rtty.host = optarg;\n            break;\n        case 'p':\n            rtty.port = atoi(optarg);\n            break;\n        case 'd':\n            if (strlen(optarg) > 126) {\n                log_err(\"Description too long\\n\");\n                usage(argv[0]);\n            }\n            rtty.description = optarg;\n            break;\n        case 'a':\n            rtty.reconnect = true;\n            break;\n#ifdef SSL_SUPPORT\n        case 's':\n            rtty.ssl_on = true;\n            break;\n        case 'C':\n            if (ssl_load_ca_crt_file(rtty.ssl_ctx, optarg)) {\n                log_err(\"load ca certificate file fail\\n\");\n                return -1;\n            }\n            has_cacert = true;\n            break;\n        case 'x':\n            rtty.insecure = true;\n            ssl_set_require_validation(rtty.ssl_ctx, false);\n            break;\n        case 'c':\n            if (ssl_load_crt_file(rtty.ssl_ctx, optarg)) {\n                log_err(\"load certificate file fail\\n\");\n                return -1;\n            }\n            break;\n        case 'k':\n            if (ssl_load_key_file(rtty.ssl_ctx, optarg)) {\n                log_err(\"load private key file fail\\n\");\n                return -1;\n            }\n            break;\n#endif\n        case 'D':\n            background = true;\n            break;\n        case 't':\n            rtty.token = optarg;\n            break;\n        case 'f':\n            rtty.username = optarg;\n            break;\n        case 'R':\n            request_transfer_file('R', NULL);\n            return 0;\n        case 'S':\n            request_transfer_file('S', optarg);\n            return 0;\n        case 'v':\n            verbose = true;\n            break;\n        case 'V':\n            log_info(\"rtty version %s\\n\", RTTY_VERSION_STRING);\n            exit(0);\n        case LONG_OPT_HELP:\n            usage(argv[0]);\n            break;\n        default: /* '?' */\n            usage(argv[0]);\n            break;\n        }\n    }\n\n    signal(SIGPIPE, SIG_IGN);\n\n    if (background && daemon(0, 0))\n        log_err(\"Can't run in the background: %s\\n\", strerror(errno));\n\n    if (verbose)\n        log_level(LOG_DEBUG);\n    else\n        log_level(LOG_ERR);\n\n    log_info(\"rtty version %s\\n\", RTTY_VERSION_STRING);\n\n    if (getuid() > 0) {\n        log_err(\"Operation not permitted, must be run as root\\n\");\n        return -1;\n    }\n\n    ev_signal_init(&signal_watcher, signal_cb, SIGINT);\n    ev_signal_start(loop, &signal_watcher);\n\n#ifdef SSL_SUPPORT\n    if (rtty.ssl_ctx && !has_cacert)\n        load_default_ca_cert(rtty.ssl_ctx);\n#endif\n\n    if (rtty_start(&rtty) < 0)\n        return -1;\n\n    ev_run(loop, 0);\n\n    rtty_exit(&rtty);\n\n#ifdef SSL_SUPPORT\n    ssl_context_free(rtty.ssl_ctx);\n#endif\n\n    ev_loop_destroy(loop);\n\n    return 0;\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/net.c",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2019 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#include <stdbool.h>\n#include <unistd.h>\n#include <stdlib.h>\n#include <errno.h>\n#include <stdio.h>\n#include <netdb.h>\n#include <ev.h>\n\n#include \"list.h\"\n#include \"net.h\"\n#include \"log/log.h\"\n\nstruct net_context {\n    struct ev_timer tmr;\n    struct ev_io iow;\n    int sock;\n    void *arg;\n\n    void (*on_connected)(int sock, void *arg);\n};\n\nstatic const char *port2str(int port)\n{\n    static char buffer[sizeof(\"65535\\0\")];\n\n    if (port < 0 || port > 65535)\n        return NULL;\n\n    snprintf(buffer, sizeof(buffer), \"%u\", port);\n\n    return buffer;\n}\n\n\nstatic void sock_write_cb(struct ev_loop *loop, struct ev_io *w, int revents)\n{\n    struct net_context *ctx = container_of(w, struct net_context, iow);\n    int err = 0;\n    socklen_t len = sizeof(err);\n    int ret;\n\n    ev_io_stop(loop, w);\n    ev_timer_stop(loop, &ctx->tmr);\n\n    ret = getsockopt(w->fd, SOL_SOCKET, SO_ERROR, &err, &len);\n    if (ret < 0) {\n        log_err(\"getsockopt: %s\\n\", strerror(errno));\n        goto err;\n    }\n\n    if (err > 0) {\n        log_err(\"network connect failed: %s\\n\", strerror(err));\n        goto err;\n    }\n\n    ctx->on_connected(w->fd, ctx->arg);\n    free(ctx);\n    return;\n\nerr:\n    close(w->fd);\n    ctx->on_connected(-1, ctx->arg);\n    free(ctx);\n}\n\nstatic void timer_cb(struct ev_loop *loop, struct ev_timer *w, int revents)\n{\n    struct net_context *ctx = container_of(w, struct net_context, tmr);\n\n    log_err(\"network connect timeout\\n\");\n\n    ev_io_stop(loop, &ctx->iow);\n    close(ctx->sock);\n    ctx->on_connected(-1, ctx->arg);\n    free(ctx);\n}\n\nstatic void wait_connect(struct ev_loop *loop, int sock, int timeout,\n                         void (*on_connected)(int sock, void *arg), void *arg)\n{\n    struct net_context *ctx = calloc(1, sizeof(struct net_context));\n\n    ctx->sock = sock;\n    ctx->arg = arg;\n    ctx->on_connected = on_connected;\n\n    ev_timer_init(&ctx->tmr, timer_cb, timeout, 0);\n    ev_timer_start(loop, &ctx->tmr);\n\n    ev_io_init(&ctx->iow, sock_write_cb, sock, EV_WRITE);\n    ev_io_start(loop, &ctx->iow);\n}\n\nint tcp_connect_sockaddr(struct ev_loop *loop, const struct sockaddr *addr, socklen_t addrlen,\n                void (*on_connected)(int sock, void *arg), void *arg)\n{\n    int sock;\n\n    sock = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK | SOCK_CLOEXEC, 0);\n    if (sock < 0) {\n        log_err(\"create socket failed: %s\\n\", strerror(errno));\n        return -1;\n    }\n\n    if (connect(sock, addr, addrlen) < 0) {\n        if (errno != EINPROGRESS) {\n            log_err(\"connect failed: %s\\n\", strerror(errno));\n            goto err;\n        }\n        wait_connect(loop, sock, 3, on_connected, arg);\n    } else {\n        on_connected(sock, arg);\n    }\n\n    return sock;\n\nerr:\n    close(sock);\n    return -1;\n}\n\nint tcp_connect(struct ev_loop *loop, const char *host, int port,\n                void (*on_connected)(int sock, void *arg), void *arg)\n{\n    struct sockaddr *addr = NULL;\n    struct addrinfo *result, *rp;\n    struct addrinfo hints = {\n        .ai_family = AF_INET,\n        .ai_socktype = SOCK_STREAM,\n        .ai_flags = AI_ADDRCONFIG\n    };\n    int sock = -1;\n    int addrlen;\n    int ret;\n\n    ret = getaddrinfo(host, port2str(port), &hints, &result);\n    if (ret) {\n        if (ret == EAI_SYSTEM) {\n            log_err(\"getaddrinfo failed: %s\\n\", strerror(errno));\n            return -1;\n        }\n\n        log_err(\"getaddrinfo failed: %s\\n\", gai_strerror(ret));\n        return -1;\n    }\n\n    for (rp = result; rp != NULL; rp = rp->ai_next) {\n        if (rp->ai_family == AF_INET) {\n            addr = rp->ai_addr;\n            addrlen = rp->ai_addrlen;\n            break;\n        }\n    }\n\n    if (!addr) {\n        log_err(\"getaddrinfo failed: Not found addr\\n\");\n        goto free_addrinfo;\n    }\n\n    sock = tcp_connect_sockaddr(loop, addr, addrlen, on_connected, arg);\n\nfree_addrinfo:\n    freeaddrinfo(result);\n    return sock;\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/net.h",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2019 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#ifndef RTTY_NET_H\n#define RTTY_NET_H\n\n#include <sys/socket.h>\n#include <ev.h>\n\nint tcp_connect(struct ev_loop *loop, const char *host, int port,\n                void (*on_connected)(int sock, void *arg), void *arg);\n\nint tcp_connect_sockaddr(struct ev_loop *loop, const struct sockaddr *addr, socklen_t addrlen,\n                void (*on_connected)(int sock, void *arg), void *arg);\n\n#endif\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/rtty.c",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2019 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#include <pty.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <stdlib.h>\n#include <sys/sysinfo.h>\n\n#include \"net.h\"\n#include \"http.h\"\n#include \"file.h\"\n#include \"rtty.h\"\n#include \"list.h\"\n#include \"utils.h\"\n#include \"command.h\"\n#include \"log/log.h\"\n\nstatic char login_path[128];       /* /bin/login */\n\nstatic void del_tty(struct tty *tty)\n{\n    struct rtty *rtty = tty->rtty;\n    struct ev_loop *loop = rtty->loop;\n\n    ev_io_stop(loop, &tty->ior);\n    ev_io_stop(loop, &tty->iow);\n    ev_timer_stop(loop, &tty->tmr);\n    ev_child_stop(loop, &tty->cw);\n\n    rtty->ntty--;\n    list_del(&tty->node);\n\n    buffer_free(&tty->wb);\n\n    close(tty->pty);\n    kill(tty->pid, SIGTERM);\n\n    file_context_reset(&tty->file);\n\n    log_info(\"delete tty: %s\\n\", tty->sid);\n\n    free(tty);\n}\n\nstatic inline struct tty *find_tty(struct rtty *rtty, const char *sid)\n{\n    struct tty *tty;\n\n    list_for_each_entry(tty, &rtty->ttys, node) {\n        if (!strcmp(tty->sid, sid))\n            return tty;\n    }\n\n    return NULL;\n}\n\nstatic void pty_on_read(struct ev_loop *loop, struct ev_io *w, int revents)\n{\n    struct tty *tty = container_of(w, struct tty, ior);\n    struct rtty *rtty = tty->rtty;\n    struct buffer *wb = &rtty->wb;\n    static uint8_t buf[4096];\n    int len = 0;\n\n    tty->active = ev_now(loop);\n\n    while (1) {\n        len = read(w->fd, buf, sizeof(buf));\n        if (likely(len > 0))\n            break;\n\n        if (len < 0) {\n            if (errno == EINTR)\n                continue;\n            if (errno != EIO)\n                log_err(\"read from pty failed: %s\\n\", strerror(errno));\n            return;\n        }\n\n        if (len == 0)\n            return;\n    }\n\n    if (detect_file_operation(buf, len, tty->sid, &tty->file))\n        return;\n\n    tty->wait_ack += len;\n\n    /* stop until received ack */\n    if (tty->wait_ack > RTTY_TTY_ACK_BLOCK)\n        ev_io_stop(loop, w);\n\n    buffer_put_u8(wb, MSG_TYPE_TERMDATA);\n    buffer_put_u16be(wb, 32 + len);\n    buffer_put_data(wb, tty->sid, 32);\n    buffer_put_data(wb, buf, len);\n    ev_io_start(loop, &rtty->iow);\n}\n\nstatic void pty_on_write(struct ev_loop *loop, struct ev_io *w, int revents)\n{\n    struct tty *tty = container_of(w, struct tty, iow);\n    struct buffer *wb = &tty->wb;\n    int ret;\n\n    ret = buffer_pull_to_fd(wb, w->fd, buffer_length(wb));\n    if (ret < 0) {\n        log_err(\"write to pty failed: %s\\n\", strerror(errno));\n        return;\n    }\n\n    if (buffer_length(wb) < 1)\n        ev_io_stop(loop, w);\n}\n\nstatic void pty_on_exit(struct ev_loop *loop, struct ev_child *w, int revents)\n{\n    struct tty *tty = container_of(w, struct tty, cw);\n    struct rtty *rtty = tty->rtty;\n    struct buffer *wb = &rtty->wb;\n\n    buffer_put_u8(wb, MSG_TYPE_LOGOUT);\n    buffer_put_u16be(wb, 32);\n    buffer_put_data(wb, tty->sid, 32);\n    ev_io_start(loop, &rtty->iow);\n\n    del_tty(tty);\n}\n\nstatic void tty_timer_cb(struct ev_loop *loop, struct ev_timer *w, int revents)\n{\n    struct tty *tty = container_of(w, struct tty, tmr);\n    ev_tstamp now = ev_now(loop);\n\n    if (now - tty->active < RTTY_TTY_TIMEOUT)\n        return;\n\n    ev_timer_stop(loop, w);\n    kill(tty->pid, SIGTERM);\n\n    log_err(\"tty(%s) inactive over %ds, now kill it\\n\", tty->sid, RTTY_TTY_TIMEOUT);\n}\n\nstatic void tty_login(struct rtty *rtty, const char *sid)\n{\n    struct tty *tty = NULL;\n    int code = 1;\n    pid_t pid;\n    int pty;\n\n    buffer_put_u8(&rtty->wb, MSG_TYPE_LOGIN);\n    buffer_put_u16be(&rtty->wb, 33);\n    buffer_put_data(&rtty->wb, sid, 32);\n\n    if (rtty->ntty == RTTY_MAX_TTY) {\n        log_info(\"tty login fail, device busy\\n\");\n        goto done;\n    }\n\n    tty = calloc(1, sizeof(struct tty));\n    if (!tty) {\n        log_err(\"calloc: %s\\n\", strerror(errno));\n        goto done;\n    }\n\n    pid = forkpty(&pty, NULL, NULL, NULL);\n    if (pid < 0) {\n        log_err(\"forkpty: %s\\n\", strerror(errno));\n        goto done;\n    }\n\n    if (pid == 0) {\n        if (rtty->username)\n            execl(login_path, \"login\", \"-f\", rtty->username, NULL);\n        else\n            execl(login_path, \"login\", NULL);\n\n        exit(1);\n    }\n\n    tty->pid = pid;\n    tty->pty = pty;\n    tty->rtty = rtty;\n    tty->file.fd = -1;\n\n    strcpy(tty->sid, sid);\n\n    rtty->ntty++;\n    list_add(&tty->node, &rtty->ttys);\n\n    fcntl(pty, F_SETFL, fcntl(pty, F_GETFL, 0) | O_NONBLOCK);\n\n    ev_io_init(&tty->ior, pty_on_read, pty, EV_READ);\n    ev_io_start(rtty->loop, &tty->ior);\n\n    ev_io_init(&tty->iow, pty_on_write, pty, EV_WRITE);\n\n    ev_child_init(&tty->cw, pty_on_exit, pid, 0);\n    ev_child_start(rtty->loop, &tty->cw);\n\n    ev_timer_init(&tty->tmr, tty_timer_cb, 3, 3);\n    ev_timer_start(rtty->loop, &tty->tmr);\n\n    code = 0;\n\n    log_info(\"new tty: %d/%d %s\\n\", rtty->ntty, RTTY_MAX_TTY, sid);\n\ndone:\n    if (code)\n        free(tty);\n\n    buffer_put_u8(&rtty->wb, code);\n    ev_io_start(rtty->loop, &rtty->iow);\n}\n\nstatic void write_data_to_tty(struct tty *tty, int len)\n{\n    struct rtty *rtty = tty->rtty;\n\n    tty->active = ev_now(rtty->loop);\n\n    buffer_put_data(&tty->wb, buffer_data(&rtty->rb), len);\n    buffer_pull(&rtty->rb, NULL, len);\n    ev_io_start(rtty->loop, &tty->iow);\n}\n\nstatic void set_tty_winsize(struct tty *tty)\n{\n    struct rtty *rtty = tty->rtty;\n    struct winsize size = {};\n\n    size.ws_col = buffer_pull_u16be(&rtty->rb);\n    size.ws_row = buffer_pull_u16be(&rtty->rb);\n\n    if (ioctl(tty->pty, TIOCSWINSZ, &size) < 0)\n        log_err(\"ioctl TIOCSWINSZ failed: %s\\n\", strerror(errno));\n}\n\nvoid rtty_exit(struct rtty *rtty)\n{\n    struct tty *tty, *ntty;\n\n    if (rtty->sock < 0)\n        return;\n\n    ev_io_stop(rtty->loop, &rtty->ior);\n    ev_io_stop(rtty->loop, &rtty->iow);\n\n    buffer_free(&rtty->rb);\n    buffer_free(&rtty->wb);\n\n    list_for_each_entry_safe(tty, ntty, &rtty->ttys, node) {\n        del_tty(tty);\n    }\n\n#ifdef SSL_SUPPORT\n    if (rtty->ssl) {\n        ssl_session_free(rtty->ssl);\n        rtty->ssl_negotiated = false;\n    }\n#endif\n\n    if (rtty->sock > 0) {\n        close(rtty->sock);\n        rtty->sock = -1;\n    }\n\n    http_conns_free(&rtty->http_conns);\n\n    if (!rtty->reconnect)\n        ev_break(rtty->loop, EVBREAK_ALL);\n}\n\nstatic void rtty_register(struct rtty *rtty)\n{\n    size_t len = 4 + strlen(rtty->devid);\n    struct buffer *wb = &rtty->wb;\n\n    if (rtty->description)\n        len += strlen(rtty->description);\n\n    if (rtty->token)\n        len += strlen(rtty->token);\n\n    buffer_put_u8(wb, MSG_TYPE_REGISTER);\n    buffer_put_u16be(wb, len);\n\n    buffer_put_u8(wb, RTTY_PROTO_VER);\n\n    buffer_put_string(wb, rtty->devid);\n    buffer_put_u8(wb, '\\0');\n\n    if (rtty->description)\n        buffer_put_string(wb, rtty->description);\n    buffer_put_u8(wb, '\\0');\n\n    if (rtty->token)\n        buffer_put_string(wb, rtty->token);\n    buffer_put_u8(wb, '\\0');\n\n    ev_io_start(rtty->loop, &rtty->iow);\n}\n\nstatic void parse_tty_msg(struct rtty *rtty, int type, int len)\n{\n    struct buffer *b = &rtty->rb;\n    struct tty *tty = NULL;\n    char sid[33] = \"\";\n\n    buffer_pull(b, sid, 32);\n    len -= 32;\n\n    if (type != MSG_TYPE_LOGIN) {\n        tty = find_tty(rtty, sid);\n        if (!tty) {\n            log_err(\"non-existent sid: %s\\n\", sid);\n            buffer_pull(&rtty->rb, NULL, len);\n            return;\n        }\n    }\n\n    switch (type) {\n    case MSG_TYPE_LOGIN:\n        tty_login(rtty, sid);\n        break;\n    case MSG_TYPE_LOGOUT:\n        del_tty(tty);\n        break;\n    case MSG_TYPE_TERMDATA:\n        write_data_to_tty(tty, len);\n        break;\n    case MSG_TYPE_WINSIZE:\n        set_tty_winsize(tty);\n        break;\n    case MSG_TYPE_FILE:\n        parse_file_msg(&tty->file, b, len);\n        break;\n    case MSG_TYPE_ACK:\n        tty->wait_ack -= buffer_pull_u16be(b);\n        ev_io_start(rtty->loop, &tty->ior);\n        break;\n    default:\n        /* never to here */\n        break;\n    }\n}\n\nstatic int parse_msg(struct rtty *rtty)\n{\n    struct buffer *rb = &rtty->rb;\n    int msgtype;\n    int msglen;\n\n    while (true) {\n        if (buffer_length(rb) < 3)\n            return 0;\n\n        msglen = buffer_get_u16be(rb, 1);\n        if (buffer_length(rb) < msglen + 3)\n            return 0;\n\n        msgtype = buffer_pull_u8(rb);\n        if (msgtype > MSG_TYPE_MAX) {\n            log_err(\"invalid message type: %d\\n\", msgtype);\n            return -1;\n        }\n\n        buffer_pull_u16(rb);\n\n        switch (msgtype) {\n        case MSG_TYPE_REGISTER:\n            if (buffer_pull_u8(rb)) {\n                char errs[128] = \"\";\n                buffer_pull(rb, errs, msglen - 1);\n                log_err(\"register fail: %s\\n\", errs);\n                return -1;\n            }\n            buffer_pull(rb, NULL, msglen - 1);\n            log_info(\"register success\\n\");\n            break;\n\n        case MSG_TYPE_LOGIN:\n        case MSG_TYPE_LOGOUT:\n        case MSG_TYPE_TERMDATA:\n        case MSG_TYPE_WINSIZE:\n        case MSG_TYPE_FILE:\n        case MSG_TYPE_ACK:\n            parse_tty_msg(rtty, msgtype, msglen);\n            break;\n\n        case MSG_TYPE_CMD:\n            run_command(rtty, buffer_data(rb));\n            buffer_pull(rb, NULL, msglen);\n            break;\n\n        case MSG_TYPE_HEARTBEAT:\n            break;\n\n        case MSG_TYPE_HTTP:\n            http_request(rtty, msglen);\n            break;\n\n        default:\n            /* never to here */\n            break;\n        }\n    }\n}\n\n#ifdef SSL_SUPPORT\nstatic void on_ssl_verify_error(int error, const char *str, void *arg)\n{\n    bool *valid_cert = arg;\n\n    *valid_cert = false;\n\n    log_warn(\"SSL certificate error(%d): %s\\n\", error, str);\n}\n\n/* -1 error, 0 pending, 1 ok */\nstatic int ssl_negotiated(struct rtty *rtty)\n{\n    bool valid_cert = true;\n    char err_buf[128];\n    int ret;\n\n    ret = ssl_connect(rtty->ssl, false, on_ssl_verify_error, &valid_cert);\n    if (ret == SSL_PENDING)\n        return 0;\n\n    if (ret == SSL_ERROR) {\n        log_err(\"ssl connect error: %s\\n\", ssl_last_error_string(err_buf, sizeof(err_buf)));\n        return -1;\n    }\n\n    if (!valid_cert && !rtty->insecure)\n        return -1;\n\n    rtty->ssl_negotiated = true;\n\n    return 1;\n}\n\nstatic int rtty_ssl_read(int fd, void *buf, size_t count, void *arg)\n{\n    static char err_buf[128];\n    struct rtty *rtty = arg;\n    int ret;\n\n    ret = ssl_read(rtty->ssl, buf, count);\n    if (ret == SSL_ERROR) {\n        log_err(\"ssl_read: %s\\n\", ssl_last_error_string(err_buf, sizeof(err_buf)));\n        return P_FD_ERR;\n    }\n\n    if (ret == SSL_PENDING)\n        return P_FD_PENDING;\n\n    return ret;\n}\n#endif\n\nstatic void on_net_read(struct ev_loop *loop, struct ev_io *w, int revents)\n{\n    struct rtty *rtty = container_of(w, struct rtty, ior);\n    bool eof = false;\n    int ret;\n\n    if (rtty->ssl_on) {\n#ifdef SSL_SUPPORT\n        if (unlikely(!rtty->ssl_negotiated)) {\n            ret = ssl_negotiated(rtty);\n            if (ret < 0)\n                goto err;\n            if (ret == 0)\n                return;\n        }\n\n        ret = buffer_put_fd_ex(&rtty->rb, w->fd, 4096, &eof, rtty_ssl_read, rtty);\n        if (ret < 0)\n            goto err;\n#endif\n    } else {\n        ret = buffer_put_fd(&rtty->rb, w->fd, 4096, &eof);\n        if (ret < 0) {\n            log_err(\"socket read error: %s\\n\", strerror(errno));\n            goto err;\n        }\n    }\n\n    rtty->ninactive = 0;\n    rtty->active = ev_now(loop);\n\n    if (parse_msg(rtty))\n        goto err;\n\n    if (eof) {\n        log_err(\"socket closed by server\\n\");\n        goto err;\n    }\n\n    return;\n\nerr:\n    rtty_exit(rtty);\n}\n\nstatic void on_net_write(struct ev_loop *loop, struct ev_io *w, int revents)\n{\n    struct rtty *rtty = container_of(w, struct rtty, iow);\n    int ret;\n\n    if (rtty->ssl_on) {\n#ifdef SSL_SUPPORT\n        static char err_buf[128];\n        struct buffer *b = &rtty->wb;\n\n        if (unlikely(!rtty->ssl_negotiated)) {\n            ret = ssl_negotiated(rtty);\n            if (ret < 0)\n                goto err;\n            if (ret == 0)\n                return;\n        }\n\n        ret = ssl_write(rtty->ssl, buffer_data(b), buffer_length(b));\n        if (ret == SSL_ERROR) {\n            log_err(\"ssl_write: %s\\n\", ssl_last_error_string(err_buf, sizeof(err_buf)));\n            goto err;\n        }\n\n        if (ret == SSL_PENDING)\n            return;\n\n        buffer_pull(b, NULL, ret);\n#endif\n    } else {\n        ret = buffer_pull_to_fd(&rtty->wb, w->fd, -1);\n        if (ret < 0) {\n            log_err(\"socket write error: %s\\n\", strerror(errno));\n            goto err;\n        }\n    }\n\n    if (buffer_length(&rtty->wb) < 1)\n        ev_io_stop(loop, w);\n\n    return;\n\nerr:\n    rtty_exit(rtty);\n}\n\nstatic void on_net_connected(int sock, void *arg)\n{\n    struct rtty *rtty = arg;\n\n    if (sock < 0) {\n        if (!rtty->reconnect)\n            ev_break(rtty->loop, EVBREAK_ALL);\n        return;\n    }\n\n    log_info(\"connected to server\\n\");\n\n    rtty->sock = sock;\n    rtty->ninactive = 0;\n\n    ev_io_init(&rtty->ior, on_net_read, sock, EV_READ);\n    ev_io_start(rtty->loop, &rtty->ior);\n\n    ev_io_init(&rtty->iow, on_net_write, sock, EV_WRITE);\n\n    if (rtty->ssl_on) {\n#ifdef SSL_SUPPORT\n        rtty->ssl = ssl_session_new(rtty->ssl_ctx, sock);\n        if (!rtty->ssl) {\n            log_err(\"SSL session create fail\\n\");\n            ev_break(rtty->loop, EVBREAK_ALL);\n            return;\n        }\n        ssl_set_server_name(rtty->ssl, rtty->host);\n#endif\n    }\n\n    rtty_register(rtty);\n}\n\nstatic void rtty_timer_cb(struct ev_loop *loop, struct ev_timer *w, int revents)\n{\n    struct rtty *rtty = container_of(w, struct rtty, tmr);\n    ev_tstamp now = ev_now(loop);\n\n    if (rtty->sock < 0) {\n        if (now - rtty->active < 5)\n            return;\n        rtty->active = now;\n        log_err(\"rtty reconnecting...\\n\");\n        tcp_connect(rtty->loop, rtty->host, rtty->port, on_net_connected, rtty);\n        return;\n    }\n\n    if (now - rtty->active > RTTY_HEARTBEAT_INTEVAL * 3 / 2) {\n        log_err(\"Inactive too long time\\n\");\n        if (rtty->ninactive++ > 1) {\n            log_err(\"Inactive 3 times, now exit\\n\");\n            rtty_exit(rtty);\n            return;\n        }\n        rtty->active = now;\n    }\n\n    if (now - rtty->last_heartbeat > RTTY_HEARTBEAT_INTEVAL - 1) {\n        struct sysinfo info = {};\n\n        rtty->last_heartbeat = now;\n\n        sysinfo(&info);\n\n        buffer_put_u8(&rtty->wb, MSG_TYPE_HEARTBEAT);\n        buffer_put_u16be(&rtty->wb, 16);\n        buffer_put_u32be(&rtty->wb, info.uptime);\n        buffer_put_zero(&rtty->wb, 12);  /* pad */\n        ev_io_start(loop, &rtty->iow);\n    }\n}\n\nint rtty_start(struct rtty *rtty)\n{\n    if (!rtty->devid) {\n        log_err(\"you must specify an id for your device\\n\");\n        return -1;\n    }\n\n    if (!valid_id(rtty->devid)) {\n        log_err(\"invalid device id\\n\");\n        return -1;\n    }\n\n    if (find_login(login_path, sizeof(login_path) - 1) < 0) {\n        log_err(\"the program 'login' is not found\\n\");\n        return -1;\n    }\n\n    ev_timer_init(&rtty->tmr, rtty_timer_cb, 1.0, 1.0);\n    ev_timer_start(rtty->loop, &rtty->tmr);\n\n    if (tcp_connect(rtty->loop, rtty->host, rtty->port, on_net_connected, rtty) < 0\n            && !rtty->reconnect)\n        return -1;\n\n    INIT_LIST_HEAD(&rtty->ttys);\n    INIT_LIST_HEAD(&rtty->http_conns);\n\n    rtty->active = ev_now(rtty->loop);\n\n    return 0;\n}\n\nvoid rtty_send_msg(struct rtty *rtty, int type, void *data, int len)\n{\n    struct buffer *wb = &rtty->wb;\n    buffer_put_u8(wb, type);\n    buffer_put_u16be(wb, len);\n    buffer_put_data(wb, data, len);\n    ev_io_start(rtty->loop, &rtty->iow);\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/rtty.h",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2019 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#ifndef RTTY_RTTY_H\n#define RTTY_RTTY_H\n\n#include <stdbool.h>\n#include <ev.h>\n\n#include \"config.h\"\n#include \"buffer.h\"\n#include \"file.h\"\n#include \"list.h\"\n\n#ifdef SSL_SUPPORT\n#include \"ssl/ssl.h\"\n#endif\n\n#define RTTY_PROTO_VER              3\n#define RTTY_MAX_TTY                10\n#define RTTY_HEARTBEAT_INTEVAL      5.0\n#define RTTY_TTY_TIMEOUT            600\n#define RTTY_TTY_ACK_BLOCK          4096\n\nenum {\n    MSG_TYPE_REGISTER,\n    MSG_TYPE_LOGIN,\n    MSG_TYPE_LOGOUT,\n    MSG_TYPE_TERMDATA,\n    MSG_TYPE_WINSIZE,\n    MSG_TYPE_CMD,\n    MSG_TYPE_HEARTBEAT,\n    MSG_TYPE_FILE,\n    MSG_TYPE_HTTP,\n    MSG_TYPE_ACK,\n    MSG_TYPE_MAX = MSG_TYPE_ACK\n};\n\nstruct rtty;\n\nstruct tty {\n    pid_t pid;\n    int pty;\n    char sid[33];\n    struct ev_io ior;\n    struct ev_io iow;\n    struct ev_child cw;\n    struct buffer wb;\n    struct rtty *rtty;\n    ev_tstamp active;\n    uint32_t wait_ack;\n    struct ev_timer tmr;\n    struct list_head node;\n    struct file_context file;\n};\n\nstruct rtty {\n    const char *host;\n    int port;\n    int sock;\n    const char *devid;\n    const char *token;        /* authorization token */\n    const char *description;\n    const char *username;\n    bool ssl_on;\n    struct buffer rb;\n    struct buffer wb;\n    struct ev_io iow;\n    struct ev_io ior;\n    struct ev_timer tmr;\n    struct ev_loop *loop;\n    int ninactive;\n    ev_tstamp active;\n    ev_tstamp last_heartbeat;\n    bool reconnect;\n#ifdef SSL_SUPPORT\n    struct ssl_context *ssl_ctx;\n    bool insecure;\n    bool ssl_negotiated;\n    void *ssl;\n#endif\n    int ntty;   /* tty number */\n    struct list_head ttys;\n    struct list_head http_conns;\n};\n\nint rtty_start(struct rtty *rtty);\nvoid rtty_exit(struct rtty *rtty);\nvoid rtty_send_msg(struct rtty *rtty, int type, void *data, int len);\n\n#endif\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/ssl/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 3.5)\n\nlist(APPEND CMAKE_MODULE_PATH \"${CMAKE_CURRENT_SOURCE_DIR}/cmake/Modules\")\n\noption(SSL_SUPPORT \"SSL support\" ON)\noption(USE_OPENSSL \"Force select OpenSSL\" OFF)\noption(USE_WOLFSSL \"Force select WolfSSL(CyaSSL)\" OFF)\noption(USE_MBEDTLS \"Force select MbedTLS(PolarSSL)\" OFF)\n\nif (NOT SSL_SUPPORT)\n    return()\nendif()\n\n\nfind_package(PkgConfig QUIET)\n\nfind_package(OpenSSL)\n\nif (NOT OPENSSL_FOUND)\n    pkg_check_modules(OPENSSL openssl)\nendif()\n\nfind_package(WolfSSL)\nfind_package(MbedTLS)\nfind_package(ZLIB)\n\nif(USE_OPENSSL)\n    if (NOT OPENSSL_FOUND)\n        message(FATAL_ERROR \"Force select OpenSSL, but not found it\")\n    endif()\nelseif(USE_WOLFSSL)\n    if (NOT WOLFSSL_FOUND)\n        message(FATAL_ERROR \"Force select WolfSSL(CyaSSL), but not found it\")\n    endif()\nelseif(USE_MBEDTLS)\n    if (NOT MBEDTLS_FOUND)\n        message(FATAL_ERROR \"Force select MbedTLS(PolarSSL), but not found it\")\n    endif()\nelseif(OPENSSL_FOUND)\n    set(USE_OPENSSL ON)\nelseif(WOLFSSL_FOUND)\n    set(USE_WOLFSSL ON)\nelseif(MBEDTLS_FOUND)\n    set(USE_MBEDTLS ON)\nelse()\n    message(WARNING \"No available SSL libraries found\")\nendif()\n\nif(USE_OPENSSL OR USE_WOLFSSL OR USE_MBEDTLS)\n    set(SSL_SUPPORT ON)\n\n    if(USE_OPENSSL)\n        set(SSL_NAME \"OpenSSL\")\n        set(SSL_SRC ${CMAKE_CURRENT_SOURCE_DIR}/openssl.c)\n        set(SSL_INC ${OPENSSL_INCLUDE_DIR})\n        set(SSL_LIBS ${OPENSSL_LIBRARIES})\n        set(SSL_DEFINE HAVE_OPENSSL)\n    elseif(USE_WOLFSSL)\n        set(SSL_NAME \"WolfSSL(CyaSSL)\")\n        set(SSL_SRC ${CMAKE_CURRENT_SOURCE_DIR}/openssl.c)\n        set(SSL_INC ${WOLFSSL_INCLUDE_DIR})\n        set(SSL_LIBS ${WOLFSSL_LIBRARIES})\n        set(SSL_DEFINE HAVE_WOLFSSL)\n    elseif(USE_MBEDTLS)\n        set(SSL_NAME \"MbedTLS(PolarSSL)\")\n        set(SSL_SRC ${CMAKE_CURRENT_SOURCE_DIR}/mbedtls.c)\n        set(SSL_INC ${MBEDTLS_INCLUDE_DIR})\n        set(SSL_LIBS ${MBEDTLS_LIBRARIES})\n        if(ZLIB_FOUND)\n            list(APPEND SSL_LIBS ${ZLIB_LIBRARIES})\n        endif()\n        set(SSL_DEFINE HAVE_MBEDTLS)\n    endif()\nendif()\n\nif(SSL_SUPPORT)\n    message(STATUS \"Select ${SSL_NAME} as the SSL backend\")\n\n    add_library(xssl STATIC ${SSL_SRC})\n    target_compile_definitions(xssl PRIVATE ${SSL_DEFINE})\n    target_compile_options(xssl PRIVATE -O -Wall -Werror --std=gnu99 -fPIC)\n    target_include_directories(xssl PRIVATE ${SSL_INC})\n    target_link_libraries(xssl PRIVATE ${SSL_LIBS})\n\n    set(SSL_SUPPORT ${SSL_SUPPORT} PARENT_SCOPE)\n    set(SSL_TARGET xssl PARENT_SCOPE)\n\n    set(SSL_SRC ${SSL_SRC} PARENT_SCOPE)\n    set(SSL_INC ${SSL_INC} PARENT_SCOPE)\n    set(SSL_LIBS ${SSL_LIBS} PARENT_SCOPE)\n    set(SSL_DEFINE ${SSL_DEFINE} PARENT_SCOPE)\nendif()\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/ssl/cmake/Modules/FindMbedTLS.cmake",
    "content": "find_path(MBEDTLS_INCLUDE_DIR mbedtls/ssl.h)\n\nfind_library(MBEDTLS_LIBRARY mbedtls)\nfind_library(MBEDX509_LIBRARY mbedx509)\nfind_library(MBEDCRYPTO_LIBRARY mbedcrypto)\n\nif(MBEDTLS_INCLUDE_DIR)\n  file(STRINGS \"${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h\"\n      MBEDTLS_VERSION_MAJOR REGEX \"^#define[ \\t]+MBEDTLS_VERSION_MAJOR[ \\t]+[0-9]+\")\n  file(STRINGS \"${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h\"\n      MBEDTLS_VERSION_MINOR REGEX \"^#define[ \\t]+MBEDTLS_VERSION_MINOR[ \\t]+[0-9]+\")\n  file(STRINGS \"${MBEDTLS_INCLUDE_DIR}/mbedtls/version.h\"\n      MBEDTLS_VERSION_PATCH REGEX \"^#define[ \\t]+MBEDTLS_VERSION_PATCH[ \\t]+[0-9]+\")\n  string(REGEX REPLACE \"[^0-9]+\" \"\" MBEDTLS_VERSION_MAJOR \"${MBEDTLS_VERSION_MAJOR}\")\n  string(REGEX REPLACE \"[^0-9]+\" \"\" MBEDTLS_VERSION_MINOR \"${MBEDTLS_VERSION_MINOR}\")\n  string(REGEX REPLACE \"[^0-9]+\" \"\" MBEDTLS_VERSION_PATCH \"${MBEDTLS_VERSION_PATCH}\")\n  set(MBEDTLS_VERSION \"${MBEDTLS_VERSION_MAJOR}.${MBEDTLS_VERSION_MINOR}.${MBEDTLS_VERSION_PATCH}\")\n  unset(MBEDTLS_VERSION_MINOR)\n  unset(MBEDTLS_VERSION_MAJOR)\n  unset(MBEDTLS_VERSION_PATCH)\nendif()\n\nset(MBEDTLS_LIBRARIES \"${MBEDTLS_LIBRARY}\" \"${MBEDX509_LIBRARY}\" \"${MBEDCRYPTO_LIBRARY}\")\n\ninclude(FindPackageHandleStandardArgs)\n\nfind_package_handle_standard_args(MbedTLS\n    REQUIRED_VARS\n        MBEDTLS_LIBRARY\n        MBEDX509_LIBRARY\n        MBEDCRYPTO_LIBRARY\n        MBEDTLS_INCLUDE_DIR\n    VERSION_VAR\n    \tMBEDTLS_VERSION\n)\n\nmark_as_advanced(MBEDTLS_INCLUDE_DIR MBEDTLS_LIBRARY MBEDX509_LIBRARY MBEDCRYPTO_LIBRARY)"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/ssl/cmake/Modules/FindWolfSSL.cmake",
    "content": "if(WOLFSSL_PREFER_STATIC_LIB)\n    set(WOLFSSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES ${CMAKE_FIND_LIBRARY_SUFFIXES})\n    if(WIN32)\n        set(CMAKE_FIND_LIBRARY_SUFFIXES .a .lib ${CMAKE_FIND_LIBRARY_SUFFIXES})\n    else()\n        set(CMAKE_FIND_LIBRARY_SUFFIXES .a ${CMAKE_FIND_LIBRARY_SUFFIXES})\n    endif()\nendif()\n\nif(UNIX)\n    find_package(PkgConfig QUIET)\n    pkg_check_modules(_WOLFSSL QUIET wolfssl)\nendif()\n\nfind_path(WOLFSSL_INCLUDE_DIR NAMES wolfssl/version.h HINTS ${_WOLFSSL_INCLUDEDIR})\nfind_library(WOLFSSL_LIBRARY NAMES wolfssl HINTS ${_WOLFSSL_LIBDIR})\nif(WOLFSSL_INCLUDE_DIR AND WOLFSSL_LIBRARY)\n    set(WOLFSSL_INCLUDE_DIR ${WOLFSSL_INCLUDE_DIR})\n    set(WOLFSSL_LIBRARY ${WOLFSSL_LIBRARY})\n    set(WOLFSSL_VERSION ${_WOLFSSL_VERSION})\n    set(WOLFSSL_IS_WOLFSSL ON)\nelse()\n    if(UNIX)\n        pkg_check_modules(_WOLFSSL QUIET WOLFSSL)\n    endif()\n\n    find_path(WOLFSSL_INCLUDE_DIR NAMES WOLFSSL/version.h HINTS ${_WOLFSSL_INCLUDEDIR})\n    find_library(WOLFSSL_LIBRARY NAMES WOLFSSL HINTS ${_WOLFSSL_LIBDIR})\n    set(WOLFSSL_VERSION ${_WOLFSSL_VERSION})\n    set(WOLFSSL_IS_WOLFSSL OFF)\nendif()\n\nif(NOT WOLFSSL_VERSION AND WOLFSSL_INCLUDE_DIR)\n    if(WOLFSSL_IS_WOLFSSL)\n        file(STRINGS \"${WOLFSSL_INCLUDE_DIR}/wolfssl/version.h\" WOLFSSL_VERSION_STR REGEX \"^#define[\\t ]+LIBWOLFSSL_VERSION_STRING[\\t ]+\\\"[^\\\"]+\\\"\")\n    else()\n        file(STRINGS \"${WOLFSSL_INCLUDE_DIR}/WOLFSSL/version.h\" WOLFSSL_VERSION_STR REGEX \"^#define[\\t ]+LIBWOLFSSL_VERSION_STRING[\\t ]+\\\"[^\\\"]+\\\"\")\n    endif()\n    if(WOLFSSL_VERSION_STR MATCHES \"\\\"([^\\\"]+)\\\"\")\n        set(WOLFSSL_VERSION \"${CMAKE_MATCH_1}\")\n    endif()\nendif()\n\nset(WOLFSSL_INCLUDE_DIRS ${WOLFSSL_INCLUDE_DIR})\nset(WOLFSSL_LIBRARIES ${WOLFSSL_LIBRARY})\n\ninclude(FindPackageHandleStandardArgs)\n\nfind_package_handle_standard_args(WolfSSL\n    REQUIRED_VARS\n        WOLFSSL_LIBRARY\n        WOLFSSL_INCLUDE_DIR\n    VERSION_VAR\n        WOLFSSL_VERSION\n)\n\nmark_as_advanced(WOLFSSL_INCLUDE_DIR WOLFSSL_LIBRARY WOLFSSL_INCLUDE_DIR WOLFSSL_LIBRARY)\n\nif(WOLFSSL_PREFER_STATIC_LIB)\n    set(CMAKE_FIND_LIBRARY_SUFFIXES ${WOLFSSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES})\n    unset(WOLFSSL_ORIG_CMAKE_FIND_LIBRARY_SUFFIXES)\nendif()"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/ssl/example-client.c",
    "content": "/*\n * openssl: gcc example-client.c openssl.c -lssl -lcrypto\n * wolfssl: gcc example-client.c openssl.c -lwolfssl -DHAVE_WOLFSSL\n * mbedtls: gcc example-client.c mbedtls.c -lmbedtls -lmbedcrypto -lmbedx509\n */\n\n#include <sys/select.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <stdbool.h>\n#include <unistd.h>\n#include <stdlib.h>\n#include <signal.h>\n#include <netdb.h>\n#include <stdio.h>\n#include <errno.h>\n\n#include \"ssl.h\"\n\nstatic void on_verify_error(int error, const char *str, void *arg)\n{\n    fprintf(stderr, \"WARNING: SSL certificate error(%d): %s\\n\", error, str);\n}\n\nstatic void chat(void *ssl, int sock)\n{\n    char err_buf[128];\n    char buf[4096];\n    fd_set rfds;\n    int ret;\n\n    FD_SET(STDIN_FILENO, &rfds);\n    FD_SET(sock, &rfds);\n\n    while (true) {\n        FD_ZERO(&rfds);\n        FD_SET(STDIN_FILENO, &rfds);\n        FD_SET(sock, &rfds);\n\n        ret = select(sock + 1, &rfds, NULL, NULL, NULL);\n        if (ret < 0) {\n            perror(\"select\");\n            return;\n        }\n\n        if (FD_ISSET(STDIN_FILENO, &rfds)) {\n            int n = read(STDIN_FILENO, buf, sizeof(buf));\n\n            do {\n                ret = ssl_write(ssl, buf, n);\n                if (ret < 0) {\n                    fprintf(stderr, \"ssl_write: %s\\n\", ssl_last_error_string(err_buf, sizeof(err_buf)));       \n                    return;\n                }\n            } while (ret == 0);\n            printf(\"Send: %.*s\\n\", ret, buf);\n\n        } else if (FD_ISSET(sock, &rfds)) {\n            ret = ssl_read(ssl, buf, sizeof(buf));\n            if (ret < 0) {\n                fprintf(stderr, \"ssl_read: %s\\n\", ssl_last_error_string(err_buf, sizeof(err_buf)));\n                ssl_session_free(ssl);\n                close(sock);\n                return;\n            }\n\n            if (ret == 0) {\n                fprintf(stderr, \"Connection closed by peer\\n\");\n                ssl_session_free(ssl);\n                close(sock);\n                return; \n            }\n\n            printf(\"Recv: %.*s\\n\", ret, buf);\n        }\n    }\n}\n\nstatic void *connect_ssl(int sock, const char *host)\n{\n    struct ssl_context *ctx;\n    char err_buf[128];\n    void *ssl;\n    int ret;\n\n    printf(\"Starting SSL negotiation\\n\");\n\n    ctx = ssl_context_new(false);\n    if (!ctx) {\n        fprintf(stderr, \"ssl_context_new fail\\n\");\n        return NULL;\n    }\n\n    ssl = ssl_session_new(ctx, sock);\n    if (!ssl) {\n        fprintf(stderr, \"ssl_session_new fail\\n\");\n        return NULL;\n    }\n\n    ssl_set_server_name(ssl, host);\n\n    do {\n        ret = ssl_connect(ssl, false, on_verify_error, NULL);\n\n        if (ret == SSL_ERROR) {\n            fprintf(stderr, \"ssl_connect: %s\\n\", ssl_last_error_string(err_buf, sizeof(err_buf)));\n            return NULL;\n        }\n    } while (ret == SSL_PENDING);\n\n    printf(\"SSL negotiation OK\\n\");\n\n    return ssl;\n}\n\nstatic bool wait_connect(int sock)\n{\n    struct timeval tv = {\n        .tv_sec = 5\n    };\n    fd_set wfds = {};\n    int ret, err;\n    socklen_t len = sizeof(err);\n\n    FD_SET(sock, &wfds);\n\n    ret = select(sock + 1, NULL, &wfds, NULL, &tv);\n    if (ret < 0) {\n        perror(\"select\");\n        return false;\n    }\n\n    if (!FD_ISSET(sock, &wfds))\n        return false;\n    \n    ret = getsockopt(sock, SOL_SOCKET, SO_ERROR, &err, &len);\n    if (ret < 0) {\n        perror(\"getsockopt\");\n        return false;\n    }\n\n    return true;\n}\n\nint main(int argc, char **argv)\n{\n    struct sockaddr_in addr = {\n        .sin_family = AF_INET,\n    };\n    int sock;\n    void *ssl;\n\n    if (argc < 3) {\n        fprintf(stderr, \"Usage: %s host port\\n\", argv[0]);\n        return -1;\n    }\n\n    if (!inet_aton(argv[1], &addr.sin_addr)) {\n        fprintf(stderr, \"invalid addr: %s\\n\", optarg);\n        return -1;\n    }\n\n    addr.sin_port = htons(atoi(argv[2]));\n\n    signal(SIGPIPE, SIG_IGN);\n\n    sock = socket(AF_INET, SOCK_STREAM | SOCK_NONBLOCK, 0);\n    if (sock < 0) {\n        perror(\"socket\");\n        return -1;\n    }\n\n    if (connect(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {\n        if (errno != EINPROGRESS) {\n            perror(\"connect\");\n            return -1;\n        }\n\n        if (!wait_connect(sock))\n            return -1;\n    }\n\n    printf(\"Connection established\\n\");\n\n    ssl = connect_ssl(sock, argv[2]);\n    if (!ssl)\n        return -1;\n    \n    chat(ssl, sock);\n\n    return 0;\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/ssl/example-server.c",
    "content": "/*\n * openssl: gcc example-server.c openssl.c -lssl -lcrypto\n * wolfssl: gcc example-server.c openssl.c -lwolfssl -DHAVE_WOLFSSL\n * mbedtls: gcc example-server.c mbedtls.c -lmbedtls -lmbedcrypto -lmbedx509\n */\n\n#define _GNU_SOURCE\n\n#include <sys/select.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <signal.h>\n#include <unistd.h>\n#include <stdlib.h>\n#include <netdb.h>\n#include <stdio.h>\n#include <errno.h>\n\n#include \"ssl.h\"\n\nstatic struct ssl_context *ctx;\n\nstatic void on_verify_error(int error, const char *str, void *arg)\n{\n    fprintf(stderr, \"WARNING: SSL certificate error(%d): %s\\n\", error, str);\n}\n\nstatic void chat(void *ssl, int sock)\n{\n    char err_buf[128];\n    char buf[4096];\n    fd_set rfds;\n    int ret;\n\n    FD_SET(STDIN_FILENO, &rfds);\n    FD_SET(sock, &rfds);\n\n    while (true) {\n        FD_ZERO(&rfds);\n        FD_SET(STDIN_FILENO, &rfds);\n        FD_SET(sock, &rfds);\n\n        ret = select(sock + 1, &rfds, NULL, NULL, NULL);\n        if (ret < 0) {\n            perror(\"select\");\n            return;\n        }\n\n        if (FD_ISSET(STDIN_FILENO, &rfds)) {\n            int n = read(STDIN_FILENO, buf, sizeof(buf));\n\n            do {\n                ret = ssl_write(ssl, buf, n);\n                if (ret < 0) {\n                    fprintf(stderr, \"ssl_write: %s\\n\", ssl_last_error_string(err_buf, sizeof(err_buf)));       \n                    return;\n                }\n            } while (ret == 0);\n            printf(\"Send: %.*s\\n\", ret, buf);\n\n        } else if (FD_ISSET(sock, &rfds)) {\n            ret = ssl_read(ssl, buf, sizeof(buf));\n            if (ret < 0) {\n                fprintf(stderr, \"ssl_read error: %s\\n\", ssl_last_error_string(err_buf, sizeof(err_buf)));\n                ssl_session_free(ssl);\n                close(sock);\n                return;\n            }\n\n            if (ret == 0) {\n                fprintf(stderr, \"Connection closed by peer\\n\");\n                ssl_session_free(ssl);\n                close(sock);\n                return; \n            }\n\n            printf(\"Recv: %.*s\\n\", ret, buf);\n        }\n    }\n}\n\nstatic void *ssl_negotiation(int sock)\n{\n    char err_buf[128];\n    void *ssl;\n    int ret;\n    \n    ssl = ssl_session_new(ctx, sock);\n    if (!ssl) {\n        fprintf(stderr, \"ssl_session_new fail\\n\");\n        return NULL;\n    }\n\n    printf(\"Wait SSL negotiation...\\n\");\n\n    do {\n        ret = ssl_connect(ssl, true, on_verify_error, NULL);\n\n        if (ret == SSL_ERROR) {\n            fprintf(stderr, \"ssl_connect: %s\\n\", ssl_last_error_string(err_buf, sizeof(err_buf)));\n            return NULL;\n        }\n    } while (ret == SSL_PENDING);\n\n    printf(\"SSL negotiation OK\\n\");\n\n    return ssl;\n}\n\nint main(int argc, char **argv)\n{\n    struct sockaddr_in addr = {\n        .sin_family = AF_INET,\n        .sin_addr.s_addr = INADDR_ANY,\n        .sin_port = htons(4433)\n    };\n    int on = 1;\n    int sock;\n\n    signal(SIGPIPE, SIG_IGN);\n\n    sock = socket(AF_INET, SOCK_STREAM, 0);\n    if (sock < 0) {\n        perror(\"socket\");\n        return -1;\n    }\n\n    setsockopt(sock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(int));\n\n    if (bind(sock, (struct sockaddr *)&addr, sizeof(addr)) < 0) {\n        perror(\"bind\");\n        return -1;\n    }\n\n    listen(sock, 128);\n\n    ctx = ssl_context_new(true);\n\n    ssl_load_crt_file(ctx, \"example.crt\");\n    ssl_load_key_file(ctx, \"example.key\");\n\n    printf(\"Wait connect...\\n\");\n\n    while (true) {\n        void *ssl;\n        int cli;\n\n        cli = accept4(sock, NULL, NULL, SOCK_NONBLOCK);\n        if (cli < 0) {\n            perror(\"accept4\");\n            return -1;\n        }\n\n        printf(\"new tcp connection\\n\");\n\n        ssl = ssl_negotiation(cli);\n        if (!ssl)\n            return -1;\n        \n        chat(ssl, cli);\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/ssl/mbedtls.c",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2021 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/*\n * ustream-ssl - library for SSL over ustream\n *\n * Copyright (C) 2012 Felix Fietkau <nbd@openwrt.org>\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include <string.h>\n#include <unistd.h>\n#include <stdlib.h>\n#include <fcntl.h>\n#include <errno.h>\n\n#include \"ssl.h\"\n\n#include <mbedtls/ssl.h>\n#include <mbedtls/certs.h>\n#include <mbedtls/x509.h>\n#include <mbedtls/rsa.h>\n#include <mbedtls/error.h>\n#include <mbedtls/version.h>\n#include <mbedtls/entropy.h>\n\n#if MBEDTLS_VERSION_NUMBER < 0x02040000L\n#include <mbedtls/net.h>\n#else\n#include <mbedtls/net_sockets.h>\n#endif\n\n#if defined(MBEDTLS_SSL_CACHE_C)\n#include <mbedtls/ssl_cache.h>\n#endif\n\nstruct ssl_context {\n    mbedtls_ssl_config conf;\n    mbedtls_pk_context key;\n    mbedtls_x509_crt ca_cert;\n    mbedtls_x509_crt cert;\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_cache_context cache;\n#endif\n    bool server;\n    int *ciphersuites;\n};\n\nstatic int ssl_err_code;\n\nstatic int urandom_fd = -1;\n\nstatic bool urandom_init(void)\n{\n    if (urandom_fd > -1)\n        return true;\n\n    urandom_fd = open(\"/dev/urandom\", O_RDONLY);\n    if (urandom_fd < 0)\n        return false;\n\n    return true;\n}\n\nstatic int _urandom(void *ctx, unsigned char *out, size_t len)\n{\n    if (read(urandom_fd, out, len) < 0)\n        return MBEDTLS_ERR_ENTROPY_SOURCE_FAILED;\n\n    return 0;\n}\n\n#define AES_GCM_CIPHERS(v)\t\t\t\t\\\n    MBEDTLS_TLS_##v##_WITH_AES_128_GCM_SHA256,\t\\\n    MBEDTLS_TLS_##v##_WITH_AES_256_GCM_SHA384\n\n#define AES_CBC_CIPHERS(v)\t\t\t\t\\\n    MBEDTLS_TLS_##v##_WITH_AES_128_CBC_SHA,\t\t\\\n    MBEDTLS_TLS_##v##_WITH_AES_256_CBC_SHA\n\n#define AES_CIPHERS(v)\t\t\t\t\t\\\n    AES_GCM_CIPHERS(v),\t\t\t\t\\\n    AES_CBC_CIPHERS(v)\n\nstatic const int default_ciphersuites_server[] =\n{\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,\n    AES_GCM_CIPHERS(ECDHE_ECDSA),\n    MBEDTLS_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,\n    AES_GCM_CIPHERS(ECDHE_RSA),\n    AES_CBC_CIPHERS(ECDHE_RSA),\n    AES_CIPHERS(RSA),\n    0\n};\n\nstatic const int default_ciphersuites_client[] =\n{\n    MBEDTLS_TLS_ECDHE_ECDSA_WITH_CHACHA20_POLY1305_SHA256,\n    AES_GCM_CIPHERS(ECDHE_ECDSA),\n    MBEDTLS_TLS_ECDHE_RSA_WITH_CHACHA20_POLY1305_SHA256,\n    AES_GCM_CIPHERS(ECDHE_RSA),\n    MBEDTLS_TLS_DHE_RSA_WITH_CHACHA20_POLY1305_SHA256,\n    AES_GCM_CIPHERS(DHE_RSA),\n    AES_CBC_CIPHERS(ECDHE_ECDSA),\n    AES_CBC_CIPHERS(ECDHE_RSA),\n    AES_CBC_CIPHERS(DHE_RSA),\n    MBEDTLS_TLS_DHE_RSA_WITH_3DES_EDE_CBC_SHA,\n    AES_CIPHERS(RSA),\n    MBEDTLS_TLS_RSA_WITH_3DES_EDE_CBC_SHA,\n    0\n};\n\nconst char *ssl_last_error_string(char *buf, int len)\n{\n    mbedtls_strerror(ssl_err_code, buf, len);\n    return buf;\n}\n\nstruct ssl_context *ssl_context_new(bool server)\n{\n    struct ssl_context *ctx;\n    mbedtls_ssl_config *conf;\n    int ep;\n\n    if (!urandom_init())\n        return NULL;\n\n    ctx = calloc(1, sizeof(*ctx));\n    if (!ctx)\n        return NULL;\n\n    ctx->server = server;\n    mbedtls_pk_init(&ctx->key);\n    mbedtls_x509_crt_init(&ctx->cert);\n    mbedtls_x509_crt_init(&ctx->ca_cert);\n\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_cache_init(&ctx->cache);\n    mbedtls_ssl_cache_set_timeout(&ctx->cache, 30 * 60);\n    mbedtls_ssl_cache_set_max_entries(&ctx->cache, 5);\n#endif\n\n    conf = &ctx->conf;\n    mbedtls_ssl_config_init(conf);\n\n    ep = server ? MBEDTLS_SSL_IS_SERVER : MBEDTLS_SSL_IS_CLIENT;\n\n    mbedtls_ssl_config_defaults(conf, ep, MBEDTLS_SSL_TRANSPORT_STREAM, MBEDTLS_SSL_PRESET_DEFAULT);\n    mbedtls_ssl_conf_rng(conf, _urandom, NULL);\n\n    if (server) {\n        mbedtls_ssl_conf_authmode(conf, MBEDTLS_SSL_VERIFY_NONE);\n        mbedtls_ssl_conf_ciphersuites(conf, default_ciphersuites_server);\n        mbedtls_ssl_conf_min_version(conf, MBEDTLS_SSL_MAJOR_VERSION_3, MBEDTLS_SSL_MINOR_VERSION_3);\n    } else {\n        mbedtls_ssl_conf_authmode(conf, MBEDTLS_SSL_VERIFY_OPTIONAL);\n        mbedtls_ssl_conf_ciphersuites(conf, default_ciphersuites_client);\n    }\n\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_conf_session_cache(conf, &ctx->cache,\n                       mbedtls_ssl_cache_get,\n                       mbedtls_ssl_cache_set);\n#endif\n    return ctx;\n}\n\nvoid ssl_context_free(struct ssl_context *ctx)\n{\n    if (!ctx)\n        return;\n\n#if defined(MBEDTLS_SSL_CACHE_C)\n    mbedtls_ssl_cache_free(&ctx->cache);\n#endif\n    mbedtls_pk_free(&ctx->key);\n    mbedtls_x509_crt_free(&ctx->ca_cert);\n    mbedtls_x509_crt_free(&ctx->cert);\n    mbedtls_ssl_config_free(&ctx->conf);\n    free(ctx->ciphersuites);\n    free(ctx);\n}\n\nstatic void ssl_update_own_cert(struct ssl_context *ctx)\n{\n    if (!ctx->cert.version)\n        return;\n\n    if (!ctx->key.pk_info)\n        return;\n\n    mbedtls_ssl_conf_own_cert(&ctx->conf, &ctx->cert, &ctx->key);\n}\n\nint ssl_load_ca_crt_file(struct ssl_context *ctx, const char *file)\n{\n    int ret;\n\n    ret = mbedtls_x509_crt_parse_file(&ctx->ca_cert, file);\n    if (ret)\n        return -1;\n\n    mbedtls_ssl_conf_ca_chain(&ctx->conf, &ctx->ca_cert, NULL);\n    mbedtls_ssl_conf_authmode(&ctx->conf, MBEDTLS_SSL_VERIFY_OPTIONAL);\n\n    return 0;\n}\n\nint ssl_load_crt_file(struct ssl_context *ctx, const char *file)\n{\n    int ret;\n\n    ret = mbedtls_x509_crt_parse_file(&ctx->cert, file);\n    if (ret)\n        return -1;\n\n    ssl_update_own_cert(ctx);\n\n    return 0;\n}\n\nint ssl_load_key_file(struct ssl_context *ctx, const char *file)\n{\n    int ret;\n\n    ret = mbedtls_pk_parse_keyfile(&ctx->key, file, NULL);\n    if (ret)\n        return -1;\n\n    ssl_update_own_cert(ctx);\n\n    return 0;\n}\n\nint ssl_set_ciphers(struct ssl_context *ctx, const char *ciphers)\n{\n    int *ciphersuites = NULL, *tmp, id;\n    char *cipherstr, *p, *last, c;\n    size_t len = 0;\n\n    if (ciphers == NULL)\n        return -1;\n\n    cipherstr = strdup(ciphers);\n\n    if (cipherstr == NULL)\n        return -1;\n\n    for (p = cipherstr, last = p;; p++) {\n        if (*p == ':' || *p == 0) {\n            c = *p;\n            *p = 0;\n\n            id = mbedtls_ssl_get_ciphersuite_id(last);\n\n            if (id != 0) {\n                tmp = realloc(ciphersuites, (len + 2) * sizeof(int));\n\n                if (tmp == NULL) {\n                    free(ciphersuites);\n                    free(cipherstr);\n\n                    return -1;\n                }\n\n                ciphersuites = tmp;\n                ciphersuites[len++] = id;\n                ciphersuites[len] = 0;\n            }\n\n            if (c == 0)\n                break;\n\n            last = p + 1;\n        }\n\n        /*\n         * mbedTLS expects cipher names with dashes while many sources elsewhere\n         * like the Firefox wiki or Wireshark specify ciphers with underscores,\n         * so simply convert all underscores to dashes to accept both notations.\n         */\n        else if (*p == '_') {\n            *p = '-';\n        }\n    }\n\n    free(cipherstr);\n\n    if (len == 0)\n        return -1;\n\n    mbedtls_ssl_conf_ciphersuites(&ctx->conf, ciphersuites);\n    free(ctx->ciphersuites);\n\n    ctx->ciphersuites = ciphersuites;\n\n    return 0;\n}\n\nint ssl_set_require_validation(struct ssl_context *ctx, bool require)\n{\n    int mode = MBEDTLS_SSL_VERIFY_OPTIONAL;\n\n    if (!require)\n        mode = MBEDTLS_SSL_VERIFY_NONE;\n\n    mbedtls_ssl_conf_authmode(&ctx->conf, mode);\n\n    return 0;\n}\n\nvoid *ssl_session_new(struct ssl_context *ctx, int sock)\n{\n    mbedtls_ssl_context *ssl;\n    mbedtls_net_context *net;\n\n    ssl = calloc(1, sizeof(mbedtls_ssl_context) + sizeof(mbedtls_net_context));\n    if (!ssl)\n        return NULL;\n\n    mbedtls_ssl_init(ssl);\n\n    if (mbedtls_ssl_setup(ssl, &ctx->conf)) {\n        free(ssl);\n        return NULL;\n    }\n\n    net = (mbedtls_net_context *)(ssl + 1);\n    net->fd = sock;\n\n    mbedtls_ssl_set_bio(ssl, net, mbedtls_net_send, mbedtls_net_recv, NULL);\n\n    return ssl;\n}\n\nvoid ssl_session_free(void *ssl)\n{\n    if (!ssl)\n        return;\n\n    mbedtls_ssl_free(ssl);\n    free(ssl);\n}\n\nvoid ssl_set_server_name(void *ssl, const char *name)\n{\n    mbedtls_ssl_set_hostname(ssl, name);\n}\n\nstatic bool ssl_do_wait(int ret)\n{\n    switch(ret) {\n    case MBEDTLS_ERR_SSL_WANT_READ:\n    case MBEDTLS_ERR_SSL_WANT_WRITE:\n        return true;\n    default:\n        return false;\n    }\n}\n\nstatic void ssl_verify_cert(void *ssl, void (*on_verify_error)(int error, const char *str, void *arg), void *arg)\n{\n    const char *msg = NULL;\n    int r;\n\n    r = mbedtls_ssl_get_verify_result(ssl);\n    r &= ~MBEDTLS_X509_BADCERT_CN_MISMATCH;\n\n    if (r & MBEDTLS_X509_BADCERT_EXPIRED)\n        msg = \"certificate has expired\";\n    else if (r & MBEDTLS_X509_BADCERT_REVOKED)\n        msg = \"certificate has been revoked\";\n    else if (r & MBEDTLS_X509_BADCERT_NOT_TRUSTED)\n        msg = \"certificate is self-signed or not signed by a trusted CA\";\n    else\n        msg = \"unknown error\";\n\n    if (r && on_verify_error)\n        on_verify_error(r, msg, arg);\n}\n\nint ssl_connect(void *ssl, bool server,\n        void (*on_verify_error)(int error, const char *str, void *arg), void *arg)\n{\n    int r;\n\n    ssl_err_code = 0;\n\n    r = mbedtls_ssl_handshake(ssl);\n    if (r == 0) {\n        ssl_verify_cert(ssl, on_verify_error, arg);\n        return SSL_OK;\n    }\n\n    if (ssl_do_wait(r))\n        return SSL_PENDING;\n\n    ssl_err_code = r;\n\n    return SSL_ERROR;\n}\n\nint ssl_write(void *ssl, const void *buf, int len)\n{\n    int done = 0;\n    int ret = 0;\n\n    ssl_err_code = 0;\n\n    while (done != len) {\n        ret = mbedtls_ssl_write(ssl, (const unsigned char *)buf + done, len - done);\n\n        if (ret < 0) {\n            if (ssl_do_wait(ret))\n                return done;\n\n            ssl_err_code = ret;\n            return -1;\n        }\n\n        done += ret;\n    }\n\n    return done;\n}\n\nint ssl_read(void *ssl, void *buf, int len)\n{\n    int ret = mbedtls_ssl_read(ssl, (unsigned char *)buf, len);\n\n    ssl_err_code = 0;\n\n    if (ret < 0) {\n        if (ssl_do_wait(ret))\n            return SSL_PENDING;\n\n        if (ret == MBEDTLS_ERR_SSL_PEER_CLOSE_NOTIFY)\n            return 0;\n\n        ssl_err_code = ret;\n        return SSL_ERROR;\n    }\n\n    return ret;\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/ssl/openssl.c",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2021 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n/*\n * ustream-ssl - library for SSL over ustream\n *\n * Copyright (C) 2012 Felix Fietkau <nbd@openwrt.org>\n *\n * Permission to use, copy, modify, and/or distribute this software for any\n * purpose with or without fee is hereby granted, provided that the above\n * copyright notice and this permission notice appear in all copies.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES\n * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF\n * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR\n * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES\n * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN\n * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF\n * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.\n */\n\n#include <string.h>\n\n#include \"ssl.h\"\n\n#if defined(HAVE_WOLFSSL)\n#include <wolfssl/options.h>\n#include <wolfssl/openssl/ssl.h>\n#else\n#include <openssl/ssl.h>\n#include <openssl/err.h>\n#include <openssl/x509v3.h>\n#endif\n\n/* Ciphersuite preference:\n * - for server, no weak ciphers are used if you use an ECDSA key.\n * - forward-secret (pfs), authenticated (AEAD) ciphers are at the top:\n *   \tchacha20-poly1305, the fastest in software, 256-bits\n * \taes128-gcm, 128-bits\n * \taes256-gcm, 256-bits\n * - key exchange: prefer ECDHE, then DHE (client only)\n * - forward-secret ECDSA CBC ciphers (client-only)\n * - forward-secret RSA CBC ciphers\n * - non-pfs ciphers\n *\taes128, aes256, 3DES(client only)\n */\n\n#ifdef WOLFSSL_SSL_H\n# define top_ciphers\t\t\t\t\t\t\t\\\n                \"TLS13-CHACHA20-POLY1305-SHA256:\"\t\\\n                \"TLS13-AES128-GCM-SHA256:\"\t\t\\\n                \"TLS13-AES256-GCM-SHA384:\"\t\t\\\n                ecdhe_aead_ciphers\n#else\n# define top_ciphers\t\t\t\t\t\t\t\\\n                ecdhe_aead_ciphers\n#endif\n\n# define tls13_ciphersuites\t\"TLS_CHACHA20_POLY1305_SHA256:\"\t\t\\\n                \"TLS_AES_128_GCM_SHA256:\"\t\t\\\n                \"TLS_AES_256_GCM_SHA384\"\n\n#define ecdhe_aead_ciphers\t\t\t\t\t\t\\\n                \"ECDHE-ECDSA-CHACHA20-POLY1305:\"\t\\\n                \"ECDHE-ECDSA-AES128-GCM-SHA256:\"\t\\\n                \"ECDHE-ECDSA-AES256-GCM-SHA384:\"\t\\\n                \"ECDHE-RSA-CHACHA20-POLY1305:\"\t\t\\\n                \"ECDHE-RSA-AES128-GCM-SHA256:\"\t\t\\\n                \"ECDHE-RSA-AES256-GCM-SHA384\"\n\n#define dhe_aead_ciphers\t\t\t\t\t\t\\\n                \"DHE-RSA-CHACHA20-POLY1305:\"\t\t\\\n                \"DHE-RSA-AES128-GCM-SHA256:\"\t\t\\\n                \"DHE-RSA-AES256-GCM-SHA384\"\n\n#define ecdhe_ecdsa_cbc_ciphers\t\t\t\t\t\t\\\n                \"ECDHE-ECDSA-AES128-SHA:\"\t\t\\\n                \"ECDHE-ECDSA-AES256-SHA\"\n\n#define ecdhe_rsa_cbc_ciphers\t\t\t\t\t\t\\\n                \"ECDHE-RSA-AES128-SHA:\"\t\t\t\\\n                \"ECDHE-RSA-AES256-SHA\"\n\n#define dhe_cbc_ciphers\t\t\t\t\t\t\t\\\n                \"DHE-RSA-AES128-SHA:\"\t\t\t\\\n                \"DHE-RSA-AES256-SHA:\"\t\t\t\\\n                \"DHE-DES-CBC3-SHA\"\n\n#define non_pfs_aes\t\t\t\t\t\t\t\\\n                \"AES128-GCM-SHA256:\"\t\t\t\\\n                \"AES256-GCM-SHA384:\"\t\t\t\\\n                \"AES128-SHA:\"\t\t\t\t\\\n                \"AES256-SHA\"\n\n#define server_cipher_list\t\t\t\t\t\t\\\n                top_ciphers \":\"\t\t\t\t\\\n                ecdhe_rsa_cbc_ciphers \":\"\t\t\\\n                non_pfs_aes\n\n#define client_cipher_list\t\t\t\t\t\t\\\n                top_ciphers \":\"\t\t\t\t\\\n                dhe_aead_ciphers \":\"\t\t\t\\\n                ecdhe_ecdsa_cbc_ciphers \":\"\t\t\\\n                ecdhe_rsa_cbc_ciphers \":\"\t\t\\\n                dhe_cbc_ciphers \":\"\t\t\t\\\n                non_pfs_aes \":\"\t\t\t\t\\\n                \"DES-CBC3-SHA\"\n\nstruct ssl_context {\n};\n\nstatic int ssl_err_code;\n\nconst char *ssl_last_error_string(char *buf, int len)\n{\n    const char *file, *data;\n    int line, flags;\n\n    if (ssl_err_code == SSL_ERROR_SSL) {\n        int used;\n\n        ssl_err_code = ERR_peek_error_line_data(&file, &line, &data, &flags);\n        ERR_error_string_n(ssl_err_code, buf, len);\n\n        used = strlen(buf);\n\n        snprintf(buf + used, len - used, \":%s:%d:%s\", file, line, (flags & ERR_TXT_STRING) ? data : \"\");\n    } else {\n        ERR_error_string_n(ssl_err_code, buf, len);\n    }\n\n    return buf;\n}\n\nstruct ssl_context *ssl_context_new(bool server)\n{\n    const void *m;\n    SSL_CTX *c;\n\n#if OPENSSL_VERSION_NUMBER < 0x10100000L\n    static bool _init = false;\n\n    if (!_init) {\n        SSL_load_error_strings();\n        SSL_library_init();\n        _init = true;\n    }\n# ifndef TLS_server_method\n#  define TLS_server_method SSLv23_server_method\n# endif\n# ifndef TLS_client_method\n#  define TLS_client_method SSLv23_client_method\n# endif\n#endif\n\n    if (server) {\n        m = TLS_server_method();\n    } else\n        m = TLS_client_method();\n\n    c = SSL_CTX_new((void *) m);\n    if (!c)\n        return NULL;\n\n    SSL_CTX_set_verify(c, SSL_VERIFY_NONE, NULL);\n\n    SSL_CTX_set_options(c, SSL_OP_NO_COMPRESSION | SSL_OP_SINGLE_ECDH_USE | SSL_OP_CIPHER_SERVER_PREFERENCE);\n#if defined(SSL_CTX_set_ecdh_auto) && OPENSSL_VERSION_NUMBER < 0x10100000L\n    SSL_CTX_set_ecdh_auto(c, 1);\n#elif OPENSSL_VERSION_NUMBER >= 0x10101000L\n    SSL_CTX_set_ciphersuites(c, tls13_ciphersuites);\n#endif\n    if (server) {\n#if OPENSSL_VERSION_NUMBER >= 0x10100000L\n        SSL_CTX_set_min_proto_version(c, TLS1_2_VERSION);\n#else\n        SSL_CTX_set_options(c, SSL_OP_NO_SSLv3 | SSL_OP_NO_TLSv1 | SSL_OP_NO_TLSv1_1);\n#endif\n        SSL_CTX_set_cipher_list(c, server_cipher_list);\n    } else {\n        SSL_CTX_set_cipher_list(c, client_cipher_list);\n    }\n    SSL_CTX_set_quiet_shutdown(c, 1);\n\n    return (void *)c;\n}\n\nvoid ssl_context_free(struct ssl_context *ctx)\n{\n    if (!ctx)\n        return;\n\n    SSL_CTX_free((void *)ctx);\n}\n\nint ssl_load_ca_crt_file(struct ssl_context *ctx, const char *file)\n{\n    int ret;\n\n    ret = SSL_CTX_load_verify_locations((void *)ctx, file, NULL);\n    if (ret < 1)\n        return -1;\n\n    return 0;\n}\n\nint ssl_load_crt_file(struct ssl_context *ctx, const char *file)\n{\n    int ret;\n\n    ret = SSL_CTX_use_certificate_chain_file((void *)ctx, file);\n    if (ret < 1)\n        ret = SSL_CTX_use_certificate_file((void *)ctx, file, SSL_FILETYPE_ASN1);\n\n    if (ret < 1)\n        return -1;\n\n    return 0;\n}\n\nint ssl_load_key_file(struct ssl_context *ctx, const char *file)\n{\n    int ret;\n\n    ret = SSL_CTX_use_PrivateKey_file((void *)ctx, file, SSL_FILETYPE_PEM);\n    if (ret < 1)\n        ret = SSL_CTX_use_PrivateKey_file((void *)ctx, file, SSL_FILETYPE_ASN1);\n\n    if (ret < 1)\n        return -1;\n\n    return 0;\n}\n\nint ssl_set_ciphers(struct ssl_context *ctx, const char *ciphers)\n{\n    int ret = SSL_CTX_set_cipher_list((void *) ctx, ciphers);\n\n    if (ret == 0)\n        return -1;\n\n    return 0;\n}\n\nint ssl_set_require_validation(struct ssl_context *ctx, bool require)\n{\n    int mode = SSL_VERIFY_PEER;\n\n    if (!require)\n        mode = SSL_VERIFY_NONE;\n\n    SSL_CTX_set_verify((void *)ctx, mode, NULL);\n\n    return 0;\n}\n\nvoid *ssl_session_new(struct ssl_context *ctx, int sock)\n{\n    void *ssl = SSL_new((void *)ctx);\n\n    if (!ssl)\n        return NULL;\n\n    SSL_set_fd(ssl, sock);\n\n    SSL_set_mode(ssl, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER | SSL_MODE_ENABLE_PARTIAL_WRITE);\n\n    return ssl;\n}\n\nvoid ssl_session_free(void *ssl)\n{\n    if (!ssl)\n        return;\n\n    SSL_shutdown(ssl);\n    SSL_free(ssl);\n}\n\nvoid ssl_set_server_name(void *ssl, const char *name)\n{\n    SSL_set_tlsext_host_name(ssl, name);\n}\n\nstatic void ssl_verify_cert(void *ssl, void (*on_verify_error)(int error, const char *str, void *arg), void *arg)\n{\n    int res;\n\n    res = SSL_get_verify_result(ssl);\n    if (res != X509_V_OK && on_verify_error)\n        on_verify_error(res, X509_verify_cert_error_string(res), arg);\n}\n\n#ifdef WOLFSSL_SSL_H\nstatic bool handle_wolfssl_asn_error(void *ssl, int r,\n                void (*on_verify_error)(int error, const char *str, void *arg), void *arg)\n{\n    switch (r) {\n    case ASN_PARSE_E:\n    case ASN_VERSION_E:\n    case ASN_GETINT_E:\n    case ASN_RSA_KEY_E:\n    case ASN_OBJECT_ID_E:\n    case ASN_TAG_NULL_E:\n    case ASN_EXPECT_0_E:\n    case ASN_BITSTR_E:\n    case ASN_UNKNOWN_OID_E:\n    case ASN_DATE_SZ_E:\n    case ASN_BEFORE_DATE_E:\n    case ASN_AFTER_DATE_E:\n    case ASN_SIG_OID_E:\n    case ASN_TIME_E:\n    case ASN_INPUT_E:\n    case ASN_SIG_CONFIRM_E:\n    case ASN_SIG_HASH_E:\n    case ASN_SIG_KEY_E:\n    case ASN_DH_KEY_E:\n    case ASN_NTRU_KEY_E:\n    case ASN_CRIT_EXT_E:\n    case ASN_ALT_NAME_E:\n    case ASN_NO_PEM_HEADER:\n    case ASN_ECC_KEY_E:\n    case ASN_NO_SIGNER_E:\n    case ASN_CRL_CONFIRM_E:\n    case ASN_CRL_NO_SIGNER_E:\n    case ASN_OCSP_CONFIRM_E:\n    case ASN_NAME_INVALID_E:\n    case ASN_NO_SKID:\n    case ASN_NO_AKID:\n    case ASN_NO_KEYUSAGE:\n    case ASN_COUNTRY_SIZE_E:\n    case ASN_PATHLEN_SIZE_E:\n    case ASN_PATHLEN_INV_E:\n#if LIBWOLFSSL_VERSION_HEX >= 0x04004000\n    case ASN_SELF_SIGNED_E:\n#endif\n        if (on_verify_error)\n            on_verify_error(r, wc_GetErrorString(r), arg);\n        return true;\n    }\n\n    return false;\n}\n#endif\n\nint ssl_connect(void *ssl, bool server,\n        void (*on_verify_error)(int error, const char *str, void *arg), void *arg)\n{\n    int r;\n\n    ERR_clear_error();\n\n    ssl_err_code = 0;\n\n    if (server)\n        r = SSL_accept(ssl);\n    else\n        r = SSL_connect(ssl);\n\n    if (r == 1) {\n        ssl_verify_cert(ssl, on_verify_error, arg);\n        return SSL_OK;\n    }\n\n    r = SSL_get_error(ssl, r);\n    if (r == SSL_ERROR_WANT_READ || r == SSL_ERROR_WANT_WRITE)\n        return SSL_PENDING;\n\n#ifdef WOLFSSL_SSL_H\n    if (handle_wolfssl_asn_error(ssl, r, on_verify_error, arg))\n        return SSL_OK;\n#endif\n\n    ssl_err_code = r;\n\n    return SSL_ERROR;\n}\n\nint ssl_write(void *ssl, const void *buf, int len)\n{\n    int ret;\n\n    ERR_clear_error();\n\n    ssl_err_code = 0;\n\n    ret = SSL_write(ssl, buf, len);\n\n    if (ret < 0) {\n        ret = SSL_get_error(ssl, ret);\n        if (ret == SSL_ERROR_WANT_WRITE)\n            return SSL_PENDING;\n\n        ssl_err_code = ret;\n        return SSL_ERROR;\n    }\n\n    return ret;\n}\n\nint ssl_read(void *ssl, void *buf, int len)\n{\n    int ret;\n\n    ERR_clear_error();\n\n    ssl_err_code = 0;\n\n    ret = SSL_read(ssl, buf, len);\n    if (ret < 0) {\n        ret = SSL_get_error(ssl, ret);\n        if (ret == SSL_ERROR_WANT_READ)\n            return SSL_PENDING;\n\n        ssl_err_code = ret;\n        return SSL_ERROR;\n    }\n\n    return ret;\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/ssl/ssl.h",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2021 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#ifndef __SSL_H\n#define __SSL_H\n\n#include <stdbool.h>\n\nenum {\n    SSL_OK = 0,\n    SSL_ERROR = -1,\n    SSL_PENDING = -2\n};\n\nstruct ssl_context;\n\nconst char *ssl_last_error_string(char *buf, int len);\n\nstruct ssl_context *ssl_context_new(bool server);\nvoid ssl_context_free(struct ssl_context *ctx);\n\nvoid *ssl_session_new(struct ssl_context *ctx, int sock);\nvoid ssl_session_free(void *ssl);\n\nint ssl_load_ca_crt_file(struct ssl_context *ctx, const char *file);\nint ssl_load_crt_file(struct ssl_context *ctx, const char *file);\nint ssl_load_key_file(struct ssl_context *ctx, const char *file);\n\nint ssl_set_ciphers(struct ssl_context *ctx, const char *ciphers);\n\nint ssl_set_require_validation(struct ssl_context *ctx, bool require);\n\nvoid ssl_set_server_name(void *ssl, const char *name);\n\nint ssl_read(void *ssl, void *buf, int len);\nint ssl_write(void *ssl, const void *buf, int len);\n\nint ssl_connect(void *ssl, bool server,\n        void (*on_verify_error)(int error, const char *str, void *arg), void *arg);\n\n#endif\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/utils.c",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2019 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#include <sys/stat.h>\n#include <mntent.h>\n#include <stdio.h>\n#include <stdint.h>\n#include <string.h>\n#include <ctype.h>\n#include <unistd.h>\n\n#include \"utils.h\"\n\nint find_login(char *buf, int len)\n{\n    FILE *fp = popen(\"which login\", \"r\");\n    if (fp) {\n        if (fgets(buf, len, fp))\n            buf[strlen(buf) - 1] = 0;\n        pclose(fp);\n\n        if (!buf[0])\n            return -1;\n        return 0;\n    }\n\n    return -1;\n}\n\nbool valid_id(const char *id)\n{\n    while (*id) {\n        if (!isalnum(*id) && *id != '-' && *id != '_')\n            return false;\n        id++;\n    }\n\n    return true;\n}\n\n/* reference from https://tools.ietf.org/html/rfc4648#section-4 */\nint b64_encode(const void *src, size_t srclen, void *dest, size_t destsize)\n{\n    char *Base64 = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\";\n    const uint8_t *input = src;\n    char *output = dest;\n\n    while (srclen > 0) {\n        int skip = 1;\n        int i0 = input[0] >> 2;\n        int i1 = (input[0] & 0x3) << 4;\n        int i2 = 64;\n        int i3 = 64;\n\n        if (destsize < 5)\n            return -1;\n\n        if (srclen > 1) {\n            skip++;\n            i1 += input[1] >> 4;\n            i2 = (input[1] & 0xF) << 2;\n\n            if (srclen > 2) {\n                i2 += input[2] >> 6;\n                i3 = input[2] & 0x3F;\n                skip++;\n            }\n        }\n\n        *output++ = Base64[i0];\n        *output++ = Base64[i1];\n        *output++ = Base64[i2];\n        *output++ = Base64[i3];\n\n        input += skip;\n        srclen -= skip;\n        destsize -= 4;\n    }\n\n    *output++ = 0;\n    return output - (char *) dest - 1;\n}\n\nconst char *format_size(size_t size)\n{\n    static char str[64];\n\n    if (size < 1024)\n        sprintf(str, \"%zu B\", size);\n    else if (size < 1024 * 1024)\n        sprintf(str, \"%.2f KB\", size / 1024.0);\n    else\n        sprintf(str, \"%.2f MB\", size / 1024.0 / 1024.0);\n\n    return str;\n}\n\n/*\n * Given any file (or directory), find the mount table entry for its\n * filesystem.\n */\nstruct mntent *find_mount_point(const char *name)\n{\n    struct mntent *ment;\n    dev_t devno_of_name;\n    struct stat s;\n    FILE *mtab_fp;\n\n    if (stat(name, &s) < 0)\n        return NULL;\n\n    devno_of_name = s.st_dev;\n\n    if (S_ISBLK(s.st_mode) || S_ISCHR(s.st_mode))\n        return NULL;\n\n    mtab_fp = setmntent(\"/etc/mtab\", \"r\");\n    if (!mtab_fp)\n        return NULL;\n\n    while ((ment = getmntent(mtab_fp))) {\n        if (!strcmp(ment->mnt_fsname, \"rootfs\"))\n            continue;\n\n        /* string match */\n        if (!strcmp(name, ment->mnt_dir))\n            break;\n\n        /* match the directory's mount point. */\n        if (stat(ment->mnt_dir, &s) == 0 && s.st_dev == devno_of_name)\n            break;\n    }\n    endmntent(mtab_fp);\n\n    return ment;\n}\n\n/*\n *  getcwd_pid does not append a null byte to buf.  It will (silently) truncate the contents (to\n *  a length of bufsiz characters), in case the buffer is too small to hold all of the contents.\n */\nssize_t getcwd_by_pid(pid_t pid, char *buf, size_t bufsiz)\n{\n    char link[128];\n\n    sprintf(link, \"/proc/%d/cwd\", pid);\n\n    return readlink(link, buf, bufsiz);\n}\n\nbool getuid_by_pid(pid_t pid, uid_t *uid)\n{\n    char status[128];\n    char line[128];\n    int i = 9;\n    FILE *fp;\n\n    sprintf(status, \"/proc/%d/status\", pid);\n\n    fp = fopen(status, \"r\");\n    if (!fp)\n        return false;\n\n    while (i-- > 0) {\n        if (!fgets(line, sizeof(line), fp)) {\n            fclose(fp);\n            return false;\n        }\n    }\n\n    fclose(fp);\n    \n    sscanf(line, \"Uid:\\t%u\", uid);\n    \n    return true;\n}\n\nbool getgid_by_pid(pid_t pid, gid_t *gid)\n{\n    char status[128];\n    char line[128];\n    int i = 10;\n    FILE *fp;\n\n    sprintf(status, \"/proc/%d/status\", pid);\n\n    fp = fopen(status, \"r\");\n    if (!fp)\n        return false;\n\n    while (i-- > 0) {\n        if (!fgets(line, sizeof(line), fp)) {\n            fclose(fp);\n            return false;\n        }\n    }\n\n    fclose(fp);\n    \n    sscanf(line, \"Gid:\\t%u\", gid);\n    \n    return true;\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/src/utils.h",
    "content": "/*\n * MIT License\n *\n * Copyright (c) 2019 Jianhui Zhao <zhaojh329@gmail.com>\n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to deal\n * in the Software without restriction, including without limitation the rights\n * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell\n * copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in all\n * copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,\n * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE\n * SOFTWARE.\n */\n\n#ifndef _UTILS_H\n#define _UTILS_H\n\n#include <stdbool.h>\n#include <sys/types.h>\n\nint find_login(char *buf, int len);\n\nbool valid_id(const char *id);\n\nint b64_encode(const void *src, size_t srclen, void *dest, size_t destsize);\n\nconst char *format_size(size_t size);\n\nstruct mntent *find_mount_point(const char *name);\n\nssize_t getcwd_by_pid(pid_t pid, char *buf, size_t bufsiz);\n\nbool getuid_by_pid(pid_t pid, uid_t *uid);\n\nbool getgid_by_pid(pid_t pid, gid_t *gid);\n\n#endif\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/tools/sendcmd.sh",
    "content": "#!/bin/sh\n\n# Your server's host and port\nhost=localhost\nport=5913\n\n# Your linux device's username and password\nusername=\"test\"\npassword=\"test\"\n\n# Default wait 30s.\n# If you don't care about the results, you can set it to 0, that is, don't wait\n#wait=0\n\ndevid=\"test\"\ncmd=\"echo\"\nparams='[\"Hello, Rtty\"]'\n\n\nresp=$(curl \"http://$host:$port/cmd/$devid?wait=$wait\" -d \"{\\\"cmd\\\":\\\"$cmd\\\", \\\"params\\\": $params, \\\"username\\\": \\\"$username\\\", \\\"password\\\": \\\"$password\\\"}\" 2>/dev/null)\n\n[ \"$wait\" = \"0\" ] && exit 0\n\nerr=$(echo \"$resp\" | jq -r '.err')\n\nif [ \"$err\" != \"null\" ];\nthen\n    msg=$(echo \"$resp\" | jq -r '.msg')\n    echo \"err: $err\"\n    echo \"msg: $msg\"\nelse\n    code=$(echo \"$resp\" | jq -r '.code')\n    stdout=$(echo \"$resp\" | jq -r '.stdout' | base64 -d)\n    stderr=$(echo \"$resp\" | jq -r '.stderr' | base64 -d)\n\n    echo \"code: $code\"\n    echo \"stdout: $stdout\"\n    echo \"stderr: $stderr\"\nfi\n"
  },
  {
    "path": "relevance/WiFiPortal/dcc2-wiwiz/src/tools/test.sh",
    "content": "#!/bin/sh\n\nport=5912\nhost=\"localhost\"\n\ncnt=$1\n\n[ -n \"$cnt\" ] || cnt=100\n\ni=0\n\ngen_mac() {\n\tm1=$(date +%s%N | md5sum | head -c 2)\n\tm2=$(date +%s%N | md5sum | head -c 2)\n\tm3=$(date +%s%N | md5sum | head -c 2)\n\tm4=$(date +%s%N | md5sum | head -c 2)\n\tm5=$(date +%s%N | md5sum | head -c 2)\n\tm6=$(date +%s%N | md5sum | head -c 2)\n\n\techo \"$m1$m2$m3$m4$m5$m6\" | tr '[:lower:]' '[:upper:]'\t\n}\n\nwhile [ $i -ne $cnt ]\ndo\n    rtty -I \"$(gen_mac)\" -d \"$(date +%s%N | md5sum | head -c 20)\" -h $host -p $port -s &\n    i=$((i+1))\ndone\n"
  },
  {
    "path": "relevance/WiFiPortal/eqos-master-wiwiz/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=eqos\nPKG_RELEASE:=1\nLUCI_DIR:=/usr/lib/lua/luci\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/eqos\n  SUBMENU:=Portal\n  SECTION:=net\n  CATEGORY:=Wiwiz/PinPinWiFi\n  DEPENDS:=+tc +kmod-sched-core +kmod-ifb\n  TITLE:=Easy QoS(Support speed limit based on IP address)\n  PKGARCH:=all\nendef\n\n\ndefine Package/luci-app-eqos\n  SUBMENU:=Portal\n  SECTION:=luci\n  CATEGORY:=Wiwiz/PinPinWiFi\n  TITLE:=EQOS - LuCI interface\n  PKGARCH:=all\n  DEPENDS:=+luci-base +eqos\nendef\n\ndefine Package/luci-app-eqos/description\n\tLuci interface for the eqos.\nendef\n\ndefine Package/luci-i18n-eqos-zh_Hans\n\tSECTION:=luci\n\tCATEGORY:=Wiwiz/PinPinWiFi\n\tTITLE:=luci-app-eqos - zh_Hans translation\n\tHIDDEN:=1\n\tDEPENDS:=luci-app-eqos\n\tDEFAULT:=LUCI_LANG_zh_Hans\n    PKGARCH:=all\nendef\n\ndefine Build/Prepare\nendef\n\ndefine Build/Configure\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/eqos/install\n\t$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d $(1)/etc/hotplug.d/iface\n\t$(INSTALL_BIN) ./files/eqos.sh $(1)/usr/sbin/eqos\n\t$(INSTALL_BIN) ./files/eqos.init $(1)/etc/init.d/eqos\n\t$(INSTALL_BIN) ./files/eqos.hotplug $(1)/etc/hotplug.d/iface/10-eqos\n\t$(INSTALL_CONF) ./files/eqos.config $(1)/etc/config/eqos\nendef\n\ndefine Package/luci-app-eqos/install\n\t$(INSTALL_DIR) $(1)$(LUCI_DIR)/controller $(1)$(LUCI_DIR)/model/cbi $(1)$(LUCI_DIR)/i18n  $(1)/etc/uci-defaults\n\t$(INSTALL_DATA) ./files/eqos-controller.lua $(1)$(LUCI_DIR)/controller/eqos.lua\n\t$(INSTALL_DATA) ./files/eqos-cbi.lua $(1)$(LUCI_DIR)/model/cbi/eqos.lua\n\t$(INSTALL_BIN) ./files/uci-defaults-eqos $(1)/etc/uci-defaults/luci-eqos\nendef\n\ndefine Package/luci-app-eqos/postinst\n#!/bin/sh\nwhich uci > /dev/null || exit 0\nuci -q get ucitrack.@eqos[0] > /dev/null || {\n  uci add ucitrack eqos > /dev/null\n  uci set ucitrack.@eqos[0].init=eqos\n  uci commit\n}\nendef\n\ndefine Package/luci-app-eqos/postrm\n#!/bin/sh\nwhich uci > /dev/null || exit 0\nuci -q get ucitrack.@eqos[0] > /dev/null && {\n  uci delete ucitrack.@eqos[0]\n  uci commit\n}\nendef\n\ndefine Package/luci-i18n-eqos-zh_Hans/install\n\t$(INSTALL_DIR) $(1)$(LUCI_DIR)/i18n\n\tpo2lmo ./files/po/zh_Hans/eqos.po $(1)$(LUCI_DIR)/i18n/eqos.zh-cn.lmo\nendef\n\n$(eval $(call BuildPackage,eqos))\n$(eval $(call BuildPackage,luci-app-eqos))\n$(eval $(call BuildPackage,luci-i18n-eqos-zh_Hans))"
  },
  {
    "path": "relevance/WiFiPortal/eqos-master-wiwiz/files/eqos-cbi.lua",
    "content": "local ipc = require \"luci.ip\"\nlocal ut = require \"luci.util\"\n\nlocal m = Map(\"eqos\", translate(\"Quality of Service\"))\n\nlocal s = m:section(TypedSection, \"eqos\", \"\")\ns.anonymous = true\n\nlocal e = s:option(Flag, \"enabled\", translate(\"Enable\"))\ne.rmempty = false\n\nlocal dl = s:option(Value, \"download\", translate(\"Download speed (Mbit/s)\"), translate(\"Total bandwidth\"))\ndl.datatype = \"and(uinteger,min(1))\"\n\nlocal ul = s:option(Value, \"upload\", translate(\"Upload speed (Mbit/s)\"), translate(\"Total bandwidth\"))\nul.datatype = \"and(uinteger,min(1))\"\n\ns = m:section(TypedSection, \"device\", translate(\"Speed limit based on IP address\"))\ns.template = \"cbi/tblsection\"\ns.anonymous = true\ns.addremove = true\ns.sortable  = true\n\nlocal ip = s:option(Value, \"ip\", translate(\"IP address\"))\n\nlocal lan = ut.exec(\"uci get wiwiz.portal.lan 2>/dev/null\")\nif lan == \"\" then\n\tlan = \"br-lan\"\nend\n\nipc.neighbors({family = 4, dev = lan}, function(n)\n\tif n.mac and n.dest then\n\t\tip:value(n.dest:string(), \"%s (%s)\" %{ n.dest:string(), n.mac })\n\tend\nend)\n\ndl = s:option(Value, \"download\", translate(\"Download speed (Kbit/s)\"))\ndl.datatype = \"and(uinteger,min(1))\"\n\nul = s:option(Value, \"upload\", translate(\"Upload speed (Kbit/s)\"))\nul.datatype = \"and(uinteger,min(1))\"\n\ncomment = s:option(Value, \"comment\", translate(\"Comment\"))\n\nreturn m\n"
  },
  {
    "path": "relevance/WiFiPortal/eqos-master-wiwiz/files/eqos-controller.lua",
    "content": "module(\"luci.controller.eqos\", package.seeall)\n\nfunction index()\n\tif not nixio.fs.access(\"/etc/config/eqos\") then\n\t\treturn\n\tend\n\t\n\tlocal page\n\n\tpage = entry({\"admin\", \"network\", \"eqos\"}, cbi(\"eqos\"), \"EQoS\")\n\tpage.dependent = true\nend\n"
  },
  {
    "path": "relevance/WiFiPortal/eqos-master-wiwiz/files/eqos.config",
    "content": "# The bandwidth unit is Mbit/s\nconfig eqos\n\toption enabled      0\n\toption download     99999\n\toption upload       99999\n\n# Limiting the bandwidth of a single Device\n#config device\n#\toption ip       \"192.168.1.100\"\n#\toption download 10\n#\toption upload   5\n#\toption comment  \"test\"\n"
  },
  {
    "path": "relevance/WiFiPortal/eqos-master-wiwiz/files/eqos.hotplug",
    "content": "#!/bin/sh\n[ \"$ACTION\" = \"ifup\" ] || exit 0\n[ \"$INTERFACE\" = \"lan\" ] || exit 0\n\n/etc/init.d/eqos start\n"
  },
  {
    "path": "relevance/WiFiPortal/eqos-master-wiwiz/files/eqos.init",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2006 OpenWrt.org\n\nSTART=250\n\nparse_device() {\n        local cfg=\"$1\" ip download upload\n\n        config_get ip \"$cfg\" ip\n        config_get download \"$cfg\" download\n        config_get upload \"$cfg\" upload\n\n        eqos add $ip $download $upload\n}\n\neqos_start() {\n        local cfg=\"$1\" enabled download upload\n\n        config_get_bool enabled \"$cfg\" enabled 0\n        [ $enabled -eq 0 ] && return 0\n\n        config_get download \"$cfg\" download\n        config_get upload \"$cfg\" upload\n\n        eqos start $download $upload\n\n        config_foreach parse_device device\n}\n\nstart() {\n        start2 &\n\n#--- starts: Deleted by Wiwiz\n#       eqos stop\n#\n#       config_load eqos\n#       config_foreach eqos_start eqos\n#---- ends\n}\n\n#--- starts: added by Wiwiz\nstart2() {\n        sleep 30\n        eqos stop\n\n        config_load eqos\n        config_foreach eqos_start eqos\n}\n#--- ends\n\nstop() {\n        eqos stop\n}"
  },
  {
    "path": "relevance/WiFiPortal/eqos-master-wiwiz/files/eqos.sh",
    "content": "#!/bin/sh\n\ndev=$(uci get wiwiz.portal.lan 2>/dev/null)\nif [ \"$dev\" == \"\" ]; then\n\tdev=br-lan\nfi\n\nstop_qos() {\n\ttc qdisc del dev $dev root 2>/dev/null\n\ttc qdisc del dev $dev ingress 2>/dev/null\n\ttc qdisc del dev ${dev}-ifb root 2>/dev/null\n\tip link del dev ${dev}-ifb 2>/dev/null\n}\n\nstart_qos() {\n\tlocal dl=$1\n\tlocal up=$2\n\t\n\ttc qdisc add dev $dev root handle 1: htb\n\ttc class add dev $dev parent 1: classid 1:1 htb rate ${dl}mbit\n\t\n\tip link add dev ${dev}-ifb name ${dev}-ifb type ifb\n\tip link set dev ${dev}-ifb up\n\t\n\ttc qdisc add dev ${dev}-ifb root handle 1: htb\n\ttc class add dev ${dev}-ifb parent 1: classid 1:1 htb rate ${up}mbit\n\t\n\ttc qdisc add dev $dev ingress\n\ttc filter add dev $dev parent ffff: protocol ip u32 match u32 0 0 flowid 1:1 action mirred egress redirect dev ${dev}-ifb\n}\n\ncase \"$1\" in\n\t\"stop\")\n\t\tstop_qos\n\t;;\n\t\"start\")\n\t\tstop_qos\n\t\tstart_qos $2 $3\n\t;;\n\t\"add\")\n\t\tip=\"$2\"\n\t\tdl=\"$3\"\n\t\tup=\"$4\"\n\t\t\n\t\tcnt=$(tc class show dev $dev | wc -l)\n\t\t\n\t\ttc class add dev $dev parent 1:1 classid 1:1$cnt htb rate ${dl}kbit ceil ${dl}kbit\n\t\ttc filter add dev $dev parent 1:0 protocol ip u32 match ip dst $ip flowid 1:1$cnt\n\t\t\n\t\ttc class add dev ${dev}-ifb parent 1:1 classid 1:1$cnt htb rate ${up}kbit ceil ${up}kbit\n\t\ttc filter add dev ${dev}-ifb parent 1:0 protocol ip u32 match ip src $ip flowid 1:1$cnt\n\t;;\n\t*)\n\t\techo \"Usage: $0 <command> [options]\"\n\t\techo \"Commands:\"\n\t\techo \"  start dl_rate up_rate       #Total bandwidth (Mbit/s)\"\n\t\techo \"  stop\"\n\t\techo \"  add ip dl_rate up_rate      #Limiting the bandwidth of a single IP (Mbit/s)\"\n\t\techo \"Example:\"\n\t\techo \"  $0 start 30 20              # Total bandwidth: down 30Mbit/s up 20Mbit/s\"\n\t\techo \"  $0 add 192.168.22.12 10 2   # down 10Kbit/s  up 2Kbit/s\"\n\t;;\nesac"
  },
  {
    "path": "relevance/WiFiPortal/eqos-master-wiwiz/files/po/zh_Hans/eqos.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: LuCi Chinese Translation\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"Language: zh_Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Pootle 2.0.6\\n\"\n\nmsgid \"Comment\"\nmsgstr \"注解\"\n\nmsgid \"Download speed (Mbit/s)\"\nmsgstr \"下载速度 (Mbit/s)\"\n\nmsgid \"Enable\"\nmsgstr \"开启\"\n\nmsgid \"QoS\"\nmsgstr \"QoS\"\n\nmsgid \"Quality of Service\"\nmsgstr \"QOS服务\"\n\nmsgid \"Upload speed (Mbit/s)\"\nmsgstr \"上传速度 (Mbit/s)\"\n\nmsgid \"Speed limit based on IP address\"\nmsgstr \"IP限速\"\n\nmsgid \"Total bandwidth\"\nmsgstr \"总带宽\"\n\nmsgid \"Download speed (Kbit/s)\"\nmsgstr \"下载速度 (Kbit/s)\"\n\nmsgid \"Upload speed (Kbit/s)\"\nmsgstr \"上传速度 (Kbit/s)\""
  },
  {
    "path": "relevance/WiFiPortal/eqos-master-wiwiz/files/uci-defaults-eqos",
    "content": "#!/bin/sh\n\nuci -q get ucitrack.@eqos[0] > /dev/null || {\n  uci add ucitrack eqos > /dev/null\n  uci set ucitrack.@eqos[0].init=eqos\n  uci commit\n}\n\nexit 0\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/Config.in",
    "content": "config NO_PORTAL\n\tbool \"Add NoPortal network and firewall configuration\"\n\tdefault n\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/Makefile",
    "content": "#\n# Copyright (C) 2006,2013 OpenWrt.org\n#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=wifidog-wiwiz\nPKG_VERSION:=20260214\nPKG_RELEASE=$(PKG_SOURCE_VERSION)\n\nPKG_FIXUP:=autoreconf\nPKG_INSTALL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/wifidog-wiwiz\n  SUBMENU:=Portal\n  SECTION:=net\n  CATEGORY:=Wiwiz/PinPinWiFi\n  DEPENDS:=+iptables-mod-extra +iptables-mod-ipopt +iptables-mod-nat-extra +libpthread +curl +jsonfilter\n  TITLE:=wifidog-wiwiz\n  URL:=http://www.wiwiz.com\n  MENU:=1\nendef\n\ndefine Package/wifidog-wiwiz/description\n\tWifidog modified by Wiwiz.com\nendef\n\ndefine Package/wifidog-wiwiz/conffiles\n/etc/wifidog.conf\n/etc/config/wiwiz\nendef\n\ndefine Package/wifidog-wiwiz/config\n\tsource \"$(SOURCE)/Config.in\"\nendef\n\ndefine Package/wifidog-wiwiz/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/init.d/wifidog $(1)/usr/bin/wifidog-init\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/wifidog $(1)/usr/bin/\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/wdctl $(1)/usr/bin/\n\t$(INSTALL_DIR) $(1)/usr/lib\n\t$(CP) $(PKG_INSTALL_DIR)/usr/lib/libhttpd.so* $(1)/usr/lib/\n\t$(INSTALL_DIR) $(1)/etc\n\t$(INSTALL_DATA) $(PKG_BUILD_DIR)/wifidog.conf $(1)/etc/\n\t$(INSTALL_DATA) $(PKG_BUILD_DIR)/wifidog-msg.html $(1)/etc/\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_BIN) ./files/wifidog.init $(1)/etc/init.d/wifidog\n\n\t$(INSTALL_DIR) $(1)/usr/local\n\t$(INSTALL_DIR) $(1)/usr/local/hsbuilder\n\t$(INSTALL_BIN) ./files/usr/local/hsbuilder/hsbuilder.sh $(1)/usr/local/hsbuilder/hsbuilder.sh\n\t$(INSTALL_BIN) ./files/usr/local/hsbuilder/hsbuilder_helper.sh $(1)/usr/local/hsbuilder/hsbuilder_helper.sh\n\t$(INSTALL_BIN) ./files/usr/local/hsbuilder/setspeed.sh $(1)/usr/local/hsbuilder/setspeed.sh\n\t$(INSTALL_BIN) ./files/usr/local/hsbuilder/kickmac.sh $(1)/usr/local/hsbuilder/kickmac.sh\n\t$(INSTALL_BIN) ./files/usr/local/hsbuilder/wiwizroaming.sh $(1)/usr/local/hsbuilder/wiwizroaming.sh\n\t$(INSTALL_BIN) ./files/usr/local/hsbuilder/wiwizroaming.sh.old $(1)/usr/local/hsbuilder/wiwizroaming.sh.old\n\t$(INSTALL_BIN) ./files/usr/local/hsbuilder/getmodel.sh $(1)/usr/local/hsbuilder/getmodel.sh\n\t$(INSTALL_BIN) ./files/usr/local/hsbuilder/auth.sh $(1)/usr/local/hsbuilder/auth.sh\n\t$(INSTALL_BIN) ./files/usr/local/hsbuilder/checkauth.sh $(1)/usr/local/hsbuilder/checkauth.sh\n\t$(INSTALL_BIN) ./files/usr/local/hsbuilder/dhcp_portal.sh $(1)/usr/local/hsbuilder/dhcp_portal.sh\n\t$(INSTALL_BIN) ./files/usr/local/hsbuilder/handle_ipv6.sh $(1)/usr/local/hsbuilder/handle_ipv6.sh\n\t$(INSTALL_DATA) ./files/usr/local/hsbuilder/hsbuilder.conf $(1)/usr/local/hsbuilder/hsbuilder.conf\n\t$(INSTALL_DATA) ./files/usr/local/hsbuilder/ver $(1)/usr/local/hsbuilder/ver\n\n\t$(INSTALL_DIR) $(1)/usr/lib\n\t$(INSTALL_DIR) $(1)/usr/lib/lua\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci/controller\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci/model\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci/model/cbi\n\t$(INSTALL_DATA) ./files/usr/lib/lua/luci/controller/wiwiz.lua $(1)/usr/lib/lua/luci/controller/wiwiz.lua\n\t$(INSTALL_DATA) ./files/usr/lib/lua/luci/model/cbi/wiwiz.lua $(1)/usr/lib/lua/luci/model/cbi/wiwiz.lua\n\n\t$(INSTALL_DIR) $(1)/etc/config\n\t$(INSTALL_DATA) ./files/etc/config/wiwiz $(1)/etc/config/wiwiz\n\n\t$(INSTALL_DIR) $(1)/www\n\t$(INSTALL_DIR) $(1)/www/cgi-bin\n\t$(INSTALL_BIN) ./files/www/cgi-bin/mymac $(1)/www/cgi-bin/mymac\n\t$(INSTALL_BIN) ./files/www/cgi-bin/myip $(1)/www/cgi-bin/myip\n\t$(INSTALL_BIN) ./files/www/cgi-bin/showdevinfo $(1)/www/cgi-bin/showdevinfo\n\t$(INSTALL_BIN) ./files/www/cgi-bin/kickmac $(1)/www/cgi-bin/kickmac\n\t$(INSTALL_BIN) ./files/www/cgi-bin/cpi $(1)/www/cgi-bin/cpi\n\t$(INSTALL_BIN) ./files/www/cgi-bin/wiwiz404 $(1)/www/cgi-bin/wiwiz404\n\t$(INSTALL_DATA) ./files/www/index.html.wiwiz $(1)/www/index.html.wiwiz\n\t$(INSTALL_DATA) ./files/www/mymac.htm $(1)/www/mymac.htm\n\t$(INSTALL_DIR) $(1)/etc/uci-defaults\n\t$(INSTALL_BIN) ./files/etc/uci-defaults/199-noredir $(1)/etc/uci-defaults/199-noredir\n\n\t$(INSTALL_DIR) $(1)/usr/lib/lua/luci/i18n\n\tpo2lmo ./po/zh_Hans/wifidog-wiwiz.po $(1)/usr/lib/lua/luci/i18n/wifidog-wiwiz.zh-cn.lmo\t\nifeq ($(CONFIG_NO_PORTAL),y)\n\t$(INSTALL_BIN) ./files/etc/uci-defaults/299-noportal $(1)/etc/uci-defaults/299-noportal\nendif\nendef\n\ndefine Package/wifidog-wiwiz/postinst\n#!/bin/sh\ncp -f $${IPKG_INSTROOT}/www/index.html $${IPKG_INSTROOT}/www/index.html.org\ncp -f $${IPKG_INSTROOT}/www/index.html.wiwiz $${IPKG_INSTROOT}/www/index.html\nrm -f $${IPKG_INSTROOT}/www/index.html.wiwiz\nendef\n\n$(eval $(call BuildPackage,wifidog-wiwiz))\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/etc/config/wiwiz",
    "content": "config wiwiz portal\n        option enabled 0\n        option hotspotid ''\n        option username 'pinpinwifi'\n        option server 'cp.wiwiz.com:80'\n        option lan 'br-lan'\n\toption disable_ipv6 '1'\n        option dhcp_portal '1'\n        option ver ''"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/etc/uci-defaults/199-noredir",
    "content": "#!/bin/sh\n\nuci set uhttpd.main.redirect_https='0'\nuci set uhttpd.main.error_page='/cgi-bin/wiwiz404'\n#uci set uhttpd.main.max_requests='1'\n#uci set uhttpd.main.http_keepalive='0'\nuci commit uhttpd\n/etc/init.d/uhttpd restart"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/etc/uci-defaults/299-noportal",
    "content": "#!/bin/sh\nNPT=$(uci show network | grep 'network.npt=interface' 2>/dev/null)\nif [ \"$NPT\" != \"\" ]; then\n    exit\nfi\n\ncat >>/etc/config/network <<EOF\n\nconfig interface 'npt'\n        option proto 'static'\n        option ipaddr '192.168.66.1'\n        option netmask '255.255.255.0'\n        option type 'bridge'\nEOF\n\ncat >>/etc/config/dhcp <<EOF\n\nconfig dhcp 'npt'\n        option start '100'\n        option leasetime '12h'\n        option limit '150'\n        option interface 'npt'\nEOF\n\ncat >>/etc/config/firewall <<EOF\n\nconfig zone\n        option output 'ACCEPT'\n        option name 'npt'\n        option network 'npt'\n        option input 'ACCEPT'\n        option forward 'ACCEPT'\n\nconfig forwarding\n        option dest 'wan'\n        option src 'npt'\n\nconfig rule\n        option target 'ACCEPT'\n        option dest_port '67-68'\n        option name 'NoPortal DHCP'\n        option proto 'udp'\n        option src 'npt'\n\nconfig rule\n        option enabled '1'\n        option target 'ACCEPT'\n        option proto 'tcp udp'\n        option dest_port '53'\n        option name 'NoPortal DNS'\n        option src 'npt'\n\nEOF\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/usr/lib/lua/luci/controller/wiwiz.lua",
    "content": "module(\"luci.controller.wiwiz\", package.seeall)\n\nfunction index()\n\tentry({\"admin\", \"wiwiz_menu\"}, firstchild(), \"Wiwiz\", 60).dependent=true\n\tentry({\"admin\", \"wiwiz_menu\", \"wiwiz\"}, cbi(\"wiwiz\"), translate(\"Portal\"), 51).dependent = true\nend\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/usr/lib/lua/luci/model/cbi/wiwiz.lua",
    "content": "require \"luci.util\"\n\nm = Map(\"wiwiz\", translate(\"Wiwiz\"),\n    translate(\"Portal\")) \n\nportal = m:section(TypedSection, \"wiwiz\", \"\")\n\nenabled = portal:option(Flag, \"enabled\", translate(\"Enable\"), translate(\"network service will restart after enabling portal, please reconnect to the router if necessary\"));\nenabled.optional = false \nenabled.rmempty = false\n\nhotspotid = portal:option(Value, \"hotspotid\", \"Hotspot ID\", translate(\"case sensitivity, no spaces\"));\nhotspotid.optional = false \nhotspotid.rmempty = false\n\n--username = portal:option(Value, \"username\", \"User Name\", \"Wiwiz平台用户请填写Wiwiz平台用户名；拼拼WiFi平台用户填写pinpinwifi\"); \n--username.optional = false \n--username.rmempty = false\n\nserver = portal:option(Value, \"server\", translate(\"Server Address and Port\")); \nserver.optional = false \nserver.rmempty = false\nserver.default = \"cp.wiwiz.com:80\"\n\nlan = portal:option(Value, \"lan\", translate(\"Network interface\")); \nlan.optional = false \nlan.rmempty = false\nlan.addremove = false\nlan.default = \"br-lan\"\n\ndhcp_portal = portal:option(Flag, \"dhcp_portal\", translate(\"Enable DHCP Captive Portal Identification\"));\ndhcp_portal.optional = false \ndhcp_portal.rmempty = false\n\nver = portal:option(DummyValue, \"ver\", translate(\"Plugin Version\"), translate(\"<a href='http://www.wiwiz.com/pinpinwifi/wiwiz-ipk.htm' target='_blank'>Readme</a>\"));\n\nm.on_after_commit = function(self)\n    luci.util.exec(\"(sleep 3; /usr/local/hsbuilder/dhcp_portal.sh; /usr/local/hsbuilder/handle_ipv6.sh) &\")\nend\n\nreturn m\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/usr/local/hsbuilder/auth.sh",
    "content": "#!/bin/sh\nLOGFILE='/tmp/hsbuilder.log'\n\nAS_HOSTNAME_X=$(uci get wiwiz.portal.server 2>/dev/null)\nHID=$(uci get wiwiz.portal.hotspotid 2>/dev/null)\nGWIF=$(uci get wiwiz.portal.lan 2>/dev/null)\nGWIFMAC=$(ifconfig $GWIF | grep HWaddr | awk '{print $5}' 2>/dev/null)\n\nURL=\"http://$AS_HOSTNAME_X/as/s/auth/?stage=batch&gw_id=$HID&gw_mac=$GWIFMAC\"\n\ncurl -m 30 -o /tmp/wiwiz_auth_data -d \"data=$(cat /tmp/wiwiz_client_data)\" \"$URL\" 1>/dev/null 2>/dev/null\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/usr/local/hsbuilder/checkauth.sh",
    "content": "#!/bin/sh\n# Wiwiz HotSpot Builder Utility\n# Copyright wiwiz.com. All rights reserved.\n\nMAC=\"$1\"\n\n\nif [ \"$MAC\" == \"\" ]; then\n    echo 'usage : checkauth.sh <MAC>'\n    exit 1\nfi\n\n#IS_AUTHED=$(wdctl status 2>/dev/null | grep 'IP:' | grep 'MAC:' | grep -i \"$MAC\")\nIS_AUTHED=$(wdctl status 2>/dev/null | grep -i \"$MAC\")\nif [ \"$IS_AUTHED\" != \"\" ]; then\n    echo 'true'\nelse\n    echo 'false'\nfi\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/usr/local/hsbuilder/dhcp_portal.sh",
    "content": "#!/bin/sh\n# Wiwiz HotSpot Builder Utility\n# Copyright wiwiz.com. All rights reserved.\n\nENABLED=$(uci get wiwiz.portal.enabled 2>/dev/null)\nDP=$(uci get wiwiz.portal.dhcp_portal 2>/dev/null)\nHOST=$(uci get wiwiz.portal.server 2>/dev/null | cut -d ':' -f 1)\nDEV=$(uci get wiwiz.portal.lan 2>/dev/null)\n#NETIF=$(uci show network | grep \"$DEV\" | grep -v '@' | cut -d '=' -f 1 | cut -d '.' -f 2 2>/dev/null)\nNETIF=$(ubus call network.interface dump | jsonfilter -e \"@.interface[@.device='$DEV']['interface']\")\n\nif [ \"$NETIF\" == \"\" ]; then\n    NETIF=\"lan\"\nfi\n\ndof=$(uci get dhcp.$NETIF.dhcp_option_force 2>/dev/null)\nif [ \"$dof\" != \"\" ]; then\n    for op in $dof; do\n        is_114=$(echo \"$op\" | grep -F \"114,\")\n        if [ ! -z \"$is_114\" ]; then\n            uci del_list dhcp.$NETIF.dhcp_option_force=\"$op\"\n        fi\n    done\nfi\n\nif [ \"$ENABLED\" == \"1\" -a \"$DP\" == \"1\" ]; then\n    lan_ip=$(ifconfig $(uci get wiwiz.portal.lan 2>/dev/null) | grep 'inet addr' | awk '{ print $2}' | awk -F: '{print $2}' 2>/dev/null)\n    url=\"https://$HOST/as/cpi.jsp?ip=$lan_ip\"\n    op114=\"114,$url\"\n    uci add_list dhcp.$NETIF.dhcp_option_force=\"$op114\"\nfi\n\nuci commit dhcp\nsleep 2\n/etc/init.d/dnsmasq restart"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/usr/local/hsbuilder/getmodel.sh",
    "content": "#!/bin/sh\n. /usr/share/libubox/jshn.sh\n\njson_load \"$(ubus call system board)\" 2>/dev/null\njson_get_var var1 \"model\" 2>/dev/null\necho \"$var1\""
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/usr/local/hsbuilder/handle_ipv6.sh",
    "content": "#!/bin/sh\n# Wiwiz HotSpot Builder Utility\n# Copyright wiwiz.com. All rights reserved.\n\nLOGFILE='/tmp/hsbuilder.log'\nENABLED=$(uci get wiwiz.portal.enabled 2>/dev/null)\nDISABLE_IPV6=$(uci get wiwiz.portal.disable_ipv6 2>/dev/null)\n\nlog1() {\n\techo \"$1\" >>$LOGFILE\n\tlogger -t 'hsbuilder' \"$1\"\n}\n\nif [ \"$ENABLED\" == \"1\" -a \"$DISABLE_IPV6\" == \"1\" ]; then\n    uci del network.lan.ip6assign\n    uci set network.lan.delegate='0'\n    uci del network.wan.ip6assign\n    uci set network.wan.delegate='0'\n\n\n    [ \"$(uci get network.lan.ipv6 2>/dev/null)\" != \"0\" ] && {\n        uci set network.lan.ipv6='0'\n    }\n    [ \"$(uci get network.wan6.reqaddress 2>/dev/null)\" != \"none\" ] && {\n        uci set network.wan6.reqaddress='none'\n    }\n    [ \"$(uci get network.wan6.reqprefix 2>/dev/null)\" != \"no\" ] && {\n        uci set network.wan6.reqprefix='no'\n    }\n\n    uci commit network\n    /etc/init.d/network restart\n\n    log1 \"IPv6 disabled\"\nfi"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/usr/local/hsbuilder/hsbuilder.conf",
    "content": "TIMEOUT=10"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/usr/local/hsbuilder/hsbuilder.sh",
    "content": "#!/bin/sh\n# Wiwiz HotSpot Builder Utility\n# Copyright wiwiz.com. All rights reserved.\n\nMY_VERSION=\"$(cat /usr/local/hsbuilder/ver 2>/dev/null)\"  #for Wiwiz-opensource\n\n#SRV_SAVE='/usr/local/hsbuilder/srv'\nENVINFO='wiwiz-opensource'\nCONFPATH='/usr/local/hsbuilder/hsbuilder.conf'\nADDRLIST='/tmp/hsbuilder_addrlist.txt'\nTRUSTMAC='/tmp/hsbuilder_trustmac'\nDOMAINNAME='/tmp/hsbuilder_domainname.txt'\nTIMEOUT=\"10\"\nIPLIST='/tmp/hsbuilder_iplist.txt'\nBLOCKPORT='/tmp/hsbuilder_blockport.txt'\nUSERBLOCKPORT='/tmp/hsbuilder_userblockport.txt'\nWD_CONF_TMP='/tmp/hsbuilder_wdconf.tmp'\nLOGFILE='/tmp/hsbuilder.log'\n#AD_STATUS='/tmp/hsbuilder_ad.txt'\n#AD_STATUS_V='0'\n#AD_CONFIG='/tmp/hsbuilder_ad_conf.tmp'\nEOF_FLAG='###END_OF_FILE###'\nWDCTL=\"wdctl\"\nNSLOOKUPOK=\"1\"\nSORT=\"1\"\nwhich sort 1>/dev/null 2>/dev/null\nif [ $? != 0 ]; then\n\tSORT=\"0\"\t#no sort\nelse\n\tSORT=\"1\"\nfi\n\n#MY_FULLPATH=$(dirname -- $(readlink -f -- \"$0\"))/hsbuilder.sh\nMY_FULLPATH=\"/usr/local/hsbuilder/hsbuilder.sh\"\nMSG_FILE=\"/usr/local/hsbuilder/msgfile.htm\"\nNORESOLVE=\"false\"\n\nENVINFO_SENT='0'\n\nlog2() {\n\t\techo \"$1\" >&2\n\t\techo \"$1\" >>$LOGFILE\n\t\tlogger -t 'hsbuilder' \"$1\"\n}\n\nlog1() {\n\techo \"$1\" >>$LOGFILE\n\tlogger -t 'hsbuilder' \"$1\"\n}\n\ndoConfig() {\n\tSURL=\"$1\"\n\tNR=\"$2\"\n\t\n\t#get config data\n\t#wget -O - -T 10 \"$SURL\" > $ADDRLIST 2>/dev/null\n\tcurl -m 10 -o \"$ADDRLIST\" \"$SURL\" 2>/dev/null\n\t\n\tif [ \"`tail -n 1 $ADDRLIST`\" = $EOF_FLAG ]; then\n\t\tcat $ADDRLIST | grep -v \"$EOF_FLAG\" | while read LINE; do\n\t\t\t#echo LINE=$LINE\n\t\t\tACTION=$(echo $LINE | cut -d \" \" -f 1)\n\t\t\tACDATA=$(echo $LINE | cut -d \" \" -f 2)\n\n\t\t\tif [ \"$ACTION\" = \"TM\" ]; then\n\t\t\t\techo \"$ACDATA\" >$TRUSTMAC\n\t\t\telif [ \"$ACTION\" = \"TO\" ]; then\n\t\t\t\tTIMEOUT=\"$ACDATA\"\n\t\t\t    echo \"$(cat $CONFPATH | grep -v TIMEOUT)\" > \"$CONFPATH\"\n\t\t\t    echo \"TIMEOUT=$TIMEOUT\" >> \"$CONFPATH\"\t\t\t\t\n\t\t\telif [ \"$ACTION\" = \"UW\" ]; then\n\t\t\t\tmakeFwRule \"$ACDATA\" \"FirewallRule allow to\" \"$NR\" \"U\" \"$IPLIST\"\n\t\t\telif [ \"$ACTION\" = \"UB\" ]; then\n\t\t\t\tmakeFwRule \"$ACDATA\" \"FirewallRule block to\" \"$NR\" \"U\" \"$IPLIST\"\n\t\t\telif [ \"$ACTION\" = \"SW\" ]; then\n\t\t\t\tmakeFwRule \"$ACDATA\" \"FirewallRule allow to\" \"$NR\" \"S\" \"$IPLIST\"\n\t\t\telif [ \"$ACTION\" = \"SB\" ]; then\n\t\t\t\tmakeFwRule \"$ACDATA\" \"FirewallRule block to\" \"$NR\" \"S\" \"$IPLIST\"\n\t\t\telif [ \"$ACTION\" = \"BP\" ]; then\n\t\t\t\tPORTTYPE=$(echo $ACDATA | cut -d \":\" -f 1)\n\t\t\t\tPORTNUM=$(echo $ACDATA | cut -d \":\" -f 2)\t\t\t\t\n\t\t\t\techo \"FirewallRule block $PORTTYPE port $PORTNUM\" >>\"$BLOCKPORT\"\n\t\t\telif [ \"$ACTION\" = \"UP\" ]; then\n\t\t\t\tPORTTYPE=$(echo $ACDATA | cut -d \":\" -f 1)\n\t\t\t\tPORTNUM=$(echo $ACDATA | cut -d \":\" -f 2)\t\t\t\t\n\t\t\t\techo \"FirewallRule block $PORTTYPE port $PORTNUM\" >>\"$USERBLOCKPORT\"\n\t\t\t#elif [ \"$ACTION\" = \"AD\" ]; then\n\t\t\t#\techo $ACDATA >\"$AD_STATUS\"\n\t\t\tfi\n\t\tdone\n\telse\n#\t\techo \"Data Download Failed.\"\n\t\treturn 1\t  \n\tfi\n\t\n\treturn 0\n}\n\nmakeFwRule() {\n#\tSURL=\"$1\"\n\tDATA=\"$1\"\n\tPRX=\"$2\"\n\tNR=\"$3\"\n\tCOMMENT='#'\"$4\"\n\tOUTPUT=\"$5\"\n\t\n\t#get address\n    ADDRTYPE=$(echo $DATA | cut -d \":\" -f 1)\n    ADDR=$(echo $DATA | cut -d \":\" -f 2)\n    \n    # if it is a domain name\n    if [ \"$ADDRTYPE\" = \"DN\" ]; then\n    \tDOMAIN=$ADDR\n    \tif [ \"$COMMENT\" = '#U' ]; then\n    \t\techo \"U:DN:$DOMAIN\" >>$DOMAINNAME\n    \tfi\n    \t\n    \t#if [ \"$NR\" != \"true\" ]; then\n    \tif [ \"$NR\" = \"true\" -a \"$COMMENT\" != '#U' ]; then\n    \t\tNOTHINGTODO=1\n    \telse\n    \t\t#which nslookup 1>/dev/null 2>/dev/null\n\t        #if [ $? != 0 ]; then\n\t        if [ \"$NSLOOKUPOK\" != \"1\" ]; then\n\t            ADDR=`ping -c 1 $ADDR 2>>$LOGFILE | grep PING | awk '{print $3}' | tr -d \"(\" | tr -d \")\"`\n\t            if [ \"$ADDR\" != \"\" ]; then\n\t            \tif [ \"$COMMENT\" = '#U' ]; then\n\t            \t\tGRP=$(grep \"$PRX $ADDR\" $OUTPUT)\n\t            \t\tif [ \"$GRP\"='' ]; then\n\t            \t\t\techo \"$PRX $ADDR    $COMMENT:DN:$DOMAIN\" >>$OUTPUT\n\t            \t\tfi\n\t            \telse\n\t            \t\techo \"$PRX $ADDR    $COMMENT\" >>$OUTPUT\n\t            \tfi\n\t\t\t\tfi\n\t        else\n\t            NSLKP_RST=\"/tmp/hsbuilder_nslookup.txt\"\n\t            nslookup $ADDR | tail -n +5 | grep Address | cut -d \":\" -f 2 | cut -d \" \" -f 2 > $NSLKP_RST\n\t            \n\t            cat $NSLKP_RST | while read LINE2; do\n\t            \tif [ \"$COMMENT\" = '#U' ]; then\n\t            \t\tGRP=$(grep \"$PRX $LINE2\" $OUTPUT)\n\t            \t\tif [ \"$GRP\"='' ]; then\n\t                \t\techo \"$PRX $LINE2    $COMMENT:DN:$DOMAIN\" >>$OUTPUT\n\t                \tfi\n\t                else\n\t                \techo \"$PRX $LINE2    $COMMENT\" >>$OUTPUT\n\t                fi\n\t            done\n\t            \n\t            rm -f $NSLKP_RST\n\t        fi\n\t    fi\n    # if it is an IP\n    else\n        if [ \"$ADDR\" != \"\" ]; then\n        \tif [ \"$COMMENT\" = '#U' ]; then\n\t\t\t\tGRP=$(grep \"$PRX $ADDR\" $OUTPUT)\n\t            if [ \"$GRP\"='' ]; then\n        \t\t\techo \"$PRX $ADDR    $COMMENT\" >>$OUTPUT\n        \t\tfi\n        \telse\n        \t\techo \"$PRX $ADDR    $COMMENT\" >>$OUTPUT\n        \tfi\n        fi\n    fi\n}\n\n\nif [ \"$1\" = \"-help\" ]; then\n\techo \"Usage:\"\n\techo \"hsbuilder [-conf XXX] [-mypath XXX]\"\n\techo \"To show usage: hsbuilder -help\"\n\texit 0\nfi\n\nif [ \"$1\" = \"-conf\" ]; then\n\tif [ \"$2\" = \"\" ]; then\n\t    CONFPATH=$CONFPATH\n\telse\n\t    CONFPATH=\"$2\"\n\tfi\n\tshift 2\nfi\n\nif [ \"$1\" = \"-mypath\" ]; then\n\tif [ \"$2\" = \"\" ]; then\n\t    MY_FULLPATH=$MY_FULLPATH\n\telse\n\t    MY_FULLPATH=\"$2\"\n\tfi\n\tshift 2\nfi\n\nif [ \"$1\" = \"-msgfile\" ]; then\n\tif [ \"$2\" = \"\" ]; then\n\t    MSG_FILE=$MSG_FILE\n\telse\n\t    MSG_FILE=\"$2\"\n\tfi\n\tshift 2\nfi\n\nif [ \"$1\" = \"-nomsgfile\" ]; then\n\tMSG_FILE=\"\"\n\tshift 1\nfi\n\nif [ \"$1\" = \"-noresolve\" ]; then\n\tNORESOLVE=\"true\"\n\tshift 1\nfi\n\nif [ \"$1\" = \"-envinfo\" ]; then\n\tif [ \"$2\" = \"\" ]; then\n\t    ENVINFO=\"$ENVINFO\"\n\telse\n\t    ENVINFO=\"$2\"\n\tfi\n\tshift 2\nfi\n\n# Starts\nwhile :\ndo\n\tif [ -e \"$ADDRLIST\" ]; then\n\t\tlog2 \"Another process is running.\"\n\t\t#exit 5\n\t\tcontinue\n\tfi\n\n\tif [ ! -e \"$CONFPATH\" ]; then\n\t\tlog2 \"Configuration File Not Exist.\"\n\t\t#exit 1\n\t\tcontinue\n\tfi\n\n\t#read conf file\n\techo \"Reading Configuration ...\"\n\t\n\tENABLED=$(uci get wiwiz.portal.enabled 2>/dev/null)\n\tGW_ID=$(uci get wiwiz.portal.hotspotid 2>/dev/null)\n\tUSERNAME=$(uci get wiwiz.portal.username 2>/dev/null)\n\tGWIF=$(uci get wiwiz.portal.lan 2>/dev/null)\n\tDISABLE_IPV6=$(uci get wiwiz.portal.disable_ipv6 2>/dev/null)\n\t\n\tif [ \"$ENABLED\" != \"1\" ]; then\n\t\t_p=$(ps | grep wifidog | grep -v grep 2>/dev/null)\n\t\tif [ \"$_p\" != \"\" ]; then\n\t\t\tlog1 \"wiwiz disabled, wifidog shutting down \"\n\t\t\twdctl stop\n\t\t\t\n\t\t\t#uci get network.lan.ipv6 1>/dev/null 2>/dev/null && (uci del network.lan.ipv6 && uci commit)\n\t\tfi\n\t\tsleep 15\n\t\tcontinue\n\t# else\n\t# \tif [ \"$DISABLE_IPV6\" = \"1\" ]; then\n\t# \t\tuci del network.lan.ip6assign\n\t# \t\tuci set network.lan.delegate='0'\n\t# \t\tuci del network.wan.ip6assign\n\t# \t\tuci set network.wan.delegate='0'\n\t# \t\tuci commit network\n\n\t# \t\t[ \"$(uci get network.lan.ipv6 2>/dev/null)\" != \"0\" ] && {\n\t# \t\t\tuci set network.lan.ipv6='0' && uci commit network\n\t# \t\t}\n\t# \t\t[ \"$(uci get network.wan6.reqaddress 2>/dev/null)\" != \"none\" ] && {\n\t# \t\t\tuci set network.wan6.reqaddress='none' && uci commit network\n\t# \t\t}\n\t# \t\t[ \"$(uci get network.wan6.reqprefix 2>/dev/null)\" != \"no\" ] && {\n\t# \t\t\tuci set network.wan6.reqprefix='no' && uci commit network\n\t# \t\t}\n\t# \tfi\n\tfi\n\t\n\tif [ \"$GWIF\" = \"\" ]; then\n\t\tGWIF=\"br-lan\"\n\tfi\n\tGWIFMAC=$(ifconfig $GWIF | grep HWaddr | awk '{print $5}' 2>/dev/null)\n\n\tAS_HOSTNAME=$(uci get wiwiz.portal.server 2>/dev/null)\n\t#AS_HTTPPORT=`cat $CONFPATH | grep -v \"^#\" | grep AS_HTTPPORT | cut -d = -f 2`\n\tWIFIDOG_CONFPATH=/etc\n\n\techo \"Downloading data and setting up, please wait...\"\n\n\t_WIFIDOG_CONFFILE=$WIFIDOG_CONFPATH/wifidog.conf\n\tmkdir -p $WIFIDOG_CONFPATH 2>/dev/null\n\n\trm -f $DOMAINNAME\n\trm -f $IPLIST\n\trm -f $BLOCKPORT\n\trm -f $USERBLOCKPORT\n\ttouch $IPLIST\n\ttouch $BLOCKPORT\n\ttouch $USERBLOCKPORT\n\ttouch $DOMAINNAME\n\ttouch $IPLIST.lasttime\n\tlog1 \"hsbuilder.sh $MY_VERSION: $(date \"+%Y-%m-%d %H:%M:%S\")\"\n\n\tAS_HOSTNAME_X=$AS_HOSTNAME\n\tif [ \"$AS_HOSTNAME_X\" = \"\" ]; then\n\t\tlog2 \"Server is not reachable.\"\n\t\t#exit 4\n\t\tcontinue\n\tfi\n\n\twhich nslookup 1>/dev/null 2>/dev/null\n\tif [ $? != 0 ]; then\n\t\tNSLOOKUPOK=\"0\"\n\telse\n\t\tNSLOOKUPOK=\"1\"\n\tfi\n\n\tdoConfig \"http://$AS_HOSTNAME_X/as/s/readconf2/?m=all&gw_id=$GW_ID&username=$USERNAME&envinfo=$ENVINFO&ver=$MY_VERSION\" \"$NORESOLVE\"\n\tif [ $? != \"0\" ]; then\n\t\trm -f $ADDRLIST\n\t\trm -f $IPLIST\n\t\trm -f $BLOCKPORT\n\t\trm -f $USERBLOCKPORT\n\t\trm -f $DOMAINNAME\n\t\tlog2 \"Configuration Data Download and Setup Failed.\"\n\t\t#exit 2\n\t\tsleep 2\n\t\tcontinue\n\tfi\n\n\n\tif [ \"$SORT\" = \"1\" ]; then\n\t\tgrep '#S' $IPLIST.lasttime >> $IPLIST\n\t\tif [ \"$(uniq $DOMAINNAME)\" != \"\" ]; then\n\t\t\tgrep -f $DOMAINNAME $IPLIST.lasttime >> $IPLIST\n\t\tfi\n\t\tcat $IPLIST | sort | uniq > $IPLIST.2\n\telse\n\t\tgrep '#S' $IPLIST.lasttime > $IPLIST.3\n\t\tif [ \"$(uniq $DOMAINNAME)\" != \"\" ]; then\n\t\t\tgrep -f $DOMAINNAME $IPLIST.lasttime >> $IPLIST.3\n\t\tfi\n\n\t\tcat $IPLIST.3 >$IPLIST.2\n\t\t\t\n\t\tif [ \"$(uniq $IPLIST.3)\" != \"\" ]; then\n\t\t\tuniq $IPLIST | grep -v -f $IPLIST.3 >>$IPLIST.2\n\t\telse\n\t\t\tuniq $IPLIST >>$IPLIST.2\n\t\tfi\n\tfi\n\n\t#\n\tgrep '#' $IPLIST.2 > $IPLIST.3\n\tgrep -v '(null)' $IPLIST.3 > $IPLIST\n\trm -f $IPLIST.2 $IPLIST.3\n\n\t## compare IP lists\n\t#_iplist=$(cat $IPLIST)\n\t#_iplist_old=$(cat $IPLIST.lasttime)\n\t#if [ \"$_iplist\" != \"$_iplist_old\" ]; then\n\n\t_HOST=$(echo \"$AS_HOSTNAME_X\" | cut -d ':' -f 1)\n\t_PORT=$(echo \"$AS_HOSTNAME_X\" | cut -d ':' -f 2)\n\n\t#make /tmp/hsbuilder_wdconf.tmp\n\techo 'GatewayID '$GW_ID >                             $WD_CONF_TMP\n\t#echo 'ExternalInterface '$ETNIF >>                     $WD_CONF_TMP\n\techo 'GatewayInterface '$GWIF >>                     $WD_CONF_TMP\n\techo 'GatewayInterfaceMac '$GWIFMAC >>               $WD_CONF_TMP\n\n\tif [ \"$MSG_FILE\" != \"\" ]; then\n\t\techo \"HtmlMessageFile $MSG_FILE\" >>                 $WD_CONF_TMP\n\tfi\n\n\techo 'AuthServer {' >>                                 $WD_CONF_TMP\n\techo 'Hostname '$_HOST >>                 $WD_CONF_TMP\n\techo 'HTTPPort '$_PORT >>                 $WD_CONF_TMP\n\techo 'Path /as/s/' >>                         $WD_CONF_TMP\n\techo '}' >>                                         $WD_CONF_TMP\n\techo 'HTTPDMaxConn 253' >>                             $WD_CONF_TMP\n\n\t_TrustMac=$(cat \"$TRUSTMAC\" 2>/dev/null)\n\tif [ \"$_TrustMac\" != \"\" ]; then\n\t\techo \"TrustedMACList $_TrustMac\" >>                 $WD_CONF_TMP\t#!!!\n\tfi\n\n\tTIMEOUT=`cat $CONFPATH | grep -v \"^#\" | grep TIMEOUT | cut -d = -f 2`\n\techo \"ClientTimeout $TIMEOUT\" >>                       $WD_CONF_TMP\n\n\techo 'FirewallRuleSet global {' >>                     $WD_CONF_TMP\n\tcat $IPLIST >>                                      $WD_CONF_TMP       #!!!\n\tcat $USERBLOCKPORT >>                               $WD_CONF_TMP       #!!!\n\techo '}' >>                                         $WD_CONF_TMP\n\techo 'FirewallRuleSet validating-users {' >>         $WD_CONF_TMP\n\techo 'FirewallRule allow to 0.0.0.0/0' >>         $WD_CONF_TMP\n\techo '}' >>                                         $WD_CONF_TMP\n\techo 'FirewallRuleSet known-users {' >>             $WD_CONF_TMP\n\techo 'FirewallRule allow to 0.0.0.0/0' >>         $WD_CONF_TMP\n\techo '}' >>                                         $WD_CONF_TMP\n\techo 'FirewallRuleSet unknown-users {' >>             $WD_CONF_TMP\n\techo 'FirewallRule allow udp port 53' >>         $WD_CONF_TMP\n\techo 'FirewallRule allow tcp port 53' >>         $WD_CONF_TMP\n\techo 'FirewallRule allow udp port 67' >>         $WD_CONF_TMP\n\techo 'FirewallRule allow tcp port 67' >>         $WD_CONF_TMP\n\tcat $BLOCKPORT >>                               $WD_CONF_TMP       #!!!\n\techo '}' >>                                      $WD_CONF_TMP\n\n\t# compare wifidog.conf\n\ttouch $_WIFIDOG_CONFFILE\n\t_wifidog_conf=$(cat $_WIFIDOG_CONFFILE)\n\t_wifidog_conf_new=$(cat $WD_CONF_TMP)\n\n\tif [ \"$_wifidog_conf\" != \"$_wifidog_conf_new\" ]; then\n\t\t# generate new wifidog.conf\n\t\tcp -f $WD_CONF_TMP $_WIFIDOG_CONFFILE\n\t\t\n\t\t# reload wifidog.conf\n\t\t$WDCTL restart\n\n\t\t# back up iplist\n\t\tcp -f $IPLIST $IPLIST.lasttime\n\t\t\n\t\tlog1 \"Wifidog conf file changed.\"\n\tfi\n\n\tlog1 \"hsbuilder.sh: done.\"\n\n\tsleep 3\n\trm -f $WD_CONF_TMP\n\trm -f $ADDRLIST\n\trm -f $IPLIST\n\trm -f $BLOCKPORT\n\trm -f $USERBLOCKPORT\n\trm -f $DOMAINNAME\n\trm -f $TRUSTMAC 2>/dev/null\n\t\n\tsleep 20\n\t/usr/local/hsbuilder/hsbuilder_helper.sh -os openwrt\n\t\n\tif [ \"$ENVINFO_SENT\" = \"0\" ]; then\n\t\tMODEL=$(/usr/local/hsbuilder/getmodel.sh)\n\t\tDISTRIB_DSC=$(grep -E \"^DISTRIB_DESCRIPTION=\" /etc/openwrt_release | cut -d'=' -f2 | sed \"s/'//g\")\n\t\tcurl -m 5 --data-urlencode \"e2=$ENVINFO_$MY_VERSION|$MODEL|$DISTRIB_DSC\" \"http://$AS_HOSTNAME_X/as/s/readconf/?m=info&gw_id=$GW_ID&ver=$MY_VERSION\" 1>/dev/null 2>/dev/null || \\\n\t\tcurl -m 5 --data \"e2=$ENVINFO_$MY_VERSION|$MODEL|$DISTRIB_DSC\" \"http://$AS_HOSTNAME_X/as/s/readconf/?m=info&gw_id=$GW_ID&ver=$MY_VERSION\" 1>/dev/null 2>/dev/null \n\t\tENVINFO_SENT=1\n\tfi\n\t\n\tsleep 20\ndone"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/usr/local/hsbuilder/hsbuilder_helper.sh",
    "content": "#!/bin/sh\n# Wiwiz HotSpot Builder Utility\n# Copyright wiwiz.com. All rights reserved.\n\nLOAD_LIMIT=5.8\n\nDEST=\"\"\nOS=\"\"\nWIFIDOG_START=\"wifidog -s\"\nWIFIDOG_CONFPATH=/etc\n\nLOGFILE='/tmp/hsbuilder.log'\nTMPFILE='/tmp/hsbuilder_helper.tmp'\n#SRV_SAVE='/usr/local/hsbuilder/srv'\n\nLANDEV=$(uci get wiwiz.portal.lan 2>/dev/null)\nif [ \"$LANDEV\" == \"\" ]; then\n\tLANDEV=br-lan\nfi\n\nlog1() {\n\techo \"$1\" >>$LOGFILE\n\tlogger -t 'hshelper' \"$1\"\n}\n\ngetIP() {\n\t_mac=\"$1\"\n\n\ts=$(cat /proc/net/arp | grep -F \"$_mac\" | grep -F '0x2' | grep -F \"$LANDEV\"| awk '{print $1}')\n\techo \"$s\"\n}\n\npassAuthed() {\n\tHID=$(uci get wiwiz.portal.hotspotid 2>/dev/null)\n\tif [ \"$HID\" = \"\" ]; then\n\t\tlog1 \"Helper: passAuthed() unable to get hotspot_id.\"\n\t\treturn\n\tfi\n\t\n\tAS_HOSTNAME_X=$(uci get wiwiz.portal.server 2>/dev/null)\n\tif [ \"$AS_HOSTNAME_X\" = \"\" ]; then\n\t\tlog1 \"Helper: passAuthed() unable to get AS_HOSTNAME_X.\"\n\t\treturn\n\tfi\n\t\n\tURL=\"http://$AS_HOSTNAME_X/as/s/getauthed/?&gw_id=$HID\"\n\trm -f \"$TMPFILE\" 2>/dev/null\n\tcurl -m 10 -o \"$TMPFILE\" \"$URL\"\n\t\n\tcat \"$TMPFILE\" | while read LINE; do\n\t\ttoken=$(echo \"$LINE\" | cut -d ' ' -f 1)\n\t\tmac=$(echo \"$LINE\" | cut -d ' ' -f 2)\n\t\tip=$(getIP \"$mac\")\n\t\t\n#\t\tif [ \"$ip\" = \"\" ]; then\n#\t\t\tip=$(echo \"$LINE\" | cut -d ' ' -f 3)\n#\t\tfi\n\t\t\n\t\tif [ \"$ip\" != \"\" ]; then\n\t\t\twdctl auth \"$mac\" \"$ip\" \"$token\"\n\t\t\tlog1 \"Helper: passAuthed() auth $mac $ip $token.\"\n\t\tfi\n\tdone\n\t\n\trm -f \"$TMPFILE\" 2>/dev/null\t\n}\n\ngetRandom() {\n\tawk 'BEGIN {\n\t   # seed\n\t   srand()\n\t   for (i=1;i<=1;i++){\n\t     print int(1 + rand() * 10)\n\t   }\n\t}'\n}\n\nif [ \"$1\" = \"passauthed\" ]; then\n\tpassAuthed\n\texit 0\nfi\n\nif [ \"$1\" = \"-os\" ]; then\n\tif [ \"$2\" = \"openwrt\" ]; then\n#\t\tWIFIDOG_START=\"wifidog-init start\"\n\t\tWIFIDOG_START=\"wifidog -s\"\n\tfi\n\tOS=\"$2\"\n\t\n\tshift 2\nfi\n\nif [ \"$1\" = \"-dest\" ]; then\n\tif [ ! -d \"$2\" -a \"$2\" != \"\" ]; then\n\t\techo \"Error: $2 does not exist!\"\n\t\texit 1\n\telse\n\t\tDEST=\"$2\"\n\tfi\n\tshift 2\nfi\nlog1 \"hsbuilder_helper.sh started: $(date \"+%Y-%m-%d %H:%M:%S\")\"\n\nWDLOG=$(uci get wiwiz.portal.wdlog 2>/dev/null)\nif [ \"$WDLOG\" = \"1\" ]; then\n\tWIFIDOG_START=\"$WIFIDOG_START -d 9\"\nfi\n\n#RDM=$(getRandom)\n#if [ \"$RDM\" = \"5\" ]; then\n#\techo \"Helper: $(date) RDM is 5 !!!\" >>$LOGFILE\nLAN_IP=$(ifconfig \"$LANDEV\" | grep \"inet addr\" | awk '{ print $2}' | awk -F: '{print $2}')\n#_s=$(wget -O - -T 5 \"http://$LAN_IP:2060/wifidog\" 2>/dev/null)\n_s=$(curl -m 5 \"http://$LAN_IP:2060/wifidog\" 2>/dev/null)\nif [ \"$_s\" == \"\" ]; then\n\tkillall -9 wifidog 2>/dev/null\n\tsleep 3\n\t$WIFIDOG_START\n#\twdctl restart\n\tlog1 \"Helper: $(date \"+%Y-%m-%d %H:%M:%S\") Wifidog not respond. Restarted.\"\n#\t\tsleep 5\n#\t\tpassAuthed\n\texit 0\nfi\n#fi\n\nLOAD=$(cat /proc/loadavg | cut -d \" \" -f 1)\nMY_LOAD_LIMIT=$(uci get wiwiz.portal.load_limit 2>/dev/null)\nif [ \"$MY_LOAD_LIMIT\" != \"\" ]; then\n\tLOAD_LIMIT=\"$MY_LOAD_LIMIT\"\nfi\n\nIS_LOAD_HIGH=$(awk -v num1=\"$LOAD\" -v num2=\"$LOAD_LIMIT\" 'BEGIN{print(num1>num2)?\"true\":\"false\"}')\n\n#debug starts\n#echo \"LOAD=$LOAD\"\n#echo \"IS_LOAD_HIGH=$IS_LOAD_HIGH\"\n#debug ends\n\nif [ \"$IS_LOAD_HIGH\" = \"true\" ]; then\n\tkillall -9 wifidog 2>/dev/null\n\tsleep 3\n\t$WIFIDOG_START\n#\twdctl restart\n\tlog1 \"Helper: $(date \"+%Y-%m-%d %H:%M:%S\") Wifidog too busy! Restarted (wdctl). LOAD=$LOAD\"\n#\tsleep 5\n#\tpassAuthed\n\texit 0\nfi\n\n_p=$(ps | grep wifidog | grep -v grep 2>/dev/null)\nif [ \"$_p\" = \"\" ]; then\n\t#if [ $OS != \"linux\" ]; then\t\n\t#\tcp -f $DEST/usr/local/hsbuilder/wifidog.conf $WIFIDOG_CONFPATH/wifidog.conf\n\t#fi\n\t$WIFIDOG_START\n\tlog1 \"Helper: $(date \"+%Y-%m-%d %H:%M:%S\") Wifidog not running! Started.\"\n#\tsleep 5\n#\tpassAuthed\n\texit 0\nelse\n\t_wc=$(echo \"$_p\" | wc -l)\n\tif [ \"$_wc\" -gt 1 ]; then\n\t\t_pids=$(echo \"$_p\" | awk '{print $1}')\n\t\t\n\t\techo \"$_pids\" | while read LINE; do\n\t\t\tkill -9 \"$LINE\"\n\t\tdone\n\t\t\n\t\t$WIFIDOG_START\n\t\tlog1 \"Helper: $(date \"+%Y-%m-%d %H:%M:%S\") Wifidog not running! Restarted.\"\n#\t\tsleep 5\n#\t\tpassAuthed\n\t\texit 0\n\tfi\nfi\n\n_p=$(iptables -L -n | grep -i 'wifidog' 2>/dev/null)\nif [ \"$_p\" = \"\" ]; then\n\tkillall -9 wifidog 2>/dev/null\n\tsleep 3\n\t$WIFIDOG_START\n\tlog1 \"Helper: $(date \"+%Y-%m-%d %H:%M:%S\") Firewall not ok, wifidog restarted.\"\n\texit 0\t\nfi\n\n#wdctl status\n#CODE=\"$?\"\n#\n#if [ $CODE != \"0\" ]; then\n#\tif [ $OS != \"linux\" ]; then\t\n#\t\tcp -f $DEST/usr/local/hsbuilder/wifidog.conf $WIFIDOG_CONFPATH/wifidog.conf\n#\tfi\n#\t$WIFIDOG_START\n#\techo \"Helper: $(date) Wifidog not running! Started.\" >>$LOGFILE\n#\texit 0\n#fi\n\nlog1 \"hsbuilder_helper.sh: done.\"\n\nexit 0"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/usr/local/hsbuilder/kickmac.sh",
    "content": "#!/bin/sh\n# Wiwiz HotSpot Builder Utility\n# Copyright wiwiz.com. All rights reserved.\n\nCMD=$1\nMAC=$2\n\nLOCKFILE='/tmp/wiwiz_kickmac.lock'\nKICKMAC='/tmp/wiwiz_kickmac'\n\n\nif [ \"$CMD\" = \"\" -o $MAC = \"\"]; then\n\techo \"Usage:\"\n\techo \"kickmac.sh add <MAC>\"\n\techo \"kickmac.sh del <MAC>\"\n\texit 1\nfi\n\nGIVEUP=\"\"\nfor i in `seq 0 30`; do\n\tLOCK=$(cat $LOCKFILE 2>/dev/null)\n\tif [ \"$LOCK\" = \"1\" ]; then\n\t\techo \"Locked, waiting...\"\n\t\twdctl sleep 50000\n\telse\n\t\tbreak\n\tfi\n\tif [ \"$i\" = \"30\" ]; then\n\t\tGIVEUP=\"1\"\n\tfi\t\ndone\nif [ \"$GIVEUP\" = \"1\" ]; then\n\techo \"waited too long. giving up.\"\n\texit 9\nfi\n\necho '1'>$LOCKFILE\n\nif [ \"$CMD\" = \"add\" ]; then\n\tNOW=$(date +%s)\n    #deletes old data in KICKMAC (older than 1 min)\n\tcat $KICKMAC | while read LINE; do\n\t\tTIMESTAMP=$(echo \"$LINE\" | awk '{print $2}')\n\t\tTIMEDIFF=$(expr \"$NOW\" - \"$TIMESTAMP\")\n\t\tif [ \"$TIMEDIFF\" -gt 60 ]; then\n\t\t\tS=$(cat $KICKMAC | grep -v \"$TIMESTAMP\" 2>/dev/null)\n\t\t\techo \"$S\">$KICKMAC\n\t\tfi\n\tdone\n\n    echo \"$MAC $NOW\">>$KICKMAC    \nfi\n\nif [ \"$CMD\" = \"del\" ]; then\n    S=$(cat $KICKMAC | grep -v $MAC 2>/dev/null)\n    echo \"$S\">KICKMAC\nfi\n\nrm -f $LOCKFILE 2>/dev/null"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/usr/local/hsbuilder/setspeed.sh",
    "content": "#!/bin/sh\n# Wiwiz HotSpot Builder Utility\n# Copyright wiwiz.com. All rights reserved.\n\nCMD=$1\nMAC=$2\nIP=$3\n\nCOMMENT='auto generated by wiwiz'\nTMPFILE='/tmp/hsbuilder_setspeed.tmp'\nLOGFILE='/tmp/hsbuilder.log'\n\nLANDEV=$(uci get wiwiz.portal.lan 2>/dev/null)\nif [ \"$LANDEV\" == \"\" ]; then\n\tLANDEV=br-lan\nfi\n\n# getIP() {\n# \t_mac=\"$1\"\n# \ts=$(cat /proc/net/arp | grep -i -F \"$_mac\" | grep -F '0x2' | grep -F \"$LANDEV\" | awk '{print $1}' | head -n 1)\n# \techo \"$s\"\n# }\n\ngetIP2() {\n\t_mac=\"$1\"\n\ts=$(cat /proc/net/arp | grep -i -F \"$_mac\" | grep -F \"$LANDEV\" | awk '{print $1}' | head -n 1)\n\techo \"$s\"\n}\n\ngetUpDown() {\n\tHID=$(uci get wiwiz.portal.hotspotid 2>/dev/null)\n\tif [ \"$HID\" = \"\" ]; then\n\t\techo \"setspeed.sh: getUpDown() unable to get hotspot_id.\" >>$LOGFILE\n\t\treturn\n\tfi\n\t\n\tAS_HOSTNAME_X=$(uci get wiwiz.portal.server 2>/dev/null)\n\tif [ \"$AS_HOSTNAME_X\" = \"\" ]; then\n\t\techo \"setspeed.sh: getUpDown() unable to get AS_HOSTNAME_X.\" >>$LOGFILE\n\t\treturn\n\tfi\n\t\n\tURL=\"http://$AS_HOSTNAME_X/as/s/getspeed/?gw_id=$HID&mac=$MAC\"\n\trm -f \"$TMPFILE\" 2>/dev/null\n\tcurl -m 10 -o \"$TMPFILE\" \"$URL\"\n\tcat \"$TMPFILE\"\n\trm -f \"$TMPFILE\" 2>/dev/null\t\n}\n\nif [ \"$1\" = \"\" ]; then\n\techo \"Usage:\"\n\techo \"setspeed.sh clear\"\n\techo \"setspeed.sh set MAC IP\"\n\techo \"setspeed.sh unset MAC\"\n\texit 1\nfi\n\n#kicks non-match IP\ncat /proc/net/arp | grep -i -F \"$MAC\" | grep -v -F \"$IP\" | grep -F \"$LANDEV\" 2>/dev/null | awk '{print $1}' | while read LINE; do\n\twdctl reset \"$LINE\"\n\techo \"SetSpeed: $(date \"+%Y-%m-%d %H:%M:%S\") kicked non-match $LINE $MAC\" >>$LOGFILE\ndone\n\nGIVEUP=\"\"\nfor i in `seq 0 30`; do\n\tLOCK=$(cat /tmp/wiwiz_setspeed.lock 2>/dev/null)\n\tif [ \"$LOCK\" = \"1\" ]; then\n\t\techo \"Locked, waiting...\"\n\t\twdctl sleep 50000\n\telse\n\t\tbreak\n\tfi\n\tif [ \"$i\" = \"30\" ]; then\n\t\tGIVEUP=\"1\"\n\tfi\t\ndone\nif [ \"$GIVEUP\" = \"1\" ]; then\n\techo \"waited too long. giving up.\"\n\texit 9\nfi\n\necho '1'>/tmp/wiwiz_setspeed.lock\n\nif [ \"$1\" = \"clear\" ]; then\n\tcnt=$(uci show eqos 2>/dev/null | grep '=device' | wc -l)\n\tif [ \"$cnt\" = \"0\" ]; then\n\t\trm -f /tmp/wiwiz_setspeed.lock 2>/dev/null\n\t\texit 0;\n\tfi\n\tlet maxindex=$cnt-1\n\tI=0\n\tfor i in `seq 0 $maxindex`\n\tdo\n\t\t_comment=$(uci get eqos.@device[$I].comment 2>/dev/null)\n\t\tif [ \"$_comment\" = \"$COMMENT\" ]; then\n\t\t\tuci delete eqos.@device[$I]\n\t\t\tlet I=$I-1\n\t\tfi\n\t\tlet I=$I+1\n\tdone\n\tuci commit eqos\n\t/etc/init.d/eqos stop; /etc/init.d/eqos start\n\techo \"SetSpeed: $(date \"+%Y-%m-%d %H:%M:%S\") clear\" >>$LOGFILE\nfi\n\nif [ \"$1\" = \"set\" ]; then\n\tip=$IP\n\t\n\tif [ \"$ip\" = \"\" ]; then\n\t\trm -f /tmp/wiwiz_setspeed.lock 2>/dev/null\n\t\texit 2\n\tfi\n\t\n\tupdown=$(getUpDown)\n\t# updown=\"speed 3 2\"\n\tif [ \"$updown\" = \"\" ]; then\n\t\trm -f /tmp/wiwiz_setspeed.lock 2>/dev/null\n\t\texit 3\n\tfi\n\t\n\tif [ \"$(echo $updown | grep speed)\" = \"\" ]; then\n\t\trm -f /tmp/wiwiz_setspeed.lock 2>/dev/null\n\t\texit 4\n\tfi\n\t\n\tdl=$(echo \"$updown\" | cut -d ' ' -f 2)\n\tul=$(echo \"$updown\" | cut -d ' ' -f 3)\n\t\n\tif [ \"$dl\" = \"\" -o \"$ul\" = \"\" ]; then\n\t\techo \"empty speed data\"\n\t\trm -f /tmp/wiwiz_setspeed.lock 2>/dev/null\n\t\texit 0;\n\tfi\n\t\n\tcnt=$(uci show eqos 2>/dev/null | grep '=device' | wc -l)\n\t\n\tlet maxindex=$cnt-1\n\tI=0\n\tfor i in `seq 0 $maxindex`\n\tdo\n\t\t_ip=$(uci get eqos.@device[$I].ip 2>/dev/null)\n\t\tif [ \"$_ip\" = \"$ip\" ]; then\n\t\t\tuci delete eqos.@device[$I]\n\t\t\tlet I=$I-1\n\t\tfi\n\t\tlet I=$I+1\n\tdone\n\t\n\tuci add eqos device\n\tuci set eqos.@device[-1].ip=\"$ip\"\n\tuci set eqos.@device[-1].download=\"$dl\"\n\tuci set eqos.@device[-1].upload=\"$ul\"\n\tuci set eqos.@device[-1].comment=\"$COMMENT\"\n\t\n\tuci set eqos.@eqos[0].enabled='1'\n\t\n\tuci commit eqos\n\t/etc/init.d/eqos stop; /etc/init.d/eqos start\n\techo \"SetSpeed: $(date \"+%Y-%m-%d %H:%M:%S\") set $MAC\" >>$LOGFILE\nfi\n\nif [ \"$1\" = \"unset\" ]; then\n\tip=$(getIP2 $MAC)\n\tif [ \"$ip\" = \"\" ]; then\n\t\trm -f /tmp/wiwiz_setspeed.lock 2>/dev/null\n\t\texit 5\n\tfi\n\t\n\tcnt=$(uci show eqos 2>/dev/null | grep '=device' | wc -l)\n\n\tlet maxindex=$cnt-1\n\tI=0\n\tfor i in `seq 0 $maxindex`\n\tdo\n\t\t_ip=$(uci get eqos.@device[$I].ip 2>/dev/null)\n\t\t_comment=$(uci get eqos.@device[$I].comment 2>/dev/null)\n\t\tif [ \"$_ip\" = \"$ip\" -a \"$_comment\" = \"$COMMENT\" ]; then\n\t\t\tuci delete eqos.@device[$I]\n\t\t\tuci commit eqos\n\t\t\tlet I=$I-1\n\t\tfi\n\t\tlet I=$I+1\n\tdone\n\t/etc/init.d/eqos stop; /etc/init.d/eqos start\n\n\tif [ \"$MAC\" != \"\" ]; then\n\t\t/usr/local/hsbuilder/kickmac.sh add $MAC\n\tfi\n\n\techo \"SetSpeed: $(date \"+%Y-%m-%d %H:%M:%S\") unset $MAC\" >>$LOGFILE\nfi\n\nrm -f /tmp/wiwiz_setspeed.lock 2>/dev/null\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/usr/local/hsbuilder/ver",
    "content": "3.6.8"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/usr/local/hsbuilder/wiwizroaming.sh",
    "content": "#!/bin/sh\n# Wiwiz HotSpot Builder Utility\n# Copyright wiwiz.com. All rights reserved.\n\nMY_VERSION=\"3.0.0\"\t#for Wiwiz-opensource\n\nSRV_SAVE='/usr/local/hsbuilder/srv'\nROAMING_FILE='/tmp/wiwizroaming'\nHID=\"\"\nTMPFILE='/tmp/hsbuilder_token.tmp'\nDEBUG_FILE='/tmp/wiwizroaming.debug'\nLOGFILE='/tmp/hsbuilder.log'\n\ndebug() {\n\tDEBUG=$(cat \"$DEBUG_FILE\" 2>/dev/null)\n\tif [ \"$DEBUG\" = \"1\" ]; then\n\t\techo \"$1\" >>$LOGFILE\n\tfi\n}\n\ndoAuth() {\n\tMAC=\"$1\"\n\tIP=\"$2\"\n\tAS_HOSTNAME_X=\"$3\"\n\n\tIS_AUTHED=$(wdctl status  2>/dev/null | grep 'IP:' | grep 'MAC:' | tr -d ' ' | sed 's/IP://g' | sed 's/MAC:/ /g' | grep -i \"$MAC\" | grep -i \"$IP \")\n\tif [ \"$IS_AUTHED\" != \"\" ]; then\n\t\tdebug \"$IP $MAC is already authed\"\n\t\treturn\n\tfi\n\n    URL=\"http://$AS_HOSTNAME_X/as/s/auth/?stage=token&gw_id=$HID&mac=$MAC\"\n    \n\tdebug \"HID=$HID\"\n\n\trm -f \"$TMPFILE\"\n\tcurl -m 10 -o \"$TMPFILE\" \"$URL\"\t\n\ttoken=$(cat \"$TMPFILE\" 2>/dev/null |  cut -d ':' -f 2)\n\tip=$(cat \"$TMPFILE\" 2>/dev/null |  cut -d ':' -f 3)\n\trm -f \"$TMPFILE\"\n\t\n\tif [ \"$token\" == \"\" ]; then\n\t\tdebug \"token is empty\"\n\t\treturn\n\tfi\n\t\n\twdctl auth \"$MAC\" \"$IP\" \"$token\"\n\tdebug \"wdctl auth $MAC $IP $token\"\n\n\t#kicks same mac but different IP\n\twdctl status | grep 'IP:' | grep 'MAC:' | tr -d ' ' | sed 's/IP://g' | sed 's/MAC:/ /g' | grep -i \"$MAC\" | grep -v \"$IP \" | while read LINE; do\n\t\tIPtoReset=$(echo \"$LINE\" | cut -d ' ' -f 1)\n\t\twdctl reset \"$IPtoReset\"\n\t\tdebug \"wdctl reset $IPtoReset\"\n\tdone\n}\n\n\nlogread -f | while read LINE; do\n\ts=$(echo \"$LINE\"  | grep 'dnsmasq' | grep 'DHCPACK')\n\t\t\t\n\tif [ \"$s\" != \"\" ]; then\n\t\tLANDEV=$(uci get wiwiz.portal.lan 2>/dev/null)\n\t\tss=$(echo \"$s\" | grep -F \"$LANDEV\")\n\t\tdebug \"ss = $ss\"\n\t\tif [ \"$ss\" == \"\" ]; then\n\t\t\tcontinue\n\t\tfi\n\n\t\tHID=$(uci get wiwiz.portal.hotspotid 2>/dev/null)\n\t\tif [ \"$HID\" == \"\" ]; then\n\t\t\tcontinue\n\t\tfi\t\t\t\t\n\t\t\n\t\tROAMING=$(cat \"$ROAMING_FILE\" 2>/dev/null)\n\t\tif [ \"$ROAMING\" == \"\" ]; then\n\t\t\tcontinue\n\t\tfi\n\n\t\tAS_HOSTNAME_X=$(uci get wiwiz.portal.server 2>/dev/null)\n\t\tif [ \"$AS_HOSTNAME_X\" == \"\" ]; then\n\t\t\tcontinue\n\t\tfi\n\n\t\tMAC=$(echo \"$ss\" | awk '{print $10}')\n\t\tIP=$(echo \"$ss\" | awk '{print $9}')\n\t\tif [ \"$MAC\" == \"\" ]; then\n\t\t\tcontinue\n\t\tfi\n\t\tif [ \"$IP\" == \"\" ]; then\n\t\t\tcontinue\n\t\tfi\n\t\t\n\t\tdebug \"MAC = $MAC, IP = $IP\"\t\t\t\t\n\t\tdoAuth \"$MAC\" \"$IP\" \"$AS_HOSTNAME_X\" &\n\tfi\ndone\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/usr/local/hsbuilder/wiwizroaming.sh.old",
    "content": "#!/bin/sh\n# Wiwiz HotSpot Builder Utility\n# Copyright wiwiz.com. All rights reserved.\n\nMY_VERSION=\"3.0.0\"\t#for Wiwiz-opensource\n\nSRV_SAVE='/usr/local/hsbuilder/srv'\nROAMING_FILE='/tmp/wiwizroaming'\nHID=\"\"\nTMPFILE='/tmp/hsbuilder_token.tmp'\nDEBUG_FILE='/tmp/wiwizroaming.debug'\nLOGFILE='/tmp/hsbuilder.log'\n\ndebug() {\n\tDEBUG=$(cat \"$DEBUG_FILE\" 2>/dev/null)\n\tif [ \"$DEBUG\" = \"1\" ]; then\n\t\techo \"$1\" >>$LOGFILE\n\tfi\n}\n\ngetIP() {\n\tmac=\"$1\"\t\n\tLANDEV=$(uci get wiwiz.portal.lan 2>/dev/null)\n\tif [ \"$LANDEV\" == \"\" ]; then\n\t\tLANDEV=br-lan\n\tfi\n\n\tfor i in $(seq 6); do\t\n\t\ts=$(cat /proc/net/arp | grep -F \"$LANDEV\" | grep -F \"$mac\" | grep -F '0x2')\n\t\tif [ \"$s\" = \"\" ]; then\n\t\t\tsleep 1\n\t\t\tcontinue\n\t\telse\n\t\t\techo \"$s\"\n\t\t\tbreak\n\t\tfi\n\tdone\n\t\n\treturn\n}\n\ndoAuth() {\n\tMAC=\"$1\"\n\tAS_HOSTNAME_X=\"$2\"\n\n    URL=\"http://$AS_HOSTNAME_X/as/s/auth/?stage=token&gw_id=$HID&mac=$MAC\"\n    \n\tdebug \"HID=$HID\"\n\n\trm -f \"$TMPFILE\"\n\tcurl -m 10 -o \"$TMPFILE\" \"$URL\"\t\n\ttoken=$(cat \"$TMPFILE\" 2>/dev/null |  cut -d ':' -f 2)\n\tip=$(cat \"$TMPFILE\" 2>/dev/null |  cut -d ':' -f 3)\n\trm -f \"$TMPFILE\"\n\n    if [ \"$ip\" != \"\" ]; then\n\t\tping -c4 \"$ip\" 2>/dev/null &\n    fi\n    \t\n    IP=$(getIP \"$MAC\" | awk '{print $1}')\n    if [ \"$IP\" = \"\" ]; then\n    \treturn\n    fi\n    \n\tdebug \"IP=$IP\"\n\t\n\tif [ \"$token\" = \"\" ]; then\n\t\treturn\n\tfi\n\t\n\twdctl auth \"$MAC\" \"$IP\" \"$token\"\n\tdebug \"wdctl auth $MAC $IP $token\"\n\n\twdctl status | grep 'IP:' | grep 'MAC:' | tr -d ' ' | sed 's/IP://g' | sed 's/MAC:/ /g' | grep -i \"$MAC\" | grep -v \"$IP \" | while read LINE; do\n\t\tIPtoReset=$(echo \"$LINE\" | cut -d ' ' -f 1)\n\t\twdctl reset \"$IPtoReset\"\n\t\tdebug \"wdctl reset $IPtoReset\"\n\tdone\n}\n\n\nlogread -f | while read LINE; do\n        s=$(echo \"$LINE\" | grep hostapd | grep STA | grep -F ' associated')\n\t\t\t\t\n        if [ \"$s\" != \"\" ]; then\n\t\t\t\tdebug \"s=$s\"\n\t\t\t\tHID=$(uci get wiwiz.portal.hotspotid 2>/dev/null)\n\t\t\t\tif [ \"$HID\" = \"\" ]; then\n\t\t\t\t\tcontinue\n\t\t\t\tfi\n\t\t\t\t\n\t\t\t\tROAMING=$(cat \"$ROAMING_FILE\" 2>/dev/null)\n\t\t\t\tif [ \"$ROAMING\" = \"\" ]; then\n\t\t\t\t\tcontinue\n\t\t\t\tfi\n\n\t\t\t\tAS_HOSTNAME_X=$(uci get wiwiz.portal.server 2>/dev/null)\n\t\t\t\tif [ \"$AS_HOSTNAME_X\" = \"\" ]; then\n\t\t\t\t\tcontinue\n\t\t\t\tfi\n\n                MAC=$(echo \"$LINE\" | awk '{print $10}')\n                if [ \"$MAC\" = \"\" ]; then\n                \tcontinue\n                fi\n\t\t\t\tdebug \"MAC=$MAC\"\t\t\t\t\n                doAuth \"$MAC\" \"$AS_HOSTNAME_X\" &\n        fi\ndone\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/wifidog.init",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=99\nEXTRA_COMMANDS=\"status\"\nEXTRA_HELP=\"        status Print the status of the service\"\n\nstart() {\n\t/usr/bin/wifidog-init start\n}\n\nstop() {\n\t/usr/bin/wifidog-init stop\n}\n\nstatus() {\n\t/usr/bin/wifidog-init status\n}"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/www/cgi-bin/cpi",
    "content": "#!/usr/bin/lua\nrequire(\"luci.sys\")\nrequire(\"luci.util\")\nrequire(\"luci.http\")\n\nlocal client_ip = luci.sys.getenv(\"REMOTE_ADDR\")\nif client_ip == \"\" then\n    return\nend\n\nlocal wdrun = luci.util.exec(\"ps | grep wifidog | grep -v grep\")\nwdrun = string.gsub(wdrun, \"\\n\", \"\")\nif wdrun == \"\" then\n    return\nend\n\nlocal captive = \"\"\n\nlocal client_mac = luci.util.exec(\"cat /proc/net/arp | grep 0x2 | grep '\".. client_ip ..\" ' | awk '{print $4}' 2>/dev/null\")\nclient_mac = string.gsub(client_mac, \"\\n\", \"\")\nif client_mac == \"\" then\n    captive = \"true\"\nelse\n    local checkauth = luci.util.exec(\"/usr/local/hsbuilder/checkauth.sh '\".. client_mac ..\"' '\".. client_ip ..\"'\")\n    checkauth = string.gsub(checkauth, \"\\n\", \"\")\n\n    if checkauth == \"false\" then\n        captive = \"true\"\n    elseif checkauth == \"true\" then\n        captive = \"false\"\n    end\nend\n\nprint(\"Content-type: application/captive+json\\n\")\nif captive == \"false\" then\n    local output = \"{\\\"captive\\\": \".. captive ..\"}\"    \n    print(output)\nelse\n    local lan_ip = luci.util.exec(\"ifconfig $(uci get wiwiz.portal.lan 2>/dev/null) | grep 'inet addr' | awk '{ print $2}' | awk -F: '{print $2}' 2>/dev/null\")\n    lan_ip = string.gsub(lan_ip, \"\\n\", \"\")\n    local portal = \"http://\".. lan_ip ..\":2060\"\n\n    local host = luci.util.exec(\"uci get wiwiz.portal.server 2>/dev/null | cut -d ':' -f 1\")\n    host = string.gsub(host, \"\\n\", \"\")\n\n    local portalUrl = \"https://\".. host ..\"/as/rd.jsp?rd=\".. luci.http.urlencode(portal) \n\n    local output = \"{\\\"captive\\\": \".. captive ..\", \\\"user-portal-url\\\": \\\"\".. portalUrl ..\"\\\"}\"\n    print(output)\nend\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/www/cgi-bin/kickmac",
    "content": "#!/usr/bin/lua\nrequire(\"luci.sys\")\nrequire(\"luci.util\")\nrequire(\"luci.http\")\n\nfunction getFormPara( varname )\n    local value\n    local query = luci.sys.getenv(\"QUERY_STRING\")\n    if query ~= nil then\n      query = '&' .. query\n      varname = '&' .. varname .. '='\n      local p, q = string.find( query, varname )\n      if q ~= nil then\n        p = string.find( query, '&', q )\n        if p == nil then p = -1 else p = p - 1 end\n        value = string.sub( query, q + 1, p )\n      end\n    end\n    value = value or 'No such variable'\n    return value\nend\n\nlocal act = getFormPara(\"act\")\n\nprint(\"Content-type: text/plain\\n\")\n\nif act == \"list\" then\n    local s = \"timestamp \" .. luci.util.exec(\"date +%s\")\n    s = s .. luci.util.exec(\"cat /tmp/wiwiz_kickmac 2>/dev/null\")\n    print(s)\nend\n\nif act == \"kick\" then\n    local mac = getFormPara(\"mac\")\n    local s = luci.util.exec(\"S=$(cat /tmp/wiwiz_kickmac | grep -v '\".. mac ..\"' 2>/dev/null); echo \\\"$S\\\">/tmp/wiwiz_kickmac\")\n    print(\"ok\")\nend\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/www/cgi-bin/myip",
    "content": "#!/usr/bin/lua\nrequire(\"luci.sys\")\nrequire(\"luci.util\")\n\nlocal lanip = luci.util.exec(\"echo \\\"_wiwiz_getlanip('$(ifconfig $(uci get wiwiz.portal.lan 2>/dev/null) | grep 'inet addr' | awk '{ print $2}' | awk -F: '{print $2}')');\\\" 2>/dev/null\")\nprint(\"Content-type: application/javascript\\n\")\nprint(lanip)"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/www/cgi-bin/mymac",
    "content": "#!/usr/bin/lua\nrequire(\"luci.sys\")\nrequire(\"luci.util\")\n\nlocal client_ip = luci.sys.getenv(\"REMOTE_ADDR\")\nlocal rt_mac = luci.util.exec(\"ifconfig $(uci get wiwiz.portal.lan 2>/dev/null) | grep HWaddr | awk '{print $5}' 2>/dev/null\")\nrt_mac = string.gsub(rt_mac, \"\\n\", \"\")\nlocal client_mac = luci.util.exec(\"echo \\\"_wiwiz_setmac('$(cat /proc/net/arp | grep 0x2 | grep '\".. client_ip ..\" ' | awk '{print $4}')', '\".. rt_mac ..\"');\\\" 2>/dev/null\")\nprint(\"Content-type: application/javascript\\n\")\nprint(client_mac)"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/www/cgi-bin/showdevinfo",
    "content": "#!/usr/bin/lua\nrequire(\"luci.sys\")\nrequire(\"luci.util\")\n\nlocal s = luci.util.exec(\"echo \\\"_wiwiz_get_devinfo('$(cat /dev_info | cut -d ' ' -f 1)', '$(cat /dev_info | cut -d ' ' -f 2)', '$(cat /dev_info | cut -d ' ' -f 3)', '$(ifconfig $(uci get wiwiz.portal.lan 2>/dev/null) | grep HWaddr | awk '{print $5}')');\\\"\")\nprint(\"Content-type: application/javascript\\n\")\nprint(s)"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/www/cgi-bin/wiwiz404",
    "content": "#!/usr/bin/lua\n-- 这是一个简单的示例，实际应用需更严谨的逻辑\nio.write(\"Status: 404 Not Found\\r\\n\")\nio.write(\"Content-type: text/html; charset=utf-8\\r\\n\\r\\n\")\nio.write([[\n<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta http-equiv=\"Content-Language\" content=\"zh\">\n<meta http-equiv=\"Pragma\" content=\"no-cache\">\n<meta http-equiv=\"Cache-Control\" content=\"no-cache\">\n<meta name=\"viewport\" content=\"width=device-width; initial-scale=1.0\">\n<script>\nfunction runscript(url) {\n\tvar script = document.createElement('script');  \n\tscript.setAttribute('src', url);\n\tdocument.getElementsByTagName('head')[0].appendChild(script);  \n}\n\nfunction _wiwiz_getlanip(ip) {\n\tvar url = window.location.href;\n\tif(url.indexOf(\"https://\") != -1 && url.indexOf(\"https://\"+ ip) == -1) {\n\t\tlocation.href = \"http://\"+ ip +\":2060\";\n\t} else {\n\t\tdocument.getElementById(\"dvShow\").innerHTML = \"Page Not Found\";\n\t}\n}\n\nfunction myOnLoad() {\n\trunscript(\"/cgi-bin/myip\");\n}\n</script>\n</head>\n<body style=\"background-color: white\" onload=\"myOnLoad()\">\n<div id=\"dvShow\">Loading...</div>\n</body>\n</html>\n]])"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/www/error.html.wiwiz",
    "content": "<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta http-equiv=\"Content-Language\" content=\"zh\">\n<meta http-equiv=\"Pragma\" content=\"no-cache\">\n<meta http-equiv=\"Cache-Control\" content=\"no-cache\">\n<meta name=\"viewport\" content=\"width=device-width; initial-scale=1.0\">\n<script>\nfunction runscript(url) {\n\tvar script = document.createElement('script');  \n\tscript.setAttribute('src', url);\n\tdocument.getElementsByTagName('head')[0].appendChild(script);  \n}\n\nfunction _wiwiz_getlanip(ip) {\n\tvar url = window.location.href;\n\tif(url.indexOf(\"https://\") != -1 && url.indexOf(\"https://\"+ ip) == -1) {\n\t\tlocation.href = \"http://\"+ ip +\":2060\";\n\t} else {\n\t\tdocument.getElementById(\"dvShow\").innerHTML = \"Page Not Found\";\n\t}\n}\n\nfunction myOnLoad() {\n\trunscript(\"/cgi-bin/myip\");\n}\n</script>\n</head>\n<body style=\"background-color: white\" onload=\"myOnLoad()\">\n<div id=\"dvShow\">Loading...</div>\n</body>\n</html>\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/www/index.html.wiwiz",
    "content": "<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta http-equiv=\"Content-Language\" content=\"zh\">\n<meta http-equiv=\"Pragma\" content=\"no-cache\">\n<meta http-equiv=\"Cache-Control\" content=\"no-cache\">\n<meta name=\"viewport\" content=\"width=device-width; initial-scale=1.0\">\n<script>\nfunction runscript(url) {\n\tvar script = document.createElement('script');  \n\tscript.setAttribute('src', url);\n\tdocument.getElementsByTagName('head')[0].appendChild(script);  \n}\n\nfunction _wiwiz_getlanip(ip) {\n\tvar url = window.location.href;\n\tif(url.indexOf(\"https://\") != -1 && url.indexOf(\"https://\"+ ip) == -1) {\n\t        location.href = \"http://\"+ ip +\":2060\";\n\t} else {\n\t        location.href = \"/cgi-bin/luci/\";\n\t}\n}\n\nfunction myOnLoad() {\n\trunscript(\"/cgi-bin/myip\");\n}\n</script>\n</head>\n<body style=\"background-color: white\" onload=\"myOnLoad()\">\n<a style=\"color: black; font-family: arial, helvetica, sans-serif;\" href=\"cgi-bin/luci/\">LuCI - Lua Configuration Interface</a>\n</body>\n</html>\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/files/www/mymac.htm",
    "content": "<!doctype html>\n<html>\n<head>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta http-equiv=\"Content-Language\" content=\"zh\">\n<meta http-equiv=\"Pragma\" content=\"no-cache\">\n<meta http-equiv=\"Cache-Control\" content=\"no-cache\">\n<meta name=\"viewport\" content=\"width=device-width; initial-scale=1.0\">\n<script>\nfunction runscript(url) {\n\tvar script = document.createElement('script');  \n\tscript.setAttribute('src', url);\n\tdocument.getElementsByTagName('head')[0].appendChild(script);  \n}\nfunction getUrlParameter(name) {\n    var reg = new RegExp(\"(^|&)\" + name + \"=([^&]*)(&|$)\",\"i\");\n    var r = window.location.search.substr(1).match(reg);\n    if (r!=null) \n        return decodeURIComponent(r[2]); \n    return null;\n}\n\nfunction  _wiwiz_setmac(m, r) {\n\tconsole.log(\"_wiwiz_setmac() m = \"+ m + \", r = \" + r);\n    location.href = rd + \"&mac=\" + encodeURIComponent(m) + \"&rt_mac=\" + encodeURIComponent(r);\n}\n\nvar rd = getUrlParameter(\"rd\");\n\nrunscript(\"cgi-bin/mymac\")\n</script>\n</head>\n<body>\n\n</body></html>"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/po/zh_Hans/wifidog-wiwiz.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Project-Id-Version: LuCi Chinese Translation\\n\"\n\"Report-Msgid-Bugs-To: \\n\"\n\"Language: zh_Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\"Plural-Forms: nplurals=1; plural=0;\\n\"\n\"X-Generator: Pootle 2.0.6\\n\"\n\nmsgid \"Portal\"\nmsgstr \"Portal认证\"\n\nmsgid \"Enable\"\nmsgstr \"启用\"\n\nmsgid \"case sensitivity, no spaces\"\nmsgstr \"注意区分大小写，不要有空格\"\n\nmsgid \"Server Address and Port\"\nmsgstr \"服务器地址与端口\"\n\nmsgid \"Network interface\"\nmsgstr \"网络接口\"\n\nmsgid \"Plugin Version\"\nmsgstr \"Wiwiz插件版本\"\n\nmsgid \"<a href='http://www.wiwiz.com/pinpinwifi/wiwiz-ipk.htm' target='_blank'>Readme</a>\"\nmsgstr \"<a href='http://www.wiwiz.com/pinpinwifi/wiwiz-ipk.htm' target='_blank'>使用说明</a>\"\n\nmsgid \"Enable DHCP Captive Portal Identification\"\nmsgstr \"启用DHCP Captive Portal通告\"\n\nmsgid \"network service will restart after enabling portal, please reconnect to the router if necessary\"\nmsgstr \"启用Portal后网络将重启，可能需要重新连接到路由器\""
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/AUTHORS",
    "content": "$Id$\n\nPhilippe April <philippe@ilesansfil.org>\nMina Naguib <webmaster@topfx.com>\nBenoit Grgoire <bock@step.polymtl.ca>\nAlexandre Carmel-Veilleux <acv@miniguru.ca>\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/COPYING",
    "content": "\t\t    GNU GENERAL PUBLIC LICENSE\n\t\t       Version 2, June 1991\n\n Copyright (C) 1989, 1991 Free Software Foundation, Inc.\n                          675 Mass Ave, Cambridge, MA 02139, USA\n Everyone is permitted to copy and distribute verbatim copies\n of this license document, but changing it is not allowed.\n\n\t\t\t    Preamble\n\n  The licenses for most software are designed to take away your\nfreedom to share and change it.  By contrast, the GNU General Public\nLicense is intended to guarantee your freedom to share and change free\nsoftware--to make sure the software is free for all its users.  This\nGeneral Public License applies to most of the Free Software\nFoundation's software and to any other program whose authors commit to\nusing it.  (Some other Free Software Foundation software is covered by\nthe GNU Library General Public License instead.)  You can apply it to\nyour programs, too.\n\n  When we speak of free software, we are referring to freedom, not\nprice.  Our General Public Licenses are designed to make sure that you\nhave the freedom to distribute copies of free software (and charge for\nthis service if you wish), that you receive source code or can get it\nif you want it, that you can change the software or use pieces of it\nin new free programs; and that you know you can do these things.\n\n  To protect your rights, we need to make restrictions that forbid\nanyone to deny you these rights or to ask you to surrender the rights.\nThese restrictions translate to certain responsibilities for you if you\ndistribute copies of the software, or if you modify it.\n\n  For example, if you distribute copies of such a program, whether\ngratis or for a fee, you must give the recipients all the rights that\nyou have.  You must make sure that they, too, receive or can get the\nsource code.  And you must show them these terms so they know their\nrights.\n\n  We protect your rights with two steps: (1) copyright the software, and\n(2) offer you this license which gives you legal permission to copy,\ndistribute and/or modify the software.\n\n  Also, for each author's protection and ours, we want to make certain\nthat everyone understands that there is no warranty for this free\nsoftware.  If the software is modified by someone else and passed on, we\nwant its recipients to know that what they have is not the original, so\nthat any problems introduced by others will not reflect on the original\nauthors' reputations.\n\n  Finally, any free program is threatened constantly by software\npatents.  We wish to avoid the danger that redistributors of a free\nprogram will individually obtain patent licenses, in effect making the\nprogram proprietary.  To prevent this, we have made it clear that any\npatent must be licensed for everyone's free use or not licensed at all.\n\n  The precise terms and conditions for copying, distribution and\nmodification follow.\n\f\n\t\t    GNU GENERAL PUBLIC LICENSE\n   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION\n\n  0. This License applies to any program or other work which contains\na notice placed by the copyright holder saying it may be distributed\nunder the terms of this General Public License.  The \"Program\", below,\nrefers to any such program or work, and a \"work based on the Program\"\nmeans either the Program or any derivative work under copyright law:\nthat is to say, a work containing the Program or a portion of it,\neither verbatim or with modifications and/or translated into another\nlanguage.  (Hereinafter, translation is included without limitation in\nthe term \"modification\".)  Each licensee is addressed as \"you\".\n\nActivities other than copying, distribution and modification are not\ncovered by this License; they are outside its scope.  The act of\nrunning the Program is not restricted, and the output from the Program\nis covered only if its contents constitute a work based on the\nProgram (independent of having been made by running the Program).\nWhether that is true depends on what the Program does.\n\n  1. You may copy and distribute verbatim copies of the Program's\nsource code as you receive it, in any medium, provided that you\nconspicuously and appropriately publish on each copy an appropriate\ncopyright notice and disclaimer of warranty; keep intact all the\nnotices that refer to this License and to the absence of any warranty;\nand give any other recipients of the Program a copy of this License\nalong with the Program.\n\nYou may charge a fee for the physical act of transferring a copy, and\nyou may at your option offer warranty protection in exchange for a fee.\n\n  2. You may modify your copy or copies of the Program or any portion\nof it, thus forming a work based on the Program, and copy and\ndistribute such modifications or work under the terms of Section 1\nabove, provided that you also meet all of these conditions:\n\n    a) You must cause the modified files to carry prominent notices\n    stating that you changed the files and the date of any change.\n\n    b) You must cause any work that you distribute or publish, that in\n    whole or in part contains or is derived from the Program or any\n    part thereof, to be licensed as a whole at no charge to all third\n    parties under the terms of this License.\n\n    c) If the modified program normally reads commands interactively\n    when run, you must cause it, when started running for such\n    interactive use in the most ordinary way, to print or display an\n    announcement including an appropriate copyright notice and a\n    notice that there is no warranty (or else, saying that you provide\n    a warranty) and that users may redistribute the program under\n    these conditions, and telling the user how to view a copy of this\n    License.  (Exception: if the Program itself is interactive but\n    does not normally print such an announcement, your work based on\n    the Program is not required to print an announcement.)\n\f\nThese requirements apply to the modified work as a whole.  If\nidentifiable sections of that work are not derived from the Program,\nand can be reasonably considered independent and separate works in\nthemselves, then this License, and its terms, do not apply to those\nsections when you distribute them as separate works.  But when you\ndistribute the same sections as part of a whole which is a work based\non the Program, the distribution of the whole must be on the terms of\nthis License, whose permissions for other licensees extend to the\nentire whole, and thus to each and every part regardless of who wrote it.\n\nThus, it is not the intent of this section to claim rights or contest\nyour rights to work written entirely by you; rather, the intent is to\nexercise the right to control the distribution of derivative or\ncollective works based on the Program.\n\nIn addition, mere aggregation of another work not based on the Program\nwith the Program (or with a work based on the Program) on a volume of\na storage or distribution medium does not bring the other work under\nthe scope of this License.\n\n  3. You may copy and distribute the Program (or a work based on it,\nunder Section 2) in object code or executable form under the terms of\nSections 1 and 2 above provided that you also do one of the following:\n\n    a) Accompany it with the complete corresponding machine-readable\n    source code, which must be distributed under the terms of Sections\n    1 and 2 above on a medium customarily used for software interchange; or,\n\n    b) Accompany it with a written offer, valid for at least three\n    years, to give any third party, for a charge no more than your\n    cost of physically performing source distribution, a complete\n    machine-readable copy of the corresponding source code, to be\n    distributed under the terms of Sections 1 and 2 above on a medium\n    customarily used for software interchange; or,\n\n    c) Accompany it with the information you received as to the offer\n    to distribute corresponding source code.  (This alternative is\n    allowed only for noncommercial distribution and only if you\n    received the program in object code or executable form with such\n    an offer, in accord with Subsection b above.)\n\nThe source code for a work means the preferred form of the work for\nmaking modifications to it.  For an executable work, complete source\ncode means all the source code for all modules it contains, plus any\nassociated interface definition files, plus the scripts used to\ncontrol compilation and installation of the executable.  However, as a\nspecial exception, the source code distributed need not include\nanything that is normally distributed (in either source or binary\nform) with the major components (compiler, kernel, and so on) of the\noperating system on which the executable runs, unless that component\nitself accompanies the executable.\n\nIf distribution of executable or object code is made by offering\naccess to copy from a designated place, then offering equivalent\naccess to copy the source code from the same place counts as\ndistribution of the source code, even though third parties are not\ncompelled to copy the source along with the object code.\n\f\n  4. You may not copy, modify, sublicense, or distribute the Program\nexcept as expressly provided under this License.  Any attempt\notherwise to copy, modify, sublicense or distribute the Program is\nvoid, and will automatically terminate your rights under this License.\nHowever, parties who have received copies, or rights, from you under\nthis License will not have their licenses terminated so long as such\nparties remain in full compliance.\n\n  5. You are not required to accept this License, since you have not\nsigned it.  However, nothing else grants you permission to modify or\ndistribute the Program or its derivative works.  These actions are\nprohibited by law if you do not accept this License.  Therefore, by\nmodifying or distributing the Program (or any work based on the\nProgram), you indicate your acceptance of this License to do so, and\nall its terms and conditions for copying, distributing or modifying\nthe Program or works based on it.\n\n  6. Each time you redistribute the Program (or any work based on the\nProgram), the recipient automatically receives a license from the\noriginal licensor to copy, distribute or modify the Program subject to\nthese terms and conditions.  You may not impose any further\nrestrictions on the recipients' exercise of the rights granted herein.\nYou are not responsible for enforcing compliance by third parties to\nthis License.\n\n  7. If, as a consequence of a court judgment or allegation of patent\ninfringement or for any other reason (not limited to patent issues),\nconditions are imposed on you (whether by court order, agreement or\notherwise) that contradict the conditions of this License, they do not\nexcuse you from the conditions of this License.  If you cannot\ndistribute so as to satisfy simultaneously your obligations under this\nLicense and any other pertinent obligations, then as a consequence you\nmay not distribute the Program at all.  For example, if a patent\nlicense would not permit royalty-free redistribution of the Program by\nall those who receive copies directly or indirectly through you, then\nthe only way you could satisfy both it and this License would be to\nrefrain entirely from distribution of the Program.\n\nIf any portion of this section is held invalid or unenforceable under\nany particular circumstance, the balance of the section is intended to\napply and the section as a whole is intended to apply in other\ncircumstances.\n\nIt is not the purpose of this section to induce you to infringe any\npatents or other property right claims or to contest validity of any\nsuch claims; this section has the sole purpose of protecting the\nintegrity of the free software distribution system, which is\nimplemented by public license practices.  Many people have made\ngenerous contributions to the wide range of software distributed\nthrough that system in reliance on consistent application of that\nsystem; it is up to the author/donor to decide if he or she is willing\nto distribute software through any other system and a licensee cannot\nimpose that choice.\n\nThis section is intended to make thoroughly clear what is believed to\nbe a consequence of the rest of this License.\n\f\n  8. If the distribution and/or use of the Program is restricted in\ncertain countries either by patents or by copyrighted interfaces, the\noriginal copyright holder who places the Program under this License\nmay add an explicit geographical distribution limitation excluding\nthose countries, so that distribution is permitted only in or among\ncountries not thus excluded.  In such case, this License incorporates\nthe limitation as if written in the body of this License.\n\n  9. The Free Software Foundation may publish revised and/or new versions\nof the General Public License from time to time.  Such new versions will\nbe similar in spirit to the present version, but may differ in detail to\naddress new problems or concerns.\n\nEach version is given a distinguishing version number.  If the Program\nspecifies a version number of this License which applies to it and \"any\nlater version\", you have the option of following the terms and conditions\neither of that version or of any later version published by the Free\nSoftware Foundation.  If the Program does not specify a version number of\nthis License, you may choose any version ever published by the Free Software\nFoundation.\n\n  10. If you wish to incorporate parts of the Program into other free\nprograms whose distribution conditions are different, write to the author\nto ask for permission.  For software which is copyrighted by the Free\nSoftware Foundation, write to the Free Software Foundation; we sometimes\nmake exceptions for this.  Our decision will be guided by the two goals\nof preserving the free status of all derivatives of our free software and\nof promoting the sharing and reuse of software generally.\n\n\t\t\t    NO WARRANTY\n\n  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY\nFOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN\nOTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES\nPROVIDE THE PROGRAM \"AS IS\" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED\nOR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF\nMERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS\nTO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE\nPROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,\nREPAIR OR CORRECTION.\n\n  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING\nWILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR\nREDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,\nINCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING\nOUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED\nTO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY\nYOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER\nPROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE\nPOSSIBILITY OF SUCH DAMAGES.\n\n\t\t     END OF TERMS AND CONDITIONS\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/ChangeLog",
    "content": "# $Id$\n\n2012-05-30\n\t* Add many const by champtar\n\t* Send http 302 instead of 307 by champtar\n\t* Suppress all compilation warnings by champtar\n\t* Add transparent proxy support (via iptables REDIRECT) \n2012-08-28\n\t* Fix #836, buffer overflow on long urls reported by Etienne CHAMPETIER\n\t* Fix #835, segfaults reported by Etienne CHAMPETIER\n2009-11-03\n\t* Fix #625, does not display failure notice when quiet is set to true\n\t* Fix #587, change index and rindex to strchr and strrchr\n\t* Fix #548, trim leading spaces of the config file's options\n\n2009-09-28 Benoit Grégoire  <benoitg@coeus.ca>\n\t* Fix #471, patch by  wichert\n\n2009-09-25 Geneviève Bastien <gbastien@versatic.net>\n\t* Release 20090925\n\t* Update contrib Makefiles\n\n2009-09-17 Geneviève Bastien <gbastien@versatic.net>\n\t* Documented #537\n\t* Fixed #472, patch by Jean-Philippe Menil\n\t* Fixed #515, using the gateway interface instead of the gateway id in the iptables chain\n\n2009-07-02 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* Re-fix #505, #525 and fix #584, sorry about that.\n\n2009-06-26 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* Fix #518\n\n2009-02-27 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* Fix #488 and #493 (arp_get() in firewall.c couldn't parse lowercase mac's from /proc/net/arp) with patch from\tjch@pps.jussieu.fr.  Otherwise wifidog wouldn't work with recent openwrt and Ubuntu.\n\t* Fix #525\n\t\n2008-09-30 Wichert Akkerman <wichert@wiggy.net>\n\t* Add exitcode to iptables failure errors.\n\t* Include the gw_id in auth server updates so the client does not have\n\t  to keep track of it in a session.\n\t* Include the gateway id in the firewall table names. Fixes ticket #466\n\t* URL encode the token before transmitting (it was already decoded).\n\t  Fixes ticket #473\n\t* Clean up compiler warnings.\n\t* Security: strncpy may not NUL-terminate strings, so enforce this\n\t  ourselves. Fixes ticket #464\n\t* Make it possible to protect the status page. Fixes ticket #463.\n\n2008-07-20 Alexandre Carmel-Veilleux <acv@miniguru.ca>\n\t* src/util.c: Fixed #include bug that caused segfaults on newer Linux\n\n2008-04-21 Alexandre Carmel-Veilleux <acv@miniguru.ca>\n\t* Integrated patch #452 from Wichert Akkerman <wichert@wiggy.net>: Add const to function arguments in libhttpd to enforce more type checking and prevent certain class of problems.\n\t* Compatiblity fix: Libhttpd assumes that type u_int is defined. Added an #ifndef/#include <sys/types.h> pair to httpd.h to make sure that assertion is true.\n\t* Integrated patch #453 from Wichert Akkerman <wichert@wiggy.net>: Add configurable html to wifidog error messages. This has been a long-requested feature.\n\n2008-04-13 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* contrib/build-openwrt-kamikazeipk/wifidog/Makefile:  Add iptables userspace dependencies\n\t* Release 1.1.5\n\t\n2008-03-24 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* Integrate with OpenWRT kamikaze build system\n\n2007-11-01 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* Apply portability patches by David Young <dyoung@pobox.com>.  These have been reviewed, but not tested.\n\n2007-10-18 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* fw_iptables.c: From Philippe April:  reverted change made in 1241 so we properly remove the entry from mangle.WiFiDog_Incoming when kicking out users, it was affecting statistics \n\t* Update doxygen.cfg.in for latest version and to fix path ambiguity during make dist.\n\t* Release 1.1.4\n\n2007-07-06 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* Makefile.am:  Slight change in make ipk tagrget.  It seems that sometimes builddir isn't defined.  srcdir works just as well in this case.\n\t\n2007-06-27 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* util.c:  Fix while loop initialisation bug\n\t* conf.h:  Forgot to change the value of NUM_EXT_INTERFACE_DETECT_RETRY to actually make it wait forever.\n\t* Remove hardcoded authserver paths.  Can now be defined in the config file (auth server section).\n\t* Centralise browser redirect code to simplify code\n\t* Add manual logout URL, based in part on work by David Bird\n\t* Release 1.1.3 final\n\t\n2007-06-24 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* Close #321:  Make the Gateway retry forever if it cannot find it's interface.  You never know when someone may finally replug the network cable or something...\n\t* Close #332:  Apply patch from Laurent Marchal. biguphpc<AT>gmail<DOT>com\n\t* fw_iptables.c:  Fix error in iptables_fw_access().  Rules were created as ACCEPT instead of DROP\n\t* firewall.c:  Fix bug in fw_sync_with_authserver().  The traffic for the validation period of a user who validated his account while connected wouldn't get counted.\n\t* doc/wifidog_firewall_map.dia:  At long last, full documentation of the firewall.  We would have avoided a lot of stupid mistakes if we produced that sooner.\n\t* Release 1.1.3_rc1\n\n2007-05-24 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* wdctl_thread.c:  Fix #324, again.  Credit goes to Medea, I misunderstood his instructons.\n\t* From David Bird <david@coova.com> libhttpd/: Fix #266 - don't process query string parameters and keep them in that request.path.\n\n2007-05-18 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* wdctl_thread.c:  Fix #324\n\t\n2007-04-26 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* wifidog.conf:  Improve comments and add examples of blocking access to the upstream LAN.\n\n2007-04-26 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* conf.h:  The DEFAULT_CHECKINTERVAL was 5 instead of 60 (as stated in the config file) which caused huge needless load on the auth servers, and needless ping traffic towards the clients if it wasn't manually set.\n\n2007-04-09 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* Makefile.am:  Slight path fix when using building make ipk.  Tell me if you have trouble with this\n\n2007-01-06 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* contrib/ Add contrib dir to collect the scripts and other code distributed with, but not really part of wifidog.\n\t* Include the scripts used to build a ipkg on Openwrt RC6 and 0.9\n\t* Modify the build system to finally be able to build wifidog directly from the wifidog directory using the same files \n\t\tused to make the official .ipk, without having to copy ANYTHNG to the openwrt SDK.\n\t\tAt last, there is now a new target:  make ipk make ipk OPENWRTSDK=path_to_openwrt_sdk\n\t* ipk/ Removed the obsolete OpenWRT RC4 scripts\n\t* README.openwrt:  Update\n\t* scripts/openwrt/ remove obsolete dir.\n\t* contrib/dump_fw.sh:  Convenience script for firewall debugging.\n\t\t\n2007-01-06 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* Documentation update in the code\n\t* Released 1.1.3_beta6\n\n2006-10-26 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* src/conf.h: Fix #238 by using $sysconfdir to compute the default config-file location.\n\t\n2006-10-08 Alexandre Carmel-Veilleux <acv@miniguru.ca>\n\t* Changed my email in a few files.\n\t* Broken down some printf's on multiple lines.\n\t* Added comments.\n\n2006-09-14 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* src/util.c, src/conf.h: Fix autodectection of the External interface if not specified in the config file.  If the interface (typically pppoe) wasn't yet fully up when wifidog starts, wifidog would stop every connection from going trough.  It will now retry every second for up to two minutes, and then exit with a fatal error if it can't successfully detect it.\n\n2006-02-23 Philippe April <philippe@ilesansfil.org>\n\t* src/fw_iptables.c:\n\t* Changed order in the filter.FORWARD chain\n\t* Added TCPMSS rule\n\t* Fixed deleting the rules on shutdown\n\t* Fixed wdctl reset problem\n\t* Released 1.1.3_beta4\n\n2006-02-06 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* src/fw_iptables.c: Fix deleting the rules on shutdown.\n\n2006-01-31 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* Release 1.1.3_beta2\n\t\n2006-01-31 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* src/fw_iptables.c:  Add the global ruleset to the nat table to fix #65.\n\tAdd the table parameter to iptables_load_ruleset() and iptables_compile\n\t* libhttpd/protocol.c:  Fix pointer type mismatch\n    * src/conf.c,h:  Remove deprecated option AuthServMaxTries (which was already ignored anyway.\t\n\t\n2006-01-23 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* src/conf.h:  Fix the value of DEFAULT_AUTHSERVPATH and completely wrong code comment.  Not the default indicated in the config file and the define are in sync.\n\n2006-01-17 Mina Naguib <mina@ilesansfil.org>\n\t* Ingisgnificant cleanup  of CVS artifacts after svn migration\n\n2005-11-24 Philippe April <philippe@ilesansfil.org>\n\t* Bad idea\n\n2005-11-01 Max Horvath <max.horvath@maxspot.de>\n\t* Added .project to .cvsignore\n\n2005-11-01 Philippe April <philippe@ilesansfil.org>\n\t* Added OPTIONS section in wifidog-init (example: enable syslog)\n\n2005-10-09 Philippe April <philippe@ilesansfil.org>\n\t* Changed html pages, added info to wdctl status\n\n2005-10-07 Philippe April <philippe@ilesansfil.org>\n\t* Released 1.1.3_beta1\n\n2005-10-03 Philippe April <philippe@ilesansfil.org>\n\t* libhttpd: Fixed two bugs parsing the GET query string making wifidog segfault\n\n2005-09-24 Mina Naguib <mina@ilesansfil.org>\n\t* New wdctl command \"restart\" which will get wifidog to restart itself\n\twhile preserving the existing clientlist.  Perfect for 0-downtime\n\tupgrading!\n\t* safe.c: New safe_fork that croaks if the fork fails, also takes care of\n\tclosing some global file descriptors for the child\n\t* debug.c: Now also logs the PID as part of every entry\n\t* gateway.c: Handler for SIGCHLD now waitpid()s with WNOHANG flag to prevent deadlock\n\twhen the handler is called and another wait() or waitpid() is used\n\t* util.c: execute() now uses waitpid() instead of wait() to reap only the child\n\tit fork/executed\n\t* Extra debugging entries throughout code\n\n2005-09-24 Mina Naguib <mina@ilesansfil.org>\n\t* conf.c: Pre-emptive bugfix - harsh lockdown of parsing trusted MAC\n\taddresses from config file\n\n2005-09-24 Philippe April <philippe@ilesansfil.org>\n\t* (finally) Added {Saul Albert,Jo Walsh,Schuyler}'s patch (thank you!) to send\n\tthe GW interface's mac address as the node_id if no node_id is specified. It allows\n\tthe use of generic configuration files without the need to hardcode the\n\tnode_id in.\n\t* Added TrustedMACList configuration variable which allows specifying\n\tMAC addresses which are allowed to go through without authentication.\n\t* Updated OpenWrt instructions.\n\n2005-09-08 Philippe April <philippe@ilesansfil.org>\n\t* Added compile instructions and installation for OpenWrt Whiterussian-rc2\n\t* Released 1.1.2\n\n2005-05-30 Mina Naguib <mina@ilesansfil.org>\n\t* New wdctl command \"restart\" which will get wifidog to restart itself while preserving the existing clientlist.  Perfect for 0-downtime upgrading!\n\t* safe.c: New safe_fork that croaks if the fork fails, also takes care of closing some global file descriptors for the child\n\t* debug.c: Now also logs the PID as part of every entry\n\t* gateway.c: Handler for SIGCHLD now waitpid()s with WNOHANG flag to prevent deadlock when the handler is called and another wait() or waitpid() is used\n\t* util.c: execute() now uses waitpid() instead of wait() to reap only the child it fork/executed\n\t* Extra debugging entries throughout code\n\t\n2005-05-24 Mina Naguib <mina@ilesansfil.org>\n\t* wdctl.c: Minor bugfix pointed out by David Vincelli: When an invalid\n\tcommand is given to wdctl, the error message showed \"Invalid command:\n\twdctl\" instead of the actual command supplied\n\n2005-05-23 Philippe April <philippe@ilesansfil.org>\n\t* Released 1.1.2_pre1\n\n2005-05-23 Mina Naguib <mina@ilesansfil.org>\n\t* fw_uptables.c: When appending call to chain WiFiDog_Outgoing from\n\tnat.prerouting, add it via -A (at end) instead of -I 1 (at beginning) to\n\tallow for existing nat forwarding.\n\n2005-05-16 Mina Naguib <mina@ilesansfil.org>\n\t* centralserver.c: read()s from central server in auth_server_request() are\n\tnow timed-out (via select).  This is hopefully a bugfix to the\n\tthread-freezing problem.\n\n2005-05-06 Mina Naguib <mina@ilesansfil.org>\n\t* Bugfix non-RFC compliant HTTP requests using \\n instead of \\r\\n as line\n\tterminations as per email from ludocornut@users.sourceforge.net\n\n2005-04-28 Philippe April <philippe@ilesansfil.org>\n\t* Released 1.1.2_beta2\n\n2005-04-28 Mina Naguib <mina@ilesansfil.org>\n\t* wifidog.conf: Make the default ruleset for validating users = allow all\n\t(except sending SMTP)\n\n2005-04-20 Philippe April <philippe@ilesansfil.org>\n\t* fw_iptables.c: Insert ourselves at the end of filter.FORWARD instead of\n\tat the beginning since important FW instructions are located there on the\n\tWRT54Gs when used with some DSL providers and we never execute them\n\totherwise.\n\t* Released 1.1.2_beta1\n\n2005-04-03 Philippe April <philippe@ilesansfil.org>\n\t* Fixed issue with FAQ\n\t* ipkg/rules: If autogen.sh doesn't exist, it's ok. 'configure' will.\n\n2005-04-01 Philippe April <philippe@ilesansfil.org>\n\t* Duplicated auth server list in NAT table to fix the issue\n\tof using an auth server on port 80, since port 80 was being systematically\n\tredirected to 2060 otherwise.\n\t* Released 1.1.1\n\n2005-03-29 Mina Naguib <mina@ilesansfil.org>\n\t* Added FAQ document copied from wiki\n\n2005-03-22 Philippe April <philippe@ilesansfil.org>\n\t* Released 1.1.0\n\n2005-03-20 Mina Naguib <mina@ilesansfil.org>\n\t* More verbose debugging output\n\n2005-03-12 Mina Naguib <mina@ilesansfil.org>\n\t* More debugging output\n\t* Document ugly hack involving tid_fw_thread\n\t* SIGPIPE now ignored (as it's comment said) instead of being sent to the\n\thandler for SIGCHLD\n\t* Bugfix firewall destruction not happening from termination handler - had\n\tto move explicit thread kills after, not before, firewall destruction\n\n2005-03-11 Mina Naguib <mina@ilesansfil.org>\n\t* If external interface was unspecified in the conf file, try to determine\n\tit from the default route\n\t* If external interface is known, specify it in the trigger rule in\n\tnat.PREROUTING to prevent the rule from matching traffic inbound to the\n\trouter itself.  This should fix the issue raised by Philippe and Pascal on\n\tthe mailing list\n\t* Bugfix: UNDO ABOVE 2 ITEMS. Aparently you cannot use the \"-o\" iptables\n\toption in nat.PREROUTING which makes knowing external_interface useless\n\t* Added new chain in nat.PREROUTING that explicitly allows all traffic to\n\tthe router's internal IP from the internal interface, effectively\n\taddressing the same above problem\n\n2005-03-07 Mina Naguib <mina@ilesansfil.org>\n\t* auth.c: Got rid of legacy _http_output and _http_redirect - replaced them\n\twith libhttpd functions and http_wifidog_header/http_wifidog_footer\n\t* auth.c: When re-directing to auth server now respects SSL setting instead\n\tof always http+port 80\n\t* auth.c: Better debugging output of what it's doing when it acts on auth\n\tserver response\n\t* A little bit more care with buffers and their sizes\n\t* Minor whitespace tweaking and a couple of internal doc typo fixes\n\n2005-03-06 Mina Naguib <mina@ilesansfil.org>\n\t* Check return values of pthread_create\n\t* Internal documentation touch-ups\n\t* auth.c: Bugfix invalid http header sent by _http_output\n\t* Bugfix traffic counter read from iptables as long int instead of long\n\tlong int\n\t* Minor insignificant code touch-ups:\n\t\t* Replace pthread_mutex_lock/unlock calls with appropriate\n\t\tLOCK_FOO/UNLOCK_FOO macros for consistency\n\t\t* Lock first before using some variables, not after\n\t\t* Indentation adjustments\n\n2005-03-04 Mina Naguib <mina@ilesansfil.org>\n\t* Bugfix huge uptime pointed out to be by Philippe - was caused when the\n\tdate is set (with ntpclient for example) after wifidog starts\n\t* Beautified \"Uh oh!\" apology screens and redirection screen\n\n2005-03-02 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Ifdef'd out the bits that are Linux specific if __linux__ is not\n\t  defined.\n\n2005-03-01 Mina Naguib <mina@ilesansfil.org>\n\t* Minor visual tweaks to the web interface\n\n2005-03-01 Philippe April <philippe@ilesansfil.org>\n\t* Tagged v1_1_0_beta3\n\n2005-02-28 Mina Naguib <mina@ilesansfil.org>\n\t* Do not update the last_updated field on incoming traffic - update it on\n\toutgoing traffic only.  This should be a much more reliable indication of\n\tclient no longer being there\n\t* WifiDog status is now viewable with a web browser at\n\thttp://ip:port/wifidog/status\n\t* Added new web hook for http://ip:port/wifidog\n\t* Beautified web interface at http://ip:port/wifidog/*\n\n2005-02-24 Mina Naguib <mina@ilesansfil.org>\n\t* auth_server_request now returns AUTH_ERROR on error instead of AUTH_VALIDATION_FAILED\n\t* centralserver.c: Fix typo (was =+, made it +=) that made the response\n\tfrom the auth server corrupted in memory if the entire response would not\n\tfit in 1 packet and retrieved with 1 read() call\n\t* Better logging of details and calling of mark_* (auth+online/offline)\n\n2005-02-22 Philippe April <philippe@ilesansfil.org>\n\t* Tagged v1_1_0_beta2\n\n2005-02-20 Mina Naguib <mina@ilesansfil.org>\n\t* New safe.c with safe_malloc, safe_strdup, safe_asprintf and\n\tsafe_vasprintf with propper logging and exit when error. Replaced all\n\tinstances of original with safe versions in all files\n\t* Fix memory leak in iptables_fw_counters_update\n\t* Partial merge from CaptiveDNS branch: Consolidated much of the networking\n\tcalls to the auth servers into a magical function called connect_auth_server()\n\tthat's responsible for dns lookup, connecting, marking servers bad, marking\n\tonline/auth_online, and refreshing the firewall rules.\n\t* Partial merge from CaptiveDNS branch: Added new functions mark_auth_online(),\n\tmark_auth_offline() and is_auth_online() - similar in nature to is_online()\n\tetc. except tailored to decide on auth servers status - currently being called by\n\tconnect_auth_server()\n\t* Partial merge from CaptiveDNS branch: Different apology in 404 handler\n\tdepending on whether internet is down or just auth server is down\n\t* Partial merge from CaptiveDNS branch: wdctl status now shows status of\n\tis_online and is_auth_online\n\t* Fixed several inconsistencies regarding the parity and size of\n\tincoming/outgoing counters.  Standardized on \"unsigned long long int\" in\n\tdeclarations and *printf/*scanf formats\n\n2005-02-16 Philippe April <philippe@ilesansfil.org>\n\t* ipkg/rules - When we clean, forgot to delete ipkg-build-stamp\n\n2005-02-15 Mina Naguib <mina@ilesansfil.org>\n\t* Now also reports wifidog_uptime when it pings the server, as well as\n\tshows it in wdctl status\n\n2005-02-13 Mina Naguib <mina@ilesansfil.org>\n\t* Completely re-did the iptables rules.  Most of the rules are now in the\n\tfilter table instead of the nat table.  Also DROPs are now replaced with\n\tREJECTs to help tell the user connection refused instead of endless pauses\n\t* Bugfix: Traffic from client to router was counted twice in the \"outgoing\"\n\tbytecount since it increased both counters in mangle.* and filter.* - Got\n\trid of TABLE_WIFIDOG_WIFI_TO_GW completely since it's unneeded\n\n2005-02-12 Mina Naguib <mina@ilesansfil.org>\n\t* Stricter format rules for all *scan* functions hunting for IPs and MAC addresses\n\t* fw_iptables.c: Make sure scanned IP address is a valid IP address\n\t* firewall.c: Fix memory leak in arp_get\n\t* libhttpd/protocol.c: Abort connection if read non-ascii from client. This\n\tis often a telltale sign of a program such as skype using port 80 for\n\tnon-http requests - this therefore ends the thread as early as possible\n\tinstead of having it lay around for a while trying to get a valid http\n\trequest and taking up resources\n\t* ping_thread.c: When pinging auth server now also sends sys_uptime, sys_memfree\n\tand sys_load\n\t* -v commandline option now shows wifidog version\n\n2005-02-11 Philippe April <philippe@ilesansfil.org>\n\t* Tagged v1_1_0_beta1\n\n2005-02-11 Philippe April <philippe@ilesansfil.org>\n\t* Fixed a bug in counting the traffic between client and gateway\n\t* Alpha8\n\n2005-02-04 Mina Naguib <mina@ilesansfil.org>\n\t* Partially bugfix apology when offline\n\t* ipkg/rules: More tweaking to make it build nicely with recent openwrt\n\tbuildroots\n\n2005-02-03 Mina Naguib <mina@ilesansfil.org>\n\t* Keep track of last times we successfully & unsuccessfully spoke to the\n\tauth server/used DNS. Then, if we know we're not online, show a little\n\tapology to the user instead of re-directing them to the auth server.\n\t* ipkg/rules: Added some extra version detection to auto-detect versions\n\tof kernel, iptables and ipkg-utils instead of having them hardcoded.  This\n\tmakes creating ipkg's work with different OpenWRT releases\n\t* fw_iptables.c: Fixed memory leak caused by not freeing return from\n\tiptables_compile in iptables_load_ruleset\n\t* http.c: Deleted unused call to client_list_find\n\t* http.c: /about URL now shows wifidog version\n\t* Cosmetic typo fixes\n\n2005-02-03 Philippe April <isf_lists@philippeapril.com>\n\t* Ping the users everytime we check their counters, that way we keep them\n\talive\n\t* Optional ExternalInterface\n\t* Optional GatewayAddress (we discover it. finally.)\n\t* We check for the traffic from the clients to the firewall, to catch the\n\ttraffic the icmp ping is generating\n\t* Fixed bug where we were doing the opposite of what desired when checking if authentication server was alive\n\t* Bumped to alpha7\n\n2005-01-23 Philippe April <isf_lists@philippeapril.com>\n\t* wdctl status will return the auth servers in the linked list\n\t* We'll now forward to the auth server to display the used-to-be-ugly\n\tmessages like \"go ahead and validate your account you have 15 minutes\"\n\t* Bumped to alpha6\n\n2005-01-06 Philippe April <philippe@philippeapril.com>\n\t* fw_iptables.c: Changed REJECT to DROP for the end of the table Unknown,\n\t  REJECT doesn't seem to be available in the NAT table.\n\t* fw_iptables.c: Indented things\n\t* fw_iptables.c Fix: Created the authservers table at the beginning and destroy\n\t  at exit time only to avoid recreating it everytime\n\t* Bumped to alpha5\n\n2005-01-05 Philippe April <philippe@philippeapril.com>\n\t* Typo, fixed some spaces (mostly esthetic)\n\t* Bumped to alpha4\n\n2004-12-19 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* src/fw_iptables.c: Tweak of auth_server firewall rule setting\n\t  code. (and promptly undone, fixing the cause is better then\n\t  fixing the symptom)\n\t* src/conf.c: NULL-fill auth_server struct so that\n\t  auth_server->last_ip always equals NULL when first filled.\n\n2004-12-16 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* src/fw_iptables.c: Display iptables command that is run in debug mode.\n\t\n2004-12-07 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* src/firewall.c: Fix reversed incoming and outgoing connections in statistics code\n\t* bump version to alpha3\n\n2004-11-29 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* wifidog.conf: Fixed firewall rule bug.\n\t* src/fw_iptables.c: Unknown user default block rule not \"REJECT\"\n\t  instead of \"DROP\"\n\n2004-11-23 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* src/conf.c: Fixed a NULL pointer dereference in get_ruleset().\n\n2004-11-22 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* libhttpd/api.c: Fix leak in HttpdEndRequest().\n\t* src/ping_thread.c: Fix auth_server IP change code with latest\n\t  from previous branch.\n\t* src/conf.h: Same as above.\n\t* src/fw_iptables.c: Same as above.\n\t* src/conf.[ch]: Firewall rule set parsing code.\n\t* wifidog.conf: Default firewall rule set defined.\n\t* src/fw_iptables.[ch]: Firewall rule set enacting code.\n\t* configure.in: bumped version to 1.1.0-alpha2\n\n2004-11-18 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* src/ping_thread.c: Merge phil's bug fixes from stable branch\n\t* ipkg/rules:  Merge phil's bug fixes from stable branch\n\t* configure.in:  Set version to 1.1.0alpha\n\t\n2004-11-18 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* src/fw_iptables.[ch]: Merged in Phil's patch.\n\t* src/*: Added ping_thread hooks to reset authserver table in the\n\t  firewall if it notices the auth_servers changing IPs.\n\n2004-11-17 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* libhttpd/*: libhttpd has been taken behind the shed and shot in\n\t  the back of the head. The replacement separates the request struct\n\t  from the server struct. It's thread safe if none of OUR threads\n\t  write to server.\n\t* src/*: All the changes to handle the new libhttpd and also to\n\t  move over to a worker thread system. http_callback_auth() no\n\t  longer spawns a thread either.\n\t* *: this update preceded by a cvs tag PRE_NEW_LIBHTTPD.\n\t* *: You want to check the mailing list archive also.\n\n2004-11-10 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* libhttpd/protocol.c: select() based timeout.\n\n2004-10-31 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* configure.in: bumped version number to \"1.0.2-pre1\" since we\n\t  already have ile sans fil hot spots advertising \"1.0.1\".\n\n2004-10-30 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* src/ping_thread.c: asynch read(). fixed bug in byte counting.\n\n2004-10-29 Philippe April <philippe@philippeapril.com>\n\t* ipkg/rules: added conffiles so it does not overwrite config files\n\n2004-10-29 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* src/ping_thread.c: Much new debugging information\n\t* multiple files: Logging for all mutexes\n\n2004-10-28 Philippe April <philippe@philippeapril.com>\n\t* ipkg/rules: building ipkg-tools before packaging\n\n2004-10-28 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* multiple files: Implemented a FirewallRule config command, it\n\t  doesn't actually do anything yet.\n\t* libhttpd: #if 0'd out lots of request parsing code.\n\t* libhttpd: changed URL parsing.\n\n2004-10-27 Philippe April <philippe@philippeapril.com>\n\t* ipkg/rules: removed --build=mipsel from ./configure\n\n2004-10-26 Philippe April <philippe@philippeapril.com>\n\t* ipkg/rules: sed -i is not standard, did a workaround.\n\t* ipkg/rules: openwrt's buildroot has changed, modified ipkg\n\taccordingly, please read README.openwrt\n\n2004-10-22 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* src/various: Added wd_gethostbyname, a thread-safe (serialized)\n\t  version of gethostbyname.\n\n2004-10-15 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* src/auth.c: Fixed hard coded port.\n\n2004-10-09 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* src/gateway.c: More logging on termination_handler.\n\n2004-10-08 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* src/wdctl_thread.c: Fix wdctl_status to return all connected\n\tusers.\n\n2004-10-07 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* src/conf.c: Fixed mark_auth_server_bad() for the case where there\n\tis only one auth server.\n\t* src/ping_thread.c: Added extra debugging.\n\t* src/ping_thread.c: Fixed file descriptor leak.\n\t* src/centralserver.c: Fixed many file descriptor leaks.\n\t* src/centralserver.c: Failure of read() no longer fatal.\n\t* src/centralserver.c: In case of failure, return from\n\tauth_server_request() is no longer an undefined authresponse.\n\t* src/util.c: Fixed typo in logging.\n\t* src/wdctl_thread.c: Added logging when socket path is too long.\n\t* src/debug.c: Debug now logs the time of an event.\n\n2004-08-30 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* wifidog.conf: Corrected an example\n\t* README.openwrt: Typo fixed, editorial changes\n\t* ChangeLog: Benoit's last update entry was set in the future ;-).\n\t* All over src/: Compiled with -Wall and fixed all nagging.\n\n2004-08-30 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* Makefile.am: Add rpm target\n\t* wifidog.spec.in:  Rework spec file.  Now works and include the init script\n\t* ipkg/rules:  Deal with the incomplete init.d system of the OpenWrt.   Install scripts/init.d/wifidog as /usr/bin/wifidog-init, and call wifidog-init start from S65wifidog. \n\t* scripts/openwrt/S65wifidog: Add file\n\t* scripts/init.d/wifidog:  Fix performance and protability problem.  Make it chkconfig compliant.  Test that chkconfig --add wifidog works (at least on mandrake)\n \t* src/wdctl.c:  Change some message, make sure wdctl return 0 unless there is an error.\n\t\n2004-08-30 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* README.openwrt:  Documentation update\n\t* Makefile.am:  Make a ipkg target to ease WRT54G installation\n\t* ipkg/rules:  Add wdctl and the init.d script.\n\t* Add BUILDROOT variable to the build system so we can use it when needed\n\t* src/ping_thread.c:  Have the server ping immediately on boot.  Note that this will only help if the second server responds.  The logic of the ping itself should be changed so it iterates in the list until it finds one that responds or exausts the list\n\t* wifidog.conf:  Add more doc, and (most) of ISF's default config in comments.\n\t* Bump version in anticipation for release\n\n2004-08-29 Guillaume Beaudoin <isf@soli.ca>\n\t* wifidog.spec.in: Changed prefix to match scripts/init.d/wifidog.\n\t* debian/rules: Configuration and init.d file added.\n\t* debian/control: Description and Depends field changed.\n\t* Makefile.am: Added scripts directory and ipkg/rules file.\n\n2004-08-29 Pascal Leclerc <pascal@plec.ca>\n\t* scripts/init.d/wifidog: Startup/shutdown script for Wifidog deamon\n\n2004-08-29 Guillaume Beaudoin <isf@soli.ca>\n\t* wifidog.spec.in: Must be in decending chronological order.\n\n2004-08-29 Guillaume Beaudoin <isf@soli.ca>\n\t* wifidog.spec.in: Remove some leftover from libOFX.\n\t* Makefile.am: Include debian/* files.\n\t* We should now be able to package .deb and .rpm from dist.\n\n2004-08-27 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* README.openwrt,src/conf.c,h:  Documentation update\n\t* src/gateway.c, src/ping_thread.c, src/wdctl.c, src/wdctl_thread.c:  Fix linking problems related to errno.h and extern int errno \n\t\n2004-08-26 Pascal Leclerc <pascal@plec.ca>\n\t* Makefile.am: Remove phpauth from EXTRA_DIST\n\n2004-08-25 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* src/auth.c: Path as changed in 1.26 was preceded by a /, the path already contains a / so it would yield http://host//path/\n\n2004-08-25 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* src/auth.c:  Remove hardcoded path.\n\t\n2004-08-23 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* src/ping_thread.c:  Send the gateway id to the central server during ping, so the server know which gateway checked in, and then knows for sure that it is up (well, once the server implements it...).\n\t\n2004-08-23 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* src/centralserver.c:  Fix path for auth by appending /auth/ to auth_server->authserv_path.  Wifidog works again.\n\t\n2004-08-20 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Debug output of all HTTP transactions and their responses.\n\t* Changed ipkg to use wifidog.conf from the base tree\n\t* Send url to central server for link back out\n\n2004-08-19 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Sort of fixed the hanging thread (with an explicit thread kill)\n\t* Fixed ping code\n\n2004-08-13 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* All Auth Server configuration now handled by the \"AuthServer\" \n\tdirective.\n\t* The \"AuthServer\" directive is now multi line.\n\n2004-08-11 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Added code to do heartbeat.\n\t* Changed AuthServer yet again.\n\n2004-08-09 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* WiFiDog now can read multiple auth servers in its config file.\n\t* Added functions to handle the auth servers list.\n\t* WiFiDog can failover between servers for its internal requests.\n\t* Firewall sets rules for all auth servers.\n\n2004-08-06 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* AuthservPath no longer mandatory in config file.\n\n2004-08-04 Philippe April <wifidog@philippeapril.com>\n    * Renamed iptables.[ch] to fw_iptables.[ch]\n\n2004-08-03 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Fixed broken sockaddr_un usage in wdctl.c and wdctl_thread.c\n\n2004-08-01 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* Delete everything in phpauth, it will now live in it's own module (wifidog-auth)\n\n2004-08-01 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Added wdctl facility\n\n2004-07-21 Philippe April <wifidog@philippeapril.com>\n    * Cleaned up the ipkg makefile\n    * Added makefile to build on Debian\n\n2004-07-19 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Build script for OpenWRT ipkg\n\n2004-07-06 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Added cache control to default error message returned.\n\n2004-07-05 Philippe April <papril777@yahoo.com>\n    * Fixed an endless loop in client_list_delete\n\n2004-06-10 Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Added debugging to libhttpd so that httpdGetConnection() traces\n\t  its execution into ./httpdGetConnection.log. This should be removed\n\t  once it's no longer needed or put within #ifdef DEBUG's.\n\n2004-06-01 Philippe April <papril777@yahoo.com>\n    * Sending User-Agent header to central server\n\n2004-05-28 Philippe April <papril777@yahoo.com>\n    * Fixed bugs implemented after major changes\n\n2004-05-27 Benoit Grégoire  <bock@step.polymtl.ca>\n\t* Massive Doxygen update in all files.  IMPORTANT: The new convention is:  @brief in the .h, long description and parameters in the .c\n\t* Cleaned up some more issues in my notes taken at the formal review\n\t* client_list.c,h:  Make client_list_free_node() private, define and document client_list_mutex here\n\t* config.c:  Start the hunt for evil globals:  Get rid of the config global\n\t* doc/doxygen.cfg.in:  Enable generation of internal doc, a few other tweaks\n\t* Documentation now generates a TODO list and DEPRECATED list, please look at them\n\n2004-05-27  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Cleaned up all the issues brought forward in the code review\n\t  on 2004-05-26 at Benoit's. There are to many changes to list\n\t  individually.\n\n2004-05-15  Philippe April <papril777@yahoo.com>\n    * Commented out cookie handling in libhttpd because it segfaults if\n    you pass a particular formatting/buggy one\n\n2004-05-14  Philippe April <papril777@yahoo.com>\n    * Fixed crash when receiving SIGPIPE signal with write() would fail\n\n2004-05-13  Philippe April <papril777@yahoo.com>\n    * Advertise to the central server when we logged out a user\n\n2004-05-12  Philippe April <papril777@yahoo.com>\n    * Sending a \"stage\" when doing authentication for the server\n    to be able to know if it's a login, or just a counters update.\n\n2004-05-11  Philippe April <papril777@yahoo.com>\n    * Now tracking the hotspot id and ip in database\n\n2004-05-07  Philippe April <wifidog@philippeapril.com>\n    * Now we store both incoming and outgoing counters on server\n    and expire if no activity at all on both\n    * Changed the structure of nodes a little\n\n2004-05-07  Philippe April <wifidog@philippeapril.com>\n    * New parameter ExternalInterface\n    * Made possible to count inbound traffic by inserting new rules\n\n2004-05-07  Philippe April <wifidog@philippeapril.com>\n    * Cleaned up common.h from files\n\n2004-05-07  Philippe April <wifidog@philippeapril.com>\n    * Made iptables' tables DEFINEs instead of being hardcoded\n\n2004-05-07  Philippe April <wifidog@philippeapril.com>\n    * Fixed typo\n\n2004-05-06  Philippe April <papril777@yahoo.com>\n    * Cleanups and standardized things\n\n2004-05-06  Philippe April <papril777@yahoo.com>\n    * Cleanups in fw_counter function\n\n2004-05-05  Philippe April <papril777@yahoo.com>\n    * Calling iptables directly instead of using shell scripts\n    for fw_init, fw_destroy and fw_allow/fw_deny\n    * Removed shell script for fw.counters\n    * Fixed memory leaks\n    * Moved most of the iptables-specific (all but the counters)\n    to iptables.c to modularize a bit more\n    * Hack to allow deciding if we want FW calls' messages quiet or not\n\n2004-04-23  Philippe April <papril777@yahoo.com>\n    * Fixed a debug line\n\n2004-04-22  Philippe April <papril777@yahoo.com>\n    * Major changes, cleaned up code\n    * Changed the way firewall tags traffic\n\n2004-04-21  Philippe April <papril777@yahoo.com>\n    * Changed fw.destroy so it cleans up more in a while loop\n\n2004-04-20  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* fixed expiration time\n\n2004-04-20  Philippe April <papril777@yahoo.com>\n    * A lot of changes regarding debugging facilities and added logging\n    to syslog\n    * Removed possibility to specify port on command line\n\n2004-04-19  Philippe April <papril777@yahoo.com>\n\t* Changed some debugging severity\n\n2004-04-19  Benoit Grégoire  <bock@step.polymtl.ca>\n\t* Properly integrate libhttpd into the source tree ;)  Note that this will create a proper system wide shared library for libghttpd.  Still to be done:  1- Store Mina's patch somewhere,  in case we want to upgrade libhttpd.  2-Add configure option not to build httpd, and use an already installed one.\n\n2004-04-18  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Fixed pthread_cond_timedwait. The mutex needed to be locked as\n\tper the POSIX spec, yet Linux or Mac OS X don't care...\n\t* Fixed the double SIGTERM handler on Linux...\n\n2004-04-17  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Added work around for uClibc bug in auth.c\n\n2004-04-17  Philippe April <papril777@yahoo.com>\n\t* Fixed firewall scripts to make them standard and some firewall functions\n\n2004-04-17  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Updated documentation in firewall.c\n\n2004-04-17  Philippe April <papril777@yahoo.com>\n\t* Fixed path returning to gateway in phpauth/login/index.php\n\n2004-04-16  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Merged in libhttpd into the source tree\n\n2004-04-16  Philippe April <papril777@yahoo.com>\n\t* Fixed CRLF/formatting in phpauth/login/index.php\n\t* Added some documentation for firewall.c, commandline.c\n\t* Removed an unnecessary line dist_sysconf_DATA from Makefile.am\n\n2004-04-15  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Changed the locking mechanism, now all access to t_node * structs\n\tare properly protected.\n\n2004-04-15  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Connection now closed if counter hasn't change for one full\n\tperiod.\n\n2004-04-14  Philippe April <papril777@yahoo.com>\n\t* Fixed shell script hardcoded interface\n\n2004-04-14  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Existing IPs are logged off when they're authenticated again.\n\n2004-04-14  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Fixed clean up so it happens at the right time.\n\n2004-04-14  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Major retooling of insert_userclass(), fixed seg fault.\n\t* The program now works as advertised.\n\n2004-04-14  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Switched to threads. Alpha quality build, at best\n\n2004-04-12  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Changed child return value handling, again. Now it's actually\n\tusing the real value instead of the flag.\n\t* The http.c authentication code now closes the http connection\n\tfrom the user.\n\n2004-04-11  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Added extra debugging information.\n\t* Fixed return value handling in debugging calls.\n\n2004-04-11  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Removed duplicates signal handling hooks\n\t* Additional comments in SIGCHLD handler\n\n2004-04-11  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Node find if's expressions changed\n\n2004-04-11  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* SIGCHLD Handler initializaed outside of deamon mode now.\n\n2004-04-11  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Very large modification. The entire architecture has been reworked\n\tso that authentications to the central server are performed in a\n\tfork()'d child process and the exit code from that child is then\n\tused to set the User Class of the connection.\n\t* The UserClasses (global definitions) and Rights (per connection)\n\thave been integrated.\n\n2004-03-16  Mina Naguib <minaguib@users.sourceforge.net>\n\t* Changed HTTP server tasks to be handled by libhttpd - merged\n\tincorporate_libhttpd branch\n\n2004-03-13  Philippe April <papril777@yahoo.com>\n\t* Modified the way firewall scripts are called so we can configure\n\tthem in the config file (a bit more modular than it was)\n\t* Added simple linked list to keep track of clients and to\n\tkeep a counter of the utilization and send it to the auth server\n\t* Fixed CRLF/formatting in phpauth/auth/index.php\n\t* Hacked phpauth/auth/index.php to handle very basic utilization tracking\n\n2004-03-12  Philippe April <papril777@yahoo.com>\n\t* Changed all perror()s into debug()s and added errno.h to common.h\n\n2004-03-10  Philippe April <papril777@yahoo.com>\n\t* Small fix to firewall.c so we don't define variables after\n\tthe function has started (so it builds on gcc-2.95)\n\n2004-03-09  Philippe April <papril777@yahoo.com>\n\t* Major changes, not forking anymore for new connections, now using\n\tselect() instead. It will allow us to efficiently use a linked list to track\n\tusers and other things. It introduces some bugs and design issues but will\n\tbe better in the end.\n\n2004-03-09  Philippe April <papril777@yahoo.com>\n\t* Small fix in the default.php login page\n\t* exit() where the program was supposed to exit but wasn't when the\n\tfirewall could not be setup\n\n2004-03-09  Alexandre Carmel-Veilleux <acv@acv.ca>\n\t* Tiny change to increase cross-platform compatibility. It can now build on OS X and it comes close to building on my old BSD box.\n\n2004-03-08  Benoit Grégoire  <bock@step.polymtl.ca>\n\t* Initial CVS import.  Integrate a standrad GNU build system and Doxygen to the build process.  Add Doxygen and CVS headers, .cvsignores, etc.  Note that the imported code is Philippe April (papril777 at yahoo.com)'s work.  Tell me if I forgot anything.  Please note that the paths in the src/fw* scripts are still hardcoded.  Don't forget to update the ChangeLog file every commit and add doxygen comments to your code.  Happy hacking.\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/FAQ",
    "content": "#\n# $Id$\n#\n# The latest version of this document lives at:\n# http://www.ilesansfil.org/wiki/WiFiDog/FAQ\n#\n# Please check the above URL if you have a FAQ that does not appear here.\n#\n\nWiFiDog/FAQ\n\nThe WiFi Dog Captive Portal Frequently Asked Questions\n\n   To alleviate the repetition on the [9][WWW] WiFiDog mailing list, and\n   to help people get started quickly, here are the FAQs:\n    1. [10]The WiFi Dog Captive Portal Frequently Asked Questions\n         1. [11]General questions\n              1. [12]What is WiFiDog ?\n              2. [13]Who makes WiFiDog ?\n              3. [14]Who can use WiFiDog ?\n              4. [15]Who currently uses WiFiDog ?\n              5. [16]What can it do ?\n              6. [17]What is it composed of ?\n              7. [18]What are the main differences between it and NoCat ?\n              8. [19]How does it work ?\n              9. [20]What does it run on ?\n             10. [21]Can I write my own client ?\n             11. [22]Can I write my own auth server ?\n             12. [23]What does it look like ?\n         2. [24]The WiFiDog Client\n              1. [25]What do I need ?\n              2. [26]Pre-installation\n              3. [27]Installation\n              4. [28]Configuration\n              5. [29]Running\n              6. [30]Testing\n         3. [31]The WiFiDog client on a linksys WRT54G\n              1. [32]What do I need ?\n              2. [33]Pre-installation\n              3. [34]Installation\n                   1. [35]Introduction\n                   2. [36]Compiling a MIPS-friendly WiFiDog\n                   3. [37]Getting the new MIPS-friendly WiFiDog onto the\n                      router\n                   4. [38]Actual installation\n              4. [39]Configuration, Running and Testing\n              5. [40]The intricate link between WiFiDog and OpenWRT\n              6. [41]I am not comfortable with linux and don't know how\n                 to do all this compiling stuff. Is there an easier way\n                 for me to get the WiFiDog client running on a Linksys\n                 WRT54G ?\n         4. [42]The WiFiDog auth server\n              1. [43]What do I need ?\n              2. [44]Installation\n              3. [45]Configuration\n              4. [46]Testing\n\nGeneral questions\n\nWhat is WiFiDog ?\n\n   [47]WiFiDog is software used to create wireless hotspots. It is a\n   next-generation alternative to [48][WWW] NoCat.\n\nWho makes WiFiDog ?\n\n   The technical team of [49]IleSansFil created and maintains\n   [50]WiFiDog.\n\nWho can use WiFiDog ?\n\n   On the legal/licensing front, anyone can use [51]WiFiDog. It is free\n   software released under the GPL license.\n\n   On the practical front, we would like the answer to also be\n   \"everyone\", however this would not be the truth. The main target user\n   base of [52]WiFiDog is network administrators, hotspot administrators\n   and hackers who \"know what they're doing\". Odds are that an average\n   windows user would not benefit from, or be able to correctly setup and\n   continually administer a [53]WiFiDog installation.\n\n   If the software ever reaches a point of complete point-and-click ease\n   that we feel average users can safely administer, we will update this\n   document.\n\nWho currently uses WiFiDog ?\n\n   The following companies, organizations, groups or persons are known to\n   use [54]WiFiDog on their hotspots:\n     * [55]IleSansFil\n     * [56][WWW] BC Wireless\n\nWhat can it do ?\n\n   See the [57]WiFiDog/FeatureList page for the feature list.\n\nWhat is it composed of ?\n\n   It is composed of 2 components:\n    1. The client is a daemon process - this gets installed on every\n       wireless router\n    2. The auth server is a web application - this gets installed in a\n       central location\n\nWhat are the main differences between it and NoCat ?\n\n   On the client side, it's smaller, has far fewer dependencies, and runs\n   well on embedded devices.\n\n   On the auth server side, it's more customizable, and is geared towards\n   capitalizing the infrastructure for the purposes of building portals\n   and communities.\n\nHow does it work ?\n\n   The client daemon uses firewall rules to control traffic going through\n   the router. When a new user tries to access a web site, the client\n   will transparently re-direct them to the auth server where they can\n   either log-in or sign-up. The client and the auth server then\n   negotiate what to do with the client and either allow or deny them\n   certain network access.\n\n   The client also talks to the auth server every X minutes to update it\n   on vital statistics including uptime, load, traffic count per client,\n   and to let it know it's still there.\n\n   Refer to the [58]WiFiDog/FlowDiagram document for some more details.\n\nWhat does it run on ?\n\n   The client runs on any linux machine that has a working\n   netfilter+iptables installation.\n\n   The auth server runs on any PHP-enabled web server.\n\nCan I write my own client ?\n\n   Sure, but why ? We've done all the work. The client is written in C\n   and is extremely lightweight so that it runs comfortably in embedded\n   environments such as the [59][WWW] Linksys WRT54G router.\n\n   The client is time-tested and is fairly stable. It is used extensively\n   in [60][WWW] IleSansFil's deployed hotspots.\n\nCan I write my own auth server ?\n\n   Again, we've done all the work. However our auth server at the time of\n   this writing is not as polished as the client. Feel free to make it\n   better or write your own from scratch. If you go with the later option\n   you'll have to respect the same protocol the client uses for the whole\n   system to work correctly.\n\nWhat does it look like ?\n\n   The client is a daemon process that runs in the background. It looks\n   like zen, chi, the ether, zilch. It has no user interface.\n\n   The auth server is a web application that can be customized via\n   templates to look however you want it to look. To check out\n   [61]IleSansFil's auth server installation see [62][WWW]\n   https://auth.ilesansfil.org\n\nThe WiFiDog Client\n\nWhat do I need ?\n\n    1. Basic proficiency in a linux environment\n    2. A linux OS with netfilter compiled into the kernel\n    3. The iptables package\n    4. The GNU C compiler (gcc). Other compilers may work, but we have\n       not tested and will not support them.\n    5. The latest [63]WiFiDog tarball which can be obtained from\n       [64][WWW] SourceForge\n\nPre-installation\n\n   This is where a lot of people run into problems, so let's state this\n   in bold:\n\n   MAKE SURE EVERYTHING WORKS FIRST BEFORE INTRODUCING [65]WiFiDog INTO\n   THE ENVIRONMENT\n\n   That especially means:\n     * The router must boot properly\n     * The router must bring up the interfaces properly\n     * The router must set up the routes properly\n     * The router must connect to the internet properly\n     * DNS settings must be set or obtained properly. DNS must work.\n     * DHCP settings (client, server or both) must be set or obtained\n       properly.\n     * If using NAT, the router must setup NAT/masquerading rules with\n       iptables properly\n     * Clients on the desired ([66]WiFi) network must be able to bind,\n       associate, lease and connect the internet properly\n     * All the above must happen automatically when the router starts or\n       gets rebooted\n\n   Do NOT proceed with installing [67]WiFiDog until you've satisfied the\n   above. It will not work otherwise and you will waste lots of time.\n\nInstallation\n\n   [68]WiFiDog, like many open source projects, is distributed with\n   standard autotools utilities to make installation easy. Unpack the\n   tarball, then follow the standard:\n./configure\nmake\nmake install\n\nConfiguration\n\n   Edit /etc/wifidog.conf and follow the instructions in the file. Things\n   should be self-explanatory.\n\nRunning\n\n   For the first time, run [69]WiFiDog with the following switches:\nwifidog -f -d 7\n\n   -f means to run in foreground (do not become a background daemon)\n\n   -d 7 increases debug output level to the maximum\n\nTesting\n\n   As a client on the [70]WiFi network (or whatever interface is\n   configured as the LAN interface in /etc/wifidog.conf), open a web\n   browser and try to browse to your favourite web site.\n\n   Monitor the output of the running [71]WiFiDog to see what it's doing.\n\nThe WiFiDog client on a linksys WRT54G\n\n   Due to the lightness of the [72]WiFiDog client it is often installed\n   inside the linksys WRT54G. There are some profound issues that arise\n   with this setup that it warrants its own section in this FAQ:\n\nWhat do I need ?\n\n   You will need to have basic/full proficiency in a linux environment\n\n   You need to re-flash your router with a hacker-friendly firmware\n   called [73][WWW] OpenWRT. [74][WWW] Follow the user guide on the\n   OpenWRT site to get this part done.\n\n   Do not proceed until you've completed the above. We also recommend you\n   spend some time familiarizing yourself with your new router's OS\n   before introducing [75]WiFiDog into that environment. This especially\n   includes the nvram settings, network interfaces and existing interface\n   bridges.\n\nPre-installation\n\n   The same rules apply as the pre-installation in a non-WRT54G\n   environment above. Do not proceed until you've satisfied them. In\n   summary: Make sure EVERYTHING works first.\n\nInstallation\n\nIntroduction\n\n   Installation of the client on the WRT54G is a bit tricky. The space\n   limitations on the device mean there is no compiler in the OpenWRT\n   operating system. That means that you must compile the client on an\n   external machine then transfer the compiled form onto the router.\n\n   To complicate things more, if you compile your client regularly on a\n   standard x86 desktop the produced binary will not run on the router\n   due to the different type of processor (MIPS) on that router.\n\n   What is needed is called cross-compilation, In that scenario you use\n   an architecture (such as your x86 desktop) to produce binaries\n   explicitly designed to run on a different architecture (your MIPS\n   router).\n\n   The above was the bad news since it makes things sound complicated.\n   The good news is that it's not too complicated and we've built scripts\n   to make this a snap for you. As a matter of fact, you've already done\n   this before!\n\n   Remember when you followed the OpenWRT building instructions ? Without\n   knowing it, you already cross-compiled stuff! You used your desktop to\n   cross-compile an entire operating system for the MIPS architecture\n   which resulted in one compressed firmware image you installed on your\n   router.\n\nCompiling a MIPS-friendly WiFiDog\n\n    1. Download the latest [76][WWW] WiFiDog tarball from sourceforge.\n    2. Uncompress the tarball, enter the directory\n    3. Run the following, replacing /usr/local/openwrt/ with wherever you\n       unpacked the OpenWRT tarball earlier:\n\nipkg/rules BUILDROOT=/usr/local/openwrt/\n\n   You're done. If all is well you should now have a new file named\n   wifidog_1.1.0_mipsel.ipk (version number may be different depending on\n   the tarball you downloaded).\n\nGetting the new MIPS-friendly WiFiDog onto the router\n\n   The .ipk is a data file for the simple \"ipkg/i-Package\" package\n   manager already on your router. All that's needed now is to copy that\n   file onto your router. If you have installed the dropbear SSH daemon\n   package on your router you can use scp on your desktop to copy the\n   .ipk file to the router. Otherwise copy that file to any web server\n   you have access to, then use wget on the router to download the file\n   from the web server.\n\n   Either way, place the file in the /tmp/ directory on the router.\n\nActual installation\n\n   Once you have the .ipk file on the router, use this command to install\n   it:\nipkg install /tmp/wifidog_1.1.0_mipsel.ipk\n\n   Once that is successful delete the .ipk file from /tmp/ to free the\n   occupied memory.\n\nConfiguration, Running and Testing\n\n   Same as the earlier section in a non-WRT54G environment\n\nThe intricate link between WiFiDog and OpenWRT\n\n   Repeat after me:\n\n   A [77]WiFiDog RUNNING ON AN OpenWRT INSTALLATION MUST HAVE BEEN\n   COMPILED AGAINST THE SAME OpenWRT BUILDROOT USED TO CREATE THAT\n   INSTALLATION\n\n   What does that mean ?\n    1. If you downloaded and compiled OpenWRT yourself, download and\n       compile [78]WiFiDog yourself against the same buildroot - Do not\n       use someone else's pre-compiled [79]WiFiDog\n    2. If you downloaded a pre-compiled OpenWRT firmware image:\n         1. Ask the person who built it to compile [80]WiFiDog for you\n            against the same buildroot\n         2. Or ask them for a copy of their OpenWRT buildroot so you may\n            compile [81]WiFiDog against it\n\nI am not comfortable with linux and don't know how to do all this compiling\nstuff. Is there an easier way for me to get the WiFiDog client running on a\nLinksys WRT54G ?\n\n   You can use an OpenWRT and [82]WiFiDog compiled by someone else. They\n   must be compiled by the same person against the same OpenWRT\n   buildroot.\n\n   [83]IleSansFil makes it's own pair of OpenWRT images and [84]WiFiDog\n   .ipk compiled files available to the public:\n     * You can download a pre-compiled OpenWRT firmware image [85][WWW]\n       here\n     * And you can download a compatible [86]WiFiDog .ipk file [87][WWW]\n       here\n\n   Look in the [88][WWW] OpenWRT site for instructions on how to re-flash\n   your router with the firmware image (skip any download/building\n   instructions).\n\n   Then follow the above installation instructions for installing the\n   [89]WiFiDog .ipk file into the OpenWRT-flashed router.\n\n   Please note that the above saves you from the knowledge and time\n   needed to compile and produced these binary files. It is however no\n   magical cure for linux illiteracy. You need to be proficient enough in\n   a unix environment to be able to telnet/ssh into the router and\n   perform the outlined installation and configuration tasks. If you do\n   not feel comfortable doing this we advise you consult with someone who\n   is proficient in linux and networking.\n\nThe WiFiDog auth server\n\nWhat do I need ?\n\n   Refer to [90]WiFiDog/AuthServerDoc\n\nInstallation\n\n   Refer to [91]WiFiDog/AuthServerDoc\n\nConfiguration\n\n   Refer to [92]WiFiDog/AuthServerDoc\n\nTesting\n\n   Refer to [93]WiFiDog/AuthServerDoc\n\n   last edited 2005-03-27 13:11:15 by [94]MinaNaguib\n\nReferences\n\n   1. http://www.ilesansfil.org/wiki/FrontPage\n   2. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=raw\n   3. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print\n   4. http://www.ilesansfil.org/wiki/WiFiDog\n   5. http://www.ilesansfil.org/wiki/FindPage\n   6. http://www.ilesansfil.org/wiki/TitleIndex\n   7. http://www.ilesansfil.org/wiki/WordIndex\n   8. http://www.ilesansfil.org/wiki/HelpOnFormatting\n   9. http://listes.ilesansfil.org/\n  10. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-b9d27a8844e66371abfbb27bf54669896d8bf4fa\n  11. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-eb7dd5c81583187efb2d29ebc9ab2b6457417b13\n  12. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-e05420efb19364f3fa0844223f1bcfc71be7db00\n  13. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-80293173c84355ebeff2ecbfabaa32edb3c3ae75\n  14. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-2aa554753e8b93818ba5ef190e67e401421931b9\n  15. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-975f3574aa59265dd2b0c45ae96e90c98c8bc7d5\n  16. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-dccf73ff2dcc305d6334dfd0ed90d1c4221b8a12\n  17. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-ebd81c14ab1b66d6aada9fc399597b644e120036\n  18. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-9b4c49acb692c6ba8bc2c0e43a991c5fc7b80220\n  19. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-5aa44a01d2ff78d1e2b5240e0a6c75910d584a0e\n  20. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-738ab14de6f62065ca3daf9dd3341bfcabc06223\n  21. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-6059fbd6c262224baf06331fbe83f319ffe730fa\n  22. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-e8131f271e42589291d507afd89d0c5d24f02ad1\n  23. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-6a764a3be722e0ff8d1446586643ea57d70cd489\n  24. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-a650736551182819fd6f742597362be729d9b70d\n  25. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-57aaa0d1e21d38a7f5bedea65950c36b422cbbb6\n  26. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-2b75ffe2445295c9982d0873d48e11d5cd89816e\n  27. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-930f69b528374c4c55fc91b52e030deef8a93648\n  28. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-4b221edbf4c2383afab601694f2db039700c21cc\n  29. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-9fcf91fbcf4712b6de6d5b70e703192dd882afa8\n  30. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-18cc26d84a97b42f3bc06af0203038062a8efb06\n  31. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-8ba37f479842312562f131032bb11e4fb68942aa\n  32. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-57aaa0d1e21d38a7f5bedea65950c36b422cbbb6-2\n  33. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-2b75ffe2445295c9982d0873d48e11d5cd89816e-2\n  34. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-930f69b528374c4c55fc91b52e030deef8a93648-2\n  35. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-b6830b2e74230b45153f4fa98ee189d5748ec9f0\n  36. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-78504516e51f8fc43cc111b9a8a41a85cb652fff\n  37. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-92221794cfda95baa91352d087656f27754027d2\n  38. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-2474f5bb689b7b06fc3334eb8e29a26ed60c4280\n  39. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-37c9cfe0aa830fa8ef3e6f617bd3c741cca6947c\n  40. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-1dee9a0f840701e6518a0763c48aef734d1996f8\n  41. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-158e6f354a348c9374107d0a66a7f4c84603ba8a\n  42. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-30106563831cfdb0840b05fa48e9194d7876f12e\n  43. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-57aaa0d1e21d38a7f5bedea65950c36b422cbbb6-3\n  44. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-930f69b528374c4c55fc91b52e030deef8a93648-3\n  45. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-4b221edbf4c2383afab601694f2db039700c21cc-2\n  46. http://www.ilesansfil.org/wiki/WiFiDog/FAQ?action=print#head-18cc26d84a97b42f3bc06af0203038062a8efb06-2\n  47. http://www.ilesansfil.org/wiki/WiFiDog\n  48. http://nocat.net/\n  49. http://www.ilesansfil.org/wiki/IleSansFil\n  50. http://www.ilesansfil.org/wiki/WiFiDog\n  51. http://www.ilesansfil.org/wiki/WiFiDog\n  52. http://www.ilesansfil.org/wiki/WiFiDog\n  53. http://www.ilesansfil.org/wiki/WiFiDog\n  54. http://www.ilesansfil.org/wiki/WiFiDog\n  55. http://www.ilesansfil.org/wiki/IleSansFil\n  56. http://www.bcwireless.net/\n  57. http://www.ilesansfil.org/wiki/WiFiDog/FeatureList\n  58. http://www.ilesansfil.org/wiki/WiFiDog/FlowDiagram\n  59. http://www.linksys.com/products/product.asp?prid=508&scid=35\n  60. http://auth.ilesansfil.org/hotspot_status.php\n  61. http://www.ilesansfil.org/wiki/IleSansFil\n  62. https://auth.ilesansfil.org/\n  63. http://www.ilesansfil.org/wiki/WiFiDog\n  64. http://sourceforge.net/projects/wifidog\n  65. http://www.ilesansfil.org/wiki/WiFiDog\n  66. http://www.ilesansfil.org/wiki/WiFi\n  67. http://www.ilesansfil.org/wiki/WiFiDog\n  68. http://www.ilesansfil.org/wiki/WiFiDog\n  69. http://www.ilesansfil.org/wiki/WiFiDog\n  70. http://www.ilesansfil.org/wiki/WiFi\n  71. http://www.ilesansfil.org/wiki/WiFiDog\n  72. http://www.ilesansfil.org/wiki/WiFiDog\n  73. http://openwrt.org/\n  74. http://openwrt.org/OpenWrtDocs\n  75. http://www.ilesansfil.org/wiki/WiFiDog\n  76. http://sourceforge.net/projects/wifidog\n  77. http://www.ilesansfil.org/wiki/WiFiDog\n  78. http://www.ilesansfil.org/wiki/WiFiDog\n  79. http://www.ilesansfil.org/wiki/WiFiDog\n  80. http://www.ilesansfil.org/wiki/WiFiDog\n  81. http://www.ilesansfil.org/wiki/WiFiDog\n  82. http://www.ilesansfil.org/wiki/WiFiDog\n  83. http://www.ilesansfil.org/wiki/IleSansFil\n  84. http://www.ilesansfil.org/wiki/WiFiDog\n  85. http://www.ilesansfil.org/dist/openwrt/\n  86. http://www.ilesansfil.org/wiki/WiFiDog\n  87. http://www.ilesansfil.org/dist/wifidog/\n  88. http://www.openwrt.org/\n  89. http://www.ilesansfil.org/wiki/WiFiDog\n  90. http://www.ilesansfil.org/wiki/WiFiDog/AuthServerDoc\n  91. http://www.ilesansfil.org/wiki/WiFiDog/AuthServerDoc\n  92. http://www.ilesansfil.org/wiki/WiFiDog/AuthServerDoc\n  93. http://www.ilesansfil.org/wiki/WiFiDog/AuthServerDoc\n  94. http://www.ilesansfil.org/wiki/MinaNaguib\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/Makefile.am",
    "content": "# $Id$\n\nSUBDIRS = libhttpd src . doc \n\ndocdir = ${prefix}/share/doc/wifidog-@VERSION@\n\ndoc_DATA = \\\n  AUTHORS \\\n  COPYING \\\n  NEWS \\\n  README \\\n  ChangeLog\n  \nEXTRA_DIST = \\\n  FAQ \\\n  wifidog.spec.in \\\n  wifidog.spec \\\n  config \\\n  scripts \\\n  contrib \\\n  wifidog.conf\n\n.PHONY: doc\ndoc:\n\t$(MAKE) -C doc doc\n\t\n.PHONY: whiterussianipk\nwhiterussianipk: dist\n\tmake -C $(OPENWRTSDK) distclean\n\tmkdir -p  $(OPENWRTSDK)/dl\n\tcp -f ${srcdir}/wifidog-@VERSION@.tar.gz $(OPENWRTSDK)/dl/\n\tmake -C ${srcdir}/contrib/build-openwrt-whiterussianipk/wifidog TOPDIR=$(OPENWRTSDK) PKG_MD5SUM= V=99\n\t@echo DONE.  If there were no errors, your package should be in: $(OPENWRTSDK)/bin/packages/\n\n.PHONY: kamikazeipk\nkamikazeipk: dist\n\tmake -C $(OPENWRTSDK) distclean\n\tmkdir -p  $(OPENWRTSDK)/dl\n\tcp -f ${srcdir}/wifidog-@VERSION@.tar.gz $(OPENWRTSDK)/dl/\n\tmake -C ${srcdir}/contrib/build-openwrt-kamikazeipk/wifidog TOPDIR=$(OPENWRTSDK) PKG_MD5SUM= V=99 SDK=1 DEVELOPER=1\n\t@echo DONE.  If there were no errors, your package should be in: $(OPENWRTSDK)/bin/packages/\n\n.PHONY: rpm\nrpm: dist\n\tcp ${builddir}wifidog.spec /usr/src/RPM/SPECS\n\tcp ${builddir}wifidog-@VERSION@.tar.gz /usr/src/RPM/SOURCES\n\trpmbuild -ta ${builddir}wifidog-@VERSION@.tar.gz\n\n#clean-local:\n#\techo \"clean-local: \" && pwd\n#\trm -f /usr/src/RPM/SPECS/wifidog.spec\n#\trm -f /usr/src/RPM/SOURCES/wifidog-@VERSION@.tar.gz\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/NEWS",
    "content": "# $Id$\nWiFiDog 1.1.5:\n\t* First supported version on OpenWRT kamikaze\n\nWiFiDog 1.1.4:\n\t* Fix incorrect firewal rule deletion introduced in 1.1.3rc1.  Caused the incoming byte count reported to be incorrect for users that logged in a second time on a gateway that wasn't restarted in between.\n\nWiFiDog 1.1.3:\n\t* Fix incomplete change to make te gateway retry external interface forever.\n\t* Remove hardcoded authserver paths.  Can now be defined in the config file (auth server section).\n\t* Add manual logout URL, based in part on work by David Bird\n\nWiFiDog 1.1.3rc1:\n\t* Close #321:  Make the Gateway retry forever if it cannot find it's interface.  You never know when someone may finally replug the network cable or something...\n\t* Close #332:  Apply patch from Laurent Marchal. biguphpc<AT>gmail<DOT>com\n\t* fw_iptables.c:  Fix error in iptables_fw_access().  Rules were created as ACCEPT instead of DROP\n\t* firewall.c:  Fix bug in fw_sync_with_authserver().  The traffic for the validation period of a user who validated his account while connected wouldn't get counted.\n\t* doc/wifidog_firewall_map.dia:  At long last, full documentation of the firewall.  We would have avoided a lot of stupid mistakes if we produced that sooner.\n\t* Release 1.1.3_rc1\n\t* Fix #324\n\t* wifidog.conf:  Improve comments and add examples of blocking access to the upstream LAN.\n\t* conf.h:  The DEFAULT_CHECKINTERVAL was 5 instead of 60 (as stated in the config file) which caused huge needless load on the auth servers, and needless ping traffic towards the clients if it wasn't manually set.\n\t* contrib/ Add contrib dir to collect the scripts and other code distributed with, but not really part of wifidog.\n\t* Modify the build system to finally be able to build wifidog directly from the wifidog directory using the same files \n\t\tused to make the official .ipk, without having to copy ANYTHNG to the openwrt SDK.\n\t\tThere is now a new target:  make ipk make ipk OPENWRTSDK=path_to_openwrt_sdk\n\t\t\t\nWiFiDog 1.1.3beta6:\n\t-Fix bug #238 (config file location was hardcoded)\n\t-Fix problem with autodectection of the External interface if the interface isn't fully up yet.  wifidog wil now retry for up to two minutes.\n\nWiFiDog 1.1.3beta4:\n\t-Changed ordering in the filter.FORWARD chain\n\t-Added TCPMSS rule\n\t-Fixed rules bieng left over on shutdown\n\t-Fixed wdctl reset problem\n\nWiFiDog 1.1.3beta2:\n\t-Fix bug #65 (Whitelisted servers would still splash on port 80\n\t-Fix incorrect default value for Path in the AuthServer configuration\n\t-Add more info to wdctl status\n\nWiFiDog 1.1.3beta1:\n\t-Added patch by wireless London to use the GW interface's mac address as the node_id\n\t  if no node_id is specified. It allows the use of generic configuration files without\n\t  the need to hardcoding the node_id in.\n\t-Added TrustedMACList configuration variable which allows specifying\n\t  MAC addresses which are allowed to go through without authentication.\n\t-New wdctl command \"restart\" which will get wifidog to restart itself\n\t  while preserving the existing clientlist.  Perfect for 0-downtime\n\t  upgrading!\n\t-libhttpd: Fixed two bugs parsing the GET query string making wifidog segfault\n\t  \n\t\nWiFiDog 1.1.2:\n    - Added some informations so it compiles on newer OpenWRT's (whiterussian-rc2)\n    - Fixed minor issue with wdctl\n    - Changed the iptables rules priority to allow existing NAT rules to work\n    - read()s from central server in auth_server_request() are\n        now timed-out (via select).  This is hopefully a bugfix to the\n        thread-freezing problem.\n    - Bugfix non-RFC compliant HTTP requests using \\n instead of \\r\\n as line\n        terminations as per email from ludocornut@users.sourceforge.net\n    - Firewall: make the default ruleset for validating users = allow all\n        (except sending SMTP)\n\nFixed issue with FAQ\n\nWiFiDog 1.1.1:\n    - An auth server on port 80 will now work\n    - Added an FAQ\n\nWiFiDog 1.1.0:\n\t- Changes:\n\t\t- Visual tweaks in the web interface\n\t\t- Internal code & documentation touch-ups\n\t\t- More debugging output\n\t- Bugfixes:\n\t\t- Wrong reported uptime\n\t\t- Invalid http header sent during redirection\n\t\t- Mixed long/long long type for counter\n\t\t- Respect SSL setting in auth server definition\n\t\t- Explicitly allow traffic coming into the router\n\t\t- SIGPIPE handling\n\t\t- Firewall destruction not occuring on wifidog termination\n\nWiFiDog 1.1.0_beta3:\n\t- Completely re-did the iptables rules.  Most of the rules are now in the filter table instead of the nat table.  Also DROPs are now replaced with REJECTs to help tell the user connection refused instead of endless pauses\n\t- wdctl status will return more informations\n\t- Some error messages are now displayed by the auth server (used to be done in a non-pretty way by wifidog)\n\t- We now 'ping' authserver and detect when authservers are changing IPs\n\t- Fixed memory leaks\n\t- Incoming and outgoing counters were reversed\n\t- More verbose debugging\n\t- ICMP Ping the users everytime we check their counters to keep them alive\n\t- Optional ExternalInterface\n\t- Optional GatewayAddress\n\t- /about URL now shows wifidog version\n\t- Keep track of last times we successfully & unsuccessfully spoke to the auth server/used DNS. Then, if we know we're not online, show a little apology to the user instead of re-directing them to the auth server.\n\t- When pinging auth server now also sends sys_uptime, sys_memfree and sys_load\n\t- Bugfix: Traffic from client to router was counted twice in the \"outgoing\" bytecount since it increased both counters in mangle.* and filter.* - Got rid of TABLE_WIFIDOG_WIFI_TO_GW completely since it's unneeded\n\t- Do not update the last_updated field on incoming traffic - update it on outgoing traffic only.  This should be a much more reliable indication of client no longer being there\n\t- WiFiDog status is now viewable with a web browser at http://ip:port/wifidog/status\n\nWiFiDog 1.0.2:\n\t- Fix reversed incoming and outgoing connections in statistics reported to the auth server\n\t- Will now gracefully handle auth servers changing IP adress.\n\t- Fixes two bugs in byte counting. (Possible missed data, and incoming and outgoing were reversed.\n\t- Fixed file descriptor leaks\n\t- wdctl_status now returns all connected users.\n\t- worked around sed -i not being available on all platform\n\t- ipkg no longuer overwrites config file\n\t- Several code changes in thread handling and libhttpd to fix occasional hangs.\n\nWiFiDog 1.0.0:\n\t- Initial release\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/README",
    "content": "#\n# $Id$\n#\n\nThe WiFi Guard Dog project is a complete and embeddable captive portal\nsolution for wireless community groups or individuals who wish to open a\nfree HotSpot while still preventing abuse of their Internet connection.\n\nThe project's homepage is:\n\thttp://dev.wifidog.org/\n\nMailing list interface:\n\thttp://listes.ilesansfil.org/cgi-bin/mailman/listinfo/wifidog\n\nThe project's software is released under the GPL license and is copyright it's respective owners.\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/README.openwrt",
    "content": "$Id$\n\nOpenWRT specific README\n=======================\n\nSo, you want to run wifidog on one of linksys's WRT wireless routers!\n\nOpenWRT is the embedded linux-gnu bundle that runs on the linksys WRT\nseries routers (among numerous others).\n\nOpenWRT's home page is http://openwrt.org/\n\n---- I just want to RUN the thing: ----\n-DO NOT use the wifidog packages distributed by OpenWRT (you are asking for trouble, they are broken in various ways; you will get no support if you do)\n-Use the official wifidog packages on sourceforge (currently only available for whiterussian.\n\n---- I want to develop and test on OpenWRT ----\n\nTo build wifidog so that it may be run on the linksys wrt routers you\nmust first obtain the OpenWRT toolchain.  This toolchain is a set of\ncompilers and other software development tools that will allow you,\nrunning on your intel/pentium/mac computer to compile and develop software\nthat is to run on the mips based linksys wrt series routers, which is\nbased on another computer cpu chip entirely.\n\nYou have several options for building wifidog using the OpenWRT toolchain.\n\nOption 1. get the prebuilt, minimal OpenWRT toolchain (The OpenWRT SDK), and give the makefile it's path.  This is the best option, assuming you have a x86_64 Os (the SDK is distributed only for x86_64).\n\nFor OpenWRT 0.9 (Whiterussian):\n\tcd ~ \n\twget http://downloads.openwrt.org/whiterussian/newest/OpenWrt-SDK-Linux-i686-1.tar.bz2\n\ttar -jxvf OpenWrt-SDK-Linux-i686-1.tar.bz2\n\tcd wifidog\n\tmake whiterussianipk OPENWRTSDK=~/OpenWrt-SDK-Linux-i686-1/\n\nFor OpenWRT Kamikaze up till 7.09:\n\tcd ~ \n\twget http://downloads.openwrt.org/kamikaze/7.09/brcm-2.4/OpenWrt-SDK-brcm-2.4-for-Linux-x86_64.tar.bz2\n\ttar -jxvf OpenWrt-SDK-brcm-2.4-for-Linux-x86_64.tar.bz2\n\tcd wifidog\n\tmake kamikazeipk OPENWRTSDK=~/OpenWrt-SDK-brcm-2.4-for-Linux-x86_64\n\t\nFor OpenWRT Kamikaze 8.09 and up, there is no SDK available and the 7.09 SDK does not work.  So Option 1 is not an option.  Option 2 is not an option either since building the SDK did not seem to work (https://forum.openwrt.org/viewtopic.php?id=17879).  So jump to Option 3!\n\n   If it works (!) you will have an ipkg file in $(OPENWRTSDK)/bin/packages/\n   You can then boot up your OpenWrt\n   router, copy the .ipk to it, and install it using the ipkg commands.\n\n   You should also make sure that the wifidog prereqs are already\n   installed on the router before you try to run wifidog.  Note that if you build the \n   packages with the instructions above, they will download the required dependencies auomatically (if you have an internet connecion on yout router) and will refuse to install without them.\n\n   The prereqs are:\n   * iptables command and modules mac, mark and MARK\n   * iptables kernel module mac\n   * libpthread\n\n   These are all packages you can install on your running OpenWrt router\n   using the ipkg commands.  If the router is on the net, the ipkg\n   commands can download the packages from www.openwrt.org, just like\n   debian apt-get or fedora yum or up2date.\n\nOption 2. Build your own SDK (or find someone to do it for you)\ncd ~\nwget http://downloads.openwrt.org/kamikaze/7.09/kamikaze_7.09.tar.bz2\ntar -jxvf kamikaze_7.09.tar.bz2\ncd kamikaze_7.09\nmake menuconfig #(Make sure you build the SDK in \"special targets\")\nmake #(could take hours downloading and compiling all dependencies)\nFollow the instructions in Option 1, using the SDK you build instead of downloading it.\n\nOption 3. Use the full buildroot directly (time consuming...)\n   cd wifidog\n   make dist\n   cd ~\n   wget http://downloads.openwrt.org/kamikaze/7.09/kamikaze_7.09.tar.bz2\n   tar -jxvf kamikaze_7.09.tar.bz2\n   cp -R wifidog/contrib/build-openwrt-kamikazeipk/wifidog kamikaze_7.09/package/\n   cp wifidog/wifidog-1.1.5.tar.gz kamikaze_7.09/dl/\n   cd kamikaze_7.09\n   make menuconfig #(Follow instructions on OpenWRT's site to setup your buildroot for your platform)\n   make #(could take hours downloading and compiling all dependencies)\n\nFor Kamikaze 8.09 and up, there is an extra dependency to add to the package, so here would be the new procedure\n   cd wifidog\n   make dist\n   cd ~\n   wget http://downloads.openwrt.org/kamikaze/8.09/kamikaze_8.09.tar.bz2\n   tar -jxvf kamikaze_8.09.tar.bz2\n   cp -R wifidog/contrib/build-openwrt-kamikazeipk8.09up/wifidog kamikaze_8.09/package/\n   cp wifidog/wifidog-1.1.5.tar.gz kamikaze_8.09/dl/\n   cd kamikaze_8.09\n   make menuconfig #(Follow instructions on OpenWRT's site to setup your buildroot for your platform)\n   make #(could take hours downloading and compiling all dependencies)\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/autogen.sh",
    "content": "#!/bin/sh\n# Run this to generate all the initial makefiles, etc.\n#\n# $Id$\n\nif [ -r Makefile ]\nthen\n\techo \"Doing distclean\"\n\tmake distclean\nfi\n\nif [ \"X$1\" != \"X\" ]\nthen\n\tBUILDROOT=`echo \"$1\" | sed 's/^[^=]*[=]//'`\n\n\tOLDCC=${CC}\n\tOLDRANLIB=${RANLIB}\n\tOLDAR=${AR}\n\n\tCC=${BUILDROOT}/build_mipsel/staging_dir/bin/mipsel-linux-uclibc-gcc\n\tRANLIB=${BUILDROOT}/build_mipsel/staging_dir/bin/mipsel-linux-uclibc-ranlib\n\tAR=${BUILDROOT}/build_mipsel/staging_dir/bin/mipsel-linux-uclibc-ar\n\n\tPOSTCONF=--host=mipsel\n\n\texport CC\n\texport RANLIB\n\texport AR\nelse\n\tOLDCC=${CC}\n\tOLDRANLIB=${RANLIB}\n\tOLDAR=${AR}\n\tPOSTCONF=\nfi\n\necho \"Running mkdir -p config\"\nmkdir -p config\n\nif [ \"X\"`uname` = \"XDarwin\" ]\nthen\n\techo \"Running glibtoolize --force\"\n\tglibtoolize --force\nelse\n\techo \"Running libtoolize --force\"\n\tlibtoolize --force\nfi\n\necho \"Running aclocal\"\naclocal\necho \"Running autoheader\"\nautoheader\necho \"Running automake -a\"\nautomake -a\necho \"Running autoconf\"\nautoconf\necho \"Running ./configure ${POSTCONF} --enable-maintainer-mode  $conf_flags $@\"\n./configure ${POSTCONF} --enable-maintainer-mode $conf_flags \"$@\"\n\nCC=${OLDCC}\nRANLIB=${OLDRANLIB}\nAR=${OLDAR}\n\nexport CC\nexport RANLIB\nexport AR\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/configure.in",
    "content": "## -*-m4-*-\n# $Id$\n\ndnl Process this file with autoconf to produce a configure script.\n\n# FILE:\n# configure.in\n#\n# FUNCTION:\n# implements checks for a variety of system-specific functions\n\nAC_INIT(src/common.h)\nAM_CONFIG_HEADER(config.h)\nAC_CONFIG_AUX_DIR(config)\nAC_PROG_CC\nAC_PROG_CXX\n#AC_PROG_RANLIB\n\nAC_SUBST(BUILDROOT)\n\nWIFIDOG_MAJOR_VERSION=1\nWIFIDOG_MINOR_VERSION=1\nWIFIDOG_MICRO_VERSION=5\nWIFIDOG_VERSION=20130917\n\nAC_SUBST(WIFIDOG_MAJOR_VERSION)\nAC_SUBST(WIFIDOG_MINOR_VERSION)\nAC_SUBST(WIFIDOG_MICRO_VERSION)\nAC_SUBST(WIFIDOG_VERSION)\nAM_INIT_AUTOMAKE(wifidog,$WIFIDOG_VERSION)\n\n\nAM_MAINTAINER_MODE\n\nAC_PROG_INSTALL\n\nAC_LIBTOOL_DLOPEN\nAM_PROG_LIBTOOL\n\nAC_ISC_POSIX\nAC_C_BIGENDIAN\nAC_PROG_MAKE_SET\nAC_HEADER_STDC\n\n \n# check for doxygen, mostly stolen from http://log4cpp.sourceforge.net/\n# ----------------------------------------------------------------------------\nAC_DEFUN([BB_ENABLE_DOXYGEN],\n[\nAC_ARG_ENABLE(doxygen, [  --enable-doxygen        enable documentation generation with doxygen (auto)])\nAC_ARG_ENABLE(dot, [  --enable-dot            use 'dot' to generate graphs in doxygen (auto)])              \nAC_ARG_ENABLE(html-docs, [  --enable-html-docs      enable HTML generation with doxygen (yes)], [], [ enable_html_docs=yes])              \nAC_ARG_ENABLE(latex-docs, [  --enable-latex-docs     enable LaTeX documentation generation with doxygen (no)], [], [ enable_latex_docs=no])              \nif test \"x$enable_doxygen\" = xno; then\n        enable_doc=no\nelse \n        AC_PATH_PROG(DOXYGEN, doxygen, , $PATH)\n        if test x$DOXYGEN = x; then\n                if test \"x$enable_doxygen\" = xyes; then\n                        AC_MSG_ERROR([could not find doxygen])\n                fi\n                enable_doc=no\n        else\n                enable_doc=yes\n                AC_PATH_PROG(DOT, dot, , $PATH)\n        fi\nfi\nAM_CONDITIONAL(DOC, test x$enable_doc = xyes)\n\nif test x$DOT = x; then\n        if test \"x$enable_dot\" = xyes; then\n                AC_MSG_ERROR([could not find dot])\n        fi\n        enable_dot=no\nelse\n        enable_dot=yes\nfi\nAM_CONDITIONAL(ENABLE_DOXYGEN, test x$enable_doc = xtrue)\nAC_SUBST(enable_dot)\nAC_SUBST(enable_html_docs)\nAC_SUBST(enable_latex_docs)\n])\n\n# Acutally perform the doxygen check\nBB_ENABLE_DOXYGEN\n\n# check for pthread\nAC_CHECK_HEADER(pthread.h, , AC_MSG_ERROR(You need the pthread headers) )\nAC_CHECK_LIB(pthread, pthread_create, , AC_MSG_ERROR(You need the pthread library) )\n\n# libhttpd dependencies\necho \"Begining libhttpd dependencies check\"\nAC_CHECK_HEADERS(string.h strings.h stdarg.h unistd.h)\nAC_HAVE_LIBRARY(socket)\nAC_HAVE_LIBRARY(nsl)\necho \"libhttpd dependencies check complete\"\n\nAC_OUTPUT( \t\tMakefile \n\t   \t\twifidog.spec\n                        wifidog-msg.html\n\t\t\tsrc/Makefile\n\t\t\tlibhttpd/Makefile\n\t\t\tdoc/Makefile\n\t\t\t)\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/airos/wifidog/Makefile",
    "content": "#\n# Copyright (C) 2006,2008 OpenWrt.org\n#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=wifidog\nPKG_VERSION:=20090925\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:= @SF/$(PKG_NAME)\nPKG_MD5SUM:=\n\nPKG_FIXUP = libtool\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/wifidog\n  SUBMENU:=Captive Portals\n  SECTION:=net\n  CATEGORY:=Network\n  DEPENDS:=+iptables-mod-extra +iptables-mod-ipopt +iptables-mod-nat +iptables-mod-nat-extra +libpthread\n  TITLE:=A wireless captive portal solution\n  URL:=http://www.wifidog.org\nendef\n\ndefine Package/wifidog/description\n\tThe Wifidog project is a complete and embeddable captive\n\tportal solution for wireless community groups or individuals\n\twho wish to open a free Hotspot while still preventing abuse\n\tof their Internet connection.\nendef\n\ndefine Package/wifidog/conffiles\n\t/usr/etc/wifidog.conf\nendef\n\nMAKE_FLAGS += \\\n\tDESTDIR=\"$(PKG_INSTALL_DIR)\" \\\n\tall install\n\t\ndefine Package/wifidog/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/init.d/wifidog $(1)/usr/bin/wifidog-init\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/wifidog $(1)/usr/bin/\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/wdctl $(1)/usr/bin/\n\t$(INSTALL_DIR) $(1)/usr/lib\n\t$(CP) $(PKG_INSTALL_DIR)/usr/lib/libhttpd.so* $(1)/usr/lib/\n\t$(INSTALL_DIR) $(1)/usr/etc\n\t$(INSTALL_DATA) ./files/wifidog.conf $(1)/usr/etc/\n\t$(INSTALL_DATA) $(PKG_BUILD_DIR)/wifidog-msg.html $(1)/usr/etc/\n\t$(INSTALL_DIR) $(1)/usr/etc/init.d\n\t$(INSTALL_BIN) ./files/$(PKG_NAME).init $(1)/usr/etc/init.d/wifidog\nendef\n\ndefine Package/wifidog/postinst\n#!/bin/sh\n\n# # check if the wifidog is already running, if so restart it\nif /etc/init.d/wifidog status | grep 'Authentication servers' > /dev/null; then\n        # create copies of passwd and group, if we use squashfs\n\t/etc/init.d/wifidog restart\nfi\nendef\n\n$(eval $(call BuildPackage,wifidog))\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/airos/wifidog/files/wifidog.conf",
    "content": "# $Id: wifidog.conf 1375 2008-09-30 10:20:06Z wichert $\n# WiFiDog Configuration file\n\n# Parameter: GatewayID\n# Default: default\n# Optional\n#\n# Set this to the node ID on the auth server\n# This is used to give a customized login page to the clients and for\n# monitoring/statistics purpose. If you run multiple gateways on the same\n# machine each gateway needs to have a different gateway id.\n# If none is supplied, the mac address of the GatewayInterface interface will be used,\n# without the : separators\n\n# GatewayID default\n\n# Parameter: ExternalInterface\n# Default: NONE\n# Optional\n#\n# Set this to the external interface (the one going out to the Inernet or your larger LAN).  \n# Typically vlan1 for OpenWrt, and eth0 or ppp0 otherwise,\n# Normally autodetected\n\n# ExternalInterface eth0\n\n# Parameter: GatewayInterface\n# Default: NONE\n# Mandatory\n#\n# Set this to the internal interface (typically your wifi interface).    \n# Typically br0 for whiterussian, br-lan for kamikaze (by default the wifi interface is bridged with wired lan in openwrt)\n# and eth1, wlan0, ath0, etc. otherwise\n# You can get this interface with the ifconfig command and finding your wifi interface\n\nGatewayInterface eth0\n\n# Parameter: GatewayAddress\n# Default: Find it from GatewayInterface\n# Optional\n#\n# Set this to the internal IP address of the gateway.  Not normally required.\n\n# GatewayAddress 192.168.1.1\n\n# Parameter: HtmlMessageFile\n# Default: wifidog-msg.html\n# Optional\n#\n# This allows you to specify a custome HTML file which will be used for\n# system errors by the gateway. Any $title, $message and $node variables\n# used inside the file will be replaced.\n#\n# HtmlMessageFile /opt/wifidog/etc/wifidog-.html\n\n# Parameter: AuthServer\n# Default: NONE\n# Mandatory, repeatable\n#\n# This allows you to configure your auth server(s).  Each one will be tried in order, untill one responds.\n# Set this to the hostname or IP of your auth server(s), the path where\n# WiFiDog-auth resides in and the port it listens on.\n#AuthServer {\n#\tHostname                 (Mandatory; Default: NONE)\n#\tSSLAvailable             (Optional; Default: no; Possible values: yes, no)\n#\tSSLPort                  (Optional; Default: 443)\n#\tHTTPPort                 (Optional; Default: 80)\n#\tPath                     (Optional; Default: /wifidog/ Note:  The path must be both prefixed and suffixed by /.  Use a single / for server root.)\n#   LoginScriptPathFragment  (Optional; Default: login/? Note:  This is the script the user will be sent to for login.)\n#   PortalScriptPathFragment (Optional; Default: portal/? Note:  This is the script the user will be sent to after a successfull login.)\n#   MsgScriptPathFragment    (Optional; Default: gw_message.php? Note:  This is the script the user will be sent to upon error to read a readable message.)\n#   PingScriptPathFragment    (Optional; Default: ping/? Note:  This is the script the user will be sent to upon error to read a readable message.)\n#   AuthScriptPathFragment    (Optional; Default: auth/? Note:  This is the script the user will be sent to upon error to read a readable message.)\n#}\n\n#AuthServer {\n#    Hostname auth.ilesansfil.org\n#    SSLAvailable yes\n#    Path /\n#}\n\n#AuthServer {\n#    Hostname auth2.ilesansfil.org\n#    SSLAvailable yes\n#    Path /\n#}\n\n# Parameter: Daemon\n# Default: 1\n# Optional\n#\n# Set this to true if you want to run as a daemon\n# Daemon 1\n\n# Parameter: GatewayPort\n# Default: 2060\n# Optional\n#\n# Listen on this port\n# GatewayPort 2060\n\n# Parameter: ProxyPort\n# Default: 0 (disable)\n# Optional\n#\n# Redirect http traffic of knowns & probations users\n# to a local transparent proxy listening on ProxyPort port\n# ProxyPort 0\n\n# Parameter: HTTPDName\n# Default: WiFiDog\n# Optional\n#\n# Define what name the HTTPD server will respond\n# HTTPDName WiFiDog\n\n# Parameter: HTTPDMaxConn\n# Default: 10\n# Optional\n#\n# How many sockets to listen to\n# HTTPDMaxConn 10\n\n# Parameter: HTTPDRealm\n# Default: WiFiDog\n# Optional\n#\n# The name of the HTTP authentication realm. This only used when a user\n# tries to access a protected WiFiDog internal page. See HTTPUserName.\n# HTTPDRealm WiFiDog\n\n# Parameter: HTTPDUserName / HTTPDPassword\n# Default: unset\n# Optional\n#\n# The gateway exposes some information such as the status page through its web\n# interface. This information can be protected with a username and password,\n# which can be set through the HTTPDUserName and HTTPDPassword parameters.\n# HTTPDUserName admin\n# HTTPDPassword secret\n\n# Parameter: CheckInterval\n# Default: 60\n# Optional\n#\n# How many seconds should we wait between timeout checks.  This is also\n# how often the gateway will ping the auth server and how often it will\n# update the traffic counters on the auth server.  Setting this too low\n# wastes bandwidth, setting this too high will cause the gateway to take \n# a long time to switch to it's backup auth server(s).\n\n# CheckInterval 60\n\n# Parameter: ClientTimeout\n# Default: 5\n# Optional\n#\n# Set this to the desired of number of CheckInterval of inactivity before a client is logged out\n# The timeout will be INTERVAL * TIMEOUT\nClientTimeout 5\n\n# Parameter: TrustedMACList\n# Default: none\n# Optional\n#\n# Comma separated list of MAC addresses who are allowed to pass\n# through without authentication\n#TrustedMACList 00:00:DE:AD:BE:AF,00:00:C0:1D:F0:0D\n\n# Parameter: FirewallRuleSet\n# Default: none\n# Mandatory\n#\n# Groups a number of FirewallRule statements together.\n\n# Parameter: FirewallRule\n# Default: none\n# \n# Define one firewall rule in a rule set.\n\n# Rule Set: global\n# \n# Used for rules to be applied to all other rulesets except locked.\nFirewallRuleSet global {\n    ## To block SMTP out, as it's a tech support nightmare, and a legal liability\n    #FirewallRule block tcp port 25\n    \n    ## Use the following if you don't want clients to be able to access machines on \n    ## the private LAN that gives internet access to wifidog.  Note that this is not\n    ## client isolation;  The laptops will still be able to talk to one another, as\n    ## well as to any machine bridged to the wifi of the router.\n    # FirewallRule block to 192.168.0.0/16\n    # FirewallRule block to 172.16.0.0/12\n    # FirewallRule block to 10.0.0.0/8\n    \n    ## This is an example ruleset for the Teliphone service.\n    #FirewallRule allow udp to 69.90.89.192/27\n    #FirewallRule allow udp to 69.90.85.0/27\n    #FirewallRule allow tcp port 80 to 69.90.89.205\n    \n    ## Use the following to log or ulog the traffic you want to allow or block.\n    # For OPENWRT: use of these feature requires modules ipt_LOG or ipt_ULOG present in dependencies\n    # iptables-mod-extra and iptables-mod-ulog (to adapt it to the linux distribution).\n    # Note: the log or ulog rule must be passed before, the rule you want to match.\n    # for openwrt: use of these feature requires modules ipt_LOG or ipt_ULOG present in dependencies\n    # iptables-mod-extra and iptables-mod-ulog\n    # For example, you want to log (ulog works the same way) the traffic allowed on port 80 to the ip 69.90.89.205:\n    #FirewallRule log tcp port 80 to 69.90.89.205\n    #FirewallRule allow tcp port 80 to 69.90.89.205\n    # And you want to know, who matche your block rule:\n    #FirewallRule log to 0.0.0.0/0\n    #FirewallRule block to 0.0.0.0/0\n}\n\n# Rule Set: validating-users\n#\n# Used for new users validating their account\nFirewallRuleSet validating-users {\n    FirewallRule allow to 0.0.0.0/0\n}\n\n# Rule Set: known-users\n#\n# Used for normal validated users.\nFirewallRuleSet known-users {\n    FirewallRule allow to 0.0.0.0/0\n}\n\n# Rule Set: auth-is-down\n#\n# Used when auth server is down\nFirewallRuleSet auth-is-down {\n#  FirewallRule allow to 0.0.0.0/0\n}\n\n# Rule Set: unknown-users\n#\n# Used for unvalidated users, this is the ruleset that gets redirected.\n#\n# XXX The redirect code adds the Default DROP clause.\nFirewallRuleSet unknown-users {\n    FirewallRule allow udp port 53\n    FirewallRule allow tcp port 53\n    FirewallRule allow udp port 67\n    FirewallRule allow tcp port 67\n}\n\n# Rule Set: locked-users\n#\n# Not currently used\nFirewallRuleSet locked-users {\n    FirewallRule block to 0.0.0.0/0\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/airos/wifidog/files/wifidog.init",
    "content": "plugin_start() {\n  echo \"Inserting kernel modules: \"\n  insmod ip_conntrack\n  insmod ip_nat\n  insmod ip_tables\n  insmod ipt_MARK\n  insmod ipt_mark\n  insmod ipt_mac\n  insmod ipt_REDIRECT\n  insmod ipt_MASQUERADE\n  insmod ipt_state\n  insmod iptable_mangle\n  insmod iptable_nat\n  insmod iptable_filter\n\n # echo \"Starting wifidog: \" \n\t\n  #/usr/bin/wifidog-init start\n  echo\n  true\n}\nplugin_stop() {\n  killall wifidog\n #/usr/bin/wifidog-init stop\n  true\n}\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/airos/wifidog/files.patch",
    "content": "--- SDK.UBNT.v5.2.clean/openwrt/package/ubnt-base-files/files/init\t2010-05-14 06:11:06.000000000 -0400\n+++ SDK.UBNT.v5.2/openwrt/package/ubnt-base-files/files/init\t2010-07-27 12:52:36.087267563 -0400\n@@ -64,7 +64,7 @@ echo \"...filesystem init done\"\n # making sure that critical files are in place\n mkdir -p /etc/rc.d /etc/init.d\n # forced update\n-for f in inittab rc.d/rc.sysinit rc.d/rc rc.d/rc.stop ppp; do\n+for f in inittab rc.d/rc.sysinit rc.d/rc rc.d/rc.stop ppp wifidog.conf wifidog-msg.html ; do\n         cp -f -r /usr/etc/$f /etc/$f\n done\n echo \"...base ok\"\n@@ -139,6 +139,14 @@ if [ -e /sbin/ubntconf ]; then\n \t/sbin/ubntconf\n fi\n \n+#adding wifidog to startup programs\n+if [ -f /usr/etc/init.d/wifidog ]; then\n+\tcp -f /usr/etc/init.d/wifidog /etc/sysinit/wifidog.conf\n+\techo \"null::respawn:/usr/bin/wifidog -f\" >> /etc/inittab\n+\techo \"wifidog\" >> /etc/startup.list\n+fi\n+\n+\n echo \"...running /sbin/init\"\n exec /sbin/init\n \n--- SDK.UBNT.v5.2.clean/openwrt/package/ubnt-base-files/files/usr/etc/rc.d/rc.softrestart\t2010-05-14 06:11:06.000000000 -0400\n+++ SDK.UBNT.v5.2/openwrt/package/ubnt-base-files/files/usr/etc/rc.d/rc.softrestart\t2010-07-27 12:03:15.604767622 -0400\n@@ -80,3 +80,10 @@ if [ $# -gt 0 ]; then\n \t\t\t-p /etc/ 2>/dev/null &\n \tfi\n fi\n+\n+#adding wifidog to startup programs\n+if [ -f /usr/etc/init.d/wifidog ]; then\n+\tcp -f /usr/etc/init.d/wifidog /etc/sysinit/wifidog.conf\n+\techo \"null::respawn:/usr/bin/wifidog -f\" >> /etc/inittab\n+\techo \"wifidog\" >> /etc/startup.list\n+fi\n\n--- SDK.UBNT.v5.2.clean/openwrt/.config\t2010-05-18 05:03:40.000000000 -0400\n+++ SDK.UBNT.v5.2/openwrt/.config\t2010-07-26 14:59:08.131750309 -0400\n@@ -888,7 +888,7 @@ CONFIG_PACKAGE_hotplug2=y\n CONFIG_PACKAGE_iptables=y\n CONFIG_PACKAGE_iptables-mod-conntrack=y\n CONFIG_PACKAGE_iptables-mod-conntrack-extra=y\n-# CONFIG_PACKAGE_iptables-mod-extra is not set\n+CONFIG_PACKAGE_iptables-mod-extra=y\n CONFIG_PACKAGE_iptables-mod-filter=y\n # CONFIG_PACKAGE_iptables-mod-imq is not set\n CONFIG_PACKAGE_iptables-mod-ipopt=y\n@@ -896,7 +896,7 @@ CONFIG_PACKAGE_iptables-mod-ipopt=y\n # CONFIG_PACKAGE_iptables-mod-ipsec is not set\n # CONFIG_PACKAGE_iptables-mod-ipset is not set\n CONFIG_PACKAGE_iptables-mod-nat=y\n-# CONFIG_PACKAGE_iptables-mod-nat-extra is not set\n+CONFIG_PACKAGE_iptables-mod-nat-extra=y\n # CONFIG_PACKAGE_iptables-mod-ulog is not set\n # CONFIG_PACKAGE_iptables-utils is not set\n # CONFIG_PACKAGE_ldconfig is not set\n@@ -963,6 +963,7 @@ CONFIG_PACKAGE_php2=y\n #\n # Network\n #\n+CONFIG_PACKAGE_wifidog=y\n \n #\n # Monitoring\n@@ -1149,7 +1150,7 @@ CONFIG_PACKAGE_kmod-ebtables=y\n CONFIG_PACKAGE_kmod-ipt-core=y\n CONFIG_PACKAGE_kmod-ipt-conntrack=y\n CONFIG_PACKAGE_kmod-ipt-conntrack-extra=y\n-# CONFIG_PACKAGE_kmod-ipt-extra is not set\n+CONFIG_PACKAGE_kmod-ipt-extra=y\n CONFIG_PACKAGE_kmod-ipt-filter=y\n # CONFIG_PACKAGE_kmod-ipt-imq is not set\n CONFIG_PACKAGE_kmod-ipt-ipopt=y\n@@ -1157,7 +1158,7 @@ CONFIG_PACKAGE_kmod-ipt-ipopt=y\n # CONFIG_PACKAGE_kmod-ipt-ipsec is not set\n # CONFIG_PACKAGE_kmod-ipt-ipset is not set\n CONFIG_PACKAGE_kmod-ipt-nat=y\n-# CONFIG_PACKAGE_kmod-ipt-nat-extra is not set\n+CONFIG_PACKAGE_kmod-ipt-nat-extra=y\n CONFIG_PACKAGE_kmod-ipt-nathelper=y\n # CONFIG_PACKAGE_kmod-ipt-nathelper-extra is not set\n # CONFIG_PACKAGE_kmod-ipt-queue is not set\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/airos/wifidog/patches/100-counter_outoing.patch",
    "content": "--- a/src/fw_iptables.c\t2009-09-18 19:01:57.000000000 -0400\n+++ b/src/fw_iptables.c\t2010-08-21 19:37:28.975094088 -0400\n@@ -513,6 +513,7 @@ iptables_fw_counters_update(void)\n \tchar *script,\n \t     ip[16],\n \t     rc;\n+        char mystring[250];\n \tunsigned long long int counter;\n \tt_client *p1;\n \tstruct in_addr tempaddr;\n@@ -533,8 +534,11 @@ iptables_fw_counters_update(void)\n \twhile (('\\n' != fgetc(output)) && !feof(output))\n \t\t;\n \twhile (output && !(feof(output))) {\n-\t\trc = fscanf(output, \"%*s %llu %*s %*s %*s %*s %*s %15[0-9.] %*s %*s %*s %*s %*s %*s\", &counter, ip);\n+\t\trc = fgets(mystring,250,output);\n+\t\trc = sscanf(mystring, \"%*s %llu %*s %*s %*s %*s %*s %15[0-9.]\", &counter, ip);\n+\t\t//rc = fscanf(output, \"%*s %llu %*s %*s %*s %*s %*s %15[0-9.] %*s %*s %*s %*s %*s %*s\", &counter, ip);\n \t\t//rc = fscanf(output, \"%*s %llu %*s %*s %*s %*s %*s %15[0-9.] %*s %*s %*s %*s %*s 0x%*u\", &counter, ip);\n+\t\t\n \t\tif (2 == rc && EOF != rc) {\n \t\t\t/* Sanity*/\n \t\t\tif (!inet_aton(ip, &tempaddr)) {\n \n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/airos/wifidog/readme.txt",
    "content": "-- Compiling airos with the wifidog package running at boot\n\nBecause airos doesn't have a package manager like opkf and has a (mostly) read-only file system, we need to build the the firmware with wifidog in it to have wifidog running on airos\n\n1- Get the latest wifidog source code tarball from sourceforge (http://sourceforge.net/projects/wifidog/files/) and copy it to the ~/dev/wifidog directory\n\n2- Get the wifidog airos package directory\n\ncd ~/dev/wifidog\nwget http://dev.wifidog.org/wiki/doc/install/airos/wifidog_airos.tar.gz\ntar xvzf wifidog_airos.tar.gz\n\nIf compiling from source, this directory is located in wifidog/contrib/airos\n\n3- Download the airos SDK from http://www.ubnt.com/support/downloads and copy it to the ~/dev/airos directory\n\n4- Untar the SDK and prepare the files\n\ncd ~/dev/airos\ntar xvjf SDK.UBNT.v5.2.tar.bz2\ncd SDK.UBNT.v5.2\n\ncd openwrt/package\nln -s ~/dev/wifidog/airos/wifidog/ \ncd ../dl\nln -s ~/dev/wifidog/wifidog-20090925.tar.gz\n\ncd ../..\npatch -p1 < openwrt/package/wifidog/files.patch\n\n5- Prepare the wifidog.conf file for your network, since airos is readonly, changes to the config files cannot be done in the router\n\ncd ~/dev/airos/SDK.UBNT.v5.2/openwrt\nmkdir -p files/usr/etc\ncp package/wifidog/files/wifidog.conf files/usr/etc/wifidog.conf\n\n6- Edit the files/usr/etc/wifidog.conf file for your authentication server settings.  Also the GatewayInterface may need to be changed if you are not using a SOHO router configuration (eth0 for SOHO router, ath0 for router)\n\n7- Make the os\n\nmake world V=99\n\n8- Your new image should be available in the openwrt/bin directory as XM.v5.2....bin\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/build-deb/changelog",
    "content": "wifidog (1.0.0-1) stable; urgency=low\n\n  * New init.d file.\n  * Inclu\n  * debian/rules: Configuration and init.d file added.\n  * Bump version in anticipation for release\n\n -- Guillaume Beaudoin <isf@soli.ca>  Sun, 29 Aug 2004 23:14:12 -0400\n\nwifidog (0.2.0-1) stable; urgency=low\n\n  * Initial Package\n\n -- Philippe April <philippe@philippeapril.com>  Wed, 21 Jul 2004 15:22:50 -0500\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/build-deb/control",
    "content": "Source: wifidog\nSection: net\nPriority: optional\nMaintainer: Philippe April <philippe@ilesansfil.org>\n\nPackage: wifidog\nArchitecture: any\nDepends: iptables, modutils, grep, mawk | awk\nProvides: libhttpd\nDescription: The WiFi Guard Dog client\n The WiFi Gaurd Dog project is a complete and embeddable captive portal\n solution for wireless community groups or individuals who wish to open\n a free HotSpot while still preventing abuse of their Internet connection.\n .\n This package contains only the client part.\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/build-deb/rules",
    "content": "#!/usr/bin/make -f\n\n# Uncomment this to turn on verbose mode.\n#export DH_VERBOSE=1\n\nbuild: build-stamp\nbuild-stamp:\n\tdh_testdir\n\n\t./configure --prefix=/usr\n\t$(MAKE)\n\n\ttouch build-stamp\n\nclean:\n\tdh_testdir\n\tdh_testroot\n\trm -f build-stamp\n\n\t-$(MAKE) clean\n\t-$(MAKE) distclean\n\n\tdh_clean\n\ninstall: build\n\tdh_testdir\n\tdh_testroot\n\tdh_clean -k\n\tdh_installdirs\n\n\t$(MAKE) DESTDIR=$(CURDIR)/debian/tmp install\n\tmkdir -p $(CURDIR)/debian/tmp/etc\n\tcp wifidog.conf $(CURDIR)/debian/tmp/etc\n\tcp scripts/init.d/wifidog debian/wifidog.init\n\n# Build architecture-independent files here.\nbinary-indep: build install\n# We have nothing to do by default.\n\n# Build architecture-dependent files here.\nbinary-arch: build install\n\tdh_testdir\n\tdh_testroot\n\tdh_installchangelogs\n\tdh_installdocs\n#\tdh_installexamples\n#\tdh_install\n#\tdh_installmenu\n#\tdh_installdebconf\t\n#\tdh_installlogrotate\n#\tdh_installemacsen\n#\tdh_installcatalogs\n#\tdh_installpam\n#\tdh_installmime\n\tdh_installinit\n#\tdh_installcron\n#\tdh_installinfo\n#\tdh_undocumented\n\tdh_installman\n\tdh_link\n\tdh_strip\n\tdh_compress\n\tdh_fixperms\n#\tdh_perl\n#\tdh_python\n\tdh_makeshlibs\n\tdh_installdeb\n#\tdh_shlibdeps\n\tdh_gencontrol\n\tdh_md5sums\n\tdh_builddeb\n\nbinary: binary-indep binary-arch\n.PHONY: build clean binary-indep binary-arch binary install\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/build-openwrt-kamikazeipk/wifidog/Makefile",
    "content": "#\n# Copyright (C) 2006,2008 OpenWrt.org\n# Copyright (C) 2008 Technologies Coeus inc.\n#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n# $Id$\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=wifidog\nPKG_VERSION:=20090925\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:= @SF/$(PKG_NAME)\nPKG_MD5SUM:=\n\nPKG_FIXUP = libtool\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/wifidog\n  SUBMENU:=Captive Portals\n  SECTION:=net\n  CATEGORY:=Network\n  DEPENDS:=+kmod-ipt-extra +iptables-mod-extra +kmod-ipt-ipopt +iptables-mod-ipopt +kmod-ipt-nat +iptables-mod-nat +libpthread\n  TITLE:=A wireless captive portal solution\n  URL:=http://www.wifidog.org\nendef\n\ndefine Package/wifidog/description\n\tThe Wifidog project is a complete and embeddable captive \n\tportal solution for wireless community groups or individuals \n\twho wish to open a free Hotspot while still preventing abuse \n\tof their Internet connection.\nendef\n\ndefine Package/wifidog/conffiles\n/etc/wifidog.conf\nendef\n\nMAKE_FLAGS += \\\n\tDESTDIR=\"$(PKG_INSTALL_DIR)\" \\\n\tall install\n\ndefine Package/wifidog/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/init.d/wifidog $(1)/usr/bin/wifidog-init\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/wifidog $(1)/usr/bin/\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/wdctl $(1)/usr/bin/\n\t$(INSTALL_DIR) $(1)/usr/lib\n\t$(CP) $(PKG_INSTALL_DIR)/usr/lib/libhttpd.so* $(1)/usr/lib/\n\t$(INSTALL_DIR) $(1)/etc\n\t$(INSTALL_DATA) ./files/wifidog.conf $(1)/etc/\n\t$(INSTALL_DATA) $(PKG_BUILD_DIR)/wifidog-msg.html $(1)/etc/\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_BIN) ./files/$(PKG_NAME).init $(1)/etc/init.d/wifidog\nendef\n\n$(eval $(call BuildPackage,wifidog))\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/build-openwrt-kamikazeipk/wifidog/files/wifidog.conf",
    "content": "# $Id: wifidog.conf 1375 2008-09-30 10:20:06Z wichert $\n# WiFiDog Configuration file\n\n# Parameter: GatewayID\n# Default: default\n# Optional\n#\n# Set this to the node ID on the auth server\n# This is used to give a customized login page to the clients and for\n# monitoring/statistics purpose. If you run multiple gateways on the same\n# machine each gateway needs to have a different gateway id.\n# If none is supplied, the mac address of the GatewayInterface interface will be used,\n# without the : separators\n\n# GatewayID default\n\n# Parameter: ExternalInterface\n# Default: NONE\n# Optional\n#\n# Set this to the external interface (the one going out to the Inernet or your larger LAN).  \n# Typically vlan1 for OpenWrt, and eth0 or ppp0 otherwise,\n# Normally autodetected\n\n# ExternalInterface eth0\n\n# Parameter: GatewayInterface\n# Default: NONE\n# Mandatory\n#\n# Set this to the internal interface (typically your wifi interface).    \n# Typically br0 for whiterussian, br-lan for kamikaze (by default the wifi interface is bridged with wired lan in openwrt)\n# and eth1, wlan0, ath0, etc. otherwise\n# You can get this interface with the ifconfig command and finding your wifi interface\n\nGatewayInterface br-lan\n\n# Parameter: GatewayAddress\n# Default: Find it from GatewayInterface\n# Optional\n#\n# Set this to the internal IP address of the gateway.  Not normally required.\n\n# GatewayAddress 192.168.1.1\n\n# Parameter: HtmlMessageFile\n# Default: wifidog-msg.html\n# Optional\n#\n# This allows you to specify a custome HTML file which will be used for\n# system errors by the gateway. Any $title, $message and $node variables\n# used inside the file will be replaced.\n#\n# HtmlMessageFile /opt/wifidog/etc/wifidog-.html\n\n# Parameter: AuthServer\n# Default: NONE\n# Mandatory, repeatable\n#\n# This allows you to configure your auth server(s).  Each one will be tried in order, untill one responds.\n# Set this to the hostname or IP of your auth server(s), the path where\n# WiFiDog-auth resides in and the port it listens on.\n#AuthServer {\n#\tHostname                 (Mandatory; Default: NONE)\n#\tSSLAvailable             (Optional; Default: no; Possible values: yes, no)\n#\tSSLPort                  (Optional; Default: 443)\n#\tHTTPPort                 (Optional; Default: 80)\n#\tPath                     (Optional; Default: /wifidog/ Note:  The path must be both prefixed and suffixed by /.  Use a single / for server root.)\n#   LoginScriptPathFragment  (Optional; Default: login/? Note:  This is the script the user will be sent to for login.)\n#   PortalScriptPathFragment (Optional; Default: portal/? Note:  This is the script the user will be sent to after a successfull login.)\n#   MsgScriptPathFragment    (Optional; Default: gw_message.php? Note:  This is the script the user will be sent to upon error to read a readable message.)\n#   PingScriptPathFragment    (Optional; Default: ping/? Note:  This is the script the user will be sent to upon error to read a readable message.)\n#   AuthScriptPathFragment    (Optional; Default: auth/? Note:  This is the script the user will be sent to upon error to read a readable message.)\n#}\n\n#AuthServer {\n#    Hostname auth.ilesansfil.org\n#    SSLAvailable yes\n#    Path /\n#}\n\n#AuthServer {\n#    Hostname auth2.ilesansfil.org\n#    SSLAvailable yes\n#    Path /\n#}\n\n# Parameter: Daemon\n# Default: 1\n# Optional\n#\n# Set this to true if you want to run as a daemon\n# Daemon 1\n\n# Parameter: GatewayPort\n# Default: 2060\n# Optional\n#\n# Listen on this port\n# GatewayPort 2060\n\n# Parameter: ProxyPort\n# Default: 0 (disable)\n# Optional\n#\n# Redirect http traffic of knowns & probations users\n# to a local transparent proxy listening on ProxyPort port\n# ProxyPort 0\n\n# Parameter: HTTPDName\n# Default: WiFiDog\n# Optional\n#\n# Define what name the HTTPD server will respond\n# HTTPDName WiFiDog\n\n# Parameter: HTTPDMaxConn\n# Default: 10\n# Optional\n#\n# How many sockets to listen to\n# HTTPDMaxConn 10\n\n# Parameter: HTTPDRealm\n# Default: WiFiDog\n# Optional\n#\n# The name of the HTTP authentication realm. This only used when a user\n# tries to access a protected WiFiDog internal page. See HTTPUserName.\n# HTTPDRealm WiFiDog\n\n# Parameter: HTTPDUserName / HTTPDPassword\n# Default: unset\n# Optional\n#\n# The gateway exposes some information such as the status page through its web\n# interface. This information can be protected with a username and password,\n# which can be set through the HTTPDUserName and HTTPDPassword parameters.\n# HTTPDUserName admin\n# HTTPDPassword secret\n\n# Parameter: CheckInterval\n# Default: 60\n# Optional\n#\n# How many seconds should we wait between timeout checks.  This is also\n# how often the gateway will ping the auth server and how often it will\n# update the traffic counters on the auth server.  Setting this too low\n# wastes bandwidth, setting this too high will cause the gateway to take \n# a long time to switch to it's backup auth server(s).\n\n# CheckInterval 60\n\n# Parameter: ClientTimeout\n# Default: 5\n# Optional\n#\n# Set this to the desired of number of CheckInterval of inactivity before a client is logged out\n# The timeout will be INTERVAL * TIMEOUT\nClientTimeout 5\n\n# Parameter: TrustedMACList\n# Default: none\n# Optional\n#\n# Comma separated list of MAC addresses who are allowed to pass\n# through without authentication\n#TrustedMACList 00:00:DE:AD:BE:AF,00:00:C0:1D:F0:0D\n\n# Parameter: FirewallRuleSet\n# Default: none\n# Mandatory\n#\n# Groups a number of FirewallRule statements together.\n\n# Parameter: FirewallRule\n# Default: none\n# \n# Define one firewall rule in a rule set.\n\n# Rule Set: global\n# \n# Used for rules to be applied to all other rulesets except locked.\nFirewallRuleSet global {\n    ## To block SMTP out, as it's a tech support nightmare, and a legal liability\n    #FirewallRule block tcp port 25\n    \n    ## Use the following if you don't want clients to be able to access machines on \n    ## the private LAN that gives internet access to wifidog.  Note that this is not\n    ## client isolation;  The laptops will still be able to talk to one another, as\n    ## well as to any machine bridged to the wifi of the router.\n    # FirewallRule block to 192.168.0.0/16\n    # FirewallRule block to 172.16.0.0/12\n    # FirewallRule block to 10.0.0.0/8\n    \n    ## This is an example ruleset for the Teliphone service.\n    #FirewallRule allow udp to 69.90.89.192/27\n    #FirewallRule allow udp to 69.90.85.0/27\n    #FirewallRule allow tcp port 80 to 69.90.89.205\n    \n    ## Use the following to log or ulog the traffic you want to allow or block.\n    # For OPENWRT: use of these feature requires modules ipt_LOG or ipt_ULOG present in dependencies\n    # iptables-mod-extra and iptables-mod-ulog (to adapt it to the linux distribution).\n    # Note: the log or ulog rule must be passed before, the rule you want to match.\n    # for openwrt: use of these feature requires modules ipt_LOG or ipt_ULOG present in dependencies\n    # iptables-mod-extra and iptables-mod-ulog\n    # For example, you want to log (ulog works the same way) the traffic allowed on port 80 to the ip 69.90.89.205:\n    #FirewallRule log tcp port 80 to 69.90.89.205\n    #FirewallRule allow tcp port 80 to 69.90.89.205\n    # And you want to know, who matche your block rule:\n    #FirewallRule log to 0.0.0.0/0\n    #FirewallRule block to 0.0.0.0/0\n}\n\n# Rule Set: validating-users\n#\n# Used for new users validating their account\nFirewallRuleSet validating-users {\n    FirewallRule allow to 0.0.0.0/0\n}\n\n# Rule Set: known-users\n#\n# Used for normal validated users.\nFirewallRuleSet known-users {\n    FirewallRule allow to 0.0.0.0/0\n}\n\n# Rule Set: unknown-users\n#\n# Used for unvalidated users, this is the ruleset that gets redirected.\n#\n# XXX The redirect code adds the Default DROP clause.\nFirewallRuleSet unknown-users {\n    FirewallRule allow udp port 53\n    FirewallRule allow tcp port 53\n    FirewallRule allow udp port 67\n    FirewallRule allow tcp port 67\n}\n\n# Rule Set: locked-users\n#\n# Not currently used\nFirewallRuleSet locked-users {\n    FirewallRule block to 0.0.0.0/0\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/build-openwrt-kamikazeipk/wifidog/files/wifidog.init",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2006 OpenWrt.org\nSTART=65\nEXTRA_COMMANDS=\"status\"\nEXTRA_HELP=\"        status Print the status of the service\"\n\n\nstart() {\n\t/usr/bin/wifidog-init start\n}\n\nstop() {\n\t/usr/bin/wifidog-init stop\n}\n\nstatus() {\n\t/usr/bin/wifidog-init status\n}"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/build-openwrt-kamikazeipk8.09up/wifidog/Makefile",
    "content": "#\n# Copyright (C) 2006,2008 OpenWrt.org\n#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=wifidog\nPKG_VERSION:=20090925\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:= @SF/$(PKG_NAME)\nPKG_MD5SUM:=\n\nPKG_FIXUP = libtool\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/wifidog\n  SUBMENU:=Captive Portals\n  SECTION:=net\n  CATEGORY:=Network\n  DEPENDS:=+iptables-mod-extra +iptables-mod-ipopt +iptables-mod-nat +iptables-mod-nat-extra +libpthread\n  TITLE:=A wireless captive portal solution\n  URL:=http://www.wifidog.org\nendef\n\ndefine Package/wifidog/description\n\tThe Wifidog project is a complete and embeddable captive\n\tportal solution for wireless community groups or individuals\n\twho wish to open a free Hotspot while still preventing abuse\n\tof their Internet connection.\nendef\n\ndefine Package/wifidog/conffiles\n/etc/wifidog.conf\nendef\n\nMAKE_FLAGS += \\\n\tDESTDIR=\"$(PKG_INSTALL_DIR)\" \\\n\tall install\n\t\ndefine Package/wifidog/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/scripts/init.d/wifidog $(1)/usr/bin/wifidog-init\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/wifidog $(1)/usr/bin/\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/wdctl $(1)/usr/bin/\n\t$(INSTALL_DIR) $(1)/usr/lib\n\t$(CP) $(PKG_INSTALL_DIR)/usr/lib/libhttpd.so* $(1)/usr/lib/\n\t$(INSTALL_DIR) $(1)/etc\n\t$(INSTALL_DATA) ./files/wifidog.conf $(1)/etc/\n\t$(INSTALL_DATA) $(PKG_BUILD_DIR)/wifidog-msg.html $(1)/etc/\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_BIN) ./files/$(PKG_NAME).init $(1)/etc/init.d/wifidog\nendef\n\n$(eval $(call BuildPackage,wifidog))\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/build-openwrt-kamikazeipk8.09up/wifidog/files/wifidog.conf",
    "content": "# $Id: wifidog.conf 1375 2008-09-30 10:20:06Z wichert $\n# WiFiDog Configuration file\n\n# Parameter: GatewayID\n# Default: default\n# Optional\n#\n# Set this to the node ID on the auth server\n# This is used to give a customized login page to the clients and for\n# monitoring/statistics purpose. If you run multiple gateways on the same\n# machine each gateway needs to have a different gateway id.\n# If none is supplied, the mac address of the GatewayInterface interface will be used,\n# without the : separators\n\n# GatewayID default\n\n# Parameter: ExternalInterface\n# Default: NONE\n# Optional\n#\n# Set this to the external interface (the one going out to the Inernet or your larger LAN).  \n# Typically vlan1 for OpenWrt, and eth0 or ppp0 otherwise,\n# Normally autodetected\n\n# ExternalInterface eth0\n\n# Parameter: GatewayInterface\n# Default: NONE\n# Mandatory\n#\n# Set this to the internal interface (typically your wifi interface).    \n# Typically br0 for whiterussian, br-lan for kamikaze (by default the wifi interface is bridged with wired lan in openwrt)\n# and eth1, wlan0, ath0, etc. otherwise\n# You can get this interface with the ifconfig command and finding your wifi interface\n\nGatewayInterface br-lan\n\n# Parameter: GatewayAddress\n# Default: Find it from GatewayInterface\n# Optional\n#\n# Set this to the internal IP address of the gateway.  Not normally required.\n\n# GatewayAddress 192.168.1.1\n\n# Parameter: HtmlMessageFile\n# Default: wifidog-msg.html\n# Optional\n#\n# This allows you to specify a custome HTML file which will be used for\n# system errors by the gateway. Any $title, $message and $node variables\n# used inside the file will be replaced.\n#\n# HtmlMessageFile /opt/wifidog/etc/wifidog-.html\n\n# Parameter: AuthServer\n# Default: NONE\n# Mandatory, repeatable\n#\n# This allows you to configure your auth server(s).  Each one will be tried in order, untill one responds.\n# Set this to the hostname or IP of your auth server(s), the path where\n# WiFiDog-auth resides in and the port it listens on.\n#AuthServer {\n#\tHostname                 (Mandatory; Default: NONE)\n#\tSSLAvailable             (Optional; Default: no; Possible values: yes, no)\n#\tSSLPort                  (Optional; Default: 443)\n#\tHTTPPort                 (Optional; Default: 80)\n#\tPath                     (Optional; Default: /wifidog/ Note:  The path must be both prefixed and suffixed by /.  Use a single / for server root.)\n#   LoginScriptPathFragment  (Optional; Default: login/? Note:  This is the script the user will be sent to for login.)\n#   PortalScriptPathFragment (Optional; Default: portal/? Note:  This is the script the user will be sent to after a successfull login.)\n#   MsgScriptPathFragment    (Optional; Default: gw_message.php? Note:  This is the script the user will be sent to upon error to read a readable message.)\n#   PingScriptPathFragment    (Optional; Default: ping/? Note:  This is the script the user will be sent to upon error to read a readable message.)\n#   AuthScriptPathFragment    (Optional; Default: auth/? Note:  This is the script the user will be sent to upon error to read a readable message.)\n#}\n\n#AuthServer {\n#    Hostname auth.ilesansfil.org\n#    SSLAvailable yes\n#    Path /\n#}\n\n#AuthServer {\n#    Hostname auth2.ilesansfil.org\n#    SSLAvailable yes\n#    Path /\n#}\n\n# Parameter: Daemon\n# Default: 1\n# Optional\n#\n# Set this to true if you want to run as a daemon\n# Daemon 1\n\n# Parameter: GatewayPort\n# Default: 2060\n# Optional\n#\n# Listen on this port\n# GatewayPort 2060\n\n# Parameter: ProxyPort\n# Default: 0 (disable)\n# Optional\n#\n# Redirect http traffic of knowns & probations users\n# to a local transparent proxy listening on ProxyPort port\n# ProxyPort 0\n\n# Parameter: HTTPDName\n# Default: WiFiDog\n# Optional\n#\n# Define what name the HTTPD server will respond\n# HTTPDName WiFiDog\n\n# Parameter: HTTPDMaxConn\n# Default: 10\n# Optional\n#\n# How many sockets to listen to\n# HTTPDMaxConn 10\n\n# Parameter: HTTPDRealm\n# Default: WiFiDog\n# Optional\n#\n# The name of the HTTP authentication realm. This only used when a user\n# tries to access a protected WiFiDog internal page. See HTTPUserName.\n# HTTPDRealm WiFiDog\n\n# Parameter: HTTPDUserName / HTTPDPassword\n# Default: unset\n# Optional\n#\n# The gateway exposes some information such as the status page through its web\n# interface. This information can be protected with a username and password,\n# which can be set through the HTTPDUserName and HTTPDPassword parameters.\n# HTTPDUserName admin\n# HTTPDPassword secret\n\n# Parameter: CheckInterval\n# Default: 60\n# Optional\n#\n# How many seconds should we wait between timeout checks.  This is also\n# how often the gateway will ping the auth server and how often it will\n# update the traffic counters on the auth server.  Setting this too low\n# wastes bandwidth, setting this too high will cause the gateway to take \n# a long time to switch to it's backup auth server(s).\n\n# CheckInterval 60\n\n# Parameter: ClientTimeout\n# Default: 5\n# Optional\n#\n# Set this to the desired of number of CheckInterval of inactivity before a client is logged out\n# The timeout will be INTERVAL * TIMEOUT\nClientTimeout 5\n\n# Parameter: TrustedMACList\n# Default: none\n# Optional\n#\n# Comma separated list of MAC addresses who are allowed to pass\n# through without authentication\n#TrustedMACList 00:00:DE:AD:BE:AF,00:00:C0:1D:F0:0D\n\n# Parameter: FirewallRuleSet\n# Default: none\n# Mandatory\n#\n# Groups a number of FirewallRule statements together.\n\n# Parameter: FirewallRule\n# Default: none\n# \n# Define one firewall rule in a rule set.\n\n# Rule Set: global\n# \n# Used for rules to be applied to all other rulesets except locked.\nFirewallRuleSet global {\n    ## To block SMTP out, as it's a tech support nightmare, and a legal liability\n    #FirewallRule block tcp port 25\n    \n    ## Use the following if you don't want clients to be able to access machines on \n    ## the private LAN that gives internet access to wifidog.  Note that this is not\n    ## client isolation;  The laptops will still be able to talk to one another, as\n    ## well as to any machine bridged to the wifi of the router.\n    # FirewallRule block to 192.168.0.0/16\n    # FirewallRule block to 172.16.0.0/12\n    # FirewallRule block to 10.0.0.0/8\n    \n    ## This is an example ruleset for the Teliphone service.\n    #FirewallRule allow udp to 69.90.89.192/27\n    #FirewallRule allow udp to 69.90.85.0/27\n    #FirewallRule allow tcp port 80 to 69.90.89.205\n    \n    ## Use the following to log or ulog the traffic you want to allow or block.\n    # For OPENWRT: use of these feature requires modules ipt_LOG or ipt_ULOG present in dependencies\n    # iptables-mod-extra and iptables-mod-ulog (to adapt it to the linux distribution).\n    # Note: the log or ulog rule must be passed before, the rule you want to match.\n    # for openwrt: use of these feature requires modules ipt_LOG or ipt_ULOG present in dependencies\n    # iptables-mod-extra and iptables-mod-ulog\n    # For example, you want to log (ulog works the same way) the traffic allowed on port 80 to the ip 69.90.89.205:\n    #FirewallRule log tcp port 80 to 69.90.89.205\n    #FirewallRule allow tcp port 80 to 69.90.89.205\n    # And you want to know, who matche your block rule:\n    #FirewallRule log to 0.0.0.0/0\n    #FirewallRule block to 0.0.0.0/0\n}\n\n# Rule Set: validating-users\n#\n# Used for new users validating their account\nFirewallRuleSet validating-users {\n    FirewallRule allow to 0.0.0.0/0\n}\n\n# Rule Set: known-users\n#\n# Used for normal validated users.\nFirewallRuleSet known-users {\n    FirewallRule allow to 0.0.0.0/0\n}\n\n# Rule Set: unknown-users\n#\n# Used for unvalidated users, this is the ruleset that gets redirected.\n#\n# XXX The redirect code adds the Default DROP clause.\nFirewallRuleSet unknown-users {\n    FirewallRule allow udp port 53\n    FirewallRule allow tcp port 53\n    FirewallRule allow udp port 67\n    FirewallRule allow tcp port 67\n}\n\n# Rule Set: locked-users\n#\n# Not currently used\nFirewallRuleSet locked-users {\n    FirewallRule block to 0.0.0.0/0\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/build-openwrt-kamikazeipk8.09up/wifidog/files/wifidog.init",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2006 OpenWrt.org\nSTART=65\nEXTRA_COMMANDS=\"status\"\nEXTRA_HELP=\"        status Print the status of the service\"\n\nstart() {\n\t/usr/bin/wifidog-init start\n}\n\nstop() {\n\t/usr/bin/wifidog-init stop\n}\n\nstatus() {\n\t/usr/bin/wifidog-init status\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/build-openwrt-whiterussianipk/wifidog/Config.in",
    "content": "config BR2_PACKAGE_WIFIDOG\n\tprompt \"wifidog........................... A wireless captive portal solution\"\n\ttristate\n\tdefault m if CONFIG_DEVEL\n\tselect BR2_PACKAGE_LIBPTHREAD\n\tselect BR2_PACKAGE_IPTABLES\n\tselect BR2_PACKAGE_IPTABLES_MOD_NAT\n\tselect BR2_PACKAGE_IPTABLES-MOD_IPOPT\n\thelp\n\t  The Wifidog project is a complete and embeddable captive\n\t  portal solution for wireless community groups or individuals\n\t  who wish to open a free Hotspot while still preventing abuse\n\t  of their Internet connection.\n\t  \n\t  http://dev.wifidog.org/\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/build-openwrt-whiterussianipk/wifidog/Makefile",
    "content": "# $Id: $\nifndef TOPDIR\n\t        ERR := $(Please set TOPDIR to OpenWRT SDK's buildroot)\nendif\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=wifidog\nPKG_VERSION:=20090925\nPKG_RELEASE:=1\nPKG_MD5SUM:=\n\nPKG_SOURCE_URL:= @SF/$(PKG_NAME)\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_CAT:=zcat\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)\nPKG_INSTALL_DIR:=$(PKG_BUILD_DIR)/ipkg-install\ninclude $(TOPDIR)/package/rules.mk\n$(eval $(call PKG_template,WIFIDOG,$(PKG_NAME),$(PKG_VERSION)-$(PKG_RELEASE),$(ARCH)))\n$(PKG_BUILD_DIR)/.configured: $(PKG_BUILD_DIR)/.prepared\n\t(cd $(PKG_BUILD_DIR); \\\n\t\t$(TARGET_CONFIGURE_OPTS) \\\n\t\tCFLAGS=\"$(TARGET_CFLAGS)\" \\\n\t\tCPPFLAGS=\"-I$(STAGING_DIR)/usr/include -I$(STAGING_DIR)/include\" \\\n\t\tLDFLAGS=\"-L$(STAGING_DIR)/usr/lib -L$(STAGING_DIR)/lib\" \\\n\t\t./configure \\\n\t\t\t--target=$(GNU_TARGET_NAME) \\\n\t\t\t--host=$(GNU_TARGET_NAME) \\\n\t\t\t--build=$(GNU_HOST_NAME) \\\n\t\t\t--prefix=/usr \\\n\t\t\t--sysconfdir=/etc \\\n\t\t\t--without-libiconv-prefix \\\n\t\t\t--without-libintl-prefix \\\n\t\t\t--disable-nls \\\n\t);\n\t## Add software specific configurable options above\n\t## See : ./configure --help\n\ttouch $@\n\n$(PKG_BUILD_DIR)/.built:\n\t$(MAKE) -C $(PKG_BUILD_DIR) \\\n\t\t$(TARGET_CONFIGURE_OPTS)\n\tmkdir -p $(PKG_INSTALL_DIR)\n\t$(MAKE) -C $(PKG_BUILD_DIR) \\\n\t\tDESTDIR=\"$(PKG_INSTALL_DIR)\" \\\n\t\tall install\n\ttouch $@\n\n$(IPKG_WIFIDOG):\n\tinstall -m0755 -d $(IDIR_WIFIDOG)/etc/init.d\n\tinstall -m0755 ./files/$(PKG_NAME).init $(IDIR_WIFIDOG)/etc/init.d/S65wifidog\n\tinstall -m0644 ./files/wifidog.conf $(IDIR_WIFIDOG)/etc/\n\tinstall -m0644 $(PKG_BUILD_DIR)/wifidog-msg.html $(IDIR_WIFIDOG)/etc/\n\tinstall -m0755 -d $(IDIR_WIFIDOG)/usr/bin\n\tinstall -m0755 -d $(IDIR_WIFIDOG)/usr/lib\n\tinstall -m0755 $(PKG_BUILD_DIR)/scripts/init.d/wifidog $(IDIR_WIFIDOG)/usr/bin/wifidog-init\n\t$(CP) $(PKG_INSTALL_DIR)/usr/bin/wifidog $(IDIR_WIFIDOG)/usr/bin/\n\t$(CP) $(PKG_INSTALL_DIR)/usr/bin/wdctl $(IDIR_WIFIDOG)/usr/bin/\n\t$(CP) $(PKG_INSTALL_DIR)/usr/lib/libhttpd.so* $(IDIR_WIFIDOG)/usr/lib/\n\t$(RSTRIP) $(IDIR_WIFIDOG)\n\t$(IPKG_BUILD) $(IDIR_WIFIDOG) $(PACKAGE_DIR)\nmostlyclean:\n\tmake -C $(PKG_BUILD_DIR) clean\n\trm $(PKG_BUILD_DIR)/.built\nall: $(IPKG_WIFIDOG)"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/build-openwrt-whiterussianipk/wifidog/files/wifidog.conf",
    "content": "# $Id: wifidog.conf 1375 2008-09-30 10:20:06Z wichert $\n# WiFiDog Configuration file\n\n# Parameter: GatewayID\n# Default: default\n# Optional\n#\n# Set this to the node ID on the auth server\n# This is used to give a customized login page to the clients and for\n# monitoring/statistics purpose. If you run multiple gateways on the same\n# machine each gateway needs to have a different gateway id.\n# If none is supplied, the mac address of the GatewayInterface interface will be used,\n# without the : separators\n\n# GatewayID default\n\n# Parameter: ExternalInterface\n# Default: NONE\n# Optional\n#\n# Set this to the external interface (the one going out to the Inernet or your larger LAN).  \n# Typically vlan1 for OpenWrt, and eth0 or ppp0 otherwise,\n# Normally autodetected\n\n# ExternalInterface eth0\n\n# Parameter: GatewayInterface\n# Default: NONE\n# Mandatory\n#\n# Set this to the internal interface (typically your wifi interface).    \n# Typically br0 for whiterussian, br-lan for kamikaze (by default the wifi interface is bridged with wired lan in openwrt)\n# and eth1, wlan0, ath0, etc. otherwise\n# You can get this interface with the ifconfig command and finding your wifi interface\n\nGatewayInterface br0\n\n# Parameter: GatewayAddress\n# Default: Find it from GatewayInterface\n# Optional\n#\n# Set this to the internal IP address of the gateway.  Not normally required.\n\n# GatewayAddress 192.168.1.1\n\n# Parameter: HtmlMessageFile\n# Default: wifidog-msg.html\n# Optional\n#\n# This allows you to specify a custome HTML file which will be used for\n# system errors by the gateway. Any $title, $message and $node variables\n# used inside the file will be replaced.\n#\n# HtmlMessageFile /opt/wifidog/etc/wifidog-.html\n\n# Parameter: AuthServer\n# Default: NONE\n# Mandatory, repeatable\n#\n# This allows you to configure your auth server(s).  Each one will be tried in order, untill one responds.\n# Set this to the hostname or IP of your auth server(s), the path where\n# WiFiDog-auth resides in and the port it listens on.\n#AuthServer {\n#\tHostname                 (Mandatory; Default: NONE)\n#\tSSLAvailable             (Optional; Default: no; Possible values: yes, no)\n#\tSSLPort                  (Optional; Default: 443)\n#\tHTTPPort                 (Optional; Default: 80)\n#\tPath                     (Optional; Default: /wifidog/ Note:  The path must be both prefixed and suffixed by /.  Use a single / for server root.)\n#   LoginScriptPathFragment  (Optional; Default: login/? Note:  This is the script the user will be sent to for login.)\n#   PortalScriptPathFragment (Optional; Default: portal/? Note:  This is the script the user will be sent to after a successfull login.)\n#   MsgScriptPathFragment    (Optional; Default: gw_message.php? Note:  This is the script the user will be sent to upon error to read a readable message.)\n#   PingScriptPathFragment    (Optional; Default: ping/? Note:  This is the script the user will be sent to upon error to read a readable message.)\n#   AuthScriptPathFragment    (Optional; Default: auth/? Note:  This is the script the user will be sent to upon error to read a readable message.)\n#}\n\n#AuthServer {\n#    Hostname auth.ilesansfil.org\n#    SSLAvailable yes\n#    Path /\n#}\n\n#AuthServer {\n#    Hostname auth2.ilesansfil.org\n#    SSLAvailable yes\n#    Path /\n#}\n\n# Parameter: Daemon\n# Default: 1\n# Optional\n#\n# Set this to true if you want to run as a daemon\n# Daemon 1\n\n# Parameter: GatewayPort\n# Default: 2060\n# Optional\n#\n# Listen on this port\n# GatewayPort 2060\n\n# Parameter: ProxyPort\n# Default: 0 (disable)\n# Optional\n#\n# Redirect http traffic of knowns & probations users\n# to a local transparent proxy listening on ProxyPort port\n# ProxyPort 0\n\n# Parameter: HTTPDName\n# Default: WiFiDog\n# Optional\n#\n# Define what name the HTTPD server will respond\n# HTTPDName WiFiDog\n\n# Parameter: HTTPDMaxConn\n# Default: 10\n# Optional\n#\n# How many sockets to listen to\n# HTTPDMaxConn 10\n\n# Parameter: HTTPDRealm\n# Default: WiFiDog\n# Optional\n#\n# The name of the HTTP authentication realm. This only used when a user\n# tries to access a protected WiFiDog internal page. See HTTPUserName.\n# HTTPDRealm WiFiDog\n\n# Parameter: HTTPDUserName / HTTPDPassword\n# Default: unset\n# Optional\n#\n# The gateway exposes some information such as the status page through its web\n# interface. This information can be protected with a username and password,\n# which can be set through the HTTPDUserName and HTTPDPassword parameters.\n# HTTPDUserName admin\n# HTTPDPassword secret\n\n# Parameter: CheckInterval\n# Default: 60\n# Optional\n#\n# How many seconds should we wait between timeout checks.  This is also\n# how often the gateway will ping the auth server and how often it will\n# update the traffic counters on the auth server.  Setting this too low\n# wastes bandwidth, setting this too high will cause the gateway to take \n# a long time to switch to it's backup auth server(s).\n\n# CheckInterval 60\n\n# Parameter: ClientTimeout\n# Default: 5\n# Optional\n#\n# Set this to the desired of number of CheckInterval of inactivity before a client is logged out\n# The timeout will be INTERVAL * TIMEOUT\nClientTimeout 5\n\n# Parameter: TrustedMACList\n# Default: none\n# Optional\n#\n# Comma separated list of MAC addresses who are allowed to pass\n# through without authentication\n#TrustedMACList 00:00:DE:AD:BE:AF,00:00:C0:1D:F0:0D\n\n# Parameter: FirewallRuleSet\n# Default: none\n# Mandatory\n#\n# Groups a number of FirewallRule statements together.\n\n# Parameter: FirewallRule\n# Default: none\n# \n# Define one firewall rule in a rule set.\n\n# Rule Set: global\n# \n# Used for rules to be applied to all other rulesets except locked.\nFirewallRuleSet global {\n    ## To block SMTP out, as it's a tech support nightmare, and a legal liability\n    #FirewallRule block tcp port 25\n    \n    ## Use the following if you don't want clients to be able to access machines on \n    ## the private LAN that gives internet access to wifidog.  Note that this is not\n    ## client isolation;  The laptops will still be able to talk to one another, as\n    ## well as to any machine bridged to the wifi of the router.\n    # FirewallRule block to 192.168.0.0/16\n    # FirewallRule block to 172.16.0.0/12\n    # FirewallRule block to 10.0.0.0/8\n    \n    ## This is an example ruleset for the Teliphone service.\n    #FirewallRule allow udp to 69.90.89.192/27\n    #FirewallRule allow udp to 69.90.85.0/27\n    #FirewallRule allow tcp port 80 to 69.90.89.205\n    \n    ## Use the following to log or ulog the traffic you want to allow or block.\n    # For OPENWRT: use of these feature requires modules ipt_LOG or ipt_ULOG present in dependencies\n    # iptables-mod-extra and iptables-mod-ulog (to adapt it to the linux distribution).\n    # Note: the log or ulog rule must be passed before, the rule you want to match.\n    # for openwrt: use of these feature requires modules ipt_LOG or ipt_ULOG present in dependencies\n    # iptables-mod-extra and iptables-mod-ulog\n    # For example, you want to log (ulog works the same way) the traffic allowed on port 80 to the ip 69.90.89.205:\n    #FirewallRule log tcp port 80 to 69.90.89.205\n    #FirewallRule allow tcp port 80 to 69.90.89.205\n    # And you want to know, who matche your block rule:\n    #FirewallRule log to 0.0.0.0/0\n    #FirewallRule block to 0.0.0.0/0\n}\n\n# Rule Set: validating-users\n#\n# Used for new users validating their account\nFirewallRuleSet validating-users {\n    FirewallRule allow to 0.0.0.0/0\n}\n\n# Rule Set: known-users\n#\n# Used for normal validated users.\nFirewallRuleSet known-users {\n    FirewallRule allow to 0.0.0.0/0\n}\n\n# Rule Set: unknown-users\n#\n# Used for unvalidated users, this is the ruleset that gets redirected.\n#\n# XXX The redirect code adds the Default DROP clause.\nFirewallRuleSet unknown-users {\n    FirewallRule allow udp port 53\n    FirewallRule allow tcp port 53\n    FirewallRule allow udp port 67\n    FirewallRule allow tcp port 67\n}\n\n# Rule Set: locked-users\n#\n# Not currently used\nFirewallRuleSet locked-users {\n    FirewallRule block to 0.0.0.0/0\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/build-openwrt-whiterussianipk/wifidog/files/wifidog.init",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2006 OpenWrt.org\nSTART=50\n\nstart() {\n\t/usr/bin/wifidog-init start\n}\n\nstop() {\n\t/usr/bin/wifidog-init stop\n}\n\nstatus() {\n\t/usr/bin/wifidog-init status\n}"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/build-openwrt-whiterussianipk/wifidog/ipkg/wifidog.conffiles",
    "content": "/etc/wifidog.conf\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/build-openwrt-whiterussianipk/wifidog/ipkg/wifidog.control",
    "content": "Package: wifidog\nPriority: optional\nSection: net\nDepends: libpthread, iptables, iptables-mod-nat, iptables-mod-ipopt\nDescription: WiFiDog is a complete and embeddable captive portal\n        solution for wireless community groups or individuals who\n        wish to open a free Hotspot while still preventing abuse\n        of their Internet connection.\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/contrib/dump_fw.sh",
    "content": "#!sh\niptables --list --table filter\niptables --list --table mangle\niptables --list --table nat\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/doc/Makefile.am",
    "content": "SUBDIRS =\n\ndocdir = ${prefix}/share/doc/wifidog-@VERSION@\n\nEXTRA_DIST = \\\n\tdoxygen.cfg \\\n\tdoxygen.cfg.in \\\n\tREADME.developers.txt\n\nall:\n\ndoc: doxygen.cfg\n\techo \"doc: \" && pwd && \techo \"distdir: \" && echo $(distdir)\n\trm -rf html/ refman.pdf\n\t$(DOXYGEN) doxygen.cfg\n#\t$(MAKE) -C latex/ \n#\tmv latex/refman.pdf ./refman.pdf\n\ndist-hook: doxygen.cfg\n\techo \"dist-hook: \" && pwd\n\tcd $(srcdir) && pwd && rm -rf html refman.pdf && $(DOXYGEN) doxygen.cfg\n\tcp -rp html ${distdir}\n\nclean-local:\n\techo \"clean-local: \" && pwd\n\trm -rf latex/\n\trm -f *~\n\trm -f doxygen.log\n\trm -f doxygen.cfg\n\nmaintainer-clean-local: clean-local\n\techo \"maintainer-clean-local: \" && pwd\n\trm -rf html refman.pdf\n\ninstall-data-hook:\n\t$(mkinstalldirs) $(DESTDIR)$(docdir)\n\tmkdir -p html #Workaround to allow libofx-cvs user to install without doc.\n\tcp -rp html $(DESTDIR)$(docdir)\n\nuninstall-hook:\n\tchmod +w -R $(DESTDIR)${docdir}/html #Why chmod is needed is a mystery\n\trm -rf $(DESTDIR)${docdir}/html\n\n## We borrow guile's convention and use @-...-@ as the substitution\n## brackets here, instead of the usual @...@.  This prevents autoconf\n## from substituting the values directly into the left-hand sides of\n## the sed substitutions.\ndoxygen.cfg: doxygen.cfg.in Makefile\n\trm -f $@.tmp\n\tsed < $< > $@.tmp \\\n            -e 's:@-top_srcdir-@:${top_srcdir}:g'\n\tmv $@.tmp $@"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/doc/README.developers.txt",
    "content": "\n$Id$\n\n\nThis file contains some small notes on developing the WiFiDog application.\n\nThe application's home page is:\n\thttp://www.ilesansfil.org/wiki/WiFiDog\n\nThe application's sourceforge page is:\n\thttp://sourceforge.net/projects/wifidog/\n\nAs a developer, you must subscribe to sourceforge as a \"developer\" under WiFiDog, as well as subscribe to the WiFiDog mailing list located at:\n\thttp://listes.ilesansfil.org/cgi-bin/mailman/listinfo/wifidog\n\n\nSOURCE CODE:\n\t- Please do not contribute unless you agree with the GPL license and are contributing your portion under that license.  See the included LICENSE.txt\n\t- Please respect the intellectual property of others.  You are not allowed to taint WiFiDog by including source code from projects that do not allow so.\n\t- Keep in mind that this application will run on extremely simple embedded devices.  The binary size needs to be small, the dependencies absolutely minimal, and the memory footprint negligible.\n\t- Always place the subversion \"Id\" macro at the top of every file\n\t- Since this is a collaborative project, please aim for clearness instead of cleverness when faced with a choice.\n\t- If you must use some cleverness, please add appropriate clear comments.\n\t- Please re-indent your code before committing to subversion - see the \"Formatting Your Source Code\" section in the GNU Coding Standards at http://www.gnu.org/prep/standards_toc.html - the entire document makes a good reading if you haven't read it before.  Also see the \"indent\" program.\n\t- Before writing any brand-new large chunks of code, make sure it's logic has been discussed with the other team of developers or included in the design stage.\n\n\nMEMORY ALLOCATION IN SOURCE CODE:\n\t- Safe versions of C functions that allocate memory (safe_malloc, safe_asprintf, etc..) have been created in safe.c . You must use them instead of the original functions.\n\t- If you need to use a memory-allocating C function that does not have a safe version in safe.c, create the safe wrapper first (following the template of the others) and use that instead of calling the original.\n\n\nDOCUMENTATION:\n\t- Please use DoxyGen-style comments (see http://www.doxygen.org/ for details) for source code documentation.\n\t- Please use DocBook-SGML documentation for user documentation.  This will make it easy to export documentation in multiple formats.  Otherwise submit your documentation in plaintext format to someone who will change it to DocBook.\n\t- Please thoroughly-comment non-clear sections in your code.\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/doc/doxygen.cfg.in",
    "content": "# Doxyfile 1.5.3\n\n# This file describes the settings to be used by the documentation system\n# doxygen (www.doxygen.org) for a project\n#\n# All text after a hash (#) is considered a comment and will be ignored\n# The format is:\n#       TAG = value [value, ...]\n# For lists items can also be appended using:\n#       TAG += value [value, ...]\n# Values that contain spaces should be placed between quotes (\" \")\n\n#---------------------------------------------------------------------------\n# Project related configuration options\n#---------------------------------------------------------------------------\n\n# This tag specifies the encoding used for all characters in the config file that \n# follow. The default is UTF-8 which is also the encoding used for all text before \n# the first occurrence of this tag. Doxygen uses libiconv (or the iconv built into \n# libc) for the transcoding. See http://www.gnu.org/software/libiconv for the list of \n# possible encodings.\n\nDOXYFILE_ENCODING      = UTF-8\n\n# The PROJECT_NAME tag is a single word (or a sequence of words surrounded \n# by quotes) that should identify the project.\n\nPROJECT_NAME           = WifiDog\n\n# The PROJECT_NUMBER tag can be used to enter a project or revision number. \n# This could be handy for archiving the generated documentation or \n# if some version control system is used.\n\nPROJECT_NUMBER         = \n\n# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) \n# base path where the generated documentation will be put. \n# If a relative path is entered, it will be relative to the location \n# where doxygen was started. If left blank the current directory will be used.\n\nOUTPUT_DIRECTORY       = \n\n# If the CREATE_SUBDIRS tag is set to YES, then doxygen will create \n# 4096 sub-directories (in 2 levels) under the output directory of each output \n# format and will distribute the generated files over these directories. \n# Enabling this option can be useful when feeding doxygen a huge amount of \n# source files, where putting all generated files in the same directory would \n# otherwise cause performance problems for the file system.\n\nCREATE_SUBDIRS         = NO\n\n# The OUTPUT_LANGUAGE tag is used to specify the language in which all \n# documentation generated by doxygen is written. Doxygen will use this \n# information to generate all constant output in the proper language. \n# The default language is English, other supported languages are: \n# Afrikaans, Arabic, Brazilian, Catalan, Chinese, Chinese-Traditional, \n# Croatian, Czech, Danish, Dutch, Finnish, French, German, Greek, Hungarian, \n# Italian, Japanese, Japanese-en (Japanese with English messages), Korean, \n# Korean-en, Lithuanian, Norwegian, Polish, Portuguese, Romanian, Russian, \n# Serbian, Slovak, Slovene, Spanish, Swedish, and Ukrainian.\n\nOUTPUT_LANGUAGE        = English\n\n# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will \n# include brief member descriptions after the members that are listed in \n# the file and class documentation (similar to JavaDoc). \n# Set to NO to disable this.\n\nBRIEF_MEMBER_DESC      = YES\n\n# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend \n# the brief description of a member or function before the detailed description. \n# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the \n# brief descriptions will be completely suppressed.\n\nREPEAT_BRIEF           = YES\n\n# This tag implements a quasi-intelligent brief description abbreviator \n# that is used to form the text in various listings. Each string \n# in this list, if found as the leading text of the brief description, will be \n# stripped from the text and the result after processing the whole list, is \n# used as the annotated text. Otherwise, the brief description is used as-is. \n# If left blank, the following values are used (\"$name\" is automatically \n# replaced with the name of the entity): \"The $name class\" \"The $name widget\" \n# \"The $name file\" \"is\" \"provides\" \"specifies\" \"contains\" \n# \"represents\" \"a\" \"an\" \"the\"\n\nABBREVIATE_BRIEF       = \n\n# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then \n# Doxygen will generate a detailed section even if there is only a brief \n# description.\n\nALWAYS_DETAILED_SEC    = YES\n\n# If the INLINE_INHERITED_MEMB tag is set to YES, doxygen will show all \n# inherited members of a class in the documentation of that class as if those \n# members were ordinary class members. Constructors, destructors and assignment \n# operators of the base classes will not be shown.\n\nINLINE_INHERITED_MEMB  = NO\n\n# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full \n# path before files name in the file list and in the header files. If set \n# to NO the shortest path that makes the file name unique will be used.\n\nFULL_PATH_NAMES        = NO\n\n# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag \n# can be used to strip a user-defined part of the path. Stripping is \n# only done if one of the specified strings matches the left-hand part of \n# the path. The tag can be used to show relative paths in the file list. \n# If left blank the directory from which doxygen is run is used as the \n# path to strip.\n\nSTRIP_FROM_PATH        = \n\n# The STRIP_FROM_INC_PATH tag can be used to strip a user-defined part of \n# the path mentioned in the documentation of a class, which tells \n# the reader which header file to include in order to use a class. \n# If left blank only the name of the header file containing the class \n# definition is used. Otherwise one should specify the include paths that \n# are normally passed to the compiler using the -I flag.\n\nSTRIP_FROM_INC_PATH    = \n\n# If the SHORT_NAMES tag is set to YES, doxygen will generate much shorter \n# (but less readable) file names. This can be useful is your file systems \n# doesn't support long names like on DOS, Mac, or CD-ROM.\n\nSHORT_NAMES            = NO\n\n# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen \n# will interpret the first line (until the first dot) of a JavaDoc-style \n# comment as the brief description. If set to NO, the JavaDoc \n# comments will behave just like regular Qt-style comments \n# (thus requiring an explicit @brief command for a brief description.)\n\nJAVADOC_AUTOBRIEF      = NO\n\n# If the QT_AUTOBRIEF tag is set to YES then Doxygen will \n# interpret the first line (until the first dot) of a Qt-style \n# comment as the brief description. If set to NO, the comments \n# will behave just like regular Qt-style comments (thus requiring \n# an explicit \\brief command for a brief description.)\n\nQT_AUTOBRIEF           = NO\n\n# The MULTILINE_CPP_IS_BRIEF tag can be set to YES to make Doxygen \n# treat a multi-line C++ special comment block (i.e. a block of //! or /// \n# comments) as a brief description. This used to be the default behaviour. \n# The new default is to treat a multi-line C++ comment block as a detailed \n# description. Set this tag to YES if you prefer the old behaviour instead.\n\nMULTILINE_CPP_IS_BRIEF = NO\n\n# If the DETAILS_AT_TOP tag is set to YES then Doxygen \n# will output the detailed description near the top, like JavaDoc.\n# If set to NO, the detailed description appears after the member \n# documentation.\n\nDETAILS_AT_TOP         = NO\n\n# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented \n# member inherits the documentation from any documented member that it \n# re-implements.\n\nINHERIT_DOCS           = YES\n\n# If the SEPARATE_MEMBER_PAGES tag is set to YES, then doxygen will produce \n# a new page for each member. If set to NO, the documentation of a member will \n# be part of the file/class/namespace that contains it.\n\nSEPARATE_MEMBER_PAGES  = NO\n\n# The TAB_SIZE tag can be used to set the number of spaces in a tab. \n# Doxygen uses this value to replace tabs by spaces in code fragments.\n\nTAB_SIZE               = 8\n\n# This tag can be used to specify a number of aliases that acts \n# as commands in the documentation. An alias has the form \"name=value\". \n# For example adding \"sideeffect=\\par Side Effects:\\n\" will allow you to \n# put the command \\sideeffect (or @sideeffect) in the documentation, which \n# will result in a user-defined paragraph with heading \"Side Effects:\". \n# You can put \\n's in the value part of an alias to insert newlines.\n\nALIASES                = \n\n# Set the OPTIMIZE_OUTPUT_FOR_C tag to YES if your project consists of C \n# sources only. Doxygen will then generate output that is more tailored for C. \n# For instance, some of the names that are used will be different. The list \n# of all members will be omitted, etc.\n\nOPTIMIZE_OUTPUT_FOR_C  = YES\n\n# Set the OPTIMIZE_OUTPUT_JAVA tag to YES if your project consists of Java \n# sources only. Doxygen will then generate output that is more tailored for Java. \n# For instance, namespaces will be presented as packages, qualified scopes \n# will look different, etc.\n\nOPTIMIZE_OUTPUT_JAVA   = NO\n\n# If you use STL classes (i.e. std::string, std::vector, etc.) but do not want to \n# include (a tag file for) the STL sources as input, then you should \n# set this tag to YES in order to let doxygen match functions declarations and \n# definitions whose arguments contain STL classes (e.g. func(std::string); v.s. \n# func(std::string) {}). This also make the inheritance and collaboration \n# diagrams that involve STL classes more complete and accurate.\n\nBUILTIN_STL_SUPPORT    = NO\n\n# If you use Microsoft's C++/CLI language, you should set this option to YES to\n# enable parsing support.\n\nCPP_CLI_SUPPORT        = NO\n\n# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC \n# tag is set to YES, then doxygen will reuse the documentation of the first \n# member in the group (if any) for the other members of the group. By default \n# all members of a group must be documented explicitly.\n\nDISTRIBUTE_GROUP_DOC   = YES\n\n# Set the SUBGROUPING tag to YES (the default) to allow class member groups of \n# the same type (for instance a group of public functions) to be put as a \n# subgroup of that type (e.g. under the Public Functions section). Set it to \n# NO to prevent subgrouping. Alternatively, this can be done per class using \n# the \\nosubgrouping command.\n\nSUBGROUPING            = YES\n\n#---------------------------------------------------------------------------\n# Build related configuration options\n#---------------------------------------------------------------------------\n\n# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in \n# documentation are documented, even if no documentation was available. \n# Private class members and static file members will be hidden unless \n# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES\n\nEXTRACT_ALL            = NO\n\n# If the EXTRACT_PRIVATE tag is set to YES all private members of a class \n# will be included in the documentation.\n\nEXTRACT_PRIVATE        = NO\n\n# If the EXTRACT_STATIC tag is set to YES all static members of a file \n# will be included in the documentation.\n\nEXTRACT_STATIC         = YES\n\n# If the EXTRACT_LOCAL_CLASSES tag is set to YES classes (and structs) \n# defined locally in source files will be included in the documentation. \n# If set to NO only classes defined in header files are included.\n\nEXTRACT_LOCAL_CLASSES  = YES\n\n# This flag is only useful for Objective-C code. When set to YES local \n# methods, which are defined in the implementation section but not in \n# the interface are included in the documentation. \n# If set to NO (the default) only methods in the interface are included.\n\nEXTRACT_LOCAL_METHODS  = NO\n\n# If this flag is set to YES, the members of anonymous namespaces will be extracted \n# and appear in the documentation as a namespace called 'anonymous_namespace{file}', \n# where file will be replaced with the base name of the file that contains the anonymous \n# namespace. By default anonymous namespace are hidden.\n\nEXTRACT_ANON_NSPACES   = NO\n\n# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all \n# undocumented members of documented classes, files or namespaces. \n# If set to NO (the default) these members will be included in the \n# various overviews, but no documentation section is generated. \n# This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_MEMBERS     = NO\n\n# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all \n# undocumented classes that are normally visible in the class hierarchy. \n# If set to NO (the default) these classes will be included in the various \n# overviews. This option has no effect if EXTRACT_ALL is enabled.\n\nHIDE_UNDOC_CLASSES     = NO\n\n# If the HIDE_FRIEND_COMPOUNDS tag is set to YES, Doxygen will hide all \n# friend (class|struct|union) declarations. \n# If set to NO (the default) these declarations will be included in the \n# documentation.\n\nHIDE_FRIEND_COMPOUNDS  = NO\n\n# If the HIDE_IN_BODY_DOCS tag is set to YES, Doxygen will hide any \n# documentation blocks found inside the body of a function. \n# If set to NO (the default) these blocks will be appended to the \n# function's detailed documentation block.\n\nHIDE_IN_BODY_DOCS      = NO\n\n# The INTERNAL_DOCS tag determines if documentation \n# that is typed after a \\internal command is included. If the tag is set \n# to NO (the default) then the documentation will be excluded. \n# Set it to YES to include the internal documentation.\n\nINTERNAL_DOCS          = NO\n\n# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate \n# file names in lower-case letters. If set to YES upper-case letters are also \n# allowed. This is useful if you have classes or files whose names only differ \n# in case and if your file system supports case sensitive file names. Windows \n# and Mac users are advised to set this option to NO.\n\nCASE_SENSE_NAMES       = YES\n\n# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen \n# will show members with their full class and namespace scopes in the \n# documentation. If set to YES the scope will be hidden.\n\nHIDE_SCOPE_NAMES       = NO\n\n# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen \n# will put a list of the files that are included by a file in the documentation \n# of that file.\n\nSHOW_INCLUDE_FILES     = NO\n\n# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] \n# is inserted in the documentation for inline members.\n\nINLINE_INFO            = YES\n\n# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen \n# will sort the (detailed) documentation of file and class members \n# alphabetically by member name. If set to NO the members will appear in \n# declaration order.\n\nSORT_MEMBER_DOCS       = YES\n\n# If the SORT_BRIEF_DOCS tag is set to YES then doxygen will sort the \n# brief documentation of file, namespace and class members alphabetically \n# by member name. If set to NO (the default) the members will appear in \n# declaration order.\n\nSORT_BRIEF_DOCS        = NO\n\n# If the SORT_BY_SCOPE_NAME tag is set to YES, the class list will be \n# sorted by fully-qualified names, including namespaces. If set to \n# NO (the default), the class list will be sorted only by class name, \n# not including the namespace part. \n# Note: This option is not very useful if HIDE_SCOPE_NAMES is set to YES.\n# Note: This option applies only to the class list, not to the \n# alphabetical list.\n\nSORT_BY_SCOPE_NAME     = NO\n\n# The GENERATE_TODOLIST tag can be used to enable (YES) or \n# disable (NO) the todo list. This list is created by putting \\todo \n# commands in the documentation.\n\nGENERATE_TODOLIST      = YES\n\n# The GENERATE_TESTLIST tag can be used to enable (YES) or \n# disable (NO) the test list. This list is created by putting \\test \n# commands in the documentation.\n\nGENERATE_TESTLIST      = YES\n\n# The GENERATE_BUGLIST tag can be used to enable (YES) or \n# disable (NO) the bug list. This list is created by putting \\bug \n# commands in the documentation.\n\nGENERATE_BUGLIST       = YES\n\n# The GENERATE_DEPRECATEDLIST tag can be used to enable (YES) or \n# disable (NO) the deprecated list. This list is created by putting \n# \\deprecated commands in the documentation.\n\nGENERATE_DEPRECATEDLIST= YES\n\n# The ENABLED_SECTIONS tag can be used to enable conditional \n# documentation sections, marked by \\if sectionname ... \\endif.\n\nENABLED_SECTIONS       = \n\n# The MAX_INITIALIZER_LINES tag determines the maximum number of lines \n# the initial value of a variable or define consists of for it to appear in \n# the documentation. If the initializer consists of more lines than specified \n# here it will be hidden. Use a value of 0 to hide initializers completely. \n# The appearance of the initializer of individual variables and defines in the \n# documentation can be controlled using \\showinitializer or \\hideinitializer \n# command in the documentation regardless of this setting.\n\nMAX_INITIALIZER_LINES  = 30\n\n# Set the SHOW_USED_FILES tag to NO to disable the list of files generated \n# at the bottom of the documentation of classes and structs. If set to YES the \n# list will mention the files that were used to generate the documentation.\n\nSHOW_USED_FILES        = YES\n\n# If the sources in your project are distributed over multiple directories \n# then setting the SHOW_DIRECTORIES tag to YES will show the directory hierarchy \n# in the documentation. The default is NO.\n\nSHOW_DIRECTORIES       = NO\n\n# The FILE_VERSION_FILTER tag can be used to specify a program or script that \n# doxygen should invoke to get the current version for each file (typically from the \n# version control system). Doxygen will invoke the program by executing (via \n# popen()) the command <command> <input-file>, where <command> is the value of \n# the FILE_VERSION_FILTER tag, and <input-file> is the name of an input file \n# provided by doxygen. Whatever the program writes to standard output \n# is used as the file version. See the manual for examples.\n\nFILE_VERSION_FILTER    = \n\n#---------------------------------------------------------------------------\n# configuration options related to warning and progress messages\n#---------------------------------------------------------------------------\n\n# The QUIET tag can be used to turn on/off the messages that are generated \n# by doxygen. Possible values are YES and NO. If left blank NO is used.\n\nQUIET                  = YES\n\n# The WARNINGS tag can be used to turn on/off the warning messages that are \n# generated by doxygen. Possible values are YES and NO. If left blank \n# NO is used.\n\nWARNINGS               = YES\n\n# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings \n# for undocumented members. If EXTRACT_ALL is set to YES then this flag will \n# automatically be disabled.\n\nWARN_IF_UNDOCUMENTED   = YES\n\n# If WARN_IF_DOC_ERROR is set to YES, doxygen will generate warnings for \n# potential errors in the documentation, such as not documenting some \n# parameters in a documented function, or documenting parameters that \n# don't exist or using markup commands wrongly.\n\nWARN_IF_DOC_ERROR      = YES\n\n# This WARN_NO_PARAMDOC option can be abled to get warnings for \n# functions that are documented, but have no documentation for their parameters \n# or return value. If set to NO (the default) doxygen will only warn about \n# wrong or incomplete parameter documentation, but not about the absence of \n# documentation.\n\nWARN_NO_PARAMDOC       = NO\n\n# The WARN_FORMAT tag determines the format of the warning messages that \n# doxygen can produce. The string should contain the $file, $line, and $text \n# tags, which will be replaced by the file and line number from which the \n# warning originated and the warning text. Optionally the format may contain \n# $version, which will be replaced by the version of the file (if it could \n# be obtained via FILE_VERSION_FILTER)\n\nWARN_FORMAT            = \n\n# The WARN_LOGFILE tag can be used to specify a file to which warning \n# and error messages should be written. If left blank the output is written \n# to stderr.\n\nWARN_LOGFILE           = \n\n#---------------------------------------------------------------------------\n# configuration options related to the input files\n#---------------------------------------------------------------------------\n\n# The INPUT tag can be used to specify the files and/or directories that contain \n# documented source files. You may enter file names like \"myfile.cpp\" or \n# directories like \"/usr/src/myproject\". Separate the files or directories \n# with spaces.\n\nINPUT                  = @-top_srcdir-@/src\n\n# This tag can be used to specify the character encoding of the source files that \n# doxygen parses. Internally doxygen uses the UTF-8 encoding, which is also the default \n# input encoding. Doxygen uses libiconv (or the iconv built into libc) for the transcoding. \n# See http://www.gnu.org/software/libiconv for the list of possible encodings.\n\nINPUT_ENCODING         = UTF-8\n\n# If the value of the INPUT tag contains directories, you can use the \n# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n# and *.h) to filter out the source-files in the directories. If left \n# blank the following patterns are tested: \n# *.c *.cc *.cxx *.cpp *.c++ *.java *.ii *.ixx *.ipp *.i++ *.inl *.h *.hh *.hxx \n# *.hpp *.h++ *.idl *.odl *.cs *.php *.php3 *.inc *.m *.mm *.py\n\nFILE_PATTERNS          = \n\n# The RECURSIVE tag can be used to turn specify whether or not subdirectories \n# should be searched for input files as well. Possible values are YES and NO. \n# If left blank NO is used.\n\nRECURSIVE              = YES\n\n# The EXCLUDE tag can be used to specify files and/or directories that should \n# excluded from the INPUT source files. This way you can easily exclude a \n# subdirectory from a directory tree whose root is specified with the INPUT tag.\n\nEXCLUDE                = @-top_srcdir-@/libhttpd/\n\n# The EXCLUDE_SYMLINKS tag can be used select whether or not files or \n# directories that are symbolic links (a Unix filesystem feature) are excluded \n# from the input.\n\nEXCLUDE_SYMLINKS       = NO\n\n# If the value of the INPUT tag contains directories, you can use the \n# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude \n# certain files from those directories. Note that the wildcards are matched \n# against the file with absolute path, so to exclude all test directories \n# for example use the pattern */test/*\n\nEXCLUDE_PATTERNS       = \n\n# The EXCLUDE_SYMBOLS tag can be used to specify one or more symbol names \n# (namespaces, classes, functions, etc.) that should be excluded from the output. \n# The symbol name can be a fully qualified name, a word, or if the wildcard * is used, \n# a substring. Examples: ANamespace, AClass, AClass::ANamespace, ANamespace::*Test\n\nEXCLUDE_SYMBOLS        = \n\n# The EXAMPLE_PATH tag can be used to specify one or more files or \n# directories that contain example code fragments that are included (see \n# the \\include command).\n\nEXAMPLE_PATH           = \n\n# If the value of the EXAMPLE_PATH tag contains directories, you can use the \n# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp \n# and *.h) to filter out the source-files in the directories. If left \n# blank all files are included.\n\nEXAMPLE_PATTERNS       = \n\n# If the EXAMPLE_RECURSIVE tag is set to YES then subdirectories will be \n# searched for input files to be used with the \\include or \\dontinclude \n# commands irrespective of the value of the RECURSIVE tag. \n# Possible values are YES and NO. If left blank NO is used.\n\nEXAMPLE_RECURSIVE      = NO\n\n# The IMAGE_PATH tag can be used to specify one or more files or \n# directories that contain image that are included in the documentation (see \n# the \\image command).\n\nIMAGE_PATH             = \n\n# The INPUT_FILTER tag can be used to specify a program that doxygen should \n# invoke to filter for each input file. Doxygen will invoke the filter program \n# by executing (via popen()) the command <filter> <input-file>, where <filter> \n# is the value of the INPUT_FILTER tag, and <input-file> is the name of an \n# input file. Doxygen will then use the output that the filter program writes \n# to standard output.  If FILTER_PATTERNS is specified, this tag will be \n# ignored.\n\nINPUT_FILTER           = \n\n# The FILTER_PATTERNS tag can be used to specify filters on a per file pattern \n# basis.  Doxygen will compare the file name with each pattern and apply the \n# filter if there is a match.  The filters are a list of the form: \n# pattern=filter (like *.cpp=my_cpp_filter). See INPUT_FILTER for further \n# info on how filters are used. If FILTER_PATTERNS is empty, INPUT_FILTER \n# is applied to all files.\n\nFILTER_PATTERNS        = \n\n# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using \n# INPUT_FILTER) will be used to filter the input files when producing source \n# files to browse (i.e. when SOURCE_BROWSER is set to YES).\n\nFILTER_SOURCE_FILES    = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to source browsing\n#---------------------------------------------------------------------------\n\n# If the SOURCE_BROWSER tag is set to YES then a list of source files will \n# be generated. Documented entities will be cross-referenced with these sources. \n# Note: To get rid of all source code in the generated output, make sure also \n# VERBATIM_HEADERS is set to NO. If you have enabled CALL_GRAPH or CALLER_GRAPH \n# then you must also enable this option. If you don't then doxygen will produce \n# a warning and turn it on anyway\n\nSOURCE_BROWSER         = YES\n\n# Setting the INLINE_SOURCES tag to YES will include the body \n# of functions and classes directly in the documentation.\n\nINLINE_SOURCES         = NO\n\n# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct \n# doxygen to hide any special comment blocks from generated source code \n# fragments. Normal C and C++ comments will always remain visible.\n\nSTRIP_CODE_COMMENTS    = YES\n\n# If the REFERENCED_BY_RELATION tag is set to YES (the default) \n# then for each documented function all documented \n# functions referencing it will be listed.\n\nREFERENCED_BY_RELATION = YES\n\n# If the REFERENCES_RELATION tag is set to YES (the default) \n# then for each documented function all documented entities \n# called/used by that function will be listed.\n\nREFERENCES_RELATION    = YES\n\n# If the REFERENCES_LINK_SOURCE tag is set to YES (the default)\n# and SOURCE_BROWSER tag is set to YES, then the hyperlinks from\n# functions in REFERENCES_RELATION and REFERENCED_BY_RELATION lists will\n# link to the source code.  Otherwise they will link to the documentstion.\n\nREFERENCES_LINK_SOURCE = YES\n\n# If the USE_HTAGS tag is set to YES then the references to source code \n# will point to the HTML generated by the htags(1) tool instead of doxygen \n# built-in source browser. The htags tool is part of GNU's global source \n# tagging system (see http://www.gnu.org/software/global/global.html). You \n# will need version 4.8.6 or higher.\n\nUSE_HTAGS              = NO\n\n# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen \n# will generate a verbatim copy of the header file for each class for \n# which an include is specified. Set to NO to disable this.\n\nVERBATIM_HEADERS       = YES\n\n#---------------------------------------------------------------------------\n# configuration options related to the alphabetical class index\n#---------------------------------------------------------------------------\n\n# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index \n# of all compounds will be generated. Enable this if the project \n# contains a lot of classes, structs, unions or interfaces.\n\nALPHABETICAL_INDEX     = NO\n\n# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then \n# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns \n# in which this list will be split (can be a number in the range [1..20])\n\nCOLS_IN_ALPHA_INDEX    = 5\n\n# In case all classes in a project start with a common prefix, all \n# classes will be put under the same header in the alphabetical index. \n# The IGNORE_PREFIX tag can be used to specify one or more prefixes that \n# should be ignored while generating the index headers.\n\nIGNORE_PREFIX          = \n\n#---------------------------------------------------------------------------\n# configuration options related to the HTML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_HTML tag is set to YES (the default) Doxygen will \n# generate HTML output.\n\nGENERATE_HTML          = YES\n\n# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. \n# If a relative path is entered the value of OUTPUT_DIRECTORY will be \n# put in front of it. If left blank `html' will be used as the default path.\n\nHTML_OUTPUT            = \n\n# The HTML_FILE_EXTENSION tag can be used to specify the file extension for \n# each generated HTML page (for example: .htm,.php,.asp). If it is left blank \n# doxygen will generate files with .html extension.\n\nHTML_FILE_EXTENSION    = \n\n# The HTML_HEADER tag can be used to specify a personal HTML header for \n# each generated HTML page. If it is left blank doxygen will generate a \n# standard header.\n\nHTML_HEADER            = \n\n# The HTML_FOOTER tag can be used to specify a personal HTML footer for \n# each generated HTML page. If it is left blank doxygen will generate a \n# standard footer.\n\nHTML_FOOTER            = \n\n# The HTML_STYLESHEET tag can be used to specify a user-defined cascading \n# style sheet that is used by each HTML page. It can be used to \n# fine-tune the look of the HTML output. If the tag is left blank doxygen \n# will generate a default style sheet. Note that doxygen will try to copy \n# the style sheet file to the HTML output directory, so don't put your own \n# stylesheet in the HTML output directory as well, or it will be erased!\n\nHTML_STYLESHEET        = \n\n# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, \n# files or namespaces will be aligned in HTML using tables. If set to \n# NO a bullet list will be used.\n\nHTML_ALIGN_MEMBERS     = YES\n\n# If the GENERATE_HTMLHELP tag is set to YES, additional index files \n# will be generated that can be used as input for tools like the \n# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) \n# of the generated HTML documentation.\n\nGENERATE_HTMLHELP      = NO\n\n# If the HTML_DYNAMIC_SECTIONS tag is set to YES then the generated HTML \n# documentation will contain sections that can be hidden and shown after the \n# page has loaded. For this to work a browser that supports \n# JavaScript and DHTML is required (for instance Mozilla 1.0+, Firefox \n# Netscape 6.0+, Internet explorer 5.0+, Konqueror, or Safari).\n\nHTML_DYNAMIC_SECTIONS  = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the CHM_FILE tag can \n# be used to specify the file name of the resulting .chm file. You \n# can add a path in front of the file if the result should not be \n# written to the html output directory.\n\nCHM_FILE               = \n\n# If the GENERATE_HTMLHELP tag is set to YES, the HHC_LOCATION tag can \n# be used to specify the location (absolute path including file name) of \n# the HTML help compiler (hhc.exe). If non-empty doxygen will try to run \n# the HTML help compiler on the generated index.hhp.\n\nHHC_LOCATION           = \n\n# If the GENERATE_HTMLHELP tag is set to YES, the GENERATE_CHI flag \n# controls if a separate .chi index file is generated (YES) or that \n# it should be included in the master .chm file (NO).\n\nGENERATE_CHI           = NO\n\n# If the GENERATE_HTMLHELP tag is set to YES, the BINARY_TOC flag \n# controls whether a binary table of contents is generated (YES) or a \n# normal table of contents (NO) in the .chm file.\n\nBINARY_TOC             = NO\n\n# The TOC_EXPAND flag can be set to YES to add extra items for group members \n# to the contents of the HTML help documentation and to the tree view.\n\nTOC_EXPAND             = NO\n\n# The DISABLE_INDEX tag can be used to turn on/off the condensed index at \n# top of each HTML page. The value NO (the default) enables the index and \n# the value YES disables it.\n\nDISABLE_INDEX          = NO\n\n# This tag can be used to set the number of enum values (range [1..20]) \n# that doxygen will group on one line in the generated HTML documentation.\n\nENUM_VALUES_PER_LINE   = 4\n\n# If the GENERATE_TREEVIEW tag is set to YES, a side panel will be\n# generated containing a tree-like index structure (just like the one that \n# is generated for HTML Help). For this to work a browser that supports \n# JavaScript, DHTML, CSS and frames is required (for instance Mozilla 1.0+, \n# Netscape 6.0+, Internet explorer 5.0+, or Konqueror). Windows users are \n# probably better off using the HTML help feature.\n\nGENERATE_TREEVIEW      = YES\n\n# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be \n# used to set the initial width (in pixels) of the frame in which the tree \n# is shown.\n\nTREEVIEW_WIDTH         = 250\n\n#---------------------------------------------------------------------------\n# configuration options related to the LaTeX output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will \n# generate Latex output.\n\nGENERATE_LATEX         = NO\n\n# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. \n# If a relative path is entered the value of OUTPUT_DIRECTORY will be \n# put in front of it. If left blank `latex' will be used as the default path.\n\nLATEX_OUTPUT           = \n\n# The LATEX_CMD_NAME tag can be used to specify the LaTeX command name to be \n# invoked. If left blank `latex' will be used as the default command name.\n\nLATEX_CMD_NAME         = \n\n# The MAKEINDEX_CMD_NAME tag can be used to specify the command name to \n# generate index for LaTeX. If left blank `makeindex' will be used as the \n# default command name.\n\nMAKEINDEX_CMD_NAME     = \n\n# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact \n# LaTeX documents. This may be useful for small projects and may help to \n# save some trees in general.\n\nCOMPACT_LATEX          = NO\n\n# The PAPER_TYPE tag can be used to set the paper type that is used \n# by the printer. Possible values are: a4, a4wide, letter, legal and \n# executive. If left blank a4wide will be used.\n\nPAPER_TYPE             = letter\n\n# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX \n# packages that should be included in the LaTeX output.\n\nEXTRA_PACKAGES         = \n\n# The LATEX_HEADER tag can be used to specify a personal LaTeX header for \n# the generated latex document. The header should contain everything until \n# the first chapter. If it is left blank doxygen will generate a \n# standard header. Notice: only use this tag if you know what you are doing!\n\nLATEX_HEADER           = \n\n# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated \n# is prepared for conversion to pdf (using ps2pdf). The pdf file will \n# contain links (just like the HTML output) instead of page references \n# This makes the output suitable for online browsing using a pdf viewer.\n\nPDF_HYPERLINKS         = YES\n\n# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of \n# plain latex in the generated Makefile. Set this option to YES to get a \n# higher quality PDF documentation.\n\nUSE_PDFLATEX           = YES\n\n# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\\\batchmode. \n# command to the generated LaTeX files. This will instruct LaTeX to keep \n# running if errors occur, instead of asking the user for help. \n# This option is also used when generating formulas in HTML.\n\nLATEX_BATCHMODE        = NO\n\n# If LATEX_HIDE_INDICES is set to YES then doxygen will not \n# include the index chapters (such as File Index, Compound Index, etc.) \n# in the output.\n\nLATEX_HIDE_INDICES     = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the RTF output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output \n# The RTF output is optimized for Word 97 and may not look very pretty with \n# other RTF readers or editors.\n\nGENERATE_RTF           = NO\n\n# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. \n# If a relative path is entered the value of OUTPUT_DIRECTORY will be \n# put in front of it. If left blank `rtf' will be used as the default path.\n\nRTF_OUTPUT             = \n\n# If the COMPACT_RTF tag is set to YES Doxygen generates more compact \n# RTF documents. This may be useful for small projects and may help to \n# save some trees in general.\n\nCOMPACT_RTF            = NO\n\n# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated \n# will contain hyperlink fields. The RTF file will \n# contain links (just like the HTML output) instead of page references. \n# This makes the output suitable for online browsing using WORD or other \n# programs which support those fields. \n# Note: wordpad (write) and others do not support links.\n\nRTF_HYPERLINKS         = NO\n\n# Load stylesheet definitions from file. Syntax is similar to doxygen's \n# config file, i.e. a series of assignments. You only have to provide \n# replacements, missing definitions are set to their default value.\n\nRTF_STYLESHEET_FILE    = \n\n# Set optional variables used in the generation of an rtf document. \n# Syntax is similar to doxygen's config file.\n\nRTF_EXTENSIONS_FILE    = \n\n#---------------------------------------------------------------------------\n# configuration options related to the man page output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_MAN tag is set to YES (the default) Doxygen will \n# generate man pages\n\nGENERATE_MAN           = NO\n\n# The MAN_OUTPUT tag is used to specify where the man pages will be put. \n# If a relative path is entered the value of OUTPUT_DIRECTORY will be \n# put in front of it. If left blank `man' will be used as the default path.\n\nMAN_OUTPUT             = \n\n# The MAN_EXTENSION tag determines the extension that is added to \n# the generated man pages (default is the subroutine's section .3)\n\nMAN_EXTENSION          = \n\n# If the MAN_LINKS tag is set to YES and Doxygen generates man output, \n# then it will generate one additional man file for each entity \n# documented in the real man page(s). These additional files \n# only source the real man page, but without them the man command \n# would be unable to find the correct page. The default is NO.\n\nMAN_LINKS              = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the XML output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_XML tag is set to YES Doxygen will \n# generate an XML file that captures the structure of \n# the code including all documentation.\n\nGENERATE_XML           = NO\n\n# The XML_OUTPUT tag is used to specify where the XML pages will be put. \n# If a relative path is entered the value of OUTPUT_DIRECTORY will be \n# put in front of it. If left blank `xml' will be used as the default path.\n\nXML_OUTPUT             = xml\n\n# The XML_SCHEMA tag can be used to specify an XML schema, \n# which can be used by a validating XML parser to check the \n# syntax of the XML files.\n\nXML_SCHEMA             = \n\n# The XML_DTD tag can be used to specify an XML DTD, \n# which can be used by a validating XML parser to check the \n# syntax of the XML files.\n\nXML_DTD                = \n\n# If the XML_PROGRAMLISTING tag is set to YES Doxygen will \n# dump the program listings (including syntax highlighting \n# and cross-referencing information) to the XML output. Note that \n# enabling this will significantly increase the size of the XML output.\n\nXML_PROGRAMLISTING     = YES\n\n#---------------------------------------------------------------------------\n# configuration options for the AutoGen Definitions output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_AUTOGEN_DEF tag is set to YES Doxygen will \n# generate an AutoGen Definitions (see autogen.sf.net) file \n# that captures the structure of the code including all \n# documentation. Note that this feature is still experimental \n# and incomplete at the moment.\n\nGENERATE_AUTOGEN_DEF   = NO\n\n#---------------------------------------------------------------------------\n# configuration options related to the Perl module output\n#---------------------------------------------------------------------------\n\n# If the GENERATE_PERLMOD tag is set to YES Doxygen will \n# generate a Perl module file that captures the structure of \n# the code including all documentation. Note that this \n# feature is still experimental and incomplete at the \n# moment.\n\nGENERATE_PERLMOD       = NO\n\n# If the PERLMOD_LATEX tag is set to YES Doxygen will generate \n# the necessary Makefile rules, Perl scripts and LaTeX code to be able \n# to generate PDF and DVI output from the Perl module output.\n\nPERLMOD_LATEX          = NO\n\n# If the PERLMOD_PRETTY tag is set to YES the Perl module output will be \n# nicely formatted so it can be parsed by a human reader.  This is useful \n# if you want to understand what is going on.  On the other hand, if this \n# tag is set to NO the size of the Perl module output will be much smaller \n# and Perl will parse it just the same.\n\nPERLMOD_PRETTY         = YES\n\n# The names of the make variables in the generated doxyrules.make file \n# are prefixed with the string contained in PERLMOD_MAKEVAR_PREFIX. \n# This is useful so different doxyrules.make files included by the same \n# Makefile don't overwrite each other's variables.\n\nPERLMOD_MAKEVAR_PREFIX = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the preprocessor   \n#---------------------------------------------------------------------------\n\n# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will \n# evaluate all C-preprocessor directives found in the sources and include \n# files.\n\nENABLE_PREPROCESSING   = YES\n\n# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro \n# names in the source code. If set to NO (the default) only conditional \n# compilation will be performed. Macro expansion can be done in a controlled \n# way by setting EXPAND_ONLY_PREDEF to YES.\n\nMACRO_EXPANSION        = NO\n\n# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES \n# then the macro expansion is limited to the macros specified with the \n# PREDEFINED and EXPAND_AS_DEFINED tags.\n\nEXPAND_ONLY_PREDEF     = NO\n\n# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files \n# in the INCLUDE_PATH (see below) will be search if a #include is found.\n\nSEARCH_INCLUDES        = YES\n\n# The INCLUDE_PATH tag can be used to specify one or more directories that \n# contain include files that are not input files but should be processed by \n# the preprocessor.\n\nINCLUDE_PATH           = \n\n# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard \n# patterns (like *.h and *.hpp) to filter out the header-files in the \n# directories. If left blank, the patterns specified with FILE_PATTERNS will \n# be used.\n\nINCLUDE_FILE_PATTERNS  = \n\n# The PREDEFINED tag can be used to specify one or more macro names that \n# are defined before the preprocessor is started (similar to the -D option of \n# gcc). The argument of the tag is a list of macros of the form: name \n# or name=definition (no spaces). If the definition and the = are \n# omitted =1 is assumed. To prevent a macro definition from being \n# undefined via #undef or recursively expanded use the := operator \n# instead of the = operator.\n\nPREDEFINED             = \n\n# If the MACRO_EXPANSION and EXPAND_ONLY_PREDEF tags are set to YES then \n# this tag can be used to specify a list of macro names that should be expanded. \n# The macro definition that is found in the sources will be used. \n# Use the PREDEFINED tag if you want to use a different macro definition.\n\nEXPAND_AS_DEFINED      = \n\n# If the SKIP_FUNCTION_MACROS tag is set to YES (the default) then \n# doxygen's preprocessor will remove all function-like macros that are alone \n# on a line, have an all uppercase name, and do not end with a semicolon. Such \n# function macros are typically used for boiler-plate code, and will confuse \n# the parser if not removed.\n\nSKIP_FUNCTION_MACROS   = YES\n\n#---------------------------------------------------------------------------\n# Configuration::additions related to external references   \n#---------------------------------------------------------------------------\n\n# The TAGFILES option can be used to specify one or more tagfiles. \n# Optionally an initial location of the external documentation \n# can be added for each tagfile. The format of a tag file without \n# this location is as follows: \n#   TAGFILES = file1 file2 ... \n# Adding location for the tag files is done as follows: \n#   TAGFILES = file1=loc1 \"file2 = loc2\" ... \n# where \"loc1\" and \"loc2\" can be relative or absolute paths or \n# URLs. If a location is present for each tag, the installdox tool \n# does not have to be run to correct the links.\n# Note that each tag file must have a unique name\n# (where the name does NOT include the path)\n# If a tag file is not located in the directory in which doxygen \n# is run, you must also specify the path to the tagfile here.\n\nTAGFILES               = \n\n# When a file name is specified after GENERATE_TAGFILE, doxygen will create \n# a tag file that is based on the input files it reads.\n\nGENERATE_TAGFILE       = \n\n# If the ALLEXTERNALS tag is set to YES all external classes will be listed \n# in the class index. If set to NO only the inherited external classes \n# will be listed.\n\nALLEXTERNALS           = NO\n\n# If the EXTERNAL_GROUPS tag is set to YES all external groups will be listed \n# in the modules index. If set to NO, only the current project's groups will \n# be listed.\n\nEXTERNAL_GROUPS        = YES\n\n# The PERL_PATH should be the absolute path and name of the perl script \n# interpreter (i.e. the result of `which perl').\n\nPERL_PATH              = \n\n#---------------------------------------------------------------------------\n# Configuration options related to the dot tool   \n#---------------------------------------------------------------------------\n\n# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will \n# generate a inheritance diagram (in HTML, RTF and LaTeX) for classes with base \n# or super classes. Setting the tag to NO turns the diagrams off. Note that \n# this option is superseded by the HAVE_DOT option below. This is only a \n# fallback. It is recommended to install and use dot, since it yields more \n# powerful graphs.\n\nCLASS_DIAGRAMS         = YES\n\n# You can define message sequence charts within doxygen comments using the \\msc \n# command. Doxygen will then run the mscgen tool (see http://www.mcternan.me.uk/mscgen/) to \n# produce the chart and insert it in the documentation. The MSCGEN_PATH tag allows you to \n# specify the directory where the mscgen tool resides. If left empty the tool is assumed to \n# be found in the default search path.\n\nMSCGEN_PATH            = \n\n# If set to YES, the inheritance and collaboration graphs will hide \n# inheritance and usage relations if the target is undocumented \n# or is not a class.\n\nHIDE_UNDOC_RELATIONS   = YES\n\n# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is \n# available from the path. This tool is part of Graphviz, a graph visualization \n# toolkit from AT&T and Lucent Bell Labs. The other options in this section \n# have no effect if this option is set to NO (the default)\n\nHAVE_DOT               = NO\n\n# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen \n# will generate a graph for each documented class showing the direct and \n# indirect inheritance relations. Setting this tag to YES will force the \n# the CLASS_DIAGRAMS tag to NO.\n\nCLASS_GRAPH            = YES\n\n# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen \n# will generate a graph for each documented class showing the direct and \n# indirect implementation dependencies (inheritance, containment, and \n# class references variables) of the class with other documented classes.\n\nCOLLABORATION_GRAPH    = YES\n\n# If the GROUP_GRAPHS and HAVE_DOT tags are set to YES then doxygen \n# will generate a graph for groups, showing the direct groups dependencies\n\nGROUP_GRAPHS           = YES\n\n# If the UML_LOOK tag is set to YES doxygen will generate inheritance and \n# collaboration diagrams in a style similar to the OMG's Unified Modeling \n# Language.\n\nUML_LOOK               = NO\n\n# If set to YES, the inheritance and collaboration graphs will show the \n# relations between templates and their instances.\n\nTEMPLATE_RELATIONS     = YES\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDE_GRAPH, and HAVE_DOT \n# tags are set to YES then doxygen will generate a graph for each documented \n# file showing the direct and indirect include dependencies of the file with \n# other documented files.\n\nINCLUDE_GRAPH          = YES\n\n# If the ENABLE_PREPROCESSING, SEARCH_INCLUDES, INCLUDED_BY_GRAPH, and \n# HAVE_DOT tags are set to YES then doxygen will generate a graph for each \n# documented header file showing the documented files that directly or \n# indirectly include this file.\n\nINCLUDED_BY_GRAPH      = YES\n\n# If the CALL_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will \n# generate a call dependency graph for every global function or class method. \n# Note that enabling this option will significantly increase the time of a run. \n# So in most cases it will be better to enable call graphs for selected \n# functions only using the \\callgraph command.\n\nCALL_GRAPH             = NO\n\n# If the CALLER_GRAPH, SOURCE_BROWSER and HAVE_DOT tags are set to YES then doxygen will \n# generate a caller dependency graph for every global function or class method. \n# Note that enabling this option will significantly increase the time of a run. \n# So in most cases it will be better to enable caller graphs for selected \n# functions only using the \\callergraph command.\n\nCALLER_GRAPH           = NO\n\n# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen \n# will graphical hierarchy of all classes instead of a textual one.\n\nGRAPHICAL_HIERARCHY    = YES\n\n# If the DIRECTORY_GRAPH, SHOW_DIRECTORIES and HAVE_DOT tags are set to YES \n# then doxygen will show the dependencies a directory has on other directories \n# in a graphical way. The dependency relations are determined by the #include\n# relations between the files in the directories.\n\nDIRECTORY_GRAPH        = YES\n\n# The DOT_IMAGE_FORMAT tag can be used to set the image format of the images \n# generated by dot. Possible values are png, jpg, or gif\n# If left blank png will be used.\n\nDOT_IMAGE_FORMAT       = png\n\n# The tag DOT_PATH can be used to specify the path where the dot tool can be \n# found. If left blank, it is assumed the dot tool can be found in the path.\n\nDOT_PATH               = \n\n# The DOTFILE_DIRS tag can be used to specify one or more directories that \n# contain dot files that are included in the documentation (see the \n# \\dotfile command).\n\nDOTFILE_DIRS           = \n\n# The MAX_DOT_GRAPH_MAX_NODES tag can be used to set the maximum number of \n# nodes that will be shown in the graph. If the number of nodes in a graph \n# becomes larger than this value, doxygen will truncate the graph, which is \n# visualized by representing a node as a red box. Note that doxygen if the number \n# of direct children of the root node in a graph is already larger than \n# MAX_DOT_GRAPH_NOTES then the graph will not be shown at all. Also note \n# that the size of a graph can be further restricted by MAX_DOT_GRAPH_DEPTH.\n\nDOT_GRAPH_MAX_NODES    = 50\n\n# The MAX_DOT_GRAPH_DEPTH tag can be used to set the maximum depth of the \n# graphs generated by dot. A depth value of 3 means that only nodes reachable \n# from the root by following a path via at most 3 edges will be shown. Nodes \n# that lay further from the root node will be omitted. Note that setting this \n# option to 1 or 2 may greatly reduce the computation time needed for large \n# code bases. Also note that the size of a graph can be further restricted by \n# DOT_GRAPH_MAX_NODES. Using a depth of 0 means no depth restriction.\n\nMAX_DOT_GRAPH_DEPTH    = 0\n\n# Set the DOT_TRANSPARENT tag to YES to generate images with a transparent \n# background. This is disabled by default, which results in a white background. \n# Warning: Depending on the platform used, enabling this option may lead to \n# badly anti-aliased labels on the edges of a graph (i.e. they become hard to \n# read).\n\nDOT_TRANSPARENT        = NO\n\n# Set the DOT_MULTI_TARGETS tag to YES allow dot to generate multiple output \n# files in one run (i.e. multiple -o and -T options on the command line). This \n# makes dot run faster, but since only newer versions of dot (>1.8.10) \n# support this, this feature is disabled by default.\n\nDOT_MULTI_TARGETS      = NO\n\n# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will \n# generate a legend page explaining the meaning of the various boxes and \n# arrows in the dot generated graphs.\n\nGENERATE_LEGEND        = YES\n\n# If the DOT_CLEANUP tag is set to YES (the default) Doxygen will \n# remove the intermediate dot files that are used to generate \n# the various graphs.\n\nDOT_CLEANUP            = YES\n\n#---------------------------------------------------------------------------\n# Configuration::additions related to the search engine   \n#---------------------------------------------------------------------------\n\n# The SEARCHENGINE tag specifies whether or not a search engine should be \n# used. If set to NO the values of all tags below this one will be ignored.\n\nSEARCHENGINE           = NO\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/libhttpd/Makefile.am",
    "content": "#\n# $Id$\n#\n\nlib_LTLIBRARIES = libhttpd.la\n\nlibhttpd_la_SOURCES = protocol.c \\\n\tapi.c \\\n\tversion.c \\\n\tip_acl.c\n\nnoinst_HEADERS = httpd_priv.h\n\npkginclude_HEADERS = httpd.h\n\nEXTRA_DIST = README\n\t\n#AM_CPPFLAGS = \\\n#\t-I${top_srcdir}/inc\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/libhttpd/README",
    "content": "\nWelcome to LibHTTPD, a library for the creation of embedded web servers.\nComplete documentation is available in the PDF file location in the doc\ndirectory.\n\nTo build this software simply run\n\n\t./configure\n\tmake all\n\tmake install\n\nThe software will be compiled and installed into /usr/local/lib and\n/usr/local/include.  To use the software you will have to include the\nlibrary's header file into your application and link against the library\nitself.  Details are privided in the documentation.\n\nThis software has been developed by David J. Hughes (aka Bambi) of \nHughes Technologies in Australia.  You can always find a current verion\nof this software at www.Hughes.com.au\n\nThis software is released under the GPL.  If you wish to incorporate\nthis code in a commercial application then OEM licenses are available\nfrom Hughes Technology.  Please email info@Hughes.com.au for details.\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/libhttpd/api.c",
    "content": "/*\n** Copyright (c) 2002  Hughes Technologies Pty Ltd.  All rights\n** reserved.\n**\n** Terms under which this software may be used or copied are\n** provided in the  specific license associated with this product.\n**\n** Hughes Technologies disclaims all warranties with regard to this\n** software, including all implied warranties of merchantability and\n** fitness, in no event shall Hughes Technologies be liable for any\n** special, indirect or consequential damages or any damages whatsoever\n** resulting from loss of use, data or profits, whether in an action of\n** contract, negligence or other tortious action, arising out of or in\n** connection with the use or performance of this software.\n**\n**\n** $Id$\n**\n*/\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <time.h>\n\n#if defined(_WIN32)\n#include <winsock2.h>\n#else\n#include <unistd.h> \n#include <sys/file.h>\n#include <netinet/in.h> \n#include <arpa/inet.h> \n#include <netdb.h>\n#include <sys/socket.h> \n#include <netdb.h>\n#endif\n\n#include \"config.h\"\n#include \"httpd.h\"\n#include \"httpd_priv.h\"\n\n#ifdef HAVE_STDARG_H\n#  include <stdarg.h>\n#else\n#  include <varargs.h>\n#endif\n\n\nchar *httpdUrlEncode(str)\n\tconst char\t*str;\n{\n        char    *new,\n                *cp;\n\n        new = (char *)_httpd_escape(str);\n\tif (new == NULL)\n\t{\n\t\treturn(NULL);\n\t}\n        cp = new;\n        while(*cp)\n        {\n                if (*cp == ' ')\n                        *cp = '+';\n                cp++;\n        }\n\treturn(new);\n}\n\n\n\nchar *httpdRequestMethodName(request *r)\n{\n\tstatic\tchar\ttmpBuf[255];\n\n\tswitch(r->request.method)\n\t{\n\t\tcase HTTP_GET: return(\"GET\");\n\t\tcase HTTP_POST: return(\"POST\");\n\t\tdefault: \n\t\t\tsnprintf(tmpBuf,255,\"Invalid method '%d'\", \n\t\t\t\tr->request.method);\n\t\t\treturn(tmpBuf);\n\t}\n}\n\n\nhttpVar *httpdGetVariableByName(request *r, const char *name)\n{\n\thttpVar\t*curVar;\n\n\tcurVar = r->variables;\n\twhile(curVar)\n\t{\n\t\tif (strcmp(curVar->name, name) == 0)\n\t\t\treturn(curVar);\n\t\tcurVar = curVar->nextVariable;\n\t}\n\treturn(NULL);\n}\n\n\n\nhttpVar *httpdGetVariableByPrefix(request *r, const char *prefix)\n{\n\thttpVar\t*curVar;\n\n\tif (prefix == NULL)\n\t\treturn(r->variables);\n\tcurVar = r->variables;\n\twhile(curVar)\n\t{\n\t\tif (strncmp(curVar->name, prefix, strlen(prefix)) == 0)\n\t\t\treturn(curVar);\n\t\tcurVar = curVar->nextVariable;\n\t}\n\treturn(NULL);\n}\n\n\nhttpVar *httpdGetVariableByPrefixedName(request *r, const char *prefix, const char *name)\n{\n\thttpVar\t*curVar;\n\tint\tprefixLen;\n\n\tif (prefix == NULL)\n\t\treturn(r->variables);\n\tcurVar = r->variables;\n\tprefixLen = strlen(prefix);\n\twhile(curVar)\n\t{\n\t\tif (strncmp(curVar->name, prefix, prefixLen) == 0 &&\n\t\t\tstrcmp(curVar->name + prefixLen, name) == 0)\n\t\t{\n\t\t\treturn(curVar);\n\t\t}\n\t\tcurVar = curVar->nextVariable;\n\t}\n\treturn(NULL);\n}\n\n\nhttpVar *httpdGetNextVariableByPrefix(curVar, prefix)\n\thttpVar\t*curVar;\n\tconst char\t*prefix;\n{\n\tif(curVar)\n\t\tcurVar = curVar->nextVariable;\n\twhile(curVar)\n\t{\n\t\tif (strncmp(curVar->name, prefix, strlen(prefix)) == 0)\n\t\t\treturn(curVar);\n\t\tcurVar = curVar->nextVariable;\n\t}\n\treturn(NULL);\n}\n\n\nint httpdAddVariable(request *r, const char *name, const char *value)\n{\n\thttpVar *curVar, *lastVar, *newVar;\n\n\twhile(*name == ' ' || *name == '\\t')\n\t\tname++;\n\tnewVar = malloc(sizeof(httpVar));\n\tbzero(newVar, sizeof(httpVar));\n\tnewVar->name = strdup(name);\n\tnewVar->value = strdup(value);\n\tlastVar = NULL;\n\tcurVar = r->variables;\n\twhile(curVar)\n\t{\n\t\tif (strcmp(curVar->name, name) != 0)\n\t\t{\n\t\t\tlastVar = curVar;\n\t\t\tcurVar = curVar->nextVariable;\n\t\t\tcontinue;\n\t\t}\n\t\twhile(curVar)\n\t\t{\n\t\t\tlastVar = curVar;\n\t\t\tcurVar = curVar->nextValue;\n\t\t}\n\t\tlastVar->nextValue = newVar;\n\t\treturn(0);\n\t}\n\tif (lastVar)\n\t\tlastVar->nextVariable = newVar;\n\telse\n\t\tr->variables = newVar;\n\treturn(0);\n}\n\nhttpd *httpdCreate(host, port)\n\tchar\t*host;\n\tint\tport;\n{\n\thttpd\t*new;\n\tint\tsock,\n\t\topt;\n        struct  sockaddr_in     addr;\n\n\t/*\n\t** Create the handle and setup it's basic config\n\t*/\n\tnew = malloc(sizeof(httpd));\n\tif (new == NULL)\n\t\treturn(NULL);\n\tbzero(new, sizeof(httpd));\n\tnew->port = port;\n\tif (host == HTTP_ANY_ADDR)\n\t\tnew->host = HTTP_ANY_ADDR;\n\telse\n\t\tnew->host = strdup(host);\n\tnew->content = (httpDir*)malloc(sizeof(httpDir));\n\tbzero(new->content,sizeof(httpDir));\n\tnew->content->name = strdup(\"\");\n\n\t/*\n\t** Setup the socket\n\t*/\n#ifdef _WIN32\n\t{ \n\tWORD \twVersionRequested;\n\tWSADATA wsaData;\n\tint \terr;\n\n\twVersionRequested = MAKEWORD( 2, 2 );\n\n\terr = WSAStartup( wVersionRequested, &wsaData );\n\t\n\t/* Found a usable winsock dll? */\n\tif( err != 0 ) \n\t   return NULL;\n\n\t/* \n\t** Confirm that the WinSock DLL supports 2.2.\n\t** Note that if the DLL supports versions greater \n\t** than 2.2 in addition to 2.2, it will still return\n\t** 2.2 in wVersion since that is the version we\n\t** requested.\n\t*/\n\n\tif( LOBYTE( wsaData.wVersion ) != 2 || \n\t    HIBYTE( wsaData.wVersion ) != 2 ) {\n\n\t\t/* \n\t\t** Tell the user that we could not find a usable\n\t\t** WinSock DLL.\n\t\t*/\n\t\tWSACleanup( );\n\t\treturn NULL;\n\t}\n\n\t/* The WinSock DLL is acceptable. Proceed. */\n \t}\n#endif\n\n\tsock = socket(AF_INET, SOCK_STREAM, 0);\n\tif (sock  < 0)\n\t{\n\t\tfree(new);\n\t\treturn(NULL);\n\t}\n#\tifdef SO_REUSEADDR\n\topt = 1;\n\tsetsockopt(sock, SOL_SOCKET, SO_REUSEADDR, (char*)&opt,sizeof(int));\n#\tendif\n\tnew->serverSock = sock;\n\tbzero(&addr, sizeof(addr));\n\taddr.sin_family = AF_INET;\n\tif (new->host == HTTP_ANY_ADDR)\n\t{\n\t\taddr.sin_addr.s_addr = htonl(INADDR_ANY);\n\t}\n\telse\n\t{\n\t\taddr.sin_addr.s_addr = inet_addr(new->host);\n\t}\n\taddr.sin_port = htons((u_short)new->port);\n\tif (bind(sock,(struct sockaddr *)&addr,sizeof(addr)) <0)\n\t{\n\t\tclose(sock);\n\t\tfree(new);\n\t\treturn(NULL);\n\t}\n\tlisten(sock, 128);\n\tnew->startTime = time(NULL);\n\treturn(new);\n}\n\nvoid httpdDestroy(server)\n\thttpd\t*server;\n{\n\tif (server == NULL)\n\t\treturn;\n\tif (server->host)\n\t\tfree(server->host);\n\tfree(server);\n}\n\n\n\nrequest *httpdGetConnection(server, timeout)\n\thttpd\t*server;\n\tstruct\ttimeval *timeout;\n{\n\tint\t\tresult;\n\tfd_set\t\tfds;\n\tstruct  \tsockaddr_in     addr;\n\tsocklen_t\taddrLen;\n\tchar\t\t*ipaddr;\n\trequest\t\t*r;\n\n\tFD_ZERO(&fds);\n\tFD_SET(server->serverSock, &fds);\n\tresult = 0;\n\twhile(result == 0)\n\t{\n\t\tresult = select(server->serverSock + 1, &fds, 0, 0, timeout);\n\t\tif (result < 0)\n\t\t{\n\t\t\tserver->lastError = -1;\n\t\t\treturn(NULL);\n\t\t}\n\t\tif (timeout != 0 && result == 0)\n\t\t{\n\t\t\treturn(NULL);\n\t\t\tserver->lastError = 0;\n\t\t}\n\t\tif (result > 0)\n\t\t{\n\t\t\tbreak;\n\t\t}\n\t}\n\t/* Allocate request struct */\n\tr = (request *)malloc(sizeof(request));\n\tif (r == NULL) {\n\t\tserver->lastError = -3;\n\t\treturn(NULL);\n\t}\n\tmemset((void *)r, 0, sizeof(request));\n\t/* Get on with it */\n\tbzero(&addr, sizeof(addr));\n\taddrLen = sizeof(addr);\n\tr->clientSock = accept(server->serverSock,(struct sockaddr *)&addr,\n\t\t&addrLen);\n\tipaddr = inet_ntoa(addr.sin_addr);\n\tif (ipaddr) {\n\t\tstrncpy(r->clientAddr, ipaddr, HTTP_IP_ADDR_LEN);\n                r->clientAddr[HTTP_IP_ADDR_LEN-1]=0;\n        } else\n\t\t*r->clientAddr = 0;\n\tr->readBufRemain = 0;\n\tr->readBufPtr = NULL;\n\n\t/*\n\t** Check the default ACL\n\t*/\n\tif (server->defaultAcl)\n\t{\n\t\tif (httpdCheckAcl(server, r, server->defaultAcl)\n\t\t\t\t== HTTP_ACL_DENY)\n\t\t{\n\t\t\thttpdEndRequest(r);\n\t\t\tserver->lastError = 2;\n\t\t\treturn(NULL);\n\t\t}\n\t}\n\treturn(r);\n}\n\n\n\nint httpdReadRequest(httpd *server, request *r)\n{\n\tstatic\tchar\tbuf[HTTP_MAX_LEN];\n\tint\tcount,\n\t\tinHeaders;\n\tchar\t*cp, *cp2;\n\tint\t_httpd_decode();\n\n\n\t/*\n\t** Setup for a standard response\n\t*/\n\tstrcpy(r->response.headers,\n\t\t\"Server: Hughes Technologies Embedded Server\\n\"); \n\tstrcpy(r->response.contentType, \"text/html\");\n\tstrcpy(r->response.response,\"200 Output Follows\\n\");\n\tr->response.headersSent = 0;\n\n\n\t/*\n\t** Read the request\n\t*/\n\tcount = 0;\n\tinHeaders = 1;\n\twhile(_httpd_readLine(r, buf, HTTP_MAX_LEN) > 0)\n\t{\n\t\tcount++;\n\n\t\t/*\n\t\t** Special case for the first line.  Scan the request\n\t\t** method and path etc\n\t\t*/\n\t\tif (count == 1)\n\t\t{\n\t\t\t/*\n\t\t\t** First line.  Scan the request info\n\t\t\t*/\n\t\t\tcp = cp2 = buf;\n\t\t\twhile(isalpha((unsigned char)*cp2))\n\t\t\t\tcp2++;\n\t\t\t*cp2 = 0;\n\t\t\tif (strcasecmp(cp,\"GET\") == 0)\n\t\t\t\tr->request.method = HTTP_GET;\n\t\t\tif (strcasecmp(cp,\"POST\") == 0)\n\t\t\t\tr->request.method = HTTP_POST;\n\t\t\tif (r->request.method == 0)\n\t\t\t{\n\t\t\t\t_httpd_net_write( r->clientSock,\n\t\t\t\t      HTTP_METHOD_ERROR,\n\t\t\t\t      strlen(HTTP_METHOD_ERROR));\n\t\t\t\t_httpd_net_write( r->clientSock, cp, \n\t\t\t\t      strlen(cp));\n\t\t\t\t_httpd_writeErrorLog(server, r, LEVEL_ERROR, \n\t\t\t\t\t\"Invalid method received\");\n\t\t\t\treturn(-1);\n\t\t\t}\n\t\t\tcp = cp2+1;\n\t\t\twhile(*cp == ' ')\n\t\t\t\tcp++;\n\t\t\tcp2 = cp;\n\t\t\twhile(*cp2 != ' ' && *cp2 != 0)\n\t\t\t\tcp2++;\n\t\t\t*cp2 = 0;\n\t\t\tstrncpy(r->request.path,cp,HTTP_MAX_URL);\n                        r->request.path[HTTP_MAX_URL-1]=0;\n\t\t\t_httpd_sanitiseUrl(r->request.path);\n\t\t\tcontinue;\n\t\t}\n\n\t\t/*\n\t\t** Process the headers\n\t\t*/\n\t\tif (inHeaders)\n\t\t{\n\t\t\tif (*buf == 0)\n\t\t\t{\n\t\t\t\t/*\n\t\t\t\t** End of headers.  Continue if there's\n\t\t\t\t** data to read\n\t\t\t\t*/\n\t\t\t\tif (r->request.contentLength == 0)\n\t\t\t\t\tbreak;\n\t\t\t\tinHeaders = 0;\n\t\t\t\tbreak;\n\t\t\t}\n#if 0\n            /**\n             * Philippe commenting this out, it crashed with a\n             * particular pattern sent from the browser\n             * and we don't need it\n\t\t\tif (strncasecmp(buf,\"Cookie: \",7) == 0)\n\t\t\t{\n\t\t\t\tchar\t*var,\n\t\t\t\t\t*val,\n\t\t\t\t\t*end;\n\n\t\t\t\tvar = strchr(buf,':');\n\t\t\t\twhile(var)\n\t\t\t\t{\n\t\t\t\t\tvar++;\n\t\t\t\t\tval = strchr(var, '=');\n\t\t\t\t\t*val = 0;\n\t\t\t\t\tval++;\n\t\t\t\t\tend = strchr(val,';');\n\t\t\t\t\tif(end)\n\t\t\t\t\t\t*end = 0;\n\t\t\t\t\thttpdAddVariable(r, var, val);\n\t\t\t\t\tvar = end;\n\t\t\t\t}\n\t\t\t}\n\t\t\t*/\n#endif\n\t\t\tif (strncasecmp(buf,\"Authorization: \",15) == 0)\n\t\t\t{\n\t\t\t\tcp = strchr(buf,':') + 2;\n\t\t\t\tif (strncmp(cp,\"Basic \", 6) != 0)\n\t\t\t\t{\n\t\t\t\t\t/* Unknown auth method */\n\t\t\t\t}\n\t\t\t\telse\n\t\t\t\t{\n\t\t\t\t\tchar \tauthBuf[100];\n\n\t\t\t\t\tcp = strchr(cp,' ') + 1;\n\t\t\t\t\t_httpd_decode(cp, authBuf, 100);\n\t\t\t\t\tr->request.authLength = \n\t\t\t\t\t\tstrlen(authBuf);\n\t\t\t\t\tcp = strchr(authBuf,':');\n\t\t\t\t\tif (cp)\n\t\t\t\t\t{\n\t\t\t\t\t\t*cp = 0;\n\t\t\t\t\t\tstrncpy(\n\t\t\t\t\t\t   r->request.authPassword,\n\t\t\t\t\t\t   cp+1, HTTP_MAX_AUTH);\n                                                r->request.authPassword[HTTP_MAX_AUTH-1]=0;\n\t\t\t\t\t}\n\t\t\t\t\tstrncpy(r->request.authUser, \n\t\t\t\t\t\tauthBuf, HTTP_MAX_AUTH);\n\t\t\t\t\tr->request.authUser[HTTP_MAX_AUTH-1]=0;\n\t\t\t\t}\n\t\t\t}\n#if 0\n\t\t\tif (strncasecmp(buf,\"Referer: \",9) == 0)\n\t\t\t{\n\t\t\t\tcp = strchr(buf,':') + 2;\n\t\t\t\tif(cp)\n\t\t\t\t{\n\t\t\t\t\tstrncpy(r->request.referer,cp,\n\t\t\t\t\t\tHTTP_MAX_URL);\n\t\t\t\t\tr->request.referer[HTTP_MAX_URL-1]=0;\n\t\t\t\t}\n\t\t\t}\n#endif\n\t\t\t/* acv@acv.ca/wifidog: Added decoding of host: if\n\t\t\t * present. */\n\t\t\tif (strncasecmp(buf,\"Host: \",6) == 0)\n\t\t\t{\n\t\t\t\tcp = strchr(buf,':');\n\t\t\t\tif(cp)\n\t\t\t\t{\n\t\t\t\t\tcp += 2;\n\t\t\t\t\tstrncpy(r->request.host,cp,\n\t\t\t\t\t\tHTTP_MAX_URL);\n\t\t\t\t\tr->request.host[HTTP_MAX_URL-1]=0;\n\t\t\t\t}\n\t\t\t}\n\t\t\t/* End modification */\n#if 0\n\t\t\tif (strncasecmp(buf,\"If-Modified-Since: \",19) == 0)\n\t\t\t{\n\t\t\t\tcp = strchr(buf,':') + 2;\n\t\t\t\tif(cp)\n\t\t\t\t{\n\t\t\t\t\tstrncpy(r->request.ifModified,cp,\n\t\t\t\t\t\tHTTP_MAX_URL);\n\t\t\t\t\tr->request.ifModified[HTTP_MAX_URL-1]=0;\n\t\t\t\t\tcp = strchr(r->request.ifModified,\n\t\t\t\t\t\t';');\n\t\t\t\t\tif (cp)\n\t\t\t\t\t\t*cp = 0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (strncasecmp(buf,\"Content-Type: \",14) == 0)\n\t\t\t{\n\t\t\t\tcp = strchr(buf,':') + 2;\n\t\t\t\tif(cp)\n\t\t\t\t{\n\t\t\t\t\tstrncpy(r->request.contentType,cp,\n\t\t\t\t\t\tHTTP_MAX_URL);\n\t\t\t\t\tr->request.contentType[HTTP_MAX_URL-1]=0;\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (strncasecmp(buf,\"Content-Length: \",16) == 0)\n\t\t\t{\n\t\t\t\tcp = strchr(buf,':') + 2;\n\t\t\t\tif(cp)\n\t\t\t\t\tr->request.contentLength=atoi(cp);\n\t\t\t}\n#endif\n\t\t\tcontinue;\n\t\t}\n\t}\n\n\n#if 0\n\t/* XXX: For WifiDog, we only process the query string parameters\n\t   but keep the GET variables in the request.query!\n\t*/\n\t/*\n\t** Process and POST data\n\t*/\n\tif (r->request.contentLength > 0)\n\t{\n\t\tbzero(buf, HTTP_MAX_LEN);\n\t\t_httpd_readBuf(r, buf, r->request.contentLength);\n\t\t_httpd_storeData(r, buf);\n\t\t\n\t}\n#endif\n\n\t/*\n\t** Process any URL data\n\t*/\n\tcp = strchr(r->request.path,'?');\n\tif (cp != NULL)\n\t{\n\t\t*cp++ = 0;\n\t\tstrncpy(r->request.query, cp, sizeof(r->request.query));\n\t\tr->request.query[sizeof(r->request.query)-1]=0;\n\t\t_httpd_storeData(r, cp);\n\t}\n\n\treturn(0);\n}\n\n\nvoid httpdEndRequest(request *r)\n{\n\t_httpd_freeVariables(r->variables);\n\tshutdown(r->clientSock,2);\n\tclose(r->clientSock);\n\tfree(r);\n}\n\n\nvoid httpdFreeVariables(request *r)\n{\n        _httpd_freeVariables(r->variables);\n}\n\n\n\nvoid httpdDumpVariables(request *r)\n{\n\thttpVar\t*curVar,\n\t\t*curVal;\n\n\tcurVar = r->variables;\n\twhile(curVar)\n\t{\n\t\tprintf(\"Variable '%s'\\n\", curVar->name);\n\t\tcurVal = curVar;\n\t\twhile(curVal)\n\t\t{\n\t\t\tprintf(\"\\t= '%s'\\n\",curVal->value);\n\t\t\tcurVal = curVal->nextValue;\n\t\t}\n\t\tcurVar = curVar->nextVariable;\n\t}\n}\n\nvoid httpdSetFileBase(server, path)\n\thttpd\t*server;\n\tconst char\t*path;\n{\n\tstrncpy(server->fileBasePath, path, HTTP_MAX_URL);\n\tserver->fileBasePath[HTTP_MAX_URL-1]=0;\n}\n\n\nint httpdAddFileContent(server, dir, name, indexFlag, preload, path)\n\thttpd\t*server;\n\tchar\t*dir,\n\t\t*name;\n\tint\t(*preload)();\n\tint\tindexFlag;\n\tchar\t*path;\n{\n\thttpDir\t*dirPtr;\n\thttpContent *newEntry;\n\n\tdirPtr = _httpd_findContentDir(server, dir, HTTP_TRUE);\n\tnewEntry =  malloc(sizeof(httpContent));\n\tif (newEntry == NULL)\n\t\treturn(-1);\n\tbzero(newEntry,sizeof(httpContent));\n\tnewEntry->name = strdup(name);\n\tnewEntry->type = HTTP_FILE;\n\tnewEntry->indexFlag = indexFlag;\n\tnewEntry->preload = preload;\n\tnewEntry->next = dirPtr->entries;\n\tdirPtr->entries = newEntry;\n\tif (*path == '/')\n\t{\n\t\t/* Absolute path */\n\t\tnewEntry->path = strdup(path);\n\t}\n\telse\n\t{\n\t\t/* Path relative to base path */\n\t\tnewEntry->path = malloc(strlen(server->fileBasePath) +\n\t\t\tstrlen(path) + 2);\n\t\tsnprintf(newEntry->path, HTTP_MAX_URL, \"%s/%s\",\n\t\t\tserver->fileBasePath, path);\n\t}\n\treturn(0);\n}\n\n\n\nint httpdAddWildcardContent(server, dir, preload, path)\n\thttpd\t*server;\n\tchar\t*dir;\n\tint\t(*preload)();\n\tchar\t*path;\n{\n\thttpDir\t*dirPtr;\n\thttpContent *newEntry;\n\n\tdirPtr = _httpd_findContentDir(server, dir, HTTP_TRUE);\n\tnewEntry =  malloc(sizeof(httpContent));\n\tif (newEntry == NULL)\n\t\treturn(-1);\n\tbzero(newEntry,sizeof(httpContent));\n\tnewEntry->name = NULL;\n\tnewEntry->type = HTTP_WILDCARD;\n\tnewEntry->indexFlag = HTTP_FALSE;\n\tnewEntry->preload = preload;\n\tnewEntry->next = dirPtr->entries;\n\tdirPtr->entries = newEntry;\n\tif (*path == '/')\n\t{\n\t\t/* Absolute path */\n\t\tnewEntry->path = strdup(path);\n\t}\n\telse\n\t{\n\t\t/* Path relative to base path */\n\t\tnewEntry->path = malloc(strlen(server->fileBasePath) +\n\t\t\tstrlen(path) + 2);\n\t\tsnprintf(newEntry->path, HTTP_MAX_URL, \"%s/%s\",\n\t\t\tserver->fileBasePath, path);\n\t}\n\treturn(0);\n}\n\n\n\n\nint httpdAddC404Content(server, function)\n\thttpd\t*server;\n\tvoid\t(*function)();\n{\n\tif (!server->handle404) {\n\t\tserver->handle404 = (http404*)malloc(sizeof(http404));\n\t}\n\n\tif (!server->handle404) {\n\t\treturn(-1);\n\t}\n\n\tserver->handle404->function = function;\n\treturn(0);\n}\n\nint httpdAddCContent(server, dir, name, indexFlag, preload, function)\n\thttpd\t*server;\n\tchar\t*dir;\n\tchar\t*name;\n\tint\tindexFlag;\n\tint\t(*preload)();\n\tvoid\t(*function)();\n{\n\thttpDir\t*dirPtr;\n\thttpContent *newEntry;\n\n\t\tdirPtr = _httpd_findContentDir(server, dir, HTTP_TRUE);\n\tnewEntry =  malloc(sizeof(httpContent));\n\tif (newEntry == NULL)\n\t\treturn(-1);\n\tbzero(newEntry,sizeof(httpContent));\n\tnewEntry->name = strdup(name);\n\tnewEntry->type = HTTP_C_FUNCT;\n\tnewEntry->indexFlag = indexFlag;\n\tnewEntry->function = function;\n\tnewEntry->preload = preload;\n\tnewEntry->next = dirPtr->entries;\n\tdirPtr->entries = newEntry;\n\treturn(0);\n}\n\n\nint httpdAddCWildcardContent(server, dir, preload, function)\n\thttpd\t*server;\n\tchar\t*dir;\n\tint\t(*preload)();\n\tvoid\t(*function)();\n{\n\thttpDir\t*dirPtr;\n\thttpContent *newEntry;\n\n\tdirPtr = _httpd_findContentDir(server, dir, HTTP_TRUE);\n\tnewEntry =  malloc(sizeof(httpContent));\n\tif (newEntry == NULL)\n\t\treturn(-1);\n\tbzero(newEntry,sizeof(httpContent));\n\tnewEntry->name = NULL;\n\tnewEntry->type = HTTP_C_WILDCARD;\n\tnewEntry->indexFlag = HTTP_FALSE;\n\tnewEntry->function = function;\n\tnewEntry->preload = preload;\n\tnewEntry->next = dirPtr->entries;\n\tdirPtr->entries = newEntry;\n\treturn(0);\n}\n\nint httpdAddStaticContent(server, dir, name, indexFlag, preload, data)\n\thttpd\t*server;\n\tchar\t*dir;\n\tchar\t*name;\n\tint\tindexFlag;\n\tint\t(*preload)();\n\tchar\t*data;\n{\n\thttpDir\t*dirPtr;\n\thttpContent *newEntry;\n\n\tdirPtr = _httpd_findContentDir(server, dir, HTTP_TRUE);\n\tnewEntry =  malloc(sizeof(httpContent));\n\tif (newEntry == NULL)\n\t\treturn(-1);\n\tbzero(newEntry,sizeof(httpContent));\n\tnewEntry->name = strdup(name);\n\tnewEntry->type = HTTP_STATIC;\n\tnewEntry->indexFlag = indexFlag;\n\tnewEntry->data = data;\n\tnewEntry->preload = preload;\n\tnewEntry->next = dirPtr->entries;\n\tdirPtr->entries = newEntry;\n\treturn(0);\n}\n\nvoid httpdSendHeaders(request *r)\n{\n\t_httpd_sendHeaders(r, 0, 0);\n}\n\nvoid httpdSetResponse(request *r, const char *msg)\n{\n\tstrncpy(r->response.response, msg, HTTP_MAX_URL);\n\tr->response.response[HTTP_MAX_URL-1]=0;\n}\n\nvoid httpdSetContentType(request *r, const char *type)\n{\n\tstrcpy(r->response.contentType, type);\n}\n\n\nvoid httpdAddHeader(request *r, const char *msg)\n{\n\tint size;\n\tsize = HTTP_MAX_HEADERS - 2 - strlen(r->response.headers);\n\tif(size > 0)\n\t{\t\n\t\tstrncat(r->response.headers,msg,size);\n\t\tif (r->response.headers[strlen(r->response.headers) - 1] != '\\n')\n\t\t\tstrcat(r->response.headers,\"\\n\");\n\t}\n}\n\nvoid httpdSetCookie(request *r, const char *name, const char *value)\n{\n\tchar\tbuf[HTTP_MAX_URL];\n\n\tsnprintf(buf,HTTP_MAX_URL, \"Set-Cookie: %s=%s; path=/;\", name, value);\n\thttpdAddHeader(r, buf);\n}\n\nvoid httpdOutput(request *r, const char *msg)\n{\n\tconst char *src;\n\tchar\tbuf[HTTP_MAX_LEN],\n\t\tvarName[80],\n\t\t*dest;\n\tint\tcount;\n\n\tsrc = msg;\n\tdest = buf;\n\tcount = 0;\n\twhile(*src && count < HTTP_MAX_LEN)\n\t{\n\t\tif (*src == '$')\n\t\t{\n\t\t\tconst char *tmp;\n\t\t\tchar\t*cp;\n\t\t\tint\tcount2;\n\t\t\thttpVar\t*curVar;\n\n\t\t\ttmp = src + 1;\n\t\t\tcp = varName;\n\t\t\tcount2 = 0;\n\t\t\twhile (*tmp && (isalnum((unsigned char)*tmp) || *tmp == '_') &&\n\t\t\t       count2 < 80)\n\t\t\t{\n\t\t\t\t*cp++ = *tmp++;\n\t\t\t\tcount2++;\n\t\t\t}\n\t\t\t*cp = 0;\n\t\t\tcurVar = httpdGetVariableByName(r,varName);\n\t\t\tif (curVar)\n\t\t\t{\n\t\t\t\tstrcpy(dest, curVar->value);\n\t\t\t\tdest = dest + strlen(dest);\n\t\t\t\tcount += strlen(dest);\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\t*dest++ = '$';\n\t\t\t\tstrcpy(dest, varName);\n\t\t\t\tdest += strlen(varName);\n\t\t\t\tcount += 1 + strlen(varName);\n\t\t\t}\n\t\t\tsrc = src + strlen(varName) + 1;\n\t\t\tcontinue;\n\t\t}\n\t\t*dest++ = *src++;\n\t\tcount++;\n\t}\t\n\t*dest = 0;\n\tr->response.responseLength += strlen(buf);\n\tif (r->response.headersSent == 0)\n\t\thttpdSendHeaders(r);\n\t_httpd_net_write( r->clientSock, buf, strlen(buf));\n}\n\n\n\n#ifdef HAVE_STDARG_H\nvoid httpdPrintf(request *r, const char *fmt, ...)\n{\n#else\nvoid httpdPrintf(va_alist)\n        va_dcl\n{\n        request\t\t*r;;\n        const char\t*fmt;\n#endif\n        va_list         args;\n\tchar\t\tbuf[HTTP_MAX_LEN];\n\n#ifdef HAVE_STDARG_H\n        va_start(args, fmt);\n#else\n        va_start(args);\n        r = (request *) va_arg(args, request * );\n        fmt = (char *) va_arg(args, char *);\n#endif\n\tif (r->response.headersSent == 0)\n\t\thttpdSendHeaders(r);\n\tvsnprintf(buf, HTTP_MAX_LEN, fmt, args);\n\tr->response.responseLength += strlen(buf);\n\t_httpd_net_write( r->clientSock, buf, strlen(buf));\n}\n\n\n\n\nvoid httpdProcessRequest(httpd *server, request *r)\n{\n\tchar\tdirName[HTTP_MAX_URL],\n\t\tentryName[HTTP_MAX_URL],\n\t\t*cp;\n\thttpDir\t*dir;\n\thttpContent *entry;\n\n\tr->response.responseLength = 0;\n\tstrncpy(dirName, httpdRequestPath(r), HTTP_MAX_URL);\n\tdirName[HTTP_MAX_URL-1]=0;\n\tcp = strrchr(dirName, '/');\n\tif (cp == NULL)\n\t{\n\t\tprintf(\"Invalid request path '%s'\\n\",dirName);\n\t\treturn;\n\t}\n\tstrncpy(entryName, cp + 1, HTTP_MAX_URL);\n\tentryName[HTTP_MAX_URL-1]=0;\n\tif (cp != dirName)\n\t\t*cp = 0;\n\telse\n\t\t*(cp+1) = 0;\n\tdir = _httpd_findContentDir(server, dirName, HTTP_FALSE);\n\tif (dir == NULL)\n\t{\n\t\t_httpd_send404(server, r);\n\t\t_httpd_writeAccessLog(server, r);\n\t\treturn;\n\t}\n\tentry = _httpd_findContentEntry(r, dir, entryName);\n\tif (entry == NULL)\n\t{\n\t\t_httpd_send404(server, r);\n\t\t_httpd_writeAccessLog(server, r);\n\t\treturn;\n\t}\n\tif (entry->preload)\n\t{\n\t\tif ((entry->preload)(server) < 0)\n\t\t{\n\t\t\t_httpd_writeAccessLog(server, r);\n\t\t\treturn;\n\t\t}\n\t}\n\tswitch(entry->type)\n\t{\n\t\tcase HTTP_C_FUNCT:\n\t\tcase HTTP_C_WILDCARD:\n\t\t\t(entry->function)(server, r);\n\t\t\tbreak;\n\n\t\tcase HTTP_STATIC:\n\t\t\t_httpd_sendStatic(server, r, entry->data);\n\t\t\tbreak;\n\n\t\tcase HTTP_FILE:\n\t\t\t_httpd_sendFile(server, r, entry->path);\n\t\t\tbreak;\n\n\t\tcase HTTP_WILDCARD:\n\t\t\tif (_httpd_sendDirectoryEntry(server, r, entry,\n\t\t\t\t\t\tentryName)<0)\n\t\t\t{\n\t\t\t\t_httpd_send404(server, r);\n\t\t\t}\n\t\t\tbreak;\n\t}\n\t_httpd_writeAccessLog(server, r);\n}\n\nvoid httpdSetAccessLog(server, fp)\n\thttpd\t*server;\n\tFILE\t*fp;\n{\n\tserver->accessLog = fp;\n}\n\nvoid httpdSetErrorLog(server, fp)\n\thttpd\t*server;\n\tFILE\t*fp;\n{\n\tserver->errorLog = fp;\n}\n\nvoid httpdAuthenticate(request *r, const char *realm)\n{\n\tchar\tbuffer[255];\n\n\tif (r->request.authLength == 0)\n\t{\n\t\thttpdSetResponse(r, \"401 Please Authenticate\");\n\t\tsnprintf(buffer,sizeof(buffer), \n\t\t\t\"WWW-Authenticate: Basic realm=\\\"%s\\\"\\n\", realm);\n\t\thttpdAddHeader(r, buffer);\n\t\thttpdOutput(r,\"\\n\");\n\t}\n}\n\n\nvoid httpdForceAuthenticate(request *r, const char *realm)\n{\n\tchar\tbuffer[255];\n\n\thttpdSetResponse(r, \"401 Please Authenticate\");\n\tsnprintf(buffer,sizeof(buffer), \n\t\t\"WWW-Authenticate: Basic realm=\\\"%s\\\"\\n\", realm);\n\thttpdAddHeader(r, buffer);\n\thttpdOutput(r,\"\\n\");\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/libhttpd/httpd.h",
    "content": "/*\n** Copyright (c) 2002  Hughes Technologies Pty Ltd.  All rights\n** reserved.\n**\n** Terms under which this software may be used or copied are\n** provided in the  specific license associated with this product.\n**\n** hUghes Technologies disclaims all warranties with regard to this\n** software, including all implied warranties of merchantability and\n** fitness, in no event shall Hughes Technologies be liable for any\n** special, indirect or consequential damages or any damages whatsoever\n** resulting from loss of use, data or profits, whether in an action of\n** contract, negligence or other tortious action, arising out of or in\n** connection with the use or performance of this software.\n**\n**\n** $Id$\n**\n*/\n\n/*\n**  libhttpd Header File\n*/\n\n\n/***********************************************************************\n** Standard header preamble.  Ensure singular inclusion, setup for\n** function prototypes and c++ inclusion\n*/\n\n#ifndef LIB_HTTPD_H\n\n#define LIB_HTTPD_H 1\n\n#include <sys/time.h>\n\n#if !defined(__ANSI_PROTO)\n#if defined(_WIN32) || defined(__STDC__) || defined(__cplusplus)\n#  define __ANSI_PROTO(x)       x\n#else\n#  define __ANSI_PROTO(x)       ()\n#endif\n#endif\n\n#ifndef u_int\n#include <sys/types.h>\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n\n/***********************************************************************\n** Macro Definitions\n*/\n\n\n#define\tHTTP_PORT \t\t80\n#define HTTP_MAX_LEN\t\t10240\n#define HTTP_MAX_URL\t\t1024\n#define HTTP_MAX_HEADERS\t1024\n#define HTTP_MAX_AUTH\t\t128\n#define\tHTTP_IP_ADDR_LEN\t17\n#define\tHTTP_TIME_STRING_LEN\t40\n#define\tHTTP_READ_BUF_LEN\t4096\n#define\tHTTP_ANY_ADDR\t\tNULL\n\n#define\tHTTP_GET\t\t1\n#define\tHTTP_POST\t\t2\n\n#define\tHTTP_TRUE\t\t1\n#define HTTP_FALSE\t\t0\n\n#define\tHTTP_FILE\t\t1\n#define HTTP_C_FUNCT\t\t2\n#define HTTP_EMBER_FUNCT\t3\n#define HTTP_STATIC\t\t4\n#define HTTP_WILDCARD\t\t5\n#define HTTP_C_WILDCARD\t\t6\n\n#define HTTP_METHOD_ERROR \"\\n<B>ERROR : Method Not Implemented</B>\\n\\n\"\n\n#define httpdRequestMethod(s) \t\ts->request.method\n#define httpdRequestPath(s)\t\ts->request.path\n#define httpdRequestContentType(s)\ts->request.contentType\n#define httpdRequestContentLength(s)\ts->request.contentLength\n\n#define HTTP_ACL_PERMIT\t\t1\n#define HTTP_ACL_DENY\t\t2\n\n\n\nextern char \tLIBHTTPD_VERSION[],\n\t\tLIBHTTPD_VENDOR[];\n\n/***********************************************************************\n** Type Definitions\n*/\n\ntypedef\tstruct {\n\tint\tmethod,\n\t\tcontentLength,\n\t\tauthLength;\n\tchar\tpath[HTTP_MAX_URL],\n\t\tquery[HTTP_MAX_URL],\n\t        host[HTTP_MAX_URL], /* acv@acv.ca/wifidog: Added decoding\n\t\t\t\t       of host: header if present. */\n\t        ifModified[HTTP_MAX_URL];\n#if(0)\n\t\tuserAgent[HTTP_MAX_URL],\n\t\treferer[HTTP_MAX_URL],\n\t\tcontentType[HTTP_MAX_URL],\n#endif\n\tchar\tauthUser[HTTP_MAX_AUTH];\n\tchar\tauthPassword[HTTP_MAX_AUTH];\n} httpReq;\n\n\ntypedef struct _httpd_var{\n\tchar\t*name,\n\t\t*value;\n\tstruct\t_httpd_var \t*nextValue,\n\t\t\t\t*nextVariable;\n} httpVar;\n\ntypedef struct _httpd_content{\n\tchar\t*name;\n\tint\ttype,\n\t\tindexFlag;\n\tvoid\t(*function)();\n\tchar\t*data,\n\t\t*path;\n\tint\t(*preload)();\n\tstruct\t_httpd_content \t*next;\n} httpContent;\n\ntypedef struct {\n\tint\t\tresponseLength;\n\thttpContent\t*content;\n\tchar\t\theadersSent,\n\t\t\theaders[HTTP_MAX_HEADERS],\n\t\t\tresponse[HTTP_MAX_URL],\n\t\t\tcontentType[HTTP_MAX_URL];\n} httpRes;\n\n\ntypedef struct _httpd_dir{\n\tchar\t*name;\n\tstruct\t_httpd_dir *children,\n\t\t\t*next;\n\tstruct\t_httpd_content *entries;\n} httpDir;\n\n\ntypedef struct ip_acl_s{\n        int     addr;\n        char    len,\n                action;\n        struct  ip_acl_s *next;\n} httpAcl;\n\ntypedef struct _httpd_404 {\n\tvoid\t(*function)();\n} http404;\n\ntypedef struct {\n\tint\tport,\n\t\tserverSock,\n\t\tstartTime,\n\t\tlastError;\n\tchar\tfileBasePath[HTTP_MAX_URL],\n\t\t*host;\n\thttpDir\t*content;\n\thttpAcl\t*defaultAcl;\n\thttp404  *handle404;\n\tFILE\t*accessLog,\n\t\t*errorLog;\n} httpd;\n\ntypedef struct {\n\tint\tclientSock,\n\t\treadBufRemain;\n\thttpReq\trequest;\n\thttpRes response;\n\thttpVar\t*variables;\n\tchar\treadBuf[HTTP_READ_BUF_LEN + 1],\n\t\t*readBufPtr,\n\t\tclientAddr[HTTP_IP_ADDR_LEN];\n} request;\n\n/***********************************************************************\n** Function Prototypes\n*/\n\n\nint httpdAddCContent __ANSI_PROTO((httpd*,char*,char*,int,int(*)(),void(*)()));\nint httpdAddFileContent __ANSI_PROTO((httpd*,char*,char*,int,int(*)(),char*));\nint httpdAddStaticContent __ANSI_PROTO((httpd*,char*,char*,int,int(*)(),char*));\nint httpdAddWildcardContent __ANSI_PROTO((httpd*,char*,int(*)(),char*));\nint httpdAddCWildcardContent __ANSI_PROTO((httpd*,char*,int(*)(),void(*)()));\nint httpdAddVariable __ANSI_PROTO((request*, const char*, const char*));\nrequest *httpdGetConnection __ANSI_PROTO((httpd*, struct timeval*));\nint httpdReadRequest __ANSI_PROTO((httpd*, request*));\nint httpdCheckAcl __ANSI_PROTO((httpd*, request *, httpAcl*));\nint httpdAddC404Content __ANSI_PROTO((httpd*,void(*)()));\n\nchar *httpdRequestMethodName __ANSI_PROTO((request*));\nchar *httpdUrlEncode __ANSI_PROTO((const char *));\n\nvoid httpdAddHeader __ANSI_PROTO((request*, const char*));\nvoid httpdSetContentType __ANSI_PROTO((request*, const char*));\nvoid httpdSetResponse __ANSI_PROTO((request*, const char*));\nvoid httpdEndRequest __ANSI_PROTO((request*));\n\nhttpd *httpdCreate __ANSI_PROTO(());\nvoid httpdFreeVariables __ANSI_PROTO((request*));\nvoid httpdDumpVariables __ANSI_PROTO((request*));\nvoid httpdOutput __ANSI_PROTO((request*, const char*));\nvoid httpdPrintf __ANSI_PROTO((request*, const char*, ...));\nvoid httpdProcessRequest __ANSI_PROTO((httpd*, request *));\nvoid httpdSendHeaders __ANSI_PROTO((request*));\nvoid httpdSetFileBase __ANSI_PROTO((httpd*, const char*));\nvoid httpdSetCookie __ANSI_PROTO((request*, const char*, const char*));\n\nvoid httpdSetErrorLog __ANSI_PROTO((httpd*, FILE*));\nvoid httpdSetAccessLog __ANSI_PROTO((httpd*, FILE*));\nvoid httpdSetDefaultAcl __ANSI_PROTO((httpd*, httpAcl*));\n\nhttpVar\t*httpdGetVariableByName __ANSI_PROTO((request*, const char*));\nhttpVar\t*httpdGetVariableByPrefix __ANSI_PROTO((request*, const char*));\nhttpVar\t*httpdGetVariableByPrefixedName __ANSI_PROTO((request*, const char*, const char*));\nhttpVar *httpdGetNextVariableByPrefix __ANSI_PROTO((httpVar*, const char*));\n\nhttpAcl *httpdAddAcl __ANSI_PROTO((httpd*, httpAcl*, char*, int));\n\nvoid httpdAuthenticate __ANSI_PROTO((request*, const char*));\nvoid httpdForceAuthenticate __ANSI_PROTO((request*, const char*));\n\n/***********************************************************************\n** Standard header file footer.  \n*/\n\n#ifdef __cplusplus\n\t}\n#endif /* __cplusplus */\n#endif /* file inclusion */\n\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/libhttpd/httpd_priv.h",
    "content": "/*\n** Copyright (c) 2002  Hughes Technologies Pty Ltd.  All rights\n** reserved.\n**\n** Terms under which this software may be used or copied are\n** provided in the  specific license associated with this product.\n**\n** Hughes Technologies disclaims all warranties with regard to this\n** software, including all implied warranties of merchantability and\n** fitness, in no event shall Hughes Technologies be liable for any\n** special, indirect or consequential damages or any damages whatsoever\n** resulting from loss of use, data or profits, whether in an action of\n** contract, negligence or other tortious action, arising out of or in\n** connection with the use or performance of this software.\n**\n**\n** $Id$\n**\n*/\n\n/*\n**  libhttpd Private Header File\n*/\n\n\n/***********************************************************************\n** Standard header preamble.  Ensure singular inclusion, setup for\n** function prototypes and c++ inclusion\n*/\n\n#ifndef LIB_HTTPD_PRIV_H\n\n#define LIB_HTTPD_H_PRIV 1\n\n#if !defined(__ANSI_PROTO)\n#if defined(_WIN32) || defined(__STDC__) || defined(__cplusplus)\n#  define __ANSI_PROTO(x)       x\n#else\n#  define __ANSI_PROTO(x)       ()\n#endif\n#endif\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n\n#define\tLEVEL_NOTICE\t\"notice\"\n#define LEVEL_ERROR\t\"error\"\n\nchar * _httpd_unescape __ANSI_PROTO((char*));\nchar *_httpd_escape __ANSI_PROTO((const char*));\nchar _httpd_from_hex  __ANSI_PROTO((char));\n\n\nvoid _httpd_catFile __ANSI_PROTO((request*, char*));\nvoid _httpd_send403 __ANSI_PROTO((request*));\nvoid _httpd_send404 __ANSI_PROTO((httpd*, request*));\nvoid _httpd_sendText __ANSI_PROTO((request*, char*));\nvoid _httpd_sendFile __ANSI_PROTO((httpd*, request*, char*));\nvoid _httpd_sendStatic __ANSI_PROTO((httpd*, request *, char*));\nvoid _httpd_sendHeaders __ANSI_PROTO((request*, int, int);)\nvoid _httpd_sanitiseUrl __ANSI_PROTO((char*));\nvoid _httpd_freeVariables __ANSI_PROTO((httpVar*));\nvoid _httpd_formatTimeString __ANSI_PROTO((char*, int));\nvoid _httpd_storeData __ANSI_PROTO((request*, char*));\nvoid _httpd_writeAccessLog __ANSI_PROTO((httpd*, request*));\nvoid _httpd_writeErrorLog __ANSI_PROTO((httpd*, request *, char*, char*));\n\n\nint _httpd_net_read __ANSI_PROTO((int, char*, int));\nint _httpd_net_write __ANSI_PROTO((int, char*, int));\nint _httpd_readBuf __ANSI_PROTO((request*, char*, int));\nint _httpd_readChar __ANSI_PROTO((request*, char*));\nint _httpd_readLine __ANSI_PROTO((request*, char*, int));\nint _httpd_checkLastModified __ANSI_PROTO((request*, int));\nint _httpd_sendDirectoryEntry __ANSI_PROTO((httpd*, request *r, httpContent*,\n\t\t\tchar*));\n\nhttpContent *_httpd_findContentEntry __ANSI_PROTO((request*, httpDir*, char*));\nhttpDir *_httpd_findContentDir __ANSI_PROTO((httpd*, char*, int));\n\n#endif  /* LIB_HTTPD_PRIV_H */\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/libhttpd/ip_acl.c",
    "content": "/*\n** Copyright (c) 2002  Hughes Technologies Pty Ltd.  All rights\n** reserved.\n**\n** Terms under which this software may be used or copied are\n** provided in the  specific license associated with this product.\n**\n** Hughes Technologies disclaims all warranties with regard to this\n** software, including all implied warranties of merchantability and\n** fitness, in no event shall Hughes Technologies be liable for any\n** special, indirect or consequential damages or any damages whatsoever\n** resulting from loss of use, data or profits, whether in an action of\n** contract, negligence or other tortious action, arising out of or in\n** connection with the use or performance of this software.\n**\n**\n** $Id$\n**\n*/\n\n#include \"config.h\"\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n\n#if defined(_WIN32)\n#else\n#include <unistd.h>\n#endif\n\n#include \"httpd.h\"\n#include \"httpd_priv.h\"\n\n\n/**************************************************************************\n** GLOBAL VARIABLES\n**************************************************************************/\n\n\n/**************************************************************************\n** PRIVATE ROUTINES\n**************************************************************************/\n\nstatic int scanCidr(val, result, length)\n\tchar\t*val;\n\tu_int\t*result,\n\t\t*length;\n{\n\tu_int\tres, res1, res2, res3, res4, res5;\n\tchar\t*cp;\n\n\tcp = val;\n\tres1 = atoi(cp);\n\tcp = strchr(cp,'.');\n\tif (!cp)\n\t\treturn(-1);\n\tcp++;\n\tres2 = atoi(cp);\n\tcp = strchr(cp,'.');\n\tif (!cp)\n\t\treturn(-1);\n\tcp++;\n\tres3 = atoi(cp);\n\tcp = strchr(cp,'.');\n\tif (!cp)\n\t\treturn(-1);\n\tcp++;\n\tres4 = atoi(cp);\n\tcp = strchr(cp,'/');\n\tif (!cp)\n\t{\n\t\tres5 = 32;\n\t}\n\telse\n\t{\n\t\tcp++;\n\t\tres5 = atoi(cp);\n\t}\n\n\tif (res1>255 || res2>255 || res3>255 || res4>255 || res5>32)\n\t{\n\t\treturn(-1);\n\t}\n\tres = (res1 << 24) + (res2 << 16) + (res3 << 8) + res4;\n\t*result = res;\n\t*length = res5;\n\treturn(0);\n}\n\n\nstatic int _isInCidrBlock(httpd *server, request *r, int addr1, int len1,\n\t\tint addr2, int len2)\n{\n\tint\tcount,\n\t\tmask;\n\n\t/* if (addr1 == 0 && len1 == 0)\n\t{\n\t\treturn(1);\n\t}*/\n\n\tif(len2 < len1)\n\t{\n\t\t_httpd_writeErrorLog(server, r, LEVEL_ERROR,\n\t\t    \"IP Address must be more specific than network block\");\n\t\treturn(0);\n\t}\n\n\tmask = count = 0;\n\twhile(count < len1)\n\t{\n\t\tmask = (mask << 1) + 1;\n\t\tcount++;\n\t}\n\tmask = mask << (32 - len1);\n\tif ( (addr1 & mask) == (addr2 & mask))\n\t{\n\t\treturn(1);\n\t}\n\telse\n\t{\n\t\treturn(0);\n\t}\n}\n\n\n/**************************************************************************\n** PUBLIC ROUTINES\n**************************************************************************/\n\nhttpAcl *httpdAddAcl(server, acl, cidr, action)\n\thttpd\t*server;\n\thttpAcl\t*acl;\n        char\t*cidr;\n\tint\taction;\n{\n\thttpAcl\t*cur;\n\tint\taddr,\n\t\tlen;\n\n\t/*\n\t** Check the ACL info is reasonable\n\t*/\n\tif(scanCidr(cidr, &addr, &len) < 0)\n\t{\n\t\t_httpd_writeErrorLog(server, NULL, LEVEL_ERROR,\n\t\t\t\"Invalid IP address format\");\n\t\treturn(NULL);\n\t}\n\tif (action != HTTP_ACL_PERMIT && action != HTTP_ACL_DENY)\n\t{\n\t\t_httpd_writeErrorLog(server, NULL, LEVEL_ERROR,\n\t\t\t\"Invalid acl action\");\n\t\treturn(NULL);\n\t}\n\n\t/*\n\t** Find a spot to put this ACE\n\t*/\t\n\tif (acl)\n\t{\n\t\tcur = acl;\n\t\twhile(cur->next)\n\t\t{\n\t\t\tcur = cur->next;\n\t\t}\n\t\tcur->next = (httpAcl*)malloc(sizeof(httpAcl));\n\t\tcur = cur->next;\n\t}\n\telse\n\t{\n\t\tcur = (httpAcl*)malloc(sizeof(httpAcl));\n\t\tacl = cur;\n\t}\n\n\t/*\n\t** Add the details and return\n\t*/\n\tcur->addr = addr;\n\tcur->len = len;\n\tcur->action = action;\n\tcur->next = NULL;\n\treturn(acl);\n}\n\n\nint httpdCheckAcl(httpd *server, request *r, httpAcl *acl)\n{\n\thttpAcl\t*cur;\n\tint\taddr, len,\n\t\tres,\n\t\taction;\n\n\n\taction = HTTP_ACL_DENY;\n\tscanCidr(r->clientAddr, &addr, &len);\n\tcur = acl;\n\twhile(cur)\n\t{\n\t\tres = _isInCidrBlock(server, r, cur->addr, cur->len, addr, len);\n\t\tif (res == 1)\n\t\t{\n\t\t\taction = cur->action;\n\t\t\tbreak;\n\t\t}\n\t\tcur = cur->next;\n\t}\n\tif (action == HTTP_ACL_DENY)\n\t{\n\t\t_httpd_send403(r);\n\t\t_httpd_writeErrorLog(server, r, LEVEL_ERROR,\n    \t\t\t\"Access denied by ACL\");\n\t}\n\treturn(action);\n}\n\n\nvoid httpdSetDefaultAcl(server, acl)\n\thttpd\t*server;\n\thttpAcl\t*acl;\n{\n\tserver->defaultAcl = acl;\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/libhttpd/protocol.c",
    "content": "/*\n** Copyright (c) 2002  Hughes Technologies Pty Ltd.  All rights\n** reserved.\n**\n** Terms under which this software may be used or copied are\n** provided in the  specific license associated with this product.\n**\n** Hughes Technologies disclaims all warranties with regard to this\n** software, including all implied warranties of merchantability and\n** fitness, in no event shall Hughes Technologies be liable for any\n** special, indirect or consequential damages or any damages whatsoever\n** resulting from loss of use, data or profits, whether in an action of\n** contract, negligence or other tortious action, arising out of or in\n** connection with the use or performance of this software.\n**\n**\n** $Id$\n**\n*/\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <time.h>\n\n#if defined(_WIN32) \n#else\n#include <unistd.h>\n#include <sys/file.h>\n\n#include <fcntl.h>\t/* by Wiwiz */\n\n#endif\n\n#include \"config.h\"\n#include \"httpd.h\"\n#include \"httpd_priv.h\"\n\nint _httpd_net_read(sock, buf, len)\n\tint\tsock;\n\tchar\t*buf;\n\tint\tlen;\n{\n#if defined(_WIN32) \n\treturn( recv(sock, buf, len, 0));\n#else\n\t/*return( read(sock, buf, len));*/\n\t/* XXX Select based IO */\n\n\tint\t\tnfds;\n\tfd_set\t\treadfds;\n\tstruct timeval\ttimeout;\n\t\n\tFD_ZERO(&readfds);\n\tFD_SET(sock, &readfds);\n\ttimeout.tv_sec = 10;\n\ttimeout.tv_usec = 0;\n\tnfds = sock + 1;\n\n\tnfds = select(nfds, &readfds, NULL, NULL, &timeout);\n\n\tif (nfds > 0) {\n\t\treturn(read(sock, buf, len));\n\t}\n\treturn(nfds);\n#endif\n}\n\n\nint _httpd_net_write(sock, buf, len)\n\tint\tsock;\n\tchar\t*buf;\n\tint\tlen;\n{\n#if defined(_WIN32) \n\treturn( send(sock, buf, len, 0));\n#else\n\treturn( write(sock, buf, len));\n#endif\n}\n\nint _httpd_readChar(request *r, char *cp)\n{\n\tif (r->readBufRemain == 0)\n\t{\n\t\tbzero(r->readBuf, HTTP_READ_BUF_LEN + 1);\n\t\tr->readBufRemain = _httpd_net_read(r->clientSock, \n\t\t\tr->readBuf, HTTP_READ_BUF_LEN);\n\t\tif (r->readBufRemain < 1)\n\t\t\treturn(0);\n\t\tr->readBuf[r->readBufRemain] = 0;\n\t\tr->readBufPtr = r->readBuf;\n\t}\n\t*cp = *r->readBufPtr++;\n\tr->readBufRemain--;\n\treturn(1);\n}\n\n\nint _httpd_readLine(request *r, char *destBuf, int len)\n{\n\tchar\tcurChar,\n\t\t*dst;\n\tint\tcount;\n\t\n\n\tcount = 0;\n\tdst = destBuf;\n\twhile(count < len)\n\t{\n\t\tif (_httpd_readChar(r, &curChar) < 1)\n\t\t\treturn(0);\n\t\t// Fixed by Mina - if we read binary junk it's probably not a regular HTTP client\n\t\t//if (curChar == '\\n')\n\t\tif (curChar == '\\n' || !isascii(curChar))\n\t\t{\n\t\t\t*dst = 0;\n\t\t\treturn(1);\n\t\t}\n\t\tif (curChar == '\\r')\n\t\t{\n\t\t\tcontinue;\n\t\t}\n\t\telse\n\t\t{\n\t\t\t*dst++ = curChar;\n\t\t\tcount++;\n\t\t}\n\t}\n\t*dst = 0;\n\treturn(1);\n}\n\n\nint _httpd_readBuf(request *r, char *destBuf, int len)\n{\n\tchar\tcurChar,\n\t\t*dst;\n\tint\tcount;\n\t\n\n\tcount = 0;\n\tdst = destBuf;\n\twhile(count < len)\n\t{\n\t\tif (_httpd_readChar(r, &curChar) < 1)\n\t\t\treturn(0);\n\t\t*dst++ = curChar;\n\t\tcount++;\n\t}\n\treturn(1);\n}\n\nvoid _httpd_writeAccessLog(httpd *server, request *r)\n{\n\tchar\tdateBuf[30];\n\tstruct \ttm *timePtr;\n\ttime_t\tclock;\n\tint\tresponseCode;\n\n\n\tif (server->accessLog == NULL)\n\t\treturn;\n\tclock = time(NULL);\n\ttimePtr = localtime(&clock);\n\tstrftime(dateBuf, 30, \"%d/%b/%Y:%T %Z\",  timePtr);\n\tresponseCode = atoi(r->response.response);\n\tfprintf(server->accessLog, \"%s - - [%s] %s \\\"%s\\\" %d %d\\n\", \n\t\tr->clientAddr, dateBuf, httpdRequestMethodName(r), \n\t\thttpdRequestPath(r), responseCode, \n\t\tr->response.responseLength);\n}\n\nvoid _httpd_writeErrorLog(httpd *server, request *r, char *level, char *message)\n{\n\tchar\tdateBuf[30];\n\tstruct \ttm *timePtr;\n\ttime_t\tclock;\n\n\n\tif (server->errorLog == NULL)\n\t\treturn;\n\tclock = time(NULL);\n\ttimePtr = localtime(&clock);\n\tstrftime(dateBuf, 30, \"%a %b %d %T %Y\",  timePtr);\n\tif (r != NULL && *r->clientAddr != 0)\n\t{\n\t\tfprintf(server->errorLog, \"[%s] [%s] [client %s] %s\\n\",\n\t\t\tdateBuf, level, r->clientAddr, message);\n\t}\n\telse\n\t{\n\t\tfprintf(server->errorLog, \"[%s] [%s] %s\\n\",\n\t\t\tdateBuf, level, message);\n\t}\n}\n\n\n\nint _httpd_decode (bufcoded, bufplain, outbufsize)\n\tchar *\t\tbufcoded;\n\tchar *\t\tbufplain;\n\tint\t\toutbufsize;\n{\n\tstatic char six2pr[64] = {\n    \t\t'A','B','C','D','E','F','G','H','I','J','K','L','M',\n    \t\t'N','O','P','Q','R','S','T','U','V','W','X','Y','Z',\n    \t\t'a','b','c','d','e','f','g','h','i','j','k','l','m',\n    \t\t'n','o','p','q','r','s','t','u','v','w','x','y','z',\n    \t\t'0','1','2','3','4','5','6','7','8','9','+','/'   \n\t};\n  \n\tstatic unsigned char pr2six[256];\n\n\t/* single character decode */\n#\tdefine DEC(c) pr2six[(int)c]\n#\tdefine _DECODE_MAXVAL 63\n\n\tstatic int first = 1;\n\n\tint nbytesdecoded, j;\n\tregister char *bufin = bufcoded;\n\tregister char *bufout = bufplain;\n\tregister int nprbytes;\n\n\t/*\n\t** If this is the first call, initialize the mapping table.\n\t** This code should work even on non-ASCII machines.\n\t*/\n\tif(first) \n\t{\n\t\tfirst = 0;\n\t\tfor(j=0; j<256; j++) pr2six[j] = _DECODE_MAXVAL+1;\n\t\tfor(j=0; j<64; j++) pr2six[(int)six2pr[j]] = (unsigned char)j;\n\t}\n\n   \t/* Strip leading whitespace. */\n\n   \twhile(*bufcoded==' ' || *bufcoded == '\\t') bufcoded++;\n\n\t/*\n\t** Figure out how many characters are in the input buffer.\n\t** If this would decode into more bytes than would fit into\n\t** the output buffer, adjust the number of input bytes downwards.\n\t*/\n\tbufin = bufcoded;\n\twhile(pr2six[(int)*(bufin++)] <= _DECODE_MAXVAL);\n\tnprbytes = bufin - bufcoded - 1;\n\tnbytesdecoded = ((nprbytes+3)/4) * 3;\n\tif(nbytesdecoded > outbufsize) \n\t{\n\t\tnprbytes = (outbufsize*4)/3;\n\t}\n\tbufin = bufcoded;\n   \n\twhile (nprbytes > 0) \n\t{\n\t\t*(bufout++)=(DEC(*bufin)<<2|DEC(bufin[1])>>4);\n\t\t*(bufout++)=(DEC(bufin[1])<<4|DEC(bufin[2])>>2);\n\t\t*(bufout++)=(DEC(bufin[2])<<6|DEC(bufin[3]));\n\t\tbufin += 4;\n\t\tnprbytes -= 4;\n\t}\n\tif(nprbytes & 03) \n\t{\n\t\tif(pr2six[(int)bufin[-2]] > _DECODE_MAXVAL) \n\t\t{\n\t\t\tnbytesdecoded -= 2;\n\t\t}\n\t\telse \n\t\t{\n\t\t\tnbytesdecoded -= 1;\n\t\t}\n\t}\n\tbufplain[nbytesdecoded] = 0;\n\treturn(nbytesdecoded);\n}\n\n\n\nchar _httpd_from_hex (c)\n        char    c;\n{\n    return  c >= '0' && c <= '9' ?  c - '0'\n            : c >= 'A' && c <= 'F'? c - 'A' + 10\n            : c - 'a' + 10;     /* accept small letters just in case */\n}\n\nchar * _httpd_unescape(str)\n        char    *str;\n{\n    char * p = str;\n    char * q = str;\n    static char blank[] = \"\";\n\n    if (!str)\n        return(blank);\n    while(*p) {\n        if (*p == '%') {\n            p++;\n            if (*p) *q = _httpd_from_hex(*p++) * 16;\n            if (*p) *q = (*q + _httpd_from_hex(*p++));\n            q++;\n        } else {\n            if (*p == '+') {\n                *q++ = ' ';\n                p++;\n            } else {\n                *q++ = *p++;\n              }\n        }\n    }\n\n    *q++ = 0;\n    return str;\n} \n\n\nvoid _httpd_freeVariables(var)\n\thttpVar\t*var;\n{\n\thttpVar\t*curVar, *lastVar;\n\n\tif (var == NULL)\n\t\treturn;\n\t_httpd_freeVariables(var->nextVariable);\n\tvar->nextVariable = NULL;\n\tcurVar = var;\n\twhile(curVar)\n\t{\n\t\tlastVar = curVar;\n\t\tcurVar = curVar->nextValue;\n\t\tfree(lastVar->name);\n\t\tfree(lastVar->value);\n\t\tfree(lastVar);\n\t}\n\treturn;\n}\n\nvoid _httpd_storeData(request *r, char *query)\n{\n        char    *cp,\n\t\t*cp2,\n                *var,\n                *val,\n\t\t*tmpVal;\n\n        if (!query)\n                return;\n\n\tvar = (char *)malloc(strlen(query));\n\t\n\tcp = query;\n\tcp2 = var;\n        bzero(var, strlen(query));\n\tval = NULL;\n        while(*cp)\n        {\n                if (*cp == '=')\n                {\n                        cp++;\n\t\t\t*cp2 = 0;\n                        val = cp;\n                        continue;\n                }\n                if (*cp == '&')\n                {\n\t\t\t*cp = 0;\n\t\t\ttmpVal = _httpd_unescape(val);\n\t\t\thttpdAddVariable(r, var, tmpVal);\n                        cp++;\n                        cp2 = var;\n\t\t\tval = NULL;\n                        continue;\n                }\n\t\tif (val)\n\t\t{\n\t\t\tcp++;\n\t\t}\n\t\telse\n\t\t{\n                \t*cp2 = *cp++;\n            /*\n\t\t\tif (*cp2 == '.')\n\t\t\t{\n\t\t\t\tstrcpy(cp2,\"_dot_\");\n\t\t\t\tcp2 += 5;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n            */\n\t\t\t\tcp2++;\n            /*\n\t\t\t}\n            */\n\t\t}\n        }\n    if (val != NULL) {\n\t    *cp = 0;\n\t    tmpVal = _httpd_unescape(val);\n\t    httpdAddVariable(r, var, tmpVal);\n    }\n\tfree(var);\n}\n\n\nvoid _httpd_formatTimeString(char *ptr, int clock)\n{\n\tstruct \ttm *timePtr;\n\ttime_t t;\n\n\tt = (clock == 0) ? time(NULL) : clock;\n\ttimePtr = gmtime(&t);\n\tstrftime(ptr, HTTP_TIME_STRING_LEN,\"%a, %d %b %Y %T GMT\",timePtr);\n}\n\n\nvoid _httpd_sendHeaders(request *r, int contentLength, int modTime)\n{\n\tchar\ttmpBuf[80],\n\t\ttimeBuf[HTTP_TIME_STRING_LEN];\n\n\tif(r->response.headersSent)\n\t\treturn;\n\n\tr->response.headersSent = 1;\n\t_httpd_net_write(r->clientSock, \"HTTP/1.0 \", 9);\n\t_httpd_net_write(r->clientSock, r->response.response, \n\t\tstrlen(r->response.response));\n\t_httpd_net_write(r->clientSock, r->response.headers, \n\t\tstrlen(r->response.headers));\n\n\t_httpd_formatTimeString(timeBuf, 0);\n\t_httpd_net_write(r->clientSock,\"Date: \", 6);\n\t_httpd_net_write(r->clientSock, timeBuf, strlen(timeBuf));\n\t_httpd_net_write(r->clientSock, \"\\n\", 1);\n\n\t_httpd_net_write(r->clientSock, \"Connection: close\\n\", 18);\n\t_httpd_net_write(r->clientSock, \"Content-Type: \", 14);\n\t_httpd_net_write(r->clientSock, r->response.contentType, \n\t\tstrlen(r->response.contentType));\n\t_httpd_net_write(r->clientSock, \"\\n\", 1);\n\n\tif (contentLength > 0)\n\t{\n\t\t_httpd_net_write(r->clientSock, \"Content-Length: \", 16);\n\t\tsnprintf(tmpBuf, sizeof(tmpBuf), \"%d\", contentLength);\n\t\t_httpd_net_write(r->clientSock, tmpBuf, strlen(tmpBuf));\n\t\t_httpd_net_write(r->clientSock, \"\\n\", 1);\n\n\t\t_httpd_formatTimeString(timeBuf, modTime);\n\t\t_httpd_net_write(r->clientSock, \"Last-Modified: \", 15);\n\t\t_httpd_net_write(r->clientSock, timeBuf, strlen(timeBuf));\n\t\t_httpd_net_write(r->clientSock, \"\\n\", 1);\n\t}\n\t_httpd_net_write(r->clientSock, \"\\n\", 1);\n}\n\nhttpDir *_httpd_findContentDir(server, dir, createFlag)\n\thttpd\t*server;\n\tchar\t*dir;\n\tint\tcreateFlag;\n{\n\tchar\tbuffer[HTTP_MAX_URL],\n\t\t*curDir;\n\thttpDir\t*curItem,\n\t\t*curChild;\n\n\tstrncpy(buffer, dir, HTTP_MAX_URL);\n        buffer[HTTP_MAX_URL-1]=0;\n\tcurItem = server->content;\n\tcurDir = strtok(buffer,\"/\");\n\twhile(curDir)\n\t{\n\t\tcurChild = curItem->children;\n\t\twhile(curChild)\n\t\t{\n\t\t\tif (strcmp(curChild->name, curDir) == 0)\n\t\t\t\tbreak;\n\t\t\tcurChild = curChild->next;\n\t\t}\n\t\tif (curChild == NULL)\n\t\t{\n\t\t\tif (createFlag == HTTP_TRUE)\n\t\t\t{\n\t\t\t\tcurChild = malloc(sizeof(httpDir));\n\t\t\t\tbzero(curChild, sizeof(httpDir));\n\t\t\t\tcurChild->name = strdup(curDir);\n\t\t\t\tcurChild->next = curItem->children;\n\t\t\t\tcurItem->children = curChild;\n\t\t\t}\n\t\t\telse\n\t\t\t{\n\t\t\t\treturn(NULL);\n\t\t\t}\n\t\t}\n\t\tcurItem = curChild;\n\t\tcurDir = strtok(NULL,\"/\");\n\t}\n\treturn(curItem);\n}\n\n\nhttpContent *_httpd_findContentEntry(request *r, httpDir *dir, char *entryName)\n{\n\thttpContent *curEntry;\n\n\tcurEntry = dir->entries;\n\twhile(curEntry)\n\t{\n\t\tif (curEntry->type == HTTP_WILDCARD || \n\t\t    curEntry->type ==HTTP_C_WILDCARD)\n\t\t\tbreak;\n\t\tif (*entryName == 0 && curEntry->indexFlag)\n\t\t\tbreak;\n\t\tif (strcmp(curEntry->name, entryName) == 0)\n\t\t\tbreak;\n\t\tcurEntry = curEntry->next;\n\t}\n\tif (curEntry)\n\t\tr->response.content = curEntry;\n\treturn(curEntry);\n}\n\n\nvoid _httpd_send304(request *r)\n{\n\thttpdSetResponse(r, \"304 Not Modified\\n\");\n\t_httpd_sendHeaders(r,0,0);\n}\n\n\nvoid _httpd_send403(request *r)\n{\n\thttpdSetResponse(r, \"403 Permission Denied\\n\");\n\t_httpd_sendHeaders(r,0,0);\n\t_httpd_sendText(r,\n\t\t\"<HTML><HEAD><TITLE>403 Permission Denied</TITLE></HEAD>\\n\");\n\t_httpd_sendText(r,\n\t\t\"<BODY><H1>Access to the request URL was denied!</H1>\\n\");\n}\n\n\nvoid _httpd_send404(httpd *server, request *r)\n{\n\tchar\tmsg[HTTP_MAX_URL];\n\n\tsnprintf(msg, HTTP_MAX_URL,\n\t\t\"File does not exist: %s\\n\", r->request.path);\n\t_httpd_writeErrorLog(server, r, LEVEL_ERROR, msg);\n\n\tif (server->handle404 && server->handle404->function) {\n\t\t/*\n\t\t * There's a custom C 404 handler defined with httpdAddC404Content\n\t\t */\n\t\t(server->handle404->function)(server, r);\n\t}\n\telse {\n\t\t/*\n\t\t * Send stock 404\n\t\t */\n\t\thttpdSetResponse(r, \"404 Not Found\\n\");\n\t\t_httpd_sendHeaders(r,0,0);\n\t\t_httpd_sendText(r,\n\t\t\t\"<HTML><HEAD><TITLE>404 Not Found</TITLE></HEAD>\\n\");\n\t\t_httpd_sendText(r,\n\t\t\t\"<BODY><H1>The request URL was not found!</H1>\\n\");\n\t\t_httpd_sendText(r, \"</BODY></HTML>\\n\");\n\t}\n}\n\n\nvoid _httpd_catFile(request *r, char *path)\n{\n\tint\tfd,\n\t\tlen;\n\tchar\tbuf[HTTP_MAX_LEN];\n\n\tfd = open(path,O_RDONLY);\n\tif (fd < 0)\n\t\treturn;\n\tlen = read(fd, buf, HTTP_MAX_LEN);\n\twhile(len > 0)\n\t{\n\t\tr->response.responseLength += len;\n\t\t_httpd_net_write(r->clientSock, buf, len);\n\t\tlen = read(fd, buf, HTTP_MAX_LEN);\n\t}\n\tclose(fd);\n}\n\n\nvoid _httpd_sendStatic(httpd *server, request *r, char *data)\n{\n\tif (_httpd_checkLastModified(r, server->startTime) == 0)\n\t{\n\t\t_httpd_send304(r);\n\t}\n\t_httpd_sendHeaders(r, server->startTime, strlen(data));\n\thttpdOutput(r, data);\n}\n\n\n\nvoid _httpd_sendFile(httpd *server, request *r, char *path)\n{\n\tchar\t*suffix;\n\tstruct \tstat sbuf;\n\n\tsuffix = strrchr(path, '.');\n\tif (suffix != NULL)\n\t{\n\t\tif (strcasecmp(suffix,\".gif\") == 0) \n\t\t\tstrcpy(r->response.contentType,\"image/gif\");\n\t\tif (strcasecmp(suffix,\".jpg\") == 0) \n\t\t\tstrcpy(r->response.contentType,\"image/jpeg\");\n\t\tif (strcasecmp(suffix,\".xbm\") == 0) \n\t\t\tstrcpy(r->response.contentType,\"image/xbm\");\n\t\tif (strcasecmp(suffix,\".png\") == 0) \n\t\t\tstrcpy(r->response.contentType,\"image/png\");\n\t}\n\tif (stat(path, &sbuf) < 0)\n\t{\n\t\t_httpd_send404(server, r);\n\t\treturn;\n\t}\n\tif (_httpd_checkLastModified(r, sbuf.st_mtime) == 0)\n\t{\n\t\t_httpd_send304(r);\n\t}\n\telse\n\t{\n\t\t_httpd_sendHeaders(r, sbuf.st_size, sbuf.st_mtime);\n\t\t_httpd_catFile(r, path);\n\t}\n}\n\n\nint _httpd_sendDirectoryEntry(httpd *server, request *r, httpContent *entry,\n\t\tchar *entryName)\n{\n\tchar\t\tpath[HTTP_MAX_URL];\n\n\tsnprintf(path, HTTP_MAX_URL, \"%s/%s\", entry->path, entryName);\n\t_httpd_sendFile(server, r, path);\n\treturn(0);\n}\n\n\nvoid _httpd_sendText(request *r, char *msg)\n{\n\tr->response.responseLength += strlen(msg);\n\t_httpd_net_write(r->clientSock,msg,strlen(msg));\n}\n\n\nint _httpd_checkLastModified(request *r, int modTime)\n{\n\tchar \ttimeBuf[HTTP_TIME_STRING_LEN];\n\n\t_httpd_formatTimeString(timeBuf, modTime);\n\tif (strcmp(timeBuf, r->request.ifModified) == 0)\n\t\treturn(0);\n\treturn(1);\n}\n\n\nstatic unsigned char isAcceptable[96] =\n\n/* Overencodes */\n#define URL_XALPHAS     (unsigned char) 1\n#define URL_XPALPHAS    (unsigned char) 2\n\n/*      Bit 0           xalpha          -- see HTFile.h\n**      Bit 1           xpalpha         -- as xalpha but with plus.\n**      Bit 2 ...       path            -- as xpalpha but with /\n*/\n    /*   0 1 2 3 4 5 6 7 8 9 A B C D E F */\n    {    7,0,0,0,0,0,0,0,0,0,7,0,0,7,7,7,       /* 2x   !\"#$%&'()*+,-./ */\n         7,7,7,7,7,7,7,7,7,7,0,0,0,0,0,0,       /* 3x  0123456789:;<=>?  */\n         7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,       /* 4x  @ABCDEFGHIJKLMNO */\n         7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,7,       /* 5X  PQRSTUVWXYZ[\\]^_ */\n         0,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,       /* 6x  `abcdefghijklmno */\n         7,7,7,7,7,7,7,7,7,7,7,0,0,0,0,0 };     /* 7X  pqrstuvwxyz{\\}~ DEL */\n \n#define ACCEPTABLE(a)   ( a>=32 && a<128 && ((isAcceptable[a-32]) & mask))\n\nstatic char *hex = \"0123456789ABCDEF\";\n\n\nchar *_httpd_escape(str)\n        const char *str;\n{\n    unsigned char mask = URL_XPALPHAS;\n    const char * p;\n    char * q;\n    char * result;\n    int unacceptable = 0;\n    for(p=str; *p; p++)\n        if (!ACCEPTABLE((unsigned char)*p))\n                unacceptable +=2;\n    result = (char *) malloc(p-str + unacceptable + 1);\n    bzero(result,(p-str + unacceptable + 1));\n\n    if (result == NULL)\n    {\n\treturn(NULL);\n    }\n    for(q=result, p=str; *p; p++) {\n        unsigned char a = *p;\n        if (!ACCEPTABLE(a)) {\n            *q++ = '%';  /* Means hex commming */\n            *q++ = hex[a >> 4];\n            *q++ = hex[a & 15];\n        }\n        else *q++ = *p;\n    }\n    *q++ = 0;                   /* Terminate */\n    return result;\n}\n\n\n\nvoid _httpd_sanitiseUrl(url)\n\tchar\t*url;\n{\n\tchar\t*from,\n\t\t*to,\n\t\t*last;\n\n\t/*\n\t** Remove multiple slashes\n\t*/\n\tfrom = to = url;\n\twhile(*from)\n\t{\n\t\tif (*from == '/' && *(from+1) == '/')\n\t\t{\n\t\t\tfrom++;\n\t\t\tcontinue;\n\t\t}\n\t\t*to = *from;\n\t\tto++;\n\t\tfrom++;\n\t}\n\t*to = 0;\n\n\n\t/*\n\t** Get rid of ./ sequences\n\t*/\n\tfrom = to = url;\n\twhile(*from)\n\t{\n\t\tif (*from == '/' && *(from+1) == '.' && *(from+2)=='/')\n\t\t{\n\t\t\tfrom += 2;\n\t\t\tcontinue;\n\t\t}\n\t\t*to = *from;\n\t\tto++;\n\t\tfrom++;\n\t}\n\t*to = 0;\n\n\n\t/*\n\t** Catch use of /../ sequences and remove them.  Must track the\n\t** path structure and remove the previous path element.\n\t*/\n\tfrom = to = last = url;\n\twhile(*from)\n\t{\n\t\tif (*from == '/' && *(from+1) == '.' && \n\t\t\t*(from+2)=='.' && *(from+3)=='/')\n\t\t{\n\t\t\tto = last;\n\t\t\tfrom += 3;\n\t\t\tcontinue;\n\t\t}\n\t\tif (*from == '/')\n\t\t{\n\t\t\tlast = to;\n\t\t}\n\t\t*to = *from;\n\t\tto++;\n\t\tfrom++;\n\t}\n\t*to = 0;\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/libhttpd/version.c",
    "content": "/*\n** Copyright (c) 2002  Hughes Technologies Pty Ltd.  All rights\n** reserved.\n**\n** Terms under which this software may be used or copied are\n** provided in the  specific license associated with this product.\n**\n** Hughes Technologies disclaims all warranties with regard to this\n** software, including all implied warranties of merchantability and\n** fitness, in no event shall Hughes Technologies be liable for any\n** special, indirect or consequential damages or any damages whatsoever\n** resulting from loss of use, data or profits, whether in an action of\n** contract, negligence or other tortious action, arising out of or in\n** connection with the use or performance of this software.\n**\n**\n** $Id$\n**\n*/\n\nchar    LIBHTTPD_VERSION[] =  \"1.3\",\n        LIBHTTPD_VENDOR[] =   \"Hughes Technologies Pty Ltd\";\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/scripts/init.d/wifidog",
    "content": "#!/bin/sh /etc/rc.common\n\nUSE_PROCD=1\nSTART=65\nSTOP=35\n\nSERVICE_DAEMONIZE=1\nSERVICE_WRITE_PID=1\n\nstart_service() {\n    procd_open_instance\n    procd_set_param command /usr/local/hsbuilder/hsbuilder.sh\n    procd_append_param command -conf /usr/local/hsbuilder/hsbuilder.conf\n    procd_append_param command -mypath /usr/local/hsbuilder/hsbuilder.sh\n    procd_append_param command -nomsgfile\n    procd_append_param command -noresolve\n    procd_append_param command -envinfo \"wiwiz-opsrc\"\n    procd_set_param respawn\n    procd_close_instance\n\n    # 启动 wiwizroaming.sh\n    procd_open_instance\n    procd_set_param command /usr/local/hsbuilder/wiwizroaming.sh\n    procd_set_param respawn\n    procd_close_instance\n\n    # 设置临时文件\n    echo 1 > /tmp/wiwizroaming\n    echo 1 > /tmp/wiwizroaming.debug\n\n    # 更新版本信息\n    MY_VERSION=\"$(cat /usr/local/hsbuilder/ver 2>/dev/null)\"\n    uci set wiwiz.portal.ver=\"$MY_VERSION\"\n    uci commit wiwiz\n}\n\nstop_service() {\n    # 停止 hsbuilder.sh\n    local s=$(ps w | grep -F 'hsbuilder.sh' | grep -v grep)\n    if [ -n \"$s\" ]; then\n        kill $(echo \"$s\" | awk '{print $1}')\n    fi\n    killall hsbuilder.sh 2>/dev/null\n\n    # 删除临时文件\n    rm -f /tmp/wiwizroaming\n    rm -f /tmp/wiwizroaming.debug\n\n    # 停止 wiwizroaming.sh\n    s=$(ps w | grep -F 'wiwizroaming.sh' | grep -v grep)\n    if [ -n \"$s\" ]; then\n        kill $(echo \"$s\" | awk '{print $1}')\n    fi\n    killall wiwizroaming.sh 2>/dev/null\n    killall logread 2>/dev/null\n\n    # 停止 wifidog\n    if $WD_DIR/wdctl status 2> /dev/null; then\n        if $WD_DIR/wdctl stop; then\n            echo \"OK\"\n        else\n            echo \"FAILED: wdctl stop exited with non 0 status\"\n        fi\n    else\n        echo \"FAILED: Wifidog was not running\"\n    fi\n}\n\nreload_service() {\n    stop_service\n    sleep 2\n    start_service\n}\n\n# service_triggers() {\n#     procd_add_reload_trigger \"wiwiz\"\n# }"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/Makefile.am",
    "content": "#\n# $Id$\n#\n\nbin_PROGRAMS = wifidog \\\n\twdctl\n \nAM_CPPFLAGS = \\\n\t-I${top_srcdir}/libhttpd/ \\\n\t-DSYSCONFDIR='\"$(sysconfdir)\"' \nwifidog_LDADD = $(top_builddir)/libhttpd/libhttpd.la\n\nwifidog_SOURCES = commandline.c \\\n\tconf.c \\\n\tdebug.c \\\n\tfw_iptables.c \\\n\tfirewall.c \\\n\tgateway.c \\\n\tcentralserver.c \\\n\thttp.c \\\n\tauth.c \\\n\tclient_list.c \\\n\tutil.c \\\n\twdctl_thread.c \\\n\tping_thread.c \\\n\tsafe.c \\\n\thttpd_thread.c\n\nnoinst_HEADERS = commandline.h \\\n\tcommon.h \\\n\tconf.h \\\n\tdebug.h \\\n\tfw_iptables.h \\\n\tfirewall.h \\\n\tgateway.h \\\n\tcentralserver.h \\\n\thttp.h \\\n\tauth.h \\\n\tclient_list.h \\\n\tutil.h \\\n\twdctl_thread.h \\\n\twdctl.h \\\n\tping_thread.h \\\n\tsafe.h \\\n\thttpd_thread.h\n\nwdctl_SOURCES = wdctl.c\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/auth.c",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file auth.c\n    @brief Authentication handling thread\n    @author Copyright (C) 2004 Alexandre Carmel-Veilleux <acv@miniguru.ca>\n*/\n\n#define _GNU_SOURCE\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <pthread.h>\n#include <string.h>\n#include <stdarg.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <unistd.h>\n#include <syslog.h>\n\n#include \"httpd.h\"\n#include \"http.h\"\n#include \"safe.h\"\n#include \"conf.h\"\n#include \"debug.h\"\n#include \"auth.h\"\n#include \"centralserver.h\"\n#include \"fw_iptables.h\"\n#include \"firewall.h\"\n#include \"client_list.h\"\n#include \"util.h\"\n\n/* Defined in clientlist.c */\nextern\tpthread_mutex_t\tclient_list_mutex;\n\n/* Defined in util.c */\nextern long served_this_session;\n\n/** Launches a thread that periodically checks if any of the connections has timed out\n@param arg Must contain a pointer to a string containing the IP adress of the client to check to check\n@todo Also pass MAC adress? \n@todo This thread loops infinitely, need a watchdog to verify that it is still running?\n*/  \nvoid\nthread_client_timeout_check(const void *arg)\n{\n\tpthread_cond_t\t\tcond = PTHREAD_COND_INITIALIZER;\n\tpthread_mutex_t\t\tcond_mutex = PTHREAD_MUTEX_INITIALIZER;\n\tstruct\ttimespec\ttimeout;\n\t\n\twhile (1) {\n\t\t/* Sleep for config.checkinterval seconds... */\n\t\ttimeout.tv_sec = time(NULL) + config_get_config()->checkinterval;\n\t\ttimeout.tv_nsec = 0;\n\n\t\t/* Mutex must be locked for pthread_cond_timedwait... */\n\t\tpthread_mutex_lock(&cond_mutex);\n\t\t\n\t\t/* Thread safe \"sleep\" */\n\t\tpthread_cond_timedwait(&cond, &cond_mutex, &timeout);\n\n\t\t/* No longer needs to be locked */\n\t\tpthread_mutex_unlock(&cond_mutex);\n\t\n\t\tdebug(LOG_DEBUG, \"Running fw_counter()\");\n\t\n\t\tfw_sync_with_authserver();\n\t}\n}\n\n/** Authenticates a single client against the central server and returns when done\n * Alters the firewall rules depending on what the auth server says\n@param r httpd request struct\n*/\nvoid\nauthenticate_client(request *r)\n{\n\tt_client\t*client;\n\tt_authresponse\tauth_response;\n\tchar\t*mac,\n\t\t*token;\n\tchar *urlFragment = NULL;\n\ts_config\t*config = NULL;\n\tt_auth_serv\t*auth_server = NULL;\n\n\t//wiwiz add start\n\tif (!(mac = arp_get(r->clientAddr))) {\n\t\t/* We could not get their MAC address */\n\t\tdebug(LOG_ERR, \"Failed to retrieve MAC address for ip %s\", r->clientAddr);\n\t\treturn;\n\t}\n\t//wiwiz add end\n\n\tLOCK_CLIENT_LIST();\n\n\t//client = client_list_find_by_ip(r->clientAddr);\twiwiz deleted\n\tclient = client_list_find(r->clientAddr, mac);\t//wiwiz\n\n\tif (client == NULL) {\n\t\tdebug(LOG_ERR, \"authenticate_client(): Could not find client for %s\", r->clientAddr);\n\t\tUNLOCK_CLIENT_LIST();\n\t\treturn;\n\t}\n\t\n\tmac = safe_strdup(client->mac);\n\ttoken = safe_strdup(client->token);\n\t\n\tUNLOCK_CLIENT_LIST();\n\t\n\t/* \n\t * At this point we've released the lock while we do an HTTP request since it could\n\t * take multiple seconds to do and the gateway would effectively be frozen if we\n\t * kept the lock.\n\t */\n\tauth_server_request(&auth_response, REQUEST_TYPE_LOGIN, r->clientAddr, mac, token, 0, 0);\n\t\n\tLOCK_CLIENT_LIST();\n\t\n\t/* can't trust the client to still exist after n seconds have passed */\n\tclient = client_list_find(r->clientAddr, mac);\n\t\n\tif (client == NULL) {\n\t\tdebug(LOG_ERR, \"authenticate_client(): Could not find client node for %s (%s)\", r->clientAddr, mac);\n\t\tUNLOCK_CLIENT_LIST();\n\t\tfree(token);\n\t\tfree(mac);\n\t\treturn;\n\t}\n\t\n\tfree(token);\n\tfree(mac);\n\n\t/* Prepare some variables we'll need below */\n\tconfig = config_get_config();\n\tauth_server = get_auth_server();\n\n\tswitch(auth_response.authcode) {\n\n\tcase AUTH_ERROR:\n\t\t/* Error talking to central server */\n\t\tdebug(LOG_ERR, \"Got %d from central server authenticating token %s from %s at %s\", auth_response, client->token, client->ip, client->mac);\n\t\tsend_http_page(r, \"Error!\", \"Error: We did not get a valid answer from the central server\");\n\t\tbreak;\n\n\tcase AUTH_DENIED:\n\t\t/* Central server said invalid token */\n\t\tdebug(LOG_INFO, \"Got DENIED from central server authenticating token %s from %s at %s - deleting from firewall and redirecting them to denied message\", client->token, client->ip, client->mac);\n\t\tfw_deny(client->ip, client->mac, FW_MARK_KNOWN);\n\t\tsafe_asprintf(&urlFragment, \"%smessage=%s\",\n\t\t\tauth_server->authserv_msg_script_path_fragment,\n\t\t\tGATEWAY_MESSAGE_DENIED\n\t\t);\n\t\thttp_send_redirect_to_auth(r, urlFragment, \"Redirect to denied message\");\n\t\tfree(urlFragment);\n\t\tbreak;\n\n    case AUTH_VALIDATION:\n\t\t/* They just got validated for X minutes to check their email */\n\t\tdebug(LOG_INFO, \"Got VALIDATION from central server authenticating token %s from %s at %s\"\n\t\t\t\t\"- adding to firewall and redirecting them to activate message\", client->token,\n\t\t\t\tclient->ip, client->mac);\n\t\tclient->fw_connection_state = FW_MARK_PROBATION;\n\t\tfw_allow(client->ip, client->mac, FW_MARK_PROBATION);\n\t\tsafe_asprintf(&urlFragment, \"%smessage=%s\",\n\t\t\tauth_server->authserv_msg_script_path_fragment,\n\t\t\tGATEWAY_MESSAGE_ACTIVATE_ACCOUNT\n\t\t);\n\t\thttp_send_redirect_to_auth(r, urlFragment, \"Redirect to activate message\");\n\t\tfree(urlFragment);\n\t    break;\n\n    case AUTH_ALLOWED:\n\t\t/* Logged in successfully as a regular account */\n\t\tdebug(LOG_INFO, \"Got ALLOWED from central server authenticating token %s from %s at %s - \"\n\t\t\t\t\"adding to firewall and redirecting them to portal\", client->token, client->ip, client->mac);\n\t\tclient->fw_connection_state = FW_MARK_KNOWN;\n\t\tfw_allow(client->ip, client->mac, FW_MARK_KNOWN);\n        served_this_session++;\n        /* wiwiz modified\n\t\tsafe_asprintf(&urlFragment, \"%sgw_id=%s\",\n\t\t\tauth_server->authserv_portal_script_path_fragment,\n\t\t\tconfig->gw_id\n\t\t);\n\t\t*/\n\t\tsafe_asprintf(&urlFragment, \"%sgw_id=%s&gw_address=%s&gw_mac=%s&token=%s\",\n\t\t\tauth_server->authserv_portal_script_path_fragment,\n\t\t\tconfig->gw_id,\n\t\t\tconfig->gw_address,\n\t\t\tconfig->gw_interface_mac,\n\t\t\tclient->token\n\t\t);\n\n\t\thttp_send_redirect_to_auth(r, urlFragment, \"Redirect to portal\");\n\t\tfree(urlFragment);\n\t    break;\n\n    case AUTH_VALIDATION_FAILED:\n\t\t /* Client had X minutes to validate account by email and didn't = too late */\n\t\tdebug(LOG_INFO, \"Got VALIDATION_FAILED from central server authenticating token %s from %s at %s \"\n\t\t\t\t\"- redirecting them to failed_validation message\", client->token, client->ip, client->mac);\n\t\tsafe_asprintf(&urlFragment, \"%smessage=%s\",\n\t\t\tauth_server->authserv_msg_script_path_fragment,\n\t\t\tGATEWAY_MESSAGE_ACCOUNT_VALIDATION_FAILED\n\t\t);\n\t\thttp_send_redirect_to_auth(r, urlFragment, \"Redirect to failed validation message\");\n\t\tfree(urlFragment);\n\t    break;\n\n    default:\n\t\tdebug(LOG_WARNING, \"I don't know what the validation code %d means for token %s from %s at %s - sending error message\", auth_response.authcode, client->token, client->ip, client->mac);\n\t\tsend_http_page(r, \"Internal Error\", \"We can not validate your request at this time\");\n\t    break;\n\n\t}\n\n\tUNLOCK_CLIENT_LIST();\n\treturn;\n}\n\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/auth.h",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file auth.h\n    @brief Authentication handling thread\n    @author Copyright (C) 2004 Alexandre Carmel-Veilleux <acv@miniguru.ca>\n*/\n\n#ifndef _AUTH_H_\n#define _AUTH_H_\n\n#include \"httpd.h\"\n\n/**\n * @brief Authentication codes returned by auth server.\n *\n * Authentication result codes returned by auth_server_request() corresponding\n * to result code from the central server itself.\n */\ntypedef enum {\n    AUTH_ERROR = -1, /**< An error occured during the validation process*/\n    AUTH_DENIED = 0, /**< Client was denied by the auth server */\n    AUTH_ALLOWED = 1, /**< Client was granted access by the auth server */\n    AUTH_VALIDATION = 5, /**< A misnomer.  Client is in 15 min probation to validate his new account */\n    AUTH_VALIDATION_FAILED = 6, /**< Client had X minutes to validate account by email and didn't = too late */\n    AUTH_LOCKED = 254 /**< Account has been locked */\n} t_authcode;\n\n/** \n * @brief This structure contains all the information returned by the  authentication server\n */\ntypedef struct _t_authresponse {\n    t_authcode authcode; /**< Authentication code returned by the server */\n} t_authresponse;\n\n\n/** @brief Authenticate a single client against the central server */\nvoid authenticate_client(request *);\n\n/** @brief Periodically check if connections expired */\nvoid thread_client_timeout_check(const void *arg);\n\n#endif\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/centralserver.c",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n \\********************************************************************/\n\n/* $Id$ */\n/** @file centralserver.c\n  @brief Functions to talk to the central server (auth/send stats/get rules/etc...)\n  @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n */\n\n#include <pthread.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <sys/stat.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <errno.h>\n#include <unistd.h>\n#include <string.h>\n#include <syslog.h>\n\n#include \"httpd.h\"\n\n#include \"common.h\"\n#include \"safe.h\"\n#include \"util.h\"\n#include \"auth.h\"\n#include \"conf.h\"\n#include \"debug.h\"\n#include \"centralserver.h\"\n#include \"firewall.h\"\n#include \"../config.h\"\n\nextern pthread_mutex_t\tconfig_mutex;\n\n/* start: added by wiwiz */\nvoid batchAuth(t_authresponse *authresponse, const char *mac, const char *token) {\n\tchar *cmd;\n\tFILE *authfile;\n\tsafe_asprintf(&cmd, \"cat /tmp/wiwiz_auth_data | grep -i '%s' | grep -i '%s' | awk \\'{print $1}\\'>/tmp/wiwiz_auth\", mac, token);\n    execute(cmd, 0);\n    free(cmd);\n\n\t/* Blanket default is error. */\n\tauthresponse->authcode = AUTH_ERROR;\n\t\n\tauthfile = fopen(\"/tmp/wiwiz_auth\", \"r\");\n\tif (!authfile) {\n\t\tdebug(LOG_ERR, \"fopen(): %s\", strerror(errno));\t\t\n\t\treturn;\n\t}\n\n\tfscanf(authfile, \"%d\", (int *)&authresponse->authcode);\n\n\tfclose(authfile);\n}\n/* end: added by wiwiz */\n\n/** Initiates a transaction with the auth server, either to authenticate or to\n * update the traffic counters at the server\n@param authresponse Returns the information given by the central server \n@param request_type Use the REQUEST_TYPE_* defines in centralserver.h\n@param ip IP adress of the client this request is related to\n@param mac MAC adress of the client this request is related to\n@param token Authentification token of the client\n@param incoming Current counter of the client's total incoming traffic, in bytes \n@param outgoing Current counter of the client's total outgoing traffic, in bytes \n*/\nt_authcode\nauth_server_request(t_authresponse *authresponse, const char *request_type, const char *ip, const char *mac, const char *token, unsigned long long int incoming, unsigned long long int outgoing)\n{\n\tint sockfd;\n\tssize_t\tnumbytes;\n\tsize_t totalbytes;\n\tchar buf[MAX_BUF];\n\tchar *tmp;\n        char *safe_token;\n\tint done, nfds;\n\tfd_set\t\t\treadfds;\n\tstruct timeval\t\ttimeout;\n\tt_auth_serv\t*auth_server = NULL;\n\tauth_server = get_auth_server();\n\t\n\t/* Blanket default is error. */\n\tauthresponse->authcode = AUTH_ERROR;\n\t\n\tsockfd = connect_auth_server();\n\tif (sockfd == -1) {\n\t\t/* Could not connect to any auth server */\n\t\treturn (AUTH_ERROR);\n\t}\n\n\t/**\n\t * TODO: XXX change the PHP so we can harmonize stage as request_type\n\t * everywhere.\n\t */\n\tmemset(buf, 0, sizeof(buf));\n        safe_token=httpdUrlEncode(token);\n\tsnprintf(buf, (sizeof(buf) - 1),\n\t\t\"GET %s%sstage=%s&ip=%s&mac=%s&token=%s&incoming=%llu&outgoing=%llu&gw_id=%s&gw_mac=%s HTTP/1.0\\r\\n\"\n\t\t\"User-Agent: WiFiDog %s\\r\\n\"\n\t\t\"Host: %s\\r\\n\"\n\t\t\"\\r\\n\",\n\t\tauth_server->authserv_path,\n\t\tauth_server->authserv_auth_script_path_fragment,\n\t\trequest_type,\n\t\tip,\n\t\tmac,\n\t\tsafe_token,\n\t\tincoming,\n\t\toutgoing,\n        config_get_config()->gw_id,\n\t\tconfig_get_config()->gw_interface_mac,\n\t\tVERSION,\n\t\tauth_server->authserv_hostname\n\t);\n\n    free(safe_token);\n\n\tdebug(LOG_DEBUG, \"Sending HTTP request to auth server: [%s]\\n\", buf);\n\tsend(sockfd, buf, strlen(buf), 0);\n\n\tdebug(LOG_DEBUG, \"Reading response\");\n\tnumbytes = totalbytes = 0;\n\tdone = 0;\n\tdo {\n\t\tFD_ZERO(&readfds);\n\t\tFD_SET(sockfd, &readfds);\n\t\ttimeout.tv_sec = 30; /* XXX magic... 30 second is as good a timeout as any */\n\t\ttimeout.tv_usec = 0;\n\t\tnfds = sockfd + 1;\n\n\t\tnfds = select(nfds, &readfds, NULL, NULL, &timeout);\n\n\t\tif (nfds > 0) {\n\t\t\t/** We don't have to use FD_ISSET() because there\n\t\t\t *  was only one fd. */\n\t\t\tnumbytes = read(sockfd, buf + totalbytes, MAX_BUF - (totalbytes + 1));\n\t\t\tif (numbytes < 0) {\n\t\t\t\tdebug(LOG_ERR, \"An error occurred while reading from auth server: %s\", strerror(errno));\n\t\t\t\t/* FIXME */\n\t\t\t\tclose(sockfd);\n\t\t\t\treturn (AUTH_ERROR);\n\t\t\t}\n\t\t\telse if (numbytes == 0) {\n\t\t\t\tdone = 1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttotalbytes += numbytes;\n\t\t\t\tdebug(LOG_DEBUG, \"Read %d bytes, total now %d\", numbytes, totalbytes);\n\t\t\t}\n\t\t}\n\t\telse if (nfds == 0) {\n\t\t\tdebug(LOG_ERR, \"Timed out reading data via select() from auth server\");\n\t\t\t/* FIXME */\n\t\t\tclose(sockfd);\n\t\t\treturn (AUTH_ERROR);\n\t\t}\n\t\telse if (nfds < 0) {\n\t\t\tdebug(LOG_ERR, \"Error reading data via select() from auth server: %s\", strerror(errno));\n\t\t\t/* FIXME */\n\t\t\tclose(sockfd);\n\t\t\treturn (AUTH_ERROR);\n\t\t}\n\t} while (!done);\n\n\tclose(sockfd);\n\n\tbuf[totalbytes] = '\\0';\n\tdebug(LOG_DEBUG, \"HTTP Response from Server: [%s]\", buf);\n\t\n\tif ((tmp = strstr(buf, \"Auth: \"))) {\n\t\tif (sscanf(tmp, \"Auth: %d\", (int *)&authresponse->authcode) == 1) {\n\t\t\tdebug(LOG_INFO, \"Auth server returned authentication code %d\", authresponse->authcode);\n\t\t\treturn(authresponse->authcode);\n\t\t} else {\n\t\t\tdebug(LOG_WARNING, \"Auth server did not return expected authentication code\");\n\t\t\treturn(AUTH_ERROR);\n\t\t}\n\t}\n\telse {\n\t\treturn(AUTH_ERROR);\n\t}\n\n\t/* XXX Never reached because of the above if()/else pair. */\n\treturn(AUTH_ERROR);\n}\n\n/* Tries really hard to connect to an auth server. Returns a file descriptor, -1 on error\n */\nint connect_auth_server() {\n\tint sockfd;\n\n\tLOCK_CONFIG();\n\tsockfd = _connect_auth_server(0);\n\tUNLOCK_CONFIG();\n\n\tif (sockfd == -1) {\n\t\tdebug(LOG_ERR, \"Failed to connect to any of the auth servers\");\n\t\tmark_auth_offline();\n\t}\n\telse {\n\t\tdebug(LOG_DEBUG, \"Connected to auth server\");\n\t\tmark_auth_online();\n\t}\n\treturn (sockfd);\n}\n\n/* Helper function called by connect_auth_server() to do the actual work including recursion\n * DO NOT CALL DIRECTLY\n @param level recursion level indicator must be 0 when not called by _connect_auth_server()\n */\nint _connect_auth_server(int level) {\n\ts_config *config = config_get_config();\n\tt_auth_serv *auth_server = NULL;\n\tstruct in_addr *h_addr;\n\tint num_servers = 0;\n\tchar * hostname = NULL;\n\tchar * popular_servers[] = {\n\t\t  \"www.google.com\",\n\t\t  \"www.yahoo.com\",\n\t\t  NULL\n\t};\n\tchar ** popularserver;\n\tchar * ip;\n\tstruct sockaddr_in their_addr;\n\tint sockfd;\n\n\t/* XXX level starts out at 0 and gets incremented by every iterations. */\n\tlevel++;\n\n\t/*\n\t * Let's calculate the number of servers we have\n\t */\n\tfor (auth_server = config->auth_servers; auth_server; auth_server = auth_server->next) {\n\t\tnum_servers++;\n\t}\n\tdebug(LOG_DEBUG, \"Level %d: Calculated %d auth servers in list\", level, num_servers);\n\n\tif (level > num_servers) {\n\t\t/*\n\t\t * We've called ourselves too many times\n\t\t * This means we've cycled through all the servers in the server list\n\t\t * at least once and none are accessible\n\t\t */\n\t\treturn (-1);\n\t}\n\n\t/*\n\t * Let's resolve the hostname of the top server to an IP address\n\t */\n\tauth_server = config->auth_servers;\n\thostname = auth_server->authserv_hostname;\n\tdebug(LOG_DEBUG, \"Level %d: Resolving auth server [%s]\", level, hostname);\n\th_addr = wd_gethostbyname(hostname);\n\tif (!h_addr) {\n\t\t/*\n\t\t * DNS resolving it failed\n\t\t *\n\t\t * Can we resolve any of the popular servers ?\n\t\t */\n\t\tdebug(LOG_DEBUG, \"Level %d: Resolving auth server [%s] failed\", level, hostname);\n\n\t\tfor (popularserver = popular_servers; *popularserver; popularserver++) {\n\t\t\tdebug(LOG_DEBUG, \"Level %d: Resolving popular server [%s]\", level, *popularserver);\n\t\t\th_addr = wd_gethostbyname(*popularserver);\n\t\t\tif (h_addr) {\n\t\t\t\tdebug(LOG_DEBUG, \"Level %d: Resolving popular server [%s] succeeded = [%s]\", level, *popularserver, inet_ntoa(*h_addr));\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\telse {\n\t\t\t\tdebug(LOG_DEBUG, \"Level %d: Resolving popular server [%s] failed\", level, *popularserver);\n\t\t\t}\n\t\t}\n\n\t\t/* \n\t\t * If we got any h_addr buffer for one of the popular servers, in other\n\t\t * words, if one of the popular servers resolved, we'll assume the DNS\n\t\t * works, otherwise we'll deal with net connection or DNS failure.\n\t\t */\n\t\tif (h_addr) {\n\t\t\tfree (h_addr);\n\t\t\t/*\n\t\t\t * Yes\n\t\t\t *\n\t\t\t * The auth server's DNS server is probably dead. Try the next auth server\n\t\t\t */\n\t\t\tdebug(LOG_DEBUG, \"Level %d: Marking auth server [%s] as bad and trying next if possible\", level, hostname);\n\t\t\tif (auth_server->last_ip) {\n\t\t\t\tfree(auth_server->last_ip);\n\t\t\t\tauth_server->last_ip = NULL;\n\t\t\t}\n\t\t\tmark_auth_server_bad(auth_server);\n\t\t\treturn _connect_auth_server(level);\n\t\t}\n\t\telse {\n\t\t\t/*\n\t\t\t * No\n\t\t\t *\n\t\t\t * It's probably safe to assume that the internet connection is malfunctioning\n\t\t\t * and nothing we can do will make it work\n\t\t\t */\n\t\t\tmark_offline();\n\t\t\tdebug(LOG_DEBUG, \"Level %d: Failed to resolve auth server and all popular servers. \"\n\t\t\t\t\t\"The internet connection is probably down\", level);\n\t\t\treturn(-1);\n\t\t}\n\t}\n\telse {\n\t\t/*\n\t\t * DNS resolving was successful\n\t\t */\n\t\tip = safe_strdup(inet_ntoa(*h_addr));\n\t\tdebug(LOG_DEBUG, \"Level %d: Resolving auth server [%s] succeeded = [%s]\", level, hostname, ip);\n\n\t\tif (!auth_server->last_ip || strcmp(auth_server->last_ip, ip) != 0) {\n\t\t\t/*\n\t\t\t * But the IP address is different from the last one we knew\n\t\t\t * Update it\n\t\t\t */\n\t\t\tdebug(LOG_DEBUG, \"Level %d: Updating last_ip IP of server [%s] to [%s]\", level, hostname, ip);\n\t\t\tif (auth_server->last_ip) free(auth_server->last_ip);\n\t\t\tauth_server->last_ip = ip;\n\n\t\t\t/* Update firewall rules */\n\t\t\tfw_clear_authservers();\n\t\t\tfw_set_authservers();\n\t\t}\n\t\telse {\n\t\t\t/*\n\t\t\t * IP is the same as last time\n\t\t\t */\n\t\t\tfree(ip);\n\t\t}\n\n\t\t/*\n\t\t * Connect to it\n\t\t */\n\t\tdebug(LOG_DEBUG, \"Level %d: Connecting to auth server %s:%d\", level, hostname, auth_server->authserv_http_port);\n\t\ttheir_addr.sin_family = AF_INET;\n\t\ttheir_addr.sin_port = htons(auth_server->authserv_http_port);\n\t\ttheir_addr.sin_addr = *h_addr;\n\t\tmemset(&(their_addr.sin_zero), '\\0', sizeof(their_addr.sin_zero));\n\t\tfree (h_addr);\n\n\t\tif ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) == -1) {\n\t\t\tdebug(LOG_ERR, \"Level %d: Failed to create a new SOCK_STREAM socket: %s\", strerror(errno));\n\t\t\treturn(-1);\n\t\t}\n\n\t\tif (connect(sockfd, (struct sockaddr *)&their_addr, sizeof(struct sockaddr)) == -1) {\n\t\t\t/*\n\t\t\t * Failed to connect\n\t\t\t * Mark the server as bad and try the next one\n\t\t\t */\n\t\t\tdebug(LOG_DEBUG, \"Level %d: Failed to connect to auth server %s:%d (%s). Marking it as bad and trying next if possible\", level, hostname, auth_server->authserv_http_port, strerror(errno));\n\t\t\tclose(sockfd);\n\t\t\tmark_auth_server_bad(auth_server);\n\t\t\treturn _connect_auth_server(level); /* Yay recursion! */\n\t\t}\n\t\telse {\n\t\t\t/*\n\t\t\t * We have successfully connected\n\t\t\t */\n\t\t\tdebug(LOG_DEBUG, \"Level %d: Successfully connected to auth server %s:%d\", level, hostname, auth_server->authserv_http_port);\n\t\t\treturn sockfd;\n\t\t}\n\t}\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/centralserver.h",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file centralserver.h\n    @brief Functions to talk to the central server (auth/send stats/get rules/etc...)\n    @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n */\n\n#ifndef _CENTRALSERVER_H_\n#define _CENTRALSERVER_H_\n\n#include \"auth.h\"\n\n/** @brief Ask the central server to login a client */\n#define REQUEST_TYPE_LOGIN     \"login\"\n/** @brief Notify the the central server of a client logout */\n#define REQUEST_TYPE_LOGOUT    \"logout\"\n#define REQUEST_TYPE_LOGOUT2    \"logout2\"\t/* added by Wiwiz */\n/** @brief Update the central server's traffic counters */\n#define REQUEST_TYPE_COUNTERS  \"counters\"\n\n/** @brief Sent when the user's token is denied by the central server */\n#define GATEWAY_MESSAGE_DENIED     \"denied\"\n/** @brief Sent when the user's token is accepted, but user is on probation  */\n#define GATEWAY_MESSAGE_ACTIVATE_ACCOUNT     \"activate\"\n/** @brief  Sent when the user's token is denied by the central server because the probation period is over */\n#define GATEWAY_MESSAGE_ACCOUNT_VALIDATION_FAILED     \"failed_validation\"\n/** @brief Sent after the user performed a manual log-out on the gateway  */\n#define GATEWAY_MESSAGE_ACCOUNT_LOGGED_OUT     \"logged-out\"\n\nvoid batchAuth(t_authresponse *authresponse, const char *mac, const char *token);\t/* added by wiwiz */\n\n/** @brief Initiates a transaction with the auth server */\nt_authcode auth_server_request(t_authresponse *authresponse,\n\t\t\tconst char *request_type,\n\t\t\tconst char *ip,\n\t\t\tconst char *mac,\n\t\t\tconst char *token,\n\t\t\tunsigned long long int incoming,\n\t\t\tunsigned long long int outgoing);\n\n/** @brief Tries really hard to connect to an auth server.  Returns a connected file descriptor or -1 on error */\nint connect_auth_server();\n\n/** @brief Helper function called by connect_auth_server() to do the actual work including recursion - DO NOT CALL DIRECTLY */\nint _connect_auth_server(int level);\n\n#endif /* _CENTRALSERVER_H_ */\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/client_list.c",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n \\********************************************************************/\n\n/*\n * $Id$\n */\n/** @file client_list.c\n  @brief Client List Functions\n  @author Copyright (C) 2004 Alexandre Carmel-Veillex <acv@acv.ca>\n */\n\n#define _GNU_SOURCE\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <syslog.h>\n#include <errno.h>\n#include <pthread.h>\n#include <sys/wait.h>\n#include <sys/types.h>\n/* #include <sys/unistd.h> by Wiwiz */\n\n#include <string.h>\n\n#include \"safe.h\"\n#include \"debug.h\"\n#include \"conf.h\"\n#include \"client_list.h\"\n\n/** Global mutex to protect access to the client list */\npthread_mutex_t client_list_mutex = PTHREAD_MUTEX_INITIALIZER;\n\n/** @internal\n * Holds a pointer to the first element of the list \n */ \nt_client         *firstclient = NULL;\n\n/** Get the first element of the list of connected clients\n */\nt_client *\nclient_get_first_client(void)\n{\n    return firstclient;\n}\n\n/**\n * Initializes the list of connected clients (client)\n */\nvoid\nclient_list_init(void)\n{\n    firstclient = NULL;\n}\n\n/** Based on the parameters it receives, this function creates a new entry\n * in the connections list. All the memory allocation is done here.\n * @param ip IP address\n * @param mac MAC address\n * @param token Token\n * @return Pointer to the client we just created\n */\nt_client         *\nclient_list_append(const char *ip, const char *mac, const char *token)\n{\n    t_client         *curclient, *prevclient;\n\n    prevclient = NULL;\n    curclient = firstclient;\n\n    while (curclient != NULL) {\n        prevclient = curclient;\n        curclient = curclient->next;\n    }\n\n    curclient = safe_malloc(sizeof(t_client));\n    memset(curclient, 0, sizeof(t_client));\n\n    curclient->ip = safe_strdup(ip);\n    curclient->mac = safe_strdup(mac);\n    curclient->token = safe_strdup(token);\n    curclient->counters.incoming = curclient->counters.incoming_history = curclient->counters.outgoing = curclient->counters.outgoing_history = 0;\n    curclient->counters.last_updated = time(NULL);\n\n    if (prevclient == NULL) {\n        firstclient = curclient;\n    } else {\n        prevclient->next = curclient;\n    }\n\n    debug(LOG_INFO, \"Added a new client to linked list: IP: %s Token: %s\",\n          ip, token);\n\n    return curclient;\n}\n\n/** Finds a  client by its IP and MAC, returns NULL if the client could not\n * be found\n * @param ip IP we are looking for in the linked list\n * @param mac MAC we are looking for in the linked list\n * @return Pointer to the client, or NULL if not found\n */\nt_client         *\nclient_list_find(const char *ip, const char *mac)\n{\n    t_client         *ptr;\n\n    ptr = firstclient;\n    while (NULL != ptr) {\n        if (0 == strcmp(ptr->ip, ip) && 0 == strcmp(ptr->mac, mac))\n            return ptr;\n        ptr = ptr->next;\n    }\n\n    return NULL;\n}\n\n/**\n * Finds a  client by its IP, returns NULL if the client could not\n * be found\n * @param ip IP we are looking for in the linked list\n * @return Pointer to the client, or NULL if not found\n */\nt_client         *\nclient_list_find_by_ip(const char *ip)\n{\n    t_client         *ptr;\n\n    ptr = firstclient;\n    while (NULL != ptr) {\n        if (0 == strcmp(ptr->ip, ip))\n            return ptr;\n        ptr = ptr->next;\n    }\n\n    return NULL;\n}\n\n/**\n * Finds a  client by its Mac, returns NULL if the client could not\n * be found\n * @param mac Mac we are looking for in the linked list\n * @return Pointer to the client, or NULL if not found\n */\nt_client         *\nclient_list_find_by_mac(const char *mac)\n{\n    t_client         *ptr;\n\n    ptr = firstclient;\n    while (NULL != ptr) {\n        if (0 == strcmp(ptr->mac, mac))\n            return ptr;\n        ptr = ptr->next;\n    }\n\n    return NULL;\n}\n\n/** Finds a client by its token\n * @param token Token we are looking for in the linked list\n * @return Pointer to the client, or NULL if not found\n */\nt_client *\nclient_list_find_by_token(const char *token)\n{\n    t_client         *ptr;\n\n    ptr = firstclient;\n    while (NULL != ptr) {\n        if (0 == strcmp(ptr->token, token))\n            return ptr;\n        ptr = ptr->next;\n    }\n\n    return NULL;\n}\n\n/** @internal\n * @brief Frees the memory used by a t_client structure\n * This function frees the memory used by the t_client structure in the\n * proper order.\n * @param client Points to the client to be freed\n */\nvoid\n_client_list_free_node(t_client * client)\n{\n\n    if (client->mac != NULL)\n        free(client->mac);\n\n    if (client->ip != NULL)\n        free(client->ip);\n\n    if (client->token != NULL)\n        free(client->token);\n\n    free(client);\n}\n\n/**\n * @brief Deletes a client from the connections list\n *\n * Removes the specified client from the connections list and then calls\n * the function to free the memory used by the client.\n * @param client Points to the client to be deleted\n */\nvoid\nclient_list_delete(t_client * client)\n{\n    t_client         *ptr;\n\n    ptr = firstclient;\n\n    if (ptr == NULL) {\n        debug(LOG_ERR, \"Node list empty!\");\n    } else if (ptr == client) {\n        firstclient = ptr->next;\n        _client_list_free_node(client);\n    } else {\n        /* Loop forward until we reach our point in the list. */\n        while (ptr->next != NULL && ptr->next != client) {\n            ptr = ptr->next;\n        }\n        /* If we reach the end before finding out element, complain. */\n        if (ptr->next == NULL) {\n            debug(LOG_ERR, \"Node to delete could not be found.\");\n        /* Free element. */\n        } else {\n            ptr->next = client->next;\n            _client_list_free_node(client);\n        }\n    }\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/client_list.h",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file client_list.h\n    @brief Client List functions\n    @author Copyright (C) 2004 Alexandre Carmel-Veilleux <acv@acv.ca>\n*/\n\n#ifndef _CLIENT_LIST_H_\n#define _CLIENT_LIST_H_\n\n/** Counters struct for a client's bandwidth usage (in bytes)\n */\ntypedef struct _t_counters {\n    unsigned long long\tincoming;\t/**< @brief Incoming data total*/\n    unsigned long long\toutgoing;\t/**< @brief Outgoing data total*/\n    unsigned long long\tincoming_history;\t/**< @brief Incoming data before wifidog restarted*/\n    unsigned long long\toutgoing_history;\t/**< @brief Outgoing data before wifidog restarted*/\n    time_t\tlast_updated;\t/**< @brief Last update of the counters */\n} t_counters;\n\n/** Client node for the connected client linked list.\n */\ntypedef struct\t_t_client {\n  struct\t_t_client *next;        /**< @brief Pointer to the next client */\n\tchar\t*ip;\t\t\t/**< @brief Client Ip address */\n\tchar\t*mac;\t\t\t/**< @brief Client Mac address */\n\tchar\t*token;\t\t\t/**< @brief Client token */\n\tunsigned int fw_connection_state; /**< @brief Connection state in the\n\t\t\t\t\t\t     firewall */\n\tint\tfd;\t\t\t/**< @brief Client HTTP socket (valid only\n\t\t\t\t\t     during login before one of the\n\t\t\t\t\t     _http_* function is called */\n\tt_counters\tcounters;\t/**< @brief Counters for input/output of\n\t\t\t\t\t     the client. */\n} t_client;\n\n/** @brief Get the first element of the list of connected clients\n */\nt_client *client_get_first_client(void);\n\n/** @brief Initializes the client list */\nvoid client_list_init(void);\n\n/** @brief Adds a new client to the connections list */\nt_client *client_list_append(const char *ip, const char *mac, const char *token);\n\n/** @brief Finds a client by its IP and MAC */\nt_client *client_list_find(const char *ip, const char *mac);\n\n/** @brief Finds a client only by its IP */\nt_client *client_list_find_by_ip(const char *ip); /* needed by fw_iptables.c, auth.c \n\t\t\t\t\t     * and wdctl_thread.c */\n\n/** @brief Finds a client only by its Mac */\nt_client *client_list_find_by_mac(const char *mac); /* needed by wdctl_thread.c */\n\n/** @brief Finds a client by its token */\nt_client *client_list_find_by_token(const char *token);\n\n/** @brief Deletes a client from the connections list */\nvoid client_list_delete(t_client *client);\n\n#define LOCK_CLIENT_LIST() do { \\\n\tdebug(LOG_DEBUG, \"Locking client list\"); \\\n\tpthread_mutex_lock(&client_list_mutex); \\\n\tdebug(LOG_DEBUG, \"Client list locked\"); \\\n} while (0)\n\n#define UNLOCK_CLIENT_LIST() do { \\\n\tdebug(LOG_DEBUG, \"Unlocking client list\"); \\\n\tpthread_mutex_unlock(&client_list_mutex); \\\n\tdebug(LOG_DEBUG, \"Client list unlocked\"); \\\n} while (0)\n\n#endif /* _CLIENT_LIST_H_ */\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/commandline.c",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file commandline.c\n    @brief Command line argument handling\n    @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n*/\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <unistd.h>\n#include <string.h>\n#include <syslog.h>\n\n#include \"debug.h\"\n#include \"safe.h\"\n#include \"conf.h\"\n\n#include \"../config.h\"\n\n/*\n * Holds an argv that could be passed to exec*() if we restart ourselves\n */\nchar ** restartargv = NULL;\n\nstatic void usage(void);\n\n/*\n * A flag to denote whether we were restarted via a parent wifidog, or started normally\n * 0 means normally, otherwise it will be populated by the PID of the parent\n */\npid_t restart_orig_pid = 0;\n\n/** @internal\n * @brief Print usage\n *\n * Prints usage, called when wifidog is run with -h or with an unknown option\n */\nstatic void\nusage(void)\n{\n    printf(\"Usage: wifidog [options]\\n\");\n    printf(\"\\n\");\n    printf(\"  -c [filename] Use this config file\\n\");\n    printf(\"  -f            Run in foreground\\n\");\n    printf(\"  -d <level>    Debug level\\n\");\n    printf(\"  -s            Log to syslog\\n\");\n    printf(\"  -w <path>     Wdctl socket path\\n\");\n    printf(\"  -h            Print usage\\n\");\n    printf(\"  -v            Print version information\\n\");\n    printf(\"  -x pid        Used internally by WiFiDog when re-starting itself *DO NOT ISSUE THIS SWITCH MANUAlLY*\\n\");\n    printf(\"  -i <path>     Internal socket path used when re-starting self\\n\");\n    printf(\"  Wiwiz Patched Version 1\\n\");\t/* wiwiz */\n    printf(\"\\n\");\n}\n\n/** Uses getopt() to parse the command line and set configuration values\n * also populates restartargv\n */\nvoid parse_commandline(int argc, char **argv) {\n    int c;\n\t int skiponrestart;\n\t int i;\n\n    s_config *config = config_get_config();\n\n\t//MAGIC 3: Our own -x, the pid, and NULL :\n\trestartargv = safe_malloc((argc + 3) * sizeof(char*));\n\ti=0;\n\trestartargv[i++] = safe_strdup(argv[0]);\n\n    while (-1 != (c = getopt(argc, argv, \"c:hfd:sw:vx:i:\"))) {\n\n\t\tskiponrestart = 0;\n\n\t\tswitch(c) {\n\n\t\t\tcase 'h':\n\t\t\t\tusage();\n\t\t\t\texit(1);\n\t\t\t\tbreak;\n\n\t\t\tcase 'c':\n\t\t\t\tif (optarg) {\n\t\t\t\t\tstrncpy(config->configfile, optarg, sizeof(config->configfile));\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'w':\n\t\t\t\tif (optarg) {\n\t\t\t\t\tfree(config->wdctl_sock);\n\t\t\t\t\tconfig->wdctl_sock = safe_strdup(optarg);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'f':\n\t\t\t\tskiponrestart = 1;\n\t\t\t\tconfig->daemon = 0;\n\t\t\t\tbreak;\n\n\t\t\tcase 'd':\n\t\t\t\tif (optarg) {\n\t\t\t\t\tconfig->debuglevel = atoi(optarg);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 's':\n\t\t\t\tconfig->log_syslog = 1;\n\t\t\t\tbreak;\n\n\t\t\tcase 'v':\n\t\t\t\tprintf(\"This is WiFiDog version \" VERSION \"-wiwiz\\n\");\n\t\t\t\texit(1);\n\t\t\t\tbreak;\n\n\t\t\tcase 'x':\n\t\t\t\tskiponrestart = 1;\n\t\t\t\tif (optarg) {\n\t\t\t\t\trestart_orig_pid = atoi(optarg);\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tprintf(\"The expected PID to the -x switch was not supplied!\");\n\t\t\t\t\texit(1);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tcase 'i':\n\t\t\t\tif (optarg) {\n\t\t\t\t\tfree(config->internal_sock);\n\t\t\t\t\tconfig->internal_sock = safe_strdup(optarg);\n\t\t\t\t}\n\t\t\t\tbreak;\n\n\t\t\tdefault:\n\t\t\t\tusage();\n\t\t\t\texit(1);\n\t\t\t\tbreak;\n\n\t\t}\n\n\t\tif (!skiponrestart) {\n\t\t\t/* Add it to restartargv */\n\t\t\tsafe_asprintf(&(restartargv[i++]), \"-%c\", c);\n\t\t\tif (optarg) {\n\t\t\t\trestartargv[i++] = safe_strdup(optarg);\n\t\t\t}\n\t\t}\n\n\t}\n\n\t/* Finally, we should add  the -x, pid and NULL to restartargv\n\t * HOWEVER we cannot do it here, since this is called before we fork to background\n\t * so we'll leave this job to gateway.c after forking is completed\n\t * so that the correct PID is assigned\n\t *\n\t * We add 3 nulls, and the first 2 will be overridden later\n\t */\n\trestartargv[i++] = NULL;\n\trestartargv[i++] = NULL;\n\trestartargv[i++] = NULL;\n\n}\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/commandline.h",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file commandline.h\n    @brief Command line argument handling\n    @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n*/\n\n#ifndef _COMMANDLINE_H_\n#define _COMMANDLINE_H_\n\n/** @brief Parses the command line and set the config accordingly */\nvoid parse_commandline(int, char**);\n\n#endif /* _COMMANDLINE_H_ */\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/common.h",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file common.h\n    @brief Common constants and other bits\n    @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n*/\n\n#ifndef _COMMON_H_\n#define _COMMON_H_\n\n/** @brief Read buffer for socket read? */\n#define MAX_BUF 4096\n\n#endif /* _COMMON_H_ */\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/conf.c",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n \\********************************************************************/\n\n/* $Id$ */\n/** @file conf.c\n  @brief Config file parsing\n  @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n  @author Copyright (C) 2007 Benoit Grégoire, Technologies Coeus inc.\n */\n\n#define _GNU_SOURCE\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <syslog.h>\n\n#include <pthread.h>\n\n#include <string.h>\n#include <ctype.h>\n\n#include \"common.h\"\n#include \"safe.h\"\n#include \"debug.h\"\n#include \"conf.h\"\n#include \"http.h\"\n#include \"auth.h\"\n#include \"firewall.h\"\n\n#include \"util.h\"\n\n/** @internal\n * Holds the current configuration of the gateway */\nstatic s_config config;\n\n/**\n * Mutex for the configuration file, used by the auth_servers related\n * functions. */\npthread_mutex_t config_mutex = PTHREAD_MUTEX_INITIALIZER;\n\n/** @internal\n * A flag.  If set to 1, there are missing or empty mandatory parameters in the config\n */\nstatic int missing_parms;\n\n/** @internal\n The different configuration options */\ntypedef enum {\n\toBadOption,\n\toDaemon,\n\toDebugLevel,\n\toExternalInterface,\n\toGatewayID,\n\toGatewayInterface,\n\toGatewayInterfaceMac,\t/*wiwiz added*/\n\toGatewayAddress,\n\toGatewayPort,\n\toAuthServer,\n\toAuthServHostname,\n\toAuthServSSLAvailable,\n\toAuthServSSLPort,\n\toAuthServHTTPPort,\n\toAuthServPath,\n\toAuthServLoginScriptPathFragment,\n\toAuthServPortalScriptPathFragment,\n\toAuthServMsgScriptPathFragment,\n\toAuthServPingScriptPathFragment,\n\toAuthServAuthScriptPathFragment,\n\toHTTPDMaxConn,\n\toHTTPDName,\n\toHTTPDRealm,\n        oHTTPDUsername,\n        oHTTPDPassword,\n\toClientTimeout,\n\toCheckInterval,\n\toWdctlSocket,\n\toSyslogFacility,\n\toFirewallRule,\n\toFirewallRuleSet,\n\toTrustedMACList,\n        oHtmlMessageFile,\n\toProxyPort,\n} OpCodes;\n\n/** @internal\n The config file keywords for the different configuration options */\nstatic const struct {\n\tconst char *name;\n\tOpCodes opcode;\n} keywords[] = {\n\t{ \"daemon\",             \toDaemon },\n\t{ \"debuglevel\",         \toDebugLevel },\n\t{ \"externalinterface\",  \toExternalInterface },\n\t{ \"gatewayid\",          \toGatewayID },\n\t{ \"gatewayinterface\",   \toGatewayInterface },\n\t{ \"gatewayinterfacemac\",   \toGatewayInterfaceMac },\t/*wiwiz added*/\n\t{ \"gatewayaddress\",     \toGatewayAddress },\n\t{ \"gatewayport\",        \toGatewayPort },\n\t{ \"authserver\",         \toAuthServer },\n\t{ \"httpdmaxconn\",       \toHTTPDMaxConn },\n\t{ \"httpdname\",          \toHTTPDName },\n\t{ \"httpdrealm\",\t\t\toHTTPDRealm },\n\t{ \"httpdusername\",\t\toHTTPDUsername },\n\t{ \"httpdpassword\",\t\toHTTPDPassword },\n\t{ \"clienttimeout\",      \toClientTimeout },\n\t{ \"checkinterval\",      \toCheckInterval },\n\t{ \"syslogfacility\", \t\toSyslogFacility },\n\t{ \"wdctlsocket\",\t\toWdctlSocket },\n\t{ \"hostname\",\t\t\toAuthServHostname },\n\t{ \"sslavailable\",\t\toAuthServSSLAvailable },\n\t{ \"sslport\",\t\t\toAuthServSSLPort },\n\t{ \"httpport\",\t\t\toAuthServHTTPPort },\n\t{ \"path\",\t\t\toAuthServPath },\n\t{ \"loginscriptpathfragment\",\toAuthServLoginScriptPathFragment },\n\t{ \"portalscriptpathfragment\",\toAuthServPortalScriptPathFragment },\n\t{ \"msgscriptpathfragment\",\toAuthServMsgScriptPathFragment },\n\t{ \"pingscriptpathfragment\",\toAuthServPingScriptPathFragment },\n\t{ \"authscriptpathfragment\",\toAuthServAuthScriptPathFragment },\n\t{ \"firewallruleset\",\t\toFirewallRuleSet },\n\t{ \"firewallrule\",\t\toFirewallRule },\n\t{ \"trustedmaclist\",\t\toTrustedMACList },\n        { \"htmlmessagefile\",\t\toHtmlMessageFile },\n\t{ \"proxyport\",\t\t\toProxyPort },\n\t{ NULL,\t\t\t\toBadOption },\n};\n\nstatic void config_notnull(const void *parm, const char *parmname);\nstatic int parse_boolean_value(char *);\nstatic void parse_auth_server(FILE *, const char *, int *);\nstatic int _parse_firewall_rule(const char *ruleset, char *leftover);\nstatic void parse_firewall_ruleset(const char *, FILE *, const char *, int *);\n\nstatic OpCodes config_parse_token(const char *cp, const char *filename, int linenum);\n\n/** Accessor for the current gateway configuration\n@return:  A pointer to the current config.  The pointer isn't opaque, but should be treated as READ-ONLY\n */\ns_config *\nconfig_get_config(void)\n{\n    return &config;\n}\n\n/** Sets the default config parameters and initialises the configuration system */\nvoid\nconfig_init(void)\n{\n\tdebug(LOG_DEBUG, \"Setting default config parameters\");\n\tstrncpy(config.configfile, DEFAULT_CONFIGFILE, sizeof(config.configfile));\n\tconfig.htmlmsgfile = safe_strdup(DEFAULT_HTMLMSGFILE);\n\tconfig.debuglevel = DEFAULT_DEBUGLEVEL;\n\tconfig.httpdmaxconn = DEFAULT_HTTPDMAXCONN;\n\tconfig.external_interface = NULL;\n\tconfig.gw_id = DEFAULT_GATEWAYID;\n\tconfig.gw_interface = NULL;\n\tconfig.gw_interface_mac = NULL;\t/* wiwiz added */\n\tconfig.gw_address = NULL;\n\tconfig.gw_port = DEFAULT_GATEWAYPORT;\n\tconfig.auth_servers = NULL;\n\tconfig.httpdname = NULL;\n\tconfig.httpdrealm = DEFAULT_HTTPDNAME;\n\tconfig.httpdusername = NULL;\n\tconfig.httpdpassword = NULL;\n\tconfig.clienttimeout = DEFAULT_CLIENTTIMEOUT;\n\tconfig.checkinterval = DEFAULT_CHECKINTERVAL;\n\tconfig.syslog_facility = DEFAULT_SYSLOG_FACILITY;\n\tconfig.daemon = -1;\n\tconfig.log_syslog = DEFAULT_LOG_SYSLOG;\n\tconfig.wdctl_sock = safe_strdup(DEFAULT_WDCTL_SOCK);\n\tconfig.internal_sock = safe_strdup(DEFAULT_INTERNAL_SOCK);\n\tconfig.rulesets = NULL;\n\tconfig.trustedmaclist = NULL;\n\tconfig.proxy_port = 0;\n}\n\n/**\n * If the command-line didn't provide a config, use the default.\n */\nvoid\nconfig_init_override(void)\n{\n    if (config.daemon == -1) config.daemon = DEFAULT_DAEMON;\n}\n\n/** @internal\nParses a single token from the config file\n*/\nstatic OpCodes\nconfig_parse_token(const char *cp, const char *filename, int linenum)\n{\n\tint i;\n\n\tfor (i = 0; keywords[i].name; i++)\n\t\tif (strcasecmp(cp, keywords[i].name) == 0)\n\t\t\treturn keywords[i].opcode;\n\n\tdebug(LOG_ERR, \"%s: line %d: Bad configuration option: %s\", \n\t\t\tfilename, linenum, cp);\n\treturn oBadOption;\n}\n\n/** @internal\nParses auth server information\n*/\nstatic void\nparse_auth_server(FILE *file, const char *filename, int *linenum)\n{\n\tchar\t\t*host = NULL,\n\t\t\t*path = NULL,\n\t\t\t*loginscriptpathfragment = NULL,\n\t\t\t*portalscriptpathfragment = NULL,\n\t\t\t*msgscriptpathfragment = NULL,\n\t\t\t*pingscriptpathfragment = NULL,\n\t\t\t*authscriptpathfragment = NULL,\n\t\t\tline[MAX_BUF],\n\t\t\t*p1,\n\t\t\t*p2;\n\tint\t\thttp_port,\n\t\t\tssl_port,\n\t\t\tssl_available,\n\t\t\topcode;\n\tt_auth_serv\t*new,\n\t\t\t*tmp;\n\n\t/* Defaults */\n\tpath = safe_strdup(DEFAULT_AUTHSERVPATH);\n\tloginscriptpathfragment = safe_strdup(DEFAULT_AUTHSERVLOGINPATHFRAGMENT);\n\tportalscriptpathfragment = safe_strdup(DEFAULT_AUTHSERVPORTALPATHFRAGMENT);\n\tmsgscriptpathfragment = safe_strdup(DEFAULT_AUTHSERVMSGPATHFRAGMENT);\n\tpingscriptpathfragment = safe_strdup(DEFAULT_AUTHSERVPINGPATHFRAGMENT);\n\tauthscriptpathfragment = safe_strdup(DEFAULT_AUTHSERVAUTHPATHFRAGMENT);\n\thttp_port = DEFAULT_AUTHSERVPORT;\n\tssl_port = DEFAULT_AUTHSERVSSLPORT;\n\tssl_available = DEFAULT_AUTHSERVSSLAVAILABLE;\n\n\n\t/* Parsing loop */\n\twhile (memset(line, 0, MAX_BUF) && fgets(line, MAX_BUF - 1, file) && (strchr(line, '}') == NULL)) {\n\t\t(*linenum)++; /* increment line counter. */\n\n\t\t/* skip leading blank spaces */\n\t\tfor (p1 = line; isblank(*p1); p1++);\n\n\t\t/* End at end of line */\n\t\tif ((p2 = strchr(p1, '#')) != NULL) {\n\t\t\t*p2 = '\\0';\n\t\t} else if ((p2 = strchr(p1, '\\r')) != NULL) {\n\t\t\t*p2 = '\\0';\n\t\t} else if ((p2 = strchr(p1, '\\n')) != NULL) {\n\t\t\t*p2 = '\\0';\n\t\t}\n\n\t\t/* next, we coopt the parsing of the regular config */\n\t\tif (strlen(p1) > 0) {\n\t\t\tp2 = p1;\n\t\t\t/* keep going until word boundary is found. */\n\t\t\twhile ((*p2 != '\\0') && (!isblank(*p2)))\n\t\t\t\tp2++;\n\n\t\t\t/* Terminate first word. */\n\t\t\t*p2 = '\\0';\n\t\t\tp2++;\n\n\t\t\t/* skip all further blanks. */\n\t\t\twhile (isblank(*p2))\n\t\t\t\tp2++;\n\t\t\t\n\t\t\t/* Get opcode */\n\t\t\topcode = config_parse_token(p1, filename, *linenum);\n\t\t\t\n\t\t\tswitch (opcode) {\n\t\t\t\tcase oAuthServHostname:\n\t\t\t\t\thost = safe_strdup(p2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oAuthServPath:\n\t\t\t\t\tfree(path);\n\t\t\t\t\tpath = safe_strdup(p2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oAuthServLoginScriptPathFragment:\n\t\t\t\t\tfree(loginscriptpathfragment);\n\t\t\t\t\tloginscriptpathfragment = safe_strdup(p2);\n\t\t\t\t\tbreak;\t\t\t\t\t\n\t\t\t\tcase oAuthServPortalScriptPathFragment:\n\t\t\t\t\tfree(portalscriptpathfragment);\n\t\t\t\t\tportalscriptpathfragment = safe_strdup(p2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oAuthServMsgScriptPathFragment:\n\t\t\t\t\tfree(msgscriptpathfragment);\n\t\t\t\t\tmsgscriptpathfragment = safe_strdup(p2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oAuthServPingScriptPathFragment:\n\t\t\t\t\tfree(pingscriptpathfragment);\n\t\t\t\t\tpingscriptpathfragment = safe_strdup(p2);\n\t\t\t\t\tbreak;\t\t\t\t\t\n\t\t\t\tcase oAuthServAuthScriptPathFragment:\n\t\t\t\t\tfree(authscriptpathfragment);\n\t\t\t\t\tauthscriptpathfragment = safe_strdup(p2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oAuthServSSLPort:\n\t\t\t\t\tssl_port = atoi(p2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oAuthServHTTPPort:\n\t\t\t\t\thttp_port = atoi(p2);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oAuthServSSLAvailable:\n\t\t\t\t\tssl_available = parse_boolean_value(p2);\n\t\t\t\t\tif (ssl_available < 0)\n\t\t\t\t\t\tssl_available = 0;\n\t\t\t\t\tbreak;\n\t\t\t\tcase oBadOption:\n\t\t\t\tdefault:\n\t\t\t\t\tdebug(LOG_ERR, \"Bad option on line %d \"\n\t\t\t\t\t\t\t\"in %s.\", *linenum,\n\t\t\t\t\t\t\tfilename);\n\t\t\t\t\tdebug(LOG_ERR, \"Exiting...\");\n\t\t\t\t\texit(-1);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\t/* only proceed if we have an host and a path */\n\tif (host == NULL)\n\t\treturn;\n\t\n\tdebug(LOG_DEBUG, \"Adding %s:%d (SSL: %d) %s to the auth server list\",\n\t\t\thost, http_port, ssl_port, path);\n\n\t/* Allocate memory */\n\tnew = safe_malloc(sizeof(t_auth_serv));\n\t\n\t/* Fill in struct */\n\tmemset(new, 0, sizeof(t_auth_serv)); /*< Fill all with NULL */\n\tnew->authserv_hostname = host;\n\tnew->authserv_use_ssl = ssl_available;\n\tnew->authserv_path = path;\n\tnew->authserv_login_script_path_fragment = loginscriptpathfragment;\n\tnew->authserv_portal_script_path_fragment = portalscriptpathfragment;\n\tnew->authserv_msg_script_path_fragment = msgscriptpathfragment;    \n\tnew->authserv_ping_script_path_fragment = pingscriptpathfragment;  \n\tnew->authserv_auth_script_path_fragment = authscriptpathfragment;  \n\tnew->authserv_http_port = http_port;\n\tnew->authserv_ssl_port = ssl_port;\n\t\n\t/* If it's the first, add to config, else append to last server */\n\tif (config.auth_servers == NULL) {\n\t\tconfig.auth_servers = new;\n\t} else {\n\t\tfor (tmp = config.auth_servers; tmp->next != NULL;\n\t\t\t\ttmp = tmp->next);\n\t\ttmp->next = new;\n\t}\n\t\n\tdebug(LOG_DEBUG, \"Auth server added\");\n}\n\n/**\nAdvance to the next word\n@param s string to parse, this is the next_word pointer, the value of s\n\t when the macro is called is the current word, after the macro\n\t completes, s contains the beginning of the NEXT word, so you\n\t need to save s to something else before doing TO_NEXT_WORD\n@param e should be 0 when calling TO_NEXT_WORD(), it'll be changed to 1\n\t if the end of the string is reached.\n*/\n#define TO_NEXT_WORD(s, e) do { \\\n\twhile (*s != '\\0' && !isblank(*s)) { \\\n\t\ts++; \\\n\t} \\\n\tif (*s != '\\0') { \\\n\t\t*s = '\\0'; \\\n\t\ts++; \\\n\t\twhile (isblank(*s)) \\\n\t\t\ts++; \\\n\t} else { \\\n\t\te = 1; \\\n\t} \\\n} while (0)\n\n/** @internal\nParses firewall rule set information\n*/\nstatic void\nparse_firewall_ruleset(const char *ruleset, FILE *file, const char *filename, int *linenum)\n{\n\tchar\t\tline[MAX_BUF],\n\t\t\t*p1,\n\t\t\t*p2;\n\tint\t\topcode;\n\n\tdebug(LOG_DEBUG, \"Adding Firewall Rule Set %s\", ruleset);\n\n\t/* Parsing loop */\n\twhile (memset(line, 0, MAX_BUF) && fgets(line, MAX_BUF - 1, file) && (strchr(line, '}') == NULL)) {\n\t\t(*linenum)++; /* increment line counter. */\n\n\t\t/* skip leading blank spaces */\n\t\tfor (p1 = line; isblank(*p1); p1++);\n\n\t\t/* End at end of line */\n\t\tif ((p2 = strchr(p1, '#')) != NULL) {\n\t\t\t*p2 = '\\0';\n\t\t} else if ((p2 = strchr(p1, '\\r')) != NULL) {\n\t\t\t*p2 = '\\0';\n\t\t} else if ((p2 = strchr(p1, '\\n')) != NULL) {\n\t\t\t*p2 = '\\0';\n\t\t}\n\n\t\t/* next, we coopt the parsing of the regular config */\n\t\tif (strlen(p1) > 0) {\n\t\t\tp2 = p1;\n\t\t\t/* keep going until word boundary is found. */\n\t\t\twhile ((*p2 != '\\0') && (!isblank(*p2)))\n\t\t\t\tp2++;\n\n\t\t\t/* Terminate first word. */\n\t\t\t*p2 = '\\0';\n\t\t\tp2++;\n\n\t\t\t/* skip all further blanks. */\n\t\t\twhile (isblank(*p2))\n\t\t\t\tp2++;\n\t\t\t\n\t\t\t/* Get opcode */\n\t\t\topcode = config_parse_token(p1, filename, *linenum);\n\n\t\t\tdebug(LOG_DEBUG, \"p1 = [%s]; p2 = [%s]\", p1, p2);\n\t\t\t\n\t\t\tswitch (opcode) {\n\t\t\t\tcase oFirewallRule:\n\t\t\t\t\t_parse_firewall_rule(ruleset, p2);\n\t\t\t\t\tbreak;\n\n\t\t\t\tcase oBadOption:\n\t\t\t\tdefault:\n\t\t\t\t\tdebug(LOG_ERR, \"Bad option on line %d \"\n\t\t\t\t\t\t\t\"in %s.\", *linenum,\n\t\t\t\t\t\t\tfilename);\n\t\t\t\t\tdebug(LOG_ERR, \"Exiting...\");\n\t\t\t\t\texit(-1);\n\t\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\n\tdebug(LOG_DEBUG, \"Firewall Rule Set %s added.\", ruleset);\n}\n\n/** @internal\nHelper for parse_firewall_ruleset.  Parses a single rule in a ruleset\n*/\nstatic int\n_parse_firewall_rule(const char *ruleset, char *leftover)\n{\n\tint i;\n\tt_firewall_target target = TARGET_REJECT; /**< firewall target */\n\tint all_nums = 1; /**< If 0, port contained non-numerics */\n\tint finished = 0; /**< reached end of line */\n\tchar *token = NULL; /**< First word */\n\tchar *port = NULL; /**< port to open/block */\n\tchar *protocol = NULL; /**< protocol to block, tcp/udp/icmp */\n\tchar *mask = NULL; /**< Netmask */\n\tchar *other_kw = NULL; /**< other key word */\n\tt_firewall_ruleset *tmpr;\n\tt_firewall_ruleset *tmpr2;\n\tt_firewall_rule *tmp;\n\tt_firewall_rule *tmp2;\n\n\tdebug(LOG_DEBUG, \"leftover: %s\", leftover);\n\n\t/* lower case */\n\tfor (i = 0; *(leftover + i) != '\\0'\n\t\t\t&& (*(leftover + i) = tolower((unsigned char)*(leftover + i))); i++);\n\t\n\ttoken = leftover;\n\tTO_NEXT_WORD(leftover, finished);\n\t\n\t/* Parse token */\n\tif (!strcasecmp(token, \"block\") || finished) {\n\t\ttarget = TARGET_REJECT;\n\t} else if (!strcasecmp(token, \"drop\")) {\n\t\ttarget = TARGET_DROP;\n\t} else if (!strcasecmp(token, \"allow\")) {\n\t\ttarget = TARGET_ACCEPT;\n\t} else if (!strcasecmp(token, \"log\")) {\n\t\ttarget = TARGET_LOG;\n\t} else if (!strcasecmp(token, \"ulog\")) {\n\t\ttarget = TARGET_ULOG;\n\t} else {\n\t\tdebug(LOG_ERR, \"Invalid rule type %s, expecting \"\n\t\t\t\t\"\\\"block\\\",\\\"drop\\\",\\\"allow\\\",\\\"log\\\" or \\\"ulog\\\"\", token);\n\t\treturn -1;\n\t}\n\n\t/* Parse the remainder */\n\t/* Get the protocol */\n\tif (strncmp(leftover, \"tcp\", 3) == 0\n\t\t\t|| strncmp(leftover, \"udp\", 3) == 0\n\t\t\t|| strncmp(leftover, \"icmp\", 4) == 0) {\n\t\tprotocol = leftover;\n\t\tTO_NEXT_WORD(leftover, finished);\n\t}\n\n\t/* should be exactly \"port\" */\n\tif (strncmp(leftover, \"port\", 4) == 0) {\n\t\tTO_NEXT_WORD(leftover, finished);\n\t\t/* Get port now */\n\t\tport = leftover;\n\t\tTO_NEXT_WORD(leftover, finished);\n\t\tfor (i = 0; *(port + i) != '\\0'; i++)\n\t\t\tif (!isdigit((unsigned char)*(port + i)))\n\t\t\t\tall_nums = 0; /*< No longer only digits */\n\t\tif (!all_nums) {\n\t\t\tdebug(LOG_ERR, \"Invalid port %s\", port);\n\t\t\treturn -3; /*< Fail */\n\t\t}\n\t}\n\n\t/* Now, further stuff is optional */\n\tif (!finished) {\n\t\t/* should be exactly \"to\" */\n\t\tother_kw = leftover;\n\t\tTO_NEXT_WORD(leftover, finished);\n\t\tif (strcmp(other_kw, \"to\") || finished) {\n\t\t\tdebug(LOG_ERR, \"Invalid or unexpected keyword %s, \"\n\t\t\t\t\t\"expecting \\\"to\\\"\", other_kw);\n\t\t\treturn -4; /*< Fail */\n\t\t}\n\n\t\t/* Get port now */\n\t\tmask = leftover;\n\t\tTO_NEXT_WORD(leftover, finished);\n\t\tall_nums = 1;\n\t\tfor (i = 0; *(mask + i) != '\\0'; i++)\n\t\t\tif (!isdigit((unsigned char)*(mask + i)) && (*(mask + i) != '.')\n\t\t\t\t\t&& (*(mask + i) != '/'))\n\t\t\t\tall_nums = 0; /*< No longer only digits */\n\t\tif (!all_nums) {\n\t\t\tdebug(LOG_ERR, \"Invalid mask %s\", mask);\n\t\t\treturn -3; /*< Fail */\n\t\t}\n\t}\n\n\t/* Generate rule record */\n\ttmp = safe_malloc(sizeof(t_firewall_rule));\n\tmemset((void *)tmp, 0, sizeof(t_firewall_rule));\n\ttmp->target = target;\n\tif (protocol != NULL)\n\t\ttmp->protocol = safe_strdup(protocol);\n\tif (port != NULL)\n\t\ttmp->port = safe_strdup(port);\n\tif (mask == NULL)\n\t\ttmp->mask = safe_strdup(\"0.0.0.0/0\");\n\telse\n\t\ttmp->mask = safe_strdup(mask);\n\n\tdebug(LOG_DEBUG, \"Adding Firewall Rule %s %s port %s to %s\", token, tmp->protocol, tmp->port, tmp->mask);\n\t\n\t/* Append the rule record */\n\tif (config.rulesets == NULL) {\n\t\tconfig.rulesets = safe_malloc(sizeof(t_firewall_ruleset));\n\t\tmemset(config.rulesets, 0, sizeof(t_firewall_ruleset));\n\t\tconfig.rulesets->name = safe_strdup(ruleset);\n\t\ttmpr = config.rulesets;\n\t} else {\n\t\ttmpr2 = tmpr = config.rulesets;\n\t\twhile (tmpr != NULL && (strcmp(tmpr->name, ruleset) != 0)) {\n\t\t\ttmpr2 = tmpr;\n\t\t\ttmpr = tmpr->next;\n\t\t}\n\t\tif (tmpr == NULL) {\n\t\t\t/* Rule did not exist */\n\t\t\ttmpr = safe_malloc(sizeof(t_firewall_ruleset));\n\t\t\tmemset(tmpr, 0, sizeof(t_firewall_ruleset));\n\t\t\ttmpr->name = safe_strdup(ruleset);\n\t\t\ttmpr2->next = tmpr;\n\t\t}\n\t}\n\n\t/* At this point, tmpr == current ruleset */\n\tif (tmpr->rules == NULL) {\n\t\t/* No rules... */\n\t\ttmpr->rules = tmp;\n\t} else {\n\t\ttmp2 = tmpr->rules;\n\t\twhile (tmp2->next != NULL)\n\t\t\ttmp2 = tmp2->next;\n\t\ttmp2->next = tmp;\n\t}\n\t\n\treturn 1;\n}\n\nt_firewall_rule *\nget_ruleset(const char *ruleset)\n{\n\tt_firewall_ruleset\t*tmp;\n\n\tfor (tmp = config.rulesets; tmp != NULL\n\t\t\t&& strcmp(tmp->name, ruleset) != 0; tmp = tmp->next);\n\n\tif (tmp == NULL)\n\t\treturn NULL;\n\n\treturn(tmp->rules);\n}\n\n/**\n@param filename Full path of the configuration file to be read \n*/\nvoid\nconfig_read(const char *filename)\n{\n\tFILE *fd;\n\tchar line[MAX_BUF], *s, *p1, *p2;\n\tint linenum = 0, opcode, value, len;\n\n\tdebug(LOG_INFO, \"Reading configuration file '%s'\", filename);\n\n\tif (!(fd = fopen(filename, \"r\"))) {\n\t\tdebug(LOG_ERR, \"Could not open configuration file '%s', \"\n\t\t\t\t\"exiting...\", filename);\n\t\texit(1);\n\t}\n\n\twhile (!feof(fd) && fgets(line, MAX_BUF, fd)) {\n\t\tlinenum++;\n\t\ts = line;\n\n\t\tif (s[strlen(s) - 1] == '\\n')\n\t\t\ts[strlen(s) - 1] = '\\0';\n\n\t\tif ((p1 = strchr(s, ' '))) {\n\t\t\tp1[0] = '\\0';\n\t\t} else if ((p1 = strchr(s, '\\t'))) {\n\t\t\tp1[0] = '\\0';\n\t\t}\n\n\t\tif (p1) {\n\t\t\tp1++;\n\n\t\t\t// Trim leading spaces\n\t\t\tlen = strlen(p1);\n\t\t\twhile (*p1 && len) {\n\t\t\t\tif (*p1 == ' ')\n\t\t\t\t\tp1++;\n\t\t\t\telse\n\t\t\t\t\tbreak;\n\t\t\t\tlen = strlen(p1);\n\t\t\t}\n\n\n\t\t\tif ((p2 = strchr(p1, ' '))) {\n\t\t\t\tp2[0] = '\\0';\n\t\t\t} else if ((p2 = strstr(p1, \"\\r\\n\"))) {\n\t\t\t\tp2[0] = '\\0';\n\t\t\t} else if ((p2 = strchr(p1, '\\n'))) {\n\t\t\t\tp2[0] = '\\0';\n\t\t\t}\n\t\t}\n\n\t\tif (p1 && p1[0] != '\\0') {\n\t\t\t/* Strip trailing spaces */\n\n\t\t\tif ((strncmp(s, \"#\", 1)) != 0) {\n\t\t\t\tdebug(LOG_DEBUG, \"Parsing token: %s, \"\n\t\t\t\t\t\t\"value: %s\", s, p1);\n\t\t\t\topcode = config_parse_token(s, filename, linenum);\n\n\t\t\t\tswitch(opcode) {\n\t\t\t\tcase oDaemon:\n\t\t\t\t\tif (config.daemon == -1 && ((value = parse_boolean_value(p1)) != -1)) {\n\t\t\t\t\t\tconfig.daemon = value;\n\t\t\t\t\t}\n\t\t\t\t\tbreak;\n\t\t\t\tcase oExternalInterface:\n\t\t\t\t\tconfig.external_interface = safe_strdup(p1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oGatewayID:\n\t\t\t\t\tconfig.gw_id = safe_strdup(p1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oGatewayInterface:\n\t\t\t\t\tconfig.gw_interface = safe_strdup(p1);\n\t\t\t\t\tbreak;\n\t\t\t\t/* wiwiz added starts */\n\t\t\t\tcase oGatewayInterfaceMac:\n\t\t\t\t\tconfig.gw_interface_mac = safe_strdup(p1);\n\t\t\t\t\tbreak;\n\t\t\t\t/* wiwiz added ends */\n\t\t\t\tcase oGatewayAddress:\n\t\t\t\t\tconfig.gw_address = safe_strdup(p1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oGatewayPort:\n\t\t\t\t\tsscanf(p1, \"%d\", &config.gw_port);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oAuthServer:\n\t\t\t\t\tparse_auth_server(fd, filename,\n\t\t\t\t\t\t\t&linenum);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oFirewallRuleSet:\n\t\t\t\t\tparse_firewall_ruleset(p1, fd, filename, &linenum);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oTrustedMACList:\n\t\t\t\t\tparse_trusted_mac_list(p1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oHTTPDName:\n\t\t\t\t\tconfig.httpdname = safe_strdup(p1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oHTTPDMaxConn:\n\t\t\t\t\tsscanf(p1, \"%d\", &config.httpdmaxconn);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oHTTPDRealm:\n\t\t\t\t\tconfig.httpdrealm = safe_strdup(p1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oHTTPDUsername:\n\t\t\t\t\tconfig.httpdusername = safe_strdup(p1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oHTTPDPassword:\n\t\t\t\t\tconfig.httpdpassword = safe_strdup(p1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oBadOption:\n\t\t\t\t\tdebug(LOG_ERR, \"Bad option on line %d \"\n\t\t\t\t\t\t\t\"in %s.\", linenum,\n\t\t\t\t\t\t\tfilename);\n\t\t\t\t\tdebug(LOG_ERR, \"Exiting...\");\n\t\t\t\t\texit(-1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oCheckInterval:\n\t\t\t\t\tsscanf(p1, \"%d\", &config.checkinterval);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oWdctlSocket:\n\t\t\t\t\tfree(config.wdctl_sock);\n\t\t\t\t\tconfig.wdctl_sock = safe_strdup(p1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oClientTimeout:\n\t\t\t\t\tsscanf(p1, \"%d\", &config.clienttimeout);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oSyslogFacility:\n\t\t\t\t\tsscanf(p1, \"%d\", &config.syslog_facility);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oHtmlMessageFile:\n\t\t\t\t\tconfig.htmlmsgfile = safe_strdup(p1);\n\t\t\t\t\tbreak;\n\t\t\t\tcase oProxyPort:\n\t\t\t\t\tsscanf(p1, \"%d\", &config.proxy_port);\n\t\t\t\t\tbreak;\n\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tif (config.httpdusername && !config.httpdpassword) {\n\t\tdebug(LOG_ERR, \"HTTPDUserName requires a HTTPDPassword to be set.\");\n\t\texit(-1);\n\t}\n\n\tfclose(fd);\n}\n\n/** @internal\nParses a boolean value from the config file\n*/\nstatic int\nparse_boolean_value(char *line)\n{\n\tif (strcasecmp(line, \"yes\") == 0) {\n\t\treturn 1;\n\t}\n\tif (strcasecmp(line, \"no\") == 0) {\n\t\treturn 0;\n\t}\n\tif (strcmp(line, \"1\") == 0) {\n\t\treturn 1;\n\t}\n\tif (strcmp(line, \"0\") == 0) {\n\t\treturn 0;\n\t}\n\n\treturn -1;\n}\n\nvoid parse_trusted_mac_list(const char *ptr) {\n\tchar *ptrcopy = NULL;\n\tchar *possiblemac = NULL;\n\tchar *mac = NULL;\n\tt_trusted_mac *p = NULL;\n\n\tdebug(LOG_DEBUG, \"Parsing string [%s] for trusted MAC addresses\", ptr);\n\n\tmac = safe_malloc(18);\n\n\t/* strsep modifies original, so let's make a copy */\n\tptrcopy = safe_strdup(ptr);\n\n\twhile ((possiblemac = strsep(&ptrcopy, \", \"))) {\n\t\tif (sscanf(possiblemac, \" %17[A-Fa-f0-9:]\", mac) == 1) {\n\t\t\t/* Copy mac to the list */\n\n\t\t\tdebug(LOG_DEBUG, \"Adding MAC address [%s] to trusted list\", mac);\n\n\t\t\tif (config.trustedmaclist == NULL) {\n\t\t\t\tconfig.trustedmaclist = safe_malloc(sizeof(t_trusted_mac));\n\t\t\t\tconfig.trustedmaclist->mac = safe_strdup(mac);\n\t\t\t\tconfig.trustedmaclist->next = NULL;\n\t\t\t}\n\t\t\telse {\n\t\t\t\t/* Advance to the last entry */\n\t\t\t\tfor (p = config.trustedmaclist; p->next != NULL; p = p->next);\n\t\t\t\tp->next = safe_malloc(sizeof(t_trusted_mac));\n\t\t\t\tp = p->next;\n\t\t\t\tp->mac = safe_strdup(mac);\n\t\t\t\tp->next = NULL;\n\t\t\t}\n\n\t\t}\n\t}\n\n\tfree(ptrcopy);\n\n\tfree(mac);\n\n}\n\n/** Verifies if the configuration is complete and valid.  Terminates the program if it isn't */\nvoid\nconfig_validate(void)\n{\n\tconfig_notnull(config.gw_interface, \"GatewayInterface\");\n\tconfig_notnull(config.auth_servers, \"AuthServer\");\n\n\tif (missing_parms) {\n\t\tdebug(LOG_ERR, \"Configuration is not complete, exiting...\");\n\t\texit(-1);\n\t}\n}\n\n/** @internal\n    Verifies that a required parameter is not a null pointer\n*/\nstatic void\nconfig_notnull(const void *parm, const char *parmname)\n{\n\tif (parm == NULL) {\n\t\tdebug(LOG_ERR, \"%s is not set\", parmname);\n\t\tmissing_parms = 1;\n\t}\n}\n\n/**\n * This function returns the current (first auth_server)\n */\nt_auth_serv *\nget_auth_server(void)\n{\n\n\t/* This is as good as atomic */\n\treturn config.auth_servers;\n}\n\n/**\n * This function marks the current auth_server, if it matches the argument,\n * as bad. Basically, the \"bad\" server becomes the last one on the list.\n */\nvoid\nmark_auth_server_bad(t_auth_serv *bad_server)\n{\n\tt_auth_serv\t*tmp;\n\n\tif (config.auth_servers == bad_server && bad_server->next != NULL) {\n\t\t/* Go to the last */\n\t\tfor (tmp = config.auth_servers; tmp->next != NULL; tmp = tmp->next);\n\t\t/* Set bad server as last */\n\t\ttmp->next = bad_server;\n\t\t/* Remove bad server from start of list */\n\t\tconfig.auth_servers = bad_server->next;\n\t\t/* Set the next pointe to NULL in the last element */\n\t\tbad_server->next = NULL;\n\t}\n\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/conf.h",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file conf.h\n    @brief Config file parsing\n    @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n*/\n\n#ifndef _CONFIG_H_\n#define _CONFIG_H_\n\n/*@{*/ \n/** Defines */\n/** How many times should we try detecting the interface with the default route\n * (in seconds).  If set to 0, it will keep retrying forever */\n#define NUM_EXT_INTERFACE_DETECT_RETRY 0\n/** How often should we try to detect the interface with the default route\n *  if it isn't up yet (interval in seconds) */\n#define EXT_INTERFACE_DETECT_RETRY_INTERVAL 1\n\n/** Defaults configuration values */\n#ifndef SYSCONFDIR\n\t#define DEFAULT_CONFIGFILE \"/etc/wifidog.conf\"\n\t#define DEFAULT_HTMLMSGFILE \"/etc/wifidog-msg.html\"\n#else\n\t#define DEFAULT_CONFIGFILE SYSCONFDIR\"/wifidog.conf\"\n\t#define DEFAULT_HTMLMSGFILE SYSCONFDIR\"/wifidog-msg.html\"\n#endif\t\n#define DEFAULT_DAEMON 1\n#define DEFAULT_DEBUGLEVEL LOG_INFO\n#define DEFAULT_HTTPDMAXCONN 10\n#define DEFAULT_GATEWAYID NULL\n#define DEFAULT_GATEWAYPORT 2060\n#define DEFAULT_HTTPDNAME \"WiFiDog\"\n#define DEFAULT_CLIENTTIMEOUT 5\n#define DEFAULT_CHECKINTERVAL 60\n#define DEFAULT_LOG_SYSLOG 0\n#define DEFAULT_SYSLOG_FACILITY LOG_DAEMON\n#define DEFAULT_WDCTL_SOCK \"/tmp/wdctl.sock\"\n#define DEFAULT_INTERNAL_SOCK \"/tmp/wifidog.sock\"\n#define DEFAULT_AUTHSERVPORT 80\n#define DEFAULT_AUTHSERVSSLPORT 443\n/** Note that DEFAULT_AUTHSERVSSLAVAILABLE must be 0 or 1, even if the config file syntax is yes or no */\n#define DEFAULT_AUTHSERVSSLAVAILABLE 0\n/** Note:  The path must be prefixed by /, and must be suffixed /.  Put / for the server root.*/\n#define DEFAULT_AUTHSERVPATH \"/wifidog/\"\n#define DEFAULT_AUTHSERVLOGINPATHFRAGMENT \"login/?\"\n#define DEFAULT_AUTHSERVPORTALPATHFRAGMENT \"portal/?\"\n#define DEFAULT_AUTHSERVMSGPATHFRAGMENT \"gw_message.php?\"\n#define DEFAULT_AUTHSERVPINGPATHFRAGMENT \"ping/?\"\n#define DEFAULT_AUTHSERVAUTHPATHFRAGMENT \"auth/?\"\n/*@}*/ \n\n/**\n * Information about the authentication server\n */\ntypedef struct _auth_serv_t {\n    char *authserv_hostname;\t/**< @brief Hostname of the central server */\n    char *authserv_path;\t/**< @brief Path where wifidog resides */\n    char *authserv_login_script_path_fragment;\t/**< @brief This is the script the user will be sent to for login. */\n    char *authserv_portal_script_path_fragment;\t/**< @brief This is the script the user will be sent to after a successfull login. */\n    char *authserv_msg_script_path_fragment;\t/**< @brief This is the script the user will be sent to upon error to read a readable message. */\n    char *authserv_ping_script_path_fragment;\t/**< @brief This is the ping heartbeating script. */\n    char *authserv_auth_script_path_fragment;\t/**< @brief This is the script that talks the wifidog gateway protocol. */\n    int authserv_http_port;\t/**< @brief Http port the central server\n\t\t\t\t     listens on */\n    int authserv_ssl_port;\t/**< @brief Https port the central server\n\t\t\t\t     listens on */\n    int authserv_use_ssl;\t/**< @brief Use SSL or not */\n    char *last_ip;\t/**< @brief Last ip used by authserver */\n    struct _auth_serv_t *next;\n} t_auth_serv;\n\n/**\n * Firewall targets\n */\ntypedef enum {\n    TARGET_DROP,\n    TARGET_REJECT,\n    TARGET_ACCEPT,\n    TARGET_LOG,\n    TARGET_ULOG\n} t_firewall_target;\n\n/**\n * Firewall rules\n */\ntypedef struct _firewall_rule_t {\n    t_firewall_target target;\t/**< @brief t_firewall_target */\n    char *protocol;\t\t/**< @brief tcp, udp, etc ... */\n    char *port;\t\t\t/**< @brief Port to block/allow */\n    char *mask;\t\t\t/**< @brief Mask for the rule *destination* */\n    struct _firewall_rule_t *next;\n} t_firewall_rule;\n\n/**\n * Firewall rulesets\n */\ntypedef struct _firewall_ruleset_t {\n    char\t\t\t*name;\n    t_firewall_rule\t\t*rules;\n    struct _firewall_ruleset_t\t*next;\n} t_firewall_ruleset;\n\n/**\n * Trusted MAC Addresses\n */\ntypedef struct _trusted_mac_t {\n    char   *mac;\n    struct _trusted_mac_t *next;\n} t_trusted_mac;\n\n/**\n * Configuration structure\n */\ntypedef struct {\n    char configfile[255];\t/**< @brief name of the config file */\n    char *htmlmsgfile;\t\t/**< @brief name of the HTML file used for messages */\n    char *wdctl_sock;\t\t/**< @brief wdctl path to socket */\n    char *internal_sock;\t\t/**< @brief internal path to socket */\n    int daemon;\t\t\t/**< @brief if daemon > 0, use daemon mode */\n    int debuglevel;\t\t/**< @brief Debug information verbosity */\n    char *external_interface;\t/**< @brief External network interface name for\n\t\t\t\t     firewall rules */\n    char *gw_id;\t\t/**< @brief ID of the Gateway, sent to central\n\t\t\t\t     server */\n    char *gw_interface;\t\t/**< @brief Interface we will accept connections on */\n    char *gw_interface_mac;\t/* wiwiz added */\n    char *gw_address;\t\t/**< @brief Internal IP address for our web\n\t\t\t\t     server */\n    int gw_port;\t\t/**< @brief Port the webserver will run on */\n    \n    t_auth_serv\t*auth_servers;\t/**< @brief Auth servers list */\n    char *httpdname;\t\t/**< @brief Name the web server will return when\n\t\t\t\t     replying to a request */\n    int httpdmaxconn;\t\t/**< @brief Used by libhttpd, not sure what it\n\t\t\t\t     does */\n    char *httpdrealm;\t\t/**< @brief HTTP Authentication realm */\n    char *httpdusername;\t/**< @brief Username for HTTP authentication */\n    char *httpdpassword;\t/**< @brief Password for HTTP authentication */\n    int clienttimeout;\t\t/**< @brief How many CheckIntervals before a client\n\t\t\t\t     must be re-authenticated */\n    int checkinterval;\t\t/**< @brief Frequency the the client timeout check\n\t\t\t\t     thread will run. */\n    int log_syslog;\t\t/**< @brief boolean, wether to log to syslog */\n    int syslog_facility;\t/**< @brief facility to use when using syslog for\n\t\t\t\t     logging */\n    int proxy_port;\t\t/**< @brief Transparent proxy port (0 to disable) */\n    t_firewall_ruleset\t*rulesets;\t/**< @brief firewall rules */\n    t_trusted_mac *trustedmaclist; /**< @brief list of trusted macs */\n} s_config;\n\n/** @brief Get the current gateway configuration */\ns_config *config_get_config(void);\n\n/** @brief Initialise the conf system */\nvoid config_init(void);\n\n/** @brief Initialize the variables we override with the command line*/\nvoid config_init_override(void);\n\n/** @brief Reads the configuration file */\nvoid config_read(const char *filename);\n\n/** @brief Check that the configuration is valid */\nvoid config_validate(void);\n\n/** @brief Get the active auth server */\nt_auth_serv *get_auth_server(void);\n\n/** @brief Bump server to bottom of the list */\nvoid mark_auth_server_bad(t_auth_serv *);\n\n/** @brief Fetch a firewall rule set. */\nt_firewall_rule *get_ruleset(const char *);\n\nvoid parse_trusted_mac_list(const char *);\n\n#define LOCK_CONFIG() do { \\\n\tdebug(LOG_DEBUG, \"Locking config\"); \\\n\tpthread_mutex_lock(&config_mutex); \\\n\tdebug(LOG_DEBUG, \"Config locked\"); \\\n} while (0)\n\n#define UNLOCK_CONFIG() do { \\\n\tdebug(LOG_DEBUG, \"Unlocking config\"); \\\n\tpthread_mutex_unlock(&config_mutex); \\\n\tdebug(LOG_DEBUG, \"Config unlocked\"); \\\n} while (0)\n\n#endif /* _CONFIG_H_ */\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/debug.c",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file debug.c\n    @brief Debug output routines\n    @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n*/\n\n#include <stdio.h>\n#include <errno.h>\n#include <syslog.h>\n#include <stdarg.h>\n#include <time.h>\n#include <unistd.h>\n\n#include \"conf.h\"\n\n/** @internal\nDo not use directly, use the debug macro */\nvoid\n_debug(const char *filename, int line, int level, const char *format, ...)\n{\n    char buf[28];\n    va_list vlist;\n    s_config *config = config_get_config();\n    time_t ts;\n\n    time(&ts);\n\n    if (config->debuglevel >= level) {\n\n        if (level <= LOG_WARNING) {\n            fprintf(stderr, \"[%d][%.24s][%u](%s:%d) \", level, ctime_r(&ts, buf), getpid(),\n\t\t\t    filename, line);\n            va_start(vlist, format);\n            vfprintf(stderr, format, vlist);\n            va_end(vlist);\n            fputc('\\n', stderr);\n        } else if (!config->daemon) {\n            fprintf(stdout, \"[%d][%.24s][%u](%s:%d) \", level, ctime_r(&ts, buf), getpid(),\n\t\t\t    filename, line);\n            va_start(vlist, format);\n            vfprintf(stdout, format, vlist);\n            va_end(vlist);\n            fputc('\\n', stdout);\n            fflush(stdout);\n        }\n\n        if (config->log_syslog) {\n            openlog(\"wifidog\", LOG_PID, config->syslog_facility);\n            va_start(vlist, format);\n            vsyslog(level, format, vlist);\n            va_end(vlist);\n            closelog();\n        }\n    }\n}\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/debug.h",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file debug.h\n    @brief Debug output routines\n    @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n*/\n\n#ifndef _DEBUG_H_\n#define _DEBUG_H_\n\n/** @brief Used to output messages.\n *The messages will include the finlname and line number, and will be sent to syslog if so configured in the config file \n */\n#define debug(level, format...) _debug(__FILE__, __LINE__, level, format)\n\n/** @internal */\nvoid _debug(const char *filename, int line, int level, const char *format, ...);\n\n#endif /* _DEBUG_H_ */\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/firewall.c",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n \\********************************************************************/\n\n/*\n * $Id$\n */\n/** @internal\n  @file firewall.c\n  @brief Firewall update functions\n  @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n  2006 Benoit Grégoire, Technologies Coeus inc. <bock@step.polymtl.ca>\n */\n\n#define _GNU_SOURCE\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <syslog.h>\n#include <errno.h>\n#include <pthread.h>\n#include <sys/wait.h>\n#include <sys/types.h>\n/* #include <sys/unistd.h>\tby Wiwiz */\n\n#include <string.h>\n\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <unistd.h>\n#include <sys/uio.h>\n#include <fcntl.h>\n#include <netdb.h>\n#include <sys/time.h>\n\n#ifdef __linux__\n#include <net/ethernet.h>\n#include <netinet/ip.h>\n#include <netinet/ip_icmp.h>\n#include <netpacket/packet.h>\n#endif\n\n#if defined(__NetBSD__)\n#include <netinet/in_systm.h>\n#include <netinet/ip.h>\n#include <netinet/ip_icmp.h>\n#endif\n\n#include \"httpd.h\"\n#include \"safe.h\"\n#include \"debug.h\"\n#include \"conf.h\"\n#include \"firewall.h\"\n#include \"fw_iptables.h\"\n#include \"auth.h\"\n#include \"centralserver.h\"\n#include \"client_list.h\"\n#include \"util.h\"\n\nextern pthread_mutex_t client_list_mutex;\n\n/* from commandline.c */\nextern pid_t restart_orig_pid;\n\nint icmp_fd;\t/* added by wiwiz */\n\n/**\n * Allow a client access through the firewall by adding a rule in the firewall to MARK the user's packets with the proper\n * rule by providing his IP and MAC address\n * @param ip IP address to allow\n * @param mac MAC address to allow\n * @param fw_connection_state fw_connection_state Tag\n * @return Return code of the command\n */\nint\nfw_allow(const char *ip, const char *mac, int fw_connection_state)\n{\n    debug(LOG_DEBUG, \"Allowing %s %s with fw_connection_state %d\", ip, mac, fw_connection_state);\n\n    /* wiwiz starts */\n    char *cmd;\n    safe_asprintf(&cmd, \"/usr/local/hsbuilder/setspeed.sh set %s %s &\", mac, ip);\n    /*system(cmd);*/\n    execute(cmd, 0);\n    /* wiwiz ends */\n\n    return iptables_fw_access(FW_ACCESS_ALLOW, ip, mac, fw_connection_state);\n}\n\n/**\n * @brief Deny a client access through the firewall by removing the rule in the firewall that was fw_connection_stateging the user's traffic\n * @param ip IP address to deny\n * @param mac MAC address to deny\n * @param fw_connection_state fw_connection_state Tag\n * @return Return code of the command\n */\nint\nfw_deny(const char *ip, const char *mac, int fw_connection_state)\n{\n    debug(LOG_DEBUG, \"Denying %s %s with fw_connection_state %d\", ip, mac, fw_connection_state);\n\n    /* wiwiz starts */\n    char *cmd ;\n    safe_asprintf(&cmd, \"/usr/local/hsbuilder/setspeed.sh unset %s &\", mac);\n    /*system(cmd);*/\n    execute(cmd, 0);\n    /* wiwiz ends */\n\n    return iptables_fw_access(FW_ACCESS_DENY, ip, mac, fw_connection_state);\n}\n\n/* XXX DCY */\n/**\n * Get an IP's MAC address from the ARP cache.\n * Go through all the entries in /proc/net/arp until we find the requested\n * IP address and return the MAC address bound to it.\n * @todo Make this function portable (using shell scripts?)\n */\nchar           *\narp_get(const char *req_ip)\n{\n    FILE           *proc;\n\t char ip[16];\n\t char mac[18];\n\t char * reply = NULL;\n\n    if (!(proc = fopen(\"/proc/net/arp\", \"r\"))) {\n        return NULL;\n    }\n\n    /* Skip first line */\n\t while (!feof(proc) && fgetc(proc) != '\\n');\n\n\t /* Find ip, copy mac in reply */\n\t reply = NULL;\n    while (!feof(proc) && (fscanf(proc, \" %15[0-9.] %*s %*s %17[A-Fa-f0-9:] %*s %*s\", ip, mac) == 2)) {\n\t\t  if (strcmp(ip, req_ip) == 0) {\n\t\t\t\treply = safe_strdup(mac);\n\t\t\t\tbreak;\n\t\t  }\n    }\n\n    fclose(proc);\n\n    return reply;\n}\n\n/** Initialize the firewall rules\n */\nint\nfw_init(void)\n{\n    int flags, oneopt = 1, zeroopt = 0;\n\t int result = 0;\n\t t_client * client = NULL;\n\n    debug(LOG_INFO, \"Creating ICMP socket\");\n    if ((icmp_fd = socket (AF_INET, SOCK_RAW, IPPROTO_ICMP)) == -1 ||\n            (flags = fcntl(icmp_fd, F_GETFL, 0)) == -1 ||\n             fcntl(icmp_fd, F_SETFL, flags | O_NONBLOCK) == -1 ||\n             setsockopt(icmp_fd, SOL_SOCKET, SO_RCVBUF, &oneopt, sizeof(oneopt)) ||\n             setsockopt(icmp_fd, SOL_SOCKET, SO_DONTROUTE, &zeroopt, sizeof(zeroopt)) == -1) {\n        debug(LOG_ERR, \"Cannot create ICMP raw socket.\");\n        return 0;\n    }\n\n    debug(LOG_INFO, \"Initializing Firewall\");\n    result = iptables_fw_init();\n\n\t if (restart_orig_pid) {\n\t\t debug(LOG_INFO, \"Restoring firewall rules for clients inherited from parent\");\n\t\t LOCK_CLIENT_LIST();\n\t\t client = client_get_first_client();\n\t\t while (client) {\n\t\t\t fw_allow(client->ip, client->mac, client->fw_connection_state);\n\t\t\t client = client->next;\n\t\t }\n\t\t UNLOCK_CLIENT_LIST();\n\t }\n\n\t return result;\n}\n\n/** Remove all auth server firewall whitelist rules\n */\nvoid\nfw_clear_authservers(void)\n{\n\tdebug(LOG_INFO, \"Clearing the authservers list\");\n\tiptables_fw_clear_authservers();\n}\n\n/** Add the necessary firewall rules to whitelist the authservers\n */\nvoid\nfw_set_authservers(void)\n{\n\tdebug(LOG_INFO, \"Setting the authservers list\");\n\tiptables_fw_set_authservers();\n}\n\n/** Remove the firewall rules\n * This is used when we do a clean shutdown of WiFiDog.\n * @return Return code of the fw.destroy script\n */\nint\nfw_destroy(void)\n{\n    if (icmp_fd != 0) {\n        debug(LOG_INFO, \"Closing ICMP socket\");\n        close(icmp_fd);\n    }\n\n    debug(LOG_INFO, \"Removing Firewall rules\");\n    return iptables_fw_destroy();\n}\n\n/**Probably a misnomer, this function actually refreshes the entire client list's traffic counter, re-authenticates every client with the central server and update's the central servers traffic counters and notifies it if a client has logged-out.\n * @todo Make this function smaller and use sub-fonctions\n */\nvoid\nfw_sync_with_authserver(void)\n{\n    t_authresponse  authresponse;\n    char            *token, *ip, *mac;\n    t_client        *p1, *p2;\n    unsigned long long\t    incoming, outgoing;\n    s_config *config = config_get_config();\n    char *cmd;\n\n    if (-1 == iptables_fw_counters_update()) {\n        debug(LOG_ERR, \"Could not get counters from firewall!\");\n        return;\n    }\n\n    /* start: added by wiwiz */\n    LOCK_CLIENT_LIST();\n    safe_asprintf(&cmd, \"echo '['>/tmp/wiwiz_client_data\");\n    execute(cmd, 0);\n    for (p1 = p2 = client_get_first_client(); NULL != p1; p1 = p2) {\n        p2 = p1->next;\n\n        ip = safe_strdup(p1->ip);\n        token = safe_strdup(p1->token);\n        mac = safe_strdup(p1->mac);\n        outgoing = p1->counters.outgoing;\n        incoming = p1->counters.incoming;\n\n        debug(LOG_INFO, \"Got client, ip: %s, mac: %s, token: %s, outgoing: %llu, incoming: %llu\", ip, mac, token, outgoing, incoming);\n\n        safe_asprintf(&cmd, \"echo '{\\\"ip\\\":\\\"%s\\\",\\\"token\\\":\\\"%s\\\",\\\"mac\\\":\\\"%s\\\",\\\"og\\\":\\\"%llu\\\",\\\"ic\\\":\\\"%llu\\\"},'>>/tmp/wiwiz_client_data\", \n            ip, token, mac, outgoing, incoming);\n        execute(cmd, 0);\n    }\n    UNLOCK_CLIENT_LIST();\n    safe_asprintf(&cmd, \"echo '{}]'>>/tmp/wiwiz_client_data\");\n    execute(cmd, 0);\n    \n    safe_asprintf(&cmd, \"/usr/local/hsbuilder/auth.sh\");\n    execute(cmd, 0);\n    free(cmd);\n    /* end: added by wiwiz */\n\n    LOCK_CLIENT_LIST();\n\n    for (p1 = p2 = client_get_first_client(); NULL != p1; p1 = p2) {\n        p2 = p1->next;\n\n        ip = safe_strdup(p1->ip);\n        token = safe_strdup(p1->token);\n        mac = safe_strdup(p1->mac);\n\t    // outgoing = p1->counters.outgoing;\n\t    // incoming = p1->counters.incoming;\n\n\t    UNLOCK_CLIENT_LIST();\n        /* Ping the client, if he responds it'll keep activity on the link.\n         * However, if the firewall blocks it, it will not help.  The suggested\n         * way to deal witht his is to keep the DHCP lease time extremely\n         * short:  Shorter than config->checkinterval * config->clienttimeout */\n        icmp_ping(ip);\n        /* Update the counters on the remote server only if we have an auth server */\n        if (config->auth_servers != NULL) {\n            // auth_server_request(&authresponse, REQUEST_TYPE_COUNTERS, ip, mac, token, incoming, outgoing);   /* del by wiwiz */\n            batchAuth(&authresponse, mac, token);   /* added by wiwiz */\n        }\n\t    LOCK_CLIENT_LIST();\n\n        if (!(p1 = client_list_find(ip, mac))) {\n            debug(LOG_ERR, \"Node %s was freed while being re-validated!\", ip);\n        } else {\n        \ttime_t\tcurrent_time=time(NULL);\n        \tdebug(LOG_INFO, \"Checking client %s for timeout:  Last updated %ld (%ld seconds ago), timeout delay %ld seconds, current time %ld, \",\n                        p1->ip, p1->counters.last_updated, current_time-p1->counters.last_updated, config->checkinterval * config->clienttimeout, current_time);\n            if (p1->counters.last_updated +\n\t\t\t\t(config->checkinterval * config->clienttimeout)\n\t\t\t\t<= current_time) {\n                /* Timing out user */\n                debug(LOG_INFO, \"%s - Inactive for more than %ld seconds, removing client and denying in firewall\",\n                        p1->ip, config->checkinterval * config->clienttimeout);\n                fw_deny(p1->ip, p1->mac, p1->fw_connection_state);\n                client_list_delete(p1);\n\n                /* Advertise the logout if we have an auth server */\n                if (config->auth_servers != NULL) {\n\t\t\t\t\tUNLOCK_CLIENT_LIST();\n\t\t\t\t\t//auth_server_request(&authresponse, REQUEST_TYPE_LOGOUT, ip, mac, token, 0, 0);\n\t\t\t\t\tauth_server_request(&authresponse, REQUEST_TYPE_LOGOUT2, ip, mac, token, 0, 0);\t// changed by Wiwiz\n\t\t\t\t\tLOCK_CLIENT_LIST();\n                }\n            } else {\n                /*\n                 * This handles any change in\n                 * the status this allows us\n                 * to change the status of a\n                 * user while he's connected\n                 *\n                 * Only run if we have an auth server\n                 * configured!\n                 */\n                if (config->auth_servers != NULL) {\n                    switch (authresponse.authcode) {\n                        case AUTH_DENIED:\n                            debug(LOG_NOTICE, \"%s - Denied. Removing client and firewall rules\", p1->ip);\n                            fw_deny(p1->ip, p1->mac, p1->fw_connection_state);\n                            client_list_delete(p1);\n                            break;\n\n                        case AUTH_VALIDATION_FAILED:\n                            debug(LOG_NOTICE, \"%s - Validation timeout, now denied. Removing client and firewall rules\", p1->ip);\n                            fw_deny(p1->ip, p1->mac, p1->fw_connection_state);\n                            client_list_delete(p1);\n                            break;\n\n                        case AUTH_ALLOWED:\n                            if (p1->fw_connection_state != FW_MARK_KNOWN) {\n                                debug(LOG_INFO, \"%s - Access has changed to allowed, refreshing firewall and clearing counters\", p1->ip);\n                                //WHY did we deny, then allow!?!? benoitg 2007-06-21\n                                //fw_deny(p1->ip, p1->mac, p1->fw_connection_state);\n\n                                if (p1->fw_connection_state != FW_MARK_PROBATION) {\n                                    p1->counters.incoming = p1->counters.outgoing = 0;\n                                }\n                                else {\n                                \t//We don't want to clear counters if the user was in validation, it probably already transmitted data..\n                                    debug(LOG_INFO, \"%s - Skipped clearing counters after all, the user was previously in validation\", p1->ip);\n                                }\n                                p1->fw_connection_state = FW_MARK_KNOWN;\n                                fw_allow(p1->ip, p1->mac, p1->fw_connection_state);\n                            }\n                            break;\n\n                        case AUTH_VALIDATION:\n                            /*\n                             * Do nothing, user\n                             * is in validation\n                             * period\n                             */\n                            debug(LOG_INFO, \"%s - User in validation period\", p1->ip);\n                            break;\n\n                        case AUTH_ERROR:\n                                    debug(LOG_WARNING, \"Error communicating with auth server - leaving %s as-is for now\", p1->ip);\n                                    break;\n\n                        default:\n                            debug(LOG_ERR, \"I do not know about authentication code %d\", authresponse.authcode);\n                            break;\n                    }\n                }\n            }\n        }\n\n        free(token);\n        free(ip);\n        free(mac);\n    }\n    UNLOCK_CLIENT_LIST();\n}\n\nvoid\nicmp_ping(const char *host)\n{\n\tstruct sockaddr_in saddr;\n#if defined(__linux__) || defined(__NetBSD__)\n\tstruct {\n\t\tstruct ip ip;\n\t\tstruct icmp icmp;\n\t} packet;\n#endif\n\tunsigned int i, j;\n\tint opt = 2000;\n\tunsigned short id = rand16();\n\n\tmemset(&saddr, 0, sizeof(saddr));\n\tsaddr.sin_family = AF_INET;\n\tinet_aton(host, &saddr.sin_addr);\n#if defined(HAVE_SOCKADDR_SA_LEN) || defined(__NetBSD__)\n\tsaddr.sin_len = sizeof(struct sockaddr_in);\n#endif\n\n#if defined(__linux__) || defined(__NetBSD__)\n\tmemset(&packet.icmp, 0, sizeof(packet.icmp));\n\tpacket.icmp.icmp_type = ICMP_ECHO;\n\tpacket.icmp.icmp_id = id;\n\n\tfor (j = 0, i = 0; i < sizeof(struct icmp) / 2; i++)\n\t\tj += ((unsigned short *)&packet.icmp)[i];\n\n\twhile (j >> 16)\n\t\tj = (j & 0xffff) + (j >> 16);\n\n\tpacket.icmp.icmp_cksum = (j == 0xffff) ? j : ~j;\n\n\tif (setsockopt(icmp_fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt)) == -1)\n\t\tdebug(LOG_ERR, \"setsockopt(): %s\", strerror(errno));\n\n\tif (sendto(icmp_fd, (char *)&packet.icmp, sizeof(struct icmp), 0,\n\t           (const struct sockaddr *)&saddr, sizeof(saddr)) == -1)\n\t\tdebug(LOG_ERR, \"sendto(): %s\", strerror(errno));\n\n\topt = 1;\n\tif (setsockopt(icmp_fd, SOL_SOCKET, SO_RCVBUF, &opt, sizeof(opt)) == -1)\n\t\tdebug(LOG_ERR, \"setsockopt(): %s\", strerror(errno));\n#endif\n\n\treturn;\n}\n\nunsigned short rand16(void) {\n  static int been_seeded = 0;\n\n  if (!been_seeded) {\n    unsigned int seed = 0;\n    struct timeval now;\n\n    /* not a very good seed but what the heck, it needs to be quickly acquired */\n    gettimeofday(&now, NULL);\n    seed = now.tv_sec ^ now.tv_usec ^ (getpid() << 16);\n\n    srand(seed);\n    been_seeded = 1;\n    }\n\n    /* Some rand() implementations have less randomness in low bits\n     * than in high bits, so we only pay attention to the high ones.\n     * But most implementations don't touch the high bit, so we\n     * ignore that one.\n     **/\n      return( (unsigned short) (rand() >> 15) );\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/firewall.h",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file firewall.h\n    @brief Firewall update functions\n    @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n*/\n\n#ifndef _FIREWALL_H_\n#define _FIREWALL_H_\n\n/* int icmp_fd; */\nextern int icmp_fd; /* changed by wiwiz */\n\n/** Used by fw_iptables.c */\ntypedef enum _t_fw_marks {\n    FW_MARK_PROBATION = 1, /**< @brief The client is in probation period and must be authenticated \n\t\t\t    @todo: VERIFY THAT THIS IS ACCURATE*/\n    FW_MARK_KNOWN = 2,  /**< @brief The client is known to the firewall */\n    FW_MARK_LOCKED = 254 /**< @brief The client has been locked out */\n} t_fw_marks;\n\n/** @brief Initialize the firewall */\nint fw_init(void);\n\n/** @brief Clears the authservers list */\nvoid fw_clear_authservers(void);\n\n/** @brief Sets the authservers list */\nvoid fw_set_authservers(void);\n\n/** @brief Destroy the firewall */\nint fw_destroy(void);\n\n/** @brief Allow a user through the firewall*/\nint fw_allow(const char *ip, const char *mac, int profile);\n\n/** @brief Deny a client access through the firewall*/\nint fw_deny(const char *ip, const char *mac, int profile);\n\n/** @brief Refreshes the entire client list */\nvoid fw_sync_with_authserver(void);\n\n/** @brief Get an IP's MAC address from the ARP cache.*/\nchar *arp_get(const char *req_ip);\n\n/** @brief ICMP Ping an IP */\nvoid icmp_ping(const char *host);\n\n/** @brief cheap random */\nunsigned short rand16(void);\n\n#endif /* _FIREWALL_H_ */\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/fw_iptables-org.c",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n \\********************************************************************/\n\n/* $Id$ */\n/** @internal\n  @file fw_iptables.c\n  @brief Firewall iptables functions\n  @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n */\n\n#define _GNU_SOURCE\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <stdarg.h>\n#include <syslog.h>\n#include <errno.h>\n#include <string.h>\n#include <pthread.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n\n#include \"common.h\"\n\n#include \"safe.h\"\n#include \"conf.h\"\n#include \"fw_iptables.h\"\n#include \"firewall.h\"\n#include \"debug.h\"\n#include \"util.h\"\n#include \"client_list.h\"\n\nstatic int iptables_do_command(const char *format, ...);\nstatic char *iptables_compile(const char *, const char *, const t_firewall_rule *);\nstatic void iptables_load_ruleset(const char *, const char *, const char *);\n\nextern pthread_mutex_t\tclient_list_mutex;\nextern pthread_mutex_t\tconfig_mutex;\n\n/**\nUsed to supress the error output of the firewall during destruction */ \nstatic int fw_quiet = 0;\n\n/** @internal\n * @brief Insert $ID$ with the gateway's id in a string.\n *\n * This function can replace the input string with a new one. It assumes\n * the input string is dynamically allocted and can be free()ed safely.\n *\n * This function must be called with the CONFIG_LOCK held.\n */\nstatic void\niptables_insert_gateway_id(char **input)\n{\n\tchar *token;\n\tconst s_config *config;\n\tchar *buffer;\n\n\tif (strstr(*input, \"$ID$\")==NULL)\n\t\treturn;\n\n\n\twhile ((token=strstr(*input, \"$ID$\"))!=NULL)\n\t\t/* This string may look odd but it's standard POSIX and ISO C */\n\t\tmemcpy(token, \"%1$s\", 4);\n\n\tconfig = config_get_config();\n\tsafe_asprintf(&buffer, *input, config->gw_interface);\n\n\tfree(*input);\n\t*input=buffer;\n}\n\n/** @internal \n * */\nstatic int\niptables_do_command(const char *format, ...)\n{\n\tva_list vlist;\n\tchar *fmt_cmd;\n\tchar *cmd;\n\tint rc;\n\n\tva_start(vlist, format);\n\tsafe_vasprintf(&fmt_cmd, format, vlist);\n\tva_end(vlist);\n\n\tsafe_asprintf(&cmd, \"iptables %s\", fmt_cmd);\n\tfree(fmt_cmd);\n\n\tiptables_insert_gateway_id(&cmd);\n\n\tdebug(LOG_DEBUG, \"Executing command: %s\", cmd);\n\n\trc = execute(cmd, fw_quiet);\n\n\tif (rc!=0) {\n\t\t// If quiet, do not display the error\n\t\tif (fw_quiet == 0)\n\t\t\tdebug(LOG_ERR, \"iptables command failed(%d): %s\", rc, cmd);\n\t\telse if (fw_quiet == 1)\n\t\t\tdebug(LOG_DEBUG, \"iptables command failed(%d): %s\", rc, cmd);\n\t}\n\n\tfree(cmd);\n\n\treturn rc;\n}\n\n/**\n * @internal\n * Compiles a struct definition of a firewall rule into a valid iptables\n * command.\n * @arg table Table containing the chain.\n * @arg chain Chain that the command will be (-A)ppended to.\n * @arg rule Definition of a rule into a struct, from conf.c.\n */\n\tstatic char *\niptables_compile(const char * table, const char *chain, const t_firewall_rule *rule)\n{\n\tchar\tcommand[MAX_BUF],\n\t\t*mode;\n\n\tmemset(command, 0, MAX_BUF);\n\n\tswitch (rule->target){\n\tcase TARGET_DROP:\n\t\tmode = safe_strdup(\"DROP\");\n\t\tbreak;\n\tcase TARGET_REJECT:\n\t\tmode = safe_strdup(\"REJECT\");\n\t\tbreak;\n\tcase TARGET_ACCEPT:\n\t\tmode = safe_strdup(\"ACCEPT\");\n\t\tbreak;\n\tcase TARGET_LOG:\n\t\tmode = safe_strdup(\"LOG\");\n\t\tbreak;\n\tcase TARGET_ULOG:\n\t\tmode = safe_strdup(\"ULOG\");\n\t\tbreak;\n\t}\n\n\tsnprintf(command, sizeof(command),  \"-t %s -A %s \",table, chain);\n\tif (rule->mask != NULL) {\n\t\tsnprintf((command + strlen(command)), (sizeof(command) - \n\t\t\t\t\tstrlen(command)), \"-d %s \", rule->mask);\n\t}\n\tif (rule->protocol != NULL) {\n\t\tsnprintf((command + strlen(command)), (sizeof(command) -\n\t\t\t\t\tstrlen(command)), \"-p %s \", rule->protocol);\n\t}\n\tif (rule->port != NULL) {\n\t\tsnprintf((command + strlen(command)), (sizeof(command) -\n\t\t\t\t\tstrlen(command)), \"--dport %s \", rule->port);\n\t}\n\tsnprintf((command + strlen(command)), (sizeof(command) - \n\t\t\t\tstrlen(command)), \"-j %s\", mode);\n\n\tfree(mode);\n\n\t/* XXX The buffer command, an automatic variable, will get cleaned\n\t * off of the stack when we return, so we strdup() it. */\n\treturn(safe_strdup(command));\n}\n\n/**\n * @internal\n * Load all the rules in a rule set.\n * @arg ruleset Name of the ruleset\n * @arg table Table containing the chain.\n * @arg chain IPTables chain the rules go into\n */\n\tstatic void\niptables_load_ruleset(const char * table, const char *ruleset, const char *chain)\n{\n\tt_firewall_rule\t\t*rule;\n\tchar\t\t\t*cmd;\n\n\tdebug(LOG_DEBUG, \"Load ruleset %s into table %s, chain %s\", ruleset, table, chain);\n\n\tfor (rule = get_ruleset(ruleset); rule != NULL; rule = rule->next) {\n\t\tcmd = iptables_compile(table, chain, rule);\n\t\tdebug(LOG_DEBUG, \"Loading rule \\\"%s\\\" into table %s, chain %s\", cmd, table, chain);\n\t\tiptables_do_command(cmd);\n\t\tfree(cmd);\n\t}\n\n\tdebug(LOG_DEBUG, \"Ruleset %s loaded into table %s, chain %s\", ruleset, table, chain);\n}\n\n\tvoid\niptables_fw_clear_authservers(void)\n{\n\tiptables_do_command(\"-t filter -F \" TABLE_WIFIDOG_AUTHSERVERS);\n\tiptables_do_command(\"-t nat -F \" TABLE_WIFIDOG_AUTHSERVERS);\n}\n\n\tvoid\niptables_fw_set_authservers(void)\n{\n\tconst s_config *config;\n\tt_auth_serv *auth_server;\n\n\tconfig = config_get_config();\n\n\tfor (auth_server = config->auth_servers; auth_server != NULL; auth_server = auth_server->next) {\n\t\tif (auth_server->last_ip && strcmp(auth_server->last_ip, \"0.0.0.0\") != 0) {\n\t\t\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_AUTHSERVERS \" -d %s -j ACCEPT\", auth_server->last_ip);\n\t\t\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_AUTHSERVERS \" -d %s -j ACCEPT\", auth_server->last_ip);\n\t\t}\n\t}\n\n}\n\n/** Initialize the firewall rules\n*/\n\tint\niptables_fw_init(void)\n{\n\tconst s_config *config;\n\tchar * ext_interface = NULL;\n\tint gw_port = 0;\n\tt_trusted_mac *p;\n\tint proxy_port;\n\tfw_quiet = 0;\n\n\tLOCK_CONFIG();\n\tconfig = config_get_config();\n\tgw_port = config->gw_port;\n\tif (config->external_interface) {\n\t\text_interface = safe_strdup(config->external_interface);\n\t} else {\n\t\text_interface = get_ext_iface();\n\t}\n\n\tif (ext_interface == NULL) {\n\t\tUNLOCK_CONFIG();\n\t\tdebug(LOG_ERR, \"FATAL: no external interface\");\n\t\treturn 0;\n\t}\n\t/*\n\t *\n\t * Everything in the MANGLE table\n\t *\n\t */\n\n\t/* Create new chains */\n\tiptables_do_command(\"-t mangle -N \" TABLE_WIFIDOG_TRUSTED);\n\tiptables_do_command(\"-t mangle -N \" TABLE_WIFIDOG_OUTGOING);\n\tiptables_do_command(\"-t mangle -N \" TABLE_WIFIDOG_INCOMING);\n\n\t/* Assign links and rules to these new chains */\n\tiptables_do_command(\"-t mangle -I PREROUTING 1 -i %s -j \" TABLE_WIFIDOG_OUTGOING, config->gw_interface);\n\tiptables_do_command(\"-t mangle -I PREROUTING 1 -i %s -j \" TABLE_WIFIDOG_TRUSTED, config->gw_interface);//this rule will be inserted before the prior one\n\tiptables_do_command(\"-t mangle -I POSTROUTING 1 -o %s -j \" TABLE_WIFIDOG_INCOMING, config->gw_interface);\n\n\tfor (p = config->trustedmaclist; p != NULL; p = p->next)\n\t\tiptables_do_command(\"-t mangle -A \" TABLE_WIFIDOG_TRUSTED \" -m mac --mac-source %s -j MARK --set-mark %d\", p->mac, FW_MARK_KNOWN);\n\n\t/*\n\t *\n\t * Everything in the NAT table\n\t *\n\t */\n\n\t/* Create new chains */\n\tiptables_do_command(\"-t nat -N \" TABLE_WIFIDOG_OUTGOING);\n\tiptables_do_command(\"-t nat -N \" TABLE_WIFIDOG_WIFI_TO_ROUTER);\n\tiptables_do_command(\"-t nat -N \" TABLE_WIFIDOG_WIFI_TO_INTERNET);\n\tiptables_do_command(\"-t nat -N \" TABLE_WIFIDOG_GLOBAL);\n\tiptables_do_command(\"-t nat -N \" TABLE_WIFIDOG_UNKNOWN);\n\tiptables_do_command(\"-t nat -N \" TABLE_WIFIDOG_AUTHSERVERS);\n\n\t/* Assign links and rules to these new chains */\n\tiptables_do_command(\"-t nat -A PREROUTING -i %s -j \" TABLE_WIFIDOG_OUTGOING, config->gw_interface);\n\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_OUTGOING \" -d %s -j \" TABLE_WIFIDOG_WIFI_TO_ROUTER, config->gw_address);\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_ROUTER \" -j ACCEPT\");\n\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_OUTGOING \" -j \" TABLE_WIFIDOG_WIFI_TO_INTERNET);\n\n\tif((proxy_port=config_get_config()->proxy_port) != 0){\n\t\tdebug(LOG_DEBUG,\"Proxy port set, setting proxy rule\");\n\t\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -p tcp --dport 80 -m mark --mark 0x%u -j REDIRECT --to-port %u\", FW_MARK_KNOWN, proxy_port);\n\t\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -p tcp --dport 80 -m mark --mark 0x%u -j REDIRECT --to-port %u\", FW_MARK_PROBATION, proxy_port);\n\t}\n\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u -j ACCEPT\", FW_MARK_KNOWN);\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u -j ACCEPT\", FW_MARK_PROBATION);\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -j \" TABLE_WIFIDOG_UNKNOWN);\n\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_UNKNOWN \" -j \" TABLE_WIFIDOG_AUTHSERVERS);\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_UNKNOWN \" -j \" TABLE_WIFIDOG_GLOBAL);\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_UNKNOWN \" -p tcp --dport 80 -j REDIRECT --to-ports %d\", gw_port);\n\n\n\t/*\n\t *\n\t * Everything in the FILTER table\n\t *\n\t */\n\n\t/* Create new chains */\n\tiptables_do_command(\"-t filter -N \" TABLE_WIFIDOG_WIFI_TO_INTERNET);\n\tiptables_do_command(\"-t filter -N \" TABLE_WIFIDOG_AUTHSERVERS);\n\tiptables_do_command(\"-t filter -N \" TABLE_WIFIDOG_LOCKED);\n\tiptables_do_command(\"-t filter -N \" TABLE_WIFIDOG_GLOBAL);\n\tiptables_do_command(\"-t filter -N \" TABLE_WIFIDOG_VALIDATE);\n\tiptables_do_command(\"-t filter -N \" TABLE_WIFIDOG_KNOWN);\n\tiptables_do_command(\"-t filter -N \" TABLE_WIFIDOG_UNKNOWN);\n\n\t/* Assign links and rules to these new chains */\n\n\t/* Insert at the beginning */\n\tiptables_do_command(\"-t filter -I FORWARD -i %s -j \" TABLE_WIFIDOG_WIFI_TO_INTERNET, config->gw_interface);\n\n\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m state --state INVALID -j DROP\");\n\n\t/* XXX: Why this? it means that connections setup after authentication\n\t   stay open even after the connection is done... \n\t   iptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m state --state RELATED,ESTABLISHED -j ACCEPT\");*/\n\n\t//Won't this rule NEVER match anyway?!?!? benoitg, 2007-06-23\n\t//iptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -i %s -m state --state NEW -j DROP\", ext_interface);\n\n\t/* TCPMSS rule for PPPoE */\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -o %s -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu\", ext_interface);\n\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -j \" TABLE_WIFIDOG_AUTHSERVERS);\n\tiptables_fw_set_authservers();\n\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u -j \" TABLE_WIFIDOG_LOCKED, FW_MARK_LOCKED);\n\tiptables_load_ruleset(\"filter\", \"locked-users\", TABLE_WIFIDOG_LOCKED);\n\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -j \" TABLE_WIFIDOG_GLOBAL);\n\tiptables_load_ruleset(\"filter\", \"global\", TABLE_WIFIDOG_GLOBAL);\n\tiptables_load_ruleset(\"nat\", \"global\", TABLE_WIFIDOG_GLOBAL);\n\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u -j \" TABLE_WIFIDOG_VALIDATE, FW_MARK_PROBATION);\n\tiptables_load_ruleset(\"filter\", \"validating-users\", TABLE_WIFIDOG_VALIDATE);\n\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u -j \" TABLE_WIFIDOG_KNOWN, FW_MARK_KNOWN);\n\tiptables_load_ruleset(\"filter\", \"known-users\", TABLE_WIFIDOG_KNOWN);\n\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -j \" TABLE_WIFIDOG_UNKNOWN);\n\tiptables_load_ruleset(\"filter\", \"unknown-users\", TABLE_WIFIDOG_UNKNOWN);\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_UNKNOWN \" -j REJECT --reject-with icmp-port-unreachable\");\n\n\tUNLOCK_CONFIG();\n\treturn 1;\n}\n\n/** Remove the firewall rules\n * This is used when we do a clean shutdown of WiFiDog and when it starts to make\n * sure there are no rules left over\n */\n\tint\niptables_fw_destroy(void)\n{\n\tfw_quiet = 1;\n\n\tdebug(LOG_DEBUG, \"Destroying our iptables entries\");\n\n\t/*\n\t *\n\t * Everything in the MANGLE table\n\t *\n\t */\n\tdebug(LOG_DEBUG, \"Destroying chains in the MANGLE table\");\n\tiptables_fw_destroy_mention(\"mangle\", \"PREROUTING\", TABLE_WIFIDOG_TRUSTED);\n\tiptables_fw_destroy_mention(\"mangle\", \"PREROUTING\", TABLE_WIFIDOG_OUTGOING);\n\tiptables_fw_destroy_mention(\"mangle\", \"POSTROUTING\", TABLE_WIFIDOG_INCOMING);\n\tiptables_do_command(\"-t mangle -F \" TABLE_WIFIDOG_TRUSTED);\n\tiptables_do_command(\"-t mangle -F \" TABLE_WIFIDOG_OUTGOING);\n\tiptables_do_command(\"-t mangle -F \" TABLE_WIFIDOG_INCOMING);\n\tiptables_do_command(\"-t mangle -X \" TABLE_WIFIDOG_TRUSTED);\n\tiptables_do_command(\"-t mangle -X \" TABLE_WIFIDOG_OUTGOING);\n\tiptables_do_command(\"-t mangle -X \" TABLE_WIFIDOG_INCOMING);\n\n\t/*\n\t *\n\t * Everything in the NAT table\n\t *\n\t */\n\tdebug(LOG_DEBUG, \"Destroying chains in the NAT table\");\n\tiptables_fw_destroy_mention(\"nat\", \"PREROUTING\", TABLE_WIFIDOG_OUTGOING);\n\tiptables_do_command(\"-t nat -F \" TABLE_WIFIDOG_AUTHSERVERS);\n\tiptables_do_command(\"-t nat -F \" TABLE_WIFIDOG_OUTGOING);\n\tiptables_do_command(\"-t nat -F \" TABLE_WIFIDOG_WIFI_TO_ROUTER);\n\tiptables_do_command(\"-t nat -F \" TABLE_WIFIDOG_WIFI_TO_INTERNET);\n\tiptables_do_command(\"-t nat -F \" TABLE_WIFIDOG_GLOBAL);\n\tiptables_do_command(\"-t nat -F \" TABLE_WIFIDOG_UNKNOWN);\n\tiptables_do_command(\"-t nat -X \" TABLE_WIFIDOG_AUTHSERVERS);\n\tiptables_do_command(\"-t nat -X \" TABLE_WIFIDOG_OUTGOING);\n\tiptables_do_command(\"-t nat -X \" TABLE_WIFIDOG_WIFI_TO_ROUTER);\n\tiptables_do_command(\"-t nat -X \" TABLE_WIFIDOG_WIFI_TO_INTERNET);\n\tiptables_do_command(\"-t nat -X \" TABLE_WIFIDOG_GLOBAL);\n\tiptables_do_command(\"-t nat -X \" TABLE_WIFIDOG_UNKNOWN);\n\n\t/*\n\t *\n\t * Everything in the FILTER table\n\t *\n\t */\n\tdebug(LOG_DEBUG, \"Destroying chains in the FILTER table\");\n\tiptables_fw_destroy_mention(\"filter\", \"FORWARD\", TABLE_WIFIDOG_WIFI_TO_INTERNET);\n\tiptables_do_command(\"-t filter -F \" TABLE_WIFIDOG_WIFI_TO_INTERNET);\n\tiptables_do_command(\"-t filter -F \" TABLE_WIFIDOG_AUTHSERVERS);\n\tiptables_do_command(\"-t filter -F \" TABLE_WIFIDOG_LOCKED);\n\tiptables_do_command(\"-t filter -F \" TABLE_WIFIDOG_GLOBAL);\n\tiptables_do_command(\"-t filter -F \" TABLE_WIFIDOG_VALIDATE);\n\tiptables_do_command(\"-t filter -F \" TABLE_WIFIDOG_KNOWN);\n\tiptables_do_command(\"-t filter -F \" TABLE_WIFIDOG_UNKNOWN);\n\tiptables_do_command(\"-t filter -X \" TABLE_WIFIDOG_WIFI_TO_INTERNET);\n\tiptables_do_command(\"-t filter -X \" TABLE_WIFIDOG_AUTHSERVERS);\n\tiptables_do_command(\"-t filter -X \" TABLE_WIFIDOG_LOCKED);\n\tiptables_do_command(\"-t filter -X \" TABLE_WIFIDOG_GLOBAL);\n\tiptables_do_command(\"-t filter -X \" TABLE_WIFIDOG_VALIDATE);\n\tiptables_do_command(\"-t filter -X \" TABLE_WIFIDOG_KNOWN);\n\tiptables_do_command(\"-t filter -X \" TABLE_WIFIDOG_UNKNOWN);\n\n\treturn 1;\n}\n\n/*\n * Helper for iptables_fw_destroy\n * @param table The table to search\n * @param chain The chain in that table to search\n * @param mention A word to find and delete in rules in the given table+chain\n */\nint\niptables_fw_destroy_mention(\n\t\tconst char * table,\n\t\tconst char * chain,\n\t\tconst char * mention\n\t\t) {\n\tFILE *p = NULL;\n\tchar *command = NULL;\n\tchar *command2 = NULL;\n\tchar line[MAX_BUF];\n\tchar rulenum[10];\n\tchar *victim = safe_strdup(mention);\n\tint deleted = 0;\n\n\tiptables_insert_gateway_id(&victim);\n\n\tdebug(LOG_DEBUG, \"Attempting to destroy all mention of %s from %s.%s\", victim, table, chain);\n\n\tsafe_asprintf(&command, \"iptables -t %s -L %s -n --line-numbers -v\", table, chain);\n\tiptables_insert_gateway_id(&command);\n\n\tif ((p = popen(command, \"r\"))) {\n\t\t/* Skip first 2 lines */\n\t\twhile (!feof(p) && fgetc(p) != '\\n');\n\t\twhile (!feof(p) && fgetc(p) != '\\n');\n\t\t/* Loop over entries */\n\t\twhile (fgets(line, sizeof(line), p)) {\n\t\t\t/* Look for victim */\n\t\t\tif (strstr(line, victim)) {\n\t\t\t\t/* Found victim - Get the rule number into rulenum*/\n\t\t\t\tif (sscanf(line, \"%9[0-9]\", rulenum) == 1) {\n\t\t\t\t\t/* Delete the rule: */\n\t\t\t\t\tdebug(LOG_DEBUG, \"Deleting rule %s from %s.%s because it mentions %s\", rulenum, table, chain, victim);\n\t\t\t\t\tsafe_asprintf(&command2, \"-t %s -D %s %s\", table, chain, rulenum);\n\t\t\t\t\tiptables_do_command(command2);\n\t\t\t\t\tfree(command2);\n\t\t\t\t\tdeleted = 1;\n\t\t\t\t\t/* Do not keep looping - the captured rulenums will no longer be accurate */\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tpclose(p);\n\t}\n\n\tfree(command);\n\tfree(victim);\n\n\tif (deleted) {\n\t\t/* Recurse just in case there are more in the same table+chain */\n\t\tiptables_fw_destroy_mention(table, chain, mention);\n\t}\n\n\treturn (deleted);\n}\n\n/** Set if a specific client has access through the firewall */\n\tint\niptables_fw_access(fw_access_t type, const char *ip, const char *mac, int tag)\n{\n\tint rc;\n\n\tfw_quiet = 0;\n\n\tswitch(type) {\n\t\tcase FW_ACCESS_ALLOW:\n\t\t\tiptables_do_command(\"-t mangle -A \" TABLE_WIFIDOG_OUTGOING \" -s %s -m mac --mac-source %s -j MARK --set-mark %d\", ip, mac, tag);\n\t\t\trc = iptables_do_command(\"-t mangle -A \" TABLE_WIFIDOG_INCOMING \" -d %s -j ACCEPT\", ip);\n\t\t\tbreak;\n\t\tcase FW_ACCESS_DENY:\n\t\t\tiptables_do_command(\"-t mangle -D \" TABLE_WIFIDOG_OUTGOING \" -s %s -m mac --mac-source %s -j MARK --set-mark %d\", ip, mac, tag);\n\t\t\trc = iptables_do_command(\"-t mangle -D \" TABLE_WIFIDOG_INCOMING \" -d %s -j ACCEPT\", ip);\n\t\t\tbreak;\n\t\tdefault:\n\t\t\trc = -1;\n\t\t\tbreak;\n\t}\n\n\treturn rc;\n}\n\n/** Update the counters of all the clients in the client list */\n\tint\niptables_fw_counters_update(void)\n{\n\tFILE *output;\n\tchar *script,\n\t     ip[16],\n\t     rc;\n\tunsigned long long int counter;\n\tt_client *p1;\n\tstruct in_addr tempaddr;\n\n\t/* Look for outgoing traffic */\n\tsafe_asprintf(&script, \"%s %s\", \"iptables\", \"-v -n -x -t mangle -L \" TABLE_WIFIDOG_OUTGOING);\n\tiptables_insert_gateway_id(&script);\n\toutput = popen(script, \"r\");\n\tfree(script);\n\tif (!output) {\n\t\tdebug(LOG_ERR, \"popen(): %s\", strerror(errno));\n\t\treturn -1;\n\t}\n\n\t/* skip the first two lines */\n\twhile (('\\n' != fgetc(output)) && !feof(output))\n\t\t;\n\twhile (('\\n' != fgetc(output)) && !feof(output))\n\t\t;\n\twhile (output && !(feof(output))) {\n\t\trc = fscanf(output, \"%*s %llu %*s %*s %*s %*s %*s %15[0-9.] %*s %*s %*s %*s %*s %*s\", &counter, ip);\n\t\t//rc = fscanf(output, \"%*s %llu %*s %*s %*s %*s %*s %15[0-9.] %*s %*s %*s %*s %*s 0x%*u\", &counter, ip);\n\t\tif (2 == rc && EOF != rc) {\n\t\t\t/* Sanity*/\n\t\t\tif (!inet_aton(ip, &tempaddr)) {\n\t\t\t\tdebug(LOG_WARNING, \"I was supposed to read an IP address but instead got [%s] - ignoring it\", ip);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdebug(LOG_DEBUG, \"Read outgoing traffic for %s: Bytes=%llu\", ip, counter);\n\t\t\tLOCK_CLIENT_LIST();\n\t\t\tif ((p1 = client_list_find_by_ip(ip))) {\n\t\t\t\tif ((p1->counters.outgoing - p1->counters.outgoing_history) < counter) {\n\t\t\t\t\tp1->counters.outgoing = p1->counters.outgoing_history + counter;\n\t\t\t\t\tp1->counters.last_updated = time(NULL);\n\t\t\t\t\tdebug(LOG_DEBUG, \"%s - Updated counter.outgoing to %llu bytes.  Updated last_updated to %d\", ip, counter, p1->counters.last_updated);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdebug(LOG_ERR, \"iptables_fw_counters_update(): Could not find %s in client list, this should not happen unless if the gateway crashed\", ip);\n\t\t\t\tdebug(LOG_ERR, \"Preventively deleting firewall rules for %s in table %s\", ip, TABLE_WIFIDOG_OUTGOING);\n\t\t\t\tiptables_fw_destroy_mention(\"mangle\", TABLE_WIFIDOG_OUTGOING, ip);\n\t\t\t\tdebug(LOG_ERR, \"Preventively deleting firewall rules for %s in table %s\", ip, TABLE_WIFIDOG_INCOMING);\n\t\t\t\tiptables_fw_destroy_mention(\"mangle\", TABLE_WIFIDOG_INCOMING, ip);\n\t\t\t}\n\t\t\tUNLOCK_CLIENT_LIST();\n\t\t}\n\t}\n\tpclose(output);\n\n\t/* Look for incoming traffic */\n\tsafe_asprintf(&script, \"%s %s\", \"iptables\", \"-v -n -x -t mangle -L \" TABLE_WIFIDOG_INCOMING);\n\tiptables_insert_gateway_id(&script);\n\toutput = popen(script, \"r\");\n\tfree(script);\n\tif (!output) {\n\t\tdebug(LOG_ERR, \"popen(): %s\", strerror(errno));\n\t\treturn -1;\n\t}\n\n\t/* skip the first two lines */\n\twhile (('\\n' != fgetc(output)) && !feof(output))\n\t\t;\n\twhile (('\\n' != fgetc(output)) && !feof(output))\n\t\t;\n\twhile (output && !(feof(output))) {\n\t\trc = fscanf(output, \"%*s %llu %*s %*s %*s %*s %*s %*s %15[0-9.]\", &counter, ip);\n\t\tif (2 == rc && EOF != rc) {\n\t\t\t/* Sanity*/\n\t\t\tif (!inet_aton(ip, &tempaddr)) {\n\t\t\t\tdebug(LOG_WARNING, \"I was supposed to read an IP address but instead got [%s] - ignoring it\", ip);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdebug(LOG_DEBUG, \"Read incoming traffic for %s: Bytes=%llu\", ip, counter);\n\t\t\tLOCK_CLIENT_LIST();\n\t\t\tif ((p1 = client_list_find_by_ip(ip))) {\n\t\t\t\tif ((p1->counters.incoming - p1->counters.incoming_history) < counter) {\n\t\t\t\t\tp1->counters.incoming = p1->counters.incoming_history + counter;\n\t\t\t\t\tdebug(LOG_DEBUG, \"%s - Updated counter.incoming to %llu bytes\", ip, counter);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdebug(LOG_ERR, \"iptables_fw_counters_update(): Could not find %s in client list, this should not happen unless if the gateway crashed\", ip);\n\t\t\t\tdebug(LOG_ERR, \"Preventively deleting firewall rules for %s in table %s\", ip, TABLE_WIFIDOG_OUTGOING);\n\t\t\t\tiptables_fw_destroy_mention(\"mangle\", TABLE_WIFIDOG_OUTGOING, ip);\n\t\t\t\tdebug(LOG_ERR, \"Preventively deleting firewall rules for %s in table %s\", ip, TABLE_WIFIDOG_INCOMING);\n\t\t\t\tiptables_fw_destroy_mention(\"mangle\", TABLE_WIFIDOG_INCOMING, ip);\n\t\t\t}\n\t\t\tUNLOCK_CLIENT_LIST();\n\t\t}\n\t}\n\tpclose(output);\n\n\treturn 1;\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/fw_iptables.c",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n \\********************************************************************/\n\n/* $Id$ */\n/** @internal\n  @file fw_iptables.c\n  @brief Firewall iptables functions\n  @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n */\n\n#define _GNU_SOURCE\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <stdarg.h>\n#include <syslog.h>\n#include <errno.h>\n#include <string.h>\n#include <pthread.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n\n#include \"common.h\"\n\n#include \"safe.h\"\n#include \"conf.h\"\n#include \"fw_iptables.h\"\n#include \"firewall.h\"\n#include \"debug.h\"\n#include \"util.h\"\n#include \"client_list.h\"\n\nstatic int iptables_do_command(const char *format, ...);\nstatic char *iptables_compile(const char *, const char *, const t_firewall_rule *);\nstatic void iptables_load_ruleset(const char *, const char *, const char *);\n\nextern pthread_mutex_t\tclient_list_mutex;\nextern pthread_mutex_t\tconfig_mutex;\n\n/**\nUsed to supress the error output of the firewall during destruction */ \nstatic int fw_quiet = 0;\n\n/** @internal\n * @brief Insert $ID$ with the gateway's id in a string.\n *\n * This function can replace the input string with a new one. It assumes\n * the input string is dynamically allocted and can be free()ed safely.\n *\n * This function must be called with the CONFIG_LOCK held.\n */\nstatic void\niptables_insert_gateway_id(char **input)\n{\n\tchar *token;\n\tconst s_config *config;\n\tchar *buffer;\n\n\tif (strstr(*input, \"$ID$\")==NULL)\n\t\treturn;\n\n\n\twhile ((token=strstr(*input, \"$ID$\"))!=NULL)\n\t\t/* This string may look odd but it's standard POSIX and ISO C */\n\t\tmemcpy(token, \"%1$s\", 4);\n\n\tconfig = config_get_config();\n\tsafe_asprintf(&buffer, *input, config->gw_interface);\n\n\tfree(*input);\n\t*input=buffer;\n}\n\n/** @internal \n * */\nstatic int\niptables_do_command(const char *format, ...)\n{\n\tva_list vlist;\n\tchar *fmt_cmd;\n\tchar *cmd;\n\tint rc;\n\n\tva_start(vlist, format);\n\tsafe_vasprintf(&fmt_cmd, format, vlist);\n\tva_end(vlist);\n\n\tsafe_asprintf(&cmd, \"iptables %s\", fmt_cmd);\n\tfree(fmt_cmd);\n\n\tiptables_insert_gateway_id(&cmd);\n\n\tdebug(LOG_DEBUG, \"Executing command: %s\", cmd);\n\n\trc = execute(cmd, fw_quiet);\n\n\tif (rc!=0) {\n\t\t// If quiet, do not display the error\n\t\tif (fw_quiet == 0)\n\t\t\tdebug(LOG_ERR, \"iptables command failed(%d): %s\", rc, cmd);\n\t\telse if (fw_quiet == 1)\n\t\t\tdebug(LOG_DEBUG, \"iptables command failed(%d): %s\", rc, cmd);\n\t}\n\n\tfree(cmd);\n\n\treturn rc;\n}\n\n/**\n * @internal\n * Compiles a struct definition of a firewall rule into a valid iptables\n * command.\n * @arg table Table containing the chain.\n * @arg chain Chain that the command will be (-A)ppended to.\n * @arg rule Definition of a rule into a struct, from conf.c.\n */\n\tstatic char *\niptables_compile(const char * table, const char *chain, const t_firewall_rule *rule)\n{\n\tchar\tcommand[MAX_BUF],\n\t\t*mode;\n\n\tmemset(command, 0, MAX_BUF);\n\n\tswitch (rule->target){\n\tcase TARGET_DROP:\n\t\tmode = safe_strdup(\"DROP\");\n\t\tbreak;\n\tcase TARGET_REJECT:\n\t\tmode = safe_strdup(\"REJECT\");\n\t\tbreak;\n\tcase TARGET_ACCEPT:\n\t\tmode = safe_strdup(\"ACCEPT\");\n\t\tbreak;\n\tcase TARGET_LOG:\n\t\tmode = safe_strdup(\"LOG\");\n\t\tbreak;\n\tcase TARGET_ULOG:\n\t\tmode = safe_strdup(\"ULOG\");\n\t\tbreak;\n\t}\n\n\tsnprintf(command, sizeof(command),  \"-t %s -A %s \",table, chain);\n\tif (rule->mask != NULL) {\n\t\tsnprintf((command + strlen(command)), (sizeof(command) - \n\t\t\t\t\tstrlen(command)), \"-d %s \", rule->mask);\n\t}\n\tif (rule->protocol != NULL) {\n\t\tsnprintf((command + strlen(command)), (sizeof(command) -\n\t\t\t\t\tstrlen(command)), \"-p %s \", rule->protocol);\n\t}\n\tif (rule->port != NULL) {\n\t\tsnprintf((command + strlen(command)), (sizeof(command) -\n\t\t\t\t\tstrlen(command)), \"--dport %s \", rule->port);\n\t}\n\tsnprintf((command + strlen(command)), (sizeof(command) - \n\t\t\t\tstrlen(command)), \"-j %s\", mode);\n\n\tfree(mode);\n\n\t/* XXX The buffer command, an automatic variable, will get cleaned\n\t * off of the stack when we return, so we strdup() it. */\n\treturn(safe_strdup(command));\n}\n\n/**\n * @internal\n * Load all the rules in a rule set.\n * @arg ruleset Name of the ruleset\n * @arg table Table containing the chain.\n * @arg chain IPTables chain the rules go into\n */\n\tstatic void\niptables_load_ruleset(const char * table, const char *ruleset, const char *chain)\n{\n\tt_firewall_rule\t\t*rule;\n\tchar\t\t\t*cmd;\n\n\tdebug(LOG_DEBUG, \"Load ruleset %s into table %s, chain %s\", ruleset, table, chain);\n\n\tfor (rule = get_ruleset(ruleset); rule != NULL; rule = rule->next) {\n\t\tcmd = iptables_compile(table, chain, rule);\n\t\tdebug(LOG_DEBUG, \"Loading rule \\\"%s\\\" into table %s, chain %s\", cmd, table, chain);\n\t\tiptables_do_command(cmd);\n\t\tfree(cmd);\n\t}\n\n\tdebug(LOG_DEBUG, \"Ruleset %s loaded into table %s, chain %s\", ruleset, table, chain);\n}\n\n\tvoid\niptables_fw_clear_authservers(void)\n{\n\tiptables_do_command(\"-t filter -F \" TABLE_WIFIDOG_AUTHSERVERS);\n\tiptables_do_command(\"-t nat -F \" TABLE_WIFIDOG_AUTHSERVERS);\n}\n\n\tvoid\niptables_fw_set_authservers(void)\n{\n\tconst s_config *config;\n\tt_auth_serv *auth_server;\n\n\tconfig = config_get_config();\n\n\tfor (auth_server = config->auth_servers; auth_server != NULL; auth_server = auth_server->next) {\n\t\tif (auth_server->last_ip && strcmp(auth_server->last_ip, \"0.0.0.0\") != 0) {\n\t\t\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_AUTHSERVERS \" -d %s -j ACCEPT\", auth_server->last_ip);\n\t\t\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_AUTHSERVERS \" -d %s -j ACCEPT\", auth_server->last_ip);\n\t\t}\n\t}\n\n}\n\n/** Initialize the firewall rules\n*/\n\tint\niptables_fw_init(void)\n{\n\tconst s_config *config;\n\tchar * ext_interface = NULL;\n\tint gw_port = 0;\n\tt_trusted_mac *p;\n\tint proxy_port;\n\tfw_quiet = 0;\n\n\tLOCK_CONFIG();\n\tconfig = config_get_config();\n\tgw_port = config->gw_port;\n\tif (config->external_interface) {\n\t\text_interface = safe_strdup(config->external_interface);\n\t} else {\n\t\text_interface = get_ext_iface();\n\t}\n\n\tif (ext_interface == NULL) {\n\t\tUNLOCK_CONFIG();\n\t\tdebug(LOG_ERR, \"FATAL: no external interface\");\n\t\treturn 0;\n\t}\n\t/*\n\t *\n\t * Everything in the MANGLE table\n\t *\n\t */\n\n\t/* Create new chains */\n\tiptables_do_command(\"-t mangle -N \" TABLE_WIFIDOG_TRUSTED);\n\tiptables_do_command(\"-t mangle -N \" TABLE_WIFIDOG_OUTGOING);\n\tiptables_do_command(\"-t mangle -N \" TABLE_WIFIDOG_INCOMING);\n\n\t/* Assign links and rules to these new chains */\n\tiptables_do_command(\"-t mangle -I PREROUTING 1 -i %s -j \" TABLE_WIFIDOG_OUTGOING, config->gw_interface);\n\tiptables_do_command(\"-t mangle -I PREROUTING 1 -i %s -j \" TABLE_WIFIDOG_TRUSTED, config->gw_interface);//this rule will be inserted before the prior one\n\tiptables_do_command(\"-t mangle -I POSTROUTING 1 -o %s -j \" TABLE_WIFIDOG_INCOMING, config->gw_interface);\n\n\tfor (p = config->trustedmaclist; p != NULL; p = p->next)\n\t\t//iptables_do_command(\"-t mangle -A \" TABLE_WIFIDOG_TRUSTED \" -m mac --mac-source %s -j MARK --set-mark %d\", p->mac, FW_MARK_KNOWN);\n\t\t//iptables_do_command(\"-t mangle -A \" TABLE_WIFIDOG_TRUSTED \" -m mac --mac-source %s -j MARK --set-mark 0x%d00/0xff00\", p->mac, FW_MARK_KNOWN);\t//wiwiz\n\t\tiptables_do_command(\"-t mangle -A \" TABLE_WIFIDOG_TRUSTED \" -m mac --mac-source %s -j MARK --set-mark 0x%d/0x00ff\", p->mac, FW_MARK_KNOWN);\t//wiwiz\n\n\t/*\n\t *\n\t * Everything in the NAT table\n\t *\n\t */\n\n\t/* Create new chains */\n\tiptables_do_command(\"-t nat -N \" TABLE_WIFIDOG_OUTGOING);\n\tiptables_do_command(\"-t nat -N \" TABLE_WIFIDOG_WIFI_TO_ROUTER);\n\tiptables_do_command(\"-t nat -N \" TABLE_WIFIDOG_WIFI_TO_INTERNET);\n\tiptables_do_command(\"-t nat -N \" TABLE_WIFIDOG_GLOBAL);\n\tiptables_do_command(\"-t nat -N \" TABLE_WIFIDOG_UNKNOWN);\n\tiptables_do_command(\"-t nat -N \" TABLE_WIFIDOG_AUTHSERVERS);\n\n\t/* Assign links and rules to these new chains */\n\tiptables_do_command(\"-t nat -A PREROUTING -i %s -j \" TABLE_WIFIDOG_OUTGOING, config->gw_interface);\n\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_OUTGOING \" -d %s -j \" TABLE_WIFIDOG_WIFI_TO_ROUTER, config->gw_address);\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_ROUTER \" -j ACCEPT\");\n\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_OUTGOING \" -j \" TABLE_WIFIDOG_WIFI_TO_INTERNET);\n\n\tif((proxy_port=config_get_config()->proxy_port) != 0){\n\t\tdebug(LOG_DEBUG,\"Proxy port set, setting proxy rule\");\n//\t\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -p tcp --dport 80 -m mark --mark 0x%u -j REDIRECT --to-port %u\", FW_MARK_KNOWN, proxy_port);\n//\t\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -p tcp --dport 80 -m mark --mark 0x%u -j REDIRECT --to-port %u\", FW_MARK_PROBATION, proxy_port);\n//\t\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -p tcp --dport 80 -m mark --mark 0x%u00/0xff00 -j REDIRECT --to-port %u\", FW_MARK_KNOWN, proxy_port);\t\t//wiwiz\n//\t\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -p tcp --dport 80 -m mark --mark 0x%u00/0xff00 -j REDIRECT --to-port %u\", FW_MARK_PROBATION, proxy_port);\t//wiwiz\n\t\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -p tcp --dport 80 -m mark --mark 0x%u/0x00ff -j REDIRECT --to-port %u\", FW_MARK_KNOWN, proxy_port);\t\t//wiwiz\n\t\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -p tcp --dport 80 -m mark --mark 0x%u/0x00ff -j REDIRECT --to-port %u\", FW_MARK_PROBATION, proxy_port);\t//wiwiz\n\n\t}\n\n//\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u -j ACCEPT\", FW_MARK_KNOWN);\n//\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u -j ACCEPT\", FW_MARK_PROBATION);\n//\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u00/0xff00 -j ACCEPT\", FW_MARK_KNOWN);\t\t//wiwiz\n//\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u00/0xff00 -j ACCEPT\", FW_MARK_PROBATION);\t//wiwiz\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u/0x00ff -j ACCEPT\", FW_MARK_KNOWN);\t\t//wiwiz\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u/0x00ff -j ACCEPT\", FW_MARK_PROBATION);\t//wiwiz\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -j \" TABLE_WIFIDOG_UNKNOWN);\n\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_UNKNOWN \" -j \" TABLE_WIFIDOG_AUTHSERVERS);\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_UNKNOWN \" -j \" TABLE_WIFIDOG_GLOBAL);\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_UNKNOWN \" -p tcp --dport 80 -j REDIRECT --to-ports %d\", gw_port);\n\tiptables_do_command(\"-t nat -A \" TABLE_WIFIDOG_UNKNOWN \" -p tcp --dport 443 -j REDIRECT --to-ports %d\", 443);\n\n\n\t/*\n\t *\n\t * Everything in the FILTER table\n\t *\n\t */\n\n\t/* Create new chains */\n\tiptables_do_command(\"-t filter -N \" TABLE_WIFIDOG_WIFI_TO_INTERNET);\n\tiptables_do_command(\"-t filter -N \" TABLE_WIFIDOG_AUTHSERVERS);\n\tiptables_do_command(\"-t filter -N \" TABLE_WIFIDOG_LOCKED);\n\tiptables_do_command(\"-t filter -N \" TABLE_WIFIDOG_GLOBAL);\n\tiptables_do_command(\"-t filter -N \" TABLE_WIFIDOG_VALIDATE);\n\tiptables_do_command(\"-t filter -N \" TABLE_WIFIDOG_KNOWN);\n\tiptables_do_command(\"-t filter -N \" TABLE_WIFIDOG_UNKNOWN);\n\n\t/* Assign links and rules to these new chains */\n\n\t/* Insert at the beginning */\n\tiptables_do_command(\"-t filter -I FORWARD -i %s -j \" TABLE_WIFIDOG_WIFI_TO_INTERNET, config->gw_interface);\n\n\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m state --state INVALID -j DROP\");\n\n\t/* XXX: Why this? it means that connections setup after authentication\n\t   stay open even after the connection is done... \n\t   iptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m state --state RELATED,ESTABLISHED -j ACCEPT\");*/\n\n\t//Won't this rule NEVER match anyway?!?!? benoitg, 2007-06-23\n\t//iptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -i %s -m state --state NEW -j DROP\", ext_interface);\n\n\t/* TCPMSS rule for PPPoE */\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -o %s -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu\", ext_interface);\n\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -j \" TABLE_WIFIDOG_AUTHSERVERS);\n\tiptables_fw_set_authservers();\n\n\t//iptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u -j \" TABLE_WIFIDOG_LOCKED, FW_MARK_LOCKED);\n\t//iptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u00/0xff00 -j \" TABLE_WIFIDOG_LOCKED, FW_MARK_LOCKED);\t//wiwiz\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u/0x00ff -j \" TABLE_WIFIDOG_LOCKED, FW_MARK_LOCKED);\t//wiwiz\n\tiptables_load_ruleset(\"filter\", \"locked-users\", TABLE_WIFIDOG_LOCKED);\n\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -j \" TABLE_WIFIDOG_GLOBAL);\n\tiptables_load_ruleset(\"filter\", \"global\", TABLE_WIFIDOG_GLOBAL);\n\tiptables_load_ruleset(\"nat\", \"global\", TABLE_WIFIDOG_GLOBAL);\n\n//\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u -j \" TABLE_WIFIDOG_VALIDATE, FW_MARK_PROBATION);\n//\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u00/0xff00 -j \" TABLE_WIFIDOG_VALIDATE, FW_MARK_PROBATION);\t//wiwiz\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u/0x00ff -j \" TABLE_WIFIDOG_VALIDATE, FW_MARK_PROBATION);\t//wiwiz\n\tiptables_load_ruleset(\"filter\", \"validating-users\", TABLE_WIFIDOG_VALIDATE);\n\n//\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u -j \" TABLE_WIFIDOG_KNOWN, FW_MARK_KNOWN);\n//\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u00/0xff00 -j \" TABLE_WIFIDOG_KNOWN, FW_MARK_KNOWN);\t//wiwiz\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -m mark --mark 0x%u/0x00ff -j \" TABLE_WIFIDOG_KNOWN, FW_MARK_KNOWN);\t//wiwiz\n\tiptables_load_ruleset(\"filter\", \"known-users\", TABLE_WIFIDOG_KNOWN);\n\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_WIFI_TO_INTERNET \" -j \" TABLE_WIFIDOG_UNKNOWN);\n\tiptables_load_ruleset(\"filter\", \"unknown-users\", TABLE_WIFIDOG_UNKNOWN);\n\tiptables_do_command(\"-t filter -A \" TABLE_WIFIDOG_UNKNOWN \" -j REJECT --reject-with icmp-port-unreachable\");\n\n\tUNLOCK_CONFIG();\n\treturn 1;\n}\n\n/** Remove the firewall rules\n * This is used when we do a clean shutdown of WiFiDog and when it starts to make\n * sure there are no rules left over\n */\n\tint\niptables_fw_destroy(void)\n{\n\tfw_quiet = 1;\n\n\tdebug(LOG_DEBUG, \"Destroying our iptables entries\");\n\n\t/*\n\t *\n\t * Everything in the MANGLE table\n\t *\n\t */\n\tdebug(LOG_DEBUG, \"Destroying chains in the MANGLE table\");\n\tiptables_fw_destroy_mention(\"mangle\", \"PREROUTING\", TABLE_WIFIDOG_TRUSTED);\n\tiptables_fw_destroy_mention(\"mangle\", \"PREROUTING\", TABLE_WIFIDOG_OUTGOING);\n\tiptables_fw_destroy_mention(\"mangle\", \"POSTROUTING\", TABLE_WIFIDOG_INCOMING);\n\tiptables_do_command(\"-t mangle -F \" TABLE_WIFIDOG_TRUSTED);\n\tiptables_do_command(\"-t mangle -F \" TABLE_WIFIDOG_OUTGOING);\n\tiptables_do_command(\"-t mangle -F \" TABLE_WIFIDOG_INCOMING);\n\tiptables_do_command(\"-t mangle -X \" TABLE_WIFIDOG_TRUSTED);\n\tiptables_do_command(\"-t mangle -X \" TABLE_WIFIDOG_OUTGOING);\n\tiptables_do_command(\"-t mangle -X \" TABLE_WIFIDOG_INCOMING);\n\n\t/*\n\t *\n\t * Everything in the NAT table\n\t *\n\t */\n\tdebug(LOG_DEBUG, \"Destroying chains in the NAT table\");\n\tiptables_fw_destroy_mention(\"nat\", \"PREROUTING\", TABLE_WIFIDOG_OUTGOING);\n\tiptables_do_command(\"-t nat -F \" TABLE_WIFIDOG_AUTHSERVERS);\n\tiptables_do_command(\"-t nat -F \" TABLE_WIFIDOG_OUTGOING);\n\tiptables_do_command(\"-t nat -F \" TABLE_WIFIDOG_WIFI_TO_ROUTER);\n\tiptables_do_command(\"-t nat -F \" TABLE_WIFIDOG_WIFI_TO_INTERNET);\n\tiptables_do_command(\"-t nat -F \" TABLE_WIFIDOG_GLOBAL);\n\tiptables_do_command(\"-t nat -F \" TABLE_WIFIDOG_UNKNOWN);\n\tiptables_do_command(\"-t nat -X \" TABLE_WIFIDOG_AUTHSERVERS);\n\tiptables_do_command(\"-t nat -X \" TABLE_WIFIDOG_OUTGOING);\n\tiptables_do_command(\"-t nat -X \" TABLE_WIFIDOG_WIFI_TO_ROUTER);\n\tiptables_do_command(\"-t nat -X \" TABLE_WIFIDOG_WIFI_TO_INTERNET);\n\tiptables_do_command(\"-t nat -X \" TABLE_WIFIDOG_GLOBAL);\n\tiptables_do_command(\"-t nat -X \" TABLE_WIFIDOG_UNKNOWN);\n\n\t/*\n\t *\n\t * Everything in the FILTER table\n\t *\n\t */\n\tdebug(LOG_DEBUG, \"Destroying chains in the FILTER table\");\n\tiptables_fw_destroy_mention(\"filter\", \"FORWARD\", TABLE_WIFIDOG_WIFI_TO_INTERNET);\n\tiptables_do_command(\"-t filter -F \" TABLE_WIFIDOG_WIFI_TO_INTERNET);\n\tiptables_do_command(\"-t filter -F \" TABLE_WIFIDOG_AUTHSERVERS);\n\tiptables_do_command(\"-t filter -F \" TABLE_WIFIDOG_LOCKED);\n\tiptables_do_command(\"-t filter -F \" TABLE_WIFIDOG_GLOBAL);\n\tiptables_do_command(\"-t filter -F \" TABLE_WIFIDOG_VALIDATE);\n\tiptables_do_command(\"-t filter -F \" TABLE_WIFIDOG_KNOWN);\n\tiptables_do_command(\"-t filter -F \" TABLE_WIFIDOG_UNKNOWN);\n\tiptables_do_command(\"-t filter -X \" TABLE_WIFIDOG_WIFI_TO_INTERNET);\n\tiptables_do_command(\"-t filter -X \" TABLE_WIFIDOG_AUTHSERVERS);\n\tiptables_do_command(\"-t filter -X \" TABLE_WIFIDOG_LOCKED);\n\tiptables_do_command(\"-t filter -X \" TABLE_WIFIDOG_GLOBAL);\n\tiptables_do_command(\"-t filter -X \" TABLE_WIFIDOG_VALIDATE);\n\tiptables_do_command(\"-t filter -X \" TABLE_WIFIDOG_KNOWN);\n\tiptables_do_command(\"-t filter -X \" TABLE_WIFIDOG_UNKNOWN);\n\n\treturn 1;\n}\n\n/*\n * Helper for iptables_fw_destroy\n * @param table The table to search\n * @param chain The chain in that table to search\n * @param mention A word to find and delete in rules in the given table+chain\n */\nint\niptables_fw_destroy_mention(\n\t\tconst char * table,\n\t\tconst char * chain,\n\t\tconst char * mention\n\t\t) {\n\tFILE *p = NULL;\n\tchar *command = NULL;\n\tchar *command2 = NULL;\n\tchar line[MAX_BUF];\n\tchar rulenum[10];\n\tchar *victim = safe_strdup(mention);\n\tint deleted = 0;\n\n\tiptables_insert_gateway_id(&victim);\n\n\tdebug(LOG_DEBUG, \"Attempting to destroy all mention of %s from %s.%s\", victim, table, chain);\n\n\tsafe_asprintf(&command, \"iptables -t %s -L %s -n --line-numbers -v\", table, chain);\n\tiptables_insert_gateway_id(&command);\n\n\tif ((p = popen(command, \"r\"))) {\n\t\t/* Skip first 2 lines */\n\t\twhile (!feof(p) && fgetc(p) != '\\n');\n\t\twhile (!feof(p) && fgetc(p) != '\\n');\n\t\t/* Loop over entries */\n\t\twhile (fgets(line, sizeof(line), p)) {\n\t\t\t/* Look for victim */\n\t\t\tif (strstr(line, victim)) {\n\t\t\t\t/* Found victim - Get the rule number into rulenum*/\n\t\t\t\tif (sscanf(line, \"%9[0-9]\", rulenum) == 1) {\n\t\t\t\t\t/* Delete the rule: */\n\t\t\t\t\tdebug(LOG_DEBUG, \"Deleting rule %s from %s.%s because it mentions %s\", rulenum, table, chain, victim);\n\t\t\t\t\tsafe_asprintf(&command2, \"-t %s -D %s %s\", table, chain, rulenum);\n\t\t\t\t\tiptables_do_command(command2);\n\t\t\t\t\tfree(command2);\n\t\t\t\t\tdeleted = 1;\n\t\t\t\t\t/* Do not keep looping - the captured rulenums will no longer be accurate */\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tpclose(p);\n\t}\n\n\tfree(command);\n\tfree(victim);\n\n\tif (deleted) {\n\t\t/* Recurse just in case there are more in the same table+chain */\n\t\tiptables_fw_destroy_mention(table, chain, mention);\n\t}\n\n\treturn (deleted);\n}\n\n/** Set if a specific client has access through the firewall */\n\tint\niptables_fw_access(fw_access_t type, const char *ip, const char *mac, int tag)\n{\n\tint rc;\n\n\tfw_quiet = 0;\n\n\tswitch(type) {\n\t\tcase FW_ACCESS_ALLOW:\n//\t\t\tiptables_do_command(\"-t mangle -A \" TABLE_WIFIDOG_OUTGOING \" -s %s -m mac --mac-source %s -j MARK --set-mark %d\", ip, mac, tag);\n\t\t\t//iptables_do_command(\"-t mangle -A \" TABLE_WIFIDOG_OUTGOING \" -s %s -m mac --mac-source %s -j MARK --set-mark 0x%d00/0xff00\", ip, mac, tag);\t//wiwiz\n\t\t\tiptables_do_command(\"-t mangle -A \" TABLE_WIFIDOG_OUTGOING \" -s %s -m mac --mac-source %s -j MARK --set-mark 0x%d/0x00ff\", ip, mac, tag);\t//wiwiz\n\t\t\trc = iptables_do_command(\"-t mangle -A \" TABLE_WIFIDOG_INCOMING \" -d %s -j ACCEPT\", ip);\n\t\t\tbreak;\n\t\tcase FW_ACCESS_DENY:\n//\t\t\tiptables_do_command(\"-t mangle -D \" TABLE_WIFIDOG_OUTGOING \" -s %s -m mac --mac-source %s -j MARK --set-mark %d\", ip, mac, tag);\n\t\t\t//iptables_do_command(\"-t mangle -D \" TABLE_WIFIDOG_OUTGOING \" -s %s -m mac --mac-source %s -j MARK --set-mark 0x%d00/0xff00\", ip, mac, tag);\t//wiwiz\n\t\t\tiptables_do_command(\"-t mangle -D \" TABLE_WIFIDOG_OUTGOING \" -s %s -m mac --mac-source %s -j MARK --set-mark 0x%d/0x00ff\", ip, mac, tag);\t//wiwiz\n\t\t\trc = iptables_do_command(\"-t mangle -D \" TABLE_WIFIDOG_INCOMING \" -d %s -j ACCEPT\", ip);\n\n\t\t\t//wiwiz add start\n\t\t\tfor(int i = 0; i < 10; i++) {\n\t\t\t\t//iptables_do_command(\"-t mangle -D \" TABLE_WIFIDOG_OUTGOING \" -s %s -m mac --mac-source %s -j MARK --set-mark 0x%d00/0xff00\", ip, mac, tag);\n\t\t\t\tiptables_do_command(\"-t mangle -D \" TABLE_WIFIDOG_OUTGOING \" -s %s -m mac --mac-source %s -j MARK --set-mark 0x%d/0x00ff\", ip, mac, tag);\n\t\t\t\tiptables_do_command(\"-t mangle -D \" TABLE_WIFIDOG_INCOMING \" -d %s -j ACCEPT\", ip);\n\t\t\t}\n\t\t\t//wiwiz add end\n\t\t\t\n\t\t\tbreak;\n\t\tdefault:\n\t\t\trc = -1;\n\t\t\tbreak;\n\t}\n\n\treturn rc;\n}\n\n/** Update the counters of all the clients in the client list */\n\tint\niptables_fw_counters_update(void)\n{\n\tFILE *output;\n\tchar *script,\n\t     ip[16],\n\t     rc;\n\tunsigned long long int counter;\n\tt_client *p1;\n\tstruct in_addr tempaddr;\n\n\t/* Look for outgoing traffic */\n\t/* safe_asprintf(&script, \"%s %s\", \"iptables\", \"-v -n -x -t mangle -L \" TABLE_WIFIDOG_OUTGOING); wiwiz deleted*/\n\tsafe_asprintf(&script, \"%s %s\", \"iptables\", \"-v -n -x -t mangle -L \" TABLE_WIFIDOG_OUTGOING \" | tail -n +3 | awk \\'{print $2 \\\" \\\" $8}\\' >/tmp/wiwiz_ipt_wd_mangle\"); /*wiwiz*/\n\tiptables_insert_gateway_id(&script);\n\t/* output = popen(script, \"r\"); wiwiz deleted */\n\texecute(script, 0);\t/* wiwiz */\n\toutput = fopen(\"/tmp/wiwiz_ipt_wd_mangle\", \"r\");\t/*wiwiz*/\n\tfree(script);\n\tif (!output) {\n\t\tdebug(LOG_ERR, \"popen(): %s\", strerror(errno));\n\t\treturn -1;\n\t}\n//wiwiz deleted\n//\t/* skip the first two lines */\n//\twhile (('\\n' != fgetc(output)) && !feof(output))\n//\t\t;\n//\twhile (('\\n' != fgetc(output)) && !feof(output))\n//\t\t;\n\twhile (output && !(feof(output))) {\n\t\t//rc = fscanf(output, \"%*s %llu %*s %*s %*s %*s %*s %15[0-9.] %*s %*s %*s %*s %*s %*s\", &counter, ip);\t//wiwiz deleted\n\t\trc = fscanf(output, \"%llu %15[0-9.]\", &counter, ip);\t//wiwiz\n\t\t//rc = fscanf(output, \"%*s %llu %*s %*s %*s %*s %*s %15[0-9.] %*s %*s %*s %*s %*s 0x%*u\", &counter, ip);\n\t\tif (2 == rc && EOF != rc) {\n\t\t\t/* Sanity*/\n\t\t\tif (!inet_aton(ip, &tempaddr)) {\n\t\t\t\tdebug(LOG_WARNING, \"I was supposed to read an IP address but instead got [%s] - ignoring it\", ip);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdebug(LOG_DEBUG, \"Read outgoing traffic for %s: Bytes=%llu\", ip, counter);\n\t\t\tLOCK_CLIENT_LIST();\n\t\t\tif ((p1 = client_list_find_by_ip(ip))) {\n\t\t\t\tif ((p1->counters.outgoing - p1->counters.outgoing_history) < counter) {\n\t\t\t\t\tp1->counters.outgoing = p1->counters.outgoing_history + counter;\n\t\t\t\t\tp1->counters.last_updated = time(NULL);\n\t\t\t\t\tdebug(LOG_DEBUG, \"%s - Updated counter.outgoing to %llu bytes.  Updated last_updated to %d\", ip, counter, p1->counters.last_updated);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdebug(LOG_ERR, \"iptables_fw_counters_update(): Could not find %s in client list, this should not happen unless if the gateway crashed\", ip);\n\t\t\t\t/* wiwiz deleted\n\t\t\t\tdebug(LOG_ERR, \"Preventively deleting firewall rules for %s in table %s\", ip, TABLE_WIFIDOG_OUTGOING);\n\t\t\t\tiptables_fw_destroy_mention(\"mangle\", TABLE_WIFIDOG_OUTGOING, ip);\n\t\t\t\tdebug(LOG_ERR, \"Preventively deleting firewall rules for %s in table %s\", ip, TABLE_WIFIDOG_INCOMING);\n\t\t\t\tiptables_fw_destroy_mention(\"mangle\", TABLE_WIFIDOG_INCOMING, ip);\n\t\t\t\t*/\n\t\t\t}\n\t\t\tUNLOCK_CLIENT_LIST();\n\t\t}\n\t}\n\tpclose(output);\n\n\t/* Look for incoming traffic */\n\t/* safe_asprintf(&script, \"%s %s\", \"iptables\", \"-v -n -x -t mangle -L \" TABLE_WIFIDOG_INCOMING); wiwiz deleted */\n\tsafe_asprintf(&script, \"%s %s\", \"iptables\", \"-v -n -x -t mangle -L \" TABLE_WIFIDOG_INCOMING \">/tmp/wiwiz_ipt_wd_mangle\"); /*wiwiz*/\n\tiptables_insert_gateway_id(&script);\n\t/* output = popen(script, \"r\"); wiwiz deleted */\n\texecute(script, 0);\t/* wiwiz */\n\toutput = fopen(\"/tmp/wiwiz_ipt_wd_mangle\", \"r\");\t/*wiwiz*/\n\tfree(script);\n\tif (!output) {\n\t\tdebug(LOG_ERR, \"popen(): %s\", strerror(errno));\n\t\treturn -1;\n\t}\n\n\t/* skip the first two lines */\n\twhile (('\\n' != fgetc(output)) && !feof(output))\n\t\t;\n\twhile (('\\n' != fgetc(output)) && !feof(output))\n\t\t;\n\twhile (output && !(feof(output))) {\n\t\trc = fscanf(output, \"%*s %llu %*s %*s %*s %*s %*s %*s %15[0-9.]\", &counter, ip);\n\t\tif (2 == rc && EOF != rc) {\n\t\t\t/* Sanity*/\n\t\t\tif (!inet_aton(ip, &tempaddr)) {\n\t\t\t\tdebug(LOG_WARNING, \"I was supposed to read an IP address but instead got [%s] - ignoring it\", ip);\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tdebug(LOG_DEBUG, \"Read incoming traffic for %s: Bytes=%llu\", ip, counter);\n\t\t\tLOCK_CLIENT_LIST();\n\t\t\tif ((p1 = client_list_find_by_ip(ip))) {\n\t\t\t\tif ((p1->counters.incoming - p1->counters.incoming_history) < counter) {\n\t\t\t\t\tp1->counters.incoming = p1->counters.incoming_history + counter;\n\t\t\t\t\tp1->counters.last_updated = time(NULL);\n\t\t\t\t\tdebug(LOG_DEBUG, \"%s - Updated counter.incoming to %llu bytes, last_updated = %\", ip, counter, p1->counters.last_updated);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdebug(LOG_ERR, \"iptables_fw_counters_update(): Could not find %s in client list, this should not happen unless if the gateway crashed\", ip);\n\t\t\t\t/* wiwiz deleted\n\t\t\t\tdebug(LOG_ERR, \"Preventively deleting firewall rules for %s in table %s\", ip, TABLE_WIFIDOG_OUTGOING);\n\t\t\t\tiptables_fw_destroy_mention(\"mangle\", TABLE_WIFIDOG_OUTGOING, ip);\n\t\t\t\tdebug(LOG_ERR, \"Preventively deleting firewall rules for %s in table %s\", ip, TABLE_WIFIDOG_INCOMING);\n\t\t\t\tiptables_fw_destroy_mention(\"mangle\", TABLE_WIFIDOG_INCOMING, ip);\n\t\t\t\t*/\n\t\t\t}\n\t\t\tUNLOCK_CLIENT_LIST();\n\t\t}\n\t}\n\tpclose(output);\n\n\treturn 1;\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/fw_iptables.h",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file fw_iptables.h\n    @brief Firewall iptables functions\n    @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n*/\n\n#ifndef _FW_IPTABLES_H_\n#define _FW_IPTABLES_H_\n\n#include \"firewall.h\"\n\n/*@{*/ \n/**Iptable table names used by WifiDog */\n#define TABLE_WIFIDOG_OUTGOING  \"WiFiDog_$ID$_Outgoing\"\n#define TABLE_WIFIDOG_WIFI_TO_INTERNET \"WiFiDog_$ID$_WIFI2Internet\"\n#define TABLE_WIFIDOG_WIFI_TO_ROUTER \"WiFiDog_$ID$_WIFI2Router\"\n#define TABLE_WIFIDOG_INCOMING  \"WiFiDog_$ID$_Incoming\"\n#define TABLE_WIFIDOG_AUTHSERVERS \"WiFiDog_$ID$_AuthServers\"\n#define TABLE_WIFIDOG_GLOBAL  \"WiFiDog_$ID$_Global\"\n#define TABLE_WIFIDOG_VALIDATE  \"WiFiDog_$ID$_Validate\"\n#define TABLE_WIFIDOG_KNOWN     \"WiFiDog_$ID$_Known\"\n#define TABLE_WIFIDOG_UNKNOWN   \"WiFiDog_$ID$_Unknown\"\n#define TABLE_WIFIDOG_LOCKED    \"WiFiDog_$ID$_Locked\"\n#define TABLE_WIFIDOG_TRUSTED    \"WiFiDog_$ID$_Trusted\"\n/*@}*/ \n\n/** Used by iptables_fw_access to select if the client should be granted of denied access */\ntypedef enum fw_access_t_ {\n    FW_ACCESS_ALLOW,\n    FW_ACCESS_DENY\n} fw_access_t;\n\n/** @brief Initialize the firewall */\nint iptables_fw_init(void);\n\n/** @brief Initializes the authservers table */\nvoid iptables_fw_set_authservers(void);\n\n/** @brief Clears the authservers table */\nvoid iptables_fw_clear_authservers(void);\n\n/** @brief Destroy the firewall */\nint iptables_fw_destroy(void);\n\n/** @brief Helper function for iptables_fw_destroy */\nint iptables_fw_destroy_mention( const char * table, const char * chain, const char * mention);\n\n/** @brief Define the access of a specific client */\nint iptables_fw_access(fw_access_t type, const char *ip, const char *mac, int tag);\n\n/** @brief All counters in the client list */\nint iptables_fw_counters_update(void);\n\n#endif /* _IPTABLES_H_ */\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/gateway.c",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free:Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n \\********************************************************************/\n\n/* $Id$ */\n/** @internal\n  @file gateway.c\n  @brief Main loop\n  @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n  @author Copyright (C) 2004 Alexandre Carmel-Veilleux <acv@miniguru.ca>\n */\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <syslog.h>\n#include <pthread.h>\n#include <signal.h>\n#include <errno.h>\n#include <time.h>\n\n/* for strerror() */\n#include <string.h>\n\n/* for wait() */\n#include <sys/wait.h>\n\n/* for unix socket communication*/\n#include <sys/socket.h>\n#include <sys/un.h>\n\n#include \"common.h\"\n#include \"httpd.h\"\n#include \"safe.h\"\n#include \"debug.h\"\n#include \"conf.h\"\n#include \"gateway.h\"\n#include \"firewall.h\"\n#include \"commandline.h\"\n#include \"auth.h\"\n#include \"http.h\"\n#include \"client_list.h\"\n#include \"wdctl_thread.h\"\n#include \"ping_thread.h\"\n#include \"httpd_thread.h\"\n#include \"util.h\"\n\n/** XXX Ugly hack \n * We need to remember the thread IDs of threads that simulate wait with pthread_cond_timedwait\n * so we can explicitly kill them in the termination handler\n */\nstatic pthread_t tid_fw_counter = 0;\nstatic pthread_t tid_ping = 0; \n\n/* The internal web server */\nhttpd * webserver = NULL;\n\n/* from commandline.c */\nextern char ** restartargv;\nextern pid_t restart_orig_pid;\nt_client *_firstclient;\t/* changed by wiwiz */\n\n/* from client_list.c */\nextern pthread_mutex_t client_list_mutex;\n\n/* Time when wifidog started  */\ntime_t started_time = 0;\n\n/* Appends -x, the current PID, and NULL to restartargv\n * see parse_commandline in commandline.c for details\n *\n * Why is restartargv global? Shouldn't it be at most static to commandline.c\n * and this function static there? -Alex @ 8oct2006\n */\nvoid append_x_restartargv(void) {\n\tint i;\n\n\tfor (i=0; restartargv[i]; i++);\n\n\trestartargv[i++] = safe_strdup(\"-x\");\n\tsafe_asprintf(&(restartargv[i++]), \"%d\", getpid());\n}\n\n/* @internal\n * @brief During gateway restart, connects to the parent process via the internal socket\n * Downloads from it the active client list\n */\nvoid get_clients_from_parent(void) {\n\tint sock;\n\tstruct sockaddr_un\tsa_un;\n\ts_config * config = NULL;\n\tchar linebuffer[MAX_BUF];\n\tint len = 0;\n\tchar *running1 = NULL;\n\tchar *running2 = NULL;\n\tchar *token1 = NULL;\n\tchar *token2 = NULL;\n\tchar onechar;\n\tchar *command = NULL;\n\tchar *key = NULL;\n\tchar *value = NULL;\n\tt_client * client = NULL;\n\tt_client * lastclient = NULL;\n\n\tconfig = config_get_config();\n\t\n\tdebug(LOG_INFO, \"Connecting to parent to download clients\");\n\n\t/* Connect to socket */\n\tsock = socket(AF_UNIX, SOCK_STREAM, 0);\n\tmemset(&sa_un, 0, sizeof(sa_un));\n\tsa_un.sun_family = AF_UNIX;\n\tstrncpy(sa_un.sun_path, config->internal_sock, (sizeof(sa_un.sun_path) - 1));\n\n\tif (connect(sock, (struct sockaddr *)&sa_un, strlen(sa_un.sun_path) + sizeof(sa_un.sun_family))) {\n\t\tdebug(LOG_ERR, \"Failed to connect to parent (%s) - client list not downloaded\", strerror(errno));\n\t\treturn;\n\t}\n\n\tdebug(LOG_INFO, \"Connected to parent.  Downloading clients\");\n\n\tLOCK_CLIENT_LIST();\n\n\tcommand = NULL;\n\tmemset(linebuffer, 0, sizeof(linebuffer));\n\tlen = 0;\n\tclient = NULL;\n\t/* Get line by line */\n\twhile (read(sock, &onechar, 1) == 1) {\n\t\tif (onechar == '\\n') {\n\t\t\t/* End of line */\n\t\t\tonechar = '\\0';\n\t\t}\n\t\tlinebuffer[len++] = onechar;\n\n\t\tif (!onechar) {\n\t\t\t/* We have a complete entry in linebuffer - parse it */\n\t\t\tdebug(LOG_DEBUG, \"Received from parent: [%s]\", linebuffer);\n\t\t\trunning1 = linebuffer;\n\t\t\twhile ((token1 = strsep(&running1, \"|\")) != NULL) {\n\t\t\t\tif (!command) {\n\t\t\t\t\t/* The first token is the command */\n\t\t\t\t\tcommand = token1;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t/* Token1 has something like \"foo=bar\" */\n\t\t\t\t\trunning2 = token1;\n\t\t\t\t\tkey = value = NULL;\n\t\t\t\t\twhile ((token2 = strsep(&running2, \"=\")) != NULL) {\n\t\t\t\t\t\tif (!key) {\n\t\t\t\t\t\t\tkey = token2;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (!value) {\n\t\t\t\t\t\t\tvalue = token2;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (strcmp(command, \"CLIENT\") == 0) {\n\t\t\t\t\t/* This line has info about a client in the client list */\n\t\t\t\t\tif (!client) {\n\t\t\t\t\t\t/* Create a new client struct */\n\t\t\t\t\t\tclient = safe_malloc(sizeof(t_client));\n\t\t\t\t\t\tmemset(client, 0, sizeof(t_client));\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (key && value) {\n\t\t\t\t\tif (strcmp(command, \"CLIENT\") == 0) {\n\t\t\t\t\t\t/* Assign the key into the appropriate slot in the connection structure */\n\t\t\t\t\t\tif (strcmp(key, \"ip\") == 0) {\n\t\t\t\t\t\t\tclient->ip = safe_strdup(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (strcmp(key, \"mac\") == 0) {\n\t\t\t\t\t\t\tclient->mac = safe_strdup(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (strcmp(key, \"token\") == 0) {\n\t\t\t\t\t\t\tclient->token = safe_strdup(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (strcmp(key, \"fw_connection_state\") == 0) {\n\t\t\t\t\t\t\tclient->fw_connection_state = atoi(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (strcmp(key, \"fd\") == 0) {\n\t\t\t\t\t\t\tclient->fd = atoi(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (strcmp(key, \"counters_incoming\") == 0) {\n\t\t\t\t\t\t\tclient->counters.incoming_history = atoll(value);\n\t\t\t\t\t\t\tclient->counters.incoming = client->counters.incoming_history;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (strcmp(key, \"counters_outgoing\") == 0) {\n\t\t\t\t\t\t\tclient->counters.outgoing_history = atoll(value);\n\t\t\t\t\t\t\tclient->counters.outgoing = client->counters.outgoing_history;\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse if (strcmp(key, \"counters_last_updated\") == 0) {\n\t\t\t\t\t\t\tclient->counters.last_updated = atol(value);\n\t\t\t\t\t\t}\n\t\t\t\t\t\telse {\n\t\t\t\t\t\t\tdebug(LOG_NOTICE, \"I don't know how to inherit key [%s] value [%s] from parent\", key, value);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* End of parsing this command */\n\t\t\tif (client) {\n\t\t\t\t/* Add this client to the client list */\n\t\t\t\tif (!_firstclient) {\t/* changed by wiwiz */\n\t\t\t\t\t_firstclient = client;\t/* changed by wiwiz */\n\t\t\t\t\tlastclient = _firstclient;\t/* changed by wiwiz */\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlastclient->next = client;\n\t\t\t\t\tlastclient = client;\n\t\t\t\t}\n\t\t\t}\n\n\t\t\t/* Clean up */\n\t\t\tcommand = NULL;\n\t\t\tmemset(linebuffer, 0, sizeof(linebuffer));\n\t\t\tlen = 0;\n\t\t\tclient = NULL;\n\t\t}\n\t}\n\n\tUNLOCK_CLIENT_LIST();\n\tdebug(LOG_INFO, \"Client list downloaded successfully from parent\");\n\n\tclose(sock);\n}\n\n/**@internal\n * @brief Handles SIGCHLD signals to avoid zombie processes\n *\n * When a child process exits, it causes a SIGCHLD to be sent to the\n * process. This handler catches it and reaps the child process so it\n * can exit. Otherwise we'd get zombie processes.\n */\nvoid\nsigchld_handler(int s)\n{\n\tint\tstatus;\n\tpid_t rc;\n\t\n\tdebug(LOG_DEBUG, \"Handler for SIGCHLD called. Trying to reap a child\");\n\n\trc = waitpid(-1, &status, WNOHANG);\n\n\tdebug(LOG_DEBUG, \"Handler for SIGCHLD reaped child PID %d\", rc);\n}\n\n/** Exits cleanly after cleaning up the firewall.  \n *  Use this function anytime you need to exit after firewall initialization */\nvoid\ntermination_handler(int s)\n{\n\tstatic\tpthread_mutex_t\tsigterm_mutex = PTHREAD_MUTEX_INITIALIZER;\n\n\tdebug(LOG_INFO, \"Handler for termination caught signal %d\", s);\n\n\t/* Makes sure we only call fw_destroy() once. */\n\tif (pthread_mutex_trylock(&sigterm_mutex)) {\n\t\tdebug(LOG_INFO, \"Another thread already began global termination handler. I'm exiting\");\n\t\tpthread_exit(NULL);\n\t}\n\telse {\n\t\tdebug(LOG_INFO, \"Cleaning up and exiting\");\n\t}\n\n\tdebug(LOG_INFO, \"Flushing firewall rules...\");\n\tfw_destroy();\n\n\t/* XXX Hack\n\t * Aparently pthread_cond_timedwait under openwrt prevents signals (and therefore\n\t * termination handler) from happening so we need to explicitly kill the threads \n\t * that use that\n\t */\n\tif (tid_fw_counter) {\n\t\tdebug(LOG_INFO, \"Explicitly killing the fw_counter thread\");\n\t\tpthread_kill(tid_fw_counter, SIGKILL);\n\t}\n\tif (tid_ping) {\n\t\tdebug(LOG_INFO, \"Explicitly killing the ping thread\");\n\t\tpthread_kill(tid_ping, SIGKILL);\n\t}\n\n\tdebug(LOG_NOTICE, \"Exiting...\");\n\texit(s == 0 ? 1 : 0);\n}\n\n/** @internal \n * Registers all the signal handlers\n */\nstatic void\ninit_signals(void)\n{\n\tstruct sigaction sa;\n\n\tdebug(LOG_DEBUG, \"Initializing signal handlers\");\n\t\n\tsa.sa_handler = sigchld_handler;\n\tsigemptyset(&sa.sa_mask);\n\tsa.sa_flags = SA_RESTART;\n\tif (sigaction(SIGCHLD, &sa, NULL) == -1) {\n\t\tdebug(LOG_ERR, \"sigaction(): %s\", strerror(errno));\n\t\texit(1);\n\t}\n\n\t/* Trap SIGPIPE */\n\t/* This is done so that when libhttpd does a socket operation on\n\t * a disconnected socket (i.e.: Broken Pipes) we catch the signal\n\t * and do nothing. The alternative is to exit. SIGPIPE are harmless\n\t * if not desirable.\n\t */\n\tsa.sa_handler = SIG_IGN;\n\tif (sigaction(SIGPIPE, &sa, NULL) == -1) {\n\t\tdebug(LOG_ERR, \"sigaction(): %s\", strerror(errno));\n\t\texit(1);\n\t}\n\n\tsa.sa_handler = termination_handler;\n\tsigemptyset(&sa.sa_mask);\n\tsa.sa_flags = SA_RESTART;\n\n\t/* Trap SIGTERM */\n\tif (sigaction(SIGTERM, &sa, NULL) == -1) {\n\t\tdebug(LOG_ERR, \"sigaction(): %s\", strerror(errno));\n\t\texit(1);\n\t}\n\n\t/* Trap SIGQUIT */\n\tif (sigaction(SIGQUIT, &sa, NULL) == -1) {\n\t\tdebug(LOG_ERR, \"sigaction(): %s\", strerror(errno));\n\t\texit(1);\n\t}\n\n\t/* Trap SIGINT */\n\tif (sigaction(SIGINT, &sa, NULL) == -1) {\n\t\tdebug(LOG_ERR, \"sigaction(): %s\", strerror(errno));\n\t\texit(1);\n\t}\n}\n\n/**@internal\n * Main execution loop \n */\nstatic void\nmain_loop(void)\n{\n\tint result;\n\tpthread_t\ttid;\n\ts_config *config = config_get_config();\n\trequest *r;\n\tvoid **params;\n\n    /* Set the time when wifidog started */\n\tif (!started_time) {\n\t\tdebug(LOG_INFO, \"Setting started_time\");\n\t\tstarted_time = time(NULL);\n\t}\n\telse if (started_time < MINIMUM_STARTED_TIME) {\n\t\tdebug(LOG_WARNING, \"Detected possible clock skew - re-setting started_time\");\n\t\tstarted_time = time(NULL);\n\t}\n\n\t/* If we don't have the Gateway IP address, get it. Can't fail. */\n\tif (!config->gw_address) {\n\t\tdebug(LOG_DEBUG, \"Finding IP address of %s\", config->gw_interface);\n\t\tif ((config->gw_address = get_iface_ip(config->gw_interface)) == NULL) {\n\t\t\tdebug(LOG_ERR, \"Could not get IP address information of %s, exiting...\", config->gw_interface);\n\t\t\texit(1);\n\t\t}\n\t\tdebug(LOG_DEBUG, \"%s = %s\", config->gw_interface, config->gw_address);\n\t}\n\n\t/* If we don't have the Gateway ID, construct it from the internal MAC address.\n\t * \"Can't fail\" so exit() if the impossible happens. */\n\tif (!config->gw_id) {\n    \tdebug(LOG_DEBUG, \"Finding MAC address of %s\", config->gw_interface);\n    \tif ((config->gw_id = get_iface_mac(config->gw_interface)) == NULL) {\n\t\t\tdebug(LOG_ERR, \"Could not get MAC address information of %s, exiting...\", config->gw_interface);\n\t\t\texit(1);\n\t\t}\n\t\tdebug(LOG_DEBUG, \"%s = %s\", config->gw_interface, config->gw_id);\n\t}\n\n\t/* Initializes the web server */\n\tdebug(LOG_NOTICE, \"Creating web server on %s:%d\", config->gw_address, config->gw_port);\n\tif ((webserver = httpdCreate(config->gw_address, config->gw_port)) == NULL) {\n\t\tdebug(LOG_ERR, \"Could not create web server: %s\", strerror(errno));\n\t\texit(1);\n\t}\n\n\tdebug(LOG_DEBUG, \"Assigning callbacks to web server\");\n\thttpdAddCContent(webserver, \"/\", \"wifidog\", 0, NULL, http_callback_wifidog);\n\thttpdAddCContent(webserver, \"/wifidog\", \"\", 0, NULL, http_callback_wifidog);\n\thttpdAddCContent(webserver, \"/wifidog\", \"about\", 0, NULL, http_callback_about);\n\thttpdAddCContent(webserver, \"/wifidog\", \"status\", 0, NULL, http_callback_status);\n\thttpdAddCContent(webserver, \"/wifidog\", \"auth\", 0, NULL, http_callback_auth);\n\n\thttpdAddC404Content(webserver, http_callback_404);\n\n\t/* Reset the firewall (if WiFiDog crashed) */\n\tfw_destroy();\n\t/* Then initialize it */\n\tif (!fw_init()) {\n\t\tdebug(LOG_ERR, \"FATAL: Failed to initialize firewall\");\n\t\texit(1);\n\t}\n\n\t/* Start clean up thread */\n\tresult = pthread_create(&tid_fw_counter, NULL, (void *)thread_client_timeout_check, NULL);\n\tif (result != 0) {\n\t    debug(LOG_ERR, \"FATAL: Failed to create a new thread (fw_counter) - exiting\");\n\t    termination_handler(0);\n\t}\n\tpthread_detach(tid_fw_counter);\n\n\t/* Start control thread */\n\tresult = pthread_create(&tid, NULL, (void *)thread_wdctl, (void *)safe_strdup(config->wdctl_sock));\n\tif (result != 0) {\n\t\tdebug(LOG_ERR, \"FATAL: Failed to create a new thread (wdctl) - exiting\");\n\t\ttermination_handler(0);\n\t}\n\tpthread_detach(tid);\n\t\n\t/* Start heartbeat thread */\n\tresult = pthread_create(&tid_ping, NULL, (void *)thread_ping, NULL);\n\tif (result != 0) {\n\t    debug(LOG_ERR, \"FATAL: Failed to create a new thread (ping) - exiting\");\n\t\ttermination_handler(0);\n\t}\n\tpthread_detach(tid_ping);\n\t\n\texecute(\"/usr/local/hsbuilder/hsbuilder_helper.sh passauthed &\", 0);\t/* wiwiz */\n\n    debug(LOG_NOTICE, \"Waiting for connections\");\n\twhile(1) {\n\t\tr = httpdGetConnection(webserver, NULL);\n\n\t\t/* We can't convert this to a switch because there might be\n\t\t * values that are not -1, 0 or 1. */\n\t\tif (webserver->lastError == -1) {\n\t\t\t/* Interrupted system call */\n\t\t\tcontinue; /* restart loop */\n\t\t}\n\t\telse if (webserver->lastError < -1) {\n\t\t\t/*\n\t\t\t * FIXME\n\t\t\t * An error occurred - should we abort?\n\t\t\t * reboot the device ?\n\t\t\t */\n\t\t\tdebug(LOG_ERR, \"FATAL: httpdGetConnection returned unexpected value %d, exiting.\", webserver->lastError);\n\t\t\ttermination_handler(0);\n\t\t}\n\t\telse if (r != NULL) {\n\t\t\t/*\n\t\t\t * We got a connection\n\t\t\t *\n\t\t\t * We should create another thread\n\t\t\t */\n\t\t\tdebug(LOG_INFO, \"Received connection from %s, spawning worker thread\", r->clientAddr);\n\t\t\t/* The void**'s are a simulation of the normal C\n\t\t\t * function calling sequence. */\n\t\t\tparams = safe_malloc(2 * sizeof(void *));\n\t\t\t*params = webserver;\n\t\t\t*(params + 1) = r;\n\n\t\t\tresult = pthread_create(&tid, NULL, (void *)thread_httpd, (void *)params);\n\t\t\tif (result != 0) {\n\t\t\t\tdebug(LOG_ERR, \"FATAL: Failed to create a new thread (httpd) - exiting\");\n\t\t\t\ttermination_handler(0);\n\t\t\t}\n\t\t\tpthread_detach(tid);\n\t\t}\n\t\telse {\n\t\t\t/* webserver->lastError should be 2 */\n\t\t\t/* XXX We failed an ACL.... No handling because\n\t\t\t * we don't set any... */\n\t\t}\n\t}\n\n\t/* never reached */\n}\n\n/** Reads the configuration file and then starts the main loop */\nint main(int argc, char **argv) {\n\n\ts_config *config = config_get_config();\n\tconfig_init();\n\n\tparse_commandline(argc, argv);\n\n\t/* Initialize the config */\n\tconfig_read(config->configfile);\n\tconfig_validate();\n\n\t/* Initializes the linked list of connected clients */\n\tclient_list_init();\n\n\t/* Init the signals to catch chld/quit/etc */\n\tinit_signals();\n\n    /* wiwiz starts */\n    /*system(\"/usr/local/hsbuilder/setspeed.sh clear &\");*/\n\texecute(\"/usr/local/hsbuilder/setspeed.sh clear &\", 0);\n    /* wiwiz ends */\n\n\tif (restart_orig_pid) {\n\t\t/*\n\t\t * We were restarted and our parent is waiting for us to talk to it over the socket\n\t\t */\n\t\tget_clients_from_parent();\n\n\t\t/*\n\t\t * At this point the parent will start destroying itself and the firewall. Let it finish it's job before we continue\n\t\t */\n\t\twhile (kill(restart_orig_pid, 0) != -1) {\n\t\t\tdebug(LOG_INFO, \"Waiting for parent PID %d to die before continuing loading\", restart_orig_pid);\n\t\t\tsleep(1);\n\t\t}\n\n\t\tdebug(LOG_INFO, \"Parent PID %d seems to be dead. Continuing loading.\");\n\t}\n\n\tif (config->daemon) {\n\n\t\tdebug(LOG_INFO, \"Forking into background\");\n\n\t\tswitch(safe_fork()) {\n\t\t\tcase 0: /* child */\n\t\t\t\tsetsid();\n\t\t\t\tappend_x_restartargv();\n\t\t\t\tmain_loop();\n\t\t\t\tbreak;\n\n\t\t\tdefault: /* parent */\n\t\t\t\texit(0);\n\t\t\t\tbreak;\n\t\t}\n\t}\n\telse {\n\t\tappend_x_restartargv();\n\t\tmain_loop();\n\t}\n\n\treturn(0); /* never reached */\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/gateway.h",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file gateway.h\n    @brief Main loop\n    @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n*/\n\n#ifndef _GATEWAY_H_\n#define _GATEWAY_H_\n \n/** @brief exits cleanly and clear the firewall rules. */\nvoid termination_handler(int s);\n\n#endif /* _GATEWAY_H_ */\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/http.c",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n \\********************************************************************/\n\n/* $Id$ */\n/** @file http.c\n  @brief HTTP IO functions\n  @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n  @author Copyright (C) 2007 Benoit Grégoire\n  @author Copyright (C) 2007 David Bird <david@coova.com>\n\n */\n\n#define _GNU_SOURCE\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <pthread.h>\n#include <string.h>\n#include <unistd.h>\n#include <syslog.h>\n#include <sys/types.h>\n#include <sys/stat.h>\n#include <fcntl.h>\n#include <errno.h>\n\n#include \"httpd.h\"\n\n#include \"safe.h\"\n#include \"debug.h\"\n#include \"conf.h\"\n#include \"auth.h\"\n#include \"firewall.h\"\n#include \"http.h\"\n#include \"httpd.h\"\n#include \"client_list.h\"\n#include \"common.h\"\n#include \"centralserver.h\"\n\n#include \"util.h\"\n\n#include \"../config.h\"\n\nextern pthread_mutex_t\tclient_list_mutex;\n\n/** The 404 handler is also responsible for redirecting to the auth server */\nvoid\nhttp_callback_404(httpd *webserver, request *r)\n{\n\tchar tmp_url[MAX_BUF],\n\t\t\t*url,\n\t\t\t*mac;\n\ts_config\t*config = config_get_config();\n\tt_auth_serv\t*auth_server = get_auth_server();\n\n\tmemset(tmp_url, 0, sizeof(tmp_url));\n\t/* \n\t * XXX Note the code below assumes that the client's request is a plain\n\t * http request to a standard port. At any rate, this handler is called only\n\t * if the internet/auth server is down so it's not a huge loss, but still.\n\t */\n        snprintf(tmp_url, (sizeof(tmp_url) - 1), \"http://%s%s%s%s\",\n                        r->request.host,\n                        r->request.path,\n                        r->request.query[0] ? \"?\" : \"\",\n                        r->request.query);\n\turl = httpdUrlEncode(tmp_url);\n\n\tif (!is_online()) {\n\t\t/* The internet connection is down at the moment  - apologize and do not redirect anywhere */\n\t\tchar * buf;\n\t\tsafe_asprintf(&buf, \n\t\t\t\"<p>We apologize, but it seems that the internet connection that powers this hotspot is temporarily unavailable.</p>\"\n\t\t\t\"<p>If at all possible, please notify the owners of this hotspot that the internet connection is out of service.</p>\"\n\t\t\t\"<p>The maintainers of this network are aware of this disruption.  We hope that this situation will be resolved soon.</p>\"\n\t\t\t\"<p>In a while please <a href='%s'>click here</a> to try your request again.</p>\", tmp_url);\n\n                send_http_page(r, \"Uh oh! Internet access unavailable!\", buf);\n\t\tfree(buf);\n\t\tdebug(LOG_INFO, \"Sent %s an apology since I am not online - no point sending them to auth server\", r->clientAddr);\n\t}\n\telse if (!is_auth_online()) {\n\t\t/* The auth server is down at the moment - apologize and do not redirect anywhere */\n\t\tchar * buf;\n\t\tsafe_asprintf(&buf, \n\t\t\t\"<p>We apologize, but it seems that we are currently unable to re-direct you to the login screen.</p>\"\n\t\t\t\"<p>The maintainers of this network are aware of this disruption.  We hope that this situation will be resolved soon.</p>\"\n\t\t\t\"<p>In a couple of minutes please <a href='%s'>click here</a> to try your request again.</p>\", tmp_url);\n\n                send_http_page(r, \"Uh oh! Login screen unavailable!\", buf);\n\t\tfree(buf);\n\t\tdebug(LOG_INFO, \"Sent %s an apology since auth server not online - no point sending them to auth server\", r->clientAddr);\n\t}\n\telse {\n\t\t/* Re-direct them to auth server */\n\t\tchar *urlFragment;\n\n\t\tif (!(mac = arp_get(r->clientAddr))) {\n\t\t\t/* We could not get their MAC address */\n\t\t\tdebug(LOG_INFO, \"Failed to retrieve MAC address for ip %s, so not putting in the login request\", r->clientAddr);\n\t\t\tsafe_asprintf(&urlFragment, \"%sgw_address=%s&gw_port=%d&gw_id=%s&gw_mac=%s&url=%s\",\n\t\t\t\tauth_server->authserv_login_script_path_fragment,\n\t\t\t\tconfig->gw_address,\n\t\t\t\tconfig->gw_port, \n\t\t\t\tconfig->gw_id,\n\t\t\t\tconfig->gw_interface_mac,\n\t\t\t\turl);\n\t\t} else {\t\t\t\n\t\t\tdebug(LOG_INFO, \"Got client MAC address for ip %s: %s\", r->clientAddr, mac);\n\t\t\tsafe_asprintf(&urlFragment, \"%sgw_address=%s&gw_port=%d&gw_id=%s&gw_mac=%s&mac=%s&url=%s\",\n\t\t\t\tauth_server->authserv_login_script_path_fragment,\n\t\t\t\tconfig->gw_address,\n\t\t\t\tconfig->gw_port, \n\t\t\t\tconfig->gw_id,\n\t\t\t\tconfig->gw_interface_mac,\n\t\t\t\tmac,\n\t\t\t\turl);\n\t\t}\n\n\t\tdebug(LOG_INFO, \"Captured %s requesting [%s] and re-directing them to login page\", r->clientAddr, url);\n\t\thttp_send_redirect_to_auth(r, urlFragment, \"Redirect to login page\");\n\t\tfree(urlFragment);\n\t}\n\tfree(url);\n}\n\nvoid \nhttp_callback_wifidog(httpd *webserver, request *r)\n{\n\tsend_http_page(r, \"WiFiDog\", \"Please use the menu to navigate the features of this WiFiDog installation.\");\n}\n\nvoid \nhttp_callback_about(httpd *webserver, request *r)\n{\n\tsend_http_page(r, \"About WiFiDog\", \"This is WiFiDog version <strong>\" VERSION \"</strong>\");\n}\n\nvoid \nhttp_callback_status(httpd *webserver, request *r)\n{\n\tconst s_config *config = config_get_config();\n\tchar * status = NULL;\n\tchar *buf;\n\n\tif (config->httpdusername && \n\t\t\t(strcmp(config->httpdusername, r->request.authUser) ||\n\t\t\t strcmp(config->httpdpassword, r->request.authPassword))) {\n\t\tdebug(LOG_INFO, \"Status page requested, forcing authentication\");\n\t\thttpdForceAuthenticate(r, config->httpdrealm);\n\t\treturn;\n\t}\n\n\tstatus = get_status_text();\n\tsafe_asprintf(&buf, \"<pre>%s</pre>\", status);\n\tsend_http_page(r, \"WiFiDog Status\", buf);\n\tfree(buf);\n\tfree(status);\n}\n/** @brief Convenience function to redirect the web browser to the auth server\n * @param r The request\n * @param urlFragment The end of the auth server URL to redirect to (the part after path)\n * @param text The text to include in the redirect header ant the mnual redirect title */\nvoid http_send_redirect_to_auth(request *r, const char *urlFragment, const char *text)\n{\n\tchar *protocol = NULL;\n\tint port = 80;\n\tt_auth_serv\t*auth_server = get_auth_server();\n\n\tif (auth_server->authserv_use_ssl) {\n\t\tprotocol = \"https\";\n\t\tport = auth_server->authserv_ssl_port;\n\t} else {\n\t\tprotocol = \"http\";\n\t\tport = auth_server->authserv_http_port;\n\t}\n\t\t\t    \t\t\n\tchar *url = NULL;\n\tsafe_asprintf(&url, \"%s://%s:%d%s%s\",\n\t\tprotocol,\n\t\tauth_server->authserv_hostname,\n\t\tport,\n\t\tauth_server->authserv_path,\n\t\turlFragment\n\t);\n\thttp_send_redirect(r, url, text);\n\tfree(url);\t\n}\n\n/** @brief Sends a redirect to the web browser \n * @param r The request\n * @param url The url to redirect to\n * @param text The text to include in the redirect header and the manual redirect link title.  NULL is acceptable */\nvoid http_send_redirect(request *r, const char *url, const char *text)\n{\n\tchar *message = NULL;\n\tchar *header = NULL;\n\tchar *response = NULL;\n\t\t/* Re-direct them to auth server */\n\tdebug(LOG_DEBUG, \"Redirecting client browser to %s\", url);\n\tsafe_asprintf(&header, \"Location: %s\", url);\n\tsafe_asprintf(&response, \"302 %s\\n\", text ? text : \"Redirecting\");\n\thttpdSetResponse(r, response);\n\thttpdAddHeader(r, header);\n\tfree(response);\n\tfree(header);\n\tsafe_asprintf(&message, \"Please <a href='%s'>click here</a>.\", url);\n\tsend_http_page(r, text ? text : \"Redirection to message\", message);\n\tfree(message);\n}\n\nvoid \nhttp_callback_auth(httpd *webserver, request *r)\n{\n\tt_client\t*client;\n\thttpVar * token;\n\tchar\t*mac;\n\thttpVar *logout = httpdGetVariableByName(r, \"logout\");\n\tif ((token = httpdGetVariableByName(r, \"token\"))) {\n\t\t/* They supplied variable \"token\" */\n\t\tif (!(mac = arp_get(r->clientAddr))) {\n\t\t\t/* We could not get their MAC address */\n\t\t\tdebug(LOG_ERR, \"Failed to retrieve MAC address for ip %s\", r->clientAddr);\n\t\t\tsend_http_page(r, \"WiFiDog Error\", \"Failed to retrieve your MAC address\");\n\t\t} else {\n\t\t\t/* We have their MAC address */\n\n\t\t\tLOCK_CLIENT_LIST();\n\t\t\t\n\t\t\tif ((client = client_list_find(r->clientAddr, mac)) == NULL) {\n\t\t\t\tdebug(LOG_DEBUG, \"New client for %s\", r->clientAddr);\n\t\t\t\tclient_list_append(r->clientAddr, mac, token->value);\n\t\t\t} else if (logout) {\n\t\t\t    t_authresponse  authresponse;\n\t\t\t    s_config *config = config_get_config();\n\t\t\t    unsigned long long incoming = client->counters.incoming;\n\t\t\t    unsigned long long outgoing = client->counters.outgoing;\n\t\t\t    char *ip = safe_strdup(client->ip);\n\t\t\t    char *urlFragment = NULL;\n\t\t\t    t_auth_serv\t*auth_server = get_auth_server();\n\t\t\t    \t\t\t\t    \t\n\t\t\t    fw_deny(client->ip, client->mac, client->fw_connection_state);\n\t\t\t    client_list_delete(client);\n\t\t\t    debug(LOG_DEBUG, \"Got logout from %s\", client->ip);\n\t\t\t    \n\t\t\t    /* Advertise the logout if we have an auth server */\n\t\t\t    if (config->auth_servers != NULL) {\n\t\t\t\t\tUNLOCK_CLIENT_LIST();\n\t\t\t\t\tauth_server_request(&authresponse, REQUEST_TYPE_LOGOUT, ip, mac, token->value, \n\t\t\t\t\t\t\t\t\t    incoming, outgoing);\n\t\t\t\t\tLOCK_CLIENT_LIST();\n\t\t\t\t\t\n\t\t\t\t\t/* Re-direct them to auth server */\n\t\t\t\t\tdebug(LOG_INFO, \"Got manual logout from client ip %s, mac %s, token %s\"\n\t\t\t\t\t\"- redirecting them to logout message\", client->ip, client->mac, client->token);\n\t\t\t\t\tsafe_asprintf(&urlFragment, \"%smessage=%s\",\n\t\t\t\t\t\tauth_server->authserv_msg_script_path_fragment,\n\t\t\t\t\t\tGATEWAY_MESSAGE_ACCOUNT_LOGGED_OUT\n\t\t\t\t\t);\n\t\t\t\t\thttp_send_redirect_to_auth(r, urlFragment, \"Redirect to logout message\");\n\t\t\t\t\tfree(urlFragment);\n\t\t\t    }\n\t\t\t    free(ip);\n \t\t\t} \n \t\t\telse {\n\t\t\t\tdebug(LOG_DEBUG, \"Client for %s is already in the client list\", client->ip);\n\t\t\t}\n\t\t\tUNLOCK_CLIENT_LIST();\n\t\t\tif (!logout) {\n\t\t\t\tauthenticate_client(r);\n\t\t\t}\n\t\t\tfree(mac);\n\t\t}\n\t} else {\n\t\t/* They did not supply variable \"token\" */\n\t\tsend_http_page(r, \"WiFiDog error\", \"Invalid token\");\n\t}\n}\n\nvoid send_http_page(request *r, const char *title, const char* message)\n{\n    s_config\t*config = config_get_config();\n    char *buffer;\n    struct stat stat_info;\n    int fd;\n    ssize_t written;\n\n    fd=open(config->htmlmsgfile, O_RDONLY);\n    if (fd==-1) {\n        debug(LOG_CRIT, \"Failed to open HTML message file %s: %s\", config->htmlmsgfile, strerror(errno));\n        return;\n    }\n\n    if (fstat(fd, &stat_info)==-1) {\n        debug(LOG_CRIT, \"Failed to stat HTML message file: %s\", strerror(errno));\n        close(fd);\n        return;\n    }\n\n    buffer=(char*)safe_malloc(stat_info.st_size+1);\n    written=read(fd, buffer, stat_info.st_size);\n    if (written==-1) {\n        debug(LOG_CRIT, \"Failed to read HTML message file: %s\", strerror(errno));\n        free(buffer);\n        close(fd);\n        return;\n    }\n    close(fd);\n\n    buffer[written]=0;\n    httpdAddVariable(r, \"title\", title);\n    httpdAddVariable(r, \"message\", message);\n    httpdAddVariable(r, \"nodeID\", config->gw_id);\n    httpdOutput(r, buffer);\n    free(buffer);\n}\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/http.h",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file http.h\n    @brief HTTP IO functions\n    @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n*/\n\n#ifndef _HTTP_H_\n#define _HTTP_H_\n\n#include \"httpd.h\"\n\n/**@brief Callback for libhttpd, main entry point for captive portal */\nvoid http_callback_404(httpd *webserver, request *r);\n/**@brief Callback for libhttpd */\nvoid http_callback_wifidog(httpd *webserver, request *r);\n/**@brief Callback for libhttpd */\nvoid http_callback_about(httpd *webserver, request *r);\n/**@brief Callback for libhttpd */\nvoid http_callback_status(httpd *webserver, request *r);\n/**@brief Callback for libhttpd, main entry point post login for auth confirmation */\nvoid http_callback_auth(httpd *webserver, request *r);\n\n/** @brief Sends a HTML page to web browser */\nvoid send_http_page(request *r, const char *title, const char* message);\n\n/** @brief Sends a redirect to the web browser */\nvoid http_send_redirect(request *r, const char *url, const char *text);\n/** @brief Convenience function to redirect the web browser to the authe server */\nvoid http_send_redirect_to_auth(request *r, const char *urlFragment, const char *text);\n#endif /* _HTTP_H_ */\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/httpd_thread.c",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n\n/** @file httpd_thread.c\n    @brief Handles on web request.\n    @author Copyright (C) 2004 Alexandre Carmel-Veilleux <acv@acv.ca>\n*/\n\n#define _GNU_SOURCE\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <pthread.h>\n#include <string.h>\n#include <unistd.h>\n#include <syslog.h>\n#include <signal.h>\n#include <errno.h>\n\n#include \"httpd.h\"\n\n#include \"../config.h\"\n#include \"common.h\"\n#include \"debug.h\"\n#include \"httpd_thread.h\"\n\n/** Main request handling thread.\n@param args Two item array of void-cast pointers to the httpd and request struct\n*/\nvoid\nthread_httpd(void *args)\n{\n\tvoid\t**params;\n\thttpd\t*webserver;\n\trequest\t*r;\n\t\n\tparams = (void **)args;\n\twebserver = *params;\n\tr = *(params + 1);\n\tfree(params); /* XXX We must release this ourselves. */\n\t\n\tif (httpdReadRequest(webserver, r) == 0) {\n\t\t/*\n\t\t * We read the request fine\n\t\t */\n\t\tdebug(LOG_DEBUG, \"Processing request from %s\", r->clientAddr);\n\t\tdebug(LOG_DEBUG, \"Calling httpdProcessRequest() for %s\", r->clientAddr);\n\t\thttpdProcessRequest(webserver, r);\n\t\tdebug(LOG_DEBUG, \"Returned from httpdProcessRequest() for %s\", r->clientAddr);\n\t}\n\telse {\n\t\tdebug(LOG_DEBUG, \"No valid request received from %s\", r->clientAddr);\n\t}\n\tdebug(LOG_DEBUG, \"Closing connection with %s\", r->clientAddr);\n\thttpdEndRequest(r);\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/httpd_thread.h",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file httpd_thread.h\n    @brief WiFiDog httpd worker thread\n    @author Copyright (C) 2004 Alexandre Carmel-Veilleux <acv@acv.ca>\n*/\n\n#ifndef _HTTPD_THREAD_H_\n#define _HTTPD_THREAD_H_\n\n/** @brief Handle a web request */\nvoid thread_httpd(void *args);\n\n#endif\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/ping_thread.c",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file ping_thread.c\n    @brief Periodically checks in with the central auth server so the auth\n    server knows the gateway is still up.  Note that this is NOT how the gateway\n    detects that the central server is still up.\n    @author Copyright (C) 2004 Alexandre Carmel-Veilleux <acv@miniguru.ca>\n*/\n\n#define _GNU_SOURCE\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <pthread.h>\n#include <string.h>\n#include <stdarg.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <arpa/inet.h>\n#include <netdb.h>\n#include <unistd.h>\n#include <syslog.h>\n#include <signal.h>\n#include <errno.h>\n\n#include \"../config.h\"\n#include \"safe.h\"\n#include \"common.h\"\n#include \"conf.h\"\n#include \"debug.h\"\n#include \"ping_thread.h\"\n#include \"util.h\"\n#include \"centralserver.h\"\n\nstatic void ping(void);\n\nextern time_t started_time;\n\n/** Launches a thread that periodically checks in with the wifidog auth server to perform heartbeat function.\n@param arg NULL\n@todo This thread loops infinitely, need a watchdog to verify that it is still running?\n*/  \nvoid\nthread_ping(void *arg)\n{\n\tpthread_cond_t\t\tcond = PTHREAD_COND_INITIALIZER;\n\tpthread_mutex_t\t\tcond_mutex = PTHREAD_MUTEX_INITIALIZER;\n\tstruct\ttimespec\ttimeout;\n\t\n\twhile (1) {\n\t\t/* Make sure we check the servers at the very begining */\n\t\tdebug(LOG_DEBUG, \"Running ping()\");\n\t\tping();\n\t\t\n\t\t/* Sleep for config.checkinterval seconds... */\n\t\ttimeout.tv_sec = time(NULL) + config_get_config()->checkinterval;\n\t\ttimeout.tv_nsec = 0;\n\n\t\t/* Mutex must be locked for pthread_cond_timedwait... */\n\t\tpthread_mutex_lock(&cond_mutex);\n\t\t\n\t\t/* Thread safe \"sleep\" */\n\t\tpthread_cond_timedwait(&cond, &cond_mutex, &timeout);\n\n\t\t/* No longer needs to be locked */\n\t\tpthread_mutex_unlock(&cond_mutex);\n\t}\n}\n\n/** @internal\n * This function does the actual request.\n */\nstatic void\nping(void)\n{\n        ssize_t\t\t\tnumbytes;\n        size_t\t        \ttotalbytes;\n\tint\t\t\tsockfd, nfds, done;\n\tchar\t\t\trequest[MAX_BUF];\n\tfd_set\t\t\treadfds;\n\tstruct timeval\t\ttimeout;\n\tFILE * fh;\n\tunsigned long int sys_uptime  = 0;\n\tunsigned int      sys_memfree = 0;\n\tfloat             sys_load    = 0;\n\tt_auth_serv\t*auth_server = NULL;\n\tauth_server = get_auth_server();\n\t\n\tdebug(LOG_DEBUG, \"Entering ping()\");\n\t\n\t/*\n\t * The ping thread does not really try to see if the auth server is actually\n\t * working. Merely that there is a web server listening at the port. And that\n\t * is done by connect_auth_server() internally.\n\t */\n\tsockfd = connect_auth_server();\n\tif (sockfd == -1) {\n\t\t/*\n\t\t * No auth servers for me to talk to\n\t\t */\n\t\treturn;\n\t}\n\n\t/*\n\t * Populate uptime, memfree and load\n\t */\n\tif ((fh = fopen(\"/proc/uptime\", \"r\"))) {\n\t\tif(fscanf(fh, \"%lu\", &sys_uptime) != 1)\n\t\t\tdebug(LOG_CRIT, \"Failed to read uptime\");\n\n\t\tfclose(fh);\n\t}\n\tif ((fh = fopen(\"/proc/meminfo\", \"r\"))) {\n\t\twhile (!feof(fh)) {\n\t\t\tif (fscanf(fh, \"MemFree: %u\", &sys_memfree) == 0) {\n\t\t\t\t/* Not on this line */\n\t\t\t\twhile (!feof(fh) && fgetc(fh) != '\\n');\n\t\t\t}\n\t\t\telse {\n\t\t\t\t/* Found it */\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tfclose(fh);\n\t}\n\tif ((fh = fopen(\"/proc/loadavg\", \"r\"))) {\n\t\tif(fscanf(fh, \"%f\", &sys_load) != 1)\n\t\t\tdebug(LOG_CRIT, \"Failed to read loadavg\");\n\n\t\tfclose(fh);\n\t}\n\n\t/*\n\t * Prep & send request\n\t */\n\tsnprintf(request, sizeof(request) - 1,\n\t\t\t\"GET %s%sgw_id=%s&gw_mac=%s&sys_uptime=%lu&sys_memfree=%u&sys_load=%.2f&wifidog_uptime=%lu HTTP/1.0\\r\\n\"\n\t\t\t\"User-Agent: WiFiDog %s\\r\\n\"\n\t\t\t\"Host: %s\\r\\n\"\n\t\t\t\"\\r\\n\",\n\t\t\tauth_server->authserv_path,\n\t\t\tauth_server->authserv_ping_script_path_fragment,\n\t\t\tconfig_get_config()->gw_id,\n\t\t\tconfig_get_config()->gw_interface_mac,\n\t\t\tsys_uptime,\n\t\t\tsys_memfree,\n\t\t\tsys_load,\n\t\t\t(long unsigned int)((long unsigned int)time(NULL) - (long unsigned int)started_time),\n\t\t\tVERSION,\n\t\t\tauth_server->authserv_hostname);\n\n\tdebug(LOG_DEBUG, \"HTTP Request to Server: [%s]\", request);\n\t\n\tsend(sockfd, request, strlen(request), 0);\n\n\tdebug(LOG_DEBUG, \"Reading response\");\n\t\n\tnumbytes = totalbytes = 0;\n\tdone = 0;\n\tdo {\n\t\tFD_ZERO(&readfds);\n\t\tFD_SET(sockfd, &readfds);\n\t\ttimeout.tv_sec = 30; /* XXX magic... 30 second */\n\t\ttimeout.tv_usec = 0;\n\t\tnfds = sockfd + 1;\n\n\t\tnfds = select(nfds, &readfds, NULL, NULL, &timeout);\n\n\t\tif (nfds > 0) {\n\t\t\t/** We don't have to use FD_ISSET() because there\n\t\t\t *  was only one fd. */\n\t\t\tnumbytes = read(sockfd, request + totalbytes, MAX_BUF - (totalbytes + 1));\n\t\t\tif (numbytes < 0) {\n\t\t\t\tdebug(LOG_ERR, \"An error occurred while reading from auth server: %s\", strerror(errno));\n\t\t\t\t/* FIXME */\n\t\t\t\tclose(sockfd);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\telse if (numbytes == 0) {\n\t\t\t\tdone = 1;\n\t\t\t}\n\t\t\telse {\n\t\t\t\ttotalbytes += numbytes;\n\t\t\t\tdebug(LOG_DEBUG, \"Read %d bytes, total now %d\", numbytes, totalbytes);\n\t\t\t}\n\t\t}\n\t\telse if (nfds == 0) {\n\t\t\tdebug(LOG_ERR, \"Timed out reading data via select() from auth server\");\n\t\t\t/* FIXME */\n\t\t\tclose(sockfd);\n\t\t\treturn;\n\t\t}\n\t\telse if (nfds < 0) {\n\t\t\tdebug(LOG_ERR, \"Error reading data via select() from auth server: %s\", strerror(errno));\n\t\t\t/* FIXME */\n\t\t\tclose(sockfd);\n\t\t\treturn;\n\t\t}\n\t} while (!done);\n\tclose(sockfd);\n\n\tdebug(LOG_DEBUG, \"Done reading reply, total %d bytes\", totalbytes);\n\n\trequest[totalbytes] = '\\0';\n\n\tdebug(LOG_DEBUG, \"HTTP Response from Server: [%s]\", request);\n\t\n\tif (strstr(request, \"Pong\") == 0) {\n\t\tdebug(LOG_WARNING, \"Auth server did NOT say pong!\");\n\t\t/* FIXME */\n\t}\n\telse {\n\t\tdebug(LOG_DEBUG, \"Auth Server Says: Pong\");\n\t}\n\n\treturn;\t\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/ping_thread.h",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file ping_thread.h\n    @brief WiFiDog heartbeat thread\n    @author Copyright (C) 2004 Alexandre Carmel-Veilleux <acv@miniguru.ca>\n*/\n\n#ifndef _PING_THREAD_H_\n#define _PING_THREAD_H_\n\n#define MINIMUM_STARTED_TIME 1041379200 /* 2003-01-01 */\n\n/** @brief Periodically checks on the auth server to see if it's alive. */\nvoid thread_ping(void *arg);\n\n#endif\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/safe.c",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n \\********************************************************************/\n\n/*\n * $Id$\n */\n/**\n  @file safe.c\n  @brief Safe versions of stdlib/string functions that error out and exit if memory allocation fails\n  @author Copyright (C) 2005 Mina Naguib <mina@ilesansfil.org>\n */\n\n\n#include <stdarg.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <errno.h>\n\n#include \"httpd.h\"\n#include \"safe.h\"\n#include \"debug.h\"\n#include <syslog.h>\n\n/* From gateway.c */\nextern httpd * webserver;\n\nvoid * safe_malloc (size_t size) {\n\tvoid * retval = NULL;\n\tretval = malloc(size);\n\tif (!retval) {\n\t\tdebug(LOG_CRIT, \"Failed to malloc %d bytes of memory: %s.  Bailing out\", size, strerror(errno));\n\t\texit(1);\n\t}\n\treturn (retval);\n}\n\nchar * safe_strdup(const char *s) {\n\tchar * retval = NULL;\n\tif (!s) {\n\t\tdebug(LOG_CRIT, \"safe_strdup called with NULL which would have crashed strdup. Bailing out\");\n\t\texit(1);\n\t}\n\tretval = strdup(s);\n\tif (!retval) {\n\t\tdebug(LOG_CRIT, \"Failed to duplicate a string: %s.  Bailing out\", strerror(errno));\n\t\texit(1);\n\t}\n\treturn (retval);\n}\n\nint safe_asprintf(char **strp, const char *fmt, ...) {\n\tva_list ap;\n\tint retval;\n\n\tva_start(ap, fmt);\n\tretval = safe_vasprintf(strp, fmt, ap);\n\tva_end(ap);\n\n\treturn (retval);\n}\n\nint safe_vasprintf(char **strp, const char *fmt, va_list ap) {\n\tint retval;\n\n\tretval = vasprintf(strp, fmt, ap);\n\n\tif (retval == -1) {\n\t\tdebug(LOG_CRIT, \"Failed to vasprintf: %s.  Bailing out\", strerror(errno));\n\t\texit (1);\n\t}\n\treturn (retval);\n}\n\npid_t safe_fork(void) {\n\tpid_t result;\n\tresult = fork();\n\n\tif (result == -1) {\n\t\tdebug(LOG_CRIT, \"Failed to fork: %s.  Bailing out\", strerror(errno));\n\t\texit (1);\n\t}\n\telse if (result == 0) {\n\t\t/* I'm the child - do some cleanup */\n\t\tif (webserver) {\n\t\t\tclose(webserver->serverSock);\n\t\t\twebserver = NULL;\n\t\t}\n\t}\n\n\treturn result;\n}\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/safe.h",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file safe.h\n\t  @brief Safe versions of stdlib/string functions that error out and exit if memory allocation fails\n\t  @author Copyright (C) 2005 Mina Naguib <mina@ilesansfil.org>\n*/\n\n#ifndef _SAFE_H_\n#define _SAFE_H_\n\n#include <stdarg.h> /* For va_list */\n#include <sys/types.h> /* For fork */\n#include <unistd.h> /* For fork */\n\n/** @brief Safe version of malloc\n */\nvoid * safe_malloc (size_t size);\n\n/* @brief Safe version of strdup\n */\nchar * safe_strdup(const char *s);\n\n/* @brief Safe version of asprintf\n */\nint safe_asprintf(char **strp, const char *fmt, ...);\n\n/* @brief Safe version of vasprintf\n */\nint safe_vasprintf(char **strp, const char *fmt, va_list ap);\n\n/* @brief Safe version of fork\n */\n\npid_t safe_fork(void);\n\n#endif /* _SAFE_H_ */\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/util.c",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n \\********************************************************************/\n\n/*\n * $Id$\n */\n/**\n  @file util.c\n  @brief Misc utility functions\n  @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n  @author Copyright (C) 2006 Benoit Grégoire <bock@step.polymtl.ca>\n */\n\n#define _GNU_SOURCE\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <syslog.h>\n#include <errno.h>\n#include <pthread.h>\n#include <sys/wait.h>\n#include <sys/types.h>\n/*\t#include <sys/unistd.h>\tby Wiwiz */\n#include <unistd.h>\n#include <netinet/in.h>\n#include <sys/ioctl.h>\n#include <arpa/inet.h>\n\n#if defined(__NetBSD__)\n#include <sys/socket.h>\n#include <ifaddrs.h>\n#include <net/if.h>\n#include <net/if_dl.h>\n#include <util.h>\n#endif\n\n#ifdef __linux__\n#include <netinet/in.h>\n#include <net/if.h>\n#endif\n\n#include <string.h>\n#include <pthread.h>\n#include <netdb.h>\n\n#include \"common.h\"\n#include \"client_list.h\"\n#include \"safe.h\"\n#include \"util.h\"\n#include \"conf.h\"\n#include \"debug.h\"\n\n#include \"../config.h\"\n\nstatic pthread_mutex_t ghbn_mutex = PTHREAD_MUTEX_INITIALIZER;\n\n/* Defined in ping_thread.c */\nextern time_t started_time;\n\n/* Defined in clientlist.c */\nextern\tpthread_mutex_t\tclient_list_mutex;\nextern\tpthread_mutex_t\tconfig_mutex;\n\n/* Defined in commandline.c */\nextern pid_t restart_orig_pid;\n\n/* XXX Do these need to be locked ? */\nstatic time_t last_online_time = 0;\nstatic time_t last_offline_time = 0;\nstatic time_t last_auth_online_time = 0;\nstatic time_t last_auth_offline_time = 0;\n\nlong served_this_session = 0;\n\n/** Fork a child and execute a shell command, the parent\n * process waits for the child to return and returns the child's exit()\n * value.\n * @return Return code of the command\n */\nint\nexecute(const char *cmd_line, int quiet)\n{\n        int pid,\n            status,\n            rc;\n\n        const char *new_argv[4];\n        new_argv[0] = \"/bin/sh\";\n        new_argv[1] = \"-c\";\n        new_argv[2] = cmd_line;\n        new_argv[3] = NULL;\n\n        pid = safe_fork();\n        if (pid == 0) {    /* for the child process:         */\n                /* We don't want to see any errors if quiet flag is on */\n                if (quiet) close(2);\n                if (execvp(\"/bin/sh\", (char *const *)new_argv) == -1) {    /* execute the command  */\n                        debug(LOG_ERR, \"execvp(): %s\", strerror(errno));\n                } else {\n                        debug(LOG_ERR, \"execvp() failed\");\n                }\n                exit(1);\n        }\n\n        /* for the parent:      */\n\tdebug(LOG_DEBUG, \"Waiting for PID %d to exit\", pid);\n\trc = waitpid(pid, &status, 0);\n\tdebug(LOG_DEBUG, \"Process PID %d exited\", rc);\n\n        return (WEXITSTATUS(status));\n}\n\n\tstruct in_addr *\nwd_gethostbyname(const char *name)\n{\n\tstruct hostent *he;\n\tstruct in_addr *h_addr, *in_addr_temp;\n\n\t/* XXX Calling function is reponsible for free() */\n\n\th_addr = safe_malloc(sizeof(struct in_addr));\n\n\tLOCK_GHBN();\n\n\the = gethostbyname(name);\n\n\tif (he == NULL) {\n\t\tfree(h_addr);\n\t\tUNLOCK_GHBN();\n\t\treturn NULL;\n\t}\n\n\tmark_online();\n\n\tin_addr_temp = (struct in_addr *)he->h_addr_list[0];\n\th_addr->s_addr = in_addr_temp->s_addr;\n\n\tUNLOCK_GHBN();\n\n\treturn h_addr;\n}\n\n\tchar *\nget_iface_ip(const char *ifname)\n{\n#if defined(__linux__)\n\tstruct ifreq if_data;\n\tstruct in_addr in;\n\tchar *ip_str;\n\tint sockd;\n\tu_int32_t ip;\n\n\t/* Create a socket */\n\tif ((sockd = socket (AF_INET, SOCK_PACKET, htons(0x8086))) < 0) {\n\t\tdebug(LOG_ERR, \"socket(): %s\", strerror(errno));\n\t\treturn NULL;\n\t}\n\n\t/* Get IP of internal interface */\n\tstrcpy (if_data.ifr_name, ifname);\n\n\t/* Get the IP address */\n\tif (ioctl (sockd, SIOCGIFADDR, &if_data) < 0) {\n\t\tdebug(LOG_ERR, \"ioctl(): SIOCGIFADDR %s\", strerror(errno));\n\t\treturn NULL;\n\t}\n\tmemcpy ((void *) &ip, (void *) &if_data.ifr_addr.sa_data + 2, 4);\n\tin.s_addr = ip;\n\n\tip_str = inet_ntoa(in);\n\tclose(sockd);\n\treturn safe_strdup(ip_str);\n#elif defined(__NetBSD__)\n\tstruct ifaddrs *ifa, *ifap;\n\tchar *str = NULL;\n\n\tif (getifaddrs(&ifap) == -1) {\n\t\tdebug(LOG_ERR, \"getifaddrs(): %s\", strerror(errno));\n\t\treturn NULL;\n\t}\n\t/* XXX arbitrarily pick the first IPv4 address */\n\tfor (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {\n\t\tif (strcmp(ifa->ifa_name, ifname) == 0 &&\n\t\t\t\tifa->ifa_addr->sa_family == AF_INET)\n\t\t\tbreak;\n\t}\n\tif (ifa == NULL) {\n\t\tdebug(LOG_ERR, \"%s: no IPv4 address assigned\");\n\t\tgoto out;\n\t}\n\tstr = safe_strdup(inet_ntoa(\n\t\t\t\t((struct sockaddr_in *)ifa->ifa_addr)->sin_addr));\nout:\n\tfreeifaddrs(ifap);\n\treturn str;\n#else\n\treturn safe_strdup(\"0.0.0.0\");\n#endif\n}\n\n\tchar *\nget_iface_mac(const char *ifname)\n{\n#if defined(__linux__)\n\tint r, s;\n\tstruct ifreq ifr;\n\tchar *hwaddr, mac[13];\n\n\tstrcpy(ifr.ifr_name, ifname);\n\n\ts = socket(PF_INET, SOCK_DGRAM, 0);\n\tif (-1 == s) {\n\t\tdebug(LOG_ERR, \"get_iface_mac socket: %s\", strerror(errno));\n\t\treturn NULL;\n\t}\n\n\tr = ioctl(s, SIOCGIFHWADDR, &ifr);\n\tif (r == -1) {\n\t\tdebug(LOG_ERR, \"get_iface_mac ioctl(SIOCGIFHWADDR): %s\", strerror(errno));\n\t\tclose(s);\n\t\treturn NULL;\n\t}\n\n\thwaddr = ifr.ifr_hwaddr.sa_data;\n\tclose(s);\n\tsnprintf(mac, sizeof(mac), \"%02X%02X%02X%02X%02X%02X\", \n\t\t\thwaddr[0] & 0xFF,\n\t\t\thwaddr[1] & 0xFF,\n\t\t\thwaddr[2] & 0xFF,\n\t\t\thwaddr[3] & 0xFF,\n\t\t\thwaddr[4] & 0xFF,\n\t\t\thwaddr[5] & 0xFF\n\t\t);\n\n\treturn safe_strdup(mac);\n#elif defined(__NetBSD__)\n\tstruct ifaddrs *ifa, *ifap;\n\tconst char *hwaddr;\n\tchar mac[13], *str = NULL;\n\tstruct sockaddr_dl *sdl;\n\n\tif (getifaddrs(&ifap) == -1) {\n\t\tdebug(LOG_ERR, \"getifaddrs(): %s\", strerror(errno));\n\t\treturn NULL;\n\t}\n\tfor (ifa = ifap; ifa != NULL; ifa = ifa->ifa_next) {\n\t\tif (strcmp(ifa->ifa_name, ifname) == 0 &&\n\t\t\t\tifa->ifa_addr->sa_family == AF_LINK)\n\t\t\tbreak;\n\t}\n\tif (ifa == NULL) {\n\t\tdebug(LOG_ERR, \"%s: no link-layer address assigned\");\n\t\tgoto out;\n\t}\n\tsdl = (struct sockaddr_dl *)ifa->ifa_addr;\n\thwaddr = LLADDR(sdl);\n\tsnprintf(mac, sizeof(mac), \"%02X%02X%02X%02X%02X%02X\",\n\t\t\thwaddr[0] & 0xFF, hwaddr[1] & 0xFF,\n\t\t\thwaddr[2] & 0xFF, hwaddr[3] & 0xFF,\n\t\t\thwaddr[4] & 0xFF, hwaddr[5] & 0xFF);\n\n\tstr = safe_strdup(mac);\nout:\n\tfreeifaddrs(ifap);\n\treturn str;\n#else\n\treturn NULL;\n#endif\n}\n\n\tchar *\nget_ext_iface(void)\n{\n#ifdef __linux__\n\tFILE *input;\n\tchar *device, *gw;\n\tint i = 1;\n\tint keep_detecting = 1;\n\tpthread_cond_t\t\tcond = PTHREAD_COND_INITIALIZER;\n\tpthread_mutex_t\t\tcond_mutex = PTHREAD_MUTEX_INITIALIZER;\n\tstruct\ttimespec\ttimeout;\n\tdevice = (char *)malloc(16);\n\tgw = (char *)malloc(16);\n\tdebug(LOG_DEBUG, \"get_ext_iface(): Autodectecting the external interface from routing table\");\n\twhile(keep_detecting) {\n\t\tinput = fopen(\"/proc/net/route\", \"r\");\n\t\twhile (!feof(input)) {\n\t\t\t/* XXX scanf(3) is unsafe, risks overrun */\n\t\t\tif ((fscanf(input, \"%s %s %*s %*s %*s %*s %*s %*s %*s %*s %*s\\n\", device, gw) == 2) && strcmp(gw, \"00000000\") == 0) {\n\t\t\t\tfree(gw);\n\t\t\t\tdebug(LOG_INFO, \"get_ext_iface(): Detected %s as the default interface after try %d\", device, i);\n\t\t\t\treturn device;\n\t\t\t}\n\t\t}\n\t\tfclose(input);\n\t\tdebug(LOG_ERR, \"get_ext_iface(): Failed to detect the external interface after try %d (maybe the interface is not up yet?).  Retry limit: %d\", i, NUM_EXT_INTERFACE_DETECT_RETRY);\n\t\t/* Sleep for EXT_INTERFACE_DETECT_RETRY_INTERVAL seconds */\n\t\ttimeout.tv_sec = time(NULL) + EXT_INTERFACE_DETECT_RETRY_INTERVAL;\n\t\ttimeout.tv_nsec = 0;\n\t\t/* Mutex must be locked for pthread_cond_timedwait... */\n\t\tpthread_mutex_lock(&cond_mutex);\t\n\t\t/* Thread safe \"sleep\" */\n\t\tpthread_cond_timedwait(&cond, &cond_mutex, &timeout);\n\t\t/* No longer needs to be locked */\n\t\tpthread_mutex_unlock(&cond_mutex);\n\t\t//for (i=1; i<=NUM_EXT_INTERFACE_DETECT_RETRY; i++) {\n\t\tif (NUM_EXT_INTERFACE_DETECT_RETRY != 0 && i>NUM_EXT_INTERFACE_DETECT_RETRY) {\n\t\t\tkeep_detecting = 0;\n\t\t}\n\t\ti++;\n\t}\n\tdebug(LOG_ERR, \"get_ext_iface(): Failed to detect the external interface after %d tries, aborting\", i);\n\texit(1);\n\tfree(device);\n\tfree(gw);\n#endif\n\treturn NULL;\n\t}\n\n\tvoid mark_online() {\n\t\tint before;\n\t\tint after;\n\n\t\tbefore = is_online();\n\t\ttime(&last_online_time);\n\t\tafter = is_online();\n\n\t\tif (before != after) {\n\t\t\tdebug(LOG_INFO, \"ONLINE status became %s\", (after ? \"ON\" : \"OFF\"));\n\t\t}\n\n\t}\n\n\tvoid mark_offline() {\n\t\tint before;\n\t\tint after;\n\n\t\tbefore = is_online();\n\t\ttime(&last_offline_time);\n\t\tafter = is_online();\n\n\t\tif (before != after) {\n\t\t\tdebug(LOG_INFO, \"ONLINE status became %s\", (after ? \"ON\" : \"OFF\"));\n\t\t}\n\n\t\t/* If we're offline it definately means the auth server is offline */\n\t\tmark_auth_offline();\n\n\t}\n\n\tint is_online() {\n\t\tif (last_online_time == 0 || (last_offline_time - last_online_time) >= (config_get_config()->checkinterval * 2) ) {\n\t\t\t/* We're probably offline */\n\t\t\treturn (0);\n\t\t}\n\t\telse {\n\t\t\t/* We're probably online */\n\t\t\treturn (1);\n\t\t}\n\t}\n\n\tvoid mark_auth_online() {\n\t\tint before;\n\t\tint after;\n\n\t\tbefore = is_auth_online();\n\t\ttime(&last_auth_online_time);\n\t\tafter = is_auth_online();\n\n\t\tif (before != after) {\n\t\t\tdebug(LOG_INFO, \"AUTH_ONLINE status became %s\", (after ? \"ON\" : \"OFF\"));\n\t\t}\n\n\t\t/* If auth server is online it means we're definately online */\n\t\tmark_online();\n\n\t}\n\n\tvoid mark_auth_offline() {\n\t\tint before;\n\t\tint after;\n\n\t\tbefore = is_auth_online();\n\t\ttime(&last_auth_offline_time);\n\t\tafter = is_auth_online();\n\n\t\tif (before != after) {\n\t\t\tdebug(LOG_INFO, \"AUTH_ONLINE status became %s\", (after ? \"ON\" : \"OFF\"));\n\t\t}\n\n\t}\n\n\tint is_auth_online() {\n\t\tif (!is_online()) {\n\t\t\t/* If we're not online auth is definately not online :) */\n\t\t\treturn (0);\n\t\t}\n\t\telse if (last_auth_online_time == 0 || (last_auth_offline_time - last_auth_online_time) >= (config_get_config()->checkinterval * 2) ) {\n\t\t\t/* Auth is  probably offline */\n\t\t\treturn (0);\n\t\t}\n\t\telse {\n\t\t\t/* Auth is probably online */\n\t\t\treturn (1);\n\t\t}\n\t}\n\n\t/*\n\t * @return A string containing human-readable status text. MUST BE free()d by caller\n\t */\n\tchar * get_status_text() {\n\t\tchar buffer[STATUS_BUF_SIZ];\n\t\tssize_t len;\n\t\ts_config *config;\n\t\tt_auth_serv *auth_server;\n\t\tt_client\t*first;\n\t\tint\t\tcount;\n\t\tunsigned long int uptime = 0;\n\t\tunsigned int days = 0, hours = 0, minutes = 0, seconds = 0;\n\t\tt_trusted_mac *p;\n\n\t\tlen = 0;\n\t\tsnprintf(buffer, (sizeof(buffer) - len), \"WiFiDog status\\n\\n\");\n\t\tlen = strlen(buffer);\n\n\t\tuptime = time(NULL) - started_time;\n\t\tdays    = uptime / (24 * 60 * 60);\n\t\tuptime -= days * (24 * 60 * 60);\n\t\thours   = uptime / (60 * 60);\n\t\tuptime -= hours * (60 * 60);\n\t\tminutes = uptime / 60;\n\t\tuptime -= minutes * 60;\n\t\tseconds = uptime;\n\n\t\tsnprintf((buffer + len), (sizeof(buffer) - len), \"Version: \" VERSION \"\\n\");\n\t\tlen = strlen(buffer);\n\n\t\tsnprintf((buffer + len), (sizeof(buffer) - len), \"Uptime: %ud %uh %um %us\\n\", days, hours, minutes, seconds);\n\t\tlen = strlen(buffer);\n\n\t\tsnprintf((buffer + len), (sizeof(buffer) - len), \"Has been restarted: \");\n\t\tlen = strlen(buffer);\n\t\tif (restart_orig_pid) {\n\t\t\tsnprintf((buffer + len), (sizeof(buffer) - len), \"yes (from PID %d)\\n\", restart_orig_pid);\n\t\t\tlen = strlen(buffer);\n\t\t}\n\t\telse {\n\t\t\tsnprintf((buffer + len), (sizeof(buffer) - len), \"no\\n\");\n\t\t\tlen = strlen(buffer);\n\t\t}\n\n\t\tsnprintf((buffer + len), (sizeof(buffer) - len), \"Internet Connectivity: %s\\n\", (is_online() ? \"yes\" : \"no\"));\n\t\tlen = strlen(buffer);\n\n\t\tsnprintf((buffer + len), (sizeof(buffer) - len), \"Auth server reachable: %s\\n\", (is_auth_online() ? \"yes\" : \"no\"));\n\t\tlen = strlen(buffer);\n\n\t\tsnprintf((buffer + len), (sizeof(buffer) - len), \"Clients served this session: %lu\\n\\n\", served_this_session);\n\t\tlen = strlen(buffer);\n\n\t\tLOCK_CLIENT_LIST();\n\n\t\tfirst = client_get_first_client();\n\n\t\tif (first == NULL) {\n\t\t\tcount = 0;\n\t\t} else {\n\t\t\tcount = 1;\n\t\t\twhile (first->next != NULL) {\n\t\t\t\tfirst = first->next;\n\t\t\t\tcount++;\n\t\t\t}\n\t\t}\n\n\t\tsnprintf((buffer + len), (sizeof(buffer) - len), \"%d clients \"\n\t\t\t\t\"connected.\\n\", count);\n\t\tlen = strlen(buffer);\n\n\t\tfirst = client_get_first_client();\n\n\t\tcount = 0;\n\t\twhile (first != NULL) {\n\t\t\tsnprintf((buffer + len), (sizeof(buffer) - len), \"\\nClient %d\\n\", count);\n\t\t\tlen = strlen(buffer);\n\n\t\t\tsnprintf((buffer + len), (sizeof(buffer) - len), \"  IP: %s MAC: %s\\n\", first->ip, first->mac);\n\t\t\tlen = strlen(buffer);\n\n\t\t\tsnprintf((buffer + len), (sizeof(buffer) - len), \"  Token: %s\\n\", first->token);\n\t\t\tlen = strlen(buffer);\n\n\t\t\tsnprintf((buffer + len), (sizeof(buffer) - len), \"  Downloaded: %llu\\n  Uploaded: %llu\\n\" , first->counters.incoming, first->counters.outgoing);\n\t\t\tlen = strlen(buffer);\n\n\t\t\tcount++;\n\t\t\tfirst = first->next;\n\t\t}\n\n\t\tUNLOCK_CLIENT_LIST();\n\n\t\tconfig = config_get_config();\n\n\t\tif (config->trustedmaclist != NULL) {\n\t\t\tsnprintf((buffer + len), (sizeof(buffer) - len), \"\\nTrusted MAC addresses:\\n\");\n\t\t\tlen = strlen(buffer);\n\n\t\t\tfor (p = config->trustedmaclist; p != NULL; p = p->next) {\n\t\t\t\tsnprintf((buffer + len), (sizeof(buffer) - len), \"  %s\\n\", p->mac);\n\t\t\t\tlen = strlen(buffer);\n\t\t\t}\n\t\t}\n\n\t\tsnprintf((buffer + len), (sizeof(buffer) - len), \"\\nAuthentication servers:\\n\");\n\t\tlen = strlen(buffer);\n\n\t\tLOCK_CONFIG();\n\n\t\tfor (auth_server = config->auth_servers; auth_server != NULL; auth_server = auth_server->next) {\n\t\t\tsnprintf((buffer + len), (sizeof(buffer) - len), \"  Host: %s (%s)\\n\", auth_server->authserv_hostname, auth_server->last_ip);\n\t\t\tlen = strlen(buffer);\n\t\t}\n\n\t\tUNLOCK_CONFIG();\n\n\t\treturn safe_strdup(buffer);\n\t}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/util.h",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file util.h\n    @brief Misc utility functions\n    @author Copyright (C) 2004 Philippe April <papril777@yahoo.com>\n*/\n\n#ifndef _UTIL_H_\n#define _UTIL_H_\n\n#define STATUS_BUF_SIZ\t16384\n\n/** @brief Execute a shell command\n */\nint execute(const char *cmd_line, int quiet);\nstruct in_addr *wd_gethostbyname(const char *name);\n\n/* @brief Get IP address of an interface */\nchar *get_iface_ip(const char *ifname);\n\n/* @brief Get MAC address of an interface */\nchar *get_iface_mac(const char *ifname);\n\n/* @brief Get interface name of default gateway */\nchar *get_ext_iface (void);\n\n/* @brief Sets hint that an online action (dns/connect/etc using WAN) succeeded */\nvoid mark_online();\n/* @brief Sets hint that an online action (dns/connect/etc using WAN) failed */\nvoid mark_offline();\n/* @brief Returns a guess (true or false) on whether we're online or not based on previous calls to mark_online and mark_offline */\nint is_online();\n\n/* @brief Sets hint that an auth server online action succeeded */\nvoid mark_auth_online();\n/* @brief Sets hint that an auth server online action failed */\nvoid mark_auth_offline();\n/* @brief Returns a guess (true or false) on whether we're an auth server is online or not based on previous calls to mark_auth_online and mark_auth_offline */\nint is_auth_online();\n\n/*\n * @brief Creates a human-readable paragraph of the status of wifidog\n */\nchar * get_status_text();\n\n#define LOCK_GHBN() do { \\\n\tdebug(LOG_DEBUG, \"Locking wd_gethostbyname()\"); \\\n\tpthread_mutex_lock(&ghbn_mutex); \\\n\tdebug(LOG_DEBUG, \"wd_gethostbyname() locked\"); \\\n} while (0)\n\n#define UNLOCK_GHBN() do { \\\n\tdebug(LOG_DEBUG, \"Unlocking wd_gethostbyname()\"); \\\n\tpthread_mutex_unlock(&ghbn_mutex); \\\n\tdebug(LOG_DEBUG, \"wd_gethostbyname() unlocked\"); \\\n} while (0)\n\n#endif /* _UTIL_H_ */\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/wdctl.c",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file wdctl.c\n    @brief Monitoring and control of wifidog, client part\n    @author Copyright (C) 2004 Alexandre Carmel-Veilleux <acv@acv.ca>\n*/\n\n#define _GNU_SOURCE\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <pthread.h>\n#include <string.h>\n#include <stdarg.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <sys/un.h>\n#include <unistd.h>\n#include <syslog.h>\n#include <errno.h>\n\n#include \"wdctl.h\"\n\ns_config config;\n\nstatic void usage(void);\nstatic void init_config(void);\nstatic void parse_commandline(int, char **);\nstatic int connect_to_server(const char *);\nstatic size_t send_request(int, const char *);\nstatic void wdctl_status(void);\nstatic void wdctl_stop(void);\nstatic void wdctl_reset(void);\nstatic void wdctl_restart(void);\n\n/** @internal\n * @brief Print usage\n *\n * Prints usage, called when wdctl is run with -h or with an unknown option\n */\nstatic void\nusage(void)\n{\n    printf(\"Usage: wdctl [options] command [arguments]\\n\");\n    printf(\"\\n\");\n    printf(\"options:\\n\");\n    printf(\"  -s <path>         Path to the socket\\n\");\n    printf(\"  -h                Print usage\\n\");\n    printf(\"\\n\");\n    printf(\"commands:\\n\");\n    printf(\"  reset [mac|ip]    Reset the specified mac or ip connection\\n\");\n    printf(\"  status            Obtain the status of wifidog\\n\");\n    printf(\"  stop              Stop the running wifidog\\n\");\n    printf(\"  restart           Re-start the running wifidog (without disconnecting active users!)\\n\");\n    printf(\"  auth              MAC IP TOKEN \\n\");\t/* wiwiz */\n    printf(\"\\n\");\n}\n\n/** @internal\n *\n * Init default values in config struct\n */\nstatic void\ninit_config(void)\n{\n\n\tconfig.socket = strdup(DEFAULT_SOCK);\n\tconfig.command = WDCTL_UNDEF;\n}\n\n/** @internal\n *\n * Uses getopt() to parse the command line and set configuration values\n */\nvoid\nparse_commandline(int argc, char **argv)\n{\n    extern int optind;\n    int c;\n\n    while (-1 != (c = getopt(argc, argv, \"s:h\"))) {\n        switch(c) {\n            case 'h':\n                usage();\n                exit(1);\n                break;\n\n            case 's':\n                if (optarg) {\n\t\t    free(config.socket);\n\t\t    config.socket = strdup(optarg);\n                }\n                break;\n\n            default:\n                usage();\n                exit(1);\n                break;\n        }\n    }\n\n    if ((argc - optind) <= 0) {\n\t    usage();\n\t    exit(1);\n    }\n\n    if (strcmp(*(argv + optind), \"status\") == 0) {\n\t    config.command = WDCTL_STATUS;\n    } else if (strcmp(*(argv + optind), \"stop\") == 0) {\n\t    config.command = WDCTL_STOP;\n    } else if (strcmp(*(argv + optind), \"reset\") == 0) {\n\t    config.command = WDCTL_KILL;\n\t    if ((argc - (optind + 1)) <= 0) {\n\t\t    fprintf(stderr, \"wdctl: Error: You must specify an IP \"\n\t\t\t\t    \"or a Mac address to reset\\n\");\n\t\t    usage();\n\t\t    exit(1);\n\t    }\n\t    config.param = strdup(*(argv + optind + 1));\n    } else if (strcmp(*(argv + optind), \"restart\") == 0) {\n\t    config.command = WDCTL_RESTART;\n\t/* start: added by Wiwiz */\n\t} else if (strcmp(*(argv + optind), \"auth\") == 0) {\n\t\tconfig.command = WDCTL_AUTH;\n\n\t\t/*\n\t\tfprintf(stderr, \"argc=%d\\n\", argc);\n\t\tfprintf(stderr, \"argv[0]=%s\\n\", argv[0]);\n\t\tfprintf(stderr, \"argv[1]=%s\\n\", argv[1]);\n\t\tfprintf(stderr, \"argv[2]=%s\\n\", argv[2]);\n\t\tfprintf(stderr, \"argv[3]=%s\\n\", argv[3]);\n\t\tfprintf(stderr, \"argv[4]=%s\\n\", argv[4]);\n\t\t*/\n\n\t\tif(argc < 5) {\n\t\t    fprintf(stderr, \"wdctl: it should be: wdctl auth MAC IP TOKEN \\n\");\n\t\t    exit(1);\n\t\t}\n\t} else if (strcmp(*(argv + optind), \"sleep\") == 0) {\n\t\tconfig.command = WDCTL_SLEEP;\n\n\t\tif(argc < 3) {\n\t\t    fprintf(stderr, \"wdctl: it should be: wdctl sleep <N milliseconds>  \\n\");\n\t\t    exit(1);\n\t\t}\n\t}\n    /* end: added by Wiwiz */\n\t else {\n\t    fprintf(stderr, \"wdctl: Error: Invalid command \\\"%s\\\"\\n\", *(argv + optind));\n\t    usage();\n\t    exit(1);\n    }\n}\n\nstatic int\nconnect_to_server(const char *sock_name)\n{\n\tint sock;\n\tstruct sockaddr_un\tsa_un;\n\t\n\t/* Connect to socket */\n\tsock = socket(AF_UNIX, SOCK_STREAM, 0);\n\tmemset(&sa_un, 0, sizeof(sa_un));\n\tsa_un.sun_family = AF_UNIX;\n\tstrncpy(sa_un.sun_path, sock_name, (sizeof(sa_un.sun_path) - 1));\n\n\tif (connect(sock, (struct sockaddr *)&sa_un, \n\t\t\tstrlen(sa_un.sun_path) + sizeof(sa_un.sun_family))) {\n\t\tfprintf(stderr, \"wdctl: wifidog probably not started (Error: %s)\\n\", strerror(errno));\n\t\texit(1);\n\t}\n\n\treturn sock;\n}\n\nstatic size_t\nsend_request(int sock, const char *request)\n{\n\tsize_t\tlen;\n        ssize_t written;\n\t\t\n\tlen = 0;\n\twhile (len != strlen(request)) {\n\t\twritten = write(sock, (request + len), strlen(request) - len);\n\t\tif (written == -1) {\n\t\t\tfprintf(stderr, \"Write to wifidog failed: %s\\n\",\n\t\t\t\t\tstrerror(errno));\n\t\t\texit(1);\n\t\t}\n\t\tlen += written;\n\t}\n\n\treturn len;\n}\n\nstatic void\nwdctl_status(void)\n{\n\tint\tsock;\n\tchar\tbuffer[4096];\n\tchar\trequest[16];\n\tint\tlen;\n\n\tsock = connect_to_server(config.socket);\n\t\t\n\tstrncpy(request, \"status\\r\\n\\r\\n\", 15);\n\n\tlen = send_request(sock, request);\n\t\n\twhile ((len = read(sock, buffer, sizeof(buffer))) > 0) {\n\t\tbuffer[len] = '\\0';\n\t\tprintf(\"%s\", buffer);\n\t}\n\n\tshutdown(sock, 2);\n\tclose(sock);\n}\n\nstatic void\nwdctl_stop(void)\n{\n\tint\tsock;\n\tchar\tbuffer[4096];\n\tchar\trequest[16];\n\tint\tlen;\n\n\tsock = connect_to_server(config.socket);\n\t\t\n\tstrncpy(request, \"stop\\r\\n\\r\\n\", 15);\n\n\tlen = send_request(sock, request);\n\t\n\twhile ((len = read(sock, buffer, sizeof(buffer))) > 0) {\n\t\tbuffer[len] = '\\0';\n\t\tprintf(\"%s\", buffer);\n\t}\n\n\tshutdown(sock, 2);\n\tclose(sock);\n}\n\nvoid\nwdctl_reset(void)\n{\n\tint\tsock;\n\tchar\tbuffer[4096];\n\tchar\trequest[64];\n\tsize_t\tlen;\n\tint\trlen;\n\n\tsock = connect_to_server(config.socket);\n\t\t\n\tstrncpy(request, \"reset \", 64);\n\tstrncat(request, config.param, (64 - strlen(request)));\n\tstrncat(request, \"\\r\\n\\r\\n\", (64 - strlen(request)));\n\n\tlen = send_request(sock, request);\n\t\n\tlen = 0;\n\tmemset(buffer, 0, sizeof(buffer));\n\twhile ((len < sizeof(buffer)) && ((rlen = read(sock, (buffer + len),\n\t\t\t\t(sizeof(buffer) - len))) > 0)){\n\t\tlen += rlen;\n\t}\n\n\tif (strcmp(buffer, \"Yes\") == 0) {\n\t\tprintf(\"Connection %s successfully reset.\\n\", config.param);\n\t} else if (strcmp(buffer, \"No\") == 0) {\n\t\tprintf(\"Connection %s was not active.\\n\", config.param);\n\t} else {\n\t\tfprintf(stderr, \"wdctl: Error: WiFiDog sent an abnormal \"\n\t\t\t\t\"reply.\\n\");\n\t}\n\n\tshutdown(sock, 2);\n\tclose(sock);\n}\n\nstatic void\nwdctl_restart(void)\n{\n\tint\tsock;\n\tchar\tbuffer[4096];\n\tchar\trequest[16];\n\tint\tlen;\n\n\tsock = connect_to_server(config.socket);\n\t\t\n\tstrncpy(request, \"restart\\r\\n\\r\\n\", 15);\n\n\tlen = send_request(sock, request);\n\t\n\twhile ((len = read(sock, buffer, sizeof(buffer))) > 0) {\n\t\tbuffer[len] = '\\0';\n\t\tprintf(\"%s\", buffer);\n\t}\n\n\tshutdown(sock, 2);\n\tclose(sock);\n}\n\n/* start: added by Wiwiz */\nvoid\nwdctl_auth(char *mac, char *ip, char *token)\n{\n\tint\tsock;\n\tchar\tbuffer[4096];\n\tchar\trequest[64];\n\tint\tlen;\n\tchar s[64];\n\n\tstrcpy(s, mac);\n\tstrcat(s, \",\");\n\tstrcat(s, ip);\n\tstrcat(s, \",\");\n\tstrcat(s, token);\n\n\tsock = connect_to_server(config.socket);\n\n\tstrncpy(request, \"auth \", 64);\n\tstrncat(request, s, (64 - strlen(request)));\n\tstrncat(request, \"\\r\\n\\r\\n\", (64 - strlen(request)));\n\n\tlen = send_request(sock, request);\n\n\twhile ((len = read(sock, buffer, sizeof(buffer))) > 0) {\n\t\tbuffer[len] = '\\0';\n\t\tprintf(\"%s\\n\", buffer);\n\t}\n\n\tshutdown(sock, 2);\n\tclose(sock);\n\n/*\n\tlen = send_request(sock, request);\n\n\tlen = 0;\n\tmemset(buffer, 0, sizeof(buffer));\n\twhile ((len < sizeof(buffer)) && ((rlen = read(sock, (buffer + len),\n\t\t\t\t(sizeof(buffer) - len))) > 0)){\n\t\tlen += rlen;\n\t}\n\n\tif (strcmp(buffer, \"Yes\") == 0) {\n\t\tprintf(\"Connection %s successfully reset.\\n\", config.param);\n\t} else if (strcmp(buffer, \"No\") == 0) {\n\t\tprintf(\"Connection %s was not active.\\n\", config.param);\n\t} else {\n\t\tfprintf(stderr, \"wdctl: Error: WiFiDog sent an abnormal \"\n\t\t\t\t\"reply.\\n\");\n\t}\n\n\tshutdown(sock, 2);\n\tclose(sock);\n\t*/\n}\n/* end: added by Wiwiz */\n\nint\nmain(int argc, char **argv)\n{\n\n\t/* Init configuration */\n\tinit_config();\n\tparse_commandline(argc, argv);\n\n\tswitch(config.command) {\n\tcase WDCTL_STATUS:\n\t\twdctl_status();\n\t\tbreak;\n\t\n\tcase WDCTL_STOP:\n\t\twdctl_stop();\n\t\tbreak;\n\n\tcase WDCTL_KILL:\n\t\twdctl_reset();\n\t\tbreak;\n\t\t\n\tcase WDCTL_RESTART:\n\t\twdctl_restart();\n\t\tbreak;\n\n\t/* start: added by Wiwiz */\n\tcase WDCTL_AUTH:\n\t\twdctl_auth(argv[2], argv[3], argv[4]);\n\t\tbreak;\n\tcase WDCTL_SLEEP:\n\t\tusleep(atoi(argv[2]));\n\t\tbreak;\n\t/* end: added by Wiwiz */\n\n\tdefault:\n\t\t/* XXX NEVER REACHED */\n\t\tfprintf(stderr, \"Oops\\n\");\n\t\texit(1);\n\t\tbreak;\n\t}\n\texit(0);\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/wdctl.h",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file wdctl.h\n    @brief WiFiDog monitoring client\n    @author Copyright (C) 2004 Alexandre Carmel-Veilleux <acv@acv.ca>\n*/\n\n#ifndef _WDCTL_H_\n#define _WDCTL_H_\n\n#define DEFAULT_SOCK\t\"/tmp/wdctl.sock\"\n\n#define WDCTL_UNDEF\t\t0\n#define WDCTL_STATUS\t\t1\n#define WDCTL_STOP\t\t2\n#define WDCTL_KILL\t\t3\n#define WDCTL_RESTART\t4\n#define WDCTL_AUTH\t\t9\t/* by Wiwiz */\n#define WDCTL_SLEEP\t\t10\t/* by Wiwiz */\n\ntypedef struct {\n\tchar\t*socket;\n\tint\tcommand;\n\tchar\t*param;\n} s_config;\n#endif\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/wdctl_thread.c",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file wdctl_thread.c\n    @brief Monitoring and control of wifidog, server part\n    @author Copyright (C) 2004 Alexandre Carmel-Veilleux <acv@acv.ca>\n*/\n\n#define _GNU_SOURCE\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <pthread.h>\n#include <string.h>\n#include <stdarg.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <sys/un.h>\n#include <unistd.h>\n#include <syslog.h>\n#include <signal.h>\n#include <errno.h>\n\n#include \"common.h\"\n#include \"httpd.h\"\n#include \"util.h\"\n#include \"conf.h\"\n#include \"debug.h\"\n#include \"auth.h\"\n#include \"centralserver.h\"\n#include \"fw_iptables.h\"\n#include \"firewall.h\"\n#include \"client_list.h\"\n#include \"wdctl_thread.h\"\n#include \"gateway.h\"\n#include \"safe.h\"\n\n/* Defined in clientlist.c */\nextern\tpthread_mutex_t\tclient_list_mutex;\nextern\tpthread_mutex_t\tconfig_mutex;\n\n/* Defined in util.c */\nextern long served_this_session;\t/* added by Wiwiz */\n\nint wdctl_socket_server;\t/* added by Wiwiz */\n\n/* From commandline.c: */\nextern char ** restartargv;\nstatic void *thread_wdctl_handler(void *);\nstatic void wdctl_status(int);\nstatic void wdctl_stop(int);\nstatic void wdctl_reset(int, const char *);\nstatic void wdctl_auth(int, const char *);\t/* added by Wiwiz */\nstatic void wdctl_restart(int);\n\n/** Launches a thread that monitors the control socket for request\n@param arg Must contain a pointer to a string containing the Unix domain socket to open\n@todo This thread loops infinitely, need a watchdog to verify that it is still running?\n*/  \nvoid\nthread_wdctl(void *arg)\n{\n\tint\t*fd;\n\tchar\t*sock_name;\n\tstruct \tsockaddr_un\tsa_un;\n\tint result;\n\tpthread_t\ttid;\n\tsocklen_t len;\n\n\tdebug(LOG_DEBUG, \"Starting wdctl.\");\n\n\tmemset(&sa_un, 0, sizeof(sa_un));\n\tsock_name = (char *)arg;\n\tdebug(LOG_DEBUG, \"Socket name: %s\", sock_name);\n\n\tif (strlen(sock_name) > (sizeof(sa_un.sun_path) - 1)) {\n\t\t/* TODO: Die handler with logging.... */\n\t\tdebug(LOG_ERR, \"WDCTL socket name too long\");\n\t\texit(1);\n\t}\n\t\n\n\tdebug(LOG_DEBUG, \"Creating socket\");\n\twdctl_socket_server = socket(PF_UNIX, SOCK_STREAM, 0);\n\n\tdebug(LOG_DEBUG, \"Got server socket %d\", wdctl_socket_server);\n\n\t/* If it exists, delete... Not the cleanest way to deal. */\n\tunlink(sock_name);\n\n\tdebug(LOG_DEBUG, \"Filling sockaddr_un\");\n\tstrcpy(sa_un.sun_path, sock_name); /* XXX No size check because we\n\t\t\t\t\t    * check a few lines before. */\n\tsa_un.sun_family = AF_UNIX;\n\t\n\tdebug(LOG_DEBUG, \"Binding socket (%s) (%d)\", sa_un.sun_path,\n\t\t\tstrlen(sock_name));\n\t\n\t/* Which to use, AF_UNIX, PF_UNIX, AF_LOCAL, PF_LOCAL? */\n\tif (bind(wdctl_socket_server, (struct sockaddr *)&sa_un, strlen(sock_name) \n\t\t\t\t+ sizeof(sa_un.sun_family))) {\n\t\tdebug(LOG_ERR, \"Could not bind control socket: %s\",\n\t\t\t\tstrerror(errno));\n\t\tpthread_exit(NULL);\n\t}\n\n\tif (listen(wdctl_socket_server, 5)) {\n\t\tdebug(LOG_ERR, \"Could not listen on control socket: %s\",\n\t\t\t\tstrerror(errno));\n\t\tpthread_exit(NULL);\n\t}\n\n\twhile (1) {\n\t\tlen = sizeof(sa_un);\n\t\tmemset(&sa_un, 0, len);\n\t\tfd = (int *) safe_malloc(sizeof(int));\n\t\tif ((*fd = accept(wdctl_socket_server, (struct sockaddr *)&sa_un, &len)) == -1){\n\t\t\tdebug(LOG_ERR, \"Accept failed on control socket: %s\",\n\t\t\t\t\tstrerror(errno));\n\t\t\tfree(fd);\n\t\t} else {\n\t\t\tdebug(LOG_DEBUG, \"Accepted connection on wdctl socket %d (%s)\", fd, sa_un.sun_path);\n\t\t\tresult = pthread_create(&tid, NULL, &thread_wdctl_handler, (void *)fd);\n\t\t\tif (result != 0) {\n\t\t\t\tdebug(LOG_ERR, \"FATAL: Failed to create a new thread (wdctl handler) - exiting\");\n\t\t\t\tfree(fd);\n\t\t\t\ttermination_handler(0);\n\t\t\t}\n\t\t\tpthread_detach(tid);\n\t\t}\n\t}\n}\n\n\nstatic void *\nthread_wdctl_handler(void *arg)\n{\n\tint\tfd,\n\t\tdone,\n\t\ti;\n\tchar\trequest[MAX_BUF];\n\tssize_t\tread_bytes,\n\t\tlen;\n\n\tdebug(LOG_DEBUG, \"Entering thread_wdctl_handler....\");\n\n\tfd = *((int *) arg);\n\tfree(arg);\n\tdebug(LOG_DEBUG, \"Read bytes and stuff from %d\", fd);\n\n\t/* Init variables */\n\tread_bytes = 0;\n\tdone = 0;\n\tmemset(request, 0, sizeof(request));\n\t\n\t/* Read.... */\n\twhile (!done && read_bytes < (sizeof(request) - 1)) {\n\t\tlen = read(fd, request + read_bytes,\n\t\t\t\tsizeof(request) - read_bytes);\n\n\t\t/* Have we gotten a command yet? */\n\t\tfor (i = read_bytes; i < (read_bytes + len); i++) {\n\t\t\tif (request[i] == '\\r' || request[i] == '\\n') {\n\t\t\t\trequest[i] = '\\0';\n\t\t\t\tdone = 1;\n\t\t\t}\n\t\t}\n\t\t\n\t\t/* Increment position */\n\t\tread_bytes += len;\n\t}\n\n\tif (strncmp(request, \"status\", 6) == 0) {\n\t\twdctl_status(fd);\n\t} else if (strncmp(request, \"stop\", 4) == 0) {\n\t\twdctl_stop(fd);\n\t} else if (strncmp(request, \"reset\", 5) == 0) {\n\t\twdctl_reset(fd, (request + 6));\n\n\t/* starts: added by Wiwiz */\n\t} else if (strncmp(request, \"auth\", 4) == 0) {\n\t\twdctl_auth(fd, (request + 5));\n\t/* end: added by Wiwiz */\n\t} else if (strncmp(request, \"restart\", 7) == 0) {\n\t\twdctl_restart(fd);\n\t}\n\n\tif (!done) {\n\t\tdebug(LOG_ERR, \"Invalid wdctl request.\");\n\t\tshutdown(fd, 2);\n\t\tclose(fd);\n\t\tpthread_exit(NULL);\n\t}\n\n\tdebug(LOG_DEBUG, \"Request received: [%s]\", request);\n\t\n\tshutdown(fd, 2);\n\tclose(fd);\n\tdebug(LOG_DEBUG, \"Exiting thread_wdctl_handler....\");\n\n\treturn NULL;\n}\n\nstatic void\nwdctl_status(int fd)\n{\n\tchar * status = NULL;\n\tint len = 0;\n\n\tstatus = get_status_text();\n\tlen = strlen(status);\n\n\tif(write(fd, status, len) == -1)\n\t\tdebug(LOG_CRIT, \"Write error: %s\", strerror(errno));\n\n\tfree(status);\n}\n\n/** A bit of an hack, self kills.... */\nstatic void\nwdctl_stop(int fd)\n{\n\tpid_t\tpid;\n\n\tpid = getpid();\n\tkill(pid, SIGINT);\n}\n\nstatic void\nwdctl_restart(int afd)\n{\n\tint\tsock,\n\t\tfd;\n\tchar\t*sock_name;\n\tstruct \tsockaddr_un\tsa_un;\n\ts_config * conf = NULL;\n\tt_client * client = NULL;\n\tchar * tempstring = NULL;\n\tpid_t pid;\n\tssize_t written;\n\tsocklen_t len;\n\n\tconf = config_get_config();\n\n\tdebug(LOG_NOTICE, \"Will restart myself\");\n\n\t/*\n\t * First, prepare the internal socket\n\t */\n\tmemset(&sa_un, 0, sizeof(sa_un));\n\tsock_name = conf->internal_sock;\n\tdebug(LOG_DEBUG, \"Socket name: %s\", sock_name);\n\n\tif (strlen(sock_name) > (sizeof(sa_un.sun_path) - 1)) {\n\t\t/* TODO: Die handler with logging.... */\n\t\tdebug(LOG_ERR, \"INTERNAL socket name too long\");\n\t\treturn;\n\t}\n\n\tdebug(LOG_DEBUG, \"Creating socket\");\n\tsock = socket(PF_UNIX, SOCK_STREAM, 0);\n\n\tdebug(LOG_DEBUG, \"Got internal socket %d\", sock);\n\n\t/* If it exists, delete... Not the cleanest way to deal. */\n\tunlink(sock_name);\n\n\tdebug(LOG_DEBUG, \"Filling sockaddr_un\");\n\tstrcpy(sa_un.sun_path, sock_name); /* XXX No size check because we check a few lines before. */\n\tsa_un.sun_family = AF_UNIX;\n\t\n\tdebug(LOG_DEBUG, \"Binding socket (%s) (%d)\", sa_un.sun_path, strlen(sock_name));\n\t\n\t/* Which to use, AF_UNIX, PF_UNIX, AF_LOCAL, PF_LOCAL? */\n\tif (bind(sock, (struct sockaddr *)&sa_un, strlen(sock_name) + sizeof(sa_un.sun_family))) {\n\t\tdebug(LOG_ERR, \"Could not bind internal socket: %s\", strerror(errno));\n\t\treturn;\n\t}\n\n\tif (listen(sock, 5)) {\n\t\tdebug(LOG_ERR, \"Could not listen on internal socket: %s\", strerror(errno));\n\t\treturn;\n\t}\n\t\n\t/*\n\t * The internal socket is ready, fork and exec ourselves\n\t */\n\tdebug(LOG_DEBUG, \"Forking in preparation for exec()...\");\n\tpid = safe_fork();\n\tif (pid > 0) {\n\t\t/* Parent */\n\n\t\t/* Wait for the child to connect to our socket :*/\n\t\tdebug(LOG_DEBUG, \"Waiting for child to connect on internal socket\");\n\t\tlen = sizeof(sa_un);\n\t\tif ((fd = accept(sock, (struct sockaddr *)&sa_un, &len)) == -1){\n\t\t\tdebug(LOG_ERR, \"Accept failed on internal socket: %s\", strerror(errno));\n\t\t\tclose(sock);\n\t\t\treturn;\n\t\t}\n\n\t\tclose(sock);\n\n\t\tdebug(LOG_DEBUG, \"Received connection from child.  Sending them all existing clients\");\n\n\t\t/* The child is connected. Send them over the socket the existing clients */\n\t\tLOCK_CLIENT_LIST();\n\t\tclient = client_get_first_client();\n\t\twhile (client) {\n\t\t\t/* Send this client */\n\t\t\tsafe_asprintf(&tempstring, \"CLIENT|ip=%s|mac=%s|token=%s|fw_connection_state=%u|fd=%d|counters_incoming=%llu|counters_outgoing=%llu|counters_last_updated=%lu\\n\", client->ip, client->mac, client->token, client->fw_connection_state, client->fd, client->counters.incoming, client->counters.outgoing, client->counters.last_updated);\n\t\t\tdebug(LOG_DEBUG, \"Sending to child client data: %s\", tempstring);\n\t\t\tlen = 0;\n\t\t\twhile (len != strlen(tempstring)) {\n\t\t\t\twritten = write(fd, (tempstring + len), strlen(tempstring) - len);\n\t\t\t\tif (written == -1) {\n\t\t\t\t\tdebug(LOG_ERR, \"Failed to write client data to child: %s\", strerror(errno));\n\t\t\t\t\tfree(tempstring);\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t\telse {\n\t\t\t\t\tlen += written;\n\t\t\t\t}\n\t\t\t}\n\t\t\tfree(tempstring);\n\t\t\tclient = client->next;\n\t\t}\n\t\tUNLOCK_CLIENT_LIST();\n\n\t\tclose(fd);\n\n\t\tdebug(LOG_INFO, \"Sent all existing clients to child.  Committing suicide!\");\n\n\t\tshutdown(afd, 2);\n\t\tclose(afd);\n\n\t\t/* Our job in life is done. Commit suicide! */\n\t\twdctl_stop(afd);\n\t}\n\telse {\n\t\t/* Child */\n\t\tclose(wdctl_socket_server);\n\t\tclose(icmp_fd);\n\t\tclose(sock);\n\t\tshutdown(afd, 2);\n\t\tclose(afd);\n\t\tdebug(LOG_NOTICE, \"Re-executing myself (%s)\", restartargv[0]);\n\t\tsetsid();\n\t\texecvp(restartargv[0], restartargv);\n\t\t/* If we've reached here the exec() failed - die quickly and silently */\n\t\tdebug(LOG_ERR, \"I failed to re-execute myself: %s\", strerror(errno));\n\t\tdebug(LOG_ERR, \"Exiting without cleanup\");\n\t\texit(1);\n\t}\n\n}\n\nstatic void\nwdctl_reset(int fd, const char *arg)\n{\n\tt_client\t*node;\n\n\tdebug(LOG_DEBUG, \"Entering wdctl_reset...\");\n\t\n\tLOCK_CLIENT_LIST();\n\tdebug(LOG_DEBUG, \"Argument: %s (@%x)\", arg, arg);\n\t\n\t/* We get the node or return... */\n\tif ((node = client_list_find_by_ip(arg)) != NULL);\n\telse if ((node = client_list_find_by_mac(arg)) != NULL);\n\telse {\n\t\tdebug(LOG_DEBUG, \"Client not found.\");\n\t\tUNLOCK_CLIENT_LIST();\n\t\tif(write(fd, \"No\", 2) == -1)\n\t\t\tdebug(LOG_CRIT, \"Unable to write No: %s\", strerror(errno));\n\n\t\treturn;\n\t}\n\n\tdebug(LOG_DEBUG, \"Got node %x.\", node);\n\t\n\t/* deny.... */\n\t/* TODO: maybe just deleting the connection is not best... But this\n\t * is a manual command, I don't anticipate it'll be that useful. */\n\tfw_deny(node->ip, node->mac, node->fw_connection_state);\n\tclient_list_delete(node);\n\n\tUNLOCK_CLIENT_LIST();\n\n\tif(write(fd, \"Yes\", 3) == -1)\n\t\tdebug(LOG_CRIT, \"Unable to write Yes: %s\", strerror(errno));\n\n\tdebug(LOG_DEBUG, \"Exiting wdctl_reset...\");\n}\n\n/* start: added by Wiwiz */\nint split(char dst[][80], char* str, const char* spl)\n{\n    int n = 0;\n    char *result = NULL;\n    char *p;\n    result = strtok_r(str, spl, &p);\n    while( result != NULL )\n    {\n        strcpy(dst[n++], result);\n        result = strtok_r(NULL, spl, &p);\n    }\n    return n;\n}\n\nstatic void\nwdctl_auth(int fd, const char *arg)\n{\n\tt_client\t*client;\n\n\tdebug(LOG_DEBUG, \"Entering wdctl_auth...\");\n\n\tdebug(LOG_DEBUG, \"Argument: %s\", arg);\n\n\tchar str[3][80];\n\tint cnt = split(str, arg, \",\");\n\tif(cnt < 3) {\n\t\tdebug(LOG_DEBUG, \"cnt is less than 3, exiting wdctl_auth...\");\n\t\treturn;\n\t}\n\n\tchar *mac = str[0];\n\tchar *ip = str[1];\n\tchar *token = str[2];\n\n\tdebug(LOG_DEBUG, \"str[][] = %s, %s, %s\", str[0], str[1], str[2]);\n\n\tchar s[80];\n\tstrcpy(s, mac);\n\tstrcat(s, \",\");\n\tstrcat(s, ip);\n\tstrcat(s, \",\");\n\tstrcat(s, token);\n\n\tLOCK_CLIENT_LIST();\n\n\tif ((client = client_list_find(ip, mac)) == NULL) {\n\t\tdebug(LOG_DEBUG, \"New client for %s, %s\", ip, mac);\n\n\t\tclient = client_list_append(ip, mac, token);\n\n\t\tclient->fw_connection_state = FW_MARK_KNOWN;\n\t\tfw_allow(ip, mac, FW_MARK_KNOWN);\n\t\tserved_this_session++;\n\n\t\tstrcat(s, \" Authenticated.\\n\");\n\t} else {\n\t\tdebug(LOG_DEBUG, \"Old client for %s, %s\", ip, mac);\n\t\tstrcat(s, \" NOT authenticated.\\n\");\n\t}\n\n\tUNLOCK_CLIENT_LIST();\n\n\tif(write(fd, s, strlen(s)) == -1)\n\t\tdebug(LOG_CRIT, \"Unable to write arg: %s\", strerror(errno));\n\n\tdebug(LOG_DEBUG, \"Exiting wdctl_auth...\");\n}\n/* end: added by Wiwiz */\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/src/wdctl_thread.h",
    "content": "/********************************************************************\\\n * This program is free software; you can redistribute it and/or    *\n * modify it under the terms of the GNU General Public License as   *\n * published by the Free Software Foundation; either version 2 of   *\n * the License, or (at your option) any later version.              *\n *                                                                  *\n * This program is distributed in the hope that it will be useful,  *\n * but WITHOUT ANY WARRANTY; without even the implied warranty of   *\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the    *\n * GNU General Public License for more details.                     *\n *                                                                  *\n * You should have received a copy of the GNU General Public License*\n * along with this program; if not, contact:                        *\n *                                                                  *\n * Free Software Foundation           Voice:  +1-617-542-5942       *\n * 59 Temple Place - Suite 330        Fax:    +1-617-542-2652       *\n * Boston, MA  02111-1307,  USA       gnu@gnu.org                   *\n *                                                                  *\n\\********************************************************************/\n\n/* $Id$ */\n/** @file wdctl_thread.h\n    @brief WiFiDog monitoring thread\n    @author Copyright (C) 2004 Alexandre Carmel-Veilleux <acv@acv.ca>\n*/\n\n#ifndef _WDCTL_THREAD_H_\n#define _WDCTL_THREAD_H_\n\n#define DEFAULT_WDCTL_SOCK\t\"/tmp/wdctl.sock\"\n\n/* int wdctl_socket_server; */\nextern int wdctl_socket_server; /* added by wiwiz */\n\n/** @brief Listen for WiFiDog control messages on a unix domain socket */\nvoid thread_wdctl(void *arg);\n\n#endif\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/wifidog-msg.html.in",
    "content": "<html>\n<head>\n<title> </title>\n<meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\">\n<meta http-equiv=\"Content-Language\" content=\"zh\">\n<meta http-equiv=\"Pragma\" content=\"no-cache\">\n<meta http-equiv=\"Cache-Control\" content=\"no-cache\">\n<meta name=\"viewport\" content=\"width=device-width; initial-scale=1.0\">\n<script>\nfunction doOnload() {\nvar lang = \"en\";\nvar _lang = navigator.language || navigator.browserLanguage;\n  \nif      (_lang.indexOf('en') > -1) lang='en';\nelse if (_lang.indexOf('zh') > -1) lang='zh';\nelse                               lang='en';\n\nif(lang == \"en\") {\n\tdocument.getElementById(\"dvEn\").style.display = \"\";\n\tdocument.getElementById(\"dvZh\").style.display = \"none\";\t\n} else if(lang == \"zh\") {\n\tdocument.getElementById(\"dvEn\").style.display = \"none\";\n\tdocument.getElementById(\"dvZh\").style.display = \"\";\t\n}\n\n}\n</script>\n</head>\n\n<body onload=\"doOnload();\">\n<div id=\"dvEn\" style=\"display:\">\n<p>You are seeing the page because it is probable that the internet connection provided by this hotspot is temporarily unavailable.</p>\n<p>If at all possible, please notify the owners of this hotspot that the internet connection is out of service.</p>\n<p>The maintainers of this network are aware of this disruption.  We hope that this situation will be resolved soon.</p>\n<p>In a while please try again.\n</div>\n\n<div id=\"dvZh\" style=\"display:none\">\n<p>现在Internet连接可能暂时中断。</p>\n<p>请联系网络管理员，或稍后重试。</p>\n</div>\n\n</body>\n</html>\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/wifidog-msg.html.in.org",
    "content": "<html>\n<head>\n<title>$title</title>\n<meta HTTP-EQUIV='Pragma' CONTENT='no-cache'>\n\n<style>\nbody {\n  margin: 10px 60px 0 60px; \n  font-family : bitstream vera sans, sans-serif;\n  color: #46a43a;\n}\n\na {\n  color: #46a43a;\n}\n\na:active {\n  color: #46a43a;\n}\n\na:link {\n  color: #46a43a;\n}\n\na:visited {\n  color: #46a43a;\n}\n\n#header {\n  height: 30px;\n  background-color: #B4F663;\n  padding: 20px;\n  font-size: 20pt;\n  text-align: center;\n  border: 2px solid #46a43a;\n  border-bottom: 0;\n}\n\n#header h2 {\n  margin: 0pt;\n}\n\n#menu {\n  width: 200px;\n  float: right;\n  background-color: #B4F663;\n  border: 2px solid #46a43a;\n  font-size: 80%;\n  min-height: 300px;\n}\n\n#menu h2 {\n  margin: 0;\n  background-color: #46a43a;\n  text-align: center;\n  color: #B4F663;\n}\n\n#copyright {\n}\n\n#content {\n  padding: 20px;\n  border: 2px solid #46a43a;\n  min-height: 300px;\n}\n</style>\n\n</head>\n\n<body>\n\n<div id=\"header\">\n    <h2>$title</h2>\n</div>\n\n<div id=\"menu\">\n\n\n    <h2>Info</h2>\n    <ul>\n    <li>Version: @WIFIDOG_VERSION@\n\n    <li>Node ID: $nodeID\n    </ul>\n    <br>\n\n    <h2>Menu</h2>\n    <ul>\n    <li><a href='/wifidog/status'>WiFiDog Status</a>\n    <li><a href='/wifidog/about'>About WiFiDog</a>\n    <li><a href='http://www.wifidog.org'>WiFiDog's homepage</a>\n    </ul>\n</div>\n\n<div id=\"content\">\n<h2>$message</h2>\n</div>\n\n<div id=\"copyright\">\nCopyright (C) 2004-2005.  This software is released under the GNU GPL license.\n</div>\n\n\n</body>\n</html>\n\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/wifidog.conf",
    "content": "# $Id$\n# WiFiDog Configuration file\n\n# Parameter: GatewayID\n# Default: default\n# Optional\n#\n# Set this to the node ID on the auth server\n# This is used to give a customized login page to the clients and for\n# monitoring/statistics purpose. If you run multiple gateways on the same\n# machine each gateway needs to have a different gateway id.\n# If none is supplied, the mac address of the GatewayInterface interface will be used,\n# without the : separators\n\n# GatewayID default\n\n# Parameter: ExternalInterface\n# Default: NONE\n# Optional\n#\n# Set this to the external interface (the one going out to the Inernet or your larger LAN).  \n# Typically vlan1 for OpenWrt, and eth0 or ppp0 otherwise,\n# Normally autodetected\n\n# ExternalInterface eth0\n\n# Parameter: GatewayInterface\n# Default: NONE\n# Mandatory\n#\n# Set this to the internal interface (typically your wifi interface).    \n# Typically br-lan for Openwrt (by default the wifi interface is bridged with wired lan in openwrt)\n# and eth1, wlan0, ath0, etc. otherwise\n# You can get this interface with the ifconfig command and finding your wifi interface\n\nGatewayInterface br-lan\n\n# Parameter: GatewayAddress\n# Default: Find it from GatewayInterface\n# Optional\n#\n# Set this to the internal IP address of the gateway.  Not normally required.\n\n# GatewayAddress 192.168.1.1\n\n# Parameter: HtmlMessageFile\n# Default: wifidog-msg.html\n# Optional\n#\n# This allows you to specify a custome HTML file which will be used for\n# system errors by the gateway. Any $title, $message and $node variables\n# used inside the file will be replaced.\n#\n# HtmlMessageFile /opt/wifidog/etc/wifidog-.html\n\n# Parameter: AuthServer\n# Default: NONE\n# Mandatory, repeatable\n#\n# This allows you to configure your auth server(s).  Each one will be tried in order, untill one responds.\n# Set this to the hostname or IP of your auth server(s), the path where\n# WiFiDog-auth resides in and the port it listens on.\n#AuthServer {\n#\tHostname                 (Mandatory; Default: NONE)\n#\tSSLAvailable             (Optional; Default: no; Possible values: yes, no)\n#\tSSLPort                  (Optional; Default: 443)\n#\tHTTPPort                 (Optional; Default: 80)\n#\tPath                     (Optional; Default: /wifidog/ Note:  The path must be both prefixed and suffixed by /.  Use a single / for server root.)\n#   LoginScriptPathFragment  (Optional; Default: login/? Note:  This is the script the user will be sent to for login.)\n#   PortalScriptPathFragment (Optional; Default: portal/? Note:  This is the script the user will be sent to after a successfull login.)\n#   MsgScriptPathFragment    (Optional; Default: gw_message.php? Note:  This is the script the user will be sent to upon error to read a readable message.)\n#   PingScriptPathFragment    (Optional; Default: ping/? Note:  This is the script the user will be sent to upon error to read a readable message.)\n#   AuthScriptPathFragment    (Optional; Default: auth/? Note:  This is the script the user will be sent to upon error to read a readable message.)\n#}\n\n#AuthServer {\n#    Hostname auth.ilesansfil.org\n#    SSLAvailable yes\n#    Path /\n#}\n\n#AuthServer {\n#    Hostname auth2.ilesansfil.org\n#    SSLAvailable yes\n#    Path /\n#}\n\n# Parameter: Daemon\n# Default: 1\n# Optional\n#\n# Set this to true if you want to run as a daemon\n# Daemon 1\n\n# Parameter: GatewayPort\n# Default: 2060\n# Optional\n#\n# Listen on this port\n# GatewayPort 2060\n\n# Parameter: ProxyPort\n# Default: 0 (disable)\n# Optional\n#\n# Redirect http traffic of knowns & probations users\n# to a local transparent proxy listening on ProxyPort port\n# ProxyPort 0\n\n# Parameter: HTTPDName\n# Default: WiFiDog\n# Optional\n#\n# Define what name the HTTPD server will respond\n# HTTPDName WiFiDog\n\n# Parameter: HTTPDMaxConn\n# Default: 10\n# Optional\n#\n# How many sockets to listen to\n# HTTPDMaxConn 10\n\n# Parameter: HTTPDRealm\n# Default: WiFiDog\n# Optional\n#\n# The name of the HTTP authentication realm. This only used when a user\n# tries to access a protected WiFiDog internal page. See HTTPUserName.\n# HTTPDRealm WiFiDog\n\n# Parameter: HTTPDUserName / HTTPDPassword\n# Default: unset\n# Optional\n#\n# The gateway exposes some information such as the status page through its web\n# interface. This information can be protected with a username and password,\n# which can be set through the HTTPDUserName and HTTPDPassword parameters.\n# HTTPDUserName admin\n# HTTPDPassword secret\n\n# Parameter: CheckInterval\n# Default: 60\n# Optional\n#\n# How many seconds should we wait between timeout checks.  This is also\n# how often the gateway will ping the auth server and how often it will\n# update the traffic counters on the auth server.  Setting this too low\n# wastes bandwidth, setting this too high will cause the gateway to take \n# a long time to switch to it's backup auth server(s).\n\n# CheckInterval 60\n\n# Parameter: ClientTimeout\n# Default: 5\n# Optional\n#\n# Set this to the desired of number of CheckInterval of inactivity before a client is logged out\n# The timeout will be INTERVAL * TIMEOUT\nClientTimeout 5\n\n# Parameter: TrustedMACList\n# Default: none\n# Optional\n#\n# Comma separated list of MAC addresses who are allowed to pass\n# through without authentication\n#TrustedMACList 00:00:DE:AD:BE:AF,00:00:C0:1D:F0:0D\n\n# Parameter: FirewallRuleSet\n# Default: none\n# Mandatory\n#\n# Groups a number of FirewallRule statements together.\n\n# Parameter: FirewallRule\n# Default: none\n# \n# Define one firewall rule in a rule set.\n\n# Rule Set: global\n# \n# Used for rules to be applied to all other rulesets except locked.\nFirewallRuleSet global {\n\n    # FirewallRule syntax:\n    # FirewallRule (block|drop|allow|log|ulog) [(tcp|udp|icmp) [port X]] [to IP/CIDR]\n\n    ## To block SMTP out, as it's a tech support nightmare, and a legal liability\n    #FirewallRule block tcp port 25\n    \n    ## Use the following if you don't want clients to be able to access machines on \n    ## the private LAN that gives internet access to wifidog.  Note that this is not\n    ## client isolation;  The laptops will still be able to talk to one another, as\n    ## well as to any machine bridged to the wifi of the router.\n    # FirewallRule block to 192.168.0.0/16\n    # FirewallRule block to 172.16.0.0/12\n    # FirewallRule block to 10.0.0.0/8\n    \n    ## This is an example ruleset for the Teliphone service.\n    #FirewallRule allow udp to 69.90.89.192/27\n    #FirewallRule allow udp to 69.90.85.0/27\n    #FirewallRule allow tcp port 80 to 69.90.89.205\n\n    ## Use the following to log or ulog the traffic you want to allow or block.\n    # For OPENWRT: use of these feature requires modules ipt_LOG or ipt_ULOG present in dependencies\n    # iptables-mod-extra and iptables-mod-ulog (to adapt it to the linux distribution). \n    # Note: the log or ulog rule must be passed before, the rule you want to match.\n    # for openwrt: use of these feature requires modules ipt_LOG or ipt_ULOG present in dependencies\n    # iptables-mod-extra and iptables-mod-ulog\n    # For example, you want to log (ulog works the same way) the traffic allowed on port 80 to the ip 69.90.89.205:\n    #FirewallRule log tcp port 80 to 69.90.89.205\n    #FirewallRule allow tcp port 80 to 69.90.89.205\n    # And you want to know, who matche your block rule:\n    #FirewallRule log to 0.0.0.0/0\n    #FirewallRule block to 0.0.0.0/0\n}\n\n# Rule Set: validating-users\n#\n# Used for new users validating their account\nFirewallRuleSet validating-users {\n    FirewallRule allow to 0.0.0.0/0\n}\n\n# Rule Set: known-users\n#\n# Used for normal validated users.\nFirewallRuleSet known-users {\n    FirewallRule allow to 0.0.0.0/0\n}\n\n# Rule Set: unknown-users\n#\n# Used for unvalidated users, this is the ruleset that gets redirected.\n#\n# XXX The redirect code adds the Default DROP clause.\nFirewallRuleSet unknown-users {\n    FirewallRule allow udp port 53\n    FirewallRule allow tcp port 53\n    FirewallRule allow udp port 67\n    FirewallRule allow tcp port 67\n}\n\n# Rule Set: locked-users\n#\n# Not currently used\nFirewallRuleSet locked-users {\n    FirewallRule block to 0.0.0.0/0\n}\n"
  },
  {
    "path": "relevance/WiFiPortal/wifidog-wiwiz/src/wifidog.spec.in",
    "content": "# $Id$\n\n%define name wifidog\n%define lib_name libhttpd\n%define version @VERSION@\n%define release 1mdk\n\nSummary: The WiFi Guard Dog project is a complete and embeedable captive portal solution for wireless community groups or individuals who wish to open a free HotSpot while still preventing abuse of their Internet connection.\nName: %{name}\nVersion: %{version}\nRelease: %{release}\nSource: http://download.sourceforge.net/wifidog/%{name}-%{version}.tar.gz\nGroup: Applications/System\nLicense: GPL\nBuildRoot: %{_tmppath}/%{name}-%{version}-root\nPrereq: /sbin/ldconfig\n\n%description\nThe WiFi Guard Dog project is a complete and embeedable captive portal solution for wireless community groups or individuals who wish to open a free HotSpot while still preventing abuse of their Internet connection.\n\n%prep\n%setup -q\n\n%build\n%configure\n%make\n\n%install\nrm -rf $RPM_BUILD_ROOT\nmkdir -p $RPM_BUILD_ROOT%{_prefix}\n\n\n# Will this overide previous config file?\nmkdir -p $RPM_BUILD_ROOT/etc\ncp wifidog.conf $RPM_BUILD_ROOT/etc\nmkdir -p $RPM_BUILD_ROOT/etc/rc.d/init.d\ncp scripts/init.d/wifidog $RPM_BUILD_ROOT/etc/rc.d/init.d\nchmod +x $RPM_BUILD_ROOT/etc/rc.d/init.d/wifidog\n\n%makeinstall\n\n%post\n/sbin/ldconfig\n%_post_service wifidog\n\n%postun\n/sbin/ldconfig\n\n%clean\nrm -rf $RPM_BUILD_ROOT\n\n\n%files\n%defattr(-,root,root,0755)\n%doc AUTHORS COPYING ChangeLog INSTALL NEWS README FAQ doc/html\n%config /etc/wifidog.conf \n%config /etc/rc.d/init.d/wifidog\n%{_bindir}/*\n%{_libdir}/*.a\n%{_libdir}/*.la\n%{_libdir}/*.so*\n%{_includedir}/*\n\n%changelog\n* Sun Aug 29 2004 Guillaume Beaudoin <isf@soli.ca>\n- Littles fixes and libofx leftover.\n- Prefix changed to /usr to match init.d script (define removed).\n* Sat Mar 8 2004 Benoit Gr�goire <bock@step.polymtl.ca>\n- Created spec file\n"
  },
  {
    "path": "relevance/adguardhome/Makefile",
    "content": "#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=adguardhome\nPKG_VERSION:=0.106.3\nPKG_RELEASE:=1\n\nPKG_SOURCE_PROTO:=git\nPKG_SOURCE_VERSION:=v$(PKG_VERSION)\nPKG_SOURCE_URL:=https://github.com/AdguardTeam/AdGuardHome\nPKG_MIRROR_HASH:=9051c08ebefccd918cad9b487d2d3b2c4b276ac71f16706c2ae8ee2a37ba9d03\n\nPKG_LICENSE:=GPL-3.0-only\nPKG_LICENSE_FILES:=LICENSE.txt\nPKG_MAINTAINER:=Dobroslaw Kijowski <dobo90@gmail.com>\n\nPKG_BUILD_DEPENDS:=golang/host node/host packr/host\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\n\nGO_PKG:=github.com/AdguardTeam/AdGuardHome\nGO_PKG_EXCLUDES:=dhcpd/standalone\nGO_PKG_LDFLAGS_X:=main.version=$(PKG_VERSION) main.channel=release main.goarm=$(GO_ARM)\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/adguardhome\n\tSECTION:=net\n\tCATEGORY:=Network\n\tTITLE:=Network-wide ads and trackers blocking DNS server\n\tURL:=https://github.com/AdguardTeam/AdGuardHome\n\tDEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle\nendef\n\ndefine Package/adguardhome/conffiles\n/etc/config/adguardhome.yaml\nendef\n\ndefine Package/adguardhome/description\nFree and open source, powerful network-wide ads and trackers blocking DNS server.\nendef\n\ndefine Build/Compile\n\t( \\\n\t\tpushd $(PKG_BUILD_DIR) ; \\\n\t\tnpm --prefix client ci ; \\\n\t\tnpm --prefix client run build-prod ; \\\n\t\tpackr -z -v -i internal ; \\\n\t\tpopd ; \\\n\t\t$(call GoPackage/Build/Compile) ; \\\n\t)\nendef\n\ndefine Package/adguardhome/install\n\t$(call GoPackage/Package/Install/Bin,$(1))\n#\t$(INSTALL_DIR) $(1)/etc/init.d\n#\t$(INSTALL_BIN) ./files/adguardhome.init $(1)/etc/init.d/adguardhome\nendef\n\n$(eval $(call GoBinPackage,adguardhome))\n$(eval $(call BuildPackage,adguardhome))\n"
  },
  {
    "path": "relevance/adguardhome/files/adguardhome.init",
    "content": "#!/bin/sh /etc/rc.common\n\nPROG=/usr/bin/AdGuardHome\nUSE_PROCD=1\n\n# starts after network starts\nSTART=21\n# stops before networking stops\nSTOP=89\n\nstart_service() {\n  procd_open_instance\n  procd_set_param command \"$PROG\" -c /etc/config/adguardhome.yaml -w /tmp/adguardhome --no-check-update\n  procd_set_param stdout 1\n  procd_set_param stderr 1\n  procd_close_instance\n}\n"
  },
  {
    "path": "relevance/cdnspeedtest/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021-2023 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=CloudflareSpeedTest\nPKG_VERSION:=2.2.0\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/XIU2/CloudflareSpeedTest/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=89fea0443b1501331526d95b3a827d93df3da3e3cd693310627fd80b53a46ee8\n\nPKG_LICENSE:=GPL-3.0-only\nPKG_LICENSE_FILE:=LICENSE\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\n\nGO_PKG:=CloudflareSpeedTest\nGO_PKG_LDFLAGS_X:=main.version=v$(PKG_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/cdnspeedtest\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=Getting the fastest ips to your network of CDN\n  URL:=https://github.com/XIU2/CloudflareSpeedTest\n  DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle\nendef\n\ndefine Package/cdnspeedtest/install\n\t$(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR))\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/CloudflareSpeedTest $(1)/usr/bin/cdnspeedtest\n\n\t$(INSTALL_DIR) $(1)/usr/share/CloudflareSpeedTest\n\t$(INSTALL_DATA) $(PKG_BUILD_DIR)/ip.txt $(1)/usr/share/CloudflareSpeedTest/\n\t$(INSTALL_DATA) $(PKG_BUILD_DIR)/ipv6.txt $(1)/usr/share/CloudflareSpeedTest/\nendef\n\n$(eval $(call GoBinPackage,cdnspeedtest))\n$(eval $(call BuildPackage,cdnspeedtest))\n"
  },
  {
    "path": "relevance/cdnspeedtest/test.sh",
    "content": "#!/bin/sh\n\ncdnspeedtest -v | grep \"$2\"\n"
  },
  {
    "path": "relevance/cpulimit/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=cpulimit\nPKG_VERSION:=0.3.2\nPKG_RELEASE:=2\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/denji/cpulimit/tar.gz/$(PKG_VERSION)?\nPKG_HASH:=0c61d394407fdd0547b53e6435ecb817d2e3ba914b48aa9f48ccf42c8278d3a6\n\nPKG_BUILD_PARALLEL:=1\nPKG_LICENSE_FILES:=LICENSE\n\nMAKE_PATH:=src\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/cpulimit\n  SECTION:=utils\n  CATEGORY:=Utilities\n  TITLE:=CPU usage limiter\n  URL:=https://github.com/denji/cpulimit\nendef\n\ndefine Package/cpulimit/description\n  Cpulimit is a tool which limits the CPU usage of a process\n  (expressed in percentage, not in CPU time).\nendef\n\nTARGET_CFLAGS += -D_GNU_SOURCE\n\ndefine Package/cpulimit/install\n\t$(INSTALL_DIR) $(1)/usr/bin/\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/src/cpulimit $(1)/usr/bin/\nendef\n\n$(eval $(call BuildPackage,cpulimit))\n"
  },
  {
    "path": "relevance/cpulimit/patches/010-gcc14.patch",
    "content": "--- a/src/process_group.c\n+++ b/src/process_group.c\n@@ -24,17 +24,10 @@\n #include <limits.h>\n #include <sys/time.h>\n #include <signal.h>\n-\n-#if defined(__APPLE__) || defined(__FREEBSD__)\n-    #include <libgen.h>\n-#endif\n+#include <libgen.h>\n \n #include <assert.h>\n \n-#ifdef __sun__\n-    #include <libgen.h>\n-#endif\n-\n #include \"process_iterator.h\"\n #include \"process_group.h\"\n #include \"list.h\"\n"
  },
  {
    "path": "relevance/filebrowser/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=filebrowser\nPKG_VERSION:=2.43.0\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/filebrowser/filebrowser/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=9c3acee7567986ceef331e3eea0236b4dd9a41bf3874449fbb9bdc22c00a0aab\n\nPKG_LICENSE:=Apache-2.0\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\n\nPKG_BUILD_DEPENDS:=golang/host node/host node-pnpm/host\nPKG_BUILD_PARALLEL:=1\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/filebrowser/filebrowser/v2\nGO_PKG_LDFLAGS_X:= \\\n\t$(GO_PKG)/version.CommitSHA=$(PKG_VERSION) \\\n\t$(GO_PKG)/version.Version=v$(PKG_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/filebrowser\n  SECTION:=utils\n  CATEGORY:=Utilities\n  TITLE:=Web File Browser\n  URL:=https://github.com/filebrowser/filebrowser\n  DEPENDS:=$(GO_ARCH_DEPENDS)\nendef\n\ndefine Package/filebrowser/description\n  filebrowser provides a file managing interface within a specified directory\n  and it can be used to upload, delete, preview, rename and edit your files.\n  It allows the creation of multiple users and each user can have its own directory.\n  It can be used as a standalone app or as a middleware.\nendef\n\ndefine Package/filebrowser/conffiles\n/etc/filebrowser/\n/etc/config/filebrowser\nendef\n\ndefine Build/Compile\n\t( \\\n\t\texport PNPM_HOME=\"$(PKG_BUILD_DIR)/frontend\" ; \\\n\t\tpushd \"$(PKG_BUILD_DIR)/frontend\" ; \\\n\t\tpnpm install --frozen-lockfile ; \\\n\t\tpnpm run build ; \\\n\t\tpopd ; \\\n\t\t$(call GoPackage/Build/Compile) ; \\\n\t)\nendef\n\ndefine Package/filebrowser/install\n\t$(call GoPackage/Package/Install/Bin,$(1))\n\n\t$(INSTALL_DIR) $(1)/etc/config\n\t$(INSTALL_CONF) $(CURDIR)/files/filebrowser.config $(1)/etc/config/filebrowser\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_BIN) $(CURDIR)/files/filebrowser.init $(1)/etc/init.d/filebrowser\nendef\n\n$(eval $(call GoBinPackage,filebrowser))\n$(eval $(call BuildPackage,filebrowser))\n"
  },
  {
    "path": "relevance/filebrowser/files/filebrowser.config",
    "content": "config filebrowser 'config'\n\toption enabled '0'\n\toption listen_port '8989'\n\toption root_path '/'\n\toption base_url ''\n\toption disable_exec '1'\n\n"
  },
  {
    "path": "relevance/filebrowser/files/filebrowser.init",
    "content": "#!/bin/sh /etc/rc.common\n\nUSE_PROCD=1\nSTART=99\n\nCONF=\"filebrowser\"\nPROG=\"/usr/bin/filebrowser\"\nDB_PATH=\"/etc/filebrowser/database.db\"\n\nstart_service() {\n\tconfig_load \"$CONF\"\n\n\tlocal enabled\n\tconfig_get_bool enabled \"config\" \"enabled\" \"0\"\n\t[ \"$enabled\" -eq \"1\" ] || return 1\n\n\tmkdir -p \"${DB_PATH%/*}\"\n\n\tlocal listen_port root_path base_url disable_exec\n\tconfig_get listen_port \"config\" \"listen_port\" \"8989\"\n\tconfig_get root_path \"config\" \"root_path\" \"/mnt/\"\n\tconfig_get base_url \"config\" \"base_url\"\n\tconfig_get_bool disable_exec \"config\" \"disable_exec\" \"1\"\n\n\tprocd_open_instance\n\tprocd_set_param command \"$PROG\"\n\tprocd_append_param command --database \"$DB_PATH\"\n\tprocd_append_param command --address \"[::]\"\n\tprocd_append_param command --port \"$listen_port\"\n\tprocd_append_param command --root \"$root_path\"\n\tprocd_append_param command --disable-exec=\"$disable_exec\"\n\t[ -z \"$base_url\" ] || procd_append_param command --baseurl \"$base_url\"\n\tif [ ! -e \"$DB_PATH\" ]; then\n\t\tprocd_append_param command --username \"admin\"\n\t\tprocd_append_param command --password \"$(\"$PROG\" hash \"admin\")\"\n\tfi\n\n\tprocd_set_param limits core=\"unlimited\"\n\tprocd_set_param limits nofile=\"1000000 1000000\"\n\tprocd_set_param stdout 1\n\tprocd_set_param stderr 1\n\tprocd_set_param respawn\n\n\tprocd_close_instance\n\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"$CONF\"\n}\n"
  },
  {
    "path": "relevance/gost/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=gost\nPKG_VERSION:=3.2.6\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/go-gost/gost/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=79874354530b899576dd4866d3b1400651d0b17c1e7a90ad30c44686a0642600\n\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/go-gost/gost\nGO_PKG_BUILD_PKG:=$(GO_PKG)/cmd/gost\nGO_PKG_LDFLAGS_X:=main.version=$(PKG_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/gost\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=GO Simple Tunnel\n  URL:=https://gost.run/\n  DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle\n  USERID:=gost:gost\nendef\n\ndefine Package/gost/conffiles\n/etc/config/gost\n/etc/gost/\nendef\n\ndefine Package/gost/install\n\t$(call GoPackage/Package/Install/Bin,$(1))\n\n\t$(INSTALL_DIR) $(1)/etc/config\n\t$(INSTALL_CONF) $(CURDIR)/files/gost.config $(1)/etc/config/gost\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_BIN) $(CURDIR)/files/gost.init $(1)/etc/init.d/gost\n\t$(INSTALL_DIR) $(1)/etc/uci-defaults\n\t$(INSTALL_BIN) $(CURDIR)/files/gost.uci $(1)/etc/uci-defaults/99-gost-migrate\nendef\n\n$(eval $(call GoBinPackage,gost))\n$(eval $(call BuildPackage,gost))\n"
  },
  {
    "path": "relevance/gost/files/gost.config",
    "content": "\nconfig gost 'config'\n\toption enabled '0'\n\toption config_file ''\n\t#list arguments ''\n\n"
  },
  {
    "path": "relevance/gost/files/gost.init",
    "content": "#!/bin/sh /etc/rc.common\n\nUSE_PROCD=1\nSTART=99\n\nCONF=\"gost\"\nPROG=\"/usr/bin/gost\"\n\nstart_service() {\n\tlocal enabled\n\n\tconfig_load \"gost\"\n\tconfig_get_bool enabled \"config\" \"enabled\" 0\n\t[ \"$enabled\" -eq 1 ] || return 1\n\n\tlocal config_file arguments\n\tconfig_get config_file \"config\" \"config_file\"\n\tconfig_get arguments \"config\" \"arguments\"\n\n\tprocd_open_instance\n\n\tprocd_set_param command \"$PROG\"\n\tif [ -n \"$config_file\" ]; then\n\t\tprocd_append_param command -C \"$config_file\"\n\t\tprocd_set_param file \"$config_file\"\n\tfi\n\tif [ -n \"$arguments\" ]; then\n\t\tset -- $arguments\n\t\tprocd_append_param command \"$@\"\n\tfi\n\n\tprocd_set_param user gost\n\tprocd_set_param group gost\n\n\tprocd_set_param limits core=\"unlimited\"\n\tprocd_set_param limits nofile=\"1000000 1000000\"\n\tprocd_set_param stderr 1\n\n\tprocd_set_param respawn\n\n\tprocd_close_instance\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"$CONF\"\n}\n"
  },
  {
    "path": "relevance/gost/files/gost.uci",
    "content": "#!/bin/sh\n\ngrep -q \"config gost$\" \"/etc/config/gost\" || exit 0\n\nsed -e \"s,config gost,config gost 'config',\" \\\n    -e \"s,option enable ,option enabled ,\" \\\n    -e \"s,option run_command,list arguments,\" \\\n\t-i \"/etc/config/gost\"\n\nexit 0\n"
  },
  {
    "path": "relevance/luci-lib-iform/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_VERSION:=1.1.1\nPKG_RELEASE:=20221115\nPKG_MAINTAINER:=xiaobao <xiaobao@linkease.com>\n\nLUCI_TITLE:=LuCI library for json form\nLUCI_DESCRIPTION:=Json form library\n\nLUCI_DEPENDS:= +luci-lib-jsonc\nLUCI_PKGARCH:=all\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n\n"
  },
  {
    "path": "relevance/luci-lib-iform/luasrc/iform.lua",
    "content": "local http = require \"luci.http\"\nlocal nixio = require \"nixio\" \nlocal fs   = require \"nixio.fs\"\nlocal ltn12 = require \"luci.ltn12\"\n\nlocal iform = {} \nlocal const_log_end = \"XU6J03M6\"\n\nfunction iform.log_end()\n  return const_log_end\nend\n\nfunction iform.exec_to_log(command)\n  local f = io.popen(command, \"r\")\n  local log = command\n  if f then\n    local output = f:read('*all')\n    f:close()\n    log = log .. \"\\n\" .. output .. const_log_end\n  else\n    log = log .. \" Failed\" .. const_log_end\n  end\n  return log\nend\n\nfunction iform.response_log(logpath)\n  local logfd = io.open(logpath, \"r\")\n  if logfd == nil then\n    http.write(\"log not found\" .. const_log_end)\n    return\n  end\n\n  local curr = logfd:seek()\n  local size = logfd:seek(\"end\")\n  if size > 8*1024 then\n    logfd:seek(\"end\", -8*1024)\n  else\n    logfd:seek(\"set\", curr)\n  end\n\n  local write_log = function()\n    local buffer = logfd:read(4096)\n    if buffer and #buffer > 0 then\n        return buffer\n    else\n        logfd:close()\n        return nil\n    end\n  end\n\n  http.prepare_content(\"text/plain;charset=utf-8\")\n\n  if logfd then\n    ltn12.pump.all(write_log, http.write)\n  end\nend\n\nfunction iform.fork_exec(command)\n\tlocal pid = nixio.fork()\n\tif pid > 0 then\n\t\treturn\n\telseif pid == 0 then\n\t\t-- change to root dir\n\t\tnixio.chdir(\"/\")\n\n\t\t-- patch stdin, out, err to /dev/null\n\t\tlocal null = nixio.open(\"/dev/null\", \"w+\")\n\t\tif null then\n\t\t\tnixio.dup(null, nixio.stderr)\n\t\t\tnixio.dup(null, nixio.stdout)\n\t\t\tnixio.dup(null, nixio.stdin)\n\t\t\tif null:fileno() > 2 then\n\t\t\t\tnull:close()\n\t\t\tend\n\t\tend\n\n\t\t-- replace with target command\n\t\tnixio.exec(\"/bin/sh\", \"-c\", command)\n\tend\nend\n\nreturn iform\n\n"
  },
  {
    "path": "relevance/luci-lib-iform/root/www/luci-static/iform/1.0/index.js",
    "content": "var ul=Object.defineProperty,cl=Object.defineProperties;var dl=Object.getOwnPropertyDescriptors;var fs=Object.getOwnPropertySymbols;var vl=Object.prototype.hasOwnProperty,hl=Object.prototype.propertyIsEnumerable;var us=(e,t,r)=>t in e?ul(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,Br=(e,t)=>{for(var r in t||(t={}))vl.call(t,r)&&us(e,r,t[r]);if(fs)for(var r of fs(t))hl.call(t,r)&&us(e,r,t[r]);return e},jr=(e,t)=>cl(e,dl(t));const pl=function(){const t=document.createElement(\"link\").relList;if(t&&t.supports&&t.supports(\"modulepreload\"))return;for(const o of document.querySelectorAll('link[rel=\"modulepreload\"]'))n(o);new MutationObserver(o=>{for(const s of o)if(s.type===\"childList\")for(const i of s.addedNodes)i.tagName===\"LINK\"&&i.rel===\"modulepreload\"&&n(i)}).observe(document,{childList:!0,subtree:!0});function r(o){const s={};return o.integrity&&(s.integrity=o.integrity),o.referrerpolicy&&(s.referrerPolicy=o.referrerpolicy),o.crossorigin===\"use-credentials\"?s.credentials=\"include\":o.crossorigin===\"anonymous\"?s.credentials=\"omit\":s.credentials=\"same-origin\",s}function n(o){if(o.ep)return;o.ep=!0;const s=r(o);fetch(o.href,s)}};pl();function dr(e,t){const r=Object.create(null),n=e.split(\",\");for(let o=0;o<n.length;o++)r[n[o]]=!0;return t?o=>!!r[o.toLowerCase()]:o=>!!r[o]}const gl=\"Infinity,undefined,NaN,isFinite,isNaN,parseFloat,parseInt,decodeURI,decodeURIComponent,encodeURI,encodeURIComponent,Math,Number,Date,Array,Object,Boolean,String,RegExp,Map,Set,JSON,Intl,BigInt\",ml=dr(gl),yl=\"itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly\",El=dr(yl);function si(e){return!!e||e===\"\"}function Dn(e){if(q(e)){const t={};for(let r=0;r<e.length;r++){const n=e[r],o=Tt(n)?bl(n):Dn(n);if(o)for(const s in o)t[s]=o[s]}return t}else{if(Tt(e))return e;if(Rt(e))return e}}const xl=/;(?![^(]*\\))/g,Sl=/:(.+)/;function bl(e){const t={};return e.split(xl).forEach(r=>{if(r){const n=r.split(Sl);n.length>1&&(t[n[0].trim()]=n[1].trim())}}),t}function Fn(e){let t=\"\";if(Tt(e))t=e;else if(q(e))for(let r=0;r<e.length;r++){const n=Fn(e[r]);n&&(t+=n+\" \")}else if(Rt(e))for(const r in e)e[r]&&(t+=r+\" \");return t.trim()}function Ol(e){if(!e)return null;let{class:t,style:r}=e;return t&&!Tt(t)&&(e.class=Fn(t)),r&&(e.style=Dn(r)),e}function Tl(e,t){if(e.length!==t.length)return!1;let r=!0;for(let n=0;r&&n<e.length;n++)r=Ee(e[n],t[n]);return r}function Ee(e,t){if(e===t)return!0;let r=cs(e),n=cs(t);if(r||n)return r&&n?e.getTime()===t.getTime():!1;if(r=q(e),n=q(t),r||n)return r&&n?Tl(e,t):!1;if(r=Rt(e),n=Rt(t),r||n){if(!r||!n)return!1;const o=Object.keys(e).length,s=Object.keys(t).length;if(o!==s)return!1;for(const i in e){const a=e.hasOwnProperty(i),l=t.hasOwnProperty(i);if(a&&!l||!a&&l||!Ee(e[i],t[i]))return!1}}return String(e)===String(t)}function vr(e,t){return e.findIndex(r=>Ee(r,t))}const kn=e=>Tt(e)?e:e==null?\"\":q(e)||Rt(e)&&(e.toString===ai||!nt(e.toString))?JSON.stringify(e,ii,2):String(e),ii=(e,t)=>t&&t.__v_isRef?ii(e,t.value):Ze(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((r,[n,o])=>(r[`${n} =>`]=o,r),{})}:$e(t)?{[`Set(${t.size})`]:[...t.values()]}:Rt(t)&&!q(t)&&!li(t)?String(t):t,bt={},Xe=[],kt=()=>{},Al=()=>!1,Rl=/^on[^a-z]/,Mn=e=>Rl.test(e),yo=e=>e.startsWith(\"onUpdate:\"),At=Object.assign,Eo=(e,t)=>{const r=e.indexOf(t);r>-1&&e.splice(r,1)},Cl=Object.prototype.hasOwnProperty,mt=(e,t)=>Cl.call(e,t),q=Array.isArray,Ze=e=>hr(e)===\"[object Map]\",$e=e=>hr(e)===\"[object Set]\",cs=e=>e instanceof Date,nt=e=>typeof e==\"function\",Tt=e=>typeof e==\"string\",xo=e=>typeof e==\"symbol\",Rt=e=>e!==null&&typeof e==\"object\",So=e=>Rt(e)&&nt(e.then)&&nt(e.catch),ai=Object.prototype.toString,hr=e=>ai.call(e),Il=e=>hr(e).slice(8,-1),li=e=>hr(e)===\"[object Object]\",bo=e=>Tt(e)&&e!==\"NaN\"&&e[0]!==\"-\"&&\"\"+parseInt(e,10)===e,gn=dr(\",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"),pr=e=>{const t=Object.create(null);return r=>t[r]||(t[r]=e(r))},Pl=/-(\\w)/g,Gt=pr(e=>e.replace(Pl,(t,r)=>r?r.toUpperCase():\"\")),Nl=/\\B([A-Z])/g,te=pr(e=>e.replace(Nl,\"-$1\").toLowerCase()),Bn=pr(e=>e.charAt(0).toUpperCase()+e.slice(1)),mn=pr(e=>e?`on${Bn(e)}`:\"\"),Rn=(e,t)=>!Object.is(e,t),Qe=(e,t)=>{for(let r=0;r<e.length;r++)e[r](t)},nr=(e,t,r)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:r})},xe=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let ds;const Dl=()=>ds||(ds=typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:typeof window!=\"undefined\"?window:typeof global!=\"undefined\"?global:{});let Ht;class Oo{constructor(t=!1){this.active=!0,this.effects=[],this.cleanups=[],!t&&Ht&&(this.parent=Ht,this.index=(Ht.scopes||(Ht.scopes=[])).push(this)-1)}run(t){if(this.active){const r=Ht;try{return Ht=this,t()}finally{Ht=r}}}on(){Ht=this}off(){Ht=this.parent}stop(t){if(this.active){let r,n;for(r=0,n=this.effects.length;r<n;r++)this.effects[r].stop();for(r=0,n=this.cleanups.length;r<n;r++)this.cleanups[r]();if(this.scopes)for(r=0,n=this.scopes.length;r<n;r++)this.scopes[r].stop(!0);if(this.parent&&!t){const o=this.parent.scopes.pop();o&&o!==this&&(this.parent.scopes[this.index]=o,o.index=this.index)}this.active=!1}}}function Fl(e){return new Oo(e)}function fi(e,t=Ht){t&&t.active&&t.effects.push(e)}function Ml(){return Ht}function Bl(e){Ht&&Ht.cleanups.push(e)}const To=e=>{const t=new Set(e);return t.w=0,t.n=0,t},ui=e=>(e.w&Se)>0,ci=e=>(e.n&Se)>0,jl=({deps:e})=>{if(e.length)for(let t=0;t<e.length;t++)e[t].w|=Se},Ll=e=>{const{deps:t}=e;if(t.length){let r=0;for(let n=0;n<t.length;n++){const o=t[n];ui(o)&&!ci(o)?o.delete(e):t[r++]=o,o.w&=~Se,o.n&=~Se}t.length=r}},Xr=new WeakMap;let vn=0,Se=1;const Zr=30;let Qt;const Fe=Symbol(\"\"),Qr=Symbol(\"\");class jn{constructor(t,r=null,n){this.fn=t,this.scheduler=r,this.active=!0,this.deps=[],this.parent=void 0,fi(this,n)}run(){if(!this.active)return this.fn();let t=Qt,r=me;for(;t;){if(t===this)return;t=t.parent}try{return this.parent=Qt,Qt=this,me=!0,Se=1<<++vn,vn<=Zr?jl(this):vs(this),this.fn()}finally{vn<=Zr&&Ll(this),Se=1<<--vn,Qt=this.parent,me=r,this.parent=void 0,this.deferStop&&this.stop()}}stop(){Qt===this?this.deferStop=!0:this.active&&(vs(this),this.onStop&&this.onStop(),this.active=!1)}}function vs(e){const{deps:t}=e;if(t.length){for(let r=0;r<t.length;r++)t[r].delete(e);t.length=0}}function $l(e,t){e.effect&&(e=e.effect.fn);const r=new jn(e);t&&(At(r,t),t.scope&&fi(r,t.scope)),(!t||!t.lazy)&&r.run();const n=r.run.bind(r);return n.effect=r,n}function Ul(e){e.effect.stop()}let me=!0;const di=[];function Ue(){di.push(me),me=!1}function Ke(){const e=di.pop();me=e===void 0?!0:e}function zt(e,t,r){if(me&&Qt){let n=Xr.get(e);n||Xr.set(e,n=new Map);let o=n.get(r);o||n.set(r,o=To()),vi(o)}}function vi(e,t){let r=!1;vn<=Zr?ci(e)||(e.n|=Se,r=!ui(e)):r=!e.has(Qt),r&&(e.add(Qt),Qt.deps.push(e))}function ae(e,t,r,n,o,s){const i=Xr.get(e);if(!i)return;let a=[];if(t===\"clear\")a=[...i.values()];else if(r===\"length\"&&q(e))i.forEach((l,u)=>{(u===\"length\"||u>=n)&&a.push(l)});else switch(r!==void 0&&a.push(i.get(r)),t){case\"add\":q(e)?bo(r)&&a.push(i.get(\"length\")):(a.push(i.get(Fe)),Ze(e)&&a.push(i.get(Qr)));break;case\"delete\":q(e)||(a.push(i.get(Fe)),Ze(e)&&a.push(i.get(Qr)));break;case\"set\":Ze(e)&&a.push(i.get(Fe));break}if(a.length===1)a[0]&&kr(a[0]);else{const l=[];for(const u of a)u&&l.push(...u);kr(To(l))}}function kr(e,t){for(const r of q(e)?e:[...e])(r!==Qt||r.allowRecurse)&&(r.scheduler?r.scheduler():r.run())}const Kl=dr(\"__proto__,__v_isRef,__isVue\"),hi=new Set(Object.getOwnPropertyNames(Symbol).map(e=>Symbol[e]).filter(xo)),Vl=gr(),Hl=gr(!1,!0),Wl=gr(!0),Yl=gr(!0,!0),hs=wl();function wl(){const e={};return[\"includes\",\"indexOf\",\"lastIndexOf\"].forEach(t=>{e[t]=function(...r){const n=pt(this);for(let s=0,i=this.length;s<i;s++)zt(n,\"get\",s+\"\");const o=n[t](...r);return o===-1||o===!1?n[t](...r.map(pt)):o}}),[\"push\",\"pop\",\"shift\",\"unshift\",\"splice\"].forEach(t=>{e[t]=function(...r){Ue();const n=pt(this)[t].apply(this,r);return Ke(),n}}),e}function gr(e=!1,t=!1){return function(n,o,s){if(o===\"__v_isReactive\")return!e;if(o===\"__v_isReadonly\")return e;if(o===\"__v_isShallow\")return t;if(o===\"__v_raw\"&&s===(e?t?Si:xi:t?Ei:yi).get(n))return n;const i=q(n);if(!e&&i&&mt(hs,o))return Reflect.get(hs,o,s);const a=Reflect.get(n,o,s);return(xo(o)?hi.has(o):Kl(o))||(e||zt(n,\"get\",o),t)?a:Ct(a)?!i||!bo(o)?a.value:a:Rt(a)?e?Ro(a):Ln(a):a}}const Gl=pi(),zl=pi(!0);function pi(e=!1){return function(r,n,o,s){let i=r[n];if(qe(i)&&Ct(i)&&!Ct(o))return!1;if(!e&&!qe(o)&&(Co(o)||(o=pt(o),i=pt(i)),!q(r)&&Ct(i)&&!Ct(o)))return i.value=o,!0;const a=q(r)&&bo(n)?Number(n)<r.length:mt(r,n),l=Reflect.set(r,n,o,s);return r===pt(s)&&(a?Rn(o,i)&&ae(r,\"set\",n,o):ae(r,\"add\",n,o)),l}}function Jl(e,t){const r=mt(e,t);e[t];const n=Reflect.deleteProperty(e,t);return n&&r&&ae(e,\"delete\",t,void 0),n}function Xl(e,t){const r=Reflect.has(e,t);return(!xo(t)||!hi.has(t))&&zt(e,\"has\",t),r}function Zl(e){return zt(e,\"iterate\",q(e)?\"length\":Fe),Reflect.ownKeys(e)}const gi={get:Vl,set:Gl,deleteProperty:Jl,has:Xl,ownKeys:Zl},mi={get:Wl,set(e,t){return!0},deleteProperty(e,t){return!0}},Ql=At({},gi,{get:Hl,set:zl}),kl=At({},mi,{get:Yl}),Ao=e=>e,mr=e=>Reflect.getPrototypeOf(e);function Hn(e,t,r=!1,n=!1){e=e.__v_raw;const o=pt(e),s=pt(t);t!==s&&!r&&zt(o,\"get\",t),!r&&zt(o,\"get\",s);const{has:i}=mr(o),a=n?Ao:r?No:Cn;if(i.call(o,t))return a(e.get(t));if(i.call(o,s))return a(e.get(s));e!==o&&e.get(t)}function Wn(e,t=!1){const r=this.__v_raw,n=pt(r),o=pt(e);return e!==o&&!t&&zt(n,\"has\",e),!t&&zt(n,\"has\",o),e===o?r.has(e):r.has(e)||r.has(o)}function Yn(e,t=!1){return e=e.__v_raw,!t&&zt(pt(e),\"iterate\",Fe),Reflect.get(e,\"size\",e)}function ps(e){e=pt(e);const t=pt(this);return mr(t).has.call(t,e)||(t.add(e),ae(t,\"add\",e,e)),this}function gs(e,t){t=pt(t);const r=pt(this),{has:n,get:o}=mr(r);let s=n.call(r,e);s||(e=pt(e),s=n.call(r,e));const i=o.call(r,e);return r.set(e,t),s?Rn(t,i)&&ae(r,\"set\",e,t):ae(r,\"add\",e,t),this}function ms(e){const t=pt(this),{has:r,get:n}=mr(t);let o=r.call(t,e);o||(e=pt(e),o=r.call(t,e)),n&&n.call(t,e);const s=t.delete(e);return o&&ae(t,\"delete\",e,void 0),s}function ys(){const e=pt(this),t=e.size!==0,r=e.clear();return t&&ae(e,\"clear\",void 0,void 0),r}function wn(e,t){return function(n,o){const s=this,i=s.__v_raw,a=pt(i),l=t?Ao:e?No:Cn;return!e&&zt(a,\"iterate\",Fe),i.forEach((u,f)=>n.call(o,l(u),l(f),s))}}function Gn(e,t,r){return function(...n){const o=this.__v_raw,s=pt(o),i=Ze(s),a=e===\"entries\"||e===Symbol.iterator&&i,l=e===\"keys\"&&i,u=o[e](...n),f=r?Ao:t?No:Cn;return!t&&zt(s,\"iterate\",l?Qr:Fe),{next(){const{value:c,done:d}=u.next();return d?{value:c,done:d}:{value:a?[f(c[0]),f(c[1])]:f(c),done:d}},[Symbol.iterator](){return this}}}}function ce(e){return function(...t){return e===\"delete\"?!1:this}}function ql(){const e={get(s){return Hn(this,s)},get size(){return Yn(this)},has:Wn,add:ps,set:gs,delete:ms,clear:ys,forEach:wn(!1,!1)},t={get(s){return Hn(this,s,!1,!0)},get size(){return Yn(this)},has:Wn,add:ps,set:gs,delete:ms,clear:ys,forEach:wn(!1,!0)},r={get(s){return Hn(this,s,!0)},get size(){return Yn(this,!0)},has(s){return Wn.call(this,s,!0)},add:ce(\"add\"),set:ce(\"set\"),delete:ce(\"delete\"),clear:ce(\"clear\"),forEach:wn(!0,!1)},n={get(s){return Hn(this,s,!0,!0)},get size(){return Yn(this,!0)},has(s){return Wn.call(this,s,!0)},add:ce(\"add\"),set:ce(\"set\"),delete:ce(\"delete\"),clear:ce(\"clear\"),forEach:wn(!0,!0)};return[\"keys\",\"values\",\"entries\",Symbol.iterator].forEach(s=>{e[s]=Gn(s,!1,!1),r[s]=Gn(s,!0,!1),t[s]=Gn(s,!1,!0),n[s]=Gn(s,!0,!0)}),[e,r,t,n]}const[_l,tf,ef,nf]=ql();function yr(e,t){const r=t?e?nf:ef:e?tf:_l;return(n,o,s)=>o===\"__v_isReactive\"?!e:o===\"__v_isReadonly\"?e:o===\"__v_raw\"?n:Reflect.get(mt(r,o)&&o in n?r:n,o,s)}const rf={get:yr(!1,!1)},of={get:yr(!1,!0)},sf={get:yr(!0,!1)},af={get:yr(!0,!0)},yi=new WeakMap,Ei=new WeakMap,xi=new WeakMap,Si=new WeakMap;function lf(e){switch(e){case\"Object\":case\"Array\":return 1;case\"Map\":case\"Set\":case\"WeakMap\":case\"WeakSet\":return 2;default:return 0}}function ff(e){return e.__v_skip||!Object.isExtensible(e)?0:lf(Il(e))}function Ln(e){return qe(e)?e:Er(e,!1,gi,rf,yi)}function bi(e){return Er(e,!1,Ql,of,Ei)}function Ro(e){return Er(e,!0,mi,sf,xi)}function uf(e){return Er(e,!0,kl,af,Si)}function Er(e,t,r,n,o){if(!Rt(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const s=o.get(e);if(s)return s;const i=ff(e);if(i===0)return e;const a=new Proxy(e,i===2?n:r);return o.set(e,a),a}function Me(e){return qe(e)?Me(e.__v_raw):!!(e&&e.__v_isReactive)}function qe(e){return!!(e&&e.__v_isReadonly)}function Co(e){return!!(e&&e.__v_isShallow)}function Io(e){return Me(e)||qe(e)}function pt(e){const t=e&&e.__v_raw;return t?pt(t):e}function Po(e){return nr(e,\"__v_skip\",!0),e}const Cn=e=>Rt(e)?Ln(e):e,No=e=>Rt(e)?Ro(e):e;function Do(e){me&&Qt&&(e=pt(e),vi(e.dep||(e.dep=To())))}function xr(e,t){e=pt(e),e.dep&&kr(e.dep)}function Ct(e){return!!(e&&e.__v_isRef===!0)}function Be(e){return Oi(e,!1)}function cf(e){return Oi(e,!0)}function Oi(e,t){return Ct(e)?e:new df(e,t)}class df{constructor(t,r){this.__v_isShallow=r,this.dep=void 0,this.__v_isRef=!0,this._rawValue=r?t:pt(t),this._value=r?t:Cn(t)}get value(){return Do(this),this._value}set value(t){t=this.__v_isShallow?t:pt(t),Rn(t,this._rawValue)&&(this._rawValue=t,this._value=this.__v_isShallow?t:Cn(t),xr(this))}}function vf(e){xr(e)}function Ti(e){return Ct(e)?e.value:e}const hf={get:(e,t,r)=>Ti(Reflect.get(e,t,r)),set:(e,t,r,n)=>{const o=e[t];return Ct(o)&&!Ct(r)?(o.value=r,!0):Reflect.set(e,t,r,n)}};function Fo(e){return Me(e)?e:new Proxy(e,hf)}class pf{constructor(t){this.dep=void 0,this.__v_isRef=!0;const{get:r,set:n}=t(()=>Do(this),()=>xr(this));this._get=r,this._set=n}get value(){return this._get()}set value(t){this._set(t)}}function gf(e){return new pf(e)}function Ai(e){const t=q(e)?new Array(e.length):{};for(const r in e)t[r]=Ri(e,r);return t}class mf{constructor(t,r,n){this._object=t,this._key=r,this._defaultValue=n,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}}function Ri(e,t,r){const n=e[t];return Ct(n)?n:new mf(e,t,r)}class yf{constructor(t,r,n,o){this._setter=r,this.dep=void 0,this.__v_isRef=!0,this._dirty=!0,this.effect=new jn(t,()=>{this._dirty||(this._dirty=!0,xr(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!o,this.__v_isReadonly=n}get value(){const t=pt(this);return Do(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function Ef(e,t,r=!1){let n,o;const s=nt(e);return s?(n=e,o=kt):(n=e.get,o=e.set),new yf(n,o,s||!o,r)}const yn=[];function Ci(e,...t){Ue();const r=yn.length?yn[yn.length-1].component:null,n=r&&r.appContext.config.warnHandler,o=xf();if(n)ee(n,r,11,[e+t.join(\"\"),r&&r.proxy,o.map(({vnode:s})=>`at <${ba(r,s.type)}>`).join(`\n`),o]);else{const s=[`[Vue warn]: ${e}`,...t];o.length&&s.push(`\n`,...Sf(o)),console.warn(...s)}Ke()}function xf(){let e=yn[yn.length-1];if(!e)return[];const t=[];for(;e;){const r=t[0];r&&r.vnode===e?r.recurseCount++:t.push({vnode:e,recurseCount:0});const n=e.component&&e.component.parent;e=n&&n.vnode}return t}function Sf(e){const t=[];return e.forEach((r,n)=>{t.push(...n===0?[]:[`\n`],...bf(r))}),t}function bf({vnode:e,recurseCount:t}){const r=t>0?`... (${t} recursive calls)`:\"\",n=e.component?e.component.parent==null:!1,o=` at <${ba(e.component,e.type,n)}`,s=\">\"+r;return e.props?[o,...Of(e.props),s]:[o+s]}function Of(e){const t=[],r=Object.keys(e);return r.slice(0,3).forEach(n=>{t.push(...Ii(n,e[n]))}),r.length>3&&t.push(\" ...\"),t}function Ii(e,t,r){return Tt(t)?(t=JSON.stringify(t),r?t:[`${e}=${t}`]):typeof t==\"number\"||typeof t==\"boolean\"||t==null?r?t:[`${e}=${t}`]:Ct(t)?(t=Ii(e,pt(t.value),!0),r?t:[`${e}=Ref<`,t,\">\"]):nt(t)?[`${e}=fn${t.name?`<${t.name}>`:\"\"}`]:(t=pt(t),r?t:[`${e}=`,t])}function ee(e,t,r,n){let o;try{o=n?e(...n):e()}catch(s){Ve(s,t,r)}return o}function wt(e,t,r,n){if(nt(e)){const s=ee(e,t,r,n);return s&&So(s)&&s.catch(i=>{Ve(i,t,r)}),s}const o=[];for(let s=0;s<e.length;s++)o.push(wt(e[s],t,r,n));return o}function Ve(e,t,r,n=!0){const o=t?t.vnode:null;if(t){let s=t.parent;const i=t.proxy,a=r;for(;s;){const u=s.ec;if(u){for(let f=0;f<u.length;f++)if(u[f](e,i,a)===!1)return}s=s.parent}const l=t.appContext.config.errorHandler;if(l){ee(l,null,10,[e,i,a]);return}}Tf(e,r,o,n)}function Tf(e,t,r,n=!0){console.error(e)}let rr=!1,qr=!1;const Yt=[];let se=0;const En=[];let hn=null,Ge=0;const xn=[];let he=null,ze=0;const Pi=Promise.resolve();let Mo=null,_r=null;function Bo(e){const t=Mo||Pi;return e?t.then(this?e.bind(this):e):t}function Af(e){let t=se+1,r=Yt.length;for(;t<r;){const n=t+r>>>1;In(Yt[n])<e?t=n+1:r=n}return t}function jo(e){(!Yt.length||!Yt.includes(e,rr&&e.allowRecurse?se+1:se))&&e!==_r&&(e.id==null?Yt.push(e):Yt.splice(Af(e.id),0,e),Ni())}function Ni(){!rr&&!qr&&(qr=!0,Mo=Pi.then(Fi))}function Rf(e){const t=Yt.indexOf(e);t>se&&Yt.splice(t,1)}function Di(e,t,r,n){q(e)?r.push(...e):(!t||!t.includes(e,e.allowRecurse?n+1:n))&&r.push(e),Ni()}function Cf(e){Di(e,hn,En,Ge)}function Lo(e){Di(e,he,xn,ze)}function $o(e,t=null){if(En.length){for(_r=t,hn=[...new Set(En)],En.length=0,Ge=0;Ge<hn.length;Ge++)hn[Ge]();hn=null,Ge=0,_r=null,$o(e,t)}}function or(e){if(xn.length){const t=[...new Set(xn)];if(xn.length=0,he){he.push(...t);return}for(he=t,he.sort((r,n)=>In(r)-In(n)),ze=0;ze<he.length;ze++)he[ze]();he=null,ze=0}}const In=e=>e.id==null?1/0:e.id;function Fi(e){qr=!1,rr=!0,$o(e),Yt.sort((r,n)=>In(r)-In(n));const t=kt;try{for(se=0;se<Yt.length;se++){const r=Yt[se];r&&r.active!==!1&&ee(r,null,14)}}finally{se=0,Yt.length=0,or(),rr=!1,Mo=null,(Yt.length||En.length||xn.length)&&Fi(e)}}let Je,zn=[];function Mi(e,t){var r,n;Je=e,Je?(Je.enabled=!0,zn.forEach(({event:o,args:s})=>Je.emit(o,...s)),zn=[]):typeof window!=\"undefined\"&&window.HTMLElement&&!(!((n=(r=window.navigator)===null||r===void 0?void 0:r.userAgent)===null||n===void 0)&&n.includes(\"jsdom\"))?((t.__VUE_DEVTOOLS_HOOK_REPLAY__=t.__VUE_DEVTOOLS_HOOK_REPLAY__||[]).push(s=>{Mi(s,t)}),setTimeout(()=>{Je||(t.__VUE_DEVTOOLS_HOOK_REPLAY__=null,zn=[])},3e3)):zn=[]}function If(e,t,...r){if(e.isUnmounted)return;const n=e.vnode.props||bt;let o=r;const s=t.startsWith(\"update:\"),i=s&&t.slice(7);if(i&&i in n){const f=`${i===\"modelValue\"?\"model\":i}Modifiers`,{number:c,trim:d}=n[f]||bt;d?o=r.map(v=>v.trim()):c&&(o=r.map(xe))}let a,l=n[a=mn(t)]||n[a=mn(Gt(t))];!l&&s&&(l=n[a=mn(te(t))]),l&&wt(l,e,6,o);const u=n[a+\"Once\"];if(u){if(!e.emitted)e.emitted={};else if(e.emitted[a])return;e.emitted[a]=!0,wt(u,e,6,o)}}function Bi(e,t,r=!1){const n=t.emitsCache,o=n.get(e);if(o!==void 0)return o;const s=e.emits;let i={},a=!1;if(!nt(e)){const l=u=>{const f=Bi(u,t,!0);f&&(a=!0,At(i,f))};!r&&t.mixins.length&&t.mixins.forEach(l),e.extends&&l(e.extends),e.mixins&&e.mixins.forEach(l)}return!s&&!a?(n.set(e,null),null):(q(s)?s.forEach(l=>i[l]=null):At(i,s),n.set(e,i),i)}function Sr(e,t){return!e||!Mn(t)?!1:(t=t.slice(2).replace(/Once$/,\"\"),mt(e,t[0].toLowerCase()+t.slice(1))||mt(e,te(t))||mt(e,t))}let jt=null,br=null;function Pn(e){const t=jt;return jt=e,br=e&&e.type.__scopeId||null,t}function ji(e){br=e}function Li(){br=null}const Pf=e=>Uo;function Uo(e,t=jt,r){if(!t||e._n)return e;const n=(...o)=>{n._d&&oo(-1);const s=Pn(t),i=e(...o);return Pn(s),n._d&&oo(1),i};return n._n=!0,n._c=!0,n._d=!0,n}function qn(e){const{type:t,vnode:r,proxy:n,withProxy:o,props:s,propsOptions:[i],slots:a,attrs:l,emit:u,render:f,renderCache:c,data:d,setupState:v,ctx:g,inheritAttrs:y}=e;let m,p;const h=Pn(e);try{if(r.shapeFlag&4){const A=o||n;m=Wt(f.call(A,A,c,s,v,d,g)),p=l}else{const A=t;m=Wt(A.length>1?A(s,{attrs:l,slots:a,emit:u}):A(s,null)),p=t.props?l:Df(l)}}catch(A){Tn.length=0,Ve(A,e,1),m=Ot(Lt)}let x=m;if(p&&y!==!1){const A=Object.keys(p),{shapeFlag:I}=x;A.length&&I&7&&(i&&A.some(yo)&&(p=Ff(p,i)),x=le(x,p))}return r.dirs&&(x.dirs=x.dirs?x.dirs.concat(r.dirs):r.dirs),r.transition&&(x.transition=r.transition),m=x,Pn(h),m}function Nf(e){let t;for(let r=0;r<e.length;r++){const n=e[r];if(Oe(n)){if(n.type!==Lt||n.children===\"v-if\"){if(t)return;t=n}}else return}return t}const Df=e=>{let t;for(const r in e)(r===\"class\"||r===\"style\"||Mn(r))&&((t||(t={}))[r]=e[r]);return t},Ff=(e,t)=>{const r={};for(const n in e)(!yo(n)||!(n.slice(9)in t))&&(r[n]=e[n]);return r};function Mf(e,t,r){const{props:n,children:o,component:s}=e,{props:i,children:a,patchFlag:l}=t,u=s.emitsOptions;if(t.dirs||t.transition)return!0;if(r&&l>=0){if(l&1024)return!0;if(l&16)return n?Es(n,i,u):!!i;if(l&8){const f=t.dynamicProps;for(let c=0;c<f.length;c++){const d=f[c];if(i[d]!==n[d]&&!Sr(u,d))return!0}}}else return(o||a)&&(!a||!a.$stable)?!0:n===i?!1:n?i?Es(n,i,u):!0:!!i;return!1}function Es(e,t,r){const n=Object.keys(t);if(n.length!==Object.keys(e).length)return!0;for(let o=0;o<n.length;o++){const s=n[o];if(t[s]!==e[s]&&!Sr(r,s))return!0}return!1}function Ko({vnode:e,parent:t},r){for(;t&&t.subTree===e;)(e=t.vnode).el=r,t=t.parent}const Bf=e=>e.__isSuspense,jf={name:\"Suspense\",__isSuspense:!0,process(e,t,r,n,o,s,i,a,l,u){e==null?$f(t,r,n,o,s,i,a,l,u):Uf(e,t,r,n,o,i,a,l,u)},hydrate:Kf,create:Vo,normalize:Vf},Lf=jf;function Nn(e,t){const r=e.props&&e.props[t];nt(r)&&r()}function $f(e,t,r,n,o,s,i,a,l){const{p:u,o:{createElement:f}}=l,c=f(\"div\"),d=e.suspense=Vo(e,o,n,t,c,r,s,i,a,l);u(null,d.pendingBranch=e.ssContent,c,null,n,d,s,i),d.deps>0?(Nn(e,\"onPending\"),Nn(e,\"onFallback\"),u(null,e.ssFallback,t,r,n,null,s,i),ke(d,e.ssFallback)):d.resolve()}function Uf(e,t,r,n,o,s,i,a,{p:l,um:u,o:{createElement:f}}){const c=t.suspense=e.suspense;c.vnode=t,t.el=e.el;const d=t.ssContent,v=t.ssFallback,{activeBranch:g,pendingBranch:y,isInFallback:m,isHydrating:p}=c;if(y)c.pendingBranch=d,_t(d,y)?(l(y,d,c.hiddenContainer,null,o,c,s,i,a),c.deps<=0?c.resolve():m&&(l(g,v,r,n,o,null,s,i,a),ke(c,v))):(c.pendingId++,p?(c.isHydrating=!1,c.activeBranch=y):u(y,o,c),c.deps=0,c.effects.length=0,c.hiddenContainer=f(\"div\"),m?(l(null,d,c.hiddenContainer,null,o,c,s,i,a),c.deps<=0?c.resolve():(l(g,v,r,n,o,null,s,i,a),ke(c,v))):g&&_t(d,g)?(l(g,d,r,n,o,c,s,i,a),c.resolve(!0)):(l(null,d,c.hiddenContainer,null,o,c,s,i,a),c.deps<=0&&c.resolve()));else if(g&&_t(d,g))l(g,d,r,n,o,c,s,i,a),ke(c,d);else if(Nn(t,\"onPending\"),c.pendingBranch=d,c.pendingId++,l(null,d,c.hiddenContainer,null,o,c,s,i,a),c.deps<=0)c.resolve();else{const{timeout:h,pendingId:x}=c;h>0?setTimeout(()=>{c.pendingId===x&&c.fallback(v)},h):h===0&&c.fallback(v)}}function Vo(e,t,r,n,o,s,i,a,l,u,f=!1){const{p:c,m:d,um:v,n:g,o:{parentNode:y,remove:m}}=u,p=xe(e.props&&e.props.timeout),h={vnode:e,parent:t,parentComponent:r,isSVG:i,container:n,hiddenContainer:o,anchor:s,deps:0,pendingId:0,timeout:typeof p==\"number\"?p:-1,activeBranch:null,pendingBranch:null,isInFallback:!0,isHydrating:f,isUnmounted:!1,effects:[],resolve(x=!1){const{vnode:A,activeBranch:I,pendingBranch:b,pendingId:O,effects:S,parentComponent:C,container:T}=h;if(h.isHydrating)h.isHydrating=!1;else if(!x){const F=I&&b.transition&&b.transition.mode===\"out-in\";F&&(I.transition.afterLeave=()=>{O===h.pendingId&&d(b,T,H,0)});let{anchor:H}=h;I&&(H=g(I),v(I,C,h,!0)),F||d(b,T,H,0)}ke(h,b),h.pendingBranch=null,h.isInFallback=!1;let N=h.parent,P=!1;for(;N;){if(N.pendingBranch){N.effects.push(...S),P=!0;break}N=N.parent}P||Lo(S),h.effects=[],Nn(A,\"onResolve\")},fallback(x){if(!h.pendingBranch)return;const{vnode:A,activeBranch:I,parentComponent:b,container:O,isSVG:S}=h;Nn(A,\"onFallback\");const C=g(I),T=()=>{!h.isInFallback||(c(null,x,O,C,b,null,S,a,l),ke(h,x))},N=x.transition&&x.transition.mode===\"out-in\";N&&(I.transition.afterLeave=T),h.isInFallback=!0,v(I,b,null,!0),N||T()},move(x,A,I){h.activeBranch&&d(h.activeBranch,x,A,I),h.container=x},next(){return h.activeBranch&&g(h.activeBranch)},registerDep(x,A){const I=!!h.pendingBranch;I&&h.deps++;const b=x.vnode.el;x.asyncDep.catch(O=>{Ve(O,x,0)}).then(O=>{if(x.isUnmounted||h.isUnmounted||h.pendingId!==x.suspenseId)return;x.asyncResolved=!0;const{vnode:S}=x;lo(x,O,!1),b&&(S.el=b);const C=!b&&x.subTree.el;A(x,S,y(b||x.subTree.el),b?null:g(x.subTree),h,i,l),C&&m(C),Ko(x,S.el),I&&--h.deps===0&&h.resolve()})},unmount(x,A){h.isUnmounted=!0,h.activeBranch&&v(h.activeBranch,r,x,A),h.pendingBranch&&v(h.pendingBranch,r,x,A)}};return h}function Kf(e,t,r,n,o,s,i,a,l){const u=t.suspense=Vo(t,n,r,e.parentNode,document.createElement(\"div\"),null,o,s,i,a,!0),f=l(e,u.pendingBranch=t.ssContent,r,u,s,i);return u.deps===0&&u.resolve(),f}function Vf(e){const{shapeFlag:t,children:r}=e,n=t&32;e.ssContent=xs(n?r.default:r),e.ssFallback=n?xs(r.fallback):Ot(Lt)}function xs(e){let t;if(nt(e)){const r=nn&&e._c;r&&(e._d=!1,be()),e=e(),r&&(e._d=!0,t=ne,ua())}return q(e)&&(e=Nf(e)),e=Wt(e),t&&!e.dynamicChildren&&(e.dynamicChildren=t.filter(r=>r!==e)),e}function $i(e,t){t&&t.pendingBranch?q(e)?t.effects.push(...e):t.effects.push(e):Lo(e)}function ke(e,t){e.activeBranch=t;const{vnode:r,parentComponent:n}=e,o=r.el=t.el;n&&n.subTree===r&&(n.vnode.el=o,Ko(n,o))}function Ui(e,t){if(It){let r=It.provides;const n=It.parent&&It.parent.provides;n===r&&(r=It.provides=Object.create(n)),r[e]=t}}function Sn(e,t,r=!1){const n=It||jt;if(n){const o=n.parent==null?n.vnode.appContext&&n.vnode.appContext.provides:n.parent.provides;if(o&&e in o)return o[e];if(arguments.length>1)return r&&nt(t)?t.call(n.proxy):t}}function Hf(e,t){return $n(e,null,t)}function Ki(e,t){return $n(e,null,{flush:\"post\"})}function Wf(e,t){return $n(e,null,{flush:\"sync\"})}const Ss={};function bn(e,t,r){return $n(e,t,r)}function $n(e,t,{immediate:r,deep:n,flush:o,onTrack:s,onTrigger:i}=bt){const a=It;let l,u=!1,f=!1;if(Ct(e)?(l=()=>e.value,u=Co(e)):Me(e)?(l=()=>e,n=!0):q(e)?(f=!0,u=e.some(Me),l=()=>e.map(p=>{if(Ct(p))return p.value;if(Me(p))return De(p);if(nt(p))return ee(p,a,2)})):nt(e)?t?l=()=>ee(e,a,2):l=()=>{if(!(a&&a.isUnmounted))return c&&c(),wt(e,a,3,[d])}:l=kt,t&&n){const p=l;l=()=>De(p())}let c,d=p=>{c=m.onStop=()=>{ee(p,a,4)}};if(rn)return d=kt,t?r&&wt(t,a,3,[l(),f?[]:void 0,d]):l(),kt;let v=f?[]:Ss;const g=()=>{if(!!m.active)if(t){const p=m.run();(n||u||(f?p.some((h,x)=>Rn(h,v[x])):Rn(p,v)))&&(c&&c(),wt(t,a,3,[p,v===Ss?void 0:v,d]),v=p)}else m.run()};g.allowRecurse=!!t;let y;o===\"sync\"?y=g:o===\"post\"?y=()=>Dt(g,a&&a.suspense):y=()=>{!a||a.isMounted?Cf(g):g()};const m=new jn(l,y);return t?r?g():v=m.run():o===\"post\"?Dt(m.run.bind(m),a&&a.suspense):m.run(),()=>{m.stop(),a&&a.scope&&Eo(a.scope.effects,m)}}function Yf(e,t,r){const n=this.proxy,o=Tt(e)?e.includes(\".\")?Vi(n,e):()=>n[e]:e.bind(n,n);let s;nt(t)?s=t:(s=t.handler,r=t);const i=It;Te(this);const a=$n(o,s.bind(n),r);return i?Te(i):ye(),a}function Vi(e,t){const r=t.split(\".\");return()=>{let n=e;for(let o=0;o<r.length&&n;o++)n=n[r[o]];return n}}function De(e,t){if(!Rt(e)||e.__v_skip||(t=t||new Set,t.has(e)))return e;if(t.add(e),Ct(e))De(e.value,t);else if(q(e))for(let r=0;r<e.length;r++)De(e[r],t);else if($e(e)||Ze(e))e.forEach(r=>{De(r,t)});else if(li(e))for(const r in e)De(e[r],t);return e}function Ho(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return He(()=>{e.isMounted=!0}),Kn(()=>{e.isUnmounting=!0}),e}const Jt=[Function,Array],wf={name:\"BaseTransition\",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:Jt,onEnter:Jt,onAfterEnter:Jt,onEnterCancelled:Jt,onBeforeLeave:Jt,onLeave:Jt,onAfterLeave:Jt,onLeaveCancelled:Jt,onBeforeAppear:Jt,onAppear:Jt,onAfterAppear:Jt,onAppearCancelled:Jt},setup(e,{slots:t}){const r=ue(),n=Ho();let o;return()=>{const s=t.default&&Or(t.default(),!0);if(!s||!s.length)return;let i=s[0];if(s.length>1){for(const y of s)if(y.type!==Lt){i=y;break}}const a=pt(e),{mode:l}=a;if(n.isLeaving)return Lr(i);const u=bs(i);if(!u)return Lr(i);const f=_e(u,a,n,r);Le(u,f);const c=r.subTree,d=c&&bs(c);let v=!1;const{getTransitionKey:g}=u.type;if(g){const y=g();o===void 0?o=y:y!==o&&(o=y,v=!0)}if(d&&d.type!==Lt&&(!_t(u,d)||v)){const y=_e(d,a,n,r);if(Le(d,y),l===\"out-in\")return n.isLeaving=!0,y.afterLeave=()=>{n.isLeaving=!1,r.update()},Lr(i);l===\"in-out\"&&u.type!==Lt&&(y.delayLeave=(m,p,h)=>{const x=Hi(n,d);x[String(d.key)]=d,m._leaveCb=()=>{p(),m._leaveCb=void 0,delete f.delayedLeave},f.delayedLeave=h})}return i}}},Wo=wf;function Hi(e,t){const{leavingVNodes:r}=e;let n=r.get(t.type);return n||(n=Object.create(null),r.set(t.type,n)),n}function _e(e,t,r,n){const{appear:o,mode:s,persisted:i=!1,onBeforeEnter:a,onEnter:l,onAfterEnter:u,onEnterCancelled:f,onBeforeLeave:c,onLeave:d,onAfterLeave:v,onLeaveCancelled:g,onBeforeAppear:y,onAppear:m,onAfterAppear:p,onAppearCancelled:h}=t,x=String(e.key),A=Hi(r,e),I=(O,S)=>{O&&wt(O,n,9,S)},b={mode:s,persisted:i,beforeEnter(O){let S=a;if(!r.isMounted)if(o)S=y||a;else return;O._leaveCb&&O._leaveCb(!0);const C=A[x];C&&_t(e,C)&&C.el._leaveCb&&C.el._leaveCb(),I(S,[O])},enter(O){let S=l,C=u,T=f;if(!r.isMounted)if(o)S=m||l,C=p||u,T=h||f;else return;let N=!1;const P=O._enterCb=F=>{N||(N=!0,F?I(T,[O]):I(C,[O]),b.delayedLeave&&b.delayedLeave(),O._enterCb=void 0)};S?(S(O,P),S.length<=1&&P()):P()},leave(O,S){const C=String(e.key);if(O._enterCb&&O._enterCb(!0),r.isUnmounting)return S();I(c,[O]);let T=!1;const N=O._leaveCb=P=>{T||(T=!0,S(),P?I(g,[O]):I(v,[O]),O._leaveCb=void 0,A[C]===e&&delete A[C])};A[C]=e,d?(d(O,N),d.length<=1&&N()):N()},clone(O){return _e(O,t,r,n)}};return b}function Lr(e){if(Un(e))return e=le(e),e.children=null,e}function bs(e){return Un(e)?e.children?e.children[0]:void 0:e}function Le(e,t){e.shapeFlag&6&&e.component?Le(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function Or(e,t=!1,r){let n=[],o=0;for(let s=0;s<e.length;s++){let i=e[s];const a=r==null?i.key:String(r)+String(i.key!=null?i.key:s);i.type===Ft?(i.patchFlag&128&&o++,n=n.concat(Or(i.children,t,a))):(t||i.type!==Lt)&&n.push(a!=null?le(i,{key:a}):i)}if(o>1)for(let s=0;s<n.length;s++)n[s].patchFlag=-2;return n}function Yo(e){return nt(e)?{setup:e,name:e.name}:e}const tn=e=>!!e.type.__asyncLoader;function Gf(e){nt(e)&&(e={loader:e});const{loader:t,loadingComponent:r,errorComponent:n,delay:o=200,timeout:s,suspensible:i=!0,onError:a}=e;let l=null,u,f=0;const c=()=>(f++,l=null,d()),d=()=>{let v;return l||(v=l=t().catch(g=>{if(g=g instanceof Error?g:new Error(String(g)),a)return new Promise((y,m)=>{a(g,()=>y(c()),()=>m(g),f+1)});throw g}).then(g=>v!==l&&l?l:(g&&(g.__esModule||g[Symbol.toStringTag]===\"Module\")&&(g=g.default),u=g,g)))};return Yo({name:\"AsyncComponentWrapper\",__asyncLoader:d,get __asyncResolved(){return u},setup(){const v=It;if(u)return()=>$r(u,v);const g=h=>{l=null,Ve(h,v,13,!n)};if(i&&v.suspense||rn)return d().then(h=>()=>$r(h,v)).catch(h=>(g(h),()=>n?Ot(n,{error:h}):null));const y=Be(!1),m=Be(),p=Be(!!o);return o&&setTimeout(()=>{p.value=!1},o),s!=null&&setTimeout(()=>{if(!y.value&&!m.value){const h=new Error(`Async component timed out after ${s}ms.`);g(h),m.value=h}},s),d().then(()=>{y.value=!0,v.parent&&Un(v.parent.vnode)&&jo(v.parent.update)}).catch(h=>{g(h),m.value=h}),()=>{if(y.value&&u)return $r(u,v);if(m.value&&n)return Ot(n,{error:m.value});if(r&&!p.value)return Ot(r)}}})}function $r(e,{vnode:{ref:t,props:r,children:n}}){const o=Ot(e,r,n);return o.ref=t,o}const Un=e=>e.type.__isKeepAlive,zf={name:\"KeepAlive\",__isKeepAlive:!0,props:{include:[String,RegExp,Array],exclude:[String,RegExp,Array],max:[String,Number]},setup(e,{slots:t}){const r=ue(),n=r.ctx;if(!n.renderer)return t.default;const o=new Map,s=new Set;let i=null;const a=r.suspense,{renderer:{p:l,m:u,um:f,o:{createElement:c}}}=n,d=c(\"div\");n.activate=(h,x,A,I,b)=>{const O=h.component;u(h,x,A,0,a),l(O.vnode,h,x,A,O,a,I,h.slotScopeIds,b),Dt(()=>{O.isDeactivated=!1,O.a&&Qe(O.a);const S=h.props&&h.props.onVnodeMounted;S&&Ut(S,O.parent,h)},a)},n.deactivate=h=>{const x=h.component;u(h,d,null,1,a),Dt(()=>{x.da&&Qe(x.da);const A=h.props&&h.props.onVnodeUnmounted;A&&Ut(A,x.parent,h),x.isDeactivated=!0},a)};function v(h){Ur(h),f(h,r,a,!0)}function g(h){o.forEach((x,A)=>{const I=fr(x.type);I&&(!h||!h(I))&&y(A)})}function y(h){const x=o.get(h);!i||x.type!==i.type?v(x):i&&Ur(i),o.delete(h),s.delete(h)}bn(()=>[e.include,e.exclude],([h,x])=>{h&&g(A=>pn(h,A)),x&&g(A=>!pn(x,A))},{flush:\"post\",deep:!0});let m=null;const p=()=>{m!=null&&o.set(m,Kr(r.subTree))};return He(p),Ar(p),Kn(()=>{o.forEach(h=>{const{subTree:x,suspense:A}=r,I=Kr(x);if(h.type===I.type){Ur(I);const b=I.component.da;b&&Dt(b,A);return}v(h)})}),()=>{if(m=null,!t.default)return null;const h=t.default(),x=h[0];if(h.length>1)return i=null,h;if(!Oe(x)||!(x.shapeFlag&4)&&!(x.shapeFlag&128))return i=null,x;let A=Kr(x);const I=A.type,b=fr(tn(A)?A.type.__asyncResolved||{}:I),{include:O,exclude:S,max:C}=e;if(O&&(!b||!pn(O,b))||S&&b&&pn(S,b))return i=A,x;const T=A.key==null?I:A.key,N=o.get(T);return A.el&&(A=le(A),x.shapeFlag&128&&(x.ssContent=A)),m=T,N?(A.el=N.el,A.component=N.component,A.transition&&Le(A,A.transition),A.shapeFlag|=512,s.delete(T),s.add(T)):(s.add(T),C&&s.size>parseInt(C,10)&&y(s.values().next().value)),A.shapeFlag|=256,i=A,x}}},Jf=zf;function pn(e,t){return q(e)?e.some(r=>pn(r,t)):Tt(e)?e.split(\",\").includes(t):e.test?e.test(t):!1}function Wi(e,t){wi(e,\"a\",t)}function Yi(e,t){wi(e,\"da\",t)}function wi(e,t,r=It){const n=e.__wdc||(e.__wdc=()=>{let o=r;for(;o;){if(o.isDeactivated)return;o=o.parent}return e()});if(Tr(t,n,r),r){let o=r.parent;for(;o&&o.parent;)Un(o.parent.vnode)&&Xf(n,t,r,o),o=o.parent}}function Xf(e,t,r,n){const o=Tr(t,e,n,!0);Rr(()=>{Eo(n[t],o)},r)}function Ur(e){let t=e.shapeFlag;t&256&&(t-=256),t&512&&(t-=512),e.shapeFlag=t}function Kr(e){return e.shapeFlag&128?e.ssContent:e}function Tr(e,t,r=It,n=!1){if(r){const o=r[e]||(r[e]=[]),s=t.__weh||(t.__weh=(...i)=>{if(r.isUnmounted)return;Ue(),Te(r);const a=wt(t,r,e,i);return ye(),Ke(),a});return n?o.unshift(s):o.push(s),s}}const fe=e=>(t,r=It)=>(!rn||e===\"sp\")&&Tr(e,t,r),Gi=fe(\"bm\"),He=fe(\"m\"),zi=fe(\"bu\"),Ar=fe(\"u\"),Kn=fe(\"bum\"),Rr=fe(\"um\"),Ji=fe(\"sp\"),Xi=fe(\"rtg\"),Zi=fe(\"rtc\");function Qi(e,t=It){Tr(\"ec\",e,t)}let to=!0;function Zf(e){const t=qi(e),r=e.proxy,n=e.ctx;to=!1,t.beforeCreate&&Os(t.beforeCreate,e,\"bc\");const{data:o,computed:s,methods:i,watch:a,provide:l,inject:u,created:f,beforeMount:c,mounted:d,beforeUpdate:v,updated:g,activated:y,deactivated:m,beforeDestroy:p,beforeUnmount:h,destroyed:x,unmounted:A,render:I,renderTracked:b,renderTriggered:O,errorCaptured:S,serverPrefetch:C,expose:T,inheritAttrs:N,components:P,directives:F,filters:H}=t;if(u&&Qf(u,n,null,e.appContext.config.unwrapInjectedRef),i)for(const M in i){const j=i[M];nt(j)&&(n[M]=j.bind(r))}if(o){const M=o.call(r,r);Rt(M)&&(e.data=Ln(M))}if(to=!0,s)for(const M in s){const j=s[M],G=nt(j)?j.bind(r,r):nt(j.get)?j.get.bind(r,r):kt,st=!nt(j)&&nt(j.set)?j.set.bind(r):kt,et=Oa({get:G,set:st});Object.defineProperty(n,M,{enumerable:!0,configurable:!0,get:()=>et.value,set:rt=>et.value=rt})}if(a)for(const M in a)ki(a[M],n,r,M);if(l){const M=nt(l)?l.call(r):l;Reflect.ownKeys(M).forEach(j=>{Ui(j,M[j])})}f&&Os(f,e,\"c\");function B(M,j){q(j)?j.forEach(G=>M(G.bind(r))):j&&M(j.bind(r))}if(B(Gi,c),B(He,d),B(zi,v),B(Ar,g),B(Wi,y),B(Yi,m),B(Qi,S),B(Zi,b),B(Xi,O),B(Kn,h),B(Rr,A),B(Ji,C),q(T))if(T.length){const M=e.exposed||(e.exposed={});T.forEach(j=>{Object.defineProperty(M,j,{get:()=>r[j],set:G=>r[j]=G})})}else e.exposed||(e.exposed={});I&&e.render===kt&&(e.render=I),N!=null&&(e.inheritAttrs=N),P&&(e.components=P),F&&(e.directives=F)}function Qf(e,t,r=kt,n=!1){q(e)&&(e=eo(e));for(const o in e){const s=e[o];let i;Rt(s)?\"default\"in s?i=Sn(s.from||o,s.default,!0):i=Sn(s.from||o):i=Sn(s),Ct(i)&&n?Object.defineProperty(t,o,{enumerable:!0,configurable:!0,get:()=>i.value,set:a=>i.value=a}):t[o]=i}}function Os(e,t,r){wt(q(e)?e.map(n=>n.bind(t.proxy)):e.bind(t.proxy),t,r)}function ki(e,t,r,n){const o=n.includes(\".\")?Vi(r,n):()=>r[n];if(Tt(e)){const s=t[e];nt(s)&&bn(o,s)}else if(nt(e))bn(o,e.bind(r));else if(Rt(e))if(q(e))e.forEach(s=>ki(s,t,r,n));else{const s=nt(e.handler)?e.handler.bind(r):t[e.handler];nt(s)&&bn(o,s,e)}}function qi(e){const t=e.type,{mixins:r,extends:n}=t,{mixins:o,optionsCache:s,config:{optionMergeStrategies:i}}=e.appContext,a=s.get(t);let l;return a?l=a:!o.length&&!r&&!n?l=t:(l={},o.length&&o.forEach(u=>sr(l,u,i,!0)),sr(l,t,i)),s.set(t,l),l}function sr(e,t,r,n=!1){const{mixins:o,extends:s}=t;s&&sr(e,s,r,!0),o&&o.forEach(i=>sr(e,i,r,!0));for(const i in t)if(!(n&&i===\"expose\")){const a=kf[i]||r&&r[i];e[i]=a?a(e[i],t[i]):t[i]}return e}const kf={data:Ts,props:Ie,emits:Ie,methods:Ie,computed:Ie,beforeCreate:$t,created:$t,beforeMount:$t,mounted:$t,beforeUpdate:$t,updated:$t,beforeDestroy:$t,beforeUnmount:$t,destroyed:$t,unmounted:$t,activated:$t,deactivated:$t,errorCaptured:$t,serverPrefetch:$t,components:Ie,directives:Ie,watch:_f,provide:Ts,inject:qf};function Ts(e,t){return t?e?function(){return At(nt(e)?e.call(this,this):e,nt(t)?t.call(this,this):t)}:t:e}function qf(e,t){return Ie(eo(e),eo(t))}function eo(e){if(q(e)){const t={};for(let r=0;r<e.length;r++)t[e[r]]=e[r];return t}return e}function $t(e,t){return e?[...new Set([].concat(e,t))]:t}function Ie(e,t){return e?At(At(Object.create(null),e),t):t}function _f(e,t){if(!e)return t;if(!t)return e;const r=At(Object.create(null),e);for(const n in t)r[n]=$t(e[n],t[n]);return r}function tu(e,t,r,n=!1){const o={},s={};nr(s,Cr,1),e.propsDefaults=Object.create(null),_i(e,t,o,s);for(const i in e.propsOptions[0])i in o||(o[i]=void 0);r?e.props=n?o:bi(o):e.type.props?e.props=o:e.props=s,e.attrs=s}function eu(e,t,r,n){const{props:o,attrs:s,vnode:{patchFlag:i}}=e,a=pt(o),[l]=e.propsOptions;let u=!1;if((n||i>0)&&!(i&16)){if(i&8){const f=e.vnode.dynamicProps;for(let c=0;c<f.length;c++){let d=f[c];if(Sr(e.emitsOptions,d))continue;const v=t[d];if(l)if(mt(s,d))v!==s[d]&&(s[d]=v,u=!0);else{const g=Gt(d);o[g]=no(l,a,g,v,e,!1)}else v!==s[d]&&(s[d]=v,u=!0)}}}else{_i(e,t,o,s)&&(u=!0);let f;for(const c in a)(!t||!mt(t,c)&&((f=te(c))===c||!mt(t,f)))&&(l?r&&(r[c]!==void 0||r[f]!==void 0)&&(o[c]=no(l,a,c,void 0,e,!0)):delete o[c]);if(s!==a)for(const c in s)(!t||!mt(t,c)&&!0)&&(delete s[c],u=!0)}u&&ae(e,\"set\",\"$attrs\")}function _i(e,t,r,n){const[o,s]=e.propsOptions;let i=!1,a;if(t)for(let l in t){if(gn(l))continue;const u=t[l];let f;o&&mt(o,f=Gt(l))?!s||!s.includes(f)?r[f]=u:(a||(a={}))[f]=u:Sr(e.emitsOptions,l)||(!(l in n)||u!==n[l])&&(n[l]=u,i=!0)}if(s){const l=pt(r),u=a||bt;for(let f=0;f<s.length;f++){const c=s[f];r[c]=no(o,l,c,u[c],e,!mt(u,c))}}return i}function no(e,t,r,n,o,s){const i=e[r];if(i!=null){const a=mt(i,\"default\");if(a&&n===void 0){const l=i.default;if(i.type!==Function&&nt(l)){const{propsDefaults:u}=o;r in u?n=u[r]:(Te(o),n=u[r]=l.call(null,t),ye())}else n=l}i[0]&&(s&&!a?n=!1:i[1]&&(n===\"\"||n===te(r))&&(n=!0))}return n}function ta(e,t,r=!1){const n=t.propsCache,o=n.get(e);if(o)return o;const s=e.props,i={},a=[];let l=!1;if(!nt(e)){const f=c=>{l=!0;const[d,v]=ta(c,t,!0);At(i,d),v&&a.push(...v)};!r&&t.mixins.length&&t.mixins.forEach(f),e.extends&&f(e.extends),e.mixins&&e.mixins.forEach(f)}if(!s&&!l)return n.set(e,Xe),Xe;if(q(s))for(let f=0;f<s.length;f++){const c=Gt(s[f]);As(c)&&(i[c]=bt)}else if(s)for(const f in s){const c=Gt(f);if(As(c)){const d=s[f],v=i[c]=q(d)||nt(d)?{type:d}:d;if(v){const g=Is(Boolean,v.type),y=Is(String,v.type);v[0]=g>-1,v[1]=y<0||g<y,(g>-1||mt(v,\"default\"))&&a.push(c)}}}const u=[i,a];return n.set(e,u),u}function As(e){return e[0]!==\"$\"}function Rs(e){const t=e&&e.toString().match(/^\\s*function (\\w+)/);return t?t[1]:e===null?\"null\":\"\"}function Cs(e,t){return Rs(e)===Rs(t)}function Is(e,t){return q(t)?t.findIndex(r=>Cs(r,e)):nt(t)&&Cs(t,e)?0:-1}const ea=e=>e[0]===\"_\"||e===\"$stable\",wo=e=>q(e)?e.map(Wt):[Wt(e)],nu=(e,t,r)=>{const n=Uo((...o)=>wo(t(...o)),r);return n._c=!1,n},na=(e,t,r)=>{const n=e._ctx;for(const o in e){if(ea(o))continue;const s=e[o];if(nt(s))t[o]=nu(o,s,n);else if(s!=null){const i=wo(s);t[o]=()=>i}}},ra=(e,t)=>{const r=wo(t);e.slots.default=()=>r},ru=(e,t)=>{if(e.vnode.shapeFlag&32){const r=t._;r?(e.slots=pt(t),nr(t,\"_\",r)):na(t,e.slots={})}else e.slots={},t&&ra(e,t);nr(e.slots,Cr,1)},ou=(e,t,r)=>{const{vnode:n,slots:o}=e;let s=!0,i=bt;if(n.shapeFlag&32){const a=t._;a?r&&a===1?s=!1:(At(o,t),!r&&a===1&&delete o._):(s=!t.$stable,na(t,o)),i=t}else t&&(ra(e,t),i={default:1});if(s)for(const a in o)!ea(a)&&!(a in i)&&delete o[a]};function su(e,t){const r=jt;if(r===null)return e;const n=Ir(r)||r.proxy,o=e.dirs||(e.dirs=[]);for(let s=0;s<t.length;s++){let[i,a,l,u=bt]=t[s];nt(i)&&(i={mounted:i,updated:i}),i.deep&&De(a),o.push({dir:i,instance:n,value:a,oldValue:void 0,arg:l,modifiers:u})}return e}function qt(e,t,r,n){const o=e.dirs,s=t&&t.dirs;for(let i=0;i<o.length;i++){const a=o[i];s&&(a.oldValue=s[i].value);let l=a.dir[n];l&&(Ue(),wt(l,r,8,[e.el,a,e,t]),Ke())}}function oa(){return{app:null,config:{isNativeTag:Al,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let iu=0;function au(e,t){return function(n,o=null){nt(n)||(n=Object.assign({},n)),o!=null&&!Rt(o)&&(o=null);const s=oa(),i=new Set;let a=!1;const l=s.app={_uid:iu++,_component:n,_props:o,_container:null,_context:s,_instance:null,version:Ia,get config(){return s.config},set config(u){},use(u,...f){return i.has(u)||(u&&nt(u.install)?(i.add(u),u.install(l,...f)):nt(u)&&(i.add(u),u(l,...f))),l},mixin(u){return s.mixins.includes(u)||s.mixins.push(u),l},component(u,f){return f?(s.components[u]=f,l):s.components[u]},directive(u,f){return f?(s.directives[u]=f,l):s.directives[u]},mount(u,f,c){if(!a){const d=Ot(n,o);return d.appContext=s,f&&t?t(d,u):e(d,u,c),a=!0,l._container=u,u.__vue_app__=l,Ir(d.component)||d.component.proxy}},unmount(){a&&(e(null,l._container),delete l._container.__vue_app__)},provide(u,f){return s.provides[u]=f,l}};return l}}function ir(e,t,r,n,o=!1){if(q(e)){e.forEach((d,v)=>ir(d,t&&(q(t)?t[v]:t),r,n,o));return}if(tn(n)&&!o)return;const s=n.shapeFlag&4?Ir(n.component)||n.component.proxy:n.el,i=o?null:s,{i:a,r:l}=e,u=t&&t.r,f=a.refs===bt?a.refs={}:a.refs,c=a.setupState;if(u!=null&&u!==l&&(Tt(u)?(f[u]=null,mt(c,u)&&(c[u]=null)):Ct(u)&&(u.value=null)),nt(l))ee(l,a,12,[i,f]);else{const d=Tt(l),v=Ct(l);if(d||v){const g=()=>{if(e.f){const y=d?f[l]:l.value;o?q(y)&&Eo(y,s):q(y)?y.includes(s)||y.push(s):d?(f[l]=[s],mt(c,l)&&(c[l]=f[l])):(l.value=[s],e.k&&(f[e.k]=l.value))}else d?(f[l]=i,mt(c,l)&&(c[l]=i)):Ct(l)&&(l.value=i,e.k&&(f[e.k]=i))};i?(g.id=-1,Dt(g,r)):g()}}}let de=!1;const Jn=e=>/svg/.test(e.namespaceURI)&&e.tagName!==\"foreignObject\",Vr=e=>e.nodeType===8;function lu(e){const{mt:t,p:r,o:{patchProp:n,nextSibling:o,parentNode:s,remove:i,insert:a,createComment:l}}=e,u=(m,p)=>{if(!p.hasChildNodes()){r(null,m,p),or();return}de=!1,f(p.firstChild,m,null,null,null),or(),de&&console.error(\"Hydration completed but contains mismatches.\")},f=(m,p,h,x,A,I=!1)=>{const b=Vr(m)&&m.data===\"[\",O=()=>g(m,p,h,x,A,b),{type:S,ref:C,shapeFlag:T}=p,N=m.nodeType;p.el=m;let P=null;switch(S){case en:N!==3?P=O():(m.data!==p.children&&(de=!0,m.data=p.children),P=o(m));break;case Lt:N!==8||b?P=O():P=o(m);break;case je:if(N!==1)P=O();else{P=m;const F=!p.children.length;for(let H=0;H<p.staticCount;H++)F&&(p.children+=P.outerHTML),H===p.staticCount-1&&(p.anchor=P),P=o(P);return P}break;case Ft:b?P=v(m,p,h,x,A,I):P=O();break;default:if(T&1)N!==1||p.type.toLowerCase()!==m.tagName.toLowerCase()?P=O():P=c(m,p,h,x,A,I);else if(T&6){p.slotScopeIds=A;const F=s(m);if(t(p,F,null,h,x,Jn(F),I),P=b?y(m):o(m),tn(p)){let H;b?(H=Ot(Ft),H.anchor=P?P.previousSibling:F.lastChild):H=m.nodeType===3?Xo(\"\"):Ot(\"div\"),H.el=m,p.component.subTree=H}}else T&64?N!==8?P=O():P=p.type.hydrate(m,p,h,x,A,I,e,d):T&128&&(P=p.type.hydrate(m,p,h,x,Jn(s(m)),A,I,e,f))}return C!=null&&ir(C,null,x,p),P},c=(m,p,h,x,A,I)=>{I=I||!!p.dynamicChildren;const{type:b,props:O,patchFlag:S,shapeFlag:C,dirs:T}=p,N=b===\"input\"&&T||b===\"option\";if(N||S!==-1){if(T&&qt(p,null,h,\"created\"),O)if(N||!I||S&48)for(const F in O)(N&&F.endsWith(\"value\")||Mn(F)&&!gn(F))&&n(m,F,null,O[F],!1,void 0,h);else O.onClick&&n(m,\"onClick\",null,O.onClick,!1,void 0,h);let P;if((P=O&&O.onVnodeBeforeMount)&&Ut(P,h,p),T&&qt(p,null,h,\"beforeMount\"),((P=O&&O.onVnodeMounted)||T)&&$i(()=>{P&&Ut(P,h,p),T&&qt(p,null,h,\"mounted\")},x),C&16&&!(O&&(O.innerHTML||O.textContent))){let F=d(m.firstChild,p,m,h,x,A,I);for(;F;){de=!0;const H=F;F=F.nextSibling,i(H)}}else C&8&&m.textContent!==p.children&&(de=!0,m.textContent=p.children)}return m.nextSibling},d=(m,p,h,x,A,I,b)=>{b=b||!!p.dynamicChildren;const O=p.children,S=O.length;for(let C=0;C<S;C++){const T=b?O[C]:O[C]=Wt(O[C]);if(m)m=f(m,T,x,A,I,b);else{if(T.type===en&&!T.children)continue;de=!0,r(null,T,h,null,x,A,Jn(h),I)}}return m},v=(m,p,h,x,A,I)=>{const{slotScopeIds:b}=p;b&&(A=A?A.concat(b):b);const O=s(m),S=d(o(m),p,O,h,x,A,I);return S&&Vr(S)&&S.data===\"]\"?o(p.anchor=S):(de=!0,a(p.anchor=l(\"]\"),O,S),S)},g=(m,p,h,x,A,I)=>{if(de=!0,p.el=null,I){const S=y(m);for(;;){const C=o(m);if(C&&C!==S)i(C);else break}}const b=o(m),O=s(m);return i(m),r(null,p,O,b,h,x,Jn(O),A),b},y=m=>{let p=0;for(;m;)if(m=o(m),m&&Vr(m)&&(m.data===\"[\"&&p++,m.data===\"]\")){if(p===0)return o(m);p--}return m};return[u,f]}const Dt=$i;function sa(e){return aa(e)}function ia(e){return aa(e,lu)}function aa(e,t){const r=Dl();r.__VUE__=!0;const{insert:n,remove:o,patchProp:s,createElement:i,createText:a,createComment:l,setText:u,setElementText:f,parentNode:c,nextSibling:d,setScopeId:v=kt,cloneNode:g,insertStaticContent:y}=e,m=(E,R,D,L=null,$=null,W=null,V=!1,U=null,Y=!!R.dynamicChildren)=>{if(E===R)return;E&&!_t(E,R)&&(L=Z(E),gt(E,$,W,!0),E=null),R.patchFlag===-2&&(Y=!1,R.dynamicChildren=null);const{type:K,ref:X,shapeFlag:J}=R;switch(K){case en:p(E,R,D,L);break;case Lt:h(E,R,D,L);break;case je:E==null&&x(R,D,L,V);break;case Ft:F(E,R,D,L,$,W,V,U,Y);break;default:J&1?b(E,R,D,L,$,W,V,U,Y):J&6?H(E,R,D,L,$,W,V,U,Y):(J&64||J&128)&&K.process(E,R,D,L,$,W,V,U,Y,ct)}X!=null&&$&&ir(X,E&&E.ref,W,R||E,!R)},p=(E,R,D,L)=>{if(E==null)n(R.el=a(R.children),D,L);else{const $=R.el=E.el;R.children!==E.children&&u($,R.children)}},h=(E,R,D,L)=>{E==null?n(R.el=l(R.children||\"\"),D,L):R.el=E.el},x=(E,R,D,L)=>{[E.el,E.anchor]=y(E.children,R,D,L,E.el,E.anchor)},A=({el:E,anchor:R},D,L)=>{let $;for(;E&&E!==R;)$=d(E),n(E,D,L),E=$;n(R,D,L)},I=({el:E,anchor:R})=>{let D;for(;E&&E!==R;)D=d(E),o(E),E=D;o(R)},b=(E,R,D,L,$,W,V,U,Y)=>{V=V||R.type===\"svg\",E==null?O(R,D,L,$,W,V,U,Y):T(E,R,$,W,V,U,Y)},O=(E,R,D,L,$,W,V,U)=>{let Y,K;const{type:X,props:J,shapeFlag:k,transition:tt,patchFlag:dt,dirs:St}=E;if(E.el&&g!==void 0&&dt===-1)Y=E.el=g(E.el);else{if(Y=E.el=i(E.type,W,J&&J.is,J),k&8?f(Y,E.children):k&16&&C(E.children,Y,null,L,$,W&&X!==\"foreignObject\",V,U),St&&qt(E,null,L,\"created\"),J){for(const xt in J)xt!==\"value\"&&!gn(xt)&&s(Y,xt,null,J[xt],W,E.children,L,$,Q);\"value\"in J&&s(Y,\"value\",null,J.value),(K=J.onVnodeBeforeMount)&&Ut(K,L,E)}S(Y,E,E.scopeId,V,L)}St&&qt(E,null,L,\"beforeMount\");const Et=(!$||$&&!$.pendingBranch)&&tt&&!tt.persisted;Et&&tt.beforeEnter(Y),n(Y,R,D),((K=J&&J.onVnodeMounted)||Et||St)&&Dt(()=>{K&&Ut(K,L,E),Et&&tt.enter(Y),St&&qt(E,null,L,\"mounted\")},$)},S=(E,R,D,L,$)=>{if(D&&v(E,D),L)for(let W=0;W<L.length;W++)v(E,L[W]);if($){let W=$.subTree;if(R===W){const V=$.vnode;S(E,V,V.scopeId,V.slotScopeIds,$.parent)}}},C=(E,R,D,L,$,W,V,U,Y=0)=>{for(let K=Y;K<E.length;K++){const X=E[K]=U?pe(E[K]):Wt(E[K]);m(null,X,R,D,L,$,W,V,U)}},T=(E,R,D,L,$,W,V)=>{const U=R.el=E.el;let{patchFlag:Y,dynamicChildren:K,dirs:X}=R;Y|=E.patchFlag&16;const J=E.props||bt,k=R.props||bt;let tt;D&&Re(D,!1),(tt=k.onVnodeBeforeUpdate)&&Ut(tt,D,R,E),X&&qt(R,E,D,\"beforeUpdate\"),D&&Re(D,!0);const dt=$&&R.type!==\"foreignObject\";if(K?N(E.dynamicChildren,K,U,D,L,dt,W):V||G(E,R,U,null,D,L,dt,W,!1),Y>0){if(Y&16)P(U,R,J,k,D,L,$);else if(Y&2&&J.class!==k.class&&s(U,\"class\",null,k.class,$),Y&4&&s(U,\"style\",J.style,k.style,$),Y&8){const St=R.dynamicProps;for(let Et=0;Et<St.length;Et++){const xt=St[Et],Bt=J[xt],vt=k[xt];(vt!==Bt||xt===\"value\")&&s(U,xt,Bt,vt,$,E.children,D,L,Q)}}Y&1&&E.children!==R.children&&f(U,R.children)}else!V&&K==null&&P(U,R,J,k,D,L,$);((tt=k.onVnodeUpdated)||X)&&Dt(()=>{tt&&Ut(tt,D,R,E),X&&qt(R,E,D,\"updated\")},L)},N=(E,R,D,L,$,W,V)=>{for(let U=0;U<R.length;U++){const Y=E[U],K=R[U],X=Y.el&&(Y.type===Ft||!_t(Y,K)||Y.shapeFlag&70)?c(Y.el):D;m(Y,K,X,null,L,$,W,V,!0)}},P=(E,R,D,L,$,W,V)=>{if(D!==L){for(const U in L){if(gn(U))continue;const Y=L[U],K=D[U];Y!==K&&U!==\"value\"&&s(E,U,K,Y,V,R.children,$,W,Q)}if(D!==bt)for(const U in D)!gn(U)&&!(U in L)&&s(E,U,D[U],null,V,R.children,$,W,Q);\"value\"in L&&s(E,\"value\",D.value,L.value)}},F=(E,R,D,L,$,W,V,U,Y)=>{const K=R.el=E?E.el:a(\"\"),X=R.anchor=E?E.anchor:a(\"\");let{patchFlag:J,dynamicChildren:k,slotScopeIds:tt}=R;tt&&(U=U?U.concat(tt):tt),E==null?(n(K,D,L),n(X,D,L),C(R.children,D,X,$,W,V,U,Y)):J>0&&J&64&&k&&E.dynamicChildren?(N(E.dynamicChildren,k,D,$,W,V,U),(R.key!=null||$&&R===$.subTree)&&Go(E,R,!0)):G(E,R,D,X,$,W,V,U,Y)},H=(E,R,D,L,$,W,V,U,Y)=>{R.slotScopeIds=U,E==null?R.shapeFlag&512?$.ctx.activate(R,D,L,V,Y):w(R,D,L,$,W,V,Y):B(E,R,Y)},w=(E,R,D,L,$,W,V)=>{const U=E.component=ma(E,L,$);if(Un(E)&&(U.ctx.renderer=ct),Ea(U),U.asyncDep){if($&&$.registerDep(U,M),!E.el){const Y=U.subTree=Ot(Lt);h(null,Y,R,D)}return}M(U,E,R,D,$,W,V)},B=(E,R,D)=>{const L=R.component=E.component;if(Mf(E,R,D))if(L.asyncDep&&!L.asyncResolved){j(L,R,D);return}else L.next=R,Rf(L.update),L.update();else R.component=E.component,R.el=E.el,L.vnode=R},M=(E,R,D,L,$,W,V)=>{const U=()=>{if(E.isMounted){let{next:X,bu:J,u:k,parent:tt,vnode:dt}=E,St=X,Et;Re(E,!1),X?(X.el=dt.el,j(E,X,V)):X=dt,J&&Qe(J),(Et=X.props&&X.props.onVnodeBeforeUpdate)&&Ut(Et,tt,X,dt),Re(E,!0);const xt=qn(E),Bt=E.subTree;E.subTree=xt,m(Bt,xt,c(Bt.el),Z(Bt),E,$,W),X.el=xt.el,St===null&&Ko(E,xt.el),k&&Dt(k,$),(Et=X.props&&X.props.onVnodeUpdated)&&Dt(()=>Ut(Et,tt,X,dt),$)}else{let X;const{el:J,props:k}=R,{bm:tt,m:dt,parent:St}=E,Et=tn(R);if(Re(E,!1),tt&&Qe(tt),!Et&&(X=k&&k.onVnodeBeforeMount)&&Ut(X,St,R),Re(E,!0),J&&ft){const xt=()=>{E.subTree=qn(E),ft(J,E.subTree,E,$,null)};Et?R.type.__asyncLoader().then(()=>!E.isUnmounted&&xt()):xt()}else{const xt=E.subTree=qn(E);m(null,xt,D,L,E,$,W),R.el=xt.el}if(dt&&Dt(dt,$),!Et&&(X=k&&k.onVnodeMounted)){const xt=R;Dt(()=>Ut(X,St,xt),$)}R.shapeFlag&256&&E.a&&Dt(E.a,$),E.isMounted=!0,R=D=L=null}},Y=E.effect=new jn(U,()=>jo(E.update),E.scope),K=E.update=Y.run.bind(Y);K.id=E.uid,Re(E,!0),K()},j=(E,R,D)=>{R.component=E;const L=E.vnode.props;E.vnode=R,E.next=null,eu(E,R.props,L,D),ou(E,R.children,D),Ue(),$o(void 0,E.update),Ke()},G=(E,R,D,L,$,W,V,U,Y=!1)=>{const K=E&&E.children,X=E?E.shapeFlag:0,J=R.children,{patchFlag:k,shapeFlag:tt}=R;if(k>0){if(k&128){et(K,J,D,L,$,W,V,U,Y);return}else if(k&256){st(K,J,D,L,$,W,V,U,Y);return}}tt&8?(X&16&&Q(K,$,W),J!==K&&f(D,J)):X&16?tt&16?et(K,J,D,L,$,W,V,U,Y):Q(K,$,W,!0):(X&8&&f(D,\"\"),tt&16&&C(J,D,L,$,W,V,U,Y))},st=(E,R,D,L,$,W,V,U,Y)=>{E=E||Xe,R=R||Xe;const K=E.length,X=R.length,J=Math.min(K,X);let k;for(k=0;k<J;k++){const tt=R[k]=Y?pe(R[k]):Wt(R[k]);m(E[k],tt,D,null,$,W,V,U,Y)}K>X?Q(E,$,W,!0,!1,J):C(R,D,L,$,W,V,U,Y,J)},et=(E,R,D,L,$,W,V,U,Y)=>{let K=0;const X=R.length;let J=E.length-1,k=X-1;for(;K<=J&&K<=k;){const tt=E[K],dt=R[K]=Y?pe(R[K]):Wt(R[K]);if(_t(tt,dt))m(tt,dt,D,null,$,W,V,U,Y);else break;K++}for(;K<=J&&K<=k;){const tt=E[J],dt=R[k]=Y?pe(R[k]):Wt(R[k]);if(_t(tt,dt))m(tt,dt,D,null,$,W,V,U,Y);else break;J--,k--}if(K>J){if(K<=k){const tt=k+1,dt=tt<X?R[tt].el:L;for(;K<=k;)m(null,R[K]=Y?pe(R[K]):Wt(R[K]),D,dt,$,W,V,U,Y),K++}}else if(K>k)for(;K<=J;)gt(E[K],$,W,!0),K++;else{const tt=K,dt=K,St=new Map;for(K=dt;K<=k;K++){const at=R[K]=Y?pe(R[K]):Wt(R[K]);at.key!=null&&St.set(at.key,K)}let Et,xt=0;const Bt=k-dt+1;let vt=!1,ot=0;const ut=new Array(Bt);for(K=0;K<Bt;K++)ut[K]=0;for(K=tt;K<=J;K++){const at=E[K];if(xt>=Bt){gt(at,$,W,!0);continue}let Pt;if(at.key!=null)Pt=St.get(at.key);else for(Et=dt;Et<=k;Et++)if(ut[Et-dt]===0&&_t(at,R[Et])){Pt=Et;break}Pt===void 0?gt(at,$,W,!0):(ut[Pt-dt]=K+1,Pt>=ot?ot=Pt:vt=!0,m(at,R[Pt],D,null,$,W,V,U,Y),xt++)}const ht=vt?fu(ut):Xe;for(Et=ht.length-1,K=Bt-1;K>=0;K--){const at=dt+K,Pt=R[at],ls=at+1<X?R[at+1].el:L;ut[K]===0?m(null,Pt,D,ls,$,W,V,U,Y):vt&&(Et<0||K!==ht[Et]?rt(Pt,D,ls,2):Et--)}}},rt=(E,R,D,L,$=null)=>{const{el:W,type:V,transition:U,children:Y,shapeFlag:K}=E;if(K&6){rt(E.component.subTree,R,D,L);return}if(K&128){E.suspense.move(R,D,L);return}if(K&64){V.move(E,R,D,ct);return}if(V===Ft){n(W,R,D);for(let J=0;J<Y.length;J++)rt(Y[J],R,D,L);n(E.anchor,R,D);return}if(V===je){A(E,R,D);return}if(L!==2&&K&1&&U)if(L===0)U.beforeEnter(W),n(W,R,D),Dt(()=>U.enter(W),$);else{const{leave:J,delayLeave:k,afterLeave:tt}=U,dt=()=>n(W,R,D),St=()=>{J(W,()=>{dt(),tt&&tt()})};k?k(W,dt,St):St()}else n(W,R,D)},gt=(E,R,D,L=!1,$=!1)=>{const{type:W,props:V,ref:U,children:Y,dynamicChildren:K,shapeFlag:X,patchFlag:J,dirs:k}=E;if(U!=null&&ir(U,null,D,E,!0),X&256){R.ctx.deactivate(E);return}const tt=X&1&&k,dt=!tn(E);let St;if(dt&&(St=V&&V.onVnodeBeforeUnmount)&&Ut(St,R,E),X&6)lt(E.component,D,L);else{if(X&128){E.suspense.unmount(D,L);return}tt&&qt(E,null,R,\"beforeUnmount\"),X&64?E.type.remove(E,R,D,$,ct,L):K&&(W!==Ft||J>0&&J&64)?Q(K,R,D,!1,!0):(W===Ft&&J&384||!$&&X&16)&&Q(Y,R,D),L&&z(E)}(dt&&(St=V&&V.onVnodeUnmounted)||tt)&&Dt(()=>{St&&Ut(St,R,E),tt&&qt(E,null,R,\"unmounted\")},D)},z=E=>{const{type:R,el:D,anchor:L,transition:$}=E;if(R===Ft){_(D,L);return}if(R===je){I(E);return}const W=()=>{o(D),$&&!$.persisted&&$.afterLeave&&$.afterLeave()};if(E.shapeFlag&1&&$&&!$.persisted){const{leave:V,delayLeave:U}=$,Y=()=>V(D,W);U?U(E.el,W,Y):Y()}else W()},_=(E,R)=>{let D;for(;E!==R;)D=d(E),o(E),E=D;o(R)},lt=(E,R,D)=>{const{bum:L,scope:$,update:W,subTree:V,um:U}=E;L&&Qe(L),$.stop(),W&&(W.active=!1,gt(V,E,R,D)),U&&Dt(U,R),Dt(()=>{E.isUnmounted=!0},R),R&&R.pendingBranch&&!R.isUnmounted&&E.asyncDep&&!E.asyncResolved&&E.suspenseId===R.pendingId&&(R.deps--,R.deps===0&&R.resolve())},Q=(E,R,D,L=!1,$=!1,W=0)=>{for(let V=W;V<E.length;V++)gt(E[V],R,D,L,$)},Z=E=>E.shapeFlag&6?Z(E.component.subTree):E.shapeFlag&128?E.suspense.next():d(E.anchor||E.el),yt=(E,R,D)=>{E==null?R._vnode&&gt(R._vnode,null,null,!0):m(R._vnode||null,E,R,null,null,null,D),or(),R._vnode=E},ct={p:m,um:gt,m:rt,r:z,mt:w,mc:C,pc:G,pbc:N,n:Z,o:e};let it,ft;return t&&([it,ft]=t(ct)),{render:yt,hydrate:it,createApp:au(yt,it)}}function Re({effect:e,update:t},r){e.allowRecurse=t.allowRecurse=r}function Go(e,t,r=!1){const n=e.children,o=t.children;if(q(n)&&q(o))for(let s=0;s<n.length;s++){const i=n[s];let a=o[s];a.shapeFlag&1&&!a.dynamicChildren&&((a.patchFlag<=0||a.patchFlag===32)&&(a=o[s]=pe(o[s]),a.el=i.el),r||Go(i,a))}}function fu(e){const t=e.slice(),r=[0];let n,o,s,i,a;const l=e.length;for(n=0;n<l;n++){const u=e[n];if(u!==0){if(o=r[r.length-1],e[o]<u){t[n]=o,r.push(n);continue}for(s=0,i=r.length-1;s<i;)a=s+i>>1,e[r[a]]<u?s=a+1:i=a;u<e[r[s]]&&(s>0&&(t[n]=r[s-1]),r[s]=n)}}for(s=r.length,i=r[s-1];s-- >0;)r[s]=i,i=t[i];return r}const uu=e=>e.__isTeleport,On=e=>e&&(e.disabled||e.disabled===\"\"),Ps=e=>typeof SVGElement!=\"undefined\"&&e instanceof SVGElement,ro=(e,t)=>{const r=e&&e.to;return Tt(r)?t?t(r):null:r},cu={__isTeleport:!0,process(e,t,r,n,o,s,i,a,l,u){const{mc:f,pc:c,pbc:d,o:{insert:v,querySelector:g,createText:y,createComment:m}}=u,p=On(t.props);let{shapeFlag:h,children:x,dynamicChildren:A}=t;if(e==null){const I=t.el=y(\"\"),b=t.anchor=y(\"\");v(I,r,n),v(b,r,n);const O=t.target=ro(t.props,g),S=t.targetAnchor=y(\"\");O&&(v(S,O),i=i||Ps(O));const C=(T,N)=>{h&16&&f(x,T,N,o,s,i,a,l)};p?C(r,b):O&&C(O,S)}else{t.el=e.el;const I=t.anchor=e.anchor,b=t.target=e.target,O=t.targetAnchor=e.targetAnchor,S=On(e.props),C=S?r:b,T=S?I:O;if(i=i||Ps(b),A?(d(e.dynamicChildren,A,C,o,s,i,a),Go(e,t,!0)):l||c(e,t,C,T,o,s,i,a,!1),p)S||Xn(t,r,I,u,1);else if((t.props&&t.props.to)!==(e.props&&e.props.to)){const N=t.target=ro(t.props,g);N&&Xn(t,N,null,u,0)}else S&&Xn(t,b,O,u,1)}},remove(e,t,r,n,{um:o,o:{remove:s}},i){const{shapeFlag:a,children:l,anchor:u,targetAnchor:f,target:c,props:d}=e;if(c&&s(f),(i||!On(d))&&(s(u),a&16))for(let v=0;v<l.length;v++){const g=l[v];o(g,t,r,!0,!!g.dynamicChildren)}},move:Xn,hydrate:du};function Xn(e,t,r,{o:{insert:n},m:o},s=2){s===0&&n(e.targetAnchor,t,r);const{el:i,anchor:a,shapeFlag:l,children:u,props:f}=e,c=s===2;if(c&&n(i,t,r),(!c||On(f))&&l&16)for(let d=0;d<u.length;d++)o(u[d],t,r,2);c&&n(a,t,r)}function du(e,t,r,n,o,s,{o:{nextSibling:i,parentNode:a,querySelector:l}},u){const f=t.target=ro(t.props,l);if(f){const c=f._lpa||f.firstChild;t.shapeFlag&16&&(On(t.props)?(t.anchor=u(i(e),t,a(e),r,n,o,s),t.targetAnchor=c):(t.anchor=i(e),t.targetAnchor=u(c,t,f,r,n,o,s)),f._lpa=t.targetAnchor&&i(t.targetAnchor))}return t.anchor&&i(t.anchor)}const vu=cu,zo=\"components\",hu=\"directives\";function la(e,t){return Jo(zo,e,!0,t)||e}const fa=Symbol();function pu(e){return Tt(e)?Jo(zo,e,!1)||e:e||fa}function gu(e){return Jo(hu,e)}function Jo(e,t,r=!0,n=!1){const o=jt||It;if(o){const s=o.type;if(e===zo){const a=fr(s);if(a&&(a===t||a===Gt(t)||a===Bn(Gt(t))))return s}const i=Ns(o[e]||s[e],t)||Ns(o.appContext[e],t);return!i&&n?s:i}}function Ns(e,t){return e&&(e[t]||e[Gt(t)]||e[Bn(Gt(t))])}const Ft=Symbol(void 0),en=Symbol(void 0),Lt=Symbol(void 0),je=Symbol(void 0),Tn=[];let ne=null;function be(e=!1){Tn.push(ne=e?null:[])}function ua(){Tn.pop(),ne=Tn[Tn.length-1]||null}let nn=1;function oo(e){nn+=e}function ca(e){return e.dynamicChildren=nn>0?ne||Xe:null,ua(),nn>0&&ne&&ne.push(e),e}function so(e,t,r,n,o,s){return ca(Zt(e,t,r,n,o,s,!0))}function Vn(e,t,r,n,o){return ca(Ot(e,t,r,n,o,!0))}function Oe(e){return e?e.__v_isVNode===!0:!1}function _t(e,t){return e.type===t.type&&e.key===t.key}function mu(e){}const Cr=\"__vInternal\",da=({key:e})=>e!=null?e:null,_n=({ref:e,ref_key:t,ref_for:r})=>e!=null?Tt(e)||Ct(e)||nt(e)?{i:jt,r:e,k:t,f:!!r}:e:null;function Zt(e,t=null,r=null,n=0,o=null,s=e===Ft?0:1,i=!1,a=!1){const l={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&da(t),ref:t&&_n(t),scopeId:br,slotScopeIds:null,children:r,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:s,patchFlag:n,dynamicProps:o,dynamicChildren:null,appContext:null};return a?(Zo(l,r),s&128&&e.normalize(l)):r&&(l.shapeFlag|=Tt(r)?8:16),nn>0&&!i&&ne&&(l.patchFlag>0||s&6)&&l.patchFlag!==32&&ne.push(l),l}const Ot=yu;function yu(e,t=null,r=null,n=0,o=null,s=!1){if((!e||e===fa)&&(e=Lt),Oe(e)){const a=le(e,t,!0);return r&&Zo(a,r),a}if(Mu(e)&&(e=e.__vccOpts),t){t=va(t);let{class:a,style:l}=t;a&&!Tt(a)&&(t.class=Fn(a)),Rt(l)&&(Io(l)&&!q(l)&&(l=At({},l)),t.style=Dn(l))}const i=Tt(e)?1:Bf(e)?128:uu(e)?64:Rt(e)?4:nt(e)?2:0;return Zt(e,t,r,n,o,i,s,!0)}function va(e){return e?Io(e)||Cr in e?At({},e):e:null}function le(e,t,r=!1){const{props:n,ref:o,patchFlag:s,children:i}=e,a=t?pa(n||{},t):n;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:a,key:a&&da(a),ref:t&&t.ref?r&&o?q(o)?o.concat(_n(t)):[o,_n(t)]:_n(t):o,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:i,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==Ft?s===-1?16:s|16:s,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&le(e.ssContent),ssFallback:e.ssFallback&&le(e.ssFallback),el:e.el,anchor:e.anchor}}function Xo(e=\" \",t=0){return Ot(en,null,e,t)}function Eu(e,t){const r=Ot(je,null,e);return r.staticCount=t,r}function ha(e=\"\",t=!1){return t?(be(),Vn(Lt,null,e)):Ot(Lt,null,e)}function Wt(e){return e==null||typeof e==\"boolean\"?Ot(Lt):q(e)?Ot(Ft,null,e.slice()):typeof e==\"object\"?pe(e):Ot(en,null,String(e))}function pe(e){return e.el===null||e.memo?e:le(e)}function Zo(e,t){let r=0;const{shapeFlag:n}=e;if(t==null)t=null;else if(q(t))r=16;else if(typeof t==\"object\")if(n&65){const o=t.default;o&&(o._c&&(o._d=!1),Zo(e,o()),o._c&&(o._d=!0));return}else{r=32;const o=t._;!o&&!(Cr in t)?t._ctx=jt:o===3&&jt&&(jt.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else nt(t)?(t={default:t,_ctx:jt},r=32):(t=String(t),n&64?(r=16,t=[Xo(t)]):r=8);e.children=t,e.shapeFlag|=r}function pa(...e){const t={};for(let r=0;r<e.length;r++){const n=e[r];for(const o in n)if(o===\"class\")t.class!==n.class&&(t.class=Fn([t.class,n.class]));else if(o===\"style\")t.style=Dn([t.style,n.style]);else if(Mn(o)){const s=t[o],i=n[o];i&&s!==i&&!(q(s)&&s.includes(i))&&(t[o]=s?[].concat(s,i):i)}else o!==\"\"&&(t[o]=n[o])}return t}function Ut(e,t,r,n=null){wt(e,t,7,[r,n])}function xu(e,t,r,n){let o;const s=r&&r[n];if(q(e)||Tt(e)){o=new Array(e.length);for(let i=0,a=e.length;i<a;i++)o[i]=t(e[i],i,void 0,s&&s[i])}else if(typeof e==\"number\"){o=new Array(e);for(let i=0;i<e;i++)o[i]=t(i+1,i,void 0,s&&s[i])}else if(Rt(e))if(e[Symbol.iterator])o=Array.from(e,(i,a)=>t(i,a,void 0,s&&s[a]));else{const i=Object.keys(e);o=new Array(i.length);for(let a=0,l=i.length;a<l;a++){const u=i[a];o[a]=t(e[u],u,a,s&&s[a])}}else o=[];return r&&(r[n]=o),o}function Su(e,t){for(let r=0;r<t.length;r++){const n=t[r];if(q(n))for(let o=0;o<n.length;o++)e[n[o].name]=n[o].fn;else n&&(e[n.name]=n.fn)}return e}function bu(e,t,r={},n,o){if(jt.isCE||jt.parent&&tn(jt.parent)&&jt.parent.isCE)return Ot(\"slot\",t===\"default\"?null:{name:t},n&&n());let s=e[t];s&&s._c&&(s._d=!1),be();const i=s&&ga(s(r)),a=Vn(Ft,{key:r.key||`_${t}`},i||(n?n():[]),i&&e._===1?64:-2);return!o&&a.scopeId&&(a.slotScopeIds=[a.scopeId+\"-s\"]),s&&s._c&&(s._d=!0),a}function ga(e){return e.some(t=>Oe(t)?!(t.type===Lt||t.type===Ft&&!ga(t.children)):!0)?e:null}function Ou(e){const t={};for(const r in e)t[mn(r)]=e[r];return t}const io=e=>e?ya(e)?Ir(e)||e.proxy:io(e.parent):null,ar=At(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>io(e.parent),$root:e=>io(e.root),$emit:e=>e.emit,$options:e=>qi(e),$forceUpdate:e=>()=>jo(e.update),$nextTick:e=>Bo.bind(e.proxy),$watch:e=>Yf.bind(e)}),ao={get({_:e},t){const{ctx:r,setupState:n,data:o,props:s,accessCache:i,type:a,appContext:l}=e;let u;if(t[0]!==\"$\"){const v=i[t];if(v!==void 0)switch(v){case 1:return n[t];case 2:return o[t];case 4:return r[t];case 3:return s[t]}else{if(n!==bt&&mt(n,t))return i[t]=1,n[t];if(o!==bt&&mt(o,t))return i[t]=2,o[t];if((u=e.propsOptions[0])&&mt(u,t))return i[t]=3,s[t];if(r!==bt&&mt(r,t))return i[t]=4,r[t];to&&(i[t]=0)}}const f=ar[t];let c,d;if(f)return t===\"$attrs\"&&zt(e,\"get\",t),f(e);if((c=a.__cssModules)&&(c=c[t]))return c;if(r!==bt&&mt(r,t))return i[t]=4,r[t];if(d=l.config.globalProperties,mt(d,t))return d[t]},set({_:e},t,r){const{data:n,setupState:o,ctx:s}=e;return o!==bt&&mt(o,t)?(o[t]=r,!0):n!==bt&&mt(n,t)?(n[t]=r,!0):mt(e.props,t)||t[0]===\"$\"&&t.slice(1)in e?!1:(s[t]=r,!0)},has({_:{data:e,setupState:t,accessCache:r,ctx:n,appContext:o,propsOptions:s}},i){let a;return!!r[i]||e!==bt&&mt(e,i)||t!==bt&&mt(t,i)||(a=s[0])&&mt(a,i)||mt(n,i)||mt(ar,i)||mt(o.config.globalProperties,i)},defineProperty(e,t,r){return r.get!=null?e._.accessCache[t]=0:mt(r,\"value\")&&this.set(e,t,r.value,null),Reflect.defineProperty(e,t,r)}},Tu=At({},ao,{get(e,t){if(t!==Symbol.unscopables)return ao.get(e,t,e)},has(e,t){return t[0]!==\"_\"&&!ml(t)}}),Au=oa();let Ru=0;function ma(e,t,r){const n=e.type,o=(t?t.appContext:e.appContext)||Au,s={uid:Ru++,vnode:e,type:n,parent:t,appContext:o,root:null,next:null,subTree:null,effect:null,update:null,scope:new Oo(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(o.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:ta(n,o),emitsOptions:Bi(n,o),emit:null,emitted:null,propsDefaults:bt,inheritAttrs:n.inheritAttrs,ctx:bt,data:bt,props:bt,attrs:bt,slots:bt,refs:bt,setupState:bt,setupContext:null,suspense:r,suspenseId:r?r.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return s.ctx={_:s},s.root=t?t.root:s,s.emit=If.bind(null,s),e.ce&&e.ce(s),s}let It=null;const ue=()=>It||jt,Te=e=>{It=e,e.scope.on()},ye=()=>{It&&It.scope.off(),It=null};function ya(e){return e.vnode.shapeFlag&4}let rn=!1;function Ea(e,t=!1){rn=t;const{props:r,children:n}=e.vnode,o=ya(e);tu(e,r,o,t),ru(e,n);const s=o?Cu(e,t):void 0;return rn=!1,s}function Cu(e,t){const r=e.type;e.accessCache=Object.create(null),e.proxy=Po(new Proxy(e.ctx,ao));const{setup:n}=r;if(n){const o=e.setupContext=n.length>1?Sa(e):null;Te(e),Ue();const s=ee(n,e,0,[e.props,o]);if(Ke(),ye(),So(s)){if(s.then(ye,ye),t)return s.then(i=>{lo(e,i,t)}).catch(i=>{Ve(i,e,0)});e.asyncDep=s}else lo(e,s,t)}else xa(e,t)}function lo(e,t,r){nt(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:Rt(t)&&(e.setupState=Fo(t)),xa(e,r)}let lr,fo;function Iu(e){lr=e,fo=t=>{t.render._rc&&(t.withProxy=new Proxy(t.ctx,Tu))}}const Pu=()=>!lr;function xa(e,t,r){const n=e.type;if(!e.render){if(!t&&lr&&!n.render){const o=n.template;if(o){const{isCustomElement:s,compilerOptions:i}=e.appContext.config,{delimiters:a,compilerOptions:l}=n,u=At(At({isCustomElement:s,delimiters:a},i),l);n.render=lr(o,u)}}e.render=n.render||kt,fo&&fo(e)}Te(e),Ue(),Zf(e),Ke(),ye()}function Nu(e){return new Proxy(e.attrs,{get(t,r){return zt(e,\"get\",\"$attrs\"),t[r]}})}function Sa(e){const t=n=>{e.exposed=n||{}};let r;return{get attrs(){return r||(r=Nu(e))},slots:e.slots,emit:e.emit,expose:t}}function Ir(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(Fo(Po(e.exposed)),{get(t,r){if(r in t)return t[r];if(r in ar)return ar[r](e)}}))}const Du=/(?:^|[-_])(\\w)/g,Fu=e=>e.replace(Du,t=>t.toUpperCase()).replace(/[-_]/g,\"\");function fr(e){return nt(e)&&e.displayName||e.name}function ba(e,t,r=!1){let n=fr(t);if(!n&&t.__file){const o=t.__file.match(/([^/\\\\]+)\\.\\w+$/);o&&(n=o[1])}if(!n&&e&&e.parent){const o=s=>{for(const i in s)if(s[i]===t)return i};n=o(e.components||e.parent.type.components)||o(e.appContext.components)}return n?Fu(n):r?\"App\":\"Anonymous\"}function Mu(e){return nt(e)&&\"__vccOpts\"in e}const Oa=(e,t)=>Ef(e,t,rn);function Bu(){return null}function ju(){return null}function Lu(e){}function $u(e,t){return null}function Uu(){return Ta().slots}function Ku(){return Ta().attrs}function Ta(){const e=ue();return e.setupContext||(e.setupContext=Sa(e))}function Vu(e,t){const r=q(e)?e.reduce((n,o)=>(n[o]={},n),{}):e;for(const n in t){const o=r[n];o?q(o)||nt(o)?r[n]={type:o,default:t[n]}:o.default=t[n]:o===null&&(r[n]={default:t[n]})}return r}function Hu(e,t){const r={};for(const n in e)t.includes(n)||Object.defineProperty(r,n,{enumerable:!0,get:()=>e[n]});return r}function Wu(e){const t=ue();let r=e();return ye(),So(r)&&(r=r.catch(n=>{throw Te(t),n})),[r,()=>Te(t)]}function Aa(e,t,r){const n=arguments.length;return n===2?Rt(t)&&!q(t)?Oe(t)?Ot(e,null,[t]):Ot(e,t):Ot(e,null,t):(n>3?r=Array.prototype.slice.call(arguments,2):n===3&&Oe(r)&&(r=[r]),Ot(e,t,r))}const Ra=Symbol(\"\"),Yu=()=>{{const e=Sn(Ra);return e||Ci(\"Server rendering context not provided. Make sure to only call useSSRContext() conditionally in the server build.\"),e}};function wu(){}function Gu(e,t,r,n){const o=r[n];if(o&&Ca(o,e))return o;const s=t();return s.memo=e.slice(),r[n]=s}function Ca(e,t){const r=e.memo;if(r.length!=t.length)return!1;for(let n=0;n<r.length;n++)if(r[n]!==t[n])return!1;return nn>0&&ne&&ne.push(e),!0}const Ia=\"3.2.33\",zu={createComponentInstance:ma,setupComponent:Ea,renderComponentRoot:qn,setCurrentRenderingInstance:Pn,isVNode:Oe,normalizeVNode:Wt},Ju=zu,Xu=null,Zu=null,Qu=\"http://www.w3.org/2000/svg\",Ne=typeof document!=\"undefined\"?document:null,Ds=Ne&&Ne.createElement(\"template\"),ku={insert:(e,t,r)=>{t.insertBefore(e,r||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,r,n)=>{const o=t?Ne.createElementNS(Qu,e):Ne.createElement(e,r?{is:r}:void 0);return e===\"select\"&&n&&n.multiple!=null&&o.setAttribute(\"multiple\",n.multiple),o},createText:e=>Ne.createTextNode(e),createComment:e=>Ne.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ne.querySelector(e),setScopeId(e,t){e.setAttribute(t,\"\")},cloneNode(e){const t=e.cloneNode(!0);return\"_value\"in e&&(t._value=e._value),t},insertStaticContent(e,t,r,n,o,s){const i=r?r.previousSibling:t.lastChild;if(o&&(o===s||o.nextSibling))for(;t.insertBefore(o.cloneNode(!0),r),!(o===s||!(o=o.nextSibling)););else{Ds.innerHTML=n?`<svg>${e}</svg>`:e;const a=Ds.content;if(n){const l=a.firstChild;for(;l.firstChild;)a.appendChild(l.firstChild);a.removeChild(l)}t.insertBefore(a,r)}return[i?i.nextSibling:t.firstChild,r?r.previousSibling:t.lastChild]}};function qu(e,t,r){const n=e._vtc;n&&(t=(t?[t,...n]:[...n]).join(\" \")),t==null?e.removeAttribute(\"class\"):r?e.setAttribute(\"class\",t):e.className=t}function _u(e,t,r){const n=e.style,o=Tt(r);if(r&&!o){for(const s in r)uo(n,s,r[s]);if(t&&!Tt(t))for(const s in t)r[s]==null&&uo(n,s,\"\")}else{const s=n.display;o?t!==r&&(n.cssText=r):t&&e.removeAttribute(\"style\"),\"_vod\"in e&&(n.display=s)}}const Fs=/\\s*!important$/;function uo(e,t,r){if(q(r))r.forEach(n=>uo(e,t,n));else if(r==null&&(r=\"\"),t.startsWith(\"--\"))e.setProperty(t,r);else{const n=tc(e,t);Fs.test(r)?e.setProperty(te(n),r.replace(Fs,\"\"),\"important\"):e[n]=r}}const Ms=[\"Webkit\",\"Moz\",\"ms\"],Hr={};function tc(e,t){const r=Hr[t];if(r)return r;let n=Gt(t);if(n!==\"filter\"&&n in e)return Hr[t]=n;n=Bn(n);for(let o=0;o<Ms.length;o++){const s=Ms[o]+n;if(s in e)return Hr[t]=s}return t}const Bs=\"http://www.w3.org/1999/xlink\";function ec(e,t,r,n,o){if(n&&t.startsWith(\"xlink:\"))r==null?e.removeAttributeNS(Bs,t.slice(6,t.length)):e.setAttributeNS(Bs,t,r);else{const s=El(t);r==null||s&&!si(r)?e.removeAttribute(t):e.setAttribute(t,s?\"\":r)}}function nc(e,t,r,n,o,s,i){if(t===\"innerHTML\"||t===\"textContent\"){n&&i(n,o,s),e[t]=r==null?\"\":r;return}if(t===\"value\"&&e.tagName!==\"PROGRESS\"&&!e.tagName.includes(\"-\")){e._value=r;const l=r==null?\"\":r;(e.value!==l||e.tagName===\"OPTION\")&&(e.value=l),r==null&&e.removeAttribute(t);return}let a=!1;if(r===\"\"||r==null){const l=typeof e[t];l===\"boolean\"?r=si(r):r==null&&l===\"string\"?(r=\"\",a=!0):l===\"number\"&&(r=0,a=!0)}try{e[t]=r}catch(l){}a&&e.removeAttribute(t)}const[Pa,rc]=(()=>{let e=Date.now,t=!1;if(typeof window!=\"undefined\"){Date.now()>document.createEvent(\"Event\").timeStamp&&(e=()=>performance.now());const r=navigator.userAgent.match(/firefox\\/(\\d+)/i);t=!!(r&&Number(r[1])<=53)}return[e,t]})();let co=0;const oc=Promise.resolve(),sc=()=>{co=0},ic=()=>co||(oc.then(sc),co=Pa());function ie(e,t,r,n){e.addEventListener(t,r,n)}function ac(e,t,r,n){e.removeEventListener(t,r,n)}function lc(e,t,r,n,o=null){const s=e._vei||(e._vei={}),i=s[t];if(n&&i)i.value=n;else{const[a,l]=fc(t);if(n){const u=s[t]=uc(n,o);ie(e,a,u,l)}else i&&(ac(e,a,i,l),s[t]=void 0)}}const js=/(?:Once|Passive|Capture)$/;function fc(e){let t;if(js.test(e)){t={};let r;for(;r=e.match(js);)e=e.slice(0,e.length-r[0].length),t[r[0].toLowerCase()]=!0}return[te(e.slice(2)),t]}function uc(e,t){const r=n=>{const o=n.timeStamp||Pa();(rc||o>=r.attached-1)&&wt(cc(n,r.value),t,5,[n])};return r.value=e,r.attached=ic(),r}function cc(e,t){if(q(t)){const r=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{r.call(e),e._stopped=!0},t.map(n=>o=>!o._stopped&&n&&n(o))}else return t}const Ls=/^on[a-z]/,dc=(e,t,r,n,o=!1,s,i,a,l)=>{t===\"class\"?qu(e,n,o):t===\"style\"?_u(e,r,n):Mn(t)?yo(t)||lc(e,t,r,n,i):(t[0]===\".\"?(t=t.slice(1),!0):t[0]===\"^\"?(t=t.slice(1),!1):vc(e,t,n,o))?nc(e,t,n,s,i,a,l):(t===\"true-value\"?e._trueValue=n:t===\"false-value\"&&(e._falseValue=n),ec(e,t,n,o))};function vc(e,t,r,n){return n?!!(t===\"innerHTML\"||t===\"textContent\"||t in e&&Ls.test(t)&&nt(r)):t===\"spellcheck\"||t===\"draggable\"||t===\"translate\"||t===\"form\"||t===\"list\"&&e.tagName===\"INPUT\"||t===\"type\"&&e.tagName===\"TEXTAREA\"||Ls.test(t)&&Tt(r)?!1:t in e}function Na(e,t){const r=Yo(e);class n extends Pr{constructor(s){super(r,s,t)}}return n.def=r,n}const hc=e=>Na(e,Ya),pc=typeof HTMLElement!=\"undefined\"?HTMLElement:class{};class Pr extends pc{constructor(t,r={},n){super(),this._def=t,this._props=r,this._instance=null,this._connected=!1,this._resolved=!1,this._numberProps=null,this.shadowRoot&&n?n(this._createVNode(),this.shadowRoot):this.attachShadow({mode:\"open\"})}connectedCallback(){this._connected=!0,this._instance||this._resolveDef()}disconnectedCallback(){this._connected=!1,Bo(()=>{this._connected||(ho(null,this.shadowRoot),this._instance=null)})}_resolveDef(){if(this._resolved)return;this._resolved=!0;for(let n=0;n<this.attributes.length;n++)this._setAttr(this.attributes[n].name);new MutationObserver(n=>{for(const o of n)this._setAttr(o.attributeName)}).observe(this,{attributes:!0});const t=n=>{const{props:o,styles:s}=n,i=!q(o),a=o?i?Object.keys(o):o:[];let l;if(i)for(const u in this._props){const f=o[u];(f===Number||f&&f.type===Number)&&(this._props[u]=xe(this._props[u]),(l||(l=Object.create(null)))[u]=!0)}this._numberProps=l;for(const u of Object.keys(this))u[0]!==\"_\"&&this._setProp(u,this[u],!0,!1);for(const u of a.map(Gt))Object.defineProperty(this,u,{get(){return this._getProp(u)},set(f){this._setProp(u,f)}});this._applyStyles(s),this._update()},r=this._def.__asyncLoader;r?r().then(t):t(this._def)}_setAttr(t){let r=this.getAttribute(t);this._numberProps&&this._numberProps[t]&&(r=xe(r)),this._setProp(Gt(t),r,!1)}_getProp(t){return this._props[t]}_setProp(t,r,n=!0,o=!0){r!==this._props[t]&&(this._props[t]=r,o&&this._instance&&this._update(),n&&(r===!0?this.setAttribute(te(t),\"\"):typeof r==\"string\"||typeof r==\"number\"?this.setAttribute(te(t),r+\"\"):r||this.removeAttribute(te(t))))}_update(){ho(this._createVNode(),this.shadowRoot)}_createVNode(){const t=Ot(this._def,At({},this._props));return this._instance||(t.ce=r=>{this._instance=r,r.isCE=!0,r.emit=(o,...s)=>{this.dispatchEvent(new CustomEvent(o,{detail:s}))};let n=this;for(;n=n&&(n.parentNode||n.host);)if(n instanceof Pr){r.parent=n._instance;break}}),t}_applyStyles(t){t&&t.forEach(r=>{const n=document.createElement(\"style\");n.textContent=r,this.shadowRoot.appendChild(n)})}}function gc(e=\"$style\"){{const t=ue();if(!t)return bt;const r=t.type.__cssModules;if(!r)return bt;const n=r[e];return n||bt}}function mc(e){const t=ue();if(!t)return;const r=()=>vo(t.subTree,e(t.proxy));Ki(r),He(()=>{const n=new MutationObserver(r);n.observe(t.subTree.el.parentNode,{childList:!0}),Rr(()=>n.disconnect())})}function vo(e,t){if(e.shapeFlag&128){const r=e.suspense;e=r.activeBranch,r.pendingBranch&&!r.isHydrating&&r.effects.push(()=>{vo(r.activeBranch,t)})}for(;e.component;)e=e.component.subTree;if(e.shapeFlag&1&&e.el)$s(e.el,t);else if(e.type===Ft)e.children.forEach(r=>vo(r,t));else if(e.type===je){let{el:r,anchor:n}=e;for(;r&&($s(r,t),r!==n);)r=r.nextSibling}}function $s(e,t){if(e.nodeType===1){const r=e.style;for(const n in t)r.setProperty(`--${n}`,t[n])}}const ve=\"transition\",un=\"animation\",Qo=(e,{slots:t})=>Aa(Wo,Fa(e),t);Qo.displayName=\"Transition\";const Da={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String},yc=Qo.props=At({},Wo.props,Da),Ce=(e,t=[])=>{q(e)?e.forEach(r=>r(...t)):e&&e(...t)},Us=e=>e?q(e)?e.some(t=>t.length>1):e.length>1:!1;function Fa(e){const t={};for(const P in e)P in Da||(t[P]=e[P]);if(e.css===!1)return t;const{name:r=\"v\",type:n,duration:o,enterFromClass:s=`${r}-enter-from`,enterActiveClass:i=`${r}-enter-active`,enterToClass:a=`${r}-enter-to`,appearFromClass:l=s,appearActiveClass:u=i,appearToClass:f=a,leaveFromClass:c=`${r}-leave-from`,leaveActiveClass:d=`${r}-leave-active`,leaveToClass:v=`${r}-leave-to`}=e,g=Ec(o),y=g&&g[0],m=g&&g[1],{onBeforeEnter:p,onEnter:h,onEnterCancelled:x,onLeave:A,onLeaveCancelled:I,onBeforeAppear:b=p,onAppear:O=h,onAppearCancelled:S=x}=t,C=(P,F,H)=>{Pe(P,F?f:a),Pe(P,F?u:i),H&&H()},T=(P,F)=>{Pe(P,v),Pe(P,d),F&&F()},N=P=>(F,H)=>{const w=P?O:h,B=()=>C(F,P,H);Ce(w,[F,B]),Ks(()=>{Pe(F,P?l:s),oe(F,P?f:a),Us(w)||Vs(F,n,y,B)})};return At(t,{onBeforeEnter(P){Ce(p,[P]),oe(P,s),oe(P,i)},onBeforeAppear(P){Ce(b,[P]),oe(P,l),oe(P,u)},onEnter:N(!1),onAppear:N(!0),onLeave(P,F){const H=()=>T(P,F);oe(P,c),Ba(),oe(P,d),Ks(()=>{Pe(P,c),oe(P,v),Us(A)||Vs(P,n,m,H)}),Ce(A,[P,H])},onEnterCancelled(P){C(P,!1),Ce(x,[P])},onAppearCancelled(P){C(P,!0),Ce(S,[P])},onLeaveCancelled(P){T(P),Ce(I,[P])}})}function Ec(e){if(e==null)return null;if(Rt(e))return[Wr(e.enter),Wr(e.leave)];{const t=Wr(e);return[t,t]}}function Wr(e){return xe(e)}function oe(e,t){t.split(/\\s+/).forEach(r=>r&&e.classList.add(r)),(e._vtc||(e._vtc=new Set)).add(t)}function Pe(e,t){t.split(/\\s+/).forEach(n=>n&&e.classList.remove(n));const{_vtc:r}=e;r&&(r.delete(t),r.size||(e._vtc=void 0))}function Ks(e){requestAnimationFrame(()=>{requestAnimationFrame(e)})}let xc=0;function Vs(e,t,r,n){const o=e._endId=++xc,s=()=>{o===e._endId&&n()};if(r)return setTimeout(s,r);const{type:i,timeout:a,propCount:l}=Ma(e,t);if(!i)return n();const u=i+\"end\";let f=0;const c=()=>{e.removeEventListener(u,d),s()},d=v=>{v.target===e&&++f>=l&&c()};setTimeout(()=>{f<l&&c()},a+1),e.addEventListener(u,d)}function Ma(e,t){const r=window.getComputedStyle(e),n=g=>(r[g]||\"\").split(\", \"),o=n(ve+\"Delay\"),s=n(ve+\"Duration\"),i=Hs(o,s),a=n(un+\"Delay\"),l=n(un+\"Duration\"),u=Hs(a,l);let f=null,c=0,d=0;t===ve?i>0&&(f=ve,c=i,d=s.length):t===un?u>0&&(f=un,c=u,d=l.length):(c=Math.max(i,u),f=c>0?i>u?ve:un:null,d=f?f===ve?s.length:l.length:0);const v=f===ve&&/\\b(transform|all)(,|$)/.test(r[ve+\"Property\"]);return{type:f,timeout:c,propCount:d,hasTransform:v}}function Hs(e,t){for(;e.length<t.length;)e=e.concat(e);return Math.max(...t.map((r,n)=>Ws(r)+Ws(e[n])))}function Ws(e){return Number(e.slice(0,-1).replace(\",\",\".\"))*1e3}function Ba(){return document.body.offsetHeight}const ja=new WeakMap,La=new WeakMap,Sc={name:\"TransitionGroup\",props:At({},yc,{tag:String,moveClass:String}),setup(e,{slots:t}){const r=ue(),n=Ho();let o,s;return Ar(()=>{if(!o.length)return;const i=e.moveClass||`${e.name||\"v\"}-move`;if(!Rc(o[0].el,r.vnode.el,i))return;o.forEach(Oc),o.forEach(Tc);const a=o.filter(Ac);Ba(),a.forEach(l=>{const u=l.el,f=u.style;oe(u,i),f.transform=f.webkitTransform=f.transitionDuration=\"\";const c=u._moveCb=d=>{d&&d.target!==u||(!d||/transform$/.test(d.propertyName))&&(u.removeEventListener(\"transitionend\",c),u._moveCb=null,Pe(u,i))};u.addEventListener(\"transitionend\",c)})}),()=>{const i=pt(e),a=Fa(i);let l=i.tag||Ft;o=s,s=t.default?Or(t.default()):[];for(let u=0;u<s.length;u++){const f=s[u];f.key!=null&&Le(f,_e(f,a,n,r))}if(o)for(let u=0;u<o.length;u++){const f=o[u];Le(f,_e(f,a,n,r)),ja.set(f,f.el.getBoundingClientRect())}return Ot(l,null,s)}}},bc=Sc;function Oc(e){const t=e.el;t._moveCb&&t._moveCb(),t._enterCb&&t._enterCb()}function Tc(e){La.set(e,e.el.getBoundingClientRect())}function Ac(e){const t=ja.get(e),r=La.get(e),n=t.left-r.left,o=t.top-r.top;if(n||o){const s=e.el.style;return s.transform=s.webkitTransform=`translate(${n}px,${o}px)`,s.transitionDuration=\"0s\",e}}function Rc(e,t,r){const n=e.cloneNode();e._vtc&&e._vtc.forEach(i=>{i.split(/\\s+/).forEach(a=>a&&n.classList.remove(a))}),r.split(/\\s+/).forEach(i=>i&&n.classList.add(i)),n.style.display=\"none\";const o=t.nodeType===1?t:t.parentNode;o.appendChild(n);const{hasTransform:s}=Ma(n);return o.removeChild(n),s}const Ae=e=>{const t=e.props[\"onUpdate:modelValue\"];return q(t)?r=>Qe(t,r):t};function Cc(e){e.target.composing=!0}function Ys(e){const t=e.target;t.composing&&(t.composing=!1,Ic(t,\"input\"))}function Ic(e,t){const r=document.createEvent(\"HTMLEvents\");r.initEvent(t,!0,!0),e.dispatchEvent(r)}const ur={created(e,{modifiers:{lazy:t,trim:r,number:n}},o){e._assign=Ae(o);const s=n||o.props&&o.props.type===\"number\";ie(e,t?\"change\":\"input\",i=>{if(i.target.composing)return;let a=e.value;r?a=a.trim():s&&(a=xe(a)),e._assign(a)}),r&&ie(e,\"change\",()=>{e.value=e.value.trim()}),t||(ie(e,\"compositionstart\",Cc),ie(e,\"compositionend\",Ys),ie(e,\"change\",Ys))},mounted(e,{value:t}){e.value=t==null?\"\":t},beforeUpdate(e,{value:t,modifiers:{lazy:r,trim:n,number:o}},s){if(e._assign=Ae(s),e.composing||document.activeElement===e&&(r||n&&e.value.trim()===t||(o||e.type===\"number\")&&xe(e.value)===t))return;const i=t==null?\"\":t;e.value!==i&&(e.value=i)}},ko={deep:!0,created(e,t,r){e._assign=Ae(r),ie(e,\"change\",()=>{const n=e._modelValue,o=on(e),s=e.checked,i=e._assign;if(q(n)){const a=vr(n,o),l=a!==-1;if(s&&!l)i(n.concat(o));else if(!s&&l){const u=[...n];u.splice(a,1),i(u)}}else if($e(n)){const a=new Set(n);s?a.add(o):a.delete(o),i(a)}else i(Ua(e,s))})},mounted:ws,beforeUpdate(e,t,r){e._assign=Ae(r),ws(e,t,r)}};function ws(e,{value:t,oldValue:r},n){e._modelValue=t,q(t)?e.checked=vr(t,n.props.value)>-1:$e(t)?e.checked=t.has(n.props.value):t!==r&&(e.checked=Ee(t,Ua(e,!0)))}const qo={created(e,{value:t},r){e.checked=Ee(t,r.props.value),e._assign=Ae(r),ie(e,\"change\",()=>{e._assign(on(e))})},beforeUpdate(e,{value:t,oldValue:r},n){e._assign=Ae(n),t!==r&&(e.checked=Ee(t,n.props.value))}},$a={deep:!0,created(e,{value:t,modifiers:{number:r}},n){const o=$e(t);ie(e,\"change\",()=>{const s=Array.prototype.filter.call(e.options,i=>i.selected).map(i=>r?xe(on(i)):on(i));e._assign(e.multiple?o?new Set(s):s:s[0])}),e._assign=Ae(n)},mounted(e,{value:t}){Gs(e,t)},beforeUpdate(e,t,r){e._assign=Ae(r)},updated(e,{value:t}){Gs(e,t)}};function Gs(e,t){const r=e.multiple;if(!(r&&!q(t)&&!$e(t))){for(let n=0,o=e.options.length;n<o;n++){const s=e.options[n],i=on(s);if(r)q(t)?s.selected=vr(t,i)>-1:s.selected=t.has(i);else if(Ee(on(s),t)){e.selectedIndex!==n&&(e.selectedIndex=n);return}}!r&&e.selectedIndex!==-1&&(e.selectedIndex=-1)}}function on(e){return\"_value\"in e?e._value:e.value}function Ua(e,t){const r=t?\"_trueValue\":\"_falseValue\";return r in e?e[r]:t}const Pc={created(e,t,r){Zn(e,t,r,null,\"created\")},mounted(e,t,r){Zn(e,t,r,null,\"mounted\")},beforeUpdate(e,t,r,n){Zn(e,t,r,n,\"beforeUpdate\")},updated(e,t,r,n){Zn(e,t,r,n,\"updated\")}};function Zn(e,t,r,n,o){let s;switch(e.tagName){case\"SELECT\":s=$a;break;case\"TEXTAREA\":s=ur;break;default:switch(r.props&&r.props.type){case\"checkbox\":s=ko;break;case\"radio\":s=qo;break;default:s=ur}}const i=s[o];i&&i(e,t,r,n)}function Nc(){ur.getSSRProps=({value:e})=>({value:e}),qo.getSSRProps=({value:e},t)=>{if(t.props&&Ee(t.props.value,e))return{checked:!0}},ko.getSSRProps=({value:e},t)=>{if(q(e)){if(t.props&&vr(e,t.props.value)>-1)return{checked:!0}}else if($e(e)){if(t.props&&e.has(t.props.value))return{checked:!0}}else if(e)return{checked:!0}}}const Dc=[\"ctrl\",\"shift\",\"alt\",\"meta\"],Fc={stop:e=>e.stopPropagation(),prevent:e=>e.preventDefault(),self:e=>e.target!==e.currentTarget,ctrl:e=>!e.ctrlKey,shift:e=>!e.shiftKey,alt:e=>!e.altKey,meta:e=>!e.metaKey,left:e=>\"button\"in e&&e.button!==0,middle:e=>\"button\"in e&&e.button!==1,right:e=>\"button\"in e&&e.button!==2,exact:(e,t)=>Dc.some(r=>e[`${r}Key`]&&!t.includes(r))},Mc=(e,t)=>(r,...n)=>{for(let o=0;o<t.length;o++){const s=Fc[t[o]];if(s&&s(r,t))return}return e(r,...n)},Bc={esc:\"escape\",space:\" \",up:\"arrow-up\",left:\"arrow-left\",right:\"arrow-right\",down:\"arrow-down\",delete:\"backspace\"},jc=(e,t)=>r=>{if(!(\"key\"in r))return;const n=te(r.key);if(t.some(o=>o===n||Bc[o]===n))return e(r)},Ka={beforeMount(e,{value:t},{transition:r}){e._vod=e.style.display===\"none\"?\"\":e.style.display,r&&t?r.beforeEnter(e):cn(e,t)},mounted(e,{value:t},{transition:r}){r&&t&&r.enter(e)},updated(e,{value:t,oldValue:r},{transition:n}){!t!=!r&&(n?t?(n.beforeEnter(e),cn(e,!0),n.enter(e)):n.leave(e,()=>{cn(e,!1)}):cn(e,t))},beforeUnmount(e,{value:t}){cn(e,t)}};function cn(e,t){e.style.display=t?e._vod:\"none\"}function Lc(){Ka.getSSRProps=({value:e})=>{if(!e)return{style:{display:\"none\"}}}}const Va=At({patchProp:dc},ku);let An,zs=!1;function Ha(){return An||(An=sa(Va))}function Wa(){return An=zs?An:ia(Va),zs=!0,An}const ho=(...e)=>{Ha().render(...e)},Ya=(...e)=>{Wa().hydrate(...e)},_o=(...e)=>{const t=Ha().createApp(...e),{mount:r}=t;return t.mount=n=>{const o=wa(n);if(!o)return;const s=t._component;!nt(s)&&!s.render&&!s.template&&(s.template=o.innerHTML),o.innerHTML=\"\";const i=r(o,!1,o instanceof SVGElement);return o instanceof Element&&(o.removeAttribute(\"v-cloak\"),o.setAttribute(\"data-v-app\",\"\")),i},t},$c=(...e)=>{const t=Wa().createApp(...e),{mount:r}=t;return t.mount=n=>{const o=wa(n);if(o)return r(o,!0,o instanceof SVGElement)},t};function wa(e){return Tt(e)?document.querySelector(e):e}let Js=!1;const Uc=()=>{Js||(Js=!0,Nc(),Lc())},Kc=()=>{};var Vc=Object.freeze(Object.defineProperty({__proto__:null,compile:Kc,EffectScope:Oo,ReactiveEffect:jn,customRef:gf,effect:$l,effectScope:Fl,getCurrentScope:Ml,isProxy:Io,isReactive:Me,isReadonly:qe,isRef:Ct,isShallow:Co,markRaw:Po,onScopeDispose:Bl,proxyRefs:Fo,reactive:Ln,readonly:Ro,ref:Be,shallowReactive:bi,shallowReadonly:uf,shallowRef:cf,stop:Ul,toRaw:pt,toRef:Ri,toRefs:Ai,triggerRef:vf,unref:Ti,camelize:Gt,capitalize:Bn,normalizeClass:Fn,normalizeProps:Ol,normalizeStyle:Dn,toDisplayString:kn,toHandlerKey:mn,BaseTransition:Wo,Comment:Lt,Fragment:Ft,KeepAlive:Jf,Static:je,Suspense:Lf,Teleport:vu,Text:en,callWithAsyncErrorHandling:wt,callWithErrorHandling:ee,cloneVNode:le,compatUtils:Zu,computed:Oa,createBlock:Vn,createCommentVNode:ha,createElementBlock:so,createElementVNode:Zt,createHydrationRenderer:ia,createPropsRestProxy:Hu,createRenderer:sa,createSlots:Su,createStaticVNode:Eu,createTextVNode:Xo,createVNode:Ot,defineAsyncComponent:Gf,defineComponent:Yo,defineEmits:ju,defineExpose:Lu,defineProps:Bu,get devtools(){return Je},getCurrentInstance:ue,getTransitionRawChildren:Or,guardReactiveProps:va,h:Aa,handleError:Ve,initCustomFormatter:wu,inject:Sn,isMemoSame:Ca,isRuntimeOnly:Pu,isVNode:Oe,mergeDefaults:Vu,mergeProps:pa,nextTick:Bo,onActivated:Wi,onBeforeMount:Gi,onBeforeUnmount:Kn,onBeforeUpdate:zi,onDeactivated:Yi,onErrorCaptured:Qi,onMounted:He,onRenderTracked:Zi,onRenderTriggered:Xi,onServerPrefetch:Ji,onUnmounted:Rr,onUpdated:Ar,openBlock:be,popScopeId:Li,provide:Ui,pushScopeId:ji,queuePostFlushCb:Lo,registerRuntimeCompiler:Iu,renderList:xu,renderSlot:bu,resolveComponent:la,resolveDirective:gu,resolveDynamicComponent:pu,resolveFilter:Xu,resolveTransitionHooks:_e,setBlockTracking:oo,setDevtoolsHook:Mi,setTransitionHooks:Le,ssrContextKey:Ra,ssrUtils:Ju,toHandlers:Ou,transformVNodeArgs:mu,useAttrs:Ku,useSSRContext:Yu,useSlots:Uu,useTransitionState:Ho,version:Ia,warn:Ci,watch:bn,watchEffect:Hf,watchPostEffect:Ki,watchSyncEffect:Wf,withAsyncContext:Wu,withCtx:Uo,withDefaults:$u,withDirectives:su,withMemo:Gu,withScopeId:Pf,Transition:Qo,TransitionGroup:bc,VueElement:Pr,createApp:_o,createSSRApp:$c,defineCustomElement:Na,defineSSRCustomElement:hc,hydrate:Ya,initDirectivesForSSR:Uc,render:ho,useCssModule:gc,useCssVars:mc,vModelCheckbox:ko,vModelDynamic:Pc,vModelRadio:qo,vModelSelect:$a,vModelText:ur,vShow:Ka,withKeys:jc,withModifiers:Mc},Symbol.toStringTag,{value:\"Module\"}));function Hc(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,\"default\")?e.default:e}function Wc(e){if(e.__esModule)return e;var t=Object.defineProperty({},\"__esModule\",{value:!0});return Object.keys(e).forEach(function(r){var n=Object.getOwnPropertyDescriptor(e,r);Object.defineProperty(t,r,n.get?n:{enumerable:!0,get:function(){return e[r]}})}),t}var ts={exports:{}},Ga=function(t,r){return function(){for(var o=new Array(arguments.length),s=0;s<o.length;s++)o[s]=arguments[s];return t.apply(r,o)}},Yc=Ga,es=Object.prototype.toString,ns=function(e){return function(t){var r=es.call(t);return e[r]||(e[r]=r.slice(8,-1).toLowerCase())}}(Object.create(null));function We(e){return e=e.toLowerCase(),function(r){return ns(r)===e}}function rs(e){return Array.isArray(e)}function cr(e){return typeof e==\"undefined\"}function wc(e){return e!==null&&!cr(e)&&e.constructor!==null&&!cr(e.constructor)&&typeof e.constructor.isBuffer==\"function\"&&e.constructor.isBuffer(e)}var za=We(\"ArrayBuffer\");function Gc(e){var t;return typeof ArrayBuffer!=\"undefined\"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&za(e.buffer),t}function zc(e){return typeof e==\"string\"}function Jc(e){return typeof e==\"number\"}function Ja(e){return e!==null&&typeof e==\"object\"}function tr(e){if(ns(e)!==\"object\")return!1;var t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}var Xc=We(\"Date\"),Zc=We(\"File\"),Qc=We(\"Blob\"),kc=We(\"FileList\");function os(e){return es.call(e)===\"[object Function]\"}function qc(e){return Ja(e)&&os(e.pipe)}function _c(e){var t=\"[object FormData]\";return e&&(typeof FormData==\"function\"&&e instanceof FormData||es.call(e)===t||os(e.toString)&&e.toString()===t)}var td=We(\"URLSearchParams\");function ed(e){return e.trim?e.trim():e.replace(/^\\s+|\\s+$/g,\"\")}function nd(){return typeof navigator!=\"undefined\"&&(navigator.product===\"ReactNative\"||navigator.product===\"NativeScript\"||navigator.product===\"NS\")?!1:typeof window!=\"undefined\"&&typeof document!=\"undefined\"}function ss(e,t){if(!(e===null||typeof e==\"undefined\"))if(typeof e!=\"object\"&&(e=[e]),rs(e))for(var r=0,n=e.length;r<n;r++)t.call(null,e[r],r,e);else for(var o in e)Object.prototype.hasOwnProperty.call(e,o)&&t.call(null,e[o],o,e)}function po(){var e={};function t(o,s){tr(e[s])&&tr(o)?e[s]=po(e[s],o):tr(o)?e[s]=po({},o):rs(o)?e[s]=o.slice():e[s]=o}for(var r=0,n=arguments.length;r<n;r++)ss(arguments[r],t);return e}function rd(e,t,r){return ss(t,function(o,s){r&&typeof o==\"function\"?e[s]=Yc(o,r):e[s]=o}),e}function od(e){return e.charCodeAt(0)===65279&&(e=e.slice(1)),e}function sd(e,t,r,n){e.prototype=Object.create(t.prototype,n),e.prototype.constructor=e,r&&Object.assign(e.prototype,r)}function id(e,t,r){var n,o,s,i={};t=t||{};do{for(n=Object.getOwnPropertyNames(e),o=n.length;o-- >0;)s=n[o],i[s]||(t[s]=e[s],i[s]=!0);e=Object.getPrototypeOf(e)}while(e&&(!r||r(e,t))&&e!==Object.prototype);return t}function ad(e,t,r){e=String(e),(r===void 0||r>e.length)&&(r=e.length),r-=t.length;var n=e.indexOf(t,r);return n!==-1&&n===r}function ld(e){if(!e)return null;var t=e.length;if(cr(t))return null;for(var r=new Array(t);t-- >0;)r[t]=e[t];return r}var fd=function(e){return function(t){return e&&t instanceof e}}(typeof Uint8Array!=\"undefined\"&&Object.getPrototypeOf(Uint8Array)),Mt={isArray:rs,isArrayBuffer:za,isBuffer:wc,isFormData:_c,isArrayBufferView:Gc,isString:zc,isNumber:Jc,isObject:Ja,isPlainObject:tr,isUndefined:cr,isDate:Xc,isFile:Zc,isBlob:Qc,isFunction:os,isStream:qc,isURLSearchParams:td,isStandardBrowserEnv:nd,forEach:ss,merge:po,extend:rd,trim:ed,stripBOM:od,inherits:sd,toFlatObject:id,kindOf:ns,kindOfTest:We,endsWith:ad,toArray:ld,isTypedArray:fd,isFileList:kc},Ye=Mt;function Xs(e){return encodeURIComponent(e).replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%20/g,\"+\").replace(/%5B/gi,\"[\").replace(/%5D/gi,\"]\")}var Xa=function(t,r,n){if(!r)return t;var o;if(n)o=n(r);else if(Ye.isURLSearchParams(r))o=r.toString();else{var s=[];Ye.forEach(r,function(l,u){l===null||typeof l==\"undefined\"||(Ye.isArray(l)?u=u+\"[]\":l=[l],Ye.forEach(l,function(c){Ye.isDate(c)?c=c.toISOString():Ye.isObject(c)&&(c=JSON.stringify(c)),s.push(Xs(u)+\"=\"+Xs(c))}))}),o=s.join(\"&\")}if(o){var i=t.indexOf(\"#\");i!==-1&&(t=t.slice(0,i)),t+=(t.indexOf(\"?\")===-1?\"?\":\"&\")+o}return t},ud=Mt;function Nr(){this.handlers=[]}Nr.prototype.use=function(t,r,n){return this.handlers.push({fulfilled:t,rejected:r,synchronous:n?n.synchronous:!1,runWhen:n?n.runWhen:null}),this.handlers.length-1};Nr.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)};Nr.prototype.forEach=function(t){ud.forEach(this.handlers,function(n){n!==null&&t(n)})};var cd=Nr,dd=Mt,vd=function(t,r){dd.forEach(t,function(o,s){s!==r&&s.toUpperCase()===r.toUpperCase()&&(t[r]=o,delete t[s])})},Za=Mt;function sn(e,t,r,n,o){Error.call(this),this.message=e,this.name=\"AxiosError\",t&&(this.code=t),r&&(this.config=r),n&&(this.request=n),o&&(this.response=o)}Za.inherits(sn,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var Qa=sn.prototype,ka={};[\"ERR_BAD_OPTION_VALUE\",\"ERR_BAD_OPTION\",\"ECONNABORTED\",\"ETIMEDOUT\",\"ERR_NETWORK\",\"ERR_FR_TOO_MANY_REDIRECTS\",\"ERR_DEPRECATED\",\"ERR_BAD_RESPONSE\",\"ERR_BAD_REQUEST\",\"ERR_CANCELED\"].forEach(function(e){ka[e]={value:e}});Object.defineProperties(sn,ka);Object.defineProperty(Qa,\"isAxiosError\",{value:!0});sn.from=function(e,t,r,n,o,s){var i=Object.create(Qa);return Za.toFlatObject(e,i,function(l){return l!==Error.prototype}),sn.call(i,e.message,t,r,n,o),i.name=e.name,s&&Object.assign(i,s),i};var fn=sn,qa={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},Xt=Mt;function hd(e,t){t=t||new FormData;var r=[];function n(s){return s===null?\"\":Xt.isDate(s)?s.toISOString():Xt.isArrayBuffer(s)||Xt.isTypedArray(s)?typeof Blob==\"function\"?new Blob([s]):Buffer.from(s):s}function o(s,i){if(Xt.isPlainObject(s)||Xt.isArray(s)){if(r.indexOf(s)!==-1)throw Error(\"Circular reference detected in \"+i);r.push(s),Xt.forEach(s,function(l,u){if(!Xt.isUndefined(l)){var f=i?i+\".\"+u:u,c;if(l&&!i&&typeof l==\"object\"){if(Xt.endsWith(u,\"{}\"))l=JSON.stringify(l);else if(Xt.endsWith(u,\"[]\")&&(c=Xt.toArray(l))){c.forEach(function(d){!Xt.isUndefined(d)&&t.append(f,n(d))});return}}o(l,f)}}),r.pop()}else t.append(i,n(s))}return o(e),t}var _a=hd,Yr=fn,pd=function(t,r,n){var o=n.config.validateStatus;!n.status||!o||o(n.status)?t(n):r(new Yr(\"Request failed with status code \"+n.status,[Yr.ERR_BAD_REQUEST,Yr.ERR_BAD_RESPONSE][Math.floor(n.status/100)-4],n.config,n.request,n))},Qn=Mt,gd=Qn.isStandardBrowserEnv()?function(){return{write:function(r,n,o,s,i,a){var l=[];l.push(r+\"=\"+encodeURIComponent(n)),Qn.isNumber(o)&&l.push(\"expires=\"+new Date(o).toGMTString()),Qn.isString(s)&&l.push(\"path=\"+s),Qn.isString(i)&&l.push(\"domain=\"+i),a===!0&&l.push(\"secure\"),document.cookie=l.join(\"; \")},read:function(r){var n=document.cookie.match(new RegExp(\"(^|;\\\\s*)(\"+r+\")=([^;]*)\"));return n?decodeURIComponent(n[3]):null},remove:function(r){this.write(r,\"\",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}(),md=function(t){return/^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(t)},yd=function(t,r){return r?t.replace(/\\/+$/,\"\")+\"/\"+r.replace(/^\\/+/,\"\"):t},Ed=md,xd=yd,tl=function(t,r){return t&&!Ed(r)?xd(t,r):r},wr=Mt,Sd=[\"age\",\"authorization\",\"content-length\",\"content-type\",\"etag\",\"expires\",\"from\",\"host\",\"if-modified-since\",\"if-unmodified-since\",\"last-modified\",\"location\",\"max-forwards\",\"proxy-authorization\",\"referer\",\"retry-after\",\"user-agent\"],bd=function(t){var r={},n,o,s;return t&&wr.forEach(t.split(`\n`),function(a){if(s=a.indexOf(\":\"),n=wr.trim(a.substr(0,s)).toLowerCase(),o=wr.trim(a.substr(s+1)),n){if(r[n]&&Sd.indexOf(n)>=0)return;n===\"set-cookie\"?r[n]=(r[n]?r[n]:[]).concat([o]):r[n]=r[n]?r[n]+\", \"+o:o}}),r},Zs=Mt,Od=Zs.isStandardBrowserEnv()?function(){var t=/(msie|trident)/i.test(navigator.userAgent),r=document.createElement(\"a\"),n;function o(s){var i=s;return t&&(r.setAttribute(\"href\",i),i=r.href),r.setAttribute(\"href\",i),{href:r.href,protocol:r.protocol?r.protocol.replace(/:$/,\"\"):\"\",host:r.host,search:r.search?r.search.replace(/^\\?/,\"\"):\"\",hash:r.hash?r.hash.replace(/^#/,\"\"):\"\",hostname:r.hostname,port:r.port,pathname:r.pathname.charAt(0)===\"/\"?r.pathname:\"/\"+r.pathname}}return n=o(window.location.href),function(i){var a=Zs.isString(i)?o(i):i;return a.protocol===n.protocol&&a.host===n.host}}():function(){return function(){return!0}}(),go=fn,Td=Mt;function el(e){go.call(this,e==null?\"canceled\":e,go.ERR_CANCELED),this.name=\"CanceledError\"}Td.inherits(el,go,{__CANCEL__:!0});var Dr=el,Ad=function(t){var r=/^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(t);return r&&r[1]||\"\"},dn=Mt,Rd=pd,Cd=gd,Id=Xa,Pd=tl,Nd=bd,Dd=Od,Fd=qa,re=fn,Md=Dr,Bd=Ad,Qs=function(t){return new Promise(function(n,o){var s=t.data,i=t.headers,a=t.responseType,l;function u(){t.cancelToken&&t.cancelToken.unsubscribe(l),t.signal&&t.signal.removeEventListener(\"abort\",l)}dn.isFormData(s)&&dn.isStandardBrowserEnv()&&delete i[\"Content-Type\"];var f=new XMLHttpRequest;if(t.auth){var c=t.auth.username||\"\",d=t.auth.password?unescape(encodeURIComponent(t.auth.password)):\"\";i.Authorization=\"Basic \"+btoa(c+\":\"+d)}var v=Pd(t.baseURL,t.url);f.open(t.method.toUpperCase(),Id(v,t.params,t.paramsSerializer),!0),f.timeout=t.timeout;function g(){if(!!f){var p=\"getAllResponseHeaders\"in f?Nd(f.getAllResponseHeaders()):null,h=!a||a===\"text\"||a===\"json\"?f.responseText:f.response,x={data:h,status:f.status,statusText:f.statusText,headers:p,config:t,request:f};Rd(function(I){n(I),u()},function(I){o(I),u()},x),f=null}}if(\"onloadend\"in f?f.onloadend=g:f.onreadystatechange=function(){!f||f.readyState!==4||f.status===0&&!(f.responseURL&&f.responseURL.indexOf(\"file:\")===0)||setTimeout(g)},f.onabort=function(){!f||(o(new re(\"Request aborted\",re.ECONNABORTED,t,f)),f=null)},f.onerror=function(){o(new re(\"Network Error\",re.ERR_NETWORK,t,f,f)),f=null},f.ontimeout=function(){var h=t.timeout?\"timeout of \"+t.timeout+\"ms exceeded\":\"timeout exceeded\",x=t.transitional||Fd;t.timeoutErrorMessage&&(h=t.timeoutErrorMessage),o(new re(h,x.clarifyTimeoutError?re.ETIMEDOUT:re.ECONNABORTED,t,f)),f=null},dn.isStandardBrowserEnv()){var y=(t.withCredentials||Dd(v))&&t.xsrfCookieName?Cd.read(t.xsrfCookieName):void 0;y&&(i[t.xsrfHeaderName]=y)}\"setRequestHeader\"in f&&dn.forEach(i,function(h,x){typeof s==\"undefined\"&&x.toLowerCase()===\"content-type\"?delete i[x]:f.setRequestHeader(x,h)}),dn.isUndefined(t.withCredentials)||(f.withCredentials=!!t.withCredentials),a&&a!==\"json\"&&(f.responseType=t.responseType),typeof t.onDownloadProgress==\"function\"&&f.addEventListener(\"progress\",t.onDownloadProgress),typeof t.onUploadProgress==\"function\"&&f.upload&&f.upload.addEventListener(\"progress\",t.onUploadProgress),(t.cancelToken||t.signal)&&(l=function(p){!f||(o(!p||p&&p.type?new Md:p),f.abort(),f=null)},t.cancelToken&&t.cancelToken.subscribe(l),t.signal&&(t.signal.aborted?l():t.signal.addEventListener(\"abort\",l))),s||(s=null);var m=Bd(v);if(m&&[\"http\",\"https\",\"file\"].indexOf(m)===-1){o(new re(\"Unsupported protocol \"+m+\":\",re.ERR_BAD_REQUEST,t));return}f.send(s)})},jd=null,Nt=Mt,ks=vd,qs=fn,Ld=qa,$d=_a,Ud={\"Content-Type\":\"application/x-www-form-urlencoded\"};function _s(e,t){!Nt.isUndefined(e)&&Nt.isUndefined(e[\"Content-Type\"])&&(e[\"Content-Type\"]=t)}function Kd(){var e;return(typeof XMLHttpRequest!=\"undefined\"||typeof process!=\"undefined\"&&Object.prototype.toString.call(process)===\"[object process]\")&&(e=Qs),e}function Vd(e,t,r){if(Nt.isString(e))try{return(t||JSON.parse)(e),Nt.trim(e)}catch(n){if(n.name!==\"SyntaxError\")throw n}return(r||JSON.stringify)(e)}var Fr={transitional:Ld,adapter:Kd(),transformRequest:[function(t,r){if(ks(r,\"Accept\"),ks(r,\"Content-Type\"),Nt.isFormData(t)||Nt.isArrayBuffer(t)||Nt.isBuffer(t)||Nt.isStream(t)||Nt.isFile(t)||Nt.isBlob(t))return t;if(Nt.isArrayBufferView(t))return t.buffer;if(Nt.isURLSearchParams(t))return _s(r,\"application/x-www-form-urlencoded;charset=utf-8\"),t.toString();var n=Nt.isObject(t),o=r&&r[\"Content-Type\"],s;if((s=Nt.isFileList(t))||n&&o===\"multipart/form-data\"){var i=this.env&&this.env.FormData;return $d(s?{\"files[]\":t}:t,i&&new i)}else if(n||o===\"application/json\")return _s(r,\"application/json\"),Vd(t);return t}],transformResponse:[function(t){var r=this.transitional||Fr.transitional,n=r&&r.silentJSONParsing,o=r&&r.forcedJSONParsing,s=!n&&this.responseType===\"json\";if(s||o&&Nt.isString(t)&&t.length)try{return JSON.parse(t)}catch(i){if(s)throw i.name===\"SyntaxError\"?qs.from(i,qs.ERR_BAD_RESPONSE,this,null,this.response):i}return t}],timeout:0,xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",maxContentLength:-1,maxBodyLength:-1,env:{FormData:jd},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:\"application/json, text/plain, */*\"}}};Nt.forEach([\"delete\",\"get\",\"head\"],function(t){Fr.headers[t]={}});Nt.forEach([\"post\",\"put\",\"patch\"],function(t){Fr.headers[t]=Nt.merge(Ud)});var is=Fr,Hd=Mt,Wd=is,Yd=function(t,r,n){var o=this||Wd;return Hd.forEach(n,function(i){t=i.call(o,t,r)}),t},nl=function(t){return!!(t&&t.__CANCEL__)},ti=Mt,Gr=Yd,wd=nl,Gd=is,zd=Dr;function zr(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new zd}var Jd=function(t){zr(t),t.headers=t.headers||{},t.data=Gr.call(t,t.data,t.headers,t.transformRequest),t.headers=ti.merge(t.headers.common||{},t.headers[t.method]||{},t.headers),ti.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\",\"common\"],function(o){delete t.headers[o]});var r=t.adapter||Gd.adapter;return r(t).then(function(o){return zr(t),o.data=Gr.call(t,o.data,o.headers,t.transformResponse),o},function(o){return wd(o)||(zr(t),o&&o.response&&(o.response.data=Gr.call(t,o.response.data,o.response.headers,t.transformResponse))),Promise.reject(o)})},Vt=Mt,rl=function(t,r){r=r||{};var n={};function o(f,c){return Vt.isPlainObject(f)&&Vt.isPlainObject(c)?Vt.merge(f,c):Vt.isPlainObject(c)?Vt.merge({},c):Vt.isArray(c)?c.slice():c}function s(f){if(Vt.isUndefined(r[f])){if(!Vt.isUndefined(t[f]))return o(void 0,t[f])}else return o(t[f],r[f])}function i(f){if(!Vt.isUndefined(r[f]))return o(void 0,r[f])}function a(f){if(Vt.isUndefined(r[f])){if(!Vt.isUndefined(t[f]))return o(void 0,t[f])}else return o(void 0,r[f])}function l(f){if(f in r)return o(t[f],r[f]);if(f in t)return o(void 0,t[f])}var u={url:i,method:i,data:i,baseURL:a,transformRequest:a,transformResponse:a,paramsSerializer:a,timeout:a,timeoutMessage:a,withCredentials:a,adapter:a,responseType:a,xsrfCookieName:a,xsrfHeaderName:a,onUploadProgress:a,onDownloadProgress:a,decompress:a,maxContentLength:a,maxBodyLength:a,beforeRedirect:a,transport:a,httpAgent:a,httpsAgent:a,cancelToken:a,socketPath:a,responseEncoding:a,validateStatus:l};return Vt.forEach(Object.keys(t).concat(Object.keys(r)),function(c){var d=u[c]||s,v=d(c);Vt.isUndefined(v)&&d!==l||(n[c]=v)}),n},ol={version:\"0.27.2\"},Xd=ol.version,ge=fn,as={};[\"object\",\"boolean\",\"number\",\"function\",\"string\",\"symbol\"].forEach(function(e,t){as[e]=function(n){return typeof n===e||\"a\"+(t<1?\"n \":\" \")+e}});var ei={};as.transitional=function(t,r,n){function o(s,i){return\"[Axios v\"+Xd+\"] Transitional option '\"+s+\"'\"+i+(n?\". \"+n:\"\")}return function(s,i,a){if(t===!1)throw new ge(o(i,\" has been removed\"+(r?\" in \"+r:\"\")),ge.ERR_DEPRECATED);return r&&!ei[i]&&(ei[i]=!0,console.warn(o(i,\" has been deprecated since v\"+r+\" and will be removed in the near future\"))),t?t(s,i,a):!0}};function Zd(e,t,r){if(typeof e!=\"object\")throw new ge(\"options must be an object\",ge.ERR_BAD_OPTION_VALUE);for(var n=Object.keys(e),o=n.length;o-- >0;){var s=n[o],i=t[s];if(i){var a=e[s],l=a===void 0||i(a,s,e);if(l!==!0)throw new ge(\"option \"+s+\" must be \"+l,ge.ERR_BAD_OPTION_VALUE);continue}if(r!==!0)throw new ge(\"Unknown option \"+s,ge.ERR_BAD_OPTION)}}var Qd={assertOptions:Zd,validators:as},sl=Mt,kd=Xa,ni=cd,ri=Jd,Mr=rl,qd=tl,il=Qd,we=il.validators;function an(e){this.defaults=e,this.interceptors={request:new ni,response:new ni}}an.prototype.request=function(t,r){typeof t==\"string\"?(r=r||{},r.url=t):r=t||{},r=Mr(this.defaults,r),r.method?r.method=r.method.toLowerCase():this.defaults.method?r.method=this.defaults.method.toLowerCase():r.method=\"get\";var n=r.transitional;n!==void 0&&il.assertOptions(n,{silentJSONParsing:we.transitional(we.boolean),forcedJSONParsing:we.transitional(we.boolean),clarifyTimeoutError:we.transitional(we.boolean)},!1);var o=[],s=!0;this.interceptors.request.forEach(function(v){typeof v.runWhen==\"function\"&&v.runWhen(r)===!1||(s=s&&v.synchronous,o.unshift(v.fulfilled,v.rejected))});var i=[];this.interceptors.response.forEach(function(v){i.push(v.fulfilled,v.rejected)});var a;if(!s){var l=[ri,void 0];for(Array.prototype.unshift.apply(l,o),l=l.concat(i),a=Promise.resolve(r);l.length;)a=a.then(l.shift(),l.shift());return a}for(var u=r;o.length;){var f=o.shift(),c=o.shift();try{u=f(u)}catch(d){c(d);break}}try{a=ri(u)}catch(d){return Promise.reject(d)}for(;i.length;)a=a.then(i.shift(),i.shift());return a};an.prototype.getUri=function(t){t=Mr(this.defaults,t);var r=qd(t.baseURL,t.url);return kd(r,t.params,t.paramsSerializer)};sl.forEach([\"delete\",\"get\",\"head\",\"options\"],function(t){an.prototype[t]=function(r,n){return this.request(Mr(n||{},{method:t,url:r,data:(n||{}).data}))}});sl.forEach([\"post\",\"put\",\"patch\"],function(t){function r(n){return function(s,i,a){return this.request(Mr(a||{},{method:t,headers:n?{\"Content-Type\":\"multipart/form-data\"}:{},url:s,data:i}))}}an.prototype[t]=r(),an.prototype[t+\"Form\"]=r(!0)});var _d=an,tv=Dr;function ln(e){if(typeof e!=\"function\")throw new TypeError(\"executor must be a function.\");var t;this.promise=new Promise(function(o){t=o});var r=this;this.promise.then(function(n){if(!!r._listeners){var o,s=r._listeners.length;for(o=0;o<s;o++)r._listeners[o](n);r._listeners=null}}),this.promise.then=function(n){var o,s=new Promise(function(i){r.subscribe(i),o=i}).then(n);return s.cancel=function(){r.unsubscribe(o)},s},e(function(o){r.reason||(r.reason=new tv(o),t(r.reason))})}ln.prototype.throwIfRequested=function(){if(this.reason)throw this.reason};ln.prototype.subscribe=function(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]};ln.prototype.unsubscribe=function(t){if(!!this._listeners){var r=this._listeners.indexOf(t);r!==-1&&this._listeners.splice(r,1)}};ln.source=function(){var t,r=new ln(function(o){t=o});return{token:r,cancel:t}};var ev=ln,nv=function(t){return function(n){return t.apply(null,n)}},rv=Mt,ov=function(t){return rv.isObject(t)&&t.isAxiosError===!0},oi=Mt,sv=Ga,er=_d,iv=rl,av=is;function al(e){var t=new er(e),r=sv(er.prototype.request,t);return oi.extend(r,er.prototype,t),oi.extend(r,t),r.create=function(o){return al(iv(e,o))},r}var Kt=al(av);Kt.Axios=er;Kt.CanceledError=Dr;Kt.CancelToken=ev;Kt.isCancel=nl;Kt.VERSION=ol.version;Kt.toFormData=_a;Kt.AxiosError=fn;Kt.Cancel=Kt.CanceledError;Kt.all=function(t){return Promise.all(t)};Kt.spread=nv;Kt.isAxiosError=ov;ts.exports=Kt;ts.exports.default=Kt;var Jr=ts.exports;var ll=(e,t)=>{const r=e.__vccOpts||e;for(const[n,o]of t)r[n]=o;return r};const lv=e=>(ji(\"data-v-27cc98a0\"),e=e(),Li(),e),fv={class:\"software-log_shade\"},uv=lv(()=>Zt(\"div\",{class:\"software-log_shade__bg\"},null,-1)),cv={class:\"software-log_shade__pannel\"},dv={class:\"software-log_shade__pannel-title\"},vv={class:\"software-log_shade__pannel-now\"},hv={class:\"software-log_shade__pannel-content\"},pv=[\"innerHTML\"],gv={class:\"software-log_shade__pannel-btn\"},mv={props:{title:{type:String,default:\"\\u65E5\\u5FD7\\u8BB0\\u5F55\"},description:{type:String,default:\"\\u63D2\\u4EF6\\u5B89\\u88C5/\\u5378\\u8F7D\\u8FC7\\u7A0B\\u4E2D\\u8BF7\\u52FF\\u5237\\u65B0\\u6B64\\u9875\\u9762\\uFF01\"},clearText:{type:String,default:\"\\u5173\\u95ED\"},value:{type:String,default:\"\"}},setup(e){const t=e,r=ue(),n=()=>{r&&r.appContext.config.globalProperties.$close()},o=Be(null),s=()=>{o.value&&(o.value.scrollTop=o.value.scrollHeight)},i=Be(!1),a=Be(t.value);return(()=>{if(r){const u=r.appContext.config.globalProperties;u.$setValue=f=>{a.value=f,s()},u.$addValue=f=>{a.value+=f,s()},u.$disabled=f=>{i.value=f}}})(),He(()=>{document.body.setAttribute(\"lock-scroll\",\"true\")}),Kn(()=>{document.body.removeAttribute(\"lock-scroll\")}),(u,f)=>(be(),so(\"div\",fv,[uv,Zt(\"div\",cv,[Zt(\"div\",dv,kn(e.title),1),Zt(\"div\",vv,[Zt(\"i\",null,\"\\xA0\\xA0\\xA0\\xA0\"+kn(e.description),1)]),Zt(\"div\",hv,[Zt(\"p\",{style:{\"white-space\":\"pre-line\",\"text-align\":\"left\",color:\"#fff\"},innerHTML:a.value},null,8,pv)]),Zt(\"div\",gv,[i.value?(be(),so(\"button\",{key:0,class:\"close\",onClick:f[0]||(f[0]=c=>n())},kn(e.clearText),1)):ha(\"\",!0)])])]))}};var yv=ll(mv,[[\"__scopeId\",\"data-v-27cc98a0\"]]);const mo=e=>{const t=document.createElement(\"div\");document.body.appendChild(t);const r=_o(yv,{title:e.title,description:e.description,value:e.value});r.config.globalProperties.$close=()=>{n()};const n=()=>{r.unmount(),t.remove(),e.callback&&e.callback()},o=a=>{r.config.globalProperties.$setValue(a)},s=a=>{r.config.globalProperties.$addValue(a)},i=a=>{r.config.globalProperties.$disabled(a)};return r.mount(t),{close:n,setValue:o,addValue:s,setDisabled:i}};var fl={exports:{}},Ev=Wc(Vc);(function(e){e.exports=function(t){var r={};function n(o){if(r[o])return r[o].exports;var s=r[o]={i:o,l:!1,exports:{}};return t[o].call(s.exports,s,s.exports,n),s.l=!0,s.exports}return n.m=t,n.c=r,n.d=function(o,s,i){n.o(o,s)||Object.defineProperty(o,s,{enumerable:!0,get:i})},n.r=function(o){typeof Symbol!=\"undefined\"&&Symbol.toStringTag&&Object.defineProperty(o,Symbol.toStringTag,{value:\"Module\"}),Object.defineProperty(o,\"__esModule\",{value:!0})},n.t=function(o,s){if(s&1&&(o=n(o)),s&8||s&4&&typeof o==\"object\"&&o&&o.__esModule)return o;var i=Object.create(null);if(n.r(i),Object.defineProperty(i,\"default\",{enumerable:!0,value:o}),s&2&&typeof o!=\"string\")for(var a in o)n.d(i,a,function(l){return o[l]}.bind(null,a));return i},n.n=function(o){var s=o&&o.__esModule?function(){return o.default}:function(){return o};return n.d(s,\"a\",s),s},n.o=function(o,s){return Object.prototype.hasOwnProperty.call(o,s)},n.p=\"\",n(n.s=\"fb15\")}({\"0094\":function(t,r,n){var o=n(\"da84\"),s=n(\"e330\"),i=n(\"6964\"),a=n(\"f183\"),l=n(\"6d61\"),u=n(\"acac\"),f=n(\"861d\"),c=n(\"4fad\"),d=n(\"69f3\").enforce,v=n(\"7f9a\"),g=!o.ActiveXObject&&\"ActiveXObject\"in o,y,m=function(O){return function(){return O(this,arguments.length?arguments[0]:void 0)}},p=l(\"WeakMap\",m,u);if(v&&g){y=u.getConstructor(m,\"WeakMap\",!0),a.enable();var h=p.prototype,x=s(h.delete),A=s(h.has),I=s(h.get),b=s(h.set);i(h,{delete:function(O){if(f(O)&&!c(O)){var S=d(this);return S.frozen||(S.frozen=new y),x(this,O)||S.frozen.delete(O)}return x(this,O)},has:function(S){if(f(S)&&!c(S)){var C=d(this);return C.frozen||(C.frozen=new y),A(this,S)||C.frozen.has(S)}return A(this,S)},get:function(S){if(f(S)&&!c(S)){var C=d(this);return C.frozen||(C.frozen=new y),A(this,S)?I(this,S):C.frozen.get(S)}return I(this,S)},set:function(S,C){if(f(S)&&!c(S)){var T=d(this);T.frozen||(T.frozen=new y),A(this,S)?b(this,S,C):T.frozen.set(S,C)}else b(this,S,C);return this}})}},\"00b4\":function(t,r,n){n(\"ac1f\");var o=n(\"23e7\"),s=n(\"c65b\"),i=n(\"e330\"),a=n(\"1626\"),l=n(\"861d\"),u=function(){var d=!1,v=/[ac]/;return v.exec=function(){return d=!0,/./.exec.apply(this,arguments)},v.test(\"abc\")===!0&&d}(),f=TypeError,c=i(/./.test);o({target:\"RegExp\",proto:!0,forced:!u},{test:function(d){var v=this.exec;if(!a(v))return c(this,d);var g=s(v,this,d);if(g!==null&&!l(g))throw new f(\"RegExp exec method returned something other than an Object or null\");return!!g}})},\"00ee\":function(t,r,n){var o=n(\"b622\"),s=o(\"toStringTag\"),i={};i[s]=\"z\",t.exports=String(i)===\"[object z]\"},\"0366\":function(t,r,n){var o=n(\"e330\"),s=n(\"59ed\"),i=n(\"40d5\"),a=o(o.bind);t.exports=function(l,u){return s(l),u===void 0?l:i?a(l,u):function(){return l.apply(u,arguments)}}},\"057f\":function(t,r,n){var o=n(\"c6b6\"),s=n(\"fc6a\"),i=n(\"241c\").f,a=n(\"4dae\"),l=typeof window==\"object\"&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],u=function(f){try{return i(f)}catch(c){return a(l)}};t.exports.f=function(c){return l&&o(c)==\"Window\"?u(c):i(s(c))}},\"06c5\":function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r,n(\"fb6a\"),n(\"d3b7\"),n(\"b0c0\"),n(\"a630\"),n(\"3ca3\"),n(\"ac1f\"),n(\"00b4\"),n(\"6b75\")],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a,l,u,f,c,d,v,g,y){Object.defineProperty(a,\"__esModule\",{value:!0}),a.default=p,y=m(y);function m(h){return h&&h.__esModule?h:{default:h}}function p(h,x){if(!!h){if(typeof h==\"string\")return(0,y.default)(h,x);var A=Object.prototype.toString.call(h).slice(8,-1);if(A===\"Object\"&&h.constructor&&(A=h.constructor.name),A===\"Map\"||A===\"Set\")return Array.from(h);if(A===\"Arguments\"||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(A))return(0,y.default)(h,x)}}})},\"06cf\":function(t,r,n){var o=n(\"83ab\"),s=n(\"c65b\"),i=n(\"d1e7\"),a=n(\"5c6c\"),l=n(\"fc6a\"),u=n(\"a04b\"),f=n(\"1a2d\"),c=n(\"0cfb\"),d=Object.getOwnPropertyDescriptor;r.f=o?d:function(g,y){if(g=l(g),y=u(y),c)try{return d(g,y)}catch(m){}if(f(g,y))return a(!s(i.f,g,y),g[y])}},\"07fa\":function(t,r,n){var o=n(\"50c4\");t.exports=function(s){return o(s.length)}},\"0b42\":function(t,r,n){var o=n(\"e8b5\"),s=n(\"68ee\"),i=n(\"861d\"),a=n(\"b622\"),l=a(\"species\"),u=Array;t.exports=function(f){var c;return o(f)&&(c=f.constructor,s(c)&&(c===u||o(c.prototype))?c=void 0:i(c)&&(c=c[l],c===null&&(c=void 0))),c===void 0?u:c}},\"0cfb\":function(t,r,n){var o=n(\"83ab\"),s=n(\"d039\"),i=n(\"cc12\");t.exports=!o&&!s(function(){return Object.defineProperty(i(\"div\"),\"a\",{get:function(){return 7}}).a!=7})},\"0d51\":function(t,r){var n=String;t.exports=function(o){try{return n(o)}catch(s){return\"Object\"}}},\"0dd9\":function(t,r,n){Object.defineProperty(r,\"__esModule\",{value:!0}),r.default=a;var o=s(n(\"d887\"));function s(l){return l&&l.__esModule?l:{default:l}}function i(l){return typeof Symbol==\"function\"&&typeof Symbol.iterator==\"symbol\"?i=function(f){return typeof f}:i=function(f){return f&&typeof Symbol==\"function\"&&f.constructor===Symbol&&f!==Symbol.prototype?\"symbol\":typeof f},i(l)}function a(l,u){(0,o.default)(l);var f,c;i(u)===\"object\"?(f=u.min||0,c=u.max):(f=arguments[1]||0,c=arguments[2]);var d=l.match(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g)||[],v=l.length-d.length;return v>=f&&(typeof c==\"undefined\"||v<=c)}t.exports=r.default,t.exports.default=r.default},\"107c\":function(t,r,n){var o=n(\"d039\"),s=n(\"da84\"),i=s.RegExp;t.exports=o(function(){var a=i(\"(?<a>b)\",\"g\");return a.exec(\"b\").groups.a!==\"b\"||\"b\".replace(a,\"$<a>c\")!==\"bc\"})},\"10d1\":function(t,r,n){n(\"0094\")},\"13d2\":function(t,r,n){var o=n(\"d039\"),s=n(\"1626\"),i=n(\"1a2d\"),a=n(\"83ab\"),l=n(\"5e77\").CONFIGURABLE,u=n(\"8925\"),f=n(\"69f3\"),c=f.enforce,d=f.get,v=Object.defineProperty,g=a&&!o(function(){return v(function(){},\"length\",{value:8}).length!==8}),y=String(String).split(\"String\"),m=t.exports=function(p,h,x){String(h).slice(0,7)===\"Symbol(\"&&(h=\"[\"+String(h).replace(/^Symbol\\(([^)]*)\\)/,\"$1\")+\"]\"),x&&x.getter&&(h=\"get \"+h),x&&x.setter&&(h=\"set \"+h),(!i(p,\"name\")||l&&p.name!==h)&&v(p,\"name\",{value:h,configurable:!0}),g&&x&&i(x,\"arity\")&&p.length!==x.arity&&v(p,\"length\",{value:x.arity});try{x&&i(x,\"constructor\")&&x.constructor?a&&v(p,\"prototype\",{writable:!1}):p.prototype&&(p.prototype=void 0)}catch(I){}var A=c(p);return i(A,\"source\")||(A.source=y.join(typeof h==\"string\"?h:\"\")),p};Function.prototype.toString=m(function(){return s(this)&&d(this).source||u(this)},\"toString\")},\"14c3\":function(t,r,n){var o=n(\"c65b\"),s=n(\"825a\"),i=n(\"1626\"),a=n(\"c6b6\"),l=n(\"9263\"),u=TypeError;t.exports=function(f,c){var d=f.exec;if(i(d)){var v=o(d,f,c);return v!==null&&s(v),v}if(a(f)===\"RegExp\")return o(l,f,c);throw u(\"RegExp#exec called on incompatible receiver\")}},\"159b\":function(t,r,n){var o=n(\"da84\"),s=n(\"fdbc\"),i=n(\"785a\"),a=n(\"17c2\"),l=n(\"9112\"),u=function(c){if(c&&c.forEach!==a)try{l(c,\"forEach\",a)}catch(d){c.forEach=a}};for(var f in s)s[f]&&u(o[f]&&o[f].prototype);u(i)},\"15fd\":function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r,n(\"a4d3\"),n(\"ccb5\")],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a,l,u){Object.defineProperty(a,\"__esModule\",{value:!0}),a.default=c,u=f(u);function f(d){return d&&d.__esModule?d:{default:d}}function c(d,v){if(d==null)return{};var g=(0,u.default)(d,v),y,m;if(Object.getOwnPropertySymbols){var p=Object.getOwnPropertySymbols(d);for(m=0;m<p.length;m++)y=p[m],!(v.indexOf(y)>=0)&&(!Object.prototype.propertyIsEnumerable.call(d,y)||(g[y]=d[y]))}return g}})},\"1626\":function(t,r){t.exports=function(n){return typeof n==\"function\"}},\"17c2\":function(t,r,n){var o=n(\"b727\").forEach,s=n(\"a640\"),i=s(\"forEach\");t.exports=i?[].forEach:function(l){return o(this,l,arguments.length>1?arguments[1]:void 0)}},\"19aa\":function(t,r,n){var o=n(\"3a9b\"),s=TypeError;t.exports=function(i,a){if(o(a,i))return i;throw s(\"Incorrect invocation\")}},\"1a2d\":function(t,r,n){var o=n(\"e330\"),s=n(\"7b0b\"),i=o({}.hasOwnProperty);t.exports=Object.hasOwn||function(l,u){return i(s(l),u)}},\"1be4\":function(t,r,n){var o=n(\"d066\");t.exports=o(\"document\",\"documentElement\")},\"1c7e\":function(t,r,n){var o=n(\"b622\"),s=o(\"iterator\"),i=!1;try{var a=0,l={next:function(){return{done:!!a++}},return:function(){i=!0}};l[s]=function(){return this},Array.from(l,function(){throw 2})}catch(u){}t.exports=function(u,f){if(!f&&!i)return!1;var c=!1;try{var d={};d[s]=function(){return{next:function(){return{done:c=!0}}}},u(d)}catch(v){}return c}},\"1d80\":function(t,r){var n=TypeError;t.exports=function(o){if(o==null)throw n(\"Can't call method on \"+o);return o}},\"1dde\":function(t,r,n){var o=n(\"d039\"),s=n(\"b622\"),i=n(\"2d00\"),a=s(\"species\");t.exports=function(l){return i>=51||!o(function(){var u=[],f=u.constructor={};return f[a]=function(){return{foo:1}},u[l](Boolean).foo!==1})}},\"1eb2\":function(t,r,n){if(typeof window!=\"undefined\"){var o=window.document.currentScript;{var s=n(\"8875\");o=s(),\"currentScript\"in document||Object.defineProperty(document,\"currentScript\",{get:s})}var i=o&&o.src.match(/(.+\\/)[^/]+\\.js(\\?.*)?$/);i&&(n.p=i[1])}},\"2266\":function(t,r,n){var o=n(\"0366\"),s=n(\"c65b\"),i=n(\"825a\"),a=n(\"0d51\"),l=n(\"e95a\"),u=n(\"07fa\"),f=n(\"3a9b\"),c=n(\"9a1f\"),d=n(\"35a1\"),v=n(\"2a62\"),g=TypeError,y=function(p,h){this.stopped=p,this.result=h},m=y.prototype;t.exports=function(p,h,x){var A=x&&x.that,I=!!(x&&x.AS_ENTRIES),b=!!(x&&x.IS_ITERATOR),O=!!(x&&x.INTERRUPTED),S=o(h,A),C,T,N,P,F,H,w,B=function(j){return C&&v(C,\"normal\",j),new y(!0,j)},M=function(j){return I?(i(j),O?S(j[0],j[1],B):S(j[0],j[1])):O?S(j,B):S(j)};if(b)C=p;else{if(T=d(p),!T)throw g(a(p)+\" is not iterable\");if(l(T)){for(N=0,P=u(p);P>N;N++)if(F=M(p[N]),F&&f(m,F))return F;return new y(!1)}C=c(p,T)}for(H=C.next;!(w=s(H,C)).done;){try{F=M(w.value)}catch(j){v(C,\"throw\",j)}if(typeof F==\"object\"&&F&&f(m,F))return F}return new y(!1)}},\"23cb\":function(t,r,n){var o=n(\"5926\"),s=Math.max,i=Math.min;t.exports=function(a,l){var u=o(a);return u<0?s(u+l,0):i(u,l)}},\"23e7\":function(t,r,n){var o=n(\"da84\"),s=n(\"06cf\").f,i=n(\"9112\"),a=n(\"cb2d\"),l=n(\"6374\"),u=n(\"e893\"),f=n(\"94ca\");t.exports=function(c,d){var v=c.target,g=c.global,y=c.stat,m,p,h,x,A,I;if(g?p=o:y?p=o[v]||l(v,{}):p=(o[v]||{}).prototype,p)for(h in d){if(A=d[h],c.dontCallGetSet?(I=s(p,h),x=I&&I.value):x=p[h],m=f(g?h:v+(y?\".\":\"#\")+h,c.forced),!m&&x!==void 0){if(typeof A==typeof x)continue;u(A,x)}(c.sham||x&&x.sham)&&i(A,\"sham\",!0),a(p,h,A,c)}}},\"241c\":function(t,r,n){var o=n(\"ca84\"),s=n(\"7839\"),i=s.concat(\"length\",\"prototype\");r.f=Object.getOwnPropertyNames||function(l){return o(l,i)}},\"25f0\":function(t,r,n){var o=n(\"5e77\").PROPER,s=n(\"cb2d\"),i=n(\"825a\"),a=n(\"577e\"),l=n(\"d039\"),u=n(\"90d8\"),f=\"toString\",c=RegExp.prototype,d=c[f],v=l(function(){return d.call({source:\"a\",flags:\"b\"})!=\"/a/b\"}),g=o&&d.name!=f;(v||g)&&s(RegExp.prototype,f,function(){var m=i(this),p=a(m.source),h=a(u(m));return\"/\"+p+\"/\"+h},{unsafe:!0})},\"2626\":function(t,r,n){var o=n(\"d066\"),s=n(\"9bf2\"),i=n(\"b622\"),a=n(\"83ab\"),l=i(\"species\");t.exports=function(u){var f=o(u),c=s.f;a&&f&&!f[l]&&c(f,l,{configurable:!0,get:function(){return this}})}},\"2909\":function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r,n(\"6005\"),n(\"db90\"),n(\"06c5\"),n(\"3427\")],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a,l,u,f,c){Object.defineProperty(a,\"__esModule\",{value:!0}),a.default=v,l=d(l),u=d(u),f=d(f),c=d(c);function d(g){return g&&g.__esModule?g:{default:g}}function v(g){return(0,l.default)(g)||(0,u.default)(g)||(0,f.default)(g)||(0,c.default)()}})},\"2a62\":function(t,r,n){var o=n(\"c65b\"),s=n(\"825a\"),i=n(\"dc4a\");t.exports=function(a,l,u){var f,c;s(a);try{if(f=i(a,\"return\"),!f){if(l===\"throw\")throw u;return u}f=o(f,a)}catch(d){c=!0,f=d}if(l===\"throw\")throw u;if(c)throw f;return s(f),u}},\"2ba4\":function(t,r,n){var o=n(\"40d5\"),s=Function.prototype,i=s.apply,a=s.call;t.exports=typeof Reflect==\"object\"&&Reflect.apply||(o?a.bind(i):function(){return a.apply(i,arguments)})},\"2c3e\":function(t,r,n){var o=n(\"83ab\"),s=n(\"9f7f\").MISSED_STICKY,i=n(\"c6b6\"),a=n(\"edd0\"),l=n(\"69f3\").get,u=RegExp.prototype,f=TypeError;o&&s&&a(u,\"sticky\",{configurable:!0,get:function(){if(this!==u){if(i(this)===\"RegExp\")return!!l(this).sticky;throw f(\"Incompatible receiver, RegExp required\")}}})},\"2d00\":function(t,r,n){var o=n(\"da84\"),s=n(\"342f\"),i=o.process,a=o.Deno,l=i&&i.versions||a&&a.version,u=l&&l.v8,f,c;u&&(f=u.split(\".\"),c=f[0]>0&&f[0]<4?1:+(f[0]+f[1])),!c&&s&&(f=s.match(/Edge\\/(\\d+)/),(!f||f[1]>=74)&&(f=s.match(/Chrome\\/(\\d+)/),f&&(c=+f[1]))),t.exports=c},\"33fc\":function(t,r,n){},\"3427\":function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r,n(\"d9e2\")],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a,l){Object.defineProperty(a,\"__esModule\",{value:!0}),a.default=u;function u(){throw new TypeError(`Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.`)}})},\"342f\":function(t,r,n){var o=n(\"d066\");t.exports=o(\"navigator\",\"userAgent\")||\"\"},\"3511\":function(t,r){var n=TypeError,o=9007199254740991;t.exports=function(s){if(s>o)throw n(\"Maximum allowed index exceeded\");return s}},\"35a1\":function(t,r,n){var o=n(\"f5df\"),s=n(\"dc4a\"),i=n(\"3f8c\"),a=n(\"b622\"),l=a(\"iterator\");t.exports=function(u){if(u!=null)return s(u,l)||s(u,\"@@iterator\")||i[o(u)]}},\"37e8\":function(t,r,n){var o=n(\"83ab\"),s=n(\"aed9\"),i=n(\"9bf2\"),a=n(\"825a\"),l=n(\"fc6a\"),u=n(\"df75\");r.f=o&&!s?Object.defineProperties:function(c,d){a(c);for(var v=l(d),g=u(d),y=g.length,m=0,p;y>m;)i.f(c,p=g[m++],v[p]);return c}},\"3a9b\":function(t,r,n){var o=n(\"e330\");t.exports=o({}.isPrototypeOf)},\"3bbb\":function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r,n(\"d3b7\"),n(\"159b\"),n(\"b64b\"),n(\"2909\"),n(\"e74d\")],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a,l,u,f,c,d){var v=n(\"4ea4\").default;Object.defineProperty(a,\"__esModule\",{value:!0}),a.getValidateList=void 0,c=v(c);var g=function(h,x){return x.type===\"array\"&&x.enum?!h||h.length===0:h===0||h===!1?!1:!h},y=function p(h,x){var A=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{},I=arguments.length>3?arguments[3]:void 0,b=[],O=A.type,S=A.items,C={value:x,schema:A};if(O===\"object\"){var T=m(x,A,I);b.push.apply(b,(0,c.default)(T))}else O===\"array\"&&x.forEach(function(N){var P=p(h,N,S,I);b.push.apply(b,(0,c.default)(P))});return(0,d.validate)(C)&&b.push(h),b},m=function(){var h=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},x=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{},A=arguments.length>2?arguments[2]:void 0,I=A||h,b=[],O=x.properties,S=x.required;return S&&S.length>0&&S.forEach(function(C){var T=O&&O[C]||{},N=T[\"ui:hidden\"],P=h&&h[C],F=(0,d.convertValue)(N,I,h);g(P,T)&&!F&&b.push(C)}),O&&h&&Object.keys(h)&&Object.keys(h).length>0&&Object.keys(h).forEach(function(C){var T=h[C],N=O[C]||{},P=y(C,T,N,I);b.push.apply(b,(0,c.default)(P))}),b};a.getValidateList=m})},\"3bbe\":function(t,r,n){var o=n(\"1626\"),s=String,i=TypeError;t.exports=function(a){if(typeof a==\"object\"||o(a))return a;throw i(\"Can't set \"+s(a)+\" as a prototype\")}},\"3ca3\":function(t,r,n){var o=n(\"6547\").charAt,s=n(\"577e\"),i=n(\"69f3\"),a=n(\"7dd0\"),l=\"String Iterator\",u=i.set,f=i.getterFor(l);a(String,\"String\",function(c){u(this,{type:l,string:s(c),index:0})},function(){var d=f(this),v=d.string,g=d.index,y;return g>=v.length?{value:void 0,done:!0}:(y=o(v,g),d.index+=y.length,{value:y,done:!1})})},\"3d87\":function(t,r,n){var o=n(\"4930\");t.exports=o&&!!Symbol.for&&!!Symbol.keyFor},\"3f8c\":function(t,r){t.exports={}},\"408a\":function(t,r,n){var o=n(\"e330\");t.exports=o(1 .valueOf)},\"40d5\":function(t,r,n){var o=n(\"d039\");t.exports=!o(function(){var s=function(){}.bind();return typeof s!=\"function\"||s.hasOwnProperty(\"prototype\")})},\"428f\":function(t,r,n){var o=n(\"da84\");t.exports=o},\"44ad\":function(t,r,n){var o=n(\"e330\"),s=n(\"d039\"),i=n(\"c6b6\"),a=Object,l=o(\"\".split);t.exports=s(function(){return!a(\"z\").propertyIsEnumerable(0)})?function(u){return i(u)==\"String\"?l(u,\"\"):a(u)}:a},\"44d2\":function(t,r,n){var o=n(\"b622\"),s=n(\"7c73\"),i=n(\"9bf2\").f,a=o(\"unscopables\"),l=Array.prototype;l[a]==null&&i(l,a,{configurable:!0,value:s(null)}),t.exports=function(u){l[a][u]=!0}},\"44e7\":function(t,r,n){var o=n(\"861d\"),s=n(\"c6b6\"),i=n(\"b622\"),a=i(\"match\");t.exports=function(l){var u;return o(l)&&((u=l[a])!==void 0?!!u:s(l)==\"RegExp\")}},\"466d\":function(t,r,n){var o=n(\"c65b\"),s=n(\"d784\"),i=n(\"825a\"),a=n(\"50c4\"),l=n(\"577e\"),u=n(\"1d80\"),f=n(\"dc4a\"),c=n(\"8aa5\"),d=n(\"14c3\");s(\"match\",function(v,g,y){return[function(p){var h=u(this),x=p==null?void 0:f(p,v);return x?o(x,p,h):new RegExp(p)[v](l(h))},function(m){var p=i(this),h=l(m),x=y(g,p,h);if(x.done)return x.value;if(!p.global)return d(p,h);var A=p.unicode;p.lastIndex=0;for(var I=[],b=0,O;(O=d(p,h))!==null;){var S=l(O[0]);I[b]=S,S===\"\"&&(p.lastIndex=c(h,a(p.lastIndex),A)),b++}return b===0?null:I}]})},\"485a\":function(t,r,n){var o=n(\"c65b\"),s=n(\"1626\"),i=n(\"861d\"),a=TypeError;t.exports=function(l,u){var f,c;if(u===\"string\"&&s(f=l.toString)&&!i(c=o(f,l))||s(f=l.valueOf)&&!i(c=o(f,l))||u!==\"string\"&&s(f=l.toString)&&!i(c=o(f,l)))return c;throw a(\"Can't convert object to primitive value\")}},\"4930\":function(t,r,n){var o=n(\"2d00\"),s=n(\"d039\");t.exports=!!Object.getOwnPropertySymbols&&!s(function(){var i=Symbol();return!String(i)||!(Object(i)instanceof Symbol)||!Symbol.sham&&o&&o<41})},\"498a\":function(t,r,n){var o=n(\"23e7\"),s=n(\"58a8\").trim,i=n(\"c8d2\");o({target:\"String\",proto:!0,forced:i(\"trim\")},{trim:function(){return s(this)}})},\"4d63\":function(t,r,n){var o=n(\"83ab\"),s=n(\"da84\"),i=n(\"e330\"),a=n(\"94ca\"),l=n(\"7156\"),u=n(\"9112\"),f=n(\"241c\").f,c=n(\"3a9b\"),d=n(\"44e7\"),v=n(\"577e\"),g=n(\"90d8\"),y=n(\"9f7f\"),m=n(\"aeb0\"),p=n(\"cb2d\"),h=n(\"d039\"),x=n(\"1a2d\"),A=n(\"69f3\").enforce,I=n(\"2626\"),b=n(\"b622\"),O=n(\"fce3\"),S=n(\"107c\"),C=b(\"match\"),T=s.RegExp,N=T.prototype,P=s.SyntaxError,F=i(N.exec),H=i(\"\".charAt),w=i(\"\".replace),B=i(\"\".indexOf),M=i(\"\".slice),j=/^\\?<[^\\s\\d!#%&*+<=>@^][^\\s!#%&*+<=>@^]*>/,G=/a/g,st=/a/g,et=new T(G)!==G,rt=y.MISSED_STICKY,gt=y.UNSUPPORTED_Y,z=o&&(!et||rt||O||S||h(function(){return st[C]=!1,T(G)!=G||T(st)==st||T(G,\"i\")!=\"/a/i\"})),_=function(ct){for(var it=ct.length,ft=0,E=\"\",R=!1,D;ft<=it;ft++){if(D=H(ct,ft),D===\"\\\\\"){E+=D+H(ct,++ft);continue}!R&&D===\".\"?E+=\"[\\\\s\\\\S]\":(D===\"[\"?R=!0:D===\"]\"&&(R=!1),E+=D)}return E},lt=function(ct){for(var it=ct.length,ft=0,E=\"\",R=[],D={},L=!1,$=!1,W=0,V=\"\",U;ft<=it;ft++){if(U=H(ct,ft),U===\"\\\\\")U=U+H(ct,++ft);else if(U===\"]\")L=!1;else if(!L)switch(!0){case U===\"[\":L=!0;break;case U===\"(\":F(j,M(ct,ft+1))&&(ft+=2,$=!0),E+=U,W++;continue;case(U===\">\"&&$):if(V===\"\"||x(D,V))throw new P(\"Invalid capture group name\");D[V]=!0,R[R.length]=[V,W],$=!1,V=\"\";continue}$?V+=U:E+=U}return[E,R]};if(a(\"RegExp\",z)){for(var Q=function(it,ft){var E=c(N,this),R=d(it),D=ft===void 0,L=[],$=it,W,V,U,Y,K,X;if(!E&&R&&D&&it.constructor===Q)return it;if((R||c(N,it))&&(it=it.source,D&&(ft=g($))),it=it===void 0?\"\":v(it),ft=ft===void 0?\"\":v(ft),$=it,O&&\"dotAll\"in G&&(V=!!ft&&B(ft,\"s\")>-1,V&&(ft=w(ft,/s/g,\"\"))),W=ft,rt&&\"sticky\"in G&&(U=!!ft&&B(ft,\"y\")>-1,U&&gt&&(ft=w(ft,/y/g,\"\"))),S&&(Y=lt(it),it=Y[0],L=Y[1]),K=l(T(it,ft),E?this:N,Q),(V||U||L.length)&&(X=A(K),V&&(X.dotAll=!0,X.raw=Q(_(it),W)),U&&(X.sticky=!0),L.length&&(X.groups=L)),it!==$)try{u(K,\"source\",$===\"\"?\"(?:)\":$)}catch(J){}return K},Z=f(T),yt=0;Z.length>yt;)m(Q,T,Z[yt++]);N.constructor=Q,Q.prototype=N,p(s,\"RegExp\",Q,{constructor:!0})}I(\"RegExp\")},\"4d64\":function(t,r,n){var o=n(\"fc6a\"),s=n(\"23cb\"),i=n(\"07fa\"),a=function(l){return function(u,f,c){var d=o(u),v=i(d),g=s(c,v),y;if(l&&f!=f){for(;v>g;)if(y=d[g++],y!=y)return!0}else for(;v>g;g++)if((l||g in d)&&d[g]===f)return l||g||0;return!l&&-1}};t.exports={includes:a(!0),indexOf:a(!1)}},\"4dae\":function(t,r,n){var o=n(\"23cb\"),s=n(\"07fa\"),i=n(\"8418\"),a=Array,l=Math.max;t.exports=function(u,f,c){for(var d=s(u),v=o(f,d),g=o(c===void 0?d:c,d),y=a(l(g-v,0)),m=0;v<g;v++,m++)i(y,m,u[v]);return y.length=m,y}},\"4de4\":function(t,r,n){var o=n(\"23e7\"),s=n(\"b727\").filter,i=n(\"1dde\"),a=i(\"filter\");o({target:\"Array\",proto:!0,forced:!a},{filter:function(u){return s(this,u,arguments.length>1?arguments[1]:void 0)}})},\"4df4\":function(t,r,n){var o=n(\"0366\"),s=n(\"c65b\"),i=n(\"7b0b\"),a=n(\"9bdd\"),l=n(\"e95a\"),u=n(\"68ee\"),f=n(\"07fa\"),c=n(\"8418\"),d=n(\"9a1f\"),v=n(\"35a1\"),g=Array;t.exports=function(m){var p=i(m),h=u(this),x=arguments.length,A=x>1?arguments[1]:void 0,I=A!==void 0;I&&(A=o(A,x>2?arguments[2]:void 0));var b=v(p),O=0,S,C,T,N,P,F;if(b&&!(this===g&&l(b)))for(N=d(p,b),P=N.next,C=h?new this:[];!(T=s(P,N)).done;O++)F=I?a(N,A,[T.value,O],!0):T.value,c(C,O,F);else for(S=f(p),C=h?new this(S):g(S);S>O;O++)F=I?A(p[O],O):p[O],c(C,O,F);return C.length=O,C}},\"4ea4\":function(t,r){function n(o){return o&&o.__esModule?o:{default:o}}t.exports=n,t.exports.__esModule=!0,t.exports.default=t.exports},\"4fad\":function(t,r,n){var o=n(\"d039\"),s=n(\"861d\"),i=n(\"c6b6\"),a=n(\"d86b\"),l=Object.isExtensible,u=o(function(){});t.exports=u||a?function(c){return!s(c)||a&&i(c)==\"ArrayBuffer\"?!1:l?l(c):!0}:l},\"5092\":function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r,n(\"8bbf\"),n(\"a9e3\"),n(\"b0c0\"),n(\"a4d3\"),n(\"e01a\"),n(\"e74d\")],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a,l,u,f,c,d,v){var g=n(\"dbce\").default;Object.defineProperty(a,\"__esModule\",{value:!0}),a.default=void 0,l=g(l);var y={props:{schema:Object,formData:Object,name:String,onChange:Function,value:[String,Number,Boolean,Object],disabled:Boolean,readOnly:Boolean,invalidText:String},setup:function(p){var h=(0,l.toRefs)(p),x=h.schema,A=h.onChange,I=h.name,b=h.value,O=h.style,S=function(T){A.value(I.value,T.target.checked)};return function(){var C=x.value[\"ui:options\"];return l.createVNode(\"div\",{className:\"cbi-value\",style:O},[l.createVNode(\"div\",null,[l.createVNode(\"label\",{className:\"cbi-value-title\"},[(0,v.i18n)(p.schema.title)]),l.createVNode(\"div\",{class:\"cbi-value-field\"},[l.createVNode(\"div\",{class:\"cbi-checkbox\"},[l.createVNode(\"input\",{type:\"checkbox\",checked:b.value,onClick:S},null)]),(C==null?void 0:C.description)&&l.createVNode(l.Fragment,null,[l.createVNode(\"br\",null,null),l.createVNode(\"div\",{class:\"cbi-value-description\",innerHTML:(0,v.i18n)(C.description)},null)])])])])}}};a.default=y})},\"50c4\":function(t,r,n){var o=n(\"5926\"),s=Math.min;t.exports=function(i){return i>0?s(o(i),9007199254740991):0}},\"53ca\":function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r,n(\"a4d3\"),n(\"e01a\"),n(\"d3b7\"),n(\"d28b\"),n(\"e260\"),n(\"3ca3\"),n(\"ddb0\")],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a,l,u,f,c,d,v,g){Object.defineProperty(a,\"__esModule\",{value:!0}),a.default=y;function y(m){return a.default=y=typeof Symbol==\"function\"&&typeof Symbol.iterator==\"symbol\"?function(p){return typeof p}:function(p){return p&&typeof Symbol==\"function\"&&p.constructor===Symbol&&p!==Symbol.prototype?\"symbol\":typeof p},y(m)}})},\"5530\":function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r,n(\"b64b\"),n(\"a4d3\"),n(\"4de4\"),n(\"d3b7\"),n(\"e439\"),n(\"159b\"),n(\"dbb4\"),n(\"ade3\")],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a,l,u,f,c,d,v,g,y){Object.defineProperty(a,\"__esModule\",{value:!0}),a.default=h,y=m(y);function m(x){return x&&x.__esModule?x:{default:x}}function p(x,A){var I=Object.keys(x);if(Object.getOwnPropertySymbols){var b=Object.getOwnPropertySymbols(x);A&&(b=b.filter(function(O){return Object.getOwnPropertyDescriptor(x,O).enumerable})),I.push.apply(I,b)}return I}function h(x){for(var A=1;A<arguments.length;A++){var I=arguments[A]!=null?arguments[A]:{};A%2?p(Object(I),!0).forEach(function(b){(0,y.default)(x,b,I[b])}):Object.getOwnPropertyDescriptors?Object.defineProperties(x,Object.getOwnPropertyDescriptors(I)):p(Object(I)).forEach(function(b){Object.defineProperty(x,b,Object.getOwnPropertyDescriptor(I,b))})}return x}})},\"5692\":function(t,r,n){var o=n(\"c430\"),s=n(\"c6cd\");(t.exports=function(i,a){return s[i]||(s[i]=a!==void 0?a:{})})(\"versions\",[]).push({version:\"3.23.1\",mode:o?\"pure\":\"global\",copyright:\"\\xA9 2014-2022 Denis Pushkarev (zloirock.ru)\",license:\"https://github.com/zloirock/core-js/blob/v3.23.1/LICENSE\",source:\"https://github.com/zloirock/core-js\"})},\"56ef\":function(t,r,n){var o=n(\"d066\"),s=n(\"e330\"),i=n(\"241c\"),a=n(\"7418\"),l=n(\"825a\"),u=s([].concat);t.exports=o(\"Reflect\",\"ownKeys\")||function(c){var d=i.f(l(c)),v=a.f;return v?u(d,v(c)):d}},\"577e\":function(t,r,n){var o=n(\"f5df\"),s=String;t.exports=function(i){if(o(i)===\"Symbol\")throw TypeError(\"Cannot convert a Symbol value to a string\");return s(i)}},\"57b9\":function(t,r,n){var o=n(\"c65b\"),s=n(\"d066\"),i=n(\"b622\"),a=n(\"cb2d\");t.exports=function(){var l=s(\"Symbol\"),u=l&&l.prototype,f=u&&u.valueOf,c=i(\"toPrimitive\");u&&!u[c]&&a(u,c,function(d){return o(f,this)},{arity:1})}},\"5899\":function(t,r){t.exports=`\t\n\\v\\f\\r \\xA0\\u1680\\u2000\\u2001\\u2002\\u2003\\u2004\\u2005\\u2006\\u2007\\u2008\\u2009\\u200A\\u202F\\u205F\\u3000\\u2028\\u2029\\uFEFF`},\"58a8\":function(t,r,n){var o=n(\"e330\"),s=n(\"1d80\"),i=n(\"577e\"),a=n(\"5899\"),l=o(\"\".replace),u=\"[\"+a+\"]\",f=RegExp(\"^\"+u+u+\"*\"),c=RegExp(u+u+\"*$\"),d=function(v){return function(g){var y=i(s(g));return v&1&&(y=l(y,f,\"\")),v&2&&(y=l(y,c,\"\")),y}};t.exports={start:d(1),end:d(2),trim:d(3)}},\"5926\":function(t,r,n){var o=n(\"b42e\");t.exports=function(s){var i=+s;return i!==i||i===0?0:o(i)}},\"59ed\":function(t,r,n){var o=n(\"1626\"),s=n(\"0d51\"),i=TypeError;t.exports=function(a){if(o(a))return a;throw i(s(a)+\" is not a function\")}},\"5a47\":function(t,r,n){var o=n(\"23e7\"),s=n(\"4930\"),i=n(\"d039\"),a=n(\"7418\"),l=n(\"7b0b\"),u=!s||i(function(){a.f(1)});o({target:\"Object\",stat:!0,forced:u},{getOwnPropertySymbols:function(c){var d=a.f;return d?d(l(c)):[]}})},\"5c6c\":function(t,r){t.exports=function(n,o){return{enumerable:!(n&1),configurable:!(n&2),writable:!(n&4),value:o}}},\"5e77\":function(t,r,n){var o=n(\"83ab\"),s=n(\"1a2d\"),i=Function.prototype,a=o&&Object.getOwnPropertyDescriptor,l=s(i,\"name\"),u=l&&function(){}.name===\"something\",f=l&&(!o||o&&a(i,\"name\").configurable);t.exports={EXISTS:l,PROPER:u,CONFIGURABLE:f}},\"6005\":function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r,n(\"6b75\")],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a,l){Object.defineProperty(a,\"__esModule\",{value:!0}),a.default=f,l=u(l);function u(c){return c&&c.__esModule?c:{default:c}}function f(c){if(Array.isArray(c))return(0,l.default)(c)}})},\"6374\":function(t,r,n){var o=n(\"da84\"),s=Object.defineProperty;t.exports=function(i,a){try{s(o,i,{value:a,configurable:!0,writable:!0})}catch(l){o[i]=a}return a}},\"6547\":function(t,r,n){var o=n(\"e330\"),s=n(\"5926\"),i=n(\"577e\"),a=n(\"1d80\"),l=o(\"\".charAt),u=o(\"\".charCodeAt),f=o(\"\".slice),c=function(d){return function(v,g){var y=i(a(v)),m=s(g),p=y.length,h,x;return m<0||m>=p?d?\"\":void 0:(h=u(y,m),h<55296||h>56319||m+1===p||(x=u(y,m+1))<56320||x>57343?d?l(y,m):h:d?f(y,m,m+2):(h-55296<<10)+(x-56320)+65536)}};t.exports={codeAt:c(!1),charAt:c(!0)}},\"65f0\":function(t,r,n){var o=n(\"0b42\");t.exports=function(s,i){return new(o(s))(i===0?0:i)}},\"68ee\":function(t,r,n){var o=n(\"e330\"),s=n(\"d039\"),i=n(\"1626\"),a=n(\"f5df\"),l=n(\"d066\"),u=n(\"8925\"),f=function(){},c=[],d=l(\"Reflect\",\"construct\"),v=/^\\s*(?:class|function)\\b/,g=o(v.exec),y=!v.exec(f),m=function(x){if(!i(x))return!1;try{return d(f,c,x),!0}catch(A){return!1}},p=function(x){if(!i(x))return!1;switch(a(x)){case\"AsyncFunction\":case\"GeneratorFunction\":case\"AsyncGeneratorFunction\":return!1}try{return y||!!g(v,u(x))}catch(A){return!0}};p.sham=!0,t.exports=!d||s(function(){var h;return m(m.call)||!m(Object)||!m(function(){h=!0})||h})?p:m},\"6964\":function(t,r,n){var o=n(\"cb2d\");t.exports=function(s,i,a){for(var l in i)o(s,l,i[l],a);return s}},\"69f3\":function(t,r,n){var o=n(\"7f9a\"),s=n(\"da84\"),i=n(\"e330\"),a=n(\"861d\"),l=n(\"9112\"),u=n(\"1a2d\"),f=n(\"c6cd\"),c=n(\"f772\"),d=n(\"d012\"),v=\"Object already initialized\",g=s.TypeError,y=s.WeakMap,m,p,h,x=function(T){return h(T)?p(T):m(T,{})},A=function(T){return function(N){var P;if(!a(N)||(P=p(N)).type!==T)throw g(\"Incompatible receiver, \"+T+\" required\");return P}};if(o||f.state){var I=f.state||(f.state=new y),b=i(I.get),O=i(I.has),S=i(I.set);m=function(T,N){if(O(I,T))throw new g(v);return N.facade=T,S(I,T,N),N},p=function(T){return b(I,T)||{}},h=function(T){return O(I,T)}}else{var C=c(\"state\");d[C]=!0,m=function(T,N){if(u(T,C))throw new g(v);return N.facade=T,l(T,C,N),N},p=function(T){return u(T,C)?T[C]:{}},h=function(T){return u(T,C)}}t.exports={set:m,get:p,has:h,enforce:x,getterFor:A}},\"6b75\":function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a){Object.defineProperty(a,\"__esModule\",{value:!0}),a.default=l;function l(u,f){(f==null||f>u.length)&&(f=u.length);for(var c=0,d=new Array(f);c<f;c++)d[c]=u[c];return d}})},\"6c57\":function(t,r,n){var o=n(\"23e7\"),s=n(\"da84\");o({global:!0},{globalThis:s})},\"6d61\":function(t,r,n){var o=n(\"23e7\"),s=n(\"da84\"),i=n(\"e330\"),a=n(\"94ca\"),l=n(\"cb2d\"),u=n(\"f183\"),f=n(\"2266\"),c=n(\"19aa\"),d=n(\"1626\"),v=n(\"861d\"),g=n(\"d039\"),y=n(\"1c7e\"),m=n(\"d44e\"),p=n(\"7156\");t.exports=function(h,x,A){var I=h.indexOf(\"Map\")!==-1,b=h.indexOf(\"Weak\")!==-1,O=I?\"set\":\"add\",S=s[h],C=S&&S.prototype,T=S,N={},P=function(G){var st=i(C[G]);l(C,G,G==\"add\"?function(rt){return st(this,rt===0?0:rt),this}:G==\"delete\"?function(et){return b&&!v(et)?!1:st(this,et===0?0:et)}:G==\"get\"?function(rt){return b&&!v(rt)?void 0:st(this,rt===0?0:rt)}:G==\"has\"?function(rt){return b&&!v(rt)?!1:st(this,rt===0?0:rt)}:function(rt,gt){return st(this,rt===0?0:rt,gt),this})},F=a(h,!d(S)||!(b||C.forEach&&!g(function(){new S().entries().next()})));if(F)T=A.getConstructor(x,h,I,O),u.enable();else if(a(h,!0)){var H=new T,w=H[O](b?{}:-0,1)!=H,B=g(function(){H.has(1)}),M=y(function(G){new S(G)}),j=!b&&g(function(){for(var G=new S,st=5;st--;)G[O](st,st);return!G.has(-0)});M||(T=x(function(G,st){c(G,C);var et=p(new S,G,T);return st!=null&&f(st,et[O],{that:et,AS_ENTRIES:I}),et}),T.prototype=C,C.constructor=T),(B||j)&&(P(\"delete\"),P(\"has\"),I&&P(\"get\")),(j||w)&&P(O),b&&C.clear&&delete C.clear}return N[h]=T,o({global:!0,constructor:!0,forced:T!=S},N),m(T,h),b||A.setStrong(T,h,I),T}},\"7037\":function(t,r,n){n(\"a4d3\"),n(\"e01a\"),n(\"d3b7\"),n(\"d28b\"),n(\"e260\"),n(\"3ca3\"),n(\"ddb0\");function o(s){return t.exports=o=typeof Symbol==\"function\"&&typeof Symbol.iterator==\"symbol\"?function(i){return typeof i}:function(i){return i&&typeof Symbol==\"function\"&&i.constructor===Symbol&&i!==Symbol.prototype?\"symbol\":typeof i},t.exports.__esModule=!0,t.exports.default=t.exports,o(s)}t.exports=o,t.exports.__esModule=!0,t.exports.default=t.exports},\"7156\":function(t,r,n){var o=n(\"1626\"),s=n(\"861d\"),i=n(\"d2bb\");t.exports=function(a,l,u){var f,c;return i&&o(f=l.constructor)&&f!==u&&s(c=f.prototype)&&c!==u.prototype&&i(a,c),a}},\"7418\":function(t,r){r.f=Object.getOwnPropertySymbols},\"746f\":function(t,r,n){var o=n(\"428f\"),s=n(\"1a2d\"),i=n(\"e538\"),a=n(\"9bf2\").f;t.exports=function(l){var u=o.Symbol||(o.Symbol={});s(u,l)||a(u,l,{value:i.f(l)})}},\"74d2\":function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r,n(\"a4d3\"),n(\"e01a\"),n(\"d81d\"),n(\"b0c0\"),n(\"8bbf\"),n(\"5530\"),n(\"e74d\"),n(\"ad2f\"),n(\"e74d\"),n(\"33fc\")],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a,l,u,f,c,d,v,g,y,m,p){var h=n(\"4ea4\").default,x=n(\"dbce\").default;Object.defineProperty(a,\"__esModule\",{value:!0}),a.default=void 0,d=x(d),v=h(v);var A={props:{schema:Object,formData:Object},setup:function(b,O){var S=O.emit;if(!b.schema)return null;var C=(0,d.toRefs)(b),T=C.formData,N=C.schema,P=(0,g.resolve)(b.schema,T.value);S(\"on-change\",P),(0,d.watch)(T,function(){P=(0,g.resolve)(b.schema,T.value),S(\"on-validate\",(0,g.getValidateList)(P,b.schema))}),(0,d.watch)(N.value,function(){P=(0,g.resolve)(b.schema,T.value),S(\"on-change\",P)});var F=function(B,M){S(\"on-change\",(0,g.clone)(M))},H={apply:function(B,M){B&&B((0,v.default)((0,v.default)({},b.formData),{},{$apply:M}))},reset:function(B){location.reload(),B&&B()}};return function(){var w,B;return d.createVNode(\"div\",{className:\"vue-form-render\"},[b.schema.title&&d.createVNode(\"h2\",null,[(0,m.i18n)(b.schema.title)]),b.schema.description&&d.createVNode(\"div\",{className:\"cbi-map-descr\",innerHTML:(0,m.i18n)(b.schema.description)},null),(w=b.schema)===null||w===void 0||(B=w.containers)===null||B===void 0?void 0:B.map(function(M){var j=y.widgets.object;return d.createVNode(j,{schema:M,formData:P,value:P,name:\"$form\",onChange:F},null)}),d.createVNode(\"span\",{className:\"cbi-page-actions control-group\"},[b.schema.actions&&b.schema.actions.map(function(M){var j=M.type,G=M.name,st=M.text,et=M.callback;return d.createVNode(\"input\",{className:\"btn cbi-button cbi-button-\".concat(j),type:\"button\",value:(0,m.i18n)(st),onClick:function(){return H[j](et,G)}},null)})])])}}};a.default=A})},\"7839\":function(t,r){t.exports=[\"constructor\",\"hasOwnProperty\",\"isPrototypeOf\",\"propertyIsEnumerable\",\"toLocaleString\",\"toString\",\"valueOf\"]},\"785a\":function(t,r,n){var o=n(\"cc12\"),s=o(\"span\").classList,i=s&&s.constructor&&s.constructor.prototype;t.exports=i===Object.prototype?void 0:i},\"7b0b\":function(t,r,n){var o=n(\"1d80\"),s=Object;t.exports=function(i){return s(o(i))}},\"7c73\":function(t,r,n){var o=n(\"825a\"),s=n(\"37e8\"),i=n(\"7839\"),a=n(\"d012\"),l=n(\"1be4\"),u=n(\"cc12\"),f=n(\"f772\"),c=\">\",d=\"<\",v=\"prototype\",g=\"script\",y=f(\"IE_PROTO\"),m=function(){},p=function(b){return d+g+c+b+d+\"/\"+g+c},h=function(b){b.write(p(\"\")),b.close();var O=b.parentWindow.Object;return b=null,O},x=function(){var b=u(\"iframe\"),O=\"java\"+g+\":\",S;return b.style.display=\"none\",l.appendChild(b),b.src=String(O),S=b.contentWindow.document,S.open(),S.write(p(\"document.F=Object\")),S.close(),S.F},A,I=function(){try{A=new ActiveXObject(\"htmlfile\")}catch(O){}I=typeof document!=\"undefined\"?document.domain&&A?h(A):x():h(A);for(var b=i.length;b--;)delete I[v][i[b]];return I()};a[y]=!0,t.exports=Object.create||function(O,S){var C;return O!==null?(m[v]=o(O),C=new m,m[v]=null,C[y]=O):C=I(),S===void 0?C:s.f(C,S)}},\"7db0\":function(t,r,n){var o=n(\"23e7\"),s=n(\"b727\").find,i=n(\"44d2\"),a=\"find\",l=!0;a in[]&&Array(1)[a](function(){l=!1}),o({target:\"Array\",proto:!0,forced:l},{find:function(f){return s(this,f,arguments.length>1?arguments[1]:void 0)}}),i(a)},\"7dd0\":function(t,r,n){var o=n(\"23e7\"),s=n(\"c65b\"),i=n(\"c430\"),a=n(\"5e77\"),l=n(\"1626\"),u=n(\"9ed3\"),f=n(\"e163\"),c=n(\"d2bb\"),d=n(\"d44e\"),v=n(\"9112\"),g=n(\"cb2d\"),y=n(\"b622\"),m=n(\"3f8c\"),p=n(\"ae93\"),h=a.PROPER,x=a.CONFIGURABLE,A=p.IteratorPrototype,I=p.BUGGY_SAFARI_ITERATORS,b=y(\"iterator\"),O=\"keys\",S=\"values\",C=\"entries\",T=function(){return this};t.exports=function(N,P,F,H,w,B,M){u(F,P,H);var j=function(Z){if(Z===w&&gt)return gt;if(!I&&Z in et)return et[Z];switch(Z){case O:return function(){return new F(this,Z)};case S:return function(){return new F(this,Z)};case C:return function(){return new F(this,Z)}}return function(){return new F(this)}},G=P+\" Iterator\",st=!1,et=N.prototype,rt=et[b]||et[\"@@iterator\"]||w&&et[w],gt=!I&&rt||j(w),z=P==\"Array\"&&et.entries||rt,_,lt,Q;if(z&&(_=f(z.call(new N)),_!==Object.prototype&&_.next&&(!i&&f(_)!==A&&(c?c(_,A):l(_[b])||g(_,b,T)),d(_,G,!0,!0),i&&(m[G]=T))),h&&w==S&&rt&&rt.name!==S&&(!i&&x?v(et,\"name\",S):(st=!0,gt=function(){return s(rt,this)})),w)if(lt={values:j(S),keys:B?gt:j(O),entries:j(C)},M)for(Q in lt)(I||st||!(Q in et))&&g(et,Q,lt[Q]);else o({target:P,proto:!0,forced:I||st},lt);return(!i||M)&&et[b]!==gt&&g(et,b,gt,{name:w}),m[P]=gt,lt}},\"7f9a\":function(t,r,n){var o=n(\"da84\"),s=n(\"1626\"),i=n(\"8925\"),a=o.WeakMap;t.exports=s(a)&&/native code/.test(i(a))},\"825a\":function(t,r,n){var o=n(\"861d\"),s=String,i=TypeError;t.exports=function(a){if(o(a))return a;throw i(s(a)+\" is not an object\")}},\"83ab\":function(t,r,n){var o=n(\"d039\");t.exports=!o(function(){return Object.defineProperty({},1,{get:function(){return 7}})[1]!=7})},\"8418\":function(t,r,n){var o=n(\"a04b\"),s=n(\"9bf2\"),i=n(\"5c6c\");t.exports=function(a,l,u){var f=o(l);f in a?s.f(a,f,i(0,u)):a[f]=u}},\"861d\":function(t,r,n){var o=n(\"1626\");t.exports=function(s){return typeof s==\"object\"?s!==null:o(s)}},\"8875\":function(t,r,n){var o,s,i;(function(a,l){s=[],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)})(typeof self!=\"undefined\"?self:this,function(){function a(){var l=Object.getOwnPropertyDescriptor(document,\"currentScript\");if(!l&&\"currentScript\"in document&&document.currentScript||l&&l.get!==a&&document.currentScript)return document.currentScript;try{throw new Error}catch(A){var u=/.*at [^(]*\\((.*):(.+):(.+)\\)$/ig,f=/@([^@]*):(\\d+):(\\d+)\\s*$/ig,c=u.exec(A.stack)||f.exec(A.stack),d=c&&c[1]||!1,v=c&&c[2]||!1,g=document.location.href.replace(document.location.hash,\"\"),y,m,p,h=document.getElementsByTagName(\"script\");d===g&&(y=document.documentElement.outerHTML,m=new RegExp(\"(?:[^\\\\n]+?\\\\n){0,\"+(v-2)+\"}[^<]*<script>([\\\\d\\\\D]*?)<\\\\/script>[\\\\d\\\\D]*\",\"i\"),p=y.replace(m,\"$1\").trim());for(var x=0;x<h.length;x++)if(h[x].readyState===\"interactive\"||h[x].src===d||d===g&&h[x].innerHTML&&h[x].innerHTML.trim()===p)return h[x];return null}}return a})},\"8925\":function(t,r,n){var o=n(\"e330\"),s=n(\"1626\"),i=n(\"c6cd\"),a=o(Function.toString);s(i.inspectSource)||(i.inspectSource=function(l){return a(l)}),t.exports=i.inspectSource},\"8aa5\":function(t,r,n){var o=n(\"6547\").charAt;t.exports=function(s,i,a){return i+(a?o(s,i).length:1)}},\"8bbf\":function(t,r){t.exports=Ev},\"90d8\":function(t,r,n){var o=n(\"c65b\"),s=n(\"1a2d\"),i=n(\"3a9b\"),a=n(\"ad6d\"),l=RegExp.prototype;t.exports=function(u){var f=u.flags;return f===void 0&&!(\"flags\"in l)&&!s(u,\"flags\")&&i(l,u)?o(a,u):f}},\"90e3\":function(t,r,n){var o=n(\"e330\"),s=0,i=Math.random(),a=o(1 .toString);t.exports=function(l){return\"Symbol(\"+(l===void 0?\"\":l)+\")_\"+a(++s+i,36)}},\"9112\":function(t,r,n){var o=n(\"83ab\"),s=n(\"9bf2\"),i=n(\"5c6c\");t.exports=o?function(a,l,u){return s.f(a,l,i(1,u))}:function(a,l,u){return a[l]=u,a}},\"9263\":function(t,r,n){var o=n(\"c65b\"),s=n(\"e330\"),i=n(\"577e\"),a=n(\"ad6d\"),l=n(\"9f7f\"),u=n(\"5692\"),f=n(\"7c73\"),c=n(\"69f3\").get,d=n(\"fce3\"),v=n(\"107c\"),g=u(\"native-string-replace\",String.prototype.replace),y=RegExp.prototype.exec,m=y,p=s(\"\".charAt),h=s(\"\".indexOf),x=s(\"\".replace),A=s(\"\".slice),I=function(){var C=/a/,T=/b*/g;return o(y,C,\"a\"),o(y,T,\"a\"),C.lastIndex!==0||T.lastIndex!==0}(),b=l.BROKEN_CARET,O=/()??/.exec(\"\")[1]!==void 0,S=I||O||b||d||v;S&&(m=function(T){var N=this,P=c(N),F=i(T),H=P.raw,w,B,M,j,G,st,et;if(H)return H.lastIndex=N.lastIndex,w=o(m,H,F),N.lastIndex=H.lastIndex,w;var rt=P.groups,gt=b&&N.sticky,z=o(a,N),_=N.source,lt=0,Q=F;if(gt&&(z=x(z,\"y\",\"\"),h(z,\"g\")===-1&&(z+=\"g\"),Q=A(F,N.lastIndex),N.lastIndex>0&&(!N.multiline||N.multiline&&p(F,N.lastIndex-1)!==`\n`)&&(_=\"(?: \"+_+\")\",Q=\" \"+Q,lt++),B=new RegExp(\"^(?:\"+_+\")\",z)),O&&(B=new RegExp(\"^\"+_+\"$(?!\\\\s)\",z)),I&&(M=N.lastIndex),j=o(y,gt?B:N,Q),gt?j?(j.input=A(j.input,lt),j[0]=A(j[0],lt),j.index=N.lastIndex,N.lastIndex+=j[0].length):N.lastIndex=0:I&&j&&(N.lastIndex=N.global?j.index+j[0].length:M),O&&j&&j.length>1&&o(g,j[0],B,function(){for(G=1;G<arguments.length-2;G++)arguments[G]===void 0&&(j[G]=void 0)}),j&&rt)for(j.groups=st=f(null),G=0;G<rt.length;G++)et=rt[G],st[et[0]]=j[et[1]];return j}),t.exports=m},\"94ca\":function(t,r,n){var o=n(\"d039\"),s=n(\"1626\"),i=/#|\\.prototype\\./,a=function(d,v){var g=u[l(d)];return g==c?!0:g==f?!1:s(v)?o(v):!!v},l=a.normalize=function(d){return String(d).replace(i,\".\").toLowerCase()},u=a.data={},f=a.NATIVE=\"N\",c=a.POLYFILL=\"P\";t.exports=a},\"954e\":function(t,r,n){},\"99af\":function(t,r,n){var o=n(\"23e7\"),s=n(\"d039\"),i=n(\"e8b5\"),a=n(\"861d\"),l=n(\"7b0b\"),u=n(\"07fa\"),f=n(\"3511\"),c=n(\"8418\"),d=n(\"65f0\"),v=n(\"1dde\"),g=n(\"b622\"),y=n(\"2d00\"),m=g(\"isConcatSpreadable\"),p=y>=51||!s(function(){var I=[];return I[m]=!1,I.concat()[0]!==I}),h=v(\"concat\"),x=function(I){if(!a(I))return!1;var b=I[m];return b!==void 0?!!b:i(I)},A=!p||!h;o({target:\"Array\",proto:!0,arity:1,forced:A},{concat:function(b){var O=l(this),S=d(O,0),C=0,T,N,P,F,H;for(T=-1,P=arguments.length;T<P;T++)if(H=T===-1?O:arguments[T],x(H))for(F=u(H),f(C+F),N=0;N<F;N++,C++)N in H&&c(S,C,H[N]);else f(C+1),c(S,C++,H);return S.length=C,S}})},\"9a1f\":function(t,r,n){var o=n(\"c65b\"),s=n(\"59ed\"),i=n(\"825a\"),a=n(\"0d51\"),l=n(\"35a1\"),u=TypeError;t.exports=function(f,c){var d=arguments.length<2?l(f):c;if(s(d))return i(o(d,f));throw u(a(f)+\" is not iterable\")}},\"9bdd\":function(t,r,n){var o=n(\"825a\"),s=n(\"2a62\");t.exports=function(i,a,l,u){try{return u?a(o(l)[0],l[1]):a(l)}catch(f){s(i,\"throw\",f)}}},\"9bf2\":function(t,r,n){var o=n(\"83ab\"),s=n(\"0cfb\"),i=n(\"aed9\"),a=n(\"825a\"),l=n(\"a04b\"),u=TypeError,f=Object.defineProperty,c=Object.getOwnPropertyDescriptor,d=\"enumerable\",v=\"configurable\",g=\"writable\";r.f=o?i?function(m,p,h){if(a(m),p=l(p),a(h),typeof m==\"function\"&&p===\"prototype\"&&\"value\"in h&&g in h&&!h[g]){var x=c(m,p);x&&x[g]&&(m[p]=h.value,h={configurable:v in h?h[v]:x[v],enumerable:d in h?h[d]:x[d],writable:!1})}return f(m,p,h)}:f:function(m,p,h){if(a(m),p=l(p),a(h),s)try{return f(m,p,h)}catch(x){}if(\"get\"in h||\"set\"in h)throw u(\"Accessors not supported\");return\"value\"in h&&(m[p]=h.value),m}},\"9ed3\":function(t,r,n){var o=n(\"ae93\").IteratorPrototype,s=n(\"7c73\"),i=n(\"5c6c\"),a=n(\"d44e\"),l=n(\"3f8c\"),u=function(){return this};t.exports=function(f,c,d,v){var g=c+\" Iterator\";return f.prototype=s(o,{next:i(+!v,d)}),a(f,g,!1,!0),l[g]=u,f}},\"9f7f\":function(t,r,n){var o=n(\"d039\"),s=n(\"da84\"),i=s.RegExp,a=o(function(){var f=i(\"a\",\"y\");return f.lastIndex=2,f.exec(\"abcd\")!=null}),l=a||o(function(){return!i(\"a\",\"y\").sticky}),u=a||o(function(){var f=i(\"^r\",\"gy\");return f.lastIndex=2,f.exec(\"str\")!=null});t.exports={BROKEN_CARET:u,MISSED_STICKY:l,UNSUPPORTED_Y:a}},a04b:function(t,r,n){var o=n(\"c04e\"),s=n(\"d9b5\");t.exports=function(i){var a=o(i,\"string\");return s(a)?a:a+\"\"}},a4d3:function(t,r,n){n(\"d9f5\"),n(\"b4f8\"),n(\"c513\"),n(\"e9c4\"),n(\"5a47\")},a630:function(t,r,n){var o=n(\"23e7\"),s=n(\"4df4\"),i=n(\"1c7e\"),a=!i(function(l){Array.from(l)});o({target:\"Array\",stat:!0,forced:a},{from:s})},a640:function(t,r,n){var o=n(\"d039\");t.exports=function(s,i){var a=[][s];return!!a&&o(function(){a.call(null,i||function(){return 1},1)})}},a9e3:function(t,r,n){var o=n(\"83ab\"),s=n(\"da84\"),i=n(\"e330\"),a=n(\"94ca\"),l=n(\"cb2d\"),u=n(\"1a2d\"),f=n(\"7156\"),c=n(\"3a9b\"),d=n(\"d9b5\"),v=n(\"c04e\"),g=n(\"d039\"),y=n(\"241c\").f,m=n(\"06cf\").f,p=n(\"9bf2\").f,h=n(\"408a\"),x=n(\"58a8\").trim,A=\"Number\",I=s[A],b=I.prototype,O=s.TypeError,S=i(\"\".slice),C=i(\"\".charCodeAt),T=function(B){var M=v(B,\"number\");return typeof M==\"bigint\"?M:N(M)},N=function(B){var M=v(B,\"number\"),j,G,st,et,rt,gt,z,_;if(d(M))throw O(\"Cannot convert a Symbol value to a number\");if(typeof M==\"string\"&&M.length>2){if(M=x(M),j=C(M,0),j===43||j===45){if(G=C(M,2),G===88||G===120)return NaN}else if(j===48){switch(C(M,1)){case 66:case 98:st=2,et=49;break;case 79:case 111:st=8,et=55;break;default:return+M}for(rt=S(M,2),gt=rt.length,z=0;z<gt;z++)if(_=C(rt,z),_<48||_>et)return NaN;return parseInt(rt,st)}}return+M};if(a(A,!I(\" 0o1\")||!I(\"0b1\")||I(\"+0x1\"))){for(var P=function(M){var j=arguments.length<1?0:I(T(M)),G=this;return c(b,G)&&g(function(){h(G)})?f(Object(j),G,P):j},F=o?y(I):\"MAX_VALUE,MIN_VALUE,NaN,NEGATIVE_INFINITY,POSITIVE_INFINITY,EPSILON,MAX_SAFE_INTEGER,MIN_SAFE_INTEGER,isFinite,isInteger,isNaN,isSafeInteger,parseFloat,parseInt,fromString,range\".split(\",\"),H=0,w;F.length>H;H++)u(I,w=F[H])&&!u(P,w)&&p(P,w,m(I,w));P.prototype=b,b.constructor=P,l(s,A,P,{constructor:!0})}},ab36:function(t,r,n){var o=n(\"861d\"),s=n(\"9112\");t.exports=function(i,a){o(a)&&\"cause\"in a&&s(i,\"cause\",a.cause)}},ac1f:function(t,r,n){var o=n(\"23e7\"),s=n(\"9263\");o({target:\"RegExp\",proto:!0,forced:/./.exec!==s},{exec:s})},acac:function(t,r,n){var o=n(\"e330\"),s=n(\"6964\"),i=n(\"f183\").getWeakData,a=n(\"825a\"),l=n(\"861d\"),u=n(\"19aa\"),f=n(\"2266\"),c=n(\"b727\"),d=n(\"1a2d\"),v=n(\"69f3\"),g=v.set,y=v.getterFor,m=c.find,p=c.findIndex,h=o([].splice),x=0,A=function(O){return O.frozen||(O.frozen=new I)},I=function(){this.entries=[]},b=function(O,S){return m(O.entries,function(C){return C[0]===S})};I.prototype={get:function(O){var S=b(this,O);if(S)return S[1]},has:function(O){return!!b(this,O)},set:function(O,S){var C=b(this,O);C?C[1]=S:this.entries.push([O,S])},delete:function(O){var S=p(this.entries,function(C){return C[0]===O});return~S&&h(this.entries,S,1),!!~S}},t.exports={getConstructor:function(O,S,C,T){var N=O(function(w,B){u(w,P),g(w,{type:S,id:x++,frozen:void 0}),B!=null&&f(B,w[T],{that:w,AS_ENTRIES:C})}),P=N.prototype,F=y(S),H=function(w,B,M){var j=F(w),G=i(a(B),!0);return G===!0?A(j).set(B,M):G[j.id]=M,w};return s(P,{delete:function(w){var B=F(this);if(!l(w))return!1;var M=i(w);return M===!0?A(B).delete(w):M&&d(M,B.id)&&delete M[B.id]},has:function(B){var M=F(this);if(!l(B))return!1;var j=i(B);return j===!0?A(M).has(B):j&&d(j,M.id)}}),s(P,C?{get:function(B){var M=F(this);if(l(B)){var j=i(B);return j===!0?A(M).get(B):j?j[M.id]:void 0}},set:function(B,M){return H(this,B,M)}}:{add:function(B){return H(this,B,!0)}}),N}}},ad2f:function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r,n(\"ade3\"),n(\"5530\"),n(\"8bbf\"),n(\"a9e3\"),n(\"a4d3\"),n(\"e01a\"),n(\"d81d\"),n(\"b0c0\"),n(\"e74d\"),n(\"fe39\"),n(\"5092\"),n(\"954e\")],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a,l,u,f,c,d,v,g,y,m,p,h,x){var A=n(\"dbce\").default,I=n(\"4ea4\").default;Object.defineProperty(a,\"__esModule\",{value:!0}),a.widgets=a.mapping=void 0,l=I(l),u=I(u),f=A(f),p=I(p),h=I(h);var b={props:{schema:Object,formData:Object,value:[String,Number,Boolean,Object],onChange:Function,name:String},setup:function(T){return function(){var N=(0,m.getSubSchemas)(T.schema);return f.createVNode(\"div\",{className:\"cbi-section\"},[T.schema.title&&f.createVNode(\"h2\",null,[(0,m.i18n)(T.schema.title)]),T.schema.description&&f.createVNode(\"div\",{className:\"cbi-map-descr\",innerHTML:(0,m.i18n)(T.schema.description)},null),f.createVNode(\"div\",{className:\"cbi-section-node\"},[T.schema.labels&&T.schema.labels.map(function(P){var F=P.value;return f.createVNode(\"div\",{className:\"cbi-value\"},[f.createVNode(\"label\",{className:\"cbi-value-title\"},[(0,m.i18n)(P.key)]),f.createVNode(\"div\",{style:{paddingTop:\"0.25rem\"},innerHTML:F},null)])}),T.schema.properties&&T.schema.properties.map(function(P,F){var H=N[F].schema,w=S[O[H.type]],B=P.name;if(!w)return null;var M=(0,m.validate)({name:B,schema:H,value:T.value[B],required:T.schema.required});return f.createVNode(w,{style:(0,m.convertValue)(H[\"ui:hidden\"],T.value[B],T.value)?{display:\"none\"}:null,invalidText:M,value:T.value[B],schema:H,name:B,onChange:function(G,st){var et=(0,u.default)((0,u.default)({},T.value),{},(0,l.default)({},G,st));T.onChange(T.name,et)}},null)})])])}}},O={default:\"input\",string:\"input\",interger:\"input\",object:\"map\",boolean:\"boolean\"};a.mapping=O;var S={input:p.default,object:b,boolean:h.default};a.widgets=S})},ad6d:function(t,r,n){var o=n(\"825a\");t.exports=function(){var s=o(this),i=\"\";return s.hasIndices&&(i+=\"d\"),s.global&&(i+=\"g\"),s.ignoreCase&&(i+=\"i\"),s.multiline&&(i+=\"m\"),s.dotAll&&(i+=\"s\"),s.unicode&&(i+=\"u\"),s.unicodeSets&&(i+=\"v\"),s.sticky&&(i+=\"y\"),i}},ade3:function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a){Object.defineProperty(a,\"__esModule\",{value:!0}),a.default=l;function l(u,f,c){return f in u?Object.defineProperty(u,f,{value:c,enumerable:!0,configurable:!0,writable:!0}):u[f]=c,u}})},ae93:function(t,r,n){var o=n(\"d039\"),s=n(\"1626\"),i=n(\"7c73\"),a=n(\"e163\"),l=n(\"cb2d\"),u=n(\"b622\"),f=n(\"c430\"),c=u(\"iterator\"),d=!1,v,g,y;[].keys&&(y=[].keys(),\"next\"in y?(g=a(a(y)),g!==Object.prototype&&(v=g)):d=!0);var m=v==null||o(function(){var p={};return v[c].call(p)!==p});m?v={}:f&&(v=i(v)),s(v[c])||l(v,c,function(){return this}),t.exports={IteratorPrototype:v,BUGGY_SAFARI_ITERATORS:d}},aeb0:function(t,r,n){var o=n(\"9bf2\").f;t.exports=function(s,i,a){a in s||o(s,a,{configurable:!0,get:function(){return i[a]},set:function(l){i[a]=l}})}},aed9:function(t,r,n){var o=n(\"83ab\"),s=n(\"d039\");t.exports=o&&s(function(){return Object.defineProperty(function(){},\"prototype\",{value:42,writable:!1}).prototype!=42})},b041:function(t,r,n){var o=n(\"00ee\"),s=n(\"f5df\");t.exports=o?{}.toString:function(){return\"[object \"+s(this)+\"]\"}},b0c0:function(t,r,n){var o=n(\"83ab\"),s=n(\"5e77\").EXISTS,i=n(\"e330\"),a=n(\"9bf2\").f,l=Function.prototype,u=i(l.toString),f=/function\\b(?:\\s|\\/\\*[\\S\\s]*?\\*\\/|\\/\\/[^\\n\\r]*[\\n\\r]+)*([^\\s(/]*)/,c=i(f.exec),d=\"name\";o&&!s&&a(l,d,{configurable:!0,get:function(){try{return c(f,u(this))[1]}catch(v){return\"\"}}})},b42e:function(t,r){var n=Math.ceil,o=Math.floor;t.exports=Math.trunc||function(i){var a=+i;return(a>0?o:n)(a)}},b4f8:function(t,r,n){var o=n(\"23e7\"),s=n(\"d066\"),i=n(\"1a2d\"),a=n(\"577e\"),l=n(\"5692\"),u=n(\"3d87\"),f=l(\"string-to-symbol-registry\"),c=l(\"symbol-to-string-registry\");o({target:\"Symbol\",stat:!0,forced:!u},{for:function(d){var v=a(d);if(i(f,v))return f[v];var g=s(\"Symbol\")(v);return f[v]=g,c[g]=v,g}})},b622:function(t,r,n){var o=n(\"da84\"),s=n(\"5692\"),i=n(\"1a2d\"),a=n(\"90e3\"),l=n(\"4930\"),u=n(\"fdbf\"),f=s(\"wks\"),c=o.Symbol,d=c&&c.for,v=u?c:c&&c.withoutSetter||a;t.exports=function(g){if(!i(f,g)||!(l||typeof f[g]==\"string\")){var y=\"Symbol.\"+g;l&&i(c,g)?f[g]=c[g]:u&&d?f[g]=d(y):f[g]=v(y)}return f[g]}},b64b:function(t,r,n){var o=n(\"23e7\"),s=n(\"7b0b\"),i=n(\"df75\"),a=n(\"d039\"),l=a(function(){i(1)});o({target:\"Object\",stat:!0,forced:l},{keys:function(f){return i(s(f))}})},b727:function(t,r,n){var o=n(\"0366\"),s=n(\"e330\"),i=n(\"44ad\"),a=n(\"7b0b\"),l=n(\"07fa\"),u=n(\"65f0\"),f=s([].push),c=function(d){var v=d==1,g=d==2,y=d==3,m=d==4,p=d==6,h=d==7,x=d==5||p;return function(A,I,b,O){for(var S=a(A),C=i(S),T=o(I,b),N=l(C),P=0,F=O||u,H=v?F(A,N):g||h?F(A,0):void 0,w,B;N>P;P++)if((x||P in C)&&(w=C[P],B=T(w,P,S),d))if(v)H[P]=B;else if(B)switch(d){case 3:return!0;case 5:return w;case 6:return P;case 2:f(H,w)}else switch(d){case 4:return!1;case 7:f(H,w)}return p?-1:y||m?m:H}};t.exports={forEach:c(0),map:c(1),filter:c(2),some:c(3),every:c(4),find:c(5),findIndex:c(6),filterReject:c(7)}},b980:function(t,r,n){var o=n(\"d039\"),s=n(\"5c6c\");t.exports=!o(function(){var i=Error(\"a\");return\"stack\"in i?(Object.defineProperty(i,\"stack\",s(1,7)),i.stack!==7):!0})},bb2f:function(t,r,n){var o=n(\"d039\");t.exports=!o(function(){return Object.isExtensible(Object.preventExtensions({}))})},c04e:function(t,r,n){var o=n(\"c65b\"),s=n(\"861d\"),i=n(\"d9b5\"),a=n(\"dc4a\"),l=n(\"485a\"),u=n(\"b622\"),f=TypeError,c=u(\"toPrimitive\");t.exports=function(d,v){if(!s(d)||i(d))return d;var g=a(d,c),y;if(g){if(v===void 0&&(v=\"default\"),y=o(g,d,v),!s(y)||i(y))return y;throw f(\"Can't convert object to primitive value\")}return v===void 0&&(v=\"number\"),l(d,v)}},c430:function(t,r){t.exports=!1},c513:function(t,r,n){var o=n(\"23e7\"),s=n(\"1a2d\"),i=n(\"d9b5\"),a=n(\"0d51\"),l=n(\"5692\"),u=n(\"3d87\"),f=l(\"symbol-to-string-registry\");o({target:\"Symbol\",stat:!0,forced:!u},{keyFor:function(d){if(!i(d))throw TypeError(a(d)+\" is not a symbol\");if(s(f,d))return f[d]}})},c607:function(t,r,n){var o=n(\"83ab\"),s=n(\"fce3\"),i=n(\"c6b6\"),a=n(\"edd0\"),l=n(\"69f3\").get,u=RegExp.prototype,f=TypeError;o&&s&&a(u,\"dotAll\",{configurable:!0,get:function(){if(this!==u){if(i(this)===\"RegExp\")return!!l(this).dotAll;throw f(\"Incompatible receiver, RegExp required\")}}})},c65b:function(t,r,n){var o=n(\"40d5\"),s=Function.prototype.call;t.exports=o?s.bind(s):function(){return s.apply(s,arguments)}},c6b6:function(t,r,n){var o=n(\"e330\"),s=o({}.toString),i=o(\"\".slice);t.exports=function(a){return i(s(a),8,-1)}},c6cd:function(t,r,n){var o=n(\"da84\"),s=n(\"6374\"),i=\"__core-js_shared__\",a=o[i]||s(i,{});t.exports=a},c740:function(t,r,n){var o=n(\"23e7\"),s=n(\"b727\").findIndex,i=n(\"44d2\"),a=\"findIndex\",l=!0;a in[]&&Array(1)[a](function(){l=!1}),o({target:\"Array\",proto:!0,forced:l},{findIndex:function(f){return s(this,f,arguments.length>1?arguments[1]:void 0)}}),i(a)},c770:function(t,r,n){var o=n(\"e330\"),s=Error,i=o(\"\".replace),a=function(f){return String(s(f).stack)}(\"zxcasd\"),l=/\\n\\s*at [^:]*:[^\\n]*/,u=l.test(a);t.exports=function(f,c){if(u&&typeof f==\"string\"&&!s.prepareStackTrace)for(;c--;)f=i(f,l,\"\");return f}},c8ba:function(t,r){var n;n=function(){return this}();try{n=n||new Function(\"return this\")()}catch(o){typeof window==\"object\"&&(n=window)}t.exports=n},c8d2:function(t,r,n){var o=n(\"5e77\").PROPER,s=n(\"d039\"),i=n(\"5899\"),a=\"\\u200B\\x85\\u180E\";t.exports=function(l){return s(function(){return!!i[l]()||a[l]()!==a||o&&i[l].name!==l})}},ca84:function(t,r,n){var o=n(\"e330\"),s=n(\"1a2d\"),i=n(\"fc6a\"),a=n(\"4d64\").indexOf,l=n(\"d012\"),u=o([].push);t.exports=function(f,c){var d=i(f),v=0,g=[],y;for(y in d)!s(l,y)&&s(d,y)&&u(g,y);for(;c.length>v;)s(d,y=c[v++])&&(~a(g,y)||u(g,y));return g}},cb2d:function(t,r,n){var o=n(\"1626\"),s=n(\"9bf2\"),i=n(\"13d2\"),a=n(\"6374\");t.exports=function(l,u,f,c){c||(c={});var d=c.enumerable,v=c.name!==void 0?c.name:u;return o(f)&&i(f,v,c),c.global?d?l[u]=f:a(u,f):(c.unsafe?l[u]&&(d=!0):delete l[u],d?l[u]=f:s.f(l,u,{value:f,enumerable:!1,configurable:!c.nonConfigurable,writable:!c.nonWritable})),l}},cc12:function(t,r,n){var o=n(\"da84\"),s=n(\"861d\"),i=o.document,a=s(i)&&s(i.createElement);t.exports=function(l){return a?i.createElement(l):{}}},ccb5:function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r,n(\"b64b\")],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a,l){Object.defineProperty(a,\"__esModule\",{value:!0}),a.default=u;function u(f,c){if(f==null)return{};var d={},v=Object.keys(f),g,y;for(y=0;y<v.length;y++)g=v[y],!(c.indexOf(g)>=0)&&(d[g]=f[g]);return d}})},d012:function(t,r){t.exports={}},d039:function(t,r){t.exports=function(n){try{return!!n()}catch(o){return!0}}},d066:function(t,r,n){var o=n(\"da84\"),s=n(\"1626\"),i=function(a){return s(a)?a:void 0};t.exports=function(a,l){return arguments.length<2?i(o[a]):o[a]&&o[a][l]}},d1e7:function(t,r,n){var o={}.propertyIsEnumerable,s=Object.getOwnPropertyDescriptor,i=s&&!o.call({1:2},1);r.f=i?function(l){var u=s(this,l);return!!u&&u.enumerable}:o},d28b:function(t,r,n){var o=n(\"746f\");o(\"iterator\")},d2bb:function(t,r,n){var o=n(\"e330\"),s=n(\"825a\"),i=n(\"3bbe\");t.exports=Object.setPrototypeOf||(\"__proto__\"in{}?function(){var a=!1,l={},u;try{u=o(Object.getOwnPropertyDescriptor(Object.prototype,\"__proto__\").set),u(l,[]),a=l instanceof Array}catch(f){}return function(c,d){return s(c),i(d),a?u(c,d):c.__proto__=d,c}}():void 0)},d3b7:function(t,r,n){var o=n(\"00ee\"),s=n(\"cb2d\"),i=n(\"b041\");o||s(Object.prototype,\"toString\",i,{unsafe:!0})},d44e:function(t,r,n){var o=n(\"9bf2\").f,s=n(\"1a2d\"),i=n(\"b622\"),a=i(\"toStringTag\");t.exports=function(l,u,f){l&&!f&&(l=l.prototype),l&&!s(l,a)&&o(l,a,{configurable:!0,value:u})}},d784:function(t,r,n){n(\"ac1f\");var o=n(\"e330\"),s=n(\"cb2d\"),i=n(\"9263\"),a=n(\"d039\"),l=n(\"b622\"),u=n(\"9112\"),f=l(\"species\"),c=RegExp.prototype;t.exports=function(d,v,g,y){var m=l(d),p=!a(function(){var I={};return I[m]=function(){return 7},\"\"[d](I)!=7}),h=p&&!a(function(){var I=!1,b=/a/;return d===\"split\"&&(b={},b.constructor={},b.constructor[f]=function(){return b},b.flags=\"\",b[m]=/./[m]),b.exec=function(){return I=!0,null},b[m](\"\"),!I});if(!p||!h||g){var x=o(/./[m]),A=v(m,\"\"[d],function(I,b,O,S,C){var T=o(I),N=b.exec;return N===i||N===c.exec?p&&!C?{done:!0,value:x(b,O,S)}:{done:!0,value:T(O,b,S)}:{done:!1}});s(String.prototype,d,A[0]),s(c,m,A[1])}y&&u(c[m],\"sham\",!0)}},d81d:function(t,r,n){var o=n(\"23e7\"),s=n(\"b727\").map,i=n(\"1dde\"),a=i(\"map\");o({target:\"Array\",proto:!0,forced:!a},{map:function(u){return s(this,u,arguments.length>1?arguments[1]:void 0)}})},d86b:function(t,r,n){var o=n(\"d039\");t.exports=o(function(){if(typeof ArrayBuffer==\"function\"){var s=new ArrayBuffer(8);Object.isExtensible(s)&&Object.defineProperty(s,\"a\",{value:8})}})},d887:function(t,r,n){Object.defineProperty(r,\"__esModule\",{value:!0}),r.default=s;function o(i){return typeof Symbol==\"function\"&&typeof Symbol.iterator==\"symbol\"?o=function(l){return typeof l}:o=function(l){return l&&typeof Symbol==\"function\"&&l.constructor===Symbol&&l!==Symbol.prototype?\"symbol\":typeof l},o(i)}function s(i){var a=typeof i==\"string\"||i instanceof String;if(!a){var l=o(i);throw i===null?l=\"null\":l===\"object\"&&(l=i.constructor.name),new TypeError(\"Expected a string but received a \".concat(l))}}t.exports=r.default,t.exports.default=r.default},d9b5:function(t,r,n){var o=n(\"d066\"),s=n(\"1626\"),i=n(\"3a9b\"),a=n(\"fdbf\"),l=Object;t.exports=a?function(u){return typeof u==\"symbol\"}:function(u){var f=o(\"Symbol\");return s(f)&&i(f.prototype,l(u))}},d9e2:function(t,r,n){var o=n(\"23e7\"),s=n(\"da84\"),i=n(\"2ba4\"),a=n(\"e5cb\"),l=\"WebAssembly\",u=s[l],f=Error(\"e\",{cause:7}).cause!==7,c=function(v,g){var y={};y[v]=a(v,g,f),o({global:!0,constructor:!0,arity:1,forced:f},y)},d=function(v,g){if(u&&u[v]){var y={};y[v]=a(l+\".\"+v,g,f),o({target:l,stat:!0,constructor:!0,arity:1,forced:f},y)}};c(\"Error\",function(v){return function(y){return i(v,this,arguments)}}),c(\"EvalError\",function(v){return function(y){return i(v,this,arguments)}}),c(\"RangeError\",function(v){return function(y){return i(v,this,arguments)}}),c(\"ReferenceError\",function(v){return function(y){return i(v,this,arguments)}}),c(\"SyntaxError\",function(v){return function(y){return i(v,this,arguments)}}),c(\"TypeError\",function(v){return function(y){return i(v,this,arguments)}}),c(\"URIError\",function(v){return function(y){return i(v,this,arguments)}}),d(\"CompileError\",function(v){return function(y){return i(v,this,arguments)}}),d(\"LinkError\",function(v){return function(y){return i(v,this,arguments)}}),d(\"RuntimeError\",function(v){return function(y){return i(v,this,arguments)}})},d9f5:function(t,r,n){var o=n(\"23e7\"),s=n(\"da84\"),i=n(\"c65b\"),a=n(\"e330\"),l=n(\"c430\"),u=n(\"83ab\"),f=n(\"4930\"),c=n(\"d039\"),d=n(\"1a2d\"),v=n(\"3a9b\"),g=n(\"825a\"),y=n(\"fc6a\"),m=n(\"a04b\"),p=n(\"577e\"),h=n(\"5c6c\"),x=n(\"7c73\"),A=n(\"df75\"),I=n(\"241c\"),b=n(\"057f\"),O=n(\"7418\"),S=n(\"06cf\"),C=n(\"9bf2\"),T=n(\"37e8\"),N=n(\"d1e7\"),P=n(\"cb2d\"),F=n(\"5692\"),H=n(\"f772\"),w=n(\"d012\"),B=n(\"90e3\"),M=n(\"b622\"),j=n(\"e538\"),G=n(\"746f\"),st=n(\"57b9\"),et=n(\"d44e\"),rt=n(\"69f3\"),gt=n(\"b727\").forEach,z=H(\"hidden\"),_=\"Symbol\",lt=\"prototype\",Q=rt.set,Z=rt.getterFor(_),yt=Object[lt],ct=s.Symbol,it=ct&&ct[lt],ft=s.TypeError,E=s.QObject,R=S.f,D=C.f,L=b.f,$=N.f,W=a([].push),V=F(\"symbols\"),U=F(\"op-symbols\"),Y=F(\"wks\"),K=!E||!E[lt]||!E[lt].findChild,X=u&&c(function(){return x(D({},\"a\",{get:function(){return D(this,\"a\",{value:7}).a}})).a!=7})?function(vt,ot,ut){var ht=R(yt,ot);ht&&delete yt[ot],D(vt,ot,ut),ht&&vt!==yt&&D(yt,ot,ht)}:D,J=function(vt,ot){var ut=V[vt]=x(it);return Q(ut,{type:_,tag:vt,description:ot}),u||(ut.description=ot),ut},k=function(ot,ut,ht){ot===yt&&k(U,ut,ht),g(ot);var at=m(ut);return g(ht),d(V,at)?(ht.enumerable?(d(ot,z)&&ot[z][at]&&(ot[z][at]=!1),ht=x(ht,{enumerable:h(0,!1)})):(d(ot,z)||D(ot,z,h(1,{})),ot[z][at]=!0),X(ot,at,ht)):D(ot,at,ht)},tt=function(ot,ut){g(ot);var ht=y(ut),at=A(ht).concat(Bt(ht));return gt(at,function(Pt){(!u||i(St,ht,Pt))&&k(ot,Pt,ht[Pt])}),ot},dt=function(ot,ut){return ut===void 0?x(ot):tt(x(ot),ut)},St=function(ot){var ut=m(ot),ht=i($,this,ut);return this===yt&&d(V,ut)&&!d(U,ut)?!1:ht||!d(this,ut)||!d(V,ut)||d(this,z)&&this[z][ut]?ht:!0},Et=function(ot,ut){var ht=y(ot),at=m(ut);if(!(ht===yt&&d(V,at)&&!d(U,at))){var Pt=R(ht,at);return Pt&&d(V,at)&&!(d(ht,z)&&ht[z][at])&&(Pt.enumerable=!0),Pt}},xt=function(ot){var ut=L(y(ot)),ht=[];return gt(ut,function(at){!d(V,at)&&!d(w,at)&&W(ht,at)}),ht},Bt=function(vt){var ot=vt===yt,ut=L(ot?U:y(vt)),ht=[];return gt(ut,function(at){d(V,at)&&(!ot||d(yt,at))&&W(ht,V[at])}),ht};f||(ct=function(){if(v(it,this))throw ft(\"Symbol is not a constructor\");var ot=!arguments.length||arguments[0]===void 0?void 0:p(arguments[0]),ut=B(ot),ht=function(at){this===yt&&i(ht,U,at),d(this,z)&&d(this[z],ut)&&(this[z][ut]=!1),X(this,ut,h(1,at))};return u&&K&&X(yt,ut,{configurable:!0,set:ht}),J(ut,ot)},it=ct[lt],P(it,\"toString\",function(){return Z(this).tag}),P(ct,\"withoutSetter\",function(vt){return J(B(vt),vt)}),N.f=St,C.f=k,T.f=tt,S.f=Et,I.f=b.f=xt,O.f=Bt,j.f=function(vt){return J(M(vt),vt)},u&&(D(it,\"description\",{configurable:!0,get:function(){return Z(this).description}}),l||P(yt,\"propertyIsEnumerable\",St,{unsafe:!0}))),o({global:!0,constructor:!0,wrap:!0,forced:!f,sham:!f},{Symbol:ct}),gt(A(Y),function(vt){G(vt)}),o({target:_,stat:!0,forced:!f},{useSetter:function(){K=!0},useSimple:function(){K=!1}}),o({target:\"Object\",stat:!0,forced:!f,sham:!u},{create:dt,defineProperty:k,defineProperties:tt,getOwnPropertyDescriptor:Et}),o({target:\"Object\",stat:!0,forced:!f},{getOwnPropertyNames:xt}),st(),et(ct,_),w[z]=!0},da84:function(t,r,n){(function(o){var s=function(i){return i&&i.Math==Math&&i};t.exports=s(typeof globalThis==\"object\"&&globalThis)||s(typeof window==\"object\"&&window)||s(typeof self==\"object\"&&self)||s(typeof o==\"object\"&&o)||function(){return this}()||Function(\"return this\")()}).call(this,n(\"c8ba\"))},db90:function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r,n(\"a4d3\"),n(\"e01a\"),n(\"d3b7\"),n(\"d28b\"),n(\"e260\"),n(\"3ca3\"),n(\"ddb0\"),n(\"a630\")],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a,l,u,f,c,d,v,g,y){Object.defineProperty(a,\"__esModule\",{value:!0}),a.default=m;function m(p){if(typeof Symbol!=\"undefined\"&&p[Symbol.iterator]!=null||p[\"@@iterator\"]!=null)return Array.from(p)}})},dbb4:function(t,r,n){var o=n(\"23e7\"),s=n(\"83ab\"),i=n(\"56ef\"),a=n(\"fc6a\"),l=n(\"06cf\"),u=n(\"8418\");o({target:\"Object\",stat:!0,sham:!s},{getOwnPropertyDescriptors:function(c){for(var d=a(c),v=l.f,g=i(d),y={},m=0,p,h;g.length>m;)h=v(d,p=g[m++]),h!==void 0&&u(y,p,h);return y}})},dbce:function(t,r,n){n(\"e260\"),n(\"d3b7\"),n(\"3ca3\"),n(\"10d1\"),n(\"ddb0\"),n(\"e439\");var o=n(\"7037\").default;function s(a){if(typeof WeakMap!=\"function\")return null;var l=new WeakMap,u=new WeakMap;return(s=function(c){return c?u:l})(a)}function i(a,l){if(!l&&a&&a.__esModule)return a;if(a===null||o(a)!==\"object\"&&typeof a!=\"function\")return{default:a};var u=s(l);if(u&&u.has(a))return u.get(a);var f={},c=Object.defineProperty&&Object.getOwnPropertyDescriptor;for(var d in a)if(d!==\"default\"&&Object.prototype.hasOwnProperty.call(a,d)){var v=c?Object.getOwnPropertyDescriptor(a,d):null;v&&(v.get||v.set)?Object.defineProperty(f,d,v):f[d]=a[d]}return f.default=a,u&&u.set(a,f),f}t.exports=i,t.exports.__esModule=!0,t.exports.default=t.exports},dc4a:function(t,r,n){var o=n(\"59ed\");t.exports=function(s,i){var a=s[i];return a==null?void 0:o(a)}},ddb0:function(t,r,n){var o=n(\"da84\"),s=n(\"fdbc\"),i=n(\"785a\"),a=n(\"e260\"),l=n(\"9112\"),u=n(\"b622\"),f=u(\"iterator\"),c=u(\"toStringTag\"),d=a.values,v=function(y,m){if(y){if(y[f]!==d)try{l(y,f,d)}catch(h){y[f]=d}if(y[c]||l(y,c,m),s[m]){for(var p in a)if(y[p]!==a[p])try{l(y,p,a[p])}catch(h){y[p]=a[p]}}}};for(var g in s)v(o[g]&&o[g].prototype,g);v(i,\"DOMTokenList\")},df75:function(t,r,n){var o=n(\"ca84\"),s=n(\"7839\");t.exports=Object.keys||function(a){return o(a,s)}},e01a:function(t,r,n){var o=n(\"23e7\"),s=n(\"83ab\"),i=n(\"da84\"),a=n(\"e330\"),l=n(\"1a2d\"),u=n(\"1626\"),f=n(\"3a9b\"),c=n(\"577e\"),d=n(\"9bf2\").f,v=n(\"e893\"),g=i.Symbol,y=g&&g.prototype;if(s&&u(g)&&(!(\"description\"in y)||g().description!==void 0)){var m={},p=function(){var C=arguments.length<1||arguments[0]===void 0?void 0:c(arguments[0]),T=f(y,this)?new g(C):C===void 0?g():g(C);return C===\"\"&&(m[T]=!0),T};v(p,g),p.prototype=y,y.constructor=p;var h=String(g(\"test\"))==\"Symbol(test)\",x=a(y.toString),A=a(y.valueOf),I=/^Symbol\\((.*)\\)[^)]+$/,b=a(\"\".replace),O=a(\"\".slice);d(y,\"description\",{configurable:!0,get:function(){var C=A(this),T=x(C);if(l(m,C))return\"\";var N=h?O(T,7,-1):b(T,I,\"$1\");return N===\"\"?void 0:N}}),o({global:!0,constructor:!0,forced:!0},{Symbol:p})}},e163:function(t,r,n){var o=n(\"1a2d\"),s=n(\"1626\"),i=n(\"7b0b\"),a=n(\"f772\"),l=n(\"e177\"),u=a(\"IE_PROTO\"),f=Object,c=f.prototype;t.exports=l?f.getPrototypeOf:function(d){var v=i(d);if(o(v,u))return v[u];var g=v.constructor;return s(g)&&v instanceof g?g.prototype:v instanceof f?c:null}},e177:function(t,r,n){var o=n(\"d039\");t.exports=!o(function(){function s(){}return s.prototype.constructor=null,Object.getPrototypeOf(new s)!==s.prototype})},e260:function(t,r,n){var o=n(\"fc6a\"),s=n(\"44d2\"),i=n(\"3f8c\"),a=n(\"69f3\"),l=n(\"9bf2\").f,u=n(\"7dd0\"),f=n(\"c430\"),c=n(\"83ab\"),d=\"Array Iterator\",v=a.set,g=a.getterFor(d);t.exports=u(Array,\"Array\",function(m,p){v(this,{type:d,target:o(m),index:0,kind:p})},function(){var m=g(this),p=m.target,h=m.kind,x=m.index++;return!p||x>=p.length?(m.target=void 0,{value:void 0,done:!0}):h==\"keys\"?{value:x,done:!1}:h==\"values\"?{value:p[x],done:!1}:{value:[x,p[x]],done:!1}},\"values\");var y=i.Arguments=i.Array;if(s(\"keys\"),s(\"values\"),s(\"entries\"),!f&&c&&y.name!==\"values\")try{l(y,\"name\",{value:\"values\"})}catch(m){}},e2c8:function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r,n(\"53ca\"),n(\"ac1f\"),n(\"00b4\"),n(\"4d63\"),n(\"c607\"),n(\"2c3e\"),n(\"25f0\"),n(\"7db0\"),n(\"d3b7\"),n(\"c740\"),n(\"e9c4\"),n(\"466d\"),n(\"b64b\")],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a,l,u,f,c,d,v,g,y,m,p,h,x,A){var I=n(\"4ea4\").default;Object.defineProperty(a,\"__esModule\",{value:!0}),a.baseGet=w,a.hasRepeat=S,a.isEmptyObject=a.isEmail=void 0,a.isUrl=b,l=I(l);function b(B){var M=/^(?:\\w+:)?\\/\\/(\\S+)$/;return typeof B!=\"string\"?!1:M.test(B)}var O=function(M){var j=\"^[.a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$\";return!!(M&&new RegExp(j).test(M))};a.isEmail=O;function S(B){return B.find(function(M,j,G){return j!==G.findIndex(function(st){return JSON.stringify(M)===JSON.stringify(st)})})}function C(B){if(typeof B==\"string\")return B;var M=\"\".concat(B);return M==\"0\"&&1/B==-INFINITY?\"-0\":M}var T=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,N=/^\\w*$/;function P(B,M){if(Array.isArray(B))return!1;var j=(0,l.default)(B);return j===\"number\"||j===\"boolean\"||B==null?!0:N.test(B)||!T.test(B)||M!=null&&B in Object(M)}function F(B,M){return Array.isArray(B)?B:P(B,M)?[B]:B.match(/([^\\.\\[\\]\"']+)/g)}var H=function(M){return Object.keys(M).length===0&&M.constructor===Object};a.isEmptyObject=H;function w(B,M){M=F(M,B);for(var j=0,G=M.length;B!=null&&j<G;)B=B[C(M[j++])];return j&&j==G?B:void 0}})},e330:function(t,r,n){var o=n(\"40d5\"),s=Function.prototype,i=s.bind,a=s.call,l=o&&i.bind(a,a);t.exports=o?function(u){return u&&l(u)}:function(u){return u&&function(){return a.apply(u,arguments)}}},e391:function(t,r,n){var o=n(\"577e\");t.exports=function(s,i){return s===void 0?arguments.length<2?\"\":i:o(s)}},e439:function(t,r,n){var o=n(\"23e7\"),s=n(\"d039\"),i=n(\"fc6a\"),a=n(\"06cf\").f,l=n(\"83ab\"),u=s(function(){a(1)}),f=!l||u;o({target:\"Object\",stat:!0,forced:f,sham:!l},{getOwnPropertyDescriptor:function(d,v){return a(i(d),v)}})},e538:function(t,r,n){var o=n(\"b622\");r.f=o},e5cb:function(t,r,n){var o=n(\"d066\"),s=n(\"1a2d\"),i=n(\"9112\"),a=n(\"3a9b\"),l=n(\"d2bb\"),u=n(\"e893\"),f=n(\"aeb0\"),c=n(\"7156\"),d=n(\"e391\"),v=n(\"ab36\"),g=n(\"c770\"),y=n(\"b980\"),m=n(\"83ab\"),p=n(\"c430\");t.exports=function(h,x,A,I){var b=\"stackTraceLimit\",O=I?2:1,S=h.split(\".\"),C=S[S.length-1],T=o.apply(null,S);if(!!T){var N=T.prototype;if(!p&&s(N,\"cause\")&&delete N.cause,!A)return T;var P=o(\"Error\"),F=x(function(H,w){var B=d(I?w:H,void 0),M=I?new T(H):new T;return B!==void 0&&i(M,\"message\",B),y&&i(M,\"stack\",g(M.stack,2)),this&&a(N,this)&&c(M,this,F),arguments.length>O&&v(M,arguments[O]),M});if(F.prototype=N,C!==\"Error\"?l?l(F,P):u(F,P,{name:!0}):m&&b in T&&(f(F,T,b),f(F,T,\"prepareStackTrace\")),u(F,T),!p)try{N.name!==C&&i(N,\"name\",C),N.constructor=F}catch(H){}return F}}},e74d:function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r,n(\"15fd\"),n(\"53ca\"),n(\"e9c4\"),n(\"d3b7\"),n(\"159b\"),n(\"b64b\"),n(\"99af\"),n(\"d81d\"),n(\"b0c0\"),n(\"498a\"),n(\"ac1f\"),n(\"00b4\"),n(\"4d63\"),n(\"c607\"),n(\"2c3e\"),n(\"25f0\"),n(\"7db0\"),n(\"3bbb\"),n(\"0dd9\"),n(\"e2c8\")],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a,l,u,f,c,d,v,g,y,m,p,h,x,A,I,b,O,S,C,T,N){var P=n(\"4ea4\").default;Object.defineProperty(a,\"__esModule\",{value:!0}),a.clone=w,a.evaluateString=a.convertValue=void 0,a.getSubSchemas=j,Object.defineProperty(a,\"getValidateList\",{enumerable:!0,get:function(){return C.getValidateList}}),a.i18n=void 0,a.resolve=M,a.validate=void 0,l=P(l),u=P(u),T=P(T);var F=[\"properties\",\"items\"];function H(z){return typeof z==\"function\"?!0:typeof z==\"string\"&&z.substring(0,1)===\"@\"?z.substring(1):typeof z==\"string\"&&z.substring(0,2)===\"{{\"&&z.substring(z.length-2,z.length)===\"}}\"?z.substring(2,z.length-2):!1}function w(z){try{return JSON.parse(JSON.stringify(z))}catch(_){return z}}function B(z){var _=z.default,lt=z.enum,Q=lt===void 0?[]:lt,Z=z.type,yt={array:[],boolean:!1,integer:\"\",null:null,number:\"\",object:{},string:\"\",range:null};if(H(_))return yt[Z];if(H(Q)){if(Z===\"array\")return[];if(Z===\"string\"||Z===\"number\")return\"\"}return typeof _!=\"undefined\"?_:Z===\"array\"&&Q.length?[]:Array.isArray(Q)&&Q[0]&&typeof Q[0]!=\"undefined\"?z.hasOwnProperty(\"default\")?z.default:Q[0]:yt[Z]}function M(z,_){var lt=arguments.length>2&&arguments[2]!==void 0?arguments[2]:{};console.log(\"resolve\",_,z);var Q=z.type,Z=z.properties,yt=z.items,ct=z.default,it=z.required,ft=it===void 0?[]:it,E=z[\"ui:widget\"],R=lt.checkRequired,D=R===void 0?!1:R,L=typeof _==\"undefined\"?B(z):w(_);if(Q===\"object\"){if(E)return ct&&(0,u.default)(ct)===\"object\"?ct:L;var $=Z||{},W={};return Object.keys($).forEach(function(Y){var K=D&&[].concat(ft).indexOf(Y)!==-1;(!D||K)&&(W[Y]=M($[Y],L[Y],lt))}),W}if(Q===\"array\"){if(ct&&Array.isArray(ct)&&!L)return ct;if(E)return L;var V=[].concat(yt||[]),U=[];return L.forEach&&L.forEach(function(Y,K){U[K]=M(V[K]||V[0],Y,lt)}),U}return L}function j(){var z=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},_=z.properties,lt=z.items,Q=(0,l.default)(z,F),Z=Q.type,yt=Z===void 0?\"object\":Z;if(!_&&!lt)return[];var ct={};return yt===\"object\"&&(ct=_),Object.keys(ct).map(function(it){return{schema:ct[it],name:it,$parent:Q}})}var G=function(_){var lt=_.name,Q=_.schema,Z=_.value,yt=_.required,ct=yt===void 0?[]:yt,it=Q.type,ft=Q[\"ui:options\"],E=Q.message,R=Q.maxLength,D=Q.minLength,L=Q.format,$=Q.pattern,W=Q.maximum,V=Q.minimum,U=Q.maxItems,Y=Q.minItems,K=Q.uniqueItems;if((0,N.isEmptyObject)(Q))return!1;if(ct.indexOf(lt)>=0&&(!Z||!Z.length))return\"\\u4E0D\\u80FD\\u4E3A\\u7A7A\";var X=$&&[\"string\",\"number\"].indexOf(it)>-1;if(it===\"string\"){var J=Z;typeof Z!=\"string\"&&(Z==null?J=\"\":J=String(Z));var k=ft&&ft.noTrim,tt=J.trim();if(tt!==J&&!k)return E&&E.trim||\"\\u8F93\\u5165\\u7684\\u5185\\u5BB9\\u6709\\u591A\\u4F59\\u7A7A\\u683C\";if(J&&R&&!(0,T.default)(J,0,parseInt(R,10)))return E&&E.maxLength||\"\\u957F\\u5EA6\\u4E0D\\u80FD\\u5927\\u4E8E \".concat(R);if(J&&(D||D===0)&&(!J||!(0,T.default)(J,parseInt(D,10),void 0)))return E&&E.minLength||\"\\u957F\\u5EA6\\u4E0D\\u80FD\\u5C0F\\u4E8E \".concat(D);if(L===\"color\"&&Z===\"\")return\"\\u8BF7\\u586B\\u5199\\u6B63\\u786E\\u7684\\u989C\\u8272\\u683C\\u5F0F\";if(L===\"image\"){var dt=\"([/|.|w|s|-])*.(?:jpg|gif|png|bmp|apng|webp|jpeg|json)\",St=(0,N.isUrl)(Z),Et=new RegExp(dt).test(Z);if(!X){if(Z&&!St&&!Et)return E&&E.image||\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684\\u56FE\\u7247\\u683C\\u5F0F\"}}if(L===\"url\"&&!X){if(Z&&!(0,N.isUrl)(Z))return E&&E.url||\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684url\\u683C\\u5F0F\"}if(L===\"email\"&&!X){if(Z&&!(0,N.isEmail)(Z))return E&&E.email||\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684email\\u683C\\u5F0F\"}}if(it===\"number\"){if(typeof Z!=\"number\")return\"\\u8BF7\\u586B\\u5199\\u6570\\u5B57\";if(W&&parseFloat(Z,10)>W)return E&&E.maximum||\"\\u6570\\u503C\\u4E0D\\u80FD\\u5927\\u4E8E \".concat(W);if((V||V===0)&&parseFloat(Z,10)<V)return E&&E.minimum||\"\\u6570\\u503C\\u4E0D\\u80FD\\u5C0F\\u4E8E \".concat(V)}if(Z&&X&&!new RegExp($).test(Z))return E&&E.pattern||\"\\u683C\\u5F0F\\u4E0D\\u5339\\u914D\";if(it===\"array\"){if(U&&Z&&Z.length>U)return E&&E.maxItems||\"\\u6570\\u7EC4\\u957F\\u5EA6\\u4E0D\\u80FD\\u5927\\u4E8E \".concat(U);if((Y||Y===0)&&Z&&Z.length<Y)return E&&E.minItems||\"\\u6570\\u7EC4\\u957F\\u5EA6\\u4E0D\\u80FD\\u5C0F\\u4E8E \".concat(Y);if(K&&Array.isArray(Z)&&Z.length>1){if(typeof K==\"boolean\"&&(0,N.hasRepeat)(Z))return\"\\u5B58\\u5728\\u91CD\\u590D\\u5143\\u7D20\";if(typeof K==\"string\")try{var xt=Z.map(function(vt){return(0,N.baseGet)(vt,K)}),Bt=xt.find(function(vt,ot){return xt.indexOf(vt)!==ot});if(Bt)return K+\" \\u7684\\u503C\\u5B58\\u5728\\u91CD\\u590D\\u7684\"}catch(vt){}}}return\"\"};a.validate=G;function st(z){return Function('\"use strict\"; '.concat(z))()}var et=function(_,lt,Q){return st(`\n  const rootValue =`.concat(JSON.stringify(Q),`;\n  const formData = `).concat(JSON.stringify(lt),`;\n  return (`).concat(_,`)\n  `))};a.evaluateString=et;var rt=function(_,lt,Q){if(typeof _==\"function\")return _(lt,Q);if(typeof _==\"string\"&&H(_)!==!1){var Z=H(_);try{return et(Z,lt,Q)}catch(yt){return console.error(yt.message),console.error(\"happen at \".concat(_)),_}}return _};a.convertValue=rt;var gt=function(_){var lt=function(Z){return Z};return window._!=null&&(lt=window._),lt(_)};a.i18n=gt})},e893:function(t,r,n){var o=n(\"1a2d\"),s=n(\"56ef\"),i=n(\"06cf\"),a=n(\"9bf2\");t.exports=function(l,u,f){for(var c=s(u),d=a.f,v=i.f,g=0;g<c.length;g++){var y=c[g];!o(l,y)&&!(f&&o(f,y))&&d(l,y,v(u,y))}}},e8b5:function(t,r,n){var o=n(\"c6b6\");t.exports=Array.isArray||function(i){return o(i)==\"Array\"}},e95a:function(t,r,n){var o=n(\"b622\"),s=n(\"3f8c\"),i=o(\"iterator\"),a=Array.prototype;t.exports=function(l){return l!==void 0&&(s.Array===l||a[i]===l)}},e9c4:function(t,r,n){var o=n(\"23e7\"),s=n(\"d066\"),i=n(\"2ba4\"),a=n(\"c65b\"),l=n(\"e330\"),u=n(\"d039\"),f=n(\"e8b5\"),c=n(\"1626\"),d=n(\"861d\"),v=n(\"d9b5\"),g=n(\"f36a\"),y=n(\"4930\"),m=s(\"JSON\",\"stringify\"),p=l(/./.exec),h=l(\"\".charAt),x=l(\"\".charCodeAt),A=l(\"\".replace),I=l(1 .toString),b=/[\\uD800-\\uDFFF]/g,O=/^[\\uD800-\\uDBFF]$/,S=/^[\\uDC00-\\uDFFF]$/,C=!y||u(function(){var F=s(\"Symbol\")();return m([F])!=\"[null]\"||m({a:F})!=\"{}\"||m(Object(F))!=\"{}\"}),T=u(function(){return m(\"\\uDF06\\uD834\")!=='\"\\\\udf06\\\\ud834\"'||m(\"\\uDEAD\")!=='\"\\\\udead\"'}),N=function(F,H){var w=g(arguments),B=H;if(!(!d(H)&&F===void 0||v(F)))return f(H)||(H=function(M,j){if(c(B)&&(j=a(B,this,M,j)),!v(j))return j}),w[1]=H,i(m,null,w)},P=function(F,H,w){var B=h(w,H-1),M=h(w,H+1);return p(O,F)&&!p(S,M)||p(S,F)&&!p(O,B)?\"\\\\u\"+I(x(F,0),16):F};m&&o({target:\"JSON\",stat:!0,arity:3,forced:C||T},{stringify:function(H,w,B){var M=g(arguments),j=i(C?N:m,null,M);return T&&typeof j==\"string\"?A(j,b,P):j}})},edd0:function(t,r,n){var o=n(\"13d2\"),s=n(\"9bf2\");t.exports=function(i,a,l){return l.get&&o(l.get,a,{getter:!0}),l.set&&o(l.set,a,{setter:!0}),s.f(i,a,l)}},f183:function(t,r,n){var o=n(\"23e7\"),s=n(\"e330\"),i=n(\"d012\"),a=n(\"861d\"),l=n(\"1a2d\"),u=n(\"9bf2\").f,f=n(\"241c\"),c=n(\"057f\"),d=n(\"4fad\"),v=n(\"90e3\"),g=n(\"bb2f\"),y=!1,m=v(\"meta\"),p=0,h=function(S){u(S,m,{value:{objectID:\"O\"+p++,weakData:{}}})},x=function(S,C){if(!a(S))return typeof S==\"symbol\"?S:(typeof S==\"string\"?\"S\":\"P\")+S;if(!l(S,m)){if(!d(S))return\"F\";if(!C)return\"E\";h(S)}return S[m].objectID},A=function(S,C){if(!l(S,m)){if(!d(S))return!0;if(!C)return!1;h(S)}return S[m].weakData},I=function(S){return g&&y&&d(S)&&!l(S,m)&&h(S),S},b=function(){O.enable=function(){},y=!0;var S=f.f,C=s([].splice),T={};T[m]=1,S(T).length&&(f.f=function(N){for(var P=S(N),F=0,H=P.length;F<H;F++)if(P[F]===m){C(P,F,1);break}return P},o({target:\"Object\",stat:!0,forced:!0},{getOwnPropertyNames:c.f}))},O=t.exports={enable:b,fastKey:x,getWeakData:A,onFreeze:I};i[m]=!0},f36a:function(t,r,n){var o=n(\"e330\");t.exports=o([].slice)},f5df:function(t,r,n){var o=n(\"00ee\"),s=n(\"1626\"),i=n(\"c6b6\"),a=n(\"b622\"),l=a(\"toStringTag\"),u=Object,f=i(function(){return arguments}())==\"Arguments\",c=function(d,v){try{return d[v]}catch(g){}};t.exports=o?i:function(d){var v,g,y;return d===void 0?\"Undefined\":d===null?\"Null\":typeof(g=c(v=u(d),l))==\"string\"?g:f?i(v):(y=i(v))==\"Object\"&&s(v.callee)?\"Arguments\":y}},f772:function(t,r,n){var o=n(\"5692\"),s=n(\"90e3\"),i=o(\"keys\");t.exports=function(a){return i[a]||(i[a]=s(a))}},fb15:function(t,r,n){n.r(r),n(\"1eb2\");var o=n(\"74d2\"),s=n.n(o);for(var i in o)[\"default\"].indexOf(i)<0&&function(a){n.d(r,a,function(){return o[a]})}(i);r.default=s.a},fb6a:function(t,r,n){var o=n(\"23e7\"),s=n(\"e8b5\"),i=n(\"68ee\"),a=n(\"861d\"),l=n(\"23cb\"),u=n(\"07fa\"),f=n(\"fc6a\"),c=n(\"8418\"),d=n(\"b622\"),v=n(\"1dde\"),g=n(\"f36a\"),y=v(\"slice\"),m=d(\"species\"),p=Array,h=Math.max;o({target:\"Array\",proto:!0,forced:!y},{slice:function(A,I){var b=f(this),O=u(b),S=l(A,O),C=l(I===void 0?O:I,O),T,N,P;if(s(b)&&(T=b.constructor,i(T)&&(T===p||s(T.prototype))?T=void 0:a(T)&&(T=T[m],T===null&&(T=void 0)),T===p||T===void 0))return g(b,S,C);for(N=new(T===void 0?p:T)(h(C-S,0)),P=0;S<C;S++,P++)S in b&&c(N,P,b[S]);return N.length=P,N}})},fc6a:function(t,r,n){var o=n(\"44ad\"),s=n(\"1d80\");t.exports=function(i){return o(s(i))}},fce3:function(t,r,n){var o=n(\"d039\"),s=n(\"da84\"),i=s.RegExp;t.exports=o(function(){var a=i(\".\",\"s\");return!(a.dotAll&&a.exec(`\n`)&&a.flags===\"s\")})},fdbc:function(t,r){t.exports={CSSRuleList:0,CSSStyleDeclaration:0,CSSValueList:0,ClientRectList:0,DOMRectList:0,DOMStringList:0,DOMTokenList:1,DataTransferItemList:0,FileList:0,HTMLAllCollection:0,HTMLCollection:0,HTMLFormElement:0,HTMLSelectElement:0,MediaList:0,MimeTypeArray:0,NamedNodeMap:0,NodeList:1,PaintRequestList:0,Plugin:0,PluginArray:0,SVGLengthList:0,SVGNumberList:0,SVGPathSegList:0,SVGPointList:0,SVGStringList:0,SVGTransformList:0,SourceBufferList:0,StyleSheetList:0,TextTrackCueList:0,TextTrackList:0,TouchList:0}},fdbf:function(t,r,n){var o=n(\"4930\");t.exports=o&&!Symbol.sham&&typeof Symbol.iterator==\"symbol\"},fe39:function(t,r,n){var o,s,i;n(\"6c57\"),function(a,l){s=[r,n(\"8bbf\"),n(\"2909\"),n(\"a9e3\"),n(\"b0c0\"),n(\"99af\"),n(\"c740\"),n(\"d81d\"),n(\"a4d3\"),n(\"e01a\"),n(\"e74d\")],o=l,i=typeof o==\"function\"?o.apply(r,s):o,i!==void 0&&(t.exports=i)}(typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:this,function(a,l,u,f,c,d,v,g,y,m,p){var h=n(\"4ea4\").default,x=n(\"dbce\").default;Object.defineProperty(a,\"__esModule\",{value:!0}),a.default=void 0,l=x(l),u=h(u);var A={props:{schema:Object,formData:Object,name:String,onChange:Function,value:[String,Number,Boolean,Object],disabled:Boolean,readOnly:Boolean,invalidText:String},setup:function(b){var O=(0,l.toRefs)(b),S=O.schema,C=O.onChange,T=O.name,N=O.value,P=O.style;console.log(\"schema\",S.value);var F=(0,l.computed)(function(){return b.schema.customOption?[].concat((0,u.default)(b.schema.enum),[\"customOptions\"]):b.schema.enum}),H=(0,l.computed)(function(){return b.schema.customOption?[].concat((0,u.default)(b.schema.enumNames),[\"\\u81EA\\u5B9A\\u4E49\\u9009\\u9879\"]):b.schema.enumNames}),w=(0,l.reactive)({showCustomOptionInput:b.schema.customOption&&b.schema.enumNames.findIndex(function(M){return M===N.value})===-1}),B=function(j,G){G===\"select\"?j===\"customOptions\"?(w.showCustomOptionInput=!0,C.value(T.value,\"\")):(w.showCustomOptionInput=!1,S.value.type===\"interger\"?C.value(T.value,parseInt(j)):C.value(T.value,j)):C.value(T.value,j)};return function(){var M=S.value[\"ui:options\"];return l.createVNode(\"div\",{className:\"cbi-value\",style:P},[l.createVNode(\"label\",{className:\"cbi-value-title\"},[(0,p.i18n)(b.schema.title),l.createVNode(\"span\",{style:{color:\"red\"}},[S.value.required?\" * \":\"\"])]),l.createVNode(\"div\",{class:\"cbi-value-field\"},[l.createVNode(\"div\",null,[F.value?l.createVNode(\"div\",{className:\"cbi-value-field\"},[l.createVNode(\"div\",null,[l.createVNode(\"select\",{class:\"cbi-input-select\",value:w.showCustomOptionInput?\"customOptions\":N.value,onChange:function(G){return B(G.target.value,\"select\")}},[F.value.map(function(j,G){return l.createVNode(\"option\",{value:j},[(0,p.i18n)(H.value&&H.value[G]||F.value[G])])})]),w.showCustomOptionInput&&l.createVNode(\"input\",{onInput:function(G){return B(G.target.value)},value:N.value,type:\"text\",class:\"cbi-input-text\"},null)])]):l.createVNode(\"input\",{type:S.value.mode||\"text\",class:\"cbi-input-text\",value:N.value,onInput:function(G){return B(G.target.value)}},null)]),(M==null?void 0:M.description)&&l.createVNode(l.Fragment,null,[l.createVNode(\"br\",null,null),l.createVNode(\"div\",{class:\"cbi-value-description\",innerHTML:(0,p.i18n)(M==null?void 0:M.description)},null)])])])}}};a.default=A})}}).default})(fl);var xv=Hc(fl.exports);window.istoreosMessage=function(e){mo(e).setDisabled(!0)};const Sv={setup(){const e=Ln({schema:{},formData:{}});return He(()=>{Jr.get(window.IstoreosFormConfig.getApi).then(function(t){let r=t.data;if(window.IstoreosFormConfig.getHook&&(r=window.IstoreosFormConfig.getHook(r),r===void 0))return console.warn(\"getHook\\u5FC5\\u987B\\u6709return\\u8FD4\\u56DE\\u503C\");if(r.success===0){let n=r.result.schema;n.actions=n.actions.map(o=>jr(Br({},o),{callback:s=>{if(window.IstoreosFormConfig.submitHook){if(s=window.IstoreosFormConfig.submitHook(s),s===void 0)return console.warn(\"submitHook\\u5FC5\\u987B\\u6709return\\u8FD4\\u56DE\\u503C\");if(s===!1)return!1}Jr.post(window.IstoreosFormConfig.submitApi,s).then(({data:i})=>{if(i.success===0){let a=null;if(i.result.async){const l=setInterval(()=>{Jr.get(`${window.IstoreosFormConfig.logApi}?async_state=${i.result.async_state}`).then(u=>{a===null&&(a=mo({value:\"\",callback:()=>{location.reload()}})),u.data.match(\"XU6J03M6\")&&window.clearInterval(l),a.setValue(u.data.replace(\"XU6J03M6\",\"\")),a.setDisabled(!0)})},2e3)}else a=mo({value:i.result.log.replace(\"XU6J03M6\",\"\"),callback:()=>{location.reload()}}),a.setDisabled(!0)}}).catch(i=>{window.clearInterval(interval),window.istoreosMessage({value:i,title:\"\\u672A\\u77E5\\u9519\\u8BEF\",description:\"\\u672A\\u77E5\\u9519\\u8BEF\"})})}})),e.schema=r.result.schema,e.formData=r.result.data}}).catch(t=>{t.request.status===403&&document.write(t.response.data)})}),jr(Br({},Ai(e)),{change:t=>{e.formData=t}})},components:{IstoreosForm:xv}};function bv(e,t,r,n,o,s){const i=la(\"IstoreosForm\");return be(),Vn(i,{schema:e.schema,formData:e.formData,onOnChange:n.change},null,8,[\"schema\",\"formData\",\"onOnChange\"])}var Ov=ll(Sv,[[\"render\",bv]]);const Tv={setup(e){return(t,r)=>(be(),Vn(Ov))}};_o(Tv).mount(\"#app\");\n"
  },
  {
    "path": "relevance/luci-lib-iform/root/www/luci-static/iform/1.0/style.css",
    "content": "[lock-scroll=true]{overflow:hidden!important}.software-log_shade[data-v-27cc98a0],.software-log_shade *[data-v-27cc98a0]{-webkit-box-sizing:border-box;-webkit-tap-highlight-color:transparent;box-sizing:border-box;word-wrap:break-word;outline:none}.software-log_shade[data-v-27cc98a0]{width:100%;height:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;position:fixed;inset:0;z-index:99999}.software-log_shade .software-log_shade__bg[data-v-27cc98a0]{position:fixed;inset:0;background:rgba(68,79,83,.94) none repeat scroll 0 0!important;background-position:0 0;background-size:cover;opacity:.94}.software-log_shade .software-log_shade__pannel[data-v-27cc98a0]{width:800px;min-width:800px;border-radius:10px;z-index:100;box-shadow:3px 3px 10px #000;background:rgba(0,0,0,.9);padding:10px}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-title[data-v-27cc98a0]{text-align:center;font-size:18px;color:#9f0;padding:10px;font-weight:700}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-now i[data-v-27cc98a0]{color:#fc0;font-style:normal}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-content[data-v-27cc98a0]{padding:10px;width:100%;text-align:center;overflow:hidden;height:400px;overflow:overlay}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-content textarea[data-v-27cc98a0]{width:100%;border:0px solid #222;font-family:Lucida Console;font-size:11px;background:transparent;color:#fff;outline:none;overflow-x:hidden;resize:none;transition:.5s}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-content textarea[data-v-27cc98a0]:focus,.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-content textarea[data-v-27cc98a0]:hover{box-shadow:none;border-color:#fff0!important}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-content textarea[data-v-27cc98a0]::-webkit-scrollbar{width:5px;height:5px}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-content textarea[data-v-27cc98a0]::-webkit-scrollbar-thumb{height:30px;outline:none;border:none;border-radius:1rem;background-color:#4c595c;-webkit-border-radius:1rem}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-content textarea[data-v-27cc98a0]::-webkit-scrollbar-track-piece{background:none;-webkit-border-radius:0;border-radius:0}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-btn[data-v-27cc98a0]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-btn button[data-v-27cc98a0]{visibility:visible;min-width:88px;font-weight:bolder;text-shadow:1px 1px 0px black;border-radius:8px;height:33px;font-family:Verdana,Microsoft Yahei UI,sans-serif;font-size:12px;padding:0 .7em;width:auto;min-width:122px;margin:0 10px;cursor:pointer;background:#090a0a!important;border:1px solid #fff!important;color:#fff!important;opacity:1!important}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-btn button[data-v-27cc98a0]:hover{opacity:.9!important}.cbi-section .title{font-size:1.1rem;line-height:1;display:block;width:100%;margin:0;color:#32325d;padding:1rem 1.25rem}.cbi-page-actions{display:inline-block;width:100%}#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}\n"
  },
  {
    "path": "relevance/luci-lib-iform/root/www/luci-static/iform/1.1/index.js",
    "content": "var ho=Object.defineProperty,po=Object.defineProperties;var mo=Object.getOwnPropertyDescriptors;var kt=Object.getOwnPropertySymbols;var zr=Object.prototype.hasOwnProperty,Xr=Object.prototype.propertyIsEnumerable;var Jr=(e,t,n)=>t in e?ho(e,t,{enumerable:!0,configurable:!0,writable:!0,value:n}):e[t]=n,Ot=(e,t)=>{for(var n in t||(t={}))zr.call(t,n)&&Jr(e,n,t[n]);if(kt)for(var n of kt(t))Xr.call(t,n)&&Jr(e,n,t[n]);return e},At=(e,t)=>po(e,mo(t));var Yr=(e,t)=>{var n={};for(var r in e)zr.call(e,r)&&t.indexOf(r)<0&&(n[r]=e[r]);if(e!=null&&kt)for(var r of kt(e))t.indexOf(r)<0&&Xr.call(e,r)&&(n[r]=e[r]);return n};const go=function(){const t=document.createElement(\"link\").relList;if(t&&t.supports&&t.supports(\"modulepreload\"))return;for(const s of document.querySelectorAll('link[rel=\"modulepreload\"]'))r(s);new MutationObserver(s=>{for(const i of s)if(i.type===\"childList\")for(const o of i.addedNodes)o.tagName===\"LINK\"&&o.rel===\"modulepreload\"&&r(o)}).observe(document,{childList:!0,subtree:!0});function n(s){const i={};return s.integrity&&(i.integrity=s.integrity),s.referrerpolicy&&(i.referrerPolicy=s.referrerpolicy),s.crossorigin===\"use-credentials\"?i.credentials=\"include\":s.crossorigin===\"anonymous\"?i.credentials=\"omit\":i.credentials=\"same-origin\",i}function r(s){if(s.ep)return;s.ep=!0;const i=n(s);fetch(s.href,i)}};go();function dr(e,t){const n=Object.create(null),r=e.split(\",\");for(let s=0;s<r.length;s++)n[r[s]]=!0;return t?s=>!!n[s.toLowerCase()]:s=>!!n[s]}const bo=\"itemscope,allowfullscreen,formnovalidate,ismap,nomodule,novalidate,readonly\",_o=dr(bo);function Ds(e){return!!e||e===\"\"}function hr(e){if(F(e)){const t={};for(let n=0;n<e.length;n++){const r=e[n],s=ee(r)?wo(r):hr(r);if(s)for(const i in s)t[i]=s[i]}return t}else{if(ee(e))return e;if(te(e))return e}}const yo=/;(?![^(]*\\))/g,vo=/:(.+)/;function wo(e){const t={};return e.split(yo).forEach(n=>{if(n){const r=n.split(vo);r.length>1&&(t[r[0].trim()]=r[1].trim())}}),t}function pr(e){let t=\"\";if(ee(e))t=e;else if(F(e))for(let n=0;n<e.length;n++){const r=pr(e[n]);r&&(t+=r+\" \")}else if(te(e))for(const n in e)e[n]&&(t+=n+\" \");return t.trim()}const Nn=e=>ee(e)?e:e==null?\"\":F(e)||te(e)&&(e.toString===Hs||!$(e.toString))?JSON.stringify(e,Bs,2):String(e),Bs=(e,t)=>t&&t.__v_isRef?Bs(e,t.value):dt(t)?{[`Map(${t.size})`]:[...t.entries()].reduce((n,[r,s])=>(n[`${r} =>`]=s,n),{})}:js(t)?{[`Set(${t.size})`]:[...t.values()]}:te(t)&&!F(t)&&!ks(t)?String(t):t,k={},ft=[],xe=()=>{},Eo=()=>!1,xo=/^on[^a-z]/,cn=e=>xo.test(e),mr=e=>e.startsWith(\"onUpdate:\"),re=Object.assign,gr=(e,t)=>{const n=e.indexOf(t);n>-1&&e.splice(n,1)},Co=Object.prototype.hasOwnProperty,M=(e,t)=>Co.call(e,t),F=Array.isArray,dt=e=>fn(e)===\"[object Map]\",js=e=>fn(e)===\"[object Set]\",$=e=>typeof e==\"function\",ee=e=>typeof e==\"string\",br=e=>typeof e==\"symbol\",te=e=>e!==null&&typeof e==\"object\",Us=e=>te(e)&&$(e.then)&&$(e.catch),Hs=Object.prototype.toString,fn=e=>Hs.call(e),Oo=e=>fn(e).slice(8,-1),ks=e=>fn(e)===\"[object Object]\",_r=e=>ee(e)&&e!==\"NaN\"&&e[0]!==\"-\"&&\"\"+parseInt(e,10)===e,Yt=dr(\",key,ref,ref_for,ref_key,onVnodeBeforeMount,onVnodeMounted,onVnodeBeforeUpdate,onVnodeUpdated,onVnodeBeforeUnmount,onVnodeUnmounted\"),dn=e=>{const t=Object.create(null);return n=>t[n]||(t[n]=e(n))},Ao=/-(\\w)/g,Pe=dn(e=>e.replace(Ao,(t,n)=>n?n.toUpperCase():\"\")),To=/\\B([A-Z])/g,yt=dn(e=>e.replace(To,\"-$1\").toLowerCase()),hn=dn(e=>e.charAt(0).toUpperCase()+e.slice(1)),In=dn(e=>e?`on${hn(e)}`:\"\"),Mt=(e,t)=>!Object.is(e,t),Fn=(e,t)=>{for(let n=0;n<e.length;n++)e[n](t)},en=(e,t,n)=>{Object.defineProperty(e,t,{configurable:!0,enumerable:!1,value:n})},Ro=e=>{const t=parseFloat(e);return isNaN(t)?e:t};let Zr;const So=()=>Zr||(Zr=typeof globalThis!=\"undefined\"?globalThis:typeof self!=\"undefined\"?self:typeof window!=\"undefined\"?window:typeof global!=\"undefined\"?global:{});let Re;class Po{constructor(t=!1){this.active=!0,this.effects=[],this.cleanups=[],!t&&Re&&(this.parent=Re,this.index=(Re.scopes||(Re.scopes=[])).push(this)-1)}run(t){if(this.active){const n=Re;try{return Re=this,t()}finally{Re=n}}}on(){Re=this}off(){Re=this.parent}stop(t){if(this.active){let n,r;for(n=0,r=this.effects.length;n<r;n++)this.effects[n].stop();for(n=0,r=this.cleanups.length;n<r;n++)this.cleanups[n]();if(this.scopes)for(n=0,r=this.scopes.length;n<r;n++)this.scopes[n].stop(!0);if(this.parent&&!t){const s=this.parent.scopes.pop();s&&s!==this&&(this.parent.scopes[this.index]=s,s.index=this.index)}this.active=!1}}}function No(e,t=Re){t&&t.active&&t.effects.push(e)}const yr=e=>{const t=new Set(e);return t.w=0,t.n=0,t},qs=e=>(e.w&Ve)>0,Ks=e=>(e.n&Ve)>0,Io=({deps:e})=>{if(e.length)for(let t=0;t<e.length;t++)e[t].w|=Ve},Fo=e=>{const{deps:t}=e;if(t.length){let n=0;for(let r=0;r<t.length;r++){const s=t[r];qs(s)&&!Ks(s)?s.delete(e):t[n++]=s,s.w&=~Ve,s.n&=~Ve}t.length=n}},Kn=new WeakMap;let Rt=0,Ve=1;const Vn=30;let we;const Ze=Symbol(\"\"),Wn=Symbol(\"\");class vr{constructor(t,n=null,r){this.fn=t,this.scheduler=n,this.active=!0,this.deps=[],this.parent=void 0,No(this,r)}run(){if(!this.active)return this.fn();let t=we,n=qe;for(;t;){if(t===this)return;t=t.parent}try{return this.parent=we,we=this,qe=!0,Ve=1<<++Rt,Rt<=Vn?Io(this):Qr(this),this.fn()}finally{Rt<=Vn&&Fo(this),Ve=1<<--Rt,we=this.parent,qe=n,this.parent=void 0,this.deferStop&&this.stop()}}stop(){we===this?this.deferStop=!0:this.active&&(Qr(this),this.onStop&&this.onStop(),this.active=!1)}}function Qr(e){const{deps:t}=e;if(t.length){for(let n=0;n<t.length;n++)t[n].delete(e);t.length=0}}let qe=!0;const Vs=[];function vt(){Vs.push(qe),qe=!1}function wt(){const e=Vs.pop();qe=e===void 0?!0:e}function he(e,t,n){if(qe&&we){let r=Kn.get(e);r||Kn.set(e,r=new Map);let s=r.get(n);s||r.set(n,s=yr()),Ws(s)}}function Ws(e,t){let n=!1;Rt<=Vn?Ks(e)||(e.n|=Ve,n=!qs(e)):n=!e.has(we),n&&(e.add(we),we.deps.push(e))}function Le(e,t,n,r,s,i){const o=Kn.get(e);if(!o)return;let l=[];if(t===\"clear\")l=[...o.values()];else if(n===\"length\"&&F(e))o.forEach((u,d)=>{(d===\"length\"||d>=r)&&l.push(u)});else switch(n!==void 0&&l.push(o.get(n)),t){case\"add\":F(e)?_r(n)&&l.push(o.get(\"length\")):(l.push(o.get(Ze)),dt(e)&&l.push(o.get(Wn)));break;case\"delete\":F(e)||(l.push(o.get(Ze)),dt(e)&&l.push(o.get(Wn)));break;case\"set\":dt(e)&&l.push(o.get(Ze));break}if(l.length===1)l[0]&&Jn(l[0]);else{const u=[];for(const d of l)d&&u.push(...d);Jn(yr(u))}}function Jn(e,t){for(const n of F(e)?e:[...e])(n!==we||n.allowRecurse)&&(n.scheduler?n.scheduler():n.run())}const $o=dr(\"__proto__,__v_isRef,__isVue\"),Js=new Set(Object.getOwnPropertyNames(Symbol).map(e=>Symbol[e]).filter(br)),Mo=wr(),Lo=wr(!1,!0),Do=wr(!0),Gr=Bo();function Bo(){const e={};return[\"includes\",\"indexOf\",\"lastIndexOf\"].forEach(t=>{e[t]=function(...n){const r=D(this);for(let i=0,o=this.length;i<o;i++)he(r,\"get\",i+\"\");const s=r[t](...n);return s===-1||s===!1?r[t](...n.map(D)):s}}),[\"push\",\"pop\",\"shift\",\"unshift\",\"splice\"].forEach(t=>{e[t]=function(...n){vt();const r=D(this)[t].apply(this,n);return wt(),r}}),e}function wr(e=!1,t=!1){return function(r,s,i){if(s===\"__v_isReactive\")return!e;if(s===\"__v_isReadonly\")return e;if(s===\"__v_isShallow\")return t;if(s===\"__v_raw\"&&i===(e?t?el:Qs:t?Zs:Ys).get(r))return r;const o=F(r);if(!e&&o&&M(Gr,s))return Reflect.get(Gr,s,i);const l=Reflect.get(r,s,i);return(br(s)?Js.has(s):$o(s))||(e||he(r,\"get\",s),t)?l:Q(l)?!o||!_r(s)?l.value:l:te(l)?e?Gs(l):Ut(l):l}}const jo=zs(),Uo=zs(!0);function zs(e=!1){return function(n,r,s,i){let o=n[r];if(Lt(o)&&Q(o)&&!Q(s))return!1;if(!e&&!Lt(s)&&(ei(s)||(s=D(s),o=D(o)),!F(n)&&Q(o)&&!Q(s)))return o.value=s,!0;const l=F(n)&&_r(r)?Number(r)<n.length:M(n,r),u=Reflect.set(n,r,s,i);return n===D(i)&&(l?Mt(s,o)&&Le(n,\"set\",r,s):Le(n,\"add\",r,s)),u}}function Ho(e,t){const n=M(e,t);e[t];const r=Reflect.deleteProperty(e,t);return r&&n&&Le(e,\"delete\",t,void 0),r}function ko(e,t){const n=Reflect.has(e,t);return(!br(t)||!Js.has(t))&&he(e,\"has\",t),n}function qo(e){return he(e,\"iterate\",F(e)?\"length\":Ze),Reflect.ownKeys(e)}const Xs={get:Mo,set:jo,deleteProperty:Ho,has:ko,ownKeys:qo},Ko={get:Do,set(e,t){return!0},deleteProperty(e,t){return!0}},Vo=re({},Xs,{get:Lo,set:Uo}),Er=e=>e,pn=e=>Reflect.getPrototypeOf(e);function qt(e,t,n=!1,r=!1){e=e.__v_raw;const s=D(e),i=D(t);t!==i&&!n&&he(s,\"get\",t),!n&&he(s,\"get\",i);const{has:o}=pn(s),l=r?Er:n?Or:Dt;if(o.call(s,t))return l(e.get(t));if(o.call(s,i))return l(e.get(i));e!==s&&e.get(t)}function Kt(e,t=!1){const n=this.__v_raw,r=D(n),s=D(e);return e!==s&&!t&&he(r,\"has\",e),!t&&he(r,\"has\",s),e===s?n.has(e):n.has(e)||n.has(s)}function Vt(e,t=!1){return e=e.__v_raw,!t&&he(D(e),\"iterate\",Ze),Reflect.get(e,\"size\",e)}function es(e){e=D(e);const t=D(this);return pn(t).has.call(t,e)||(t.add(e),Le(t,\"add\",e,e)),this}function ts(e,t){t=D(t);const n=D(this),{has:r,get:s}=pn(n);let i=r.call(n,e);i||(e=D(e),i=r.call(n,e));const o=s.call(n,e);return n.set(e,t),i?Mt(t,o)&&Le(n,\"set\",e,t):Le(n,\"add\",e,t),this}function ns(e){const t=D(this),{has:n,get:r}=pn(t);let s=n.call(t,e);s||(e=D(e),s=n.call(t,e)),r&&r.call(t,e);const i=t.delete(e);return s&&Le(t,\"delete\",e,void 0),i}function rs(){const e=D(this),t=e.size!==0,n=e.clear();return t&&Le(e,\"clear\",void 0,void 0),n}function Wt(e,t){return function(r,s){const i=this,o=i.__v_raw,l=D(o),u=t?Er:e?Or:Dt;return!e&&he(l,\"iterate\",Ze),o.forEach((d,c)=>r.call(s,u(d),u(c),i))}}function Jt(e,t,n){return function(...r){const s=this.__v_raw,i=D(s),o=dt(i),l=e===\"entries\"||e===Symbol.iterator&&o,u=e===\"keys\"&&o,d=s[e](...r),c=n?Er:t?Or:Dt;return!t&&he(i,\"iterate\",u?Wn:Ze),{next(){const{value:h,done:g}=d.next();return g?{value:h,done:g}:{value:l?[c(h[0]),c(h[1])]:c(h),done:g}},[Symbol.iterator](){return this}}}}function je(e){return function(...t){return e===\"delete\"?!1:this}}function Wo(){const e={get(i){return qt(this,i)},get size(){return Vt(this)},has:Kt,add:es,set:ts,delete:ns,clear:rs,forEach:Wt(!1,!1)},t={get(i){return qt(this,i,!1,!0)},get size(){return Vt(this)},has:Kt,add:es,set:ts,delete:ns,clear:rs,forEach:Wt(!1,!0)},n={get(i){return qt(this,i,!0)},get size(){return Vt(this,!0)},has(i){return Kt.call(this,i,!0)},add:je(\"add\"),set:je(\"set\"),delete:je(\"delete\"),clear:je(\"clear\"),forEach:Wt(!0,!1)},r={get(i){return qt(this,i,!0,!0)},get size(){return Vt(this,!0)},has(i){return Kt.call(this,i,!0)},add:je(\"add\"),set:je(\"set\"),delete:je(\"delete\"),clear:je(\"clear\"),forEach:Wt(!0,!0)};return[\"keys\",\"values\",\"entries\",Symbol.iterator].forEach(i=>{e[i]=Jt(i,!1,!1),n[i]=Jt(i,!0,!1),t[i]=Jt(i,!1,!0),r[i]=Jt(i,!0,!0)}),[e,n,t,r]}const[Jo,zo,Xo,Yo]=Wo();function xr(e,t){const n=t?e?Yo:Xo:e?zo:Jo;return(r,s,i)=>s===\"__v_isReactive\"?!e:s===\"__v_isReadonly\"?e:s===\"__v_raw\"?r:Reflect.get(M(n,s)&&s in r?n:r,s,i)}const Zo={get:xr(!1,!1)},Qo={get:xr(!1,!0)},Go={get:xr(!0,!1)},Ys=new WeakMap,Zs=new WeakMap,Qs=new WeakMap,el=new WeakMap;function tl(e){switch(e){case\"Object\":case\"Array\":return 1;case\"Map\":case\"Set\":case\"WeakMap\":case\"WeakSet\":return 2;default:return 0}}function nl(e){return e.__v_skip||!Object.isExtensible(e)?0:tl(Oo(e))}function Ut(e){return Lt(e)?e:Cr(e,!1,Xs,Zo,Ys)}function rl(e){return Cr(e,!1,Vo,Qo,Zs)}function Gs(e){return Cr(e,!0,Ko,Go,Qs)}function Cr(e,t,n,r,s){if(!te(e)||e.__v_raw&&!(t&&e.__v_isReactive))return e;const i=s.get(e);if(i)return i;const o=nl(e);if(o===0)return e;const l=new Proxy(e,o===2?r:n);return s.set(e,l),l}function ht(e){return Lt(e)?ht(e.__v_raw):!!(e&&e.__v_isReactive)}function Lt(e){return!!(e&&e.__v_isReadonly)}function ei(e){return!!(e&&e.__v_isShallow)}function ti(e){return ht(e)||Lt(e)}function D(e){const t=e&&e.__v_raw;return t?D(t):e}function ni(e){return en(e,\"__v_skip\",!0),e}const Dt=e=>te(e)?Ut(e):e,Or=e=>te(e)?Gs(e):e;function ri(e){qe&&we&&(e=D(e),Ws(e.dep||(e.dep=yr())))}function si(e,t){e=D(e),e.dep&&Jn(e.dep)}function Q(e){return!!(e&&e.__v_isRef===!0)}function $n(e){return sl(e,!1)}function sl(e,t){return Q(e)?e:new il(e,t)}class il{constructor(t,n){this.__v_isShallow=n,this.dep=void 0,this.__v_isRef=!0,this._rawValue=n?t:D(t),this._value=n?t:Dt(t)}get value(){return ri(this),this._value}set value(t){t=this.__v_isShallow?t:D(t),Mt(t,this._rawValue)&&(this._rawValue=t,this._value=this.__v_isShallow?t:Dt(t),si(this))}}function ol(e){return Q(e)?e.value:e}const ll={get:(e,t,n)=>ol(Reflect.get(e,t,n)),set:(e,t,n,r)=>{const s=e[t];return Q(s)&&!Q(n)?(s.value=n,!0):Reflect.set(e,t,n,r)}};function ii(e){return ht(e)?e:new Proxy(e,ll)}function mn(e){const t=F(e)?new Array(e.length):{};for(const n in e)t[n]=al(e,n);return t}class ul{constructor(t,n,r){this._object=t,this._key=n,this._defaultValue=r,this.__v_isRef=!0}get value(){const t=this._object[this._key];return t===void 0?this._defaultValue:t}set value(t){this._object[this._key]=t}}function al(e,t,n){const r=e[t];return Q(r)?r:new ul(e,t,n)}class cl{constructor(t,n,r,s){this._setter=n,this.dep=void 0,this.__v_isRef=!0,this._dirty=!0,this.effect=new vr(t,()=>{this._dirty||(this._dirty=!0,si(this))}),this.effect.computed=this,this.effect.active=this._cacheable=!s,this.__v_isReadonly=r}get value(){const t=D(this);return ri(t),(t._dirty||!t._cacheable)&&(t._dirty=!1,t._value=t.effect.run()),t._value}set value(t){this._setter(t)}}function fl(e,t,n=!1){let r,s;const i=$(e);return i?(r=e,s=xe):(r=e.get,s=e.set),new cl(r,s,i||!s,n)}function Ke(e,t,n,r){let s;try{s=r?e(...r):e()}catch(i){gn(i,t,n)}return s}function ge(e,t,n,r){if($(e)){const i=Ke(e,t,n,r);return i&&Us(i)&&i.catch(o=>{gn(o,t,n)}),i}const s=[];for(let i=0;i<e.length;i++)s.push(ge(e[i],t,n,r));return s}function gn(e,t,n,r=!0){const s=t?t.vnode:null;if(t){let i=t.parent;const o=t.proxy,l=n;for(;i;){const d=i.ec;if(d){for(let c=0;c<d.length;c++)if(d[c](e,o,l)===!1)return}i=i.parent}const u=t.appContext.config.errorHandler;if(u){Ke(u,null,10,[e,o,l]);return}}dl(e,n,s,r)}function dl(e,t,n,r=!0){console.error(e)}let tn=!1,zn=!1;const de=[];let Me=0;const Pt=[];let St=null,ut=0;const Nt=[];let Ue=null,at=0;const oi=Promise.resolve();let Ar=null,Xn=null;function hl(e){const t=Ar||oi;return e?t.then(this?e.bind(this):e):t}function pl(e){let t=Me+1,n=de.length;for(;t<n;){const r=t+n>>>1;Bt(de[r])<e?t=r+1:n=r}return t}function li(e){(!de.length||!de.includes(e,tn&&e.allowRecurse?Me+1:Me))&&e!==Xn&&(e.id==null?de.push(e):de.splice(pl(e.id),0,e),ui())}function ui(){!tn&&!zn&&(zn=!0,Ar=oi.then(fi))}function ml(e){const t=de.indexOf(e);t>Me&&de.splice(t,1)}function ai(e,t,n,r){F(e)?n.push(...e):(!t||!t.includes(e,e.allowRecurse?r+1:r))&&n.push(e),ui()}function gl(e){ai(e,St,Pt,ut)}function bl(e){ai(e,Ue,Nt,at)}function Tr(e,t=null){if(Pt.length){for(Xn=t,St=[...new Set(Pt)],Pt.length=0,ut=0;ut<St.length;ut++)St[ut]();St=null,ut=0,Xn=null,Tr(e,t)}}function ci(e){if(Nt.length){const t=[...new Set(Nt)];if(Nt.length=0,Ue){Ue.push(...t);return}for(Ue=t,Ue.sort((n,r)=>Bt(n)-Bt(r)),at=0;at<Ue.length;at++)Ue[at]();Ue=null,at=0}}const Bt=e=>e.id==null?1/0:e.id;function fi(e){zn=!1,tn=!0,Tr(e),de.sort((n,r)=>Bt(n)-Bt(r));const t=xe;try{for(Me=0;Me<de.length;Me++){const n=de[Me];n&&n.active!==!1&&Ke(n,null,14)}}finally{Me=0,de.length=0,ci(),tn=!1,Ar=null,(de.length||Pt.length||Nt.length)&&fi(e)}}function _l(e,t,...n){if(e.isUnmounted)return;const r=e.vnode.props||k;let s=n;const i=t.startsWith(\"update:\"),o=i&&t.slice(7);if(o&&o in r){const c=`${o===\"modelValue\"?\"model\":o}Modifiers`,{number:h,trim:g}=r[c]||k;g?s=n.map(E=>E.trim()):h&&(s=n.map(Ro))}let l,u=r[l=In(t)]||r[l=In(Pe(t))];!u&&i&&(u=r[l=In(yt(t))]),u&&ge(u,e,6,s);const d=r[l+\"Once\"];if(d){if(!e.emitted)e.emitted={};else if(e.emitted[l])return;e.emitted[l]=!0,ge(d,e,6,s)}}function di(e,t,n=!1){const r=t.emitsCache,s=r.get(e);if(s!==void 0)return s;const i=e.emits;let o={},l=!1;if(!$(e)){const u=d=>{const c=di(d,t,!0);c&&(l=!0,re(o,c))};!n&&t.mixins.length&&t.mixins.forEach(u),e.extends&&u(e.extends),e.mixins&&e.mixins.forEach(u)}return!i&&!l?(r.set(e,null),null):(F(i)?i.forEach(u=>o[u]=null):re(o,i),r.set(e,o),o)}function bn(e,t){return!e||!cn(t)?!1:(t=t.slice(2).replace(/Once$/,\"\"),M(e,t[0].toLowerCase()+t.slice(1))||M(e,yt(t))||M(e,t))}let Ee=null,_n=null;function nn(e){const t=Ee;return Ee=e,_n=e&&e.type.__scopeId||null,t}function hi(e){_n=e}function pi(){_n=null}function yl(e,t=Ee,n){if(!t||e._n)return e;const r=(...s)=>{r._d&&ps(-1);const i=nn(t),o=e(...s);return nn(i),r._d&&ps(1),o};return r._n=!0,r._c=!0,r._d=!0,r}function Mn(e){const{type:t,vnode:n,proxy:r,withProxy:s,props:i,propsOptions:[o],slots:l,attrs:u,emit:d,render:c,renderCache:h,data:g,setupState:E,ctx:N,inheritAttrs:I}=e;let S,O;const W=nn(e);try{if(n.shapeFlag&4){const H=s||r;S=Se(c.call(H,H,h,i,E,g,N)),O=u}else{const H=t;S=Se(H.length>1?H(i,{attrs:u,slots:l,emit:d}):H(i,null)),O=t.props?u:vl(u)}}catch(H){Ft.length=0,gn(H,e,1),S=R(Ce)}let B=S;if(O&&I!==!1){const H=Object.keys(O),{shapeFlag:z}=B;H.length&&z&7&&(o&&H.some(mr)&&(O=wl(O,o)),B=et(B,O))}return n.dirs&&(B.dirs=B.dirs?B.dirs.concat(n.dirs):n.dirs),n.transition&&(B.transition=n.transition),S=B,nn(W),S}const vl=e=>{let t;for(const n in e)(n===\"class\"||n===\"style\"||cn(n))&&((t||(t={}))[n]=e[n]);return t},wl=(e,t)=>{const n={};for(const r in e)(!mr(r)||!(r.slice(9)in t))&&(n[r]=e[r]);return n};function El(e,t,n){const{props:r,children:s,component:i}=e,{props:o,children:l,patchFlag:u}=t,d=i.emitsOptions;if(t.dirs||t.transition)return!0;if(n&&u>=0){if(u&1024)return!0;if(u&16)return r?ss(r,o,d):!!o;if(u&8){const c=t.dynamicProps;for(let h=0;h<c.length;h++){const g=c[h];if(o[g]!==r[g]&&!bn(d,g))return!0}}}else return(s||l)&&(!l||!l.$stable)?!0:r===o?!1:r?o?ss(r,o,d):!0:!!o;return!1}function ss(e,t,n){const r=Object.keys(t);if(r.length!==Object.keys(e).length)return!0;for(let s=0;s<r.length;s++){const i=r[s];if(t[i]!==e[i]&&!bn(n,i))return!0}return!1}function xl({vnode:e,parent:t},n){for(;t&&t.subTree===e;)(e=t.vnode).el=n,t=t.parent}const Cl=e=>e.__isSuspense;function Ol(e,t){t&&t.pendingBranch?F(e)?t.effects.push(...e):t.effects.push(e):bl(e)}function Al(e,t){if(Z){let n=Z.provides;const r=Z.parent&&Z.parent.provides;r===n&&(n=Z.provides=Object.create(r)),n[e]=t}}function Ln(e,t,n=!1){const r=Z||Ee;if(r){const s=r.parent==null?r.vnode.appContext&&r.vnode.appContext.provides:r.parent.provides;if(s&&e in s)return s[e];if(arguments.length>1)return n&&$(t)?t.call(r.proxy):t}}const is={};function It(e,t,n){return mi(e,t,n)}function mi(e,t,{immediate:n,deep:r,flush:s,onTrack:i,onTrigger:o}=k){const l=Z;let u,d=!1,c=!1;if(Q(e)?(u=()=>e.value,d=ei(e)):ht(e)?(u=()=>e,r=!0):F(e)?(c=!0,d=e.some(ht),u=()=>e.map(O=>{if(Q(O))return O.value;if(ht(O))return ct(O);if($(O))return Ke(O,l,2)})):$(e)?t?u=()=>Ke(e,l,2):u=()=>{if(!(l&&l.isUnmounted))return h&&h(),ge(e,l,3,[g])}:u=xe,t&&r){const O=u;u=()=>ct(O())}let h,g=O=>{h=S.onStop=()=>{Ke(O,l,4)}};if(jt)return g=xe,t?n&&ge(t,l,3,[u(),c?[]:void 0,g]):u(),xe;let E=c?[]:is;const N=()=>{if(!!S.active)if(t){const O=S.run();(r||d||(c?O.some((W,B)=>Mt(W,E[B])):Mt(O,E)))&&(h&&h(),ge(t,l,3,[O,E===is?void 0:E,g]),E=O)}else S.run()};N.allowRecurse=!!t;let I;s===\"sync\"?I=N:s===\"post\"?I=()=>oe(N,l&&l.suspense):I=()=>{!l||l.isMounted?gl(N):N()};const S=new vr(u,I);return t?n?N():E=S.run():s===\"post\"?oe(S.run.bind(S),l&&l.suspense):S.run(),()=>{S.stop(),l&&l.scope&&gr(l.scope.effects,S)}}function Tl(e,t,n){const r=this.proxy,s=ee(e)?e.includes(\".\")?gi(r,e):()=>r[e]:e.bind(r,r);let i;$(t)?i=t:(i=t.handler,n=t);const o=Z;mt(this);const l=mi(s,i.bind(r),n);return o?mt(o):Ge(),l}function gi(e,t){const n=t.split(\".\");return()=>{let r=e;for(let s=0;s<n.length&&r;s++)r=r[n[s]];return r}}function ct(e,t){if(!te(e)||e.__v_skip||(t=t||new Set,t.has(e)))return e;if(t.add(e),Q(e))ct(e.value,t);else if(F(e))for(let n=0;n<e.length;n++)ct(e[n],t);else if(js(e)||dt(e))e.forEach(n=>{ct(n,t)});else if(ks(e))for(const n in e)ct(e[n],t);return e}function Rl(){const e={isMounted:!1,isLeaving:!1,isUnmounting:!1,leavingVNodes:new Map};return wn(()=>{e.isMounted=!0}),Rr(()=>{e.isUnmounting=!0}),e}const pe=[Function,Array],Sl={name:\"BaseTransition\",props:{mode:String,appear:Boolean,persisted:Boolean,onBeforeEnter:pe,onEnter:pe,onAfterEnter:pe,onEnterCancelled:pe,onBeforeLeave:pe,onLeave:pe,onAfterLeave:pe,onLeaveCancelled:pe,onBeforeAppear:pe,onAppear:pe,onAfterAppear:pe,onAppearCancelled:pe},setup(e,{slots:t}){const n=Mi(),r=Rl();let s;return()=>{const i=t.default&&_i(t.default(),!0);if(!i||!i.length)return;let o=i[0];if(i.length>1){for(const I of i)if(I.type!==Ce){o=I;break}}const l=D(e),{mode:u}=l;if(r.isLeaving)return Dn(o);const d=os(o);if(!d)return Dn(o);const c=Yn(d,l,r,n);Zn(d,c);const h=n.subTree,g=h&&os(h);let E=!1;const{getTransitionKey:N}=d.type;if(N){const I=N();s===void 0?s=I:I!==s&&(s=I,E=!0)}if(g&&g.type!==Ce&&(!Xe(d,g)||E)){const I=Yn(g,l,r,n);if(Zn(g,I),u===\"out-in\")return r.isLeaving=!0,I.afterLeave=()=>{r.isLeaving=!1,n.update()},Dn(o);u===\"in-out\"&&d.type!==Ce&&(I.delayLeave=(S,O,W)=>{const B=bi(r,g);B[String(g.key)]=g,S._leaveCb=()=>{O(),S._leaveCb=void 0,delete c.delayedLeave},c.delayedLeave=W})}return o}}},Pl=Sl;function bi(e,t){const{leavingVNodes:n}=e;let r=n.get(t.type);return r||(r=Object.create(null),n.set(t.type,r)),r}function Yn(e,t,n,r){const{appear:s,mode:i,persisted:o=!1,onBeforeEnter:l,onEnter:u,onAfterEnter:d,onEnterCancelled:c,onBeforeLeave:h,onLeave:g,onAfterLeave:E,onLeaveCancelled:N,onBeforeAppear:I,onAppear:S,onAfterAppear:O,onAppearCancelled:W}=t,B=String(e.key),H=bi(n,e),z=(j,G)=>{j&&ge(j,r,9,G)},Ne={mode:i,persisted:o,beforeEnter(j){let G=l;if(!n.isMounted)if(s)G=I||l;else return;j._leaveCb&&j._leaveCb(!0);const X=H[B];X&&Xe(e,X)&&X.el._leaveCb&&X.el._leaveCb(),z(G,[j])},enter(j){let G=u,X=d,be=c;if(!n.isMounted)if(s)G=S||u,X=O||d,be=W||c;else return;let ue=!1;const _e=j._enterCb=nt=>{ue||(ue=!0,nt?z(be,[j]):z(X,[j]),Ne.delayedLeave&&Ne.delayedLeave(),j._enterCb=void 0)};G?(G(j,_e),G.length<=1&&_e()):_e()},leave(j,G){const X=String(e.key);if(j._enterCb&&j._enterCb(!0),n.isUnmounting)return G();z(h,[j]);let be=!1;const ue=j._leaveCb=_e=>{be||(be=!0,G(),_e?z(N,[j]):z(E,[j]),j._leaveCb=void 0,H[X]===e&&delete H[X])};H[X]=e,g?(g(j,ue),g.length<=1&&ue()):ue()},clone(j){return Yn(j,t,n,r)}};return Ne}function Dn(e){if(yn(e))return e=et(e),e.children=null,e}function os(e){return yn(e)?e.children?e.children[0]:void 0:e}function Zn(e,t){e.shapeFlag&6&&e.component?Zn(e.component.subTree,t):e.shapeFlag&128?(e.ssContent.transition=t.clone(e.ssContent),e.ssFallback.transition=t.clone(e.ssFallback)):e.transition=t}function _i(e,t=!1,n){let r=[],s=0;for(let i=0;i<e.length;i++){let o=e[i];const l=n==null?o.key:String(n)+String(o.key!=null?o.key:i);o.type===fe?(o.patchFlag&128&&s++,r=r.concat(_i(o.children,t,l))):(t||o.type!==Ce)&&r.push(l!=null?et(o,{key:l}):o)}if(s>1)for(let i=0;i<r.length;i++)r[i].patchFlag=-2;return r}const Qn=e=>!!e.type.__asyncLoader,yn=e=>e.type.__isKeepAlive;function Nl(e,t){yi(e,\"a\",t)}function Il(e,t){yi(e,\"da\",t)}function yi(e,t,n=Z){const r=e.__wdc||(e.__wdc=()=>{let s=n;for(;s;){if(s.isDeactivated)return;s=s.parent}return e()});if(vn(t,r,n),n){let s=n.parent;for(;s&&s.parent;)yn(s.parent.vnode)&&Fl(r,t,n,s),s=s.parent}}function Fl(e,t,n,r){const s=vn(t,e,r,!0);vi(()=>{gr(r[t],s)},n)}function vn(e,t,n=Z,r=!1){if(n){const s=n[e]||(n[e]=[]),i=t.__weh||(t.__weh=(...o)=>{if(n.isUnmounted)return;vt(),mt(n);const l=ge(t,n,e,o);return Ge(),wt(),l});return r?s.unshift(i):s.push(i),i}}const De=e=>(t,n=Z)=>(!jt||e===\"sp\")&&vn(e,t,n),$l=De(\"bm\"),wn=De(\"m\"),Ml=De(\"bu\"),Ll=De(\"u\"),Rr=De(\"bum\"),vi=De(\"um\"),Dl=De(\"sp\"),Bl=De(\"rtg\"),jl=De(\"rtc\");function Ul(e,t=Z){vn(\"ec\",e,t)}let Gn=!0;function Hl(e){const t=Ei(e),n=e.proxy,r=e.ctx;Gn=!1,t.beforeCreate&&ls(t.beforeCreate,e,\"bc\");const{data:s,computed:i,methods:o,watch:l,provide:u,inject:d,created:c,beforeMount:h,mounted:g,beforeUpdate:E,updated:N,activated:I,deactivated:S,beforeDestroy:O,beforeUnmount:W,destroyed:B,unmounted:H,render:z,renderTracked:Ne,renderTriggered:j,errorCaptured:G,serverPrefetch:X,expose:be,inheritAttrs:ue,components:_e,directives:nt,filters:Hr}=t;if(d&&kl(d,r,null,e.appContext.config.unwrapInjectedRef),o)for(const J in o){const q=o[J];$(q)&&(r[J]=q.bind(n))}if(s){const J=s.call(n,n);te(J)&&(e.data=Ut(J))}if(Gn=!0,i)for(const J in i){const q=i[J],Ie=$(q)?q.bind(n,n):$(q.get)?q.get.bind(n,n):xe,Rn=!$(q)&&$(q.set)?q.set.bind(n):xe,xt=sr({get:Ie,set:Rn});Object.defineProperty(r,J,{enumerable:!0,configurable:!0,get:()=>xt.value,set:rt=>xt.value=rt})}if(l)for(const J in l)wi(l[J],r,n,J);if(u){const J=$(u)?u.call(n):u;Reflect.ownKeys(J).forEach(q=>{Al(q,J[q])})}c&&ls(c,e,\"c\");function ie(J,q){F(q)?q.forEach(Ie=>J(Ie.bind(n))):q&&J(q.bind(n))}if(ie($l,h),ie(wn,g),ie(Ml,E),ie(Ll,N),ie(Nl,I),ie(Il,S),ie(Ul,G),ie(jl,Ne),ie(Bl,j),ie(Rr,W),ie(vi,H),ie(Dl,X),F(be))if(be.length){const J=e.exposed||(e.exposed={});be.forEach(q=>{Object.defineProperty(J,q,{get:()=>n[q],set:Ie=>n[q]=Ie})})}else e.exposed||(e.exposed={});z&&e.render===xe&&(e.render=z),ue!=null&&(e.inheritAttrs=ue),_e&&(e.components=_e),nt&&(e.directives=nt)}function kl(e,t,n=xe,r=!1){F(e)&&(e=er(e));for(const s in e){const i=e[s];let o;te(i)?\"default\"in i?o=Ln(i.from||s,i.default,!0):o=Ln(i.from||s):o=Ln(i),Q(o)&&r?Object.defineProperty(t,s,{enumerable:!0,configurable:!0,get:()=>o.value,set:l=>o.value=l}):t[s]=o}}function ls(e,t,n){ge(F(e)?e.map(r=>r.bind(t.proxy)):e.bind(t.proxy),t,n)}function wi(e,t,n,r){const s=r.includes(\".\")?gi(n,r):()=>n[r];if(ee(e)){const i=t[e];$(i)&&It(s,i)}else if($(e))It(s,e.bind(n));else if(te(e))if(F(e))e.forEach(i=>wi(i,t,n,r));else{const i=$(e.handler)?e.handler.bind(n):t[e.handler];$(i)&&It(s,i,e)}}function Ei(e){const t=e.type,{mixins:n,extends:r}=t,{mixins:s,optionsCache:i,config:{optionMergeStrategies:o}}=e.appContext,l=i.get(t);let u;return l?u=l:!s.length&&!n&&!r?u=t:(u={},s.length&&s.forEach(d=>rn(u,d,o,!0)),rn(u,t,o)),i.set(t,u),u}function rn(e,t,n,r=!1){const{mixins:s,extends:i}=t;i&&rn(e,i,n,!0),s&&s.forEach(o=>rn(e,o,n,!0));for(const o in t)if(!(r&&o===\"expose\")){const l=ql[o]||n&&n[o];e[o]=l?l(e[o],t[o]):t[o]}return e}const ql={data:us,props:ze,emits:ze,methods:ze,computed:ze,beforeCreate:se,created:se,beforeMount:se,mounted:se,beforeUpdate:se,updated:se,beforeDestroy:se,beforeUnmount:se,destroyed:se,unmounted:se,activated:se,deactivated:se,errorCaptured:se,serverPrefetch:se,components:ze,directives:ze,watch:Vl,provide:us,inject:Kl};function us(e,t){return t?e?function(){return re($(e)?e.call(this,this):e,$(t)?t.call(this,this):t)}:t:e}function Kl(e,t){return ze(er(e),er(t))}function er(e){if(F(e)){const t={};for(let n=0;n<e.length;n++)t[e[n]]=e[n];return t}return e}function se(e,t){return e?[...new Set([].concat(e,t))]:t}function ze(e,t){return e?re(re(Object.create(null),e),t):t}function Vl(e,t){if(!e)return t;if(!t)return e;const n=re(Object.create(null),e);for(const r in t)n[r]=se(e[r],t[r]);return n}function Wl(e,t,n,r=!1){const s={},i={};en(i,En,1),e.propsDefaults=Object.create(null),xi(e,t,s,i);for(const o in e.propsOptions[0])o in s||(s[o]=void 0);n?e.props=r?s:rl(s):e.type.props?e.props=s:e.props=i,e.attrs=i}function Jl(e,t,n,r){const{props:s,attrs:i,vnode:{patchFlag:o}}=e,l=D(s),[u]=e.propsOptions;let d=!1;if((r||o>0)&&!(o&16)){if(o&8){const c=e.vnode.dynamicProps;for(let h=0;h<c.length;h++){let g=c[h];if(bn(e.emitsOptions,g))continue;const E=t[g];if(u)if(M(i,g))E!==i[g]&&(i[g]=E,d=!0);else{const N=Pe(g);s[N]=tr(u,l,N,E,e,!1)}else E!==i[g]&&(i[g]=E,d=!0)}}}else{xi(e,t,s,i)&&(d=!0);let c;for(const h in l)(!t||!M(t,h)&&((c=yt(h))===h||!M(t,c)))&&(u?n&&(n[h]!==void 0||n[c]!==void 0)&&(s[h]=tr(u,l,h,void 0,e,!0)):delete s[h]);if(i!==l)for(const h in i)(!t||!M(t,h)&&!0)&&(delete i[h],d=!0)}d&&Le(e,\"set\",\"$attrs\")}function xi(e,t,n,r){const[s,i]=e.propsOptions;let o=!1,l;if(t)for(let u in t){if(Yt(u))continue;const d=t[u];let c;s&&M(s,c=Pe(u))?!i||!i.includes(c)?n[c]=d:(l||(l={}))[c]=d:bn(e.emitsOptions,u)||(!(u in r)||d!==r[u])&&(r[u]=d,o=!0)}if(i){const u=D(n),d=l||k;for(let c=0;c<i.length;c++){const h=i[c];n[h]=tr(s,u,h,d[h],e,!M(d,h))}}return o}function tr(e,t,n,r,s,i){const o=e[n];if(o!=null){const l=M(o,\"default\");if(l&&r===void 0){const u=o.default;if(o.type!==Function&&$(u)){const{propsDefaults:d}=s;n in d?r=d[n]:(mt(s),r=d[n]=u.call(null,t),Ge())}else r=u}o[0]&&(i&&!l?r=!1:o[1]&&(r===\"\"||r===yt(n))&&(r=!0))}return r}function Ci(e,t,n=!1){const r=t.propsCache,s=r.get(e);if(s)return s;const i=e.props,o={},l=[];let u=!1;if(!$(e)){const c=h=>{u=!0;const[g,E]=Ci(h,t,!0);re(o,g),E&&l.push(...E)};!n&&t.mixins.length&&t.mixins.forEach(c),e.extends&&c(e.extends),e.mixins&&e.mixins.forEach(c)}if(!i&&!u)return r.set(e,ft),ft;if(F(i))for(let c=0;c<i.length;c++){const h=Pe(i[c]);as(h)&&(o[h]=k)}else if(i)for(const c in i){const h=Pe(c);if(as(h)){const g=i[c],E=o[h]=F(g)||$(g)?{type:g}:g;if(E){const N=ds(Boolean,E.type),I=ds(String,E.type);E[0]=N>-1,E[1]=I<0||N<I,(N>-1||M(E,\"default\"))&&l.push(h)}}}const d=[o,l];return r.set(e,d),d}function as(e){return e[0]!==\"$\"}function cs(e){const t=e&&e.toString().match(/^\\s*function (\\w+)/);return t?t[1]:e===null?\"null\":\"\"}function fs(e,t){return cs(e)===cs(t)}function ds(e,t){return F(t)?t.findIndex(n=>fs(n,e)):$(t)&&fs(t,e)?0:-1}const Oi=e=>e[0]===\"_\"||e===\"$stable\",Sr=e=>F(e)?e.map(Se):[Se(e)],zl=(e,t,n)=>{const r=yl((...s)=>Sr(t(...s)),n);return r._c=!1,r},Ai=(e,t,n)=>{const r=e._ctx;for(const s in e){if(Oi(s))continue;const i=e[s];if($(i))t[s]=zl(s,i,r);else if(i!=null){const o=Sr(i);t[s]=()=>o}}},Ti=(e,t)=>{const n=Sr(t);e.slots.default=()=>n},Xl=(e,t)=>{if(e.vnode.shapeFlag&32){const n=t._;n?(e.slots=D(t),en(t,\"_\",n)):Ai(t,e.slots={})}else e.slots={},t&&Ti(e,t);en(e.slots,En,1)},Yl=(e,t,n)=>{const{vnode:r,slots:s}=e;let i=!0,o=k;if(r.shapeFlag&32){const l=t._;l?n&&l===1?i=!1:(re(s,t),!n&&l===1&&delete s._):(i=!t.$stable,Ai(t,s)),o=t}else t&&(Ti(e,t),o={default:1});if(i)for(const l in s)!Oi(l)&&!(l in o)&&delete s[l]};function We(e,t,n,r){const s=e.dirs,i=t&&t.dirs;for(let o=0;o<s.length;o++){const l=s[o];i&&(l.oldValue=i[o].value);let u=l.dir[r];u&&(vt(),ge(u,n,8,[e.el,l,e,t]),wt())}}function Ri(){return{app:null,config:{isNativeTag:Eo,performance:!1,globalProperties:{},optionMergeStrategies:{},errorHandler:void 0,warnHandler:void 0,compilerOptions:{}},mixins:[],components:{},directives:{},provides:Object.create(null),optionsCache:new WeakMap,propsCache:new WeakMap,emitsCache:new WeakMap}}let Zl=0;function Ql(e,t){return function(r,s=null){$(r)||(r=Object.assign({},r)),s!=null&&!te(s)&&(s=null);const i=Ri(),o=new Set;let l=!1;const u=i.app={_uid:Zl++,_component:r,_props:s,_container:null,_context:i,_instance:null,version:Eu,get config(){return i.config},set config(d){},use(d,...c){return o.has(d)||(d&&$(d.install)?(o.add(d),d.install(u,...c)):$(d)&&(o.add(d),d(u,...c))),u},mixin(d){return i.mixins.includes(d)||i.mixins.push(d),u},component(d,c){return c?(i.components[d]=c,u):i.components[d]},directive(d,c){return c?(i.directives[d]=c,u):i.directives[d]},mount(d,c,h){if(!l){const g=R(r,s);return g.appContext=i,c&&t?t(g,d):e(g,d,h),l=!0,u._container=d,d.__vue_app__=u,Ir(g.component)||g.component.proxy}},unmount(){l&&(e(null,u._container),delete u._container.__vue_app__)},provide(d,c){return i.provides[d]=c,u}};return u}}function nr(e,t,n,r,s=!1){if(F(e)){e.forEach((g,E)=>nr(g,t&&(F(t)?t[E]:t),n,r,s));return}if(Qn(r)&&!s)return;const i=r.shapeFlag&4?Ir(r.component)||r.component.proxy:r.el,o=s?null:i,{i:l,r:u}=e,d=t&&t.r,c=l.refs===k?l.refs={}:l.refs,h=l.setupState;if(d!=null&&d!==u&&(ee(d)?(c[d]=null,M(h,d)&&(h[d]=null)):Q(d)&&(d.value=null)),$(u))Ke(u,l,12,[o,c]);else{const g=ee(u),E=Q(u);if(g||E){const N=()=>{if(e.f){const I=g?c[u]:u.value;s?F(I)&&gr(I,i):F(I)?I.includes(i)||I.push(i):g?(c[u]=[i],M(h,u)&&(h[u]=c[u])):(u.value=[i],e.k&&(c[e.k]=u.value))}else g?(c[u]=o,M(h,u)&&(h[u]=o)):Q(u)&&(u.value=o,e.k&&(c[e.k]=o))};o?(N.id=-1,oe(N,n)):N()}}}const oe=Ol;function Gl(e){return eu(e)}function eu(e,t){const n=So();n.__VUE__=!0;const{insert:r,remove:s,patchProp:i,createElement:o,createText:l,createComment:u,setText:d,setElementText:c,parentNode:h,nextSibling:g,setScopeId:E=xe,cloneNode:N,insertStaticContent:I}=e,S=(a,f,p,b=null,m=null,v=null,x=!1,y=null,w=!!f.dynamicChildren)=>{if(a===f)return;a&&!Xe(a,f)&&(b=Ht(a),Be(a,m,v,!0),a=null),f.patchFlag===-2&&(w=!1,f.dynamicChildren=null);const{type:_,ref:A,shapeFlag:C}=f;switch(_){case Pr:O(a,f,p,b);break;case Ce:W(a,f,p,b);break;case Bn:a==null&&B(f,p,b,x);break;case fe:nt(a,f,p,b,m,v,x,y,w);break;default:C&1?Ne(a,f,p,b,m,v,x,y,w):C&6?Hr(a,f,p,b,m,v,x,y,w):(C&64||C&128)&&_.process(a,f,p,b,m,v,x,y,w,st)}A!=null&&m&&nr(A,a&&a.ref,v,f||a,!f)},O=(a,f,p,b)=>{if(a==null)r(f.el=l(f.children),p,b);else{const m=f.el=a.el;f.children!==a.children&&d(m,f.children)}},W=(a,f,p,b)=>{a==null?r(f.el=u(f.children||\"\"),p,b):f.el=a.el},B=(a,f,p,b)=>{[a.el,a.anchor]=I(a.children,f,p,b,a.el,a.anchor)},H=({el:a,anchor:f},p,b)=>{let m;for(;a&&a!==f;)m=g(a),r(a,p,b),a=m;r(f,p,b)},z=({el:a,anchor:f})=>{let p;for(;a&&a!==f;)p=g(a),s(a),a=p;s(f)},Ne=(a,f,p,b,m,v,x,y,w)=>{x=x||f.type===\"svg\",a==null?j(f,p,b,m,v,x,y,w):be(a,f,m,v,x,y,w)},j=(a,f,p,b,m,v,x,y)=>{let w,_;const{type:A,props:C,shapeFlag:T,transition:P,patchFlag:L,dirs:V}=a;if(a.el&&N!==void 0&&L===-1)w=a.el=N(a.el);else{if(w=a.el=o(a.type,v,C&&C.is,C),T&8?c(w,a.children):T&16&&X(a.children,w,null,b,m,v&&A!==\"foreignObject\",x,y),V&&We(a,null,b,\"created\"),C){for(const K in C)K!==\"value\"&&!Yt(K)&&i(w,K,null,C[K],v,a.children,b,m,Fe);\"value\"in C&&i(w,\"value\",null,C.value),(_=C.onVnodeBeforeMount)&&Te(_,b,a)}G(w,a,a.scopeId,x,b)}V&&We(a,null,b,\"beforeMount\");const U=(!m||m&&!m.pendingBranch)&&P&&!P.persisted;U&&P.beforeEnter(w),r(w,f,p),((_=C&&C.onVnodeMounted)||U||V)&&oe(()=>{_&&Te(_,b,a),U&&P.enter(w),V&&We(a,null,b,\"mounted\")},m)},G=(a,f,p,b,m)=>{if(p&&E(a,p),b)for(let v=0;v<b.length;v++)E(a,b[v]);if(m){let v=m.subTree;if(f===v){const x=m.vnode;G(a,x,x.scopeId,x.slotScopeIds,m.parent)}}},X=(a,f,p,b,m,v,x,y,w=0)=>{for(let _=w;_<a.length;_++){const A=a[_]=y?He(a[_]):Se(a[_]);S(null,A,f,p,b,m,v,x,y)}},be=(a,f,p,b,m,v,x)=>{const y=f.el=a.el;let{patchFlag:w,dynamicChildren:_,dirs:A}=f;w|=a.patchFlag&16;const C=a.props||k,T=f.props||k;let P;p&&Je(p,!1),(P=T.onVnodeBeforeUpdate)&&Te(P,p,f,a),A&&We(f,a,p,\"beforeUpdate\"),p&&Je(p,!0);const L=m&&f.type!==\"foreignObject\";if(_?ue(a.dynamicChildren,_,y,p,b,L,v):x||Ie(a,f,y,null,p,b,L,v,!1),w>0){if(w&16)_e(y,f,C,T,p,b,m);else if(w&2&&C.class!==T.class&&i(y,\"class\",null,T.class,m),w&4&&i(y,\"style\",C.style,T.style,m),w&8){const V=f.dynamicProps;for(let U=0;U<V.length;U++){const K=V[U],ye=C[K],it=T[K];(it!==ye||K===\"value\")&&i(y,K,ye,it,m,a.children,p,b,Fe)}}w&1&&a.children!==f.children&&c(y,f.children)}else!x&&_==null&&_e(y,f,C,T,p,b,m);((P=T.onVnodeUpdated)||A)&&oe(()=>{P&&Te(P,p,f,a),A&&We(f,a,p,\"updated\")},b)},ue=(a,f,p,b,m,v,x)=>{for(let y=0;y<f.length;y++){const w=a[y],_=f[y],A=w.el&&(w.type===fe||!Xe(w,_)||w.shapeFlag&70)?h(w.el):p;S(w,_,A,null,b,m,v,x,!0)}},_e=(a,f,p,b,m,v,x)=>{if(p!==b){for(const y in b){if(Yt(y))continue;const w=b[y],_=p[y];w!==_&&y!==\"value\"&&i(a,y,_,w,x,f.children,m,v,Fe)}if(p!==k)for(const y in p)!Yt(y)&&!(y in b)&&i(a,y,p[y],null,x,f.children,m,v,Fe);\"value\"in b&&i(a,\"value\",p.value,b.value)}},nt=(a,f,p,b,m,v,x,y,w)=>{const _=f.el=a?a.el:l(\"\"),A=f.anchor=a?a.anchor:l(\"\");let{patchFlag:C,dynamicChildren:T,slotScopeIds:P}=f;P&&(y=y?y.concat(P):P),a==null?(r(_,p,b),r(A,p,b),X(f.children,p,A,m,v,x,y,w)):C>0&&C&64&&T&&a.dynamicChildren?(ue(a.dynamicChildren,T,p,m,v,x,y),(f.key!=null||m&&f===m.subTree)&&Si(a,f,!0)):Ie(a,f,p,A,m,v,x,y,w)},Hr=(a,f,p,b,m,v,x,y,w)=>{f.slotScopeIds=y,a==null?f.shapeFlag&512?m.ctx.activate(f,p,b,x,w):Tn(f,p,b,m,v,x,w):ie(a,f,w)},Tn=(a,f,p,b,m,v,x)=>{const y=a.component=mu(a,b,m);if(yn(a)&&(y.ctx.renderer=st),gu(y),y.asyncDep){if(m&&m.registerDep(y,J),!a.el){const w=y.subTree=R(Ce);W(null,w,f,p)}return}J(y,a,f,p,m,v,x)},ie=(a,f,p)=>{const b=f.component=a.component;if(El(a,f,p))if(b.asyncDep&&!b.asyncResolved){q(b,f,p);return}else b.next=f,ml(b.update),b.update();else f.component=a.component,f.el=a.el,b.vnode=f},J=(a,f,p,b,m,v,x)=>{const y=()=>{if(a.isMounted){let{next:A,bu:C,u:T,parent:P,vnode:L}=a,V=A,U;Je(a,!1),A?(A.el=L.el,q(a,A,x)):A=L,C&&Fn(C),(U=A.props&&A.props.onVnodeBeforeUpdate)&&Te(U,P,A,L),Je(a,!0);const K=Mn(a),ye=a.subTree;a.subTree=K,S(ye,K,h(ye.el),Ht(ye),a,m,v),A.el=K.el,V===null&&xl(a,K.el),T&&oe(T,m),(U=A.props&&A.props.onVnodeUpdated)&&oe(()=>Te(U,P,A,L),m)}else{let A;const{el:C,props:T}=f,{bm:P,m:L,parent:V}=a,U=Qn(f);if(Je(a,!1),P&&Fn(P),!U&&(A=T&&T.onVnodeBeforeMount)&&Te(A,V,f),Je(a,!0),C&&Pn){const K=()=>{a.subTree=Mn(a),Pn(C,a.subTree,a,m,null)};U?f.type.__asyncLoader().then(()=>!a.isUnmounted&&K()):K()}else{const K=a.subTree=Mn(a);S(null,K,p,b,a,m,v),f.el=K.el}if(L&&oe(L,m),!U&&(A=T&&T.onVnodeMounted)){const K=f;oe(()=>Te(A,V,K),m)}f.shapeFlag&256&&a.a&&oe(a.a,m),a.isMounted=!0,f=p=b=null}},w=a.effect=new vr(y,()=>li(a.update),a.scope),_=a.update=w.run.bind(w);_.id=a.uid,Je(a,!0),_()},q=(a,f,p)=>{f.component=a;const b=a.vnode.props;a.vnode=f,a.next=null,Jl(a,f.props,b,p),Yl(a,f.children,p),vt(),Tr(void 0,a.update),wt()},Ie=(a,f,p,b,m,v,x,y,w=!1)=>{const _=a&&a.children,A=a?a.shapeFlag:0,C=f.children,{patchFlag:T,shapeFlag:P}=f;if(T>0){if(T&128){xt(_,C,p,b,m,v,x,y,w);return}else if(T&256){Rn(_,C,p,b,m,v,x,y,w);return}}P&8?(A&16&&Fe(_,m,v),C!==_&&c(p,C)):A&16?P&16?xt(_,C,p,b,m,v,x,y,w):Fe(_,m,v,!0):(A&8&&c(p,\"\"),P&16&&X(C,p,b,m,v,x,y,w))},Rn=(a,f,p,b,m,v,x,y,w)=>{a=a||ft,f=f||ft;const _=a.length,A=f.length,C=Math.min(_,A);let T;for(T=0;T<C;T++){const P=f[T]=w?He(f[T]):Se(f[T]);S(a[T],P,p,null,m,v,x,y,w)}_>A?Fe(a,m,v,!0,!1,C):X(f,p,b,m,v,x,y,w,C)},xt=(a,f,p,b,m,v,x,y,w)=>{let _=0;const A=f.length;let C=a.length-1,T=A-1;for(;_<=C&&_<=T;){const P=a[_],L=f[_]=w?He(f[_]):Se(f[_]);if(Xe(P,L))S(P,L,p,null,m,v,x,y,w);else break;_++}for(;_<=C&&_<=T;){const P=a[C],L=f[T]=w?He(f[T]):Se(f[T]);if(Xe(P,L))S(P,L,p,null,m,v,x,y,w);else break;C--,T--}if(_>C){if(_<=T){const P=T+1,L=P<A?f[P].el:b;for(;_<=T;)S(null,f[_]=w?He(f[_]):Se(f[_]),p,L,m,v,x,y,w),_++}}else if(_>T)for(;_<=C;)Be(a[_],m,v,!0),_++;else{const P=_,L=_,V=new Map;for(_=L;_<=T;_++){const ae=f[_]=w?He(f[_]):Se(f[_]);ae.key!=null&&V.set(ae.key,_)}let U,K=0;const ye=T-L+1;let it=!1,Kr=0;const Ct=new Array(ye);for(_=0;_<ye;_++)Ct[_]=0;for(_=P;_<=C;_++){const ae=a[_];if(K>=ye){Be(ae,m,v,!0);continue}let Ae;if(ae.key!=null)Ae=V.get(ae.key);else for(U=L;U<=T;U++)if(Ct[U-L]===0&&Xe(ae,f[U])){Ae=U;break}Ae===void 0?Be(ae,m,v,!0):(Ct[Ae-L]=_+1,Ae>=Kr?Kr=Ae:it=!0,S(ae,f[Ae],p,null,m,v,x,y,w),K++)}const Vr=it?tu(Ct):ft;for(U=Vr.length-1,_=ye-1;_>=0;_--){const ae=L+_,Ae=f[ae],Wr=ae+1<A?f[ae+1].el:b;Ct[_]===0?S(null,Ae,p,Wr,m,v,x,y,w):it&&(U<0||_!==Vr[U]?rt(Ae,p,Wr,2):U--)}}},rt=(a,f,p,b,m=null)=>{const{el:v,type:x,transition:y,children:w,shapeFlag:_}=a;if(_&6){rt(a.component.subTree,f,p,b);return}if(_&128){a.suspense.move(f,p,b);return}if(_&64){x.move(a,f,p,st);return}if(x===fe){r(v,f,p);for(let C=0;C<w.length;C++)rt(w[C],f,p,b);r(a.anchor,f,p);return}if(x===Bn){H(a,f,p);return}if(b!==2&&_&1&&y)if(b===0)y.beforeEnter(v),r(v,f,p),oe(()=>y.enter(v),m);else{const{leave:C,delayLeave:T,afterLeave:P}=y,L=()=>r(v,f,p),V=()=>{C(v,()=>{L(),P&&P()})};T?T(v,L,V):V()}else r(v,f,p)},Be=(a,f,p,b=!1,m=!1)=>{const{type:v,props:x,ref:y,children:w,dynamicChildren:_,shapeFlag:A,patchFlag:C,dirs:T}=a;if(y!=null&&nr(y,null,p,a,!0),A&256){f.ctx.deactivate(a);return}const P=A&1&&T,L=!Qn(a);let V;if(L&&(V=x&&x.onVnodeBeforeUnmount)&&Te(V,f,a),A&6)fo(a.component,p,b);else{if(A&128){a.suspense.unmount(p,b);return}P&&We(a,null,f,\"beforeUnmount\"),A&64?a.type.remove(a,f,p,m,st,b):_&&(v!==fe||C>0&&C&64)?Fe(_,f,p,!1,!0):(v===fe&&C&384||!m&&A&16)&&Fe(w,f,p),b&&kr(a)}(L&&(V=x&&x.onVnodeUnmounted)||P)&&oe(()=>{V&&Te(V,f,a),P&&We(a,null,f,\"unmounted\")},p)},kr=a=>{const{type:f,el:p,anchor:b,transition:m}=a;if(f===fe){co(p,b);return}if(f===Bn){z(a);return}const v=()=>{s(p),m&&!m.persisted&&m.afterLeave&&m.afterLeave()};if(a.shapeFlag&1&&m&&!m.persisted){const{leave:x,delayLeave:y}=m,w=()=>x(p,v);y?y(a.el,v,w):w()}else v()},co=(a,f)=>{let p;for(;a!==f;)p=g(a),s(a),a=p;s(f)},fo=(a,f,p)=>{const{bum:b,scope:m,update:v,subTree:x,um:y}=a;b&&Fn(b),m.stop(),v&&(v.active=!1,Be(x,a,f,p)),y&&oe(y,f),oe(()=>{a.isUnmounted=!0},f),f&&f.pendingBranch&&!f.isUnmounted&&a.asyncDep&&!a.asyncResolved&&a.suspenseId===f.pendingId&&(f.deps--,f.deps===0&&f.resolve())},Fe=(a,f,p,b=!1,m=!1,v=0)=>{for(let x=v;x<a.length;x++)Be(a[x],f,p,b,m)},Ht=a=>a.shapeFlag&6?Ht(a.component.subTree):a.shapeFlag&128?a.suspense.next():g(a.anchor||a.el),qr=(a,f,p)=>{a==null?f._vnode&&Be(f._vnode,null,null,!0):S(f._vnode||null,a,f,null,null,null,p),ci(),f._vnode=a},st={p:S,um:Be,m:rt,r:kr,mt:Tn,mc:X,pc:Ie,pbc:ue,n:Ht,o:e};let Sn,Pn;return t&&([Sn,Pn]=t(st)),{render:qr,hydrate:Sn,createApp:Ql(qr,Sn)}}function Je({effect:e,update:t},n){e.allowRecurse=t.allowRecurse=n}function Si(e,t,n=!1){const r=e.children,s=t.children;if(F(r)&&F(s))for(let i=0;i<r.length;i++){const o=r[i];let l=s[i];l.shapeFlag&1&&!l.dynamicChildren&&((l.patchFlag<=0||l.patchFlag===32)&&(l=s[i]=He(s[i]),l.el=o.el),n||Si(o,l))}}function tu(e){const t=e.slice(),n=[0];let r,s,i,o,l;const u=e.length;for(r=0;r<u;r++){const d=e[r];if(d!==0){if(s=n[n.length-1],e[s]<d){t[r]=s,n.push(r);continue}for(i=0,o=n.length-1;i<o;)l=i+o>>1,e[n[l]]<d?i=l+1:o=l;d<e[n[i]]&&(i>0&&(t[r]=n[i-1]),n[i]=r)}}for(i=n.length,o=n[i-1];i-- >0;)n[i]=o,o=t[o];return n}const nu=e=>e.__isTeleport,Pi=\"components\";function ru(e,t){return iu(Pi,e,!0,t)||e}const su=Symbol();function iu(e,t,n=!0,r=!1){const s=Ee||Z;if(s){const i=s.type;if(e===Pi){const l=vu(i);if(l&&(l===t||l===Pe(t)||l===hn(Pe(t))))return i}const o=hs(s[e]||i[e],t)||hs(s.appContext[e],t);return!o&&r?i:o}}function hs(e,t){return e&&(e[t]||e[Pe(t)]||e[hn(Pe(t))])}const fe=Symbol(void 0),Pr=Symbol(void 0),Ce=Symbol(void 0),Bn=Symbol(void 0),Ft=[];let Qe=null;function pt(e=!1){Ft.push(Qe=e?null:[])}function ou(){Ft.pop(),Qe=Ft[Ft.length-1]||null}let sn=1;function ps(e){sn+=e}function Ni(e){return e.dynamicChildren=sn>0?Qe||ft:null,ou(),sn>0&&Qe&&Qe.push(e),e}function on(e,t,n,r,s,i){return Ni(me(e,t,n,r,s,i,!0))}function Ii(e,t,n,r,s){return Ni(R(e,t,n,r,s,!0))}function lu(e){return e?e.__v_isVNode===!0:!1}function Xe(e,t){return e.type===t.type&&e.key===t.key}const En=\"__vInternal\",Fi=({key:e})=>e!=null?e:null,Zt=({ref:e,ref_key:t,ref_for:n})=>e!=null?ee(e)||Q(e)||$(e)?{i:Ee,r:e,k:t,f:!!n}:e:null;function me(e,t=null,n=null,r=0,s=null,i=e===fe?0:1,o=!1,l=!1){const u={__v_isVNode:!0,__v_skip:!0,type:e,props:t,key:t&&Fi(t),ref:t&&Zt(t),scopeId:_n,slotScopeIds:null,children:n,component:null,suspense:null,ssContent:null,ssFallback:null,dirs:null,transition:null,el:null,anchor:null,target:null,targetAnchor:null,staticCount:0,shapeFlag:i,patchFlag:r,dynamicProps:s,dynamicChildren:null,appContext:null};return l?(Nr(u,n),i&128&&e.normalize(u)):n&&(u.shapeFlag|=ee(n)?8:16),sn>0&&!o&&Qe&&(u.patchFlag>0||i&6)&&u.patchFlag!==32&&Qe.push(u),u}const R=uu;function uu(e,t=null,n=null,r=0,s=null,i=!1){if((!e||e===su)&&(e=Ce),lu(e)){const l=et(e,t,!0);return n&&Nr(l,n),l}if(wu(e)&&(e=e.__vccOpts),t){t=au(t);let{class:l,style:u}=t;l&&!ee(l)&&(t.class=pr(l)),te(u)&&(ti(u)&&!F(u)&&(u=re({},u)),t.style=hr(u))}const o=ee(e)?1:Cl(e)?128:nu(e)?64:te(e)?4:$(e)?2:0;return me(e,t,n,r,s,o,i,!0)}function au(e){return e?ti(e)||En in e?re({},e):e:null}function et(e,t,n=!1){const{props:r,ref:s,patchFlag:i,children:o}=e,l=t?fu(r||{},t):r;return{__v_isVNode:!0,__v_skip:!0,type:e.type,props:l,key:l&&Fi(l),ref:t&&t.ref?n&&s?F(s)?s.concat(Zt(t)):[s,Zt(t)]:Zt(t):s,scopeId:e.scopeId,slotScopeIds:e.slotScopeIds,children:o,target:e.target,targetAnchor:e.targetAnchor,staticCount:e.staticCount,shapeFlag:e.shapeFlag,patchFlag:t&&e.type!==fe?i===-1?16:i|16:i,dynamicProps:e.dynamicProps,dynamicChildren:e.dynamicChildren,appContext:e.appContext,dirs:e.dirs,transition:e.transition,component:e.component,suspense:e.suspense,ssContent:e.ssContent&&et(e.ssContent),ssFallback:e.ssFallback&&et(e.ssFallback),el:e.el,anchor:e.anchor}}function cu(e=\" \",t=0){return R(Pr,null,e,t)}function $i(e=\"\",t=!1){return t?(pt(),Ii(Ce,null,e)):R(Ce,null,e)}function Se(e){return e==null||typeof e==\"boolean\"?R(Ce):F(e)?R(fe,null,e.slice()):typeof e==\"object\"?He(e):R(Pr,null,String(e))}function He(e){return e.el===null||e.memo?e:et(e)}function Nr(e,t){let n=0;const{shapeFlag:r}=e;if(t==null)t=null;else if(F(t))n=16;else if(typeof t==\"object\")if(r&65){const s=t.default;s&&(s._c&&(s._d=!1),Nr(e,s()),s._c&&(s._d=!0));return}else{n=32;const s=t._;!s&&!(En in t)?t._ctx=Ee:s===3&&Ee&&(Ee.slots._===1?t._=1:(t._=2,e.patchFlag|=1024))}else $(t)?(t={default:t,_ctx:Ee},n=32):(t=String(t),r&64?(n=16,t=[cu(t)]):n=8);e.children=t,e.shapeFlag|=n}function fu(...e){const t={};for(let n=0;n<e.length;n++){const r=e[n];for(const s in r)if(s===\"class\")t.class!==r.class&&(t.class=pr([t.class,r.class]));else if(s===\"style\")t.style=hr([t.style,r.style]);else if(cn(s)){const i=t[s],o=r[s];o&&i!==o&&!(F(i)&&i.includes(o))&&(t[s]=i?[].concat(i,o):o)}else s!==\"\"&&(t[s]=r[s])}return t}function Te(e,t,n,r=null){ge(e,t,7,[n,r])}const rr=e=>e?Li(e)?Ir(e)||e.proxy:rr(e.parent):null,ln=re(Object.create(null),{$:e=>e,$el:e=>e.vnode.el,$data:e=>e.data,$props:e=>e.props,$attrs:e=>e.attrs,$slots:e=>e.slots,$refs:e=>e.refs,$parent:e=>rr(e.parent),$root:e=>rr(e.root),$emit:e=>e.emit,$options:e=>Ei(e),$forceUpdate:e=>()=>li(e.update),$nextTick:e=>hl.bind(e.proxy),$watch:e=>Tl.bind(e)}),du={get({_:e},t){const{ctx:n,setupState:r,data:s,props:i,accessCache:o,type:l,appContext:u}=e;let d;if(t[0]!==\"$\"){const E=o[t];if(E!==void 0)switch(E){case 1:return r[t];case 2:return s[t];case 4:return n[t];case 3:return i[t]}else{if(r!==k&&M(r,t))return o[t]=1,r[t];if(s!==k&&M(s,t))return o[t]=2,s[t];if((d=e.propsOptions[0])&&M(d,t))return o[t]=3,i[t];if(n!==k&&M(n,t))return o[t]=4,n[t];Gn&&(o[t]=0)}}const c=ln[t];let h,g;if(c)return t===\"$attrs\"&&he(e,\"get\",t),c(e);if((h=l.__cssModules)&&(h=h[t]))return h;if(n!==k&&M(n,t))return o[t]=4,n[t];if(g=u.config.globalProperties,M(g,t))return g[t]},set({_:e},t,n){const{data:r,setupState:s,ctx:i}=e;return s!==k&&M(s,t)?(s[t]=n,!0):r!==k&&M(r,t)?(r[t]=n,!0):M(e.props,t)||t[0]===\"$\"&&t.slice(1)in e?!1:(i[t]=n,!0)},has({_:{data:e,setupState:t,accessCache:n,ctx:r,appContext:s,propsOptions:i}},o){let l;return!!n[o]||e!==k&&M(e,o)||t!==k&&M(t,o)||(l=i[0])&&M(l,o)||M(r,o)||M(ln,o)||M(s.config.globalProperties,o)},defineProperty(e,t,n){return n.get!=null?e._.accessCache[t]=0:M(n,\"value\")&&this.set(e,t,n.value,null),Reflect.defineProperty(e,t,n)}},hu=Ri();let pu=0;function mu(e,t,n){const r=e.type,s=(t?t.appContext:e.appContext)||hu,i={uid:pu++,vnode:e,type:r,parent:t,appContext:s,root:null,next:null,subTree:null,effect:null,update:null,scope:new Po(!0),render:null,proxy:null,exposed:null,exposeProxy:null,withProxy:null,provides:t?t.provides:Object.create(s.provides),accessCache:null,renderCache:[],components:null,directives:null,propsOptions:Ci(r,s),emitsOptions:di(r,s),emit:null,emitted:null,propsDefaults:k,inheritAttrs:r.inheritAttrs,ctx:k,data:k,props:k,attrs:k,slots:k,refs:k,setupState:k,setupContext:null,suspense:n,suspenseId:n?n.pendingId:0,asyncDep:null,asyncResolved:!1,isMounted:!1,isUnmounted:!1,isDeactivated:!1,bc:null,c:null,bm:null,m:null,bu:null,u:null,um:null,bum:null,da:null,a:null,rtg:null,rtc:null,ec:null,sp:null};return i.ctx={_:i},i.root=t?t.root:i,i.emit=_l.bind(null,i),e.ce&&e.ce(i),i}let Z=null;const Mi=()=>Z||Ee,mt=e=>{Z=e,e.scope.on()},Ge=()=>{Z&&Z.scope.off(),Z=null};function Li(e){return e.vnode.shapeFlag&4}let jt=!1;function gu(e,t=!1){jt=t;const{props:n,children:r}=e.vnode,s=Li(e);Wl(e,n,s,t),Xl(e,r);const i=s?bu(e,t):void 0;return jt=!1,i}function bu(e,t){const n=e.type;e.accessCache=Object.create(null),e.proxy=ni(new Proxy(e.ctx,du));const{setup:r}=n;if(r){const s=e.setupContext=r.length>1?yu(e):null;mt(e),vt();const i=Ke(r,e,0,[e.props,s]);if(wt(),Ge(),Us(i)){if(i.then(Ge,Ge),t)return i.then(o=>{ms(e,o,t)}).catch(o=>{gn(o,e,0)});e.asyncDep=i}else ms(e,i,t)}else Di(e,t)}function ms(e,t,n){$(t)?e.type.__ssrInlineRender?e.ssrRender=t:e.render=t:te(t)&&(e.setupState=ii(t)),Di(e,n)}let gs;function Di(e,t,n){const r=e.type;if(!e.render){if(!t&&gs&&!r.render){const s=r.template;if(s){const{isCustomElement:i,compilerOptions:o}=e.appContext.config,{delimiters:l,compilerOptions:u}=r,d=re(re({isCustomElement:i,delimiters:l},o),u);r.render=gs(s,d)}}e.render=r.render||xe}mt(e),vt(),Hl(e),wt(),Ge()}function _u(e){return new Proxy(e.attrs,{get(t,n){return he(e,\"get\",\"$attrs\"),t[n]}})}function yu(e){const t=r=>{e.exposed=r||{}};let n;return{get attrs(){return n||(n=_u(e))},slots:e.slots,emit:e.emit,expose:t}}function Ir(e){if(e.exposed)return e.exposeProxy||(e.exposeProxy=new Proxy(ii(ni(e.exposed)),{get(t,n){if(n in t)return t[n];if(n in ln)return ln[n](e)}}))}function vu(e){return $(e)&&e.displayName||e.name}function wu(e){return $(e)&&\"__vccOpts\"in e}const sr=(e,t)=>fl(e,t,jt),Eu=\"3.2.33\",xu=\"http://www.w3.org/2000/svg\",Ye=typeof document!=\"undefined\"?document:null,bs=Ye&&Ye.createElement(\"template\"),Cu={insert:(e,t,n)=>{t.insertBefore(e,n||null)},remove:e=>{const t=e.parentNode;t&&t.removeChild(e)},createElement:(e,t,n,r)=>{const s=t?Ye.createElementNS(xu,e):Ye.createElement(e,n?{is:n}:void 0);return e===\"select\"&&r&&r.multiple!=null&&s.setAttribute(\"multiple\",r.multiple),s},createText:e=>Ye.createTextNode(e),createComment:e=>Ye.createComment(e),setText:(e,t)=>{e.nodeValue=t},setElementText:(e,t)=>{e.textContent=t},parentNode:e=>e.parentNode,nextSibling:e=>e.nextSibling,querySelector:e=>Ye.querySelector(e),setScopeId(e,t){e.setAttribute(t,\"\")},cloneNode(e){const t=e.cloneNode(!0);return\"_value\"in e&&(t._value=e._value),t},insertStaticContent(e,t,n,r,s,i){const o=n?n.previousSibling:t.lastChild;if(s&&(s===i||s.nextSibling))for(;t.insertBefore(s.cloneNode(!0),n),!(s===i||!(s=s.nextSibling)););else{bs.innerHTML=r?`<svg>${e}</svg>`:e;const l=bs.content;if(r){const u=l.firstChild;for(;u.firstChild;)l.appendChild(u.firstChild);l.removeChild(u)}t.insertBefore(l,n)}return[o?o.nextSibling:t.firstChild,n?n.previousSibling:t.lastChild]}};function Ou(e,t,n){const r=e._vtc;r&&(t=(t?[t,...r]:[...r]).join(\" \")),t==null?e.removeAttribute(\"class\"):n?e.setAttribute(\"class\",t):e.className=t}function Au(e,t,n){const r=e.style,s=ee(n);if(n&&!s){for(const i in n)ir(r,i,n[i]);if(t&&!ee(t))for(const i in t)n[i]==null&&ir(r,i,\"\")}else{const i=r.display;s?t!==n&&(r.cssText=n):t&&e.removeAttribute(\"style\"),\"_vod\"in e&&(r.display=i)}}const _s=/\\s*!important$/;function ir(e,t,n){if(F(n))n.forEach(r=>ir(e,t,r));else if(n==null&&(n=\"\"),t.startsWith(\"--\"))e.setProperty(t,n);else{const r=Tu(e,t);_s.test(n)?e.setProperty(yt(r),n.replace(_s,\"\"),\"important\"):e[r]=n}}const ys=[\"Webkit\",\"Moz\",\"ms\"],jn={};function Tu(e,t){const n=jn[t];if(n)return n;let r=Pe(t);if(r!==\"filter\"&&r in e)return jn[t]=r;r=hn(r);for(let s=0;s<ys.length;s++){const i=ys[s]+r;if(i in e)return jn[t]=i}return t}const vs=\"http://www.w3.org/1999/xlink\";function Ru(e,t,n,r,s){if(r&&t.startsWith(\"xlink:\"))n==null?e.removeAttributeNS(vs,t.slice(6,t.length)):e.setAttributeNS(vs,t,n);else{const i=_o(t);n==null||i&&!Ds(n)?e.removeAttribute(t):e.setAttribute(t,i?\"\":n)}}function Su(e,t,n,r,s,i,o){if(t===\"innerHTML\"||t===\"textContent\"){r&&o(r,s,i),e[t]=n==null?\"\":n;return}if(t===\"value\"&&e.tagName!==\"PROGRESS\"&&!e.tagName.includes(\"-\")){e._value=n;const u=n==null?\"\":n;(e.value!==u||e.tagName===\"OPTION\")&&(e.value=u),n==null&&e.removeAttribute(t);return}let l=!1;if(n===\"\"||n==null){const u=typeof e[t];u===\"boolean\"?n=Ds(n):n==null&&u===\"string\"?(n=\"\",l=!0):u===\"number\"&&(n=0,l=!0)}try{e[t]=n}catch(u){}l&&e.removeAttribute(t)}const[Bi,Pu]=(()=>{let e=Date.now,t=!1;if(typeof window!=\"undefined\"){Date.now()>document.createEvent(\"Event\").timeStamp&&(e=()=>performance.now());const n=navigator.userAgent.match(/firefox\\/(\\d+)/i);t=!!(n&&Number(n[1])<=53)}return[e,t]})();let or=0;const Nu=Promise.resolve(),Iu=()=>{or=0},Fu=()=>or||(Nu.then(Iu),or=Bi());function $u(e,t,n,r){e.addEventListener(t,n,r)}function Mu(e,t,n,r){e.removeEventListener(t,n,r)}function Lu(e,t,n,r,s=null){const i=e._vei||(e._vei={}),o=i[t];if(r&&o)o.value=r;else{const[l,u]=Du(t);if(r){const d=i[t]=Bu(r,s);$u(e,l,d,u)}else o&&(Mu(e,l,o,u),i[t]=void 0)}}const ws=/(?:Once|Passive|Capture)$/;function Du(e){let t;if(ws.test(e)){t={};let n;for(;n=e.match(ws);)e=e.slice(0,e.length-n[0].length),t[n[0].toLowerCase()]=!0}return[yt(e.slice(2)),t]}function Bu(e,t){const n=r=>{const s=r.timeStamp||Bi();(Pu||s>=n.attached-1)&&ge(ju(r,n.value),t,5,[r])};return n.value=e,n.attached=Fu(),n}function ju(e,t){if(F(t)){const n=e.stopImmediatePropagation;return e.stopImmediatePropagation=()=>{n.call(e),e._stopped=!0},t.map(r=>s=>!s._stopped&&r&&r(s))}else return t}const Es=/^on[a-z]/,Uu=(e,t,n,r,s=!1,i,o,l,u)=>{t===\"class\"?Ou(e,r,s):t===\"style\"?Au(e,n,r):cn(t)?mr(t)||Lu(e,t,n,r,o):(t[0]===\".\"?(t=t.slice(1),!0):t[0]===\"^\"?(t=t.slice(1),!1):Hu(e,t,r,s))?Su(e,t,r,i,o,l,u):(t===\"true-value\"?e._trueValue=r:t===\"false-value\"&&(e._falseValue=r),Ru(e,t,r,s))};function Hu(e,t,n,r){return r?!!(t===\"innerHTML\"||t===\"textContent\"||t in e&&Es.test(t)&&$(n)):t===\"spellcheck\"||t===\"draggable\"||t===\"translate\"||t===\"form\"||t===\"list\"&&e.tagName===\"INPUT\"||t===\"type\"&&e.tagName===\"TEXTAREA\"||Es.test(t)&&ee(n)?!1:t in e}const ku={name:String,type:String,css:{type:Boolean,default:!0},duration:[String,Number,Object],enterFromClass:String,enterActiveClass:String,enterToClass:String,appearFromClass:String,appearActiveClass:String,appearToClass:String,leaveFromClass:String,leaveActiveClass:String,leaveToClass:String};Pl.props;const qu=re({patchProp:Uu},Cu);let xs;function Ku(){return xs||(xs=Gl(qu))}const ji=(...e)=>{const t=Ku().createApp(...e),{mount:n}=t;return t.mount=r=>{const s=Vu(r);if(!s)return;const i=t._component;!$(i)&&!i.render&&!i.template&&(i.template=s.innerHTML),s.innerHTML=\"\";const o=n(s,!1,s instanceof SVGElement);return s instanceof Element&&(s.removeAttribute(\"v-cloak\"),s.setAttribute(\"data-v-app\",\"\")),o},t};function Vu(e){return ee(e)?document.querySelector(e):e}function Wu(e){return e&&e.__esModule&&Object.prototype.hasOwnProperty.call(e,\"default\")?e.default:e}var Fr={exports:{}},Ui=function(t,n){return function(){for(var s=new Array(arguments.length),i=0;i<s.length;i++)s[i]=arguments[i];return t.apply(n,s)}},Ju=Ui,$r=Object.prototype.toString,Mr=function(e){return function(t){var n=$r.call(t);return e[n]||(e[n]=n.slice(8,-1).toLowerCase())}}(Object.create(null));function tt(e){return e=e.toLowerCase(),function(n){return Mr(n)===e}}function Lr(e){return Array.isArray(e)}function un(e){return typeof e==\"undefined\"}function zu(e){return e!==null&&!un(e)&&e.constructor!==null&&!un(e.constructor)&&typeof e.constructor.isBuffer==\"function\"&&e.constructor.isBuffer(e)}var Hi=tt(\"ArrayBuffer\");function Xu(e){var t;return typeof ArrayBuffer!=\"undefined\"&&ArrayBuffer.isView?t=ArrayBuffer.isView(e):t=e&&e.buffer&&Hi(e.buffer),t}function Yu(e){return typeof e==\"string\"}function Zu(e){return typeof e==\"number\"}function ki(e){return e!==null&&typeof e==\"object\"}function Qt(e){if(Mr(e)!==\"object\")return!1;var t=Object.getPrototypeOf(e);return t===null||t===Object.prototype}var Qu=tt(\"Date\"),Gu=tt(\"File\"),ea=tt(\"Blob\"),ta=tt(\"FileList\");function Dr(e){return $r.call(e)===\"[object Function]\"}function na(e){return ki(e)&&Dr(e.pipe)}function ra(e){var t=\"[object FormData]\";return e&&(typeof FormData==\"function\"&&e instanceof FormData||$r.call(e)===t||Dr(e.toString)&&e.toString()===t)}var sa=tt(\"URLSearchParams\");function ia(e){return e.trim?e.trim():e.replace(/^\\s+|\\s+$/g,\"\")}function oa(){return typeof navigator!=\"undefined\"&&(navigator.product===\"ReactNative\"||navigator.product===\"NativeScript\"||navigator.product===\"NS\")?!1:typeof window!=\"undefined\"&&typeof document!=\"undefined\"}function Br(e,t){if(!(e===null||typeof e==\"undefined\"))if(typeof e!=\"object\"&&(e=[e]),Lr(e))for(var n=0,r=e.length;n<r;n++)t.call(null,e[n],n,e);else for(var s in e)Object.prototype.hasOwnProperty.call(e,s)&&t.call(null,e[s],s,e)}function lr(){var e={};function t(s,i){Qt(e[i])&&Qt(s)?e[i]=lr(e[i],s):Qt(s)?e[i]=lr({},s):Lr(s)?e[i]=s.slice():e[i]=s}for(var n=0,r=arguments.length;n<r;n++)Br(arguments[n],t);return e}function la(e,t,n){return Br(t,function(s,i){n&&typeof s==\"function\"?e[i]=Ju(s,n):e[i]=s}),e}function ua(e){return e.charCodeAt(0)===65279&&(e=e.slice(1)),e}function aa(e,t,n,r){e.prototype=Object.create(t.prototype,r),e.prototype.constructor=e,n&&Object.assign(e.prototype,n)}function ca(e,t,n){var r,s,i,o={};t=t||{};do{for(r=Object.getOwnPropertyNames(e),s=r.length;s-- >0;)i=r[s],o[i]||(t[i]=e[i],o[i]=!0);e=Object.getPrototypeOf(e)}while(e&&(!n||n(e,t))&&e!==Object.prototype);return t}function fa(e,t,n){e=String(e),(n===void 0||n>e.length)&&(n=e.length),n-=t.length;var r=e.indexOf(t,n);return r!==-1&&r===n}function da(e){if(!e)return null;var t=e.length;if(un(t))return null;for(var n=new Array(t);t-- >0;)n[t]=e[t];return n}var ha=function(e){return function(t){return e&&t instanceof e}}(typeof Uint8Array!=\"undefined\"&&Object.getPrototypeOf(Uint8Array)),ne={isArray:Lr,isArrayBuffer:Hi,isBuffer:zu,isFormData:ra,isArrayBufferView:Xu,isString:Yu,isNumber:Zu,isObject:ki,isPlainObject:Qt,isUndefined:un,isDate:Qu,isFile:Gu,isBlob:ea,isFunction:Dr,isStream:na,isURLSearchParams:sa,isStandardBrowserEnv:oa,forEach:Br,merge:lr,extend:la,trim:ia,stripBOM:ua,inherits:aa,toFlatObject:ca,kindOf:Mr,kindOfTest:tt,endsWith:fa,toArray:da,isTypedArray:ha,isFileList:ta},ot=ne;function Cs(e){return encodeURIComponent(e).replace(/%3A/gi,\":\").replace(/%24/g,\"$\").replace(/%2C/gi,\",\").replace(/%20/g,\"+\").replace(/%5B/gi,\"[\").replace(/%5D/gi,\"]\")}var qi=function(t,n,r){if(!n)return t;var s;if(r)s=r(n);else if(ot.isURLSearchParams(n))s=n.toString();else{var i=[];ot.forEach(n,function(u,d){u===null||typeof u==\"undefined\"||(ot.isArray(u)?d=d+\"[]\":u=[u],ot.forEach(u,function(h){ot.isDate(h)?h=h.toISOString():ot.isObject(h)&&(h=JSON.stringify(h)),i.push(Cs(d)+\"=\"+Cs(h))}))}),s=i.join(\"&\")}if(s){var o=t.indexOf(\"#\");o!==-1&&(t=t.slice(0,o)),t+=(t.indexOf(\"?\")===-1?\"?\":\"&\")+s}return t},pa=ne;function xn(){this.handlers=[]}xn.prototype.use=function(t,n,r){return this.handlers.push({fulfilled:t,rejected:n,synchronous:r?r.synchronous:!1,runWhen:r?r.runWhen:null}),this.handlers.length-1};xn.prototype.eject=function(t){this.handlers[t]&&(this.handlers[t]=null)};xn.prototype.forEach=function(t){pa.forEach(this.handlers,function(r){r!==null&&t(r)})};var ma=xn,ga=ne,ba=function(t,n){ga.forEach(t,function(s,i){i!==n&&i.toUpperCase()===n.toUpperCase()&&(t[n]=s,delete t[i])})},Ki=ne;function gt(e,t,n,r,s){Error.call(this),this.message=e,this.name=\"AxiosError\",t&&(this.code=t),n&&(this.config=n),r&&(this.request=r),s&&(this.response=s)}Ki.inherits(gt,Error,{toJSON:function(){return{message:this.message,name:this.name,description:this.description,number:this.number,fileName:this.fileName,lineNumber:this.lineNumber,columnNumber:this.columnNumber,stack:this.stack,config:this.config,code:this.code,status:this.response&&this.response.status?this.response.status:null}}});var Vi=gt.prototype,Wi={};[\"ERR_BAD_OPTION_VALUE\",\"ERR_BAD_OPTION\",\"ECONNABORTED\",\"ETIMEDOUT\",\"ERR_NETWORK\",\"ERR_FR_TOO_MANY_REDIRECTS\",\"ERR_DEPRECATED\",\"ERR_BAD_RESPONSE\",\"ERR_BAD_REQUEST\",\"ERR_CANCELED\"].forEach(function(e){Wi[e]={value:e}});Object.defineProperties(gt,Wi);Object.defineProperty(Vi,\"isAxiosError\",{value:!0});gt.from=function(e,t,n,r,s,i){var o=Object.create(Vi);return Ki.toFlatObject(e,o,function(u){return u!==Error.prototype}),gt.call(o,e.message,t,n,r,s),o.name=e.name,i&&Object.assign(o,i),o};var Et=gt,Ji={silentJSONParsing:!0,forcedJSONParsing:!0,clarifyTimeoutError:!1},ve=ne;function _a(e,t){t=t||new FormData;var n=[];function r(i){return i===null?\"\":ve.isDate(i)?i.toISOString():ve.isArrayBuffer(i)||ve.isTypedArray(i)?typeof Blob==\"function\"?new Blob([i]):Buffer.from(i):i}function s(i,o){if(ve.isPlainObject(i)||ve.isArray(i)){if(n.indexOf(i)!==-1)throw Error(\"Circular reference detected in \"+o);n.push(i),ve.forEach(i,function(u,d){if(!ve.isUndefined(u)){var c=o?o+\".\"+d:d,h;if(u&&!o&&typeof u==\"object\"){if(ve.endsWith(d,\"{}\"))u=JSON.stringify(u);else if(ve.endsWith(d,\"[]\")&&(h=ve.toArray(u))){h.forEach(function(g){!ve.isUndefined(g)&&t.append(c,r(g))});return}}s(u,c)}}),n.pop()}else t.append(o,r(i))}return s(e),t}var zi=_a,Un=Et,ya=function(t,n,r){var s=r.config.validateStatus;!r.status||!s||s(r.status)?t(r):n(new Un(\"Request failed with status code \"+r.status,[Un.ERR_BAD_REQUEST,Un.ERR_BAD_RESPONSE][Math.floor(r.status/100)-4],r.config,r.request,r))},zt=ne,va=zt.isStandardBrowserEnv()?function(){return{write:function(n,r,s,i,o,l){var u=[];u.push(n+\"=\"+encodeURIComponent(r)),zt.isNumber(s)&&u.push(\"expires=\"+new Date(s).toGMTString()),zt.isString(i)&&u.push(\"path=\"+i),zt.isString(o)&&u.push(\"domain=\"+o),l===!0&&u.push(\"secure\"),document.cookie=u.join(\"; \")},read:function(n){var r=document.cookie.match(new RegExp(\"(^|;\\\\s*)(\"+n+\")=([^;]*)\"));return r?decodeURIComponent(r[3]):null},remove:function(n){this.write(n,\"\",Date.now()-864e5)}}}():function(){return{write:function(){},read:function(){return null},remove:function(){}}}(),wa=function(t){return/^([a-z][a-z\\d+\\-.]*:)?\\/\\//i.test(t)},Ea=function(t,n){return n?t.replace(/\\/+$/,\"\")+\"/\"+n.replace(/^\\/+/,\"\"):t},xa=wa,Ca=Ea,Xi=function(t,n){return t&&!xa(n)?Ca(t,n):n},Hn=ne,Oa=[\"age\",\"authorization\",\"content-length\",\"content-type\",\"etag\",\"expires\",\"from\",\"host\",\"if-modified-since\",\"if-unmodified-since\",\"last-modified\",\"location\",\"max-forwards\",\"proxy-authorization\",\"referer\",\"retry-after\",\"user-agent\"],Aa=function(t){var n={},r,s,i;return t&&Hn.forEach(t.split(`\n`),function(l){if(i=l.indexOf(\":\"),r=Hn.trim(l.substr(0,i)).toLowerCase(),s=Hn.trim(l.substr(i+1)),r){if(n[r]&&Oa.indexOf(r)>=0)return;r===\"set-cookie\"?n[r]=(n[r]?n[r]:[]).concat([s]):n[r]=n[r]?n[r]+\", \"+s:s}}),n},Os=ne,Ta=Os.isStandardBrowserEnv()?function(){var t=/(msie|trident)/i.test(navigator.userAgent),n=document.createElement(\"a\"),r;function s(i){var o=i;return t&&(n.setAttribute(\"href\",o),o=n.href),n.setAttribute(\"href\",o),{href:n.href,protocol:n.protocol?n.protocol.replace(/:$/,\"\"):\"\",host:n.host,search:n.search?n.search.replace(/^\\?/,\"\"):\"\",hash:n.hash?n.hash.replace(/^#/,\"\"):\"\",hostname:n.hostname,port:n.port,pathname:n.pathname.charAt(0)===\"/\"?n.pathname:\"/\"+n.pathname}}return r=s(window.location.href),function(o){var l=Os.isString(o)?s(o):o;return l.protocol===r.protocol&&l.host===r.host}}():function(){return function(){return!0}}(),ur=Et,Ra=ne;function Yi(e){ur.call(this,e==null?\"canceled\":e,ur.ERR_CANCELED),this.name=\"CanceledError\"}Ra.inherits(Yi,ur,{__CANCEL__:!0});var Cn=Yi,Sa=function(t){var n=/^([-+\\w]{1,25})(:?\\/\\/|:)/.exec(t);return n&&n[1]||\"\"},Tt=ne,Pa=ya,Na=va,Ia=qi,Fa=Xi,$a=Aa,Ma=Ta,La=Ji,$e=Et,Da=Cn,Ba=Sa,As=function(t){return new Promise(function(r,s){var i=t.data,o=t.headers,l=t.responseType,u;function d(){t.cancelToken&&t.cancelToken.unsubscribe(u),t.signal&&t.signal.removeEventListener(\"abort\",u)}Tt.isFormData(i)&&Tt.isStandardBrowserEnv()&&delete o[\"Content-Type\"];var c=new XMLHttpRequest;if(t.auth){var h=t.auth.username||\"\",g=t.auth.password?unescape(encodeURIComponent(t.auth.password)):\"\";o.Authorization=\"Basic \"+btoa(h+\":\"+g)}var E=Fa(t.baseURL,t.url);c.open(t.method.toUpperCase(),Ia(E,t.params,t.paramsSerializer),!0),c.timeout=t.timeout;function N(){if(!!c){var O=\"getAllResponseHeaders\"in c?$a(c.getAllResponseHeaders()):null,W=!l||l===\"text\"||l===\"json\"?c.responseText:c.response,B={data:W,status:c.status,statusText:c.statusText,headers:O,config:t,request:c};Pa(function(z){r(z),d()},function(z){s(z),d()},B),c=null}}if(\"onloadend\"in c?c.onloadend=N:c.onreadystatechange=function(){!c||c.readyState!==4||c.status===0&&!(c.responseURL&&c.responseURL.indexOf(\"file:\")===0)||setTimeout(N)},c.onabort=function(){!c||(s(new $e(\"Request aborted\",$e.ECONNABORTED,t,c)),c=null)},c.onerror=function(){s(new $e(\"Network Error\",$e.ERR_NETWORK,t,c,c)),c=null},c.ontimeout=function(){var W=t.timeout?\"timeout of \"+t.timeout+\"ms exceeded\":\"timeout exceeded\",B=t.transitional||La;t.timeoutErrorMessage&&(W=t.timeoutErrorMessage),s(new $e(W,B.clarifyTimeoutError?$e.ETIMEDOUT:$e.ECONNABORTED,t,c)),c=null},Tt.isStandardBrowserEnv()){var I=(t.withCredentials||Ma(E))&&t.xsrfCookieName?Na.read(t.xsrfCookieName):void 0;I&&(o[t.xsrfHeaderName]=I)}\"setRequestHeader\"in c&&Tt.forEach(o,function(W,B){typeof i==\"undefined\"&&B.toLowerCase()===\"content-type\"?delete o[B]:c.setRequestHeader(B,W)}),Tt.isUndefined(t.withCredentials)||(c.withCredentials=!!t.withCredentials),l&&l!==\"json\"&&(c.responseType=t.responseType),typeof t.onDownloadProgress==\"function\"&&c.addEventListener(\"progress\",t.onDownloadProgress),typeof t.onUploadProgress==\"function\"&&c.upload&&c.upload.addEventListener(\"progress\",t.onUploadProgress),(t.cancelToken||t.signal)&&(u=function(O){!c||(s(!O||O&&O.type?new Da:O),c.abort(),c=null)},t.cancelToken&&t.cancelToken.subscribe(u),t.signal&&(t.signal.aborted?u():t.signal.addEventListener(\"abort\",u))),i||(i=null);var S=Ba(E);if(S&&[\"http\",\"https\",\"file\"].indexOf(S)===-1){s(new $e(\"Unsupported protocol \"+S+\":\",$e.ERR_BAD_REQUEST,t));return}c.send(i)})},ja=null,Y=ne,Ts=ba,Rs=Et,Ua=Ji,Ha=zi,ka={\"Content-Type\":\"application/x-www-form-urlencoded\"};function Ss(e,t){!Y.isUndefined(e)&&Y.isUndefined(e[\"Content-Type\"])&&(e[\"Content-Type\"]=t)}function qa(){var e;return(typeof XMLHttpRequest!=\"undefined\"||typeof process!=\"undefined\"&&Object.prototype.toString.call(process)===\"[object process]\")&&(e=As),e}function Ka(e,t,n){if(Y.isString(e))try{return(t||JSON.parse)(e),Y.trim(e)}catch(r){if(r.name!==\"SyntaxError\")throw r}return(n||JSON.stringify)(e)}var On={transitional:Ua,adapter:qa(),transformRequest:[function(t,n){if(Ts(n,\"Accept\"),Ts(n,\"Content-Type\"),Y.isFormData(t)||Y.isArrayBuffer(t)||Y.isBuffer(t)||Y.isStream(t)||Y.isFile(t)||Y.isBlob(t))return t;if(Y.isArrayBufferView(t))return t.buffer;if(Y.isURLSearchParams(t))return Ss(n,\"application/x-www-form-urlencoded;charset=utf-8\"),t.toString();var r=Y.isObject(t),s=n&&n[\"Content-Type\"],i;if((i=Y.isFileList(t))||r&&s===\"multipart/form-data\"){var o=this.env&&this.env.FormData;return Ha(i?{\"files[]\":t}:t,o&&new o)}else if(r||s===\"application/json\")return Ss(n,\"application/json\"),Ka(t);return t}],transformResponse:[function(t){var n=this.transitional||On.transitional,r=n&&n.silentJSONParsing,s=n&&n.forcedJSONParsing,i=!r&&this.responseType===\"json\";if(i||s&&Y.isString(t)&&t.length)try{return JSON.parse(t)}catch(o){if(i)throw o.name===\"SyntaxError\"?Rs.from(o,Rs.ERR_BAD_RESPONSE,this,null,this.response):o}return t}],timeout:0,xsrfCookieName:\"XSRF-TOKEN\",xsrfHeaderName:\"X-XSRF-TOKEN\",maxContentLength:-1,maxBodyLength:-1,env:{FormData:ja},validateStatus:function(t){return t>=200&&t<300},headers:{common:{Accept:\"application/json, text/plain, */*\"}}};Y.forEach([\"delete\",\"get\",\"head\"],function(t){On.headers[t]={}});Y.forEach([\"post\",\"put\",\"patch\"],function(t){On.headers[t]=Y.merge(ka)});var jr=On,Va=ne,Wa=jr,Ja=function(t,n,r){var s=this||Wa;return Va.forEach(r,function(o){t=o.call(s,t,n)}),t},Zi=function(t){return!!(t&&t.__CANCEL__)},Ps=ne,kn=Ja,za=Zi,Xa=jr,Ya=Cn;function qn(e){if(e.cancelToken&&e.cancelToken.throwIfRequested(),e.signal&&e.signal.aborted)throw new Ya}var Za=function(t){qn(t),t.headers=t.headers||{},t.data=kn.call(t,t.data,t.headers,t.transformRequest),t.headers=Ps.merge(t.headers.common||{},t.headers[t.method]||{},t.headers),Ps.forEach([\"delete\",\"get\",\"head\",\"post\",\"put\",\"patch\",\"common\"],function(s){delete t.headers[s]});var n=t.adapter||Xa.adapter;return n(t).then(function(s){return qn(t),s.data=kn.call(t,s.data,s.headers,t.transformResponse),s},function(s){return za(s)||(qn(t),s&&s.response&&(s.response.data=kn.call(t,s.response.data,s.response.headers,t.transformResponse))),Promise.reject(s)})},ce=ne,Qi=function(t,n){n=n||{};var r={};function s(c,h){return ce.isPlainObject(c)&&ce.isPlainObject(h)?ce.merge(c,h):ce.isPlainObject(h)?ce.merge({},h):ce.isArray(h)?h.slice():h}function i(c){if(ce.isUndefined(n[c])){if(!ce.isUndefined(t[c]))return s(void 0,t[c])}else return s(t[c],n[c])}function o(c){if(!ce.isUndefined(n[c]))return s(void 0,n[c])}function l(c){if(ce.isUndefined(n[c])){if(!ce.isUndefined(t[c]))return s(void 0,t[c])}else return s(void 0,n[c])}function u(c){if(c in n)return s(t[c],n[c]);if(c in t)return s(void 0,t[c])}var d={url:o,method:o,data:o,baseURL:l,transformRequest:l,transformResponse:l,paramsSerializer:l,timeout:l,timeoutMessage:l,withCredentials:l,adapter:l,responseType:l,xsrfCookieName:l,xsrfHeaderName:l,onUploadProgress:l,onDownloadProgress:l,decompress:l,maxContentLength:l,maxBodyLength:l,beforeRedirect:l,transport:l,httpAgent:l,httpsAgent:l,cancelToken:l,socketPath:l,responseEncoding:l,validateStatus:u};return ce.forEach(Object.keys(t).concat(Object.keys(n)),function(h){var g=d[h]||i,E=g(h);ce.isUndefined(E)&&g!==u||(r[h]=E)}),r},Gi={version:\"0.27.2\"},Qa=Gi.version,ke=Et,Ur={};[\"object\",\"boolean\",\"number\",\"function\",\"string\",\"symbol\"].forEach(function(e,t){Ur[e]=function(r){return typeof r===e||\"a\"+(t<1?\"n \":\" \")+e}});var Ns={};Ur.transitional=function(t,n,r){function s(i,o){return\"[Axios v\"+Qa+\"] Transitional option '\"+i+\"'\"+o+(r?\". \"+r:\"\")}return function(i,o,l){if(t===!1)throw new ke(s(o,\" has been removed\"+(n?\" in \"+n:\"\")),ke.ERR_DEPRECATED);return n&&!Ns[o]&&(Ns[o]=!0,console.warn(s(o,\" has been deprecated since v\"+n+\" and will be removed in the near future\"))),t?t(i,o,l):!0}};function Ga(e,t,n){if(typeof e!=\"object\")throw new ke(\"options must be an object\",ke.ERR_BAD_OPTION_VALUE);for(var r=Object.keys(e),s=r.length;s-- >0;){var i=r[s],o=t[i];if(o){var l=e[i],u=l===void 0||o(l,i,e);if(u!==!0)throw new ke(\"option \"+i+\" must be \"+u,ke.ERR_BAD_OPTION_VALUE);continue}if(n!==!0)throw new ke(\"Unknown option \"+i,ke.ERR_BAD_OPTION)}}var ec={assertOptions:Ga,validators:Ur},eo=ne,tc=qi,Is=ma,Fs=Za,An=Qi,nc=Xi,to=ec,lt=to.validators;function bt(e){this.defaults=e,this.interceptors={request:new Is,response:new Is}}bt.prototype.request=function(t,n){typeof t==\"string\"?(n=n||{},n.url=t):n=t||{},n=An(this.defaults,n),n.method?n.method=n.method.toLowerCase():this.defaults.method?n.method=this.defaults.method.toLowerCase():n.method=\"get\";var r=n.transitional;r!==void 0&&to.assertOptions(r,{silentJSONParsing:lt.transitional(lt.boolean),forcedJSONParsing:lt.transitional(lt.boolean),clarifyTimeoutError:lt.transitional(lt.boolean)},!1);var s=[],i=!0;this.interceptors.request.forEach(function(E){typeof E.runWhen==\"function\"&&E.runWhen(n)===!1||(i=i&&E.synchronous,s.unshift(E.fulfilled,E.rejected))});var o=[];this.interceptors.response.forEach(function(E){o.push(E.fulfilled,E.rejected)});var l;if(!i){var u=[Fs,void 0];for(Array.prototype.unshift.apply(u,s),u=u.concat(o),l=Promise.resolve(n);u.length;)l=l.then(u.shift(),u.shift());return l}for(var d=n;s.length;){var c=s.shift(),h=s.shift();try{d=c(d)}catch(g){h(g);break}}try{l=Fs(d)}catch(g){return Promise.reject(g)}for(;o.length;)l=l.then(o.shift(),o.shift());return l};bt.prototype.getUri=function(t){t=An(this.defaults,t);var n=nc(t.baseURL,t.url);return tc(n,t.params,t.paramsSerializer)};eo.forEach([\"delete\",\"get\",\"head\",\"options\"],function(t){bt.prototype[t]=function(n,r){return this.request(An(r||{},{method:t,url:n,data:(r||{}).data}))}});eo.forEach([\"post\",\"put\",\"patch\"],function(t){function n(r){return function(i,o,l){return this.request(An(l||{},{method:t,headers:r?{\"Content-Type\":\"multipart/form-data\"}:{},url:i,data:o}))}}bt.prototype[t]=n(),bt.prototype[t+\"Form\"]=n(!0)});var rc=bt,sc=Cn;function _t(e){if(typeof e!=\"function\")throw new TypeError(\"executor must be a function.\");var t;this.promise=new Promise(function(s){t=s});var n=this;this.promise.then(function(r){if(!!n._listeners){var s,i=n._listeners.length;for(s=0;s<i;s++)n._listeners[s](r);n._listeners=null}}),this.promise.then=function(r){var s,i=new Promise(function(o){n.subscribe(o),s=o}).then(r);return i.cancel=function(){n.unsubscribe(s)},i},e(function(s){n.reason||(n.reason=new sc(s),t(n.reason))})}_t.prototype.throwIfRequested=function(){if(this.reason)throw this.reason};_t.prototype.subscribe=function(t){if(this.reason){t(this.reason);return}this._listeners?this._listeners.push(t):this._listeners=[t]};_t.prototype.unsubscribe=function(t){if(!!this._listeners){var n=this._listeners.indexOf(t);n!==-1&&this._listeners.splice(n,1)}};_t.source=function(){var t,n=new _t(function(s){t=s});return{token:n,cancel:t}};var ic=_t,oc=function(t){return function(r){return t.apply(null,r)}},lc=ne,uc=function(t){return lc.isObject(t)&&t.isAxiosError===!0},$s=ne,ac=Ui,Gt=rc,cc=Qi,fc=jr;function no(e){var t=new Gt(e),n=ac(Gt.prototype.request,t);return $s.extend(n,Gt.prototype,t),$s.extend(n,t),n.create=function(s){return no(cc(e,s))},n}var le=no(fc);le.Axios=Gt;le.CanceledError=Cn;le.CancelToken=ic;le.isCancel=Zi;le.VERSION=Gi.version;le.toFormData=zi;le.AxiosError=Et;le.Cancel=le.CanceledError;le.all=function(t){return Promise.all(t)};le.spread=oc;le.isAxiosError=uc;Fr.exports=le;Fr.exports.default=le;var Xt=Fr.exports;var ro=(e,t)=>{const n=e.__vccOpts||e;for(const[r,s]of t)n[r]=s;return n};const dc=e=>(hi(\"data-v-27cc98a0\"),e=e(),pi(),e),hc={class:\"software-log_shade\"},pc=dc(()=>me(\"div\",{class:\"software-log_shade__bg\"},null,-1)),mc={class:\"software-log_shade__pannel\"},gc={class:\"software-log_shade__pannel-title\"},bc={class:\"software-log_shade__pannel-now\"},_c={class:\"software-log_shade__pannel-content\"},yc=[\"innerHTML\"],vc={class:\"software-log_shade__pannel-btn\"},wc={props:{title:{type:String,default:\"\\u65E5\\u5FD7\\u8BB0\\u5F55\"},description:{type:String,default:\"\\u63D2\\u4EF6\\u5B89\\u88C5/\\u5378\\u8F7D\\u8FC7\\u7A0B\\u4E2D\\u8BF7\\u52FF\\u5237\\u65B0\\u6B64\\u9875\\u9762\\uFF01\"},clearText:{type:String,default:\"\\u5173\\u95ED\"},value:{type:String,default:\"\"}},setup(e){const t=e,n=Mi(),r=()=>{n&&n.appContext.config.globalProperties.$close()},s=$n(null),i=()=>{s.value&&(s.value.scrollTop=s.value.scrollHeight)},o=$n(!1),l=$n(t.value);return(()=>{if(n){const d=n.appContext.config.globalProperties;d.$setValue=c=>{l.value=c,i()},d.$addValue=c=>{l.value+=c,i()},d.$disabled=c=>{o.value=c}}})(),wn(()=>{document.body.setAttribute(\"lock-scroll\",\"true\")}),Rr(()=>{document.body.removeAttribute(\"lock-scroll\")}),(d,c)=>(pt(),on(\"div\",hc,[pc,me(\"div\",mc,[me(\"div\",gc,Nn(e.title),1),me(\"div\",bc,[me(\"i\",null,\"\\xA0\\xA0\\xA0\\xA0\"+Nn(e.description),1)]),me(\"div\",_c,[me(\"p\",{style:{\"white-space\":\"pre-line\",\"text-align\":\"left\",color:\"#fff\"},innerHTML:l.value},null,8,yc)]),me(\"div\",vc,[o.value?(pt(),on(\"button\",{key:0,class:\"close\",onClick:c[0]||(c[0]=h=>r())},Nn(e.clearText),1)):$i(\"\",!0)])])]))}};var Ec=ro(wc,[[\"__scopeId\",\"data-v-27cc98a0\"]]);const ar=e=>{const t=document.createElement(\"div\");document.body.appendChild(t);const n=ji(Ec,{title:e.title,description:e.description,value:e.value});n.config.globalProperties.$close=()=>{r()};const r=()=>{n.unmount(),t.remove(),e.callback&&e.callback()},s=l=>{n.config.globalProperties.$setValue(l)},i=l=>{n.config.globalProperties.$addValue(l)},o=l=>{n.config.globalProperties.$disabled(l)};return n.mount(t),{close:r,setValue:s,addValue:i,setDisabled:o}},xc=(e,t)=>t.type===\"array\"&&t.enum?!e||e.length===0:e===0||e===!1?!1:!e,so=(e,t,n={},r)=>{const s=[],{type:i,items:o}=n,l={value:t,schema:n};if(i===\"object\"){const u=io(t,n,r);s.push(...u)}else i===\"array\"&&t.forEach(u=>{const d=so(e,u,o,r);s.push(...d)});return lo(l)&&s.push(e),s},io=(e={},t={},n)=>{const r=n||e,s=[],{properties:i,required:o}=t;return o&&o.length>0&&o.forEach(l=>{const u=i&&i[l]||{},d=u[\"ui:hidden\"],c=e&&e[l],h=uo(d,r,e);xc(c,u)&&!h&&s.push(l)}),i&&e&&Object.keys(e)&&Object.keys(e).length>0&&Object.keys(e).forEach(l=>{const u=e[l],d=i[l]||{},c=so(l,u,d,r);s.push(...c)}),s};var cr={exports:{}},fr={exports:{}};(function(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=r;function n(s){return typeof Symbol==\"function\"&&typeof Symbol.iterator==\"symbol\"?n=function(o){return typeof o}:n=function(o){return o&&typeof Symbol==\"function\"&&o.constructor===Symbol&&o!==Symbol.prototype?\"symbol\":typeof o},n(s)}function r(s){var i=typeof s==\"string\"||s instanceof String;if(!i){var o=n(s);throw s===null?o=\"null\":o===\"object\"&&(o=s.constructor.name),new TypeError(\"Expected a string but received a \".concat(o))}}e.exports=t.default,e.exports.default=t.default})(fr,fr.exports);(function(e,t){Object.defineProperty(t,\"__esModule\",{value:!0}),t.default=i;var n=r(fr.exports);function r(o){return o&&o.__esModule?o:{default:o}}function s(o){return typeof Symbol==\"function\"&&typeof Symbol.iterator==\"symbol\"?s=function(u){return typeof u}:s=function(u){return u&&typeof Symbol==\"function\"&&u.constructor===Symbol&&u!==Symbol.prototype?\"symbol\":typeof u},s(o)}function i(o,l){(0,n.default)(o);var u,d;s(l)===\"object\"?(u=l.min||0,d=l.max):(u=arguments[1]||0,d=arguments[2]);var c=o.match(/[\\uD800-\\uDBFF][\\uDC00-\\uDFFF]/g)||[],h=o.length-c.length;return h>=u&&(typeof d==\"undefined\"||h<=d)}e.exports=t.default,e.exports.default=t.default})(cr,cr.exports);var Ms=Wu(cr.exports);function Ls(e){const t=/^(?:\\w+:)?\\/\\/(\\S+)$/;return typeof e!=\"string\"?!1:t.test(e)}const Cc=e=>{const t=\"^[.a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(.[a-zA-Z0-9_-]+)+$\";return!!(e&&new RegExp(t).test(e))};function Oc(e){return e.find((t,n,r)=>n!==r.findIndex(s=>JSON.stringify(t)===JSON.stringify(s)))}function Ac(e){if(typeof e==\"string\")return e;const t=`${e}`;return t==\"0\"&&1/e==-INFINITY?\"-0\":t}const Tc=/\\.|\\[(?:[^[\\]]*|([\"'])(?:(?!\\1)[^\\\\]|\\\\.)*?\\1)\\]/,Rc=/^\\w*$/;function Sc(e,t){if(Array.isArray(e))return!1;const n=typeof e;return n===\"number\"||n===\"boolean\"||e==null?!0:Rc.test(e)||!Tc.test(e)||t!=null&&e in Object(t)}function Pc(e,t){return Array.isArray(e)?e:Sc(e,t)?[e]:e.match(/([^\\.\\[\\]\"']+)/g)}const Nc=e=>Object.keys(e).length===0&&e.constructor===Object;function Ic(e,t){t=Pc(t,e);let n=0;const r=t.length;for(;e!=null&&n<r;)e=e[Ac(t[n++])];return n&&n==r?e:void 0}function an(e){return typeof e==\"function\"?!0:typeof e==\"string\"&&e.substring(0,1)===\"@\"?e.substring(1):typeof e==\"string\"&&e.substring(0,2)===\"{{\"&&e.substring(e.length-2,e.length)===\"}}\"?e.substring(2,e.length-2):!1}function oo(e){try{return JSON.parse(JSON.stringify(e))}catch(t){return e}}function Fc(e){const{default:t,enum:n=[],type:r}=e,s={array:[],boolean:!1,integer:\"\",null:null,number:\"\",object:{},string:\"\",range:null};if(an(t))return s[r];if(an(n)){if(r===\"array\")return[];if(r===\"string\"||r===\"number\")return\"\"}return typeof t!=\"undefined\"?t:r===\"array\"&&n.length?[]:Array.isArray(n)&&n[0]&&typeof n[0]!=\"undefined\"?e.hasOwnProperty(\"default\")?e.default:n[0]:s[r]}function $t(e,t,n={}){console.log(\"resolve\",t,e);const{type:r,properties:s,items:i,default:o,required:l=[],\"ui:widget\":u}=e,{checkRequired:d=!1}=n,c=typeof t==\"undefined\"?Fc(e):oo(t);if(r===\"object\"){if(u)return o&&typeof o==\"object\"?o:c;const h=s||{},g={};return Object.keys(h).forEach(E=>{const N=d&&[].concat(l).indexOf(E)!==-1;(!d||N)&&(g[E]=$t(h[E],c[E],n))}),g}if(r===\"array\"){if(o&&Array.isArray(o)&&!c)return o;if(u)return c;const h=[].concat(i||[]),g=[];return c.forEach&&c.forEach((E,N)=>{g[N]=$t(h[N]||h[0],E,n)}),g}return c}function $c(e={}){const o=e,{properties:t,items:n}=o,r=Yr(o,[\"properties\",\"items\"]),{type:s=\"object\"}=r;if(!t&&!n)return[];let i={};return s===\"object\"&&(i=t),Object.keys(i).map(l=>({schema:i[l],name:l,$parent:r}))}const lo=({name:e,schema:t,value:n,required:r=[]})=>{const{type:s,\"ui:options\":i,message:o,maxLength:l,minLength:u,format:d,pattern:c,maximum:h,minimum:g,maxItems:E,minItems:N,uniqueItems:I}=t;if(Nc(t))return!1;if(r.indexOf(e)>=0&&(!n||!n.length))return\"\\u4E0D\\u80FD\\u4E3A\\u7A7A\";const S=c&&[\"string\",\"number\"].indexOf(s)>-1;if(s===\"string\"){let O=n;typeof n!=\"string\"&&(n==null?O=\"\":O=String(n));const W=i&&i.noTrim;if(O.trim()!==O&&!W)return o&&o.trim||\"\\u8F93\\u5165\\u7684\\u5185\\u5BB9\\u6709\\u591A\\u4F59\\u7A7A\\u683C\";if(O&&l&&!Ms(O,0,parseInt(l,10)))return o&&o.maxLength||`\\u957F\\u5EA6\\u4E0D\\u80FD\\u5927\\u4E8E ${l}`;if(O&&(u||u===0)&&(!O||!Ms(O,parseInt(u,10),void 0)))return o&&o.minLength||`\\u957F\\u5EA6\\u4E0D\\u80FD\\u5C0F\\u4E8E ${u}`;if(d===\"color\"&&n===\"\")return\"\\u8BF7\\u586B\\u5199\\u6B63\\u786E\\u7684\\u989C\\u8272\\u683C\\u5F0F\";if(d===\"image\"){const H=\"([/|.|w|s|-])*.(?:jpg|gif|png|bmp|apng|webp|jpeg|json)\",z=Ls(n),Ne=new RegExp(H).test(n);if(!S){if(n&&!z&&!Ne)return o&&o.image||\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684\\u56FE\\u7247\\u683C\\u5F0F\"}}if(d===\"url\"&&!S){if(n&&!Ls(n))return o&&o.url||\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684url\\u683C\\u5F0F\"}if(d===\"email\"&&!S){if(n&&!Cc(n))return o&&o.email||\"\\u8BF7\\u8F93\\u5165\\u6B63\\u786E\\u7684email\\u683C\\u5F0F\"}}if(s===\"number\"){if(typeof n!=\"number\")return\"\\u8BF7\\u586B\\u5199\\u6570\\u5B57\";if(h&&parseFloat(n,10)>h)return o&&o.maximum||`\\u6570\\u503C\\u4E0D\\u80FD\\u5927\\u4E8E ${h}`;if((g||g===0)&&parseFloat(n,10)<g)return o&&o.minimum||`\\u6570\\u503C\\u4E0D\\u80FD\\u5C0F\\u4E8E ${g}`}if(n&&S&&!new RegExp(c).test(n))return o&&o.pattern||\"\\u683C\\u5F0F\\u4E0D\\u5339\\u914D\";if(s===\"array\"){if(E&&n&&n.length>E)return o&&o.maxItems||`\\u6570\\u7EC4\\u957F\\u5EA6\\u4E0D\\u80FD\\u5927\\u4E8E ${E}`;if((N||N===0)&&n&&n.length<N)return o&&o.minItems||`\\u6570\\u7EC4\\u957F\\u5EA6\\u4E0D\\u80FD\\u5C0F\\u4E8E ${N}`;if(I&&Array.isArray(n)&&n.length>1){if(typeof I==\"boolean\"&&Oc(n))return\"\\u5B58\\u5728\\u91CD\\u590D\\u5143\\u7D20\";if(typeof I==\"string\")try{const O=n.map(B=>Ic(B,I));if(O.find((B,H)=>O.indexOf(B)!==H))return I+\" \\u7684\\u503C\\u5B58\\u5728\\u91CD\\u590D\\u7684\"}catch(O){}}}return\"\"};function Mc(e){return Function(`\"use strict\"; ${e}`)()}const Lc=(e,t,n)=>Mc(`\n  const rootValue =${JSON.stringify(n)};\n  const formData = ${JSON.stringify(t)};\n  return (${e})\n  `),uo=(e,t,n)=>{if(typeof e==\"function\")return e(t,n);if(typeof e==\"string\"&&an(e)!==!1){const r=an(e);try{return Lc(r,t,n)}catch(s){return console.error(s.message),console.error(`happen at ${e}`),e}}return e},Oe=e=>{let t=n=>n;return window._!=null&&(t=window._),t(e)};var Dc={props:{schema:Object,formData:Object,name:String,onChange:Function,value:[String,Number,Boolean,Object],disabled:Boolean,readOnly:Boolean,invalidText:String},setup(e){let{schema:t,onChange:n,name:r,value:s,style:i}=mn(e);const o=sr(()=>e.schema.customOption?[...e.schema.enum,\"customOptions\"]:e.schema.enum),l=sr(()=>e.schema.customOption?[...e.schema.enumNames,\"\\u81EA\\u5B9A\\u4E49\\u9009\\u9879\"]:e.schema.enumNames),u=Ut({showCustomOptionInput:e.schema.customOption&&e.schema.enumNames.findIndex(c=>c===s.value)===-1}),d=(c,h)=>{h===\"select\"?c===\"customOptions\"?(u.showCustomOptionInput=!0,n.value(r.value,\"\")):(u.showCustomOptionInput=!1,t.value.type===\"interger\"?n.value(r.value,parseInt(c)):n.value(r.value,c)):n.value(r.value,c)};return()=>{const{\"ui:options\":c}=t.value;return R(\"div\",{className:\"cbi-value\",style:i},[R(\"label\",{className:\"cbi-value-title\"},[Oe(e.schema.title),R(\"span\",{style:{color:\"red\"}},[t.value.required?\" * \":\"\"])]),R(\"div\",{class:\"cbi-value-field\"},[R(\"div\",null,[o.value?R(\"div\",{className:\"cbi-value-field\"},[R(\"div\",null,[R(\"select\",{class:\"cbi-input-select\",value:u.showCustomOptionInput?\"customOptions\":s.value,onChange:h=>d(h.target.value,\"select\")},[o.value.map((h,g)=>R(\"option\",{value:h},[Oe(l.value&&l.value[g]||o.value[g])]))]),u.showCustomOptionInput&&R(\"input\",{onInput:h=>d(h.target.value),value:s.value,type:\"text\",class:\"cbi-input-text\"},null)])]):R(\"input\",{type:t.value.mode||\"text\",class:\"cbi-input-text\",value:s.value,onInput:h=>d(h.target.value)},null)]),(c==null?void 0:c.description)&&R(fe,null,[R(\"br\",null,null),R(\"div\",{class:\"cbi-value-description\",innerHTML:Oe(c==null?void 0:c.description)},null)])])])}}},Bc={props:{schema:Object,formData:Object,name:String,onChange:Function,value:[String,Number,Boolean,Object],disabled:Boolean,readOnly:Boolean,invalidText:String},setup(e){let{schema:t,onChange:n,name:r,value:s,style:i}=mn(e);const o=l=>{n.value(r.value,l.target.checked)};return()=>{const{\"ui:options\":l}=t.value;return R(\"div\",{className:\"cbi-value\",style:i},[R(\"div\",null,[R(\"label\",{className:\"cbi-value-title\"},[Oe(e.schema.title)]),R(\"div\",{class:\"cbi-value-field\"},[R(\"div\",{class:\"cbi-checkbox\"},[R(\"input\",{type:\"checkbox\",checked:s.value,onClick:o},null)]),(l==null?void 0:l.description)&&R(fe,null,[R(\"br\",null,null),R(\"div\",{class:\"cbi-value-description\",innerHTML:Oe(l.description)},null)])])])])}}};const jc={props:{schema:Object,formData:Object,value:[String,Number,Boolean,Object],onChange:Function,name:String},setup(e){return()=>{const t=$c(e.schema);return R(\"div\",{className:\"cbi-section\"},[e.schema.title&&R(\"h2\",null,[Oe(e.schema.title)]),e.schema.description&&R(\"div\",{className:\"cbi-map-descr\",innerHTML:Oe(e.schema.description)},null),R(\"div\",{className:\"cbi-section-node\"},[e.schema.labels&&e.schema.labels.map(n=>{let r=n.value;return R(\"div\",{className:\"cbi-value\"},[R(\"label\",{className:\"cbi-value-title\"},[Oe(n.key)]),R(\"div\",{style:{paddingTop:\"0.25rem\"},innerHTML:r},null)])}),e.schema.properties&&e.schema.properties.map((n,r)=>{const s=t[r].schema,i=ao[Uc[s.type]],o=n.name;if(!i)return null;const l=lo({name:o,schema:s,value:e.value[o],required:e.schema.required});return R(i,{style:uo(s[\"ui:hidden\"],e.value[o],e.value)?{display:\"none\"}:null,invalidText:l,value:e.value[o],schema:s,name:o,onChange:(u,d)=>{const c=At(Ot({},e.value),{[u]:d});e.onChange(o,c)}},null)})])])}}},Uc={default:\"input\",string:\"input\",interger:\"input\",object:\"map\",boolean:\"boolean\"},ao={input:Dc,object:jc,boolean:Bc};var Hc={props:{schema:Object,formData:Object},setup(e,{emit:t}){if(!e.schema)return null;const{formData:n,schema:r}=mn(e);let s=$t(e.schema,n.value);It(n,()=>{s=$t(e.schema,n.value),t(\"on-validate\",io(s,e.schema))}),It(r.value,()=>{s=$t(e.schema,n.value),t(\"on-change\",s)});const i=(l,u)=>{t(\"on-change\",oo(u),l)},o={apply:(l,u)=>{l&&l(At(Ot({},e.formData),{$apply:u}))},reset:l=>{location.reload(),l&&l()}};return()=>{var l,u;return R(\"div\",{className:\"vue-form-render\"},[e.schema.title&&R(\"h2\",null,[Oe(e.schema.title)]),e.schema.description&&R(\"div\",{className:\"cbi-map-descr\",innerHTML:Oe(e.schema.description)},null),(u=(l=e.schema)==null?void 0:l.containers)==null?void 0:u.map(d=>{const c=ao.object;return R(c,{schema:d,formData:s,value:s,name:\"$form\",onChange:i},null)}),R(\"span\",{className:\"cbi-page-actions control-group\"},[e.schema.actions&&e.schema.actions.map(({type:d,name:c,text:h,callback:g})=>R(\"input\",{className:`btn cbi-button cbi-button-${d}`,type:\"button\",value:Oe(h),onClick:()=>o[d](g,c)},null))])])}}};window.istoreos={reloadFromGetApi:function(){}};window.istoreosMessage=function(e){ar(e).setDisabled(!0)};const kc={setup(){const e=Ut({loading:!1,schema:{},formData:{}});return wn(()=>{let t=null;const n=function(i){let o=null;t=setInterval(()=>{Xt.get(`${window.IstoreosFormConfig.logApi}?async_state=${i.result.async_state}`).then(l=>{o===null&&(o=ar({value:\"\",callback:()=>{location.reload()}})),l.data.match(\"XU6J03M6\")&&window.clearInterval(t),o.setValue(l.data.replace(\"XU6J03M6\",\"\")),o.setDisabled(!0)})},2e3)},r=function(i){return window.taskd.show_log(i.result.async_state),!1},s=function(i){let o=i.data;if(window.IstoreosFormConfig.getHook&&(o=window.IstoreosFormConfig.getHook(o),o===void 0))return console.warn(\"getHook\\u5FC5\\u987B\\u6709return\\u8FD4\\u56DE\\u503C\");if(o.success===0){let l=o.result.schema;l.actions=l.actions.map(u=>At(Ot({},u),{callback:d=>{if(window.IstoreosFormConfig.submitHook){if(d=window.IstoreosFormConfig.submitHook(d),d===void 0)return console.warn(\"submitHook\\u5FC5\\u987B\\u6709return\\u8FD4\\u56DE\\u503C\");if(d===!1)return!1}Xt.post(window.IstoreosFormConfig.submitApi,d).then(({data:c})=>{c.success===0&&(c.result.async?window.taskd===void 0?n(c):r(c):ar({value:c.result.log.replace(\"XU6J03M6\",\"\"),callback:()=>{location.reload()}}).setDisabled(!0))}).catch(c=>{t&&window.clearInterval(t),window.istoreosMessage({value:c,title:\"\\u672A\\u77E5\\u9519\\u8BEF\",description:\"\\u672A\\u77E5\\u9519\\u8BEF\"})})}})),e.schema=o.result.schema,e.formData=o.result.data}};window.istoreos={reloadFromGetApi:function(i,o){o===!0&&(e.loading=!0),Xt.get(window.IstoreosFormConfig.getApi,{params:i}).then(function(l){s(l),e.loading=!1}).catch(()=>{e.loading=!1,error.request.status===403&&document.write(error.response.data)})}},Xt.get(window.IstoreosFormConfig.getApi).then(function(i){s(i)}).catch(i=>{i.request.status===403&&document.write(i.response.data)})}),At(Ot({},mn(e)),{change:(t,n)=>{e.formData=t,window.IstoreosFormConfig.onFormChange&&window.IstoreosFormConfig.onFormChange(n,t)}})},components:{IstoreosForm:Hc}},qc=e=>(hi(\"data-v-23d08f2c\"),e=e(),pi(),e),Kc={key:0,class:\"loading\"},Vc=qc(()=>me(\"svg\",{class:\"loading__spinner\",viewBox:\"0 0 66 66\",xmlns:\"http://www.w3.org/2000/svg\"},[me(\"circle\",{class:\"loading__path\",fill:\"none\",\"stroke-width\":\"6\",\"stroke-linecap\":\"round\",cx:\"33\",cy:\"33\",r:\"30\"})],-1)),Wc=[Vc];function Jc(e,t,n,r,s,i){const o=ru(\"IstoreosForm\");return pt(),on(fe,null,[R(o,{schema:e.schema,formData:e.formData,onOnChange:r.change},null,8,[\"schema\",\"formData\",\"onOnChange\"]),e.loading?(pt(),on(\"div\",Kc,Wc)):$i(\"\",!0)],64)}var zc=ro(kc,[[\"render\",Jc],[\"__scopeId\",\"data-v-23d08f2c\"]]);const Xc={setup(e){return(t,n)=>(pt(),Ii(zc))}};ji(Xc).mount(\"#app\");\n"
  },
  {
    "path": "relevance/luci-lib-iform/root/www/luci-static/iform/1.1/style.css",
    "content": "[lock-scroll=true]{overflow:hidden!important}.software-log_shade[data-v-27cc98a0],.software-log_shade *[data-v-27cc98a0]{-webkit-box-sizing:border-box;-webkit-tap-highlight-color:transparent;box-sizing:border-box;word-wrap:break-word;outline:none}.software-log_shade[data-v-27cc98a0]{width:100%;height:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center;position:fixed;inset:0;z-index:99999}.software-log_shade .software-log_shade__bg[data-v-27cc98a0]{position:fixed;inset:0;background:rgba(68,79,83,.94) none repeat scroll 0 0!important;background-position:0 0;background-size:cover;opacity:.94}.software-log_shade .software-log_shade__pannel[data-v-27cc98a0]{width:800px;min-width:800px;border-radius:10px;z-index:100;box-shadow:3px 3px 10px #000;background:rgba(0,0,0,.9);padding:10px}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-title[data-v-27cc98a0]{text-align:center;font-size:18px;color:#9f0;padding:10px;font-weight:700}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-now i[data-v-27cc98a0]{color:#fc0;font-style:normal}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-content[data-v-27cc98a0]{padding:10px;width:100%;text-align:center;overflow:hidden;height:400px;overflow:overlay}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-content textarea[data-v-27cc98a0]{width:100%;border:0px solid #222;font-family:Lucida Console;font-size:11px;background:transparent;color:#fff;outline:none;overflow-x:hidden;resize:none;transition:.5s}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-content textarea[data-v-27cc98a0]:focus,.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-content textarea[data-v-27cc98a0]:hover{box-shadow:none;border-color:#fff0!important}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-content textarea[data-v-27cc98a0]::-webkit-scrollbar{width:5px;height:5px}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-content textarea[data-v-27cc98a0]::-webkit-scrollbar-thumb{height:30px;outline:none;border:none;border-radius:1rem;background-color:#4c595c;-webkit-border-radius:1rem}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-content textarea[data-v-27cc98a0]::-webkit-scrollbar-track-piece{background:none;-webkit-border-radius:0;border-radius:0}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-btn[data-v-27cc98a0]{width:100%;display:flex;flex-wrap:wrap;align-items:center;justify-content:center}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-btn button[data-v-27cc98a0]{visibility:visible;min-width:88px;font-weight:bolder;text-shadow:1px 1px 0px black;border-radius:8px;height:33px;font-family:Verdana,Microsoft Yahei UI,sans-serif;font-size:12px;padding:0 .7em;width:auto;min-width:122px;margin:0 10px;cursor:pointer;background:#090a0a!important;border:1px solid #fff!important;color:#fff!important;opacity:1!important}.software-log_shade .software-log_shade__pannel .software-log_shade__pannel-btn button[data-v-27cc98a0]:hover{opacity:.9!important}.cbi-section .title{font-size:1.1rem;line-height:1;display:block;width:100%;margin:0;color:#32325d;padding:1rem 1.25rem}.cbi-page-actions{display:inline-block;width:100%}.loading[data-v-23d08f2c]{position:absolute;top:50%;left:50%;transform:translate(-50%);display:block;padding:20px;text-align:center}.loading--inline[data-v-23d08f2c]{display:inline-block;padding:0;vertical-align:middle}.loading__spinner[data-v-23d08f2c]{-webkit-animation:loading-rotator-23d08f2c 1.5s linear infinite;animation:loading-rotator-23d08f2c 1.5s linear infinite;height:35px;width:35px}.loading__path[data-v-23d08f2c]{-webkit-animation:loading-dash-23d08f2c 1.5s ease-in-out infinite;animation:loading-dash-23d08f2c 1.5s ease-in-out infinite;stroke:#5e72e4;stroke-dasharray:187;stroke-dashoffset:0;transform-origin:center}@-webkit-keyframes loading-rotator-23d08f2c{0%{transform:rotate(0)}to{transform:rotate(270deg)}}@keyframes loading-rotator-23d08f2c{0%{transform:rotate(0)}to{transform:rotate(270deg)}}@-webkit-keyframes loading-dash-23d08f2c{0%{stroke-dashoffset:187}50%{stroke-dashoffset:46.75;transform:rotate(135deg)}to{stroke-dashoffset:187;transform:rotate(450deg)}}@keyframes loading-dash-23d08f2c{0%{stroke-dashoffset:187}50%{stroke-dashoffset:46.75;transform:rotate(135deg)}to{stroke-dashoffset:187;transform:rotate(450deg)}}#app{font-family:Avenir,Helvetica,Arial,sans-serif;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}\n"
  },
  {
    "path": "relevance/luci-mod-istorenext/Makefile",
    "content": "\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=iStoreNext\nLUCI_DESCRIPTION:=LuCI module for iStoreNext\nPKG_VERSION:=0.0.4\nPKG_RELEASE:=1\nLUCI_DEPENDS:=+luci-nginxer\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "relevance/luci-mod-istorenext/po/templates/istorenext.pot",
    "content": "msgid \"\"\nmsgstr \"Content-Type: text/plain; charset=UTF-8\"\n\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:160\nmsgid \"Invalid username and/or password! Please try again.\"\nmsgstr \"\"\n\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:123\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:152\nmsgid \"Log in\"\nmsgstr \"\"\n\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:143\nmsgid \"Password\"\nmsgstr \"\"\n\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:149\nmsgid \"Please enter password\"\nmsgstr \"\"\n\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:138\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:169\nmsgid \"Please enter username\"\nmsgstr \"\"\n\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:131\nmsgid \"Username\"\nmsgstr \"\"\n\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:124\nmsgid \"Welcome back, please enter your credentials\"\nmsgstr \"\"\n"
  },
  {
    "path": "relevance/luci-mod-istorenext/po/zh_Hans/istorenext.po",
    "content": "msgid \"\"\nmsgstr \"\"\n\"Content-Type: text/plain; charset=UTF-8\\n\"\n\"Project-Id-Version: PACKAGE VERSION\\n\"\n\"Last-Translator: Automatically generated\\n\"\n\"Language-Team: none\\n\"\n\"Language: zh_Hans\\n\"\n\"MIME-Version: 1.0\\n\"\n\"Content-Transfer-Encoding: 8bit\\n\"\n\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:160\nmsgid \"Invalid username and/or password! Please try again.\"\nmsgstr \"\"\n\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:123\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:152\nmsgid \"Log in\"\nmsgstr \"\"\n\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:143\nmsgid \"Password\"\nmsgstr \"\"\n\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:149\nmsgid \"Please enter password\"\nmsgstr \"请输入密码\"\n\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:138\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:169\nmsgid \"Please enter username\"\nmsgstr \"请输入用户名\"\n\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:131\nmsgid \"Username\"\nmsgstr \"\"\n\n#: luci/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm:124\nmsgid \"Welcome back, please enter your credentials\"\nmsgstr \"欢迎回来，请输入您的凭证\"\n"
  },
  {
    "path": "relevance/luci-mod-istorenext/root/etc/nginx/conf.d/istorenext.conf",
    "content": "map $request_method:$query_string $login_request {\n\tdefault 0;\n\t~^POST:istorenextlogin=1$ 1;\n\t~^GET:istorenextlogin=1$ 2;\n}\n"
  },
  {
    "path": "relevance/luci-mod-istorenext/root/etc/nginx/conf.d/istorenext.locations",
    "content": "if ($login_request = 2) {\n\treturn 302 $uri;\n}\n\nproxy_intercept_errors on;\nuwsgi_intercept_errors on;\n\nerror_page 403 /cgi-bin/luci/istorenext-login;\n\nlocation ~ ^/cgi-bin/luci/istorenext(/|$) {\n\tinclude uwsgi_params;\n\t\n\tuwsgi_param SERVER_ADDR $server_addr;\n\tuwsgi_modifier1 9;\n\tproxy_set_header Host $host;\n\tproxy_set_header X-Real-IP $remote_addr;\n\tproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n\tif ($login_request = 0) {\n\t\tproxy_pass http://127.0.0.1:8080;\n\t} \n\tif ($login_request = 1) {\n\t\tuwsgi_pass unix:////var/run/luci-webui.socket;\n\t}\n}\n"
  },
  {
    "path": "relevance/luci-mod-istorenext/root/etc/uci-defaults/50_luci-istorenext",
    "content": "#!/bin/sh\n\nrm -f /tmp/luci-indexcache\n/etc/init.d/nginx reload 2>/dev/null\nexit 0\n"
  },
  {
    "path": "relevance/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/index.htm",
    "content": "<%\n\tlocal url=luci.http.getenv(\"REQUEST_URI\")\n\tlocal prefix=\"/cgi-bin/luci/istorenext\"\n\n\tif string.sub(url, 1, #prefix) == prefix then\n-%>\n<%=url%>\n<% else\n\tluci.http.redirect(prefix)\nend %>\n"
  },
  {
    "path": "relevance/luci-mod-istorenext/root/usr/lib/lua/luci/view/istorenext/login.htm",
    "content": "<%\n\tlocal util = require \"luci.util\"\n\tlocal http = require \"luci.http\"\n\n\tlocal boardinfo = util.ubus(\"system\", \"board\")\n\thttp.prepare_content(\"text/html; charset=UTF-8\")\n-%>\n\n<!DOCTYPE html>\n<html lang=\"<%=luci.i18n.context.lang%>\">\n<head>\n\t<meta charset=\"UTF-8\">\n\t<meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\n\t<title><%=striptags( boardinfo.hostname or \"?\" ) %> - LuCI</title>\n\t<style>\n\t\t* {\n\t\t\tmargin: 0;\n\t\t\tpadding: 0;\n\t\t\tbox-sizing: border-box;\n\t\t}\n\n\t\tbody {\n\t\t\tfont-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, sans-serif;\n\t\t\tbackground: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n\t\t\tdisplay: flex;\n\t\t\tjustify-content: center;\n\t\t\talign-items: center;\n\t\t\tmin-height: 100vh;\n\t\t\tpadding: 20px;\n\t\t}\n\n\t\t.login-container {\n\t\t\tbackground: white;\n\t\t\tborder-radius: 10px;\n\t\t\tbox-shadow: 0 10px 40px rgba(0, 0, 0, 0.2);\n\t\t\twidth: 100%;\n\t\t\tmax-width: 400px;\n\t\t\tpadding: 40px;\n\t\t}\n\n\t\t.login-header {\n\t\t\ttext-align: center;\n\t\t\tmargin-bottom: 30px;\n\t\t}\n\n\t\t.login-header h1 {\n\t\t\tcolor: #333;\n\t\t\tfont-size: 28px;\n\t\t\tmargin-bottom: 10px;\n\t\t}\n\n\t\t.login-header p {\n\t\t\tcolor: #666;\n\t\t\tfont-size: 14px;\n\t\t}\n\n\t\t.form-group {\n\t\t\tmargin-bottom: 20px;\n\t\t}\n\n\t\t.form-group label {\n\t\t\tdisplay: block;\n\t\t\tcolor: #333;\n\t\t\tfont-size: 14px;\n\t\t\tfont-weight: 500;\n\t\t\tmargin-bottom: 8px;\n\t\t}\n\n\t\t.form-group input {\n\t\t\twidth: 100%;\n\t\t\tpadding: 12px 15px;\n\t\t\tborder: 1px solid #ddd;\n\t\t\tborder-radius: 5px;\n\t\t\tfont-size: 14px;\n\t\t\ttransition: border-color 0.3s;\n\t\t}\n\n\t\t.form-group input:focus {\n\t\t\toutline: none;\n\t\t\tborder-color: #667eea;\n\t\t}\n\n\t\t.login-button {\n\t\t\twidth: 100%;\n\t\t\tpadding: 12px;\n\t\t\tbackground: linear-gradient(135deg, #667eea 0%, #764ba2 100%);\n\t\t\tcolor: white;\n\t\t\tborder: none;\n\t\t\tborder-radius: 5px;\n\t\t\tfont-size: 16px;\n\t\t\tfont-weight: 600;\n\t\t\tcursor: pointer;\n\t\t\ttransition: transform 0.2s, box-shadow 0.2s;\n\t\t}\n\n\t\t.login-button:hover {\n\t\t\ttransform: translateY(-2px);\n\t\t\tbox-shadow: 0 5px 15px rgba(102, 126, 234, 0.4);\n\t\t}\n\n\t\t.login-button:active {\n\t\t\ttransform: translateY(0);\n\t\t}\n\n\t\t.error-message {\n\t\t\tbackground: #fee;\n\t\t\tcolor: #c33;\n\t\t\tpadding: 10px;\n\t\t\tborder-radius: 5px;\n\t\t\tmargin-bottom: 20px;\n\t\t\tfont-size: 14px;\n\t\t\tdisplay: none;\n\t\t}\n\n\t\t.error-message.show {\n\t\t\tdisplay: block;\n\t\t}\n\t</style>\n</head>\n<body>\n\t<div class=\"login-container\">\n\t\t<div class=\"login-header\">\n\t\t\t<h1><%:Log in%></h1>\n\t\t\t<p><%:Welcome back, please enter your credentials%></p>\n\t\t</div>\n\n\t\t<div id=\"errorMessage\" class=\"error-message\"></div>\n\n\t\t<form action=\"?istorenextlogin=1\" method=\"post\" id=\"loginForm\">\n\t\t\t<div class=\"form-group\">\n\t\t\t\t<label for=\"username\"><%:Username%></label>\n\t\t\t\t<input \n\t\t\t\t\ttype=\"text\" \n\t\t\t\t\tid=\"username\" \n\t\t\t\t\tname=\"luci_username\" \n\t\t\t\t\trequired \n\t\t\t\t\tautocomplete=\"username\"\n\t\t\t\t\tplaceholder=\"<%:Please enter username%>\"\n\t\t\t\t\tvalue=\"root\">\n\t\t\t</div>\n\n\t\t\t<div class=\"form-group\">\n\t\t\t\t<label for=\"password\"><%:Password%></label>\n\t\t\t\t<input \n\t\t\t\t\ttype=\"password\" \n\t\t\t\t\tid=\"password\" \n\t\t\t\t\tname=\"luci_password\"  \n\t\t\t\t\tautocomplete=\"current-password\"\n\t\t\t\t\tplaceholder=\"<%:Please enter password%>\">\n\t\t\t</div>\n\n\t\t\t<button type=\"submit\" class=\"login-button\"><%:Log in%></button>\n\t\t</form>\n\t</div>\n\n\t<script>\n\t\tconst errorMessage = document.getElementById('errorMessage');\n\n\t\tif (\"?istorenextlogin=1\" == location.search) {\n\t\t\terrorMessage.textContent = '<%:Invalid username and/or password! Please try again.%>';\n\t\t\terrorMessage.classList.add('show');\n\t\t}\n\n\t\tdocument.getElementById('loginForm').addEventListener('submit', function(e) {\n\t\t\tconst username = document.getElementById('username').value.trim();\n\n\t\t\tif (!username) {\n\t\t\t\te.preventDefault();\n\t\t\t\terrorMessage.textContent = '<%:Please enter username%>';\n\t\t\t\terrorMessage.classList.add('show');\n\t\t\t\treturn false;\n\t\t\t}\n\n\t\t\terrorMessage.classList.remove('show');\n\t\t});\n\n\t\tconst inputs = document.querySelectorAll('input');\n\t\tinputs.forEach(input => {\n\t\t\tinput.addEventListener('input', function() {\n\t\t\t\terrorMessage.classList.remove('show');\n\t\t\t});\n\t\t});\n\t</script>\n</body>\n</html>\n"
  },
  {
    "path": "relevance/luci-mod-istorenext/root/usr/share/luci/menu.d/luci-mod-istorenext.json",
    "content": "{\n\t\"istorenext\": {\n\t\t\"order\": 0,\n\t\t\"leaf\": true,\n\t\t\"action\": {\n\t\t\t\"type\": \"template\",\n\t\t\t\"path\": \"istorenext/index\"\n\t\t},\n\t\t\"auth\": {\n\t\t\t\"methods\": [ \"cookie:sysauth_https\", \"cookie:sysauth_http\" ],\n\t\t\t\"login\": true\n\t\t}\n\t},\n\t\"istorenext-login\": {\n\t\t\"action\": {\n\t\t\t\"type\": \"template\",\n\t\t\t\"path\": \"istorenext/login\"\n\t\t}\n\t}\n}"
  },
  {
    "path": "relevance/luci-mod-istorenext/root-demo/demo/cgi-bin/luci/istorenext/cgi-bin/logon",
    "content": "#!/usr/bin/env ucode\n\n'use strict';\n\nimport { connect } from 'ubus';\nimport request from 'luci.http';\n\nlet ubus = connect();\nlet http;\n\nfunction session_retrieve(sid, allowed_users) {\n\tlet sdat = ubus.call(\"session\", \"get\", { ubus_rpc_session: sid });\n\tif (type(sdat?.values?.token) == 'string' &&\n\t\t(!length(allowed_users) || sdat?.values?.username in allowed_users)) {\n\t\t// uci:set_session_id(sid)\n\t\treturn {\n\t\t\tsid,\n\t\t\tdata: sdat.values\n\t\t};\n\t}\n\n\treturn null;\n}\n\nfunction check_authentication(method) {\n\tlet m = match(method, /^([[:alpha:]]+):(.+)$/);\n\tlet sid;\n\n\tswitch (m?.[1]) {\n\tcase 'cookie':\n\t\tsid = http.getcookie(m[2]);\n\t\tbreak;\n\n\tcase 'param':\n\t\tsid = http.formvalue(m[2]);\n\t\tbreak;\n\n\tcase 'query':\n\t\tsid = http.formvalue(m[2], true);\n\t\tbreak;\n\t}\n\n\treturn sid ? session_retrieve(sid) : null;\n}\n\nfunction is_authenticated(auth) {\n\tfor (let method in auth?.methods) {\n\t\tlet session = check_authentication(method);\n\n\t\tif (session)\n\t\t\treturn session;\n\t}\n\n\treturn null;\n}\n\nconst input_bufsize = 4096;\nlet input_available = +getenv('CONTENT_LENGTH') || 0;\n\nimport { stdin, stdout } from 'fs';\n\nfunction read(len) {\n\tif (input_available == 0) {\n\t\tstdin.close();\n\n\t\treturn null;\n\t}\n\n\tlet chunk = stdin.read(min(input_available, len ?? input_bufsize, input_bufsize));\n\n\tif (chunk == null) {\n\t\tinput_available = 0;\n\t\tstdin.close();\n\t}\n\telse {\n\t\tinput_available -= length(chunk);\n\t}\n\n\treturn chunk;\n}\n\nfunction write(data) {\n\treturn stdout.write(data);\n}\n\nhttp = request(getenv(), read, write);\n\nimport { open } from 'fs';\nfunction read_jsonfile(path, defval) {\n\tlet rv;\n\n\ttry {\n\t\trv = json(open(path, \"r\"));\n\t}\n\tcatch (e) {\n\t\trv = defval;\n\t}\n\n\treturn rv;\n}\n\nlet luci_base_menu = read_jsonfile(\"/usr/share/luci/menu.d/luci-base.json\");\n\nlet session = is_authenticated(luci_base_menu[\"admin\"].auth);\n\nif (!session) {\n\thttp.status(403, 'Forbidden');\n\thttp.header('X-LuCI-Login-Required', 'yes');\n\thttp.prepare_content('text/html; charset=UTF-8');\n\thttp.write('<html><body><h1>403 Forbidden</h1><p>This page should be overridden by nginx</p></body></html>');\n} else {\n\thttp.status(200, 'OK');\n\thttp.prepare_content('application/json; charset=UTF-8');\n\thttp.write_json(session);\n}\nhttp.close();\n"
  },
  {
    "path": "relevance/luci-mod-istorenext/root-demo/demo/cgi-bin/luci/istorenext/index.htm",
    "content": "<h1>Hello world!</h1>\n<ul>\n\t<li><a href=\"/cgi-bin/luci/istorenext/cgi-bin/logon\">Check logon</a></li>\n\t<li><a href=\"/cgi-bin/luci/admin\">LuCI</a></li>\n</ul>\n"
  },
  {
    "path": "relevance/luci-mod-istorenext/root-demo/etc/init.d/istorenext-demo",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=79\nUSE_PROCD=1\n\nstart_service() {\n\tprocd_open_instance\n\tprocd_set_param command /usr/sbin/uhttpd -f -h /demo -r Test -x /cgi-bin/luci/istorenext/cgi-bin -u /ubus -t 360 -T 30 -k 20 -A 1 -n 50 -N 100 -R -p 0.0.0.0:8080\n\tprocd_set_param stderr 1\n\tprocd_set_param respawn\n\tprocd_close_instance\n}\n"
  },
  {
    "path": "relevance/luci-mod-istorenext/test.conf",
    "content": "worker_processes auto;\n\nuser root;\n\ninclude module.d/*.module;\n\nevents {}\n\nhttp {\n\t\taccess_log off;\n\t\tlog_format openwrt\n\t\t\t\t'$request_method $scheme://$host$request_uri => $status'\n\t\t\t\t' (${body_bytes_sent}B in ${request_time}s) <- $http_referer';\n\n\t\tinclude mime.types;\n\t\tdefault_type application/octet-stream;\n\t\tsendfile on;\n\n\t\tclient_max_body_size 256M;\n\t\tlarge_client_header_buffers 2 1k;\n\n\t\tgzip on;\n\t\tgzip_vary on;\n\t\tgzip_proxied any;\n\n\t\troot /www;\n\n\t\tmap $request_method:$query_string $login_request {\n\t\t\tdefault 0;\n\t\t\t~^POST:istorenextlogin=1$ 1;\n\t\t\t~^GET:istorenextlogin=1$ 2;\n\t\t}\n\n\t\tserver { #see uci show 'nginx._redirect2ssl'\n\t\t\t\tlisten 80;\n\t\t\t\tlisten [::]:80;\n\t\t\t\tserver_name _redirect2ssl;\n\t\t\t\tinclude restrict_locally;\n\n\t\t\t\tif ($login_request = 2) {\n\t\t\t\t\treturn 302 $uri;\n\t\t\t\t}\n\n\t\t\t\tproxy_intercept_errors on;\n\t\t\t\tuwsgi_intercept_errors on;\n\n\t\t\t\terror_page 403 /cgi-bin/luci/istorenext-login;\n\n\t\t\t\tlocation ~ ^/cgi-bin/luci/istorenext(/|$) {\n\t\t\t\t\tinclude uwsgi_params;\n\t\t\t\t\t\n\t\t\t\t\tuwsgi_param SERVER_ADDR $server_addr;\n\t\t\t\t\tuwsgi_modifier1 9;\n\t\t\t\t\tproxy_set_header Host $host;\n\t\t\t\t\tproxy_set_header X-Real-IP $remote_addr;\n\t\t\t\t\tproxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;\n\t\t\t\t\tif ($login_request = 0) {\n\t\t\t\t\t\tproxy_pass http://127.0.0.1:8080;\n\t\t\t\t\t} \n\t\t\t\t\tif ($login_request = 1) {\n\t\t\t\t\t\tuwsgi_pass unix:////var/run/luci-webui.socket;\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\t# configuration file /etc/nginx/conf.d/luci.locations:\n\t\t\t\tlocation /cgi-bin/luci {\n\t\t\t\t\tindex  index.html;\n\t\t\t\t\tinclude uwsgi_params;\n\t\t\t\t\tuwsgi_param SERVER_ADDR $server_addr;\n\t\t\t\t\tuwsgi_modifier1 9;\n\t\t\t\t\tuwsgi_pass unix:////var/run/luci-webui.socket;\n\t\t\t\t}\n\t\t\t\taccess_log off; # logd openwrt;\n\t\t}\n}\n"
  },
  {
    "path": "relevance/luci-nginxer/Makefile",
    "content": "#\n# Copyright (C) 2008-2014 The LuCI Team <luci@lists.subsignal.org>\n#\n# This is free software, licensed under the Apache License, Version 2.0 .\n#\n\ninclude $(TOPDIR)/rules.mk\n\nLUCI_TITLE:=Nginxer\nLUCI_DESCRIPTION:=Standard OpenWrt set including full admin with ppp support and the default Bootstrap theme\nPKG_VERSION:=0.0.2\nPKG_RELEASE:=1\nLUCI_DEPENDS:=+luci-nginx\n\ndefine Package/luci-nginxer/postrm\n#!/bin/sh\n/etc/init.d/uhttpd enable\n/etc/init.d/uhttpd start\nexit 0\nendef\n\ninclude $(TOPDIR)/feeds/luci/luci.mk\n\n# call BuildPackage - OpenWrt buildroot signature\n"
  },
  {
    "path": "relevance/luci-nginxer/root/etc/uci-defaults/50_luci-nginxer",
    "content": "#!/bin/sh\n\nnginxer=$(uci get nginx.global.nginxer)\nif [ \"$nginxer\" != 1 ]; then\n    uci delete nginx._redirect2ssl.return\n    uci add_list nginx._redirect2ssl.include='restrict_locally'\n    uci add_list nginx._redirect2ssl.include='conf.d/*.locations'\n    uci set nginx._redirect2ssl.access_log='off; # logd openwrt'\n    uci set nginx.global.nginxer='1'\n    uci commit nginx\n\n    # fix firmware upload failed\n    sed -i 's/client_max_body_size 128M;/client_max_body_size 256M;/g' /etc/nginx/uci.conf.template\n\n    # /etc/init.d/uhttpd running || /etc/init.d/uhttpd disable\n    /etc/init.d/nginx reload\nfi\nexit 0\n"
  },
  {
    "path": "relevance/msd_lite/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2022 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=msd_lite\nPKG_RELEASE:=3\n\nPKG_SOURCE_PROTO:=git\nPKG_SOURCE_URL:=https://github.com/rozhuk-im/msd_lite.git\nPKG_SOURCE_DATE:=2023-02-17\nPKG_SOURCE_VERSION:=744d2ef91797471e26b3b117e7aa0ffebbb91106\nPKG_MIRROR_HASH:=f4e8e3571fda1be758d7fedd10926badea661ca86477e0835b544b5174dc1dae\n\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immrotalwrt.org>\nPKG_LICENSE:=BSD-2-Clause\nPKG_LICENSE_FILES:=LICENSE\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(INCLUDE_DIR)/cmake.mk\n\ndefine Package/msd_lite\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=Program for IP TV streaming on the network via HTTP\n  URL:=http://www.netlab.linkpc.net/wiki/ru:software:msd:lite\nendef\n\ndefine Package/msd_lite/description\n  msd_lite - Multi stream daemon lite. The lightweight version of\n  Multi Stream daemon (msd) Program for organizing IP TV streaming\n  on the network via HTTP.\nendef\n\ndefine Package/msd_lite/conffiles\n/etc/config/msd_lite\nendef\n\nCMAKE_OPTIONS+= -DCONFDIR=../etc/msd_lite\n\ndefine Package/msd_lite/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/msd_lite $(1)/usr/bin/\n\n\t$(INSTALL_DIR) $(1)/etc/msd_lite\n\t$(CP) $(CURDIR)/files/msd_lite.sample $(1)/etc/msd_lite/msd_lite.conf.sample\n\t$(INSTALL_DIR) $(1)/etc/config\n\t$(INSTALL_CONF) $(CURDIR)/files/msd_lite.config $(1)/etc/config/msd_lite\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_BIN) $(CURDIR)/files/msd_lite.init $(1)/etc/init.d/msd_lite\nendef\n\n$(eval $(call BuildPackage,msd_lite))\n"
  },
  {
    "path": "relevance/msd_lite/files/msd_lite.config",
    "content": "\nconfig instance\n\toption enabled '0'\n\n\t# Bind address\n\tlist address '0.0.0.0:7088'\n\tlist address '[::]:7088'\n\t# For multicast receive\n\toption network ''\n\n\t# 0 = auto detect\n\toption threads '0'\n\t# Bind threads to CPUs\n\toption bind_to_cpu '0'\n\n\t# Disconnect slow clients\n\toption drop_slow_clients '0'\n\t# Pre cache size\n\toption precache_size '4096'\n\t# Stream receive ring buffer size\n\toption ring_buffer_size '1024'\n\t# Multicast receive socket buffer size\n\toption multicast_recv_buffer_size '512'\n\t# Multicast receive timeout\n\toption multicast_recv_timeout '2'\n\t# Do IGMP/MLD leave+join every X seconds\n\toption rejoin_time '0'\n"
  },
  {
    "path": "relevance/msd_lite/files/msd_lite.init",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2022 ImmortalWrt.org\n\n. /lib/functions/network.sh\n\nSTART=99\nUSE_PROCD=1\n\nNAME=\"msd_lite\"\nPROG=\"/usr/bin/$NAME\"\n\nCONF=\"/etc/$NAME/$NAME.conf.sample\"\nCONFDIR=\"/var/run/$NAME\"\n\nadd_interface_tiggers() {\n\tlocal enabled network\n\tconfig_get_bool enabled \"$1\" \"enabled\" \"1\"\n\tconfig_get network \"$1\" \"network\"\n\n\t[ \"$enabled\" -eq \"0\" -o -z \"$network\" ] || procd_add_reload_interface_trigger \"$network\"\n}\n\nvalidate_msd_lite_section() {\n\tuci_load_validate \"$NAME\" \"instance\" \"$1\" \"$2\" \\\n\t\t'enabled:bool:0' \\\n\t\t'address:string' \\\n\t\t'interface:string' \\\n\t\t'network:string' \\\n\t\t'threads:uinteger:0' \\\n\t\t'bind_to_cpu:bool:0' \\\n\t\t'drop_slow_clients:bool:0' \\\n\t\t'precache_size:uinteger:4096' \\\n\t\t'ring_buffer_size:uinteger:1024' \\\n\t\t'multicast_recv_buffer_size:uinteger:512' \\\n\t\t'multicast_recv_timeout:uinteger:2' \\\n\t\t'rejoin_time:uinteger:0'\n}\n\nstart_instance() {\n\tlocal section=\"$1\"\n\tlocal seconds=\"0\"\n\n\t[ \"$2\" -eq \"0\" ] || { logger -p daemon.err -t \"$NAME\" \"$section Validation failed.\"; return 1; }\n\t[ \"$enabled\" -eq \"1\" ] || return 1\n\n\tif [ -n \"$network\" ]; then\n\t\twhile [ \"$seconds\" -le 10 ]; do\n\t\t\tnetwork_flush_cache\n\t\t\tnetwork_get_device interface \"$network\"\n\t\t\tif [ -n \"$interface\" ]; then\n\t\t\t\tbreak\n\t\t\telse\n\t\t\t\tlet seconds+=2\n\t\t\t\tsleep 2\n\t\t\tfi\n\t\tdone\n\tfi\n\n\tif [ -n \"$address\" ]; then\n\t\tlocal addr bindlist\n\t\tfor addr in $address; do\n\t\t\tbindlist=\"${bindlist:+$bindlist\\\\n\\\\t\\\\t\\\\t}<bind><address>$addr</address></bind>\"\n\t\tdone\n\telse\n\t\treturn 1\n\tfi\n\n\t[ \"$bind_to_cpu\" = \"1\" ] && bind_to_cpu=\"yes\" || bind_to_cpu=\"no\"\n\t[ \"$drop_slow_clients\" = \"1\" ] && drop_slow_clients=\"yes\" || drop_slow_clients=\"no\"\n\n\tmkdir -p \"$CONFDIR\"\n\tsed -e \"s,@threadsCountMax@,$threads,g\" \\\n\t    -e \"s,@fBindToCPU@,$bind_to_cpu,g\" \\\n\t    -e \"s,@bindList@,$bindlist,g\" \\\n\t    -e \"s,@ifName@,$interface,g\" \\\n\t    -e \"s,@fDropSlowClients@,$drop_slow_clients,g\" \\\n\t    -e \"s,@precache@,$precache_size,g\" \\\n\t    -e \"s,@ringBufSize@,$ring_buffer_size,g\" \\\n\t    -e \"s,@rcvBuf@,$multicast_recv_buffer_size,g\" \\\n\t    -e \"s,@rcvTimeout@,$multicast_recv_timeout,g\" \\\n\t    -e \"s,@rejoinTime@,$rejoin_time,g\" \\\n\t\t\"$CONF\" > \"$CONFDIR/$section.conf\"\n\n\tprocd_open_instance \"$section\"\n\tprocd_set_param command \"$PROG\"\n\tprocd_append_param command -c \"$CONFDIR/$section.conf\"\n\n\tprocd_set_param limits core=\"unlimited\"\n\tprocd_set_param limits nofile=\"1000000 1000000\"\n\tprocd_set_param respawn\n\tprocd_set_param stderr 1\n\n\tprocd_close_instance\n}\n\nstart_service() {\n\tconfig_load \"$NAME\"\n\n\tconfig_foreach validate_msd_lite_section \"instance\" start_instance\n}\n\nstop_service() {\n\trm -rf \"$CONFDIR\"\n}\n\nreload_service() {\n\tstop\n\tstart\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"$NAME\"\n\n\tconfig_load \"$NAME\"\n\tconfig_foreach add_interface_tiggers \"instance\"\n}\n"
  },
  {
    "path": "relevance/msd_lite/files/msd_lite.sample",
    "content": "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n<!--\n Sizes in kb, time in seconds\n-->\n<!--\n<skt> <rcvLoWatermark>XXXX</rcvLoWatermark> - DOES NOT WORK on Linux!\nman socket(7):\n...\nThe select(2) and poll(2) system calls currently do not respect the SO_RCVLOWAT\nsetting on Linux, and mark a socket readable when even a single byte of data is\navailable.\n...\n-->\n<msd>\n\t<log>\n\t\t<file>/dev/null</file>\n\t</log>\n\t<threadPool>\n\t\t<threadsCountMax>@threadsCountMax@</threadsCountMax>\n\t\t<!-- 0 = auto -->\n\t\t<fBindToCPU>@fBindToCPU@</fBindToCPU>\n\t\t<!-- Bind threads to CPUs. -->\n\t\t<fCacheGetTimeSyscall>yes</fCacheGetTimeSyscall>\n\t\t<!-- Cache gettime() syscalls.. -->\n\t\t<timerGranularity>100</timerGranularity>\n\t\t<!-- 1/1000 sec -->\n\t</threadPool>\n\t<!-- HTTP server -->\n\t<HTTP>\n\t\t<bindList>\n\t\t\t@bindList@\n\t\t</bindList>\n\t\t<hostnameList>\n\t\t\t<!-- Host names for all bindings. -->\n\t\t\t<hostname>*</hostname>\n\t\t</hostnameList>\n\t</HTTP>\n\t<hubProfileList>\n\t\t<!-- Stream hub profiles templates. -->\n\t\t<hubProfile>\n\t\t\t<fDropSlowClients>@fDropSlowClients@</fDropSlowClients>\n\t\t\t<!-- Disconnect slow clients. -->\n\t\t\t<fSocketHalfClosed>no</fSocketHalfClosed>\n\t\t\t<!-- Enable shutdown(SHUT_RD) for clients. -->\n\t\t\t<fSocketTCPNoDelay>yes</fSocketTCPNoDelay>\n\t\t\t<!-- Enable TCP_NODELAY for clients. -->\n\t\t\t<fSocketTCPNoPush>yes</fSocketTCPNoPush>\n\t\t\t<!-- Enable TCP_NOPUSH / TCP_CORK for clients. -->\n\t\t\t<precache>@precache@</precache>\n\t\t\t<!-- Pre cache size. Can be overwritten by arg from user request. -->\n\t\t\t<ringBufSize>@ringBufSize@</ringBufSize>\n\t\t\t<!-- Stream receive ring buffer size. Must be multiple of sndBlockSize. -->\n\t\t\t<skt>\n\t\t\t\t<sndBuf>512</sndBuf>\n\t\t\t\t<!-- Max send block size, apply to clients sockets only, must be > sndBlockSize. -->\n\t\t\t\t<sndLoWatermark>64</sndLoWatermark>\n\t\t\t\t<!-- Send block size. Must be multiple of 4. -->\n\t\t\t\t<!-- <congestionControl>htcp</congestionControl> -->\n\t\t\t\t<!-- TCP_CONGESTION: this value replace/overwrite(!) all others cc settings: cc from http req args, http server settings, OS default -->\n\t\t\t</skt>\n\t\t\t<headersList>\n\t\t\t\t<!-- Custom HTTP headers (sended before stream). -->\n\t\t\t\t<header>Pragma: no-cache</header>\n\t\t\t\t<header>Content-Type: video/mpeg</header>\n\t\t\t\t<header>ContentFeatures.DLNA.ORG: DLNA.ORG_OP=01;DLNA.ORG_CI=0;DLNA.ORG_FLAGS=01700000000000000000000000000000</header>\n\t\t\t\t<header>TransferMode.DLNA.ORG: Streaming</header>\n\t\t\t</headersList>\n\t\t</hubProfile>\n\t</hubProfileList>\n\t<sourceProfileList>\n\t\t<!-- Stream source profiles templates. -->\n\t\t<sourceProfile>\n\t\t\t<skt>\n\t\t\t\t<rcvBuf>@rcvBuf@</rcvBuf>\n\t\t\t\t<!-- Multicast recv socket buf size. -->\n\t\t\t\t<rcvLoWatermark>48</rcvLoWatermark>\n\t\t\t\t<!-- Actual cli_snd_block_min if polling is off. -->\n\t\t\t\t<rcvTimeout>@rcvTimeout@</rcvTimeout>\n\t\t\t\t<!-- STATUS, Multicast recv timeout. -->\n\t\t\t</skt>\n\t\t\t<multicast>\n\t\t\t\t<!-- For: multicast-udp and multicast-udp-rtp. -->\n\t\t\t\t<ifName>@ifName@</ifName>\n\t\t\t\t<rejoinTime>@rejoinTime@</rejoinTime> <!-- Do IGMP/MLD leave+join every X seconds. -->\n\t\t\t\t<!-- For multicast receive. -->\n\t\t\t</multicast>\n\t\t</sourceProfile>\n\t</sourceProfileList>\n</msd>\n"
  },
  {
    "path": "relevance/msd_lite/patches/010-Add-rejoin-option-as-ugly-hack-to-allow-send-IGMP-MLD-lea.patch",
    "content": "From afbe2d12e927973957d6d8dda50220014086934e Mon Sep 17 00:00:00 2001\nFrom: Rozhuk Ivan <rozhuk.im@gmail.com>\nDate: Thu, 9 Feb 2023 00:44:14 +0200\nSubject: [PATCH] Add rejoin option as ugly hack to allow send IGMP/MLD\n leave+join every X seconds\n\n---\n README.md          |  2 +-\n conf/msd_lite.conf |  1 +\n src/msd_lite.c     | 35 +++++++++++++++++++++++++++++------\n src/stream_sys.c   | 15 ++++++++++++++-\n src/stream_sys.h   |  4 +++-\n 5 files changed, 48 insertions(+), 9 deletions(-)\n\n--- a/README.md\n+++ b/README.md\n@@ -4,7 +4,7 @@\n [![Build-Ubuntu-latest Actions Status](https://github.com/rozhuk-im/msd_lite/workflows/build-ubuntu-latest/badge.svg)](https://github.com/rozhuk-im/msd_lite/actions)\n \n \n-Rozhuk Ivan <rozhuk.im@gmail.com> 2011 - 2021\n+Rozhuk Ivan <rozhuk.im@gmail.com> 2011 - 2023\n \n msd_lite - Multi stream daemon lite.\n This lightweight version of Multi Stream daemon (msd)\n--- a/conf/msd_lite.conf\n+++ b/conf/msd_lite.conf\n@@ -73,6 +73,7 @@ available.\n \t\t\t</skt>\n \t\t\t<multicast> <!-- For: multicast-udp and multicast-udp-rtp. -->\n \t\t\t\t<ifName>vlan777</ifName> <!-- For multicast receive. -->\n+\t\t\t\t<rejoinTime>0</rejoinTime> <!-- Do IGMP/MLD leave+join every X seconds. -->\n \t\t\t</multicast>\n \t\t</sourceProfile>\n \t</sourceProfileList>\n--- a/src/msd_lite.c\n+++ b/src/msd_lite.c\n@@ -1,5 +1,5 @@\n /*-\n- * Copyright (c) 2012 - 2021 Rozhuk Ivan <rozhuk.im@gmail.com>\n+ * Copyright (c) 2012-2023 Rozhuk Ivan <rozhuk.im@gmail.com>\n  * All rights reserved.\n  *\n  * Redistribution and use in source and binary forms, with or without\n@@ -115,7 +115,8 @@ int\t\tmsd_http_srv_hub_attach(http_srv_cl\n \t\t    uint8_t *hub_name, size_t hub_name_size,\n \t\t    str_src_conn_params_p src_conn_params);\n uint32_t\tmsd_http_req_url_parse(http_srv_req_p req,\n-\t\t    struct sockaddr_storage *ssaddr, uint32_t *if_index,\n+\t\t    struct sockaddr_storage *ssaddr,\n+\t\t    uint32_t *if_index, uint32_t *rejoin_time,\n \t\t    uint8_t *hub_name, size_t hub_name_size,\n \t\t    size_t *hub_name_size_ret);\n \n@@ -264,6 +265,9 @@ msd_src_conn_profile_load(const uint8_t\n \t\tif_name[MIN(IFNAMSIZ, tm)] = 0;\n \t\t((str_src_conn_mc_p)conn)->if_index = if_nametoindex(if_name);\n \t}\n+\txml_get_val_uint32_args(data, data_size, NULL,\n+\t    &((str_src_conn_mc_p)conn)->rejoin_time,\n+\t    (const uint8_t*)\"multicast\", \"rejoinTime\", NULL);\n \n \treturn (0);\n }\n@@ -521,11 +525,11 @@ msd_http_srv_hub_attach(http_srv_cli_p c\n \n uint32_t\n msd_http_req_url_parse(http_srv_req_p req, struct sockaddr_storage *ssaddr,\n-    uint32_t *if_index,\n+    uint32_t *if_index, uint32_t *rejoin_time,\n     uint8_t *hub_name, size_t hub_name_size, size_t *hub_name_size_ret) {\n \tconst uint8_t *ptm;\n \tsize_t tm;\n-\tuint32_t ifindex;\n+\tuint32_t ifindex, rejointime;\n \tchar straddr[STR_ADDR_LEN], ifname[(IFNAMSIZ + 1)];\n \tstruct sockaddr_storage ss;\n \n@@ -562,6 +566,19 @@ msd_http_req_url_parse(http_srv_req_p re\n \t\tif_indextoname(ifindex, ifname);\n \t}\n \n+\t/* rejoin_time. */\n+\tif (0 == http_query_val_get(req->line.query, \n+\t    req->line.query_size, (const uint8_t*)\"rejoin_time\", 11,\n+\t    &ptm, &tm)) {\n+\t\trejointime = ustr2u32(ptm, tm);\n+\t} else { /* Default value. */\n+\t\tif (NULL != if_index) {\n+\t\t\trejointime = (*rejoin_time);\n+\t\t} else {\n+\t\t\trejointime = 0;\n+\t\t}\n+\t}\n+\n \tif (0 != sa_addr_port_to_str(&ss, straddr, sizeof(straddr), NULL))\n \t\treturn (400);\n \ttm = (size_t)snprintf((char*)hub_name, hub_name_size,\n@@ -572,6 +589,9 @@ msd_http_req_url_parse(http_srv_req_p re\n \tif (NULL != if_index) {\n \t\t(*if_index) = ifindex;\n \t}\n+\tif (NULL != rejoin_time) {\n+\t\t(*rejoin_time) = rejointime;\n+\t}\n \tif (NULL != hub_name_size_ret) {\n \t\t(*hub_name_size_ret) = tm;\n \t}\n@@ -641,8 +661,11 @@ msd_http_srv_on_req_rcv_cb(http_srv_cli_\n \t\t/* Default value. */\n \t\tmemcpy(&src_conn_params, &g_data.src_conn_params, sizeof(str_src_conn_mc_t));\n \t\t/* Get multicast address, ifindex, hub name. */\n-\t\tresp->status_code = msd_http_req_url_parse(req, &src_conn_params.udp.addr,\n-\t\t    &src_conn_params.mc.if_index, buf, sizeof(buf), &buf_size);\n+\t\tresp->status_code = msd_http_req_url_parse(req,\n+\t\t    &src_conn_params.udp.addr,\n+\t\t    &src_conn_params.mc.if_index,\n+\t\t    &src_conn_params.mc.rejoin_time,\n+\t\t    buf, sizeof(buf), &buf_size);\n \t\tif (200 != resp->status_code)\n \t\t\treturn (HTTP_SRV_CB_CONTINUE);\n \t\tif (HTTP_REQ_METHOD_HEAD == req->line.method_code) {\n--- a/src/stream_sys.c\n+++ b/src/stream_sys.c\n@@ -1,5 +1,5 @@\n /*-\n- * Copyright (c) 2012 - 2021 Rozhuk Ivan <rozhuk.im@gmail.com>\n+ * Copyright (c) 2012-2023 Rozhuk Ivan <rozhuk.im@gmail.com>\n  * All rights reserved.\n  *\n  * Redistribution and use in source and binary forms, with or without\n@@ -168,6 +168,7 @@ str_src_conn_def(str_src_conn_params_p s\n \t\treturn;\n \tmem_bzero(src_conn_params, sizeof(str_src_conn_params_t));\n \tsrc_conn_params->mc.if_index = STR_SRC_CONN_DEF_IFINDEX;\n+\tsrc_conn_params->mc.rejoin_time = 0;\n }\n \n \n@@ -376,6 +377,7 @@ str_hubs_bckt_stat_summary(str_hubs_bckt\n void\n str_hubs_bckt_timer_service(str_hubs_bckt_p shbskt, str_hub_p str_hub,\n     str_hubs_stat_p stat) {\n+\tint error;\n \tstr_src_settings_p src_params = &shbskt->src_params;\n \tstruct timespec *tp = &shbskt->tp_last_tmr_next;\n \tuint64_t tm64;\n@@ -415,6 +417,17 @@ str_hubs_bckt_timer_service(str_hubs_bck\n \t\t\treturn;\n \t\t}\n \t}\n+\t/* Re join multicast group timer. */\n+\tif (0 != str_hub->src_conn_params.mc.rejoin_time &&\n+\t    str_hub->next_rejoin_time < tp->tv_sec) {\n+\t\tstr_hub->next_rejoin_time = (tp->tv_sec + (time_t)str_hub->src_conn_params.mc.rejoin_time);\n+\t\tfor (int join = 0; join < 2; join ++) {\n+\t\t    error = skt_mc_join(tp_task_ident_get(str_hub->tptask), join,\n+\t\t\tstr_hub->src_conn_params.mc.if_index,\n+\t\t\t&str_hub->src_conn_params.mc.udp.addr);\n+\t\t    LOG_ERR(error, \"skt_mc_join()\");\n+\t\t}\n+\t}\n }\n static void\n str_hubs_bckt_timer_msg_cb(tpt_p tpt, void *udata) {\n--- a/src/stream_sys.h\n+++ b/src/stream_sys.h\n@@ -1,5 +1,5 @@\n /*-\n- * Copyright (c) 2012 - 2021 Rozhuk Ivan <rozhuk.im@gmail.com>\n+ * Copyright (c) 2012-2023 Rozhuk Ivan <rozhuk.im@gmail.com>\n  * All rights reserved.\n  *\n  * Redistribution and use in source and binary forms, with or without\n@@ -114,6 +114,7 @@ typedef struct str_src_conn_udp_s {\n typedef struct str_src_conn_mc_s {\n \tstr_src_conn_udp_t udp;\n \tuint32_t\tif_index;\n+\tuint32_t\trejoin_time;\n } str_src_conn_mc_t, *str_src_conn_mc_p;\n #define STR_SRC_CONN_DEF_IFINDEX\t((uint32_t)-1)\n \n@@ -160,6 +161,7 @@ typedef struct str_hub_s {\n #ifdef __linux__ /* Linux specific code. */\n \tsize_t\t\tr_buf_rcvd;\t/* Ring buf LOWAT emulator. */\n #endif /* Linux specific code. */\n+\ttime_t\t\tnext_rejoin_time; /* Next time to send leave+join. */\n \n \ttpt_p\t\ttpt;\t\t/* Thread data for all IO operations. */\n \tstr_src_conn_params_t src_conn_params;\t/* Point to str_src_conn_XXX */\n"
  },
  {
    "path": "relevance/nas-packages/multimedia/ffmpeg-remux/Makefile",
    "content": "#\n# Copyright (C) 2017-2020 Ian Leonard <antonlacon@gmail.com>\n# Copyright (C) 2018 Ted Hess <thess@kitschensync.net>\n#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=ffmpeg-remux\nPKG_VERSION:=4.3.3\nPKG_RELEASE:=1\n\nPKG_SOURCE:=ffmpeg-$(PKG_VERSION).tar.xz\nPKG_SOURCE_URL:=https://ffmpeg.org/releases/\nPKG_HASH:=9f0a68fbd74feb4e50dc220bddd59d84626774a53687fb737806ae00e5c6e9e6\nPKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>, \\\n\t\tIan Leonard <antonlacon@gmail.com>\n\nPKG_LICENSE:=LGPL-2.1-or-later GPL-2.0-or-later LGPL-3.0-or-later\nPKG_LICENSE_FILES:=COPYING.GPLv2 COPYING.GPLv3 COPYING.LGPLv2.1 COPYING.LGPLv3\nPKG_CPE_ID:=cpe:/a:ffmpeg:ffmpeg\n\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-x/ffmpeg-$(PKG_VERSION)\n\nFFMPEG_REMUX_DECODERS:= \\\n\tmpeg1video \\\n\tmpeg2video \\\n\tmpeg4 \\\n\tmpegvideo \\\n\th264 \\\n\thevc \\\n\tvc1 \\\n\nFFMPEG_REMUX_MUXERS:= \\\n\tmatroska \\\n\th264 \\\n\thevc \\\n\tmp4 \\\n\tmpeg1video \\\n\tmpeg2video \\\n\tmpegts \\\n\togg \\\n\nFFMPEG_REMUX_DEMUXERS:= \\\n\tavi \\\n\th264 \\\n\thevc \\\n\tmatroska \\\n\tmov \\\n\tmpegps \\\n\tmpegts \\\n\tmpegvideo \\\n\togg \\\n\trm \\\n\tvc1 \\\n\twv \\\n\nFFMPEG_REMUX_PARSERS:= \\\n\taac \\\n\tflac \\\n\tac3 \\\n\th264 \\\n\thevc \\\n\tmpegaudio \\\n\tmpeg4video \\\n\tmpegvideo \\\n\tvc1 \\\n\nFFMPEG_REMUX_PROTOCOLS:= \\\n\tfile pipe\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/ffmpeg-remux\n TITLE:=FFmpeg remux\n SECTION:=multimedia\n CATEGORY:=Multimedia\n URL:=https://ffmpeg.org/\n DEPENDS+= +libpthread +zlib +libbz2\nendef\n\ndefine Package/ffmpeg-remux/description\n FFmpeg remux only program\nendef\n\n# Strip off FPU notation\nREAL_CPU_TYPE:=$(firstword $(subst +, ,$(CONFIG_CPU_TYPE)))\n# Fixup cpu types recogized by ffmpeg configure\nREAL_CPU_TYPE:=$(subst octeonplus,octeon+,$(REAL_CPU_TYPE))\n\nFFMPEG_CONFIGURE:= \\\n\tCFLAGS=\"$(TARGET_CFLAGS) $(TARGET_CPPFLAGS) $(FPIC)\" \\\n\tLDFLAGS=\"$(TARGET_LDFLAGS)\" \\\n\t./configure \\\n\t--enable-cross-compile \\\n\t--cross-prefix=\"$(TARGET_CROSS)\" \\\n\t--arch=\"$(ARCH)\" \\\n\t$(if $(REAL_CPU_TYPE),--cpu=$(call qstrip,$(REAL_CPU_TYPE)),) \\\n\t--target-os=linux \\\n\t--prefix=\"/usr\" \\\n\t--pkg-config=\"pkg-config\" \\\n\t--enable-shared \\\n\t--enable-pthreads \\\n\t--enable-zlib \\\n\t--disable-doc \\\n\t--disable-debug \\\n\t\\\n\t--disable-lzma \\\n\t--disable-vaapi \\\n\t--disable-vdpau \\\n\t--disable-outdevs\n\nifeq ($(CONFIG_SOFT_FLOAT),y)\nFFMPEG_CONFIGURE+= \\\n\t--disable-altivec \\\n\t--disable-vsx \\\n\t--disable-power8 \\\n\t--disable-armv5te \\\n\t--disable-armv6 \\\n\t--disable-armv6t2 \\\n\t--disable-fast-unaligned \\\n\t--disable-runtime-cpudetect\n\nelse ifneq ($(findstring arm,$(CONFIG_ARCH))$(findstring aarch64,$(CONFIG_ARCH)),)\nFFMPEG_CONFIGURE+= \\\n\t--disable-runtime-cpudetect\n# XXX: GitHub issue 3320 ppc cpu with fpu but no altivec (WNDR4700)\nelse ifneq ($(findstring powerpc,$(CONFIG_ARCH)),)\nFFMPEG_CONFIGURE+= \\\n\t--disable-altivec\nendif\n\n# selectively disable optimizations according to arch/cpu type\nifneq ($(findstring arm,$(CONFIG_ARCH)),)\n\tFFMPEG_CONFIGURE+= --enable-lto\n\n\tifneq ($(findstring vfp,$(CONFIG_CPU_TYPE)),)\n\t\tFFMPEG_CONFIGURE+= --enable-vfp\n\telse\n\t\tFFMPEG_CONFIGURE+= --disable-vfp\n\tendif\n\tifneq ($(findstring neon,$(CONFIG_CPU_TYPE)),)\n\t\tFFMPEG_CONFIGURE+= \\\n\t\t\t--enable-neon \\\n\t\t\t--enable-vfp\n\telse\n\t\tFFMPEG_CONFIGURE+= --disable-neon\n\tendif\nendif\n\nifneq ($(findstring aarch64,$(CONFIG_ARCH)),)\n\tFFMPEG_CONFIGURE+= \\\n\t\t--enable-lto \\\n\t\t--enable-neon \\\n\t\t--enable-vfp\nendif\n\nifeq ($(ARCH),x86_64)\n\tFFMPEG_CONFIGURE+= --enable-lto\nendif\n\nifeq ($(CONFIG_FFMPEG_X86ASM),y)\n  FFMPEG_CONFIGURE += --enable-x86asm\nelse\n  FFMPEG_CONFIGURE += --disable-x86asm\nendif\n\n\nFFMPEG_ENABLE= \\\n\t$(foreach c, $(2), \\\n\t\t--enable-$(1)=\"$(c)\" \\\n\t)\n\nFFMPEG_CONFIGURE+= \\\n\t--enable-hardcoded-tables \\\n\t--disable-static \\\n\t--libdir=\"/usr/lib/remux\" \\\n\t--enable-rpath \\\n\t\\\n\t--disable-ffplay \\\n\t--disable-alsa \\\n\t--disable-iconv \\\n\t--disable-sndio \\\n\t--disable-schannel \\\n\t--disable-sdl2 \\\n\t--disable-securetransport \\\n\t--disable-xlib \\\n\t--disable-v4l2-m2m \\\n\t--disable-avdevice \\\n\t--disable-postproc \\\n\t--disable-swresample \\\n\t--disable-swscale \\\n\t--disable-everything \\\n\t$(call FFMPEG_ENABLE,decoder,$(FFMPEG_REMUX_DECODERS)) \\\n\t$(call FFMPEG_ENABLE,parser,$(FFMPEG_REMUX_PARSERS)) \\\n\t$(call FFMPEG_ENABLE,demuxer,$(FFMPEG_REMUX_DEMUXERS)) \\\n\t$(call FFMPEG_ENABLE,muxer,$(FFMPEG_REMUX_MUXERS)) \\\n\t$(call FFMPEG_ENABLE,protocol,$(FFMPEG_REMUX_PROTOCOLS))\n\nifneq ($(CONFIG_TARGET_x86),)\n  TARGET_CFLAGS+= -fomit-frame-pointer\nendif\n\ndefine Build/Configure\n\t( cd $(PKG_BUILD_DIR); $(FFMPEG_CONFIGURE) )\nendef\n\ndefine Build/Compile\n\t$(MAKE) -C $(PKG_BUILD_DIR) \\\n\t\tDESTDIR=\"$(PKG_INSTALL_DIR)\" \\\n\t\tall install\nendef\n\ndefine Package/ffmpeg-remux/install\n\t$(INSTALL_DIR) $(1)/usr/lib/remux\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(CP) $(PKG_INSTALL_DIR)/usr/lib/remux/lib{avcodec,avfilter,avformat,avutil}.so.* $(1)/usr/lib/remux/\n\t$(CP) $(PKG_INSTALL_DIR)/usr/bin/ffmpeg $(1)/usr/bin/remux\nendef\n\n$(eval $(call BuildPackage,ffmpeg-remux))\n"
  },
  {
    "path": "relevance/nas-packages/network/services/ddnsto/Makefile",
    "content": "#\n# Copyright (C) 2015-2016 OpenWrt.org\n# Copyright (C) 2020 jjm2473@gmail.com\n#\n# This is free software, licensed under the GNU General Public License v3.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_ARCH_DDNSTO:=$(ARCH)\n\nPKG_NAME:=ddnsto\n# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable\nPKG_SOURCE_DATE:=3.0.4\nPKG_RELEASE:=8\nARCH_HEXCODE:=\nifeq ($(ARCH),x86_64)\nARCH_HEXCODE=8664\nelse ifeq ($(ARCH),aarch64)\nARCH_HEXCODE=aa64\nelse ifeq ($(ARCH),arm)\nARCH_HEXCODE=aa32\nelse ifeq ($(ARCH),mipsel)\nARCH_HEXCODE=1b0c\nendif\nPKG_SOURCE_VERSION:=$(ARCH_HEXCODE)\nPKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_SOURCE_DATE).tar.gz\nPKG_SOURCE_URL:=https://dl.istoreos.com/binary/ddnsto/\nPKG_HASH:=486aa15a5e026b5a3aca72f1850746e127a7e86ef11db8a7c498dad29545eaf6\n\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_SOURCE_DATE)\n\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n\tSECTION:=net\n\tCATEGORY:=Network\n\tSUBMENU:=Web Servers/Proxies\n\tTITLE:=DDNS.to - the reverse proxy\n\tDEPENDS:=\n\tPKGARCH:=all\n\tURL:=https://www.ddnsto.com/\nendef\n\ndefine Package/$(PKG_NAME)/description\n  DDNS.to is a reverse proxy\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/ddnsto\nendef\n\ndefine Package/$(PKG_NAME)/postinst\n#!/bin/sh\nif [ -z \"$${IPKG_INSTROOT}\" ]; then\n\t[ -f /etc/uci-defaults/ddnsto ] && /etc/uci-defaults/ddnsto && rm -f /etc/uci-defaults/ddnsto\n\texit 0\nfi\nendef\n\ndefine Build/Configure\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d $(1)/etc/uci-defaults\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/ddnsto.$(PKG_ARCH_DDNSTO) $(1)/usr/sbin/ddnstod\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/ddwebdav.$(PKG_ARCH_DDNSTO) $(1)/usr/sbin/ddwebdav\n\t$(INSTALL_CONF) ./files/ddnsto.config $(1)/etc/config/ddnsto\n\t$(INSTALL_BIN) ./files/ddnsto.init $(1)/etc/init.d/ddnsto\n\t$(INSTALL_BIN) ./files/ddnsto.uci-default $(1)/etc/uci-defaults/ddnsto\n\t$(LN) /usr/sbin/ddnstod $(1)/usr/sbin/ddnsto\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "relevance/nas-packages/network/services/ddnsto/files/ddnsto-monitor.sh",
    "content": "#!/bin/sh\n\nDEVICE_IDX=0\nLOG_LEVEL=2\nwhile getopts u:x:l: flag\ndo\n    case \"${flag}\" in\n        u) TOKEN=${OPTARG};;\n        x) DEVICE_IDX=${OPTARG};;\n        l) LOG_LEVEL=${OPTARG};;\n    esac\ndone\n\nif [ -z \"${TOKEN}\" ]; then\n  logger \"ddnsto: the token is empty, get token from https://www.ddnsto.com/ \"\n  exit 2\nfi\n\necho \"ddnsto version device_id is is:\"\n/usr/sbin/ddnsto -u ${TOKEN} -w\n\n_term() {\n  logger \"ddnsto: SIGTERM\"\n  killall ddnsto 2>/dev/null\n  killall ddwebdav 2>/dev/null\n\n  rm -f /tmp/.ddnsto.pid\n  rm -f /tmp/.ddnsto.status\n  rm -f /tmp/.ddnsto.up\n  exit\n}\n\ntrap \"_term;\" SIGTERM\n\nwhile true ; do\n  if ! pidof \"ddnsto\" > /dev/null ; then\n    logger \"ddnsto try running\"\n    /usr/sbin/ddnsto -u ${TOKEN} -x ${DEVICE_IDX} &\n    PID=$!\n    wait $PID\n    RET=$?\n    logger \"ddnsto EXIT CODE: ${RET}\"\n    if [ \"${RET}\" == \"100\" ]; then\n      logger \"ddnsto token error, please set a correct token from https://www.ddnsto.com/ \"\n      exit 100\n    fi\n  fi\n  sleep 20\ndone\n"
  },
  {
    "path": "relevance/nas-packages/network/services/ddnsto/files/ddnsto.config",
    "content": "config ddnsto\n\toption enabled '0'\n\toption feat_port '3033'\n\toption feat_enabled '0'\n\toption index '0'\n"
  },
  {
    "path": "relevance/nas-packages/network/services/ddnsto/files/ddnsto.init",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=99\nUSE_PROCD=1\n\nget_config() {\n        config_get_bool enabled $1 enabled 1\n        config_get_bool logger $1 logger 0\n        config_get token $1 token\n        config_get index $1 index 0\n        config_get_bool feat_enabled $1 feat_enabled 1\n}\n\nddnsto_prepare() {\n        killall ddnstod 2>/dev/null\n        killall ddwebdav 2>/dev/null\n}\n\nstop_service() {\n        ddnsto_prepare\n}\n\nstart_service() {\n        ddnsto_prepare\n        config_load ddnsto\n        config_foreach get_config ddnsto\n        if [ $enabled != 1 ]; then \n                return 1\n        fi \n\n        if [ -z \"$token\" ]; then\n                logger -t ddnsto -p warn \"token not set\"\n                return 1\n        fi\n        \n        procd_open_instance\n        procd_set_param command /usr/sbin/ddnstod -u \"$token\" -x $index -F\n        [ \"$logger\" == 1 ] && procd_set_param stderr 1\n        procd_set_param respawn\n        procd_close_instance \n}\n\nservice_triggers() {\n        procd_add_reload_trigger \"ddnsto\"\n}"
  },
  {
    "path": "relevance/nas-packages/network/services/ddnsto/files/ddnsto.uci-default",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@ddnsto[-1]\n\tadd ucitrack ddnsto\n\tset ucitrack.@ddnsto[-1].init=ddnsto\n\tcommit ucitrack\nEOF\n\n/etc/init.d/ddnsto enable\n\nexit 0"
  },
  {
    "path": "relevance/nas-packages/network/services/fastnet/Makefile",
    "content": "#\n# Copyright (C) 2015-2016 OpenWrt.org\n#\n# This is free software, licensed under the GNU General Public License v3.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_ARCH_FASTNET:=$(ARCH)\n\nPKG_NAME:=fastnet\n# use PKG_SOURCE_DATE instead of PKG_VERSION for compatible\nPKG_SOURCE_DATE:=0.7.2\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_SOURCE_DATE).tar.gz\nPKG_SOURCE_URL:=http://dl.istoreos.com/binary/fastnet/\nPKG_HASH:=aa8c0a3aa6885536d0ab9efc25df4191de78e3d0bc1077607874f64100d82f98\n\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_SOURCE_DATE)\n\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n\tSECTION:=net\n\tCATEGORY:=Network\n\tSUBMENU:=Web Servers/Proxies\n\tTITLE:=FastNet - network test Web UI\n\tDEPENDS:=@(arm||x86_64||aarch64)\n\tPKGARCH:=all\nendef\n\ndefine Package/$(PKG_NAME)/description\n  FastNet provides network testing tools and a Web UI.\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/fastnet\nendef\n\ndefine Package/$(PKG_NAME)/postinst\n#!/bin/sh\nif [ -z \"$${IPKG_INSTROOT}\" ]; then\n\t[ -f /etc/uci-defaults/fastnet ] && /etc/uci-defaults/fastnet && rm -f /etc/uci-defaults/fastnet\n\texit 0\nfi\nendef\n\ndefine Build/Configure\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d $(1)/etc/uci-defaults\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/fastnet.$(PKG_ARCH_FASTNET) $(1)/usr/sbin/fastnet\n\t$(INSTALL_CONF) ./files/fastnet.config $(1)/etc/config/fastnet\n\t$(INSTALL_BIN) ./files/fastnet.init $(1)/etc/init.d/fastnet\n\t$(INSTALL_BIN) ./files/fastnet.uci-default $(1)/etc/uci-defaults/fastnet\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "relevance/nas-packages/network/services/fastnet/files/fastnet.config",
    "content": "config fastnet\n\toption enabled '1'\n\toption host '0.0.0.0'\n\toption port '3200'\n\toption token ''\n\toption logger '0'\n"
  },
  {
    "path": "relevance/nas-packages/network/services/fastnet/files/fastnet.init",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=99\nUSE_PROCD=1\n\nget_config() {\n\tconfig_get_bool enabled \"$1\" enabled 1\n\tconfig_get host \"$1\" host \"0.0.0.0\"\n\tconfig_get port \"$1\" port 3200\n\tconfig_get token \"$1\" token \"\"\n\tconfig_get_bool logger \"$1\" logger 0\n}\n\nstart_service() {\n\tconfig_load fastnet\n\tconfig_foreach get_config fastnet\n\t[ \"$enabled\" != 1 ] && return 1\n\n\taddr=\"${host}:${port}\"\n\n\tprocd_open_instance\n\tprocd_set_param limits nofile=\"65535 65535\"\n\tprocd_set_param command /usr/sbin/fastnet web --addr \"$addr\" --no-open\n\t[ -n \"$token\" ] && procd_append_param command --token \"$token\"\n\t[ \"$logger\" = 1 ] && procd_set_param stderr 1\n\tprocd_set_param respawn\n\tprocd_close_instance\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"fastnet\"\n}\n"
  },
  {
    "path": "relevance/nas-packages/network/services/fastnet/files/fastnet.uci-default",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF_UCI >/dev/null\n\tdelete ucitrack.@fastnet[-1]\n\tadd ucitrack fastnet\n\tset ucitrack.@fastnet[-1].init=fastnet\n\tcommit ucitrack\n\n\tdelete firewall.fastnet\n\tset firewall.fastnet=rule\n\tset firewall.fastnet.name=\"fastnet\"\n\tset firewall.fastnet.target=\"ACCEPT\"\n\tset firewall.fastnet.src=\"wan\"\n\tset firewall.fastnet.proto=\"tcp\"\n\tset firewall.fastnet.dest_port=\"3200\"\n\tcommit firewall\nEOF_UCI\n\n/etc/init.d/fastnet enable\n/etc/init.d/fastnet start\n\nexit 0\n"
  },
  {
    "path": "relevance/nas-packages/network/services/floatip/Makefile",
    "content": "#\n# Copyright (C) 2024 jjm2473 <jjm2473@gmail.com>\n#\n# This is free software, licensed under the MIT License.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=floatip\nPKG_VERSION:=1.1.0\nPKG_RELEASE:=1\nPKG_MAINTAINER:=jjm2473 <jjm2473@gmail.com>\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n\tSECTION:=net\n\tCATEGORY:=Network\n\tSUBMENU:=IP Addresses and Names\n\tTITLE:=Float IP\n\tDEPENDS:=+curl\n\tPKGARCH:=all\nendef\n\ndefine Package/$(PKG_NAME)/description\n\tAuto setup an IP if some host down\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/floatip\nendef\n\ndefine Build/Configure\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/usr/libexec $(1)/etc/init.d $(1)/etc/config $(1)/etc/uci-defaults\n\t$(INSTALL_BIN) ./files/floatip.sh $(1)/usr/libexec/floatip.sh\n\t$(INSTALL_BIN) ./files/floatip.init $(1)/etc/init.d/floatip\n\t$(INSTALL_CONF) ./files/floatip.config $(1)/etc/config/floatip\n\t$(INSTALL_BIN) ./files/floatip.uci-default $(1)/etc/uci-defaults/floatip\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "relevance/nas-packages/network/services/floatip/files/floatip.config",
    "content": "config floatip 'main'\n# 启动时，enabled != 1 ，或者原 lan 口配置网段不包括 set_ip，清除自身的 set_ip，然后退出进程。\n    option enabled '0'\n# fallback 表示后备\n    option role 'fallback'\n#    option role 'main'\n# 对于 fallback 节点，检查到 check_ip 都不在线超过一定时间（例如30秒），就设置自身的 set_ip，然后检查 check_ip 中任一 IP 在线就清除自身的 set_ip，重复上述流程。\n# 对于 main 节点，启动后不断检查 set_ip 和 check_url，直到 set_ip 不在线且 check_url 没有失败，就设置自身的 set_ip 并允许 LAN 口 ping，否则清除自身的 set_ip 并禁止 LAN 口 ping，重复上述流程。\n# set_ip 可以不提供前缀长度，将会按 lan 口配置的网段的长度\n    option set_ip '192.168.100.3/24'\n#    option set_ip '192.168.100.3'\n# check_ip 仅 fallback 有效，并且检查时只检查跟 set_ip 同一网段的\n    list check_ip '192.168.100.2'\n#    list check_ip '192.168.100.4'\n# check_url 仅 main 有效\n#    list check_url 'https://www.google.com/generate_204'\n#    option check_url_timeout '5'\n"
  },
  {
    "path": "relevance/nas-packages/network/services/floatip/files/floatip.init",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=98\nUSE_PROCD=1\n\nenable_lan_ping() {\n\tuci -q set firewall.floatip_lan_offline.enabled=0 || return 0\n\tuci changes | grep -Fq 'firewall.floatip_lan_offline.enabled' || return 0\n\tuci commit firewall\n\t/etc/init.d/firewall reload\n}\n\nstart_service() {\n\tconfig_load floatip\n\tconfig_get_bool enabled \"main\" enabled 0\n\t/usr/libexec/floatip.sh down\n\t[[ \"$enabled\" = 1 ]] || {\n\t\tenable_lan_ping\n\t\treturn 0\n\t}\n\t[[ \"`uci -q get network.lan.proto`\" = \"static\" ]] || {\n\t\tlogger -s -t floatip \"LAN proto is not static\"\n\t\treturn 0\n\t}\n\tlocal lan_iface=\"`uci -q get network.lan.device`\"\n\tif [ -z \"$lan_iface\" ]; then\n\t\tlogger -s -t floatip \"Cannot get LAN device\"\n\t\treturn 0\n\tfi\n\tlocal set_ip set_prefix\n\tconfig_get set_ip \"main\" set_ip\n\t[[ -n \"$set_ip\" ]] || return 0\n\tif [[ \"$set_ip\" = \"*/*\" ]]; then\n\t\teval \"$(ipcalc.sh \"$set_ip\" )\";set_prefix=$PREFIX;set_ip=$IP\n\telse\n\t\tset_prefix=32\n\tfi\n\tlocal lan_ip=\"`uci -q get network.lan.ipaddr`\"\n\t[[ -n \"$lan_ip\" ]] || return 0\n\tlocal lan_net lan_prefix set_net ip\n\tlocal in_range=0\n\tlocal lan_netmask=\"`uci -q get network.lan.netmask`\"\n\tfor ip in $lan_ip; do\n\t\tif [[ \"$ip\" = \"*/*\" ]]; then\n\t\t\teval \"$(ipcalc.sh $ip )\";lan_net=$NETWORK;lan_prefix=$PREFIX\n\t\telse\n\t\t\t# prefix=32 if not present\n\t\t\t[[ -n \"$lan_netmask\" ]] || continue\n\t\t\teval \"$(ipcalc.sh $ip $lan_netmask )\";lan_net=$NETWORK;lan_prefix=$PREFIX\n\t\tfi\n\t\t[[ \"$set_prefix\" -ge \"$lan_prefix\" ]] || continue\n\t\teval \"$(ipcalc.sh $set_ip/$lan_prefix )\";set_net=$NETWORK\n\t\t[[ \"$set_net\" = \"$lan_net\" ]] && {\n\t\t\t[[ \"$set_prefix\" = 32 ]] && set_prefix=$lan_prefix\n\t\t\tin_range=1\n\t\t\tbreak\n\t\t}\n\tdone\n\n\t[[ $in_range = 1 ]] || {\n\t\tlogger -s -t floatip \"float ip is not belong to any LAN subnets\"\n\t\treturn 0\n\t}\n\tprocd_open_instance\n\tprocd_set_param command /usr/libexec/floatip.sh up \"$lan_iface\" \"$set_prefix\"\n\tprocd_set_param stderr 1\n\tprocd_set_param file /etc/config/floatip\n\tprocd_close_instance\n}\n\nservice_stopped() {\n\t/usr/libexec/floatip.sh down\n\tenable_lan_ping\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"network\" \"floatip\"\n}\n"
  },
  {
    "path": "relevance/nas-packages/network/services/floatip/files/floatip.sh",
    "content": "#!/bin/sh\n\nLOCK_FILE=\"/var/lock/floatip_loop.lock\"\nLOCK_FILE_UPDOWN=\"/var/lock/floatip_updown.lock\"\n\nDEFAULT_PREFIX=24\n\n# random number 0-255\nrandom() {\n\tlocal num=$(dd if=/dev/urandom bs=1 count=1 2>/dev/null | hexdump -ve '1/1 \"%u\"')\n\tif [[ -z \"$num\" ]]; then\n\t\tnum=$(($(grep -om1 '[0-9][0-9]$' /proc/uptime) * 255 / 100))\n\tfi\n\techo ${num:-1}\n}\n\n# check host alive, timeout in 2 seconds\nhost_alive() {\n\tping -4 -c 2 -A -t 1 -W 1 -q \"$1\" >/dev/null\n\t# arping -f -q -b -c 2 -w 2 -i 1 -I $LAN_IFACE \"$1\"\n}\n\ntry_lock_updown() {\n\texec 201>\"$LOCK_FILE_UPDOWN\"\n\tflock -x 201 && return 0\n\treturn 1\n}\n\nunlock_updown() {\n\tflock -u 201\n}\n\nset_up() {\n\tlocal ipaddr=\"$1\"\n\ttry_lock_updown || return 1\n\techo \"set my floatip to $ipaddr\" >&2\n\tip addr add \"$ipaddr\" dev \"$LAN_IFACE\"\n\techo \"ip addr del \\\"$ipaddr\\\" dev \\\"$LAN_IFACE\\\"\" > /tmp/run/floatip_cleanup.sh\n\tunlock_updown\n\treturn 0\n}\n\nset_down() {\n\ttry_lock_updown || return 1\n\tif [ -f /tmp/run/floatip_cleanup.sh ]; then\n\t\tsh -c '. /tmp/run/floatip_cleanup.sh'\n\t\trm -f /tmp/run/floatip_cleanup.sh\n\tfi\n\tunlock_updown\n\treturn 0\n}\n\nset_lan_ping() {\n\tif [[ \"$1\" = 0 ]]; then\n\t\tif [[ \"x$(uci -q get firewall.floatip_lan_offline)\" = xrule ]]; then\n\t\t\tuci -q delete firewall.floatip_lan_offline.enabled\n\t\t\tuci changes | grep -Fq 'firewall.floatip_lan_offline.enabled' || return 0\n\t\telse\n\t\t\tuci -q batch <<-EOF >/dev/null\n\t\t\t\tset firewall.floatip_lan_offline=rule\n\t\t\t\tset firewall.floatip_lan_offline.name=FloatIP-LAN-Offline\n\t\t\t\tset firewall.floatip_lan_offline.src=lan\n\t\t\t\tset firewall.floatip_lan_offline.proto=icmp\n\t\t\t\tset firewall.floatip_lan_offline.icmp_type=echo-request\n\t\t\t\tset firewall.floatip_lan_offline.family=ipv4\n\t\t\t\tset firewall.floatip_lan_offline.target=DROP\n\t\t\tEOF\n\t\tfi\n\telse\n\t\tuci -q set firewall.floatip_lan_offline.enabled=0 || return 0\n\t\tuci changes | grep -Fq 'firewall.floatip_lan_offline.enabled' || return 0\n\tfi\n\tuci commit firewall\n\t/etc/init.d/firewall reload 2>&1\n}\n\nsafe_sleep() {\n\tlocal sec=\"$1\"\n\t[[ \"$sec\" -lt 1 ]] && sec=1\n\tsleep $sec\n}\n\n. /lib/functions.sh\n\nfallback_loop() {\n\tlocal set_ip check_ip set_net set_prefix\n\tconfig_get set_ip \"main\" set_ip\n\t[[ -n \"$set_ip\" ]] || return 1\n\t[[ \"$set_ip\" = \"*/*\" ]] || set_ip=\"$set_ip/$DEFAULT_PREFIX\"\n\teval \"$(ipcalc.sh \"$set_ip\" )\";set_net=$NETWORK;set_prefix=$PREFIX;set_ip=$IP\n\tlocal ipaddr=\"$set_ip/$set_prefix\"\n\techo \"ipaddr=$ipaddr\"\n\n\tlocal valid_check_ip cip\n\tconfig_get check_ip \"main\" check_ip\n\tfor cip in $check_ip; do\n\t\teval \"$(ipcalc.sh $cip/$set_prefix )\"\n\t\t[[ \"$NETWORK\" = \"$set_net\" ]] && valid_check_ip=\"$valid_check_ip $cip\"\n\tdone\n\tvalid_check_ip=\"$valid_check_ip \"\n\n\tlocal order_check_ip=\"$valid_check_ip\"\n\tlocal found_alive consume_time\n\tlocal dead_counter=0 floatip_up=0\n\twhile :; do\n\t\tfound_alive=0\n\t\tconsume_time=0\n\t\techo \"checking host(s) $order_check_ip alive\"\n\t\tfor cip in $order_check_ip; do\n\t\t\tif host_alive $cip; then\n\t\t\t\techo \"host $cip alive\"\n\t\t\t\tfound_alive=1\n\t\t\t\t# reorder to reduce check time\n\t\t\t\torder_check_ip=\" ${cip}${valid_check_ip// $cip / }\"\n\t\t\t\tbreak\n\t\t\tfi\n\t\t\tconsume_time=$(($consume_time + 2))\n\t\tdone\n\t\tif [[ $found_alive = 1 ]]; then\n\t\t\tif [[ $floatip_up = 1 ]]; then\n\t\t\t\techo \"set down floatip\" >&2\n\t\t\t\tset_down || exit 1\n\t\t\t\tfloatip_up=0\n\t\t\telse\n\t\t\t\tdead_counter=0\n\t\t\tfi\n\t\t\tsafe_sleep $((10 - $consume_time))\n\t\t\tcontinue\n\t\tfi\n\t\tif [[ $floatip_up = 1 ]]; then\n\t\t\tsafe_sleep $((5 - $consume_time))\n\t\t\tcontinue\n\t\tfi\n\t\tdead_counter=$(($dead_counter + 1))\n\t\tif [[ $dead_counter -lt 3 ]]; then\n\t\t\tsafe_sleep $((10 - $consume_time))\n\t\t\tcontinue\n\t\tfi\n\t\techo \"no host alive, set up floatip $ipaddr\" >&2\n\t\tset_up \"$ipaddr\" || exit 1\n\t\tfloatip_up=1\n\t\tsleep 5\n\tdone\n}\n\nmain_loop() {\n\tlocal set_ip set_prefix\n\tconfig_get set_ip \"main\" set_ip\n\t[[ -n \"$set_ip\" ]] || return 1\n\t[[ \"$set_ip\" = \"*/*\" ]] || set_ip=\"$set_ip/$DEFAULT_PREFIX\"\n\teval \"$(ipcalc.sh \"$set_ip\" )\";set_prefix=$PREFIX;set_ip=$IP\n\tlocal ipaddr=\"$set_ip/$set_prefix\"\n\techo \"ipaddr=$ipaddr\"\n\n\tlocal check_urls check_url_timeout\n\tconfig_get check_urls \"main\" check_url\n\tconfig_get check_url_timeout \"main\" check_url_timeout '5'\n\tlocal dead_counter=0 floatip_up=0 url_pass check_url curl_code consume_time found_alive\n\t# sleep 2-6s\n\tsleep $(( $(random) / 60 + 2))\n\twhile :; do\n\t\tconsume_time=0\n\t\tif [[ $floatip_up = 0 ]]; then\n\t\t\tfound_alive=0\n\t\t\techo \"checking host $set_ip alive\"\n\t\t\tif host_alive $set_ip; then\n\t\t\t\techo \"host $set_ip alive\"\n\t\t\t\tfound_alive=1\n\t\t\telse\n\t\t\t\tconsume_time=$(($consume_time + 2))\n\t\t\tfi\n\t\tfi\n\t\turl_pass=1\n\t\tfor check_url in $check_urls ; do\n\t\t\tcurl -L --fail --show-error --no-progress-meter -o /dev/null \\\n\t\t\t\t--connect-timeout \"$check_url_timeout\" --max-time \"$check_url_timeout\" \\\n\t\t\t\t-I \"$check_url\" 2>&1\n\t\t\tcurl_code=$?\n\t\t\t[[ $curl_code = 0 ]] && continue\n\t\t\t[[ $curl_code = 6 || $curl_code = 7 || $curl_code = 28 ]] && \\\n\t\t\t\tconsume_time=$(($consume_time + $check_url_timeout))\n\t\t\techo \"check_url $check_url fail, code $curl_code\"\n\t\t\turl_pass=0\n\t\t\tbreak\n\t\tdone\n\t\tif [[ $floatip_up = 0 ]]; then\n\t\t\tif [[ $url_pass = 1 ]]; then\n\t\t\t\t# notify fallback node to offline\n\t\t\t\tset_lan_ping\n\t\t\t\tif [[ $found_alive = 0 ]]; then\n\t\t\t\t\techo \"no host alive, and url passed, set up floatip $ipaddr\" >&2\n\t\t\t\t\tset_up \"$ipaddr\" || exit 1\n\t\t\t\t\tfloatip_up=1\n\t\t\t\tfi\n\t\t\telse\n\t\t\t\tset_lan_ping 0\n\t\t\tfi\n\t\t\tsafe_sleep $((5 - $consume_time))\n\t\t\tcontinue\n\t\telse\n\t\t\tif [[ $url_pass = 0 ]]; then\n\t\t\t\tdead_counter=$(($dead_counter + 1))\n\t\t\t\tif [[ $dead_counter -lt 3 ]]; then\n\t\t\t\t\tsafe_sleep $((5 - $consume_time))\n\t\t\t\t\tcontinue\n\t\t\t\tfi\n\t\t\t\techo \"set down floatip, and disable ping\" >&2\n\t\t\t\tset_down || exit 1\n\t\t\t\tset_lan_ping 0\n\t\t\t\tfloatip_up=0\n\t\t\tfi\n\t\t\tdead_counter=0\n\t\tfi\n\t\tsleep 20\n\tdone\n}\n\nmain() {\n\tlocal role\n\tconfig_load floatip\n\tconfig_get role \"main\" role\n\tif [[ \"$role\" = \"main\" ]]; then\n\t\tmain_loop\n\telif  [[ \"$role\" = \"fallback\" ]]; then\n\t\tfallback_loop\n\tfi\n}\n\nif [[ \"$1\" = \"down\" ]]; then\n\tset_down\n\texit 0\nfi\nshift\n\ntry_lock() {\n\texec 200>\"$LOCK_FILE\"\n\tflock -x 200 && return 0\n\treturn 1\n}\n\necho \"locking $LOCK_FILE\" >&2\ntry_lock || {\n\techo \"lock $LOCK_FILE failed, already running?\" >&2\n\texit 1\n}\necho \"lock $LOCK_FILE success\" >&2 \n\nLAN_IFACE=\"$1\"\n[ -n \"$LAN_IFACE\" ] || {\n\techo \"LAN_IFACE is not set\" >&2\n\texit 1\n}\nshift\n\nif [[ -n \"$1\" ]]; then\n\t[[ \"$1\" -ge 0 && \"$1\" -lt 32 ]] && DEFAULT_PREFIX=$1\nfi\n\nmain\n"
  },
  {
    "path": "relevance/nas-packages/network/services/floatip/files/floatip.uci-default",
    "content": "\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@floatip[-1]\n\tadd ucitrack floatip\n\tset ucitrack.@floatip[-1].init=floatip\n\tcommit ucitrack\nEOF\n\nuci -q batch <<-EOF >/dev/null\n\tdelete network.floatip\n\tcommit network\nEOF\n\n# don't change role if enabled\n[[ \"`uci -q get floatip.main.enabled`\" = \"1\" ]] && exit 0\n\n[[ \"`uci -q get network.lan.proto`\" = \"static\" && -n \"`uci -q get network.lan.gateway`\" ]] || exit 0\n\nuci -q batch <<-EOF >/dev/null\n\tset floatip.main.role=main\n\tcommit floatip\nEOF\n\nexit 0\n"
  },
  {
    "path": "relevance/nas-packages/network/services/istoreenhance/Makefile",
    "content": "#\n# Copyright (C) 2015-2016 OpenWrt.org\n# Copyright (C) 2020 jjm2473@gmail.com\n#\n# This is free software, licensed under the GNU General Public License v3.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_ARCH_ISTOREENHANCE:=$(ARCH)\n\nPKG_NAME:=istoreenhance\n# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable\nPKG_SOURCE_DATE:=0.7.5\nPKG_RELEASE:=1\nARCH_HEXCODE:=\nifeq ($(ARCH),x86_64)\nARCH_HEXCODE=8664\nelse ifeq ($(ARCH),aarch64)\nARCH_HEXCODE=aa64\nelse ifeq ($(ARCH),arm)\nARCH_HEXCODE=aa32\nelse ifeq ($(ARCH),mipsel)\nARCH_HEXCODE=1b0c\nendif\nPKG_SOURCE_VERSION:=$(ARCH_HEXCODE)\nPKG_SOURCE:=iStoreEnhance-binary-$(PKG_SOURCE_DATE).tar.gz\nPKG_SOURCE_URL:=http://dl.istoreos.com/binary/kspeeder/\nPKG_HASH:=11468101a3a65f96f7a19a28e20fedd81417807c990373c9d97ffbcb358c24c9\n\nPKG_BUILD_DIR:=$(BUILD_DIR)/iStoreEnhance-binary-$(PKG_SOURCE_DATE)\n\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n\tSECTION:=net\n\tCATEGORY:=Network\n\tSUBMENU:=Web Servers/Proxies\n\tTITLE:=iStoreEnhance - Fix some net issues for istore\n\tDEPENDS:=@(arm||x86_64||aarch64)\n\tPKGARCH:=all\n\tURL:=https://www.kspeeder.com/\nendef\n\ndefine Package/$(PKG_NAME)/description\n  Fix some net issues for istore\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/istoreenhance\nendef\n\ndefine Package/$(PKG_NAME)/postinst\n#!/bin/sh\nif [ -z \"$${IPKG_INSTROOT}\" ]; then\n\t[ -f /etc/uci-defaults/istoreenhance ] && /etc/uci-defaults/istoreenhance && rm -f /etc/uci-defaults/istoreenhance\n\texit 0\nfi\nendef\n\ndefine Build/Configure\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d $(1)/etc/uci-defaults\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/iStoreEnhance.$(PKG_ARCH_ISTOREENHANCE) $(1)/usr/sbin/iStoreEnhance\n\t$(INSTALL_CONF) ./files/istoreenhance.config $(1)/etc/config/istoreenhance\n\t$(INSTALL_BIN) ./files/istoreenhance.init $(1)/etc/init.d/istoreenhance\n\t$(INSTALL_BIN) ./files/istoreenhance.uci-default $(1)/etc/uci-defaults/istoreenhance\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "relevance/nas-packages/network/services/istoreenhance/files/istoreenhance.config",
    "content": "config istoreenhance\n  option enabled '0'\n  option port '5443'\n  option adminport '5003'\n"
  },
  {
    "path": "relevance/nas-packages/network/services/istoreenhance/files/istoreenhance.init",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=99\nUSE_PROCD=1\n\nwrite_mirrors_config() {\n    local filename=\"$1\"\n    cat > \"$filename\" << 'EOF'\nmirrors:\n  - url: \"https://docker.1ms.run\"\n  - url: \"https://docker.m.daocloud.io\"\n  - url: \"https://docker.m.ixdev.cn\"\n  - url: \"https://dockerproxy.net\"\n  - url: \"https://image.cloudlayer.icu\"\n  - url: \"https://docker.13140521.xyz\"\n  - url: \"https://docker.1panel.live\"\n  - url: \"https://docker.anye.in\"\n  - url: \"https://docker.amingg.com\"\n  - url: \"https://hub.rat.dev\"\nEOF\n}\n\nget_config() {\n\tconfig_get_bool enabled $1 enabled 0\n\tconfig_get port $1 port 5443\n\tconfig_get adminport $1 adminport 5003\n  config_get cache $1 cache\n}\n\nstart_service() {\n\tconfig_load istoreenhance\n\tconfig_foreach get_config istoreenhance\n\tif [ $enabled != 1 ]; then\n\t\tdisabled_mirrors\n\t\treturn 1\n\tfi\n\n  if [ -z $cache ]; then\n    return 2\n  fi\n\t\n\tif [ ! -f $cache/kspeeder.yml ]; then\n\t\tparent_dir=$(dirname \"$cache\")\n\t\t[ -d \"$parent_dir\" ] || mkdir \"$parent_dir\"\n\t\t[ -d \"$cache\" ] || mkdir \"$cache\"\n\t\twrite_mirrors_config $cache/kspeeder.yml\n\tfi\n\n\tprocd_open_instance\n\tprocd_set_param env KS_USER_MIRROR_CONFIG=$cache/kspeeder.yml\n\tprocd_set_param limits nofile=\"65535 65535\"\n\tprocd_set_param command /usr/sbin/iStoreEnhance\n\t[ -n \"$port\" ] && procd_append_param command --localAddr \":$port\" --adminAddr \":$adminport\" --cachePath $cache\n\tprocd_set_param respawn\n\tprocd_close_instance\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"istoreenhance\"\n}\n\ndisabled_mirrors() {\n\tlocal mirror=$(uci get dockerd.globals.registry_mirrors | grep -oE 'https://registry\\.linkease\\.net:[0-9]+')\n\t[ -n \"$mirror\" ] || return 0\n\tuci del_list \"dockerd.globals.registry_mirrors=$mirror\"\n\tuci commit dockerd\n\t/etc/init.d/dockerd reload\n}\n\nservice_stopped() {\n\tdisabled_mirrors\n}\n"
  },
  {
    "path": "relevance/nas-packages/network/services/istoreenhance/files/istoreenhance.uci-default",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@istoreenhance[-1]\n\tadd ucitrack istoreenhance\n\tset ucitrack.@istoreenhance[-1].init=istoreenhance\n\tcommit ucitrack\n\n\tdelete firewall.istoreenhance\nEOF\n\n/etc/init.d/istoreenhance enable\n#/etc/init.d/istoreenhance start\n\nexit 0\n"
  },
  {
    "path": "relevance/nas-packages/network/services/kai/Makefile",
    "content": "#\n# Copyright (C) 2015-2016 OpenWrt.org\n# Copyright (C) 2020 jjm2473@gmail.com\n#\n# This is free software, licensed under the GNU General Public License v3.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_ARCH_kai:=$(ARCH)\n\nPKG_NAME:=kai\nPKG_VERSION:=0.0.5\nPKG_RELEASE:=0\nPKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://github.com/linkease/istore-packages/releases/download/prebuilt/\nPKG_HASH:=3dc71380e223b433e27a8280ebd7f9c4166d4085f7146db04b7f970efd5576fd\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_VERSION)\n\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n\tSECTION:=net\n\tCATEGORY:=System\n\tSUBMENU:=\n\tTITLE:=KAI\n\tURL:=https://github.com/Carseason/openwrt-packages\nendef\n\ndefine Package/$(PKG_NAME)/description\n  KAI is a dashboard & user guide\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/kai\nendef\n\ndefine Build/Configure\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/init.d $(1)/etc/config\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/kai.$(PKG_ARCH_kai) $(1)/usr/sbin/kai_bin\n\t$(INSTALL_BIN) ./files/kai.init $(1)/etc/init.d/kai\n\t$(INSTALL_CONF) ./files/kai.config $(1)/etc/config/kai\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "relevance/nas-packages/network/services/kai/files/kai.config",
    "content": "config kai\n\toption 'enabled' '0'\n\toption 'data_dir' ''\n\toption 'port' '8197'\n"
  },
  {
    "path": "relevance/nas-packages/network/services/kai/files/kai.init",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=93\nUSE_PROCD=1\n\nget_config() {\n\tconfig_get_bool enabled $1 enabled 1\n\tconfig_get data_dir $1 data_dir \"\"\n\tconfig_get port $1 port \"8197\"\n}\n\nhttp_get() {\n\tlocal url=\"$1\"\n\tif command -v uclient-fetch >/dev/null 2>&1; then\n\t\tuclient-fetch -O /dev/stdout \"$url\" 2>/dev/null\n\t\treturn $?\n\tfi\n\tif command -v wget >/dev/null 2>&1; then\n\t\twget -qO- \"$url\" 2>/dev/null\n\t\treturn $?\n\tfi\n\tif command -v curl >/dev/null 2>&1; then\n\t\tcurl -fsL \"$url\" 2>/dev/null\n\t\treturn $?\n\tfi\n\treturn 1\n}\n\nmaybe_refresh_opencode_skills_cache() {\n\t[ -n \"$data_dir\" ] || return 0\n\t[ -n \"$port\" ] || return 0\n\tcommand -v jsonfilter >/dev/null 2>&1 || return 0\n\n\tlocal cache_root=\"${data_dir}/cache/opencode/skills\"\n\tlocal state_root=\"${data_dir}/state/opencode\"\n\tlocal version_file=\"${state_root}/skills.manifest.version\"\n\tlocal managed_file=\"${state_root}/skills.managed.list\"\n\tlocal manifest_url=\"http://127.0.0.1:${port}/agentconf/skills/manifest.json\"\n\n\t[ -d \"$cache_root\" ] || mkdir -p \"$cache_root\"\n\t[ -d \"$state_root\" ] || mkdir -p \"$state_root\"\n\n\tlocal manifest version prev_version skills\n\tmanifest=\"$(http_get \"$manifest_url\")\" || return 0\n\tversion=\"$(printf '%s' \"$manifest\" | jsonfilter -e '@.version' 2>/dev/null)\"\n\t[ -n \"$version\" ] || return 0\n\n\tprev_version=\"\"\n\t[ -f \"$version_file\" ] && prev_version=\"$(cat \"$version_file\" 2>/dev/null)\"\n\t[ \"$version\" = \"$prev_version\" ] && return 0\n\n\tlogger -t kai \"opencode skills manifest changed; refreshing managed skill cache\"\n\n\tif [ -f \"$managed_file\" ]; then\n\t\twhile IFS= read -r s; do\n\t\t\t[ -n \"$s\" ] || continue\n\t\t\trm -rf \"${cache_root}/${s}\"\n\t\tdone <\"$managed_file\"\n\tfi\n\n\tskills=\"$(printf '%s' \"$manifest\" | jsonfilter -e '@.skills[*]' 2>/dev/null)\"\n\tif [ -n \"$skills\" ]; then\n\t\tprintf '%s\\n' \"$skills\" >\"$managed_file\"\n\t\tprintf '%s\\n' \"$skills\" | while IFS= read -r s; do\n\t\t\t[ -n \"$s\" ] || continue\n\t\t\trm -rf \"${cache_root}/${s}\"\n\t\tdone\n\telse\n\t\t: >\"$managed_file\"\n\tfi\n\n\tprintf '%s\\n' \"$version\" >\"$version_file\"\n\treturn 0\n}\n\nstart_kai_bin(){\n\tprocd_open_instance kai_bin\n\tprocd_set_param command /usr/sbin/kai_bin -a 0.0.0.0 -p \"$port\"\n\tprocd_set_param stderr 1\n\tprocd_set_param respawn\n\tprocd_close_instance\n}\nmkdir_cwd(){\n\t[ -d \"$1\" ] || mkdir -p \"$1\"\n}\nstart_kai_session(){\n\tprocd_open_instance kai_session\n\tlocal root=\"${data_dir}\"\n\tlocal cwd=\"${data_dir}/cwd\"\n\tprocd_set_param env \\\n\t\tOPENCODE_CWD=\"${cwd}\" \\\n\t\tOPENCODE_CONFIG=\"http://127.0.0.1:${port}/agentconf/opencode.json\" \\\n\t\tXDG_CACHE_HOME=\"${root}/cache\" \\\n\t\tXDG_DATA_HOME=\"${root}/data\" \\\n\t\tXDG_CONFIG_HOME=\"${root}/config\" \\\n\t\tXDG_STATE_HOME=\"${root}/state\"\n\tprocd_set_param command  /usr/sbin/kai_session\n\tprocd_append_param command serve --port \"8196\"  --hostname \"127.0.0.1\"\n\tprocd_set_param stderr 1\n\tprocd_set_param respawn\n\tprocd_close_instance\n}\nstart_service() { \n\tconfig_load kai\n\tconfig_foreach get_config kai\n\tif [ $enabled != 1 ]; then \n        return 1\n    fi \n\tif [ -z \"${data_dir}\" ]; then\n\t\tlogger -t kai \"data_dir is empty; please set option data_dir in /etc/config/kai\"\n\t\treturn 1\n\tfi\n\tlogger -t kai \"Starting KAI Service\"\n\tstart_kai_bin\n\tsleep 1\n\tmkdir_cwd \"${data_dir}\"\n\tmkdir_cwd \"${data_dir}/cwd\"\n\tmkdir_cwd \"${data_dir}/cache\"\n\tmkdir_cwd \"${data_dir}/data\"\n\tmkdir_cwd \"${data_dir}/config\"\n\tmkdir_cwd \"${data_dir}/state\"\n\tmaybe_refresh_opencode_skills_cache\n\tstart_kai_session\n\tlogger -t kai \"Starting KAI Service Completed\"\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"kai\"\n}\n"
  },
  {
    "path": "relevance/nas-packages/network/services/kai_session/Makefile",
    "content": "#\n# Copyright (C) 2015-2016 OpenWrt.org\n# Copyright (C) 2020 jjm2473@gmail.com\n#\n# This is free software, licensed under the GNU General Public License v3.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_ARCH_kai_session:=$(ARCH)\n\nPKG_NAME:=kai_session\nPKG_VERSION:=0.0.5\nPKG_RELEASE:=0\nPKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://github.com/linkease/istore-packages/releases/download/prebuilt/\nPKG_HASH:=51006dd937ebf2a5e9bb1ffb7ee722e9aefe130bf9bc732f9d53b24265454cb2\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_VERSION)\n\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\n\nRSTRIP:=:\nSTRIP:=:\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n\tSECTION:=net\n\tCATEGORY:=System\n\tSUBMENU:=\n\tTITLE:=KAI_SESSION\n\tDEPENDS:=+libstdcpp\n\tURL:=https://github.com/Carseason/openwrt-packages\nendef\n\ndefine Package/$(PKG_NAME)/description\n  KAI\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\nendef\n\ndefine Package/$(PKG_NAME)/postinst\nendef\n\ndefine Build/Configure\nendef\n\ndefine Build/Compile\n\t$(STAGING_DIR_HOST)/bin/patchelf --remove-needed libc.musl-x86_64.so.1 --remove-needed libc.musl-aarch64.so.1 $(PKG_BUILD_DIR)/kai_session.$(PKG_ARCH_kai_session)\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/usr/sbin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/kai_session.$(PKG_ARCH_kai_session) $(1)/usr/sbin/kai_session\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "relevance/nas-packages/network/services/linkease/Makefile",
    "content": "#\n# Copyright (C) 2015-2016 OpenWrt.org\n# Copyright (C) 2020 jjm2473@gmail.com\n#\n# This is free software, licensed under the GNU General Public License v3.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_ARCH_LINKEASE:=$(ARCH)\n\nPKG_NAME:=linkease\n# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable\nPKG_SOURCE_DATE:=1.7.5\nPKG_RELEASE:=4\nARCH_HEXCODE:=\nifeq ($(ARCH),x86_64)\nARCH_HEXCODE=8664\nelse ifeq ($(ARCH),aarch64)\nARCH_HEXCODE=aa64\nelse ifeq ($(ARCH),arm)\nARCH_HEXCODE=aa32\nelse ifeq ($(ARCH),mipsel)\nARCH_HEXCODE=1b0c\nendif\nPKG_SOURCE_VERSION:=$(ARCH_HEXCODE)\nPKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_SOURCE_DATE).tar.gz\nPKG_SOURCE_URL:=http://dl.istoreos.com/binary/LinkEase/LinuxStorage/\nPKG_HASH:=f3ae319974d940f5741cd9fbd295a3a378164e7df82665defa99935608fe733a\n\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_SOURCE_DATE)\n\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n\tSECTION:=net\n\tCATEGORY:=Network\n\tSUBMENU:=Web Servers/Proxies\n\tTITLE:=LinkEase - the file cloud\n\tDEPENDS:=@(arm||x86_64||aarch64) +linkmount\n\tPKGARCH:=all\n\tURL:=https://www.linkease.com/\nendef\n\ndefine Package/$(PKG_NAME)/description\n  LinkEase is a file cloud\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/linkease\nendef\n\ndefine Package/$(PKG_NAME)/postinst\n#!/bin/sh\nif [ -z \"$${IPKG_INSTROOT}\" ]; then\n\t[ -f /etc/uci-defaults/linkease ] && /etc/uci-defaults/linkease && rm -f /etc/uci-defaults/linkease\n\texit 0\nfi\nendef\n\ndefine Build/Configure\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/usr/sbin/linkease-plugins $(1)/etc/config $(1)/etc/init.d $(1)/etc/uci-defaults\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/linkease.$(PKG_ARCH_LINKEASE) $(1)/usr/sbin/linkease\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/heif-converter.$(PKG_ARCH_LINKEASE) $(1)/usr/sbin/heif-converter\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/linkease-media.$(PKG_ARCH_LINKEASE) $(1)/usr/sbin/linkease-media\n\t$(INSTALL_BIN) ./files/linkease-config.sh $(1)/usr/sbin/linkease-config.sh\n\t$(INSTALL_CONF) ./files/linkease.config $(1)/etc/config/linkease\n\t$(INSTALL_BIN) ./files/linkease.init $(1)/etc/init.d/linkease\n\t$(INSTALL_BIN) ./files/linkease.uci-default $(1)/etc/uci-defaults/linkease\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "relevance/nas-packages/network/services/linkease/files/aria2.sh",
    "content": "#!/bin/bash\n\nsh_ver=\"1.0.0\"\nexport PATH=/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/sbin:/bin\naria2_conf_dir=/var/etc/aria2/\n#替换成你设备aria2.conf路径\naria2_conf=${aria2_conf_dir}/aria2.conf.main\n#替换成你设备的aria2c路径\naria2c=/usr/bin/aria2c\nGreen_font_prefix=\"\\033[32m\"\nRed_font_prefix=\"\\033[31m\"\nGreen_background_prefix=\"\\033[42;37m\"\nRed_background_prefix=\"\\033[41;37m\"\nFont_color_suffix=\"\\033[0m\"\nInfo=\"[${Green_font_prefix}信息${Font_color_suffix}]\"\nError=\"[${Red_font_prefix}错误${Font_color_suffix}]\"\nTip=\"[${Green_font_prefix}注意${Font_color_suffix}]\"\nerror_code=11\nsuccess_code=0\n\nreturn_error(){\n\techo 'Content-Type:application/json;charset=utf-8'\n\techo\n\techo \"{\n    \t\t\"\\\"success\\\"\":$error_code, \n\t\t\"\\\"error\\\"\":\"\\\"$1\\\"\",    \t\t\n\t\t\"\\\"result\"\\\":null\n\t\t}\"\n\texit 1\n}\nreturn_ok(){\n\techo 'Content-Type:application/json;charset=utf-8'\n\techo\n\techo \"{\n    \t\t\"\\\"success\\\"\":$success_code, \n\t\t\"\\\"error\\\"\":\"\\\"$1\\\"\",    \t\t\n\t\t\"\\\"result\"\\\":null\n\t\t}\"\n\texit 0\n}\nreturn_result(){\n\techo 'Content-Type:application/json;charset=utf-8'\n\techo\n\techo \"{\n    \t\t\"\\\"success\\\"\":$success_code, \n\t\t\"\\\"error\\\"\":\"\\\"\\\"\",    \t\t\n\t\t\"\\\"result\"\\\":$1\n\t\t}\"\n\texit 0\n}\n\n#进程中是否运行aria2\ncheck_pid() {\n    PID=$(ps -ef | grep \"aria2c\" | grep -v grep | grep -v \"aria2.sh\" | grep -v \"init.d\" | grep -v \"service\" | awk '{print $2}')\n}\n\n#aria2是否正在运行\naria2_work_status(){\n\tcheck_pid\n#\t[[ ! -z ${PID} ]] && echo -e \"${Error} Aria2 正在运行，请检查 !\" && exit 1\n\t[[ ! -z ${PID} ]] && return_ok \"Aria2正在运行\"\n\treturn_error \"Aria2未运行\"\n}\n\n#检测设备是否安装aria2\ncheck_installed_status() {\n    [[ ! -e ${aria2c} ]] && return_error \"Aria2 没有安装，请检查 !\"\n    [[ ! -e ${aria2_conf} ]] && return_error \"Aria2 配置文件不存在，请检查 !\"\n#    return_ok \"Aria2已安装\"\n}\n#读取aria2配置信息\nread_config() {\n    check_installed_status\n    if [[ ! -e ${aria2_conf} ]]; then\n            return_error \"Aria2 配置文件不存在，请检查 !\"      \n    else\n        conf_text=$(cat ${aria2_conf} | grep -v '#')\n        aria2_dir=$(echo -e \"${conf_text}\" | grep \"^dir=\" | awk -F \"=\" '{print $NF}')\n        aria2_port=$(echo -e \"${conf_text}\" | grep \"^rpc-listen-port=\" | awk -F \"=\" '{print $NF}')\n        aria2_passwd=$(echo -e \"${conf_text}\" | grep \"^rpc-secret=\" | awk -F \"=\" '{print $NF}')\n        aria2_bt_port=$(echo -e \"${conf_text}\" | grep \"^listen-port=\" | awk -F \"=\" '{print $NF}')\n        aria2_dht_port=$(echo -e \"${conf_text}\" | grep \"^dht-listen-port=\" | awk -F \"=\" '{print $NF}')   \n\n\treturn_result \"{\n\t\t\t\"\\\"dir\"\\\":\"\\\"$aria2_dir\"\\\",\n\t\t\t\"\\\"rpc-listen-port\"\\\":\"\\\"$aria2_port\"\\\",\n\t\t\t\"\\\"rpc-secret\"\\\":\"\\\"$aria2_passwd\"\\\",\n\t\t\t\"\\\"listen-port\"\\\":\"\\\"$aria2_bt_port\"\\\",\n\t\t\t\"\\\"dht-listen-port\"\\\":\"\\\"$aria2_dht_port\"\\\"}\"\n    fi\n}\n\n\n#\"Content-Type:text/html;charset=utf-8\"\n#echo\n \n#SERVER_SOFTWARE = $SERVER_SOFTWARE #服务器软件\n#SERVER_NAME = $SERVER_NAME         #服务器主机名\n#GATEWAY_INTERFACE = $GATEWAY_INTERFACE    #CGI版本\n#SERVER_PROTOCOL = $SERVER_PROTOCOL  #通信使用的协议\n#SERVER_PORT = $SERVER_PORT         #服务器的端口号\n#REQUEST_METHOD = $REQUEST_METHOD   #请求方法(GET/POST/PUT/DELETE..)\n#HTTP_ACCEPT = $HTTP_ACCEPT         #HTTP定义的浏览器能够接受的数据类型\n#SCRIPT_NAME = $SCRIPT_NAME         #当前运行的脚本名称(包含路径)\n#QUERY_STRING = $QUERY_STRING       #地址栏中传的数据（get方式）\n#REMOTE_ADDR = $REMOTE_ADDR         #客户端的ip\n\n#根据url QUERY调不同方法\nquery(){\n\taria2Query=${QUERY_STRING}\n\tparse(){\n\t \techo $1 | sed 's/.*'$2'=\\([[:alnum:]]*\\).*/\\1/'\n\t}\n\tvalue=$(parse $aria2Query \"action\")\n\t\t\t\n\tif [ ! -z = \"$value\" ]\n\t\tthen\n\t\t\tif [ \"$value\" = \"status\" ]\n\t\t\tthen\n\t\t\t    check_installed_status\n\t\t\telif [ \"$value\" = \"readConfig\" ]\n\t\t\tthen\n\t\t\t    read_config\n\t\t\telif [ \"$value\" = \"workStatus\" ]\n\t\t\tthen\n\t\t\t    aria2_work_status\n\t\t\telse\n\t\t\t    echo \n\t\t\tfi\n\t\telse\n\t    return_error \"action不能为空\"\n\tfi\n}\nquery\n"
  },
  {
    "path": "relevance/nas-packages/network/services/linkease/files/linkease-config.sh",
    "content": "#!/bin/sh\n\nsource /lib/functions.sh\n\ncase \"$1\" in\n  save)\n    if [ ! -z \"$2\" ]; then\n      uci set \"linkease.@linkease[0].preconfig=$2\"\n      uci commit\n    fi\n    ;;\n\n  load)\n    if [ -f \"/usr/sbin/preconfig.data\" ]; then\n      data=\"`cat /usr/sbin/preconfig.data`\"\n      uci set \"linkease.@linkease[0].preconfig=${data}\"\n      uci commit\n      rm /usr/sbin/preconfig.data\n    else\n      data=\"`uci -q get linkease.@linkease[0].preconfig`\"\n    fi\n\n    if [ -z \"${data}\" ]; then\n      echo \"nil\"\n    else\n      echo \"${data}\"\n    fi\n\n    ;;\n\n  local_save)\n    if [ ! -z \"$2\" ]; then\n      uci set \"linkease.@linkease[0].local_home=$2\"\n      uci commit\n      ROOT_DIR=\"$2\"\n      if [ -f \"/etc/config/quickstart\" ]; then\n        config_load quickstart\n        config_get MAIN_DIR main main_dir \"\"\n        config_get CONF_DIR main conf_dir \"\"\n        config_get PUB_DIR main pub_dir \"\"\n        config_get DL_DIR main dl_dir \"\"\n        config_get TMP_DIR main tmp_dir \"\"\n        # echo \"$MAIN_DIR $CONF_DIR $PUB_DIR $DL_DIR $TMP_DIR\"\n        if [ \"$ROOT_DIR\" = \"$MAIN_DIR\" ]; then\n          exit 0\n        fi\n        uci set \"quickstart.main.main_dir=$ROOT_DIR\"\n        if [ -z \"$CONF_DIR\" -o \"$CONF_DIR\" = \"$MAIN_DIR/Configs\" ]; then\n          uci set \"quickstart.main.conf_dir=$ROOT_DIR/Configs\"\n        fi\n        if [ -z \"$PUB_DIR\" -o \"$PUB_DIR\" = \"$MAIN_DIR/Public\" ]; then\n          uci set \"quickstart.main.pub_dir=$ROOT_DIR/Public\"\n        fi\n        if [ -z \"$DL_DIR\" -o \"$DL_DIR\" = \"$MAIN_DIR/Public/Downloads\" ]; then\n          uci set \"quickstart.main.dl_dir=$ROOT_DIR/Public/Downloads\"\n        fi\n        if [ -z \"$TMP_DIR\" -o \"$TMP_DIR\" = \"$MAIN_DIR/Caches\" ]; then\n          uci set \"quickstart.main.tmp_dir=$ROOT_DIR/Caches\"\n        fi\n        uci commit\n      fi\n    fi\n    ;;\n\n  local_load)\n    if [ -f \"/etc/config/quickstart\" ]; then\n      data=\"`uci -q get quickstart.main.main_dir`\"\n    fi\n    if [ -z \"$data\" ]; then\n      data=\"`uci -q get linkease.@linkease[0].local_home`\"\n    fi\n\n    if [ -z \"${data}\" ]; then\n      echo \"nil\"\n    else\n      echo \"${data}\"\n    fi\n\n    ;;\n\n  status)\n    echo \"TODO\"\n    ;;\n\n  *)\n    echo \"Usage: $0 {save|load|status}\"\n    exit 1\nesac\n\n"
  },
  {
    "path": "relevance/nas-packages/network/services/linkease/files/linkease.config",
    "content": "config linkease\n\toption port '8897'\n\toption enabled '1'\n"
  },
  {
    "path": "relevance/nas-packages/network/services/linkease/files/linkease.init",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=99\nUSE_PROCD=1\n\nget_config() {\n\tconfig_get_bool enabled $1 enabled 1\n\tconfig_get_bool logger $1 logger\n  config_get_bool allowPublic $1 allowPublic\n\tconfig_get port $1 port 8897\n}\n\nstart_service() {\n\tconfig_load linkease\n\tconfig_foreach get_config linkease\n\t[ $enabled != 1 ] && return 1\n\n\tprocd_open_instance\n\tprocd_set_param limits nofile=\"65535 65535\"\n\tprocd_set_param command /usr/sbin/linkease\n\t[ -n \"$port\" ] && procd_append_param command --deviceAddr \":$port\" --localApi /var/run/linkease.sock\n  [ \"$allowPublic\" == 1 ] && procd_append_param command --allowPublic\n\t[ \"$logger\" == 1 ] && procd_set_param stderr 1\n\tprocd_set_param respawn\n\tprocd_close_instance\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"linkease\"\n}\n"
  },
  {
    "path": "relevance/nas-packages/network/services/linkease/files/linkease.uci-default",
    "content": "#!/bin/sh\n\nuci -q batch <<-EOF >/dev/null\n\tdelete ucitrack.@linkease[-1]\n\tadd ucitrack linkease\n\tset ucitrack.@linkease[-1].init=linkease\n\tcommit ucitrack\n\n\tdelete firewall.linkease\n\tset firewall.linkease=rule\n\tset firewall.linkease.name=\"linkease\"\n\tset firewall.linkease.target=\"ACCEPT\"\n\tset firewall.linkease.src=\"wan\"\n\tset firewall.linkease.proto=\"tcp\"\n\tset firewall.linkease.dest_port=\"8897\"\n\tcommit firewall\nEOF\n\n/etc/init.d/linkease enable\n/etc/init.d/linkease start\n\nexit 0"
  },
  {
    "path": "relevance/nas-packages/network/services/linkmount/Makefile",
    "content": "#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_ARCH_LINKEASE:=$(ARCH)\n\nPKG_NAME:=linkmount\n# use PKG_SOURCE_DATE instead of PKG_VERSION for compitable\nPKG_SOURCE_DATE:=1.0.3\nPKG_RELEASE:=3\nARCH_HEXCODE:=\nifeq ($(ARCH),x86_64)\nARCH_HEXCODE=8664\nelse ifeq ($(ARCH),aarch64)\nARCH_HEXCODE=aa64\nelse ifeq ($(ARCH),arm)\nARCH_HEXCODE=aa32\nelse ifeq ($(ARCH),mipsel)\nARCH_HEXCODE=1b0c\nendif\nPKG_SOURCE_VERSION:=$(ARCH_HEXCODE)\nPKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_SOURCE_DATE).tar.gz\nPKG_SOURCE_URL:=https://dl.istoreos.com/binary/LinkEase/AutoUpgrade/linkmount/\nPKG_HASH:=b8a5b99751cdd3dd84ac75c94e3cff5b898f910c86f12b4c7ec74dc8b3c510cb\n\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_SOURCE_DATE)\n\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n\tSECTION:=net\n\tCATEGORY:=Network\n\tSUBMENU:=Web Servers/Proxies\n\tTITLE:=LinkMount - the file cloud\n\tDEPENDS:=@(arm||x86_64||aarch64)\n\tPKGARCH:=all\n\tURL:=https://www.linkease.com/\nendef\n\ndefine Package/$(PKG_NAME)/description\n  LinkMount is used by LinkEase\nendef\n\ndefine Build/Configure\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/usr/sbin/linkmount\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/$(PKG_ARCH_LINKEASE)/bin/linkmount_bin $(1)/usr/sbin/linkmount/linkmount_bin\n\t$(CP) $(PKG_BUILD_DIR)/$(PKG_ARCH_LINKEASE)/bin/lib $(1)/usr/sbin/linkmount/lib\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n\n"
  },
  {
    "path": "relevance/nas-packages/network/services/quickstart/Makefile",
    "content": "#\n# Copyright (C) 2015-2016 OpenWrt.org\n# Copyright (C) 2020 jjm2473@gmail.com\n#\n# This is free software, licensed under the GNU General Public License v3.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_ARCH_quickstart:=$(ARCH)\n\nPKG_NAME:=quickstart\nPKG_VERSION:=0.12.2\nPKG_RELEASE:=1\nPKG_SOURCE:=$(PKG_NAME)-binary-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://github.com/linkease/istore-packages/releases/download/prebuilt/\nPKG_HASH:=8850b60bf3baa476556622f3237e6329a5243689656e6100c2f72530967e6bde\n\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-binary-$(PKG_VERSION)\n\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n\tSECTION:=net\n\tCATEGORY:=Network\n\tSUBMENU:=Web Servers/Proxies\n\tTITLE:=Quickstart, the quick start.\n\tDEPENDS:=@(x86_64||aarch64||arm) +shadow-utils +shadow-useradd +mount-utils +block-mount +lsblk +e2fsprogs +parted \\\n\t\t+smartmontools +smartd +smartmontools-drivedb +mdadm +ip-full +ubus +uci +bash\n\tURL:=https://easepi.linkease.com/\nendef\n\ndefine Package/$(PKG_NAME)/description\n  Quickstart is a dashboard & user guide\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/quickstart\nendef\n\ndefine Package/$(PKG_NAME)/postinst\n#!/bin/sh\nif [ -z \"$${IPKG_INSTROOT}\" ]; then\n\tif [ -f /etc/uci-defaults/09-quickstart ]; then\n\t\tchmod 755 /etc/uci-defaults/09-quickstart\n\t\t/etc/uci-defaults/09-quickstart && rm -f /etc/uci-defaults/09-quickstart\n\tfi\n\texit 0\nfi\nendef\n\ndefine Build/Configure\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/init.d $(1)/etc/uci-defaults $(1)/etc/hotplug.d/block $(1)/etc/config $(1)/usr/libexec/quickstart\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/quickstart.$(PKG_ARCH_quickstart) $(1)/usr/sbin/quickstart\n\t$(INSTALL_BIN) ./files/quickstart.init $(1)/etc/init.d/quickstart\n\t$(INSTALL_BIN) ./files/quickstart.uci-default $(1)/etc/uci-defaults/09-quickstart\n\t$(INSTALL_BIN) ./files/quickstart.hotplug $(1)/etc/hotplug.d/block/09-quickstart\n\t$(INSTALL_CONF) ./files/quickstart.config $(1)/etc/config/quickstart\n\t$(INSTALL_BIN) ./files/dhcpvalid.sh $(1)/usr/libexec/quickstart/dhcpvalid.sh\n\t$(INSTALL_BIN) ./files/startdhns.init $(1)/etc/init.d/startdhns\n\t$(LN) /usr/sbin/quickstart $(1)/usr/sbin/startdhns\n\t$(INSTALL_DIR) $(1)/etc/hotplug.d/iface\n\t$(INSTALL_BIN) ./files/startdhns.hotplug $(1)/etc/hotplug.d/iface/21-startdhns\n\t$(INSTALL_DIR) $(1)/usr/share/quickstart\n\t$(INSTALL_DATA) ./files/manuf $(1)/usr/share/quickstart/manuf\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "relevance/nas-packages/network/services/quickstart/files/dhcpvalid.sh",
    "content": "#!/bin/sh\n\n/usr/sbin/quickstart dhcpValid\n\n"
  },
  {
    "path": "relevance/nas-packages/network/services/quickstart/files/manuf",
    "content": "00:00:00\t\tXerox Corporation\n00:00:01\t\tXerox Corporation\n00:00:02\t\tXerox Corporation\n00:00:03\t\tXerox Corporation\n00:00:04\t\tXerox Corporation\n00:00:05\t\tXerox Corporation\n00:00:06\t\tXerox Corporation\n00:00:07\t\tXerox Corporation\n00:00:08\t\tXerox Corporation\n00:00:09\t\tXerox Corporation\n00:00:0A\t\tOmron Tateisi Electronics Co.\n00:00:0B\t\tMatrix Corporation\n00:00:0C\t\tCisco Systems, Inc\n00:00:0D\t\tFibronics Ltd.\n00:00:0E\t\tFujitsu Limited\n00:00:0F\t\tNext, Inc.\n00:00:10\t\tSytek Inc.\n00:00:11\t\tNormerel Systemes\n00:00:12\t\tInformation Technology Limited\n00:00:13\t\tCamex\n00:00:14\t\tNetronix\n00:00:15\t\tDatapoint Corporation\n00:00:16\t\tDu Pont Pixel Systems     .\n00:00:17\t\tOracle\n00:00:18\t\tWebster Computer Corporation\n00:00:19\t\tApplied Dynamics International\n00:00:1A\t\tAdvanced Micro Devices\n00:00:1B\t\tNovell, Inc.\n00:00:1C\t\tBell Technologies\n00:00:1D\t\tCabletron Systems, Inc.\n00:00:1E\t\tTelsist Industria Electronica\n00:00:1F\t\tTelco Systems, Inc.\n00:00:20\t\tDataindustrier Diab Ab\n00:00:21\t\tSureman Comp. & Commun. Corp.\n00:00:22\t\tVisual Technology Inc.\n00:00:23\t\tAbb Industrial Systems Ab\n00:00:24\t\tConnect As\n00:00:25\t\tRamtek Corp.\n00:00:26\t\tSha-Ken Co., Ltd.\n00:00:27\t\tJapan Radio Company\n00:00:28\t\tProdigy Systems Corporation\n00:00:29\t\tImc Networks Corp.\n00:00:2A\t\tTrw - Sedd/Inp\n00:00:2B\t\tCrisp Automation, Inc\n00:00:2C\t\tAutotote Limited\n00:00:2D\t\tChromatics Inc\n00:00:2E\t\tSociete Evira\n00:00:2F\t\tTimeplex Inc.\n00:00:30\t\tVg Laboratory Systems Ltd\n00:00:31\t\tQpsx Communications, Ltd.\n00:00:32\t\tMarconi plc\n00:00:33\t\tEgan Machinery Company\n00:00:34\t\tNetwork Resources Corporation\n00:00:35\t\tSpectragraphics Corporation\n00:00:36\t\tAtari Corporation\n00:00:37\t\tOxford Metrics Limited\n00:00:38\t\tCss Labs\n00:00:39\t\tToshiba Corporation\n00:00:3A\t\tChyron Corporation\n00:00:3B\t\ti Controls, Inc.\n00:00:3C\t\tAuspex Systems Inc.\n00:00:3D\t\tUnisys\n00:00:3E\t\tSimpact\n00:00:3F\t\tSyntrex, Inc.\n00:00:40\t\tApplicon, Inc.\n00:00:41\t\tIce Corporation\n00:00:42\t\tMetier Management Systems Ltd.\n00:00:43\t\tMicro Technology\n00:00:44\t\tCastelle Corporation\n00:00:45\t\tFord Aerospace & Comm. Corp.\n00:00:46\t\tOlivetti North America\n00:00:47\t\tNicolet Instruments Corp.\n00:00:48\t\tSeiko Epson Corporation\n00:00:49\t\tApricot Computers, Ltd\n00:00:4A\t\tAdc Codenoll Technology Corp.\n00:00:4B\t\tIcl Data Oy\n00:00:4C\t\tNEC Corporation\n00:00:4D\t\tDci Corporation\n00:00:4E\t\tAmpex Corporation\n00:00:4F\t\tLogicraft, Inc.\n00:00:50\t\tRadisys Corporation\n00:00:51\t\tHob Electronic Gmbh & Co. Kg\n00:00:52\t\tIntrusion.com, Inc.\n00:00:53\t\tCompucorp\n00:00:54\t\tSchneider Electric\n00:00:55\t\tCommissariat A L`Energie Atom.\n00:00:56\t\tDr. B. Struck\n00:00:57\t\tScitex Corporation Ltd.\n00:00:58\t\tRacore Computer Products Inc.\n00:00:59\t\tHellige GMBH\n00:00:5A\t\tSysKonnect GmbH\n00:00:5B\t\tEltec Elektronik Ag\n00:00:5C\t\tTelematics International Inc.\n00:00:5D\t\tCs Telecom\n00:00:5E\t\tICANN, IANA Department\n00:00:5F\t\tSumitomo Electric Industries, Ltd\n00:00:60\t\tKontron Europe GmbH\n00:00:61\t\tGateway Communications\n00:00:62\t\tBull Hn Information Systems\n00:00:63\t\tBarco Control Rooms Gmbh\n00:00:64\t\tYokogawa Digital Computer Corporation\n00:00:65\t\tNetwork General Corporation\n00:00:66\t\tTalaris Systems, Inc.\n00:00:67\t\tSoft * Rite, Inc.\n00:00:68\t\tRosemount Controls\n00:00:69\t\tConcord Communications Inc\n00:00:6A\t\tComputer Consoles Inc.\n00:00:6B\t\tSilicon Graphics\n00:00:6C\t\tSchneider Electric\n00:00:6D\t\tCray Communications, Ltd.\n00:00:6E\t\tArtisoft Inc.\n00:00:6F\t\tMadge Ltd.\n00:00:70\t\tHcl Limited\n00:00:71\t\tAdra Systems Inc.\n00:00:72\t\tMiniware Technology\n00:00:73\t\tSiecor Corporation\n00:00:74\t\tRicoh Company Ltd.\n00:00:75\t\tNortel Networks\n00:00:76\t\tAbekas Video System\n00:00:77\t\tInterphase Corporation\n00:00:78\t\tLabtam Limited\n00:00:79\t\tNetworth Incorporated\n00:00:7A\t\tDana Computer Inc.\n00:00:7B\t\tResearch Machines\n00:00:7C\t\tAmpere Incorporated\n00:00:7D\t\tOracle Corporation\n00:00:7E\t\tClustrix Corporation\n00:00:7F\t\tLinotype-Hell Ag\n00:00:80\t\tCray Communications A/S\n00:00:81\t\tBay Networks\n00:00:82\t\tLectra Systemes Sa\n00:00:83\t\tTadpole Technology Plc\n00:00:84\t\tSupernet\n00:00:85\t\tCanon Inc.\n00:00:86\t\tMegahertz Corporation\n00:00:87\t\tHitachi, Ltd.\n00:00:88\t\tBrocade Communications Systems LLC\n00:00:89\t\tCayman Systems Inc.\n00:00:8A\t\tDatahouse Information Systems\n00:00:8B\t\tInfotron\n00:00:8C\t\tAlloy Computer Products (Australia) Pty Ltd\n00:00:8D\t\tCryptek Inc.\n00:00:8E\t\tSolbourne Computer, Inc.\n00:00:8F\t\tRaytheon\n00:00:90\t\tMicrocom\n00:00:91\t\tAnritsu Corporation\n00:00:92\t\tCogent Data Technologies\n00:00:93\t\tProteon Inc.\n00:00:94\t\tAsante Technologies\n00:00:95\t\tSony Tektronix Corp.\n00:00:96\t\tMarconi Electronics Ltd.\n00:00:97\t\tDell EMC\n00:00:98\t\tCrosscomm Corporation\n00:00:99\t\tMtx, Inc.\n00:00:9A\t\tRc Computer A/S\n00:00:9B\t\tInformation International, Inc\n00:00:9C\t\tRolm Mil-Spec Computers\n00:00:9D\t\tLocus Computing Corporation\n00:00:9E\t\tMarli S.A.\n00:00:9F\t\tAmeristar Technologies Inc.\n00:00:A0\t\tSANYO Electric Co., Ltd.\n00:00:A1\t\tMarquette Electric Co.\n00:00:A2\t\tBay Networks\n00:00:A3\t\tNetwork Application Technology\n00:00:A4\t\tAcorn Computers Limited\n00:00:A5\t\tTattile SRL\n00:00:A6\t\tNetwork General Corporation\n00:00:A7\t\tNetwork Computing Devices Inc.\n00:00:A8\t\tStratus Technologies\n00:00:A9\t\tNetwork Systems Corp.\n00:00:AA\t\tXerox Corporation\n00:00:AB\t\tLogic Modeling Corporation\n00:00:AC\t\tConware Computer Consulting\n00:00:AD\t\tBruker Instruments Inc.\n00:00:AE\t\tDassault Electronique\n00:00:AF\t\tCanberra Industries, Inc.\n00:00:B0\t\tRnd-Rad Network Devices\n00:00:B1\t\tAlpha Micro\n00:00:B2\t\tTelevideo Systems, Inc.\n00:00:B3\t\tCimlinc Incorporated\n00:00:B4\t\tEdimax Technology Co. Ltd.\n00:00:B5\t\tDatability Software Sys. Inc.\n00:00:B6\t\tMicro-Matic Research\n00:00:B7\t\tDove Computer Corporation\n00:00:B8\t\tSeikosha Co., Ltd.\n00:00:B9\t\tMcdonnell Douglas Computer Sys\n00:00:BA\t\tSiig, Inc.\n00:00:BB\t\tTri-Data\n00:00:BC\t\tRockwell Automation\n00:00:BD\t\tRYOSEI, Ltd.\n00:00:BE\t\tThe Nti Group\n00:00:BF\t\tSymmetric Computer Systems\n00:00:C0\t\tWestern Digital Corporation\n00:00:C1\t\tMadge Ltd.\n00:00:C2\t\tInformation Presentation Tech.\n00:00:C3\t\tHarris Corporation\n00:00:C4\t\tWaters Div. Of Millipore\n00:00:C5\t\tCommscope\n00:00:C6\t\tEon Systems\n00:00:C7\t\tArix Corporation\n00:00:C8\t\tAltos Computer Systems\n00:00:C9\t\tEmulex Corporation\n00:00:CA\t\tCommscope\n00:00:CB\t\tCompu-Shack Electronic Gmbh\n00:00:CC\t\tDensan Co., Ltd.\n00:00:CD\t\tAllied Telesis Labs Ltd\n00:00:CE\t\tMegadata Corp.\n00:00:CF\t\tHayes Microcomputer Products\n00:00:D0\t\tDevelcon Electronics Ltd.\n00:00:D1\t\tAdaptec Incorporated\n00:00:D2\t\tSbe, Inc.\n00:00:D3\t\tWang Laboratories Inc.\n00:00:D4\t\tPure Data Ltd.\n00:00:D5\t\tMicrognosis International\n00:00:D6\t\tPunch Line Holding\n00:00:D7\t\tDartmouth College\n00:00:D8\t\tNovell, Inc.\n00:00:D9\t\tNippon Telegraph & Telephone\n00:00:DA\t\tAtex\n00:00:DB\t\tBritish Telecommunications plc\n00:00:DC\t\tHayes Microcomputer Products\n00:00:DD\t\tTcl Incorporated\n00:00:DE\t\tCetia\n00:00:DF\t\tBell & Howell Pub Sys Div\n00:00:E0\t\tQuadram Corp.\n00:00:E1\t\tGrid Systems\n00:00:E2\t\tAcer Technologies Corp.\n00:00:E3\t\tIntegrated Micro Products Ltd\n00:00:E4\t\tIn2 Groupe Intertechnique\n00:00:E5\t\tSigmex Ltd.\n00:00:E6\t\tAptor Produits De Comm Indust\n00:00:E7\t\tStar Gate Technologies\n00:00:E8\t\tAccton Technology Corp.\n00:00:E9\t\tIsicad, Inc.\n00:00:EA\t\tUpnod Ab\n00:00:EB\t\tMatsushita Comm. Ind. Co. Ltd.\n00:00:EC\t\tMicroprocess\n00:00:ED\t\tApril\n00:00:EE\t\tNetwork Designers, Ltd.\n00:00:EF\t\tKti\n00:00:F0\t\tSamsung Electronics Co.,Ltd\n00:00:F1\t\tMagna Computer Corporation\n00:00:F2\t\tSpider Communications\n00:00:F3\t\tGandalf Data Limited\n00:00:F4\t\tAllied Telesis, Inc.\n00:00:F5\t\tDiamond Sales Limited\n00:00:F6\t\tApplied Microsystems Corp.\n00:00:F7\t\tYouth Keep Enterprise Co Ltd\n00:00:F8\t\tDigital Equipment Corporation\n00:00:F9\t\tQuotron Systems Inc.\n00:00:FA\t\tMicrosage Computer Systems Inc\n00:00:FB\t\tRechner Zur Kommunikation\n00:00:FC\t\tMeiko\n00:00:FD\t\tHigh Level Hardware\n00:00:FE\t\tAnnapolis Micro Systems, Inc.\n00:00:FF\t\tCamtec Electronics Ltd.\n00:01:00\t\tEquip'Trans\n00:01:01\t\tPrivate\n00:01:02\t\t3Com\n00:01:03\t\t3Com\n00:01:04\t\tDVICO Co., Ltd.\n00:01:05\t\tBeckhoff Automation GmbH\n00:01:06\t\tTews Datentechnik GmbH\n00:01:07\t\tLeiser GmbH\n00:01:08\t\tAVLAB Technology, Inc.\n00:01:09\t\tNagano Japan Radio Co., Ltd.\n00:01:0A\t\tCis Technology Inc.\n00:01:0B\t\tSpace CyberLink, Inc.\n00:01:0C\t\tSystem Talks Inc.\n00:01:0D\t\tTeledyne DALSA Inc.\n00:01:0E\t\tBri-Link Technologies Co., Ltd\n00:01:0F\t\tBrocade Communications Systems LLC\n00:01:10\t\tGotham Networks\n00:01:11\t\tiDigm Inc.\n00:01:12\t\tShark Multimedia Inc.\n00:01:13\t\tOlympus Corporation\n00:01:14\t\tKanda Tsushin Kogyo Co., Ltd.\n00:01:15\t\tExtratech Corporation\n00:01:16\t\tNetspect Technologies, Inc.\n00:01:17\t\tCanal +\n00:01:18\t\tEZ Digital Co., Ltd.\n00:01:19\t\tRTUnet (Australia)\n00:01:1A\t\tHoffmann und Burmeister GbR\n00:01:1B\t\tUnizone Technologies, Inc.\n00:01:1C\t\tUniversal Talkware Corporation\n00:01:1D\t\tCentillium Communications\n00:01:1E\t\tPrecidia Technologies, Inc.\n00:01:1F\t\tRC Networks, Inc.\n00:01:20\t\tOscilloquartz S.A.\n00:01:21\t\tWatchGuard Technologies, Inc.\n00:01:22\t\tTrend Communications, Ltd.\n00:01:23\t\tSchneider Electric Japan Holdings Ltd.\n00:01:24\t\tAcer Incorporated\n00:01:25\t\tYaesu Musen Co., Ltd.\n00:01:26\t\tPAC Labs\n00:01:27\t\tOPEN Networks Pty Ltd\n00:01:28\t\tEnjoyWeb, Inc.\n00:01:29\t\tDFI Inc.\n00:01:2A\t\tTelematica Sistems Inteligente\n00:01:2B\t\tTELENET Co., Ltd.\n00:01:2C\t\tAravox Technologies, Inc.\n00:01:2D\t\tKomodo Technology\n00:01:2E\t\tPC Partner Ltd.\n00:01:2F\t\tTwinhead International Corp\n00:01:30\t\tExtreme Networks Headquarters\n00:01:31\t\tBosch Security Systems, Inc.\n00:01:32\t\tDranetz - BMI\n00:01:33\t\tKYOWA Electronic Instruments C\n00:01:34\t\tSelectron Systems AG\n00:01:35\t\tKDC Corp.\n00:01:36\t\tCyberTAN Technology Inc.\n00:01:37\t\tIT Farm Corporation\n00:01:38\t\tXAVi Technologies Corp.\n00:01:39\t\tPoint Multimedia Systems\n00:01:3A\t\tShelcad Communications, Ltd.\n00:01:3B\t\tBna Systems\n00:01:3C\t\tTiw Systems\n00:01:3D\t\tRiscStation Ltd.\n00:01:3E\t\tAscom Tateco AB\n00:01:3F\t\tNeighbor World Co., Ltd.\n00:01:40\t\tSendtek Corporation\n00:01:41\t\tCable Print\n00:01:42\t\tCisco Systems, Inc\n00:01:43\t\tCisco Systems, Inc\n00:01:44\t\tDell EMC\n00:01:45\t\tWinsystems, Inc.\n00:01:46\t\tTesco Controls, Inc.\n00:01:47\t\tZhone Technologies, Inc.\n00:01:48\t\tX-traWeb Inc.\n00:01:49\t\tTdt Ag\n00:01:4A\t\tSony Corporation\n00:01:4B\t\tEnnovate Networks, Inc.\n00:01:4C\t\tBerkeley Process Control\n00:01:4D\t\tShin Kin Enterprises Co., Ltd\n00:01:4E\t\tWIN Enterprises, Inc.\n00:01:4F\t\tAdtran Inc\n00:01:50\t\tGilat Communications, Ltd.\n00:01:51\t\tEnsemble Communications\n00:01:52\t\tChromatek Inc.\n00:01:53\t\tArchtek Telecom Corporation\n00:01:54\t\tG3M Corporation\n00:01:55\t\tPromise Technology, Inc.\n00:01:56\t\tFirewiredirect.Com, Inc.\n00:01:57\t\tSyswave Co., Ltd\n00:01:58\t\tElectro Industries/Gauge Tech\n00:01:59\t\tS1 Corporation\n00:01:5A\t\tDigital Video Broadcasting\n00:01:5B\t\tITALTEL S.p.A/RF-UP-I\n00:01:5C\t\tCadant Inc.\n00:01:5D\t\tOracle Corporation\n00:01:5E\t\tBest Technology Co., Ltd.\n00:01:5F\t\tDIGITAL DESIGN GmbH\n00:01:60\t\tELMEX Co., LTD.\n00:01:61\t\tMeta Machine Technology\n00:01:62\t\tCygnet Technologies, Inc.\n00:01:63\t\tCisco Systems, Inc\n00:01:64\t\tCisco Systems, Inc\n00:01:65\t\tAirSwitch Corporation\n00:01:66\t\tTc Group A/S\n00:01:67\t\tHioki E.E. Corporation\n00:01:68\t\tVitana Corporation\n00:01:69\t\tCelestix Networks Pte Ltd.\n00:01:6A\t\tAlitec\n00:01:6B\t\tLightChip, Inc.\n00:01:6C\t\tFoxconn\n00:01:6D\t\tCarrierComm Inc.\n00:01:6E\t\tConklin Corporation\n00:01:6F\t\tInkel Corp.\n00:01:70\t\tESE Embedded System Engineer'g\n00:01:71\t\tAllied Data Technologies\n00:01:72\t\tTechnoLand Co., LTD.\n00:01:73\t\tAmcc\n00:01:74\t\tCyberOptics Corporation\n00:01:75\t\tRadiant Communications Corp.\n00:01:76\t\tOrient Silver Enterprises\n00:01:77\t\tEdsl\n00:01:78\t\tMARGI Systems, Inc.\n00:01:79\t\tWireless Technology, Inc.\n00:01:7A\t\tChengdu Maipu Electric Industrial Co., Ltd.\n00:01:7B\t\tHeidelberger Druckmaschinen AG\n00:01:7C\t\tAG-E GmbH\n00:01:7D\t\tThermoQuest\n00:01:7E\t\tADTEK System Science Co., Ltd.\n00:01:7F\t\tExperience Music Project\n00:01:80\t\tAOpen, Inc.\n00:01:81\t\tNortel Networks\n00:01:82\t\tDica Technologies Ag\n00:01:83\t\tAnite Telecoms\n00:01:84\t\tSieb & Meyer Ag\n00:01:85\t\tHitachi Aloka Medical, Ltd.\n00:01:86\t\tUwe Disch\n00:01:87\t\tI2SE GmbH\n00:01:88\t\tLXCO Technologies ag\n00:01:89\t\tRefraction Technology, Inc.\n00:01:8A\t\tRoi Computer Ag\n00:01:8B\t\tNetLinks Co., Ltd.\n00:01:8C\t\tMega Vision\n00:01:8D\t\tAudeSi Technologies\n00:01:8E\t\tLogitec Corporation\n00:01:8F\t\tKenetec, Inc.\n00:01:90\t\tSmk-M\n00:01:91\t\tSYRED Data Systems\n00:01:92\t\tTexas Digital Systems\n00:01:93\t\tHanbyul Telecom Co., Ltd.\n00:01:94\t\tCapital Equipment Corporation\n00:01:95\t\tSena Technologies, Inc.\n00:01:96\t\tCisco Systems, Inc\n00:01:97\t\tCisco Systems, Inc\n00:01:98\t\tDarim Vision\n00:01:99\t\tHeiSei Electronics\n00:01:9A\t\tLEUNIG GmbH\n00:01:9B\t\tKyoto Microcomputer Co., Ltd.\n00:01:9C\t\tLumentum\n00:01:9D\t\tE-Control Systems, Inc.\n00:01:9E\t\tESS Technology, Inc.\n00:01:9F\t\tReadyNet\n00:01:A0\t\tInfinilink Corporation\n00:01:A1\t\tMag-Tek, Inc.\n00:01:A2\t\tLogical Co., Ltd.\n00:01:A3\t\tGenesys Logic, Inc.\n00:01:A4\t\tMicrolink Corporation\n00:01:A5\t\tNextcomm, Inc.\n00:01:A6\t\tScientific-Atlanta Arcodan A/S\n00:01:A7\t\tUnex Technology Corporation\n00:01:A8\t\tWelltech Computer Co., Ltd.\n00:01:A9\t\tBmw Ag\n00:01:AA\t\tAirspan Communications, Ltd.\n00:01:AB\t\tMain Street Networks\n00:01:AC\t\tSitara Networks, Inc.\n00:01:AD\t\tCoach Master International  d.b.a. CMI Worldwide, Inc.\n00:01:AE\t\tTrex Enterprises\n00:01:AF\t\tArtesyn Embedded Technologies\n00:01:B0\t\tFulltek Technology Co., Ltd.\n00:01:B1\t\tGeneral Bandwidth\n00:01:B2\t\tDigital Processing Systems, Inc.\n00:01:B3\t\tPrecision Electronic Manufacturing\n00:01:B4\t\tWayport, Inc.\n00:01:B5\t\tTurin Networks, Inc.\n00:01:B6\t\tSAEJIN T&M Co., Ltd.\n00:01:B7\t\tCentos, Inc.\n00:01:B8\t\tNetsensity, Inc.\n00:01:B9\t\tSKF (U.K.) Limited\n00:01:BA\t\tIC-Net, Inc.\n00:01:BB\t\tFrequentis\n00:01:BC\t\tBrains Corporation\n00:01:BD\t\tPeterson Electro-Musical Products, Inc.\n00:01:BE\t\tGigalink Co., Ltd.\n00:01:BF\t\tTeleforce Co., Ltd.\n00:01:C0\t\tCompuLab, Ltd.\n00:01:C1\t\tVitesse Semiconductor Corporation\n00:01:C2\t\tARK Research Corp.\n00:01:C3\t\tAcromag, Inc.\n00:01:C4\t\tNeoWave, Inc.\n00:01:C5\t\tSimpler Networks\n00:01:C6\t\tQuarry Technologies\n00:01:C7\t\tCisco Systems, Inc\n00:01:C8\t\tConrad Corp.\n00:01:C9\t\tCisco Systems, Inc\n00:01:CA\t\tGeocast Network Systems, Inc.\n00:01:CB\t\tEvr\n00:01:CC\t\tBrand Maker Enabler Inc.\n00:01:CD\t\tARtem\n00:01:CE\t\tCustom Micro Products, Ltd.\n00:01:CF\t\tAlpha Data Parallel Systems, Ltd.\n00:01:D0\t\tVitalPoint, Inc.\n00:01:D1\t\tCoNet Communications, Inc.\n00:01:D2\t\tinXtron, Inc.\n00:01:D3\t\tPAXCOMM, Inc.\n00:01:D4\t\tLeisure Time, Inc.\n00:01:D5\t\tHaedong Info & Comm Co., Ltd\n00:01:D6\t\tmanroland AG\n00:01:D7\t\tF5 Inc.\n00:01:D8\t\tTeltronics, Inc.\n00:01:D9\t\tSigma, Inc.\n00:01:DA\t\tWINCOMM Corporation\n00:01:DB\t\tFreecom Technologies GmbH\n00:01:DC\t\tActivetelco\n00:01:DD\t\tAvail Networks\n00:01:DE\t\tTrango Systems, Inc.\n00:01:DF\t\tISDN Communications, Ltd.\n00:01:E0\t\tFast Systems, Inc.\n00:01:E1\t\tKinpo Electronics, Inc.\n00:01:E2\t\tAndo Electric Corporation\n00:01:E3\t\tSiemens AG\n00:01:E4\t\tSitera, Inc.\n00:01:E5\t\tSupernet, Inc.\n00:01:E6\t\tHewlett Packard\n00:01:E7\t\tHewlett Packard\n00:01:E8\t\tForce10 Networks, Inc.\n00:01:E9\t\tLitton Marine Systems B.V.\n00:01:EA\t\tCirilium Corp.\n00:01:EB\t\tC-COM Corporation\n00:01:EC\t\tEricsson Group\n00:01:ED\t\tSETA Corp.\n00:01:EE\t\tComtrol Europe, Ltd.\n00:01:EF\t\tCamtel Technology Corp.\n00:01:F0\t\tTridium, Inc.\n00:01:F1\t\tInnovative Concepts, Inc.\n00:01:F2\t\tMark of the Unicorn, Inc.\n00:01:F3\t\tQPS, Inc.\n00:01:F4\t\tEnterasys\n00:01:F5\t\tErim S.A.\n00:01:F6\t\tAssociation of Musical Electronics Industry\n00:01:F7\t\tImage Display Systems, Inc.\n00:01:F8\t\tTexio Technology Corporation\n00:01:F9\t\tTeraGlobal Communications Corp.\n00:01:FA\t\tHoroscas\n00:01:FB\t\tDoTop Technology, Inc.\n00:01:FC\t\tKeyence Corporation\n00:01:FD\t\tDigital Voice Systems, Inc.\n00:01:FE\t\tDigital Equipment Corporation\n00:01:FF\t\tData Direct Networks, Inc.\n00:02:00\t\tNet & Sys Co., Ltd.\n00:02:01\t\tIFM Electronic gmbh\n00:02:02\t\tAmino Communications, Ltd.\n00:02:03\t\tWoonsang Telecom, Inc.\n00:02:04\t\tBodmann Industries Elektronik GmbH\n00:02:05\t\tHitachi Denshi, Ltd.\n00:02:06\t\tTelital R&D Denmark A/S\n00:02:07\t\tVisionGlobal Network Corp.\n00:02:08\t\tUnify Networks, Inc.\n00:02:09\t\tShenzhen SED Information Technology Co., Ltd.\n00:02:0A\t\tGefran Spa\n00:02:0B\t\tNative Networks, Inc.\n00:02:0C\t\tMetro-Optix\n00:02:0D\t\tMicronpc.com\n00:02:0E\t\tECI Telecom Ltd.\n00:02:0F\t\tAatr\n00:02:10\t\tFenecom\n00:02:11\t\tNature Worldwide Technology Corp.\n00:02:12\t\tSierraCom\n00:02:13\t\tS.D.E.L.\n00:02:14\t\tDtvro\n00:02:15\t\tCotas Computer Technology A/B\n00:02:16\t\tCisco Systems, Inc\n00:02:17\t\tCisco Systems, Inc\n00:02:18\t\tAdvanced Scientific Corp\n00:02:19\t\tParalon Technologies\n00:02:1A\t\tZuma Networks\n00:02:1B\t\tKollmorgen-Servotronix\n00:02:1C\t\tNetwork Elements, Inc.\n00:02:1D\t\tData General Communication Ltd.\n00:02:1E\t\tSimtel S.R.L.\n00:02:1F\t\tAculab PLC\n00:02:20\t\tCanon Finetech Inc.\n00:02:21\t\tDSP Application, Ltd.\n00:02:22\t\tChromisys, Inc.\n00:02:23\t\tClickTV\n00:02:24\t\tC-Cor\n00:02:25\t\tOne Stop Systems\n00:02:26\t\tXESystems, Inc.\n00:02:27\t\tESD Electronic System Design GmbH\n00:02:28\t\tNecsom, Ltd.\n00:02:29\t\tAdtec Corporation\n00:02:2A\t\tAsound Electronic\n00:02:2B\t\tSAXA, Inc.\n00:02:2C\t\tABB Bomem, Inc.\n00:02:2D\t\tAgere Systems\n00:02:2E\t\tTEAC Corp. R& D\n00:02:2F\t\tP-Cube, Ltd.\n00:02:30\t\tIntersoft Electronics\n00:02:31\t\tIngersoll-Rand\n00:02:32\t\tAvision, Inc.\n00:02:33\t\tMantra Communications, Inc.\n00:02:34\t\tImperial Technology, Inc.\n00:02:35\t\tParagon Networks International\n00:02:36\t\tINIT GmbH\n00:02:37\t\tCosmo Research Corp.\n00:02:38\t\tSerome Technology, Inc.\n00:02:39\t\tVisicom\n00:02:3A\t\tZSK Stickmaschinen GmbH\n00:02:3B\t\tEricsson\n00:02:3C\t\tCreative Technology, Ltd.\n00:02:3D\t\tCisco Systems, Inc\n00:02:3E\t\tSelta Telematica S.p.a\n00:02:3F\t\tCompal Electronics INC.\n00:02:40\t\tSeedek Co., Ltd.\n00:02:41\t\tAmer.com\n00:02:42\t\tVideoframe Systems\n00:02:43\t\tRaysis Co., Ltd.\n00:02:44\t\tSURECOM Technology Co.\n00:02:45\t\tLampus Co, Ltd.\n00:02:46\t\tAll-Win Tech Co., Ltd.\n00:02:47\t\tGreat Dragon Information Technology (Group) Co., Ltd.\n00:02:48\t\tPilz GmbH & Co.\n00:02:49\t\tAviv Infocom Co, Ltd.\n00:02:4A\t\tCisco Systems, Inc\n00:02:4B\t\tCisco Systems, Inc\n00:02:4C\t\tSiByte, Inc.\n00:02:4D\t\tMannesman Dematic Colby Pty. Ltd.\n00:02:4E\t\tDatacard Group\n00:02:4F\t\tIPM Datacom S.R.L.\n00:02:50\t\tGeyser Networks, Inc.\n00:02:51\t\tSoma Networks, Inc.\n00:02:52\t\tCarrier Corporation\n00:02:53\t\tTelevideo, Inc.\n00:02:54\t\tWorldGate\n00:02:55\t\tIBM Corp\n00:02:56\t\tAlpha Processor, Inc.\n00:02:57\t\tMicrocom Corp.\n00:02:58\t\tFlying Packets Communications\n00:02:59\t\tTsann Kuen China (Shanghai)Enterprise Co., Ltd. IT Group\n00:02:5A\t\tCatena Networks\n00:02:5B\t\tCambridge Silicon Radio\n00:02:5C\t\tSCI Systems (Kunshan) Co., Ltd.\n00:02:5D\t\tCalix Networks\n00:02:5E\t\tHigh Technology Ltd\n00:02:5F\t\tNortel Networks\n00:02:60\t\tAccordion Networks, Inc.\n00:02:61\t\tTilgin AB\n00:02:62\t\tSoyo Group Soyo Com Tech Co., Ltd\n00:02:63\t\tRPS S.p.A.\n00:02:64\t\tAudioRamp.com\n00:02:65\t\tVirditech Co. Ltd.\n00:02:66\t\tThermalogic Corporation\n00:02:67\t\tNode Runner, Inc.\n00:02:68\t\tHarris Government Communications\n00:02:69\t\tNadatel Co., Ltd\n00:02:6A\t\tCocess Telecom Co., Ltd.\n00:02:6B\t\tBCM Computers Co., Ltd.\n00:02:6C\t\tPhilips CFT\n00:02:6D\t\tAdept Telecom\n00:02:6E\t\tNeGeN Access, Inc.\n00:02:6F\t\tSenao International Co., Ltd.\n00:02:70\t\tCrewave Co., Ltd.\n00:02:71\t\tZhone Technologies, Inc.\n00:02:72\t\tCC&C Technologies, Inc.\n00:02:73\t\tCoriolis Networks\n00:02:74\t\tTommy Technologies Corp.\n00:02:75\t\tSMART Technologies, Inc.\n00:02:76\t\tPrimax Electronics Ltd.\n00:02:77\t\tCash Systemes Industrie\n00:02:78\t\tSamsung Electro Mechanics Co., Ltd.\n00:02:79\t\tControl Applications, Ltd.\n00:02:7A\t\tIOI Technology Corporation\n00:02:7B\t\tAmplify Net, Inc.\n00:02:7C\t\tTrilithic, Inc.\n00:02:7D\t\tCisco Systems, Inc\n00:02:7E\t\tCisco Systems, Inc\n00:02:7F\t\task-technologies.com\n00:02:80\t\tMu Net, Inc.\n00:02:81\t\tMadge Ltd.\n00:02:82\t\tViaClix, Inc.\n00:02:83\t\tSpectrum Controls, Inc.\n00:02:84\t\tUK Grid Solutions Limited\n00:02:85\t\tRiverstone Networks\n00:02:86\t\tOccam Networks\n00:02:87\t\tAdapcom\n00:02:88\t\tGlobal Village Communication\n00:02:89\t\tDNE Technologies\n00:02:8A\t\tAmbit Microsystems Corporation\n00:02:8B\t\tVDSL Systems OY\n00:02:8C\t\tMicrel-Synergy Semiconductor\n00:02:8D\t\tMovita Technologies, Inc.\n00:02:8E\t\tRapid 5 Networks, Inc.\n00:02:8F\t\tGlobetek, Inc.\n00:02:90\t\tWoorigisool, Inc.\n00:02:91\t\tOpen Network Co., Ltd.\n00:02:92\t\tLogic Innovations, Inc.\n00:02:93\t\tSolid Data Systems\n00:02:94\t\tTokyo Sokushin Co., Ltd.\n00:02:95\t\tMavenir Ipa Uk Ltd\n00:02:96\t\tLectron Co,. Ltd.\n00:02:97\t\tC-COR.net\n00:02:98\t\tBroadframe Corporation\n00:02:99\t\tApex, Inc.\n00:02:9A\t\tStorage Apps\n00:02:9B\t\tKreatel Communications AB\n00:02:9C\t\t3Com\n00:02:9D\t\tMerix Corp.\n00:02:9E\t\tInformation Equipment Co., Ltd.\n00:02:9F\t\tL-3 Communication Aviation Recorders\n00:02:A0\t\tFlatstack Ltd.\n00:02:A1\t\tWorld Wide Packets\n00:02:A2\t\tHilscher GmbH\n00:02:A3\t\tHitachi Energy Switzerland Ltd\n00:02:A4\t\tAddPac Technology Co., Ltd.\n00:02:A5\t\tHewlett Packard\n00:02:A6\t\tEffinet Systems Co., Ltd.\n00:02:A7\t\tVivace Networks\n00:02:A8\t\tAir Link Technology\n00:02:A9\t\tRACOM, s.r.o.\n00:02:AA\t\tPLcom Co., Ltd.\n00:02:AB\t\tCTC Union Technologies Co., Ltd.\n00:02:AC\t\t3PAR data\n00:02:AD\t\tHOYA Corporation\n00:02:AE\t\tScannex Electronics Ltd.\n00:02:AF\t\tTeleCruz Technology, Inc.\n00:02:B0\t\tHokubu Communication & Industrial Co., Ltd.\n00:02:B1\t\tAnritsu, Ltd.\n00:02:B2\t\tCablevision\n00:02:B3\t\tIntel Corporation\n00:02:B4\t\tDaphne\n00:02:B5\t\tAvnet, Inc.\n00:02:B6\t\tAcrosser Technology Co., Ltd.\n00:02:B7\t\tWatanabe Electric Industry Co., Ltd.\n00:02:B8\t\tWhi Konsult Ab\n00:02:B9\t\tCisco Systems, Inc\n00:02:BA\t\tCisco Systems, Inc\n00:02:BB\t\tContinuous Computing Corp\n00:02:BC\t\tLVL 7 Systems, Inc.\n00:02:BD\t\tBionet Co., Ltd.\n00:02:BE\t\tTotsu Engineering, Inc.\n00:02:BF\t\tdotRocket, Inc.\n00:02:C0\t\tBencent Tzeng Industry Co., Ltd.\n00:02:C1\t\tInnovative Electronic Designs, Inc.\n00:02:C2\t\tNet Vision Telecom\n00:02:C3\t\tArelnet Ltd.\n00:02:C4\t\tOPT Machine Vision Tech Co., Ltd\n00:02:C5\t\tEvertz Microsystems Ltd.\n00:02:C6\t\tData Track Technology PLC\n00:02:C7\t\tAlpsalpine Co,.Ltd\n00:02:C8\t\tTechnocom Communications Technology (pte) Ltd\n00:02:C9\t\tMellanox Technologies, Inc.\n00:02:CA\t\tEndPoints, Inc.\n00:02:CB\t\tTriState Ltd.\n00:02:CC\t\tM.C.C.I\n00:02:CD\t\tTeleDream, Inc.\n00:02:CE\t\tFoxJet, Inc.\n00:02:CF\t\tZyGate Communications, Inc.\n00:02:D0\t\tComdial Corporation\n00:02:D1\t\tVivotek, Inc.\n00:02:D2\t\tWorkstation AG\n00:02:D3\t\tNetBotz, Inc.\n00:02:D4\t\tPDA Peripherals, Inc.\n00:02:D5\t\tAcr\n00:02:D6\t\tNICE Systems\n00:02:D7\t\tEMPEG Ltd\n00:02:D8\t\tBRECIS Communications Corporation\n00:02:D9\t\tReliable Controls\n00:02:DA\t\tExiO Communications, Inc.\n00:02:DB\t\tNetsec\n00:02:DC\t\tFujitsu General Limited\n00:02:DD\t\tBromax Communications, Ltd.\n00:02:DE\t\tAstrodesign, Inc.\n00:02:DF\t\tNet Com Systems, Inc.\n00:02:E0\t\tETAS GmbH\n00:02:E1\t\tIntegrated Network Corporation\n00:02:E2\t\tNDC Infared Engineering\n00:02:E3\t\tLITE-ON Communications, Inc.\n00:02:E4\t\tJC HYUN Systems, Inc.\n00:02:E5\t\tTimeware Ltd.\n00:02:E6\t\tGould Instrument Systems, Inc.\n00:02:E7\t\tCAB GmbH & Co KG\n00:02:E8\t\tE.D.&A.\n00:02:E9\t\tCS Systemes De Securite - C3S\n00:02:EA\t\tFocus Enhancements\n00:02:EB\t\tPico Communications\n00:02:EC\t\tMaschoff Design Engineering\n00:02:ED\t\tDXO Telecom Co., Ltd.\n00:02:EE\t\tNokia Danmark A/S\n00:02:EF\t\tCCC Network Systems Group Ltd.\n00:02:F0\t\tAME Optimedia Technology Co., Ltd.\n00:02:F1\t\tPinetron Co., Ltd.\n00:02:F2\t\teDevice, Inc.\n00:02:F3\t\tMedia Serve Co., Ltd.\n00:02:F4\t\tPCTEL, Inc.\n00:02:F5\t\tVIVE Synergies, Inc.\n00:02:F6\t\tEquipe Communications\n00:02:F7\t\tArm\n00:02:F8\t\tSEAKR Engineering, Inc.\n00:02:F9\t\tMIMOS Berhad\n00:02:FA\t\tDX Antenna Co., Ltd.\n00:02:FB\t\tBaumuller Aulugen-Systemtechnik GmbH\n00:02:FC\t\tCisco Systems, Inc\n00:02:FD\t\tCisco Systems, Inc\n00:02:FE\t\tViditec, Inc.\n00:02:FF\t\tHandan BroadInfoCom\n00:03:00\t\tBarracuda Networks, Inc.\n00:03:01\t\tExfo\n00:03:02\t\tCharles Industries\n00:03:03\t\tJAMA Electronics Co., Ltd.\n00:03:04\t\tPacific Broadband Communications\n00:03:05\t\tMSC Vertriebs GmbH\n00:03:06\t\tFusion In Tech Co., Ltd.\n00:03:07\t\tSecure Works, Inc.\n00:03:08\t\tAM Communications, Inc.\n00:03:09\t\tTexcel Technology PLC\n00:03:0A\t\tArgus Technologies\n00:03:0B\t\tHunter Technology, Inc.\n00:03:0C\t\tTelesoft Technologies Ltd.\n00:03:0D\t\tUniwill Computer Corp.\n00:03:0E\t\tCore Communications Co., Ltd.\n00:03:0F\t\tDigital China (Shanghai) Networks Ltd.\n00:03:10\t\tE-Globaledge Corporation\n00:03:11\t\tMicro Technology Co., Ltd.\n00:03:12\t\tTRsystems GmbH\n00:03:13\t\tAccess Media SPA\n00:03:14\t\tTeleware Network Systems\n00:03:15\t\tCidco Incorporated\n00:03:16\t\tNobell Communications, Inc.\n00:03:17\t\tMerlin Systems, Inc.\n00:03:18\t\tCyras Systems, Inc.\n00:03:19\t\tInfineon AG\n00:03:1A\t\tBeijing Broad Telecom Ltd., China\n00:03:1B\t\tCellvision Systems, Inc.\n00:03:1C\t\tSvenska Hardvarufabriken AB\n00:03:1D\t\tTaiwan Commate Computer, Inc.\n00:03:1E\t\tOptranet, Inc.\n00:03:1F\t\tCondev Ltd.\n00:03:20\t\tXpeed, Inc.\n00:03:21\t\tReco Research Co., Ltd.\n00:03:22\t\tIDIS Co., Ltd.\n00:03:23\t\tCornet Technology, Inc.\n00:03:24\t\tLIMNO Co., Ltd.\n00:03:25\t\tArima Computer Corp.\n00:03:26\t\tIwasaki Information Systems Co., Ltd.\n00:03:27\t\tHMS Industrial Networks\n00:03:28\t\tMace Group, Inc.\n00:03:29\t\tF3, Inc.\n00:03:2A\t\tUniData Communication Systems, Inc.\n00:03:2B\t\tGAI Datenfunksysteme GmbH\n00:03:2C\t\tABB Switzerland Ltd\n00:03:2D\t\tIBASE Technology, Inc.\n00:03:2E\t\tScope Information Management, Ltd.\n00:03:2F\t\tGlobal Sun Technology, Inc.\n00:03:30\t\tImagenics, Co., Ltd.\n00:03:31\t\tCisco Systems, Inc\n00:03:32\t\tCisco Systems, Inc\n00:03:33\t\tDigitel Co., Ltd.\n00:03:34\t\tOmega Engineering Inc.\n00:03:35\t\tMirae Technology\n00:03:36\t\tZetes Technologies\n00:03:37\t\tVaone, Inc.\n00:03:38\t\tOak Technology\n00:03:39\t\tEurologic Systems, Ltd.\n00:03:3A\t\tSilicon Wave, Inc.\n00:03:3B\t\tTAMI Tech Co., Ltd.\n00:03:3C\t\tDaiden Co., Ltd.\n00:03:3D\t\tILSHin Lab\n00:03:3E\t\tTateyama System Laboratory Co., Ltd.\n00:03:3F\t\tBigBand Networks, Ltd.\n00:03:40\t\tFloware Wireless Systems, Ltd.\n00:03:41\t\tEVS Broadcast Equipment\n00:03:42\t\tNortel Networks\n00:03:43\t\tMartin Professional A/S\n00:03:44\t\tTietech.Co., Ltd.\n00:03:45\t\tRoutrek Networks Corporation\n00:03:46\t\tKOKUSAI DENKI Electric Inc.\n00:03:47\t\tIntel Corporation\n00:03:48\t\tNorscan Instruments, Ltd.\n00:03:49\t\tVidicode Datacommunicatie B.V.\n00:03:4A\t\tRIAS Corporation\n00:03:4B\t\tNortel Networks\n00:03:4C\t\tShanghai DigiVision Technology Co., Ltd.\n00:03:4D\t\tChiaro Networks, Ltd.\n00:03:4E\t\tPos Data Company, Ltd.\n00:03:4F\t\tSur-Gard Security\n00:03:50\t\tBticino Spa\n00:03:51\t\tDiebold Nixdorf\n00:03:52\t\tColubris Networks\n00:03:53\t\tMitac, Inc.\n00:03:54\t\tFiber Logic Communications\n00:03:55\t\tTeraBeam Internet Systems\n00:03:56\t\tDiebold Nixdorf\n00:03:57\t\tIntervoice-Brite, Inc.\n00:03:58\t\tHanyang Digitech Co.Ltd\n00:03:59\t\tDigitalSis\n00:03:5A\t\tPhotron Limited\n00:03:5B\t\tBridgeWave Communications\n00:03:5C\t\tSaint Song Corp.\n00:03:5D\t\tBosung Hi-Net Co., Ltd.\n00:03:5E\t\tMetropolitan Area Networks, Inc.\n00:03:5F\t\tPrüftechnik Condition Monitoring GmbH & Co. KG\n00:03:60\t\tPAC Interactive Technology, Inc.\n00:03:61\t\tWidcomm, Inc.\n00:03:62\t\tVodtel Communications, Inc.\n00:03:63\t\tMiraesys Co., Ltd.\n00:03:64\t\tScenix Semiconductor, Inc.\n00:03:65\t\tKira Information & Communications, Ltd.\n00:03:66\t\tASM Pacific Technology\n00:03:67\t\tJasmine Networks, Inc.\n00:03:68\t\tEmbedone Co., Ltd.\n00:03:69\t\tNippon Antenna Co., Ltd.\n00:03:6A\t\tMainnet, Ltd.\n00:03:6B\t\tCisco Systems, Inc\n00:03:6C\t\tCisco Systems, Inc\n00:03:6D\t\tRuntop, Inc.\n00:03:6E\t\tNicon Systems (Pty) Limited\n00:03:6F\t\tTelsey SPA\n00:03:70\t\tNXTV, Inc.\n00:03:71\t\tAcomz Networks Corp.\n00:03:72\t\tUlan\n00:03:73\t\tAselsan A.S\n00:03:74\t\tControl Microsystems\n00:03:75\t\tNetMedia, Inc.\n00:03:76\t\tGraphtec Technology, Inc.\n00:03:77\t\tGigabit Wireless\n00:03:78\t\tHUMAX Co., Ltd.\n00:03:79\t\tProscend Communications, Inc.\n00:03:7A\t\tTaiyo Yuden Co., Ltd.\n00:03:7B\t\tIDEC IZUMI Corporation\n00:03:7C\t\tCoax Media\n00:03:7D\t\tStellcom\n00:03:7E\t\tPORTech Communications, Inc.\n00:03:7F\t\tAtheros Communications, Inc.\n00:03:80\t\tSSH Communications Security Corp.\n00:03:81\t\tIngenico International\n00:03:82\t\tA-One Co., Ltd.\n00:03:83\t\tMetera Networks, Inc.\n00:03:84\t\tAeta\n00:03:85\t\tActelis Networks, Inc.\n00:03:86\t\tHo Net, Inc.\n00:03:87\t\tBlaze Network Products\n00:03:88\t\tFastfame Technology Co., Ltd.\n00:03:89\t\tPlantronics, Inc.\n00:03:8A\t\tAmerica Online, Inc.\n00:03:8B\t\tPLUS-ONE I&T, Inc.\n00:03:8C\t\tTotal Impact\n00:03:8D\t\tPCS Revenue Control Systems, Inc.\n00:03:8E\t\tAtoga Systems, Inc.\n00:03:8F\t\tWeinschel Corporation\n00:03:90\t\tDigital Video Communications, Inc.\n00:03:91\t\tAdvanced Digital Broadcast, Ltd.\n00:03:92\t\tHyundai Teletek Co., Ltd.\n00:03:93\t\tApple, Inc.\n00:03:94\t\tConnect One\n00:03:95\t\tCalifornia Amplifier\n00:03:96\t\tEZ Cast Co., Ltd.\n00:03:97\t\tFireBrick Limited\n00:03:98\t\tWisi\n00:03:99\t\tDongju Informations & Communications Co., Ltd.\n00:03:9A\t\tSiConnect\n00:03:9B\t\tNetChip Technology, Inc.\n00:03:9C\t\tOptiMight Communications, Inc.\n00:03:9D\t\tQisda Corporation\n00:03:9E\t\tTera System Co., Ltd.\n00:03:9F\t\tCisco Systems, Inc\n00:03:A0\t\tCisco Systems, Inc\n00:03:A1\t\tHIPER Information & Communication, Inc.\n00:03:A2\t\tCatapult Communications\n00:03:A3\t\tMAVIX, Ltd.\n00:03:A4\t\tImation Corp.\n00:03:A5\t\tMedea Corporation\n00:03:A6\t\tTraxit Technology, Inc.\n00:03:A7\t\tUnixtar Technology, Inc.\n00:03:A8\t\tIDOT Computers, Inc.\n00:03:A9\t\tAXCENT Media AG\n00:03:AA\t\tWatlow\n00:03:AB\t\tBridge Information Systems\n00:03:AC\t\tFronius Schweissmaschinen\n00:03:AD\t\tEmerson Energy Systems AB\n00:03:AE\t\tAllied Advanced Manufacturing Pte, Ltd.\n00:03:AF\t\tParagea Communications\n00:03:B0\t\tXsense Technology Corp.\n00:03:B1\t\tICU Medical, Inc.\n00:03:B2\t\tRadware\n00:03:B3\t\tIA Link Systems Co., Ltd.\n00:03:B4\t\tMacrotek International Corp.\n00:03:B5\t\tEntra Technology Co.\n00:03:B6\t\tQSI Corporation\n00:03:B7\t\tZACCESS Systems\n00:03:B8\t\tNetKit Solutions, LLC\n00:03:B9\t\tHualong Telecom Co., Ltd.\n00:03:BA\t\tOracle Corporation\n00:03:BB\t\tSignal Communications Limited\n00:03:BC\t\tCOT GmbH\n00:03:BD\t\tOmniCluster Technologies, Inc.\n00:03:BE\t\tNetility\n00:03:BF\t\tCenterpoint Broadband Technologies, Inc.\n00:03:C0\t\tRFTNC Co., Ltd.\n00:03:C1\t\tPacket Dynamics Ltd\n00:03:C2\t\tSolphone K.K.\n00:03:C3\t\tMicronik Multimedia\n00:03:C4\t\tTomra Systems ASA\n00:03:C5\t\tMobotix AG\n00:03:C6\t\tICUE Systems, Inc.\n00:03:C7\t\thopf Elektronik GmbH\n00:03:C8\t\tCML Emergency Services\n00:03:C9\t\tTECOM Co., Ltd.\n00:03:CA\t\tMTS Systems Corp.\n00:03:CB\t\tSystemGear Co., Ltd.\n00:03:CC\t\tMomentum Computer, Inc.\n00:03:CD\t\tClovertech, Inc.\n00:03:CE\t\tETEN Technologies, Inc.\n00:03:CF\t\tMuxcom, Inc.\n00:03:D0\t\tKOANKEISO Co., Ltd.\n00:03:D1\t\tTakaya Corporation\n00:03:D2\t\tCrossbeam Systems, Inc.\n00:03:D3\t\tInternet Energy Systems, Inc.\n00:03:D4\t\tAlloptic, Inc.\n00:03:D5\t\tAdvanced Communications Co., Ltd.\n00:03:D6\t\tRADVision, Ltd.\n00:03:D7\t\tNextNet Wireless, Inc.\n00:03:D8\t\tiMPath Networks, Inc.\n00:03:D9\t\tSecheron SA\n00:03:DA\t\tTakamisawa Cybernetics Co., Ltd.\n00:03:DB\t\tApogee Electronics Corp.\n00:03:DC\t\tLexar Media, Inc.\n00:03:DD\t\tComark Interactive Solutions\n00:03:DE\t\tOTC Wireless\n00:03:DF\t\tDesana Systems\n00:03:E0\t\tCommscope\n00:03:E1\t\tWinmate Communication, Inc.\n00:03:E2\t\tComspace Corporation\n00:03:E3\t\tCisco Systems, Inc\n00:03:E4\t\tCisco Systems, Inc\n00:03:E5\t\tHermstedt SG\n00:03:E6\t\tEntone, Inc.\n00:03:E7\t\tLogostek Co. Ltd.\n00:03:E8\t\tWavesight Limited\n00:03:E9\t\tAkara Canada, Inc.\n00:03:EA\t\tMega System Technologies, Inc.\n00:03:EB\t\tAtrica\n00:03:EC\t\tICG Research, Inc.\n00:03:ED\t\tShinkawa Electric Co., Ltd.\n00:03:EE\t\tMKNet Corporation\n00:03:EF\t\tOneline AG\n00:03:F0\t\tRedfern Broadband Networks\n00:03:F1\t\tCicada Semiconductor, Inc.\n00:03:F2\t\tSeneca Networks\n00:03:F3\t\tDazzle Multimedia, Inc.\n00:03:F4\t\tNetBurner\n00:03:F5\t\tChip2Chip\n00:03:F6\t\tAllegro Networks, Inc.\n00:03:F7\t\tPlast-Control GmbH\n00:03:F8\t\tSanCastle Technologies, Inc.\n00:03:F9\t\tPleiades Communications, Inc.\n00:03:FA\t\tTiMetra Networks\n00:03:FB\t\tENEGATE Co.,Ltd.\n00:03:FC\t\tIntertex Data AB\n00:03:FD\t\tCisco Systems, Inc\n00:03:FE\t\tCisco Systems, Inc\n00:03:FF\t\tMicrosoft Corporation\n00:04:00\t\tLexmark International, Inc.\n00:04:01\t\tOsaki Electric Co., Ltd.\n00:04:02\t\tNexsan Technologies, Ltd.\n00:04:03\t\tNexsi Corporation\n00:04:04\t\tMakino Milling Machine Co., Ltd.\n00:04:05\t\tACN Technologies\n00:04:06\t\tFa. Metabox AG\n00:04:07\t\tTopcon Positioning Systems, Inc.\n00:04:08\t\tSanko Electronics Co., Ltd.\n00:04:09\t\tCratos Networks\n00:04:0A\t\tSage Systems\n00:04:0B\t\t3Com Europe Ltd\n00:04:0C\t\tKanno Works, Ltd.\n00:04:0D\t\tAvaya Inc\n00:04:0E\t\tAVM GmbH\n00:04:0F\t\tAsus Network Technologies, Inc.\n00:04:10\t\tSpinnaker Networks, Inc.\n00:04:11\t\tInkra Networks, Inc.\n00:04:12\t\tWaveSmith Networks, Inc.\n00:04:13\t\tsnom technology GmbH\n00:04:14\t\tUmezawa Musen Denki Co., Ltd.\n00:04:15\t\tRasteme Systems Co., Ltd.\n00:04:16\t\tParks S/A Comunicacoes Digitais\n00:04:17\t\tSchneider Electric\n00:04:18\t\tTeltronic S.A.U.\n00:04:19\t\tFibercycle Networks, Inc.\n00:04:1A\t\tInes Test and Measurement GmbH & CoKG\n00:04:1B\t\tBridgeworks Ltd.\n00:04:1C\t\tipDialog, Inc.\n00:04:1D\t\tCorega of America\n00:04:1E\t\tShikoku Instrumentation Co., Ltd.\n00:04:1F\t\tSony Interactive Entertainment Inc.\n00:04:20\t\tSlim Devices, Inc.\n00:04:21\t\tOcular Networks\n00:04:22\t\tStudio Technologies, Inc\n00:04:23\t\tIntel Corporation\n00:04:24\t\tTMC s.r.l.\n00:04:25\t\tAtmel Corporation\n00:04:26\t\tAutosys\n00:04:27\t\tCisco Systems, Inc\n00:04:28\t\tCisco Systems, Inc\n00:04:29\t\tPixord Corporation\n00:04:2A\t\tWireless Networks, Inc.\n00:04:2B\t\tIT Access Co., Ltd.\n00:04:2C\t\tMinet, Inc.\n00:04:2D\t\tSarian Systems, Ltd.\n00:04:2E\t\tNetous Technologies, Ltd.\n00:04:2F\t\tInternational Communications Products, Inc.\n00:04:30\t\tNetgem\n00:04:31\t\tGlobalStreams, Inc.\n00:04:32\t\tVoyetra Turtle Beach, Inc.\n00:04:33\t\tCyberboard A/S\n00:04:34\t\tAccelent Systems, Inc.\n00:04:35\t\tInfiNet LLC\n00:04:36\t\tELANsat Technologies, Inc.\n00:04:37\t\tPowin Information Technology, Inc.\n00:04:38\t\tNortel Networks\n00:04:39\t\tRosco Entertainment Technology, Inc.\n00:04:3A\t\tIntelligent Telecommunications, Inc.\n00:04:3B\t\tLava Computer Mfg., Inc.\n00:04:3C\t\tSONOS Co., Ltd.\n00:04:3D\t\tIndel Ag\n00:04:3E\t\tTelencomm\n00:04:3F\t\tESTeem Wireless Modems, Inc\n00:04:40\t\tcyberPIXIE, Inc.\n00:04:41\t\tHalf Dome Systems, Inc.\n00:04:42\t\tNact\n00:04:43\t\tAgilent Technologies, Inc.\n00:04:44\t\tWestern Multiplex Corporation\n00:04:45\t\tLMS Skalar Instruments GmbH\n00:04:46\t\tCYZENTECH Co., Ltd.\n00:04:47\t\tAcrowave Systems Co., Ltd.\n00:04:48\t\tPolaroid Corporation\n00:04:49\t\tMapletree Networks\n00:04:4A\t\tiPolicy Networks, Inc.\n00:04:4B\t\tNvidia\n00:04:4C\t\tJenoptik\n00:04:4D\t\tCisco Systems, Inc\n00:04:4E\t\tCisco Systems, Inc\n00:04:4F\t\tSchubert System Elektronik Gmbh\n00:04:50\t\tDMD Computers SRL\n00:04:51\t\tMedrad, Inc.\n00:04:52\t\tRocketLogix, Inc.\n00:04:53\t\tYottaYotta, Inc.\n00:04:54\t\tQuadriga UK\n00:04:55\t\tANTARA.net\n00:04:56\t\tCambium Networks Limited\n00:04:57\t\tUniversal Access Technology, Inc.\n00:04:58\t\tFusion X Co., Ltd.\n00:04:59\t\tVeristar Corporation\n00:04:5A\t\tThe Linksys Group, Inc.\n00:04:5B\t\tTechsan Electronics Co., Ltd.\n00:04:5C\t\tMobiwave Pte Ltd\n00:04:5D\t\tBEKA Elektronik\n00:04:5E\t\tPolyTrax Information Technology AG\n00:04:5F\t\tAvalue Technology, Inc.\n00:04:60\t\tKnilink Technology, Inc.\n00:04:61\t\tEPOX Computer Co., Ltd.\n00:04:62\t\tDAKOS Data & Communication Co., Ltd.\n00:04:63\t\tBosch Security Systems\n00:04:64\t\tPulse-Link Inc\n00:04:65\t\ti.s.t isdn-support technik GmbH\n00:04:66\t\tARMITEL Co.\n00:04:67\t\tWuhan Research Institute of MII\n00:04:68\t\tVivity, Inc.\n00:04:69\t\tInnocom, Inc.\n00:04:6A\t\tNavini Networks\n00:04:6B\t\tPalm Wireless, Inc.\n00:04:6C\t\tCyber Technology Co., Ltd.\n00:04:6D\t\tCisco Systems, Inc\n00:04:6E\t\tCisco Systems, Inc\n00:04:6F\t\tDigitel S/A Industria Eletronica\n00:04:70\t\tipUnplugged AB\n00:04:71\t\tIPrad\n00:04:72\t\tTelelynx, Inc.\n00:04:73\t\tPhotonex Corporation\n00:04:74\t\tLegrand\n00:04:75\t\t3Com\n00:04:76\t\t3Com\n00:04:77\t\tScalant Systems, Inc.\n00:04:78\t\tG. Star Technology Corporation\n00:04:79\t\tRadius Co., Ltd.\n00:04:7A\t\tAxxessit Asa\n00:04:7B\t\tSchlumberger\n00:04:7C\t\tSkidata AG\n00:04:7D\t\tMotorola Solutions Inc.\n00:04:7E\t\tTKH Security B.V.\n00:04:7F\t\tChr. Mayr GmbH & Co. KG\n00:04:80\t\tBrocade Communications Systems LLC\n00:04:81\t\tEconolite Control Products, Inc.\n00:04:82\t\tMedialogic Corp.\n00:04:83\t\tDeltron Technology, Inc.\n00:04:84\t\tAmann GmbH\n00:04:85\t\tPicoLight\n00:04:86\t\tITTC, University of Kansas\n00:04:87\t\tCogency Semiconductor, Inc.\n00:04:88\t\tEurotherm Controls\n00:04:89\t\tYAFO Networks, Inc.\n00:04:8A\t\tTemia Vertriebs GmbH\n00:04:8B\t\tPoscon Corporation\n00:04:8C\t\tNayna Networks, Inc.\n00:04:8D\t\tTeo Technologies, Inc\n00:04:8E\t\tOhm Tech Labs, Inc.\n00:04:8F\t\tTD Systems Corporation\n00:04:90\t\tOptical Access\n00:04:91\t\tTechnovision, Inc.\n00:04:92\t\tHive Internet, Ltd.\n00:04:93\t\tTsinghua Unisplendour Co., Ltd.\n00:04:94\t\tBreezecom, Ltd.\n00:04:95\t\tTejas Networks India Limited\n00:04:96\t\tExtreme Networks Headquarters\n00:04:97\t\tMacroSystem Digital Video AG\n00:04:98\t\tMahi Networks\n00:04:99\t\tChino Corporation\n00:04:9A\t\tCisco Systems, Inc\n00:04:9B\t\tCisco Systems, Inc\n00:04:9C\t\tSurgient Networks, Inc.\n00:04:9D\t\tIpanema Technologies\n00:04:9E\t\tWirelink Co., Ltd.\n00:04:9F\t\tFreescale Semiconductor\n00:04:A0\t\tVerity Instruments, Inc.\n00:04:A1\t\tPathway Connectivity\n00:04:A2\t\tL.S.I. Japan Co., Ltd.\n00:04:A3\t\tMicrochip Technology Inc.\n00:04:A4\t\tNetEnabled, Inc.\n00:04:A5\t\tBarco NV\n00:04:A6\t\tSAF Tehnika Ltd.\n00:04:A7\t\tFabiaTech Corporation\n00:04:A8\t\tBroadmax Technologies, Inc.\n00:04:A9\t\tSandStream Technologies, Inc.\n00:04:AA\t\tJetstream Communications\n00:04:AB\t\tMavenir Inc.\n00:04:AC\t\tIBM Corp\n00:04:AD\t\tMalibu Networks\n00:04:AE\t\tSullair Corporation\n00:04:AF\t\tDigital Fountain, Inc.\n00:04:B0\t\tELESIGN Co., Ltd.\n00:04:B1\t\tSignal Technology, Inc.\n00:04:B2\t\tEssegi Srl\n00:04:B3\t\tVideotek, Inc.\n00:04:B4\t\tCiac\n00:04:B5\t\tEquitrac Corporation\n00:04:B6\t\tStratex Networks, Inc.\n00:04:B7\t\tAMB i.t. Holding\n00:04:B8\t\tKumahira Co., Ltd.\n00:04:B9\t\tS.I. Soubou, Inc.\n00:04:BA\t\tKDD Media Will Corporation\n00:04:BB\t\tBardac Corporation\n00:04:BC\t\tGiantec, Inc.\n00:04:BD\t\tCommscope\n00:04:BE\t\tOptXCon, Inc.\n00:04:BF\t\tVersaLogic Corp.\n00:04:C0\t\tCisco Systems, Inc\n00:04:C1\t\tCisco Systems, Inc\n00:04:C2\t\tMagnipix, Inc.\n00:04:C3\t\tCASTOR Informatique\n00:04:C4\t\tAudiotonix Group Limited\n00:04:C5\t\tASE Technologies, USA\n00:04:C6\t\tYamaha Motor Co.,Ltd\n00:04:C7\t\tNetMount\n00:04:C8\t\tLIBA Maschinenfabrik GmbH\n00:04:C9\t\tMicro Electron Co., Ltd.\n00:04:CA\t\tFreeMs Corp.\n00:04:CB\t\tTdsoft Communication, Ltd.\n00:04:CC\t\tPeek Traffic B.V.\n00:04:CD\t\tExtenway Solutions Inc\n00:04:CE\t\tPatria Ailon\n00:04:CF\t\tSeagate Technology\n00:04:D0\t\tSoftlink s.r.o.\n00:04:D1\t\tDrew Technologies, Inc.\n00:04:D2\t\tAdcon Telemetry GmbH\n00:04:D3\t\tToyokeiki Co., Ltd.\n00:04:D4\t\tProview Electronics Co., Ltd.\n00:04:D5\t\tHitachi Information & Communication Engineering, Ltd.\n00:04:D6\t\tTakagi Industrial Co., Ltd.\n00:04:D7\t\tOmitec Instrumentation Ltd.\n00:04:D8\t\tIPWireless, Inc.\n00:04:D9\t\tTitan Electronics, Inc.\n00:04:DA\t\tRelax Technology, Inc.\n00:04:DB\t\tTellus Group Corp.\n00:04:DC\t\tNortel Networks\n00:04:DD\t\tCisco Systems, Inc\n00:04:DE\t\tCisco Systems, Inc\n00:04:DF\t\tTeracom Telematica S.A\n00:04:E0\t\tProcket Networks\n00:04:E1\t\tInfinior Microsystems\n00:04:E2\t\tSMC Networks, Inc.\n00:04:E3\t\tAccton Technology Corp\n00:04:E4\t\tDaeryung Ind., Inc.\n00:04:E5\t\tGlonet Systems, Inc.\n00:04:E6\t\tBanyan Network Private Limited\n00:04:E7\t\tLightpointe Communications, Inc\n00:04:E8\t\tIER, Inc.\n00:04:E9\t\tInfiniswitch Corporation\n00:04:EA\t\tHewlett Packard\n00:04:EB\t\tPaxonet Communications, Inc.\n00:04:EC\t\tMemobox SA\n00:04:ED\t\tBillion Electric Co., Ltd.\n00:04:EE\t\tLincoln Electric Company\n00:04:EF\t\tPolestar Corp.\n00:04:F0\t\tInternational Computers, Ltd\n00:04:F1\t\tWhereNet\n00:04:F2\t\tPolycom\n00:04:F3\t\tFS FORTH-SYSTEME GmbH\n00:04:F4\t\tInfinite Electronics Inc.\n00:04:F5\t\tSnowShore Networks, Inc.\n00:04:F6\t\tAmphus\n00:04:F7\t\tOmega Band, Inc.\n00:04:F8\t\tQUALICABLE TV Industria E Com., Ltda\n00:04:F9\t\tXtera Communications, Inc.\n00:04:FA\t\tNBS Technologies Inc.\n00:04:FB\t\tCommtech, Inc.\n00:04:FC\t\tStratus Technologies\n00:04:FD\t\tJapan Control Engineering Co., Ltd.\n00:04:FE\t\tPelago Networks\n00:04:FF\t\tAcronet Co., Ltd.\n00:05:00\t\tCisco Systems, Inc\n00:05:01\t\tCisco Systems, Inc\n00:05:02\t\tApple, Inc.\n00:05:03\t\tIconag\n00:05:04\t\tNaray Information & Communication Enterprise\n00:05:05\t\tSystems Integration Solutions, Inc.\n00:05:06\t\tReddo Networks AB\n00:05:07\t\tFine Appliance Corp.\n00:05:08\t\tInetcam, Inc.\n00:05:09\t\tAVOC Nishimura Ltd.\n00:05:0A\t\tICS Spa\n00:05:0B\t\tSICOM Systems, Inc.\n00:05:0C\t\tNetwork Photonics, Inc.\n00:05:0D\t\tMidstream Technologies, Inc.\n00:05:0E\t\t3ware, Inc.\n00:05:0F\t\tTanaka S/S Ltd.\n00:05:10\t\tInfinite Shanghai Communication Terminals Ltd.\n00:05:11\t\tComplementary Technologies Ltd\n00:05:12\t\tZebra Technologies Inc\n00:05:13\t\tVTLinx Multimedia Systems, Inc.\n00:05:14\t\tKDT Systems Co., Ltd.\n00:05:15\t\tNuark Co., Ltd.\n00:05:16\t\tSMART Modular Technologies\n00:05:17\t\tShellcomm, Inc.\n00:05:18\t\tJupiters Technology\n00:05:19\t\tSiemens Building Technologies AG,\n00:05:1A\t\t3Com Europe Ltd\n00:05:1B\t\tMagic Control Technology Corporation\n00:05:1C\t\tXnet Technology Corp.\n00:05:1D\t\tAirocon, Inc.\n00:05:1E\t\tBrocade Communications Systems LLC\n00:05:1F\t\tTaijin Media Co., Ltd.\n00:05:20\t\tSmartronix, Inc.\n00:05:21\t\tControl Microsystems\n00:05:22\t\tLEA*D Corporation, Inc.\n00:05:23\t\tAVL List GmbH\n00:05:24\t\tBTL System (HK) Limited\n00:05:25\t\tPuretek Industrial Co., Ltd.\n00:05:26\t\tIPAS GmbH\n00:05:27\t\tSJ Tek Co. Ltd\n00:05:28\t\tNew Focus, Inc.\n00:05:29\t\tShanghai Broadan Communication Technology Co., Ltd\n00:05:2A\t\tIkegami Tsushinki Co., Ltd.\n00:05:2B\t\tHORIBA, Ltd.\n00:05:2C\t\tSupreme Magic Corporation\n00:05:2D\t\tZoltrix International Limited\n00:05:2E\t\tCinta Networks\n00:05:2F\t\tLeviton Network Solutions\n00:05:30\t\tAndiamo Systems, Inc.\n00:05:31\t\tCisco Systems, Inc\n00:05:32\t\tCisco Systems, Inc\n00:05:33\t\tBrocade Communications Systems LLC\n00:05:34\t\tNorthstar Engineering Ltd.\n00:05:35\t\tChip PC Ltd.\n00:05:36\t\tDanam Communications, Inc.\n00:05:37\t\tNets Technology Co., Ltd.\n00:05:38\t\tMerilus, Inc.\n00:05:39\t\tA Brand New World in Sweden AB\n00:05:3A\t\tWillowglen Services Pte Ltd\n00:05:3B\t\tHarbour Networks Ltd., Co. Beijing\n00:05:3C\t\tXircom\n00:05:3D\t\tAgere Systems\n00:05:3E\t\tKID Systeme GmbH\n00:05:3F\t\tVisionTek, Inc.\n00:05:40\t\tTokyo Electron Device Limited\n00:05:41\t\tAdvanced Systems Co., Ltd.\n00:05:42\t\tOtari, Inc.\n00:05:43\t\tIQ Wireless GmbH\n00:05:44\t\tValley Technologies, Inc.\n00:05:45\t\tInternet Photonics\n00:05:46\t\tKDDI Network & Solultions Inc.\n00:05:47\t\tStarent Networks\n00:05:48\t\tDisco Corporation\n00:05:49\t\tSalira Optical Network Systems\n00:05:4A\t\tArio Data Networks, Inc.\n00:05:4B\t\tEaton Automation AG\n00:05:4C\t\tRF Innovations Pty Ltd\n00:05:4D\t\tBrans Technologies, Inc.\n00:05:4E\t\tPhilips\n00:05:4F\t\tGarmin International\n00:05:50\t\tVcomms Connect Limited\n00:05:51\t\tF & S Elektronik Systeme GmbH\n00:05:52\t\tXycotec Computer GmbH\n00:05:53\t\tDVC Company, Inc.\n00:05:54\t\tRangestar Wireless\n00:05:55\t\tJapan Cash Machine Co., Ltd.\n00:05:56\t\t360 Systems\n00:05:57\t\tAgile TV Corporation\n00:05:58\t\tSynchronous, Inc.\n00:05:59\t\tIntracom S.A.\n00:05:5A\t\tPower Dsine Ltd.\n00:05:5B\t\tCharles Industries\n00:05:5C\t\tKowa Company, Ltd.\n00:05:5D\t\tD-Link Systems, Inc.\n00:05:5E\t\tCisco Systems, Inc\n00:05:5F\t\tCisco Systems, Inc\n00:05:60\t\tLeader Comm.Co., Ltd\n00:05:61\t\tnac Image Technology, Inc.\n00:05:62\t\tDigital View Limited\n00:05:63\t\tJ-Works, Inc.\n00:05:64\t\tTsinghua Bitway Co., Ltd.\n00:05:65\t\tTailyn Communication Company Ltd.\n00:05:66\t\tSecui.com Corporation\n00:05:67\t\tEtymonic Design, Inc.\n00:05:68\t\tPiltofish Networks AB\n00:05:69\t\tVMware, Inc.\n00:05:6A\t\tHeuft Systemtechnik GmbH\n00:05:6B\t\tC.P. Technology Co., Ltd.\n00:05:6C\t\tHung Chang Co., Ltd.\n00:05:6D\t\tPacific Corporation\n00:05:6E\t\tNational Enhance Technology, Inc.\n00:05:6F\t\tInnomedia Technologies Pvt. Ltd.\n00:05:70\t\tBaydel Ltd.\n00:05:71\t\tSeiwa Electronics Co.\n00:05:72\t\tDeonet Co., Ltd.\n00:05:73\t\tCisco Systems, Inc\n00:05:74\t\tCisco Systems, Inc\n00:05:75\t\tCDS-Electronics BV\n00:05:76\t\tNSM Technology Ltd.\n00:05:77\t\tSM Information & Communication\n00:05:78\t\tPrivate\n00:05:79\t\tUniversal Control Solution Corp.\n00:05:7A\t\tOverture Networks\n00:05:7B\t\tChung Nam Electronic Co., Ltd.\n00:05:7C\t\tRCO Security AB\n00:05:7D\t\tSun Communications, Inc.\n00:05:7E\t\tEckelmann AG\n00:05:7F\t\tAcqis Technology\n00:05:80\t\tFibroLAN Ltd.\n00:05:81\t\tSnell\n00:05:82\t\tClearCube Technology\n00:05:83\t\tImageCom Limited\n00:05:84\t\tAbsoluteValue Systems, Inc.\n00:05:85\t\tJuniper Networks\n00:05:86\t\tLucent Technologies\n00:05:87\t\tLocus, Incorporated\n00:05:88\t\tSensoria Corp.\n00:05:89\t\tNational Datacomputer\n00:05:8A\t\tNetcom Co., Ltd.\n00:05:8B\t\tIPmental, Inc.\n00:05:8C\t\tOpentech Inc.\n00:05:8D\t\tLynx Photonic Networks, Inc.\n00:05:8E\t\tFlextronics International GmbH & Co. Nfg. KG\n00:05:8F\t\tCLCsoft co.\n00:05:90\t\tSwissvoice Ltd.\n00:05:91\t\tActive Silicon Ltd\n00:05:92\t\tPultek Corp.\n00:05:93\t\tGrammar Engine Inc.\n00:05:94\t\tHMS Industrial Networks\n00:05:95\t\tAlesis Corporation\n00:05:96\t\tGenotech Co., Ltd.\n00:05:97\t\tEagle Traffic Control Systems\n00:05:98\t\tCRONOS S.r.l.\n00:05:99\t\tDRS Test and Energy Management or DRS-TEM\n00:05:9A\t\tCisco Systems, Inc\n00:05:9B\t\tCisco Systems, Inc\n00:05:9C\t\tKleinknecht GmbH, Ing. Büro\n00:05:9D\t\tDaniel Computing Systems, Inc.\n00:05:9E\t\tZinwell Corporation\n00:05:9F\t\tYotta Networks, Inc.\n00:05:A0\t\tMOBILINE Kft.\n00:05:A1\t\tZenocom\n00:05:A2\t\tCELOX Networks\n00:05:A3\t\tQEI, Inc.\n00:05:A4\t\tLucid Voice Ltd.\n00:05:A5\t\tKott\n00:05:A6\t\tExtron Electronics\n00:05:A7\t\tHYPERCHIP Inc.\n00:05:A8\t\tWyle Electronics\n00:05:A9\t\tPrinceton Networks, Inc.\n00:05:AA\t\tMoore Industries International Inc.\n00:05:AB\t\tCyber Fone, Inc.\n00:05:AC\t\tNorthern Digital, Inc.\n00:05:AD\t\tTopspin Communications, Inc.\n00:05:AE\t\tMediaport USA\n00:05:AF\t\tInnoScan Computing A/S\n00:05:B0\t\tKorea Computer Technology Co., Ltd.\n00:05:B1\t\tASB Technology BV\n00:05:B2\t\tMedison Co., Ltd.\n00:05:B3\t\tAsahi-Engineering Co., Ltd.\n00:05:B4\t\tAceex Corporation\n00:05:B5\t\tBroadcom Technologies\n00:05:B6\t\tINSYS Microelectronics GmbH\n00:05:B7\t\tArbor Technology Corp.\n00:05:B8\t\tElectronic Design Associates, Inc.\n00:05:B9\t\tAirvana, Inc.\n00:05:BA\t\tArea Netwoeks, Inc.\n00:05:BB\t\tMyspace AB\n00:05:BC\t\tResource Data Management Ltd\n00:05:BD\t\tRoax Bv\n00:05:BE\t\tKongsberg Seatex AS\n00:05:BF\t\tJustEzy Technology, Inc.\n00:05:C0\t\tDigital Network Alacarte Co., Ltd.\n00:05:C1\t\tA-Kyung Motion, Inc.\n00:05:C2\t\tSoronti, Inc.\n00:05:C3\t\tPacific Instruments, Inc.\n00:05:C4\t\tTelect, Inc.\n00:05:C5\t\tFlaga HF\n00:05:C6\t\tTriz Communications\n00:05:C7\t\tI/F-Com A/S\n00:05:C8\t\tVerytech\n00:05:C9\t\tLG Innotek\n00:05:CA\t\tHitron Technology, Inc.\n00:05:CB\t\tROIS Technologies, Inc.\n00:05:CC\t\tSumtel Communications, Inc.\n00:05:CD\t\tD&M Holdings Inc.\n00:05:CE\t\tProlink Microsystems Corporation\n00:05:CF\t\tThunder River Technologies, Inc.\n00:05:D0\t\tSolinet Systems\n00:05:D1\t\tMetavector Technologies\n00:05:D2\t\tDAP Technologies\n00:05:D3\t\teProduction Solutions, Inc.\n00:05:D4\t\tFutureSmart Networks, Inc.\n00:05:D5\t\tSpeedcom Wireless\n00:05:D6\t\tL-3 Linkabit\n00:05:D7\t\tVista Imaging, Inc.\n00:05:D8\t\tArescom, Inc.\n00:05:D9\t\tTechno Valley, Inc.\n00:05:DA\t\tApex Automationstechnik\n00:05:DB\t\tPSI Nentec GmbH\n00:05:DC\t\tCisco Systems, Inc\n00:05:DD\t\tCisco Systems, Inc\n00:05:DE\t\tGi Fone Korea, Inc.\n00:05:DF\t\tElectronic Innovation, Inc.\n00:05:E0\t\tEmpirix Corp.\n00:05:E1\t\tTrellis Photonics, Ltd.\n00:05:E2\t\tCreativ Network Technologies\n00:05:E3\t\tLightSand Communications, Inc.\n00:05:E4\t\tRed Lion Controls Inc.\n00:05:E5\t\tRenishaw PLC\n00:05:E6\t\tEgenera, Inc.\n00:05:E7\t\tNetrake an AudioCodes Company\n00:05:E8\t\tTurboWave, Inc.\n00:05:E9\t\tUnicess Network, Inc.\n00:05:EA\t\tRednix\n00:05:EB\t\tBlue Ridge Networks, Inc.\n00:05:EC\t\tMosaic Systems Inc.\n00:05:ED\t\tTechnikum Joanneum GmbH\n00:05:EE\t\tVanderbilt International (SWE) AB\n00:05:EF\t\tADOIR Digital Technology\n00:05:F0\t\tSatec\n00:05:F1\t\tVrcom, Inc.\n00:05:F2\t\tPower R, Inc.\n00:05:F3\t\tWebyn\n00:05:F4\t\tSystem Base Co., Ltd.\n00:05:F5\t\tGeospace Technologies\n00:05:F6\t\tYoung Chang Co. Ltd.\n00:05:F7\t\tAnalog Devices, Inc.\n00:05:F8\t\tReal Time Access, Inc.\n00:05:F9\t\tTOA Corporation\n00:05:FA\t\tIPOptical, Inc.\n00:05:FB\t\tShareGate, Inc.\n00:05:FC\t\tSchenck Pegasus Corp.\n00:05:FD\t\tPacketLight Networks Ltd.\n00:05:FE\t\tTraficon N.V.\n00:05:FF\t\tSNS Solutions, Inc.\n00:06:00\t\tToshiba Teli Corporation\n00:06:01\t\tOtanikeiki Co., Ltd.\n00:06:02\t\tCirkitech Electronics Co.\n00:06:03\t\tBaker Hughes Inc.\n00:06:04\t\t@Track Communications, Inc.\n00:06:05\t\tInncom International, Inc.\n00:06:06\t\tRapidWAN, Inc.\n00:06:07\t\tOmni Directional Control Technology Inc.\n00:06:08\t\tAt-Sky SAS\n00:06:09\t\tCrossport Systems\n00:06:0A\t\tBlue2space\n00:06:0B\t\tArtesyn Embedded Technologies\n00:06:0C\t\tMelco Industries, Inc.\n00:06:0D\t\tWave7 Optics\n00:06:0E\t\tIGYS Systems, Inc.\n00:06:0F\t\tNarad Networks Inc\n00:06:10\t\tAbeona Networks Inc\n00:06:11\t\tZeus Wireless, Inc.\n00:06:12\t\tAccusys, Inc.\n00:06:13\t\tKawasaki Microelectronics Incorporated\n00:06:14\t\tPrism Holdings\n00:06:15\t\tKimoto Electric Co., Ltd.\n00:06:16\t\tTel Net Co., Ltd.\n00:06:17\t\tRedswitch Inc.\n00:06:18\t\tDigiPower Manufacturing Inc.\n00:06:19\t\tConnection Technology Systems\n00:06:1A\t\tZetari Inc.\n00:06:1B\t\tNotebook Development Lab.  Lenovo Japan Ltd.\n00:06:1C\t\tHoshino Metal Industries, Ltd.\n00:06:1D\t\tMIP Telecom, Inc.\n00:06:1E\t\tMaxan Systems\n00:06:1F\t\tVision Components GmbH\n00:06:20\t\tSerial System Ltd.\n00:06:21\t\tHinox, Co., Ltd.\n00:06:22\t\tChung Fu Chen Yeh Enterprise Corp.\n00:06:23\t\tMGE UPS Systems France\n00:06:24\t\tGentner Communications Corp.\n00:06:25\t\tThe Linksys Group, Inc.\n00:06:26\t\tMWE GmbH\n00:06:27\t\tUniwide Technologies, Inc.\n00:06:28\t\tCisco Systems, Inc\n00:06:29\t\tIBM Corp\n00:06:2A\t\tCisco Systems, Inc\n00:06:2B\t\tIntraserver Technology\n00:06:2C\t\tBivio Networks\n00:06:2D\t\tTouchStar Technologies, L.L.C.\n00:06:2E\t\tAristos Logic Corp.\n00:06:2F\t\tPivotech Systems Inc.\n00:06:30\t\tAdtranz Sweden\n00:06:31\t\tCalix Inc.\n00:06:32\t\tMesco Engineering GmbH\n00:06:33\t\tCrossmatch Technologies/HID Global\n00:06:34\t\tGTE Airfone Inc.\n00:06:35\t\tPacketAir Networks, Inc.\n00:06:36\t\tJedai Broadband Networks\n00:06:37\t\tToptrend-Meta Information (ShenZhen) Inc.\n00:06:38\t\tSungjin C&C Co., Ltd.\n00:06:39\t\tNewtec\n00:06:3A\t\tDura Micro, Inc.\n00:06:3B\t\tArcturus Networks Inc.\n00:06:3C\t\tIntrinsyc Software International Inc.\n00:06:3D\t\tMicrowave Data Systems Inc.\n00:06:3E\t\tOpthos Inc.\n00:06:3F\t\tEverex Communications Inc.\n00:06:40\t\tWhite Rock Networks\n00:06:41\t\tItcn\n00:06:42\t\tGenetel Systems Inc.\n00:06:43\t\tSONO Computer Co., Ltd.\n00:06:44\t\tNextGen Business Solutions, Inc\n00:06:45\t\tMeisei Electric Co. Ltd.\n00:06:46\t\tShenZhen XunBao Network Technology Co Ltd\n00:06:47\t\tEtrali S.A.\n00:06:48\t\tSeedsware, Inc.\n00:06:49\t\t3M Deutschland GmbH\n00:06:4A\t\tHoneywell Co., Ltd. (KOREA)\n00:06:4B\t\tAlexon Co., Ltd.\n00:06:4C\t\tInvicta Networks, Inc.\n00:06:4D\t\tSencore\n00:06:4E\t\tBroad Net Technology Inc.\n00:06:4F\t\tPRO-NETS Technology Corporation\n00:06:50\t\tTiburon Networks, Inc.\n00:06:51\t\tAspen Networks Inc.\n00:06:52\t\tCisco Systems, Inc\n00:06:53\t\tCisco Systems, Inc\n00:06:54\t\tWinpresa Building Automation Technologies GmbH\n00:06:55\t\tYipee, Inc.\n00:06:56\t\tTactel AB\n00:06:57\t\tMarket Central, Inc.\n00:06:58\t\tHelmut Fischer GmbH Institut für Elektronik und Messtechnik\n00:06:59\t\tEAL (Apeldoorn) B.V.\n00:06:5A\t\tStrix Systems\n00:06:5B\t\tDell Inc.\n00:06:5C\t\tMalachite Technologies, Inc.\n00:06:5D\t\tHeidelberg Web Systems\n00:06:5E\t\tPhoturis, Inc.\n00:06:5F\t\tECI Telecom Ltd.\n00:06:60\t\tNADEX Co., Ltd.\n00:06:61\t\tNIA Home Technologies Corp.\n00:06:62\t\tMBM Technology Ltd.\n00:06:63\t\tHuman Technology Co., Ltd.\n00:06:64\t\tFostex Corporation\n00:06:65\t\tSunny Giken, Inc.\n00:06:66\t\tRoving Networks\n00:06:67\t\tTripp Lite\n00:06:68\t\tVicon Industries Inc.\n00:06:69\t\tDatasound Laboratories Ltd\n00:06:6A\t\tInfiniCon Systems, Inc.\n00:06:6B\t\tSysmex Corporation\n00:06:6C\t\tRobinson Corporation\n00:06:6D\t\tCompuprint S.P.A.\n00:06:6E\t\tDelta Electronics, Inc.\n00:06:6F\t\tKorea Data Systems\n00:06:70\t\tUpponetti Oy\n00:06:71\t\tSofting AG\n00:06:72\t\tNetezza\n00:06:73\t\tTKH Security Solutions USA\n00:06:74\t\tSpectrum Control, Inc.\n00:06:75\t\tBanderacom, Inc.\n00:06:76\t\tNovra Technologies Inc.\n00:06:77\t\tSick Ag\n00:06:78\t\tD&M Holdings Inc.\n00:06:79\t\tKonami Corporation\n00:06:7A\t\tJMP Systems\n00:06:7B\t\tToplink C&C Corporation\n00:06:7C\t\tCisco Systems, Inc\n00:06:7D\t\tTakasago Ltd.\n00:06:7E\t\tWinCom Systems, Inc.\n00:06:7F\t\tDigeo, Inc.\n00:06:80\t\tCard Access, Inc.\n00:06:81\t\tGoepel Electronic GmbH\n00:06:82\t\tConvedia\n00:06:83\t\tBravara Communications, Inc.\n00:06:84\t\tBiacore AB\n00:06:85\t\tNetNearU Corporation\n00:06:86\t\tZARDCOM Co., Ltd.\n00:06:87\t\tOmnitron Systems Technology, Inc.\n00:06:88\t\tTelways Communication Co., Ltd.\n00:06:89\t\tyLez Technologies Pte Ltd\n00:06:8A\t\tNeuronNet Co. Ltd. R&D Center\n00:06:8B\t\tAirRunner Technologies, Inc.\n00:06:8C\t\t3Com\n00:06:8D\t\tSEPATON, Inc.\n00:06:8E\t\tHID Corporation\n00:06:8F\t\tTelemonitor, Inc.\n00:06:90\t\tEuracom Communication GmbH\n00:06:91\t\tPT Inovacao\n00:06:92\t\tIntruvert Networks, Inc.\n00:06:93\t\tFlexus Computer Technology, Inc.\n00:06:94\t\tMobillian Corporation\n00:06:95\t\tEnsure Technologies, Inc.\n00:06:96\t\tAdvent Networks\n00:06:97\t\tR & D Center\n00:06:98\t\tegnite GmbH\n00:06:99\t\tVida Design Co.\n00:06:9A\t\te & Tel\n00:06:9B\t\tAVT Audio Video Technologies GmbH\n00:06:9C\t\tTransmode Systems AB\n00:06:9D\t\tPetards Ltd\n00:06:9E\t\tUNIQA, Inc.\n00:06:9F\t\tKuokoa Networks\n00:06:A0\t\tMx Imaging\n00:06:A1\t\tCelsian Technologies, Inc.\n00:06:A2\t\tMicrotune, Inc.\n00:06:A3\t\tBitran Corporation\n00:06:A4\t\tINNOWELL Corp.\n00:06:A5\t\tPINON Corp.\n00:06:A6\t\tArtistic Licence Engineering Ltd\n00:06:A7\t\tPrimarion\n00:06:A8\t\tKC Technology, Inc.\n00:06:A9\t\tUniversal Instruments Corp.\n00:06:AA\t\tVT Miltope\n00:06:AB\t\tW-Link Systems, Inc.\n00:06:AC\t\tIntersoft Co.\n00:06:AD\t\tKB Electronics Ltd.\n00:06:AE\t\tHimachal Futuristic Communications Ltd\n00:06:AF\t\tXalted Networks\n00:06:B0\t\tComtech EF Data Corp.\n00:06:B1\t\tSonicwall\n00:06:B2\t\tLinxtek Co.\n00:06:B3\t\tDiagraph Corporation\n00:06:B4\t\tVorne Industries, Inc.\n00:06:B5\t\tSource Photonics, Inc.\n00:06:B6\t\tNir-Or Israel Ltd.\n00:06:B7\t\tTELEM GmbH\n00:06:B8\t\tBandspeed Pty Ltd\n00:06:B9\t\tA5TEK Corp.\n00:06:BA\t\tWestwave Communications\n00:06:BB\t\tATI Technologies Inc.\n00:06:BC\t\tMacrolink, Inc.\n00:06:BD\t\tBNTECHNOLOGY Co., Ltd.\n00:06:BE\t\tBaumer Optronic GmbH\n00:06:BF\t\tAccella Technologies Co., Ltd.\n00:06:C0\t\tUnited Internetworks, Inc.\n00:06:C1\t\tCisco Systems, Inc\n00:06:C2\t\tSmartmatic Corporation\n00:06:C3\t\tSchindler Elevator Ltd.\n00:06:C4\t\tPiolink Inc.\n00:06:C5\t\tINNOVI Technologies Limited\n00:06:C6\t\tlesswire AG\n00:06:C7\t\tRFNET Technologies Pte Ltd (S)\n00:06:C8\t\tSumitomo Metal Micro Devices, Inc.\n00:06:C9\t\tTechnical Marketing Research, Inc.\n00:06:CA\t\tAmerican Computer & Digital Components, Inc. (ACDC)\n00:06:CB\t\tJotron Electronics A/S\n00:06:CC\t\tJMI Electronics Co., Ltd.\n00:06:CD\t\tLeaf Imaging Ltd.\n00:06:CE\t\tDateno\n00:06:CF\t\tThales Avionics In-Flight Systems, LLC\n00:06:D0\t\tElgar Electronics Corp.\n00:06:D1\t\tTahoe Networks, Inc.\n00:06:D2\t\tTundra Semiconductor Corp.\n00:06:D3\t\tAlpha Telecom, Inc. U.S.A.\n00:06:D4\t\tInteractive Objects, Inc.\n00:06:D5\t\tDiamond Systems Corp.\n00:06:D6\t\tCisco Systems, Inc\n00:06:D7\t\tCisco Systems, Inc\n00:06:D8\t\tMaple Optical Systems\n00:06:D9\t\tIPM-Net S.p.A.\n00:06:DA\t\tITRAN Communications Ltd.\n00:06:DB\t\tICHIPS Co., Ltd.\n00:06:DC\t\tSyabas Technology (Amquest)\n00:06:DD\t\tAT & T Laboratories - Cambridge Ltd\n00:06:DE\t\tFlash Technology\n00:06:DF\t\tAIDONIC Corporation\n00:06:E0\t\tMAT Co., Ltd.\n00:06:E1\t\tTechno Trade s.a\n00:06:E2\t\tCeemax Technology Co., Ltd.\n00:06:E3\t\tQuantitative Imaging Corporation\n00:06:E4\t\tCitel Technologies Ltd.\n00:06:E5\t\tFujian Newland Computer Ltd. Co.\n00:06:E6\t\tDongYang Telecom Co., Ltd.\n00:06:E7\t\tBit Blitz Communications Inc.\n00:06:E8\t\tOptical Network Testing, Inc.\n00:06:E9\t\tIntime Corp.\n00:06:EA\t\tELZET80 Mikrocomputer GmbH&Co. KG\n00:06:EB\t\tGlobal Data\n00:06:EC\t\tHarris Corporation\n00:06:ED\t\tInara Networks\n00:06:EE\t\tShenyang Neu-era Information & Technology Stock Co., Ltd\n00:06:EF\t\tMaxxan Systems, Inc.\n00:06:F0\t\tDigeo, Inc.\n00:06:F1\t\tOptillion\n00:06:F2\t\tPlatys Communications\n00:06:F3\t\tAcceLight Networks\n00:06:F4\t\tPrime Electronics & Satellitics Inc.\n00:06:F5\t\tAlpsalpine Co,.Ltd\n00:06:F6\t\tCisco Systems, Inc\n00:06:F7\t\tAlpsalpine Co,.Ltd\n00:06:F8\t\tThe Boeing Company\n00:06:F9\t\tMitsui Zosen Systems Research Inc.\n00:06:FA\t\tIP SQUARE Co, Ltd.\n00:06:FB\t\tHitachi Printing Solutions, Ltd.\n00:06:FC\t\tFnet Co., Ltd.\n00:06:FD\t\tComjet Information Systems Corp.\n00:06:FE\t\tAmbrado, Inc\n00:06:FF\t\tSheba Systems Co., Ltd.\n00:07:00\t\tZettamedia Korea\n00:07:01\t\tRacal-Datacom\n00:07:02\t\tVarex Imaging\n00:07:03\t\tCSEE Transport\n00:07:04\t\tAlpsalpine Co,.Ltd\n00:07:05\t\tEndress & Hauser GmbH & Co\n00:07:06\t\tSanritz Corporation\n00:07:07\t\tInteralia Inc.\n00:07:08\t\tBitrage Inc.\n00:07:09\t\tWesterstrand Urfabrik AB\n00:07:0A\t\tUnicom Automation Co., Ltd.\n00:07:0B\t\tNovabase SGPS, SA\n00:07:0C\t\tSVA-Intrusion.com Co. Ltd.\n00:07:0D\t\tCisco Systems, Inc\n00:07:0E\t\tCisco Systems, Inc\n00:07:0F\t\tFujant, Inc.\n00:07:10\t\tAdax, Inc.\n00:07:11\t\tActerna\n00:07:12\t\tJAL Information Technology\n00:07:13\t\tIP One, Inc.\n00:07:14\t\tBrightcom\n00:07:15\t\tGeneral Research of Electronics, Inc.\n00:07:16\t\tJ & S Marine Ltd.\n00:07:17\t\tWieland Electric GmbH\n00:07:18\t\tiCanTek Co., Ltd.\n00:07:19\t\tMobiis Co., Ltd.\n00:07:1A\t\tFinedigital Inc.\n00:07:1B\t\tCDVI Americas Ltd\n00:07:1C\t\tAt&T\n00:07:1D\t\tSatelsa Sistemas Y Aplicaciones De Telecomunicaciones, S.A.\n00:07:1E\t\tTri-M Engineering / Nupak Dev. Corp.\n00:07:1F\t\tEuropean Systems Integration\n00:07:20\t\tTrutzschler GmbH & Co. KG\n00:07:21\t\tFormac Elektronik GmbH\n00:07:22\t\tThe Nielsen Company\n00:07:23\t\tELCON Systemtechnik GmbH\n00:07:24\t\tTelemax Co., Ltd.\n00:07:25\t\tBematech International Corp.\n00:07:26\t\tShenzhen Gongjin Electronics Co.,Lt\n00:07:27\t\tZi Corporation (HK) Ltd.\n00:07:28\t\tNeo Telecom\n00:07:29\t\tKistler Instrumente AG\n00:07:2A\t\tInnovance Networks\n00:07:2B\t\tJung Myung Telecom Co., Ltd.\n00:07:2C\t\tFabricom\n00:07:2D\t\tCNSystems\n00:07:2E\t\tNorth Node AB\n00:07:2F\t\tIntransa, Inc.\n00:07:30\t\tHutchison OPTEL Telecom Technology Co., Ltd.\n00:07:31\t\tOphir-Spiricon LLC\n00:07:32\t\tAAEON Technology Inc.\n00:07:33\t\tDANCONTROL Engineering\n00:07:34\t\tONStor, Inc.\n00:07:35\t\tFlarion Technologies, Inc.\n00:07:36\t\tData Video Technologies Co., Ltd.\n00:07:37\t\tSoriya Co. Ltd.\n00:07:38\t\tYoung Technology Co., Ltd.\n00:07:39\t\tScotty Group Austria Gmbh\n00:07:3A\t\tInventel\n00:07:3B\t\tTenovis GmbH & Co KG\n00:07:3C\t\tTelecom Design\n00:07:3D\t\tNanjing Postel Telecommunications Co., Ltd.\n00:07:3E\t\tChina Great-Wall Computer Shenzhen Co., Ltd.\n00:07:3F\t\tWoojyun Systec Co., Ltd.\n00:07:40\t\tBuffalo.Inc\n00:07:41\t\tSierra Automated Systems\n00:07:42\t\tOrmazabal\n00:07:43\t\tChelsio Communications\n00:07:44\t\tUnico, Inc.\n00:07:45\t\tRadlan Computer Communications Ltd.\n00:07:46\t\tTURCK, Inc.\n00:07:47\t\tMecalc\n00:07:48\t\tThe Imaging Source Europe\n00:07:49\t\tCENiX Inc.\n00:07:4A\t\tCarl Valentin GmbH\n00:07:4B\t\tDaihen Corporation\n00:07:4C\t\tBeicom Inc.\n00:07:4D\t\tZebra Technologies Corp.\n00:07:4E\t\tIPFRONT Inc\n00:07:4F\t\tCisco Systems, Inc\n00:07:50\t\tCisco Systems, Inc\n00:07:51\t\tm-u-t AG\n00:07:52\t\tRhythm Watch Co., Ltd.\n00:07:53\t\tBeijing Qxcomm Technology Co., Ltd.\n00:07:54\t\tXyterra Computing, Inc.\n00:07:55\t\tLafon\n00:07:56\t\tJuyoung Telecom\n00:07:57\t\tTopcall International AG\n00:07:58\t\tDragonWave Inc.\n00:07:59\t\tBoris Manufacturing Corp.\n00:07:5A\t\tAir Products and Chemicals, Inc.\n00:07:5B\t\tGibson Guitars\n00:07:5C\t\tEastman Kodak Company\n00:07:5D\t\tCelleritas Inc.\n00:07:5E\t\tAmetek Power Instruments\n00:07:5F\t\tVCS Video Communication Systems AG\n00:07:60\t\tTOMIS Information & Telecom Corp.\n00:07:61\t\t29530\n00:07:62\t\tGroup Sense Limited\n00:07:63\t\tSunniwell Cyber Tech. Co., Ltd.\n00:07:64\t\tYoungWoo Telecom Co. Ltd.\n00:07:65\t\tJade Quantum Technologies, Inc.\n00:07:66\t\tChou Chin Industrial Co., Ltd.\n00:07:67\t\tYuxing Electronics Company Limited\n00:07:68\t\tDanfoss A/S\n00:07:69\t\tItaliana Macchi SpA\n00:07:6A\t\tNEXTEYE Co., Ltd.\n00:07:6B\t\tStralfors AB\n00:07:6C\t\tDaehanet, Inc.\n00:07:6D\t\tFlexlight Networks\n00:07:6E\t\tSinetica Corporation Limited\n00:07:6F\t\tSynoptics Limited\n00:07:70\t\tUbiquoss Inc\n00:07:71\t\tEmbedded System Corporation\n00:07:72\t\tAlcatel-Lucent Shanghai Bell Co., Ltd\n00:07:73\t\tAscom Powerline Communications Ltd.\n00:07:74\t\tGuangZhou Thinker Technology Co. Ltd.\n00:07:75\t\tValence Semiconductor, Inc.\n00:07:76\t\tFederal APD\n00:07:77\t\tMotah Ltd.\n00:07:78\t\tGERSTEL GmbH & Co. KG\n00:07:79\t\tSungil Telecom Co., Ltd.\n00:07:7A\t\tInfoware System Co., Ltd.\n00:07:7B\t\tMillimetrix Broadband Networks\n00:07:7C\t\tWestermo Network Technologies AB\n00:07:7D\t\tCisco Systems, Inc\n00:07:7E\t\tElrest GmbH\n00:07:7F\t\tJ Communications Co., Ltd.\n00:07:80\t\tBluegiga Technologies OY\n00:07:81\t\tItron Inc.\n00:07:82\t\tOracle Corporation\n00:07:83\t\tSynCom Network, Inc.\n00:07:84\t\tCisco Systems, Inc\n00:07:85\t\tCisco Systems, Inc\n00:07:86\t\tWireless Networks Inc.\n00:07:87\t\tIdea System Co., Ltd.\n00:07:88\t\tClipcomm, Inc.\n00:07:89\t\tAllradio Co., Ltd\n00:07:8A\t\tMentor Data System Inc.\n00:07:8B\t\tWegener Communications, Inc.\n00:07:8C\t\tElektronikspecialisten i Borlange AB\n00:07:8D\t\tNetEngines Ltd.\n00:07:8E\t\tGarz & Fricke GmbH\n00:07:8F\t\tEmkay Innovative Products\n00:07:90\t\tTri-M Technologies (s) Limited\n00:07:91\t\tInternational Data Communications, Inc.\n00:07:92\t\tSütron Electronic GmbH\n00:07:93\t\tShin Satellite Public Company Limited\n00:07:94\t\tSimple Devices, Inc.\n00:07:95\t\tElitegroup Computer Systems Co.,Ltd.\n00:07:96\t\tLSI Systems, Inc.\n00:07:97\t\tNetpower Co., Ltd.\n00:07:98\t\tSelea SRL\n00:07:99\t\tTipping Point Technologies, Inc.\n00:07:9A\t\tVerint Systems Inc\n00:07:9B\t\tAurora Networks\n00:07:9C\t\tGolden Electronics Technology Co., Ltd.\n00:07:9D\t\tMusashi Co., Ltd.\n00:07:9E\t\tIlinx Co., Ltd.\n00:07:9F\t\tAction Digital Inc.\n00:07:A0\t\te-Watch Inc.\n00:07:A1\t\tVIASYS Healthcare GmbH\n00:07:A2\t\tOpteon Corporation\n00:07:A3\t\tOsitis Software, Inc.\n00:07:A4\t\tGN Netcom Ltd.\n00:07:A5\t\tY.D.K Co. Ltd.\n00:07:A6\t\tLeviton Manufacturing Co., Inc.\n00:07:A7\t\tA-Z Inc.\n00:07:A8\t\tHaier Group Technologies Ltd\n00:07:A9\t\tNovasonics\n00:07:AA\t\tQuantum Data Inc.\n00:07:AB\t\tSamsung Electronics Co.,Ltd\n00:07:AC\t\tEolring\n00:07:AD\t\tPentacon GmbH Foto-und Feinwerktechnik\n00:07:AE\t\tBritestream Networks, Inc.\n00:07:AF\t\tRed Lion Controls, LP\n00:07:B0\t\tOffice Details, Inc.\n00:07:B1\t\tEquator Technologies\n00:07:B2\t\tTransaccess S.A.\n00:07:B3\t\tCisco Systems, Inc\n00:07:B4\t\tCisco Systems, Inc\n00:07:B5\t\tAny One Wireless Ltd.\n00:07:B6\t\tTelecom Technology Ltd.\n00:07:B7\t\tSamurai Ind. Prods Eletronicos Ltda\n00:07:B8\t\tCorvalent Corporation\n00:07:B9\t\tGinganet Corporation\n00:07:BA\t\tUTStarcom Inc\n00:07:BB\t\tCandera Inc.\n00:07:BC\t\tIdentix Inc.\n00:07:BD\t\tRadionet Ltd.\n00:07:BE\t\tDataLogic SpA\n00:07:BF\t\tArmillaire Technologies, Inc.\n00:07:C0\t\tNetZerver Inc.\n00:07:C1\t\tOverture Networks, Inc.\n00:07:C2\t\tNetsys Telecom\n00:07:C3\t\tThomson\n00:07:C4\t\tJEAN Co. Ltd.\n00:07:C5\t\tGcom, Inc.\n00:07:C6\t\tVDS Vosskuhler GmbH\n00:07:C7\t\tSynectics Systems Limited\n00:07:C8\t\tBrain21, Inc.\n00:07:C9\t\tTechnol Seven Co., Ltd.\n00:07:CA\t\tCreatix Polymedia Ges Fur Kommunikaitonssysteme\n00:07:CB\t\tFreebox Sas\n00:07:CC\t\tKaba Benzing GmbH\n00:07:CD\t\tKumoh Electronic Co, Ltd\n00:07:CE\t\tCabletime Limited\n00:07:CF\t\tAnoto AB\n00:07:D0\t\tAutomat Engenharia de Automação Ltda.\n00:07:D1\t\tSpectrum Signal Processing Inc.\n00:07:D2\t\tLogopak Systeme GmbH & Co. KG\n00:07:D3\t\tSPGPrints B.V.\n00:07:D4\t\tZhejiang Yutong Network Communication Co Ltd.\n00:07:D5\t\t3e Technologies Int;., Inc.\n00:07:D6\t\tCommil Ltd.\n00:07:D7\t\tCaporis Networks AG\n00:07:D8\t\tHitron Technologies. Inc\n00:07:D9\t\tSplicecom\n00:07:DA\t\tNeuro Telecom Co., Ltd.\n00:07:DB\t\tKirana Networks, Inc.\n00:07:DC\t\tAtek Co, Ltd.\n00:07:DD\t\tCradle Technologies\n00:07:DE\t\teCopilt AB\n00:07:DF\t\tVbrick Systems Inc.\n00:07:E0\t\tPalm Inc.\n00:07:E1\t\tWIS Communications Co. Ltd.\n00:07:E2\t\tBitworks, Inc.\n00:07:E3\t\tNavcom Technology, Inc.\n00:07:E4\t\tSoftRadio Co., Ltd.\n00:07:E5\t\tCoup Corporation\n00:07:E6\t\tedgeflow Canada Inc.\n00:07:E7\t\tFreeWave Technologies\n00:07:E8\t\tEdgeWave\n00:07:E9\t\tIntel Corporation\n00:07:EA\t\tMassana, Inc.\n00:07:EB\t\tCisco Systems, Inc\n00:07:EC\t\tCisco Systems, Inc\n00:07:ED\t\tAltera Corporation\n00:07:EE\t\ttelco Informationssysteme GmbH\n00:07:EF\t\tLockheed Martin Tactical Systems\n00:07:F0\t\tLogiSync LLC\n00:07:F1\t\tTeraBurst Networks Inc.\n00:07:F2\t\tIOA Corporation\n00:07:F3\t\tThinkengine Networks\n00:07:F4\t\tEletex Co., Ltd.\n00:07:F5\t\tBridgeco Co AG\n00:07:F6\t\tQqest Software Systems\n00:07:F7\t\tGaltronics\n00:07:F8\t\tITDevices, Inc.\n00:07:F9\t\tSensaphone\n00:07:FA\t\tITT Co., Ltd.\n00:07:FB\t\tGiga Stream UMTS Technologies GmbH\n00:07:FC\t\tAdept Systems Inc.\n00:07:FD\t\tLANergy Ltd.\n00:07:FE\t\tRigaku Corporation\n00:07:FF\t\tGluon Networks\n00:08:00\t\tMultitech Systems, Inc.\n00:08:01\t\tHighSpeed Surfing Inc.\n00:08:02\t\tHewlett Packard\n00:08:03\t\tCos Tron\n00:08:04\t\tICA Inc.\n00:08:05\t\tTechno-Holon Corporation\n00:08:06\t\tRaonet Systems, Inc.\n00:08:07\t\tAccess Devices Limited\n00:08:08\t\tPPT Vision, Inc.\n00:08:09\t\tSystemonic AG\n00:08:0A\t\tEspera-Werke GmbH\n00:08:0B\t\tBirka BPA Informationssystem AB\n00:08:0C\t\tVDA Group S.p.a.\n00:08:0D\t\tToshiba\n00:08:0E\t\tCommscope\n00:08:0F\t\tProximion Fiber Optics AB\n00:08:10\t\tKey Technology, Inc.\n00:08:11\t\tVOIX Corporation\n00:08:12\t\tGM-2 Corporation\n00:08:13\t\tDiskbank, Inc.\n00:08:14\t\tTIL Technologies\n00:08:15\t\tCATS Co., Ltd.\n00:08:16\t\tBluelon ApS\n00:08:17\t\tEmergeCore Networks LLC\n00:08:18\t\tPixelworks, Inc.\n00:08:19\t\tBanksys\n00:08:1A\t\tSanrad Intelligence Storage Communications (2000) Ltd.\n00:08:1B\t\tWindigo Systems\n00:08:1C\t\t@pos.com\n00:08:1D\t\tIpsil, Incorporated\n00:08:1E\t\tRepeatit AB\n00:08:1F\t\tPou Yuen Tech Corp. Ltd.\n00:08:20\t\tCisco Systems, Inc\n00:08:21\t\tCisco Systems, Inc\n00:08:22\t\tInPro Comm\n00:08:23\t\tTexa Corp.\n00:08:24\t\tNuance Document Imaging\n00:08:25\t\tAcme Packet\n00:08:26\t\tColorado Med Tech\n00:08:27\t\tADB Broadband Italia\n00:08:28\t\tKoei Engineering Ltd.\n00:08:29\t\tTokyo Electron Device Nagasaki Limited\n00:08:2A\t\tPowerwallz Network Security\n00:08:2B\t\tWooksung Electronics, Inc.\n00:08:2C\t\tHomag AG\n00:08:2D\t\tIndus Teqsite Private Limited\n00:08:2E\t\tMultitone Electronics PLC\n00:08:2F\t\tCisco Systems, Inc\n00:08:30\t\tCisco Systems, Inc\n00:08:31\t\tCisco Systems, Inc\n00:08:32\t\tCisco Systems, Inc\n00:08:4E\t\tDivergeNet, Inc.\n00:08:4F\t\tQualstar Corporation\n00:08:50\t\tArizona Instrument Corp.\n00:08:51\t\tCanadian Bank Note Company, Ltd.\n00:08:52\t\tDavolink Co. Inc.\n00:08:53\t\tSchleicher GmbH & Co. Relaiswerke KG\n00:08:54\t\tNetronix, Inc.\n00:08:55\t\tNASA-Goddard Space Flight Center\n00:08:56\t\tGamatronic Electronic Industries Ltd.\n00:08:57\t\tPolaris Networks, Inc.\n00:08:58\t\tNovatechnology Inc.\n00:08:59\t\tShenZhen Unitone Electronics Co., Ltd.\n00:08:5A\t\tIntiGate Inc.\n00:08:5B\t\tHanbit Electronics Co., Ltd.\n00:08:5C\t\tShanghai Dare Technologies Co. Ltd.\n00:08:5D\t\tMitel Corporation\n00:08:5E\t\tPco Ag\n00:08:5F\t\tPicanol N.V.\n00:08:60\t\tLodgeNet Entertainment Corp.\n00:08:61\t\tSoftEnergy Co., Ltd.\n00:08:62\t\tNEC Eluminant Technologies, Inc.\n00:08:63\t\tEntrisphere Inc.\n00:08:64\t\tFasy S.p.A.\n00:08:65\t\tJascom Co., Ltd\n00:08:66\t\tDSX Access Systems, Inc.\n00:08:67\t\tUptime Devices\n00:08:68\t\tPurOptix\n00:08:69\t\tCommand-e Technology Co.,Ltd.\n00:08:6A\t\tSecuriton Gmbh\n00:08:6B\t\tMipsys\n00:08:6C\t\tPlasmon LMS\n00:08:6D\t\tMissouri FreeNet\n00:08:6E\t\tHyglo AB\n00:08:6F\t\tResources Computer Network Ltd.\n00:08:70\t\tRasvia Systems, Inc.\n00:08:71\t\tNORTHDATA Co., Ltd.\n00:08:72\t\tSorenson Communications\n00:08:73\t\tDapTechnology B.V.\n00:08:74\t\tDell Inc.\n00:08:75\t\tAcorp Electronics Corp.\n00:08:76\t\tSDSystem\n00:08:77\t\tLiebert-Hiross Spa\n00:08:78\t\tBenchmark Storage Innovations\n00:08:79\t\tCEM Corporation\n00:08:7A\t\tWipotec GmbH\n00:08:7B\t\tRTX Telecom A/S\n00:08:7C\t\tCisco Systems, Inc\n00:08:7D\t\tCisco Systems, Inc\n00:08:7E\t\tBon Electro-Telecom Inc.\n00:08:7F\t\tSPAUN electronic GmbH & Co. KG\n00:08:80\t\tBroadTel Canada Communications inc.\n00:08:81\t\tDigital Hands Co.,Ltd.\n00:08:82\t\tSigma Corporation\n00:08:83\t\tHewlett Packard\n00:08:84\t\tIndex Braille AB\n00:08:85\t\tEMS Dr. Thomas Wünsche\n00:08:86\t\tHansung Teliann, Inc.\n00:08:87\t\tMaschinenfabrik Reinhausen GmbH\n00:08:88\t\tOULLIM Information Technology Inc,.\n00:08:89\t\tDish Technologies Corp\n00:08:8A\t\tMinds@Work\n00:08:8B\t\tTropic Networks Inc.\n00:08:8C\t\tQuanta Network Systems Inc.\n00:08:8D\t\tSigma-Links Inc.\n00:08:8E\t\tNihon Computer Co., Ltd.\n00:08:8F\t\tAdvanced Digital Technology\n00:08:90\t\tAvilinks Sa\n00:08:91\t\tLyan Inc.\n00:08:92\t\tEM Solutions\n00:08:93\t\tLe Information Communication Inc.\n00:08:94\t\tInnoVISION Multimedia Ltd.\n00:08:95\t\tDIRC Technologie GmbH & Co.KG\n00:08:96\t\tPrintronix, Inc.\n00:08:97\t\tQuake Technologies\n00:08:98\t\tGigabit Optics Corporation\n00:08:99\t\tNetbind, Inc.\n00:08:9A\t\tAlcatel Microelectronics\n00:08:9B\t\tICP Electronics Inc.\n00:08:9C\t\tElecs Industry Co., Ltd.\n00:08:9D\t\tUHD-Elektronik\n00:08:9E\t\tBeijing Enter-Net co.LTD\n00:08:9F\t\tEFM Networks\n00:08:A0\t\tStotz Feinmesstechnik GmbH\n00:08:A1\t\tCNet Technology Inc.\n00:08:A2\t\tADI Engineering, Inc.\n00:08:A3\t\tCisco Systems, Inc\n00:08:A4\t\tCisco Systems, Inc\n00:08:A5\t\tPeninsula Systems Inc.\n00:08:A6\t\tMultiware & Image Co., Ltd.\n00:08:A7\t\tiLogic Inc.\n00:08:A8\t\tSystec Co., Ltd.\n00:08:A9\t\tSangSang Technology, Inc.\n00:08:AA\t\tKaram\n00:08:AB\t\tEnerLinx.com, Inc.\n00:08:AC\t\tBST GmbH\n00:08:AD\t\tToyo-Linx Co., Ltd.\n00:08:AE\t\tPacketFront Network Products AB\n00:08:AF\t\tNovatec Corporation\n00:08:B0\t\tHUBER+SUHNER BKtel GmbH\n00:08:B1\t\tProQuent Systems\n00:08:B2\t\tShenzhen Compass Technology Development Co.,Ltd\n00:08:B3\t\tFastwel\n00:08:B4\t\tSyspol\n00:08:B5\t\tTai Guen Enterprise Co., Ltd\n00:08:B6\t\tRouteFree, Inc.\n00:08:B7\t\tHIT Incorporated\n00:08:B8\t\tE.F. Johnson\n00:08:B9\t\tKaon Group Co., Ltd.\n00:08:BA\t\tErskine Systems Ltd\n00:08:BB\t\tNetExcell\n00:08:BC\t\tIlevo AB\n00:08:BD\t\tTepg-Us\n00:08:BE\t\tXENPAK MSA Group\n00:08:BF\t\tAptus Elektronik AB\n00:08:C0\t\tAsa Systems\n00:08:C1\t\tAvistar Communications Corporation\n00:08:C2\t\tCisco Systems, Inc\n00:08:C3\t\tContex A/S\n00:08:C4\t\tHikari Co.,Ltd.\n00:08:C5\t\tLiontech Co., Ltd.\n00:08:C6\t\tPhilips Consumer Communications\n00:08:C7\t\tHewlett Packard\n00:08:C8\t\tSoneticom, Inc.\n00:08:C9\t\tTechniSat Digital GmbH Daun\n00:08:CA\t\tTwinHan Technology Co.,Ltd\n00:08:CB\t\tZeta Broadband Inc.\n00:08:CC\t\tRemotec, Inc.\n00:08:CD\t\tWith-Net Inc\n00:08:CE\t\tIPMobileNet Inc.\n00:08:CF\t\tNippon Koei Power Systems Co., Ltd.\n00:08:D0\t\tMusashi Engineering Co., LTD.\n00:08:D1\t\tKarel Inc.\n00:08:D2\t\tZOOM Networks Inc.\n00:08:D3\t\tHercules Technologies S.A.S.\n00:08:D4\t\tIneoQuest Technologies, Inc\n00:08:D5\t\tVanguard Networks Solutions, LLC\n00:08:D6\t\tHASSNET Inc.\n00:08:D7\t\tHow Corporation\n00:08:D8\t\tDowkey Microwave\n00:08:D9\t\tMitadenshi Co.,LTD\n00:08:DA\t\tSofaWare Technologies Ltd.\n00:08:DB\t\tCorrigent Systems\n00:08:DC\t\tWiznet\n00:08:DD\t\tTelena Communications, Inc.\n00:08:DE\t\t3UP Systems\n00:08:DF\t\tAlistel Inc.\n00:08:E0\t\tATO Technology Ltd.\n00:08:E1\t\tBarix AG\n00:08:E2\t\tCisco Systems, Inc\n00:08:E3\t\tCisco Systems, Inc\n00:08:E4\t\tEnvenergy Inc\n00:08:E5\t\tIDK Corporation\n00:08:E6\t\tLittlefeet\n00:08:E7\t\tSHI ControlSystems,Ltd.\n00:08:E8\t\tExcel Master Ltd.\n00:08:E9\t\tNextGig\n00:08:EA\t\tMotion Control Engineering, Inc\n00:08:EB\t\tROMWin Co.,Ltd.\n00:08:EC\t\tOptical Zonu Corporation\n00:08:ED\t\tST&T Instrument Corp.\n00:08:EE\t\tLogic Product Development\n00:08:EF\t\tDibal,S.A.\n00:08:F0\t\tNext Generation Systems, Inc.\n00:08:F1\t\tVoltaire\n00:08:F2\t\tC&S Technology\n00:08:F3\t\tWany\n00:08:F4\t\tBluetake Technology Co., Ltd.\n00:08:F5\t\tYESTECHNOLOGY Co.,Ltd.\n00:08:F6\t\tSumitomo Electric Industries, Ltd\n00:08:F7\t\tHitachi Ltd, Semiconductor & Integrated Circuits Gr\n00:08:F8\t\tUtc Ccs\n00:08:F9\t\tArtesyn Embedded Technologies\n00:08:FA\t\tKEB Automation KG\n00:08:FB\t\tSonoSite, Inc.\n00:08:FC\t\tGigaphoton Inc.\n00:08:FD\t\tBlueKorea Co., Ltd.\n00:08:FE\t\tUNIK C&C Co.,Ltd.\n00:08:FF\t\tTrilogy Communications Ltd\n00:09:00\t\tTmt\n00:09:01\t\tShenzhen Shixuntong Information & Technoligy Co\n00:09:02\t\tRedline Communications Inc.\n00:09:03\t\tPanasas, Inc\n00:09:04\t\tMONDIAL electronic\n00:09:05\t\tiTEC Technologies Ltd.\n00:09:06\t\tEsteem Networks\n00:09:07\t\tChrysalis Development\n00:09:08\t\tVTech Technology Corp.\n00:09:09\t\tTelenor Connect A/S\n00:09:0A\t\tSnedFar Technology Co., Ltd.\n00:09:0B\t\tMTL  Instruments PLC\n00:09:0C\t\tMayekawa Mfg. Co. Ltd.\n00:09:0D\t\tLeader Electronics Corp.\n00:09:0E\t\tHelix Technology Inc.\n00:09:0F\t\tFortinet, Inc.\n00:09:10\t\tSimple Access Inc.\n00:09:11\t\tCisco Systems, Inc\n00:09:12\t\tCisco Systems, Inc\n00:09:13\t\tSystemK Corporation\n00:09:14\t\tComputrols Inc.\n00:09:15\t\tCAS Corp.\n00:09:16\t\tListman Home Technologies, Inc.\n00:09:17\t\tWEM Technology Inc\n00:09:18\t\tSamsung Techwin Co.,Ltd\n00:09:19\t\tMDS Gateways\n00:09:1A\t\tMacat Optics & Electronics Co., Ltd.\n00:09:1B\t\tDigital Generation Inc.\n00:09:1C\t\tCacheVision, Inc\n00:09:1D\t\tProteam Computer Corporation\n00:09:1E\t\tFirstech Technology Corp.\n00:09:1F\t\tA&D Co., Ltd.\n00:09:20\t\tEpoX COMPUTER CO.,LTD.\n00:09:21\t\tPlanmeca Oy\n00:09:22\t\tTST Biometrics GmbH\n00:09:23\t\tHeaman System Co., Ltd\n00:09:24\t\tTelebau GmbH\n00:09:25\t\tVSN Systemen BV\n00:09:26\t\tYoda Communications, Inc.\n00:09:27\t\tToyokeiki Co.,Ltd.\n00:09:28\t\tTelecore\n00:09:29\t\tSanyo Industries (UK) Limited\n00:09:2A\t\tMYTECS Co.,Ltd.\n00:09:2B\t\tiQstor Networks, Inc.\n00:09:2C\t\tHitpoint Inc.\n00:09:2D\t\tHTC Corporation\n00:09:2E\t\tB&Tech System Inc.\n00:09:2F\t\tAkom Technology Corporation\n00:09:30\t\tAeroConcierge Inc.\n00:09:31\t\tFuture Internet, Inc.\n00:09:32\t\tOmnilux\n00:09:33\t\tOphit Co.Ltd.\n00:09:34\t\tDream-Multimedia-Tv GmbH\n00:09:35\t\tSandvine Incorporated\n00:09:36\t\tIpetronik GmbH & Co. KG\n00:09:37\t\tInventec Appliance Corp\n00:09:38\t\tAllot Communications\n00:09:39\t\tShibaSoku Co.,Ltd.\n00:09:3A\t\tMolex CMS\n00:09:3B\t\tHyundai Networks Inc.\n00:09:3C\t\tJacques Technologies P/L\n00:09:3D\t\tNewisys,Inc.\n00:09:3E\t\tC&I Technologies\n00:09:3F\t\tDouble-Win Enterpirse CO., LTD\n00:09:40\t\tAGFEO GmbH & Co. KG\n00:09:41\t\tAllied Telesis K.K.\n00:09:42\t\tWireless Technologies, Inc\n00:09:43\t\tCisco Systems, Inc\n00:09:44\t\tCisco Systems, Inc\n00:09:45\t\tPalmmicro Communications Inc\n00:09:46\t\tCluster Labs GmbH\n00:09:47\t\tAztek, Inc.\n00:09:48\t\tVista Control Systems, Corp.\n00:09:49\t\tGlyph Technologies Inc.\n00:09:4A\t\tHomenet Communications\n00:09:4B\t\tFillFactory NV\n00:09:4C\t\tCommunication Weaver Co.,Ltd.\n00:09:4D\t\tBraintree Communications Pty Ltd\n00:09:4E\t\tBartech Systems International, Inc\n00:09:4F\t\telmegt GmbH & Co. KG\n00:09:50\t\tIndependent Storage Corporation\n00:09:51\t\tApogee Imaging Systems\n00:09:52\t\tAuerswald GmbH & Co. KG\n00:09:53\t\tLinkage System Integration Co.Ltd.\n00:09:54\t\tAMiT spol. s. r. o.\n00:09:55\t\tYoung Generation International Corp.\n00:09:56\t\tNetwork Systems Group, Ltd. (NSG)\n00:09:57\t\tSupercaller, Inc.\n00:09:58\t\tIntelnet S.A.\n00:09:59\t\tSitecsoft\n00:09:5A\t\tRacewood Technology\n00:09:5B\t\tNetgear\n00:09:5C\t\tPhilips Medical Systems - Cardiac and Monitoring Systems (CM\n00:09:5D\t\tDialogue Technology Corp.\n00:09:5E\t\tMasstech Group Inc.\n00:09:5F\t\tTelebyte, Inc.\n00:09:60\t\tYOZAN Inc.\n00:09:61\t\tSwitchgear and Instrumentation Ltd\n00:09:62\t\tSonitor Technologies AS\n00:09:63\t\tDominion Lasercom Inc.\n00:09:64\t\tHi-Techniques, Inc.\n00:09:65\t\tHyunJu Computer Co., Ltd.\n00:09:66\t\tTrimble Europe Bv\n00:09:67\t\tTachyon, Inc\n00:09:68\t\tTechnoventure, Inc.\n00:09:69\t\tMeret Optical Communications\n00:09:6A\t\tCloverleaf Communications Inc.\n00:09:6B\t\tIBM Corp\n00:09:6C\t\tImedia Semiconductor Corp.\n00:09:6D\t\tPowernet Technologies Corp.\n00:09:6E\t\tGiant Electronics Ltd.\n00:09:6F\t\tBeijing Zhongqing Elegant Tech. Corp.,Limited\n00:09:70\t\tVibration Research Corporation\n00:09:71\t\tTime Management, Inc.\n00:09:72\t\tSecurebase,Inc\n00:09:73\t\tLenten Technology Co., Ltd.\n00:09:74\t\tInnopia Technologies, Inc.\n00:09:75\t\tfSONA Communications Corporation\n00:09:76\t\tDatasoft ISDN Systems GmbH\n00:09:77\t\tBrunner Elektronik AG\n00:09:78\t\tAIJI System Co., Ltd.\n00:09:79\t\tAdvanced Television Systems Committee, Inc.\n00:09:7A\t\tLouis Design Labs.\n00:09:7B\t\tCisco Systems, Inc\n00:09:7C\t\tCisco Systems, Inc\n00:09:7D\t\tSecWell Networks Oy\n00:09:7E\t\tImi Technology Co., Ltd\n00:09:7F\t\tVsecure 2000 LTD.\n00:09:80\t\tPower Zenith Inc.\n00:09:81\t\tNewport Networks\n00:09:82\t\tLoewe Opta GmbH\n00:09:83\t\tGlobalTop Technology, Inc.\n00:09:84\t\tMyCasa Network Inc.\n00:09:85\t\tAuto Telecom Company\n00:09:86\t\tMetalink LTD.\n00:09:87\t\tNishi Nippon Electric Wire & Cable Co.,Ltd.\n00:09:88\t\tNudian Electron Co., Ltd.\n00:09:89\t\tVividLogic Inc.\n00:09:8A\t\tEqualLogic Inc\n00:09:8B\t\tEntropic Communications, Inc.\n00:09:8C\t\tOption Wireless Sweden\n00:09:8D\t\tVelocity Semiconductor\n00:09:8E\t\tipcas GmbH\n00:09:8F\t\tCetacean Networks\n00:09:90\t\tACKSYS Communications & systems\n00:09:91\t\tIntelligent Platforms, LLC.\n00:09:92\t\tInterEpoch Technology,INC.\n00:09:93\t\tVisteon Corporation\n00:09:94\t\tCronyx Engineering\n00:09:95\t\tCastle Technology Ltd\n00:09:96\t\tRdi\n00:09:97\t\tNortel Networks\n00:09:98\t\tCapinfo Company Limited\n00:09:99\t\tCp Georges Renault\n00:09:9A\t\tElmo Company, Limited\n00:09:9B\t\tWestern Telematic Inc.\n00:09:9C\t\tNaval Research Laboratory\n00:09:9D\t\tHaliplex Communications\n00:09:9E\t\tTestech, Inc.\n00:09:9F\t\tVidex Inc.\n00:09:A0\t\tMicrotechno Corporation\n00:09:A1\t\tTelewise Communications, Inc.\n00:09:A2\t\tInterface Co., Ltd.\n00:09:A3\t\tLeadfly Techologies Corp. Ltd.\n00:09:A4\t\tHARTEC Corporation\n00:09:A5\t\tHansung Eletronic Industries Development Co., Ltd\n00:09:A6\t\tIgnis Optics, Inc.\n00:09:A7\t\tBang & Olufsen A/S\n00:09:A8\t\tEastmode Pte Ltd\n00:09:A9\t\tIkanos Communications\n00:09:AA\t\tData Comm for Business, Inc.\n00:09:AB\t\tNetcontrol Oy\n00:09:AC\t\tLanvoice\n00:09:AD\t\tHyundai Syscomm, Inc.\n00:09:AE\t\tOkano Electric Co.,Ltd\n00:09:AF\t\te-generis\n00:09:B0\t\tOnkyo Technology K.K.\n00:09:B1\t\tKanematsu Electronics, Ltd.\n00:09:B2\t\tL&F Inc.\n00:09:B3\t\tMCM Systems Ltd\n00:09:B4\t\tKisan Telecom Co., Ltd.\n00:09:B5\t\t3J Tech. Co., Ltd.\n00:09:B6\t\tCisco Systems, Inc\n00:09:B7\t\tCisco Systems, Inc\n00:09:B8\t\tEntise Systems\n00:09:B9\t\tAction Imaging Solutions\n00:09:BA\t\tMAKU Informationstechik GmbH\n00:09:BB\t\tMathStar, Inc.\n00:09:BC\t\tUtility, Inc\n00:09:BD\t\tEpygi Technologies, Ltd.\n00:09:BE\t\tMamiya-OP Co.,Ltd.\n00:09:BF\t\tNintendo Co., Ltd.\n00:09:C0\t\t6Wind\n00:09:C1\t\tProces-Data A/S\n00:09:C2\t\tOnity, Inc.\n00:09:C3\t\tNetas\n00:09:C4\t\tMedicore Co., Ltd\n00:09:C5\t\tKINGENE Technology Corporation\n00:09:C6\t\tVisionics Corporation\n00:09:C7\t\tMovistec\n00:09:C8\t\tSinagawa Tsushin Keisou Service\n00:09:C9\t\tBlueWINC Co., Ltd.\n00:09:CA\t\tiMaxNetworks(Shenzhen)Limited.\n00:09:CB\t\tHBrain\n00:09:CC\t\tMoog GmbH\n00:09:CD\t\tHudson Soft Co.,Ltd.\n00:09:CE\t\tSpaceBridge Semiconductor Corp.\n00:09:CF\t\tiAd GmbH\n00:09:D0\t\tSolacom Technologies Inc.\n00:09:D1\t\tSeranoa Networks Inc\n00:09:D2\t\tMai Logic Inc.\n00:09:D3\t\tWestern DataCom Co., Inc.\n00:09:D4\t\tTranstech Networks\n00:09:D5\t\tSignal Communication, Inc.\n00:09:D6\t\tKNC One GmbH\n00:09:D7\t\tDC Security Products\n00:09:D8\t\tFält Communications AB\n00:09:D9\t\tNeoscale Systems, Inc\n00:09:DA\t\tControl Module Inc.\n00:09:DB\t\teSpace\n00:09:DC\t\tGalaxis Technology AG\n00:09:DD\t\tMavin Technology Inc.\n00:09:DE\t\tSamjin Information & Communications Co., Ltd.\n00:09:DF\t\tVestel Elektronik San ve Tic. A.S.\n00:09:E0\t\tXemics S.A.\n00:09:E1\t\tGemtek Technology Co., Ltd.\n00:09:E2\t\tSinbon Electronics Co., Ltd.\n00:09:E3\t\tAngel Iglesias S.A.\n00:09:E4\t\tK Tech Infosystem Inc.\n00:09:E5\t\tHottinger Brüel & Kjaer GmbH\n00:09:E6\t\tCyber Switching Inc.\n00:09:E7\t\tADC Techonology\n00:09:E8\t\tCisco Systems, Inc\n00:09:E9\t\tCisco Systems, Inc\n00:09:EA\t\tYEM Inc.\n00:09:EB\t\tHuMANDATA LTD.\n00:09:EC\t\tDaktronics, Inc.\n00:09:ED\t\tCipherOptics\n00:09:EE\t\tMeikyo Electric Co.,Ltd\n00:09:EF\t\tVocera Communications\n00:09:F0\t\tShimizu Technology Inc.\n00:09:F1\t\tYamaki Electric Corporation\n00:09:F2\t\tCohu, Inc., Electronics Division\n00:09:F3\t\tWELL Communication Corp.\n00:09:F4\t\tAlcon Laboratories, Inc.\n00:09:F5\t\tEmerson Network Power Co.,Ltd\n00:09:F6\t\tShenzhen Eastern Digital Tech Ltd.\n00:09:F7\t\tCalian Advanced Technologies\n00:09:F8\t\tUnimo Technology Co., Ltd.\n00:09:F9\t\tArt Japan Co., Ltd.\n00:09:FB\t\tPhilips Patient Monitoring\n00:09:FC\t\tIPFLEX Inc.\n00:09:FD\t\tUbinetics Limited\n00:09:FE\t\tDaisy Technologies, Inc.\n00:09:FF\t\tX.net 2000 GmbH\n00:0A:00\t\tMediaTek Inc\n00:0A:01\t\tSOHOware, Inc.\n00:0A:02\t\tAnnso Co., Ltd.\n00:0A:03\t\tEndesa Servicios, S.L.\n00:0A:04\t\t3Com Ltd\n00:0A:05\t\tWidax Corp.\n00:0A:06\t\tTeledex LLC\n00:0A:07\t\tWebWayOne Ltd\n00:0A:08\t\tAlps Alpine\n00:0A:09\t\tTaraCom Integrated Products, Inc.\n00:0A:0A\t\tSUNIX Co., Ltd.\n00:0A:0B\t\tSealevel Systems, Inc.\n00:0A:0C\t\tScientific Research Corporation\n00:0A:0D\t\tAmphenol\n00:0A:0E\t\tInvivo Research Inc.\n00:0A:0F\t\tIlryung Telesys, Inc\n00:0A:10\t\tFAST media integrations AG\n00:0A:11\t\tExPet Technologies, Inc\n00:0A:12\t\tAzylex Technology, Inc\n00:0A:13\t\tHoneywell Video Systems\n00:0A:14\t\tTECO a.s.\n00:0A:15\t\tSilicon Data, Inc\n00:0A:16\t\tLassen Research\n00:0A:17\t\tNestar Communications, Inc\n00:0A:18\t\tVichel Inc.\n00:0A:19\t\tValere Power, Inc.\n00:0A:1A\t\tImerge Ltd\n00:0A:1B\t\tStream Labs\n00:0A:1C\t\tBridge Information Co., Ltd.\n00:0A:1D\t\tOptical Communications Products Inc.\n00:0A:1E\t\tRed-M Products Limited\n00:0A:1F\t\tART WARE Telecommunication Co., Ltd.\n00:0A:20\t\tSVA Networks, Inc.\n00:0A:21\t\tIntegra Telecom Co. Ltd\n00:0A:22\t\tAmperion Inc\n00:0A:23\t\tParama Networks Inc\n00:0A:24\t\tOctave Communications\n00:0A:25\t\tCeragon Networks\n00:0A:26\t\tCEIA S.p.A.\n00:0A:27\t\tApple, Inc.\n00:0A:28\t\tMotorola\n00:0A:29\t\tPan Dacom Networking AG\n00:0A:2A\t\tQSI Systems Inc.\n00:0A:2B\t\tEtherstuff\n00:0A:2C\t\tActive Tchnology Corporation\n00:0A:2D\t\tCabot Communications Limited\n00:0A:2E\t\tMaple Networks Co., Ltd\n00:0A:2F\t\tArtnix Inc.\n00:0A:30\t\tVisteon Corporation\n00:0A:31\t\tHCV Consulting\n00:0A:32\t\tXsido Corporation\n00:0A:33\t\tEmulex Corporation\n00:0A:34\t\tIdenticard Systems Incorporated\n00:0A:35\t\tXilinx\n00:0A:36\t\tSynelec Telecom Multimedia\n00:0A:37\t\tProcera Networks, Inc.\n00:0A:38\t\tApani Networks\n00:0A:39\t\tLoPA Information Technology\n00:0A:3A\t\tJ-THREE INTERNATIONAL Holding Co., Ltd.\n00:0A:3B\t\tGCT Semiconductor, Inc\n00:0A:3C\t\tEnerpoint Ltd.\n00:0A:3D\t\tElo Sistemas Eletronicos S.A.\n00:0A:3E\t\tEADS Telecom\n00:0A:3F\t\tData East Corporation\n00:0A:40\t\tCrown Audio -- Harmanm International\n00:0A:41\t\tCisco Systems, Inc\n00:0A:42\t\tCisco Systems, Inc\n00:0A:43\t\tChunghwa Telecom Co., Ltd.\n00:0A:44\t\tAvery Dennison Deutschland GmbH\n00:0A:45\t\tAudio-Technica Corp.\n00:0A:46\t\tAro Welding Technologies Sas\n00:0A:47\t\tAllied Vision Technologies\n00:0A:48\t\tAlbatron Technology\n00:0A:49\t\tF5 Inc.\n00:0A:4A\t\tTarga Systems Ltd.\n00:0A:4B\t\tDataPower Technology, Inc.\n00:0A:4C\t\tMolecular Devices Corporation\n00:0A:4D\t\tNoritz Corporation\n00:0A:4E\t\tUNITEK Electronics INC.\n00:0A:4F\t\tBrain Boxes Limited\n00:0A:50\t\tRemotek Corporation\n00:0A:51\t\tGyroSignal Technology Co., Ltd.\n00:0A:52\t\tAsiaRF Ltd.\n00:0A:53\t\tIntronics, Incorporated\n00:0A:54\t\tLaguna Hills, Inc.\n00:0A:55\t\tMARKEM Corporation\n00:0A:56\t\tHITACHI Maxell Ltd.\n00:0A:57\t\tHewlett Packard\n00:0A:58\t\tFreyer & Siegel Elektronik GmbH & Co. KG\n00:0A:59\t\tHW server\n00:0A:5A\t\tGreenNET Technologies Co.,Ltd.\n00:0A:5B\t\tPower-One as\n00:0A:5C\t\tCarel s.p.a.\n00:0A:5D\t\tFingerTec Worldwide Sdn Bhd\n00:0A:5E\t\t3Com\n00:0A:5F\t\talmedio inc.\n00:0A:60\t\tAutostar Technology Pte Ltd\n00:0A:61\t\tCellinx Systems Inc.\n00:0A:62\t\tCrinis Networks, Inc.\n00:0A:63\t\tDHD GmbH\n00:0A:64\t\tEracom Technologies\n00:0A:65\t\tGentechMedia.co.,ltd.\n00:0A:66\t\tMitsubishi Electric System & Service Co.,Ltd.\n00:0A:67\t\tOngCorp\n00:0A:68\t\tSolarflare Communications Inc.\n00:0A:69\t\tSUNNY bell Technology Co., Ltd.\n00:0A:6A\t\tSVM Microwaves s.r.o.\n00:0A:6B\t\tTadiran Telecom Business Systems LTD\n00:0A:6C\t\tWalchem Corporation\n00:0A:6D\t\tEKS Elektronikservice GmbH\n00:0A:6E\t\tHarmonic, Inc\n00:0A:6F\t\tZyFLEX Technologies Inc\n00:0A:70\t\tMPLS Forum\n00:0A:71\t\tAvrio Technologies, Inc\n00:0A:72\t\tStec, Inc.\n00:0A:73\t\tScientific Atlanta\n00:0A:74\t\tManticom Networks Inc.\n00:0A:75\t\tCaterpillar, Inc\n00:0A:76\t\tBeida Jade Bird Huaguang Technology Co.,Ltd\n00:0A:77\t\tBluewire Technologies LLC\n00:0A:78\t\tOlitec\n00:0A:79\t\tcorega K.K\n00:0A:7A\t\tKyoritsu Electric Co., Ltd.\n00:0A:7B\t\tCornelius Consult\n00:0A:7C\t\tTecton Ltd\n00:0A:7D\t\tValo, Inc.\n00:0A:7E\t\tThe Advantage Group\n00:0A:7F\t\tTeradon Industries, Inc\n00:0A:80\t\tTelkonet Inc.\n00:0A:81\t\tTEIMA Audiotex S.L.\n00:0A:82\t\tTatsuta System Electronics Co.,Ltd.\n00:0A:83\t\tSalto Systems S.L.\n00:0A:84\t\tRainsun Enterprise Co., Ltd.\n00:0A:85\t\tPLAT'C2,Inc\n00:0A:86\t\tLenze\n00:0A:87\t\tIntegrated Micromachines Inc.\n00:0A:88\t\tInCypher S.A.\n00:0A:89\t\tCreval Systems, Inc.\n00:0A:8A\t\tCisco Systems, Inc\n00:0A:8B\t\tCisco Systems, Inc\n00:0A:8C\t\tGuardware Systems Ltd.\n00:0A:8D\t\tEurotherm Limited\n00:0A:8E\t\tInvacom Ltd\n00:0A:8F\t\tAska International Inc.\n00:0A:90\t\tBayside Interactive, Inc.\n00:0A:91\t\tHemoCue AB\n00:0A:92\t\tPresonus Corporation\n00:0A:93\t\tW2 Networks, Inc.\n00:0A:94\t\tShangHai cellink CO., LTD\n00:0A:95\t\tApple, Inc.\n00:0A:96\t\tMewtel Technology Inc.\n00:0A:97\t\tSONICblue, Inc.\n00:0A:98\t\tM+F Gwinner GmbH & Co\n00:0A:99\t\tCalamp Wireless Networks Inc\n00:0A:9A\t\tAiptek International Inc\n00:0A:9B\t\tTB Group Inc\n00:0A:9C\t\tServer Technology, Inc.\n00:0A:9D\t\tKing Young Technology Co. Ltd.\n00:0A:9E\t\tBroadWeb Corportation\n00:0A:9F\t\tPannaway Technologies, Inc.\n00:0A:A0\t\tCedar Point Communications\n00:0A:A1\t\tV V S Limited\n00:0A:A2\t\tSystek Inc.\n00:0A:A3\t\tShimafuji Electric Co.,Ltd.\n00:0A:A4\t\tShanghai Surveillance Technology Co,Ltd\n00:0A:A5\t\tMaxlink Industries Limited\n00:0A:A6\t\tHochiki Corporation\n00:0A:A7\t\tFEI Electron Optics\n00:0A:A8\t\tePipe Pty. Ltd.\n00:0A:A9\t\tBrooks Automation GmbH\n00:0A:AA\t\tAltiGen Communications Inc.\n00:0A:AB\t\tToyota Technical Development Corporation\n00:0A:AC\t\tTerraTec Electronic GmbH\n00:0A:AD\t\tStargames Corporation\n00:0A:AE\t\tRosemount Process Analytical\n00:0A:AF\t\tPipal Systems\n00:0A:B0\t\tLOYTEC electronics GmbH\n00:0A:B1\t\tGENETEC Corporation\n00:0A:B2\t\tFresnel Wireless Systems\n00:0A:B3\t\tFa. GIRA\n00:0A:B4\t\tETIC Telecommunications\n00:0A:B5\t\tDigital Electronic Network\n00:0A:B6\t\tCompunetix, Inc\n00:0A:B7\t\tCisco Systems, Inc\n00:0A:B8\t\tCisco Systems, Inc\n00:0A:B9\t\tAstera Technologies Corp.\n00:0A:BA\t\tArcon Technology Limited\n00:0A:BB\t\tTaiwan Secom Co,. Ltd\n00:0A:BC\t\tSeabridge Ltd.\n00:0A:BD\t\tRupprecht & Patashnick Co.\n00:0A:BE\t\tOPNET Technologies CO., LTD.\n00:0A:BF\t\tHirota Ss\n00:0A:C0\t\tFuyoh Video Industry CO., LTD.\n00:0A:C1\t\tFuturetel\n00:0A:C2\t\tWuhan FiberHome Digital Technology Co.,Ltd.\n00:0A:C3\t\teM Technics Co., Ltd.\n00:0A:C4\t\tDaewoo Teletech Co., Ltd\n00:0A:C5\t\tColor Kinetics\n00:0A:C6\t\tOverture Networks.\n00:0A:C7\t\tUnication Group\n00:0A:C8\t\tZPSYS CO.,LTD. (Planning&Management)\n00:0A:C9\t\tZambeel Inc\n00:0A:CA\t\tYOKOYAMA SHOKAI CO.,Ltd.\n00:0A:CB\t\tXPAK MSA Group\n00:0A:CC\t\tWinnow Networks, Inc.\n00:0A:CD\t\tSunrich Technology Limited\n00:0A:CE\t\tRadiantech, Inc.\n00:0A:CF\t\tPROVIDEO Multimedia Co. Ltd.\n00:0A:D0\t\tNiigata Develoment Center,  F.I.T. Co., Ltd.\n00:0A:D1\t\tMws\n00:0A:D2\t\tJEPICO Corporation\n00:0A:D3\t\tINITECH Co., Ltd\n00:0A:D4\t\tCoreBell Systems Inc.\n00:0A:D5\t\tBrainchild Electronic Co., Ltd.\n00:0A:D6\t\tBeamReach Networks\n00:0A:D7\t\tOrigin Co., Ltd.\n00:0A:D8\t\tIPCserv Technology Corp.\n00:0A:D9\t\tSony Corporation\n00:0A:DA\t\tVindicator Technologies\n00:0A:DB\t\tTrilliant\n00:0A:DC\t\tRuggedCom Inc.\n00:0A:DD\t\tAllworx Corp.\n00:0A:DE\t\tHappy Communication Co., Ltd.\n00:0A:DF\t\tGennum Corporation\n00:0A:E0\t\tFujitsu Softek\n00:0A:E1\t\tEG Technology\n00:0A:E2\t\tBinatone Electronics International, Ltd\n00:0A:E3\t\tYang Mei Technology Co., Ltd\n00:0A:E4\t\tWistron Corporation\n00:0A:E5\t\tScottCare Corporation\n00:0A:E6\t\tElitegroup Computer Systems Co.,Ltd.\n00:0A:E7\t\tEliop S.A.\n00:0A:E8\t\tCathay Roxus Information Technology Co. LTD\n00:0A:E9\t\tAirVast Technology Inc.\n00:0A:EA\t\tAdam Elektronik Ltd. Şti\n00:0A:EB\t\tTp-Link Technologies Co.,Ltd.\n00:0A:EC\t\tKoatsu Gas Kogyo Co., Ltd.\n00:0A:ED\t\tHARTING Electronics GmbH\n00:0A:EE\t\tGCD Hard- & Software GmbH\n00:0A:EF\t\tOtrum Asa\n00:0A:F0\t\tShin-Oh Electronics Co., Ltd. R&D\n00:0A:F1\t\tClarity Design, Inc.\n00:0A:F2\t\tNeoAxiom Corp.\n00:0A:F3\t\tCisco Systems, Inc\n00:0A:F4\t\tCisco Systems, Inc\n00:0A:F5\t\tAirgo Networks, Inc.\n00:0A:F6\t\tCopeland LP\n00:0A:F7\t\tBroadcom\n00:0A:F8\t\tAmerican Telecare Inc.\n00:0A:F9\t\tHiConnect, Inc.\n00:0A:FA\t\tTraverse Technologies Australia\n00:0A:FB\t\tAmbri Limited\n00:0A:FC\t\tCore Tec Communications, LLC\n00:0A:FD\t\tKentec Electronics\n00:0A:FE\t\tNovaPal Ltd\n00:0A:FF\t\tKilchherr Elektronik AG\n00:0B:00\t\tFujian Start Computer Equipment Co.,Ltd\n00:0B:01\t\tDaiichi Electronics Co., Ltd.\n00:0B:02\t\tDallmeier electronic\n00:0B:03\t\tTaekwang Industrial Co., Ltd\n00:0B:04\t\tVolktek Corporation\n00:0B:05\t\tPacific Broadband Networks\n00:0B:06\t\tCommscope\n00:0B:07\t\tVoxpath Networks\n00:0B:08\t\tPillar Data Systems\n00:0B:09\t\tIfoundry Systems Singapore\n00:0B:0A\t\tdBm Optics\n00:0B:0B\t\tCorrent Corporation\n00:0B:0C\t\tAgile Systems Inc.\n00:0B:0D\t\tAir2U, Inc.\n00:0B:0E\t\tTrapeze Networks\n00:0B:0F\t\tBosch Rexroth\n00:0B:10\t\t11wave Technonlogy Co.,Ltd\n00:0B:11\t\tHimeji Abc Trading Co.,Ltd.\n00:0B:12\t\tNURI Telecom Co., Ltd.\n00:0B:13\t\tZetron Inc\n00:0B:14\t\tViewSonic Corporation\n00:0B:15\t\tPlatypus Technology\n00:0B:16\t\tCommunication Machinery Corporation\n00:0B:17\t\tMKS Instruments\n00:0B:18\t\tPrivate\n00:0B:19\t\tVernier Networks, Inc.\n00:0B:1A\t\tIndustrial Defender, Inc.\n00:0B:1B\t\tSystronix, Inc.\n00:0B:1C\t\tSIBCO bv\n00:0B:1D\t\tLayerZero Power Systems, Inc.\n00:0B:1E\t\tKAPPA opto-electronics GmbH\n00:0B:1F\t\tI CON Computer Co.\n00:0B:20\t\tHirata corporation\n00:0B:21\t\tG-Star Communications Inc.\n00:0B:22\t\tEnvironmental Systems and Services\n00:0B:23\t\tSiemens Home & Office Comm. Devices\n00:0B:24\t\tAirLogic\n00:0B:25\t\tAeluros\n00:0B:26\t\tWetek Corporation\n00:0B:27\t\tScion Corporation\n00:0B:28\t\tQuatech Inc.\n00:0B:29\t\tLS(LG) Industrial Systems co.,Ltd\n00:0B:2A\t\tHOWTEL Co., Ltd.\n00:0B:2B\t\tHostnet Corporation\n00:0B:2C\t\tEiki Industrial Co. Ltd.\n00:0B:2D\t\tDanfoss Inc.\n00:0B:2E\t\tCal-Comp Electronics & Communications Company Ltd.\n00:0B:2F\t\tbplan GmbH\n00:0B:30\t\tBeijing Gongye Science & Technology Co.,Ltd\n00:0B:31\t\tYantai ZhiYang Scientific and technology industry CO., LTD\n00:0B:32\t\tVormetric, Inc.\n00:0B:33\t\tVivato Technologies\n00:0B:34\t\tShangHai Broadband Technologies CO.LTD\n00:0B:35\t\tQuad Bit System co., Ltd.\n00:0B:36\t\tProductivity Systems, Inc.\n00:0B:37\t\tManufacture Des Montres Rolex Sa\n00:0B:38\t\tKnürr GmbH\n00:0B:39\t\tKeisoku Giken Co.,Ltd.\n00:0B:3A\t\tPESA Inc.\n00:0B:3B\t\tdevolo AG\n00:0B:3C\t\tCygnal Integrated Products, Inc.\n00:0B:3D\t\tCONTAL OK Ltd.\n00:0B:3E\t\tBittWare, Inc\n00:0B:3F\t\tAnthology Solutions Inc.\n00:0B:40\t\tCambridge Industries Group (CIG)\n00:0B:41\t\tIng. Büro Dr. Beutlhauser\n00:0B:42\t\tcommax Co., Ltd.\n00:0B:43\t\tMicroscan Systems, Inc.\n00:0B:44\t\tConcord Idea Corp.\n00:0B:45\t\tCisco Systems, Inc\n00:0B:46\t\tCisco Systems, Inc\n00:0B:47\t\tAdvanced Energy\n00:0B:48\t\tsofrel\n00:0B:49\t\tRF-Link System Inc.\n00:0B:4A\t\tVisimetrics (UK) Ltd\n00:0B:4B\t\tVisiowave Sa\n00:0B:4C\t\tClarion (M) Sdn Bhd\n00:0B:4D\t\tEmuzed\n00:0B:4E\t\tCommunications & Power Industries\n00:0B:4F\t\tVerifone, Inc.\n00:0B:50\t\tOxygnet\n00:0B:51\t\tMicetek International Inc.\n00:0B:52\t\tJoymax Electronics Co. Ltd.\n00:0B:53\t\tINITIUM Co., Ltd.\n00:0B:54\t\tBiTMICRO Networks, Inc.\n00:0B:55\t\tADInstruments\n00:0B:56\t\tCybernetics\n00:0B:57\t\tSilicon Laboratories\n00:0B:58\t\tAstronautics C.A  LTD\n00:0B:59\t\tScriptPro, LLC\n00:0B:5A\t\tHyperEdge\n00:0B:5B\t\tRincon Research Corporation\n00:0B:5C\t\tNewtech Co.,Ltd\n00:0B:5D\t\tFujitsu Limited\n00:0B:5E\t\tAudio Engineering Society Inc.\n00:0B:5F\t\tCisco Systems, Inc\n00:0B:60\t\tCisco Systems, Inc\n00:0B:61\t\tFriedrich Lütze GmbH & Co. KG\n00:0B:62\t\tib-mohnen KG\n00:0B:63\t\tKaleidescape\n00:0B:64\t\tKieback & Peter GmbH & Co KG\n00:0B:65\t\tSy.A.C. srl\n00:0B:66\t\tTeralink Communications\n00:0B:67\t\tTopview Technology Corporation\n00:0B:68\t\tAddvalue Communications Pte Ltd\n00:0B:69\t\tFranke Finland Oy\n00:0B:6A\t\tAsiarock Technology Limited\n00:0B:6B\t\tWistron Neweb Corporation\n00:0B:6C\t\tSychip Inc.\n00:0B:6D\t\tSolectron Japan Nakaniida\n00:0B:6E\t\tNeff Instrument Corp.\n00:0B:6F\t\tMedia Streaming Networks Inc\n00:0B:70\t\tLoad Technology, Inc.\n00:0B:71\t\tLitchfield Communications Inc.\n00:0B:72\t\tLawo AG\n00:0B:73\t\tKodeos Communications\n00:0B:74\t\tKingwave Technology Co., Ltd.\n00:0B:75\t\tIosoft Ltd.\n00:0B:76\t\tET&T Technology Co. Ltd.\n00:0B:77\t\tCogent Systems, Inc.\n00:0B:78\t\tTaifatech Inc.\n00:0B:79\t\tX-COM, Inc.\n00:0B:7A\t\tL-3 Linkabit\n00:0B:7B\t\tTest-Um Inc.\n00:0B:7C\t\tTelex Communications\n00:0B:7D\t\tSolomon Extreme International Ltd.\n00:0B:7E\t\tSAGINOMIYA Seisakusho Inc.\n00:0B:7F\t\tAlign Engineering LLC\n00:0B:80\t\tLycium Networks\n00:0B:81\t\tKaparel Corporation\n00:0B:82\t\tGrandstream Networks, Inc.\n00:0B:83\t\tDatawatt B.V.\n00:0B:84\t\tBodet\n00:0B:85\t\tCisco Systems, Inc\n00:0B:86\t\tHewlett Packard Enterprise\n00:0B:87\t\tAmerican Reliance Inc.\n00:0B:88\t\tVidisco ltd.\n00:0B:89\t\tTop Global Technology, Ltd.\n00:0B:8A\t\tMITEQ Inc.\n00:0B:8B\t\tKerajet, S.A.\n00:0B:8C\t\tFlextronics\n00:0B:8D\t\tAvvio Networks\n00:0B:8E\t\tAscent Corporation\n00:0B:8F\t\tAkita Electronics Systems Co.,Ltd.\n00:0B:90\t\tADVA Optical Networking Ltd.\n00:0B:91\t\tXovis Germany GmbH\n00:0B:92\t\tAscom Danmark A/S\n00:0B:93\t\tRitter Elektronik\n00:0B:94\t\tDigital Monitoring Products, Inc.\n00:0B:95\t\teBet Gaming Systems Pty Ltd\n00:0B:96\t\tInnotrac Diagnostics Oy\n00:0B:97\t\tMatsushita Electric Industrial Co.,Ltd.\n00:0B:98\t\tNiceTechVision\n00:0B:99\t\tSensAble Technologies, Inc.\n00:0B:9A\t\tShanghai Ulink Telecom Equipment Co. Ltd.\n00:0B:9B\t\tSirius System Co, Ltd.\n00:0B:9C\t\tTriBeam Technologies, Inc.\n00:0B:9D\t\tTwinMOS Technologies Inc.\n00:0B:9E\t\tYasing Technology Corp.\n00:0B:9F\t\tNeue ELSA GmbH\n00:0B:A0\t\tT&L Information Inc.\n00:0B:A1\t\tFujikura Solutions Ltd.\n00:0B:A2\t\tSumitomo Electric Industries, Ltd\n00:0B:A3\t\tSiemens AG\n00:0B:A4\t\tShiron Satellite Communications Ltd. (1996)\n00:0B:A5\t\tQuasar Cipta Mandiri, PT\n00:0B:A6\t\tMiyakawa Electric Works Ltd.\n00:0B:A7\t\tMaranti Networks\n00:0B:A8\t\tHanback Electronics Co., Ltd.\n00:0B:A9\t\tCloudShield Technologies, Inc.\n00:0B:AA\t\tAiphone co.,Ltd\n00:0B:AB\t\tAdvantech Technology (CHINA) Co., Ltd.\n00:0B:AC\t\t3Com Ltd\n00:0B:AD\t\tPC-PoS Inc.\n00:0B:AE\t\tVitals System Inc.\n00:0B:AF\t\tWOOJU COMMUNICATIONS Co,.Ltd\n00:0B:B0\t\tSysnet Telematica srl\n00:0B:B1\t\tSuper Star Technology Co., Ltd.\n00:0B:B2\t\tSmallbig Technology\n00:0B:B3\t\tRiT technologies Ltd.\n00:0B:B4\t\tRDC Semiconductor Inc.,\n00:0B:B5\t\tnStor Technologies, Inc.\n00:0B:B6\t\tMetalligence Technology Corp.\n00:0B:B7\t\tMicro Systems Co.,Ltd.\n00:0B:B8\t\tKihoku Electronic Co.\n00:0B:B9\t\tImsys AB\n00:0B:BA\t\tHarmonic, Inc\n00:0B:BB\t\tEtin Systems Co., Ltd\n00:0B:BC\t\tEn Garde Systems, Inc.\n00:0B:BD\t\tConnexionz Limited\n00:0B:BE\t\tCisco Systems, Inc\n00:0B:BF\t\tCisco Systems, Inc\n00:0B:C0\t\tChina IWNComm Co., Ltd.\n00:0B:C1\t\tBay Microsystems, Inc.\n00:0B:C2\t\tCorinex Communication Corp.\n00:0B:C3\t\tMultiplex, Inc.\n00:0B:C4\t\tBIOTRONIK GmbH & Co\n00:0B:C5\t\tSMC Networks, Inc.\n00:0B:C6\t\tISAC, Inc.\n00:0B:C7\t\tICET S.p.A.\n00:0B:C8\t\tAirFlow Networks\n00:0B:C9\t\tElectroline Equipment\n00:0B:CA\t\tDatavan Tc\n00:0B:CB\t\tFagor Automation , S. Coop\n00:0B:CC\t\tJusan, S.A.\n00:0B:CD\t\tHewlett Packard\n00:0B:CE\t\tFree2move AB\n00:0B:CF\t\tAgfa Ndt Inc.\n00:0B:D0\t\tXiMeta Technology Americas Inc.\n00:0B:D1\t\tAeronix, Inc.\n00:0B:D2\t\tRemopro Technology Inc.\n00:0B:D3\t\tcd3o\n00:0B:D4\t\tBeijing Wise Technology & Science Development Co.Ltd\n00:0B:D5\t\tNvergence, Inc.\n00:0B:D6\t\tPaxton Access Ltd\n00:0B:D7\t\tDORMA Time + Access GmbH\n00:0B:D8\t\tIndustrial Scientific Corp.\n00:0B:D9\t\tGeneral Hydrogen\n00:0B:DA\t\tEyeCross Co.,Inc.\n00:0B:DB\t\tDell Inc.\n00:0B:DC\t\tAkcp\n00:0B:DD\t\tTOHOKU RICOH Co., LTD.\n00:0B:DE\t\tTELDIX GmbH\n00:0B:DF\t\tShenzhen RouterD Networks Limited\n00:0B:E0\t\tSercoNet Ltd.\n00:0B:E1\t\tNokia NET Product Operations\n00:0B:E2\t\tLumenera Corporation\n00:0B:E3\t\tKey Stream Co., Ltd.\n00:0B:E4\t\tHosiden Corporation\n00:0B:E5\t\tHIMS International Corporation\n00:0B:E6\t\tDatel Electronics\n00:0B:E7\t\tComflux Technology Inc.\n00:0B:E8\t\tAoip\n00:0B:E9\t\tActel Corporation\n00:0B:EA\t\tZultys Technologies\n00:0B:EB\t\tSystegra AG\n00:0B:EC\t\tNippon Electric Instrument, Inc.\n00:0B:ED\t\tELM Inc.\n00:0B:EE\t\tinc.jet, Incorporated\n00:0B:EF\t\tCode Corporation\n00:0B:F0\t\tMoTEX Products Co., Ltd.\n00:0B:F1\t\tLAP Laser Applikations\n00:0B:F2\t\tChih-Kan Technology Co., Ltd.\n00:0B:F3\t\tBae Systems\n00:0B:F4\t\tPrivate\n00:0B:F5\t\tShanghai Sibo Telecom Technology Co.,Ltd\n00:0B:F6\t\tNitgen Co., Ltd\n00:0B:F7\t\tNidek Co.,Ltd\n00:0B:F8\t\tInfinera, Inc.\n00:0B:F9\t\tGemstone Communications, Inc.\n00:0B:FA\t\tExemys Srl\n00:0B:FB\t\tD-NET International Corporation\n00:0B:FC\t\tCisco Systems, Inc\n00:0B:FD\t\tCisco Systems, Inc\n00:0B:FE\t\tCASTEL Broadband Limited\n00:0B:FF\t\tBerkeley Camera Engineering\n00:0C:00\t\tBEB Industrie-Elektronik AG\n00:0C:01\t\tAbatron AG\n00:0C:02\t\tABB Oy\n00:0C:03\t\tHDMI Licensing, LLC\n00:0C:04\t\tTecnova\n00:0C:05\t\tRPA Reserch Co., Ltd.\n00:0C:06\t\tNixvue Systems  Pte Ltd\n00:0C:07\t\tIftest AG\n00:0C:08\t\tHUMEX Technologies Corp.\n00:0C:09\t\tHitachi IE Systems Co., Ltd\n00:0C:0A\t\tGuangdong Province Electronic Technology Research Institute\n00:0C:0B\t\tBroadbus Technologies\n00:0C:0C\t\tAppro Technology Inc.\n00:0C:0D\t\tCommunications & Power Industries / Satcom Division\n00:0C:0E\t\tXtremeSpectrum, Inc.\n00:0C:0F\t\tTechno-One Co., Ltd\n00:0C:10\t\tPNI Corporation\n00:0C:11\t\tNippon Dempa Co.,Ltd.\n00:0C:12\t\tMicro-Optronic-Messtechnik GmbH\n00:0C:13\t\tMediaQ\n00:0C:14\t\tDiagnostic Instruments, Inc.\n00:0C:15\t\tCyberPower Systems, Inc.\n00:0C:16\t\tConcorde Microsystems Inc.\n00:0C:17\t\tAJA Video Systems Inc\n00:0C:18\t\tZenisu Keisoku Inc.\n00:0C:19\t\tTelio Communications GmbH\n00:0C:1A\t\tQuest Technical Solutions Inc.\n00:0C:1B\t\tORACOM Co, Ltd.\n00:0C:1C\t\tMicroWeb Co., Ltd.\n00:0C:1D\t\tMettler & Fuchs AG\n00:0C:1E\t\tGlobal Cache\n00:0C:1F\t\tGlimmerglass Networks\n00:0C:20\t\tFi WIn, Inc.\n00:0C:21\t\tFaculty of Science and Technology, Keio University\n00:0C:22\t\tDouble D Electronics Ltd\n00:0C:23\t\tBeijing Lanchuan Tech. Co., Ltd.\n00:0C:24\t\tAnator\n00:0C:25\t\tAllied Telesis Labs, Inc.\n00:0C:26\t\tWeintek Labs. Inc.\n00:0C:27\t\tSammy Corporation\n00:0C:28\t\tRifatron\n00:0C:29\t\tVMware, Inc.\n00:0C:2A\t\tOCTTEL Communication Co., Ltd.\n00:0C:2B\t\tELIAS Technology, Inc.\n00:0C:2C\t\tEnwiser Inc.\n00:0C:2D\t\tFullWave Technology Co., Ltd.\n00:0C:2E\t\tOpenet information technology(shenzhen) Co., Ltd.\n00:0C:2F\t\tSeorimTechnology Co.,Ltd.\n00:0C:30\t\tCisco Systems, Inc\n00:0C:31\t\tCisco Systems, Inc\n00:0C:32\t\tAvionic Design GmbH\n00:0C:33\t\tCompucase Enterprise Co. Ltd.\n00:0C:34\t\tVixen Co., Ltd.\n00:0C:35\t\tKaVo Dental GmbH & Co. KG\n00:0C:36\t\tS-Takaya Electronics Industry Co.,Ltd.\n00:0C:37\t\tGeomation, Inc.\n00:0C:38\t\tTelcoBridges Inc.\n00:0C:39\t\tSentinel Wireless Inc.\n00:0C:3A\t\tOxance\n00:0C:3B\t\tOrion Electric Co., Ltd.\n00:0C:3C\t\tMediaChorus, Inc.\n00:0C:3D\t\tGlsystech Co., Ltd.\n00:0C:3E\t\tCrest Audio\n00:0C:3F\t\tCogent Defence & Security Networks,\n00:0C:40\t\tAltech Controls\n00:0C:41\t\tCisco-Linksys, LLC\n00:0C:42\t\tRouterboard.com\n00:0C:43\t\tMediaTek Inc\n00:0C:44\t\tAutomated Interfaces, Inc.\n00:0C:45\t\tAnimation Technologies Inc.\n00:0C:46\t\tAllied Telesyn Inc.\n00:0C:47\t\tSK Teletech(R&D Planning Team)\n00:0C:48\t\tQoStek Corporation\n00:0C:49\t\tDangaard Telecom Denmark A/S\n00:0C:4A\t\tCygnus Microsystems (P) Limited\n00:0C:4B\t\tCheops Elektronik\n00:0C:4C\t\tArcor AG&Co.\n00:0C:4D\t\tCurtiss-Wright Controls Avionics & Electronics\n00:0C:4E\t\tWinbest Technology CO,LT\n00:0C:4F\t\tUDTech Japan Corporation\n00:0C:50\t\tSeagate Technology\n00:0C:51\t\tScientific Technologies Inc.\n00:0C:52\t\tRoll Systems Inc.\n00:0C:53\t\tPrivate\n00:0C:54\t\tPedestal Networks, Inc\n00:0C:55\t\tMicrolink Communications Inc.\n00:0C:56\t\tMegatel Computer (1986) Corp.\n00:0C:57\t\tMACKIE Engineering Services Belgium BVBA\n00:0C:58\t\tM&S Systems\n00:0C:59\t\tIndyme Electronics, Inc.\n00:0C:5A\t\tIBSmm Embedded Electronics Consulting\n00:0C:5B\t\tHanwang Technology Co.,Ltd\n00:0C:5C\t\tGTN Systems B.V.\n00:0C:5D\t\tChic Technology (China) Corp.\n00:0C:5E\t\tCalypso Medical\n00:0C:5F\t\tAvtec, Inc.\n00:0C:60\t\tACM Systems\n00:0C:61\t\tAC Tech corporation DBA Advanced Digital\n00:0C:62\t\tABB AB, Cewe-Control\n00:0C:63\t\tZenith Electronics Corporation\n00:0C:64\t\tX2 MSA Group\n00:0C:65\t\tSunin Telecom\n00:0C:66\t\tPronto Networks Inc\n00:0C:67\t\tOyo Electric Co.,Ltd\n00:0C:68\t\tSigmaTel, Inc.\n00:0C:69\t\tNational Radio Astronomy Observatory\n00:0C:6A\t\tMbari\n00:0C:6B\t\tKurz Industrie-Elektronik GmbH\n00:0C:6C\t\tEve Systems GmbH\n00:0C:6D\t\tEdwards Ltd.\n00:0C:6E\t\tASUSTek COMPUTER INC.\n00:0C:6F\t\tAmtek system co.,LTD.\n00:0C:70\t\tACC GmbH\n00:0C:71\t\tWybron, Inc\n00:0C:72\t\tTempearl Industrial Co., Ltd.\n00:0C:73\t\tTelson Electronics Co., Ltd\n00:0C:74\t\tRivertec Corporation\n00:0C:75\t\tOriental integrated electronics. LTD\n00:0C:76\t\tMicro-Star International Co., Ltd.\n00:0C:77\t\tLife Racing Ltd\n00:0C:78\t\tIn-Tech Electronics Limited\n00:0C:79\t\tExtel Communications P/L\n00:0C:7A\t\tDaTARIUS Technologies GmbH\n00:0C:7B\t\tALPHA PROJECT Co.,Ltd.\n00:0C:7C\t\tInternet Information Image Inc.\n00:0C:7D\t\tTeikoku Electric Mfg. Co., Ltd\n00:0C:7E\t\tTellium Incorporated\n00:0C:7F\t\tsynertronixx GmbH\n00:0C:80\t\tOpelcomm Inc.\n00:0C:81\t\tSchneider Electric (Australia)\n00:0C:82\t\tNetwork Technologies Inc\n00:0C:83\t\tLogical Solutions\n00:0C:84\t\tEazix, Inc.\n00:0C:85\t\tCisco Systems, Inc\n00:0C:86\t\tCisco Systems, Inc\n00:0C:87\t\tAmd\n00:0C:88\t\tApache Micro Peripherals, Inc.\n00:0C:89\t\tAC Electric Vehicles, Ltd.\n00:0C:8A\t\tBose Corporation\n00:0C:8B\t\tConnect Tech Inc\n00:0C:8C\t\tKodicom Co.,Ltd.\n00:0C:8D\t\tBalluff MV GmbH\n00:0C:8E\t\tMentor Engineering Inc\n00:0C:8F\t\tNergal s.r.l.\n00:0C:90\t\tOctasic Inc.\n00:0C:91\t\tRiverhead Networks Inc.\n00:0C:92\t\tWolfVision Gmbh\n00:0C:93\t\tXeline Co., Ltd.\n00:0C:94\t\tUnited Electronic Industries, Inc. (EUI)\n00:0C:95\t\tPrimeNet\n00:0C:96\t\tOQO, Inc.\n00:0C:97\t\tNV ADB TTV Technologies SA\n00:0C:98\t\tLETEK Communications Inc.\n00:0C:99\t\tHITEL LINK Co.,Ltd\n00:0C:9A\t\tHitech Electronics Corp.\n00:0C:9B\t\tEE Solutions, Inc\n00:0C:9C\t\tChongho information & communications\n00:0C:9D\t\tUbeeAirWalk, Inc.\n00:0C:9E\t\tMemoryLink Corp.\n00:0C:9F\t\tNKE Corporation\n00:0C:A0\t\tStorCase Technology, Inc.\n00:0C:A1\t\tSIGMACOM Co., LTD.\n00:0C:A2\t\tHarmonic Video Network\n00:0C:A3\t\tRancho Technology, Inc.\n00:0C:A4\t\tPrompttec Product Management GmbH\n00:0C:A5\t\tNaman NZ LTd\n00:0C:A6\t\tMintera Corporation\n00:0C:A7\t\tMetro (Suzhou) Technologies Co., Ltd.\n00:0C:A8\t\tGaruda Networks Corporation\n00:0C:A9\t\tEbtron Inc.\n00:0C:AA\t\tCubic Transportation Systems Inc\n00:0C:AB\t\tCommend International GmbH\n00:0C:AC\t\tCitizen Watch Co., Ltd.\n00:0C:AD\t\tBTU International\n00:0C:AE\t\tAilocom Oy\n00:0C:AF\t\tTri Term Co.,Ltd.\n00:0C:B0\t\tStar Semiconductor Corporation\n00:0C:B1\t\tSalland Engineering (Europe) BV\n00:0C:B2\t\tUNION co., ltd.\n00:0C:B3\t\tROUND Co.,Ltd.\n00:0C:B4\t\tAutoCell Laboratories, Inc.\n00:0C:B5\t\tPremier Technolgies, Inc\n00:0C:B6\t\tNanjing Seu Mobile & Internet Technology Co.,Ltd\n00:0C:B7\t\tNanjing Huazhuo Electronics Co., Ltd.\n00:0C:B8\t\tMedion Ag\n00:0C:B9\t\tLea\n00:0C:BA\t\tJamex, Inc.\n00:0C:BB\t\tIskraemeco\n00:0C:BC\t\tIscutum\n00:0C:BD\t\tInterface Masters, Inc\n00:0C:BE\t\tInnominate Security Technologies AG\n00:0C:BF\t\tHoly Stone Ent. Co., Ltd.\n00:0C:C0\t\tGenera Oy\n00:0C:C1\t\tEaton Corporation\n00:0C:C2\t\tControlNet (India) Private Limited\n00:0C:C3\t\tBeWAN systems\n00:0C:C4\t\tTiptel AG\n00:0C:C5\t\tNextlink Co., Ltd.\n00:0C:C6\t\tKa-Ro electronics GmbH\n00:0C:C7\t\tIntelligent Computer Solutions Inc.\n00:0C:C8\t\tXytronix Research & Design, Inc.\n00:0C:C9\t\tIlwoo Data & Technology Co.,Ltd\n00:0C:CA\t\tHGST a Western Digital Company\n00:0C:CB\t\tDesign Combus Ltd\n00:0C:CC\t\tAeroscout Ltd.\n00:0C:CD\t\tIec - Tc57\n00:0C:CE\t\tCisco Systems, Inc\n00:0C:CF\t\tCisco Systems, Inc\n00:0C:D0\t\tSymetrix\n00:0C:D1\t\tSFOM Technology Corp.\n00:0C:D2\t\tSchaffner EMV AG\n00:0C:D3\t\tPrettl Elektronik Radeberg GmbH\n00:0C:D4\t\tPositron Public Safety Systems inc.\n00:0C:D5\t\tPassave Inc.\n00:0C:D6\t\tPartner Tech\n00:0C:D7\t\tNallatech Ltd\n00:0C:D8\t\tM. K. Juchheim GmbH & Co\n00:0C:D9\t\tItcare Co., Ltd\n00:0C:DA\t\tFreeHand Systems, Inc.\n00:0C:DB\t\tBrocade Communications Systems LLC\n00:0C:DC\t\tBECS Technology, Inc\n00:0C:DD\t\tAOS technologies AG\n00:0C:DE\t\tABB STOTZ-KONTAKT GmbH\n00:0C:DF\t\tJAI Manufacturing\n00:0C:E0\t\tTrek Diagnostics Inc.\n00:0C:E1\t\tThe Open Group\n00:0C:E2\t\tRolls-Royce\n00:0C:E3\t\tOption International N.V.\n00:0C:E4\t\tNeuroCom International, Inc.\n00:0C:E5\t\tCommscope\n00:0C:E6\t\tFortinet, Inc.\n00:0C:E7\t\tMediaTek Inc\n00:0C:E8\t\tGuangZhou AnJuBao Co., Ltd\n00:0C:E9\t\tBloomberg L.P.\n00:0C:EA\t\taphona Kommunikationssysteme\n00:0C:EB\t\tCNMP Networks, Inc.\n00:0C:EC\t\tSafran Trusted 4D Inc.\n00:0C:ED\t\tReal Digital Media\n00:0C:EE\t\tjp-embedded\n00:0C:EF\t\tONE Investment Group Limited\n00:0C:F0\t\tM & N GmbH\n00:0C:F1\t\tIntel Corporation\n00:0C:F2\t\tGAMESA Eólica\n00:0C:F3\t\tCall Image Sa\n00:0C:F4\t\tAkatsuki Electric Mfg.Co.,Ltd.\n00:0C:F5\t\tInfoExpress\n00:0C:F6\t\tSitecom Europe BV\n00:0C:F7\t\tNortel Networks\n00:0C:F8\t\tNortel Networks\n00:0C:F9\t\tXylem Water Solutions\n00:0C:FA\t\tDigital Systems Corp\n00:0C:FB\t\tKorea Network Systems\n00:0C:FC\t\tS2io Technologies Corp\n00:0C:FD\t\tHyundai ImageQuest Co.,Ltd.\n00:0C:FE\t\tGrand Electronic Co., Ltd\n00:0C:FF\t\tMRO-TEK Realty Limited\n00:0D:00\t\tSeaway Networks Inc.\n00:0D:01\t\tP&E Microcomputer Systems, Inc.\n00:0D:02\t\tNEC Platforms, Ltd.\n00:0D:03\t\tMatrics, Inc.\n00:0D:04\t\tFoxboro Eckardt Development GmbH\n00:0D:05\t\tcybernet manufacturing inc.\n00:0D:06\t\tCompulogic Limited\n00:0D:07\t\tCalrec Audio Ltd\n00:0D:08\t\tAboveCable, Inc.\n00:0D:09\t\tYuehua(Zhuhai) Electronic CO. LTD\n00:0D:0A\t\tBarco Projection Systems NV\n00:0D:0B\t\tBuffalo.Inc\n00:0D:0C\t\tMDI Security Systems\n00:0D:0D\t\tITSupported, LLC\n00:0D:0E\t\tInqnet Systems, Inc.\n00:0D:0F\t\tFinlux Ltd\n00:0D:10\t\tEmbedtronics Oy\n00:0D:11\t\tDENTSPLY - Gendex\n00:0D:12\t\tAXELL Corporation\n00:0D:13\t\tWilhelm Rutenbeck GmbH&Co.KG\n00:0D:14\t\tVtech Innovation LP dba Advanced American Telephones\n00:0D:15\t\tVoipac s.r.o.\n00:0D:16\t\tUHS Systems Pty Ltd\n00:0D:17\t\tTurbo Networks Co.Ltd\n00:0D:18\t\tMega-Trend Electronics CO., LTD.\n00:0D:19\t\tROBE Show lighting\n00:0D:1A\t\tMustek System Inc.\n00:0D:1B\t\tKyoto Electronics Manufacturing Co., Ltd.\n00:0D:1C\t\tAmesys Defense\n00:0D:1D\t\tHigh-Tek Harness Ent. Co., Ltd.\n00:0D:1E\t\tControl Techniques\n00:0D:1F\t\tAV Digital\n00:0D:20\t\tAsahikasei Technosystem Co.,Ltd.\n00:0D:21\t\tWISCORE Inc.\n00:0D:22\t\tUnitronics LTD\n00:0D:23\t\tSmart Solution, Inc\n00:0D:24\t\tSentec E&E Co., Ltd.\n00:0D:25\t\tSanden Corporation\n00:0D:26\t\tPrimagraphics Limited\n00:0D:27\t\tMICROPLEX Printware AG\n00:0D:28\t\tCisco Systems, Inc\n00:0D:29\t\tCisco Systems, Inc\n00:0D:2A\t\tScanmatic AS\n00:0D:2B\t\tRacal Instruments\n00:0D:2C\t\tLantronix\n00:0D:2D\t\tNCT Deutschland GmbH\n00:0D:2E\t\tMatsushita Avionics Systems Corporation\n00:0D:2F\t\tAIN Comm.Tech.Co., LTD\n00:0D:30\t\tIceFyre Semiconductor\n00:0D:31\t\tCompellent Technologies, Inc.\n00:0D:32\t\tDispenseSource, Inc.\n00:0D:33\t\tPrediwave Corp.\n00:0D:34\t\tShell International Exploration and Production, Inc.\n00:0D:35\t\tPAC International Ltd\n00:0D:36\t\tWu Han Routon Electronic Co., Ltd\n00:0D:37\t\tWiplug\n00:0D:38\t\tNissin Inc.\n00:0D:39\t\tNevion\n00:0D:3A\t\tMicrosoft Corp.\n00:0D:3B\t\tMicroelectronics Technology Inc.\n00:0D:3C\t\ti.Tech Dynamic Ltd\n00:0D:3D\t\tHammerhead Systems, Inc.\n00:0D:3E\t\tAPLUX Communications Ltd.\n00:0D:3F\t\tVTI Instruments Corporation\n00:0D:40\t\tVerint Loronix Video Solutions\n00:0D:41\t\tSiemens AG ICM MP UC RD IT KLF1\n00:0D:42\t\tNewbest Development Limited\n00:0D:43\t\tDRS Tactical Systems Inc.\n00:0D:44\t\tAudio BU - Logitech\n00:0D:45\t\tTottori SANYO Electric Co., Ltd.\n00:0D:46\t\tParker SSD Drives\n00:0D:47\t\tCollex\n00:0D:48\t\tAEWIN Technologies Co., Ltd.\n00:0D:49\t\tTriton Systems of Delaware, Inc.\n00:0D:4A\t\tSteag ETA-Optik\n00:0D:4B\t\tRoku, Inc.\n00:0D:4C\t\tOutline Electronics Ltd.\n00:0D:4D\t\tNinelanes\n00:0D:4E\t\tNDR Co.,LTD.\n00:0D:4F\t\tKenwood Corporation\n00:0D:50\t\tGalazar Networks\n00:0D:51\t\tDIVR Systems, Inc.\n00:0D:52\t\tComart system\n00:0D:53\t\tBeijing 5w Communication Corp.\n00:0D:54\t\t3Com Ltd\n00:0D:55\t\tSANYCOM Technology Co.,Ltd\n00:0D:56\t\tDell Inc.\n00:0D:57\t\tFujitsu I-Network Systems Limited.\n00:0D:58\t\tPrivate\n00:0D:59\t\tAmity Systems, Inc.\n00:0D:5A\t\tTiesse SpA\n00:0D:5B\t\tSmart Empire Investments Limited\n00:0D:5C\t\tRobert Bosch GmbH, VT-ATMO\n00:0D:5D\t\tRaritan Computer, Inc\n00:0D:5E\t\tNEC Personal Products\n00:0D:5F\t\tMinds Inc\n00:0D:60\t\tIBM Corp\n00:0D:61\t\tGiga-Byte Technology Co., Ltd.\n00:0D:62\t\tFunkwerk Dabendorf GmbH\n00:0D:63\t\tDENT Instruments, Inc.\n00:0D:64\t\tCOMAG Handels AG\n00:0D:65\t\tCisco Systems, Inc\n00:0D:66\t\tCisco Systems, Inc\n00:0D:67\t\tEricsson\n00:0D:68\t\tVinci Systems, Inc.\n00:0D:69\t\tTMT&D Corporation\n00:0D:6A\t\tRedwood Technologies LTD\n00:0D:6B\t\tMita-Teknik A/S\n00:0D:6C\t\tM-Audio\n00:0D:6D\t\tK-Tech Devices Corp.\n00:0D:6E\t\tK-Patents Oy\n00:0D:6F\t\tEmber Corporation\n00:0D:70\t\tDatamax Corporation\n00:0D:71\t\tboca systems\n00:0D:72\t\t2Wire Inc\n00:0D:73\t\tTechnical Support, Inc.\n00:0D:74\t\tSand Network Systems, Inc.\n00:0D:75\t\tKobian Pte Ltd - Taiwan Branch\n00:0D:76\t\tHokuto Denshi Co,. Ltd.\n00:0D:77\t\tFalconStor Software\n00:0D:78\t\tEngineering & Security\n00:0D:79\t\tDynamic Solutions Co,.Ltd.\n00:0D:7A\t\tDiGATTO Asia Pacific Pte Ltd\n00:0D:7B\t\tConsensys Computers Inc.\n00:0D:7C\t\tCodian Ltd\n00:0D:7D\t\tAfco Systems\n00:0D:7E\t\tAxiowave Networks, Inc.\n00:0D:7F\t\tMIDAS  COMMUNICATION TECHNOLOGIES PTE LTD ( Foreign Branch)\n00:0D:80\t\tOnline Development Inc\n00:0D:81\t\tPepperl+Fuchs GmbH\n00:0D:82\t\tPhsnet\n00:0D:83\t\tSanmina-SCI Hungary  Ltd.\n00:0D:84\t\tMakus Inc.\n00:0D:85\t\tTapwave, Inc.\n00:0D:86\t\tHuber + Suhner AG\n00:0D:87\t\tElitegroup Computer Systems Co.,Ltd.\n00:0D:88\t\tD-Link Corporation\n00:0D:89\t\tBils Technology Inc\n00:0D:8A\t\tWinners Electronics Co., Ltd.\n00:0D:8B\t\tT&D Corporation\n00:0D:8C\t\tShanghai Wedone Digital Ltd. CO.\n00:0D:8D\t\tProsoft Technology, Inc\n00:0D:8E\t\tKoden Electronics Co., Ltd.\n00:0D:8F\t\tKing Tsushin Kogyo Co., LTD.\n00:0D:90\t\tFactum Electronics AB\n00:0D:91\t\tEclipse (HQ Espana) S.L.\n00:0D:92\t\tARIMA Communications Corp.\n00:0D:93\t\tApple, Inc.\n00:0D:94\t\tAFAR Communications,Inc\n00:0D:95\t\tOpti-cell, Inc.\n00:0D:96\t\tVtera Technology Inc.\n00:0D:97\t\tHitachi Energy USA Inc.\n00:0D:98\t\tS.W.A.C. Schmitt-Walter Automation Consult GmbH\n00:0D:99\t\tOrbital Sciences Corp.; Launch Systems Group\n00:0D:9A\t\tInfotec Ltd\n00:0D:9B\t\tHeraeus Electro-Nite International N.V.\n00:0D:9C\t\tK.A. Schmersal GmbH & Co. KG\n00:0D:9D\t\tHewlett Packard\n00:0D:9E\t\tTOKUDEN OHIZUMI SEISAKUSYO Co.,Ltd.\n00:0D:9F\t\tRF Micro Devices\n00:0D:A0\t\tNedap N.V.\n00:0D:A1\t\tMIRAE ITS Co.,LTD.\n00:0D:A2\t\tInfrant Technologies, Inc.\n00:0D:A3\t\tEmerging Technologies Limited\n00:0D:A4\t\tDosch & Amand Systems Ag\n00:0D:A5\t\tFabric7 Systems, Inc\n00:0D:A6\t\tUniversal Switching Corporation\n00:0D:A7\t\tPrivate\n00:0D:A8\t\tTeletronics Technology Corporation\n00:0D:A9\t\tIngeteam\n00:0D:AA\t\tS.A.Tehnology co.,Ltd.\n00:0D:AB\t\tParker Hannifin GmbH Electromechanical Division Europe\n00:0D:AC\t\tJapan CBM Corporation\n00:0D:AD\t\tDataprobe, Inc.\n00:0D:AE\t\tSamsung Heavy Industries Co., Ltd.\n00:0D:AF\t\tPlexus Corp (UK) Ltd\n00:0D:B0\t\tOlym-tech Co.,Ltd.\n00:0D:B1\t\tJapan Network Service Co., Ltd.\n00:0D:B2\t\tAmmasso, Inc.\n00:0D:B3\t\tSDO Communication Corperation\n00:0D:B4\t\tStormshield\n00:0D:B5\t\tGlobalsat Technology Corporation\n00:0D:B6\t\tBroadcom\n00:0D:B7\t\tSanko Electric Co,.Ltd\n00:0D:B8\t\tSchiller Ag\n00:0D:B9\t\tPC Engines GmbH\n00:0D:BA\t\tOcé Document Technologies GmbH\n00:0D:BB\t\tNippon Dentsu Co.,Ltd.\n00:0D:BC\t\tCisco Systems, Inc\n00:0D:BD\t\tCisco Systems, Inc\n00:0D:BE\t\tBel Fuse Europe Ltd.,UK\n00:0D:BF\t\tTekTone Sound & Signal Mfg., Inc.\n00:0D:C0\t\tSpagat AS\n00:0D:C1\t\tSafeWeb Inc\n00:0D:C2\t\tPrivate\n00:0D:C3\t\tFirst Communication, Inc.\n00:0D:C4\t\tEmcore Corporation\n00:0D:C5\t\tEchoStar Global B.V.\n00:0D:C6\t\tDigiRose Technology Co., Ltd.\n00:0D:C7\t\tCosmic Engineering Inc.\n00:0D:C8\t\tAirMagnet, Inc\n00:0D:C9\t\tTHALES Elektronik Systeme GmbH\n00:0D:CA\t\tTait Electronics\n00:0D:CB\t\tPetcomkorea Co., Ltd.\n00:0D:CC\t\tNEOSMART Corp.\n00:0D:CD\t\tGroupe Txcom\n00:0D:CE\t\tDynavac Technology Pte Ltd\n00:0D:CF\t\tCidra Corp.\n00:0D:D0\t\tTetraTec Instruments GmbH\n00:0D:D1\t\tStryker Corporation\n00:0D:D2\t\tSimrad Optronics ASA\n00:0D:D3\t\tSAMWOO Telecommunication Co.,Ltd.\n00:0D:D4\t\tSymantec Corporation\n00:0D:D5\t\tO'Rite Technology Co.,Ltd\n00:0D:D6\t\tIti    Ltd\n00:0D:D7\t\tBright\n00:0D:D8\t\tBbn\n00:0D:D9\t\tAnton Paar GmbH\n00:0D:DA\t\tAllied Telesis K.K.\n00:0D:DB\t\tAirwave Technologies Inc.\n00:0D:DC\t\tVac\n00:0D:DD\t\tProfilo Telra Elektronik Sanayi ve Ticaret. A.Ş\n00:0D:DE\t\tJoyteck Co., Ltd.\n00:0D:DF\t\tJapan Image & Network Inc.\n00:0D:E0\t\tICPDAS Co.,LTD\n00:0D:E1\t\tControl Products, Inc.\n00:0D:E2\t\tCMZ Sistemi Elettronici\n00:0D:E3\t\tAT Sweden AB\n00:0D:E4\t\tDIGINICS, Inc.\n00:0D:E5\t\tSamsung Thales\n00:0D:E6\t\tYoungbo Engineering Co.,Ltd\n00:0D:E7\t\tSnap-on OEM Group\n00:0D:E8\t\tNasaco Electronics Pte. Ltd\n00:0D:E9\t\tNapatech Aps\n00:0D:EA\t\tKingtel Telecommunication Corp.\n00:0D:EB\t\tCompXs Limited\n00:0D:EC\t\tCisco Systems, Inc\n00:0D:ED\t\tCisco Systems, Inc\n00:0D:EE\t\tAndrew RF Power Amplifier Group\n00:0D:EF\t\tSoc. Coop. Bilanciai\n00:0D:F0\t\tQcom Technology Inc.\n00:0D:F1\t\tIonix Inc.\n00:0D:F2\t\tPrivate\n00:0D:F3\t\tAsmax Solutions\n00:0D:F4\t\tWatertek Co.\n00:0D:F5\t\tTeletronics International Inc.\n00:0D:F6\t\tTechnology Thesaurus Corp.\n00:0D:F7\t\tSpace Dynamics Lab\n00:0D:F8\t\tORGA Kartensysteme GmbH\n00:0D:F9\t\tNDS Limited\n00:0D:FA\t\tMicro Control Systems Ltd.\n00:0D:FB\t\tKomax AG\n00:0D:FC\t\tITFOR Inc.\n00:0D:FD\t\tHuges Hi-Tech Inc.,\n00:0D:FE\t\tHauppauge Computer Works, Inc.\n00:0D:FF\t\tChenming Mold Industry Corp.\n00:0E:00\t\tAtrie\n00:0E:01\t\tASIP Technologies Inc.\n00:0E:02\t\tAdvantech AMT Inc.\n00:0E:03\t\tEmulex Corporation\n00:0E:04\t\tCMA/Microdialysis AB\n00:0E:05\t\tWireless Matrix Corp.\n00:0E:06\t\tTeam Simoco Ltd\n00:0E:07\t\tSony Corporation\n00:0E:08\t\tCisco-Linksys, LLC\n00:0E:09\t\tShenzhen Coship Software Co.,LTD.\n00:0E:0A\t\tSakuma Design Office\n00:0E:0B\t\tNetac Technology Co., Ltd.\n00:0E:0C\t\tIntel Corporation\n00:0E:0D\t\tHesch Schröder GmbH\n00:0E:0E\t\tESA elettronica S.P.A.\n00:0E:0F\t\tErmme\n00:0E:10\t\tC-guys, Inc.\n00:0E:11\t\tBDT Büro und Datentechnik GmbH & Co.KG\n00:0E:12\t\tAdaptive Micro Systems Inc.\n00:0E:13\t\tAccu-Sort Systems inc.\n00:0E:14\t\tVisionary Solutions, Inc.\n00:0E:15\t\tTadlys LTD\n00:0E:16\t\tSouthWing S.L.\n00:0E:17\t\tPrivate\n00:0E:18\t\tMyA Technology\n00:0E:19\t\tLogicaCMG Pty Ltd\n00:0E:1A\t\tJPS Communications\n00:0E:1B\t\tIAV GmbH\n00:0E:1C\t\tHach Company\n00:0E:1D\t\tARION Technology Inc.\n00:0E:1E\t\tQLogic Corporation\n00:0E:1F\t\tTCL Networks Equipment Co., Ltd.\n00:0E:20\t\tACCESS Systems Americas, Inc.\n00:0E:21\t\tMTU Friedrichshafen GmbH\n00:0E:22\t\tPrivate\n00:0E:23\t\tIncipient, Inc.\n00:0E:24\t\tHuwell Technology Inc.\n00:0E:25\t\tHannae Technology Co., Ltd\n00:0E:26\t\tGincom Technology Corp.\n00:0E:27\t\tCrere Networks, Inc.\n00:0E:28\t\tDynamic Ratings P/L\n00:0E:29\t\tShester Communications Inc\n00:0E:2A\t\tdormakaba USA Inc.\n00:0E:2B\t\tSafari Technologies\n00:0E:2C\t\tNetcodec co.\n00:0E:2D\t\tHyundai Digital Technology Co.,Ltd.\n00:0E:2E\t\tEdimax Technology Co. Ltd.\n00:0E:2F\t\tRoche Diagnostics GmbH\n00:0E:30\t\tAERAS Networks, Inc.\n00:0E:31\t\tOlympus Soft Imaging Solutions GmbH\n00:0E:32\t\tKontron Medical\n00:0E:33\t\tShuko Electronics Co.,Ltd\n00:0E:34\t\tNexGen City, LP\n00:0E:35\t\tIntel Corporation\n00:0E:36\t\tHEINESYS, Inc.\n00:0E:37\t\tHarms & Wende GmbH & Co.KG\n00:0E:38\t\tCisco Systems, Inc\n00:0E:39\t\tCisco Systems, Inc\n00:0E:3A\t\tCirrus Logic\n00:0E:3B\t\tHawking Technologies, Inc.\n00:0E:3C\t\tTransact Technologies Inc\n00:0E:3D\t\tTelevic N.V.\n00:0E:3E\t\tSun Optronics Inc\n00:0E:3F\t\tSoronti, Inc.\n00:0E:40\t\tNortel Networks\n00:0E:41\t\tNihon Mechatronics Co.,Ltd.\n00:0E:42\t\tMotic Incoporation Ltd.\n00:0E:43\t\tG-Tek Electronics Sdn. Bhd.\n00:0E:44\t\tDigital 5, Inc.\n00:0E:45\t\tBeijing Newtry Electronic Technology Ltd\n00:0E:46\t\tNiigata Seimitsu Co.,Ltd.\n00:0E:47\t\tNCI System Co.,Ltd.\n00:0E:48\t\tLipman TransAction Solutions\n00:0E:49\t\tForsway Scandinavia AB\n00:0E:4A\t\tChangchun Huayu WEBPAD Co.,LTD\n00:0E:4B\t\tatrium c and i\n00:0E:4C\t\tBermai Inc.\n00:0E:4D\t\tNumesa Inc.\n00:0E:4E\t\tWaveplus Technology Co., Ltd.\n00:0E:4F\t\tTrajet GmbH\n00:0E:50\t\tThomson Telecom Belgium\n00:0E:51\t\tTECNA SpA\n00:0E:52\t\tOptium Corporation\n00:0E:53\t\tAv Tech Corporation\n00:0E:54\t\tAlphaCell Wireless Ltd.\n00:0E:55\t\tAuvitran\n00:0E:56\t\t4G Systems GmbH & Co. KG\n00:0E:57\t\tIworld Networking, Inc.\n00:0E:58\t\tSonos, Inc.\n00:0E:59\t\tSagemcom Broadband SAS\n00:0E:5A\t\tTELEFIELD inc.\n00:0E:5B\t\tParkerVision - Direct2Data\n00:0E:5C\t\tCommscope\n00:0E:5D\t\tTriple Play Technologies A/S\n00:0E:5E\t\tRaisecom Technology CO., LTD\n00:0E:5F\t\tactiv-net GmbH & Co. KG\n00:0E:60\t\t360SUN Digital Broadband Corporation\n00:0E:61\t\tMicrotrol Limited\n00:0E:62\t\tNortel Networks\n00:0E:63\t\tLemke Diagnostics GmbH\n00:0E:64\t\tElphel, Inc\n00:0E:65\t\tTransCore\n00:0E:66\t\tHitachi Industry & Control Solutions, Ltd.\n00:0E:67\t\tEltis Microelectronics Ltd.\n00:0E:68\t\tE-TOP Network Technology Inc.\n00:0E:69\t\tChina Electric Power Research Institute\n00:0E:6A\t\t3Com Ltd\n00:0E:6B\t\tJanitza electronics GmbH\n00:0E:6C\t\tDevice Drivers Limited\n00:0E:6D\t\tMurata Manufacturing Co., Ltd.\n00:0E:6E\t\tMAT S.A. (Mircrelec Advanced Technology)\n00:0E:6F\t\tIRIS Corporation Berhad\n00:0E:70\t\tin2 Networks\n00:0E:71\t\tGemstar Technology Development Ltd.\n00:0E:72\t\tArca Technologies S.r.l.\n00:0E:73\t\tTpack A/S\n00:0E:74\t\tSolar Telecom. Tech\n00:0E:75\t\tNew York Air Brake Corp.\n00:0E:76\t\tGemsoc Innovision Inc.\n00:0E:77\t\tDecru, Inc.\n00:0E:78\t\tAmtelco\n00:0E:79\t\tAmple Communications Inc.\n00:0E:7A\t\tGemWon Communications Co., Ltd.\n00:0E:7B\t\tToshiba\n00:0E:7C\t\tTeleves S.A.\n00:0E:7D\t\tElectronics Line 3000 Ltd.\n00:0E:7E\t\tionSign Oy\n00:0E:7F\t\tHewlett Packard\n00:0E:80\t\tThomson Technology Inc\n00:0E:81\t\tDevicescape Software, Inc.\n00:0E:82\t\tInfinity Tech\n00:0E:83\t\tCisco Systems, Inc\n00:0E:84\t\tCisco Systems, Inc\n00:0E:85\t\tCatalyst Enterprises, Inc.\n00:0E:86\t\tAlcatel North America\n00:0E:87\t\tadp Gauselmann GmbH\n00:0E:88\t\tVideotron Corp.\n00:0E:89\t\tClematic\n00:0E:8A\t\tAvara Technologies Pty. Ltd.\n00:0E:8B\t\tAstarte Technology Co, Ltd.\n00:0E:8C\t\tSiemens AG\n00:0E:8D\t\tSystems in Progress Holding GmbH\n00:0E:8E\t\tSparkLAN Communications, Inc.\n00:0E:8F\t\tSercomm Corporation.\n00:0E:90\t\tPonico Corp.\n00:0E:91\t\tNavico Auckland Ltd\n00:0E:92\t\tOpen Telecom\n00:0E:93\t\tMilénio 3 Sistemas Electrónicos, Lda.\n00:0E:94\t\tMaas International BV\n00:0E:95\t\tFujiya Denki Seisakusho Co.,Ltd.\n00:0E:96\t\tCubic Defense Applications, Inc.\n00:0E:97\t\tUltracker Technology CO., Inc\n00:0E:98\t\tHME Clear-Com LTD.\n00:0E:99\t\tSpectrum Digital, Inc\n00:0E:9A\t\tBoe Technology Group Co.,Ltd\n00:0E:9B\t\tAmbit Microsystems Corporation\n00:0E:9C\t\tBenchmark Electronics\n00:0E:9D\t\tTiscali UK Ltd\n00:0E:9E\t\tTopfield Co., Ltd\n00:0E:9F\t\tTEMIC SDS GmbH\n00:0E:A0\t\tNetKlass Technology Inc.\n00:0E:A1\t\tFormosa Teletek Corporation\n00:0E:A2\t\tMcAfee, Inc\n00:0E:A3\t\tCNCR-IT CO.,LTD,HangZhou P.R.CHINA\n00:0E:A4\t\tQuantum Corp.\n00:0E:A5\t\tBLIP Systems\n00:0E:A6\t\tASUSTek COMPUTER INC.\n00:0E:A7\t\tEndace Technology\n00:0E:A8\t\tUnited Technologists Europe Limited\n00:0E:A9\t\tShanghai Xun Shi Communications Equipment Ltd. Co.\n00:0E:AA\t\tScalent Systems, Inc.\n00:0E:AB\t\tCray Inc\n00:0E:AC\t\tMintron Enterprise Co., Ltd.\n00:0E:AD\t\tMetanoia Technologies, Inc.\n00:0E:AE\t\tGawell Technologies Corp.\n00:0E:AF\t\tCastel\n00:0E:B0\t\tSolutions Radio BV\n00:0E:B1\t\tNewcotech,Ltd\n00:0E:B2\t\tMicro-Research Finland Oy\n00:0E:B3\t\tHewlett Packard\n00:0E:B4\t\tGuangzhou Gaoke Communications Technology Co.Ltd.\n00:0E:B5\t\tEcastle Electronics Co., Ltd.\n00:0E:B6\t\tRiverbed Technology, Inc.\n00:0E:B7\t\tKnovative, Inc.\n00:0E:B8\t\tIiga co.,Ltd\n00:0E:B9\t\tHASHIMOTO Electronics Industry Co.,Ltd.\n00:0E:BA\t\tHanmi Semiconductor Co., Ltd.\n00:0E:BB\t\tEverbee Networks\n00:0E:BC\t\tParagon Fidelity GmbH\n00:0E:BD\t\tBurdick, a Quinton Compny\n00:0E:BE\t\tB&B Electronics Manufacturing Co.\n00:0E:BF\t\tRemsdaq Limited\n00:0E:C0\t\tNortel Networks\n00:0E:C1\t\tMYNAH Technologies\n00:0E:C2\t\tLowrance Electronics, Inc.\n00:0E:C3\t\tLogic Controls, Inc.\n00:0E:C4\t\tIskra Transmission d.d.\n00:0E:C5\t\tDigital Multitools Inc\n00:0E:C6\t\tAsix Electronics Corp.\n00:0E:C7\t\tMotorola Korea\n00:0E:C8\t\tZoran Corporation\n00:0E:C9\t\tYOKO Technology Corp.\n00:0E:CA\t\tWTSS Inc\n00:0E:CB\t\tVineSys Technology\n00:0E:CC\t\tTableau, LLC\n00:0E:CD\t\tSkov A/S\n00:0E:CE\t\tS.I.T.T.I. S.p.A.\n00:0E:CF\t\tPROFIBUS Nutzerorganisation e.V.\n00:0E:D0\t\tPrivaris, Inc.\n00:0E:D1\t\tOsaka Micro Computer.\n00:0E:D2\t\tFiltronic plc\n00:0E:D3\t\tEpicenter, Inc.\n00:0E:D4\t\tCresitt Industrie\n00:0E:D5\t\tCOPAN Systems Inc.\n00:0E:D6\t\tCisco Systems, Inc\n00:0E:D7\t\tCisco Systems, Inc\n00:0E:D8\t\tPositron Access Solutions Corp\n00:0E:D9\t\tAksys, Ltd.\n00:0E:DA\t\tC-Tech United Corp.\n00:0E:DB\t\tXiNCOM Corp.\n00:0E:DC\t\tTellion INC.\n00:0E:DD\t\tShure Incorporated\n00:0E:DE\t\tREMEC, Inc.\n00:0E:DF\t\tPLX Technology\n00:0E:E0\t\tMcharge\n00:0E:E1\t\tExtremeSpeed Inc.\n00:0E:E2\t\tCustom Engineering\n00:0E:E3\t\tChiyu Technology Co.,Ltd\n00:0E:E4\t\tBoe Technology Group Co.,Ltd\n00:0E:E5\t\tbitWallet, Inc.\n00:0E:E6\t\tAdimos Systems LTD\n00:0E:E7\t\tAac Electronics Corp.\n00:0E:E8\t\tZioncom Electronics (Shenzhen) Ltd.\n00:0E:E9\t\tWayTech Development, Inc.\n00:0E:EA\t\tShadong Luneng Jicheng Electronics,Co.,Ltd\n00:0E:EB\t\tSandmartin(zhong shan)Electronics Co.,Ltd\n00:0E:EC\t\tOrban\n00:0E:ED\t\tNokia Danmark A/S\n00:0E:EE\t\tMuco Industrie BV\n00:0E:EF\t\tPrivate\n00:0E:F0\t\tFesto AG & Co. KG\n00:0E:F1\t\tEzquest Inc.\n00:0E:F2\t\tInfinico Corporation\n00:0E:F3\t\tSmartlabs, Inc.\n00:0E:F4\t\tKasda Networks Inc\n00:0E:F5\t\tiPAC Technology Co., Ltd.\n00:0E:F6\t\tE-TEN Information Systems Co., Ltd.\n00:0E:F7\t\tVulcan Portals Inc\n00:0E:F8\t\tSbc Asi\n00:0E:F9\t\tREA Elektronik GmbH\n00:0E:FA\t\tOptoway Technology Incorporation\n00:0E:FB\t\tMacey Enterprises\n00:0E:FC\t\tJTAG Technologies B.V.\n00:0E:FD\t\tFujinon Corporation\n00:0E:FE\t\tEndRun Technologies LLC\n00:0E:FF\t\tMegasolution,Inc.\n00:0F:00\t\tLegra Systems, Inc.\n00:0F:01\t\tDigitalks Inc\n00:0F:02\t\tDigicube Technology Co., Ltd\n00:0F:03\t\tCom&C Co., Ltd\n00:0F:04\t\tcim-usa inc\n00:0F:05\t\t3B System Inc.\n00:0F:06\t\tNortel Networks\n00:0F:07\t\tMangrove Systems, Inc.\n00:0F:08\t\tIndagon Oy\n00:0F:09\t\tPrivate\n00:0F:0A\t\tClear Edge Networks\n00:0F:0B\t\tKentima Technologies AB\n00:0F:0C\t\tSynchronic Engineering\n00:0F:0D\t\tHunt Electronic Co., Ltd.\n00:0F:0E\t\tWaveSplitter Technologies, Inc.\n00:0F:0F\t\tReal ID Technology Co., Ltd.\n00:0F:10\t\tRDM Corporation\n00:0F:11\t\tProdrive B.V.\n00:0F:12\t\tPanasonic Europe Ltd.\n00:0F:13\t\tNisca corporation\n00:0F:14\t\tMindray Co., Ltd.\n00:0F:15\t\tIcotera A/S\n00:0F:16\t\tJay How Technology Co.,\n00:0F:17\t\tInsta Elektro GmbH\n00:0F:18\t\tIndustrial Control Systems\n00:0F:19\t\tBoston Scientific\n00:0F:1A\t\tGaming Support B.V.\n00:0F:1B\t\tEgo Systems Inc.\n00:0F:1C\t\tDigitAll World Co., Ltd\n00:0F:1D\t\tCosmo Techs Co., Ltd.\n00:0F:1E\t\tChengdu KT Electric Co.of High & New Technology\n00:0F:1F\t\tDell Inc.\n00:0F:20\t\tHewlett Packard\n00:0F:21\t\tScientific Atlanta, Inc\n00:0F:22\t\tHelius, Inc.\n00:0F:23\t\tCisco Systems, Inc\n00:0F:24\t\tCisco Systems, Inc\n00:0F:25\t\tAimValley B.V.\n00:0F:26\t\tWorldAccxx  LLC\n00:0F:27\t\tTEAL Electronics, Inc.\n00:0F:28\t\tItronix Corporation\n00:0F:29\t\tAugmentix Corporation\n00:0F:2A\t\tCableware Electronics\n00:0F:2B\t\tGreenbell Systems\n00:0F:2C\t\tLantronix\n00:0F:2D\t\tChung-Hsin Electric & Machinery Mfg.Corp.\n00:0F:2E\t\tMegapower International Corp.\n00:0F:2F\t\tW-Linx Technology Co., Ltd.\n00:0F:30\t\tRaza Microelectronics Inc\n00:0F:31\t\tAllied Vision Technologies Canada Inc\n00:0F:32\t\tLootom Telcovideo Network (Wuxi) Co Ltd\n00:0F:33\t\tDUALi Inc.\n00:0F:34\t\tCisco Systems, Inc\n00:0F:35\t\tCisco Systems, Inc\n00:0F:36\t\tAccurate Techhnologies, Inc.\n00:0F:37\t\tXambala Incorporated\n00:0F:38\t\tNetstar\n00:0F:39\t\tIris Sensors\n00:0F:3A\t\tHisharp\n00:0F:3B\t\tFuji System Machines Co., Ltd.\n00:0F:3C\t\tEndeleo Limited\n00:0F:3D\t\tD-Link Corporation\n00:0F:3E\t\tCardioNet, Inc\n00:0F:3F\t\tBig Bear Networks\n00:0F:40\t\tOptical Internetworking Forum\n00:0F:41\t\tZipher Ltd\n00:0F:42\t\tXalyo Systems\n00:0F:43\t\tWasabi Systems Inc.\n00:0F:44\t\tTivella Inc.\n00:0F:45\t\tStretch, Inc.\n00:0F:46\t\tSinar Ag\n00:0F:47\t\tRobox Spa\n00:0F:48\t\tPolypix Inc.\n00:0F:49\t\tNorthover Solutions Limited\n00:0F:4A\t\tKyushu-kyohan co.,ltd\n00:0F:4B\t\tOracle Corporation\n00:0F:4C\t\tElextech INC\n00:0F:4D\t\tTalkSwitch\n00:0F:4E\t\tCellink\n00:0F:4F\t\tPCS Systemtechnik GmbH\n00:0F:50\t\tStreamScale Limited\n00:0F:51\t\tAzul Systems, Inc.\n00:0F:52\t\tYORK Refrigeration, Marine & Controls\n00:0F:53\t\tSolarflare Communications Inc.\n00:0F:54\t\tEntrelogic Corporation\n00:0F:55\t\tDatawire Communication Networks Inc.\n00:0F:56\t\tContinuum Photonics Inc\n00:0F:57\t\tCABLELOGIC Co., Ltd.\n00:0F:58\t\tAdder Technology Limited\n00:0F:59\t\tPhonak AG\n00:0F:5A\t\tPeribit Networks\n00:0F:5B\t\tDelta Information Systems, Inc.\n00:0F:5C\t\tDay One Digital Media Limited\n00:0F:5D\t\tGenexis BV\n00:0F:5E\t\tVeo\n00:0F:5F\t\tNicety Technologies Inc. (NTS)\n00:0F:60\t\tLifetron Co.,Ltd\n00:0F:61\t\tHewlett Packard\n00:0F:62\t\tAlcatel Bell Space N.V.\n00:0F:63\t\tObzerv Technologies\n00:0F:64\t\tD&R Electronica Weesp BV\n00:0F:65\t\ticube Corp.\n00:0F:66\t\tCisco-Linksys, LLC\n00:0F:67\t\tWest Instruments\n00:0F:68\t\tVavic Network Technology, Inc.\n00:0F:69\t\tSEW Eurodrive GmbH & Co. KG\n00:0F:6A\t\tNortel Networks\n00:0F:6B\t\tGateWare Communications GmbH\n00:0F:6C\t\tADDI-DATA GmbH\n00:0F:6D\t\tMidas Engineering\n00:0F:6E\t\tBBox\n00:0F:6F\t\tFTA Communication Technologies\n00:0F:70\t\tWintec Industries, inc.\n00:0F:71\t\tSanmei Electronics Co.,Ltd\n00:0F:72\t\tSandburst\n00:0F:73\t\tRS Automation Co., Ltd\n00:0F:74\t\tQamcom Technology AB\n00:0F:75\t\tFirst Silicon Solutions\n00:0F:76\t\tDigital Keystone, Inc.\n00:0F:77\t\tDentum Co.,Ltd\n00:0F:78\t\tDatacap Systems Inc\n00:0F:79\t\tBluetooth Interest Group Inc.\n00:0F:7A\t\tBeiJing NuQX Technology CO.,LTD\n00:0F:7B\t\tArce Sistemas, S.A.\n00:0F:7C\t\tACTi Corporation\n00:0F:7D\t\tXirrus\n00:0F:7E\t\tAblerex Electronics Co., LTD\n00:0F:7F\t\tUBSTORAGE Co.,Ltd.\n00:0F:80\t\tTrinity Security Systems,Inc.\n00:0F:81\t\tPAL Pacific Inc.\n00:0F:82\t\tMortara Instrument, Inc.\n00:0F:83\t\tBrainium Technologies Inc.\n00:0F:84\t\tAstute Networks, Inc.\n00:0F:85\t\tADDO-Japan Corporation\n00:0F:86\t\tBlackBerry RTS\n00:0F:87\t\tMaxcess International\n00:0F:88\t\tAMETEK, Inc.\n00:0F:89\t\tWinnertec System Co., Ltd.\n00:0F:8A\t\tWideView\n00:0F:8B\t\tOrion MultiSystems Inc\n00:0F:8C\t\tGigawavetech Pte Ltd\n00:0F:8D\t\tFAST TV-Server AG\n00:0F:8E\t\tDongyang Telecom Co.,Ltd.\n00:0F:8F\t\tCisco Systems, Inc\n00:0F:90\t\tCisco Systems, Inc\n00:0F:91\t\tAerotelecom Co.,Ltd.\n00:0F:92\t\tMicrohard Systems Inc.\n00:0F:93\t\tLandis+Gyr Ltd.\n00:0F:94\t\tGenexis BV\n00:0F:95\t\tELECOM Co.,LTD Laneed Division\n00:0F:96\t\tTelco Systems, Inc.\n00:0F:97\t\tAvanex Corporation\n00:0F:98\t\tAvamax Co. Ltd.\n00:0F:99\t\tAPAC opto Electronics Inc.\n00:0F:9A\t\tSynchrony, Inc.\n00:0F:9B\t\tRoss Video Limited\n00:0F:9C\t\tPanduit Corp\n00:0F:9D\t\tDisplayLink (UK) Ltd\n00:0F:9E\t\tMurrelektronik GmbH\n00:0F:9F\t\tCommscope\n00:0F:A0\t\tCanon Korea Inc.\n00:0F:A1\t\tGigabit Systems Inc.\n00:0F:A2\t\t2xWireless\n00:0F:A3\t\tAlpha Networks Inc.\n00:0F:A4\t\tSprecher Automation GmbH\n00:0F:A5\t\tBWA Technology GmbH\n00:0F:A6\t\tS2 Security Corporation\n00:0F:A7\t\tRaptor Networks Technology\n00:0F:A8\t\tPhotometrics, Inc.\n00:0F:A9\t\tPC Fabrik\n00:0F:AA\t\tNexus Technologies\n00:0F:AB\t\tKyushu Electronics Systems Inc.\n00:0F:AC\t\tIeee 802.11\n00:0F:AD\t\tFMN communications GmbH\n00:0F:AE\t\tE2O Communications\n00:0F:AF\t\tDialog Inc.\n00:0F:B0\t\tCompal Electronics INC.\n00:0F:B1\t\tCognio Inc.\n00:0F:B2\t\tBroadband Pacenet (India) Pvt. Ltd.\n00:0F:B3\t\tActiontec Electronics, Inc\n00:0F:B4\t\tTimespace Technology\n00:0F:B5\t\tNetgear\n00:0F:B6\t\tEuroplex Technologies\n00:0F:B7\t\tCavium\n00:0F:B8\t\tCallURL Inc.\n00:0F:B9\t\tAdaptive Instruments\n00:0F:BA\t\tTevebox AB\n00:0F:BB\t\tNokia Siemens Networks GmbH & Co. KG.\n00:0F:BC\t\tOnkey Technologies, Inc.\n00:0F:BD\t\tMRV Communications (Networks) LTD\n00:0F:BE\t\te-w/you Inc.\n00:0F:BF\t\tDGT Sp. z o.o.\n00:0F:C0\t\tDELCOMp\n00:0F:C1\t\tWAVE Corporation\n00:0F:C2\t\tUniwell Corporation\n00:0F:C3\t\tPalmPalm Technology, Inc.\n00:0F:C4\t\tNST co.,LTD.\n00:0F:C5\t\tKeyMed Ltd\n00:0F:C6\t\tEurocom Industries A/S\n00:0F:C7\t\tDionica R&D Ltd.\n00:0F:C8\t\tChantry Networks\n00:0F:C9\t\tAllnet GmbH\n00:0F:CA\t\tA-Jin Techline Co, Ltd\n00:0F:CB\t\t3Com Ltd\n00:0F:CC\t\tCommscope\n00:0F:CD\t\tNortel Networks\n00:0F:CE\t\tKikusui Electronics Corp.\n00:0F:CF\t\tDataWind Research\n00:0F:D0\t\tAstri\n00:0F:D1\t\tApplied Wireless Identifications Group, Inc.\n00:0F:D2\t\tEWA Technologies, Inc.\n00:0F:D3\t\tDigium\n00:0F:D4\t\tSoundcraft\n00:0F:D5\t\tSchwechat - RISE\n00:0F:D6\t\tSarotech Co., Ltd\n00:0F:D7\t\tHarman Music Group\n00:0F:D8\t\tForce, Inc.\n00:0F:D9\t\tFlexDSL Telecommunications AG\n00:0F:DA\t\tYazaki Corporation\n00:0F:DB\t\tWestell Technologies Inc.\n00:0F:DC\t\tUeda Japan  Radio Co., Ltd.\n00:0F:DD\t\tSordin Ab\n00:0F:DE\t\tSony Corporation\n00:0F:DF\t\tSOLOMON Technology Corp.\n00:0F:E0\t\tNComputing Co.,Ltd.\n00:0F:E1\t\tId Digital Corporation\n00:0F:E2\t\tHangzhou H3C Technologies Co., Limited\n00:0F:E3\t\tDamm Cellular Systems A/S\n00:0F:E4\t\tPantech Co.,Ltd\n00:0F:E5\t\tMercury Security Corporation\n00:0F:E6\t\tMBTech Systems, Inc.\n00:0F:E7\t\tLutron Electronics Co., Inc.\n00:0F:E8\t\tLobos, Inc.\n00:0F:E9\t\tGw Technologies Co.,Ltd.\n00:0F:EA\t\tGiga-Byte Technology Co.,Ltd.\n00:0F:EB\t\tCylon Controls\n00:0F:EC\t\tGopherTec Inc.\n00:0F:ED\t\tAnam Electronics Co., Ltd\n00:0F:EE\t\tXTec, Incorporated\n00:0F:EF\t\tThales e-Transactions GmbH\n00:0F:F0\t\tSunray Co. Ltd.\n00:0F:F1\t\tnex-G Systems Pte.Ltd\n00:0F:F2\t\tLoud Technologies Inc.\n00:0F:F3\t\tJung Myoung Communications&Technology\n00:0F:F4\t\tGuntermann & Drunck GmbH\n00:0F:F5\t\tGN&S company\n00:0F:F6\t\tDarfon Lighting Corp\n00:0F:F7\t\tCisco Systems, Inc\n00:0F:F8\t\tCisco Systems, Inc\n00:0F:F9\t\tValcretec, Inc.\n00:0F:FA\t\tOptinel Systems, Inc.\n00:0F:FB\t\tNippon Denso Industry Co., Ltd.\n00:0F:FC\t\tMerit Li-Lin Ent.\n00:0F:FD\t\tGlorytek Network Inc.\n00:0F:FE\t\tG-Pro Computer\n00:0F:FF\t\tControl4\n00:10:00\t\tCable Television Laboratories, Inc.\n00:10:01\t\tCitel\n00:10:02\t\tActia\n00:10:03\t\tImatron, Inc.\n00:10:04\t\tThe Brantley Coile Company,Inc\n00:10:05\t\tUec Commercial\n00:10:06\t\tThales Contact Solutions Ltd.\n00:10:07\t\tCisco Systems, Inc\n00:10:08\t\tVienna Systems Corporation\n00:10:09\t\tHoranet\n00:10:0A\t\tWilliams Communications Group\n00:10:0B\t\tCisco Systems, Inc\n00:10:0C\t\tIto Co., Ltd.\n00:10:0D\t\tCisco Systems, Inc\n00:10:0E\t\tMicro Linear Coporation\n00:10:0F\t\tIndustrial Cpu Systems\n00:10:10\t\tInitio Corporation\n00:10:11\t\tCisco Systems, Inc\n00:10:12\t\tProcessor Systems (I) Pvt Ltd\n00:10:13\t\tKontron America, Inc.\n00:10:14\t\tCisco Systems, Inc\n00:10:15\t\tOOmon Inc.\n00:10:16\t\tT.Sqware\n00:10:17\t\tBosch Access Systems GmbH\n00:10:18\t\tBroadcom\n00:10:19\t\tSIRONA DENTAL SYSTEMS GmbH & Co. KG\n00:10:1A\t\tPictureTel Corp.\n00:10:1B\t\tCornet Technology, Inc.\n00:10:1C\t\tOhm Technologies Intl, Llc\n00:10:1D\t\tWinbond Electronics Corp.\n00:10:1E\t\tMatsushita Electronic Instruments Corp.\n00:10:1F\t\tCisco Systems, Inc\n00:10:20\t\tHand Held Products Inc\n00:10:21\t\tEncanto Networks, Inc.\n00:10:22\t\tSatCom Media Corporation\n00:10:23\t\tNetwork Equipment Technologies\n00:10:24\t\tNagoya Electric Works Co., Ltd\n00:10:25\t\tGrayhill, Inc\n00:10:26\t\tAccelerated Networks, Inc.\n00:10:27\t\tL-3 Communications East\n00:10:28\t\tComputer Technica, Inc.\n00:10:29\t\tCisco Systems, Inc\n00:10:2A\t\tZf Microsystems, Inc.\n00:10:2B\t\tUmax Data Systems, Inc.\n00:10:2C\t\tLasat Networks A/S\n00:10:2D\t\tHitachi Software Engineering\n00:10:2E\t\tNetwork Systems & Technologies Pvt. Ltd.\n00:10:2F\t\tCisco Systems, Inc\n00:10:30\t\tEION Inc.\n00:10:31\t\tObjective Communications, Inc.\n00:10:32\t\tAlta Technology\n00:10:33\t\tAccesslan Communications, Inc.\n00:10:34\t\tGNP Computers\n00:10:35\t\tElitegroup Computer Systems Co.,Ltd.\n00:10:36\t\tInter-Tel Integrated Systems\n00:10:37\t\tCYQ've Technology Co., Ltd.\n00:10:38\t\tMicro Research Ltd.\n00:10:39\t\tVectron Systems AG\n00:10:3A\t\tDiamond Network Tech\n00:10:3B\t\tHippi Networking Forum\n00:10:3C\t\tIc Ensemble, Inc.\n00:10:3D\t\tPhasecom, Ltd.\n00:10:3E\t\tNetschools Corporation\n00:10:3F\t\tTollgrade Communications, Inc.\n00:10:40\t\tIntermec Corporation\n00:10:41\t\tBristol Babcock, Inc.\n00:10:42\t\tAlacritech, Inc.\n00:10:43\t\tA2 Corporation\n00:10:44\t\tInnoLabs Corporation\n00:10:45\t\tNortel Networks\n00:10:46\t\tAlcorn Mcbride Inc.\n00:10:47\t\tEcho Eletric Co. Ltd.\n00:10:48\t\tHtrc Automation, Inc.\n00:10:49\t\tShoreTel, Inc\n00:10:4A\t\tThe Parvus Corporation\n00:10:4B\t\t3Com\n00:10:4C\t\tTeledyne LeCroy, Inc\n00:10:4D\t\tSurtec Industries, Inc.\n00:10:4E\t\tCeologic\n00:10:4F\t\tOracle Corporation\n00:10:50\t\tRion Co., Ltd.\n00:10:51\t\tCmicro Corporation\n00:10:52\t\tMettler-Toledo (Albstadt) Gmbh\n00:10:53\t\tComputer Technology Corp.\n00:10:54\t\tCisco Systems, Inc\n00:10:55\t\tFujitsu Microelectronics, Inc.\n00:10:56\t\tSodick Co., Ltd.\n00:10:57\t\tRebel.com, Inc.\n00:10:58\t\tArrowPoint Communications\n00:10:59\t\tDiablo Research Co. Llc\n00:10:5A\t\t3Com\n00:10:5B\t\tNet Insight Ab\n00:10:5C\t\tQuantum Designs (H.K.) Ltd.\n00:10:5D\t\tDraeger Medical\n00:10:5E\t\tSpirent plc, Service Assurance Broadband\n00:10:5F\t\tZodiac Data Systems\n00:10:60\t\tBillionton Systems, Inc.\n00:10:61\t\tHostlink Corp.\n00:10:62\t\tNx Server, Ilnc.\n00:10:63\t\tStarguide Digital Networks\n00:10:64\t\tDnpg, Llc\n00:10:65\t\tRadyne Corporation\n00:10:66\t\tAdvanced Control Systems, Inc.\n00:10:67\t\tEricsson\n00:10:68\t\tComos Telecom\n00:10:69\t\tHelioss Communications, Inc.\n00:10:6A\t\tDigital Microwave Corporation\n00:10:6B\t\tSonus Networks, Inc.\n00:10:6C\t\tEDNT GmbH\n00:10:6D\t\tAxxcelera Broadband Wireless\n00:10:6E\t\tTadiran Com. Ltd.\n00:10:6F\t\tTrenton Technology Inc.\n00:10:70\t\tCaradon Trend Ltd.\n00:10:71\t\tAdvanet Inc.\n00:10:72\t\tGvn Technologies, Inc.\n00:10:73\t\tTechnobox, Inc.\n00:10:74\t\tAten International Co., Ltd.\n00:10:75\t\tSegate Technology LLC\n00:10:76\t\tEUREM GmbH\n00:10:77\t\tSaf Drive Systems, Ltd.\n00:10:78\t\tNuera Communications, Inc.\n00:10:79\t\tCisco Systems, Inc\n00:10:7A\t\tAmbiCom, Inc.\n00:10:7B\t\tCisco Systems, Inc\n00:10:7C\t\tP-Com, Inc.\n00:10:7D\t\tAurora Communications, Ltd.\n00:10:7E\t\tBACHMANN ELECTRONIC GmbH\n00:10:7F\t\tCrestron Electronics, Inc.\n00:10:80\t\tMetawave Communications\n00:10:81\t\tDps, Inc.\n00:10:82\t\tJna Telecommunications Limited\n00:10:83\t\tHewlett Packard\n00:10:84\t\tK-Bot Communications\n00:10:85\t\tPolaris Communications, Inc.\n00:10:86\t\tATTO Technology, Inc.\n00:10:87\t\tXstreamis Plc\n00:10:88\t\tAmerican Networks Inc.\n00:10:89\t\tWebSonic\n00:10:8A\t\tTeraLogic, Inc.\n00:10:8B\t\tLaseranimation Sollinger Gmbh\n00:10:8C\t\tFujitsu Services Ltd\n00:10:8D\t\tJohnson Controls, Inc.\n00:10:8E\t\tHUGH SYMONS CONCEPT Technologies Ltd.\n00:10:8F\t\tRaptor Systems\n00:10:90\t\tCimetrics, Inc.\n00:10:91\t\tNo Wires Needed Bv\n00:10:92\t\tNetcore Inc.\n00:10:93\t\tCms Computers, Ltd.\n00:10:94\t\tPerformance Analysis Broadband, Spirent plc\n00:10:95\t\tThomson Inc.\n00:10:96\t\tTracewell Systems, Inc.\n00:10:97\t\tWinNet Metropolitan Communications Systems, Inc.\n00:10:98\t\tStarnet Technologies, Inc.\n00:10:99\t\tInnoMedia, Inc.\n00:10:9A\t\tNetline\n00:10:9B\t\tEmulex Corporation\n00:10:9C\t\tMG Co., Ltd.\n00:10:9D\t\tClarinet Systems, Inc.\n00:10:9E\t\tAware, Inc.\n00:10:9F\t\tPavo, Inc.\n00:10:A0\t\tInnovex Technologies, Inc.\n00:10:A1\t\tKendin Semiconductor, Inc.\n00:10:A2\t\tTns\n00:10:A3\t\tOmnitronix, Inc.\n00:10:A4\t\tXircom\n00:10:A5\t\tOxford Instruments\n00:10:A6\t\tCisco Systems, Inc\n00:10:A7\t\tUnex Technology Corporation\n00:10:A8\t\tReliance Computer Corp.\n00:10:A9\t\tAdhoc Technologies\n00:10:AA\t\tMedia4, Inc.\n00:10:AB\t\tKoito Electric Industries, Ltd.\n00:10:AC\t\tImci Technologies\n00:10:AD\t\tSoftronics Usb, Inc.\n00:10:AE\t\tShinko Electric Industries Co.\n00:10:AF\t\tTac Systems, Inc.\n00:10:B0\t\tMeridian Technology Corp.\n00:10:B1\t\tFor-A Co., Ltd.\n00:10:B2\t\tCoactive Aesthetics\n00:10:B3\t\tNokia Multimedia Terminals\n00:10:B4\t\tAtmosphere Networks\n00:10:B5\t\tAccton Technology Corp\n00:10:B6\t\tEntrata Communications Corp.\n00:10:B7\t\tCoyote Technologies, Llc\n00:10:B8\t\tIshigaki Computer System Co.\n00:10:B9\t\tMaxtor Corp.\n00:10:BA\t\tMartinho-Davis Systems, Inc.\n00:10:BB\t\tData & Information Technology\n00:10:BC\t\tAastra Telecom\n00:10:BD\t\tThe Telecommunication Technology Committee (Ttc)\n00:10:BE\t\tMarch Networks Corporation\n00:10:BF\t\tInterAir Wireless\n00:10:C0\t\tARMA, Inc.\n00:10:C1\t\tOi Electric Co.,Ltd\n00:10:C2\t\tWillnet, Inc.\n00:10:C3\t\tCsi-Control Systems\n00:10:C4\t\tMedia Global Links Co., Ltd.\n00:10:C5\t\tProtocol Technologies, Inc.\n00:10:C6\t\tUniversal Global Scientific Industrial Co., Ltd.\n00:10:C7\t\tData Transmission Network\n00:10:C8\t\tCommunications Electronics Security Group\n00:10:C9\t\tMitsubishi Electronics Logistic Support Co.\n00:10:CA\t\tTelco Systems, Inc.\n00:10:CB\t\tFacit K.K.\n00:10:CC\t\tCLP COMPUTER LOGISTIK PLANUNG GmbH\n00:10:CD\t\tInterface Concept\n00:10:CE\t\tVolamp, Ltd.\n00:10:CF\t\tFiberlane Communications\n00:10:D0\t\tWitcom, Ltd.\n00:10:D1\t\tTop Layer Networks, Inc.\n00:10:D2\t\tNitto Tsushinki Co., Ltd\n00:10:D3\t\tGrips Electronic Gmbh\n00:10:D4\t\tStorage Computer Corporation\n00:10:D5\t\tImasde Canarias, S.A.\n00:10:D6\t\tExelis\n00:10:D7\t\tArgosy Research Inc.\n00:10:D8\t\tCalista\n00:10:D9\t\tIbm Japan, Fujisawa Mt+D\n00:10:DA\t\tKollmorgen Corp\n00:10:DB\t\tJuniper Networks\n00:10:DC\t\tMicro-Star International Co., Ltd.\n00:10:DD\t\tEnable Semiconductor, Inc.\n00:10:DE\t\tInternational Datacasting Corporation\n00:10:DF\t\tRise Computer Inc.\n00:10:E0\t\tOracle Corporation\n00:10:E1\t\tS.I. Tech, Inc.\n00:10:E2\t\tArrayComm, Inc.\n00:10:E3\t\tHewlett Packard\n00:10:E4\t\tNsi Corporation\n00:10:E5\t\tSolectron Texas\n00:10:E6\t\tApplied Intelligent Systems, Inc.\n00:10:E7\t\tBreezecom, Ltd.\n00:10:E8\t\tTelocity, Incorporated\n00:10:E9\t\tRaidtec Ltd.\n00:10:EA\t\tAdept Technology\n00:10:EB\t\tSelsius Systems, Inc.\n00:10:EC\t\tEmbedded Planet\n00:10:ED\t\tSundance Technology, Inc.\n00:10:EE\t\tCti Products, Inc.\n00:10:EF\t\tDbtel Incorporated\n00:10:F0\t\tRITTAL-WERK RUDOLF LOH GmbH & Co.\n00:10:F1\t\tI-O Corporation\n00:10:F2\t\tAntec\n00:10:F3\t\tNexcom International Co., Ltd.\n00:10:F4\t\tVertical Communications\n00:10:F5\t\tAmherst Systems, Inc.\n00:10:F6\t\tCisco Systems, Inc\n00:10:F7\t\tIRIICHI TECHNOLOGIES Inc.\n00:10:F8\t\tTexio Technology Corporation\n00:10:F9\t\tUnique Systems, Inc.\n00:10:FA\t\tApple, Inc.\n00:10:FB\t\tZida Technologies Limited\n00:10:FC\t\tBroadband Networks, Inc.\n00:10:FD\t\tCocom A/S\n00:10:FE\t\tDigital Equipment Corporation\n00:10:FF\t\tCisco Systems, Inc\n00:11:00\t\tSchneider Electric\n00:11:01\t\tCET Technologies Pte Ltd\n00:11:02\t\tAurora Multimedia Corp.\n00:11:03\t\tkawamura electric inc.\n00:11:04\t\tTelexy\n00:11:05\t\tSunplus Technology Co., Ltd.\n00:11:06\t\tSiemens NV (Belgium)\n00:11:07\t\tRGB Networks Inc.\n00:11:08\t\tOrbital Data Corporation\n00:11:09\t\tMicro-Star International\n00:11:0A\t\tHewlett Packard\n00:11:0B\t\tFranklin Technology Systems\n00:11:0C\t\tAtmark Techno, Inc.\n00:11:0D\t\tSANBlaze Technology, Inc.\n00:11:0E\t\tTsurusaki Sealand Transportation Co. Ltd.\n00:11:0F\t\tnetplat,Inc.\n00:11:10\t\tMaxanna Technology Co., Ltd.\n00:11:11\t\tIntel Corporation\n00:11:12\t\tHoneywell CMSS\n00:11:13\t\tFraunhofer FOKUS\n00:11:14\t\tEverFocus Electronics Corp.\n00:11:15\t\tEPIN Technologies, Inc.\n00:11:16\t\tCoteau Vert Co., Ltd.\n00:11:17\t\tCesnet\n00:11:18\t\tBLX IC Design Corp., Ltd.\n00:11:19\t\tSolteras, Inc.\n00:11:1A\t\tCommscope\n00:11:1B\t\tTarga Systems Div L-3 Communications\n00:11:1C\t\tPleora Technologies Inc.\n00:11:1D\t\tHectrix Limited\n00:11:1E\t\tETHERNET Powerlink Standarization Group (EPSG)\n00:11:1F\t\tDoremi Labs, Inc.\n00:11:20\t\tCisco Systems, Inc\n00:11:21\t\tCisco Systems, Inc\n00:11:22\t\tCIMSYS Inc\n00:11:23\t\tAppointech, Inc.\n00:11:24\t\tApple, Inc.\n00:11:25\t\tIBM Corp\n00:11:26\t\tVenstar Inc.\n00:11:27\t\tTASI, Inc\n00:11:28\t\tStreamit\n00:11:29\t\tParadise Datacom Ltd.\n00:11:2A\t\tNiko NV\n00:11:2B\t\tNetModule AG\n00:11:2C\t\tIZT GmbH\n00:11:2D\t\tiPulse Systems\n00:11:2E\t\tCeicom\n00:11:2F\t\tASUSTek COMPUTER INC.\n00:11:30\t\tAllied Telesis (Hong Kong) Ltd.\n00:11:31\t\tUnatech. Co.,Ltd\n00:11:32\t\tSynology Incorporated\n00:11:33\t\tSiemens AG Austria\n00:11:34\t\tMediaCell, Inc.\n00:11:35\t\tGrandeye Ltd\n00:11:36\t\tGoodrich Sensor Systems\n00:11:37\t\tAichi Electric Co., Ltd.\n00:11:38\t\tTaishin Co., Ltd.\n00:11:39\t\tSTOEBER ANTRIEBSTECHNIK GmbH + Co. KG.\n00:11:3A\t\tShinboram\n00:11:3B\t\tMicronet Communications Inc.\n00:11:3C\t\tMicronas GmbH\n00:11:3D\t\tKn Soltec Co.,Ltd.\n00:11:3E\t\tJL Corporation\n00:11:3F\t\tAlcatel DI\n00:11:40\t\tNanometrics Inc.\n00:11:41\t\tGoodMan Corporation\n00:11:42\t\te-SMARTCOM  INC.\n00:11:43\t\tDell Inc.\n00:11:44\t\tAssurance Technology Corp\n00:11:45\t\tValuePoint Networks\n00:11:46\t\tTelecard-Pribor Ltd\n00:11:47\t\tSecom-Industry co.LTD.\n00:11:48\t\tProlon Control Systems\n00:11:49\t\tProliphix Inc.\n00:11:4A\t\tKAYABA INDUSTRY Co,.Ltd.\n00:11:4B\t\tFrancotyp-Postalia GmbH\n00:11:4C\t\tcaffeina applied research ltd.\n00:11:4D\t\tAtsumi Electric Co.,LTD.\n00:11:4E\t\t690885 Ontario Inc.\n00:11:4F\t\tUS Digital Television, Inc\n00:11:50\t\tBelkin Corporation\n00:11:51\t\tMykotronx\n00:11:52\t\tEidsvoll Electronics AS\n00:11:53\t\tTrident Tek, Inc.\n00:11:54\t\tWebpro Technologies Inc.\n00:11:55\t\tSevis Systems\n00:11:56\t\tPharos Systems NZ\n00:11:57\t\tOki Electric Industry Co., Ltd.\n00:11:58\t\tNortel Networks\n00:11:59\t\tMatisse Networks Inc\n00:11:5A\t\tIvoclar Vivadent AG\n00:11:5B\t\tElitegroup Computer Systems Co.,Ltd.\n00:11:5C\t\tCisco Systems, Inc\n00:11:5D\t\tCisco Systems, Inc\n00:11:5E\t\tProMinent Dosiertechnik GmbH\n00:11:5F\t\tITX Security Co., Ltd.\n00:11:60\t\tARTDIO Company Co., LTD\n00:11:61\t\tNetStreams, LLC\n00:11:62\t\tStar Micronics Co.,Ltd.\n00:11:63\t\tSystem Spa Dept. Electronics\n00:11:64\t\tACARD Technology Corp.\n00:11:65\t\tZNYX Networks, Inc.\n00:11:66\t\tTaelim Electronics Co., Ltd.\n00:11:67\t\tIntegrated System Solution Corp.\n00:11:68\t\tHomeLogic LLC\n00:11:69\t\tEMS Satcom\n00:11:6A\t\tDomo Ltd\n00:11:6B\t\tDigital Data Communications Asia Co.,Ltd\n00:11:6C\t\tNanwang Multimedia Inc.,Ltd\n00:11:6D\t\tAmerican Time and Signal\n00:11:6E\t\tPeplink International Ltd.\n00:11:6F\t\tNetforyou Co., LTD.\n00:11:70\t\tGsc Srl\n00:11:71\t\tDEXTER Communications, Inc.\n00:11:72\t\tCotron Corporation\n00:11:73\t\tSMART Storage Systems\n00:11:74\t\tMojo Networks, Inc.\n00:11:75\t\tIntel Corporation\n00:11:76\t\tIntellambda Systems, Inc.\n00:11:77\t\tCoaxial Networks, Inc.\n00:11:78\t\tChiron Technology Ltd\n00:11:79\t\tSingular Technology Co. Ltd.\n00:11:7A\t\tSingim International Corp.\n00:11:7B\t\tBüchi  Labortechnik AG\n00:11:7C\t\te-zy.net\n00:11:7D\t\tZMD America, Inc.\n00:11:7E\t\tMidmark Corp\n00:11:7F\t\tNeotune Information Technology Corporation,.LTD\n00:11:80\t\tCommscope\n00:11:81\t\tInterEnergy Co.Ltd,\n00:11:82\t\tIMI Norgren Ltd\n00:11:83\t\tDatalogic ADC, Inc.\n00:11:84\t\tHumo Laboratory,Ltd.\n00:11:85\t\tHewlett Packard\n00:11:86\t\tPrime Systems, Inc.\n00:11:87\t\tCategory Solutions, Inc\n00:11:88\t\tEnterasys\n00:11:89\t\tAerotech Inc\n00:11:8A\t\tViewtran Technology Limited\n00:11:8B\t\tAlcatel-Lucent Enterprise\n00:11:8C\t\tMissouri Department of Transportation\n00:11:8D\t\tHanchang System Corp.\n00:11:8E\t\tHalytech Mace\n00:11:8F\t\tEutech Instruments Pte. Ltd.\n00:11:90\t\tDigital Design Corporation\n00:11:91\t\tCTS-Clima Temperatur Systeme GmbH\n00:11:92\t\tCisco Systems, Inc\n00:11:93\t\tCisco Systems, Inc\n00:11:94\t\tChi Mei Communication Systems, Inc.\n00:11:95\t\tD-Link Corporation\n00:11:96\t\tActuality Systems, Inc.\n00:11:97\t\tMonitoring Technologies Limited\n00:11:98\t\tPrism Media Products Limited\n00:11:99\t\t2wcom Systems GmbH\n00:11:9A\t\tAlkeria srl\n00:11:9B\t\tTelesynergy Research Inc.\n00:11:9C\t\tEP&T Energy\n00:11:9D\t\tDiginfo Technology Corporation\n00:11:9E\t\tSolectron Brazil\n00:11:9F\t\tNokia Danmark A/S\n00:11:A0\t\tVtech Engineering Canada Ltd\n00:11:A1\t\tVision Netware Co.,Ltd\n00:11:A2\t\tManufacturing Technology Inc\n00:11:A3\t\tLanReady Technologies Inc.\n00:11:A4\t\tJStream Technologies Inc.\n00:11:A5\t\tFortuna Electronic Corp.\n00:11:A6\t\tSypixx Networks\n00:11:A7\t\tInfilco Degremont Inc.\n00:11:A8\t\tQuest Technologies\n00:11:A9\t\tNurivoice Co., Ltd\n00:11:AA\t\tUniclass Technology, Co., LTD\n00:11:AB\t\tTrustable Technology Co.,Ltd.\n00:11:AC\t\tSimtec Electronics\n00:11:AD\t\tShanghai Ruijie Technology\n00:11:AE\t\tCommscope\n00:11:AF\t\tMedialink-i,Inc\n00:11:B0\t\tFortelink Inc.\n00:11:B1\t\tBlueExpert Technology Corp.\n00:11:B2\t\t2001 Technology Inc.\n00:11:B3\t\tYoshimiya Co.,Ltd.\n00:11:B4\t\tWestermo Network Technologies AB\n00:11:B5\t\tShenzhen Powercom Co.,Ltd\n00:11:B6\t\tOpen Systems International\n00:11:B7\t\tOctalix B.V.\n00:11:B8\t\tLiebherr - Elektronik GmbH\n00:11:B9\t\tInner Range Pty. Ltd.\n00:11:BA\t\tElexol Pty Ltd\n00:11:BB\t\tCisco Systems, Inc\n00:11:BC\t\tCisco Systems, Inc\n00:11:BD\t\tBombardier Transportation\n00:11:BE\t\tAGP Telecom Co. Ltd\n00:11:BF\t\tAESYS S.p.A.\n00:11:C0\t\tAday Technology Inc\n00:11:C1\t\t4P Mobile Data Processing\n00:11:C2\t\tUnited Fiber Optic Communication\n00:11:C3\t\tTransceiving System Technology Corporation\n00:11:C4\t\tTerminales de Telecomunicacion Terrestre, S.L.\n00:11:C5\t\tTEN Technology\n00:11:C6\t\tSeagate Technology\n00:11:C7\t\tRaymarine UK Ltd\n00:11:C8\t\tPowercom Co., Ltd.\n00:11:C9\t\tMTT Corporation\n00:11:CA\t\tLong Range Systems, Inc.\n00:11:CB\t\tJacobsons AB\n00:11:CC\t\tGuangzhou Jinpeng Group Co.,Ltd.\n00:11:CD\t\tAxsun Technologies\n00:11:CE\t\tUbisense Limited\n00:11:CF\t\tThrane & Thrane A/S\n00:11:D0\t\tTandberg Data ASA\n00:11:D1\t\tSoft Imaging System GmbH\n00:11:D2\t\tPerception Digital Ltd\n00:11:D3\t\tNextGenTel Holding ASA\n00:11:D4\t\tNetEnrich, Inc\n00:11:D5\t\tHangzhou Sunyard System Engineering Co.,Ltd.\n00:11:D6\t\tHandEra, Inc.\n00:11:D7\t\teWerks Inc\n00:11:D8\t\tASUSTek COMPUTER INC.\n00:11:D9\t\tTiVo\n00:11:DA\t\tVivaas Technology Inc.\n00:11:DB\t\tLand-Cellular Corporation\n00:11:DC\t\tGlunz & Jensen\n00:11:DD\t\tFROMUS TEC. Co., Ltd.\n00:11:DE\t\tEurilogic\n00:11:DF\t\tCurrent Energy\n00:11:E0\t\tU-MEDIA Communications, Inc.\n00:11:E1\t\tArcelik A.S\n00:11:E2\t\tHua Jung Components Co., Ltd.\n00:11:E3\t\tThomson, Inc.\n00:11:E4\t\tDanelec Electronics A/S\n00:11:E5\t\tKCodes Corporation\n00:11:E6\t\tScientific Atlanta\n00:11:E7\t\tWORLDSAT - Texas de France\n00:11:E8\t\tTixi.Com\n00:11:E9\t\tStarnex Co., Ltd.\n00:11:EA\t\tIWICS Inc.\n00:11:EB\t\tInnovative Integration\n00:11:EC\t\tAvix Inc.\n00:11:ED\t\t802 Global\n00:11:EE\t\tEstari, Inc.\n00:11:EF\t\tConitec Datensysteme GmbH\n00:11:F0\t\tWideful Limited\n00:11:F1\t\tQinetiQ Ltd\n00:11:F2\t\tInstitute of Network Technologies\n00:11:F3\t\tNeoMedia Europe AG\n00:11:F4\t\twoori-net\n00:11:F5\t\tAskey Computer Corp\n00:11:F6\t\tAsia Pacific Microsystems , Inc.\n00:11:F7\t\tShenzhen Forward Industry Co., Ltd\n00:11:F8\t\tAIRAYA Corp\n00:11:F9\t\tNortel Networks\n00:11:FA\t\tRane Corporation\n00:11:FB\t\tHeidelberg Engineering GmbH\n00:11:FC\t\tHARTING Electronics GmbH\n00:11:FD\t\tKorg Inc.\n00:11:FE\t\tKeiyo System Research, Inc.\n00:11:FF\t\tDigitro Tecnologia Ltda\n00:12:00\t\tCisco Systems, Inc\n00:12:01\t\tCisco Systems, Inc\n00:12:02\t\tDecrane Aerospace - Audio International Inc.\n00:12:03\t\tActivNetworks\n00:12:04\t\tu10 Networks, Inc.\n00:12:05\t\tTerrasat Communications, Inc.\n00:12:06\t\tiQuest (NZ) Ltd\n00:12:07\t\tHead Strong International Limited\n00:12:08\t\tGantner Instruments GmbH\n00:12:09\t\tFastrax Ltd\n00:12:0A\t\tEmerson Climate Technologies GmbH\n00:12:0B\t\tChinasys Technologies Limited\n00:12:0C\t\tCE-Infosys Pte Ltd\n00:12:0D\t\tAdvanced Telecommunication Technologies, Inc.\n00:12:0E\t\tAboCom\n00:12:0F\t\tIeee 802.3\n00:12:10\t\tWideRay Corp\n00:12:11\t\tProtechna Herbst GmbH & Co. KG\n00:12:12\t\tPLUS  Corporation\n00:12:13\t\tMetrohm AG\n00:12:14\t\tKoenig & Bauer AG\n00:12:15\t\tiStor Networks, Inc.\n00:12:16\t\tICP Internet Communication Payment AG\n00:12:17\t\tCisco-Linksys, LLC\n00:12:18\t\tARUZE Corporation\n00:12:19\t\tGeneral Datacomm LLC\n00:12:1A\t\tTechno Soft Systemnics Inc.\n00:12:1B\t\tSound Devices, LLC\n00:12:1C\t\tParrot Sa\n00:12:1D\t\tNetfabric Corporation\n00:12:1E\t\tJuniper Networks\n00:12:1F\t\tHarding Instruments\n00:12:20\t\tCadco Systems\n00:12:21\t\tB.Braun Melsungen AG\n00:12:22\t\tSkardin (UK) Ltd\n00:12:23\t\tPixim\n00:12:24\t\tNexQL Corporation\n00:12:25\t\tCommscope\n00:12:26\t\tJapan Direx Corporation\n00:12:27\t\tFranklin Electric Co., Inc.\n00:12:28\t\tData Ltd.\n00:12:29\t\tBroadEasy Technologies Co.,Ltd\n00:12:2A\t\tVTech Telecommunications Ltd.\n00:12:2B\t\tVirbiage Pty Ltd\n00:12:2C\t\tSoenen Controls N.V.\n00:12:2D\t\tSiNett Corporation\n00:12:2E\t\tSignal Technology - AISD\n00:12:2F\t\tSanei Electric Inc.\n00:12:30\t\tPicaso Infocommunication CO., LTD.\n00:12:31\t\tMotion Control Systems, Inc.\n00:12:32\t\tLeWiz Communications Inc.\n00:12:33\t\tJRC TOKKI Co.,Ltd.\n00:12:34\t\tCamille Bauer\n00:12:35\t\tAndrew Corporation\n00:12:36\t\tConSentry Networks\n00:12:37\t\tTexas Instruments\n00:12:38\t\tSetaBox Technology Co., Ltd.\n00:12:39\t\tS Net Systems Inc.\n00:12:3A\t\tPosystech Inc., Co.\n00:12:3B\t\tKeRo Systems ApS\n00:12:3C\t\tSecond Rule LLC\n00:12:3D\t\tGES Co, Ltd\n00:12:3E\t\tERUNE technology Co., Ltd.\n00:12:3F\t\tDell Inc.\n00:12:40\t\tAmoi Electronics Co.,Ltd\n00:12:41\t\ta2i marketing center\n00:12:42\t\tMillennial Net\n00:12:43\t\tCisco Systems, Inc\n00:12:44\t\tCisco Systems, Inc\n00:12:45\t\tZellweger Analytics, Inc.\n00:12:46\t\tT.O.M Technology Inc..\n00:12:47\t\tSamsung Electronics Co.,Ltd\n00:12:48\t\tDell EMC\n00:12:49\t\tDelta Elettronica S.p.A.\n00:12:4A\t\tDedicated Devices, Inc.\n00:12:4B\t\tTexas Instruments\n00:12:4C\t\tBBWM Corporation\n00:12:4D\t\tInducon BV\n00:12:4E\t\tXac Automation Corp.\n00:12:4F\t\tnVent\n00:12:50\t\tTokyo Aircaft Instrument Co., Ltd.\n00:12:51\t\tSilink\n00:12:52\t\tCitronix, LLC\n00:12:53\t\tAudioDev AB\n00:12:54\t\tSpectra Technologies Holdings Company Ltd\n00:12:55\t\tNetEffect Incorporated\n00:12:56\t\tLg Information & Comm.\n00:12:57\t\tLeapComm Communication Technologies Inc.\n00:12:58\t\tTechVoIP Sp z o.o.\n00:12:59\t\tThermo Electron Karlsruhe\n00:12:5A\t\tMicrosoft Corporation\n00:12:5B\t\tKaimei Electroni\n00:12:5C\t\tGreen Hills Software, Inc.\n00:12:5D\t\tCyberNet Inc.\n00:12:5E\t\tCaen\n00:12:5F\t\tAWIND Inc.\n00:12:60\t\tStanton Magnetics,inc.\n00:12:61\t\tAdaptix, Inc\n00:12:62\t\tNokia Danmark A/S\n00:12:63\t\tData Voice Technologies GmbH\n00:12:64\t\tdaum electronic gmbh\n00:12:65\t\tEnerdyne Technologies, Inc.\n00:12:66\t\tSwisscom Hospitality Services SA\n00:12:67\t\tPanasonic Corporation\n00:12:68\t\tIPS d.o.o.\n00:12:69\t\tValue Electronics\n00:12:6A\t\tOPTOELECTRONICS Co., Ltd.\n00:12:6B\t\tAscalade Communications Limited\n00:12:6C\t\tVisonic Technologies 1993 Ltd.\n00:12:6D\t\tUniversity of California, Berkeley\n00:12:6E\t\tSeidel Elektronik GmbH Nfg.KG\n00:12:6F\t\tRayson Technology Co., Ltd.\n00:12:70\t\tNGES Denro Systems\n00:12:71\t\tMeasurement Computing Corp\n00:12:72\t\tRedux Communications Ltd.\n00:12:73\t\tStoke Inc\n00:12:74\t\tNIT lab\n00:12:75\t\tSentilla Corporation\n00:12:76\t\tCG Power Systems Ireland Limited\n00:12:77\t\tBeijer Electronics Corp.\n00:12:78\t\tInternational Bar Code\n00:12:79\t\tHewlett Packard\n00:12:7A\t\tSanyu Industry Co.,Ltd.\n00:12:7B\t\tVIA Networking Technologies, Inc.\n00:12:7C\t\tSwegon Ab\n00:12:7D\t\tMobileAria\n00:12:7E\t\tDigital Lifestyles Group, Inc.\n00:12:7F\t\tCisco Systems, Inc\n00:12:80\t\tCisco Systems, Inc\n00:12:81\t\tMarch Networks S.p.A.\n00:12:82\t\tQovia\n00:12:83\t\tNortel Networks\n00:12:84\t\tLab33 Srl\n00:12:85\t\tGizmondo Europe Ltd\n00:12:86\t\tEndevco Corp\n00:12:87\t\tDigital Everywhere Unterhaltungselektronik GmbH\n00:12:88\t\t2Wire Inc\n00:12:89\t\tAdvance Sterilization Products\n00:12:8A\t\tCommscope\n00:12:8B\t\tSensory Networks Inc\n00:12:8C\t\tWoodward Governor\n00:12:8D\t\tSTB Datenservice GmbH\n00:12:8E\t\tQ-Free ASA\n00:12:8F\t\tMontilio\n00:12:90\t\tKYOWA Electric & Machinery Corp.\n00:12:91\t\tKWS Computersysteme GmbH\n00:12:92\t\tGriffin Technology\n00:12:93\t\tABB Switzerland Ltd.\n00:12:94\t\tSumitomo Electric Device Innovations, Inc\n00:12:95\t\tAiware Inc.\n00:12:96\t\tAddlogix\n00:12:97\t\tO2Micro, Inc.\n00:12:98\t\tMico Electric(Shenzhen) Limited\n00:12:99\t\tKtech Telecommunications Inc\n00:12:9A\t\tIRT Electronics Pty Ltd\n00:12:9B\t\tE2S Electronic Engineering Solutions, S.L.\n00:12:9C\t\tYulinet\n00:12:9D\t\tFirst International Computer do Brasil\n00:12:9E\t\tSurf Communications Inc.\n00:12:9F\t\tRAE Systems\n00:12:A0\t\tNeoMeridian Sdn Bhd\n00:12:A1\t\tBluePacket Communications Co., Ltd.\n00:12:A2\t\tVita\n00:12:A3\t\tTrust International B.V.\n00:12:A4\t\tThingMagic, LLC\n00:12:A5\t\tDolphin Interconnect Solutions AS\n00:12:A6\t\tDolby Australia\n00:12:A7\t\tISR TECHNOLOGIES Inc\n00:12:A8\t\tintec GmbH\n00:12:A9\t\t3Com Ltd\n00:12:AA\t\tIEE, Inc.\n00:12:AB\t\tWiLife, Inc.\n00:12:AC\t\tOntimetek Inc.\n00:12:AD\t\tVivavis Ag\n00:12:AE\t\tHLS HARD-LINE Solutions Inc.\n00:12:AF\t\tELPRO Technologies\n00:12:B0\t\tEfore Oyj   (Plc)\n00:12:B1\t\tDai Nippon Printing Co., Ltd\n00:12:B2\t\tAvolites Ltd.\n00:12:B3\t\tAdvance Wireless Technology Corp.\n00:12:B4\t\tWork Microwave GmbH\n00:12:B5\t\tVialta, Inc.\n00:12:B6\t\tSanta Barbara Infrared, Inc.\n00:12:B7\t\tPTW Freiburg\n00:12:B8\t\tG2 Microsystems\n00:12:B9\t\tFusion Digital Technology\n00:12:BA\t\tFSI Systems, Inc.\n00:12:BB\t\tTelecommunications Industry Association TR-41 Committee\n00:12:BC\t\tEcholab LLC\n00:12:BD\t\tAvantec Manufacturing Limited\n00:12:BE\t\tAstek Corporation\n00:12:BF\t\tArcadyan Technology Corporation\n00:12:C0\t\tHotLava Systems, Inc.\n00:12:C1\t\tCheck Point Software Technologies\n00:12:C2\t\tApex Electronics Factory\n00:12:C3\t\tWit S.A.\n00:12:C4\t\tViseon, Inc.\n00:12:C5\t\tV-Show  Technology (China) Co.,Ltd\n00:12:C6\t\tTGC America, Inc\n00:12:C7\t\tSECURAY Technologies Ltd.Co.\n00:12:C8\t\tPerfect tech\n00:12:C9\t\tCommscope\n00:12:CA\t\tMechatronic Brick Aps\n00:12:CB\t\tCSS Inc.\n00:12:CC\t\tBitatek CO., LTD\n00:12:CD\t\tASEM SpA\n00:12:CE\t\tAdvanced Cybernetics Group\n00:12:CF\t\tAccton Technology Corp\n00:12:D0\t\tGossen-Metrawatt-GmbH\n00:12:D1\t\tTexas Instruments\n00:12:D2\t\tTexas Instruments\n00:12:D3\t\tZetta Systems, Inc.\n00:12:D4\t\tPrinceton Technology, Ltd\n00:12:D5\t\tMotion Reality Inc.\n00:12:D6\t\tJiangsu Yitong High-Tech Co.,Ltd\n00:12:D7\t\tInvento Networks, Inc.\n00:12:D8\t\tInternational Games System Co., Ltd.\n00:12:D9\t\tCisco Systems, Inc\n00:12:DA\t\tCisco Systems, Inc\n00:12:DB\t\tZIEHL industrie-elektronik GmbH + Co KG\n00:12:DC\t\tSunCorp Industrial Limited\n00:12:DD\t\tShengqu Information Technology (Shanghai) Co., Ltd.\n00:12:DE\t\tRadio Components Sweden AB\n00:12:DF\t\tNovomatic AG\n00:12:E0\t\tCodan Limited\n00:12:E1\t\tAlliant Networks, Inc\n00:12:E2\t\tALAXALA Networks Corporation\n00:12:E3\t\tAgat Soft LLC\n00:12:E4\t\tZIEHL industrie-electronik GmbH + Co KG\n00:12:E5\t\tTime America, Inc.\n00:12:E6\t\tSpectec Computer Co., Ltd.\n00:12:E7\t\tProjectek Networking Electronics Corp.\n00:12:E8\t\tFraunhofer IMS\n00:12:E9\t\tAbbey Systems Ltd\n00:12:EA\t\tTrane\n00:12:EB\t\tPDH Solutions, LLC\n00:12:EC\t\tMovacolor b.v.\n00:12:ED\t\tAVG Advanced Technologies\n00:12:EE\t\tSony Corporation\n00:12:EF\t\tOneAccess SA\n00:12:F0\t\tIntel Corporate\n00:12:F1\t\tIfotec\n00:12:F2\t\tBrocade Communications Systems LLC\n00:12:F3\t\tu-blox AG\n00:12:F4\t\tBelco International Co.,Ltd.\n00:12:F5\t\tImarda New Zealand Limited\n00:12:F6\t\tMdk Co.,Ltd.\n00:12:F7\t\tXiamen Xinglian Electronics Co., Ltd.\n00:12:F8\t\tWNI Resources, LLC\n00:12:F9\t\tUryu Seisaku, Ltd.\n00:12:FA\t\tThx Ltd\n00:12:FB\t\tSamsung Electronics Co.,Ltd\n00:12:FC\t\tPLANET System Co.,LTD\n00:12:FD\t\tOptimus Ic S.A.\n00:12:FE\t\tLenovo Mobile Communication Technology Ltd.\n00:12:FF\t\tLely Industries N.V.\n00:13:00\t\tIt-Factory, Inc.\n00:13:01\t\tIronGate S.L.\n00:13:02\t\tIntel Corporate\n00:13:03\t\tGateConnect\n00:13:04\t\tFlaircomm Technologies Co. LTD\n00:13:05\t\tEpicom, Inc.\n00:13:06\t\tAlways On Wireless\n00:13:07\t\tParavirtual Corporation\n00:13:08\t\tNuvera Fuel Cells\n00:13:09\t\tOcean Broadband Networks\n00:13:0A\t\tNortel Networks\n00:13:0B\t\tMextal B.V.\n00:13:0C\t\tHF System Corporation\n00:13:0D\t\tGalileo Avionica\n00:13:0E\t\tFocusrite Audio Engineering Limited\n00:13:0F\t\tEGEMEN Bilgisayar Muh San ve Tic LTD STI\n00:13:10\t\tCisco-Linksys, LLC\n00:13:11\t\tCommscope\n00:13:12\t\tAmedia Networks Inc.\n00:13:13\t\tGuangZhou Post & Telecom Equipment ltd\n00:13:14\t\tAsiamajor Inc.\n00:13:15\t\tSony Interactive Entertainment Inc.\n00:13:16\t\tL-S-B Broadcast Technologies GmbH\n00:13:17\t\tGN Netcom A/S\n00:13:18\t\tDGSTATION Co., Ltd.\n00:13:19\t\tCisco Systems, Inc\n00:13:1A\t\tCisco Systems, Inc\n00:13:1B\t\tBeCell Innovations Corp.\n00:13:1C\t\tLiteTouch, Inc.\n00:13:1D\t\tScanvaegt International A/S\n00:13:1E\t\tpeiker acustic GmbH\n00:13:1F\t\tNxtPhase T&D, Corp.\n00:13:20\t\tIntel Corporate\n00:13:21\t\tHewlett Packard\n00:13:22\t\tDAQ Electronics, Inc.\n00:13:23\t\tCap Co., Ltd.\n00:13:24\t\tSchneider Electric Ultra Terminal\n00:13:25\t\tCortina Systems Inc\n00:13:26\t\tECM Systems Ltd\n00:13:27\t\tData Acquisitions limited\n00:13:28\t\tWestech Korea Inc.,\n00:13:29\t\tVSST Co., LTD\n00:13:2A\t\tSitronics Telecom Solutions\n00:13:2B\t\tPhoenix Digital\n00:13:2C\t\tMAZ Brandenburg GmbH\n00:13:2D\t\tiWise Communications\n00:13:2E\t\tITian Coporation\n00:13:2F\t\tInteractek\n00:13:30\t\tEuro Protection Surveillance\n00:13:31\t\tCellPoint Connect\n00:13:32\t\tBeijing Topsec Network Security Technology Co., Ltd.\n00:13:33\t\tBaudTec Corporation\n00:13:34\t\tArkados, Inc.\n00:13:35\t\tVS Industry Berhad\n00:13:36\t\tTianjin 712 Communication Broadcasting co., ltd.\n00:13:37\t\tOrient Power Home Network Ltd.\n00:13:38\t\tFresenius-Vial\n00:13:39\t\tCCV Deutschland GmbH\n00:13:3A\t\tVadaTech Inc.\n00:13:3B\t\tSpeed Dragon Multimedia Limited\n00:13:3C\t\tQuintron Systems Inc.\n00:13:3D\t\tMicro Memory Curtiss Wright Co\n00:13:3E\t\tMetaSwitch\n00:13:3F\t\tEppendorf Instrumente GmbH\n00:13:40\t\tAD.EL s.r.l.\n00:13:41\t\tShandong New Beiyang Information Technology Co.,Ltd\n00:13:42\t\tVision Research, Inc.\n00:13:43\t\tMatsushita Electronic Components (Europe) GmbH\n00:13:44\t\tFargo Electronics Inc.\n00:13:45\t\tEaton Corporation\n00:13:46\t\tD-Link Corporation\n00:13:47\t\tRed Lion Controls, LP\n00:13:48\t\tArtila Electronics Co., Ltd.\n00:13:49\t\tZyxel Communications Corporation\n00:13:4A\t\tEngim, Inc.\n00:13:4B\t\tToGoldenNet Technology Inc.\n00:13:4C\t\tYDT Technology International\n00:13:4D\t\tInepro BV\n00:13:4E\t\tValox Systems, Inc.\n00:13:4F\t\tRapidus Wireless Networks Inc.\n00:13:50\t\tSilver Spring Networks, Inc\n00:13:51\t\tNiles Audio Corporation\n00:13:52\t\tNaztec, Inc.\n00:13:53\t\tHYDAC Filtertechnik GMBH\n00:13:54\t\tZcomax Technologies, Inc.\n00:13:55\t\tTOMEN Cyber-business Solutions, Inc.\n00:13:56\t\tFLIR Radiation Inc\n00:13:57\t\tSoyal Technology Co., Ltd.\n00:13:58\t\tRealm Systems, Inc.\n00:13:59\t\tProTelevision Technologies A/S\n00:13:5A\t\tProject T&E Limited\n00:13:5B\t\tPanelLink Cinema, LLC\n00:13:5C\t\tOnSite Systems, Inc.\n00:13:5D\t\tNTTPC Communications, Inc.\n00:13:5E\t\tEab/Rwi/K\n00:13:5F\t\tCisco Systems, Inc\n00:13:60\t\tCisco Systems, Inc\n00:13:61\t\tBiospace Co., Ltd.\n00:13:62\t\tShinHeung Precision Co., Ltd.\n00:13:63\t\tVerascape, Inc.\n00:13:64\t\tParadigm Technology Inc..\n00:13:65\t\tNortel Networks\n00:13:66\t\tNeturity Technologies Inc.\n00:13:67\t\tNarayon. Co., Ltd.\n00:13:68\t\tSaab Danmark A/S\n00:13:69\t\tHonda Electron Co., LED.\n00:13:6A\t\tHach Lange Sarl\n00:13:6B\t\tE-Tec\n00:13:6C\t\tTomTom\n00:13:6D\t\tTentaculus AB\n00:13:6E\t\tTechmetro Corp.\n00:13:6F\t\tPacketMotion, Inc.\n00:13:70\t\tNokia Danmark A/S\n00:13:71\t\tCommscope\n00:13:72\t\tDell Inc.\n00:13:73\t\tBLwave Electronics Co., Ltd\n00:13:74\t\tAtheros Communications, Inc.\n00:13:75\t\tAmerican Security Products Co.\n00:13:76\t\tTabor Electronics Ltd.\n00:13:77\t\tSamsung Electronics Co.,Ltd\n00:13:78\t\tQsan Technology, Inc.\n00:13:79\t\tPonder Information Industries Ltd.\n00:13:7A\t\tNetvox Technology Co., Ltd.\n00:13:7B\t\tMovon Corporation\n00:13:7C\t\tKaicom co., Ltd.\n00:13:7D\t\tDynalab, Inc.\n00:13:7E\t\tCorEdge Networks, Inc.\n00:13:7F\t\tCisco Systems, Inc\n00:13:80\t\tCisco Systems, Inc\n00:13:81\t\tCHIPS & Systems, Inc.\n00:13:82\t\tCetacea Networks Corporation\n00:13:83\t\tApplication Technologies and Engineering Research Laboratory\n00:13:84\t\tAdvanced Motion Controls\n00:13:85\t\tAdd-On Technology Co., LTD.\n00:13:86\t\tABB Inc/Totalflow\n00:13:87\t\t27M Technologies AB\n00:13:88\t\tWiMedia Alliance\n00:13:89\t\tRedes de Telefonía Móvil S.A.\n00:13:8A\t\tQingdao GoerTek Technology Co., Ltd.\n00:13:8B\t\tPhantom Technologies LLC\n00:13:8C\t\tKumyoung.Co.Ltd\n00:13:8D\t\tKinghold\n00:13:8E\t\tFOAB Elektronik AB\n00:13:8F\t\tAsiarock Technology Limited\n00:13:90\t\tTermtek Computer Co., Ltd\n00:13:91\t\tOuen Co.,Ltd.\n00:13:92\t\tRuckus Wireless\n00:13:93\t\tPanta Systems, Inc.\n00:13:94\t\tInfohand Co.,Ltd\n00:13:95\t\tcongatec GmbH\n00:13:96\t\tAcbel Polytech Inc.\n00:13:97\t\tOracle Corporation\n00:13:98\t\tTrafficSim Co.,Ltd\n00:13:99\t\tSTAC Corporation.\n00:13:9A\t\tK-ubique ID Corp.\n00:13:9B\t\tioIMAGE Ltd.\n00:13:9C\t\tExavera Technologies, Inc.\n00:13:9D\t\tMaxLinear Hispania S.L.U.\n00:13:9E\t\tCiara Technologies Inc.\n00:13:9F\t\tElectronics Design Services, Co., Ltd.\n00:13:A0\t\tALGOSYSTEM Co., Ltd.\n00:13:A1\t\tCrow Electronic Engeneering\n00:13:A2\t\tMaxStream, Inc\n00:13:A3\t\tSiemens Home & Office Comm. Devices\n00:13:A4\t\tKeyEye Communications\n00:13:A5\t\tGeneral Solutions, LTD.\n00:13:A6\t\tExtricom Ltd\n00:13:A7\t\tBattelle Memorial Institute\n00:13:A8\t\tTanisys Technology\n00:13:A9\t\tSony Corporation\n00:13:AA\t\tALS  & TEC Ltd.\n00:13:AB\t\tTelemotive AG\n00:13:AC\t\tSunmyung Electronics Co., LTD\n00:13:AD\t\tSendo Ltd\n00:13:AE\t\tRadiance Technologies, Inc.\n00:13:AF\t\tNUMA Technology,Inc.\n00:13:B0\t\tJablotron\n00:13:B1\t\tIntelligent Control Systems (Asia) Pte Ltd\n00:13:B2\t\tCarallon Limited\n00:13:B3\t\tEcom Communications Technology Co., Ltd.\n00:13:B4\t\tAppear AS\n00:13:B5\t\tWavesat\n00:13:B6\t\tSling Media, Inc.\n00:13:B7\t\tScantech ID\n00:13:B8\t\tRyCo Electronic Systems Limited\n00:13:B9\t\tBm Spa\n00:13:BA\t\tReadyLinks Inc\n00:13:BB\t\tSmartvue Corporation\n00:13:BC\t\tArtimi Ltd\n00:13:BD\t\tHymatom Sa\n00:13:BE\t\tVirtual Conexions\n00:13:BF\t\tMedia System Planning Corp.\n00:13:C0\t\tTrix Tecnologia Ltda.\n00:13:C1\t\tAsoka USA Corporation\n00:13:C2\t\tWACOM Co.,Ltd\n00:13:C3\t\tCisco Systems, Inc\n00:13:C4\t\tCisco Systems, Inc\n00:13:C5\t\tLightron Fiber-Optic Devices Inc.\n00:13:C6\t\tOpenGear, Inc\n00:13:C7\t\tIONOS Co.,Ltd.\n00:13:C8\t\tADB Broadband Italia\n00:13:C9\t\tBeyond Achieve Enterprises Ltd.\n00:13:CA\t\tAtx\n00:13:CB\t\tZenitel Norway AS\n00:13:CC\t\tTall Maple Systems\n00:13:CD\t\tMTI co. LTD\n00:13:CE\t\tIntel Corporate\n00:13:CF\t\t4Access Communications\n00:13:D0\t\tt+ Medical Ltd\n00:13:D1\t\tKIRK telecom A/S\n00:13:D2\t\tPage Iberica, S.A.\n00:13:D3\t\tMicro-Star International Co., Ltd.\n00:13:D4\t\tASUSTek COMPUTER INC.\n00:13:D5\t\tRuggedCom\n00:13:D6\t\tTii Network Technologies, Inc.\n00:13:D7\t\tSPIDCOM Technologies SA\n00:13:D8\t\tPrinceton Instruments\n00:13:D9\t\tMatrix Product Development, Inc.\n00:13:DA\t\tDiskware Co., Ltd\n00:13:DB\t\tSHOEI Electric Co.,Ltd\n00:13:DC\t\tIbtek Inc.\n00:13:DD\t\tAbbott Diagnostics\n00:13:DE\t\tAdapt4, LLC\n00:13:DF\t\tRyvor Corp.\n00:13:E0\t\tMurata Manufacturing Co., Ltd.\n00:13:E1\t\tIprobe AB\n00:13:E2\t\tGeoVision Inc.\n00:13:E3\t\tCoVi Technologies, Inc.\n00:13:E4\t\tYangjae Systems Corp.\n00:13:E5\t\tTenosys, Inc.\n00:13:E6\t\tTechnolution\n00:13:E7\t\tHalcro\n00:13:E8\t\tIntel Corporate\n00:13:E9\t\tVeriWave, Inc.\n00:13:EA\t\tKamstrup A/S\n00:13:EB\t\tSysmaster Corporation\n00:13:EC\t\tNetsnapper Technologies SARL\n00:13:ED\t\tPsia\n00:13:EE\t\tJBX Designs Inc.\n00:13:EF\t\tKingjon Digital Technology Co.,Ltd\n00:13:F0\t\tWavefront Semiconductor\n00:13:F1\t\tAMOD Technology Co., Ltd.\n00:13:F2\t\tKlas Ltd\n00:13:F3\t\tGiga-byte Communications Inc.\n00:13:F4\t\tPsitek (Pty) Ltd\n00:13:F5\t\tAkimbi Systems\n00:13:F6\t\tCintech\n00:13:F7\t\tSMC Networks, Inc.\n00:13:F8\t\tDex Security Solutions\n00:13:F9\t\tCavera Systems\n00:13:FA\t\tLifeSize Communications, Inc\n00:13:FB\t\tRkc Instrument Inc.\n00:13:FC\t\tSiCortex, Inc\n00:13:FD\t\tNokia Danmark A/S\n00:13:FE\t\tGrandtec Electronic Corp.\n00:13:FF\t\tDage-MTI of MC, Inc.\n00:14:00\t\tMinerva Korea Co., Ltd\n00:14:01\t\tRivertree Networks Corp.\n00:14:02\t\tkk-electronic a/s\n00:14:03\t\tRenasis, LLC\n00:14:04\t\tCommscope\n00:14:05\t\tOpenIB, Inc.\n00:14:06\t\tGo Networks\n00:14:07\t\tSperian Protection Instrumentation\n00:14:08\t\tEka Systems Inc.\n00:14:09\t\tMAGNETI MARELLI   S.E. S.p.A.\n00:14:0A\t\tWEPIO Co., Ltd.\n00:14:0B\t\tFirst International Computer, Inc.\n00:14:0C\t\tGkb Cctv Co., Ltd.\n00:14:0D\t\tNortel Networks\n00:14:0E\t\tNortel Networks\n00:14:0F\t\tFederal State Unitary Enterprise Leningrad R&D Institute of\n00:14:10\t\tSuzhou Keda Technology CO.,Ltd\n00:14:11\t\tDeutschmann Automation GmbH & Co. KG\n00:14:12\t\tS-TEC electronics AG\n00:14:13\t\tTrebing & Himstedt Prozeßautomation GmbH & Co. KG\n00:14:14\t\tJumpnode Systems LLC.\n00:14:15\t\tIntec Automation inc.\n00:14:16\t\tScosche Industries, Inc.\n00:14:17\t\tRSE Informations Technologie GmbH\n00:14:18\t\tC4Line\n00:14:19\t\tSidsa\n00:14:1A\t\tDeicy Corporation\n00:14:1B\t\tCisco Systems, Inc\n00:14:1C\t\tCisco Systems, Inc\n00:14:1D\t\tKEBA Industrial Automation Germany GmbH\n00:14:1E\t\tP.A. Semi, Inc.\n00:14:1F\t\tSunKwang Electronics Co., Ltd\n00:14:20\t\tG-Links networking company\n00:14:21\t\tTotal Wireless Technologies Pte. Ltd.\n00:14:22\t\tDell Inc.\n00:14:23\t\tJ-S Co. NEUROCOM\n00:14:24\t\tMerry Electrics CO., LTD.\n00:14:25\t\tGalactic Computing Corp.\n00:14:26\t\tNL Technology\n00:14:27\t\tJazzMutant\n00:14:28\t\tVocollect Inc\n00:14:29\t\tV Center Technologies Co., Ltd.\n00:14:2A\t\tElitegroup Computer Systems Co.,Ltd.\n00:14:2B\t\tEdata Communication Inc.\n00:14:2C\t\tKoncept International, Inc.\n00:14:2D\t\tToradex AG\n00:14:2E\t\t77 Elektronika Kft.\n00:14:2F\t\tSavvius\n00:14:30\t\tViPowER, Inc\n00:14:31\t\tPDL Electronics Ltd\n00:14:32\t\tTarallax Wireless, Inc.\n00:14:33\t\tEmpower Technologies(Canada) Inc.\n00:14:34\t\tKeri Systems, Inc\n00:14:35\t\tCityCom Corp.\n00:14:36\t\tQwerty Elektronik AB\n00:14:37\t\tGSTeletech Co.,Ltd.\n00:14:38\t\tHewlett Packard Enterprise\n00:14:39\t\tBlonder Tongue Laboratories, Inc\n00:14:3A\t\tRaytalk International Srl\n00:14:3B\t\tSensovation AG\n00:14:3C\t\tRheinmetall Canada Inc.\n00:14:3D\t\tAevoe Inc.\n00:14:3E\t\tAirLink Communications, Inc.\n00:14:3F\t\tHotway Technology Corporation\n00:14:40\t\tATOMIC Corporation\n00:14:41\t\tInnovation Sound Technology Co., LTD.\n00:14:42\t\tAtto Corporation\n00:14:43\t\tConsultronics Europe Ltd\n00:14:44\t\tGrundfos Holding\n00:14:45\t\tTelefon-Gradnja d.o.o.\n00:14:46\t\tSuperVision Solutions LLC\n00:14:47\t\tBOAZ Inc.\n00:14:48\t\tInventec Multimedia & Telecom Corporation\n00:14:49\t\tSichuan Changhong Electric Ltd.\n00:14:4A\t\tTaiwan Thick-Film Ind. Corp.\n00:14:4B\t\tHifn, Inc.\n00:14:4C\t\tGeneral Meters Corp.\n00:14:4D\t\tIntelligent Systems\n00:14:4E\t\tSrisa\n00:14:4F\t\tOracle Corporation\n00:14:50\t\tHeim Systems GmbH\n00:14:51\t\tApple, Inc.\n00:14:52\t\tCalculex,Inc.\n00:14:53\t\tAdvantech Technologies Co.,Ltd\n00:14:54\t\tSymwave\n00:14:55\t\tCoder Electronics Corporation\n00:14:56\t\tEdge Products\n00:14:57\t\tNevion\n00:14:58\t\tHS Automatic ApS\n00:14:59\t\tMoram Co., Ltd.\n00:14:5A\t\tWestermo Neratec AG\n00:14:5B\t\tSeekerNet Inc.\n00:14:5C\t\tIntronics B.V.\n00:14:5D\t\tWJ Communications, Inc.\n00:14:5E\t\tIBM Corp\n00:14:5F\t\tAditec Co. Ltd\n00:14:60\t\tKyocera Wireless Corp.\n00:14:61\t\tCorona Corporation\n00:14:62\t\tDigiwell Technology, inc\n00:14:63\t\tIdcs N.V.\n00:14:64\t\tCryptosoft\n00:14:65\t\tNovo Nordisk A/S\n00:14:66\t\tKleinhenz Elektronik GmbH\n00:14:67\t\tArrowSpan Inc.\n00:14:68\t\tCelPlan International, Inc.\n00:14:69\t\tCisco Systems, Inc\n00:14:6A\t\tCisco Systems, Inc\n00:14:6B\t\tAnagran, Inc.\n00:14:6C\t\tNetgear\n00:14:6D\t\tRF Technologies\n00:14:6E\t\tH. Stoll GmbH & Co. KG\n00:14:6F\t\tKohler Co\n00:14:70\t\tProkom Software SA\n00:14:71\t\tEastern Asia Technology Limited\n00:14:72\t\tChina Broadband Wireless IP Standard group(ChinaBWIPS)\n00:14:73\t\tBookham Inc\n00:14:74\t\tK40 Electronics\n00:14:75\t\tWiline Networks, Inc.\n00:14:76\t\tMultiCom Industries Limited\n00:14:77\t\tTrilliant\n00:14:78\t\tTp-Link Technologies Co.,Ltd.\n00:14:79\t\tNEC Magnus Communications,Ltd.\n00:14:7A\t\tEubus GmbH\n00:14:7B\t\tIteris, Inc.\n00:14:7C\t\t3Com Ltd\n00:14:7D\t\tAeon Digital International\n00:14:7E\t\tInnerWireless\n00:14:7F\t\tThomson Telecom Belgium\n00:14:80\t\tHitachi-LG Data Storage Korea, Inc\n00:14:81\t\tMultilink Inc\n00:14:82\t\tAurora Networks\n00:14:83\t\teXS Inc.\n00:14:84\t\tCermate Technologies Inc.\n00:14:85\t\tGiga-Byte\n00:14:86\t\tEcho Digital Audio Corporation\n00:14:87\t\tAmerican Technology Integrators\n00:14:88\t\tAkorri\n00:14:89\t\tB15402100 - Jandei, S.L.\n00:14:8A\t\tElin Ebg Traction Gmbh\n00:14:8B\t\tGlobo Electronic GmbH & Co. KG\n00:14:8C\t\tGeneral Dynamics Mission Systems\n00:14:8D\t\tCubic Defense Simulation Systems\n00:14:8E\t\tTele Power Inc.\n00:14:8F\t\tProtronic (Far East) Ltd.\n00:14:90\t\tASP Corporation\n00:14:91\t\tDaniels Electronics Ltd. dba Codan Radio Communications\n00:14:92\t\tLiteon, Mobile Media Solution SBU\n00:14:93\t\tSystimax Solutions\n00:14:94\t\tEsu Ag\n00:14:95\t\t2Wire Inc\n00:14:96\t\tPhonic Corp.\n00:14:97\t\tZHIYUAN Eletronics co.,ltd.\n00:14:98\t\tViking Design Technology\n00:14:99\t\tHelicomm Inc\n00:14:9A\t\tCommscope\n00:14:9B\t\tNokota Communications, LLC\n00:14:9C\t\tHF Company\n00:14:9D\t\tSound ID Inc.\n00:14:9E\t\tUbONE Co., Ltd\n00:14:9F\t\tSystem and Chips, Inc.\n00:14:A0\t\tAccsense, Inc.\n00:14:A1\t\tSynchronous Communication Corp\n00:14:A2\t\tCore Micro Systems Inc.\n00:14:A3\t\tVitelec BV\n00:14:A4\t\tHon Hai Precision Ind. Co.,Ltd.\n00:14:A5\t\tGemtek Technology Co., Ltd.\n00:14:A6\t\tTeranetics, Inc.\n00:14:A7\t\tNokia Danmark A/S\n00:14:A8\t\tCisco Systems, Inc\n00:14:A9\t\tCisco Systems, Inc\n00:14:AA\t\tAshly Audio, Inc.\n00:14:AB\t\tSenhai Electronic Technology Co., Ltd.\n00:14:AC\t\tBountiful WiFi\n00:14:AD\t\tGassner Wiege- und Meßtechnik GmbH\n00:14:AE\t\tWizlogics Co., Ltd.\n00:14:AF\t\tDatasym POS Inc.\n00:14:B0\t\tNaeil Community\n00:14:B1\t\tAxell Wireless Limited\n00:14:B2\t\tmCubelogics Corporation\n00:14:B3\t\tCoreStar International Corp\n00:14:B4\t\tGeneral Dynamics United Kingdom Ltd\n00:14:B5\t\tPhysiometrix,Inc\n00:14:B6\t\tEnswer Technology Inc.\n00:14:B7\t\tAR Infotek Inc.\n00:14:B8\t\tHill-Rom\n00:14:B9\t\tMstar Semiconductor\n00:14:BA\t\tCarvers SA de CV\n00:14:BB\t\tOpen Interface North America\n00:14:BC\t\tSynectic Telecom Exports Pvt. Ltd.\n00:14:BD\t\tincNETWORKS, Inc\n00:14:BE\t\tWink communication technology CO.LTD\n00:14:BF\t\tCisco-Linksys, LLC\n00:14:C0\t\tSymstream Technology Group Ltd\n00:14:C1\t\tU.S. Robotics Corporation\n00:14:C2\t\tHewlett Packard\n00:14:C3\t\tSeagate Technology\n00:14:C4\t\tVitelcom Mobile Technology\n00:14:C5\t\tAlive Technologies Pty Ltd\n00:14:C6\t\tQuixant Ltd\n00:14:C7\t\tNortel Networks\n00:14:C8\t\tContemporary Research Corp\n00:14:C9\t\tBrocade Communications Systems LLC\n00:14:CA\t\tKey Radio Systems Limited\n00:14:CB\t\tLifeSync Corporation\n00:14:CC\t\tZetec, Inc.\n00:14:CD\t\tDigitalZone Co., Ltd.\n00:14:CE\t\tNf Corporation\n00:14:CF\t\tINVISIO Communications\n00:14:D0\t\tBTI Systems Inc.\n00:14:D1\t\tTRENDnet, Inc.\n00:14:D2\t\tKyuden Technosystems Corporation\n00:14:D3\t\tSepsa\n00:14:D4\t\tK Technology Corporation\n00:14:D5\t\tDatang Telecom Technology CO. , LCD,Optical Communication Br\n00:14:D6\t\tJeongmin Electronics Co.,Ltd.\n00:14:D7\t\tDatastore Technology Corp\n00:14:D8\t\tbio-logic SA\n00:14:D9\t\tIP Fabrics, Inc.\n00:14:DA\t\tHuntleigh Healthcare\n00:14:DB\t\tElma Trenew Electronic GmbH\n00:14:DC\t\tCommunication System Design & Manufacturing (CSDM)\n00:14:DD\t\tCovergence Inc.\n00:14:DE\t\tSage Instruments Inc.\n00:14:DF\t\tHI-P Tech Corporation\n00:14:E0\t\tLET'S Corporation\n00:14:E1\t\tData Display AG\n00:14:E2\t\tdatacom systems inc.\n00:14:E3\t\tmm-lab GmbH\n00:14:E4\t\tinfinias, LLC\n00:14:E5\t\tAlticast\n00:14:E6\t\tAIM Infrarotmodule GmbH\n00:14:E7\t\tStolinx,. Inc\n00:14:E8\t\tCommscope\n00:14:E9\t\tNortech International\n00:14:EA\t\tS Digm Inc. (Safe Paradigm Inc.)\n00:14:EB\t\tAwarePoint Corporation\n00:14:EC\t\tAcro Telecom\n00:14:ED\t\tAirak, Inc.\n00:14:EE\t\tWestern Digital Technologies, Inc.\n00:14:EF\t\tTZero Technologies, Inc.\n00:14:F0\t\tBusiness Security OL AB\n00:14:F1\t\tCisco Systems, Inc\n00:14:F2\t\tCisco Systems, Inc\n00:14:F3\t\tViXS Systems Inc\n00:14:F4\t\tDekTec Digital Video B.V.\n00:14:F5\t\tOSI Security Devices\n00:14:F6\t\tJuniper Networks\n00:14:F7\t\tCREVIS Co., LTD\n00:14:F8\t\tScientific Atlanta\n00:14:F9\t\tVantage Controls\n00:14:FA\t\tAsGa S.A.\n00:14:FB\t\tTechnical Solutions Inc.\n00:14:FC\t\tExtandon, Inc.\n00:14:FD\t\tThecus Technology Corp.\n00:14:FE\t\tArtech Electronics\n00:14:FF\t\tPrecise Automation, Inc.\n00:15:00\t\tIntel Corporate\n00:15:01\t\tLexBox\n00:15:02\t\tBETA tech\n00:15:03\t\tPROFIcomms s.r.o.\n00:15:04\t\tGame Plus Co., Ltd.\n00:15:05\t\tActiontec Electronics, Inc\n00:15:06\t\tNeo Photonics\n00:15:07\t\tRenaissance Learning Inc\n00:15:08\t\tGlobal Target Enterprise Inc\n00:15:09\t\tPlus Technology Co., Ltd\n00:15:0A\t\tSonoa Systems, Inc\n00:15:0B\t\tSage Infotech Ltd.\n00:15:0C\t\tAVM GmbH\n00:15:0D\t\tHoana Medical, Inc.\n00:15:0E\t\tOpenbrain Technologies Co., Ltd.\n00:15:0F\t\tmingjong\n00:15:10\t\tTechsphere Co., Ltd\n00:15:11\t\tData Center Systems\n00:15:12\t\tZurich University of Applied Sciences\n00:15:13\t\tEFS sas\n00:15:14\t\tHu Zhou NAVA Networks&Electronics Ltd.\n00:15:15\t\tLeipold+Co.GmbH\n00:15:16\t\tUriel Systems Inc.\n00:15:17\t\tIntel Corporate\n00:15:18\t\tShenzhen 10MOONS Technology Development CO.,Ltd\n00:15:19\t\tStoreAge Networking Technologies\n00:15:1A\t\tHunter Engineering Company\n00:15:1B\t\tIsilon Systems Inc.\n00:15:1C\t\tLeneco\n00:15:1D\t\tM2I Corporation\n00:15:1E\t\tETHERNET Powerlink Standarization Group (EPSG)\n00:15:1F\t\tMultivision Intelligent Surveillance (Hong Kong) Ltd\n00:15:20\t\tRadiocrafts AS\n00:15:21\t\tHoroquartz\n00:15:22\t\tDea Security\n00:15:23\t\tMeteor Communications Corporation\n00:15:24\t\tNumatics, Inc.\n00:15:25\t\tChamberlain Access Solutions\n00:15:26\t\tRemote Technologies Inc\n00:15:27\t\tBalboa Instruments\n00:15:28\t\tBeacon Medical Products LLC d.b.a. BeaconMedaes\n00:15:29\t\tN3 Corporation\n00:15:2A\t\tNokia Corporation\n00:15:2B\t\tCisco Systems, Inc\n00:15:2C\t\tCisco Systems, Inc\n00:15:2D\t\tTenX Networks, LLC\n00:15:2E\t\tPacketHop, Inc.\n00:15:2F\t\tCommscope\n00:15:30\t\tDell EMC\n00:15:31\t\tKocom\n00:15:32\t\tConsumer Technologies Group, LLC\n00:15:33\t\tNadam.Co.,Ltd\n00:15:34\t\tA Beltrónica-Companhia de Comunicações, Lda\n00:15:35\t\tOTE Spa\n00:15:36\t\tPowertech co.,Ltd\n00:15:37\t\tVentus Networks\n00:15:38\t\tRFID, Inc.\n00:15:39\t\tTechnodrive srl\n00:15:3A\t\tShenzhen Syscan Technology Co.,Ltd.\n00:15:3B\t\tEMH Metering GmbH & Co. KG\n00:15:3C\t\tKprotech Co., Ltd.\n00:15:3D\t\tElim Product Co.\n00:15:3E\t\tQ-Matic Sweden AB\n00:15:3F\t\tAlcatel Alenia Space Italia\n00:15:40\t\tNortel Networks\n00:15:41\t\tStrataLight Communications, Inc.\n00:15:42\t\tMicrohard S.R.L.\n00:15:43\t\tAberdeen Test Center\n00:15:44\t\tcoM.s.a.t. AG\n00:15:45\t\tSEECODE Co., Ltd.\n00:15:46\t\tITG Worldwide Sdn Bhd\n00:15:47\t\tAiZen Solutions Inc.\n00:15:48\t\tCube Technologies\n00:15:49\t\tDixtal Biomedica Ind. Com. Ltda\n00:15:4A\t\tWanshih Electronic Co., Ltd\n00:15:4B\t\tWonde Proud Technology Co., Ltd\n00:15:4C\t\tSaunders Electronics\n00:15:4D\t\tNetronome Systems, Inc.\n00:15:4E\t\tIec\n00:15:4F\t\tone RF Technology\n00:15:50\t\tNits Technology Inc\n00:15:51\t\tRadioPulse Inc.\n00:15:52\t\tWi-Gear Inc.\n00:15:53\t\tCytyc Corporation\n00:15:54\t\tAtalum Wireless S.A.\n00:15:55\t\tDFM GmbH\n00:15:56\t\tSagemcom Broadband SAS\n00:15:57\t\tOlivetti\n00:15:58\t\tFoxconn\n00:15:59\t\tSecuraplane Technologies, Inc.\n00:15:5A\t\tDainippon Pharmaceutical Co., Ltd.\n00:15:5B\t\tSampo Corporation\n00:15:5C\t\tDresser Wayne\n00:15:5D\t\tMicrosoft Corporation\n00:15:5E\t\tMorgan Stanley\n00:15:5F\t\tGreenPeak Technologies\n00:15:60\t\tHewlett Packard\n00:15:61\t\tJJPlus Corporation\n00:15:62\t\tCisco Systems, Inc\n00:15:63\t\tCisco Systems, Inc\n00:15:64\t\tBEHRINGER Spezielle Studiotechnik GmbH\n00:15:65\t\tXiamen Yealink Network Technology Co.,Ltd\n00:15:66\t\tA-First Technology Co., Ltd.\n00:15:67\t\tRADWIN Inc.\n00:15:68\t\tDilithium Networks\n00:15:69\t\tPECO II, Inc.\n00:15:6A\t\tDG2L Technologies Pvt. Ltd.\n00:15:6B\t\tPerfisans Networks Corp.\n00:15:6C\t\tSane System Co., Ltd\n00:15:6D\t\tUbiquiti Inc\n00:15:6E\t\tA. W. Communication Systems Ltd\n00:15:6F\t\tXiranet Communications GmbH\n00:15:70\t\tZebra Technologies Inc\n00:15:71\t\tNolan Systems\n00:15:72\t\tRed-Lemon\n00:15:73\t\tNewSoft  Technology Corporation\n00:15:74\t\tHorizon Semiconductors Ltd.\n00:15:75\t\tNevis Networks Inc.\n00:15:76\t\tLABiTec - Labor Biomedical Technologies GmbH\n00:15:77\t\tAllied Telesis, Inc.\n00:15:78\t\tAudio / Video Innovations\n00:15:79\t\tLunatone Industrielle Elektronik GmbH\n00:15:7A\t\tTelefin S.p.A.\n00:15:7B\t\tLeuze electronic GmbH + Co. KG\n00:15:7C\t\tDave Networks, Inc.\n00:15:7D\t\tPosdata\n00:15:7E\t\tWeidmüller Interface GmbH & Co. KG\n00:15:7F\t\tChuanG International Holding CO.,LTD.\n00:15:80\t\tU-Way Corporation\n00:15:81\t\tMAKUS Inc.\n00:15:82\t\tPulse Eight Limited\n00:15:83\t\tIVT corporation\n00:15:84\t\tSchenck Process GmbH\n00:15:85\t\tAonvision Technolopy Corp.\n00:15:86\t\tXiamen Overseas Chinese Electronic Co., Ltd.\n00:15:87\t\tTakenaka Seisakusho Co.,Ltd\n00:15:88\t\tSalutica Allied Solutions Sdn Bhd\n00:15:89\t\tD-MAX Technology Co.,Ltd\n00:15:8A\t\tSURECOM Technology Corp.\n00:15:8B\t\tPark Air Systems Ltd\n00:15:8C\t\tLiab ApS\n00:15:8D\t\tJennic Ltd\n00:15:8E\t\tPlustek.INC\n00:15:8F\t\tNTT Advanced Technology Corporation\n00:15:90\t\tHectronic GmbH\n00:15:91\t\tRLW Inc.\n00:15:92\t\tFacom UK Ltd (Melksham)\n00:15:93\t\tU4EA Technologies Inc.\n00:15:94\t\tBixolon Co.,Ltd\n00:15:95\t\tQuester Tangent Corporation\n00:15:96\t\tCommscope\n00:15:97\t\tAeta Audio Systems\n00:15:98\t\tKolektor group\n00:15:99\t\tSamsung Electronics Co.,Ltd\n00:15:9A\t\tCommscope\n00:15:9B\t\tNortel Networks\n00:15:9C\t\tB-KYUNG SYSTEM Co.,Ltd.\n00:15:9D\t\tTripp Lite\n00:15:9E\t\tMad Catz Interactive Inc\n00:15:9F\t\tTerascala, Inc.\n00:15:A0\t\tNokia Danmark A/S\n00:15:A1\t\tEca-Sinters\n00:15:A2\t\tCommscope\n00:15:A3\t\tCommscope\n00:15:A4\t\tCommscope\n00:15:A5\t\tDCI Co., Ltd.\n00:15:A6\t\tDigital Electronics Products Ltd.\n00:15:A7\t\tRobatech AG\n00:15:A8\t\tCommscope\n00:15:A9\t\tKwang Woo I&C Co.,Ltd\n00:15:AA\t\tRextechnik International Co.,\n00:15:AB\t\tPro Co Sound Inc\n00:15:AC\t\tCapelon AB\n00:15:AD\t\tAccedian Networks\n00:15:AE\t\tkyung il\n00:15:AF\t\tAzureWave Technology Inc.\n00:15:B0\t\tAutotelenet Co.,Ltd\n00:15:B1\t\tAmbient Corporation\n00:15:B2\t\tAdvanced Industrial Computer, Inc.\n00:15:B3\t\tCaretech AB\n00:15:B4\t\tPolymap  Wireless LLC\n00:15:B5\t\tCI Network Corp.\n00:15:B6\t\tShinMaywa Industries, Ltd.\n00:15:B7\t\tToshiba\n00:15:B8\t\tTahoe\n00:15:B9\t\tSamsung Electronics Co.,Ltd\n00:15:BA\t\tiba AG\n00:15:BB\t\tSMA Solar Technology AG\n00:15:BC\t\tDevelco\n00:15:BD\t\tGroup 4 Technology Ltd\n00:15:BE\t\tIqua Ltd.\n00:15:BF\t\ttechnicob\n00:15:C0\t\tDigital Telemedia Co.,Ltd.\n00:15:C1\t\tSony Interactive Entertainment Inc.\n00:15:C2\t\t3M Germany\n00:15:C3\t\tRuf Telematik AG\n00:15:C4\t\tFlovel Co., Ltd.\n00:15:C5\t\tDell Inc.\n00:15:C6\t\tCisco Systems, Inc\n00:15:C7\t\tCisco Systems, Inc\n00:15:C8\t\tFlexiPanel Ltd\n00:15:C9\t\tGumstix, Inc\n00:15:CA\t\tTeraRecon, Inc.\n00:15:CB\t\tSurf Communication Solutions Ltd.\n00:15:CC\t\tUquest, Ltd.\n00:15:CD\t\tExartech International Corp.\n00:15:CE\t\tCommscope\n00:15:CF\t\tCommscope\n00:15:D0\t\tCommscope\n00:15:D1\t\tCommscope\n00:15:D2\t\tXantech Corporation\n00:15:D3\t\tPantech&Curitel Communications, Inc.\n00:15:D4\t\tEmitor AB\n00:15:D5\t\tNicevt\n00:15:D6\t\tOSLiNK Sp. z o.o.\n00:15:D7\t\tReti Corporation\n00:15:D8\t\tInterlink Electronics\n00:15:D9\t\tPKC Electronics Oy\n00:15:DA\t\tIritel A.D.\n00:15:DB\t\tCanesta Inc.\n00:15:DC\t\tKT&C Co., Ltd.\n00:15:DD\t\tIP Control Systems Ltd.\n00:15:DE\t\tNokia Danmark A/S\n00:15:DF\t\tClivet S.p.A.\n00:15:E0\t\tEricsson\n00:15:E1\t\tPicochip Ltd\n00:15:E2\t\tDr.Ing. Herbert Knauer GmbH\n00:15:E3\t\tDream Technologies Corporation\n00:15:E4\t\tZimmer Elektromedizin\n00:15:E5\t\tCheertek Inc.\n00:15:E6\t\tMOBILE TECHNIKA Inc.\n00:15:E7\t\tQuantec Tontechnik\n00:15:E8\t\tNortel Networks\n00:15:E9\t\tD-Link Corporation\n00:15:EA\t\tTellumat (Pty) Ltd\n00:15:EB\t\tzte corporation\n00:15:EC\t\tBoca Devices LLC\n00:15:ED\t\tFulcrum Microsystems, Inc.\n00:15:EE\t\tOmnex Control Systems\n00:15:EF\t\tNEC TOKIN Corporation\n00:15:F0\t\tEgo Bv\n00:15:F1\t\tKYLINK Communications Corp.\n00:15:F2\t\tASUSTek COMPUTER INC.\n00:15:F3\t\tPeltor Ab\n00:15:F4\t\tEventide\n00:15:F5\t\tSustainable Energy Systems\n00:15:F6\t\tScience And Engineering Services, Inc.\n00:15:F7\t\tWintecronics Ltd.\n00:15:F8\t\tKingtronics Industrial Co. Ltd.\n00:15:F9\t\tCisco Systems, Inc\n00:15:FA\t\tCisco Systems, Inc\n00:15:FB\t\tsetex schermuly textile computer gmbh\n00:15:FC\t\tLittelfuse Startco\n00:15:FD\t\tComplete Media Systems\n00:15:FE\t\tSchilling Robotics Llc\n00:15:FF\t\tInseego Wireless, Inc\n00:16:00\t\tCelleBrite Mobile Synchronization\n00:16:01\t\tBuffalo.Inc\n00:16:02\t\tCeyon Technology Co.,Ltd.\n00:16:03\t\tCOOLKSKY Co., LTD\n00:16:04\t\tSigpro\n00:16:05\t\tYorkville Sound Inc.\n00:16:06\t\tIdeal Industries\n00:16:07\t\tCurves International Inc.\n00:16:08\t\tSequans Communications\n00:16:09\t\tUnitech electronics co., ltd.\n00:16:0A\t\tSWEEX Europe BV\n00:16:0B\t\tTVWorks LLC\n00:16:0C\t\tLpl  Development S.A. De C.V\n00:16:0D\t\tBe Here Corporation\n00:16:0E\t\tOptica Technologies Inc.\n00:16:0F\t\tBadger Meter Inc\n00:16:10\t\tCarina Technology\n00:16:11\t\tAltecon Srl\n00:16:12\t\tOtsuka Electronics Co., Ltd.\n00:16:13\t\tLibreStream Technologies Inc.\n00:16:14\t\tPicosecond Pulse Labs\n00:16:15\t\tNittan Company, Limited\n00:16:16\t\tBrowan Communications Incorporation\n00:16:17\t\tMsi\n00:16:18\t\tHIVION Co., Ltd.\n00:16:19\t\tLancelan Technologies S.L.\n00:16:1A\t\tDametric AB\n00:16:1B\t\tMicronet Corporation\n00:16:1C\t\te:cue\n00:16:1D\t\tInnovative Wireless Technologies, Inc.\n00:16:1E\t\tWoojinnet\n00:16:1F\t\tSUNWAVETEC Co., Ltd.\n00:16:20\t\tSony Corporation\n00:16:21\t\tColorado Vnet\n00:16:22\t\tBbh Systems Gmbh\n00:16:23\t\tInterval Media\n00:16:24\t\tTeneros, Inc.\n00:16:25\t\tImpinj, Inc.\n00:16:26\t\tCommscope\n00:16:27\t\tembedded-logic DESIGN AND MORE GmbH\n00:16:28\t\tMagicard Ltd\n00:16:29\t\tNivus GmbH\n00:16:2A\t\tAntik computers & communications s.r.o.\n00:16:2B\t\tTogami Electric Mfg.co.,Ltd.\n00:16:2C\t\tXanboo\n00:16:2D\t\tSTNet Co., Ltd.\n00:16:2E\t\tSpace Shuttle Hi-Tech Co., Ltd.\n00:16:2F\t\tGeutebrück GmbH\n00:16:30\t\tVativ Technologies\n00:16:31\t\tXteam\n00:16:32\t\tSamsung Electronics Co.,Ltd\n00:16:33\t\tOxford Diagnostics Ltd.\n00:16:34\t\tMathtech, Inc.\n00:16:35\t\tHewlett Packard\n00:16:36\t\tQuanta Computer Inc.\n00:16:37\t\tCITEL SpA\n00:16:38\t\tTECOM Co., Ltd.\n00:16:39\t\tUbiquam Co., Ltd.\n00:16:3A\t\tYves Technology Co., Ltd.\n00:16:3B\t\tCommunications & Power Industries\n00:16:3C\t\tRebox B.V.\n00:16:3D\t\tTsinghua Tongfang Legend Silicon Tech. Co., Ltd.\n00:16:3E\t\tXensource, Inc.\n00:16:3F\t\tCReTE SYSTEMS Inc.\n00:16:40\t\tAsmobile Communication Inc.\n00:16:41\t\tUniversal Global Scientific Industrial Co., Ltd.\n00:16:42\t\tPangolin\n00:16:43\t\tSunhillo Corporation\n00:16:44\t\tLITE-ON Technology Corp.\n00:16:45\t\tEaton Corporation\n00:16:46\t\tCisco Systems, Inc\n00:16:47\t\tCisco Systems, Inc\n00:16:48\t\tSSD Company Limited\n00:16:49\t\tSetOne GmbH\n00:16:4A\t\tVibration Technology Limited\n00:16:4B\t\tQuorion Data Systems GmbH\n00:16:4C\t\tPLANET INT Co., Ltd\n00:16:4D\t\tAlcatel-Lucent IPD\n00:16:4E\t\tNokia Danmark A/S\n00:16:4F\t\tWorld Ethnic Broadcastin Inc.\n00:16:50\t\tKratos EPD\n00:16:51\t\tExeo Systems\n00:16:52\t\tHoatech Technologies, Inc.\n00:16:53\t\tLEGO System A/S IE Electronics Division\n00:16:54\t\tFlex-P Industries Sdn. Bhd.\n00:16:55\t\tFUHO TECHNOLOGY Co., LTD\n00:16:56\t\tNintendo Co., Ltd.\n00:16:57\t\tAegate Ltd\n00:16:58\t\tFusiontech Technologies Inc.\n00:16:59\t\tZ.M.P. Radwag\n00:16:5A\t\tHarman Specialty Group\n00:16:5B\t\tGrip Audio\n00:16:5C\t\tTrackflow Ltd.\n00:16:5D\t\tAirDefense, Inc.\n00:16:5E\t\tPrecision I/O\n00:16:5F\t\tFairmount Automation\n00:16:60\t\tNortel Networks\n00:16:61\t\tNovatium Solutions (P) Ltd\n00:16:62\t\tLiyuh Technology Ltd.\n00:16:63\t\tKBT Mobile\n00:16:64\t\tProd-El SpA\n00:16:65\t\tCellon France\n00:16:66\t\tQuantier Communication Inc.\n00:16:67\t\tA-TEC Subsystem INC.\n00:16:68\t\tEishin Electronics\n00:16:69\t\tMRV Communication (Networks) LTD\n00:16:6A\t\tTps\n00:16:6B\t\tSamsung Electronics Co.,Ltd\n00:16:6C\t\tSamsung Electronics Co.,Ltd\n00:16:6D\t\tYulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd\n00:16:6E\t\tArbitron Inc.\n00:16:6F\t\tIntel Corporate\n00:16:70\t\tSKNET Corporation\n00:16:71\t\tSymphox Information Co.\n00:16:72\t\tZenway enterprise ltd\n00:16:73\t\tBury GmbH & Co. KG\n00:16:74\t\tEuroCB (Phils.), Inc.\n00:16:75\t\tCommscope\n00:16:76\t\tIntel Corporate\n00:16:77\t\tBihl + Wiedemann GmbH\n00:16:78\t\tShenzhen Baoan Gaoke Electronics Co., Ltd\n00:16:79\t\teOn Communications\n00:16:7A\t\tSkyworth Overseas Development Ltd.\n00:16:7B\t\tHaver&Boecker\n00:16:7C\t\tiRex Technologies BV\n00:16:7D\t\tSky-Line Information Co., Ltd.\n00:16:7E\t\tDiboss.Co.,Ltd\n00:16:7F\t\tBluebird Soft Inc.\n00:16:80\t\tBally Gaming + Systems\n00:16:81\t\tVector Informatik GmbH\n00:16:82\t\tOMS Motion\n00:16:83\t\tWEBIO International Co.,.Ltd.\n00:16:84\t\tDonjin Co.,Ltd.\n00:16:85\t\tElisa Oyj\n00:16:86\t\tKarl Storz Imaging\n00:16:87\t\tChubb CSC-Vendor AP\n00:16:88\t\tServerEngines LLC\n00:16:89\t\tPilkor Electronics Co., Ltd\n00:16:8A\t\tid-Confirm Inc\n00:16:8B\t\tParalan Corporation\n00:16:8C\t\tDSL Partner AS\n00:16:8D\t\tKORWIN CO., Ltd.\n00:16:8E\t\tVimicro corporation\n00:16:8F\t\tGN Netcom A/S\n00:16:90\t\tJ-Tek Incorporation\n00:16:91\t\tMoser-Baer AG\n00:16:92\t\tScientific-Atlanta, Inc.\n00:16:93\t\tPowerLink Technology Inc.\n00:16:94\t\tSennheiser Communications A/S\n00:16:95\t\tAVC Technology (International) Limited\n00:16:96\t\tQDI Technology (H.K.) Limited\n00:16:97\t\tNEC Corporation\n00:16:98\t\tT&A Mobile Phones\n00:16:99\t\tTonic DVB Marketing Ltd\n00:16:9A\t\tQuadrics Ltd\n00:16:9B\t\tAlstom Transport\n00:16:9C\t\tCisco Systems, Inc\n00:16:9D\t\tCisco Systems, Inc\n00:16:9E\t\tTV One Ltd\n00:16:9F\t\tVimtron Electronics Co., Ltd.\n00:16:A0\t\tAuto-Maskin\n00:16:A1\t\t3Leaf Networks\n00:16:A2\t\tCentraLite Systems, Inc.\n00:16:A3\t\tIngeteam\n00:16:A4\t\tEzurio Ltd\n00:16:A5\t\tTandberg Storage ASA\n00:16:A6\t\tDovado FZ-LLC\n00:16:A7\t\tAweta G&P\n00:16:A8\t\tCwt Co., Ltd.\n00:16:A9\t\t2Ei\n00:16:AA\t\tKei Communication Technology Inc.\n00:16:AB\t\tDansensor A/S\n00:16:AC\t\tToho Technology Corp.\n00:16:AD\t\tBT-Links Company Limited\n00:16:AE\t\tInventel\n00:16:AF\t\tShenzhen Union Networks Equipment Co.,Ltd.\n00:16:B0\t\tVK Corporation\n00:16:B1\t\tKbs\n00:16:B2\t\tDriveCam Inc\n00:16:B3\t\tPhotonicbridges (China) Co., Ltd.\n00:16:B4\t\tPrivate\n00:16:B5\t\tCommscope\n00:16:B6\t\tCisco-Linksys, LLC\n00:16:B7\t\tSeoul Commtech\n00:16:B8\t\tSony Corporation\n00:16:B9\t\tProCurve Networking by HP\n00:16:BA\t\tWeathernews Inc.\n00:16:BB\t\tLaw-Chain Computer Technology Co Ltd\n00:16:BC\t\tNokia Danmark A/S\n00:16:BD\t\tATI Industrial Automation\n00:16:BE\t\tINFRANET, Inc.\n00:16:BF\t\tPaloDEx Group Oy\n00:16:C0\t\tSemtech Corporation\n00:16:C1\t\tEleksen Ltd\n00:16:C2\t\tAvtec Systems Inc\n00:16:C3\t\tBA Systems Inc\n00:16:C4\t\tSiRF Technology, Inc.\n00:16:C5\t\tShenzhen Xing Feng Industry Co.,Ltd\n00:16:C6\t\tNorth Atlantic Industries\n00:16:C7\t\tCisco Systems, Inc\n00:16:C8\t\tCisco Systems, Inc\n00:16:C9\t\tNAT Seattle, Inc.\n00:16:CA\t\tNortel Networks\n00:16:CB\t\tApple, Inc.\n00:16:CC\t\tXcute Mobile Corp.\n00:16:CD\t\tHiji High-Tech Co., Ltd.\n00:16:CE\t\tHon Hai Precision Ind. Co.,Ltd.\n00:16:CF\t\tHon Hai Precision Ind. Co.,Ltd.\n00:16:D0\t\tATech elektronika d.o.o.\n00:16:D1\t\tZAT a.s.\n00:16:D2\t\tCaspian\n00:16:D3\t\tWistron Corporation\n00:16:D4\t\tCompal Communications, Inc.\n00:16:D5\t\tSynccom Co., Ltd\n00:16:D6\t\tTDA Tech Pty Ltd\n00:16:D7\t\tSunways AG\n00:16:D8\t\tSenea AB\n00:16:D9\t\tNingbo Bird Co.,Ltd.\n00:16:DA\t\tFutronic Technology Co. Ltd.\n00:16:DB\t\tSamsung Electronics Co.,Ltd\n00:16:DC\t\tArchos\n00:16:DD\t\tGigabeam Corporation\n00:16:DE\t\tFAST Inc\n00:16:DF\t\tLundinova AB\n00:16:E0\t\t3Com Ltd\n00:16:E1\t\tSiliconStor, Inc.\n00:16:E2\t\tAmerican Fibertek, Inc.\n00:16:E3\t\tAskey Computer Corp\n00:16:E4\t\tVanguard Security Engineering Corp.\n00:16:E5\t\tFordley Development Limited\n00:16:E6\t\tGiga-Byte Technology Co.,Ltd.\n00:16:E7\t\tDynamix Promotions Limited\n00:16:E8\t\tLumissil Microsystems\n00:16:E9\t\tTiba Medical Inc\n00:16:EA\t\tIntel Corporate\n00:16:EB\t\tIntel Corporate\n00:16:EC\t\tElitegroup Computer Systems Co.,Ltd.\n00:16:ED\t\tUtility, Inc\n00:16:EE\t\tRoyaldigital Inc.\n00:16:EF\t\tKoko Fitness, Inc.\n00:16:F0\t\tDell\n00:16:F1\t\tOmniSense, LLC\n00:16:F2\t\tDmobile System Co., Ltd.\n00:16:F3\t\tCAST Information Co., Ltd\n00:16:F4\t\tEidicom Co., Ltd.\n00:16:F5\t\tDalian Golden Hualu Digital Technology Co.,Ltd\n00:16:F6\t\tNevion\n00:16:F7\t\tL-3 Communications, Aviation Recorders\n00:16:F8\t\tAviqtech Technology Co., Ltd.\n00:16:F9\t\tCETRTA POT, d.o.o., Kranj\n00:16:FA\t\tECI Telecom Ltd.\n00:16:FB\t\tShenzhen Mtc Co Ltd\n00:16:FC\t\tTohken Co.,Ltd.\n00:16:FD\t\tJaty Electronics\n00:16:FE\t\tAlpsalpine Co,.Ltd\n00:16:FF\t\tWamin Optocomm Mfg Corp\n00:17:00\t\tCommscope\n00:17:01\t\tKDE, Inc.\n00:17:02\t\tOsung Midicom Co., Ltd\n00:17:03\t\tMOSDAN Internation Co.,Ltd\n00:17:04\t\tShinco Electronics Group Co.,Ltd\n00:17:05\t\tMethode Electronics\n00:17:06\t\tTechfaithwireless Communication Technology Limited.\n00:17:07\t\tInGrid, Inc\n00:17:08\t\tHewlett Packard\n00:17:09\t\tExalt Communications\n00:17:0A\t\tInew Digital Company\n00:17:0B\t\tContela, Inc.\n00:17:0C\t\tTwig Com Ltd.\n00:17:0D\t\tDust Networks Inc.\n00:17:0E\t\tCisco Systems, Inc\n00:17:0F\t\tCisco Systems, Inc\n00:17:10\t\tAxyomCore Inc.\n00:17:11\t\tCytiva Sweden AB\n00:17:12\t\tISCO International\n00:17:13\t\tTiger NetCom\n00:17:14\t\tBR Controls Nederland bv\n00:17:15\t\tQstik\n00:17:16\t\tQno Technology Inc.\n00:17:17\t\tLeica Geosystems AG\n00:17:18\t\tVansco Electronics Oy\n00:17:19\t\tAudiocodes USA, Inc\n00:17:1A\t\tWinegard Company\n00:17:1B\t\tInnovation Lab Corp.\n00:17:1C\t\tNT MicroSystems, Inc.\n00:17:1D\t\tDigit\n00:17:1E\t\tTheo Benning GmbH & Co. KG\n00:17:1F\t\tIMV Corporation\n00:17:20\t\tImage Sensing Systems, Inc.\n00:17:21\t\tFITRE S.p.A.\n00:17:22\t\tHanazeder Electronic GmbH\n00:17:23\t\tSummit Data Communications\n00:17:24\t\tStuder Professional Audio GmbH\n00:17:25\t\tLiquid Computing\n00:17:26\t\tm2c Electronic Technology Ltd.\n00:17:27\t\tThermo Ramsey Italia s.r.l.\n00:17:28\t\tSelex Communications\n00:17:29\t\tUbicod Co.LTD\n00:17:2A\t\tProware Technology Corp.(By Unifosa)\n00:17:2B\t\tGlobal Technologies Inc.\n00:17:2C\t\tTaejin Infotech\n00:17:2D\t\tAxcen Photonics Corporation\n00:17:2E\t\tFXC Inc.\n00:17:2F\t\tNeuLion Incorporated\n00:17:30\t\tAutomation Electronics\n00:17:31\t\tASUSTek COMPUTER INC.\n00:17:32\t\tScience-Technical Center \"RISSA\"\n00:17:33\t\tSfr\n00:17:34\t\tADC Telecommunications\n00:17:35\t\tIntel Wireless Network Group\n00:17:36\t\tiiTron Inc.\n00:17:37\t\tIndustrie Dial Face S.p.A.\n00:17:38\t\tInternational Business Machines\n00:17:39\t\tBright Headphone Electronics Company\n00:17:3A\t\tCloudastructure Inc\n00:17:3B\t\tCisco Systems, Inc\n00:17:3C\t\tExtreme Engineering Solutions\n00:17:3D\t\tNeology\n00:17:3E\t\tLeucotronEquipamentos Ltda.\n00:17:3F\t\tBelkin International Inc.\n00:17:40\t\tBluberi Gaming Technologies Inc\n00:17:41\t\tDefidev\n00:17:42\t\tFujitsu Limited\n00:17:43\t\tDeck Srl\n00:17:44\t\tAraneo Ltd.\n00:17:45\t\tINNOTZ CO., Ltd\n00:17:46\t\tFreedom9 Inc.\n00:17:47\t\tTrimble\n00:17:48\t\tNeokoros Brasil Ltda\n00:17:49\t\tHyundae Yong-O-Sa Co.,Ltd\n00:17:4A\t\tSocomec\n00:17:4B\t\tNokia Danmark A/S\n00:17:4C\t\tMillipore\n00:17:4D\t\tDynamic Network Factory, Inc.\n00:17:4E\t\tParama-tech Co.,Ltd.\n00:17:4F\t\tiCatch Inc.\n00:17:50\t\tGSI Group, MicroE Systems\n00:17:51\t\tOnline Corporation\n00:17:52\t\tDAGS, Inc\n00:17:53\t\tnFore Technology Inc.\n00:17:54\t\tArkino HiTOP Corporation Limited\n00:17:55\t\tGE Security\n00:17:56\t\tVinci Labs Oy\n00:17:57\t\tRix Technology Limited\n00:17:58\t\tThruVision Ltd\n00:17:59\t\tCisco Systems, Inc\n00:17:5A\t\tCisco Systems, Inc\n00:17:5B\t\tACS Solutions Switzerland Ltd.\n00:17:5C\t\tSharp Corporation\n00:17:5D\t\tDongseo system.\n00:17:5E\t\tZed-3\n00:17:5F\t\tXENOLINK Communications Co., Ltd.\n00:17:60\t\tNaito Densei Machida MFG.CO.,LTD\n00:17:61\t\tPrivate\n00:17:62\t\tSolar Technology, Inc.\n00:17:63\t\tEssentia S.p.A.\n00:17:64\t\tATMedia GmbH\n00:17:65\t\tNortel Networks\n00:17:66\t\tAccense Technology, Inc.\n00:17:67\t\tEarforce AS\n00:17:68\t\tZinwave Ltd\n00:17:69\t\tCymphonix Corp\n00:17:6A\t\tAvago Technologies\n00:17:6B\t\tKiyon, Inc.\n00:17:6C\t\tPivot3, Inc.\n00:17:6D\t\tCore Corporation\n00:17:6E\t\tDucati Sistemi\n00:17:6F\t\tPAX Computer Technology(Shenzhen) Ltd.\n00:17:70\t\tArti Industrial Electronics Ltd.\n00:17:71\t\tAPD Communications Ltd\n00:17:72\t\tASTRO Strobel Kommunikationssysteme GmbH\n00:17:73\t\tLaketune Technologies Co. Ltd\n00:17:74\t\tElesta GmbH\n00:17:75\t\tTTE Germany GmbH\n00:17:76\t\tMeso Scale Diagnostics, LLC\n00:17:77\t\tObsidian Research Corporation\n00:17:78\t\tCentral Music Co.\n00:17:79\t\tQuickTel\n00:17:7A\t\tAssa Abloy Ab\n00:17:7B\t\tAzalea Networks inc\n00:17:7C\t\tSmartlink Network Systems Limited\n00:17:7D\t\tIDT Technology Limited\n00:17:7E\t\tMeshcom Technologies Inc.\n00:17:7F\t\tWorldsmart Retech\n00:17:80\t\tApplied Biosystems B.V.\n00:17:81\t\tGreystone Data System, Inc.\n00:17:82\t\tLoBenn Inc.\n00:17:83\t\tTexas Instruments\n00:17:84\t\tCommscope\n00:17:85\t\tSparr Electronics Ltd\n00:17:86\t\twisembed\n00:17:87\t\tBrother, Brother & Sons ApS\n00:17:88\t\tPhilips Lighting BV\n00:17:89\t\tZenitron Corporation\n00:17:8A\t\tDarts Technologies Corp.\n00:17:8B\t\tTeledyne Technologies Incorporated\n00:17:8C\t\tIndependent Witness, Inc\n00:17:8D\t\tCheckpoint Systems, Inc.\n00:17:8E\t\tGunnebo Cash Automation AB\n00:17:8F\t\tNingbo Yidong Electronic Co.,Ltd.\n00:17:90\t\tHYUNDAI DIGITECH Co, Ltd.\n00:17:91\t\tLinTech GmbH\n00:17:92\t\tFalcom Wireless Comunications Gmbh\n00:17:93\t\tTigi Corporation\n00:17:94\t\tCisco Systems, Inc\n00:17:95\t\tCisco Systems, Inc\n00:17:96\t\tRittmeyer AG\n00:17:97\t\tTelsy Elettronica S.p.A.\n00:17:98\t\tAzonic Technology Co., LTD\n00:17:99\t\tSmarTire Systems Inc.\n00:17:9A\t\tD-Link Corporation\n00:17:9B\t\tChant Sincere Co.,Ltd\n00:17:9C\t\tDEPRAG SCHULZ GMBH u. CO.\n00:17:9D\t\tKelman Limited\n00:17:9E\t\tSirit Inc\n00:17:9F\t\tApricorn\n00:17:A0\t\tRoboTech srl\n00:17:A1\t\t3soft inc.\n00:17:A2\t\tCamrivox Ltd.\n00:17:A3\t\tMIX s.r.l.\n00:17:A4\t\tHewlett Packard\n00:17:A5\t\tMediaTek Inc\n00:17:A6\t\tYosin Electronics Co., Ltd.\n00:17:A7\t\tMobile Computing Promotion Consortium\n00:17:A8\t\tEDM Corporation\n00:17:A9\t\tSentivision\n00:17:AA\t\telab-experience inc.\n00:17:AB\t\tNintendo Co., Ltd.\n00:17:AC\t\tO'Neil Product Development Inc.\n00:17:AD\t\tAceNet Corporation\n00:17:AE\t\tGAI-Tronics\n00:17:AF\t\tEnermet\n00:17:B0\t\tNokia Danmark A/S\n00:17:B1\t\tACIST Medical Systems, Inc.\n00:17:B2\t\tSK Telesys\n00:17:B3\t\tAftek Infosys Limited\n00:17:B4\t\tRemote Security Systems, LLC\n00:17:B5\t\tPeerless Systems Corporation\n00:17:B6\t\tAquantia Corporation\n00:17:B7\t\tTonze Technology Co.\n00:17:B8\t\tNovatron Co., Ltd.\n00:17:B9\t\tGambro Lundia AB\n00:17:BA\t\tSedo Co., Ltd.\n00:17:BB\t\tSyrinx Industrial Electronics\n00:17:BC\t\tTouchtunes Music Corporation\n00:17:BD\t\tTibetsystem\n00:17:BE\t\tTratec Telecom B.V.\n00:17:BF\t\tCoherent Research Limited\n00:17:C0\t\tPureTech Systems, Inc.\n00:17:C1\t\tCM Precision Technology LTD.\n00:17:C2\t\tADB Broadband Italia\n00:17:C3\t\tKTF Technologies Inc.\n00:17:C4\t\tQuanta Microsystems, INC.\n00:17:C5\t\tSonicWALL\n00:17:C6\t\tCross Match Technologies Inc\n00:17:C7\t\tMARA Systems Consulting AB\n00:17:C8\t\tKYOCERA Display Corporation\n00:17:C9\t\tSamsung Electronics Co.,Ltd\n00:17:CA\t\tQisda Corporation\n00:17:CB\t\tJuniper Networks\n00:17:CC\t\tAlcatel-Lucent\n00:17:CD\t\tCEC Wireless R&D Ltd.\n00:17:CE\t\tScreen Service Spa\n00:17:CF\t\tiMCA-GmbH\n00:17:D0\t\tOpticom Communications, LLC\n00:17:D1\t\tNortel Networks\n00:17:D2\t\tThinlinx Pty Ltd\n00:17:D3\t\tEtymotic Research, Inc.\n00:17:D4\t\tMonsoon Multimedia, Inc\n00:17:D5\t\tSamsung Electronics Co.,Ltd\n00:17:D6\t\tBluechips Microhouse Co.,Ltd.\n00:17:D7\t\tION Geophysical Corporation Inc.\n00:17:D8\t\tMagnum Semiconductor, Inc.\n00:17:D9\t\tAAI Corporation\n00:17:DA\t\tSpans Logic\n00:17:DB\t\tCanko Technologies Inc.\n00:17:DC\t\tDaemyung Zero1\n00:17:DD\t\tClipsal Australia\n00:17:DE\t\tAdvantage Six Ltd\n00:17:DF\t\tCisco Systems, Inc\n00:17:E0\t\tCisco Systems, Inc\n00:17:E1\t\tDACOS Technologies Co., Ltd.\n00:17:E2\t\tCommscope\n00:17:E3\t\tTexas Instruments\n00:17:E4\t\tTexas Instruments\n00:17:E5\t\tTexas Instruments\n00:17:E6\t\tTexas Instruments\n00:17:E7\t\tTexas Instruments\n00:17:E8\t\tTexas Instruments\n00:17:E9\t\tTexas Instruments\n00:17:EA\t\tTexas Instruments\n00:17:EB\t\tTexas Instruments\n00:17:EC\t\tTexas Instruments\n00:17:ED\t\tWooJooIT Ltd.\n00:17:EE\t\tCommscope\n00:17:EF\t\tIBM Corp\n00:17:F0\t\tSZCOM Broadband Network Technology Co.,Ltd\n00:17:F1\t\tRenu Electronics Pvt Ltd\n00:17:F2\t\tApple, Inc.\n00:17:F3\t\tHarris Corporation\n00:17:F4\t\tZeron Alliance\n00:17:F5\t\tLig Neoptek\n00:17:F6\t\tPyramid Meriden Inc.\n00:17:F7\t\tCEM Solutions Pvt Ltd\n00:17:F8\t\tMotech Industries Inc.\n00:17:F9\t\tForcom Sp. z o.o.\n00:17:FA\t\tMicrosoft Corporation\n00:17:FB\t\tFa\n00:17:FC\t\tSuprema Inc.\n00:17:FD\t\tAmulet Hotkey\n00:17:FE\t\tTalos System Inc.\n00:17:FF\t\tPLAYLINE Co.,Ltd.\n00:18:00\t\tUnigrand Ltd\n00:18:01\t\tActiontec Electronics, Inc\n00:18:02\t\tAlpha Networks Inc.\n00:18:03\t\tArcSoft Shanghai Co. LTD\n00:18:04\t\tE-Tek Digital Technology Limited\n00:18:05\t\tBeijing InHand Networking Technology Co.,Ltd.\n00:18:06\t\tHokkei Industries Co., Ltd.\n00:18:07\t\tFanstel Corp.\n00:18:08\t\tSightLogix, Inc.\n00:18:09\t\tCresyn\n00:18:0A\t\tCisco Meraki\n00:18:0B\t\tBrilliant Telecommunications\n00:18:0C\t\tZhone Technologies, Inc.\n00:18:0D\t\tTerabytes Server Storage Tech Corp\n00:18:0E\t\tAvega Systems\n00:18:0F\t\tNokia Danmark A/S\n00:18:10\t\tIPTrade S.A.\n00:18:11\t\tNeuros Technology International, LLC.\n00:18:12\t\tBeijing Xinwei Telecom Technology Co., Ltd.\n00:18:13\t\tSony Corporation\n00:18:14\t\tMitutoyo Corporation\n00:18:15\t\tGZ Technologies, Inc.\n00:18:16\t\tUbixon Co., Ltd.\n00:18:17\t\tD. E. Shaw Research, LLC\n00:18:18\t\tCisco Systems, Inc\n00:18:19\t\tCisco Systems, Inc\n00:18:1A\t\tAVerMedia Information Inc.\n00:18:1B\t\tTaiJin Metal Co., Ltd.\n00:18:1C\t\tVitec\n00:18:1D\t\tAsia Electronics Co.,Ltd\n00:18:1E\t\tGDX Technologies Ltd.\n00:18:1F\t\tPalmmicro Communications\n00:18:20\t\tw5networks\n00:18:21\t\tSindoricoh\n00:18:22\t\tCec Telecom Co.,Ltd.\n00:18:23\t\tDelta Electronics, Inc.\n00:18:24\t\tKimaldi Electronics, S.L.\n00:18:25\t\tPrivate\n00:18:26\t\tCale Access AB\n00:18:27\t\tNec Unified Solutions Nederland B.V.\n00:18:28\t\te2v technologies (UK) ltd.\n00:18:29\t\tGatsometer\n00:18:2A\t\tTaiwan Video & Monitor\n00:18:2B\t\tSoftier\n00:18:2C\t\tAscend Networks, Inc.\n00:18:2D\t\tArtec Design\n00:18:2E\t\tXStreamHD\n00:18:2F\t\tTexas Instruments\n00:18:30\t\tTexas Instruments\n00:18:31\t\tTexas Instruments\n00:18:32\t\tTexas Instruments\n00:18:33\t\tTexas Instruments\n00:18:34\t\tTexas Instruments\n00:18:35\t\tThoratec / ITC\n00:18:36\t\tREJ Co.,Ltd\n00:18:37\t\tUniversal ABIT Co., Ltd.\n00:18:38\t\tPanAccess Communications,Inc.\n00:18:39\t\tCisco-Linksys, LLC\n00:18:3A\t\tWestell Technologies Inc.\n00:18:3B\t\tCENITS Co., Ltd.\n00:18:3C\t\tEncore Software Limited\n00:18:3D\t\tVertex Link Corporation\n00:18:3E\t\tDigilent, Inc\n00:18:3F\t\t2Wire Inc\n00:18:40\t\t3 Phoenix, Inc.\n00:18:41\t\tHigh Tech Computer Corp\n00:18:42\t\tNokia Danmark A/S\n00:18:43\t\tDawevision Ltd\n00:18:44\t\tHeads Up Technologies, Inc.\n00:18:45\t\tPulsar-Telecom LLC.\n00:18:46\t\tCrypto S.A.\n00:18:47\t\tAceNet Technology Inc.\n00:18:48\t\tVecima Networks Inc.\n00:18:49\t\tnVent, Schroff GmbH\n00:18:4A\t\tCatcher, Inc.\n00:18:4B\t\tLas Vegas Gaming, Inc.\n00:18:4C\t\tBogen Communications\n00:18:4D\t\tNetgear\n00:18:4E\t\tLianhe Technologies, Inc.\n00:18:4F\t\t8 Ways Technology Corp.\n00:18:50\t\tSecfone Kft\n00:18:51\t\tSWsoft\n00:18:52\t\tStorLink Semiconductors, Inc.\n00:18:53\t\tAtera Networks LTD.\n00:18:54\t\tArgard Co., Ltd\n00:18:55\t\tAeromaritime Systembau GmbH\n00:18:56\t\tEyeFi, Inc\n00:18:57\t\tUnilever R&D\n00:18:58\t\tTagMaster AB\n00:18:59\t\tStrawberry Linux Co.,Ltd.\n00:18:5A\t\tuControl, Inc.\n00:18:5B\t\tNetwork Chemistry, Inc\n00:18:5C\t\tEDSLAB Technologies\n00:18:5D\t\tTaiguen Technology (Shen-Zhen) Co., Ltd.\n00:18:5E\t\tNexterm Inc.\n00:18:5F\t\tTAC Inc.\n00:18:60\t\tSIM Technology Group Shanghai Simcom Ltd.,\n00:18:61\t\tOoma, Inc.\n00:18:62\t\tSeagate Technology\n00:18:63\t\tVeritech Electronics Limited\n00:18:64\t\tEaton Corporation\n00:18:65\t\tSiemens Healthcare Diagnostics Manufacturing Ltd\n00:18:66\t\tLeutron Vision\n00:18:67\t\tDatalogic ADC\n00:18:68\t\tCisco SPVTG\n00:18:69\t\tKingjim\n00:18:6A\t\tGlobal Link Digital Technology Co,.LTD\n00:18:6B\t\tSambu Communics CO., LTD.\n00:18:6C\t\tNeonode AB\n00:18:6D\t\tZhenjiang Sapphire Electronic Industry CO.\n00:18:6E\t\t3Com Ltd\n00:18:6F\t\tSetha Industria Eletronica LTDA\n00:18:70\t\tE28 Shanghai Limited\n00:18:71\t\tHewlett Packard\n00:18:72\t\tExpertise Engineering\n00:18:73\t\tCisco Systems, Inc\n00:18:74\t\tCisco Systems, Inc\n00:18:75\t\tAnaCise Testnology Pte Ltd\n00:18:76\t\tWowWee Ltd.\n00:18:77\t\tAmplex A/S\n00:18:78\t\tMackware GmbH\n00:18:79\t\tdSys\n00:18:7A\t\tWiremold\n00:18:7B\t\t4NSYS Co. Ltd.\n00:18:7C\t\tIntercross, Llc\n00:18:7D\t\tArmorlink Co .Ltd\n00:18:7E\t\tRGB Spectrum\n00:18:7F\t\tZodianet\n00:18:80\t\tMaxim Integrated Products\n00:18:81\t\tBuyang Electronics Industrial Co., Ltd\n00:18:82\t\tHuawei Technologies Co.,Ltd\n00:18:83\t\tFormosa21 Inc.\n00:18:84\t\tFon Technology S.L.\n00:18:85\t\tMotorola Solutions Inc.\n00:18:86\t\tEl-Tech, Inc.\n00:18:87\t\tMetasystem SpA\n00:18:88\t\tGOTIVE a.s.\n00:18:89\t\tWinNet Solutions Limited\n00:18:8A\t\tInfinova LLC\n00:18:8B\t\tDell Inc.\n00:18:8C\t\tMobile Action Technology Inc.\n00:18:8D\t\tNokia Danmark A/S\n00:18:8E\t\tEkahau, Inc.\n00:18:8F\t\tMontgomery Technology, Inc.\n00:18:90\t\tRadioCOM, s.r.o.\n00:18:91\t\tZhongshan General K-mate Electronics Co., Ltd\n00:18:92\t\tads-tec GmbH\n00:18:93\t\tShenzhen Photon Broadband Technology Co.,Ltd\n00:18:94\t\tNPCore, Inc.\n00:18:95\t\tHansun Technologies Inc.\n00:18:96\t\tGreat Well Electronic LTD\n00:18:97\t\tJESS-LINK PRODUCTS Co., LTD\n00:18:98\t\tKingstate Electronics Corporation\n00:18:99\t\tShenZhen jieshun Science&Technology Industry CO,LTD.\n00:18:9A\t\tHANA Micron Inc.\n00:18:9B\t\tThomson Inc.\n00:18:9C\t\tWeldex Corporation\n00:18:9D\t\tNavcast Inc.\n00:18:9E\t\tOMNIKEY GmbH.\n00:18:9F\t\tLenntek Corporation\n00:18:A0\t\tCierma Ascenseurs\n00:18:A1\t\tTiqit Computers, Inc.\n00:18:A2\t\tXIP Technology AB\n00:18:A3\t\tZippy Technology Corp.\n00:18:A4\t\tCommscope\n00:18:A5\t\tADigit Technologies Corp.\n00:18:A6\t\tPersistent Systems, LLC\n00:18:A7\t\tYoggie Security Systems LTD.\n00:18:A8\t\tAnNeal Technology Inc.\n00:18:A9\t\tEthernet Direct Corporation\n00:18:AA\t\tProtec Fire Detection plc\n00:18:AB\t\tBeijing Lhwt Microelectronics Inc.\n00:18:AC\t\tShanghai Jiao Da HISYS Technology Co. Ltd.\n00:18:AD\t\tNidec Instruments Corporation\n00:18:AE\t\tTvt Co.,Ltd\n00:18:AF\t\tSamsung Electronics Co.,Ltd\n00:18:B0\t\tNortel Networks\n00:18:B1\t\tIBM Corp\n00:18:B2\t\tAdeunis Rf\n00:18:B3\t\tTEC WizHome Co., Ltd.\n00:18:B4\t\tDawon Media Inc.\n00:18:B5\t\tMagna Carta\n00:18:B6\t\tS3C, Inc.\n00:18:B7\t\tD3 Led, Llc\n00:18:B8\t\tNew Voice International AG\n00:18:B9\t\tCisco Systems, Inc\n00:18:BA\t\tCisco Systems, Inc\n00:18:BB\t\tEliwell Controls srl\n00:18:BC\t\tZAO NVP Bolid\n00:18:BD\t\tShenzhen Dvbworld Technology Co., Ltd.\n00:18:BE\t\tANSA Corporation\n00:18:BF\t\tEssence Technology Solution, Inc.\n00:18:C0\t\tCommscope\n00:18:C1\t\tAlmitec Informática e Comércio\n00:18:C2\t\tFiretide, Inc\n00:18:C3\t\tCS Corporation\n00:18:C4\t\tRaba Technologies LLC\n00:18:C5\t\tNokia Danmark A/S\n00:18:C6\t\tOPW Fuel Management Systems\n00:18:C7\t\tReal Time Automation\n00:18:C8\t\tISONAS Inc.\n00:18:C9\t\tEOps Technology Limited\n00:18:CA\t\tViprinet GmbH\n00:18:CB\t\tTecobest Technology Limited\n00:18:CC\t\tAxiohm Sas\n00:18:CD\t\tErae Electronics Industry Co., Ltd\n00:18:CE\t\tDreamtech Co., Ltd\n00:18:CF\t\tBaldor Electric Company\n00:18:D0\t\tAtRoad,  A Trimble Company\n00:18:D1\t\tSiemens Home & Office Comm. Devices\n00:18:D2\t\tHigh-Gain Antennas LLC\n00:18:D3\t\tTeamcast\n00:18:D4\t\tUnified Display Interface SIG\n00:18:D5\t\tReigncom\n00:18:D6\t\tSwirlnet A/S\n00:18:D7\t\tJAVAD GNSS, Inc.\n00:18:D8\t\tARCH METER Corporation\n00:18:D9\t\tSantosha Internatonal, Inc\n00:18:DA\t\tWürth Elektronik eiSos GmbH & Co. KG\n00:18:DB\t\tEPL Technology Ltd\n00:18:DC\t\tProstar Co., Ltd.\n00:18:DD\t\tSilicondust Engineering Ltd\n00:18:DE\t\tIntel Corporate\n00:18:DF\t\tThe Morey Corporation\n00:18:E0\t\tAnaveo\n00:18:E1\t\tVerkerk Service Systemen\n00:18:E2\t\tTopdata Sistemas de Automacao Ltda\n00:18:E3\t\tVisualgate Systems, Inc.\n00:18:E4\t\tYiguang\n00:18:E5\t\tAdhoco AG\n00:18:E6\t\tComputer Hardware Design SIA\n00:18:E7\t\tCameo Communications, INC.\n00:18:E8\t\tHacetron Corporation\n00:18:E9\t\tNumata Corporation\n00:18:EA\t\tAlltec GmbH\n00:18:EB\t\tBlue Zen Enterprises Private Limited\n00:18:EC\t\tWelding Technology Corporation\n00:18:ED\t\tAccutech Ultrasystems Co., Ltd.\n00:18:EE\t\tVideology Imaging Solutions, Inc.\n00:18:EF\t\tEscape Communications, Inc.\n00:18:F0\t\tJOYTOTO Co., Ltd.\n00:18:F1\t\tChunichi Denshi Co.,LTD.\n00:18:F2\t\tBeijing Tianyu Communication Equipment Co., Ltd\n00:18:F3\t\tASUSTek COMPUTER INC.\n00:18:F4\t\tEO TECHNICS Co., Ltd.\n00:18:F5\t\tShenzhen Streaming Video Technology Company Limited\n00:18:F6\t\tThomson Telecom Belgium\n00:18:F7\t\tKameleon Technologies\n00:18:F8\t\tCisco-Linksys, LLC\n00:18:F9\t\tVVOND, Inc.\n00:18:FA\t\tYushin Precision Equipment Co.,Ltd.\n00:18:FB\t\tCompro Technology\n00:18:FC\t\tAltec Electronic AG\n00:18:FD\t\tOptimal Technologies International Inc.\n00:18:FE\t\tHewlett Packard\n00:18:FF\t\tPowerQuattro Co.\n00:19:00\t\tIntelliverese - DBA Voicecom\n00:19:01\t\tF1Media\n00:19:02\t\tCambridge Consultants Ltd\n00:19:03\t\tBigfoot Networks Inc\n00:19:04\t\tWB Electronics Sp. z o.o.\n00:19:05\t\tSCHRACK Seconet AG\n00:19:06\t\tCisco Systems, Inc\n00:19:07\t\tCisco Systems, Inc\n00:19:08\t\tDuaxes Corporation\n00:19:09\t\tDEVI - Danfoss A/S\n00:19:0A\t\tHasware Inc.\n00:19:0B\t\tSouthern Vision Systems, Inc.\n00:19:0C\t\tEncore Electronics, Inc.\n00:19:0D\t\tIEEE 1394c\n00:19:0E\t\tAtech Technology Co., Ltd.\n00:19:0F\t\tAdvansus Corp.\n00:19:10\t\tKnick Elektronische Messgeraete GmbH & Co. KG\n00:19:11\t\tJust In Mobile Information Technologies (Shanghai) Co., Ltd.\n00:19:12\t\tWelcat Inc\n00:19:13\t\tChuang-Yi Network Equipment Co.Ltd.\n00:19:14\t\tWinix Co., Ltd\n00:19:15\t\tTECOM Co., Ltd.\n00:19:16\t\tPayTec AG\n00:19:17\t\tPosiflex Inc.\n00:19:18\t\tInteractive Wear AG\n00:19:19\t\tASTEL Inc.\n00:19:1A\t\tIrlink\n00:19:1B\t\tSputnik Engineering AG\n00:19:1C\t\tSensicast Systems\n00:19:1D\t\tNintendo Co., Ltd.\n00:19:1E\t\tBeyondwiz Co., Ltd.\n00:19:1F\t\tMicrolink communications Inc.\n00:19:20\t\tKUME electric Co.,Ltd.\n00:19:21\t\tElitegroup Computer Systems Co.,Ltd.\n00:19:22\t\tCM Comandos Lineares\n00:19:23\t\tPhonex Korea Co., LTD.\n00:19:24\t\tLBNL  Engineering\n00:19:25\t\tIntelicis Corporation\n00:19:26\t\tBitsGen Co., Ltd.\n00:19:27\t\tImCoSys Ltd\n00:19:28\t\tSiemens AG, Transportation Systems\n00:19:29\t\t2M2B Montadora de Maquinas Bahia Brasil LTDA\n00:19:2A\t\tAntiope Associates\n00:19:2B\t\tAclara RF Systems Inc.\n00:19:2C\t\tCommscope\n00:19:2D\t\tNokia Corporation\n00:19:2E\t\tSpectral Instruments, Inc.\n00:19:2F\t\tCisco Systems, Inc\n00:19:30\t\tCisco Systems, Inc\n00:19:31\t\tBalluff GmbH\n00:19:32\t\tGude Systems GmbH\n00:19:33\t\tStrix Systems, Inc.\n00:19:34\t\tTrendon Touch Technology Corp.\n00:19:35\t\tDuerr Dental Ag\n00:19:36\t\tSterlite Optical Technologies Limited\n00:19:37\t\tCommerceGuard AB\n00:19:38\t\tUMB Communications Co., Ltd.\n00:19:39\t\tGigamips\n00:19:3A\t\tOesolutions\n00:19:3B\t\tLigoWave\n00:19:3C\t\tHighPoint Technologies Incorporated\n00:19:3D\t\tGMC Guardian Mobility Corp.\n00:19:3E\t\tADB Broadband Italia\n00:19:3F\t\tRDI technology(Shenzhen) Co.,LTD\n00:19:40\t\tRackable Systems\n00:19:41\t\tPitney Bowes, Inc\n00:19:42\t\tOn Software International Limited\n00:19:43\t\tBelden\n00:19:44\t\tFossil Partners, L.P.\n00:19:45\t\tRF COncepts, LLC\n00:19:46\t\tCianet Industria e Comercio S/A\n00:19:47\t\tCisco SPVTG\n00:19:48\t\tAireSpider Networks\n00:19:49\t\tTentel  Comtech Co., Ltd.\n00:19:4A\t\tTesto Ag\n00:19:4B\t\tSagemcom Broadband SAS\n00:19:4C\t\tFujian Stelcom information & Technology CO.,Ltd\n00:19:4D\t\tAvago Technologies Sdn Bhd\n00:19:4E\t\tUltra Electronics - TCS (Tactical Communication Systems)\n00:19:4F\t\tNokia Danmark A/S\n00:19:50\t\tHarman Multimedia\n00:19:51\t\tNETCONS, s.r.o.\n00:19:52\t\tACOGITO Co., Ltd\n00:19:53\t\tChainleader Communications Corp.\n00:19:54\t\tLeaf Corporation.\n00:19:55\t\tCisco Systems, Inc\n00:19:56\t\tCisco Systems, Inc\n00:19:57\t\tSaafnet Canada Inc.\n00:19:58\t\tBluetooth SIG, Inc.\n00:19:59\t\tStaccato Communications Inc.\n00:19:5A\t\tJenaer Antriebstechnik GmbH\n00:19:5B\t\tD-Link Corporation\n00:19:5C\t\tInnotech Corporation\n00:19:5D\t\tShenZhen XinHuaTong Opto Electronics Co.,Ltd\n00:19:5E\t\tCommscope\n00:19:5F\t\tValemount Networks Corporation\n00:19:60\t\tDoCoMo Systems, Inc.\n00:19:61\t\tBlaupunkt  Embedded Systems GmbH\n00:19:62\t\tCommerciant, LP\n00:19:63\t\tSony Corporation\n00:19:64\t\tDoorking Inc.\n00:19:65\t\tYuHua TelTech (ShangHai) Co., Ltd.\n00:19:66\t\tAsiarock Technology Limited\n00:19:67\t\tTELDAT Sp.J.\n00:19:68\t\tDigital Video Networks(Shanghai) CO. LTD.\n00:19:69\t\tNortel Networks\n00:19:6A\t\tMikroM GmbH\n00:19:6B\t\tDanpex Corporation\n00:19:6C\t\tEtrovision Technology\n00:19:6D\t\tRaybit Systems Korea, Inc\n00:19:6E\t\tMetacom (Pty) Ltd.\n00:19:6F\t\tSensoPart GmbH\n00:19:70\t\tZ-Com, Inc.\n00:19:71\t\tGuangzhou Unicomp Technology Co.,Ltd\n00:19:72\t\tPlexus (Xiamen) Co.,ltd.\n00:19:73\t\tZeugma Systems\n00:19:74\t\t16063\n00:19:75\t\tBeijing Huisen networks technology Inc\n00:19:76\t\tXipher Technologies, LLC\n00:19:77\t\tExtreme Networks Headquarters\n00:19:78\t\tDatum Systems, Inc.\n00:19:79\t\tNokia Danmark A/S\n00:19:7A\t\tMAZeT GmbH\n00:19:7B\t\tPicotest Corp.\n00:19:7C\t\tRiedel Communications GmbH\n00:19:7D\t\tHon Hai Precision Ind. Co.,Ltd.\n00:19:7E\t\tHon Hai Precision Ind. Co.,Ltd.\n00:19:7F\t\tPlantronics, Inc.\n00:19:80\t\tGridpoint Systems\n00:19:81\t\tVivox Inc\n00:19:82\t\tSmarDTV Corporation\n00:19:83\t\tCCT R&D Limited\n00:19:84\t\tESTIC Corporation\n00:19:85\t\tIT Watchdogs, Inc\n00:19:86\t\tCheng Hongjian\n00:19:87\t\tPanasonic Mobile Communications Co.,Ltd.\n00:19:88\t\tWi2Wi, Inc\n00:19:89\t\tSonitrol Corporation\n00:19:8A\t\tNorthrop Grumman Systems Corp.\n00:19:8B\t\tNovera Optics Korea, Inc.\n00:19:8C\t\tiXSea\n00:19:8D\t\tOcean Optics, Inc.\n00:19:8E\t\tDemant A/S\n00:19:8F\t\tNokia Bell N.V.\n00:19:90\t\tELM DATA Co., Ltd.\n00:19:91\t\tavinfo\n00:19:92\t\tAdtran Inc\n00:19:93\t\tChangshu Switchgear MFG. Co.,Ltd. (Former Changshu Switchgea\n00:19:94\t\tJorjin Technologies Inc.\n00:19:95\t\tJurong Hi-Tech (Suzhou)Co.ltd\n00:19:96\t\tTurboChef Technologies Inc.\n00:19:97\t\tSoft Device Sdn Bhd\n00:19:98\t\tSato Corporation\n00:19:99\t\tFujitsu Technology Solutions GmbH\n00:19:9A\t\tEdo-Evi\n00:19:9B\t\tDiversified Technical Systems, Inc.\n00:19:9C\t\tCtring\n00:19:9D\t\tVizio, Inc\n00:19:9E\t\tNifty\n00:19:9F\t\tDkt A/S\n00:19:A0\t\tNihon Data Systens, Inc.\n00:19:A1\t\tLg Information & Comm.\n00:19:A2\t\tOrdyn Technologies\n00:19:A3\t\tasteel electronique atlantique\n00:19:A4\t\tAustar Technology (hang zhou) Co.,Ltd\n00:19:A5\t\tRadarFind Corporation\n00:19:A6\t\tCommscope\n00:19:A7\t\tItu-T\n00:19:A8\t\tWiQuest Communications\n00:19:A9\t\tCisco Systems, Inc\n00:19:AA\t\tCisco Systems, Inc\n00:19:AB\t\tRaycom CO ., LTD\n00:19:AC\t\tGSP SYSTEMS Inc.\n00:19:AD\t\tBobst Sa\n00:19:AE\t\tHopling Technologies b.v.\n00:19:AF\t\tRigol Technologies, Inc.\n00:19:B0\t\tHanYang System\n00:19:B1\t\tArrow7 Corporation\n00:19:B2\t\tXYnetsoft Co.,Ltd\n00:19:B3\t\tStanford Research Systems\n00:19:B4\t\tIntellio Ltd\n00:19:B5\t\tFamar Fueguina S.A.\n00:19:B6\t\tEuro Emme s.r.l.\n00:19:B7\t\tNokia Danmark A/S\n00:19:B8\t\tBoundary Devices\n00:19:B9\t\tDell Inc.\n00:19:BA\t\tParadox Security Systems Ltd\n00:19:BB\t\tHewlett Packard\n00:19:BC\t\tElectro Chance Srl\n00:19:BD\t\tNew Media Life\n00:19:BE\t\tAltai Technologies Limited\n00:19:BF\t\tCitiway technology Co.,ltd\n00:19:C0\t\tCommscope\n00:19:C1\t\tAlpsalpine Co,.Ltd\n00:19:C2\t\tEquustek Solutions, Inc.\n00:19:C3\t\tQualitrol\n00:19:C4\t\tInfocrypt Inc.\n00:19:C5\t\tSony Interactive Entertainment Inc.\n00:19:C6\t\tzte corporation\n00:19:C7\t\tCambridge Industries(Group) Co.,Ltd.\n00:19:C8\t\tAnyDATA Corporation\n00:19:C9\t\tS&C Electric Company\n00:19:CA\t\tBroadata Communications, Inc\n00:19:CB\t\tZyxel Communications Corporation\n00:19:CC\t\tRCG (HK) Ltd\n00:19:CD\t\tChengdu ethercom information technology Ltd.\n00:19:CE\t\tProgressive Gaming International\n00:19:CF\t\tSalicru, S.A.\n00:19:D0\t\tCathexis\n00:19:D1\t\tIntel Corporate\n00:19:D2\t\tIntel Corporate\n00:19:D3\t\tTRAK Microwave\n00:19:D4\t\tICX Technologies\n00:19:D5\t\tIP Innovations, Inc.\n00:19:D6\t\tLS Cable and System Ltd.\n00:19:D7\t\tFortunetek Co., Ltd\n00:19:D8\t\tMaxfor\n00:19:D9\t\tZeutschel GmbH\n00:19:DA\t\tWelltrans O&E Technology Co. , Ltd.\n00:19:DB\t\tMicro-Star International Co., Ltd.\n00:19:DC\t\tENENSYS Technologies\n00:19:DD\t\tFEI-Zyfer, Inc.\n00:19:DE\t\tMobitek\n00:19:DF\t\tThomson Inc.\n00:19:E0\t\tTp-Link Technologies Co.,Ltd.\n00:19:E1\t\tNortel Networks\n00:19:E2\t\tJuniper Networks\n00:19:E3\t\tApple, Inc.\n00:19:E4\t\t2Wire Inc\n00:19:E5\t\tLynx Studio Technology, Inc.\n00:19:E6\t\tToyo Medic Co.,Ltd.\n00:19:E7\t\tCisco Systems, Inc\n00:19:E8\t\tCisco Systems, Inc\n00:19:E9\t\tS-Information Technolgy, Co., Ltd.\n00:19:EA\t\tTeraMage Technologies Co., Ltd.\n00:19:EB\t\tPyronix Ltd\n00:19:EC\t\tSagamore Systems, Inc.\n00:19:ED\t\tAxesstel Inc.\n00:19:EE\t\tCARLO GAVAZZI CONTROLS SPA-Controls Division\n00:19:EF\t\tShenzhen Linnking Electronics Co.,Ltd\n00:19:F0\t\tUnion Man Technology Co.,Ltd\n00:19:F1\t\tStar Communication Network Technology Co.,Ltd\n00:19:F2\t\tTeradyne K.K.\n00:19:F3\t\tCetis, Inc\n00:19:F4\t\tConvergens Oy Ltd\n00:19:F5\t\tImagination Technologies Ltd\n00:19:F6\t\tAcconet (PTE) Ltd\n00:19:F7\t\tOnset Computer Corporation\n00:19:F8\t\tEmbedded Systems Design, Inc.\n00:19:F9\t\tTDK-Lambda\n00:19:FA\t\tCable Vision Electronics CO., LTD.\n00:19:FB\t\tSky Uk Limited\n00:19:FC\t\tPT. Ufoakses Sukses Luarbiasa\n00:19:FD\t\tNintendo Co., Ltd.\n00:19:FE\t\tShenzhen Seecomm Technology Co.,Ltd.\n00:19:FF\t\tFinnzymes\n00:1A:00\t\tMatrix Inc.\n00:1A:01\t\tICU Medical, Inc.\n00:1A:02\t\tSecure Care Products, Inc\n00:1A:03\t\tAngel Electronics Co., Ltd.\n00:1A:04\t\tInteray Solutions BV\n00:1A:05\t\tOptibase Ltd\n00:1A:06\t\tOpVista, Inc.\n00:1A:07\t\tArecont Vision\n00:1A:08\t\tSimoco Ltd.\n00:1A:09\t\tWayfarer Transit Systems Ltd\n00:1A:0A\t\tAdaptive Micro-Ware Inc.\n00:1A:0B\t\tBona Technology Inc.\n00:1A:0C\t\tSwe-Dish Satellite Systems AB\n00:1A:0D\t\tHandHeld entertainment, Inc.\n00:1A:0E\t\tCheng Uei Precision Industry Co.,Ltd\n00:1A:0F\t\tArteche Group\n00:1A:10\t\tLucent Trans Electronics Co.,Ltd\n00:1A:11\t\tGoogle, Inc.\n00:1A:12\t\tEssilor\n00:1A:13\t\tWanlida Group Co., LTD\n00:1A:14\t\tXin Hua Control Engineering Co.,Ltd.\n00:1A:15\t\tgemalto e-Payment\n00:1A:16\t\tNokia Danmark A/S\n00:1A:17\t\tTeak Technologies, Inc.\n00:1A:18\t\tAdvanced Simulation Technology inc.\n00:1A:19\t\tComputer Engineering Limited\n00:1A:1A\t\tGentex Corporation/Electro-Acoustic Products\n00:1A:1B\t\tCommscope\n00:1A:1C\t\tGT&T Engineering Pte Ltd\n00:1A:1D\t\tPChome Online Inc.\n00:1A:1E\t\tHewlett Packard Enterprise\n00:1A:1F\t\tCoastal Environmental Systems\n00:1A:20\t\tCMOTECH Co. Ltd.\n00:1A:21\t\tBrookhuis Applied Technologies BV\n00:1A:22\t\teQ-3 Entwicklung GmbH\n00:1A:23\t\tIce Qube, Inc\n00:1A:24\t\tGalaxy Telecom Technologies Ltd\n00:1A:25\t\tDelta Dore\n00:1A:26\t\tDeltanode Solutions AB\n00:1A:27\t\tUbistar\n00:1A:28\t\tASWT Co., LTD. Taiwan Branch H.K.\n00:1A:29\t\tJohnson Outdoors Marine Electronics d/b/a Minnkota\n00:1A:2A\t\tArcadyan Technology Corporation\n00:1A:2B\t\tAyecom Technology Co., Ltd.\n00:1A:2C\t\tSATEC Co.,LTD\n00:1A:2D\t\tThe Navvo Group\n00:1A:2E\t\tZiova Coporation\n00:1A:2F\t\tCisco Systems, Inc\n00:1A:30\t\tCisco Systems, Inc\n00:1A:31\t\tScan Coin Ab\n00:1A:32\t\tActiva Multimedia\n00:1A:33\t\tASI Communications, Inc.\n00:1A:34\t\tKonka Group Co., Ltd.\n00:1A:35\t\tBARTEC GmbH\n00:1A:36\t\tAipermon GmbH & Co. KG\n00:1A:37\t\tLear Corporation\n00:1A:38\t\tSanmina-SCI\n00:1A:39\t\tMerten GmbH&CoKG\n00:1A:3A\t\tDongahelecomm\n00:1A:3B\t\tDoah Elecom Inc.\n00:1A:3C\t\tTechnowave Ltd.\n00:1A:3D\t\tAjin Vision Co.,Ltd\n00:1A:3E\t\tFaster Technology LLC\n00:1A:3F\t\tIntelbras\n00:1A:40\t\tA-Four Tech Co., Ltd.\n00:1A:41\t\tINOCOVA Co.,Ltd\n00:1A:42\t\tTechcity Technology co., Ltd.\n00:1A:43\t\tLogical Link Communications\n00:1A:44\t\tJWTrading Co., Ltd\n00:1A:45\t\tGN Netcom A/S\n00:1A:46\t\tDigital Multimedia Technology Co., Ltd\n00:1A:47\t\tAgami Systems, Inc.\n00:1A:48\t\tTakacom Corporation\n00:1A:49\t\tMicro Vision Co.,LTD\n00:1A:4A\t\tQumranet Inc.\n00:1A:4B\t\tHewlett Packard\n00:1A:4C\t\tCrossbow Technology, Inc\n00:1A:4D\t\tGiga-Byte Technology Co.,Ltd.\n00:1A:4E\t\tNTI AG / LinMot\n00:1A:4F\t\tAVM GmbH\n00:1A:50\t\tPheeNet Technology Corp.\n00:1A:51\t\tAlfred Mann Foundation\n00:1A:52\t\tMeshlinx Wireless Inc.\n00:1A:53\t\tZylaya\n00:1A:54\t\tHip Shing Electronics Ltd.\n00:1A:55\t\tACA-Digital Corporation\n00:1A:56\t\tViewTel Co,. Ltd.\n00:1A:57\t\tMatrix Design Group, LLC\n00:1A:58\t\tCCV Deutschland GmbH - Celectronic eHealth Div.\n00:1A:59\t\tIrcona\n00:1A:5A\t\tKorea Electric Power Data Network  (KDN) Co., Ltd\n00:1A:5B\t\tNetCare Service Co., Ltd.\n00:1A:5C\t\tEuchner GmbH+Co. KG\n00:1A:5D\t\tMobinnova Corp.\n00:1A:5E\t\tThincom Technology Co.,Ltd\n00:1A:5F\t\tKitWorks.fi Ltd.\n00:1A:60\t\tWave Electronics Co.,Ltd.\n00:1A:61\t\tPacStar Corp.\n00:1A:62\t\tData Robotics, Incorporated\n00:1A:63\t\tElster Solutions, LLC,\n00:1A:64\t\tIBM Corp\n00:1A:65\t\tSeluxit\n00:1A:66\t\tCommscope\n00:1A:67\t\tInfinite QL Sdn Bhd\n00:1A:68\t\tWeltec Enterprise Co., Ltd.\n00:1A:69\t\tWuhan Yangtze Optical Technology CO.,Ltd.\n00:1A:6A\t\tTranzas, Inc.\n00:1A:6B\t\tUniversal Global Scientific Industrial Co., Ltd.\n00:1A:6C\t\tCisco Systems, Inc\n00:1A:6D\t\tCisco Systems, Inc\n00:1A:6E\t\tImpro Technologies\n00:1A:6F\t\tMI.TEL s.r.l.\n00:1A:70\t\tCisco-Linksys, LLC\n00:1A:71\t\tDiostech Co., Ltd.\n00:1A:72\t\tMosart Semiconductor Corp.\n00:1A:73\t\tGemtek Technology Co., Ltd.\n00:1A:74\t\tProcare International Co\n00:1A:75\t\tSony Corporation\n00:1A:76\t\tSDT information Technology Co.,LTD.\n00:1A:77\t\tCommscope\n00:1A:78\t\tubtos\n00:1A:79\t\tTelecomunication Technologies Ltd.\n00:1A:7A\t\tLismore Instruments Limited\n00:1A:7B\t\tTeleco, Inc.\n00:1A:7C\t\tHirschmann Multimedia B.V.\n00:1A:7D\t\tcyber-blue(HK)Ltd\n00:1A:7E\t\tLN Srithai Comm Ltd.\n00:1A:7F\t\tGCI Science & Technology Co.,LTD\n00:1A:80\t\tSony Corporation\n00:1A:81\t\tZelax\n00:1A:82\t\tPROBA Building Automation Co.,LTD\n00:1A:83\t\tPegasus Technologies Inc.\n00:1A:84\t\tV One Multimedia Pte Ltd\n00:1A:85\t\tNV Michel Van de Wiele\n00:1A:86\t\tNew Wave Design & Verification\n00:1A:87\t\tCanhold International Limited\n00:1A:88\t\tVenergy,Co,Ltd\n00:1A:89\t\tNokia Danmark A/S\n00:1A:8A\t\tSamsung Electronics Co.,Ltd\n00:1A:8B\t\tChunil Electric Ind., Co.\n00:1A:8C\t\tSophos Ltd\n00:1A:8D\t\tAVECS Bergen GmbH\n00:1A:8E\t\t3Way Networks Ltd\n00:1A:8F\t\tNortel Networks\n00:1A:90\t\tTrópico Sistemas e Telecomunicações da Amazônia LTDA.\n00:1A:91\t\tFusionDynamic Ltd.\n00:1A:92\t\tASUSTek COMPUTER INC.\n00:1A:93\t\tERCO Leuchten GmbH\n00:1A:94\t\tVotronic GmbH\n00:1A:95\t\tHisense Mobile Communications Technoligy Co.,Ltd.\n00:1A:96\t\tEcler S.A.\n00:1A:97\t\tfitivision technology Inc.\n00:1A:98\t\tAsotel Communication Limited Taiwan Branch\n00:1A:99\t\tSmarty (HZ) Information Electronics Co., Ltd\n00:1A:9A\t\tSkyworth Digital Technology(Shenzhen) Co.,Ltd\n00:1A:9B\t\tADEC & Parter AG\n00:1A:9C\t\tRightHand Technologies, Inc.\n00:1A:9D\t\tSkipper Wireless, Inc.\n00:1A:9E\t\tICON Digital International Limited\n00:1A:9F\t\tA-Link Ltd\n00:1A:A0\t\tDell Inc.\n00:1A:A1\t\tCisco Systems, Inc\n00:1A:A2\t\tCisco Systems, Inc\n00:1A:A3\t\tDelorme\n00:1A:A4\t\tFuture University-Hakodate\n00:1A:A5\t\tBRN Phoenix\n00:1A:A6\t\tElbit Systems Deutschland GmbH & Co. KG\n00:1A:A7\t\tTorian Wireless\n00:1A:A8\t\tMamiya Digital Imaging Co., Ltd.\n00:1A:A9\t\tFujian Star-Net Communication Co.,Ltd\n00:1A:AA\t\tAnalogic Corp.\n00:1A:AB\t\teWings s.r.l.\n00:1A:AC\t\tCorelatus AB\n00:1A:AD\t\tCommscope\n00:1A:AE\t\tSavant Systems LLC\n00:1A:AF\t\tBlusens Technology\n00:1A:B0\t\tSignal Networks Pvt. Ltd.,\n00:1A:B1\t\tAsia Pacific Satellite Industries Co., Ltd.\n00:1A:B2\t\tCyber Solutions Inc.\n00:1A:B3\t\tVisionite Inc.\n00:1A:B4\t\tFFEI Ltd.\n00:1A:B5\t\tHome Network System\n00:1A:B6\t\tTexas Instruments\n00:1A:B7\t\tEthos Networks LTD.\n00:1A:B8\t\tAnseri Corporation\n00:1A:B9\t\tPmc\n00:1A:BA\t\tCaton Overseas Limited\n00:1A:BB\t\tFontal Technology Incorporation\n00:1A:BC\t\tU4EA Technologies Ltd\n00:1A:BD\t\tImpatica Inc.\n00:1A:BE\t\tComputer Hi-Tech Inc.\n00:1A:BF\t\tTRUMPF Laser Marking Systems AG\n00:1A:C0\t\tJoybien Technologies Co., Ltd.\n00:1A:C1\t\t3Com Ltd\n00:1A:C2\t\tYEC Co.,Ltd.\n00:1A:C3\t\tScientific-Atlanta, Inc\n00:1A:C4\t\t2Wire Inc\n00:1A:C5\t\tKeysight Technologies, Inc.\n00:1A:C6\t\tMicro Control Designs\n00:1A:C7\t\tUnipoint\n00:1A:C8\t\tISL (Instrumentation Scientifique de Laboratoire)\n00:1A:C9\t\tSuzuken Co.,Ltd\n00:1A:CA\t\tTilera Corporation\n00:1A:CB\t\tAutocom Products Ltd\n00:1A:CC\t\tCelestial Semiconductor, Ltd\n00:1A:CD\t\tTidel Engineering LP\n00:1A:CE\t\tYupiteru Corporation\n00:1A:CF\t\tC.T. Elettronica\n00:1A:D0\t\tAlbis Technologies AG\n00:1A:D1\t\tFargo Co., Ltd.\n00:1A:D2\t\tEletronica Nitron Ltda\n00:1A:D3\t\tVamp Ltd.\n00:1A:D4\t\tiPOX Technology Co., Ltd.\n00:1A:D5\t\tKmc Chain Industrial Co., Ltd.\n00:1A:D6\t\tJiagnsu Aetna Electric Co.,Ltd\n00:1A:D7\t\tChristie Digital Systems, Inc.\n00:1A:D8\t\tAlsterAero GmbH\n00:1A:D9\t\tInternational Broadband Electric Communications, Inc.\n00:1A:DA\t\tBiz-2-Me Inc.\n00:1A:DB\t\tCommscope\n00:1A:DC\t\tNokia Danmark A/S\n00:1A:DD\t\tPePWave Ltd\n00:1A:DE\t\tCommscope\n00:1A:DF\t\tInteractivetv Pty Limited\n00:1A:E0\t\tMythology Tech Express Inc.\n00:1A:E1\t\tEdge Access Inc\n00:1A:E2\t\tCisco Systems, Inc\n00:1A:E3\t\tCisco Systems, Inc\n00:1A:E4\t\tMedicis Technologies Corporation\n00:1A:E5\t\tMvox Technologies Inc.\n00:1A:E6\t\tAtlanta Advanced Communications Holdings Limited\n00:1A:E7\t\tAztek Networks, Inc.\n00:1A:E8\t\tUnify Software and Solutions GmbH & Co. KG\n00:1A:E9\t\tNintendo Co., Ltd.\n00:1A:EA\t\tRadio Terminal Systems Pty Ltd\n00:1A:EB\t\tAllied Telesis K.K.\n00:1A:EC\t\tKeumbee Electronics Co.,Ltd.\n00:1A:ED\t\tINCOTEC GmbH\n00:1A:EE\t\tShenztech Ltd\n00:1A:EF\t\tLoopcomm Technology, Inc.\n00:1A:F0\t\tAlcatel-Lucent IPD\n00:1A:F1\t\tEmbedded Artists AB\n00:1A:F2\t\tDynavisions Schweiz AG\n00:1A:F3\t\tSamyoung Electronics\n00:1A:F4\t\tHandreamnet\n00:1A:F5\t\tPentaone. Co., Ltd.\n00:1A:F6\t\tWoven Systems, Inc.\n00:1A:F7\t\tdataschalt e+a GmbH\n00:1A:F8\t\tCopley Controls Corporation\n00:1A:F9\t\tAeroVIronment (AV Inc)\n00:1A:FA\t\tWelch Allyn, Inc.\n00:1A:FB\t\tJoby Inc.\n00:1A:FC\t\tModusLink Corporation\n00:1A:FD\t\tEvolis\n00:1A:FE\t\tSofacreal\n00:1A:FF\t\tWizyoung Tech.\n00:1B:00\t\tNeopost Technologies\n00:1B:01\t\tApplied Radio Technologies\n00:1B:02\t\tED Co.Ltd\n00:1B:03\t\tAction Technology (SZ) Co., Ltd\n00:1B:04\t\tAffinity International S.p.a\n00:1B:05\t\tYmc Ag\n00:1B:06\t\tAteliers R. LAUMONIER\n00:1B:07\t\tMendocino Software\n00:1B:08\t\tDanfoss Drives A/S\n00:1B:09\t\tMatrix Comsec Private Limited\n00:1B:0A\t\tIntelligent Distributed Controls Ltd\n00:1B:0B\t\tPhidgets Inc.\n00:1B:0C\t\tCisco Systems, Inc\n00:1B:0D\t\tCisco Systems, Inc\n00:1B:0E\t\tInoTec GmbH Organisationssysteme\n00:1B:0F\t\tPetratec\n00:1B:10\t\tShenZhen Kang Hui Technology Co.,ltd\n00:1B:11\t\tD-Link Corporation\n00:1B:12\t\tApprion\n00:1B:13\t\tIcron Technologies Corporation\n00:1B:14\t\tCarex Lighting Equipment Factory\n00:1B:15\t\tVoxtel, Inc.\n00:1B:16\t\tCeltro Ltd.\n00:1B:17\t\tPalo Alto Networks\n00:1B:18\t\tTsuken Electric Ind. Co.,Ltd\n00:1B:19\t\tIEEE I&M Society TC9\n00:1B:1A\t\te-trees Japan, Inc.\n00:1B:1B\t\tSiemens AG,\n00:1B:1C\t\tCoherent\n00:1B:1D\t\tPhoenix International Co., Ltd\n00:1B:1E\t\tHART Communication Foundation\n00:1B:1F\t\tFORCE Technology\n00:1B:20\t\tTPine Technology\n00:1B:21\t\tIntel Corporate\n00:1B:22\t\tPalit Microsystems ( H.K.) Ltd.\n00:1B:23\t\tSimpleComTools\n00:1B:24\t\tQuanta Computer Inc.\n00:1B:25\t\tNortel Networks\n00:1B:26\t\tRON-Telecom ZAO\n00:1B:27\t\tMerlin CSI\n00:1B:28\t\tPolygon, Jsc\n00:1B:29\t\tAvantis.Co.,Ltd\n00:1B:2A\t\tCisco Systems, Inc\n00:1B:2B\t\tCisco Systems, Inc\n00:1B:2C\t\tATRON electronic GmbH\n00:1B:2D\t\tMed-Eng Systems Inc.\n00:1B:2E\t\tSinkyo Electron Inc\n00:1B:2F\t\tNetgear\n00:1B:30\t\tSolitech Inc.\n00:1B:31\t\tNeural Image. Co. Ltd.\n00:1B:32\t\tQLogic Corporation\n00:1B:33\t\tNokia Danmark A/S\n00:1B:34\t\tFocus System Inc.\n00:1B:35\t\tChongQing JINOU Science & Technology Development CO.,Ltd\n00:1B:36\t\tTsubata Engineering Co.,Ltd. (Head Office)\n00:1B:37\t\tComputec Oy\n00:1B:38\t\tCompal Information (Kunshan) Co., Ltd.\n00:1B:39\t\tProxicast\n00:1B:3A\t\tSIMS Corp.\n00:1B:3B\t\tYi-Qing CO., LTD\n00:1B:3C\t\tSoftware Technologies Group,Inc.\n00:1B:3D\t\tEuroTel Spa\n00:1B:3E\t\tCurtis, Inc.\n00:1B:3F\t\tProCurve Networking by HP\n00:1B:40\t\tNetwork Automation mxc AB\n00:1B:41\t\tGeneral Infinity Co.,Ltd.\n00:1B:42\t\tWise & Blue\n00:1B:43\t\tBeijing DG Telecommunications equipment Co.,Ltd\n00:1B:44\t\tSanDisk Corporation\n00:1B:45\t\tABB AS, Division Automation Products\n00:1B:46\t\tBlueone Technology Co.,Ltd\n00:1B:47\t\tFutarque A/S\n00:1B:48\t\tShenzhen Lantech Electronics Co., Ltd.\n00:1B:49\t\tRoberts Radio limited\n00:1B:4A\t\tW&W Communications, Inc.\n00:1B:4B\t\tSANION Co., Ltd.\n00:1B:4C\t\tSigntech\n00:1B:4D\t\tAreca Technology Corporation\n00:1B:4E\t\tNavman New Zealand\n00:1B:4F\t\tAvaya Inc\n00:1B:50\t\tNizhny Novgorod Factory named after M.Frunze, FSUE (NZiF)\n00:1B:51\t\tVector Technology Corp.\n00:1B:52\t\tCommscope\n00:1B:53\t\tCisco Systems, Inc\n00:1B:54\t\tCisco Systems, Inc\n00:1B:55\t\tHurco Automation Ltd.\n00:1B:56\t\tTehuti Networks Ltd.\n00:1B:57\t\tSemindia Systems Private Limited\n00:1B:58\t\tACE CAD Enterprise Co., Ltd.\n00:1B:59\t\tSony Corporation\n00:1B:5A\t\tApollo Imaging Technologies, Inc.\n00:1B:5B\t\t2Wire Inc\n00:1B:5C\t\tAzuretec Co., Ltd.\n00:1B:5D\t\tVololink Pty Ltd\n00:1B:5E\t\tBPL Limited\n00:1B:5F\t\tAlien Technology\n00:1B:60\t\tNavigon Ag\n00:1B:61\t\tDigital Acoustics, LLC\n00:1B:62\t\tJHT Optoelectronics Co.,Ltd.\n00:1B:63\t\tApple, Inc.\n00:1B:64\t\tIsaacLandKorea Co., Ltd,\n00:1B:65\t\tChina Gridcom Co., Ltd\n00:1B:66\t\tSennheiser electronic GmbH & Co. KG\n00:1B:67\t\tCisco Systems Inc\n00:1B:68\t\tModnnet Co., Ltd\n00:1B:69\t\tEqualine Corporation\n00:1B:6A\t\tPowerwave Technologies Sweden AB\n00:1B:6B\t\tSwyx Solutions AG\n00:1B:6C\t\tLookX Digital Media BV\n00:1B:6D\t\tMidtronics, Inc.\n00:1B:6E\t\tKeysight Technologies, Inc.\n00:1B:6F\t\tTeletrak Ltd\n00:1B:70\t\tIRI Ubiteq, INC.\n00:1B:71\t\tTelular Corp.\n00:1B:72\t\tSicep s.p.a.\n00:1B:73\t\tDTL Broadcast Ltd\n00:1B:74\t\tMiraLink Corporation\n00:1B:75\t\tHypermedia Systems\n00:1B:76\t\tRipcode, Inc.\n00:1B:77\t\tIntel Corporate\n00:1B:78\t\tHewlett Packard\n00:1B:79\t\tFaiveley Transport\n00:1B:7A\t\tNintendo Co., Ltd.\n00:1B:7B\t\tThe Tintometer Ltd\n00:1B:7C\t\tA & R Cambridge\n00:1B:7D\t\tCXR Anderson Jacobson\n00:1B:7E\t\tBeckmann GmbH\n00:1B:7F\t\tTMN Technologies Telecomunicacoes Ltda\n00:1B:80\t\tLORD Corporation\n00:1B:81\t\tDATAQ Instruments, Inc.\n00:1B:82\t\tTaiwan Semiconductor Co., Ltd.\n00:1B:83\t\tFinsoft Ltd\n00:1B:84\t\tScan Engineering Telecom\n00:1B:85\t\tMAN Energy Solutions\n00:1B:86\t\tBosch Access Systems GmbH\n00:1B:87\t\tDeepsound Tech. Co., Ltd\n00:1B:88\t\tDivinet Access Technologies Ltd\n00:1B:89\t\tEMZA Visual Sense Ltd.\n00:1B:8A\t\t2M Electronic A/S\n00:1B:8B\t\tNEC Platforms, Ltd.\n00:1B:8C\t\tJMicron Technology Corp.\n00:1B:8D\t\tElectronic Computer Systems, Inc.\n00:1B:8E\t\tHulu Sweden AB\n00:1B:8F\t\tCisco Systems, Inc\n00:1B:90\t\tCisco Systems, Inc\n00:1B:91\t\tEfkon Ag\n00:1B:92\t\tl-acoustics\n00:1B:93\t\tJC Decaux SA DNT\n00:1B:94\t\tT.E.M.A. S.p.A.\n00:1B:95\t\tVideo Systems Srl\n00:1B:96\t\tGeneral Sensing\n00:1B:97\t\tViolin Technologies\n00:1B:98\t\tSamsung Electronics Co.,Ltd\n00:1B:99\t\tKS System GmbH\n00:1B:9A\t\tApollo Fire Detectors Ltd\n00:1B:9B\t\tHose-McCann Communications\n00:1B:9C\t\tSATEL sp. z o.o.\n00:1B:9D\t\tNovus Security Sp. z o.o.\n00:1B:9E\t\tAskey Computer Corp\n00:1B:9F\t\tCalyptech Pty Ltd\n00:1B:A0\t\tAwox\n00:1B:A1\t\tÅmic AB\n00:1B:A2\t\tIDS Imaging Development Systems GmbH\n00:1B:A3\t\tFlexit Group GmbH\n00:1B:A4\t\tS.A.E Afikim\n00:1B:A5\t\tMyungMin Systems, Inc.\n00:1B:A6\t\tintotech inc.\n00:1B:A7\t\tLorica Solutions\n00:1B:A8\t\tUBI&MOBI,.Inc\n00:1B:A9\t\tBrother industries, LTD.\n00:1B:AA\t\tXenICs nv\n00:1B:AB\t\tTelchemy, Incorporated\n00:1B:AC\t\tCurtiss Wright Controls Embedded Computing\n00:1B:AD\t\tiControl Incorporated\n00:1B:AE\t\tMicro Control Systems, Inc\n00:1B:AF\t\tNokia Danmark A/S\n00:1B:B0\t\tBharat Electronics Limited\n00:1B:B1\t\tWistron Neweb Corporation\n00:1B:B2\t\tIntellect International NV\n00:1B:B3\t\tCondalo GmbH\n00:1B:B4\t\tAirvod Limited\n00:1B:B5\t\tCherry GmbH\n00:1B:B6\t\tBird Electronic Corp.\n00:1B:B7\t\tAlta Heights Technology Corp.\n00:1B:B8\t\tBlueway Electronic Co;Ltd\n00:1B:B9\t\tElitegroup Computer Systems Co.,Ltd.\n00:1B:BA\t\tNortel Networks\n00:1B:BB\t\tRFTech Co.,Ltd\n00:1B:BC\t\tSilver Peak Systems, Inc.\n00:1B:BD\t\tFMC Kongsberg Subsea AS\n00:1B:BE\t\tICOP Digital\n00:1B:BF\t\tSagemcom Broadband SAS\n00:1B:C0\t\tJuniper Networks\n00:1B:C1\t\tHOLUX Technology, Inc.\n00:1B:C2\t\tIntegrated Control Technology Limitied\n00:1B:C3\t\tMobisolution Co.,Ltd\n00:1B:C4\t\tUltratec, Inc.\n00:1B:C5\t\tIEEE Registration Authority\n00:1B:C5:00:00:00/36\tConverging Systems Inc.\n00:1B:C5:00:10:00/36\tOpenRB.com, Direct SIA\n00:1B:C5:00:20:00/36\tGORAMO - Janusz Gorecki\n00:1B:C5:00:30:00/36\tMicroSigns Technologies Inc\n00:1B:C5:00:40:00/36\tIntellvisions Software Ltd\n00:1B:C5:00:50:00/36\tPrivate\n00:1B:C5:00:60:00/36\tTRIAX-HIRSCHMANN Multi-Media GmbH\n00:1B:C5:00:70:00/36\tEnergy Aware Technology\n00:1B:C5:00:80:00/36\tDalaj Electro-Telecom\n00:1B:C5:00:90:00/36\tSolomon Systech Pte Ltd\n00:1B:C5:00:A0:00/36\tMercury HMI Ltd\n00:1B:C5:00:B0:00/36\tPrivate\n00:1B:C5:00:C0:00/36\tQuantum Technology Sciences, Inc.\n00:1B:C5:00:D0:00/36\tAdvanced Scientific Concepts, Inc.\n00:1B:C5:00:E0:00/36\tVigor Electric Corp\n00:1B:C5:00:F0:00/36\tSimavita Pty Ltd\n00:1B:C5:01:00:00/36\tSoftel SA de CV\n00:1B:C5:01:10:00/36\tOOO NPP Mera\n00:1B:C5:01:20:00/36\tTokyo Cosmos Electric, Inc.\n00:1B:C5:01:30:00/36\tZamir Recognition Systems Ltd.\n00:1B:C5:01:40:00/36\tPrivate\n00:1B:C5:01:50:00/36\tCorporate Systems Engineering\n00:1B:C5:01:60:00/36\tEnergotechnica OOO NPP Ltd\n00:1B:C5:01:70:00/36\tcPacket Networks\n00:1B:C5:01:90:00/36\tDunlop Systems & Components\n00:1B:C5:01:A0:00/36\tAba Electronics Technology Co.,Ltd\n00:1B:C5:01:B0:00/36\tCommonwealth Scientific and Industrial  Research Organisation\n00:1B:C5:01:C0:00/36\tCoolit Systems, Inc.\n00:1B:C5:01:D0:00/36\tRose + Herleth GbR\n00:1B:C5:01:E0:00/36\tPrivate\n00:1B:C5:01:F0:00/36\tSaturn Solutions Ltd\n00:1B:C5:02:00:00/36\tMomentum Data Systems\n00:1B:C5:02:10:00/36\tOpenpeak, Inc\n00:1B:C5:02:20:00/36\tCjsc Stc  Simos\n00:1B:C5:02:30:00/36\tMAGO di Della Mora Walter\n00:1B:C5:02:40:00/36\tAnnecy Electronique Sas\n00:1B:C5:02:50:00/36\tandersen lighting GmbH\n00:1B:C5:02:60:00/36\tDIMEP Sistemas\n00:1B:C5:02:70:00/36\tCAMEA, spol. s r.o.\n00:1B:C5:02:80:00/36\tStechwin.Co.Ltd.\n00:1B:C5:02:90:00/36\t2 France Marine\n00:1B:C5:02:A0:00/36\tAnalytical Instrument Systems, Inc.\n00:1B:C5:02:B0:00/36\tSaturn South Pty Ltd\n00:1B:C5:02:C0:00/36\tCare Everywhere LLC\n00:1B:C5:02:D0:00/36\tDDTRONIK Dariusz Dowgiert\n00:1B:C5:02:E0:00/36\tBettini Srl\n00:1B:C5:02:F0:00/36\tFibrain Co. Ltd.\n00:1B:C5:03:00:00/36\tOctoGate IT Security Systems GmbH\n00:1B:C5:03:10:00/36\tAdixein Limited\n00:1B:C5:03:20:00/36\tOsborne Coinage Co\n00:1B:C5:03:30:00/36\tJE Suunnittelu Oy\n00:1B:C5:03:40:00/36\tInterCEL Pty Ltd\n00:1B:C5:03:50:00/36\tRTLS Ltd.\n00:1B:C5:03:60:00/36\tLomar Srl\n00:1B:C5:03:70:00/36\tITW Reyflex North America\n00:1B:C5:03:80:00/36\tSEED International Ltd.\n00:1B:C5:03:90:00/36\tEuresys S.A.\n00:1B:C5:03:A0:00/36\tMindMade Sp. z o.o.\n00:1B:C5:03:B0:00/36\tPromixis, LLC\n00:1B:C5:03:C0:00/36\tXiphos Systems Corp.\n00:1B:C5:03:D0:00/36\trioxo GmbH\n00:1B:C5:03:E0:00/36\tDaylight  Solutions, Inc\n00:1B:C5:03:F0:00/36\tELTRADE Ltd\n00:1B:C5:04:00:00/36\tOOO Actidata\n00:1B:C5:04:10:00/36\tDesignA Electronics Limited\n00:1B:C5:04:20:00/36\tChamsys Ltd\n00:1B:C5:04:30:00/36\tCoincident, Inc.\n00:1B:C5:04:40:00/36\tZAO \"RADIUS Avtomatika\"\n00:1B:C5:04:50:00/36\tMarvel Digital International Limited\n00:1B:C5:04:60:00/36\tGéant\n00:1B:C5:04:70:00/36\tPT. Amanindo Nusapadu\n00:1B:C5:04:80:00/36\tXPossible Technologies Pte Ltd\n00:1B:C5:04:90:00/36\tEUROCONTROL S.p.A.\n00:1B:C5:04:A0:00/36\tCertis Technology International Pte Ltd\n00:1B:C5:04:B0:00/36\tSilicon Controls\n00:1B:C5:04:C0:00/36\tRhino Controls Ltd.\n00:1B:C5:04:D0:00/36\teiraku electric corp.\n00:1B:C5:04:E0:00/36\tMitsubishi Electric India PVT. LTD\n00:1B:C5:04:F0:00/36\tOrbital Systems, Ltd.\n00:1B:C5:05:00:00/36\tTeliSwitch Solutions\n00:1B:C5:05:10:00/36\tQQ Navigation AB\n00:1B:C5:05:20:00/36\tEngineering Center ENERGOSERVICE\n00:1B:C5:05:30:00/36\tMetrycom Communications Ltd\n00:1B:C5:05:40:00/36\tPrivate\n00:1B:C5:05:50:00/36\tLumiplan Transport\n00:1B:C5:05:60:00/36\tThinKom Solutions, Inc\n00:1B:C5:05:70:00/36\tEREE Electronique\n00:1B:C5:05:80:00/36\toptiMEAS GmbH\n00:1B:C5:05:90:00/36\tInpixal\n00:1B:C5:05:A0:00/36\tPostec Data Systems\n00:1B:C5:05:B0:00/36\tkonzeptpark GmbH\n00:1B:C5:05:C0:00/36\tSuretrak Global Pty Ltd\n00:1B:C5:05:D0:00/36\tJSC Prominform\n00:1B:C5:05:E0:00/36\tEcomed-Complex\n00:1B:C5:05:F0:00/36\tKlingenthaler Musikelektronik GmbH\n00:1B:C5:06:00:00/36\tEnstech\n00:1B:C5:06:10:00/36\tScientific-Technical Center \"Epsilon\" Limited company\n00:1B:C5:06:20:00/36\tSulaon Oy\n00:1B:C5:06:30:00/36\tCheck-It Solutions Inc\n00:1B:C5:06:40:00/36\tEnkora Oy Ltd\n00:1B:C5:06:50:00/36\tPlair Media Inc.\n00:1B:C5:06:60:00/36\tManufacturas y transformados AB\n00:1B:C5:06:70:00/36\tEmbit srl\n00:1B:C5:06:80:00/36\tHCS KABLOLAMA SISTEMLERI SAN. ve TIC.A.S.\n00:1B:C5:06:90:00/36\tDatasat Digital Entertainment\n00:1B:C5:06:A0:00/36\tIST GmbH\n00:1B:C5:06:B0:00/36\tVerified Energy, LLC.\n00:1B:C5:06:C0:00/36\tLuxcon System Limited\n00:1B:C5:06:D0:00/36\tTES Electronic Solutions (I) Pvt. Ltd.\n00:1B:C5:06:E0:00/36\tTwo Dimensional Instruments, LLC\n00:1B:C5:06:F0:00/36\tLLC Emzior\n00:1B:C5:07:00:00/36\tSiemens Industries, Inc, Retail & Commercial Systems\n00:1B:C5:07:10:00/36\tCenter for E-Commerce Infrastructure Development, The University of Hong Kong\n00:1B:C5:07:20:00/36\tOhio Semitronics, Inc.\n00:1B:C5:07:30:00/36\ttado GmbH\n00:1B:C5:07:40:00/36\tDynasthetics\n00:1B:C5:07:50:00/36\tKitron GmbH\n00:1B:C5:07:60:00/36\tPLAiR Media, Inc\n00:1B:C5:07:70:00/36\tMomentum Data Systems\n00:1B:C5:07:80:00/36\tDonbass Soft Ltd and Co.KG\n00:1B:C5:07:90:00/36\tHPI High Pressure Instrumentation GmbH\n00:1B:C5:07:A0:00/36\tServicios Electronicos Industriales Berbel s.l.\n00:1B:C5:07:B0:00/36\tQCORE Medical\n00:1B:C5:07:C0:00/36\thead\n00:1B:C5:07:D0:00/36\tGreatcom AG\n00:1B:C5:07:E0:00/36\tBio Molecular System Pty Ltd\n00:1B:C5:07:F0:00/36\tHitechlab Inc\n00:1B:C5:08:00:00/36\tLUMINO GmbH\n00:1B:C5:08:10:00/36\tWonATech Co., Ltd.\n00:1B:C5:08:20:00/36\tTGS Geophysical Company (UK) Limited\n00:1B:C5:08:30:00/36\tDiwel\n00:1B:C5:08:40:00/36\tApplied Innovations Research LLC\n00:1B:C5:08:50:00/36\tOberon microsystems, Inc.\n00:1B:C5:08:60:00/36\tCAST Group of Companies Inc.\n00:1B:C5:08:70:00/36\tOnnet Technologies and Innovations LLC\n00:1B:C5:08:80:00/36\tUAB Kitron\n00:1B:C5:08:90:00/36\tSignature Control Systems, Inc.\n00:1B:C5:08:A0:00/36\tTopicon\n00:1B:C5:08:B0:00/36\tNistica\n00:1B:C5:08:C0:00/36\tTriax A/S\n00:1B:C5:08:D0:00/36\tEurek  Srl\n00:1B:C5:08:E0:00/36\tTrendPoint Systems\n00:1B:C5:08:F0:00/36\tUnilever R&D\n00:1B:C5:09:00:00/36\tSeven Solutions S.L\n00:1B:C5:09:10:00/36\t3green ApS\n00:1B:C5:09:20:00/36\tArnouse Digital Devices, Corp.\n00:1B:C5:09:30:00/36\tAmbient Devices, Inc.\n00:1B:C5:09:40:00/36\treelyActive\n00:1B:C5:09:50:00/36\tPREVAC sp. z o.o.\n00:1B:C5:09:60:00/36\tSanstreak Corp.\n00:1B:C5:09:70:00/36\tPlexstar Inc.\n00:1B:C5:09:80:00/36\tCubic Systems, Inc.\n00:1B:C5:09:90:00/36\tUAB Kitron\n00:1B:C5:09:A0:00/36\tShenzhen Guang Lian Zhi Tong Limited\n00:1B:C5:09:B0:00/36\tYIK Corporation\n00:1B:C5:09:C0:00/36\tMeccalte Spa\n00:1B:C5:09:D0:00/36\tNavitar Inc\n00:1B:C5:09:E0:00/36\tK+K Messtechnik GmbH\n00:1B:C5:09:F0:00/36\tENTE Sp. z o.o.\n00:1B:C5:0A:00:00/36\tSilvair\n00:1B:C5:0A:10:00/36\tHangzhou Zhiping Technology Co., Ltd.\n00:1B:C5:0A:20:00/36\tHettich Benelux\n00:1B:C5:0A:30:00/36\tP A Network Laboratory Co.,Ltd\n00:1B:C5:0A:40:00/36\tRadmor S.A.\n00:1B:C5:0A:50:00/36\tTesla Controls\n00:1B:C5:0A:60:00/36\tBalter Security GmbH\n00:1B:C5:0A:70:00/36\tL.G.L. Electronics S.p.a.\n00:1B:C5:0A:80:00/36\tLink Precision\n00:1B:C5:0A:90:00/36\tElektrometal SA\n00:1B:C5:0A:A0:00/36\tSenceive Ltd\n00:1B:C5:0A:B0:00/36\tEvondos Oy\n00:1B:C5:0A:C0:00/36\tAVnu Alliance\n00:1B:C5:0A:D0:00/36\tTierra Japan Co.,Ltd\n00:1B:C5:0A:E0:00/36\tTechlan Reti s.r.l.\n00:1B:C5:0A:F0:00/36\tEnerwise Solutions Ltd.\n00:1B:C5:0B:00:00/36\tJ-D.Com\n00:1B:C5:0B:10:00/36\tRoslen Eco-Networking Products\n00:1B:C5:0B:20:00/36\tSKODA ELECTRIC a.s.\n00:1B:C5:0B:30:00/36\tFSM Solutions Limited\n00:1B:C5:0B:40:00/36\tCoban Srl\n00:1B:C5:0B:50:00/36\tExibea AB\n00:1B:C5:0B:60:00/36\tVeilux Inc.\n00:1B:C5:0B:70:00/36\tAutelis, LLC\n00:1B:C5:0B:80:00/36\tPrivate\n00:1B:C5:0B:90:00/36\tDenki Kogyo Company, Limited\n00:1B:C5:0B:A0:00/36\tNt Microsystems\n00:1B:C5:0B:B0:00/36\tTriax A/S\n00:1B:C5:0B:C0:00/36\tkuwatec, Inc.\n00:1B:C5:0B:D0:00/36\tBridge Diagnostics, Inc.\n00:1B:C5:0B:E0:00/36\tYESpay International Ltd\n00:1B:C5:0B:F0:00/36\tTN Core Co.,Ltd.\n00:1B:C5:0C:00:00/36\tDigital Loggers, Inc.\n00:1B:C5:0C:10:00/36\tEREE Electronique\n00:1B:C5:0C:20:00/36\tTechSolutions A/S\n00:1B:C5:0C:30:00/36\tinomatic GmbH\n00:1B:C5:0C:40:00/36\tEldes\n00:1B:C5:0C:50:00/36\tGill Instruments Ltd\n00:1B:C5:0C:60:00/36\tCyanConnode\n00:1B:C5:0C:70:00/36\tWizzilab Sas\n00:1B:C5:0C:80:00/36\tDialine\n00:1B:C5:0C:90:00/36\tUAB Kitron\n00:1B:C6\t\tStrato Rechenzentrum AG\n00:1B:C7\t\tStarVedia Technology Inc.\n00:1B:C8\t\tMiura Co.,Ltd\n00:1B:C9\t\tFsn Display Inc\n00:1B:CA\t\tBeijing Run Technology LTD. Company\n00:1B:CB\t\tPempek Systems Pty Ltd\n00:1B:CC\t\tKingtek Cctv Alliance Co., Ltd.\n00:1B:CD\t\tDaviscomms (S) Pte Ltd\n00:1B:CE\t\tMeasurement Devices Ltd\n00:1B:CF\t\tDataupia Corporation\n00:1B:D0\t\tIdentec Solutions\n00:1B:D1\t\tSogestmatic\n00:1B:D2\t\tULTRA-X ASIA PACIFIC Inc.\n00:1B:D3\t\tPanasonic Corporation AVC Networks Company\n00:1B:D4\t\tCisco Systems, Inc\n00:1B:D5\t\tCisco Systems, Inc\n00:1B:D6\t\tKelvin Hughes Ltd\n00:1B:D7\t\tCisco SPVTG\n00:1B:D8\t\tFLIR Systems Inc\n00:1B:D9\t\tEdgewater Wireless Systems Inc\n00:1B:DA\t\tUTStarcom Inc\n00:1B:DB\t\tValeo VECS\n00:1B:DC\t\tVencer Co., Ltd.\n00:1B:DD\t\tCommscope\n00:1B:DE\t\tRenkus-Heinz, Inc.\n00:1B:DF\t\tIskra Sistemi d.d.\n00:1B:E0\t\tTELENOT ELECTRONIC GmbH\n00:1B:E1\t\tViaLogy\n00:1B:E2\t\tAhnLab,Inc.\n00:1B:E3\t\tHealth Hero Network, Inc.\n00:1B:E4\t\tTownet Srl\n00:1B:E5\t\t802automation Limited\n00:1B:E6\t\tVr Ag\n00:1B:E7\t\tPostek Electronics Co., Ltd.\n00:1B:E8\t\tUltratronik GmbH\n00:1B:E9\t\tBroadcom\n00:1B:EA\t\tNintendo Co., Ltd.\n00:1B:EB\t\tDMP Electronics INC.\n00:1B:EC\t\tNetio Technologies Co., Ltd\n00:1B:ED\t\tBrocade Communications Systems LLC\n00:1B:EE\t\tNokia Danmark A/S\n00:1B:EF\t\tBlossoms Digital Technology Co.,Ltd.\n00:1B:F0\t\tValue Platforms Limited\n00:1B:F1\t\tNanjing SilverNet Software Co., Ltd.\n00:1B:F2\t\tKworld Computer Co., Ltd\n00:1B:F3\t\tTRANSRADIO SenderSysteme Berlin AG\n00:1B:F4\t\tKenwin Industrial(Hk) Ltd.\n00:1B:F5\t\tTellink Sistemas de Telecomunicación S.L.\n00:1B:F6\t\tCONWISE Technology Corporation Ltd.\n00:1B:F7\t\tLund IP Products AB\n00:1B:F8\t\tDigitrax Inc.\n00:1B:F9\t\tIntellitect Water Ltd\n00:1B:FA\t\tG.i.N. mbH\n00:1B:FB\t\tAlpsalpine Co,.Ltd\n00:1B:FC\t\tASUSTek COMPUTER INC.\n00:1B:FD\t\tDignsys Inc.\n00:1B:FE\t\tZavio Inc.\n00:1B:FF\t\tMillennia Media inc.\n00:1C:00\t\tEntry Point, LLC\n00:1C:01\t\tABB Oy Drives\n00:1C:02\t\tPano Logic\n00:1C:03\t\tBetty TV Technology AG\n00:1C:04\t\tAirgain, Inc.\n00:1C:05\t\tNonin Medical Inc.\n00:1C:06\t\tSiemens Numerical Control Ltd., Nanjing\n00:1C:07\t\tCwlinux Limited\n00:1C:08\t\tEcho360, Inc.\n00:1C:09\t\tSAE Electronic Co.,Ltd.\n00:1C:0A\t\tShenzhen AEE Technology Co.,Ltd.\n00:1C:0B\t\tSmartAnt Telecom\n00:1C:0C\t\tTANITA Corporation\n00:1C:0D\t\tG-Technology, Inc.\n00:1C:0E\t\tCisco Systems, Inc\n00:1C:0F\t\tCisco Systems, Inc\n00:1C:10\t\tCisco-Linksys, LLC\n00:1C:11\t\tCommscope\n00:1C:12\t\tCommscope\n00:1C:13\t\tOptsys Technology Co., Ltd.\n00:1C:14\t\tVMware, Inc.\n00:1C:15\t\tiPhotonix LLC\n00:1C:16\t\tThyssenKrupp Elevator\n00:1C:17\t\tNortel Networks\n00:1C:18\t\tSicert S.r.L.\n00:1C:19\t\tsecunet Security Networks AG\n00:1C:1A\t\tThomas Instrumentation, Inc\n00:1C:1B\t\tHyperstone GmbH\n00:1C:1C\t\tCenter Communication Systems GmbH\n00:1C:1D\t\tChenzhou Gospell Digital Technology Co.,Ltd\n00:1C:1E\t\temtrion GmbH\n00:1C:1F\t\tQuest Retail Technology Pty Ltd\n00:1C:20\t\tCLB Benelux\n00:1C:21\t\tNucsafe Inc.\n00:1C:22\t\tAeris Elettronica s.r.l.\n00:1C:23\t\tDell Inc.\n00:1C:24\t\tFormosa Wireless Systems Corp.\n00:1C:25\t\tHon Hai Precision Ind. Co.,Ltd.\n00:1C:26\t\tHon Hai Precision Ind. Co.,Ltd.\n00:1C:27\t\tSunell Electronics Co.\n00:1C:28\t\tSphairon Technologies GmbH\n00:1C:29\t\tCore Digital Electronics Co., Ltd\n00:1C:2A\t\tEnvisacor Technologies Inc.\n00:1C:2B\t\tHive\n00:1C:2C\t\tSynapse\n00:1C:2D\t\tFlexRadio Systems\n00:1C:2E\t\tHPN Supply Chain\n00:1C:2F\t\tPfister GmbH\n00:1C:30\t\tMode Lighting (UK ) Ltd.\n00:1C:31\t\tMobile XP Technology Co., LTD\n00:1C:32\t\tTelian Corporation\n00:1C:33\t\tSutron\n00:1C:34\t\tHuey Chiao International Co., Ltd.\n00:1C:35\t\tNokia Danmark A/S\n00:1C:36\t\tiNEWiT NV\n00:1C:37\t\tCallpod, Inc.\n00:1C:38\t\tBio-Rad Laboratories, Inc.\n00:1C:39\t\tS Netsystems Inc.\n00:1C:3A\t\tElement Labs, Inc.\n00:1C:3B\t\tAmRoad Technology Inc.\n00:1C:3C\t\tSeon Design Inc.\n00:1C:3D\t\tWaveStorm\n00:1C:3E\t\tECKey Corporation\n00:1C:3F\t\tInternational Police Technologies, Inc.\n00:1C:40\t\tVDG-Security bv\n00:1C:41\t\tscemtec Transponder Technology GmbH\n00:1C:42\t\tParallels, Inc.\n00:1C:43\t\tSamsung Electronics Co.,Ltd\n00:1C:44\t\tBosch Security Systems BV\n00:1C:45\t\tChenbro Micom Co., Ltd.\n00:1C:46\t\tQtum\n00:1C:47\t\tHangzhou Hollysys Automation Co., Ltd\n00:1C:48\t\tWiDeFi, Inc.\n00:1C:49\t\tZoltan Technology Inc.\n00:1C:4A\t\tAVM GmbH\n00:1C:4B\t\tGener8, Inc.\n00:1C:4C\t\tPetrotest Instruments\n00:1C:4D\t\tAplix IP Holdings Corporation\n00:1C:4E\t\tTASA International Limited\n00:1C:4F\t\tMacab Ab\n00:1C:50\t\tTCL Technoly Electronics (Huizhou) Co., Ltd.\n00:1C:51\t\tCeleno Communications\n00:1C:52\t\tVisionee Srl\n00:1C:53\t\tSynergy Lighting Controls\n00:1C:54\t\tHillstone Networks Inc\n00:1C:55\t\tShenzhen Kaifa Technology Co.\n00:1C:56\t\tPado Systems, Inc.\n00:1C:57\t\tCisco Systems, Inc\n00:1C:58\t\tCisco Systems, Inc\n00:1C:59\t\tDevon It\n00:1C:5A\t\tAdvanced Relay Corporation\n00:1C:5B\t\tChubb Electronic Security Systems Ltd\n00:1C:5C\t\tIntegrated Medical Systems, Inc.\n00:1C:5D\t\tLeica Microsystems\n00:1C:5E\t\tASTON France\n00:1C:5F\t\tWinland Electronics, Inc.\n00:1C:60\t\tCSP Frontier Technologies,Inc.\n00:1C:61\t\tGalaxy  Microsystems LImited\n00:1C:62\t\tLG Electronics (Mobile Communications)\n00:1C:63\t\tTruen\n00:1C:64\t\tLandis+Gyr\n00:1C:65\t\tJoeScan, Inc.\n00:1C:66\t\tUcamp Co.,Ltd\n00:1C:67\t\tPumpkin Networks, Inc.\n00:1C:68\t\tAnhui Sun Create Electronics Co., Ltd\n00:1C:69\t\tPacket Vision Ltd\n00:1C:6A\t\tWeiss Engineering Ltd.\n00:1C:6B\t\tCOVAX  Co. Ltd\n00:1C:6C\t\t30805\n00:1C:6D\t\tKyohritsu Electronic Industry Co., Ltd.\n00:1C:6E\t\tNewbury Networks, Inc.\n00:1C:6F\t\tEmfit Ltd\n00:1C:70\t\tNovacomm Ltda\n00:1C:71\t\tEmergent Electronics\n00:1C:72\t\tMayer & Cie GmbH & Co KG\n00:1C:73\t\tArista Networks\n00:1C:74\t\tSyswan Technologies Inc.\n00:1C:75\t\tSegnet Ltd.\n00:1C:76\t\tThe Wandsworth Group Ltd\n00:1C:77\t\tProdys\n00:1C:78\t\tWyplay Sas\n00:1C:79\t\tCohesive Financial Technologies LLC\n00:1C:7A\t\tPerfectone Netware Company Ltd\n00:1C:7B\t\tCastlenet Technology Inc.\n00:1C:7C\t\tPerq Systems Corporation\n00:1C:7D\t\tExcelpoint Manufacturing Pte Ltd\n00:1C:7E\t\tToshiba\n00:1C:7F\t\tCheck Point Software Technologies\n00:1C:80\t\tNew Business Division/Rhea-Information CO., LTD.\n00:1C:81\t\tNextGen Venturi LTD\n00:1C:82\t\tGenew Technologies\n00:1C:83\t\tNew Level Telecom Co., Ltd.\n00:1C:84\t\tSTL Solution Co.,Ltd.\n00:1C:85\t\tEunicorn\n00:1C:86\t\tCranite Systems, Inc.\n00:1C:87\t\tUriver Inc.\n00:1C:88\t\tTransystem Inc.\n00:1C:89\t\tForce Communications, Inc.\n00:1C:8A\t\tCirrascale Corporation\n00:1C:8B\t\tMJ Innovations Ltd.\n00:1C:8C\t\tDial Technology Ltd.\n00:1C:8D\t\tMesa Imaging\n00:1C:8E\t\tAlcatel-Lucent IPD\n00:1C:8F\t\tAdvanced Electronic Design, Inc.\n00:1C:90\t\tEmpacket Corporation\n00:1C:91\t\tGefen LLC\n00:1C:92\t\tTervela\n00:1C:93\t\tExaDigm Inc\n00:1C:94\t\tLI-COR Biosciences\n00:1C:95\t\tOpticomm Corporation\n00:1C:96\t\tLinkwise Technology Pte Ltd\n00:1C:97\t\tEnzytek Technology Inc.,\n00:1C:98\t\tLucky Technology (Hk) Company Limited\n00:1C:99\t\tShunra Software Ltd.\n00:1C:9A\t\tNokia Danmark A/S\n00:1C:9B\t\tFEIG ELECTRONIC GmbH\n00:1C:9C\t\tNortel Networks\n00:1C:9D\t\tLiecthi AG\n00:1C:9E\t\tDualtech IT AB\n00:1C:9F\t\tRazorstream, LLC\n00:1C:A0\t\tProduction Resource Group, LLC\n00:1C:A1\t\tAkamai Technologies Inc.\n00:1C:A2\t\tADB Broadband Italia\n00:1C:A3\t\tTerra\n00:1C:A4\t\tSony Corporation\n00:1C:A5\t\tZygo Corporation\n00:1C:A6\t\tWin4NET\n00:1C:A7\t\tInternational Quartz Limited\n00:1C:A8\t\tAirTies Wireless Networks\n00:1C:A9\t\tAudiomatica Srl\n00:1C:AA\t\tBellon Pty Ltd\n00:1C:AB\t\tMeyer Sound Laboratories, Inc.\n00:1C:AC\t\tQniq Technology Corp.\n00:1C:AD\t\tWuhan Telecommunication Devices Co.,Ltd\n00:1C:AE\t\tWiChorus, Inc.\n00:1C:AF\t\tPlato Networks Inc.\n00:1C:B0\t\tCisco Systems, Inc\n00:1C:B1\t\tCisco Systems, Inc\n00:1C:B2\t\tBpt Spa\n00:1C:B3\t\tApple, Inc.\n00:1C:B4\t\tIridium Satellite LLC\n00:1C:B5\t\tNeihua Network Technology Co.,LTD.(NHN)\n00:1C:B6\t\tDuzon CNT Co., Ltd.\n00:1C:B7\t\tUSC DigiArk Corporation\n00:1C:B8\t\tCBC Co., Ltd\n00:1C:B9\t\tKwang Sung Electronics Co., Ltd.\n00:1C:BA\t\tVerScient, Inc.\n00:1C:BB\t\tMusicianLink\n00:1C:BC\t\tCastGrabber, LLC\n00:1C:BD\t\tEzze Mobile Tech., Inc.\n00:1C:BE\t\tNintendo Co., Ltd.\n00:1C:BF\t\tIntel Corporate\n00:1C:C0\t\tIntel Corporate\n00:1C:C1\t\tCommscope\n00:1C:C2\t\tPart II Research, Inc.\n00:1C:C3\t\tCommscope\n00:1C:C4\t\tHewlett Packard\n00:1C:C5\t\t3Com Ltd\n00:1C:C6\t\tProStor Systems\n00:1C:C7\t\tRembrandt Technologies, LLC d/b/a REMSTREAM\n00:1C:C8\t\tINDUSTRONIC Industrie-Electronic GmbH & Co. KG\n00:1C:C9\t\tKaise Electronic Technology Co., Ltd.\n00:1C:CA\t\tShanghai Gaozhi Science & Technology Development Co.\n00:1C:CB\t\tForth Corporation Public Company Limited\n00:1C:CC\t\tBlackBerry RTS\n00:1C:CD\t\tAlektrona Corporation\n00:1C:CE\t\tBy Techdesign\n00:1C:CF\t\tLimetek\n00:1C:D0\t\tCircleone Co.,Ltd.\n00:1C:D1\t\tWaves Audio LTD\n00:1C:D2\t\tKing Champion (Hong Kong) Limited\n00:1C:D3\t\tZP Engineering SEL\n00:1C:D4\t\tNokia Danmark A/S\n00:1C:D5\t\tZeeVee, Inc.\n00:1C:D6\t\tNokia Danmark A/S\n00:1C:D7\t\tHarman/Becker Automotive Systems GmbH\n00:1C:D8\t\tBlueAnt Wireless\n00:1C:D9\t\tGlobalTop Technology Inc.\n00:1C:DA\t\tExegin Technologies Limited\n00:1C:DB\t\tCarpoint Co.,Ltd\n00:1C:DC\t\tCustom Computer Services, Inc.\n00:1C:DD\t\tCowbell Engineering Co., Ltd.\n00:1C:DE\t\tInteractive Multimedia eXchange Inc.\n00:1C:DF\t\tBelkin International Inc.\n00:1C:E0\t\tDasan Tps\n00:1C:E1\t\tIndra Sistemas, S.A.\n00:1C:E2\t\tAttero Tech, LLC.\n00:1C:E3\t\tOptimedical Systems\n00:1C:E4\t\tEleSy JSC\n00:1C:E5\t\tMBS Electronic Systems GmbH\n00:1C:E6\t\tInnes\n00:1C:E7\t\tRocon PLC Research Centre\n00:1C:E8\t\tCummins Inc\n00:1C:E9\t\tGalaxy Technology Limited\n00:1C:EA\t\tScientific-Atlanta, Inc\n00:1C:EB\t\tNortel Networks\n00:1C:EC\t\tMobilesoft (Aust.) Pty Ltd\n00:1C:ED\t\tEnvironnement Sa\n00:1C:EE\t\tSHARP Corporation\n00:1C:EF\t\tPrimax Electronics Ltd.\n00:1C:F0\t\tD-Link Corporation\n00:1C:F1\t\tSUPoX Technology Co. , LTD.\n00:1C:F2\t\tTenlon Technology Co.,Ltd.\n00:1C:F3\t\tEVS Broadcast Equipment\n00:1C:F4\t\tMedia Technology Systems Inc\n00:1C:F5\t\tWiseblue Technology Limited\n00:1C:F6\t\tCisco Systems, Inc\n00:1C:F7\t\tAudioScience\n00:1C:F8\t\tParade Technologies, Ltd.\n00:1C:F9\t\tCisco Systems, Inc\n00:1C:FA\t\tAlarm.com\n00:1C:FB\t\tCommscope\n00:1C:FC\t\tSumitomo Electric Industries, Ltd\n00:1C:FD\t\tUniversal Electronics, Inc.\n00:1C:FE\t\tQuartics Inc\n00:1C:FF\t\tNapera Networks Inc\n00:1D:00\t\tBrivo Systems, LLC\n00:1D:01\t\tNeptune Digital\n00:1D:02\t\tCybertech Telecom Development\n00:1D:03\t\tDesign Solutions Inc.\n00:1D:04\t\tZipit Wireless, Inc.\n00:1D:05\t\tCooper Lighting Solutions\n00:1D:06\t\tHM Electronics, Inc.\n00:1D:07\t\tShenzhen Sang Fei Consumer Communications Co.,Ltd\n00:1D:08\t\tJiangsu Yinhe  Electronics Co.,Ltd.\n00:1D:09\t\tDell Inc.\n00:1D:0A\t\tDavis Instruments, Inc.\n00:1D:0B\t\tPower Standards Lab\n00:1D:0C\t\tMobileCompia\n00:1D:0D\t\tSony Interactive Entertainment Inc.\n00:1D:0E\t\tAgapha Technology co., Ltd.\n00:1D:0F\t\tTp-Link Technologies Co.,Ltd.\n00:1D:10\t\tLightHaus Logic, Inc.\n00:1D:11\t\tAnalogue & Micro Ltd\n00:1D:12\t\tRohm Co., Ltd.\n00:1D:13\t\tNextGTV\n00:1D:14\t\tSperadtone Information Technology Limited\n00:1D:15\t\tShenzhen Dolphin Electronic Co., Ltd\n00:1D:16\t\tSfr\n00:1D:17\t\tDigital Sky Corporation\n00:1D:18\t\tPower Innovation GmbH\n00:1D:19\t\tArcadyan Technology Corporation\n00:1D:1A\t\tOvisLink S.A.\n00:1D:1B\t\tSangean Electronics Inc.\n00:1D:1C\t\tGennet s.a.\n00:1D:1D\t\tInter-M Corporation\n00:1D:1E\t\tKyushu Ten Co.,Ltd\n00:1D:1F\t\tSiauliu Tauro Televizoriai, JSC\n00:1D:20\t\tComtrend Corporation\n00:1D:21\t\tAlcad SL\n00:1D:22\t\tFoss Analytical A/S\n00:1D:23\t\tSensus\n00:1D:24\t\tAclara Power-Line Systems Inc.\n00:1D:25\t\tSamsung Electronics Co.,Ltd\n00:1D:26\t\tRockridgesound Technology Co.\n00:1D:27\t\tNac-Intercom\n00:1D:28\t\tSony Corporation\n00:1D:29\t\tDoro AB\n00:1D:2A\t\tShenzhen Bul-Tech Co.,Ltd.\n00:1D:2B\t\tWuhan Pont Technology CO. , LTD\n00:1D:2C\t\tWavetrend Technologies (Pty) Limited\n00:1D:2D\t\tPylone, Inc.\n00:1D:2E\t\tRuckus Wireless\n00:1D:2F\t\tQuantumVision Corporation\n00:1D:30\t\tYX Wireless S.A.\n00:1D:31\t\tHighpro International R&D Co,.Ltd.\n00:1D:32\t\tLongkay Communication & Technology (Shanghai) Co. Ltd\n00:1D:33\t\tMaverick Systems Inc.\n00:1D:34\t\tSYRIS Technology Corp\n00:1D:35\t\tViconics Electronics Inc.\n00:1D:36\t\tElectronics Corporation Of India Limited\n00:1D:37\t\tThales-Panda Transportation System\n00:1D:38\t\tSeagate Technology\n00:1D:39\t\tMoohadigital Co., Ltd\n00:1D:3A\t\tmh acoustics LLC\n00:1D:3B\t\tNokia Danmark A/S\n00:1D:3C\t\tMuscle Corporation\n00:1D:3D\t\tAvidyne Corporation\n00:1D:3E\t\tSaka Techno Science Co.,Ltd\n00:1D:3F\t\tMitron Pty Ltd\n00:1D:40\t\tIntel – GE Care Innovations LLC\n00:1D:41\t\tHardy Instruments\n00:1D:42\t\tNortel Networks\n00:1D:43\t\tShenzhen G-link Digital Technology Co., Ltd.\n00:1D:44\t\tKrohne\n00:1D:45\t\tCisco Systems, Inc\n00:1D:46\t\tCisco Systems, Inc\n00:1D:47\t\tCovote GmbH & Co KG\n00:1D:48\t\tSensor-Technik Wiedemann GmbH\n00:1D:49\t\tInnovation Wireless Inc.\n00:1D:4A\t\tCarestream Health, Inc.\n00:1D:4B\t\tGrid Connect Inc.\n00:1D:4C\t\tAlcatel-Lucent\n00:1D:4D\t\tAdaptive Recognition Hungary, Inc\n00:1D:4E\t\tTCM Mobile LLC\n00:1D:4F\t\tApple, Inc.\n00:1D:50\t\tSpinetix Sa\n00:1D:51\t\tBabcock & Wilcox Power Generation Group, Inc\n00:1D:52\t\tDefzone B.V.\n00:1D:53\t\tS&O Electronics (Malaysia) Sdn. Bhd.\n00:1D:54\t\tSunnic Technology & Merchandise INC.\n00:1D:55\t\tZANTAZ, Inc\n00:1D:56\t\tKramer Electronics Ltd.\n00:1D:57\t\tCAETEC Messtechnik\n00:1D:58\t\tCQ Inc\n00:1D:59\t\tMitra Energy & Infrastructure\n00:1D:5A\t\t2Wire Inc\n00:1D:5B\t\tTecvan Informatica Ltda\n00:1D:5C\t\tTom Communication Industrial Co.,Ltd.\n00:1D:5D\t\tControl Dynamics Pty. Ltd.\n00:1D:5E\t\tComing Media Corp.\n00:1D:5F\t\tOverSpeed SARL\n00:1D:60\t\tASUSTek COMPUTER INC.\n00:1D:61\t\tBIJ Corporation\n00:1D:62\t\tInPhase Technologies\n00:1D:63\t\tMiele & Cie. KG\n00:1D:64\t\tAdam Communications Systems Int Ltd\n00:1D:65\t\tMicrowave Radio Communications\n00:1D:66\t\tHyundai Telecom\n00:1D:67\t\tAmec\n00:1D:68\t\tThomson Telecom Belgium\n00:1D:69\t\tKnorr-Bremse IT-Services GmbH\n00:1D:6A\t\tAlpha Networks Inc.\n00:1D:6B\t\tCommscope\n00:1D:6C\t\tClariPhy Communications, Inc.\n00:1D:6D\t\tConfidant International LLC\n00:1D:6E\t\tNokia Danmark A/S\n00:1D:6F\t\tChainzone Technology Co., Ltd\n00:1D:70\t\tCisco Systems, Inc\n00:1D:71\t\tCisco Systems, Inc\n00:1D:72\t\tWistron Corporation\n00:1D:73\t\tBuffalo.Inc\n00:1D:74\t\tTianjin China-Silicon Microelectronics Co., Ltd.\n00:1D:75\t\tRadioscape PLC\n00:1D:76\t\tEyeheight Ltd.\n00:1D:77\t\tNSGate\n00:1D:78\t\tInvengo Information Technology Co.,Ltd\n00:1D:79\t\tSignamax Llc\n00:1D:7A\t\tWideband Semiconductor, Inc.\n00:1D:7B\t\tIce Energy, Inc.\n00:1D:7C\t\tABE Elettronica S.p.A.\n00:1D:7D\t\tGiga-Byte Technology Co.,Ltd.\n00:1D:7E\t\tCisco-Linksys, LLC\n00:1D:7F\t\tTekron International Ltd\n00:1D:80\t\tBeijing Huahuan Eletronics Co.,Ltd\n00:1D:81\t\tGuangzhou Gateway Electronics Co., Ltd\n00:1D:82\t\tGN Netcom A/S\n00:1D:83\t\tEmitech Corporation\n00:1D:84\t\tGateway, Inc.\n00:1D:85\t\tCall Direct Cellular Solutions\n00:1D:86\t\tShinwa Industries(China) Ltd.\n00:1D:87\t\tVigTech Labs Sdn Bhd\n00:1D:88\t\tClearwire\n00:1D:89\t\tVaultStor Corporation\n00:1D:8A\t\tTechTrex Inc\n00:1D:8B\t\tADB Broadband Italia\n00:1D:8C\t\tLa Crosse Technology LTD\n00:1D:8D\t\tFluke Process Instruments GmbH\n00:1D:8E\t\tAlereon, Inc.\n00:1D:8F\t\tPureWave Networks\n00:1D:90\t\tEMCO Flow Systems\n00:1D:91\t\tDigitize, Inc\n00:1D:92\t\tMicro-Star Int'L Co.,Ltd.\n00:1D:93\t\tModacom\n00:1D:94\t\tClimax Technology Co., Ltd\n00:1D:95\t\tFlash, Inc.\n00:1D:96\t\tWatchGuard Video\n00:1D:97\t\tAlertus Technologies LLC\n00:1D:98\t\tNokia Danmark A/S\n00:1D:99\t\tCyan Optic, Inc.\n00:1D:9A\t\tGodex International Co., Ltd\n00:1D:9B\t\tHokuyo Automatic Co., Ltd.\n00:1D:9C\t\tRockwell Automation\n00:1D:9D\t\tArtjoy International Limited\n00:1D:9E\t\tAxion Technologies\n00:1D:9F\t\tMATT   R.P.Traczynscy Sp.J.\n00:1D:A0\t\tHeng Yu Electronic Manufacturing Company Limited\n00:1D:A1\t\tCisco Systems, Inc\n00:1D:A2\t\tCisco Systems, Inc\n00:1D:A3\t\tSabiOso\n00:1D:A4\t\tHangzhou System Technology CO., LTD\n00:1D:A5\t\tWB Electronics\n00:1D:A6\t\tMedia Numerics Limited\n00:1D:A7\t\tSeamless Internet\n00:1D:A8\t\tTakahata Electronics Co.,Ltd\n00:1D:A9\t\tCastles Technology, Co., LTD\n00:1D:AA\t\tDrayTek Corp.\n00:1D:AB\t\tSwissQual License AG\n00:1D:AC\t\tGigamon Systems LLC\n00:1D:AD\t\tSinotech Engineering Consultants, Inc.  Geotechnical Enginee\n00:1D:AE\t\tChang Tseng Technology Co., Ltd\n00:1D:AF\t\tNortel Networks\n00:1D:B0\t\tFuJian HengTong Information Technology Co.,Ltd\n00:1D:B1\t\tCrescendo Networks\n00:1D:B2\t\tHokkaido Electric Engineering Co.,Ltd.\n00:1D:B3\t\tHPN Supply Chain\n00:1D:B4\t\tKumho Eng Co.,Ltd\n00:1D:B5\t\tJuniper Networks\n00:1D:B6\t\tBestComm Networks, Inc.\n00:1D:B7\t\tTendril Networks, Inc.\n00:1D:B8\t\tIntoto Inc.\n00:1D:B9\t\tWellspring Wireless\n00:1D:BA\t\tSony Corporation\n00:1D:BB\t\tDynamic System Electronics Corp.\n00:1D:BC\t\tNintendo Co., Ltd.\n00:1D:BD\t\tVersamed Inc.\n00:1D:BE\t\tCommscope\n00:1D:BF\t\tRadiient Technologies, Inc.\n00:1D:C0\t\tEnphase Energy\n00:1D:C1\t\tAudinate Pty L\n00:1D:C2\t\tXortec Oy\n00:1D:C3\t\tRIKOR TV, Ltd\n00:1D:C4\t\tAIOI Systems Co., Ltd.\n00:1D:C5\t\tBeijing Jiaxun Feihong Electricial Co., Ltd.\n00:1D:C6\t\tSNR Inc.\n00:1D:C7\t\tL-3 Communications Geneva Aerospace\n00:1D:C8\t\tNavionics Research Inc., dba SCADAmetrics\n00:1D:C9\t\tGainSpan Corp.\n00:1D:CA\t\tPAV Electronics Limited\n00:1D:CB\t\tExéns Development Oy\n00:1D:CC\t\tAyon Cyber Security, Inc\n00:1D:CD\t\tCommscope\n00:1D:CE\t\tCommscope\n00:1D:CF\t\tCommscope\n00:1D:D0\t\tCommscope\n00:1D:D1\t\tCommscope\n00:1D:D2\t\tCommscope\n00:1D:D3\t\tCommscope\n00:1D:D4\t\tCommscope\n00:1D:D5\t\tCommscope\n00:1D:D6\t\tCommscope\n00:1D:D7\t\tAlgolith\n00:1D:D8\t\tMicrosoft Corporation\n00:1D:D9\t\tHon Hai Precision Ind. Co.,Ltd.\n00:1D:DA\t\tMikroelektronika spol. s r. o.\n00:1D:DB\t\tC-BEL Corporation\n00:1D:DC\t\tHangZhou DeChangLong Tech&Info Co.,Ltd\n00:1D:DD\t\tDat H.K. Limited\n00:1D:DE\t\tZhejiang Broadcast&Television Technology Co.,Ltd.\n00:1D:DF\t\tSunitec Enterprise Co.,Ltd\n00:1D:E0\t\tIntel Corporate\n00:1D:E1\t\tIntel Corporate\n00:1D:E2\t\tRadionor Communications\n00:1D:E3\t\tIntuicom\n00:1D:E4\t\tVisioneered Image Systems\n00:1D:E5\t\tCisco Systems, Inc\n00:1D:E6\t\tCisco Systems, Inc\n00:1D:E7\t\tMarine Sonic Technology, Ltd.\n00:1D:E8\t\tNikko Denki Tsushin Corporation(NDTC)\n00:1D:E9\t\tNokia Danmark A/S\n00:1D:EA\t\tCommtest Instruments Ltd\n00:1D:EB\t\tDINEC International\n00:1D:EC\t\tMarusys\n00:1D:ED\t\tGrid Net, Inc.\n00:1D:EE\t\tNextvision Sistemas Digitais De Televisão Ltda.\n00:1D:EF\t\tTrimm, Inc.\n00:1D:F0\t\tVidient Systems, Inc.\n00:1D:F1\t\tIntego Systems, Inc.\n00:1D:F2\t\tNetflix, Inc.\n00:1D:F3\t\tSBS Science & Technology Co., Ltd\n00:1D:F4\t\tMagellan Technology Pty Limited\n00:1D:F5\t\tSunshine Co,LTD\n00:1D:F6\t\tSamsung Electronics Co.,Ltd\n00:1D:F7\t\tR. STAHL Schaltgeräte GmbH\n00:1D:F8\t\tWebpro Vision Technology Corporation\n00:1D:F9\t\tCybiotronics (Far East) Limited\n00:1D:FA\t\tFujian LANDI Commercial Equipment Co.,Ltd\n00:1D:FB\t\tNETCLEUS Systems Corporation\n00:1D:FC\t\tKsic\n00:1D:FD\t\tNokia Danmark A/S\n00:1D:FE\t\tPalm, Inc\n00:1D:FF\t\tNetwork Critical Solutions Ltd\n00:1E:00\t\tShantou Institute of Ultrasonic Instruments\n00:1E:01\t\tRenesas Technology Sales Co., Ltd.\n00:1E:02\t\tSougou Keikaku Kougyou Co.,Ltd.\n00:1E:03\t\tLiComm Co., Ltd.\n00:1E:04\t\tHanson Research Corporation\n00:1E:05\t\tXseed Technologies & Computing\n00:1E:06\t\tWibrain\n00:1E:07\t\tWiny Technology Co., Ltd.\n00:1E:08\t\tCentec Networks Inc\n00:1E:09\t\tZEFATEK Co.,LTD\n00:1E:0A\t\tSyba Tech Limited\n00:1E:0B\t\tHewlett Packard\n00:1E:0C\t\tSherwood Information Partners, Inc.\n00:1E:0D\t\tMicran Ltd.\n00:1E:0E\t\tMaxi View Holdings Limited\n00:1E:0F\t\tBriot International\n00:1E:10\t\tHuawei Technologies Co.,Ltd\n00:1E:11\t\tElelux International Ltd\n00:1E:12\t\tEcolab\n00:1E:13\t\tCisco Systems, Inc\n00:1E:14\t\tCisco Systems, Inc\n00:1E:15\t\tBeech Hill Electronics\n00:1E:16\t\tKeytronix\n00:1E:17\t\tStn Bv\n00:1E:18\t\tRadio Activity srl\n00:1E:19\t\tGtri\n00:1E:1A\t\tBest Source Taiwan Inc.\n00:1E:1B\t\tDigital Stream Technology, Inc.\n00:1E:1C\t\tSWS Australia Pty Limited\n00:1E:1D\t\tEast Coast Datacom, Inc.\n00:1E:1E\t\tHoneywell Life Safety\n00:1E:1F\t\tNortel Networks\n00:1E:20\t\tIntertain Inc.\n00:1E:21\t\tQisda Corporation\n00:1E:22\t\tARVOO Imaging Products BV\n00:1E:23\t\tElectronic Educational Devices, Inc\n00:1E:24\t\tZhejiang Bell Technology Co.,ltd\n00:1E:25\t\tIntek Digital\n00:1E:26\t\tDigifriends Co. Ltd\n00:1E:27\t\tSBN TECH Co.,Ltd.\n00:1E:28\t\tLumexis Corporation\n00:1E:29\t\tHypertherm Inc\n00:1E:2A\t\tNetgear\n00:1E:2B\t\tRadio Systems Design, Inc.\n00:1E:2C\t\tCyVerse Corporation\n00:1E:2D\t\tStim\n00:1E:2E\t\tSIRTI S.p.A.\n00:1E:2F\t\tDiMoto Pty Ltd\n00:1E:30\t\tShireen Inc\n00:1E:31\t\tinfomark\n00:1E:32\t\tZensys\n00:1E:33\t\tInventec Corporation\n00:1E:34\t\tCryptoMetrics\n00:1E:35\t\tNintendo Co., Ltd.\n00:1E:36\t\tIpte\n00:1E:37\t\tUniversal Global Scientific Industrial Co., Ltd.\n00:1E:38\t\tBluecard Software Technology Co., Ltd.\n00:1E:39\t\tComsys Communication Ltd.\n00:1E:3A\t\tNokia Danmark A/S\n00:1E:3B\t\tNokia Danmark A/S\n00:1E:3C\t\tLyngbox Media AB\n00:1E:3D\t\tAlpsalpine Co,.Ltd\n00:1E:3E\t\tKMW Inc.\n00:1E:3F\t\tTrellisWare Technologies, Inc.\n00:1E:40\t\tShanghai DareGlobal Technologies Co.,Ltd\n00:1E:41\t\tMicrowave Communication & Component, Inc.\n00:1E:42\t\tTeltonika\n00:1E:43\t\tAisin Corporation\n00:1E:44\t\tSantec\n00:1E:45\t\tSony Corporation\n00:1E:46\t\tCommscope\n00:1E:47\t\tPT. Hariff Daya Tunggal Engineering\n00:1E:48\t\tWi-Links\n00:1E:49\t\tCisco Systems, Inc\n00:1E:4A\t\tCisco Systems, Inc\n00:1E:4B\t\tCity Theatrical\n00:1E:4C\t\tHon Hai Precision Ind. Co.,Ltd.\n00:1E:4D\t\tWelkin Sciences, LLC\n00:1E:4E\t\tDAKO EDV-Ingenieur- und Systemhaus GmbH\n00:1E:4F\t\tDell Inc.\n00:1E:50\t\tBattistoni Research\n00:1E:51\t\tConverter Industry Srl\n00:1E:52\t\tApple, Inc.\n00:1E:53\t\tFurther Tech Co., LTD\n00:1E:54\t\tTOYO ELECTRIC Corporation\n00:1E:55\t\tCOWON SYSTEMS,Inc.\n00:1E:56\t\tBally Wulff Entertainment GmbH\n00:1E:57\t\tALCOMA, spol. s r.o.\n00:1E:58\t\tD-Link Corporation\n00:1E:59\t\tSilicon Turnkey Express, LLC\n00:1E:5A\t\tCommscope\n00:1E:5B\t\tUnitron Company, Inc.\n00:1E:5C\t\tRB GeneralEkonomik\n00:1E:5D\t\tHolosys d.o.o.\n00:1E:5E\t\tCOmputime Ltd.\n00:1E:5F\t\tKwikByte, LLC\n00:1E:60\t\tDigital Lighting Systems, Inc\n00:1E:61\t\tITEC GmbH\n00:1E:62\t\tSiemon\n00:1E:63\t\tVibro-Meter SA\n00:1E:64\t\tIntel Corporate\n00:1E:65\t\tIntel Corporate\n00:1E:66\t\tRESOL Elektronische Regelungen GmbH\n00:1E:67\t\tIntel Corporate\n00:1E:68\t\tQuanta Computer Inc.\n00:1E:69\t\tThomson Inc.\n00:1E:6A\t\tBeijing Bluexon Technology Co.,Ltd\n00:1E:6B\t\tCisco SPVTG\n00:1E:6C\t\tOpaque Systems\n00:1E:6D\t\tIT R&D Center\n00:1E:6E\t\tShenzhen First Mile Communications Ltd\n00:1E:6F\t\tMagna-Power Electronics, Inc.\n00:1E:70\t\tChelton Limited\n00:1E:71\t\tMIrcom Group of Companies\n00:1E:72\t\tPcs\n00:1E:73\t\tzte corporation\n00:1E:74\t\tSagemcom Broadband SAS\n00:1E:75\t\tLG Electronics (Mobile Communications)\n00:1E:76\t\tThermo Fisher Scientific\n00:1E:77\t\tAir2App\n00:1E:78\t\tOwitek Technology Ltd.,\n00:1E:79\t\tCisco Systems, Inc\n00:1E:7A\t\tCisco Systems, Inc\n00:1E:7B\t\tR.I.CO. S.r.l.\n00:1E:7C\t\tTaiwick Limited\n00:1E:7D\t\tSamsung Electronics Co.,Ltd\n00:1E:7E\t\tNortel Networks\n00:1E:7F\t\tCBM of America\n00:1E:80\t\tIcotera A/S\n00:1E:81\t\tCNB Technology Inc.\n00:1E:82\t\tSanDisk Corporation\n00:1E:83\t\tLAN/MAN Standards Association (LMSC)\n00:1E:84\t\tPika Technologies Inc.\n00:1E:85\t\tLagotek Corporation\n00:1E:86\t\tMEL Co.,Ltd.\n00:1E:87\t\tRealease Limited\n00:1E:88\t\tAndor System Support Co., Ltd.\n00:1E:89\t\tCRFS Limited\n00:1E:8A\t\teCopy, Inc\n00:1E:8B\t\tInfra Access Korea Co., Ltd.\n00:1E:8C\t\tASUSTek COMPUTER INC.\n00:1E:8D\t\tCommscope\n00:1E:8E\t\tHunkeler AG\n00:1E:8F\t\tCanon Inc.\n00:1E:90\t\tElitegroup Computer Systems Co.,Ltd.\n00:1E:91\t\tKIMIN Electronic Co., Ltd.\n00:1E:92\t\tJeulin S.A.\n00:1E:93\t\tCiriTech Systems Inc\n00:1E:94\t\tSupercom Technology Corporation\n00:1E:95\t\tSigmalink\n00:1E:96\t\tSepura Limited\n00:1E:97\t\tMedium Link System Technology CO., LTD,\n00:1E:98\t\tGreenLine Communications\n00:1E:99\t\tVantanol Industrial Corporation\n00:1E:9A\t\tHAMILTON Bonaduz AG\n00:1E:9B\t\tSan-Eisha, Ltd.\n00:1E:9C\t\tFidustron INC\n00:1E:9D\t\tRecall Technologies, Inc.\n00:1E:9E\t\tddm hopt + schuler Gmbh + Co. KG\n00:1E:9F\t\tVisioneering Systems, Inc.\n00:1E:A0\t\tXLN-t\n00:1E:A1\t\tBrunata a/s\n00:1E:A2\t\tSymx Systems, Inc.\n00:1E:A3\t\tNokia Danmark A/S\n00:1E:A4\t\tNokia Danmark A/S\n00:1E:A5\t\tROBOTOUS, Inc.\n00:1E:A6\t\tBest IT World (India) Pvt. Ltd.\n00:1E:A7\t\tActiontec Electronics, Inc\n00:1E:A8\t\tDatang Mobile Communications Equipment CO.,LTD\n00:1E:A9\t\tNintendo Co., Ltd.\n00:1E:AA\t\tE-Senza Technologies GmbH\n00:1E:AB\t\tTeleWell Oy\n00:1E:AC\t\tArmadeus Systems\n00:1E:AD\t\tWingtech Group Limited\n00:1E:AE\t\tContinental Automotive Systems Inc.\n00:1E:AF\t\tOphir Optronics Ltd\n00:1E:B0\t\tImesD Electronica S.L.\n00:1E:B1\t\tCryptsoft Pty Ltd\n00:1E:B2\t\tLG Innotek\n00:1E:B3\t\tPrimex Wireless\n00:1E:B4\t\tUnifat Technology Ltd.\n00:1E:B5\t\tEver Sparkle Technologies Ltd\n00:1E:B6\t\tTAG Heuer SA\n00:1E:B7\t\tTBTech, Co., Ltd.\n00:1E:B8\t\tAloys, Inc\n00:1E:B9\t\tSing Fai Technology Limited\n00:1E:BA\t\tHigh Density Devices AS\n00:1E:BB\t\tBluelight Technology Inc.\n00:1E:BC\t\tWintech Automation Co.,Ltd.\n00:1E:BD\t\tCisco Systems, Inc\n00:1E:BE\t\tCisco Systems, Inc\n00:1E:BF\t\tHaas Automation Inc.\n00:1E:C0\t\tMicrochip Technology Inc.\n00:1E:C1\t\t3Com Europe Ltd\n00:1E:C2\t\tApple, Inc.\n00:1E:C3\t\tKozio, Inc.\n00:1E:C4\t\tCelio Corp\n00:1E:C5\t\tMiddle Atlantic Products Inc\n00:1E:C6\t\tLeviton Manufacturing Co., Inc\n00:1E:C7\t\t2Wire Inc\n00:1E:C8\t\tRapid Mobile (Pty) Ltd\n00:1E:C9\t\tDell Inc.\n00:1E:CA\t\tNortel Networks\n00:1E:CB\t\t\"RPC \"Energoautomatika\" Ltd\n00:1E:CC\t\tCdvi\n00:1E:CD\t\tKYLAND Technology Co. LTD\n00:1E:CE\t\tBISA Technologies (Hong Kong) Limited\n00:1E:CF\t\tPhilips Electronics Uk Ltd\n00:1E:D0\t\tIngespace\n00:1E:D1\t\tKeyprocessor B.V.\n00:1E:D2\t\tRay Shine Video Technology Inc\n00:1E:D3\t\tDot Technology Int'l Co., Ltd.\n00:1E:D4\t\tDoble Engineering\n00:1E:D5\t\tTekon-Automatics\n00:1E:D6\t\tAlentec & Orion AB\n00:1E:D7\t\tH-Stream Wireless, Inc.\n00:1E:D8\t\tDigital United Inc.\n00:1E:D9\t\tMitsubishi Precision Co.,LTd.\n00:1E:DA\t\tWesemann Elektrotechniek B.V.\n00:1E:DB\t\tGiken Trastem Co., Ltd.\n00:1E:DC\t\tSony Corporation\n00:1E:DD\t\tWasko S.A.\n00:1E:DE\t\tByd Company Limited\n00:1E:DF\t\tMaster Industrialization Center Kista\n00:1E:E0\t\tUrmet SpA\n00:1E:E1\t\tSamsung Electronics Co.,Ltd\n00:1E:E2\t\tSamsung Electronics Co.,Ltd\n00:1E:E3\t\tT&W Electronics (ShenZhen) Co.,Ltd\n00:1E:E4\t\tACS Solutions France\n00:1E:E5\t\tCisco-Linksys, LLC\n00:1E:E6\t\tShenzhen Advanced Video Info-Tech Co., Ltd.\n00:1E:E7\t\tEpic Systems Inc\n00:1E:E8\t\tMytek\n00:1E:E9\t\tStoneridge Electronics AB\n00:1E:EA\t\tSensor Switch, Inc.\n00:1E:EB\t\tTalk-A-Phone Co.\n00:1E:EC\t\tCompal Information (Kunshan) Co., Ltd.\n00:1E:ED\t\tAdventiq Ltd.\n00:1E:EE\t\tETL Systems Ltd\n00:1E:EF\t\tCantronic International Limited\n00:1E:F0\t\tGigafin Networks\n00:1E:F1\t\tServimat\n00:1E:F2\t\tMicro Motion Inc\n00:1E:F3\t\tFrom2\n00:1E:F4\t\tL-3 Communications Display Systems\n00:1E:F5\t\tHitek Automated Inc.\n00:1E:F6\t\tCisco Systems, Inc\n00:1E:F7\t\tCisco Systems, Inc\n00:1E:F8\t\tEmfinity Inc.\n00:1E:F9\t\tPascom Kommunikations systeme GmbH.\n00:1E:FA\t\tPROTEI Ltd.\n00:1E:FB\t\tTrio Motion Technology Ltd\n00:1E:FC\t\tJsc \"Massa-K\"\n00:1E:FD\t\tMicrobit 2.0 AB\n00:1E:FE\t\tLEVEL s.r.o.\n00:1E:FF\t\tMueller-Elektronik GmbH & Co. KG\n00:1F:00\t\tNokia Danmark A/S\n00:1F:01\t\tNokia Danmark A/S\n00:1F:02\t\tPixelmetrix Corporation Pte Ltd\n00:1F:03\t\tNum Ag\n00:1F:04\t\tGranch Ltd.\n00:1F:05\t\tiTAS Technology Corp.\n00:1F:06\t\tIntegrated Dispatch Solutions\n00:1F:07\t\tAZTEQ Mobile\n00:1F:08\t\tRisco Ltd\n00:1F:09\t\tJastec\n00:1F:0A\t\tNortel Networks\n00:1F:0B\t\tFederal State Unitary Enterprise Industrial Union\"Electropribor\"\n00:1F:0C\t\tIntelligent Digital Services GmbH\n00:1F:0D\t\tL3 Communications - Telemetry West\n00:1F:0E\t\tJapan Kyastem Co., Ltd\n00:1F:0F\t\tSelect Engineered Systems\n00:1F:10\t\tToledo Do Brasil Industria De Balancas  Ltda\n00:1F:11\t\tOpenmoko, Inc.\n00:1F:12\t\tJuniper Networks\n00:1F:13\t\tS.& A.S. Ltd.\n00:1F:14\t\tNexG\n00:1F:15\t\tBioscrypt Inc\n00:1F:16\t\tWistron Corporation\n00:1F:17\t\tIDX Company, Ltd.\n00:1F:18\t\tHakusan.Mfg.Co,.Ltd\n00:1F:19\t\tBen-Ri Electronica S.A.\n00:1F:1A\t\tProminvest\n00:1F:1B\t\tRoyalTek Company Ltd.\n00:1F:1C\t\tKOBISHI ELECTRIC Co.,Ltd.\n00:1F:1D\t\tAtlas Material Testing Technology LLC\n00:1F:1E\t\tAstec Technology Co., Ltd\n00:1F:1F\t\tEdimax Technology Co. Ltd.\n00:1F:20\t\tLogitech Europe SA\n00:1F:21\t\tInner Mongolia Yin An Science & Technology Development Co.,L\n00:1F:22\t\tSource Photonics, Inc.\n00:1F:23\t\tDGS Diagnostics A/S\n00:1F:24\t\tDigitview Technology Co., Ltd.\n00:1F:25\t\tMBS GmbH\n00:1F:26\t\tCisco Systems, Inc\n00:1F:27\t\tCisco Systems, Inc\n00:1F:28\t\tHPN Supply Chain\n00:1F:29\t\tHewlett Packard\n00:1F:2A\t\tAccm\n00:1F:2B\t\tOrange Logic\n00:1F:2C\t\tStarbridge Networks\n00:1F:2D\t\tElectro-Optical Imaging, Inc.\n00:1F:2E\t\tTriangle Research Int'l Pte Ltd\n00:1F:2F\t\tBerker GmbH & Co. KG\n00:1F:30\t\tTravelping\n00:1F:31\t\tRadiocomp\n00:1F:32\t\tNintendo Co., Ltd.\n00:1F:33\t\tNetgear\n00:1F:34\t\tLung Hwa Electronics Co., Ltd.\n00:1F:35\t\tAir802 Llc\n00:1F:36\t\tBellwin Information Co. Ltd.,\n00:1F:37\t\tGenesis I&C\n00:1F:38\t\tPositron\n00:1F:39\t\tConstrucciones y Auxiliar de Ferrocarriles, S.A.\n00:1F:3A\t\tHon Hai Precision Ind. Co.,Ltd.\n00:1F:3B\t\tIntel Corporate\n00:1F:3C\t\tIntel Corporate\n00:1F:3D\t\tQbit GmbH\n00:1F:3E\t\tRP-Technik e.K.\n00:1F:3F\t\tAVM GmbH\n00:1F:40\t\tSpeakercraft Inc.\n00:1F:41\t\tRuckus Wireless\n00:1F:42\t\tEtherstack plc\n00:1F:43\t\tEntes Elektronik\n00:1F:44\t\tGE Transportation Systems\n00:1F:45\t\tEnterasys\n00:1F:46\t\tNortel Networks\n00:1F:47\t\tMCS Logic Inc.\n00:1F:48\t\tMojix Inc.\n00:1F:49\t\tManhattan TV Ltd\n00:1F:4A\t\tAlbentia Systems S.A.\n00:1F:4B\t\tLineage Power\n00:1F:4C\t\tRoseman Engineering Ltd\n00:1F:4D\t\tSegnetics LLC\n00:1F:4E\t\tConMed Linvatec\n00:1F:4F\t\tThinkware Co. Ltd.\n00:1F:50\t\tSwissdis AG\n00:1F:51\t\tHD Communications Corp\n00:1F:52\t\tUVT Unternehmensberatung fur Verkehr und Technik GmbH\n00:1F:53\t\tGEMAC Chemnitz GmbH\n00:1F:54\t\tLorex Technology Inc.\n00:1F:55\t\tHoneywell Security (China) Co., Ltd.\n00:1F:56\t\tDigital Forecast\n00:1F:57\t\tPhonik Innovation Co.,LTD\n00:1F:58\t\tEMH Energiemesstechnik GmbH\n00:1F:59\t\tKronback Tracers\n00:1F:5A\t\tBeckwith Electric Co.\n00:1F:5B\t\tApple, Inc.\n00:1F:5C\t\tNokia Danmark A/S\n00:1F:5D\t\tNokia Danmark A/S\n00:1F:5E\t\tDyna Technology Co.,Ltd.\n00:1F:5F\t\tBlatand GmbH\n00:1F:60\t\tCompass Systems Corp.\n00:1F:61\t\tTalent Communication Networks Inc.\n00:1F:62\t\tJSC \"Stilsoft\"\n00:1F:63\t\tJSC Goodwin-Europa\n00:1F:64\t\tBeijing Autelan Technology Inc.\n00:1F:65\t\tKorea Electric Terminal Co., Ltd.\n00:1F:66\t\tPlanar Llc\n00:1F:67\t\tHitachi,Ltd.\n00:1F:68\t\tMartinsson Elektronik AB\n00:1F:69\t\tPingood Technology Co., Ltd.\n00:1F:6A\t\tPacketFlux Technologies, Inc.\n00:1F:6B\t\tLG Electronics (Mobile Communications)\n00:1F:6C\t\tCisco Systems, Inc\n00:1F:6D\t\tCisco Systems, Inc\n00:1F:6E\t\tVtech Engineering Corporation\n00:1F:6F\t\tFujian Sunnada Communication Co.,Ltd.\n00:1F:70\t\tBotik Technologies LTD\n00:1F:71\t\txG Technology, Inc.\n00:1F:72\t\tQingDao Hiphone Technology Co,.Ltd\n00:1F:73\t\tTeraview Technology Co., Ltd.\n00:1F:74\t\tEigen Development\n00:1F:75\t\tGiBahn Media\n00:1F:76\t\tAirLogic Systems Inc.\n00:1F:77\t\tHeol Design\n00:1F:78\t\tBlue Fox Porini Textile\n00:1F:79\t\tLodam Electronics A/S\n00:1F:7A\t\tWiWide Inc.\n00:1F:7B\t\tTechNexion Ltd.\n00:1F:7C\t\tWitelcom AS\n00:1F:7D\t\tEmbedded Wireless GmbH\n00:1F:7E\t\tCommscope\n00:1F:7F\t\tPhabrix Limited\n00:1F:80\t\tLucas Holding bv\n00:1F:81\t\tAccel Semiconductor Corp\n00:1F:82\t\tCal-Comp Electronics & Communications Company Ltd.\n00:1F:83\t\tTeleplan Technology Services Sdn Bhd\n00:1F:84\t\tGigle Semiconductor\n00:1F:85\t\tApriva ISS, LLC\n00:1F:86\t\tdigEcor\n00:1F:87\t\tSkydigital Inc.\n00:1F:88\t\tFMS Force Measuring Systems AG\n00:1F:89\t\tSignalion GmbH\n00:1F:8A\t\tEllion Digital Inc.\n00:1F:8B\t\tCache IQ\n00:1F:8C\t\tCCS Inc.\n00:1F:8D\t\tIngenieurbuero Stark GmbH und Ko. KG\n00:1F:8E\t\tMetris USA Inc.\n00:1F:8F\t\tShanghai Bellmann Digital Source Co.,Ltd.\n00:1F:90\t\tActiontec Electronics, Inc\n00:1F:91\t\tDBS Lodging Technologies, LLC\n00:1F:92\t\tMotorola Solutions Inc.\n00:1F:93\t\tXiotech Corporation\n00:1F:94\t\tLascar Electronics Ltd\n00:1F:95\t\tSagemcom Broadband SAS\n00:1F:96\t\tAprotech Co.Ltd\n00:1F:97\t\tBERTANA srl\n00:1F:98\t\tDaiichi-Dentsu Ltd.\n00:1F:99\t\tSERONICS co.ltd\n00:1F:9A\t\tNortel Networks\n00:1F:9B\t\tPosbro\n00:1F:9C\t\tHavis Inc.\n00:1F:9D\t\tCisco Systems, Inc\n00:1F:9E\t\tCisco Systems, Inc\n00:1F:9F\t\tThomson Telecom Belgium\n00:1F:A0\t\tA10 Networks\n00:1F:A1\t\tGtran Inc\n00:1F:A2\t\tDatron World Communications, Inc.\n00:1F:A3\t\tT&W Electronics(Shenzhen)Co.,Ltd.\n00:1F:A4\t\tShenzhen Gongjin Electronics Co.,Lt\n00:1F:A5\t\tBlue-White Industries\n00:1F:A6\t\tStilo srl\n00:1F:A7\t\tSony Interactive Entertainment Inc.\n00:1F:A8\t\tSmart Energy Instruments Inc.\n00:1F:A9\t\tAtlanta DTH, Inc.\n00:1F:AA\t\tTaseon, Inc.\n00:1F:AB\t\tI.S High Tech.Inc\n00:1F:AC\t\tGoodmill Systems Ltd\n00:1F:AD\t\tBrown Innovations, Inc\n00:1F:AE\t\tBlick South Africa (Pty) Ltd\n00:1F:AF\t\tNextIO, Inc.\n00:1F:B0\t\tTimeIPS, Inc.\n00:1F:B1\t\tCybertech Inc.\n00:1F:B2\t\tSontheim Industrie Elektronik GmbH\n00:1F:B3\t\t2Wire Inc\n00:1F:B4\t\tSmartShare Systems\n00:1F:B5\t\tI/O Interconnect Inc.\n00:1F:B6\t\tChi Lin Technology Co., Ltd.\n00:1F:B7\t\tWiMate Technologies Corp.\n00:1F:B8\t\tUniversal Remote Control, Inc.\n00:1F:B9\t\tPaltronics\n00:1F:BA\t\tBoyoung Tech\n00:1F:BB\t\tXenatech Co.,LTD\n00:1F:BC\t\tEVGA Corporation\n00:1F:BD\t\tKyocera Wireless Corp.\n00:1F:BE\t\tShenzhen Mopnet Industrial Co.,Ltd\n00:1F:BF\t\tFulhua Microelectronics Corp. Taiwan Branch\n00:1F:C0\t\tControl Express Finland Oy\n00:1F:C1\t\tHanlong Technology Co.,LTD\n00:1F:C2\t\tJow Tong Technology Co Ltd\n00:1F:C3\t\tSmartSynch, Inc\n00:1F:C4\t\tCommscope\n00:1F:C5\t\tNintendo Co., Ltd.\n00:1F:C6\t\tASUSTek COMPUTER INC.\n00:1F:C7\t\tCasio Hitachi Mobile Communications Co., Ltd.\n00:1F:C8\t\tUp-Today Industrial Co., Ltd.\n00:1F:C9\t\tCisco Systems, Inc\n00:1F:CA\t\tCisco Systems, Inc\n00:1F:CB\t\tNIW Solutions\n00:1F:CC\t\tSamsung Electronics Co.,Ltd\n00:1F:CD\t\tSamsung Electronics Co.,Ltd\n00:1F:CE\t\tQtech Llc\n00:1F:CF\t\tMSI Technology GmbH\n00:1F:D0\t\tGiga-Byte Technology Co.,Ltd.\n00:1F:D1\t\tOptex Co.,Ltd.\n00:1F:D2\t\tCommtech Technology Macao Commercial Offshore Ltd.\n00:1F:D3\t\tRIVA Networks Inc.\n00:1F:D4\t\t4Ipnet, Inc.\n00:1F:D5\t\tMICRORISC s.r.o.\n00:1F:D6\t\tShenzhen Allywll\n00:1F:D7\t\tTelerad Sa\n00:1F:D8\t\tA-Trust Computer Corporation\n00:1F:D9\t\tRSD Communications Ltd\n00:1F:DA\t\tNortel Networks\n00:1F:DB\t\tNetwork Supply Corp.,\n00:1F:DC\t\tMobile Safe Track Ltd\n00:1F:DD\t\tGdi Llc\n00:1F:DE\t\tNokia Danmark A/S\n00:1F:DF\t\tNokia Danmark A/S\n00:1F:E0\t\tEdgeVelocity Corp\n00:1F:E1\t\tHon Hai Precision Ind. Co.,Ltd.\n00:1F:E2\t\tHon Hai Precision Ind. Co.,Ltd.\n00:1F:E3\t\tLG Electronics (Mobile Communications)\n00:1F:E4\t\tSony Corporation\n00:1F:E5\t\tIn-Circuit GmbH\n00:1F:E6\t\tAlphion Corporation\n00:1F:E7\t\tSimet\n00:1F:E8\t\tKURUSUGAWA Electronics Industry Inc,.\n00:1F:E9\t\tPrintrex, Inc.\n00:1F:EA\t\tApplied Media Technologies Corporation\n00:1F:EB\t\tTrio Datacom Pty Ltd\n00:1F:EC\t\tSynapse Électronique\n00:1F:ED\t\tTecan Systems Inc.\n00:1F:EE\t\tubisys technologies GmbH\n00:1F:EF\t\tShinsei Industries Co.,Ltd\n00:1F:F0\t\tAudio Partnership\n00:1F:F1\t\tParadox Hellas S.A.\n00:1F:F2\t\tVIA Technologies, Inc.\n00:1F:F3\t\tApple, Inc.\n00:1F:F4\t\tPower Monitors, Inc.\n00:1F:F5\t\tKongsberg Defence & Aerospace\n00:1F:F6\t\tPS Audio International\n00:1F:F7\t\tNakajima All Precision Co., Ltd.\n00:1F:F8\t\tSiemens AG, Sector Industry, Drive Technologies, Motion Control Systems\n00:1F:F9\t\tAdvanced Knowledge Associates\n00:1F:FA\t\tCoretree, Co, Ltd\n00:1F:FB\t\tGreen Packet Bhd\n00:1F:FC\t\tRiccius+Sohn GmbH\n00:1F:FD\t\tIndigo Mobile Technologies Corp.\n00:1F:FE\t\tHPN Supply Chain\n00:1F:FF\t\tRespironics, Inc.\n00:20:00\t\tLexmark International, Inc.\n00:20:01\t\tDsp Solutions, Inc.\n00:20:02\t\tSeritech Enterprise Co., Ltd.\n00:20:03\t\tPixel Power Ltd.\n00:20:04\t\tYamatake-Honeywell Co., Ltd.\n00:20:05\t\tSimple Technology\n00:20:06\t\tGarrett Communications, Inc.\n00:20:07\t\tSfa, Inc.\n00:20:08\t\tCable & Computer Technology\n00:20:09\t\tPackard Bell Elec., Inc.\n00:20:0A\t\tSource-Comm Corp.\n00:20:0B\t\tOctagon Systems Corp.\n00:20:0C\t\tAdastra Systems Corp.\n00:20:0D\t\tCarl Zeiss\n00:20:0E\t\tNSSLGlobal Technologies AS\n00:20:0F\t\tEBRAINS Inc\n00:20:10\t\tJeol System Technology Co. Ltd\n00:20:11\t\tCanopus Co., Ltd.\n00:20:12\t\tCamtronics Medical Systems\n00:20:13\t\tDiversified Technology, Inc.\n00:20:14\t\tGlobal View Co., Ltd.\n00:20:15\t\tActis Computer Sa\n00:20:16\t\tShowa Electric Wire & Cable Co\n00:20:17\t\tOrbotech\n00:20:18\t\tCis Technology Inc.\n00:20:19\t\tOhler Gmbh\n00:20:1A\t\tMRV Communications, Inc.\n00:20:1B\t\tNorthern Telecom/Network\n00:20:1C\t\tExcel, Inc.\n00:20:1D\t\tKatana Products\n00:20:1E\t\tNetquest Corporation\n00:20:1F\t\tBest Power Technology, Inc.\n00:20:20\t\tMegatron Computer Industries Pty, Ltd.\n00:20:21\t\tAlgorithms Software Pvt. Ltd.\n00:20:22\t\tNMS Communications\n00:20:23\t\tT.C. Technologies Pty. Ltd\n00:20:24\t\tPacific Communication Sciences\n00:20:25\t\tControl Technology, Inc.\n00:20:26\t\tAmkly Systems, Inc.\n00:20:27\t\tMing Fortune Industry Co., Ltd\n00:20:28\t\tWest Egg Systems, Inc.\n00:20:29\t\tTeleprocessing Products, Inc.\n00:20:2A\t\tN.V. Dzine\n00:20:2B\t\tAdvanced Telecommunications Modules, Ltd.\n00:20:2C\t\tWelltronix Co., Ltd.\n00:20:2D\t\tTaiyo Corporation\n00:20:2E\t\tDaystar Digital\n00:20:2F\t\tZeta Communications, Ltd.\n00:20:30\t\tAnalog & Digital Systems\n00:20:31\t\tTattile SRL\n00:20:32\t\tAlcatel Taisel\n00:20:33\t\tSynapse Technologies, Inc.\n00:20:34\t\tRotec Industrieautomation Gmbh\n00:20:35\t\tIBM Corp\n00:20:36\t\tBmc Software\n00:20:37\t\tSeagate Technology\n00:20:38\t\tVme Microsystems International Corporation\n00:20:39\t\tScinets\n00:20:3A\t\tDigital Bi0Metrics Inc.\n00:20:3B\t\tWisdm Ltd.\n00:20:3C\t\tEurotime Ab\n00:20:3D\t\tHoneywell Environmental & Combustion Controls\n00:20:3E\t\tLogiCan Technologies, Inc.\n00:20:3F\t\tJuki Corporation\n00:20:40\t\tCommscope\n00:20:41\t\tData Net\n00:20:42\t\tDatametrics Corp.\n00:20:43\t\tNeuron Company Limited\n00:20:44\t\tGenitech Pty Ltd\n00:20:45\t\tION Networks, Inc.\n00:20:46\t\tCiprico, Inc.\n00:20:47\t\tSteinbrecher Corp.\n00:20:48\t\tMarconi Communications\n00:20:49\t\tComtron, Inc.\n00:20:4A\t\tPronet Gmbh\n00:20:4B\t\tAutocomputer Co., Ltd.\n00:20:4C\t\tMitron Computer Pte Ltd.\n00:20:4D\t\tInovis Gmbh\n00:20:4E\t\tNetwork Security Systems, Inc.\n00:20:4F\t\tDeutsche Aerospace Ag\n00:20:50\t\tKorea Computer Inc.\n00:20:51\t\tVerilink Corporation\n00:20:52\t\tRagula Systems\n00:20:53\t\tHuntsville Microsystems, Inc.\n00:20:54\t\tSycamore Networks\n00:20:55\t\tAltech Co., Ltd.\n00:20:56\t\tNeoproducts\n00:20:57\t\tTITZE DATENTECHNIK GmbH\n00:20:58\t\tAllied Signal Inc.\n00:20:59\t\tMiro Computer Products Ag\n00:20:5A\t\tComputer Identics\n00:20:5B\t\tKentrox, LLC\n00:20:5C\t\tInterNet Systems of Florida, Inc.\n00:20:5D\t\tNanomatic Oy\n00:20:5E\t\tCastle Rock, Inc.\n00:20:5F\t\tGammadata Computer Gmbh\n00:20:60\t\tALCATEL ITALIA S.p.A.\n00:20:61\t\tGarrettCom, Inc.\n00:20:62\t\tScorpion Logic, Ltd.\n00:20:63\t\tWipro Infotech Ltd.\n00:20:64\t\tProtec Microsystems, Inc.\n00:20:65\t\tSupernet Networking Inc.\n00:20:66\t\tGeneral Magic, Inc.\n00:20:67\t\tPrivate\n00:20:68\t\tIsdyne\n00:20:69\t\tIsdn Systems Corporation\n00:20:6A\t\tOsaka Computer Corp.\n00:20:6B\t\tKonica Minolta Holdings, Inc.\n00:20:6C\t\tEvergreen Technology Corp.\n00:20:6D\t\tData Race, Inc.\n00:20:6E\t\tXact, Inc.\n00:20:6F\t\tFlowpoint Corporation\n00:20:70\t\tHynet, Ltd.\n00:20:71\t\tIbr Gmbh\n00:20:72\t\tWorklink Innovations\n00:20:73\t\tFusion Systems Corporation\n00:20:74\t\tSungwoon Systems\n00:20:75\t\tMotorola Communication Israel\n00:20:76\t\tReudo Corporation\n00:20:77\t\tKardios Systems Corp.\n00:20:78\t\tRuntop, Inc.\n00:20:79\t\tMikron Gmbh\n00:20:7A\t\tWiSE Communications, Inc.\n00:20:7B\t\tIntel Corporation\n00:20:7C\t\tAutec Gmbh\n00:20:7D\t\tAdvanced Computer Applications\n00:20:7E\t\tFinecom Co., Ltd.\n00:20:7F\t\tKyoei Sangyo Co., Ltd.\n00:20:80\t\tSynergy (Uk) Ltd.\n00:20:81\t\tTitan Electronics\n00:20:82\t\tOneac Corporation\n00:20:83\t\tPresticom Incorporated\n00:20:84\t\tOce Printing Systems, Gmbh\n00:20:85\t\tEaton Corporation\n00:20:86\t\tMicrotech Electronics Limited\n00:20:87\t\tMemotec, Inc.\n00:20:88\t\tGlobal Village Communication\n00:20:89\t\tT3Plus Networking, Inc.\n00:20:8A\t\tSonix Communications, Ltd.\n00:20:8B\t\tLapis Technologies, Inc.\n00:20:8C\t\tGalaxy Networks, Inc.\n00:20:8D\t\tCmd Technology\n00:20:8E\t\tChevin Software Eng. Ltd.\n00:20:8F\t\tECI Telecom Ltd.\n00:20:90\t\tAdvanced Compression Technology, Inc.\n00:20:91\t\tJ125, National Security Agency\n00:20:92\t\tChess Engineering B.V.\n00:20:93\t\tLandings Technology Corp.\n00:20:94\t\tCubix Corporation\n00:20:95\t\tRiva Electronics\n00:20:96\t\tInvensys\n00:20:97\t\tApplied Signal Technology\n00:20:98\t\tHectronic Ab\n00:20:99\t\tBon Electric Co., Ltd.\n00:20:9A\t\tThe 3Do Company\n00:20:9B\t\tErsat Electronic Gmbh\n00:20:9C\t\tPrimary Access Corp.\n00:20:9D\t\tLippert Automationstechnik\n00:20:9E\t\tBrown'S Operating System Services, Ltd.\n00:20:9F\t\tMercury Computer Systems, Inc.\n00:20:A0\t\tOa Laboratory Co., Ltd.\n00:20:A1\t\tDovatron\n00:20:A2\t\tGalcom Networking Ltd.\n00:20:A3\t\tHarmonic, Inc\n00:20:A4\t\tMultipoint Networks\n00:20:A5\t\tApi Engineering\n00:20:A6\t\tProxim Wireless\n00:20:A7\t\tPairgain Technologies, Inc.\n00:20:A8\t\tSast Technology Corp.\n00:20:A9\t\tWhite Horse Industrial\n00:20:AA\t\tEricsson Television Limited\n00:20:AB\t\tMicro Industries Corp.\n00:20:AC\t\tInterflex Datensysteme Gmbh\n00:20:AD\t\tLinq Systems\n00:20:AE\t\tOrnet Data Communication Tech.\n00:20:AF\t\t3Com\n00:20:B0\t\tGateway Devices, Inc.\n00:20:B1\t\tComtech Research Inc.\n00:20:B2\t\tGKD Gesellschaft Fur Kommunikation Und Datentechnik\n00:20:B3\t\tTattile SRL\n00:20:B4\t\tTerma Elektronik As\n00:20:B5\t\tYaskawa Electric Corporation\n00:20:B6\t\tAgile Networks, Inc.\n00:20:B7\t\tNamaqua Computerware\n00:20:B8\t\tPrime Option, Inc.\n00:20:B9\t\tMetricom, Inc.\n00:20:BA\t\tCenter For High Performance\n00:20:BB\t\tZax Corporation\n00:20:BC\t\tLong Reach Networks Pty Ltd\n00:20:BD\t\tNiobrara R & D Corporation\n00:20:BE\t\tLan Access Corp.\n00:20:BF\t\tAehr Test Systems\n00:20:C0\t\tPulse Electronics, Inc.\n00:20:C1\t\tSAXA, Inc.\n00:20:C2\t\tTexas Memory Systems, Inc.\n00:20:C3\t\tCounter Solutions Ltd.\n00:20:C4\t\tInet,Inc.\n00:20:C5\t\tEagle Technology\n00:20:C6\t\tNectec\n00:20:C7\t\tAKAI Professional M.I. Corp.\n00:20:C8\t\tLarscom Incorporated\n00:20:C9\t\tVictron Bv\n00:20:CA\t\tDigital Ocean\n00:20:CB\t\tPretec Electronics Corp.\n00:20:CC\t\tDigital Services, Ltd.\n00:20:CD\t\tHybrid Networks, Inc.\n00:20:CE\t\tLogical Design Group, Inc.\n00:20:CF\t\tTest & Measurement Systems Inc\n00:20:D0\t\tVersalynx Corporation\n00:20:D1\t\tMicrocomputer Systems (M) Sdn.\n00:20:D2\t\tRad Data Communications, Ltd.\n00:20:D3\t\tOst (Ouest Standard Telematiqu\n00:20:D4\t\tCabletron Systems, Inc.\n00:20:D5\t\tVipa Gmbh\n00:20:D6\t\tBreezecom, Ltd.\n00:20:D7\t\tJAPAN MINICOMPUTER SYSTEMS CO., Ltd.\n00:20:D8\t\tNortel Networks\n00:20:D9\t\tPanasonic Technologies, Inc./Mieco-Us\n00:20:DA\t\tAlcatel-Lucent Enterprise\n00:20:DB\t\tXnet Technology, Inc.\n00:20:DC\t\tDensitron Taiwan Ltd.\n00:20:DD\t\tCybertec Pty Ltd\n00:20:DE\t\tJapan Digital Laborat'Y Co.Ltd\n00:20:DF\t\tKyosan Electric Mfg. Co., Ltd.\n00:20:E0\t\tActiontec Electronics, Inc\n00:20:E1\t\tAlamar Electronics\n00:20:E2\t\tInformation Resource Engineering\n00:20:E3\t\tMcd Kencom Corporation\n00:20:E4\t\tHsing Tech Enterprise Co., Ltd\n00:20:E5\t\tApex Data, Inc.\n00:20:E6\t\tLidkoping Machine Tools Ab\n00:20:E7\t\tB&W Nuclear Service Company\n00:20:E8\t\tDatatrek Corporation\n00:20:E9\t\tDantel\n00:20:EA\t\tEfficient Networks, Inc.\n00:20:EB\t\tCincinnati Microwave, Inc.\n00:20:EC\t\tTechware Systems Corp.\n00:20:ED\t\tGiga-Byte Technology Co., Ltd.\n00:20:EE\t\tGtech Corporation\n00:20:EF\t\tUsc Corporation\n00:20:F0\t\tUniversal Microelectronics Co.\n00:20:F1\t\tAltos India Limited\n00:20:F2\t\tOracle Corporation\n00:20:F3\t\tRaynet Corporation\n00:20:F4\t\tSpectrix Corporation\n00:20:F5\t\tPandatel Ag\n00:20:F6\t\tNet Tek  And Karlnet, Inc.\n00:20:F7\t\tCyberdata Corporation\n00:20:F8\t\tCarrera Computers, Inc.\n00:20:F9\t\tParalink Networks, Inc.\n00:20:FA\t\tGde Systems, Inc.\n00:20:FB\t\tOctel Communications Corp.\n00:20:FC\t\tMatrox Central Services Inc\n00:20:FD\t\tItv Technologies, Inc.\n00:20:FE\t\tTopware Inc. / Grand Computer\n00:20:FF\t\tSymmetrical Technologies\n00:21:00\t\tGemtek Technology Co., Ltd.\n00:21:01\t\tAplicaciones Electronicas Quasar (AEQ)\n00:21:02\t\tUpdateLogic Inc.\n00:21:03\t\tGHI Electronics, LLC\n00:21:04\t\tGigaset Communications GmbH\n00:21:05\t\tAlcatel-Lucent IPD\n00:21:06\t\tRIM Testing Services\n00:21:07\t\tSeowonintech Co Ltd.\n00:21:08\t\tNokia Danmark A/S\n00:21:09\t\tNokia Danmark A/S\n00:21:0A\t\tbyd:sign Corporation\n00:21:0B\t\tGemini Traze Rfid Pvt. Ltd.\n00:21:0C\t\tCymtec Systems, Inc.\n00:21:0D\t\tSamsin Innotec\n00:21:0E\t\tGilbarco Inc.\n00:21:0F\t\tCernium Corp\n00:21:10\t\tClearbox Systems\n00:21:11\t\tUniphone Inc.\n00:21:12\t\tWiscom System Co.,Ltd\n00:21:13\t\tPadtec S/A\n00:21:14\t\tHylab Technology Inc.\n00:21:15\t\tPHYWE Systeme GmbH & Co. KG\n00:21:16\t\tTranscon Electronic Systems, spol. s r. o.\n00:21:17\t\tTellord\n00:21:18\t\tAthena Tech, Inc.\n00:21:19\t\tSamsung Electro Mechanics Co., Ltd.\n00:21:1A\t\tLInTech Corporation\n00:21:1B\t\tCisco Systems, Inc\n00:21:1C\t\tCisco Systems, Inc\n00:21:1D\t\tDataline AB\n00:21:1E\t\tCommscope\n00:21:1F\t\tShinsung Deltatech Co.,Ltd.\n00:21:20\t\tSequel Technologies\n00:21:21\t\tVRmagic GmbH\n00:21:22\t\tChip-pro Ltd.\n00:21:23\t\tAerosat Avionics\n00:21:24\t\tOptos Plc\n00:21:25\t\tKUK JE TONG SHIN Co.,LTD\n00:21:26\t\tShenzhen Torch Equipment Co., Ltd.\n00:21:27\t\tTp-Link Technologies Co.,Ltd.\n00:21:28\t\tOracle Corporation\n00:21:29\t\tCisco-Linksys, LLC\n00:21:2A\t\tAudiovox Corporation\n00:21:2B\t\tMSA Auer\n00:21:2C\t\tSemIndia System Private Limited\n00:21:2D\t\tScimolex Corporation\n00:21:2E\t\tdresden-elektronik\n00:21:2F\t\tPhoebe Micro Inc.\n00:21:30\t\tKeico Hightech Inc.\n00:21:31\t\tBlynke Inc.\n00:21:32\t\tMasterclock, Inc.\n00:21:33\t\tBuilding B, Inc\n00:21:34\t\tBrandywine Communications\n00:21:35\t\tAlcatel-Lucent\n00:21:36\t\tCommscope\n00:21:37\t\tBay Controls, LLC\n00:21:38\t\tCepheid\n00:21:39\t\tEscherlogic Inc.\n00:21:3A\t\tWinchester Systems Inc.\n00:21:3B\t\tBerkshire Products, Inc\n00:21:3C\t\tAliphCom\n00:21:3D\t\tCermetek Microelectronics, Inc.\n00:21:3E\t\tTomTom International BV\n00:21:3F\t\tA-Team Technology Ltd.\n00:21:40\t\tEN Technologies Inc.\n00:21:41\t\tRadlive\n00:21:42\t\tAdvanced Control Systems doo\n00:21:43\t\tCommscope\n00:21:44\t\tSS Telecoms\n00:21:45\t\tSemptian Technologies Ltd.\n00:21:46\t\tSanmina-SCI\n00:21:47\t\tNintendo Co., Ltd.\n00:21:48\t\tKaco Solar Korea\n00:21:49\t\tChina Daheng Group ,Inc.\n00:21:4A\t\tPixel Velocity, Inc\n00:21:4B\t\tShenzhen HAMP Science & Technology Co.,Ltd\n00:21:4C\t\tSamsung Electronics Co.,Ltd\n00:21:4D\t\tGuangzhou Skytone Transmission Technology Com. Ltd.\n00:21:4E\t\tGS Yuasa Power Supply Ltd.\n00:21:4F\t\tAlpsalpine Co,.Ltd\n00:21:50\t\tEyeview Electronics\n00:21:51\t\tMillinet Co., Ltd.\n00:21:52\t\tGeneral Satellite Research & Development Limited\n00:21:53\t\tSeaMicro Inc.\n00:21:54\t\tD-TACQ Solutions Ltd\n00:21:55\t\tCisco Systems, Inc\n00:21:56\t\tCisco Systems, Inc\n00:21:57\t\tNational Datacast, Inc.\n00:21:58\t\tStyle Flying Technology Co.\n00:21:59\t\tJuniper Networks\n00:21:5A\t\tHewlett Packard\n00:21:5B\t\tSenseAnywhere\n00:21:5C\t\tIntel Corporate\n00:21:5D\t\tIntel Corporate\n00:21:5E\t\tIBM Corp\n00:21:5F\t\tIHSE GmbH\n00:21:60\t\tHidea Solutions Co. Ltd.\n00:21:61\t\tYournet Inc.\n00:21:62\t\tNortel Networks\n00:21:63\t\tAskey Computer Corp\n00:21:64\t\tSpecial Design Bureau for Seismic Instrumentation\n00:21:65\t\tPresstek Inc.\n00:21:66\t\tNovAtel Inc.\n00:21:67\t\tHWA JIN T&I Corp.\n00:21:68\t\tiVeia, LLC\n00:21:69\t\tPrologix, LLC.\n00:21:6A\t\tIntel Corporate\n00:21:6B\t\tIntel Corporate\n00:21:6C\t\tOdva\n00:21:6D\t\tSoltech Co., Ltd.\n00:21:6E\t\tFunction ATI (Huizhou) Telecommunications Co., Ltd.\n00:21:6F\t\tSymCom, Inc.\n00:21:70\t\tDell Inc.\n00:21:71\t\tWesung TNC Co., Ltd.\n00:21:72\t\tSeoultek Valley\n00:21:73\t\tIon Torrent Systems, Inc.\n00:21:74\t\tAvaLAN Wireless\n00:21:75\t\tPacific Satellite International Ltd.\n00:21:76\t\tYMax Telecom Ltd.\n00:21:77\t\tW. L. Gore & Associates\n00:21:78\t\tMatuschek Messtechnik GmbH\n00:21:79\t\tIOGEAR, Inc.\n00:21:7A\t\tSejin Electron, Inc.\n00:21:7B\t\tBastec AB\n00:21:7C\t\t2Wire Inc\n00:21:7D\t\tPyxis S.R.L.\n00:21:7E\t\tTelit Communication s.p.a\n00:21:7F\t\tIntraco Technology Pte Ltd\n00:21:80\t\tCommscope\n00:21:81\t\tSi2 Microsystems Limited\n00:21:82\t\tSandLinks Systems, Ltd.\n00:21:83\t\tANDRITZ HYDRO GmbH\n00:21:84\t\tPowersoft Srl\n00:21:85\t\tMicro-Star Int'L Co.,Ltd.\n00:21:86\t\tUniversal Global Scientific Industrial Co., Ltd.\n00:21:87\t\tImacs GmbH\n00:21:88\t\tEMC Corporation\n00:21:89\t\tAppTech, Inc.\n00:21:8A\t\tElectronic Design and Manufacturing Company\n00:21:8B\t\tWescon Technology, Inc.\n00:21:8C\t\tTopControl GMBH\n00:21:8D\t\tAP Router Ind. Eletronica LTDA\n00:21:8E\t\tMekics Co., Ltd.\n00:21:8F\t\tAvantgarde Acoustic Lautsprechersysteme GmbH\n00:21:90\t\tGoliath Solutions\n00:21:91\t\tD-Link Corporation\n00:21:92\t\tBaoding Galaxy Electronic Technology  Co.,Ltd\n00:21:93\t\tVideofon MV\n00:21:94\t\tPing Communication\n00:21:95\t\tGWD Media Limited\n00:21:96\t\tTelsey  S.p.A.\n00:21:97\t\tElitegroup Computer Systems Co.,Ltd.\n00:21:98\t\tThai Radio Co, LTD\n00:21:99\t\tVacon Plc\n00:21:9A\t\tCambridge Visual Networks Ltd\n00:21:9B\t\tDell Inc.\n00:21:9C\t\tHoneywld Technology Corp.\n00:21:9D\t\tAdesys BV\n00:21:9E\t\tSony Corporation\n00:21:9F\t\tSatel Oy\n00:21:A0\t\tCisco Systems, Inc\n00:21:A1\t\tCisco Systems, Inc\n00:21:A2\t\tEKE-Electronics Ltd.\n00:21:A3\t\tMicromint\n00:21:A4\t\tDbii Networks\n00:21:A5\t\tERLPhase Power Technologies Ltd.\n00:21:A6\t\tVideotec Spa\n00:21:A7\t\tHantle System Co., Ltd.\n00:21:A8\t\tTelephonics Corporation\n00:21:A9\t\tMobilink Telecom Co.,Ltd\n00:21:AA\t\tNokia Danmark A/S\n00:21:AB\t\tNokia Danmark A/S\n00:21:AC\t\tInfrared Integrated Systems Ltd\n00:21:AD\t\tNordic ID Oy\n00:21:AE\t\tAlcatel-Lucent France - Wtd\n00:21:AF\t\tRadio Frequency Systems\n00:21:B0\t\tTyco Telecommunications\n00:21:B1\t\tDigital Solutions Ltd\n00:21:B2\t\tFiberblaze A/S\n00:21:B3\t\tRoss Controls\n00:21:B4\t\tApro Media Co., Ltd\n00:21:B5\t\tGalvanic Ltd\n00:21:B6\t\tTriacta Power Technologies Inc.\n00:21:B7\t\tLexmark International, Inc.\n00:21:B8\t\tInphi Corporation\n00:21:B9\t\tUniversal Devices Inc.\n00:21:BA\t\tTexas Instruments\n00:21:BB\t\tRiken Keiki Co., Ltd.\n00:21:BC\t\tZala Computer\n00:21:BD\t\tNintendo Co., Ltd.\n00:21:BE\t\tCisco SPVTG\n00:21:BF\t\tHitachi High-Tech Control Systems Corporation\n00:21:C0\t\tMobile Appliance, Inc.\n00:21:C1\t\tABB Oy / Medium Voltage Products\n00:21:C2\t\tGL Communications Inc\n00:21:C3\t\tCORNELL Communications, Inc.\n00:21:C4\t\tConsilium AB\n00:21:C5\t\t3DSP Corp\n00:21:C6\t\tCSJ Global, Inc.\n00:21:C7\t\tRussound\n00:21:C8\t\tLOHUIS Networks\n00:21:C9\t\tWavecom Asia Pacific Limited\n00:21:CA\t\tART System Co., Ltd.\n00:21:CB\t\tSms Tecnologia Eletronica Ltda\n00:21:CC\t\tFlextronics International\n00:21:CD\t\tLiveTV\n00:21:CE\t\tNTC-Metrotek\n00:21:CF\t\tThe Crypto Group\n00:21:D0\t\tGlobal Display Solutions Spa\n00:21:D1\t\tSamsung Electronics Co.,Ltd\n00:21:D2\t\tSamsung Electronics Co.,Ltd\n00:21:D3\t\tBocom Security(Asia Pacific) Limited\n00:21:D4\t\tVollmer Werke GmbH\n00:21:D5\t\tX2E GmbH\n00:21:D6\t\tLXI Consortium\n00:21:D7\t\tCisco Systems, Inc\n00:21:D8\t\tCisco Systems, Inc\n00:21:D9\t\tSekonic Corporation\n00:21:DA\t\tAutomation Products Group Inc.\n00:21:DB\t\tSantachi Video Technology (Shenzhen) Co., Ltd.\n00:21:DC\t\tTECNOALARM S.r.l.\n00:21:DD\t\tNorthstar Systems Corp\n00:21:DE\t\tFirepro Wireless\n00:21:DF\t\tMartin Christ GmbH\n00:21:E0\t\tCommAgility Ltd\n00:21:E1\t\tNortel Networks\n00:21:E2\t\tvisago Systems & Controls GmbH & Co. KG\n00:21:E3\t\tSerialTek LLC\n00:21:E4\t\tI-Win\n00:21:E5\t\tDisplay Solution AG\n00:21:E6\t\tStarlight Video Limited\n00:21:E7\t\tInformatics Services Corporation\n00:21:E8\t\tMurata Manufacturing Co., Ltd.\n00:21:E9\t\tApple, Inc.\n00:21:EA\t\tBystronic Laser AG\n00:21:EB\t\tEsp Systems, Llc\n00:21:EC\t\tSolutronic GmbH\n00:21:ED\t\tTelegesis\n00:21:EE\t\tFull Spectrum Inc.\n00:21:EF\t\tKapsys\n00:21:F0\t\tEW3 Technologies LLC\n00:21:F1\t\tTutus Data AB\n00:21:F2\t\tEASY3CALL Technology Limited\n00:21:F3\t\tSi14 SpA\n00:21:F4\t\tINRange Systems, Inc\n00:21:F5\t\tWestern Engravers Supply, Inc.\n00:21:F6\t\tOracle Corporation\n00:21:F7\t\tHPN Supply Chain\n00:21:F8\t\tEnseo, Inc.\n00:21:F9\t\tWIRECOM Technologies\n00:21:FA\t\tA4SP Technologies Ltd.\n00:21:FB\t\tLG Electronics (Mobile Communications)\n00:21:FC\t\tNokia Danmark A/S\n00:21:FD\t\tLacroix Traffic S.A.U\n00:21:FE\t\tNokia Danmark A/S\n00:21:FF\t\tCyfrowy Polsat SA\n00:22:00\t\tIBM Corp\n00:22:01\t\tAksys Networks Inc\n00:22:02\t\tExcito Elektronik i Skåne AB\n00:22:03\t\tGlensound Electronics Ltd\n00:22:04\t\tKoratek\n00:22:05\t\tWeLink Solutions, Inc.\n00:22:06\t\tCyberdyne Inc.\n00:22:07\t\tInteno Broadband Technology AB\n00:22:08\t\tCerticom Corp\n00:22:09\t\tOmron Healthcare Co., Ltd\n00:22:0A\t\tOnLive, Inc\n00:22:0B\t\tNational Source Coding Center\n00:22:0C\t\tCisco Systems, Inc\n00:22:0D\t\tCisco Systems, Inc\n00:22:0E\t\tIndigo Security Co., Ltd.\n00:22:0F\t\tMoCA (Multimedia over Coax Alliance)\n00:22:10\t\tCommscope\n00:22:11\t\tRohati Systems\n00:22:12\t\tCAI Networks, Inc.\n00:22:13\t\tPci Corporation\n00:22:14\t\tRinnai Korea\n00:22:15\t\tASUSTek COMPUTER INC.\n00:22:16\t\tShibaura Vending Machine Corporation\n00:22:17\t\tNeat Electronics\n00:22:18\t\tAkamai Technologies Inc.\n00:22:19\t\tDell Inc.\n00:22:1A\t\tAudio Precision\n00:22:1B\t\tMorega Systems\n00:22:1C\t\tPrivate\n00:22:1D\t\tFreegene Technology LTD\n00:22:1E\t\tMedia Devices Co., Ltd.\n00:22:1F\t\teSang Technologies Co., Ltd.\n00:22:20\t\tMitac Technology Corp\n00:22:21\t\tItoh Denki Co,Ltd.\n00:22:22\t\tSchaffner Deutschland GmbH\n00:22:23\t\tTimeKeeping Systems, Inc.\n00:22:24\t\tGood Will Instrument Co., Ltd.\n00:22:25\t\tThales Avionics Ltd\n00:22:26\t\tAvaak, Inc.\n00:22:27\t\tuv-electronic GmbH\n00:22:28\t\tBreeze Innovations Ltd.\n00:22:29\t\tCompumedics Ltd\n00:22:2A\t\tSoundEar A/S\n00:22:2B\t\tNucomm, Inc.\n00:22:2C\t\tCeton Corp\n00:22:2D\t\tSMC Networks Inc.\n00:22:2E\t\tmaintech GmbH\n00:22:2F\t\tOpen Grid Computing, Inc.\n00:22:30\t\tFutureLogic Inc.\n00:22:31\t\tSMT&C Co., Ltd.\n00:22:32\t\tDesign Design Technology Ltd\n00:22:33\t\tADB Broadband Italia\n00:22:34\t\tCorventis Inc.\n00:22:35\t\tStrukton Systems bv\n00:22:36\t\tVector Sp. Z O.O.\n00:22:37\t\tShinhint Group\n00:22:38\t\tLogiplus\n00:22:39\t\tIndiana Life Sciences Incorporated\n00:22:3A\t\tCisco SPVTG\n00:22:3B\t\tCommunication Networks, LLC\n00:22:3C\t\tRATIO Entwicklungen GmbH\n00:22:3D\t\tJumpGen Systems, LLC\n00:22:3E\t\tIRTrans GmbH\n00:22:3F\t\tNetgear\n00:22:40\t\tUniversal Telecom S/A\n00:22:41\t\tApple, Inc.\n00:22:42\t\tAlacron Inc.\n00:22:43\t\tAzureWave Technology Inc.\n00:22:44\t\tChengdu Linkon Communications Device Co., Ltd\n00:22:45\t\tLeine & Linde AB\n00:22:46\t\tEvoc Intelligent Technology Co.,Ltd.\n00:22:47\t\tDac Engineering Co., Ltd.\n00:22:48\t\tMicrosoft Corporation\n00:22:49\t\tHome Multienergy Sl\n00:22:4A\t\tRaylase Ag\n00:22:4B\t\tAirtech Technologies, Inc.\n00:22:4C\t\tNintendo Co., Ltd.\n00:22:4D\t\tMitac International Corp.\n00:22:4E\t\tSEEnergy Corp.\n00:22:4F\t\tByzoro Networks Ltd.\n00:22:50\t\tPoint Six Wireless, LLC\n00:22:51\t\tLumasense Technologies\n00:22:52\t\tZOLL Lifecor Corporation\n00:22:53\t\tEntorian Technologies\n00:22:54\t\tBigelow Aerospace\n00:22:55\t\tCisco Systems, Inc\n00:22:56\t\tCisco Systems, Inc\n00:22:57\t\t3Com Europe Ltd\n00:22:58\t\tTaiyo Yuden Co., Ltd.\n00:22:59\t\tGuangzhou New Postcom Equipment Co.,Ltd.\n00:22:5A\t\tGarde Security AB\n00:22:5B\t\tTeradici Corporation\n00:22:5C\t\tMultimedia & Communication Technology\n00:22:5D\t\tDigicable Network India Pvt. Ltd.\n00:22:5E\t\tUwin Technologies Co.,LTD\n00:22:5F\t\tLiteon Technology Corporation\n00:22:60\t\tAFREEY Inc.\n00:22:61\t\tFrontier Silicon Ltd\n00:22:62\t\tBEP Marine\n00:22:63\t\tKoos Technical Services, Inc.\n00:22:64\t\tHewlett Packard\n00:22:65\t\tNokia Danmark A/S\n00:22:66\t\tNokia Danmark A/S\n00:22:67\t\tNortel Networks\n00:22:68\t\tHon Hai Precision Ind. Co.,Ltd.\n00:22:69\t\tHon Hai Precision Ind. Co.,Ltd.\n00:22:6A\t\tHoneywell\n00:22:6B\t\tCisco-Linksys, LLC\n00:22:6C\t\tLinkSprite Technologies, Inc.\n00:22:6D\t\tShenzhen GIEC Electronics Co., Ltd.\n00:22:6E\t\tGowell Electronic Limited\n00:22:6F\t\t3onedata Technology Co. Ltd.\n00:22:70\t\tABK North America, LLC\n00:22:71\t\tJäger Computergesteuerte Meßtechnik GmbH.\n00:22:72\t\tAmerican Micro-Fuel Device Corp.\n00:22:73\t\tTechway\n00:22:74\t\tFamilyPhone AB\n00:22:75\t\tBelkin International Inc.\n00:22:76\t\tTriple EYE B.V.\n00:22:77\t\tNEC Australia Pty Ltd\n00:22:78\t\tShenzhen  Tongfang Multimedia  Technology Co.,Ltd.\n00:22:79\t\tNippon Conlux Co., Ltd.\n00:22:7A\t\tTelecom Design\n00:22:7B\t\tApogee Labs, Inc.\n00:22:7C\t\tWoori SMT Co.,ltd\n00:22:7D\t\tYe Data Inc.\n00:22:7E\t\tChengdu 30Kaitian Communication Industry Co.Ltd\n00:22:7F\t\tRuckus Wireless\n00:22:80\t\tA2B Electronics AB\n00:22:81\t\tDaintree Networks Pty\n00:22:82\t\t8086 Consultancy\n00:22:83\t\tJuniper Networks\n00:22:84\t\tDesay A&V Science And Technology Co.,Ltd\n00:22:85\t\tNomus Comm Systems\n00:22:86\t\tAstron\n00:22:87\t\tTitan Wireless LLC\n00:22:88\t\tSagrad, Inc.\n00:22:89\t\tVanderlande APC inc.\n00:22:8A\t\tTeratronik elektronische systeme gmbh\n00:22:8B\t\tKensington Computer Products Group\n00:22:8C\t\tPhoton Europe GmbH\n00:22:8D\t\tGBS Laboratories LLC\n00:22:8E\t\tTv-Numeric\n00:22:8F\t\tCnrs\n00:22:90\t\tCisco Systems, Inc\n00:22:91\t\tCisco Systems, Inc\n00:22:92\t\tCinetal\n00:22:93\t\tzte corporation\n00:22:94\t\tKyocera Corporation\n00:22:95\t\tSGM Technology for lighting spa\n00:22:96\t\tLinoWave Corporation\n00:22:97\t\tXMOS Semiconductor\n00:22:98\t\tSony Corporation\n00:22:99\t\tSeaMicro Inc.\n00:22:9A\t\tLastar, Inc.\n00:22:9B\t\tAverLogic Technologies, Inc.\n00:22:9C\t\tVerismo Networks Inc\n00:22:9D\t\tPyung-Hwa Ind.Co.,Ltd\n00:22:9E\t\tSocial Aid Research Co., Ltd.\n00:22:9F\t\tSensys Traffic AB\n00:22:A0\t\tAptiv Services Us, Llc\n00:22:A1\t\tHuawei Symantec Technologies Co.,Ltd.\n00:22:A2\t\tXtramus Technologies\n00:22:A3\t\tCalifornia Eastern Laboratories\n00:22:A4\t\t2Wire Inc\n00:22:A5\t\tTexas Instruments\n00:22:A6\t\tSony Computer Entertainment America\n00:22:A7\t\tTyco Electronics AMP GmbH\n00:22:A8\t\tOuman Oy\n00:22:A9\t\tLG Electronics (Mobile Communications)\n00:22:AA\t\tNintendo Co., Ltd.\n00:22:AB\t\tShenzhen Turbosight Technology Ltd\n00:22:AC\t\tHangzhou Siyuan Tech. Co., Ltd\n00:22:AD\t\tTelesis Technologies, Inc.\n00:22:AE\t\tMattel Inc.\n00:22:AF\t\tSafety Vision, LLC\n00:22:B0\t\tD-Link Corporation\n00:22:B1\t\tElbit Systems Ltd.\n00:22:B2\t\t4RF Communications Ltd\n00:22:B3\t\tSei S.p.A.\n00:22:B4\t\tCommscope\n00:22:B5\t\tNovita\n00:22:B6\t\tSuperflow Technologies Group\n00:22:B7\t\tGSS Grundig SAT-Systems GmbH\n00:22:B8\t\tNorcott\n00:22:B9\t\tAnalogix Seminconductor, Inc\n00:22:BA\t\tHUTH Elektronik Systeme GmbH\n00:22:BB\t\tbeyerdynamic GmbH & Co. KG\n00:22:BC\t\tJDSU France SAS\n00:22:BD\t\tCisco Systems, Inc\n00:22:BE\t\tCisco Systems, Inc\n00:22:BF\t\tSieAmp Group of Companies\n00:22:C0\t\tShenzhen Forcelink Electronic Co, Ltd\n00:22:C1\t\tActive Storage Inc.\n00:22:C2\t\tProview Eletrônica do Brasil LTDA\n00:22:C3\t\tZeeport Technology Inc.\n00:22:C4\t\tepro GmbH\n00:22:C5\t\tINFORSON Co,Ltd.\n00:22:C6\t\tSutus Inc\n00:22:C7\t\tSEGGER Microcontroller GmbH & Co. KG\n00:22:C8\t\tModuVision Technologies\n00:22:C9\t\tLenord, Bauer & Co GmbH\n00:22:CA\t\tAnviz Biometric Tech. Co., Ltd.\n00:22:CB\t\tIONODES Inc.\n00:22:CC\t\tSciLog, Inc.\n00:22:CD\t\tAred Technology Co., Ltd.\n00:22:CE\t\tCisco SPVTG\n00:22:CF\t\tPlanex Communications Inc.\n00:22:D0\t\tPolar Electro Oy\n00:22:D1\t\tAlbrecht Jung GmbH & Co. KG\n00:22:D2\t\tAll Earth Comércio de Eletrônicos LTDA.\n00:22:D3\t\tHub-Tech\n00:22:D4\t\tComWorth Co., Ltd.\n00:22:D5\t\tEaton Corp. Electrical Group Data Center Solutions - Pulizzi\n00:22:D6\t\tCypak AB\n00:22:D7\t\tNintendo Co., Ltd.\n00:22:D8\t\tShenzhen GST Security and Safety Technology Limited\n00:22:D9\t\tFortex Industrial Ltd.\n00:22:DA\t\tAnatek, Llc\n00:22:DB\t\tTranslogic Corporation\n00:22:DC\t\tVigil Health Solutions Inc.\n00:22:DD\t\tProtecta Electronics Ltd\n00:22:DE\t\tOPPO Digital, Inc.\n00:22:DF\t\tTAMUZ Monitors\n00:22:E0\t\tAtlantic Software Technologies S.r.L.\n00:22:E1\t\tZORT Labs, LLC.\n00:22:E2\t\tWABTEC Transit Division\n00:22:E3\t\tAmerigon\n00:22:E4\t\tApass Technology Co., Ltd.\n00:22:E5\t\tFisher-Rosemount Systems Inc.\n00:22:E6\t\tIntelligent Data\n00:22:E7\t\tWPS Parking Systems\n00:22:E8\t\tApplition Co., Ltd.\n00:22:E9\t\tProVision Communications\n00:22:EA\t\tRustelcom Inc.\n00:22:EB\t\tData Respons A/S\n00:22:EC\t\tIdealbt Technology Corporation\n00:22:ED\t\tTSI Power Corporation\n00:22:EE\t\tAlgo Communication Products Ltd\n00:22:EF\t\tiWDL Technologies\n00:22:F0\t\t3 Greens Aviation Limited\n00:22:F1\t\tPrivate\n00:22:F2\t\tSunPower Corp\n00:22:F3\t\tSHARP Corporation\n00:22:F4\t\tAMPAK Technology, Inc.\n00:22:F5\t\tAdvanced Realtime Tracking GmbH\n00:22:F6\t\tSyracuse Research Corporation\n00:22:F7\t\tConceptronic\n00:22:F8\t\tPIMA Electronic Systems Ltd.\n00:22:F9\t\tPollin Electronic GmbH\n00:22:FA\t\tIntel Corporate\n00:22:FB\t\tIntel Corporate\n00:22:FC\t\tNokia Danmark A/S\n00:22:FD\t\tNokia Danmark A/S\n00:22:FE\t\tAdvanced Illumination\n00:22:FF\t\tNivis Llc\n00:23:00\t\tCayee Computer Ltd.\n00:23:01\t\tWitron Technology Limited\n00:23:02\t\tCobalt Digital, Inc.\n00:23:03\t\tLITE-ON IT Corporation\n00:23:04\t\tCisco Systems, Inc\n00:23:05\t\tCisco Systems, Inc\n00:23:06\t\tAlpsalpine Co,.Ltd\n00:23:07\t\tFuture Innovation Tech Co.,Ltd\n00:23:08\t\tArcadyan Technology Corporation\n00:23:09\t\tJanam Technologies LLC\n00:23:0A\t\tARBURG GmbH & Co KG\n00:23:0B\t\tCommscope\n00:23:0C\t\tClover Electronics Co.,Ltd.\n00:23:0D\t\tNortel Networks\n00:23:0E\t\tGorba AG\n00:23:0F\t\tHirsch Electronics Corporation\n00:23:10\t\tLNC Technology Co., Ltd.\n00:23:11\t\tGloscom Co., Ltd.\n00:23:12\t\tApple, Inc.\n00:23:13\t\tQool Technologies Ltd.\n00:23:14\t\tIntel Corporate\n00:23:15\t\tIntel Corporate\n00:23:16\t\tKisan Electronics Co\n00:23:17\t\tLasercraft Inc\n00:23:18\t\tToshiba\n00:23:19\t\tSielox LLC\n00:23:1A\t\tITF Co., Ltd.\n00:23:1B\t\tDanaher Motion - Kollmorgen\n00:23:1C\t\tFourier Systems Ltd.\n00:23:1D\t\tDeltacom Electronics Ltd\n00:23:1E\t\tCezzer Multimedia Technologies\n00:23:1F\t\tGuangda Electronic & Telecommunication Technology Development Co., Ltd.\n00:23:20\t\tNicira Networks\n00:23:21\t\tAvitech International Corp\n00:23:22\t\tKISS Teknical Solutions, Inc.\n00:23:23\t\tZylin AS\n00:23:24\t\tG-Pro Computer\n00:23:25\t\tIOLAN Holding\n00:23:26\t\tFujitsu Limited\n00:23:27\t\tShouyo Electronics CO., LTD\n00:23:28\t\tAlcon Telecommunications Co., Ltd.\n00:23:29\t\tDDRdrive LLC\n00:23:2A\t\teonas IT-Beratung und -Entwicklung GmbH\n00:23:2B\t\tIrd A/S\n00:23:2C\t\tSenticare\n00:23:2D\t\tSandForce\n00:23:2E\t\tKedah Electronics Engineering, LLC\n00:23:2F\t\tAdvanced Card Systems Ltd.\n00:23:30\t\tDizipia, Inc.\n00:23:31\t\tNintendo Co., Ltd.\n00:23:32\t\tApple, Inc.\n00:23:33\t\tCisco Systems, Inc\n00:23:34\t\tCisco Systems, Inc\n00:23:35\t\tLinkflex Co.,Ltd\n00:23:36\t\tMETEL s.r.o.\n00:23:37\t\tGlobal Star Solutions ULC\n00:23:38\t\tOJ-Electronics A/S\n00:23:39\t\tSamsung Electronics Co.,Ltd\n00:23:3A\t\tSamsung Electronics Co.,Ltd\n00:23:3B\t\tC-Matic Systems Ltd\n00:23:3C\t\tAlflex\n00:23:3D\t\tLaird Technologies\n00:23:3E\t\tAlcatel-Lucent IPD\n00:23:3F\t\tPurechoice Inc\n00:23:40\t\tMiXTelematics\n00:23:41\t\tVanderbilt International (SWE) AB\n00:23:42\t\tCoffee Equipment Company\n00:23:43\t\tTem Ag\n00:23:44\t\tObjective Interface Systems, Inc.\n00:23:45\t\tSony Corporation\n00:23:46\t\tVestac\n00:23:47\t\tProCurve Networking by HP\n00:23:48\t\tSagemcom Broadband SAS\n00:23:49\t\tHelmholtz Centre Berlin for Material and Energy\n00:23:4A\t\tPrivate\n00:23:4B\t\tInyuan Technology Inc.\n00:23:4C\t\tKtc Ab\n00:23:4D\t\tHon Hai Precision Ind. Co.,Ltd.\n00:23:4E\t\tHon Hai Precision Ind. Co.,Ltd.\n00:23:4F\t\tLuminous Power Technologies Pvt. Ltd.\n00:23:50\t\tRDC, Inc. dba LynTec\n00:23:51\t\t2Wire Inc\n00:23:52\t\tDATASENSOR S.p.A.\n00:23:53\t\tF E T Elettronica snc\n00:23:54\t\tASUSTek COMPUTER INC.\n00:23:55\t\tKinco Automation(Shanghai) Ltd.\n00:23:56\t\tPacket Forensics LLC\n00:23:57\t\tPitronot Technologies and Engineering P.T.E. Ltd.\n00:23:58\t\tSystel Sa\n00:23:59\t\tBenchmark Electronics ( Thailand ) Public Company Limited\n00:23:5A\t\tCompal Information (Kunshan) Co., Ltd.\n00:23:5B\t\tGulfstream\n00:23:5C\t\tAprius, Inc.\n00:23:5D\t\tCisco Systems, Inc\n00:23:5E\t\tCisco Systems, Inc\n00:23:5F\t\tSilicon Micro Sensors GmbH\n00:23:60\t\tLookit Technology Co., Ltd\n00:23:61\t\tUnigen Corporation\n00:23:62\t\tGoldline Controls\n00:23:63\t\tZhuhai Raysharp Technology Co.,Ltd\n00:23:64\t\tPower Instruments Pte Ltd\n00:23:65\t\tInsta Elektro GmbH\n00:23:66\t\tBeijing Siasun Electronic System Co.,Ltd.\n00:23:67\t\tUniControls a.s.\n00:23:68\t\tZebra Technologies Inc\n00:23:69\t\tCisco-Linksys, LLC\n00:23:6A\t\tSmartRG Inc\n00:23:6B\t\tXembedded, Inc.\n00:23:6C\t\tApple, Inc.\n00:23:6D\t\tResMed Ltd\n00:23:6E\t\tBurster GmbH & Co KG\n00:23:6F\t\tDAQ System\n00:23:70\t\tSnell\n00:23:71\t\tSOAM Systel\n00:23:72\t\tMore Star Industrial Group Limited\n00:23:73\t\tGridIron Systems, Inc.\n00:23:74\t\tCommscope\n00:23:75\t\tCommscope\n00:23:76\t\tHTC Corporation\n00:23:77\t\tIsotek Electronics Ltd\n00:23:78\t\tGN Netcom A/S\n00:23:79\t\tUnion Business Machines Co. Ltd.\n00:23:7A\t\tRim\n00:23:7B\t\tWhdi Llc\n00:23:7C\t\tNeotion\n00:23:7D\t\tHewlett Packard\n00:23:7E\t\tElster Gmbh\n00:23:7F\t\tPlantronics, Inc.\n00:23:80\t\tNanoteq\n00:23:81\t\tLengda Technology(Xiamen) Co.,Ltd.\n00:23:82\t\tLih Rong electronic Enterprise Co., Ltd.\n00:23:83\t\tInMage Systems Inc\n00:23:84\t\tGGH Engineering s.r.l.\n00:23:85\t\tAntipode\n00:23:86\t\tIMI Hydronic Engineering international SA\n00:23:87\t\tThinkFlood, Inc.\n00:23:88\t\tV.T. Telematica S.p.a.\n00:23:89\t\tHangzhou H3C Technologies Co., Limited\n00:23:8A\t\tCiena Corporation\n00:23:8B\t\tQuanta Computer Inc.\n00:23:8C\t\tPrivate\n00:23:8D\t\tTechno Design Co., Ltd.\n00:23:8E\t\tADB Broadband Italia\n00:23:8F\t\tNidec Copal Corporation\n00:23:90\t\tAlgolware Corporation\n00:23:91\t\tMaxian\n00:23:92\t\tProteus Industries Inc.\n00:23:93\t\tAjinextek\n00:23:94\t\tSamjeon\n00:23:95\t\tCommscope\n00:23:96\t\tAndes Technology Corporation\n00:23:97\t\tWestell Technologies Inc.\n00:23:98\t\tVutlan sro\n00:23:99\t\tSamsung Electronics Co.,Ltd\n00:23:9A\t\tEasyData Hardware GmbH\n00:23:9B\t\tElster Solutions, LLC\n00:23:9C\t\tJuniper Networks\n00:23:9D\t\tMapower Electronics Co., Ltd\n00:23:9E\t\tJiangsu Lemote Technology Corporation Limited\n00:23:9F\t\tInstitut für Prüftechnik\n00:23:A0\t\tHana CNS Co., LTD.\n00:23:A1\t\tTrend Electronics Ltd\n00:23:A2\t\tCommscope\n00:23:A3\t\tCommscope\n00:23:A4\t\tNew Concepts Development Corp.\n00:23:A5\t\tSageTV, LLC\n00:23:A6\t\tE-Mon\n00:23:A7\t\tRedpine Signals, Inc.\n00:23:A8\t\tMarshall Electronics\n00:23:A9\t\tBeijing Detianquan Electromechanical Equipment Co., Ltd\n00:23:AA\t\tHFR, Inc.\n00:23:AB\t\tCisco Systems, Inc\n00:23:AC\t\tCisco Systems, Inc\n00:23:AD\t\tXmark Corporation\n00:23:AE\t\tDell Inc.\n00:23:AF\t\tCommscope\n00:23:B0\t\tCOMXION Technology Inc.\n00:23:B1\t\tLongcheer Technology (Singapore) Pte Ltd\n00:23:B2\t\tIntelligent Mechatronic Systems Inc\n00:23:B3\t\tLyyn AB\n00:23:B4\t\tNokia Danmark A/S\n00:23:B5\t\tOrtana Ltd\n00:23:B6\t\tSecurite Communications / Honeywell\n00:23:B7\t\tQ-Light Co., Ltd.\n00:23:B8\t\tSichuan Jiuzhou Electronic Technology Co.,Ltd\n00:23:B9\t\tAirbus Defence and Space Deutschland GmbH\n00:23:BA\t\tChroma\n00:23:BB\t\tAccretech SBS, Inc.\n00:23:BC\t\tEQ-SYS GmbH\n00:23:BD\t\tDigital Ally, Inc.\n00:23:BE\t\tCisco SPVTG\n00:23:BF\t\tMainpine, Inc.\n00:23:C0\t\tBroadway Networks\n00:23:C1\t\tSecuritas Direct AB\n00:23:C2\t\tSAMSUNG Electronics. Co. LTD\n00:23:C3\t\tLogMeIn, Inc.\n00:23:C4\t\tLux Lumen\n00:23:C5\t\tRadiation Safety and Control Services Inc\n00:23:C6\t\tSMC Corporation\n00:23:C7\t\tAVSystem sp. z o. o.\n00:23:C8\t\tTeam-R\n00:23:C9\t\tSichuan Tianyi Information Science & Technology Stock CO.,LTD\n00:23:CA\t\tBehind The Set, LLC\n00:23:CB\t\tShenzhen Full-join Technology Co.,Ltd\n00:23:CC\t\tNintendo Co., Ltd.\n00:23:CD\t\tTp-Link Technologies Co.,Ltd.\n00:23:CE\t\tKita Denshi Corporation\n00:23:CF\t\tCummins-Allison Corp.\n00:23:D0\t\tUniloc USA Inc.\n00:23:D1\t\tTrg\n00:23:D2\t\tInhand Electronics, Inc.\n00:23:D3\t\tAirLink WiFi Networking Corp.\n00:23:D4\t\tTexas Instruments\n00:23:D5\t\tWAREMA Renkhoff SE\n00:23:D6\t\tSamsung Electronics Co.,Ltd\n00:23:D7\t\tSamsung Electronics Co.,Ltd\n00:23:D8\t\tBall-It Oy\n00:23:D9\t\tBanner Engineering\n00:23:DA\t\tIndustrial Computer Source (Deutschland)GmbH\n00:23:DB\t\tsaxnet gmbh\n00:23:DC\t\tBenein, Inc\n00:23:DD\t\tElgin S.A.\n00:23:DE\t\tAnsync Inc.\n00:23:DF\t\tApple, Inc.\n00:23:E0\t\tINO Therapeutics LLC\n00:23:E1\t\tCavena Image Products AB\n00:23:E2\t\tSEA Signalisation\n00:23:E3\t\tMicrotronic AG\n00:23:E4\t\tIPnect co. ltd.\n00:23:E5\t\tIPaXiom Networks\n00:23:E6\t\tInnovation Farm, Inc.\n00:23:E7\t\tHinke A/S\n00:23:E8\t\tDemco Corp.\n00:23:E9\t\tF5 Inc.\n00:23:EA\t\tCisco Systems, Inc\n00:23:EB\t\tCisco Systems, Inc\n00:23:EC\t\tAlgorithmix GmbH\n00:23:ED\t\tCommscope\n00:23:EE\t\tCommscope\n00:23:EF\t\tZuend Systemtechnik AG\n00:23:F0\t\tShanghai Jinghan Weighing Apparatus Co. Ltd.\n00:23:F1\t\tSony Corporation\n00:23:F2\t\tTVLogic\n00:23:F3\t\tGlocom, Inc.\n00:23:F4\t\tMasternaut\n00:23:F5\t\tWilo Se\n00:23:F6\t\tSoftwell Technology Co., Ltd.\n00:23:F7\t\tPrivate\n00:23:F8\t\tZyxel Communications Corporation\n00:23:F9\t\tDouble-Take Software, INC.\n00:23:FA\t\tRG Nets, Inc.\n00:23:FB\t\tIP Datatel, LLC.\n00:23:FC\t\tUltra Stereo Labs, Inc\n00:23:FD\t\tAFT Atlas Fahrzeugtechnik GmbH\n00:23:FE\t\tBiodevices, SA\n00:23:FF\t\tBeijing HTTC Technology Ltd.\n00:24:00\t\tNortel Networks\n00:24:01\t\tD-Link Corporation\n00:24:02\t\tOp-Tection GmbH\n00:24:03\t\tNokia Danmark A/S\n00:24:04\t\tNokia Danmark A/S\n00:24:05\t\tDilog Nordic AB\n00:24:06\t\tPointmobile\n00:24:07\t\tTelem Sas\n00:24:08\t\tPacific Biosciences\n00:24:09\t\tThe Toro Company\n00:24:0A\t\tUS Beverage Net\n00:24:0B\t\tVirtual Computer Inc.\n00:24:0C\t\tDELEC GmbH\n00:24:0D\t\tOnePath Networks LTD.\n00:24:0E\t\tInventec Besta Co., Ltd.\n00:24:0F\t\tIshii Tool & Engineering Corporation\n00:24:10\t\tNUETEQ Technology,Inc.\n00:24:11\t\tPharmaSmart LLC\n00:24:12\t\tBenign Technologies Co, Ltd.\n00:24:13\t\tCisco Systems, Inc\n00:24:14\t\tCisco Systems, Inc\n00:24:15\t\tMagnetic Autocontrol GmbH\n00:24:16\t\tAny Use\n00:24:17\t\tThomson Telecom Belgium\n00:24:18\t\tNextwave Semiconductor\n00:24:19\t\tPrivate\n00:24:1A\t\tRed Beetle Inc.\n00:24:1B\t\tiWOW Communications Pte Ltd\n00:24:1C\t\tFuGang Electronic (DG) Co.,Ltd\n00:24:1D\t\tGiga-Byte Technology Co.,Ltd.\n00:24:1E\t\tNintendo Co., Ltd.\n00:24:1F\t\tDCT-Delta GmbH\n00:24:20\t\tNetUP Inc.\n00:24:21\t\tMicro-Star Int'L Co., Ltd.\n00:24:22\t\tKnapp Logistik Automation GmbH\n00:24:23\t\tAzureWave Technologies (Shanghai) Inc.\n00:24:24\t\tAce Axis Limited\n00:24:25\t\tShenzhenshi chuangzhicheng Technology Co.,Ltd\n00:24:26\t\tNohmi Bosai Ltd.\n00:24:27\t\tSsi Computer Corp\n00:24:28\t\tEnergyICT\n00:24:29\t\tMk Master Inc.\n00:24:2A\t\tHittite Microwave Corporation\n00:24:2B\t\tHon Hai Precision Ind. Co.,Ltd.\n00:24:2C\t\tHon Hai Precision Ind. Co.,Ltd.\n00:24:2E\t\tDatastrip Inc.\n00:24:2F\t\tMicron\n00:24:30\t\tRuby Tech Corp.\n00:24:31\t\tUni-v co.,ltd\n00:24:32\t\tNeostar Technology Co.,LTD\n00:24:33\t\tAlpsalpine Co,.Ltd\n00:24:34\t\tLectrosonics, Inc.\n00:24:35\t\tWide Corporation\n00:24:36\t\tApple, Inc.\n00:24:37\t\tMotorola - BSG\n00:24:38\t\tBrocade Communications Systems LLC\n00:24:39\t\tDigital Barriers Advanced Technologies\n00:24:3A\t\tLudl Electronic Products\n00:24:3B\t\tCSSI (S) Pte Ltd\n00:24:3C\t\tS.A.A.A.\n00:24:3D\t\tEmerson Appliance Motors and Controls\n00:24:3F\t\tStorwize, Inc.\n00:24:40\t\tHalo Monitoring, Inc.\n00:24:41\t\tWanzl Metallwarenfabrik GmbH\n00:24:42\t\tAxona Limited\n00:24:43\t\tNortel Networks\n00:24:44\t\tNintendo Co., Ltd.\n00:24:45\t\tAdtran Inc\n00:24:46\t\tMMB Research Inc.\n00:24:47\t\tKaztek Systems\n00:24:48\t\tSpiderCloud Wireless, Inc\n00:24:49\t\tShen Zhen Lite Star Electronics Technology Co., Ltd\n00:24:4A\t\tVoyant International\n00:24:4B\t\tPerceptron Inc\n00:24:4C\t\tSolartron Metrology Ltd\n00:24:4D\t\tHokkaido Electronics Corporation\n00:24:4E\t\tRadChips, Inc.\n00:24:4F\t\tAsantron Technologies Ltd.\n00:24:50\t\tCisco Systems, Inc\n00:24:51\t\tCisco Systems, Inc\n00:24:52\t\tSilicon Software GmbH\n00:24:53\t\tInitra d.o.o.\n00:24:54\t\tSamsung Electronics Co.,Ltd\n00:24:55\t\tMuLogic BV\n00:24:56\t\t2Wire Inc\n00:24:58\t\tPA Bastion CC\n00:24:59\t\tABB Automation products GmbH\n00:24:5A\t\tNanjing Panda Electronics Company Limited\n00:24:5B\t\tRaidon Technology, Inc.\n00:24:5C\t\tDesign-Com Technologies Pty. Ltd.\n00:24:5D\t\tTerberg besturingstechniek B.V.\n00:24:5E\t\tHivision Co.,ltd\n00:24:5F\t\tVine Telecom CO.,Ltd.\n00:24:60\t\tGiaval Science Development Co. Ltd.\n00:24:61\t\tShin Wang Tech.\n00:24:62\t\tRayzone Corporation\n00:24:63\t\tPhybridge Inc\n00:24:64\t\tBridge Technologies Co AS\n00:24:65\t\tElentec\n00:24:66\t\tUnitron nv\n00:24:67\t\tAOC International (Europe) GmbH\n00:24:68\t\tSumavision Technologies Co.,Ltd\n00:24:69\t\tFasttel - Smart Doorphones\n00:24:6A\t\tSolid Year Co., Ltd.\n00:24:6B\t\tCovia, Inc.\n00:24:6C\t\tHewlett Packard Enterprise\n00:24:6D\t\tWeinzierl Engineering GmbH\n00:24:6E\t\tPhihong USA Corp.\n00:24:6F\t\tOnda Communication spa\n00:24:70\t\tAUROTECH ultrasound AS.\n00:24:71\t\tFusion MultiSystems dba Fusion-io\n00:24:72\t\tReDriven Power Inc.\n00:24:73\t\t3Com Europe Ltd\n00:24:74\t\tAutronica Fire And Securirty\n00:24:75\t\tCompass System(Embedded Dept.)\n00:24:76\t\tTAP.tv\n00:24:77\t\tTibbo Technology\n00:24:78\t\tMag Tech Electronics Co Limited\n00:24:79\t\tOptec Displays, Inc.\n00:24:7A\t\tFU YI CHENG Technology Co., Ltd.\n00:24:7B\t\tActiontec Electronics, Inc\n00:24:7C\t\tNokia Danmark A/S\n00:24:7D\t\tNokia Danmark A/S\n00:24:7E\t\tUniversal Global Scientific Industrial Co., Ltd.\n00:24:7F\t\tNortel Networks\n00:24:80\t\tMeteocontrol GmbH\n00:24:81\t\tHewlett Packard\n00:24:82\t\tRuckus Wireless\n00:24:83\t\tLG Electronics (Mobile Communications)\n00:24:84\t\tBang and Olufsen Medicom a/s\n00:24:85\t\tConteXtream Ltd\n00:24:86\t\tDesignArt Networks\n00:24:87\t\tTransact Campus, Inc.\n00:24:88\t\tCentre For Development Of Telematics\n00:24:89\t\tVodafone Omnitel N.V.\n00:24:8A\t\tKaga Electronics Co., Ltd.\n00:24:8B\t\tHybus Co., Ltd.\n00:24:8C\t\tASUSTek COMPUTER INC.\n00:24:8D\t\tSony Interactive Entertainment Inc.\n00:24:8E\t\tInfoware ZRt.\n00:24:8F\t\tDo-Monix\n00:24:90\t\tSamsung Electronics Co.,Ltd\n00:24:91\t\tSamsung Electronics Co.,Ltd\n00:24:92\t\tMotorola, Broadband Solutions Group\n00:24:93\t\tCommscope\n00:24:94\t\tShenzhen Baoxin Tech CO., Ltd.\n00:24:95\t\tCommscope\n00:24:96\t\tGinzinger electronic systems\n00:24:97\t\tCisco Systems, Inc\n00:24:98\t\tCisco Systems, Inc\n00:24:99\t\tAquila Technologies\n00:24:9A\t\tBeijing Zhongchuang Telecommunication Test Co., Ltd.\n00:24:9B\t\tAction Star Enterprise Co., Ltd.\n00:24:9C\t\tBimeng Comunication System Co. Ltd\n00:24:9D\t\tNES Technology Inc.\n00:24:9E\t\tADC-Elektronik GmbH\n00:24:9F\t\tRIM Testing Services\n00:24:A0\t\tCommscope\n00:24:A1\t\tCommscope\n00:24:A2\t\tHong Kong Middleware Technology Limited\n00:24:A3\t\tSonim Technologies Inc\n00:24:A4\t\tSiklu Communication\n00:24:A5\t\tBuffalo.Inc\n00:24:A6\t\tTELESTAR DIGITAL GmbH\n00:24:A7\t\tAdvanced Video Communications Inc.\n00:24:A8\t\tProCurve Networking by HP\n00:24:A9\t\tAg Leader Technology\n00:24:AA\t\tDycor Technologies Ltd.\n00:24:AB\t\tA7 Engineering, Inc.\n00:24:AC\t\tHangzhou DPtech Technologies Co., Ltd.\n00:24:AD\t\tAdolf Thies Gmbh & Co. KG\n00:24:AE\t\tIdemia\n00:24:AF\t\tDish Technologies Corp\n00:24:B0\t\tEsab Ab\n00:24:B1\t\tCoulomb Technologies\n00:24:B2\t\tNetgear\n00:24:B3\t\tGraf-Syteco GmbH & Co. KG\n00:24:B4\t\tESCATRONIC GmbH\n00:24:B5\t\tNortel Networks\n00:24:B6\t\tSeagate Technology\n00:24:B7\t\tGridPoint, Inc.\n00:24:B8\t\tfree alliance sdn bhd\n00:24:B9\t\tWuhan Higheasy Electronic Technology Development Co.Ltd\n00:24:BA\t\tTexas Instruments\n00:24:BB\t\tCENTRAL Corporation\n00:24:BC\t\tHuRob Co.,Ltd\n00:24:BD\t\tHainzl Industriesysteme GmbH\n00:24:BE\t\tSony Corporation\n00:24:BF\t\tCarrier Culoz SA\n00:24:C0\t\tNti Comodo Inc\n00:24:C1\t\tCommscope\n00:24:C2\t\tAsumo Co.,Ltd.\n00:24:C3\t\tCisco Systems, Inc\n00:24:C4\t\tCisco Systems, Inc\n00:24:C5\t\tMeridian Audio Limited\n00:24:C6\t\tHager Electro SAS\n00:24:C7\t\tMobilarm Ltd\n00:24:C8\t\tBroadband Solutions Group\n00:24:C9\t\tBroadband Solutions Group\n00:24:CA\t\tTobii Technology AB\n00:24:CB\t\tAutonet Mobile\n00:24:CC\t\tFascinations Toys and Gifts, Inc.\n00:24:CD\t\tWillow Garage, Inc.\n00:24:CE\t\tExeltech Inc\n00:24:CF\t\tInscape Data Corporation\n00:24:D0\t\tShenzhen SOGOOD Industry CO.,LTD.\n00:24:D1\t\tThomson Inc.\n00:24:D2\t\tAskey Computer Corp\n00:24:D3\t\tQUALICA Inc.\n00:24:D4\t\tFreebox Sas\n00:24:D5\t\tWinward Industrial Limited\n00:24:D6\t\tIntel Corporate\n00:24:D7\t\tIntel Corporate\n00:24:D8\t\tIlSung Precision\n00:24:D9\t\tBICOM, Inc.\n00:24:DA\t\tInnovar Systems Limited\n00:24:DB\t\tAlcohol Monitoring Systems\n00:24:DC\t\tJuniper Networks\n00:24:DD\t\tCentrak, Inc.\n00:24:DE\t\tGLOBAL Technology Inc.\n00:24:DF\t\tDigitalbox Europe GmbH\n00:24:E0\t\tDS Tech, LLC\n00:24:E1\t\tConvey Computer Corp.\n00:24:E2\t\tHasegawa Electric Co.,Ltd.\n00:24:E3\t\tCAO Group\n00:24:E4\t\tWithings\n00:24:E5\t\tSeer Technology, Inc\n00:24:E6\t\tIn Motion Technology Inc.\n00:24:E7\t\tPlaster Networks\n00:24:E8\t\tDell Inc.\n00:24:E9\t\tSamsung Electronics Co.,Ltd\n00:24:EA\t\tiris-GmbH infrared & intelligent sensors\n00:24:EB\t\tClearPath Networks, Inc.\n00:24:EC\t\tUnited Information Technology Co.,Ltd.\n00:24:ED\t\tYT Elec. Co,.Ltd.\n00:24:EE\t\tWynmax Inc.\n00:24:EF\t\tSony Corporation\n00:24:F0\t\tSeanodes\n00:24:F1\t\tShenzhen Fanhai Sanjiang Electronics Co., Ltd.\n00:24:F2\t\tUniphone Telecommunication Co., Ltd.\n00:24:F3\t\tNintendo Co., Ltd.\n00:24:F4\t\tKaminario, Ltd.\n00:24:F5\t\tNDS Surgical Imaging\n00:24:F6\t\tMiyoshi Electronics Corporation\n00:24:F7\t\tCisco Systems, Inc\n00:24:F8\t\tTechnical Solutions Company Ltd.\n00:24:F9\t\tCisco Systems, Inc\n00:24:FA\t\tHilger u. Kern GMBH\n00:24:FB\t\tPrivate\n00:24:FC\t\tQuoPin Co., Ltd.\n00:24:FD\t\tAccedian Networks Inc\n00:24:FE\t\tAVM GmbH\n00:24:FF\t\tQLogic Corporation\n00:25:00\t\tApple, Inc.\n00:25:01\t\tJSC \"Supertel\"\n00:25:02\t\tNaturalPoint\n00:25:03\t\tIBM Corp\n00:25:04\t\tValiant Communications Limited\n00:25:05\t\teks Engel GmbH & Co. KG\n00:25:06\t\tA.I. Antitaccheggio Italia Srl\n00:25:07\t\tASTAK Inc.\n00:25:08\t\tMaquet Cardiopulmonary AG\n00:25:09\t\tSHARETRONIC Group LTD\n00:25:0A\t\tSecurity Expert Co. Ltd\n00:25:0B\t\tCentrofactor  Inc\n00:25:0C\t\tSenet Inc\n00:25:0D\t\tGZT Telkom-Telmor sp. z o.o.\n00:25:0E\t\tgt german telematics gmbh\n00:25:0F\t\tOn-Ramp Wireless, Inc.\n00:25:10\t\tPico-Tesla Magnetic Therapies\n00:25:11\t\tElitegroup Computer Systems Co.,Ltd.\n00:25:12\t\tzte corporation\n00:25:13\t\tCxp Digital Bv\n00:25:14\t\tPC Worth Int'l Co., Ltd.\n00:25:15\t\tSfr\n00:25:16\t\tIntegrated Design Tools, Inc.\n00:25:17\t\tVenntis, LLC\n00:25:18\t\tPower PLUS Communications AG\n00:25:19\t\tViaas Inc\n00:25:1A\t\tPsiber Data Systems Inc.\n00:25:1B\t\tPhilips CareServant\n00:25:1C\t\tEdt\n00:25:1D\t\tDSA Encore, LLC\n00:25:1E\t\tRotel Technologies\n00:25:1F\t\tZynus Vision Inc.\n00:25:20\t\tSMA Railway Technology GmbH\n00:25:21\t\tLogitek Electronic Systems, Inc.\n00:25:22\t\tASRock Incorporation\n00:25:23\t\tOCP Inc.\n00:25:24\t\tLightcomm Technology Co., Ltd\n00:25:25\t\tCTERA Networks Ltd.\n00:25:26\t\tGenuine Technologies Co., Ltd.\n00:25:27\t\tBitrode Corp.\n00:25:28\t\tDaido Signal Co., Ltd.\n00:25:29\t\tComelit Group S.P.A\n00:25:2A\t\tChengdu GeeYa Technology Co.,LTD\n00:25:2B\t\tStirling Energy Systems\n00:25:2C\t\tEntourage Systems, Inc.\n00:25:2D\t\tKiryung Electronics\n00:25:2E\t\tCisco SPVTG\n00:25:2F\t\tEnergy, Inc.\n00:25:30\t\tAetas Systems Inc.\n00:25:31\t\tCloud Engines, Inc.\n00:25:32\t\tDigital Recorders\n00:25:33\t\tWittenstein Ag\n00:25:35\t\tMinimax GmbH & Co KG\n00:25:36\t\tOki Electric Industry Co., Ltd.\n00:25:37\t\tRuncom Technologies Ltd.\n00:25:38\t\tSamsung Electronics Co., Ltd., Memory Division\n00:25:39\t\tIfTA GmbH\n00:25:3A\t\tCEVA, Ltd.\n00:25:3B\t\tdin Dietmar Nocker Facilitymanagement GmbH\n00:25:3C\t\t2Wire Inc\n00:25:3D\t\tDRS Consolidated Controls\n00:25:3E\t\tSensus Metering Systems\n00:25:40\t\tQuasar Technologies, Inc.\n00:25:41\t\tMaquet Critical Care AB\n00:25:42\t\tPittasoft\n00:25:43\t\tMoneytech\n00:25:44\t\tLoJack Corporation\n00:25:45\t\tCisco Systems, Inc\n00:25:46\t\tCisco Systems, Inc\n00:25:47\t\tNokia Danmark A/S\n00:25:48\t\tNokia Danmark A/S\n00:25:49\t\tJeorich Tech. Co.,Ltd.\n00:25:4A\t\tRingCube Technologies, Inc.\n00:25:4B\t\tApple, Inc.\n00:25:4C\t\tVideon Central, Inc.\n00:25:4D\t\tSingapore Technologies Electronics Limited\n00:25:4E\t\tVertex Wireless Co., Ltd.\n00:25:4F\t\tELETTROLAB Srl\n00:25:50\t\tRiverbed Technology, Inc.\n00:25:51\t\tSE-Elektronic GmbH\n00:25:52\t\tVXi Corporation\n00:25:53\t\tADB Broadband Italia\n00:25:54\t\tPixel8 Networks\n00:25:55\t\tVisonic Technologies 1993 Ltd.\n00:25:56\t\tHon Hai Precision Ind. Co.,Ltd.\n00:25:57\t\tBlackBerry RTS\n00:25:58\t\tMpedia\n00:25:59\t\tSyphan Technologies Ltd\n00:25:5A\t\tTantalus Systems Corp.\n00:25:5B\t\tCoachComm, LLC\n00:25:5C\t\tNEC Corporation\n00:25:5D\t\tMorningstar Corporation\n00:25:5E\t\tShanghai Dare Technologies Co.,Ltd.\n00:25:5F\t\tSenTec AG\n00:25:60\t\tIbridge Networks & Communications Ltd.\n00:25:61\t\tProCurve Networking by HP\n00:25:62\t\tinterbro Co. Ltd.\n00:25:63\t\tLuxtera Inc\n00:25:64\t\tDell Inc.\n00:25:65\t\tVizimax Inc.\n00:25:66\t\tSamsung Electronics Co.,Ltd\n00:25:67\t\tSamsung Electronics Co.,Ltd\n00:25:68\t\tHuawei Technologies Co.,Ltd\n00:25:69\t\tSagemcom Broadband SAS\n00:25:6A\t\tinIT - Institut Industrial IT\n00:25:6B\t\tATENIX E.E. s.r.l.\n00:25:6C\t\t\"Azimut\" Production Association JSC\n00:25:6D\t\tBroadband Forum\n00:25:6E\t\tVan Breda B.V.\n00:25:6F\t\tDantherm Power\n00:25:70\t\tEastern Communications Company Limited\n00:25:71\t\tZhejiang Tianle Digital Electric Co.,Ltd\n00:25:72\t\tNemo-Q International AB\n00:25:73\t\tST Electronics (Info-Security) Pte Ltd\n00:25:74\t\tKUNIMI MEDIA DEVICE Co., Ltd.\n00:25:75\t\tFiberPlex Technologies, LLC\n00:25:76\t\tNeli Technologies\n00:25:77\t\tD-BOX Technologies\n00:25:78\t\tJSC \"Concern \"Sozvezdie\"\n00:25:79\t\tJ & F Labs\n00:25:7A\t\tCAMCO Produktions- und Vertriebs-GmbH für  Beschallungs- und Beleuchtungsanlagen\n00:25:7B\t\tStj  Electronics  Pvt  Ltd\n00:25:7C\t\tHuachentel Technology Development Co., Ltd\n00:25:7D\t\tPointRed Telecom Private Ltd.\n00:25:7E\t\tNew Pos Technology Limited\n00:25:7F\t\tCallTechSolution Co.,Ltd\n00:25:80\t\tEquipson S.A.\n00:25:81\t\tx-star networks Inc.\n00:25:82\t\tMaksat Technologies (P) Ltd\n00:25:83\t\tCisco Systems, Inc\n00:25:84\t\tCisco Systems, Inc\n00:25:85\t\tKOKUYO S&T Co., Ltd.\n00:25:86\t\tTp-Link Technologies Co.,Ltd.\n00:25:87\t\tVitality, Inc.\n00:25:88\t\tGenie Industries, Inc.\n00:25:89\t\tHills Industries Limited\n00:25:8A\t\tPole/Zero Corporation\n00:25:8B\t\tMellanox Technologies, Inc.\n00:25:8C\t\tEsus Elektronik San. Ve Dis. Tic. Ltd. Sti.\n00:25:8D\t\tHaier\n00:25:8E\t\tThe Weather Channel\n00:25:8F\t\tTrident Microsystems, Inc.\n00:25:90\t\tSuper Micro Computer, Inc.\n00:25:91\t\tNEXTEK, Inc.\n00:25:92\t\tGuangzhou Shirui Electronic Co., Ltd\n00:25:93\t\tDatNet Informatikai Kft.\n00:25:94\t\tEurodesign BG LTD\n00:25:95\t\tNorthwest Signal Supply, Inc\n00:25:96\t\tGIGAVISION srl\n00:25:97\t\tKalki Communication Technologies\n00:25:98\t\tZhong Shan City Litai Electronic Industrial Co. Ltd\n00:25:99\t\tHedon e.d. B.V.\n00:25:9A\t\tCEStronics GmbH\n00:25:9B\t\tBeijing PKUNITY Microsystems Technology Co., Ltd\n00:25:9C\t\tCisco-Linksys, LLC\n00:25:9D\t\tPrivate\n00:25:9E\t\tHuawei Technologies Co.,Ltd\n00:25:9F\t\tTechnoDigital Technologies GmbH\n00:25:A0\t\tNintendo Co., Ltd.\n00:25:A1\t\tEnalasys\n00:25:A2\t\tAlta Definicion LINCEO S.L.\n00:25:A3\t\tTrimax Wireless, Inc.\n00:25:A4\t\tEuroDesign embedded technologies GmbH\n00:25:A5\t\tWalnut Media Network\n00:25:A6\t\tCentral Network Solution Co., Ltd.\n00:25:A7\t\titron\n00:25:A8\t\tKontron (BeiJing) Technology Co.,Ltd\n00:25:A9\t\tShanghai Embedway Information Technologies Co.,Ltd\n00:25:AA\t\tBeijing Soul Technology Co.,Ltd.\n00:25:AB\t\tAio Lcd Pc Bu / Tpv\n00:25:AC\t\tI-Tech corporation\n00:25:AD\t\tManufacturing Resources International\n00:25:AE\t\tMicrosoft Corporation\n00:25:AF\t\tCOMFILE Technology\n00:25:B0\t\tSchmartz Inc\n00:25:B1\t\tMaya-Creation Corporation\n00:25:B2\t\tMBDA Deutschland GmbH\n00:25:B3\t\tHewlett Packard\n00:25:B4\t\tCisco Systems, Inc\n00:25:B5\t\tCisco Systems, Inc\n00:25:B6\t\tTelecom FM\n00:25:B7\t\tCostar  electronics, inc.,\n00:25:B8\t\tAgile Communications, Inc.\n00:25:B9\t\tCypress Solutions Inc\n00:25:BA\t\tAlcatel-Lucent IPD\n00:25:BB\t\tINNERINT Co., Ltd.\n00:25:BC\t\tApple, Inc.\n00:25:BD\t\tItaldata Ingegneria dell'Idea S.p.A.\n00:25:BE\t\tTektrap Systems Inc.\n00:25:BF\t\tWireless Cables Inc.\n00:25:C0\t\tZillionTV Corporation\n00:25:C1\t\tNawoo Korea Corp.\n00:25:C2\t\tRingBell Co.,Ltd.\n00:25:C3\t\t21168\n00:25:C4\t\tRuckus Wireless\n00:25:C5\t\tStar Link Communication Pvt. Ltd.\n00:25:C6\t\tkasercorp, ltd\n00:25:C7\t\taltek Corporation\n00:25:C8\t\tS-Access GmbH\n00:25:C9\t\tShenzhen Huapu Digital Co., Ltd\n00:25:CA\t\tLaird Connectivity\n00:25:CB\t\tReiner SCT\n00:25:CC\t\tMobile Communications Korea Incorporated\n00:25:CD\t\tSkylane Optics\n00:25:CE\t\tInnerSpace\n00:25:CF\t\tNokia Danmark A/S\n00:25:D0\t\tNokia Danmark A/S\n00:25:D1\t\tEastern Asia Technology Limited\n00:25:D2\t\tInpegVision Co., Ltd\n00:25:D3\t\tAzureWave Technology Inc.\n00:25:D4\t\tGeneral Dynamics Mission Systems\n00:25:D5\t\tRobonica (Pty) Ltd\n00:25:D6\t\tThe Kroger Co.\n00:25:D7\t\tCedo\n00:25:D8\t\tKorea Maintenance\n00:25:D9\t\tDataFab Systems Inc.\n00:25:DA\t\tSecura Key\n00:25:DB\t\tATI Electronics(Shenzhen) Co., LTD\n00:25:DC\t\tSumitomo Electric Industries, Ltd\n00:25:DD\t\tSunnytek Information Co., Ltd.\n00:25:DE\t\tProbits Co., LTD.\n00:25:DF\t\tAxon Enterprise, Inc.\n00:25:E0\t\tCeedTec Sdn Bhd\n00:25:E1\t\tShanghai Seeyoo Electronic & Technology Co., Ltd\n00:25:E2\t\tEverspring Industry Co., Ltd.\n00:25:E3\t\tHanshinit Inc.\n00:25:E4\t\tOMNI-WiFi, LLC\n00:25:E5\t\tLG Electronics (Mobile Communications)\n00:25:E6\t\tBelgian Monitoring Systems bvba\n00:25:E7\t\tSony Corporation\n00:25:E8\t\tIdaho Technology\n00:25:E9\t\ti-mate Development, Inc.\n00:25:EA\t\tIphion BV\n00:25:EB\t\tReutech Radar Systems (PTY) Ltd\n00:25:EC\t\tHumanware\n00:25:ED\t\tNuVo Technologies LLC\n00:25:EE\t\tAvtex Ltd\n00:25:EF\t\tI-TEC Co., Ltd.\n00:25:F0\t\tSuga Electronics Limited\n00:25:F1\t\tCommscope\n00:25:F2\t\tCommscope\n00:25:F3\t\tNordwestdeutsche Zählerrevision\n00:25:F4\t\tKoCo Connector AG\n00:25:F5\t\tDVS Korea, Co., Ltd\n00:25:F6\t\tnetTALK.com, Inc.\n00:25:F7\t\tAnsaldo STS USA\n00:25:F9\t\tGMK electronic design GmbH\n00:25:FA\t\tJ&M Analytik AG\n00:25:FB\t\tTunstall Healthcare A/S\n00:25:FC\t\tEnda\n00:25:FD\t\tOBR Centrum Techniki Morskiej S.A.\n00:25:FE\t\tPilot Electronics Corporation\n00:25:FF\t\tCreNova Multimedia Co., Ltd\n00:26:00\t\tTEAC Australia Pty Ltd.\n00:26:01\t\tCutera Inc\n00:26:02\t\tSMART Temps LLC\n00:26:03\t\tShenzhen Wistar Technology Co., Ltd\n00:26:04\t\tWorldCast Systems\n00:26:05\t\tCC Systems AB\n00:26:06\t\tRAUMFELD GmbH\n00:26:07\t\tEnabling Technology Pty Ltd\n00:26:08\t\tApple, Inc.\n00:26:09\t\tPhyllis Co., Ltd.\n00:26:0A\t\tCisco Systems, Inc\n00:26:0B\t\tCisco Systems, Inc\n00:26:0C\t\tDataram\n00:26:0D\t\tMercury Systems, Inc.\n00:26:0E\t\tAblaze Systems, LLC\n00:26:0F\t\tLinn Products Ltd\n00:26:10\t\tApacewave Technologies\n00:26:11\t\tLicera AB\n00:26:12\t\tSpace Exploration Technologies\n00:26:13\t\tEngel Axil S.L.\n00:26:14\t\tKtnf\n00:26:15\t\tTeracom Limited\n00:26:16\t\tRosemount Inc.\n00:26:17\t\tOEM Worldwide\n00:26:18\t\tASUSTek COMPUTER INC.\n00:26:19\t\tFrc\n00:26:1A\t\tFemtocomm System Technology Corp.\n00:26:1B\t\tLaurel Bank Machines Co., Ltd.\n00:26:1C\t\tNeovia Inc.\n00:26:1D\t\tCop Security System Corp.\n00:26:1E\t\tQingbang Elec(Sz) Co., Ltd\n00:26:1F\t\tSAE Magnetics (H.K.) Ltd.\n00:26:20\t\tISGUS GmbH\n00:26:21\t\tInteliCloud Technology Inc.\n00:26:22\t\tCompal Information (Kunshan) Co., Ltd.\n00:26:23\t\tJRD Communication Inc\n00:26:24\t\tThomson Inc.\n00:26:25\t\tMediaSputnik\n00:26:26\t\tGeophysical Survey Systems, Inc.\n00:26:27\t\tTruesell\n00:26:28\t\tcompanytec automação e controle ltda.\n00:26:29\t\tJuphoon System Software Inc.\n00:26:2A\t\tProxense, LLC\n00:26:2B\t\tWongs Electronics Co. Ltd.\n00:26:2C\t\tIKT Advanced Technologies s.r.o.\n00:26:2D\t\tWistron Corporation\n00:26:2E\t\tChengdu Jiuzhou Electronic Technology Inc\n00:26:2F\t\tHamamatsu Toa Electronics\n00:26:30\t\tAcorel S.A.S\n00:26:31\t\tCommtact Ltd\n00:26:32\t\tInstrumentation Technologies d.d.\n00:26:33\t\tMIR - Medical International Research\n00:26:34\t\tInfineta Systems, Inc\n00:26:35\t\tBluetechnix GmbH\n00:26:36\t\tCommscope\n00:26:37\t\tSamsung Electro Mechanics Co., Ltd.\n00:26:38\t\tXia Men Joyatech Co., Ltd.\n00:26:39\t\tT.M. Electronics, Inc.\n00:26:3A\t\tDigitec Systems\n00:26:3B\t\tOnbnetech\n00:26:3C\t\tBachmann Technology GmbH & Co. KG\n00:26:3D\t\tMIA Corporation\n00:26:3E\t\tTrapeze Networks\n00:26:3F\t\tLIOS Technology GmbH\n00:26:40\t\tBaustem Broadband Technologies, Ltd.\n00:26:41\t\tCommscope\n00:26:42\t\tCommscope\n00:26:43\t\tAlpsalpine Co,.Ltd\n00:26:44\t\tThomson Telecom Belgium\n00:26:45\t\tCircontrol S.A.\n00:26:46\t\tShenyang Tongfang Multimedia Technology Company Limited\n00:26:47\t\tWfe Technology Corp.\n00:26:48\t\tEmitech Corp.\n00:26:4A\t\tApple, Inc.\n00:26:4C\t\tShanghai DigiVision Technology Co., Ltd.\n00:26:4D\t\tArcadyan Technology Corporation\n00:26:4E\t\tr2p GmbH\n00:26:4F\t\tKrüger &Gothe GmbH\n00:26:50\t\t2Wire Inc\n00:26:51\t\tCisco Systems, Inc\n00:26:52\t\tCisco Systems, Inc\n00:26:53\t\tDaySequerra Corporation\n00:26:54\t\t3Com\n00:26:55\t\tHewlett Packard\n00:26:56\t\tSansonic Electronics USA\n00:26:57\t\tOoo Npp Ekra\n00:26:58\t\tT-Platforms (Cyprus) Limited\n00:26:59\t\tNintendo Co., Ltd.\n00:26:5A\t\tD-Link Corporation\n00:26:5B\t\tHitron Technologies. Inc\n00:26:5C\t\tHon Hai Precision Ind. Co.,Ltd.\n00:26:5D\t\tSamsung Electronics Co.,Ltd\n00:26:5E\t\tHon Hai Precision Ind. Co.,Ltd.\n00:26:5F\t\tSamsung Electronics Co.,Ltd\n00:26:60\t\tLogiways\n00:26:61\t\tIrumtek Co., Ltd.\n00:26:62\t\tActiontec Electronics, Inc\n00:26:63\t\tShenzhen Huitaiwei Tech. Ltd, co.\n00:26:64\t\tCore System Japan\n00:26:65\t\tProtectedLogic Corporation\n00:26:66\t\tEFM Networks\n00:26:67\t\tCarecom Co.,Ltd.\n00:26:68\t\tNokia Danmark A/S\n00:26:69\t\tNokia Danmark A/S\n00:26:6A\t\tEssensium Nv\n00:26:6B\t\tShine Union Enterprise Limited\n00:26:6C\t\tInventec Corporation\n00:26:6D\t\tMobileAccess Networks\n00:26:6E\t\tNissho-denki Co.,LTD.\n00:26:6F\t\tCoordiwise Technology Corp.\n00:26:70\t\tCinch Connectors\n00:26:71\t\tAUTOVISION Co., Ltd\n00:26:72\t\tAAMP of America\n00:26:73\t\tRicoh Company,Ltd.\n00:26:74\t\tHunter Douglas\n00:26:75\t\tAztech Electronics Pte Ltd\n00:26:76\t\tCOMMidt AS\n00:26:77\t\tDeif A/S\n00:26:78\t\tLogic Instrument SA\n00:26:79\t\tEuphonic Technologies, Inc.\n00:26:7A\t\twuhan hongxin telecommunication technologies co.,ltd\n00:26:7B\t\tGSI Helmholtzzentrum für Schwerionenforschung GmbH\n00:26:7C\t\tMetz-Werke GmbH & Co KG\n00:26:7D\t\tA-Max Technology Macao Commercial Offshore Company Limited\n00:26:7E\t\tParrot Sa\n00:26:7F\t\tOregan Networks Ltd.\n00:26:80\t\tSIL3 Pty.Ltd\n00:26:81\t\tInterspiro AB\n00:26:82\t\tGemtek Technology Co., Ltd.\n00:26:83\t\tAjoho Enterprise Co., Ltd.\n00:26:84\t\tKisan System\n00:26:85\t\tDigital Innovation\n00:26:86\t\tQuantenna Communcations, Inc.\n00:26:87\t\tcorega K.K\n00:26:88\t\tJuniper Networks\n00:26:89\t\tGeneral Dynamics Robotic Systems\n00:26:8A\t\tTerrier SC Ltd\n00:26:8B\t\tGuangzhou Escene Computer Technology Limited\n00:26:8C\t\tStarLeaf Ltd.\n00:26:8D\t\tCellTel S.p.A.\n00:26:8E\t\tAlta Solutions, Inc.\n00:26:8F\t\tMTA SpA\n00:26:90\t\tI Do It\n00:26:91\t\tSagemcom Broadband SAS\n00:26:92\t\tMitsubishi Electric Corporation\n00:26:93\t\tQVidium Technologies, Inc.\n00:26:94\t\tSenscient Ltd\n00:26:95\t\tZT Group Int'l Inc\n00:26:96\t\tNOOLIX Co., Ltd\n00:26:97\t\tAlpha  Technologies Inc.\n00:26:98\t\tCisco Systems, Inc\n00:26:99\t\tCisco Systems, Inc\n00:26:9A\t\tCarina System Co., Ltd.\n00:26:9B\t\tSOKRAT Ltd.\n00:26:9C\t\tItus Japan Co. Ltd\n00:26:9D\t\tM2Mnet Co., Ltd.\n00:26:9E\t\tQuanta Computer Inc.\n00:26:9F\t\tPrivate\n00:26:A0\t\tmoblic\n00:26:A1\t\tMegger\n00:26:A2\t\tInstrumentation Technology Systems\n00:26:A3\t\tFQ Ingenieria Electronica S.A.\n00:26:A4\t\tNovus Produtos Eletronicos Ltda\n00:26:A5\t\tMicrorobot.Co.,Ltd\n00:26:A6\t\tTrixell\n00:26:A7\t\tConnect Srl\n00:26:A8\t\tDaehap Hyper-Tech\n00:26:A9\t\tStrong Technologies Pty Ltd\n00:26:AA\t\tKenmec Mechanical Engineering Co., Ltd.\n00:26:AB\t\tSeiko Epson Corporation\n00:26:AC\t\tShanghai LUSTER Teraband photonic Co., Ltd.\n00:26:AD\t\tArada Systems, Inc.\n00:26:AE\t\tWireless Measurement Ltd\n00:26:AF\t\tDuelco A/S\n00:26:B0\t\tApple, Inc.\n00:26:B1\t\tNavis Auto Motive Systems, Inc.\n00:26:B2\t\tSetrix GmbH\n00:26:B3\t\tThales Communications Inc\n00:26:B4\t\tFord Motor Company\n00:26:B5\t\tICOMM Tele Ltd\n00:26:B6\t\tAskey Computer Corp\n00:26:B7\t\tKingston Technology Company, Inc.\n00:26:B8\t\tActiontec Electronics, Inc\n00:26:B9\t\tDell Inc.\n00:26:BA\t\tCommscope\n00:26:BB\t\tApple, Inc.\n00:26:BC\t\tGeneral Jack Technology Ltd.\n00:26:BD\t\tJTEC Card & Communication Co., Ltd\n00:26:BE\t\tSchoonderbeek Elektronica Systemen B.V.\n00:26:BF\t\tShenZhen Temobi Science&Tech Development Co.,Ltd\n00:26:C0\t\tEnergyHub\n00:26:C1\t\tArtray Co., Ltd.\n00:26:C2\t\tSCDI Co. LTD\n00:26:C3\t\tInsightek Corp.\n00:26:C4\t\tCadmos microsystems S.r.l.\n00:26:C5\t\tGuangdong Gosun Telecommunications Co.,Ltd\n00:26:C6\t\tIntel Corporate\n00:26:C7\t\tIntel Corporate\n00:26:C8\t\tSystem Sensor\n00:26:C9\t\tProventix Systems, Inc.\n00:26:CA\t\tCisco Systems, Inc\n00:26:CB\t\tCisco Systems, Inc\n00:26:CC\t\tNokia Danmark A/S\n00:26:CD\t\tPurpleComm, Inc.\n00:26:CE\t\tKozumi USA Corp.\n00:26:CF\t\tDeka R&D\n00:26:D0\t\tSemihalf\n00:26:D1\t\tS Squared Innovations Inc.\n00:26:D2\t\tPcube Systems, Inc.\n00:26:D3\t\tZeno Information System\n00:26:D4\t\tIRCA SpA\n00:26:D5\t\tOry Solucoes em Comercio de Informatica Ltda.\n00:26:D6\t\tNingbo Andy Optoelectronic Co., Ltd.\n00:26:D7\t\tKM Electornic Technology Co., Ltd.\n00:26:D8\t\tMagic Point Inc.\n00:26:D9\t\tCommscope\n00:26:DA\t\tUniversal Media Corporation /Slovakia/ s.r.o.\n00:26:DB\t\tIonics EMS Inc.\n00:26:DC\t\tOptical Systems Design\n00:26:DD\t\tFival Science & Technology Co.,Ltd.\n00:26:DE\t\tFdi Matelec\n00:26:DF\t\tTaiDoc Technology Corp.\n00:26:E0\t\tAsiteq\n00:26:E1\t\tStanford University, OpenFlow Group\n00:26:E2\t\tLG Electronics (Mobile Communications)\n00:26:E3\t\tDti\n00:26:E4\t\tCanal +\n00:26:E5\t\tAEG Power Solutions\n00:26:E6\t\tVisionhitech Co., Ltd.\n00:26:E7\t\tShanghai ONLAN Communication Tech. Co., Ltd.\n00:26:E8\t\tMurata Manufacturing Co., Ltd.\n00:26:E9\t\tSP Corp\n00:26:EA\t\tCheerchip Electronic Technology (ShangHai) Co., Ltd.\n00:26:EB\t\tAdvanced Spectrum Technology Co., Ltd.\n00:26:EC\t\tLegrand Home Systems, Inc\n00:26:ED\t\tzte corporation\n00:26:EE\t\tTKM GmbH\n00:26:EF\t\tTechnology Advancement Group, Inc.\n00:26:F0\t\tcTrixs International GmbH.\n00:26:F1\t\tProCurve Networking by HP\n00:26:F2\t\tNetgear\n00:26:F3\t\tSMC Networks\n00:26:F4\t\tNesslab\n00:26:F5\t\tXRPLUS Inc.\n00:26:F6\t\tMilitary Communication Institute\n00:26:F7\t\tNivetti Systems Pvt. Ltd.\n00:26:F8\t\tGolden Highway Industry Development Co., Ltd.\n00:26:F9\t\tS.E.M. srl\n00:26:FA\t\tBandRich Inc.\n00:26:FB\t\tAirDio Wireless, Inc.\n00:26:FC\t\tAcSiP Technology Corp.\n00:26:FD\t\tInteractive Intelligence\n00:26:FE\t\tMKD Technology Inc.\n00:26:FF\t\tBlackBerry RTS\n00:27:00\t\tShenzhen Siglent Technology Co., Ltd.\n00:27:01\t\tINCOstartec GmbH\n00:27:02\t\tSolarEdge Technologies\n00:27:03\t\tTestech Electronics Pte Ltd\n00:27:04\t\tAccelerated Concepts, Inc\n00:27:05\t\tSectronic\n00:27:06\t\tYoisys\n00:27:07\t\tLift Complex DS, JSC\n00:27:08\t\tNordiag ASA\n00:27:09\t\tNintendo Co., Ltd.\n00:27:0A\t\tIee S.A.\n00:27:0B\t\tAdura Technologies\n00:27:0C\t\tCisco Systems, Inc\n00:27:0D\t\tCisco Systems, Inc\n00:27:0E\t\tIntel Corporate\n00:27:0F\t\tEnvisionnovation Inc\n00:27:10\t\tIntel Corporate\n00:27:11\t\tLanPro Inc\n00:27:12\t\tMaxVision LLC\n00:27:13\t\tUniversal Global Scientific Industrial Co., Ltd.\n00:27:14\t\tGrainmustards, Co,ltd.\n00:27:15\t\tRebound Telecom. Co., Ltd\n00:27:16\t\tAdachi-Syokai Co., Ltd.\n00:27:17\t\tCE Digital(Zhenjiang)Co.,Ltd\n00:27:18\t\tSuzhou NEW SEAUNION Video Technology Co.,Ltd\n00:27:19\t\tTp-Link Technologies Co.,Ltd.\n00:27:1A\t\tGeenovo Technology Ltd.\n00:27:1B\t\tAlec Sicherheitssysteme GmbH\n00:27:1C\t\tMercury Corporation\n00:27:1D\t\tComba Telecom Systems (China) Ltd.\n00:27:1E\t\tXagyl Communications\n00:27:1F\t\tMIPRO Electronics Co., Ltd\n00:27:20\t\tNew-Sol Com\n00:27:21\t\tShenzhen Baoan Fenda Industrial Co., Ltd\n00:27:22\t\tUbiquiti Inc\n00:27:90\t\tCisco Systems, Inc\n00:27:E3\t\tCisco Systems, Inc\n00:27:F8\t\tBrocade Communications Systems LLC\n00:28:9F\t\tSemptian Co., Ltd.\n00:28:F8\t\tIntel Corporate\n00:29:26\t\tApplied Optoelectronics, Inc Taiwan Branch\n00:29:C2\t\tCisco Systems, Inc\n00:2A:10\t\tCisco Systems, Inc\n00:2A:6A\t\tCisco Systems, Inc\n00:2A:AF\t\tLARsys-Automation GmbH\n00:2B:67\t\tLCFC(Hefei) Electronics Technology co., ltd\n00:2B:70\t\tSamsung Electronics Co.,Ltd\n00:2B:90\t\tZelus(Shenzhen) Technology Ltd.\n00:2B:F5\t\tBuffalo.Inc\n00:2C:C8\t\tCisco Systems, Inc\n00:2D:76\t\tTITECH GmbH\n00:2D:B3\t\tAMPAK Technology,Inc.\n00:2E:C7\t\tHuawei Technologies Co.,Ltd\n00:2F:5C\t\tCisco Systems, Inc\n00:2F:D9\t\tFiberhome Telecommunication Technologies Co.,LTD\n00:30:00\t\tAllwell Technology Corp.\n00:30:01\t\tSmp\n00:30:02\t\tExpand Networks\n00:30:03\t\tPhasys Ltd.\n00:30:04\t\tLeadtek Research Inc.\n00:30:05\t\tFujitsu Siemens Computers\n00:30:06\t\tSuperpower Computer\n00:30:07\t\tOpti, Inc.\n00:30:08\t\tAvio Digital, Inc.\n00:30:09\t\tTachion Networks, Inc.\n00:30:0A\t\tAztech Electronics Pte Ltd\n00:30:0B\t\tmPHASE Technologies, Inc.\n00:30:0C\t\tCongruency, Ltd.\n00:30:0D\t\tMMC Technology, Inc.\n00:30:0E\t\tKlotz Digital AG\n00:30:0F\t\tIMT - Information Management T\n00:30:10\t\tVisionetics International\n00:30:11\t\tHMS Industrial Networks\n00:30:12\t\tDigital Engineering Ltd.\n00:30:13\t\tNEC Corporation\n00:30:14\t\tDivio, Inc.\n00:30:15\t\tCp Clare Corp.\n00:30:16\t\tIshida Co., Ltd.\n00:30:17\t\tBlueArc UK Ltd\n00:30:18\t\tJetway Information Co., Ltd.\n00:30:19\t\tCisco Systems, Inc\n00:30:1A\t\tSmartbridges Pte. Ltd.\n00:30:1B\t\tShuttle, Inc.\n00:30:1C\t\tAltvater Airdata Systems\n00:30:1D\t\tSkystream, Inc.\n00:30:1E\t\t3Com Europe Ltd\n00:30:1F\t\tOptical Networks, Inc.\n00:30:20\t\tTSI, Inc..\n00:30:21\t\tHsing Tech. Enterprise Co.,Ltd\n00:30:22\t\tFong Kai Industrial Co., Ltd.\n00:30:23\t\tCogent Computer Systems, Inc.\n00:30:24\t\tCisco Systems, Inc\n00:30:25\t\tCheckout Computer Systems, Ltd\n00:30:26\t\tHeiTel Digital Video GmbH\n00:30:27\t\tKerbango, Inc.\n00:30:28\t\tFASE Saldatura srl\n00:30:29\t\tOpicom\n00:30:2A\t\tSouthern Information\n00:30:2B\t\tInalp Solutions AG\n00:30:2C\t\tSylantro Systems Corporation\n00:30:2D\t\tQuantum Bridge Communications\n00:30:2E\t\tHoft & Wessel AG\n00:30:2F\t\tGE Aviation System\n00:30:30\t\tHarmonix Corporation\n00:30:31\t\tLightwave Communications, Inc.\n00:30:32\t\tMagicRam, Inc.\n00:30:33\t\tOrient Telecom Co., Ltd.\n00:30:34\t\tSet Engineering\n00:30:35\t\tCorning Incorporated\n00:30:36\t\tRmp Elektroniksysteme Gmbh\n00:30:37\t\tPackard Bell Nec Services\n00:30:38\t\tXcp, Inc.\n00:30:39\t\tSoftbook Press\n00:30:3A\t\tMaatel\n00:30:3B\t\tPowerCom Technology\n00:30:3C\t\tOnnto Corp.\n00:30:3D\t\tIva Corporation\n00:30:3E\t\tRadcom Ltd.\n00:30:3F\t\tTurboComm Tech Inc.\n00:30:40\t\tCisco Systems, Inc\n00:30:41\t\tSaejin T & M Co., Ltd.\n00:30:42\t\tDeTeWe-Deutsche Telephonwerke\n00:30:43\t\tIdream Technologies, Pte. Ltd.\n00:30:44\t\tCradlePoint, Inc\n00:30:45\t\tVillage Networks, Inc. (VNI)\n00:30:46\t\tControlled Electronic Manageme\n00:30:47\t\tNissei Electric Co., Ltd.\n00:30:48\t\tSuper Micro Computer, Inc.\n00:30:49\t\tBryant Technology, Ltd.\n00:30:4A\t\tFraunhofer IPMS\n00:30:4B\t\tOrbacom Systems, Inc.\n00:30:4C\t\tAppian Communications, Inc.\n00:30:4D\t\tEsi\n00:30:4E\t\tBustec Production Ltd.\n00:30:4F\t\tPLANET Technology Corporation\n00:30:50\t\tVersa Technology\n00:30:51\t\tOrbit Avionic & Communication\n00:30:52\t\tZhone Technologies, Inc.\n00:30:53\t\tBasler AG\n00:30:54\t\tCastlenet Technology Inc.\n00:30:55\t\tRenesas Technology America, Inc.\n00:30:56\t\tHMS Industrial Networks\n00:30:57\t\tQTelNet, Inc.\n00:30:58\t\tApi Motion\n00:30:59\t\tKontron Europe GmbH\n00:30:5A\t\tTelgen Corporation\n00:30:5B\t\tToko Inc.\n00:30:5C\t\tSMAR Laboratories Corp.\n00:30:5D\t\tDigitra Systems, Inc.\n00:30:5E\t\tAbelko Innovation\n00:30:5F\t\tHasselblad\n00:30:60\t\tPowerfile, Inc.\n00:30:61\t\tMobyTEL\n00:30:62\t\tIP Video Networks Inc\n00:30:63\t\tSantera Systems, Inc.\n00:30:64\t\tAdlink Technology, Inc.\n00:30:65\t\tApple, Inc.\n00:30:66\t\tRfm\n00:30:67\t\tBIOSTAR Microtech Int'l Corp.\n00:30:68\t\tCybernetics Tech. Co., Ltd.\n00:30:69\t\tImpacct Technology Corp.\n00:30:6A\t\tPenta Media Co., Ltd.\n00:30:6B\t\tCmos Systems, Inc.\n00:30:6C\t\tHitex Holding GmbH\n00:30:6D\t\tLucent Technologies\n00:30:6E\t\tHewlett Packard\n00:30:6F\t\tSeyeon Tech. Co., Ltd.\n00:30:70\t\t1Net Corporation\n00:30:71\t\tCisco Systems, Inc\n00:30:72\t\tIntellibyte Inc.\n00:30:73\t\tInternational Microsystems, In\n00:30:74\t\tEquiinet Ltd.\n00:30:75\t\tAdtech\n00:30:76\t\tAkamba Corporation\n00:30:77\t\tOnprem Networks\n00:30:78\t\tCisco Systems, Inc\n00:30:79\t\tCqos, Inc.\n00:30:7A\t\tAdvanced Technology & Systems\n00:30:7B\t\tCisco Systems, Inc\n00:30:7C\t\tAdid Sa\n00:30:7D\t\tGre America, Inc.\n00:30:7E\t\tRedflex Communication Systems\n00:30:7F\t\tIrlan Ltd.\n00:30:80\t\tCisco Systems, Inc\n00:30:81\t\tAltos C&C\n00:30:82\t\tTaihan Electric Wire Co., Ltd.\n00:30:83\t\tIvron Systems\n00:30:84\t\tAllied Telesyn Internaional\n00:30:85\t\tCisco Systems, Inc\n00:30:86\t\tTransistor Devices, Inc.\n00:30:87\t\tVega Grieshaber Kg\n00:30:88\t\tEricsson\n00:30:89\t\tSpectrapoint Wireless, LLC\n00:30:8A\t\tNicotra Sistemi S.P.A\n00:30:8B\t\tBrix Networks\n00:30:8C\t\tQuantum Corporation\n00:30:8D\t\tPinnacle Systems, Inc.\n00:30:8E\t\tCrossmatch Technologies/HID Global\n00:30:8F\t\tMICRILOR, Inc.\n00:30:90\t\tCyra Technologies, Inc.\n00:30:91\t\tTaiwan First Line Elec. Corp.\n00:30:92\t\tKontron Electronics AG\n00:30:93\t\tSonnet Technologies, Inc\n00:30:94\t\tCisco Systems, Inc\n00:30:95\t\tProcomp Informatics, Ltd.\n00:30:96\t\tCisco Systems, Inc\n00:30:97\t\tAB Regin\n00:30:98\t\tGlobal Converging Technologies\n00:30:99\t\tBoenig Und Kallenbach Ohg\n00:30:9A\t\tAstro Terra Corp.\n00:30:9B\t\tSmartware\n00:30:9C\t\tTiming Applications, Inc.\n00:30:9D\t\tNimble Microsystems, Inc.\n00:30:9E\t\tWorkbit Corporation.\n00:30:9F\t\tAmber Networks\n00:30:A0\t\tTyco Submarine Systems, Ltd.\n00:30:A1\t\tWEBGATE Inc.\n00:30:A2\t\tLightner Engineering\n00:30:A3\t\tCisco Systems, Inc\n00:30:A4\t\tWoodwind Communications System\n00:30:A5\t\tActive Power\n00:30:A6\t\tVianet Technologies, Ltd.\n00:30:A7\t\tSchweitzer Engineering\n00:30:A8\t\tOl'E Communications, Inc.\n00:30:A9\t\tNetiverse, Inc.\n00:30:AA\t\tAxus Microsystems, Inc.\n00:30:AB\t\tDelta Networks, Inc.\n00:30:AC\t\tSysteme Lauer GmbH & Co., Ltd.\n00:30:AD\t\tShanghai Communication\n00:30:AE\t\tTimes N System, Inc.\n00:30:AF\t\tHoneywell GmbH\n00:30:B0\t\tConvergenet Technologies\n00:30:B1\t\tTrunkNet\n00:30:B2\t\tL-3 Sonoma EO\n00:30:B3\t\tSan Valley Systems, Inc.\n00:30:B4\t\tIntersil Corp.\n00:30:B5\t\tTadiran Microwave Networks\n00:30:B6\t\tCisco Systems, Inc\n00:30:B7\t\tTeletrol Systems, Inc.\n00:30:B8\t\tRiverDelta Networks\n00:30:B9\t\tEctel\n00:30:BA\t\tAc&T System Co., Ltd.\n00:30:BB\t\tCacheFlow, Inc.\n00:30:BC\t\tOptronic AG\n00:30:BD\t\tBelkin Components\n00:30:BE\t\tCity-Net Technology, Inc.\n00:30:BF\t\tMultidata Gmbh\n00:30:C0\t\tLara Technology, Inc.\n00:30:C1\t\tHewlett Packard\n00:30:C2\t\tComone\n00:30:C3\t\tFlueckiger Elektronik Ag\n00:30:C4\t\tCanon Imaging Systems Inc.\n00:30:C5\t\tCadence Design Systems, Inc.\n00:30:C6\t\tControl Solutions, Inc.\n00:30:C7\t\tMacromate Corp.\n00:30:C8\t\tGad Line, Ltd.\n00:30:C9\t\tLuxN, N\n00:30:CA\t\tDiscovery Com\n00:30:CB\t\tOmni Flow Computers, Inc.\n00:30:CC\t\tTenor Networks, Inc.\n00:30:CD\t\tConexant Systems, Inc.\n00:30:CE\t\tZaffire\n00:30:CF\t\tTwo Technologies, Inc.\n00:30:D0\t\tTellabs\n00:30:D1\t\tInova Corporation\n00:30:D2\t\tWin Technologies, Co., Ltd.\n00:30:D3\t\tAgilent Technologies, Inc.\n00:30:D4\t\tAAE Systems, Inc.\n00:30:D5\t\tDResearch GmbH\n00:30:D6\t\tMsc Vertriebs Gmbh\n00:30:D7\t\tInnovative Systems, L.L.C.\n00:30:D8\t\tSitek\n00:30:D9\t\tDatacore Software Corp.\n00:30:DA\t\tComtrend Corporation\n00:30:DB\t\tMindready Solutions, Inc.\n00:30:DC\t\tRightech Corporation\n00:30:DD\t\tIndigita Corporation\n00:30:DE\t\tWAGO Kontakttechnik GmbH\n00:30:DF\t\tKb/Tel Telecomunicaciones\n00:30:E0\t\tOxford Semiconductor Ltd.\n00:30:E1\t\tNetwork Equipment Technologies, Inc.\n00:30:E2\t\tGarnet Systems Co., Ltd.\n00:30:E3\t\tSedona Networks Corp.\n00:30:E4\t\tChiyoda System Riken\n00:30:E5\t\tAmper Datos S.A.\n00:30:E6\t\tDraeger Medical Systems, Inc.\n00:30:E7\t\tCnf Mobile Solutions, Inc.\n00:30:E8\t\tEnsim Corp.\n00:30:E9\t\tGma Communication Manufact'G\n00:30:EA\t\tTeraForce Technology Corporation\n00:30:EB\t\tTurbonet Communications, Inc.\n00:30:EC\t\tBorgardt\n00:30:ED\t\tExpert Magnetics Corp.\n00:30:EE\t\tDSG Technology, Inc.\n00:30:EF\t\tNeon Technology, Inc.\n00:30:F0\t\tUniform Industrial Corp.\n00:30:F1\t\tAccton Technology Corp\n00:30:F2\t\tCisco Systems, Inc\n00:30:F3\t\tAt Work Computers\n00:30:F4\t\tStardot Technologies\n00:30:F5\t\tWild Lab. Ltd.\n00:30:F6\t\tSecurelogix Corporation\n00:30:F7\t\tRamix Inc.\n00:30:F8\t\tDynapro Systems, Inc.\n00:30:F9\t\tSollae Systems Co., Ltd.\n00:30:FA\t\tTelica, Inc.\n00:30:FB\t\tAZS Technology AG\n00:30:FC\t\tTerawave Communications, Inc.\n00:30:FD\t\tIntegrated Systems Design\n00:30:FE\t\tDSA GmbH\n00:30:FF\t\tDataFab Systems Inc.\n00:31:26\t\tNokia\n00:31:46\t\tJuniper Networks\n00:31:92\t\tTP-Link Systems Inc\n00:32:17\t\tCisco Systems, Inc\n00:32:3A\t\tso-logic\n00:33:58\t\tRuckus Wireless\n00:33:6C\t\tSynapSense Corporation\n00:33:7A\t\tTuya Smart Inc.\n00:34:A1\t\tRf-Lambda Usa Inc.\n00:34:DA\t\tLG Electronics (Mobile Communications)\n00:34:F1\t\tRadicom Research, Inc.\n00:34:FE\t\tHuawei Technologies Co.,Ltd\n00:35:1A\t\tCisco Systems, Inc\n00:35:32\t\tElectro-Metrics Corporation\n00:35:60\t\tRosen Aviation\n00:35:FF\t\tTexas Instruments\n00:36:76\t\tCommscope\n00:36:BE\t\tNorthwest Towers\n00:36:D7\t\tKeltron IOT Corp.\n00:36:F8\t\tConti Temic microelectronic GmbH\n00:36:FE\t\tSuperVision\n00:37:6D\t\tMurata Manufacturing Co., Ltd.\n00:37:B7\t\tSagemcom Broadband SAS\n00:38:DF\t\tCisco Systems, Inc\n00:39:69\t\tAir-Weigh Incorporated\n00:3A:7D\t\tCisco Systems, Inc\n00:3A:98\t\tCisco Systems, Inc\n00:3A:99\t\tCisco Systems, Inc\n00:3A:9A\t\tCisco Systems, Inc\n00:3A:9B\t\tCisco Systems, Inc\n00:3A:9C\t\tCisco Systems, Inc\n00:3A:9D\t\tNEC Platforms, Ltd.\n00:3A:AF\t\tBlueBit Ltd.\n00:3C:10\t\tCisco Systems, Inc\n00:3C:84\t\tSilicon Laboratories\n00:3C:C5\t\tWONWOO Engineering Co., Ltd\n00:3D:41\t\tHatteland Computer AS\n00:3D:E1\t\tHuawei Device Co., Ltd.\n00:3D:E8\t\tLG Electronics (Mobile Communications)\n00:3E:73\t\tMist Systems, Inc.\n00:3E:E1\t\tApple, Inc.\n00:3F:10\t\tShenzhen GainStrong Technology Co., Ltd.\n00:40:00\t\tPci Componentes Da Amzonia Ltd\n00:40:01\t\tZero One Technology Co. Ltd.\n00:40:02\t\tPerle Systems Limited\n00:40:03\t\tEmerson Process Management Power & Water Solutions, Inc.\n00:40:04\t\tIcm Co. Ltd.\n00:40:05\t\tAni Communications Inc.\n00:40:06\t\tSampo Technology Corporation\n00:40:07\t\tTelmat Informatique\n00:40:08\t\tA Plus Info Corporation\n00:40:09\t\tTachibana Tectron Co., Ltd.\n00:40:0A\t\tPivotal Technologies, Inc.\n00:40:0B\t\tCisco Systems, Inc\n00:40:0C\t\tGeneral Micro Systems, Inc.\n00:40:0D\t\tLannet Data Communications,Ltd\n00:40:0E\t\tMemotec, Inc.\n00:40:0F\t\tDatacom Technologies\n00:40:10\t\tSonic Systems, Inc.\n00:40:11\t\tAndover Controls Corporation\n00:40:12\t\tWindata, Inc.\n00:40:13\t\tNtt Data Comm. Systems Corp.\n00:40:14\t\tComsoft Gmbh\n00:40:15\t\tAscom Infrasys Ag\n00:40:16\t\tADC - Global Connectivity Solutions Division\n00:40:17\t\tSilex Technology America\n00:40:18\t\tAdobe Systems, Inc.\n00:40:19\t\tAeon Systems, Inc.\n00:40:1A\t\tFuji Electric Co., Ltd.\n00:40:1B\t\tPrinter Systems Corp.\n00:40:1C\t\tAst Research, Inc.\n00:40:1D\t\tInvisible Software, Inc.\n00:40:1E\t\tIcc\n00:40:1F\t\tColorgraph Ltd\n00:40:20\t\tCommScope Inc\n00:40:21\t\tRaster Graphics\n00:40:22\t\tKlever Computers, Inc.\n00:40:23\t\tLogic Corporation\n00:40:24\t\tCompac Inc.\n00:40:25\t\tMolecular Dynamics\n00:40:26\t\tBuffalo.Inc\n00:40:27\t\tSmc Massachusetts, Inc.\n00:40:28\t\tNetcomm Limited\n00:40:29\t\tCompex\n00:40:2A\t\tCanoga Perkins Corporation\n00:40:2B\t\tTrigem Computer, Inc.\n00:40:2C\t\tIsis Distributed Systems, Inc.\n00:40:2D\t\tHarris Adacom Corporation\n00:40:2E\t\tPrecision Software, Inc.\n00:40:2F\t\tXlnt Designs Inc.\n00:40:30\t\tGk Computer\n00:40:31\t\tKOKUSAI DENKI Electric Inc.\n00:40:32\t\tDigital Communications\n00:40:33\t\tAddtron Technology Co., Ltd.\n00:40:34\t\tBustek Corporation\n00:40:35\t\tOpcom\n00:40:36\t\tMinim Inc.\n00:40:37\t\tSea-Ilan, Inc.\n00:40:38\t\tTalent Electric Incorporated\n00:40:39\t\tOptec Daiichi Denko Co., Ltd.\n00:40:3A\t\tImpact Technologies\n00:40:3B\t\tSynerjet International Corp.\n00:40:3C\t\tForks, Inc.\n00:40:3D\t\tTeradata Corporation\n00:40:3E\t\tRaster Ops Corporation\n00:40:3F\t\tSsangyong Computer Systems\n00:40:40\t\tRing Access, Inc.\n00:40:41\t\tFujikura Ltd.\n00:40:42\t\tN.A.T. Gmbh\n00:40:43\t\tNokia Siemens Networks GmbH & Co. KG.\n00:40:44\t\tQnix Computer Co., Ltd.\n00:40:45\t\tTwinhead Corporation\n00:40:46\t\tUdc Research Limited\n00:40:47\t\tWind River Systems\n00:40:48\t\tSmd Informatica S.A.\n00:40:49\t\tRoche Diagnostics International Ltd.\n00:40:4A\t\tWest Australian Department\n00:40:4B\t\tMaple Computer Systems\n00:40:4C\t\tHypertec Pty Ltd.\n00:40:4D\t\tTelecommunications Techniques\n00:40:4E\t\tFluent, Inc.\n00:40:4F\t\tSpace & Naval Warfare Systems\n00:40:50\t\tIronics, Incorporated\n00:40:51\t\tGarbee and Garbee\n00:40:52\t\tStar Technologies, Inc.\n00:40:53\t\tAmpro Computers\n00:40:54\t\tConnection Machines Services\n00:40:55\t\tMetronix Gmbh\n00:40:56\t\tMcm Japan Ltd.\n00:40:57\t\tLockheed - Sanders\n00:40:58\t\tUkg\n00:40:59\t\tYoshida Kogyo K. K.\n00:40:5A\t\tGoldstar Information & Comm.\n00:40:5B\t\tFunasset Limited\n00:40:5C\t\tFuture Systems, Inc.\n00:40:5D\t\tStar-Tek, Inc.\n00:40:5E\t\tNorth Hills Israel\n00:40:5F\t\tAfe Computers Ltd.\n00:40:60\t\tComendec Ltd\n00:40:61\t\tDatatech Enterprises Co., Ltd.\n00:40:62\t\tE-Systems, Inc./Garland Div.\n00:40:63\t\tVia Technologies, Inc.\n00:40:64\t\tKla Instruments Corporation\n00:40:65\t\tGte Spacenet\n00:40:66\t\tAPRESIA Systems Ltd\n00:40:67\t\tOmnibyte Corporation\n00:40:68\t\tExtended Systems\n00:40:69\t\tLemcom Systems, Inc.\n00:40:6A\t\tKentek Information Systems,Inc\n00:40:6B\t\tSysgen\n00:40:6C\t\tCopernique\n00:40:6D\t\tLanco, Inc.\n00:40:6E\t\tCorollary, Inc.\n00:40:6F\t\tSync Research Inc.\n00:40:70\t\tInterware Co., Ltd.\n00:40:71\t\tAtm Computer Gmbh\n00:40:72\t\tApplied Innovation Inc.\n00:40:73\t\tBass Associates\n00:40:74\t\tCable And Wireless\n00:40:75\t\tTattile SRL\n00:40:76\t\tSun Conversion Technologies\n00:40:77\t\tMaxton Technology Corporation\n00:40:78\t\tWearnes Automation Pte Ltd\n00:40:79\t\tJuko Manufacture Company, Ltd.\n00:40:7A\t\tSociete D'Exploitation Du Cnit\n00:40:7B\t\tScientific Atlanta\n00:40:7C\t\tQume Corporation\n00:40:7D\t\tExtension Technology Corp.\n00:40:7E\t\tEvergreen Systems, Inc.\n00:40:7F\t\tFLIR Systems\n00:40:80\t\tAthenix Corporation\n00:40:81\t\tMannesmann Scangraphic Gmbh\n00:40:82\t\tLaboratory Equipment Corp.\n00:40:83\t\tTda Industria De Produtos\n00:40:84\t\tHoneywell\n00:40:85\t\tSaab Instruments Ab\n00:40:86\t\tMichels & Kleberhoff Computer\n00:40:87\t\tUbitrex Corporation\n00:40:88\t\tMobius Technologies, Inc.\n00:40:89\t\tMeidensha Corporation\n00:40:8A\t\tTps Teleprocessing Sys. Gmbh\n00:40:8B\t\tRaylan Corporation\n00:40:8C\t\tAxis Communications AB\n00:40:8D\t\tThe Goodyear Tire & Rubber Co.\n00:40:8E\t\tTattile SRL\n00:40:8F\t\tWm-Data Minfo Ab\n00:40:90\t\tAnsel Communications\n00:40:91\t\tProcomp Industria Eletronica\n00:40:92\t\tAsp Computer Products, Inc.\n00:40:93\t\tPaxdata Networks Ltd.\n00:40:94\t\tShographics, Inc.\n00:40:95\t\tR.P.T. Intergroups Int'L Ltd.\n00:40:96\t\tCisco Systems, Inc\n00:40:97\t\tDatex Division Of\n00:40:98\t\tDressler Gmbh & Co.\n00:40:99\t\tNewgen Systems Corp.\n00:40:9A\t\tNetwork Express, Inc.\n00:40:9B\t\tHal Computer Systems Inc.\n00:40:9C\t\tTransware\n00:40:9D\t\tDigiBoard\n00:40:9E\t\tConcurrent Technologies Ltd.\n00:40:9F\t\tTelco Systems, Inc.\n00:40:A0\t\tGoldstar Co., Ltd.\n00:40:A1\t\tErgo Computing\n00:40:A2\t\tKingstar Technology Inc.\n00:40:A3\t\tMicrounity Systems Engineering\n00:40:A4\t\tRose Electronics\n00:40:A5\t\tClinicomp Intl.\n00:40:A6\t\tCray, Inc.\n00:40:A7\t\tItautec Philco S.A.\n00:40:A8\t\tImf International Ltd.\n00:40:A9\t\tDatacom Inc.\n00:40:AA\t\tValmet Automation\n00:40:AB\t\tRoland Dg Corporation\n00:40:AC\t\tSuper Workstation, Inc.\n00:40:AD\t\tSma Regelsysteme Gmbh\n00:40:AE\t\tDelta Controls, Inc.\n00:40:AF\t\tDigital Products, Inc.\n00:40:B0\t\tBytex Corporation, Engineering\n00:40:B1\t\tCodonics Inc.\n00:40:B2\t\tSystemforschung\n00:40:B3\t\tParTech Inc.\n00:40:B4\t\tNextcom K.K.\n00:40:B5\t\tVideo Technology Computers Ltd\n00:40:B6\t\tComputerm  Corporation\n00:40:B7\t\tStealth Computer Systems\n00:40:B8\t\tIdea Associates\n00:40:B9\t\tMacq Electronique Sa\n00:40:BA\t\tAlliant Computer Systems Corp.\n00:40:BB\t\tGoldstar Cable Co., Ltd.\n00:40:BC\t\tAlgorithmics Ltd.\n00:40:BD\t\tStarlight Networks, Inc.\n00:40:BE\t\tBoeing Defense & Space\n00:40:BF\t\tChannel Systems Intern'L Inc.\n00:40:C0\t\tVista Controls Corporation\n00:40:C1\t\tBizerba-Werke Wilheim Kraut\n00:40:C2\t\tApplied Computing Devices\n00:40:C3\t\tFischer And Porter Co.\n00:40:C4\t\tKinkei System Corporation\n00:40:C5\t\tMicom Communications Inc.\n00:40:C6\t\tFibernet Research, Inc.\n00:40:C7\t\tRuby Tech Corporation\n00:40:C8\t\tMilan Technology Corporation\n00:40:C9\t\tNcube\n00:40:CA\t\tFirst Internat'L Computer, Inc\n00:40:CB\t\tLanwan Technologies\n00:40:CC\t\tSilcom Manuf'G Technology Inc.\n00:40:CD\t\tTera Microsystems, Inc.\n00:40:CE\t\tNet-Source, Inc.\n00:40:CF\t\tStrawberry Tree, Inc.\n00:40:D0\t\tMitac International Corp.\n00:40:D1\t\tFukuda Denshi Co., Ltd.\n00:40:D2\t\tPagine Corporation\n00:40:D3\t\tKimpsion International Corp.\n00:40:D4\t\tGage Talker Corp.\n00:40:D5\t\tSartorius Mechatronics T&H GmbH\n00:40:D6\t\tLocamation B.V.\n00:40:D7\t\tStudio Gen Inc.\n00:40:D8\t\tOcean Office Automation Ltd.\n00:40:D9\t\tAmerican Megatrends Inc.\n00:40:DA\t\tTelspec Ltd\n00:40:DB\t\tAdvanced Technical Solutions\n00:40:DC\t\tTritec Electronic Gmbh\n00:40:DD\t\tHong Technologies\n00:40:DE\t\tElsag Datamat spa\n00:40:DF\t\tDigalog Systems, Inc.\n00:40:E0\t\tAtomwide Ltd.\n00:40:E1\t\tMarner International, Inc.\n00:40:E2\t\tMesa Ridge Technologies, Inc.\n00:40:E3\t\tQuin Systems Ltd\n00:40:E4\t\tE-M Technology, Inc.\n00:40:E5\t\tSybus Corporation\n00:40:E6\t\tC.A.E.N.\n00:40:E7\t\tArnos Instruments & Computer\n00:40:E8\t\tCharles River Data Systems,Inc\n00:40:E9\t\tAccord Systems, Inc.\n00:40:EA\t\tPlain Tree Systems Inc\n00:40:EB\t\tMartin Marietta Corporation\n00:40:EC\t\tMikasa System Engineering\n00:40:ED\t\tNetwork Controls Int'Natl Inc.\n00:40:EE\t\tOptimem\n00:40:EF\t\tHypercom, Inc.\n00:40:F0\t\tMicroBrain,Inc.\n00:40:F1\t\tChuo Electronics Co., Ltd.\n00:40:F2\t\tJanich & Klass Computertechnik\n00:40:F3\t\tNetcor\n00:40:F4\t\tCameo Communications, Inc.\n00:40:F5\t\tOem Engines\n00:40:F6\t\tKatron Computers Inc.\n00:40:F7\t\tPolaroid Corporation\n00:40:F8\t\tSystemhaus Discom\n00:40:F9\t\tCombinet\n00:40:FA\t\tMicroboards, Inc.\n00:40:FB\t\tCascade Communications\n00:40:FC\t\tIbr Computer Technik Gmbh\n00:40:FD\t\tLxe\n00:40:FE\t\tSymplex Communications\n00:40:FF\t\tTelebit Corporation\n00:41:0E\t\tCloud Network Technology Singapore Pte. Ltd.\n00:41:B4\t\tWuxi Zhongxing Optoelectronics Technology Co.,Ltd.\n00:41:D2\t\tCisco Systems, Inc\n00:42:38\t\tIntel Corporate\n00:42:52\t\tRLX Technologies\n00:42:5A\t\tCisco Systems, Inc\n00:42:68\t\tCisco Systems, Inc\n00:42:79\t\tSunitec Enterprise Co.,Ltd\n00:43:FF\t\tKetron S.R.L.\n00:45:01\t\tMidmark RTLS\n00:45:1D\t\tCisco Systems, Inc\n00:45:E2\t\tCyberTAN Technology Inc.\n00:46:4B\t\tHuawei Technologies Co.,Ltd\n00:4A:77\t\tzte corporation\n00:4B:0D\t\tHuawei Device Co., Ltd.\n00:4B:12\t\tEspressif Inc.\n00:4B:F3\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\n00:4C:E5\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n00:4D:32\t\tAndon Health Co.,Ltd.\n00:4E:01\t\tDell Inc.\n00:4E:35\t\tHewlett Packard Enterprise\n00:4F:1A\t\tHuawei Technologies Co.,Ltd\n00:50:00\t\tNexo Communications, Inc.\n00:50:01\t\tYamashita Systems Corp.\n00:50:02\t\tOmnisec Ag\n00:50:03\t\tXrite Inc\n00:50:04\t\t3Com\n00:50:06\t\tTac Ab\n00:50:07\t\tSiemens Telecommunication Systems Limited\n00:50:08\t\tTiva Microcomputer Corp. (Tmc)\n00:50:09\t\tPhilips Broadband Networks\n00:50:0A\t\tIris Technologies, Inc.\n00:50:0B\t\tCisco Systems, Inc\n00:50:0C\t\te-Tek Labs, Inc.\n00:50:0D\t\tSatori Electoric Co., Ltd.\n00:50:0E\t\tChromatis Networks, Inc.\n00:50:0F\t\tCisco Systems, Inc\n00:50:10\t\tNovaNET Learning, Inc.\n00:50:12\t\tCbl - Gmbh\n00:50:13\t\tSeagate Cloud Systems Inc\n00:50:14\t\tCisco Systems, Inc\n00:50:15\t\tBright Star Engineering\n00:50:16\t\tMolex Canada Ltd\n00:50:17\t\tRsr S.R.L.\n00:50:18\t\tAMIT, Inc.\n00:50:19\t\tSpring Tide Networks, Inc.\n00:50:1A\t\tIQinVision\n00:50:1B\t\tAbl Canada, Inc.\n00:50:1C\t\tJatom Systems, Inc.\n00:50:1E\t\tGrass Valley, A Belden Brand\n00:50:1F\t\tMrg Systems, Ltd.\n00:50:20\t\tMediastar Co., Ltd.\n00:50:21\t\tEis International, Inc.\n00:50:22\t\tZonet Technology, Inc.\n00:50:23\t\tPg Design Electronics, Inc.\n00:50:24\t\tNavic Systems, Inc.\n00:50:26\t\tCosystems, Inc.\n00:50:27\t\tGenicom Corporation\n00:50:28\t\tAval Communications\n00:50:29\t\t1394 Printer Working Group\n00:50:2A\t\tCisco Systems, Inc\n00:50:2B\t\tGenrad Ltd.\n00:50:2C\t\tSoyo Computer, Inc.\n00:50:2D\t\tAccel, Inc.\n00:50:2E\t\tCambex Corporation\n00:50:2F\t\tTollBridge Technologies, Inc.\n00:50:30\t\tFuture Plus Systems\n00:50:31\t\tAeroflex Laboratories, Inc.\n00:50:32\t\tPicazo Communications, Inc.\n00:50:33\t\tMayan Networks\n00:50:36\t\tNetcam, Ltd.\n00:50:37\t\tKoga Electronics Co.\n00:50:38\t\tDain Telecom Co., Ltd.\n00:50:39\t\tMariner Networks\n00:50:3A\t\tDatong Electronics Ltd.\n00:50:3B\t\tMediafire Corporation\n00:50:3C\t\tTsinghua Novel Electronics\n00:50:3E\t\tCisco Systems, Inc\n00:50:3F\t\tAnchor Games\n00:50:40\t\tPanasonic Electric Works Co., Ltd.\n00:50:41\t\tCoretronic Corporation\n00:50:42\t\tSci Manufacturing Singapore Pte, Ltd.\n00:50:43\t\tMarvell Semiconductor, Inc.\n00:50:44\t\tAsaca Corporation\n00:50:45\t\tRioworks Solutions, Inc.\n00:50:46\t\tMenicx International Co., Ltd.\n00:50:47\t\tPrivate\n00:50:48\t\tInfolibria\n00:50:49\t\tArbor Networks Inc\n00:50:4A\t\tElteco A.S.\n00:50:4B\t\tBarconet N.V.\n00:50:4C\t\tGalil Motion Control\n00:50:4D\t\tTokyo Electron Device Limited\n00:50:4E\t\tSierra Monitor Corp.\n00:50:4F\t\tOlencom Electronics\n00:50:50\t\tCisco Systems, Inc\n00:50:51\t\tIwatsu Electric Co., Ltd.\n00:50:52\t\tTiara Networks, Inc.\n00:50:53\t\tCisco Systems, Inc\n00:50:54\t\tCisco Systems, Inc\n00:50:55\t\tDoms A/S\n00:50:56\t\tVMware, Inc.\n00:50:57\t\tBroadband Access Systems\n00:50:58\t\tSangoma Technologies\n00:50:59\t\tiBAHN\n00:50:5A\t\tNetwork Alchemy, Inc.\n00:50:5B\t\tKawasaki Lsi U.S.A., Inc.\n00:50:5C\t\tTundo Corporation\n00:50:5E\t\tDigitek Micrologic S.A.\n00:50:5F\t\tBrand Innovators\n00:50:60\t\tTandberg Telecom As\n00:50:62\t\tKouwell Electronics Corp.  **\n00:50:63\t\tOy Comsel System Ab\n00:50:64\t\tCae Electronics\n00:50:65\t\tTDK-Lambda Corporation\n00:50:66\t\tAtecoM GmbH advanced telecomunication modules\n00:50:67\t\tAerocomm, Inc.\n00:50:68\t\tElectronic Industries Association\n00:50:69\t\tPixStream Incorporated\n00:50:6A\t\tEdeva, Inc.\n00:50:6B\t\tSpx-Ateg\n00:50:6C\t\tBeijer Electronics Products AB\n00:50:6D\t\tVideojet Systems\n00:50:6E\t\tCorder Engineering Corporation\n00:50:6F\t\tG-Connect\n00:50:70\t\tChaintech Computer Co., Ltd.\n00:50:71\t\tAiwa Co., Ltd.\n00:50:72\t\tCorvis Corporation\n00:50:73\t\tCisco Systems, Inc\n00:50:74\t\tAdvanced Hi-Tech Corp.\n00:50:75\t\tKestrel Solutions\n00:50:76\t\tIBM Corp\n00:50:77\t\tProlific Technology, Inc.\n00:50:78\t\tMegaton House, Ltd.\n00:50:79\t\tPrivate\n00:50:7A\t\tXpeed, Inc.\n00:50:7B\t\tMerlot Communications\n00:50:7C\t\tVideocon Ag\n00:50:7D\t\tIfp\n00:50:7E\t\tNewer Technology\n00:50:7F\t\tDrayTek Corp.\n00:50:80\t\tCisco Systems, Inc\n00:50:81\t\tMurata Machinery, Ltd.\n00:50:82\t\tForesson Corporation\n00:50:83\t\tGilbarco, Inc.\n00:50:84\t\tQuantum Corp.\n00:50:86\t\tTelkom Sa, Ltd.\n00:50:87\t\tTerasaki Electric Co., Ltd.\n00:50:88\t\tAmano Corporation\n00:50:89\t\tSafety Management Systems\n00:50:8B\t\tHewlett Packard\n00:50:8C\t\tRsi Systems\n00:50:8D\t\tAbit Computer Corporation\n00:50:8E\t\tOptimation, Inc.\n00:50:8F\t\tAsita Technologies Int'L Ltd.\n00:50:90\t\tDctri\n00:50:91\t\tNetaccess, Inc.\n00:50:92\t\tRigaku Corporation Osaka Plant\n00:50:93\t\tBoeing\n00:50:94\t\tCommscope\n00:50:95\t\tPeracom Networks\n00:50:96\t\tSalix Technologies, Inc.\n00:50:97\t\tMMC-EMBEDDED COMPUTERTECHNIK GmbH\n00:50:98\t\tGlobaloop, Ltd.\n00:50:99\t\t3Com Europe Ltd\n00:50:9A\t\tTag Electronic Systems\n00:50:9B\t\tSwitchcore Ab\n00:50:9C\t\tBeta Research\n00:50:9D\t\tThe Industree B.V.\n00:50:9E\t\tLes Technologies SoftAcoustik Inc.\n00:50:9F\t\tHorizon Computer\n00:50:A0\t\tDelta Computer Systems, Inc.\n00:50:A1\t\tCarlo Gavazzi, Inc.\n00:50:A2\t\tCisco Systems, Inc\n00:50:A3\t\tTransMedia Communications, Inc.\n00:50:A4\t\tIo Tech, Inc.\n00:50:A5\t\tCapitol Business Systems, Ltd.\n00:50:A6\t\tOptronics\n00:50:A7\t\tCisco Systems, Inc\n00:50:A8\t\tOpenCon Systems, Inc.\n00:50:A9\t\tMoldat Wireless Technolgies\n00:50:AA\t\tKonica Minolta Holdings, Inc.\n00:50:AB\t\tNALTEC, Inc.\n00:50:AC\t\tMaple Computer Corporation\n00:50:AD\t\tCommUnique Wireless Corp.\n00:50:AE\t\tFDK Co., Ltd\n00:50:AF\t\tIntergon, Inc.\n00:50:B0\t\tTechnology Atlanta Corporation\n00:50:B1\t\tGiddings & Lewis\n00:50:B2\t\tBRODEL GmbH\n00:50:B3\t\tVoiceboard Corporation\n00:50:B4\t\tSatchwell Control Systems, Ltd\n00:50:B5\t\tFichet Securite Electronique\n00:50:B6\t\tGood Way Ind. Co., Ltd.\n00:50:B7\t\tBoser Technology Co., Ltd.\n00:50:B8\t\tInova Computers Gmbh & Co. Kg\n00:50:B9\t\tXitron Technologies, Inc.\n00:50:BA\t\tD-Link Corporation\n00:50:BB\t\tCms Technologies\n00:50:BC\t\tHammer Storage Solutions\n00:50:BD\t\tCisco Systems, Inc\n00:50:BE\t\tFast Multimedia Ag\n00:50:BF\t\tMetalligence Technology Corp.\n00:50:C0\t\tGatan, Inc.\n00:50:C1\t\tGemflex Networks, Ltd.\n00:50:C2\t\tIEEE Registration Authority\n00:50:C2:00:00:00/36\tT.L.S. Corp.\n00:50:C2:00:10:00/36\tJMBS Developpements\n00:50:C2:00:20:00/36\tIntegrated Automation Solutions\n00:50:C2:00:30:00/36\tMicrosoft\n00:50:C2:00:40:00/36\tSCI Technology Inc.\n00:50:C2:00:50:00/36\tGD California, Inc.\n00:50:C2:00:60:00/36\tProject Management Enterprises, Inc.\n00:50:C2:00:70:00/36\tClive Green & Co. Ltd.\n00:50:C2:00:80:00/36\tPortable Add-Ons\n00:50:C2:00:90:00/36\tDatakinetics Ltd.\n00:50:C2:00:A0:00/36\tTharsys\n00:50:C2:00:B0:00/36\tIO Limited\n00:50:C2:00:C0:00/36\tVbrick Systems Inc.\n00:50:C2:00:D0:00/36\tOpus Telecom Inc.\n00:50:C2:00:E0:00/36\tTTTech\n00:50:C2:00:F0:00/36\tXLN-t\n00:50:C2:01:00:00/36\tMoisture Systems\n00:50:C2:01:10:00/36\tBihl + Wiedemann GmbH\n00:50:C2:01:20:00/36\tFloware System Solutions Ltd.\n00:50:C2:01:30:00/36\tSensys Technologies Inc.\n00:50:C2:01:40:00/36\tCanal +\n00:50:C2:01:50:00/36\tLeroy Automation\n00:50:C2:01:60:00/36\tDSP Design Ltd.\n00:50:C2:01:70:00/36\tHunter Technology Inc.\n00:50:C2:01:80:00/36\tCAD-UL GmbH\n00:50:C2:01:90:00/36\tEmtac Technology Corp.\n00:50:C2:01:A0:00/36\tSkylake Talix\n00:50:C2:01:B0:00/36\tCross Products Ltd.\n00:50:C2:01:C0:00/36\tTadiran Scopus\n00:50:C2:01:D0:00/36\tPrinceton Gamma Tech\n00:50:C2:01:E0:00/36\tCallTech International Limited\n00:50:C2:01:F0:00/36\tKBS Industrieelektronik GmbH\n00:50:C2:02:00:00/36\tIcon Research Ltd.\n00:50:C2:02:10:00/36\tDRS Technologies Canada Co.\n00:50:C2:02:20:00/36\tAshling Microsystems Ltd.\n00:50:C2:02:30:00/36\tZabacom, Inc.\n00:50:C2:02:40:00/36\tIpitek\n00:50:C2:02:50:00/36\tTeracom Telematica S.A\n00:50:C2:02:60:00/36\tAbatis Systems Corp.\n00:50:C2:02:70:00/36\tIndustrial Control Links\n00:50:C2:02:80:00/36\tThe Frensch Corporation (Pty) Ltd.\n00:50:C2:02:90:00/36\tGrossenbacher Systeme AG\n00:50:C2:02:A0:00/36\tVersaLogic Corp.\n00:50:C2:02:B0:00/36\tNova Engineering Inc.\n00:50:C2:02:C0:00/36\tNarrowband Telecommunications\n00:50:C2:02:D0:00/36\tInnocor LTD\n00:50:C2:02:E0:00/36\tTurtle Mountain Corp\n00:50:C2:02:F0:00/36\tSinetica Corp\n00:50:C2:03:00:00/36\tLockheed Martin Tactical Defense Systems Eagan\n00:50:C2:03:10:00/36\tEloquence Ltd\n00:50:C2:03:20:00/36\tMotionIO\n00:50:C2:03:30:00/36\tDoble Engineering\n00:50:C2:03:40:00/36\tIng. Buero W. Kanis GmbH\n00:50:C2:03:50:00/36\tAlliant Techsystems, Inc.\n00:50:C2:03:60:00/36\tArcturus Networks Inc.\n00:50:C2:03:70:00/36\tE.I.S.M.\n00:50:C2:03:80:00/36\tEtheira Technologies\n00:50:C2:03:90:00/36\tApex Signal Corp\n00:50:C2:03:A0:00/36\tPLLB Elettronica SPA\n00:50:C2:03:B0:00/36\tVNR Electronique SA\n00:50:C2:03:C0:00/36\tBrainBoxes Ltd\n00:50:C2:03:D0:00/36\tISDN Gateway Technology AG\n00:50:C2:03:E0:00/36\tMSU UK Ltd\n00:50:C2:03:F0:00/36\tCelotek Corp\n00:50:C2:04:00:00/36\tMiSPO Co., Ltd.\n00:50:C2:04:10:00/36\tDamler Chrysler Rail System (Signal) AB\n00:50:C2:04:20:00/36\tB.E.A.R. Solutions (Australasia) Pty, Ltd\n00:50:C2:04:30:00/36\tCurtis, Inc.\n00:50:C2:04:40:00/36\tPrivate\n00:50:C2:04:50:00/36\tChase Manhattan Bank\n00:50:C2:04:60:00/36\tPrivate\n00:50:C2:04:70:00/36\tB. R. Electronics\n00:50:C2:04:80:00/36\tCybectec Inc.\n00:50:C2:04:90:00/36\tComputer Concepts Corp\n00:50:C2:04:A0:00/36\tTelecom Analysis Systems, LP\n00:50:C2:04:B0:00/36\tTecstar Demo Systems Division\n00:50:C2:04:C0:00/36\tNew Standard Engineering NV\n00:50:C2:04:E0:00/36\tIndustrial Electronic Engineers, Inc.\n00:50:C2:04:F0:00/36\tLuma Corporation\n00:50:C2:05:00:00/36\tDataprobe, Inc.\n00:50:C2:05:10:00/36\tJSR Ultrasonics\n00:50:C2:05:20:00/36\tMayo Foundation\n00:50:C2:05:40:00/36\tOptionexist Limited\n00:50:C2:05:50:00/36\tSan Castle Technologies, Inc.\n00:50:C2:05:60:00/36\tBase 2\n00:50:C2:05:70:00/36\tLite F GmBH\n00:50:C2:05:80:00/36\tVision Research, Inc.\n00:50:C2:05:90:00/36\tAustco Marketing & Service (USA) ltd.\n00:50:C2:05:A0:00/36\tSonifex Ltd\n00:50:C2:05:B0:00/36\tRadiometer Medical A/S\n00:50:C2:05:C0:00/36\tNortel Networks PLC (UK)\n00:50:C2:05:D0:00/36\tIgnitus Communications, LLC\n00:50:C2:05:E0:00/36\tDIVA Systems\n00:50:C2:05:F0:00/36\tMalden Electronics Ltd\n00:50:C2:06:00:00/36\tPrivate\n00:50:C2:06:10:00/36\tSimple Network Magic Corporation\n00:50:C2:06:20:00/36\tPrivate\n00:50:C2:06:30:00/36\tTicketmaster Corp\n00:50:C2:06:40:00/36\tPrivate\n00:50:C2:06:50:00/36\tClever Devices\n00:50:C2:06:60:00/36\tPrivate\n00:50:C2:06:70:00/36\tRiverlink Computers, Ltd.\n00:50:C2:06:80:00/36\tSeabridge\n00:50:C2:06:90:00/36\tEC Elettronica S.R.L.\n00:50:C2:06:A0:00/36\tUnimark\n00:50:C2:06:B0:00/36\tNCast Corporation\n00:50:C2:06:C0:00/36\tWaveCom Electronics, Inc.\n00:50:C2:06:D0:00/36\tAdvanced Signal Corp.\n00:50:C2:06:E0:00/36\tAvtron Manufacturing Inc.\n00:50:C2:06:F0:00/36\tDigital Services Group\n00:50:C2:07:00:00/36\tKatchall Technologies Group\n00:50:C2:07:10:00/36\tNetVision Telecom\n00:50:C2:07:20:00/36\tNeuberger Gebaeudeautomation GmbH & Co.\n00:50:C2:07:30:00/36\tAlstom Signalling Ltd.\n00:50:C2:07:40:00/36\tEdge Tech Co., Ltd.\n00:50:C2:07:50:00/36\tENTTEC Pty Ltd.\n00:50:C2:07:60:00/36\tLitton Guidance & Control Systems\n00:50:C2:07:70:00/36\tSaco Smartvision Inc.\n00:50:C2:07:80:00/36\tReselec AG\n00:50:C2:07:90:00/36\tFlextel S.p.A\n00:50:C2:07:A0:00/36\tRadioTel\n00:50:C2:07:B0:00/36\tTrikon Technologies Ltd.\n00:50:C2:07:C0:00/36\tPLLB elettronica spa\n00:50:C2:07:D0:00/36\tCaspian Networks\n00:50:C2:07:E0:00/36\tJL-teknik\n00:50:C2:07:F0:00/36\tDunti Corporation\n00:50:C2:08:00:00/36\tAim\n00:50:C2:08:10:00/36\tMatuschek Messtechnik GmbH\n00:50:C2:08:20:00/36\tGFI Chrono Time\n00:50:C2:08:30:00/36\tard sa\n00:50:C2:08:40:00/36\tDIALOG4 System Engineering GmbH\n00:50:C2:08:50:00/36\tCrossport Systems\n00:50:C2:08:60:00/36\tValidyne Engineering Corp.\n00:50:C2:08:70:00/36\tMonitor Business Machines Ltd.\n00:50:C2:08:80:00/36\tTELINC Corporation\n00:50:C2:08:90:00/36\tFenwal Italia S.P.A.\n00:50:C2:08:A0:00/36\tRising Edge Technologies\n00:50:C2:08:B0:00/36\tHYPERCHIP Inc.\n00:50:C2:08:C0:00/36\tIP Unity\n00:50:C2:08:D0:00/36\tKylink Communications Corp.\n00:50:C2:08:E0:00/36\tBsquare\n00:50:C2:08:F0:00/36\tGeneral Industries Argentina\n00:50:C2:09:00:00/36\tInvensys Controls Network Systems\n00:50:C2:09:10:00/36\tStorLogic, Inc.\n00:50:C2:09:20:00/36\tDigitAll World Co., Ltd\n00:50:C2:09:30:00/36\tKorealink\n00:50:C2:09:40:00/36\tAnalytical Spectral Devices, Inc.\n00:50:C2:09:50:00/36\tSeatech\n00:50:C2:09:60:00/36\tUtronix Elektronikutreckling AB\n00:50:C2:09:70:00/36\tIMV Invertomatic\n00:50:C2:09:80:00/36\tEPEL Industrial, S.A.\n00:50:C2:09:90:00/36\tCase Information & Communications\n00:50:C2:09:A0:00/36\tNBO Development Center Sekusui Chemical Co. Ltd.\n00:50:C2:09:B0:00/36\tSeffle Instrument AB\n00:50:C2:09:C0:00/36\tRF Applications, Inc.\n00:50:C2:09:D0:00/36\tZelpos\n00:50:C2:09:E0:00/36\tInfinitec Networks, Inc.\n00:50:C2:09:F0:00/36\tMetaWave Vedeo Systems\n00:50:C2:0A:00:00/36\tCynaps\n00:50:C2:0A:10:00/36\tVisable Genetics, Inc.\n00:50:C2:0A:20:00/36\tJäger Computergesteuerte Meßtechnik GmbH.\n00:50:C2:0A:30:00/36\tBaSyTec GmbH\n00:50:C2:0A:40:00/36\tBounty Systems Pty Ltd.\n00:50:C2:0A:50:00/36\tMobiltex Data Ltd.\n00:50:C2:0A:60:00/36\tArula Systems, Inc.\n00:50:C2:0A:70:00/36\tWaterCove Networks\n00:50:C2:0A:80:00/36\tKaveri Networks\n00:50:C2:0A:90:00/36\tRadiant Networks Plc\n00:50:C2:0A:A0:00/36\tLog-In, Inc.\n00:50:C2:0A:B0:00/36\tFastware.Net, LLC\n00:50:C2:0A:C0:00/36\tHoneywell GNO\n00:50:C2:0A:D0:00/36\tBMC Messsysteme GmbH\n00:50:C2:0A:E0:00/36\tZarak Systems Corp.\n00:50:C2:0A:F0:00/36\tLatus Lightworks, Inc.\n00:50:C2:0B:00:00/36\tLMI Technologies\n00:50:C2:0B:10:00/36\tBeeline Networks, Inc.\n00:50:C2:0B:20:00/36\tR F Micro Devices\n00:50:C2:0B:30:00/36\tSMX Corporation\n00:50:C2:0B:40:00/36\tWavefly Corporation\n00:50:C2:0B:50:00/36\tExtreme Copper,  Inc.\n00:50:C2:0B:60:00/36\tApSecure Technologies (Canada), Inc.\n00:50:C2:0B:70:00/36\tRymic\n00:50:C2:0B:80:00/36\tLAN Controls, Inc.\n00:50:C2:0B:90:00/36\tHelmut Mauell GmbH Werk Weida\n00:50:C2:0B:A0:00/36\tPro-Active\n00:50:C2:0B:B0:00/36\tMAZet GmbH\n00:50:C2:0B:C0:00/36\tInfolink Software AG\n00:50:C2:0B:D0:00/36\tTattile\n00:50:C2:0B:E0:00/36\tStella Electronics & Tagging\n00:50:C2:0B:F0:00/36\tPrivate\n00:50:C2:0C:00:00/36\tImigix Ltd.\n00:50:C2:0C:10:00/36\tCasabyte\n00:50:C2:0C:20:00/36\tAlchemy Semiconductor, Inc.\n00:50:C2:0C:30:00/36\tTonbu, Inc.\n00:50:C2:0C:40:00/36\tInterEpoch Technology,INC.\n00:50:C2:0C:50:00/36\tSAIA Burgess Controls AG\n00:50:C2:0C:60:00/36\tAdvanced Medical Information Technologies, Inc.\n00:50:C2:0C:70:00/36\tTransComm Technology System, Inc.\n00:50:C2:0C:80:00/36\tThe Trane Company\n00:50:C2:0C:90:00/36\tDSS Networks, Inc.\n00:50:C2:0C:A0:00/36\tJ D Richards\n00:50:C2:0C:B0:00/36\tStudiel\n00:50:C2:0C:C0:00/36\tAlphaMedia Co., Ltd\n00:50:C2:0C:D0:00/36\tLinet Oy\n00:50:C2:0C:E0:00/36\tRFL Electronics, Inc.\n00:50:C2:0C:F0:00/36\tPcsc\n00:50:C2:0D:00:00/36\tTelefrang AB\n00:50:C2:0D:10:00/36\tRenaissance Networking, Inc.\n00:50:C2:0D:20:00/36\tReal World Computing Partnership\n00:50:C2:0D:30:00/36\tLake Technology, Ltd.\n00:50:C2:0D:40:00/36\tPalm, Inc.\n00:50:C2:0D:50:00/36\tZelax\n00:50:C2:0D:60:00/36\tInco Startec GmbH\n00:50:C2:0D:70:00/36\tSummit Avionics, Inc.\n00:50:C2:0D:80:00/36\tCharlotte's Web Networks\n00:50:C2:0D:90:00/36\tLoewe Opta GmbH\n00:50:C2:0D:A0:00/36\tMotion Analysis Corp.\n00:50:C2:0D:B0:00/36\tCyberex\n00:50:C2:0D:C0:00/36\tElbit Systems Ltd.\n00:50:C2:0D:D0:00/36\tInterisa Electronica, S.A.\n00:50:C2:0D:E0:00/36\tFrederick Engineering\n00:50:C2:0D:F0:00/36\tInnovation Institute, Inc.\n00:50:C2:0E:00:00/36\tEMAC, Inc.\n00:50:C2:0E:10:00/36\tInspiration Technology P/L\n00:50:C2:0E:20:00/36\tVisual Circuits Corp.\n00:50:C2:0E:30:00/36\tLanex S.A.\n00:50:C2:0E:40:00/36\tCollabo Tec. Co., Ltd.\n00:50:C2:0E:50:00/36\tClearwater Networks\n00:50:C2:0E:60:00/36\tRouteFree, Inc.\n00:50:C2:0E:70:00/36\tCentury Geophysical Corp.\n00:50:C2:0E:80:00/36\tAudio Design Associates, Inc.\n00:50:C2:0E:90:00/36\tSmartmedia LLC\n00:50:C2:0E:A0:00/36\tiReady Corporation\n00:50:C2:0E:B0:00/36\tiREZ Technologies LLC\n00:50:C2:0E:C0:00/36\tKeith & Koep GmbH\n00:50:C2:0E:D0:00/36\tValley Products Corporation\n00:50:C2:0E:E0:00/36\tIndustrial Indexing Systems, Inc.\n00:50:C2:0E:F0:00/36\tMovaz Networks, Inc.\n00:50:C2:0F:00:00/36\tVHB Technologies, Inc.\n00:50:C2:0F:10:00/36\tSteelcase Inc.\n00:50:C2:0F:20:00/36\tKMS Systems, Inc.\n00:50:C2:0F:30:00/36\tYoung Computer Co., Ltd.\n00:50:C2:0F:40:00/36\tSysnet Co., Ltd.\n00:50:C2:0F:50:00/36\tSpectra Technologies Holding Co., Ltd.\n00:50:C2:0F:60:00/36\tCarl Baasel Lasertechnik GmbH\n00:50:C2:0F:70:00/36\tFoss NIRSystems, Inc.\n00:50:C2:0F:80:00/36\tTecnint HTE SRL\n00:50:C2:0F:90:00/36\tRaven Industries Inc.\n00:50:C2:0F:A0:00/36\tGE Transportation Systems\n00:50:C2:0F:B0:00/36\tPIUSYS Co., Ltd.\n00:50:C2:0F:C0:00/36\tKimmon Manufacturing Co., Ltd.\n00:50:C2:0F:D0:00/36\tInducomp Corporation\n00:50:C2:0F:E0:00/36\tEnergy ICT\n00:50:C2:0F:F0:00/36\tIPAXS Corporation\n00:50:C2:10:00:00/36\tCorelatus A.B.\n00:50:C2:10:10:00/36\tLAUD Electronic Design AS\n00:50:C2:10:20:00/36\tMillion Tech Development Ltd.\n00:50:C2:10:30:00/36\tGreen Hills Software, Inc.\n00:50:C2:10:40:00/36\tAdescom Inc.\n00:50:C2:10:50:00/36\tLumentis AB\n00:50:C2:10:60:00/36\tMatsuoka\n00:50:C2:10:70:00/36\tNewHer Systems\n00:50:C2:10:80:00/36\tBalogh S.A.\n00:50:C2:10:90:00/36\tITK Dr. Kassen GmbH\n00:50:C2:10:A0:00/36\tQuinx AG\n00:50:C2:10:B0:00/36\tMarekMicro GmbH\n00:50:C2:10:C0:00/36\tPhotonic Bridges, Inc.\n00:50:C2:10:D0:00/36\tImplementa GmbH\n00:50:C2:10:E0:00/36\tUnipower AB\n00:50:C2:10:F0:00/36\tPerceptics Corp.\n00:50:C2:11:00:00/36\tQuesCom\n00:50:C2:11:10:00/36\tEndusis Limited\n00:50:C2:11:20:00/36\tCompuworx\n00:50:C2:11:30:00/36\tAce Electronics, Inc.\n00:50:C2:11:40:00/36\tQuest Innovations\n00:50:C2:11:50:00/36\tVidco, Inc.\n00:50:C2:11:60:00/36\tDSP Design, Ltd.\n00:50:C2:11:70:00/36\tWintegra Ltd.\n00:50:C2:11:80:00/36\tMicrobit 2.0 AB\n00:50:C2:11:90:00/36\tGlobal Opto Communication Tech. Corp\n00:50:C2:11:A0:00/36\tTeamaxess Ticketing GmbH\n00:50:C2:11:B0:00/36\tDigital Vision AB\n00:50:C2:11:C0:00/36\tStonefly Networks\n00:50:C2:11:D0:00/36\tDestiny Networks, Inc.\n00:50:C2:11:E0:00/36\tVolvo Car Corporation\n00:50:C2:11:F0:00/36\tCSS Industrie Computer GmbH\n00:50:C2:12:00:00/36\tXStore, Inc.\n00:50:C2:12:10:00/36\tCOE Limited\n00:50:C2:12:20:00/36\tDiva Systems\n00:50:C2:12:30:00/36\tSeranoa Networks, Inc.\n00:50:C2:12:40:00/36\tTokai Soft Corporation\n00:50:C2:12:50:00/36\tTecwings GmBh\n00:50:C2:12:60:00/36\tMaxLinear Hispania S.L.U.\n00:50:C2:12:70:00/36\tTPA Traffic & Parking Automation BV\n00:50:C2:12:80:00/36\tPycon, Inc.\n00:50:C2:12:90:00/36\tTTPCom Ltd.\n00:50:C2:12:A0:00/36\tSymbolic Sound Corp.\n00:50:C2:12:B0:00/36\tDong A Eltek Co., Ltd.\n00:50:C2:12:C0:00/36\tDelta Tau Data Systems, Inc.\n00:50:C2:12:D0:00/36\tMegisto Systems, Inc.\n00:50:C2:12:E0:00/36\tRuncom\n00:50:C2:12:F0:00/36\tHaag-Streit AG\n00:50:C2:13:00:00/36\tU.S. Traffic Corporation\n00:50:C2:13:10:00/36\tInBus Engineering, Inc.\n00:50:C2:13:20:00/36\tProcon Electronics\n00:50:C2:13:30:00/36\tChipWrights, Inc.\n00:50:C2:13:40:00/36\tDRS Photronics\n00:50:C2:13:50:00/36\tElad Srl\n00:50:C2:13:60:00/36\tTensilica, Inc.\n00:50:C2:13:70:00/36\tUniwell Systems (UK) Ltd.\n00:50:C2:13:80:00/36\tDelphin Technology AG\n00:50:C2:13:90:00/36\tSr Research Ltd\n00:50:C2:13:A0:00/36\tTex Computer SRL\n00:50:C2:13:B0:00/36\tVaisala Oyj\n00:50:C2:13:C0:00/36\tNBG Industrial Automation B.V.\n00:50:C2:13:D0:00/36\tFormula One Management Ltd.\n00:50:C2:13:E0:00/36\tAVerMedia Systems, Inc.\n00:50:C2:13:F0:00/36\tSentito Networks\n00:50:C2:14:00:00/36\tITS, Inc.\n00:50:C2:14:10:00/36\tTime Terminal Adductor Group AB\n00:50:C2:14:20:00/36\tInstrumeter A/S\n00:50:C2:14:30:00/36\tAartesys Ag\n00:50:C2:14:40:00/36\tPhytec Messtechnik GmbH\n00:50:C2:14:50:00/36\tELC Lighting\n00:50:C2:14:60:00/36\tAPCON, Inc.\n00:50:C2:14:70:00/36\tUniSUR\n00:50:C2:14:80:00/36\tAlltec GmbH\n00:50:C2:14:90:00/36\tHaag-Streit AG\n00:50:C2:14:A0:00/36\tDycec, S.A.\n00:50:C2:14:B0:00/36\tHECUBA Elektronik\n00:50:C2:14:C0:00/36\tOptibase Ltd.\n00:50:C2:14:D0:00/36\twellink, Ltd.\n00:50:C2:14:E0:00/36\tCorinex Global\n00:50:C2:14:F0:00/36\tTelephonics Corp.\n00:50:C2:15:00:00/36\tTorse\n00:50:C2:15:10:00/36\tRedux Communications Ltd.\n00:50:C2:15:20:00/36\tAirVast Technology Inc.\n00:50:C2:15:30:00/36\tAdvanced Devices SpA\n00:50:C2:15:40:00/36\tJostra AB\n00:50:C2:15:50:00/36\tEnea Real Time AB\n00:50:C2:15:60:00/36\tCommServ Solutions Inc.\n00:50:C2:15:70:00/36\tnCore, Inc.\n00:50:C2:15:80:00/36\tCommunication Solutions, Inc.\n00:50:C2:15:90:00/36\tStandard Comm. Corp.\n00:50:C2:15:A0:00/36\tPlextek Limited\n00:50:C2:15:B0:00/36\tDune Networks\n00:50:C2:15:C0:00/36\tAoptix Technologies\n00:50:C2:15:D0:00/36\tCepheid\n00:50:C2:15:E0:00/36\tCelite Systems, Inc.\n00:50:C2:15:F0:00/36\tPulsar GmbH\n00:50:C2:16:00:00/36\tTTI - Telecom International Ltd.\n00:50:C2:16:10:00/36\tJ&B Engineering Group S.L.\n00:50:C2:16:20:00/36\tTeseda Corporation\n00:50:C2:16:30:00/36\tComputerwise, Inc.\n00:50:C2:16:40:00/36\tAcunia N.V.\n00:50:C2:16:50:00/36\tIpcast\n00:50:C2:16:60:00/36\tInfineer Ltd.\n00:50:C2:16:70:00/36\tPrecision Filters, Inc.\n00:50:C2:16:80:00/36\tExtremeSpeed Inc.\n00:50:C2:16:90:00/36\tNordson Corp.\n00:50:C2:16:A0:00/36\tTime Domain\n00:50:C2:16:B0:00/36\tMasterclock, Inc.\n00:50:C2:16:C0:00/36\tBrijing Embedor Embedded Internet Tech. Co. Ltd.\n00:50:C2:16:D0:00/36\tPostec Data Systems Ltd.\n00:50:C2:16:E0:00/36\tPmc\n00:50:C2:16:F0:00/36\tDickson Technologies\n00:50:C2:17:00:00/36\tTaishodo Seiko Co., Ltd.\n00:50:C2:17:10:00/36\tQuantronix, Inc.\n00:50:C2:17:20:00/36\tSAET I.S. S.r.l.\n00:50:C2:17:30:00/36\tDeMeTec GmbH\n00:50:C2:17:40:00/36\tN&P Technologies\n00:50:C2:17:50:00/36\tSei S.p.A.\n00:50:C2:17:60:00/36\tWavium AB\n00:50:C2:17:70:00/36\tUnicoi Systems\n00:50:C2:17:80:00/36\tPartner Voxstream A/S\n00:50:C2:17:90:00/36\tVerifiber LLC\n00:50:C2:17:A0:00/36\tWOLF Advanced Technology.\n00:50:C2:17:B0:00/36\tBroadstorm Telecom\n00:50:C2:17:C0:00/36\tJeffress Engineering Pty Ltd\n00:50:C2:17:D0:00/36\tCognex Corporation\n00:50:C2:17:E0:00/36\tBinary Wave Technologies Inc.\n00:50:C2:17:F0:00/36\tPDQ Manufacturing\n00:50:C2:18:00:00/36\tZultys Technologies\n00:50:C2:18:10:00/36\tTask 84 Spa\n00:50:C2:18:20:00/36\twolf-inf-tec\n00:50:C2:18:30:00/36\tMixbaal S.A. de C.V.\n00:50:C2:18:40:00/36\tH M Computing Limited\n00:50:C2:18:50:00/36\tOptical Wireless Link Inc.\n00:50:C2:18:60:00/36\tPantec Engineering AG\n00:50:C2:18:70:00/36\tCyan Technology Ltd\n00:50:C2:18:80:00/36\tdresden-elektronik\n00:50:C2:18:90:00/36\tCC Systems AB\n00:50:C2:18:A0:00/36\tBasler Electric Company\n00:50:C2:18:B0:00/36\tTeradyne Inc.\n00:50:C2:18:C0:00/36\tTechnodrive srl\n00:50:C2:18:D0:00/36\tCCII Systems (Pty) Ltd\n00:50:C2:18:E0:00/36\tSparr Electronics Ltd\n00:50:C2:18:F0:00/36\tMatsui Mfg Co.,Ltd\n00:50:C2:19:00:00/36\tGoerlitz AG\n00:50:C2:19:10:00/36\tPartner Voxstream A/S\n00:50:C2:19:20:00/36\tAdvanced Concepts, Inc.\n00:50:C2:19:30:00/36\tLaserBit Communications Corp.\n00:50:C2:19:40:00/36\tCominfo, Inc.\n00:50:C2:19:50:00/36\tMomentum Data Systems\n00:50:C2:19:60:00/36\tNetsynt Spa\n00:50:C2:19:70:00/36\tEPM Tecnologia e Equipamentos\n00:50:C2:19:80:00/36\tPotsTek, Inc\n00:50:C2:19:90:00/36\tSurvalent Technology Corporation\n00:50:C2:19:A0:00/36\tAzio Technology Co.\n00:50:C2:19:B0:00/36\tWilcoxon Research, Inc.\n00:50:C2:19:C0:00/36\tArtec Design\n00:50:C2:19:D0:00/36\tElectrex S.R.L\n00:50:C2:19:E0:00/36\tPaltronics, Inc.\n00:50:C2:19:F0:00/36\tFleetwood Electronics Ltd\n00:50:C2:1A:00:00/36\tSCA Data Systems\n00:50:C2:1A:10:00/36\tPortalplayer, Inc\n00:50:C2:1A:20:00/36\tABB Switzerland Inc\n00:50:C2:1A:30:00/36\tTidel Engineering, L.P.\n00:50:C2:1A:40:00/36\tProtech Optronics Co. Ltd.\n00:50:C2:1A:50:00/36\tNorco\n00:50:C2:1A:60:00/36\tRF Code\n00:50:C2:1A:70:00/36\tAlpha Beta Technologies, Inc.\n00:50:C2:1A:80:00/36\tAnova Broadband\n00:50:C2:1A:90:00/36\tAxotec Technologies GmbH\n00:50:C2:1A:A0:00/36\tBitBox Ltd\n00:50:C2:1A:B0:00/36\tStreaming Networks\n00:50:C2:1A:C0:00/36\tBeckmann+Egle GmbH\n00:50:C2:1A:D0:00/36\tRemia s.r.o.\n00:50:C2:1A:E0:00/36\tHome Director, Inc\n00:50:C2:1A:F0:00/36\tPESA Inc.\n00:50:C2:1B:00:00/36\tBLANKOM Antennentechnik GmbH\n00:50:C2:1B:10:00/36\tAxes Technologies\n00:50:C2:1B:20:00/36\tSIGOS Systemintegration GmbH\n00:50:C2:1B:30:00/36\tDsp Design\n00:50:C2:1B:40:00/36\tDSP Group Inc.\n00:50:C2:1B:50:00/36\tThrane & Thrane A/S\n00:50:C2:1B:60:00/36\tDTS, Inc.\n00:50:C2:1B:70:00/36\tMosChip USA\n00:50:C2:1B:80:00/36\tElectronic Systems Development\n00:50:C2:1B:90:00/36\tEmCom Technology Inc.\n00:50:C2:1B:A0:00/36\tInterzeag Ag\n00:50:C2:1B:B0:00/36\tEmail Metering\n00:50:C2:1B:C0:00/36\tDINEC International\n00:50:C2:1B:D0:00/36\tAIOI Systems Co., Ltd.\n00:50:C2:1B:E0:00/36\tSedia Electronics\n00:50:C2:1B:F0:00/36\tInternational Test & Engineering Services Co.,Ltd.\n00:50:C2:1C:00:00/36\tWillMonius Inc.\n00:50:C2:1C:10:00/36\tInfinitiNetworks Inc.\n00:50:C2:1C:20:00/36\tWeltronics Corp.\n00:50:C2:1C:30:00/36\tTT electronics plc\n00:50:C2:1C:40:00/36\tPalm Solutions Group\n00:50:C2:1C:50:00/36\tFlander Oy\n00:50:C2:1C:60:00/36\tRemco Italia Spa\n00:50:C2:1C:70:00/36\tTwin Development S.A.\n00:50:C2:1C:80:00/36\tEuphony technology CO., LTD.\n00:50:C2:1C:90:00/36\tmodas GmbH\n00:50:C2:1C:A0:00/36\tEVER Sp. z o.o.\n00:50:C2:1C:B0:00/36\tquantumBEAM Limited\n00:50:C2:1C:C0:00/36\tWaveIP\n00:50:C2:1C:D0:00/36\tINCAA Informatica Italia  srl\n00:50:C2:1C:E0:00/36\tDatatek Applications, Inc.\n00:50:C2:1C:F0:00/36\tLifetime Memory Products, Inc.\n00:50:C2:1D:00:00/36\tYazaki North America, Inc.\n00:50:C2:1D:10:00/36\tBenchmark Electronics\n00:50:C2:1D:20:00/36\tShenyang Internet Technology Inc\n00:50:C2:1D:30:00/36\tSynopsys\n00:50:C2:1D:40:00/36\tPhase IV Engineering Inc.\n00:50:C2:1D:50:00/36\tRedpoint Controls\n00:50:C2:1D:60:00/36\tshanghai trend intelligent systems CO.,LTD\n00:50:C2:1D:70:00/36\tPleora Technologies Inc.\n00:50:C2:1D:80:00/36\tGuardian Controls International Ltd\n00:50:C2:1D:90:00/36\tEdc\n00:50:C2:1D:A0:00/36\tGFI Chrono Time\n00:50:C2:1D:B0:00/36\tApplied Systems Engineering, Inc.\n00:50:C2:1D:C0:00/36\tImarda New Zealand Limited\n00:50:C2:1D:D0:00/36\tpeiker acustic GmbH\n00:50:C2:1D:E0:00/36\tReliOn Inc.\n00:50:C2:1D:F0:00/36\tLulea University of Technology\n00:50:C2:1E:00:00/36\tCognex Corporation\n00:50:C2:1E:10:00/36\tAutomaatiotekniikka Seppo Saari Oy\n00:50:C2:1E:20:00/36\tDIGITRONIC Automationsanlagen GmbH\n00:50:C2:1E:30:00/36\tBluesocket, Inc.\n00:50:C2:1E:40:00/36\tSoronti, Inc.\n00:50:C2:1E:50:00/36\tDorlet Sau\n00:50:C2:1E:60:00/36\tUnited Tri-Tech Corporation\n00:50:C2:1E:70:00/36\tSmith Meter, Inc.\n00:50:C2:1E:80:00/36\tMetrotech\n00:50:C2:1E:90:00/36\tRanch Networks\n00:50:C2:1E:A0:00/36\tDave Srl\n00:50:C2:1E:B0:00/36\tData Respons A/S\n00:50:C2:1E:C0:00/36\tCOSMO co.,ltd.\n00:50:C2:1E:D0:00/36\tEMKA-electronic AG\n00:50:C2:1E:E0:00/36\tPerto Periféricos de Automação S.A.\n00:50:C2:1E:F0:00/36\tM2 Technology Pty Ltd\n00:50:C2:1F:00:00/36\tEXI Wireless Systems Inc.\n00:50:C2:1F:10:00/36\tSKY Computers, Inc.\n00:50:C2:1F:20:00/36\tTattile srl\n00:50:C2:1F:30:00/36\tRadionor Communications\n00:50:C2:1F:40:00/36\tCovia, Inc\n00:50:C2:1F:50:00/36\tAbest Communication Corp.\n00:50:C2:1F:60:00/36\tBAE SYSTEMS Controls\n00:50:C2:1F:70:00/36\tARC'Créations\n00:50:C2:1F:80:00/36\tUltracker Technology\n00:50:C2:1F:90:00/36\tFr. Sauter AG\n00:50:C2:1F:A0:00/36\tSP Controls, Inc\n00:50:C2:1F:B0:00/36\tWillowglen Systems Inc.\n00:50:C2:1F:C0:00/36\tEDD Srl\n00:50:C2:1F:D0:00/36\tSouthWing S.L.\n00:50:C2:1F:E0:00/36\tSafetran Traffic Systems Inc.\n00:50:C2:1F:F0:00/36\tProduct Design Dept., Sohwa Corporation\n00:50:C2:20:00:00/36\tWhittier Mailing Products, Inc.\n00:50:C2:20:10:00/36\tOlympusNDT\n00:50:C2:20:20:00/36\tAudio Riders Oy\n00:50:C2:20:30:00/36\tVocality International Ltd\n00:50:C2:20:40:00/36\tAlgodue Elettronica Srl\n00:50:C2:20:50:00/36\tSystIng\n00:50:C2:20:60:00/36\tWindmill Innovations\n00:50:C2:20:70:00/36\tSolectron Ind.Com.Servs.Exportadora do Brasil Ltda.\n00:50:C2:20:80:00/36\tnNovia, Inc.\n00:50:C2:20:90:00/36\tLK Ltd\n00:50:C2:20:A0:00/36\tFerrari electronic AG\n00:50:C2:20:B0:00/36\tRafael\n00:50:C2:20:C0:00/36\tCommunication and Telemechanical Systems Company Limited\n00:50:C2:20:D0:00/36\tVarisys Ltd\n00:50:C2:20:E0:00/36\tPYRAMID Computer GmbH\n00:50:C2:20:F0:00/36\tOMICRON electronics GmbH\n00:50:C2:21:00:00/36\tInnovics Wireless Inc\n00:50:C2:21:10:00/36\tHochschule für Technik, Wirtschaft und Kultur Leipzig (FH)\n00:50:C2:21:20:00/36\t4Links Limited\n00:50:C2:21:30:00/36\tSysAware S.A.R.L.\n00:50:C2:21:40:00/36\tOshimi System Design Inc.\n00:50:C2:21:50:00/36\tVoiceCom AG\n00:50:C2:21:60:00/36\tLevel Control Systems\n00:50:C2:21:70:00/36\tLinn Products Ltd\n00:50:C2:21:80:00/36\tNansen S. A. - Instrumentos de Precisão\n00:50:C2:21:90:00/36\tAeroflex GmbH\n00:50:C2:21:A0:00/36\tMst Systems Limited\n00:50:C2:21:B0:00/36\tGD Mission Systems\n00:50:C2:21:C0:00/36\tFracarro srl\n00:50:C2:21:D0:00/36\tESG Elektroniksystem u. Logistik GmbH\n00:50:C2:21:E0:00/36\tApplied Technologies Associates\n00:50:C2:21:F0:00/36\tMonitor Business Machines Ltd\n00:50:C2:22:00:00/36\tServeron Corporation\n00:50:C2:22:10:00/36\tGetinge IT Solutions ApS\n00:50:C2:22:20:00/36\timo-elektronik GmbH\n00:50:C2:22:30:00/36\tvisicontrol GmbH\n00:50:C2:22:40:00/36\tPANNOCOM Ltd.\n00:50:C2:22:50:00/36\tnVent, Schroff GmbH\n00:50:C2:22:60:00/36\tRoss Video Limited\n00:50:C2:22:70:00/36\tIntelligent Photonics Control\n00:50:C2:22:80:00/36\tIntelligent Media Technologies, Inc.\n00:50:C2:22:90:00/36\teko systems inc.\n00:50:C2:22:A0:00/36\tCrescendo Networks\n00:50:C2:22:B0:00/36\tRiegl Laser Measurement Systems GmbH\n00:50:C2:22:C0:00/36\tIntrinsity\n00:50:C2:22:D0:00/36\tasetek Inc.\n00:50:C2:22:E0:00/36\tLord Ingenierie\n00:50:C2:22:F0:00/36\tHTEC Limited\n00:50:C2:23:00:00/36\tAutoTOOLS group Co. Ltd.\n00:50:C2:23:10:00/36\tLegra Systems, Inc.\n00:50:C2:23:20:00/36\tSimet\n00:50:C2:23:30:00/36\tEdenTree Technologies, Inc.\n00:50:C2:23:40:00/36\tSilverback Systems\n00:50:C2:23:50:00/36\tPolimar Elektronik Ltd.\n00:50:C2:23:60:00/36\tJLCooper Electronics\n00:50:C2:23:70:00/36\tTandata Systems Ltd\n00:50:C2:23:80:00/36\tSchwer+Kopka GmbH\n00:50:C2:23:90:00/36\tStins Coman\n00:50:C2:23:A0:00/36\tChantry Networks\n00:50:C2:23:B0:00/36\tEnvara\n00:50:C2:23:C0:00/36\tWheatstone Corporation\n00:50:C2:23:D0:00/36\tGauging Systems Inc\n00:50:C2:23:E0:00/36\tKallastra Inc.\n00:50:C2:23:F0:00/36\tHalliburton - NUMAR\n00:50:C2:24:00:00/36\tGeoquip Ltd\n00:50:C2:24:10:00/36\tContronics Automacao Ltda\n00:50:C2:24:20:00/36\tMds Sciex\n00:50:C2:24:30:00/36\tRGB Spectrum\n00:50:C2:24:40:00/36\tintec GmbH\n00:50:C2:24:50:00/36\tHauppauge Computer Works, Inc.\n00:50:C2:24:60:00/36\tHardmeier\n00:50:C2:24:70:00/36\tGradual Tecnologia Ltda.\n00:50:C2:24:80:00/36\tDixtal Biomedica Ind. Com. Ltda.\n00:50:C2:24:90:00/36\tBender GmbH & Co. KG\n00:50:C2:24:A0:00/36\tCDS Rail\n00:50:C2:24:B0:00/36\tAzimuth Systems, Inc.\n00:50:C2:24:C0:00/36\tSupertel\n00:50:C2:24:D0:00/36\tMettler Toledo\n00:50:C2:24:E0:00/36\tScharff Weisberg Systems Integration Inc\n00:50:C2:24:F0:00/36\tMacronet s.r.l.\n00:50:C2:25:00:00/36\tACD Elektronik GmbH\n00:50:C2:25:10:00/36\tDGT Sp. z o.o.\n00:50:C2:25:20:00/36\tads-tec GmbH\n00:50:C2:25:30:00/36\tDSM-Messtechnik GmbH\n00:50:C2:25:40:00/36\tThales Communications Ltd\n00:50:C2:25:50:00/36\tSTMicroelectronics SRL\n00:50:C2:25:60:00/36\tInformation Technology Corp.\n00:50:C2:25:70:00/36\tDigicast Networks\n00:50:C2:25:80:00/36\tSpacesaver Corporation\n00:50:C2:25:90:00/36\tOmicron Ceti AB\n00:50:C2:25:A0:00/36\tZendex Corporation\n00:50:C2:25:B0:00/36\tWinford Engineering\n00:50:C2:25:C0:00/36\tSofthill Technologies Ltd.\n00:50:C2:25:D0:00/36\tRdtech\n00:50:C2:25:E0:00/36\tMITE Hradec Kralove, s.r.o.\n00:50:C2:25:F0:00/36\tAlbert Handtmann Maschinenfabrik GmbH&Co.KG\n00:50:C2:26:00:00/36\tBiotage\n00:50:C2:26:10:00/36\tTattile Srl\n00:50:C2:26:20:00/36\tShanghai Gaozhi Science&Technology Development Ltd.\n00:50:C2:26:30:00/36\tVansco Electronics Oy\n00:50:C2:26:40:00/36\tConfidence Direct Ltd\n00:50:C2:26:50:00/36\tBelik S.P.R.L.\n00:50:C2:26:60:00/36\tATOM GIKEN Co.,Ltd.\n00:50:C2:26:70:00/36\tAllen Martin Conservation Ltd\n00:50:C2:26:80:00/36\tParabit Systems\n00:50:C2:26:90:00/36\tTechnisyst Pty Ltd\n00:50:C2:26:A0:00/36\tFg Synerys\n00:50:C2:26:B0:00/36\tContinental Gateway Limited\n00:50:C2:26:C0:00/36\tCrystal Vision Ltd\n00:50:C2:26:D0:00/36\tDsp Design\n00:50:C2:26:E0:00/36\tZP Engineering SEL\n00:50:C2:26:F0:00/36\tDigital Recorders Inc\n00:50:C2:27:00:00/36\tS4 Technology Pty Ltd\n00:50:C2:27:10:00/36\tVlsip Technologies Inc.\n00:50:C2:27:20:00/36\tVerex Technology\n00:50:C2:27:30:00/36\tServicios Condumex, S. A. de C. V.\n00:50:C2:27:40:00/36\tFundación TECNALIA Research & Innovation\n00:50:C2:27:50:00/36\tExtreme Engineering Solutions\n00:50:C2:27:60:00/36\tTieline Research Pty Ltd\n00:50:C2:27:70:00/36\tT/R Systems, Inc.\n00:50:C2:27:80:00/36\tReplicom Ltd.\n00:50:C2:27:90:00/36\tPATLITE Corporation\n00:50:C2:27:A0:00/36\tMaestro Pty Ltd\n00:50:C2:27:B0:00/36\tLinkSecurity A/S\n00:50:C2:27:C0:00/36\tDanlaw Inc\n00:50:C2:27:D0:00/36\tAllied Telesis K.K.\n00:50:C2:27:E0:00/36\tAnaLogic Computers Ltd.\n00:50:C2:27:F0:00/36\tAir Broadband Communications, Inc.\n00:50:C2:28:00:00/36\tAgecodagis Sarl\n00:50:C2:28:10:00/36\tCabtronix AG\n00:50:C2:28:20:00/36\tTelvent\n00:50:C2:28:30:00/36\tAnsitex Corp.\n00:50:C2:28:40:00/36\tMicronet Ltd.\n00:50:C2:28:50:00/36\tLittwin GmbH & Co KG\n00:50:C2:28:60:00/36\tAteme\n00:50:C2:28:70:00/36\tTECNEW Electronics Engineering Cr., Ltd.\n00:50:C2:28:80:00/36\tRPM Systems Corporation\n00:50:C2:28:90:00/36\tRototype S.p.A.\n00:50:C2:28:A0:00/36\tReal Time Systems\n00:50:C2:28:B0:00/36\tOrion Technologies,LLC\n00:50:C2:28:C0:00/36\tFutaba Corporation\n00:50:C2:28:D0:00/36\tAxode Sa\n00:50:C2:28:E0:00/36\tTattile srl\n00:50:C2:28:F0:00/36\tSpellman High Voltage Electronics Corp\n00:50:C2:29:00:00/36\tEbneuro Spa\n00:50:C2:29:10:00/36\tChauvin Arnoux\n00:50:C2:29:20:00/36\tAMIRIX Systems\n00:50:C2:29:30:00/36\tIP Unity\n00:50:C2:29:40:00/36\tEPSa GmbH\n00:50:C2:29:50:00/36\tLogosol, Inc.\n00:50:C2:29:60:00/36\tOpVista\n00:50:C2:29:70:00/36\tKinetics\n00:50:C2:29:80:00/36\tHarvad University\n00:50:C2:29:90:00/36\tCAD-UL GmbH\n00:50:C2:29:A0:00/36\tPacket Techniques Inc.\n00:50:C2:29:B0:00/36\tACD Elektronik GmbH\n00:50:C2:29:C0:00/36\t2N TELEKOMUNIKACE a.s.\n00:50:C2:29:D0:00/36\tGlobe Wireless\n00:50:C2:29:E0:00/36\tSELEX Communications Ltd\n00:50:C2:29:F0:00/36\tBaudisch Electronic GmbH\n00:50:C2:2A:00:00/36\tSterling Industry Consult GmbH\n00:50:C2:2A:10:00/36\tInfinetix Corp\n00:50:C2:2A:20:00/36\tEpelsa, SL\n00:50:C2:2A:30:00/36\tWest-Com Nurse Call Systems, Inc.\n00:50:C2:2A:40:00/36\tXipher Embedded Networking\n00:50:C2:2A:50:00/36\tSeptier Communication Ltd\n00:50:C2:2A:60:00/36\tBrannstroms Elektronik AB\n00:50:C2:2A:70:00/36\tMicro System Architecturing srl\n00:50:C2:2A:80:00/36\tDVTel Israel Ltd.\n00:50:C2:2A:90:00/36\tDr. Staiger, Mohilo + Co GmbH\n00:50:C2:2A:A0:00/36\tDEUTA Werke GmbH\n00:50:C2:2A:B0:00/36\tAUM Infotech Private Limited\n00:50:C2:2A:C0:00/36\tBBI Engineering, Inc.\n00:50:C2:2A:D0:00/36\tABB T&D Spa\n00:50:C2:2A:E0:00/36\tQuest Retail Technology Pty Ltd\n00:50:C2:2A:F0:00/36\tCSA  Computer & Antriebstechnik GmbH\n00:50:C2:2B:00:00/36\tTelda Electronics\n00:50:C2:2B:10:00/36\tPrivate\n00:50:C2:2B:20:00/36\tSmiths Detection\n00:50:C2:2B:30:00/36\tEmbedded Systems Design\n00:50:C2:2B:40:00/36\tPolatis Ltd\n00:50:C2:2B:50:00/36\tHobbes Computer Network Accessories\n00:50:C2:2B:60:00/36\tSoftier Inc.\n00:50:C2:2B:70:00/36\tRAFI GmbH & Co.KG\n00:50:C2:2B:80:00/36\tAdmiral Secure Products, Ltd.\n00:50:C2:2B:90:00/36\tRichmond Sound Design Ltd.\n00:50:C2:2B:A0:00/36\tNorco Industrial Technology Inc\n00:50:C2:2B:B0:00/36\tTA Instruments Ltd\n00:50:C2:2B:C0:00/36\tUster Technologies AG\n00:50:C2:2B:D0:00/36\tStorLink Semi\n00:50:C2:2B:E0:00/36\tLipowsky Industrie-Elektronik GmbH\n00:50:C2:2B:F0:00/36\tPerax\n00:50:C2:2C:00:00/36\tMagellan Technology Pty Limited\n00:50:C2:2C:10:00/36\tStage Tec Entwicklungsgesellschaft für professionelle Audio\n00:50:C2:2C:20:00/36\tSmarteye Corporation\n00:50:C2:2C:30:00/36\tDigital SP Ltd\n00:50:C2:2C:40:00/36\tInvensys Energy Systens (NZ) Limited\n00:50:C2:2C:50:00/36\tElman srl\n00:50:C2:2C:60:00/36\tInitial Electronic Security Systems\n00:50:C2:2C:70:00/36\tSiliquent Technologies Ltd\n00:50:C2:2C:80:00/36\tSelco\n00:50:C2:2C:90:00/36\tRoseman Engineering Ltd.\n00:50:C2:2C:A0:00/36\tPutercom Co., Ltd\n00:50:C2:2C:B0:00/36\tFACTS Engineering LLC\n00:50:C2:2C:C0:00/36\tEmbedded Toolsmiths\n00:50:C2:2C:D0:00/36\tDataWind Research\n00:50:C2:2C:E0:00/36\tRoss Video Limited\n00:50:C2:2C:F0:00/36\tDiseño de Sistemas en Silicio S.A.\n00:50:C2:2D:00:00/36\tWorth Data, Inc.\n00:50:C2:2D:10:00/36\tMiritek, Inc.\n00:50:C2:2D:20:00/36\tAirnet Communications Corp\n00:50:C2:2D:30:00/36\tGerber Scientific Products, Inc.\n00:50:C2:2D:40:00/36\tIntegrated System Solution Corp.\n00:50:C2:2D:50:00/36\tPixy Ag\n00:50:C2:2D:60:00/36\tWIS Technologies\n00:50:C2:2D:70:00/36\tNeo Electronics Ltd\n00:50:C2:2D:80:00/36\tSyn-Tech Systems Inc\n00:50:C2:2D:90:00/36\tPrivate\n00:50:C2:2D:A0:00/36\tPYRAMID Computer GmbH\n00:50:C2:2D:B0:00/36\tAutoTOOLS group Co. Ltd.\n00:50:C2:2D:C0:00/36\tWiener, Plein & Baus GmbH\n00:50:C2:2D:D0:00/36\tWestek Technology Ltd\n00:50:C2:2D:E0:00/36\tResearch Applications\n00:50:C2:2D:F0:00/36\tMicrel-Nke\n00:50:C2:2E:00:00/36\tBaxter International Inc\n00:50:C2:2E:10:00/36\tAccess IS\n00:50:C2:2E:20:00/36\tBallard Technology, Inc,\n00:50:C2:2E:30:00/36\tMG Industrieelektronik GmbH\n00:50:C2:2E:40:00/36\tiamba LTD.\n00:50:C2:2E:50:00/36\tTranstech DSP\n00:50:C2:2E:60:00/36\tDalsa\n00:50:C2:2E:70:00/36\tSafeView, Inc.\n00:50:C2:2E:80:00/36\tS.M.V. Systemelektronik GmbH\n00:50:C2:2E:90:00/36\tSRI International\n00:50:C2:2E:A0:00/36\tQUBIsoft S.r.l.\n00:50:C2:2E:B0:00/36\tLingg & Janke OHG\n00:50:C2:2E:C0:00/36\tChengdu  Book Digital Co., Ltd\n00:50:C2:2E:D0:00/36\t4RF Communications Ltd\n00:50:C2:2E:E0:00/36\tSHF Communication Technologies AG\n00:50:C2:2E:F0:00/36\tProfline B.V.\n00:50:C2:2F:00:00/36\tLECO Corporation\n00:50:C2:2F:10:00/36\tGeometrics, Inc.\n00:50:C2:2F:20:00/36\tEurotek Srl\n00:50:C2:2F:30:00/36\tCrossbow Technology, Inc.\n00:50:C2:2F:40:00/36\tEfficient Channel Coding\n00:50:C2:2F:50:00/36\tADChips\n00:50:C2:2F:60:00/36\tClifford Chance LLP\n00:50:C2:2F:70:00/36\tGillam-Fei S.A.\n00:50:C2:2F:80:00/36\tSavvyCorp.com Ltd\n00:50:C2:2F:90:00/36\tDigilent Inc.\n00:50:C2:2F:A0:00/36\tTornado Modular Systems\n00:50:C2:2F:B0:00/36\tArthur Industries Inc., dba On Hold Media Group\n00:50:C2:2F:C0:00/36\tBlackline Systems Corporation\n00:50:C2:2F:D0:00/36\tAmerican Microsystems, Ltd.\n00:50:C2:2F:E0:00/36\tSaab AB\n00:50:C2:2F:F0:00/36\tPatria Advanced Solutions\n00:50:C2:30:00:00/36\tSoredex Instrumentarium Oyj\n00:50:C2:30:10:00/36\tDelphi Display Systems, Inc.\n00:50:C2:30:20:00/36\tEuroDesign embedded technologies GmbH\n00:50:C2:30:30:00/36\tCI Systems Ltd.\n00:50:C2:30:40:00/36\tCOMERSON S.r.l.\n00:50:C2:30:50:00/36\tSymbium Corporation\n00:50:C2:30:60:00/36\tNoran Tel Communications Ltd.\n00:50:C2:30:70:00/36\tUniondigital.,Co.Ltd\n00:50:C2:30:80:00/36\tFiveCo\n00:50:C2:30:90:00/36\tRackmaster Systems, Inc.\n00:50:C2:30:A0:00/36\tInnings Telecom Inc.\n00:50:C2:30:B0:00/36\tVX Technologies Inc.\n00:50:C2:30:C0:00/36\tTeamlog\n00:50:C2:30:D0:00/36\tSetaram\n00:50:C2:30:E0:00/36\tLeviton Manufacturing Co., Inc\n00:50:C2:30:F0:00/36\tDigicontrole Lda\n00:50:C2:31:00:00/36\tCybertron Co., Ltd.\n00:50:C2:31:10:00/36\tComodo\n00:50:C2:31:20:00/36\tDese Technologies SL\n00:50:C2:31:30:00/36\tSAIA Burgess Controls AG\n00:50:C2:31:40:00/36\tMicroBee Systems, Inc\n00:50:C2:31:50:00/36\tifak system GmbH\n00:50:C2:31:60:00/36\tDataline AB\n00:50:C2:31:70:00/36\tCosine Systems, Inc.\n00:50:C2:31:80:00/36\tMilmega Ltd\n00:50:C2:31:90:00/36\tInvatron Systems Corp.\n00:50:C2:31:A0:00/36\tZodiak Data Systems\n00:50:C2:31:B0:00/36\tDatacon\n00:50:C2:31:C0:00/36\tAxyomCore Inc.\n00:50:C2:31:D0:00/36\tImarda New Zealand Limited\n00:50:C2:31:E0:00/36\tC3-ilex, LLC\n00:50:C2:31:F0:00/36\tGeotech Instruments, LLC\n00:50:C2:32:00:00/36\tDTASENSOR S.p.A.\n00:50:C2:32:10:00/36\tUxp\n00:50:C2:32:20:00/36\tBQT Solutions (Australia) Limited\n00:50:C2:32:30:00/36\tRed Rock Networks\n00:50:C2:32:40:00/36\tOdixion\n00:50:C2:32:50:00/36\tFederal Aviation Administration\n00:50:C2:32:60:00/36\tNavionics S.p.A.\n00:50:C2:32:70:00/36\tDornier GmbH\n00:50:C2:32:80:00/36\tI.C.S. Electronics Limited\n00:50:C2:32:90:00/36\tImax\n00:50:C2:32:A0:00/36\tPhytec Messtechnik GmbH\n00:50:C2:32:B0:00/36\tDigital Multimedia Technologies Spa\n00:50:C2:32:C0:00/36\tIntegrated Silicon Solution (Taiwan), Inc.\n00:50:C2:32:D0:00/36\tConsens Zeiterfassung GMBH\n00:50:C2:32:E0:00/36\tManusa-Gest, S.L.\n00:50:C2:32:F0:00/36\tPultronics\n00:50:C2:33:00:00/36\tSicon srl\n00:50:C2:33:10:00/36\tBroadcast Sports Inc\n00:50:C2:33:20:00/36\tPunjab Communications Ltd\n00:50:C2:33:30:00/36\tRadix Corporation\n00:50:C2:33:40:00/36\tPicture Elements, Inc.\n00:50:C2:33:50:00/36\tNimcat Networks\n00:50:C2:33:60:00/36\tGolden River Traffic\n00:50:C2:33:70:00/36\tEti\n00:50:C2:33:80:00/36\tErnitec A/S\n00:50:C2:33:90:00/36\tSecure Systems & Services\n00:50:C2:33:A0:00/36\tUnited Telecoms Ltd\n00:50:C2:33:B0:00/36\tMultimediaLED\n00:50:C2:33:C0:00/36\tSkipJam\n00:50:C2:33:D0:00/36\tGD Mission Systems\n00:50:C2:33:E0:00/36\tCA Technology, Inc\n00:50:C2:33:F0:00/36\tEXYS bvba\n00:50:C2:34:00:00/36\tVirtu\n00:50:C2:34:10:00/36\tNovx Systems\n00:50:C2:34:20:00/36\tSt. Michael Strategies\n00:50:C2:34:30:00/36\tABB Xiamen Switchgear Co. Ltd.\n00:50:C2:34:40:00/36\tads-tec GmbH\n00:50:C2:34:50:00/36\tAct\n00:50:C2:34:60:00/36\tbiokeysystem\n00:50:C2:34:70:00/36\tRow Seven Ltd\n00:50:C2:34:80:00/36\tKoolSpan, Inc.\n00:50:C2:34:90:00/36\tSSI Schaefer Peem\n00:50:C2:34:A0:00/36\tNIE Corporation\n00:50:C2:34:B0:00/36\tEcutel Systems, Inc.\n00:50:C2:34:C0:00/36\tChuo Electric Works Co., LTD.\n00:50:C2:34:D0:00/36\tBMK professional electronics GmbH\n00:50:C2:34:E0:00/36\tABB Power Technologies S.p.A.  Unità  Operativa SACE (PTMV)\n00:50:C2:34:F0:00/36\tNorth Pole Engineering, Inc.\n00:50:C2:35:00:00/36\tKinesys Projects Limited\n00:50:C2:35:10:00/36\tFinesystem Co., Ltd\n00:50:C2:35:20:00/36\tLuceo\n00:50:C2:35:30:00/36\tCrossing Informationssysteme GmbH\n00:50:C2:35:40:00/36\tAdvanced IP Communications\n00:50:C2:35:50:00/36\tIhm\n00:50:C2:35:60:00/36\tBaytech Cinema\n00:50:C2:35:70:00/36\tAthena Semiconductor\n00:50:C2:35:80:00/36\tAlcea\n00:50:C2:35:90:00/36\tKramer Electronics Ltd.\n00:50:C2:35:A0:00/36\tAdvanced Si-Net Co., LTD.\n00:50:C2:35:B0:00/36\tVlsip Technologies, Inc\n00:50:C2:35:C0:00/36\tRatotec GmbH\n00:50:C2:35:D0:00/36\tNetTest A/S\n00:50:C2:35:E0:00/36\tJobin Yvon,Inc\n00:50:C2:35:F0:00/36\tF.Imm. S.r.L.\n00:50:C2:36:00:00/36\tDigital Receiver Technology\n00:50:C2:36:10:00/36\tContec\n00:50:C2:36:20:00/36\tAZD Praha s.r.o.\n00:50:C2:36:30:00/36\tSeptentrio nv/sa\n00:50:C2:36:40:00/36\tTattile srl\n00:50:C2:36:50:00/36\tVpg\n00:50:C2:36:60:00/36\tVanguard Technology Corp.\n00:50:C2:36:70:00/36\tCANMAX Technology Ltd.\n00:50:C2:36:80:00/36\tAspel S.A.\n00:50:C2:36:90:00/36\tAlways On Wireless\n00:50:C2:36:A0:00/36\tOptronic Partner pr AB\n00:50:C2:36:B0:00/36\tMinerva Technology Inc\n00:50:C2:36:C0:00/36\tRISCO Group\n00:50:C2:36:D0:00/36\tOplink Communications\n00:50:C2:36:E0:00/36\tMinicom Advanced Systems Ltd\n00:50:C2:36:F0:00/36\tXIMEA s.r.o.\n00:50:C2:37:00:00/36\tEurope Technologies\n00:50:C2:37:10:00/36\tDigital Art System\n00:50:C2:37:20:00/36\tELV Elektronik AG\n00:50:C2:37:30:00/36\tCompanion Worlds, inc.\n00:50:C2:37:40:00/36\tOwasys Advanced Wireless Devices\n00:50:C2:37:50:00/36\tTIR Systems Ltd.\n00:50:C2:37:60:00/36\tCleode\n00:50:C2:37:70:00/36\tXycom VME\n00:50:C2:37:80:00/36\tDaintree Networks Pty\n00:50:C2:37:90:00/36\tControl LAN S.A.\n00:50:C2:37:A0:00/36\tIDA Corporation\n00:50:C2:37:B0:00/36\tFreescale Semiconductor\n00:50:C2:37:C0:00/36\tMODIA SYSTEMS Co., Ltd\n00:50:C2:37:D0:00/36\tVeroTrak Inc.\n00:50:C2:37:E0:00/36\tNi.Co. S.r.l.\n00:50:C2:37:F0:00/36\tForesearch\n00:50:C2:38:00:00/36\tEKE-Electronics Ltd.\n00:50:C2:38:10:00/36\tRealtime Engineering AG\n00:50:C2:38:20:00/36\tColorado vNet\n00:50:C2:38:30:00/36\tICS Electronics\n00:50:C2:38:40:00/36\tWireless Reading Systems Holding ASA\n00:50:C2:38:50:00/36\tSUNGJIN NEOTECH Co.Ltd.\n00:50:C2:38:60:00/36\tPrecision System Science Co.,Ltd\n00:50:C2:38:70:00/36\tInoteska s.r.o.\n00:50:C2:38:80:00/36\tIEE Inc\n00:50:C2:38:90:00/36\tExavio Inc.\n00:50:C2:38:A0:00/36\tEmbedtronics Enterprise\n00:50:C2:38:B0:00/36\tInterBridge,Inc.\n00:50:C2:38:C0:00/36\tEpsilon Srl\n00:50:C2:38:D0:00/36\tA&G Soluzioni Digitali\n00:50:C2:38:E0:00/36\tNordic Alarm AB\n00:50:C2:38:F0:00/36\tTTC Telecom\n00:50:C2:39:00:00/36\tTC Communications\n00:50:C2:39:10:00/36\tEsensors, Inc.\n00:50:C2:39:20:00/36\tPhytec Messtechnik GmbH\n00:50:C2:39:30:00/36\tSYS TEC electronic GmbH\n00:50:C2:39:40:00/36\tEmbedit A/S\n00:50:C2:39:50:00/36\tvidisys gmbh\n00:50:C2:39:60:00/36\tRapidWave Inc.\n00:50:C2:39:70:00/36\tMANGO DSP Ltd.\n00:50:C2:39:80:00/36\tInhand Electronics, Inc.\n00:50:C2:39:90:00/36\tAdvanced Micro Controls Inc.\n00:50:C2:39:A0:00/36\tOptical Air Data Systems\n00:50:C2:39:B0:00/36\tYUYAMA MFG Co.,Ltd\n00:50:C2:39:C0:00/36\tTiyoda Mfg Co.,Ltd.\n00:50:C2:39:D0:00/36\tDigitalDeck, Inc.\n00:50:C2:39:E0:00/36\tA.R.G ElectroDesign Ltd\n00:50:C2:39:F0:00/36\tIsensix\n00:50:C2:3A:00:00/36\tStreetFire Sound Labs, LLC\n00:50:C2:3A:10:00/36\tSamsoft\n00:50:C2:3A:20:00/36\tVegas Amusement\n00:50:C2:3A:30:00/36\tStar Link Communication Pvt. Ltd.\n00:50:C2:3A:40:00/36\tSilvertree Engineering Ltd\n00:50:C2:3A:50:00/36\tLabJack Corporation\n00:50:C2:3A:60:00/36\tIntelliDesign Pty Ltd\n00:50:C2:3A:70:00/36\tElektrotechnik & Elektronik Oltmann GmbH\n00:50:C2:3A:80:00/36\tEngim, Inc.\n00:50:C2:3A:90:00/36\tWestronic Systems Inc.\n00:50:C2:3A:A0:00/36\tNetworked Robotics Corporation\n00:50:C2:3A:B0:00/36\ttaskit Rechnertechnik GmbH\n00:50:C2:3A:C0:00/36\tInAccess Networks\n00:50:C2:3A:D0:00/36\tSpirent Communications (Scotland) Limited\n00:50:C2:3A:E0:00/36\tHankuk Tapi Computer Co., Ltd\n00:50:C2:3A:F0:00/36\tNorbit ODM AS\n00:50:C2:3B:00:00/36\tMicrotarget Tecnologia Digital Ltda.\n00:50:C2:3B:10:00/36\tSpecstroy-Svyaz Ltd\n00:50:C2:3B:20:00/36\tTennessee Valley Authority\n00:50:C2:3B:30:00/36\tMedia Lab., Inc.\n00:50:C2:3B:40:00/36\tContrôle Analytique inc.\n00:50:C2:3B:50:00/36\tNEC TOKIN Corporation\n00:50:C2:3B:60:00/36\tArecont Vision\n00:50:C2:3B:70:00/36\tMindspeed Technologies\n00:50:C2:3B:80:00/36\tKeith & Koep GmbH\n00:50:C2:3B:90:00/36\tGilbarco Autotank AB\n00:50:C2:3B:A0:00/36\tPhytec Messtechnik GmbH\n00:50:C2:3B:B0:00/36\tIMAGO Technologies GmbH\n00:50:C2:3B:C0:00/36\tTyzx, Inc.\n00:50:C2:3B:D0:00/36\tBigbang L.T.D.\n00:50:C2:3B:E0:00/36\tPauly Steuer- und Regelanlagen GmbH & Co. KG\n00:50:C2:3B:F0:00/36\tAudio Processing Technology Ltd\n00:50:C2:3C:00:00/36\tEDA Industries Pte. Ltd\n00:50:C2:3C:10:00/36\tMicroTek Electronics, Inc.\n00:50:C2:3C:20:00/36\tCasabyte Inc.\n00:50:C2:3C:30:00/36\t4g Technologies, L.P.\n00:50:C2:3C:40:00/36\tSypris Electronics\n00:50:C2:3C:50:00/36\tSilicon Optix Canada Inc.\n00:50:C2:3C:60:00/36\tNet Optics\n00:50:C2:3C:70:00/36\tSalent Technologies Ltd\n00:50:C2:3C:80:00/36\tWheels of Zeus Inc.\n00:50:C2:3C:90:00/36\tDilax Intelcom AG\n00:50:C2:3C:A0:00/36\tABB Inc.\n00:50:C2:3C:B0:00/36\tAnalytica GmbH\n00:50:C2:3C:C0:00/36\tLinkwell Telesystems Pvt Ltd\n00:50:C2:3C:D0:00/36\tMicro-Measurements\n00:50:C2:3C:E0:00/36\tWard Leonard Electric Company\n00:50:C2:3C:F0:00/36\tTechnovare Systems, Inc.\n00:50:C2:3D:00:00/36\tMicro-Robotics Limited\n00:50:C2:3D:10:00/36\tBraintronics BV\n00:50:C2:3D:20:00/36\tAdilec Enginyeria SL\n00:50:C2:3D:30:00/36\tAmerican LED-gible Inc.\n00:50:C2:3D:40:00/36\tWisnu and Supak Co.,Ltd.\n00:50:C2:3D:50:00/36\tFluke Biomedical, Radiation Management Services\n00:50:C2:3D:60:00/36\tComlab Inc.\n00:50:C2:3D:70:00/36\tTTC TELEKOMUNIKACE Ltd\n00:50:C2:3D:80:00/36\tKey Systems , Inc.\n00:50:C2:3D:90:00/36\tBavaria Digital Technik GmbH\n00:50:C2:3D:A0:00/36\tM5 Data Limited\n00:50:C2:3D:B0:00/36\tOsmetech Inc.\n00:50:C2:3D:C0:00/36\t3D perception AS\n00:50:C2:3D:D0:00/36\tELMIC GmbH\n00:50:C2:3D:E0:00/36\tABB Power Technologies S.p.A.  Unità  Operativa SACE (PTMV)\n00:50:C2:3D:F0:00/36\tBiODE Inc.\n00:50:C2:3E:00:00/36\tOy Stinghorn Ltd\n00:50:C2:3E:10:00/36\tNeuLion Incorporated\n00:50:C2:3E:20:00/36\tSysNova\n00:50:C2:3E:30:00/36\tCSIRO - Division of Exploration and Mining\n00:50:C2:3E:40:00/36\tCUE, a.s.\n00:50:C2:3E:50:00/36\tVacon Plc\n00:50:C2:3E:60:00/36\tCrde\n00:50:C2:3E:70:00/36\tRevolution Education Ltd\n00:50:C2:3E:80:00/36\tConformative Systems, Inc.\n00:50:C2:3E:90:00/36\tMedAvant Healthcare\n00:50:C2:3E:A0:00/36\tAlro Information Systems SA\n00:50:C2:3E:B0:00/36\tISS International\n00:50:C2:3E:C0:00/36\tTeneros\n00:50:C2:3E:D0:00/36\tThe Board Room Inc.\n00:50:C2:3E:E0:00/36\tCommoca, Inc\n00:50:C2:3E:F0:00/36\tPAT Industries, DBA Pacific Advanced Technology\n00:50:C2:3F:00:00/36\tmegatec electronic GmbH\n00:50:C2:3F:10:00/36\tSalland Electronics Holding BV\n00:50:C2:3F:20:00/36\tSTL GmbH\n00:50:C2:3F:30:00/36\tHitachi Energy Germany AG\n00:50:C2:3F:40:00/36\tMC TECHNOLOGY GmbH\n00:50:C2:3F:50:00/36\tPhaedrus Limited\n00:50:C2:3F:60:00/36\tdAFTdATA Limited\n00:50:C2:3F:70:00/36\tAdvantage R&D\n00:50:C2:3F:80:00/36\tSuperna Ltd\n00:50:C2:3F:90:00/36\tSintium Ltd\n00:50:C2:3F:A0:00/36\tTumsan\n00:50:C2:3F:B0:00/36\tnVent, Schroff GmbH\n00:50:C2:3F:C0:00/36\tWeinberger Deutschland GmbH\n00:50:C2:3F:D0:00/36\tHARTMANN software GbR\n00:50:C2:3F:E0:00/36\tHaiVision Systems Inc\n00:50:C2:3F:F0:00/36\tCast Iron Systems\n00:50:C2:40:00:00/36\tSmartMotor AS\n00:50:C2:40:10:00/36\tPromess Incorporated\n00:50:C2:40:20:00/36\tNumeron Sp. z o.o.\n00:50:C2:40:30:00/36\tRohde&Schwarz Topex SA\n00:50:C2:40:40:00/36\tNanShanBridge Co.Ltd\n00:50:C2:40:50:00/36\tGuralp Systems Limited\n00:50:C2:40:60:00/36\tCoreStreet, Ltd\n00:50:C2:40:70:00/36\tAIE Etudes\n00:50:C2:40:80:00/36\tTERN, Inc.\n00:50:C2:40:90:00/36\tKtec Ltd\n00:50:C2:40:A0:00/36\tContec Steuerungstechnik & Automation GmbH\n00:50:C2:40:B0:00/36\tCenter VOSPI JSC\n00:50:C2:40:C0:00/36\tApplied Materials UK Ltd\n00:50:C2:40:D0:00/36\tAfonics Fibreoptics Ltd\n00:50:C2:40:E0:00/36\tads-tec GmbH\n00:50:C2:40:F0:00/36\tBir,Inc.\n00:50:C2:41:00:00/36\tGrossenbacher Systeme AG\n00:50:C2:41:10:00/36\tMultimessage Systems Ltd.\n00:50:C2:41:20:00/36\tTSB Solutions Inc.\n00:50:C2:41:30:00/36\tGoodrich\n00:50:C2:41:40:00/36\tTalleres de Escoriaza SA\n00:50:C2:41:50:00/36\tSensoTech GmbH\n00:50:C2:41:60:00/36\tSELCO s.r.l.\n00:50:C2:41:70:00/36\tQT systems ab\n00:50:C2:41:80:00/36\tPlanea Oy\n00:50:C2:41:90:00/36\tMecsel Oy\n00:50:C2:41:A0:00/36\tBluewater Systems Ltd\n00:50:C2:41:B0:00/36\tLogiM GmbH Software und Entwicklung\n00:50:C2:41:C0:00/36\tInfrasafe, Inc.\n00:50:C2:41:D0:00/36\tAltronic, Inc.\n00:50:C2:41:E0:00/36\tVideotek Sistemas Eletronicos Ltda.\n00:50:C2:41:F0:00/36\tAvionica, Inc\n00:50:C2:42:00:00/36\tBoundless Technologies\n00:50:C2:42:10:00/36\tEfsys\n00:50:C2:42:20:00/36\tads-tec GmbH\n00:50:C2:42:30:00/36\tPower-One Inc.\n00:50:C2:42:40:00/36\tMetrolab Technology SA\n00:50:C2:42:50:00/36\tPinnacle Technology\n00:50:C2:42:60:00/36\tSTOM System\n00:50:C2:42:70:00/36\tScheidt & Bachmann GmbH\n00:50:C2:42:80:00/36\tRoxar A/S\n00:50:C2:42:90:00/36\tMatthews Australasia\n00:50:C2:42:A0:00/36\tDsp Design\n00:50:C2:42:B0:00/36\tVlsip Technologies, Inc.\n00:50:C2:42:C0:00/36\tTrapeze Software Group Inc\n00:50:C2:42:D0:00/36\tArgo-Tech\n00:50:C2:42:E0:00/36\tOelmann Elektronik GmbH\n00:50:C2:42:F0:00/36\tWin4NET\n00:50:C2:43:00:00/36\tArcom Digital\n00:50:C2:43:10:00/36\tOctatron, Inc.\n00:50:C2:43:20:00/36\tTopway Industries Ltd.\n00:50:C2:43:30:00/36\tIdetech Europe S.A.\n00:50:C2:43:40:00/36\tImperativeNetworks\n00:50:C2:43:50:00/36\tAdatel Telecomunicaciones S.A.\n00:50:C2:43:60:00/36\tSatellite Services BV\n00:50:C2:43:70:00/36\tPowerWAN, Inc\n00:50:C2:43:80:00/36\tTelecom Protection Technologies Limited\n00:50:C2:43:90:00/36\tPeleton Photonic Systems\n00:50:C2:43:A0:00/36\tProDesign GmbH\n00:50:C2:43:B0:00/36\tA3Ip\n00:50:C2:43:C0:00/36\tDucommun LaBarge Technologies, Inc\n00:50:C2:43:D0:00/36\tAnn Arbor Sensor Systems LLC\n00:50:C2:43:E0:00/36\tCoppercom\n00:50:C2:43:F0:00/36\tARVOO Imaging Products BV\n00:50:C2:44:00:00/36\tAdvanced Modular Computers Ltd.\n00:50:C2:44:10:00/36\tSammi Information Systems Co.,Ltd\n00:50:C2:44:20:00/36\tPico Computing, Inc.\n00:50:C2:44:30:00/36\tPickering Laboratories\n00:50:C2:44:40:00/36\tOffshore Systems Ltd\n00:50:C2:44:50:00/36\tMICRONIC s.r.o.\n00:50:C2:44:60:00/36\tMicro Technic A-S\n00:50:C2:44:70:00/36\tGrupo Epelsa S.L.\n00:50:C2:44:80:00/36\tComtech Systems Inc.\n00:50:C2:44:90:00/36\tBLEILE DATENTECHNIK GmbH\n00:50:C2:44:A0:00/36\tElettronica Santerno SpA\n00:50:C2:44:B0:00/36\tSolace Systems, Inc.\n00:50:C2:44:C0:00/36\tComputime Systems UK Ltd.\n00:50:C2:44:D0:00/36\tElectro-Matic Products, Inc.\n00:50:C2:44:E0:00/36\tQQ Technology,Inc\n00:50:C2:44:F0:00/36\tkippdata GmbH\n00:50:C2:45:00:00/36\tEnconair Ecological Chambers Inc.\n00:50:C2:45:10:00/36\tHAMEG GmbH\n00:50:C2:45:20:00/36\tScame Sistemi srl\n00:50:C2:45:30:00/36\tErhardt+Leimer GmbH\n00:50:C2:45:40:00/36\tBrivo Systems, LLC\n00:50:C2:45:50:00/36\tGogo BA\n00:50:C2:45:60:00/36\tDRDC Valcartier\n00:50:C2:45:70:00/36\tDanbridge\n00:50:C2:45:80:00/36\tHRZ data GmbH\n00:50:C2:45:90:00/36\tPhytec Messtechnik GmbH\n00:50:C2:45:A0:00/36\tFunkwerk plettac electronic GmbH\n00:50:C2:45:B0:00/36\tMatra Electronique\n00:50:C2:45:C0:00/36\tDeister Electronic GmbH\n00:50:C2:45:D0:00/36\tDigital Engineering, Inc.\n00:50:C2:45:E0:00/36\tHalliburton - Sperry Drilling Service\n00:50:C2:45:F0:00/36\tT2C Marketing AB\n00:50:C2:46:00:00/36\tVitelnet\n00:50:C2:46:10:00/36\tTattile Srl\n00:50:C2:46:20:00/36\tCT Company\n00:50:C2:46:30:00/36\tCodem Systems, Inc.\n00:50:C2:46:40:00/36\tXYTAC system technologies\n00:50:C2:46:50:00/36\tPDTS GmbH\n00:50:C2:46:60:00/36\tLONAP Limited\n00:50:C2:46:70:00/36\tUnited Western Technologies\n00:50:C2:46:80:00/36\tNetwork I/O\n00:50:C2:46:90:00/36\tBipom Electronics, Inc.\n00:50:C2:46:A0:00/36\tISE GmbH\n00:50:C2:46:B0:00/36\tEASYTECH GmbH\n00:50:C2:46:C0:00/36\tCAMCO GmbH\n00:50:C2:46:D0:00/36\tPaul Scherrer Institut (PSI)\n00:50:C2:46:E0:00/36\tAvenir Technologies Inc.\n00:50:C2:46:F0:00/36\tNeuroware\n00:50:C2:47:00:00/36\tCybectec inc.\n00:50:C2:47:10:00/36\tPixtree Technologies, inc.\n00:50:C2:47:20:00/36\tKOP Ltd\n00:50:C2:47:30:00/36\tSensus Metering Systems Israel\n00:50:C2:47:40:00/36\tVenue 1, Inc.\n00:50:C2:47:50:00/36\tISEPOS GmbH\n00:50:C2:47:60:00/36\tAscon S.p.a.\n00:50:C2:47:70:00/36\tSEV Tidsystem AB\n00:50:C2:47:80:00/36\tMetafix Inc.\n00:50:C2:47:90:00/36\tUnlimited Bandwidth LLC\n00:50:C2:47:A0:00/36\tEfficient Channel Coding\n00:50:C2:47:B0:00/36\tPitney Bowes, Inc\n00:50:C2:47:C0:00/36\tAUCONET GmbH\n00:50:C2:47:D0:00/36\tWIT Inc\n00:50:C2:47:E0:00/36\tEnergie Umwelt Systemtechnik GmbH\n00:50:C2:47:F0:00/36\tBRIT Inc.\n00:50:C2:48:00:00/36\tSELKOM GmbH\n00:50:C2:48:10:00/36\tComputer Sciences Corp\n00:50:C2:48:20:00/36\tPriamus System Technologies Ag\n00:50:C2:48:30:00/36\tSes\n00:50:C2:48:40:00/36\tKooltech LLC\n00:50:C2:48:50:00/36\tPhytec Messtechnik GmbH\n00:50:C2:48:60:00/36\tSafegate International AB\n00:50:C2:48:70:00/36\tEridon Corporation\n00:50:C2:48:80:00/36\tDa Sistemi Spa\n00:50:C2:48:90:00/36\tEREE Electronique\n00:50:C2:48:A0:00/36\tMobile Matrix, Inc.\n00:50:C2:48:B0:00/36\tads-tec GmbH\n00:50:C2:48:C0:00/36\tUniton Ag\n00:50:C2:48:D0:00/36\tMetron Sp. z o.o.\n00:50:C2:48:E0:00/36\tTeledyne Tekmar\n00:50:C2:48:F0:00/36\tDENGYOSHA co.,LTD.\n00:50:C2:49:00:00/36\tCloanto Corporation\n00:50:C2:49:10:00/36\tFr. Sauter AG\n00:50:C2:49:20:00/36\tTrafsys As\n00:50:C2:49:30:00/36\tArtis GmbH\n00:50:C2:49:40:00/36\tUltimate Technology, Inc.\n00:50:C2:49:50:00/36\tVAZA Elektronik AB\n00:50:C2:49:60:00/36\tAcutelogic Corporation\n00:50:C2:49:70:00/36\tAdvanced Driver Information Technology GmbH\n00:50:C2:49:80:00/36\tQuartet Technology, Inc.\n00:50:C2:49:90:00/36\tTrellia Networks\n00:50:C2:49:A0:00/36\tTelASIC Communications, Inc.\n00:50:C2:49:B0:00/36\tvg controls, inc\n00:50:C2:49:C0:00/36\tEnvisacor Technologies Inc.\n00:50:C2:49:D0:00/36\tCritical Link LLC\n00:50:C2:49:E0:00/36\tArmorlink Co .Ltd\n00:50:C2:49:F0:00/36\tGCS, Inc\n00:50:C2:4A:00:00/36\tAdvanced technologies & Engineering (pty) Ltd\n00:50:C2:4A:10:00/36\tnVent, Schroff GmbH\n00:50:C2:4A:20:00/36\tSPECS GmbH\n00:50:C2:4A:30:00/36\tProtium Technologies, Inc.\n00:50:C2:4A:40:00/36\tIeee P1609 Wg\n00:50:C2:4A:50:00/36\tTeledyne Monitor Labs\n00:50:C2:4A:60:00/36\tBuyang Electronics Industrial Co., Ltd.\n00:50:C2:4A:70:00/36\tiseg Spezialelektronik GmbH\n00:50:C2:4A:80:00/36\tCYJAYA Korea\n00:50:C2:4A:90:00/36\tFaber Electronics BV\n00:50:C2:4A:A0:00/36\tHEINEN ELEKTRONIK GmbH\n00:50:C2:4A:B0:00/36\tJVF Communications Ltd\n00:50:C2:4A:C0:00/36\tDoramu Co.,Ltd.\n00:50:C2:4A:D0:00/36\tOpenPeak, Inc.\n00:50:C2:4A:E0:00/36\tads-tec GmbH\n00:50:C2:4A:F0:00/36\tOrbis Oy\n00:50:C2:4B:00:00/36\tEsmart Distribution Pte Ltd\n00:50:C2:4B:10:00/36\tNSFOCUS Information Technology Co., Ltd.\n00:50:C2:4B:20:00/36\tTESLA, a.s.\n00:50:C2:4B:30:00/36\tANSA Corporation\n00:50:C2:4B:40:00/36\tMatrix Audio Designs\n00:50:C2:4B:50:00/36\tValley Tecnologia\n00:50:C2:4B:60:00/36\tGeneral Resources Co., LTD.\n00:50:C2:4B:70:00/36\tGFI Chrono Time\n00:50:C2:4B:80:00/36\tShenzhen Hongdian Technologies.,Ltd\n00:50:C2:4B:90:00/36\tRose Technologies\n00:50:C2:4B:A0:00/36\tMistletoe Technologies\n00:50:C2:4B:B0:00/36\tProtonic Holland\n00:50:C2:4B:C0:00/36\tSaia Burgess Controls AG\n00:50:C2:4B:D0:00/36\tArgon ST\n00:50:C2:4B:E0:00/36\tDigital Dynamics, Inc.\n00:50:C2:4B:F0:00/36\tWestinghouse Rail Systems Ltd\n00:50:C2:4C:00:00/36\tBio-logic Systems Corp\n00:50:C2:4C:10:00/36\tMovaz Networks, Inc.\n00:50:C2:4C:20:00/36\tElbit Systems Ltd.\n00:50:C2:4C:30:00/36\tQuantum3D, Inc.\n00:50:C2:4C:40:00/36\tBlack Diamond Video, Inc.\n00:50:C2:4C:50:00/36\teXray Broadband Inc.\n00:50:C2:4C:60:00/36\tRubin Ltd.\n00:50:C2:4C:70:00/36\tTransbit Sp.z o.o.\n00:50:C2:4C:80:00/36\tNeets\n00:50:C2:4C:90:00/36\tScirocco AB\n00:50:C2:4C:A0:00/36\tYarg Biometrics Limited\n00:50:C2:4C:B0:00/36\tVerint Systems Ltd\n00:50:C2:4C:C0:00/36\tImpediMed Limited\n00:50:C2:4C:D0:00/36\tSecuriton AG\n00:50:C2:4C:E0:00/36\tOpen Date Equipment Limited\n00:50:C2:4C:F0:00/36\tZiehl-Abegg AG\n00:50:C2:4D:00:00/36\tRCS Energy Management Ltd\n00:50:C2:4D:10:00/36\tSLICAN sp. z o.o.\n00:50:C2:4D:20:00/36\tTwoway CATV SERVICE INC.\n00:50:C2:4D:30:00/36\tELPROC sp. z o.o.\n00:50:C2:4D:40:00/36\tHerholdt Controls srl\n00:50:C2:4D:50:00/36\tSEBA Design Pty Ltd\n00:50:C2:4D:60:00/36\tIngenieurbüro Schober\n00:50:C2:4D:70:00/36\tDelta Tau Data Systems, Inc.\n00:50:C2:4D:80:00/36\tAvantry Ltd.\n00:50:C2:4D:90:00/36\tGE Security Kampro\n00:50:C2:4D:A0:00/36\tMEDIORNET GmbH\n00:50:C2:4D:B0:00/36\tAlfing Montagetechnik GmbH\n00:50:C2:4D:C0:00/36\tAce Electronics, Inc.\n00:50:C2:4D:D0:00/36\tTruteq Wireless (PTY) Ltd.\n00:50:C2:4D:E0:00/36\tGD Mission Systems\n00:50:C2:4D:F0:00/36\tThermo Electron\n00:50:C2:4E:00:00/36\tTelematrix\n00:50:C2:4E:10:00/36\tSS Telecoms CC\n00:50:C2:4E:20:00/36\tApplied Research Laboratories: UT\n00:50:C2:4E:30:00/36\tRomteck Pty Ltd\n00:50:C2:4E:40:00/36\tEmbigence GmbH\n00:50:C2:4E:50:00/36\tSedo Systems Ltd\n00:50:C2:4E:60:00/36\tPhotonic Bridges  Inc.\n00:50:C2:4E:70:00/36\tComputerized Elevator Contol\n00:50:C2:4E:80:00/36\tSATEL sp. z o.o.\n00:50:C2:4E:90:00/36\tSeachange international\n00:50:C2:4E:A0:00/36\tPmc\n00:50:C2:4E:B0:00/36\tMandozzi Elettronica SA\n00:50:C2:4E:C0:00/36\tThales Defence and Security Systems GmbH\n00:50:C2:4E:D0:00/36\tLab X Technologies, LLC\n00:50:C2:4E:E0:00/36\tBeijing Corelogic Communication Co., Ltd.\n00:50:C2:4E:F0:00/36\tCreative Retail Entertainment\n00:50:C2:4F:00:00/36\tMedAvant Healthcare\n00:50:C2:4F:10:00/36\tPacket Island Inc.\n00:50:C2:4F:20:00/36\tTantronic AG\n00:50:C2:4F:30:00/36\tAutronica Fire And Securirty\n00:50:C2:4F:40:00/36\tO2Run\n00:50:C2:4F:50:00/36\tMonroe Electronics, Inc.\n00:50:C2:4F:60:00/36\tRealD, Inc.\n00:50:C2:4F:70:00/36\tWaveIP\n00:50:C2:4F:80:00/36\tProdco International Inc.\n00:50:C2:4F:90:00/36\tRTDS Technologies Inc.\n00:50:C2:4F:A0:00/36\tCambridge Technology, Inc.\n00:50:C2:4F:B0:00/36\tBES Technology Group\n00:50:C2:4F:C0:00/36\tHwayoung RF Solution Inc\n00:50:C2:4F:D0:00/36\tNetwork Automation mxc AB\n00:50:C2:4F:E0:00/36\tGEM ELETTRONICA Srl\n00:50:C2:4F:F0:00/36\tDakty GmbH\n00:50:C2:50:00:00/36\tOrenco Systems, Inc.\n00:50:C2:50:10:00/36\tIBEX UK Limited\n00:50:C2:50:20:00/36\tCriterion Systems Limited\n00:50:C2:50:30:00/36\tRespironics Inc.\n00:50:C2:50:40:00/36\tAphex Systems Ltd.\n00:50:C2:50:50:00/36\tComputerwise, Inc.\n00:50:C2:50:60:00/36\t7+ Kft\n00:50:C2:50:70:00/36\tMicro Connect Pty Ltd\n00:50:C2:50:80:00/36\tPutercom Enterprise Co., Ltd.\n00:50:C2:50:90:00/36\tHillcrest Laboratories, Inc.\n00:50:C2:50:A0:00/36\tMonitor Business Machines Ltd\n00:50:C2:50:B0:00/36\tLogic Beach Inc\n00:50:C2:50:C0:00/36\tAirwise Technology Co., Ltd.\n00:50:C2:50:D0:00/36\tClearsonics Pty. Ltd.\n00:50:C2:50:E0:00/36\tFibresavers Corporation\n00:50:C2:50:F0:00/36\tPolystar Instruments AB\n00:50:C2:51:00:00/36\tSummit Developmen\n00:50:C2:51:10:00/36\tTecna Srl\n00:50:C2:51:20:00/36\tLinear Acoustic, Inc\n00:50:C2:51:30:00/36\tGenie Network Resource Management Inc.\n00:50:C2:51:40:00/36\tTadian Electronics Systems LTD\n00:50:C2:51:50:00/36\tMonaghan Engineering, Inc.\n00:50:C2:51:60:00/36\tSowa Electric Co., Ltd.\n00:50:C2:51:70:00/36\tSolid State Logic\n00:50:C2:51:80:00/36\tChrist Elektronik GmbH\n00:50:C2:51:90:00/36\tDBMCORP, Inc.\n00:50:C2:51:A0:00/36\tSpeasTech, Inc.\n00:50:C2:51:B0:00/36\tBeta Lasermike Ltd\n00:50:C2:51:C0:00/36\tTOA Systems\n00:50:C2:51:D0:00/36\tVelux\n00:50:C2:51:E0:00/36\tAlcon Technologies\n00:50:C2:51:F0:00/36\tTraquair Data Systems, Inc.\n00:50:C2:52:00:00/36\tMcCain Traffic Supply\n00:50:C2:52:10:00/36\tAris Technologies\n00:50:C2:52:20:00/36\tMark IV IDS Corp.\n00:50:C2:52:30:00/36\tAMRDEC Prototype Integration Facility\n00:50:C2:52:40:00/36\tMotec Pty Ltd\n00:50:C2:52:50:00/36\tVASTech\n00:50:C2:52:60:00/36\tAC SYSTEMS, s.r.o.\n00:50:C2:52:70:00/36\tIRTrans GmbH\n00:50:C2:52:80:00/36\tTattile srl\n00:50:C2:52:90:00/36\tPhytec Messtechnik GmbH\n00:50:C2:52:A0:00/36\tOmnitronics Pty Ltd\n00:50:C2:52:B0:00/36\tSicon srl\n00:50:C2:52:C0:00/36\tVitec Multimedia\n00:50:C2:52:D0:00/36\tSmartcom-Bulgaria AD\n00:50:C2:52:E0:00/36\tDsp Design\n00:50:C2:52:F0:00/36\tGesellschaft für  Rationalisierung und Rechentechnik mbH\n00:50:C2:53:00:00/36\tInnovation, Institute, Inc\n00:50:C2:53:10:00/36\tOrion Technologies,LLC\n00:50:C2:53:20:00/36\tNVE Corporation\n00:50:C2:53:30:00/36\tNanShanBridge Co.Ltd\n00:50:C2:53:40:00/36\tHyundai J. Comm\n00:50:C2:53:50:00/36\tMMS Servis s.r.o.\n00:50:C2:53:60:00/36\tC2 Diagnostics\n00:50:C2:53:70:00/36\tDst Control Ab\n00:50:C2:53:80:00/36\tEtherTek Circuits\n00:50:C2:53:90:00/36\tDetection Technology Inc.\n00:50:C2:53:A0:00/36\tImage Control Design Limited\n00:50:C2:53:B0:00/36\tTeleks Co. Ltd.\n00:50:C2:53:C0:00/36\tMarposs SPA\n00:50:C2:53:D0:00/36\tDigital communications Technologies\n00:50:C2:53:E0:00/36\tHoneywell\n00:50:C2:53:F0:00/36\tEllips B.V.\n00:50:C2:54:00:00/36\tMesure Controle Commande\n00:50:C2:54:10:00/36\tWaves System\n00:50:C2:54:20:00/36\tAVerMedia Technologies, Inc.\n00:50:C2:54:30:00/36\tDigi Sesn Ag\n00:50:C2:54:40:00/36\tZetera\n00:50:C2:54:50:00/36\tSecuInfo Co., Ltd.\n00:50:C2:54:60:00/36\tUniversidad de Chile Facultad de Medicina\n00:50:C2:54:70:00/36\tBLANKOM Antennentechnik GmbH\n00:50:C2:54:80:00/36\tI.T.W. Betaprint\n00:50:C2:54:90:00/36\tNetsynt S.p.A.\n00:50:C2:54:A0:00/36\tIPTC Tech. Comm. AB\n00:50:C2:54:B0:00/36\tInnopsys\n00:50:C2:54:C0:00/36\tSintecnos srl\n00:50:C2:54:D0:00/36\tSilent System\n00:50:C2:54:E0:00/36\tConvergent Design\n00:50:C2:54:F0:00/36\tValtronic SA\n00:50:C2:55:00:00/36\tLJU Automatisierungstechnik GmbH\n00:50:C2:55:10:00/36\tInnovative Neurotroncs\n00:50:C2:55:20:00/36\tElfiq Inc.\n00:50:C2:55:30:00/36\tATH system\n00:50:C2:55:40:00/36\tWeinzierl Engineering GmbH\n00:50:C2:55:50:00/36\tControl Alternative Solutions, Inc.\n00:50:C2:55:60:00/36\tFreiburger BlickZentrum\n00:50:C2:55:70:00/36\tNetcomsec Co Ltd\n00:50:C2:55:80:00/36\tBedo Elektronik GmbH\n00:50:C2:55:90:00/36\tFail Safe Solutions LLC\n00:50:C2:55:A0:00/36\tValde Systems, Inc.\n00:50:C2:55:B0:00/36\tMatrix Comsec Private Limited\n00:50:C2:55:C0:00/36\tads-tec GmbH\n00:50:C2:55:D0:00/36\tACD Elektronik GmbH\n00:50:C2:55:E0:00/36\tHanzas Elektronika, Sia\n00:50:C2:55:F0:00/36\tMoog Broad Reach\n00:50:C2:56:00:00/36\tProcon Electronics\n00:50:C2:56:10:00/36\tSeitec Elektronik GmbH\n00:50:C2:56:20:00/36\tC21 Systems Limited\n00:50:C2:56:30:00/36\tOrtrat, S.L.\n00:50:C2:56:40:00/36\tLast Mile Gear\n00:50:C2:56:50:00/36\tWorkpower Tecnologia Eletronica Ltda-Epp\n00:50:C2:56:60:00/36\tubinetsys.co..ltd\n00:50:C2:56:70:00/36\tTess GmbH\n00:50:C2:56:80:00/36\tGeoFocus, LLC\n00:50:C2:56:90:00/36\tTwinwin Technplogy Co.,Ltd.\n00:50:C2:56:A0:00/36\tGrupo Epelsa S.L.\n00:50:C2:56:B0:00/36\tDataton Utvecklings AB\n00:50:C2:56:C0:00/36\tTargeted Technologies, LLC\n00:50:C2:56:D0:00/36\tComputrol Fuel Systems Inc.\n00:50:C2:56:E0:00/36\tLab-El Elektronika Laboratoryjna S.J.\n00:50:C2:56:F0:00/36\tGma, Llc\n00:50:C2:57:00:00/36\tEllex Medical Pty Ltd\n00:50:C2:57:10:00/36\tOberon Service srl\n00:50:C2:57:20:00/36\tChell Instruments Ltd\n00:50:C2:57:30:00/36\tDATAMICRO Co., Ltd.\n00:50:C2:57:40:00/36\tIngeniería AlmudÃ­ S.L.\n00:50:C2:57:50:00/36\tSolystic\n00:50:C2:57:60:00/36\tVisi-tech Systems Ltd\n00:50:C2:57:70:00/36\tAdvanced Software Technologies\n00:50:C2:57:80:00/36\tDelphi Display Systems, Inc.\n00:50:C2:57:90:00/36\tGastager Systemtechnik GmbH\n00:50:C2:57:A0:00/36\tnVent, Schroff GmbH\n00:50:C2:57:B0:00/36\tptswitch\n00:50:C2:57:C0:00/36\téolane\n00:50:C2:57:D0:00/36\tSierra Video Systems\n00:50:C2:57:E0:00/36\tDigital Way\n00:50:C2:57:F0:00/36\tOrderite, Inc.\n00:50:C2:58:00:00/36\tBuyang Electronics Industrial co.,Ltd.\n00:50:C2:58:10:00/36\tDevitech ApS\n00:50:C2:58:20:00/36\tAllSun A/S\n00:50:C2:58:30:00/36\tJunger Audio-Studiotechnik GmbH\n00:50:C2:58:40:00/36\tToyota Motorsport GmbH\n00:50:C2:58:50:00/36\tWireless Cables Inc.\n00:50:C2:58:60:00/36\tGenetix Ltd\n00:50:C2:58:70:00/36\tDynalco\n00:50:C2:58:80:00/36\tFederal Electronics\n00:50:C2:58:90:00/36\tHoriba Abx Sas\n00:50:C2:58:A0:00/36\tDixell S.p.a.\n00:50:C2:58:B0:00/36\tInnovative Dynamics GmbH\n00:50:C2:58:C0:00/36\tLattice Semiconductor Corp. (LPA)\n00:50:C2:58:D0:00/36\tZao\n00:50:C2:58:E0:00/36\tPenny & Giles Aerospace Ltd\n00:50:C2:58:F0:00/36\tXoIP Systems Pty Ltd\n00:50:C2:59:00:00/36\tEM Motorsport Ltd\n00:50:C2:59:10:00/36\tGrosvenor Technology Ltd\n00:50:C2:59:20:00/36\tPaloDEx Group Oy\n00:50:C2:59:30:00/36\tBroadlight\n00:50:C2:59:40:00/36\tPixel Velocity, Inc\n00:50:C2:59:50:00/36\tCallpod, Inc.\n00:50:C2:59:60:00/36\tSpansion\n00:50:C2:59:70:00/36\tNautel LTD\n00:50:C2:59:80:00/36\tBundesamt für Strahlenschutz\n00:50:C2:59:90:00/36\tFen Technology Limited\n00:50:C2:59:A0:00/36\tMultiTrode Pty Ltd\n00:50:C2:59:B0:00/36\tSapec\n00:50:C2:59:C0:00/36\tDelsat Group S.A.\n00:50:C2:59:D0:00/36\tDSS Networks, Inc.\n00:50:C2:59:E0:00/36\tLegerity\n00:50:C2:59:F0:00/36\tads-tec GmbH\n00:50:C2:5A:00:00/36\tRudolph Technologies, Inc.\n00:50:C2:5A:10:00/36\tVestfold Butikkdata AS\n00:50:C2:5A:20:00/36\tiNET Systems Inc.\n00:50:C2:5A:30:00/36\tLumel S.A.\n00:50:C2:5A:40:00/36\tFederal State Unitary Enterprise Experimental Factory for Sc\n00:50:C2:5A:50:00/36\tEquipos de Telecomunicación  Optoelectronicos, S.A.\n00:50:C2:5A:60:00/36\tPlastic Logic\n00:50:C2:5A:70:00/36\tPhytec Messtechnik GmbH\n00:50:C2:5A:80:00/36\tEtap Nv\n00:50:C2:5A:90:00/36\tAYC Telecom Ltd\n00:50:C2:5A:A0:00/36\tTransenna AB\n00:50:C2:5A:B0:00/36\tEaton Corp. Electrical Group Data Center Solutions - Pulizzi\n00:50:C2:5A:C0:00/36\tKinemetrics, Inc.\n00:50:C2:5A:D0:00/36\tEmcom Systems\n00:50:C2:5A:E0:00/36\tCps Europe B.V.\n00:50:C2:5A:F0:00/36\tDorlet Sau\n00:50:C2:5B:00:00/36\tINCOTEC GmbH\n00:50:C2:5B:10:00/36\tRosta Ltd\n00:50:C2:5B:20:00/36\tSyntronic AB\n00:50:C2:5B:30:00/36\tHITECOM System\n00:50:C2:5B:40:00/36\tTerrascience Systems Ltd.\n00:50:C2:5B:50:00/36\tRafael\n00:50:C2:5B:60:00/36\tKontron (BeiJing) Technology Co.,Ltd\n00:50:C2:5B:70:00/36\tAVerMedia Technologies, Inc.\n00:50:C2:5B:80:00/36\tWestfaliaSurge GmbH\n00:50:C2:5B:90:00/36\tTaiwan Video & Monitor\n00:50:C2:5B:A0:00/36\tSAIA Burgess Controls AG\n00:50:C2:5B:B0:00/36\tUnic Technologies Inc\n00:50:C2:5B:C0:00/36\tGuangzhou Hui Si Information Technologies Inc.\n00:50:C2:5B:D0:00/36\tNomus Comm Systems\n00:50:C2:5B:E0:00/36\tCard Access Services Pty Ltd\n00:50:C2:5B:F0:00/36\tTechimp Systems S.r.l.\n00:50:C2:5C:00:00/36\tPyott-Boone Electronics\n00:50:C2:5C:10:00/36\tR. L. Drake Company\n00:50:C2:5C:20:00/36\tIntuitive Surgical, Inc\n00:50:C2:5C:30:00/36\tKS System GmbH\n00:50:C2:5C:40:00/36\tProMik GmbH\n00:50:C2:5C:50:00/36\tRadiant Imaging, Inc.\n00:50:C2:5C:60:00/36\tTechnische Alternative GmbH\n00:50:C2:5C:70:00/36\tInSync Technology Ltd\n00:50:C2:5C:80:00/36\tGeorgia Tech Research Institute\n00:50:C2:5C:90:00/36\tShenzhen Quanlong Technique Co.Ltd\n00:50:C2:5C:A0:00/36\tBuyang Electronics Industrial Co., Ltd.\n00:50:C2:5C:B0:00/36\tKobold Sistemi s.r.l.\n00:50:C2:5C:C0:00/36\tEnseo, Inc.\n00:50:C2:5C:D0:00/36\tRADA Electronics Industries Ltd.\n00:50:C2:5C:E0:00/36\tRoke Manor Research Ltd\n00:50:C2:5C:F0:00/36\tInnomed Medical Inc\n00:50:C2:5D:00:00/36\tAutomata Spa\n00:50:C2:5D:10:00/36\tMeucci Solutions\n00:50:C2:5D:20:00/36\tDA-Design Oy\n00:50:C2:5D:30:00/36\tWexiodisk AB\n00:50:C2:5D:40:00/36\tBuyang Electronics Industrial Co., Ltd.\n00:50:C2:5D:50:00/36\tCannon Technologies\n00:50:C2:5D:60:00/36\tBioAccess Tecnologia em Biometria Ltda.\n00:50:C2:5D:70:00/36\tSynrad, Inc.\n00:50:C2:5D:80:00/36\tTechnifor Sas\n00:50:C2:5D:90:00/36\tCrimson Microsystems, Inc.\n00:50:C2:5D:A0:00/36\tTonna Electronique\n00:50:C2:5D:B0:00/36\tSecure Systems & Services\n00:50:C2:5D:C0:00/36\tRM Michaelides Software & Elektronik GmbH\n00:50:C2:5D:D0:00/36\tSomerData ltd\n00:50:C2:5D:E0:00/36\tMagal Senstar Inc.\n00:50:C2:5D:F0:00/36\tGnutek Ltd.\n00:50:C2:5E:00:00/36\tPhytec Messtechnik GmbH\n00:50:C2:5E:10:00/36\tIttiam Systems (P) Ltd\n00:50:C2:5E:20:00/36\tPYRAMID Computer GmbH\n00:50:C2:5E:30:00/36\tComputechnic AG\n00:50:C2:5E:40:00/36\tBuyang Electronics Industrial Co., Ltd.\n00:50:C2:5E:50:00/36\tStresstech OY\n00:50:C2:5E:60:00/36\tMusatel\n00:50:C2:5E:70:00/36\tEads Test & Services\n00:50:C2:5E:80:00/36\tInfo-Chip Communications Ltd.\n00:50:C2:5E:90:00/36\tMicro Technology Services Inc.\n00:50:C2:5E:A0:00/36\tMicro Elektronische Producten\n00:50:C2:5E:B0:00/36\tGarper Telecomunicaciones, S.L.\n00:50:C2:5E:C0:00/36\tASiS Technologies Pte Ltd\n00:50:C2:5E:D0:00/36\tAquarotter A Franke Company\n00:50:C2:5E:E0:00/36\tCondre Corporation\n00:50:C2:5E:F0:00/36\tpikkerton GmbH\n00:50:C2:5F:00:00/36\tDIAS Infrared GmbH\n00:50:C2:5F:10:00/36\tTechnomarine JSC\n00:50:C2:5F:20:00/36\tESEM Grünau GmbH & Co. KG\n00:50:C2:5F:30:00/36\tPOSNET Polska S.A.\n00:50:C2:5F:40:00/36\tTeamProjects BV\n00:50:C2:5F:50:00/36\tGenesis inc\n00:50:C2:5F:60:00/36\tCambridge Consultants Ltd\n00:50:C2:5F:70:00/36\tMetrologic Group\n00:50:C2:5F:80:00/36\tGrupo Epelsa S.L.\n00:50:C2:5F:90:00/36\tROTHARY Solutions AG\n00:50:C2:5F:A0:00/36\tLEA d.o.o.\n00:50:C2:5F:B0:00/36\tAll-Systems Electronics Pty Ltd\n00:50:C2:5F:C0:00/36\tFilmLight Limited\n00:50:C2:5F:D0:00/36\tMEG Electronic Inc.\n00:50:C2:5F:E0:00/36\tNovacomm Ltda\n00:50:C2:5F:F0:00/36\tGazelle Monitoring Systems\n00:50:C2:60:00:00/36\tProtec Fire Detection plc\n00:50:C2:60:10:00/36\tMedAvant Healthcare\n00:50:C2:60:20:00/36\tChauvin Arnoux\n00:50:C2:60:30:00/36\tCerus Corp\n00:50:C2:60:40:00/36\tHCJB Global\n00:50:C2:60:50:00/36\tSwistec GmbH\n00:50:C2:60:60:00/36\tShenzhen Huazhong Technology Inc\n00:50:C2:60:70:00/36\tTelecom FM\n00:50:C2:60:80:00/36\tSilex Industrial Automation Ltd.\n00:50:C2:60:90:00/36\tToptech Systems, Inc.\n00:50:C2:60:A0:00/36\tGradual Tecnologia Ltda.\n00:50:C2:60:B0:00/36\tShanghai QianJin Electronic Equipment Co. Ltd.\n00:50:C2:60:C0:00/36\tIdentic Ab\n00:50:C2:60:D0:00/36\tSicon srl\n00:50:C2:60:E0:00/36\tAutomation and Control Technology, Inc.\n00:50:C2:60:F0:00/36\tKommunikations- & Sicherheitssysteme Gesellschaft m.b.H\n00:50:C2:61:00:00/36\tFDT Manufacturing, LLC\n00:50:C2:61:10:00/36\tBrookhaven National Laboratory\n00:50:C2:61:20:00/36\tIHP-GmbH\n00:50:C2:61:30:00/36\tTattile Srl\n00:50:C2:61:40:00/36\tProserv\n00:50:C2:61:50:00/36\tAxis Electronics\n00:50:C2:61:60:00/36\tHoneywell\n00:50:C2:61:70:00/36\tNarinet, Inc.\n00:50:C2:61:80:00/36\tIntergrated Security Mfg. Ltd\n00:50:C2:61:90:00/36\tLinkbit, Inc.\n00:50:C2:61:A0:00/36\tCommunication Components Inc.\n00:50:C2:61:B0:00/36\tNCI Technologies Inc.\n00:50:C2:61:C0:00/36\tTestPro Systems, Inc.\n00:50:C2:61:D0:00/36\tSutus Inc\n00:50:C2:61:E0:00/36\tLester Electronics Ltd\n00:50:C2:61:F0:00/36\tImagine Communications\n00:50:C2:62:00:00/36\tHarman/Becker Automotive Systems GmbH\n00:50:C2:62:10:00/36\tVersion-T\n00:50:C2:62:20:00/36\t2N TELEKOMUNIKACE a.s.\n00:50:C2:62:30:00/36\tSafeline Sl\n00:50:C2:62:40:00/36\tComtest Networks\n00:50:C2:62:50:00/36\tEBNeuro SpA\n00:50:C2:62:60:00/36\tWinsys Informatica ltda\n00:50:C2:62:70:00/36\tJungleSystem Co., Ltd.\n00:50:C2:62:80:00/36\tDARE Development\n00:50:C2:62:90:00/36\tMacDonald Humfrey (Products) Ltd\n00:50:C2:62:A0:00/36\tPrisma Engineering srl\n00:50:C2:62:B0:00/36\tFirst Control Systems AB\n00:50:C2:62:C0:00/36\tAirMatrix, Inc.\n00:50:C2:62:D0:00/36\tProcon Electronics\n00:50:C2:62:E0:00/36\tTDM Ingénierie\n00:50:C2:62:F0:00/36\tQes\n00:50:C2:63:00:00/36\tAurora Flight Sciences\n00:50:C2:63:10:00/36\tFraunhofer IIS\n00:50:C2:63:20:00/36\tRoseTechnology A/S\n00:50:C2:63:30:00/36\tRice University\n00:50:C2:63:40:00/36\tSohon Inc\n00:50:C2:63:50:00/36\tShockfish SA\n00:50:C2:63:60:00/36\tdSPACE GmbH\n00:50:C2:63:70:00/36\tOmnitrol Networks, Inc.\n00:50:C2:63:80:00/36\tHUNGAROCOM Telecommunication Ltd.\n00:50:C2:63:90:00/36\tQstreams Networks Inc.\n00:50:C2:63:A0:00/36\t3DSP Corporation\n00:50:C2:63:B0:00/36\tPowis Corporation\n00:50:C2:63:C0:00/36\tdPict Imaging, Inc.\n00:50:C2:63:D0:00/36\tIDERs Inc\n00:50:C2:63:E0:00/36\tT2 Communication Ltd\n00:50:C2:63:F0:00/36\tSpeech Technology Center Limited\n00:50:C2:64:00:00/36\tIac\n00:50:C2:64:10:00/36\tNEO Information Systems Co., Ltd.\n00:50:C2:64:20:00/36\tStanton Technologies Sdn Bhd\n00:50:C2:64:30:00/36\tEnatel Limited\n00:50:C2:64:40:00/36\tPhytec Messtechnik GmbH\n00:50:C2:64:50:00/36\tThe Software Group Limited\n00:50:C2:64:60:00/36\tTrutouch Technologies Inc\n00:50:C2:64:70:00/36\tR&D Technology Solutionz Limited\n00:50:C2:64:80:00/36\tFidelity Comtech, Inc.\n00:50:C2:64:90:00/36\tPan-STARRS\n00:50:C2:64:A0:00/36\tCPqD\n00:50:C2:64:B0:00/36\tMangoDSP\n00:50:C2:64:C0:00/36\tCIS Corporation\n00:50:C2:64:D0:00/36\tTera Information System Labs\n00:50:C2:64:E0:00/36\tNorthern Power\n00:50:C2:64:F0:00/36\tMA Lighting Technology GmbH\n00:50:C2:65:00:00/36\tLiquid Breaker, LLC\n00:50:C2:65:10:00/36\tStaer Spa\n00:50:C2:65:20:00/36\tWideco Sweden AB\n00:50:C2:65:30:00/36\tDoble Engineering\n00:50:C2:65:40:00/36\tPaloDEx Group Oy\n00:50:C2:65:50:00/36\tPhysik Instrumente (PI) GmbH&Co.KG\n00:50:C2:65:60:00/36\tLDA Audio Video Profesional\n00:50:C2:65:70:00/36\tMonytel S.A.\n00:50:C2:65:80:00/36\tOpenPKG GmbH\n00:50:C2:65:90:00/36\tDorsett Technologies Inc\n00:50:C2:65:A0:00/36\tHisstema AB\n00:50:C2:65:B0:00/36\tSilverbrook Research\n00:50:C2:65:C0:00/36\tVTZ d.o.o.\n00:50:C2:65:D0:00/36\tRedfone Communications LLC\n00:50:C2:65:E0:00/36\tCantion A/S\n00:50:C2:65:F0:00/36\tInvocon, Inc.\n00:50:C2:66:00:00/36\tIzisoft\n00:50:C2:66:10:00/36\tP.C.E.\n00:50:C2:66:20:00/36\tAsia Pacific Card & System Sdn Bhd\n00:50:C2:66:30:00/36\tCOE Limited\n00:50:C2:66:40:00/36\tWestel Wireless Systems\n00:50:C2:66:50:00/36\tNetworkSound, Inc\n00:50:C2:66:60:00/36\tXworks NZ Limited\n00:50:C2:66:70:00/36\tVocality International Ltd\n00:50:C2:66:80:00/36\tKeith & Koep GmbH\n00:50:C2:66:90:00/36\tDsp Design\n00:50:C2:66:A0:00/36\tABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.\n00:50:C2:66:B0:00/36\tflsystem\n00:50:C2:66:C0:00/36\tDesy\n00:50:C2:66:D0:00/36\tDIGITEK S.p.A.\n00:50:C2:66:E0:00/36\tLinear Systems Ltd.\n00:50:C2:66:F0:00/36\tNilan A/S\n00:50:C2:67:00:00/36\tNaim Audio\n00:50:C2:67:10:00/36\tSkyline Products, Inc\n00:50:C2:67:20:00/36\tDDS Elettronica srl\n00:50:C2:67:30:00/36\tFerrari electronic AG\n00:50:C2:67:40:00/36\tProtech Optronics Co., Ltd.\n00:50:C2:67:50:00/36\tKenton Research Ltd\n00:50:C2:67:60:00/36\tEds\n00:50:C2:67:70:00/36\tProconX Pty Ltd\n00:50:C2:67:80:00/36\tIhm\n00:50:C2:67:90:00/36\tIndustrial Vacuum Systems\n00:50:C2:67:A0:00/36\tCC Systems AB\n00:50:C2:67:B0:00/36\tSparton Electronics\n00:50:C2:67:C0:00/36\tGogo BA\n00:50:C2:67:D0:00/36\tESA  Messtechnik GmbH\n00:50:C2:67:E0:00/36\tSAIA Burgess Controls AG\n00:50:C2:67:F0:00/36\tPhytec Messtechnik GmbH\n00:50:C2:68:00:00/36\tHoney Network Research Limited\n00:50:C2:68:10:00/36\tOwasys Advanced Wireless Devices\n00:50:C2:68:20:00/36\tCommet AB\n00:50:C2:68:30:00/36\tMEGGITT Safety System\n00:50:C2:68:40:00/36\tREASON Tecnologia S.A.\n00:50:C2:68:50:00/36\tDatamars SA\n00:50:C2:68:60:00/36\tANNAX Anzeigesysteme GmbH\n00:50:C2:68:70:00/36\tAccess Specialties, Inc\n00:50:C2:68:80:00/36\tElk Products\n00:50:C2:68:90:00/36\tRF Code\n00:50:C2:68:A0:00/36\tZhuhai Jiahe Electronics Co.,LTD\n00:50:C2:68:B0:00/36\tSimtek Inc.\n00:50:C2:68:C0:00/36\tIsochron Inc\n00:50:C2:68:D0:00/36\tCXR Larus Corporation\n00:50:C2:68:E0:00/36\tSelco\n00:50:C2:68:F0:00/36\tBertronic Srl\n00:50:C2:69:00:00/36\tGHL Systems Berhad\n00:50:C2:69:10:00/36\tInteropix, Inc.\n00:50:C2:69:20:00/36\tMate Media Access Technologies\n00:50:C2:69:30:00/36\tTech Comm, Inc.\n00:50:C2:69:40:00/36\tInitel srl\n00:50:C2:69:50:00/36\tPurelink Technology, inc.\n00:50:C2:69:60:00/36\tCasabyte Inc.\n00:50:C2:69:70:00/36\tMonarch Instrument\n00:50:C2:69:80:00/36\tNavtech Radar Ltd\n00:50:C2:69:90:00/36\tBulletendpoints Enterprises Inc\n00:50:C2:69:A0:00/36\tStoreTech Limited\n00:50:C2:69:B0:00/36\tTsien (UK) Ltd\n00:50:C2:69:C0:00/36\tBug Labs, Inc.\n00:50:C2:69:D0:00/36\tDvation.co.,Ltd\n00:50:C2:69:E0:00/36\tIdeus AB\n00:50:C2:69:F0:00/36\tTotal RF, LLC\n00:50:C2:6A:00:00/36\tGFP Lab S.r.l.\n00:50:C2:6A:10:00/36\tPricol Limited\n00:50:C2:6A:20:00/36\tCadi Scientific Pte Ltd\n00:50:C2:6A:30:00/36\tCreaTech Electronics Co.\n00:50:C2:6A:40:00/36\tTeletask\n00:50:C2:6A:50:00/36\tEATON FHF Funke + Huster Fernsig GmbH\n00:50:C2:6A:60:00/36\tVictory Concept Industries Ltd.\n00:50:C2:6A:70:00/36\tHoer GmbH & Co. Industrie-Electronic KG\n00:50:C2:6A:80:00/36\tDelcan Technologies, Inc\n00:50:C2:6A:90:00/36\tArmida Technologies Corporation\n00:50:C2:6A:A0:00/36\tIfox - Industria e Comercio Ltda\n00:50:C2:6A:B0:00/36\tSoftwareentwicklung\n00:50:C2:6A:C0:00/36\tThales UK\n00:50:C2:6A:D0:00/36\tHeim- & Bürokommunikation\n00:50:C2:6A:E0:00/36\tQualisys AB\n00:50:C2:6A:F0:00/36\tNanoradio AB\n00:50:C2:6B:00:00/36\tSmart Key International Limited\n00:50:C2:6B:10:00/36\tBurk Technology\n00:50:C2:6B:20:00/36\tEdgeware AB\n00:50:C2:6B:30:00/36\t4RF Communications Ltd\n00:50:C2:6B:40:00/36\tSomesca\n00:50:C2:6B:50:00/36\tTriumf\n00:50:C2:6B:60:00/36\tCommoDaS GmbH\n00:50:C2:6B:70:00/36\tSystem LSI CO.Ltd.\n00:50:C2:6B:80:00/36\tEpec Oy\n00:50:C2:6B:90:00/36\tunipo GmbH\n00:50:C2:6B:A0:00/36\tFertron Controle e Automacao Industrial Ltda.\n00:50:C2:6B:B0:00/36\tEle.Mag S.r.l.\n00:50:C2:6B:C0:00/36\tParaytec Ltd\n00:50:C2:6B:D0:00/36\tMitron Oy\n00:50:C2:6B:E0:00/36\tESTEC Co.,Ltd.\n00:50:C2:6B:F0:00/36\tOptoplan as\n00:50:C2:6C:00:00/36\tGloster Sante Europe\n00:50:C2:6C:10:00/36\tRADIUS Sweden AB\n00:50:C2:6C:20:00/36\tHoseoTelnet Inc...\n00:50:C2:6C:30:00/36\tiTRACS Corporation\n00:50:C2:6C:40:00/36\tREXXON GmbH\n00:50:C2:6C:50:00/36\tOerlikon Contraves AG\n00:50:C2:6C:60:00/36\tMedAvant Healthcare\n00:50:C2:6C:70:00/36\tQuickCircuit Ltd.\n00:50:C2:6C:80:00/36\tB&S MEDIA Co., LTD.\n00:50:C2:6C:90:00/36\tNetami\n00:50:C2:6C:A0:00/36\tDynamic Hearing Pty Ltd\n00:50:C2:6C:B0:00/36\tStream Processors\n00:50:C2:6C:C0:00/36\tWidmer Time Recorder Co., Inc.\n00:50:C2:6C:D0:00/36\tRgm Spa\n00:50:C2:6C:E0:00/36\tEMITALL Surveillance S.A,\n00:50:C2:6C:F0:00/36\tMicroway\n00:50:C2:6D:00:00/36\tEDS Systemtechnik\n00:50:C2:6D:10:00/36\tSchnick-Schnack-Systems GmbH\n00:50:C2:6D:20:00/36\tLumistar Incorporated\n00:50:C2:6D:30:00/36\tDigiSensory technologies Pty Ltd\n00:50:C2:6D:40:00/36\tEtani Electronics Co.,Ltd.\n00:50:C2:6D:50:00/36\tBecker Electronics GmbH\n00:50:C2:6D:60:00/36\tADL Electronics Ltd.\n00:50:C2:6D:70:00/36\tMavenir System, Inc.\n00:50:C2:6D:80:00/36\tBL Healthcare, Inc.\n00:50:C2:6D:90:00/36\tAjeco Oy\n00:50:C2:6D:A0:00/36\tTechno Fittings S.r.l.\n00:50:C2:6D:B0:00/36\tGebhardt Ventilatoren GmbH\n00:50:C2:6D:C0:00/36\tL-3 Communications Mobile-Vision, Inc.\n00:50:C2:6D:D0:00/36\tZmicro Systems Inc\n00:50:C2:6D:E0:00/36\tLaser Tools & Technics Corp.\n00:50:C2:6D:F0:00/36\tQR Sciences Ltd\n00:50:C2:6E:00:00/36\tFIRSTTRUST Co.,Ltd.\n00:50:C2:6E:10:00/36\tNewOnSys Ltd.\n00:50:C2:6E:20:00/36\tPhytec Messtechnik GmbH\n00:50:C2:6E:30:00/36\tMiros AS\n00:50:C2:6E:40:00/36\tMangoDSP\n00:50:C2:6E:50:00/36\tBoeckeler Instruments, Inc.\n00:50:C2:6E:60:00/36\tLanetco\n00:50:C2:6E:70:00/36\tAce Axis Limited\n00:50:C2:6E:80:00/36\tAnymax\n00:50:C2:6E:90:00/36\tBando electronic communication Co.Lltd\n00:50:C2:6E:A0:00/36\tFirstec Sa\n00:50:C2:6E:B0:00/36\tHarrison Audio, LLC\n00:50:C2:6E:C0:00/36\tNetistix Technologies Corporation\n00:50:C2:6E:D0:00/36\tSechan Electronics, Inc.\n00:50:C2:6E:E0:00/36\tInteractive Electronic Systems\n00:50:C2:6E:F0:00/36\tPneumopartners LaenneXT SA\n00:50:C2:6F:00:00/36\tStanley Security Solutions, Inc.\n00:50:C2:6F:10:00/36\tITS Telecom\n00:50:C2:6F:20:00/36\tLaser Electronics Ltd\n00:50:C2:6F:30:00/36\tE3Switch LLC\n00:50:C2:6F:40:00/36\tCryogenic Control Systems, Inc.\n00:50:C2:6F:50:00/36\tKitron Microelectronics AB\n00:50:C2:6F:60:00/36\tAV SatCom AS\n00:50:C2:6F:70:00/36\tinfoplan Gesellschaftfür  Informationssysteme mbH\n00:50:C2:6F:80:00/36\tRV Technology Limited\n00:50:C2:6F:90:00/36\tRevox GmbH\n00:50:C2:6F:A0:00/36\tDcns\n00:50:C2:6F:B0:00/36\tWaveIP\n00:50:C2:6F:C0:00/36\tActe Sp. z o.o.\n00:50:C2:6F:D0:00/36\tSAIA Burgess Controls AG\n00:50:C2:6F:E0:00/36\tBlue Origin\n00:50:C2:6F:F0:00/36\tSt. Michael Strategies Inc.\n00:50:C2:70:00:00/36\tGem-Med Sl\n00:50:C2:70:10:00/36\tKeith & Koep GmbH\n00:50:C2:70:20:00/36\tSPM Instrument AB\n00:50:C2:70:30:00/36\tSAE IT-systems GmbH & Co. KG\n00:50:C2:70:40:00/36\tThe Dini Group, La Jolla inc.\n00:50:C2:70:50:00/36\tHauch & Bach ApS\n00:50:C2:70:60:00/36\tDioDigiWorks. CO., LTD.\n00:50:C2:70:70:00/36\tDTech Labs Inc\n00:50:C2:70:80:00/36\tSmartek d.o.o.\n00:50:C2:70:90:00/36\tRO.VE.R. Laboratories S.p.A\n00:50:C2:70:A0:00/36\tEfficient Channel Coding\n00:50:C2:70:B0:00/36\tB.E.A.R. Solutions (Australasia) Pty, Ltd\n00:50:C2:70:C0:00/36\tExertus\n00:50:C2:70:D0:00/36\tela-soft GmbH & Co. KG\n00:50:C2:70:E0:00/36\tAudico Systems Oy\n00:50:C2:70:F0:00/36\tZumbach Electronic AG\n00:50:C2:71:00:00/36\tWharton Electronics Ltd\n00:50:C2:71:10:00/36\tLinkit S.R.L.\n00:50:C2:71:20:00/36\tPasan SA\n00:50:C2:71:30:00/36\t3DX-Ray Limited\n00:50:C2:71:40:00/36\tT.E.Am., S. A.\n00:50:C2:71:50:00/36\tRIEXINGER Elektronik\n00:50:C2:71:60:00/36\tMitrol S.R.L.\n00:50:C2:71:70:00/36\tMB connect line GmbH Fernwartungssysteme\n00:50:C2:71:80:00/36\tillunis LLC\n00:50:C2:71:90:00/36\tennovatis GmbH\n00:50:C2:71:A0:00/36\tLogus Broadband Wireless Solutions Inc.\n00:50:C2:71:B0:00/36\tADVA Optical Networking\n00:50:C2:71:C0:00/36\tElmec Inc.\n00:50:C2:71:D0:00/36\tMG s.r.l.\n00:50:C2:71:E0:00/36\tASKI Industrie Elektronik Ges.m.b.H.\n00:50:C2:71:F0:00/36\tASC telecom AG\n00:50:C2:72:00:00/36\tColorado Engineering Inc.\n00:50:C2:72:10:00/36\tSpectrum Communications FZE\n00:50:C2:72:20:00/36\tCentric TSolve BV\n00:50:C2:72:30:00/36\tPower Electronics Espana, S.L.\n00:50:C2:72:40:00/36\tHSC-Regelungstechnik GmbH\n00:50:C2:72:50:00/36\tDsp Design\n00:50:C2:72:60:00/36\teta systemi CKB\n00:50:C2:72:70:00/36\tPelweckyj Videotechnik GmbH\n00:50:C2:72:80:00/36\tInterDigital Canada Ltd\n00:50:C2:72:90:00/36\tSP Controls, Inc\n00:50:C2:72:A0:00/36\tPhytec Messtechnik GmbH\n00:50:C2:72:B0:00/36\tSequestered Solutions\n00:50:C2:72:C0:00/36\tRichard Griessbach Feinmechanik GmbH\n00:50:C2:72:D0:00/36\tPhysical Acoustics Corporation\n00:50:C2:72:E0:00/36\tSncf Eim Pays De Loire\n00:50:C2:72:F0:00/36\tPriority Electronics Ltd\n00:50:C2:73:00:00/36\thaber & koenig electronics gmbh\n00:50:C2:73:10:00/36\tSpirent Communications\n00:50:C2:73:20:00/36\tSchlumberger K.K.\n00:50:C2:73:30:00/36\tCimetrics Research Pty Ltd\n00:50:C2:73:40:00/36\tCardioMEMS Inc.\n00:50:C2:73:50:00/36\tAnt Lamp, Inc\n00:50:C2:73:60:00/36\tNika Ltd\n00:50:C2:73:70:00/36\tTeradici Corporation\n00:50:C2:73:80:00/36\tMiracom Technology Co., Ltd.\n00:50:C2:73:90:00/36\tTattile srl\n00:50:C2:73:A0:00/36\tNaturela Ltd.\n00:50:C2:73:B0:00/36\tOn Air Networks\n00:50:C2:73:C0:00/36\tSimicon\n00:50:C2:73:D0:00/36\tcryptiris\n00:50:C2:73:E0:00/36\tQuantec Networks GmbH\n00:50:C2:73:F0:00/36\tMEDAV GmbH\n00:50:C2:74:00:00/36\tMcQuay China\n00:50:C2:74:10:00/36\tDain\n00:50:C2:74:20:00/36\tFantuzzi Reggiane\n00:50:C2:74:30:00/36\tElektro-Top 3000 Ltd.\n00:50:C2:74:40:00/36\tAvonaco Systems, Inc.\n00:50:C2:74:50:00/36\tAcisa\n00:50:C2:74:60:00/36\tRealtronix Company\n00:50:C2:74:70:00/36\tCDSA Dam Neck\n00:50:C2:74:80:00/36\tLetechnic Ltd\n00:50:C2:74:90:00/36\tAffolter Technologies SA\n00:50:C2:74:A0:00/36\tMonitor Electronics Ltd\n00:50:C2:74:B0:00/36\tSTAR-Dundee Ltd\n00:50:C2:74:C0:00/36\tSaia-Burgess Controls AG\n00:50:C2:74:D0:00/36\tBeceem Communications, Inc.\n00:50:C2:74:E0:00/36\tTronico\n00:50:C2:74:F0:00/36\tGerman Technologies\n00:50:C2:75:00:00/36\tBrightlights Intellectual Property Ltd\n00:50:C2:75:10:00/36\te&s Engineering & Software GmbH\n00:50:C2:75:20:00/36\tLober, S.A.\n00:50:C2:75:30:00/36\tAbb\n00:50:C2:75:40:00/36\tAbeo Corporation\n00:50:C2:75:50:00/36\tTeletek Electronics\n00:50:C2:75:60:00/36\tChesapeake Sciences Corp\n00:50:C2:75:70:00/36\tE S P Technologies Ltd\n00:50:C2:75:80:00/36\tAixSolve GmbH\n00:50:C2:75:90:00/36\tSequentric Energy Systems, LLC\n00:50:C2:75:A0:00/36\tGaisler Research AB\n00:50:C2:75:B0:00/36\tDMT System S.p.A.\n00:50:C2:75:C0:00/36\tSTÖRK-TRONIC Störk GmbH&Co. KG\n00:50:C2:75:D0:00/36\tFluid Analytics, Inc.\n00:50:C2:75:E0:00/36\tSky-Skan, Incorporated\n00:50:C2:75:F0:00/36\tB. Rexroth the identity company GmbH\n00:50:C2:76:00:00/36\tAr'S Co., Ltd.\n00:50:C2:76:10:00/36\tElbit Systems of America\n00:50:C2:76:20:00/36\tAssembly Contracts Limited\n00:50:C2:76:30:00/36\tXtendWave\n00:50:C2:76:40:00/36\tArgus-Spectrum\n00:50:C2:76:50:00/36\tPhytec Messtechnik GmbH\n00:50:C2:76:60:00/36\tGutermann Technology GmbH\n00:50:C2:76:70:00/36\tEid\n00:50:C2:76:80:00/36\tControl Service do Brasil Ltda\n00:50:C2:76:90:00/36\tBES GmbH\n00:50:C2:76:A0:00/36\tDigidrive Audio Limited\n00:50:C2:76:B0:00/36\tPutercom Enterprise Co., LTD.\n00:50:C2:76:C0:00/36\tEFG CZ spol. s r.o.\n00:50:C2:76:D0:00/36\tMobilisme\n00:50:C2:76:E0:00/36\tCrinia Corporation\n00:50:C2:76:F0:00/36\tControl and Robotics Solutions\n00:50:C2:77:00:00/36\tCadex Electronics Inc.\n00:50:C2:77:10:00/36\tZigBee Alliance\n00:50:C2:77:20:00/36\tIES Elektronikentwicklung\n00:50:C2:77:30:00/36\tPointe Conception Medical Inc.\n00:50:C2:77:40:00/36\tGeoSIG Ltd.\n00:50:C2:77:50:00/36\tLaserdyne Technologies\n00:50:C2:77:60:00/36\tIntegrated Security Corporation\n00:50:C2:77:70:00/36\tEuro Display Srl\n00:50:C2:77:80:00/36\tSunGard Vivista\n00:50:C2:77:90:00/36\tCoral Telecom Ltd\n00:50:C2:77:A0:00/36\tSmith Meter, Inc\n00:50:C2:77:B0:00/36\tItibia Technologies\n00:50:C2:77:C0:00/36\tAtec Srl\n00:50:C2:77:D0:00/36\tLincoln Industrial\n00:50:C2:77:E0:00/36\tCominfo, Inc.\n00:50:C2:77:F0:00/36\tACD Elektronik GmbH\n00:50:C2:78:00:00/36\tIQ Solutions GmbH & Co. KG\n00:50:C2:78:10:00/36\tStarling Advanced Communications\n00:50:C2:78:20:00/36\tPhytec Messtechnik GmbH\n00:50:C2:78:30:00/36\tNORMA systems GmbH\n00:50:C2:78:40:00/36\tLewis Controls Inc.\n00:50:C2:78:50:00/36\tIcon Time Systems\n00:50:C2:78:60:00/36\tKeith & Koep GmbH\n00:50:C2:78:70:00/36\tAustco Marketing & Service (USA) ltd.\n00:50:C2:78:80:00/36\tHosa Technology, Inc.\n00:50:C2:78:90:00/36\tRosslare Enterprises Limited\n00:50:C2:78:A0:00/36\tLevel Telecom\n00:50:C2:78:B0:00/36\tOMICRON electronics GmbH\n00:50:C2:78:C0:00/36\tGiga-tronics, Inc.\n00:50:C2:78:D0:00/36\tTelairity\n00:50:C2:78:E0:00/36\tGlobalcom Engineering Srl\n00:50:C2:78:F0:00/36\tELMAR electronic\n00:50:C2:79:00:00/36\tGE Security-Kampro\n00:50:C2:79:10:00/36\tM Squared Lasers Limited\n00:50:C2:79:20:00/36\tSMARTRO Co.,Ltd.\n00:50:C2:79:30:00/36\tEnertex Bayern GmbH\n00:50:C2:79:40:00/36\tComsonics, Inc.\n00:50:C2:79:50:00/36\tAmeli Spa\n00:50:C2:79:60:00/36\tDorlet Sau\n00:50:C2:79:70:00/36\tTiefenbach Control Systems GmbH\n00:50:C2:79:80:00/36\tIndefia\n00:50:C2:79:90:00/36\tAavd\n00:50:C2:79:A0:00/36\tJMC America, LLC\n00:50:C2:79:B0:00/36\tSchniewindt GmbH & Co. KG\n00:50:C2:79:C0:00/36\tVital Systems Inc\n00:50:C2:79:D0:00/36\tMiraTrek\n00:50:C2:79:E0:00/36\tBenshaw Canada Controls, Inc.\n00:50:C2:79:F0:00/36\tZao Npc\n00:50:C2:7A:00:00/36\tMedAvant Healthcare\n00:50:C2:7A:10:00/36\tField Design Service\n00:50:C2:7A:20:00/36\tRaySat Israel LTD\n00:50:C2:7A:30:00/36\tABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.\n00:50:C2:7A:40:00/36\tCalibre UK LTD\n00:50:C2:7A:50:00/36\tQuantum Medical Imaging\n00:50:C2:7A:60:00/36\tAsiana Idt\n00:50:C2:7A:70:00/36\tGuidance Navigation Limited\n00:50:C2:7A:80:00/36\tIntegrated Design Tools, Inc.\n00:50:C2:7A:90:00/36\tDelta Tau Data Systems, Inc.\n00:50:C2:7A:A0:00/36\tGrupo Epelsa S.L.\n00:50:C2:7A:B0:00/36\tGeneral Microsystems Sdn Bhd\n00:50:C2:7A:C0:00/36\tIusa Sa De Cv\n00:50:C2:7A:D0:00/36\tTurun Turvatekniikka Oy\n00:50:C2:7A:E0:00/36\tGlobal Tel-Link\n00:50:C2:7A:F0:00/36\tC2 Microsystems\n00:50:C2:7B:00:00/36\tIMP Telekom\n00:50:C2:7B:10:00/36\tAteme\n00:50:C2:7B:20:00/36\tA.D.I Video technologies\n00:50:C2:7B:30:00/36\tElmec,  Inc.\n00:50:C2:7B:40:00/36\tT 1 Engineering\n00:50:C2:7B:50:00/36\tDIT-MCO International\n00:50:C2:7B:60:00/36\tAlstom (Schweiz) AG\n00:50:C2:7B:70:00/36\tTattile srl\n00:50:C2:7B:80:00/36\tDesign 2000 Pty Ltd\n00:50:C2:7B:90:00/36\tTechnovare Systems, Inc.\n00:50:C2:7B:A0:00/36\tInfodev Electronic Designers Intl.\n00:50:C2:7B:B0:00/36\tInRay Solutions Ltd.\n00:50:C2:7B:C0:00/36\tEidos Spa\n00:50:C2:7B:D0:00/36\tPromate Electronic Co.Ltd\n00:50:C2:7B:E0:00/36\tPowerlinx, Inc.\n00:50:C2:7B:F0:00/36\tZoe Medical\n00:50:C2:7C:00:00/36\tEuropean Industrial Electronics B.V.\n00:50:C2:7C:10:00/36\tPrimary Integration Encorp LLC\n00:50:C2:7C:20:00/36\tDSR Information Technologies Ltd.\n00:50:C2:7C:30:00/36\tAst Incorporated\n00:50:C2:7C:40:00/36\tMoBaCon\n00:50:C2:7C:50:00/36\tVenture Research Inc.\n00:50:C2:7C:60:00/36\tSL Audio A/S\n00:50:C2:7C:70:00/36\tPyrosequencing AB\n00:50:C2:7C:80:00/36\tFr. Sauter AG\n00:50:C2:7C:90:00/36\tBluebell Opticom Limited\n00:50:C2:7C:A0:00/36\tCEDAR Audio Ltd\n00:50:C2:7C:B0:00/36\tViewPlus Technologies, Inc.\n00:50:C2:7C:C0:00/36\tSweco Japs Ab\n00:50:C2:7C:D0:00/36\tPrecision MicroControl Corporation\n00:50:C2:7C:E0:00/36\tGogo BA\n00:50:C2:7C:F0:00/36\tEmitech Corporation\n00:50:C2:7D:00:00/36\tRadar Tronic ltd.\n00:50:C2:7D:10:00/36\tPhytec Messtechnik GmbH\n00:50:C2:7D:20:00/36\tBittitalo Oy\n00:50:C2:7D:30:00/36\tHighrail Systems Limited\n00:50:C2:7D:40:00/36\tWR Systems, Ltd.\n00:50:C2:7D:50:00/36\tDEUTA-WERKE GmbH\n00:50:C2:7D:60:00/36\tInternational Mining Technologies\n00:50:C2:7D:70:00/36\tNewtec A/S\n00:50:C2:7D:80:00/36\tInnoScan K/S\n00:50:C2:7D:90:00/36\tVolumatic Limited\n00:50:C2:7D:A0:00/36\tHTEC Limited\n00:50:C2:7D:B0:00/36\tMueller Elektronik\n00:50:C2:7D:C0:00/36\taiXtrusion GmbH\n00:50:C2:7D:D0:00/36\tLS Elektronik AB\n00:50:C2:7D:E0:00/36\tCascade Technologies Ltd\n00:50:C2:7D:F0:00/36\tPrivate\n00:50:C2:7E:00:00/36\tC&D Technologies, Inc\n00:50:C2:7E:10:00/36\tZeltiq Aesthetics, Inc.\n00:50:C2:7E:20:00/36\tDigitrol Ltd\n00:50:C2:7E:30:00/36\tProgentech Limited\n00:50:C2:7E:40:00/36\tMeta Vision Systems Ltd.\n00:50:C2:7E:50:00/36\tNystrom Engineering\n00:50:C2:7E:60:00/36\tEmpirix Italy S.p.A.\n00:50:C2:7E:70:00/36\tV2Green, Inc.\n00:50:C2:7E:80:00/36\tMistral Solutions Pvt. Ltd\n00:50:C2:7E:90:00/36\tSicon srl\n00:50:C2:7E:A0:00/36\tMonitor Business Machines Ltd.\n00:50:C2:7E:B0:00/36\tSesol Industrial Computer\n00:50:C2:7E:C0:00/36\tLyngsoe Systems\n00:50:C2:7E:D0:00/36\tGenesis Automation Inc.\n00:50:C2:7E:E0:00/36\tNH Research\n00:50:C2:7E:F0:00/36\tGFI Chrono Time\n00:50:C2:7F:00:00/36\tNetwork Harbor, Inc.\n00:50:C2:7F:10:00/36\tSTUHL Regelsysteme GmbH\n00:50:C2:7F:20:00/36\tLogotherm Regelsysteme GmbH\n00:50:C2:7F:30:00/36\tSorec\n00:50:C2:7F:40:00/36\tWireless Cables Inc.\n00:50:C2:7F:50:00/36\tACE Carwash Systems\n00:50:C2:7F:60:00/36\tSaia-Burgess Controls AG\n00:50:C2:7F:70:00/36\tMangoDSP\n00:50:C2:7F:80:00/36\tWise Industria de Telecomunicações Ldta.\n00:50:C2:7F:90:00/36\tKarl DUNGS GmbH & Co. KG\n00:50:C2:7F:A0:00/36\tAutomationX GmbH\n00:50:C2:7F:B0:00/36\tQtron Pty Ltd\n00:50:C2:7F:C0:00/36\tTIS Dialog LLC\n00:50:C2:7F:D0:00/36\tAdeneo\n00:50:C2:7F:E0:00/36\tWireless Cables Inc.\n00:50:C2:7F:F0:00/36\tShenzhen MaiWei Cable TV Equipment CO.,LTD.\n00:50:C2:80:00:00/36\tDelphi Display Systems, Inc.\n00:50:C2:80:10:00/36\tJANUS srl\n00:50:C2:80:20:00/36\tPrivate\n00:50:C2:80:30:00/36\tdB Broadcast Limited\n00:50:C2:80:40:00/36\tSoftSwitching Technologies\n00:50:C2:80:50:00/36\tMultimediaLED\n00:50:C2:80:60:00/36\tCet\n00:50:C2:80:70:00/36\tTechnomark\n00:50:C2:80:80:00/36\tITB CompuPhase\n00:50:C2:80:90:00/36\tVarma Electronics Oy\n00:50:C2:80:A0:00/36\tPhytec Messtechnik GmbH\n00:50:C2:80:B0:00/36\tOpen Video, Inc.\n00:50:C2:80:C0:00/36\tLuxpert Technologies Co., Ltd.\n00:50:C2:80:D0:00/36\tAcube Systems s.r.l.\n00:50:C2:80:E0:00/36\tBruno International Ltd.\n00:50:C2:80:F0:00/36\tSelekron Microcontrol s.l.\n00:50:C2:81:00:00/36\tAlphion Corporation\n00:50:C2:81:10:00/36\tOpen System Solutions Limited\n00:50:C2:81:20:00/36\tFemto SA\n00:50:C2:81:30:00/36\tIntelleflex Corporation\n00:50:C2:81:40:00/36\tTelvent\n00:50:C2:81:50:00/36\tmicroC Design SRL\n00:50:C2:81:60:00/36\tQ-Free America, Inc.\n00:50:C2:81:70:00/36\tOdin TeleSystems Inc\n00:50:C2:81:80:00/36\tWireless Value BV\n00:50:C2:81:90:00/36\tCabinplant A/S\n00:50:C2:81:A0:00/36\tInfoGLOBAL\n00:50:C2:81:B0:00/36\tBrain Tech Co., Ltd\n00:50:C2:81:C0:00/36\tTelcom\n00:50:C2:81:D0:00/36\tIt Salux Co., Ltd.\n00:50:C2:81:E0:00/36\tChannelot Ltd.\n00:50:C2:81:F0:00/36\t2N TELEKOMUNIKACE a.s.\n00:50:C2:82:00:00/36\tTESCAN, s.r.o.\n00:50:C2:82:10:00/36\tMISCO Refractometer\n00:50:C2:82:20:00/36\tWinner Technology Co, Ltd.\n00:50:C2:82:30:00/36\tRobot Visual Systems GmbH\n00:50:C2:82:40:00/36\tSMT d.o.o.\n00:50:C2:82:50:00/36\tFunkwerk Information Technologies Karlsfeld GmbH\n00:50:C2:82:60:00/36\tHEWI Heinrich Wilke GmbH\n00:50:C2:82:70:00/36\tEnero Solutions inc.\n00:50:C2:82:80:00/36\tSLICAN sp. z o.o.\n00:50:C2:82:90:00/36\tIntellectronika\n00:50:C2:82:A0:00/36\tVDC Display Systems\n00:50:C2:82:B0:00/36\tKeith & Koep GmbH\n00:50:C2:82:C0:00/36\tVitel Net\n00:50:C2:82:D0:00/36\tElmec, Inc.\n00:50:C2:82:E0:00/36\tLogiCom GmbH\n00:50:C2:82:F0:00/36\tMomentum Data Systems\n00:50:C2:83:00:00/36\tCompuShop Services LLC\n00:50:C2:83:10:00/36\tSt Jude Medical, Inc.\n00:50:C2:83:20:00/36\tS1nn GmbH & Co. KG\n00:50:C2:83:30:00/36\tLaserLinc, Inc.\n00:50:C2:83:40:00/36\tANTEK GmbH\n00:50:C2:83:50:00/36\tCommunications Laboratories Inc\n00:50:C2:83:60:00/36\tDsp Design\n00:50:C2:83:70:00/36\tID-KARTA s.r.o.\n00:50:C2:83:80:00/36\tT Proje Muhendislik Dis. Tic. Ltd. Sti.\n00:50:C2:83:90:00/36\tIMS Röntgensysteme GmbH\n00:50:C2:83:A0:00/36\tSyr-Tec Engineering & Marketing\n00:50:C2:83:B0:00/36\tO. Bay AG\n00:50:C2:83:C0:00/36\thema electronic GmbH\n00:50:C2:83:D0:00/36\tberoNet GmbH\n00:50:C2:83:E0:00/36\tKPE spol. s r.o.\n00:50:C2:83:F0:00/36\tPhytec Messtechnik GmbH\n00:50:C2:84:00:00/36\tResidential Control Systems\n00:50:C2:84:10:00/36\tConnection Electronics Ltd.\n00:50:C2:84:20:00/36\tQuantum Controls BV\n00:50:C2:84:30:00/36\tXtensor Systems Inc.\n00:50:C2:84:40:00/36\tProdigy Electronics Limited\n00:50:C2:84:50:00/36\tVisualSonics Inc.\n00:50:C2:84:60:00/36\tESP-Planning Co.\n00:50:C2:84:70:00/36\tLars Morich Kommunikationstechnik GmbH\n00:50:C2:84:80:00/36\tDASA ROBOT Co., Ltd.\n00:50:C2:84:90:00/36\tDesign Analysis Associates, Inc.\n00:50:C2:84:A0:00/36\tKeystone Electronic Solutions\n00:50:C2:84:B0:00/36\tTask Sistemas De Computacao Ltda\n00:50:C2:84:C0:00/36\tPerformance Motion Devices\n00:50:C2:84:D0:00/36\tBmti\n00:50:C2:84:E0:00/36\tDraco Systems\n00:50:C2:84:F0:00/36\tGamber-Johnson LLC\n00:50:C2:85:00:00/36\tK.K. Rocky\n00:50:C2:85:10:00/36\tSPJ Embedded Technologies Pvt. Ltd.\n00:50:C2:85:20:00/36\teInfochips Ltd.\n00:50:C2:85:30:00/36\tEttus Research LLC\n00:50:C2:85:40:00/36\tRatioplast-Optoelectronics GmbH\n00:50:C2:85:50:00/36\tRohde&Schwarz Topex SA\n00:50:C2:85:60:00/36\tCT Company\n00:50:C2:85:70:00/36\tGrupo Epelsa S.L.\n00:50:C2:85:80:00/36\tWireless Acquisition LLC\n00:50:C2:85:90:00/36\tNuvation\n00:50:C2:85:A0:00/36\tArt Spa\n00:50:C2:85:B0:00/36\tBoreste\n00:50:C2:85:C0:00/36\tB S E\n00:50:C2:85:D0:00/36\tIng. Knauseder Mechatronik GmbH\n00:50:C2:85:E0:00/36\tRadiometer Medical ApS\n00:50:C2:85:F0:00/36\tGD Mission Systems\n00:50:C2:86:00:00/36\tEutron S.p.A.\n00:50:C2:86:10:00/36\tGrantronics Pty Ltd\n00:50:C2:86:20:00/36\tElsys AG\n00:50:C2:86:30:00/36\tAdvanced Technology Solutions\n00:50:C2:86:40:00/36\tATG Automatisierungstechnik GERA GmbH\n00:50:C2:86:50:00/36\tPersy Control Services B.v.\n00:50:C2:86:60:00/36\tSaia Burgess Controls AG\n00:50:C2:86:70:00/36\tSyntronics\n00:50:C2:86:80:00/36\tAethon, Inc.\n00:50:C2:86:90:00/36\tFunkwerk plettac electronic GmbH\n00:50:C2:86:A0:00/36\tUSM Systems, Ltd\n00:50:C2:86:B0:00/36\tOMB Sistemas Electronicos S.A.\n00:50:C2:86:C0:00/36\tCondigi Televagt A/S\n00:50:C2:86:D0:00/36\tTieline Research Pty Ltd\n00:50:C2:86:E0:00/36\tHanyang Electric Cp., Ltd\n00:50:C2:86:F0:00/36\tb-plus GmbH\n00:50:C2:87:00:00/36\tLogel S.R.L.\n00:50:C2:87:10:00/36\tR-S-I Elektrotechnik GmbH & Co. KG\n00:50:C2:87:20:00/36\tOliotalo Oy\n00:50:C2:87:30:00/36\tXRONET Corporation\n00:50:C2:87:40:00/36\tArcos Technologies Ltd.\n00:50:C2:87:50:00/36\tPhytec Messtechnik GmbH\n00:50:C2:87:60:00/36\tPrivatquelle Gruber GmbH & CO KG\n00:50:C2:87:70:00/36\tMotion Analysis Corp\n00:50:C2:87:80:00/36\tAcoustic Research Laboratories Pty Ltd\n00:50:C2:87:90:00/36\tMilesys\n00:50:C2:87:A0:00/36\tSpectrum Management, LC\n00:50:C2:87:B0:00/36\tUAVNavigation S.L.\n00:50:C2:87:C0:00/36\tArcontia AB\n00:50:C2:87:D0:00/36\tAT&T Government Solutions\n00:50:C2:87:E0:00/36\tScm Products, Inc.\n00:50:C2:87:F0:00/36\tOptoelettronica Italia S.r.l.\n00:50:C2:88:00:00/36\tCreation Technologies Chicago\n00:50:C2:88:10:00/36\tInnoTrans Communications, Inc.\n00:50:C2:88:20:00/36\tWarecube,Inc.\n00:50:C2:88:30:00/36\tNeocontrol Soluções em Automação\n00:50:C2:88:40:00/36\tIP Thinking A/S\n00:50:C2:88:50:00/36\tOoo \"Ntk \"Imos\"\n00:50:C2:88:60:00/36\tWartsila Voyage Oy\n00:50:C2:88:70:00/36\tInventis Technology Pty Limited\n00:50:C2:88:80:00/36\tIAdea Corporation\n00:50:C2:88:90:00/36\tACS Motion Control Ltd.\n00:50:C2:88:A0:00/36\tContinental Electronics Corp.\n00:50:C2:88:B0:00/36\tHollis Electronics Company LLC\n00:50:C2:88:C0:00/36\tZ-App Systems\n00:50:C2:88:D0:00/36\tL3 Communications Nova Engineering\n00:50:C2:88:E0:00/36\tCardinal Scale Mfg Co\n00:50:C2:88:F0:00/36\tKeynote SIGOS GmbH\n00:50:C2:89:00:00/36\tBAE Systems Hägglunds AB\n00:50:C2:89:10:00/36\tAdmiral Secure Products, Ltd.\n00:50:C2:89:20:00/36\tTrakce a.s.\n00:50:C2:89:30:00/36\tEIZO Technologies GmbH\n00:50:C2:89:40:00/36\tShockfish SA\n00:50:C2:89:50:00/36\tMarine Communications Limited\n00:50:C2:89:60:00/36\tBlankom\n00:50:C2:89:70:00/36\tODF Optronics, Inc.\n00:50:C2:89:80:00/36\tVeeco Process Equipment, Inc.\n00:50:C2:89:90:00/36\tInico Technologies Ltd.\n00:50:C2:89:A0:00/36\tNeptune Technology Group Inc.\n00:50:C2:89:B0:00/36\tSensata Technologies\n00:50:C2:89:C0:00/36\tMediana\n00:50:C2:89:D0:00/36\tSystemtechnik GmbH\n00:50:C2:89:E0:00/36\tBroadcast Electronics\n00:50:C2:89:F0:00/36\tDatalink Technologies Gateways Inc.\n00:50:C2:8A:00:00/36\tSpecialized Communications Corp.\n00:50:C2:8A:10:00/36\tIntune Networks\n00:50:C2:8A:20:00/36\tUAVISION Engenharia de Sistemas\n00:50:C2:8A:30:00/36\tRTW GmbH & Co.KG\n00:50:C2:8A:40:00/36\tBALOGH T.A.G Corporation\n00:50:C2:8A:50:00/36\tMocon, Inc.\n00:50:C2:8A:60:00/36\tSelco\n00:50:C2:8A:70:00/36\tPixeye Ltd\n00:50:C2:8A:80:00/36\tAltek Electronics\n00:50:C2:8A:90:00/36\tIntelligent Security Systems\n00:50:C2:8A:A0:00/36\tATS Elektronik GmbH\n00:50:C2:8A:B0:00/36\tNanomotion Ltd.\n00:50:C2:8A:C0:00/36\tTelsa s.r.l\n00:50:C2:8A:D0:00/36\tThales Communications Inc\n00:50:C2:8A:E0:00/36\tDesarrollo De Sistemas Integrados De Control S.A.\n00:50:C2:8A:F0:00/36\tXelerated\n00:50:C2:8B:00:00/36\tBK Innovation, Inc.\n00:50:C2:8B:10:00/36\tRingCube Technologies, Inc.\n00:50:C2:8B:20:00/36\tServaind Sa.\n00:50:C2:8B:30:00/36\tVTQ Videtronik GmbH\n00:50:C2:8B:40:00/36\tSandar Telecast AS\n00:50:C2:8B:50:00/36\tKeith & Koep GmbH\n00:50:C2:8B:60:00/36\tShadrinskiy Telefonny Zavod\n00:50:C2:8B:70:00/36\tCalnex Solutions plc\n00:50:C2:8B:80:00/36\tDSS Networks, Inc.\n00:50:C2:8B:90:00/36\tACD Elektronik GmbH\n00:50:C2:8B:A0:00/36\tFr. Sauter AG\n00:50:C2:8B:B0:00/36\tsmtag international ag\n00:50:C2:8B:C0:00/36\tHoneywell Sensotec\n00:50:C2:8B:D0:00/36\tMatrix Switch Corporation\n00:50:C2:8B:E0:00/36\tThe Pennsylvania State University\n00:50:C2:8B:F0:00/36\tARISTO Graphic Systeme GmbH & Co. KG\n00:50:C2:8C:00:00/36\tS.C.E. s.r.l.\n00:50:C2:8C:10:00/36\tHeraeus Noblelight GmbH\n00:50:C2:8C:20:00/36\tAccess Control Systems JSC\n00:50:C2:8C:30:00/36\tByte Paradigm\n00:50:C2:8C:40:00/36\tSoldig Industria e Comercio de Equipamentos Eletronicos LTDA\n00:50:C2:8C:50:00/36\tVortex Engineering pvt ltd\n00:50:C2:8C:60:00/36\tGradual Tecnologia Ltda.\n00:50:C2:8C:70:00/36\tTattile Srl\n00:50:C2:8C:80:00/36\tPumatronix Equipamentos Eletronicos Ltda.\n00:50:C2:8C:90:00/36\tA+S Aktuatorik und Sensorik GmbH\n00:50:C2:8C:A0:00/36\tAltair semiconductor Ltd\n00:50:C2:8C:B0:00/36\tBeonic Corporation\n00:50:C2:8C:C0:00/36\tLyconSys GmbH & Co.KG\n00:50:C2:8C:D0:00/36\tCambridge Sound Management, LLC\n00:50:C2:8C:E0:00/36\tPhytec Messtechnik GmbH\n00:50:C2:8C:F0:00/36\tGigaLinx Ltd.\n00:50:C2:8D:00:00/36\tSaia-Burgess Controls AG\n00:50:C2:8D:10:00/36\tBachmann Monitoring GmbH\n00:50:C2:8D:20:00/36\tTTi Ltd\n00:50:C2:8D:30:00/36\tIFAM GmbH\n00:50:C2:8D:40:00/36\tInternet Protocolo Logica Sl\n00:50:C2:8D:50:00/36\tPeek Traffic Corp\n00:50:C2:8D:60:00/36\tUltraVision Security Systems, Inc.\n00:50:C2:8D:70:00/36\tPolygon Informatics Ltd.\n00:50:C2:8D:80:00/36\tArray Technologies Inc\n00:50:C2:8D:90:00/36\tIndustrial Control and Communication Limited\n00:50:C2:8D:A0:00/36\tDocutemp, Inc\n00:50:C2:8D:B0:00/36\tDCOM Network Technology (Pty) Ltd\n00:50:C2:8D:C0:00/36\tFrame Systems Limited\n00:50:C2:8D:D0:00/36\tGimcon\n00:50:C2:8D:E0:00/36\tCoherix, Inc\n00:50:C2:8D:F0:00/36\tDipl.-Ing. W. Nophut GmbH\n00:50:C2:8E:00:00/36\tShenzhen Pennda Technologies Co., Ltd.\n00:50:C2:8E:10:00/36\tDeutscher Weterdienst\n00:50:C2:8E:20:00/36\tWireless Cables Inc.\n00:50:C2:8E:30:00/36\tbioMérieux Italia S.p.A.\n00:50:C2:8E:40:00/36\tMaCaPS International Limited\n00:50:C2:8E:50:00/36\tBerthel GmbH\n00:50:C2:8E:60:00/36\tSandel Avionics, Inc.\n00:50:C2:8E:70:00/36\tMKT Systemtechnik\n00:50:C2:8E:80:00/36\tFriedrich Kuhnt GmbH\n00:50:C2:8E:90:00/36\tUnidata\n00:50:C2:8E:A0:00/36\tAteme\n00:50:C2:8E:B0:00/36\tC-COM Satellite Systems Inc.\n00:50:C2:8E:C0:00/36\tBalfour Beatty Rail GmbH\n00:50:C2:8E:D0:00/36\tAT-Automation Technology GmbH\n00:50:C2:8E:E0:00/36\tPcsc\n00:50:C2:8E:F0:00/36\tTechnologies Sensio Inc\n00:50:C2:8F:00:00/36\tXentras Communications\n00:50:C2:8F:10:00/36\tDetection Technologies Ltd.\n00:50:C2:8F:20:00/36\tSchneider Electric GmbH\n00:50:C2:8F:30:00/36\tCurtis Door Systems Inc\n00:50:C2:8F:40:00/36\tCritical Link LLC\n00:50:C2:8F:50:00/36\ttec5 AG\n00:50:C2:8F:60:00/36\tK-MAC Corp.\n00:50:C2:8F:70:00/36\tTGE Co., Ltd.\n00:50:C2:8F:80:00/36\tRmsd Ltd\n00:50:C2:8F:90:00/36\tHoneywell\n00:50:C2:8F:A0:00/36\tTELIUM s.c.\n00:50:C2:8F:B0:00/36\tAlfred Kuhse GmbH\n00:50:C2:8F:C0:00/36\tSymetrics Industries\n00:50:C2:8F:D0:00/36\tSindoma Müh Mim Ýnþ Elk San Tic Ltd.\n00:50:C2:8F:E0:00/36\tCross Country Systems AB\n00:50:C2:8F:F0:00/36\tLuceat\n00:50:C2:90:00:00/36\tMagor Communications Corp\n00:50:C2:90:10:00/36\tResearch Applications Incorp\n00:50:C2:90:20:00/36\tChina Railway Signal & Communication Corp.\n00:50:C2:90:30:00/36\tEcoAxis Systems Pvt. Ltd.\n00:50:C2:90:40:00/36\tR2Sonic, LLC\n00:50:C2:90:50:00/36\tLink Communications, Inc\n00:50:C2:90:60:00/36\tGidel\n00:50:C2:90:70:00/36\tCristal Controles Ltee\n00:50:C2:90:80:00/36\tCodex Digital Ltd\n00:50:C2:90:90:00/36\tElisra\n00:50:C2:90:A0:00/36\tBoard Level Limited\n00:50:C2:90:B0:00/36\tE.ON ES Sverige AB\n00:50:C2:90:C0:00/36\tLSS GmbH\n00:50:C2:90:D0:00/36\tEVK DI Kerschhaggl GmbH\n00:50:C2:90:E0:00/36\tPhytec Messtechnik GmbH\n00:50:C2:90:F0:00/36\tINTEGRA Biosciences AG\n00:50:C2:91:00:00/36\tAutotank AB\n00:50:C2:91:10:00/36\tVapor Rail\n00:50:C2:91:20:00/36\tASSET InterTech, Inc.\n00:50:C2:91:30:00/36\tLeonardo UK Ltd\n00:50:C2:91:40:00/36\tIO-Connect\n00:50:C2:91:50:00/36\tVerint Systems Ltd.\n00:50:C2:91:60:00/36\tCHK GridSense P/L\n00:50:C2:91:70:00/36\tCirtem\n00:50:C2:91:80:00/36\tDesign Lightning Corp\n00:50:C2:91:90:00/36\tAHV Systems, Inc.\n00:50:C2:91:A0:00/36\tXtone Networks\n00:50:C2:91:B0:00/36\tEmbedded Data Systems, LLC\n00:50:C2:91:C0:00/36\tMangoDSP\n00:50:C2:91:D0:00/36\tRosendahl Studiotechnik GmbH\n00:50:C2:91:E0:00/36\tAutomation Tec\n00:50:C2:91:F0:00/36\t2Ncomm Design Srl\n00:50:C2:92:00:00/36\tRogue Engineering Inc.\n00:50:C2:92:10:00/36\tiQue RFID Technologies BV\n00:50:C2:92:20:00/36\tMetrum Sweden AB\n00:50:C2:92:30:00/36\tAmicus Wireless\n00:50:C2:92:40:00/36\tLink Electric & Safety Control Co.\n00:50:C2:92:50:00/36\tPHB Eletronica Ltda.\n00:50:C2:92:60:00/36\tDiTEST Fahrzeugdiagnose GmbH\n00:50:C2:92:70:00/36\tATIS group s.r.o.\n00:50:C2:92:80:00/36\tCinetix GmbH\n00:50:C2:92:90:00/36\tFlight Deck Resources\n00:50:C2:92:A0:00/36\tRohde&Schwarz Topex SA\n00:50:C2:92:B0:00/36\tDsp Design\n00:50:C2:92:C0:00/36\tExatrol Corporation\n00:50:C2:92:D0:00/36\tAPProSoftware.com\n00:50:C2:92:E0:00/36\tGoanna Technologies Pty Ltd\n00:50:C2:92:F0:00/36\tPhytec Messtechnik GmbH\n00:50:C2:93:00:00/36\tNETA Elektronik AS\n00:50:C2:93:10:00/36\tKorea Telecom Internet Solutions (KTIS)\n00:50:C2:93:20:00/36\tSMAVIS Inc.\n00:50:C2:93:30:00/36\tSaia-Burgess Controls AG\n00:50:C2:93:40:00/36\tXilar Corp.\n00:50:C2:93:50:00/36\tImage Video\n00:50:C2:93:60:00/36\tMargaritis Engineering\n00:50:C2:93:70:00/36\tBigBear\n00:50:C2:93:80:00/36\tPostec Data Systems Ltd\n00:50:C2:93:90:00/36\tMosaic Dynamic Solutions\n00:50:C2:93:A0:00/36\tALPHATRONICS nv\n00:50:C2:93:B0:00/36\tCleaveland/Price, Inc.\n00:50:C2:93:C0:00/36\tFractureCode Corporation\n00:50:C2:93:D0:00/36\tLighting Science Group\n00:50:C2:93:E0:00/36\tRCS Communication Test Systems Ltd.\n00:50:C2:93:F0:00/36\tTSB Solutions Inc.\n00:50:C2:94:00:00/36\tPhitek Systems Ltd.\n00:50:C2:94:10:00/36\tRolbit\n00:50:C2:94:20:00/36\tKeith & Koep GmbH\n00:50:C2:94:30:00/36\tQuanZhou TDX Electronics Co., Ltd.\n00:50:C2:94:40:00/36\tWireonair A/S\n00:50:C2:94:50:00/36\tExi Flow Measurement Ltd\n00:50:C2:94:60:00/36\tMEGWARE Computer GmbH\n00:50:C2:94:70:00/36\tIMEXHIGHWAY cvba\n00:50:C2:94:80:00/36\tElectronia\n00:50:C2:94:90:00/36\ttaskit GmbH\n00:50:C2:94:A0:00/36\tTruMedia Measurement Ltd.\n00:50:C2:94:B0:00/36\tPiller engineering Ltd.\n00:50:C2:94:C0:00/36\tTemix\n00:50:C2:94:D0:00/36\tC&H technology  ltd.\n00:50:C2:94:E0:00/36\tZynix Original Sdn. Bhd.\n00:50:C2:94:F0:00/36\tIT-Designers GmbH\n00:50:C2:95:00:00/36\tTele and Radio Research Institute\n00:50:C2:95:10:00/36\tEL.C.A. soc. coop.\n00:50:C2:95:20:00/36\tTech Fass s.r.o.\n00:50:C2:95:30:00/36\tGrupo Epelsa S.L.\n00:50:C2:95:40:00/36\tPhytec Messtechnik GmbH\n00:50:C2:95:50:00/36\tRoessmann Engineering\n00:50:C2:95:60:00/36\tSicon srl\n00:50:C2:95:70:00/36\tSTRATEC Control Systems\n00:50:C2:95:80:00/36\tSensoptics Ltd\n00:50:C2:95:90:00/36\tDECTRIS Ltd.\n00:50:C2:95:A0:00/36\tTechnoAP\n00:50:C2:95:B0:00/36\tAS Solar GmbH\n00:50:C2:95:C0:00/36\tResurgent Health & Medical\n00:50:C2:95:D0:00/36\tfull electronic system\n00:50:C2:95:E0:00/36\tBEEcube Inc.\n00:50:C2:95:F0:00/36\tMetronic Aparatura Kontrolno - Pomiarowa\n00:50:C2:96:00:00/36\tkuroneko dennnou kenkyuushitsu\n00:50:C2:96:10:00/36\tPicsolve International Limited\n00:50:C2:96:20:00/36\tShockfish SA\n00:50:C2:96:30:00/36\tLécureux SA\n00:50:C2:96:40:00/36\tIQ Automation GmbH\n00:50:C2:96:50:00/36\tEmitech Corporation\n00:50:C2:96:60:00/36\tPCM Industries\n00:50:C2:96:70:00/36\tWatthour Engineering Co., Inc.\n00:50:C2:96:80:00/36\tBuLogics, Inc.\n00:50:C2:96:90:00/36\tGehrke Kommunikationssysteme GmbH\n00:50:C2:96:A0:00/36\tBittium Wireless Ltd\n00:50:C2:96:B0:00/36\tElectronic Media Services Ltd\n00:50:C2:96:C0:00/36\tAqua Cooler Pty Ltd\n00:50:C2:96:D0:00/36\tKeene Electronics Ltd.\n00:50:C2:96:E0:00/36\tPeek Traffic Corporation\n00:50:C2:96:F0:00/36\tVarec Inc.\n00:50:C2:97:00:00/36\tTsuji Electronics Co.,Ltd\n00:50:C2:97:10:00/36\tIpitek\n00:50:C2:97:20:00/36\tSwitch Science (Panini Keikaku)\n00:50:C2:97:30:00/36\tSystèmes Pran\n00:50:C2:97:40:00/36\tEMAC, Inc.\n00:50:C2:97:50:00/36\tPyramid Technical Consultants\n00:50:C2:97:60:00/36\tSands Instrumentation India Pvt Ltd\n00:50:C2:97:70:00/36\tSaia-Burgess Controls AG\n00:50:C2:97:80:00/36\tLOGITAL DIGITAL MEDIA srl\n00:50:C2:97:90:00/36\tFar South Networks (Pty) Ltd\n00:50:C2:97:A0:00/36\tKST Technology Co., Ltd\n00:50:C2:97:B0:00/36\tSmartquantum Sa\n00:50:C2:97:C0:00/36\tCreacon Technologies B.V.\n00:50:C2:97:D0:00/36\tSoehnle Professional GmbH & Co.KG\n00:50:C2:97:E0:00/36\tRF Industries\n00:50:C2:97:F0:00/36\tC&I  Co.Ltd\n00:50:C2:98:00:00/36\tDigital Payment Technologies\n00:50:C2:98:10:00/36\tNovotronik GmbH\n00:50:C2:98:20:00/36\tTriple Ring Technologies, Inc.\n00:50:C2:98:30:00/36\tBogart Engineering\n00:50:C2:98:40:00/36\tAtel Corporation\n00:50:C2:98:50:00/36\tEarnestcom Sdn Bhd\n00:50:C2:98:60:00/36\tDsci\n00:50:C2:98:70:00/36\tJoinsoon Electronics MFG. Co., Ltd\n00:50:C2:98:80:00/36\tPantel International\n00:50:C2:98:90:00/36\tPsigenics Corporation\n00:50:C2:98:A0:00/36\tMEV Limited\n00:50:C2:98:B0:00/36\tTi2000 Tecnologia Informatica 2000\n00:50:C2:98:C0:00/36\tMGM-Devices Oy\n00:50:C2:98:D0:00/36\tMecos AG\n00:50:C2:98:E0:00/36\tLink Technologies, Inc\n00:50:C2:98:F0:00/36\tBelik S.P.R.L.\n00:50:C2:99:00:00/36\tKeith & Koep GmbH\n00:50:C2:99:10:00/36\tUGL Limited\n00:50:C2:99:20:00/36\tIDT Sound Processing Corporation\n00:50:C2:99:30:00/36\tUnetconvergence Co., Ltd\n00:50:C2:99:40:00/36\tXafax Nederland bv\n00:50:C2:99:50:00/36\tInter Control Hermann Köhler  Elektrik GmbH&Co.KG\n00:50:C2:99:60:00/36\tCommercial Timesharing Inc.\n00:50:C2:99:70:00/36\tDepro Électronique\n00:50:C2:99:80:00/36\tPhytec Messtechnik GmbH\n00:50:C2:99:90:00/36\tCambustion Ltd\n00:50:C2:99:A0:00/36\tMiromico AG\n00:50:C2:99:B0:00/36\tBettini srl\n00:50:C2:99:C0:00/36\tCaTs3 Limited\n00:50:C2:99:D0:00/36\tPowersense A/S\n00:50:C2:99:E0:00/36\tEngage Technologies\n00:50:C2:99:F0:00/36\tSietron Elektronik\n00:50:C2:9A:00:00/36\tTrs Systems, Inc.\n00:50:C2:9A:10:00/36\tComAp s.r.o\n00:50:C2:9A:20:00/36\tSAMsystems GmbH\n00:50:C2:9A:30:00/36\tComputerwise, Inc.\n00:50:C2:9A:40:00/36\tEntwicklung Hard- & Software\n00:50:C2:9A:50:00/36\tConolog Corporation\n00:50:C2:9A:60:00/36\tMetodo2\n00:50:C2:9A:70:00/36\tThales Communications & Security S.A.\n00:50:C2:9A:80:00/36\tDomis Sa\n00:50:C2:9A:90:00/36\tGD Mission Systems\n00:50:C2:9A:A0:00/36\tTEKO TELECOM SpA\n00:50:C2:9A:B0:00/36\tElectrodata Inc.\n00:50:C2:9A:C0:00/36\tQuestek Australia Pty Ltd\n00:50:C2:9A:D0:00/36\tChronos Technology Ltd.\n00:50:C2:9A:E0:00/36\tEsensors, Inc.\n00:50:C2:9A:F0:00/36\tKRESS-NET Krzysztof Rutecki\n00:50:C2:9B:00:00/36\tEbru GmbH\n00:50:C2:9B:10:00/36\tBon Hora GmbH\n00:50:C2:9B:20:00/36\tMesa Labs, Inc.\n00:50:C2:9B:30:00/36\tKahler Automation\n00:50:C2:9B:40:00/36\tEukrea Electromatique Sarl\n00:50:C2:9B:50:00/36\tTelegamma srl\n00:50:C2:9B:60:00/36\tActech\n00:50:C2:9B:70:00/36\tSt. Michael Strategies\n00:50:C2:9B:80:00/36\tSound Player Systems e.K.\n00:50:C2:9B:90:00/36\tISA - Intelligent Sensing Anywhere, S.A.\n00:50:C2:9B:A0:00/36\tConnor-Winfield\n00:50:C2:9B:B0:00/36\tOMICRON electronics GmbH\n00:50:C2:9B:C0:00/36\tKistler Straubenhardt GmbH\n00:50:C2:9B:D0:00/36\tSensitron Semiconductor\n00:50:C2:9B:E0:00/36\tXad Communications Ltd\n00:50:C2:9B:F0:00/36\t2N TELEKOMUNIKACE a.s.\n00:50:C2:9C:00:00/36\tStuyts Engineering Haarlem BV\n00:50:C2:9C:10:00/36\tTattile srl\n00:50:C2:9C:20:00/36\tTeam Enginers\n00:50:C2:9C:30:00/36\tGE Security-Kampro\n00:50:C2:9C:40:00/36\tVitel Net\n00:50:C2:9C:50:00/36\tScansonic MI GmbH\n00:50:C2:9C:60:00/36\tProtronic GmbH\n00:50:C2:9C:70:00/36\tKumera Drives Oy\n00:50:C2:9C:80:00/36\tethermetrics\n00:50:C2:9C:90:00/36\tLUMINEX Lighting Control Equipment\n00:50:C2:9C:A0:00/36\tESAB-ATAS GmbH\n00:50:C2:9C:B0:00/36\tNIS-time GmbH\n00:50:C2:9C:C0:00/36\tHirotech inc.\n00:50:C2:9C:D0:00/36\tUwe Schneider GmbH\n00:50:C2:9C:E0:00/36\tRonan Engineering\n00:50:C2:9C:F0:00/36\tIntuitive Surgical, Inc\n00:50:C2:9D:00:00/36\tJ. DITTRICH ELEKTRONIC GmbH & Co. KG\n00:50:C2:9D:10:00/36\tBladelius Design Group AB\n00:50:C2:9D:20:00/36\tSaia-Burgess Controls AG\n00:50:C2:9D:30:00/36\tTelemetrie Elektronik GmbH\n00:50:C2:9D:40:00/36\tFirst\n00:50:C2:9D:50:00/36\tNetpower Labs AB\n00:50:C2:9D:60:00/36\tInnovation, Institute, Inc\n00:50:C2:9D:70:00/36\tMelex Inc.\n00:50:C2:9D:80:00/36\tSamsung Heavy Industries Co.,Ltd.\n00:50:C2:9D:90:00/36\tCNS Systems, Inc.\n00:50:C2:9D:A0:00/36\tNEUTRONIK e.K.\n00:50:C2:9D:B0:00/36\tWalter Grotkasten\n00:50:C2:9D:C0:00/36\tFTM Marketing Limited\n00:50:C2:9D:D0:00/36\tInstitut Dr. Foerster\n00:50:C2:9D:E0:00/36\tChauvin Arnoux\n00:50:C2:9D:F0:00/36\tCODEC Co., Ltd.\n00:50:C2:9E:00:00/36\tDST Swiss AG\n00:50:C2:9E:10:00/36\tEnreduce Energy Control AB\n00:50:C2:9E:20:00/36\tE-ViEWS SAFETY SYSTEMS, INC\n00:50:C2:9E:30:00/36\tSAI Informationstechnik\n00:50:C2:9E:40:00/36\tPyxis Controls WLL\n00:50:C2:9E:50:00/36\tHalliburton Far East Pte Ltd\n00:50:C2:9E:60:00/36\tKumho Electric, Inc.\n00:50:C2:9E:70:00/36\tDorlet Sau\n00:50:C2:9E:80:00/36\tHammock Corporation\n00:50:C2:9E:90:00/36\tCiemme Sistemi Spa\n00:50:C2:9E:A0:00/36\tSISMODULAR - Engenharia, Lda\n00:50:C2:9E:B0:00/36\tAFORE Solutions Inc.\n00:50:C2:9E:C0:00/36\tRohde&Schwarz Topex SA\n00:50:C2:9E:D0:00/36\tPicell B.V.\n00:50:C2:9E:E0:00/36\tMichael Stevens & Partners Ltd\n00:50:C2:9E:F0:00/36\tWoKa-Elektronik GmbH\n00:50:C2:9F:00:00/36\tVeracity UK Ltd\n00:50:C2:9F:10:00/36\tIDEAS s.r.l.\n00:50:C2:9F:20:00/36\tKeith & Koep GmbH\n00:50:C2:9F:30:00/36\tVision Technologies, Inc.\n00:50:C2:9F:40:00/36\tFsr, Inc.\n00:50:C2:9F:50:00/36\tCommex Technologies\n00:50:C2:9F:60:00/36\tIon Sense Inc.\n00:50:C2:9F:70:00/36\tDave Jones Design\n00:50:C2:9F:80:00/36\tAustco Marketing & Service (USA) ltd.\n00:50:C2:9F:90:00/36\tABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.\n00:50:C2:9F:A0:00/36\tTeranex A Division of Silicon Optix\n00:50:C2:9F:B0:00/36\tVillbau Kft.\n00:50:C2:9F:C0:00/36\tEctec Inc.\n00:50:C2:9F:D0:00/36\tBitt technology-A Ltd.\n00:50:C2:9F:E0:00/36\tSpectra Embedded Systems\n00:50:C2:9F:F0:00/36\tHumphrey Products\n00:50:C2:A0:00:00/36\tTechnovare Systems\n00:50:C2:A0:10:00/36\tPatronics International LTD\n00:50:C2:A0:20:00/36\tReference, LLC.\n00:50:C2:A0:30:00/36\tEEG Enterprises Inc\n00:50:C2:A0:40:00/36\tTP Radio\n00:50:C2:A0:50:00/36\tAdgil Design Inc.\n00:50:C2:A0:60:00/36\tCloos Electronic Gmbh\n00:50:C2:A0:70:00/36\tDynon Instruments\n00:50:C2:A0:80:00/36\tLabJack Corporation\n00:50:C2:A0:90:00/36\tInnovative American Technology\n00:50:C2:A0:A0:00/36\tACD Elektronik GmbH\n00:50:C2:A0:B0:00/36\tIDS GeoRadar s.r.l.\n00:50:C2:A0:C0:00/36\tPhytec Messtechnik GmbH\n00:50:C2:A0:D0:00/36\tCharlyrobot\n00:50:C2:A0:E0:00/36\tENGICAM s.r.l.\n00:50:C2:A0:F0:00/36\tVisualware Inc\n00:50:C2:A1:00:00/36\tEssential Design & Integration P/L\n00:50:C2:A1:10:00/36\tOJSC Rawenstvo\n00:50:C2:A1:20:00/36\tHCE Engineering S.r.l.\n00:50:C2:A1:30:00/36\tTalyst, Inc.\n00:50:C2:A1:40:00/36\tElbit Systems of America - Tallahassee Operations\n00:50:C2:A1:50:00/36\tIndustrial Computing Ltd\n00:50:C2:A1:60:00/36\tBaudisch Electronic GmbH\n00:50:C2:A1:70:00/36\tWinners Satellite Electronics Corp.\n00:50:C2:A1:80:00/36\tEoslink\n00:50:C2:A1:90:00/36\tIcon Time Systems\n00:50:C2:A1:A0:00/36\tDdl\n00:50:C2:A1:B0:00/36\tRealtime Systems Ltd.\n00:50:C2:A1:C0:00/36\tMicrotechnica\n00:50:C2:A1:D0:00/36\tSAMH Engineering Services\n00:50:C2:A1:E0:00/36\tMAMAC Systems, Inc.\n00:50:C2:A1:F0:00/36\tFlight Data Systems Pty Ltd\n00:50:C2:A2:00:00/36\tQuorum Technologies Ltd\n00:50:C2:A2:10:00/36\tIsac Srl\n00:50:C2:A2:20:00/36\tNippon Manufacturing Service Corporation (abbreviated as 'nms')\n00:50:C2:A2:30:00/36\tAgility Mfg, Inc.\n00:50:C2:A2:40:00/36\tGrupo Epelsa S.L.\n00:50:C2:A2:50:00/36\tSaia-Burgess Controls AG\n00:50:C2:A2:60:00/36\tPreferred Oil, LLC\n00:50:C2:A2:70:00/36\tmeconet e. K.\n00:50:C2:A2:80:00/36\tKenda Electronic Systems Limited\n00:50:C2:A2:90:00/36\tLuminex Corporation\n00:50:C2:A2:A0:00/36\tAstronics Custom Control Concepts\n00:50:C2:A2:B0:00/36\tAprilia Racing S.R.L.\n00:50:C2:A2:C0:00/36\tKWS-Electronic GmbH\n00:50:C2:A2:D0:00/36\tInventure Inc.\n00:50:C2:A2:E0:00/36\tYUYAMA MFG Co.,Ltd\n00:50:C2:A2:F0:00/36\tDragonFly Scientific LLC\n00:50:C2:A3:00:00/36\tD-TA Systems\n00:50:C2:A3:10:00/36\tCoolit Systems, Inc.\n00:50:C2:A3:20:00/36\tHarris Designs of NRV, Inc.\n00:50:C2:A3:30:00/36\tFuji Firmware\n00:50:C2:A3:40:00/36\tCasabyte Inc.\n00:50:C2:A3:50:00/36\tAppareo Systems, LLC\n00:50:C2:A3:60:00/36\tShenzhen Shangji electronic Co.Ltd\n00:50:C2:A3:70:00/36\tSoftware Systems Plus\n00:50:C2:A3:80:00/36\tTred Displays\n00:50:C2:A3:90:00/36\tIndustrial Data Products Ltd\n00:50:C2:A3:A0:00/36\tTelecor Inc.\n00:50:C2:A3:B0:00/36\tIPcontrols GmbH\n00:50:C2:A3:C0:00/36\tBrähler ICS Konferenztechnik AG\n00:50:C2:A3:D0:00/36\tOwandy\n00:50:C2:A3:E0:00/36\tDuevi Snc Di Mora E Santese\n00:50:C2:A3:F0:00/36\tLHA Systems CC\n00:50:C2:A4:00:00/36\tMosberger Consulting LLC\n00:50:C2:A4:10:00/36\tMeiryo Denshi Corp.\n00:50:C2:A4:20:00/36\tRealVision Inc.\n00:50:C2:A4:30:00/36\tNKS Co.Ltd.\n00:50:C2:A4:40:00/36\tTORC Technologies\n00:50:C2:A4:50:00/36\tSofradir-EC\n00:50:C2:A4:60:00/36\tSoftronics Ltd.\n00:50:C2:A4:70:00/36\tPrimetech Engineering Corp.\n00:50:C2:A4:80:00/36\tThales UK Limited\n00:50:C2:A4:90:00/36\tWayne Dalton Corp.\n00:50:C2:A4:A0:00/36\tDITRON S.r.l.\n00:50:C2:A4:B0:00/36\tL-3 Communications Mobile-Vision, Inc.\n00:50:C2:A4:C0:00/36\tVasoNova, Inc.\n00:50:C2:A4:D0:00/36\tLevelStar LLC.\n00:50:C2:A4:E0:00/36\tConduant Corporation\n00:50:C2:A4:F0:00/36\tDeuta GmbH\n00:50:C2:A5:00:00/36\ti-RED Infrarot Systeme GmbH\n00:50:C2:A5:10:00/36\tY-products co.ltd.\n00:50:C2:A5:20:00/36\tThe VON Corporation\n00:50:C2:A5:30:00/36\tQuality & Design\n00:50:C2:A5:40:00/36\tDiamond Point International (Europe) Ltd\n00:50:C2:A5:50:00/36\tArrowvale Electronics\n00:50:C2:A5:60:00/36\tReaMetrix, Inc.\n00:50:C2:A5:70:00/36\tJuice Technologies, LLC\n00:50:C2:A5:80:00/36\tEpl\n00:50:C2:A5:90:00/36\tTelevic Rail GmbH\n00:50:C2:A5:A0:00/36\tItas A/S\n00:50:C2:A5:B0:00/36\tPhytec Messtechnik GmbH\n00:50:C2:A5:C0:00/36\tJSC \"Component-ASU\"\n00:50:C2:A5:D0:00/36\tMecc Co., Ltd.\n00:50:C2:A5:E0:00/36\tAnsen Investment Holdings Ltd.\n00:50:C2:A5:F0:00/36\tAlga Microwave Inc\n00:50:C2:A6:00:00/36\tArrow Central Europe GmbH - Division Spoerle\n00:50:C2:A6:10:00/36\tFr. Sauter AG\n00:50:C2:A6:20:00/36\tGrossenbacher Systeme AG\n00:50:C2:A6:30:00/36\tEMS Industries\n00:50:C2:A6:40:00/36\ttetronik GmbH AEN\n00:50:C2:A6:50:00/36\tMark-O-Print GmbH\n00:50:C2:A6:60:00/36\tDVTech\n00:50:C2:A6:70:00/36\tGSS Avionics Limited\n00:50:C2:A6:80:00/36\tX-Pert Paint Mixing Systems\n00:50:C2:A6:90:00/36\tAdvanced Integrated Systems\n00:50:C2:A6:A0:00/36\tInfocrossing\n00:50:C2:A6:B0:00/36\tExplorer Inc.\n00:50:C2:A6:C0:00/36\tFigment Design Laboratories\n00:50:C2:A6:D0:00/36\tDTV Innovations\n00:50:C2:A6:E0:00/36\tScreen Technics Pty Limited\n00:50:C2:A6:F0:00/36\tSaia-Burgess Controls AG\n00:50:C2:A7:00:00/36\tReliable System Services Corp\n00:50:C2:A7:10:00/36\tPurite Ltd\n00:50:C2:A7:20:00/36\tGamber-Johnson LLC.\n00:50:C2:A7:30:00/36\tKYOEI ENGINEERING Co.,Ltd.\n00:50:C2:A7:40:00/36\tDsp Design Ltd\n00:50:C2:A7:50:00/36\tJTL Systems Ltd.\n00:50:C2:A7:60:00/36\tRoesch & Walter Industrie-Elektronik GmbH\n00:50:C2:A7:70:00/36\tKeith & Koep GmbH\n00:50:C2:A7:80:00/36\tApantac LLC\n00:50:C2:A7:90:00/36\tSaintronic\n00:50:C2:A7:A0:00/36\tDetNet South Africa PTY (LTD)\n00:50:C2:A7:B0:00/36\tOrange Tree Technologies\n00:50:C2:A7:C0:00/36\tPneu-Logic Corporation\n00:50:C2:A7:D0:00/36\tVitel Net\n00:50:C2:A7:E0:00/36\tDensitron Technologies Ltd\n00:50:C2:A7:F0:00/36\tPhytec Messtechnik GmbH\n00:50:C2:A8:00:00/36\tard sa\n00:50:C2:A8:10:00/36\tBPC circuits Ltd\n00:50:C2:A8:20:00/36\tCT Company\n00:50:C2:A8:30:00/36\tTechno Sobi Co. Ltd.\n00:50:C2:A8:40:00/36\tLino Manfrotto +Co spa\n00:50:C2:A8:50:00/36\tJoysystem\n00:50:C2:A8:60:00/36\tLimab Ab\n00:50:C2:A8:70:00/36\tLittlemore Scientific\n00:50:C2:A8:80:00/36\tS-Sys\n00:50:C2:A8:90:00/36\tCA Traffic Ltd\n00:50:C2:A8:A0:00/36\tAudio Engineering Ltd.\n00:50:C2:A8:B0:00/36\tNavicron Oy\n00:50:C2:A8:C0:00/36\tRedwire, LLC\n00:50:C2:A8:D0:00/36\tFrontier Electronic Systems Corp.\n00:50:C2:A8:E0:00/36\tBFI Industrie-Elektronik GmbH & Co.KG\n00:50:C2:A8:F0:00/36\tQuantum3D, Inc.\n00:50:C2:A9:00:00/36\tS.two Corporation\n00:50:C2:A9:10:00/36\tCeron Tech Co.,LTD\n00:50:C2:A9:20:00/36\tSicon srl\n00:50:C2:A9:30:00/36\tSPX Flow Technology\n00:50:C2:A9:40:00/36\tPar-Tech, Inc.\n00:50:C2:A9:50:00/36\tINNOVACIONES Microelectrónicas SL (AnaFocus)\n00:50:C2:A9:60:00/36\tFep Srl\n00:50:C2:A9:70:00/36\tMicrosystemes\n00:50:C2:A9:80:00/36\tSentry 360 Security\n00:50:C2:A9:90:00/36\tHaivision Systems Inc\n00:50:C2:A9:A0:00/36\tAbsolutron. LLC\n00:50:C2:A9:B0:00/36\tPDQ Manufacturing  Inc.\n00:50:C2:A9:C0:00/36\tStar Electronics GmbH & Co. KG\n00:50:C2:A9:D0:00/36\tJoehl & Koeferli AG\n00:50:C2:A9:E0:00/36\tProcon Engineering Limited\n00:50:C2:A9:F0:00/36\tYellowSoft Co., Ltd.\n00:50:C2:AA:00:00/36\tSmith Meter, Inc.\n00:50:C2:AA:10:00/36\tElrem Electronic Ag\n00:50:C2:AA:20:00/36\tELPA sas\n00:50:C2:AA:30:00/36\tPeek Traffic Corporation\n00:50:C2:AA:40:00/36\tPSi Printer Systems international GmbH\n00:50:C2:AA:50:00/36\tTampere University of Technology\n00:50:C2:AA:60:00/36\tBassett Electronic Systems ltd\n00:50:C2:AA:70:00/36\tEndeas Oy\n00:50:C2:AA:80:00/36\tNexans Cabling Solutions\n00:50:C2:AA:90:00/36\tSAN GIORGIO S.E.I.N. srl\n00:50:C2:AA:A0:00/36\tFlexible Picture Systems\n00:50:C2:AA:B0:00/36\tBRS Sistemas Eletrônicos\n00:50:C2:AA:C0:00/36\tVisiCon GmbH\n00:50:C2:AA:D0:00/36\tUpdate Systems Inc.\n00:50:C2:AA:E0:00/36\tOUTLINE srl\n00:50:C2:AA:F0:00/36\tSanta Barbara Instrument Group\n00:50:C2:AB:00:00/36\tFRAKO Kondensatoren- und Anlagenbau GmbH\n00:50:C2:AB:10:00/36\tBitmanufaktur GmbH\n00:50:C2:AB:20:00/36\tProCom Systems, Inc.\n00:50:C2:AB:30:00/36\tCompañía de Instrumentacion y control, S.L.\n00:50:C2:AB:40:00/36\tn3k Informatik GmbH\n00:50:C2:AB:50:00/36\tMettler Toledo\n00:50:C2:AB:60:00/36\tGygax Embedded Engineering GEE.ch\n00:50:C2:AB:70:00/36\tTwinfalls Technologies\n00:50:C2:AB:80:00/36\tAHM Limited (CLiKAPAD)\n00:50:C2:AB:90:00/36\tShowtacle\n00:50:C2:AB:A0:00/36\tSaia-Burgess Controls AG\n00:50:C2:AB:B0:00/36\tVolantic AB\n00:50:C2:AB:C0:00/36\tBarrick\n00:50:C2:AB:D0:00/36\tMonitor Business Machines Ltd.\n00:50:C2:AB:E0:00/36\tAP Labs\n00:50:C2:AB:F0:00/36\tMCC Computer Company\n00:50:C2:AC:00:00/36\tDS PRO Audio Ltda\n00:50:C2:AC:10:00/36\tDAISHIN-DENSHI Co., Ltd\n00:50:C2:AC:20:00/36\tOpenXS B.V.\n00:50:C2:AC:30:00/36\tDiversified Control, Inc.\n00:50:C2:AC:40:00/36\tOrion Technologies,LLC\n00:50:C2:AC:50:00/36\tE-Motion System, Inc.\n00:50:C2:AC:60:00/36\tMarathon Products, Inc.\n00:50:C2:AC:70:00/36\tWaveIP\n00:50:C2:AC:80:00/36\tPalladio Systeme GmbH\n00:50:C2:AC:90:00/36\tSteinbeis-Transferzentrum Embedded Design und Networking\n00:50:C2:AC:A0:00/36\tSoft & Control Technology s.r.o.\n00:50:C2:AC:B0:00/36\tU-Care Inc.\n00:50:C2:AC:C0:00/36\tProPhotonix\n00:50:C2:AC:D0:00/36\tMeshWorks Wireless Oy\n00:50:C2:AC:E0:00/36\tChronoLogic Pty. Ltd.\n00:50:C2:AC:F0:00/36\tSP Controls, Inc\n00:50:C2:AD:00:00/36\tGeonautics Australia Pty Ltd\n00:50:C2:AD:10:00/36\tPhytec Messtechnik GmbH\n00:50:C2:AD:20:00/36\tRafael\n00:50:C2:AD:30:00/36\tPeek Traffic Corporation\n00:50:C2:AD:40:00/36\tGlobal Rainmakers Inc.\n00:50:C2:AD:50:00/36\tMighty Lube Systematic Lubrication, Inc.\n00:50:C2:AD:60:00/36\tUnisensor A/S\n00:50:C2:AD:70:00/36\tAir Monitors Ltd\n00:50:C2:AD:80:00/36\tIncyma\n00:50:C2:AD:90:00/36\telettrondata srl\n00:50:C2:AD:A0:00/36\tEssepie Srl\n00:50:C2:AD:B0:00/36\tGO engineering GmbH\n00:50:C2:AD:C0:00/36\tSynthesechemie Dr. Penth GmbH\n00:50:C2:AD:D0:00/36\tGD Mission Systems\n00:50:C2:AD:E0:00/36\tNeoptix Inc.\n00:50:C2:AD:F0:00/36\tAltinex, Inc\n00:50:C2:AE:00:00/36\tAT4 wireless.S.A\n00:50:C2:AE:10:00/36\tEvercare\n00:50:C2:AE:20:00/36\tPower Medical Interventions\n00:50:C2:AE:30:00/36\tPsd\n00:50:C2:AE:40:00/36\tAdvanced Electronic Designs, Inc.\n00:50:C2:AE:50:00/36\tABS Gesellschaft f. Automatisierung, Bildverarbeitung und Software mbH\n00:50:C2:AE:60:00/36\tVecom Usa\n00:50:C2:AE:70:00/36\tRedwood Systems\n00:50:C2:AE:80:00/36\tBit-Lab PTY LTD\n00:50:C2:AE:90:00/36\tClearCorp Enterprises, Inc\n00:50:C2:AE:A0:00/36\tEmbedia\n00:50:C2:AE:B0:00/36\tUMLogics Corporation\n00:50:C2:AE:C0:00/36\tFritz Pauker Ingenieure GmbH\n00:50:C2:AE:D0:00/36\t3Roam\n00:50:C2:AE:E0:00/36\tIPtec, Inc.\n00:50:C2:AE:F0:00/36\tNational CineMedia\n00:50:C2:AF:00:00/36\tFr. Sauter AG\n00:50:C2:AF:10:00/36\tGreen Goose\n00:50:C2:AF:20:00/36\tACD Elektronik GmbH\n00:50:C2:AF:30:00/36\tPalomar Products, Inc.\n00:50:C2:AF:40:00/36\tDixell S.p.A.\n00:50:C2:AF:50:00/36\tKramara s.r.o.\n00:50:C2:AF:60:00/36\tEnergid\n00:50:C2:AF:70:00/36\tMidwest Microwave Solutions Inc.\n00:50:C2:AF:80:00/36\tGlobal Satellite Engineering\n00:50:C2:AF:90:00/36\tIngenieurbuero Bickele und Buehler GmbH\n00:50:C2:AF:A0:00/36\tAbsolute Fire Solutions Inc.\n00:50:C2:AF:B0:00/36\tVocality International Ltd\n00:50:C2:AF:C0:00/36\tOdus Technologies SA\n00:50:C2:AF:D0:00/36\tHomeScenario, Inc.\n00:50:C2:AF:E0:00/36\tTrolex Limited\n00:50:C2:AF:F0:00/36\tXoByte LLC\n00:50:C2:B0:00:00/36\tSaia-Burgess Controls AG\n00:50:C2:B0:10:00/36\tHSR Harald L. Reuter\n00:50:C2:B0:20:00/36\tMaster Co Ltd\n00:50:C2:B0:30:00/36\tSpider Tecnologia Ind. e Com. Ltda.\n00:50:C2:B0:40:00/36\tUbiquiti Inc\n00:50:C2:B0:50:00/36\tPOLA s.r.l.\n00:50:C2:B0:60:00/36\tCompuDesigns, Inc.\n00:50:C2:B0:70:00/36\tFareco\n00:50:C2:B0:80:00/36\tGoerlitz AG\n00:50:C2:B0:90:00/36\tHarper Chalice Group Limited\n00:50:C2:B0:A0:00/36\tIndutherm Giesstechnologie GmbH\n00:50:C2:B0:B0:00/36\tHoneywell\n00:50:C2:B0:C0:00/36\tSmartb Technologies\n00:50:C2:B0:D0:00/36\tJapan Electronics System, Inc\n00:50:C2:B0:E0:00/36\tKYAB Lulea AB\n00:50:C2:B0:F0:00/36\tNARA Controls Inc.\n00:50:C2:B1:00:00/36\tMarine Entertainment Systems Ltd\n00:50:C2:B1:10:00/36\tEXEL s.r.l\n00:50:C2:B1:20:00/36\tCM Elektronik GmbH\n00:50:C2:B1:30:00/36\tMeasy Electronics Co., Ltd.\n00:50:C2:B1:40:00/36\tKeith & Koep GmbH\n00:50:C2:B1:50:00/36\tPhotoTelesis LP\n00:50:C2:B1:60:00/36\tNeothings, Inc.\n00:50:C2:B1:70:00/36\tElcoteq Design Center Oy\n00:50:C2:B1:80:00/36\tRosslare Enterprises Limited\n00:50:C2:B1:90:00/36\tPolytron Corporation\n00:50:C2:B1:A0:00/36\tElcus\n00:50:C2:B1:B0:00/36\tIntegrated  Control Corp.\n00:50:C2:B1:C0:00/36\tPhytec Messtechnik GmbH\n00:50:C2:B1:D0:00/36\tTelegenix\n00:50:C2:B1:E0:00/36\tAbbott Medical Optics\n00:50:C2:B1:F0:00/36\tAtlas Copco IAS GmbH\n00:50:C2:B2:00:00/36\tFive9 Network Systems Llc\n00:50:C2:B2:10:00/36\tPhytron-Elektronik GmbH\n00:50:C2:B2:20:00/36\tFarSite Communications Limited\n00:50:C2:B2:30:00/36\tRonyo Technologies s.r.o.\n00:50:C2:B2:40:00/36\tTeledyne Defence Limited\n00:50:C2:B2:50:00/36\tTriax A/S\n00:50:C2:B2:60:00/36\tElko Systems\n00:50:C2:B2:70:00/36\tAteme\n00:50:C2:B2:80:00/36\tMicromax Pty. Ltd.\n00:50:C2:B2:90:00/36\tIntegra LifeSciences (Ireland) Ltd\n00:50:C2:B2:A0:00/36\tTrench Austria GmbH\n00:50:C2:B2:B0:00/36\tCosmoData Informatica Ltda.\n00:50:C2:B2:C0:00/36\tConcepteers, LLC\n00:50:C2:B2:D0:00/36\tDatasat Digital Entertainment\n00:50:C2:B2:E0:00/36\tAct\n00:50:C2:B2:F0:00/36\tIntelliVision Technologies, Corp\n00:50:C2:B3:00:00/36\tApplied Micro Electronics AME bv\n00:50:C2:B3:10:00/36\tShop Safe AG\n00:50:C2:B3:20:00/36\tByres Security Inc\n00:50:C2:B3:30:00/36\tNumcore Ltd\n00:50:C2:B3:40:00/36\tMeisol co.,ltd\n00:50:C2:B3:50:00/36\thaneron\n00:50:C2:B3:60:00/36\tCrde\n00:50:C2:B3:70:00/36\tIAdea Corporation\n00:50:C2:B3:80:00/36\tGrenmore Ltd\n00:50:C2:B3:90:00/36\tsiXis, Inc.\n00:50:C2:B3:A0:00/36\tNikon Systems Inc.\n00:50:C2:B3:B0:00/36\tSportvision Inc.\n00:50:C2:B3:C0:00/36\tJanasCard\n00:50:C2:B3:D0:00/36\tAms\n00:50:C2:B3:E0:00/36\tSage Consultants\n00:50:C2:B3:F0:00/36\tM-Tronic Design and Technology GmbH\n00:50:C2:B4:00:00/36\tTecnint HTE SRL\n00:50:C2:B4:10:00/36\tTata Power Company, Strategic Electronics Division\n00:50:C2:B4:20:00/36\tETM Electromatic Incorporated\n00:50:C2:B4:30:00/36\tJ-Systems Inc.\n00:50:C2:B4:40:00/36\tAmpcontrol Pty Ltd\n00:50:C2:B4:50:00/36\tEfftronics Systems (P) Ltd\n00:50:C2:B4:60:00/36\tMobileye\n00:50:C2:B4:70:00/36\tMCS MICRONIC Computer Systeme GmbH\n00:50:C2:B4:80:00/36\tMTD GmbH\n00:50:C2:B4:90:00/36\tAplex Technology Inc.\n00:50:C2:B4:A0:00/36\tSaia-Burgess Controls AG\n00:50:C2:B4:B0:00/36\tChitose Co.,Ltd\n00:50:C2:B4:C0:00/36\tElectroCom\n00:50:C2:B4:D0:00/36\tTroll Systems Corporation\n00:50:C2:B4:E0:00/36\tAixControl GmbH\n00:50:C2:B4:F0:00/36\tSencon UK Ltd.\n00:50:C2:B5:00:00/36\tSelco\n00:50:C2:B5:10:00/36\tAeroflex GmbH\n00:50:C2:B5:20:00/36\tSMH Technologies\n00:50:C2:B5:30:00/36\tProdco\n00:50:C2:B5:40:00/36\tAPG Cash Drawer, LLC\n00:50:C2:B5:50:00/36\tSanyo Electronic Industries Co.,Ltd\n00:50:C2:B5:60:00/36\tSinovia Sa\n00:50:C2:B5:70:00/36\tPhytec Messtechnik GmbH\n00:50:C2:B5:80:00/36\tRealD, Inc.\n00:50:C2:B5:90:00/36\tSLICAN sp. z o.o.\n00:50:C2:B5:A0:00/36\tGREEN Center s.r.o.\n00:50:C2:B5:B0:00/36\tTimberline Manufacturing\n00:50:C2:B5:C0:00/36\tADI Video Technologies\n00:50:C2:B5:D0:00/36\tPlitron Manufacturing Inc.\n00:50:C2:B5:E0:00/36\tPalgiken Co.,Ltd.\n00:50:C2:B5:F0:00/36\tNorth Bridge Technologies\n00:50:C2:B6:00:00/36\tOoo Npf Atis\n00:50:C2:B6:10:00/36\tNayos LTD\n00:50:C2:B6:20:00/36\tRugged Controls\n00:50:C2:B6:30:00/36\tRO.VE.R. Laboratories S.p.A\n00:50:C2:B6:40:00/36\tFEW Bauer GmbH\n00:50:C2:B6:50:00/36\tPeek Traffic Corporation\n00:50:C2:B6:60:00/36\t8185\n00:50:C2:B6:70:00/36\tRC Systems Co. Inc.\n00:50:C2:B6:80:00/36\tElectronic Systems Protection, Inc.\n00:50:C2:B6:90:00/36\tThetis S.p.A.\n00:50:C2:B6:A0:00/36\tPhytec Messtechnik GmbH\n00:50:C2:B6:B0:00/36\tPhytec Messtechnik GmbH\n00:50:C2:B6:C0:00/36\tDrinelec\n00:50:C2:B6:D0:00/36\tSound Metrics Corp\n00:50:C2:B6:E0:00/36\tPrivate\n00:50:C2:B6:F0:00/36\tCT Company\n00:50:C2:B7:00:00/36\tNisshin Electronics co.,ltd.\n00:50:C2:B7:10:00/36\tDigitale Analoge COMponenten West Electronic Vertriebs GmbH\n00:50:C2:B7:20:00/36\tAdvanced Desktop Systems Ltd\n00:50:C2:B7:30:00/36\tARKRAY, Inc. Kyoto Laboratory\n00:50:C2:B7:40:00/36\tAXED Jakubowski Wojciechowski sp.j.\n00:50:C2:B7:50:00/36\tBlankom\n00:50:C2:B7:60:00/36\tITF Fröschl GmbH\n00:50:C2:B7:70:00/36\tKristech\n00:50:C2:B7:80:00/36\tFolink\n00:50:C2:B7:90:00/36\tMitsuya Laboratories Inc.\n00:50:C2:B7:A0:00/36\tSchnoor Industrieelektronik GmbH & Co. KG\n00:50:C2:B7:B0:00/36\tQuartech Corporation\n00:50:C2:B7:C0:00/36\tBettini srl\n00:50:C2:B7:D0:00/36\tELETECH Srl\n00:50:C2:B7:E0:00/36\tNaretrends\n00:50:C2:B7:F0:00/36\tEnatel\n00:50:C2:B8:00:00/36\tiScreen LLC\n00:50:C2:B8:10:00/36\tGHL Advanced Technolgy GmbH & Co. KG\n00:50:C2:B8:20:00/36\tTANABIKI Inc.\n00:50:C2:B8:30:00/36\tAdvanced Storage Concepts, Inc.\n00:50:C2:B8:40:00/36\tInnovate Software Solutions Pvt Ltd\n00:50:C2:B8:50:00/36\tSilverNet\n00:50:C2:B8:60:00/36\tAsto\n00:50:C2:B8:70:00/36\tEMAC, Inc.\n00:50:C2:B8:80:00/36\tGigatronik  Köln GmbH\n00:50:C2:B8:90:00/36\tENTEC Electric & Electronic Co., LTD.\n00:50:C2:B8:A0:00/36\tMicroPoise\n00:50:C2:B8:B0:00/36\tFbb\n00:50:C2:B8:C0:00/36\tKeith & Koep GmbH\n00:50:C2:B8:D0:00/36\tCemsi\n00:50:C2:B8:E0:00/36\tWAC (Israel) Ltd.\n00:50:C2:B8:F0:00/36\tGentec\n00:50:C2:B9:00:00/36\tNAONWORKS Co., Ltd\n00:50:C2:B9:10:00/36\tFinnet-Service Ltd.\n00:50:C2:B9:20:00/36\tABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.\n00:50:C2:B9:30:00/36\tEmc Partner Ag\n00:50:C2:B9:40:00/36\tTritech International Ltd\n00:50:C2:B9:50:00/36\tRx Monitoring Services\n00:50:C2:B9:60:00/36\tOnix Electronic Systems Inc\n00:50:C2:B9:70:00/36\tikerlan\n00:50:C2:B9:80:00/36\tSouthwest Research Institute\n00:50:C2:B9:90:00/36\tGreenlight Innovation Corp.\n00:50:C2:B9:A0:00/36\tTalo, NV Inc\n00:50:C2:B9:B0:00/36\tTelventy Energia S.A.\n00:50:C2:B9:C0:00/36\tDave Srl\n00:50:C2:B9:D0:00/36\tW. Vershoven GmbH\n00:50:C2:B9:E0:00/36\tSaia-Burgess Controls AG\n00:50:C2:B9:F0:00/36\tAudioscope 2K Srl\n00:50:C2:BA:00:00/36\ttxtr GmbH\n00:50:C2:BA:10:00/36\tTranstechnik GmbH & Co.KG\n00:50:C2:BA:20:00/36\tLogical Tools s.r.l.\n00:50:C2:BA:30:00/36\tDsp Design Ltd\n00:50:C2:BA:40:00/36\tCustos Mobile S.L.\n00:50:C2:BA:50:00/36\tInterCel Pty Ltd\n00:50:C2:BA:60:00/36\tJomitek\n00:50:C2:BA:70:00/36\tRaumComputer Entwicklungs- und Vertriebs GmbH\n00:50:C2:BA:80:00/36\tPeek Traffic Corporation\n00:50:C2:BA:90:00/36\tSISS Technology Inc.\n00:50:C2:BA:A0:00/36\tNetworkFX Communications, LLC\n00:50:C2:BA:B0:00/36\tiDeal Teknoloji Bilisim Cozumleri A.S.\n00:50:C2:BA:C0:00/36\tViteco Vnpt Jsc\n00:50:C2:BA:D0:00/36\tPrediktor AS\n00:50:C2:BA:E0:00/36\tFiber Connections Inc.\n00:50:C2:BA:F0:00/36\tMangoDSP\n00:50:C2:BB:00:00/36\tGainbrain\n00:50:C2:BB:10:00/36\tPro4tech\n00:50:C2:BB:20:00/36\tSt Michael Strategies Inc\n00:50:C2:BB:30:00/36\tClimateWell AB (publ)\n00:50:C2:BB:40:00/36\tJSC Electrical Equipment Factory\n00:50:C2:BB:50:00/36\tMroad Information System\n00:50:C2:BB:60:00/36\tQuarch Technology Ltd\n00:50:C2:BB:70:00/36\tGD Mission Systems\n00:50:C2:BB:80:00/36\tMoeTronix\n00:50:C2:BB:90:00/36\tToptech Systems, Inc.\n00:50:C2:BB:A0:00/36\tSystemteq Limited\n00:50:C2:BB:B0:00/36\tGHL Systems Berhad\n00:50:C2:BB:C0:00/36\tImpactSystems\n00:50:C2:BB:D0:00/36\tITS Telecom\n00:50:C2:BB:E0:00/36\tOnlinepizza Norden AB\n00:50:C2:BB:F0:00/36\tPhytec Messtechnik GmbH\n00:50:C2:BC:00:00/36\tGalaxia Electronics\n00:50:C2:BC:10:00/36\tSentec Ltd\n00:50:C2:BC:20:00/36\tXslent Energy Technologies. LLC\n00:50:C2:BC:30:00/36\tPhytec Messtechnik GmbH\n00:50:C2:BC:40:00/36\tWheatstone Corporation\n00:50:C2:BC:50:00/36\tToptechnology SRL\n00:50:C2:BC:60:00/36\tMireroTack\n00:50:C2:BC:70:00/36\tPTS GmbH\n00:50:C2:BC:80:00/36\tAGWTech Ltd\n00:50:C2:BC:90:00/36\tNextmove Technologies\n00:50:C2:BC:A0:00/36\tAitecsystem Co.,Ltd.\n00:50:C2:BC:B0:00/36\tArteixo Telecom\n00:50:C2:BC:C0:00/36\tVvdn Technologies Pvt. Ltd.\n00:50:C2:BC:D0:00/36\tHighlight Parking Systems Ltd\n00:50:C2:BC:E0:00/36\tTV Portal Co., Ltd.\n00:50:C2:BC:F0:00/36\tEpiko, elektronski sistemi d.o.o.\n00:50:C2:BD:00:00/36\tEDC wifi\n00:50:C2:BD:10:00/36\tAriem Technologies Pvt Ltd\n00:50:C2:BD:20:00/36\tPercello Ltd.\n00:50:C2:BD:30:00/36\tPostjet Systems Ltd\n00:50:C2:BD:40:00/36\tGlobal Security Devices\n00:50:C2:BD:50:00/36\tRF-Embedded GmbH\n00:50:C2:BD:60:00/36\tBG Systems, Inc.\n00:50:C2:BD:70:00/36\tSlat\n00:50:C2:BD:80:00/36\tb.a.b-technologie gmbh\n00:50:C2:BD:90:00/36\tAMS Controls, Inc.\n00:50:C2:BD:A0:00/36\tDigital Lumens\n00:50:C2:BD:B0:00/36\tGasTOPS Ltd.\n00:50:C2:BD:C0:00/36\tSS Systems LLC\n00:50:C2:BD:E0:00/36\tEvo-Teh d.o.o.\n00:50:C2:BD:F0:00/36\tEuro-Konsult Sp. z o.o.\n00:50:C2:BE:00:00/36\tPhaedrus Limited\n00:50:C2:BE:10:00/36\tTattile srl\n00:50:C2:BE:20:00/36\tConvergent Bioscience Ltd.\n00:50:C2:BE:30:00/36\tJiskoot Ltd\n00:50:C2:BE:40:00/36\tGrupo Epelsa S.L.\n00:50:C2:BE:50:00/36\tRF Code\n00:50:C2:BE:60:00/36\tDocobo Ltd\n00:50:C2:BE:70:00/36\tGenetec Inc.\n00:50:C2:BE:80:00/36\tVehicle Testing Equipment, S.L.\n00:50:C2:BE:90:00/36\tZucchetti Spa\n00:50:C2:BE:A0:00/36\tDaeyoung inc.\n00:50:C2:BE:B0:00/36\tPeek Traffic Corporation\n00:50:C2:BE:C0:00/36\tDRS Laruel Technologies\n00:50:C2:BE:D0:00/36\tTouch Revolution Inc.\n00:50:C2:BE:E0:00/36\tPrivate\n00:50:C2:BE:F0:00/36\tSociedad Iberica De Construcciones Electricas, S.A. (Sice)\n00:50:C2:BF:00:00/36\tAim\n00:50:C2:BF:10:00/36\tAmatic Industries GmbH\n00:50:C2:BF:20:00/36\tSaia-Burgess Controls AG\n00:50:C2:BF:30:00/36\tWanco Inc.\n00:50:C2:BF:40:00/36\tMonarch Innovative Technologies Pvt Ltd\n00:50:C2:BF:50:00/36\tAiles Electronics Co., Ltd.\n00:50:C2:BF:60:00/36\tNolam Embedded Systems\n00:50:C2:BF:70:00/36\tPhytec Messtechnik GmbH\n00:50:C2:BF:80:00/36\tCrtiical Link\n00:50:C2:BF:90:00/36\tVitel Net\n00:50:C2:BF:A0:00/36\tRohde&Schwarz Topex SA\n00:50:C2:BF:B0:00/36\tECS Srl\n00:50:C2:BF:C0:00/36\tAltronix Corporation\n00:50:C2:BF:D0:00/36\tErnemann Cine Tec GmbH\n00:50:C2:BF:E0:00/36\tIngeteam Paneles S.A.U.\n00:50:C2:BF:F0:00/36\tI.S.A. S.r.l.\n00:50:C2:C0:00:00/36\tACD Elektronik GmbH\n00:50:C2:C0:10:00/36\tQuercus Technologies, S.L.\n00:50:C2:C0:20:00/36\tHanning Elektro-Werke GmbH & Co. KG\n00:50:C2:C0:30:00/36\tVolumatic Limited.\n00:50:C2:C0:40:00/36\tSoGEME\n00:50:C2:C0:50:00/36\tDoppler Systems LLC\n00:50:C2:C0:60:00/36\tAnalog Way\n00:50:C2:C0:70:00/36\tCIO Informatique Industrielle\n00:50:C2:C0:80:00/36\tjuiceboss\n00:50:C2:C0:90:00/36\tGlobe Wireless\n00:50:C2:C0:A0:00/36\tABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.\n00:50:C2:C0:B0:00/36\tProSourcing GmbH\n00:50:C2:C0:C0:00/36\tAltierre\n00:50:C2:C0:D0:00/36\tFr. SauterAG\n00:50:C2:C0:E0:00/36\tAVItronic GmbH\n00:50:C2:C0:F0:00/36\tDycec, S.A.\n00:50:C2:C1:00:00/36\tKeith & Koep GmbH\n00:50:C2:C1:10:00/36\tART Antriebs- und Regeltechnik GmbH\n00:50:C2:C1:20:00/36\tOki Denki Bohsai Co.,Ltd.\n00:50:C2:C1:30:00/36\tDantec Dynamics A/S\n00:50:C2:C1:40:00/36\tSpectronix Corporation\n00:50:C2:C1:50:00/36\tINO - Institut National d'Optique\n00:50:C2:C1:60:00/36\tOMICRON electronics GmbH\n00:50:C2:C1:70:00/36\tAxis-Shield PoC AS\n00:50:C2:C1:80:00/36\tLinuxstamp Designs, LLC\n00:50:C2:C1:90:00/36\tIbercomp SA\n00:50:C2:C1:A0:00/36\tSAM Co., Ltd.\n00:50:C2:C1:B0:00/36\tGraesslin GmbH\n00:50:C2:C1:C0:00/36\tBecton Dickinson\n00:50:C2:C1:D0:00/36\tPowerbase Energy Systems Inc.\n00:50:C2:C1:E0:00/36\tPeperoni-Light\n00:50:C2:C1:F0:00/36\tSpecialist Electronics Services Ltd\n00:50:C2:C2:00:00/36\tSRC Computers, LLC\n00:50:C2:C2:10:00/36\tPrivate\n00:50:C2:C2:20:00/36\tAudient Ltd\n00:50:C2:C2:30:00/36\tVidicon LLC\n00:50:C2:C2:40:00/36\tQualnetics Corporation\n00:50:C2:C2:50:00/36\tPrivate\n00:50:C2:C2:60:00/36\tAustco Marketing & Service (USA) ltd.\n00:50:C2:C2:70:00/36\tQtechnology A/S\n00:50:C2:C2:80:00/36\tELREHA GmbH\n00:50:C2:C2:90:00/36\tNewtel Engineering S.r.l.\n00:50:C2:C2:A0:00/36\tRealTime Systems Ltd\n00:50:C2:C2:B0:00/36\tZ-App Systems, Inc.\n00:50:C2:C2:C0:00/36\tbach-messtechnik gmbh\n00:50:C2:C2:D0:00/36\tDigitale Analoge COMponenten West Electronic Vertriebs GmbH\n00:50:C2:C2:E0:00/36\tDismuntel Sal\n00:50:C2:C2:F0:00/36\tReflex Ces\n00:50:C2:C3:00:00/36\tWagner Group GmbH\n00:50:C2:C3:10:00/36\t4D Technology Corporation\n00:50:C2:C3:20:00/36\tProcon Electronics\n00:50:C2:C3:40:00/36\tKyuhen\n00:50:C2:C3:50:00/36\tInsitu, Inc\n00:50:C2:C3:60:00/36\tSET GmbH\n00:50:C2:C3:70:00/36\tB.E.A.R. Solutions (Australasia) Pty, Ltd\n00:50:C2:C3:80:00/36\tComputer Automation Technology Inc\n00:50:C2:C3:90:00/36\tSecad Sa\n00:50:C2:C3:A0:00/36\tSicon srl\n00:50:C2:C3:B0:00/36\tELEKTRO-AUTOMATIK GmbH & Co. KG\n00:50:C2:C3:C0:00/36\tELSIST S.r.l.\n00:50:C2:C3:D0:00/36\tPla Electro Appliances Pvt. Ltd.\n00:50:C2:C3:E0:00/36\tSysacom\n00:50:C2:C3:F0:00/36\tANXeBusiness Corporation\n00:50:C2:C4:00:00/36\tBAE Systems Bofors AB\n00:50:C2:C4:10:00/36\tCOMPRION GmbH\n00:50:C2:C4:20:00/36\tSaia-Burgess Controls AG\n00:50:C2:C4:30:00/36\tCammegh Limited\n00:50:C2:C4:40:00/36\tBeijing Zhongherongzhi Elec.&Tech.Co.,Ltd.\n00:50:C2:C4:50:00/36\tGalvamat & Unican Technologies SA\n00:50:C2:C4:60:00/36\tQNE GmbH & Co. KG\n00:50:C2:C4:70:00/36\tWeltek Technologies Co. Ltd.\n00:50:C2:C4:80:00/36\tCytek Media Systems, INC.\n00:50:C2:C4:90:00/36\tElektronic Thoma GmbH\n00:50:C2:C4:A0:00/36\tHerrick Technology Laboratories, Inc.\n00:50:C2:C4:B0:00/36\tR.V.R. elettronica s.p.a.\n00:50:C2:C4:C0:00/36\tLancier Monitoring GmbH\n00:50:C2:C4:D0:00/36\tIndustrial Automation Systems\n00:50:C2:C4:E0:00/36\tElaso AG\n00:50:C2:C4:F0:00/36\tPowersense A/S\n00:50:C2:C5:00:00/36\tBeceem Communications, Inc.\n00:50:C2:C5:10:00/36\tInForce Computing, Inc.\n00:50:C2:C5:20:00/36\tSmartfield, Inc.\n00:50:C2:C5:30:00/36\tEilersen Electric A/S\n00:50:C2:C5:40:00/36\tHPC Platform\n00:50:C2:C5:50:00/36\tWatterott electronic\n00:50:C2:C5:60:00/36\tSpirent Communications\n00:50:C2:C5:70:00/36\tHigh Speed Design, Inc.\n00:50:C2:C5:80:00/36\tFoerster-Technik GmbH\n00:50:C2:C5:90:00/36\tSKD System AB\n00:50:C2:C5:A0:00/36\tCommotive A/S\n00:50:C2:C5:B0:00/36\tMicro Technica\n00:50:C2:C5:C0:00/36\tWavecom Elektronik Ag\n00:50:C2:C5:D0:00/36\tSweMet AB\n00:50:C2:C5:E0:00/36\tCellPlus technologies, Inc.\n00:50:C2:C5:F0:00/36\tIcon Time Systems\n00:50:C2:C6:00:00/36\tIntegration Technologies Limited\n00:50:C2:C6:10:00/36\tHaiVision Systems Incorporated\n00:50:C2:C6:20:00/36\tZeus Systems Private Limited\n00:50:C2:C6:30:00/36\tPotter Electric Signal Co. LLC\n00:50:C2:C6:40:00/36\tPal Software Service Co.,Ltd.\n00:50:C2:C6:50:00/36\tMicro I/O Servicos de Electronica, Lda\n00:50:C2:C6:60:00/36\tKS Beschallungstechnik GmbH\n00:50:C2:C6:70:00/36\tPractical Control Ltd\n00:50:C2:C6:80:00/36\tBroadsoft PacketSmart, Inc.\n00:50:C2:C6:90:00/36\tRebo Co.,Ltd.\n00:50:C2:C6:A0:00/36\tElectronica Keld\n00:50:C2:C6:B0:00/36\tSiGarden Sp z o.o.\n00:50:C2:C6:C0:00/36\tDorlet Sau\n00:50:C2:C6:D0:00/36\tDeansoft CO., Ltd.\n00:50:C2:C6:E0:00/36\tTBS Holding AG\n00:50:C2:C6:F0:00/36\tMSB Elektronik und Geraetebau GmbH\n00:50:C2:C7:00:00/36\tWilke Technology GmbH\n00:50:C2:C7:10:00/36\tSequoia Technology Group Ltd\n00:50:C2:C7:20:00/36\tQuail\n00:50:C2:C7:30:00/36\tIndustry Controls, Inc.\n00:50:C2:C7:40:00/36\tWapice Ltd.\n00:50:C2:C7:50:00/36\tRovsing A/S\n00:50:C2:C7:60:00/36\tGridManager A/S\n00:50:C2:C7:70:00/36\tAIM Co.,Ltd\n00:50:C2:C7:80:00/36\t9Solutions Oy\n00:50:C2:C7:90:00/36\tCODESYSTEM Co.,Ltd\n00:50:C2:C7:A0:00/36\tProtonic Holland\n00:50:C2:C7:B0:00/36\tHoneywell\n00:50:C2:C7:C0:00/36\tKeysight Technologies Inc.\n00:50:C2:C7:D0:00/36\tTAE Antriebstechnik GmbH\n00:50:C2:C7:E0:00/36\tBuerkert Werke GmbH\n00:50:C2:C7:F0:00/36\tKinects Solutions Inc\n00:50:C2:C8:00:00/36\tReko-vek\n00:50:C2:C8:10:00/36\tOdyssee Systemes SAS\n00:50:C2:C8:20:00/36\tKyosha Industries\n00:50:C2:C8:30:00/36\tGronic Systems GmbH\n00:50:C2:C8:40:00/36\tDomis\n00:50:C2:C8:50:00/36\tPeek Traffic Corporation\n00:50:C2:C8:60:00/36\tBruckner & Jarosch Ingenieurgesellschaft mbH\n00:50:C2:C8:70:00/36\tLECO Corporation\n00:50:C2:C8:80:00/36\tCSI Controles e Sistemas Industriais Ltda.\n00:50:C2:C8:90:00/36\tCreative Micro Design\n00:50:C2:C8:A0:00/36\tAutomated Media Services, Inc.\n00:50:C2:C8:B0:00/36\tOcas As\n00:50:C2:C8:C0:00/36\tLanmark Controls Inc.\n00:50:C2:C8:D0:00/36\tEmergency Message Controls LLC\n00:50:C2:C8:E0:00/36\tSdd Itg\n00:50:C2:C8:F0:00/36\tKeith & Koep GmbH\n00:50:C2:C9:00:00/36\tRealD, Inc.\n00:50:C2:C9:10:00/36\tMedia Technologies Ltd.\n00:50:C2:C9:20:00/36\tEMAC, Inc.\n00:50:C2:C9:30:00/36\tSENSAIR Pty Ltd\n00:50:C2:C9:40:00/36\tIsis Engineering, S.A.\n00:50:C2:C9:50:00/36\tIPSES S.r.l.\n00:50:C2:C9:60:00/36\tCyberCraft\n00:50:C2:C9:70:00/36\tMstronic Co., Ltd.\n00:50:C2:C9:80:00/36\tCriticare Systems, Inc\n00:50:C2:C9:90:00/36\tHJPC Corporation dba Pactron\n00:50:C2:C9:A0:00/36\tPACOMP Sp. z o.o.\n00:50:C2:C9:B0:00/36\tSm electronic co.\n00:50:C2:C9:C0:00/36\tSaia-Burgess Controls AG\n00:50:C2:C9:D0:00/36\tRadius Sweden AB\n00:50:C2:C9:E0:00/36\tRohde&Schwarz Topex SA\n00:50:C2:C9:F0:00/36\txxter b.v.\n00:50:C2:CA:00:00/36\tKiefer technic GmbH\n00:50:C2:CA:10:00/36\tWayne Kerr Electronics\n00:50:C2:CA:20:00/36\tThe Logical Company\n00:50:C2:CA:30:00/36\tCT Company\n00:50:C2:CA:40:00/36\tVox Technologies\n00:50:C2:CA:50:00/36\tYokowo Co.,Ltd\n00:50:C2:CA:60:00/36\tVidisys GmbH\n00:50:C2:CA:70:00/36\tThermo Fisher Scientific\n00:50:C2:CA:80:00/36\tSystems With Intelligence Inc.\n00:50:C2:CA:90:00/36\tIntelligent Devices\n00:50:C2:CA:A0:00/36\tDsp Design Ltd\n00:50:C2:CA:B0:00/36\tSAE IT-systems GmbH & Co. KG\n00:50:C2:CA:C0:00/36\tPURVIS Systems Incorporated\n00:50:C2:CA:D0:00/36\tPacific Coast Engineering\n00:50:C2:CA:E0:00/36\tCampbell Scientific Canada Corp.\n00:50:C2:CA:F0:00/36\tFr. Sauter AG\n00:50:C2:CB:00:00/36\tKonsmetal S.A.\n00:50:C2:CB:10:00/36\tZK Celltest Inc\n00:50:C2:CB:20:00/36\tMoravian Instruments\n00:50:C2:CB:30:00/36\tDEUTA-WERKE GmbH\n00:50:C2:CB:40:00/36\tGEA Farm Technologies GmbH\n00:50:C2:CB:50:00/36\tPrivate\n00:50:C2:CB:60:00/36\tKrontek Pty Ltd\n00:50:C2:CB:70:00/36\tinotech GmbH\n00:50:C2:CB:80:00/36\tRaith GmbH\n00:50:C2:CB:90:00/36\tMicro Technic A/S\n00:50:C2:CB:A0:00/36\tDelta Tau Data Systems, Inc.\n00:50:C2:CB:B0:00/36\tCoptonix GmbH\n00:50:C2:CB:C0:00/36\tCp Eletronica Sa\n00:50:C2:CB:D0:00/36\tHi Tech Electronics Ltd\n00:50:C2:CB:E0:00/36\tCode Blue Corporation\n00:50:C2:CB:F0:00/36\tMegacon AB\n00:50:C2:CC:00:00/36\tWorld Time Solutions Limited\n00:50:C2:CC:10:00/36\tLevel 3 Communications\n00:50:C2:CC:20:00/36\tConectaIP Tecnologia S.L.\n00:50:C2:CC:30:00/36\tviscount systems inc.\n00:50:C2:CC:40:00/36\tGD Mission Systems\n00:50:C2:CC:50:00/36\tTecnovum AG\n00:50:C2:CC:60:00/36\tKdt\n00:50:C2:CC:70:00/36\tTOPROOTTechnology Corp. Ltd.\n00:50:C2:CC:80:00/36\tPrivate\n00:50:C2:CC:90:00/36\tPromess GmbH\n00:50:C2:CC:A0:00/36\tSanmina Shenzhen\n00:50:C2:CC:B0:00/36\tCaptiveAire Systems Inc.\n00:50:C2:CC:C0:00/36\tSmartech-technology\n00:50:C2:CC:D0:00/36\tFUJI DATA SYSTEM Co.,Ltd.\n00:50:C2:CC:E0:00/36\tMac-Gray Corporation\n00:50:C2:CC:F0:00/36\tTask Sistemas De Computacao Ltda\n00:50:C2:CD:00:00/36\tMME Mueller Mikroelektronik\n00:50:C2:CD:10:00/36\tACD Elektronik GmbH\n00:50:C2:CD:20:00/36\tSIM2 Multimedia S.p.A.\n00:50:C2:CD:30:00/36\tCovidence A/S\n00:50:C2:CD:40:00/36\tSCHRAML GmbH\n00:50:C2:CD:50:00/36\tArcos Technologies Ltd.\n00:50:C2:CD:60:00/36\tArktan Systems\n00:50:C2:CD:70:00/36\tSaia-Burgess Controls AG\n00:50:C2:CD:80:00/36\tIT-IS International Ltd.\n00:50:C2:CD:90:00/36\tNDC Infrared Engineering, Inc.\n00:50:C2:CD:A0:00/36\ttaskit GmbH\n00:50:C2:CD:B0:00/36\tRutter Inc\n00:50:C2:CD:C0:00/36\tABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.\n00:50:C2:CD:D0:00/36\tK.C.C. Shokai Limited\n00:50:C2:CD:E0:00/36\tAxotec Technologies GmbH\n00:50:C2:CD:F0:00/36\tCoreEL TEchnologies (I) Pvt Ltd\n00:50:C2:CE:00:00/36\tIndustrial Control Links, Inc.\n00:50:C2:CE:10:00/36\tSatellink Inc.\n00:50:C2:CE:20:00/36\tSicon srl\n00:50:C2:CE:30:00/36\tIndustrial Automatics Design Bureau\n00:50:C2:CE:40:00/36\tTektronik\n00:50:C2:CE:50:00/36\tMaretron, LLP\n00:50:C2:CE:60:00/36\tAplica Technologies\n00:50:C2:CE:70:00/36\tEchola Systems\n00:50:C2:CE:80:00/36\tThomas & Betts\n00:50:C2:CE:90:00/36\tPrivate\n00:50:C2:CE:A0:00/36\tKeith & Koep GmbH\n00:50:C2:CE:B0:00/36\tToyon Research Corporation\n00:50:C2:CE:C0:00/36\tErhardt+Leimer GmbH\n00:50:C2:CE:D0:00/36\tAeroMechanical Services Ltd, FLYHT\n00:50:C2:CE:E0:00/36\tEmbed-It Og\n00:50:C2:CE:F0:00/36\tLupatecnologia e Sistemas Ltda\n00:50:C2:CF:00:00/36\tInviso B.V.\n00:50:C2:CF:10:00/36\tBascom Hunter\n00:50:C2:CF:20:00/36\tWeiss Robotics GmbH & Co. KG\n00:50:C2:CF:30:00/36\tDaiken Automacao Ltda\n00:50:C2:CF:40:00/36\tBaudisch Electronic GmbH\n00:50:C2:CF:50:00/36\tGogo BA\n00:50:C2:CF:60:00/36\tEpec Oy\n00:50:C2:CF:70:00/36\tArmour Home Electronics LTD\n00:50:C2:CF:80:00/36\tbeks Kommunikacios Technika kft\n00:50:C2:CF:90:00/36\tElbit Systems of America\n00:50:C2:CF:A0:00/36\tGrupo Epelsa S.L.\n00:50:C2:CF:B0:00/36\tNew Embedded Technology\n00:50:C2:CF:C0:00/36\tTritium Pty Ltd\n00:50:C2:CF:D0:00/36\tAirfolc,Inc.\n00:50:C2:CF:E0:00/36\tTechleader\n00:50:C2:CF:F0:00/36\tInfrasafe, Inc.\n00:50:C2:D0:00:00/36\tBodensee Gravitymeter Geosystem GmbH\n00:50:C2:D0:10:00/36\tAanderaa Data Instruments\n00:50:C2:D0:20:00/36\tSurvalent Technology Corp\n00:50:C2:D0:30:00/36\tPeekel Instruments B.V.\n00:50:C2:D0:40:00/36\tTehama Wireless\n00:50:C2:D0:60:00/36\tnCk Research LLC\n00:50:C2:D0:70:00/36\tIAF GmbH\n00:50:C2:D0:80:00/36\tReimesch Kommunikationssysteme GmbH\n00:50:C2:D0:90:00/36\tGuardtec,Inc\n00:50:C2:D0:A0:00/36\tAirpoint Co., Ltd.\n00:50:C2:D0:B0:00/36\tCODACO ELECTRONIC s.r.o.\n00:50:C2:D0:C0:00/36\tJVL Industri Elektronik\n00:50:C2:D0:D0:00/36\tDECA Card Engineering GmbH\n00:50:C2:D0:E0:00/36\tWeinert Engineering GmbH\n00:50:C2:D0:F0:00/36\tSaia-Burgess Controls AG\n00:50:C2:D1:00:00/36\tRosslare Enterprises Ltd.\n00:50:C2:D1:10:00/36\tAplex Technology Inc.\n00:50:C2:D1:20:00/36\tTokyo Weld Co.,Ltd.\n00:50:C2:D1:30:00/36\tGunma Electronics Co Ltd\n00:50:C2:D1:40:00/36\tSaet I.S.\n00:50:C2:D1:50:00/36\tMSR-Office GmbH\n00:50:C2:D1:60:00/36\tImricor Medical Systems, Inc.\n00:50:C2:D1:70:00/36\tCUE, a.s.\n00:50:C2:D1:80:00/36\tGlyn GmbH & Co.KG\n00:50:C2:D1:90:00/36\tApplied Medical Technologies, Inc DBA AirClean Systems\n00:50:C2:D1:A0:00/36\tGillam-Fei S.A.\n00:50:C2:D1:B0:00/36\tTECHKON GmbH\n00:50:C2:D1:C0:00/36\tRecon Dynamics, LLC\n00:50:C2:D1:D0:00/36\tMoco Media Pty Ltd\n00:50:C2:D1:E0:00/36\tTobila Systems, Inc.\n00:50:C2:D1:F0:00/36\tOlympus NDT Canada\n00:50:C2:D2:00:00/36\t7+ Kft\n00:50:C2:D2:10:00/36\tInnovative Circuit Technology\n00:50:C2:D2:20:00/36\teMDee Technology, Inc.\n00:50:C2:D2:30:00/36\tBluestone Technology GmbH\n00:50:C2:D2:40:00/36\tExpro North Sea\n00:50:C2:D2:50:00/36\tVAF Instruments BV\n00:50:C2:D2:60:00/36\tRch Group\n00:50:C2:D2:70:00/36\tFr.Sauter AG\n00:50:C2:D2:80:00/36\tDigitale Analoge COMponenten West Electronic Vertriebs GmbH\n00:50:C2:D2:90:00/36\tAxible Technologies\n00:50:C2:D2:A0:00/36\tMillennium Electronics Pty.Ltd.\n00:50:C2:D2:B0:00/36\tVideo Tech Laboratories, Inc.\n00:50:C2:D2:C0:00/36\tSchneider Electric Motion USA\n00:50:C2:D2:D0:00/36\tCadi Scientific Pte Ltd\n00:50:C2:D2:E0:00/36\tRS Gesellschaft fur Informationstechnik mbH & Co KG\n00:50:C2:D2:F0:00/36\tKey Systems, Inc.\n00:50:C2:D3:00:00/36\tACTIV Financial Systems, Inc.\n00:50:C2:D3:10:00/36\tUNGAVA Technologies Inc.\n00:50:C2:D3:20:00/36\tRealTime Systems Ltd\n00:50:C2:D3:30:00/36\tMaddalena S.p.A\n00:50:C2:D3:40:00/36\tGAON TECH corp.\n00:50:C2:D3:50:00/36\tUG Systems GmbH & Co. KG\n00:50:C2:D3:60:00/36\tEnatel Limited\n00:50:C2:D3:70:00/36\tLJT & Associates, Inc.\n00:50:C2:D3:80:00/36\tKyowa Electronics Co.,Ltd.\n00:50:C2:D3:90:00/36\tApex NV\n00:50:C2:D3:A0:00/36\tWellSense Technologies\n00:50:C2:D3:B0:00/36\tGitsn Inc.\n00:50:C2:D3:C0:00/36\tASSYSTEM France\n00:50:C2:D3:D0:00/36\tTellabs Operations Inc.\n00:50:C2:D3:E0:00/36\tSynatec Electronic GmbH\n00:50:C2:D3:F0:00/36\tCommunication Systems Solutions\n00:50:C2:D4:00:00/36\tdemmel products\n00:50:C2:D4:10:00/36\tArea Energy, Inc.\n00:50:C2:D4:20:00/36\tHagenuk KMT GmbH\n00:50:C2:D4:30:00/36\tDSP4YOU LTd\n00:50:C2:D4:40:00/36\tSaia-Burgess Controls AG\n00:50:C2:D4:50:00/36\tTechnagon GmbH\n00:50:C2:D4:60:00/36\tThales Nederland BV\n00:50:C2:D4:70:00/36\tRohde&Schwarz Topex SA\n00:50:C2:D4:80:00/36\tWatermark Estate Management Services, LLC\n00:50:C2:D4:90:00/36\tSmith Meter, Inc\n00:50:C2:D4:A0:00/36\tATH system\n00:50:C2:D4:B0:00/36\tIndra Australia\n00:50:C2:D4:C0:00/36\tDALOG Diagnosesysteme GmbH\n00:50:C2:D4:D0:00/36\tYardney Technical Products Inc.\n00:50:C2:D4:E0:00/36\tKeith & Koep GmbH\n00:50:C2:D4:F0:00/36\tSECOM GmbH\n00:50:C2:D5:00:00/36\tSolbrig Electronics, Inc.\n00:50:C2:D5:10:00/36\tBettini Srl\n00:50:C2:D5:20:00/36\tF+D Feinwerk- und Drucktechnik GmbH\n00:50:C2:D5:30:00/36\tTelemerkki Oy\n00:50:C2:D5:40:00/36\tABtrack s.r.l.\n00:50:C2:D5:50:00/36\tSterna Security\n00:50:C2:D5:60:00/36\tSELEX Communications Limited\n00:50:C2:D5:70:00/36\tHijikata Denki Corp.\n00:50:C2:D5:80:00/36\tNIK-ELEKTRONIKA Ltd\n00:50:C2:D5:90:00/36\tBuanco System A/S\n00:50:C2:D5:A0:00/36\tEmbedded Monitoring Systems Ltd.\n00:50:C2:D5:B0:00/36\tInfinition Inc.\n00:50:C2:D5:C0:00/36\tIbetor S.L.\n00:50:C2:D5:D0:00/36\tGlobalcom Engineering Srl\n00:50:C2:D5:E0:00/36\tPRIVATECH Inc.\n00:50:C2:D5:F0:00/36\tEmbedded Solution Bank Co., Ltd.\n00:50:C2:D6:00:00/36\tNihon Kessho Koogaku Co., Ltd.\n00:50:C2:D6:10:00/36\tsystem2 GmbH\n00:50:C2:D6:20:00/36\tEMAC, Inc.\n00:50:C2:D6:30:00/36\tDataregis S.A.\n00:50:C2:D6:40:00/36\tTV1 GmbH\n00:50:C2:D6:50:00/36\tTX Technology Corp\n00:50:C2:D6:60:00/36\tUvax Concepts\n00:50:C2:D6:70:00/36\tKLING & FREITAG GmbH\n00:50:C2:D6:80:00/36\tHiSpeed Data, Inc.\n00:50:C2:D6:90:00/36\tGHL Systems Bhd\n00:50:C2:D6:A0:00/36\tA&T Corporation, Electrics Group , LAS R&D Unit,\n00:50:C2:D6:B0:00/36\tNemec Automation\n00:50:C2:D6:C0:00/36\tALPHA Corporation\n00:50:C2:D6:D0:00/36\tPro-Digital Industria Eletronica\n00:50:C2:D6:E0:00/36\tBC Illumination, Inc.\n00:50:C2:D6:F0:00/36\tImtron Messtechnik GmbH\n00:50:C2:D7:00:00/36\tC. Rob. Hammerstein GmbH & Co. KG\n00:50:C2:D7:10:00/36\tEMAC, Inc.\n00:50:C2:D7:20:00/36\tScale-Tron, Inc.\n00:50:C2:D7:30:00/36\tSaia-Burgess Controls AG\n00:50:C2:D7:40:00/36\tComputech International\n00:50:C2:D7:50:00/36\tCollectric AB\n00:50:C2:D7:60:00/36\tTelvent\n00:50:C2:D7:70:00/36\tFr.SauterAG\n00:50:C2:D7:80:00/36\tP4Q Electronics\n00:50:C2:D7:90:00/36\tDSI RF Systems, Inc.\n00:50:C2:D7:A0:00/36\tTransbit Sp. z o.o.\n00:50:C2:D7:B0:00/36\tOWITA GmbH\n00:50:C2:D7:C0:00/36\tMicrocubs Systems Pvt Ltd\n00:50:C2:D7:D0:00/36\tVoltech Instruments\n00:50:C2:D7:E0:00/36\tLYNX Technik AG\n00:50:C2:D7:F0:00/36\tHMI Technologies\n00:50:C2:D8:00:00/36\tKeith & Koep GmbH\n00:50:C2:D8:10:00/36\tTattile srl\n00:50:C2:D8:20:00/36\tAudio Authority Corp\n00:50:C2:D8:30:00/36\tBlankom\n00:50:C2:D8:40:00/36\tABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.\n00:50:C2:D8:50:00/36\tVitec\n00:50:C2:D8:60:00/36\tEcomm Era\n00:50:C2:D8:70:00/36\tElectrolight Shivuk (1994) Ltd.\n00:50:C2:D8:80:00/36\tT+A elektroakustik GmbH & Co.KG\n00:50:C2:D8:90:00/36\tVisual Telecommunication Network, Inc\n00:50:C2:D8:A0:00/36\tOptoLink  Industria e Comercio Ltda\n00:50:C2:D8:B0:00/36\tSicon srl\n00:50:C2:D8:C0:00/36\tiRphotonics\n00:50:C2:D8:D0:00/36\tCS-Instruments\n00:50:C2:D8:E0:00/36\tLSD Science&Technology Co.,Ltd.\n00:50:C2:D8:F0:00/36\tSyes srl\n00:50:C2:D9:00:00/36\tDumps Electronic\n00:50:C2:D9:10:00/36\tChauvin Arnoux\n00:50:C2:D9:20:00/36\tManz\n00:50:C2:D9:30:00/36\tAxlon AB\n00:50:C2:D9:40:00/36\tSoftware Effect Enterprises, Inc\n00:50:C2:D9:50:00/36\tHoneywell\n00:50:C2:D9:60:00/36\tCONTEC GmbH\n00:50:C2:D9:70:00/36\tERS electronic GmbH\n00:50:C2:D9:80:00/36\tRong Shun Xuan Corp.\n00:50:C2:D9:90:00/36\tT-Industry, s.r.o.\n00:50:C2:D9:A0:00/36\tSaia-Burgess Controls AG\n00:50:C2:D9:B0:00/36\tIntuitive Surgical, Inc\n00:50:C2:D9:C0:00/36\tGamber Johnson LLC\n00:50:C2:D9:D0:00/36\tMistral Solutions Pvt. Ltd\n00:50:C2:D9:E0:00/36\tVocality International Ltd\n00:50:C2:D9:F0:00/36\tBitWise Controls\n00:50:C2:DA:00:00/36\tPrecision Remotes\n00:50:C2:DA:10:00/36\tMangoDSP\n00:50:C2:DA:20:00/36\tmetraTec GmbH\n00:50:C2:DA:30:00/36\tGD Mission Systems\n00:50:C2:DA:40:00/36\tDEUTA-WERKE GmbH\n00:50:C2:DA:50:00/36\tmegatec electronic GmbH\n00:50:C2:DA:60:00/36\tManitowoc Ice\n00:50:C2:DA:70:00/36\tCapton\n00:50:C2:DA:80:00/36\tSine Systems, Inc.\n00:50:C2:DA:90:00/36\tTieline Research Pty Ltd\n00:50:C2:DA:A0:00/36\tM & Paul, Inc\n00:50:C2:DA:B0:00/36\tAplex Technology Inc.\n00:50:C2:DA:C0:00/36\tRFL Electronics, Inc.\n00:50:C2:DA:D0:00/36\tKeith & Koep GmbH\n00:50:C2:DA:E0:00/36\tSpang Power Electronics\n00:50:C2:DA:F0:00/36\teumig industrie-TV GmbH.\n00:50:C2:DB:00:00/36\tIMAGO Technologies GmbH\n00:50:C2:DB:10:00/36\tRF Code\n00:50:C2:DB:20:00/36\tSoftwareCannery\n00:50:C2:DB:30:00/36\tLauda Dr. R. Wobser Gmbh & Co. Kg\n00:50:C2:DB:40:00/36\tZAO NPC \"Kompjuternie Technologii\"\n00:50:C2:DB:50:00/36\tDsp Design Ltd\n00:50:C2:DB:60:00/36\tProsoft-Systems Ltd\n00:50:C2:DB:70:00/36\tSOREL GmbH\n00:50:C2:DB:80:00/36\tComsat VertriebsgmbH\n00:50:C2:DB:90:00/36\tPeek Traffic Corporation\n00:50:C2:DB:A0:00/36\tMotor Protection Electronics\n00:50:C2:DB:B0:00/36\tEsensors, Inc.\n00:50:C2:DB:C0:00/36\tNantes Systems Private Limited\n00:50:C2:DB:D0:00/36\tMargento R&D\n00:50:C2:DB:E0:00/36\tWITHSYSTEM Co.,Ltd\n00:50:C2:DB:F0:00/36\tOne-Nemoto Engineering Corporation\n00:50:C2:DC:00:00/36\tSecurity Services Group (SSG)\n00:50:C2:DC:10:00/36\tAcrux Technology Limited\n00:50:C2:DC:20:00/36\tTessera Technology Inc.\n00:50:C2:DC:30:00/36\tZED Ziegler Electronic Devices GmbH\n00:50:C2:DC:40:00/36\tKeith & Koep GmbH\n00:50:C2:DC:50:00/36\tSaia-Burgess Controls AG\n00:50:C2:DC:60:00/36\tFluid Components Intl\n00:50:C2:DC:70:00/36\tAGT Holdings Limited\n00:50:C2:DC:80:00/36\tT2M2 GmbH\n00:50:C2:DC:90:00/36\tKinotonGmbH\n00:50:C2:DC:A0:00/36\tTele Data Control\n00:50:C2:DC:B0:00/36\tCT Company\n00:50:C2:DC:C0:00/36\tInstrumentel Limited\n00:50:C2:DC:D0:00/36\tdilitronics GmbH\n00:50:C2:DC:E0:00/36\tMecsel Oy\n00:50:C2:DC:F0:00/36\tMCS Engenharia ltda\n00:50:C2:DD:00:00/36\tIDC Solutions Pty Ltd\n00:50:C2:DD:10:00/36\tBrankamp GmbH\n00:50:C2:DD:20:00/36\tElectronic Applications, Inc.\n00:50:C2:DD:30:00/36\tRohde&Schwarz Topex SA\n00:50:C2:DD:40:00/36\tSystech\n00:50:C2:DD:50:00/36\tFriend Spring Industrial Co., Ltd.\n00:50:C2:DD:60:00/36\tWartsila Voyage Oy\n00:50:C2:DD:70:00/36\tTornado Modular Systems\n00:50:C2:DD:80:00/36\tLeonardo UK Ltd\n00:50:C2:DD:90:00/36\tMetraware\n00:50:C2:DD:A0:00/36\trbz robot design s.l.\n00:50:C2:DD:B0:00/36\tLuceo\n00:50:C2:DD:C0:00/36\tVision  & Control GmbH\n00:50:C2:DD:D0:00/36\tA&A General Srl\n00:50:C2:DD:E0:00/36\tDRS Imaging and Targeting Solutions\n00:50:C2:DD:F0:00/36\tDevice GmbH\n00:50:C2:DE:00:00/36\tInternet Protocolo Logica Sl\n00:50:C2:DE:10:00/36\tABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.\n00:50:C2:DE:20:00/36\tSequtec Inc\n00:50:C2:DE:30:00/36\tBreakaway Systems LLC\n00:50:C2:DE:40:00/36\tEGS Technologies Ltd\n00:50:C2:DE:50:00/36\tNeets\n00:50:C2:DE:60:00/36\tFr. Sauter AG\n00:50:C2:DE:70:00/36\tBucher Automation Budapest\n00:50:C2:DE:80:00/36\tVisual Productions\n00:50:C2:DE:90:00/36\tDacom West GmbH\n00:50:C2:DE:A0:00/36\tCerner Corporation\n00:50:C2:DE:B0:00/36\tRuwisch & Kollegen GmbH\n00:50:C2:DE:C0:00/36\tVendNovation LLC\n00:50:C2:DE:D0:00/36\tLee Laser\n00:50:C2:DE:F0:00/36\tPowersense A/S\n00:50:C2:DF:00:00/36\tKoncar Electrical Engineering Institute\n00:50:C2:DF:10:00/36\tSaia-Burgess Controls AG\n00:50:C2:DF:20:00/36\tOcean Sonics\n00:50:C2:DF:30:00/36\tINSEVIS GmbH\n00:50:C2:DF:40:00/36\tPotter Electric Signal Co. LLC\n00:50:C2:DF:50:00/36\tEtherLight\n00:50:C2:DF:60:00/36\tHino Engineering, Inc\n00:50:C2:DF:70:00/36\tCombilent\n00:50:C2:DF:80:00/36\tTommotek (WA) Pty Ltd.\n00:50:C2:DF:90:00/36\tJenny Science AG\n00:50:C2:DF:A0:00/36\tMAC Valves, Inc.\n00:50:C2:DF:B0:00/36\tBettini Srl\n00:50:C2:DF:C0:00/36\tI-Evo Ltd\n00:50:C2:DF:D0:00/36\tWotbox ltd\n00:50:C2:DF:E0:00/36\tXitek Design Limited\n00:50:C2:DF:F0:00/36\tTantal Electronica, Sl\n00:50:C2:E0:00:00/36\tAplex Technology Inc.\n00:50:C2:E0:10:00/36\tTyco Traffic & Transportation\n00:50:C2:E0:20:00/36\tCleverscope\n00:50:C2:E0:30:00/36\tICU Scandinavia Schweiz GmbH\n00:50:C2:E0:40:00/36\tSec.Eng Systems Pty Ltd\n00:50:C2:E0:50:00/36\tNocosium\n00:50:C2:E0:60:00/36\tEbner Electronic GmbH\n00:50:C2:E0:70:00/36\tProtagon Process Technologies GmbH\n00:50:C2:E0:80:00/36\tKST Technology\n00:50:C2:E0:90:00/36\tAteme\n00:50:C2:E0:A0:00/36\tSicon srl\n00:50:C2:E0:B0:00/36\tSeartech\n00:50:C2:E0:C0:00/36\tYouho Electric Ind.,Ltd.\n00:50:C2:E0:D0:00/36\tUnixmedia Srl\n00:50:C2:E0:E0:00/36\tPmac Japan\n00:50:C2:E0:F0:00/36\tTrentino Systems\n00:50:C2:E1:00:00/36\tRadinetworks Co., Ltd\n00:50:C2:E1:10:00/36\tRadioMobile Inc\n00:50:C2:E1:20:00/36\tKago Electronics BV\n00:50:C2:E1:30:00/36\tAutomation Assist Japan Company\n00:50:C2:E1:40:00/36\tCalixto Systems Pvt Ltd\n00:50:C2:E1:50:00/36\tIHI Scube Co.,Ltd\n00:50:C2:E1:60:00/36\tJetstream Ltd.\n00:50:C2:E1:70:00/36\tGall Tankdatensysteme GmbH\n00:50:C2:E1:80:00/36\tABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.\n00:50:C2:E1:90:00/36\tZoe Medical\n00:50:C2:E1:A0:00/36\tRosslare Enterprises Limited\n00:50:C2:E1:B0:00/36\tEmbedded Labs\n00:50:C2:E1:C0:00/36\tSaia-Burgess Controls AG\n00:50:C2:E1:D0:00/36\tHoldline Tecnologia e Sistemas Ltda\n00:50:C2:E1:E0:00/36\tLo-Q plc\n00:50:C2:E1:F0:00/36\tElvees\n00:50:C2:E2:00:00/36\tDivelbiss Corporation\n00:50:C2:E2:10:00/36\tNorwia AS\n00:50:C2:E2:20:00/36\tMichael Riedel Transformatorenbau GmbH\n00:50:C2:E2:30:00/36\tVitec\n00:50:C2:E2:40:00/36\tDiTEST Fahrzeugdiagnose GmbH\n00:50:C2:E2:50:00/36\tACD Elektronik GmbH\n00:50:C2:E2:60:00/36\tCinetix s.r.l.\n00:50:C2:E2:70:00/36\tCONTROL SYSTEMS Srl\n00:50:C2:E2:80:00/36\tTeplovodokhran\n00:50:C2:E2:90:00/36\tFr. Sauter AG\n00:50:C2:E2:A0:00/36\tRohde&Schwarz Topex SA\n00:50:C2:E2:B0:00/36\tPlant Integrity Limited\n00:50:C2:E2:C0:00/36\tEN ElectronicNetwork Hamburg GmbH\n00:50:C2:E2:D0:00/36\tFunkwerk IT Karlsfeld GmbH\n00:50:C2:E2:E0:00/36\tDS! Ingenieurbuero\n00:50:C2:E2:F0:00/36\tBeam Ltd\n00:50:C2:E3:00:00/36\tGoennheimer Elektronic GmbH\n00:50:C2:E3:10:00/36\tENSIS Co., Ltd.\n00:50:C2:E3:20:00/36\tOshoksh Corporation\n00:50:C2:E3:30:00/36\tMorita Technical Center Company\n00:50:C2:E3:40:00/36\tHGL Dynamics\n00:50:C2:E3:50:00/36\tOmnica Corporation\n00:50:C2:E3:60:00/36\tSaia-Burgess Controls AG\n00:50:C2:E3:70:00/36\tFUJI DATA SYSTEM Co., Ltd\n00:50:C2:E3:80:00/36\tAesir Copenhagen\n00:50:C2:E3:90:00/36\tTelemetrics Inc.\n00:50:C2:E3:A0:00/36\tVocality International Ltd\n00:50:C2:E3:B0:00/36\tNanosolution Inc.\n00:50:C2:E3:C0:00/36\tGrupo Epelsa S.L.\n00:50:C2:E3:D0:00/36\tBaudisch Electronic GmbH\n00:50:C2:E3:E0:00/36\tMonnit Corp.\n00:50:C2:E3:F0:00/36\tVisito S.R.L.\n00:50:C2:E4:00:00/36\tEcrin Systems\n00:50:C2:E4:10:00/36\tHigeco S.r.l.\n00:50:C2:E4:20:00/36\tWings for Media SL\n00:50:C2:E4:30:00/36\tTechnica Engineering GmbH\n00:50:C2:E4:40:00/36\tDEUTA-WERKE GmbH\n00:50:C2:E4:50:00/36\tStichting Sunrise\n00:50:C2:E4:60:00/36\tIndustrea Mining Technology\n00:50:C2:E4:70:00/36\tEnika.Cz\n00:50:C2:E4:80:00/36\tITW Reyflex North America\n00:50:C2:E4:90:00/36\tCtf Technologies Do Brasil Ltda\n00:50:C2:E4:A0:00/36\tGHL Systems Bhd\n00:50:C2:E4:B0:00/36\tRohde&Schwarz Topex SA\n00:50:C2:E4:C0:00/36\tApplied Micro Electronics AME bv\n00:50:C2:E4:D0:00/36\tPcsc\n00:50:C2:E4:E0:00/36\tInstitute For Information Industry\n00:50:C2:E4:F0:00/36\tWine Technology Marlborough\n00:50:C2:E5:00:00/36\tTattile srl\n00:50:C2:E5:10:00/36\tMotec Pty Ltd\n00:50:C2:E5:20:00/36\tFamas System S.p.A.\n00:50:C2:E5:30:00/36\tNEXT video systems Hard- and Software Development GmbH\n00:50:C2:E5:40:00/36\tArcos Technologies LTD\n00:50:C2:E5:50:00/36\tTTi Ltd\n00:50:C2:E5:60:00/36\tRfengine Co., Ltd.\n00:50:C2:E5:70:00/36\tEolane Montceau\n00:50:C2:E5:80:00/36\tAgri-hitech LLC\n00:50:C2:E5:90:00/36\tSaia-Burgess Controls AG\n00:50:C2:E5:A0:00/36\tFutec Inc.\n00:50:C2:E5:B0:00/36\tCAIPO Automazione Industriale s.r.l.\n00:50:C2:E5:C0:00/36\tMCOPIA Co., Ltd\n00:50:C2:E5:D0:00/36\tT8 Ltd\n00:50:C2:E5:E0:00/36\tOrep\n00:50:C2:E5:F0:00/36\tPantec Engineering AG\n00:50:C2:E6:00:00/36\tHorizon.Inc\n00:50:C2:E6:10:00/36\tDetech Electronics ApS\n00:50:C2:E6:20:00/36\tSAE IT-systems GmbH & Co. KG\n00:50:C2:E6:30:00/36\tPrima sistemi\n00:50:C2:E6:40:00/36\tEdgeware AB\n00:50:C2:E6:50:00/36\tIB Elektronik GmbH\n00:50:C2:E6:60:00/36\tEMAC, Inc.\n00:50:C2:E6:70:00/36\tCritical Link LLC\n00:50:C2:E6:80:00/36\tKyoritsu Electric Corporation\n00:50:C2:E6:90:00/36\tNetmaker\n00:50:C2:E6:A0:00/36\tAplex Technology Inc.\n00:50:C2:E6:B0:00/36\tSika Technology AG\n00:50:C2:E6:C0:00/36\tSAMSUNG Electronics Co.,Ltd.(LED Division)\n00:50:C2:E6:D0:00/36\tAllerta Inc\n00:50:C2:E6:E0:00/36\tPower-One Italia S.p.A\n00:50:C2:E6:F0:00/36\tLeyden Engineering\n00:50:C2:E7:00:00/36\tDorlet Sau\n00:50:C2:E7:10:00/36\ttraffic network solutions s.l\n00:50:C2:E7:30:00/36\tACS Motion Control Ltd.\n00:50:C2:E7:40:00/36\tWill corp.\n00:50:C2:E7:50:00/36\tFsm Ag\n00:50:C2:E7:60:00/36\tEmbedded Solution Bank Co., Ltd.\n00:50:C2:E7:70:00/36\tFr. Sauter AG\n00:50:C2:E7:80:00/36\tTask Sistemas De Computacao Ltda\n00:50:C2:E7:90:00/36\tMCS MICRONIC Computer Systeme GmbH\n00:50:C2:E7:A0:00/36\tLightel\n00:50:C2:E7:B0:00/36\tATOM GIKEN Co.,Ltd.\n00:50:C2:E7:C0:00/36\tsp controls, inc\n00:50:C2:E7:D0:00/36\tAEL Microsystems Limited\n00:50:C2:E7:E0:00/36\tSwareflex GmbH\n00:50:C2:E7:F0:00/36\tLS Control A/S\n00:50:C2:E8:00:00/36\tSaia-Burgess Controls AG\n00:50:C2:E8:10:00/36\tAdaptive Technologies, Inc.\n00:50:C2:E8:20:00/36\tXplore Technologies Corp\n00:50:C2:E8:30:00/36\tWitree Co.,Ltd\n00:50:C2:E8:40:00/36\tABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.\n00:50:C2:E8:50:00/36\tCosmo Life Co.,Ltd\n00:50:C2:E8:60:00/36\tMultisuns Corporation\n00:50:C2:E8:70:00/36\tLamson Safes & Security\n00:50:C2:E8:80:00/36\tPivitec, LLC\n00:50:C2:E8:90:00/36\tProteqsen\n00:50:C2:E8:A0:00/36\tMacronet s.r.l.\n00:50:C2:E8:B0:00/36\tRPA Electronic Solutions, Inc.\n00:50:C2:E8:C0:00/36\tEpec Oy\n00:50:C2:E8:D0:00/36\tSystemAdvanced Co,Ltd\n00:50:C2:E8:E0:00/36\tGD Mission Systems\n00:50:C2:E8:F0:00/36\tSTT Condigi A/S\n00:50:C2:E9:00:00/36\tGS Elektromedizinische Geraete G. Stemple GmbH\n00:50:C2:E9:10:00/36\tDsp Design Ltd\n00:50:C2:E9:20:00/36\tCT Company\n00:50:C2:E9:30:00/36\tPerceptive Pixel Inc.\n00:50:C2:E9:40:00/36\tANA-U GmbH\n00:50:C2:E9:50:00/36\tDlite Comercio, Importadora e Serviços de Automação Ltda\n00:50:C2:E9:60:00/36\tProyecson S.A.\n00:50:C2:E9:70:00/36\tArista Systems Corporation\n00:50:C2:E9:80:00/36\ti3 International Inc.\n00:50:C2:E9:90:00/36\tUV Networks, Inc.\n00:50:C2:E9:A0:00/36\tSolace Systems\n00:50:C2:E9:B0:00/36\tHentschel System GmbH\n00:50:C2:E9:C0:00/36\tSPARQ systems\n00:50:C2:E9:D0:00/36\tnicai-systems\n00:50:C2:E9:E0:00/36\tAmerican Microsystems, Ltd.\n00:50:C2:E9:F0:00/36\tDataSoft Corporation\n00:50:C2:EA:00:00/36\tRobert Bosch Healthcare Systems, Inc.\n00:50:C2:EA:10:00/36\tTex Computer Srl\n00:50:C2:EA:20:00/36\tThinkRF Corp\n00:50:C2:EA:30:00/36\tSubsea Systems, Inc.\n00:50:C2:EA:40:00/36\thead\n00:50:C2:EA:50:00/36\tAerodata AG\n00:50:C2:EA:60:00/36\tPowersense A/S\n00:50:C2:EA:70:00/36\tSaia-Burgess Controls AG\n00:50:C2:EA:80:00/36\tMB connect line GmbH Fernwartungssysteme\n00:50:C2:EA:90:00/36\tMettler Toledo\n00:50:C2:EA:A0:00/36\tBAE Systems\n00:50:C2:EA:B0:00/36\tWarp9 Tech Design, Inc.\n00:50:C2:EA:C0:00/36\tAlias ip\n00:50:C2:EA:D0:00/36\tRohde&Schwarz Topex SA\n00:50:C2:EA:E0:00/36\tAlyrica Networks\n00:50:C2:EA:F0:00/36\tGogo BA\n00:50:C2:EB:00:00/36\tPulse Communication Systems Pvt. Ltd.\n00:50:C2:EB:10:00/36\tPdu Expert Uk Ltd\n00:50:C2:EB:20:00/36\tOtaki Electric Corporation\n00:50:C2:EB:30:00/36\tAR RF/Microwave Instrumentation\n00:50:C2:EB:40:00/36\tWishtek Technology, Inc.\n00:50:C2:EB:50:00/36\tCovidence A/S\n00:50:C2:EB:60:00/36\tMonsoon Solutions, Inc.\n00:50:C2:EB:70:00/36\tSaab AB\n00:50:C2:EB:80:00/36\tdspnor\n00:50:C2:EB:90:00/36\tAlpha-Mos\n00:50:C2:EB:A0:00/36\tWest-Com Nurse Call Systems, Inc.\n00:50:C2:EB:B0:00/36\tTimeTerminal Adductor Group AB\n00:50:C2:EB:C0:00/36\tDiehl AKO Stiftung & Co. KG\n00:50:C2:EB:D0:00/36\tDroplet Measurement Technologies\n00:50:C2:EB:E0:00/36\tGlobal Tecnologia LTDA.\n00:50:C2:EB:F0:00/36\tCivolution\n00:50:C2:EC:00:00/36\tUgMO Technologies\n00:50:C2:EC:10:00/36\tANT Group s.r.l\n00:50:C2:EC:20:00/36\tIxonos Plc\n00:50:C2:EC:30:00/36\tAplex Technology Inc.\n00:50:C2:EC:40:00/36\tLogical Electromechanical Sys Inc.\n00:50:C2:EC:50:00/36\tRSUPPORT Co., Ltd.\n00:50:C2:EC:60:00/36\tInfronics Systems Limited\n00:50:C2:EC:70:00/36\tLiquid Robotics, Inc\n00:50:C2:EC:80:00/36\tIbernex Ingenieria, S.L.\n00:50:C2:EC:90:00/36\tAmsterdam Scientific Instruments BV\n00:50:C2:EC:A0:00/36\tBitWise Controls\n00:50:C2:EC:B0:00/36\tFAL Corp\n00:50:C2:EC:C0:00/36\tSaia-Burgess Controls AG\n00:50:C2:EC:D0:00/36\tPeek Traffic Corporation\n00:50:C2:EC:E0:00/36\teasii ic adiis\n00:50:C2:EC:F0:00/36\tTaiwan Hiplus Corporation\n00:50:C2:ED:00:00/36\tNippon Systemware Co.,Ltd.\n00:50:C2:ED:10:00/36\tArcontia Technology AB\n00:50:C2:ED:20:00/36\tKlangspektrum GmbH\n00:50:C2:ED:30:00/36\tEco Monitoring Utility Systems Ltd\n00:50:C2:ED:40:00/36\tTamagawa Electronics Co.,Ltd.\n00:50:C2:ED:50:00/36\tRFL Electronics, Inc.\n00:50:C2:ED:60:00/36\tCat AB\n00:50:C2:ED:70:00/36\tFBT Elettronica spa\n00:50:C2:ED:80:00/36\tAVocation Systems, Inc.\n00:50:C2:ED:90:00/36\tPlasmatronics pty ltd\n00:50:C2:ED:A0:00/36\tJoint Stock Company \"Svyaz Inginiring M\"\n00:50:C2:ED:B0:00/36\tBelik S.P.R.L.\n00:50:C2:ED:C0:00/36\tEyelock Corporation\n00:50:C2:ED:D0:00/36\tEbneuro Spa\n00:50:C2:ED:E0:00/36\tSmart Grid Networks\n00:50:C2:ED:F0:00/36\tMonitor Business Machines\n00:50:C2:EE:00:00/36\tosf Hansjuergen Meier GmbH & Co. KG\n00:50:C2:EE:10:00/36\tProcon Electronics\n00:50:C2:EE:20:00/36\tSystem Industrie Electronic GmbH\n00:50:C2:EE:30:00/36\tTecnint HTE SRL\n00:50:C2:EE:40:00/36\tRohde&Schwarz Topex SA\n00:50:C2:EE:50:00/36\tCytec Zylindertechnik GmbH\n00:50:C2:EE:60:00/36\tB:TECH, a. s.\n00:50:C2:EE:70:00/36\tsyes srl\n00:50:C2:EE:80:00/36\tKamacho Scale Co., Ltd.\n00:50:C2:EE:90:00/36\tQUANTA S.r.l.\n00:50:C2:EE:A0:00/36\tPositioneering Limited\n00:50:C2:EE:B0:00/36\tfibrisTerre GmbH\n00:50:C2:EE:C0:00/36\tYUYAMA MFG Co.,Ltd\n00:50:C2:EE:D0:00/36\tFuture Design Controls, Inc\n00:50:C2:EE:E0:00/36\tABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.\n00:50:C2:EE:F0:00/36\tIDTRONIC GmbH\n00:50:C2:EF:00:00/36\tHomaetrix Ltd\n00:50:C2:EF:10:00/36\tSaia-Burgess Controls AG\n00:50:C2:EF:20:00/36\tSpecialty Microwave Corp\n00:50:C2:EF:30:00/36\tSmart Power Electronics GmbH & Co. KG\n00:50:C2:EF:40:00/36\tRO.VE.R. Laboratories S.p.A\n00:50:C2:EF:50:00/36\tHuman Network Labs, Inc.\n00:50:C2:EF:60:00/36\tNetline Communication Technologies\n00:50:C2:EF:70:00/36\tAmstelland Electronic BV\n00:50:C2:EF:80:00/36\tHCL Technologies\n00:50:C2:EF:90:00/36\tHoriba Abx Sas\n00:50:C2:EF:A0:00/36\tPredictive Sensor Technology\n00:50:C2:EF:B0:00/36\tNorbit ODM AS\n00:50:C2:EF:C0:00/36\tPrivate\n00:50:C2:EF:D0:00/36\tSanmina\n00:50:C2:EF:E0:00/36\tPLR Information Systems Ltd.\n00:50:C2:EF:F0:00/36\tZephyrus Electronics LTD.\n00:50:C2:F0:00:00/36\tSyscom Instruments\n00:50:C2:F0:10:00/36\tMango DSP, Inc\n00:50:C2:F0:20:00/36\tBmr\n00:50:C2:F0:30:00/36\tWren Sound Systems\n00:50:C2:F0:40:00/36\tKinki Roentgen Industrial Co.,Ltd\n00:50:C2:F0:50:00/36\tESI Ventures, LLC\n00:50:C2:F0:60:00/36\tMicro-Key BV\n00:50:C2:F0:70:00/36\tIcon Research Ltd\n00:50:C2:F0:80:00/36\tAplex Technology Inc.\n00:50:C2:F0:90:00/36\tWheatstone Corporation\n00:50:C2:F0:A0:00/36\tHASCOM International Pty Ltd\n00:50:C2:F0:B0:00/36\tTreehaven Technologies, Inc.\n00:50:C2:F0:C0:00/36\tSkychannel Ltd\n00:50:C2:F0:D0:00/36\tBluetest AB\n00:50:C2:F0:E0:00/36\tMicro Technic A/S\n00:50:C2:F0:F0:00/36\tAeroVision Avionics, Inc.\n00:50:C2:F1:00:00/36\tWincor Nixdorf Sp. z o.o.\n00:50:C2:F1:10:00/36\tOrganis GmbH\n00:50:C2:F1:20:00/36\tGeneral Industrial Controls Pvt Ltd\n00:50:C2:F1:30:00/36\tPacket Plus, Inc.\n00:50:C2:F1:40:00/36\tVision Systems Aeronautic\n00:50:C2:F1:50:00/36\tSascal Displays Ltd\n00:50:C2:F1:60:00/36\tPeter Huber Kaeltemaschinenbau SE\n00:50:C2:F1:70:00/36\tABB Transmission and Distribution Automation Equipment (Xiamen) Co., Ltd.\n00:50:C2:F1:80:00/36\tVitec Multimedia\n00:50:C2:F1:90:00/36\tNetlink Bilisim Sistemleri San. ve Tic. Ltd. Sti.\n00:50:C2:F1:A0:00/36\tAqua Management\n00:50:C2:F1:B0:00/36\tSaia-Burgess Controls AG\n00:50:C2:F1:C0:00/36\tGD Mission Systems\n00:50:C2:F1:D0:00/36\tGrossenbacher Systeme AG\n00:50:C2:F1:E0:00/36\tDell'Orto S.P.A.\n00:50:C2:F1:F0:00/36\tVerified Energy, LLC.\n00:50:C2:F2:00:00/36\tUnfors Instruments AB\n00:50:C2:F2:10:00/36\tSEITEC Co. Ltd\n00:50:C2:F2:20:00/36\tHarland Simon plc\n00:50:C2:F2:30:00/36\tElectro-Motive Diesel\n00:50:C2:F2:40:00/36\tCT Company\n00:50:C2:F2:50:00/36\tSamway Electronic SRL\n00:50:C2:F2:60:00/36\tWaveIP\n00:50:C2:F2:70:00/36\tBucher Automation Budapest\n00:50:C2:F2:80:00/36\tVertex Antennentechnik GmbH\n00:50:C2:F2:90:00/36\tRadyne Corporation\n00:50:C2:F2:A0:00/36\tACD Elektronik GmbH\n00:50:C2:F2:B0:00/36\tBio Guard component & technologies\n00:50:C2:F2:C0:00/36\tTerratel Technology s.r.o.\n00:50:C2:F2:D0:00/36\tRobert Bosch Healthcare Systems, Inc.\n00:50:C2:F2:E0:00/36\tH&L Instruments, LLC\n00:50:C2:F2:F0:00/36\tArcos Technologies LTD\n00:50:C2:F3:00:00/36\tMiris AB\n00:50:C2:F3:10:00/36\tRuetz Technologies GmbH\n00:50:C2:F3:20:00/36\tNet4Things\n00:50:C2:F3:30:00/36\tApplied Micro Electronics AME bv\n00:50:C2:F3:40:00/36\tSequip S+E GmbH\n00:50:C2:F3:50:00/36\tGrupo Epelsa S.L.\n00:50:C2:F3:60:00/36\tVisitech AS\n00:50:C2:F3:70:00/36\tRosslare Enterprises Limited\n00:50:C2:F3:80:00/36\tAeroControl, Inc.\n00:50:C2:F3:90:00/36\tInForce Computing, Inc.\n00:50:C2:F3:A0:00/36\tSaia-Burgess Controls AG\n00:50:C2:F3:B0:00/36\tTAMS firmware co.\n00:50:C2:F3:C0:00/36\tVemco Sp. z o. o.\n00:50:C2:F3:D0:00/36\tProject service S.a.s\n00:50:C2:F3:E0:00/36\tVtron Pty Ltd\n00:50:C2:F3:F0:00/36\tDENSEI COMMUNICATION Inc.\n00:50:C2:F4:00:00/36\tiBWorld co.,ltd.\n00:50:C2:F4:10:00/36\tFairyDevices Inc.\n00:50:C2:F4:20:00/36\tDSPCon\n00:50:C2:F4:30:00/36\tSpecial Systems Engineering Center LLC\n00:50:C2:F4:40:00/36\tSteinbichler Optotechnik GmbH\n00:50:C2:F4:50:00/36\tHUSTY M.Styczen J.Hupert Sp.J.\n00:50:C2:F4:60:00/36\tReason Tecnologia S.A.\n00:50:C2:F4:70:00/36\tcadac,inc.\n00:50:C2:F4:80:00/36\tShure Incorporated\n00:50:C2:F4:90:00/36\tGreen Instruments A/S\n00:50:C2:F4:A0:00/36\tZ-App Systems, Inc.\n00:50:C2:F4:B0:00/36\tSupranet\n00:50:C2:F4:C0:00/36\tEnistic Limited\n00:50:C2:F4:D0:00/36\tKnowhow Infocom Inc.\n00:50:C2:F4:E0:00/36\tHeinzinger electronic GmbH\n00:50:C2:F4:F0:00/36\tBAP Precision Ltd.\n00:50:C2:F5:00:00/36\tMoritex Corporation\n00:50:C2:F5:10:00/36\tNDC Infrared Engineering, Inc.\n00:50:C2:F5:20:00/36\tRohde&Schwarz Topex SA\n00:50:C2:F5:30:00/36\tBaycom Opto-Electronics Technolgy Co., Ltd.\n00:50:C2:F5:40:00/36\tHella Gutmann Solutions GmbH\n00:50:C2:F5:50:00/36\tHoneywell\n00:50:C2:F5:60:00/36\tMonsoon Solutions, Inc.\n00:50:C2:F5:70:00/36\tReach Technologies Inc.\n00:50:C2:F5:80:00/36\tIEEE Registration Authority\n00:50:C2:F5:90:00/36\tG3 Technologies\n00:50:C2:F5:A0:00/36\tSentry 360 Security\n00:50:C2:F5:B0:00/36\tSaia-Burgess Controls AG\n00:50:C2:F5:C0:00/36\tDsp Design Ltd\n00:50:C2:F5:D0:00/36\tSmartb Technologies\n00:50:C2:F5:E0:00/36\tY-cam Solutions Ltd\n00:50:C2:F5:F0:00/36\tBoryeu Technology Co.,Ltd\n00:50:C2:F6:00:00/36\tDeckma GmbH\n00:50:C2:F6:10:00/36\tBrauch Elektronik GmbH&Co.KG\n00:50:C2:F6:20:00/36\tEMAC, Inc.\n00:50:C2:F6:30:00/36\tTriax A/S\n00:50:C2:F6:40:00/36\tChrisso Technologies LLC\n00:50:C2:F6:50:00/36\tTelebyte Inc.\n00:50:C2:F6:60:00/36\tGwt Llc\n00:50:C2:F6:70:00/36\tCelestial Audio\n00:50:C2:F6:80:00/36\tNewtec A/S\n00:50:C2:F6:90:00/36\tSafe Place Solutions Ltd\n00:50:C2:F6:A0:00/36\tOFI Inc. (dba 2D2C)\n00:50:C2:F6:B0:00/36\tAlgodue Elettronica Srl\n00:50:C2:F6:C0:00/36\tPro Design Electronic GmbH\n00:50:C2:F6:D0:00/36\tPro Design Electronic GmbH\n00:50:C2:F6:E0:00/36\tSmith Meter, Inc.\n00:50:C2:F6:F0:00/36\tAplex Technology Inc.\n00:50:C2:F7:00:00/36\tNoralta Technologies Inc\n00:50:C2:F7:10:00/36\tRF Code\n00:50:C2:F7:20:00/36\tMaxDeTec AG\n00:50:C2:F7:30:00/36\tDeltacast.Tv\n00:50:C2:F7:40:00/36\tThor Technologies Pty Ltd\n00:50:C2:F7:50:00/36\tPumpWell Solutions Ltd.\n00:50:C2:F7:60:00/36\tRong Jie(FuZhou)Electronics Co.,Ltd\n00:50:C2:F7:70:00/36\tSYSTEMTECHNIK GmbH\n00:50:C2:F7:80:00/36\tGets MSS S.A.\n00:50:C2:F7:90:00/36\tTattile srl\n00:50:C2:F7:A0:00/36\tC3 Llc\n00:50:C2:F7:B0:00/36\tMCM Electronics\n00:50:C2:F7:C0:00/36\tAtonometrics, Inc.\n00:50:C2:F7:D0:00/36\tD-Hike Electroncs Technology Co.,Ltd\n00:50:C2:F7:E0:00/36\tTruTeq Wireless (Pty) Ltd\n00:50:C2:F7:F0:00/36\tDynamic Design\n00:50:C2:F8:00:00/36\tSYS TEC electronic GmbH\n00:50:C2:F8:10:00/36\tPlda\n00:50:C2:F8:20:00/36\tSincair Systems International\n00:50:C2:F8:30:00/36\tTelevic Rail GmbH\n00:50:C2:F8:40:00/36\tDynon Instruments\n00:50:C2:F8:50:00/36\tEnetics, Inc.\n00:50:C2:F8:60:00/36\tAudio Power Labs\n00:50:C2:F8:70:00/36\tVaisala Oyj\n00:50:C2:F8:80:00/36\tRTC Manufacturing Inc.\n00:50:C2:F8:90:00/36\tCSA Engineering AG\n00:50:C2:F8:A0:00/36\tEMAC, Inc.\n00:50:C2:F8:B0:00/36\tcomlet Verteilte Systeme GmbH\n00:50:C2:F8:C0:00/36\tUBSTechnology Co., Ltd\n00:50:C2:F8:D0:00/36\tGuangdong East Power Co.,\n00:50:C2:F8:E0:00/36\tGpo\n00:50:C2:F8:F0:00/36\tComputerwise, Inc.\n00:50:C2:F9:00:00/36\tSecureTech Systems, Inc.\n00:50:C2:F9:10:00/36\tRE2 Inc\n00:50:C2:F9:20:00/36\tCONET Solutions GmbH\n00:50:C2:F9:30:00/36\tBaudisch Electronic GmbH\n00:50:C2:F9:40:00/36\tDigital Barriers\n00:50:C2:F9:50:00/36\tTTi LTD (Thurlby Thandar Instruments LTD)\n00:50:C2:F9:60:00/36\tJLCooper Electronics\n00:50:C2:F9:70:00/36\tSicon srl\n00:50:C2:F9:80:00/36\tInfotech North America\n00:50:C2:F9:90:00/36\tDr. Neumann elektronik GmbH\n00:50:C2:F9:A0:00/36\tTelvent\n00:50:C2:F9:B0:00/36\tNewell Technologies Limited\n00:50:C2:F9:C0:00/36\tR&D Kometeh\n00:50:C2:F9:D0:00/36\tJSC \"Kaluga Teletypes Manufacturing Plant\"\n00:50:C2:F9:E0:00/36\tMatsusada Precision Inc.\n00:50:C2:F9:F0:00/36\tNanjing SAC Power Grid Automation Co., Ltd.\n00:50:C2:FA:00:00/36\tAmplus Communication Pte Ltd\n00:50:C2:FA:10:00/36\tN-Hands GmbH und Co KG\n00:50:C2:FA:20:00/36\tPower-One\n00:50:C2:FA:30:00/36\tXemex NV\n00:50:C2:FA:50:00/36\tIntuitive Surgical, Inc\n00:50:C2:FA:60:00/36\tHilkom digital GmbH\n00:50:C2:FA:70:00/36\tExelis Inc.\n00:50:C2:FA:80:00/36\tYash SiQure Technologies India Pvt. Ltd.\n00:50:C2:FA:90:00/36\tHijet Print d.o.o.\n00:50:C2:FA:A0:00/36\tYjsystem\n00:50:C2:FA:B0:00/36\tAplex Technology Inc.\n00:50:C2:FA:C0:00/36\tAdetel Group\n00:50:C2:FA:D0:00/36\tFinishing Brands\n00:50:C2:FA:E0:00/36\tATI Automação Telecomunicações e Informática Ltda\n00:50:C2:FA:F0:00/36\tVremya-CH JSC\n00:50:C2:FB:00:00/36\tTateishi Kobisha Co.LTD\n00:50:C2:FB:10:00/36\tMatelex\n00:50:C2:FB:20:00/36\tPreston Industries dba PolyScience\n00:50:C2:FB:30:00/36\tCT Company\n00:50:C2:FB:40:00/36\tMC-monitoring SA\n00:50:C2:FB:50:00/36\tAssembly Contracts Limited\n00:50:C2:FB:60:00/36\tArgus-Spectrum\n00:50:C2:FB:70:00/36\tPounce Consulting\n00:50:C2:FB:80:00/36\tTechno Co.,Ltd.\n00:50:C2:FB:90:00/36\tCoral Telecom Ltd\n00:50:C2:FB:A0:00/36\tElbit Systems of America\n00:50:C2:FB:B0:00/36\tACIDA GmbH\n00:50:C2:FB:C0:00/36\tLeroy Somer\n00:50:C2:FB:D0:00/36\tEATON FHF Funke + Huster Fernsig GmbH\n00:50:C2:FB:E0:00/36\tsenTec Elektronik GmbH\n00:50:C2:FB:F0:00/36\tMylogic\n00:50:C2:FC:00:00/36\tRohde&Schwarz Topex SA\n00:50:C2:FC:10:00/36\tMotec Pty Ltd\n00:50:C2:FC:20:00/36\tElta\n00:50:C2:FC:30:00/36\tHSDC Sp. z o.o.\n00:50:C2:FC:40:00/36\tKyowadensi\n00:50:C2:FC:50:00/36\tSakura Seiki Co.,Ltd.\n00:50:C2:FC:60:00/36\tCritical Link LLC\n00:50:C2:FC:70:00/36\tSERCOM Regeltechniek\n00:50:C2:FC:80:00/36\tFar South Networks\n00:50:C2:FC:90:00/36\tMehta Tech, Inc.\n00:50:C2:FC:A0:00/36\tTelemisis Ltd\n00:50:C2:FC:B0:00/36\tPropagation Systems Limited\n00:50:C2:FC:C0:00/36\tSoudronic AG\n00:50:C2:FC:D0:00/36\tJinyoung Contech\n00:50:C2:FC:E0:00/36\tKoyo Electric\n00:50:C2:FC:F0:00/36\tDINTEK Shanghai Electronic Ltd\n00:50:C2:FD:00:00/36\tSimple Solutions\n00:50:C2:FD:10:00/36\tEnyx SA\n00:50:C2:FD:20:00/36\tAutonomic Controls. Inc\n00:50:C2:FD:30:00/36\tAster Electric Co.,Ltd.\n00:50:C2:FD:40:00/36\tInsitu, Inc\n00:50:C2:FD:50:00/36\tAmerican Microsystems, Ltd.\n00:50:C2:FD:60:00/36\tCity Computing Ltd\n00:50:C2:FD:70:00/36\tDEUTA-WERKE GmbH\n00:50:C2:FD:80:00/36\tEase Inc.\n00:50:C2:FD:90:00/36\tFigment Design Laboratories\n00:50:C2:FD:A0:00/36\tBucher Automation Budapest\n00:50:C2:FD:B0:00/36\tThe Security Center Inc\n00:50:C2:FD:C0:00/36\tQuercus Technologies, S.L.\n00:50:C2:FD:D0:00/36\tToptech Systems, Inc.\n00:50:C2:FD:E0:00/36\tPeek Traffic\n00:50:C2:FD:F0:00/36\tACD Elektronik GmbH\n00:50:C2:FE:00:00/36\tAzurtest\n00:50:C2:FE:10:00/36\tdotOcean\n00:50:C2:FE:20:00/36\tPulsotronic Anlagentechnik GmbH\n00:50:C2:FE:30:00/36\tPrivate\n00:50:C2:FE:40:00/36\tRTT Mobile Interpretation\n00:50:C2:FE:50:00/36\tScandiNova Systems\n00:50:C2:FE:60:00/36\tExibea AB\n00:50:C2:FE:70:00/36\tErhardt+Leimer GmbH\n00:50:C2:FE:80:00/36\tMango DSP, Inc.\n00:50:C2:FE:90:00/36\tMB connect line GmbH Fernwartungssysteme\n00:50:C2:FE:A0:00/36\tBrunel GmbH Section Communications\n00:50:C2:FE:B0:00/36\tAxible Technologies\n00:50:C2:FE:C0:00/36\tFirst System Technology Co., Ltd.\n00:50:C2:FE:D0:00/36\tLOGISOL Kft.\n00:50:C2:FE:E0:00/36\tSparks Instruments SA\n00:50:C2:FE:F0:00/36\tTask Sistemas de Computacao\n00:50:C2:FF:00:00/36\tGD Mission Systems\n00:50:C2:FF:10:00/36\tDiTEST Fahrzeugdiagnose GmbH\n00:50:C2:FF:20:00/36\tGlobalcom Engineering Srl\n00:50:C2:FF:30:00/36\tCONTROL SYSTEMS Srl\n00:50:C2:FF:40:00/36\tBurk Technology\n00:50:C2:FF:50:00/36\tFlexkom Internet Pazarlama Bilipim ve Eoitim Hiz.Inp.Mim.Muh.Oto.Enerji San. Tic. A.p.\n00:50:C2:FF:60:00/36\tBooyco Electronics\n00:50:C2:FF:70:00/36\tHuman Intech\n00:50:C2:FF:80:00/36\tKST technology\n00:50:C2:FF:90:00/36\tAVA Monitoring AB\n00:50:C2:FF:A0:00/36\tNupoint Systems Inc.\n00:50:C2:FF:B0:00/36\tSefram\n00:50:C2:FF:C0:00/36\tSpirent Communications\n00:50:C2:FF:D0:00/36\tTouchless Biometric Systems AG\n00:50:C2:FF:E0:00/36\tSensata Technologies\n00:50:C2:FF:F0:00/36\tMSR-Solutions GmbH\n00:50:C4\t\tImd\n00:50:C5\t\tADS Technologies, Inc\n00:50:C6\t\tLoop Telecommunication International, Inc.\n00:50:C7\t\tPrivate\n00:50:C8\t\tAddonics Technologies, Inc.\n00:50:C9\t\tMaspro Denkoh Corp.\n00:50:CA\t\tZhone Technologies, Inc.\n00:50:CB\t\tBucher Automation AG\n00:50:CC\t\tSeagate Cloud Systems Inc\n00:50:CD\t\tDigianswer A/S\n00:50:CE\t\tLg International Corp.\n00:50:CF\t\tVanlink Communication Technology Research Institute\n00:50:D0\t\tMinerva Systems\n00:50:D1\t\tCisco Systems, Inc\n00:50:D2\t\tCMC Electronics Inc\n00:50:D3\t\tDigital Audio Processing Pty. Ltd.\n00:50:D4\t\tJoohong Information &\n00:50:D5\t\tAd Systems Corp.\n00:50:D6\t\tAtlas Copco Tools Ab\n00:50:D7\t\tTelstrat\n00:50:D8\t\tUnicorn Computer Corp.\n00:50:D9\t\tENGETRON-ENGENHARIA ELETRONICA IND. e COM. LTDA\n00:50:DA\t\t3Com\n00:50:DB\t\tContemporary Control\n00:50:DC\t\tTas Telefonbau A. Schwabe Gmbh & Co. Kg\n00:50:DD\t\tSerra Soldadura, S.A.\n00:50:DE\t\tSignum Systems Corp.\n00:50:DF\t\tAirFiber, Inc.\n00:50:E1\t\tNs Tech Electronics Sdn Bhd\n00:50:E2\t\tCisco Systems, Inc\n00:50:E3\t\tCommscope\n00:50:E4\t\tApple, Inc.\n00:50:E6\t\tHakusan Corporation\n00:50:E7\t\tParadise Innovations (Asia)\n00:50:E8\t\tNomadix, Inc\n00:50:EA\t\tXel Communications, Inc.\n00:50:EB\t\tAlpha-Top Corporation\n00:50:EC\t\tOlicom A/S\n00:50:ED\t\tAnda Networks\n00:50:EE\t\tTek Digitel Corporation\n00:50:EF\t\tSPE Systemhaus GmbH\n00:50:F0\t\tCisco Systems, Inc\n00:50:F1\t\tMaxlinear, Inc\n00:50:F2\t\tMicrosoft Corp.\n00:50:F3\t\tGLOBAL NET INFORMATION CO., Ltd.\n00:50:F4\t\tSigmatek Gmbh & Co. Kg\n00:50:F6\t\tPan-International Industrial Corp.\n00:50:F7\t\tVenture Manufacturing (Singapore) Ltd.\n00:50:F8\t\tEntrega Technologies, Inc.\n00:50:F9\t\tSensormatic Electronics LLC\n00:50:FA\t\tOxtel, Ltd.\n00:50:FB\t\tVsk Electronics\n00:50:FC\t\tEdimax Technology Co. Ltd.\n00:50:FD\t\tVisioncomm Co., Ltd.\n00:50:FE\t\tPCTVnet ASA\n00:50:FF\t\tHakko Electronics Co., Ltd.\n00:51:ED\t\tLG Innotek\n00:52:18\t\tWuxi Keboda Electron Co.Ltd\n00:52:45\t\tGanatechwin\n00:52:C2\t\tpeiker acustic GmbH\n00:52:C8\t\tMade Studio Design Ltd.\n00:54:9F\t\tAvaya Inc\n00:54:AF\t\tContinental Automotive Systems Inc.\n00:54:BD\t\tSwelaser AB\n00:55:B1\t\tShanghai Baud Data Communication Co.,Ltd.\n00:55:DA\t\tIEEE Registration Authority\n00:55:DA:00:00:00/28\tShinko Technos co.,ltd.\n00:55:DA:10:00:00/28\tKoolPOS Inc.\n00:55:DA:20:00:00/28\tBeijing Connected Information Technology Co.,Ltd.\n00:55:DA:30:00:00/28\tNovexx Solutions GmbH\n00:55:DA:40:00:00/28\tDatapath Limited\n00:55:DA:50:00:00/28\tNanoleaf\n00:55:DA:60:00:00/28\tOoo \"Dekatron\"\n00:55:DA:70:00:00/28\tLucistechnologies（Shanghai）Co.,Ltd\n00:55:DA:80:00:00/28\tBroadSoft, Inc.\n00:55:DA:90:00:00/28\tQuantum Communication Technology Co., Ltd.,Anhui\n00:55:DA:A0:00:00/28\tSpeechlab\n00:55:DA:B0:00:00/28\tInteraxon Inc\n00:55:DA:C0:00:00/28\tDonguan WideLink Communication Technology Co.,Ltd.\n00:55:DA:D0:00:00/28\tArrow Electronics,Inc.\n00:55:DA:E0:00:00/28\tVictorsure Limited\n00:55:DA:F0:00:00/28\tPrivate\n00:56:2B\t\tCisco Systems, Inc\n00:56:6D\t\tHuawei Device Co., Ltd.\n00:56:CD\t\tApple, Inc.\n00:56:F1\t\tzte corporation\n00:57:C1\t\tLG Electronics (Mobile Communications)\n00:57:D2\t\tCisco Systems, Inc\n00:58:28\t\tAxon Networks Inc.\n00:58:3F\t\tPC Aquarius\n00:59:07\t\tLenovoEMC Products USA, LLC\n00:59:6C\t\tCisco Systems, Inc\n00:59:79\t\tNetworked Energy Services\n00:59:AC\t\tKpn. B.V.\n00:59:DC\t\tCisco Systems, Inc\n00:5A:13\t\tHuawei Technologies Co.,Ltd\n00:5A:39\t\tShenzhen Fast Technologies Co.,Ltd\n00:5B:94\t\tApple, Inc.\n00:5B:A1\t\tshanghai huayuan chuangxin software CO., LTD.\n00:5C:86\t\tShenzhen Fast Technologies Co.,Ltd\n00:5C:B1\t\tGospell DIGITAL TECHNOLOGY CO., LTD\n00:5C:C2\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\n00:5D:03\t\tXilinx, Inc\n00:5D:73\t\tCisco Systems, Inc\n00:5E:0C\t\tHMD Global Oy\n00:5F:67\t\tTP-Link Systems Inc\n00:5F:86\t\tCisco Systems, Inc\n00:5F:BF\t\tToshiba Corp.\n00:60:00\t\tXycom Inc.\n00:60:01\t\tInnoSys, Inc.\n00:60:02\t\tScreen Subtitling Systems, Ltd\n00:60:03\t\tTeraoka Weigh System Pte, Ltd.\n00:60:04\t\tComputadores Modulares Sa\n00:60:05\t\tTouchstar ATC Limited\n00:60:06\t\tSotec Co., Ltd\n00:60:07\t\tAcres Gaming, Inc.\n00:60:08\t\t3Com\n00:60:09\t\tCisco Systems, Inc\n00:60:0A\t\tSord Computer Corporation\n00:60:0B\t\tLOGWARE GmbH\n00:60:0C\t\tEurotech Inc.\n00:60:0D\t\tDigital Logic GmbH\n00:60:0E\t\tWavenet International, Inc.\n00:60:0F\t\tWestell Technologies Inc.\n00:60:10\t\tNetwork Machines, Inc.\n00:60:11\t\tCrystal Semiconductor Corp.\n00:60:12\t\tPower Computing Corporation\n00:60:13\t\tNetstal Maschinen Ag\n00:60:14\t\tEdec Co., Ltd.\n00:60:15\t\tNet2Net Corporation\n00:60:16\t\tClariion\n00:60:17\t\tTokimec Inc.\n00:60:18\t\tStellar One Corporation\n00:60:19\t\tRoche Diagnostics\n00:60:1A\t\tKeithley Instruments\n00:60:1B\t\tMesa Electronics\n00:60:1C\t\tTelxon Corporation\n00:60:1D\t\tLucent Technologies\n00:60:1E\t\tSoftlab, Inc.\n00:60:1F\t\tStallion Technologies\n00:60:20\t\tPivotal Networking, Inc.\n00:60:21\t\tDsc Corporation\n00:60:22\t\tVicom Systems, Inc.\n00:60:23\t\tPericom Semiconductor Corp.\n00:60:24\t\tGradient Technologies, Inc.\n00:60:25\t\tActive Imaging Plc\n00:60:26\t\tVIKING Modular Solutions\n00:60:27\t\tSuperior Modular Products\n00:60:28\t\tMacrovision Corporation\n00:60:29\t\tCary Peripherals Inc.\n00:60:2A\t\tSymicron Computer Communications, Ltd.\n00:60:2B\t\tPeak Audio\n00:60:2C\t\tLINX Data Terminals, Inc.\n00:60:2D\t\tAlerton Technologies, Inc.\n00:60:2E\t\tCyclades Corporation\n00:60:2F\t\tCisco Systems, Inc\n00:60:30\t\tVillage Tronic Entwicklung\n00:60:31\t\tHrk Systems\n00:60:32\t\tI-Cube, Inc.\n00:60:33\t\tAcuity Imaging, Inc.\n00:60:34\t\tROBERT BOSCH GmbH\n00:60:35\t\tDallas Semiconductor, Inc.\n00:60:36\t\tAIT Austrian Institute of Technology GmbH\n00:60:37\t\tNXP Semiconductors\n00:60:38\t\tNortel Networks\n00:60:39\t\tSanCom Technology, Inc.\n00:60:3A\t\tQuick Controls Ltd.\n00:60:3B\t\tAMTEC spa\n00:60:3C\t\tHagiwara Sys-Com Co., Ltd.\n00:60:3D\t\t3Cx\n00:60:3E\t\tCisco Systems, Inc\n00:60:3F\t\tPatapsco Designs\n00:60:40\t\tNetro Corp.\n00:60:41\t\tYokogawa Digital Computer Corporation\n00:60:42\t\tTks (Usa), Inc.\n00:60:43\t\tiDirect, INC.\n00:60:44\t\tLitton/Poly-Scientific\n00:60:45\t\tPathlight Technologies\n00:60:46\t\tVmetro, Inc.\n00:60:47\t\tCisco Systems, Inc\n00:60:48\t\tDell EMC\n00:60:49\t\tVina Technologies\n00:60:4A\t\tSaic Ideas Group\n00:60:4B\t\tSafe-com GmbH & Co. KG\n00:60:4C\t\tSagemcom Broadband SAS\n00:60:4D\t\tMmc Networks, Inc.\n00:60:4E\t\tCycle Computer Corporation, Inc.\n00:60:4F\t\tTattile SRL\n00:60:50\t\tInternix Inc.\n00:60:51\t\tQuality Semiconductor\n00:60:52\t\tPERIPHERALS ENTERPRISE CO., Ltd.\n00:60:53\t\tToyoda Machine Works, Ltd.\n00:60:54\t\tControlware Gmbh\n00:60:55\t\tCornell University\n00:60:56\t\tNetwork Tools, Inc.\n00:60:57\t\tMurata Manufacturing Co., Ltd.\n00:60:58\t\tCopper Mountain Communications, Inc.\n00:60:59\t\tTechnical Communications Corp.\n00:60:5A\t\tCelcore, Inc.\n00:60:5B\t\tIntraServer Technology, Inc.\n00:60:5C\t\tCisco Systems, Inc\n00:60:5D\t\tScanivalve Corp.\n00:60:5E\t\tLiberty Technology Networking\n00:60:5F\t\tNippon Unisoft Corporation\n00:60:60\t\tData Innovations North America\n00:60:61\t\tWhistle Communications Corp.\n00:60:62\t\tTelesync, Inc.\n00:60:63\t\tPsion Dacom Plc.\n00:60:64\t\tNetcomm Limited\n00:60:65\t\tB&R Industrial Automation GmbH\n00:60:66\t\tLACROIX Trafic\n00:60:67\t\tAcer Netxus Inc.\n00:60:68\t\tDialogic Corporation\n00:60:69\t\tBrocade Communications Systems LLC\n00:60:6A\t\tMitsubishi Wireless Communications. Inc.\n00:60:6B\t\tSynclayer Inc.\n00:60:6C\t\tArescom\n00:60:6D\t\tDigital Equipment Corp.\n00:60:6E\t\tDavicom Semiconductor, Inc.\n00:60:6F\t\tClarion Corporation Of America\n00:60:70\t\tCisco Systems, Inc\n00:60:71\t\tMidas Lab, Inc.\n00:60:72\t\tVxl Instruments, Limited\n00:60:73\t\tRedcreek Communications, Inc.\n00:60:74\t\tQsc Llc\n00:60:75\t\tPentek, Inc.\n00:60:76\t\tSchlumberger Technologies Retail Petroleum Systems\n00:60:77\t\tPrisa Networks\n00:60:78\t\tPower Measurement Ltd.\n00:60:79\t\tMainstream Data, Inc.\n00:60:7A\t\tDvs Gmbh\n00:60:7B\t\tFore Systems, Inc.\n00:60:7C\t\tWaveAccess, Ltd.\n00:60:7D\t\tSentient Networks Inc.\n00:60:7E\t\tGigalabs, Inc.\n00:60:7F\t\tAurora Technologies, Inc.\n00:60:80\t\tMicrotronix Datacom Ltd.\n00:60:81\t\tTv/Com International\n00:60:82\t\tNovalink Technologies, Inc.\n00:60:83\t\tCisco Systems, Inc\n00:60:84\t\tDigital Video\n00:60:85\t\tStorage Concepts\n00:60:86\t\tLogic Replacement Tech. Ltd.\n00:60:87\t\tKansai Electric Co., Ltd.\n00:60:88\t\tAnalog Devices, Inc.\n00:60:89\t\tXata\n00:60:8A\t\tCitadel Computer\n00:60:8B\t\tConferTech International\n00:60:8C\t\t3Com\n00:60:8D\t\tUnipulse Corp.\n00:60:8E\t\tHE ELECTRONICS, TECHNOLOGIE & SYSTEMTECHNIK GmbH\n00:60:8F\t\tTekram Technology Co., Ltd.\n00:60:90\t\tArtiza Networks Inc\n00:60:91\t\tFirst Pacific Networks, Inc.\n00:60:92\t\tMicro/Sys, Inc.\n00:60:93\t\tVarian\n00:60:94\t\tIBM Corp\n00:60:95\t\tAccu-Time Systems, Inc.\n00:60:96\t\tT.S. Microtech Inc.\n00:60:97\t\t3Com\n00:60:98\t\tHt Communications\n00:60:99\t\tSBE, Inc.\n00:60:9A\t\tNjk Techno Co.\n00:60:9B\t\tAstroNova, Inc\n00:60:9C\t\tPerkin-Elmer Incorporated\n00:60:9D\t\tPmi Food Equipment Group\n00:60:9E\t\tAsc X3 - Information Technology Standards Secretariats\n00:60:9F\t\tPhast Corporation\n00:60:A0\t\tSwitched Network Technologies, Inc.\n00:60:A1\t\tVPNet, Inc.\n00:60:A2\t\tNihon Unisys Limited Co.\n00:60:A3\t\tContinuum Technology Corp.\n00:60:A4\t\tGEW Technologies (PTY)Ltd\n00:60:A5\t\tPerformance Telecom Corp.\n00:60:A6\t\tParticle Measuring Systems\n00:60:A7\t\tMICROSENS GmbH & CO. KG\n00:60:A8\t\tTidomat Ab\n00:60:A9\t\tGesytec Mbh\n00:60:AA\t\tIntelligent Devices Inc. (Idi)\n00:60:AB\t\tLarscom Incorporated\n00:60:AC\t\tResilience Corporation\n00:60:AD\t\tMegaChips Corporation\n00:60:AE\t\tTrio Information Systems Ab\n00:60:AF\t\tPacific Micro Data, Inc.\n00:60:B0\t\tHewlett Packard\n00:60:B1\t\tInput/Output, Inc.\n00:60:B2\t\tProcess Control Corp.\n00:60:B3\t\tZ-Com, Inc.\n00:60:B4\t\tGlenayre R&D Inc.\n00:60:B5\t\tKEBA GmbH\n00:60:B6\t\tLand Computer Co., Ltd.\n00:60:B7\t\tChannelmatic, Inc.\n00:60:B8\t\tCORELIS Inc.\n00:60:B9\t\tNEC Platforms, Ltd\n00:60:BA\t\tSahara Networks, Inc.\n00:60:BB\t\tCabletron Systems, Inc.\n00:60:BC\t\tKeunYoung Electronics & Communication Co., Ltd.\n00:60:BD\t\tEnginuity Communications\n00:60:BE\t\tWebtronics\n00:60:BF\t\tMacraigor Systems, Inc.\n00:60:C0\t\tNera Networks AS\n00:60:C1\t\tWaveSpan Corporation\n00:60:C2\t\tMpl Ag\n00:60:C3\t\tNetvision Corporation\n00:60:C4\t\tSoliton Systems K.K.\n00:60:C5\t\tAncot Corp.\n00:60:C6\t\tDcs Ag\n00:60:C7\t\tAmati Communications Corp.\n00:60:C8\t\tKuka Welding Systems & Robots\n00:60:C9\t\tControlNet, Inc.\n00:60:CA\t\tHarmonic Systems Incorporated\n00:60:CB\t\tHitachi Zosen Corporation\n00:60:CC\t\tEmtrak, Incorporated\n00:60:CD\t\tVideoServer, Inc.\n00:60:CE\t\tAcclaim Communications\n00:60:CF\t\tAlteon Networks, Inc.\n00:60:D0\t\tSnmp Research Incorporated\n00:60:D1\t\tCascade Communications\n00:60:D2\t\tLucent Technologies Taiwan Telecommunications Co., Ltd.\n00:60:D3\t\tAt&T\n00:60:D4\t\tEldat Communication Ltd.\n00:60:D5\t\tAmada Co., Ltd\n00:60:D6\t\tNovAtel Inc.\n00:60:D7\t\tEcole Polytechnique Federale De Lausanne (Epfl)\n00:60:D8\t\tElmic Systems, Inc.\n00:60:D9\t\tTransys Networks Inc.\n00:60:DA\t\tRed Lion Controls, LP\n00:60:DB\t\tNtp Elektronik A/S\n00:60:DC\t\tNEC Magnus Communications,Ltd.\n00:60:DD\t\tMyricom, Inc.\n00:60:DE\t\tKayser-Threde GmbH\n00:60:DF\t\tBrocade Communications Systems LLC\n00:60:E0\t\tAxiom Technology Co., Ltd.\n00:60:E1\t\tOrckit Communications Ltd.\n00:60:E2\t\tQuest Engineering & Development\n00:60:E3\t\tArbin Instruments\n00:60:E4\t\tCompuserve, Inc.\n00:60:E5\t\tFuji Automation Co., Ltd.\n00:60:E6\t\tShomiti Systems Incorporated\n00:60:E7\t\tRandata\n00:60:E8\t\tHitachi Computer Products (America), Inc.\n00:60:E9\t\tAtop Technologies, Inc.\n00:60:EA\t\tStreamLogic\n00:60:EB\t\tFourthtrack Systems\n00:60:EC\t\tHermary Opto Electronics Inc.\n00:60:ED\t\tRicardo Test Automation Ltd.\n00:60:EE\t\tApollo\n00:60:EF\t\tFlytech Technology Co., Ltd.\n00:60:F0\t\tJohnson & Johnson Medical, Inc\n00:60:F1\t\tExp Computer, Inc.\n00:60:F2\t\tLasergraphics, Inc.\n00:60:F3\t\tPerformance Analysis Broadband, Spirent plc\n00:60:F4\t\tADVANCED COMPUTER SOLUTIONS, Inc.\n00:60:F5\t\tIcon West, Inc.\n00:60:F6\t\tNextest Communications Products, Inc.\n00:60:F7\t\tDatafusion Systems\n00:60:F8\t\tLoran International Technologies Inc.\n00:60:F9\t\tDiamond Lane Communications\n00:60:FA\t\tEducational Technology Resources, Inc.\n00:60:FB\t\tPacketeer, Inc.\n00:60:FC\t\tConservation Through Innovation Ltd.\n00:60:FD\t\tNetICs, Inc.\n00:60:FE\t\tLynx System Developers, Inc.\n00:60:FF\t\tQuVis, Inc.\n00:61:51\t\tHuawei Technologies Co.,Ltd\n00:61:71\t\tApple, Inc.\n00:62:01\t\tMotorola Mobility LLC, a Lenovo Company\n00:62:0B\t\tBroadcom Limited\n00:62:EC\t\tCisco Systems, Inc\n00:63:DE\t\tCloudwalk Technology Co.,Ltd\n00:64:40\t\tCisco Systems, Inc\n00:64:A6\t\tMaquet CardioVascular\n00:64:AF\t\tDish Technologies Corp\n00:65:1E\t\tAmcrest Technologies\n00:66:19\t\tHuawei Device Co., Ltd.\n00:66:4B\t\tHuawei Technologies Co.,Ltd\n00:67:62\t\tFiberhome Telecommunication Technologies Co.,LTD\n00:68:2B\t\tHuawei Device Co., Ltd.\n00:68:EB\t\tHP Inc.\n00:69:2D\t\tSunnovo International Limited\n00:69:67\t\tIEEE Registration Authority\n00:69:67:00:00:00/28\tAnnapurna labs\n00:69:67:10:00:00/28\tmiliwave\n00:69:67:20:00:00/28\tNingbo Shen Link Communication Technology Co.,Ltd\n00:69:67:30:00:00/28\tSuzhou Radiant Lighting Technology Co.,Ltd\n00:69:67:40:00:00/28\tCommand Alkon, Inc\n00:69:67:50:00:00/28\tShenzhen Xiao Bi En Culture Education Technology Co.,Ltd.\n00:69:67:60:00:00/28\tComcast-SRL\n00:69:67:70:00:00/28\tPangaea Solution Inc\n00:69:67:80:00:00/28\tAmbient-System sp. z o.o.\n00:69:67:90:00:00/28\tHangzhou Wise IOT Technology Co.,Ltd\n00:69:67:A0:00:00/28\tZhejiang Holip Electronic Technology Co.,Ltd\n00:69:67:B0:00:00/28\tDatapan d.o.o.\n00:69:67:C0:00:00/28\tDesird Design R&D\n00:69:67:D0:00:00/28\taversix\n00:69:67:E0:00:00/28\tTianjin Lianwu Technology Co., Ltd.\n00:6A:5E\t\tIEEE Registration Authority\n00:6A:5E:00:00:00/28\tTruly Electronics Mfg.,Ltd\n00:6A:5E:10:00:00/28\tBroadMaster Biotech Corp\n00:6A:5E:20:00:00/28\tCreative Communication\n00:6A:5E:30:00:00/28\tShenzhen yeahmoo Technology Co., Ltd.\n00:6A:5E:40:00:00/28\tEvercomm (Pty) Ltd\n00:6A:5E:50:00:00/28\tRayneo (wuxi) ltd\n00:6A:5E:60:00:00/28\tShenzhen Lightx Technology Co., Ltd\n00:6A:5E:70:00:00/28\tJiangsu Alstom NUG Propulsion System Co., Ltd\n00:6A:5E:80:00:00/28\tHilti Corporation\n00:6A:5E:90:00:00/28\tAnnapurna labs\n00:6A:5E:A0:00:00/28\tAnnapurna labs\n00:6A:5E:B0:00:00/28\tContinental Brasil Indústria Automotiva Ltda.\n00:6A:5E:C0:00:00/28\tCybertel Bridge\n00:6A:5E:D0:00:00/28\tBeijing Lingji Innovations technology Co,LTD.\n00:6A:5E:E0:00:00/28\tOppermann Regelgeräte GmbH\n00:6B:6F\t\tHuawei Technologies Co.,Ltd\n00:6B:8E\t\tShanghai Feixun Communication Co.,Ltd.\n00:6B:9E\t\tVizio, Inc\n00:6B:A0\t\tShenzhen Universal Intellisys Pte Ltd\n00:6B:F1\t\tCisco Systems, Inc\n00:6C:BC\t\tCisco Systems, Inc\n00:6C:FD\t\tSichuan Changhong Electric Ltd.\n00:6D:52\t\tApple, Inc.\n00:6D:61\t\tGuangzhou V-SOLUTION Electronic Technology Co., Ltd.\n00:6D:FB\t\tVutrix Technologies Ltd\n00:6E:02\t\tXovis AG\n00:6F:64\t\tSamsung Electronics Co.,Ltd\n00:6F:F2\t\tMitsumi Electric Co.,Ltd.\n00:70:07\t\tEspressif Inc.\n00:70:B0\t\tM/A-Com Inc. Companies\n00:70:B3\t\tData Recall Ltd.\n00:71:47\t\tAmazon Technologies Inc.\n00:71:C2\t\tPegatron Corporation\n00:71:CC\t\tHon Hai Precision Ind. Co.,Ltd.\n00:72:04\t\tSamsung Electronics Co., Ltd. ARTIK\n00:72:63\t\tNetis Technology Co., Ltd.\n00:72:78\t\tCisco Systems, Inc\n00:72:EE\t\tIntel Corporate\n00:73:8D\t\tShenzhen TINNO Mobile Technology Corp.\n00:73:E0\t\tSamsung Electronics Co.,Ltd\n00:74:9C\t\tRuijie Networks Co.,LTD\n00:75:32\t\tIntegrated Engineering BV\n00:75:E1\t\tAmpt, LLC\n00:76:3D\t\tVeea\n00:76:86\t\tCisco Systems, Inc\n00:76:B1\t\tSomfy-Protect By Myfox SAS\n00:77:8D\t\tCisco Systems, Inc\n00:77:E4\t\tNokia Solutions and Networks GmbH & Co. KG\n00:78:39\t\tNokia\n00:78:88\t\tCisco Systems, Inc\n00:78:9E\t\tSagemcom Broadband SAS\n00:78:CD\t\tIgnition Design Labs\n00:7B:18\t\tSENTRY Co., LTD.\n00:7C:2D\t\tSamsung Electronics Co.,Ltd\n00:7D:3B\t\tSamsung Electronics Co.,Ltd\n00:7D:60\t\tApple, Inc.\n00:7D:FA\t\tVolkswagen Group of America\n00:7E:56\t\tChina Dragon Technology Limited\n00:7E:95\t\tCisco Systems, Inc\n00:7F:28\t\tActiontec Electronics, Inc\n00:80:00\t\tMultitech Systems, Inc.\n00:80:01\t\tPeriphonics Corporation\n00:80:02\t\tSatelcom (Uk) Ltd\n00:80:03\t\tHytec Electronics Ltd.\n00:80:04\t\tAntlow Communications, Ltd.\n00:80:05\t\tCactus Computer Inc.\n00:80:06\t\tCompuadd Corporation\n00:80:07\t\tDlog Nc-Systeme\n00:80:08\t\tDynatech Computer Systems\n00:80:09\t\tJupiter Systems, Inc.\n00:80:0A\t\tJapan Computer Corp.\n00:80:0B\t\tCsk Corporation\n00:80:0C\t\tVidecom Limited\n00:80:0D\t\tVosswinkel F.U.\n00:80:0E\t\tAtlantix Corporation\n00:80:0F\t\tStandard Microsystems\n00:80:10\t\tCommodore International\n00:80:11\t\tDigital Systems Int'L. Inc.\n00:80:12\t\tIntegrated Measurement Systems\n00:80:13\t\tThomas-Conrad Corporation\n00:80:14\t\tEsprit Systems\n00:80:15\t\tSeiko Systems, Inc.\n00:80:16\t\tWandel And Goltermann\n00:80:17\t\tPfu Limited\n00:80:18\t\tKobe Steel, Ltd.\n00:80:19\t\tDayna Communications, Inc.\n00:80:1A\t\tBell Atlantic\n00:80:1B\t\tKodiak Technology\n00:80:1C\t\tNewport Systems Solutions\n00:80:1D\t\tIntegrated Inference Machines\n00:80:1E\t\tXinetron, Inc.\n00:80:1F\t\tKrupp Atlas Electronik Gmbh\n00:80:20\t\tNetwork Products\n00:80:21\t\tAlcatel Canada Inc.\n00:80:22\t\tScan-Optics\n00:80:23\t\tIntegrated Business Networks\n00:80:24\t\tKalpana, Inc.\n00:80:25\t\tTelit Wireless Solutions GmbH\n00:80:26\t\tNetwork Products Corporation\n00:80:27\t\tAdaptive Systems, Inc.\n00:80:28\t\tTradpost (Hk) Ltd\n00:80:29\t\tEagle Technology, Inc.\n00:80:2A\t\tTest Systems & Simulations Inc\n00:80:2B\t\tIntegrated Marketing Co\n00:80:2C\t\tThe Sage Group Plc\n00:80:2D\t\tXylogics Inc\n00:80:2E\t\tCastle Rock Computing\n00:80:2F\t\tNational Instruments Corp.\n00:80:30\t\tNexus Electronics\n00:80:31\t\tBasys, Corp.\n00:80:32\t\tAccess Co., Ltd.\n00:80:33\t\tEMS Aviation, Inc.\n00:80:34\t\tSmt Goupil\n00:80:35\t\tTechnology Works, Inc.\n00:80:36\t\tReflex Manufacturing Systems\n00:80:37\t\tEricsson Group\n00:80:38\t\tData Research & Applications\n00:80:39\t\tAlcatel Stc Australia\n00:80:3A\t\tVarityper, Inc.\n00:80:3B\t\tApt Communications, Inc.\n00:80:3C\t\tTvs Electronics Ltd\n00:80:3D\t\tSurigiken Co.,  Ltd.\n00:80:3E\t\tSynernetics\n00:80:3F\t\tTatung Company\n00:80:40\t\tJohn Fluke Manufacturing Co.\n00:80:41\t\tVeb Kombinat Robotron\n00:80:42\t\tArtesyn Embedded Technologies\n00:80:43\t\tNetworld, Inc.\n00:80:44\t\tSystech Computer Corp.\n00:80:45\t\tMatsushita Electric Ind. Co\n00:80:46\t\tTattile SRL\n00:80:47\t\tIn-Net Corp.\n00:80:48\t\tCompex Incorporated\n00:80:49\t\tNissin Electric Co., Ltd.\n00:80:4A\t\tPro-Log\n00:80:4B\t\tEagle Technologies Pty.Ltd.\n00:80:4C\t\tContec Co., Ltd.\n00:80:4D\t\tCyclone Microsystems, Inc.\n00:80:4E\t\tApex Computer Company\n00:80:4F\t\tDaikin Industries, Ltd.\n00:80:50\t\tZiatech Corporation\n00:80:51\t\tFibermux\n00:80:52\t\tTechnically Elite Concepts\n00:80:53\t\tIntellicom, Inc.\n00:80:54\t\tFrontier Technologies Corp.\n00:80:55\t\tFermilab\n00:80:56\t\tSPHINX Electronics GmbH & Co KG\n00:80:57\t\tAdsoft, Ltd.\n00:80:58\t\tPrinter Systems Corp.\n00:80:59\t\tStanley Electric Co., Ltd\n00:80:5A\t\tTulip Computers Internat'L B.V\n00:80:5B\t\tCondor Systems, Inc.\n00:80:5C\t\tAgilis Corporation\n00:80:5D\t\tCanstar\n00:80:5E\t\tLsi Logic Corporation\n00:80:5F\t\tHewlett Packard\n00:80:60\t\tNetwork Interface Corporation\n00:80:61\t\tLitton Systems, Inc.\n00:80:62\t\tInterface  Co.\n00:80:63\t\tHirschmann Automation and Control GmbH\n00:80:64\t\tWyse Technology Llc\n00:80:65\t\tCybergraphic Systems Pty Ltd.\n00:80:66\t\tEurotech S.p.A.\n00:80:67\t\tSquare D Company\n00:80:68\t\tYamatech Scientific Ltd.\n00:80:69\t\tComputone Systems\n00:80:6A\t\tEri (Empac Research Inc.)\n00:80:6B\t\tSchmid Telecommunication\n00:80:6C\t\tSecure Systems & Services\n00:80:6D\t\tCentury Systems Corp.\n00:80:6E\t\tNippon Steel Corporation\n00:80:6F\t\tOnelan Ltd.\n00:80:70\t\tComputadoras Micron\n00:80:71\t\tSai Technology\n00:80:72\t\tMicroplex Systems Ltd.\n00:80:73\t\tDwb Associates\n00:80:74\t\tFisher Controls\n00:80:75\t\tParsytec Gmbh\n00:80:76\t\tMcnc\n00:80:77\t\tBrother industries, LTD.\n00:80:78\t\tPractical Peripherals, Inc.\n00:80:79\t\tMicrobus Designs Ltd.\n00:80:7A\t\tAitech Systems Ltd.\n00:80:7B\t\tArtel Communications Corp.\n00:80:7C\t\tFibercom, Inc.\n00:80:7D\t\tEquinox Systems Inc.\n00:80:7E\t\tSouthern Pacific Ltd.\n00:80:7F\t\tDy-4 Incorporated\n00:80:80\t\tDatamedia Corporation\n00:80:81\t\tKendall Square Research Corp.\n00:80:82\t\tPep Modular Computers Gmbh\n00:80:83\t\tAmdahl\n00:80:84\t\tThe Cloud Inc.\n00:80:85\t\tH-Three Systems Corporation\n00:80:86\t\tComputer Generation Inc.\n00:80:87\t\tOki Electric Industry Co., Ltd\n00:80:88\t\tVictor Company Of Japan, Ltd.\n00:80:89\t\tTecnetics (Pty) Ltd.\n00:80:8A\t\tSummit Microsystems Corp.\n00:80:8B\t\tDacoll Limited\n00:80:8C\t\tNetscout Systems Inc\n00:80:8D\t\tWestcoast Technology B.V.\n00:80:8E\t\tRadstone Technology\n00:80:8F\t\tC. Itoh Electronics, Inc.\n00:80:90\t\tMicrotek International, Inc.\n00:80:91\t\tTokyo Electric Co.,Ltd\n00:80:92\t\tSilex Technology, Inc.\n00:80:93\t\tXyron Corporation\n00:80:94\t\tAlfa Laval Automation Ab\n00:80:95\t\tBasic Merton Handelsges.M.B.H.\n00:80:96\t\tHuman Designed Systems, Inc.\n00:80:97\t\tCentralp Automatismes\n00:80:98\t\tTdk Corporation\n00:80:99\t\tEaton Industries GmbH\n00:80:9A\t\tNovus Networks Ltd\n00:80:9B\t\tJustsystem Corporation\n00:80:9C\t\tLuxcom, Inc.\n00:80:9D\t\tCommscraft Ltd.\n00:80:9E\t\tDatus Gmbh\n00:80:9F\t\tALE International\n00:80:A0\t\tHewlett Packard\n00:80:A1\t\tMicrotest, Inc.\n00:80:A2\t\tCreative Electronic Systems\n00:80:A3\t\tLantronix\n00:80:A4\t\tLiberty Electronics\n00:80:A5\t\tSpeed International\n00:80:A6\t\tRepublic Technology, Inc.\n00:80:A7\t\tHoneywell International Inc\n00:80:A8\t\tVitacom Corporation\n00:80:A9\t\tClearpoint Research\n00:80:AA\t\tMaxpeed\n00:80:AB\t\tDukane Network Integration\n00:80:AC\t\tImlogix, Division Of Genesys\n00:80:AD\t\tCnet Technology, Inc.\n00:80:AE\t\tHughes Network Systems\n00:80:AF\t\tAllumer Co., Ltd.\n00:80:B0\t\tAdvanced Information\n00:80:B1\t\tSoftcom A/S\n00:80:B2\t\tNetwork Equipment Technologies\n00:80:B3\t\tAval Data Corporation\n00:80:B4\t\tSophia Systems\n00:80:B5\t\tUnited Networks Inc.\n00:80:B6\t\tMercury Systems – Trusted Mission Solutions, Inc.\n00:80:B7\t\tStellar Computer\n00:80:B8\t\tDMG MORI Digital Co., LTD\n00:80:B9\t\tArche Technoligies Inc.\n00:80:BA\t\tSpecialix (Asia) Pte, Ltd\n00:80:BB\t\tHughes Lan Systems\n00:80:BC\t\tHitachi Engineering Co., Ltd\n00:80:BD\t\tThe Furukawa Electric Co., Ltd\n00:80:BE\t\tAries Research\n00:80:BF\t\tTakaoka Electric Mfg. Co. Ltd.\n00:80:C0\t\tPenril Datacomm\n00:80:C1\t\tLanex Corporation\n00:80:C2\t\tIEEE 802.1 Chair\n00:80:C3\t\tBicc Information Systems & Svc\n00:80:C4\t\tDocument Technologies, Inc.\n00:80:C5\t\tNovellco De Mexico\n00:80:C6\t\tNational Datacomm Corporation\n00:80:C7\t\tXircom\n00:80:C8\t\tD-Link Systems, Inc.\n00:80:C9\t\tAlberta Microelectronic Centre\n00:80:CA\t\tNetcom Research Incorporated\n00:80:CB\t\tFalco Data Products\n00:80:CC\t\tMicrowave Bypass Systems\n00:80:CD\t\tMicronics Computer, Inc.\n00:80:CE\t\tBroadcast Television Systems\n00:80:CF\t\tEmbedded Performance Inc.\n00:80:D0\t\tComputer Peripherals, Inc.\n00:80:D1\t\tKimtron Corporation\n00:80:D2\t\tShinnihondenko Co., Ltd.\n00:80:D3\t\tShiva Corp.\n00:80:D4\t\tChase Research Ltd.\n00:80:D5\t\tCadre Technologies\n00:80:D6\t\tNuvotech, Inc.\n00:80:D7\t\tFantum Engineering\n00:80:D8\t\tNetwork Peripherals Inc.\n00:80:D9\t\tEMK Elektronik GmbH & Co. KG\n00:80:DA\t\tHottinger Brüel & Kjær A/S\n00:80:DB\t\tGraphon Corporation\n00:80:DC\t\tPicker International\n00:80:DD\t\tGmx Inc/Gimix\n00:80:DE\t\tGipsi S.A.\n00:80:DF\t\tAdc Codenoll Technology Corp.\n00:80:E0\t\tXtp Systems, Inc.\n00:80:E1\t\tSTMicroelectronics SRL\n00:80:E2\t\tT.D.I. Co., Ltd.\n00:80:E3\t\tCoral Network Corporation\n00:80:E4\t\tNorthwest Digital Systems, Inc\n00:80:E5\t\tNetApp\n00:80:E6\t\tPeer Networks, Inc.\n00:80:E7\t\tLeonardo UK Ltd\n00:80:E8\t\tCumulus Corporatiion\n00:80:E9\t\tMadge Ltd.\n00:80:EA\t\tADVA Optical Networking Ltd.\n00:80:EB\t\tCompcontrol B.V.\n00:80:EC\t\tSupercomputing Solutions, Inc.\n00:80:ED\t\tIq Technologies, Inc.\n00:80:EE\t\tThomson Csf\n00:80:EF\t\tRational\n00:80:F0\t\tPanasonic Communications Co., Ltd.\n00:80:F1\t\tOpus Systems\n00:80:F2\t\tRaycom Systems Inc\n00:80:F3\t\tSun Electronics Corp.\n00:80:F4\t\tTelemecanique Electrique\n00:80:F5\t\tQuantel Ltd\n00:80:F6\t\tSynergy Microsystems\n00:80:F7\t\tZenith Electronics Corporation\n00:80:F8\t\tMizar, Inc.\n00:80:F9\t\tHeurikon Corporation\n00:80:FA\t\tRwt Gmbh\n00:80:FB\t\tBvm Limited\n00:80:FC\t\tAvatar Corporation\n00:80:FD\t\tExsceed Corpration\n00:80:FE\t\tAzure Technologies, Inc.\n00:80:FF\t\tSoc. De Teleinformatique Rtc\n00:81:2A\t\tApple, Inc.\n00:81:C4\t\tCisco Systems, Inc\n00:81:F9\t\tTexas Instruments\n00:83:20\t\tHuawei Device Co., Ltd.\n00:84:1E\t\tCisco Meraki\n00:84:97\t\tShenzhen MiaoMing Intelligent Technology Co.,Ltd\n00:84:ED\t\tLexmark International, Inc.\n00:86:21\t\tAmazon Technologies Inc.\n00:86:67\t\tLG Innotek\n00:86:9C\t\tPalo Alto Networks\n00:86:A0\t\tPrivate\n00:87:01\t\tSamsung Electronics Co.,Ltd\n00:87:31\t\tCisco Systems, Inc\n00:87:64\t\tCisco Systems, Inc\n00:88:65\t\tApple, Inc.\n00:88:BA\t\tNc&C\n00:8A:55\t\tHuawei Device Co., Ltd.\n00:8A:76\t\tApple, Inc.\n00:8A:96\t\tCisco Systems, Inc\n00:8B:43\t\tRftech\n00:8B:FC\t\tmixi,Inc.\n00:8C:10\t\tBlack Box Corp.\n00:8C:54\t\tADB Broadband Italia\n00:8C:FA\t\tInventec Corporation\n00:8D:4E\t\tCjsc Nii Stt\n00:8D:DA\t\tLink One Co., Ltd.\n00:8D:F4\t\tIEEE Registration Authority\n00:8D:F4:00:00:00/28\tSensata Technologies\n00:8D:F4:10:00:00/28\tBeijing Infinitesensing Technology Co.,Ltd\n00:8D:F4:20:00:00/28\tSymetrics Industries d.b.a. Extant Aerospace\n00:8D:F4:30:00:00/28\tAlgodue Elettronica Srl\n00:8D:F4:40:00:00/28\tEnergy Team S.p.A.\n00:8D:F4:50:00:00/28\tSchneider Electric\n00:8D:F4:60:00:00/28\tAnnapurna labs\n00:8D:F4:70:00:00/28\tHimsa\n00:8D:F4:80:00:00/28\tEra Toys Limited\n00:8D:F4:90:00:00/28\tRelay, Inc.\n00:8D:F4:A0:00:00/28\tAdel System srl\n00:8D:F4:B0:00:00/28\tGuangzhou Legendview Electronic Technology Co.,Ltd\n00:8D:F4:C0:00:00/28\tCreative Security Technology Inc.\n00:8D:F4:D0:00:00/28\tId Tech Solutions Pvt Ltd\n00:8D:F4:E0:00:00/28\tRelay, Inc.\n00:8E:73\t\tCisco Systems, Inc\n00:8E:F2\t\tNetgear\n00:90:00\t\tDiamond Multimedia\n00:90:01\t\tNishimu Electronics Industries Co., Ltd.\n00:90:02\t\tAllgon Ab\n00:90:03\t\tAplio\n00:90:04\t\t3Com Europe Ltd\n00:90:05\t\tProtech Systems Co., Ltd.\n00:90:06\t\tHamamatsu Photonics K.K.\n00:90:07\t\tDomex Technology Corp.\n00:90:08\t\tHanA Systems Inc.\n00:90:09\t\tI Controls, Inc.\n00:90:0A\t\tProton Electronic Industrial Co., Ltd.\n00:90:0B\t\tLanner Electronics, Inc.\n00:90:0C\t\tCisco Systems, Inc\n00:90:0D\t\tOverland Storage Inc.\n00:90:0E\t\tHandlink Technologies, Inc.\n00:90:0F\t\tKawasaki Heavy Industries, Ltd\n00:90:10\t\tSimulation Laboratories, Inc.\n00:90:11\t\tWAVTrace, Inc.\n00:90:12\t\tGlobespan Semiconductor, Inc.\n00:90:13\t\tSamsan Corp.\n00:90:14\t\tRotork Instruments, Ltd.\n00:90:15\t\tCentigram Communications Corp.\n00:90:16\t\tZac\n00:90:17\t\tZypcom, Inc\n00:90:18\t\tIto Electric Industry Co, Ltd.\n00:90:19\t\tHermes Electronics Co., Ltd.\n00:90:1A\t\tUnisphere Solutions\n00:90:1B\t\tDigital Controls\n00:90:1C\t\tmps Software Gmbh\n00:90:1D\t\tPec (Nz) Ltd.\n00:90:1E\t\tSelesta Ingegneria S.p.A.\n00:90:1F\t\tAdtec Productions, Inc.\n00:90:20\t\tPhilips Analytical X-Ray B.V.\n00:90:21\t\tCisco Systems, Inc\n00:90:22\t\tIvex\n00:90:23\t\tZilog Inc.\n00:90:24\t\tPipelinks, Inc.\n00:90:25\t\tBAE Systems Australia (Electronic Systems) Pty Ltd\n00:90:26\t\tAdvanced Switching Communications, Inc.\n00:90:27\t\tIntel Corporation\n00:90:28\t\tNippon Signal Co., Ltd.\n00:90:29\t\tCrypto Ag\n00:90:2A\t\tCommunication Devices, Inc.\n00:90:2B\t\tCisco Systems, Inc\n00:90:2C\t\tData & Control Equipment Ltd.\n00:90:2D\t\tData Electronics (Aust.) Pty, Ltd.\n00:90:2E\t\tNamco Limited\n00:90:2F\t\tNetcore Systems, Inc.\n00:90:30\t\tHoneywell-Dating\n00:90:31\t\tMysticom, Ltd.\n00:90:32\t\tPelcombe Group Ltd.\n00:90:33\t\tInnovaphone Ag\n00:90:34\t\tImagic, Inc.\n00:90:35\t\tAlpha Telecom, Inc.\n00:90:36\t\tens, inc.\n00:90:37\t\tAcucomm, Inc.\n00:90:38\t\tFountain Technologies, Inc.\n00:90:39\t\tShasta Networks\n00:90:3A\t\tNihon Media Tool Inc.\n00:90:3B\t\tTriEMS Research Lab, Inc.\n00:90:3C\t\tAtlantic Network Systems\n00:90:3D\t\tBiopac Systems, Inc.\n00:90:3E\t\tN.V. Philips Industrial Activities\n00:90:3F\t\tWorldCast Systems\n00:90:40\t\tSiemens Network Convergence LLC\n00:90:41\t\tApplied Digital Access\n00:90:42\t\tECCS, Inc.\n00:90:43\t\tTattile SRL\n00:90:44\t\tAssured Digital, Inc.\n00:90:45\t\tMarconi Communications\n00:90:46\t\tDexdyne, Ltd.\n00:90:47\t\tGiga Fast E. Ltd.\n00:90:48\t\tZeal Corporation\n00:90:49\t\tEntridia Corporation\n00:90:4A\t\tConcur System Technologies\n00:90:4B\t\tGemtek Technology Co., Ltd.\n00:90:4C\t\tEpigram, Inc.\n00:90:4D\t\tSpec S.A.\n00:90:4E\t\tDelem Bv\n00:90:4F\t\tAbb Power T&D Company, Inc.\n00:90:50\t\tTeleste Corporation\n00:90:51\t\tUltimate Technology Corp.\n00:90:52\t\tSelcom Elettronica S.R.L.\n00:90:53\t\tDaewoo Electronics Co., Ltd.\n00:90:54\t\tInnovative Semiconductors, Inc\n00:90:55\t\tParker Hannifin Corporation Compumotor Division\n00:90:56\t\tTelestream, Inc.\n00:90:57\t\tAANetcom, Inc.\n00:90:58\t\tUltra Electronics Command & Control Systems\n00:90:59\t\tTelecom Device K.K.\n00:90:5A\t\tDearborn Group, Inc.\n00:90:5B\t\tRaymond And Lae Engineering\n00:90:5C\t\tEdmi\n00:90:5D\t\tNetcom Sicherheitstechnik Gmbh\n00:90:5E\t\tRauland-Borg Corporation\n00:90:5F\t\tCisco Systems, Inc\n00:90:60\t\tSystem Create Corp.\n00:90:61\t\tPacific Research & Engineering Corporation\n00:90:62\t\tICP VORTEX COMPUTERSYSTEME GmbH\n00:90:63\t\tCoherent Communications Systems Corporation\n00:90:64\t\tThomson Inc.\n00:90:65\t\tFinisar Corporation\n00:90:66\t\tTroika Networks, Inc.\n00:90:67\t\tWalkAbout Computers, Inc.\n00:90:68\t\tDvt Corp.\n00:90:69\t\tJuniper Networks\n00:90:6A\t\tTurnstone Systems, Inc.\n00:90:6B\t\tApplied Resources, Inc.\n00:90:6C\t\tSartorius Hamburg GmbH\n00:90:6D\t\tCisco Systems, Inc\n00:90:6E\t\tPraxon, Inc.\n00:90:6F\t\tCisco Systems, Inc\n00:90:70\t\tNeo Networks, Inc.\n00:90:71\t\tApplied Innovation Inc.\n00:90:72\t\tSimrad As\n00:90:73\t\tGaio Technology\n00:90:74\t\tArgon Networks, Inc.\n00:90:75\t\tNec Do Brasil S.A.\n00:90:76\t\tFmt Aircraft Gate Support Systems Ab\n00:90:77\t\tAdvanced Fibre Communications\n00:90:78\t\tMer Telemanagement Solutions, Ltd.\n00:90:79\t\tClearOne, Inc.\n00:90:7A\t\tSpectralink, Inc\n00:90:7B\t\tE-Tech, Inc.\n00:90:7C\t\tDigitalcast, Inc.\n00:90:7D\t\tLake Communications\n00:90:7E\t\tVetronix Corp.\n00:90:7F\t\tWatchGuard Technologies, Inc.\n00:90:80\t\tNot Limited, Inc.\n00:90:81\t\tAloha Networks, Inc.\n00:90:82\t\tForce Institute\n00:90:83\t\tTurbo Communication, Inc.\n00:90:84\t\tAtech System\n00:90:85\t\tGolden Enterprises, Inc.\n00:90:86\t\tCisco Systems, Inc\n00:90:87\t\tItis\n00:90:88\t\tBaxall Security Ltd.\n00:90:89\t\tSoftcom Microsystems, Inc.\n00:90:8A\t\tBayly Communications, Inc.\n00:90:8B\t\tTattile SRL\n00:90:8C\t\tEtrend Electronics, Inc.\n00:90:8D\t\tVickers Electronics Systems\n00:90:8E\t\tNortel Networks Broadband Access\n00:90:8F\t\tAudio Codes Ltd.\n00:90:90\t\tI-Bus\n00:90:91\t\tDigitalScape, Inc.\n00:90:92\t\tCisco Systems, Inc\n00:90:93\t\tEIZO Corporation\n00:90:94\t\tOsprey Technologies, Inc.\n00:90:95\t\tUniversal Avionics\n00:90:96\t\tAskey Computer Corp\n00:90:97\t\tSycamore Networks\n00:90:98\t\tSbc Designs, Inc.\n00:90:99\t\tAllied Telesis, K.K.\n00:90:9A\t\tOne World Systems, Inc.\n00:90:9B\t\tMarkem-Imaje\n00:90:9C\t\tCommscope\n00:90:9D\t\tNovaTech, LLC\n00:90:9E\t\tCritical IO, LLC\n00:90:9F\t\tDigi-Data Corporation\n00:90:A0\t\t8X8 Inc.\n00:90:A1\t\tFlying Pig Systems/High End Systems Inc.\n00:90:A2\t\tCyberTAN Technology Inc.\n00:90:A3\t\tCorecess Inc.\n00:90:A4\t\tAltiga Networks\n00:90:A5\t\tSpectra Logic\n00:90:A6\t\tCisco Systems, Inc\n00:90:A7\t\tClientec Corporation\n00:90:A8\t\tNineTiles Networks, Ltd.\n00:90:A9\t\tWestern Digital\n00:90:AA\t\tIndigo Active Vision Systems Limited\n00:90:AB\t\tCisco Systems, Inc\n00:90:AC\t\tOptivision, Inc.\n00:90:AD\t\tAspect Electronics, Inc.\n00:90:AE\t\tITALTEL S.p.A/RF-UP-I\n00:90:AF\t\tJ. Morita Mfg. Corp.\n00:90:B0\t\tVadem\n00:90:B1\t\tCisco Systems, Inc\n00:90:B2\t\tAvici Systems Inc.\n00:90:B3\t\tAgranat Systems\n00:90:B4\t\tWillowbrook Technologies\n00:90:B5\t\tNikon Corporation\n00:90:B6\t\tFibex Systems\n00:90:B7\t\tDigital Lightwave, Inc.\n00:90:B8\t\tRohde & Schwarz Gmbh & Co. Kg\n00:90:B9\t\tBeran Instruments Ltd.\n00:90:BA\t\tValid Networks, Inc.\n00:90:BB\t\tTAINET COMMUNICATION SYSTEM Corp.\n00:90:BC\t\tTelemann Co., Ltd.\n00:90:BD\t\tOmnia Communications, Inc.\n00:90:BE\t\tIbc/Integrated Business Computers\n00:90:BF\t\tCisco Systems, Inc\n00:90:C0\t\tK.J. Law Engineers, Inc.\n00:90:C1\t\tPeco II, Inc.\n00:90:C2\t\tJK microsystems, Inc.\n00:90:C3\t\tTopic Semiconductor Corp.\n00:90:C4\t\tJavelin Systems, Inc.\n00:90:C5\t\tInternet Magic, Inc.\n00:90:C6\t\tOptim Systems, Inc.\n00:90:C7\t\tIcom Inc.\n00:90:C8\t\tWaverider Communications (Canada) Inc.\n00:90:C9\t\tDPAC Technologies\n00:90:CA\t\tAccord Video Telecommunications, Ltd.\n00:90:CB\t\tWireless OnLine, Inc.\n00:90:CC\t\tPlanex Communications Inc.\n00:90:CD\t\tEnt-Empresa Nacional De Telecommunicacoes, S.A.\n00:90:CE\t\tavateramedical Mechatronics GmbH\n00:90:CF\t\tNortel\n00:90:D0\t\tThomson Telecom Belgium\n00:90:D1\t\tLeichu Enterprise Co., Ltd.\n00:90:D2\t\tArtel Video Systems\n00:90:D3\t\tGIESECKE & DEVRIENT GmbH\n00:90:D4\t\tBindView Development Corp.\n00:90:D5\t\tEuphonix, Inc.\n00:90:D6\t\tCrystal Group, Inc.\n00:90:D7\t\tNetBoost Corp.\n00:90:D8\t\tWhitecross Systems\n00:90:D9\t\tCisco Systems, Inc\n00:90:DA\t\tDynarc, Inc.\n00:90:DB\t\tNext Level Communications\n00:90:DC\t\tTeco Information Systems\n00:90:DD\t\tMIHARU COMMUNICATIONS Inc\n00:90:DE\t\tCardkey Systems, Inc.\n00:90:DF\t\tMitsubishi Chemical America, Inc.\n00:90:E0\t\tSystran Corp.\n00:90:E1\t\tTelena S.P.A.\n00:90:E2\t\tDistributed Processing Technology\n00:90:E3\t\tAvex Electronics Inc.\n00:90:E4\t\tNec America, Inc.\n00:90:E5\t\tTeknema, Inc.\n00:90:E6\t\tALi Corporation\n00:90:E7\t\tHorsch Elektronik Ag\n00:90:E8\t\tMoxa Technologies Corp., Ltd.\n00:90:E9\t\tJanz Computer Ag\n00:90:EA\t\tAlpha Technologies, Inc.\n00:90:EB\t\tSentry Telecom Systems\n00:90:EC\t\tPyrescom\n00:90:ED\t\tCentral System Research Co., Ltd.\n00:90:EE\t\tPersonal Communications Technologies\n00:90:EF\t\tIntegrix, Inc.\n00:90:F0\t\tHarmonic Video Systems Ltd.\n00:90:F1\t\tSeagate Cloud Systems Inc\n00:90:F2\t\tCisco Systems, Inc\n00:90:F3\t\tAspect Communications\n00:90:F4\t\tLightning Instrumentation\n00:90:F5\t\tClevo Co.\n00:90:F6\t\tEscalate Networks, Inc.\n00:90:F7\t\tNbase Communications Ltd.\n00:90:F8\t\tMediatrix Telecom\n00:90:F9\t\tImagine Communications\n00:90:FA\t\tEmulex Corporation\n00:90:FB\t\tPortwell, Inc.\n00:90:FC\t\tNetwork Computing Devices\n00:90:FD\t\tCopperCom, Inc.\n00:90:FE\t\tElecom Co., Ltd.  (Laneed Div.)\n00:90:FF\t\tTellus Technology Inc.\n00:91:9E\t\tIntel Corporate\n00:91:D6\t\tCrystal Group, Inc.\n00:91:EB\t\tRenesas Electronics (Penang) Sdn. Bhd.\n00:91:FA\t\tSynapse Product Development\n00:92:7D\t\tFicosa Internationa(Taicang) C0.,Ltd.\n00:92:A5\t\tLG Innotek\n00:92:FA\t\tShenzhen Wisky Technology Co.,Ltd\n00:93:37\t\tIntel Corporate\n00:93:63\t\tUni-Link Technology Co., Ltd.\n00:94:A1\t\tF5 Inc.\n00:94:EC\t\tHuawei Device Co., Ltd.\n00:95:69\t\tLSD Science and Technology Co.,Ltd.\n00:97:F1\t\tApple, Inc.\n00:97:FF\t\tHeimann Sensor GmbH\n00:99:1D\t\tHuawei Technologies Co.,Ltd\n00:9A:CD\t\tHuawei Technologies Co.,Ltd\n00:9A:D2\t\tCisco Systems, Inc\n00:9B:08\t\tQuectel Wireless Solutions Co.,Ltd.\n00:9C:02\t\tHewlett Packard\n00:9C:17\t\tQuectel Wireless Solutions Co.,Ltd.\n00:9C:C0\t\tvivo Mobile Communication Co., Ltd.\n00:9D:6B\t\tMurata Manufacturing Co., Ltd.\n00:9D:85\t\tSigmastar Technology Ltd.\n00:9D:8E\t\tCardiac Recorders, Inc.\n00:9E:1E\t\tCisco Systems, Inc\n00:9E:C8\t\tXiaomi Communications Co Ltd\n00:9E:EE\t\tPositivo Tecnologia S.A.\n00:A0:00\t\tCentillion Networks, Inc.\n00:A0:01\t\tDRS Signal Solutions\n00:A0:02\t\tLeeds & Northrup Australia Pty Ltd\n00:A0:03\t\tSiemens Switzerland Ltd., I B T HVP\n00:A0:04\t\tNetpower, Inc.\n00:A0:05\t\tDaniel Instruments, Ltd.\n00:A0:06\t\tImage Data Processing System Group\n00:A0:07\t\tApexx Technology, Inc.\n00:A0:08\t\tNetcorp\n00:A0:09\t\tWhitetree Network\n00:A0:0A\t\tAirspan\n00:A0:0B\t\tComputex Co., Ltd.\n00:A0:0C\t\tKingmax Technology, Inc.\n00:A0:0D\t\tThe Panda Project\n00:A0:0E\t\tNetscout Systems Inc\n00:A0:0F\t\tBroadband Technologies\n00:A0:10\t\tSyslogic Datentechnik Ag\n00:A0:11\t\tMutoh Industries Ltd.\n00:A0:12\t\tTelco Systems, Inc.\n00:A0:13\t\tTeltrend Ltd.\n00:A0:14\t\tCsir\n00:A0:15\t\tWyle\n00:A0:16\t\tMicropolis Corp.\n00:A0:17\t\tJ B M Corporation\n00:A0:18\t\tCreative Controllers, Inc.\n00:A0:19\t\tNebula Consultants, Inc.\n00:A0:1A\t\tBinar Elektronik Ab\n00:A0:1B\t\tZhone Technologies, Inc.\n00:A0:1C\t\tNascent Networks Corporation\n00:A0:1D\t\tRed Lion Controls, LP\n00:A0:1E\t\tEst Corporation\n00:A0:1F\t\tTricord Systems, Inc.\n00:A0:20\t\tCiticorp/Tti\n00:A0:21\t\tGeneral Dynamics Mission Systems\n00:A0:22\t\tCentre For Development Of Advanced Computing\n00:A0:23\t\tApplied Creative Technology, Inc.\n00:A0:24\t\t3Com\n00:A0:25\t\tRedcom Labs Inc.\n00:A0:26\t\tTeldat, S.A.\n00:A0:27\t\tFirepower Systems, Inc.\n00:A0:28\t\tConner Peripherals\n00:A0:29\t\tCoulter Corporation\n00:A0:2A\t\tTrancell Systems\n00:A0:2B\t\tTransitions Research Corp.\n00:A0:2C\t\tinterWAVE Communications\n00:A0:2D\t\t1394 Trade Association\n00:A0:2E\t\tBrand Communications, Ltd.\n00:A0:2F\t\tADB Broadband Italia\n00:A0:30\t\tCaptor Nv/Sa\n00:A0:31\t\tHazeltine Corporation, Ms 1-17\n00:A0:32\t\tGes Singapore Pte. Ltd.\n00:A0:33\t\timc MeBsysteme GmbH\n00:A0:34\t\tAxel\n00:A0:35\t\tCylink Corporation\n00:A0:36\t\tApplied Network Technology\n00:A0:37\t\tMindray DS USA, Inc.\n00:A0:38\t\tEmail Electronics\n00:A0:39\t\tRoss Technology, Inc.\n00:A0:3A\t\tKubotek Corporation\n00:A0:3B\t\tToshin Electric Co., Ltd.\n00:A0:3C\t\tEg&G Nuclear Instruments\n00:A0:3D\t\tOpto-22\n00:A0:3E\t\tAtm Forum\n00:A0:3F\t\tComputer Society Microprocessor & Microprocessor Standards C\n00:A0:40\t\tApple, Inc.\n00:A0:41\t\tInficon\n00:A0:42\t\tSpur Products Corp.\n00:A0:43\t\tAmerican Technology Labs, Inc.\n00:A0:44\t\tNtt It Co., Ltd.\n00:A0:45\t\tPhoenix Contact GmbH & Co. KG\n00:A0:46\t\tScitex Corp. Ltd.\n00:A0:47\t\tIntegrated Fitness Corp.\n00:A0:48\t\tQuestech, Ltd.\n00:A0:49\t\tDigitech Industries, Inc.\n00:A0:4A\t\tNisshin Electric Co., Ltd.\n00:A0:4B\t\tTfl Lan Inc.\n00:A0:4C\t\tInnovative Systems & Technologies, Inc.\n00:A0:4D\t\tEda Instruments, Inc.\n00:A0:4E\t\tVoelker Technologies, Inc.\n00:A0:4F\t\tAmeritec Corp.\n00:A0:50\t\tCypress Semiconductor\n00:A0:51\t\tAngia Communications. Inc.\n00:A0:52\t\tStanilite Electronics Pty. Ltd\n00:A0:53\t\tCompact Devices, Inc.\n00:A0:54\t\tPrivate\n00:A0:55\t\tData Device Corporation\n00:A0:56\t\tMicropross\n00:A0:57\t\tLANCOM Systems GmbH\n00:A0:58\t\tGlory, Ltd.\n00:A0:59\t\tHamilton Hallmark\n00:A0:5A\t\tKofax Image Products\n00:A0:5B\t\tMarquip, Inc.\n00:A0:5C\t\tInventory Conversion, Inc./\n00:A0:5D\t\tCS COMPUTER SYSTEME GmbH\n00:A0:5E\t\tMyriad Logic Inc.\n00:A0:5F\t\tBTG Electronics Design BV\n00:A0:60\t\tAcer Peripherals, Inc.\n00:A0:61\t\tPuritan Bennett\n00:A0:62\t\tAes Prodata\n00:A0:63\t\tJrl Systems, Inc.\n00:A0:64\t\tKvb/Analect\n00:A0:65\t\tSymantec Corporation\n00:A0:66\t\tIsa Co., Ltd.\n00:A0:67\t\tNetwork Services Group\n00:A0:68\t\tBhp Limited\n00:A0:69\t\tSymmetricom, Inc.\n00:A0:6A\t\tVerilink Corporation\n00:A0:6B\t\tDms Dorsch Mikrosystem Gmbh\n00:A0:6C\t\tShindengen Electric Mfg. Co., Ltd.\n00:A0:6D\t\tMannesmann Tally Corporation\n00:A0:6E\t\tAustron, Inc.\n00:A0:6F\t\tColor Sentinel Systems, LLC\n00:A0:70\t\tCoastcom\n00:A0:71\t\tVideo Lottery Technologies,Inc\n00:A0:72\t\tOvation Systems Ltd.\n00:A0:73\t\tCom21, Inc.\n00:A0:74\t\tPerception Technology\n00:A0:75\t\tMicron Technology, Inc.\n00:A0:76\t\tCardware Lab, Inc.\n00:A0:77\t\tFujitsu Nexion, Inc.\n00:A0:78\t\tMarconi Communications\n00:A0:79\t\tAlps Electric (Usa), Inc.\n00:A0:7A\t\tAdvanced Peripherals Technologies, Inc.\n00:A0:7B\t\tDawn Computer Incorporation\n00:A0:7C\t\tTonyang Nylon Co., Ltd.\n00:A0:7D\t\tSeeq Technology, Inc.\n00:A0:7E\t\tAvid Technology, Inc.\n00:A0:7F\t\tGsm-Syntel, Ltd.\n00:A0:80\t\tTattile SRL\n00:A0:81\t\tAlcatel Data Networks\n00:A0:82\t\tNkt Elektronik A/S\n00:A0:83\t\tAsimmphony Turkey\n00:A0:84\t\tDataplex Pty Ltd\n00:A0:85\t\tPrivate\n00:A0:86\t\tAmber Wave Systems, Inc.\n00:A0:87\t\tMicrosemi Corporation\n00:A0:88\t\tEssential Communications\n00:A0:89\t\tXpoint Technologies, Inc.\n00:A0:8A\t\tBrooktrout Technology, Inc.\n00:A0:8B\t\tAston Electronic Designs Ltd.\n00:A0:8C\t\tMultiMedia LANs, Inc.\n00:A0:8D\t\tJacomo Corporation\n00:A0:8E\t\tCheck Point Software Technologies\n00:A0:8F\t\tDesknet Systems, Inc.\n00:A0:90\t\tTimeStep Corporation\n00:A0:91\t\tApplicom International\n00:A0:92\t\tH. Bollmann Manufacturers, Ltd\n00:A0:93\t\tB/E AEROSPACE, Inc.\n00:A0:94\t\tComsat Corporation\n00:A0:95\t\tAcacia Networks, Inc.\n00:A0:96\t\tMitsumi Electric Co.,Ltd.\n00:A0:97\t\tJc Information Systems\n00:A0:98\t\tNetApp\n00:A0:99\t\tK-Net Ltd.\n00:A0:9A\t\tNihon Kohden America\n00:A0:9B\t\tQpsx Communications, Ltd.\n00:A0:9C\t\tXyplex, Inc.\n00:A0:9D\t\tJohnathon Freeman Technologies\n00:A0:9E\t\tIctv\n00:A0:9F\t\tCommvision Corp.\n00:A0:A0\t\tCompact Data, Ltd.\n00:A0:A1\t\tEpic Data Inc.\n00:A0:A2\t\tB810 S.R.L.\n00:A0:A3\t\tReliable Power Meters\n00:A0:A4\t\tOracle Corporation\n00:A0:A5\t\tTeknor Microsysteme, Inc.\n00:A0:A6\t\tM.I. Systems, K.K.\n00:A0:A7\t\tVorax Corporation\n00:A0:A8\t\tRenex Corporation\n00:A0:A9\t\tNavtel Communications Inc.\n00:A0:AA\t\tSpacelabs Medical\n00:A0:AB\t\tNetcs Informationstechnik Gmbh\n00:A0:AC\t\tGilat Satellite Networks, Ltd.\n00:A0:AD\t\tMarconi Spa\n00:A0:AE\t\tNucom Systems, Inc.\n00:A0:AF\t\tWms Industries\n00:A0:B0\t\tI-O Data Device,Inc.\n00:A0:B1\t\tFirst Virtual Corporation\n00:A0:B2\t\tShima Seiki\n00:A0:B3\t\tZykronix\n00:A0:B4\t\tTexas Microsystems, Inc.\n00:A0:B5\t\t3H Technology\n00:A0:B6\t\tSanritz Automation Co., Ltd.\n00:A0:B7\t\tCordant, Inc.\n00:A0:B8\t\tNetApp\n00:A0:B9\t\tEagle Technology, Inc.\n00:A0:BA\t\tPatton Electronics Co.\n00:A0:BB\t\tHilan Gmbh\n00:A0:BC\t\tViasat, Incorporated\n00:A0:BD\t\tI-Tech Corp.\n00:A0:BE\t\tIntegrated Circuit Systems, Inc. Communications Group\n00:A0:BF\t\tWireless Data Group Motorola\n00:A0:C0\t\tDigital Link Corp.\n00:A0:C1\t\tOrtivus Medical Ab\n00:A0:C2\t\tR.A. Systems Co., Ltd.\n00:A0:C3\t\tUnicomputer Gmbh\n00:A0:C4\t\tCristie Electronics Ltd.\n00:A0:C5\t\tZyxel Communications Corporation\n00:A0:C6\t\tQualcomm Inc.\n00:A0:C7\t\tTadiran Telecommunications\n00:A0:C8\t\tAdtran Inc\n00:A0:C9\t\tIntel Corporation\n00:A0:CA\t\tFujitsu Denso Ltd.\n00:A0:CB\t\tArk Telecommunications, Inc.\n00:A0:CC\t\tLite-On Communications, Inc.\n00:A0:CD\t\tDR. JOHANNES HEIDENHAIN GmbH\n00:A0:CE\t\tEcessa\n00:A0:CF\t\tSotas, Inc.\n00:A0:D0\t\tTen X Technology, Inc.\n00:A0:D1\t\tInventec Corporation\n00:A0:D2\t\tAllied Telesis International Corporation\n00:A0:D3\t\tInstem Computer Systems, Ltd.\n00:A0:D4\t\tRadiolan,  Inc.\n00:A0:D5\t\tSierra Wireless, ULC\n00:A0:D6\t\tSBE, Inc.\n00:A0:D7\t\tKasten Chase Applied Research\n00:A0:D8\t\tSpectra - Tek\n00:A0:D9\t\tConvex Computer Corporation\n00:A0:DA\t\tINTEGRATED SYSTEMS Technology, Inc.\n00:A0:DB\t\tFisher & Paykel Production\n00:A0:DC\t\tO.N. Electronic Co., Ltd.\n00:A0:DD\t\tAzonix Corporation\n00:A0:DE\t\tYamaha Corporation\n00:A0:DF\t\tSts Technologies, Inc.\n00:A0:E0\t\tTennyson Technologies Pty Ltd\n00:A0:E1\t\tWestport Research Associates, Inc.\n00:A0:E2\t\tKeisokugiken Corporation\n00:A0:E3\t\tXkl Systems Corp.\n00:A0:E4\t\tOptiquest\n00:A0:E5\t\tNhc Communications\n00:A0:E6\t\tDialogic Corporation\n00:A0:E7\t\tCentral Data Corporation\n00:A0:E8\t\tReuters Holdings Plc\n00:A0:E9\t\tElectronic Retailing Systems International\n00:A0:EA\t\tEthercom Corp.\n00:A0:EB\t\tEncore Networks, Inc.\n00:A0:EC\t\tTransmitton Ltd.\n00:A0:ED\t\tBrooks Automation, Inc.\n00:A0:EE\t\tNashoba Networks\n00:A0:EF\t\tLucidata Ltd.\n00:A0:F0\t\tToronto Microelectronics Inc.\n00:A0:F1\t\tMti\n00:A0:F2\t\tInfotek Communications, Inc.\n00:A0:F3\t\tStaubli\n00:A0:F4\t\tGe\n00:A0:F5\t\tRadguard Ltd.\n00:A0:F6\t\tAutoGas Systems Inc.\n00:A0:F7\t\tV.I Computer Corp.\n00:A0:F8\t\tZebra Technologies Inc\n00:A0:F9\t\tBintec Communications Gmbh\n00:A0:FA\t\tMarconi Communication GmbH\n00:A0:FB\t\tToray Engineering D Solutions Co., Ltd.\n00:A0:FC\t\tImage Sciences, Inc.\n00:A0:FD\t\tScitex Digital Printing, Inc.\n00:A0:FE\t\tBoston Technology, Inc.\n00:A0:FF\t\tTellabs Operations, Inc.\n00:A1:59\t\tLG Electronics\n00:A1:DE\t\tShenZhen ShiHua Technology CO.,LTD\n00:A2:65\t\tM2Motive Technology Inc.\n00:A2:89\t\tCisco Systems, Inc\n00:A2:DA\t\tINAT GmbH\n00:A2:EE\t\tCisco Systems, Inc\n00:A2:F5\t\tGuangzhou Yuanyun Network Technology Co.,Ltd\n00:A2:FF\t\tabatec group AG\n00:A3:88\t\tSky Uk Limited\n00:A3:8E\t\tCisco Systems, Inc\n00:A3:D1\t\tCisco Systems, Inc\n00:A4:1C\t\tTonly Technology Co. Ltd\n00:A4:5F\t\tHuawei Device Co., Ltd.\n00:A5:09\t\tWigWag Inc.\n00:A5:54\t\tIntel Corporate\n00:A5:BF\t\tCisco Systems, Inc\n00:A6:2B\t\tShanghai High-Flying Electronics Technology Co.,Ltd\n00:A6:CA\t\tCisco Systems, Inc\n00:A7:42\t\tCisco Systems, Inc\n00:A7:84\t\tITX security\n00:A9:1D\t\tHuawei Technologies Co.,Ltd\n00:AA:00\t\tIntel Corporation\n00:AA:01\t\tIntel Corporation\n00:AA:02\t\tIntel Corporation\n00:AA:3C\t\tOlivetti Telecom Spa (Olteco)\n00:AA:6E\t\tCisco Systems, Inc\n00:AA:70\t\tLG Electronics (Mobile Communications)\n00:AA:FD\t\tTexas Instruments\n00:AB:48\t\teero inc.\n00:AC:E0\t\tCommscope\n00:AD:24\t\tD-Link International\n00:AD:63\t\tDedicated Micros Malta LTD\n00:AD:D5\t\tHuawei Device Co., Ltd.\n00:AE:CD\t\tPensando Systems\n00:AE:F7\t\tDreame Technology (Suzhou) Limited\n00:AE:FA\t\tMurata Manufacturing Co., Ltd.\n00:AF:1F\t\tCisco Systems, Inc\n00:B0:09\t\tGrass Valley, A Belden Brand\n00:B0:17\t\tInfoGear Technology Corp.\n00:B0:19\t\tUtc Ccs\n00:B0:1C\t\tWestport Technologies\n00:B0:1E\t\tRantic Labs, Inc.\n00:B0:2A\t\tORSYS GmbH\n00:B0:2D\t\tViaGate Technologies, Inc.\n00:B0:33\t\tOAO \"Izhevskiy radiozavod\"\n00:B0:3B\t\tHiQ Networks\n00:B0:48\t\tMarconi Communications Inc.\n00:B0:4A\t\tCisco Systems, Inc\n00:B0:52\t\tAtheros Communications\n00:B0:64\t\tCisco Systems, Inc\n00:B0:69\t\tHonewell Oy\n00:B0:6D\t\tJones Futurex Inc.\n00:B0:80\t\tMannesmann Ipulsys B.V.\n00:B0:86\t\tLocSoft Limited\n00:B0:8E\t\tCisco Systems, Inc\n00:B0:91\t\tTransmeta Corp.\n00:B0:94\t\tAlaris, Inc.\n00:B0:9A\t\tMorrow Technologies Corp.\n00:B0:9D\t\tPoint Grey Research Inc.\n00:B0:AC\t\tSIAE-Microelettronica S.p.A.\n00:B0:AE\t\tSymmetricom\n00:B0:B3\t\tXstreamis Plc\n00:B0:C2\t\tCisco Systems, Inc\n00:B0:C7\t\tTellabs Operations, Inc.\n00:B0:CE\t\tViveris Technologies\n00:B0:D0\t\tDell Inc.\n00:B0:DB\t\tNextcell, Inc.\n00:B0:DF\t\tStarboard Storage Systems\n00:B0:E1\t\tCisco Systems, Inc\n00:B0:E7\t\tBritish Federal Ltd.\n00:B0:EC\t\tEacem\n00:B0:EE\t\tAjile Systems, Inc.\n00:B0:F0\t\tCaly Networks\n00:B0:F5\t\tNetWorth Technologies, Inc.\n00:B1:E3\t\tCisco Systems, Inc\n00:B3:38\t\tKontron Asia Pacific Design Sdn. Bhd\n00:B3:42\t\tMacroSAN Technologies Co., Ltd.\n00:B3:62\t\tApple, Inc.\n00:B4:F5\t\tDongGuan Siyoto Electronics Co., Ltd\n00:B5:6D\t\tDavid Electronics Co., LTD.\n00:B5:D0\t\tSamsung Electronics Co.,Ltd\n00:B5:D6\t\tOmnibit Inc.\n00:B6:00\t\tVOIM Co., Ltd.\n00:B6:70\t\tCisco Systems, Inc\n00:B6:9F\t\tLatch\n00:B7:71\t\tCisco Systems, Inc\n00:B7:8D\t\tNanjing Shining Electric Automation Co., Ltd\n00:B7:A8\t\tHeinzinger electronic GmbH\n00:B8:10\t\tYichip Microelectronics (Hangzhou) Co.,Ltd\n00:B8:81\t\tNew platforms LLC\n00:B8:B3\t\tCisco Systems, Inc\n00:B8:B6\t\tMotorola Mobility LLC, a Lenovo Company\n00:B8:C2\t\tHeights Telecom T ltd\n00:B9:F6\t\tShenzhen Super Rich Electronics Co.,Ltd\n00:BA:C0\t\tBiometric Access Company\n00:BB:01\t\tOctothorpe Corp.\n00:BB:1C\t\tHuawei Device Co., Ltd.\n00:BB:3A\t\tAmazon Technologies Inc.\n00:BB:43\t\tTiinlab Corporation\n00:BB:60\t\tIntel Corporate\n00:BB:8E\t\tHME Co., Ltd.\n00:BB:C1\t\tCanon Inc.\n00:BB:F0\t\tUngermann-Bass Inc.\n00:BC:2F\t\tActiontec Electronics Inc.\n00:BC:60\t\tCisco Systems, Inc\n00:BD:27\t\tExar Corp.\n00:BD:3A\t\tNokia Corporation\n00:BD:3E\t\tVizio, Inc\n00:BD:82\t\tShenzhen YOUHUA Technology Co., Ltd\n00:BE:3B\t\tHuawei Technologies Co.,Ltd\n00:BE:43\t\tDell Inc.\n00:BE:44\t\tSilicon Laboratories\n00:BE:75\t\tCisco Systems, Inc\n00:BE:9E\t\tFiberhome Telecommunication Technologies Co.,LTD\n00:BE:D5\t\tNew H3C Technologies Co., Ltd\n00:BF:15\t\tGenetec Inc.\n00:BF:61\t\tSamsung Electronics Co.,Ltd\n00:BF:77\t\tCisco Systems, Inc\n00:BF:AF\t\tHui Zhou Gaoshengda Technology Co.,LTD\n00:C0:00\t\tLanoptics, Ltd.\n00:C0:01\t\tDiatek Patient Managment\n00:C0:02\t\tSercomm Corporation.\n00:C0:03\t\tGlobalnet Communications\n00:C0:04\t\tJapan Business Computer Co.Ltd\n00:C0:05\t\tLivingston Enterprises, Inc.\n00:C0:06\t\tNippon Avionics Co., Ltd.\n00:C0:07\t\tPinnacle Data Systems, Inc.\n00:C0:08\t\tSeco Srl\n00:C0:09\t\tKt Technology (S) Pte Ltd\n00:C0:0A\t\tMicro Craft\n00:C0:0B\t\tNorcontrol A.S.\n00:C0:0C\t\tRelia Technolgies\n00:C0:0D\t\tAdvanced Logic Research, Inc.\n00:C0:0E\t\tPsitech, Inc.\n00:C0:0F\t\tQuantum Software Systems Ltd.\n00:C0:10\t\tHirakawa Hewtech Corp.\n00:C0:11\t\tInteractive Computing Devices\n00:C0:12\t\tNetspan Corporation\n00:C0:13\t\tNetrix\n00:C0:14\t\tTelematics Calabasas Int'L,Inc\n00:C0:15\t\tNew Media Corporation\n00:C0:16\t\tElectronic Theatre Controls\n00:C0:17\t\tNetAlly\n00:C0:18\t\tLanart Corporation\n00:C0:19\t\tLeap Technology, Inc.\n00:C0:1A\t\tCorometrics Medical Systems\n00:C0:1B\t\tSocket Communications, Inc.\n00:C0:1C\t\tInterlink Communications Ltd.\n00:C0:1D\t\tGrand Junction Networks, Inc.\n00:C0:1E\t\tLa Francaise Des Jeux\n00:C0:1F\t\tS.E.R.C.E.L.\n00:C0:20\t\tArco Electronic, Control Ltd.\n00:C0:21\t\tNetexpress\n00:C0:22\t\tLasermaster Technologies, Inc.\n00:C0:23\t\tTutankhamon Electronics\n00:C0:24\t\tEden Sistemas De Computacao Sa\n00:C0:25\t\tDataproducts Corporation\n00:C0:26\t\tLans Technology Co., Ltd.\n00:C0:27\t\tCipher Systems, Inc.\n00:C0:28\t\tJasco Corporation\n00:C0:29\t\tAginode Germany GmbH\n00:C0:2A\t\tOhkura Electric Co., Ltd.\n00:C0:2B\t\tGerloff Gesellschaft Fur\n00:C0:2C\t\tCentrum Communications, Inc.\n00:C0:2D\t\tFuji Photo Film Co., Ltd.\n00:C0:2E\t\tNetwiz\n00:C0:2F\t\tOkuma Corporation\n00:C0:30\t\tIntegrated Engineering B. V.\n00:C0:31\t\tDesign Research Systems, Inc.\n00:C0:32\t\tI-Cubed Limited\n00:C0:33\t\tTelebit Communications Aps\n00:C0:34\t\tTransaction Network\n00:C0:35\t\tQuintar Company\n00:C0:36\t\tRaytech Electronic Corp.\n00:C0:37\t\tDynatem\n00:C0:38\t\tRaster Image Processing System\n00:C0:39\t\tTeridian Semiconductor Corporation\n00:C0:3A\t\tduagon Germany GmbH\n00:C0:3B\t\tMultiaccess Computing Corp.\n00:C0:3C\t\tTower Tech S.R.L.\n00:C0:3D\t\tWiesemann & Theis Gmbh\n00:C0:3E\t\tFa. Gebr. Heller Gmbh\n00:C0:3F\t\tStores Automated Systems, Inc.\n00:C0:40\t\tEcci\n00:C0:41\t\tDigital Transmission Systems\n00:C0:42\t\tDatalux Corp.\n00:C0:43\t\tStratacom\n00:C0:44\t\tEmcom Corporation\n00:C0:45\t\tIsolation Systems, Ltd.\n00:C0:46\t\tBlue Chip Technology Ltd\n00:C0:47\t\tUnimicro Systems, Inc.\n00:C0:48\t\tBay Technical Associates\n00:C0:49\t\tU.S. Robotics, Inc.\n00:C0:4A\t\tGroup 2000 Ag\n00:C0:4B\t\tCreative Microsystems\n00:C0:4C\t\tDepartment Of Foreign Affairs\n00:C0:4D\t\tMitec, Inc.\n00:C0:4E\t\tComtrol Corporation\n00:C0:4F\t\tDell Inc.\n00:C0:50\t\tToyo Denki Seizo K.K.\n00:C0:51\t\tAdvanced Integration Research\n00:C0:52\t\tBurr-Brown\n00:C0:53\t\tAspect Software Inc.\n00:C0:54\t\tNetwork Peripherals, Ltd.\n00:C0:55\t\tModular Computing Technologies\n00:C0:56\t\tSomelec\n00:C0:57\t\tMyco Electronics\n00:C0:58\t\tDataexpert Corp.\n00:C0:59\t\tDenso Corporation\n00:C0:5A\t\tSemaphore Communications Corp.\n00:C0:5B\t\tNetworks Northwest, Inc.\n00:C0:5C\t\tElonex Plc\n00:C0:5D\t\tL&N Technologies\n00:C0:5E\t\tVari-Lite, Inc.\n00:C0:5F\t\tFine-Pal Company Limited\n00:C0:60\t\tId Scandinavia As\n00:C0:61\t\tSolectek Corporation\n00:C0:62\t\tImpulse Technology\n00:C0:63\t\tMorning Star Technologies, Inc\n00:C0:64\t\tGeneral Datacomm LLC\n00:C0:65\t\tScope Communications, Inc.\n00:C0:66\t\tDocupoint, Inc.\n00:C0:67\t\tUnited Barcode Industries\n00:C0:68\t\tHME Clear-Com LTD.\n00:C0:69\t\tAxxcelera Broadband Wireless\n00:C0:6A\t\tZahner-Elektrik Ingeborg Zahner-Schiller GmbH & Co. KG.\n00:C0:6B\t\tOsi Plus Corporation\n00:C0:6C\t\tSvec Computer Corp.\n00:C0:6D\t\tBoca Research, Inc.\n00:C0:6E\t\tHaft Technology, Inc.\n00:C0:6F\t\tKomatsu Ltd.\n00:C0:70\t\tSectra Secure-Transmission Ab\n00:C0:71\t\tAreanex Communications, Inc.\n00:C0:72\t\tKnx Ltd.\n00:C0:73\t\tXedia Corporation\n00:C0:74\t\tToyoda Automatic Loom\n00:C0:75\t\tXante Corporation\n00:C0:76\t\tI-Data International A-S\n00:C0:77\t\tDaewoo Telecom Ltd.\n00:C0:78\t\tComputer Systems Engineering\n00:C0:79\t\tFonsys Co.,Ltd.\n00:C0:7A\t\tPriva B.V.\n00:C0:7B\t\tAscend Communications, Inc.\n00:C0:7C\t\tHightech Information\n00:C0:7D\t\tRisc Developments Ltd.\n00:C0:7E\t\tKubota Corporation Electronic\n00:C0:7F\t\tNupon Computing Corp.\n00:C0:80\t\tNetstar, Inc.\n00:C0:81\t\tMetrodata Ltd.\n00:C0:82\t\tMoore Products Co.\n00:C0:83\t\tTrace Mountain Products, Inc.\n00:C0:84\t\tData Link Corp. Ltd.\n00:C0:85\t\tElectronics For Imaging, Inc.\n00:C0:86\t\tThe Lynk Corporation\n00:C0:87\t\tUunet Technologies, Inc.\n00:C0:88\t\tEkf Elektronik Gmbh\n00:C0:89\t\tTelindus Distribution\n00:C0:8A\t\tLauterbach GmbH\n00:C0:8B\t\tRisq Modular Systems, Inc.\n00:C0:8C\t\tPerformance Technologies, Inc.\n00:C0:8D\t\tTronix Product Development\n00:C0:8E\t\tNetwork Information Technology\n00:C0:8F\t\tPanasonic Electric Works Co., Ltd.\n00:C0:90\t\tPraim S.R.L.\n00:C0:91\t\tJabil Circuit, Inc.\n00:C0:92\t\tMennen Medical Inc.\n00:C0:93\t\tAlta Research Corp.\n00:C0:94\t\tVmx Inc.\n00:C0:95\t\tZNYX Networks, Inc.\n00:C0:96\t\tTamura Corporation\n00:C0:97\t\tArchipel Sa\n00:C0:98\t\tChuntex Electronic Co., Ltd.\n00:C0:99\t\tYoshiki Industrial Co.,Ltd.\n00:C0:9A\t\tPhotonics Corporation\n00:C0:9B\t\tTellabs Enterprise, Inc.\n00:C0:9C\t\tHioki E.E. Corporation\n00:C0:9D\t\tDistributed Systems Int'L, Inc\n00:C0:9E\t\tCache Computers, Inc.\n00:C0:9F\t\tQuanta Computer Inc.\n00:C0:A0\t\tAdvance Micro Research, Inc.\n00:C0:A1\t\tTokyo Denshi Sekei Co.\n00:C0:A2\t\tIntermedium A/S\n00:C0:A3\t\tDual Enterprises Corporation\n00:C0:A4\t\tUnigraf Oy\n00:C0:A5\t\tDickens Data Systems\n00:C0:A6\t\tExicom Australia Pty. Ltd\n00:C0:A7\t\tSeel Ltd.\n00:C0:A8\t\tGvc Corporation\n00:C0:A9\t\tBarron Mccann Ltd.\n00:C0:AA\t\tSilicon Valley Computer\n00:C0:AB\t\tTelco Systems, Inc.\n00:C0:AC\t\tGambit Computer Communications\n00:C0:AD\t\tMarben Communication Systems\n00:C0:AE\t\tTowercom Co. Inc. Dba Pc House\n00:C0:AF\t\tTeklogix Inc.\n00:C0:B0\t\tGcc Technologies,Inc.\n00:C0:B1\t\tGenius Net Co.\n00:C0:B2\t\tNorand Corporation\n00:C0:B3\t\tComstat Datacomm Corporation\n00:C0:B4\t\tMyson Technology, Inc.\n00:C0:B5\t\tCorporate Network Systems,Inc.\n00:C0:B6\t\tHVE, Inc.\n00:C0:B7\t\tAmerican Power Conversion Corp\n00:C0:B8\t\tFraser'S Hill Ltd.\n00:C0:B9\t\tFunk Software, Inc.\n00:C0:BA\t\tNetvantage\n00:C0:BB\t\tForval Creative, Inc.\n00:C0:BC\t\tTelecom Australia/Cssc\n00:C0:BD\t\tInex Technologies, Inc.\n00:C0:BE\t\tAlcatel - Sel\n00:C0:BF\t\tTechnology Concepts, Ltd.\n00:C0:C0\t\tShore Microsystems, Inc.\n00:C0:C1\t\tQuad/Graphics, Inc.\n00:C0:C2\t\tInfinite Networks Ltd.\n00:C0:C3\t\tAcuson Computed Sonography\n00:C0:C4\t\tComputer Operational\n00:C0:C5\t\tSid Informatica\n00:C0:C6\t\tPersonal Media Corp.\n00:C0:C7\t\tSparktrum Microsystems, Inc.\n00:C0:C8\t\tMicro Byte Pty. Ltd.\n00:C0:C9\t\tElsag Bailey Process\n00:C0:CA\t\tAlfa, Inc.\n00:C0:CB\t\tControl Technology Corporation\n00:C0:CC\t\tTelesciences Co Systems, Inc.\n00:C0:CD\t\tComelta, S.A.\n00:C0:CE\t\tCei Systems & Engineering Pte\n00:C0:CF\t\tImatran Voima Oy\n00:C0:D0\t\tRatoc System Inc.\n00:C0:D1\t\tComtree Technology Corporation\n00:C0:D2\t\tSyntellect, Inc.\n00:C0:D3\t\tOlympus Image Systems, Inc.\n00:C0:D4\t\tAxon Networks, Inc.\n00:C0:D5\t\tWerbeagentur Jürgen Siebert\n00:C0:D6\t\tJ1 Systems, Inc.\n00:C0:D7\t\tTaiwan Trading Center Dba\n00:C0:D8\t\tUniversal Data Systems\n00:C0:D9\t\tQuinte Network Confidentiality\n00:C0:DA\t\tNice Systems Ltd.\n00:C0:DB\t\tIpc Corporation (Pte) Ltd.\n00:C0:DC\t\tEos Technologies, Inc.\n00:C0:DD\t\tQLogic Corporation\n00:C0:DE\t\tZcomm, Inc.\n00:C0:DF\t\tKYE Systems Corp.\n00:C0:E0\t\tDsc Communication Corp.\n00:C0:E1\t\tSonic Solutions\n00:C0:E2\t\tCalcomp, Inc.\n00:C0:E3\t\tOsitech Communications, Inc.\n00:C0:E4\t\tSiemens Building\n00:C0:E5\t\tGespac, S.A.\n00:C0:E6\t\tVerilink Corporation\n00:C0:E7\t\tFiberdata Ab\n00:C0:E8\t\tPlexcom, Inc.\n00:C0:E9\t\tOak Solutions, Ltd.\n00:C0:EA\t\tArray Technology Ltd.\n00:C0:EB\t\tSeh Computertechnik Gmbh\n00:C0:EC\t\tDauphin Technology\n00:C0:ED\t\tUs Army Electronic\n00:C0:EE\t\tKYOCERA Display Corporation\n00:C0:EF\t\tAbit Corporation\n00:C0:F0\t\tKingston Technology Company, Inc.\n00:C0:F1\t\tShinko Electric Co., Ltd.\n00:C0:F2\t\tLantronix\n00:C0:F3\t\tNetwork Communications Corp.\n00:C0:F4\t\tInterlink System Co., Ltd.\n00:C0:F5\t\tMetacomp, Inc.\n00:C0:F6\t\tCelan Technology Inc.\n00:C0:F7\t\tEngage Communication, Inc.\n00:C0:F8\t\tAbout Computing Inc.\n00:C0:F9\t\tArtesyn Embedded Technologies\n00:C0:FA\t\tCanary Communications, Inc.\n00:C0:FB\t\tAdvanced Technology Labs\n00:C0:FC\t\tElastic Reality, Inc.\n00:C0:FD\t\tProsum\n00:C0:FE\t\tAptec Computer Systems, Inc.\n00:C0:FF\t\tSeagate Cloud Systems Inc\n00:C1:4F\t\tDDL Co,.ltd.\n00:C1:64\t\tCisco Systems, Inc\n00:C1:B1\t\tCisco Systems, Inc\n00:C2:8F\t\tAllied Telesis K.K.\n00:C2:C6\t\tIntel Corporate\n00:C3:0A\t\tXiaomi Communications Co Ltd\n00:C3:43\t\tE-T-A Circuit Breakers Ltd\n00:C3:F4\t\tSamsung Electronics Co.,Ltd\n00:C5:2C\t\tJuniper Networks\n00:C5:85\t\tApple, Inc.\n00:C5:DB\t\tDatatech Sistemas Digitales Avanzados SL\n00:C6:10\t\tApple, Inc.\n00:C7:11\t\tItel Mobile Limited\n00:C8:4E\t\tHewlett Packard Enterprise\n00:C8:8B\t\tCisco Systems, Inc\n00:C8:96\t\tCig Shanghai Co Ltd\n00:CA:E0\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n00:CA:E5\t\tCisco Systems, Inc\n00:CB:00\t\tPrivate\n00:CB:51\t\tSagemcom Broadband SAS\n00:CB:7A\t\tVantiva USA LLC\n00:CB:B4\t\tShenzhen Ateko Photoelectricity Co.,Ltd\n00:CB:BD\t\tCambridge Broadband Networks Group\n00:CC:34\t\tJuniper Networks\n00:CC:3F\t\tUniversal Electronics, Inc.\n00:CC:FC\t\tCisco Systems, Inc\n00:CD:90\t\tMAS Elektronik AG\n00:CD:FE\t\tApple, Inc.\n00:CE:30\t\tExpress LUCK Industrial Ltd.\n00:CF:1C\t\tCommunication Machinery Corporation\n00:CF:C0\t\tChina Mobile Group Device Co.,Ltd.\n00:D0:00\t\tFerran Scientific, Inc.\n00:D0:01\t\tVst Technologies, Inc.\n00:D0:02\t\tDitech Corporation\n00:D0:03\t\tComda Enterprises Corp.\n00:D0:04\t\tPentacom Ltd.\n00:D0:05\t\tZhs Zeitmanagementsysteme\n00:D0:06\t\tCisco Systems, Inc\n00:D0:07\t\tMic Associates, Inc.\n00:D0:08\t\tMactell Corporation\n00:D0:09\t\tHsing Tech. Enterprise Co. Ltd\n00:D0:0A\t\tLanaccess Telecom S.A.\n00:D0:0B\t\tRhk Technology, Inc.\n00:D0:0C\t\tSnijder Micro Systems\n00:D0:0D\t\tMicromeritics Instrument\n00:D0:0E\t\tPluris, Inc.\n00:D0:0F\t\tSpeech Design Gmbh\n00:D0:10\t\tConvergent Networks, Inc.\n00:D0:11\t\tPrism Video, Inc.\n00:D0:12\t\tGateworks Corp.\n00:D0:13\t\tPrimex Aerospace Company\n00:D0:14\t\tRoot, Inc.\n00:D0:15\t\tUnivex Microtechnology Corp.\n00:D0:16\t\tScm Microsystems, Inc.\n00:D0:17\t\tSyntech Information Co., Ltd.\n00:D0:18\t\tQwes. Com, Inc.\n00:D0:19\t\tDainippon Screen Corporate\n00:D0:1A\t\tUrmet  Tlc S.P.A.\n00:D0:1B\t\tMimaki Engineering Co., Ltd.\n00:D0:1C\t\tSbs Technologies,\n00:D0:1D\t\tFuruno Electric Co., Ltd.\n00:D0:1E\t\tPingtel Corp.\n00:D0:1F\t\tSenetas Corporation Ltd\n00:D0:20\t\tAim System, Inc.\n00:D0:21\t\tRegent Electronics Corp.\n00:D0:22\t\tIncredible Technologies, Inc.\n00:D0:23\t\tInfortrend Technology, Inc.\n00:D0:24\t\tCognex Corporation\n00:D0:25\t\tXrosstech, Inc.\n00:D0:26\t\tHirschmann Austria Gmbh\n00:D0:27\t\tApplied Automation, Inc.\n00:D0:28\t\tHarmonic, Inc\n00:D0:29\t\tWakefern Food Corporation\n00:D0:2A\t\tVoxent Systems Ltd.\n00:D0:2B\t\tJetcell, Inc.\n00:D0:2C\t\tCampbell Scientific, Inc.\n00:D0:2D\t\tResideo\n00:D0:2E\t\tCommunication Automation Corp.\n00:D0:2F\t\tVlsi Technology Inc.\n00:D0:30\t\tSafetran Systems Corp\n00:D0:31\t\tIndustrial Logic Corporation\n00:D0:32\t\tYano Electric Co., Ltd.\n00:D0:33\t\tDalian Daxian Network\n00:D0:34\t\tOrmec Systems Corp.\n00:D0:35\t\tBehavior Tech. Computer Corp.\n00:D0:36\t\tTechnology Atlanta Corp.\n00:D0:37\t\tCommscope\n00:D0:38\t\tFivemere, Ltd.\n00:D0:39\t\tUtilicom, Inc.\n00:D0:3A\t\tZoneworx, Inc.\n00:D0:3B\t\tVision Products Pty. Ltd.\n00:D0:3C\t\tVieo, Inc.\n00:D0:3D\t\tGalileo Technology, Ltd.\n00:D0:3E\t\tRocketchips, Inc.\n00:D0:3F\t\tAmerican Communication\n00:D0:40\t\tSysmate Co., Ltd.\n00:D0:41\t\tAmigo Technology Co., Ltd.\n00:D0:42\t\tMahlo Gmbh & Co. Ug\n00:D0:43\t\tZonal Retail Data Systems\n00:D0:44\t\tAlidian Networks, Inc.\n00:D0:45\t\tKvaser Ab\n00:D0:46\t\tDolby Laboratories, Inc.\n00:D0:47\t\tXn Technologies\n00:D0:48\t\tEcton, Inc.\n00:D0:49\t\tImpresstek Co., Ltd.\n00:D0:4A\t\tPresence Technology Gmbh\n00:D0:4B\t\tLa Cie Group S.A.\n00:D0:4C\t\tEseye Design Ltd\n00:D0:4D\t\tDiv Of Research & Statistics\n00:D0:4E\t\tLogibag\n00:D0:4F\t\tBitronics, Inc.\n00:D0:50\t\tIskratel d.o.o.\n00:D0:51\t\tO2 Micro, Inc.\n00:D0:52\t\tAscend Communications, Inc.\n00:D0:53\t\tConnected Systems\n00:D0:54\t\tSas Institute Inc.\n00:D0:55\t\tKathrein-Werke Kg\n00:D0:56\t\tSomat Corporation\n00:D0:57\t\tUltrak, Inc.\n00:D0:58\t\tCisco Systems, Inc\n00:D0:59\t\tAmbit Microsystems Corp.\n00:D0:5A\t\tSymbionics, Ltd.\n00:D0:5B\t\tAcroloop Motion Control\n00:D0:5C\t\tKATHREIN TechnoTrend GmbH\n00:D0:5D\t\tIntelliworxx, Inc.\n00:D0:5E\t\tStratabeam Technology, Inc.\n00:D0:5F\t\tValcom, Inc.\n00:D0:60\t\tPanasonic Europe Ltd.\n00:D0:61\t\tTremon Enterprises Co., Ltd.\n00:D0:62\t\tDigigram\n00:D0:63\t\tCisco Systems, Inc\n00:D0:64\t\tMultitel\n00:D0:65\t\tToko Electric\n00:D0:66\t\tWintriss Engineering Corp.\n00:D0:67\t\tCampio Communications\n00:D0:68\t\tIwill Corporation\n00:D0:69\t\tTechnologic Systems\n00:D0:6A\t\tLinkup Systems Corporation\n00:D0:6B\t\tSr Telecom Inc.\n00:D0:6C\t\tSharewave, Inc.\n00:D0:6D\t\tAcrison, Inc.\n00:D0:6E\t\tTrendview Recorders Ltd.\n00:D0:6F\t\tKmc Controls\n00:D0:70\t\tLong Well Electronics Corp.\n00:D0:71\t\tEchelon Corp.\n00:D0:72\t\tBroadlogic\n00:D0:73\t\tAcn Advanced Communications\n00:D0:74\t\tTaqua Systems, Inc.\n00:D0:75\t\tAlaris Medical Systems, Inc.\n00:D0:76\t\tBank of America\n00:D0:77\t\tLucent Technologies\n00:D0:78\t\tEltex of Sweden AB\n00:D0:79\t\tCisco Systems, Inc\n00:D0:7A\t\tAmaquest Computer Corp.\n00:D0:7B\t\tComcam International Inc\n00:D0:7C\t\tJtekt Electronics Corporation\n00:D0:7D\t\tCosine Communications\n00:D0:7E\t\tKeycorp Ltd.\n00:D0:7F\t\tStrategy & Technology, Limited\n00:D0:80\t\tExabyte Corporation\n00:D0:81\t\tRTD Embedded Technologies, Inc.\n00:D0:82\t\tIowave Inc.\n00:D0:83\t\tInvertex, Inc.\n00:D0:84\t\tNexcomm Systems, Inc.\n00:D0:85\t\tOtis Elevator Company\n00:D0:86\t\tFoveon, Inc.\n00:D0:87\t\tMicrofirst Inc.\n00:D0:88\t\tCommscope\n00:D0:89\t\tDynacolor, Inc.\n00:D0:8A\t\tPhotron Usa\n00:D0:8B\t\tADVA Optical Networking Ltd.\n00:D0:8C\t\tGenoa Technology, Inc.\n00:D0:8D\t\tPhoenix Group, Inc.\n00:D0:8E\t\tGrass Valley, A Belden Brand\n00:D0:8F\t\tArdent Technologies, Inc.\n00:D0:90\t\tCisco Systems, Inc\n00:D0:91\t\tSmartsan Systems, Inc.\n00:D0:92\t\tGlenayre Western Multiplex\n00:D0:93\t\tTq - Components Gmbh\n00:D0:94\t\tSeeion Control LLC\n00:D0:95\t\tAlcatel-Lucent Enterprise\n00:D0:96\t\t3Com Europe Ltd\n00:D0:97\t\tCisco Systems, Inc\n00:D0:98\t\tPhoton Dynamics Canada Inc.\n00:D0:99\t\tElcard Wireless Systems Oy\n00:D0:9A\t\tFilanet Corporation\n00:D0:9B\t\tSpectel Ltd.\n00:D0:9C\t\tKapadia Communications\n00:D0:9D\t\tVeris Industries\n00:D0:9E\t\t2Wire Inc\n00:D0:9F\t\tNovtek Test Systems\n00:D0:A0\t\tMips Denmark\n00:D0:A1\t\tOskar Vierling Gmbh + Co. Kg\n00:D0:A2\t\tIntegrated Device\n00:D0:A3\t\tVocal Data, Inc.\n00:D0:A4\t\tAlantro Communications\n00:D0:A5\t\tAmerican Arium\n00:D0:A6\t\tLanbird Technology Co., Ltd.\n00:D0:A7\t\tTokyo Sokki Kenkyujo Co., Ltd.\n00:D0:A8\t\tNetwork Engines, Inc.\n00:D0:A9\t\tShinano Kenshi Co., Ltd.\n00:D0:AA\t\tChase Communications\n00:D0:AB\t\tDeltakabel Telecom Cv\n00:D0:AC\t\tCommscope, Inc\n00:D0:AD\t\tTl Industries\n00:D0:AE\t\tOresis Communications, Inc.\n00:D0:AF\t\tCutler-Hammer, Inc.\n00:D0:B0\t\tBitswitch Ltd.\n00:D0:B1\t\tOmega Electronics Sa\n00:D0:B2\t\tXiotech Corporation\n00:D0:B3\t\tDRS Technologies Canada Ltd\n00:D0:B4\t\tKatsujima Co., Ltd.\n00:D0:B5\t\tIPricot formerly DotCom\n00:D0:B6\t\tCrescent Networks, Inc.\n00:D0:B7\t\tIntel Corporation\n00:D0:B8\t\tIomega Corporation\n00:D0:B9\t\tMicrotek International, Inc.\n00:D0:BA\t\tCisco Systems, Inc\n00:D0:BB\t\tCisco Systems, Inc\n00:D0:BC\t\tCisco Systems, Inc\n00:D0:BD\t\tLattice Semiconductor Corp. (LPA)\n00:D0:BE\t\tEmutec Inc.\n00:D0:BF\t\tPivotal Technologies\n00:D0:C0\t\tCisco Systems, Inc\n00:D0:C1\t\tHarmonic Data Systems, Ltd.\n00:D0:C2\t\tBalthazar Technology Ab\n00:D0:C3\t\tVivid Technology Pte, Ltd.\n00:D0:C4\t\tTeratech Corporation\n00:D0:C5\t\tComputational Systems, Inc.\n00:D0:C6\t\tThomas & Betts Corp.\n00:D0:C7\t\tPathway, Inc.\n00:D0:C8\t\tPrevas A/S\n00:D0:C9\t\tAdvantech Co., Ltd.\n00:D0:CA\t\tIntrinsyc Software International Inc.\n00:D0:CB\t\tDasan Co., Ltd.\n00:D0:CC\t\tTechnologies Lyre Inc.\n00:D0:CD\t\tAtan Technology Inc.\n00:D0:CE\t\tTASKING Labs\n00:D0:CF\t\tMoreton Bay\n00:D0:D0\t\tZhongxing Telecom Ltd.\n00:D0:D1\t\tSycamore Networks\n00:D0:D2\t\tEpilog Corporation\n00:D0:D3\t\tCisco Systems, Inc\n00:D0:D4\t\tV-Bits, Inc.\n00:D0:D5\t\tGrundig Ag\n00:D0:D6\t\tAethra Telecomunicazioni\n00:D0:D7\t\tB2C2, Inc.\n00:D0:D8\t\t3Com\n00:D0:D9\t\tDedicated Microcomputers\n00:D0:DA\t\tTaicom Data Systems Co., Ltd.\n00:D0:DB\t\tMcquay International\n00:D0:DC\t\tModular Mining Systems, Inc.\n00:D0:DD\t\tSunrise Telecom, Inc.\n00:D0:DE\t\tPhilips Multimedia Network\n00:D0:DF\t\tKuzumi Electronics, Inc.\n00:D0:E0\t\tDooin Electronics Co.\n00:D0:E1\t\tAvionitek Israel Inc.\n00:D0:E2\t\tMrt Micro, Inc.\n00:D0:E3\t\tEle-Chem Engineering Co., Ltd.\n00:D0:E4\t\tCisco Systems, Inc\n00:D0:E5\t\tSolidum Systems Corp.\n00:D0:E6\t\tIbond Inc.\n00:D0:E7\t\tVcon Telecommunication Ltd.\n00:D0:E8\t\tMac System Co., Ltd.\n00:D0:E9\t\tAdvantage Century Telecommunication Corp.\n00:D0:EA\t\tNextone Communications, Inc.\n00:D0:EB\t\tLightera Networks, Inc.\n00:D0:EC\t\tNAKAYO Inc\n00:D0:ED\t\tXiox\n00:D0:EE\t\tDictaphone Corporation\n00:D0:EF\t\tIgt\n00:D0:F0\t\tConvision Technology Gmbh\n00:D0:F1\t\tSega Enterprises, Ltd.\n00:D0:F2\t\tMonterey Networks\n00:D0:F3\t\tSolari Di Udine Spa\n00:D0:F4\t\tCarinthian Tech Institute\n00:D0:F5\t\tOrange Micro, Inc.\n00:D0:F6\t\tNokia\n00:D0:F7\t\tNext Nets Corporation\n00:D0:F8\t\tFujian Star Terminal\n00:D0:F9\t\tAcute Communications Corp.\n00:D0:FA\t\tThales e-Security Ltd.\n00:D0:FB\t\tTek Microsystems, Incorporated\n00:D0:FC\t\tGranite Microsystems\n00:D0:FD\t\tOptima Tele.Com, Inc.\n00:D0:FE\t\tAstral Point\n00:D0:FF\t\tCisco Systems, Inc\n00:D1:1C\t\tAcetel\n00:D2:79\t\tVingroup Joint Stock Company\n00:D2:B1\t\tTPV Display Technology (Xiamen) Co.,Ltd.\n00:D3:18\t\tSPG Controls\n00:D3:8D\t\tHotel Technology Next Generation\n00:D4:9E\t\tIntel Corporate\n00:D5:98\t\tBopel Mobile Technology Co.,Limited\n00:D6:26\t\tMist Systems, Inc.\n00:D6:32\t\tGE Energy\n00:D6:CB\t\tQuectel Wireless Solutions Co.,Ltd.\n00:D6:FE\t\tCisco Systems, Inc\n00:D7:6D\t\tIntel Corporate\n00:D7:8F\t\tCisco Systems, Inc\n00:D8:61\t\tMicro-Star INTL CO., LTD.\n00:D8:A2\t\tHuawei Device Co., Ltd.\n00:D9:D1\t\tSony Interactive Entertainment Inc.\n00:DA:27\t\tPalo Alto Networks\n00:DA:55\t\tCisco Systems, Inc\n00:DB:1E\t\tAlbedo Telecom SL\n00:DB:45\t\tThamway Co.,Ltd.\n00:DB:70\t\tApple, Inc.\n00:DB:DF\t\tIntel Corporate\n00:DC:B2\t\tExtreme Networks Headquarters\n00:DD:00\t\tUngermann-Bass Inc.\n00:DD:01\t\tUngermann-Bass Inc.\n00:DD:02\t\tUngermann-Bass Inc.\n00:DD:03\t\tUngermann-Bass Inc.\n00:DD:04\t\tUngermann-Bass Inc.\n00:DD:05\t\tUngermann-Bass Inc.\n00:DD:06\t\tUngermann-Bass Inc.\n00:DD:07\t\tUngermann-Bass Inc.\n00:DD:08\t\tUngermann-Bass Inc.\n00:DD:09\t\tUngermann-Bass Inc.\n00:DD:0A\t\tUngermann-Bass Inc.\n00:DD:0B\t\tUngermann-Bass Inc.\n00:DD:0C\t\tUngermann-Bass Inc.\n00:DD:0D\t\tUngermann-Bass Inc.\n00:DD:0E\t\tUngermann-Bass Inc.\n00:DD:0F\t\tUngermann-Bass Inc.\n00:DD:25\t\tShenzhen hechengdong Technology Co., Ltd\n00:DD:B6\t\tNew H3C Technologies Co., Ltd\n00:DE:FB\t\tCisco Systems, Inc\n00:DF:1D\t\tCisco Systems, Inc\n00:E0:00\t\tFujitsu Limited\n00:E0:01\t\tStrand Lighting Limited\n00:E0:02\t\tCrossroads Systems, Inc.\n00:E0:03\t\tNokia Wireless Business Commun\n00:E0:04\t\tPmc-Sierra, Inc.\n00:E0:05\t\tTechnical Corp.\n00:E0:06\t\tSilicon Integrated Sys. Corp.\n00:E0:07\t\tAvaya ECS Ltd\n00:E0:08\t\tAmazing Controls! Inc.\n00:E0:09\t\tStratus Technologies\n00:E0:0A\t\tDiba, Inc.\n00:E0:0B\t\tRooftop Communications Corp.\n00:E0:0C\t\tMotorola\n00:E0:0D\t\tRadiant Systems\n00:E0:0E\t\tAvalon Imaging Systems, Inc.\n00:E0:0F\t\tShanghai Baud Data Communication Co.,Ltd.\n00:E0:10\t\tHESS SB-AUTOMATENBAU GmbH\n00:E0:11\t\tUniden Corporation\n00:E0:12\t\tPluto Technologies International Inc.\n00:E0:13\t\tEastern Electronic Co., Ltd.\n00:E0:14\t\tCisco Systems, Inc\n00:E0:15\t\tHeiwa Corporation\n00:E0:16\t\tRapid City Communications\n00:E0:17\t\tEXXACT GmbH\n00:E0:18\t\tASUSTek COMPUTER INC.\n00:E0:19\t\tIng. Giordano Elettronica\n00:E0:1A\t\tComtec Systems. Co., Ltd.\n00:E0:1B\t\tSphere Communications, Inc.\n00:E0:1C\t\tCradlePoint, Inc\n00:E0:1D\t\tWebTV NETWORKS, INC.\n00:E0:1E\t\tCisco Systems, Inc\n00:E0:1F\t\tAVIDIA Systems, Inc.\n00:E0:20\t\tTecnomen Oy\n00:E0:21\t\tFreegate Corp.\n00:E0:22\t\tAnalog Devices, Inc.\n00:E0:23\t\tTelrad\n00:E0:24\t\tGadzoox Networks\n00:E0:25\t\tdit Co., Ltd.\n00:E0:26\t\tRedlake MASD LLC\n00:E0:27\t\tDux, Inc.\n00:E0:28\t\tAptix Corporation\n00:E0:29\t\tStandard Microsystems Corp.\n00:E0:2A\t\tTandberg Television As\n00:E0:2B\t\tExtreme Networks Headquarters\n00:E0:2C\t\tAst Computer\n00:E0:2D\t\tInnoMediaLogic, Inc.\n00:E0:2E\t\tSpc Electronics Corporation\n00:E0:2F\t\tMcns Holdings, L.P.\n00:E0:30\t\tMelita International Corp.\n00:E0:31\t\tHagiwara Electric Co., Ltd.\n00:E0:32\t\tMisys Financial Systems, Ltd.\n00:E0:33\t\tE.E.P.D. GmbH\n00:E0:34\t\tCisco Systems, Inc\n00:E0:35\t\tArtesyn Embedded Technologies\n00:E0:36\t\tPioneer Corporation\n00:E0:37\t\tCentury Corporation\n00:E0:38\t\tProxima Corporation\n00:E0:39\t\tParadyne Corp.\n00:E0:3A\t\tCabletron Systems, Inc.\n00:E0:3B\t\tProminet Corporation\n00:E0:3C\t\tAdvanSys\n00:E0:3D\t\tFocon Electronic Systems A/S\n00:E0:3E\t\tAlfatech, Inc.\n00:E0:3F\t\tJaton Corporation\n00:E0:40\t\tDeskStation Technology, Inc.\n00:E0:41\t\tCspi\n00:E0:42\t\tPacom Systems Ltd.\n00:E0:43\t\tVitalCom\n00:E0:44\t\tLsics Corporation\n00:E0:45\t\tTouchwave, Inc.\n00:E0:46\t\tBently Nevada Corp.\n00:E0:47\t\tInFocus Corporation\n00:E0:48\t\tSdl Communications, Inc.\n00:E0:49\t\tMICROWI ELECTRONIC GmbH\n00:E0:4A\t\tZX Technologies, Inc\n00:E0:4B\t\tJUMP INDUSTRIELLE COMPUTERTECHNIK GmbH\n00:E0:4C\t\tRealtek Semiconductor Corp.\n00:E0:4D\t\tInternet Initiative Japan, Inc\n00:E0:4E\t\tSanyo Denki Co., Ltd.\n00:E0:4F\t\tCisco Systems, Inc\n00:E0:50\t\tExecutone Information Systems, Inc.\n00:E0:51\t\tTalx Corporation\n00:E0:52\t\tBrocade Communications Systems LLC\n00:E0:53\t\tCellport Labs, Inc.\n00:E0:54\t\tKodai Hitec Co., Ltd.\n00:E0:55\t\tIngenieria Electronica Comercial Inelcom S.A.\n00:E0:56\t\tHolontech Corporation\n00:E0:57\t\tHan Microtelecom. Co., Ltd.\n00:E0:58\t\tPhase One Denmark A/S\n00:E0:59\t\tControlled Environments, Ltd.\n00:E0:5A\t\tGalea Network Security\n00:E0:5B\t\tWest End Systems Corp.\n00:E0:5C\t\tPHC Corporation\n00:E0:5D\t\tUnitec Co., Ltd.\n00:E0:5E\t\tJapan Aviation Electronics Industry, Ltd.\n00:E0:5F\t\te-Net, Inc.\n00:E0:60\t\tSherwood\n00:E0:61\t\tEdgePoint Networks, Inc.\n00:E0:62\t\tHost Engineering\n00:E0:63\t\tCabletron Systems, Inc.\n00:E0:64\t\tSamsung Electronics\n00:E0:65\t\tOptical Access International\n00:E0:66\t\tProMax Systems, Inc.\n00:E0:67\t\teac AUTOMATION-CONSULTING GmbH\n00:E0:68\t\tMerrimac Systems Inc.\n00:E0:69\t\tJaycor\n00:E0:6A\t\tKapsch Ag\n00:E0:6B\t\tW&G Special Products\n00:E0:6C\t\tUltra Electronics Command & Control Systems\n00:E0:6D\t\tCompuware Corporation\n00:E0:6E\t\tFAR SYSTEMS S.p.A.\n00:E0:6F\t\tCommscope\n00:E0:70\t\tDh Technology\n00:E0:71\t\tEpis Microcomputer\n00:E0:72\t\tLynk\n00:E0:73\t\tNational Amusement Network, Inc.\n00:E0:74\t\tTiernan Communications, Inc.\n00:E0:75\t\tVerilink Corporation\n00:E0:76\t\tDevelopment Concepts, Inc.\n00:E0:77\t\tWebgear, Inc.\n00:E0:78\t\tBerkeley Networks\n00:E0:79\t\tA.T.N.R.\n00:E0:7A\t\tMikrodidakt Ab\n00:E0:7B\t\tBay Networks\n00:E0:7C\t\tMettler-Toledo, Inc.\n00:E0:7D\t\tNetronix, Inc.\n00:E0:7E\t\tWalt Disney Imagineering\n00:E0:7F\t\tLOGISTISTEM s.r.l.\n00:E0:80\t\tControl Resources Corporation\n00:E0:81\t\tTyan Computer Corp.\n00:E0:82\t\tAnerma\n00:E0:83\t\tJato Technologies, Inc.\n00:E0:84\t\tCompulite R&D\n00:E0:85\t\tGlobal Maintech, Inc.\n00:E0:86\t\tEmerson Network Power, Avocent Division\n00:E0:87\t\tLeCroy - Networking Productions Division\n00:E0:88\t\tLTX-Credence CORPORATION\n00:E0:89\t\tION Networks, Inc.\n00:E0:8A\t\tGec Avery, Ltd.\n00:E0:8B\t\tQLogic Corporation\n00:E0:8C\t\tNeoparadigm Labs, Inc.\n00:E0:8D\t\tPressure Systems, Inc.\n00:E0:8E\t\tUtstarcom\n00:E0:8F\t\tCisco Systems, Inc\n00:E0:90\t\tBeckman Lab. Automation Div.\n00:E0:91\t\tLG Electronics\n00:E0:92\t\tAdmtek Incorporated\n00:E0:93\t\tAckfin Networks\n00:E0:94\t\tOsai Srl\n00:E0:95\t\tAdvanced-Vision Technolgies Corp.\n00:E0:96\t\tShimadzu Corporation\n00:E0:97\t\tCarrier Access Corporation\n00:E0:98\t\tAboCom\n00:E0:99\t\tSamson Ag\n00:E0:9A\t\tPositron Inc.\n00:E0:9B\t\tEngage Networks, Inc.\n00:E0:9C\t\tMii\n00:E0:9D\t\tSarnoff Corporation\n00:E0:9E\t\tQuantum Corporation\n00:E0:9F\t\tPixel Vision\n00:E0:A0\t\tWiltron Co.\n00:E0:A1\t\tHIMA PAUL HILDEBRANDT GmbH Co. KG\n00:E0:A2\t\tMicroslate Inc.\n00:E0:A3\t\tCisco Systems, Inc\n00:E0:A4\t\tESAOTE S.p.A.\n00:E0:A5\t\tComCore Semiconductor, Inc.\n00:E0:A6\t\tTelogy Networks, Inc.\n00:E0:A7\t\tIpc Information Systems, Inc.\n00:E0:A8\t\tSAT GmbH & Co.\n00:E0:A9\t\tFunai Electric Co., Ltd.\n00:E0:AA\t\tElectrosonic Ltd.\n00:E0:AB\t\tDimat S.A.\n00:E0:AC\t\tMidsco, Inc.\n00:E0:AD\t\tEes Technology, Ltd.\n00:E0:AE\t\tXaqti Corporation\n00:E0:AF\t\tGeneral Dynamics Information Systems\n00:E0:B0\t\tCisco Systems, Inc\n00:E0:B1\t\tAlcatel-Lucent Enterprise\n00:E0:B2\t\tTelmax Communications Corp.\n00:E0:B3\t\tEtherWAN Systems, Inc.\n00:E0:B4\t\tTechno Scope Co., Ltd.\n00:E0:B5\t\tArdent Communications Corp.\n00:E0:B6\t\tEntrada Networks\n00:E0:B7\t\tCosworth Electronics Ltd\n00:E0:B8\t\tGateway 2000\n00:E0:B9\t\tByas Systems\n00:E0:BA\t\tBERGHOF AUTOMATIONSTECHNIK GmbH\n00:E0:BB\t\tNbx Corporation\n00:E0:BC\t\tSymon Communications, Inc.\n00:E0:BD\t\tInterface Systems, Inc.\n00:E0:BE\t\tGenroco International, Inc.\n00:E0:BF\t\tTorrent Networking Technologies Corp.\n00:E0:C0\t\tSeiwa Electric Mfg. Co., Ltd.\n00:E0:C1\t\tMemorex Telex Japan, Ltd.\n00:E0:C2\t\tNECSY S.p.A.\n00:E0:C3\t\tSakai System Development Corp.\n00:E0:C4\t\tHorner Electric, Inc.\n00:E0:C5\t\tBcom Electronics Inc.\n00:E0:C6\t\tLink2It, L.L.C.\n00:E0:C7\t\tEurotech Srl\n00:E0:C8\t\tVirtual Access, Ltd.\n00:E0:C9\t\tAutomatedLogic Corporation\n00:E0:CA\t\tBest Data Products\n00:E0:CB\t\tReson, Inc.\n00:E0:CC\t\tHero Systems, Ltd.\n00:E0:CD\t\tSaab Sensis Corporation\n00:E0:CE\t\tArn\n00:E0:CF\t\tIntegrated Device\n00:E0:D0\t\tNetspeed, Inc.\n00:E0:D1\t\tTelsis Limited\n00:E0:D2\t\tVersanet Communications, Inc.\n00:E0:D3\t\tDATENTECHNIK GmbH\n00:E0:D4\t\tExcellent Computer\n00:E0:D5\t\tEmulex Corporation\n00:E0:D6\t\tComputer & Communication Research Lab.\n00:E0:D7\t\tSunshine Electronics, Inc.\n00:E0:D8\t\tLANBit Computer, Inc.\n00:E0:D9\t\tTazmo Co., Ltd.\n00:E0:DA\t\tAlcatel-Lucent Enterprise\n00:E0:DB\t\tViaVideo Communications, Inc.\n00:E0:DC\t\tNexware Corp.\n00:E0:DD\t\tZenith Electronics Corporation\n00:E0:DE\t\tDatax Nv\n00:E0:DF\t\tZhone Technologies, Inc.\n00:E0:E0\t\tSi Electronics, Ltd.\n00:E0:E1\t\tG2 Networks, Inc.\n00:E0:E2\t\tInnova Corp.\n00:E0:E3\t\tSk-Elektronik Gmbh\n00:E0:E4\t\tFANUC ROBOTICS NORTH AMERICA, Inc.\n00:E0:E5\t\tCinco Networks, Inc.\n00:E0:E6\t\tINCAA Computers\n00:E0:E7\t\tRaytheon E-Systems, Inc.\n00:E0:E8\t\tGRETACODER Data Systems AG\n00:E0:E9\t\tData Labs, Inc.\n00:E0:EA\t\tInnovat Communications, Inc.\n00:E0:EB\t\tDigicom Systems, Incorporated\n00:E0:EC\t\tCelestica Inc.\n00:E0:ED\t\tSilicom, Ltd.\n00:E0:EE\t\tMarel Hf\n00:E0:EF\t\tDionex\n00:E0:F0\t\tAbler Technology, Inc.\n00:E0:F1\t\tThat Corporation\n00:E0:F2\t\tArlotto Comnet, Inc.\n00:E0:F3\t\tWebSprint Communications, Inc.\n00:E0:F4\t\tINSIDE Technology A/S\n00:E0:F5\t\tTeles Ag\n00:E0:F6\t\tDecision Europe\n00:E0:F7\t\tCisco Systems, Inc\n00:E0:F8\t\tDicna Control Ab\n00:E0:F9\t\tCisco Systems, Inc\n00:E0:FA\t\tTrl Technology, Ltd.\n00:E0:FB\t\tLeightronix, Inc.\n00:E0:FC\t\tHuawei Technologies Co.,Ltd\n00:E0:FD\t\tA-Trend Technology Co., Ltd.\n00:E0:FE\t\tCisco Systems, Inc\n00:E0:FF\t\tSECURITY DYNAMICS TECHNOLOGIES, Inc.\n00:E1:2F\t\tHuawei Technologies Co.,Ltd\n00:E1:6D\t\tCisco Systems, Inc\n00:E1:75\t\tAK-Systems Ltd\n00:E1:8C\t\tIntel Corporate\n00:E2:2C\t\tChina Mobile Group Device Co.,Ltd.\n00:E3:B2\t\tSamsung Electronics Co.,Ltd\n00:E4:00\t\tSichuan Changhong Electric Ltd.\n00:E4:06\t\tHuawei Technologies Co.,Ltd\n00:E4:21\t\tSony Interactive Entertainment Inc.\n00:E5:E4\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n00:E5:F1\t\tBuffalo.Inc\n00:E6:0E\t\tExtreme Networks Headquarters\n00:E6:3A\t\tRuckus Wireless\n00:E6:66\t\tARIMA Communications Corp.\n00:E6:D3\t\tNixdorf Computer Corp.\n00:E6:E8\t\tNetzin Technology Corporation,.Ltd.\n00:E7:E3\t\tzte corporation\n00:E8:AB\t\tMeggitt Training Systems, Inc.\n00:E9:3A\t\tAzureWave Technology Inc.\n00:EA:BD\t\tCisco Systems, Inc\n00:EB:2D\t\tSony Corporation\n00:EB:D5\t\tCisco Systems, Inc\n00:EB:D8\t\tMercusys Technologies Co., Ltd.\n00:EC:0A\t\tXiaomi Communications Co Ltd\n00:ED:B8\t\tKYOCERA Corporation\n00:EE:01\t\tEnablers Solucoes e Consultoria em Dispositivos\n00:EE:AB\t\tCisco Systems, Inc\n00:EE:BD\t\tHTC Corporation\n00:F0:51\t\tKWB Gmbh\n00:F2:2C\t\tShanghai B-star Technology Co.,Ltd.\n00:F2:8B\t\tCisco Systems, Inc\n00:F3:61\t\tAmazon Technologies Inc.\n00:F3:9F\t\tApple, Inc.\n00:F3:DB\t\tWOO Sports\n00:F4:03\t\tOrbis Systems Oy\n00:F4:6F\t\tSamsung Electronics Co.,Ltd\n00:F4:8D\t\tLiteon Technology Corporation\n00:F4:B9\t\tApple, Inc.\n00:F5:FD\t\tHuawei Technologies Co.,Ltd\n00:F6:20\t\tGoogle, Inc.\n00:F6:63\t\tCisco Systems, Inc\n00:F7:6F\t\tApple, Inc.\n00:F7:AD\t\tHuawei Technologies Co.,Ltd\n00:F8:1C\t\tHuawei Technologies Co.,Ltd\n00:F8:2C\t\tCisco Systems, Inc\n00:F8:60\t\tPT. Panggung Electric Citrabuana\n00:F8:71\t\tDemant A/S\n00:F8:CC\t\tSagemcom Broadband SAS\n00:F9:52\t\tHuawei Technologies Co.,Ltd\n00:FA:21\t\tSamsung Electronics Co.,Ltd\n00:FA:3B\t\tCloos Electronic Gmbh\n00:FA:B6\t\tKontakt Micro-Location Sp z o.o.\n00:FA:DE\t\tMotorola Mobility LLC, a Lenovo Company\n00:FB:F9\t\tAxiado Corporation\n00:FC:58\t\tWebSilicon Ltd.\n00:FC:70\t\tIntrepid Control Systems, Inc.\n00:FC:8B\t\tAmazon Technologies Inc.\n00:FC:8D\t\tHitron Technologies. Inc\n00:FC:BA\t\tCisco Systems, Inc\n00:FD:22\t\tCisco Systems, Inc\n00:FD:45\t\tHewlett Packard Enterprise\n00:FD:4C\t\tNevatec\n00:FE:C8\t\tCisco Systems, Inc\n02:07:01\t\tRacal-Datacom\n02:1C:7C\t\tPerq Systems Corporation\n02:60:86\t\tLogic Replacement Tech. Ltd.\n02:60:8C\t\t3Com\n02:70:01\t\tRacal-Datacom\n02:70:B0\t\tM/A-Com Inc. Companies\n02:70:B3\t\tData Recall Ltd.\n02:9D:8E\t\tCardiac Recorders, Inc.\n02:AA:3C\t\tOlivetti Telecomm Spa (Olteco)\n02:BB:01\t\tOctothorpe Corp.\n02:C0:8C\t\t3Com\n02:CF:1C\t\tCommunication Machinery Corporation\n02:E6:D3\t\tNixdorf Computer Corp.\n04:00:67\t\tStanley Black & Decker\n04:00:6E\t\tGoogle, Inc.\n04:01:A1\t\tFortinet, Inc.\n04:01:BB\t\tTecno Mobile Limited\n04:02:1F\t\tHuawei Technologies Co.,Ltd\n04:02:CA\t\tShenzhen Vtsonic Co.,ltd\n04:03:12\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n04:03:D6\t\tNintendo Co.,Ltd\n04:04:B8\t\tChina Hualu Panasonic AVC Networks Co., LTD.\n04:04:EA\t\tValens Semiconductor Ltd.\n04:05:DD\t\tShenzhen Cultraview Digital Technology Co., Ltd\n04:07:2E\t\tVTech Electronics Ltd.\n04:09:73\t\tHewlett Packard Enterprise\n04:09:86\t\tArcadyan Corporation\n04:09:A5\t\tHFR, Inc.\n04:0A:83\t\tAlcatel-Lucent\n04:0A:E0\t\tXmit Ag Computer Networks\n04:0C:CE\t\tApple, Inc.\n04:0D:84\t\tSilicon Laboratories\n04:0E:3C\t\tHP Inc.\n04:0E:C2\t\tViewSonic Mobile China Limited\n04:0F:66\t\tTP-Link Systems Inc.\n04:10:6B\t\tXiaomi Communications Co Ltd\n04:11:19\t\tIEEE Registration Authority\n04:11:19:00:00:00/28\tFORT Robotics Inc.\n04:11:19:10:00:00/28\tAcentury\n04:11:19:20:00:00/28\tAlethea Communications Technologies Pvt. Ltd.\n04:11:19:30:00:00/28\tSuzhou Ribao Technology Co.,Ltd.\n04:11:19:40:00:00/28\tBolicom Innovation Technology (BeiJing) Co.,LTD.\n04:11:19:50:00:00/28\tCeita Communication Technology Co.,Ltd\n04:11:19:60:00:00/28\tZPD technology Co., Ltd\n04:11:19:70:00:00/28\tHerrick Tech Labs\n04:11:19:80:00:00/28\tShenzhen YIZHENG Technology Co.,Ltd\n04:11:19:90:00:00/28\tAC Power Distribution / ACT Entmt.\n04:11:19:A0:00:00/28\tCyOne Security AG\n04:11:19:B0:00:00/28\tHubei Baobao Intelligent Technology Co.,LTD\n04:11:19:C0:00:00/28\tHaerbin Donglin Technology Co., Ltd.\n04:11:19:D0:00:00/28\tNuance Hearing Ltd.\n04:11:19:E0:00:00/28\tJulida Limited\n04:13:7A\t\tApple, Inc.\n04:14:71\t\tHuawei Technologies Co.,Ltd\n04:15:52\t\tApple, Inc.\n04:15:D9\t\tViwone\n04:17:B6\t\tSmart Innovation LLC\n04:18:0F\t\tSamsung Electronics Co.,Ltd\n04:18:92\t\tHuawei Technologies Co.,Ltd\n04:18:B6\t\tPrivate\n04:18:D6\t\tUbiquiti Inc\n04:19:7F\t\tGrasphere Japan\n04:1A:04\t\tWaveIP\n04:1B:6D\t\tLG Electronics (Mobile Communications)\n04:1B:94\t\tHost Mobility AB\n04:1B:BA\t\tSamsung Electronics Co.,Ltd\n04:1D:10\t\tDream Ware Inc.\n04:1D:C7\t\tzte corporation\n04:1E:64\t\tApple, Inc.\n04:1E:7A\t\tDSPWorks\n04:1E:FA\t\tBISSELL Homecare, Inc.\n04:1F:B8\t\tvivo Mobile Communication Co., Ltd.\n04:20:84\t\tzte corporation\n04:20:8A\t\t浙江路川科技有限公司\n04:20:9A\t\tPanasonic Corporation AVC Networks Company\n04:21:44\t\tSunitec Enterprise Co.,Ltd\n04:21:4C\t\tInsight Energy Ventures LLC\n04:22:34\t\tWireless Standard Extensions\n04:23:22\t\tTexas Instruments\n04:25:C5\t\tHuawei Technologies Co.,Ltd\n04:25:E0\t\tTaicang T&W Electronics\n04:25:E8\t\tTexas Instruments\n04:25:F0\t\tNokia\n04:26:05\t\tBosch Building Automation GmbH\n04:26:65\t\tApple, Inc.\n04:27:28\t\tMicrosoft Corporation\n04:27:58\t\tHuawei Technologies Co.,Ltd\n04:29:2E\t\tSamsung Electronics Co.,Ltd\n04:2A:E2\t\tCisco Systems, Inc\n04:2B:58\t\tShenzhen Hanzsung Technology Co.,Ltd\n04:2B:BB\t\tPicoCELA, Inc.\n04:2D:AD\t\tAreus GmbH\n04:2D:B4\t\tFirst Property (Beijing) Co., Ltd Modern MOMA Branch\n04:2F:56\t\tATOCS (Shenzhen) LTD\n04:31:10\t\tInspur Group Co., Ltd.\n04:32:01\t\tBroadcom Limited\n04:32:F4\t\tPartron\n04:33:1F\t\tHuawei Device Co., Ltd.\n04:33:85\t\tNanchang BlackShark Co.,Ltd.\n04:33:89\t\tHuawei Technologies Co.,Ltd\n04:33:C2\t\tIntel Corporate\n04:34:C3\t\tQingdao Goertek  Horizons Tecnology  Co.,LTD\n04:34:F6\t\tMotorola (Wuhan) Mobility Technologies Communication Co., Ltd.\n04:35:9B\t\tWuLu Networks Pty Ltd\n04:36:04\t\tGyeyoung I&T\n04:36:B8\t\tI&C Technology\n04:38:55\t\tScopus International Pvt. Ltd.\n04:38:DC\t\tChina Unicom Online Information Technology Co.,Ltd\n04:39:26\t\tChina Dragon Technology Limited\n04:3A:0D\t\tSM Optics S.r.l.\n04:3C:E8\t\tShenzhen SuperElectron Technology Co.,Ltd.\n04:3D:6E\t\tNokia\n04:3D:98\t\tChongQing QingJia Electronics CO.,LTD\n04:3F:72\t\tMellanox Technologies, Inc.\n04:40:A9\t\tNew H3C Technologies Co., Ltd\n04:41:69\t\tGoPro\n04:41:A5\t\tApple, Inc.\n04:42:1A\t\tASUSTek COMPUTER INC.\n04:43:FD\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n04:44:A1\t\tTelecon Galicia,S.A.\n04:45:62\t\tANDRA Sp. z o. o.\n04:45:A1\t\tNIRIT- Xinwei  Telecom Technology Co., Ltd.\n04:46:65\t\tMurata Manufacturing Co., Ltd.\n04:46:CF\t\tBeijing Venustech Cybervision Co.,Ltd.\n04:47:07\t\tTexas Instruments\n04:47:2A\t\tPalo Alto Networks\n04:47:CA\t\tGree Electric Appliances, Inc. Of Zhuhai\n04:48:9A\t\tApple, Inc.\n04:49:5D\t\tHuawei Device Co., Ltd.\n04:4A:50\t\tRamaxel Technology (Shenzhen) limited company\n04:4A:69\t\tShenzhen Phaten Tech. LTD\n04:4A:6A\t\tniliwi nanjing big data Co,.Ltd\n04:4A:6C\t\tHuawei Technologies Co.,Ltd\n04:4A:C6\t\tAipon Electronics Co., Ltd\n04:4B:A5\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\n04:4B:B1\t\tHuawei Device Co., Ltd.\n04:4B:ED\t\tApple, Inc.\n04:4B:FF\t\tGuangZhou Hedy Digital Technology Co., Ltd\n04:4C:EF\t\tFujian Sanao Technology Co.,Ltd\n04:4E:06\t\tEricsson AB\n04:4E:5A\t\tCommscope\n04:4E:AF\t\tLG Innotek\n04:4F:17\t\tHUMAX Co., Ltd.\n04:4F:4C\t\tHuawei Technologies Co.,Ltd\n04:4F:7A\t\tChina Mobile Group Device Co.,Ltd.\n04:4F:8B\t\tAdapteva, Inc.\n04:4F:AA\t\tRuckus Wireless\n04:50:DA\t\tQiku Internet Network Scientific (Shenzhen) Co., Ltd\n04:51:70\t\tZhongshan K-mate General Electronics Co.,Ltd\n04:52:C7\t\tBose Corporation\n04:52:F3\t\tApple, Inc.\n04:53:D5\t\tSysorex Global Holdings\n04:54:53\t\tApple, Inc.\n04:55:B2\t\tHuaqin Technology Co.,Ltd\n04:55:B8\t\tHuawei Technologies Co.,Ltd\n04:55:CA\t\tBriView (Xiamen) Corp.\n04:56:04\t\tGionee Communication Equipment Co.,Ltd.\n04:56:65\t\tNokia Shanghai Bell Co., Ltd.\n04:56:E5\t\tIntel Corporate\n04:57:2F\t\tSertel Electronics UK Ltd\n04:57:47\t\tGoPro\n04:57:91\t\tShenzhenshi Xinzhongxin Technology Co.Ltd\n04:58:5D\t\tIEEE Registration Authority\n04:58:5D:00:00:00/28\tWetatronics Limited\n04:58:5D:10:00:00/28\tResearch Laboratory of Design Automation, Ltd.\n04:58:5D:20:00:00/28\tFoxconn Brasil Industria e Comercio Ltda\n04:58:5D:30:00:00/28\tREXXON GmbH\n04:58:5D:40:00:00/28\tIntegrated Technical Vision Ltd\n04:58:5D:50:00:00/28\tSercomm Japan Corporation\n04:58:5D:60:00:00/28\tVERTE Elektronik San. Ve Tic. A.Ş.\n04:58:5D:70:00:00/28\tHKC Security Ltd.\n04:58:5D:80:00:00/28\tJrk Vision\n04:58:5D:90:00:00/28\tDron Edge India Private Limited\n04:58:5D:A0:00:00/28\tTeleplatforms\n04:58:5D:B0:00:00/28\tChengdu Juxun Electronic Technology Co.,Ltd\n04:58:5D:C0:00:00/28\tRexon Technology\n04:58:5D:D0:00:00/28\tHDS Otomasyon Güvenlik ve Yazılım Teknolojileri Sanayi Ticaret Limited Şirketi\n04:58:5D:E0:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n04:58:6F\t\tSichuan Whayer information industry Co.,LTD\n04:5A:95\t\tNokia Corporation\n04:5C:06\t\tZmodo Technology Corporation\n04:5C:6C\t\tJuniper Networks\n04:5C:8E\t\tgosund GROUP CO.,LTD\n04:5D:4B\t\tSony Corporation\n04:5D:56\t\tcamtron industrial inc.\n04:5E:A4\t\tNetis Technology Co., Ltd.\n04:5F:A7\t\tShenzhen Yichen Technology Development Co.,LTD\n04:5F:B9\t\tCisco Systems, Inc\n04:61:69\t\tMedia Global Links Co., Ltd.\n04:62:73\t\tCisco Systems, Inc\n04:62:D7\t\tAlstom Hydro France\n04:63:D0\t\tHuawei Device Co., Ltd.\n04:63:E0\t\tNome Oy\n04:65:65\t\tTestop\n04:67:61\t\tBeijing Xiaomi Mobile Software Co., Ltd\n04:67:85\t\tscemtec Hard- und Software fuer Mess- und Steuerungstechnik GmbH\n04:68:65\t\tApple, Inc.\n04:68:74\t\tCloud Network Technology Singapore Pte. Ltd.\n04:69:8F\t\tJuniper Networks\n04:69:F8\t\tApple, Inc.\n04:6B:1B\t\tSYSDINE Co., Ltd.\n04:6B:25\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n04:6C:59\t\tIntel Corporate\n04:6C:9D\t\tCisco Systems, Inc\n04:6D:42\t\tBryston Ltd.\n04:6E:02\t\tOpenRTLS Group\n04:6E:49\t\tTaiYear Electronic Technology (Suzhou) Co., Ltd\n04:6E:CB\t\tzte corporation\n04:70:56\t\tArcadyan Corporation\n04:70:BC\t\tGlobalstar Inc.\n04:71:4B\t\tIEEE Registration Authority\n04:71:4B:00:00:00/28\tNeurio Technology Inc.\n04:71:4B:10:00:00/28\tuAvionix Corporation\n04:71:4B:20:00:00/28\tShenzhen WayOS Technology Crop., Ltd.\n04:71:4B:30:00:00/28\tGriesser Electronic AG\n04:71:4B:40:00:00/28\tApparatebau Gauting GmbH\n04:71:4B:50:00:00/28\tBureau Electronique Appliquee\n04:71:4B:60:00:00/28\tArmstrong Fluid Technology\n04:71:4B:70:00:00/28\tOmylis Pte Ltd\n04:71:4B:80:00:00/28\tEnergport Inc\n04:71:4B:90:00:00/28\tLighthouse AI, Inc\n04:71:4B:A0:00:00/28\tObservables, Inc.\n04:71:4B:B0:00:00/28\tDigibest Technology Co., Ltd.\n04:71:4B:C0:00:00/28\tKittyHawk Corporation\n04:71:4B:D0:00:00/28\tShenzhen BoClouds Technology Co.,Ltd.\n04:71:4B:E0:00:00/28\tGimso Mobile Ltd\n04:71:53\t\tSernet (Suzhou) Technologies Corporation\n04:72:95\t\tApple, Inc.\n04:74:9E\t\tHuawei Technologies Co.,Ltd\n04:74:A1\t\tAligera Equipamentos Digitais Ltda\n04:75:03\t\tHuawei Technologies Co.,Ltd\n04:75:F5\t\tCsst\n04:75:F9\t\tTaicang T&W Electronics\n04:76:6E\t\tAlpsalpine Co,.Ltd\n04:76:B0\t\tCisco Systems, Inc\n04:78:63\t\tShanghai MXCHIP Information Technology Co., Ltd.\n04:79:70\t\tHuawei Technologies Co.,Ltd\n04:79:75\t\tHonor Device Co., Ltd.\n04:79:B7\t\tTexas Instruments\n04:79:FD\t\tCiena Corporation\n04:7A:0B\t\tBeijing Xiaomi Electronics Co., Ltd.\n04:7A:AE\t\tHuawei Device Co., Ltd.\n04:7B:CB\t\tUniversal Global Scientific Industrial Co., Ltd.\n04:7C:16\t\tMicro-Star INTL CO., LTD.\n04:7D:50\t\tShenzhen Kang Ying Technology Co.Ltd.\n04:7D:7B\t\tQuanta Computer Inc.\n04:7E:23\t\tChina Mobile IOT Company Limited\n04:7E:4A\t\tmoobox CO., Ltd.\n04:7F:0E\t\tBarrot Technology Co.,LTD\n04:80:A7\t\tShenZhen TianGang Micro Technology CO.LTD\n04:81:9B\t\tSky Uk Limited\n04:81:AE\t\tClack Corporation\n04:83:08\t\tEspressif Inc.\n04:84:8A\t\t7Inova Technology Limited\n04:86:80\t\tQuectel Wireless Solutions Co.,Ltd.\n04:87:27\t\tSilicon Laboratories\n04:88:5F\t\tHuawei Technologies Co.,Ltd\n04:88:8C\t\tEifelwerk Butler Systeme GmbH\n04:88:E2\t\tBeats Electronics LLC\n04:8A:15\t\tAvaya Inc\n04:8A:E1\t\tFlextronics Manufacturing(Zhuhai)Co.,Ltd.\n04:8B:42\t\tSkspruce Technologies\n04:8C:03\t\tThinPAD Technology (Shenzhen)CO.,LTD\n04:8C:16\t\tHuawei Technologies Co.,Ltd\n04:8C:9A\t\tHuawei Device Co., Ltd.\n04:8D:38\t\tNetis Technology Co., Ltd.\n04:8F:00\t\tRong-Paisa Electronics Co., Ltd.\n04:90:81\t\tPensando Systems, Inc.\n04:90:C0\t\tForvia\n04:91:62\t\tMicrochip Technology Inc.\n04:92:26\t\tASUSTek COMPUTER INC.\n04:92:EE\t\tiway AG\n04:94:6B\t\tTecno Mobile Limited\n04:94:A1\t\tCatch The Wind Inc\n04:94:E9\t\tFAXedge Technologies, LLC\n04:95:73\t\tzte corporation\n04:95:E6\t\tTenda Technology Co.,Ltd.Dongguan branch\n04:96:45\t\tWuxi Sky Chip Interconnection Technology Co.,Ltd.\n04:97:90\t\tLartech telecom LLC\n04:98:1C\t\tNingbo Zhixiang Technology Co., Ltd\n04:98:F3\t\tAlpsalpine Co,.Ltd\n04:99:B9\t\tApple, Inc.\n04:99:BB\t\tApple, Inc.\n04:99:E6\t\tShenzhen Yoostar Technology Co., Ltd\n04:9B:9C\t\tEadingcore  Intelligent Technology Co., Ltd.\n04:9C:62\t\tBMT Medical Technology s.r.o.\n04:9D:05\t\tApple, Inc.\n04:9D:FE\t\tHivesystem\n04:9F:06\t\tSmobile Co., Ltd.\n04:9F:15\t\tHumane\n04:9F:81\t\tNetscout Systems Inc\n04:9F:CA\t\tHuawei Technologies Co.,Ltd\n04:A1:51\t\tNetgear\n04:A1:6F\t\tIEEE Registration Authority\n04:A1:6F:00:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n04:A1:6F:10:00:00/28\tiENSO Inc.\n04:A1:6F:20:00:00/28\tSuzhou Lianshichuangzhi Technology Co.,Ltd\n04:A1:6F:30:00:00/28\tCrypto4A Technologies\n04:A1:6F:40:00:00/28\tXiamen Akubela Innovation Technology CO., Ltd.\n04:A1:6F:50:00:00/28\tDOM Security\n04:A1:6F:60:00:00/28\tGy-Fx Sas\n04:A1:6F:70:00:00/28\tNDW Rollers B.V.\n04:A1:6F:80:00:00/28\tAnnapurna labs\n04:A1:6F:90:00:00/28\tChongqing Jinmei Automotive Electronics co.,Ltd.\n04:A1:6F:A0:00:00/28\tUyar Group\n04:A1:6F:B0:00:00/28\tChroma-Q\n04:A1:6F:C0:00:00/28\tBroadband International\n04:A1:6F:D0:00:00/28\tZettlab Innovation Technology CO.,LTD\n04:A1:6F:E0:00:00/28\tGajShield Infotech India Pvt. Ltd.\n04:A2:22\t\tArcadyan Corporation\n04:A2:F3\t\tFiberhome Telecommunication Technologies Co.,LTD\n04:A3:16\t\tTexas Instruments\n04:A3:F3\t\tEmicon\n04:A5:26\t\tNokia\n04:A7:41\t\tCisco Systems, Inc\n04:A8:1C\t\tHuawei Technologies Co.,Ltd\n04:A8:2A\t\tNokia Corporation\n04:A8:5A\t\tSz Dji Technology Co.,Ltd\n04:A9:59\t\tNew H3C Technologies Co., Ltd\n04:AA:E1\t\tBeijing Microvision Technology Co.,Ltd\n04:AB:08\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n04:AB:18\t\tElecom Co.,Ltd.\n04:AB:6A\t\tChun-il Co.,Ltd.\n04:AC:44\t\tHoltek Semiconductor Inc.\n04:AE:C7\t\tMarquardt\n04:B0:66\t\tPrivate\n04:B0:E7\t\tHuawei Technologies Co.,Ltd\n04:B1:67\t\tXiaomi Communications Co Ltd\n04:B1:A1\t\tSamsung Electronics Co.,Ltd\n04:B3:B6\t\tSeamap (UK) Ltd\n04:B4:29\t\tSamsung Electronics Co.,Ltd\n04:B4:66\t\tBSP Co., Ltd.\n04:B4:FE\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n04:B5:C1\t\tItel Mobile Limited\n04:B6:48\t\tZenner\n04:B6:BE\t\tCig Shanghai Co Ltd\n04:B8:6A\t\tSky Uk Limited\n04:B9:7D\t\tAiVIS Co., Itd.\n04:B9:E3\t\tSamsung Electronics Co.,Ltd\n04:BA:1C\t\tHuawei Device Co., Ltd.\n04:BA:36\t\tLi Seng Technology Ltd\n04:BA:8D\t\tSamsung Electronics Co.,Ltd\n04:BA:D6\t\tD-Link Corporation\n04:BB:F9\t\tPavilion Data Systems Inc\n04:BC:6D\t\tApple, Inc.\n04:BC:87\t\tShenzhen JustLink Technology Co., LTD\n04:BC:9F\t\tCalix Inc.\n04:BD:70\t\tHuawei Technologies Co.,Ltd\n04:BD:88\t\tHewlett Packard Enterprise\n04:BD:97\t\tCisco Systems, Inc\n04:BD:BF\t\tSamsung Electronics Co.,Ltd\n04:BE:58\t\tHuawei Technologies Co.,Ltd\n04:BF:1B\t\tDell Inc.\n04:BF:6D\t\tZyxel Communications Corporation\n04:BF:A8\t\tISB Corporation\n04:BF:D5\t\tApple, Inc.\n04:C0:5B\t\tTigo Energy\n04:C0:6F\t\tHuawei Technologies Co.,Ltd\n04:C0:9C\t\tTellabs Inc.\n04:C1:03\t\tClover Network, Inc.\n04:C1:B9\t\tFiberhome Telecommunication Technologies Co.,LTD\n04:C1:D8\t\tHuawei Device Co., Ltd.\n04:C2:3E\t\tHTC Corporation\n04:C2:41\t\tNokia\n04:C2:9B\t\tAura Home, Inc.\n04:C3:E6\t\tIEEE Registration Authority\n04:C3:E6:00:00:00/28\tDreamkas Llc\n04:C3:E6:10:00:00/28\tGuangdong New Pulse Electric Co., Ltd.\n04:C3:E6:20:00:00/28\tSiS Technology\n04:C3:E6:30:00:00/28\tExtech Electronics Co., LTD.\n04:C3:E6:40:00:00/28\tInnovusion Inc.\n04:C3:E6:50:00:00/28\tInvasys\n04:C3:E6:60:00:00/28\tShenzhen Shuotian Information Technology Co., LTD\n04:C3:E6:70:00:00/28\tAdvanced Digital Technologies, s.r.o.\n04:C3:E6:80:00:00/28\tSLOC GmbH\n04:C3:E6:90:00:00/28\tEkin Teknoloji San ve Tic A.S.\n04:C3:E6:A0:00:00/28\tSealed Unit Parts Co., Inc.\n04:C3:E6:B0:00:00/28\tFlintec UK Ltd.\n04:C3:E6:C0:00:00/28\tShantou Yingsheng Import & Export Trading Co.,Ltd.\n04:C3:E6:D0:00:00/28\tAmiosec Ltd\n04:C3:E6:E0:00:00/28\tGreat Talent Technology Limited\n04:C4:61\t\tMurata Manufacturing Co., Ltd.\n04:C5:A4\t\tCisco Systems, Inc\n04:C8:07\t\tXiaomi Communications Co Ltd\n04:C8:45\t\tTP-Link Systems Inc.\n04:C8:80\t\tSamtec Inc\n04:C9:8B\t\tIEEE Registration Authority\n04:C9:8B:00:00:00/28\tSernet (Suzhou) Technologies Corporation\n04:C9:8B:10:00:00/28\tTinyPilot, LLC\n04:C9:8B:20:00:00/28\tMoog Inc\n04:C9:8B:30:00:00/28\tShenZhen Link-High Technology CO.,LIMITED\n04:C9:8B:40:00:00/28\tAnnapurna labs\n04:C9:8B:50:00:00/28\tSolana Mobile Inc.\n04:C9:8B:60:00:00/28\tAnnapurna labs\n04:C9:8B:70:00:00/28\tOpex Corporation\n04:C9:8B:80:00:00/28\tDelta Networks (Xiamen) Limited\n04:C9:8B:90:00:00/28\tBeijing BOE optoelectronic Technology Co. Ltd\n04:C9:8B:A0:00:00/28\tSecury360\n04:C9:8B:B0:00:00/28\tFreedom Factory\n04:C9:8B:C0:00:00/28\tRovox Solutions Sdn Bhd\n04:C9:8B:D0:00:00/28\tShenzhen Xiangrui Shixian Technology Co., Ltd.\n04:C9:8B:E0:00:00/28\tAgile Workspace Limited\n04:C9:91\t\tPhistek INC.\n04:C9:D9\t\tDish Technologies Corp\n04:CA:8D\t\tEnfabrica\n04:CA:ED\t\tHuawei Technologies Co.,Ltd\n04:CB:01\t\tSamsung Electronics Co.,Ltd\n04:CB:1D\t\tTraka plc\n04:CB:88\t\tShenzhen Jingxun Software Telecommunication Technology Co.,Ltd\n04:CC:BC\t\tHuawei Technologies Co.,Ltd\n04:CD:15\t\tSilicon Laboratories\n04:CD:C0\t\tMist Systems, Inc.\n04:CE:09\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n04:CE:14\t\tWilocity LTD.\n04:CE:7E\t\tNXP France Semiconductors France\n04:CF:25\t\tManycolors, Inc.\n04:CF:4B\t\tIntel Corporate\n04:CF:8C\t\tXIAOMI Electronics,CO.,LTD\n04:D1:3A\t\tXiaomi Communications Co Ltd\n04:D1:68\t\tSunplus Technology Co., Ltd.\n04:D1:6E\t\tIEEE Registration Authority\n04:D1:6E:00:00:00/28\tINTRIPLE, a.s.\n04:D1:6E:10:00:00/28\tLaunch Tech Co., Ltd.\n04:D1:6E:20:00:00/28\ts.d.i. s.p.a.\n04:D1:6E:30:00:00/28\tBeijing Huaxia Qixin Technology Co., Ltd.\n04:D1:6E:40:00:00/28\tShenZhen Huafu Information technology Co.?Ltd\n04:D1:6E:50:00:00/28\tDspread Technology (Beijing) Inc.\n04:D1:6E:60:00:00/28\tETL Elektrotechnik Lauter GmbH\n04:D1:6E:70:00:00/28\tEnvision Energy\n04:D1:6E:80:00:00/28\tChengdu Interlink Science And Technology Co.,Ltd\n04:D1:6E:90:00:00/28\tFuzhou Zhuoyi Electronic Co.,Ltd\n04:D1:6E:A0:00:00/28\tMetra Electronics\n04:D1:6E:B0:00:00/28\tNational Radio & Telecommunication Corporation - NRTC\n04:D1:6E:C0:00:00/28\tPacPort Corporation\n04:D1:6E:D0:00:00/28\tElotec Fischer Elektronik GmbH\n04:D1:6E:E0:00:00/28\tEvolute Systems Private Limited\n04:D1:90\t\tKaon Group Co., Ltd.\n04:D3:20\t\tItel Mobile Limited\n04:D3:95\t\tMotorola Mobility LLC, a Lenovo Company\n04:D3:B0\t\tIntel Corporate\n04:D3:B5\t\tHuawei Device Co., Ltd.\n04:D3:CF\t\tApple, Inc.\n04:D4:37\t\tZnv\n04:D4:42\t\tGuangdong Genius Technology Co., Ltd.\n04:D4:C4\t\tASUSTek COMPUTER INC.\n04:D5:90\t\tFortinet, Inc.\n04:D6:0E\t\tFunai Electric Co., Ltd.\n04:D6:AA\t\tSamsung Electro-Mechanics(Thailand)\n04:D6:F4\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n04:D7:83\t\tY&H E&C Co.,LTD.\n04:D7:A5\t\tNew H3C Technologies Co., Ltd\n04:D9:21\t\tOccuspace\n04:D9:C8\t\tHon Hai Precision Industry Co., Ltd.\n04:D9:F5\t\tASUSTek COMPUTER INC.\n04:DA:28\t\tChongqing Zhouhai Intelligent Technology Co., Ltd\n04:DA:D2\t\tCisco Systems, Inc\n04:DB:56\t\tApple, Inc.\n04:DB:8A\t\tSuntech International Ltd.\n04:DD:4C\t\tVelocytech\n04:DE:DB\t\tRockport Networks Inc\n04:DE:F2\t\tShenzhen ECOM Technology Co. Ltd\n04:DF:69\t\tCar Connectivity Consortium\n04:E0:B0\t\tShenzhen YOUHUA Technology Co., Ltd\n04:E0:C4\t\tTriumph-Adler Ag\n04:E1:C8\t\tIMS Soluções em Energia Ltda.\n04:E2:29\t\tQingdao Haier Technology Co.,Ltd\n04:E2:F8\t\tAEP Ticketing solutions srl\n04:E3:1A\t\tSagemcom Broadband SAS\n04:E3:87\t\tCisco Systems, Inc\n04:E3:C8\t\tFujian Star-Net Communication Co.,Ltd\n04:E3:E5\t\tSilicon Laboratories\n04:E4:51\t\tTexas Instruments\n04:E4:B6\t\tSamsung Electronics Co.,Ltd\n04:E5:36\t\tApple, Inc.\n04:E5:48\t\tCohda Wireless Pty Ltd\n04:E5:6E\t\tTHUB Co., ltd.\n04:E5:98\t\tXiaomi Communications Co Ltd\n04:E6:62\t\tAcroname Inc.\n04:E6:76\t\tAMPAK Technology, Inc.\n04:E6:9E\t\tZhongguancun Xinhaizeyou Technology Co.,Ltd\n04:E7:7E\t\tWe Corporation Inc.\n04:E7:95\t\tHuawei Technologies Co.,Ltd\n04:E8:92\t\tShennan Circuits Co.,Ltd\n04:E8:B9\t\tIntel Corporate\n04:E9:E5\t\tPjrc.Com, Llc\n04:EA:56\t\tIntel Corporate\n04:EB:40\t\tCisco Systems, Inc\n04:EC:BB\t\tFiberhome Telecommunication Technologies Co.,LTD\n04:EC:D8\t\tIntel Corporate\n04:ED:33\t\tIntel Corporate\n04:ED:62\t\tDaikin Europe NV\n04:EE:03\t\tTexas Instruments\n04:EE:91\t\tx-fabric GmbH\n04:EE:E8\t\tIEEE Registration Authority\n04:EE:E8:00:00:00/28\tZoomlion Huanuo(Beijing)Technology Co.,Ltd\n04:EE:E8:10:00:00/28\tShanghai ZLAN Information Technology Co.,Ltd\n04:EE:E8:20:00:00/28\tHengke Technology Industry Co., Ltd.\n04:EE:E8:30:00:00/28\tFluid Management Technology\n04:EE:E8:40:00:00/28\tShenzhen Daotong Technology Co.,Ltd\n04:EE:E8:50:00:00/28\tRealWear\n04:EE:E8:60:00:00/28\tNalssen Inc.\n04:EE:E8:70:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n04:EE:E8:80:00:00/28\tMPEON Co.,Ltd\n04:EE:E8:90:00:00/28\tPrivacy Hero\n04:EE:E8:A0:00:00/28\tShenzhen JoiningFree Technology Co.,Ltd\n04:EE:E8:B0:00:00/28\tHunan Yaguan Communication Technology Co.,Ltd\n04:EE:E8:C0:00:00/28\tdaishin\n04:EE:E8:D0:00:00/28\tShenzhen Topwell Technology Co., Ltd.\n04:EE:E8:E0:00:00/28\tBest Integration Technology Co., Ltd.\n04:EE:EE\t\tLaplace System Co., Ltd.\n04:F0:21\t\tCompex Systems Pte Ltd\n04:F0:3E\t\tHuawei Device Co., Ltd.\n04:F0:E4\t\tShenZhen Hosecom Electronic Technology Co.,LTD\n04:F0:EE\t\tIntel Corporate\n04:F1:28\t\tHMD Global Oy\n04:F1:3E\t\tApple, Inc.\n04:F1:69\t\tHuawei Device Co., Ltd.\n04:F1:7D\t\tTarana Wireless\n04:F3:52\t\tHuawei Technologies Co.,Ltd\n04:F4:1C\t\tRouterboard.com\n04:F4:BC\t\tXena Networks\n04:F4:D8\t\tHui Zhou Gaoshengda Technology Co.,LTD\n04:F5:F4\t\tProxim Wireless\n04:F7:78\t\tSony Interactive Entertainment Inc.\n04:F7:E4\t\tApple, Inc.\n04:F8:C2\t\tFlaircomm Microelectronics, Inc.\n04:F8:F8\t\tEdgecore Networks Corporation\n04:F9:38\t\tHuawei Technologies Co.,Ltd\n04:F9:93\t\tInfinix mobility limited\n04:F9:D9\t\tSpeaker Electronic(Jiashan) Co.,Ltd\n04:F9:F8\t\tTp-Link Technologies Co.,Ltd.\n04:FA:3F\t\tOptiCore Inc.\n04:FA:83\t\tQingdao Haier Technology Co.,Ltd\n04:FD:E8\t\tTechnoalpin\n04:FE:31\t\tSamsung Electronics Co.,Ltd\n04:FE:7F\t\tCisco Systems, Inc\n04:FE:8D\t\tHuawei Technologies Co.,Ltd\n04:FE:A1\t\tFihonest communication co.,Ltd\n04:FF:08\t\tHuawei Device Co., Ltd.\n04:FF:51\t\tNovamedia Innovision Sp. Z O.O.\n08:00:01\t\tComputervision Corporation\n08:00:02\t\tBridge Communications Inc.\n08:00:03\t\tAdvanced Computer Comm.\n08:00:04\t\tCromemco Incorporated\n08:00:05\t\tSymbolics Inc.\n08:00:06\t\tSiemens Ag\n08:00:07\t\tApple, Inc.\n08:00:08\t\tBolt Beranek And Newman Inc.\n08:00:09\t\tHewlett Packard\n08:00:0A\t\tNestar Systems Incorporated\n08:00:0B\t\tUnisys Corporation\n08:00:0C\t\tMiklyn Development Co.\n08:00:0D\t\tInternational Computers, Ltd\n08:00:0E\t\tNcr Corporation\n08:00:0F\t\tMitel Corporation\n08:00:11\t\tTektronix Inc.\n08:00:12\t\tBell Atlantic Integrated Syst.\n08:00:13\t\tExxon\n08:00:14\t\tExcelan\n08:00:15\t\tStc Business Systems\n08:00:16\t\tBarrister Info Sys Corp\n08:00:17\t\tNational Semiconductor\n08:00:18\t\tPirelli Focom Networks\n08:00:19\t\tGeneral Electric Corporation\n08:00:1A\t\tTiara/ 10Net\n08:00:1B\t\tDell EMC\n08:00:1C\t\tKdd-Kokusai Debnsin Denwa Co.\n08:00:1D\t\tAble Communications Inc.\n08:00:1E\t\tApollo Computer Inc.\n08:00:1F\t\tSharp Corporation\n08:00:20\t\tOracle Corporation\n08:00:21\t\t3M Company\n08:00:22\t\tNbi Inc.\n08:00:23\t\tPanasonic Communications Co., Ltd.\n08:00:24\t\t10Net Communications/Dca\n08:00:25\t\tControl Data\n08:00:26\t\tNorsk Data A.S.\n08:00:27\t\tPCS Systemtechnik GmbH\n08:00:28\t\tTexas Instruments\n08:00:29\t\tMegatek Corporation\n08:00:2A\t\tMosaic Technologies Inc.\n08:00:2B\t\tDigital Equipment Corporation\n08:00:2C\t\tBritton Lee Inc.\n08:00:2D\t\tLan-Tec Inc.\n08:00:2E\t\tMetaphor Computer Systems\n08:00:2F\t\tPrime Computer Inc.\n08:00:30\t\tCern\n08:00:31\t\tLittle Machines Inc.\n08:00:32\t\tTigan Incorporated\n08:00:33\t\tBausch & Lomb\n08:00:34\t\tFilenet Corporation\n08:00:35\t\tMicrofive Corporation\n08:00:36\t\tIntergraph Corporation\n08:00:37\t\tFUJIFILM Business Innovation Corp.\n08:00:38\t\tBull S.A.S.\n08:00:39\t\tSpider Systems Limited\n08:00:3A\t\tOrcatech Inc.\n08:00:3B\t\tTorus Systems Limited\n08:00:3C\t\tSchlumberger Well Services\n08:00:3D\t\tCadnetix Corporations\n08:00:3E\t\tCodex Corporation\n08:00:3F\t\tFred Koschara Enterprises\n08:00:40\t\tFerranti Computer Sys. Limited\n08:00:41\t\tRacal-Milgo Information Sys..\n08:00:42\t\tMACNICA, Inc.\n08:00:43\t\tPixel Computer Inc.\n08:00:44\t\tDavid Systems Inc.\n08:00:45\t\tConcurrent Computer Corp.\n08:00:46\t\tSony Corporation\n08:00:47\t\tSequent Computer Systems Inc.\n08:00:48\t\tEurotherm Gauging Systems\n08:00:49\t\tUnivation\n08:00:4A\t\tBanyan Systems Inc.\n08:00:4B\t\tPlanning Research Corp.\n08:00:4C\t\tHydra Computer Systems Inc.\n08:00:4D\t\tCorvus Systems Inc.\n08:00:4E\t\t3Com Europe Ltd\n08:00:4F\t\tCygnet Systems\n08:00:50\t\tDaisy Systems Corp.\n08:00:51\t\tExperData\n08:00:52\t\tInsystec\n08:00:53\t\tMiddle East Tech. University\n08:00:55\t\tStanford Telecomm. Inc.\n08:00:56\t\tStanford Linear Accel. Center\n08:00:57\t\tEvans & Sutherland\n08:00:58\t\tSystems Concepts\n08:00:59\t\tA/S Mycron\n08:00:5A\t\tIBM Corp\n08:00:5B\t\tVta Technologies Inc.\n08:00:5C\t\tFour Phase Systems\n08:00:5D\t\tGould Inc.\n08:00:5E\t\tCounterpoint Computer Inc.\n08:00:5F\t\tSaber Technology Corp.\n08:00:60\t\tIndustrial Networking Inc.\n08:00:61\t\tJarogate Ltd.\n08:00:62\t\tGeneral Dynamics\n08:00:63\t\tPlessey\n08:00:64\t\tSitasys AG\n08:00:65\t\tGenrad Inc.\n08:00:66\t\tAgfa Corporation\n08:00:67\t\tComDesign\n08:00:68\t\tRidge Computers\n08:00:69\t\tSilicon Graphics\n08:00:6A\t\tAt&T\n08:00:6B\t\tAccel Technologies Inc.\n08:00:6C\t\tSuntek Technology Int'L\n08:00:6D\t\tWhitechapel Computer Works\n08:00:6E\t\tMasscomp\n08:00:6F\t\tPhilips Apeldoorn B.V.\n08:00:70\t\tMitsubishi Precision Co.,LTd.\n08:00:71\t\tMatra (Dsie)\n08:00:72\t\tXerox Corp Univ Grant Program\n08:00:73\t\tTecmar Inc.\n08:00:74\t\tCasio Computer Co. Ltd.\n08:00:75\t\tDansk Data Electronik\n08:00:76\t\tPc Lan Technologies\n08:00:77\t\tTsl Communications Ltd.\n08:00:78\t\tAccell Corporation\n08:00:79\t\tThe Droid Works\n08:00:7A\t\tIndata\n08:00:7B\t\tSanyo Electric Co. Ltd.\n08:00:7C\t\tVitalink Communications Corp.\n08:00:7E\t\tAmalgamated Wireless(Aus) Ltd\n08:00:7F\t\tCarnegie-Mellon University\n08:00:80\t\tAes Data Inc.\n08:00:81\t\tAstech Inc.\n08:00:82\t\tVeritas Software\n08:00:83\t\tSeiko Instruments Inc.\n08:00:84\t\tTomen Electronics Corp.\n08:00:85\t\tElxsi\n08:00:86\t\tKonica Minolta Holdings, Inc.\n08:00:87\t\tXyplex, Inc.\n08:00:88\t\tBrocade Communications Systems LLC\n08:00:89\t\tKinetics\n08:00:8A\t\tPerfTech, Inc.\n08:00:8B\t\tPyramid Technology Corp.\n08:00:8C\t\tNetwork Research Corporation\n08:00:8D\t\tXyvision Inc.\n08:00:8E\t\tTandem Computers\n08:00:8F\t\tChipcom Corporation\n08:00:90\t\tSonoma Systems\n08:01:0F\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n08:02:05\t\tHuawei Technologies Co.,Ltd\n08:02:3C\t\tSamsung Electronics Co.,Ltd\n08:02:8E\t\tNetgear\n08:03:42\t\tPalo Alto Networks\n08:03:71\t\tKrg Corporate\n08:04:B4\t\tTexas Instruments\n08:05:81\t\tRoku, Inc.\n08:05:CD\t\tDongGuang EnMai Electronic Product Co.Ltd.\n08:05:E2\t\tJuniper Networks\n08:08:5C\t\tLuna Products\n08:08:C2\t\tSamsung Electronics Co.,Ltd\n08:08:EA\t\tAmsc\n08:09:B6\t\tMasimo Corp\n08:09:C7\t\tZhuhai Unitech Power Technology Co., Ltd.\n08:0A:4E\t\tPlanet Bingo® — 3rd Rock Gaming®\n08:0C:0B\t\tSysMik GmbH Dresden\n08:0C:C9\t\tMission Technology Group, dba Magma\n08:0D:84\t\tGECO, Inc.\n08:0E:A8\t\tVelex s.r.l.\n08:0F:E5\t\tCisco Systems, Inc\n08:0F:FA\t\tKsp Inc.\n08:10:31\t\tLithiunal Energy\n08:10:86\t\tNEC Platforms, Ltd.\n08:10:93\t\tSamsung Electronics Co.,Ltd\n08:11:5E\t\tBitel Co., Ltd.\n08:11:96\t\tIntel Corporate\n08:12:87\t\tJiangxi Risound Electronics Co.,LTD\n08:12:A5\t\tAmazon Technologies Inc.\n08:14:43\t\tUnibrain S.A.\n08:15:2F\t\tSamsung Electronics Co., Ltd. ARTIK\n08:15:AE\t\tChina Mobile Group Device Co.,Ltd.\n08:16:05\t\tVodafone Italia S.p.A.\n08:16:51\t\tShenzhen Sea Star Technology Co.,Ltd\n08:16:D5\t\tGoertek Inc.\n08:17:35\t\tCisco Systems, Inc\n08:17:F4\t\tIBM Corp\n08:18:1A\t\tzte corporation\n08:18:4C\t\tA. S. Thomas, Inc.\n08:19:A6\t\tHuawei Technologies Co.,Ltd\n08:1A:1E\t\tShenzhen iComm Semiconductor CO.,LTD\n08:1A:FD\t\tHuawei Device Co., Ltd.\n08:1C:6E\t\tXiaomi Communications Co Ltd\n08:1D:C4\t\tThermo Fisher Scientific Messtechnik GmbH\n08:1D:FB\t\tShanghai Mexon Communication Technology Co.,Ltd\n08:1F:3F\t\tWondaLink Inc.\n08:1F:71\t\tTp-Link Technologies Co.,Ltd.\n08:1F:EB\t\tBinCube\n08:1F:F3\t\tCisco Systems, Inc\n08:21:EF\t\tSamsung Electronics Co.,Ltd\n08:23:B2\t\tvivo Mobile Communication Co., Ltd.\n08:23:C6\t\tHuawei Technologies Co.,Ltd\n08:25:22\t\tAdvansee\n08:25:25\t\tXiaomi Communications Co Ltd\n08:25:73\t\tApple, Inc.\n08:26:97\t\tZyxel Communications Corporation\n08:26:AE\t\tIEEE Registration Authority\n08:26:AE:00:00:00/28\tWuhan Tianyu Information Industry Co., Ltd.\n08:26:AE:10:00:00/28\tBeijing Silion Technology Corp.,Ltd.\n08:26:AE:20:00:00/28\tZaiNar\n08:26:AE:30:00:00/28\tShenzhen Hai yingZhilian Industrial Co., Ltd.\n08:26:AE:40:00:00/28\tBANGJOO Co., Ltd.\n08:26:AE:50:00:00/28\tShennan Circuits Co.,Ltd\n08:26:AE:60:00:00/28\tNewcapec co.,Ltd\n08:26:AE:70:00:00/28\tEvtech Solutions Ltd. Dba 3D-P\n08:26:AE:80:00:00/28\tShineTech Electronics Co., Ltd\n08:26:AE:90:00:00/28\tAnnapurna labs\n08:26:AE:A0:00:00/28\tFlextronics International Kft\n08:26:AE:B0:00:00/28\tF-Plus Mobile LLC\n08:26:AE:C0:00:00/28\tBrannstrom Sweden AB\n08:26:AE:D0:00:00/28\tVeth Propulsion bv\n08:26:AE:E0:00:00/28\tMass Electronics Pty Ltd\n08:27:19\t\tAPS systems/electronic AG\n08:27:6B\t\tHuawei Device Co., Ltd.\n08:27:A8\t\tArcadyan Corporation\n08:27:CE\t\tNagano Keiki Co., Ltd.\n08:27:F0\t\tAccton Technology Co., Ltd.\n08:28:02\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\n08:2A:D0\t\tSRD Innovations Inc.\n08:2C:B0\t\tNetwork Instruments\n08:2C:B6\t\tApple, Inc.\n08:2C:ED\t\tTechnity Solutions Inc.\n08:2E:36\t\tHuawei Device Co., Ltd.\n08:2E:5F\t\tHewlett Packard\n08:2F:E9\t\tHuawei Technologies Co.,Ltd\n08:30:6B\t\tPalo Alto Networks\n08:30:CE\t\tFiberhome Telecommunication Technologies Co.,LTD\n08:31:8B\t\tHuawei Technologies Co.,Ltd\n08:31:A4\t\tHuawei Device Co., Ltd.\n08:33:ED\t\tAskey Computer Corp\n08:35:1B\t\tShenzhen Jialihua Electronic Technology Co., Ltd\n08:35:71\t\tCASwell INC.\n08:35:B2\t\tCoreEdge Networks Co., Ltd\n08:36:C9\t\tNetgear\n08:37:3D\t\tSamsung Electronics Co.,Ltd\n08:37:9C\t\tTopaz Co. LTD.\n08:38:69\t\tHong Kong AMobile Intelligent Corp. Limited Taiwan Branch\n08:38:A5\t\tFunkwerk plettac electronic GmbH\n08:38:E6\t\tMotorola (Wuhan) Mobility Technologies Communication Co., Ltd.\n08:3A:2F\t\tGuangzhou Juan Intelligent Tech Joint Stock Co.,Ltd\n08:3A:38\t\tNew H3C Technologies Co., Ltd\n08:3A:5C\t\tJunilab, Inc.\n08:3A:88\t\tUniversal Global Scientific Industrial Co., Ltd.\n08:3A:8D\t\tEspressif Inc.\n08:3A:B8\t\tShinoda Plasma Co., Ltd.\n08:3A:F2\t\tEspressif Inc.\n08:3B:E9\t\tNew H3C Technologies Co., Ltd\n08:3D:88\t\tSamsung Electronics Co.,Ltd\n08:3E:0C\t\tCommscope\n08:3E:5D\t\tSagemcom Broadband SAS\n08:3E:8E\t\tHon Hai Precision Ind. Co.,Ltd.\n08:3F:21\t\tMotorola Mobility LLC, a Lenovo Company\n08:3F:3E\t\tWSH GmbH\n08:3F:76\t\tIntellian Technologies, Inc.\n08:3F:BC\t\tzte corporation\n08:40:27\t\tGridstore Inc.\n08:40:F3\t\tTenda Technology Co.,Ltd.Dongguan branch\n08:42:18\t\tAsyril SA\n08:42:96\t\tMobile Technology Solutions LLC\n08:44:73\t\tzte corporation\n08:45:D1\t\tCisco Systems, Inc\n08:46:56\t\tVeo-Labs\n08:46:8B\t\tGuangdong NanGuang Photo & Video Systems Co., Ltd\n08:46:C7\t\tFiberhome Telecommunication Technologies Co.,LTD\n08:47:4C\t\tNokia\n08:47:D0\t\tNokia Shanghai Bell Co., Ltd.\n08:48:2C\t\tRaycore Taiwan Co., LTD.\n08:48:57\t\tSuteng Innovation Technology Co., Ltd.\n08:4A:CF\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n08:4B:44\t\tRobert Bosch Elektronika Kft.\n08:4E:1C\t\tH2A Systems, LLC\n08:4E:BF\t\tSumitomo Electric Industries, Ltd\n08:4F:0A\t\tHuawei Technologies Co.,Ltd\n08:4F:66\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n08:4F:A9\t\tCisco Systems, Inc\n08:4F:F9\t\tCisco Systems, Inc\n08:51:04\t\tHuawei Device Co., Ltd.\n08:51:14\t\tQingdao Topscomm Communication Co., Ltd\n08:51:2E\t\tOrion Diagnostica Oy\n08:52:40\t\tEbV Elektronikbau- und Vertriebs GmbH\n08:52:4E\t\tShenzhen Fangcheng Baiyi Technology Co., Ltd.\n08:54:11\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n08:54:BB\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\n08:55:31\t\tRouterboard.com\n08:56:9B\t\tWiZ\n08:57:00\t\tTp-Link Technologies Co.,Ltd.\n08:57:FB\t\tAmazon Technologies Inc.\n08:58:A5\t\tBeijing Vrv Software Corpoaration Limited.\n08:5A:11\t\tD-Link International\n08:5A:E0\t\tRecovision Technology Co., Ltd.\n08:5B:0E\t\tFortinet, Inc.\n08:5B:D6\t\tIntel Corporate\n08:5B:DA\t\tCliniCare LTD\n08:5C:1B\t\tHuawei Technologies Co.,Ltd\n08:5D:53\t\tApple, Inc.\n08:5D:DD\t\tMercury Corporation\n08:60:6E\t\tASUSTek COMPUTER INC.\n08:60:83\t\tzte corporation\n08:61:95\t\tRockwell Automation\n08:62:02\t\tApple, Inc.\n08:62:66\t\tASUSTek COMPUTER INC.\n08:63:32\t\tIEEE Registration Authority\n08:63:32:00:00:00/28\tEaton Corporation\n08:63:32:10:00:00/28\tShanghai eCloud Technologies Co.,ltd\n08:63:32:20:00:00/28\tinnovative specialized security solutions\n08:63:32:30:00:00/28\tUmano Medical Inc.\n08:63:32:40:00:00/28\tBeijing KELIBANG Information technology Co.,LTD\n08:63:32:50:00:00/28\tA Paul Software Systems Pvt. Ltd.\n08:63:32:60:00:00/28\tOVT India pvt Ltd\n08:63:32:70:00:00/28\tSoftware-Automation-Control Joint Stock Company (Cadpro., Jsc)\n08:63:32:80:00:00/28\tin.hub GmbH\n08:63:32:90:00:00/28\tTZMedical Inc.\n08:63:32:A0:00:00/28\tDynacom Communication\n08:63:32:B0:00:00/28\tShenZhen YuanXiang Digital Technology Co., Ltd\n08:63:32:C0:00:00/28\tSwiftronix AB\n08:63:32:D0:00:00/28\takYtec GmbH\n08:63:32:E0:00:00/28\tC-Vue (Shanghai) Audio Technology Co.,Ltd\n08:63:61\t\tHuawei Technologies Co.,Ltd\n08:65:18\t\tApple, Inc.\n08:65:F0\t\tJM Zengge Co., Ltd\n08:66:1F\t\tPalo Alto Networks\n08:66:98\t\tApple, Inc.\n08:67:4E\t\tHisense broadband multimedia technology Co.,Ltd\n08:68:8D\t\tNew H3C Technologies Co., Ltd\n08:68:D0\t\tJapan System Design\n08:68:EA\t\tEito Electronics Co., Ltd.\n08:6A:0A\t\tAskey Computer Corp\n08:6A:C5\t\tIntel Corporate\n08:6A:E5\t\tAmazon Technologies Inc.\n08:6B:D1\t\tShenzhen SuperElectron Technology Co.,Ltd.\n08:6B:D7\t\tSilicon Laboratories\n08:6D:41\t\tApple, Inc.\n08:6D:F2\t\tShenzhen MIMOWAVE Technology Co.,Ltd\n08:6E:9C\t\tHuawei Device Co., Ltd.\n08:6F:48\t\tShenzhen iComm Semiconductor CO.,LTD\n08:70:45\t\tApple, Inc.\n08:70:73\t\tHuawei Technologies Co.,Ltd\n08:71:58\t\tHanshow Technology Co.,Ltd.\n08:71:90\t\tIntel Corporate\n08:73:6F\t\tEM Microelectronic\n08:74:02\t\tApple, Inc.\n08:74:58\t\tFiberhome Telecommunication Technologies Co.,LTD\n08:74:F6\t\tWinterhalter Gastronom GmbH\n08:75:72\t\tObelux Oy\n08:76:18\t\tViE Technologies Sdn. Bhd.\n08:76:71\t\tJuniper Networks\n08:76:95\t\tAuto Industrial Co., Ltd.\n08:76:FF\t\tThomson Telecom Belgium\n08:78:08\t\tSamsung Electronics Co.,Ltd\n08:79:8C\t\tHuawei Technologies Co.,Ltd\n08:79:99\t\tAIM GmbH\n08:7A:4C\t\tHuawei Technologies Co.,Ltd\n08:7B:12\t\tSagemcom Broadband SAS\n08:7B:87\t\tCisco Systems, Inc\n08:7B:AA\t\tSvyazkomplektservice, Llc\n08:7C:39\t\tAmazon Technologies Inc.\n08:7C:BE\t\tQuintic Corp.\n08:7D:21\t\tAltasec technology corporation\n08:7E:64\t\tVantiva USA LLC\n08:7F:98\t\tvivo Mobile Communication Co., Ltd.\n08:80:39\t\tCisco SPVTG\n08:81:B2\t\tLogitech (China) Technology Co., Ltd\n08:81:BC\t\tHongKong Ipro Technology Co., Limited\n08:81:F4\t\tJuniper Networks\n08:84:66\t\tNovartis Pharma AG\n08:84:9D\t\tAmazon Technologies Inc.\n08:84:FB\t\tHonor Device Co., Ltd.\n08:85:5B\t\tKontron Europe GmbH\n08:86:20\t\tTecno Mobile Limited\n08:86:3B\t\tBelkin International Inc.\n08:87:C6\t\tIngram Micro Services\n08:87:C7\t\tApple, Inc.\n08:8A:F1\t\tMercusys Technologies Co., Ltd.\n08:8B:C8\t\tGoogle, Inc.\n08:8C:2C\t\tSamsung Electronics Co.,Ltd\n08:8D:C8\t\tRyowa Electronics Co.,Ltd\n08:8E:4F\t\tSF Software Solutions\n08:8E:90\t\tIntel Corporate\n08:8E:DC\t\tApple, Inc.\n08:8F:2C\t\tAmber Technology Ltd.\n08:8F:C3\t\tCompal Information (Kunshan) Co., Ltd.\n08:90:BA\t\tDanlaw Inc\n08:91:15\t\tAmazon Technologies Inc.\n08:91:A3\t\tAmazon Technologies Inc.\n08:92:04\t\tDell Inc.\n08:92:72\t\tEspressif Inc.\n08:93:56\t\tHuawei Technologies Co.,Ltd\n08:94:EF\t\tWistron Infocomm (Zhongshan) Corporation\n08:95:2A\t\tVantiva USA LLC\n08:95:42\t\tApple, Inc.\n08:96:AD\t\tCisco Systems, Inc\n08:96:D7\t\tAVM GmbH\n08:97:07\t\tCisco Systems, Inc\n08:97:34\t\tHewlett Packard Enterprise\n08:97:58\t\tShenzhen Strong Rising Electronics Co.,Ltd DongGuan Subsidiary\n08:97:98\t\tCompal Information (Kunshan) Co., Ltd.\n08:99:E8\t\tKEMAS GmbH\n08:9A:C7\t\tzte corporation\n08:9B:4B\t\tiKuai Networks\n08:9B:B9\t\tNokia Solutions and Networks GmbH & Co. KG\n08:9B:F1\t\teero inc.\n08:9C:86\t\tNokia Shanghai Bell Co., Ltd.\n08:9D:F4\t\tIntel Corporate\n08:9E:01\t\tQuanta Computer Inc.\n08:9E:08\t\tGoogle, Inc.\n08:9E:84\t\tHuawei Technologies Co.,Ltd\n08:9F:97\t\tLeroy Automation\n08:A1:2B\t\tShenZhen EZL Technology Co., Ltd\n08:A1:36\t\tCloud Network Technology Singapore Pte. Ltd.\n08:A1:89\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n08:A5:C8\t\tSunnovo International Limited\n08:A5:DF\t\tSamsung Electronics Co.,Ltd\n08:A6:BC\t\tAmazon Technologies Inc.\n08:A6:F7\t\tEspressif Inc.\n08:A7:C0\t\tVantiva USA LLC\n08:A8:42\t\tHuawei Device Co., Ltd.\n08:A8:A1\t\tCyclotronics Power Concepts, Inc\n08:A9:5A\t\tAzureWave Technology Inc.\n08:AA:55\t\tMotorola Mobility LLC, a Lenovo Company\n08:AA:89\t\tzte corporation\n08:AC:A5\t\tBenu Video, Inc.\n08:AC:C4\t\tFMTech\n08:AE:D6\t\tSamsung Electronics Co.,Ltd\n08:AF:78\t\tTotus Solutions, Inc.\n08:B0:55\t\tAskey Computer Corp\n08:B0:A7\t\tTruebeyond Co., Ltd\n08:B2:58\t\tJuniper Networks\n08:B2:A3\t\tCynny Italia S.r.L.\n08:B3:AF\t\tvivo Mobile Communication Co., Ltd.\n08:B3:D6\t\tHuawei Device Co., Ltd.\n08:B4:9D\t\tTecno Mobile Limited\n08:B4:B1\t\tGoogle, Inc.\n08:B4:CF\t\tAbicom International\n08:B4:D2\t\tIntel Corporate\n08:B6:1F\t\tEspressif Inc.\n08:B6:57\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n08:B7:38\t\tLite-On Technogy Corp.\n08:B7:EC\t\tWireless Seismic\n08:B8:D0\t\tChipsea Technologies (Shenzhen) Corp.\n08:B9:5F\t\tSilicon Laboratories\n08:BA:22\t\tSwaive Corporation\n08:BA:5F\t\tQingdao Hisense Electronics Co.,Ltd.\n08:BA:B7\t\tCeragon Networks Ltd.\n08:BB:3C\t\tFlextronics Tech.(Ind) Pvt Ltd\n08:BB:CC\t\tAK-NORD EDV VERTRIEBSGES. mbH\n08:BC:20\t\tHangzhou Royal Cloud Technology Co., Ltd\n08:BD:43\t\tNetgear\n08:BE:09\t\tAstrol Electronic AG\n08:BE:77\t\tGreen Electronics\n08:BE:AC\t\tEdimax Technology Co. Ltd.\n08:BF:A0\t\tSamsung Electronics Co.,Ltd\n08:BF:B8\t\tASUSTek COMPUTER INC.\n08:C0:21\t\tHuawei Technologies Co.,Ltd\n08:C0:6C\t\tHuawei Device Co., Ltd.\n08:C0:EB\t\tMellanox Technologies, Inc.\n08:C2:24\t\tAmazon Technologies Inc.\n08:C3:B3\t\tTCL King Electrical Appliances(Huizhou)Co.,Ltd\n08:C5:E1\t\tSamsung Electro-Mechanics(Thailand)\n08:C6:B3\t\tQtech Llc\n08:C7:29\t\tApple, Inc.\n08:C7:B5\t\tApple, Inc.\n08:C7:F5\t\tVantiva Connected Home - Technologies Telco\n08:C8:C2\t\tGN Audio A/S\n08:CA:45\t\tToyou Feiji Electronics Co., Ltd.\n08:CB:E5\t\tR3 Solutions GmbH\n08:CC:27\t\tMotorola Mobility LLC, a Lenovo Company\n08:CC:68\t\tCisco Systems, Inc\n08:CC:81\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n08:CC:A7\t\tCisco Systems, Inc\n08:CD:9B\t\tsamtec automotive electronics & software GmbH\n08:CE:94\t\tEM Microelectronic\n08:D0:9F\t\tCisco Systems, Inc\n08:D0:B7\t\tQingdao Hisense Communications Co.,Ltd.\n08:D1:F9\t\tEspressif Inc.\n08:D2:3E\t\tIntel Corporate\n08:D2:9A\t\tProformatique\n08:D3:4B\t\tTechman Electronics (Changshu) Co., Ltd.\n08:D4:0C\t\tIntel Corporate\n08:D4:2B\t\tSamsung Electronics Co.,Ltd\n08:D4:6A\t\tLG Electronics (Mobile Communications)\n08:D5:93\t\tTexas Instruments\n08:D5:9D\t\tSagemcom Broadband SAS\n08:D5:C0\t\tSeers Technology Co., Ltd\n08:D8:33\t\tShenzhen RF Technology Co., Ltd\n08:D9:45\t\tHuawei Technologies Co.,Ltd\n08:DA:33\t\tIEEE Registration Authority\n08:DA:33:00:00:00/28\tSmart and connective\n08:DA:33:10:00:00/28\tTransTera Technology (HK) Limited\n08:DA:33:20:00:00/28\tShenzhen Zhenghao lnnovation Techenology Co.,LTD\n08:DA:33:30:00:00/28\tAI Storm\n08:DA:33:40:00:00/28\tCleverfox Equipments Private Limited\n08:DA:33:50:00:00/28\tShengqing Acoustics LLC\n08:DA:33:60:00:00/28\tVideoline Surveillance Services Pvt. Ltd.\n08:DA:33:70:00:00/28\tOrigalys ElectroChem SAS\n08:DA:33:80:00:00/28\tAMPACS Corporation\n08:DA:33:90:00:00/28\tLens Technology (Xiangtan) Co.,Ltd\n08:DA:33:A0:00:00/28\tJAKA Robotics Co., Ltd.\n08:DA:33:B0:00:00/28\tShenzhen Fanxiang lnformation Technology Co.,Ltd\n08:DA:33:C0:00:00/28\tGithon Technology Co., Ltd.\n08:DA:33:D0:00:00/28\tShanghai ReeLink Global Communication Company LTD\n08:DA:33:E0:00:00/28\tTelo Communication（Shenzhen）Co.,Ltd\n08:DD:03\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n08:DD:EB\t\tSilicon Laboratories\n08:DF:1F\t\tBose Corporation\n08:DF:CB\t\tSystrome Networks\n08:E0:21\t\tHonor Device Co., Ltd.\n08:E3:42\t\tCear, Inc.\n08:E4:DF\t\tShenzhen Sande Dacom Electronics Co., Ltd\n08:E5:DA\t\tNanjing Fujitsu Computer Products Co.,Ltd.\n08:E6:3B\t\tzte corporation\n08:E6:72\t\tJebsee Electronics Co.,Ltd.\n08:E6:89\t\tApple, Inc.\n08:E6:C9\t\tBusiness-intelligence of Oriental Nations Corporation Ltd.\n08:E7:E5\t\tHuawei Device Co., Ltd.\n08:E8:4F\t\tHuawei Technologies Co.,Ltd\n08:E9:F6\t\tAMPAK Technology,Inc.\n08:EA:40\t\tShenzhen Bilian Electronic Co.，Ltd\n08:EA:44\t\tExtreme Networks Headquarters\n08:EB:21\t\tIntel Corporate\n08:EB:29\t\tJiangsu Huitong Group Co.,Ltd.\n08:EB:74\t\tHUMAX Co., Ltd.\n08:EB:ED\t\tWorld Elite Technology Co.,LTD\n08:EB:F6\t\tHuawei Technologies Co.,Ltd\n08:EC:A9\t\tSamsung Electronics Co.,Ltd\n08:EC:F5\t\tCisco Systems, Inc\n08:ED:02\t\tIEEE Registration Authority\n08:ED:02:00:00:00/28\tD2SLink Systems\n08:ED:02:10:00:00/28\tImperx, Inc\n08:ED:02:20:00:00/28\tTES Touch Embedded Solutions Inc.\n08:ED:02:30:00:00/28\tJiangsu Logread Network Technology Co., LTD.\n08:ED:02:40:00:00/28\tFio Corporation\n08:ED:02:50:00:00/28\tVigitron Inc.\n08:ED:02:60:00:00/28\tSango Electronics Co\n08:ED:02:70:00:00/28\tEleven Engineering Incorporated\n08:ED:02:80:00:00/28\tHantas Co., Ltd.\n08:ED:02:90:00:00/28\tSavox Communications\n08:ED:02:A0:00:00/28\tVictiana SRL\n08:ED:02:B0:00:00/28\tSzok Energy and Communication Co., Ltd.\n08:ED:02:C0:00:00/28\tGuard RFID Solutions\n08:ED:02:D0:00:00/28\tOrigami Energy Ltd\n08:ED:02:E0:00:00/28\tTelstra Corporation Limited\n08:ED:9D\t\tTecno Mobile Limited\n08:ED:B9\t\tHon Hai Precision Ind. Co.,Ltd.\n08:ED:ED\t\tZhejiang Dahua Technology Co., Ltd.\n08:EE:8B\t\tSamsung Electronics Co.,Ltd\n08:EF:3B\t\tMCS Logic Inc.\n08:EF:AB\t\tSayme Wireless Sensor Network\n08:F0:1E\t\teero inc.\n08:F0:B6\t\tEdifier International\n08:F1:B3\t\tCisco Meraki\n08:F1:B7\t\tTowerstream Corpration\n08:F1:EA\t\tHewlett Packard Enterprise\n08:F2:F4\t\tNet One Partners Co.,Ltd.\n08:F3:FB\t\tCisco Systems, Inc\n08:F4:58\t\tHuawei Device Co., Ltd.\n08:F4:AB\t\tApple, Inc.\n08:F4:F0\t\tCisco Systems, Inc\n08:F6:06\t\tzte corporation\n08:F6:9C\t\tApple, Inc.\n08:F6:F8\t\tGET Engineering\n08:F7:28\t\tGLOBO Multimedia Sp. z o.o. Sp.k.\n08:F7:E9\t\tHRCP Research and Development Partnership\n08:F8:0D\t\tIEEE Registration Authority\n08:F8:0D:00:00:00/28\tHuizhou changfei Optoelectruonics Technology Co.,Ltd\n08:F8:0D:10:00:00/28\tShenzhen DophiGo IoT Technology Co.,Ltd\n08:F8:0D:20:00:00/28\tShanghai Mininglamp AI Group Co.,Ltd\n08:F8:0D:30:00:00/28\tAnnapurna labs\n08:F8:0D:40:00:00/28\tFG-Lab Inc.\n08:F8:0D:50:00:00/28\tZhejiang Luci Technology Co., Ltd\n08:F8:0D:60:00:00/28\tSeda Chemical Products Co., Ltd.\n08:F8:0D:70:00:00/28\tHANGZHOU YILI Communication Equipment Ltd\n08:F8:0D:80:00:00/28\tOpenYard LLC\n08:F8:0D:90:00:00/28\tBenelink Technology Inc.\n08:F8:0D:A0:00:00/28\tMickey Industry,Ltd.\n08:F8:0D:B0:00:00/28\tVont Innovations\n08:F8:0D:C0:00:00/28\tZmbizi App Llc\n08:F8:0D:D0:00:00/28\tZhe Jiang EV-Tech Co.,Ltd\n08:F8:0D:E0:00:00/28\tSuzhou Sidi Information Technology Co., Ltd.\n08:F8:BC\t\tApple, Inc.\n08:F9:E0\t\tEspressif Inc.\n08:FA:28\t\tHuawei Technologies Co.,Ltd\n08:FA:79\t\tvivo Mobile Communication Co., Ltd.\n08:FA:E0\t\tFohhn Audio AG\n08:FB:EA\t\tAMPAK Technology,Inc.\n08:FC:52\t\tOpenXS BV\n08:FC:88\t\tSamsung Electronics Co.,Ltd\n08:FD:0E\t\tSamsung Electronics Co.,Ltd\n08:FD:52\t\tSilicon Laboratories\n08:FF:24\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n08:FF:44\t\tApple, Inc.\n0A:2A:33\t\tDigistor\n0A:35:F2\t\tIntegrated Technical Vision Ltd\n0A:36:1C\t\tSmardii\n0A:87:36\t\tIEEE 1901 Working Group\n0A:8E:62\t\tDelta Solutions LLC\n0A:A2:3B\t\tVitex LLC\n0A:AB:8C\t\tMidwest Microwave Solutions Inc.\n0A:CD:8F\t\tCisco Systems Norway\n0A:D9:C4\t\tCraft Designs, Inc\n0A:E4:71\t\tCaterpillar Inc.\n0A:E9:1B\t\tPADL Software Pty Ltd\n0A:F9:9D\t\tFitipower Integrated Technology\n0C:01:4B\t\tzte corporation\n0C:01:A5\t\tzte corporation\n0C:01:C8\t\tDENSO Co.,Ltd\n0C:01:DB\t\tInfinix mobility limited\n0C:02:27\t\tVantiva USA LLC\n0C:02:BD\t\tSamsung Electronics Co.,Ltd\n0C:04:00\t\tJantar d.o.o.\n0C:05:35\t\tJuniper Systems\n0C:07:DF\t\tXiaomi Communications Co Ltd\n0C:07:F3\t\tHuawei Technologies Co.,Ltd\n0C:08:B4\t\tHUMAX Co., Ltd.\n0C:0A:DF\t\tTexas Instruments\n0C:0E:76\t\tD-Link International\n0C:11:05\t\tAkuvox (Xiamen) Networks Co., Ltd\n0C:11:67\t\tCisco Systems, Inc\n0C:12:62\t\tzte corporation\n0C:13:0B\t\tUniqoteq Ltd.\n0C:14:20\t\tSamsung Electronics Co.,Ltd\n0C:14:D2\t\tChina Mobile Group Device Co.,Ltd.\n0C:15:39\t\tApple, Inc.\n0C:15:63\t\tApple, Inc.\n0C:15:C5\t\tSDTEC Co., Ltd.\n0C:17:73\t\tHuawei Device Co., Ltd.\n0C:17:F1\t\tTelecsys\n0C:18:4E\t\tHuawei Technologies Co.,Ltd\n0C:19:1F\t\tInform Electronik\n0C:19:F8\t\tApple, Inc.\n0C:1A:10\t\tAcoustic Stream\n0C:1A:61\t\tNeox FZCO\n0C:1B:CC\t\tIflytek Co.,Ltd.\n0C:1C:19\t\tLongconn Electronics(Shenzhen) Co.,Ltd\n0C:1C:1A\t\teero inc.\n0C:1C:20\t\tKakao Corp\n0C:1C:31\t\tMercusys Technologies Co., Ltd.\n0C:1C:57\t\tTexas Instruments\n0C:1D:AF\t\tXiaomi Communications Co Ltd\n0C:1D:C2\t\tSeAH Networks\n0C:1E:F7\t\tOmni-ID\n0C:20:26\t\tnoax Technologies AG\n0C:20:D3\t\tvivo Mobile Communication Co., Ltd.\n0C:21:38\t\tHengstler GmbH\n0C:23:69\t\tHoneywell SPS\n0C:23:8D\t\tHuawei Technologies Co.,Ltd\n0C:25:76\t\tLongcheer Telecommunication Limited\n0C:27:24\t\tCisco Systems, Inc\n0C:27:55\t\tValuable Techologies Limited\n0C:27:56\t\tRongcheeng Goer Technology Co.,Ltd.\n0C:27:79\t\tNew H3C Technologies Co., Ltd\n0C:29:8F\t\tTesla,Inc.\n0C:29:EF\t\tDell Inc.\n0C:2A:69\t\telectric imp, incorporated\n0C:2A:6F\t\tSilicon Laboratories\n0C:2A:86\t\tFiberhome Telecommunication Technologies Co.,LTD\n0C:2A:E7\t\tBeijing General Research Institute of Mining and Metallurgy\n0C:2C:54\t\tHuawei Technologies Co.,Ltd\n0C:2C:7C\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n0C:2D:89\t\tQiiQ Communications Inc.\n0C:2E:57\t\tHuawei Technologies Co.,Ltd\n0C:2F:B0\t\tSamsung Electronics Co.,Ltd\n0C:30:21\t\tApple, Inc.\n0C:31:DC\t\tHuawei Technologies Co.,Ltd\n0C:32:3A\t\tSamsung Electronics Co.,Ltd\n0C:33:1B\t\tTydenBrooks\n0C:35:26\t\tMicrosoft Corporation\n0C:35:4F\t\tNokia\n0C:35:FE\t\tFiberhome Telecommunication Technologies Co.,LTD\n0C:37:47\t\tzte corporation\n0C:37:96\t\tBizlink Technology, Inc.\n0C:37:DC\t\tHuawei Technologies Co.,Ltd\n0C:38:3E\t\tFanvil Technology Co., Ltd.\n0C:39:56\t\tObservator instruments\n0C:3A:FA\t\tNew H3C Technologies Co., Ltd\n0C:3B:50\t\tApple, Inc.\n0C:3C:65\t\tDome Imaging Inc\n0C:3C:CD\t\tUniversal Global Scientific Industrial Co., Ltd.\n0C:3E:9F\t\tApple, Inc.\n0C:41:01\t\tRuichi Auto Technology (Guangzhou) Co., Ltd.\n0C:41:3E\t\tMicrosoft Corporation\n0C:41:E9\t\tHuawei Technologies Co.,Ltd\n0C:42:A1\t\tMellanox Technologies, Inc.\n0C:43:14\t\tSilicon Laboratories\n0C:43:F9\t\tAmazon Technologies Inc.\n0C:44:C0\t\tzte corporation\n0C:45:BA\t\tHuawei Technologies Co.,Ltd\n0C:46:9D\t\tMS Sedco\n0C:47:3D\t\tHitron Technologies. Inc\n0C:47:A9\t\tIEEE Registration Authority\n0C:47:A9:00:00:00/28\tDigital Telemedia Technology Private Limited\n0C:47:A9:10:00:00/28\tShanghai BST Electric Co.,ltd\n0C:47:A9:20:00:00/28\tAnnapurna labs\n0C:47:A9:30:00:00/28\tHongkong Stoneoim Technology Limited\n0C:47:A9:40:00:00/28\tPrivate\n0C:47:A9:50:00:00/28\tEveron Co., Ltd.\n0C:47:A9:60:00:00/28\tShenzhen Hahappylife Innovations Electronics Technology Co.,Ltd\n0C:47:A9:70:00:00/28\tAnnapurna labs\n0C:47:A9:80:00:00/28\tHonest Networks LLC\n0C:47:A9:90:00:00/28\tShanghai Sigen New Energy Technology Co., Ltd\n0C:47:A9:A0:00:00/28\tLens Technology (Xiangtan) Co.,Ltd\n0C:47:A9:B0:00:00/28\tShenzhen Hebang Electronic Co., Ltd\n0C:47:A9:C0:00:00/28\tAnnapurna labs\n0C:47:A9:D0:00:00/28\tDig_Link\n0C:47:A9:E0:00:00/28\tBGResearch\n0C:47:C9\t\tAmazon Technologies Inc.\n0C:48:85\t\tLG Electronics (Mobile Communications)\n0C:48:C6\t\tCelestica Inc.\n0C:49:33\t\tSichuan Jiuzhou Electronic Technology Co., Ltd.\n0C:4B:48\t\tNokia\n0C:4B:54\t\tTp-Link Technologies Co.,Ltd.\n0C:4B:EE\t\tTexas Instruments\n0C:4C:39\t\tMitraStar Technology Corp.\n0C:4D:E9\t\tApple, Inc.\n0C:4E:A0\t\tEspressif Inc.\n0C:4E:C0\t\tMaxlinear Inc\n0C:4F:5A\t\tASA-RT s.r.l.\n0C:4F:9B\t\tHuawei Technologies Co.,Ltd\n0C:51:01\t\tApple, Inc.\n0C:51:7E\t\tApple, Inc.\n0C:51:F7\t\tChauvin Arnoux\n0C:52:03\t\tAgm Group Limited\n0C:53:31\t\tETH Zurich\n0C:53:B7\t\tApple, Inc.\n0C:54:15\t\tIntel Corporate\n0C:54:A5\t\tPegatron Corporation\n0C:54:B9\t\tNokia\n0C:55:21\t\tAxiros GmbH\n0C:56:5C\t\tHyBroad Vision (Hong Kong) Technology Co Ltd\n0C:57:EB\t\tMueller Systems\n0C:58:42\t\tDME Micro\n0C:59:9C\t\tJuniper Networks\n0C:5A:19\t\tAxtion Sdn Bhd\n0C:5A:9E\t\tWi-SUN Alliance\n0C:5C:B5\t\tIEEE Registration Authority\n0C:5C:B5:00:00:00/28\tYamasei\n0C:5C:B5:10:00:00/28\tavxav Electronic Trading LLC\n0C:5C:B5:20:00:00/28\tHongKong Blossom Limited\n0C:5C:B5:30:00:00/28\tiH&S Technology Limited\n0C:5C:B5:40:00:00/28\tAnnapurna labs\n0C:5C:B5:50:00:00/28\tThe Raymond Corporation\n0C:5C:B5:60:00:00/28\tS2C limited\n0C:5C:B5:70:00:00/28\tEnergybox Limited\n0C:5C:B5:80:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n0C:5C:B5:90:00:00/28\tColordeve International\n0C:5C:B5:A0:00:00/28\tZhengzhou coal machinery hydraulic electric control Co.,Ltd\n0C:5C:B5:B0:00:00/28\tADI Global Distribution\n0C:5C:B5:C0:00:00/28\tHunan Newman Car NetworKing Technology Co.,Ltd\n0C:5C:B5:D0:00:00/28\tBSU Inc\n0C:5C:B5:E0:00:00/28\tMunters Europe AB\n0C:5C:D8\t\tDOLI Elektronik GmbH\n0C:5F:35\t\tNiagara Video Corporation\n0C:60:46\t\tvivo Mobile Communication Co., Ltd.\n0C:60:76\t\tHon Hai Precision Ind. Co.,Ltd.\n0C:61:11\t\tAnda Technologies SAC\n0C:61:27\t\tActiontec Electronics, Inc\n0C:61:CF\t\tTexas Instruments\n0C:62:A6\t\tHui Zhou Gaoshengda Technology Co.,LTD\n0C:63:FC\t\tNanjing Signway Technology Co., Ltd\n0C:64:22\t\tBeijing Wiseasy Technology Co.,Ltd.\n0C:65:9A\t\tPanasonic Automotive Systems Company of America\n0C:67:14\t\tSernet (Suzhou) Technologies Corporation\n0C:67:43\t\tHuawei Technologies Co.,Ltd\n0C:68:03\t\tCisco Systems, Inc\n0C:68:25\t\tSuzhou HYC technology Co., Ltd.\n0C:6A:BC\t\tFiberhome Telecommunication Technologies Co.,LTD\n0C:6A:C4\t\tApple, Inc.\n0C:6A:E6\t\tStanley Security Solutions\n0C:6E:4F\t\tPrimeVOLT Co., Ltd.\n0C:6F:9C\t\tShaw Communications Inc.\n0C:70:43\t\tSony Interactive Entertainment Inc.\n0C:70:4A\t\tHuawei Technologies Co.,Ltd\n0C:71:5D\t\tSamsung Electronics Co.,Ltd\n0C:71:8C\t\tTCT mobile ltd\n0C:72:2C\t\tTp-Link Technologies Co.,Ltd.\n0C:72:74\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n0C:72:D9\t\tzte corporation\n0C:73:29\t\tSercomm Corporation.\n0C:73:BE\t\tDongguan Haimai Electronie Technology Co.,Ltd\n0C:73:EB\t\tIEEE Registration Authority\n0C:73:EB:00:00:00/28\tGemini Data Loggers (UK) Limited\n0C:73:EB:10:00:00/28\tEversec Technology Corporation\n0C:73:EB:20:00:00/28\tDeltapath, Inc.\n0C:73:EB:30:00:00/28\tTiinlab Acoustic Technology (Shenzhen) Co., Ltd.\n0C:73:EB:40:00:00/28\tU-Pass.Co.,Ltd\n0C:73:EB:50:00:00/28\tHusty M.Styczen J.Hupert Sp.J.\n0C:73:EB:60:00:00/28\tGreen Fox Electro AS\n0C:73:EB:70:00:00/28\tDinkle Enterprise Co., Ltd.\n0C:73:EB:80:00:00/28\tBeijing Miiiw Technology Co., Ltd\n0C:73:EB:90:00:00/28\tBeijing L&S Lancom Platform Tech. Co., Ltd.\n0C:73:EB:A0:00:00/28\tDana\n0C:73:EB:B0:00:00/28\tSynaccess Networks\n0C:73:EB:C0:00:00/28\tShenzhen Samchung Video Technology Co., Ltd.\n0C:73:EB:D0:00:00/28\tD-Link （Shanghai）Limited Corp.\n0C:73:EB:E0:00:00/28\tTaiwan Pulse Motion Co., Ltd.\n0C:74:C2\t\tApple, Inc.\n0C:75:12\t\tShenzhen Kunlun TongTai Technology  Co.,Ltd.\n0C:75:23\t\tBeijing Gehua Catv Network Co.,Ltd\n0C:75:6C\t\tAnaren Microwave, Inc.\n0C:75:BD\t\tCisco Systems, Inc\n0C:75:D2\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n0C:77:1A\t\tApple, Inc.\n0C:79:55\t\tHui Zhou Gaoshengda Technology Co.,LTD\n0C:7A:15\t\tIntel Corporate\n0C:7B:C8\t\tCisco Meraki\n0C:7C:28\t\tNokia Solutions and Networks GmbH & Co. KG\n0C:7D:7C\t\tKexiang Information Technology Co, Ltd.\n0C:7D:B0\t\tMotorola Mobility LLC, a Lenovo Company\n0C:7E:24\t\tGarmin International\n0C:7F:B2\t\tCommscope\n0C:7F:ED\t\tIEEE Registration Authority\n0C:7F:ED:00:00:00/28\tGuangdong Tianshu New Energy Technology Co., Ltd\n0C:7F:ED:10:00:00/28\tToast, Inc.\n0C:7F:ED:20:00:00/28\tTango Networks Inc\n0C:7F:ED:30:00:00/28\tSoft dB\n0C:7F:ED:40:00:00/28\tPurple Mountain ,Inc\n0C:7F:ED:50:00:00/28\tShenZhen TianGang Micro Technology CO.LTD\n0C:7F:ED:60:00:00/28\tNetweb Technologies India Pvt Ltd\n0C:7F:ED:70:00:00/28\tGrandway Technology (Shenzhen) Limited\n0C:7F:ED:80:00:00/28\tU-tec Group Inc.\n0C:7F:ED:90:00:00/28\tShenzhen ORVIBO Technology Co., Ltd.\n0C:7F:ED:A0:00:00/28\tAnnapurna labs\n0C:7F:ED:B0:00:00/28\tTelX Systems\n0C:7F:ED:C0:00:00/28\tShenzhen MoreSense Technology Co., Ltd.\n0C:7F:ED:D0:00:00/28\tALT Co., Ltd.\n0C:7F:ED:E0:00:00/28\tenvironmental systems corporation\n0C:80:2F\t\tMurata Manufacturing Co., Ltd.\n0C:80:63\t\tTp-Link Technologies Co.,Ltd.\n0C:81:12\t\tPrivate\n0C:81:26\t\tJuniper Networks\n0C:81:7D\t\tEEP Elektro-Elektronik Pranjic GmbH\n0C:82:30\t\tShenzhen Magnus Technologies Co.,Ltd\n0C:82:47\t\tCig Shanghai Co Ltd\n0C:82:68\t\tTp-Link Technologies Co.,Ltd.\n0C:82:6A\t\tWuhan Huagong Genuine Optics Technology Co., Ltd\n0C:82:D5\t\tMaxio Technology Hangzhou Co., Ltd.\n0C:83:06\t\tHuawei Device Co., Ltd.\n0C:83:9A\t\tHuawei Device Co., Ltd.\n0C:83:CC\t\tAlpha Networks Inc.\n0C:84:08\t\tHuawei Technologies Co.,Ltd\n0C:84:11\t\tA.O. Smith Water Products\n0C:84:47\t\tFiberhome Telecommunication Technologies Co.,LTD\n0C:84:84\t\tZenovia Electronics Inc.\n0C:84:DC\t\tHon Hai Precision Ind. Co.,Ltd.\n0C:85:25\t\tCisco Systems, Inc\n0C:85:E1\t\tApple, Inc.\n0C:86:10\t\tJuniper Networks\n0C:86:29\t\tIEEE Registration Authority\n0C:86:29:00:00:00/28\tShanghai Prophet Electronic Technology Co.,Ltd\n0C:86:29:10:00:00/28\tBeijing Qinmu Data Technology Co., Ltd.\n0C:86:29:20:00:00/28\tBADA SYSTEM co., Ltd\n0C:86:29:30:00:00/28\tAnnapurna labs\n0C:86:29:40:00:00/28\tAg Express Electronics\n0C:86:29:50:00:00/28\tShenzhen protostellar technology Co., Ltd\n0C:86:29:60:00:00/28\tC&A Marketing, INC.\n0C:86:29:70:00:00/28\tHagerEnergy GmbH\n0C:86:29:80:00:00/28\tMyGregor Ltd\n0C:86:29:90:00:00/28\tHongkong Saint Tech Industrial Limited\n0C:86:29:A0:00:00/28\tNipron Co.,Ltd\n0C:86:29:B0:00:00/28\tAkribis Systems\n0C:86:29:C0:00:00/28\tShenzhen Yingmu Technology.,Ltd\n0C:86:29:D0:00:00/28\tBeijing Beibianzhida Technology Co.,Ltd\n0C:86:29:E0:00:00/28\tFx Technology Limited\n0C:86:C7\t\tJabil Circuit (Guangzhou) Limited\n0C:87:72\t\tFujian Star-Net Communication Co.,Ltd\n0C:89:10\t\tSamsung Electronics Co.,Ltd\n0C:8A:87\t\tAgLogica Holdings, Inc\n0C:8B:7D\t\tVizio, Inc\n0C:8B:95\t\tEspressif Inc.\n0C:8B:A2\t\tHuawei Technologies Co.,Ltd\n0C:8B:D3\t\tItel Mobile Limited\n0C:8B:FD\t\tIntel Corporate\n0C:8C:24\t\tShenzhen Bilian Electronic Co.，Ltd\n0C:8C:69\t\tShenzhen elink smart Co., ltd\n0C:8C:8F\t\tKamo Technology Limited\n0C:8C:DC\t\tSuunto Oy\n0C:8D:7A\t\tRADiflow\n0C:8D:98\t\tTop Eight Ind Corp\n0C:8D:CA\t\tSamsung Electronics Co.,Ltd\n0C:8D:DB\t\tCisco Meraki\n0C:8E:29\t\tArcadyan Corporation\n0C:8F:FF\t\tHuawei Technologies Co.,Ltd\n0C:90:43\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n0C:91:60\t\tHui Zhou Gaoshengda Technology Co.,LTD\n0C:91:92\t\tIntel Corporate\n0C:92:4E\t\tRice Lake Weighing Systems\n0C:93:01\t\tPT. Prasimax Inovasi Teknologi\n0C:93:8F\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n0C:93:A5\t\teero inc.\n0C:93:FB\t\tBNS Solutions\n0C:95:05\t\tThe Chamberlain Group, Inc\n0C:95:15\t\tPalltronics, Inc.\n0C:95:41\t\tChipsea Technologies (Shenzhen) Corp.\n0C:96:BF\t\tHuawei Technologies Co.,Ltd\n0C:96:CD\t\tMercury Corporation\n0C:96:E6\t\tCloud Network Technology (Samoa) Limited\n0C:97:5F\t\tHewlett Packard Enterprise\n0C:97:9B\t\tFujian Star-Net Communication Co.,Ltd\n0C:98:38\t\tXiaomi Communications Co Ltd\n0C:9A:3C\t\tIntel Corporate\n0C:9A:42\t\tFn-Link Technology Limited\n0C:9B:13\t\tShanghai Magic Mobile Telecommunication Co.Ltd.\n0C:9B:78\t\tExtreme Networks Headquarters\n0C:9D:56\t\tConsort Controls Ltd\n0C:9D:92\t\tASUSTek COMPUTER INC.\n0C:9E:91\t\tSankosha Corporation\n0C:9F:71\t\tDolphin Electronics (DongGuan) Co., Ltd.\n0C:A0:6C\t\tIndustrial Cyber Sensing Inc.\n0C:A1:38\t\tBLiNQ Networks Inc.\n0C:A2:F4\t\tChameleon Technology (UK) Limited\n0C:A4:02\t\tAlcatel-Lucent IPD\n0C:A4:2A\t\tOB Telecom Electronic Technology Co., Ltd\n0C:A6:4C\t\tHangzhou Ezviz Software Co.,Ltd.\n0C:A6:94\t\tSunitec Enterprise Co.,Ltd\n0C:A8:A7\t\tSamsung Electronics Co.,Ltd\n0C:A9:4A\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n0C:AA:EE\t\tAnsjer Electronics Co., Ltd.\n0C:AC:05\t\tUnitend Technologies Inc.\n0C:AC:8A\t\tSagemcom Broadband SAS\n0C:AE:5F\t\tSilicon Laboratories\n0C:AE:7D\t\tTexas Instruments\n0C:AE:BD\t\tEdifier International\n0C:AF:31\t\tCisco Systems, Inc\n0C:AF:5A\t\tGenus Power Infrastructures Limited\n0C:B0:88\t\tAITelecom\n0C:B2:B7\t\tTexas Instruments\n0C:B3:19\t\tSamsung Electronics Co.,Ltd\n0C:B3:4F\t\tShenzhen Xiaoqi Intelligent Technology Co., Ltd.\n0C:B4:59\t\tMarketech International Corp.\n0C:B4:A4\t\tXintai Automobile Intelligent Network Technology\n0C:B4:EF\t\tDigience Co.,Ltd.\n0C:B5:27\t\tHuawei Technologies Co.,Ltd\n0C:B5:B3\t\tHuawei Device Co., Ltd.\n0C:B5:DE\t\tAlcatel Lucent\n0C:B6:D2\t\tD-Link International\n0C:B7:71\t\tCommscope\n0C:B7:87\t\tHuawei Technologies Co.,Ltd\n0C:B7:89\t\tHonor Device Co., Ltd.\n0C:B7:8E\t\tHuawei Device Co., Ltd.\n0C:B8:15\t\tEspressif Inc.\n0C:B8:E8\t\tRenesas Electronics (Penang) Sdn. Bhd.\n0C:B9:12\t\tJM-DATA GmbH\n0C:B9:37\t\tUbee Interactive Co., Limited\n0C:B9:83\t\tHonor Device Co., Ltd.\n0C:BC:9F\t\tApple, Inc.\n0C:BD:51\t\tTCT mobile ltd\n0C:BD:75\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n0C:BE:F1\t\tHuawei Device Co., Ltd.\n0C:BF:15\t\tGenetec Inc.\n0C:BF:3F\t\tShenzhen Lencotion Technology Co.,Ltd\n0C:BF:74\t\tMorse Micro\n0C:C0:C0\t\tMagneti Marelli Sistemas Electronicos Mexico\n0C:C1:19\t\tShenzhen Phaten Tech. LTD\n0C:C3:A7\t\tMeritec\n0C:C3:B8\t\tShenzhen Jiahua Zhongli Technology Co., LTD\n0C:C4:13\t\tGoogle, Inc.\n0C:C4:7A\t\tSuper Micro Computer, Inc.\n0C:C4:7E\t\tEUCAST Co., Ltd.\n0C:C5:6C\t\tApple, Inc.\n0C:C6:55\t\tWuxi YSTen Technology Co.,Ltd.\n0C:C6:6A\t\tNokia Corporation\n0C:C6:AC\t\tDags\n0C:C6:CC\t\tHuawei Technologies Co.,Ltd\n0C:C6:FD\t\tXiaomi Communications Co Ltd\n0C:C7:31\t\tCurrant, Inc.\n0C:C8:1F\t\tSummer Infant, Inc.\n0C:C8:44\t\tCambridge Mobile Telematics, Inc.\n0C:C9:C6\t\tSamwin Hong Kong Limited\n0C:CA:FB\t\tTPVision Europe B.V\n0C:CB:0C\t\tiSYS RTS GmbH\n0C:CB:85\t\tMotorola Mobility LLC, a Lenovo Company\n0C:CB:8D\t\tASCO Numatics GmbH\n0C:CC:26\t\tAirenetworks\n0C:CC:47\t\tIEEE Registration Authority\n0C:CC:47:00:00:00/28\tShenzhen Jooan Technology  Co., Ltd\n0C:CC:47:10:00:00/28\tGeneral Industrial Controls Pvt Ltd\n0C:CC:47:20:00:00/28\tSun Yan International Trading Ltd.\n0C:CC:47:30:00:00/28\tShimane Masuda Electronics CO.,LTD.\n0C:CC:47:40:00:00/28\tQingdao Geesatcom Technology Co., Ltd\n0C:CC:47:50:00:00/28\tDmecom Telecom Co.,Ltd.\n0C:CC:47:60:00:00/28\tAnnapurna labs\n0C:CC:47:70:00:00/28\tCyrus Audio LTD\n0C:CC:47:80:00:00/28\tNingbo Qixiang Information Technology Co., Ltd\n0C:CC:47:90:00:00/28\tOptConnect\n0C:CC:47:A0:00:00/28\tRich Source Precision IND., Co., LTD.\n0C:CC:47:B0:00:00/28\tSpot AI, Inc.\n0C:CC:47:C0:00:00/28\tKumi Electronic Components\n0C:CC:47:D0:00:00/28\tGODOX Photo Equipment Co., Ltd.\n0C:CC:47:E0:00:00/28\tFoxconn Brasil Industria e Comercio Ltda\n0C:CD:B4\t\tSichuan AI-Link Technology Co., Ltd.\n0C:CD:D3\t\tEastriver Technology Co., Ltd.\n0C:CD:FB\t\tEDIC Systems Inc.\n0C:CE:F6\t\tGuizhou Fortuneship Technology Co., Ltd\n0C:CF:89\t\tShenzhen Bilian Electronic Co.，Ltd\n0C:CF:D1\t\tSPRINGWAVE Co., Ltd\n0C:D0:F8\t\tCisco Systems, Inc\n0C:D2:92\t\tIntel Corporate\n0C:D2:B5\t\tBinatone Telecommunication Pvt. Ltd\n0C:D3:A1\t\tMonthly Kitchen\n0C:D5:02\t\tWestell Technologies Inc.\n0C:D5:D3\t\tCisco Systems, Inc\n0C:D6:96\t\tAmimon Ltd\n0C:D6:BD\t\tHuawei Technologies Co.,Ltd\n0C:D7:46\t\tApple, Inc.\n0C:D7:C2\t\tAxium Technologies, Inc.\n0C:D8:6C\t\tShenzhen Fast Technologies Co.,Ltd\n0C:D9:23\t\tGOCLOUD Networks(GAOKE Networks)\n0C:D9:96\t\tCisco Systems, Inc\n0C:D9:C1\t\tVisteon Corporation\n0C:DA:41\t\tHangzhou H3C Technologies Co., Limited\n0C:DB:EA\t\tApple, Inc.\n0C:DC:7E\t\tEspressif Inc.\n0C:DC:91\t\tAmazon Technologies Inc.\n0C:DC:CC\t\tInala Technologies\n0C:DD:24\t\tIntel Corporate\n0C:DD:EF\t\tNokia Corporation\n0C:DF:A4\t\tSamsung Electronics Co.,Ltd\n0C:E0:41\t\tiDruide\n0C:E0:DC\t\tSamsung Electronics Co.,Ltd\n0C:E0:E4\t\tPlantronics, Inc.\n0C:E0:FC\t\tEdgecore Americas Networking Corporation\n0C:E1:59\t\tShenzhen iStartek Technology Co., Ltd.\n0C:E4:41\t\tApple, Inc.\n0C:E4:A0\t\tHuawei Device Co., Ltd.\n0C:E5:A3\t\tSharkNinja\n0C:E5:B5\t\tHuawei Technologies Co.,Ltd\n0C:E5:D3\t\tDH electronics GmbH\n0C:E6:7C\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n0C:E7:09\t\tFox Crypto B.V.\n0C:E7:25\t\tMicrosoft Corporation\n0C:E8:2F\t\tBonfiglioli Vectron GmbH\n0C:E9:36\t\tELIMOS srl\n0C:E9:9A\t\tAtls Altec\n0C:EA:14\t\tUbiquiti Inc\n0C:EA:C9\t\tCommscope\n0C:EC:80\t\tTexas Instruments\n0C:EC:84\t\tShenzhen TINNO Mobile Technology Corp.\n0C:EC:8D\t\tMotorola Mobility LLC, a Lenovo Company\n0C:ED:71\t\tExtreme Networks Headquarters\n0C:ED:C8\t\tXiaomi Communications Co Ltd\n0C:EE:20\t\tFbc\n0C:EE:99\t\tAmazon Technologies Inc.\n0C:EE:E6\t\tHon Hai Precision Ind. Co.,Ltd.\n0C:EF:15\t\tTP-Link Systems Inc.\n0C:EF:7C\t\tAnaCom Inc\n0C:EF:AF\t\tIEEE Registration Authority\n0C:EF:AF:00:00:00/28\tKenmore\n0C:EF:AF:10:00:00/28\tGoerlitz AG\n0C:EF:AF:20:00:00/28\tLumel S.A.\n0C:EF:AF:30:00:00/28\tEngineering Center ENERGOSERVICE\n0C:EF:AF:40:00:00/28\tSentry360\n0C:EF:AF:50:00:00/28\tPremium Sa\n0C:EF:AF:60:00:00/28\tFirmware Design AS\n0C:EF:AF:70:00:00/28\tSyntrans AB\n0C:EF:AF:80:00:00/28\tBSX Athletics\n0C:EF:AF:90:00:00/28\tRotel\n0C:EF:AF:A0:00:00/28\tchengdu joyotime Technology Co., Ltd.\n0C:EF:AF:B0:00:00/28\tHubei Century Network Technology Co., Ltd\n0C:EF:AF:C0:00:00/28\tGainStrong Industry Co.,Ltd\n0C:EF:AF:D0:00:00/28\tCJSC «Svyaz Engineering»\n0C:EF:AF:E0:00:00/28\tInfinisource Inc.\n0C:EF:AF:F0:00:00/28\tPrivate\n0C:EF:F6\t\tSilicon Laboratories\n0C:F0:19\t\tMalgn Technology Co., Ltd.\n0C:F0:7B\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n0C:F0:B4\t\tGlobalsat International Technology Ltd\n0C:F3:46\t\tXiaomi Communications Co Ltd\n0C:F3:61\t\tJava Information\n0C:F3:EE\t\tEM Microelectronic\n0C:F4:05\t\tBeijing Signalway Technologies Co.,Ltd\n0C:F4:75\t\tZliide Technologies ApS\n0C:F4:D5\t\tRuckus Wireless\n0C:F5:A4\t\tCisco Systems, Inc\n0C:F8:93\t\tCommscope\n0C:F9:C0\t\tSky Uk Limited\n0C:FA:22\t\tFlipper Devices Inc\n0C:FC:18\t\tHuawei Technologies Co.,Ltd\n0C:FC:83\t\tAiroha Technology Corp.,\n0C:FD:37\t\tSUSE Linux GmbH\n0C:FE:45\t\tSony Interactive Entertainment Inc.\n0C:FE:5D\t\tIEEE Registration Authority\n0C:FE:5D:00:00:00/28\tChengdu Ledong Information & Technology Co., Ltd.\n0C:FE:5D:10:00:00/28\tFender Musical Instrument\n0C:FE:5D:20:00:00/28\tDspread International Co.,Limited\n0C:FE:5D:30:00:00/28\tBeijing WayClouds Technology Co., Ltd.\n0C:FE:5D:40:00:00/28\tYantai Dongfang Wisdom Electic Co.,Ltd.\n0C:FE:5D:50:00:00/28\tSELECTRIC Nachrichten-Systeme GmbH\n0C:FE:5D:60:00:00/28\tAntailiye Technology Co.,Ltd\n0C:FE:5D:70:00:00/28\tVermes Microdispensing GmbH\n0C:FE:5D:80:00:00/28\tCTK Contact Electronics co., Ltd.\n0C:FE:5D:90:00:00/28\tCelerway Communication AS\n0C:FE:5D:A0:00:00/28\tFujian Jieyu Computer Technology Co., Ltd.\n0C:FE:5D:B0:00:00/28\tYinuo-Link Limited\n0C:FE:5D:C0:00:00/28\tBepal Technology Co.,Ltd.\n0C:FE:5D:D0:00:00/28\tMaksat Technologies P Ltd\n0C:FE:5D:E0:00:00/28\tNewgreen Tech Co., Ltd.\n0C:FE:7B\t\tVantiva USA LLC\n10:00:00\t\tPrivate\n10:00:20\t\tApple, Inc.\n10:00:3B\t\tEspressif Inc.\n10:00:5A\t\tIBM Corp\n10:00:E8\t\tNational Semiconductor\n10:00:FD\t\tLaonPeople\n10:01:77\t\tHuawei Technologies Co.,Ltd\n10:01:CA\t\tAshley Butterworth\n10:02:B5\t\tIntel Corporate\n10:04:C1\t\tJD Cloud Computing Co., Ltd.\n10:05:01\t\tPegatron Corporation\n10:05:B1\t\tCommscope\n10:05:CA\t\tCisco Systems, Inc\n10:05:E1\t\tNokia\n10:06:1C\t\tEspressif Inc.\n10:06:45\t\tSagemcom Broadband SAS\n10:06:48\t\tIEEE Registration Authority\n10:06:48:00:00:00/28\tFlextronics Technologies (India) Pvt Ltd\n10:06:48:10:00:00/28\tKytronics\n10:06:48:20:00:00/28\tDynics\n10:06:48:30:00:00/28\tilluminous LLC\n10:06:48:40:00:00/28\tBeijing Cheering Networks Technology Co., Ltd.\n10:06:48:50:00:00/28\tAnnapurna labs\n10:06:48:60:00:00/28\tHong Kong BOZZ Co., Limited.\n10:06:48:70:00:00/28\tWilson Electronics\n10:06:48:80:00:00/28\tZhejiang Chenghao Technology Co. , Ltd.\n10:06:48:90:00:00/28\tAnnapurna labs\n10:06:48:A0:00:00/28\tDreame Innovation Technology(Suzhou) Co.,Ltd.\n10:06:48:B0:00:00/28\tShenzhen smart-core technology co.,ltd.\n10:06:48:C0:00:00/28\tDongguan Hongyexiang Industrial Co.,Ltd\n10:06:48:D0:00:00/28\tMicrovast Energy\n10:06:48:E0:00:00/28\tKloud-12 LLC\n10:06:ED\t\tCisco Systems, Inc\n10:07:1D\t\tFiberhome Telecommunication Technologies Co.,LTD\n10:07:23\t\tIEEE Registration Authority\n10:07:23:00:00:00/28\tRippleTek Tech Ltd\n10:07:23:10:00:00/28\tBeijing Assem Technology Co., ltd\n10:07:23:20:00:00/28\tDiginet Control Systems Pty Ltd\n10:07:23:30:00:00/28\tTongfang computer co.Ltd.\n10:07:23:40:00:00/28\tAudio Engineering Ltd.\n10:07:23:50:00:00/28\tBeijing Sooall Information Technology Co.,Ltd\n10:07:23:60:00:00/28\tEstone Technology Inc\n10:07:23:70:00:00/28\tnanoTech Co., Ltd.\n10:07:23:80:00:00/28\tIon Professional Solutions\n10:07:23:90:00:00/28\tWireless input technology Inc.\n10:07:23:A0:00:00/28\tTessera Technology Inc.\n10:07:23:B0:00:00/28\tFujian Quanzhou Dong Ang Electronics Co., Ltd.\n10:07:23:C0:00:00/28\tShenzhen Xinfa Electronic Co.,ltd\n10:07:23:E0:00:00/28\tFirst Chair Acoustics Co., Ltd.\n10:07:23:F0:00:00/28\tPrivate\n10:07:B6\t\tSamsung Electronics Co.,Ltd\n10:08:2C\t\tTexas Instruments\n10:08:B1\t\tHon Hai Precision Ind. Co.,Ltd.\n10:09:0C\t\tJANOME Corporation\n10:09:F9\t\tAmazon Technologies Inc.\n10:0B:A9\t\tIntel Corporate\n10:0C:24\t\tpomdevices, LLC\n10:0C:29\t\tShenzhen NORCO lntelligent Technology Co.,Ltd\n10:0C:6B\t\tNetgear\n10:0D:2F\t\tOnline Security Pty. Ltd.\n10:0D:32\t\tEmbedian, Inc.\n10:0D:7F\t\tNetgear\n10:0D:8C\t\tHuawei Device Co., Ltd.\n10:0E:2B\t\tNEC CASIO Mobile Communications\n10:0E:7E\t\tJuniper Networks\n10:0F:18\t\tFu Gang Electronic(KunShan)CO.,LTD\n10:10:81\t\tzte corporation\n10:10:B6\t\tMcCain Inc\n10:12:12\t\tVivo International Corporation Pty Ltd\n10:12:18\t\tKorins Inc.\n10:12:48\t\tITG, Inc.\n10:12:50\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n10:12:B4\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n10:12:D0\t\tzte corporation\n10:12:FB\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n10:13:31\t\tTechnicolor Delivery Technologies Belgium NV\n10:13:EE\t\tJustec International Technology INC.\n10:15:C1\t\tZhanzuo (Beijing) Technology Co., Ltd.\n10:18:49\t\tWeifang Goertek Electronics Co.,Ltd\n10:18:9E\t\tElmo Motion Control\n10:19:65\t\tNew H3C Technologies Co., Ltd\n10:1A:92\t\tAkebono Brake Industry Co.,Ltd.\n10:1B:54\t\tHuawei Technologies Co.,Ltd\n10:1C:0C\t\tApple, Inc.\n10:1D:51\t\t8Mesh Networks Limited\n10:1D:6E\t\tHewlett Packard Enterprise\n10:1D:C0\t\tSamsung Electronics Co.,Ltd\n10:1E:DA\t\tIngenico Terminals Sas\n10:1F:74\t\tHewlett Packard\n10:20:BA\t\tEspressif Inc.\n10:22:79\t\tZeroDesktop, Inc.\n10:23:81\t\tBarrot Technology Co.,LTD\n10:24:07\t\tHuawei Technologies Co.,Ltd\n10:25:CE\t\tELKA - Torantriebe GmbH u. Co. Betriebs KG\n10:27:79\t\tSadel S.p.A.\n10:27:BE\t\tTvip\n10:27:F5\t\tTP-Link Systems Inc\n10:28:31\t\tMorion Inc.\n10:28:34\t\tSALZ Automation GmbH\n10:28:74\t\tShenzhen Jingxun Technology Co., Ltd.\n10:29:59\t\tApple, Inc.\n10:29:AB\t\tSamsung Electronics Co.,Ltd\n10:2A:B3\t\tXiaomi Communications Co Ltd\n10:2B:41\t\tSamsung Electronics Co.,Ltd\n10:2B:AA\t\tSagemcom Broadband SAS\n10:2C:6B\t\tAMPAK Technology, Inc.\n10:2C:83\t\tXimea\n10:2C:8D\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n10:2C:B1\t\tSmart Innovation LLC\n10:2C:EF\t\tEMU Electronic AG\n10:2D:31\t\tShenzhen Americas Trading Company LLC\n10:2D:41\t\tSichuan AI-Link Technology Co., Ltd.\n10:2D:96\t\tLooxcie Inc.\n10:2E:00\t\tIntel Corporate\n10:2E:AF\t\tTexas Instruments\n10:2F:6B\t\tMicrosoft Corporation\n10:2F:6E\t\tShenzhen Sundray Technologies company Limited\n10:2F:A3\t\tShenzhen Uvision-tech Technology Co.Ltd\n10:2F:CA\t\tApple, Inc.\n10:2F:F8\t\tVicoretek (Nanjing) Co.,Ltd.\n10:30:25\t\tApple, Inc.\n10:30:34\t\tCara Systems\n10:30:47\t\tSamsung Electronics Co.,Ltd\n10:32:1D\t\tHuawei Technologies Co.,Ltd\n10:32:2C\t\tMurata Manufacturing Co., Ltd.\n10:32:7E\t\tHuawei Device Co., Ltd.\n10:33:78\t\tFLECTRON Co., LTD\n10:33:BF\t\tVantiva USA LLC\n10:34:1B\t\tSpacelink\n10:35:97\t\tQorvo Utrecht B.V.\n10:36:4A\t\tBoston Dynamics\n10:36:AA\t\tVantiva - Connected Home\n10:37:11\t\tNorbit Its\n10:38:1F\t\tSichuan AI-Link Technology Co., Ltd.\n10:39:17\t\tSamsung Electronics Co.,Ltd\n10:39:4E\t\tHisense broadband multimedia technology Co.,Ltd\n10:39:E9\t\tJuniper Networks\n10:3B:59\t\tSamsung Electronics Co.,Ltd\n10:3C:59\t\tzte corporation\n10:3D:0A\t\tHui Zhou Gaoshengda Technology Co.,LTD\n10:3D:1C\t\tIntel Corporate\n10:3D:3E\t\tChina Mobile Group Device Co.,Ltd.\n10:3D:EA\t\tHFC Technology (Beijing) Ltd. Co.\n10:3F:44\t\tXiaomi Communications Co Ltd\n10:3F:8C\t\tNew H3C Technologies Co., Ltd\n10:40:F3\t\tApple, Inc.\n10:41:21\t\tTellescom Industria E Comercio Em Telecomunicacao\n10:41:7F\t\tApple, Inc.\n10:42:10\t\tApple, Inc.\n10:43:69\t\tSoundmax Electronic Limited\n10:44:00\t\tHuawei Technologies Co.,Ltd\n10:44:5A\t\tShaanxi Hitech Electronic Co., LTD\n10:45:BE\t\tNorphonic AS\n10:45:F8\t\tLNT-Automation GmbH\n10:46:B4\t\tFormericaOE\n10:47:38\t\tNokia Shanghai Bell Co., Ltd.\n10:47:80\t\tHuawei Technologies Co.,Ltd\n10:47:E7\t\tShenzhen YOUHUA Technology Co., Ltd\n10:48:B1\t\tBeijing Duokan Technology Limited\n10:49:63\t\tHarting K.K.\n10:4A:7D\t\tIntel Corporate\n10:4B:46\t\tMitsubishi Electric Corporation\n10:4C:43\t\tFiberhome Telecommunication Technologies Co.,LTD\n10:4D:15\t\tViaanix Inc\n10:4D:77\t\tInnovative Computer Engineering\n10:4E:07\t\tShanghai Genvision Industries Co.,Ltd\n10:4E:20\t\tHse Smart\n10:4E:89\t\tGarmin International\n10:4F:58\t\tHewlett Packard Enterprise\n10:4F:A8\t\tSony Corporation\n10:50:72\t\tSercomm Corporation.\n10:51:07\t\tIntel Corporate\n10:51:72\t\tHuawei Technologies Co.,Ltd\n10:51:DB\t\tEspressif Inc.\n10:52:1C\t\tEspressif Inc.\n10:52:BD\t\tHuawei Technologies Co.,Ltd\n10:54:03\t\tINTARSO GmbH\n10:54:D2\t\tIEEE Registration Authority\n10:54:D2:00:00:00/28\tGIPS Technology Co., Ltd.\n10:54:D2:10:00:00/28\tJiangxi Ofilm&Jvneng IoT Tech Co., Ltd.\n10:54:D2:20:00:00/28\tComNav Technology Ltd.\n10:54:D2:30:00:00/28\tLittle Array Technology (Shenzhen) Co., Ltd.\n10:54:D2:40:00:00/28\tRaylogic Control Systems Private Limited\n10:54:D2:50:00:00/28\tSybersense\n10:54:D2:60:00:00/28\tLanao Communication Technology Limited\n10:54:D2:70:00:00/28\tShenzhen Carsafe Technology Development Co.,Ltd\n10:54:D2:80:00:00/28\tAnnapurna labs\n10:54:D2:90:00:00/28\tBamboo Dynamics Corporation., Ltd.\n10:54:D2:A0:00:00/28\tEmbion B.V.\n10:54:D2:B0:00:00/28\tShenzhen Dinstech Technology Co.,Ltd.\n10:54:D2:C0:00:00/28\tLUXSHARE-ICT Co., Ltd.\n10:54:D2:D0:00:00/28\tSun wealth technology corporation limited\n10:54:D2:E0:00:00/28\tCosmo Aiot Technology Co Ltd\n10:55:E4\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n10:56:11\t\tCommscope\n10:56:CA\t\tPeplink International Ltd.\n10:57:25\t\tCisco Systems, Inc\n10:58:87\t\tFiberhome Telecommunication Technologies Co.,LTD\n10:59:17\t\tTonal\n10:59:32\t\tRoku, Inc\n10:5A:17\t\tTuya Smart Inc.\n10:5A:F7\t\tADB Italia\n10:5B:AD\t\tMega Well Limited\n10:5C:3B\t\tPerma-Pipe, Inc.\n10:5C:BF\t\tDuroByte Inc\n10:5D:DC\t\tHuawei Device Co., Ltd.\n10:5E:AE\t\tNew H3C Technologies Co., Ltd\n10:5F:02\t\tRuijie Networks Co.,LTD\n10:5F:06\t\tActiontec Electronics, Inc\n10:5F:49\t\tCisco SPVTG\n10:5F:81\t\tINTENTSECURE Inc.,\n10:5F:AD\t\tIntel Corporate\n10:5F:D4\t\tTendyron Corporation\n10:60:4B\t\tHewlett Packard\n10:62:C9\t\tAdatis GmbH & Co. KG\n10:62:D0\t\tVantiva USA LLC\n10:62:E5\t\tHewlett Packard\n10:62:EB\t\tD-Link International\n10:63:4B\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\n10:63:A3\t\tIEEE Registration Authority\n10:63:A3:00:00:00/28\tChangsha Sunvote Limited\n10:63:A3:10:00:00/28\tJacobs Technology, Inc.\n10:63:A3:20:00:00/28\tSichuan Puhui Zhida Communication Equipment Co. Ltd.\n10:63:A3:30:00:00/28\tNextvision Stabilized Systems LTD\n10:63:A3:40:00:00/28\tGantech E Technologies Private Limited\n10:63:A3:50:00:00/28\tLianxin (Dalian) Technology Co.,Ltd\n10:63:A3:60:00:00/28\tMorgan Schaffer\n10:63:A3:70:00:00/28\tNRS Co., Ltd.\n10:63:A3:80:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n10:63:A3:90:00:00/28\tNexite\n10:63:A3:A0:00:00/28\tITAB Shop products\n10:63:A3:B0:00:00/28\tShen zhen shi shang mei dian zi shang wu you xian gong si\n10:63:A3:C0:00:00/28\tFlat-Pro Llc\n10:63:A3:D0:00:00/28\tTriton Sensors\n10:63:A3:E0:00:00/28\tAnnapurna labs\n10:63:C8\t\tLiteon Technology Corporation\n10:64:E2\t\tADFweb.com s.r.l.\n10:65:19\t\tShenzhen iComm Semiconductor CO.,LTD\n10:65:30\t\tDell Inc.\n10:65:A3\t\tPanamax LLC\n10:65:CF\t\tIqsim\n10:66:50\t\tRobert Bosch JuP1\n10:66:6A\t\tZabbly\n10:66:82\t\tNEC Platforms, Ltd.\n10:67:A3\t\tHuawei Technologies Co.,Ltd\n10:68:38\t\tAzureWave Technology Inc.\n10:68:3F\t\tLG Electronics (Mobile Communications)\n10:6F:3F\t\tBuffalo.Inc\n10:6F:D9\t\tCloud Network Technology Singapore Pte. Ltd.\n10:6F:EF\t\tAd-Sol Nissin Corp\n10:70:FD\t\tMellanox Technologies, Inc.\n10:71:00\t\tHuawei Device Co., Ltd.\n10:71:B3\t\tZyxel Communications Corporation\n10:71:F9\t\tCloud Telecomputers, LLC\n10:71:FA\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n10:72:23\t\tTellescom Industria E Comercio Em Telecomunicacao\n10:73:C6\t\tAugust Internet Limited\n10:73:EB\t\tInfiniti Electro-Optics\n10:74:6F\t\tMotorola Solutions Malaysia Sdn. Bhd.\n10:74:C5\t\tCalix Inc.\n10:76:36\t\tEarda Technologies co Ltd\n10:76:8A\t\tEoCell\n10:77:17\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\n10:77:B0\t\tFiberhome Telecommunication Technologies Co.,LTD\n10:77:B1\t\tSamsung Electronics Co.,Ltd\n10:78:5B\t\tActiontec Electronics, Inc\n10:78:73\t\tShenzhen Jinkeyi Communication Co., Ltd.\n10:78:CE\t\tHanvit SI, Inc.\n10:78:D2\t\tElitegroup Computer Systems Co.,Ltd.\n10:7A:86\t\tU&U Engineering Inc.\n10:7B:44\t\tASUSTek COMPUTER INC.\n10:7B:93\t\tZhen Shi Information Technology (Shanghai) Co., Ltd.\n10:7B:A4\t\tOlive & Dove Co.,Ltd.\n10:7B:CE\t\tNokia\n10:7B:EF\t\tZyxel Communications Corporation\n10:7C:61\t\tASUSTek COMPUTER INC.\n10:7D:1A\t\tDell Inc.\n10:81:B4\t\tHunan Greatwall Galaxy Science and Technology Co.,Ltd.\n10:82:3D\t\tRuijie Networks Co.,LTD\n10:82:86\t\tLuxshare Precision Industry Co.,Ltd\n10:82:D7\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n10:83:B4\t\tSidora Srl\n10:83:D2\t\tMicroseven Systems, LLC\n10:86:8C\t\tCommscope\n10:86:F4\t\tHuawei Device Co., Ltd.\n10:88:0F\t\tDaruma Telecomunicações e Informática S.A.\n10:88:CE\t\tFiberhome Telecommunication Technologies Co.,LTD\n10:89:FB\t\tSamsung Electronics Co.,Ltd\n10:8A:1B\t\tRAONIX Inc.\n10:8A:7B\t\tNokia\n10:8B:6A\t\tAntailiye Technology Co.,Ltd\n10:8C:CF\t\tCisco Systems, Inc\n10:8E:BA\t\tMolekule\n10:8E:E0\t\tSamsung Electronics Co.,Ltd\n10:8F:FE\t\tHuawei Technologies Co.,Ltd\n10:90:7D\t\tFunshion Online Technologies Co.,Ltd\n10:90:FA\t\tNew H3C Technologies Co., Ltd\n10:90:FC\t\tShenzhen DOOGEE Hengtong Technology CO.,LTD\n10:91:66\t\tShenzhen Yinwang Intelligent Technologies Co.,Ltd.\n10:91:A8\t\tEspressif Inc.\n10:91:D1\t\tIntel Corporate\n10:92:66\t\tSamsung Electronics Co.,Ltd\n10:93:97\t\tCommscope\n10:93:E9\t\tApple, Inc.\n10:94:97\t\tLogitech Hong Kong\n10:94:BB\t\tApple, Inc.\n10:95:4B\t\tMegabyte Ltd.\n10:96:1A\t\tChipsea Technologies (Shenzhen) Corp.\n10:96:93\t\tAmazon Technologies Inc.\n10:96:C6\t\tCisco Systems, Inc\n10:97:BD\t\tEspressif Inc.\n10:98:19\t\tDell Inc.\n10:98:26\t\tNokia\n10:98:36\t\tDell Inc.\n10:98:5F\t\tInventus Power Eletronica do Brasil LTDA\n10:98:C3\t\tMurata Manufacturing Co., Ltd.\n10:9A:B9\t\tTosibox Oy\n10:9A:DD\t\tApple, Inc.\n10:9C:70\t\tPrusa Research s.r.o.\n10:9D:7A\t\tHuawei Device Co., Ltd.\n10:9D:9C\t\tEM Microelectronic\n10:9E:3A\t\tZhejiang Tmall Technology Co., Ltd.\n10:9F:41\t\tApple, Inc.\n10:9F:47\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n10:9F:4F\t\tNew H3C Intelligence Terminal Co., Ltd.\n10:9F:A9\t\tActiontec Electronics, Inc\n10:A1:3B\t\tFujikura Rubber Ltd.\n10:A1:45\t\tnexzo india pvt ltd\n10:A2:4E\t\tGold3Link Electronics Co., Ltd\n10:A2:D3\t\tApple, Inc.\n10:A3:0F\t\tHuawei Technologies Co.,Ltd\n10:A3:B8\t\tIskratel d.o.o.\n10:A4:50\t\tKwikset\n10:A4:B9\t\tBaidu Online Network Technology (Beijing) Co., Ltd\n10:A4:BE\t\tShenzhen Bilian Electronic Co.，Ltd\n10:A4:DA\t\tHuawei Technologies Co.,Ltd\n10:A5:1D\t\tIntel Corporate\n10:A5:62\t\tIton Technology Corp.\n10:A5:D0\t\tMurata Manufacturing Co., Ltd.\n10:A6:59\t\tMobile Create Co.,Ltd.\n10:A7:43\t\tSK Mtek Limited\n10:A7:93\t\tVantiva USA LLC\n10:A8:29\t\tCisco Systems, Inc\n10:A9:32\t\tBeijing Cyber Cloud Technology Co. ,Ltd.\n10:AB:C9\t\tSamsung Electronics Co.,Ltd\n10:AE:60\t\tAmazon Technologies Inc.\n10:AE:A5\t\tDuskrise inc.\n10:AF:78\t\tShenzhen ATUE Technology Co., Ltd\n10:B1:DF\t\tCloud Network Technology Singapore Pte. Ltd.\n10:B1:F8\t\tHuawei Technologies Co.,Ltd\n10:B2:32\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\n10:B2:6B\t\tbase Co.,Ltd.\n10:B3:6F\t\tBowei Technology Company Limited\n10:B3:C6\t\tCisco Systems, Inc\n10:B3:D5\t\tCisco Systems, Inc\n10:B3:D6\t\tCisco Systems, Inc\n10:B4:1D\t\tEspressif Inc.\n10:B5:88\t\tApple, Inc.\n10:B6:5E\t\tNew H3C Technologies Co., Ltd\n10:B6:76\t\tHP Inc.\n10:B7:13\t\tPrivate\n10:B7:A8\t\tCableFree Networks Limited\n10:B7:F6\t\tPlastoform Industries Ltd.\n10:B9:C4\t\tApple, Inc.\n10:B9:F7\t\tNiko-Servodan\n10:B9:FE\t\tLika srl\n10:BA:1A\t\tSHENZHEN IK WORLD Technology Co., Ltd\n10:BA:A5\t\tGana I&C Co., Ltd\n10:BB:F3\t\tHunan Fn-Link Technology Limited\n10:BC:97\t\tvivo Mobile Communication Co., Ltd.\n10:BD:18\t\tCisco Systems, Inc\n10:BD:3A\t\tApple, Inc.\n10:BD:55\t\tQ-Lab Corporation\n10:BE:99\t\tNetberg\n10:BE:F5\t\tD-Link International\n10:BF:48\t\tASUSTek COMPUTER INC.\n10:BF:67\t\tAmazon Technologies Inc.\n10:C0:7C\t\tBlu-ray Disc Association\n10:C0:D5\t\tHOLOEYE Photonics AG\n10:C1:72\t\tHuawei Technologies Co.,Ltd\n10:C2:2F\t\tChina Entropy Co., Ltd.\n10:C2:5A\t\tVantiva USA LLC\n10:C2:BA\t\tUTT Co., Ltd.\n10:C3:7B\t\tASUSTek COMPUTER INC.\n10:C3:AB\t\tHuawei Technologies Co.,Ltd\n10:C4:CA\t\tHUMAX Co., Ltd.\n10:C5:86\t\tBio Sound Lab Co., Ltd.\n10:C5:95\t\tLenovo\n10:C6:0C\t\tDomino UK Ltd\n10:C6:1F\t\tHuawei Technologies Co.,Ltd\n10:C6:5E\t\tAdapt-IP\n10:C6:7E\t\tShenzhen Juchin Technology Co., Ltd\n10:C6:FC\t\tGarmin International\n10:C7:35\t\tMicrosoft Corporation\n10:C7:3F\t\tMidas Klark Teknik Ltd\n10:C7:53\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\n10:C9:CA\t\tAce Technology Corp.\n10:CA:81\t\tPrecia\n10:CA:BF\t\tTexas Instruments\n10:CC:1B\t\tLiverock technologies,INC\n10:CC:DB\t\tAximum Produits Electroniques\n10:CD:6E\t\tFisys\n10:CD:AE\t\tAvaya Inc\n10:CD:B6\t\tEssential Products, Inc.\n10:CE:02\t\tAmazon Technologies Inc.\n10:CE:45\t\tMiromico AG\n10:CE:A9\t\tTexas Instruments\n10:CE:E9\t\tApple, Inc.\n10:CF:0F\t\tApple, Inc.\n10:D0:7A\t\tAMPAK Technology, Inc.\n10:D0:AB\t\tzte corporation\n10:D1:DC\t\tINSTAR Deutschland GmbH\n10:D3:8A\t\tSamsung Electronics Co.,Ltd\n10:D5:42\t\tSamsung Electronics Co.,Ltd\n10:D5:61\t\tTuya Smart Inc.\n10:D6:57\t\tSiemens Industrial Automation Products Ltd., Chengdu\n10:D6:80\t\tTendyron Corporation\n10:D7:B0\t\tSagemcom Broadband SAS\n10:D9:A2\t\tGoogle, Inc.\n10:DA:43\t\tNetgear\n10:DA:49\t\tHuawei Device Co., Ltd.\n10:DA:63\t\tApple, Inc.\n10:DC:4A\t\tFiberhome Telecommunication Technologies Co.,LTD\n10:DC:B6\t\tIEEE Registration Authority\n10:DC:B6:00:00:00/28\tApex Supply Chain Technologies\n10:DC:B6:10:00:00/28\tHitachi Energy Switzerland Ltd\n10:DC:B6:20:00:00/28\tCal-Comp Industria E Comercio De Eletronicos E Informatica Ltda\n10:DC:B6:30:00:00/28\tHanacns\n10:DC:B6:40:00:00/28\tAnnapurna labs\n10:DC:B6:50:00:00/28\tMilesight Taiwan\n10:DC:B6:60:00:00/28\tProlan Zrt.\n10:DC:B6:70:00:00/28\tMoya Commumication Technology (Shenzhen) Co.,Ltd.\n10:DC:B6:80:00:00/28\tSanofi (Beijing) Pharmaceutical Co., Ltd.\n10:DC:B6:90:00:00/28\tFuzhou Rockchip Electronics Co.,Ltd\n10:DC:B6:A0:00:00/28\tPickering Interfaces Ltd\n10:DC:B6:B0:00:00/28\tEyeball Fintech Company\n10:DC:B6:C0:00:00/28\tBBPOS Limited\n10:DC:B6:D0:00:00/28\tLeoLabs\n10:DC:B6:E0:00:00/28\tShenzhen Sunwoda intelligent hardware Co.,Ltd\n10:DD:B1\t\tApple, Inc.\n10:DD:F4\t\tMaxway Electronics CO.,LTD\n10:DE:E4\t\tautomationNEXT GmbH\n10:DF:8B\t\tShenzhen CareDear Communication Technology Co.,Ltd\n10:DF:FC\t\tSiemens AG\n10:E1:77\t\tCommscope\n10:E1:8E\t\tUniversal Global Scientific Industrial., Ltd\n10:E2:C9\t\tApple, Inc.\n10:E2:D5\t\tQi Hardware Inc.\n10:E3:76\t\tCisco Systems, Inc\n10:E3:C7\t\tSeohwa Telecom\n10:E4:AF\t\tApr, Llc\n10:E4:C2\t\tSamsung Electronics Co.,Ltd\n10:E6:8F\t\tKwangsung Electronics Korea Co.,Ltd.\n10:E6:AE\t\tSource Technologies, LLC\n10:E7:7A\t\tSTMicrolectronics International NV\n10:E7:C6\t\tHewlett Packard\n10:E8:3A\t\tFiberx Distribuidora De Produtos De Telecomunicacao Ltda\n10:E8:40\t\tZowee Technology(Heyuan) Co., Ltd.\n10:E8:78\t\tNokia\n10:E8:A7\t\tWistron Neweb Corporation\n10:E8:EE\t\tPhaseSpace\n10:E9:53\t\tHuawei Device Co., Ltd.\n10:E9:92\t\tIngram Micro Services\n10:EA:59\t\tCisco SPVTG\n10:EC:81\t\tSamsung Electronics Co.,Ltd\n10:EE:D9\t\tCanoga Perkins Corporation\n10:F0:05\t\tIntel Corporate\n10:F0:68\t\tRuckus Wireless\n10:F1:63\t\tTnk Co.,Ltd\n10:F1:F2\t\tLG Electronics (Mobile Communications)\n10:F3:11\t\tCisco Systems, Inc\n10:F3:DB\t\tGridco Systems, Inc.\n10:F4:9A\t\tT3 Innovation\n10:F6:05\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n10:F6:0A\t\tIntel Corporate\n10:F6:81\t\tvivo Mobile Communication Co., Ltd.\n10:F9:20\t\tCisco Systems, Inc\n10:F9:6F\t\tLG Electronics (Mobile Communications)\n10:F9:EB\t\tIndustria Fueguina de Relojería Electrónica s.a.\n10:F9:EE\t\tNokia Corporation\n10:FA:CE\t\tReacheng Communication Technology Co.,Ltd\n10:FB:F0\t\tKangSheng LTD.\n10:FC:33\t\tHuawei Device Co., Ltd.\n10:FC:54\t\tShany Electronic Co., Ltd.\n10:FC:B6\t\tmirusystems CO.,LTD\n10:FE:ED\t\tTp-Link Technologies Co.,Ltd.\n10:FF:E0\t\tGiga-Byte Technology Co.,Ltd.\n11:00:AA\t\tPrivate\n11:11:11\t\tPrivate\n14:00:20\t\tLongSung Technology (Shanghai) Co.,Ltd.\n14:00:7D\t\tzte corporation\n14:00:E9\t\tMitel Networks Corporation\n14:01:52\t\tSamsung Electronics Co.,Ltd\n14:01:9C\t\tUbyon Inc.\n14:02:EC\t\tHewlett Packard Enterprise\n14:04:67\t\tSNK Technologies Co.,Ltd.\n14:05:89\t\tMotorola Mobility LLC, a Lenovo Company\n14:06:4C\t\tVogl Electronic GmbH\n14:06:A7\t\tCresyn\n14:07:08\t\tCp Plus Gmbh & Co. Kg\n14:07:E0\t\tAbrantix AG\n14:08:05\t\tSky Uk Limited\n14:08:08\t\tEspressif Inc.\n14:09:B4\t\tzte corporation\n14:09:DC\t\tHuawei Technologies Co.,Ltd\n14:0A:29\t\tTiinlab Corporation\n14:0A:C5\t\tAmazon Technologies Inc.\n14:0C:5B\t\tPLNetworks\n14:0C:76\t\tFreebox Sas\n14:0D:4F\t\tFlextronics International\n14:0F:42\t\tNokia\n14:0F:A6\t\tRenesas Electronics (Penang) Sdn. Bhd.\n14:10:9F\t\tApple, Inc.\n14:11:14\t\tTecno Mobile Limited\n14:11:5D\t\tSkyworth Digital Technology(Shenzhen) Co.,Ltd\n14:13:0B\t\tGarmin International\n14:13:30\t\tAnakreon UK LLP\n14:13:33\t\tAzureWave Technology Inc.\n14:13:46\t\tSkyworth Digital Technology(Shenzhen) Co.,Ltd\n14:13:57\t\tATP Electronics, Inc.\n14:13:FB\t\tHuawei Technologies Co.,Ltd\n14:14:16\t\tHui Zhou Gaoshengda Technology Co.,LTD\n14:14:4B\t\tRuijie Networks Co.,LTD\n14:14:59\t\tVodafone Italia S.p.A.\n14:14:7D\t\tApple, Inc.\n14:14:E6\t\tNingbo Sanhe Digital Co.,Ltd\n14:15:7C\t\tTokyo Cosmos Electric Co.,Ltd.\n14:16:9D\t\tCisco Systems, Inc\n14:16:9E\t\tWingtech Group (HongKong）Limited\n14:17:2A\t\tFiberhome Telecommunication Technologies Co.,LTD\n14:18:44\t\tXenon Smart Teknoloji Ltd.\n14:18:77\t\tDell Inc.\n14:18:C3\t\tIntel Corporate\n14:19:73\t\tBeijing Yunyi Times Technology Co.,Ltd\n14:1A:51\t\tTreetech Sistemas Digitais\n14:1A:97\t\tApple, Inc.\n14:1A:A3\t\tMotorola Mobility LLC, a Lenovo Company\n14:1A:AA\t\tMetal Work SpA\n14:1B:30\t\tShenzhen Yipingfang Network Technology Co., Ltd.\n14:1B:A0\t\tApple, Inc.\n14:1B:BD\t\tVolex Inc.\n14:1B:F0\t\tIntellimedia Systems Ltd\n14:1F:78\t\tSamsung Electronics Co.,Ltd\n14:1F:BA\t\tIEEE Registration Authority\n14:1F:BA:00:00:00/28\tShenzhen Mining Technology Co.,Ltd.\n14:1F:BA:10:00:00/28\tGloQuad\n14:1F:BA:20:00:00/28\tDeutsche Energieversorgung GmbH\n14:1F:BA:30:00:00/28\tPrivate\n14:1F:BA:40:00:00/28\tByzero\n14:1F:BA:50:00:00/28\tInttelix Brasil Tecnologia e Sistemas Ltda\n14:1F:BA:60:00:00/28\tHitachi Rail RCS France SAS\n14:1F:BA:70:00:00/28\tWisnetworks Technologies Co., Ltd.\n14:1F:BA:80:00:00/28\tShenzhen CATIC Information Technology Industry Co.,Ltd\n14:1F:BA:90:00:00/28\tBlack Moth Technologies\n14:1F:BA:A0:00:00/28\tWinsonic Electronics Co., Ltd.\n14:1F:BA:B0:00:00/28\tNewings Communication CO., LTD.\n14:1F:BA:C0:00:00/28\tSwiss Electronic (Shenzhen) Co., Ltd\n14:1F:BA:D0:00:00/28\tAJIS(DALIAN)co.,LTD\n14:1F:BA:E0:00:00/28\tPOS Systema LLC\n14:1F:BA:F0:00:00/28\tPrivate\n14:20:5E\t\tApple, Inc.\n14:21:03\t\tCalix Inc.\n14:22:33\t\tFiberhome Telecommunication Technologies Co.,LTD\n14:22:3B\t\tGoogle, Inc.\n14:22:DB\t\teero inc.\n14:23:0A\t\tHuawei Technologies Co.,Ltd\n14:23:D7\t\tEutronix Co., Ltd.\n14:23:F2\t\tBroadcom Limited\n14:23:F3\t\tBroadcom Limited\n14:24:75\t\t4DReplay, Inc\n14:28:76\t\tApple, Inc.\n14:28:82\t\tMidicom Electronics Co.Ltd\n14:29:71\t\tNemoa Electronics (Hk) Co. Ltd\n14:2A:14\t\tShenZhen Selenview Digital Technology Co.,Ltd\n14:2B:2F\t\tEspressif Inc.\n14:2B:D2\t\tArmtel Ltd.\n14:2B:D6\t\tGuangdong Appscomm Co.,Ltd\n14:2C:78\t\tGooWi Wireless Technology Co., Limited\n14:2D:27\t\tHon Hai Precision Ind. Co.,Ltd.\n14:2D:41\t\tSilicon Laboratories\n14:2D:4D\t\tApple, Inc.\n14:2D:79\t\tFiberhome Telecommunication Technologies Co.,LTD\n14:2D:8B\t\tIncipio Technologies, Inc\n14:2D:F5\t\tAmphitech\n14:2E:5E\t\tSercomm Corporation.\n14:2F:FD\t\tLt Security Inc\n14:30:04\t\tHuawei Technologies Co.,Ltd\n14:30:7A\t\tAvermetrics\n14:30:C6\t\tMotorola Mobility LLC, a Lenovo Company\n14:32:D1\t\tSamsung Electronics Co.,Ltd\n14:33:5C\t\tEspressif Inc.\n14:33:65\t\tTEM Mobile Limited\n14:33:75\t\tZyxel Communications Corporation\n14:34:F6\t\tLv Solution Sdn. Bhd.\n14:35:8B\t\tMediabridge Products, LLC.\n14:35:B3\t\tFuture Designs, Inc.\n14:35:B7\t\tApple, Inc.\n14:36:05\t\tNokia Corporation\n14:36:0E\t\tZyxel Communications Corporation\n14:36:C6\t\tLenovo Mobile Communication Technology Ltd.\n14:37:19\t\tPT Prakarsa Visi Valutama\n14:37:3B\t\tPROCOM Systems\n14:37:5E\t\tSymbotic LLC\n14:39:2F\t\tLear\n14:3A:9A\t\tHon Hai Precision Industry Co.,LTD\n14:3A:EA\t\tDynapower Company LLC\n14:3B:42\t\tRealfit(Shenzhen) Intelligent Technology Co., Ltd\n14:3B:51\t\tHuawei Device Co., Ltd.\n14:3C:C3\t\tHuawei Technologies Co.,Ltd\n14:3D:F2\t\tBeijing Shidai Hongyuan Network Communication Co.,Ltd\n14:3E:60\t\tNokia\n14:3E:BF\t\tzte corporation\n14:3F:27\t\tNoccela Oy\n14:3F:A6\t\tSony Home Entertainment&Sound Products Inc\n14:3F:C3\t\tSnapAV\n14:41:46\t\tHoneywell (China) Co., LTD\n14:41:E2\t\tMonaco Enterprises, Inc.\n14:42:FC\t\tTexas Instruments\n14:43:19\t\tCreative&Link Technology Limited\n14:44:4A\t\tApollo Seiko Ltd.\n14:44:8F\t\tEdgecore Networks Corporation\n14:46:58\t\tHuawei Technologies Co.,Ltd\n14:46:E4\t\tAvistel\n14:47:2D\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n14:48:02\t\tTHE YEOLRIM Co.,Ltd.\n14:48:8B\t\tShenzhen Doov Technology Co.,Ltd\n14:49:20\t\tHuawei Technologies Co.,Ltd\n14:49:78\t\tDigital Control Incorporated\n14:49:BC\t\tDrayTek Corp.\n14:49:D4\t\tXiaomi Communications Co Ltd\n14:49:E0\t\tSamsung Electro-Mechanics(Thailand)\n14:4C:1A\t\tMax Communication GmbH\n14:4D:67\t\tZioncom Electronics (Shenzhen) Ltd.\n14:4E:2A\t\tCiena Corporation\n14:4E:34\t\tRemote Solution\n14:4F:8A\t\tIntel Corporate\n14:4F:D7\t\tIEEE Registration Authority\n14:4F:D7:00:00:00/28\tAnnapurna labs\n14:4F:D7:10:00:00/28\tZehnder Group AG\n14:4F:D7:20:00:00/28\tFedEx Services OTI\n14:4F:D7:30:00:00/28\tQingdao Wodatong Electronics Co., Ltd.\n14:4F:D7:40:00:00/28\tRed Technology Limited\n14:4F:D7:50:00:00/28\tFls Finland Oy\n14:4F:D7:60:00:00/28\ti-SENS, Inc.\n14:4F:D7:70:00:00/28\tShenzhen V-Streaming Technology Co., Ltd.\n14:4F:D7:80:00:00/28\tNPort Networks Inc.,\n14:4F:D7:90:00:00/28\tEmerson Network Power (India) Pvt. Ltd.\n14:4F:D7:A0:00:00/28\tUnirobot Corporation\n14:4F:D7:B0:00:00/28\tArkus-ST Ltd\n14:4F:D7:C0:00:00/28\tD&S Cable Industries (HK) Limited\n14:4F:D7:D0:00:00/28\tShanghai B&A Technology Co., Ltd\n14:4F:D7:E0:00:00/28\tEdan Instruments, Inc.\n14:50:51\t\tSHARP Corporation\n14:51:20\t\tHuawei Device Co., Ltd.\n14:51:7E\t\tNew H3C Technologies Co., Ltd\n14:52:90\t\tKNS Group LLC (YADRO Company)\n14:54:12\t\tEntis Co., Ltd.\n14:55:94\t\tHuawei Device Co., Ltd.\n14:55:B9\t\tNokia Solutions and Networks GmbH & Co. KG\n14:56:3A\t\tHuawei Device Co., Ltd.\n14:56:45\t\tSavitech Corp.\n14:56:8E\t\tSamsung Electronics Co.,Ltd\n14:57:90\t\tQingdao Haier Technology Co.,Ltd\n14:57:9F\t\tHuawei Technologies Co.,Ltd\n14:58:08\t\tTaicang T&W Electronics\n14:58:D0\t\tHewlett Packard\n14:59:C0\t\tNetgear\n14:59:C3\t\tCreative Chips GmbH\n14:5A:05\t\tApple, Inc.\n14:5A:41\t\tCloud Network Technology Singapore Pte. Ltd.\n14:5A:83\t\tLogi-D inc\n14:5A:FC\t\tLiteon Technology Corporation\n14:5B:B9\t\tConMet\n14:5B:D1\t\tCommscope\n14:5B:E1\t\tnyantec GmbH\n14:5D:34\t\tShenzhen Bilian Electronic Co.，Ltd\n14:5E:45\t\tBamboo Systems Group\n14:5E:69\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n14:5F:94\t\tHuawei Technologies Co.,Ltd\n14:60:80\t\tzte corporation\n14:60:CB\t\tApple, Inc.\n14:61:02\t\tAlps Alpine\n14:61:2F\t\tAvaya Inc\n14:61:A4\t\tHonor Device Co., Ltd.\n14:63:08\t\tJabil Circuit (Shanghai) Ltd.\n14:65:6A\t\tHuawei Technologies Co.,Ltd\n14:66:B7\t\tAdvanced Design Technology Pty Ltd\n14:69:A2\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n14:6A:0B\t\tCypress Electronics Limited\n14:6B:72\t\tShenzhen Fortune Ship Technology Co., Ltd.\n14:6B:9A\t\tzte corporation\n14:6B:9C\t\tShenzhen Bilian Electronic Co.，Ltd\n14:6C:27\t\tDongguan Liesheng Electronic Co., Ltd.\n14:6E:0A\t\tPrivate\n14:70:57\t\tShennan Circuits Co.,Ltd\n14:73:73\t\tTubitak Uekae\n14:74:11\t\tRim\n14:75:5B\t\tIntel Corporate\n14:75:90\t\tTp-Link Technologies Co.,Ltd.\n14:77:40\t\tHuawei Device Co., Ltd.\n14:78:0B\t\tVarex Imaging Deutschland AG\n14:79:F3\t\tChina Mobile Group Device Co.,Ltd.\n14:7A:E4\t\tApple, Inc.\n14:7B:AC\t\tNokia\n14:7D:05\t\tSercomm Philippines Inc\n14:7D:B3\t\tJoa Telecom.Co.,Ltd\n14:7D:C5\t\tMurata Manufacturing Co., Ltd.\n14:7D:DA\t\tApple, Inc.\n14:7E:19\t\tHewlett Packard Enterprise\n14:7E:A1\t\tBritania Eletrônicos S.A.\n14:7F:0F\t\tTexas Instruments\n14:7F:67\t\tLG Innotek\n14:7F:CE\t\tApple, Inc.\n14:80:1F\t\tSunnovo International Limited\n14:80:CC\t\tQuectel Wireless Solutions Co.,Ltd.\n14:81:21\t\tTOP WING Corporation\n14:82:5B\t\tHefei Radio Communication Technology Co., Ltd\n14:84:30\t\tMitac Computing Technology Corporation\n14:84:73\t\tCisco Systems, Inc\n14:84:77\t\tNew H3C Technologies Co., Ltd\n14:85:01\t\tRivos Inc.\n14:85:09\t\tApple, Inc.\n14:85:54\t\tEarda Technologies co Ltd\n14:85:7F\t\tIntel Corporate\n14:86:92\t\tTp-Link Technologies Co.,Ltd.\n14:87:6A\t\tApple, Inc.\n14:88:E6\t\tApple, Inc.\n14:89:19\t\t2bps\n14:89:3E\t\tVixtel Technologies Limted\n14:89:CB\t\tHuawei Technologies Co.,Ltd\n14:89:FD\t\tSamsung Electronics Co.,Ltd\n14:8A:70\t\tADS GmbH\n14:8C:4A\t\tHuawei Technologies Co.,Ltd\n14:8F:21\t\tGarmin International\n14:8F:34\t\tTecno Mobile Limited\n14:8F:79\t\tApple, Inc.\n14:8F:C6\t\tApple, Inc.\n14:90:90\t\tKongTop industrial(shen zhen)CO.,LTD\n14:91:38\t\tAmazon Technologies Inc.\n14:91:82\t\tBelkin International Inc.\n14:92:F9\t\tSichuan AI-Link Technology Co., Ltd.\n14:93:46\t\tPNI sensor corporation\n14:94:2F\t\tUsys Co.,Ltd.\n14:94:48\t\tBlu Castle S.A.\n14:94:6C\t\tApple, Inc.\n14:95:CE\t\tApple, Inc.\n14:96:2D\t\tNew H3C Technologies Co., Ltd\n14:96:E5\t\tSamsung Electronics Co.,Ltd\n14:98:77\t\tApple, Inc.\n14:98:7D\t\tVantiva USA LLC\n14:99:3E\t\tXiaomi Communications Co Ltd\n14:99:E2\t\tApple, Inc.\n14:9A:10\t\tMicrosoft Corporation\n14:9A:A3\t\tHuawei Technologies Co.,Ltd\n14:9B:2F\t\tJiangSu ZhongXie Intelligent Technology co., LTD\n14:9B:D7\t\tMuli Muwai Furniture Qidong Co., Ltd\n14:9B:F3\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n14:9C:EF\t\tTexas Instruments\n14:9D:09\t\tHuawei Technologies Co.,Ltd\n14:9D:99\t\tApple, Inc.\n14:9E:5D\t\tJSC \"IB Reform\"\n14:9E:CF\t\tDell Inc.\n14:9F:3C\t\tSamsung Electronics Co.,Ltd\n14:9F:43\t\tCisco Meraki\n14:9F:B6\t\tGuangdong Genius Technology Co., Ltd.\n14:9F:E8\t\tLenovo Mobile Communication Technology Ltd.\n14:A0:F8\t\tHuawei Technologies Co.,Ltd\n14:A1:BF\t\tASSA ABLOY Korea Co., Ltd Unilock\n14:A1:DF\t\tChina Mobile Group Device Co.,Ltd.\n14:A2:A0\t\tCisco Systems, Inc\n14:A3:2F\t\tHuawei Device Co., Ltd.\n14:A3:64\t\tSamsung Electronics Co.,Ltd\n14:A3:B4\t\tHuawei Device Co., Ltd.\n14:A4:17\t\tShenzhen Belon Technology CO.,LTD\n14:A5:1A\t\tHuawei Technologies Co.,Ltd\n14:A6:2C\t\tS.M. Dezac S.A.\n14:A7:2B\t\tcurrentoptronics Pvt.Ltd\n14:A7:8B\t\tZhejiang Dahua Technology Co., Ltd.\n14:A8:6B\t\tShenZhen Telacom Science&Technology Co., Ltd\n14:A9:D0\t\tF5 Inc.\n14:A9:E3\t\tMst Corporation\n14:AB:02\t\tHuawei Technologies Co.,Ltd\n14:AB:56\t\tWuxi Funide Digital Co.,Ltd\n14:AB:C5\t\tIntel Corporate\n14:AB:EC\t\tHewlett Packard Enterprise\n14:AB:F0\t\tCommscope\n14:AC:60\t\tCloud Network Technology Singapore Pte. Ltd.\n14:AD:CA\t\tChina Mobile Iot Limited company\n14:AE:68\t\tKLG Smartec\n14:AE:85\t\tIEEE Registration Authority\n14:AE:85:00:00:00/28\tKayamatics Limited\n14:AE:85:10:00:00/28\tHenfred Technology Co., Ltd.\n14:AE:85:20:00:00/28\tQingdao iTechene Technologies Co., Ltd.\n14:AE:85:30:00:00/28\tIflytek Co.,Ltd.\n14:AE:85:40:00:00/28\tCentervue Spa\n14:AE:85:50:00:00/28\tAz-Technology Sdn Bhd\n14:AE:85:60:00:00/28\tTMG TE GmbH\n14:AE:85:70:00:00/28\tShenzhen Honor Electronic Co.,Ltd\n14:AE:85:80:00:00/28\tTrimble LEM\n14:AE:85:90:00:00/28\tVeo Technologies\n14:AE:85:A0:00:00/28\tMTA Systems\n14:AE:85:B0:00:00/28\tNtc Soft\n14:AE:85:C0:00:00/28\tIO Industries Inc.\n14:AE:85:D0:00:00/28\tiSolution Technologies Co.,Ltd.\n14:AE:85:E0:00:00/28\tSercomm Corporation.\n14:AE:DB\t\tVTech Telecommunications Ltd.\n14:B1:26\t\tIndustrial Software Co\n14:B1:C8\t\tInfiniWing, Inc.\n14:B2:E5\t\tShenzhen iComm Semiconductor CO.,LTD\n14:B3:1F\t\tDell Inc.\n14:B3:70\t\tGigaset Digital Technology (Shenzhen) Co., Ltd.\n14:B3:A1\t\tJuniper Networks\n14:B4:57\t\tSilicon Laboratories\n14:B4:84\t\tSamsung Electronics Co.,Ltd\n14:B5:CD\t\tLiteon Technology Corporation\n14:B7:3D\t\tARCHEAN Technologies\n14:B7:F8\t\tVantiva USA LLC\n14:B8:37\t\tShenzhen YOUHUA Technology Co., Ltd\n14:B9:68\t\tHuawei Technologies Co.,Ltd\n14:BA:AF\t\tBKS GmbH\n14:BB:6E\t\tSamsung Electronics Co.,Ltd\n14:BC:68\t\tCisco Systems, Inc\n14:BD:61\t\tApple, Inc.\n14:BE:FC\t\tNanjing Jiahao Technology Co., Ltd.\n14:C0:3E\t\tCommscope\n14:C0:50\t\tGuangdong Genius Technology Co., Ltd.\n14:C0:89\t\tDune Hd Ltd\n14:C0:A1\t\tUCloud Technology Co., Ltd.\n14:C1:26\t\tNokia Corporation\n14:C1:4E\t\tGoogle, Inc.\n14:C1:FF\t\tShenZhen QianHai Comlan communication Co.,LTD\n14:C2:13\t\tApple, Inc.\n14:C2:1D\t\tSabtech Industries\n14:C2:4D\t\tAtw Technology, Inc.\n14:C3:5E\t\tFibRSol Global Network Limited\n14:C3:C2\t\tK.A. Schmersal GmbH & Co. KG\n14:C6:7D\t\tVizio, Inc\n14:C6:97\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n14:C8:8B\t\tApple, Inc.\n14:C9:13\t\tLG Electronics\n14:C9:CF\t\tSigmastar Technology Ltd.\n14:CA:56\t\tzte corporation\n14:CA:A0\t\tHu&Co\n14:CB:19\t\tHP Inc.\n14:CB:49\t\tHabolink Technology Co.,LTD\n14:CB:65\t\tMicrosoft Corporation\n14:CC:20\t\tTp-Link Technologies Co.,Ltd.\n14:CC:B3\t\tAo \"Gk Nateks\"\n14:CF:8D\t\tOhsung\n14:CF:92\t\tTp-Link Technologies Co.,Ltd.\n14:CF:E2\t\tCommscope\n14:D0:0D\t\tApple, Inc.\n14:D1:1F\t\tHuawei Technologies Co.,Ltd\n14:D1:69\t\tHuawei Technologies Co.,Ltd\n14:D1:9E\t\tApple, Inc.\n14:D4:24\t\tAzureWave Technology Inc.\n14:D4:FE\t\tCommscope\n14:D6:4D\t\tD-Link International\n14:D7:25\t\tBarrot Technology Co.,Ltd.\n14:D7:6E\t\tCONCH ELECTRONIC Co.,Ltd\n14:D8:64\t\tTp-Link Technologies Co.,Ltd.\n14:D8:81\t\tBeijing Xiaomi Mobile Software Co., Ltd\n14:DA:B9\t\tHuawei Device Co., Ltd.\n14:DA:E9\t\tASUSTek COMPUTER INC.\n14:DB:85\t\tS Net Media\n14:DC:51\t\tXiamen Cheerzing IOT Technology Co.,Ltd.\n14:DC:E2\t\tTHALES AVS France\n14:DD:02\t\tLiangang Optoelectronic Technology CO., Ltd.\n14:DD:9C\t\tvivo Mobile Communication Co., Ltd.\n14:DD:A9\t\tASUSTek COMPUTER INC.\n14:DD:E5\t\tMpmkvvcl\n14:DE:39\t\tHuawei Device Co., Ltd.\n14:E0:1D\t\tSamsung Electronics Co.,Ltd\n14:E2:89\t\tAbietec Inc.\n14:E4:EC\t\tmLogic LLC\n14:E6:E4\t\tTp-Link Technologies Co.,Ltd.\n14:E7:C8\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n14:E9:B2\t\tFiberhome Telecommunication Technologies Co.,LTD\n14:EA:63\t\tHui Zhou Gaoshengda Technology Co.,LTD\n14:EA:A1\t\tMicronet union Technology (chengdu) co., Ltd\n14:EB:08\t\tHuawei Technologies Co.,Ltd\n14:EB:33\t\tBSMediasoft Co., Ltd.\n14:EB:B6\t\tTP-Link Systems Inc\n14:ED:A5\t\tWächter GmbH Sicherheitssysteme\n14:ED:BB\t\t2Wire Inc\n14:ED:E4\t\tKaiam Corporation\n14:EE:9D\t\tAirNav Systems LLC\n14:EF:CF\t\tSchreder\n14:F0:C5\t\tXtremio Ltd.\n14:F2:87\t\tApple, Inc.\n14:F2:8E\t\tShenYang ZhongKe-Allwin Technology Co.LTD\n14:F4:2A\t\tSamsung Electronics Co.,Ltd\n14:F5:92\t\tShenzhen SDG DONZHI Technology Co., Ltd\n14:F5:F9\t\tHunan Fn-Link Technology Limited\n14:F6:5A\t\tXiaomi Communications Co Ltd\n14:F6:D8\t\tIntel Corporate\n14:F8:93\t\tWuhan FiberHome Digital Technology Co.,Ltd.\n14:FB:70\t\tHuawei Device Co., Ltd.\n14:FE:AF\t\tSagittar Limited\n14:FE:B5\t\tDell Inc.\n18:00:2D\t\tSony Corporation\n18:00:DB\t\tFitbit Inc.\n18:01:7D\t\tHarbin Arteor technology co., LTD\n18:01:E3\t\tBittium Wireless Ltd\n18:01:F1\t\tXiaomi Communications Co Ltd\n18:02:2D\t\tHuawei Technologies Co.,Ltd\n18:02:AE\t\tvivo Mobile Communication Co., Ltd.\n18:03:73\t\tDell Inc.\n18:03:FA\t\tIBT Interfaces\n18:04:03\t\tvivo Mobile Communication Co., Ltd.\n18:04:ED\t\tTexas Instruments\n18:06:75\t\tDilax Intelcom GmbH\n18:06:F5\t\tRAD Data Communications, Ltd.\n18:06:FF\t\tAcer Computer(Shanghai) Limited.\n18:07:12\t\tShenzhen Dazoo Technologies CO.,Ltd\n18:0B:1B\t\tAmazon Technologies Inc.\n18:0B:52\t\tNanotron Technologies GmbH\n18:0B:D0\t\tHuawei Technologies Co.,Ltd\n18:0C:14\t\tiSonea Limited\n18:0C:77\t\tWestinghouse Electric Company, LLC\n18:0C:7A\t\tSagemcom Broadband SAS\n18:0C:AC\t\tCanon Inc.\n18:0D:2C\t\tIntelbras\n18:0D:F9\t\tSilicon Laboratories\n18:0E:AC\t\tShenzhen Fast Technologies Co.,Ltd\n18:0F:76\t\tD-Link International\n18:10:4E\t\tCedint-Upm\n18:11:71\t\tGuangzhou Doctorpai Education & Technology Co.,Ltd\n18:12:12\t\tCepton Technologies\n18:13:2D\t\tzte corporation\n18:14:20\t\tTeb Sas\n18:14:56\t\tNokia Corporation\n18:14:6C\t\tZhejiang Tmall Technology Co., Ltd.\n18:14:AE\t\tNokia\n18:16:C9\t\tSamsung Electronics Co.,Ltd\n18:16:E8\t\tSiliconware Precision Industries Co., Ltd.\n18:17:14\t\tDaewoois\n18:17:25\t\tCameo Communications, Inc.\n18:18:8B\t\tFcnt Llc\n18:19:3F\t\tTamtron Oy\n18:19:D6\t\tSamsung Electronics Co.,Ltd\n18:1B:EB\t\tActiontec Electronics, Inc\n18:1D:EA\t\tIntel Corporate\n18:1E:78\t\tSagemcom Broadband SAS\n18:1E:95\t\tAuVerte\n18:1E:B0\t\tSamsung Electronics Co.,Ltd\n18:20:12\t\tAztech Associates Inc.\n18:20:32\t\tApple, Inc.\n18:20:4C\t\tKummler+Matter AG\n18:20:A6\t\tSage Co., Ltd.\n18:20:D5\t\tCommscope\n18:21:95\t\tSamsung Electronics Co.,Ltd\n18:22:7E\t\tSamsung Electronics Co.,Ltd\n18:26:49\t\tIntel Corporate\n18:26:54\t\tSamsung Electronics Co.,Ltd\n18:26:66\t\tSamsung Electronics Co.,Ltd\n18:28:61\t\tAirTies Wireless Networks\n18:2A:44\t\tHirose Electronic System\n18:2A:57\t\tHuawei Technologies Co.,Ltd\n18:2A:7B\t\tNintendo Co., Ltd.\n18:2A:D3\t\tJuniper Networks\n18:2B:05\t\t8D Technologies\n18:2C:65\t\tTexas Instruments\n18:2C:91\t\tConcept Development, Inc.\n18:2C:A9\t\tDASAN Networks, Inc.\n18:2C:B4\t\tNectarsoft Co., Ltd.\n18:2D:98\t\tJinwoo Industrial system\n18:2D:F7\t\tJy Company\n18:30:09\t\tWoojin Industrial Systems Co., Ltd.\n18:30:0C\t\tHisense Electric Co.,Ltd\n18:31:4F\t\tAidin Robotics\n18:31:BF\t\tASUSTek COMPUTER INC.\n18:32:19\t\tEM Microelectronic\n18:32:A2\t\tLaon Technology Co., Ltd.\n18:33:86\t\tHuawei Technologies Co.,Ltd\n18:33:9D\t\tCisco Systems, Inc\n18:34:51\t\tApple, Inc.\n18:34:AF\t\tKaon Group Co., Ltd.\n18:35:D1\t\tCommscope\n18:36:72\t\tShaoxing ShunChuang Technology CO.,LTD\n18:36:FC\t\tElecsys International Corporation\n18:38:25\t\tWuhan Lingjiu High-tech Co.,Ltd.\n18:38:64\t\tCap-Tech International Co., Ltd.\n18:38:AE\t\tConspin Solution\n18:39:19\t\tUnicoi Systems\n18:39:6E\t\tSunsea Telecommunications Co.,Ltd.\n18:39:9C\t\tSkorpios Technologies\n18:3A:2D\t\tSamsung Electronics Co.,Ltd\n18:3A:48\t\tVostroNet\n18:3B:D2\t\tBYD Precision Manufacture Company Ltd.\n18:3C:98\t\tShenzhen Hengyi Technology Co., LTD\n18:3C:B7\t\tHuawei Device Co., Ltd.\n18:3D:2D\t\tLCFC(Hefei) Electronics Technology co., ltd\n18:3D:5E\t\tHuawei Technologies Co.,Ltd\n18:3D:A2\t\tIntel Corporate\n18:3E:EF\t\tApple, Inc.\n18:3F:47\t\tSamsung Electronics Co.,Ltd\n18:3F:70\t\tApple, Inc.\n18:40:A4\t\tShenzhen Trylong Smart Science and Technology Co., Ltd.\n18:41:C3\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n18:41:FE\t\tDigital 14\n18:42:1D\t\tPrivate\n18:42:2F\t\tAlcatel Lucent\n18:42:D4\t\tWuhan Hosan Telecommunication Technology Co.,Ltd\n18:44:62\t\tRiava Networks, Inc.\n18:44:CF\t\tB+L Industrial Measurements GmbH\n18:44:E6\t\tzte corporation\n18:45:16\t\tTexas Instruments\n18:45:93\t\tTaicang T&W Electronics\n18:45:B3\t\tIEEE Registration Authority\n18:45:B3:00:00:00/28\tleetop tech co.,ltd\n18:45:B3:10:00:00/28\tPfannenberg GmbH\n18:45:B3:20:00:00/28\tHaier cloud Health Technology (Qingdao) Co., Ltd\n18:45:B3:30:00:00/28\tAncsonic (chongqing) Electronic Science& Technology Co.,Ltd\n18:45:B3:40:00:00/28\tMission Secure Inc\n18:45:B3:50:00:00/28\tElpitech Llc\n18:45:B3:60:00:00/28\tHarmonic Technology Limited\n18:45:B3:70:00:00/28\tShenzhen Incar Technology Co., Ltd.\n18:45:B3:80:00:00/28\tShenZhen Topband Co.,Ltd\n18:45:B3:90:00:00/28\tTeko Telecom Srl\n18:45:B3:A0:00:00/28\tGuangzhou Aoshi Internet Information & Technology Co.,Ltd.\n18:45:B3:B0:00:00/28\tHangzhou CCRFID Microelectronic Co., Ltd.\n18:45:B3:C0:00:00/28\tBdf Digital\n18:45:B3:D0:00:00/28\tTaicang T&W Electronics\n18:45:B3:E0:00:00/28\tSleep Number\n18:46:17\t\tSamsung Electronics Co.,Ltd\n18:46:44\t\tHome Control Singapore Pte Ltd\n18:47:3D\t\tChongqing Fugui Electronics Co.,Ltd.\n18:48:59\t\tCastlenet Technology Inc.\n18:48:BE\t\tAmazon Technologies Inc.\n18:48:CA\t\tMurata Manufacturing Co., Ltd.\n18:48:D8\t\tFastback Networks\n18:49:F8\t\tExtreme Networks Headquarters\n18:4A:53\t\tApple, Inc.\n18:4A:6F\t\tAlcatel-Lucent Shanghai Bell Co., Ltd\n18:4B:0D\t\tRuckus Wireless\n18:4B:DF\t\tCaavo Inc\n18:4C:08\t\tRockwell Automation\n18:4C:AE\t\tContinental\n18:4E:03\t\tHMD Global Oy\n18:4E:16\t\tSamsung Electronics Co.,Ltd\n18:4E:94\t\tMessoa Technologies Inc.\n18:4E:CB\t\tSamsung Electronics Co.,Ltd\n18:4F:32\t\tHon Hai Precision Ind. Co.,Ltd.\n18:4F:43\t\tUnionman Technology Co.,Ltd\n18:4F:5D\t\tJRC Mobility Inc.\n18:50:2A\t\tSoarnex\n18:50:73\t\tTianjin HuaLai Technology CO., Ltd.\n18:51:11\t\tUniversal Electronics, Inc.\n18:52:07\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n18:52:3D\t\tXiamen Jiwu Technology CO.,Ltd\n18:52:53\t\tPixord Corporation\n18:52:82\t\tFiberhome Telecommunication Technologies Co.,LTD\n18:53:45\t\tNokia\n18:53:E0\t\tHanyang Digitech Co.Ltd\n18:54:CF\t\tSamsung Electronics Co.,Ltd\n18:55:0F\t\tCisco SPVTG\n18:55:E3\t\tApple, Inc.\n18:56:44\t\tHuawei Technologies Co.,Ltd\n18:56:80\t\tIntel Corporate\n18:56:C3\t\tApple, Inc.\n18:58:69\t\tSailer Electronic Co., Ltd\n18:58:80\t\tArcadyan Corporation\n18:59:33\t\tCisco SPVTG\n18:59:36\t\tXiaomi Communications Co Ltd\n18:59:F5\t\tCisco Systems, Inc\n18:5A:58\t\tDell Inc.\n18:5A:E8\t\tZenotech.Co.,Ltd\n18:5B:00\t\tNokia\n18:5B:B3\t\tSamsung Electronics Co.,Ltd\n18:5D:6F\t\tN3com\n18:5D:9A\t\tBobjGear LLC\n18:5E:0B\t\tzte corporation\n18:5E:0F\t\tIntel Corporate\n18:60:24\t\tHewlett Packard\n18:60:41\t\tArcadyan Corporation\n18:61:C7\t\tlemonbeat GmbH\n18:62:2C\t\tSagemcom Broadband SAS\n18:62:E4\t\tTexas Instruments\n18:64:72\t\tHewlett Packard Enterprise\n18:65:71\t\tTop Victory Electronics (Taiwan) Co., Ltd.\n18:65:90\t\tApple, Inc.\n18:65:C7\t\tDongguan YIMO Technology Co.LTD\n18:66:96\t\tIEEE Registration Authority\n18:66:96:00:00:00/28\tAnnapurna labs\n18:66:96:10:00:00/28\tTurtle AV\n18:66:96:20:00:00/28\tNanjin KW technology Co.,Ltd.\n18:66:96:30:00:00/28\tCheersu(Shenzhen) Technology Co., Ltd\n18:66:96:40:00:00/28\tAkteena Inc\n18:66:96:50:00:00/28\tWuhan Precise Electronics Co.,Ltd.\n18:66:96:60:00:00/28\tShenzhen Safecuit Photonic Technology Co., Ltd\n18:66:96:70:00:00/28\tShandong Hummingbird Internet of Things Technology Co., Ltd\n18:66:96:80:00:00/28\tXunmu Information Technology(Shanghai) Co.,Ltd.\n18:66:96:90:00:00/28\tCoocaa Network Technology Co.,Ltd.\n18:66:96:A0:00:00/28\tBipai Electronic Technology(Dongguan)Co.,Ltd\n18:66:96:B0:00:00/28\tHunan Songben Information Co., Ltd\n18:66:96:C0:00:00/28\tKee Tat Innovative Technology Holdings Limited\n18:66:96:D0:00:00/28\tViva Co.,Ltd.\n18:66:96:E0:00:00/28\tIndusenz AS\n18:66:C7\t\tShenzhen Libre Technology Co., Ltd\n18:66:DA\t\tDell Inc.\n18:66:E3\t\tVeros Systems, Inc.\n18:66:F0\t\tJupiter Systems\n18:67:3F\t\tHanover Displays Limited\n18:67:51\t\tKOMEG Industrielle Messtechnik GmbH\n18:67:B0\t\tSamsung Electronics Co.,Ltd\n18:68:6A\t\tzte corporation\n18:68:82\t\tBeward R&D Co., Ltd.\n18:68:CB\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n18:69:D4\t\tSamsung Electronics Co.,Ltd\n18:69:D8\t\tTuya Smart Inc.\n18:69:DA\t\tChina Mobile Group Device Co.,Ltd.\n18:6A:81\t\tSagemcom Broadband SAS\n18:6B:E2\t\tLylink Limited\n18:6D:99\t\tAdanis Inc.\n18:6F:2D\t\tShenzhen Sundray Technologies company Limited\n18:70:3B\t\tHuawei Device Co., Ltd.\n18:71:17\t\teta plus electronic gmbh\n18:71:D5\t\tHazens Automotive Electronics(SZ)Co.,Ltd.\n18:74:2E\t\tAmazon Technologies Inc.\n18:74:E2\t\tIEEE Registration Authority\n18:74:E2:00:00:00/28\tEnsor AG\n18:74:E2:10:00:00/28\tSartorius Lab Instruments GmbH & Co. KG\n18:74:E2:20:00:00/28\tShenzhen WITSTECH Co.,Ltd.\n18:74:E2:30:00:00/28\tCT Company\n18:74:E2:40:00:00/28\tAggressive Electronics Manufacturing Services Pvt Limited\n18:74:E2:50:00:00/28\tHangzhou Zhouju Electronic Technological Co.,Ltd\n18:74:E2:60:00:00/28\tBeijing Jrunion Technology Co., Ltd.\n18:74:E2:70:00:00/28\tSansec Technology Co.,Ltd\n18:74:E2:80:00:00/28\tKano Computing Limited\n18:74:E2:90:00:00/28\tShenzhen Aoro Communication Equipment Co., Ltd\n18:74:E2:A0:00:00/28\tLinux Automation GmbH\n18:74:E2:B0:00:00/28\tShenzhen Jooan Technology  Co., Ltd\n18:74:E2:C0:00:00/28\tNextGen RF Design, Inc.\n18:74:E2:D0:00:00/28\tSamriddi Automations Pvt. Ltd.\n18:74:E2:E0:00:00/28\tG&O Audio Co.,LTD\n18:75:32\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n18:77:58\t\tAudoo Limited (UK)\n18:78:D4\t\tVerizon\n18:79:A2\t\tGmj Electric Limited\n18:79:FD\t\tzte corporation\n18:7A:3B\t\tHewlett Packard Enterprise\n18:7A:3E\t\tSilicon Laboratories\n18:7A:93\t\tAMICCOM Electronics Corporation\n18:7C:0B\t\tRuckus Wireless\n18:7C:81\t\tValeo Vision Systems\n18:7C:AA\t\tChina Mobile Group Device Co.,Ltd.\n18:7E:20\t\tFujian Star-Net Communication Co.,Ltd\n18:7E:B9\t\tApple, Inc.\n18:7E:D5\t\tshenzhen kaism technology Co. Ltd\n18:7F:88\t\tRing LLC\n18:80:25\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n18:80:90\t\tCisco Systems, Inc\n18:80:CE\t\tBarberry Solutions Ltd\n18:80:F5\t\tAlcatel-Lucent Shanghai Bell Co., Ltd\n18:81:0E\t\tApple, Inc.\n18:81:ED\t\tTeracom Telematica S.A\n18:82:19\t\tAlibaba Cloud Computing Ltd.\n18:82:8C\t\tArcadyan Corporation\n18:83:31\t\tSamsung Electronics Co.,Ltd\n18:83:BF\t\tArcadyan Technology Corporation\n18:84:10\t\tCoreTrust Inc.\n18:84:C1\t\tGuangzhou Shiyuan Electronic Technology Company Limited\n18:86:37\t\tIngram Micro Services\n18:86:3A\t\tDigital Art System\n18:86:AC\t\tNokia Danmark A/S\n18:86:C3\t\tNokia\n18:87:40\t\tXiaomi Communications Co Ltd\n18:87:96\t\tHTC Corporation\n18:88:57\t\tBeijing Jinhong Xi-Dian Information Technology Corp.\n18:89:5B\t\tSamsung Electronics Co.,Ltd\n18:89:A0\t\tFunshion Online Technologies Co.,Ltd\n18:89:CF\t\tTecno Mobile Limited\n18:89:DF\t\tOmnivision\n18:8A:6A\t\tAVPro Global Hldgs\n18:8B:0E\t\tEspressif Inc.\n18:8B:15\t\tShenZhen ZhongRuiJing Technology co.,LTD\n18:8B:45\t\tCisco Systems, Inc\n18:8B:9D\t\tCisco Systems, Inc\n18:8E:D5\t\tTP Vision Belgium N.V. - innovation site Brugge\n18:8E:F9\t\tG2C Co. Ltd.\n18:90:67\t\tShenzhen Jingxun Technology Co., Ltd.\n18:90:88\t\teero inc.\n18:90:D8\t\tSagemcom Broadband SAS\n18:92:2C\t\tVirtual Instruments\n18:92:A4\t\tCiena Corporation\n18:93:41\t\tIntel Corporate\n18:93:7F\t\tAMPAK Technology, Inc.\n18:93:D7\t\tTexas Instruments\n18:94:A3\t\tWistron Service(Kunshan) Co., Ltd.\n18:94:C6\t\tShenZhen Chenyee Technology Co., Ltd.\n18:95:52\t\t1More\n18:95:78\t\tDenso Corporation\n18:97:F1\t\tKOSTAL (Shanghai) Management Co., Ltd.\n18:97:FF\t\tTechFaith Wireless Technology Limited\n18:99:F5\t\tSichuan Changhong Electric Ltd.\n18:9A:67\t\tCSE-Servelec Limited\n18:9B:A5\t\tIEEE Registration Authority\n18:9B:A5:00:00:00/28\tDectris Ltd.\n18:9B:A5:10:00:00/28\tChengDu Vantron Technology, Ltd.\n18:9B:A5:20:00:00/28\tAirprotec\n18:9B:A5:30:00:00/28\tPhinetworks\n18:9B:A5:40:00:00/28\tInnominds Software Inc\n18:9B:A5:50:00:00/28\tStarfire Industries LLC\n18:9B:A5:60:00:00/28\tMantra Softech India Pvt Ltd\n18:9B:A5:70:00:00/28\tBeijing Xinertel Technology Co., Ltd.\n18:9B:A5:80:00:00/28\tShenzhen Tong Tai Yi information Technology Co.,Ltd\n18:9B:A5:90:00:00/28\tAPANA Inc.\n18:9B:A5:A0:00:00/28\tShenzhen Fionexx Technologies Ltd.\n18:9B:A5:B0:00:00/28\tEutron SPA\n18:9B:A5:C0:00:00/28\tChrist Electronic System GmbH\n18:9B:A5:D0:00:00/28\tlegendsky tech\n18:9B:A5:E0:00:00/28\tTaiwan Name Plate Co.,LTD\n18:9C:27\t\tCommscope\n18:9C:2C\t\tDongguan Huayin Electronic Technology Co., Ltd.\n18:9C:5D\t\tCisco Systems, Inc\n18:9C:E1\t\tArista Networks\n18:9E:2C\t\tHuawei Device Co., Ltd.\n18:9E:2D\t\tAllwinner Technology Co., Ltd\n18:9E:AD\t\tShenzhen Chengqian Information Technology Co., Ltd\n18:9E:FC\t\tApple, Inc.\n18:A2:8A\t\tEssel-T Co., Ltd\n18:A3:E8\t\tFiberhome Telecommunication Technologies Co.,LTD\n18:A4:A9\t\tVanu Inc.\n18:A5:9C\t\tIEEE Registration Authority\n18:A5:9C:00:00:00/28\tOmwave\n18:A5:9C:10:00:00/28\tCuman\n18:A5:9C:20:00:00/28\tActiontec Electronics Inc.\n18:A5:9C:30:00:00/28\tBeijing QS Medical Technology Co., Ltd.\n18:A5:9C:40:00:00/28\tIt-1\n18:A5:9C:50:00:00/28\tThermia AB\n18:A5:9C:60:00:00/28\tIntegral Plus\n18:A5:9C:70:00:00/28\tePower Network Solution Co., Ltd.\n18:A5:9C:80:00:00/28\tResidence Control Ltd\n18:A5:9C:90:00:00/28\testun automation co.,ltd\n18:A5:9C:A0:00:00/28\tErba Lachema s.r.o.\n18:A5:9C:B0:00:00/28\tCal-Comp Industria E Comercio De Eletronicos E Informatica Ltda\n18:A5:9C:C0:00:00/28\tBlueEyes Technology\n18:A5:9C:D0:00:00/28\tAnnapurna labs\n18:A5:9C:E0:00:00/28\tBMC Messsysteme GmbH\n18:A5:FF\t\tArcadyan Corporation\n18:A6:F7\t\tTp-Link Technologies Co.,Ltd.\n18:A7:88\t\tShenzhen MEK Intellisys Pte Ltd\n18:A7:F1\t\tQingdao Haier Technology Co.,Ltd\n18:A9:05\t\tHewlett Packard\n18:A9:58\t\tProvision Thai Co., Ltd.\n18:A9:9B\t\tDell Inc.\n18:A9:A6\t\tNebra Ltd\n18:A9:ED\t\teero inc.\n18:AA:0F\t\tHuawei Device Co., Ltd.\n18:AA:1E\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n18:AA:45\t\tFon Technology\n18:AA:CA\t\tSichuan tianyi kanghe communications co., LTD\n18:AB:1D\t\tSamsung Electronics Co.,Ltd\n18:AB:F5\t\tUltra Electronics Electrics\n18:AC:9E\t\tItel Mobile Limited\n18:AD:4D\t\tPolostar Technology Corporation\n18:AE:BB\t\tSiemens Convergence Creators GmbH&Co.KG\n18:AF:61\t\tApple, Inc.\n18:AF:8F\t\tApple, Inc.\n18:AF:9F\t\tDIGITRONIC Automationsanlagen GmbH\n18:AF:A1\t\tShenzhen Yifang Network Technology Co., Ltd.\n18:B1:69\t\tSonicwall\n18:B1:85\t\tQiao Information Technology (Zhengzhou) Co., Ltd.\n18:B2:09\t\tTorrey Pines Logic, Inc\n18:B3:BA\t\tNetlogic AB\n18:B4:30\t\tNest Labs Inc.\n18:B5:91\t\tI-Storm\n18:B6:CC\t\tWe Corporation Inc.\n18:B6:F7\t\tNew Pos Technology Limited\n18:B7:9E\t\tInvoxia\n18:B8:1F\t\tCommscope\n18:B9:05\t\tHong Kong Bouffalo Lab Limited\n18:B9:6E\t\tDongguan Liesheng Electronic Co., Ltd.\n18:BB:1C\t\tHuawei Device Co., Ltd.\n18:BB:26\t\tFn-Link Technology Limited\n18:BB:41\t\tHuawei Device Co., Ltd.\n18:BC:57\t\tADVA Optical Networking Ltd.\n18:BC:5A\t\tZhejiang Tmall Technology Co., Ltd.\n18:BD:AD\t\tL-Tech Corporation\n18:BE:92\t\tDelta Networks, Inc.\n18:BF:1C\t\tJiangsu Huitong Group Co.,Ltd.\n18:BF:B3\t\tSamsung Electronics Co., Ltd., Memory Division\n18:C0:07\t\tHuawei Device Co., Ltd.\n18:C0:09\t\tNew H3C Technologies Co., Ltd\n18:C0:4D\t\tGiga-Byte Technology Co.,Ltd.\n18:C0:86\t\tBroadcom\n18:C1:9D\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n18:C1:E2\t\tQolsys Inc.\n18:C2:3C\t\tLumi United Technology Co., Ltd\n18:C2:41\t\tSonicWall\n18:C2:93\t\tLaird Connectivity\n18:C2:BF\t\tBuffalo.Inc\n18:C3:00\t\tNokia\n18:C3:F4\t\tIEEE Registration Authority\n18:C3:F4:00:00:00/28\tScati Labs, S.A.\n18:C3:F4:10:00:00/28\tEnertex Bayern GmbH\n18:C3:F4:20:00:00/28\tChangsha Kiloview Electronics Co., Ltd.\n18:C3:F4:30:00:00/28\tGeneral Test Systems\n18:C3:F4:40:00:00/28\tAnnapurna labs\n18:C3:F4:50:00:00/28\tSynaptics, Inc\n18:C3:F4:60:00:00/28\tVeriFone Systems (China), Inc.\n18:C3:F4:70:00:00/28\tShenzhen Yecon-Tech Co.,Ltd.\n18:C3:F4:80:00:00/28\tShenzhen Liandian Communication Technology Co.LTD\n18:C3:F4:90:00:00/28\tNingbo Yuda Communication Technology Co.,Ltd\n18:C3:F4:A0:00:00/28\tShenzhen Yunlianxin Technology Co., Ltd.\n18:C3:F4:B0:00:00/28\tVector Technologies, Llc\n18:C3:F4:C0:00:00/28\tHangzhou Zhongkejiguang Technology Co., Ltd\n18:C3:F4:D0:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n18:C3:F4:E0:00:00/28\tShenzhen Megmeet Electrical Co., Ltd\n18:C4:51\t\tTucson Embedded Systems\n18:C5:01\t\tShenzhen Gongjin Electronics Co.,Lt\n18:C5:8A\t\tHuawei Technologies Co.,Ltd\n18:C8:E7\t\tShenzhen Hualistone Technology Co.,Ltd\n18:CA:A7\t\tzte corporation\n18:CC:18\t\tIntel Corporate\n18:CC:23\t\tPhilio Technology Corporation\n18:CC:88\t\tHitachi Johnson Controls Air\n18:CE:94\t\tSamsung Electronics Co.,Ltd\n18:CE:DF\t\tQuectel Wireless Solutions Co.,Ltd.\n18:CF:24\t\tHuawei Technologies Co.,Ltd\n18:CF:5E\t\tLiteon Technology Corporation\n18:D0:71\t\tDasan Co., Ltd.\n18:D0:C5\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n18:D2:25\t\tFiberhome Telecommunication Technologies Co.,LTD\n18:D2:76\t\tHuawei Technologies Co.,Ltd\n18:D5:B6\t\tSMG Holdings LLC\n18:D6:1C\t\tShenzhen TINNO Mobile Technology Corp.\n18:D6:6A\t\tInmarsat\n18:D6:C7\t\tTp-Link Technologies Co.,Ltd.\n18:D6:CF\t\tKurth Electronic GmbH\n18:D6:DD\t\tHuawei Technologies Co.,Ltd\n18:D7:17\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n18:D7:93\t\tIEEE Registration Authority\n18:D7:93:00:00:00/28\tShenzhen JieXingTong Technology Co.,LTD\n18:D7:93:10:00:00/28\tAnnapurna labs\n18:D7:93:20:00:00/28\tHydrotechnik GmbH\n18:D7:93:30:00:00/28\tVerification & Validation Technology Co.,Ltd\n18:D7:93:40:00:00/28\tRemote Engineer B.V.\n18:D7:93:50:00:00/28\tDongGuan Orient Electronics & Metal Co.,Ltd\n18:D7:93:60:00:00/28\tAutel lntelligent Technology Corp.,Ltd\n18:D7:93:70:00:00/28\tJFA Electronics Industry and Commerce EIRELI\n18:D7:93:80:00:00/28\tTorsa Global\n18:D7:93:90:00:00/28\tClarity Medical Pvt Ltd\n18:D7:93:A0:00:00/28\tzhejiang Anhong technology co.,ltd\n18:D7:93:B0:00:00/28\tEcoG\n18:D7:93:C0:00:00/28\tPrivate\n18:D7:93:D0:00:00/28\tKraken Technologies Ltd\n18:D7:93:E0:00:00/28\tTeegarden Applied Science Inc\n18:D9:49\t\tQvis Labs, LLC\n18:D9:8F\t\tHuawei Device Co., Ltd.\n18:D9:EF\t\tShuttle Inc.\n18:DB:F2\t\tDell Inc.\n18:DC:56\t\tYulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd\n18:DE:50\t\tTuya Smart Inc.\n18:DE:D7\t\tHuawei Technologies Co.,Ltd\n18:DF:26\t\tIngram Micro Services\n18:DF:B4\t\tBosung Powertec Co.,Ltd.\n18:DF:C1\t\tAetheros\n18:E1:CA\t\twanze\n18:E1:DE\t\tChengdu ChipIntelli Technology Co., Ltd\n18:E2:04\t\tBeijing Coolshark Technology Co.,Ltd.\n18:E2:15\t\tNokia\n18:E2:88\t\tSTT Condigi\n18:E2:9F\t\tvivo Mobile Communication Co., Ltd.\n18:E2:C2\t\tSamsung Electronics Co.,Ltd\n18:E3:BC\t\tTCT mobile ltd\n18:E6:71\t\tApple, Inc.\n18:E7:28\t\tCisco Systems, Inc\n18:E7:77\t\tvivo Mobile Communication Co., Ltd.\n18:E7:B0\t\tApple, Inc.\n18:E7:F4\t\tApple, Inc.\n18:E8:0F\t\tViking Electronics Inc.\n18:E8:29\t\tUbiquiti Inc\n18:E8:3B\t\tCitadel Wallet LLC\n18:E8:DD\t\tModuletek\n18:E8:EC\t\tSTMicrolectronics International NV\n18:E9:1D\t\tHuawei Technologies Co.,Ltd\n18:EB:D4\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n18:EC:E7\t\tBuffalo.Inc\n18:EE:69\t\tApple, Inc.\n18:EE:86\t\tInseego Wireless, Inc\n18:EF:3A\t\tSichuan AI-Link Technology Co., Ltd.\n18:EF:63\t\tCisco Systems, Inc\n18:EF:C0\t\tSercomm Japan Corporation\n18:F0:E4\t\tXiaomi Communications Co Ltd\n18:F1:45\t\tNetComm Wireless Limited\n18:F1:8E\t\tChipER Technology co. ltd\n18:F1:D8\t\tApple, Inc.\n18:F2:2C\t\tTp-Link Technologies Co.,Ltd.\n18:F2:92\t\tShannon Systems\n18:F4:6A\t\tHon Hai Precision Ind. Co.,Ltd.\n18:F4:6B\t\tTelenor Connexion AB\n18:F6:43\t\tApple, Inc.\n18:F6:50\t\tMultimedia Pacific Limited\n18:F6:97\t\tAxiom Memory Solutions, Inc.\n18:F7:6B\t\tZhejiang Winsight Technology CO.,LTD\n18:F8:7A\t\ti3 International Inc.\n18:F8:7F\t\tWha Yu Industrial Co., Ltd.\n18:F9:35\t\tCisco Systems, Inc\n18:F9:C4\t\tBAE Systems\n18:FA:6F\t\tISC applied systems corp\n18:FA:B7\t\tApple, Inc.\n18:FB:7B\t\tDell Inc.\n18:FB:8E\t\tVusionGroup\n18:FC:26\t\tQorvo International Pte. Ltd.\n18:FC:9F\t\tChanghe Electronics Co., Ltd.\n18:FD:74\t\tRouterboard.com\n18:FD:CB\t\tIEEE Registration Authority\n18:FD:CB:00:00:00/28\tShenzhen Rui jiali Electronic Technology Co. Ltd.\n18:FD:CB:10:00:00/28\tSOTHIS CIC TEC (Shanghai) Co., Ltd\n18:FD:CB:20:00:00/28\tCabtronix AG\n18:FD:CB:30:00:00/28\tStaclar, Inc.\n18:FD:CB:40:00:00/28\tGosuncn Technology Group Co.,LTD.\n18:FD:CB:50:00:00/28\tAccel Robotics\n18:FD:CB:60:00:00/28\tSKA Organisation\n18:FD:CB:70:00:00/28\tEnergie Ip\n18:FD:CB:80:00:00/28\tCISTECH Solutions\n18:FD:CB:90:00:00/28\tCreyNox GmbH\n18:FD:CB:A0:00:00/28\tSercomm Corporation.\n18:FD:CB:B0:00:00/28\tTranslite Global Llc\n18:FD:CB:C0:00:00/28\tArk Vision Systems GmbH & Co. KG\n18:FD:CB:D0:00:00/28\tStreamLocator\n18:FD:CB:E0:00:00/28\tKwang Yang Motor Co.,Ltd\n18:FE:34\t\tEspressif Inc.\n18:FF:0F\t\tIntel Corporate\n18:FF:2E\t\tShenzhen Rui Ying Da Technology Co., Ltd\n1A:75:FB\t\tAutosar\n1A:90:21\t\tPhysical Security Interoperability Alliance\n1A:AF:53\t\tJSC Megapolis-telecom region\n1A:BB:FB\t\tUHD Alliance\n1C:00:42\t\tNARI Technology Co., Ltd.\n1C:01:2D\t\tFicer Technology\n1C:02:19\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n1C:05:B7\t\tChongqing Trantor Technology Co., Ltd.\n1C:06:56\t\tIDY Corporation\n1C:08:C1\t\tLG Innotek\n1C:0B:52\t\tEpicom S.A\n1C:0B:8B\t\tUbiquiti Inc\n1C:0D:7D\t\tApple, Inc.\n1C:0E:AF\t\tHuawei Device Co., Ltd.\n1C:0E:C2\t\tApple, Inc.\n1C:0E:D3\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n1C:0F:AF\t\tLucid Vision Labs\n1C:0F:CF\t\tSypro Optics GmbH\n1C:11:2F\t\tvivo Mobile Communication Co., Ltd.\n1C:11:61\t\tCiena Corporation\n1C:11:E1\t\tWartsila Finland Oy\n1C:12:9D\t\tIeee Pes Psrc/Sub\n1C:12:B0\t\tAmazon Technologies Inc.\n1C:13:38\t\tKimball Electronics Group, LLC\n1C:13:86\t\tHuawei Device Co., Ltd.\n1C:13:FA\t\tHuawei Device Co., Ltd.\n1C:14:48\t\tCommscope\n1C:14:B3\t\tAirwire Technologies\n1C:15:1F\t\tHuawei Technologies Co.,Ltd\n1C:17:D3\t\tCisco Systems, Inc\n1C:18:4A\t\tShenZhen RicherLink Technologies Co.,LTD\n1C:19:DE\t\teyevis GmbH\n1C:1A:1B\t\tShanghai Sunmi Technology Co.,Ltd.\n1C:1A:C0\t\tApple, Inc.\n1C:1A:DF\t\tMicrosoft Corporation\n1C:1B:0D\t\tGiga-Byte Technology Co.,Ltd.\n1C:1B:68\t\tCommscope\n1C:1B:B5\t\tIntel Corporate\n1C:1C:FD\t\tDalian Hi-Think Computer Technology, Corp\n1C:1D:67\t\tHuawei Technologies Co.,Ltd\n1C:1D:86\t\tCisco Systems, Inc\n1C:1D:D3\t\tApple, Inc.\n1C:1E:38\t\tPCCW Global, Inc.\n1C:1E:E3\t\tHui Zhou Gaoshengda Technology Co.,LTD\n1C:1F:D4\t\tLifeBEAM Technologies LTD\n1C:1F:F1\t\tHuawei Device Co., Ltd.\n1C:20:DB\t\tHuawei Technologies Co.,Ltd\n1C:21:56\t\tSmappee NV\n1C:21:D1\t\tIEEE Registration Authority\n1C:21:D1:00:00:00/28\tToyo System CO.,LTD.\n1C:21:D1:10:00:00/28\tOgnios GmbH\n1C:21:D1:20:00:00/28\tVaraani Works Oy\n1C:21:D1:30:00:00/28\tMicroview Science and Technology Co.,Ltd\n1C:21:D1:40:00:00/28\tScientific-Production Enterprise Dynamics\n1C:21:D1:50:00:00/28\tB-Scada Inc.\n1C:21:D1:60:00:00/28\tWuhan TieChi Detection Technology Co., Ltd.\n1C:21:D1:70:00:00/28\tSoundtrack Your Brand Sweden AB\n1C:21:D1:80:00:00/28\tCleaveland/Price, Inc.\n1C:21:D1:90:00:00/28\tDynojet Research\n1C:21:D1:A0:00:00/28\tLg Cns\n1C:21:D1:B0:00:00/28\tGlobal Design Solutions Ltd\n1C:21:D1:C0:00:00/28\tPrivate\n1C:21:D1:D0:00:00/28\tLiscotech System Co., Ltd.\n1C:21:D1:E0:00:00/28\tp2-plus inc.\n1C:21:D1:F0:00:00/28\tPrivate\n1C:22:85\t\tSerrature Meroni SpA\n1C:23:2C\t\tSamsung Electronics Co.,Ltd\n1C:23:4F\t\tEDMI  Europe Ltd\n1C:24:CD\t\tAskey Computer Corp\n1C:24:EB\t\tBurlywood\n1C:25:E1\t\tChina Mobile IOT Company Limited\n1C:27:04\t\tzte corporation\n1C:27:DD\t\tDatang Gohighsec(zhejiang)Information Technology Co.,Ltd.\n1C:28:AF\t\tHewlett Packard Enterprise\n1C:2A:8B\t\tNokia\n1C:2A:A3\t\tShenzhen HongRui Optical Technology Co., Ltd.\n1C:2A:B0\t\tBeijing Xiaomi Electronics Co.,Ltd\n1C:2C:E0\t\tShanghai  Mountain View Silicon\n1C:2E:1B\t\tSuzhou Tremenet Communication Technology Co., Ltd.\n1C:2F:A2\t\tGuangzhou Shiyuan Electronic Technology Company Limited\n1C:30:03\t\tHewlett Packard Enterprise\n1C:30:08\t\tHui Zhou Gaoshengda Technology Co.,LTD\n1C:32:83\t\tCOMTTI Intelligent Technology(Shenzhen) Co., Ltd.\n1C:32:AC\t\tHuawei Technologies Co.,Ltd\n1C:33:0E\t\tPernixData\n1C:33:4D\t\tITS Telecom\n1C:34:77\t\tInnovation Wireless\n1C:34:DA\t\tMellanox Technologies, Inc.\n1C:34:F1\t\tSilicon Laboratories\n1C:35:F1\t\tNEW Lift Neue Elektronische Wege Steuerungsbau GmbH\n1C:36:BB\t\tApple, Inc.\n1C:37:BF\t\tCloudium Systems Ltd.\n1C:39:29\t\tOhsung\n1C:39:47\t\tCompal Information (Kunshan) Co., Ltd.\n1C:39:8A\t\tFiberhome Telecommunication Technologies Co.,LTD\n1C:3A:4F\t\tAccuSpec Electronics, LLC\n1C:3A:60\t\tRuckus Wireless\n1C:3A:DE\t\tSamsung Electronics Co.,Ltd\n1C:3B:01\t\tShanghai Xiaodu Technology Limited\n1C:3B:62\t\tHMD Global Oy\n1C:3B:8F\t\tSelve GmbH & Co. KG\n1C:3B:F3\t\tTp-Link Technologies Co.,Ltd.\n1C:3C:78\t\tApple, Inc.\n1C:3C:D4\t\tHuawei Technologies Co.,Ltd\n1C:3D:2F\t\tHuawei Technologies Co.,Ltd\n1C:3D:E7\t\tSigma Koki Co.,Ltd.\n1C:3E:84\t\tHon Hai Precision Ind. Co.,Ltd.\n1C:40:24\t\tDell Inc.\n1C:40:E8\t\tShenzhen Progress&Win Technology Co.,Ltd\n1C:41:58\t\tGemalto M2M GmbH\n1C:41:76\t\tChina Mobile Group Device Co.,Ltd.\n1C:41:90\t\tUniversal Electronics, Inc.\n1C:42:7D\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n1C:43:63\t\tHuawei Technologies Co.,Ltd\n1C:43:EC\t\tJapan Circuit Co.,Ltd\n1C:44:19\t\tTp-Link Technologies Co.,Ltd.\n1C:44:55\t\tSieb & Meyer AG\n1C:45:86\t\tNintendo Co.,Ltd\n1C:45:93\t\tTexas Instruments\n1C:45:C2\t\tHuizhou City Sunsin lntelligent Technology Co.,Ltd\n1C:46:D1\t\tSky Uk Limited\n1C:47:2F\t\tHuawei Device Co., Ltd.\n1C:47:F6\t\tZhidao Network Technology(Shenzhen) Co.,Ltd\n1C:48:40\t\tIMS Messsysteme GmbH\n1C:48:CE\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n1C:48:F9\t\tGN Netcom A/S\n1C:49:7B\t\tGemtek Technology Co., Ltd.\n1C:4A:F7\t\tAmon Inc\n1C:4B:B9\t\tSmg Enterprise, Llc\n1C:4B:D6\t\tAzureWave Technology Inc.\n1C:4C:27\t\tWorld WLAN Application Alliance\n1C:4C:48\t\tItel Mobile Limited\n1C:4D:66\t\tAmazon Technologies Inc.\n1C:4D:70\t\tIntel Corporate\n1C:4D:89\t\tHangzhou Huacheng Network Technology Co.,Ltd\n1C:4E:A2\t\tShenzhen V-Link Technology CO., LTD.\n1C:50:1E\t\tSunplus Technology Co., Ltd.\n1C:51:B5\t\tTechaya LTD\n1C:52:16\t\tDongguan Hele Electronics Co., Ltd\n1C:52:A7\t\tCoram AI, Inc\n1C:52:D6\t\tFlat Display Technology Corporation\n1C:53:F9\t\tGoogle, Inc.\n1C:54:9E\t\tUniversal Electronics, Inc.\n1C:54:E6\t\tShenzhen Yisheng Technology Co.,Ltd\n1C:55:3A\t\tQianGua Corp.\n1C:56:8E\t\tZioncom Electronics (Shenzhen) Ltd.\n1C:56:FE\t\tMotorola Mobility LLC, a Lenovo Company\n1C:57:3E\t\tAltice Labs\n1C:57:D8\t\tKraftway Corporation PLC\n1C:57:DC\t\tApple, Inc.\n1C:59:74\t\tIEEE Registration Authority\n1C:59:74:00:00:00/28\tShenzhen Hanshine Technology Co.Ltd.\n1C:59:74:10:00:00/28\tLogical Infrastructure PTY LTD\n1C:59:74:20:00:00/28\tChongqing Taishan Cable Co., Ltd\n1C:59:74:30:00:00/28\tJiangsu Welm Technology Co.,Ltd\n1C:59:74:40:00:00/28\tSyntax technology(tianjin)Co.,LTD\n1C:59:74:50:00:00/28\tShenzhen Shi Fang Communication Technology Co., Ltd\n1C:59:74:60:00:00/28\tSquare Inc.\n1C:59:74:70:00:00/28\tLynxi Technologies Co.,Ltd.\n1C:59:74:80:00:00/28\tTopway Global Technology Limited\n1C:59:74:90:00:00/28\tShanghai Laisi Information Technology Co.,Ltd\n1C:59:74:A0:00:00/28\tViridi Parente, Inc.\n1C:59:74:B0:00:00/28\tBeijing Flintec Electronic Technology Co.,Ltd.\n1C:59:74:C0:00:00/28\tKing-On Technology Ltd.\n1C:59:74:D0:00:00/28\tShenzhen Geshem Technology Co Ltd\n1C:59:74:E0:00:00/28\tGlobe Tracker ApS\n1C:59:9B\t\tHuawei Technologies Co.,Ltd\n1C:5A:0B\t\tTegile Systems\n1C:5A:3E\t\tSamsung Electronics Co.,Ltd\n1C:5A:6B\t\tPhilips Electronics Nederland BV\n1C:5C:55\t\tPRIMA Cinema, Inc\n1C:5C:60\t\tShenzhen Belzon Technology Co.,LTD.\n1C:5C:F2\t\tApple, Inc.\n1C:5D:80\t\tMitubishi Hitachi Power Systems Industries Co., Ltd.\n1C:5E:E6\t\tShenzhen Twowing Technologies Co.,Ltd.\n1C:5F:2B\t\tD-Link International\n1C:5F:FF\t\tBeijing Ereneben Information Technology Co.,Ltd Shenzhen Branch\n1C:60:66\t\tTejas Networks Ltd\n1C:60:D2\t\tFiberhome Telecommunication Technologies Co.,LTD\n1C:60:DE\t\tMercury Communication Technologies Co.,Ltd.\n1C:61:B4\t\tTP-Link Systems Inc\n1C:61:BF\t\tApple, Inc.\n1C:62:7E\t\tHuawei Technologies Co.,Ltd\n1C:62:B8\t\tSamsung Electronics Co.,Ltd\n1C:63:49\t\tTexas Instruments\n1C:63:A5\t\tsecurityplatform\n1C:63:B7\t\tOpenProducts 237 AB\n1C:63:BF\t\tShenzhen Broadtel  Telecom Co.,Ltd\n1C:64:99\t\tComtrend Corporation\n1C:64:F0\t\tMotorola Mobility LLC, a Lenovo Company\n1C:65:9D\t\tLiteon Technology Corporation\n1C:66:6D\t\tHon Hai Precision Ind. Co.,Ltd.\n1C:66:AA\t\tSamsung Electronics Co.,Ltd\n1C:67:4A\t\tzte corporation\n1C:67:58\t\tHuawei Technologies Co.,Ltd\n1C:67:60\t\tPhonesuite\n1C:68:7E\t\tShenzhen Qihu Intelligent Technology Company Limited\n1C:69:20\t\tEspressif Inc.\n1C:69:7A\t\tEliteGroup Computer Systems Co., LTD\n1C:69:A5\t\tBlackBerry RTS\n1C:6A:1B\t\tUbiquiti Inc\n1C:6A:76\t\tApple, Inc.\n1C:6A:7A\t\tCisco Systems, Inc\n1C:6B:CA\t\tMitsunami Co., Ltd.\n1C:6E:4C\t\tLogistic Service & Engineering Co.,Ltd\n1C:6E:74\t\tEnOcean Edge Inc.\n1C:6E:76\t\tQuarion Technology Inc\n1C:6E:E6\t\tNhnetworks\n1C:6F:65\t\tGiga-Byte Technology Co.,Ltd.\n1C:70:22\t\tMurata Manufacturing Co., Ltd.\n1C:70:C9\t\tJiangsu Aisida Electronic Co., Ltd\n1C:71:25\t\tApple, Inc.\n1C:71:26\t\tsnom technology GmbH\n1C:72:1D\t\tDell Inc.\n1C:73:28\t\tConnected Home\n1C:73:70\t\tNeotech\n1C:73:E2\t\tHuawei Technologies Co.,Ltd\n1C:74:0D\t\tZyxel Communications Corporation\n1C:75:08\t\tCompal Information (Kunshan) Co., Ltd.\n1C:76:CA\t\tTerasic Technologies Inc.\n1C:76:F2\t\tSamsung Electronics Co.,Ltd\n1C:77:54\t\tApple, Inc.\n1C:77:F6\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n1C:78:39\t\tShenzhen Tencent Computer System Co., Ltd.\n1C:78:4B\t\tBouffalo Lab (Nanjing) Co., Ltd.\n1C:78:4E\t\tChina Mobile Iot Limited company\n1C:79:2D\t\tChina Dragon Technology Limited\n1C:7A:43\t\tvivo Mobile Communication Co., Ltd.\n1C:7A:CF\t\tvivo Mobile Communication Co., Ltd.\n1C:7B:21\t\tSony Corporation\n1C:7B:23\t\tQingdao Hisense Communications Co.,Ltd.\n1C:7C:11\t\tEid\n1C:7C:45\t\tVitek Industrial Video Products, Inc.\n1C:7C:98\t\tNEC Platforms, Ltd.\n1C:7C:C7\t\tCoriant GmbH\n1C:7D:22\t\tFUJIFILM Business Innovation Corp.\n1C:7E:51\t\t3bumen.com\n1C:7E:E5\t\tD-Link International\n1C:7F:2C\t\tHuawei Technologies Co.,Ltd\n1C:82:59\t\tIEEE Registration Authority\n1C:82:59:00:00:00/28\tShandong Luneng Intelligence Technology CO., Ltd\n1C:82:59:10:00:00/28\t3xLOGIC Inc.\n1C:82:59:20:00:00/28\tDiatrend Corporation\n1C:82:59:30:00:00/28\tC&A Marketing, INC.\n1C:82:59:40:00:00/28\twinsun AG\n1C:82:59:50:00:00/28\tFagus-GreCon Greten GmbH & Co. KG\n1C:82:59:60:00:00/28\tCgi It Uk Limited\n1C:82:59:70:00:00/28\tJump Trading\n1C:82:59:80:00:00/28\tShenzhen Aoa Technology Co.,Ltd\n1C:82:59:90:00:00/28\tShanghai Xiaoyan Technology Co., Ltd.\n1C:82:59:A0:00:00/28\tESTec Corporation\n1C:82:59:B0:00:00/28\tKeyWest Networks, Inc\n1C:82:59:C0:00:00/28\tEvondos Oy\n1C:82:59:D0:00:00/28\tApplied Concepts, Inc.\n1C:82:59:E0:00:00/28\tMicrotronics Engineering GmbH\n1C:83:41\t\tHefei Bitland Information Technology Co.Ltd\n1C:83:B0\t\tLinked IP GmbH\n1C:83:EC\t\tUbee Interactive co, Limited.\n1C:84:64\t\tFormosa Wireless Communication Corp.\n1C:86:0B\t\tGuangdong Taiying Technology Co.,Ltd\n1C:86:82\t\tApple, Inc.\n1C:86:9A\t\tSamsung Electronics Co.,Ltd\n1C:86:AD\t\tMct Co., Ltd.\n1C:87:2C\t\tASUSTek COMPUTER INC.\n1C:87:74:00:00:00/28\tPhilips Personal Health Solutions\n1C:87:74:10:00:00/28\tSigfox\n1C:87:74:20:00:00/28\tNichigaku\n1C:87:74:30:00:00/28\tSilora R&D\n1C:87:74:40:00:00/28\tWeber Marking Systems GmbH\n1C:87:74:50:00:00/28\tXiaoxinge (Tangshan) Electronic Technology Co., Ltd.\n1C:87:74:60:00:00/28\tSchawbel Technologies LLC\n1C:87:74:70:00:00/28\tIng Buero Ziegler\n1C:87:74:80:00:00/28\tSurtec Industries, Inc\n1C:87:74:90:00:00/28\tWide World Trade HK ltd.\n1C:87:74:A0:00:00/28\tNebbiolo Technologies\n1C:87:74:B0:00:00/28\tHABEY USA Inc.\n1C:87:74:C0:00:00/28\tNew Nordic Engineering\n1C:87:74:D0:00:00/28\tClaber Spa\n1C:87:74:E0:00:00/28\tQuest Integrity\n1C:87:76:00:00:00/28\tDspread Technology (Beijing) Inc.\n1C:87:76:10:00:00/28\tEBS Sp. z o.o.\n1C:87:76:20:00:00/28\tIbeo Automotive Systems GmbH\n1C:87:76:30:00:00/28\tUnjo AB\n1C:87:76:40:00:00/28\tRdp.Ru\n1C:87:76:50:00:00/28\tZhuhai MYZR Technology Co.,Ltd\n1C:87:76:60:00:00/28\tphilandro Software GmbH\n1C:87:76:70:00:00/28\tCorporate Systems Engineering\n1C:87:76:80:00:00/28\tGuangzhou Video-Star Electronics Co.,Ltd.\n1C:87:76:90:00:00/28\tTokyo Drawing Ltd.\n1C:87:76:A0:00:00/28\tJiangsu ETERN COMMUNICATION Co.,ltd\n1C:87:76:B0:00:00/28\tHekatron Vertriebs GmbH\n1C:87:76:C0:00:00/28\tStrone Technology\n1C:87:76:D0:00:00/28\tQivivo\n1C:87:76:E0:00:00/28\tArtis GmbH\n1C:87:79:00:00:00/28\tWurm GmbH & Co. KG Elektronische Systeme\n1C:87:79:10:00:00/28\tA-Gear Company Limited\n1C:87:79:20:00:00/28\tSMARTMOVT TECHNOLOGY Co.， LTD\n1C:87:79:30:00:00/28\tVisual Land Inc.\n1C:87:79:40:00:00/28\tNovetta\n1C:87:79:50:00:00/28\tBeidian  Group\n1C:87:79:60:00:00/28\tShenzhen Shouxin Tongda Technology Co.,Ltd\n1C:87:79:70:00:00/28\tTASC Systems Inc.\n1C:87:79:80:00:00/28\tZhejiang Itenal Technology Co.,Ltd\n1C:87:79:90:00:00/28\tIstria soluciones de criptografia, S. A.\n1C:87:79:A0:00:00/28\tHangzhou Xiaowen Intelligent Technology Co., Ltd.\n1C:87:79:B0:00:00/28\tBeijing Geedeen Technology Co., Ltd\n1C:87:79:C0:00:00/28\tAllThingsTalk\n1C:87:79:D0:00:00/28\tShenzhen Innovaconn Systems Co.,Ltd\n1C:87:79:E0:00:00/28\tASSYSTEM France\n1C:87:E3\t\tTecno Mobile Limited\n1C:88:0C\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n1C:88:79:00:00:00/28\tNewps co.,ltd\n1C:88:79:10:00:00/28\tANDRA Sp. z o. o.\n1C:88:79:20:00:00/28\tAirsmart System Co.,Ltd\n1C:88:79:30:00:00/28\tShenzhen Xiaoxi Technology Co., Ltd.\n1C:88:79:40:00:00/28\tUltraflux\n1C:88:79:50:00:00/28\tShenzhenfreelink Electronic Co.,Ltd\n1C:88:79:60:00:00/28\tEolos IT Corp\n1C:88:79:70:00:00/28\tSensys Networks, Inc.\n1C:88:79:80:00:00/28\tToshiba Toko Meter Systems Co., LTD.\n1C:88:79:90:00:00/28\tXingtera China Ltd\n1C:88:79:A0:00:00/28\tItw-Feg\n1C:88:79:B0:00:00/28\tgekartel AG\n1C:88:79:C0:00:00/28\tAccriva\n1C:88:79:D0:00:00/28\tBeijing Raycores Technology Co.,Ltd\n1C:88:79:E0:00:00/28\tOrion Labs inc\n1C:8B:76\t\tCalix Inc.\n1C:8B:EF\t\tBeijing Xiaomi Electronics Co.,Ltd\n1C:8E:5C\t\tHuawei Technologies Co.,Ltd\n1C:8E:8E\t\tDB Communication & Systems Co., ltd.\n1C:8F:8A\t\tPhase Motion Control SpA\n1C:90:BE\t\tEricsson AB\n1C:90:FF\t\tTuya Smart Inc.\n1C:91:48\t\tApple, Inc.\n1C:91:79\t\tIntegrated System Technologies Ltd\n1C:91:80\t\tApple, Inc.\n1C:91:9D\t\tDongguan Liesheng Electronic Co., Ltd.\n1C:93:7C\t\tCommscope\n1C:93:C4\t\tAmazon Technologies Inc.\n1C:94:68\t\tNew H3C Technologies Co., Ltd\n1C:94:92\t\tRUAG Schweiz AG\n1C:95:5D\t\tI-Lax Electronics Inc.\n1C:95:9F\t\tVeethree Electronics And Marine LLC\n1C:96:5A\t\tWeifang Goertek Electronics Co.,Ltd\n1C:97:3D\t\tPRICOM Design\n1C:97:C5\t\tYnomia Pty Ltd\n1C:97:FB\t\tCoolBitX Ltd.\n1C:98:C1\t\tCloud Network Technology Singapore Pte. Ltd.\n1C:98:EC\t\tHewlett Packard Enterprise\n1C:99:4C\t\tMurata Manufacturing Co., Ltd.\n1C:99:57\t\tIntel Corporate\n1C:99:DB\t\tHuawei Technologies Co.,Ltd\n1C:9C:26\t\tZoovel Technologies\n1C:9C:8C\t\tJuniper Networks\n1C:9D:3E\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n1C:9D:72\t\tVantiva USA LLC\n1C:9D:C2\t\tEspressif Inc.\n1C:9E:46\t\tApple, Inc.\n1C:9E:CB\t\tBeijing Nari Smartchip Microelectronics Company Limited\n1C:9E:CC\t\tVantiva USA LLC\n1C:9F:4E\t\tCoosea Group (Hk) Company Limited\n1C:A0:B8\t\tHon Hai Precision Industry Co., Ltd.\n1C:A0:D3\t\tIEEE Registration Authority\n1C:A0:D3:00:00:00/28\tOOO Tekhnotronika\n1C:A0:D3:10:00:00/28\tJabil circuit italia srl\n1C:A0:D3:20:00:00/28\tNovTech, Inc.\n1C:A0:D3:30:00:00/28\tSavelec\n1C:A0:D3:40:00:00/28\tNpo Telecom Jsc\n1C:A0:D3:50:00:00/28\tDynamic Connect (Suzhou) Hi-Tech Electronic Co.,Ltd.\n1C:A0:D3:60:00:00/28\tIntertecno SRL \"NISUTA\"\n1C:A0:D3:70:00:00/28\tU-TX Technologies Ltd\n1C:A0:D3:80:00:00/28\tDesarrollos y Soluciones Guinea I+D S.L.\n1C:A0:D3:90:00:00/28\tCirque Audio Technology Co., Ltd\n1C:A0:D3:A0:00:00/28\tDSM Messtechnik GmbH\n1C:A0:D3:B0:00:00/28\tGuang Dong He Zheng Network Technology Co.,Ltd\n1C:A0:D3:C0:00:00/28\tLYT inc.\n1C:A0:D3:D0:00:00/28\tERATO (HK) Corporation Limited\n1C:A0:D3:E0:00:00/28\tExicom Tele-Systems Ltd.\n1C:A0:EF\t\tIEEE Registration Authority\n1C:A0:EF:00:00:00/28\tTangshan Liulin Automation Equipment Co., Ltd.\n1C:A0:EF:10:00:00/28\tWisnu and Supak Co.,Ltd.\n1C:A0:EF:20:00:00/28\tSchneider-Electric(China)Co.Ltd,Shenzhen Branch\n1C:A0:EF:30:00:00/28\tSequent AG\n1C:A0:EF:40:00:00/28\tLeviathan Solutions Ltd.\n1C:A0:EF:50:00:00/28\tNanjing Bilin Intelligent Identification Technology Co.,Ltd\n1C:A0:EF:60:00:00/28\tHanjen.Chin  Co., Ltd.\n1C:A0:EF:70:00:00/28\ttec5AG\n1C:A0:EF:80:00:00/28\tZillnk\n1C:A0:EF:90:00:00/28\tAtlas Aerospace\n1C:A0:EF:A0:00:00/28\tHenrich Electronics Corporation\n1C:A0:EF:B0:00:00/28\tBMK professional electronics GmbH\n1C:A0:EF:C0:00:00/28\tLLC \"Gagar.In\"\n1C:A0:EF:D0:00:00/28\tShenzhen Liandian Communication Technology Co.LTD\n1C:A0:EF:E0:00:00/28\tRDA Microelectronics Technologies (Shanghai) Co. , Ltd\n1C:A2:B1\t\truwido austria gmbh\n1C:A4:10\t\tAmlogic, Inc.\n1C:A5:32\t\tShenzhen Gongjin Electronics Co.,Lt\n1C:A6:81\t\tHuawei Technologies Co.,Ltd\n1C:A7:70\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\n1C:A8:52\t\tSensaio Pte Ltd\n1C:AA:07\t\tCisco Systems, Inc\n1C:AB:01\t\tInnovolt\n1C:AB:34\t\tNew H3C Technologies Co., Ltd\n1C:AB:48\t\tTecno Mobile Limited\n1C:AB:A7\t\tApple, Inc.\n1C:AB:C0\t\tHitron Technologies. Inc\n1C:AD:D1\t\tBosung Electronics Co., Ltd.\n1C:AE:3E\t\tIEEE Registration Authority\n1C:AE:3E:00:00:00/28\tDao Qin Technology Co.Ltd.\n1C:AE:3E:10:00:00/28\tIPROAD,Inc\n1C:AE:3E:20:00:00/28\tLinkwise Technologies Co., Limited\n1C:AE:3E:30:00:00/28\tHagerEnergy GmbH\n1C:AE:3E:40:00:00/28\tP.H.U. Metering Anna Moder\n1C:AE:3E:50:00:00/28\tNetvio Ltd\n1C:AE:3E:60:00:00/28\tAnnapurna labs\n1C:AE:3E:70:00:00/28\tNextDrive Co.\n1C:AE:3E:80:00:00/28\tJingQi(tianjin) technology Co., Ltd\n1C:AE:3E:90:00:00/28\tChina Convert Technology Co., Ltd.\n1C:AE:3E:A0:00:00/28\tBeijing SuperCloud Technology Co., Ltd.\n1C:AE:3E:B0:00:00/28\tBeijing Boyan-rd Technology Development CO.,LTD\n1C:AE:3E:C0:00:00/28\tQuEST Rail LLC\n1C:AE:3E:D0:00:00/28\tForme\n1C:AE:3E:E0:00:00/28\tBroachlink Technology Co.,Limited\n1C:AE:CB\t\tHuawei Technologies Co.,Ltd\n1C:AF:05\t\tSamsung Electronics Co.,Ltd\n1C:AF:4A\t\tSamsung Electronics Co.,Ltd\n1C:AF:F7\t\tD-Link International\n1C:B0:44\t\tAskey Computer Corp\n1C:B0:94\t\tHTC Corporation\n1C:B1:7F\t\tNEC Platforms, Ltd.\n1C:B2:43\t\tTdc A/S\n1C:B3:C9\t\tApple, Inc.\n1C:B3:E9\t\tShenzhen Zhongke United Communication Technology\n1C:B4:6C\t\tHuawei Technologies Co.,Ltd\n1C:B7:2C\t\tASUSTek COMPUTER INC.\n1C:B7:96\t\tHuawei Technologies Co.,Ltd\n1C:B8:57\t\tBecon Technologies Co,.Ltd.\n1C:B8:BA\t\tXiamen Leelen Technology Co., Ltd\n1C:B9:C4\t\tRuckus Wireless\n1C:BA:8C\t\tTexas Instruments\n1C:BB:A8\t\tOJSC \"Ufimskiy Zavod \"Promsvyaz\"\n1C:BC:EC\t\tsilex technology, Inc.\n1C:BD:0E\t\tAmplified Engineering Pty Ltd\n1C:BD:B9\t\tD-Link International\n1C:BF:C0\t\tChongqing Fugui Electronics Co.,Ltd.\n1C:BF:CE\t\tShenzhen Century Xinyang Technology Co., Ltd\n1C:C0:35\t\tPlanex Communications Inc.\n1C:C0:89\t\tSilicon Laboratories\n1C:C0:E1\t\tIEEE Registration Authority\n1C:C0:E1:00:00:00/28\tShenzhen Highsharp Electronics Ltd.\n1C:C0:E1:10:00:00/28\tHangzhou Kaierda Electric Welding Machine Co.,Ltd\n1C:C0:E1:20:00:00/28\tAbbott Medical Optics Inc.\n1C:C0:E1:30:00:00/28\tHangzhou Softel Optic Co., Ltd\n1C:C0:E1:40:00:00/28\tVideri Inc.\n1C:C0:E1:50:00:00/28\tKids Wireless Inc\n1C:C0:E1:60:00:00/28\tMonument Labs, Inc.\n1C:C0:E1:70:00:00/28\tShenzhen Kinstone D&T Develop Co.,Ltd\n1C:C0:E1:80:00:00/28\tLX Corporation Pty Ltd\n1C:C0:E1:90:00:00/28\tOspicon Company Limited\n1C:C0:E1:A0:00:00/28\tSecheron Sa\n1C:C0:E1:B0:00:00/28\tExigent Sensors\n1C:C0:E1:C0:00:00/28\tNitto Seiko\n1C:C0:E1:D0:00:00/28\tNewLand (NZ) Communication Tech Limited\n1C:C0:E1:E0:00:00/28\tYun Yang Fire Safety Equipment Co.,Ltd.\n1C:C1:0C\t\tIntel Corporate\n1C:C1:1A\t\tWavetronix\n1C:C1:BC\t\tYichip Microelectronics (Hangzhou) Co.,Ltd\n1C:C1:DE\t\tHewlett Packard\n1C:C3:16\t\tXiamen Milesight IoT Co., Ltd.\n1C:C3:EB\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n1C:C5:86\t\tAbsolute Acoustics\n1C:C6:3C\t\tArcadyan Technology Corporation\n1C:C7:2D\t\tShenzhen Huapu Digital CO.,Ltd\n1C:C8:C1\t\tHongKong YiTong Technology Ltd.\n1C:C9:92\t\tHonor Device Co., Ltd.\n1C:CA:41\t\tAo\n1C:CA:E3\t\tIEEE Registration Authority\n1C:CA:E3:00:00:00/28\tPrivate\n1C:CA:E3:10:00:00/28\tPga Electronic\n1C:CA:E3:20:00:00/28\tInsigma Inc\n1C:CA:E3:30:00:00/28\tShenzhen Smart Device Technology Co.,LTD\n1C:CA:E3:40:00:00/28\tSunray Medical Apparatus Co.,Ltd.\n1C:CA:E3:50:00:00/28\tTengFeng\n1C:CA:E3:60:00:00/28\tTokai Rika Co., Ltd.\n1C:CA:E3:70:00:00/28\tBird Home Automation GmbH\n1C:CA:E3:80:00:00/28\tOxySec S.r.l.\n1C:CA:E3:90:00:00/28\tShin-Yosha Corporation\n1C:CA:E3:A0:00:00/28\tSirea\n1C:CA:E3:B0:00:00/28\tDream Visions Co., LTD\n1C:CA:E3:C0:00:00/28\tGahdeung Elecom\n1C:CA:E3:D0:00:00/28\teSight Corporation\n1C:CA:E3:E0:00:00/28\tDabi Atlante S/A Industrias Medico Odontológicas\n1C:CA:E3:F0:00:00/28\tPrivate\n1C:CB:99\t\tTCT mobile ltd\n1C:CC:D6\t\tXiaomi Communications Co Ltd\n1C:CD:E5\t\tShanghai Wind Technologies Co.,Ltd\n1C:CE:51\t\tAzureWave Technology Inc.\n1C:D1:07\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n1C:D1:BA\t\tFiberhome Telecommunication Technologies Co.,LTD\n1C:D1:D7\t\tHangzhou BroadLink Technology Co., Ltd\n1C:D1:E0\t\tCisco Systems, Inc\n1C:D3:AF\t\tLG Innotek\n1C:D4:0C\t\tKriwan Industrie-Elektronik GmbH\n1C:D5:E2\t\tShenzhen YOUHUA Technology Co., Ltd\n1C:D6:BD\t\tLeedarson Lighting Co., Ltd.\n1C:D6:BE\t\tWistron Neweb Corporation\n1C:DA:27\t\tvivo Mobile Communication Co., Ltd.\n1C:DD:EA\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n1C:DE:57\t\tFiberhome Telecommunication Technologies Co.,LTD\n1C:DE:A7\t\tCisco Systems, Inc\n1C:DF:0F\t\tCisco Systems, Inc\n1C:DF:52\t\tTexas Instruments\n1C:E1:65\t\tMarshal Corporation\n1C:E1:92\t\tQisda Corporation\n1C:E2:09\t\tApple, Inc.\n1C:E2:CC\t\tTexas Instruments\n1C:E5:04\t\tHuawei Technologies Co.,Ltd\n1C:E5:7F\t\tSamsung Electronics Co.,Ltd\n1C:E6:1D\t\tSamsung Electronics Co.,Ltd\n1C:E6:2B\t\tApple, Inc.\n1C:E6:39\t\tHuawei Technologies Co.,Ltd\n1C:E6:AD\t\tHuawei Device Co., Ltd.\n1C:E6:C7\t\tCisco Systems, Inc\n1C:E8:5D\t\tCisco Systems, Inc\n1C:E8:9E\t\tSjit\n1C:EA:0B\t\tEdgecore Networks Corporation\n1C:EA:1B\t\tNokia\n1C:EA:AC\t\tBeijing Xiaomi Mobile Software Co., Ltd\n1C:EC:72\t\tAllradio Co., Ltd\n1C:ED:6F\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n1C:EE:C9\t\tElo touch solutions\n1C:EE:E8\t\tIlshin Elecom\n1C:EF:03\t\tGuangzhou V-SOLUTION Electronic Technology Co., Ltd.\n1C:EF:CE\t\tbebro electronic GmbH\n1C:F0:3E\t\tWearhaus Inc.\n1C:F0:61\t\tSCAPS GmbH\n1C:F2:9A\t\tGoogle, Inc.\n1C:F4:2B\t\tHuawei Device Co., Ltd.\n1C:F4:3F\t\tArcadyan Corporation\n1C:F4:CA\t\tPrivate\n1C:F5:E7\t\tTurtle Industry Co., Ltd.\n1C:F6:4C\t\tApple, Inc.\n1C:F8:D0\t\tSamsung Electronics Co.,Ltd\n1C:F9:D5\t\tApple, Inc.\n1C:FA:68\t\tTp-Link Technologies Co.,Ltd.\n1C:FC:17\t\tCisco Systems, Inc\n1C:FC:2A\t\tHuawei Technologies Co.,Ltd\n1C:FC:BB\t\tRealfiction ApS\n1C:FD:08\t\tIEEE Registration Authority\n1C:FD:08:00:00:00/28\tInSeat Solutions, LLC\n1C:FD:08:10:00:00/28\tShenzhen SEWO Technology Co.,Ltd.\n1C:FD:08:20:00:00/28\tHiHi Ltd\n1C:FD:08:30:00:00/28\tUmeox Innovations Co.,Ltd\n1C:FD:08:40:00:00/28\tSABIK Offshore GmbH\n1C:FD:08:50:00:00/28\tBeijing Hengxin Rainbow Information Technology Co.,Ltd\n1C:FD:08:60:00:00/28\tA&B Technology\n1C:FD:08:70:00:00/28\tsunweit industrial limited\n1C:FD:08:80:00:00/28\tShenZhen DeLippo Technology Co., LTD\n1C:FD:08:90:00:00/28\tCobham Slip Rings\n1C:FD:08:A0:00:00/28\tBanmak Technogies Co.,Ltd\n1C:FD:08:B0:00:00/28\tguangzhou huiqun intelligent technology co. LTD\n1C:FD:08:C0:00:00/28\tShanghai YottaTech Co Ltd (上海尧它科技有限公司）\n1C:FD:08:D0:00:00/28\tTianjin Keyvia Electric Co.,Ltd\n1C:FD:08:E0:00:00/28\tMeshbox Foundation Pte. Ltd.\n1C:FE:2B\t\tAmazon Technologies Inc.\n1C:FE:A7\t\tIDentytech Solutins Ltd.\n1C:FF:59\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n1C:FF:AD\t\tHuawei Technologies Co.,Ltd\n20:01:4F\t\tLinea Research Ltd\n20:01:9C\t\tBigleaf Networks Inc.\n20:02:AF\t\tMurata Manufacturing Co., Ltd.\n20:02:C9\t\tZhejiang Huayi IOT Technology Co.,Ltd\n20:02:FE\t\tHangzhou Dangbei Network Technology Co., Ltd\n20:04:0F\t\tDell Inc.\n20:04:84\t\tApple, Inc.\n20:04:F3\t\tHonor Device Co., Ltd.\n20:05:05\t\tRadmax Communication Private Limited\n20:05:B6\t\tOpenWrt\n20:05:E8\t\tOOO InProMedia\n20:08:89\t\tzte corporation\n20:08:ED\t\tHuawei Technologies Co.,Ltd\n20:0A:0D\t\tIEEE Registration Authority\n20:0A:0D:00:00:00/28\thalstrup-walcher GmbH\n20:0A:0D:10:00:00/28\tWideband Systems, Inc.\n20:0A:0D:20:00:00/28\tNetinovo Technologies(Shenzhen) Ltd\n20:0A:0D:30:00:00/28\tClearly IP Inc\n20:0A:0D:40:00:00/28\tVirtium\n20:0A:0D:50:00:00/28\tShenzhen Zhangyue Technology Co.,Ltd\n20:0A:0D:60:00:00/28\tAustin Hughes Electronics Ltd.\n20:0A:0D:70:00:00/28\tTecnint HTE SRL\n20:0A:0D:80:00:00/28\tbcheck NV\n20:0A:0D:90:00:00/28\tWelzek (Beijing) Technologies  Co, Ltd\n20:0A:0D:A0:00:00/28\tIrsap\n20:0A:0D:B0:00:00/28\tAmazon Technologies Inc.\n20:0A:0D:C0:00:00/28\tsehwa\n20:0A:0D:D0:00:00/28\tBently & EL  Co. Ltd.\n20:0A:0D:E0:00:00/28\tHANGZHOU DANGBEI NETWORK TECH.Co.,Ltd\n20:0A:5E\t\tXiangshan Giant Eagle Technology Developing Co., Ltd.\n20:0B:16\t\tTexas Instruments\n20:0B:74\t\tAzureWave Technology Inc.\n20:0B:C5\t\tCisco Systems, Inc\n20:0B:C7\t\tHuawei Technologies Co.,Ltd\n20:0B:CF\t\tNintendo Co.,Ltd\n20:0C:86\t\tGX India Pvt Ltd\n20:0C:C8\t\tNetgear\n20:0D:B0\t\tShenzhen Four Seas Global Link Network Technology Co., Ltd.\n20:0E:2B\t\tApple, Inc.\n20:0E:95\t\tIec – Tc9 Wg43\n20:0F:70\t\tFoxtech\n20:0F:92\t\tSTK Technology Co., Ltd.\n20:10:7A\t\tGemtek Technology Co., Ltd.\n20:10:8A\t\tzte corporation\n20:10:B1\t\tAmazon Technologies Inc.\n20:11:4E\t\tMeteRSit S.R.L.\n20:12:57\t\tMost Lucky Trading Ltd\n20:12:D5\t\tScientech Materials Corporation\n20:13:E0\t\tSamsung Electronics Co.,Ltd\n20:14:C4\t\tHuawei Technologies Co.,Ltd\n20:15:82\t\tApple, Inc.\n20:15:DE\t\tSamsung Electronics Co.,Ltd\n20:16:3D\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n20:16:42\t\tMicrosoft Corporation\n20:16:B9\t\tIntel Corporate\n20:16:D8\t\tLiteon Technology Corporation\n20:17:42\t\tLG Electronics\n20:17:46\t\tParadromics, Inc.\n20:18:0E\t\tShenzhen Sunchip Technology Co., Ltd\n20:18:5B\t\tShenzhen Jingxun Technology Co., Ltd.\n20:19:F3\t\tWavTek Technologies, Inc\n20:1A:06\t\tCompal Information (Kunshan) Co., Ltd.\n20:1A:94\t\tApple, Inc.\n20:1B:88\t\tDongguan Liesheng Electronic Co., Ltd.\n20:1B:A5\t\tVizio, Inc\n20:1B:C9\t\tJuniper Networks\n20:1C:3A\t\tNintendo Co.,Ltd\n20:1D:03\t\tElatec GmbH\n20:1E:1D\t\tHuawei Technologies Co.,Ltd\n20:1E:88\t\tIntel Corporate\n20:1F:31\t\tInteno Broadband Technology AB\n20:1F:3B\t\tGoogle, Inc.\n20:1F:54\t\tRaisecom Technology CO., LTD\n20:20:27\t\tShenzhen Sundray Technologies company Limited\n20:20:51\t\tzte corporation\n20:21:41\t\tUniversal Electronics BV\n20:21:A5\t\tLG Electronics (Mobile Communications)\n20:23:51\t\tTP-Link Systems Inc\n20:25:64\t\tPegatron Corporation\n20:25:98\t\tTeleview\n20:25:CC\t\tXiaomi Communications Co Ltd\n20:25:D2\t\tFiberhome Telecommunication Technologies Co.,LTD\n20:26:81\t\tTecno Mobile Limited\n20:28:3E\t\tHuawei Technologies Co.,Ltd\n20:28:BC\t\tVisionscape Co,. Ltd.\n20:29:B9\t\tIkotek technology SH Co., Ltd\n20:2A:C5\t\tPetite-En\n20:2B:20\t\tCloud Network Technology Singapore Pte. Ltd.\n20:2B:C1\t\tHuawei Technologies Co.,Ltd\n20:2C:B7\t\tKong Yue Electronics & Information Industry (Xinhui) Ltd.\n20:2D:07\t\tSamsung Electronics Co.,Ltd\n20:2D:23\t\tCollinear Networks Inc.\n20:2D:F6\t\tApple, Inc.\n20:2D:F8\t\tDigital Media Cartridge Ltd.\n20:31:1C\t\tvivo Mobile Communication Co., Ltd.\n20:31:8D\t\tGiax GmbH\n20:31:EB\t\tHdsn\n20:32:33\t\tShenzhen Bilian Electronic Co.，Ltd\n20:32:6C\t\tSamsung Electronics Co.,Ltd\n20:32:C6\t\tApple, Inc.\n20:34:62\t\tXiaomi Communications Co Ltd\n20:34:FB\t\tXiaomi Communications Co Ltd\n20:35:43\t\tSagemcom Broadband SAS\n20:36:26\t\tTP-Link Systems Inc\n20:36:5B\t\tMegafone Limited\n20:36:D7\t\tShanghai Reacheng  Communication Technology Co.,Ltd\n20:37:06\t\tCisco Systems, Inc\n20:37:A5\t\tApple, Inc.\n20:37:BC\t\tKuipers Electronic Engineering BV\n20:37:F0\t\tArcadyan Corporation\n20:39:56\t\tHMD Global Oy\n20:3A:07\t\tCisco Systems, Inc\n20:3A:0C\t\teero inc.\n20:3A:43\t\tIntel Corporate\n20:3A:EB\t\tzte corporation\n20:3A:EF\t\tSivantos GmbH\n20:3B:34\t\tXiaomi Communications Co Ltd\n20:3B:67\t\tSamsung Electronics Co.,Ltd\n20:3B:69\t\tvivo Mobile Communication Co., Ltd.\n20:3C:AE\t\tApple, Inc.\n20:3C:C0\t\tBeijing Tosee Technology Co., Ltd.\n20:3D:66\t\tCommscope\n20:3D:B2\t\tHuawei Technologies Co.,Ltd\n20:3D:BD\t\tLG Innotek\n20:40:05\t\tfeno GmbH\n20:40:6A\t\tAMPAK Technology,Inc.\n20:41:5A\t\tSmarteh d.o.o.\n20:41:81\t\tESYSE GmbH Embedded Systems Engineering\n20:43:A8\t\tEspressif Inc.\n20:44:3A\t\tSchneider Electric Asia Pacific Ltd\n20:44:41\t\tRemote Solution\n20:45:69\t\tItel Mobile Limited\n20:46:A1\t\tVECOW Co., Ltd\n20:46:F9\t\tAdvanced Network Devices (dba:AND)\n20:47:47\t\tDell Inc.\n20:47:B5\t\tSagemcom Broadband SAS\n20:47:DA\t\tXiaomi Communications Co Ltd\n20:47:ED\t\tSky Uk Limited\n20:4A:AA\t\tHanscan Spain S.A.\n20:4B:22\t\tSunnovo International Limited\n20:4C:03\t\tHewlett Packard Enterprise\n20:4C:6D\t\tHugo Brennenstuhl Gmbh & Co. KG.\n20:4C:9E\t\tCisco Systems, Inc\n20:4D:52\t\tMellanox Technologies, Inc.\n20:4E:6B\t\tAxxana(israel) ltd\n20:4E:71\t\tJuniper Networks\n20:4E:7F\t\tNetgear\n20:4E:F6\t\tAzureWave Technology Inc.\n20:50:0F\t\tFiber Groep B.V.\n20:50:E7\t\tAMPAK Technology,Inc.\n20:51:F5\t\tEarda Technologies co Ltd\n20:53:83\t\tHuawei Technologies Co.,Ltd\n20:53:8D\t\tHon Hai Precision Industry Co., Ltd.\n20:53:CA\t\tRisk Technology Ltd\n20:54:76\t\tSony Corporation\n20:54:FA\t\tHuawei Technologies Co.,Ltd\n20:55:31\t\tSamsung Electronics Co.,Ltd\n20:55:32\t\tGotech International Technology Limited\n20:57:21\t\tSalix Technology CO., Ltd.\n20:57:9E\t\tHunan Fn-Link Technology Limited\n20:57:AF\t\tShenzhen FH-NET OPTOELECTRONICS CO.,LTD\n20:58:69\t\tRuckus Wireless\n20:59:A0\t\tParagon Technologies Inc.\n20:5A:00\t\tCoval\n20:5A:1D\t\tzte corporation\n20:5A:8F\t\tShenzhen Hikeen Technology Co.,LTD\n20:5B:2A\t\tPrivate\n20:5B:5E\t\tShenzhen Wonhe Technology Co., Ltd\n20:5C:FA\t\tYangzhou ChangLian Network Technology Co,ltd.\n20:5D:0D\t\tFiberhome Telecommunication Technologies Co.,LTD\n20:5D:47\t\tvivo Mobile Communication Co., Ltd.\n20:5E:64\t\tHuawei Device Co., Ltd.\n20:5E:97\t\tNokia\n20:5E:F7\t\tSamsung Electronics Co.,Ltd\n20:5F:3D\t\tAdtran Inc\n20:62:74\t\tMicrosoft Corporation\n20:62:96\t\tShenzhen Malio Technology Co.,Ltd\n20:63:5F\t\tAbeeway\n20:64:32\t\tSamsung Electro Mechanics Co., Ltd.\n20:64:CB\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n20:64:DE\t\tSunitec Enterprise Co.,Ltd\n20:65:8E\t\tHuawei Technologies Co.,Ltd\n20:66:CF\t\tFreebox Sas\n20:66:FD\t\tConstell8 Nv\n20:67:7C\t\tHewlett Packard Enterprise\n20:67:B1\t\tPluto inc.\n20:67:E0\t\tShenzhen iComm Semiconductor CO.,LTD\n20:68:9D\t\tLiteon Technology Corporation\n20:69:80\t\tApple, Inc.\n20:6A:8A\t\tWistron Infocomm (Zhongshan) Corporation\n20:6A:94\t\tHitron Technologies. Inc\n20:6A:FF\t\tAtlas Elektronik UK Limited\n20:6B:D5\t\tvivo Mobile Communication Co., Ltd.\n20:6B:E7\t\tTp-Link Technologies Co.,Ltd.\n20:6B:F4\t\tHuawei Device Co., Ltd.\n20:6C:8A\t\tExtreme Networks Headquarters\n20:6D:31\t\tFirewalla Inc\n20:6E:9C\t\tSamsung Electronics Co.,Ltd\n20:6E:F1\t\tEspressif Inc.\n20:6F:EC\t\tBraemac CA LLC\n20:71:9E\t\tSF Technology Co.,Ltd\n20:72:A9\t\tBeijing Xiaomi Electronics Co.,Ltd\n20:73:55\t\tCommscope\n20:74:54\t\tvivo Mobile Communication Co., Ltd.\n20:74:CF\t\tShenzhen Voxtech Co.,Ltd\n20:76:00\t\tActiontec Electronics, Inc\n20:76:8F\t\tApple, Inc.\n20:76:93\t\tLenovo (Beijing) Limited.\n20:77:59\t\tOptical Network Video Technologies (Shenzhen) Co., Ltd.\n20:78:0B\t\tDelta Faucet Company\n20:78:52\t\tNokia Solutions and Networks GmbH & Co. KG\n20:78:CD\t\tApple, Inc.\n20:78:F0\t\tApple, Inc.\n20:79:18\t\tIntel Corporate\n20:7B:D2\t\tASIX Electronics Corporation\n20:7C:14\t\tQotom\n20:7C:8F\t\tQuanta Microsystems,Inc.\n20:7D:74\t\tApple, Inc.\n20:80:58\t\tCiena Corporation\n20:80:97\t\tShenzhen OXO Technology limited\n20:82:6A\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n20:82:C0\t\tXiaomi Communications Co Ltd\n20:83:F8\t\tAdvanced Digital Broadcast SA\n20:84:F5\t\tYufei Innovation Software(Shenzhen) Co., Ltd.\n20:85:8C\t\tAssa\n20:85:93\t\tIEEE Registration Authority\n20:85:93:00:00:00/28\tHemina Spa\n20:85:93:10:00:00/28\tNetworking Services Corp\n20:85:93:20:00:00/28\tMid Continent Controls, Inc.\n20:85:93:30:00:00/28\tUnilumin Group Co.,Ltd\n20:85:93:40:00:00/28\tKloudspot Inc\n20:85:93:50:00:00/28\tWave-In Communication\n20:85:93:60:00:00/28\tEilersen Electric A/S\n20:85:93:70:00:00/28\tGreat Lite International\n20:85:93:80:00:00/28\tAasset Security\n20:85:93:90:00:00/28\tMastodon Design\n20:85:93:A0:00:00/28\tH3 Industries, Inc.\n20:85:93:B0:00:00/28\tIOG Products LLC\n20:85:93:C0:00:00/28\tRegloplas AG\n20:85:93:D0:00:00/28\tShanghai Kenmyond Industrial Network Equipment Co.,Ltd\n20:85:93:E0:00:00/28\tDynaudio\n20:87:56\t\tSiemens Ag\n20:87:AC\t\tAES motomation\n20:87:EC\t\tHuawei Technologies Co.,Ltd\n20:88:10\t\tDell Inc.\n20:89:6F\t\tFiberhome Telecommunication Technologies Co.,LTD\n20:89:84\t\tCompal Information (Kunshan) Co., Ltd.\n20:89:86\t\tzte corporation\n20:89:8A\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n20:8B:37\t\tSkyworth Digital Technology(Shenzhen) Co.,Ltd\n20:8B:D1\t\tNXP Semiconductor (Tianjin) LTD.\n20:8C:47\t\tTenstorrent Inc\n20:8C:86\t\tHuawei Technologies Co.,Ltd\n20:90:6F\t\tShenzhen Tencent Computer System Co., Ltd.\n20:91:48\t\tTexas Instruments\n20:91:8A\t\tProfalux\n20:91:D9\t\tI'M Spa\n20:91:DF\t\tApple, Inc.\n20:93:39\t\tJuniper Networks\n20:93:4D\t\tFujian Star-Net Communication Co.,Ltd\n20:96:8A\t\tChina Mobile (Hangzhou) Information Technology Co., Ltd.\n20:97:27\t\tTeltonika Networks Uab\n20:98:D8\t\tShenzhen Yingdakang Technology CO., LTD\n20:98:ED\t\tAltoBeam Inc.\n20:99:52\t\tXiaomi Communications Co Ltd\n20:9A:7D\t\tSagemcom Broadband SAS\n20:9A:E9\t\tVolacomm Co., Ltd\n20:9B:A5\t\tJIAXING GLEAD Electronics Co.,Ltd\n20:9B:CD\t\tApple, Inc.\n20:9B:E6\t\tGuangzhou Shiyuan Electronic Technology Company Limited\n20:9C:B4\t\tHewlett Packard Enterprise\n20:9E:79\t\tUniversal Electronics, Inc.\n20:9E:F7\t\tExtreme Networks Headquarters\n20:A1:71\t\tAmazon Technologies Inc.\n20:A2:00\t\tHuawei Technologies Co.,Ltd\n20:A2:E4\t\tApple, Inc.\n20:A2:E7\t\tLee-Dickens Ltd\n20:A5:CB\t\tApple, Inc.\n20:A6:0C\t\tXiaomi Communications Co Ltd\n20:A6:80\t\tHuawei Technologies Co.,Ltd\n20:A6:CD\t\tHewlett Packard Enterprise\n20:A7:16\t\tSilicon Laboratories\n20:A7:66\t\tHuawei Technologies Co.,Ltd\n20:A7:83\t\tmiControl GmbH\n20:A7:87\t\tBointec Taiwan Corporation Limited\n20:A7:F9\t\tShenzhen Olanboa Technology Co., Ltd\n20:A8:B9\t\tSiemens Ag\n20:A8:BF\t\tHuawei Technologies Co.,Ltd\n20:A9:0E\t\tTCT mobile ltd\n20:A9:9B\t\tMicrosoft Corporation\n20:AA:25\t\tIp-Net Llc\n20:AA:4B\t\tCisco-Linksys, LLC\n20:AB:37\t\tApple, Inc.\n20:AB:48\t\tHuawei Technologies Co.,Ltd\n20:AC:9C\t\tChina Telecom Corporation Limited\n20:AD:56\t\tContinental Automotive Systems Inc.\n20:AF:1B\t\tSteelSeries ApS\n20:B0:01\t\tTechnicolor Delivery Technologies Belgium NV\n20:B0:F7\t\tEnclustra GmbH\n20:B3:99\t\tEnterasys\n20:B5:C6\t\tMimosa Networks\n20:B7:30\t\tTeconGroup, Inc\n20:B7:80\t\tToshiba Visual Solutions Corporation Co.,Ltd\n20:B7:C0\t\tOMICRON electronics GmbH\n20:B8:2B\t\tSagemcom Broadband SAS\n20:B8:68\t\tMotorola Mobility LLC, a Lenovo Company\n20:BA:36\t\tu-blox AG\n20:BB:76\t\tCOL GIOVANNI PAOLO SpA\n20:BB:BC\t\tHangzhou Ezviz Software Co.,Ltd.\n20:BB:C0\t\tCisco Systems, Inc\n20:BB:C6\t\tJabil Circuit Hungary Ltd.\n20:BD:1D\t\tIntel Corporate\n20:BE:B4\t\tHisense broadband multimedia technology Co.,Ltd\n20:BE:B8\t\tAmazon Technologies Inc.\n20:BE:CD\t\teero inc.\n20:BF:DB\t\tDvl\n20:C0:47\t\tVerizon\n20:C0:6D\t\tShenzhen Spacetek Technology Co.,Ltd\n20:C1:9B\t\tIntel Corporate\n20:C1:AF\t\ti Wit Digital Co., Limited\n20:C2:B0\t\tHuawei Technologies Co.,Ltd\n20:C3:8F\t\tTexas Instruments\n20:C3:A4\t\tRetailNext\n20:C6:0D\t\tShanghai annijie Information technology Co.,LTD\n20:C6:EB\t\tPanasonic Corporation AVC Networks Company\n20:C7:4F\t\tSensorPush\n20:C7:92\t\tWuhan Maiwe communication Co.,Ltd\n20:C8:B3\t\tShenzhen Bul-Tech Co.,Ltd.\n20:C9:D0\t\tApple, Inc.\n20:CC:27\t\tCisco Systems, Inc\n20:CD:39\t\tTexas Instruments\n20:CD:6E\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n20:CE:2A\t\tIEEE Registration Authority\n20:CE:2A:00:00:00/28\tAnnapurna labs\n20:CE:2A:10:00:00/28\tShanghai Digicube Info&Tech Co.,Ltd.\n20:CE:2A:20:00:00/28\tJabil\n20:CE:2A:30:00:00/28\tCuculus GmbH\n20:CE:2A:40:00:00/28\tAnnapurna labs\n20:CE:2A:50:00:00/28\tZaber Technologies Inc.\n20:CE:2A:60:00:00/28\tRadarxense BV\n20:CE:2A:70:00:00/28\tBeijing Huadianzhongxin Tech.Co.,Ltd\n20:CE:2A:80:00:00/28\tIntelligraphics\n20:CE:2A:90:00:00/28\tRugged Monitoring\n20:CE:2A:A0:00:00/28\tMeshPlusPlus, Inc.\n20:CE:2A:B0:00:00/28\tSwarovski Optik KG\n20:CE:2A:C0:00:00/28\tAriston Thermo s.p.a.\n20:CE:2A:D0:00:00/28\tLauda Dr R Wobser Gmbh & Co Kg\n20:CE:2A:E0:00:00/28\tFunkwerk Systems GmbH\n20:CE:C4\t\tPeraso Technologies\n20:CF:30\t\tASUSTek COMPUTER INC.\n20:CF:AE\t\tCisco Systems, Inc\n20:D1:60\t\tPrivate\n20:D2:1F\t\tWincal Technology Corp.\n20:D2:5F\t\tSmartCap Technologies\n20:D2:76\t\tItel Mobile Limited\n20:D3:90\t\tSamsung Electronics Co.,Ltd\n20:D5:AB\t\tKorea Infocom Co.,Ltd.\n20:D5:BF\t\tSamsung Electronics Co.,Ltd\n20:D6:07\t\tNokia Corporation\n20:D7:5A\t\tPosh Mobile Limited\n20:D7:78\t\tTexas Instruments\n20:D8:0B\t\tJuniper Networks\n20:D9:06\t\tIota, Inc.\n20:DA:22\t\tHuawei Technologies Co.,Ltd\n20:DB:AB\t\tSamsung Electronics Co., Ltd.\n20:DB:EA\t\tCisco Systems, Inc\n20:DC:93\t\tCheetah Hi-Tech, Inc.\n20:DC:E6\t\tTp-Link Technologies Co.,Ltd.\n20:DC:FD\t\tHuawei Device Co., Ltd.\n20:DE:1E\t\tNokia\n20:DE:88\t\tIC Realtime LLC\n20:DF:3F\t\tNanjing SAC Power Grid Automation Co., Ltd.\n20:DF:73\t\tHuawei Technologies Co.,Ltd\n20:DF:B9\t\tGoogle, Inc.\n20:E0:9C\t\tNokia\n20:E2:A8\t\tApple, Inc.\n20:E4:07\t\tSpark srl\n20:E4:6F\t\tvivo Mobile Communication Co., Ltd.\n20:E5:2A\t\tNetgear\n20:E5:64\t\tCommscope\n20:E6:DF\t\teero inc.\n20:E7:91\t\tSiemens Healthcare Diagnostics, Inc\n20:E7:B6\t\tUniversal Electronics, Inc.\n20:E7:C8\t\tEspressif Inc.\n20:E8:74\t\tApple, Inc.\n20:E8:82\t\tzte corporation\n20:EA:C7\t\tShenzhen Riopine Electronics Co., Ltd\n20:ED:47\t\tJuniper Networks\n20:ED:74\t\tAbility enterprise co.,Ltd.\n20:EE:28\t\tApple, Inc.\n20:EE:C6\t\tElefirst Science & Tech Co ., ltd\n20:EF:BD\t\tRoku, Inc\n20:F0:02\t\tMTData Developments Pty. Ltd.\n20:F0:94\t\tGoogle, Inc.\n20:F1:20\t\tCisco Systems, Inc\n20:F1:7C\t\tHuawei Technologies Co.,Ltd\n20:F1:9E\t\tCommscope\n20:F3:07\t\tzte corporation\n20:F3:75\t\tCommscope\n20:F3:A3\t\tHuawei Technologies Co.,Ltd\n20:F4:1B\t\tShenzhen Bilian electronic CO.,LTD\n20:F4:4F\t\tNokia\n20:F4:52\t\tShanghai IUV Software Development Co. Ltd\n20:F4:78\t\tXiaomi Communications Co Ltd\n20:F4:D4\t\tApple, Inc.\n20:F5:10\t\tCodex Digital Limited\n20:F5:43\t\tHui Zhou Gaoshengda Technology Co.,LTD\n20:F5:97\t\tMaasiv, LLC\n20:F7:7C\t\tvivo Mobile Communication Co., Ltd.\n20:F8:3B\t\tNabu Casa, Inc.\n20:F8:5E\t\tDelta Electronics\n20:FA:85\t\tApple, Inc.\n20:FA:BB\t\tCambridge Executive Limited\n20:FA:DB\t\tHuahao Kunpeng Technology (chengDu)  Co.,Ltd.\n20:FD:F1\t\t3Com Europe Ltd\n20:FE:00\t\tAmazon Technologies Inc.\n20:FE:CD\t\tSystem In Frontier Inc.\n20:FE:DB\t\tM2M Solution S.A.S.\n20:FF:36\t\tIflytek Co.,Ltd.\n24:00:BA\t\tHuawei Technologies Co.,Ltd\n24:00:FA\t\tChina Mobile (Hangzhou) Information Technology Co., Ltd\n24:01:6F\t\tHuawei Device Co., Ltd.\n24:01:C7\t\tCisco Systems, Inc\n24:04:62\t\tSiemens Energy Global GmbH & Co.KG - GT PRM\n24:05:0F\t\tMTN Electronic Co. Ltd\n24:05:88\t\tGoogle, Inc.\n24:05:F5\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n24:06:AA\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n24:06:F2\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n24:08:5D\t\tContinental Aftermarket & Services GmbH\n24:09:17\t\tDevlin Electronics Limited\n24:09:35\t\tSamsung Electronics Co.,Ltd\n24:09:95\t\tHuawei Technologies Co.,Ltd\n24:0A:11\t\tTCT mobile ltd\n24:0A:3F\t\tSamsung Electronics Co.,Ltd\n24:0A:63\t\tCommscope\n24:0A:64\t\tAzureWave Technology Inc.\n24:0A:C4\t\tEspressif Inc.\n24:0B:0A\t\tPalo Alto Networks\n24:0B:2A\t\tViettel Group\n24:0B:88\t\tTaicang T&W Electronics\n24:0B:B1\t\tKOSTAL Industrie Elektrik GmbH\n24:0D:65\t\tShenzhen Vsun Communication Technology Co., Ltd.\n24:0D:6C\t\tSmnd\n24:0D:C2\t\tTCT mobile ltd\n24:0F:5E\t\tShenzhen z-router Technology Co., Ltd\n24:0F:9B\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n24:10:64\t\tShenzhen Ecsino Tecnical Co. Ltd\n24:11:25\t\tHutek Co., Ltd.\n24:11:45\t\tXiaomi Communications Co Ltd\n24:11:48\t\tEntropix, LLC\n24:11:53\t\tSamsung Electronics Co.,Ltd\n24:11:D0\t\tChongqing Ehs Science and Technology Development Co.,Ltd.\n24:12:81\t\tChina Mobile Group Device Co.,Ltd.\n24:14:07\t\tXiamen Sigmastar Technology Ltd.\n24:15:10\t\tIEEE Registration Authority\n24:15:10:00:00:00/28\tSafetrust Inc\n24:15:10:10:00:00/28\tSMaBiT GmbH\n24:15:10:20:00:00/28\tNile Global Inc\n24:15:10:30:00:00/28\tKaiyun\n24:15:10:40:00:00/28\tAnnapurna labs\n24:15:10:50:00:00/28\tGanzhou Dehuida Technology Co., Ltd\n24:15:10:60:00:00/28\tShandong Kehui Power Automation Co. Ltd.\n24:15:10:70:00:00/28\tSuZhou A-rack Information Technology Co.,Ltd\n24:15:10:80:00:00/28\tMedicomp, Inc\n24:15:10:90:00:00/28\tTopgolf Sweden AB\n24:15:10:A0:00:00/28\tUnitronux(Shenzhen) Intelligence Technology Co.,Ltd\n24:15:10:B0:00:00/28\tTeknic, Inc.\n24:15:10:C0:00:00/28\tShenzhen Xtooltech Co., Ltd\n24:15:10:D0:00:00/28\tHelen of Troy\n24:15:10:E0:00:00/28\tSatellite Link Technology CO.,LTD\n24:15:51\t\tHuawei Device Co., Ltd.\n24:16:1B\t\tCisco Systems, Inc\n24:16:51\t\tChipsea Technologies (Shenzhen) Corp.\n24:16:6D\t\tHuawei Technologies Co.,Ltd\n24:16:9D\t\tCisco Systems, Inc\n24:18:1D\t\tSamsung Electro-Mechanics(Thailand)\n24:18:C0\t\tE. Wehrle GmbH\n24:18:C6\t\tHunan Fn-Link Technology Limited\n24:19:72\t\tQuectel Wireless Solutions Co.,Ltd.\n24:1A:8C\t\tSquarehead Technology AS\n24:1A:E6\t\tHuawei Device Co., Ltd.\n24:1B:13\t\tShanghai Nutshell Electronic Co., Ltd.\n24:1B:44\t\tHangzhou Tuners Electronics Co., Ltd\n24:1B:7A\t\tApple, Inc.\n24:1C:04\t\tShenzhen Jehe Technology Development Co., Ltd.\n24:1D:48\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n24:1E:2B\t\tZhejiang Cainiao Supply Chain Management Co., Ltd\n24:1E:EB\t\tApple, Inc.\n24:1F:2C\t\tCalsys, Inc.\n24:1F:A0\t\tHuawei Technologies Co.,Ltd\n24:1F:BD\t\tExtreme Networks Headquarters\n24:20:C7\t\tSagemcom Broadband SAS\n24:21:24\t\tNokia\n24:21:5E\t\tQuectel Wireless Solutions Co.,Ltd.\n24:21:AB\t\tSony Corporation\n24:23:61\t\tvivo Mobile Communication Co., Ltd.\n24:24:0E\t\tApple, Inc.\n24:24:B7\t\tSamsung Electronics Co.,Ltd\n24:26:42\t\tSHARP Corporation.\n24:26:BA\t\tShenzhen Toptel Technology Co., Ltd.\n24:26:D6\t\tHuawei Technologies Co.,Ltd\n24:27:30\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n24:27:E5\t\tHuawei Device Co., Ltd.\n24:28:56\t\tBeijing Gctech Technology Co.,LTD\n24:28:FD\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n24:29:34\t\tGoogle, Inc.\n24:29:B0\t\tHuawei Technologies Co.,Ltd\n24:29:FE\t\tKYOCERA Corporation\n24:2A:04\t\tCisco Systems, Inc\n24:2B:D6\t\tRing LLC\n24:2C:FE\t\tZhejiang Tmall Technology Co., Ltd.\n24:2D:4B\t\tF5 Inc.\n24:2D:6C\t\teero inc.\n24:2E:02\t\tHuawei Technologies Co.,Ltd\n24:2E:90\t\tPalit Microsystems, Ltd\n24:2F:D0\t\tTP-Link Systems Inc\n24:2F:FA\t\tToshiba Global Commerce Solutions\n24:30:F8\t\tHuawei Device Co., Ltd.\n24:31:54\t\tHuawei Technologies Co.,Ltd\n24:31:84\t\tSHARP Corporation\n24:32:AE\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n24:33:6C\t\tPrivate\n24:34:08\t\tEdgecore Americas Networking Corporation\n24:35:CC\t\tZhongshan Scinan Internet of Things Co.,Ltd.\n24:36:DA\t\tCisco Systems, Inc\n24:37:4C\t\tCisco SPVTG\n24:37:EF\t\tEMC Electronic Media Communication SA\n24:3A:82\t\tIrts\n24:3C:20\t\tDynamode Group\n24:3C:B0\t\tDongguan Mentech Optical & Magnetic Co., Ltd.\n24:3F:30\t\tOxygen Broadband s.a.\n24:3F:75\t\tHui Zhou Gaoshengda Technology Co.,LTD\n24:3F:AA\t\tHuawei Device Co., Ltd.\n24:40:AE\t\tNIIC Technology Co., Ltd.\n24:41:8C\t\tIntel Corporate\n24:41:FE\t\tWistron Neweb Corporation\n24:42:BC\t\tAlinco,incorporated\n24:42:E3\t\tShenzhen Ai-Thinker  Technology Co.,Ltd\n24:43:E2\t\tDASAN Network Solutions\n24:44:27\t\tHuawei Technologies Co.,Ltd\n24:45:6B\t\tHuawei Device Co., Ltd.\n24:45:97\t\tGEMUE Gebr. Mueller Apparatebau\n24:46:C8\t\tMotorola Mobility LLC, a Lenovo Company\n24:46:E4\t\tHuawei Technologies Co.,Ltd\n24:47:0E\t\tPentronicAB\n24:48:45\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n24:48:85\t\tHuawei Device Co., Ltd.\n24:49:7B\t\tInnovative Converged Devices Inc\n24:4B:03\t\tSamsung Electronics Co.,Ltd\n24:4B:81\t\tSamsung Electronics Co.,Ltd\n24:4B:F1\t\tHuawei Technologies Co.,Ltd\n24:4B:FE\t\tASUSTek COMPUTER INC.\n24:4C:07\t\tHuawei Technologies Co.,Ltd\n24:4C:AB\t\tEspressif Inc.\n24:4C:E3\t\tAmazon Technologies Inc.\n24:4E:7B\t\tIEEE Registration Authority\n24:4E:7B:00:00:00/28\tTekelek Europe Ltd\n24:4E:7B:10:00:00/28\tsonoscape\n24:4E:7B:20:00:00/28\tRcc Time Co .,Limited\n24:4E:7B:30:00:00/28\tShenzhen Ruixunyun Technology Co.,Ltd.\n24:4E:7B:40:00:00/28\tLeshi Internet Information & Technology (Beijing) Corp.\n24:4E:7B:50:00:00/28\tJiangsu Xuanbo Electronic Technologies Co.,Ltd\n24:4E:7B:60:00:00/28\tOwasys Advanced Wireless Devices\n24:4E:7B:70:00:00/28\tNanjing Wanlida Technology Co., Ltd.\n24:4E:7B:80:00:00/28\tCyber1st\n24:4E:7B:90:00:00/28\tUniMAT Automation Technology Co., Ltd.\n24:4E:7B:A0:00:00/28\tShenzhen AWT science &  technology limited\n24:4E:7B:B0:00:00/28\tMighty Audio, Inc.\n24:4E:7B:C0:00:00/28\tChunghsin Technology Group Co.,Ltd\n24:4E:7B:D0:00:00/28\tChurch & Dwight Co., Inc.\n24:4E:7B:E0:00:00/28\tWithWin Technology ShenZhen CO.,LTD\n24:4F:1D\t\tiRule LLC\n24:50:6F\t\tThinkcar Tech Co.,Ltd.\n24:52:6A\t\tZhejiang Dahua Technology Co., Ltd.\n24:53:BF\t\tEnernet\n24:58:6E\t\tzte corporation\n24:58:7C\t\tEspressif Inc.\n24:58:80\t\tVizeo\n24:59:0B\t\tWhite Sky Inc. Limited\n24:59:E5\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n24:5A:4C\t\tUbiquiti Inc\n24:5A:5F\t\tTp-Link Technologies Co.,Ltd.\n24:5A:B5\t\tSamsung Electronics Co.,Ltd\n24:5B:83\t\tRenesas Electronics (Penang) Sdn. Bhd.\n24:5B:A7\t\tApple, Inc.\n24:5B:F0\t\tLiteon, Inc.\n24:5C:BF\t\tNcse\n24:5C:C5\t\tHuawei Device Co., Ltd.\n24:5C:CB\t\tAXIe Consortium, Inc.\n24:5D:92\t\tJuniper Networks\n24:5D:FC\t\tIEEE Registration Authority\n24:5D:FC:00:00:00/28\tCompanyDeep\n24:5D:FC:10:00:00/28\tARTICONA - Bechtle Logistik & Service GmbH\n24:5D:FC:20:00:00/28\tBlue Iris Labs\n24:5D:FC:30:00:00/28\tShenzhen Hailuck Electronic Technology CO.,LTD\n24:5D:FC:40:00:00/28\tSuzhou Jiangzhi electronic technology co., Ltd\n24:5D:FC:50:00:00/28\tContactProximity Inc\n24:5D:FC:60:00:00/28\tGuangzhou Lango Electronics Technology Co.,Ltd.\n24:5D:FC:70:00:00/28\tLty Llc\n24:5D:FC:80:00:00/28\tCosmicnode\n24:5D:FC:90:00:00/28\tTorgovyy Dom  Tehnologiy Llc\n24:5D:FC:A0:00:00/28\tTata Sky Limited\n24:5D:FC:B0:00:00/28\tOnly\n24:5D:FC:C0:00:00/28\tSenix\n24:5D:FC:D0:00:00/28\tHunan Honestone lntelligence Technology Co.,Ltd\n24:5D:FC:E0:00:00/28\tDodge\n24:5E:48\t\tApple, Inc.\n24:5E:BE\t\tQNAP Systems, Inc.\n24:5E:E1\t\tUnited Automotive Electronic Systems Co.,Ltd.\n24:5F:9F\t\tHuawei Device Co., Ltd.\n24:5F:DF\t\tKyocera Corporation\n24:60:78\t\tHuawei Technologies Co.,Ltd\n24:60:81\t\trazberi technologies\n24:60:B3\t\tSamsung Electronics Co.,Ltd\n24:61:5A\t\tChina Mobile Group Device Co.,Ltd.\n24:62:78\t\tsysmocom - s.f.m.c. GmbH\n24:62:AB\t\tEspressif Inc.\n24:62:CE\t\tHewlett Packard Enterprise\n24:64:9F\t\tHuawei Device Co., Ltd.\n24:64:EF\t\tCyg Sunri Co.,Ltd.\n24:65:11\t\tAVM GmbH\n24:65:E1\t\tCiena Corporation\n24:68:30\t\tShenzhen Shokzhear Co., Ltd\n24:68:80\t\tBraveridge.co.,ltd.\n24:68:B0\t\tSamsung Electronics Co.,Ltd\n24:69:3E\t\tinnodisk Corporation\n24:69:4A\t\tJasmine Systems Inc.\n24:69:68\t\tTp-Link Technologies Co.,Ltd.\n24:69:8E\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\n24:69:A5\t\tHuawei Technologies Co.,Ltd\n24:6A:0E\t\tHP Inc.\n24:6A:AB\t\tIT-IS International\n24:6C:60\t\tHuawei Device Co., Ltd.\n24:6C:84\t\tCisco Systems, Inc\n24:6C:8A\t\tYUKAI Engineering\n24:6E:96\t\tDell Inc.\n24:6F:28\t\tEspressif Inc.\n24:6F:8C\t\tHuawei Device Co., Ltd.\n24:71:52\t\tDell Inc.\n24:71:89\t\tTexas Instruments\n24:72:4A\t\tNile Global Inc\n24:72:60\t\tIOTTECH Corp\n24:74:F7\t\tGoPro\n24:75:3A\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n24:75:B3\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n24:75:FC\t\tzte corporation\n24:76:25\t\tTexas Instruments\n24:76:45\t\tHuawei Device Co., Ltd.\n24:76:56\t\tShanghai Net Miles Fiber Optics Technology Co., LTD.\n24:76:7D\t\tCisco SPVTG\n24:77:03\t\tIntel Corporate\n24:78:23\t\tPanasonic Entertainment & Communication Co., Ltd.\n24:78:EF\t\tNokia\n24:79:2A\t\tRuckus Wireless\n24:79:EF\t\tGreenpacket Berhad, Taiwan\n24:79:F3\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n24:79:F8\t\tKUPSON spol. s r.o.\n24:7B:A4\t\tChina Mobile Group Device Co.,Ltd.\n24:7C:46\t\tFlextronics Technologies Mexico S De Rl De Cv\n24:7C:4C\t\tHerman Miller\n24:7D:4D\t\tTexas Instruments\n24:7E:12\t\tCisco Systems, Inc\n24:7E:51\t\tzte corporation\n24:7F:20\t\tSagemcom Broadband SAS\n24:7F:3C\t\tHuawei Technologies Co.,Ltd\n24:80:00\t\tWestcontrol AS\n24:81:3B\t\tCisco Systems, Inc\n24:81:AA\t\tKSH International Co., Ltd.\n24:81:C7\t\tHuawei Device Co., Ltd.\n24:82:8A\t\tProwave Technologies Ltd.\n24:84:98\t\tBeijing Jiaoda Microunion Tech.Co.,Ltd.\n24:86:02\t\tBouffalo Lab (Nanjing) Co., Ltd.\n24:86:25\t\tIEEE Registration Authority\n24:86:25:00:00:00/28\tShanghai Xizhi Technology Co., Ltd.\n24:86:25:10:00:00/28\tShenzhen LianwangRuijie Communication Technology Co, Ltd.\n24:86:25:20:00:00/28\tEmerson Automation FCP Kft.\n24:86:25:30:00:00/28\tViewSec Co., Ltd.\n24:86:25:40:00:00/28\tCodepoint Technologies, Inc.\n24:86:25:50:00:00/28\tMetro Electronics\n24:86:25:60:00:00/28\tAdtek\n24:86:25:70:00:00/28\tTianjin Optical Electrical Juneng Communication Co.,Ltd.\n24:86:25:80:00:00/28\tNingbo Sigmatek Automation Co., Ltd.\n24:86:25:90:00:00/28\tVtron Pty Ltd\n24:86:25:A0:00:00/28\tTas India Pvt Ltd\n24:86:25:B0:00:00/28\tWynd Labs\n24:86:25:C0:00:00/28\tL-LIGHT Co., Ltd.\n24:86:25:D0:00:00/28\tChengdu HOLDTECS Co.,Ltd\n24:86:25:E0:00:00/28\tHangzhou UPAI Technology Co., Ltd\n24:86:F4\t\tCtek, Inc.\n24:87:07\t\tSEnergy Corporation\n24:88:94\t\tshenzhen lensun Communication Technology LTD\n24:8A:07\t\tMellanox Technologies, Inc.\n24:8B:E0\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n24:90:38\t\tUniversal Biosensors Pty Ltd\n24:91:BB\t\tHuawei Technologies Co.,Ltd\n24:92:0E\t\tSamsung Electronics Co.,Ltd\n24:93:CA\t\tVoxtronic Austria\n24:94:42\t\tOpen Road Solutions , Inc.\n24:94:93\t\tFibRSol Global Network Limited\n24:94:94\t\tHong Kong Bouffalo Lab Limited\n24:94:CB\t\tCommscope\n24:95:04\t\tSfr\n24:95:2F\t\tGoogle, Inc.\n24:96:D5\t\tNEXCON Technology Co.,ltd.\n24:97:45\t\tHuawei Technologies Co.,Ltd\n24:97:ED\t\tTechvision Intelligent Technology Limited\n24:9A:C8\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n24:9A:D8\t\tYealink(Xiamen) Network Technology Co.,Ltd.\n24:9D:2A\t\tLinkData Technology (Tianjin) Co., LTD\n24:9E:7D\t\tBeijing Roborock Technology Co., Ltd.\n24:9E:AB\t\tHuawei Technologies Co.,Ltd\n24:9F:89\t\tTexas Instruments\n24:A0:74\t\tApple, Inc.\n24:A1:60\t\tEspressif Inc.\n24:A1:86\t\tCommscope\n24:A2:E1\t\tApple, Inc.\n24:A3:F0\t\tIEEE Registration Authority\n24:A3:F0:00:00:00/28\tShanghai AYAN Industry System Co.L,td\n24:A3:F0:10:00:00/28\tHunan Newman Internet of vehicles Co,Ltd\n24:A3:F0:20:00:00/28\tMagna Hong Co., Ltd.\n24:A3:F0:30:00:00/28\tShanghai Weirui Electronic Technology Co., Ltd.\n24:A3:F0:40:00:00/28\tMisaka Network, Inc.\n24:A3:F0:50:00:00/28\tPhoenix Season LLC\n24:A3:F0:60:00:00/28\tdissecto GmbH\n24:A3:F0:70:00:00/28\tCoban Srl\n24:A3:F0:80:00:00/28\tWeihai Hualing Opto-electronics Co., Ltd.\n24:A3:F0:90:00:00/28\tEONCA Corporation\n24:A3:F0:A0:00:00/28\tTeraNXT Global India Pvt Ltd.\n24:A3:F0:B0:00:00/28\tShenzhen Woody International Trade Co., Ltd\n24:A3:F0:C0:00:00/28\tBeijing Cunyin Chengqi Technology Co., Ltd.\n24:A3:F0:D0:00:00/28\tMicro Electroninc Products\n24:A3:F0:E0:00:00/28\tP4S\n24:A4:2C\t\tNETIO products a.s.\n24:A4:3C\t\tUbiquiti Inc\n24:A4:52\t\tSamsung Electronics Co.,Ltd\n24:A4:87\t\tHuawei Device Co., Ltd.\n24:A4:95\t\tThales Canada Inc.\n24:A5:2C\t\tHuawei Technologies Co.,Ltd\n24:A5:34\t\tSynTrust Tech International Ltd.\n24:A6:5E\t\tzte corporation\n24:A6:FA\t\tWeifang Goertek Electronics Co.,Ltd\n24:A7:99\t\tHuawei Device Co., Ltd.\n24:A7:DC\t\tSky Uk Limited\n24:A8:7D\t\tPanasonic Automotive Systems Asia Pacific(Thailand)Co.,Ltd.\n24:A9:37\t\tPURE Storage\n24:AB:81\t\tApple, Inc.\n24:AC:AC\t\tPolar Electro Oy\n24:AE:CC\t\tHonor Device Co., Ltd.\n24:AF:4A\t\tAlcatel-Lucent IPD\n24:AF:54\t\tNEXGEN Mediatech Inc.\n24:B0:A9\t\tShanghai Mobiletek Communication Ltd.\n24:B1:05\t\tPrama Hikvision India Private Limited\n24:B2:09\t\tAvaya Inc\n24:B2:31\t\tDongguan Liesheng Electronic Co., Ltd.\n24:B2:B9\t\tLiteon Technology Corporation\n24:B2:DE\t\tEspressif Inc.\n24:B3:39\t\tApple, Inc.\n24:B5:B9\t\tMotorola Mobility LLC, a Lenovo Company\n24:B5:F2\t\tShanghai Ingeek Technology Co., Ltd\n24:B6:57\t\tCisco Systems, Inc\n24:B6:B8\t\tFriem Spa\n24:B6:FD\t\tDell Inc.\n24:B7:2A\t\tChina Dragon Technology Limited\n24:B7:DA\t\tFiberhome Telecommunication Technologies Co.,LTD\n24:B8:8C\t\tCrenus Co.,Ltd.\n24:B8:D2\t\tOpzoon Technology Co.,Ltd.\n24:BA:13\t\tRiso Kagaku Corporation\n24:BA:30\t\tTechnical Consumer Products, Inc.\n24:BB:C1\t\tAbsolute Analysis\n24:BB:C9\t\tShenzhen SuperElectron Technology Co.,Ltd.\n24:BC:82\t\tDali Wireless, Inc.\n24:BC:F8\t\tHuawei Technologies Co.,Ltd\n24:BE:05\t\tHewlett Packard\n24:BE:18\t\tDadoutek Company Limited\n24:BF:74\t\tHamamatsu Photonics K.K.\n24:C0:B3\t\tRsf\n24:C1:7A\t\tBeijing Iactive Network Co.,Ltd\n24:C1:BD\t\tCrrc Dalian R&D Co.,Ltd.\n24:C3:F9\t\tSecuritas Direct AB\n24:C4:06\t\tSunitec Technology Co.,Limited\n24:C4:2F\t\tPhilips Lifeline\n24:C4:4A\t\tzte corporation\n24:C6:13\t\tSamsung Electronics Co.,Ltd\n24:C6:96\t\tSamsung Electronics Co.,Ltd\n24:C8:48\t\tmywerk Portal GmbH\n24:C8:6E\t\tChaney Instrument Co.\n24:C8:D3\t\tMcWane India Pvt Ltd\n24:C9:A1\t\tRuckus Wireless\n24:C9:DE\t\tGenoray\n24:CA:CB\t\tFiberhome Telecommunication Technologies Co.,LTD\n24:CB:E1\t\tEricsson AB\n24:CB:E7\t\tMYK, Inc.\n24:CD:8D\t\tMurata Manufacturing Co., Ltd.\n24:CE:33\t\tAmazon Technologies Inc.\n24:CF:21\t\tShenzhen State Micro Technology Co., Ltd\n24:CF:24\t\tBeijing Xiaomi Mobile Software Co., Ltd\n24:D0:DF\t\tApple, Inc.\n24:D1:3F\t\tMexus Co.,Ltd\n24:D1:A1\t\tShenzhen Cultraview Digital Technology Co., Ltd\n24:D2:08\t\tSensata Technologies Inc.\n24:D2:CC\t\tSmartDrive Systems Inc.\n24:D3:37\t\tXiaomi Communications Co Ltd\n24:D3:F2\t\tzte corporation\n24:D5:1C\t\tZhongtian broadband technology co., LTD\n24:D5:E4\t\tCisco Systems, Inc\n24:D7:6B\t\tSyntronic AB\n24:D7:9C\t\tCisco Systems, Inc\n24:D7:EB\t\tEspressif Inc.\n24:D8:1E\t\tMirWifi,Joint-Stock Company\n24:D9:04\t\tSichuan Changhong Network Technologies Co., Ltd.\n24:D9:21\t\tAvaya Inc\n24:DA:11\t\tNO NDA Inc\n24:DA:33\t\tHuawei Technologies Co.,Ltd\n24:DA:9B\t\tMotorola Mobility LLC, a Lenovo Company\n24:DA:B6\t\tSistemas de Gestión Energética S.A. de C.V\n24:DB:AC\t\tHuawei Technologies Co.,Ltd\n24:DB:AD\t\tShopperTrak RCT Corporation\n24:DB:ED\t\tSamsung Electronics Co.,Ltd\n24:DC:0F\t\tPhytium Technology Co.,Ltd.\n24:DC:C3\t\tEspressif Inc.\n24:DD:1B\t\tQingdao Hi-image Technologies Co., Ltd\n24:DE:8A\t\tNokia Solutions and Networks GmbH & Co. KG\n24:DE:C6\t\tHewlett Packard Enterprise\n24:DE:EB\t\tHuawei Technologies Co.,Ltd\n24:DF:17\t\tShenzhen Sande Dacom Electronics Co., Ltd\n24:DF:6A\t\tHuawei Technologies Co.,Ltd\n24:DF:A7\t\tHangzhou BroadLink Technology Co.,Ltd\n24:E1:24\t\tXiamen Milesight IoT Co., Ltd.\n24:E2:71\t\tQingdao Hisense Communications Co.,Ltd.\n24:E2:9D\t\tHuawei Device Co., Ltd.\n24:E3:14\t\tApple, Inc.\n24:E3:A4\t\tFiberhome Telecommunication Technologies Co.,LTD\n24:E3:DE\t\tChina Telecom Fufu Information Technology Co., Ltd.\n24:E4:3F\t\tWenzhou Kunmei Communication Technology Co.,Ltd.\n24:E4:C8\t\tFiberhome Telecommunication Technologies Co.,LTD\n24:E4:CE\t\tKaon Group Co., Ltd.\n24:E5:0F\t\tGoogle, Inc.\n24:E5:AA\t\tPhilips Oral Healthcare, Inc.\n24:E6:BA\t\tJSC Zavod im. Kozitsky\n24:E8:53\t\tLG Innotek\n24:E8:CE\t\tQingdao Haier Technology Co.,Ltd\n24:E8:E5\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n24:E9:27\t\tTomTom International BV\n24:E9:B3\t\tCisco Systems, Inc\n24:E9:CA\t\tHuawei Device Co., Ltd.\n24:EA:40\t\tHelmholz GmbH & Co. KG\n24:EB:16\t\tIntel Corporate\n24:EB:65\t\tSAET I.S. S.r.l.\n24:EB:ED\t\tHuawei Technologies Co.,Ltd\n24:EC:4A\t\tEspressif Inc.\n24:EC:51\t\tADF Technologies Sdn Bhd\n24:EC:99\t\tAskey Computer Corp\n24:EC:D6\t\tCSG Science & Technology Co.,Ltd.Hefei\n24:ED:FD\t\tSiemens Canada Limited\n24:EE:3A\t\tChengdu Yingji Electronic Hi-tech Co Ltd\n24:EE:9A\t\tIntel Corporate\n24:EF:B4\t\tShanghai Neardi Technologies Co. Ltd.\n24:F0:94\t\tApple, Inc.\n24:F0:D3\t\tSamsung Electronics Co.,Ltd\n24:F0:FF\t\tGHT Co., Ltd.\n24:F1:28\t\tTelstra\n24:F1:50\t\tGuangzhou Qi'an Technology Co., Ltd.\n24:F2:7F\t\tHewlett Packard Enterprise\n24:F2:DD\t\tRadiant Zemax LLC\n24:F3:06\t\tItel Mobile Limited\n24:F3:E3\t\teero inc.\n24:F4:0A\t\tSamsung Electronics Co.,Ltd\n24:F5:7E\t\tHwh Co., Ltd.\n24:F5:A2\t\tBelkin International Inc.\n24:F5:AA\t\tSamsung Electronics Co.,Ltd\n24:F6:03\t\tHuawei Technologies Co.,Ltd\n24:F6:77\t\tApple, Inc.\n24:F6:8D\t\tNokia\n24:FA:F3\t\tShanghai Flexem Technology Co.,Ltd.\n24:FB:65\t\tHuawei Technologies Co.,Ltd\n24:FB:E3\t\tHP Inc.\n24:FC:4E\t\tJuniper Networks\n24:FC:E5\t\tSamsung Electronics Co.,Ltd\n24:FD:0D\t\tIntelbras\n24:FD:52\t\tLiteon Technology Corporation\n24:FD:5B\t\tSmartThings, Inc.\n24:FD:FA\t\tPrivate\n24:FE:9A\t\tCyberTAN Technology Inc.\n28:00:AF\t\tDell Inc.\n28:01:1C\t\tzte corporation\n28:01:CD\t\tMellanox Technologies, Inc.\n28:02:2E\t\tApple, Inc.\n28:02:44\t\tApple, Inc.\n28:02:45\t\tKonze System Technology Co.,Ltd.\n28:02:D8\t\tSamsung Electronics Co.,Ltd\n28:04:C6\t\tWanan Hongsheng Electronic Co.Ltd\n28:04:E0\t\tFermax Electronica S.A.U.\n28:05:2E\t\tDematic Corp\n28:06:1E\t\tNingbo Global Useful Electric Co.,Ltd\n28:06:8D\t\tItl, Llc\n28:07:08\t\tSamsung Electronics Co.,Ltd\n28:07:0D\t\tGuangzhou Winsound Information Technology Co.,Ltd.\n28:0A:EE\t\tRenesas Electronics (Penang) Sdn. Bhd.\n28:0B:5C\t\tApple, Inc.\n28:0C:28\t\tUnigen DataStorage Corporation\n28:0C:2D\t\tQualvision Technology Co.,Ltd\n28:0C:50\t\tIntel Corporate\n28:0C:B8\t\tMikrosay Yazilim ve Elektronik A.S.\n28:0D:FC\t\tSony Interactive Entertainment Inc.\n28:0E:8B\t\tBeijing Spirit Technology Development Co., Ltd.\n28:0F:C5\t\tBeijing Leadsec Technology Co., Ltd.\n28:0F:EB\t\tLG Innotek\n28:10:1B\t\tMagnaCom\n28:10:7B\t\tD-Link International\n28:11:A5\t\tBose Corporation\n28:11:A8\t\tIntel Corporate\n28:11:EC\t\tHuawei Technologies Co.,Ltd\n28:12:93\t\tHonor Device Co., Ltd.\n28:14:71\t\tLantis co., LTD.\n28:15:A4\t\tShenzhen Pinsu Zhilian Information Technology Co.,Ltd.\n28:16:2E\t\t2Wire Inc\n28:16:7F\t\tXiaomi Communications Co Ltd\n28:16:A8\t\tMicrosoft Corporation\n28:16:AD\t\tIntel Corporate\n28:17:09\t\tHuawei Technologies Co.,Ltd\n28:17:2E\t\tFiberhome Telecommunication Technologies Co.,LTD\n28:17:CB\t\tSoftware Freedom Conservancy\n28:17:CE\t\tOmnisense Ltd\n28:18:78\t\tMicrosoft Corporation\n28:18:FD\t\tAditya Infotech Ltd.\n28:1B:04\t\tZalliant LLC\n28:1D:21\t\tIn One Smart Technology(H,K,)Limited\n28:1D:FB\t\tHuawei Technologies Co.,Ltd\n28:22:1E\t\tHuawei Technologies Co.,Ltd\n28:22:46\t\tBeijing Sinoix Communication Co., LTD\n28:23:73\t\tDigita\n28:23:F5\t\tChina Mobile (Hangzhou) Information Technology Co., Ltd.\n28:24:C9\t\tAmazon Technologies Inc.\n28:24:FF\t\tWistron Neweb Corporation\n28:25:36\t\tShenzhen Holatek Co.,Ltd\n28:26:A6\t\tPBR electronics GmbH\n28:27:BF\t\tSamsung Electronics Co.,Ltd\n28:28:5D\t\tZyxel Communications Corporation\n28:29:47\t\tChipsea Technologies (Shenzhen) Corp.\n28:29:86\t\tAPC by Schneider Electric\n28:29:CC\t\tCorsa Technology Incorporated\n28:29:D9\t\tGlobalBeiMing technology (Beijing)Co. Ltd\n28:2A:87\t\tItel Mobile Limited\n28:2B:96\t\tHuawei Device Co., Ltd.\n28:2B:B9\t\tShenzhen Xiongxin Technology Co.,Ltd\n28:2C:02\t\tIEEE Registration Authority\n28:2C:02:00:00:00/28\tSAKATA DENKI Co., Ltd.\n28:2C:02:10:00:00/28\tAstronics AES\n28:2C:02:20:00:00/28\tShenzhen emb-star technology co. LTD\n28:2C:02:30:00:00/28\tDexin Digital Technology Corp. Ltd.\n28:2C:02:40:00:00/28\tEfento T P Szydłowski K Zaręba Spółka Jawna\n28:2C:02:50:00:00/28\tLlc \"Microteh\"\n28:2C:02:60:00:00/28\tLookman Electroplast Industries Ltd\n28:2C:02:70:00:00/28\tTelecom and Microelectonic Industries\n28:2C:02:80:00:00/28\tShenzhen Neoway Technology Co.,Ltd.\n28:2C:02:90:00:00/28\tSystec Intelligent Building Technology (Tianjin) Co.,Ltd.\n28:2C:02:A0:00:00/28\tTokin Limited\n28:2C:02:B0:00:00/28\tThirdReality, Inc\n28:2C:02:C0:00:00/28\tEpoch International Enterprises, Inc.\n28:2C:02:D0:00:00/28\tShenzhen Domenor Technology Llc\n28:2C:02:E0:00:00/28\tCapintec, Inc.\n28:2C:B2\t\tTp-Link Technologies Co.,Ltd.\n28:2C:C4\t\tHuawei Technologies Co.,Ltd\n28:2D:06\t\tAMPAK Technology,Inc.\n28:2D:7F\t\tApple, Inc.\n28:2E:30\t\tMechatronics Innovation Technologies, S.L.U.\n28:2E:89\t\tWistron Neweb Corporation\n28:2F:C2\t\tAutomotive Data Solutions\n28:30:AC\t\tFrontiir Co. Ltd.\n28:31:52\t\tHuawei Technologies Co.,Ltd\n28:31:66\t\tvivo Mobile Communication Co., Ltd.\n28:31:7E\t\tHongkong Nano IC Technologies Co., Ltd\n28:31:F8\t\tHuawei Technologies Co.,Ltd\n28:32:C5\t\tHUMAX Co., Ltd.\n28:33:34\t\tHuawei Device Co., Ltd.\n28:34:10\t\tEnigma Diagnostics Limited\n28:34:A2\t\tCisco Systems, Inc\n28:34:FF\t\tApple, Inc.\n28:35:3A\t\tHuawei Technologies Co.,Ltd\n28:35:45\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\n28:36:13\t\tIEEE Registration Authority\n28:36:13:00:00:00/28\tShandong SIASUN Industrial Software Research Institute Co., Ltd\n28:36:13:10:00:00/28\tHi-p (Suzhou) Electronics Co,Ltd\n28:36:13:20:00:00/28\tShenzhen HQVT TECHNOLOGY Co.,LTD\n28:36:13:30:00:00/28\tLinear Computing Inc.\n28:36:13:40:00:00/28\tElytone Electronic Co., Ltd.\n28:36:13:50:00:00/28\tTuring Video\n28:36:13:60:00:00/28\tESI Ventures, LLC\n28:36:13:70:00:00/28\tshenzhen technology limited\n28:36:13:80:00:00/28\tFuzhou Lesi Intelligent Technology Co., Ltd\n28:36:13:90:00:00/28\tQingdao Airpoint Electronics Co.,Ltd.\n28:36:13:A0:00:00/28\tMAKEEN Energy\n28:36:13:B0:00:00/28\tQorvo, Inc.\n28:36:13:C0:00:00/28\tmidBit Technologies, LLC\n28:36:13:D0:00:00/28\tAvycon\n28:36:13:E0:00:00/28\tEGMedical, s.r.o.\n28:36:38\t\tIEEE Registration Authority\n28:36:38:00:00:00/28\tKnowles Electronics LLC\n28:36:38:10:00:00/28\tPanasonic System Solutions Europe\n28:36:38:20:00:00/28\tShenzhen Gospell Smarthome Electronic Co., Ltd.\n28:36:38:30:00:00/28\tSabinetek\n28:36:38:40:00:00/28\tDspread Technology (Beijing) Inc.\n28:36:38:50:00:00/28\tChargelib\n28:36:38:60:00:00/28\tGeorg Neumann GmbH\n28:36:38:70:00:00/28\tInnovative Technology Ltd\n28:36:38:80:00:00/28\tHavells India Limited\n28:36:38:90:00:00/28\tShenzhen  Zhi Hua  Creative Technology  Co., Ltd.\n28:36:38:A0:00:00/28\tBluekey Pty Ltd\n28:36:38:B0:00:00/28\tShangHai Canall Information Technology Co.,Ltd\n28:36:38:C0:00:00/28\tSwisson AG\n28:36:38:D0:00:00/28\tAPPEAK Technology System Co.Ltd.\n28:36:38:E0:00:00/28\tSCA Hygiene Products AB\n28:36:F0\t\tHuawei Device Co., Ltd.\n28:37:13\t\tShenzhen 3Nod Digital Technology Co., Ltd.\n28:37:2F\t\tEspressif Inc.\n28:37:37\t\tApple, Inc.\n28:38:5C\t\tFlextronics\n28:38:CF\t\tGen2wave\n28:39:26\t\tCyberTAN Technology Inc.\n28:39:5E\t\tSamsung Electronics Co.,Ltd\n28:39:84\t\tQidi Technology (shanghai) Co.,Ltd.\n28:39:E7\t\tPreceno Technology Pte.Ltd.\n28:3A:4D\t\tCloud Network Technology (Samoa) Limited\n28:3B:82\t\tD-Link International\n28:3B:96\t\tCool Control LTD\n28:3C:90\t\tTexas Instruments\n28:3C:E4\t\tHuawei Technologies Co.,Ltd\n28:3D:C2\t\tSamsung Electronics Co.,Ltd\n28:3D:E8\t\tGuangzhou Shiyuan Electronic Technology Company Limited\n28:3E:0C\t\tPreferred Robotics, Inc.\n28:3E:76\t\tCommon Networks\n28:3F:69\t\tSony Corporation\n28:40:1A\t\tC8 MediSensors, Inc.\n28:40:DD\t\tSony Interactive Entertainment Inc.\n28:41:21\t\tOptiSense Network, LLC\n28:41:C6\t\tHuawei Technologies Co.,Ltd\n28:41:EC\t\tHuawei Technologies Co.,Ltd\n28:43:DC\t\tUnited Memory Technology (Jiangsu) Limited\n28:44:30\t\tArcade Communications Ltd.\n28:44:F4\t\tHonor Device Co., Ltd.\n28:45:AC\t\tHuawei Device Co., Ltd.\n28:47:AA\t\tNokia Corporation\n28:48:46\t\tGridCentric Inc.\n28:48:E7\t\tHuawei Device Co., Ltd.\n28:49:92\t\tLuminator Technology Group Global LLC\n28:4C:53\t\tIntune Networks\n28:4D:7D\t\tzte corporation\n28:4D:92\t\tLuminator Technology Group Global LLC\n28:4E:44\t\tHuawei Technologies Co.,Ltd\n28:4E:D7\t\tOutSmart Power Systems, Inc.\n28:4E:E9\t\tmercury corperation\n28:4F:CE\t\tLiaoning Wontel Science and Technology Development Co.,Ltd.\n28:51:32\t\tShenzhen Prayfly Technology Co.,Ltd\n28:52:61\t\tCisco Systems, Inc\n28:52:E0\t\tLayon international Electronic & Telecom Co.,Ltd\n28:52:F9\t\tZhongxin Intelligent Times (Shenzhen) Co., Ltd.\n28:53:4E\t\tHuawei Technologies Co.,Ltd\n28:53:E0\t\tSintela Ltd\n28:54:71\t\tHuawei Device Co., Ltd.\n28:56:2F\t\tEspressif Inc.\n28:56:3A\t\tFiberhome Telecommunication Technologies Co.,LTD\n28:56:5A\t\tHon Hai Precision Ind. Co.,Ltd.\n28:56:C1\t\tHarman/Becker Automotive Systems GmbH\n28:57:67\t\tDish Technologies Corp\n28:57:BE\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n28:59:23\t\tXiaomi Communications Co Ltd\n28:5A:EB\t\tApple, Inc.\n28:5B:0C\t\tSichuan Jiuzhou Electronic Technology Co., Ltd.\n28:5F:2F\t\tRNware Co.,Ltd.\n28:5F:DB\t\tHuawei Technologies Co.,Ltd\n28:60:46\t\tLantech Communications Global, Inc.\n28:60:94\t\tCapelec\n28:63:36\t\tSiemens AG\n28:63:BD\t\tAptiv Services Us, Llc\n28:64:B0\t\tHuawei Device Co., Ltd.\n28:64:EF\t\tShenzhen Fsan Intelligent Technology Co.,Ltd\n28:65:6B\t\tKeystone Microtech Corporation\n28:66:E3\t\tAzureWave Technology Inc.\n28:68:47\t\tSilicon Laboratories\n28:68:D2\t\tHuawei Technologies Co.,Ltd\n28:6A:B8\t\tApple, Inc.\n28:6A:BA\t\tApple, Inc.\n28:6B:35\t\tIntel Corporate\n28:6B:5C\t\tCisco Systems, Inc\n28:6B:B4\t\tSJIT Co., Ltd.\n28:6C:07\t\tXIAOMI Electronics,CO.,LTD\n28:6D:97\t\tSAMJIN Co., Ltd.\n28:6D:CD\t\tBeijing Winner Microelectronics Co.,Ltd.\n28:6D:DA\t\tFiberhome Telecommunication Technologies Co.,LTD\n28:6E:D4\t\tHuawei Technologies Co.,Ltd\n28:6F:40\t\tTonly Technology Co. Ltd\n28:6F:7F\t\tCisco Systems, Inc\n28:6F:B9\t\tNokia Shanghai Bell Co., Ltd.\n28:70:4E\t\tUbiquiti Inc\n28:71:84\t\tSpire Payments\n28:72:C5\t\tSmartmatic Corp\n28:72:F0\t\tAthena\n28:73:F6\t\tAmazon Technologies Inc.\n28:74:F5\t\tNokia Solutions and Networks GmbH & Co. KG\n28:75:D8\t\tFujian Star-Net Communication Co.,Ltd\n28:76:10\t\tIgniteNet\n28:76:81\t\tSilicon Laboratories\n28:76:CD\t\tFunshion Online Technologies Co.,Ltd\n28:77:77\t\tzte corporation\n28:77:B1\t\tTri plus grupa d.o.o.\n28:77:F1\t\tApple, Inc.\n28:79:94\t\tRealplay Digital Technology(Shenzhen) Co.,Ltd\n28:7A:B4\t\tHuawei Technologies Co.,Ltd\n28:7A:EE\t\tCommscope\n28:7B:09\t\tzte corporation\n28:7B:11\t\tHui Zhou Gaoshengda Technology Co.,LTD\n28:7C:DB\t\tHefei  Toycloud Technology Co.,ltd\n28:7E:80\t\tHui Zhou Gaoshengda Technology Co.,LTD\n28:7F:CF\t\tIntel Corporate\n28:80:23\t\tHewlett Packard\n28:80:88\t\tNetgear\n28:80:8A\t\tHuawei Technologies Co.,Ltd\n28:80:A2\t\tInseego Wireless, Inc\n28:82:7C\t\tBosch Automative products(Suzhou)Co.,Ltd Changzhou Branch\n28:83:35\t\tSamsung Electronics Co.,Ltd\n28:83:C9\t\tApple, Inc.\n28:84:0E\t\tsilicon valley immigration service\n28:84:FA\t\tSHARP Corporation\n28:85:2D\t\tTouch Networks\n28:85:BB\t\tZen Exim Pvt. Ltd.\n28:87:61\t\tLG Innotek\n28:87:BA\t\tTP-Link Systems Inc\n28:89:15\t\tCashGuard Sverige AB\n28:8A:1C\t\tJuniper Networks\n28:8C:B8\t\tzte corporation\n28:8E:B9\t\tWacom Co.,Ltd.\n28:8E:EC\t\tApple, Inc.\n28:8F:F6\t\tApple, Inc.\n28:91:76\t\tIndyme Solutions, LLC\n28:91:D0\t\tStage Tec Entwicklungsgesellschaft für professionelle Audiotechnik mbH\n28:92:00\t\tIntel Corporate\n28:92:4A\t\tHewlett Packard\n28:93:7D\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n28:93:FE\t\tCisco Systems, Inc\n28:94:01\t\tNetgear\n28:94:0F\t\tCisco Systems, Inc\n28:94:AF\t\tSamhwa Telecom\n28:95:29\t\tIntel Corporate\n28:97:B8\t\tmyenergi Ltd\n28:98:7B\t\tSamsung Electronics Co.,Ltd\n28:99:3A\t\tArista Networks\n28:99:C7\t\tLindsay Broadband Inc\n28:9A:4B\t\tSteelSeries ApS\n28:9A:F7\t\tADVA Optical Networking Ltd.\n28:9A:FA\t\tTCT mobile ltd\n28:9C:6E\t\tShanghai High-Flying Electronics  Technology Co., Ltd\n28:9E:97\t\tHuawei Technologies Co.,Ltd\n28:9E:DF\t\tDanfoss Turbocor Compressors, Inc\n28:9E:FC\t\tSagemcom Broadband SAS\n28:9F:04\t\tSamsung Electronics Co.,Ltd\n28:A0:2B\t\tApple, Inc.\n28:A0:6B\t\tIntel Corporate\n28:A1:83\t\tAlpsalpine Co,.Ltd\n28:A1:86\t\tenblink\n28:A1:92\t\tGERP Solution\n28:A1:EB\t\tEtek Technology (Shenzhen) Co.,Ltd\n28:A2:41\t\texlar corp\n28:A2:4B\t\tJuniper Networks\n28:A3:31\t\tSierra Wireless, ULC\n28:A4:4A\t\tIntel Corporate\n28:A5:3F\t\tvivo Mobile Communication Co., Ltd.\n28:A5:74\t\tMiller Electric Mfg. Co.\n28:A5:EE\t\tShenzhen SDGI CATV Co., Ltd\n28:A6:AC\t\tseca gmbh & co. kg\n28:A6:DB\t\tHuawei Technologies Co.,Ltd\n28:A9:15\t\tServercom (India) Private Limited\n28:AC:67\t\tMach Power, Rappresentanze Internazionali s.r.l.\n28:AC:9E\t\tCisco Systems, Inc\n28:AD:18\t\tHui Zhou Gaoshengda Technology Co.,LTD\n28:AD:3E\t\tShenzhen TONG BO WEI Technology CO.,LTD\n28:AF:0A\t\tSirius XM Radio Inc\n28:AF:21\t\tzte corporation\n28:AF:42\t\tSamsung Electronics Co.,Ltd\n28:AF:FD\t\tCisco Systems, Inc\n28:B0:CC\t\tXenya d.o.o.\n28:B1:33\t\tSHINEMAN(SHENZHEN) Tech. Cor., Ltd.\n28:B2:21\t\tSienda Multimedia Ltd\n28:B2:BD\t\tIntel Corporate\n28:B3:71\t\tRuckus Wireless\n28:B3:AB\t\tGenmark Automation\n28:B4:48\t\tHuawei Technologies Co.,Ltd\n28:B4:FB\t\tSprocomm Technologies CO.,LTD.\n28:B5:91\t\tCisco Systems, Inc\n28:B5:E8\t\tTexas Instruments\n28:B7:7C\t\tIEEE Registration Authority\n28:B7:7C:00:00:00/28\tShenzhen Eview Gps Technology\n28:B7:7C:10:00:00/28\tSolarEdge Technologies\n28:B7:7C:20:00:00/28\tZhuhai RongBang Electronic Technology Co., Ltd.\n28:B7:7C:30:00:00/28\tBeijing Kitten&Puppy Technology Co.,Ltd.\n28:B7:7C:40:00:00/28\tAnnapurna labs\n28:B7:7C:50:00:00/28\tGROTHE GmbH\n28:B7:7C:60:00:00/28\tShanghai Taiji Software Co.,Limited\n28:B7:7C:70:00:00/28\tConvertertec Deutschland GmbH\n28:B7:7C:80:00:00/28\tShenzhen PUAS Industrial Co.,LTD\n28:B7:7C:90:00:00/28\tAnser Coding Inc.\n28:B7:7C:A0:00:00/28\tSimaudio Ltd\n28:B7:7C:B0:00:00/28\tVehant Technologies Pvt Ltd.\n28:B7:7C:C0:00:00/28\tAnyLink LLC\n28:B7:7C:D0:00:00/28\tEnedo Finland Oy\n28:B7:7C:E0:00:00/28\tRay Pte Ltd\n28:B8:29\t\tJuniper Networks\n28:B9:D9\t\tRadisys Corporation\n28:BA:18\t\tNextNav, LLC\n28:BA:B5\t\tSamsung Electronics Co.,Ltd\n28:BB:59\t\tRNET Technologies, Inc.\n28:BB:ED\t\tBouffalo Lab (Nanjing) Co., Ltd.\n28:BC:05\t\tBLU Products Inc\n28:BC:18\t\tSourcingOverseas Co. Ltd\n28:BC:56\t\tEMAC, Inc.\n28:BD:89\t\tGoogle, Inc.\n28:BE:03\t\tTCT mobile ltd\n28:BE:43\t\tvivo Mobile Communication Co., Ltd.\n28:BE:9B\t\tVantiva USA LLC\n28:BE:F3\t\tFujian Star-Net Communication Co.,Ltd\n28:BF:89\t\tFiberhome Telecommunication Technologies Co.,LTD\n28:C0:1B\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n28:C0:DA\t\tJuniper Networks\n28:C1:3C\t\tHon Hai Precision Industry Co., Ltd.\n28:C1:A0\t\tApple, Inc.\n28:C2:1F\t\tSamsung Electro-Mechanics(Thailand)\n28:C2:DD\t\tAzureWave Technology Inc.\n28:C5:38\t\tApple, Inc.\n28:C5:C8\t\tHP Inc.\n28:C5:D2\t\tIntel Corporate\n28:C6:3F\t\tIntel Corporate\n28:C6:71\t\tYota Devices OY\n28:C6:8E\t\tNetgear\n28:C7:09\t\tApple, Inc.\n28:C7:18\t\tAltierre\n28:C7:CE\t\tCisco Systems, Inc\n28:C8:25\t\tDellKing Industrial Co., Ltd\n28:C8:7A\t\tCommscope\n28:C8:7C\t\tzte corporation\n28:C9:14\t\tTaimag Corporation\n28:C9:7A\t\tNew H3C Technologies Co., Ltd\n28:CA:09\t\tThyssenKrupp Elevators (Shanghai) Co.,Ltd\n28:CB:5C\t\tShenzhen CPETEK Technology Co.,Ltd.\n28:CB:EB\t\tOne\n28:CC:01\t\tSamsung Electronics Co.,Ltd\n28:CC:FF\t\tCorporacion Empresarial Altra SL\n28:CD:1C\t\tEspotel Oy\n28:CD:4C\t\tIndividual Computers GmbH\n28:CD:9C\t\tShenzhen Dynamax Software Development Co.,Ltd.\n28:CD:C1\t\tRaspberry Pi Trading Ltd\n28:CD:C4\t\tChongqing Fugui Electronics Co.,Ltd.\n28:CE:15\t\tShenzhen Xinwei Intelligent Co., Ltd\n28:CF:08\t\tEssys\n28:CF:51\t\tNintendo Co.,Ltd\n28:CF:DA\t\tApple, Inc.\n28:CF:E9\t\tApple, Inc.\n28:D0:43\t\tAzureWave Technology Inc.\n28:D0:44\t\tShenzhen Xinyin technology company\n28:D0:CB\t\tAdtran Inc\n28:D0:EA\t\tIntel Corporate\n28:D0:F5\t\tRuijie Networks Co.,LTD\n28:D1:27\t\tBeijing Xiaomi Mobile Software Co., Ltd\n28:D1:AF\t\tNokia Corporation\n28:D1:B7\t\tShenzhen YOUHUA Technology Co., Ltd\n28:D2:44\t\tLCFC(Hefei) Electronics Technology co., ltd\n28:D2:5A\t\tInfinix mobility limited\n28:D3:EA\t\tHuawei Device Co., Ltd.\n28:D4:1E\t\tBarrot Technology Co.,Ltd.\n28:D4:36\t\tJiangsu dewosi electric co., LTD\n28:D5:76\t\tPremier Wireless, Inc.\n28:D9:3E\t\tTelecor Inc.\n28:D9:8A\t\tHangzhou Konke Technology Co.,Ltd.\n28:D9:97\t\tYuduan Mobile Co., Ltd.\n28:DB:02\t\tzte corporation\n28:DB:81\t\tShanghai Guao Electronic Technology Co., Ltd\n28:DB:A7\t\tSilicon Laboratories\n28:DE:1C\t\tSamsung Electronics Co.,Ltd\n28:DE:59\t\tDomus NTW CORP.\n28:DE:65\t\tHewlett Packard Enterprise\n28:DE:A8\t\tzte corporation\n28:DE:E5\t\tHuawei Technologies Co.,Ltd\n28:DE:F6\t\tbioMerieux Inc.\n28:DF:EB\t\tIntel Corporate\n28:E0:2C\t\tApple, Inc.\n28:E1:4C\t\tApple, Inc.\n28:E2:97\t\tShanghai InfoTM Microelectronics Co.,Ltd\n28:E3:1F\t\tXiaomi Communications Co Ltd\n28:E3:47\t\tLiteon Technology Corporation\n28:E3:4E\t\tHuawei Technologies Co.,Ltd\n28:E4:24\t\tNew H3C Technologies Co., Ltd\n28:E4:76\t\tPi-Coral\n28:E5:B0\t\tHuawei Technologies Co.,Ltd\n28:E6:08\t\tTokheim\n28:E6:A9\t\tSamsung Electronics Co.,Ltd\n28:E6:E9\t\tSIS Sat Internet Services GmbH\n28:E7:1D\t\tArista Networks\n28:E7:94\t\tMicrotime Computer Inc.\n28:E7:CF\t\tApple, Inc.\n28:E9:8E\t\tMitsubishi Electric Corporation\n28:EA:0B\t\tMicrosoft Corporation\n28:EA:2D\t\tApple, Inc.\n28:EB:0A\t\tRolling Wireless S.a.r.l. Luxembourg\n28:EB:A6\t\tNex-T LLC\n28:EB:B7\t\tambie corporation\n28:EC:22\t\teero inc.\n28:EC:95\t\tApple, Inc.\n28:EC:9A\t\tTexas Instruments\n28:ED:58\t\tJAG Jakob AG\n28:ED:6A\t\tApple, Inc.\n28:ED:E0\t\tAMPAK Technology, Inc.\n28:EE:2C\t\tFrontline Test Equipment\n28:EE:52\t\tTp-Link Technologies Co.,Ltd.\n28:EE:D3\t\tShenzhen Super D Technology Co., Ltd\n28:EF:01\t\tAmazon Technologies Inc.\n28:F0:33\t\tApple, Inc.\n28:F0:76\t\tApple, Inc.\n28:F1:0E\t\tDell Inc.\n28:F3:58\t\t2C - Trifonov & Co\n28:F3:66\t\tShenzhen Bilian electronic CO.,LTD\n28:F4:9B\t\tLeetek\n28:F5:2B\t\tFN-LINK TECHNOLOGY Ltd.\n28:F5:32\t\tADD-Engineering BV\n28:F5:37\t\tIEEE Registration Authority\n28:F5:37:00:00:00/28\tValeo Siemens eAutomotive Norway\n28:F5:37:10:00:00/28\tUmojo\n28:F5:37:20:00:00/28\tUnicair Communication Tec Co., Ltd.\n28:F5:37:30:00:00/28\tPrimetech Engineering Corp.\n28:F5:37:40:00:00/28\tPhyn LLC\n28:F5:37:50:00:00/28\tAtomrock LLC\n28:F5:37:60:00:00/28\tMyOmega Systems GmbH\n28:F5:37:70:00:00/28\tShenzhen Modern Cowboy Technology Co.,Ltd.\n28:F5:37:80:00:00/28\t1More\n28:F5:37:90:00:00/28\tHerbert Waldmann GmbH & Co. KG\n28:F5:37:A0:00:00/28\tHoneywell Safety Products USA, Inc\n28:F5:37:B0:00:00/28\tLogiM GmbH Software und Entwicklung\n28:F5:37:C0:00:00/28\tMatricx Singapore Pte Ltd\n28:F5:37:D0:00:00/28\tSkyrockettoys LLC\n28:F5:37:E0:00:00/28\tPerformance Motion Devices\n28:F5:D1\t\tCommscope\n28:F6:06\t\tSyes srl\n28:F7:D6\t\tFiberhome Telecommunication Technologies Co.,LTD\n28:F8:C6\t\tIEEE Registration Authority\n28:F8:C6:00:00:00/28\t2iC-Care Ltd\n28:F8:C6:10:00:00/28\tAnnapurna labs\n28:F8:C6:20:00:00/28\tIntermatic AG\n28:F8:C6:30:00:00/28\tPanasonic Automotive System Malaysia\n28:F8:C6:40:00:00/28\tBeijing HengzhengTC Sci-Tech Co., Ltd\n28:F8:C6:50:00:00/28\tSarco Equipments PVT. LTD.\n28:F8:C6:60:00:00/28\tShenzhen Hongdian technologies corporation.\n28:F8:C6:70:00:00/28\tASES GROUP, s.r.o.\n28:F8:C6:80:00:00/28\tShenzhen Xifanlina Industrial Co.,Ltd\n28:F8:C6:90:00:00/28\tsecuever\n28:F8:C6:A0:00:00/28\tVidendum Media Solutions Spa\n28:F8:C6:B0:00:00/28\t3PI Tech Solutions\n28:F8:C6:C0:00:00/28\tAnnapurna labs\n28:F8:C6:D0:00:00/28\tShenZhen Goodtimes Technoogy CO.,LTD\n28:F8:C6:E0:00:00/28\tCOMEM SpA\n28:FA:19\t\tShenzhen Jingxun Software Telecommunication Technology Co.,Ltd\n28:FA:7A\t\tZhejiang Tmall Technology Co., Ltd.\n28:FA:A0\t\tvivo Mobile Communication Co., Ltd.\n28:FB:AE\t\tHuawei Technologies Co.,Ltd\n28:FB:D3\t\tRagentek Technology Group\n28:FC:51\t\tThe Electric Controller and Manufacturing Co., LLC\n28:FC:F6\t\tShenzhen Xin KingBrand enterprises Co.,Ltd\n28:FD:80\t\tIEEE Registration Authority\n28:FD:80:00:00:00/28\tMillcode\n28:FD:80:10:00:00/28\tGalileo, Inc.\n28:FD:80:20:00:00/28\tZhixiang Technology Co., Ltd.\n28:FD:80:30:00:00/28\tNUUO, Inc.\n28:FD:80:40:00:00/28\tDigital Signal Corp\n28:FD:80:50:00:00/28\tXiaocong Network Limited\n28:FD:80:60:00:00/28\tVigil Monitoring\n28:FD:80:70:00:00/28\tUniversity of York\n28:FD:80:80:00:00/28\tJasco Products Company\n28:FD:80:90:00:00/28\tJinlitong International Co.,Ltd\n28:FD:80:A0:00:00/28\tApollo Digital (Taiwan) Ltd.\n28:FD:80:B0:00:00/28\tPoket Hardware GmbH\n28:FD:80:C0:00:00/28\tAirbus Defence and Space Oy\n28:FD:80:D0:00:00/28\tGrandway Technology (Shenzhen) Limited\n28:FD:80:E0:00:00/28\tT-Radio AS\n28:FD:80:F0:00:00/28\tPrivate\n28:FE:65\t\tDongGuan Siyoto Electronics Co., Ltd\n28:FE:CD\t\tLemobile Information Technology (Beijing) Co., Ltd.\n28:FE:DE\t\tCOMESTA, Inc.\n28:FF:3C\t\tApple, Inc.\n28:FF:3E\t\tzte corporation\n28:FF:5F\t\tHG Genuine Intelligent Terminal (Xiaogan) Co.,Ltd.\n28:FF:B2\t\tToshiba Corp.\n2A:0B:B8\t\txFusion Digital Technologies Co., Limited\n2A:15:97\t\tCotsworks\n2A:2F:83\t\tUplink\n2A:47:C9\t\tCode Construct Pty Ltd\n2A:7F:76\t\tWireless Broadband Alliance, Inc\n2A:9F:EB\t\tAVnu Alliance\n2A:A1:39\t\tPointguard, Llc\n2A:A1:47\t\tDistribuciones Cantilever\n2A:AC:53\t\tWolfspyre Labs\n2A:DB:D7\t\tVesper Technologies\n2A:EA:15\t\tTibit Communications\n2A:FD:6A\t\tCharter Communications\n2C:00:2A\t\tShenzhen TINNO Mobile Technology Corp.\n2C:00:2C\t\tUnowhy\n2C:00:33\t\tEControls, LLC\n2C:00:AB\t\tCommscope\n2C:00:F7\t\tXos\n2C:01:0B\t\tNASCENT Technology, LLC - RemKon\n2C:01:B5\t\tCisco Systems, Inc\n2C:02:9F\t\t3ALogics\n2C:03:69\t\tAccton Technology Corporation\n2C:05:47\t\tShenzhen Phaten Tech. LTD\n2C:06:23\t\tWin Leader Inc.\n2C:07:3C\t\tDevline Limited\n2C:07:86\t\tHuawei Device Co., Ltd.\n2C:07:F6\t\tSKG Health Technologies Co., Ltd.\n2C:08:1C\t\tOvh\n2C:08:23\t\tSercomm France Sarl\n2C:08:8C\t\tHUMAX Co., Ltd.\n2C:08:B4\t\tHuawei Device Co., Ltd.\n2C:09:4D\t\tRaptor Engineering, LLC\n2C:09:CB\t\tCobs Ab\n2C:0B:97\t\tXiaomi Communications Co Ltd\n2C:0B:AB\t\tHuawei Technologies Co.,Ltd\n2C:0B:E9\t\tCisco Systems, Inc\n2C:0D:27\t\tHuawei Device Co., Ltd.\n2C:0D:A7\t\tIntel Corporate\n2C:0D:CF\t\tXiaomi Communications Co Ltd\n2C:0E:3D\t\tSamsung Electro-Mechanics(Thailand)\n2C:10:C1\t\tNintendo Co., Ltd.\n2C:11:65\t\tSilicon Laboratories\n2C:15:BF\t\tSamsung Electronics Co.,Ltd\n2C:15:D9\t\tHuawei Technologies Co.,Ltd\n2C:15:E1\t\tPhicomm (Shanghai) Co., Ltd.\n2C:16:BD\t\tIEEE Registration Authority\n2C:16:BD:00:00:00/28\tBeijing Jishi Huitong Technology Co., Ltd.\n2C:16:BD:10:00:00/28\tCurtiss-Wright Drive Technology\n2C:16:BD:20:00:00/28\tAimco\n2C:16:BD:30:00:00/28\tSaft AB\n2C:16:BD:40:00:00/28\tSunit Oy\n2C:16:BD:50:00:00/28\tBeijing Zhijian Link Technology Co., Ltd.\n2C:16:BD:60:00:00/28\tCloudwalk Technology Co.,Ltd\n2C:16:BD:70:00:00/28\tSct Optronics Co., Ltd\n2C:16:BD:80:00:00/28\tShenzhen elink smart Co., ltd\n2C:16:BD:90:00:00/28\tShanghai Walktech Information Technology Co.,Ltd.\n2C:16:BD:A0:00:00/28\tShenzhen Haiying Wire Tech Co., Ltd.\n2C:16:BD:B0:00:00/28\tLingdong Technology (Beijing) Co. Ltd\n2C:16:BD:C0:00:00/28\tBeijing CHJ Automotive Co., Ltd.\n2C:16:BD:D0:00:00/28\tHangzhou Yanzhi Technology Co.,Ltd.\n2C:16:BD:E0:00:00/28\tMolex Incorporated\n2C:17:E0\t\tSYSTEMES ET TECHNOLOGIES IDENTIFICATION (STid)\n2C:18:09\t\tApple, Inc.\n2C:18:75\t\tSkyworth Digital Technology(Shenzhen) Co.,Ltd\n2C:18:AE\t\tTrend Electronics Co., Ltd.\n2C:19:5C\t\tBeijing Xiaomi Mobile Software Co., Ltd\n2C:19:84\t\tIDN Telecom, Inc.\n2C:1A:01\t\tHuawei Technologies Co.,Ltd\n2C:1A:05\t\tCisco Systems, Inc\n2C:1A:31\t\tElectronics Company Limited\n2C:1B:3A\t\tHui Zhou Gaoshengda Technology Co.,LTD\n2C:1B:C8\t\tHunan Topview Network System CO.,LTD\n2C:1C:F6\t\tAlien Green LLC\n2C:1D:B8\t\tCommscope\n2C:1E:4F\t\tChengdu Qianli Network Technology Co., Ltd.\n2C:1E:EA\t\tAerodev\n2C:1F:23\t\tApple, Inc.\n2C:20:0B\t\tApple, Inc.\n2C:20:80\t\tHuawei Device Co., Ltd.\n2C:21:31\t\tJuniper Networks\n2C:21:72\t\tJuniper Networks\n2C:21:D7\t\tIMAX Corporation\n2C:22:8B\t\tCtr Srl\n2C:23:3A\t\tHewlett Packard\n2C:24:5F\t\tBabolat VS\n2C:26:17\t\tOculus VR, LLC\n2C:26:5F\t\tIEEE Registration Authority\n2C:26:5F:00:00:00/28\tXiamen Vorlink Iot Technology Co.,Ltd.\n2C:26:5F:10:00:00/28\tGriessbach\n2C:26:5F:20:00:00/28\tJiangsu JARI Technology Group Co., LTD\n2C:26:5F:30:00:00/28\tshenzhen Clever Electronic Co., Ltd.\n2C:26:5F:40:00:00/28\tGTA Electronics Co., Ltd.\n2C:26:5F:50:00:00/28\tMotec GmbH\n2C:26:5F:60:00:00/28\tAppostar Technology Co. Ltd\n2C:26:5F:70:00:00/28\tCoremate Technical Co., Ltd\n2C:26:5F:80:00:00/28\tItus Networks, LLC\n2C:26:5F:90:00:00/28\tBrüel & Kjaer Vibro GmbH\n2C:26:5F:A0:00:00/28\tPolara Engineering\n2C:26:5F:B0:00:00/28\tRexgen Inc.\n2C:26:5F:C0:00:00/28\tAaton Digital\n2C:26:5F:D0:00:00/28\tE Core Corporation\n2C:26:5F:E0:00:00/28\tHysentel Technology Co., Ltd\n2C:26:5F:F0:00:00/28\tPrivate\n2C:26:C5\t\tzte corporation\n2C:27:68\t\tHuawei Technologies Co.,Ltd\n2C:27:9E\t\tIEEE Registration Authority\n2C:27:9E:00:00:00/28\tChangzhou WEBO Weighing Device & System CO.,LTD\n2C:27:9E:10:00:00/28\tElectronique Bluewave Inc.\n2C:27:9E:20:00:00/28\tKunyi electronic technology (Shanghai) Co., Ltd.\n2C:27:9E:30:00:00/28\tPrivate\n2C:27:9E:40:00:00/28\tShijiazhuang King Transportation Equipment Co.,Ltd\n2C:27:9E:50:00:00/28\tAudioNord Distribution A/S\n2C:27:9E:60:00:00/28\tRutledge Omni Services Pte Ltd\n2C:27:9E:70:00:00/28\tFOCAL-JMLab\n2C:27:9E:80:00:00/28\tInstitut Dr. Foerster GmbH & Co. KG\n2C:27:9E:90:00:00/28\toctoScope, Inc.\n2C:27:9E:A0:00:00/28\tExegy Inc\n2C:27:9E:B0:00:00/28\tForties Inc.\n2C:27:9E:C0:00:00/28\tWAYCOM Technology Co.,Ltd\n2C:27:9E:D0:00:00/28\tJiangsu JianHu Science & Technology Co., Ltd.\n2C:27:9E:E0:00:00/28\tAmaryllo International Inc.\n2C:27:D7\t\tHewlett Packard\n2C:28:2D\t\tBbk Educational Electronics Corp.,Ltd.\n2C:28:B7\t\tHangzhou Ruiying technology co., LTD\n2C:29:97\t\tMicrosoft Corporation\n2C:2B:F9\t\tLG Innotek\n2C:2D:48\t\tCommend International GmbH\n2C:30:1A\t\tTechnicolor CH USA Inc for Telus\n2C:30:33\t\tNetgear\n2C:30:68\t\tPantech Co.,Ltd\n2C:31:24\t\tCisco Systems, Inc\n2C:32:6A\t\tApple, Inc.\n2C:33:11\t\tCisco Systems, Inc\n2C:33:41\t\tChina Mobile IOT Company Limited\n2C:33:58\t\tIntel Corporate\n2C:33:61\t\tApple, Inc.\n2C:33:7A\t\tHon Hai Precision Ind. Co.,Ltd.\n2C:34:27\t\tErco & Gener\n2C:34:7B\t\tShenzhen Junge Technology Co.,Ltd\n2C:35:57\t\tELIIY Power CO., Ltd.\n2C:36:A0\t\tCapisco Limited\n2C:36:F2\t\tHuawei Technologies Co.,Ltd\n2C:36:F8\t\tCisco Systems, Inc\n2C:37:31\t\tShenzhen Yifang Digital Technology Co.,Ltd.\n2C:37:96\t\tCybo Co.,Ltd.\n2C:37:C5\t\tQingdao Haier Intelligent Home Appliance Technology Co.,Ltd\n2C:39:96\t\tSagemcom Broadband SAS\n2C:39:C1\t\tCiena Corporation\n2C:3A:28\t\tFagor Electrónica\n2C:3A:91\t\tHuawei Device Co., Ltd.\n2C:3A:E8\t\tEspressif Inc.\n2C:3A:FD\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n2C:3B:70\t\tAzureWave Technology Inc.\n2C:3B:FD\t\tNetstor Technology Co., Ltd.\n2C:3C:05\t\tMarinesync Corp\n2C:3E:BF\t\tHOSIN Global Electronics Co., Ltd.\n2C:3E:CF\t\tCisco Systems, Inc\n2C:3F:0B\t\tCisco Meraki\n2C:3F:38\t\tCisco Systems, Inc\n2C:3F:3E\t\tAlge-Timing GmbH\n2C:40:2B\t\tSmart iBlue Technology Limited\n2C:40:53\t\tSamsung Electronics Co.,Ltd\n2C:41:38\t\tHewlett Packard\n2C:41:A1\t\tBose Corporation\n2C:42:05\t\tLytx\n2C:43:1A\t\tShenzhen YOUHUA Technology Co., Ltd\n2C:43:BE\t\tSunnovo International Limited\n2C:44:01\t\tSamsung Electronics Co.,Ltd\n2C:44:1B\t\tSpectrum Medical Limited\n2C:44:FD\t\tHewlett Packard\n2C:45:9A\t\tDixon Technologies (India) Limited\n2C:47:59\t\tBeijing MEGA preponderance Science & Technology Co. Ltd\n2C:48:35\t\tIEEE Registration Authority\n2C:48:35:00:00:00/28\tProgress Rail Services, Inspection and Information Systems\n2C:48:35:10:00:00/28\tAdvanced Electronics Company Ltd\n2C:48:35:20:00:00/28\tRheonik Messtechnik GmbH\n2C:48:35:30:00:00/28\tNewtrax Technologies Inc\n2C:48:35:40:00:00/28\tGeartech Ltd\n2C:48:35:50:00:00/28\tScout Security, Inc.\n2C:48:35:60:00:00/28\tExertus Oy\n2C:48:35:70:00:00/28\tFast\n2C:48:35:80:00:00/28\tDPS Electronics\n2C:48:35:90:00:00/28\tSureFlap Ltd\n2C:48:35:A0:00:00/28\tCollatz+Trojan GmbH\n2C:48:35:B0:00:00/28\tShanghai Visteon Automotive Electronics System CO. Ltd.\n2C:48:35:C0:00:00/28\tSantec Corporation\n2C:48:35:D0:00:00/28\tPhasor Solutions Ltd\n2C:48:35:E0:00:00/28\tIrootech Technology Co.,Ltd\n2C:48:81\t\tvivo Mobile Communication Co., Ltd.\n2C:4A:11\t\tCiena Corporation\n2C:4C:15\t\tJuniper Networks\n2C:4C:C6\t\tMurata Manufacturing Co., Ltd.\n2C:4D:54\t\tASUSTek COMPUTER INC.\n2C:4D:79\t\tWeifang Goertek Electronics Co.,Ltd\n2C:4D:DE\t\tTecno Mobile Limited\n2C:4E:7D\t\tChunghua Intelligent Network Equipment Inc.\n2C:4F:52\t\tCisco Systems, Inc\n2C:50:89\t\tShenzhen Kaixuan Visual Technology Co.,Limited\n2C:52:AF\t\tHuawei Technologies Co.,Ltd\n2C:53:2B\t\tTCT mobile ltd\n2C:53:4A\t\tShenzhen Winyao Electronic Limited\n2C:53:D7\t\tSonova AG\n2C:54:2D\t\tCisco Systems, Inc\n2C:54:91\t\tMicrosoft Corporation\n2C:54:CF\t\tLG Electronics (Mobile Communications)\n2C:55:3C\t\tVecima Networks Inc.\n2C:55:7C\t\tShenzhen YOUHUA Technology Co., Ltd\n2C:55:D3\t\tHuawei Technologies Co.,Ltd\n2C:56:83\t\tChina Mobile Group Device Co.,Ltd.\n2C:56:DC\t\tASUSTek COMPUTER INC.\n2C:57:2C\t\tAllwinner Technology Co., Ltd\n2C:57:31\t\tWingtech Group (HongKong）Limited\n2C:57:41\t\tCisco Systems, Inc\n2C:57:CE\t\tApple, Inc.\n2C:58:4F\t\tCommscope\n2C:58:B9\t\tHP Inc.\n2C:58:E8\t\tHuawei Technologies Co.,Ltd\n2C:59:8A\t\tLG Electronics (Mobile Communications)\n2C:59:E5\t\tHewlett Packard\n2C:5A:05\t\tNokia Corporation\n2C:5A:0F\t\tCisco Systems, Inc\n2C:5A:8D\t\tSYSTRONIK Elektronik u. Systemtechnik GmbH\n2C:5A:A3\t\tPromate Electronic Co.Ltd\n2C:5B:B8\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n2C:5B:E1\t\tCentripetal Networks, Inc\n2C:5D:34\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n2C:5D:93\t\tRuckus Wireless\n2C:5E:AB\t\tMellanox Technologies, Inc.\n2C:5F:F3\t\tPertronic Industries\n2C:60:0C\t\tQuanta Computer Inc.\n2C:60:CD\t\tNr Electric Co., Ltd\n2C:61:04\t\tShenzhen Fenglian Technology Co., Ltd.\n2C:61:F6\t\tApple, Inc.\n2C:62:5A\t\tFinest Security Systems Co., Ltd\n2C:62:89\t\tRegenersis (Glenrothes) Ltd\n2C:63:73\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n2C:64:1F\t\tVizio, Inc\n2C:64:F6\t\tWu Qi Technologies,Inc.\n2C:66:AD\t\tNimbleTech Digital Inc.\n2C:66:F5\t\tShenzhen Electrical Appliances Co.\n2C:67:98\t\tInTalTech Ltd.\n2C:67:AB\t\tEzelink Telecom\n2C:67:BE\t\tDWnet Technologies(Suzhou) Corporation\n2C:67:FB\t\tShenZhen Zhengjili Electronics Co., LTD\n2C:69:1D\t\tIEEE Registration Authority\n2C:69:1D:00:00:00/28\tHunan Xiangjiang Kunpeng Information Technology Co., Ltd.\n2C:69:1D:10:00:00/28\tKatek Se\n2C:69:1D:20:00:00/28\tAbode Systems Inc\n2C:69:1D:30:00:00/28\tSunsa, Inc\n2C:69:1D:40:00:00/28\tSpeedtech Corp.\n2C:69:1D:50:00:00/28\tLG Electronics Inc.\n2C:69:1D:60:00:00/28\tCarnegie Robotics\n2C:69:1D:70:00:00/28\tShenzhen Gigalight Technology Co., Ltd\n2C:69:1D:80:00:00/28\tIbm\n2C:69:1D:90:00:00/28\tShenzhen Ex-Link Technology Co.,Ltd\n2C:69:1D:A0:00:00/28\tPanasonic Appliances Marketing Asia Pacific\n2C:69:1D:B0:00:00/28\tShenzhen Daren HI-Tech Electronics Co., Ltd.\n2C:69:1D:C0:00:00/28\tAparian, Inc.\n2C:69:1D:D0:00:00/28\tAscentac Inc.\n2C:69:1D:E0:00:00/28\tChengdu Qianhong Communication Co., Ltd.\n2C:69:3E\t\tHuawei Technologies Co.,Ltd\n2C:69:BA\t\tRF Controls, LLC\n2C:69:CC\t\tValeo Detection Systems\n2C:6A:6F\t\tIEEE Registration Authority\n2C:6A:6F:00:00:00/28\tShanghai Shuncom Electronic Technology Co.,Ltd\n2C:6A:6F:10:00:00/28\tELKO EP, s.r.o.\n2C:6A:6F:20:00:00/28\tNanChang LangJie Technology Co.,Ltd\n2C:6A:6F:30:00:00/28\tCloudproject Generation Srl\n2C:6A:6F:40:00:00/28\tTinyco\n2C:6A:6F:50:00:00/28\tShen Zhen Sis Science & Technology Ltd.\n2C:6A:6F:60:00:00/28\tBeep, Inc.\n2C:6A:6F:70:00:00/28\tSm Dsp Co.,Ltd.\n2C:6A:6F:80:00:00/28\tMilbank Manufacturing Co.\n2C:6A:6F:90:00:00/28\tLogic IO Aps\n2C:6A:6F:A0:00:00/28\tWellntel, Inc.\n2C:6A:6F:B0:00:00/28\tSchneider Electric Korea\n2C:6A:6F:C0:00:00/28\tSensity Systems\n2C:6A:6F:D0:00:00/28\tHoljeron\n2C:6A:6F:E0:00:00/28\tEATON FHF Funke + Huster Fernsig GmbH\n2C:6A:6F:F0:00:00/28\tPrivate\n2C:6B:7D\t\tTexas Instruments\n2C:6B:F5\t\tJuniper Networks\n2C:6D:C1\t\tIntel Corporate\n2C:6E:85\t\tIntel Corporate\n2C:6F:37\t\tNokia\n2C:6F:4E\t\tHubei Yuan Times Technology Co.,Ltd.\n2C:6F:51\t\tHerospeed Digital Technology Limited\n2C:6F:C9\t\tHon Hai Precision Ind. Co.,Ltd.\n2C:70:4F\t\tzte corporation\n2C:71:55\t\tHiveMotion\n2C:71:FF\t\tAmazon Technologies Inc.\n2C:72:C3\t\tSoundmatters\n2C:73:60\t\tEarda Technologies co Ltd\n2C:73:A0\t\tCisco Systems, Inc\n2C:75:0F\t\tShanghai Dongzhou-Lawton Communication Technology Co. Ltd.\n2C:75:CB\t\tNovitec Co., Ltd.\n2C:76:00\t\tApple, Inc.\n2C:76:8A\t\tHewlett Packard\n2C:78:0E\t\tHuawei Device Co., Ltd.\n2C:78:4C\t\tIton Technology Corp.\n2C:79:3D\t\tBoditech Med\n2C:79:D7\t\tSagemcom Broadband SAS\n2C:7A:F4\t\tIEEE Registration Authority\n2C:7A:F4:00:00:00/28\tAnnapurna labs\n2C:7A:F4:10:00:00/28\tAnnapurna labs\n2C:7A:F4:20:00:00/28\tDelmatic Limited\n2C:7A:F4:30:00:00/28\tShenzhen Yitoa Digital Technology Co., Ltd.\n2C:7A:F4:40:00:00/28\tKegao Intelligent Garden Technology(Guangdong) Co.,Ltd.\n2C:7A:F4:50:00:00/28\tAnnapurna labs\n2C:7A:F4:60:00:00/28\tShangYu Auto Technology Co.,Ltd\n2C:7A:F4:70:00:00/28\tJinan LinkCtrl IoT Co., Ltd\n2C:7A:F4:80:00:00/28\tXi'an PESCO Electronic Technology Co., Ltd\n2C:7A:F4:90:00:00/28\t4neXt S.r.l.s.\n2C:7A:F4:A0:00:00/28\tRisuntek Inc\n2C:7A:F4:B0:00:00/28\tArira Platforms, LLC\n2C:7A:F4:C0:00:00/28\tReonel Oy\n2C:7A:F4:D0:00:00/28\tFlextronics Automotive USA, Inc\n2C:7A:F4:E0:00:00/28\tNYBSYS Inc\n2C:7B:5A\t\tMilper Ltd\n2C:7B:84\t\tOOO Petr Telegin\n2C:7B:A0\t\tIntel Corporate\n2C:7C:E4\t\tWuhan Tianyu Information Industry Co., Ltd.\n2C:7C:F2\t\tApple, Inc.\n2C:7E:81\t\tCommscope\n2C:7E:CF\t\tOnzo Ltd\n2C:80:65\t\tHARTING Inc. of North America\n2C:81:58\t\tHon Hai Precision Ind. Co.,Ltd.\n2C:81:BF\t\tApple, Inc.\n2C:82:17\t\tApple, Inc.\n2C:86:D2\t\tCisco Systems, Inc\n2C:8A:72\t\tHTC Corporation\n2C:8A:C7\t\tUbee Interactive Co., Limited\n2C:8B:F2\t\tHitachi Metals America Ltd\n2C:8D:37\t\tVirtium\n2C:8D:B1\t\tIntel Corporate\n2C:91:27\t\tEintechno Corporation\n2C:91:AB\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n2C:92:2C\t\tKishu Giken Kogyou Company Ltd,.\n2C:93:FB\t\tSercomm France Sarl\n2C:94:52\t\tHuawei Technologies Co.,Ltd\n2C:94:64\t\tCincoze Co., Ltd.\n2C:95:20\t\tApple, Inc.\n2C:95:69\t\tCommscope\n2C:95:7F\t\tzte corporation\n2C:96:62\t\tInvenit BV\n2C:96:82\t\tMitraStar Technology Corp.\n2C:97:17\t\tI.C.Y. B.V.\n2C:97:B1\t\tHuawei Technologies Co.,Ltd\n2C:97:ED\t\tSony Imaging Products & Solutions Inc.\n2C:98:11\t\tCloud Network Technology Singapore Pte. Ltd.\n2C:99:24\t\tCommscope\n2C:99:75\t\tSamsung Electronics Co.,Ltd\n2C:9A:A4\t\tEolo SpA\n2C:9C:58\t\tCloud Network Technology Singapore Pte. Ltd.\n2C:9D:1E\t\tHuawei Technologies Co.,Ltd\n2C:9D:4B\t\tLavelle Network Private Limited\n2C:9D:5A\t\tFlaircomm Microelectronics,Inc.\n2C:9D:65\t\tvivo Mobile Communication Co., Ltd.\n2C:9E:00\t\tSony Interactive Entertainment Inc.\n2C:9E:5F\t\tCommscope\n2C:9E:E0\t\tCavli Inc.\n2C:9E:EC\t\tJabil Circuit Penang\n2C:9E:FC\t\tCanon Inc.\n2C:9F:FB\t\tWistron Neweb Corporation\n2C:A0:2F\t\tVeroguard Systems Pty Ltd\n2C:A0:42\t\tHuawei Device Co., Ltd.\n2C:A1:57\t\tacromate, Inc.\n2C:A1:7D\t\tCommscope\n2C:A2:B4\t\tFortify Technologies, LLC\n2C:A3:0E\t\tPower Dragon Development Limited\n2C:A3:27\t\tOraimo Technology Limited\n2C:A5:39\t\tParallel Wireless, Inc\n2C:A5:9C\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n2C:A7:74\t\tTexas Instruments\n2C:A7:80\t\tTrue Technologies Inc.\n2C:A7:97\t\tHuawei Technologies Co.,Ltd\n2C:A7:9E\t\tHuawei Technologies Co.,Ltd\n2C:A7:EF\t\tOnePlus Technology (Shenzhen) Co., Ltd\n2C:A8:35\t\tRim\n2C:A8:9C\t\tCreatz inc.\n2C:A9:F0\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n2C:AA:8E\t\tWyze Labs Inc\n2C:AB:00\t\tHuawei Technologies Co.,Ltd\n2C:AB:25\t\tShenzhen Gongjin Electronics Co.,Lt\n2C:AB:33\t\tTexas Instruments\n2C:AB:46\t\tRuckus Wireless\n2C:AB:A4\t\tCisco SPVTG\n2C:AB:EB\t\tCisco Systems, Inc\n2C:AC:44\t\tConextop\n2C:AD:13\t\tShenzhen Zhilu Technology Co.,Ltd\n2C:AE:2B\t\tSamsung Electronics Co.,Ltd\n2C:B0:5D\t\tNetgear\n2C:B0:DF\t\tSoliton Technologies Pvt Ltd\n2C:B0:FD\t\tShenzhen MiaoMing  Intelligent Technology Co.,Ltd\n2C:B1:15\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n2C:B2:1A\t\tPhicomm (Shanghai) Co., Ltd.\n2C:B3:01\t\tHonor Device Co., Ltd.\n2C:B4:3A\t\tApple, Inc.\n2C:B6:8F\t\tHuawei Technologies Co.,Ltd\n2C:B6:93\t\tRadware\n2C:B6:9D\t\tRED Digital Cinema\n2C:B6:C2\t\tzte corporation\n2C:B6:C8\t\tRaisecom Technology CO., LTD\n2C:B7:A1\t\tHuawei Device Co., Ltd.\n2C:B8:ED\t\tSonicWall\n2C:BA:BA\t\tSamsung Electronics Co.,Ltd\n2C:BA:CA\t\tCosonic Electroacoustic Technology Co., Ltd.\n2C:BC:87\t\tApple, Inc.\n2C:BC:BB\t\tEspressif Inc.\n2C:BE:08\t\tApple, Inc.\n2C:BE:97\t\tIngenieurbuero Bickele und Buehler GmbH\n2C:BE:EB\t\tNothing Technology Limited\n2C:BE:EE\t\tNothing Technology Limited\n2C:C1:F4\t\tNokia Solutions and Networks India Private Limited\n2C:C2:53\t\tApple, Inc.\n2C:C2:60\t\tOracle Corporation\n2C:C3:E6\t\tShenzhen Bilian Electronic Co.，Ltd\n2C:C4:07\t\tmachineQ\n2C:C4:4F\t\tIEEE Registration Authority\n2C:C4:4F:00:00:00/28\tShenzhen Syeconmax Technology Co. Ltd\n2C:C4:4F:10:00:00/28\tJoyoful\n2C:C4:4F:20:00:00/28\tVecima Networks Inc.\n2C:C4:4F:30:00:00/28\tsomon\n2C:C4:4F:40:00:00/28\tBeijing Siling Robot Technology Co.,Ltd\n2C:C4:4F:50:00:00/28\tMohan Electronics And Systems (Optivision)\n2C:C4:4F:60:00:00/28\tHM Corporation Ltd.\n2C:C4:4F:70:00:00/28\tNSK Dental Italy\n2C:C4:4F:80:00:00/28\tWuxi Yikesen Intelligent Technology Co., Ltd\n2C:C4:4F:90:00:00/28\tKaspersky Lab Middle-East FZ-LLC\n2C:C4:4F:A0:00:00/28\tShenzhen OneThing Technologies Co.,Ltd.\n2C:C4:4F:B0:00:00/28\tCAMS New Energy Technology Co., Ltd.\n2C:C4:4F:C0:00:00/28\tBeijing Xiaoqu Zhipin Technology Co., Ltd\n2C:C4:4F:D0:00:00/28\tShanghai Fanlian Yunduan Electronic Technology Co.,Ltd\n2C:C4:4F:E0:00:00/28\tElcos srl\n2C:C5:46\t\tHuawei Device Co., Ltd.\n2C:C5:48\t\tIAdea Corporation\n2C:C5:D3\t\tRuckus Wireless\n2C:C6:82\t\tQuectel Wireless Solutions Co.,Ltd.\n2C:C6:A0\t\tLumacron Technology Ltd.\n2C:C8:1B\t\tRouterboard.com\n2C:C8:F5\t\tHuawei Device Co., Ltd.\n2C:CA:0C\t\tWithus Planet\n2C:CA:16\t\tApple, Inc.\n2C:CA:75\t\tRobert Bosch GmbH AnP\n2C:CC:15\t\tNokia Corporation\n2C:CC:44\t\tSony Interactive Entertainment Inc.\n2C:CC:E6\t\tSkyworth Digital Technology(Shenzhen) Co.,Ltd\n2C:CD:27\t\tPrecor Inc\n2C:CD:43\t\tSummit Technology Group\n2C:CD:69\t\tAqavi.com\n2C:CE:1E\t\tCloudtronics Pty Ltd\n2C:CF:58\t\tHuawei Technologies Co.,Ltd\n2C:CF:67\t\tRaspberry Pi (Trading) Ltd\n2C:D0:2D\t\tCisco Systems, Inc\n2C:D0:5A\t\tLiteon Technology Corporation\n2C:D0:66\t\tXiaomi Communications Co Ltd\n2C:D1:41\t\tIEEE Registration Authority\n2C:D1:41:00:00:00/28\tiCIRROUND Inc\n2C:D1:41:10:00:00/28\tEzee Systems Limited\n2C:D1:41:20:00:00/28\tIntelliLUM\n2C:D1:41:30:00:00/28\tAOptix Technologies, Inc\n2C:D1:41:40:00:00/28\tShanghai RW ELE&TEC CO.,LTD\n2C:D1:41:50:00:00/28\tZenic Inc.\n2C:D1:41:60:00:00/28\tBowei Technology Company Limited\n2C:D1:41:70:00:00/28\tXiaMen 35.com Technology Co,.Ltd.\n2C:D1:41:80:00:00/28\tMinno LLC\n2C:D1:41:90:00:00/28\tBeijing Hexing Chuangxiang Technology Co., Ltd.\n2C:D1:41:A0:00:00/28\tFiberroad Technology Co., Ltd.\n2C:D1:41:B0:00:00/28\tResus Industries\n2C:D1:41:C0:00:00/28\tPIN SHANG LED Co., LTD.\n2C:D1:41:D0:00:00/28\tSquare Inc.\n2C:D1:41:E0:00:00/28\tCita Smart Solutions Ltd\n2C:D1:41:F0:00:00/28\tPrivate\n2C:D1:C6\t\tMurata Manufacturing Co., Ltd.\n2C:D1:DA\t\tKeysight Technologies, Inc.\n2C:D2:6B\t\tFn-Link Technology Limited\n2C:D2:E3\t\tGuangzhou Aoshi Electronic Co.,Ltd\n2C:D2:E7\t\tNokia Corporation\n2C:D3:AD\t\tTexas Instruments\n2C:D4:44\t\tFujitsu Limited\n2C:D7:FF\t\tLANCOM Systems GmbH\n2C:D8:AE\t\tShenzhen SEI Robotics Co.,Ltd\n2C:D8:DE\t\tAltoBeam Inc.\n2C:D9:74\t\tHui Zhou Gaoshengda Technology Co.,LTD\n2C:DA:3F\t\tDongGuan Ramaxel Memory Technology Limited\n2C:DA:46\t\tSamsung Electronics Co.,Ltd\n2C:DB:07\t\tIntel Corporate\n2C:DC:78\t\tDescartes Systems (USA) LLC\n2C:DC:AD\t\tWistron Neweb Corporation\n2C:DC:C1\t\tEM Microelectronic\n2C:DC:D7\t\tAzureWave Technology Inc.\n2C:DD:0C\t\tDiscovergy GmbH\n2C:DD:5F\t\tShenzhen iComm Semiconductor CO.,LTD\n2C:DD:95\t\tTaicang T&W Electronics\n2C:DD:A3\t\tPoint Grey Research Inc.\n2C:DD:E9\t\tArista Networks\n2C:DE:DF\t\tGuangxi Konaixin Precision Technology Co., Ltd\n2C:DF:68\t\tApple, Inc.\n2C:DF:E6\t\tRaisecom Technology CO., LTD\n2C:E0:32\t\tTCL King Electrical Appliances(Huizhou)Co.,Ltd\n2C:E0:99\t\tFujian Star-Net Communication Co.,Ltd\n2C:E2:A8\t\tDeviceDesign\n2C:E2:D9\t\tHuawei Device Co., Ltd.\n2C:E3:10\t\tStratacache\n2C:E3:8E\t\tCisco Systems, Inc\n2C:E4:12\t\tSagemcom Broadband SAS\n2C:E6:CC\t\tRuckus Wireless\n2C:E8:71\t\tAlert Metalguard ApS\n2C:EA:7F\t\tDell Inc.\n2C:EA:DA\t\tICC Intelligent Platforms GmbH\n2C:EA:DC\t\tAskey Computer Corp\n2C:EC:A6\t\tHuawei Technologies Co.,Ltd\n2C:EC:F7\t\tShenzhen SDMC Technology CO.,Ltd.\n2C:ED:89\t\tHuawei Technologies Co.,Ltd\n2C:ED:B0\t\tHuawei Technologies Co.,Ltd\n2C:ED:EB\t\tAlpheus Digital Company Limited\n2C:EE:26\t\tPetroleum Geo-Services\n2C:F0:5D\t\tMicro-Star INTL CO., LTD.\n2C:F0:A2\t\tApple, Inc.\n2C:F0:EE\t\tApple, Inc.\n2C:F1:BB\t\tzte corporation\n2C:F2:03\t\tEmko Elektronik San Ve Tic As\n2C:F2:95\t\tHuawei Device Co., Ltd.\n2C:F2:A5\t\tSagemcom Broadband SAS\n2C:F4:32\t\tEspressif Inc.\n2C:F4:C5\t\tAvaya Inc\n2C:F7:F1\t\tSeeed Technology Inc.\n2C:F8:14\t\tCisco Systems, Inc\n2C:F8:9B\t\tCisco Systems, Inc\n2C:FA:A2\t\tAlcatel-Lucent Enterprise\n2C:FB:0F\t\tSagemcom Broadband SAS\n2C:FC:8B\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n2C:FC:E4\t\tCTEK Sweden AB\n2C:FD:37\t\tBlue Calypso, Inc.\n2C:FD:A1\t\tASUSTek COMPUTER INC.\n2C:FD:AB\t\tMotorola (Wuhan) Mobility Technologies Communication Co., Ltd.\n2C:FD:B3\t\tTonly Technology Co. Ltd\n2C:FD:B4\t\tShenzhen Jingxun Software Telecommunication Technology Co.,Ltd\n2C:FE:4F\t\tXiaomi Communications Co Ltd\n2C:FE:8B\t\tMicrochip Technologies Inc\n2C:FE:E2\t\tQingdao Hisense Communications Co.,Ltd.\n2C:FF:65\t\tOki Electric Industry Co., Ltd.\n2C:FF:EE\t\tvivo Mobile Communication Co., Ltd.\n30:00:FC\t\tNokia\n30:01:AF\t\tCisco Systems, Inc\n30:03:C8\t\tCloud Network Technology Singapore Pte. Ltd.\n30:04:5C\t\tShenzhen SuperElectron Technology Co.,Ltd.\n30:04:75\t\tQbic Communications Dmcc\n30:05:05\t\tIntel Corporate\n30:05:3F\t\tJTI Co.,Ltd.\n30:05:5C\t\tBrother industries, LTD.\n30:07:4D\t\tSamsung Electro-Mechanics(Thailand)\n30:09:C0\t\tMotorola Mobility LLC, a Lenovo Company\n30:09:F9\t\tIEEE Registration Authority\n30:09:F9:00:00:00/28\tHurray Cloud Technology Co., Ltd.\n30:09:F9:10:00:00/28\tShenzhen Sunvell Electronics Co., Ltd.\n30:09:F9:20:00:00/28\tBeijing Netswift Technology Co.,Ltd.\n30:09:F9:30:00:00/28\tOOO \"Microlink-Svyaz\"\n30:09:F9:40:00:00/28\tPunkt Tronics AG\n30:09:F9:50:00:00/28\tVelsitec-Clibase\n30:09:F9:60:00:00/28\tBeijing Mydreamplus Information Technology Co., Ltd.\n30:09:F9:70:00:00/28\tMaytronics Ltd.\n30:09:F9:80:00:00/28\tessence security\n30:09:F9:90:00:00/28\tBonraybio\n30:09:F9:A0:00:00/28\tShenzhen Tencent Computer System Co., Ltd.\n30:09:F9:B0:00:00/28\tSichuan Nebula Networks Co.,LTD.\n30:09:F9:C0:00:00/28\tHoneywell\n30:09:F9:D0:00:00/28\tTechnology for Humankind\n30:09:F9:E0:00:00/28\tZhongLi HengFeng (Shenzhen) Technology co.,Ltd.\n30:0A:60\t\tIEEE Registration Authority\n30:0A:60:00:00:00/28\tKAZUtechnica Co.,Ltd.\n30:0A:60:10:00:00/28\tBeijing Ruiteng Zhongtian TECH Ltd.,Co\n30:0A:60:20:00:00/28\tAdvanced Electronic Designs, Inc.\n30:0A:60:30:00:00/28\tIntergard do Brasil Ind e Com de Eletr e Mec Ltda\n30:0A:60:40:00:00/28\tAvic Jonhon Optronic Technology Co., Ltd.\n30:0A:60:50:00:00/28\tA9\n30:0A:60:60:00:00/28\tRealtime biometrics India pvt ltd\n30:0A:60:70:00:00/28\tNewtons4th Ltd\n30:0A:60:80:00:00/28\tBronkhorst High-Tech BV\n30:0A:60:90:00:00/28\tWINTEK System Co., Ltd\n30:0A:60:A0:00:00/28\tAmpetronic Ltd\n30:0A:60:B0:00:00/28\tGiax GmbH\n30:0A:60:C0:00:00/28\tThermo Process Instruments, LP\n30:0A:60:D0:00:00/28\tSixth Energy Technologies Private Limited\n30:0A:60:E0:00:00/28\tImageo s.r.o.\n30:0A:9D\t\tAxino Solutions AG\n30:0A:C5\t\tRuio telecommunication technologies Co., Limited\n30:0B:9C\t\tDelta Mobile Systems, Inc.\n30:0C:23\t\tzte corporation\n30:0D:2A\t\tZhejiang Wellcom Technology Co.,Ltd.\n30:0D:43\t\tMicrosoft Mobile Oy\n30:0D:9E\t\tRuijie Networks Co.,LTD\n30:0E:B8\t\tLG Electronics\n30:0E:D5\t\tHon Hai Precision Ind. Co.,Ltd.\n30:0E:E3\t\tAquantia Corporation\n30:10:B3\t\tLiteon Technology Corporation\n30:10:E4\t\tApple, Inc.\n30:13:89\t\tSiemens AG, Automations & Drives,\n30:13:8B\t\tHP Inc.\n30:14:2D\t\tPiciorgros GmbH\n30:14:4A\t\tWistron Neweb Corporation\n30:15:18\t\tUbiquitous Communication Co. ltd.\n30:16:8D\t\tProLon\n30:16:9D\t\tMercusys Technologies Co., Ltd.\n30:17:C8\t\tSony Corporation\n30:18:CF\t\tDEOS control systems GmbH\n30:19:66\t\tSamsung Electronics Co.,Ltd\n30:19:84\t\tHuawei Technologies Co.,Ltd\n30:1A:28\t\tMako Networks Ltd\n30:1A:30\t\tMako Networks Ltd\n30:1A:BA\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n30:1B:97\t\tLierda Science & Technology Group Co.,Ltd\n30:1D:49\t\tFirmus Technologies Pty Ltd\n30:1F:48\t\tzte corporation\n30:1F:9A\t\tIEEE Registration Authority\n30:1F:9A:00:00:00/28\tIlsan Electronics\n30:1F:9A:10:00:00/28\tDewesoft d.o.o.\n30:1F:9A:20:00:00/28\tCHISON Medical Technologies Co., Ltd.\n30:1F:9A:30:00:00/28\tMicomsoft Co.,Ltd.\n30:1F:9A:40:00:00/28\tNCM Supplies, Inc.\n30:1F:9A:50:00:00/28\tBeijing Surestar Technology Co. Ltd,\n30:1F:9A:60:00:00/28\tYiSheng technology  co.,LTD\n30:1F:9A:70:00:00/28\tTriax A/S\n30:1F:9A:80:00:00/28\tFine Triumph Technology Corp.,Ltd.\n30:1F:9A:90:00:00/28\tDeep Sentinel\n30:1F:9A:A0:00:00/28\tHunan Changsha Hengjian Technoldgy Develpment Co.,Ltd.\n30:1F:9A:B0:00:00/28\tSmart Component Technologies LTD\n30:1F:9A:C0:00:00/28\tOrigami Group Limited\n30:1F:9A:D0:00:00/28\tOLIMEX Ltd\n30:1F:9A:E0:00:00/28\tShenzhen Fengliyuan Energy Conservating Technology Co. Ltd\n30:21:5B\t\tShenzhen Ostar Display Electronic Co.,Ltd\n30:23:03\t\tBelkin International Inc.\n30:23:64\t\tNokia Shanghai Bell Co., Ltd.\n30:23:BA\t\tAccelerated Memory Production Inc.\n30:23:CD\t\tFujian Star-Net Communication Co.,Ltd\n30:24:32\t\tIntel Corporate\n30:24:50\t\tHangzhou Huacheng Network Technology Co.,Ltd\n30:24:78\t\tSagemcom Broadband SAS\n30:24:A9\t\tHP Inc.\n30:27:CF\t\tCanopy Growth Corp\n30:29:2B\t\teero inc.\n30:29:4B\t\tHuawei Technologies Co.,Ltd\n30:29:52\t\tHillstone Networks Inc\n30:29:BE\t\tShanghai MRDcom Co.,Ltd\n30:2B:DC\t\tTop-Unum Electronics Co., LTD\n30:2D:E8\t\tJDA, LLC (JDA Systems)\n30:2F:1E\t\tSiemens Ag\n30:2F:AC\t\tZhejiang HuaRay Technology Co.,Ltd\n30:30:5F\t\tValeo Schalter und Sensoren GmbH\n30:30:D0\t\tTexas Instruments\n30:30:F9\t\tEspressif Inc.\n30:31:7D\t\tHosiden Corporation\n30:31:80\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n30:32:35\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\n30:32:94\t\tW-IE-NE-R Plein & Baus GmbH\n30:32:D4\t\tHanilstm Co., Ltd.\n30:33:35\t\tBoosty\n30:34:22\t\teero inc.\n30:34:D2\t\tAvailink, Inc.\n30:34:DB\t\tLG Innotek\n30:34:F6\t\tVantiva Connected Home - Subcomponents\n30:35:AD\t\tApple, Inc.\n30:35:C5\t\tHuawei Device Co., Ltd.\n30:37:A6\t\tCisco Systems, Inc\n30:37:B3\t\tHuawei Technologies Co.,Ltd\n30:38:55\t\tNokia Corporation\n30:39:26\t\tSony Corporation\n30:39:55\t\tShenzhen Jinhengjia Electronic Co., Ltd.\n30:39:A9\t\tHongshan Information Science and Technology (HangZhou) Co.,Ltd.\n30:39:F2\t\tADB Broadband Italia\n30:3A:4A\t\teero inc.\n30:3A:64\t\tIntel Corporate\n30:3A:BA\t\tGuangzhou BaoLun Electronics Co., Ltd\n30:3B:49\t\tCisco Meraki\n30:3B:7C\t\tApple, Inc.\n30:3D:08\t\tGlintt Tes S.A.\n30:3D:51\t\tIEEE Registration Authority\n30:3D:51:00:00:00/28\tFink Telecom Services GmbH\n30:3D:51:10:00:00/28\tShenzhen Wlink Technology Co., Ltd.\n30:3D:51:20:00:00/28\tHarman Connected Services Corporation India Pvt. Ltd.\n30:3D:51:30:00:00/28\tS & A Systems\n30:3D:51:40:00:00/28\tDspread Technology (Beijing) Inc.\n30:3D:51:50:00:00/28\tMedia Hub Digital Smart Home Pty Ltd.\n30:3D:51:60:00:00/28\tAmber-Link Network Technology Co.,Ltd.\n30:3D:51:70:00:00/28\tDestiny Automate Limited\n30:3D:51:80:00:00/28\tThe Heil Co dba AWTI 3rd Eye Cam\n30:3D:51:90:00:00/28\tAnnapurna labs\n30:3D:51:A0:00:00/28\tTeraNXT Global India Pvt Ltd.\n30:3D:51:B0:00:00/28\tLabman Automation\n30:3D:51:C0:00:00/28\tTalkGo, Inc.\n30:3D:51:D0:00:00/28\tXOR UK Corporation Limited\n30:3D:51:E0:00:00/28\tPercent.com\n30:3E:A7\t\tIntel Corporate\n30:3E:AD\t\tSonavox Canada Inc\n30:3F:5D\t\tPt Han Sung Electoronics Indonesia\n30:3F:7B\t\tShenzhen YOUHUA Technology Co., Ltd\n30:3F:BB\t\tHewlett Packard Enterprise\n30:40:74\t\tzte corporation\n30:41:74\t\tAltec Lansing Llc\n30:42:25\t\tBurg-Wächter Kg\n30:42:40\t\tzte corporation\n30:42:A1\t\tilumisys Inc. DBA Toggled\n30:43:D7\t\tIEEE Registration Authority\n30:43:D7:00:00:00/28\tSymes Sa\n30:43:D7:10:00:00/28\tShenzhen juduoping Technology Co.,Ltd\n30:43:D7:20:00:00/28\tApollo Infoways Private Limited\n30:43:D7:30:00:00/28\tLuxshare Electronic Technology (Kunshan) LTD\n30:43:D7:40:00:00/28\tFiberme Communications Llc\n30:43:D7:50:00:00/28\tShenzhen Mees Hi-Tech Co., Ltd\n30:43:D7:60:00:00/28\tSprocomm Technologies Co., Ltd.Guangming Branch\n30:43:D7:70:00:00/28\tDIGICITI Technology Co.,Ltd\n30:43:D7:80:00:00/28\tKesu (Shanghai) Electronic Technology Co., Ltd\n30:43:D7:90:00:00/28\tPK Solutions LLC\n30:43:D7:A0:00:00/28\tBodhi\n30:43:D7:B0:00:00/28\tMotec GmbH\n30:43:D7:C0:00:00/28\tXiaoniu network technology (Shanghai) Co., Ltd.\n30:43:D7:D0:00:00/28\tAnnapurna labs\n30:43:D7:E0:00:00/28\tGuangdong Hongqin Telecom  Technology Co. Ltd.\n30:44:49\t\tPLATH Signal Products GmbH & Co. KG\n30:44:87\t\tHefei Radio Communication Technology Co., Ltd\n30:44:A1\t\tShanghai Nanchao Information Technology\n30:45:11\t\tTexas Instruments\n30:45:96\t\tHuawei Technologies Co.,Ltd\n30:46:9A\t\tNetgear\n30:49:3B\t\tNanjing Z-Com Wireless Co.,Ltd\n30:49:50\t\tIEEE Registration Authority\n30:49:50:00:00:00/28\tGuangzhou Lian-med Technology Co.,Ltd.\n30:49:50:10:00:00/28\tAtli World Limited\n30:49:50:20:00:00/28\tSercomm Corporation.\n30:49:50:30:00:00/28\tMorgan Schaffer\n30:49:50:40:00:00/28\tAdvanced Microwave Engineering Srl\n30:49:50:50:00:00/28\tIK Elektronik GmbH\n30:49:50:60:00:00/28\tCurb, Inc.\n30:49:50:70:00:00/28\tShenzhen iTG robot Co.,Ltd.\n30:49:50:80:00:00/28\tShenzhen Ldrobot Co., Ltd.\n30:49:50:90:00:00/28\tShanghai gatang technology CO.,LTD\n30:49:50:A0:00:00/28\tLedworks SRL\n30:49:50:B0:00:00/28\tHangzhou Ev-Tech Co.,Ltd\n30:49:50:C0:00:00/28\tAnacove LLC\n30:49:50:D0:00:00/28\tMerlyn Mind, Inc.\n30:49:50:E0:00:00/28\tIoTmaxx GmbH\n30:49:9E\t\tHuawei Technologies Co.,Ltd\n30:4A:26\t\tShenzhen Trolink Technology CO, LTD\n30:4A:C4\t\tBarrot Technology Co.,LTD\n30:4B:07\t\tMotorola Mobility LLC, a Lenovo Company\n30:4C:7E\t\tPanasonic Electric Works Automation Controls Techno Co.,Ltd.\n30:4E:1B\t\tHuawei Device Co., Ltd.\n30:4E:C3\t\tTianjin Techua Technology Co., Ltd.\n30:4F:00\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n30:4F:75\t\tZhone Technologies, Inc.\n30:50:75\t\tGN Audio A/S\n30:50:CE\t\tXiaomi Communications Co Ltd\n30:50:F1\t\tEnnoconn Corporation.\n30:50:FD\t\tSkyworth Digital Technology(Shenzhen) Co.,Ltd\n30:51:F8\t\tBYK-Gardner GmbH\n30:52:23\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n30:52:53\t\tBuildJet, Inc.\n30:52:5A\t\tNST Co., LTD\n30:52:CB\t\tLiteon Technology Corporation\n30:53:C1\t\tCresyn\n30:55:ED\t\tTrex Network LLC\n30:56:0F\t\tGIGA-BYTE TECHNOLOGY CO. , Ltd.\n30:56:84\t\tShenzhen Yunji Intelligent Technology Co.,Ltd\n30:56:96\t\tInfinix mobility limited\n30:57:14\t\tApple, Inc.\n30:57:8E\t\teero inc.\n30:57:AC\t\tIrlab Ltd.\n30:58:90\t\tFrontier Silicon Ltd\n30:58:EB\t\tzte corporation\n30:59:5B\t\tstreamnow AG\n30:59:B7\t\tMicrosoft\n30:5A:3A\t\tASUSTek COMPUTER INC.\n30:5A:99\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n30:5D:38\t\tBeissbarth\n30:5D:A6\t\tADVALY SYSTEM Inc.\n30:5F:77\t\tNew H3C Technologies Co., Ltd\n30:60:0A\t\tCig Shanghai Co Ltd\n30:60:23\t\tCommscope\n30:61:12\t\tPAV GmbH\n30:61:18\t\tParadom Inc.\n30:61:A2\t\tHuawei Technologies Co.,Ltd\n30:63:6B\t\tApple, Inc.\n30:63:71\t\tShenzhenshi Xinzhongxin Technology Co.Ltd\n30:63:CF\t\tZhejiang Cainiao Supply Chain Management Co., Ltd\n30:63:EA\t\tJuniper Networks\n30:65:EC\t\tWistron (ChongQing)\n30:66:D0\t\tHuawei Device Co., Ltd.\n30:67:A1\t\tSagemcom Broadband SAS\n30:68:8C\t\tReach Technology Inc.\n30:68:93\t\tTP-Link Systems Inc.\n30:69:4B\t\tRim\n30:6A:85\t\tSamsung Electronics Co.,Ltd\n30:6C:BE\t\tSkymotion Technology (HK) Limited\n30:6D:F9\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n30:6E:5C\t\tValidus Technologies\n30:6F:07\t\tNations Technologies Inc.\n30:71:B2\t\tHangzhou Prevail Optoelectronic Equipment Co.,LTD.\n30:73:50\t\tInpeco SA\n30:74:67\t\tSamsung Electronics Co.,Ltd\n30:74:96\t\tHuawei Technologies Co.,Ltd\n30:75:12\t\tSony Corporation\n30:76:6F\t\tLG Electronics (Mobile Communications)\n30:77:CB\t\tMaike Industry(Shenzhen)CO.,LTD\n30:78:5C\t\tPartow Tamas Novin (Parman)\n30:78:6B\t\tTIANJIN Golden Pentagon Electronics Co., Ltd.\n30:78:C2\t\tInnowireless / QUCELL Networks\n30:78:D3\t\tVirgilant Technologies Ltd.\n30:7A:57\t\tAccuenergy (CANADA) Inc\n30:7B:AC\t\tNew H3C Technologies Co., Ltd\n30:7B:C9\t\tShenzhen Bilian Electronic Co.，Ltd\n30:7C:30\t\tRim\n30:7C:4A\t\tHuawei Device Co., Ltd.\n30:7C:5E\t\tJuniper Networks\n30:7C:B2\t\tAnov France\n30:7E:CB\t\tSfr\n30:7F:10\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n30:80:9B\t\tNew H3C Technologies Co., Ltd\n30:82:16\t\tApple, Inc.\n30:83:98\t\tEspressif Inc.\n30:83:D2\t\tMotorola Mobility LLC, a Lenovo Company\n30:84:54\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n30:85:A9\t\tASUSTek COMPUTER INC.\n30:85:EB\t\tFiberhome Telecommunication Technologies Co.,LTD\n30:86:2D\t\tArista Network, Inc.\n30:86:F1\t\tFiberhome Telecommunication Technologies Co.,LTD\n30:87:30\t\tHuawei Technologies Co.,Ltd\n30:87:D9\t\tRuckus Wireless\n30:88:41\t\tSichuan AI-Link Technology Co., Ltd.\n30:89:44\t\tDEVA Broadcast Ltd.\n30:89:4A\t\tIntel Corporate\n30:89:76\t\tDalian Lamba Technology Co.,Ltd\n30:89:99\t\tGuangdong East Power Co.,\n30:89:A6\t\tHuawei Technologies Co.,Ltd\n30:89:D3\t\tHongkong Ucloudlink Network Technology Limited\n30:8A:F7\t\tHuawei Device Co., Ltd.\n30:8B:B2\t\tCisco Systems, Inc\n30:8C:FB\t\tDropcam\n30:8D:99\t\tHewlett Packard\n30:8D:D4\t\tHuawei Technologies Co.,Ltd\n30:8E:7A\t\tShenzhen iComm Semiconductor CO.,LTD\n30:8E:CF\t\tHuawei Technologies Co.,Ltd\n30:90:48\t\tApple, Inc.\n30:90:AB\t\tApple, Inc.\n30:91:76\t\tSkyworth Digital Technology(Shenzhen) Co.,Ltd\n30:91:8F\t\tTechnicolor Delivery Technologies Belgium NV\n30:92:F6\t\tShanghai Sunmon Communication Technogy Co.,Ltd\n30:93:BC\t\tSagemcom Broadband SAS\n30:94:35\t\tvivo Mobile Communication Co., Ltd.\n30:95:87\t\tHunan Fn-Link Technology Limited\n30:95:E3\t\tShanghai Simcom Limited\n30:96:10\t\tHuawei Device Co., Ltd.\n30:96:3B\t\tHuawei Device Co., Ltd.\n30:96:FB\t\tSamsung Electronics Co.,Ltd\n30:99:35\t\tzte corporation\n30:9B:AD\t\tBbk Educational Electronics Corp.,Ltd.\n30:9C:23\t\tMicro-Star INTL CO., LTD.\n30:9E:1D\t\tOhsung\n30:9E:62\t\tHuawei Technologies Co.,Ltd\n30:9F:FB\t\tArdomus Networks Corporation\n30:A0:23\t\tRock Path S.R.L\n30:A1:76\t\tFiberhome Telecommunication Technologies Co.,LTD\n30:A1:FA\t\tHuawei Technologies Co.,Ltd\n30:A2:20\t\tARG Telecom\n30:A2:43\t\tShenzhen Prifox Innovation Technology Co., Ltd.\n30:A2:C2\t\tHuawei Device Co., Ltd.\n30:A3:0F\t\tHuawei Technologies Co.,Ltd\n30:A3:B5\t\tJiangsu Best Tone Information Service Co., Ltd\n30:A4:52\t\tArrival Elements BV\n30:A6:12\t\tShenZhen Hugsun Technology Co.,Ltd.\n30:A8:89\t\tDecimator Design\n30:A8:DB\t\tSony Corporation\n30:A9:98\t\tHuawei Device Co., Ltd.\n30:A9:DE\t\tLG Innotek\n30:AA:BD\t\tShanghai Reallytek Information Technology Co.,Ltd\n30:AA:E4\t\tHuawei Device Co., Ltd.\n30:AB:6A\t\tSamsung Electro-Mechanics(Thailand)\n30:AC:ED\t\tPacket Clearing House\n30:AE:7B\t\tDeqing Dusun Electron CO., LTD\n30:AE:A4\t\tEspressif Inc.\n30:AE:F6\t\tRadio Mobile Access\n30:AF:7E\t\tTexas Instruments\n30:AF:CE\t\tvivo Mobile Communication Co., Ltd.\n30:B0:37\t\tNew H3C Technologies Co., Ltd\n30:B0:EA\t\tShenzhen Chuangxin Internet Communication Technology Co., Ltd\n30:B1:64\t\tPower Electronics International Inc.\n30:B1:B5\t\tArcadyan Corporation\n30:B2:16\t\tHitachi Energy Germany AG\n30:B2:37\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n30:B2:9F\t\tEvident Corporation\n30:B3:46\t\tCjsc Norsi-Trans\n30:B3:A2\t\tShenzhen Heguang Measurement & Control Technology Co.,Ltd\n30:B4:9E\t\tTp-Link Technologies Co.,Ltd.\n30:B4:B8\t\tLG Electronics\n30:B5:C2\t\tTp-Link Technologies Co.,Ltd.\n30:B5:F1\t\tAitexin Technology Co., Ltd\n30:B6:2D\t\tMojo Networks, Inc.\n30:B6:4F\t\tJuniper Networks\n30:B7:D4\t\tHitron Technologies. Inc\n30:B8:51\t\tSiemens AG\n30:B9:30\t\tzte corporation\n30:B9:B0\t\tIntracom Asia Co., Ltd\n30:BB:43\t\tSixi Networks Co., Ltd\n30:BB:7D\t\tOnePlus Technology (Shenzhen) Co., Ltd\n30:BD:13\t\tZyxel Communications Corporation\n30:BD:FE\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n30:BE:29\t\tAltoBeam Inc.\n30:BE:3B\t\tMitsubishi Electric Corporation\n30:C0:1B\t\tShenzhen Jingxun Software Telecommunication Technology Co.,Ltd\n30:C0:AE\t\tApple, Inc.\n30:C3:D9\t\tAlpsalpine Co,.Ltd\n30:C5:07\t\tECI Telecom Ltd.\n30:C5:0F\t\tHuawei Technologies Co.,Ltd\n30:C5:99\t\tASUSTek COMPUTER INC.\n30:C6:AB\t\tzte corporation\n30:C6:D7\t\tNew H3C Technologies Co., Ltd\n30:C6:F7\t\tEspressif Inc.\n30:C7:50\t\tMIC Technology Group\n30:C7:AE\t\tSamsung Electronics Co.,Ltd\n30:C8:2A\t\tWI-BIZ srl\n30:C9:1B\t\tZhen Shi Information Technology（Shanghai）Co.,Ltd.\n30:C9:22\t\tEspressif Inc.\n30:C9:AB\t\tCloud Network Technology Singapore Pte. Ltd.\n30:C9:CC\t\tSamsung Electronics Co.,Ltd\n30:CB:36\t\tBelden Singapore Pte. Ltd.\n30:CB:C7\t\tCambium Networks Limited\n30:CB:F8\t\tSamsung Electronics Co.,Ltd\n30:CC:21\t\tzte corporation\n30:CD:A7\t\tSamsung Electronics Co.,Ltd\n30:D0:42\t\tDell Inc.\n30:D1:6B\t\tLiteon Technology Corporation\n30:D1:7E\t\tHuawei Technologies Co.,Ltd\n30:D3:2D\t\tdevolo AG\n30:D3:57\t\tLogosol, Inc.\n30:D3:86\t\tzte corporation\n30:D4:6A\t\tAutosales Incorporated\n30:D4:E2\t\tHuawei Technologies Co.,Ltd\n30:D5:1F\t\tProlights\n30:D5:3E\t\tApple, Inc.\n30:D5:87\t\tSamsung Electronics Co.,Ltd\n30:D6:59\t\tMerging Technologies SA\n30:D6:C9\t\tSamsung Electronics Co.,Ltd\n30:D7:A1\t\tApple, Inc.\n30:D8:75\t\tApple, Inc.\n30:D9:41\t\tRaydium Semiconductor Corp.\n30:D9:59\t\tShanghai Longcheer Technology Co., Ltd.\n30:D9:7F\t\tTech4home, Lda\n30:D9:D9\t\tApple, Inc.\n30:DC:E7\t\tzte corporation\n30:DD:AA\t\tZhejiang Dahua Technologyco.,Ltd\n30:DE:4B\t\tTP-Link Systems Inc\n30:DE:86\t\tCedac Software S.r.l.\n30:DF:17\t\tAlpsalpine Co,.Ltd\n30:DF:8D\t\tShenzhen Gongjin Electronics Co.,Lt\n30:E0:4F\t\tApple, Inc.\n30:E0:90\t\tGenevisio Ltd.\n30:E1:71\t\tHewlett Packard\n30:E1:F1\t\tIntelbras\n30:E2:71\t\tFsas Technologies Inc.\n30:E2:83\t\tTexas Instruments\n30:E3:7A\t\tIntel Corporate\n30:E3:96\t\tHuawei Device Co., Ltd.\n30:E3:A4\t\tIntel Corporate\n30:E3:D6\t\tSpotify USA Inc.\n30:E4:8E\t\tVodafone UK\n30:E4:D8\t\tHuawei Device Co., Ltd.\n30:E4:DB\t\tCisco Systems, Inc\n30:E7:BC\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n30:E8:E4\t\tQorvo International Pte. Ltd.\n30:E9:8E\t\tHuawei Technologies Co.,Ltd\n30:EA:26\t\tSycada BV\n30:EB:15\t\tHuawei Device Co., Ltd.\n30:EB:1F\t\tSkylab M&C Technology Co.,Ltd\n30:EB:25\t\tIntek Digital\n30:EB:5A\t\tLandis + Gyr\n30:EC:7C\t\tShenzhen Along Electronics Co., Ltd\n30:ED:96\t\tLS Mecapion\n30:ED:A0\t\tEspressif Inc.\n30:EF:D1\t\tAlstom Strongwish (Shenzhen) Co., Ltd.\n30:F0:28\t\tBosch Sicherheitssysteme GmbH\n30:F2:3C\t\tTecno Mobile Limited\n30:F3:1D\t\tzte corporation\n30:F3:35\t\tHuawei Technologies Co.,Ltd\n30:F3:3A\t\t+plugg srl\n30:F4:2F\t\tEsp\n30:F5:27\t\tNew H3C Technologies Co., Ltd\n30:F6:00\t\tSagemcom Broadband SAS\n30:F6:B9\t\tEcocentric Energy\n30:F6:EF\t\tIntel Corporate\n30:F7:0D\t\tCisco Systems, Inc\n30:F7:72\t\tHon Hai Precision Ind. Co.,Ltd.\n30:F7:7F\t\tS Mobile Devices Limited\n30:F7:C5\t\tApple, Inc.\n30:F7:D7\t\tThread Technology Co., Ltd\n30:F8:56\t\tExtreme Networks Headquarters\n30:F9:47\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n30:F9:4B\t\tUniversal Electronics, Inc.\n30:F9:ED\t\tSony Corporation\n30:FA:B7\t\tTunai Creative\n30:FB:10\t\tSilicon Laboratories\n30:FB:68\t\tWuhan Zmvision Technology Co. Ltd.\n30:FB:94\t\tShanghai Fangzhiwei Information Technology CO.,Ltd.\n30:FB:B8\t\tHuawei Technologies Co.,Ltd\n30:FC:68\t\tTp-Link Technologies Co.,Ltd.\n30:FC:8C\t\tVantiva - Connected Home\n30:FC:EB\t\tLG Electronics (Mobile Communications)\n30:FD:11\t\tMacrotech (Usa) Inc.\n30:FD:38\t\tGoogle, Inc.\n30:FD:65\t\tHuawei Technologies Co.,Ltd\n30:FE:31\t\tNokia\n30:FE:6C\t\tApple, Inc.\n30:FE:FA\t\tCisco Systems, Inc\n30:FF:F6\t\tHangZhou KuoHeng Technology Co.,ltd\n30:FF:FD\t\tHuawei Technologies Co.,Ltd\n34:00:8A\t\tIEEE Registration Authority\n34:00:8A:00:00:00/28\tAngee Technologies Ltd.\n34:00:8A:10:00:00/28\tZQAM Communications\n34:00:8A:20:00:00/28\tRPE \"Monitor\"\n34:00:8A:30:00:00/28\tGlobex 99 LTD\n34:00:8A:40:00:00/28\tFotonic i Norden AB\n34:00:8A:50:00:00/28\tFederal Aviation Administration\n34:00:8A:60:00:00/28\tSithon Technologies\n34:00:8A:70:00:00/28\tuberGARD Pte. Ltd.\n34:00:8A:80:00:00/28\tShenzhen Andakai Technologies Co., Ltd.\n34:00:8A:90:00:00/28\tKeruyun Technoligies(Beijing) Corporation Limited\n34:00:8A:A0:00:00/28\tHibertek International Limited\n34:00:8A:B0:00:00/28\tProject Engineering srl\n34:00:8A:C0:00:00/28\tShenzhen Eternal Idea Tech Co.,Ltd\n34:00:8A:D0:00:00/28\tChengDu HuiZhong Cloud Information Technology Co., Ltd.\n34:00:8A:E0:00:00/28\tShenzhen Wxl Electronics Co., Ltd.\n34:00:A3\t\tHuawei Technologies Co.,Ltd\n34:02:86\t\tIntel Corporate\n34:02:9B\t\tPlexonics Technologies LImited\n34:03:DE\t\tTexas Instruments\n34:04:9E\t\tIEEE Registration Authority\n34:04:9E:00:00:00/28\tGoChip Inc.\n34:04:9E:10:00:00/28\tConnected IO\n34:04:9E:20:00:00/28\tEFD Induction\n34:04:9E:30:00:00/28\tNanjing Mythware Information Technology Co., Ltd.\n34:04:9E:40:00:00/28\tHarbin Yantuo Science and Technology Development Co., Ltd\n34:04:9E:50:00:00/28\tSeeiner Technology Co.,LTD\n34:04:9E:60:00:00/28\tLife Interface Co., Ltd.\n34:04:9E:70:00:00/28\tPebble Technology\n34:04:9E:80:00:00/28\tEclipse Information Technologies\n34:04:9E:90:00:00/28\tChurch & Dwight Co., Inc.\n34:04:9E:A0:00:00/28\ti3 International Inc.\n34:04:9E:B0:00:00/28\tEginity, Inc.\n34:04:9E:C0:00:00/28\tClearCaptions LLC\n34:04:9E:D0:00:00/28\tuikismart\n34:04:9E:E0:00:00/28\tND SatCom GmbH\n34:05:57\t\tvivo Mobile Communication Co., Ltd.\n34:07:4F\t\tAccelStor, Inc.\n34:07:AC\t\tPronyx Trading Llc\n34:07:FB\t\tEricsson AB\n34:08:04\t\tD-Link Corporation\n34:08:BC\t\tApple, Inc.\n34:08:E1\t\tTexas Instruments\n34:09:62\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n34:09:C9\t\tDongguan Huayin Electronic Technology Co., Ltd.\n34:0A:22\t\tTop-Access Electronics Co Ltd\n34:0A:33\t\tD-Link International\n34:0A:98\t\tHuawei Technologies Co.,Ltd\n34:0A:FF\t\tQingdao Hisense Communications Co.,Ltd.\n34:0B:40\t\tMios Elettronica Srl\n34:0C:ED\t\tModuel AB\n34:0F:66\t\tWeb Sensing LLC\n34:10:5D\t\tTexas Instruments\n34:10:F4\t\tSilicon Laboratories\n34:12:90\t\tTreeview Co.,Ltd.\n34:12:98\t\tApple, Inc.\n34:12:F9\t\tHuawei Technologies Co.,Ltd\n34:13:43\t\tGE Lighting\n34:13:A8\t\tMediplan Limited\n34:13:E8\t\tIntel Corporate\n34:14:53\t\tGantner Electronic GmbH\n34:14:5F\t\tSamsung Electronics Co.,Ltd\n34:14:B5\t\tTexas Instruments\n34:15:13\t\tTexas Instruments\n34:15:93\t\tRuckus Wireless\n34:15:9E\t\tApple, Inc.\n34:17:36\t\tShenzhen iComm Semiconductor CO.,LTD\n34:17:EB\t\tDell Inc.\n34:19:4D\t\tArcadyan Corporation\n34:1A:35\t\tFiberhome Telecommunication Technologies Co.,LTD\n34:1A:4C\t\tShenzhen Weibu Electronics Co.,Ltd.\n34:1B:22\t\tGrandbeing Technology Co., Ltd\n34:1B:2D\t\tCisco Systems, Inc\n34:1C:F0\t\tXiaomi Communications Co Ltd\n34:1E:6B\t\tHuawei Technologies Co.,Ltd\n34:1F:E4\t\tCommscope\n34:20:03\t\tShenzhen Feitengyun Technology Co.,LTD\n34:20:E3\t\tRuckus Wireless\n34:21:09\t\tJensen Scandinavia AS\n34:23:87\t\tHon Hai Precision Ind. Co.,Ltd.\n34:23:BA\t\tSamsung Electro-Mechanics(Thailand)\n34:24:3E\t\tzte corporation\n34:25:5D\t\tShenzhen Loadcom Technology Co.,Ltd\n34:25:B4\t\tSilicon Laboratories\n34:25:BE\t\tAmazon Technologies Inc.\n34:26:06\t\tCarePredict, Inc.\n34:27:92\t\tFreebox Sas\n34:28:40\t\tApple, Inc.\n34:28:F0\t\tATN International Limited\n34:29:12\t\tHuawei Technologies Co.,Ltd\n34:29:8F\t\tIEEE Registration Authority\n34:29:8F:00:00:00/28\tBlackEdge Capital\n34:29:8F:10:00:00/28\tChengdu Meross Technology Co., Ltd.\n34:29:8F:20:00:00/28\tShenzhen Advance River System Technology Co., Ltd\n34:29:8F:30:00:00/28\tBeijing Vorx Telecommunications Co., Ltd.\n34:29:8F:40:00:00/28\tISRA Vision AG\n34:29:8F:50:00:00/28\tHighlite International B.V.\n34:29:8F:60:00:00/28\tBellman & Symfon\n34:29:8F:70:00:00/28\tDongguan Kingtron Electronics Tech Co., Ltd\n34:29:8F:80:00:00/28\tNanjing Sandemarine Electric Co.,Ltd\n34:29:8F:90:00:00/28\tWiesheu GmbH\n34:29:8F:A0:00:00/28\tVirtual Trunk Pte Ltd\n34:29:8F:B0:00:00/28\tSchnick-Schnack-Systems GmbH\n34:29:8F:C0:00:00/28\tAlbert Handtmann Maschinenfabrik GmbH&Co.KG\n34:29:8F:D0:00:00/28\tKeystone Electronic Solutions\n34:29:8F:E0:00:00/28\tARC Technology Co., Ltd\n34:29:EA\t\tMcd Electronics Sp. Z O.O.\n34:29:EF\t\tQingdao Haier Technology Co.,Ltd\n34:2A:F1\t\tTexas Instruments\n34:2B:6E\t\tApple, Inc.\n34:2B:70\t\tArris\n34:2C:8E\t\tUfispace Co., LTD.\n34:2C:C4\t\tCompal Broadband Networks, Inc.\n34:2D:0D\t\tSamsung Electronics Co.,Ltd\n34:2D:A3\t\tFiberhome Telecommunication Technologies Co.,LTD\n34:2E:B6\t\tHuawei Technologies Co.,Ltd\n34:2E:B7\t\tIntel Corporate\n34:2F:6E\t\tAnywire corporation\n34:2F:BD\t\tNintendo Co.,Ltd\n34:31:11\t\tSamsung Electronics Co.,Ltd\n34:31:7F\t\tPanasonic Appliances Company\n34:31:8F\t\tApple, Inc.\n34:31:C4\t\tAVM GmbH\n34:32:E6\t\tPanasonic Industrial Devices Europe GmbH\n34:36:07\t\tPinewave Pte. Ltd.\n34:36:3B\t\tApple, Inc.\n34:36:54\t\tzte corporation\n34:37:59\t\tzte corporation\n34:37:94\t\tHamee Corp.\n34:38:39\t\tNEC Platforms, Ltd.\n34:38:AF\t\tInlab Networks GmbH\n34:38:B7\t\tHUMAX Co., Ltd.\n34:39:16\t\tGoogle, Inc.\n34:3A:20\t\tHewlett Packard Enterprise\n34:3C:30\t\tNXP Semiconductor (Tianjin) LTD.\n34:3D:7F\t\tKlipsch Group, Inc.\n34:3D:98\t\tJinQianMao Technology Co.,Ltd.\n34:3D:C4\t\tBuffalo.Inc\n34:3E:25\t\tOhsung\n34:3E:A4\t\tRing LLC\n34:40:B5\t\tIbm\n34:41:5D\t\tIntel Corporate\n34:41:A8\t\tER-Telecom\n34:42:62\t\tApple, Inc.\n34:46:63\t\tIEEE Registration Authority\n34:46:63:00:00:00/28\tChina Drive Electric Co.,Ltd（Zhe Jiang）\n34:46:63:10:00:00/28\tChain Reaction Ltd\n34:46:63:20:00:00/28\tAmcrest Technologies\n34:46:63:30:00:00/28\tLA Clippers\n34:46:63:40:00:00/28\tLuminys Systems Corporation\n34:46:63:50:00:00/28\tWuhan IDXLINK Technology Co., Ltd\n34:46:63:60:00:00/28\tChina Motor Corporation\n34:46:63:70:00:00/28\tShenzhen Htfuture Co., Ltd\n34:46:63:80:00:00/28\tBluesoo Tech (HongKong) Co.,Limited\n34:46:63:90:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n34:46:63:A0:00:00/28\tShenzhen Shenhong Communication Technology Co., Ltd\n34:46:63:B0:00:00/28\tGrohe AG\n34:46:63:C0:00:00/28\tmirle automation corporation\n34:46:63:D0:00:00/28\tHangzhou Tashi Internet Of Things Technology Co., Ltd\n34:46:63:E0:00:00/28\tShenzhen ELECQ Technology Co.,Ltd\n34:46:6F\t\tHiTEM Engineering\n34:46:EC\t\tHuawei Device Co., Ltd.\n34:47:9A\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n34:47:D4\t\tChengdu Quanjing Intelligent Technology Co.,Ltd\n34:48:ED\t\tDell Inc.\n34:49:51\t\tEliyan Corp.\n34:49:5B\t\tSagemcom Broadband SAS\n34:4A:1B\t\tzte corporation\n34:4A:C3\t\tHuNan ZiKun Information Technology CO., Ltd\n34:4B:3D\t\tFiberhome Telecommunication Technologies Co.,LTD\n34:4B:50\t\tzte corporation\n34:4C:A4\t\tamazipoint technology Ltd.\n34:4C:C8\t\tEchodyne Corp\n34:4D:EA\t\tzte corporation\n34:4D:F7\t\tLG Electronics (Mobile Communications)\n34:4E:2F\t\tLear\n34:4F:3F\t\tIO-Power Technology Co., Ltd.\n34:4F:5C\t\tR&M Ag\n34:4F:69\t\tEkinops Sas\n34:51:6F\t\tSkychers Creations ShenZhen Limited\n34:51:80\t\tTCL King Electrical Appliances (Huizhou) Co., Ltd\n34:51:84\t\tHuawei Device Co., Ltd.\n34:51:AA\t\tJid Global\n34:51:C9\t\tApple, Inc.\n34:53:D2\t\tSagemcom Broadband SAS\n34:54:3C\t\tTakaoka Toko Co.,Ltd.\n34:55:94\t\tFujian Star-Net Communication Co.,Ltd\n34:56:FE\t\tCisco Meraki\n34:57:60\t\tMitraStar Technology Corp.\n34:58:40\t\tHuawei Technologies Co.,Ltd\n34:58:7C\t\tMirae Information Technology Co., Ltd.\n34:58:8A\t\tCisco Systems, Inc\n34:5A:06\t\tSHARP Corporation\n34:5A:18\t\tAlignment Engine Inc.\n34:5A:60\t\tMicro-Star INTL CO., LTD.\n34:5A:BA\t\ttcloud intelligence\n34:5B:11\t\tEvi Heat Ab\n34:5B:98\t\tEM Microelectronic\n34:5B:BB\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n34:5C:40\t\tCargt Holdings LLC\n34:5C:F3\t\tChipsea Technologies (Shenzhen) Corp.\n34:5D:10\t\tWytek\n34:5D:9E\t\tSagemcom Broadband SAS\n34:5D:A8\t\tCisco Systems, Inc\n34:5E:08\t\tRoku, Inc\n34:5E:E7\t\tHangzhou ChengFengErLai Digial Technology Co.,Ltd.\n34:5F:45\t\tEspressif Inc.\n34:60:F9\t\tTP-Link Systems Inc\n34:61:78\t\tThe Boeing Company\n34:62:88\t\tCisco Systems, Inc\n34:62:B4\t\tRenesas Electronics (Penang) Sdn. Bhd.\n34:63:D4\t\tBionix Supplychain Technologies Slu\n34:64:A9\t\tHewlett Packard\n34:66:79\t\tHuawei Technologies Co.,Ltd\n34:66:91\t\tApple, Inc.\n34:66:EA\t\tVertu International Corporation Limited\n34:68:4A\t\tTeraworks Co., Ltd.\n34:68:93\t\tTecnovideo Srl\n34:68:95\t\tHon Hai Precision Ind. Co.,Ltd.\n34:68:B5\t\tTexas Instruments\n34:69:87\t\tzte corporation\n34:6A:C2\t\tHuawei Technologies Co.,Ltd\n34:6B:46\t\tSagemcom Broadband SAS\n34:6B:5B\t\tNew H3C Technologies Co., Ltd\n34:6B:D3\t\tHuawei Technologies Co.,Ltd\n34:6C:0F\t\tPramod Telecom Pvt. Ltd\n34:6D:9C\t\tCarrier Corporation\n34:6E:68\t\tHuawei Technologies Co.,Ltd\n34:6E:8A\t\tEcosense\n34:6E:9D\t\tEricsson AB\n34:6F:11\t\tQingdao Zhipai Information Technology Co., Ltd.\n34:6F:24\t\tAzureWave Technology Inc.\n34:6F:71\t\tTenaFe Inc.\n34:6F:90\t\tCisco Systems, Inc\n34:6F:92\t\tWhite Rodgers Division\n34:6F:ED\t\tEnovation Controls\n34:70:69\t\tCisco Systems, Inc\n34:71:46\t\tHuawei Device Co., Ltd.\n34:73:2D\t\tCisco Systems, Inc\n34:73:5A\t\tDell Inc.\n34:73:79\t\txFusion Digital Technologies Co., Limited\n34:75:63\t\tShenzhen Rf-Link Technology Co.,Ltd.\n34:75:C7\t\tAvaya Inc\n34:76:C5\t\tI-O Data Device,Inc.\n34:78:39\t\tzte corporation\n34:78:77\t\tO-Net Communications (Shenzhen) Limited\n34:78:D7\t\tGionee Communication Equipment Co.,Ltd.\n34:79:16\t\tHuawei Technologies Co.,Ltd\n34:7A:60\t\tCommscope\n34:7C:25\t\tApple, Inc.\n34:7D:E4\t\tShenzhen Bilian Electronic Co.，Ltd\n34:7D:F6\t\tIntel Corporate\n34:7E:00\t\tHuawei Device Co., Ltd.\n34:7E:39\t\tNokia Danmark A/S\n34:7E:5C\t\tSonos, Inc.\n34:7E:CA\t\tNextwill\n34:80:0D\t\tCavium Inc\n34:80:B3\t\tXiaomi Communications Co Ltd\n34:81:37\t\tUnicard Sa\n34:81:C4\t\tAVM GmbH\n34:81:F4\t\tSST Taiwan Ltd.\n34:82:C5\t\tSamsung Electronics Co.,Ltd\n34:82:DE\t\tKiio Inc\n34:83:02\t\tiFORCOM Co., Ltd\n34:83:D5\t\tHuawei Technologies Co.,Ltd\n34:84:46\t\tEricsson AB\n34:84:E4\t\tTexas Instruments\n34:85:11\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n34:85:18\t\tEspressif Inc.\n34:85:84\t\tExtreme Networks Headquarters\n34:86:2A\t\tHeinz Lackmann GmbH & Co KG\n34:86:5D\t\tEspressif Inc.\n34:86:DA\t\tHonor Device Co., Ltd.\n34:87:3D\t\tQuectel Wireless Solutions Co.,Ltd.\n34:88:18\t\tCisco Systems, Inc\n34:88:5D\t\tLogitech Far East\n34:8A:12\t\tHewlett Packard Enterprise\n34:8A:7B\t\tSamsung Electronics Co.,Ltd\n34:8A:AE\t\tSagemcom Broadband SAS\n34:8B:75\t\tLava International(H.K) Limited\n34:8C:5E\t\tApple, Inc.\n34:8D:13\t\tSilicon Laboratories\n34:8D:52\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n34:8E:89\t\tHangzhou BroadLink Technology Co., Ltd\n34:8F:27\t\tRuckus Wireless\n34:90:EA\t\tMurata Manufacturing Co., Ltd.\n34:91:6F\t\tUserGate Ltd.\n34:92:C2\t\tSquare Route Co., Ltd.\n34:93:42\t\tTTE Corporation\n34:93:6F\t\tJuniper Networks\n34:94:54\t\tEspressif Inc.\n34:95:DB\t\tLogitec Corporation\n34:96:71\t\tHuawei Technologies Co.,Ltd\n34:96:72\t\tTp-Link Technologies Co.,Ltd.\n34:96:77\t\tzte corporation\n34:97:6F\t\tRootech, Inc.\n34:97:D7\t\tYealink(Xiamen) Network Technology Co.,Ltd.\n34:97:F6\t\tASUSTek COMPUTER INC.\n34:97:FB\t\tAdvanced Rf Technologies Inc\n34:98:7A\t\tEspressif Inc.\n34:98:B5\t\tNetgear\n34:99:6F\t\tVPI Engineering\n34:99:71\t\tQuanta Storage Inc.\n34:99:D7\t\tUniversal Flow Monitors, Inc.\n34:9A:0D\t\tZBD Displays Ltd\n34:9B:5B\t\tMaquet GmbH\n34:9D:90\t\tHeinzmann GmbH & CO. KG\n34:9E:34\t\tEvervictory Electronic Co.Ltd\n34:9F:7B\t\tCanon Inc.\n34:A1:83\t\tAWare, Inc\n34:A2:A2\t\tHuawei Technologies Co.,Ltd\n34:A3:4E\t\tNevadaNano\n34:A3:95\t\tApple, Inc.\n34:A3:BF\t\tTerewave. Inc.\n34:A5:5D\t\tTechnosoft International Srl\n34:A5:B4\t\tNavtech Pte Ltd\n34:A5:E1\t\tSensorist ApS\n34:A6:8C\t\tShine Profit Development Limited\n34:A6:EF\t\tShenzhen Phaten Tech. LTD\n34:A7:09\t\tTrevil srl\n34:A7:BA\t\tFischer International Systems Corporation\n34:A8:43\t\tKYOCERA Display Corporation\n34:A8:4E\t\tCisco Systems, Inc\n34:A8:DB\t\tSenArch ApS\n34:A8:EB\t\tApple, Inc.\n34:AA:31\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n34:AA:8B\t\tSamsung Electronics Co.,Ltd\n34:AA:99\t\tNokia\n34:AA:EE\t\tMikrovisatos Servisas UAB\n34:AB:37\t\tApple, Inc.\n34:AB:95\t\tEspressif Inc.\n34:AC:11\t\tChina Mobile Group Device Co.,Ltd.\n34:AD:61\t\tCelestica Inc.\n34:AD:E4\t\tShanghai Chint Power Systems Co., Ltd.\n34:AF:2C\t\tNintendo Co., Ltd.\n34:AF:A3\t\tRecogni Inc\n34:AF:B3\t\tAmazon Technologies Inc.\n34:B1:EB\t\tApple, Inc.\n34:B1:F7\t\tTexas Instruments\n34:B2:0A\t\tHuawei Device Co., Ltd.\n34:B3:54\t\tHuawei Technologies Co.,Ltd\n34:B4:72\t\tEspressif Inc.\n34:B5:71\t\tPlds\n34:B5:A3\t\tCig Shanghai Co Ltd\n34:B5:F3\t\tIEEE Registration Authority\n34:B5:F3:00:00:00/28\tAddsoft Technologies Limited\n34:B5:F3:10:00:00/28\tSatco Europe GmbH\n34:B5:F3:20:00:00/28\tInspired Flight\n34:B5:F3:30:00:00/28\tWEAD GmbH\n34:B5:F3:40:00:00/28\tLAUMAS Elettronica s.r.l.\n34:B5:F3:50:00:00/28\tKyokuto Solutions Inc.\n34:B5:F3:60:00:00/28\tJenesis(Shen Zhen)Co.,Ltd.\n34:B5:F3:70:00:00/28\tHyatta Digital Technology Co., Ltd.\n34:B5:F3:80:00:00/28\tShanghai Sigen New Energy Technology Co., Ltd\n34:B5:F3:90:00:00/28\tShenzhen PeakVic Technology Co.,Ltd\n34:B5:F3:A0:00:00/28\tBethlabs(Tianjin)Technology Co.,Ltd.\n34:B5:F3:B0:00:00/28\tAeterlink Corp.\n34:B5:F3:C0:00:00/28\tShenzhen Mifasuolla Smart Co.,Ltd\n34:B5:F3:D0:00:00/28\tDigicom\n34:B5:F3:E0:00:00/28\tViettel Manufacturing Corporation One Member Limited Liability Company\n34:B7:DA\t\tEspressif Inc.\n34:B7:FD\t\tGuangzhou Younghead Electronic Technology Co.,Ltd\n34:B8:83\t\tCisco Systems, Inc\n34:B9:8D\t\tXiaomi Communications Co Ltd\n34:BA:38\t\tPal Mohan Electronics Pvt Ltd\n34:BA:51\t\tSe-Kure Controls, Inc.\n34:BA:75\t\tEverest Networks, Inc\n34:BA:9A\t\tAsiatelco Technologies Co.\n34:BB:1F\t\tBlackBerry RTS\n34:BB:26\t\tMotorola Mobility LLC, a Lenovo Company\n34:BC:5E\t\teero inc.\n34:BC:A6\t\tBeijing Ding Qing Technology, Ltd.\n34:BD:20\t\tHangzhou Hikrobot Technology Co., Ltd.\n34:BD:C8\t\tCisco Systems, Inc\n34:BD:F9\t\tShanghai WDK Industrial Co.,Ltd.\n34:BD:FA\t\tCisco SPVTG\n34:BE:00\t\tSamsung Electronics Co.,Ltd\n34:BF:90\t\tFiberhome Telecommunication Technologies Co.,LTD\n34:C0:59\t\tApple, Inc.\n34:C0:F9\t\tRockwell Automation\n34:C1:03\t\tHangzhou Huamu Technology Co.,Ltd.\n34:C1:E9\t\tUlak Communications Inc.\n34:C3:AC\t\tSamsung Electronics Co.,Ltd\n34:C3:D2\t\tFn-Link Technology Limited\n34:C4:59\t\tTexas Instruments\n34:C5:15\t\tHewlett Packard Enterprise\n34:C5:D0\t\tHagleitner Hygiene International GmbH\n34:C6:9A\t\tEnecsys Ltd\n34:C6:DD\t\tHangzhou Ezviz Software Co.,Ltd.\n34:C7:31\t\tAlpsalpine Co,.Ltd\n34:C7:E9\t\tGoogle, Inc.\n34:C8:03\t\tNokia Corporation\n34:C8:D6\t\tIEEE Registration Authority\n34:C8:D6:00:00:00/28\tShenzhen Zhangyue Technology Co., Ltd\n34:C8:D6:10:00:00/28\tShenzhen Xmitech Electronic Co.,Ltd\n34:C8:D6:20:00:00/28\tGuangzhou Linkpi Technology Co. Ltd\n34:C8:D6:30:00:00/28\tkratos network pte.ltd.\n34:C8:D6:40:00:00/28\tChengdu Decentest technology Co., Ltd.\n34:C8:D6:50:00:00/28\tPrizma Group Distribution & Consulting D.O.O - Rubisec\n34:C8:D6:60:00:00/28\tSignalwing Corporation\n34:C8:D6:70:00:00/28\tZXCLAA Technology(Suzhou) Co.,Ltd\n34:C8:D6:80:00:00/28\tIllumina\n34:C8:D6:90:00:00/28\tLaxton Group Limited\n34:C8:D6:A0:00:00/28\tShenzhen Jooan Technology  Co., Ltd\n34:C8:D6:B0:00:00/28\tYuanzhou Intelligent (Shenzhen) Co., Ltd.\n34:C8:D6:C0:00:00/28\tHuizhou KDT Intelligent Display Technology Co. Ltd\n34:C8:D6:D0:00:00/28\teight\n34:C8:D6:E0:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n34:C9:3D\t\tIntel Corporate\n34:C9:9D\t\tEidolon Communications Technology Co. Ltd.\n34:C9:F0\t\tLM Technologies Ltd\n34:CA:81\t\tNew H3C Intelligence Terminal Co., Ltd.\n34:CB:1A\t\tProcter & Gamble Company\n34:CC:28\t\tNexpring Co. LTD.,\n34:CD:6D\t\tCommSky Technologies\n34:CD:B0\t\tEspressif Inc.\n34:CD:BE\t\tHuawei Technologies Co.,Ltd\n34:CE:00\t\tXIAOMI Electronics,CO.,LTD\n34:CE:69\t\tNokia Solutions and Networks GmbH & Co. KG\n34:CE:94\t\tParsec (Pty) Ltd\n34:CF:6C\t\tHangzhou Taili wireless communication equipment Co.,Ltd\n34:CF:B5\t\tRobotic d.o.o.\n34:CF:F6\t\tIntel Corporate\n34:D0:9B\t\tMobilMAX Technology Inc.\n34:D0:B8\t\tIEEE Registration Authority\n34:D0:B8:00:00:00/28\tCaptec Ltd\n34:D0:B8:10:00:00/28\tShenzhen Bao Lai Wei Intelligent Technology Co., L\n34:D0:B8:20:00:00/28\tBlustream Pty Ltd\n34:D0:B8:30:00:00/28\tTascent, Inc.\n34:D0:B8:40:00:00/28\tEQPlay Intelligent Technology(Kunshan) Co,Ltd.\n34:D0:B8:50:00:00/28\teesy-innovation GmbH\n34:D0:B8:60:00:00/28\tNumberFour AG\n34:D0:B8:70:00:00/28\tShenzhen Rikomagic Tech Corp.,Ltd\n34:D0:B8:80:00:00/28\tVtrek Group International Ltd.\n34:D0:B8:90:00:00/28\tSkytech Creations Limited\n34:D0:B8:A0:00:00/28\tMeatest sro\n34:D0:B8:B0:00:00/28\tOrosound Sas\n34:D0:B8:C0:00:00/28\tGlory Mark Electronic Ltd. Taiwan Branch (B.V.I.)\n34:D0:B8:D0:00:00/28\tNTX Embedded\n34:D0:B8:E0:00:00/28\tKongqiguanjia (Beijing)Technology co.，ltd\n34:D2:62\t\tSz Dji Technology Co.,Ltd\n34:D2:70\t\tAmazon Technologies Inc.\n34:D2:C4\t\tRENA GmbH Print Systeme\n34:D4:E3\t\tAtom Power, Inc.\n34:D5:09\t\tGenexis B.V.\n34:D6:93\t\tHuawei Device Co., Ltd.\n34:D7:12\t\tSmartisan Digital Co., Ltd\n34:D7:2F\t\tShenzhen SuperElectron Technology Co.,Ltd.\n34:D7:37\t\tIBG Industriebeteiligungsgesellschaft mbH &b Co. KG\n34:D7:72\t\tXiamen Yudian Automation Technology Co., Ltd\n34:D7:B4\t\tTributary Systems, Inc.\n34:D8:56\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n34:D8:68\t\tBroadcom Limited\n34:D9:54\t\tWiBotic Inc.\n34:DA:A1\t\tApple, Inc.\n34:DA:B7\t\tzte corporation\n34:DA:C1\t\tSAE Technologies Development(Dongguan) Co., Ltd.\n34:DB:9C\t\tSagemcom Broadband SAS\n34:DB:FD\t\tCisco Systems, Inc\n34:DC:99\t\tNew H3C Technologies Co., Ltd\n34:DD:04\t\tMinut AB\n34:DD:7E\t\tUmeox Innovations Co.,Ltd\n34:DE:1A\t\tIntel Corporate\n34:DE:34\t\tzte corporation\n34:DF:20\t\tShenzhen Comstar .Technology Co.,Ltd\n34:DF:2A\t\tFujikon Industrial Co.,Limited\n34:E0:CF\t\tzte corporation\n34:E0:D7\t\tDongguan Qisheng Electronics Industrial Co., Ltd\n34:E1:2D\t\tIntel Corporate\n34:E1:A9\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n34:E1:D1\t\tIEEE Registration Authority\n34:E1:D1:00:00:00/28\tTianjin Sublue Ocean Science & Technology Co., Ltd\n34:E1:D1:10:00:00/28\tSAMA NextGen PTE Limited\n34:E1:D1:20:00:00/28\tTeton Camera LLC\n34:E1:D1:30:00:00/28\tRinco Ultrasonics AG\n34:E1:D1:40:00:00/28\tASA Innovation & Technology Ltd.\n34:E1:D1:50:00:00/28\tDoki Technologies Limited\n34:E1:D1:60:00:00/28\tNingbo Hua Gao Mdt Info Tech Ltd\n34:E1:D1:70:00:00/28\tGenius Pros\n34:E1:D1:80:00:00/28\tHubitat Inc.\n34:E1:D1:90:00:00/28\tBiamp\n34:E1:D1:A0:00:00/28\tOrCam Technologies\n34:E1:D1:B0:00:00/28\tAPG Cash Drawer, LLC\n34:E1:D1:C0:00:00/28\tCREW by True Rowing, Inc.\n34:E1:D1:D0:00:00/28\tHi-Tech.Org\n34:E1:D1:E0:00:00/28\tAnnapurna labs\n34:E2:FD\t\tApple, Inc.\n34:E3:80\t\tGenexis B.V.\n34:E3:DA\t\tHoval Aktiengesellschaft\n34:E3:FB\t\tSamsung Electronics Co.,Ltd\n34:E4:2A\t\tAutomatic Bar Controls Inc.\n34:E5:EC\t\tPalo Alto Networks\n34:E6:AD\t\tIntel Corporate\n34:E6:D7\t\tDell Inc.\n34:E6:E6\t\tLG Innotek\n34:E7:0B\t\tHAN Networks Co., Ltd\n34:E7:1C\t\tShenzhen YOUHUA Technology Co., Ltd\n34:E8:94\t\tTp-Link Technologies Co.,Ltd.\n34:E9:11\t\tvivo Mobile Communication Co., Ltd.\n34:E9:FE\t\tMetis Co., Ltd.\n34:EA:10\t\tOrbic North America\n34:EA:34\t\tHangZhou Gubei Electronics Technology Co.,Ltd\n34:EA:E7\t\tShanghai High-Flying Electronics  Technology Co., Ltd\n34:EC:B6\t\tPhyplus Microelectronics Limited\n34:ED:0B\t\tShanghai XZ-COM.CO.,Ltd.\n34:ED:1B\t\tCisco Systems, Inc\n34:EE:16\t\tApple, Inc.\n34:EE:2A\t\tConMet\n34:EF:44\t\t2Wire Inc\n34:EF:8B\t\tNTT Communications Corporation\n34:EF:B6\t\tEdgecore Networks Corporation\n34:F0:43\t\tSamsung Electronics Co.,Ltd\n34:F0:CA\t\tShenzhen Linghangyuan Digital Technology Co.,Ltd.\n34:F1:50\t\tHui Zhou Gaoshengda Technology Co.,LTD\n34:F2:23\t\tFujian Newland Communication Science Technology Co.,Ltd.\n34:F3:9A\t\tIntel Corporate\n34:F3:9B\t\tWizLAN Ltd.\n34:F5:D7\t\tHuawei Device Co., Ltd.\n34:F6:2D\t\tSHARP Corporation\n34:F6:4B\t\tIntel Corporate\n34:F6:8D\t\tApple, Inc.\n34:F6:D2\t\tPanasonic Taiwan Co.,Ltd.\n34:F7:16\t\tTp-Link Technologies Co.,Ltd.\n34:F8:6E\t\tParker Hannifin Corporation\n34:F8:E7\t\tCisco Systems, Inc\n34:F9:68\t\tATEK Products, LLC\n34:FA:1C\t\tBeijing Xiaomi Mobile Software Co., Ltd\n34:FA:40\t\tGuangzhou Robustel Technologies Co., Limited\n34:FA:9F\t\tRuckus Wireless\n34:FC:6F\t\tAlcea\n34:FC:99\t\tSJIT Co., Ltd.\n34:FC:A1\t\tMicronet union Technology(Chengdu)Co., Ltd.\n34:FC:B9\t\tHewlett Packard Enterprise\n34:FC:EF\t\tLG Electronics (Mobile Communications)\n34:FD:6A\t\tApple, Inc.\n34:FD:70\t\tIntel Corporate\n34:FE:1C\t\tChoung Hwa Tech Co.,Ltd\n34:FE:77\t\tApple, Inc.\n34:FE:9E\t\tFujitsu Limited\n34:FE:C5\t\tShenzhen Sunwoda intelligent hardware Co.,Ltd\n34:FF:F3\t\tHuawei Technologies Co.,Ltd\n38:00:25\t\tIntel Corporate\n38:01:18\t\tULVAC,Inc.\n38:01:46\t\tShenzhen Bilian Electronic Co.，Ltd\n38:01:95\t\tSamsung Electronics Co.,Ltd\n38:01:97\t\tTSST Global,Inc\n38:01:9F\t\tShenzhen Fast Technologies Co.,Ltd\n38:02:DE\t\tSercomm Corporation.\n38:02:E3\t\tYichen (Shenzhen) Technology Co.,Ltd\n38:05:25\t\tIEEE Registration Authority\n38:05:25:00:00:00/28\tGroeneveld-BEKA GmbH\n38:05:25:10:00:00/28\tVisitech AS\n38:05:25:20:00:00/28\tHuizhou Xunchuang Technology Co.,Ltd\n38:05:25:30:00:00/28\tShenzhen Meigao Electronic Equipment Co.,Ltd\n38:05:25:40:00:00/28\tAnnapurna labs\n38:05:25:50:00:00/28\tScorbit\n38:05:25:60:00:00/28\tShenzhen Blovedream Technology Co., Ltd\n38:05:25:70:00:00/28\tThings Of A Feather LLC\n38:05:25:80:00:00/28\tRobotize ApS\n38:05:25:90:00:00/28\tAnnapurna labs\n38:05:25:A0:00:00/28\tnbeings private limited\n38:05:25:B0:00:00/28\tCammax Optronics Co., Ltd.\n38:05:25:C0:00:00/28\tChristeyns Engineering Kft.\n38:05:25:D0:00:00/28\tHalliday Holdings PTE. LTD.\n38:05:25:E0:00:00/28\tPrivate\n38:05:46\t\tFoctek Photonics, Inc.\n38:05:AC\t\tPiller Group GmbH\n38:06:B4\t\tA.D.C. GmbH\n38:06:E6\t\tArcadyan Corporation\n38:07:16\t\tFreebox Sas\n38:07:D4\t\tZeppelin Systems GmbH\n38:08:FD\t\tSilca Spa\n38:09:A4\t\tFirefly Integrations\n38:09:FB\t\tApple, Inc.\n38:0A:0A\t\tSky-City Communication and Electronics Limited Company\n38:0A:4F\t\tPrachi Enterprises\n38:0A:94\t\tSamsung Electronics Co.,Ltd\n38:0A:AB\t\tFormlabs\n38:0B:26\t\tMindray Co., Ltd.\n38:0B:3C\t\tTexas Instruments\n38:0B:40\t\tSamsung Electronics Co.,Ltd\n38:0D:D4\t\tPrimax Electronics Ltd.\n38:0E:4D\t\tCisco Systems, Inc\n38:0E:7B\t\tV.P.S. Thai Co., Ltd\n38:0F:4A\t\tApple, Inc.\n38:0F:AD\t\tHuawei Technologies Co.,Ltd\n38:0F:E4\t\tDedicated Network Partners Oy\n38:10:D5\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n38:10:F0\t\tHewlett Packard Enterprise\n38:12:7B\t\tCrenet Labs Co., Ltd.\n38:14:1B\t\tSecure Letter Inc.\n38:14:28\t\tDell Inc.\n38:14:4E\t\tFiberhome Telecommunication Technologies Co.,LTD\n38:16:5A\t\tzte corporation\n38:16:72\t\tShenzhen SuperElectron Technology Co.,Ltd.\n38:16:D1\t\tSamsung Electronics Co.,Ltd\n38:17:30\t\tUlrich Lippert GmbH & Co KG\n38:17:66\t\tPromzakaz Ltd.\n38:17:B1\t\tSagemcom Broadband SAS\n38:17:C3\t\tHewlett Packard Enterprise\n38:17:E1\t\tVantiva USA LLC\n38:18:2B\t\tEspressif Inc.\n38:18:4C\t\tSony Home Entertainment&Sound Products Inc\n38:18:68\t\tIntel Corporate\n38:19:2F\t\tNokia Corporation\n38:1A:52\t\tSeiko Epson Corporation\n38:1B:9E\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\n38:1C:1A\t\tCisco Systems, Inc\n38:1C:23\t\tHilan Technology CO.,LTD\n38:1C:4A\t\tSIMCom Wireless Solutions Co.,Ltd.\n38:1D:14\t\tSkydio Inc.\n38:1D:D9\t\tFn-Link Technology Limited\n38:1E:C7\t\tChipsea Technologies(Shenzhen) Corp.\n38:1F:26\t\tIEEE Registration Authority\n38:1F:26:00:00:00/28\tJaesung Information & Communication Co.Ltd\n38:1F:26:10:00:00/28\tSernet (Suzhou) Technologies Corporation\n38:1F:26:20:00:00/28\tSynamedia\n38:1F:26:30:00:00/28\tBosch Automotive Electronics India Pvt. Ltd.\n38:1F:26:40:00:00/28\tAirmaster A/S\n38:1F:26:50:00:00/28\tZhejiang Huazhou Intelligent Equipment Co,. Ltd\n38:1F:26:60:00:00/28\tNOITAC sp. z o.o. sp.k.\n38:1F:26:70:00:00/28\tRCE systems s.r.o.\n38:1F:26:80:00:00/28\tAvon Protection\n38:1F:26:90:00:00/28\tSMS Evoko Group AB\n38:1F:26:A0:00:00/28\tSercomm Corporation.\n38:1F:26:B0:00:00/28\tDeutronic Elektronik GmbH\n38:1F:26:C0:00:00/28\tJade Bird Fire Co., Ltd.\n38:1F:26:D0:00:00/28\tHwachang Corporation\n38:1F:26:E0:00:00/28\tAnnapurna labs\n38:1F:8D\t\tTuya Smart Inc.\n38:20:28\t\tHuawei Technologies Co.,Ltd\n38:20:56\t\tCisco Systems, Inc\n38:20:A8\t\tColorTokens, Inc.\n38:21:87\t\tMidea Group Co., Ltd.\n38:21:C7\t\tHewlett Packard Enterprise\n38:22:28\t\tTelink Micro LLC\n38:22:9D\t\tADB Broadband Italia\n38:22:D6\t\tHangzhou H3C Technologies Co., Limited\n38:22:E2\t\tHP Inc.\n38:22:F4\t\tHuawei Device Co., Ltd.\n38:24:F1\t\tPrivate\n38:25:6B\t\tMicrosoft Mobile Oy\n38:25:F3\t\tMellanox Technologies, Inc.\n38:26:2B\t\tUTran Technology\n38:26:56\t\tTCL King Electrical Appliances(Huizhou)Co.,Ltd\n38:26:CD\t\tAndtek\n38:28:35\t\tzte corporation\n38:28:EA\t\tFujian Netcom Technology Co., LTD\n38:29:5A\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n38:29:DD\t\tONvocal Inc\n38:2A:19\t\tTechnica Engineering GmbH\n38:2A:8B\t\tnFore Technology Co., Ltd.\n38:2A:8C\t\tALL Winner (Hong Kong) Limited\n38:2B:78\t\tEco Plugs Enterprise Co., Ltd\n38:2C:4A\t\tASUSTek COMPUTER INC.\n38:2C:E5\t\tTuya Smart Inc.\n38:2D:D1\t\tSamsung Electronics Co.,Ltd\n38:2D:E8\t\tSamsung Electronics Co.,Ltd\n38:30:F9\t\tLG Electronics (Mobile Communications)\n38:31:5A\t\tRinnai\n38:31:AC\t\tWeg\n38:35:FB\t\tSagemcom Broadband SAS\n38:37:8B\t\tHuawei Technologies Co.,Ltd\n38:38:4B\t\tvivo Mobile Communication Co., Ltd.\n38:38:A6\t\tArista Networks\n38:39:6C\t\tHuawei Device Co., Ltd.\n38:39:8F\t\tSilicon Laboratories\n38:39:CD\t\tvivo Mobile Communication Co., Ltd.\n38:3A:21\t\tIEEE Registration Authority\n38:3A:21:00:00:00/28\tR3C Information(Shenzhen) Co.，Ltd.\n38:3A:21:10:00:00/28\tHOBART GmbH\n38:3A:21:20:00:00/28\tShenzhen HS Fiber Communication Equipment CO., LTD\n38:3A:21:30:00:00/28\tShanghai Greatwall Safety System Co.,Ltd\n38:3A:21:40:00:00/28\tDongguan Innovation Technology Co Ltd\n38:3A:21:50:00:00/28\tOOO NPP Uraltechnologiya\n38:3A:21:60:00:00/28\tShenzhen Smart-core Technology co., Ltd.\n38:3A:21:70:00:00/28\tChengdu Krosslan Technology Inc.\n38:3A:21:80:00:00/28\tAlicat Scientific\n38:3A:21:90:00:00/28\tSkylark Wireless LLC\n38:3A:21:A0:00:00/28\tForesight Sports\n38:3A:21:B0:00:00/28\tPactron\n38:3A:21:C0:00:00/28\tMission Embedded GmbH\n38:3A:21:D0:00:00/28\tColooc AB\n38:3A:21:E0:00:00/28\tSDNware technology co.,LTD\n38:3B:26\t\tJiangsu Qinheng Co., Ltd.\n38:3B:C8\t\t2Wire Inc\n38:3C:9C\t\tFujian Newland Payment Technology Co.,Ltd.\n38:3D:5B\t\tFiberhome Telecommunication Technologies Co.,LTD\n38:3F:10\t\tDBL Technology Ltd.\n38:3F:B3\t\tVantiva USA LLC\n38:3F:E8\t\tHuawei Technologies Co.,Ltd\n38:42:0B\t\tSonos, Inc.\n38:42:33\t\tWildeboer Bauteile GmbH\n38:42:A6\t\tIngenieurbuero Stahlkopf\n38:43:69\t\tPatrol Products Consortium LLC\n38:43:7D\t\tCompal Broadband Networks, Inc.\n38:43:E5\t\tGrotech Inc\n38:45:3B\t\tRuckus Wireless\n38:45:4C\t\tLight Labs, Inc.\n38:45:54\t\tHarman/Becker Automotive Systems GmbH\n38:45:8C\t\tMyCloud Technology corporation\n38:46:08\t\tzte corporation\n38:47:BC\t\tHuawei Technologies Co.,Ltd\n38:47:F2\t\tRecogni Inc\n38:48:4C\t\tApple, Inc.\n38:4A:80\t\tSamsung Electronics Co.,Ltd\n38:4B:24\t\tSiemens Ag\n38:4B:5B\t\tZtron Technology Limited\n38:4B:76\t\tAIRTAME ApS\n38:4C:4F\t\tHuawei Technologies Co.,Ltd\n38:4C:90\t\tCommscope\n38:4D:D2\t\tHuawei Device Co., Ltd.\n38:4F:49\t\tJuniper Networks\n38:4F:F0\t\tAzureWave Technology Inc.\n38:52:1A\t\tNokia\n38:52:47\t\tHuawei Device Co., Ltd.\n38:53:19\t\t34ED LLC DBA Centegix\n38:53:9C\t\tApple, Inc.\n38:54:39\t\tGuangzhou Shiyuan Electronic Technology Company Limited\n38:54:9B\t\tzte corporation\n38:54:F5\t\tAltoBeam Inc.\n38:56:10\t\tCANDY HOUSE, Inc.\n38:56:3D\t\tMicrosoft Corporation\n38:56:B5\t\tPeerbridge Health Inc\n38:58:0C\t\tPanaccess Systems GmbH\n38:59:F8\t\tMindMade Sp. z o.o.\n38:59:F9\t\tHon Hai Precision Ind. Co.,Ltd.\n38:5A:A8\t\tBeijing Zhongdun Security Technology Development Co.\n38:5B:44\t\tSilicon Laboratories\n38:5C:76\t\tPlantronics, Inc.\n38:5C:FB\t\tSilicon Laboratories\n38:5F:66\t\tCisco SPVTG\n38:5F:C3\t\tYu Jeong System, Co.Ltd\n38:60:77\t\tPegatron Corporation\n38:61:A5\t\tGrabango Co\n38:62:33\t\tApple, Inc.\n38:63:7F\t\tFiberhome Telecommunication Technologies Co.,LTD\n38:63:BB\t\tHewlett Packard\n38:63:F6\t\t3Nod Multimedia(Shenzhen)Co.,Ltd\n38:64:07\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\n38:65:04\t\tHonor Device Co., Ltd.\n38:65:B2\t\tApple, Inc.\n38:66:45\t\tOOSIC Technology CO.,Ltd\n38:66:F0\t\tApple, Inc.\n38:67:93\t\tAsia Optical Co., Inc.\n38:68:93\t\tIntel Corporate\n38:68:A4\t\tSamsung Electronics Co.,Ltd\n38:68:BE\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n38:68:DD\t\tInventec Corporation\n38:6A:77\t\tSamsung Electronics Co.,Ltd\n38:6B:1C\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\n38:6B:BB\t\tCommscope\n38:6C:9B\t\tIvy Biomedical\n38:6E:21\t\tWasion Group Ltd.\n38:6E:88\t\tzte corporation\n38:6E:A2\t\tvivo Mobile Communication Co., Ltd.\n38:6E:B2\t\tHuawei Technologies Co.,Ltd\n38:6F:6B\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n38:70:0C\t\tCommscope\n38:70:F2\t\tHuawei Technologies Co.,Ltd\n38:71:DE\t\tApple, Inc.\n38:72:C0\t\tComtrend Corporation\n38:73:EA\t\tIEEE Registration Authority\n38:73:EA:00:00:00/28\tL-3 Communications Mobile-Vision, Inc.\n38:73:EA:10:00:00/28\tKingWay Information Co.,Ltd.\n38:73:EA:20:00:00/28\tEyesight(Shanghai)Communication Technology Co.,Ltd.\n38:73:EA:30:00:00/28\tProch plastic Co., Ltd.\n38:73:EA:40:00:00/28\tLight Blue Optics Ltd.\n38:73:EA:50:00:00/28\tIstcontrol\n38:73:EA:60:00:00/28\tLive Sentinel\n38:73:EA:70:00:00/28\tPingGPS Inc\n38:73:EA:80:00:00/28\tRock Electronic Co., Ltd.\n38:73:EA:90:00:00/28\tLightform, Inc.\n38:73:EA:A0:00:00/28\tShenzhen Cse Technology Co., Ltd\n38:73:EA:B0:00:00/28\tShanghai ZoomSmart Technology Co., Ltd.\n38:73:EA:C0:00:00/28\tLG Electronics\n38:73:EA:D0:00:00/28\tAnnapurna labs\n38:73:EA:E0:00:00/28\tShenzhen Jixian Technology Co., Ltd.\n38:76:05\t\tInogeni\n38:76:CA\t\tShenzhen Smart Intelligent Technology Co.Ltd\n38:76:D1\t\tEuronda SpA\n38:77:07\t\tAltoBeam Inc.\n38:77:CD\t\tKokusai Electric Corporation\n38:78:62\t\tSony Corporation\n38:7A:0E\t\tIntel Corporate\n38:7A:3C\t\tFiberhome Telecommunication Technologies Co.,LTD\n38:7A:CC\t\tShenzhen Bilian Electronic Co.，Ltd\n38:7B:01\t\tShenzhen MiaoMing Intelligent Technology Co.,Ltd\n38:7B:47\t\tAKELA, Inc.\n38:7C:76\t\tUniversal Global Scientific Industrial Co., Ltd.\n38:7F:8B\t\tApple, Inc.\n38:80:DF\t\tMotorola Mobility LLC, a Lenovo Company\n38:81:D7\t\tTexas Instruments\n38:83:45\t\tTp-Link Technologies Co.,Ltd.\n38:83:9A\t\tShenzhen Rf-Link Technology Co.,Ltd.\n38:84:79\t\tCisco Meraki\n38:86:02\t\tFlexoptix GmbH\n38:86:F7\t\tGoogle, Inc.\n38:87:D5\t\tIntel Corporate\n38:88:1E\t\tHuawei Technologies Co.,Ltd\n38:88:71\t\tAskey Computer Corp\n38:88:A4\t\tApple, Inc.\n38:89:2C\t\tApple, Inc.\n38:89:DC\t\tOpticon Sensors Europe B.V.\n38:8A:06\t\tSamsung Electronics Co.,Ltd\n38:8A:21\t\tUAB \"Teltonika Telematics\"\n38:8A:B7\t\tITC Networks\n38:8A:BE\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n38:8B:59\t\tGoogle, Inc.\n38:8C:50\t\tLG Electronics\n38:8D:3D\t\tWistron Neweb Corporation\n38:8E:7A\t\tAutoit\n38:8E:E7\t\tFanhattan LLC\n38:8F:30\t\tSamsung Electronics Co.,Ltd\n38:90:52\t\tHuawei Technologies Co.,Ltd\n38:90:A5\t\tCisco Systems, Inc\n38:90:AF\t\tzte corporation\n38:91:48\t\tzte corporation\n38:91:B7\t\tCisco Systems, Inc\n38:91:D5\t\tHangzhou H3C Technologies Co., Limited\n38:91:FB\t\tXenox Holding BV\n38:92:01\t\tTianyi Telecom Terminals Company Limited\n38:92:2E\t\tArrayComm\n38:92:31\t\tTecno Mobile Limited\n38:94:61\t\tRenesas Electronics (Penang) Sdn. Bhd.\n38:94:96\t\tSamsung Electronics Co.,Ltd\n38:94:E0\t\tSyrotech Networks. Ltd.\n38:94:ED\t\tNetgear\n38:95:92\t\tTendyron Corporation\n38:97:A4\t\tElecom Co.,Ltd.\n38:97:D6\t\tHangzhou H3C Technologies Co., Limited\n38:98:D8\t\tMeritech Co.,Ltd\n38:98:E9\t\tHuawei Device Co., Ltd.\n38:9A:F6\t\tSamsung Electronics Co.,Ltd\n38:9C:B2\t\tApple, Inc.\n38:9D:92\t\tSeiko Epson Corporation\n38:9E:4C\t\tHewlett Packard Enterprise\n38:9E:80\t\tzte corporation\n38:9F:5A\t\tC-Kur TV Inc.\n38:9F:83\t\tOTN Systems N.V.\n38:A0:67\t\tNokia Solutions and Networks GmbH & Co. KG\n38:A2:8C\t\tShenzhen Rf-Link Technology Co.,Ltd.\n38:A4:4B\t\tHuawei Device Co., Ltd.\n38:A4:ED\t\tXiaomi Communications Co Ltd\n38:A5:3C\t\tCOMECER Netherlands\n38:A5:B6\t\tShenzhen Megmeet Electrical Co.,Ltd\n38:A5:C9\t\tTuya Smart Inc.\n38:A6:59\t\tSagemcom Broadband SAS\n38:A6:CE\t\tSky Uk Limited\n38:A7:46\t\tCompal Information (Kunshan) Co., Ltd.\n38:A8:51\t\tQuickset Defense Technologies, LLC\n38:A8:6B\t\tOrga BV\n38:A8:9B\t\tFiberhome Telecommunication Technologies Co.,LTD\n38:A8:CD\t\tIEEE Registration Authority\n38:A8:CD:00:00:00/28\tACiiST Smart Networks Ltd.\n38:A8:CD:10:00:00/28\tFujica System Co., ltd\n38:A8:CD:20:00:00/28\tBeijing Porient Technology Co., Ltd\n38:A8:CD:30:00:00/28\tDongguan Fyrnetics Co., Ltd\n38:A8:CD:40:00:00/28\tWHITEvoid GmbH\n38:A8:CD:50:00:00/28\tRevo Infratech USA Ltd\n38:A8:CD:60:00:00/28\tcal4care Pte Ltd\n38:A8:CD:70:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n38:A8:CD:80:00:00/28\tMax Way Electronics Co., Ltd.\n38:A8:CD:90:00:00/28\tPT Supertone\n38:A8:CD:A0:00:00/28\tNIC Technologii\n38:A8:CD:B0:00:00/28\tQingdao Hisense Hitachi Air-conditioning Systems Co.,Ltd.\n38:A8:CD:C0:00:00/28\tBeijing Aumiwalker technology CO.,LTD\n38:A8:CD:D0:00:00/28\tAnnapurna labs\n38:A8:CD:E0:00:00/28\tOutform\n38:A9:1C\t\tNew H3C Technologies Co., Ltd\n38:A9:5F\t\tActifio Inc\n38:A9:EA\t\tHk Dapu Electronic Technology Co., Limited\n38:AA:09\t\tCisco Systems, Inc\n38:AA:20\t\tzte corporation\n38:AA:3C\t\tSamsung Electro Mechanics Co., Ltd.\n38:AB:16\t\tNpo Rtt Llc\n38:AB:41\t\tTexas Instruments\n38:AC:3D\t\tNephos Inc\n38:AC:DD\t\tValenco GmbH\n38:AD:2B\t\tHitron Technologies. Inc\n38:AD:8E\t\tNew H3C Technologies Co., Ltd\n38:AD:BE\t\tNew H3C Technologies Co., Ltd\n38:AF:29\t\tZhejiang Dahua Technology Co., Ltd.\n38:AF:D0\t\tNevro\n38:AF:D7\t\tFujitsu Limited\n38:B1:2D\t\tSonotronic Nagel GmbH\n38:B1:9E\t\tIEEE Registration Authority\n38:B1:9E:00:00:00/28\tTriple Jump Medical\n38:B1:9E:10:00:00/28\tFreedompro Srl\n38:B1:9E:20:00:00/28\tHdanywhere\n38:B1:9E:30:00:00/28\tAvo Development Ltd\n38:B1:9E:40:00:00/28\tBasalte BVBA\n38:B1:9E:50:00:00/28\tStar Electronics GmbH & CoKG\n38:B1:9E:60:00:00/28\tThrust Networks\n38:B1:9E:70:00:00/28\tBeijing Memblaze Technology Co Ltd\n38:B1:9E:80:00:00/28\tBoCo Inc.\n38:B1:9E:90:00:00/28\tDoepke Schaltgeräte GmbH\n38:B1:9E:A0:00:00/28\tAeroespacial Guosheng Technology Co., Ltd\n38:B1:9E:B0:00:00/28\tSystem Q Ltd\n38:B1:9E:C0:00:00/28\tGesellschaft industrieller Technologien\n38:B1:9E:D0:00:00/28\tDallas Delta Corporation\n38:B1:9E:E0:00:00/28\tShenZhen ShuaiXian Electronic Equipment Co.Ltd\n38:B1:DB\t\tHon Hai Precision Ind. Co.,Ltd.\n38:B3:F7\t\tHuawei Device Co., Ltd.\n38:B4:D3\t\tBSH Hausgeraete GmbH\n38:B5:4D\t\tApple, Inc.\n38:B5:BD\t\tE.G.O. Elektro-Ger\n38:B5:C9\t\tIngram Micro Services\n38:B5:D3\t\tSecuWorks\n38:B7:25\t\tWistron Infocomm (Zhongshan) Corporation\n38:B7:4D\t\tFijowave Limited\n38:B8:00\t\tWistron Neweb Corporation\n38:B8:EB\t\tIEEE Registration Authority\n38:B8:EB:00:00:00/28\tBumjin C&L Co., Ltd.\n38:B8:EB:10:00:00/28\t1.A Connect GmbH\n38:B8:EB:20:00:00/28\tbarox Kommunikation GmbH\n38:B8:EB:30:00:00/28\tAina Wireless Inc\n38:B8:EB:40:00:00/28\tUmlogics\n38:B8:EB:50:00:00/28\tDojo-Labs Ltd\n38:B8:EB:60:00:00/28\tMatrixstream Technologies, Inc.\n38:B8:EB:70:00:00/28\tSirin Mobile Technologies\n38:B8:EB:80:00:00/28\tCeeNex Inc\n38:B8:EB:90:00:00/28\tNHS Sistemas de Energia\n38:B8:EB:A0:00:00/28\tSecad Sa\n38:B8:EB:B0:00:00/28\tPEZY Computing K.K.\n38:B8:EB:C0:00:00/28\tAjax Systems Inc\n38:B8:EB:D0:00:00/28\tYellowbrick Data, Inc.\n38:B8:EB:E0:00:00/28\tWT-Consulting SAS\n38:B9:AF\t\tNXP Semiconductors Taiwan Ltd.\n38:BA:B0\t\tBroadcom\n38:BA:F8\t\tIntel Corporate\n38:BB:23\t\tOzVision America LLC\n38:BB:3C\t\tAvaya Inc\n38:BC:01\t\tHuawei Technologies Co.,Ltd\n38:BC:1A\t\tMEIZU Technology Co., Ltd.\n38:BC:61\t\tStarkoff Co., Ltd.\n38:BD:7A\t\tHewlett Packard Enterprise\n38:BE:AB\t\tAltoBeam (China) Inc.\n38:BF:2F\t\tEspec Corp.\n38:BF:33\t\tNEC CASIO Mobile Communications\n38:C0:96\t\tAlpsalpine Co,.Ltd\n38:C0:EA\t\tFortinet, Inc.\n38:C2:BA\t\tCctv Neotech\n38:C4:3A\t\tApple, Inc.\n38:C4:E8\t\tNSS Sp. z o.o.\n38:C6:BD\t\tXiaomi Communications Co Ltd\n38:C7:0A\t\tWiFiSong\n38:C7:BA\t\tCS Services Co.,Ltd.\n38:C8:04\t\tHui Zhou Gaoshengda Technology Co.,LTD\n38:C8:5C\t\tCisco SPVTG\n38:C9:86\t\tApple, Inc.\n38:C9:A9\t\tSMART High Reliability Solutions, Inc.\n38:CA:73\t\tShenzhen MiaoMing  Intelligent Technology Co.,Ltd\n38:CA:84\t\tHP Inc.\n38:CA:97\t\tContour Design LLC\n38:CA:DA\t\tApple, Inc.\n38:CD:07\t\tBeijing FaceCam Technology Co., Ltd.\n38:D0:9C\t\tHuawei Technologies Co.,Ltd\n38:D1:35\t\tEasyIO Corporation Sdn. Bhd.\n38:D2:69\t\tTexas Instruments\n38:D2:CA\t\tZhejiang Tmall Technology Co., Ltd.\n38:D4:0B\t\tSamsung Electronics Co.,Ltd\n38:D5:18\t\tGooWi Wireless Technology Co., Limited\n38:D5:47\t\tASUSTek COMPUTER INC.\n38:D5:7A\t\tCloud Network Technology Singapore Pte. Ltd.\n38:D6:20\t\tLimidea Concept Pte. Ltd.\n38:D6:E0\t\tTOPDON TECHNOLOGY Co.,Ltd.\n38:D7:CA\t\t7Hugs Labs\n38:D8:2F\t\tzte corporation\n38:D9:A5\t\tMikotek Information Inc.\n38:DB:BB\t\tSunbow Telecom Co., Ltd.\n38:DE:35\t\tGuangzhou Yuandianhe Communication Technology Co.,Ltd\n38:DE:60\t\tMohlenhoff GmbH\n38:DE:AD\t\tIntel Corporate\n38:E0:8E\t\tMitsubishi Electric Corporation\n38:E1:3D\t\tApple, Inc.\n38:E1:AA\t\tzte corporation\n38:E1:F4\t\tSagemcom Broadband SAS\n38:E2:6E\t\tShenZhen Sweet Rain Electronics Co.,Ltd.\n38:E2:CA\t\tKatun Corporation\n38:E2:DD\t\tzte corporation\n38:E3:9F\t\tMotorola Mobility LLC, a Lenovo Company\n38:E3:C5\t\tTaicang T&W Electronics\n38:E5:63\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n38:E5:95\t\tShenzhen Gongjin Electronics Co.,Lt\n38:E6:0A\t\tXiaomi Communications Co Ltd\n38:E7:C0\t\tHui Zhou Gaoshengda Technology Co.,LTD\n38:E7:D8\t\tHTC Corporation\n38:E8:DF\t\tb gmbh medien + datenbanken\n38:E8:EE\t\tNanjing Youkuo Electric Technology Co., Ltd\n38:E9:8C\t\tReco S.p.A.\n38:EA:A7\t\tHewlett Packard\n38:EB:47\t\tHuawei Technologies Co.,Ltd\n38:EC:0D\t\tApple, Inc.\n38:EC:11\t\tNovatek Microelectronics Corp.\n38:EC:E4\t\tSamsung Electronics Co.,Ltd\n38:ED:18\t\tCisco Systems, Inc\n38:EE:9D\t\tAnedo Ltd.\n38:EF:E3\t\tIngenico Terminals Sas\n38:F0:98\t\tVapor Stone Rail Systems\n38:F0:BB\t\tCompuSoft A/S\n38:F0:C8\t\tLogitech\n38:F1:35\t\tSensorTec-Canada\n38:F1:8F\t\tTechnicolor (China) Technology Co., Ltd.\n38:F1:95\t\tHuawei Technologies Co.,Ltd\n38:F2:0D\t\tJuniper Networks\n38:F2:3E\t\tMicrosoft Mobile Oy\n38:F3:2E\t\tSkullcandy\n38:F3:3F\t\tTatsuno Corporation\n38:F3:AB\t\tLCFC(Hefei) Electronics Technology co., ltd\n38:F3:FB\t\tAsperiq\n38:F4:5E\t\tH1-Radio co.,ltd\n38:F5:54\t\tHisense Electric Co.,Ltd\n38:F5:57\t\tJolata, Inc.\n38:F5:97\t\thome2net GmbH\n38:F6:01\t\tSolid State Storage Technology Corporation\n38:F6:CF\t\tzte corporation\n38:F6:ED\t\tEVK DI Kerschhaggl GmbH\n38:F7:08\t\tNational Resource Management, Inc.\n38:F7:3D\t\tAmazon Technologies Inc.\n38:F7:B2\t\tSeojun Electric\n38:F7:CD\t\tIEEE Registration Authority\n38:F7:CD:00:00:00/28\tPolska Fabryka Wodomierzy i Ciep?omierzy FILA\n38:F7:CD:10:00:00/28\tNZIA Connect Inc\n38:F7:CD:20:00:00/28\tRIPower Co.,Ltd\n38:F7:CD:30:00:00/28\tVanguard\n38:F7:CD:40:00:00/28\tNordi Telekommunikatsiooni Oü\n38:F7:CD:50:00:00/28\tShanghai qinzhuo Electronic Co., Ltd.\n38:F7:CD:60:00:00/28\tFast Cotton(Beijing) Limited\n38:F7:CD:70:00:00/28\tArunas Pty Ltd\n38:F7:CD:80:00:00/28\tBlastWave Inc.\n38:F7:CD:90:00:00/28\tRFbeam Microwave GmbH\n38:F7:CD:A0:00:00/28\tDistech Controls\n38:F7:CD:B0:00:00/28\tFibergate Inc.\n38:F7:CD:C0:00:00/28\tShenzhen MADIGI Electronic Technology Co., Ltd\n38:F7:CD:D0:00:00/28\tMacherey-Nagel GmbH & Co. KG\n38:F7:CD:E0:00:00/28\tApt Mobile Satcom Limited\n38:F7:F1\t\tHuawei Device Co., Ltd.\n38:F8:5E\t\tHUMAX Co., Ltd.\n38:F8:89\t\tHuawei Technologies Co.,Ltd\n38:F8:B7\t\tV2Com Participacoes S.A.\n38:F8:CA\t\tOWIN Inc.\n38:F8:F6\t\tAdtran Inc\n38:F9:D3\t\tApple, Inc.\n38:F9:F5\t\tGarmin International\n38:FA:CA\t\tSkyworth Digital Technology(Shenzhen) Co.,Ltd\n38:FB:14\t\tHuawei Technologies Co.,Ltd\n38:FC:34\t\tHuawei Device Co., Ltd.\n38:FC:98\t\tIntel Corporate\n38:FD:F5\t\tRenesas Electronics (Penang) Sdn. Bhd.\n38:FD:F8\t\tCisco Systems, Inc\n38:FD:FE\t\tIEEE Registration Authority\n38:FD:FE:00:00:00/28\tEdge I&D Co., Ltd.\n38:FD:FE:10:00:00/28\tWaytone (Beiijng) Communications Co.,Ltd\n38:FD:FE:20:00:00/28\tSmart Solution Technology, Inc\n38:FD:FE:30:00:00/28\tSiemens AG, DI PA AE\n38:FD:FE:40:00:00/28\tNew Telecom Solutions LLC\n38:FD:FE:50:00:00/28\tCaptiveAire Systems Inc.\n38:FD:FE:60:00:00/28\tInspero Inc\n38:FD:FE:70:00:00/28\tRademacher Geraete-Elektronik GmbH\n38:FD:FE:80:00:00/28\tIndra Navia AS\n38:FD:FE:90:00:00/28\tOOO Group of Industrial Technologies\n38:FD:FE:A0:00:00/28\tManagement Service Corporation\n38:FD:FE:B0:00:00/28\tSwedish Adrenaline AB\n38:FD:FE:C0:00:00/28\tNew Garden Co., Ltd.\n38:FD:FE:D0:00:00/28\tFUBA Automotive Electronics GmbH\n38:FD:FE:E0:00:00/28\tiSmart electronic technology co.,LTD\n38:FE:C5\t\tEllips B.V.\n38:FF:13\t\tJoint Stock Company \"Research Instinite \"Masshtab\"\n38:FF:36\t\tRuckus Wireless\n3A:02:92\t\tVideo Electronics Standards Association\n3A:0E:75\t\tKevcom Llc\n3A:1E:C0\t\tGenesis\n3A:35:41\t\tRaspberry Pi (Trading) Ltd\n3A:5A:27\t\tShenzhen Longsys Electronics Co.,Ltd.\n3A:5E:03\t\tCirrus Data Solutions, Inc\n3A:72:C2\t\tHuawei Technologies Co.,Ltd\n3A:76:5D\t\tNewCoSemi(Beijing) Technology Co., Ltd\n3A:78:CA\t\tSoundTalks NV\n3A:79:6E\t\tLX Semicon co.,Ltd.\n3A:A3:F8\t\tIEEE 802.1 Chair\n3A:BA:37\t\tCirrent\n3A:C6:CF\t\tParakey AB\n3A:CF:C5\t\tQuickline AG\n3A:F5:21\t\tSingle Digits\n3C:01:EF\t\tSony Corporation\n3C:02:68\t\tInfinera, Inc.\n3C:02:B1\t\tCreation Technologies LP\n3C:04:61\t\tCommscope\n3C:04:BF\t\tPRAVIS SYSTEMS Co.Ltd.,\n3C:05:18\t\tSamsung Electronics Co.,Ltd\n3C:05:8E\t\tHuawei Technologies Co.,Ltd\n3C:05:AB\t\tProduct Creation Studio\n3C:06:30\t\tApple, Inc.\n3C:06:64\t\tBeijing Leagrid Technology Co.,Ltd.\n3C:06:A7\t\tTp-Link Technologies Co.,Ltd.\n3C:07:54\t\tApple, Inc.\n3C:07:71\t\tSony Corporation\n3C:07:D7\t\tApple, Inc.\n3C:08:1E\t\tBeijing Yupont Electric Power Technology Co.,Ltd\n3C:08:68\t\tPower Plus Communications AG\n3C:08:CD\t\tJuniper Networks\n3C:08:F6\t\tCisco Systems, Inc\n3C:09:6D\t\tPowerhouse Dynamics\n3C:0A:7A\t\tSamsung Electronics Co.,Ltd\n3C:0A:F3\t\tCloud Network Technology Singapore Pte. Ltd.\n3C:0B:4F\t\tIntertech Services AG\n3C:0B:59\t\tTuya Smart Inc.\n3C:0C:48\t\tServergy, Inc.\n3C:0C:7D\t\tTiny Mesh AS\n3C:0C:DB\t\tUnion Man Technology Co.,Ltd\n3C:0D:2C\t\tLiquid-Markets GmbH\n3C:0E:23\t\tCisco Systems, Inc\n3C:0F:C1\t\tKBC Networks\n3C:10:40\t\tdaesung network\n3C:10:60\t\tFiberhome Telecommunication Technologies Co.,LTD\n3C:10:6F\t\tAlbahith Technologies\n3C:10:E6\t\tPHAZR Inc.\n3C:11:B2\t\tFraunhofer FIT\n3C:13:5A\t\tXiaomi Communications Co Ltd\n3C:13:BB\t\tHuawei Technologies Co.,Ltd\n3C:13:CC\t\tCisco Systems, Inc\n3C:15:12\t\tShenzhen Huanhu Technology Co.,Ltd\n3C:15:C2\t\tApple, Inc.\n3C:15:EA\t\tTescom Co., Ltd.\n3C:15:FB\t\tHuawei Technologies Co.,Ltd\n3C:16:40\t\tQingdao Haier Technology Co.,Ltd\n3C:17:10\t\tSagemcom Broadband SAS\n3C:18:9F\t\tNokia Corporation\n3C:18:A0\t\tLuxshare Precision Industry Company Limited\n3C:19:15\t\tGFI Chrono Time\n3C:19:5E\t\tSamsung Electronics Co.,Ltd\n3C:19:7D\t\tEricsson AB\n3C:19:CB\t\tTecno Mobile Limited\n3C:1A:0F\t\tClearSky Data\n3C:1A:57\t\tCardiopulmonary Corp\n3C:1A:65\t\tNokia\n3C:1A:79\t\tHuayuan Technology CO.,LTD\n3C:1A:9E\t\tVitalThings AS\n3C:1B:F8\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n3C:1C:BE\t\tJadak Llc\n3C:1E:04\t\tD-Link International\n3C:1E:13\t\tHangzhou Sunrise Technology Co., Ltd\n3C:1E:B5\t\tApple, Inc.\n3C:20:93\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n3C:20:F6\t\tSamsung Electronics Co.,Ltd\n3C:21:9C\t\tIntel Corporate\n3C:22:FB\t\tApple, Inc.\n3C:24:F0\t\tIEEE Registration Authority\n3C:24:F0:00:00:00/28\tShenzhen Pinsida Technology Co.,Ltd.\n3C:24:F0:10:00:00/28\tAbrites Ltd.\n3C:24:F0:20:00:00/28\tLaipac Technology Inc.\n3C:24:F0:30:00:00/28\tWisycom\n3C:24:F0:40:00:00/28\tInter-Coastal Electronics\n3C:24:F0:50:00:00/28\tCASKY eTech Co., Ltd.\n3C:24:F0:60:00:00/28\tInter Action Corporation\n3C:24:F0:70:00:00/28\tSwissdotnet SA\n3C:24:F0:80:00:00/28\tSivat Technology Co.,Ltd.\n3C:24:F0:90:00:00/28\tSiemens AG - Siemens Deutschland Mobility\n3C:24:F0:A0:00:00/28\tShenzhen Bestway Technology Co., Ltd\n3C:24:F0:B0:00:00/28\tComatis\n3C:24:F0:C0:00:00/28\tAuthentico Technologies\n3C:24:F0:D0:00:00/28\tTravis Holding B.V.\n3C:24:F0:E0:00:00/28\tGetmobit Llc\n3C:25:D7\t\tNokia Corporation\n3C:25:F8\t\tDell Inc.\n3C:26:D5\t\tSotera Wireless\n3C:26:E4\t\tCisco Systems, Inc\n3C:27:63\t\tSLE quality engineering GmbH & Co. KG\n3C:28:6D\t\tGoogle, Inc.\n3C:28:A6\t\tAlcatel-Lucent Enterprise (China)\n3C:2A:F4\t\tBrother Industries, LTD.\n3C:2C:30\t\tDell Inc.\n3C:2C:94\t\t杭州德澜科技有限公司（HangZhou Delan Technology Co.,Ltd）\n3C:2C:99\t\tEdgecore Networks Corporation\n3C:2C:A6\t\tBeijing Xiaomi Electronics Co.,Ltd\n3C:2D:9E\t\tVantiva - Connected Home\n3C:2D:B7\t\tTexas Instruments\n3C:2E:F5\t\tSilicon Laboratories\n3C:2E:F9\t\tApple, Inc.\n3C:2E:FF\t\tApple, Inc.\n3C:2F:3A\t\tSFORZATO Corp.\n3C:30:0C\t\tDewar Electronics Pty Ltd\n3C:30:6F\t\tHuawei Technologies Co.,Ltd\n3C:31:74\t\tGoogle, Inc.\n3C:31:78\t\tQolsys Inc.\n3C:31:8A\t\tSamsung Electronics Co.,Ltd\n3C:32:B9\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n3C:33:00\t\tShenzhen Bilian electronic CO.,LTD\n3C:33:32\t\tD-Link Corporation\n3C:34:64\t\tApple, Inc.\n3C:35:56\t\tCognitec Systems GmbH\n3C:35:76\t\tItel Mobile Limited\n3C:36:3D\t\tNokia Corporation\n3C:36:6A\t\tHuawei Technologies Co.,Ltd\n3C:36:E4\t\tCommscope\n3C:37:12\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n3C:37:86\t\tNetgear\n3C:38:24\t\tXiaomi Communications Co Ltd\n3C:38:88\t\tConnectQuest, llc\n3C:38:F4\t\tSony Corporation\n3C:39:A8\t\tShenzhen Taichi Technology Limited\n3C:39:C3\t\tJW Electronics Co., Ltd.\n3C:39:C8\t\tApple, Inc.\n3C:39:E7\t\tIEEE Registration Authority\n3C:39:E7:00:00:00/28\tHannstar Display Corp\n3C:39:E7:10:00:00/28\tBEWATEC Kommunikationstechnik GmbH\n3C:39:E7:20:00:00/28\tHomeWizard B.V.\n3C:39:E7:30:00:00/28\tELSA Japan Inc.\n3C:39:E7:40:00:00/28\tUniversity of British Columbia\n3C:39:E7:50:00:00/28\tAttrackting AG\n3C:39:E7:60:00:00/28\tRO.VE.R. Laboratories S.p.A\n3C:39:E7:70:00:00/28\tSensor to Image GmbH\n3C:39:E7:80:00:00/28\tMartem AS\n3C:39:E7:90:00:00/28\tZone Controls AB\n3C:39:E7:A0:00:00/28\tiiM AG\n3C:39:E7:B0:00:00/28\tchipsguide technology Co.,LTD\n3C:39:E7:C0:00:00/28\tVanstone Electronic (Beijing)Co,. Ltd.\n3C:39:E7:E0:00:00/28\tMarposs Spa\n3C:39:E7:F0:00:00/28\tPrivate\n3C:3A:73\t\tAvaya Inc\n3C:3B:4D\t\tToyo Seisakusho Kaisha, Limited\n3C:3B:77\t\tApple, Inc.\n3C:3B:99\t\tItel Mobile Limited\n3C:3B:AD\t\tChina Dragon Technology Limited\n3C:3F:51\t\t2Crsi\n3C:40:15\t\t12mm Health Technology (Hainan) Co., Ltd.\n3C:40:4F\t\tGuangdong Pisen Electronics Co.,Ltd\n3C:41:0E\t\tCisco Systems, Inc\n3C:42:7E\t\tIEEE Registration Authority\n3C:42:7E:00:00:00/28\tGrandway Technology (Shenzhen) Limited\n3C:42:7E:10:00:00/28\tDongguan Taide Industrial Co.,Ltd.\n3C:42:7E:20:00:00/28\tStarloop Tech Co., Ltd.\n3C:42:7E:30:00:00/28\tShenzhen VETAS Communication Technology Co , Ltd.\n3C:42:7E:40:00:00/28\tTeknoware Oy\n3C:42:7E:50:00:00/28\tGeoplan Korea\n3C:42:7E:60:00:00/28\tEdit Srl\n3C:42:7E:70:00:00/28\tGJS Co., Ltd.\n3C:42:7E:80:00:00/28\tUbtech Robotics Corp\n3C:42:7E:90:00:00/28\tTaitex Corporation\n3C:42:7E:A0:00:00/28\tsnap40 Ltd\n3C:42:7E:B0:00:00/28\tCompal Electronics INC.\n3C:42:7E:C0:00:00/28\tPrivacy Labs\n3C:42:7E:D0:00:00/28\tRobox Smart Motion (Wuhu) Co.,Ltd\n3C:42:7E:E0:00:00/28\tXiaoniu network technology (Shanghai) Co., Ltd.\n3C:43:8E\t\tCommscope\n3C:45:0B\t\tSentry Equipment Corp.\n3C:45:7A\t\tSky Uk Limited\n3C:46:45\t\tShanghai Infinity Wireless Technologies Co.,Ltd.\n3C:46:A1\t\tRuckus Wireless\n3C:46:D8\t\tTp-Link Technologies Co.,Ltd.\n3C:47:11\t\tHuawei Technologies Co.,Ltd\n3C:47:9B\t\tTheissen Training Systems, Inc.\n3C:49:37\t\tASSMANN Electronic GmbH\n3C:4A:92\t\tHewlett Packard\n3C:4A:C9\t\tHuawei Device Co., Ltd.\n3C:4C:69\t\tInfinity System S.L.\n3C:4C:D0\t\tCeragon Networks\n3C:4D:BE\t\tApple, Inc.\n3C:4E:47\t\tEtronic A/S\n3C:4E:56\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\n3C:50:02\t\tApple, Inc.\n3C:51:0E\t\tCisco Systems, Inc\n3C:52:82\t\tHewlett Packard\n3C:52:A1\t\tTP-Link Systems Inc\n3C:53:D7\t\tCedes Ag\n3C:54:47\t\tHuawei Technologies Co.,Ltd\n3C:55:76\t\tCloud Network Technology Singapore Pte. Ltd.\n3C:55:DB\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n3C:56:6E\t\tInfinix mobility limited\n3C:57:31\t\tCisco Systems, Inc\n3C:57:4F\t\tChina Mobile Group Device Co.,Ltd.\n3C:57:65\t\tUnionman Technology Co.,Ltd\n3C:57:6C\t\tSamsung Electronics Co.,Ltd\n3C:57:BD\t\tKessler Crane Inc.\n3C:57:D5\t\tFiveCo\n3C:58:36\t\tSagemcom Broadband SAS\n3C:58:5D\t\tSagemcom Broadband SAS\n3C:58:C2\t\tIntel Corporate\n3C:59:1E\t\tTCL King Electrical Appliances (Huizhou) Co., Ltd\n3C:59:C0\t\tHuawei Technologies Co.,Ltd\n3C:5A:37\t\tSamsung Electronics Co.,Ltd\n3C:5A:B4\t\tGoogle, Inc.\n3C:5C:C3\t\tShenzhen First Blue Chip Technology Ltd\n3C:5C:C4\t\tAmazon Technologies Inc.\n3C:5C:F1\t\teero inc.\n3C:5D:29\t\tZhejiang Tmall Technology Co., Ltd.\n3C:5E:C3\t\tCisco Systems, Inc\n3C:5F:01\t\tSynerchip Co., Ltd.\n3C:61:04\t\tJuniper Networks\n3C:61:05\t\tEspressif Inc.\n3C:62:00\t\tSamsung Electronics Co.,Ltd\n3C:62:78\t\tShenzhen Jetnet Technology Co.,Ltd.\n3C:62:F0\t\tSercomm Corporation.\n3C:64:CF\t\tTP-Link Systems Inc\n3C:67:16\t\tLily Robotics\n3C:67:2C\t\tSciovid Inc.\n3C:67:8C\t\tHuawei Technologies Co.,Ltd\n3C:68:16\t\tVXi Corporation\n3C:69:D1\t\tADC Automotive Distance Control System GmbH\n3C:6A:2C\t\tIEEE Registration Authority\n3C:6A:2C:00:00:00/28\tRio Lago Technologies  LLC\n3C:6A:2C:10:00:00/28\tOlibra LLC\n3C:6A:2C:20:00:00/28\tBosch Automotive Products (Suzhou) Co., Ltd.\n3C:6A:2C:30:00:00/28\tfigur8, Inc.\n3C:6A:2C:40:00:00/28\tXi'An Yep Telecom Technology Co.,Ltd\n3C:6A:2C:50:00:00/28\tQingdao iGuan Technology Co., Ltd.\n3C:6A:2C:60:00:00/28\tLa Barrière Automatique\n3C:6A:2C:70:00:00/28\tHomegear GmbH\n3C:6A:2C:80:00:00/28\tTP Radio\n3C:6A:2C:90:00:00/28\tWICKS Co., Ltd.\n3C:6A:2C:A0:00:00/28\tMetro\n3C:6A:2C:B0:00:00/28\tPhytium Technology Co., Ltd.\n3C:6A:2C:C0:00:00/28\tEltov System\n3C:6A:2C:D0:00:00/28\tXiamen Smarttek CO., Ltd.\n3C:6A:2C:E0:00:00/28\tBeijing Donghua Hongtai Polytron Technologies Inc\n3C:6A:48\t\tTp-Link Technologies Co.,Ltd.\n3C:6A:7D\t\tNiigata Power Systems Co., Ltd.\n3C:6A:9D\t\tDexatek Technology LTD.\n3C:6A:A7\t\tIntel Corporate\n3C:6A:D2\t\tTP-Link Systems Inc.\n3C:6D:66\t\tNVIDIA Corporation\n3C:6D:89\t\tApple, Inc.\n3C:6E:63\t\tMitron OY\n3C:6F:45\t\tFiberpro Inc.\n3C:6F:9B\t\tzte corporation\n3C:6F:EA\t\tPanasonic India Pvt. Ltd.\n3C:6F:F7\t\tEnTek Systems, Inc.\n3C:70:59\t\tMakerBot Industries\n3C:71:BF\t\tEspressif Inc.\n3C:74:37\t\tRim\n3C:75:4A\t\tCommscope\n3C:76:25\t\tzte corporation\n3C:77:87\t\tHuawei Device Co., Ltd.\n3C:77:E6\t\tHon Hai Precision Ind. Co.,Ltd.\n3C:78:43\t\tHuawei Technologies Co.,Ltd\n3C:78:73\t\tAirsonics\n3C:79:2B\t\tDongguan Auklink TechnologyCo.,Ltd\n3C:7A:8A\t\tCommscope\n3C:7A:AA\t\tChina Dragon Technology Limited\n3C:7A:C4\t\tChemtronics\n3C:7A:F0\t\tItel Mobile Limited\n3C:7C:3F\t\tASUSTek COMPUTER INC.\n3C:7D:0A\t\tApple, Inc.\n3C:7D:B1\t\tTexas Instruments\n3C:7F:6F\t\tTelechips, Inc.\n3C:80:6B\t\tHunan Voc Acoustics Technology Co., Ltd.\n3C:80:AA\t\tRansnet Singapore Pte Ltd\n3C:81:D8\t\tSagemcom Broadband SAS\n3C:82:C0\t\tVantiva USA LLC\n3C:83:1E\t\tCKD Corporation\n3C:83:75\t\tMicrosoft Corporation\n3C:83:B5\t\tAdvance Vision Electronics Co. Ltd.\n3C:84:27\t\tEspressif Inc.\n3C:84:6A\t\tTp-Link Technologies Co.,Ltd.\n3C:86:9A\t\tHuawei Technologies Co.,Ltd\n3C:86:A8\t\tSangshin elecom .co,, LTD\n3C:86:D1\t\tvivo Mobile Communication Co., Ltd.\n3C:89:4D\t\tDr. Ing. h.c. F. Porsche AG\n3C:89:70\t\tNeosfar\n3C:89:94\t\tSky Uk Limited\n3C:89:A6\t\tKapelse\n3C:8A:1F\t\tEspressif Inc.\n3C:8A:B0\t\tJuniper Networks\n3C:8A:E5\t\tTensun Information Technology(Hangzhou) Co.,LTD\n3C:8B:7F\t\tCisco Systems, Inc\n3C:8B:CD\t\tAlcatel-Lucent Shanghai Bell Co., Ltd\n3C:8B:FE\t\tSamsung Electronics Co.,Ltd\n3C:8C:40\t\tHangzhou H3C Technologies Co., Limited\n3C:8C:93\t\tJuniper Networks\n3C:8C:F8\t\tTRENDnet, Inc.\n3C:8D:20\t\tGoogle, Inc.\n3C:8F:06\t\tShenzhen Libtor Technology Co.,Ltd\n3C:90:66\t\tSmartRG, Inc.\n3C:90:E0\t\tHuawei Technologies Co.,Ltd\n3C:91:2B\t\tVexata Inc\n3C:91:57\t\tYulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd\n3C:91:74\t\tAlong Communication Technology\n3C:91:80\t\tLiteon Technology Corporation\n3C:92:DC\t\tOctopod Technology Co. Ltd.\n3C:93:F4\t\tHuawei Technologies Co.,Ltd\n3C:94:D5\t\tJuniper Networks\n3C:94:FD\t\tMist Systems, Inc.\n3C:95:09\t\tLiteon Technology Corporation\n3C:97:0E\t\tWistron InfoComm(Kunshan)Co.,Ltd.\n3C:97:22\t\tshenzhen worldelite electronics co., LTD\n3C:97:7E\t\tIPS Technology Limited\n3C:98:72\t\tSercomm Corporation.\n3C:98:BF\t\tQuest Controls, Inc.\n3C:99:6D\t\tMarelli Europe s.p.a.\n3C:99:8C\t\tHouwa System Design Corp.\n3C:99:F7\t\tLansentechnology AB\n3C:9A:77\t\tVantiva USA LLC\n3C:9B:C6\t\tHuawei Device Co., Ltd.\n3C:9B:D6\t\tVizio, Inc\n3C:9C:0F\t\tIntel Corporate\n3C:9D:56\t\tHuawei Technologies Co.,Ltd\n3C:9E:C7\t\tSky Uk Limited\n3C:9F:81\t\tShenzhen CATIC Bit Communications Technology Co.,Ltd\n3C:9F:C3\t\tBeijing Sinead Technology Co., Ltd.\n3C:9F:CD\t\tShenzhen Neoway Technology Co.,Ltd.\n3C:A0:67\t\tLiteon Technology Corporation\n3C:A0:70\t\tBlink by Amazon\n3C:A1:0D\t\tSamsung Electronics Co.,Ltd\n3C:A1:61\t\tHuawei Technologies Co.,Ltd\n3C:A2:C3\t\tvivo Mobile Communication Co., Ltd.\n3C:A3:08\t\tTexas Instruments\n3C:A3:15\t\tBless Information & Communications Co., Ltd\n3C:A3:1A\t\tOilfind International LLC\n3C:A3:48\t\tvivo Mobile Communication Co., Ltd.\n3C:A3:7E\t\tHuawei Technologies Co.,Ltd\n3C:A5:81\t\tvivo Mobile Communication Co., Ltd.\n3C:A6:16\t\tvivo Mobile Communication Co., Ltd.\n3C:A6:2F\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n3C:A6:F6\t\tApple, Inc.\n3C:A7:2B\t\tMRV Communications (Networks) LTD\n3C:A7:AE\t\tzte corporation\n3C:A8:0A\t\tvivo Mobile Communication Co., Ltd.\n3C:A8:2A\t\tHewlett Packard\n3C:A8:ED\t\tsmart light technology\n3C:A9:16\t\tHuawei Device Co., Ltd.\n3C:A9:AB\t\tNintendo Co.,Ltd\n3C:A9:F4\t\tIntel Corporate\n3C:AA:3F\t\tiKey, Ltd.\n3C:AB:72\t\tNanjing Qinheng Microelectronics Co., Ltd.\n3C:AB:8E\t\tApple, Inc.\n3C:AE:69\t\tESA Elektroschaltanlagen Grimma GmbH\n3C:AF:B7\t\tXiaomi Communications Co Ltd\n3C:B0:7E\t\tArounds Intelligent Equipment Co., Ltd.\n3C:B0:ED\t\tNothing Technology Limited\n3C:B1:5B\t\tAvaya Inc\n3C:B1:7F\t\tWattwatchers Pty Ld\n3C:B2:33\t\tHuawei Device Co., Ltd.\n3C:B4:3D\t\tSZ Tenveo video technology co., Ltd\n3C:B5:3D\t\tHunan Goke Microelectronics Co.,Ltd\n3C:B6:B7\t\tvivo Mobile Communication Co., Ltd.\n3C:B6:E7\t\tHandheld Scientific, Inc.\n3C:B7:2B\t\tPLUMgrid Inc\n3C:B7:4B\t\tVantiva USA LLC\n3C:B7:92\t\tHitachi Maxell, Ltd., Optronics Division\n3C:B8:7A\t\tPrivate\n3C:B8:D6\t\tBluebank Communication Technology Co.,Ltd.\n3C:B9:A6\t\tBelden Deutschland GmbH\n3C:BB:73\t\tShenzhen Xinguodu Technology Co., Ltd.\n3C:BB:FD\t\tSamsung Electronics Co.,Ltd\n3C:BC:D0\t\tzte corporation\n3C:BD:14\t\tDiebold Nixdorf\n3C:BD:3E\t\tBeijing Xiaomi Electronics Co., Ltd.\n3C:BD:69\t\tNokia Shanghai Bell Co., Ltd.\n3C:BD:C5\t\tArcadyan Corporation\n3C:BD:D8\t\tLg Electronics Inc\n3C:BE:E1\t\tNikon Corporation\n3C:BF:60\t\tApple, Inc.\n3C:C0:3E\t\tHuawei Technologies Co.,Ltd\n3C:C0:79\t\tShenzhen One-Nine Intelligent Electronic Science and Technology Co., Ltd\n3C:C0:C6\t\td&b audiotechnik GmbH\n3C:C1:2C\t\tAES Corporation\n3C:C1:F6\t\tMelange Systems Pvt. Ltd.\n3C:C2:43\t\tNokia Corporation\n3C:C2:E1\t\tXinhua Control Engineering Co.,Ltd\n3C:C5:C7\t\tHuawei Technologies Co.,Ltd\n3C:C5:DD\t\tHui Zhou Gaoshengda Technology Co.,LTD\n3C:C6:83\t\tSichuan AI-Link Technology Co., Ltd.\n3C:C7:86\t\tDongguan Huarong Communication Technologies Co.,Ltd.\n3C:C9:9E\t\tHuiyang Technology Co., Ltd\n3C:CA:61\t\tTecno Mobile Limited\n3C:CA:87\t\tIders Incorporated\n3C:CB:4D\t\tAvikus Co., Ltd\n3C:CB:7C\t\tTCT mobile ltd\n3C:CD:36\t\tApple, Inc.\n3C:CD:40\t\tApple, Inc.\n3C:CD:57\t\tBeijing Xiaomi Mobile Software Co., Ltd\n3C:CD:5A\t\tTechnische Alternative GmbH\n3C:CD:5D\t\tHuawei Technologies Co.,Ltd\n3C:CD:73\t\tNebula Electronic Technology Corporation\n3C:CD:93\t\tLg Electronics Inc\n3C:CE:0D\t\tShenzhen juduoping Technology Co.,Ltd\n3C:CE:15\t\tMercedes-Benz USA, LLC\n3C:CE:73\t\tCisco Systems, Inc\n3C:CF:5B\t\tIcomm Hk Limited\n3C:CF:B4\t\tTelink Semiconductor (Shanghai) Co., Ltd.\n3C:D0:F8\t\tApple, Inc.\n3C:D1:6E\t\tTelepower Communication Co., Ltd\n3C:D1:C9\t\tGroupe SEB\n3C:D2:E5\t\tNew H3C Technologies Co., Ltd\n3C:D4:D6\t\tWirelessWERX, Inc\n3C:D7:DA\t\tSK Mtek microelectronics(shenzhen)limited\n3C:D9:2B\t\tHewlett Packard\n3C:D9:CE\t\tEclipse WiFi\n3C:DA:2A\t\tzte corporation\n3C:DA:6D\t\tTiandy Technologies CO.,LTD\n3C:DC:03\t\tIEEE Registration Authority\n3C:DC:03:00:00:00/28\tRancommunication Solutions Private Limited\n3C:DC:03:10:00:00/28\tZaptec\n3C:DC:03:20:00:00/28\tGuangdong Yada Electronics Co.,Ltd\n3C:DC:03:30:00:00/28\tShenzhen Xinruizhi Industrial Co., Ltd\n3C:DC:03:40:00:00/28\tAnnapurna labs\n3C:DC:03:50:00:00/28\tZhuhai Means Company Limited\n3C:DC:03:60:00:00/28\tATANS Technology Inc.\n3C:DC:03:70:00:00/28\tLINX Corporation\n3C:DC:03:80:00:00/28\tOceasoft Sas\n3C:DC:03:90:00:00/28\tible Technology Inc.\n3C:DC:03:A0:00:00/28\tWenet Technology Limited\n3C:DC:03:B0:00:00/28\tpakflow\n3C:DC:03:C0:00:00/28\tShenzhen Longsight Technology Co., Ltd.\n3C:DC:03:D0:00:00/28\tVieletech\n3C:DC:03:E0:00:00/28\tJP Morgan Chase Bank, N.A.\n3C:DC:75\t\tEspressif Inc.\n3C:DC:BC\t\tSamsung Electronics Co.,Ltd\n3C:DD:57\t\tApple, Inc.\n3C:DD:89\t\tSomo Holdings & Tech. Co.,Ltd.\n3C:DF:1E\t\tCisco Systems, Inc\n3C:DF:A9\t\tCommscope\n3C:DF:BD\t\tHuawei Technologies Co.,Ltd\n3C:E0:02\t\tTexas Instruments\n3C:E0:38\t\tOmnifi Inc.\n3C:E0:64\t\tTexas Instruments\n3C:E0:72\t\tApple, Inc.\n3C:E1:A1\t\tUniversal Global Scientific Industrial Co., Ltd.\n3C:E3:6B\t\tZhejiang Dahua Technology Co., Ltd.\n3C:E3:E7\t\tChina Mobile Group Device Co.,Ltd.\n3C:E4:41\t\tAmazon Technologies Inc.\n3C:E4:B0\t\tTexas Instruments\n3C:E5:A6\t\tHangzhou H3C Technologies Co., Limited\n3C:E5:B4\t\tKidasen Industria E Comercio De Antenas Ltda\n3C:E6:24\t\tLG Display\n3C:E8:24\t\tHuawei Technologies Co.,Ltd\n3C:E8:6E\t\tHewlett Packard Enterprise\n3C:E9:0E\t\tEspressif Inc.\n3C:E9:F7\t\tIntel Corporate\n3C:EA:4F\t\t2Wire Inc\n3C:EA:F9\t\tJubixcoltd\n3C:EA:FB\t\tNse Ag\n3C:EC:DE\t\tFujian Star-Net Communication Co.,Ltd\n3C:EC:EF\t\tSuper Micro Computer, Inc.\n3C:EF:42\t\tTCT mobile ltd\n3C:EF:8C\t\tZhejiang Dahua Technology Co., Ltd.\n3C:F0:11\t\tIntel Corporate\n3C:F0:83\t\tArcadyan Corporation\n3C:F3:41\t\tHosenso GmbH & Co. KG\n3C:F3:92\t\tVirtualtek. Co. Ltd\n3C:F4:F9\t\tModa-InnoChips\n3C:F5:2C\t\tDSPECIALISTS GmbH\n3C:F5:91\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n3C:F5:CC\t\tNew H3C Technologies Co., Ltd\n3C:F6:52\t\tzte corporation\n3C:F6:92\t\tHuawei Device Co., Ltd.\n3C:F7:2A\t\tNokia Corporation\n3C:F7:48\t\tShenzhen Linsn Technology Development Co.,Ltd\n3C:F7:A4\t\tSamsung Electronics Co.,Ltd\n3C:F7:D1\t\tOMRON Corporation\n3C:F8:08\t\tHuawei Technologies Co.,Ltd\n3C:F8:62\t\tIntel Corporate\n3C:F9:F0\t\tzte corporation\n3C:FA:06\t\tMicrosoft Corporation\n3C:FA:30\t\tPalo Alto Networks\n3C:FA:43\t\tHuawei Technologies Co.,Ltd\n3C:FA:80\t\tHuawei Technologies Co.,Ltd\n3C:FA:D3\t\tIEEE Registration Authority\n3C:FA:D3:00:00:00/28\tHome Control AS\n3C:FA:D3:10:00:00/28\tAnnapurna labs\n3C:FA:D3:20:00:00/28\tNaruida Technology Ltd.\n3C:FA:D3:30:00:00/28\tHarman Connected Services, Inc.\n3C:FA:D3:40:00:00/28\tGRG Banking Technology Co.,Ltd\n3C:FA:D3:50:00:00/28\tGulf Security Technology Co., Ltd\n3C:FA:D3:60:00:00/28\tNox Medical\n3C:FA:D3:70:00:00/28\tLIPS Corporation\n3C:FA:D3:80:00:00/28\tEnergous Corporation\n3C:FA:D3:90:00:00/28\tShenzhen Vplus Communication Intelligent Co., Ltd.\n3C:FA:D3:A0:00:00/28\tUltiMachine\n3C:FA:D3:B0:00:00/28\tCorelink Technology Co.,Ltd\n3C:FA:D3:C0:00:00/28\tShenzhen zhong ju  Fiber optical Co.Ltd\n3C:FA:D3:D0:00:00/28\tAMobile Solutions (Xiamen) CO. , LTD.\n3C:FA:D3:E0:00:00/28\tMirico\n3C:FB:5C\t\tFiberhome Telecommunication Technologies Co.,LTD\n3C:FB:96\t\tEmcraft Systems LLC\n3C:FD:FE\t\tIntel Corporate\n3C:FE:AC\t\tCisco Systems, Inc\n3C:FF:D8\t\tHuawei Technologies Co.,Ltd\n40:00:E0\t\tDerek(Shaoguan)Limited\n40:01:07\t\tArista Corp\n40:01:7A\t\tCisco Systems, Inc\n40:01:C6\t\t3Com Europe Ltd\n40:03:26\t\tNXP Semiconductor (Tianjin) LTD.\n40:04:0C\t\tA&T\n40:05:89\t\tT-Mobile, USA\n40:06:34\t\tHuawei Device Co., Ltd.\n40:06:A0\t\tTexas Instruments\n40:06:D5\t\tCisco Systems, Inc\n40:07:C0\t\tRailtec Systems GmbH\n40:0D:10\t\tCommscope\n40:0E:67\t\tTremol Ltd.\n40:0E:85\t\tSamsung Electro-Mechanics(Thailand)\n40:0E:F3\t\tzte corporation\n40:0F:C1\t\tVantiva USA LLC\n40:10:ED\t\tG.Tech Technology Ltd.\n40:11:75\t\tIEEE Registration Authority\n40:11:75:00:00:00/28\tLexi Devices, Inc.\n40:11:75:10:00:00/28\tFujian Kuke3D Technology Co.,LTD\n40:11:75:20:00:00/28\tKanda Kogyo\n40:11:75:30:00:00/28\tBeijing Hexinruitong Electric Power Technology Co., Ltd.\n40:11:75:40:00:00/28\tTable Trac Inc\n40:11:75:50:00:00/28\tMirc Electronics Ltd\n40:11:75:60:00:00/28\tShenZhen LanShuo Communication Equipment CO.,LTD.\n40:11:75:70:00:00/28\tGuangzhou RALID Information System Co.Ltd\n40:11:75:80:00:00/28\tBeijing Gemotech Intelligent Technology Co., Ltd.\n40:11:75:90:00:00/28\tADH Guardian USA\n40:11:75:A0:00:00/28\tBWT Tianjin Ltd.\n40:11:75:B0:00:00/28\tChongqing IQIYI Intelligence Technology Co., Ltd.\n40:11:75:C0:00:00/28\tdisguise Technologies Limited\n40:11:75:D0:00:00/28\tNanJing HuaStart Network Technology Co.,Ltd.\n40:11:75:E0:00:00/28\tNibble\n40:11:C3\t\tSamsung Electronics Co.,Ltd\n40:11:DC\t\tSonance\n40:12:E4\t\tCompass-EOS\n40:13:D9\t\tGlobal ES\n40:14:82\t\tCisco Systems, Inc\n40:14:AD\t\tHuawei Device Co., Ltd.\n40:15:97\t\tProtect America, Inc.\n40:16:3B\t\tSamsung Electronics Co.,Ltd\n40:16:7E\t\tASUSTek COMPUTER INC.\n40:16:9F\t\tTp-Link Technologies Co.,Ltd.\n40:16:FA\t\tEKM Metering\n40:17:E2\t\tIntai Technology Corp.\n40:17:F6\t\tTkh Security,S.L.U.\n40:18:B1\t\tExtreme Networks Headquarters\n40:18:D7\t\tSmartronix, Inc.\n40:19:20\t\tMovon Corporation\n40:1A:58\t\tWistron Neweb Corporation\n40:1B:5F\t\tWeifang Goertek Electronics Co.,Ltd\n40:1C:83\t\tIntel Corporate\n40:1C:D4\t\tHuawei Device Co., Ltd.\n40:1D:59\t\tBiometric Associates, LP\n40:22:30\t\tShenzhen SuperElectron Technology Co.,Ltd.\n40:22:D8\t\tEspressif Inc.\n40:22:ED\t\tDigital Projection Ltd\n40:23:43\t\tChongqing Fugui Electronics Co.,Ltd.\n40:24:B2\t\tSichuan AI-Link Technology Co., Ltd.\n40:24:D2\t\tHuawei Device Co., Ltd.\n40:25:08\t\tHighway 9 Networks, Inc.\n40:25:C2\t\tIntel Corporate\n40:26:19\t\tApple, Inc.\n40:26:8E\t\tShenzhen Photon Leap Technology Co., Ltd.\n40:27:0B\t\tMobileeco Co., Ltd\n40:27:A8\t\tCisco Meraki\n40:28:14\t\tRFI Engineering\n40:2A:8F\t\tShanghai High-Flying Electronics  Technology Co., Ltd\n40:2B:50\t\tCommscope\n40:2B:69\t\tKumho Electric Inc.\n40:2B:A1\t\tSony Corporation\n40:2C:76\t\tIEEE Registration Authority\n40:2C:76:00:00:00/28\tLista AG\n40:2C:76:10:00:00/28\tShanghai Dahua Scale Factory\n40:2C:76:20:00:00/28\tAnnapurna labs\n40:2C:76:30:00:00/28\tEmbeddedArt AB\n40:2C:76:40:00:00/28\tBeijing Smarot Technology Co., Ltd.\n40:2C:76:50:00:00/28\tBaumer Bourdon-Haenni\n40:2C:76:60:00:00/28\tGuangzhou LANGO Electronics Technology Co., Ltd.\n40:2C:76:70:00:00/28\tZhejiang Guoli Security Technology Co., Ltd.\n40:2C:76:80:00:00/28\tSuteng Innovation Technology Co., Ltd.\n40:2C:76:90:00:00/28\tAnnapurna labs\n40:2C:76:A0:00:00/28\tNowTechnologies Zrt\n40:2C:76:B0:00:00/28\tBeijing Kuaiyu Electronic Co., Ltd.\n40:2C:76:C0:00:00/28\tgridX GmbH\n40:2C:76:D0:00:00/28\tGuangzhou Qi'an Technology Co., Ltd.\n40:2C:76:E0:00:00/28\tLS Energy Solutions\n40:2C:F4\t\tUniversal Global Scientific Industrial Co., Ltd.\n40:2E:28\t\tMiXTelematics\n40:2E:71\t\tTexas Instruments\n40:2F:51\t\tMaxtek Optoelectronics Ltd\n40:2F:86\t\tLG Innotek\n40:30:04\t\tApple, Inc.\n40:30:59\t\tSilicon Laboratories\n40:30:67\t\tConlog (Pty) Ltd\n40:31:1B\t\tGenbyte Technology Inc.\n40:31:3C\t\tXIAOMI Electronics,CO.,LTD\n40:32:9D\t\tUnion Image Co.,Ltd\n40:33:06\t\tTaicang T&W Electronics\n40:33:1A\t\tApple, Inc.\n40:33:6C\t\tGodrej & Boyce Mfg. co. ltd\n40:35:E6\t\tSamsung Electronics Co.,Ltd\n40:36:68\t\tE&B Telecom\n40:36:B7\t\tJuniper Networks\n40:37:AD\t\tMacro Image Technology, Inc.\n40:3B:7B\t\tHuawei Device Co., Ltd.\n40:3C:FC\t\tApple, Inc.\n40:3D:EC\t\tHUMAX Co., Ltd.\n40:3F:43\t\tExtreme Networks Headquarters\n40:3F:8C\t\tTp-Link Technologies Co.,Ltd.\n40:40:22\t\tZiv\n40:40:28\t\tZiv\n40:40:6B\t\tIcomera\n40:40:6C\t\tIcomera\n40:40:A7\t\tSony Corporation\n40:41:01\t\tRockwell Automation\n40:41:0D\t\tHuawei Technologies Co.,Ltd\n40:42:29\t\tLayer3TV, Inc\n40:42:44\t\tCisco Systems, Inc\n40:44:CE\t\tHuawei Technologies Co.,Ltd\n40:44:FD\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n40:45:A0\t\tvivo Mobile Communication Co., Ltd.\n40:45:C4\t\tHuawei Technologies Co.,Ltd\n40:45:DA\t\tSpreadtrum Communications (Shanghai) Co., Ltd.\n40:47:5E\t\teero inc.\n40:47:6A\t\tAstro Gaming\n40:48:6E\t\tNokia Solutions and Networks GmbH & Co. KG\n40:48:FD\t\tIEEE Registration Authority\n40:48:FD:00:00:00/28\tBeijing C&W Electronics(Group)Co.,Ltd\n40:48:FD:10:00:00/28\tFast Programming\n40:48:FD:20:00:00/28\tMITHRAS Technology Co., LTD\n40:48:FD:30:00:00/28\tRL Controls LLC.\n40:48:FD:40:00:00/28\tDynamic Engineering\n40:48:FD:50:00:00/28\tThe 52nd Research Institute of China Electronic Technology Group Corporation\n40:48:FD:60:00:00/28\tSwarco Technology ApS\n40:48:FD:70:00:00/28\tCloud4Wi\n40:48:FD:80:00:00/28\tDorel Juvenile\n40:48:FD:90:00:00/28\tPlus One Global Ltd.\n40:48:FD:A0:00:00/28\tShenzhen Yifang Digital Technology Co., LTD.\n40:48:FD:B0:00:00/28\tMagenta Labs, Inc.\n40:48:FD:C0:00:00/28\tEcotap B.V.\n40:48:FD:D0:00:00/28\tNOX Systems AG\n40:48:FD:E0:00:00/28\tSmart Sensor Devices Ab\n40:49:0F\t\tHon Hai Precision Ind. Co.,Ltd.\n40:49:7C\t\teero inc.\n40:49:8A\t\tSynapticon GmbH\n40:4A:03\t\tZyxel Communications Corporation\n40:4A:18\t\tAddrek Smart Solutions\n40:4A:D4\t\tWidex A/S\n40:4C:77\t\tCommscope\n40:4C:CA\t\tEspressif Inc.\n40:4D:7F\t\tApple, Inc.\n40:4D:8E\t\tHuawei Technologies Co.,Ltd\n40:4E:36\t\tHTC Corporation\n40:4E:EB\t\tHigher Way Electronic Co., Ltd.\n40:4F:42\t\tHuawei Technologies Co.,Ltd\n40:50:B5\t\tShenzhen New Species Technology Co., Ltd.\n40:50:E0\t\tMilton Security Group LLC\n40:51:6C\t\tGrandex International Corporation\n40:52:0D\t\tPico Technology\n40:54:E4\t\tWearsafe Labs Inc\n40:55:39\t\tCisco Systems, Inc\n40:55:48\t\tQuectel Wireless Solutions Co.,Ltd.\n40:55:82\t\tNokia\n40:56:0C\t\tIn Home Displays Ltd\n40:56:2D\t\tSmartron India Pvt ltd\n40:56:62\t\tGuoTengShengHua Electronics LTD.\n40:58:46\t\tvivo Mobile Communication Co., Ltd.\n40:58:99\t\tLogitech Far East\n40:5A:9B\t\tAnovo\n40:5B:7F\t\tBroadcom Limited\n40:5B:D8\t\tChongqing Fugui Electronics Co.,Ltd.\n40:5C:FD\t\tDell Inc.\n40:5D:82\t\tNetgear\n40:5E:CF\t\tEsconet Technologies Limited\n40:5E:E1\t\tShenzhen H&T Intelligent Control Co.,Ltd.\n40:5E:F6\t\tSamsung Electronics Co.,Ltd\n40:5F:7D\t\tTCT mobile ltd\n40:5F:BE\t\tRim\n40:5F:C2\t\tTexas Instruments\n40:60:5A\t\tHawkeye Tech Co. Ltd\n40:61:86\t\tMicro-Star Int'L Co.,Ltd\n40:61:8E\t\tStella-Green Co\n40:62:31\t\tGifa\n40:62:34\t\tTelink Semiconductor (Shanghai) Co., Ltd.\n40:62:B6\t\tTele system communication\n40:62:EA\t\tChina Mobile Group Device Co.,Ltd.\n40:62:EE\t\tChicony Electronics Co., Ltd.\n40:64:A4\t\tThe Furukawa Electric Co., Ltd\n40:64:DC\t\tX-speed lnformation Technology Co.,Ltd\n40:65:A3\t\tSagemcom Broadband SAS\n40:66:7A\t\tmediola - connected living AG\n40:67:9B\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n40:68:26\t\tThales UK Limited\n40:69:18\t\tEM Microelectronic\n40:6A:8E\t\tHangzhou Puwell OE Tech Ltd.\n40:6A:AB\t\tRim\n40:6C:8F\t\tApple, Inc.\n40:6F:27\t\tHuawei Technologies Co.,Ltd\n40:6F:2A\t\tBlackBerry RTS\n40:70:09\t\tCommscope\n40:70:4A\t\tPower Idea Technology Limited\n40:70:74\t\tLife Technology (China) Co., Ltd\n40:70:A5\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n40:70:F5\t\tApple, Inc.\n40:71:83\t\tJuniper Networks\n40:72:18\t\tTonly Technology Co. Ltd\n40:73:4D\t\tNew H3C Technologies Co., Ltd\n40:74:96\t\taFUN TECHNOLOGY INC.\n40:74:E0\t\tIntel Corporate\n40:75:C3\t\tVantiva USA LLC\n40:76:A9\t\tHuawei Device Co., Ltd.\n40:77:A9\t\tNew H3C Technologies Co., Ltd\n40:78:6A\t\tMotorola Mobility LLC, a Lenovo Company\n40:78:75\t\tIMBEL - Industria de Material Belico do Brasil\n40:79:11\t\tApple, Inc.\n40:79:12\t\tTexas Instruments\n40:7A:80\t\tNokia Corporation\n40:7A:A4\t\tZhejiang Dahua Technologyco.,Ltd\n40:7B:1B\t\tMettle Networks Inc.\n40:7C:7D\t\tNokia\n40:7D:0F\t\tHuawei Technologies Co.,Ltd\n40:7F:5F\t\tJuniper Networks\n40:7F:E0\t\tGlory Star Technics (ShenZhen) Limited\n40:80:E1\t\tFN-LINK TECHNOLOGY Ltd.\n40:82:56\t\tContinental Automotive GmbH\n40:82:7B\t\tSTMicroelectronics Rousset SAS\n40:83:1D\t\tApple, Inc.\n40:83:DE\t\tZebra Technologies Inc\n40:84:32\t\tMicrochip Technology Inc.\n40:84:93\t\tClavister AB\n40:85:56\t\tContinental Automotive Romania SLR\n40:86:2E\t\tJdm Mobile Internet Solution Co., Ltd.\n40:86:CB\t\tD-Link Corporation\n40:87:E5\t\tWu Qi Technologies,Inc.\n40:88:05\t\tMotorola Mobility LLC, a Lenovo Company\n40:88:2F\t\tExtreme Networks Headquarters\n40:88:E0\t\tBeijing Ereneben Information Technology Limited Shenzhen Branch\n40:89:A8\t\tWiredIQ, LLC\n40:89:C6\t\tAmazon Technologies Inc.\n40:8A:9A\t\tTITENG CO., Ltd.\n40:8B:07\t\tActiontec Electronics, Inc\n40:8B:F6\t\tShenzhen TCL New Technology Co., Ltd\n40:8C:1F\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n40:8C:4C\t\tShenzhen MiaoMing  Intelligent Technology Co.,Ltd\n40:8D:5C\t\tGiga-Byte Technology Co.,Ltd.\n40:8E:2C\t\tMicrosoft Corporation\n40:8E:DF\t\tHuawei Device Co., Ltd.\n40:8E:F6\t\tInfinix mobility limited\n40:8F:9A\t\tKanEL Sweden AB\n40:8F:9D\t\tJuniper Networks\n40:91:51\t\tEspressif Inc.\n40:92:1A\t\tApple, Inc.\n40:92:49\t\tShanghai Baud Data Communication Co.,Ltd.\n40:95:05\t\tAcoinfo Technology Co.,Ltd\n40:95:58\t\tAisino Corporation\n40:95:95\t\tTP-Link Systems Inc.\n40:95:BD\t\tNTmore.Co.,Ltd\n40:97:D1\t\tBK Electronics cc\n40:98:4C\t\tCasacom Solutions AG\n40:98:4E\t\tTexas Instruments\n40:98:7B\t\tAisino Corporation\n40:98:AD\t\tApple, Inc.\n40:99:22\t\tAzureWave Technology Inc.\n40:99:E3\t\tGuangzhou Mudi Information Technology Co., Ltd\n40:99:F6\t\tTelink Semiconductor(Shanghai) Co.,Ltd\n40:9A:30\t\tTecno Mobile Limited\n40:9B:0D\t\tShenzhen Yourf Kwan Industrial Co., Ltd\n40:9B:21\t\tNokia\n40:9B:CD\t\tD-Link International\n40:9C:28\t\tApple, Inc.\n40:9C:A6\t\tCurvalux\n40:9C:A7\t\tChina Dragon Technology Limited\n40:9E:A4\t\tJuniper Networks\n40:9F:38\t\tAzureWave Technology Inc.\n40:9F:87\t\tJide Technology (Hong Kong) Limited\n40:9F:C7\t\tBAEKCHUN I&C Co., Ltd.\n40:A1:08\t\tMotorola (Wuhan) Mobility Technologies Communication Co., Ltd.\n40:A2:DB\t\tAmazon Technologies Inc.\n40:A3:6B:00:00:00/28\tFin Robotics Inc\n40:A3:6B:10:00:00/28\tTW-TeamWare\n40:A3:6B:20:00:00/28\tTOPROOTTechnology Corp. Ltd.\n40:A3:6B:30:00:00/28\tOmnitracs, LLC\n40:A3:6B:40:00:00/28\tSKS-Kinkel Elektronik GmbH\n40:A3:6B:50:00:00/28\tNational Research Council of Canada\n40:A3:6B:60:00:00/28\tSecuriton AG\n40:A3:6B:70:00:00/28\tPella Corporation\n40:A3:6B:80:00:00/28\tSFT Co., Ltd.\n40:A3:6B:90:00:00/28\tPH Technical Labs\n40:A3:6B:A0:00:00/28\tEmbrionix Design Inc.\n40:A3:6B:B0:00:00/28\tAmobile Intelligent Corp.\n40:A3:6B:C0:00:00/28\tOnion Corporation\n40:A3:6B:D0:00:00/28\tFAOD Co.,Ltd.\n40:A3:CC\t\tIntel Corporate\n40:A5:3B\t\tNokia\n40:A5:EF\t\tShenzhen Four Seas Global Link Network Technology Co., Ltd.\n40:A6:3D\t\tSignalFire Telemetry\n40:A6:77\t\tJuniper Networks\n40:A6:A4\t\tPassivSystems Ltd\n40:A6:B7\t\tIntel Corporate\n40:A6:D9\t\tApple, Inc.\n40:A6:E8\t\tCisco Systems, Inc\n40:A7:86\t\tTecno Mobile Limited\n40:A8:F0\t\tHewlett Packard\n40:A9:3F\t\tPivotal Commware, Inc.\n40:A9:CF\t\tAmazon Technologies Inc.\n40:AA:56\t\tChina Dragon Technology Limited\n40:AC:8D\t\tData Management, Inc.\n40:AC:BF\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n40:AE:30\t\tTP-Link Systems Inc\n40:B0:2F\t\tMiele & Cie. KG\n40:B0:34\t\tHewlett Packard\n40:B0:76\t\tASUSTek COMPUTER INC.\n40:B0:A1\t\tValcom Co.,Ltd.\n40:B0:FA\t\tLG Electronics (Mobile Communications)\n40:B1:5C\t\tHuawei Technologies Co.,Ltd\n40:B2:15\t\tExtreme Networks Headquarters\n40:B2:C8\t\tNortel Networks\n40:B3:0E\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n40:B3:1E\t\tUniversal Electronics, Inc.\n40:B3:95\t\tApple, Inc.\n40:B3:CD\t\tChiyoda Electronics Co.,Ltd.\n40:B3:FA\t\tApple, Inc.\n40:B3:FC\t\tLogital Co. Limited\n40:B4:CD\t\tAmazon Technologies Inc.\n40:B4:F0\t\tJuniper Networks\n40:B5:C1\t\tCisco Systems, Inc\n40:B6:07\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n40:B6:88\t\tLEGIC Identsystems AG\n40:B6:B1\t\tSUNGSAM CO,.Ltd\n40:B6:E7\t\tHuawei Device Co., Ltd.\n40:B7:0E\t\tHuawei Device Co., Ltd.\n40:B7:F3\t\tCommscope\n40:B7:FC\t\tPhyplus Microelectronics Limited\n40:B8:2D\t\tRuckus Wireless\n40:B8:37\t\tSony Corporation\n40:B8:9A\t\tHon Hai Precision Ind. Co.,Ltd.\n40:B8:C2\t\tOsmozis\n40:B9:3C\t\tHewlett Packard Enterprise\n40:BA:61\t\tARIMA Communications Corp.\n40:BB:56\t\tTeraNXT Global India Pvt Ltd.\n40:BC:60\t\tApple, Inc.\n40:BC:68\t\tFunshion Online Technologies Co.,Ltd\n40:BC:73\t\tCronoplast  S.L.\n40:BC:8B\t\titelio GmbH\n40:BD:32\t\tTexas Instruments\n40:BD:9E\t\tPhysio-Control, Inc\n40:BE:EE\t\tShenzhen Yunding Information Technology Co.,Ltd\n40:BF:17\t\tDigistar Telecom. SA\n40:C0:2F\t\tActiontec Electronics Inc.\n40:C0:EE\t\t365mesh Pty Ltd\n40:C1:F6\t\tShenzhen Jingxun Technology Co., Ltd.\n40:C2:45\t\tShenzhen Hexicom Technology Co., Ltd.\n40:C2:BA\t\tCompal Information (Kunshan) Co., Ltd.\n40:C3:BC\t\tHuawei Device Co., Ltd.\n40:C3:C6\t\tSnapRoute\n40:C4:8C\t\tN-iTUS CO.,LTD.\n40:C4:D6\t\tChongQing Camyu Technology Development Co.,Ltd.\n40:C6:2A\t\tShanghai Jing Ren Electronic Technology Co., Ltd.\n40:C7:11\t\tApple, Inc.\n40:C7:29\t\tSagemcom Broadband SAS\n40:C7:3C\t\tIntel Corporate\n40:C7:C9\t\tNaviit Inc.\n40:C8:1F\t\tShenzhen Xinguodu Technology Co., Ltd.\n40:C8:CB\t\tAM Telecom co., Ltd.\n40:CA:63\t\tSeongji Industry Company\n40:CB:A8\t\tHuawei Technologies Co.,Ltd\n40:CB:C0\t\tApple, Inc.\n40:CD:3A\t\tZ3 Technology\n40:CD:7A\t\tQingdao Hisense Communications Co.,Ltd.\n40:CE:24\t\tCisco Systems, Inc\n40:D1:33\t\tIntel Corporate\n40:D1:60\t\tApple, Inc.\n40:D2:5F\t\tItel Mobile Limited\n40:D2:8A\t\tNintendo Co., Ltd.\n40:D3:2D\t\tApple, Inc.\n40:D3:57\t\tIson Technology Co., Ltd.\n40:D3:AE\t\tSamsung Electronics Co.,Ltd\n40:D4:0E\t\tBiodata Ltd\n40:D4:BD\t\tSK Networks Service CO., LTD.\n40:D4:F6\t\tHonor Device Co., Ltd.\n40:D5:21\t\tLG Innotek\n40:D5:59\t\tMicro S.E.R.I.\n40:D5:63\t\tHANA Electronics\n40:D6:3C\t\tEquitech Industrial(DongGuan)Co.,Ltd\n40:D8:55\t\tIEEE Registration Authority\n40:D8:55:00:00:00/36\tXronos.Inc\n40:D8:55:00:10:00/36\tVemotion\n40:D8:55:00:20:00/36\tHangzhou Chenxiao Technologies Co. Ltd.\n40:D8:55:00:30:00/36\tAlphaNavigation coltd\n40:D8:55:00:40:00/36\tCR Magnetics, Inc.\n40:D8:55:00:50:00/36\tMonarch Instrument\n40:D8:55:00:60:00/36\tBactest Limited\n40:D8:55:00:70:00/36\tDigital Audio SA\n40:D8:55:00:80:00/36\tKaori Industria Eletronica Ltda\n40:D8:55:00:90:00/36\tClearSite Communications Inc.\n40:D8:55:00:A0:00/36\tSarana Sistem Mikro\n40:D8:55:00:B0:00/36\tGogo BA\n40:D8:55:00:C0:00/36\tAplex Technology Inc.\n40:D8:55:00:D0:00/36\tHuNS\n40:D8:55:00:E0:00/36\tBrightwell Dispensers\n40:D8:55:00:F0:00/36\tDigital Dynamics, Inc.\n40:D8:55:01:00:00/36\tAPG Cash Drawer, LLC\n40:D8:55:01:10:00/36\tFlexim Security Oy\n40:D8:55:01:20:00/36\tSencon Inc.\n40:D8:55:01:30:00/36\tGrande Vitesse Systems\n40:D8:55:01:40:00/36\tToni Studio\n40:D8:55:01:50:00/36\tBITMILL srl\n40:D8:55:01:60:00/36\tPar-Tech, Inc.\n40:D8:55:01:70:00/36\tFranke Aquarotter GmbH\n40:D8:55:01:80:00/36\tStaneo Sas\n40:D8:55:01:90:00/36\tNautel LTD\n40:D8:55:01:A0:00/36\tMeggitt Defense Systems Inc.\n40:D8:55:01:B0:00/36\tAudio Enhancement\n40:D8:55:01:C0:00/36\tBERG Cloud Limited\n40:D8:55:01:D0:00/36\tScharco Elektronik GmbH\n40:D8:55:01:E0:00/36\tA2S\n40:D8:55:01:F0:00/36\tSitep Italia Spa\n40:D8:55:02:00:00/36\tENTEC Electric & Electronic CO., LTD.\n40:D8:55:02:10:00/36\tSmt D.O.O.\n40:D8:55:02:20:00/36\tDigimerge Technology Inc\n40:D8:55:02:30:00/36\tShanghai o-solution electronics & Technology Co., Ltd.\n40:D8:55:02:40:00/36\tElectrical Geodesics Incorporated\n40:D8:55:02:50:00/36\tRosemount Analytical\n40:D8:55:02:60:00/36\tSymetrics Industries\n40:D8:55:02:70:00/36\tGrupo Epelsa S.L.\n40:D8:55:02:80:00/36\tIntegrated Control Corp.\n40:D8:55:02:90:00/36\tDepro Electronique\n40:D8:55:02:A0:00/36\tTinkerforge GmbH\n40:D8:55:02:B0:00/36\tNomatronics\n40:D8:55:02:C0:00/36\tInventLab s.c.\n40:D8:55:02:D0:00/36\tElgama Sistemos\n40:D8:55:02:E0:00/36\tCircuitec Ind. Equip. Eletr. Ltda\n40:D8:55:02:F0:00/36\tAdvatek Lighting Pty Ltd\n40:D8:55:03:00:00/36\tTecnologias Plexus\n40:D8:55:03:10:00/36\tDommel GmbH\n40:D8:55:03:20:00/36\tBettini Srl\n40:D8:55:03:30:00/36\tErmes Elettronica s.r.l.\n40:D8:55:03:40:00/36\tDacom West GmbH\n40:D8:55:03:50:00/36\tMesotech International, Inc.\n40:D8:55:03:60:00/36\tSchweers informationstechnologie GmbH\n40:D8:55:03:70:00/36\tSoftware Workshop\n40:D8:55:03:80:00/36\tSpecial Measurements Labs LLC\n40:D8:55:03:90:00/36\tCI Systems Ltd\n40:D8:55:03:A0:00/36\tSocus networks\n40:D8:55:03:B0:00/36\tTelcomkorea\n40:D8:55:03:C0:00/36\tComputer System Co.,Ltd\n40:D8:55:03:D0:00/36\tTekelek Europe Ltd\n40:D8:55:03:E0:00/36\tVishay Celtron Technologies, Inc.\n40:D8:55:03:F0:00/36\tUniSVR Global Information Technology Corp.\n40:D8:55:04:00:00/36\tGHL Systems Berhad\n40:D8:55:04:10:00/36\tT.Q.M. Itaca Technology s.r.l.\n40:D8:55:04:20:00/36\tMango Communicaitons Inc.\n40:D8:55:04:30:00/36\tSchulerControl GmbH\n40:D8:55:04:40:00/36\tAn Chen Computer Co., Ltd.\n40:D8:55:04:50:00/36\tGenadsystem\n40:D8:55:04:60:00/36\tCircuitlink Pty Ltd\n40:D8:55:04:70:00/36\tDos&Donts SRL\n40:D8:55:04:80:00/36\tGD Mission Systems\n40:D8:55:04:90:00/36\tThermo Fisher Scientific\n40:D8:55:04:A0:00/36\tGateway Technologies SA de CV\n40:D8:55:04:B0:00/36\tVital Tech Industria e Comercio Ltda\n40:D8:55:04:C0:00/36\tServeron Corporation\n40:D8:55:04:D0:00/36\tMACHINEPERFORMANCE ApS\n40:D8:55:04:E0:00/36\tHoneywell International\n40:D8:55:04:F0:00/36\tHaein S&S Co., Ltd\n40:D8:55:05:00:00/36\tATG UV Technology\n40:D8:55:05:10:00/36\tCS Instruments Asia\n40:D8:55:05:20:00/36\tDan Electronics System (P) Limited\n40:D8:55:05:30:00/36\tAmantys Ltd\n40:D8:55:05:40:00/36\tVitec\n40:D8:55:05:50:00/36\tHelmholtz Zentrum Dresden Rossendorf e.V.\n40:D8:55:05:60:00/36\tGroup 57\n40:D8:55:05:70:00/36\tTammermatic Group Oy\n40:D8:55:05:80:00/36\tEnergy Team S.p.A.\n40:D8:55:05:90:00/36\tCOLONIAL ASSEMBLY and  DESIGN\n40:D8:55:05:A0:00/36\tUltra Electronics Flightline Systems\n40:D8:55:05:B0:00/36\tData Flow Systems, Inc.\n40:D8:55:05:C0:00/36\tRosslare Enterprises Limited\n40:D8:55:05:D0:00/36\tLeica Biosystems\n40:D8:55:05:E0:00/36\tinoage GmbH\n40:D8:55:05:F0:00/36\tEPSa GmbH\n40:D8:55:06:00:00/36\tAplex Technology Inc.\n40:D8:55:06:10:00/36\tCominfo, Inc.\n40:D8:55:06:20:00/36\tTech Source Inc\n40:D8:55:06:30:00/36\tProtonic Holland\n40:D8:55:06:40:00/36\tHipodromo De Agua Caliente, S.A. De C.V.\n40:D8:55:06:50:00/36\tParallel Wireless, Inc\n40:D8:55:06:60:00/36\tTeraTron GmbH\n40:D8:55:06:70:00/36\tTronic Control ltd.\n40:D8:55:06:80:00/36\tOki Seatec Co., Ltd.\n40:D8:55:06:90:00/36\tSmartcom-Bulgaria AD\n40:D8:55:06:A0:00/36\telgris UG\n40:D8:55:06:B0:00/36\tBRS Sistemas Eletrônicos\n40:D8:55:06:C0:00/36\tRohde&Schwarz Topex SA\n40:D8:55:06:D0:00/36\tBroadSoft, INC\n40:D8:55:06:E0:00/36\tC-COM Satellite Systems Inc.\n40:D8:55:06:F0:00/36\tDorlet Sau\n40:D8:55:07:00:00/36\tJSC Electrical Equipment Factory\n40:D8:55:07:10:00/36\tTattile Srl\n40:D8:55:07:20:00/36\tCT Company\n40:D8:55:07:30:00/36\tDiamond Technologies, Inc\n40:D8:55:07:40:00/36\tSphere Medical Ltd\n40:D8:55:07:50:00/36\tTeraflops\n40:D8:55:07:60:00/36\tInternet Protocolo Logica Sl\n40:D8:55:07:70:00/36\tToec Technology Co.,Ltd\n40:D8:55:07:80:00/36\tNachi-Fujikoshi Corp\n40:D8:55:07:90:00/36\tDelfiSolutions A/S\n40:D8:55:07:A0:00/36\t4embedded\n40:D8:55:07:B0:00/36\tIPS Technology Limited\n40:D8:55:07:C0:00/36\tAgramkow Fluid Systems A/S\n40:D8:55:07:D0:00/36\tWuxi SiNeng New Energy Co., Ltd.\n40:D8:55:07:E0:00/36\tTescom Corporation\n40:D8:55:07:F0:00/36\tWheatstone Corporation\n40:D8:55:08:00:00/36\tHoneywell\n40:D8:55:08:10:00/36\tSicon srl\n40:D8:55:08:20:00/36\tard sa\n40:D8:55:08:30:00/36\tDelopt\n40:D8:55:08:40:00/36\tPapendorf Software Engineering GmbH\n40:D8:55:08:50:00/36\tPeek Traffic Corporation\n40:D8:55:08:60:00/36\tDsp Design\n40:D8:55:08:70:00/36\tBestel China\n40:D8:55:08:80:00/36\tJel System Co., Ltd.\n40:D8:55:08:90:00/36\tWuhan Xingtuxinke ELectronic Co.,Ltd\n40:D8:55:08:A0:00/36\tLeder Elektronik Design\n40:D8:55:08:B0:00/36\tMeshWorks Wireless Oy\n40:D8:55:08:C0:00/36\tMagnescale Co.,Ltd\n40:D8:55:08:D0:00/36\tBoehme Nachrichtentechnik\n40:D8:55:08:E0:00/36\tLyngsoe Systems\n40:D8:55:08:F0:00/36\tExcelitas\n40:D8:55:09:00:00/36\tAxxess Identification Ltd\n40:D8:55:09:10:00/36\tKdt\n40:D8:55:09:20:00/36\tWasserbauer GmbH\n40:D8:55:09:30:00/36\tSentry 360 Security\n40:D8:55:09:40:00/36\tNomad Digital Limited\n40:D8:55:09:50:00/36\tHeart Force Medical\n40:D8:55:09:60:00/36\tComtel Electronics GmbH\n40:D8:55:09:70:00/36\tBurton Technical Services LLC\n40:D8:55:09:80:00/36\tDave Srl\n40:D8:55:09:90:00/36\tidcell co.ltd\n40:D8:55:09:A0:00/36\tCoherentPlus Sdn Bhd\n40:D8:55:09:B0:00/36\tTokyo Denki Gijutsu Kogyo\n40:D8:55:09:C0:00/36\tKeyware Solutions Inc.\n40:D8:55:09:D0:00/36\tEMAC, Inc.\n40:D8:55:09:E0:00/36\tNanoPulse, Inc.\n40:D8:55:09:F0:00/36\tBascules Robbe nv\n40:D8:55:0A:00:00/36\tQuantronix, Inc.\n40:D8:55:0A:10:00/36\tADVALY SYSTEM Inc.\n40:D8:55:0A:20:00/36\tXemex NV\n40:D8:55:0A:30:00/36\tTelefrank GmbH\n40:D8:55:0A:40:00/36\tResch Electronic Innovation GmbH\n40:D8:55:0A:50:00/36\tWooshCom Corporation\n40:D8:55:0A:60:00/36\tAlumbra Produtos Elétricos e Eletrônicos Ltda\n40:D8:55:0A:70:00/36\tFirst Design System Inc.\n40:D8:55:0A:80:00/36\tBaudisch Electronic GmbH\n40:D8:55:0A:90:00/36\tApantac LLC\n40:D8:55:0A:A0:00/36\tThermal Imaging Radar, LLC\n40:D8:55:0A:B0:00/36\tEnel doo Belgrade\n40:D8:55:0A:C0:00/36\tFraunhofer HHI\n40:D8:55:0A:D0:00/36\tSpace Micro\n40:D8:55:0A:E0:00/36\tGD Mission Systems\n40:D8:55:0A:F0:00/36\tEnVerv Inc.\n40:D8:55:0B:00:00/36\tMicrologic\n40:D8:55:0B:10:00/36\tNanjing TIANSU Automation Control System Co., Ltd.\n40:D8:55:0B:20:00/36\tEver Trend Technology Development Limited\n40:D8:55:0B:30:00/36\tT.W.S. srl\n40:D8:55:0B:40:00/36\tMitsubishi Electric System & Service Co.,Ltd.\n40:D8:55:0B:50:00/36\tData Sharing Consulting\n40:D8:55:0B:60:00/36\tTelvent\n40:D8:55:0B:70:00/36\tACD Elektronik GmbH\n40:D8:55:0B:80:00/36\tFerlin Trading BV\n40:D8:55:0B:90:00/36\tWxBR Sistemas de Telecomunicacoes Ltda\n40:D8:55:0B:A0:00/36\tPCH Engineering A/S\n40:D8:55:0B:B0:00/36\tWhiptail\n40:D8:55:0B:C0:00/36\tAplex Technology Inc.\n40:D8:55:0B:D0:00/36\tiCOGNIZE GmbH\n40:D8:55:0B:E0:00/36\tManufacturing System Insights Inc\n40:D8:55:0B:F0:00/36\tShenzhen SETEC Power Co.,Ltd\n40:D8:55:0C:00:00/36\tAct\n40:D8:55:0C:10:00/36\tXepto Computing Inc\n40:D8:55:0C:20:00/36\tSC Techswarm SRL\n40:D8:55:0C:30:00/36\tAPG Cash Drawer, LLC\n40:D8:55:0C:40:00/36\tInspired Systems\n40:D8:55:0C:50:00/36\tM.M. Elektrolab\n40:D8:55:0C:60:00/36\tcomtime GmbH\n40:D8:55:0C:70:00/36\tinsensiv GmbH\n40:D8:55:0C:80:00/36\tMettler Toledo\n40:D8:55:0C:90:00/36\tQuantaflow\n40:D8:55:0C:A0:00/36\tNeutrik Ag\n40:D8:55:0C:B0:00/36\tReliOn Inc\n40:D8:55:0C:C0:00/36\tAteme\n40:D8:55:0C:D0:00/36\tLogical Product\n40:D8:55:0C:E0:00/36\tEST Analytical\n40:D8:55:0C:F0:00/36\tClark-MXR, Inc.\n40:D8:55:0D:00:00/36\tIcraft Oy\n40:D8:55:0D:10:00/36\tCantada Inc\n40:D8:55:0D:20:00/36\tBucher Automation Budapest\n40:D8:55:0D:30:00/36\tLECO Corporation\n40:D8:55:0D:40:00/36\tMitsubishi Heavy Industries, Ltd.\n40:D8:55:0D:50:00/36\tShimizu Electric Co., Ltd.\n40:D8:55:0D:60:00/36\tdeskontrol electronics\n40:D8:55:0D:70:00/36\tAvant Technologies\n40:D8:55:0D:80:00/36\tNEXT! s.c. S.Piela B.Dryja\n40:D8:55:0D:90:00/36\tYuko Electric Co.,Ltd\n40:D8:55:0D:A0:00/36\tDevialet SA\n40:D8:55:0D:B0:00/36\tTop Connect OU\n40:D8:55:0D:C0:00/36\tNVS Technologies Inc\n40:D8:55:0D:D0:00/36\tEmbed Limited\n40:D8:55:0D:E0:00/36\tVpg\n40:D8:55:0D:F0:00/36\tXadi Inc\n40:D8:55:0E:00:00/36\tRichter\n40:D8:55:0E:10:00/36\tSTV Electronic GmbH\n40:D8:55:0E:20:00/36\tKeocko Holding Kft.\n40:D8:55:0E:30:00/36\tMedigus Ltd\n40:D8:55:0E:40:00/36\tArago Systems\n40:D8:55:0E:50:00/36\tTriton Electronics LTD\n40:D8:55:0E:60:00/36\tKyoritsu Electric Corp.\n40:D8:55:0E:70:00/36\tLightstar\n40:D8:55:0E:80:00/36\tHeitec Ag\n40:D8:55:0E:90:00/36\tHAMEG GmbH\n40:D8:55:0E:A0:00/36\tA-Z-E\n40:D8:55:0E:B0:00/36\tWANTECH Networks\n40:D8:55:0E:C0:00/36\tSentry 360 Security\n40:D8:55:0E:D0:00/36\tIntelliDesign Pty Ltd\n40:D8:55:0E:E0:00/36\tSiegmar Zander HuSWare\n40:D8:55:0E:F0:00/36\tGeneSys Elektronik GmbH\n40:D8:55:0F:00:00/36\tRedwood Systems\n40:D8:55:0F:10:00/36\tGrossenbacher Systeme AG\n40:D8:55:0F:20:00/36\tSigmaPhi Electronics\n40:D8:55:0F:30:00/36\tECON Systems Inc.\n40:D8:55:0F:40:00/36\tMB connect line GmbH Fernwartungssysteme\n40:D8:55:0F:50:00/36\tCST Group\n40:D8:55:0F:60:00/36\tPrivate\n40:D8:55:0F:70:00/36\tComline Elektronik Elektrotechnik GmbH\n40:D8:55:0F:80:00/36\tBetter Place\n40:D8:55:0F:90:00/36\tInvisua Lighting BV\n40:D8:55:0F:A0:00/36\tMarmitek BV\n40:D8:55:0F:B0:00/36\tInfoMac Sp. z o. o. Sp. k.\n40:D8:55:0F:C0:00/36\teumig industrie-TV GmbH.\n40:D8:55:0F:D0:00/36\tMONOGRAM technologies ltd\n40:D8:55:0F:E0:00/36\tCytech Technology Pte Ltd\n40:D8:55:0F:F0:00/36\tYUYAMA MFG Co.,Ltd\n40:D8:55:10:00:00/36\tTask Sistemas De Computacao S.A.\n40:D8:55:10:10:00/36\te.p.g. Elettronica Srl\n40:D8:55:10:20:00/36\tPower Electronics Espana, S.L.\n40:D8:55:10:30:00/36\tPeek Traffic Corporation\n40:D8:55:10:40:00/36\tImple Sistemas Eletronicos Embarcados Ltda\n40:D8:55:10:50:00/36\tTieline Research Pty Ltd\n40:D8:55:10:60:00/36\tOrbital A/S\n40:D8:55:10:70:00/36\tSmith Meter, Inc\n40:D8:55:10:80:00/36\tAlpha Design Co.,Ltd.\n40:D8:55:10:90:00/36\tRosslare Enterprises Limited\n40:D8:55:10:A0:00/36\tDavis Derby Limited\n40:D8:55:10:B0:00/36\tSo-Cool Corporation.\n40:D8:55:10:C0:00/36\tContrans TI sp. z o.o.\n40:D8:55:10:D0:00/36\tRite-Tech Industrial Co., Ltd.\n40:D8:55:10:E0:00/36\tHKS-Prozesstechnik GmbH\n40:D8:55:10:F0:00/36\tCavalry Storage Inc\n40:D8:55:11:00:00/36\tAplex Technology Inc.\n40:D8:55:11:10:00/36\tGrupo Epelsa S.L.\n40:D8:55:11:20:00/36\tHalliburton - Sperry Drilling Service\n40:D8:55:11:30:00/36\tTestbook Ltd\n40:D8:55:11:40:00/36\tGD Mission Systems\n40:D8:55:11:50:00/36\tMESA Electronic GmbH\n40:D8:55:11:60:00/36\tUniscan LLC\n40:D8:55:11:70:00/36\tRCS Energy Management Limited\n40:D8:55:11:80:00/36\tUniversity of Nebraska -- Lincoln\n40:D8:55:11:90:00/36\tOOO Group of Industrial Technologies\n40:D8:55:11:A0:00/36\tSicon srl\n40:D8:55:11:B0:00/36\tnanoTRONIC GmbH\n40:D8:55:11:C0:00/36\tDEUTA-WERKE GmbH\n40:D8:55:11:D0:00/36\tACD Elektronik GmbH\n40:D8:55:11:E0:00/36\tCEMSI, Inc.\n40:D8:55:11:F0:00/36\tKOMPAN Pawel Sokolowski\n40:D8:55:12:00:00/36\tObjectFab GmbH\n40:D8:55:12:10:00/36\tshanghai Anjian Information technology co. , ltd.\n40:D8:55:12:20:00/36\tATX Networks Ltd.\n40:D8:55:12:30:00/36\tZAO NPC  Kompjuternie Technologii\n40:D8:55:12:40:00/36\tDebug s.r.l.\n40:D8:55:12:50:00/36\tScandyna A/S\n40:D8:55:12:60:00/36\tTti Ltd\n40:D8:55:12:70:00/36\tLightstar\n40:D8:55:12:80:00/36\tAKSE srl\n40:D8:55:12:90:00/36\tDsp Design\n40:D8:55:12:A0:00/36\tJadpod Communication Company Limited\n40:D8:55:12:B0:00/36\tMango DSP, Inc.\n40:D8:55:12:C0:00/36\tNSP Europe Ltd\n40:D8:55:12:D0:00/36\tBiotage Sweden AB\n40:D8:55:12:E0:00/36\tCanfield Scientific, Inc.\n40:D8:55:12:F0:00/36\tPrivate\n40:D8:55:13:00:00/36\tTelevic Rail GmbH\n40:D8:55:13:10:00/36\tEMAC, Inc.\n40:D8:55:13:20:00/36\tAeroVision Avionics, Inc\n40:D8:55:13:30:00/36\tTattile Srl\n40:D8:55:13:40:00/36\tdigitech GmbH & Co. KG\n40:D8:55:13:50:00/36\tGlobalcom Engineering Srl\n40:D8:55:13:60:00/36\tDevriecom B.V.\n40:D8:55:13:70:00/36\tGDE Polska\n40:D8:55:13:80:00/36\tCalon Associates Limited\n40:D8:55:13:90:00/36\tWOW System\n40:D8:55:13:A0:00/36\tSupplier Ind. e Com de Eletroeletrônicos\n40:D8:55:13:B0:00/36\tDavin Technologies Co.,Ltd\n40:D8:55:13:C0:00/36\tshanghai Anjian Information technology co. , ltd.\n40:D8:55:13:D0:00/36\tPerm Scientific-Industrial Instrument Making Company JSC\n40:D8:55:13:E0:00/36\thanatech\n40:D8:55:13:F0:00/36\tZhejiang Wellsun Electric Meter Co.,Ltd\n40:D8:55:14:00:00/36\tInnoTrans Communications, Inc\n40:D8:55:14:10:00/36\tKey Systems, Inc.\n40:D8:55:14:20:00/36\tTetracore, Inc.\n40:D8:55:14:30:00/36\tTokyo Drawing Ltd.\n40:D8:55:14:40:00/36\tVenco\n40:D8:55:14:50:00/36\tWeber Marking Systems GmbH\n40:D8:55:14:60:00/36\tPleiger Elektronik GmbH  and Co. KG\n40:D8:55:14:70:00/36\tAplex Technology Inc.\n40:D8:55:14:80:00/36\tSeiko Time Systems Inc.\n40:D8:55:14:90:00/36\tEngage Technologies\n40:D8:55:14:A0:00/36\tGD Mission Systems\n40:D8:55:14:B0:00/36\tVocality International Ltd\n40:D8:55:14:C0:00/36\tPlt\n40:D8:55:14:D0:00/36\tSomfy Sas\n40:D8:55:14:E0:00/36\tMarposs S.p.A\n40:D8:55:14:F0:00/36\tTDS Software Solutions Pty Ltd\n40:D8:55:15:00:00/36\tShikino High-Tech\n40:D8:55:15:10:00/36\tProgress Rail Services, Inspection and Information Systems\n40:D8:55:15:20:00/36\tHome Automation Europe\n40:D8:55:15:30:00/36\tBlinkPipe Ltd\n40:D8:55:15:40:00/36\tiart\n40:D8:55:15:50:00/36\tTelefrang AB\n40:D8:55:15:60:00/36\tEmphysys, Inc.\n40:D8:55:15:70:00/36\tHitachi Power Solutions Co., Ltd.\n40:D8:55:15:80:00/36\tExibea AB\n40:D8:55:15:90:00/36\tPLATINUM GmbH\n40:D8:55:15:A0:00/36\tDorlet Sau\n40:D8:55:15:B0:00/36\tSQF Spezialelektronik GmbH\n40:D8:55:15:C0:00/36\tSpectratech Inc.\n40:D8:55:15:D0:00/36\tActronic Technologies\n40:D8:55:15:E0:00/36\tProdco International Inc.\n40:D8:55:15:F0:00/36\tCT Company\n40:D8:55:16:00:00/36\tThermo Fisher Sceintific\n40:D8:55:16:10:00/36\tSolidscape Inc\n40:D8:55:16:20:00/36\tLuna-Nexus\n40:D8:55:16:30:00/36\tKMtronic ltd\n40:D8:55:16:40:00/36\tNFT Automatisierungssysteme GmbH\n40:D8:55:16:50:00/36\tTechboard Srl\n40:D8:55:16:60:00/36\tAnhui Jiante Network Technology Co., Ltd.\n40:D8:55:16:70:00/36\tAssembly Contracts Ltd\n40:D8:55:16:80:00/36\tOPASCA Systems GmbH\n40:D8:55:16:90:00/36\tPhotop Koncent\n40:D8:55:16:A0:00/36\tAplex Technology Inc.\n40:D8:55:16:B0:00/36\tTechway\n40:D8:55:16:C0:00/36\tPrivate\n40:D8:55:16:D0:00/36\tGD Mission Systems\n40:D8:55:16:E0:00/36\tSecuinfo Co.Ltd\n40:D8:55:16:F0:00/36\tBrightLeaf Power\n40:D8:55:17:00:00/36\tICS Eletronics\n40:D8:55:17:10:00/36\tSicon srl\n40:D8:55:17:20:00/36\tYawata Electric Industrial Co.,Ltd.\n40:D8:55:17:30:00/36\tContec Steuerungstechnik & Automation GmbH\n40:D8:55:17:40:00/36\tEcoGuard AB\n40:D8:55:17:50:00/36\tAHB Systeme GmbH\n40:D8:55:17:60:00/36\tSchneider Electric Motion, Inc. USA\n40:D8:55:17:70:00/36\tTRI Engineering co.,ltd.\n40:D8:55:17:80:00/36\tREDER Domotic GmbH\n40:D8:55:17:90:00/36\tServo-Robot Inc.\n40:D8:55:17:A0:00/36\tArgus-Spectrum\n40:D8:55:17:B0:00/36\tLuceo\n40:D8:55:17:C0:00/36\tCritical Link LLC\n40:D8:55:17:D0:00/36\tKiwigrid GmbH\n40:D8:55:17:E0:00/36\tTokhatec\n40:D8:55:17:F0:00/36\tTelvent\n40:D8:55:18:00:00/36\tBroadSoft Inc\n40:D8:55:18:10:00/36\teROCCA\n40:D8:55:18:20:00/36\tGeorg Neumann GmbH\n40:D8:55:18:30:00/36\tEMAC, Inc.\n40:D8:55:18:40:00/36\tSatkirit Ltd\n40:D8:55:18:50:00/36\tStandard Change Makers\n40:D8:55:18:60:00/36\tKST technology\n40:D8:55:18:70:00/36\tCDEX Corp.\n40:D8:55:18:80:00/36\tArray Corporation\n40:D8:55:18:90:00/36\tYoozma Corporation\n40:D8:55:18:A0:00/36\tAplex Technology Inc.\n40:D8:55:18:B0:00/36\tDiagnosys Test Systems Ltd\n40:D8:55:18:C0:00/36\tEOS S.r.l.\n40:D8:55:18:D0:00/36\tZoe Medical\n40:D8:55:18:E0:00/36\tKerun Visual Technology Co., Ltd.(Shenzhen)\n40:D8:55:18:F0:00/36\tBeat Sensing co. , ltd.\n40:D8:55:19:00:00/36\tSpider Tecnologia Ind. e Com Ltda\n40:D8:55:19:10:00/36\tSoukai Electric\n40:D8:55:19:20:00/36\tGD Mission Systems\n40:D8:55:19:30:00/36\tForza Silicon Corp.\n40:D8:55:19:40:00/36\tRF Code\n40:D8:55:19:50:00/36\tTonna Electronique\n40:D8:55:19:60:00/36\tAdvanced Micro Controls Inc.\n40:D8:55:19:70:00/36\tBerg Cloud Limited\n40:D8:55:19:80:00/36\tdevboards GmbH\n40:D8:55:19:90:00/36\tPRESSOL Schmiergeraete GmbH\n40:D8:55:19:A0:00/36\tRohde&Schwarz Topex SA\n40:D8:55:19:B0:00/36\tNorthern Star Technologies\n40:D8:55:19:C0:00/36\tParris Service Corporation\n40:D8:55:19:D0:00/36\tEMAC, Inc.\n40:D8:55:19:E0:00/36\tThirdwayv Inc.\n40:D8:55:19:F0:00/36\tPatria Aviation Oy\n40:D8:55:1A:00:00/36\tFutaba Corporation\n40:D8:55:1A:10:00/36\tKronotech Srl\n40:D8:55:1A:20:00/36\tHipodromo De Agua Caliente, S.A. De C.V.\n40:D8:55:1A:30:00/36\tNoritake Itron Corporation\n40:D8:55:1A:40:00/36\tcibite AG\n40:D8:55:1A:50:00/36\tDemoPad\n40:D8:55:1A:60:00/36\tRB-LINK Wireless\n40:D8:55:1A:70:00/36\tENTEC Electric & Electronic CO., LTD\n40:D8:55:1A:80:00/36\tMultiobrabotka\n40:D8:55:1A:90:00/36\tLubino s.r.o.\n40:D8:55:1A:A0:00/36\tBroachlink Technology Co.,Limited\n40:D8:55:1A:B0:00/36\tRosslare Enterprises Limited\n40:D8:55:1A:C0:00/36\tBucher Automation Budapest\n40:D8:55:1A:D0:00/36\tWicher Digital Technik\n40:D8:55:1A:E0:00/36\tAutonomous Solutions, Inc\n40:D8:55:1A:F0:00/36\tVigitron Inc.\n40:D8:55:1B:00:00/36\tShin-ei Electronic Measuring Co.,Ltd.\n40:D8:55:1B:10:00/36\tLogos 01 S.r.l.\n40:D8:55:1B:20:00/36\tAGE A. Gilg Elektronik\n40:D8:55:1B:30:00/36\tBettini Srl\n40:D8:55:1B:40:00/36\tInforce Computing Inc.\n40:D8:55:1B:50:00/36\tA+EC Klein Ingenieurbuero\n40:D8:55:1B:60:00/36\tMagic Systems\n40:D8:55:1B:70:00/36\tTEWS Elektronik GmbH & Co. KG\n40:D8:55:1B:80:00/36\tOrion Systems, Inc\n40:D8:55:1B:90:00/36\tBeking Industrieele automatisering\n40:D8:55:1B:A0:00/36\tCreative Lighting And Sound Systems Pty Ltd\n40:D8:55:1B:B0:00/36\tMicromega Dynamics SA\n40:D8:55:1B:C0:00/36\tKbDevice,Inc.\n40:D8:55:1B:D0:00/36\tHoriba Abx Sas\n40:D8:55:1B:E0:00/36\tPeek Traffic\n40:D8:55:1B:F0:00/36\tshanghai mingding information tech co.Ltd\n40:D8:55:1C:00:00/36\tNPB Automation AB\n40:D8:55:1C:10:00/36\tTriamec Motion AG\n40:D8:55:1C:20:00/36\tDigital Display Systems\n40:D8:55:1C:30:00/36\tCornfed Systems LLC\n40:D8:55:1C:40:00/36\tQED Advanced Systems Limited\n40:D8:55:1C:50:00/36\tPrivate\n40:D8:55:1C:60:00/36\tDevice Solutions Ltd\n40:D8:55:1C:70:00/36\tWexiodisk AB\n40:D8:55:1C:80:00/36\tSensata Technologies\n40:D8:55:1C:90:00/36\tAndy-L Ltd.\n40:D8:55:1C:A0:00/36\tRigel Engineering\n40:D8:55:1C:B0:00/36\tMG s.r.l.\n40:D8:55:1C:C0:00/36\tNKT Photonics A/S\n40:D8:55:1C:D0:00/36\tYXLON International A/S\n40:D8:55:1C:E0:00/36\tPeter Huber Kaeltemaschinenbau SE\n40:D8:55:1C:F0:00/36\tOmnik New Energy Co., Ltd\n40:D8:55:1D:00:00/36\tWebeasy BV\n40:D8:55:1D:10:00/36\tFounder Broadband Network Service Co.,Ltd.\n40:D8:55:1D:20:00/36\tInventLab s.c.\n40:D8:55:1D:30:00/36\tKaluga Teletypes Manufacturing Plant\n40:D8:55:1D:40:00/36\tPrisma Engineering srl\n40:D8:55:1D:50:00/36\tFST21 Ltd.\n40:D8:55:1D:60:00/36\tEMS Computers Pty Ltd\n40:D8:55:1D:70:00/36\tWheatstone Corporation\n40:D8:55:1D:80:00/36\tOwl Cyber Defense Solutions, LLC\n40:D8:55:1D:90:00/36\tCommercial Wireless Systems International LLC.\n40:D8:55:1D:A0:00/36\tEnergy Technology and Control Ltd.\n40:D8:55:1D:B0:00/36\tNippon Techno Lab.,Inc,\n40:D8:55:1D:C0:00/36\tAplex Technology Inc.\n40:D8:55:1D:D0:00/36\tBaOpt Benelux bv\n40:D8:55:1D:E0:00/36\tVidisys GmbH\n40:D8:55:1D:F0:00/36\tChengdu Meihuan Technology Co., Ltd\n40:D8:55:1E:00:00/36\tEmbedded Technology Corporation\n40:D8:55:1E:10:00/36\tAd Qualite\n40:D8:55:1E:20:00/36\tELNEC s.r.o.\n40:D8:55:1E:30:00/36\tMega Electronics Ltd\n40:D8:55:1E:40:00/36\tSTEK Ltd\n40:D8:55:50:D0:00/36\tShenzhen MaiWei Cable TV Equipment CO.,LTD.\n40:D8:55:EE:60:00/36\tNarinet, Inc.\n40:D9:5A\t\tAMPAK Technology,Inc.\n40:DA:5C\t\tApple, Inc.\n40:DC:9D\t\tHajen\n40:DC:A5\t\tHuawei Device Co., Ltd.\n40:DD:D1\t\tBeautiful Card Corporation\n40:DE:17\t\tShenzhen Lanfeng Times Industrial Co.,Ltd.\n40:DE:24\t\tSamsung Electronics Co.,Ltd\n40:DE:AD\t\tJuniper Networks\n40:DF:02\t\tLINE BIZ Plus\n40:E1:1C\t\tshenzhen Cloud High Communication Technology Co.,Ltd\n40:E1:71\t\tJiangsu Huitong Group Co.,Ltd.\n40:E1:E4\t\tNokia Solutions and Networks GmbH & Co. KG\n40:E2:30\t\tAzureWave Technology Inc.\n40:E3:17\t\tExtreme Networks Headquarters\n40:E3:D6\t\tHewlett Packard Enterprise\n40:E6:4B\t\tApple, Inc.\n40:E7:30\t\tDEY Storage Systems, Inc.\n40:E7:93\t\tShenzhen Siviton Technology Co.,Ltd\n40:E9:9B\t\tSamsung Electro-Mechanics(Thailand)\n40:EA:CE\t\tFounder Broadband Network Service Co.,Ltd\n40:EB:21\t\tHuawei Technologies Co.,Ltd\n40:EC:99\t\tIntel Corporate\n40:EC:F8\t\tSiemens AG\n40:ED:00\t\tTP-Link Systems Inc\n40:ED:98\t\tIEEE Registration Authority\n40:ED:98:00:00:00/28\tTsinghua Tongfang Co., LTD\n40:ED:98:10:00:00/28\tGuangZhou FiiO Electronics Technology Co.,Ltd\n40:ED:98:20:00:00/28\tA-Iox Inc.\n40:ED:98:30:00:00/28\tKnox Company\n40:ED:98:40:00:00/28\tKendrion Kuhnke Automation GmbH\n40:ED:98:50:00:00/28\tCape\n40:ED:98:60:00:00/28\tShanghai Broadwan Communications Co.,Ltd\n40:ED:98:70:00:00/28\tVaisala Oyj\n40:ED:98:80:00:00/28\tGuangzhou Auric Intelligent Technology Co.,Ltd.\n40:ED:98:90:00:00/28\tTeraTron GmbH\n40:ED:98:A0:00:00/28\tIntegrated Design Ltd\n40:ED:98:B0:00:00/28\tSiebert Industrieelektronik GmbH\n40:ED:98:C0:00:00/28\tBloomSky,Inc.\n40:ED:98:D0:00:00/28\tHangzhou GANX Technology Co.,Ltd.\n40:ED:98:E0:00:00/28\tBorda Technology\n40:ED:CF\t\tApple, Inc.\n40:EE:15\t\tZioncom Electronics (Shenzhen) Ltd.\n40:EE:BE\t\tNXP Semiconductor (Tianjin) LTD.\n40:EE:DD\t\tHuawei Technologies Co.,Ltd\n40:EF:4C\t\tFihonest communication co.,Ltd\n40:F0:2F\t\tLiteon Technology Corporation\n40:F0:4E\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n40:F0:78\t\tCisco Systems, Inc\n40:F1:4C\t\tISE Europe SPRL\n40:F2:01\t\tSagemcom Broadband SAS\n40:F2:1C\t\tZhone Technologies, Inc.\n40:F2:E9\t\tIbm\n40:F3:08\t\tMurata Manufacturing Co., Ltd.\n40:F3:85\t\tIEEE Registration Authority\n40:F3:85:00:00:00/28\tSubPac\n40:F3:85:10:00:00/28\tJohnson Matthey\n40:F3:85:20:00:00/28\tBeijing Zongheng Electro-Mechanical Technology Development Co.\n40:F3:85:30:00:00/28\tIntelliDesign Pty Ltd\n40:F3:85:40:00:00/28\tEmbedded IQ\n40:F3:85:50:00:00/28\tKato Engineering Inc.\n40:F3:85:60:00:00/28\tLennox International Incorporated\n40:F3:85:70:00:00/28\tPalazzetti Lelio Spa\n40:F3:85:80:00:00/28\tGreat Talent Technology Limited\n40:F3:85:90:00:00/28\tFast Precision Technologies Co. Ltd.\n40:F3:85:A0:00:00/28\tCreanord\n40:F3:85:B0:00:00/28\tURMET Home & Building Solutions Pty Ltd\n40:F3:85:C0:00:00/28\tClixxo Broadband Private Limited\n40:F3:85:D0:00:00/28\tDigital Bros S.p.A.\n40:F3:85:E0:00:00/28\tBBB Inc.\n40:F3:B0\t\tTexas Instruments\n40:F4:07\t\tNintendo Co., Ltd.\n40:F4:13\t\tRubezh\n40:F4:20\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n40:F4:9F\t\tCisco Systems, Inc\n40:F4:C9\t\tFN-LINK TECHNOLOGY Ltd.\n40:F4:EC\t\tCisco Systems, Inc\n40:F4:FD\t\tUnion Man Technology Co.,Ltd\n40:F5:20\t\tEspressif Inc.\n40:F5:2E\t\tLeica Microsystems (Schweiz) AG\n40:F6:BC\t\tAmazon Technologies Inc.\n40:F8:DF\t\tCanon Inc.\n40:F9:46\t\tApple, Inc.\n40:F9:D5\t\tTecore Networks\n40:FA:7F\t\tPreh Car Connect GmbH\n40:FA:FE\t\tMotorola Mobility LLC, a Lenovo Company\n40:FC:89\t\tCommscope\n40:FD:F3\t\tAMPAK Technology,Inc.\n40:FE:0D\t\tMaxio\n40:FE:95\t\tNew H3C Technologies Co., Ltd\n40:FF:40\t\tGloquadTech\n44:00:10\t\tApple, Inc.\n44:00:49\t\tAmazon Technologies Inc.\n44:00:4D\t\tHuawei Technologies Co.,Ltd\n44:01:BB\t\tShenzhen Bilian Electronic Co.，Ltd\n44:03:2C\t\tIntel Corporate\n44:03:77\t\tIEEE Registration Authority\n44:03:77:00:00:00/28\tMusashi Seimitsu Industry Co.,Ltd\n44:03:77:10:00:00/28\tAtari, Inc.\n44:03:77:20:00:00/28\tExsom Computers LLC\n44:03:77:30:00:00/28\tAnnapurna labs\n44:03:77:40:00:00/28\tLenovo Image(Tianjin) Technology Ltd.\n44:03:77:50:00:00/28\tNorden Communication UK Ltd.\n44:03:77:60:00:00/28\tShen Zhen Huawang Technology Co; Ltd\n44:03:77:70:00:00/28\tStara S/A Indústria de Implementos Agrícolas\n44:03:77:80:00:00/28\tGemmy Electronics (Shenzhen) Co, Ltd\n44:03:77:90:00:00/28\tShenzhen Ut-King Technology Co.,Ltd\n44:03:77:A0:00:00/28\tsymplr\n44:03:77:B0:00:00/28\tHangzhou Asia Infrastructure Tech. Co., Ltd.\n44:03:77:C0:00:00/28\tBIG Climatic Manufacture, Co. LTD, Zhongshan Branch\n44:03:77:D0:00:00/28\tOmnisense Systems Private Limited Taiwan Branch\n44:03:77:E0:00:00/28\tBolin Technology Co., Ltd\n44:03:A7\t\tCisco Systems, Inc\n44:04:44\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n44:05:3F\t\tSagemcom Broadband SAS\n44:05:B8\t\tHuawei Device Co., Ltd.\n44:05:E8\t\ttwareLAB\n44:07:0B\t\tGoogle, Inc.\n44:09:B8\t\tSalcomp (Shenzhen) CO., LTD.\n44:09:C6\t\tHuawei Technologies Co.,Ltd\n44:09:DA\t\tApple, Inc.\n44:0B:AB\t\tPositivo Tecnologia S.A.\n44:0C:EE\t\tRobert Bosch Elektronikai Kft.\n44:0C:FD\t\tNetMan Co., Ltd.\n44:10:FE\t\tHuizhou Foryou General Electronics Co., Ltd.\n44:11:02\t\tEDMI  Europe Ltd\n44:11:46\t\tThe Chamberlain Group, Inc\n44:11:C2\t\tTelegartner Karl Gartner GmbH\n44:12:44\t\tHewlett Packard Enterprise\n44:13:19\t\tWkk Technology Ltd.\n44:13:D0\t\tzte corporation\n44:14:41\t\tAudioControl Inc.\n44:15:24\t\tSagemcom Broadband SAS\n44:16:22\t\tMicrosoft Corporation\n44:16:90\t\tWuxi Ranke Technology Co., Ltd.\n44:16:FA\t\tSamsung Electronics Co.,Ltd\n44:17:93\t\tEspressif Inc.\n44:18:47\t\tHunan Scrown Electronic Information Tech.Co.,Ltd\n44:18:4F\t\tFitview\n44:18:FD\t\tApple, Inc.\n44:19:B6\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n44:1A:4C\t\txFusion Digital Technologies Co.,Ltd.\n44:1A:84\t\tQuectel Wireless Solutions Co.,Ltd.\n44:1A:AC\t\tElektrik Uretim AS EOS\n44:1A:FA\t\tNew H3C Technologies Co., Ltd\n44:1B:88\t\tApple, Inc.\n44:1C:12\t\tVantiva USA LLC\n44:1C:7F\t\tMotorola Mobility LLC, a Lenovo Company\n44:1C:A8\t\tHon Hai Precision Ind. Co.,Ltd.\n44:1D:64\t\tEspressif Inc.\n44:1D:B1\t\tAptiv Services Us, Llc\n44:1E:91\t\tARVIDA Intelligent Electronics Technology  Co.,Ltd.\n44:1E:98\t\tRuckus Wireless\n44:1E:A1\t\tHewlett Packard\n44:20:63\t\tContinental Automotive Technologies GmbH\n44:22:7C\t\tHuawei Technologies Co.,Ltd\n44:22:95\t\tChina Mobile Iot Limited company\n44:22:F1\t\tS.Fac, Inc\n44:23:7C\t\tBeijing Xiaomi Mobile Software Co., Ltd\n44:23:AA\t\tFarmage Co., Ltd.\n44:25:BB\t\tBamboo Entertainment Corporation\n44:27:2E\t\tHuawei Device Co., Ltd.\n44:27:45\t\tLG Innotek\n44:27:F3\t\t70mai Co.,Ltd.\n44:28:A3\t\tJiangsu fulian  Communication Technology Co., Ltd.\n44:29:1E\t\tAltoBeam (China) Inc.\n44:29:38\t\tNietZsche enterprise Co.Ltd.\n44:2A:60\t\tApple, Inc.\n44:2A:FF\t\tE3 Technology, Inc.\n44:2B:03\t\tCisco Systems, Inc\n44:2C:05\t\tAMPAK Technology, Inc.\n44:30:3F\t\tHuawei Technologies Co.,Ltd\n44:31:92\t\tHewlett Packard\n44:32:2A\t\tAvaya Inc\n44:32:62\t\tzte corporation\n44:32:C2\t\tGOAL Co., Ltd.\n44:32:C8\t\tVantiva USA LLC\n44:33:4C\t\tShenzhen Bilian electronic CO.,LTD\n44:34:8F\t\tMxt Industrial Ltda\n44:34:A7\t\tCommscope\n44:35:6F\t\tNeterix Ltd\n44:35:83\t\tApple, Inc.\n44:35:B9\t\tNetComm Wireless Pty Ltd\n44:35:D3\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n44:36:59\t\tRobert Bosch GmbH\n44:36:5D\t\tShenzhen HippStor Technology Co., Ltd\n44:37:08\t\tMRV Comunications\n44:37:0B\t\tGuangzhou Shiyuan Electronic Technology Company Limited\n44:37:19\t\t2 Save Energy Ltd\n44:37:6F\t\tYoung Electric Sign Co\n44:37:E6\t\tHon Hai Precision Ind. Co.,Ltd.\n44:38:39\t\tCumulus Networks, inc\n44:38:8C\t\tSumitomo Electric Industries, Ltd\n44:38:E8\t\tIntel Corporate\n44:39:C4\t\tUniversal Global Scientific Industrial Co., Ltd.\n44:3B:14\t\tMitraStar Technology Corp.\n44:3B:32\t\tIntelbras\n44:3C:88\t\tFicosa Maroc International\n44:3C:9C\t\tPintsch GmbH\n44:3D:21\t\tNuvolt\n44:3D:54\t\tAmazon Technologies Inc.\n44:3E:07\t\tElectrolux\n44:3E:8A\t\tTexas Instruments\n44:3E:B2\t\tDEOTRON Co., LTD.\n44:41:F0\t\tzte corporation\n44:42:01\t\tAmazon Technologies Inc.\n44:42:2F\t\tTestop Co.,Ltd.\n44:44:50\t\tOttoQ\n44:45:6F\t\tShenzhen Onega Technology Co.,Ltd\n44:46:48\t\tHon Hai Precision Industry Co.,LTD\n44:46:87\t\tRealme Chongqing MobileTelecommunications Corp Ltd\n44:47:CC\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n44:48:91\t\tHDMI Licensing, LLC\n44:48:B9\t\tMitraStar Technology Corp.\n44:48:C1\t\tHewlett Packard Enterprise\n44:48:FF\t\tQingdao Haier Technology Co.,Ltd\n44:49:63\t\tWoven By Toyota U.S., Inc.\n44:49:88\t\tIntel Corporate\n44:4A:37\t\tXiaomi Communications Co Ltd\n44:4A:65\t\tSilverflare Ltd.\n44:4A:B0\t\tZhejiang Moorgen Intelligence Technology Co., Ltd\n44:4A:D6\t\tShenzhen Rinocloud Technology Co.,Ltd.\n44:4A:DB\t\tApple, Inc.\n44:4B:5D\t\tGE Healthcare\n44:4B:7E\t\tFiberhome Telecommunication Technologies Co.,LTD\n44:4C:0C\t\tApple, Inc.\n44:4C:A8\t\tArista Networks\n44:4E:1A\t\tSamsung Electronics Co.,Ltd\n44:4E:6D\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n44:4F:5E\t\tPan Studios Co.,Ltd.\n44:4F:8E\t\tWiZ\n44:51:DB\t\tRaytheon BBN Technologies\n44:54:C0\t\tThompson Aerospace\n44:55:B1\t\tHuawei Technologies Co.,Ltd\n44:55:C4\t\tHuawei Device Co., Ltd.\n44:56:8D\t\tPNC Technologies  Co., Ltd.\n44:56:B7\t\tSpawn Labs, Inc\n44:56:E2\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n44:58:29\t\tCisco SPVTG\n44:59:25\t\tSquare Inc.\n44:59:43\t\tzte corporation\n44:59:9F\t\tCriticare Systems, Inc\n44:59:E3\t\tHuawei Technologies Co.,Ltd\n44:5A:DF\t\tMikami & Co., Ltd.\n44:5B:ED\t\tHewlett Packard Enterprise\n44:5C:E9\t\tSamsung Electronics Co.,Ltd\n44:5D:5E\t\tSHENZHEN Coolkit Technology CO.,LTD\n44:5E:CD\t\tRazer Inc\n44:5E:F3\t\tTonalite Holding B.V.\n44:5F:7A\t\tShihlin Electric & Engineering Corp.\n44:5F:8C\t\tIntercel Group Limited\n44:61:32\t\tecobee inc\n44:61:9C\t\tFONsystem co. ltd.\n44:62:46\t\tComat AG\n44:63:70\t\tLCFC(Hefei) Electronics Technology co., ltd\n44:64:3C\t\tCisco Systems, Inc\n44:65:0D\t\tAmazon Technologies Inc.\n44:65:6A\t\tMega Video Electronic(HK) Industry Co., Ltd\n44:65:7F\t\tCalix Inc.\n44:65:E0\t\tMerlion Consulting Services (Shenzhen) Co., Ltd\n44:66:6E\t\tIp-Line\n44:66:FC\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n44:67:47\t\tHuawei Technologies Co.,Ltd\n44:67:52\t\tWistron INFOCOMM (Zhongshan) CORPORATION\n44:67:55\t\tOrbit Irrigation\n44:68:0C\t\tWacom Co.,Ltd.\n44:68:AB\t\tJuin Company, Limited\n44:6A:2E\t\tHuawei Technologies Co.,Ltd\n44:6A:B7\t\tCommscope\n44:6B:1F\t\tTexas Instruments\n44:6C:24\t\tReallin Electronic Co.,Ltd\n44:6D:05\t\tNoTraffic\n44:6D:57\t\tLiteon Technology Corporation\n44:6D:6C\t\tSamsung Electronics Co.,Ltd\n44:6D:7F\t\tAmazon Technologies Inc.\n44:6E:E5\t\tHuawei Technologies Co.,Ltd\n44:6F:D8\t\tIEEE Registration Authority\n44:6F:D8:00:00:00/28\tSichuan subao network technology ltd.co.\n44:6F:D8:10:00:00/28\tShenzhen Furuilian Electronic Co.,Ltd.\n44:6F:D8:20:00:00/28\tBAYKON Endüstriyel Kontrol Sistemleri San. ve Tic. A.Ş.\n44:6F:D8:30:00:00/28\tShenzhen Mestechs Technology CO., LTD\n44:6F:D8:40:00:00/28\tlb Lautsprecher gmbH\n44:6F:D8:50:00:00/28\tZhejiang Ship Electronics & Technology Co., Ltd.\n44:6F:D8:60:00:00/28\tAnhui GuDao Tech\n44:6F:D8:70:00:00/28\tItc\n44:6F:D8:80:00:00/28\tGlobal Telecom Engineering, Inc\n44:6F:D8:90:00:00/28\tAnnapurna labs\n44:6F:D8:A0:00:00/28\tZHEJIANG HIKAILINK TECHNOLOGY Co., Ltd\n44:6F:D8:B0:00:00/28\tBeijing gpthink technology co.,LTD.\n44:6F:D8:C0:00:00/28\tChangzhou Haitu Electronic Technology Co.,Ltd\n44:6F:D8:D0:00:00/28\tScaime\n44:6F:D8:E0:00:00/28\tCte\n44:6F:F8\t\tDyson Limited\n44:70:0B\t\tIffu\n44:70:98\t\tMing Hong Technology (Shen Zhen) Limited\n44:71:47\t\tBeijing Xiaomi Electronics Co.,Ltd\n44:71:B3\t\tLogitech Far East\n44:72:AC\t\tAltoBeam Inc.\n44:73:D6\t\tLogitech\n44:74:6C\t\tSony Corporation\n44:76:09\t\tNew H3C Technologies Co., Ltd\n44:76:54\t\tHuawei Technologies Co.,Ltd\n44:76:E7\t\tTecno Mobile Limited\n44:78:3E\t\tSamsung Electronics Co.,Ltd\n44:7B:BB\t\tShenzhen YOUHUA Technology Co., Ltd\n44:7B:C4\t\tDualShine Technology(SZ)Co.,Ltd\n44:7C:7F\t\tInnolight Technology Corporation\n44:7D:A5\t\tVtion Information Technology (Fujian) Co.,Ltd\n44:7E:76\t\tTrek Technology (S) Pte Ltd\n44:7E:95\t\tAlpha and Omega, Inc\n44:7F:77\t\tConnected Home\n44:80:EB\t\tMotorola Mobility LLC, a Lenovo Company\n44:82:E5\t\tHuawei Technologies Co.,Ltd\n44:83:12\t\tStar-Net\n44:85:00\t\tIntel Corporate\n44:85:02\t\tShenzhen SuperElectron Technology Co.,Ltd.\n44:85:DA\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n44:86:C1\t\tSiemens Low Voltage & Products\n44:87:23\t\tHoya Service Corporation\n44:87:63\t\tFN-LINK TECHNOLOGY Ltd.\n44:87:DB\t\tTymphany Acoustic Technology (Huizhou) Co.,  Ltd.\n44:87:FC\t\tElitegroup Computer Systems Co.,Ltd.\n44:88:16\t\tCisco Systems, Inc\n44:88:BE\t\tTexas Instruments\n44:88:CB\t\tCamco Technologies NV\n44:89:6D\t\tTellescom Industria E Comercio Em Telecomunicacao\n44:8A:5B\t\tMicro-Star INT'L CO., LTD.\n44:8C:00\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n44:8C:52\t\tKTIS CO., Ltd\n44:8C:AB\t\tBeijing Flitlink Vientiane Technology Co., LTD\n44:8D:BF\t\tRhino Mobility LLC\n44:8E:12\t\tDT Research, Inc.\n44:8E:81\t\tVig\n44:8E:EC\t\tChina Mobile Group Device Co.,Ltd.\n44:8F:17\t\tSamsung Electronics Co., Ltd. ARTIK\n44:90:46\t\tHonor Device Co., Ltd.\n44:90:BB\t\tApple, Inc.\n44:91:60\t\tMurata Manufacturing Co., Ltd.\n44:91:7C\t\tHMD Global Oy\n44:91:DB\t\tShanghai Huaqin Telecom Technology Co.,Ltd\n44:94:FC\t\tNetgear\n44:95:3B\t\tRLTech India Private Limited\n44:95:FA\t\tQingdao Santong Digital Technology Co.Ltd\n44:96:2B\t\tAidon Oy\n44:97:5A\t\tShenzhen Fast Technologies Co.,Ltd\n44:9B:78\t\tThe Now Factory\n44:9B:C1\t\tHuawei Technologies Co.,Ltd\n44:9C:B5\t\tAlcomp, Inc\n44:9E:8B\t\tApple, Inc.\n44:9E:F9\t\tvivo Mobile Communication Co., Ltd.\n44:9F:46\t\tHuawei Device Co., Ltd.\n44:9F:7F\t\tDataCore Software Corporation\n44:9F:DA\t\tSilicon Laboratories\n44:A0:38\t\tHuawei Device Co., Ltd.\n44:A1:0E\t\tApple, Inc.\n44:A1:91\t\tHuawei Technologies Co.,Ltd\n44:A3:BB\t\tIntel Corporate\n44:A3:C7\t\tzte corporation\n44:A4:2D\t\tTCT mobile ltd\n44:A4:66\t\tGroupe Ldlc\n44:A5:4E\t\tQorvo International Pte. Ltd.\n44:A5:6E\t\tNetgear\n44:A6:1E\t\tIngram Micro Services\n44:A6:42\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n44:A6:89\t\tPromax Electronica Sa\n44:A6:E5\t\tThinking Technology Co.,Ltd\n44:A7:CF\t\tMurata Manufacturing Co., Ltd.\n44:A7:F4\t\tApple, Inc.\n44:A8:42\t\tDell Inc.\n44:A8:C2\t\tSewoo Tech Co., Ltd\n44:A8:FC\t\tApple, Inc.\n44:A9:2C\t\tIEEE Registration Authority\n44:A9:2C:00:00:00/28\tZhejiang Hising Technology Co.,Ltd\n44:A9:2C:10:00:00/28\tuimcom\n44:A9:2C:20:00:00/28\tAnhui Zhongxin Electronic Technology Co., Ltd.\n44:A9:2C:30:00:00/28\tLuxonis Holding Corporation\n44:A9:2C:40:00:00/28\tNetX Networks a.s.\n44:A9:2C:50:00:00/28\tShenzhen Lianfaxun Electronic Technology Co.,Ltd\n44:A9:2C:60:00:00/28\tNingbo joyson new energy automotive technology Co.,Ltd\n44:A9:2C:70:00:00/28\tEfficient Building Automation Corp.\n44:A9:2C:80:00:00/28\tRT-Systemtechnik GmbH\n44:A9:2C:90:00:00/28\tChina Electronics Corporation Greatwall Shengfeifan information system Co.,ltd. Hu'nan computer R.&D. Center\n44:A9:2C:A0:00:00/28\tDigiport OU\n44:A9:2C:B0:00:00/28\tAmethystum Storage Technology Co., Ltd\n44:A9:2C:C0:00:00/28\tCubitech\n44:A9:2C:D0:00:00/28\tNpp Kometeh Jsc\n44:A9:2C:E0:00:00/28\tAnnapurna labs\n44:AA:27\t\tudworks Co., Ltd.\n44:AA:50\t\tJuniper Networks\n44:AA:E8\t\tNanotec Electronic GmbH & Co. KG\n44:AA:F5\t\tCommscope\n44:AC:85\t\teero inc.\n44:AD:19\t\tXingfei （H.K）Limited\n44:AD:B1\t\tSagemcom Broadband SAS\n44:AD:D9\t\tCisco Systems, Inc\n44:AE:25\t\tCisco Systems, Inc\n44:AE:44\t\tHuawei Device Co., Ltd.\n44:AE:AB\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n44:AF:28\t\tIntel Corporate\n44:B2:95\t\tSichuan AI-Link Technology Co., Ltd.\n44:B3:2D\t\tTp-Link Technologies Co.,Ltd.\n44:B3:82\t\tKuang-chi Institute of Advanced Technology\n44:B3:C5\t\tHuawei Device Co., Ltd.\n44:B4:12\t\tSius Ag\n44:B4:23\t\tHanwha Vision Vietnam Company Limited\n44:B4:33\t\ttide.co.,ltd\n44:B4:62\t\tFlextronics Tech.(Ind) Pvt Ltd\n44:B4:B2\t\tAmazon Technologies Inc.\n44:B5:9C\t\tTenet Networks Private Limited\n44:B6:BE\t\tCisco Systems, Inc\n44:B7:D0\t\tMicrochip Technology Inc.\n44:B9:94\t\tDouglas Lighting Controls\n44:BA:46\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n44:BB:3B\t\tGoogle, Inc.\n44:BD:DE\t\tBHTC GmbH\n44:BE:0B\t\tHuawei Technologies Co.,Ltd\n44:BF:E3\t\tShenzhen Longtech Electronics Co.,Ltd\n44:C1:5C\t\tTexas Instruments\n44:C2:0C\t\tCisco Systems, Inc\n44:C2:33\t\tGuangzhou Comet Technology Development Co.Ltd\n44:C3:06\t\tSIFROM Inc.\n44:C3:46\t\tHuawei Technologies Co.,Ltd\n44:C3:9B\t\tOoo Rubezh Npo\n44:C3:B6\t\tHuawei Technologies Co.,Ltd\n44:C4:A9\t\tOpticom Communication, LLC\n44:C5:32\t\tHuawei Technologies Co.,Ltd\n44:C5:6F\t\tNGN Easy Satfinder (Tianjin) Electronic Co., Ltd\n44:C6:3C\t\tSamsung Electronics Co.,Ltd\n44:C6:5D\t\tApple, Inc.\n44:C6:9B\t\tWuhan Feng Tian Information Network CO.,LTD\n44:C7:FC\t\tHuawei Device Co., Ltd.\n44:C8:74\t\tChina Mobile Group Device Co.,Ltd.\n44:C9:A2\t\tGreenwald Industries\n44:CB:8B\t\tLG Innotek\n44:CB:AD\t\tXiaomi Communications Co Ltd\n44:CD:0E\t\tFlextronics Manufacturing(Zhuhai)Co.,Ltd.\n44:CE:3A\t\tJiangsu Huacun Electronic Technology Co., Ltd.\n44:CE:7D\t\tSfr\n44:D1:5E\t\tShanghai Kingto Information Technology Ltd\n44:D1:FA\t\tShenzhen Yunlink Technology Co., Ltd\n44:D2:44\t\tSeiko Epson Corporation\n44:D2:67\t\tSnorble\n44:D2:CA\t\tAnvia TV Oy\n44:D3:AD\t\tShenzhen TINNO Mobile Technology Corp.\n44:D3:CA\t\tCisco Systems, Inc\n44:D4:37\t\tInteno Broadband Technology AB\n44:D4:53\t\tSagemcom Broadband SAS\n44:D4:54\t\tSagemcom Broadband SAS\n44:D4:65\t\tNXP Semiconductors Taiwan Ltd.\n44:D4:7F\t\tIngenico Terminals Sas\n44:D4:E0\t\tSony Corporation\n44:D5:06\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n44:D5:A5\t\tAddOn Computer\n44:D5:C1\t\tEM Microelectronic\n44:D5:CC\t\tAmazon Technologies Inc.\n44:D5:F2\t\tIEEE Registration Authority\n44:D5:F2:00:00:00/28\tTIBA Research & Development (1986) LTD\n44:D5:F2:10:00:00/28\tSimplered Technology Ltd.\n44:D5:F2:20:00:00/28\tShenzhen Hebang Electronic Co., Ltd\n44:D5:F2:30:00:00/28\tVuro Llc\n44:D5:F2:40:00:00/28\tAppotronics Co., Ltd\n44:D5:F2:50:00:00/28\ttiga.eleven GmbH\n44:D5:F2:60:00:00/28\tBeam Communications Pty Ltd\n44:D5:F2:70:00:00/28\tShenzhen Qiutian Technology Co.,Ltd\n44:D5:F2:80:00:00/28\tCETC Avionics.L td\n44:D5:F2:90:00:00/28\tAuctus Technologies Co.,Ltd.\n44:D5:F2:A0:00:00/28\tSYS TEC electronic GmbH\n44:D5:F2:B0:00:00/28\tValeo Interior Controls (Shenzhen) Co.,Ltd\n44:D5:F2:C0:00:00/28\tneocontrol soluções em automação\n44:D5:F2:D0:00:00/28\tShenzhen Nation RFID Technology Co.,Ltd.\n44:D5:F2:E0:00:00/28\tJoint-Stock Company Research and Development Center \"ELVEES\"\n44:D6:3D\t\tTalari Networks\n44:D6:E1\t\tSnuza International Pty. Ltd.\n44:D7:7E\t\tRobert Bosch GmbH\n44:D7:91\t\tHuawei Technologies Co.,Ltd\n44:D8:32\t\tAzureWave Technology Inc.\n44:D8:78\t\tHui Zhou Gaoshengda Technology Co.,LTD\n44:D8:84\t\tApple, Inc.\n44:D9:80\t\tEverybot Inc.\n44:D9:E7\t\tUbiquiti Inc\n44:DA:30\t\tApple, Inc.\n44:DB:60\t\tNanjing Baihezhengliu Technology Co., Ltd\n44:DB:D2\t\tYealink(Xiamen) Network Technology Co.,Ltd.\n44:DC:4E\t\tItel Mobile Limited\n44:DC:91\t\tPlanex Communications Inc.\n44:DC:CB\t\tSemindia Systems Pvt Ltd\n44:DF:65\t\tBeijing Xiaomi Mobile Software Co., Ltd\n44:E0:8E\t\tCisco SPVTG\n44:E1:37\t\tCommscope\n44:E2:F1\t\tNewRadio Technologies Co. , Ltd.\n44:E2:F8\t\tSilicon Laboratories\n44:E4:9A\t\tOmnitronics Pty Ltd\n44:E4:D9\t\tCisco Systems, Inc\n44:E4:E6\t\tExtreme Networks Headquarters\n44:E4:EE\t\tWistron Neweb Corporation\n44:E5:17\t\tIntel Corporate\n44:E5:9B\t\tHuawei Technologies Co.,Ltd\n44:E6:4A\t\tShenzhen iComm Semiconductor CO.,LTD\n44:E6:6E\t\tApple, Inc.\n44:E6:B0\t\tChina Mobile IOT Company Limited\n44:E7:61\t\tInfinix mobility limited\n44:E8:A5\t\tMyreka Technologies Sdn. Bhd.\n44:E9:68\t\tHuawei Technologies Co.,Ltd\n44:E9:DD\t\tSagemcom Broadband SAS\n44:EA:30\t\tSamsung Electronics Co.,Ltd\n44:EA:4B\t\tActlas Inc.\n44:EA:D8\t\tTexas Instruments\n44:EB:2E\t\tAlpsalpine Co,.Ltd\n44:EC:CE\t\tJuniper Networks\n44:ED:57\t\tLongicorn, inc.\n44:EE:02\t\tMTI Ltd.\n44:EE:14\t\tTexas Instruments\n44:EE:30\t\tBudelmann Elektronik GmbH\n44:EF:BF\t\tChina Dragon Technology Limited\n44:EF:CF\t\tUGENE SOLUTION inc.\n44:F0:34\t\tKaon Group Co., Ltd.\n44:F0:9E\t\tApple, Inc.\n44:F2:1B\t\tApple, Inc.\n44:F4:36\t\tzte corporation\n44:F4:59\t\tSamsung Electronics Co.,Ltd\n44:F4:77\t\tJuniper Networks\n44:F4:E7\t\tCohesity Inc\n44:F5:3E\t\tEarda Technologies co Ltd\n44:F7:70\t\tBeijing Xiaomi Mobile Software Co., Ltd\n44:F8:49\t\tUnion Pacific Railroad\n44:F9:71\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\n44:FA:66\t\tCloud Network Technology Singapore Pte. Ltd.\n44:FB:42\t\tApple, Inc.\n44:FB:5A\t\tzte corporation\n44:FD:A3\t\tEverysight LTD.\n44:FE:3B\t\tArcadyan Corporation\n44:FE:EF\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n44:FF:BA\t\tzte corporation\n48:00:20\t\tHewlett Packard Enterprise\n48:00:31\t\tHuawei Technologies Co.,Ltd\n48:00:33\t\tVantiva USA LLC\n48:00:7D\t\tDts Elektronik San. Tic. Ltd. Sti.\n48:00:B3\t\tCisco Systems, Inc\n48:01:C5\t\tOnePlus Technology (Shenzhen) Co., Ltd\n48:02:2A\t\tB-Link Electronic Limited\n48:02:34\t\tHuawei Technologies Co.,Ltd\n48:02:86\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n48:02:AF\t\tTelit Communication s.p.a\n48:03:62\t\tDesay Electronics(Huizhou)Co.,Ltd\n48:04:9F\t\tElecom Co., Ltd\n48:05:60\t\tMeta Platforms, Inc.\n48:05:E2\t\tHuawei Device Co., Ltd.\n48:06:2B\t\tPrivate\n48:06:6A\t\tTempered Networks, Inc.\n48:0B:B2\t\tIEEE Registration Authority\n48:0B:B2:00:00:00/28\tRidango AS\n48:0B:B2:10:00:00/28\tBaja Electronics Technology Limited\n48:0B:B2:20:00:00/28\tThales CETCA Avionics CO., Ltd\n48:0B:B2:30:00:00/28\tshanghai Rinlink  Intelligent Technology Co., Ltd.\n48:0B:B2:40:00:00/28\tHangzhou Freely Communication Co., Ltd.\n48:0B:B2:50:00:00/28\tSolaredge LTD.\n48:0B:B2:60:00:00/28\tAnnapurna labs\n48:0B:B2:70:00:00/28\tBeijing Dragon Resources Limited.\n48:0B:B2:80:00:00/28\tBravoCom（xiamen）TechCo.Ltd\n48:0B:B2:90:00:00/28\tMicroprogram Information Co., Ltd\n48:0B:B2:A0:00:00/28\tXiamen Rongta Technology Co.,Ltd.\n48:0B:B2:B0:00:00/28\tPopit Oy\n48:0B:B2:C0:00:00/28\tShenzhen Topwell Technology Co..Ltd\n48:0B:B2:D0:00:00/28\tM2Lab Ltd.\n48:0B:B2:E0:00:00/28\tBeijing MFOX technology Co., Ltd.\n48:0C:49\t\tNAKAYO Inc\n48:0E:13\t\tittim\n48:0E:EC\t\tTp-Link Technologies Co.,Ltd.\n48:0F:CF\t\tHewlett Packard\n48:10:63\t\tNTT Innovation Institute, Inc.\n48:12:49\t\tLuxcom Technologies Inc.\n48:12:58\t\tHuawei Technologies Co.,Ltd\n48:12:8F\t\tHuawei Technologies Co.,Ltd\n48:13:7E\t\tSamsung Electronics Co.,Ltd\n48:13:F3\t\tBbk Educational Electronics Corp.,Ltd.\n48:16:93\t\tLear Corporation GmbH\n48:17:4C\t\tMicroPower technologies\n48:18:42\t\tShanghai Winaas Co. Equipment Co. Ltd.\n48:18:8D\t\tWeifang Goertek Electronics Co.,Ltd\n48:18:FA\t\tNocsys\n48:1A:84\t\tPointer Telocation Ltd\n48:1B:40\t\tVantiva USA LLC\n48:1B:A4\t\tCisco Systems, Inc\n48:1B:D2\t\tIntron Scientific co., ltd.\n48:1C:B9\t\tSz Dji Technology Co.,Ltd\n48:1D:70\t\tCisco SPVTG\n48:1F:2D\t\tShenzhen Jie Shi Lian Industrial Co.,LTD\n48:1F:66\t\tChina Mobile Group Device Co.,Ltd.\n48:21:0B\t\tPegatron Corporation\n48:21:6C\t\tChina Mobile IOT Company Limited\n48:22:18\t\tShenzhen Yipingfang Network Technology Co., Ltd.\n48:22:54\t\tTP-Link Systems Inc\n48:23:35\t\tDialog Semiconductor Hellas SA\n48:25:67\t\tPoly\n48:25:F3\t\tHuawei Device Co., Ltd.\n48:26:2C\t\tApple, Inc.\n48:26:4C\t\tBSH Electrical Appliances (Jiangsu) Co., Ltd.\n48:26:E8\t\tTek-Air Systems, Inc.\n48:27:59\t\tLevven Electronics Ltd.\n48:27:C5\t\tHuawei Technologies Co.,Ltd\n48:27:E2\t\tEspressif Inc.\n48:27:EA\t\tSamsung Electronics Co.,Ltd\n48:28:2F\t\tzte corporation\n48:29:52\t\tSagemcom Broadband SAS\n48:29:D6\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n48:29:E4\t\tAo\n48:2A:E3\t\tWistron InfoComm(Kunshan)Co.,Ltd.\n48:2C:A0\t\tXiaomi Communications Co Ltd\n48:2C:D0\t\tHuawei Technologies Co.,Ltd\n48:2C:EA\t\tMotorola Inc Business Light Radios\n48:2D:63\t\tWavarts Technologies Co., Ltd\n48:2E:72\t\tCisco Systems, Inc\n48:2F:6B\t\tHewlett Packard Enterprise\n48:2F:D7\t\tHuawei Technologies Co.,Ltd\n48:31:33\t\tRobert Bosch Elektronika Kft.\n48:31:77\t\tNintendo Co.,Ltd\n48:31:B7\t\tEspressif Inc.\n48:31:DB\t\tHuawei Device Co., Ltd.\n48:33:DD\t\tZennio Avance Y Tecnologia, S.L.\n48:34:3D\t\tIEP GmbH\n48:35:2B\t\tApple, Inc.\n48:35:2E\t\tShenzhen Wolck Network Product Co.,LTD\n48:35:43\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n48:35:84\t\tHuawei Device Co., Ltd.\n48:36:5F\t\tWintecronics Ltd.\n48:38:71\t\tHuawei Device Co., Ltd.\n48:38:B6\t\tAuhui Taoyun Technology Co., Ltd\n48:39:74\t\tProware Technologies Co., Ltd.\n48:3A:02\t\tFortinet, Inc.\n48:3B:38\t\tApple, Inc.\n48:3C:0C\t\tHuawei Technologies Co.,Ltd\n48:3D:32\t\tSyscor Controls & Automation\n48:3E:5E\t\tSernet (Suzhou) Technologies Corporation\n48:3F:DA\t\tEspressif Inc.\n48:3F:E9\t\tHuawei Technologies Co.,Ltd\n48:41:7B\t\tNokia Solutions and Networks GmbH & Co. KG\n48:43:5A\t\tHuawei Technologies Co.,Ltd\n48:43:7C\t\tApple, Inc.\n48:43:DD\t\tAmazon Technologies Inc.\n48:44:87\t\tCisco SPVTG\n48:44:F7\t\tSamsung Electronics Co.,Ltd\n48:45:20\t\tIntel Corporate\n48:45:CF\t\tLLC Proizvodstvennaya Kompania \"TransService\"\n48:45:E6\t\tCloud Network Technology Singapore Pte. Ltd.\n48:46:8D\t\tZepcam B.V.\n48:46:C1\t\tFn-Link Technology Limited\n48:46:F1\t\tUros Oy\n48:46:FB\t\tHuawei Technologies Co.,Ltd\n48:47:4B\t\tHuawei Device Co., Ltd.\n48:49:82\t\tHuawei Device Co., Ltd.\n48:49:96\t\tHuawei Device Co., Ltd.\n48:49:C7\t\tSamsung Electronics Co.,Ltd\n48:4A:30\t\tGeorge Robotics Limited\n48:4A:E9\t\tHewlett Packard Enterprise\n48:4B:AA\t\tApple, Inc.\n48:4B:D4\t\tVantiva USA LLC\n48:4C:29\t\tHuawei Technologies Co.,Ltd\n48:4C:86\t\tHuawei Device Co., Ltd.\n48:4D:7E\t\tDell Inc.\n48:4E:FC\t\tCommscope\n48:50:73\t\tMicrosoft Corporation\n48:51:69\t\tSamsung Electronics Co.,Ltd\n48:51:B7\t\tIntel Corporate\n48:51:C5\t\tIntel Corporate\n48:51:CF\t\tIntelbras\n48:51:D0\t\tJiangsu Xinsheng Intelligent Technology Co., Ltd.\n48:52:61\t\tSoreel\n48:54:15\t\tNet Rules Tecnologia Eireli\n48:55:19\t\tEspressif Inc.\n48:55:41\t\tIskratel d.o.o.\n48:55:5C\t\tWu Qi Technologies,Inc.\n48:55:5E\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n48:55:5F\t\tFiberhome Telecommunication Technologies Co.,LTD\n48:57:02\t\tHuawei Technologies Co.,Ltd\n48:57:D2\t\tBroadcom Limited\n48:57:DD\t\tFacebook Inc\n48:59:29\t\tLG Electronics (Mobile Communications)\n48:59:A4\t\tzte corporation\n48:5A:0D\t\tJuniper Networks\n48:5A:3F\t\tWisol\n48:5A:67\t\tShaanxi Ruixun Electronic Information Technology Co., Ltd\n48:5A:B6\t\tHon Hai Precision Ind. Co.,Ltd.\n48:5A:EA\t\tFiberhome Telecommunication Technologies Co.,LTD\n48:5B:39\t\tASUSTek COMPUTER INC.\n48:5C:2C\t\tEarda Technologies co Ltd\n48:5D:35\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n48:5D:36\t\tVerizon\n48:5D:60\t\tAzureWave Technology Inc.\n48:5D:EB\t\tJust Add Power\n48:5D:ED\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n48:5E:0E\t\tIEEE Registration Authority\n48:5E:0E:00:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n48:5E:0E:10:00:00/28\tDongguan YEHUO Technology Co.,LTD\n48:5E:0E:20:00:00/28\tShenzhen Shouchuang Micro Technology Co., Ltd\n48:5E:0E:30:00:00/28\tShenzhen Anycon Electronics Technology Co.,Ltd\n48:5E:0E:40:00:00/28\tMHE Electronics\n48:5E:0E:50:00:00/28\tGlobalXtreme\n48:5E:0E:60:00:00/28\tSernet (Suzhou) Technologies Corporation\n48:5E:0E:70:00:00/28\tShanghai B&A automation.net\n48:5E:0E:80:00:00/28\tItfc\n48:5E:0E:90:00:00/28\tCnergee Technologies Private Limited\n48:5E:0E:A0:00:00/28\tAignep Spa\n48:5E:0E:B0:00:00/28\tVital Oricraft Flows Technology Co., Ltd.\n48:5E:0E:C0:00:00/28\tTransom Post OpCo LLC dba Bose Professional\n48:5E:0E:D0:00:00/28\tHuaqin Technology Co.,Ltd\n48:5E:0E:E0:00:00/28\tEloom System\n48:5F:08\t\tTp-Link Technologies Co.,Ltd.\n48:5F:2D\t\tAmazon Technologies Inc.\n48:5F:99\t\tCloud Network Technology (Samoa) Limited\n48:5F:DF\t\tzte corporation\n48:60:5F\t\tLG Electronics (Mobile Communications)\n48:60:BC\t\tApple, Inc.\n48:61:A3\t\tConcern \"Axion\" JSC\n48:61:EE\t\tSamsung Electronics Co.,Ltd\n48:62:64\t\tArlo Technology\n48:62:76\t\tHuawei Technologies Co.,Ltd\n48:63:45\t\tHuawei Device Co., Ltd.\n48:65:EE\t\tIEEE Registration Authority\n48:65:EE:00:00:00/28\tDefPower Ltd\n48:65:EE:10:00:00/28\tGopod Group Limited\n48:65:EE:20:00:00/28\tCaptionCall\n48:65:EE:30:00:00/28\tData Technology Inc.\n48:65:EE:40:00:00/28\tMission Microwave Technologies, Inc\n48:65:EE:50:00:00/28\tSwistec Systems AG\n48:65:EE:60:00:00/28\tshenzhen sunflower technologies CO., LIMITED\n48:65:EE:70:00:00/28\tVenture Research Inc.\n48:65:EE:80:00:00/28\tSmartDisplayer Technology Co., Ltd.\n48:65:EE:90:00:00/28\tVideoStitch, Inc\n48:65:EE:A0:00:00/28\tShenzhen Inpor cloud Computing Co., Ltd.\n48:65:EE:B0:00:00/28\tEnBW Energie Baden-Württemberg AG\n48:65:EE:C0:00:00/28\tDnv Gl\n48:65:EE:D0:00:00/28\tWinn Technology Co.,Ltd\n48:65:EE:E0:00:00/28\tCnu\n48:68:34\t\tSilicon Motion, Inc.\n48:68:4A\t\tIntel Corporate\n48:6B:2C\t\tBbk Educational Electronics Corp.,Ltd.\n48:6B:91\t\tFleetwood Group Inc.\n48:6D:BB\t\tVestel Elektronik San ve Tic. A.S.\n48:6E:70\t\tZhejiang Tmall Technology Co., Ltd.\n48:6E:73\t\tPica8, Inc.\n48:6E:FB\t\tDavit System Technology Co., Ltd.\n48:6F:33\t\tKyungwoo.System, Inc.\n48:6F:D2\t\tStorSimple Inc\n48:70:1E\t\tTexas Instruments\n48:70:6F\t\tHuawei Technologies Co.,Ltd\n48:71:19\t\tSgb Group Ltd.\n48:73:10\t\tJuniper Networks\n48:73:97\t\tNew H3C Technologies Co., Ltd\n48:73:CB\t\tTiinlab Corporation\n48:74:10\t\tCisco Systems, Inc\n48:74:12\t\tOnePlus Technology (Shenzhen) Co., Ltd\n48:74:6E\t\tApple, Inc.\n48:75:83\t\tIntellion AG\n48:76:04\t\tPrivate\n48:77:06\t\tNXP Semiconductor (Tianjin) LTD.\n48:77:46\t\tCalix Inc.\n48:77:BD\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n48:78:5E\t\tAmazon Technologies Inc.\n48:79:4D\t\tSamsung Electronics Co.,Ltd\n48:7A:55\t\tALE International\n48:7A:DA\t\tHangzhou H3C Technologies Co., Limited\n48:7A:F6\t\tNcs Electrical Sdn Bhd\n48:7A:FF\t\tEssys\n48:7B:2F\t\tMicrosoft Corporation\n48:7B:5E\t\tSmt Telecomm Hk\n48:7B:6B\t\tHuawei Technologies Co.,Ltd\n48:7D:2E\t\tTp-Link Technologies Co.,Ltd.\n48:7E:48\t\tEarda Technologies co Ltd\n48:80:02\t\tCisco Systems, Inc\n48:81:4E\t\tE&M SOLUTION CO,.Ltd\n48:81:D4\t\tRuijie Networks Co.,LTD\n48:82:44\t\tLife Fitness / Div. of Brunswick\n48:82:F2\t\tAppel Elektronik GmbH\n48:83:6F\t\tEM Microelectronic\n48:83:B4\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n48:83:C7\t\tSagemcom Broadband SAS\n48:84:9D\t\tTexas Instruments\n48:86:E8\t\tMicrosoft Corporation\n48:87:2D\t\tShen Zhen Da Xia Long Que Technology Co.,Ltd\n48:87:59\t\tXiaomi Communications Co Ltd\n48:87:64\t\tvivo Mobile Communication Co., Ltd.\n48:87:B8\t\tTCL King Electrical Appliances(Huizhou)Co.,Ltd\n48:88:03\t\tManTechnology Inc.\n48:88:1E\t\tEthoSwitch LLC\n48:88:99\t\tShenzhen SuperElectron Technology Co.,Ltd.\n48:88:CA\t\tMotorola (Wuhan) Mobility Technologies Communication Co., Ltd.\n48:89:E7\t\tIntel Corporate\n48:8A:D2\t\tMercury Communication Technologies Co.,Ltd.\n48:8A:E8\t\tvivo Mobile Communication Co., Ltd.\n48:8B:0A\t\tCisco Systems, Inc\n48:8C:63\t\tHuawei Device Co., Ltd.\n48:8C:78\t\tAlpha Networks Inc.\n48:8D:36\t\tArcadyan Corporation\n48:8E:42\t\tDIGALOG GmbH\n48:8E:B7\t\tZebra Technologies Inc.\n48:8E:EF\t\tHuawei Technologies Co.,Ltd\n48:8F:4C\t\tshenzhen trolink  Technology Co.,Ltd\n48:8F:5A\t\tRouterboard.com\n48:90:2F\t\tLG Electronics (Mobile Communications)\n48:91:53\t\tWeinmann Geräte für Medizin GmbH + Co. KG\n48:91:D5\t\tCisco Systems, Inc\n48:91:F6\t\tShenzhen Reach software technology CO.,LTD\n48:93:DC\t\tUniway Infocom Pvt Ltd\n48:95:07\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n48:96:D9\t\tzte corporation\n48:98:CA\t\tSichuan AI-Link Technology Co., Ltd.\n48:9A:42\t\tTechnomate Ltd\n48:9A:5B\t\tShenzhen iComm Semiconductor CO.,LTD\n48:9B:D5\t\tExtreme Networks Headquarters\n48:9B:E0\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n48:9B:E2\t\tSCI Innovations Ltd\n48:9D:18\t\tFlashbay Limited\n48:9D:24\t\tBlackBerry RTS\n48:9D:D1\t\tSamsung Electronics Co.,Ltd\n48:9E:9D\t\tHui Zhou Gaoshengda Technology Co.,LTD\n48:9E:BD\t\tHP Inc.\n48:9E:CB\t\tHewlett Packard Enterprise\n48:A0:F8\t\tFiberhome Telecommunication Technologies Co.,LTD\n48:A1:70\t\tCisco Systems, Inc\n48:A1:95\t\tApple, Inc.\n48:A2:2D\t\tShenzhen Huaxuchang Telecom Technology Co.,Ltd\n48:A2:B7\t\tKodofon JSC\n48:A2:B8\t\tChengdu Vision-Zenith Tech.Co,.Ltd\n48:A2:E6\t\tResideo\n48:A3:80\t\tGionee Communication Equipment Co.,Ltd.\n48:A3:BD\t\tTexas Instruments\n48:A4:72\t\tIntel Corporate\n48:A4:8C\t\tShanghai Zenchant Electornics Co.,LTD\n48:A4:93\t\tTaiyo Yuden Co.,Ltd\n48:A4:FD\t\tAltoBeam Inc.\n48:A5:16\t\tHuawei Device Co., Ltd.\n48:A5:E7\t\tNintendo Co.,Ltd\n48:A6:B8\t\tSonos, Inc.\n48:A6:D2\t\tGJsun Optical Science and Tech Co.,Ltd.\n48:A7:3C\t\tSichuan tianyi kanghe communications co., LTD\n48:A7:4E\t\tzte corporation\n48:A9:1C\t\tApple, Inc.\n48:A9:64\t\tApexsha Smarttech Private Limited\n48:A9:8A\t\tRouterboard.com\n48:A9:D2\t\tWistron Neweb Corporation\n48:AA:5D\t\tStore Electronic Systems\n48:AD:08\t\tHuawei Technologies Co.,Ltd\n48:AD:9A\t\tIntel Corporate\n48:B0:2D\t\tNVIDIA Corporation\n48:B2:53\t\tMarketaxess Corporation\n48:B2:5D\t\tHuawei Technologies Co.,Ltd\n48:B3:13\t\tIdesco Oy\n48:B4:23\t\tAmazon Technologies Inc.\n48:B4:24\t\teero inc.\n48:B4:C3\t\tHewlett Packard Enterprise\n48:B5:A7\t\tGlory Horse Industries Ltd.\n48:B6:20\t\tROLI Ltd.\n48:B8:A3\t\tApple, Inc.\n48:B8:DE\t\tHomewins Technology Co.,Ltd.\n48:B9:77\t\tPulseOn Oy\n48:B9:C2\t\tTeletics Inc.\n48:BA:4E\t\tHewlett Packard\n48:BC:0E\t\tSichuan AI-Link Technology Co., Ltd.\n48:BC:A6\t\t​ASUNG TECHNO CO.,Ltd\n48:BC:E1\t\tSamsung Electronics Co.,Ltd\n48:BD:0E\t\tQuanta Storage Inc.\n48:BD:3D\t\tNew H3C Technologies Co., Ltd\n48:BD:4A\t\tHuawei Technologies Co.,Ltd\n48:BD:A7\t\tHonor Device Co., Ltd.\n48:BD:CE\t\tVantiva USA LLC\n48:BE:2D\t\tSymanitron\n48:BF:6B\t\tApple, Inc.\n48:BF:74\t\tBaicells Technologies Co.,LTD\n48:C0:30\t\tKogniza Inc.\n48:C0:49\t\tBroad Telecom SA\n48:C0:93\t\tXirrus, Inc.\n48:C1:AC\t\tPlantronics, Inc.\n48:C1:EE\t\tHonor Device Co., Ltd.\n48:C3:5A\t\tLenovo(Beijing)Co., Ltd.\n48:C3:81\t\tTP-Link Systems Inc.\n48:C3:B0\t\tPharos Co.Ltd\n48:C4:61\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n48:C5:8D\t\tLear Corporation GmbH\n48:C6:63\t\tGTO Access Systems LLC\n48:C7:96\t\tSamsung Electronics Co.,Ltd\n48:C8:62\t\tSimo Wireless,Inc.\n48:C8:B6\t\tSysTec GmbH\n48:CA:43\t\tEspressif Inc.\n48:CA:68\t\tApple, Inc.\n48:CA:C6\t\tUnion Man Technology Co.,Ltd\n48:CB:6E\t\tCello Electronics (UK) Ltd\n48:CD:D3\t\tHuawei Technologies Co.,Ltd\n48:CF:A9\t\tHuawei Technologies Co.,Ltd\n48:D0:17\t\tTelecom Infra Project\n48:D0:1C\t\tAltoBeam Inc.\n48:D0:CF\t\tUniversal Electronics, Inc.\n48:D1:8E\t\tMetis Communication Co.,Ltd\n48:D2:24\t\tLiteon Technology Corporation\n48:D2:4F\t\tSagemcom Broadband SAS\n48:D3:43\t\tCommscope\n48:D3:5D\t\tPrivate\n48:D4:75\t\tLampuga GmbH\n48:D5:39\t\tHuawei Technologies Co.,Ltd\n48:D5:4C\t\tJeda Networks\n48:D6:82\t\tzte corporation\n48:D6:D5\t\tGoogle, Inc.\n48:D7:05\t\tApple, Inc.\n48:D7:FF\t\tBLANKOM Antennentechnik GmbH\n48:D8:45\t\tShenzhen Mainuoke Electronics Co., Ltd\n48:D8:55\t\tTelvent\n48:D8:75\t\tChina TransInfo Technology Co., Ltd\n48:D8:90\t\tFn-Link Technology Limited\n48:D8:FE\t\tClarIDy Solutions, Inc.\n48:DA:35\t\tIEEE Registration Authority\n48:DA:35:00:00:00/28\tRbs Llc\n48:DA:35:10:00:00/28\tThink Engineering\n48:DA:35:20:00:00/28\tAnnapurna labs\n48:DA:35:30:00:00/28\tXiamen Magnetic North Co., Ltd\n48:DA:35:40:00:00/28\tSphere Com Services Pvt Ltd\n48:DA:35:50:00:00/28\tBeijing keshengte communication equipment co., ltd\n48:DA:35:60:00:00/28\tShenzhen Sipeed Technology Co., Ltd\n48:DA:35:70:00:00/28\tERAESEEDS Co.,Ltd.\n48:DA:35:80:00:00/28\tShenzhen Qianhong Technology Co.,Ltd.\n48:DA:35:90:00:00/28\tFlextronics International Kft\n48:DA:35:A0:00:00/28\tAuto Meter Products Inc.\n48:DA:35:B0:00:00/28\tVivid-Hosting, LLC.\n48:DA:35:C0:00:00/28\tGuangzhou Xinhong Communication Technology Co.,Ltd\n48:DA:35:D0:00:00/28\tNacon Limited (Hk) Ltd\n48:DA:35:E0:00:00/28\tNeps Technologies Private Limited\n48:DA:96\t\tEddy Smart Home Solutions Inc.\n48:DB:50\t\tHuawei Technologies Co.,Ltd\n48:DC:2D\t\tHuawei Technologies Co.,Ltd\n48:DC:9D\t\tGrandprint(Beijing) Technology Co., LTD.\n48:DC:FB\t\tNokia Corporation\n48:DD:0C\t\teero inc.\n48:DD:9D\t\tItel Mobile Limited\n48:DF:1C\t\tWuhan NEC Fibre Optic Communications industry Co. Ltd\n48:DF:37\t\tHewlett Packard Enterprise\n48:E1:50\t\tIntel Corporate\n48:E1:5C\t\tApple, Inc.\n48:E1:AF\t\tVity\n48:E1:E9\t\tChengdu Meross Technology Co., Ltd.\n48:E2:44\t\tHon Hai Precision Ind. Co.,Ltd.\n48:E2:AD\t\tHumax Networks\n48:E3:C3\t\tJENOPTIK Advanced Systems GmbH\n48:E5:33\t\tSunnovo International Limited\n48:E6:63\t\tIEEE Registration Authority\n48:E6:63:00:00:00/28\tHuaqian Beijing Technology Co., Ltd\n48:E6:63:10:00:00/28\tNanning Nislight Communication Technology Co.,Ltd.,\n48:E6:63:20:00:00/28\tBeijing Jingdong Qianshi Technology Co.,Ltd.\n48:E6:63:30:00:00/28\tMakerfabs\n48:E6:63:40:00:00/28\tSmile Security and Survillence Private Limited\n48:E6:63:50:00:00/28\tHoypower Energy Co.,Ltd\n48:E6:63:60:00:00/28\tShenzhen Huabao New Energy Co.,Ltd\n48:E6:63:70:00:00/28\tEarweiss Technology (Shenzhen) Co,. Ltd\n48:E6:63:80:00:00/28\tShenzhen Peicheng Technology Co., LTD.\n48:E6:63:90:00:00/28\tAceZone Aps\n48:E6:63:A0:00:00/28\tShenzhen Jointelli Technologies Co.,Ltd\n48:E6:63:B0:00:00/28\tNakamura-Tome Precision  Industry Co.,Ltd.\n48:E6:63:C0:00:00/28\tBeijing Cunyin Chengqi Technology Co., Ltd.\n48:E6:63:D0:00:00/28\tNeureality ltd\n48:E6:63:E0:00:00/28\tMatribox Intelligent Technology co.Ltd.\n48:E6:95\t\tInsigma Inc\n48:E6:C0\t\tSIMCom Wireless Solutions Co.,Ltd.\n48:E6:C6\t\tIEEE Registration Authority\n48:E6:C6:00:00:00/28\tShenzhen Oumeihua Technology Co.,Ltd\n48:E6:C6:10:00:00/28\tDeico Muh. A.S.\n48:E6:C6:20:00:00/28\tSatlab\n48:E6:C6:30:00:00/28\tVarjo Technologies Oy\n48:E6:C6:40:00:00/28\tShenzhen ZK Technology CO.,LTD.\n48:E6:C6:50:00:00/28\tAnnapurna labs\n48:E6:C6:60:00:00/28\tMoff Inc.\n48:E6:C6:70:00:00/28\tMacriot\n48:E6:C6:80:00:00/28\tSanwa Electronic Instrument Co.,Ltd\n48:E6:C6:90:00:00/28\tTakiguchi Corporation\n48:E6:C6:A0:00:00/28\tAl Hami Information Technology - L.L.C\n48:E6:C6:B0:00:00/28\tQ-Pac\n48:E6:C6:C0:00:00/28\tOdin Solutions, S.L. - B73845893\n48:E6:C6:D0:00:00/28\tDigital Matter Pty Ltd\n48:E6:C6:E0:00:00/28\tBeupsys\n48:E7:29\t\tEspressif Inc.\n48:E7:DA\t\tAzureWave Technology Inc.\n48:E9:CA\t\tcreoline GmbH\n48:E9:F1\t\tApple, Inc.\n48:EA:62\t\tHP Inc.\n48:EA:63\t\tZhejiang Uniview Technologies Co., Ltd.\n48:EB:30\t\tEterna Technology, Inc.\n48:EB:62\t\tMurata Manufacturing Co., Ltd.\n48:EB:65\t\tHenan KunLun Technologies CO.,Ltd.\n48:EC:5B\t\tNokia Solutions and Networks GmbH & Co. KG\n48:ED:80\t\tdaesung eltec\n48:ED:E6\t\tZyxel Communications Corporation\n48:EE:07\t\tSilver Palm Technologies LLC\n48:EE:0C\t\tD-Link International\n48:EE:86\t\tUTStarcom (China) Co.,Ltd\n48:EE:E2\t\tRoamwifi Technology(Hk) Limited\n48:EF:1C\t\tSamsung Electronics Co.,Ltd\n48:EF:61\t\tHuawei Device Co., Ltd.\n48:F0:27\t\tChengdu newifi Co.,Ltd\n48:F0:7B\t\tAlpsalpine Co,.Ltd\n48:F1:7F\t\tIntel Corporate\n48:F1:EB\t\tNintendo Co.,Ltd\n48:F2:30\t\tUbizcore Co.,LTD\n48:F3:17\t\tPrivate\n48:F3:F3\t\tBaidu Online Network Technology (Beijing) Co., Ltd\n48:F4:7D\t\tTechVision Holding  Internation Limited\n48:F6:EE\t\tEspressif Inc.\n48:F7:BC\t\tHuawei Technologies Co.,Ltd\n48:F7:C0\t\tVantiva USA LLC\n48:F7:F1\t\tNokia\n48:F8:B3\t\tCisco-Linksys, LLC\n48:F8:DB\t\tHuawei Technologies Co.,Ltd\n48:F8:E1\t\tNokia\n48:F8:FF\t\tChengdu Kt Electronic Hi-Tech Co.,Ltd\n48:F9:25\t\tMaestronic\n48:F9:7C\t\tFiberhome Telecommunication Technologies Co.,LTD\n48:FC:07\t\tHuawei Device Co., Ltd.\n48:FC:B6\t\tLava International(H.K) Limited\n48:FC:B8\t\tWoodstream Corporation\n48:FD:8E\t\tHuawei Technologies Co.,Ltd\n48:FD:A3\t\tXiaomi Communications Co Ltd\n48:FE:EA\t\tHoma B.V.\n4A:07:D6\t\tIEEE 802.1 Chair\n4A:15:40\t\tsas de la Halle aux Fours\n4A:19:1B\t\tZigBee Alliance\n4A:59:09\t\tMiwa Lock Co.,Ltd.\n4A:5A:6F\t\tApplied Materials\n4A:5A:A9\t\tGoCodeIT Inc\n4A:67:04\t\tReliable Robotics Corporation\n4A:68:8D\t\tShenzhen TCL New Technology Co., Ltd\n4A:72:06\t\tCAIRE, Inc.\n4A:7F:74\t\tINTEC Inc.\n4A:AD:CE\t\tCodan Argus Ag\n4A:C0:3F\t\tWuhan Hikstorage Technology Co.,Ltd\n4A:CA:3E\t\tZeus\n4A:DA:10\t\tEmotiva Audio Corp\n4A:E0:3F\t\tChengdu Superxon communication Technology Co. Ltd.\n4A:E5:68\t\tleapio\n4A:ED:1D\t\tAstera Labs Inc\n4C:00:82\t\tCisco Systems, Inc\n4C:01:43\t\teero inc.\n4C:01:F7\t\tCisco Systems, Inc\n4C:02:20\t\tXiaomi Communications Co Ltd\n4C:02:2E\t\tCmr Korea Co., Ltd\n4C:02:89\t\tLex Computech Co., Ltd\n4C:03:4F\t\tIntel Corporate\n4C:06:17\t\tTaicang T&W Electronics\n4C:06:8A\t\tBasler Electric Company\n4C:06:B7\t\tProDVX Europe B.V.\n4C:07:C9\t\tCOMPUTER OFFICE Co.,Ltd.\n4C:09:B4\t\tzte corporation\n4C:09:D4\t\tArcadyan Technology Corporation\n4C:09:FA\t\tFrontier Smart Technologies Ltd\n4C:0A:3D\t\tAdnacom Inc.\n4C:0A:4E\t\tExtreme Networks Headquarters\n4C:0B:3A\t\tTCT mobile ltd\n4C:0B:BE\t\tMicrosoft\n4C:0D:EE\t\tJabil Circuit (Shanghai) Ltd.\n4C:0F:3E\t\tIntel Corporate\n4C:0F:6E\t\tHon Hai Precision Ind. Co.,Ltd.\n4C:0F:C7\t\tEarda Technologies co Ltd\n4C:10:D5\t\tTp-Link Technologies Co.,Ltd.\n4C:11:54\t\tMobiwire Mobiles (NingBo) Co., LTD\n4C:11:59\t\tVision Information & Communications\n4C:11:AE\t\tEspressif Inc.\n4C:11:BF\t\tZhejiang Dahua Technology Co., Ltd.\n4C:12:65\t\tCommscope\n4C:12:E8\t\tVietnam Post And Telecommunication Industry Technology Join Stock Company\n4C:13:65\t\tEmplus Technologies\n4C:14:80\t\tNoregon Systems, Inc\n4C:14:A3\t\tTCL Technoly Electronics (Huizhou) Co., Ltd.\n4C:16:94\t\tshenzhen sibituo Technology Co., Ltd\n4C:16:F1\t\tzte corporation\n4C:16:FC\t\tJuniper Networks\n4C:17:44\t\tAmazon Technologies Inc.\n4C:17:EB\t\tSagemcom Broadband SAS\n4C:18:9A\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n4C:19:5D\t\tSagemcom Broadband SAS\n4C:1A:3A\t\tPRIMA Research And Production Enterprise Ltd.\n4C:1A:3D\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n4C:1A:95\t\tNovakon Co., Ltd.\n4C:1B:86\t\tArcadyan Corporation\n4C:1D:96\t\tIntel Corporate\n4C:1F:86\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n4C:1F:CC\t\tHuawei Technologies Co.,Ltd\n4C:20:B8\t\tApple, Inc.\n4C:21:13\t\tNokia Shanghai Bell Co., Ltd.\n4C:21:8C\t\tPanasonic India Private limited\n4C:21:D0\t\tSony Corporation\n4C:22:19\t\tYuanfudao Hk Limted\n4C:22:58\t\tcozybit, Inc.\n4C:22:C9\t\tzte corporation\n4C:22:F3\t\tArcadyan Corporation\n4C:23:1A\t\tExtreme Networks Headquarters\n4C:23:38\t\tCloud Network Technology Singapore Pte. Ltd.\n4C:24:98\t\tTexas Instruments\n4C:24:CE\t\tSichuan AI-Link Technology Co., Ltd.\n4C:25:78\t\tNokia Corporation\n4C:26:E7\t\tWelgate Co., Ltd.\n4C:2B:3B\t\tHuawei Device Co., Ltd.\n4C:2C:80\t\tBeijing Skyway Technologies Co.,Ltd\n4C:2C:83\t\tZhejiang KaNong Network Technology Co.,Ltd.\n4C:2E:5E\t\tSamsung Electronics Co.,Ltd\n4C:2E:B4\t\tApple, Inc.\n4C:2E:FE\t\tShenzhen Comnect Technology Co.,LTD\n4C:2F:7B\t\tAltoBeam Inc.\n4C:2F:9D\t\tICM Controls\n4C:2F:D7\t\tHuawei Device Co., Ltd.\n4C:30:89\t\tHitachi Rail GTS Deutschland GmbH\n4C:31:2D\t\tSichuan AI-Link Technology Co., Ltd.\n4C:32:2D\t\tTeledata Networks\n4C:32:75\t\tApple, Inc.\n4C:32:D9\t\tM Rutty Holdings Pty. Ltd.\n4C:33:29\t\tSweroam\n4C:33:4E\t\tHightech\n4C:34:88\t\tIntel Corporate\n4C:36:4E\t\tPanasonic Connect Co., Ltd.\n4C:37:DE\t\tAltoBeam Inc.\n4C:38:D5\t\tMitac Computing Technology Corporation\n4C:38:D8\t\tCommscope\n4C:39:09\t\tHPL Electric & Power Private Limited\n4C:39:10\t\tNewtek Electronics co., Ltd.\n4C:39:46\t\tSamsung Electronics Co.,Ltd\n4C:3B:6C\t\tGaro Ab\n4C:3B:74\t\tVOGTEC(H.K.) Co., Ltd\n4C:3B:DF\t\tMicrosoft Corporation\n4C:3C:16\t\tSamsung Electronics Co.,Ltd\n4C:3F:A7\t\tuGrid Network Inc.\n4C:3F:D3\t\tTexas Instruments\n4C:40:88\t\tSanshin Electronics Co.,Ltd.\n4C:42:1E\t\tCisco Systems, Inc\n4C:43:41\t\tCalix Inc.\n4C:44:5B\t\tIntel Corporate\n4C:45:76\t\tChina Mobile(Hangzhou) Information Technology Co.,Ltd.\n4C:46:D1\t\tGuangzhou V-Solution Telecommunication Technology Co.,Ltd.\n4C:48:DA\t\tBeijing Autelan Technology Co.,Ltd\n4C:49:29\t\tTCL King Electrical Appliances(Huizhou)Co.,Ltd\n4C:49:4F\t\tzte corporation\n4C:49:68\t\tRuijie Networks Co.,LTD\n4C:49:6C\t\tIntel Corporate\n4C:49:E3\t\tXiaomi Communications Co Ltd\n4C:4B:68\t\tMobile Device, Inc.\n4C:4B:F9\t\tIEEE Registration Authority\n4C:4B:F9:00:00:00/28\tMultitek Elektronik Sanayi ve Ticaret A.S.\n4C:4B:F9:10:00:00/28\tJiangsu acrel Co., Ltd.\n4C:4B:F9:20:00:00/28\tShenzhen HommPro Technology Co.,Ltd\n4C:4B:F9:30:00:00/28\tPower Active Co., Ltd\n4C:4B:F9:40:00:00/28\tShenzhen dingsheng technology co., LTD\n4C:4B:F9:50:00:00/28\tRemedee Labs\n4C:4B:F9:60:00:00/28\tShandong Linkotech Electronic Co., Ltd.\n4C:4B:F9:70:00:00/28\tGlonexs\n4C:4B:F9:80:00:00/28\tZivid AS\n4C:4B:F9:90:00:00/28\tTecnoplus Srl\n4C:4B:F9:A0:00:00/28\tElectrolux Professional AB\n4C:4B:F9:B0:00:00/28\tStored Energy Systems\n4C:4B:F9:C0:00:00/28\tConnected IO\n4C:4B:F9:D0:00:00/28\tShenzhen Haichuan Intelligent Information Technology Co., Ltd.\n4C:4B:F9:E0:00:00/28\tBeijing AutoAi Technology co. LTD\n4C:4C:D8\t\tzte corporation\n4C:4D:66\t\tNanjing Jiahao Technology Co., Ltd.\n4C:4E:03\t\tTCT mobile ltd\n4C:4E:35\t\tCisco Systems, Inc\n4C:4F:EE\t\tOnePlus Technology (Shenzhen) Co., Ltd\n4C:50:77\t\tHuawei Device Co., Ltd.\n4C:50:DD\t\tHui Zhou Gaoshengda Technology Co.,LTD\n4C:50:F1\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n4C:52:62\t\tFujitsu Technology Solutions GmbH\n4C:52:EC\t\tSOLARWATT GmbH\n4C:53:69\t\tYanFeng Visteon(ChongQing) Automotive Electronic Co.,Ltd\n4C:53:FD\t\tAmazon Technologies Inc.\n4C:54:27\t\tLinepro Sp. z o.o.\n4C:54:99\t\tHuawei Technologies Co.,Ltd\n4C:55:85\t\tHamilton Systems\n4C:55:B8\t\tTurkcell Teknoloji\n4C:55:CC\t\tZentri Pty Ltd\n4C:56:9D\t\tApple, Inc.\n4C:56:DF\t\tTargus US LLC\n4C:57:39\t\tSamsung Electronics Co.,Ltd\n4C:57:CA\t\tApple, Inc.\n4C:5B:B3\t\tSilicon Laboratories\n4C:5C:DF\t\tItel Mobile Limited\n4C:5D:3C\t\tCisco Systems, Inc\n4C:5D:6A\t\tApple, Inc.\n4C:5D:CD\t\tOy Finnish Electric Vehicle Technologies Ltd\n4C:5E:0C\t\tRouterboard.com\n4C:5E:D3\t\tUnisyue Technologies Co; LTD.\n4C:5F:70\t\tIntel Corporate\n4C:5F:D2\t\tAlcatel-Lucent\n4C:60:AD\t\tAmazon Technologies Inc.\n4C:60:BA\t\tAltoBeam Inc.\n4C:60:D5\t\tairPointe of New Hampshire\n4C:60:DE\t\tNetgear\n4C:61:7E\t\tHuawei Device Co., Ltd.\n4C:62:55\t\tSanmina-Sci System De Mexico S.A. De C.V.\n4C:62:7B\t\tSmartCow AI Technologies Taiwan Ltd.\n4C:62:CD\t\tNokia\n4C:62:DF\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n4C:63:71\t\tXiaomi Communications Co Ltd\n4C:63:AD\t\tHuawei Device Co., Ltd.\n4C:63:EB\t\tApplication Solutions (Electronics and Vision) Ltd\n4C:64:60\t\tItel Mobile Limited\n4C:64:D9\t\tGuangdong Leawin Group Co., Ltd\n4C:65:A8\t\tIEEE Registration Authority\n4C:65:A8:00:00:00/28\tWELT Corporation\n4C:65:A8:10:00:00/28\tBeijing Bluehalo Internet Inc.\n4C:65:A8:20:00:00/28\tOrica Europe Pty Ltd & Co KG\n4C:65:A8:30:00:00/28\tRoost\n4C:65:A8:40:00:00/28\tPlus One Japan Limited\n4C:65:A8:50:00:00/28\tTEL-Electronics Ltd\n4C:65:A8:60:00:00/28\tNuviz Oy\n4C:65:A8:70:00:00/28\tWuhan MoreQuick Network Technology Co., Ltd.\n4C:65:A8:80:00:00/28\tInstant Byte, S.L.\n4C:65:A8:90:00:00/28\tShenzhen Lisaier Tronics Co.,Ltd\n4C:65:A8:A0:00:00/28\tSuzhou Embedded Electronic Technology Co., Ltd.\n4C:65:A8:B0:00:00/28\tZMIN Technologies\n4C:65:A8:C0:00:00/28\tFuse\n4C:65:A8:D0:00:00/28\tQingping Technology (Beijing) Co., Ltd.\n4C:65:A8:E0:00:00/28\tHigh Infinity Germany\n4C:66:41\t\tSamsung Electro-Mechanics(Thailand)\n4C:66:A6\t\tSamsung Electronics Co.,Ltd\n4C:6A:F6\t\tHMD Global Oy\n4C:6B:B8\t\tHui Zhou Gaoshengda Technology Co.,LTD\n4C:6B:E8\t\tApple, Inc.\n4C:6C:13\t\tIoT Company Solucoes Tecnologicas Ltda\n4C:6D:58\t\tJuniper Networks\n4C:6E:6E\t\tComnect Technology CO.,LTD\n4C:6F:9C\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n4C:70:CC\t\tBlyott NV\n4C:71:0C\t\tCisco Systems, Inc\n4C:71:0D\t\tCisco Systems, Inc\n4C:71:67\t\tPoLabs d.o.o.\n4C:72:74\t\tShenzhenshi Xinzhongxin Technology Co.Ltd\n4C:72:B9\t\tPegatron Corporation\n4C:73:4F\t\tJuniper Networks\n4C:73:67\t\tGenius Bytes Software Solutions GmbH\n4C:73:A5\t\tKove\n4C:74:03\t\tBq\n4C:74:87\t\tLeader Phone Communication Technology Co., Ltd.\n4C:74:A7\t\tIEEE Registration Authority\n4C:74:A7:00:00:00/28\tShenzhen Timekettle Technologies Co.,Ltd\n4C:74:A7:10:00:00/28\tShenzhen Hollyland Technology Co.,Ltd\n4C:74:A7:20:00:00/28\tCyanview\n4C:74:A7:30:00:00/28\tGoCodeIT Inc\n4C:74:A7:40:00:00/28\tWuxi Micro Innovation Integrated Circuit Design Co., Ltd\n4C:74:A7:50:00:00/28\tAgility Robotics, Inc.\n4C:74:A7:60:00:00/28\tABB LV Installation Materials Co., Ltd. Beijing\n4C:74:A7:70:00:00/28\tCoreip Technology Private Limited\n4C:74:A7:80:00:00/28\tAnnapurna labs\n4C:74:A7:90:00:00/28\tSuzhou XiongLi Technology Inc.\n4C:74:A7:A0:00:00/28\tRaonark\n4C:74:A7:B0:00:00/28\ttraplinked Gmbh\n4C:74:A7:C0:00:00/28\tN3com\n4C:74:A7:D0:00:00/28\tddcpersia\n4C:74:A7:E0:00:00/28\tKyocera Corporation\n4C:74:BF\t\tApple, Inc.\n4C:75:25\t\tEspressif Inc.\n4C:76:25\t\tDell Inc.\n4C:77:13\t\tRenesas Electronics (Penang) Sdn. Bhd.\n4C:77:4F\t\tEmbedded Wireless Labs\n4C:77:66\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\n4C:77:6D\t\tCisco Systems, Inc\n4C:77:CB\t\tIntel Corporate\n4C:78:72\t\tCav. Uff. Giacomo Cimberio S.p.A.\n4C:78:97\t\tArrowhead Alarm Products Ltd\n4C:79:6E\t\tIntel Corporate\n4C:79:75\t\tApple, Inc.\n4C:79:BA\t\tIntel Corporate\n4C:7A:48\t\tNippon Seiki (Europe) B.V.\n4C:7B:35\t\tUnionman Technology Co.,Ltd\n4C:7C:5F\t\tApple, Inc.\n4C:7C:D9\t\tApple, Inc.\n4C:7F:62\t\tNokia Corporation\n4C:80:4F\t\tArmstrong Monitoring Corp\n4C:80:93\t\tIntel Corporate\n4C:80:BA\t\tWuhan Tianyu Information Industry Co., Ltd.\n4C:81:20\t\tTaicang T&W Electronics\n4C:81:25\t\tZOWEE TECHNOLOGY(HEYUAN)Co.,Ltd\n4C:82:37\t\tTelink Micro LLC\n4C:82:A9\t\tCloud Network Technology Singapore Pte. Ltd.\n4C:82:CF\t\tDish Technologies Corp\n4C:83:DE\t\tCisco SPVTG\n4C:85:8A\t\tBuffalo.Inc\n4C:87:5D\t\tBose Corporation\n4C:88:9E\t\tHuawei Device Co., Ltd.\n4C:8B:30\t\tActiontec Electronics, Inc\n4C:8B:55\t\tGrupo Digicon\n4C:8B:EF\t\tHuawei Technologies Co.,Ltd\n4C:8D:53\t\tHuawei Technologies Co.,Ltd\n4C:8D:79\t\tApple, Inc.\n4C:8E:CC\t\tSilkan Sa\n4C:8F:A5\t\tJastec\n4C:90:DB\t\tJL Audio\n4C:91:0C\t\tLanix Internacional, S.A. de C.V.\n4C:91:57\t\tFujian LANDI Commercial Equipment Co.,Ltd\n4C:91:7A\t\tIEEE Registration Authority\n4C:91:7A:00:00:00/28\tShenzhen Dangs Science & Technology CO.,LTD\n4C:91:7A:10:00:00/28\tInster Tecnología y Comunicaciones SAU\n4C:91:7A:20:00:00/28\tChongqing Unisinsight Technology Co.,Ltd.\n4C:91:7A:30:00:00/28\tSmart Access\n4C:91:7A:40:00:00/28\tLumiGrow Inc.\n4C:91:7A:50:00:00/28\tmtekvision\n4C:91:7A:60:00:00/28\tOpeneye\n4C:91:7A:70:00:00/28\tMeccalte Spa\n4C:91:7A:80:00:00/28\tCamsat Przemysław Gralak\n4C:91:7A:90:00:00/28\tHangzhou Hangtu Technology Co.,Ltd.\n4C:91:7A:A0:00:00/28\tErlab DFS SAS\n4C:91:7A:B0:00:00/28\tAvertX\n4C:91:7A:C0:00:00/28\tAlibaba (Beijing) Software Service Inc.\n4C:91:7A:D0:00:00/28\tShenzhen bankledger Technology Co, Ltd\n4C:91:7A:E0:00:00/28\tAnnapurna labs\n4C:92:D2\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n4C:93:A6\t\tIEEE Registration Authority\n4C:93:A6:00:00:00/28\tVestaboard, Inc.\n4C:93:A6:10:00:00/28\tAtrie Technology Fzc\n4C:93:A6:20:00:00/28\tDiehl Controls Nanjing Co., Ltd.\n4C:93:A6:30:00:00/28\tCommsignia, Ltd.\n4C:93:A6:40:00:00/28\t4TheWall - 4D Sistem A.S\n4C:93:A6:50:00:00/28\tFastenal IP Company\n4C:93:A6:60:00:00/28\tShandong Senter Electronic Co., Ltd\n4C:93:A6:70:00:00/28\t5Voxel Co., Ltd.\n4C:93:A6:80:00:00/28\tSercomm Corporation.\n4C:93:A6:90:00:00/28\tAdvantics\n4C:93:A6:A0:00:00/28\tHanwang Technology Co.,Ltd\n4C:93:A6:B0:00:00/28\tFelten Electronics\n4C:93:A6:C0:00:00/28\tWuhan Maiwe communication Co.,Ltd\n4C:93:A6:D0:00:00/28\tCantronic Systems (Canada) Inc\n4C:93:A6:E0:00:00/28\tCelltron\n4C:96:14\t\tJuniper Networks\n4C:96:2D\t\tFresh AB\n4C:96:8A\t\tWacom Co.,Ltd.\n4C:97:A1\t\tSilicon Laboratories\n4C:97:CC\t\tApple, Inc.\n4C:98:EF\t\tZeo\n4C:99:92\t\tvivo Mobile Communication Co., Ltd.\n4C:99:E8\t\tZhejiang Dahua Technologyco.,Ltd\n4C:9B:63\t\tLG Innotek\n4C:9D:22\t\tACES Co.,Ltd\n4C:9E:6C\t\tBroadex Technologies Co.Ltd\n4C:9E:80\t\tKYOKKO ELECTRIC Co., Ltd.\n4C:9E:E4\t\tHanyang Navicom Co.,Ltd.\n4C:9E:FF\t\tZyxel Communications Corporation\n4C:9F:F1\t\tApple, Inc.\n4C:A0:03\t\tVitec\n4C:A0:D4\t\tTelink Semiconductor (Shanghai) Co., Ltd.\n4C:A1:61\t\tRain Bird Corporation\n4C:A3:8F\t\tshenzhen trolink  Technology Co.,Ltd\n4C:A3:A7\t\tTecno Mobile Limited\n4C:A5:15\t\tBaikal Electronics JSC\n4C:A5:6D\t\tSamsung Electronics Co.,Ltd\n4C:A6:4D\t\tCisco Systems, Inc\n4C:A7:4B\t\tAlcatel Lucent\n4C:A9:19\t\tTuya Smart Inc.\n4C:A9:28\t\tInsensi\n4C:A9:54\t\tIntel Corporate\n4C:AA:16\t\tAzureWave Technologies (Shanghai) Inc.\n4C:AB:33\t\tKST technology\n4C:AB:4F\t\tApple, Inc.\n4C:AB:F3\t\tUniversal Electronics, Inc.\n4C:AB:F8\t\tAskey Computer Corp\n4C:AB:FC\t\tzte corporation\n4C:AC:0A\t\tzte corporation\n4C:AD:A8\t\tPanoptics Corp.\n4C:AD:DF\t\tCông ty Cổ phần Thiết bị Công nghiệp GEIC\n4C:AE:13\t\tHuawei Technologies Co.,Ltd\n4C:AE:1C\t\tSaiNXT Technologies LLP\n4C:AE:31\t\tShengHai Electronics (Shenzhen) Ltd\n4C:AE:A3\t\tHewlett Packard Enterprise\n4C:AE:EC\t\tGuangzhou limee technology co.,LTD\n4C:B0:08\t\tShenzhen Gwelltimes Technology Co.,Ltd\n4C:B0:4A\t\tIntel Corporate\n4C:B0:87\t\tHuawei Technologies Co.,Ltd\n4C:B0:E8\t\tBeijing RongZhi xinghua technology co., LTD\n4C:B1:6C\t\tHuawei Technologies Co.,Ltd\n4C:B1:99\t\tApple, Inc.\n4C:B1:CD\t\tRuckus Wireless\n4C:B2:1C\t\tMaxphotonics Co.,Ltd\n4C:B4:4A\t\tNANOWAVE Technologies Inc.\n4C:B4:EA\t\tHrd (S) Pte., Ltd.\n4C:B7:6D\t\tNovi Security\n4C:B7:E0\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\n4C:B8:1C\t\tSAM Electronics GmbH\n4C:B8:2C\t\tCambridge Mobile Telematics, Inc.\n4C:B8:B5\t\tShenzhen YOUHUA Technology Co., Ltd\n4C:B9:10\t\tApple, Inc.\n4C:B9:11\t\tRaisecom Technology CO., LTD\n4C:B9:9B\t\tWeifang Goertek Electronics Co.,Ltd\n4C:B9:C8\t\tConet Co., Ltd.\n4C:B9:EA\t\tiRobot Corporation\n4C:BA:7D\t\tGemtek Technology Co., Ltd.\n4C:BA:A3\t\tBison Electronics Inc.\n4C:BA:D7\t\tLG Innotek\n4C:BB:47\t\tNVIDIA Corporation\n4C:BB:58\t\tChicony Electronics Co., Ltd.\n4C:BB:6F\t\tInfinix mobility limited\n4C:BC:42\t\tShenzhen Hangsheng Electronics Co.,Ltd.\n4C:BC:48\t\tCisco Systems, Inc\n4C:BC:72\t\tPrimex Wireless\n4C:BC:98\t\tIEEE Registration Authority\n4C:BC:98:00:00:00/28\tCharge-Amps AB\n4C:BC:98:10:00:00/28\tJsc Nic\n4C:BC:98:20:00:00/28\tQuake Global Inc\n4C:BC:98:30:00:00/28\tMachine Max\n4C:BC:98:40:00:00/28\tNemon Co., Ltd.\n4C:BC:98:50:00:00/28\tGronic Systems GmbH\n4C:BC:98:60:00:00/28\tHumanplus Intelligent Robotics Technology Co.,Ltd.\n4C:BC:98:70:00:00/28\tVoegtlin Instruments GmbH\n4C:BC:98:80:00:00/28\tShenzhen Shanling Digital Technology Development Co.,Ltd.\n4C:BC:98:90:00:00/28\tAirtex Manufacturing Partnership\n4C:BC:98:A0:00:00/28\tShenzhen Cogitation Technology Co.,Ltd.\n4C:BC:98:B0:00:00/28\tDongguan SmartAction Technology Co.,Ltd\n4C:BC:98:C0:00:00/28\tHeliotis AG\n4C:BC:98:D0:00:00/28\tElink Technology (Shenzhen) Co., Limited\n4C:BC:98:E0:00:00/28\tWonder Workshop\n4C:BC:A5\t\tSamsung Electronics Co.,Ltd\n4C:BC:B4\t\tABB SpA - DIN Rail\n4C:BC:E9\t\tLG Innotek\n4C:BD:8F\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n4C:C0:0A\t\tvivo Mobile Communication Co., Ltd.\n4C:C0:96\t\tShenzhen SuperElectron Technology Co.,Ltd.\n4C:C2:06\t\tSomfy\n4C:C3:82\t\tEspressif Inc.\n4C:C4:49\t\tIcotera A/S\n4C:C4:52\t\tShang Hai Tyd. Electon Technology Ltd.\n4C:C5:3E\t\tZyxel Communications Corporation\n4C:C6:02\t\tRadios, Inc.\n4C:C6:4C\t\tBeijing Xiaomi Mobile Software Co., Ltd\n4C:C6:81\t\tShenzhen Aisat Electronic Co., Ltd.\n4C:C7:D6\t\tFlextronics Manufacturing(Zhuhai)Co.,Ltd.\n4C:C8:44\t\tMaipu Communication Technology Co.,Ltd.\n4C:C8:A1\t\tCisco Meraki\n4C:C9:4F\t\tNokia\n4C:C9:5E\t\tSamsung Electronics Co.,Ltd\n4C:CA:53\t\tSkyera, Inc.\n4C:CA:95\t\tHuawei Device Co., Ltd.\n4C:CB:F5\t\tzte corporation\n4C:CC:34\t\tMotorola Solutions Inc.\n4C:CC:6A\t\tMicro-Star INTL CO., LTD.\n4C:CD:B6\t\tApple, Inc.\n4C:CE:2D\t\tDanlaw Inc\n4C:CF:7C\t\tHP Inc.\n4C:D0:8A\t\tHUMAX Co., Ltd.\n4C:D0:CB\t\tHuawei Technologies Co.,Ltd\n4C:D0:DD\t\tHuawei Technologies Co.,Ltd\n4C:D0:F9\t\tCisco Systems, Inc\n4C:D1:A1\t\tHuawei Technologies Co.,Ltd\n4C:D2:FB\t\tUnionman Technology Co.,Ltd\n4C:D3:AF\t\tHMD Global Oy\n4C:D5:46\t\tHewlett Packard Enterprise\n4C:D5:77\t\tChongqing Fugui Electronics Co.,Ltd.\n4C:D5:87\t\tHewlett Packard Enterprise\n4C:D6:29\t\tHuawei Technologies Co.,Ltd\n4C:D6:37\t\tQsono Electronics Co., Ltd\n4C:D7:17\t\tDell Inc.\n4C:D7:B6\t\tHelmer Scientific\n4C:D7:C8\t\tGuangzhou V-Solution Telecommunication Technology Co.,Ltd.\n4C:D9:8F\t\tDell Inc.\n4C:D9:C4\t\tMagneti Marelli Automotive Electronics (Guangzhou) Co. Ltd\n4C:DA:38\t\tTexas Instruments\n4C:DC:0D\t\tCoral Telecom Limited\n4C:DD:31\t\tSamsung Electronics Co.,Ltd\n4C:DD:7D\t\tLHP Telematics LLC\n4C:DE:48\t\tHuawei Device Co., Ltd.\n4C:DF:3D\t\tTeam Engineers Advance Technologies India Pvt Ltd\n4C:E0:DB\t\tXiaomi Communications Co Ltd\n4C:E1:36\t\tPrivate\n4C:E1:73\t\tIEEE Registration Authority\n4C:E1:73:00:00:00/28\tBeijing Sutongwang E-Business Co., Ltd\n4C:E1:73:10:00:00/28\tNexoforge Inc.\n4C:E1:73:20:00:00/28\tLenovo Data Center Group\n4C:E1:73:30:00:00/28\toutpaceIO\n4C:E1:73:40:00:00/28\tHuizhou Dehong Technology Co., Ltd.\n4C:E1:73:50:00:00/28\tNewVastek\n4C:E1:73:60:00:00/28\tDaikoku Denki Co.,Ltd.\n4C:E1:73:70:00:00/28\tErsúles Limited\n4C:E1:73:80:00:00/28\tNanjing Tongke Technology Development Co., LTD\n4C:E1:73:90:00:00/28\tShenzhen Evolution Dynamics Co., Ltd.\n4C:E1:73:A0:00:00/28\tjvi\n4C:E1:73:B0:00:00/28\tShanghai Ehong Technology Co.,Ltd\n4C:E1:73:C0:00:00/28\tRemonde Network\n4C:E1:73:D0:00:00/28\tKtc(K-Tel)\n4C:E1:73:E0:00:00/28\tPlus One Japan Limited\n4C:E1:75\t\tCisco Systems, Inc\n4C:E1:76\t\tCisco Systems, Inc\n4C:E1:9E\t\tTecno Mobile Limited\n4C:E1:BB\t\tZhuhai HiFocus Technology Co., Ltd.\n4C:E2:F1\t\tUdino srl\n4C:E5:AE\t\tTianjin Beebox Intelligent Technology Co.,Ltd.\n4C:E6:76\t\tBuffalo.Inc\n4C:E6:C0\t\tApple, Inc.\n4C:E7:05\t\tSiemens Industrial Automation Products Ltd., Chengdu\n4C:E9:33\t\tRailComm, LLC\n4C:E9:E4\t\tNew H3C Technologies Co., Ltd\n4C:EA:41\t\tIEEE Registration Authority\n4C:EA:41:00:00:00/28\tAirflying\n4C:EA:41:10:00:00/28\tHawkEye Technology Co.,Ltd\n4C:EA:41:20:00:00/28\tSHENZHEN ATC Technology Co., Ltd\n4C:EA:41:30:00:00/28\tYenshow Technology Co.,Ltd\n4C:EA:41:40:00:00/28\tEltroplan Engineering GmbH\n4C:EA:41:50:00:00/28\tZichan J Technology Co.,Ltd\n4C:EA:41:60:00:00/28\tGopod Group Limited\n4C:EA:41:70:00:00/28\tAtos spa\n4C:EA:41:80:00:00/28\tWUXI LATCOS TECHNOLOGY AUTOMATION Co.Ltd.\n4C:EA:41:90:00:00/28\tAnnapurna labs\n4C:EA:41:A0:00:00/28\tVortex Infotech Private Limited\n4C:EA:41:B0:00:00/28\tHangzhou Hortwork Technology Co.,Ltd.\n4C:EA:41:C0:00:00/28\thogotech\n4C:EA:41:D0:00:00/28\tJiangsu TSD Electronics Technology Co., Ltd\n4C:EA:41:E0:00:00/28\tAztech Group DOOEL\n4C:EA:AE\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n4C:EB:42\t\tIntel Corporate\n4C:EB:76\t\tMurrelektronik GmbH\n4C:EB:BD\t\tChongqing Fugui Electronics Co.,Ltd.\n4C:EB:D6\t\tEspressif Inc.\n4C:EC:0F\t\tCisco Systems, Inc\n4C:EC:EF\t\tSoraa, Inc.\n4C:ED:DE\t\tAskey Computer Corp\n4C:ED:FB\t\tASUSTek COMPUTER INC.\n4C:EE:B0\t\tSHC Netzwerktechnik GmbH\n4C:EF:56\t\tShenzhen Sundray Technologies company Limited\n4C:EF:C0\t\tAmazon Technologies Inc.\n4C:F0:2E\t\tVifa Denmark A/S\n4C:F1:9E\t\tGroupe Atlantic\n4C:F2:02\t\tXiaomi Communications Co Ltd\n4C:F2:BF\t\tCambridge Industries(Group) Co.,Ltd.\n4C:F4:5B\t\tBlue Clover Devices\n4C:F4:75\t\tHuawei Device Co., Ltd.\n4C:F5:5B\t\tHuawei Technologies Co.,Ltd\n4C:F5:A0\t\tScalable Network Technologies Inc\n4C:F5:DC\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n4C:F7:37\t\tSamJi Electronics Co., Ltd\n4C:F9:5D\t\tHuawei Technologies Co.,Ltd\n4C:FA:9A\t\tShenzhen Quanxing Technology Co., Ltd\n4C:FA:C9\t\tBWS IoT\n4C:FA:CA\t\tCambridge Industries(Group) Co.,Ltd.\n4C:FB:45\t\tHuawei Technologies Co.,Ltd\n4C:FB:F4\t\tOptimal Audio Ltd\n4C:FB:FE\t\tSercomm Japan Corporation\n4C:FC:22\t\tShanghai Hi-Tech Control System Co.,Ltd.\n4C:FC:AA\t\tTesla,Inc.\n4C:FE:2E\t\tDongGuan Siyoto Electronics Co., Ltd\n4C:FF:12\t\tFuze Entertainment Co., ltd\n50:00:84\t\tSiemens Canada\n50:00:8C\t\tHong Kong Telecommunications (HKT) Limited\n50:00:E0\t\tCisco Systems, Inc\n50:00:E6\t\tMellanox Technologies, Inc.\n50:01:6B\t\tHuawei Technologies Co.,Ltd\n50:01:BB\t\tSamsung Electronics Co.,Ltd\n50:01:D9\t\tHuawei Technologies Co.,Ltd\n50:02:38\t\tNokia Shanghai Bell Co., Ltd.\n50:02:91\t\tEspressif Inc.\n50:03:CF\t\tCanon Inc.\n50:04:01\t\tTelHi Corporation\n50:04:B8\t\tHuawei Technologies Co.,Ltd\n50:05:3D\t\tCyWee Group Ltd\n50:05:6E\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n50:06:04\t\tCisco Systems, Inc\n50:06:AB\t\tCisco Systems, Inc\n50:06:F5\t\tRoku, Inc\n50:07:C3\t\tAmazon Technologies Inc.\n50:09:59\t\tVantiva USA LLC\n50:09:E5\t\tDrimsys,Inc\n50:0A:52\t\tHuiwan Technologies Co. Ltd\n50:0A:9C\t\tExtreme Networks Headquarters\n50:0B:26\t\tHuawei Technologies Co.,Ltd\n50:0B:32\t\tFoxda Technology Industrial(ShenZhen)Co.,LTD\n50:0B:88\t\tMoxa.Inc\n50:0B:91\t\tIEEE Registration Authority\n50:0B:91:00:00:00/28\tIgor, Inc.\n50:0B:91:10:00:00/28\tSPD Development Company Ltd\n50:0B:91:20:00:00/28\tAnnapurna labs\n50:0B:91:30:00:00/28\tEwin Technology Limited\n50:0B:91:40:00:00/28\tSinope technologies Inc\n50:0B:91:50:00:00/28\tjiangsu zhongling high-tech CO.,LTD.\n50:0B:91:60:00:00/28\tSecurity Alarms & Co. S.A.\n50:0B:91:70:00:00/28\tShenzhen Xinfa Electronic Co.,ltd\n50:0B:91:80:00:00/28\tPanasonic Enterprise Solutions Company\n50:0B:91:90:00:00/28\tMachfu, Inc.\n50:0B:91:A0:00:00/28\tNew Audio LLC\n50:0B:91:B0:00:00/28\tthumbzup UK Limited\n50:0B:91:C0:00:00/28\tDiamond Traffic Products, Inc\n50:0B:91:D0:00:00/28\tShenzhen Lucky Sonics Co .,Ltd\n50:0B:91:E0:00:00/28\tShenzhen zhong ju  Fiber optical Co.Ltd\n50:0E:6D\t\tTrafficCast International\n50:0F:59\t\tSTMicrolectronics International NV\n50:0F:80\t\tCisco Systems, Inc\n50:0F:F5\t\tTenda Technology Co.,Ltd.Dongguan branch\n50:11:EB\t\tSilverNet Ltd\n50:13:1D\t\tMotorola Mobility LLC, a Lenovo Company\n50:13:65\t\tVola Networks Inc.\n50:13:95\t\tSichuan AI-Link Technology Co., Ltd.\n50:13:9D\t\tSierra Wireless, ULC\n50:14:08\t\tAiNET\n50:14:79\t\tiRobot Corporation\n50:14:B5\t\tRichfit Information Technology Co., Ltd\n50:14:C1\t\tHuawei Technologies Co.,Ltd\n50:16:F4\t\tMotorola Mobility LLC, a Lenovo Company\n50:17:FF\t\tCisco Systems, Inc\n50:18:4C\t\tPlatina Systems Inc.\n50:1A:A5\t\tGN Netcom A/S\n50:1A:C5\t\tMicrosoft\n50:1B:32\t\tTaicang T&W Electronics\n50:1B:6A\t\tSunitec Technology Co.,Limited\n50:1C:B0\t\tCisco Systems, Inc\n50:1C:BF\t\tCisco Systems, Inc\n50:1D:93\t\tHuawei Technologies Co.,Ltd\n50:1E:2D\t\tStreamUnlimited Engineering GmbH\n50:1F:C6\t\tApple, Inc.\n50:20:65\t\tQuectel Wireless Solutions Co.,Ltd.\n50:20:6B\t\tCopeland - Transportation Solutions ApS\n50:21:EC\t\tHuawei Device Co., Ltd.\n50:22:67\t\tPixeLINK\n50:23:6D\t\tNintendo Co.,Ltd\n50:23:A2\t\tApple, Inc.\n50:25:2B\t\tNethra Imaging Incorporated\n50:26:90\t\tFujitsu Limited\n50:26:D2\t\tAVIRE Trading Limited\n50:26:EF\t\tMurata Manufacturing Co., Ltd.\n50:27:A9\t\teero inc.\n50:27:C7\t\tTECHNART Co.,Ltd\n50:28:4A\t\tIntel Corporate\n50:28:73\t\tHuawei Device Co., Ltd.\n50:29:4D\t\tNanjing Iot Sensor Technology Co,Ltd\n50:29:7B\t\tChina Mobile Group Device Co.,Ltd.\n50:29:F5\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n50:2A:7E\t\tSmart electronic GmbH\n50:2A:8B\t\tTelekom Research and Development Sdn Bhd\n50:2B:73\t\tTenda Technology Co.,Ltd.Dongguan branch\n50:2B:98\t\tEs-tech International\n50:2C:C6\t\tGree Electric Appliances, Inc. Of Zhuhai\n50:2D:1D\t\tNokia Corporation\n50:2D:A2\t\tIntel Corporate\n50:2D:BB\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n50:2D:F4\t\tPhytec Messtechnik GmbH\n50:2D:FB\t\tIGShare Co., Ltd.\n50:2E:5C\t\tHTC Corporation\n50:2E:66\t\tCloud Network Technology Singapore Pte. Ltd.\n50:2E:91\t\tAzureWave Technology Inc.\n50:2E:CE\t\tAsahi Electronics Co.,Ltd\n50:2F:54\t\tCig Shanghai Co Ltd\n50:2F:9B\t\tIntel Corporate\n50:2F:A8\t\tCisco Systems, Inc\n50:2F:BB\t\tMotorola Mobility LLC, a Lenovo Company\n50:30:F4\t\tExascend, Inc.\n50:31:AD\t\tABB Global Industries and Services Private Limited\n50:32:37\t\tApple, Inc.\n50:32:5F\t\tSilicon Laboratories\n50:32:75\t\tSamsung Electronics Co.,Ltd\n50:33:8B\t\tTexas Instruments\n50:33:F0\t\tYichen (Shenzhen) Technology Co.Ltd\n50:38:2F\t\tASE Group Chung-Li\n50:38:AB\t\tProve\n50:39:2F\t\tIngram Micro Services\n50:39:55\t\tCisco SPVTG\n50:3A:0F\t\tALL Winner (Hong Kong) Limited\n50:3A:7D\t\tAlphaTech PLC Int’l Co., Ltd.\n50:3A:A0\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\n50:3C:C4\t\tLenovo Mobile Communication Technology Ltd.\n50:3C:CA\t\tTecno Mobile Limited\n50:3C:EA\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n50:3D:7F\t\tNokia Shanghai Bell Co., Ltd.\n50:3D:A1\t\tSamsung Electronics Co.,Ltd\n50:3D:C6\t\tXiaomi Communications Co Ltd\n50:3D:D1\t\tTP-Link Systems Inc.\n50:3D:E5\t\tCisco Systems, Inc\n50:3D:EB\t\tZhejiang Tmall Technology Co., Ltd.\n50:3E:7C\t\tLeiShen Intelligent  System Co.Ltd\n50:3E:AA\t\tTp-Link Technologies Co.,Ltd.\n50:3F:50\t\tHuawei Device Co., Ltd.\n50:3F:56\t\tSyncmold Enterprise Corp\n50:3F:98\t\tCmitech\n50:40:61\t\tNokia\n50:40:74\t\tAlarm.com\n50:41:1C\t\tAMPAK Technology,Inc.\n50:41:72\t\tHuawei Technologies Co.,Ltd\n50:41:B9\t\tI-O Data Device,Inc.\n50:42:89\t\tzte corporation\n50:43:48\t\tThingsMatrix Inc.\n50:43:B9\t\tOktoInform RUS\n50:45:94\t\tRadisys\n50:45:F7\t\tLiuhe Intelligence Technology Ltd.\n50:46:4A\t\tHuawei Technologies Co.,Ltd\n50:46:5D\t\tASUSTek COMPUTER INC.\n50:46:AE\t\tMercury Corporation\n50:48:2C\t\tIEEE Registration Authority\n50:48:2C:00:00:00/28\tLandatel Comunicaciones SL\n50:48:2C:10:00:00/28\tAnnapurna labs\n50:48:2C:20:00:00/28\tBBPOS Limited\n50:48:2C:30:00:00/28\tImmunity Networks and Technologies Pvt Ltd\n50:48:2C:40:00:00/28\tHY-LINE Technology GmbH\n50:48:2C:50:00:00/28\tBluefin International Inc\n50:48:2C:60:00:00/28\tWIKA Mobile Control GmbH & Co.KG\n50:48:2C:70:00:00/28\tOliver IQ, Inc.\n50:48:2C:80:00:00/28\tDongguan Amdolla Electric & Light Material Manufacture Co., Ltd\n50:48:2C:90:00:00/28\tSoter Technologies\n50:48:2C:A0:00:00/28\tJung Ho\n50:48:2C:B0:00:00/28\tSL Process\n50:48:2C:C0:00:00/28\tTelecam Technology Co.,Ltd\n50:48:2C:D0:00:00/28\tKido Sports Co., Ltd.\n50:48:2C:E0:00:00/28\tHarbin Nosean Tese And Control Technology Co.,Ltd\n50:48:77\t\tHonor Device Co., Ltd.\n50:48:EB\t\tBeijing Haihejinsheng Network Technology Co. Ltd.\n50:49:21\t\tCisco Systems, Inc\n50:49:B0\t\tSamsung Electronics Co.,Ltd\n50:4A:5E\t\tMasimo Corporation\n50:4A:6E\t\tNetgear\n50:4B:5B\t\tCONTROLtronic GmbH\n50:4B:9E\t\tHuawei Device Co., Ltd.\n50:4C:7E\t\tThe 41St Institute Of Cetc\n50:4E:DC\t\tPing Communication\n50:4F:3B\t\tBeijing Xiaomi Mobile Software Co., Ltd\n50:4F:94\t\tLoxone Electronics GmbH\n50:50:2A\t\tEgardia\n50:50:65\t\tTAKT Corporation\n50:50:A4\t\tSamsung Electronics Co.,Ltd\n50:50:CE\t\tHangzhou Dianyixia Communication Technology Co. Ltd.\n50:51:4F\t\tSapphire Brands Limited\n50:51:A9\t\tTexas Instruments\n50:52:3B\t\tNokia\n50:52:D2\t\tHangzhou Telin Technologies Co., Limited\n50:54:7B\t\tNanjing Qinheng Microelectronics Co., Ltd.\n50:55:27\t\tLG Electronics (Mobile Communications)\n50:55:8D\t\tChina Mobile IOT Company Limited\n50:56:63\t\tTexas Instruments\n50:56:A8\t\tJollyboys Ltd\n50:56:BF\t\tSamsung Electronics Co.,Ltd\n50:57:8A\t\tApple, Inc.\n50:57:9C\t\tSeiko Epson Corporation\n50:57:A8\t\tCisco Systems, Inc\n50:58:00\t\tWyTec International, Inc.\n50:58:4F\t\twaytotec,Inc.\n50:58:6F\t\tHuawei Device Co., Ltd.\n50:58:B0\t\tHunan Greatwall Computer System Co., Ltd.\n50:59:67\t\tIntent Solutions Inc\n50:5A:65\t\tAzureWave Technology Inc.\n50:5A:C6\t\tGuangdong Super Telecom Co.,Ltd.\n50:5B:1D\t\tShenzhen C-Data Technology Co., Ltd.\n50:5B:C2\t\tLiteon Technology Corporation\n50:5C:88\t\tCisco Systems, Inc\n50:5D:7A\t\tzte corporation\n50:5D:AC\t\tHuawei Technologies Co.,Ltd\n50:5E:24\t\tzte corporation\n50:5E:5C\t\tSunitec Technology Co.,Limited\n50:5F:B5\t\tAskey Computer Corp\n50:60:28\t\tXirrus Inc.\n50:61:84\t\tAvaya Inc\n50:61:BF\t\tCisco Systems, Inc\n50:61:D6\t\tIndu-Sol GmbH\n50:61:F6\t\tUniversal Electronics, Inc.\n50:62:45\t\tAnnapurna labs\n50:62:55\t\tIEEE Registration Authority\n50:62:55:00:00:00/28\tUfanet SC\n50:62:55:10:00:00/28\tHagiwara Solutions Co., Ltd\n50:62:55:20:00:00/28\tShenZhen ChuangMo Electronics Technology Co., Ltd\n50:62:55:30:00:00/28\tHypertech Advance Co., LTD\n50:62:55:40:00:00/28\tXSLAB Inc.\n50:62:55:50:00:00/28\tSuzhou Ruixinjie Information Technology Co.,Ltd\n50:62:55:60:00:00/28\tShenzhen Sinway South Technology Co., Ltd\n50:62:55:70:00:00/28\tAVTECH Software, Inc.\n50:62:55:80:00:00/28\tRoda industrial development Co.,Ltd.\n50:62:55:90:00:00/28\tSouthern Ground Audio LLC\n50:62:55:A0:00:00/28\tCCTV Manufacturer\n50:62:55:B0:00:00/28\tChengdu Cove Technology Co.,Ltd\n50:62:55:C0:00:00/28\tAED Distribution\n50:62:55:D0:00:00/28\tCOTT Electronics\n50:62:55:E0:00:00/28\tShinsoft Co., Ltd.\n50:63:13\t\tHon Hai Precision Ind. Co.,Ltd.\n50:63:91\t\tHuawei Technologies Co.,Ltd\n50:64:2B\t\tXIAOMI Electronics,CO.,LTD\n50:64:41\t\tGreenlee\n50:65:83\t\tTexas Instruments\n50:65:F3\t\tHewlett Packard\n50:66:E5\t\tHuawei Device Co., Ltd.\n50:67:87\t\tPlanet Networks\n50:67:AE\t\tCisco Systems, Inc\n50:67:E0\t\tAltice Labs\n50:67:F0\t\tZyxel Communications Corporation\n50:68:0A\t\tHuawei Technologies Co.,Ltd\n50:68:AC\t\tHuawei Device Co., Ltd.\n50:69:5A\t\tAiFamous（shenzhen）Technology Co.,Ltd\n50:6A:03\t\tNetgear\n50:6B:4B\t\tMellanox Technologies, Inc.\n50:6B:8D\t\tNutanix\n50:6C:BE\t\tInnosiliconTechnology Ltd\n50:6E:92\t\tInnocent Technology Co., Ltd.\n50:6F:0C\t\tSagemcom Broadband SAS\n50:6F:77\t\tHuawei Technologies Co.,Ltd\n50:6F:98\t\tSehaj Synergy Technologies Private Limited\n50:6F:9A\t\tWi-Fi Alliance\n50:70:43\t\tSky Uk Limited\n50:70:97\t\tChina Mobile Group Device Co.,Ltd.\n50:70:E5\t\tHe Shan World Fair Electronics Technology Limited\n50:72:24\t\tTexas Instruments\n50:72:4D\t\tBEG Brueck Electronic GmbH\n50:75:F1\t\tCommscope\n50:76:91\t\tTekpea, Inc.\n50:76:A6\t\tEcil Informatica Ind. Com. Ltda\n50:76:AF\t\tIntel Corporate\n50:77:05\t\tSamsung Electronics Co.,Ltd\n50:78:7D\t\tEspressif Inc.\n50:78:B0\t\tHuawei Device Co., Ltd.\n50:78:B3\t\tzte corporation\n50:79:5B\t\tInterexport Telecomunicaciones S.A.\n50:79:73\t\tInagile Electronic Technology Co.,LTD.\n50:7A:55\t\tApple, Inc.\n50:7A:C5\t\tApple, Inc.\n50:7B:91\t\tSigmastar Technology Ltd.\n50:7B:9D\t\tLCFC(Hefei) Electronics Technology co., ltd\n50:7C:6F\t\tIntel Corporate\n50:7D:02\t\tBiodit\n50:7E:5D\t\tArcadyan Technology Corporation\n50:80:4A\t\tQuectel Wireless Solutions Co.,Ltd.\n50:81:40\t\tHP Inc.\n50:82:D5\t\tApple, Inc.\n50:84:92\t\tIntel Corporate\n50:85:69\t\tSamsung Electronics Co.,Ltd\n50:87:4D\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n50:87:89\t\tCisco Systems, Inc\n50:87:B8\t\tNuvyyo Inc\n50:88:11\t\tBeijing Xiaomi Mobile Software Co., Ltd\n50:88:C7\t\tTaicang T&W Electronics\n50:89:65\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\n50:89:D1\t\tHuawei Device Co., Ltd.\n50:8A:06\t\tTuya Smart Inc.\n50:8A:0F\t\tShenzhen Fise Technology Holding Co.,Ltd.\n50:8A:42\t\tUptmate Technology Co., LTD\n50:8A:7F\t\tHuawei Technologies Co.,Ltd\n50:8A:CB\t\tShenzhen Maxmade Technology Co., Ltd.\n50:8B:B9\t\tTuya Smart Inc.\n50:8C:77\t\tDIRMEIER Schanktechnik GmbH &Co KG\n50:8C:B1\t\tTexas Instruments\n50:8C:C9\t\tzte corporation\n50:8C:F5\t\tChina Mobile Group Device Co.,Ltd.\n50:8D:62\t\tHuawei Technologies Co.,Ltd\n50:8D:6F\t\tCHAHOO Limited\n50:8E:49\t\tXiaomi Communications Co Ltd\n50:8F:4C\t\tXiaomi Communications Co Ltd\n50:91:E3\t\tTP-Link Systems Inc\n50:92:B9\t\tSamsung Electronics Co.,Ltd\n50:93:4F\t\tGradual Tecnologia Ltda.\n50:95:51\t\tCommscope\n50:97:07\t\tXiamen Paperang Technology Co.,Ltd.\n50:97:44\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n50:97:72\t\tWestinghouse Digital\n50:98:39\t\tXiaomi Communications Co Ltd\n50:98:71\t\tInventum Technologies Private Limited\n50:98:93\t\tTexas Instruments\n50:98:B8\t\tNew H3C Technologies Co., Ltd\n50:98:F3\t\tRheem Australia Pty Ltd\n50:99:03\t\tMeta Platforms, Inc.\n50:99:5A\t\tAmazon Technologies Inc.\n50:9A:46\t\tSafetrust Inc\n50:9A:4C\t\tDell Inc.\n50:9A:88\t\tHuawei Technologies Co.,Ltd\n50:9B:94\t\tShenzhen iComm Semiconductor CO.,LTD\n50:9E:A7\t\tSamsung Electronics Co.,Ltd\n50:9F:27\t\tHuawei Technologies Co.,Ltd\n50:9F:3B\t\tOi Electric Co.,Ltd\n50:A0:09\t\tXiaomi Communications Co Ltd\n50:A0:15\t\tShenzhen Yipingfang Network Technology Co., Ltd.\n50:A0:30\t\tIEEE Registration Authority\n50:A0:30:00:00:00/28\tGopod Group Limited\n50:A0:30:10:00:00/28\tXEPIC Corporation Limited\n50:A0:30:20:00:00/28\tAnnapurna labs\n50:A0:30:30:00:00/28\tRealWear (Shanghai) Intelligent Technology Co. Ltd\n50:A0:30:40:00:00/28\tAlert Innovation\n50:A0:30:50:00:00/28\tJiangsu Jinshi Legend Technology Co.,Ltd\n50:A0:30:60:00:00/28\tAbacus Research AG\n50:A0:30:70:00:00/28\tShenzhen Hewang Electric Co.,Ltd\n50:A0:30:80:00:00/28\tGE Medical System China Co. Ltd.\n50:A0:30:90:00:00/28\tDPA Microphones A/S\n50:A0:30:A0:00:00/28\tMissing-Link Oy\n50:A0:30:B0:00:00/28\tSHANGHAI ZXELINK Co.,Ltd\n50:A0:30:C0:00:00/28\tGuangzhou Unipower Computer Co.,Ltd\n50:A0:30:D0:00:00/28\tSernet (Suzhou) Technologies Corporation\n50:A0:30:E0:00:00/28\tHankook Ctec Co,. Ltd.\n50:A0:54\t\tActineon\n50:A0:A4\t\tNokia\n50:A0:BF\t\tAlba Fiber Systems Inc.\n50:A1:32\t\tShenzhen MiaoMing  Intelligent Technology Co.,Ltd\n50:A1:F3\t\tHuawei Device Co., Ltd.\n50:A4:C8\t\tSamsung Electronics Co.,Ltd\n50:A4:D0\t\tIEEE Registration Authority\n50:A4:D0:00:00:00/28\tTraxens\n50:A4:D0:10:00:00/28\tBeijing ANTVR Technology Co., LTD\n50:A4:D0:20:00:00/28\tSeneco A/S\n50:A4:D0:30:00:00/28\tGuangzhou Hysoon Electronic Co., Ltd.\n50:A4:D0:40:00:00/28\tRaven Industries Inc.\n50:A4:D0:50:00:00/28\tTREXOM S.r.l.\n50:A4:D0:60:00:00/28\tPointGrab\n50:A4:D0:70:00:00/28\tShanghai Pujiang Smart Card Systems Co., Ltd.\n50:A4:D0:80:00:00/28\tXinLian'AnBao（Beijing）Technology Co.，LTD.\n50:A4:D0:90:00:00/28\tOem Production Inc.\n50:A4:D0:A0:00:00/28\tChangsha SinoCare, Inc\n50:A4:D0:B0:00:00/28\tZheng Dian Electronics Limited\n50:A4:D0:C0:00:00/28\tBeijing YangLian Networks Technology co., LTD\n50:A4:D0:D0:00:00/28\tAxel Technology\n50:A4:D0:E0:00:00/28\tSagetech Corporation\n50:A5:DC\t\tCommscope\n50:A6:7F\t\tApple, Inc.\n50:A6:D8\t\tApple, Inc.\n50:A6:E3\t\tDavid Clark Company\n50:A7:15\t\tAboundi, Inc.\n50:A7:2B\t\tHuawei Technologies Co.,Ltd\n50:A7:33\t\tRuckus Wireless\n50:A8:3A\t\tS Mobile Devices Limited\n50:A9:DE\t\tSmartcom - Bulgaria AD\n50:AB:3E\t\tQibixx AG\n50:AB:BF\t\tHoseo Telecom\n50:AC:B9\t\tHuawei Technologies Co.,Ltd\n50:AD:71\t\tTessolve Semiconductor Private Limited\n50:AD:92\t\tNX Technologies\n50:AD:D5\t\tDynalec Corporation\n50:AE:86\t\tLinkintec Co., Ltd\n50:AF:4D\t\tzte corporation\n50:AF:73\t\tShenzhen Bitland Information Technology Co., Ltd.\n50:B0:3B\t\tSony Interactive Entertainment Inc.\n50:B1:27\t\tApple, Inc.\n50:B1:40\t\tElproma Elektronika Sp Z O O\n50:B3:63\t\tDigitron da Amazonia S/A\n50:B3:B4\t\tShenzhen Furuilian Electronic Co.,Ltd.\n50:B6:95\t\tMicropoint Biotechnologies,Inc.\n50:B7:C3\t\tSamsung Electronics Co.,Ltd\n50:B8:88\t\twi2be Tecnologia S/A\n50:B8:A2\t\tImTech Technologies LLC,\n50:BA:02\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\n50:BB:9F\t\tVantiva USA LLC\n50:BB:B5\t\tAzureWave Technology Inc.\n50:BC:96\t\tApple, Inc.\n50:BD:5F\t\tTp-Link Technologies Co.,Ltd.\n50:C0:06\t\tCarmanah Signs\n50:C0:F0\t\tArtek Microelectronics Co.,Ltd.\n50:C1:F0\t\tNXP Semiconductor (Tianjin) LTD.\n50:C2:71\t\tSecuretech Inc\n50:C2:75\t\tGN Audio A/S\n50:C2:E8\t\tCloud Network Technology Singapore Pte. Ltd.\n50:C2:ED\t\tGN Audio A/S\n50:C3:A2\t\tnFore Technology Co.,Ltd.\n50:C4:DD\t\tBuffalo.Inc\n50:C5:8D\t\tJuniper Networks\n50:C6:8E\t\tBiwin Semiconductor (HK) Company Limted\n50:C6:AD\t\tFiberhome Telecommunication Technologies Co.,LTD\n50:C7:09\t\tJuniper Networks\n50:C7:BF\t\tTp-Link Technologies Co.,Ltd.\n50:C8:E5\t\tSamsung Electronics Co.,Ltd\n50:C9:71\t\tGN Netcom A/S\n50:C9:A0\t\tSkipper As\n50:CC:F8\t\tSamsung Electro Mechanics Co., Ltd.\n50:CD:22\t\tAvaya Inc\n50:CD:32\t\tNanJing Chaoran Science & Technology Co.,Ltd.\n50:CE:75\t\tMeasy Electronics Co., Ltd.\n50:CE:E3\t\tGigafirm.co.LTD\n50:CF:14\t\tQuectel Wireless Solutions Co.,Ltd.\n50:CF:56\t\tChina Mobile Group Device Co.,Ltd.\n50:D0:65\t\tESYLUX GmbH\n50:D2:13\t\tCviLux Corporation\n50:D2:74\t\tSteffes Corporation\n50:D2:F5\t\tBeijing Xiaomi Mobile Software Co., Ltd\n50:D3:3B\t\tcloudnineinfo\n50:D3:7F\t\tYu Fly Mikly Way Science and Technology Co., Ltd.\n50:D4:48\t\tPrivate\n50:D4:5C\t\tAmazon Technologies Inc.\n50:D4:F7\t\tTp-Link Technologies Co.,Ltd.\n50:D5:9C\t\tThai Habel Industrial Co., Ltd.\n50:D6:D7\t\tTakahata Precision\n50:D7:53\t\tCONELCOM GmbH\n50:DA:00\t\tHangzhou H3C Technologies Co., Limited\n50:DA:D6\t\tXiaomi Communications Co Ltd\n50:DB:3F\t\tShenzhen Gongjin Electronics Co.,Lt\n50:DC:D0\t\tObservint Technologies, Inc.\n50:DC:E7\t\tAmazon Technologies Inc.\n50:DC:FC\t\tEcocom\n50:DD:4F\t\tAutomation Components, Inc\n50:DE:06\t\tApple, Inc.\n50:DE:19\t\tIEEE Registration Authority\n50:DE:19:00:00:00/28\tTelic AG\n50:DE:19:10:00:00/28\tClear Flow by Antiference\n50:DE:19:20:00:00/28\tSpii Spa\n50:DE:19:30:00:00/28\tTraxens\n50:DE:19:40:00:00/28\tLangogo Technology Co., Ltd.\n50:DE:19:50:00:00/28\tBliq B.V.\n50:DE:19:60:00:00/28\tOceancctv Ltd\n50:DE:19:70:00:00/28\tTianjin Natianal Health Technology Co.,Ltd\n50:DE:19:80:00:00/28\tIvativ, Inc\n50:DE:19:90:00:00/28\tAEG Identifikationssysteme GmbH\n50:DE:19:A0:00:00/28\tTannak International AB\n50:DE:19:B0:00:00/28\tBrainware Teraherta Information Technology Co.,Ltd.\n50:DE:19:C0:00:00/28\tShenzhen Vipstech Co., Ltd\n50:DE:19:D0:00:00/28\tPenny & Giles Aerospace Ltd\n50:DE:19:E0:00:00/28\tDTEN Inc.\n50:DF:95\t\tLytx\n50:E0:39\t\tZyxel Communications Corporation\n50:E0:85\t\tIntel Corporate\n50:E0:99\t\tHangZhou Atuo Future Technology Co., Ltd\n50:E0:C7\t\tTurControlSystme AG\n50:E0:EF\t\tNokia\n50:E1:4A\t\tPrivate\n50:E2:4E\t\tzte corporation\n50:E4:52\t\tChipsea Technologies (Shenzhen) Corp.\n50:E4:78\t\tSichuan AI-Link Technology Co., Ltd.\n50:E4:E0\t\tHewlett Packard Enterprise\n50:E5:38\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n50:E5:49\t\tGiga-Byte Technology Co.,Ltd.\n50:E6:36\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n50:E6:66\t\tShenzhen Techtion Electronics Co., Ltd.\n50:E7:A0\t\tRenesas Electronics (Penang) Sdn. Bhd.\n50:E7:B7\t\tvivo Mobile Communication Co., Ltd.\n50:E9:71\t\tJibo, Inc.\n50:E9:DF\t\tQuectel Wireless Solutions Co.,Ltd.\n50:EA:D6\t\tApple, Inc.\n50:EB:1A\t\tBrocade Communications Systems LLC\n50:EB:71\t\tIntel Corporate\n50:EB:F6\t\tASUSTek COMPUTER INC.\n50:EC:50\t\tBeijing Xiaomi Mobile Software Co., Ltd\n50:ED:3C\t\tApple, Inc.\n50:ED:78\t\tChangzhou Yongse Infotech Co.,Ltd\n50:ED:94\t\tEgatel Sl\n50:EE:32\t\tHon Hai Precision Industry Co.,LTD\n50:F0:03\t\tOpen Stack, Inc.\n50:F0:D3\t\tSamsung Electronics Co.,Ltd\n50:F1:4A\t\tTexas Instruments\n50:F2:22\t\tEM Microelectronic\n50:F2:61\t\tPhoton Sail Technologies\n50:F2:65\t\tApple, Inc.\n50:F3:51\t\tApple, Inc.\n50:F4:3C\t\tLeeo Inc\n50:F4:EB\t\tApple, Inc.\n50:F5:20\t\tSamsung Electronics Co.,Ltd\n50:F5:DA\t\tAmazon Technologies Inc.\n50:F6:1A\t\tKunshan JADE Technologies co., Ltd.\n50:F7:22\t\tCisco Systems, Inc\n50:F7:ED\t\tHuawei Device Co., Ltd.\n50:F8:A5\t\teWBM Co., Ltd.\n50:F9:08\t\tWizardlab Co., Ltd.\n50:F9:58\t\tHuawei Device Co., Ltd.\n50:FA:84\t\tTp-Link Technologies Co.,Ltd.\n50:FA:AB\t\tL-tek d.o.o.\n50:FB:19\t\tChipsea Technologies (Shenzhen) Corp.\n50:FC:30\t\tTreehouse Labs\n50:FC:9F\t\tSamsung Electronics Co.,Ltd\n50:FD:D5\t\tSJI Industry Company\n50:FE:0C\t\tAzureWave Technology Inc.\n50:FE:F2\t\tSify Technologies Ltd\n50:FF:20\t\tKeenetic Limited\n50:FF:99\t\tIEEE Registration Authority\n50:FF:99:00:00:00/28\tSimicon\n50:FF:99:10:00:00/28\tCoyote System\n50:FF:99:20:00:00/28\tShenzhen Kingvt Electronics Co.,Ltd\n50:FF:99:30:00:00/28\tYongjing Shanghai Electronic Science and Technology\n50:FF:99:40:00:00/28\tIPC Global\n50:FF:99:50:00:00/28\tGarrison Technology\n50:FF:99:60:00:00/28\tLegend Winner Limited\n50:FF:99:70:00:00/28\tHoneywell International\n50:FF:99:80:00:00/28\tDolphin Concepts Limited\n50:FF:99:90:00:00/28\tSea Eagle Optoelectronic Information Technology(Tianjin)co,Ltd\n50:FF:99:A0:00:00/28\tmetraTec GmbH\n50:FF:99:B0:00:00/28\tSichuan Dowlab Electronics Technology Co. Ltd\n50:FF:99:C0:00:00/28\tGoetting KG\n50:FF:99:D0:00:00/28\tShenzhen Haipengxin Electronic Co., Ltd.\n50:FF:99:E0:00:00/28\tInforma LLC\n54:02:37\t\tTeltronic AG\n54:02:95\t\tHuawei Technologies Co.,Ltd\n54:03:84\t\tHongkong Nano IC Technologies Co., Ltd\n54:03:F5\t\tEBN Technology Corp.\n54:04:63\t\tCig Shanghai Co Ltd\n54:04:96\t\tGigawave LTD\n54:04:A6\t\tASUSTek COMPUTER INC.\n54:05:36\t\tVivago Oy\n54:05:5F\t\tAlcatel Lucent\n54:05:93\t\tWOORI ELEC Co.,Ltd\n54:05:DB\t\tLCFC(Hefei) Electronics Technology co., ltd\n54:06:8B\t\tNingbo Deli Kebei Technology Co.LTD\n54:07:64\t\tHuawei Device Co., Ltd.\n54:07:7D\t\tNetgear\n54:08:3B\t\tIEEE Registration Authority\n54:08:3B:00:00:00/28\tShenzhen Liandian Communication Technology Co.LTD\n54:08:3B:10:00:00/28\tAnnapurna labs\n54:08:3B:20:00:00/28\tNavitus Lt\n54:08:3B:30:00:00/28\tDhyan Networks and Technologies, Inc\n54:08:3B:40:00:00/28\tToray Medical Company Limited\n54:08:3B:50:00:00/28\tshenzhen HAIOT technology co.,ltd\n54:08:3B:60:00:00/28\tVector Atomic\n54:08:3B:70:00:00/28\tASCS Sp. z o.o.\n54:08:3B:80:00:00/28\tUpdate Systems Inc.\n54:08:3B:90:00:00/28\tUnicompute Technology Co.,Ltd.\n54:08:3B:A0:00:00/28\tSilex Ipari Automatizálási Zrt.\n54:08:3B:B0:00:00/28\tKorea Bus Broadcasting\n54:08:3B:C0:00:00/28\tFairPhone B.V.\n54:08:3B:D0:00:00/28\tBHS Corrugated Maschinen- und Anlagenbau GmbH\n54:08:3B:E0:00:00/28\tSinclair Technologies\n54:08:53\t\tQingdao Haier Technology Co.,Ltd\n54:08:D3\t\tTianyi Telecom Terminals Company Limited\n54:09:10\t\tApple, Inc.\n54:09:29\t\tInventus Power Eletronica do Brasil LTDA\n54:09:55\t\tzte corporation\n54:09:8D\t\tdeister electronic GmbH\n54:0A:77\t\tFiberhome Telecommunication Technologies Co.,LTD\n54:0A:8A\t\tJlztlink Industry(ShenZhen)Co.,Ltd.\n54:0B:B6\t\tVariscite LTD\n54:0D:F9\t\tHuawei Device Co., Ltd.\n54:0E:2D\t\tvivo Mobile Communication Co., Ltd.\n54:0E:58\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n54:0F:2C\t\tArista Networks\n54:0F:57\t\tSilicon Laboratories\n54:10:2E\t\tHuawei Technologies Co.,Ltd\n54:10:31\t\tSmarto\n54:10:4F\t\tSamsung Electronics Co.,Ltd\n54:10:7B\t\tGuangdong Jeton International Tech Ltd.\n54:10:EC\t\tMicrochip Technology Inc.\n54:11:2F\t\tSulzer Pump Solutions Finland Oy\n54:11:49\t\tvivo Mobile Communication Co., Ltd.\n54:11:59\t\tNettrix Information Industry co.LTD\n54:11:5F\t\tAtamo Pty Ltd\n54:12:CB\t\tHuawei Technologies Co.,Ltd\n54:13:10\t\tHuawei Technologies Co.,Ltd\n54:13:79\t\tHon Hai Precision Ind. Co.,Ltd.\n54:13:CA\t\tItel Mobile Limited\n54:14:73\t\tWingtech Group (HongKong）Limited\n54:14:A7\t\tNanjing Qinheng Microelectronics Co., Ltd.\n54:14:F3\t\tIntel Corporate\n54:14:FD\t\tOrbbec 3D Technology International\n54:15:89\t\tMCS Logic Inc.\n54:16:51\t\tRuijie Networks Co.,LTD\n54:19:C8\t\tvivo Mobile Communication Co., Ltd.\n54:1B:5D\t\tTechno-Innov\n54:1D:61\t\tYEESTOR Microelectronics Co., Ltd\n54:1D:FB\t\tFreestyle Energy Ltd\n54:1E:56\t\tJuniper Networks\n54:1F:8D\t\tzte corporation\n54:1F:D5\t\tAdvantage Electronics\n54:20:18\t\tTely Labs\n54:20:97\t\tTTTech Auto  AG\n54:21:1D\t\tHuawei Device Co., Ltd.\n54:21:60\t\tAlula\n54:21:9D\t\tSamsung Electronics Co.,Ltd\n54:21:A9\t\tItel Mobile Limited\n54:22:59\t\tHuawei Technologies Co.,Ltd\n54:22:E0\t\tAdtran Inc\n54:22:F8\t\tzte corporation\n54:25:EA\t\tHuawei Technologies Co.,Ltd\n54:26:3D\t\tSony Corporation\n54:26:96\t\tApple, Inc.\n54:27:1E\t\tAzureWave Technology Inc.\n54:27:22\t\tLacroix\n54:27:58\t\tMotorola (Wuhan) Mobility Technologies Communication Co., Ltd.\n54:27:6C\t\tJiangsu Houge Technology Corp.\n54:27:8D\t\tNXP (China) Management Ltd.\n54:29:06\t\tApple, Inc.\n54:2A:1B\t\tSonos, Inc.\n54:2A:9C\t\tLSY Defense, LLC.\n54:2A:A2\t\tAlpha Networks Inc.\n54:2B:1C\t\tAmazon Technologies Inc.\n54:2B:57\t\tNight Owl SP\n54:2B:76\t\tzte corporation\n54:2B:8D\t\tApple, Inc.\n54:2B:DE\t\tNew H3C Technologies Co., Ltd\n54:2C:EA\t\tProtectron\n54:2F:04\t\tShanghai Longcheer Technology Co., Ltd.\n54:2F:2B\t\tHuawei Technologies Co.,Ltd\n54:2F:89\t\tEuclid Laboratories, Inc.\n54:2F:8A\t\tTellescom Industria E Comercio Em Telecomunicacao\n54:31:31\t\tRaster Vision Ltd\n54:31:D4\t\tTGW Mechanics GmbH\n54:32:04\t\tEspressif Inc.\n54:32:C7\t\tApple, Inc.\n54:33:C6\t\tMist Systems, Inc.\n54:33:CB\t\tApple, Inc.\n54:34:EF\t\tHuawei Technologies Co.,Ltd\n54:35:30\t\tHon Hai Precision Ind. Co.,Ltd.\n54:35:DF\t\tSymeo GmbH\n54:35:E9\t\tFeitian Technologies Co., Ltd\n54:36:9B\t\t1Verge Internet Technology (Beijing) Co., Ltd.\n54:37:BB\t\tTaicang T&W Electronics\n54:39:68\t\tEdgewater Networks Inc\n54:39:DF\t\tHuawei Technologies Co.,Ltd\n54:3A:D6\t\tSamsung Electronics Co.,Ltd\n54:3A:DF\t\tQualfiber Technology Co.,Ltd\n54:3B:30\t\tduagon AG\n54:3D:37\t\tRuckus Wireless\n54:3D:60\t\tArcadyan Corporation\n54:3D:92\t\tWireless-Tek Technology Limited\n54:3E:64\t\tFiberhome Telecommunication Technologies Co.,LTD\n54:40:AD\t\tSamsung Electronics Co.,Ltd\n54:42:49\t\tSony Corporation\n54:43:B2\t\tEspressif Inc.\n54:44:08\t\tNokia Corporation\n54:44:3B\t\tHuawei Technologies Co.,Ltd\n54:44:A3\t\tSamsung Electronics Co.,Ltd\n54:45:38\t\tTexas Instruments\n54:46:17\t\tzte corporation\n54:46:6B\t\tShenzhen CZTIC Electronic Technology Co., Ltd\n54:47:41\t\tXcheng Holding\n54:47:CC\t\tSagemcom Broadband SAS\n54:47:D3\t\tTsat As\n54:47:E8\t\tSyrotech Networks. Ltd.\n54:48:10\t\tDell Inc.\n54:48:9C\t\tCdoubles Electronics Co. Ltd.\n54:48:E6\t\tBeijing Xiaomi Mobile Software Co., Ltd\n54:49:DF\t\tPeloton Interactive, Inc\n54:49:FC\t\tUbee Interactive Co., Limited\n54:4A:00\t\tCisco Systems, Inc\n54:4A:05\t\twenglor sensoric gmbh\n54:4A:16\t\tTexas Instruments\n54:4B:8C\t\tJuniper Networks\n54:4C:8A\t\tMicrosoft Corporation\n54:4D:D4\t\tChina Mobile Group Device Co.,Ltd.\n54:4E:45\t\tPrivate\n54:4E:90\t\tApple, Inc.\n54:4E:F0\t\tRoku, Inc\n54:51:1B\t\tHuawei Technologies Co.,Ltd\n54:51:46\t\tAMG Systems Ltd.\n54:51:DE\t\tCisco Systems, Inc\n54:52:84\t\tHuawei Device Co., Ltd.\n54:53:ED\t\tSony Corporation\n54:54:14\t\tDigital RF Corea, Inc\n54:54:CF\t\tProbedigital Co.,Ltd\n54:55:D5\t\tHuawei Device Co., Ltd.\n54:5A:A6\t\tEspressif Inc.\n54:5B:86\t\tPanasonic Automotive Systems Co.,Ltd\n54:5D:D9\t\tEdistec\n54:5E:BD\t\tNL Technologies\n54:5F:A7\t\tJibaiyou Technology Co.,Ltd.\n54:5F:A9\t\tTeracom Limited\n54:60:09\t\tGoogle, Inc.\n54:60:6D\t\tHuawei Technologies Co.,Ltd\n54:61:72\t\tZodiac Aerospace Sas\n54:61:EA\t\tZaplox AB\n54:62:E2\t\tApple, Inc.\n54:64:BC\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n54:64:D9\t\tSagemcom Broadband SAS\n54:64:DE\t\tu-blox AG\n54:65:03\t\tQuectel Wireless Solutions Co.,Ltd.\n54:65:DE\t\tCommscope\n54:66:6C\t\tShenzhen YOUHUA Technology Co., Ltd\n54:66:F9\t\tConMet\n54:67:06\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n54:67:49\t\tGoogle, Inc.\n54:67:51\t\tCompal Broadband Networks, Inc.\n54:67:E6\t\tShenzhen Mtc Co Ltd\n54:69:25\t\tPs Inodic Co., Ltd.\n54:69:90\t\tHuawei Technologies Co.,Ltd\n54:6A:D8\t\tElster Water Metering\n54:6C:0E\t\tTexas Instruments\n54:6C:AC\t\tIntelbras\n54:6C:EB\t\tIntel Corporate\n54:6D:52\t\tTopview Optronics Corp.\n54:6F:71\t\tuAvionix Corporation\n54:70:68\t\tVTech Communications Limited\n54:71:DD\t\tHuawei Device Co., Ltd.\n54:72:4F\t\tApple, Inc.\n54:72:5E\t\tUnion Man Technology Co.,Ltd\n54:72:6E\t\tDaimler Truck AG\n54:73:98\t\tToyo Electronics Corporation\n54:74:E6\t\tWebtech Wireless\n54:75:95\t\tTp-Link Technologies Co.,Ltd.\n54:75:D0\t\tCisco Systems, Inc\n54:76:B2\t\tRaisecom Technology CO., LTD\n54:77:87\t\tEarda Technologies co Ltd\n54:77:8A\t\tHewlett Packard Enterprise\n54:78:1A\t\tCisco Systems, Inc\n54:78:85\t\tShenzhen Giec Digital Co.,Ltd\n54:78:C9\t\tAMPAK Technology,Inc.\n54:78:F0\t\tzte corporation\n54:79:75\t\tNokia Corporation\n54:7A:52\t\tCTE International srl\n54:7C:69\t\tCisco Systems, Inc\n54:7D:40\t\tPowervision Tech Inc.\n54:7D:CD\t\tTexas Instruments\n54:7E:1A\t\tKaon Group Co., Ltd.\n54:7F:54\t\tIngenico\n54:7F:A8\t\tTELCO systems, s.r.o.\n54:7F:BC\t\tiodyne\n54:7F:EE\t\tCisco Systems, Inc\n54:80:28\t\tHewlett Packard Enterprise\n54:80:8A\t\tPt. Bizlink Technology Indonesia\n54:81:2D\t\tPAX Computer Technology(Shenzhen) Ltd.\n54:81:AD\t\tEagle Research Corporation\n54:83:3A\t\tZyxel Communications Corporation\n54:84:50\t\tTiinlab Corporation\n54:84:7B\t\tDigital Devices GmbH\n54:84:DC\t\tzte corporation\n54:85:C1\t\tSiliconwaves Technologies Co.,Ltd\n54:86:BC\t\tCisco Systems, Inc\n54:88:0E\t\tSamsung Electro-Mechanics(Thailand)\n54:88:DE\t\tCisco Systems, Inc\n54:88:FE\t\tXiaoniu network technology (Shanghai) Co., Ltd.\n54:89:22\t\tZelfy Inc\n54:89:98\t\tHuawei Technologies Co.,Ltd\n54:8A:BA\t\tCisco Systems, Inc\n54:8C:81\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n54:8C:A0\t\tLiteon Technology Corporation\n54:8D:5A\t\tIntel Corporate\n54:91:AF\t\tIEEE Registration Authority\n54:91:AF:00:00:00/28\tOpal-RT Technologies Inc.\n54:91:AF:10:00:00/28\t4MITech\n54:91:AF:20:00:00/28\tShenzhen Sanmi Intelligent Co.,Ltd\n54:91:AF:30:00:00/28\tIronLink\n54:91:AF:40:00:00/28\tDDPAI Technology Co.,Ltd\n54:91:AF:50:00:00/28\tShenzhen IDSTE Information Technology Co., LTD\n54:91:AF:60:00:00/28\tStar Systems International Limited\n54:91:AF:70:00:00/28\tHong Telecom Equipment Service Limited\n54:91:AF:80:00:00/28\tHunan Quanying Electronics Co. , Ltd.\n54:91:AF:90:00:00/28\tAsiga Pty Ltd\n54:91:AF:A0:00:00/28\tZhuhai SHIXI Technology Co.,Ltd\n54:91:AF:B0:00:00/28\tHyperconn Pte. ltd\n54:91:AF:C0:00:00/28\tDanuTech Europe Kft\n54:91:AF:D0:00:00/28\tNingbo Joynext Technology Corporation\n54:91:AF:E0:00:00/28\tJiangxi Anbaichuan Electric Co.(ABC),Ltd\n54:92:09\t\tHuawei Technologies Co.,Ltd\n54:92:6A\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n54:92:BE\t\tSamsung Electronics Co.,Ltd\n54:93:59\t\tShenzhen Twowing Technologies Co.,Ltd.\n54:94:78\t\tSilvershore Technology Partners\n54:99:63\t\tApple, Inc.\n54:9A:11\t\tIEEE Registration Authority\n54:9A:11:00:00:00/28\tShenzhen Excera Technology Co.,Ltd.\n54:9A:11:10:00:00/28\tSpearX Inc.\n54:9A:11:20:00:00/28\tTorrap Design Limited\n54:9A:11:30:00:00/28\tRoyal Boon Edam International BV\n54:9A:11:40:00:00/28\teTauro LLC\n54:9A:11:50:00:00/28\tElotech Industrieelektronik GmbH\n54:9A:11:60:00:00/28\tOrient Direct, Inc.\n54:9A:11:70:00:00/28\tNiveo International BV\n54:9A:11:80:00:00/28\tTite, Inc.\n54:9A:11:90:00:00/28\tAlfen BV\n54:9A:11:A0:00:00/28\tVendNovation LLC\n54:9A:11:B0:00:00/28\tElite Silicon Technology, Inc.\n54:9A:11:C0:00:00/28\tXi'an Hua Fan Technology Co.,Ltd.\n54:9A:11:D0:00:00/28\tHangzhou duotin Technology Co., Ltd.\n54:9A:11:E0:00:00/28\tBeijing HTSmartech Co.,Ltd\n54:9A:11:F0:00:00/28\tPrivate\n54:9A:16\t\tUzushio Electric Co.,Ltd.\n54:9A:4C\t\tGuangdong Homecare Technology Co.,Ltd.\n54:9A:8F\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n54:9B:12\t\tSamsung Electronics Co.,Ltd\n54:9B:24\t\tMellanox Technologies, Inc.\n54:9B:49\t\tNEC Platforms, Ltd.\n54:9B:72\t\tEricsson AB\n54:9C:27\t\tPlasma Cloud Limited\n54:9D:85\t\tEnerAccess inc\n54:9F:06\t\tNokia Shanghai Bell Co., Ltd.\n54:9F:13\t\tApple, Inc.\n54:9F:35\t\tDell Inc.\n54:9F:AE\t\tiBASE Gaming Inc\n54:9F:C6\t\tCisco Systems, Inc\n54:A0:4F\t\tt-mac Technologies Ltd\n54:A0:50\t\tASUSTek COMPUTER INC.\n54:A1:04\t\tOPTOWL Co.,Ltd\n54:A2:45\t\tDigisol Systems Limited\n54:A2:74\t\tCisco Systems, Inc\n54:A3:1B\t\tShenzhen Linkworld Technology Co,.LTD\n54:A3:FA\t\tBQT Solutions (Australia)Pty Ltd\n54:A4:93\t\tIEEE Registration Authority\n54:A4:93:00:00:00/28\tIntelligent Surveillance Corp\n54:A4:93:10:00:00/28\tShenZhen Smart&Aspiration Co.,LTD\n54:A4:93:20:00:00/28\tgenua GmbH\n54:A4:93:30:00:00/28\tI-Moon Technology Co., Limited\n54:A4:93:40:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n54:A4:93:50:00:00/28\tAusounds Intelligence, Llc\n54:A4:93:60:00:00/28\tHannto Technology Co., Ltd\n54:A4:93:70:00:00/28\tRED Hydrogen LLC\n54:A4:93:80:00:00/28\tChengdu EVECCA Technology Co.,Ltd.\n54:A4:93:90:00:00/28\tDo Easy International Limited\n54:A4:93:A0:00:00/28\tWonders Technology Co., Ltd.\n54:A4:93:B0:00:00/28\tAdvice\n54:A4:93:C0:00:00/28\tBj Cotytech Technology Co.,Ltd\n54:A4:93:D0:00:00/28\tAssem Technology Co.,Ltd.\n54:A4:93:E0:00:00/28\tNederman Holding AB\n54:A5:1B\t\tHuawei Technologies Co.,Ltd\n54:A5:4B\t\tNSC Communications Siberia Ltd\n54:A5:52\t\tShenzhen WeSing Interactive Entertainment Technology Co., Ltd\n54:A6:19\t\tAlcatel-Lucent Shanghai Bell Co., Ltd\n54:A6:37\t\tHuawei Technologies Co.,Ltd\n54:A6:5C\t\tVantiva USA LLC\n54:A6:DB\t\tHuawei Device Co., Ltd.\n54:A7:03\t\tTp-Link Technologies Co.,Ltd.\n54:A7:A0\t\tHunan Aimag Intelligent Technology Co.,Ltd\n54:A9:C8\t\tHome Control Singapore Pte Ltd\n54:A9:D4\t\tMinibar Systems\n54:AB:3A\t\tQuanta Computer Inc.\n54:AC:FC\t\tLIZN ApS\n54:AE:27\t\tApple, Inc.\n54:AE:D0\t\tDASAN Networks, Inc.\n54:AE:D2\t\tCSL Dualcom Ltd\n54:AF:97\t\tTP-Link Systems Inc\n54:B1:21\t\tHuawei Technologies Co.,Ltd\n54:B2:03\t\tPegatron Corporation\n54:B2:9D\t\tShenzhen YOUHUA Technology Co., Ltd\n54:B5:6C\t\tXi'an NovaStar Tech Co., Ltd\n54:B6:20\t\tSUHDOL E&C Co.Ltd.\n54:B7:53\t\tHunan Fenghui Yinjia Science And Technology Co.,Ltd\n54:B7:BD\t\tArcadyan Corporation\n54:B7:E5\t\tRayson Technology Co., Ltd.\n54:B8:02\t\tSamsung Electronics Co.,Ltd\n54:B8:0A\t\tD-Link International\n54:B8:74\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n54:BA:D6\t\tHuawei Technologies Co.,Ltd\n54:BD:79\t\tSamsung Electronics Co.,Ltd\n54:BE:53\t\tzte corporation\n54:BE:F7\t\tPegatron Corporation\n54:BF:64\t\tDell Inc.\n54:C0:78\t\tInfinix mobility limited\n54:C2:50\t\tIskratel d.o.o.\n54:C3:3E\t\tCiena Corporation\n54:C4:15\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n54:C4:5B\t\tArcadyan Corporation\n54:C4:80\t\tHuawei Technologies Co.,Ltd\n54:C5:7A\t\tSunnovo International Limited\n54:C6:A6\t\tHubei Yangtze Mason Semiconductor Technology  Co., Ltd.\n54:C6:FF\t\tNew H3C Technologies Co., Ltd\n54:C8:0F\t\tTp-Link Technologies Co.,Ltd.\n54:C8:CC\t\tShenzhen SDG Telecom Equipment Co.,Ltd.\n54:C9:DF\t\tFn-Link Technology Limited\n54:CD:10\t\tPanasonic Mobile Communications Co.,Ltd.\n54:CD:A7\t\tFujian Shenzhou Electronic Co.,Ltd\n54:CD:EE\t\tShenZhen Apexis Electronic Co.,Ltd\n54:CE:69\t\tHikari Trading Co.,Ltd.\n54:CE:82\t\tzte corporation\n54:CF:8D\t\tHuawei Technologies Co.,Ltd\n54:D0:B4\t\tXiamen Four-Faith Communication Technology Co.,Ltd\n54:D0:ED\t\tAXIM Communications\n54:D1:63\t\tMax-Tech,Inc\n54:D1:7D\t\tSamsung Electronics Co.,Ltd\n54:D1:B0\t\tUniversal Laser Systems, Inc\n54:D2:72\t\tNuki Home Solutions GmbH\n54:D4:6F\t\tCisco SPVTG\n54:D6:0D\t\tHangzhou Ezviz Software Co.,Ltd.\n54:D7:51\t\tProximus\n54:D7:E3\t\tHewlett Packard Enterprise\n54:D9:C6\t\tHuawei Device Co., Ltd.\n54:D9:E4\t\tBrilliantts Co., Ltd\n54:DB:A2\t\tFibrain\n54:DC:1D\t\tYulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd\n54:DC:E9\t\tSilicon Laboratories\n54:DD:21\t\tHuawei Device Co., Ltd.\n54:DD:4F\t\tSamsung Electronics Co.,Ltd\n54:DE:D0\t\tSevio Srl\n54:DE:D3\t\tzte corporation\n54:DF:00\t\tUlterius Technologies, LLC\n54:DF:1B\t\tVestel Elektronik San ve Tic. A.S.\n54:DF:24\t\tFiberhome Telecommunication Technologies Co.,LTD\n54:DF:63\t\tIntrakey technologies GmbH\n54:E0:05\t\tFiberhome Telecommunication Technologies Co.,LTD\n54:E0:19\t\tRing LLC\n54:E0:32\t\tJuniper Networks\n54:E0:61\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n54:E1:40\t\tIngenico\n54:E1:5B\t\tHuawei Device Co., Ltd.\n54:E1:AD\t\tLCFC(Hefei) Electronics Technology co., ltd\n54:E1:B6\t\tRenesas Electronics (Penang) Sdn. Bhd.\n54:E2:C8\t\tDongguan Aoyuan Electronics Technology Co., Ltd\n54:E2:E0\t\tCommscope\n54:E3:B0\t\tJVL Industri Elektronik\n54:E3:F6\t\tAlcatel-Lucent\n54:E4:3A\t\tApple, Inc.\n54:E4:A9\t\tBHR Tech GmbH\n54:E4:BD\t\tFn-Link Technology Limited\n54:E4:ED\t\tIntel Corporate\n54:E6:1B\t\tApple, Inc.\n54:E6:3F\t\tShenZhen LingKeWeiEr Technology Co., Ltd.\n54:E6:FC\t\tTp-Link Technologies Co.,Ltd.\n54:E7:D5\t\tSun Cupid Technology (HK) LTD\n54:EA:A8\t\tApple, Inc.\n54:EA:E1\t\tHonor Device Co., Ltd.\n54:EB:E9\t\tApple, Inc.\n54:EC:2F\t\tRuckus Wireless\n54:EC:B0\t\tSercomm France Sarl\n54:ED:A3\t\tNavdy, Inc.\n54:EE:75\t\tWistron InfoComm(Kunshan)Co.,Ltd.\n54:EF:33\t\tShenzhen Bilian Electronic Co.，Ltd\n54:EF:43\t\tHuawei Technologies Co.,Ltd\n54:EF:44\t\tLumi United Technology Co., Ltd\n54:EF:5B\t\tScience Corporation\n54:EF:92\t\tShenzhen Elink Technology Co., LTD\n54:EF:FE\t\tFullpower Technologies, Inc.\n54:F0:B1\t\tHewlett Packard Enterprise\n54:F1:5F\t\tSichuan AI-Link Technology Co., Ltd.\n54:F2:01\t\tSamsung Electronics Co.,Ltd\n54:F2:94\t\tHuawei Device Co., Ltd.\n54:F2:9F\t\tHunan Fn-Link Technology Limited\n54:F5:B6\t\tOriental Pacific International Limited\n54:F6:07\t\tHuawei Device Co., Ltd.\n54:F6:66\t\tBerthold Technologies GmbH and Co.KG\n54:F6:C5\t\tFujian Star-Net Communication Co.,Ltd\n54:F6:E2\t\tHuawei Technologies Co.,Ltd\n54:F8:2A\t\tu-blox AG\n54:F8:76\t\tAbb Ag\n54:F8:F0\t\tTesla Inc\n54:FA:3E\t\tSamsung Electronics Co.,Ltd\n54:FA:89\t\tMedtronic CRM\n54:FA:96\t\tNokia Solutions and Networks GmbH & Co. KG\n54:FB:58\t\tWISEWARE, Lda\n54:FB:5A\t\tOptomind Inc.\n54:FC:F0\t\tSamsung Electronics Co.,Ltd\n54:FD:BF\t\tScheidt & Bachmann GmbH\n54:FE:EB\t\tTexas Instruments\n54:FF:82\t\tDavit Solution co.\n54:FF:CF\t\tMopria Alliance\n58:00:32\t\tGenexis B.V.\n58:00:BB\t\tJuniper Networks\n58:00:E3\t\tLiteon Technology Corporation\n58:02:05\t\tAzureWave Technology Inc.\n58:03:FB\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n58:04:54\t\tIcomm Hk Limited\n58:04:CB\t\tTianjin Huisun Technology Co.,Ltd.\n58:05:28\t\tLabris Networks\n58:05:56\t\tElettronica GF S.r.L.\n58:05:D9\t\tSeiko Epson Corporation\n58:07:F8\t\tNokia Solutions and Networks GmbH & Co. KG\n58:08:FA\t\tFiber Optic & telecommunication INC.\n58:09:43\t\tPrivate\n58:09:87\t\tAmazon Technologies Inc.\n58:09:E5\t\tKivic Inc.\n58:0A:20\t\tCisco Systems, Inc\n58:0A:D4\t\tApple, Inc.\n58:0D:0D\t\tGree Electric Appliances, Inc. Of Zhuhai\n58:10:31\t\tHon Hai Precision IND.CO.,LTD\n58:10:8C\t\tIntelbras\n58:10:B7\t\tInfinix mobility limited\n58:11:22\t\tASUSTek COMPUTER INC.\n58:12:43\t\tAcSiP Technology Corp.\n58:13:D3\t\tGemtek Technology Co., Ltd.\n58:16:26\t\tAvaya Inc\n58:16:D7\t\tAlpsalpine Co,.Ltd\n58:17:0C\t\tSony Corporation\n58:18:62\t\tSony Corporation\n58:19:F8\t\tCommscope\n58:1C:BD\t\tAffinegy\n58:1C:F8\t\tIntel Corporate\n58:1D:91\t\tAdvanced Mobile Telecom co.,ltd.\n58:1D:C9\t\tMse Co.,Ltd.\n58:1D:D8\t\tSagemcom Broadband SAS\n58:1F:19\t\tEMH Metering GmbH & Co. KG\n58:1F:28\t\tHuawei Technologies Co.,Ltd\n58:1F:67\t\tOpen-m technology limited\n58:1F:AA\t\tApple, Inc.\n58:1F:EF\t\tTuttnaer LTD\n58:20:59\t\tXiaomi Communications Co Ltd\n58:20:71\t\tSamsung Electronics Co.,Ltd\n58:20:8A\t\tIEEE Registration Authority\n58:20:8A:00:00:00/28\tAnnapurna labs\n58:20:8A:10:00:00/28\tBeijing Senfetech Corporation Ltd.\n58:20:8A:20:00:00/28\tMars Digi Tech Co .,Ltd\n58:20:8A:30:00:00/28\tAggregate Co.,Ltd.\n58:20:8A:40:00:00/28\tTring\n58:20:8A:50:00:00/28\tJia Huang Jhan Ye Co.,Ltd\n58:20:8A:60:00:00/28\tShangyin Intelligence Technology Shandong Co.,Ltd\n58:20:8A:70:00:00/28\tpureLiFi Ltd\n58:20:8A:80:00:00/28\tSAMIL CTS Co., Ltd.\n58:20:8A:90:00:00/28\tSuzhou Ruilisi Technology Ltd.\n58:20:8A:A0:00:00/28\tConductix-Wampfler\n58:20:8A:B0:00:00/28\tInfodev Electronic Designers Intl.\n58:20:8A:C0:00:00/28\tJiangsu Zhonganzhixin Communication Technology Co.\n58:20:8A:D0:00:00/28\tSambo Hitech\n58:20:8A:E0:00:00/28\tUPM Technology, Inc\n58:20:B1\t\tHewlett Packard\n58:21:36\t\tKMB systems, s.r.o.\n58:21:E9\t\tTwpi\n58:23:8C\t\tVantiva USA LLC\n58:23:9B\t\tFiberhome Telecommunication Technologies Co.,LTD\n58:23:BC\t\tIEEE Registration Authority\n58:23:BC:00:00:00/28\tShenzhen Huasifei Technology Co., Ltd\n58:23:BC:10:00:00/28\tLens Technology (Xiangtan) Co.,Ltd\n58:23:BC:20:00:00/28\tGreat Wall Power Supply Technology Co., Ltd.\n58:23:BC:30:00:00/28\tSHSYSTEM.Co.,LTD\n58:23:BC:40:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n58:23:BC:50:00:00/28\tShenzhen Zhixuan Network Technology Co., Ltd.\n58:23:BC:60:00:00/28\tNext Vision\n58:23:BC:70:00:00/28\tShenzhen MinDe Electronics Technology Ltd.\n58:23:BC:80:00:00/28\tWuhan Rayoptek Co.,Ltd\n58:23:BC:90:00:00/28\tAnnapurna labs\n58:23:BC:A0:00:00/28\tHangzhou Xindatong Communication Technology Co.,Ltd.\n58:23:BC:B0:00:00/28\tAnnapurna labs\n58:23:BC:C0:00:00/28\tYuyao Sunny Optical Intelligence Technology Co., Ltd\n58:23:BC:D0:00:00/28\tNew Energy Technology Co.,Ltd\n58:23:BC:E0:00:00/28\tBroadradio International Pte.Ltd.\n58:24:29\t\tGoogle, Inc.\n58:25:75\t\tHuawei Technologies Co.,Ltd\n58:25:7A\t\tMobiwire Mobiles(Ningbo) Co.,Ltd\n58:26:3A\t\tSilicon Laboratories\n58:27:8C\t\tBuffalo.Inc\n58:2A:F7\t\tHuawei Technologies Co.,Ltd\n58:2B:0A\t\tTexas Instruments\n58:2B:DB\t\tPax AB\n58:2D:34\t\tQingping Electronics (Suzhou) Co., Ltd\n58:2E:FE\t\tLighting Science Group\n58:2F:40\t\tNintendo Co.,Ltd\n58:2F:42\t\tUniversal Electric Corporation\n58:2F:F7\t\tSagemcom Broadband SAS\n58:30:5B\t\tShanghai Junqian Sensing Technology Co.,LTD\n58:30:6E\t\tNokia\n58:31:12\t\tDrust\n58:32:77\t\tReliance Communications LLC\n58:34:3B\t\tGlovast Technology Ltd.\n58:35:0F\t\tEM Microelectronic\n58:35:26\t\tDeeplet Technology Corp\n58:35:5D\t\tHuawei Device Co., Ltd.\n58:35:6B\t\tTecno Mobile Limited\n58:35:D9\t\tCisco Systems, Inc\n58:36:53\t\tApple, Inc.\n58:38:79\t\tRicoh Company, Ltd.\n58:3B:C2\t\tSilicon Laboratories\n58:3B:D9\t\tFiberhome Telecommunication Technologies Co.,LTD\n58:3C:C6\t\tOmneality Ltd.\n58:3F:54\t\tLG Electronics (Mobile Communications)\n58:40:4E\t\tApple, Inc.\n58:41:20\t\tTp-Link Technologies Co.,Ltd.\n58:41:46\t\tGuangzhou Shiyuan Electronic Technology Company Limited\n58:42:E4\t\tBaxter International Inc\n58:43:AB\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n58:44:98\t\tXiaomi Communications Co Ltd\n58:45:4C\t\tEricsson AB\n58:46:8F\t\tKoncar Electronics and Informatics\n58:46:E1\t\tBaxter International Inc\n58:47:04\t\tShenzhen Webridge Technology Co.,Ltd\n58:47:CA\t\tIEEE Registration Authority\n58:47:CA:00:00:00/28\tLitum Bilgi Teknolojileri San. Ve Tic. A.S.\n58:47:CA:10:00:00/28\tHexagon Metrology Services Ltd.\n58:47:CA:20:00:00/28\tOnawhim (Oaw) Inc.\n58:47:CA:30:00:00/28\tFujian Helios Technologies Co., Ltd.\n58:47:CA:40:00:00/28\tFuture Tech Development FZC LLC\n58:47:CA:50:00:00/28\tHuizhou Jiemeisi Technology Co., Ltd\n58:47:CA:60:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n58:47:CA:70:00:00/28\tShenzhen Meigao Electronic Equipment Co.,Ltd\n58:47:CA:80:00:00/28\tBirger Engineering, Inc.\n58:47:CA:90:00:00/28\tKingnuo Intelligent Technology (Jiaxing) Co., Ltd.\n58:47:CA:A0:00:00/28\tPowder Watts, LLC\n58:47:CA:B0:00:00/28\tSuzhou Laisai Intelligence Technology Co.,Ltd\n58:47:CA:C0:00:00/28\tSms Electric Co., Ltd Zhengzhou\n58:47:CA:D0:00:00/28\tPRACTEK Technology Co., Ltd.\n58:47:CA:E0:00:00/28\tAzure Summit Technology\n58:48:22\t\tSony Corporation\n58:48:49\t\tIEEE Registration Authority\n58:48:49:00:00:00/28\tBeijing Zhongyuanyishang Technology Co Ltd\n58:48:49:10:00:00/28\tSKAARHOJ ApS\n58:48:49:20:00:00/28\tX-speed lnformation Technology Co.,Ltd\n58:48:49:30:00:00/28\tViper Design LLC\n58:48:49:40:00:00/28\tSernet (Suzhou) Technologies Corporation\n58:48:49:50:00:00/28\tHubei Shudi Communication Technology Co., Ltd\n58:48:49:60:00:00/28\tShenzhen hongqifu Technology Co., Ltd\n58:48:49:70:00:00/28\tShandong Aotai Electric Co., LTD.\n58:48:49:80:00:00/28\tSTACKFORCE GmbH\n58:48:49:90:00:00/28\tShenzhen Tongye Technology Co.,Ltd\n58:48:49:A0:00:00/28\tWaoo\n58:48:49:B0:00:00/28\tDaatrics LTD\n58:48:49:C0:00:00/28\tHaag-Streit AG\n58:48:49:D0:00:00/28\tTelegaertner Elektronik GmbH\n58:48:49:E0:00:00/28\tAvadesign Technology Co. Ltd.\n58:48:C0\t\tCoflec\n58:49:25\t\tE3 Enterprise\n58:49:3B\t\tPalo Alto Networks\n58:49:BA\t\tChitai Electronic Corp.\n58:4B:BC\t\tzte corporation\n58:4C:19\t\tChongqing Guohong Technology Development Company Limited\n58:4C:EE\t\tDigital One Technologies, Limited\n58:4D:42\t\tDragos, Inc.\n58:50:76\t\tLinear Equipamentos Eletronicos SA\n58:50:AB\t\tTLS Corporation\n58:50:E6\t\tBest Buy Corporation\n58:50:ED\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n58:52:8A\t\tMitsubishi Electric Corporation\n58:53:C0\t\tBeijing Guang Runtong Technology Development Company co.,Ltd\n58:55:95\t\tApple, Inc.\n58:55:CA\t\tApple, Inc.\n58:56:9F\t\tCisco Systems, Inc\n58:56:C2\t\tHuawei Technologies Co.,Ltd\n58:56:E8\t\tCommscope\n58:57:0D\t\tDanfoss Solar Inverters\n58:58:CD\t\tExtreme Networks Headquarters\n58:59:24\t\tNanjing Simon Info Tech Co.,Ltd.\n58:59:C2\t\tExtreme Networks Headquarters\n58:5B:69\t\tTvt Co., Ltd\n58:5F:F6\t\tzte corporation\n58:60:5F\t\tHuawei Technologies Co.,Ltd\n58:60:D8\t\tCommscope\n58:61:63\t\tQuantum Networks (SG) Pte. Ltd.\n58:63:56\t\tFn-Link Technology Limited\n58:63:9A\t\tTpl Systemes\n58:64:C4\t\tApple, Inc.\n58:65:E6\t\tinfomark\n58:66:6D\t\tApple, Inc.\n58:66:BA\t\tHangzhou H3C Technologies Co., Limited\n58:67:1A\t\tBarnes&Noble\n58:67:7F\t\tClare Controls Inc.\n58:68:5D\t\tTempo Australia Pty Ltd\n58:68:61\t\tViasat, Incorporated\n58:68:7A\t\tSagemcom Broadband SAS\n58:69:6C\t\tRuijie Networks Co.,LTD\n58:69:F9\t\tFusion Transactive Ltd.\n58:6A:B1\t\tHangzhou H3C Technologies Co., Limited\n58:6B:14\t\tApple, Inc.\n58:6C:25\t\tIntel Corporate\n58:6D:67\t\tIntel Corporate\n58:6D:8F\t\tCisco-Linksys, LLC\n58:6E:D6\t\tPrivate\n58:70:7F\t\tEricsson AB\n58:70:C6\t\tShanghai Xiaoyi Technology Co., Ltd.\n58:72:C9\t\tzte corporation\n58:73:D1\t\tHuawei Technologies Co.,Ltd\n58:73:D8\t\tApple, Inc.\n58:75:21\t\tCJSC RTSoft\n58:76:75\t\tBeijing ECHO Technologies Co.,Ltd\n58:76:9C\t\tPalo Alto Networks\n58:76:AC\t\tSernet (Suzhou) Technologies Corporation\n58:76:B3\t\tUbee Interactive Co., Limited\n58:76:C5\t\tDigi I'S Ltd\n58:79:61\t\tMicrosoft Corporation\n58:79:E0\t\tSamsung Electronics Co.,Ltd\n58:7A:4D\t\tStonesoft Corporation\n58:7A:62\t\tTexas Instruments\n58:7A:6A\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n58:7A:B1\t\tShanghai Lixun Information Technology Co., Ltd.\n58:7B:E9\t\tAirPro Technology India Pvt. Ltd\n58:7D:B6\t\tNorthern Data AG\n58:7E:61\t\tQingdao Hisense Communications Co.,Ltd.\n58:7F:57\t\tApple, Inc.\n58:7F:66\t\tHuawei Technologies Co.,Ltd\n58:7F:B7\t\tSonar Industrial Co., Ltd.\n58:7F:C8\t\tS2M\n58:82:1D\t\tH. Schomäcker GmbH\n58:82:A8\t\tMicrosoft\n58:83:36\t\tHuawei Technologies Co.,Ltd\n58:84:E4\t\tIP500 Alliance e.V.\n58:85:6E\t\tQsc Ag\n58:85:A2\t\tRealme Chongqing MobileTelecommunications Corp Ltd\n58:85:E9\t\tRealme Chongqing MobileTelecommunications Corp Ltd\n58:86:70\t\tJuniper Networks\n58:86:94\t\tEFM Networks\n58:87:4C\t\tLite-On Clean Energy Technology Corp.\n58:87:85\t\tAdtran Inc\n58:87:9F\t\tHuawei Device Co., Ltd.\n58:87:E2\t\tShenzhen Coship Electronics Co., Ltd.\n58:8A:5A\t\tDell Inc.\n58:8B:1C\t\tCisco Systems, Inc\n58:8B:F3\t\tZyxel Communications Corporation\n58:8C:81\t\tEspressif Inc.\n58:8D:09\t\tCisco Systems, Inc\n58:8D:39\t\tMitsubishi Electric Automation (China) Ltd.\n58:8D:64\t\tXi'an Clevbee Technology Co.,Ltd\n58:8E:81\t\tSilicon Laboratories\n58:8F:CF\t\tHangzhou Ezviz Software Co.,Ltd.\n58:90:43\t\tSagemcom Broadband SAS\n58:91:53\t\tChina Mobile IOT Company Limited\n58:91:CF\t\tIntel Corporate\n58:92:0D\t\tKinetic Avionics Limited\n58:93:51\t\tHuawei Device Co., Ltd.\n58:93:96\t\tRuckus Wireless\n58:93:D8\t\tTexas Instruments\n58:93:E8\t\tApple, Inc.\n58:94:6B\t\tIntel Corporate\n58:94:A2\t\tKETEK GmbH\n58:94:AE\t\tHuawei Device Co., Ltd.\n58:94:B2\t\tBrainCo\n58:94:CF\t\tVertex Standard LMR, Inc.\n58:95:7E\t\tHuawei Device Co., Ltd.\n58:95:D8\t\tIEEE Registration Authority\n58:95:D8:00:00:00/28\tShenzhen DOOGEE Hengtong Technology CO.,LTD\n58:95:D8:10:00:00/28\tshenzhen UDD Technologies,co.,Ltd\n58:95:D8:20:00:00/28\tSercomm Corporation.\n58:95:D8:30:00:00/28\tTonnet Telecommunication International Co., Ltd.\n58:95:D8:40:00:00/28\tUnity Surveillance, Inc.\n58:95:D8:50:00:00/28\telgris UG\n58:95:D8:60:00:00/28\tNorgren Manufacturing Co., Ltd.\n58:95:D8:70:00:00/28\tEpiphan Systems Inc\n58:95:D8:80:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n58:95:D8:90:00:00/28\tLoftie\n58:95:D8:A0:00:00/28\tPeak Communications Limited\n58:95:D8:B0:00:00/28\tSuZhou Ruishengwei Intelligent Technology Co.,Ltd\n58:95:D8:C0:00:00/28\tLoctek Ergonomic Technology Corp.\n58:95:D8:D0:00:00/28\tAlunos AG\n58:95:D8:E0:00:00/28\tGmv sistemas SAU\n58:96:0A\t\tLG Electronics\n58:96:1D\t\tIntel Corporate\n58:96:30\t\tVantiva USA LLC\n58:96:71\t\tWistron Neweb Corporation\n58:97:1E\t\tCisco Systems, Inc\n58:97:BD\t\tCisco Systems, Inc\n58:98:35\t\tTechnicolor Delivery Technologies Belgium NV\n58:98:6F\t\tRevolution Display\n58:9A:3E\t\tAmazon Technologies Inc.\n58:9B:0B\t\tShineway Technologies, Inc.\n58:9B:4A\t\tDWnet Technologies(Suzhou) Corporation\n58:9B:F7\t\tHefei Radio Communication Technology Co., Ltd\n58:9C:FC\t\tFreeBSD Foundation\n58:9E:C6\t\tGigaset Communications GmbH\n58:A0:23\t\tIntel Corporate\n58:A0:CB\t\tTrackNet, Inc\n58:A1:5F\t\tTexas Instruments\n58:A2:B5\t\tLG Electronics (Mobile Communications)\n58:A2:E1\t\tMellanox Technologies, Inc.\n58:A4:8E\t\tPixArt Imaging Inc.\n58:A6:39\t\tSamsung Electronics Co.,Ltd\n58:A7:48\t\tLytx\n58:A7:6F\t\tiD corporation\n58:A8:39\t\tIntel Corporate\n58:A8:7B\t\tFitbit, Inc.\n58:A8:E8\t\tAmazon Technologies Inc.\n58:AC:78\t\tCisco Systems, Inc\n58:AD:12\t\tApple, Inc.\n58:AE:2B\t\tHuawei Device Co., Ltd.\n58:AE:A8\t\tHuawei Technologies Co.,Ltd\n58:AE:F1\t\tFiberhome Telecommunication Technologies Co.,LTD\n58:B0:35\t\tApple, Inc.\n58:B0:3E\t\tNintendo Co.,Ltd\n58:B0:D4\t\tZuniData Systems Inc.\n58:B0:FE\t\tTeam EPS GmbH\n58:B1:0F\t\tSamsung Electronics Co.,Ltd\n58:B1:8F\t\tHuawei Device Co., Ltd.\n58:B3:8F\t\tNew H3C Technologies Co., Ltd\n58:B3:FC\t\tShenzhen Rf-Link Technology Co.,Ltd.\n58:B4:2D\t\tYSTen Technology Co.,Ltd\n58:B4:BB\t\tRuijie Networks Co.,LTD\n58:B5:68\t\tSecuritas Direct España, Sau\n58:B6:23\t\tBeijing Xiaomi Mobile Software Co., Ltd\n58:B6:33\t\tRuckus Wireless\n58:B8:58\t\tSz Dji Technology Co.,Ltd\n58:B9:61\t\tSOLEM Electronique\n58:B9:65\t\tApple, Inc.\n58:B9:E1\t\tCrystalfontz America, Inc.\n58:BA:D3\t\tNanjing Casela Technologies Corporation Limited\n58:BA:D4\t\tHuawei Technologies Co.,Ltd\n58:BC:27\t\tCisco Systems, Inc\n58:BC:8F\t\tCognitive Systems Corp.\n58:BD:A3\t\tNintendo Co., Ltd.\n58:BD:F9\t\tSigrand\n58:BE:72\t\tHuawei Technologies Co.,Ltd\n58:BF:25\t\tEspressif Inc.\n58:BF:EA\t\tCisco Systems, Inc\n58:C1:7A\t\tCambium Networks Limited\n58:C2:32\t\tNEC Corporation\n58:C3:56\t\tEM Microelectronic\n58:C3:8B\t\tSamsung Electronics Co.,Ltd\n58:C4:1E\t\tIEEE Registration Authority\n58:C4:1E:00:00:00/28\tGuangzhou TeleStar Communication Consulting Service Co., Ltd\n58:C4:1E:10:00:00/28\tJLZTLink Industry ?Shen Zhen?Co., Ltd.\n58:C4:1E:20:00:00/28\tTruesense Srl\n58:C4:1E:30:00:00/28\tLemco IKE\n58:C4:1E:40:00:00/28\tBeijing Fibrlink Communications Co.,Ltd.\n58:C4:1E:50:00:00/28\tZhejiang Cainiao Supply Chain Management Co.,Ltd\n58:C4:1E:60:00:00/28\tNetChain Co.,Ltd.\n58:C4:1E:70:00:00/28\tHwaCom Systems Inc.\n58:C4:1E:80:00:00/28\tXiaomi EV Technology Co., Ltd.\n58:C4:1E:90:00:00/28\tShenZhen Heng Yue Industry Co.,Ltd\n58:C4:1E:A0:00:00/28\tGeBE Elektronik und Feinwerktechnik GmbH\n58:C4:1E:B0:00:00/28\tPulse Structural Monitoring Ltd\n58:C4:1E:C0:00:00/28\tPQTEL Network Technology Co. , Ltd.\n58:C4:1E:D0:00:00/28\tMunich Electrification GmbH\n58:C4:1E:E0:00:00/28\tBeijing Qiangyun Innovation Technology Co.,Ltd\n58:C5:7E\t\tFiberhome Telecommunication Technologies Co.,LTD\n58:C5:83\t\tItel Mobile Limited\n58:C5:87\t\tAltoBeam Inc.\n58:C5:CB\t\tSamsung Electronics Co.,Ltd\n58:C6:F0\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n58:C7:AC\t\tNew H3C Technologies Co., Ltd\n58:C8:76\t\tChina Mobile (Hangzhou) Information Technology Co., Ltd.\n58:C9:35\t\tChiun Mai Communication System, Inc\n58:CB:52\t\tGoogle, Inc.\n58:CD:C9\t\tCloud Network Technology Singapore Pte. Ltd.\n58:CE:2A\t\tIntel Corporate\n58:CF:4B\t\tLufkin Industries\n58:CF:79\t\tEspressif Inc.\n58:D0:61\t\tHuawei Technologies Co.,Ltd\n58:D0:71\t\tBW Broadcast\n58:D0:8F\t\tIEEE 1904.1 Working Group\n58:D1:5A\t\tTexas Instruments\n58:D2:37\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n58:D3:12\t\tzte corporation\n58:D3:49\t\tApple, Inc.\n58:D3:91\t\tQuectel Wireless Solutions Co.,Ltd.\n58:D5:0A\t\tMurata Manufacturing Co., Ltd.\n58:D5:33\t\tHuaqin Technology Co.,Ltd\n58:D5:6E\t\tD-Link International\n58:D6:1F\t\tUbiquiti Inc\n58:D6:7A\t\tTCPlink\n58:D6:97\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n58:D6:D3\t\tDairy Cheq Inc\n58:D7:59\t\tHuawei Technologies Co.,Ltd\n58:D8:A7\t\tBird Home Automation GmbH\n58:D9:C3\t\tMotorola Mobility LLC, a Lenovo Company\n58:D9:D5\t\tTenda Technology Co.,Ltd.Dongguan branch\n58:DB:09\t\tQuectel Wireless Solutions Co.,Ltd.\n58:DB:15\t\tTecno Mobile Limited\n58:DB:8D\t\tFast Co., Ltd.\n58:DC:6D\t\tExceptional Innovation, Inc.\n58:DF:59\t\tCisco Systems, Inc\n58:E0:2C\t\tMicro Technic A/S\n58:E1:6C\t\tYing Hua Information Technology (Shanghai)Co., LTD\n58:E2:8F\t\tApple, Inc.\n58:E3:26\t\tCompass Technologies Inc.\n58:E3:59\t\tInterroll Software & Electronics GmbH\n58:E4:03\t\tWistron Neweb Corporation\n58:E4:34\t\tJuniper Networks\n58:E4:76\t\tCentron Communications Technologies Fujian Co.,Ltd\n58:E4:88\t\tAmazon Technologies Inc.\n58:E4:EB\t\tFN-LINK TECHNOLOGY Ltd.\n58:E6:36\t\tEVRsafe Technologies\n58:E6:BA\t\tApple, Inc.\n58:E6:C5\t\tEspressif Inc.\n58:E7:47\t\tDeltanet AG\n58:E8:08\t\tAutonics Corporation\n58:E8:73\t\tHANGZHOU DANGBEI NETWORK TECH.Co.,Ltd\n58:E8:76\t\tIEEE Registration Authority\n58:E8:76:00:00:00/28\tZhuhai Raysharp Technology Co.,Ltd\n58:E8:76:10:00:00/28\tBeijing Perabytes IS Technology Co., Ltd\n58:E8:76:20:00:00/28\tCoala Life AB\n58:E8:76:30:00:00/28\tMcWong International Inc\n58:E8:76:40:00:00/28\tProbit Srl\n58:E8:76:50:00:00/28\tBroad Air Technology Co., LTD.\n58:E8:76:60:00:00/28\tDivioTec Inc.\n58:E8:76:70:00:00/28\tChronos Technology Ltd.\n58:E8:76:80:00:00/28\tChengdu Vision-Zenith Technology Co.,Ltd\n58:E8:76:90:00:00/28\tTEM Mobile Limited\n58:E8:76:A0:00:00/28\tShenzhen Digissin Technology\n58:E8:76:B0:00:00/28\tAnnapurna labs\n58:E8:76:C0:00:00/28\tKustom Signals Inc\n58:E8:76:D0:00:00/28\tXiamen Cacamle Technology Co.,Ltd.\n58:E8:76:E0:00:00/28\tBaoruh Electronic Co., Ltd.\n58:EA:1F\t\tBeijing Xiaomi Mobile Software Co., Ltd\n58:EA:FC\t\tELL-IoT Inc\n58:EB:14\t\tProteus Digital Health\n58:EC:E1\t\tNewport Corporation\n58:EC:ED\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n58:ED:99\t\tzte corporation\n58:EE:CE\t\tIcon Time Systems\n58:EF:68\t\tBelkin International Inc.\n58:F1:02\t\tBLU Products Inc.\n58:F2:FC\t\tHuawei Device Co., Ltd.\n58:F3:87\t\tAirios\n58:F3:9C\t\tCisco Systems, Inc\n58:F4:96\t\tSource Chain\n58:F6:7B\t\tXia Men UnionCore Technology LTD.\n58:F6:BF\t\tKyoto University\n58:F8:5C\t\tLLC Proizvodstvennaya Kompania \"TransService\"\n58:F8:D7\t\tHuawei Technologies Co.,Ltd\n58:F9:87\t\tHuawei Technologies Co.,Ltd\n58:F9:8E\t\tSECUDOS GmbH\n58:FB:3E\t\tHuawei Device Co., Ltd.\n58:FB:84\t\tIntel Corporate\n58:FB:96\t\tRuckus Wireless\n58:FC:20\t\tAltice Labs\n58:FC:73\t\tArria Live Media, Inc.\n58:FC:C6\t\tTozo Inc\n58:FC:C8\t\tHoneywell\n58:FC:DB\t\tIEEE Registration Authority\n58:FC:DB:00:00:00/28\tSpang Power Electronics\n58:FC:DB:10:00:00/28\tCertis Technology International\n58:FC:DB:20:00:00/28\tBeseye Cloud Security Co. Ltd.\n58:FC:DB:30:00:00/28\tCustom Biogenic Systems\n58:FC:DB:40:00:00/28\tInforce Computing Inc.\n58:FC:DB:50:00:00/28\tShenzhen Siecom Communication Technology Development Co.,Ltd.\n58:FC:DB:60:00:00/28\tTimex Group USA Inc\n58:FC:DB:70:00:00/28\tPrometheus Security Group Global, Inc.\n58:FC:DB:80:00:00/28\tShanghai Qianjin Electronic Equipment Co. Ltd\n58:FC:DB:90:00:00/28\tHi-Target Surveying Instrument Co., Ltd.\n58:FC:DB:A0:00:00/28\tXmodus Systems GmbH\n58:FC:DB:B0:00:00/28\tSwarco Traffic Systems Gmbh\n58:FC:DB:C0:00:00/28\tExcenon Mobile Technology Co., Ltd.\n58:FC:DB:D0:00:00/28\tXiamen Leelen Technology Co.,Ltd\n58:FC:DB:E0:00:00/28\tApplied Device Technologies\n58:FC:DB:F0:00:00/28\tPrivate\n58:FC:E3\t\tFunshion Online Technologies Co.,Ltd\n58:FD:20\t\tSystemhouse Solutions AB\n58:FD:5D\t\tHangzhou Xinyun technology Co., Ltd.\n58:FD:B1\t\tLG Electronics\n58:FD:BE\t\tShenzhen Taikaida Technology Co., Ltd\n58:FE:7E\t\tzte corporation\n58:FF:A1\t\tzte corporation\n5A:03:BA\t\tWireless Broadband Alliance, Inc\n5A:18:FF\t\tFiRa Consortium\n5A:55:AD\t\tDisruptive Cities SAPI DE CV\n5A:6B:B4\t\tXconn Technologies\n5A:73:CF\t\tGogo Business Aviation\n5A:CB:D3\t\tSimaudio Ltd\n5A:E6:60\t\tnyantec GmbH\n5A:ED:67\t\tGoldiLink Technology Corp.\n5C:00:38\t\tViasat Group S.p.A.\n5C:01:3B\t\tEspressif Inc.\n5C:02:14\t\tBeijing Xiaomi Mobile Software Co., Ltd\n5C:02:6A\t\tApplied Vision Corporation\n5C:02:72\t\tSilicon Laboratories\n5C:03:39\t\tHuawei Technologies Co.,Ltd\n5C:04:5A\t\tCompany NA Stage & Light\n5C:06:10\t\tCisco Meraki\n5C:07:58\t\tUfispace Co., LTD.\n5C:07:6F\t\tThought Creator\n5C:07:A4\t\tCiena Corporation\n5C:07:A6\t\tHuawei Technologies Co.,Ltd\n5C:09:47\t\tApple, Inc.\n5C:09:79\t\tHuawei Technologies Co.,Ltd\n5C:0A:5B\t\tSamsung Electro Mechanics Co., Ltd.\n5C:0B:3B\t\tHuawei Technologies Co.,Ltd\n5C:0B:CA\t\tTunstall Nordic AB\n5C:0C:0E\t\tGuizhou Huaxintong Semiconductor Technology Co Ltd\n5C:0C:BB\t\tCELIZION Inc.\n5C:0C:E6\t\tNintendo Co.,Ltd\n5C:0E:8B\t\tExtreme Networks Headquarters\n5C:0F:FB\t\tAmino Communications Ltd\n5C:10:1E\t\tzte corporation\n5C:10:C5\t\tSamsung Electronics Co.,Ltd\n5C:11:93\t\tSeal One AG\n5C:13:CC\t\tApple, Inc.\n5C:14:37\t\tThyssenkrupp Aufzugswerke GmbH\n5C:14:EB\t\tTrident IoT\n5C:15:15\t\tAdvan\n5C:15:C5\t\tShenzhen SSC Technology Co. Ltd\n5C:15:E1\t\tAidc Technology (S) Pte Ltd\n5C:16:48\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n5C:16:7D\t\tHuawei Technologies Co.,Ltd\n5C:16:C7\t\tArista Networks\n5C:17:20\t\tHuawei Device Co., Ltd.\n5C:17:37\t\tI-View Now, LLC.\n5C:17:83\t\tEdgecore Americas Networking Corporation\n5C:17:CF\t\tOnePlus Technology (Shenzhen) Co., Ltd\n5C:17:D3\t\tLge\n5C:18:B5\t\tTalon Communications\n5C:18:DD\t\tCig Shanghai Co Ltd\n5C:19:23\t\tHangzhou Lanly Technology Co., Ltd.\n5C:1A:6F\t\tCambridge Industries(Group) Co.,Ltd.\n5C:1B:F4\t\tApple, Inc.\n5C:1C:B9\t\tvivo Mobile Communication Co., Ltd.\n5C:1D:D9\t\tApple, Inc.\n5C:20:D0\t\tAsoni Communication Co., Ltd.\n5C:21:67\t\tRockwell Automation\n5C:22:C4\t\tDae Eun Eletronics Co., Ltd\n5C:22:DA\t\tVantiva USA LLC\n5C:23:16\t\tSquirrels Research Labs LLC\n5C:24:1F\t\tQingdao Haier Technology Co.,Ltd\n5C:24:43\t\tO-Sung Telecom Co., Ltd.\n5C:24:79\t\tBaltech AG\n5C:24:E2\t\tSuzhou Denbom Electronic S&T Co., Ltd\n5C:25:4C\t\tAvire Global Pte Ltd\n5C:25:73\t\tMellanox Technologies, Inc.\n5C:26:0A\t\tDell Inc.\n5C:26:23\t\tWaveLynx Technologies Corporation\n5C:27:63\t\tItibia Technologies\n5C:27:D4\t\tShenzhen Qihu Intelligent Technology Company Limited\n5C:28:86\t\tInventec(Chongqing) Corporation\n5C:2A:EF\t\tr2p Asia-Pacific Pty Ltd\n5C:2B:F5\t\tVivint Wireless Inc.\n5C:2D:08\t\tSubeca\n5C:2E:59\t\tSamsung Electronics Co.,Ltd\n5C:2E:D2\t\tABC(XiSheng) Electronics Co.,Ltd\n5C:2F:AF\t\tHomeWizard B.V.\n5C:31:3E\t\tTexas Instruments\n5C:31:92\t\tCisco Systems, Inc\n5C:32:C5\t\tTeracom Ltd.\n5C:33:27\t\tSpazio Italia srl\n5C:33:5C\t\tSwissphone Telecom AG\n5C:33:7B\t\tGoogle, Inc.\n5C:33:8E\t\tAlpha Networks Inc.\n5C:34:00\t\tHisense Electric Co.,Ltd\n5C:34:5B\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n5C:35:3B\t\tCompal Broadband Networks, Inc.\n5C:35:48\t\tAditya Infotech Ltd.\n5C:35:DA\t\tThere Corporation Oy\n5C:35:FC\t\tActiontec Electronics Inc.\n5C:36:B8\t\tTCL King Electrical Appliances (Huizhou) Co., Ltd\n5C:38:E0\t\tShanghai Super Electronics Technology Co.,LTD\n5C:3A:3D\t\tzte corporation\n5C:3A:45\t\tChongqing Fugui Electronics Co.,Ltd.\n5C:3B:35\t\tGehirn Inc.\n5C:3C:27\t\tSamsung Electronics Co.,Ltd\n5C:3E:06\t\tCisco Systems, Inc\n5C:3E:1B\t\tApple, Inc.\n5C:40:58\t\tJefferson Audio Video Systems, Inc.\n5C:40:71\t\tXiaomi Communications Co Ltd\n5C:40:E3\t\tNovaon\n5C:41:5A\t\tAmazon.com, LLC\n5C:41:E7\t\tWiatec International Ltd.\n5C:43:D2\t\tHazemeyer\n5C:44:3E\t\tSkullcandy\n5C:45:27\t\tJuniper Networks\n5C:46:B0\t\tSIMCom Wireless Solutions Limited\n5C:47:5E\t\tRing LLC\n5C:48:42\t\tHangzhou Anysoft Information Technology Co. , Ltd\n5C:49:79\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n5C:49:7D\t\tSamsung Electronics Co.,Ltd\n5C:49:FA\t\tShenzhen Guowei Shidai Communication Equipement Co., Ltd\n5C:4A:1F\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n5C:4A:26\t\tEnguity Technology Corp\n5C:4C:A9\t\tHuawei Technologies Co.,Ltd\n5C:4D:BF\t\tzte corporation\n5C:4E:EE\t\tAltoBeam Inc.\n5C:50:15\t\tCisco Systems, Inc\n5C:50:D9\t\tApple, Inc.\n5C:51:4F\t\tIntel Corporate\n5C:51:81\t\tSamsung Electronics Co.,Ltd\n5C:51:88\t\tMotorola Mobility LLC, a Lenovo Company\n5C:52:1E\t\tNintendo Co.,Ltd\n5C:52:30\t\tApple, Inc.\n5C:52:84\t\tApple, Inc.\n5C:53:10\t\tNanjing Qinheng Microelectronics Co., Ltd.\n5C:53:B4\t\tEM Microelectronic\n5C:53:C3\t\tUbee Interactive Co., Limited\n5C:54:6D\t\tHuawei Technologies Co.,Ltd\n5C:55:78\t\tiryx corp\n5C:56:A4\t\tWanan Hongsheng Electronic Co.Ltd\n5C:56:ED\t\t3pleplay Electronics Private Limited\n5C:57:1A\t\tCommscope\n5C:57:9E\t\tChiun Mai Communication System, Inc\n5C:57:C8\t\tNokia Corporation\n5C:58:19\t\tJingsheng Technology Co., Ltd.\n5C:58:E6\t\tPalo Alto Networks\n5C:59:48\t\tApple, Inc.\n5C:5A:4C\t\tIEEE Registration Authority\n5C:5A:4C:00:00:00/28\tJinchuan Group Co.,Ltd\n5C:5A:4C:10:00:00/28\tOrchid Products Limited\n5C:5A:4C:20:00:00/28\tITS Partner (O.B.S) S.L.\n5C:5A:4C:30:00:00/28\tFerroamp AB (publ)\n5C:5A:4C:40:00:00/28\tYihua Communications(Huizhou)Co.,Ltd\n5C:5A:4C:50:00:00/28\tAnnapurna labs\n5C:5A:4C:60:00:00/28\tShenzhen Sunsoont Technology Co.,Ltd\n5C:5A:4C:70:00:00/28\tAce Computers\n5C:5A:4C:80:00:00/28\tSpot AI, Inc.\n5C:5A:4C:90:00:00/28\tLinktech Systerm Technology Co.,Ltd\n5C:5A:4C:A0:00:00/28\tChengdu Skysoft Info&Tech Co.,Ltd.\n5C:5A:4C:B0:00:00/28\tEsme Solutions\n5C:5A:4C:C0:00:00/28\ttarm AG\n5C:5A:4C:D0:00:00/28\tAeva, Inc.\n5C:5A:4C:E0:00:00/28\tAi-Rider Corporation\n5C:5A:C7\t\tCisco Systems, Inc\n5C:5A:EA\t\tFord\n5C:5B:35\t\tMist Systems, Inc.\n5C:5B:C2\t\tYIK Corporation\n5C:5D:EC\t\tJiangSu Newcom Optical&Electrical Communication CO Ltd\n5C:5E:0A\t\tSamsung Electronics Co.,Ltd\n5C:5E:AB\t\tJuniper Networks\n5C:5E:BB\t\tHuawei Technologies Co.,Ltd\n5C:5F:67\t\tIntel Corporate\n5C:60:BA\t\tHP Inc.\n5C:61:52\t\tNXP Semiconductor (Tianjin) LTD.\n5C:61:99\t\tCloud Network Technology Singapore Pte. Ltd.\n5C:62:5A\t\tCanon Inc.\n5C:62:8B\t\tTP-Link Systems Inc\n5C:63:BF\t\tTp-Link Technologies Co.,Ltd.\n5C:63:C9\t\tIntellithings Ltd.\n5C:64:0F\t\tSage Technologies Inc.\n5C:64:7A\t\tHuawei Technologies Co.,Ltd\n5C:64:8E\t\tZyxel Communications Corporation\n5C:64:F1\t\tCisco Systems, Inc\n5C:64:F3\t\tsywinkey HongKong Co,. Limited?\n5C:66:6C\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n5C:67:76\t\tIDS Imaging Development Systems GmbH\n5C:67:83\t\tIntel Corporate\n5C:68:D0\t\tAurora Innovation Inc.\n5C:69:84\t\tNuvico\n5C:6A:7D\t\tKentkart Ege Elektronik San. Ve Tic. Ltd. Sti.\n5C:6A:80\t\tZyxel Communications Corporation\n5C:6A:EC\t\tIEEE Registration Authority\n5C:6A:EC:00:00:00/28\tAcuity Brands Lighting\n5C:6A:EC:10:00:00/28\tShanghai Smilembb Technology Co.,LTD\n5C:6A:EC:20:00:00/28\tShenzhen Mingyue Technology lnnovation Co.,Ltd\n5C:6A:EC:30:00:00/28\tShanghai Yunsilicon Technology Co., Ltd.\n5C:6A:EC:40:00:00/28\tGeneTouch Corp.\n5C:6A:EC:50:00:00/28\tExaterra Ltd.\n5C:6A:EC:60:00:00/28\tFemtocell\n5C:6A:EC:70:00:00/28\tNippon Pulse Motor Co., Ltd.\n5C:6A:EC:80:00:00/28\tOptiver Services B.V.\n5C:6A:EC:90:00:00/28\tShanghai Alway Information Technology Co., Ltd\n5C:6A:EC:A0:00:00/28\tShenzhen Olax Technology CO.,Ltd\n5C:6A:EC:B0:00:00/28\tShenzhen Anked vision Electronics Co.Ltd\n5C:6A:EC:C0:00:00/28\tSuzhou Huaqi Intelligent Technology Co., Ltd.\n5C:6A:EC:D0:00:00/28\tDarkVision Technologies Inc.\n5C:6A:EC:E0:00:00/28\tSaab Seaeye Ltd\n5C:6B:32\t\tTexas Instruments\n5C:6B:4F\t\tHello Inc.\n5C:6B:D7\t\tFoshan VIOMI Electric Appliance Technology Co. Ltd.\n5C:6D:20\t\tHon Hai Precision Ind. Co.,Ltd.\n5C:6F:4F\t\tS.A. Sistel\n5C:6F:69\t\tBroadcom Limited\n5C:70:17\t\tApple, Inc.\n5C:70:75\t\tHuawei Technologies Co.,Ltd\n5C:70:A3\t\tLG Electronics (Mobile Communications)\n5C:71:0D\t\tCisco Systems, Inc\n5C:75:45\t\tWayties, Inc.\n5C:75:AF\t\tFitbit, Inc.\n5C:75:C6\t\tChina Mobile Group Device Co.,Ltd.\n5C:76:95\t\tVantiva USA LLC\n5C:76:D5\t\tNokia\n5C:77:57\t\tHaivision Network Video\n5C:77:76\t\tTCT mobile ltd\n5C:78:F8\t\tHuawei Device Co., Ltd.\n5C:7B:5C\t\tShenzhen SDMC Technology CO.,Ltd.\n5C:7D:5E\t\tHuawei Technologies Co.,Ltd\n5C:7D:7D\t\tVantiva USA LLC\n5C:7D:AE\t\tzte corporation\n5C:7D:F3\t\tFiberhome Telecommunication Technologies Co.,LTD\n5C:80:B6\t\tIntel Corporate\n5C:81:A7\t\tNetwork Devices Pty Ltd\n5C:83:6C\t\tRuckus Wireless\n5C:83:82\t\tNokia\n5C:83:8F\t\tCisco Systems, Inc\n5C:83:CD\t\tNew platforms\n5C:84:3C\t\tSony Interactive Entertainment Inc.\n5C:84:86\t\tBrightsource Industries Israel LTD\n5C:85:7E\t\tIEEE Registration Authority\n5C:85:7E:00:00:00/28\t28 Gorilla\n5C:85:7E:10:00:00/28\tSichuan C.H Control Technology Co., Ltd.\n5C:85:7E:20:00:00/28\tmobilogix HongKong\n5C:85:7E:30:00:00/28\tCable Matters Inc.\n5C:85:7E:40:00:00/28\tShenzhen IP3 Century Intelligent Technology CO.,Ltd\n5C:85:7E:50:00:00/28\tShanghai Yanhe automation technology co.,LTD\n5C:85:7E:60:00:00/28\tProdataKey\n5C:85:7E:70:00:00/28\tBeijing HZFD Technology Co., Ltd\n5C:85:7E:80:00:00/28\tBeiJing Xinsheng Technology Co.,Ltd\n5C:85:7E:90:00:00/28\tExpress LUCK Industrial Ltd.\n5C:85:7E:A0:00:00/28\tZhejiang Jetron Ark Digital Technology Co., Ltd\n5C:85:7E:B0:00:00/28\tHHCC Plant Technology Co., Ltd.\n5C:85:7E:C0:00:00/28\tAnnapurna labs\n5C:85:7E:D0:00:00/28\tNautech Electronics Ltd\n5C:85:7E:E0:00:00/28\tGuoyi Liangzi (Hefei) Technology Co., Ltd(CIQTEK)\n5C:85:F8\t\tShenzhen Kaifa Technology Co.,Ltd.\n5C:86:13\t\tBeijing Zhoenet Technology Co., Ltd\n5C:86:4A\t\tSecret Labs LLC\n5C:86:5C\t\tSamsung Electronics Co.,Ltd\n5C:86:C1\t\tDongguan Solum Electronics Co.,Ltd\n5C:87:30\t\tApple, Inc.\n5C:87:78\t\tCybertelbridge co.,ltd\n5C:87:9C\t\tIntel Corporate\n5C:87:D8\t\tIEEE Registration Authority\n5C:87:D8:00:00:00/28\tNanjing Shufan Information Technology Co., Ltd.\n5C:87:D8:10:00:00/28\tCOMET SYSTEM, s.r.o.\n5C:87:D8:20:00:00/28\tFreeus LLC\n5C:87:D8:30:00:00/28\tShenzhen Beiens Import and Export Co.,Ltd\n5C:87:D8:40:00:00/28\tTelfi Technologies Private Limited\n5C:87:D8:50:00:00/28\tHangzhou Advanced Intelligent Manufacturing Systems Co.,Ltd.\n5C:87:D8:60:00:00/28\tShanghai Jianyi Technology Co., Ltd\n5C:87:D8:70:00:00/28\tTradewinds Networks Incorporated\n5C:87:D8:80:00:00/28\tfmad engineering\n5C:87:D8:90:00:00/28\tAnnapurna labs\n5C:87:D8:A0:00:00/28\tPiscis Networks Private Limited\n5C:87:D8:B0:00:00/28\tCredo Diagnostics Biomedical Pte. Ltd. Taiwan branch(SINGAPORE)\n5C:87:D8:C0:00:00/28\tDragonglass Technology(Shenzhen)Co.,Ltd.\n5C:87:D8:D0:00:00/28\tZilia Technologies\n5C:87:D8:E0:00:00/28\tBeijing Townsky Technology Co.,Ltd\n5C:88:16\t\tRockwell Automation\n5C:89:9A\t\tTp-Link Technologies Co.,Ltd.\n5C:89:D4\t\tBeijing Banner Electric Co.,Ltd\n5C:89:E6\t\tRichard Wolf GmbH\n5C:8A:38\t\tHewlett Packard\n5C:8A:AE\t\tChina Dragon Technology Limited\n5C:8B:6B\t\tAmazon Technologies Inc.\n5C:8C:30\t\tTaicang T&W Electronics\n5C:8D:2D\t\tShanghai Wellpay Information Technology Co., Ltd\n5C:8D:4E\t\tApple, Inc.\n5C:8D:E5\t\tDelta Electronics, Inc.\n5C:8E:10\t\tTimeWatch Infocom Pvt. Ltd.\n5C:8E:8B\t\tShenzhen Linghai Electronics Co.,Ltd\n5C:8F:40\t\tTecno Mobile Limited\n5C:8F:E0\t\tCommscope\n5C:90:12\t\tOwl Cyber Defense Solutions, LLC\n5C:91:57\t\tHuawei Technologies Co.,Ltd\n5C:91:75\t\tApple, Inc.\n5C:91:FD\t\tJaewoncnc\n5C:92:5E\t\tZioncom Electronics (Shenzhen) Ltd.\n5C:93:A2\t\tLiteon Technology Corporation\n5C:94:62\t\tShenzhen Jiuzhou Electric Co.,LTD\n5C:95:AE\t\tApple, Inc.\n5C:96:56\t\tAzureWave Technology Inc.\n5C:96:66\t\tSony Interactive Entertainment Inc.\n5C:96:6A\t\tRtnet\n5C:96:9D\t\tApple, Inc.\n5C:97:F3\t\tApple, Inc.\n5C:99:60\t\tSamsung Electronics Co.,Ltd\n5C:99:77\t\tApple, Inc.\n5C:9A:A1\t\tHuawei Device Co., Ltd.\n5C:9A:D8\t\tFujitsu Limited\n5C:9B:A6\t\tApple, Inc.\n5C:A0:6C\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n5C:A1:76\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n5C:A1:78\t\tTableTop Media (dba Ziosk)\n5C:A1:E0\t\tEmbedWay Technologies\n5C:A3:9D\t\tSamsung Electro Mechanics Co., Ltd.\n5C:A3:EB\t\tSKODA DIGITAL s.r.o.\n5C:A4:36\t\tShenzhen G-world Technology Incorporated Company\n5C:A4:7D\t\tHewlett Packard Enterprise\n5C:A4:8A\t\tCisco Systems, Inc\n5C:A4:A4\t\tFiberhome Telecommunication Technologies Co.,LTD\n5C:A4:F4\t\tzte corporation\n5C:A5:BC\t\teero inc.\n5C:A6:2D\t\tCisco Systems, Inc\n5C:A6:4F\t\tTP-Link Systems Inc.\n5C:A6:E6\t\tTP-Link Systems Inc\n5C:A7:21\t\tNew H3C Technologies Co., Ltd\n5C:A8:6A\t\tHuawei Technologies Co.,Ltd\n5C:A9:33\t\tLuma Home\n5C:AA:FD\t\tSonos, Inc.\n5C:AC:3D\t\tSamsung Electronics Co.,Ltd\n5C:AC:4C\t\tHon Hai Precision Ind. Co.,Ltd.\n5C:AD:76\t\tShenzhen TCL New Technology Co., Ltd\n5C:AD:BA\t\tApple, Inc.\n5C:AD:CF\t\tApple, Inc.\n5C:AF:06\t\tLG Electronics (Mobile Communications)\n5C:B0:0A\t\tHuawei Technologies Co.,Ltd\n5C:B0:66\t\tCommscope\n5C:B1:2E\t\tCisco Systems, Inc\n5C:B1:3E\t\tSagemcom Broadband SAS\n5C:B1:5F\t\tOceanblue Cloud Technology Limited\n5C:B2:60\t\tEM Microelectronic\n5C:B2:6D\t\tIntel Corporate\n5C:B2:9E\t\tASCO Power Technologies\n5C:B3:95\t\tHuawei Technologies Co.,Ltd\n5C:B3:F6\t\tHuman, Incorporated\n5C:B4:3E\t\tHuawei Technologies Co.,Ltd\n5C:B4:7E\t\tIntel Corporate\n5C:B4:E2\t\tInspur Software Group Ltd.\n5C:B5:24\t\tSony Corporation\n5C:B5:59\t\tCNEX Labs\n5C:B6:CC\t\tNovaComm Technologies Inc.\n5C:B8:CB\t\tAllis Communications\n5C:B9:01\t\tHewlett Packard\n5C:BA:2C\t\tHewlett Packard Enterprise\n5C:BA:37\t\tMicrosoft Corporation\n5C:BA:EF\t\tChongqing Fugui Electronics Co.,Ltd.\n5C:BB:EE\t\tzte corporation\n5C:BD:9A\t\tHuawei Device Co., Ltd.\n5C:BD:9E\t\tHongkong Miracle Eagle Technology(Group) Limited\n5C:BE:05\t\tIspec\n5C:BE:69\t\tOraimo Technology Limited\n5C:C0:A0\t\tHuawei Technologies Co.,Ltd\n5C:C1:D7\t\tSamsung Electronics Co.,Ltd\n5C:C1:F2\t\tHuawei Technologies Co.,Ltd\n5C:C2:13\t\tFr. Sauter AG\n5C:C3:07\t\tHuawei Technologies Co.,Ltd\n5C:C3:36\t\tittim\n5C:C5:63\t\tHunan Fn-Link Technology Limited\n5C:C5:D4\t\tIntel Corporate\n5C:C6:D0\t\tSkyworth Digital Technology(Shenzhen) Co.,Ltd\n5C:C6:E9\t\tEdifier International\n5C:C7:87\t\tHuawei Device Co., Ltd.\n5C:C7:C1\t\tSilicon Laboratories\n5C:C7:D7\t\tAzroad Technology Company Limited\n5C:C8:E3\t\tShintec Hozumi co.ltd.\n5C:C9:99\t\tNew H3C Technologies Co., Ltd\n5C:C9:C0\t\tRenesas Electronics (Penang) Sdn. Bhd.\n5C:C9:D3\t\tPalladium Energy Eletronica Da Amazonia Ltda\n5C:CA:1A\t\tMicrosoft Mobile Oy\n5C:CA:32\t\tTheben AG\n5C:CA:D3\t\tChipsea Technologies (Shenzhen) Corp.\n5C:CB:99\t\tSamsung Electronics Co.,Ltd\n5C:CB:CA\t\tFujian Star-Net Communication Co.,Ltd\n5C:CC:A0\t\tGridwiz Inc.\n5C:CC:FF\t\tTechroutes Network Pvt Ltd\n5C:CD:5B\t\tIntel Corporate\n5C:CD:7C\t\tMEIZU Technology Co.,Ltd.\n5C:CD:A8\t\tItel Mobile Limited\n5C:CE:AD\t\tCDYNE Corporation\n5C:CF:7F\t\tEspressif Inc.\n5C:D0:6E\t\tXiaomi Communications Co Ltd\n5C:D1:35\t\tXtreme Power Systems\n5C:D2:0B\t\tYytek Co., Ltd.\n5C:D2:E4\t\tIntel Corporate\n5C:D4:1B\t\tUCZOON Technology Co., LTD\n5C:D4:AB\t\tZektor\n5C:D5:B5\t\tShenzhen WiSiYiLink Technology Co.,Ltd\n5C:D6:1F\t\tQardio, Inc\n5C:D8:9E\t\tHuawei Device Co., Ltd.\n5C:D9:98\t\tD-Link Corporation\n5C:DA:D4\t\tMurata Manufacturing Co., Ltd.\n5C:DB:36\t\tCalix Inc.\n5C:DC:49\t\tSamsung Electronics Co.,Ltd\n5C:DC:96\t\tArcadyan Technology Corporation\n5C:DD:70\t\tHangzhou H3C Technologies Co., Limited\n5C:DE:34\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\n5C:DF:89\t\tRuckus Wireless\n5C:DF:B8\t\tShenzhen Unionmemory Information System Limited\n5C:E0:C5\t\tIntel Corporate\n5C:E0:CA\t\tFeiTian United (Beijing) System Technology Co., Ltd.\n5C:E0:F6\t\tNIC.br- Nucleo de Informacao e Coordenacao do Ponto BR\n5C:E1:76\t\tCisco Systems, Inc\n5C:E1:A4\t\tPleneo\n5C:E2:23\t\tDelphin Technology AG\n5C:E2:86\t\tNortel Networks\n5C:E2:8C\t\tZyxel Communications Corporation\n5C:E2:F4\t\tAcSiP Technology Corp.\n5C:E3:0E\t\tCommscope\n5C:E3:B6\t\tFiberhome Telecommunication Technologies Co.,LTD\n5C:E4:2A\t\tIntel Corporate\n5C:E5:0C\t\tBeijing Xiaomi Mobile Software Co., Ltd\n5C:E6:88\t\tVECOS Europe B.V.\n5C:E7:47\t\tHuawei Technologies Co.,Ltd\n5C:E7:53\t\tPrivate\n5C:E7:A0\t\tNokia\n5C:E7:BF\t\tNew Singularity International Technical Development Co.,Ltd\n5C:E8:83\t\tHuawei Technologies Co.,Ltd\n5C:E8:B7\t\tOraimo Technology Limited\n5C:E8:D3\t\tSignalinks Communication Technology Co., Ltd\n5C:E8:EB\t\tSamsung Electronics Co.,Ltd\n5C:E9:1E\t\tApple, Inc.\n5C:E9:31\t\tTP-Link Systems Inc\n5C:EA:1D\t\tHon Hai Precision Ind. Co.,Ltd.\n5C:EB:4E\t\tR. STAHL HMI Systems GmbH\n5C:EB:52\t\tzte corporation\n5C:EB:68\t\tCheerstar Technology Co., Ltd\n5C:ED:8C\t\tHewlett Packard Enterprise\n5C:ED:F4\t\tSamsung Electronics Co.,Ltd\n5C:EE:79\t\tGlobal Digitech Co LTD\n5C:F2:07\t\tSpeco Technologies\n5C:F2:86\t\tIEEE Registration Authority\n5C:F2:86:00:00:00/28\tHangzhou Signwei Electronics Technology Co., Ltd\n5C:F2:86:10:00:00/28\tiSon Tech\n5C:F2:86:20:00:00/28\tShanghai Notion Information Technology CO.,LTD.\n5C:F2:86:30:00:00/28\tbeijing your wonderful control system technology co.,ltd\n5C:F2:86:40:00:00/28\tCHIPSEN Co.,Ltd.\n5C:F2:86:50:00:00/28\tEUROIMMUN Medizinische Labordiagnostika AG\n5C:F2:86:60:00:00/28\tVPInstruments\n5C:F2:86:70:00:00/28\tAccess IS\n5C:F2:86:80:00:00/28\tShenzhen Hivt Technology Co.,Ltd\n5C:F2:86:90:00:00/28\tShenzhen VST Automotive Electronics Co., LTD\n5C:F2:86:A0:00:00/28\tUnfors Raysafe AB\n5C:F2:86:B0:00:00/28\tItron UK Limited\n5C:F2:86:C0:00:00/28\tSunpet Industries Limited\n5C:F2:86:D0:00:00/28\tBrightSky, LLC\n5C:F2:86:E0:00:00/28\tDaisen Electronic Industrial Co., Ltd.\n5C:F3:70\t\tCC&C Technologies, Inc\n5C:F3:FC\t\tIBM Corp\n5C:F4:AB\t\tZyxel Communications Corporation\n5C:F5:0D\t\tInstitute of microelectronic applications\n5C:F5:1A\t\tZhejiang Dahua Technology Co., Ltd.\n5C:F5:DA\t\tApple, Inc.\n5C:F6:DC\t\tSamsung Electronics Co.,Ltd\n5C:F7:96\t\tNew H3C Technologies Co., Ltd\n5C:F7:C3\t\tSyntech (Hk) Technology Limited\n5C:F7:E6\t\tApple, Inc.\n5C:F8:21\t\tTexas Instruments\n5C:F8:38\t\tIEEE Registration Authority\n5C:F8:38:00:00:00/28\tHunan Guoke supercomputer Technologu Co.,LTD\n5C:F8:38:10:00:00/28\tBergische Ingenieure GmbH\n5C:F8:38:20:00:00/28\tThe idiot company\n5C:F8:38:30:00:00/28\tShenzhen Tuozhu Technology Co., Ltd.\n5C:F8:38:40:00:00/28\tShanghai Zenchant Electornics Co.,LTD\n5C:F8:38:50:00:00/28\tDesignA Electronics Limited\n5C:F8:38:60:00:00/28\tKunshan Baifeng Intelligent Technology Co.,Ltd\n5C:F8:38:70:00:00/28\tT-Chip Intelligent Technology Co.,Ltd.\n5C:F8:38:80:00:00/28\tStonex srl\n5C:F8:38:90:00:00/28\tBenison Tech\n5C:F8:38:A0:00:00/28\tSemsotec GmbH\n5C:F8:38:B0:00:00/28\ttrilogik GmbH\n5C:F8:38:C0:00:00/28\tSichuan Zhongguang Lightning Protection Technologies Co., Ltd.\n5C:F8:38:D0:00:00/28\tWatts A\\S\n5C:F8:38:E0:00:00/28\tGuangzhou Duge Technology Co.,LTD\n5C:F8:A1\t\tMurata Manufacturing Co., Ltd.\n5C:F9:38\t\tApple, Inc.\n5C:F9:6A\t\tHuawei Technologies Co.,Ltd\n5C:F9:DD\t\tDell Inc.\n5C:F9:F0\t\tAtomos Engineering P/L\n5C:F9:FD\t\tTaicang T&W Electronics\n5C:FA:25\t\tSagemcom Broadband SAS\n5C:FA:5A\t\tSinepower Lda\n5C:FA:FB\t\tAcubit\n5C:FB:3A\t\tChongqing Fugui Electronics Co.,Ltd.\n5C:FB:7C\t\tShenzhen Jingxun Software Telecommunication Technology Co.,Ltd\n5C:FC:66\t\tCisco Systems, Inc\n5C:FC:6E\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n5C:FC:E1\t\tResideo\n5C:FE:9E\t\tWiwynn Corporation Tainan Branch\n5C:FF:35\t\tWistron Corporation\n5C:FF:FF\t\tShenzhen Kezhonglong Optoelectronic Technology Co., Ltd\n60:01:94\t\tEspressif Inc.\n60:01:B1\t\tHuawei Technologies Co.,Ltd\n60:02:92\t\tPegatron Corporation\n60:02:B4\t\tWistron Neweb Corporation\n60:03:08\t\tApple, Inc.\n60:03:0C\t\tShenzhen YOUHUA Technology Co., Ltd\n60:03:47\t\tBillion Electric Co. Ltd.\n60:03:A6\t\tInteno Broadband Technology AB\n60:04:17\t\tPosbank Co.,Ltd\n60:04:5C\t\tNXP Semiconductor (Tianjin) LTD.\n60:05:8A\t\tHitachi Metals, Ltd.\n60:06:E3\t\tApple, Inc.\n60:07:7C\t\tJala Group\n60:07:C4\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n60:08:10\t\tHuawei Technologies Co.,Ltd\n60:08:37\t\tivvi Scientific(Nanchang)Co.Ltd\n60:09:C3\t\tu-blox AG\n60:0A:8C\t\tShenzhen Sundray Technologies company Limited\n60:0B:03\t\tHangzhou H3C Technologies Co., Limited\n60:0F:6B\t\tApple, Inc.\n60:0F:77\t\tSilverPlus, Inc\n60:10:9E\t\tHuawei Technologies Co.,Ltd\n60:10:A2\t\tCrompton Instruments\n60:11:99\t\tSiama Systems Inc\n60:12:3C\t\tHuawei Technologies Co.,Ltd\n60:12:83\t\tTsb Real Time Location Systems S.L.\n60:12:8B\t\tCanon Inc.\n60:14:66\t\tzte corporation\n60:14:B3\t\tCyberTAN Technology Inc.\n60:15:21\t\tRedarc Electronics\n60:15:2B\t\tPalo Alto Networks\n60:15:92\t\tIEEE Registration Authority\n60:15:92:00:00:00/28\tS Labs sp. z o.o.\n60:15:92:10:00:00/28\tRTDS Technologies Inc.\n60:15:92:20:00:00/28\tEDA Technology Co.,LTD\n60:15:92:30:00:00/28\tOsi Technology Co.,Ltd.\n60:15:92:40:00:00/28\tZaptec\n60:15:92:50:00:00/28\tComfit HealthCare Devices Limited\n60:15:92:60:00:00/28\tBeijing Kuangshi Technology Co., Ltd\n60:15:92:70:00:00/28\tUnipi Technology s.r.o.\n60:15:92:80:00:00/28\tYangzhou Wanfang Electronic Technology,CO .,Ltd.\n60:15:92:90:00:00/28\tJiangsu Sunfy Technologies Holding Co.,Ltd.\n60:15:92:A0:00:00/28\tinsensiv GmbH\n60:15:92:B0:00:00/28\tAnnapurna labs\n60:15:92:C0:00:00/28\tPSS Co., Ltd\n60:15:92:D0:00:00/28\tRemowireless Communication International Co.,Limited\n60:15:92:E0:00:00/28\tAnnapurna labs\n60:15:C7\t\tIdaTech\n60:18:03\t\tDaikin Air-conditioning (Shanghai) Co., Ltd.\n60:18:2E\t\tShenZhen Protruly Electronic Ltd co.\n60:18:3A\t\tHuawei Device Co., Ltd.\n60:18:88\t\tzte corporation\n60:18:95\t\tDell Inc.\n60:19:0C\t\tRramac\n60:19:29\t\tVoltronic Power Technology(Shenzhen) Corp.\n60:19:70\t\tHuizhou Qiaoxing Electronics Technology Co., Ltd.\n60:19:71\t\tCommscope\n60:1A:4F\t\tBeijing China Electronics Intelligent Acoustics Technology Co.,Ltd\n60:1A:C7\t\tNintendo Co.,Ltd\n60:1B:52\t\tVodafone Italia S.p.A.\n60:1D:0F\t\tMidnite Solar\n60:1D:16\t\tMed-Eng Holdings ULC\n60:1D:56\t\tExtreme Networks Headquarters\n60:1D:91\t\tMotorola Mobility LLC, a Lenovo Company\n60:1D:9D\t\tSichuan AI-Link Technology Co., Ltd.\n60:1E:02\t\tEltexAlatau\n60:1E:98\t\tAxevast Technology\n60:21:01\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n60:21:03\t\tI4Vine, Inc\n60:21:C0\t\tMurata Manufacturing Co., Ltd.\n60:22:32\t\tUbiquiti Inc\n60:23:A4\t\tSichuan AI-Link Technology Co., Ltd.\n60:24:C1\t\tJiangsu Zhongxun Electronic Technology Co., Ltd\n60:26:02\t\tTexas Instruments\n60:26:AA\t\tCisco Systems, Inc\n60:26:EF\t\tHewlett Packard Enterprise\n60:27:1C\t\tVIDEOR E. Hartig GmbH\n60:29:2B\t\tTp-Link Technologies Co.,Ltd.\n60:29:D5\t\tDAVOLINK Inc.\n60:2A:1B\t\tJancus\n60:2A:54\t\tCardioTek B.V.\n60:2A:D0\t\tCisco SPVTG\n60:2B:58\t\tEM Microelectronic\n60:2D:74\t\tExtreme Networks Headquarters\n60:2E:20\t\tHuawei Technologies Co.,Ltd\n60:30:B3\t\tHuawei Technologies Co.,Ltd\n60:30:D4\t\tApple, Inc.\n60:31:3B\t\tSunnovo International Limited\n60:31:92\t\tOVT India pvt Ltd\n60:31:97\t\tZyxel Communications Corporation\n60:32:3B\t\tQuectel Wireless Solutions Co.,Ltd.\n60:32:B1\t\tTp-Link Technologies Co.,Ltd.\n60:32:F0\t\tMplus technology\n60:33:4B\t\tApple, Inc.\n60:34:57\t\tHP Tuners LLC\n60:35:53\t\tBuwon Technology\n60:35:73\t\tEarda Technologies co Ltd\n60:35:C0\t\tSfr\n60:36:96\t\tThe Sapling Company\n60:36:DD\t\tIntel Corporate\n60:38:0E\t\tAlpsalpine Co,.Ltd\n60:38:E0\t\tBelkin International Inc.\n60:39:1F\t\tABB Ltd\n60:3A:7C\t\tTp-Link Technologies Co.,Ltd.\n60:3A:AF\t\tSamsung Electronics Co.,Ltd\n60:3C:0E\t\tGuizhou Huaxin Information Technology Co.,Ltd\n60:3C:68\t\tGarmin International\n60:3C:EE\t\tLG Electronics (Mobile Communications)\n60:3D:26\t\tVantiva USA LLC\n60:3D:29\t\tHuawei Technologies Co.,Ltd\n60:3D:61\t\tPrivate\n60:3E:5F\t\tApple, Inc.\n60:3E:7B\t\tGafachi, Inc.\n60:3E:CA\t\tCambridge Medical Robotics Ltd\n60:3F:C5\t\tCox Co., Ltd\n60:42:7F\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\n60:44:7A\t\tWater-i.d. GmbH\n60:44:F5\t\tEasy Digital Ltd.\n60:45:2E\t\tIntel Corporate\n60:45:5E\t\tLiptel s.r.o.\n60:45:BD\t\tMicrosoft\n60:45:CB\t\tASUSTek COMPUTER INC.\n60:45:CD\t\tSagemcom Broadband SAS\n60:45:E8\t\tArcadyan Corporation\n60:46:16\t\tXiamen Vann Intelligent Co., Ltd\n60:47:62\t\tBeijing Sensoro Technology Co.,Ltd.\n60:47:D4\t\tFORICS Electronic Technology Co., Ltd.\n60:48:26\t\tNewbridge Technologies Int. Ltd.\n60:48:9C\t\tYippee Electronics Co.,Limited\n60:49:66\t\tShenzhen Dingsheng Technology Co., Ltd.\n60:49:C1\t\tAvaya Inc\n60:4A:1C\t\tSUYIN Corporation\n60:4A:77\t\tFinder SpA\n60:4B:AA\t\tMagic Leap, Inc.\n60:4D:E1\t\tHuawei Technologies Co.,Ltd\n60:4F:5B\t\tHuawei Device Co., Ltd.\n60:50:C1\t\tKinetek Sports\n60:51:2C\t\tTCT mobile ltd\n60:52:D0\t\tFACTS Engineering\n60:53:17\t\tSandstone Technologies\n60:53:75\t\tHuawei Technologies Co.,Ltd\n60:54:64\t\tEyedro Green Solutions Inc.\n60:55:F9\t\tEspressif Inc.\n60:56:61\t\tIXECLOUD Tech\n60:56:7D\t\tAM Telecom co., Ltd.\n60:56:99\t\tMAGNETI MARELLI   S.E. S.p.A.\n60:56:B1\t\tHuawei Technologies Co.,Ltd\n60:56:EE\t\tAltoBeam Inc.\n60:57:18\t\tIntel Corporate\n60:57:47\t\tCig Shanghai Co Ltd\n60:57:7D\t\teero inc.\n60:57:C8\t\tApple, Inc.\n60:58:01\t\tShandong ZTop Microelectronics Co., Ltd.\n60:5B:30\t\tDell Inc.\n60:5B:B4\t\tAzureWave Technology Inc.\n60:5E:4F\t\tHuawei Device Co., Ltd.\n60:5F:8D\t\teero inc.\n60:5F:AA\t\tHuawei Device Co., Ltd.\n60:60:1F\t\tSz Dji Technology Co.,Ltd\n60:61:34\t\tArcade Communications Ltd.\n60:61:DF\t\tZ-meta Research LLC\n60:63:4C\t\tD-Link International\n60:63:F9\t\tCiholas, Inc.\n60:63:FD\t\tTranscend Communication Beijing Co.,Ltd.\n60:64:05\t\tTexas Instruments\n60:64:53\t\tAOD Co.,Ltd.\n60:64:A1\t\tRADiflow Ltd.\n60:65:25\t\tApple, Inc.\n60:66:82\t\tShenzhen Ateko Photoelectricity Co.,Ltd\n60:67:20\t\tIntel Corporate\n60:68:32\t\tGuangdong Seneasy Intelligent Technology Co., Ltd.\n60:68:4E\t\tSamsung Electronics Co.,Ltd\n60:69:44\t\tApple, Inc.\n60:69:9B\t\tisepos GmbH\n60:6B:5B\t\tArista Network, Inc.\n60:6B:B3\t\tzte corporation\n60:6B:BD\t\tSamsung Electronics Co.,Ltd\n60:6B:FF\t\tNintendo Co.,Ltd\n60:6C:63\t\tHitron Technologies. Inc\n60:6C:66\t\tIntel Corporate\n60:6D:3C\t\tLuxshare Precision Industry Company Limited\n60:6D:9D\t\tOtto Bock Healthcare Products GmbH\n60:6D:C7\t\tHon Hai Precision Ind. Co.,Ltd.\n60:6E:41\t\tBarrot Technology Co.,LTD\n60:6E:53\t\tBeijing Wisdomstar Technology Co., Ltd\n60:6E:D0\t\tSeal Ag\n60:6E:E8\t\tXiaomi Communications Co Ltd\n60:70:6C\t\tGoogle, Inc.\n60:70:72\t\tShenzhen Hongde Smart Link Technology Co., Ltd\n60:70:C0\t\tApple, Inc.\n60:72:0B\t\tBLU Products Inc\n60:73:5C\t\tCisco Systems, Inc\n60:73:BC\t\tzte corporation\n60:73:C8\t\tVoyetra Turtle Beach, Inc.\n60:74:8D\t\tAtmaca Elektronik\n60:74:B1\t\tHome Control Singapore Pte Ltd\n60:74:F4\t\tPrivate\n60:75:6C\t\tLG Electronics\n60:76:23\t\tShenzhen E-Superlink Technology Co., Ltd\n60:76:88\t\tVelodyne\n60:77:71\t\tTexas Instruments\n60:77:E2\t\tSamsung Electronics Co.,Ltd\n60:7D:09\t\tLuxshare Precision Industry Co., Ltd\n60:7D:DD\t\tShenzhen Shichuangyi Electronics Co.,Ltd\n60:7E:A4\t\tShanghai Imilab Technology Co.Ltd\n60:7E:C9\t\tApple, Inc.\n60:7E:CD\t\tHuawei Technologies Co.,Ltd\n60:7E:DD\t\tMicrosoft Mobile Oy\n60:7F:CB\t\tSamsung Electronics Co.,Ltd\n60:81:10\t\tApple, Inc.\n60:81:2B\t\tAstronics Custom Control Concepts\n60:81:F9\t\tHelium Systems, Inc\n60:82:46\t\tApple, Inc.\n60:83:34\t\tHuawei Technologies Co.,Ltd\n60:83:73\t\tApple, Inc.\n60:83:B2\t\tGkWare e.K.\n60:83:E2\t\tShanghai Notion Information Technology Co., Ltd\n60:83:E7\t\tTP-Link Systems Inc\n60:83:F8\t\tSichuan Huakun Zhenyu Intelligent Technology Co.,Ltd\n60:84:3B\t\tSoladigm, Inc.\n60:84:BD\t\tBuffalo.Inc\n60:86:45\t\tAvery Weigh-Tronix, LLC\n60:89:3C\t\tThermo Fisher Scientific P.O.A.\n60:89:B1\t\tKey Digital Systems\n60:89:B7\t\tKael Mühendi̇sli̇k Elektroni̇k Ti̇caret Sanayi̇ Li̇mi̇ted Şi̇rketi̇\n60:8A:10\t\tMicrochip Technology Inc.\n60:8B:0E\t\tApple, Inc.\n60:8C:2B\t\tHanson Technology\n60:8C:4A\t\tApple, Inc.\n60:8C:DF\t\tBeamtrail-Sole Proprietorship\n60:8C:E6\t\tCommscope\n60:8D:17\t\tSentrus Government Systems Division, Inc\n60:8D:26\t\tArcadyan Corporation\n60:8E:08\t\tSamsung Electronics Co.,Ltd\n60:8F:5C\t\tSamsung Electronics Co.,Ltd\n60:8F:A4\t\tNokia Solutions and Networks GmbH & Co. KG\n60:90:84\t\tDSSD Inc\n60:91:F3\t\tvivo Mobile Communication Co., Ltd.\n60:92:17\t\tApple, Inc.\n60:92:C8\t\tRoku, Inc\n60:92:F5\t\tCommscope\n60:93:16\t\tApple, Inc.\n60:95:32\t\tZebra Technologies Inc.\n60:95:BD\t\tApple, Inc.\n60:95:CE\t\tIEEE Registration Authority\n60:95:CE:00:00:00/28\tSiema Applications\n60:95:CE:10:00:00/28\tPonoor Experiments Inc.\n60:95:CE:20:00:00/28\tQ-SENTECH Co.,Ltd.\n60:95:CE:30:00:00/28\tRobot S.A.\n60:95:CE:40:00:00/28\tUntangle, Inc.\n60:95:CE:50:00:00/28\tAdvanWISE Corporation\n60:95:CE:60:00:00/28\tXiamen Sigmastar Technology Ltd.\n60:95:CE:70:00:00/28\tCadmo Soluciones SAC\n60:95:CE:80:00:00/28\tTrophy SAS\n60:95:CE:90:00:00/28\tJlztlink Industry(ShenZhen)Co.,Ltd.\n60:95:CE:A0:00:00/28\t(Un)Manned\n60:95:CE:B0:00:00/28\tBeijing Sinomedisite Bio-tech Co.,Ltd\n60:95:CE:C0:00:00/28\tSynamedia\n60:95:CE:D0:00:00/28\tGovComm\n60:95:CE:E0:00:00/28\tVNS Inc.\n60:96:20\t\tPrivate\n60:96:A4\t\tHuawei Technologies Co.,Ltd\n60:97:DD\t\tMicroSys Electronics GmbH\n60:98:13\t\tShanghai Visking Digital Technology Co. LTD\n60:98:49\t\tNokia Solutions and Networks India Private Limited\n60:98:66\t\tTexas Instruments\n60:99:D1\t\tVuzix / Lenovo\n60:9A:A4\t\tGvi Security Inc.\n60:9A:C1\t\tApple, Inc.\n60:9B:2D\t\tJMACS Japan Co., Ltd.\n60:9B:B4\t\tHuawei Technologies Co.,Ltd\n60:9B:C8\t\tHipad Intelligent Technology Co., Ltd.\n60:9C:9F\t\tBrocade Communications Systems LLC\n60:9E:64\t\tVivonic GmbH\n60:9F:9D\t\tCloudSwitch\n60:A1:0A\t\tSamsung Electronics Co.,Ltd\n60:A1:1E\t\tWuhan Maxsine Electric Co.,Ltd.\n60:A2:C6\t\tHuawei Technologies Co.,Ltd\n60:A3:7D\t\tApple, Inc.\n60:A3:E3\t\tTp-Link Technologies Co.,Ltd.\n60:A4:23\t\tSilicon Laboratories\n60:A4:34\t\tIEEE Registration Authority\n60:A4:34:00:00:00/28\tUniqon\n60:A4:34:10:00:00/28\tEEG Enterprises Inc\n60:A4:34:20:00:00/28\tHangzhou Zhongxinhui lntelligent Technology Co.,Ltd.\n60:A4:34:30:00:00/28\tShenzhen lncar Technology Co.,Ltd\n60:A4:34:40:00:00/28\tHuman-life Information Platforms Institute\n60:A4:34:50:00:00/28\tHangzhou Lanly Technology Co., Ltd.\n60:A4:34:60:00:00/28\tLechpol Electronics Leszek Sp.k.\n60:A4:34:70:00:00/28\tDrov Technologies\n60:A4:34:80:00:00/28\tTime Engineering Co., Ltd.\n60:A4:34:90:00:00/28\tShenzhen HantangFengyun Technology Co.,Ltd\n60:A4:34:A0:00:00/28\tScancom\n60:A4:34:B0:00:00/28\tBweetech Electronics Technology (Shanghai) Co.,Ltd\n60:A4:34:C0:00:00/28\tAnnapurna labs\n60:A4:34:D0:00:00/28\tKaynes technology India Ltd\n60:A4:34:E0:00:00/28\tKnvision\n60:A4:4C\t\tASUSTek COMPUTER INC.\n60:A4:B7\t\tTP-Link Systems Inc\n60:A4:D0\t\tSamsung Electronics Co.,Ltd\n60:A5:E2\t\tIntel Corporate\n60:A6:C5\t\tHuawei Technologies Co.,Ltd\n60:A7:30\t\tShenzhen Yipinfang Internet Technology Co.,Ltd\n60:A7:51\t\tHuawei Device Co., Ltd.\n60:A8:FE\t\tNokia Solutions and Networks GmbH & Co. KG\n60:A9:B0\t\tMerchandising Technologies, Inc\n60:AA:EF\t\tHuawei Device Co., Ltd.\n60:AB:14\t\tLG Innotek\n60:AB:67\t\tXiaomi Communications Co Ltd\n60:AB:D2\t\tBose Corporation\n60:AC:C8\t\tKunTeng Inc.\n60:AF:6D\t\tSamsung Electronics Co.,Ltd\n60:B0:2B\t\tQingdao Haier Technology Co.,Ltd\n60:B0:E8\t\tHuawei Device Co., Ltd.\n60:B1:85\t\tATH system\n60:B3:87\t\tSynergics Technologies GmbH\n60:B3:C4\t\tElber Srl\n60:B4:F7\t\tPlume Design Inc\n60:B5:8D\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n60:B6:06\t\tPhorus\n60:B6:17\t\tFiberhome Telecommunication Technologies Co.,LTD\n60:B6:47\t\tSilicon Laboratories\n60:B6:E1\t\tTexas Instruments\n60:B7:6E\t\tGoogle, Inc.\n60:B9:33\t\tDeutron Electronics Corp.\n60:B9:82\t\tRO.VE.R. Laboratories S.p.A.\n60:B9:C0\t\tCisco Systems, Inc\n60:BA:18\t\tnextLAP GmbH\n60:BB:0C\t\tBeijing HuaqinWorld Technology Co,Ltd\n60:BC:4C\t\tEWM Hightec Welding GmbH\n60:BD:2C\t\tTaicang T&W Electronics\n60:BD:83\t\tHuawei Technologies Co.,Ltd\n60:BD:91\t\tMove Innovation\n60:BE:B4\t\tS-Bluetech co., limited\n60:BE:B5\t\tMotorola Mobility LLC, a Lenovo Company\n60:BE:C4\t\tApple, Inc.\n60:C0:1E\t\tV&G Information System Co.,Ltd\n60:C0:BF\t\tON Semiconductor\n60:C1:CB\t\tFujian Great Power PLC Equipment Co.,Ltd\n60:C2:2A\t\tAllwinner Technology Co., Ltd\n60:C3:97\t\t2Wire Inc\n60:C5:47\t\tApple, Inc.\n60:C5:A8\t\tBeijing LT Honway Technology Co.,Ltd\n60:C5:AD\t\tSamsung Electronics Co.,Ltd\n60:C5:E6\t\tSkullcandy\n60:C6:58\t\tPHYTRONIX Co.,Ltd.\n60:C7:27\t\tDigiboard Eletronica da Amazonia Ltda\n60:C7:8D\t\tJuniper Networks\n60:C7:98\t\tVerifone, Inc.\n60:C7:BE\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n60:C9:80\t\tTrymus\n60:C9:AA\t\tNokia\n60:CB:FB\t\tAirScape Inc.\n60:CD:A9\t\tAbloomy\n60:CD:C5\t\tTaiwan Carol Electronics., Ltd\n60:CE:41\t\tHuawei Technologies Co.,Ltd\n60:CE:86\t\tSercomm Corporation.\n60:CE:92\t\tThe Refined Industry Company Limited\n60:CF:69\t\tmeerecompany\n60:CF:84\t\tASUSTek COMPUTER INC.\n60:D0:2C\t\tRuckus Wireless\n60:D0:39\t\tApple, Inc.\n60:D0:A9\t\tSamsung Electronics Co.,Ltd\n60:D1:AA\t\tVishal Telecommunications Pvt Ltd\n60:D2:1C\t\tSunnovo International Limited\n60:D2:48\t\tCommscope\n60:D2:62\t\tTzukuri Pty Ltd\n60:D2:B9\t\tRealand Bio Co., Ltd.\n60:D2:DD\t\tShenzhen Baitong Putian Technology Co.,Ltd.\n60:D3:0A\t\tQuatius Limited\n60:D4:E9\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n60:D5:1B\t\tFujitsu Limited\n60:D5:61\t\tShenzhen Glazero Technology Co., Ltd.\n60:D7:55\t\tHuawei Technologies Co.,Ltd\n60:D7:E3\t\tIEEE Registration Authority\n60:D7:E3:00:00:00/28\tAvalun\n60:D7:E3:10:00:00/28\tElap s.r.l.\n60:D7:E3:20:00:00/28\tNovo innovations Ltd\n60:D7:E3:30:00:00/28\tSKS Automaatio oy\n60:D7:E3:40:00:00/28\tHemisphere GNSS\n60:D7:E3:50:00:00/28\tRevol Technologies inc\n60:D7:E3:60:00:00/28\tAmeli s.r.l.\n60:D7:E3:70:00:00/28\tPhase One A/S\n60:D7:E3:80:00:00/28\tHindlePower, Inc\n60:D7:E3:90:00:00/28\tLongSung Technology (Shanghai) Co.,Ltd.\n60:D7:E3:A0:00:00/28\tWilderness Labs Inc.\n60:D7:E3:B0:00:00/28\tNextivity\n60:D7:E3:C0:00:00/28\tZhejiang Send Intelligent Technology,Ltd\n60:D7:E3:D0:00:00/28\tQuantronix, Inc.\n60:D7:E3:E0:00:00/28\tHuBDIC CO.,LTD\n60:D8:19\t\tHon Hai Precision Ind. Co.,Ltd.\n60:D8:9C\t\tHMD Global Oy\n60:D8:A4\t\tVantiva Connected Home - Technologies Telco\n60:D9:A0\t\tLenovo Mobile Communication Technology Ltd.\n60:D9:C7\t\tApple, Inc.\n60:DA:23\t\tEstech Co.,Ltd\n60:DA:83\t\tHangzhou H3C Technologies Co., Limited\n60:DB:15\t\tNew H3C Technologies Co., Ltd\n60:DB:2A\t\tHns\n60:DB:98\t\tCalix Inc.\n60:DB:EF\t\tUnify Software and Solutions GmbH & Co. KG\n60:DC:0D\t\tTaiwan Shin Kong Security Co., Ltd\n60:DC:81\t\tAltoBeam Inc.\n60:DD:70\t\tApple, Inc.\n60:DD:8E\t\tIntel Corporate\n60:DE:35\t\tGITSN, Inc.\n60:DE:44\t\tHuawei Technologies Co.,Ltd\n60:DE:94\t\tHuawei Technologies Co.,Ltd\n60:DE:F3\t\tHuawei Technologies Co.,Ltd\n60:DE:F4\t\tShenzhen iComm Semiconductor CO.,LTD\n60:E0:0E\t\tShinsei Electronics Co Ltd\n60:E3:27\t\tTp-Link Technologies Co.,Ltd.\n60:E3:2B\t\tIntel Corporate\n60:E3:AC\t\tLG Electronics (Mobile Communications)\n60:E5:D8\t\tzte corporation\n60:E6:BC\t\tSino-Telecom Technology Co.,Ltd.\n60:E6:F0\t\tWistron Neweb Corporation\n60:E7:01\t\tHuawei Technologies Co.,Ltd\n60:E7:8A\t\tUnisem\n60:E8:5B\t\tTexas Instruments\n60:E9:56\t\tAyla Networks, Inc\n60:E9:AA\t\tCloud Network Technology Singapore Pte. Ltd.\n60:EB:5A\t\tAsterfusion Data Technologies Co.,Ltd\n60:EB:69\t\tQuanta Computer Inc.\n60:EE:5C\t\tShenzhen Fast Technologies Co.,Ltd\n60:EF:AB\t\tSilicon Laboratories\n60:EF:C6\t\tShenzhen Chima Technologies Co Limited\n60:F0:4D\t\tHonor Device Co., Ltd.\n60:F1:3D\t\tJABLOCOM s.r.o.\n60:F1:89\t\tMurata Manufacturing Co., Ltd.\n60:F1:8A\t\tHuawei Technologies Co.,Ltd\n60:F2:62\t\tIntel Corporate\n60:F2:81\t\tTranwo Technology Co., Ltd.\n60:F2:EF\t\tVisionVera International Co., Ltd.\n60:F3:DA\t\tLogic Way GmbH\n60:F4:19\t\teero inc.\n60:F4:3A\t\tEdifier International\n60:F4:45\t\tApple, Inc.\n60:F4:94\t\tHon Hai Precision Ind. Co.,Ltd.\n60:F5:49\t\tApple, Inc.\n60:F5:9C\t\tCRU-Dataport\n60:F6:73\t\tTerumo Corporation\n60:F6:77\t\tIntel Corporate\n60:F8:1D\t\tApple, Inc.\n60:F8:F2\t\tSynaptec\n60:FA:9D\t\tHuawei Technologies Co.,Ltd\n60:FA:B1\t\tKempower Oyj\n60:FA:CD\t\tApple, Inc.\n60:FB:00\t\tShenzhen Bilian Electronic Co.，Ltd\n60:FB:42\t\tApple, Inc.\n60:FC:F1\t\tPrivate\n60:FD:56\t\tWOORISYSTEMS CO., Ltd\n60:FD:A6\t\tApple, Inc.\n60:FE:1E\t\tChina Palms Telecom.Ltd\n60:FE:20\t\t2Wire Inc\n60:FE:C5\t\tApple, Inc.\n60:FE:F9\t\tThomas & Betts\n60:FF:12\t\tSamsung Electronics Co.,Ltd\n60:FF:9E\t\tAzureWave Technology Inc.\n60:FF:DD\t\tC.E. Electronics, Inc\n64:00:2D\t\tPowerlinq Co., LTD\n64:00:6A\t\tDell Inc.\n64:00:9C\t\tInsulet Corporation\n64:00:F1\t\tCisco Systems, Inc\n64:01:FB\t\tLandis+Gyr GmbH\n64:02:8F\t\tSilicon Laboratories\n64:02:CB\t\tCommscope\n64:03:7F\t\tSamsung Electronics Co.,Ltd\n64:05:52\t\tChina Post Communication Equipment Co.,\n64:05:BE\t\tNew Light Led\n64:05:E4\t\tAlpsalpine Co,.Ltd\n64:05:E9\t\tShenzhen WayOS Technology Crop., Ltd.\n64:07:8C\t\tHuawei Technologies Co.,Ltd\n64:07:F6\t\tSamsung Electronics Co.,Ltd\n64:08:64\t\tCisco Systems, Inc\n64:09:4C\t\tBeijing Superbee Wireless Technology Co.,Ltd\n64:09:80\t\tXiaomi Communications Co Ltd\n64:09:AC\t\tTCT mobile ltd\n64:0B:4A\t\tDigital Telecom Technology Limited\n64:0B:D7\t\tApple, Inc.\n64:0C:91\t\tApple, Inc.\n64:0D:22\t\tLG Electronics (Mobile Communications)\n64:0D:CE\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\n64:0D:E6\t\tPetra Systems\n64:0E:36\t\tTaztag\n64:0E:6A\t\tSECO-LARM USA Inc\n64:0E:94\t\tPluribus Networks, Inc.\n64:0E:9B\t\tIshida Medical Co., Ltd.\n64:0F:28\t\t2Wire Inc\n64:10:84\t\tHEXIUM Technical Development Co., Ltd.\n64:11:A4\t\tMotorola Mobility LLC, a Lenovo Company\n64:12:25\t\tCisco Systems, Inc\n64:12:36\t\tVantiva USA LLC\n64:12:69\t\tCommscope\n64:13:31\t\tBosch Car Multimedia (Wuhu) Co. Ltd.\n64:13:5A\t\tItectra A/S\n64:13:6C\t\tzte corporation\n64:13:AB\t\tHuawei Technologies Co.,Ltd\n64:16:66\t\tNest Labs Inc.\n64:16:7F\t\tPolycom\n64:16:8D\t\tCisco Systems, Inc\n64:16:F0\t\tHuawei Technologies Co.,Ltd\n64:17:59\t\tIntellivision Holdings, LLC\n64:17:CD\t\tSamsung Electronics Co.,Ltd\n64:1A:22\t\tHeliospectra AB\n64:1A:BA\t\tDryad Networks GmbH\n64:1B:2F\t\tSamsung Electronics Co.,Ltd\n64:1C:10\t\tTexas Instruments\n64:1C:67\t\tDigibras Industria Do Brasils/A\n64:1C:AE\t\tSamsung Electronics Co.,Ltd\n64:1C:B0\t\tSamsung Electronics Co.,Ltd\n64:1E:81\t\tDowslake Microsystems\n64:20:0C\t\tApple, Inc.\n64:20:9F\t\tTilgin AB\n64:20:E0\t\tT3 Technology Co., Ltd.\n64:21:84\t\tNippon Denki Kagaku Co.,LTD\n64:22:16\t\tShandong Taixin Electronic co.,Ltd\n64:23:15\t\tHuawei Device Co., Ltd.\n64:24:00\t\tXorcom Ltd.\n64:25:5E\t\tObservint Technologies, Inc.\n64:25:EC\t\tguangdong kesheng zhixun technology\n64:26:56\t\tShenzhen Fanweitai Technology Service Co.,Ltd\n64:26:77\t\tBKM-Micronic Richtfunkanlagen GmbH\n64:27:37\t\tHon Hai Precision Ind. Co.,Ltd.\n64:27:53\t\tHuawei Device Co., Ltd.\n64:29:43\t\tD-Link Corporation\n64:29:ED\t\tAO \"PKK Milandr\"\n64:29:FF\t\tHuawei Technologies Co.,Ltd\n64:2B:8A\t\tALL BEST Industrial Co., Ltd.\n64:2C:0F\t\tvivo Mobile Communication Co., Ltd.\n64:2C:AC\t\tHuawei Technologies Co.,Ltd\n64:2D:B7\t\tSeungil Electronics\n64:2E:41\t\tHuawei Technologies Co.,Ltd\n64:2F:C7\t\tNew H3C Technologies Co., Ltd\n64:31:35\t\tApple, Inc.\n64:31:39\t\tIEEE Registration Authority\n64:31:39:00:00:00/28\tShenzhen Emeet Intelligent Technology Co., Ltd.\n64:31:39:10:00:00/28\tLivongo Health\n64:31:39:20:00:00/28\tSmartplus Inc.\n64:31:39:30:00:00/28\tKoangyow Integration Machine Co., Ltd.\n64:31:39:40:00:00/28\tActive Brains\n64:31:39:50:00:00/28\tShenzhen He&e Technology Co.,Ltd.\n64:31:39:60:00:00/28\tHunan Voc Acoustics Technology Co., Ltd.\n64:31:39:70:00:00/28\tDongguan Huili electroacoustic Industrial Co.,ltd\n64:31:39:80:00:00/28\tShenzhen Huanyin Electronics Ltd.\n64:31:39:90:00:00/28\tHoneywell Analytics Ltd\n64:31:39:A0:00:00/28\tProduct Development Associates, Inc.\n64:31:39:B0:00:00/28\tAlphago GmbH\n64:31:39:C0:00:00/28\tSHEN ZHEN FUCHANG TECHNOLOGY Co.,Ltd.\n64:31:39:D0:00:00/28\tZhejiang Moorgen Intelligent Technology Co.,Ltd\n64:31:39:E0:00:00/28\tATG UV Technology\n64:31:50\t\tHewlett Packard\n64:31:72\t\tZhejiang Hising Technology Co.,Ltd\n64:31:7E\t\tDexin Corporation\n64:32:16\t\tWeidu Technology (Beijing) Co., Ltd.\n64:32:A8\t\tIntel Corporate\n64:33:AA\t\tMellanox Technologies, Inc.\n64:33:B5\t\tIEEE Registration Authority\n64:33:B5:00:00:00/28\tDuomondi International Development Co., Ltd.\n64:33:B5:10:00:00/28\tHuaqin Telecom Technology Co.,Ltd.\n64:33:B5:20:00:00/28\tAdesso, Inc\n64:33:B5:30:00:00/28\tWingtech Mobile Communications Co.,Ltd\n64:33:B5:40:00:00/28\tEagle Eye Networks, Inc\n64:33:B5:50:00:00/28\tRevo Smart Technologies co.,limited\n64:33:B5:60:00:00/28\tMicroit Srl\n64:33:B5:70:00:00/28\tABB Electrification Smart Power (ELSP)\n64:33:B5:80:00:00/28\tLACO Technologies\n64:33:B5:90:00:00/28\tAnnapurna labs\n64:33:B5:A0:00:00/28\tHometek Eletronics Co., Ltd\n64:33:B5:B0:00:00/28\telectroCore Inc.\n64:33:B5:C0:00:00/28\tGeksacon\n64:33:B5:D0:00:00/28\tIiyama Corporation\n64:33:B5:E0:00:00/28\tUniversity of Texas at Austin\n64:33:DB\t\tTexas Instruments\n64:34:09\t\tBITwave Pte Ltd\n64:35:1C\t\te-CON SYSTEMS INDIA PVT LTD\n64:37:A4\t\tTokyoshuha Co.,Ltd.\n64:3A:B1\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n64:3A:EA\t\tCisco Systems, Inc\n64:3E:0A\t\tHuawei Technologies Co.,Ltd\n64:3E:8C\t\tHuawei Technologies Co.,Ltd\n64:3F:5F\t\tExablaze\n64:41:E6\t\tApple, Inc.\n64:42:12\t\tShenzhen Water World Information Co.,Ltd.\n64:42:14\t\tSwisscom Energy Solutions AG\n64:43:46\t\tGuangDong Quick Network Computer CO.,LTD\n64:44:7B\t\tvivo Mobile Communication Co., Ltd.\n64:44:D5\t\tTD Tech\n64:47:E0\t\tFeitian Technologies Co., Ltd\n64:48:42\t\tApple, Inc.\n64:49:7D\t\tIntel Corporate\n64:4A:7D\t\tIntel Corporate\n64:4B:C3\t\tShanghai WOASiS Telecommunications Ltd., Co.\n64:4B:F0\t\tCalDigit, Inc\n64:4C:36\t\tIntel Corporate\n64:4C:69\t\tConprove\n64:4D:70\t\tdSPACE GmbH\n64:4E:D7\t\tHP Inc.\n64:4E:EB\t\tDaikin Holdings Singapore Pte Ltd\n64:4F:42\t\tJETTER CO., Ltd.\n64:4F:56\t\tYealink(Xiamen) Network Technology Co.,Ltd.\n64:4F:74\t\tLENUS Co., Ltd.\n64:4F:B0\t\tHyunjin.com\n64:50:D6\t\tLiquidtool Systems\n64:51:06\t\tHewlett Packard\n64:51:7E\t\tLong Ben (Dongguan) Electronic Technology Co.,Ltd.\n64:51:F4\t\tHuawei Device Co., Ltd.\n64:52:34\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n64:52:99\t\tThe Chamberlain Group, Inc\n64:53:5D\t\tFrauscher Sensortechnik\n64:53:E0\t\tHuawei Technologies Co.,Ltd\n64:54:22\t\tEquinox Payments\n64:55:63\t\tQ-Free America, Inc.\n64:55:7F\t\tNSFOCUS Information Technology Co., Ltd.\n64:55:B1\t\tCommscope\n64:56:01\t\tTp-Link Technologies Co.,Ltd.\n64:57:25\t\tHui Zhou Gaoshengda Technology Co.,LTD\n64:57:E5\t\tBeijing Royaltech Co.,Ltd\n64:58:AD\t\tChina Mobile IOT Company Limited\n64:59:F8\t\tVodafone Omnitel B.V.\n64:5A:04\t\tChicony Electronics Co., Ltd.\n64:5A:36\t\tApple, Inc.\n64:5A:ED\t\tApple, Inc.\n64:5C:F3\t\tParanTek Inc.\n64:5D:86\t\tIntel Corporate\n64:5D:92\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n64:5D:D7\t\tShenzhen Lifesense Medical Electronics Co., Ltd.\n64:5D:F4\t\tSamsung Electronics Co.,Ltd\n64:5E:10\t\tHuawei Technologies Co.,Ltd\n64:5E:2C\t\tIRay Technology Co., Ltd.\n64:5E:BE\t\tYahoo! JAPAN\n64:5F:FF\t\tNicolet Neuro\n64:60:38\t\tHirschmann Automation and Control GmbH\n64:61:40\t\tHuawei Device Co., Ltd.\n64:61:84\t\tVelux\n64:62:23\t\tCellient Co., Ltd.\n64:62:66\t\tIEEE Registration Authority\n64:62:66:00:00:00/28\tMiiVii Dynamics Technology CO.,LTD\n64:62:66:10:00:00/28\tAnnapurna labs\n64:62:66:20:00:00/28\tProtectli\n64:62:66:30:00:00/28\tFaceHeart Inc.\n64:62:66:40:00:00/28\tRedstone Systems, Inc.\n64:62:66:50:00:00/28\tBühler AG\n64:62:66:60:00:00/28\tPass & Seymour, Inc d/b/a Legrand\n64:62:66:70:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n64:62:66:80:00:00/28\tLeontech Limited\n64:62:66:90:00:00/28\tChunghwa System Integration Co., Ltd.\n64:62:66:A0:00:00/28\tSensoro Co., Ltd.\n64:62:66:B0:00:00/28\tSignal Hound\n64:62:66:C0:00:00/28\tJiangsu Aisida Electronic Co.,Ltd\n64:62:66:D0:00:00/28\tKobol Innovations Pte. Ltd.\n64:62:66:E0:00:00/28\tShenzhen Jie Shi Lian Industrial Co., LTD\n64:62:8A\t\tevon GmbH\n64:63:06\t\tXiaomi Communications Co Ltd\n64:64:4A\t\tBeijing Xiaomi Mobile Software Co., Ltd\n64:64:9B\t\tJuniper Networks\n64:65:C0\t\tNuvon, Inc\n64:66:24\t\tSagemcom Broadband SAS\n64:66:B3\t\tTp-Link Technologies Co.,Ltd.\n64:66:D8\t\tSamsung Electronics Co.,Ltd\n64:67:07\t\tBeijing Omnific Technology, Ltd.\n64:67:72\t\tSercomm Philippines Inc\n64:67:CD\t\tHuawei Technologies Co.,Ltd\n64:68:0C\t\tComtrend Corporation\n64:68:1A\t\tDASAN Network Solutions\n64:68:76\t\tEdifier International\n64:69:4E\t\tTexas Instruments\n64:69:BC\t\tHytera Communications Co .,ltd\n64:6A:52\t\tAvaya Inc\n64:6A:74\t\tAuth-Servers, Llc\n64:6C:80\t\tChongqing Fugui Electronics Co.,Ltd.\n64:6C:B2\t\tSamsung Electronics Co.,Ltd\n64:6D:2F\t\tApple, Inc.\n64:6D:4E\t\tHuawei Technologies Co.,Ltd\n64:6D:6C\t\tHuawei Technologies Co.,Ltd\n64:6E:60\t\tzte corporation\n64:6E:69\t\tLiteon Technology Corporation\n64:6E:6C\t\tRadio Datacom LLC\n64:6E:97\t\tTp-Link Technologies Co.,Ltd.\n64:6E:E0\t\tIntel Corporate\n64:6E:EA\t\tIskratel d.o.o.\n64:70:02\t\tTp-Link Technologies Co.,Ltd.\n64:70:33\t\tApple, Inc.\n64:70:60\t\tTexas Instruments\n64:72:D8\t\tGooWi Technology Co.,Limited\n64:73:66\t\tShenzhen Siera Technology Ltd\n64:73:E2\t\tArbiter Systems, Inc.\n64:74:F6\t\tShooter Detection Systems\n64:75:20\t\tzte corporation\n64:75:DA\t\tArcadyan Corporation\n64:76:57\t\tInnovative Security Designs\n64:76:BA\t\tApple, Inc.\n64:77:7D\t\tHitron Technologies. Inc\n64:77:91\t\tSamsung Electronics Co.,Ltd\n64:79:24\t\tHuawei Device Co., Ltd.\n64:79:A7\t\tPhison Electronics Corp.\n64:79:F0\t\tIntel Corporate\n64:7B:1E\t\tSagemcom Broadband SAS\n64:7B:40\t\tSichuan AI-Link Technology Co., Ltd.\n64:7B:CE\t\tSamsung Electronics Co.,Ltd\n64:7B:D4\t\tTexas Instruments\n64:7C:34\t\tUbee Interactive Co., Limited\n64:7C:E8\t\tPalo Alto Networks\n64:7D:81\t\tYokota Industrial Co,.Ltd\n64:7F:DA\t\tTEKTELIC Communications Inc.\n64:80:8B\t\tVG Controls, Inc.\n64:80:99\t\tIntel Corporate\n64:81:25\t\tAlphatron Marine BV\n64:82:14\t\tFN-LINK TECHNOLOGY Ltd.\n64:85:05\t\tzte corporation\n64:86:24\t\tBeijing Global Safety Technology Co., LTD.\n64:87:88\t\tJuniper Networks\n64:87:D7\t\tADB Broadband Italia\n64:88:FF\t\tSichuan Changhong Electric Ltd.\n64:89:9A\t\tLG Electronics (Mobile Communications)\n64:89:F1\t\tSamsung Electronics Co.,Ltd\n64:8B:9B\t\tAlways On Tech Pte.Ltd.\n64:8C:BB\t\tTexas Instruments\n64:8D:9E\t\tIVT Electronic Co.,Ltd\n64:8F:3E\t\tCisco Systems, Inc\n64:8F:DB\t\tHuaqin Technology Co.LTD\n64:90:C1\t\tBeijing Xiaomi Mobile Software Co., Ltd\n64:95:6C\t\tLG Electronics\n64:97:14\t\teero inc.\n64:98:29\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n64:98:9E\t\tTrinnov Audio\n64:99:5D\t\tLge\n64:99:68\t\tElentec\n64:99:A0\t\tAG Elektronik AB\n64:9A:08\t\tShenzhen SuperElectron Technology Co.,Ltd.\n64:9A:12\t\tP2 Mobile Technologies Limited\n64:9A:63\t\tRing LLC\n64:9A:BE\t\tApple, Inc.\n64:9B:24\t\tV Technology Co., Ltd.\n64:9C:81\t\tQualcomm Inc.\n64:9C:8E\t\tTexas Instruments\n64:9C:F3\t\tFiberhome Telecommunication Technologies Co.,LTD\n64:9D:38\t\tGoogle, Inc.\n64:9D:99\t\tFs Com Inc\n64:9E:31\t\tBeijing Xiaomi Mobile Software Co., Ltd\n64:9E:F3\t\tCisco Systems, Inc\n64:9F:F7\t\tKone OYj\n64:A0:AC\t\tAdtran Inc\n64:A0:E7\t\tCisco Systems, Inc\n64:A1:98\t\tHuawei Device Co., Ltd.\n64:A2:00\t\tXiaomi Communications Co Ltd\n64:A2:32\t\tOOO Samlight\n64:A2:8A\t\tHuawei Device Co., Ltd.\n64:A2:F9\t\tOnePlus Technology (Shenzhen) Co., Ltd\n64:A3:41\t\tWonderlan (Beijing) Technology Co., Ltd.\n64:A3:CB\t\tApple, Inc.\n64:A3:CC\t\tLeoLabs\n64:A4:0E\t\tTianyi Telecom Terminals Company Limited\n64:A4:44\t\tLoongson Technology Corporation Limited\n64:A5:C3\t\tApple, Inc.\n64:A6:51\t\tHuawei Technologies Co.,Ltd\n64:A6:8F\t\tZhongshan Readboy Electronics Co.,Ltd\n64:A7:69\t\tHTC Corporation\n64:A7:DD\t\tAvaya Inc\n64:A8:37\t\tJuni Korea Co., Ltd\n64:A9:65\t\tLinkflow Co., Ltd.\n64:AC:2B\t\tJuniper Networks\n64:AE:0C\t\tCisco Systems, Inc\n64:AE:88\t\tPolytec GmbH\n64:AE:F1\t\tQingdao Hisense Electronics Co.,Ltd.\n64:B0:A6\t\tApple, Inc.\n64:B0:E8\t\tHuawei Device Co., Ltd.\n64:B2:1D\t\tChengdu Phycom Tech Co., Ltd.\n64:B2:B4\t\tFiberhome Telecommunication Technologies Co.,LTD\n64:B3:10\t\tSamsung Electronics Co.,Ltd\n64:B3:70\t\tPowerComm Solutions LLC\n64:B3:79\t\tJiangsu Viscore Technologies Co.,Ltd\n64:B4:73\t\tXiaomi Communications Co Ltd\n64:B5:C6\t\tNintendo Co.,Ltd\n64:B5:F2\t\tSamsung Electronics Co.,Ltd\n64:B6:23\t\tSchrack Seconet Care Communication GmbH\n64:B6:4A\t\tViVOtech, Inc.\n64:B7:08\t\tEspressif Inc.\n64:B8:53\t\tSamsung Electronics Co.,Ltd\n64:B9:4E\t\tDell Technologies\n64:B9:E8\t\tApple, Inc.\n64:BA:A4\t\tzte corporation\n64:BA:BD\t\tSDJ Technologies, Inc.\n64:BB:1E\t\tEarda Technologies co Ltd\n64:BC:0C\t\tLG Electronics (Mobile Communications)\n64:BC:11\t\tCombiQ AB\n64:BC:58\t\tIntel Corporate\n64:BE:63\t\tSTORDIS GmbH\n64:BF:6B\t\tHuawei Technologies Co.,Ltd\n64:C0:1A\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n64:C1:7E\t\tcheilelectric\n64:C2:69\t\teero inc.\n64:C2:DE\t\tLG Electronics (Mobile Communications)\n64:C3:54\t\tAvaya Inc\n64:C3:94\t\tHuawei Technologies Co.,Ltd\n64:C3:D6\t\tJuniper Networks\n64:C4:03\t\tQuectel Wireless Solutions Co.,Ltd.\n64:C5:82\t\tChina Mobile Group Device Co.,Ltd.\n64:C5:AA\t\tSouth African Broadcasting Corporation\n64:C6:67\t\tBarnes&Noble\n64:C6:AF\t\tAXERRA Networks Ltd\n64:C6:D2\t\tSeiko Epson Corporation\n64:C7:53\t\tApple, Inc.\n64:C9:01\t\tINVENTEC Corporation\n64:C9:44\t\tLARK Technologies, Inc\n64:CB:5D\t\tSIA \"TeleSet\"\n64:CB:9F\t\tTecno Mobile Limited\n64:CB:A3\t\tPointmobile\n64:CB:E9\t\tLG Innotek\n64:CC:22\t\tArcadyan Corporation\n64:CC:2E\t\tXiaomi Communications Co Ltd\n64:CD:C2\t\tAmazon Technologies Inc.\n64:CD:F1\t\tKO & AL Co., Ltd\n64:CE:6E\t\tSierra Wireless, ULC\n64:CF:13\t\tWeigao Nikkiso(Weihai)Dialysis Equipment Co.,Ltd\n64:CF:D9\t\tTexas Instruments\n64:D0:2D\t\tNext Generation Integration Limited (Ngi)\n64:D0:D6\t\tSamsung Electronics Co.,Ltd\n64:D1:54\t\tRouterboard.com\n64:D1:A3\t\tSitecom Europe BV\n64:D2:41\t\tKeith & Koep GmbH\n64:D2:C4\t\tApple, Inc.\n64:D3:15\t\tHMD Global Oy\n64:D4:BD\t\tAlpsalpine Co,.Ltd\n64:D4:DA\t\tIntel Corporate\n64:D6:9A\t\tIntel Corporate\n64:D7:C0\t\tHuawei Device Co., Ltd.\n64:D8:14\t\tCisco Systems, Inc\n64:D8:1B\t\tVestel Elektronik San ve Tic. A.S.\n64:D9:12\t\tSolidica, Inc.\n64:D9:54\t\tTaicang T&W Electronics\n64:D9:89\t\tCisco Systems, Inc\n64:D9:C2\t\teero inc.\n64:DA:A0\t\tRobert Bosch Smart Home GmbH\n64:DA:ED\t\teero inc.\n64:DB:18\t\tOpenPattern\n64:DB:38\t\tzte corporation\n64:DB:43\t\tMotorola (Wuhan) Mobility Technologies Communication Co., Ltd.\n64:DB:81\t\tSyszone Co., Ltd.\n64:DB:8B\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n64:DB:A0\t\tSelect Comfort\n64:DB:F7\t\tNokia Shanghai Bell Co., Ltd.\n64:DC:01\t\tStatic Systems Group PLC\n64:DC:DE\t\tZheJiang FuChunJiang Information Technology Co.,Ltd\n64:DD:68\t\tZyxel Communications Corporation\n64:DD:E9\t\tXiaomi Communications Co Ltd\n64:DE:1C\t\tKingnetic Pte Ltd\n64:DE:6D\t\tIntel Corporate\n64:DF:10\t\tJingLue Semiconductor(SH) Ltd.\n64:DF:E9\t\tAteme\n64:E0:03\t\tHui Zhou Gaoshengda Technology Co.,LTD\n64:E0:AB\t\tUnion Man Technology Co.,Ltd\n64:E1:61\t\tDEP Corp.\n64:E1:72\t\tShenzhen Qihoo Intelligent Technology Co.,Ltd\n64:E2:04\t\tNTN Technical Service Corporation\n64:E2:20\t\tQisda Corporation\n64:E4:A5\t\tLG Electronics\n64:E5:99\t\tEFM Networks\n64:E6:25\t\tWoxu Wireless Co., Ltd\n64:E6:82\t\tApple, Inc.\n64:E7:38\t\tZhejiang SUPCON Technology Co., Ltd.\n64:E7:D8\t\tSamsung Electronics Co.,Ltd\n64:E8:15\t\tArcelik A.S\n64:E8:33\t\tEspressif Inc.\n64:E8:4F\t\tSerialway Communication Technology Co. Ltd\n64:E8:81\t\tHewlett Packard Enterprise\n64:E8:92\t\tMorio Denki Co., Ltd.\n64:E8:E6\t\tglobal moisture management system\n64:E9:50\t\tCisco Systems, Inc\n64:EA:C5\t\tSiboTech Automation Co., Ltd.\n64:EB:8C\t\tSeiko Epson Corporation\n64:EC:65\t\tvivo Mobile Communication Co., Ltd.\n64:ED:57\t\tCommscope\n64:ED:62\t\tWOORI SYSTEMS Co., Ltd\n64:EE:B7\t\tNetis Technology Co., Ltd.\n64:F0:AD\t\tZhejiang Tmall Technology Co., Ltd.\n64:F2:42\t\tGerdes Aktiengesellschaft\n64:F2:FB\t\tHangzhou Ezviz Software Co.,Ltd.\n64:F5:0E\t\tKinion Technology Company Limited\n64:F5:4E\t\tEM Microelectronic\n64:F6:9D\t\tCisco Systems, Inc\n64:F6:BB\t\tFibocom Wireless Inc.\n64:F6:F7\t\tAnhui Dynamic Power Co., Ltd.\n64:F7:05\t\tHuawei Device Co., Ltd.\n64:F8:1C\t\tHuawei Technologies Co., Ltd.\n64:F8:8A\t\tChina Mobile IOT Company Limited\n64:F9:47\t\tSenscomm Semiconductor Co., Ltd.\n64:F9:70\t\tKenade Electronics Technology Co.,LTD.\n64:F9:87\t\tAvvasi Inc.\n64:F9:C0\t\tAnalog Devices\n64:FB:01\t\tZhongshan Camry Electronic Company Limited\n64:FB:50\t\tRoomReady/Zdi, Inc.\n64:FB:81\t\tIEEE Registration Authority\n64:FB:81:00:00:00/28\tShanghai   Simcom   Limited\n64:FB:81:10:00:00/28\tNarrative AB\n64:FB:81:20:00:00/28\tSeven Solutions S.L\n64:FB:81:30:00:00/28\tMOBILUS Inc.\n64:FB:81:40:00:00/28\tPricer AB\n64:FB:81:50:00:00/28\tKay Schulze & Karsten Pohle GbR\n64:FB:81:60:00:00/28\tXIMO Communication Technology Co., Ltd\n64:FB:81:70:00:00/28\tSecurosys SA\n64:FB:81:80:00:00/28\tNPG Technology S.A.\n64:FB:81:90:00:00/28\thiQview Corporation\n64:FB:81:A0:00:00/28\tBronkhorst High-Tech BV\n64:FB:81:B0:00:00/28\tSichuan Haige Actec Communication Technology Co.,Ltd.\n64:FB:81:C0:00:00/28\tBridgeport Instruments, LLC\n64:FB:81:D0:00:00/28\tDongyang unitech.co.ltd\n64:FB:81:E0:00:00/28\tChengDu KeChuang LongXin Sci-tech Co.,Ltd\n64:FB:81:F0:00:00/28\tPrivate\n64:FB:92\t\tPPC Broadband Inc.\n64:FC:8C\t\tZonar Systems\n64:FD:29\t\tZhejiang Dahua Technology Co., Ltd.\n64:FD:96\t\tSagemcom Broadband SAS\n64:FE:15\t\tFlaircomm Microelectronics,Inc.\n64:FF:0A\t\tWistron Neweb Corporation\n68:02:35\t\tKonten Networks Inc.\n68:02:B8\t\tCompal Broadband Networks, Inc.\n68:04:89\t\tCisco Systems, Inc\n68:05:71\t\tSamsung Electronics Co.,Ltd\n68:05:CA\t\tIntel Corporate\n68:07:0A\t\tTPVision Europe B.V\n68:07:15\t\tIntel Corporate\n68:09:27\t\tApple, Inc.\n68:0A:D7\t\tYancheng Kecheng Optoelectronic Technology Co., Ltd\n68:0A:E2\t\tSilicon Laboratories\n68:12:2D\t\tSpecial Instrument Development Co., Ltd.\n68:12:95\t\tLupine Lighting Systems GmbH\n68:13:24\t\tHuawei Device Co., Ltd.\n68:13:E2\t\tEltex Enterprise LTD\n68:13:F3\t\tAmazon Technologies Inc.\n68:14:01\t\tHon Hai Precision Ind. Co.,Ltd.\n68:15:90\t\tSagemcom Broadband SAS\n68:15:D3\t\tZaklady Elektroniki i Mechaniki Precyzyjnej R&G S.A.\n68:16:05\t\tSystems And Electronic Development FZCO\n68:17:29\t\tIntel Corporate\n68:18:D9\t\tHill AFB - CAPRE Group\n68:19:3F\t\tDigital Airways\n68:19:AC\t\tGuangzhou Xianyou Intelligent Technogoly CO., LTD\n68:1A:7C\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n68:1A:A4\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n68:1A:B2\t\tzte corporation\n68:1B:EF\t\tHuawei Technologies Co.,Ltd\n68:1C:A2\t\tRosewill Inc.\n68:1D:4C\t\teSystems MTG GmbH\n68:1D:64\t\tSunwave Communications Co., Ltd\n68:1D:EF\t\tShenzhen CYX Technology Co., Ltd.\n68:1E:8B\t\tInfoSight Corporation\n68:1F:40\t\tBlu Wireless Technology Ltd\n68:1F:D8\t\tSiemens Industry, Inc.\n68:21:5F\t\tEdgecore Networks Corporation\n68:22:8E\t\tJuniper Networks\n68:22:E5\t\tHuawei Device Co., Ltd.\n68:23:4B\t\tNihon Dengyo Kousaku\n68:23:B0\t\tTexas Instruments\n68:23:F4\t\tShenzhen Jinlangxin Technology Co., Ltd\n68:24:99\t\tQuectel Wireless Solutions Co.,Ltd.\n68:25:DD\t\tEspressif Inc.\n68:26:24\t\tErgatta\n68:26:2A\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n68:27:19\t\tMicrochip Technology Inc.\n68:27:37\t\tSamsung Electronics Co.,Ltd\n68:27:5F\t\tzte corporation\n68:28:6C\t\tSony Interactive Entertainment Inc.\n68:28:BA\t\tDejai\n68:28:CF\t\tHewlett Packard Enterprise\n68:28:F6\t\tVubiq Networks, Inc.\n68:29:DC\t\tFicosa Electronics S.L.U.\n68:2C:4F\t\tleerang corporation\n68:2C:7B\t\tCisco Systems, Inc\n68:2D:83\t\tShenzhen Dinghe Communication Company\n68:2D:DC\t\tWuhan Changjiang Electro-Communication Equipment CO.,LTD\n68:2F:67\t\tApple, Inc.\n68:31:FE\t\tTeladin Co.,Ltd.\n68:33:2C\t\tKenstel Networks Limited\n68:33:EE\t\tCommscope\n68:34:21\t\tIntel Corporate\n68:34:89\t\tLEA Professional\n68:35:63\t\tShenzhen Liown Electronics Co.,Ltd.\n68:36:B5\t\tDriveScale, Inc.\n68:37:E9\t\tAmazon Technologies Inc.\n68:38:E3\t\tEYESON SOLUTION CO.,Ltd\n68:39:43\t\tittim\n68:3A:1E\t\tCisco Meraki\n68:3A:48\t\tSAMJIN Co., Ltd.\n68:3B:1E\t\tCountwise LTD\n68:3B:78\t\tCisco Systems, Inc\n68:3C:7D\t\tMagic Intelligence Technology Limited\n68:3E:02\t\tSIEMENS AG, Digital Factory, Motion Control System\n68:3E:26\t\tIntel Corporate\n68:3E:34\t\tMEIZU Technology Co., Ltd.\n68:3E:C0\t\tApple, Inc.\n68:3E:EC\t\tEreca\n68:3F:1E\t\tEFFECT Photonics B.V.\n68:3F:7D\t\tIngram Micro Services\n68:40:3C\t\tFiberhome Telecommunication Technologies Co.,LTD\n68:41:8F\t\tTelechips, Inc.\n68:42:16\t\tSteplock Access AB\n68:43:52\t\tBhuu Limited\n68:43:D7\t\tAgilecom Photonics Solutions Guangdong Limited\n68:44:65\t\tApple, Inc.\n68:45:71\t\tHuawei Device Co., Ltd.\n68:45:CC\t\tApple, Inc.\n68:45:F1\t\tToshiba Client Solutions Co., Ltd.\n68:47:24\t\tEM Microelectronic\n68:47:49\t\tTexas Instruments\n68:48:98\t\tSamsung Electronics Co.,Ltd\n68:49:83\t\tHuawei Technologies Co.,Ltd\n68:49:92\t\tCisco Meraki\n68:49:B2\t\tCarlo Gavazzi Ltd\n68:4A:76\t\teero inc.\n68:4A:AE\t\tHuawei Technologies Co.,Ltd\n68:4A:E9\t\tSamsung Electronics Co.,Ltd\n68:4B:88\t\tGaltronics Telemetry Inc.\n68:4C:25\t\tHuawei Device Co., Ltd.\n68:4C:A8\t\tShenzhen Herotel Tech. Co., Ltd.\n68:4D:B6\t\tXiaomi Communications Co Ltd\n68:4E:05\t\tHunan Fn-Link Technology Limited\n68:4F:64\t\tDell Inc.\n68:50:5D\t\tHalo Technologies\n68:50:8C\t\tShanghai Sunmi Technology Co.,Ltd.\n68:51:34\t\tHewlett Packard Enterprise\n68:51:B7\t\tPowerCloud Systems, Inc.\n68:52:10\t\tMCS Logic\n68:52:D6\t\tUGame Technology Co.,Ltd\n68:53:6C\t\tSPnS Co.,Ltd\n68:53:77\t\tBouffalo Lab (Nanjing) Co., Ltd.\n68:53:88\t\tP&S Technology\n68:53:9D\t\tEM Microelectronic\n68:54:5A\t\tIntel Corporate\n68:54:C1\t\tColorTokens, Inc.\n68:54:ED\t\tAlcatel-Lucent\n68:54:F5\t\tenLighted Inc\n68:54:FD\t\tAmazon Technologies Inc.\n68:55:D4\t\tSeiko Epson Corporation\n68:57:2D\t\tTuya Smart Inc.\n68:58:11\t\tFiberhome Telecommunication Technologies Co.,LTD\n68:58:A0\t\tHonor Device Co., Ltd.\n68:58:C5\t\tZF TRW Automotive\n68:59:32\t\tSunitec Enterprise Co.,Ltd\n68:59:7F\t\tAlcatel Lucent\n68:5A:CF\t\tSamsung Electronics Co.,Ltd\n68:5B:35\t\tApple, Inc.\n68:5B:36\t\tPowertech Industrial Co., Ltd.\n68:5D:43\t\tIntel Corporate\n68:5E:1C\t\tTexas Instruments\n68:5E:6B\t\tPowerRay Co., Ltd.\n68:5E:DD\t\tApple, Inc.\n68:62:8A\t\tvivo Mobile Communication Co., Ltd.\n68:63:50\t\tHella India Automotive Pvt Ltd\n68:63:59\t\tAdvanced Digital Broadcast SA\n68:63:72\t\tHuawei Device Co., Ltd.\n68:64:4B\t\tApple, Inc.\n68:65:B7\t\tZhishang Chuanglian Technology Co., Ltd\n68:67:25\t\tEspressif Inc.\n68:67:C7\t\tSagemcom Broadband SAS\n68:69:2E\t\tZycoo Co.,Ltd\n68:69:75\t\tAngler Labs Inc\n68:69:CA\t\tHitachi, Ltd.\n68:69:F2\t\tComAp s.r.o.\n68:6B:6A\t\tPhytium Technology Co.,Ltd.\n68:6C:E6\t\tMicrosoft Corporation\n68:6D:BC\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n68:6E:23\t\tWi3 Inc.\n68:6E:48\t\tProphet Electronic Technology Corp.,Ltd\n68:71:61\t\tCisco Systems, Inc\n68:72:51\t\tUbiquiti Inc\n68:72:C3\t\tSamsung Electronics Co.,Ltd\n68:72:DC\t\tCETORY.TV Company Limited\n68:76:27\t\tZhuhai Dingzhi Electronic Technology Co., Ltd\n68:76:4F\t\tSony Corporation\n68:77:24\t\tTp-Link Technologies Co.,Ltd.\n68:77:DA\t\tzte corporation\n68:78:48\t\tWestunitis Co., Ltd.\n68:78:4C\t\tNortel Networks\n68:79:09\t\tCisco Systems, Inc\n68:79:12\t\tIEEE Registration Authority\n68:79:12:00:00:00/28\tPCTEL, Inc.\n68:79:12:10:00:00/28\tAnnapurna labs\n68:79:12:20:00:00/28\tCndi Co.,Ltd\n68:79:12:30:00:00/28\tStephan Electronics SARL\n68:79:12:40:00:00/28\tMcDonald's Corporation\n68:79:12:50:00:00/28\tCopper Labs, Inc.\n68:79:12:60:00:00/28\tAppotronics Co., Ltd\n68:79:12:70:00:00/28\tBabbit and Friends, SIA\n68:79:12:80:00:00/28\tShangHai Aigentoo Information Technology Co., Ltd\n68:79:12:90:00:00/28\tLEAPS s.r.o.\n68:79:12:A0:00:00/28\tWingtech Mobile Communications Co., Ltd.\n68:79:12:B0:00:00/28\tSwisscom Broadcast Ltd\n68:79:12:C0:00:00/28\tGlobus Infocom Limited\n68:79:12:D0:00:00/28\tNeurolab\n68:79:12:E0:00:00/28\tAmetek Solidstate Controls\n68:79:24\t\tELS-GmbH & Co. KG\n68:79:C4\t\tShanghai MXCHIP Information Technology Co., Ltd.\n68:79:DD\t\tOmnipless Manufacturing (PTY) Ltd\n68:79:ED\t\tSHARP Corporation\n68:7A:64\t\tIntel Corporate\n68:7C:C8\t\tMeasurement Systems S. de R.L.\n68:7C:D5\t\tY Soft Corporation, a.s.\n68:7D:00\t\tShenzhen YOUHUA Technology Co., Ltd\n68:7D:6B\t\tSamsung Electronics Co.,Ltd\n68:7D:B4\t\tCisco Systems, Inc\n68:7F:74\t\tCisco-Linksys, LLC\n68:7F:F0\t\tTP-Link Systems Inc\n68:81:E0\t\tHuawei Technologies Co.,Ltd\n68:82:F2\t\tFIXME GmbH\n68:83:1A\t\tPandora Mobility Corporation\n68:83:CB\t\tApple, Inc.\n68:84:70\t\teSSys Co.,Ltd\n68:84:7E\t\tFujitsu Limited\n68:85:40\t\tIGI Mobile, Inc.\n68:85:6A\t\tOuterLink Corporation\n68:85:A4\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n68:86:A7\t\tCisco Systems, Inc\n68:86:E7\t\tOrbotix, Inc.\n68:87:1C\t\tMotorola Mobility LLC, a Lenovo Company\n68:87:6B\t\tINQ Mobile Limited\n68:87:BD\t\tzte corporation\n68:87:C6\t\tCisco Systems, Inc\n68:88:A1\t\tUniversal Electronics, Inc.\n68:89:75\t\tnuoxc\n68:89:C1\t\tHuawei Technologies Co.,Ltd\n68:8A:B5\t\tEDP Servicos\n68:8A:F0\t\tzte corporation\n68:8B:0F\t\tChina Mobile IOT Company Limited\n68:8B:F4\t\tArista Network, Inc.\n68:8D:B6\t\tAetek Inc.\n68:8F:2E\t\tHitron Technologies. Inc\n68:8F:84\t\tHuawei Technologies Co.,Ltd\n68:8F:C9\t\tZhuolian (Shenzhen) Communication Co., Ltd\n68:91:D0\t\tIEEE Registration Authority\n68:91:D0:00:00:00/28\tCentral Railway Manufacturing\n68:91:D0:10:00:00/28\tMulti Alarm Zrt.\n68:91:D0:20:00:00/28\tShenzhen NeaTech Intelligence Technology Co., Ltd.\n68:91:D0:30:00:00/28\tAmbitio LLC\n68:91:D0:40:00:00/28\tG-TECH Instruments Inc.\n68:91:D0:50:00:00/28\tNIPK Electron Co.\n68:91:D0:60:00:00/28\tfemrice\n68:91:D0:70:00:00/28\tOmniimpex GmbH\n68:91:D0:80:00:00/28\tsolvimus GmbH\n68:91:D0:90:00:00/28\tQuantex\n68:91:D0:A0:00:00/28\tWiseCube\n68:91:D0:B0:00:00/28\tAltis Technology\n68:91:D0:C0:00:00/28\tSpraying Systems Co.\n68:91:D0:D0:00:00/28\tFuzhou x-speed information technology Co.,Ltd.\n68:91:D0:E0:00:00/28\tOutstanding Technology Co., Ltd.\n68:92:34\t\tRuckus Wireless\n68:93:20\t\tNew H3C Technologies Co., Ltd\n68:93:2E\t\tHabana Labs LTD.\n68:93:61\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n68:94:23\t\tHon Hai Precision Ind. Co.,Ltd.\n68:94:4A\t\tzte corporation\n68:95:1B\t\tHuawei Device Co., Ltd.\n68:95:75\t\tZhejiang Bodyguard Electronic Co., Ltd\n68:96:2E\t\tHuawei Technologies Co.,Ltd\n68:96:6A\t\tOhsung\n68:96:7B\t\tApple, Inc.\n68:97:4B\t\tShenzhen Costar Electronics Co. Ltd.\n68:97:E8\t\tSociety of Motion Picture & Television Engineers\n68:98:61\t\tBeacon Inc\n68:99:CD\t\tCisco Systems, Inc\n68:9A:21\t\tFiberhome Telecommunication Technologies Co.,LTD\n68:9A:87\t\tAmazon Technologies Inc.\n68:9A:B7\t\tAtelier Vision Corporation\n68:9B:43\t\tHuawei Device Co., Ltd.\n68:9C:5E\t\tAcSiP Technology Corp.\n68:9C:70\t\tApple, Inc.\n68:9C:E2\t\tCisco Systems, Inc\n68:9E:0B\t\tCisco Systems, Inc\n68:9E:19\t\tTexas Instruments\n68:9E:29\t\tzte corporation\n68:9E:6A\t\tHuawei Device Co., Ltd.\n68:9F:F0\t\tzte corporation\n68:A0:3E\t\tHuawei Technologies Co.,Ltd\n68:A0:F6\t\tHuawei Technologies Co.,Ltd\n68:A1:B7\t\tHonghao Mingchuan Technology (Beijing) CO.,Ltd.\n68:A2:AA\t\tAcres Manufacturing\n68:A3:78\t\tFreebox Sas\n68:A3:C4\t\tLiteon Technology Corporation\n68:A4:0E\t\tBSH Hausgeräte GmbH\n68:A4:6A\t\tHuawei Technologies Co.,Ltd\n68:A4:7D\t\tSun Cupid Technology (HK) LTD\n68:A5:93\t\tApple, Inc.\n68:A6:82\t\tShenzhen YOUHUA Technology Co., Ltd\n68:A7:B4\t\tHonor Device Co., Ltd.\n68:A8:28\t\tHuawei Technologies Co.,Ltd\n68:A8:6D\t\tApple, Inc.\n68:A8:78\t\tGeoWAN Pty Ltd\n68:A8:E1\t\tWacom Co.,Ltd.\n68:AA:C4\t\tAltice Labs\n68:AA:D2\t\tDatecs Ltd.,\n68:AB:09\t\tNokia\n68:AB:1E\t\tApple, Inc.\n68:AB:8A\t\tRF IDeas\n68:AB:BC\t\tBeijing Xiaomi Mobile Software Co., Ltd\n68:AE:04\t\tShenzhen SuperElectron Technology Co.,Ltd.\n68:AE:20\t\tApple, Inc.\n68:AF:13\t\tFutura Mobility\n68:AF:FF\t\tShanghai Cambricon Information Technology Co., Ltd.\n68:B0:94\t\tInesa Electron Co.,Ltd\n68:B1:C9\t\tIYO, Inc\n68:B3:5E\t\tShenzhen Neostra Technology Co.Ltd\n68:B4:1E\t\tZeasn Technology Private Limited\n68:B4:3A\t\tWaterFurnace International, Inc.\n68:B5:99\t\tHewlett Packard\n68:B6:91\t\tAmazon Technologies Inc.\n68:B6:B3\t\tEspressif Inc.\n68:B6:FC\t\tHitron Technologies. Inc\n68:B7:6B\t\tFiberhome Telecommunication Technologies Co.,LTD\n68:B8:BB\t\tBeijing Xiaomi Electronics Co.,Ltd\n68:B8:D9\t\tAct KDE, Inc.\n68:B9:83\t\tb-plus GmbH\n68:B9:C2\t\tEarda Technologies co Ltd\n68:B9:D3\t\tShenzhen Trolink Technology CO, LTD\n68:BC:0C\t\tCisco Systems, Inc\n68:BD:AB\t\tCisco Systems, Inc\n68:BE:49\t\tNebula Matrix\n68:BF:6C\t\tArista Networks\n68:BF:C4\t\tSamsung Electronics Co.,Ltd\n68:C4:4C\t\tXiaomi Communications Co Ltd\n68:C4:4D\t\tMotorola Mobility LLC, a Lenovo Company\n68:C6:3A\t\tEspressif Inc.\n68:C6:AC\t\tIntel Corporate\n68:C8:EB\t\tRockwell Automation\n68:C9:0B\t\tTexas Instruments\n68:C9:5D\t\tSZ Knowact Robot Technology Co., Ltd\n68:CA:00\t\tOctopus Systems Limited\n68:CA:C4\t\tApple, Inc.\n68:CA:E4\t\tCisco Systems, Inc\n68:CC:6E\t\tHuawei Technologies Co.,Ltd\n68:CC:9C\t\tMine Site Technologies\n68:CC:BA\t\tDense Air Networks US LLC\n68:CD:0F\t\tU Tek Company Limited\n68:CE:4E\t\tL-3 Communications Infrared Products\n68:D1:BA\t\tShenzhen YOUHUA Technology Co., Ltd\n68:D1:FD\t\tShenzhen Trimax Technology Co.,Ltd\n68:D2:47\t\tPortalis LC\n68:D4:0C\t\tTellescom Industria E Comercio Em Telecomunicacao\n68:D4:82\t\tShenzhen Gongjin Electronics Co.,Lt\n68:D4:8B\t\tHailo Technologies Ltd.\n68:D6:ED\t\tGooWi Wireless Technology Co., Limited\n68:D7:9A\t\tUbiquiti Inc\n68:D9:25\t\tProSys Development Services\n68:D9:27\t\tHuawei Technologies Co.,Ltd\n68:D9:3C\t\tApple, Inc.\n68:D9:72\t\tCisco Systems, Inc\n68:D9:76\t\tEM Microelectronic\n68:DA:73\t\tIEEE Registration Authority\n68:DA:73:00:00:00/28\tAnnapurna labs\n68:DA:73:10:00:00/28\tDTEN Inc.\n68:DA:73:20:00:00/28\tShenzhen Alldocube Science And Technology Co., Ltd.\n68:DA:73:30:00:00/28\tSoftronics Ltd\n68:DA:73:40:00:00/28\tAgramkow A/S\n68:DA:73:50:00:00/28\tShenzhen Xin hang xian Electronics Co., LTD\n68:DA:73:60:00:00/28\tGlobal Networks ZEN-EI Co., Ltd\n68:DA:73:70:00:00/28\tHaven Lighting\n68:DA:73:80:00:00/28\tStel Fiber Electronics India Private Limited\n68:DA:73:90:00:00/28\tNadex Machinery(Shanghai) Co.,Ltd\n68:DA:73:A0:00:00/28\tShenzhen Haiyingzhilian Industrial Co., Ltd.\n68:DA:73:B0:00:00/28\tGamber-Johnson LLC\n68:DA:73:C0:00:00/28\tDelta Surge Inc.\n68:DA:73:D0:00:00/28\tSichuan GFS Information Technology Co.Ltd\n68:DA:73:E0:00:00/28\tSynamedia\n68:DB:54\t\tPhicomm (Shanghai) Co., Ltd.\n68:DB:67\t\tNantong Coship Electronics Co., Ltd.\n68:DB:96\t\tOPWILL Technologies CO .,LTD\n68:DB:CA\t\tApple, Inc.\n68:DB:F5\t\tAmazon Technologies Inc.\n68:DC:E8\t\tPacketStorm Communications\n68:DD:26\t\tShanghai Focus Vision Security Technology Co.,Ltd\n68:DD:B7\t\tTp-Link Technologies Co.,Ltd.\n68:DD:D9\t\tHMD Global Oy\n68:DE:CE\t\tFiberhome Telecommunication Technologies Co.,LTD\n68:DF:DD\t\tXiaomi Communications Co Ltd\n68:DF:E4\t\tSamsung Electronics Co.,Ltd\n68:E1:54\t\tSiMa.ai\n68:E1:66\t\tPrivate\n68:E1:DC\t\tBuffalo.Inc\n68:E2:09\t\tHuawei Technologies Co.,Ltd\n68:E4:1F\t\tUnglaube Identech GmbH\n68:E4:78\t\tQingdao Haier Technology Co.,Ltd\n68:E5:80\t\tApple, Inc.\n68:E5:9E\t\tCisco Systems, Inc\n68:E7:4A\t\tTexas Instruments\n68:E7:C2\t\tSamsung Electronics Co.,Ltd\n68:E8:EB\t\tLinktel Technologies Co.,Ltd\n68:E9:05\t\tFiberhome Telecommunication Technologies Co.,LTD\n68:EB:AE\t\tSamsung Electronics Co.,Ltd\n68:EB:C5\t\tAngstrem Telecom\n68:EC:62\t\tYODO Technology Corp. Ltd.\n68:EC:8A\t\tIKEA of Sweden AB\n68:EC:C5\t\tIntel Corporate\n68:ED:43\t\tBlackBerry RTS\n68:ED:57\t\tJuniper Networks\n68:ED:A4\t\tShenzhen Seavo Technology Co.,Ltd\n68:EE:4B\t\tSharetronic Data Technology Co.,Ltd\n68:EE:88\t\tShenzhen TINNO Mobile Technology Corp.\n68:EE:96\t\tCisco SPVTG\n68:EF:43\t\tApple, Inc.\n68:EF:AB\t\tVention\n68:EF:BD\t\tCisco Systems, Inc\n68:EF:DC\t\tApple, Inc.\n68:F0:6D\t\tAlong Industrial Co., Limited\n68:F0:B5\t\tHonor Device Co., Ltd.\n68:F0:BC\t\tShenzhen LiWiFi Technology Co., Ltd\n68:F0:D0\t\tSkyBell Technologies Inc.\n68:F1:25\t\tData Controls Inc.\n68:F3:8E\t\tJuniper Networks\n68:F4:4B\t\tHome Control Singapore Pte Ltd\n68:F5:43\t\tHuawei Technologies Co.,Ltd\n68:F6:2B\t\tItel Mobile Limited\n68:F6:3B\t\tAmazon Technologies Inc.\n68:F7:28\t\tLCFC(Hefei) Electronics Technology co., ltd\n68:F7:D8\t\tMicrosoft Corporation\n68:F8:95\t\tRedflow Limited\n68:F9:56\t\tObjetivos y Servicio de Valor Añadido\n68:FB:7E\t\tApple, Inc.\n68:FB:95\t\tGeneralplus Technology Inc.\n68:FC:B3\t\tNext Level Security Systems, Inc.\n68:FC:B6\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n68:FC:CA\t\tSamsung Electronics Co.,Ltd\n68:FE:71\t\tEspressif Inc.\n68:FE:DA\t\tFiberhome Telecommunication Technologies Co.,LTD\n68:FE:F7\t\tApple, Inc.\n68:FF:7B\t\tTp-Link Technologies Co.,Ltd.\n6A:0E:20\t\tGeoFrenzy, Inc\n6A:1F:6C\t\tiPass, Inc.\n6A:40:65\t\tOpen Connectivity Foundation\n6A:5C:35\t\tSecrétariat général de la défense et de la sécurité nationale\n6A:62:1E\t\tDIFI Consortium\n6A:71:E6\t\tFuelCloud\n6A:73:7D\t\t25G Ethernet Consortium\n6A:8E:AF\t\tWaoo\n6A:9D:A4\t\tGlobal Reach Technology\n6A:B6:F2\t\tEli Technology Inc\n6A:B8:7A\t\tAcrosswaves\n6A:E6:4A\t\tS&O Electronics (Malaysia) Sdn. Bhd.\n6A:E7:32\t\tUNIS-WDC Storage Co.,Ltd\n6C:00:6B\t\tSamsung Electronics Co.,Ltd\n6C:02:73\t\tShenzhen Jin Yun Video Equipment Co., Ltd.\n6C:02:E0\t\tHP Inc.\n6C:03:09\t\tCisco Systems, Inc\n6C:03:70\t\tExtreme Networks Headquarters\n6C:03:B5\t\tCisco Systems, Inc\n6C:04:60\t\tRBH Access Technologies Inc.\n6C:04:7A\t\tHuawei Technologies Co.,Ltd\n6C:05:D3\t\tChina Dragon Technology Limited\n6C:05:D5\t\tEthertronics Inc\n6C:06:D6\t\tHuawei Device Co., Ltd.\n6C:08:31\t\tAnalog Systems\n6C:09:0A\t\tGematica Srl\n6C:09:BF\t\tFiberhome Telecommunication Technologies Co.,LTD\n6C:09:D6\t\tDigiquest Electronics LTD\n6C:0B:5E\t\tHP Inc.\n6C:0B:84\t\tUniversal Global Scientific Industrial Co., Ltd.\n6C:0C:9A\t\tAmazon Technologies Inc.\n6C:0D:34\t\tNokia\n6C:0D:C4\t\tBeijing Xiaomi Electronics Co., Ltd.\n6C:0D:E1\t\tDongguan Cannice Precision Manufacturing Co., Ltd.\n6C:0E:0D\t\tSony Corporation\n6C:0E:E6\t\tChengdu Xiyida Electronic Technology Co,.Ltd\n6C:0F:0B\t\tChina Mobile Group Device Co.,Ltd.\n6C:0F:61\t\tHypervolt Ltd\n6C:0F:6A\t\tJDC Tech Co., Ltd.\n6C:10:8B\t\tWeLink Communications\n6C:11:B3\t\tWu Qi Technologies,Inc.\n6C:12:70\t\tApple, Inc.\n6C:13:D5\t\tCisco Systems, Inc\n6C:14:14\t\tBUJEON ELECTRONICS Co,.Ltd\n6C:14:6E\t\tHuawei Technologies Co.,Ltd\n6C:14:F7\t\tErhardt+Leimer GmbH\n6C:15:24\t\tIEEE Registration Authority\n6C:15:24:00:00:00/28\tDefa As\n6C:15:24:10:00:00/28\tTelsonic AG\n6C:15:24:20:00:00/28\tLinkplay\n6C:15:24:30:00:00/28\tForcite Helmet Systems Pty Ltd\n6C:15:24:40:00:00/28\tMagicyo Technology CO., LTD.\n6C:15:24:50:00:00/28\tShenzhen Electron Technology Co., LTD.\n6C:15:24:60:00:00/28\tKunshan Abram Software Technology Co.,Ltd.\n6C:15:24:70:00:00/28\tMotium Pty Ltd\n6C:15:24:80:00:00/28\tShenZhen Chainway Information Technology Co., Ltd.\n6C:15:24:90:00:00/28\tD-Home Smaart\n6C:15:24:A0:00:00/28\tSteris\n6C:15:24:B0:00:00/28\tAnnapurna labs\n6C:15:24:C0:00:00/28\tCoral-Taiyi\n6C:15:24:D0:00:00/28\tSymlink Corporation\n6C:15:24:E0:00:00/28\tAEC s.r.l.\n6C:15:44\t\tMicrosoft Corporation\n6C:15:DB\t\tArcadyan Corporation\n6C:15:F9\t\tNautronix Limited\n6C:16:0E\t\tShotTracker\n6C:16:29\t\tEdifier International\n6C:16:32\t\tHuawei Technologies Co.,Ltd\n6C:18:11\t\tDecatur Electronics\n6C:19:8F\t\tD-Link International\n6C:19:C0\t\tApple, Inc.\n6C:1A:75\t\tHuawei Device Co., Ltd.\n6C:1B:3F\t\tMiraeSignal Co., Ltd\n6C:1C:71\t\tZhejiang Dahua Technology Co., Ltd.\n6C:1D:2C\t\tHuawei Technologies Co.,Ltd\n6C:1D:EB\t\tu-blox AG\n6C:1E:70\t\tGuangzhou YBDS IT Co.,Ltd\n6C:1E:90\t\tHansol Technics Co., Ltd.\n6C:1E:D7\t\tvivo Mobile Communication Co., Ltd.\n6C:1F:8A\t\tApple, Inc.\n6C:1F:F7\t\tUgreen Group Limited\n6C:20:56\t\tCisco Systems, Inc\n6C:21:A2\t\tAMPAK Technology, Inc.\n6C:22:1A\t\tAltoBeam Inc.\n6C:22:AB\t\tAinsworth Game Technology\n6C:22:F7\t\tNokia Shanghai Bell Co., Ltd.\n6C:23:16\t\tTATUNG Technology Inc.,\n6C:23:B9\t\tSony Corporation\n6C:23:CB\t\tWattty Corporation\n6C:24:08\t\tLCFC(Hefei) Electronics Technology co., ltd\n6C:24:83\t\tMicrosoft Mobile Oy\n6C:24:A6\t\tvivo Mobile Communication Co., Ltd.\n6C:25:B9\t\tBbk Educational Electronics Corp.,Ltd.\n6C:26:36\t\tHuawei Technologies Co.,Ltd\n6C:27:79\t\tMicrosoft Mobile Oy\n6C:27:C8\t\tIEEE Registration Authority\n6C:27:C8:00:00:00/28\tLooki Tech Limited\n6C:27:C8:10:00:00/28\tChongqing Seres Phoenix Intelligent Innovation Technology Co.,Ltd.\n6C:27:C8:20:00:00/28\tReduxi GmbH\n6C:27:C8:30:00:00/28\tIDIS Nederland BV\n6C:27:C8:40:00:00/28\tPickUp Kft.\n6C:27:C8:50:00:00/28\tYuanzhong International Trade Co.,Limited\n6C:27:C8:60:00:00/28\tJiayuan Technology Co.,Ltd\n6C:27:C8:70:00:00/28\tBeijing Cunyin Chengqi Technology Co., Ltd.\n6C:27:C8:80:00:00/28\tWuhan Baoji Electronic Technology Co.,Ltd\n6C:27:C8:90:00:00/28\tMitsubishi Electric Europe B.V UK Branch\n6C:27:C8:A0:00:00/28\tHICI Digital Power Technology Co.,Ltd.\n6C:27:C8:B0:00:00/28\tSensio AS\n6C:27:C8:C0:00:00/28\tShenzhen Eview Gps Technology\n6C:27:C8:D0:00:00/28\tBg T&A Co.\n6C:27:C8:E0:00:00/28\tScentedVents\n6C:29:90\t\tWiZ Connected Lighting Company Limited\n6C:29:95\t\tIntel Corporate\n6C:29:D2\t\tCisco Systems, Inc\n6C:2A:CB\t\tPaxton Access Ltd\n6C:2A:DF\t\tIEEE Registration Authority\n6C:2A:DF:00:00:00/28\tAdemco Inc. dba ADI Global Distribution\n6C:2A:DF:10:00:00/28\tXi'an Xindian Equipment Engineering Center Co., Ltd\n6C:2A:DF:20:00:00/28\tDaiko Electric Co.,Ltd\n6C:2A:DF:30:00:00/28\tJohnson Controls IR, Sabroe Controls\n6C:2A:DF:40:00:00/28\tZhejiang Eternal Automation Sci-Tec Co., Ltd\n6C:2A:DF:50:00:00/28\tXinjiang Ying Sheng Information Technology Co., Ltd.\n6C:2A:DF:60:00:00/28\tITI Limited\n6C:2A:DF:70:00:00/28\tRootV\n6C:2A:DF:80:00:00/28\tBeijing Yisheng Chuanqi Technology Co., Ltd.\n6C:2A:DF:90:00:00/28\tSimpleway Europe a.s.\n6C:2A:DF:A0:00:00/28\tJbf\n6C:2A:DF:B0:00:00/28\tMOBA Mobile Automation AG\n6C:2A:DF:C0:00:00/28\tVnets Information Technology Ltd.\n6C:2A:DF:D0:00:00/28\tSichuan Huidian Qiming Intelligent Technology Co.,Ltd\n6C:2A:DF:E0:00:00/28\tWeatherFlow-Tempest, Inc\n6C:2B:59\t\tDell Inc.\n6C:2C:06\t\tOOO NPP Systemotechnika-NN\n6C:2C:DC\t\tSkyworth Digital Technology(Shenzhen) Co.,Ltd\n6C:2D:24\t\tZhen Shi Information Technology (Shanghai) Co., Ltd.\n6C:2E:33\t\tAccelink Technologies Co.,Ltd.\n6C:2E:72\t\tB&B Exporting Limited\n6C:2E:85\t\tSagemcom Broadband SAS\n6C:2F:1C\t\tNexus Raytek Pty Ltd\n6C:2F:2C\t\tSamsung Electronics Co.,Ltd\n6C:2F:80\t\tIntel Corporate\n6C:2F:8A\t\tSamsung Electronics Co.,Ltd\n6C:30:2A\t\tTexas Instruments\n6C:31:0E\t\tCisco Systems, Inc\n6C:32:DE\t\tIndieon Technologies Pvt. Ltd.\n6C:33:A9\t\tMagicjack LP\n6C:34:91\t\tHuawei Technologies Co.,Ltd\n6C:38:38\t\tMarking System Technology Co., Ltd.\n6C:38:45\t\tFiberhome Telecommunication Technologies Co.,LTD\n6C:38:A1\t\tUbee Interactive Co., Limited\n6C:39:1D\t\tBeijing ZhongHuaHun Network Information center\n6C:3A:36\t\tGlowforge Inc\n6C:3A:84\t\tShenzhen Aero-Startech. Co.Ltd\n6C:3A:FF\t\tApple, Inc.\n6C:3B:6B\t\tRouterboard.com\n6C:3B:E5\t\tHewlett Packard\n6C:3C:53\t\tSoundHawk Corp\n6C:3C:7C\t\tCanon Inc.\n6C:3C:8C\t\tDell Inc.\n6C:3E:6D\t\tApple, Inc.\n6C:3E:9C\t\tKE Knestel Elektronik GmbH\n6C:40:08\t\tApple, Inc.\n6C:40:C6\t\tNimbus Data, Inc.\n6C:40:E8\t\tvivo Mobile Communication Co., Ltd.\n6C:41:0E\t\tCisco Systems, Inc\n6C:41:6A\t\tCisco Systems, Inc\n6C:41:DE\t\tHuawei Technologies Co.,Ltd\n6C:42:AB\t\tSubscriber Networks, Inc.\n6C:43:3C\t\tTecno Mobile Limited\n6C:44:18\t\tZappware\n6C:44:2A\t\tHuawei Technologies Co.,Ltd\n6C:45:98\t\tAntex Electronic Corp.\n6C:45:C4\t\tCloudflare, Inc.\n6C:47:60\t\tSunitec Enterprise Co.,Ltd\n6C:48:3F\t\tXiaomi Communications Co Ltd\n6C:48:A6\t\tFiberhome Telecommunication Technologies Co.,LTD\n6C:49:C1\t\to2ones Co., Ltd.\n6C:4A:39\t\tBita\n6C:4A:74\t\tAerodisk Llc\n6C:4A:85\t\tApple, Inc.\n6C:4B:7F\t\tVossloh-Schwabe Deutschland GmbH\n6C:4B:90\t\tLiteON\n6C:4B:B4\t\tHUMAX Co., Ltd.\n6C:4C:E2\t\tIntel Corporate\n6C:4D:51\t\tShenzhen Ceres Technology Co., Ltd.\n6C:4D:73\t\tApple, Inc.\n6C:4E:86\t\tThird Millennium Systems Ltd.\n6C:4E:F6\t\tCisco Systems, Inc\n6C:4F:89\t\tZyxel Communications Corporation\n6C:4F:A1\t\tCisco Systems, Inc\n6C:50:4D\t\tCisco Systems, Inc\n6C:51:BF\t\tHuawei Device Co., Ltd.\n6C:51:E4\t\tHuawei Device Co., Ltd.\n6C:54:CD\t\tLampex Electronics Limited\n6C:55:63\t\tSamsung Electronics Co.,Ltd\n6C:55:8D\t\tHuawei Technologies Co.,Ltd\n6C:55:B1\t\tAmazon Technologies Inc.\n6C:55:E8\t\tVantiva USA LLC\n6C:56:40\t\tBLU Products Inc\n6C:56:97\t\tAmazon Technologies Inc.\n6C:57:79\t\tAclima, Inc.\n6C:59:40\t\tMercury Communication Technologies Co.,Ltd.\n6C:59:76\t\tShanghai Tricheer Technology Co.,Ltd.\n6C:5A:34\t\tShenzhen Haitianxiong Electronic Co., Ltd.\n6C:5A:B0\t\tTP-Link Systems Inc\n6C:5A:B5\t\tTCL Technoly Electronics (Huizhou) Co., Ltd.\n6C:5C:14\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n6C:5C:3D\t\tIEEE Registration Authority\n6C:5C:3D:00:00:00/28\tShenZhen Hugsun Technology Co.,Ltd.\n6C:5C:3D:10:00:00/28\tShenzhen Justek Technology Co., Ltd\n6C:5C:3D:20:00:00/28\tVertiv Industrial Systems\n6C:5C:3D:30:00:00/28\tKwong Ming Electrical Manufactory Limited\n6C:5C:3D:40:00:00/28\tHTI Co., LTD.\n6C:5C:3D:50:00:00/28\tUnitel Engineering\n6C:5C:3D:60:00:00/28\tHangzhou Netease Yanxuan Trading Co.,Ltd\n6C:5C:3D:70:00:00/28\tSoundking Electronics&Sound Co., Ltd.\n6C:5C:3D:80:00:00/28\tGuangzhou Guangri Elevator Industry Co.,Ltd\n6C:5C:3D:90:00:00/28\tIskraUralTEL\n6C:5C:3D:A0:00:00/28\tkrtkl inc.\n6C:5C:3D:B0:00:00/28\tReconova Technologies\n6C:5C:3D:C0:00:00/28\tchoyang powertech\n6C:5C:3D:D0:00:00/28\tSyowatsusinkougyo Co.,Ltd.\n6C:5C:3D:E0:00:00/28\tClinton Electronics Corporation\n6C:5C:B1\t\tSilicon Laboratories\n6C:5C:DE\t\tSunReports, Inc.\n6C:5D:3A\t\tMicrosoft Corporation\n6C:5D:63\t\tShenZhen Rapoo Technology Co., Ltd.\n6C:5E:3B\t\tCisco Systems, Inc\n6C:5E:7A\t\tUbiquitous Internet Telecom Co., Ltd\n6C:5F:1C\t\tLenovo Mobile Communication Technology Ltd.\n6C:60:16\t\tOnePlus Technology (Shenzhen) Co., Ltd\n6C:60:D0\t\tHuawei Device Co., Ltd.\n6C:60:EB\t\tZhi Yuan Electronics Co., Limited\n6C:61:26\t\tRinicom Holdings\n6C:61:F4\t\tSfr\n6C:62:6D\t\tMicro-Star INT'L CO., LTD\n6C:62:86\t\tNokia\n6C:62:FE\t\tJuniper Networks\n6C:63:9C\t\tCommscope\n6C:63:F8\t\tUbiquiti Inc\n6C:64:1A\t\tPenguin Computing\n6C:65:67\t\tBELIMO Automation AG\n6C:67:EF\t\tHuawei Technologies Co.,Ltd\n6C:68:A4\t\tGuangzhou V-Solution Telecommunication Technology Co.,Ltd.\n6C:6A:77\t\tIntel Corporate\n6C:6C:0F\t\tHuawei Technologies Co.,Ltd\n6C:6C:D3\t\tCisco Systems, Inc\n6C:6D:09\t\tKyowa Electronics Co.,Ltd.\n6C:6E:07\t\tCe Link Limited\n6C:6E:FE\t\tCore Logic Inc.\n6C:6F:18\t\tStereotaxis, Inc.\n6C:70:39\t\tNovar GmbH\n6C:70:9F\t\tApple, Inc.\n6C:70:CB\t\tSamsung Electronics Co.,Ltd\n6C:71:0D\t\tCisco Systems, Inc\n6C:71:BD\t\tEzelink Telecom\n6C:71:D2\t\tHuawei Technologies Co.,Ltd\n6C:71:D9\t\tAzureWave Technology Inc.\n6C:72:20\t\tD-Link International\n6C:72:4A\t\tOnkyo Technology K.K.\n6C:72:E2\t\tamitek\n6C:72:E7\t\tApple, Inc.\n6C:75:0D\t\tWiFiSONG\n6C:76:37\t\tHuawei Device Co., Ltd.\n6C:76:60\t\tKyocera Corporation\n6C:78:C1\t\tJuniper Networks\n6C:79:B8\t\tTexas Instruments\n6C:7D:B7\t\tCisco Meraki\n6C:7E:67\t\tApple, Inc.\n6C:7F:0C\t\tCisco Meraki\n6C:80:AB\t\tifanr Inc\n6C:81:FE\t\tMitsuba Corporation\n6C:82:43\t\tHuawei Device Co., Ltd.\n6C:83:36\t\tSamsung Electronics Co.,Ltd\n6C:83:38\t\tUbihere\n6C:83:66\t\tNanjing SAC Power Grid Automation Co., Ltd.\n6C:83:75\t\tBroadcom Limited\n6C:86:86\t\tTechnonia\n6C:87:20\t\tNew H3C Technologies Co., Ltd\n6C:88:14\t\tIntel Corporate\n6C:8A:EC\t\tNantong Coship Electronics Co., Ltd.\n6C:8B:2F\t\tzte corporation\n6C:8B:D3\t\tCisco Systems, Inc\n6C:8C:DB\t\tOtus Technologies Ltd\n6C:8D:65\t\tWireless Glue Networks, Inc.\n6C:8D:77\t\tCisco Systems, Inc\n6C:8D:C1\t\tApple, Inc.\n6C:8F:4E\t\tChongqing Yipingfang Technology Co., Ltd.\n6C:8F:B5\t\tMicrosoft Mobile Oy\n6C:90:B1\t\tSanLogic Inc\n6C:91:06\t\tKatena Computing Technologies\n6C:92:BF\t\tIEIT SYSTEMS Co., Ltd.\n6C:92:CF\t\tBroadcom Limited\n6C:93:08\t\tIEEE Registration Authority\n6C:93:08:00:00:00/28\tBraums\n6C:93:08:10:00:00/28\tWaterford Consultants Llc\n6C:93:08:20:00:00/28\tZHEJIANG XIAN DA Environmental Technology Co., Ltd\n6C:93:08:30:00:00/28\tLightnTec GmbH\n6C:93:08:40:00:00/28\tEstelar s.r.o\n6C:93:08:50:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n6C:93:08:60:00:00/28\tUconfree technology(shenzhen)limited\n6C:93:08:70:00:00/28\tLiberty AV Solutions\n6C:93:08:80:00:00/28\tHangzhou Risco System Co.,Ltd\n6C:93:08:90:00:00/28\tShenzhen DOOGEE Hengtong Technology CO., LTD\n6C:93:08:A0:00:00/28\tShenzhen TOPWAY Technology Co.,LTD\n6C:93:08:B0:00:00/28\tShenzhen EZpro Sound & Light Technology Co., Ltd.\n6C:93:08:C0:00:00/28\tShenzhen haichangxing Technology Co., Ltd.\n6C:93:08:D0:00:00/28\tAnnapurna labs\n6C:93:08:E0:00:00/28\tAnddoro Llc\n6C:93:54\t\tYaojin Technology (Shenzhen) Co., LTD.\n6C:93:92\t\tBEKO Technologies GmbH\n6C:94:66\t\tIntel Corporate\n6C:94:F8\t\tApple, Inc.\n6C:95:22\t\tScalys\n6C:96:CF\t\tApple, Inc.\n6C:97:6D\t\tMotorola Mobility LLC, a Lenovo Company\n6C:97:AA\t\tAi Technology Co.,Ltd.\n6C:98:EB\t\tRiverbed Technology, Inc.\n6C:99:61\t\tSagemcom Broadband SAS\n6C:99:89\t\tCisco Systems, Inc\n6C:99:9D\t\tAmazon Technologies Inc.\n6C:9A:B4\t\tBrodersen A/S\n6C:9A:C9\t\tValentine Research, Inc.\n6C:9B:02\t\tNokia Corporation\n6C:9B:C0\t\tChemoptics Inc.\n6C:9C:E9\t\tNimble Storage\n6C:9C:ED\t\tCisco Systems, Inc\n6C:9E:7C\t\tFiberhome Telecommunication Technologies Co.,LTD\n6C:A0:B4\t\tSky Uk Limited\n6C:A1:00\t\tIntel Corporate\n6C:A3:1E\t\tItel Mobile Limited\n6C:A3:67\t\tAvlinkpro\n6C:A4:01\t\tessensys plc\n6C:A4:D1\t\tFiberhome Telecommunication Technologies Co.,LTD\n6C:A6:04\t\tCommscope\n6C:A6:82\t\tEDAM information & communications\n6C:A7:5F\t\tzte corporation\n6C:A7:80\t\tNokia Corporation\n6C:A7:FA\t\tYoungbo Engineering Inc.\n6C:A8:49\t\tAvaya Inc\n6C:A8:58\t\tFiberhome Telecommunication Technologies Co.,LTD\n6C:A9:06\t\tTelefield Ltd\n6C:A9:28\t\tHMD Global Oy\n6C:A9:36\t\tDisplayLink (UK) Ltd\n6C:A9:6F\t\tTransPacket AS\n6C:AA:B3\t\tRuckus Wireless\n6C:AB:05\t\tCisco Systems, Inc\n6C:AB:31\t\tApple, Inc.\n6C:AB:4D\t\tDigital Payment Technologies\n6C:AC:60\t\tVenetex Corp\n6C:AC:C2\t\tSamsung Electronics Co.,Ltd\n6C:AD:3F\t\tHubbell Building Automation, Inc.\n6C:AD:AD\t\tChongqing Fugui Electronics Co.,Ltd.\n6C:AD:EF\t\tKZ Broadband Technologies, Ltd.\n6C:AD:F8\t\tAzureWave Technology Inc.\n6C:AE:8B\t\tIBM Corporation\n6C:AE:E3\t\tNokia\n6C:AE:F6\t\teero inc.\n6C:AF:15\t\tWebasto SE\n6C:B0:77\t\tALL Winner (Hong Kong) Limited\n6C:B0:CE\t\tNetgear\n6C:B0:FD\t\tShenzhen Xinghai Iot Technology Co.,Ltd\n6C:B1:33\t\tApple, Inc.\n6C:B1:58\t\tTp-Link Technologies Co.,Ltd.\n6C:B2:27\t\tSony Video & Sound Products Inc.\n6C:B2:AE\t\tCisco Systems, Inc\n6C:B2:FD\t\tTexas Instruments\n6C:B3:11\t\tShenzhen Lianrui Electronics Co.,Ltd\n6C:B3:4D\t\tSharkNinja Operating LLC\n6C:B3:50\t\tAnhui comhigher tech co.,ltd\n6C:B4:56\t\tEspressif Inc.\n6C:B4:A7\t\tLandauer, Inc.\n6C:B4:FD\t\tHuawei Device Co., Ltd.\n6C:B5:6B\t\tHUMAX Co., Ltd.\n6C:B6:CA\t\tDIVUS GmbH\n6C:B7:49\t\tHuawei Technologies Co.,Ltd\n6C:B7:E2\t\tHuawei Technologies Co.,Ltd\n6C:B7:F4\t\tSamsung Electronics Co.,Ltd\n6C:B8:81\t\tzte corporation\n6C:B9:C5\t\tDelta Networks, Inc.\n6C:BA:B8\t\tSagemcom Broadband SAS\n6C:BE:E9\t\tAlcatel-Lucent IPD\n6C:BF:B5\t\tNoon Technology Co., Ltd\n6C:C1:47\t\tXiamen Hanin Electronic Technology Co., Ltd\n6C:C1:D2\t\tCommscope\n6C:C2:17\t\tHewlett Packard\n6C:C2:42\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n6C:C2:6B\t\tApple, Inc.\n6C:C3:6A\t\tvivo Mobile Communication Co., Ltd.\n6C:C3:74\t\tTexas Instruments\n6C:C3:B2\t\tCisco Meraki\n6C:C4:1E\t\tNEXSEC Incorporated\n6C:C4:9F\t\tHewlett Packard Enterprise\n6C:C4:D5\t\tHMD Global Oy\n6C:C6:3B\t\tTaicang T&W Electronics\n6C:C7:EC\t\tSamsung Electro-Mechanics(Thailand)\n6C:C8:40\t\tEspressif Inc.\n6C:CA:08\t\tCommscope\n6C:CD:D6\t\tNetgear\n6C:CE:44\t\t1More\n6C:CF:39\t\tShanghai StarFive Semiconductor Co., Ltd.\n6C:D0:08\t\tzte corporation\n6C:D0:32\t\tLG Electronics\n6C:D1:46\t\tFRAMOS GmbH\n6C:D1:99\t\tvivo Mobile Communication Co., Ltd.\n6C:D1:B0\t\tWing Sing Electronics Hong Kong Limited\n6C:D1:E5\t\tHuawei Technologies Co.,Ltd\n6C:D2:BA\t\tzte corporation\n6C:D3:EE\t\tZimi Corporation\n6C:D6:30\t\tRootous System Co.,Ltd\n6C:D6:3F\t\tHuawei Technologies Co.,Ltd\n6C:D6:8A\t\tLG Electronics (Mobile Communications)\n6C:D6:E3\t\tCisco Systems, Inc\n6C:D7:04\t\tHuawei Technologies Co.,Ltd\n6C:D7:19\t\tFiberhome Telecommunication Technologies Co.,LTD\n6C:D7:1F\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n6C:D7:A0\t\tWIKO Terminal Technology (Dongguan) Co., Ltd.\n6C:D8:69\t\tGuangzhou Sat Infrared Co.,LTD\n6C:D9:4C\t\tvivo Mobile Communication Co., Ltd.\n6C:DC:6A\t\tPromethean Limited\n6C:DD:30\t\tCisco Systems, Inc\n6C:DD:BC\t\tSamsung Electronics Co.,Ltd\n6C:DD:EF\t\tEPCOMM Inc.\n6C:DE:A9\t\tCisco Meraki\n6C:DF:FB\t\tIEEE Registration Authority\n6C:DF:FB:00:00:00/28\tShenzhen HDCVT Technology\n6C:DF:FB:10:00:00/28\tChongqing Baoli Yota Technologies Limited\n6C:DF:FB:20:00:00/28\tSercomm Corporation.\n6C:DF:FB:30:00:00/28\tBeijing Ainemo Co Ltd\n6C:DF:FB:40:00:00/28\tLineable Inc\n6C:DF:FB:50:00:00/28\tGreenbird Vertriebs GmbH\n6C:DF:FB:60:00:00/28\tAaon\n6C:DF:FB:70:00:00/28\tHashtrend AG\n6C:DF:FB:80:00:00/28\tHardmeier\n6C:DF:FB:90:00:00/28\tYongTechs Electric Co. Ltd\n6C:DF:FB:A0:00:00/28\tGuilin Zhishen Information TechonlogyCO.,Ltd\n6C:DF:FB:B0:00:00/28\tCELL System Co.,Ltd.\n6C:DF:FB:C0:00:00/28\tToucan Systems Ltd\n6C:DF:FB:D0:00:00/28\tNanjing Buruike Electronics Technology Co., Ltd.\n6C:DF:FB:E0:00:00/28\tBeijing Fimi Technology Co., Ltd.\n6C:E0:1E\t\tModcam AB\n6C:E0:B0\t\tSound4\n6C:E2:D3\t\tNew H3C Technologies Co., Ltd\n6C:E3:B6\t\tNera Telecommunications Ltd.\n6C:E4:CE\t\tVilliger Security Solutions AG\n6C:E4:DA\t\tNEC Platforms, Ltd.\n6C:E5:C9\t\tApple, Inc.\n6C:E5:F7\t\tNew H3C Technologies Co., Ltd\n6C:E8:5C\t\tApple, Inc.\n6C:E8:73\t\tTp-Link Technologies Co.,Ltd.\n6C:E8:74\t\tHuawei Technologies Co.,Ltd\n6C:E8:C6\t\tEarda Technologies co Ltd\n6C:E9:07\t\tNokia Corporation\n6C:E9:83\t\tGastron Co., LTD.\n6C:EB:B2\t\tDongguan Sen DongLv Electronics Co.,Ltd\n6C:EB:B6\t\tHuawei Technologies Co.,Ltd\n6C:EC:5A\t\tHon Hai Precision Ind. CO.,Ltd.\n6C:EC:A1\t\tShenzhen Clou Electronics Co. Ltd.\n6C:EC:EB\t\tTexas Instruments\n6C:ED:51\t\tNEXCONTROL Co.,Ltd\n6C:EE:F7\t\tshenzhen scodeno technology co., Ltd.\n6C:EF:BD\t\tCisco Meraki\n6C:EF:C6\t\tShenzhen Twowing Technologies Co.,Ltd.\n6C:F0:49\t\tGiga-Byte Technology Co.,Ltd.\n6C:F1:7E\t\tZhejiang Uniview Technologies Co.,Ltd.\n6C:F2:D8\t\tCanon Inc.\n6C:F3:73\t\tSamsung Electronics Co.,Ltd\n6C:F3:7F\t\tHewlett Packard Enterprise\n6C:F5:E8\t\tMooredoll Inc.\n6C:F6:DA\t\tIntel Corporate\n6C:F7:12\t\tNokia Solutions and Networks GmbH & Co. KG\n6C:F7:84\t\tXiaomi Communications Co Ltd\n6C:F9:7C\t\tNanoptix Inc.\n6C:F9:D2\t\tChengdu Povodo Electronic Technology Co., Ltd\n6C:FA:58\t\tAvaya Inc\n6C:FA:89\t\tCisco Systems, Inc\n6C:FA:A7\t\tAMPAK Technology, Inc.\n6C:FB:ED\t\tGN Audio A/S\n6C:FD:22\t\tSilicon Laboratories\n6C:FD:B9\t\tProware Technologies Co Ltd.\n6C:FE:54\t\tIntel Corporate\n6C:FF:BE\t\tMPB Communications Inc.\n6C:FF:CE\t\tSagemcom Broadband SAS\n70:01:36\t\tFATEK Automation Corporation\n70:01:B5\t\tCisco Systems, Inc\n70:02:58\t\t01Db-Metravib\n70:03:3F\t\tPimax Technology(ShangHai)Co.,Ltd\n70:03:7E\t\tVantiva USA LLC\n70:03:9F\t\tEspressif Inc.\n70:04:1D\t\tEspressif Inc.\n70:04:33\t\tCalifornia Things Inc.\n70:05:14\t\tLG Electronics (Mobile Communications)\n70:06:92\t\tIEEE Registration Authority\n70:06:92:00:00:00/28\tTechology, LLC\n70:06:92:10:00:00/28\tBeijing Fortech Microsystems., Co., Ltd.\n70:06:92:20:00:00/28\tScud (Fujian) Electronics Co.,Ltd\n70:06:92:30:00:00/28\tBosscctv Co., Ltd\n70:06:92:40:00:00/28\tFusiostor Technologies Private Limited\n70:06:92:50:00:00/28\tCanaan Creative Co.,Ltd.\n70:06:92:60:00:00/28\tHangzhou Clounix Technology Limited\n70:06:92:70:00:00/28\tDcnet Solutions India Pvt Ltd\n70:06:92:80:00:00/28\tJMA Wireless\n70:06:92:90:00:00/28\tShenzhen Lingwei Technology Co., Ltd\n70:06:92:A0:00:00/28\tMunters\n70:06:92:B0:00:00/28\tSWIT Electronics Co.,Ltd\n70:06:92:C0:00:00/28\tScoreBird, LLC\n70:06:92:D0:00:00/28\tSkyware Protech Limited\n70:06:92:E0:00:00/28\tGanghsan Guanglian\n70:06:AC\t\tEastcompeace Technology Co., Ltd\n70:07:77\t\tOnTarget Technologies, Inc\n70:08:10\t\tIntel Corporate\n70:08:94\t\tLiteon Technology Corporation\n70:09:71\t\tSamsung Electronics Co.,Ltd\n70:0B:01\t\tSagemcom Broadband SAS\n70:0B:4F\t\tCisco Systems, Inc\n70:0B:C0\t\tDewav Technology Company\n70:0F:6A\t\tCisco Systems, Inc\n70:0F:C7\t\tShenzhen Ikinloop Technology Co.,Ltd.\n70:0F:EC\t\tPoindus Systems Corp.\n70:10:5C\t\tCisco Systems, Inc\n70:10:6F\t\tHewlett Packard Enterprise\n70:11:0E\t\tzte corporation\n70:11:24\t\tApple, Inc.\n70:11:35\t\tLivesecu co., Ltd\n70:11:AE\t\tMusic Life LTD\n70:13:01\t\tVantiva - Connected Home\n70:13:84\t\tApple, Inc.\n70:14:04\t\tLimited Liability Company\n70:14:A6\t\tApple, Inc.\n70:15:FB\t\tIntel Corporate\n70:16:9F\t\tEtherCAT Technology Group\n70:17:D7\t\tShanghai Enflame Technology Co., Ltd.\n70:18:8B\t\tHon Hai Precision Ind. Co.,Ltd.\n70:18:A7\t\tCisco Systems, Inc\n70:19:2F\t\tHuawei Technologies Co.,Ltd\n70:19:88\t\tNanjing Qinheng Microelectronics Co., Ltd.\n70:1A:04\t\tLiteon Technology Corporation\n70:1A:B8\t\tIntel Corporate\n70:1A:D5\t\tAvigilon Alta\n70:1A:ED\t\tAdvas Co., Ltd.\n70:1B:FB\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n70:1C:E7\t\tIntel Corporate\n70:1D:08\t\t99IOT Shenzhen co.,ltd\n70:1D:7F\t\tComtech Technology Co., Ltd.\n70:1D:C4\t\tNorthStar Battery Company, LLC\n70:1E:68\t\tHanna Instruments, Inc.\n70:1F:0B\t\tWilogy Srl\n70:1F:3C\t\tSamsung Electronics Co.,Ltd\n70:1F:53\t\tCisco Systems, Inc\n70:20:84\t\tHon Hai Precision Industry Co., Ltd.\n70:21:7F\t\tXiaomi Communications Co Ltd\n70:22:FE\t\tApple, Inc.\n70:23:93\t\tfos4X GmbH\n70:25:26\t\tNokia\n70:25:59\t\tCyberTAN Technology Inc.\n70:26:05\t\tSONY Visual Products Inc.\n70:28:04\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n70:28:8B\t\tSamsung Electronics Co.,Ltd\n70:29:00\t\tShenzhen ChipTrip Technology Co,Ltd\n70:2A:7D\t\tEpSpot AB\n70:2A:D5\t\tSamsung Electronics Co.,Ltd\n70:2A:D7\t\tNew H3C Intelligence Terminal Co., Ltd.\n70:2B:1D\t\tE-Domus International Limited\n70:2C:09\t\tNintendo Co.,Ltd\n70:2C:1F\t\tWisol\n70:2D:84\t\ti4C Innovations\n70:2D:D1\t\tNewings Communication CO., LTD.\n70:2E:22\t\tzte corporation\n70:2E:80\t\tDIEHL Connectivity Solutions\n70:2E:D9\t\tGuangzhou Shiyuan Electronics Co., Ltd.\n70:2F:35\t\tHuawei Technologies Co.,Ltd\n70:2F:4B\t\tSteelcase Inc.\n70:2F:86\t\tMarquardt GmbH\n70:2F:97\t\tAava Mobile Oy\n70:30:18\t\tAvaya Inc\n70:30:5D\t\tUbiquoss Inc\n70:30:5E\t\tNanjing Zhongke Menglian Information Technology Co.,LTD\n70:31:7F\t\tApple, Inc.\n70:31:87\t\tACX GmbH\n70:32:17\t\tIntel Corporate\n70:32:D5\t\tAthena Wireless Communications Inc\n70:35:09\t\tCisco Systems, Inc\n70:35:7B\t\tvivo Mobile Communication Co., Ltd.\n70:36:B2\t\tFocusai Corp\n70:37:8E\t\tTianyi Telecom Terminals Company Limited\n70:38:11\t\tSiemens Mobility Limited\n70:38:B4\t\tLow Tech Solutions\n70:38:EE\t\tAvaya Inc\n70:3A:0E\t\tHewlett Packard Enterprise\n70:3A:2D\t\tShenzhen V-Link Technology CO., LTD.\n70:3A:51\t\tXiaomi Communications Co Ltd\n70:3A:73\t\tShenzhen Sundray Technologies company Limited\n70:3A:A6\t\tNew H3C Technologies Co., Ltd\n70:3A:CB\t\tGoogle, Inc.\n70:3A:D8\t\tShenzhen Afoundry Electronic Co., Ltd\n70:3C:03\t\tRadiAnt Co.,Ltd\n70:3C:39\t\tSEAWING Kft\n70:3C:69\t\tApple, Inc.\n70:3D:15\t\tHangzhou H3C Technologies Co., Limited\n70:3E:97\t\tIton Technology Corp.\n70:3E:AC\t\tApple, Inc.\n70:40:FF\t\tHuawei Device Co., Ltd.\n70:41:B7\t\tEdwards Lifesciences LLC\n70:42:D3\t\tRuijie Networks Co.,LTD\n70:44:1C\t\tShenzhen Kaifa Technology Co.,Ltd.\n70:46:42\t\tChyng Hong Electronic Co., Ltd.\n70:46:98\t\tHuawei Technologies Co.,Ltd\n70:47:77\t\tRuckus Wireless\n70:47:E9\t\tvivo Mobile Communication Co., Ltd.\n70:48:0F\t\tApple, Inc.\n70:48:B5\t\tCTS System Co., LTD.\n70:48:F7\t\tNintendo Co.,Ltd\n70:49:A2\t\tZyxel Communications Corporation\n70:4A:0E\t\tAMPAK Technology,Inc.\n70:4A:AE\t\tXstream Flow (Pty) Ltd\n70:4A:E4\t\tRinstrum Pty Ltd\n70:4C:A5\t\tFortinet, Inc.\n70:4C:B6\t\tShenzhen SuperElectron Technology Co.,Ltd.\n70:4C:ED\t\tTMRG, Inc.\n70:4D:7B\t\tASUSTek COMPUTER INC.\n70:4D:E7\t\tTecno Mobile Limited\n70:4E:01\t\tKwangwon Tech Co., Ltd.\n70:4E:66\t\tShenzhen Fast Technologies Co.,Ltd\n70:4E:6B\t\tHuawei Technologies Co.,Ltd\n70:4F:08\t\tShenzhen Huisheng Information Technology Co., Ltd.\n70:4F:57\t\tTp-Link Technologies Co.,Ltd.\n70:4F:B8\t\tCommscope\n70:50:AF\t\tSky Uk Limited\n70:50:E7\t\tIEEE Registration Authority\n70:50:E7:00:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n70:50:E7:10:00:00/28\tAnnapurna labs\n70:50:E7:20:00:00/28\tElectronic's Time SRL\n70:50:E7:30:00:00/28\tSkychers Creations ShenZhen Limited\n70:50:E7:40:00:00/28\tQuantumdoor Technologies, Inc.\n70:50:E7:50:00:00/28\tWall Box Chargers, S.L.\n70:50:E7:60:00:00/28\tNippon Pulse America, Inc.\n70:50:E7:70:00:00/28\tYoctopuce\n70:50:E7:80:00:00/28\tShenzhen Dangs Science and Technology CO.,Ltd.\n70:50:E7:90:00:00/28\tElastics.cloud\n70:50:E7:A0:00:00/28\tGuangzhou Tianhe High Tech Industrial Development Zone Zhongsheng Electrical Limited Company\n70:50:E7:B0:00:00/28\tBeijing Shannoncyber Technology Co.,Ltd\n70:50:E7:C0:00:00/28\tshenzhen newbridge communication equipment CO.,LTD\n70:50:E7:D0:00:00/28\tEta Compute Inc.\n70:50:E7:E0:00:00/28\tKfbio (Konfoong Bioinformation Tech Co.,Ltd)\n70:52:C5\t\tAvaya Inc\n70:52:D8\t\tItel Mobile Limited\n70:53:3F\t\tAlfa Instrumentos Eletronicos Ltda.\n70:54:25\t\tCommscope\n70:54:64\t\tSilicon Laboratories\n70:54:B4\t\tVestel Elektronik San ve Tic. A.S.\n70:54:D2\t\tPegatron Corporation\n70:54:F5\t\tHuawei Technologies Co.,Ltd\n70:55:F8\t\tCerebras Systems Inc\n70:56:81\t\tApple, Inc.\n70:57:BF\t\tNew H3C Technologies Co., Ltd\n70:58:12\t\tPanasonic Corporation AVC Networks Company\n70:58:46\t\tTrig Avionics Limited\n70:58:96\t\tInShow Technology\n70:58:A4\t\tActiontec Electronics Inc.\n70:59:57\t\tMedallion Instrumentation Systems\n70:59:86\t\tOoo Ttv\n70:5A:0F\t\tHewlett Packard\n70:5A:6F\t\tIEEE Registration Authority\n70:5A:6F:00:00:00/28\tThyracont Vacuum Instruments GmbH\n70:5A:6F:10:00:00/28\tBMR s.r.o.\n70:5A:6F:20:00:00/28\tTyromotion GmbH\n70:5A:6F:30:00:00/28\tWavelab Telecom Equipment (GZ) Ltd.\n70:5A:6F:40:00:00/28\tVaiotik Co., Ltd\n70:5A:6F:50:00:00/28\tAcer Connect\n70:5A:6F:60:00:00/28\tEarfun Technology (HK) Limited\n70:5A:6F:70:00:00/28\tWiBASE Industrial Solutions Inc.\n70:5A:6F:80:00:00/28\tLUAN Industry and Commerce Co., Ltd\n70:5A:6F:90:00:00/28\tAnnapurna labs\n70:5A:6F:A0:00:00/28\tAnnapurna labs\n70:5A:6F:B0:00:00/28\tCallidus trading, spol. s r.o.\n70:5A:6F:C0:00:00/28\tCoolR Group Inc\n70:5A:6F:D0:00:00/28\tPICadvanced SA\n70:5A:6F:E0:00:00/28\tHall Technologies\n70:5A:9E\t\tVantiva USA LLC\n70:5A:AC\t\tSamsung Electronics Co.,Ltd\n70:5A:B6\t\tCompal Information (Kunshan) Co., Ltd.\n70:5B:2E\t\tM2Communication Inc.\n70:5C:AD\t\tKonami Gaming Inc\n70:5D:CC\t\tEFM Networks\n70:5E:55\t\tRealme Chongqing MobileTelecommunications Corp Ltd\n70:5E:AA\t\tAction Target, Inc.\n70:5F:A3\t\tXiaomi Communications Co Ltd\n70:60:DE\t\tLaVision GmbH\n70:61:73\t\tCalantec GmbH\n70:61:7B\t\tCisco Systems, Inc\n70:61:BE\t\tWistron Neweb Corporation\n70:61:EE\t\tSunwoda Electronic Co.,Ltd\n70:62:B8\t\tD-Link International\n70:64:17\t\tOrbis Tecnologia Electrica S.A.\n70:65:82\t\tSuzhou Hanming Technologies Co., Ltd.\n70:65:A3\t\tKandao lightforge Co., Ltd.\n70:66:1B\t\tSonova AG\n70:66:2A\t\tSony Interactive Entertainment Inc.\n70:66:55\t\tAzureWave Technology Inc.\n70:66:B9\t\tHuawei Device Co., Ltd.\n70:66:E1\t\tdnt Innovation GmbH\n70:68:71\t\tFN-LINK TECHNOLOGY Ltd.\n70:68:79\t\tSaijo Denki International Co., Ltd.\n70:69:5A\t\tCisco Systems, Inc\n70:69:79\t\tIEEE Registration Authority\n70:69:79:00:00:00/28\tFull Solution Telecom\n70:69:79:10:00:00/28\tLinksys Telecom Shenzhen CO., LTD\n70:69:79:20:00:00/28\tGraphcore Ltd\n70:69:79:30:00:00/28\tHebei Baina Xinda Technology Co., Ltd.\n70:69:79:40:00:00/28\tSelectTech GeoSpatial, LLC\n70:69:79:50:00:00/28\tIbyte\n70:69:79:60:00:00/28\tBeijing Security Union Information Technology Co.,Ltd\n70:69:79:70:00:00/28\tIntelitech SIA\n70:69:79:80:00:00/28\tAn Phat Information Technology Co., Ltd\n70:69:79:90:00:00/28\tFaurecia Clarion Electronics (Dongguan) Co., Ltd\n70:69:79:A0:00:00/28\tFoxconn Brasil Industria e Comercio Ltda\n70:69:79:B0:00:00/28\tLiquid Instruments Pty Ltd\n70:69:79:C0:00:00/28\tRivian Automotive LLC\n70:69:79:D0:00:00/28\tFreund Elektronika D.O.O., Ip-Integra Technologies\n70:69:79:E0:00:00/28\tBas-Ip Lp\n70:6A:C9\t\tzte corporation\n70:6B:B9\t\tCisco Systems, Inc\n70:6D:15\t\tCisco Systems, Inc\n70:6D:EC\t\tWifi-soft LLC\n70:6E:10\t\tHuawei Technologies Co.,Ltd\n70:6E:6D\t\tCisco Systems, Inc\n70:6F:81\t\tPrivate\n70:70:0D\t\tApple, Inc.\n70:70:13\t\tHuawei Technologies Co.,Ltd\n70:70:4C\t\tPurple Communications, Inc\n70:70:8B\t\tCisco Systems, Inc\n70:70:AA\t\tAmazon Technologies Inc.\n70:70:FC\t\tGold&Water Industrial Limited\n70:71:B3\t\tBrain Corporation\n70:71:BC\t\tPegatron Corporation\n70:72:0D\t\tLenovo Mobile Communication Technology Ltd.\n70:72:3C\t\tHuawei Technologies Co.,Ltd\n70:72:CF\t\tEdgeCore Networks\n70:72:FE\t\tApple, Inc.\n70:73:62\t\tHuawei Technologies Co.,Ltd\n70:73:CB\t\tApple, Inc.\n70:74:14\t\tMurata Manufacturing Co., Ltd.\n70:76:30\t\tCommscope\n70:76:DD\t\tOxyGuard Internation A/S\n70:76:F0\t\tLevelOne Communications (India) Private Limited\n70:76:FF\t\tKerlink\n70:77:81\t\tHon Hai Precision Ind. Co.,Ltd.\n70:78:8B\t\tvivo Mobile Communication Co., Ltd.\n70:79:38\t\tWuxi Zhanrui Electronic Technology Co.,LTD\n70:79:90\t\tHuawei Technologies Co.,Ltd\n70:79:B3\t\tCisco Systems, Inc\n70:7B:E8\t\tHuawei Technologies Co.,Ltd\n70:7C:18\t\tADATA Technology Co., Ltd\n70:7C:69\t\tAvaya Inc\n70:7C:E3\t\tHuawei Technologies Co.,Ltd\n70:7D:95\t\tShenzhen City LinwlanTechnology Co. Ltd.\n70:7D:A1\t\tSagemcom Broadband SAS\n70:7D:AF\t\tPlucent AB\n70:7D:B9\t\tCisco Systems, Inc\n70:7E:43\t\tCommscope\n70:7E:DE\t\tNastec Ltd.\n70:7F:F2\t\tTelechips, Inc.\n70:81:05\t\tCisco Systems, Inc\n70:81:85\t\tNew H3C Technologies Co., Ltd\n70:81:EB\t\tApple, Inc.\n70:82:0E\t\tas electronics GmbH\n70:82:8E\t\tOleumTech Corporation\n70:85:40\t\tSkyworth Digital Technology(Shenzhen) Co.,Ltd\n70:85:6C\t\tRuijie Networks Co.,LTD\n70:85:C2\t\tASRock Incorporation\n70:85:C4\t\tRuijie Networks Co.,LTD\n70:85:C6\t\tCommscope\n70:86:C1\t\tTexas Instruments\n70:86:CE\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n70:87:9E\t\tBeken Corporation\n70:87:A7\t\tMurata Manufacturing Co., Ltd.\n70:88:4D\t\tJapan Radio Co., Ltd.\n70:88:6B:00:00:00/28\tVeracity UK Ltd\n70:88:6B:10:00:00/28\tBitfinder Inc\n70:88:6B:20:00:00/28\tCVnet\n70:88:6B:40:00:00/28\tHori Co., Ltd.\n70:88:6B:50:00:00/28\tChengdu Ophylink Communication Technology Ltd.\n70:88:6B:60:00:00/28\tChurch & Dwight Co., Inc.\n70:88:6B:80:00:00/28\tCable Matters Inc.\n70:88:6B:90:00:00/28\tShenzhen Coolhear Information Technology Co., Ltd.\n70:88:6B:A0:00:00/28\tRHXTune Technology Co.,Ltd\n70:88:6B:B0:00:00/28\tBeijing Strongleader Science & Technology Co., Ltd.\n70:88:6B:C0:00:00/28\tMAX4G, Inc.\n70:89:76\t\tTuya Smart Inc.\n70:89:CC\t\tChina Mobile Group Device Co.,Ltd.\n70:89:F5\t\tDongguan Lingjie IOT Co., LTD\n70:8A:09\t\tHuawei Technologies Co.,Ltd\n70:8B:78\t\tcitygrow technology co., ltd\n70:8B:97\t\tINSYS icom GmbH\n70:8B:CD\t\tASUSTek COMPUTER INC.\n70:8C:B6\t\tHuawei Technologies Co.,Ltd\n70:8C:BB\t\tMimodisplaykorea\n70:8C:F2\t\tApple, Inc.\n70:8D:09\t\tNokia Corporation\n70:8F:47\t\tvivo Mobile Communication Co., Ltd.\n70:90:41\t\tMist Systems, Inc.\n70:90:B7\t\tHuawei Device Co., Ltd.\n70:91:8F\t\tWeber-Stephen Products LLC\n70:91:F3\t\tUniversal Electronics, Inc.\n70:93:83\t\tIntelligent Optical Network High Tech CO.,LTD.\n70:93:C1\t\teero inc.\n70:93:F8\t\tSpace Monkey, Inc.\n70:97:41\t\tArcadyan Corporation\n70:97:56\t\tHappyelectronics Co.,Ltd\n70:98:83\t\tShenzhen Kayan Electronics., Ltd.\n70:99:1C\t\tShenzhen Honesty Electronics Co.,Ltd\n70:9A:0B\t\tItalian Institute of Technology\n70:9A:C4\t\tHuawei Device Co., Ltd.\n70:9B:A5\t\tShenzhen Y&D Electronics Co.,LTD.\n70:9B:FC\t\tBryton Inc.\n70:9C:45\t\tHuawei Technologies Co.,Ltd\n70:9C:8F\t\tNero AG\n70:9C:D1\t\tIntel Corporate\n70:9E:29\t\tSony Interactive Entertainment Inc.\n70:9E:86\t\tX6D Limited\n70:9F:2D\t\tzte corporation\n70:9F:A9\t\tTecno Mobile Limited\n70:A1:91\t\tTrendsetter Medical, LLC\n70:A2:B3\t\tApple, Inc.\n70:A4:1C\t\tAdvanced Wireless Dynamics S.L.\n70:A5:6A\t\tShenzhen C-Data Technology Co., Ltd.\n70:A6:6A\t\tProx Dynamics AS\n70:A6:BD\t\tHonor Device Co., Ltd.\n70:A6:CC\t\tIntel Corporate\n70:A7:03\t\tHonor Device Co., Ltd.\n70:A7:41\t\tUbiquiti Inc\n70:A8:4C\t\tMONAD., Inc.\n70:A8:D3\t\tIntel Corporate\n70:A8:E3\t\tHuawei Technologies Co.,Ltd\n70:A9:83\t\tCisco Systems, Inc\n70:AA:B2\t\tBlackBerry RTS\n70:AC:08\t\tSilicon Laboratories\n70:AC:D7\t\tShenzhen YOUHUA Technology Co., Ltd\n70:AD:54\t\tMalvern Instruments Ltd\n70:AE:D5\t\tApple, Inc.\n70:AF:24\t\tTP Vision Belgium NV\n70:AF:25\t\tNishiyama Industry Co.,LTD.\n70:AF:6A\t\tShenzhen Fenglian Technology Co., Ltd.\n70:B0:35\t\tShenzhen Zowee Technology Co., Ltd\n70:B0:8C\t\tShenou Communication Equipment Co.,Ltd\n70:B1:3D\t\tSamsung Electronics Co.,Ltd\n70:B1:4E\t\tCommscope\n70:B2:58\t\tRuckus Wireless\n70:B2:65\t\tHiltron s.r.l.\n70:B3:06\t\tApple, Inc.\n70:B3:17\t\tCisco Systems, Inc\n70:B3:D5\t\tIEEE Registration Authority\n70:B3:D5:00:10:00/36\tSOREDI touch systems GmbH\n70:B3:D5:00:20:00/36\tGogo BA\n70:B3:D5:00:30:00/36\tAnyroam\n70:B3:D5:00:40:00/36\tLeidos\n70:B3:D5:00:50:00/36\tCT Company\n70:B3:D5:00:60:00/36\tPiranha EMS Inc.\n70:B3:D5:00:70:00/36\tSensoneo\n70:B3:D5:00:80:00/36\tESYSE GmbH Embedded Systems Engineering\n70:B3:D5:00:90:00/36\tHolidayCoro\n70:B3:D5:00:A0:00/36\tFUJICOM Co.,Ltd.\n70:B3:D5:00:B0:00/36\tAxing Ag\n70:B3:D5:00:C0:00/36\tEXARA Group\n70:B3:D5:00:D0:00/36\tScrona AG\n70:B3:D5:00:E0:00/36\tMagosys Systems LTD\n70:B3:D5:00:F0:00/36\tNeusoft Reach Automotive Technology (Shenyang) Co.,Ltd\n70:B3:D5:01:00:00/36\tHanwa Electronic Ind.Co.,Ltd.\n70:B3:D5:01:10:00/36\tSumer Data S.L\n70:B3:D5:01:20:00/36\tKST technology\n70:B3:D5:01:30:00/36\tSportsbeams Lighting, Inc.\n70:B3:D5:01:40:00/36\tFRAKO Kondensatoren und Anlagenbau GmbH\n70:B3:D5:01:50:00/36\tEN ElectronicNetwork Hamburg GmbH\n70:B3:D5:01:60:00/36\tGuardian Controls International Ltd\n70:B3:D5:01:70:00/36\tFTG Corporation\n70:B3:D5:01:80:00/36\tDelitech Group\n70:B3:D5:01:90:00/36\tTransit Solutions, LLC.\n70:B3:D5:01:A0:00/36\tCubro Acronet GesmbH\n70:B3:D5:01:B0:00/36\tAudi Ag\n70:B3:D5:01:C0:00/36\tKumu Networks\n70:B3:D5:01:D0:00/36\tWeigl Elektronik & Mediaprojekte\n70:B3:D5:01:E0:00/36\tePOINT Embedded Computing Limited\n70:B3:D5:01:F0:00/36\tSPX Flow Technology BV\n70:B3:D5:02:00:00/36\tMicro Debug, Y.K.\n70:B3:D5:02:10:00/36\tHGL Dynamics Ltd\n70:B3:D5:02:20:00/36\tRavelin Ltd\n70:B3:D5:02:30:00/36\tCambridge Pixel\n70:B3:D5:02:40:00/36\tG+D Mobile Security\n70:B3:D5:02:50:00/36\tElsuhd Net Ltd Co.\n70:B3:D5:02:60:00/36\tTelstra\n70:B3:D5:02:70:00/36\tRedcap Solutions s.r.o.\n70:B3:D5:02:80:00/36\tAT-Automation Technology GmbH\n70:B3:D5:02:90:00/36\tMarimo electronics Co.,Ltd.\n70:B3:D5:02:A0:00/36\tBAE Systems Surface Ships Limited\n70:B3:D5:02:B0:00/36\tScorpion Precision Industry (HK)CO. Ltd.\n70:B3:D5:02:C0:00/36\tIylus Inc.\n70:B3:D5:02:D0:00/36\tNEXTtec srl\n70:B3:D5:02:E0:00/36\tMonnit Corporation\n70:B3:D5:02:F0:00/36\tLegendaire Technology Co., Ltd.\n70:B3:D5:03:00:00/36\tTresent Technologies\n70:B3:D5:03:10:00/36\tShenzhen Gaona Electronic Co.Ltd\n70:B3:D5:03:20:00/36\tiFreecomm Technology Co., Ltd\n70:B3:D5:03:30:00/36\tSailmon BV\n70:B3:D5:03:40:00/36\tDigital Systems Engineering\n70:B3:D5:03:50:00/36\tHKW-Elektronik GmbH\n70:B3:D5:03:60:00/36\tVema Venturi AB\n70:B3:D5:03:70:00/36\tEiffage Energie Electronique\n70:B3:D5:03:80:00/36\tDONG IL VISION Co., Ltd.\n70:B3:D5:03:90:00/36\tDoWoo Digitech\n70:B3:D5:03:A0:00/36\tOchno AB\n70:B3:D5:03:B0:00/36\tSSL - Electrical Aerospace Ground Equipment Section\n70:B3:D5:03:C0:00/36\tUltimate Software\n70:B3:D5:03:D0:00/36\tQuercus Technologies, S.L.\n70:B3:D5:03:E0:00/36\tGuan Show Technologe Co., Ltd.\n70:B3:D5:03:F0:00/36\tElesar Limited\n70:B3:D5:04:00:00/36\tSavari Inc\n70:B3:D5:04:10:00/36\tFibernet Ltd\n70:B3:D5:04:20:00/36\tCoveloz Technologies Inc.\n70:B3:D5:04:30:00/36\tcal4care Pte Ltd\n70:B3:D5:04:40:00/36\tDon Electronics Ltd\n70:B3:D5:04:50:00/36\tNavaero Avionics AB\n70:B3:D5:04:60:00/36\tShenzhen Rihuida Electronics Co,. Ltd\n70:B3:D5:04:70:00/36\tOoo \"Orion-R\"\n70:B3:D5:04:80:00/36\tAvMap srlu\n70:B3:D5:04:90:00/36\tAPP Engineering, Inc.\n70:B3:D5:04:A0:00/36\tGecko Robotics Inc\n70:B3:D5:04:B0:00/36\tDream I System Co., Ltd\n70:B3:D5:04:C0:00/36\tmapna group\n70:B3:D5:04:D0:00/36\tSicon srl\n70:B3:D5:04:E0:00/36\tHUGEL GmbH\n70:B3:D5:04:F0:00/36\tEVPU Defence a.s.\n70:B3:D5:05:00:00/36\tCompusign Systems Pty Ltd\n70:B3:D5:05:10:00/36\tJt\n70:B3:D5:05:20:00/36\tSudo Premium Engineering\n70:B3:D5:05:30:00/36\tYamakatsu Electronics Industry Co., Ltd.\n70:B3:D5:05:40:00/36\tGroupeer Technologies\n70:B3:D5:05:50:00/36\tBae Systems\n70:B3:D5:05:60:00/36\tMirae Information Technology Co., Ltd.\n70:B3:D5:05:70:00/36\tRch Italia Spa\n70:B3:D5:05:80:00/36\tTelink Semiconductor CO, Limtied, Taiwan\n70:B3:D5:05:90:00/36\tPro-Digital Projetos Eletronicos Ltda\n70:B3:D5:05:A0:00/36\tUni Control System Sp. z o. o.\n70:B3:D5:05:B0:00/36\tPAL Inc.\n70:B3:D5:05:C0:00/36\tAmber Kinetics Inc\n70:B3:D5:05:D0:00/36\tKOMS Co.,Ltd.\n70:B3:D5:05:E0:00/36\tVitec\n70:B3:D5:05:F0:00/36\tUnisor Multisystems Ltd\n70:B3:D5:06:00:00/36\tRch Spa\n70:B3:D5:06:10:00/36\tIntelliDesign Pty Ltd\n70:B3:D5:06:20:00/36\tRM Michaelides Software & Elektronik GmbH\n70:B3:D5:06:30:00/36\tPoolDigital GmbH & Co. KG\n70:B3:D5:06:40:00/36\tAb Precision (Poole) Ltd\n70:B3:D5:06:50:00/36\tExatel\n70:B3:D5:06:60:00/36\tNorth Pole Engineering, Inc.\n70:B3:D5:06:70:00/36\tNeopath Integrated Systems Ltda\n70:B3:D5:06:80:00/36\tOnethinx BV\n70:B3:D5:06:90:00/36\tONDEMAND LABORATORY Co., Ltd.\n70:B3:D5:06:A0:00/36\tGuangdong Centnet Technology Co.,Ltd\n70:B3:D5:06:B0:00/36\tU-Tech\n70:B3:D5:06:C0:00/36\tAppTek\n70:B3:D5:06:D0:00/36\tPanoramic Power\n70:B3:D5:06:E0:00/36\tGlobal-King International Co., Ltd.\n70:B3:D5:06:F0:00/36\tBeijing Daswell Science and Technology Co.LTD\n70:B3:D5:07:00:00/36\tLumiplan Duhamel\n70:B3:D5:07:10:00/36\tFsr, Inc.\n70:B3:D5:07:20:00/36\tLightdrop\n70:B3:D5:07:30:00/36\tLiteon Technology Corporation\n70:B3:D5:07:40:00/36\tOrlaco Products B.V.\n70:B3:D5:07:50:00/36\tMo-Sys Engineering Ltd\n70:B3:D5:07:60:00/36\tPrivate Enterprise \"Scientific and Production Private Enterprise\"Sparing-Vist Center\"\"\n70:B3:D5:07:70:00/36\tInAccess Networks SA\n70:B3:D5:07:80:00/36\tOrbiWise SA\n70:B3:D5:07:90:00/36\tCheckBill Co,Ltd.\n70:B3:D5:07:A0:00/36\tZao Zeo\n70:B3:D5:07:B0:00/36\twallbe GmbH\n70:B3:D5:07:C0:00/36\tIsac Srl\n70:B3:D5:07:D0:00/36\tPanoramic Power\n70:B3:D5:07:E0:00/36\tENTEC Electric & Electronic CO., LTD\n70:B3:D5:07:F0:00/36\tAbalance Corporation\n70:B3:D5:08:00:00/36\tAbb\n70:B3:D5:08:10:00/36\tIST Technologies (SHENZHEN) Limited\n70:B3:D5:08:20:00/36\tSakura Seiki Co.,Ltd.\n70:B3:D5:08:30:00/36\tZao Zeo\n70:B3:D5:08:40:00/36\tRako Controls Ltd\n70:B3:D5:08:50:00/36\tHuman Systems Integration\n70:B3:D5:08:60:00/36\tHusty M.Styczen J.Hupert Sp.J.\n70:B3:D5:08:70:00/36\tTempus Fugit Consoles bvba\n70:B3:D5:08:80:00/36\tOptiScan Biomedical Corp.\n70:B3:D5:08:90:00/36\tKazdream Technologies LLP\n70:B3:D5:08:A0:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:08:B0:00/36\tPeter Huber Kaeltemaschinenbau SE\n70:B3:D5:08:C0:00/36\tAirmar Technology Corp\n70:B3:D5:08:D0:00/36\tClover Electronics Technology Co., Ltd.\n70:B3:D5:08:E0:00/36\tBeijing CONvision Technology Co.,Ltd\n70:B3:D5:08:F0:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:09:00:00/36\tPowercraft Electronics Pvt. Ltd.\n70:B3:D5:09:10:00/36\tPROFITT Ltd\n70:B3:D5:09:20:00/36\tinomed Medizintechnik GmbH\n70:B3:D5:09:30:00/36\tLegrand Electric Ltd\n70:B3:D5:09:40:00/36\tCircuitlink Pty Ltd\n70:B3:D5:09:50:00/36\tplc-tec AG\n70:B3:D5:09:60:00/36\tHavelsan A.Ş.\n70:B3:D5:09:70:00/36\tAvant Technologies\n70:B3:D5:09:80:00/36\tAlcodex Technologies Private Limited\n70:B3:D5:09:90:00/36\tSchwer+Kopka GmbH\n70:B3:D5:09:A0:00/36\tAKSE srl\n70:B3:D5:09:B0:00/36\tJacarta Ltd\n70:B3:D5:09:C0:00/36\tCardinal Kinetic\n70:B3:D5:09:D0:00/36\tPuS GmbH und Co. KG\n70:B3:D5:09:E0:00/36\tMobiPromo\n70:B3:D5:09:F0:00/36\tCOMTECH Kft.\n70:B3:D5:0A:00:00/36\tCominfo, Inc.\n70:B3:D5:0A:10:00/36\tPTN Electronics Limited\n70:B3:D5:0A:20:00/36\tTechSigno srl\n70:B3:D5:0A:30:00/36\tSolace Systems Inc.\n70:B3:D5:0A:40:00/36\tCommunication Technology Ltd.\n70:B3:D5:0A:50:00/36\tFuelcellpower\n70:B3:D5:0A:60:00/36\tPa Consulting Services\n70:B3:D5:0A:70:00/36\tTraffic and Parking Control Co, Inc.\n70:B3:D5:0A:80:00/36\tSymetrics Industries d.b.a. Extant Aerospace\n70:B3:D5:0A:90:00/36\tProConnections, Inc.\n70:B3:D5:0A:A0:00/36\tWanco Inc\n70:B3:D5:0A:B0:00/36\tKST technology\n70:B3:D5:0A:C0:00/36\tRoboCore Tecnologia\n70:B3:D5:0A:D0:00/36\tVega-Absolute\n70:B3:D5:0A:E0:00/36\tNorsat International Inc.\n70:B3:D5:0A:F0:00/36\tKMtronic ltd\n70:B3:D5:0B:00:00/36\tRaven Systems Design, Inc\n70:B3:D5:0B:10:00/36\tAirBie AG\n70:B3:D5:0B:20:00/36\tndb technologies\n70:B3:D5:0B:30:00/36\tReonix Automation\n70:B3:D5:0B:40:00/36\tAver\n70:B3:D5:0B:50:00/36\tCapgemini Netherlands\n70:B3:D5:0B:60:00/36\tLandis Gyr\n70:B3:D5:0B:70:00/36\tHAI ROBOTICS Co., Ltd.\n70:B3:D5:0B:80:00/36\tLucas-Nülle GmbH\n70:B3:D5:0B:90:00/36\tEasy Digital Concept\n70:B3:D5:0B:A0:00/36\tAyre Acoustics, Inc.\n70:B3:D5:0B:B0:00/36\tAnaPico AG\n70:B3:D5:0B:C0:00/36\tPractical Software Studio LLC\n70:B3:D5:0B:D0:00/36\tAndium\n70:B3:D5:0B:E0:00/36\tChamsys Ltd\n70:B3:D5:0B:F0:00/36\tDen Automation\n70:B3:D5:0C:00:00/36\tMolu Technology Inc., LTD.\n70:B3:D5:0C:10:00/36\tNexus Technologies Pty Ltd\n70:B3:D5:0C:20:00/36\tLook Easy International Limited\n70:B3:D5:0C:30:00/36\tAug. Winkhaus GmbH & Co. KG\n70:B3:D5:0C:40:00/36\tTiama\n70:B3:D5:0C:50:00/36\tPrecitec Optronik GmbH\n70:B3:D5:0C:60:00/36\tEmbedded Arts Co., Ltd.\n70:B3:D5:0C:70:00/36\tPeek Traffic\n70:B3:D5:0C:80:00/36\tFin Robotics Inc\n70:B3:D5:0C:90:00/36\tLineage Power Pvt Ltd.,\n70:B3:D5:0C:A0:00/36\tVitec\n70:B3:D5:0C:B0:00/36\tNireco Corporation\n70:B3:D5:0C:C0:00/36\tADMiTAS CCTV Taiwan Co. Ltd\n70:B3:D5:0C:D0:00/36\tAML Oceanographic\n70:B3:D5:0C:E0:00/36\tInnominds Software Inc\n70:B3:D5:0C:F0:00/36\tsohonet ltd\n70:B3:D5:0D:00:00/36\tProHound Controles Eirelli\n70:B3:D5:0D:10:00/36\tCommon Sense Monitoring Solutions Ltd.\n70:B3:D5:0D:20:00/36\tUnmanned Spa\n70:B3:D5:0D:30:00/36\tTsat As\n70:B3:D5:0D:40:00/36\tGuangzhou Male Industrial Animation Technology Co.,Ltd.\n70:B3:D5:0D:50:00/36\tKahler Automation\n70:B3:D5:0D:60:00/36\tTattile Srl\n70:B3:D5:0D:70:00/36\tRussian Telecom Equipment Company\n70:B3:D5:0D:80:00/36\tLaser Imagineering GmbH\n70:B3:D5:0D:90:00/36\tBrechbuehler AG\n70:B3:D5:0D:A0:00/36\tAquavision Distribution Ltd\n70:B3:D5:0D:B0:00/36\tCryptotronix LLC\n70:B3:D5:0D:C0:00/36\tTalleres de Escoriaza\n70:B3:D5:0D:D0:00/36\tShenzhen Virtual Clusters Information Technology Co.,Ltd.\n70:B3:D5:0D:E0:00/36\tGrossenbacher Systeme AG\n70:B3:D5:0D:F0:00/36\tB.E.A. sa\n70:B3:D5:0E:00:00/36\tPLCiS\n70:B3:D5:0E:10:00/36\tMiWave Consulting, LLC\n70:B3:D5:0E:20:00/36\tJESE Ltd\n70:B3:D5:0E:30:00/36\tSinTau SrL\n70:B3:D5:0E:40:00/36\tWalter Müller AG\n70:B3:D5:0E:50:00/36\tDelta Solutions LLC\n70:B3:D5:0E:60:00/36\tNasdaq\n70:B3:D5:0E:70:00/36\tPure Air Filtration\n70:B3:D5:0E:80:00/36\tGrossenbacher Systeme AG\n70:B3:D5:0E:90:00/36\tVNT electronics s.r.o.\n70:B3:D5:0E:A0:00/36\tAEV Broadcast Srl\n70:B3:D5:0E:B0:00/36\tTomahawk Robotics\n70:B3:D5:0E:C0:00/36\tAcs Motion Control\n70:B3:D5:0E:D0:00/36\tLupa Tecnologia e Sistemas Ltda\n70:B3:D5:0E:E0:00/36\tPicture Elements, Inc.\n70:B3:D5:0E:F0:00/36\tDextera Labs\n70:B3:D5:0F:00:00/36\tAvionica\n70:B3:D5:0F:10:00/36\tBeijing One City Science & Technology Co., LTD\n70:B3:D5:0F:20:00/36\tTrexEdge, Inc.\n70:B3:D5:0F:30:00/36\tMonsoonRF, Inc.\n70:B3:D5:0F:40:00/36\tVisual Robotics\n70:B3:D5:0F:50:00/36\tSeason Electronics Ltd\n70:B3:D5:0F:60:00/36\tKSE GmbH\n70:B3:D5:0F:70:00/36\tBespoon\n70:B3:D5:0F:80:00/36\tSpecial Services Group, LLC\n70:B3:D5:0F:90:00/36\tOOO Research and Production Center \"Computer Technologies\"\n70:B3:D5:0F:A0:00/36\tInsideRF Co., Ltd.\n70:B3:D5:0F:B0:00/36\tCygnus LLC\n70:B3:D5:0F:C0:00/36\tvitalcare\n70:B3:D5:0F:D0:00/36\tJSC \"Ural Factories\"\n70:B3:D5:0F:E0:00/36\tVocality International Ltd\n70:B3:D5:0F:F0:00/36\tInternet Protocolo Logica Sl\n70:B3:D5:10:00:00/36\tGupsy GmbH\n70:B3:D5:10:10:00/36\tAdolf Nissen Elektrobau GmbH + Co. KG\n70:B3:D5:10:20:00/36\tOxford Monitoring Solutions Ltd\n70:B3:D5:10:30:00/36\tHanyoung Nux Co.,Ltd\n70:B3:D5:10:40:00/36\tPlum sp. z o.o\n70:B3:D5:10:50:00/36\tBeijing Nacao Technology Co., Ltd.\n70:B3:D5:10:60:00/36\tAplex Technology Inc.\n70:B3:D5:10:70:00/36\tOOO \"Alyans\"\n70:B3:D5:10:80:00/36\tTex Computer Srl\n70:B3:D5:10:90:00/36\tDiTEST Fahrzeugdiagnose GmbH\n70:B3:D5:10:A0:00/36\tSeason Design Technology\n70:B3:D5:10:B0:00/36\tSECUREAN CO.,Ltd\n70:B3:D5:10:C0:00/36\tVocality International Ltd\n70:B3:D5:10:D0:00/36\tCoreEL Technologies Pvt Ltd\n70:B3:D5:10:E0:00/36\tColorimetry Research, Inc\n70:B3:D5:10:F0:00/36\tneQis\n70:B3:D5:11:00:00/36\tOrion Power Systems, Inc.\n70:B3:D5:11:10:00/36\tLeonardo Sistemi Integrati S.r.l.\n70:B3:D5:11:20:00/36\tDiTEST Fahrzeugdiagnose GmbH\n70:B3:D5:11:30:00/36\tiREA System Industry\n70:B3:D5:11:40:00/36\tProject H Pty Ltd\n70:B3:D5:11:50:00/36\tWelltec Corp.\n70:B3:D5:11:60:00/36\tMomentum Data Systems\n70:B3:D5:11:70:00/36\tSysCom Automationstechnik GmbH\n70:B3:D5:11:80:00/36\tMacromatic Industrial Controls, Inc.\n70:B3:D5:11:90:00/36\tYPP Corporation\n70:B3:D5:11:A0:00/36\tMahindra Electric Mobility Limited\n70:B3:D5:11:B0:00/36\tHoseoTelnet Inc...\n70:B3:D5:11:C0:00/36\tSamriddi Automations Pvt. Ltd.\n70:B3:D5:11:D0:00/36\tDakton Microlabs LLC\n70:B3:D5:11:E0:00/36\tKbpr Llc\n70:B3:D5:11:F0:00/36\tGeppetto Electronics\n70:B3:D5:12:00:00/36\tTelevic Rail GmbH\n70:B3:D5:12:10:00/36\tShenzhen Luxurite Smart Home Ltd\n70:B3:D5:12:20:00/36\tHenri Systems Holland bv\n70:B3:D5:12:30:00/36\tAmfitech ApS\n70:B3:D5:12:40:00/36\tForschungs- und Transferzentrum Leipzig e.V.\n70:B3:D5:12:50:00/36\tSecurolytics, Inc.\n70:B3:D5:12:60:00/36\tAddSecure Smart Grids\n70:B3:D5:12:70:00/36\tVitec\n70:B3:D5:12:80:00/36\tAKSE srl\n70:B3:D5:12:90:00/36\tOOO \"Microlink-Svyaz\"\n70:B3:D5:12:A0:00/36\tElvys s.r.o\n70:B3:D5:12:B0:00/36\tRIC Electronics\n70:B3:D5:12:C0:00/36\tCielle S.R.L.\n70:B3:D5:12:D0:00/36\tS.E.I. Co.,Ltd.\n70:B3:D5:12:E0:00/36\tGreenFlux\n70:B3:D5:12:F0:00/36\tDSP4YOU LTd\n70:B3:D5:13:00:00/36\tMG s.r.l.\n70:B3:D5:13:10:00/36\tInova Design Solutions Ltd\n70:B3:D5:13:20:00/36\tHagenuk KMT Kabelmesstechnik GmbH\n70:B3:D5:13:30:00/36\tVidisys GmbH\n70:B3:D5:13:40:00/36\tConjing Networks Inc.\n70:B3:D5:13:50:00/36\tDorlet Sau\n70:B3:D5:13:60:00/36\tMiguel Corporate Services Pte Ltd\n70:B3:D5:13:70:00/36\tSubject Link Inc\n70:B3:D5:13:80:00/36\tSMITEC S.p.A.\n70:B3:D5:13:90:00/36\tTunstall A/S\n70:B3:D5:13:A0:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:13:B0:00/36\tSienna Corporation\n70:B3:D5:13:C0:00/36\tDetec Systems Ltd\n70:B3:D5:13:D0:00/36\tElsist Srl\n70:B3:D5:13:E0:00/36\tStara S/A Indústria de Implementos Agrícolas\n70:B3:D5:13:F0:00/36\tFarmobile, LLC\n70:B3:D5:14:00:00/36\tVirta Laboratories, Inc.\n70:B3:D5:14:10:00/36\tM.T. S.R.L.\n70:B3:D5:14:20:00/36\tDave Srl\n70:B3:D5:14:30:00/36\tA & T Technologies\n70:B3:D5:14:40:00/36\tGS Elektromedizinsiche Geräte G. Stemple GmbH\n70:B3:D5:14:50:00/36\tSicon srl\n70:B3:D5:14:60:00/36\t3City Electronics\n70:B3:D5:14:70:00/36\tROMO Wind A/S\n70:B3:D5:14:80:00/36\tPower Electronics Espana, S.L.\n70:B3:D5:14:90:00/36\televen-x\n70:B3:D5:14:A0:00/36\tExSens Technology (Pty) Ltd.\n70:B3:D5:14:B0:00/36\tC21 Systems Ltd\n70:B3:D5:14:C0:00/36\tCrde\n70:B3:D5:14:D0:00/36\t2-Observe\n70:B3:D5:14:E0:00/36\tInnosonix GmbH\n70:B3:D5:14:F0:00/36\tMobile Devices Unlimited\n70:B3:D5:15:00:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:15:10:00/36\tVirsae Group Ltd\n70:B3:D5:15:20:00/36\tXped Corporation Pty Ltd\n70:B3:D5:15:30:00/36\tSchneider Electric Motion USA\n70:B3:D5:15:40:00/36\tWalk Horizon Technology (Beijing) Co., Ltd.\n70:B3:D5:15:50:00/36\tSanwa New Tec Co.,Ltd\n70:B3:D5:15:60:00/36\tRivercity Innovations Ltd.\n70:B3:D5:15:70:00/36\tShanghai Jupper Technology Co.Ltd\n70:B3:D5:15:80:00/36\tEAX Labs s.r.o.\n70:B3:D5:15:90:00/36\tRch Spa\n70:B3:D5:15:A0:00/36\tEnabler Ltd.\n70:B3:D5:15:B0:00/36\tArmstrong International, Inc.\n70:B3:D5:15:C0:00/36\tWoods Hole Oceanographic Institution\n70:B3:D5:15:D0:00/36\tVtron Pty Ltd\n70:B3:D5:15:E0:00/36\tSeason Electronics Ltd\n70:B3:D5:15:F0:00/36\tSavroni̇k Elektroni̇k\n70:B3:D5:16:00:00/36\tEuropean Synchrotron Radiation Facility\n70:B3:D5:16:10:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:16:20:00/36\tEspai De Producció I Electróni\n70:B3:D5:16:30:00/36\tBharat Heavy Electricals Limited\n70:B3:D5:16:40:00/36\tTokyo Drawing Ltd.\n70:B3:D5:16:50:00/36\tWuhan Xingtuxinke ELectronic Co.,Ltd\n70:B3:D5:16:60:00/36\tSerial Image Inc.\n70:B3:D5:16:70:00/36\tEiden Co.,Ltd.\n70:B3:D5:16:80:00/36\tBiwave Technologies, Inc.\n70:B3:D5:16:90:00/36\tService Plus LLC\n70:B3:D5:16:A0:00/36\t4Jtech s.r.o.\n70:B3:D5:16:B0:00/36\tIOT Engineering\n70:B3:D5:16:C0:00/36\tOcean\n70:B3:D5:16:D0:00/36\tBluB0X Security, Inc.\n70:B3:D5:16:E0:00/36\tJemac Sweden AB\n70:B3:D5:16:F0:00/36\tNimbeLink Corp\n70:B3:D5:17:00:00/36\tMutelcor GmbH\n70:B3:D5:17:10:00/36\tAetina Corporation\n70:B3:D5:17:20:00/36\tLumiGrow, Inc\n70:B3:D5:17:30:00/36\tNational TeleConsultants LLC\n70:B3:D5:17:40:00/36\tCarlson Wireless Technologies Inc.\n70:B3:D5:17:50:00/36\tAkribis Systems\n70:B3:D5:17:60:00/36\tLarraioz Elektronika\n70:B3:D5:17:70:00/36\tWired Broadcast Ltd\n70:B3:D5:17:80:00/36\tGamber Johnson-LLC\n70:B3:D5:17:90:00/36\tAltran Uk\n70:B3:D5:17:A0:00/36\tGencoa Ltd\n70:B3:D5:17:B0:00/36\tVistec Electron Beam GmbH\n70:B3:D5:17:C0:00/36\tFarmpro Ltd\n70:B3:D5:17:D0:00/36\tEntech Electronics\n70:B3:D5:17:E0:00/36\tOculi Vision\n70:B3:D5:17:F0:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:18:00:00/36\tLHA Systems (Pty) Ltd\n70:B3:D5:18:10:00/36\tTask Sistemas\n70:B3:D5:18:20:00/36\tKitron UAB\n70:B3:D5:18:30:00/36\tEvco S.p.a.\n70:B3:D5:18:40:00/36\tXV360 Optical Information Systems Ltd.\n70:B3:D5:18:50:00/36\tR&D Gran-System-S LLC\n70:B3:D5:18:60:00/36\tRohde&Schwarz Topex SA\n70:B3:D5:18:70:00/36\tElektronik & Präzisionsbau Saalfeld GmbH\n70:B3:D5:18:80:00/36\tBirket Engineering\n70:B3:D5:18:90:00/36\tDave Srl\n70:B3:D5:18:A0:00/36\tNSP Europe Ltd\n70:B3:D5:18:B0:00/36\tAplex Technology Inc.\n70:B3:D5:18:C0:00/36\tCMC Industrial Electronics Ltd\n70:B3:D5:18:D0:00/36\tForo Tel\n70:B3:D5:18:E0:00/36\tNippon Seiki Co., Ltd.\n70:B3:D5:18:F0:00/36\tNewtec A/S\n70:B3:D5:19:00:00/36\tFantom Wireless, Inc.\n70:B3:D5:19:10:00/36\tAlgodue Elettronica Srl\n70:B3:D5:19:20:00/36\tAspt, Inc.\n70:B3:D5:19:30:00/36\tEra Toys Limited\n70:B3:D5:19:40:00/36\tHusty M.Styczen J.Hupert Sp.J.\n70:B3:D5:19:50:00/36\tCi4Rail\n70:B3:D5:19:60:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:19:70:00/36\tLattech Systems Pty Ltd\n70:B3:D5:19:80:00/36\tBeijing Muniulinghang Technology Co., Ltd\n70:B3:D5:19:90:00/36\tSmart Controls LLC\n70:B3:D5:19:A0:00/36\tWiSuite USA\n70:B3:D5:19:B0:00/36\tGlobal Technical Systems\n70:B3:D5:19:C0:00/36\tKubu, Inc.\n70:B3:D5:19:D0:00/36\tAutomata GmbH & Co. KG\n70:B3:D5:19:E0:00/36\tJ-Factor Embedded Technologies\n70:B3:D5:19:F0:00/36\tKoizumi Lighting Technology Corp.\n70:B3:D5:1A:00:00/36\tUfatech Ltd\n70:B3:D5:1A:10:00/36\tHMicro Inc\n70:B3:D5:1A:20:00/36\tXirgo Technologies LLC\n70:B3:D5:1A:30:00/36\tTelairity Semiconductor\n70:B3:D5:1A:40:00/36\tDavey Bickford\n70:B3:D5:1A:50:00/36\tMetronic Aparatura Kontrolno - Pomiarowa\n70:B3:D5:1A:60:00/36\tRobotelf Technologies (Chengdu) Co., Ltd.\n70:B3:D5:1A:70:00/36\tElk Solutions, LLC\n70:B3:D5:1A:80:00/36\tSTC \"Rainbow\" Ltd.\n70:B3:D5:1A:90:00/36\tOceanix Inc.\n70:B3:D5:1A:A0:00/36\tEcho Ridge, LLC\n70:B3:D5:1A:B0:00/36\tAccess Control Systems JSC\n70:B3:D5:1A:C0:00/36\tSVP Broadcast Microwave S.L.\n70:B3:D5:1A:D0:00/36\tTechworld Industries Ltd\n70:B3:D5:1A:E0:00/36\tEcoG\n70:B3:D5:1A:F0:00/36\tTeenage Engineering AB\n70:B3:D5:1B:00:00/36\tNAL Research Corporation\n70:B3:D5:1B:10:00/36\tShanghai Danyan Information Technology Co., Ltd.\n70:B3:D5:1B:20:00/36\tCavagna Group Spa\n70:B3:D5:1B:30:00/36\tGraphcore Ltd\n70:B3:D5:1B:40:00/36\t5nines\n70:B3:D5:1B:50:00/36\tStarBridge, Inc.\n70:B3:D5:1B:60:00/36\tDACOM West GmbH\n70:B3:D5:1B:70:00/36\tULSee Inc\n70:B3:D5:1B:80:00/36\tOES Inc.\n70:B3:D5:1B:90:00/36\tRELISTE Ges.m.b.H.\n70:B3:D5:1B:A0:00/36\tGuan Show Technologe Co., Ltd.\n70:B3:D5:1B:B0:00/36\tEfento T P Szydłowski K Zaręba Spółka Jawna\n70:B3:D5:1B:C0:00/36\tFlextronics International Kft\n70:B3:D5:1B:D0:00/36\tShenzhen Siera Technology Ltd\n70:B3:D5:1B:E0:00/36\tPotter Electric Signal Co. LLC\n70:B3:D5:1B:F0:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:1C:00:00/36\tW. H. Leary Co., Inc.\n70:B3:D5:1C:10:00/36\tSphere of economical technologies Ltd\n70:B3:D5:1C:20:00/36\tCENSIS, Uiversity of Glasgow\n70:B3:D5:1C:30:00/36\tShanghai Tiancheng Communication Technology Corporation\n70:B3:D5:1C:40:00/36\tSmeg S.p.A.\n70:B3:D5:1C:50:00/36\tElsag\n70:B3:D5:1C:60:00/36\tBita-International Co., Ltd.\n70:B3:D5:1C:70:00/36\tHoshin Electronics Co., Ltd.\n70:B3:D5:1C:80:00/36\tLDA audio video profesional S.L.\n70:B3:D5:1C:90:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:1C:A0:00/36\tinomatic GmbH\n70:B3:D5:1C:B0:00/36\tMatchX GmbH\n70:B3:D5:1C:C0:00/36\tAooGee Controls Co., LTD.\n70:B3:D5:1C:D0:00/36\tELEUSI GmbH\n70:B3:D5:1C:E0:00/36\tClear Flow by Antiference\n70:B3:D5:1C:F0:00/36\tDalcnet srl\n70:B3:D5:1D:00:00/36\tShenzhen INVT Electric Co.,Ltd\n70:B3:D5:1D:10:00/36\tEurotek Srl\n70:B3:D5:1D:20:00/36\tXacti Corporation\n70:B3:D5:1D:30:00/36\tAirobot Oü\n70:B3:D5:1D:40:00/36\tBrinkmann Audio GmbH\n70:B3:D5:1D:50:00/36\tMIVO Technology AB\n70:B3:D5:1D:60:00/36\tMacGray Services\n70:B3:D5:1D:70:00/36\tBAE Systems Apllied Intelligence\n70:B3:D5:1D:80:00/36\tBlue Skies Global LLC\n70:B3:D5:1D:90:00/36\tMondeF\n70:B3:D5:1D:A0:00/36\tPromess Inc.\n70:B3:D5:1D:B0:00/36\tHudson Robotics\n70:B3:D5:1D:C0:00/36\tTEKVEL Ltd.\n70:B3:D5:1D:D0:00/36\tRf Creations Ltd\n70:B3:D5:1D:E0:00/36\tDycec, S.A.\n70:B3:D5:1D:F0:00/36\tENTEC Electric & Electronic Co., LTD.\n70:B3:D5:1E:00:00/36\tTOPROOTTechnology Corp. Ltd.\n70:B3:D5:1E:10:00/36\tTex Computer Srl\n70:B3:D5:1E:20:00/36\tShenzhen CAMERAY ELECTRONIC CO., LTD\n70:B3:D5:1E:30:00/36\tHatel Elektronik LTD. STI.\n70:B3:D5:1E:40:00/36\tTecnologix s.r.l.\n70:B3:D5:1E:50:00/36\tVendNovation LLC\n70:B3:D5:1E:60:00/36\tSanmina Israel\n70:B3:D5:1E:70:00/36\tDogWatch Inc\n70:B3:D5:1E:80:00/36\tGogo BA\n70:B3:D5:1E:90:00/36\tcomtime GmbH\n70:B3:D5:1E:A0:00/36\tSense For Innovation\n70:B3:D5:1E:B0:00/36\tXavant\n70:B3:D5:1E:C0:00/36\tCherry Labs, Inc.\n70:B3:D5:1E:D0:00/36\tSUS Corporation\n70:B3:D5:1E:E0:00/36\tMeggitt\n70:B3:D5:1E:F0:00/36\tAdtek\n70:B3:D5:1F:00:00/36\tHarmonic Design GmbH\n70:B3:D5:1F:10:00/36\tDIEHL Connectivity Solutions\n70:B3:D5:1F:20:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:1F:30:00/36\tSmart Energy Code Company Limited\n70:B3:D5:1F:40:00/36\tHangzhou Woosiyuan Communication Co.,Ltd.\n70:B3:D5:1F:50:00/36\tMartec S.p.A.\n70:B3:D5:1F:60:00/36\tLinkAV Technology Co., Ltd\n70:B3:D5:1F:70:00/36\tMorgan Schaffer\n70:B3:D5:1F:80:00/36\tConvergent Design\n70:B3:D5:1F:90:00/36\tAutomata GmbH & Co. KG\n70:B3:D5:1F:A0:00/36\tEBZ SysTec GmbH\n70:B3:D5:1F:B0:00/36\tCrane-elec. Co., LTD.\n70:B3:D5:1F:C0:00/36\tGuan Show Technologe Co., Ltd.\n70:B3:D5:1F:D0:00/36\tBRS Sistemas Eletrônicos\n70:B3:D5:1F:E0:00/36\tMobiPromo\n70:B3:D5:1F:F0:00/36\tAudiodo AB\n70:B3:D5:20:00:00/36\tNextEV Co., Ltd.\n70:B3:D5:20:10:00/36\tLeontech Limited\n70:B3:D5:20:20:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:20:30:00/36\tWOOJIN Inc\n70:B3:D5:20:40:00/36\tTwc\n70:B3:D5:20:50:00/36\tEsource Srl\n70:B3:D5:20:60:00/36\tard sa\n70:B3:D5:20:70:00/36\tSavari Inc\n70:B3:D5:20:80:00/36\tDsp Design Ltd\n70:B3:D5:20:90:00/36\tSmartNodes\n70:B3:D5:20:A0:00/36\tGolden Grid Systems\n70:B3:D5:20:B0:00/36\tKST technology\n70:B3:D5:20:C0:00/36\tSiemens Healthcare Diagnostics\n70:B3:D5:20:D0:00/36\tEngage Technologies\n70:B3:D5:20:E0:00/36\tAmrehn & Partner EDV-Service GmbH\n70:B3:D5:20:F0:00/36\tTieline Research Pty Ltd\n70:B3:D5:21:00:00/36\tEastone Century Technology Co.,Ltd.\n70:B3:D5:21:10:00/36\tFracarro srl\n70:B3:D5:21:20:00/36\tSemiconsoft, inc\n70:B3:D5:21:30:00/36\tETON Deutschland Electro Acoustic GmbH\n70:B3:D5:21:40:00/36\tsignalparser\n70:B3:D5:21:50:00/36\tDataspeed Inc\n70:B3:D5:21:60:00/36\tFlextronics\n70:B3:D5:21:70:00/36\tTecnint HTE SRL\n70:B3:D5:21:80:00/36\tGremesh.com\n70:B3:D5:21:90:00/36\tD-E-K GmbH & Co.KG\n70:B3:D5:21:A0:00/36\tAcutronic Link Robotics AG\n70:B3:D5:21:B0:00/36\tLab241 Co.,Ltd.\n70:B3:D5:21:C0:00/36\tEnyx SA\n70:B3:D5:21:D0:00/36\tiRF - Intelligent RF Solutions, LLC\n70:B3:D5:21:E0:00/36\tHildebrand Technology Limited\n70:B3:D5:21:F0:00/36\tChronomedia\n70:B3:D5:22:00:00/36\tPrivate\n70:B3:D5:22:10:00/36\tLX Design House\n70:B3:D5:22:20:00/36\tMarioff Corporation Oy\n70:B3:D5:22:30:00/36\tResearch Laboratory of Design Automation, Ltd.\n70:B3:D5:22:40:00/36\tUrbana Smart Solutions Pte Ltd\n70:B3:D5:22:50:00/36\tRCD Radiokomunikace\n70:B3:D5:22:60:00/36\tYaviar LLC\n70:B3:D5:22:70:00/36\tMontalvo\n70:B3:D5:22:80:00/36\tHeitec Ag\n70:B3:D5:22:90:00/36\tCONTROL SYSTEMS Srl\n70:B3:D5:22:A0:00/36\tShishido Electrostatic, Ltd.\n70:B3:D5:22:B0:00/36\tVitec\n70:B3:D5:22:C0:00/36\tHiquel Elektronik- und Anlagenbau GmbH\n70:B3:D5:22:D0:00/36\tLeder Elektronik Design\n70:B3:D5:22:E0:00/36\tPrivate\n70:B3:D5:22:F0:00/36\tInstec, Inc.\n70:B3:D5:23:00:00/36\tCT Company\n70:B3:D5:23:10:00/36\tDelta Tau Data Systems, Inc.\n70:B3:D5:23:20:00/36\tUconsys\n70:B3:D5:23:30:00/36\tRch Spa\n70:B3:D5:23:40:00/36\tEDFelectronics JRMM Sp z o.o. sp.k.\n70:B3:D5:23:50:00/36\tCameon S.A.\n70:B3:D5:23:60:00/36\tMonnit Corporation\n70:B3:D5:23:70:00/36\tSikom AS\n70:B3:D5:23:80:00/36\tArete Associates\n70:B3:D5:23:90:00/36\tApplied Silver\n70:B3:D5:23:A0:00/36\tMesa Labs, Inc.\n70:B3:D5:23:B0:00/36\tFink Telecom Services\n70:B3:D5:23:C0:00/36\tQuasonix, LLC\n70:B3:D5:23:D0:00/36\tCircle Consult ApS\n70:B3:D5:23:E0:00/36\tTornado Modular Systems\n70:B3:D5:23:F0:00/36\tEta-Usa\n70:B3:D5:24:00:00/36\tOrlaco Products B.V.\n70:B3:D5:24:10:00/36\tBolide Technology Group, Inc.\n70:B3:D5:24:20:00/36\tComeo Technology Co.,Ltd\n70:B3:D5:24:30:00/36\tRohde&Schwarz Topex SA\n70:B3:D5:24:40:00/36\tDAT Informatics Pvt Ltd\n70:B3:D5:24:50:00/36\tNewtec A/S\n70:B3:D5:24:60:00/36\tSaline Lectronics, Inc.\n70:B3:D5:24:70:00/36\tSatsky Communication Equipment Co.,Ltd.\n70:B3:D5:24:80:00/36\tGl Tech Co.,Ltd\n70:B3:D5:24:90:00/36\tKospel S.A.\n70:B3:D5:24:A0:00/36\tUnmukti Technology Pvt Ltd\n70:B3:D5:24:B0:00/36\tTosei Engineering Corp.\n70:B3:D5:24:C0:00/36\tAstronomical Research Cameras, Inc.\n70:B3:D5:24:D0:00/36\tInfo Creative (Hk) Ltd\n70:B3:D5:24:E0:00/36\tChengdu Cove Technology CO.,LTD\n70:B3:D5:24:F0:00/36\tElbit Systems Bmd And Land Ew - Elisra Ltd\n70:B3:D5:25:00:00/36\tDatum Electronics Limited\n70:B3:D5:25:10:00/36\tTap Home, s.r.o.\n70:B3:D5:25:20:00/36\tSierra Nevada Corporation\n70:B3:D5:25:30:00/36\tWimate Technology Solutions Private Limited\n70:B3:D5:25:40:00/36\tSpectrum Brands\n70:B3:D5:25:50:00/36\tAsystems Corporation\n70:B3:D5:25:60:00/36\tTelco Antennas Pty Ltd\n70:B3:D5:25:70:00/36\tLG Electronics\n70:B3:D5:25:80:00/36\tBAYKON Endüstriyel Kontrol Sistemleri San. ve Tic. A.Ş.\n70:B3:D5:25:90:00/36\tZebra Elektronik A.S.\n70:B3:D5:25:A0:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:25:B0:00/36\tGID Industrial\n70:B3:D5:25:C0:00/36\tArclan'System\n70:B3:D5:25:D0:00/36\tMimo Networks\n70:B3:D5:25:E0:00/36\tRfhic\n70:B3:D5:25:F0:00/36\tCoppernic Sas\n70:B3:D5:26:00:00/36\tModuSystems, Inc\n70:B3:D5:26:10:00/36\tPotter Electric Signal Co. LLC\n70:B3:D5:26:20:00/36\tOOO Research and Production Center \"Computer Technologies\"\n70:B3:D5:26:30:00/36\tAxing Ag\n70:B3:D5:26:40:00/36\tifak technology + service GmbH\n70:B3:D5:26:50:00/36\tRapiot\n70:B3:D5:26:60:00/36\tSpectra Displays Ltd\n70:B3:D5:26:70:00/36\tZehntner Testing Instruments\n70:B3:D5:26:80:00/36\tCardinal Scale Mfg Co\n70:B3:D5:26:90:00/36\tGilbarco Veeder-Root  ‎\n70:B3:D5:26:A0:00/36\tTalleres de Escoriaza SA\n70:B3:D5:26:B0:00/36\tSorama BV\n70:B3:D5:26:C0:00/36\tEA Elektroautomatik GmbH & Co. KG\n70:B3:D5:26:D0:00/36\tSorion Electronics ltd\n70:B3:D5:26:E0:00/36\tHI-TECH SYSTEM Co. Ltd.\n70:B3:D5:26:F0:00/36\tCompal Electronics, Inc.\n70:B3:D5:27:00:00/36\tAmazon Technologies Inc.\n70:B3:D5:27:10:00/36\tCode Blue Corporation\n70:B3:D5:27:20:00/36\tTelecom Sante\n70:B3:D5:27:30:00/36\tWeVo Tech\n70:B3:D5:27:40:00/36\tStercom Power Solutions GmbH\n70:B3:D5:27:50:00/36\tInternet Protocolo Logica Sl\n70:B3:D5:27:60:00/36\tTELL Software Hungaria Kft.\n70:B3:D5:27:70:00/36\tVoltaware Limited\n70:B3:D5:27:80:00/36\tMedicomp, Inc\n70:B3:D5:27:90:00/36\tMedicomp, Inc\n70:B3:D5:27:A0:00/36\tTd Ecophisika\n70:B3:D5:27:B0:00/36\tDave Srl\n70:B3:D5:27:C0:00/36\tMOTION LIB,Inc.\n70:B3:D5:27:D0:00/36\tTelenor Connexion AB\n70:B3:D5:27:E0:00/36\tMettler Toledo\n70:B3:D5:27:F0:00/36\tST Aerospace Systems\n70:B3:D5:28:00:00/36\tComputech International\n70:B3:D5:28:10:00/36\tItg.Co.Ltd\n70:B3:D5:28:20:00/36\tSambo Hitech\n70:B3:D5:28:30:00/36\tTextNinja Co.\n70:B3:D5:28:40:00/36\tGlobalcom Engineering SPA\n70:B3:D5:28:50:00/36\tBentec GmbH Drilling & Oilfield Systems\n70:B3:D5:28:60:00/36\tPedax Danmark\n70:B3:D5:28:70:00/36\tHypex Electronics BV\n70:B3:D5:28:80:00/36\tBresslergroup\n70:B3:D5:28:90:00/36\tShenzhen Rongda Computer Co.,Ltd\n70:B3:D5:28:A0:00/36\tTransit Solutions, LLC.\n70:B3:D5:28:B0:00/36\tArnouse Digital Devices, Corp.\n70:B3:D5:28:C0:00/36\tStep Technica Co., Ltd.\n70:B3:D5:28:D0:00/36\tTechnica Engineering GmbH\n70:B3:D5:28:E0:00/36\tTex Computer Srl\n70:B3:D5:28:F0:00/36\tOverline Systems\n70:B3:D5:29:00:00/36\tGETT Geraetetechnik GmbH\n70:B3:D5:29:10:00/36\tSequent AG\n70:B3:D5:29:20:00/36\tBoston Dynamics\n70:B3:D5:29:30:00/36\tSolar RIg Technologies\n70:B3:D5:29:40:00/36\tRch Spa\n70:B3:D5:29:50:00/36\tCello Electronics (UK) Ltd\n70:B3:D5:29:60:00/36\tRohde&Schwarz Topex SA\n70:B3:D5:29:70:00/36\tGrossenbacher Systeme AG\n70:B3:D5:29:80:00/36\tReflexion Medical\n70:B3:D5:29:90:00/36\tKMtronic ltd\n70:B3:D5:29:A0:00/36\tProfusion Limited\n70:B3:D5:29:B0:00/36\tDermaLumics S.L.\n70:B3:D5:29:C0:00/36\tTeko Telecom Srl\n70:B3:D5:29:D0:00/36\tXTech2 SIA\n70:B3:D5:29:E0:00/36\tB2cloud lda\n70:B3:D5:29:F0:00/36\tCode Hardware SA\n70:B3:D5:2A:00:00/36\tAirthings\n70:B3:D5:2A:10:00/36\tBlink Services AB\n70:B3:D5:2A:20:00/36\tVisualware, Inc.\n70:B3:D5:2A:30:00/36\tATT Nussbaum Prüftechnik GmbH\n70:B3:D5:2A:40:00/36\tTelevic Rail GmbH\n70:B3:D5:2A:50:00/36\tTaitotekniikka\n70:B3:D5:2A:60:00/36\tGSI Technology\n70:B3:D5:2A:70:00/36\tPlasmability, LLC\n70:B3:D5:2A:80:00/36\tDynamic Perspective GmbH\n70:B3:D5:2A:90:00/36\tPower Electronics Espana, S.L.\n70:B3:D5:2A:A0:00/36\tFlirtey Inc\n70:B3:D5:2A:B0:00/36\tNASA Johnson Space Center\n70:B3:D5:2A:C0:00/36\tNew Imaging Technologies\n70:B3:D5:2A:D0:00/36\tOpgal Optronic Industries\n70:B3:D5:2A:E0:00/36\tAlere Technologies AS\n70:B3:D5:2A:F0:00/36\tEnlaps\n70:B3:D5:2B:00:00/36\tBeijing Zhongyi Yue Tai Technology Co., Ltd\n70:B3:D5:2B:10:00/36\tWIXCON Co., Ltd\n70:B3:D5:2B:20:00/36\tSun Creative (ZheJiang) Technology INC.\n70:B3:D5:2B:30:00/36\tHAS co.,ltd.\n70:B3:D5:2B:40:00/36\tFoerster-Technik GmbH\n70:B3:D5:2B:50:00/36\tDosepack India LLP\n70:B3:D5:2B:60:00/36\tHLT Micro\n70:B3:D5:2B:70:00/36\tMatrix Orbital Corporation\n70:B3:D5:2B:80:00/36\tWideNorth AS\n70:B3:D5:2B:90:00/36\tBELECTRIC GmbH\n70:B3:D5:2B:A0:00/36\tActive Brains\n70:B3:D5:2B:B0:00/36\tAutomation Networks & Solutions LLC\n70:B3:D5:2B:C0:00/36\tEquipos De Telecomunicación Optoelectrónicos, S.A.\n70:B3:D5:2B:D0:00/36\tmg-sensor GmbH\n70:B3:D5:2B:E0:00/36\tCoherent Logix, Inc.\n70:B3:D5:2B:F0:00/36\tFoshan Vohom\n70:B3:D5:2C:00:00/36\tSensative AB\n70:B3:D5:2C:10:00/36\tAvlinkpro\n70:B3:D5:2C:20:00/36\tQuantum Detectors\n70:B3:D5:2C:30:00/36\tProterra\n70:B3:D5:2C:40:00/36\tHodwa Co., Ltd\n70:B3:D5:2C:50:00/36\tMect Srl\n70:B3:D5:2C:60:00/36\tAM General Contractor\n70:B3:D5:2C:70:00/36\tWorldsensing\n70:B3:D5:2C:80:00/36\tSlat\n70:B3:D5:2C:90:00/36\tSeason Design Technology\n70:B3:D5:2C:A0:00/36\tTattile Srl\n70:B3:D5:2C:B0:00/36\tYongtong tech\n70:B3:D5:2C:C0:00/36\tWeWork Companies, Inc.\n70:B3:D5:2C:D0:00/36\tKorea Airports Corporation\n70:B3:D5:2C:E0:00/36\tKdt\n70:B3:D5:2C:F0:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:2D:00:00/36\tijin co.,ltd.\n70:B3:D5:2D:10:00/36\tInteger.pl S.A.\n70:B3:D5:2D:20:00/36\tShanghai Irisian Optronics Technology Co.,Ltd.\n70:B3:D5:2D:30:00/36\tHensoldt Sensors GmbH\n70:B3:D5:2D:40:00/36\tCT Company\n70:B3:D5:2D:50:00/36\tTeuco Guzzini\n70:B3:D5:2D:60:00/36\tKvazar LLC\n70:B3:D5:2D:70:00/36\tPrivate\n70:B3:D5:2D:80:00/36\tUnisight Digital Products\n70:B3:D5:2D:90:00/36\tZpas S.A.\n70:B3:D5:2D:A0:00/36\tSkywave Networks Private Limited\n70:B3:D5:2D:B0:00/36\tProtoPixel SL\n70:B3:D5:2D:C0:00/36\tBolide Technology Group, Inc.\n70:B3:D5:2D:D0:00/36\tMelissa Climate Jsc\n70:B3:D5:2D:E0:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:2D:F0:00/36\tEastern Science & Technology Co., Ltd\n70:B3:D5:2E:00:00/36\tPeter Huber Kaeltemaschinenbau SE\n70:B3:D5:2E:10:00/36\thiSky SCS Ltd\n70:B3:D5:2E:20:00/36\tSpark Lasers\n70:B3:D5:2E:30:00/36\tMeiknologic GmbH\n70:B3:D5:2E:40:00/36\tSchneider Electric Motion USA\n70:B3:D5:2E:50:00/36\tFläkt Woods AB\n70:B3:D5:2E:60:00/36\tIPG Photonics Corporation\n70:B3:D5:2E:70:00/36\tAtos spa\n70:B3:D5:2E:80:00/36\tTelefire\n70:B3:D5:2E:90:00/36\tNeurIT s.r.o.\n70:B3:D5:2E:A0:00/36\tSchneider Electric Motion\n70:B3:D5:2E:B0:00/36\tBrnet Co.,Ltd.\n70:B3:D5:2E:C0:00/36\tGrupo Epelsa S.L.\n70:B3:D5:2E:D0:00/36\tSignals and systems india pvt ltd\n70:B3:D5:2E:E0:00/36\tAplex Technology Inc.\n70:B3:D5:2E:F0:00/36\tIem Sa\n70:B3:D5:2F:00:00/36\tClock-O-Matic\n70:B3:D5:2F:10:00/36\tInspike S.R.L.\n70:B3:D5:2F:20:00/36\tHealth Care Originals, Inc.\n70:B3:D5:2F:30:00/36\tScame Sistemi srl\n70:B3:D5:2F:40:00/36\tRadixon s.r.o.\n70:B3:D5:2F:50:00/36\teze System, Inc.\n70:B3:D5:2F:60:00/36\tTattile Srl\n70:B3:D5:2F:70:00/36\tMilitary Research Institute\n70:B3:D5:2F:80:00/36\tTunstall A/S\n70:B3:D5:2F:90:00/36\tConsospy\n70:B3:D5:2F:A0:00/36\tToray　Medical　Co.,Ltd\n70:B3:D5:2F:B0:00/36\tIk Multimedia Production Srl\n70:B3:D5:2F:C0:00/36\tLoanguard T/A SE Controls\n70:B3:D5:2F:D0:00/36\tSpecial Projects Group, Inc\n70:B3:D5:2F:E0:00/36\tYaham Optoelectronics Co., Ltd\n70:B3:D5:2F:F0:00/36\tSunstone Engineering\n70:B3:D5:30:00:00/36\tNovo DR Ltd.\n70:B3:D5:30:10:00/36\tWayne Analytics Llc\n70:B3:D5:30:20:00/36\tDogWatch Inc\n70:B3:D5:30:30:00/36\tFuchu Giken, Inc.\n70:B3:D5:30:40:00/36\tWartsila Voyage Oy\n70:B3:D5:30:50:00/36\tCAITRON Industrial Solutions GmbH\n70:B3:D5:30:60:00/36\tLemz-T, Llc\n70:B3:D5:30:70:00/36\tEnergi innovation Aps\n70:B3:D5:30:80:00/36\tDsd Microtechnology,Inc.\n70:B3:D5:30:90:00/36\tABS Applied Biometric Systems GmbH\n70:B3:D5:30:A0:00/36\tHongSeok Ltd.\n70:B3:D5:30:B0:00/36\tAsh Technologies\n70:B3:D5:30:C0:00/36\tSicon srl\n70:B3:D5:30:D0:00/36\tFiberbase\n70:B3:D5:30:E0:00/36\tEcolonum Inc.\n70:B3:D5:30:F0:00/36\tCardinal Scales Manufacturing Co\n70:B3:D5:31:00:00/36\tConserv Solutions\n70:B3:D5:31:10:00/36\tGünther Spelsberg GmbH + Co. KG\n70:B3:D5:31:20:00/36\tSMITEC S.p.A.\n70:B3:D5:31:30:00/36\tDIEHL Controls\n70:B3:D5:31:40:00/36\tGrau Elektronik GmbH\n70:B3:D5:31:50:00/36\tPrivate\n70:B3:D5:31:60:00/36\tAustco Marketing & Service (USA) ltd.\n70:B3:D5:31:70:00/36\tIotopia Solutions\n70:B3:D5:31:80:00/36\tExemplar Medical, LLC\n70:B3:D5:31:90:00/36\tIso/Tc 22/Sc 31\n70:B3:D5:31:A0:00/36\tTerratel Technology s.r.o.\n70:B3:D5:31:B0:00/36\tSilTerra Malaysia Sdn. Bhd.\n70:B3:D5:31:C0:00/36\tFINANCIERE DE L'OMBREE (eolane)\n70:B3:D5:31:D0:00/36\tAVA Monitoring AB\n70:B3:D5:31:E0:00/36\tGillam-Fei S.A.\n70:B3:D5:31:F0:00/36\tElcoma\n70:B3:D5:32:00:00/36\tCYNIX Systems Inc\n70:B3:D5:32:10:00/36\tYite technology\n70:B3:D5:32:20:00/36\tPuS GmbH und Co. KG\n70:B3:D5:32:30:00/36\tTattile Srl\n70:B3:D5:32:40:00/36\tThales Nederland BV\n70:B3:D5:32:50:00/36\tBlueMark Innovations BV\n70:B3:D5:32:60:00/36\tNemeus-Sas\n70:B3:D5:32:70:00/36\tSeneco A/S\n70:B3:D5:32:80:00/36\tHipodromo De Agua Caliente Sa Cv\n70:B3:D5:32:90:00/36\tPrimalucelab isrl\n70:B3:D5:32:A0:00/36\tWuhan Xingtuxinke ELectronic Co.,Ltd\n70:B3:D5:32:B0:00/36\tRTA srl\n70:B3:D5:32:C0:00/36\tATION Corporation\n70:B3:D5:32:D0:00/36\tHanwell Technology Co., Ltd.\n70:B3:D5:32:E0:00/36\tA&T Corporation\n70:B3:D5:32:F0:00/36\tMovidius SRL\n70:B3:D5:33:00:00/36\tiOne\n70:B3:D5:33:10:00/36\tFirecom, Inc.\n70:B3:D5:33:20:00/36\tInnoSenT\n70:B3:D5:33:30:00/36\tOrlaco Products B.V.\n70:B3:D5:33:40:00/36\tDokuen Co. Ltd.\n70:B3:D5:33:50:00/36\tJonsa Australia Pty Ltd\n70:B3:D5:33:60:00/36\tSynaccess Networks Inc.\n70:B3:D5:33:70:00/36\tLaborie\n70:B3:D5:33:80:00/36\tOpti-Sciences, Inc.\n70:B3:D5:33:90:00/36\tSierra Nevada Corporation\n70:B3:D5:33:A0:00/36\tAudioTEC LLC\n70:B3:D5:33:B0:00/36\tSeal Shield, LLC\n70:B3:D5:33:C0:00/36\tVideri Inc.\n70:B3:D5:33:D0:00/36\tSchneider Electric Motion USA\n70:B3:D5:33:E0:00/36\tDynamic Connect (Suzhou) Hi-Tech Electronic Co.,Ltd.\n70:B3:D5:33:F0:00/36\tXantia Sa\n70:B3:D5:34:00:00/36\tRenesas Electronics\n70:B3:D5:34:10:00/36\tVtron Pty Ltd\n70:B3:D5:34:20:00/36\tSolectrix\n70:B3:D5:34:30:00/36\tElektro-System s.c.\n70:B3:D5:34:40:00/36\tIHI Inspection & Instrumentation Co., Ltd.\n70:B3:D5:34:50:00/36\tAT-Automation Technology GmbH\n70:B3:D5:34:60:00/36\tUltamation Limited\n70:B3:D5:34:70:00/36\tOAS Sweden AB\n70:B3:D5:34:80:00/36\tBÄR Bahnsicherung AG\n70:B3:D5:34:90:00/36\tSlat\n70:B3:D5:34:A0:00/36\tPavo Tasarim Üreti̇m Ti̇c A.Ş.\n70:B3:D5:34:B0:00/36\tLeaff Engineering Srl\n70:B3:D5:34:C0:00/36\tGLT Exports Ltd\n70:B3:D5:34:D0:00/36\tEquos Research Co., Ltd\n70:B3:D5:34:E0:00/36\tRisk Expert sarl\n70:B3:D5:34:F0:00/36\tRoyal Engineering Consultancy Private Limited\n70:B3:D5:35:00:00/36\tTickster AB\n70:B3:D5:35:10:00/36\tKST technology\n70:B3:D5:35:20:00/36\tGlobalcom Engineering SPA\n70:B3:D5:35:30:00/36\tDigital Outfit\n70:B3:D5:35:40:00/36\tIMP-Computer Systems\n70:B3:D5:35:50:00/36\tHongin., Ltd\n70:B3:D5:35:60:00/36\tBRS Sistemas Eletrônicos\n70:B3:D5:35:70:00/36\tMovimento Group AB\n70:B3:D5:35:80:00/36\tNevotek\n70:B3:D5:35:90:00/36\tBoutronic\n70:B3:D5:35:A0:00/36\tApplied Radar, Inc.\n70:B3:D5:35:B0:00/36\tNuance Hearing Ltd.\n70:B3:D5:35:C0:00/36\tACS electronics srl\n70:B3:D5:35:D0:00/36\tFresh Idea Factory BV\n70:B3:D5:35:E0:00/36\tEIDOS s.p.a.\n70:B3:D5:35:F0:00/36\tAplex Technology Inc.\n70:B3:D5:36:00:00/36\tPT. Emsonic Indonesia\n70:B3:D5:36:10:00/36\tParent Power\n70:B3:D5:36:20:00/36\tAsiga\n70:B3:D5:36:30:00/36\tContec Americas Inc.\n70:B3:D5:36:40:00/36\tADAMCZEWSKI elektronische Messtechnik GmbH\n70:B3:D5:36:50:00/36\tCircuitMeter Inc.\n70:B3:D5:36:60:00/36\tSolarlytics, Inc.\n70:B3:D5:36:70:00/36\tLiving Water\n70:B3:D5:36:80:00/36\tWhite Matter LLC\n70:B3:D5:36:90:00/36\tALVAT s.r.o.\n70:B3:D5:36:A0:00/36\tBecton Dickinson\n70:B3:D5:36:B0:00/36\tHuz Electronics Ltd\n70:B3:D5:36:C0:00/36\tSicon srl\n70:B3:D5:36:D0:00/36\tCyberteam Sp z o o\n70:B3:D5:36:E0:00/36\tElectrónica Falcón S.A.U\n70:B3:D5:36:F0:00/36\tBuddyGuard GmbH\n70:B3:D5:37:00:00/36\tInphi Corporation\n70:B3:D5:37:10:00/36\tBEDEROV GmbH\n70:B3:D5:37:20:00/36\tMatelex\n70:B3:D5:37:30:00/36\tHangzhou Weimu Technology Co.,Ltd.\n70:B3:D5:37:40:00/36\tOOO NPP Mars-Energo\n70:B3:D5:37:50:00/36\tAdel System srl\n70:B3:D5:37:60:00/36\tMagenta Labs, Inc.\n70:B3:D5:37:70:00/36\tMonnit Corporation\n70:B3:D5:37:80:00/36\tsynchrotron SOLEIL\n70:B3:D5:37:90:00/36\tVensi, Inc.\n70:B3:D5:37:A0:00/36\tAPG Cash Drawer, LLC\n70:B3:D5:37:B0:00/36\tPower Ltd.\n70:B3:D5:37:C0:00/36\tMerus Power Dynamics Ltd.\n70:B3:D5:37:D0:00/36\tThe DX Shop Limited\n70:B3:D5:37:E0:00/36\tElinkgate Jsc\n70:B3:D5:37:F0:00/36\tIDS Innomic GmbH\n70:B3:D5:38:00:00/36\tSeaTech Intelligent Technology (Shanghai) Co., LTD\n70:B3:D5:38:10:00/36\tCrde\n70:B3:D5:38:20:00/36\tNaval Group\n70:B3:D5:38:30:00/36\tLPA Excil Electronics\n70:B3:D5:38:40:00/36\tSensohive Technologies\n70:B3:D5:38:50:00/36\tKamacho Scale Co., Ltd.\n70:B3:D5:38:60:00/36\tGPSat Systems\n70:B3:D5:38:70:00/36\tGWF MessSysteme AG\n70:B3:D5:38:80:00/36\tXitron\n70:B3:D5:38:90:00/36\t2KLIC inc.\n70:B3:D5:38:A0:00/36\tKSE GmbH\n70:B3:D5:38:B0:00/36\tLookman Electroplast Industries Ltd\n70:B3:D5:38:C0:00/36\tMiraeSignal Co., Ltd\n70:B3:D5:38:D0:00/36\tImp-Telekomunikacije Doo\n70:B3:D5:38:E0:00/36\tChina Telecom Fufu Information Technology CO.,LTD\n70:B3:D5:38:F0:00/36\tSorynorydotcom Inc\n70:B3:D5:39:00:00/36\tTex Computer Srl\n70:B3:D5:39:10:00/36\tChangshu Ruite Electric Co.,Ltd.\n70:B3:D5:39:20:00/36\tContec Americas Inc.\n70:B3:D5:39:30:00/36\tMonnit Corporation\n70:B3:D5:39:40:00/36\tRomteck Australia\n70:B3:D5:39:50:00/36\tICsec S.A.\n70:B3:D5:39:60:00/36\tCTG sp. z o. o.\n70:B3:D5:39:70:00/36\tGuangxi Hunter Information Industry Co.,Ltd\n70:B3:D5:39:80:00/36\tSIPRO s.r.l.\n70:B3:D5:39:90:00/36\tSPE Smartico, LLC\n70:B3:D5:39:A0:00/36\tVideotrend srl\n70:B3:D5:39:B0:00/36\tIroc Ab\n70:B3:D5:39:C0:00/36\tGD Mission Systems\n70:B3:D5:39:D0:00/36\tComark Interactive Solutions\n70:B3:D5:39:E0:00/36\tLanmark Controls Inc.\n70:B3:D5:39:F0:00/36\tCT Company\n70:B3:D5:3A:00:00/36\tchiconypower\n70:B3:D5:3A:10:00/36\tReckeen HDP Media sp. z o.o. sp. k.\n70:B3:D5:3A:20:00/36\tDaifuku CO., Ltd.\n70:B3:D5:3A:30:00/36\tCDS Institute of Management Strategy, Inc.\n70:B3:D5:3A:40:00/36\tAscenix Corporation\n70:B3:D5:3A:50:00/36\tKMtronic ltd\n70:B3:D5:3A:60:00/36\tmyenergi Ltd\n70:B3:D5:3A:70:00/36\tVarikorea\n70:B3:D5:3A:80:00/36\tJamHub Corp.\n70:B3:D5:3A:90:00/36\tVivalnk\n70:B3:D5:3A:A0:00/36\tRcatsone\n70:B3:D5:3A:B0:00/36\tCamozzi Automation SpA\n70:B3:D5:3A:C0:00/36\tRF-Tuote Oy\n70:B3:D5:3A:D0:00/36\tCT Company\n70:B3:D5:3A:E0:00/36\tExicom Technologies fze\n70:B3:D5:3A:F0:00/36\tTurbo Technologies Corporation\n70:B3:D5:3B:00:00/36\tMillennial Net, Inc.\n70:B3:D5:3B:10:00/36\tGlobal Power Products\n70:B3:D5:3B:20:00/36\tSicon srl\n70:B3:D5:3B:30:00/36\tMovicom Electric LLC\n70:B3:D5:3B:40:00/36\tYousung\n70:B3:D5:3B:50:00/36\tPreston Industries dba PolyScience\n70:B3:D5:3B:60:00/36\tMedRx, Inc\n70:B3:D5:3B:70:00/36\tPaul Scherrer Institut (PSI)\n70:B3:D5:3B:80:00/36\tnVideon, Inc.\n70:B3:D5:3B:90:00/36\tBirdDog Australia\n70:B3:D5:3B:A0:00/36\tSilex Inside\n70:B3:D5:3B:B0:00/36\tA-M Systems\n70:B3:D5:3B:C0:00/36\tSciTronix\n70:B3:D5:3B:D0:00/36\tDao Qin Technology Co.Ltd.\n70:B3:D5:3B:E0:00/36\tMyDefence Communication ApS\n70:B3:D5:3B:F0:00/36\tStar Electronics GmbH & Co. KG\n70:B3:D5:3C:00:00/36\tDK-Technologies A/S\n70:B3:D5:3C:10:00/36\tthingdust AG\n70:B3:D5:3C:20:00/36\tCellular Specialties, Inc.\n70:B3:D5:3C:30:00/36\tAimco\n70:B3:D5:3C:40:00/36\tHagiwara Solutions Co., Ltd.\n70:B3:D5:3C:50:00/36\tP4Q Electronics, S.L.\n70:B3:D5:3C:60:00/36\tACD Elekronik GmbH\n70:B3:D5:3C:70:00/36\tSoftcreate Corp.\n70:B3:D5:3C:80:00/36\tABC Electric Co.\n70:B3:D5:3C:90:00/36\tDuerkopp-Adler\n70:B3:D5:3C:A0:00/36\tTTI Ltd\n70:B3:D5:3C:B0:00/36\tGeoSpectrum Technologies Inc\n70:B3:D5:3C:C0:00/36\tTerOpta Ltd\n70:B3:D5:3C:D0:00/36\tBRS Sistemas Eletrônicos\n70:B3:D5:3C:E0:00/36\tAditec GmbH\n70:B3:D5:3C:F0:00/36\tSystems Engineering Arts Pty Ltd\n70:B3:D5:3D:00:00/36\tORtek Technology, Inc.\n70:B3:D5:3D:10:00/36\tImenco Ltd\n70:B3:D5:3D:20:00/36\tImagine Inc.\n70:B3:D5:3D:30:00/36\tGS Elektromedizinsiche Geräte G. Stemple GmbH\n70:B3:D5:3D:40:00/36\tSanmina Israel\n70:B3:D5:3D:50:00/36\toxynet Solutions\n70:B3:D5:3D:60:00/36\tAriston Thermo s.p.a.\n70:B3:D5:3D:70:00/36\tTomorrow Companies Inc\n70:B3:D5:3D:80:00/36\tAbitsoftware, Ltd.\n70:B3:D5:3D:90:00/36\tAplex Technology Inc.\n70:B3:D5:3D:A0:00/36\tLoop Labs, Inc.\n70:B3:D5:3D:B0:00/36\tKST technology\n70:B3:D5:3D:C0:00/36\tXia Llc\n70:B3:D5:3D:D0:00/36\tKniggendorf + Kögler Security GmbH\n70:B3:D5:3D:E0:00/36\tELOMAC Elektronik GmbH\n70:B3:D5:3D:F0:00/36\tMultiDyne\n70:B3:D5:3E:00:00/36\tGogo Business Aviation\n70:B3:D5:3E:10:00/36\tBarnstormer Softworks\n70:B3:D5:3E:20:00/36\tAVI Pty Ltd\n70:B3:D5:3E:30:00/36\tHead\n70:B3:D5:3E:40:00/36\tNeptec Technologies Corp.\n70:B3:D5:3E:50:00/36\tAteme\n70:B3:D5:3E:60:00/36\tmachineQ\n70:B3:D5:3E:70:00/36\tJNR Sports Holdings, LLC\n70:B3:D5:3E:80:00/36\tCOSMOS web Co., Ltd.\n70:B3:D5:3E:90:00/36\tAPOLLO GIKEN Co.,Ltd.\n70:B3:D5:3E:A0:00/36\tDave Srl\n70:B3:D5:3E:B0:00/36\tGrossenbacher Systeme AG\n70:B3:D5:3E:C0:00/36\tOutsight SA\n70:B3:D5:3E:D0:00/36\tUltra Electronics Sonar System Division\n70:B3:D5:3E:E0:00/36\tLaser Imagineering Vertriebs GmbH\n70:B3:D5:3E:F0:00/36\tVtron Pty Ltd\n70:B3:D5:3F:00:00/36\tIntervala\n70:B3:D5:3F:10:00/36\tOlympus NDT Canada\n70:B3:D5:3F:20:00/36\tH3D, Inc.\n70:B3:D5:3F:30:00/36\tSpea Spa\n70:B3:D5:3F:40:00/36\tWincode Technology Co., Ltd.\n70:B3:D5:3F:50:00/36\tDolby Laboratories, Inc.\n70:B3:D5:3F:60:00/36\tSycomp Electronic GmbH\n70:B3:D5:3F:70:00/36\tCefla Sc\n70:B3:D5:3F:80:00/36\tThe Fire Horn, Inc.\n70:B3:D5:3F:90:00/36\tHerrick Tech Labs\n70:B3:D5:3F:A0:00/36\tZaklad Energoelektroniki Twerd\n70:B3:D5:3F:B0:00/36\tLiberty Reach\n70:B3:D5:3F:C0:00/36\tTangRen C&S CO., Ltd\n70:B3:D5:3F:D0:00/36\tNaraControls Inc\n70:B3:D5:3F:E0:00/36\tSiemens Industry Software Inc.\n70:B3:D5:3F:F0:00/36\tHydra Controls\n70:B3:D5:40:00:00/36\tVtron Pty Ltd\n70:B3:D5:40:10:00/36\tPrivate\n70:B3:D5:40:20:00/36\tAKIS technologies\n70:B3:D5:40:30:00/36\tMighty Cube Co., Ltd.\n70:B3:D5:40:40:00/36\tRANIX,Inc.\n70:B3:D5:40:50:00/36\tMG s.r.l.\n70:B3:D5:40:60:00/36\tAcrodea, Inc.\n70:B3:D5:40:70:00/36\tIdosens\n70:B3:D5:40:80:00/36\tComrod AS\n70:B3:D5:40:90:00/36\tBeijing Yutian Technology Co., Ltd.\n70:B3:D5:40:A0:00/36\tMonroe Electronics, Inc.\n70:B3:D5:40:B0:00/36\tQuercus Technologies, S.L.\n70:B3:D5:40:C0:00/36\tTornado Modular Systems\n70:B3:D5:40:D0:00/36\tGrupo Epelsa S.L.\n70:B3:D5:40:E0:00/36\tLiaoyun Information Technology Co., Ltd.\n70:B3:D5:40:F0:00/36\tNexelec\n70:B3:D5:41:00:00/36\tAvant Technologies\n70:B3:D5:41:10:00/36\tMi-Fi Networks Pvt Ltd\n70:B3:D5:41:20:00/36\tTattile Srl\n70:B3:D5:41:30:00/36\tAxess AG\n70:B3:D5:41:40:00/36\tSmith Meter, Inc.\n70:B3:D5:41:50:00/36\tIdea Spa\n70:B3:D5:41:60:00/36\tAntlia Systems\n70:B3:D5:41:70:00/36\tFigment Design Laboratories\n70:B3:D5:41:80:00/36\tDEV Systemtechnik GmbH& Co KG\n70:B3:D5:41:90:00/36\tProdata Mobility Brasil SA\n70:B3:D5:41:A0:00/36\tHYOSUNG Heavy Industries Corporation\n70:B3:D5:41:B0:00/36\tSYS TEC electronic GmbH\n70:B3:D5:41:C0:00/36\tTwoway Communications, Inc.\n70:B3:D5:41:D0:00/36\tAzmoon Keifiat\n70:B3:D5:41:E0:00/36\tRedler Computers\n70:B3:D5:41:F0:00/36\tOrion S.r.l.\n70:B3:D5:42:00:00/36\tEcoinet\n70:B3:D5:42:10:00/36\tNorth Star Bestech Co.,\n70:B3:D5:42:20:00/36\tSUS Corporation\n70:B3:D5:42:30:00/36\tHarman Connected Services Corporation India Pvt. Ltd.\n70:B3:D5:42:40:00/36\tUnderground Systems, Inc.\n70:B3:D5:42:50:00/36\tSinterCast\n70:B3:D5:42:60:00/36\tZehnder Group Nederland\n70:B3:D5:42:70:00/36\tKey Chemical & Equipment Company\n70:B3:D5:42:80:00/36\tPresentation Switchers, Inc.\n70:B3:D5:42:90:00/36\tRedco Audio Inc\n70:B3:D5:42:A0:00/36\tCritical Link LLC\n70:B3:D5:42:B0:00/36\tGuangzhou Haoxiang Computer Technology Co.,Ltd.\n70:B3:D5:42:C0:00/36\tD.Marchiori Srl\n70:B3:D5:42:D0:00/36\tRch Italia Spa\n70:B3:D5:42:E0:00/36\tDr. Zinngrebe GmbH\n70:B3:D5:42:F0:00/36\tSintokogio, Ltd\n70:B3:D5:43:00:00/36\tAlgodue Elettronica Srl\n70:B3:D5:43:10:00/36\tPower Electronics Espana, S.L.\n70:B3:D5:43:20:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:43:30:00/36\tFlexsolution APS\n70:B3:D5:43:40:00/36\tWit.com Inc\n70:B3:D5:43:50:00/36\tWuhan Xingtuxinke ELectronic Co.,Ltd\n70:B3:D5:43:60:00/36\tHenrich Electronics Corporation\n70:B3:D5:43:70:00/36\tDigital Way\n70:B3:D5:43:80:00/36\tHBI Bisscheroux bv\n70:B3:D5:43:90:00/36\tTriLED\n70:B3:D5:43:A0:00/36\tARKS Enterprises, Inc.\n70:B3:D5:43:B0:00/36\tKalycito Infotech Private Limited\n70:B3:D5:43:C0:00/36\tScenario Automation\n70:B3:D5:43:D0:00/36\tVeryx Technologies Private Limited\n70:B3:D5:43:E0:00/36\tPeloton Technology\n70:B3:D5:43:F0:00/36\tbiosilver .co.,ltd\n70:B3:D5:44:00:00/36\tDiscover Video\n70:B3:D5:44:10:00/36\tVideoport S.A.\n70:B3:D5:44:20:00/36\tBlair Companies\n70:B3:D5:44:30:00/36\tSlot3 GmbH\n70:B3:D5:44:40:00/36\tAMS Controls, Inc.\n70:B3:D5:44:50:00/36\tAdvanced Devices SpA\n70:B3:D5:44:60:00/36\tSanta Barbara Imaging Systems\n70:B3:D5:44:70:00/36\tAvid Controls Inc\n70:B3:D5:44:80:00/36\tB/E Aerospace, Inc.\n70:B3:D5:44:90:00/36\tEdgeware AB\n70:B3:D5:44:A0:00/36\tCanon Electron Tubes & Devices Co., Ltd.\n70:B3:D5:44:B0:00/36\tOpen System Solutions Limited\n70:B3:D5:44:C0:00/36\tejoin, s.r.o.\n70:B3:D5:44:D0:00/36\tVessel Technology Ltd\n70:B3:D5:44:E0:00/36\tSolace Systems Inc.\n70:B3:D5:44:F0:00/36\tVelvac Incorporated\n70:B3:D5:45:00:00/36\tApantac LLC\n70:B3:D5:45:10:00/36\tPerform3-D LLC\n70:B3:D5:45:20:00/36\tItaliana Ponti Radio Srl\n70:B3:D5:45:30:00/36\tFoerster-Technik GmbH\n70:B3:D5:45:40:00/36\tGolding Audio Ltd\n70:B3:D5:45:50:00/36\tHeartlandmicropayments\n70:B3:D5:45:60:00/36\tTechnological Application And Production One Member Liability Company (Tecapro Company)\n70:B3:D5:45:70:00/36\tVivaldi Clima Srl\n70:B3:D5:45:80:00/36\tOngisul Co.,Ltd.\n70:B3:D5:45:90:00/36\tProtium Technologies, Inc.\n70:B3:D5:45:A0:00/36\tPalarum LLC\n70:B3:D5:45:B0:00/36\tKomz - Izmereniya\n70:B3:D5:45:C0:00/36\tAlyTech\n70:B3:D5:45:D0:00/36\tSensapex Oy\n70:B3:D5:45:E0:00/36\teSOL Co.,Ltd.\n70:B3:D5:45:F0:00/36\tCloud4Wi\n70:B3:D5:46:00:00/36\tGuilin Tryin Technology Co.,Ltd\n70:B3:D5:46:10:00/36\tTESEC Corporation\n70:B3:D5:46:20:00/36\tEarTex\n70:B3:D5:46:30:00/36\tWarecube,Inc\n70:B3:D5:46:50:00/36\tEnergisme\n70:B3:D5:46:60:00/36\tSYLink Technologie\n70:B3:D5:46:70:00/36\tGreenWake Technologies\n70:B3:D5:46:80:00/36\tShanghai Junqian Sensing Technology Co., LTD\n70:B3:D5:46:90:00/36\tGentec Systems  Co.\n70:B3:D5:46:A0:00/36\tShenzhen Vikings Technology Co., Ltd.\n70:B3:D5:46:B0:00/36\tAirborne Engineering Limited\n70:B3:D5:46:C0:00/36\tShanghai Chenzhu Instrument Co., Ltd.\n70:B3:D5:46:D0:00/36\tGuan Show Technologe Co., Ltd.\n70:B3:D5:46:E0:00/36\tZamir Recognition Systems Ltd.\n70:B3:D5:46:F0:00/36\tserva transport systems GmbH\n70:B3:D5:47:00:00/36\tKitron Uab\n70:B3:D5:47:10:00/36\tSYSCO Sicherheitssysteme GmbH\n70:B3:D5:47:20:00/36\tQuadio Devices Private Limited\n70:B3:D5:47:30:00/36\tKeyProd\n70:B3:D5:47:40:00/36\tCtrogers Llc\n70:B3:D5:47:50:00/36\tEwattch\n70:B3:D5:47:60:00/36\tFR-Team International SA\n70:B3:D5:47:70:00/36\tdigitrol limited\n70:B3:D5:47:80:00/36\tTouchnet/OneCard\n70:B3:D5:47:90:00/36\tLineage Power Pvt Ltd.,\n70:B3:D5:47:A0:00/36\tGlooVir Inc.\n70:B3:D5:47:B0:00/36\tMonixo\n70:B3:D5:47:C0:00/36\tPar-Tech, Inc.\n70:B3:D5:47:D0:00/36\tShenyang TECHE Technology Co.,Ltd\n70:B3:D5:47:E0:00/36\tFiber Optika Technologies Pvt. Ltd.\n70:B3:D5:47:F0:00/36\tASE GmbH\n70:B3:D5:48:00:00/36\tEmergency Lighting Products Limited\n70:B3:D5:48:10:00/36\tSTEP sarl\n70:B3:D5:48:20:00/36\tAeryon Labs Inc\n70:B3:D5:48:30:00/36\tLitum Bilgi Teknolojileri San. Ve Tic. A.S.\n70:B3:D5:48:40:00/36\tHermann Sewerin GmbH\n70:B3:D5:48:50:00/36\tClaresys Limited\n70:B3:D5:48:60:00/36\tChongQing JianTao Technology Co., Ltd.\n70:B3:D5:48:70:00/36\tECS s.r.l.\n70:B3:D5:48:80:00/36\tCardinal Scale Mfg Co\n70:B3:D5:48:90:00/36\tard sa\n70:B3:D5:48:A0:00/36\tGeorge Wilson Industries Ltd\n70:B3:D5:48:B0:00/36\tTattile Srl\n70:B3:D5:48:C0:00/36\tIntegrated Systems Engineering, Inc.\n70:B3:D5:48:D0:00/36\tOmega Bilance Srl Societa' Unipersonale\n70:B3:D5:48:E0:00/36\tAllim System Co,.Ltd.\n70:B3:D5:48:F0:00/36\tSeiwa Giken\n70:B3:D5:49:00:00/36\tXiamen Beogold Technology Co. Ltd.\n70:B3:D5:49:10:00/36\tVonsch\n70:B3:D5:49:20:00/36\tJiangsu Jinheng  Information Technology Co.,Ltd.\n70:B3:D5:49:30:00/36\tImpulse Networks Pte Ltd\n70:B3:D5:49:40:00/36\tSchildknecht AG\n70:B3:D5:49:50:00/36\tFiem Industries Ltd.\n70:B3:D5:49:60:00/36\tProfcon AB\n70:B3:D5:49:70:00/36\tAlbiral Display Solutions Sl\n70:B3:D5:49:80:00/36\tXgem Sas\n70:B3:D5:49:90:00/36\tPycom Ltd\n70:B3:D5:49:A0:00/36\tHaxe Systeme\n70:B3:D5:49:B0:00/36\tAlgodue Elettronica Srl\n70:B3:D5:49:C0:00/36\tAC Power Corp.\n70:B3:D5:49:D0:00/36\tShenzhen Chanslink Network Technology Co., Ltd\n70:B3:D5:49:E0:00/36\tCAPTEMP, Lda\n70:B3:D5:49:F0:00/36\tB.P.A. Srl\n70:B3:D5:4A:00:00/36\tFludia\n70:B3:D5:4A:10:00/36\tHerholdt Controls srl\n70:B3:D5:4A:20:00/36\tDEVAU Lemppenau GmbH\n70:B3:D5:4A:30:00/36\tTualcom Elektronik A.S.\n70:B3:D5:4A:40:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:4A:50:00/36\tIntermind Inc.\n70:B3:D5:4A:60:00/36\tHzhy Technology\n70:B3:D5:4A:70:00/36\taelettronica group srl\n70:B3:D5:4A:80:00/36\tAcrodea, Inc.\n70:B3:D5:4A:90:00/36\tWarecube,Inc\n70:B3:D5:4A:A0:00/36\tTwoway Communications, Inc.\n70:B3:D5:4A:B0:00/36\tTruTeq Wireless (Pty) Ltd\n70:B3:D5:4A:C0:00/36\tMicrosoft Research\n70:B3:D5:4A:D0:00/36\tGaci\n70:B3:D5:4A:E0:00/36\tReinhardt System- und Messelectronic GmbH\n70:B3:D5:4A:F0:00/36\tAgramkow Fluid Systems A/S\n70:B3:D5:4B:00:00/36\tTecogen Inc.\n70:B3:D5:4B:10:00/36\tLace Llc.\n70:B3:D5:4B:20:00/36\tCertus Operations Ltd\n70:B3:D5:4B:30:00/36\tBacsoft\n70:B3:D5:4B:40:00/36\tHi Tech Systems Ltd\n70:B3:D5:4B:50:00/36\tToolplanet Co., Ltd.\n70:B3:D5:4B:60:00/36\tVeilux Inc.\n70:B3:D5:4B:70:00/36\tAplex Technology Inc.\n70:B3:D5:4B:80:00/36\tInternational Roll-Call Corporation\n70:B3:D5:4B:90:00/36\tShen Zhen Ttk Technology Co,Ltd\n70:B3:D5:4B:A0:00/36\tSinftech LLC\n70:B3:D5:4B:B0:00/36\tPlazma-T\n70:B3:D5:4B:C0:00/36\tTiama\n70:B3:D5:4B:D0:00/36\tBoulder Amplifiers, Inc.\n70:B3:D5:4B:E0:00/36\tGy-Fx Sas\n70:B3:D5:4B:F0:00/36\tExsom Computers LLC\n70:B3:D5:4C:00:00/36\tTechnica Engineering GmbH\n70:B3:D5:4C:10:00/36\tQuercus Technologies, S. L.\n70:B3:D5:4C:20:00/36\thera Laborsysteme GmbH\n70:B3:D5:4C:30:00/36\tEA Elektroautomatik GmbH & Co. KG\n70:B3:D5:4C:40:00/36\tOOO Research and Production Center \"Computer Technologies\"\n70:B3:D5:4C:50:00/36\tMoving iMage Technologies LLC\n70:B3:D5:4C:60:00/36\tBlueBox Video Limited\n70:B3:D5:4C:70:00/36\tSOLVERIS sp. z o.o.\n70:B3:D5:4C:80:00/36\tHosokawa Micron Powder Systems\n70:B3:D5:4C:90:00/36\tElsist Srl\n70:B3:D5:4C:A0:00/36\tPCB Piezotronics\n70:B3:D5:4C:B0:00/36\tCucos Retail Systems GmbH\n70:B3:D5:4C:C0:00/36\tFresenius Medical Care\n70:B3:D5:4C:D0:00/36\tPower Electronics Espana, S.L.\n70:B3:D5:4C:E0:00/36\tAgilack\n70:B3:D5:4C:F0:00/36\tGreen House Co., Ltd.\n70:B3:D5:4D:00:00/36\tCodewerk GmbH\n70:B3:D5:4D:10:00/36\tContraves Advanced Devices Sdn. Bhd.\n70:B3:D5:4D:20:00/36\tBiotage Sweden AB\n70:B3:D5:4D:30:00/36\tHefei STAROT Technology Co.,Ltd\n70:B3:D5:4D:40:00/36\tNortek Global HVAC\n70:B3:D5:4D:50:00/36\tMoog Rekofa  GmbH\n70:B3:D5:4D:60:00/36\tOperational Technology Solutions\n70:B3:D5:4D:70:00/36\tTechnological Ray GmbH\n70:B3:D5:4D:80:00/36\tVersilis Inc.\n70:B3:D5:4D:90:00/36\tCoda Octopus Products Limited\n70:B3:D5:4D:A0:00/36\tRADA Electronics Industries Ltd.\n70:B3:D5:4D:B0:00/36\tTemperature@lert\n70:B3:D5:4D:C0:00/36\tJk Device Corporation\n70:B3:D5:4D:D0:00/36\tVelvac Incorporated\n70:B3:D5:4D:E0:00/36\tOso Technologies, Inc.\n70:B3:D5:4D:F0:00/36\tNidec Avtron Automation Corp\n70:B3:D5:4E:00:00/36\tMicrovideo\n70:B3:D5:4E:10:00/36\tGrupo Epelsa S.L.\n70:B3:D5:4E:20:00/36\tTransit Solutions, LLC.\n70:B3:D5:4E:30:00/36\tadnexo GmbH\n70:B3:D5:4E:40:00/36\tW.A. Benjamin Electric Co.\n70:B3:D5:4E:50:00/36\tviZaar industrial imaging AG\n70:B3:D5:4E:60:00/36\tSanta Barbara Imaging Systems\n70:B3:D5:4E:70:00/36\tDigital Domain\n70:B3:D5:4E:80:00/36\tCopious Imaging LLC\n70:B3:D5:4E:90:00/36\tAdetec Sas\n70:B3:D5:4E:A0:00/36\tVocality international T/A Cubic\n70:B3:D5:4E:B0:00/36\tInfosoft Digital Design & Services Private Limited\n70:B3:D5:4E:C0:00/36\tHangzhou Youshi Industry Co., Ltd.\n70:B3:D5:4E:D0:00/36\tPanoramic Power\n70:B3:D5:4E:E0:00/36\tNOA Co., Ltd.\n70:B3:D5:4E:F0:00/36\tCMI, Inc.\n70:B3:D5:4F:00:00/36\tLi Seng Technology Ltd.,\n70:B3:D5:4F:10:00/36\tLG Electronics\n70:B3:D5:4F:20:00/36\tCompal Electronics, Inc.\n70:B3:D5:4F:30:00/36\tXps Eletronica Ltda\n70:B3:D5:4F:40:00/36\tWiTagg, Inc\n70:B3:D5:4F:50:00/36\tOrlaco Products B.V.\n70:B3:D5:4F:60:00/36\tDorlet Sau\n70:B3:D5:4F:70:00/36\tFoxtel srl\n70:B3:D5:4F:80:00/36\tSicpa Sa - Gss\n70:B3:D5:4F:90:00/36\tOptoPrecision GmbH\n70:B3:D5:4F:A0:00/36\tThruvision Limited\n70:B3:D5:4F:B0:00/36\tMAS Elettronica sas di Mascetti Sandro e C.\n70:B3:D5:4F:C0:00/36\tMettler Toledo\n70:B3:D5:4F:D0:00/36\tEnless Wireless\n70:B3:D5:4F:E0:00/36\tWiTagg, Inc\n70:B3:D5:4F:F0:00/36\tShanghai AiGentoo Information Technology Co.,Ltd.\n70:B3:D5:50:00:00/36\tMistral Solutions Pvt. LTD\n70:B3:D5:50:10:00/36\tPeek Traffic\n70:B3:D5:50:20:00/36\tGlidewell Laboratories\n70:B3:D5:50:30:00/36\tItest communication Tech Co., LTD\n70:B3:D5:50:40:00/36\tXsight Systems Ltd.\n70:B3:D5:50:50:00/36\tMC2-Technologies\n70:B3:D5:50:60:00/36\tTonbo Imaging Pte Ltd\n70:B3:D5:50:70:00/36\tHuman Oriented Technology, Inc.\n70:B3:D5:50:80:00/36\tINSEVIS GmbH\n70:B3:D5:50:90:00/36\tTinkerforge GmbH\n70:B3:D5:50:A0:00/36\tAMEDTEC Medizintechnik Aue GmbH\n70:B3:D5:50:B0:00/36\tNordson Corporation\n70:B3:D5:50:C0:00/36\tHangzhou landesker digital technology co. LTD\n70:B3:D5:50:D0:00/36\tCT Company\n70:B3:D5:50:E0:00/36\tMicro Trend Automation Co., LTD\n70:B3:D5:50:F0:00/36\tLLC Sarov Innovative Technologies (WIZOLUTION)\n70:B3:D5:51:00:00/36\tPsl Elektroni̇k Sanayi̇ Ve Ti̇caret A.S.\n70:B3:D5:51:10:00/36\tNext Sight srl\n70:B3:D5:51:20:00/36\tTechno Broad,Inc\n70:B3:D5:51:30:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:51:40:00/36\tIntelligent Security Systems (ISS)\n70:B3:D5:51:50:00/36\tPcsc\n70:B3:D5:51:60:00/36\tLineage Power Pvt Ltd.,\n70:B3:D5:51:70:00/36\tIspher\n70:B3:D5:51:80:00/36\tCRUXELL Corp.\n70:B3:D5:51:90:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:51:A0:00/36\tShachihata Inc.\n70:B3:D5:51:B0:00/36\tVitrea Smart Home Technologies\n70:B3:D5:51:C0:00/36\tATX Networks Corp\n70:B3:D5:51:D0:00/36\tTecnint HTE SRL\n70:B3:D5:51:E0:00/36\tFundación Cardiovascular de Colombia\n70:B3:D5:51:F0:00/36\tValeo Cda\n70:B3:D5:52:00:00/36\tpromedias AG\n70:B3:D5:52:10:00/36\tSelex ES Inc.\n70:B3:D5:52:20:00/36\tSyncopated Engineering Inc\n70:B3:D5:52:30:00/36\tTibit Communications\n70:B3:D5:52:40:00/36\tWuxi New Optical Communication Co.,Ltd.\n70:B3:D5:52:50:00/36\tPlantiga Technologies Inc\n70:B3:D5:52:60:00/36\tFlowNet LLC\n70:B3:D5:52:70:00/36\tProcon Electronics Pty Ltd\n70:B3:D5:52:80:00/36\tAplex Technology Inc.\n70:B3:D5:52:90:00/36\tInventeq B.V.\n70:B3:D5:52:A0:00/36\tDataflex International BV\n70:B3:D5:52:B0:00/36\tGE Aviation Cheltenham\n70:B3:D5:52:C0:00/36\tCenturyarks Ltd.,\n70:B3:D5:52:D0:00/36\tTanaka Electric Industry Co., Ltd.\n70:B3:D5:52:E0:00/36\tSwissponic Sagl\n70:B3:D5:52:F0:00/36\tR.C. Systems Inc\n70:B3:D5:53:00:00/36\tiSiS-Ex Limited\n70:B3:D5:53:10:00/36\tAteme\n70:B3:D5:53:20:00/36\tTalleres de Escoriaza SA\n70:B3:D5:53:30:00/36\tNippon Marine Enterprises, Ltd.\n70:B3:D5:53:40:00/36\tWeihai Weigao Medical Imaging Technology Co., Ltd\n70:B3:D5:53:50:00/36\tSITA Messtechnik GmbH\n70:B3:D5:53:60:00/36\tLarimart Spa\n70:B3:D5:53:70:00/36\tBiennebi s.r.l.\n70:B3:D5:53:80:00/36\tsydetion UG (h.b.)\n70:B3:D5:53:90:00/36\tTempris GmbH\n70:B3:D5:53:A0:00/36\tPanoramic Power\n70:B3:D5:53:B0:00/36\tMr.Loop\n70:B3:D5:53:C0:00/36\tAirthings\n70:B3:D5:53:D0:00/36\tAccel Corp\n70:B3:D5:53:E0:00/36\tAsiga Pty Ltd\n70:B3:D5:53:F0:00/36\tAbbott Diagnostics Technologies AS\n70:B3:D5:54:00:00/36\tKMtronic ltd\n70:B3:D5:54:10:00/36\tNanjing Pingguang Electronic Technology Co., Ltd\n70:B3:D5:54:20:00/36\tRTDS Technologies Inc.\n70:B3:D5:54:30:00/36\twallbe GmbH\n70:B3:D5:54:40:00/36\tSilicon Safe Ltd\n70:B3:D5:54:50:00/36\tAirity Technologies Inc.\n70:B3:D5:54:60:00/36\tSensefarm AB\n70:B3:D5:54:70:00/36\tCe Link Limited\n70:B3:D5:54:80:00/36\tDigiverv Inc\n70:B3:D5:54:90:00/36\tProcon automatic systems GmbH\n70:B3:D5:54:A0:00/36\tDigital Instrument Transformers\n70:B3:D5:54:B0:00/36\tBrakels IT\n70:B3:D5:54:C0:00/36\tHusty M.Styczen J.Hupert Sp.J.\n70:B3:D5:54:D0:00/36\tQingdao Haitian Weiye Automation Control System Co., Ltd\n70:B3:D5:54:E0:00/36\tRFL Electronics, Inc.\n70:B3:D5:54:F0:00/36\tAssembly Contracts Limited\n70:B3:D5:55:00:00/36\tMerten GmbH&CoKG\n70:B3:D5:55:10:00/36\tinfrachip\n70:B3:D5:55:20:00/36\tALTIT.CO.,Ltd.\n70:B3:D5:55:30:00/36\tTAALEX Systemtechnik GmbH\n70:B3:D5:55:40:00/36\tTeletypes Manufacturing Plant\n70:B3:D5:55:50:00/36\tSoftLab-NSK\n70:B3:D5:55:60:00/36\tOhashi Engineering Co.,Ltd.\n70:B3:D5:55:70:00/36\tHeitec Ag\n70:B3:D5:55:80:00/36\tMultiple Access Communications Ltd\n70:B3:D5:55:90:00/36\tEagle Mountain Technology\n70:B3:D5:55:A0:00/36\tSontay Ltd.\n70:B3:D5:55:B0:00/36\tProcon Electronics Pty Ltd\n70:B3:D5:55:C0:00/36\tSaratoga Speed, Inc.\n70:B3:D5:55:D0:00/36\tLunaNexus Inc\n70:B3:D5:55:E0:00/36\tBRS Sistemas Eletrônicos\n70:B3:D5:55:F0:00/36\tDeep BV\n70:B3:D5:56:00:00/36\tDaiShin Information & Communications Co., Ltd\n70:B3:D5:56:10:00/36\tLiberator Pty Ltd\n70:B3:D5:56:20:00/36\tJD Squared, Inc.\n70:B3:D5:56:30:00/36\tZhejiang Hao Teng Electronic Technology Co., Ltd.\n70:B3:D5:56:40:00/36\tchristmann informationstechnik + medien GmbH & Co. KG\n70:B3:D5:56:50:00/36\tClecell\n70:B3:D5:56:60:00/36\tData Informs LLC\n70:B3:D5:56:70:00/36\tDogWatch Inc\n70:B3:D5:56:80:00/36\tSmall Data Garden Oy\n70:B3:D5:56:90:00/36\tNuance Hearing Ltd.\n70:B3:D5:56:A0:00/36\tHarvard Technology Ltd\n70:B3:D5:56:B0:00/36\tS.E.I. Co.,Ltd.\n70:B3:D5:56:C0:00/36\tTelensa Ltd\n70:B3:D5:56:D0:00/36\tPro-Digital Projetos Eletronicos Ltda\n70:B3:D5:56:E0:00/36\tPower Electronics Espana, S.L.\n70:B3:D5:56:F0:00/36\tRadikal d.o.o.\n70:B3:D5:57:00:00/36\tBayern Engineering GmbH & Co. KG\n70:B3:D5:57:10:00/36\tEchogear\n70:B3:D5:57:20:00/36\tCrde\n70:B3:D5:57:30:00/36\tGega Electronique\n70:B3:D5:57:40:00/36\tCloud Intelligence Pty Ltd\n70:B3:D5:57:50:00/36\tKonrad GmbH\n70:B3:D5:57:60:00/36\tShandong Hospot IOT Technology Co.,Ltd.\n70:B3:D5:57:70:00/36\tDsilog\n70:B3:D5:57:80:00/36\tImage Tech Co.,Ltd\n70:B3:D5:57:90:00/36\tChelsea Technologies Group Ltd\n70:B3:D5:57:A0:00/36\tRhythm Engineering, LLC.\n70:B3:D5:57:B0:00/36\tELAMAKATO GmbH\n70:B3:D5:57:C0:00/36\tAutomata GmbH & Co. KG\n70:B3:D5:57:D0:00/36\tWICOM1 GmbH\n70:B3:D5:57:E0:00/36\tAscon Tecnologic S.r.l.\n70:B3:D5:57:F0:00/36\tMBio Diagnostics, Inc.\n70:B3:D5:58:00:00/36\tPrivate\n70:B3:D5:58:10:00/36\tThermokon Sensortechnik GmbH\n70:B3:D5:58:20:00/36\tVAGLER International Sdn Bhd\n70:B3:D5:58:30:00/36\tDucommun Inc.\n70:B3:D5:58:40:00/36\tSertone, a division of Opti-Knights Ltd\n70:B3:D5:58:50:00/36\tNefteavtomatika\n70:B3:D5:58:60:00/36\tAliter Technologies\n70:B3:D5:58:70:00/36\tINCAA Computers\n70:B3:D5:58:80:00/36\tLLC NPO Svyazkomplektservis\n70:B3:D5:58:90:00/36\tCityntel OU\n70:B3:D5:58:A0:00/36\tITK Dr. Kassen GmbH\n70:B3:D5:58:B0:00/36\tWilliams Sound LLC\n70:B3:D5:58:C0:00/36\tOptsys\n70:B3:D5:58:D0:00/36\tDorlet Sau\n70:B3:D5:58:E0:00/36\tVeilux Inc.\n70:B3:D5:58:F0:00/36\tLSL systems\n70:B3:D5:59:00:00/36\t812th AITS\n70:B3:D5:59:10:00/36\tMedicomp, Inc\n70:B3:D5:59:20:00/36\tCrde\n70:B3:D5:59:30:00/36\tAsis Pro\n70:B3:D5:59:40:00/36\tATE Systems Inc\n70:B3:D5:59:50:00/36\tPLR Prueftechnik Linke und Ruehe GmbH\n70:B3:D5:59:60:00/36\tMencom Corporation\n70:B3:D5:59:70:00/36\tVape Rail International\n70:B3:D5:59:80:00/36\tRuag Defence France SAS\n70:B3:D5:59:90:00/36\tLECO Corporation\n70:B3:D5:59:A0:00/36\tWagner Group GmbH\n70:B3:D5:59:B0:00/36\tAutomatizacion Y Conectividad Sa De Cv\n70:B3:D5:59:C0:00/36\tDave Srl\n70:B3:D5:59:D0:00/36\tservicios de consultoria independiente S.L.\n70:B3:D5:59:E0:00/36\ti2-electronics\n70:B3:D5:59:F0:00/36\tMegger Germany GmbH\n70:B3:D5:5A:00:00/36\tAscon Tecnologic S.r.l.\n70:B3:D5:5A:10:00/36\tBOE Technology Group Co., Ltd.\n70:B3:D5:5A:20:00/36\tWallner Automation GmbH\n70:B3:D5:5A:30:00/36\tCT Company\n70:B3:D5:5A:40:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:5A:50:00/36\tRehwork GmbH\n70:B3:D5:5A:60:00/36\tTimeMachines Inc.\n70:B3:D5:5A:70:00/36\tABB S.p.A.\n70:B3:D5:5A:80:00/36\tFarmobile, LLC\n70:B3:D5:5A:90:00/36\tBunka Shutter Co., Ltd.\n70:B3:D5:5A:A0:00/36\tChugoku Electric Manufacturing Co.,Inc\n70:B3:D5:5A:B0:00/36\tSea Air and Land Communications Ltd\n70:B3:D5:5A:C0:00/36\tLM-Instruments Oy\n70:B3:D5:5A:D0:00/36\tProfotech\n70:B3:D5:5A:E0:00/36\tTinTec Co., Ltd.\n70:B3:D5:5A:F0:00/36\tJENG IoT BV\n70:B3:D5:5B:00:00/36\tQxperts Italia S.r.l.\n70:B3:D5:5B:10:00/36\tEPD Electronics\n70:B3:D5:5B:20:00/36\tPeter Huber Kaeltemaschinenbau SE\n70:B3:D5:5B:30:00/36\tSTENTORIUS by ADI\n70:B3:D5:5B:40:00/36\tSystems Technologies\n70:B3:D5:5B:50:00/36\tLehigh Electric Products Co\n70:B3:D5:5B:60:00/36\tEthical Lighting and Sensor Solutions Limited\n70:B3:D5:5B:70:00/36\ton-systems limited\n70:B3:D5:5B:80:00/36\tHella Gutmann Solutions GmbH\n70:B3:D5:5B:90:00/36\tEizo Rugged Solutions\n70:B3:D5:5B:A0:00/36\tInfrasafe/ Advantor Systems\n70:B3:D5:5B:B0:00/36\tOlympus NDT Canada\n70:B3:D5:5B:C0:00/36\tLAMTEC Mess- und Regeltechnik für Feuerungen GmbH & Co. KG\n70:B3:D5:5B:D0:00/36\tnexgenwave\n70:B3:D5:5B:E0:00/36\tCaswa\n70:B3:D5:5B:F0:00/36\tAton srl\n70:B3:D5:5C:00:00/36\tShenzhen Lianfaxun Electronic Technology Co., Ltd\n70:B3:D5:5C:10:00/36\tShanghai JaWay Information Technology Co., Ltd.\n70:B3:D5:5C:20:00/36\tSono-Tek Corporation\n70:B3:D5:5C:30:00/36\tDIC Corporation\n70:B3:D5:5C:40:00/36\tTattile Srl\n70:B3:D5:5C:50:00/36\tHaag-Streit AG\n70:B3:D5:5C:60:00/36\tC4I Systems Ltd\n70:B3:D5:5C:70:00/36\tQSnet Visual Technologies Ltd\n70:B3:D5:5C:80:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:5C:90:00/36\tICTK Holdings\n70:B3:D5:5C:A0:00/36\tACD Elekronik GmbH\n70:B3:D5:5C:B0:00/36\tECoCoMS Ltd.\n70:B3:D5:5C:C0:00/36\tAKSE srl\n70:B3:D5:5C:D0:00/36\tMVT Video Technologies R + H Maedler GbR\n70:B3:D5:5C:E0:00/36\tIP Devices\n70:B3:D5:5C:F0:00/36\tPROEL TSI s.r.l.\n70:B3:D5:5D:00:00/36\tInterTalk Critical Information Systems\n70:B3:D5:5D:10:00/36\tSoftware Motor Corp\n70:B3:D5:5D:20:00/36\tContec Americas Inc.\n70:B3:D5:5D:30:00/36\tSupracon AG\n70:B3:D5:5D:40:00/36\tRch Italia Spa\n70:B3:D5:5D:50:00/36\tCT Company\n70:B3:D5:5D:60:00/36\tBMT Messtechnik Gmbh\n70:B3:D5:5D:70:00/36\tClockwork Dog\n70:B3:D5:5D:80:00/36\tLYNX Technik AG\n70:B3:D5:5D:90:00/36\tEvident Scientific, Inc.\n70:B3:D5:5D:A0:00/36\tValk Welding B.V.\n70:B3:D5:5D:B0:00/36\tMovicom LLC\n70:B3:D5:5D:C0:00/36\tFactoryLab B.V.\n70:B3:D5:5D:D0:00/36\tTheatrixx Technologies, Inc.\n70:B3:D5:5D:E0:00/36\tHangzhou AwareTec Technology Co., Ltd\n70:B3:D5:5D:F0:00/36\tSemacon Business Machines\n70:B3:D5:5E:00:00/36\tHexagon Metrology SAS\n70:B3:D5:5E:10:00/36\tArevita\n70:B3:D5:5E:20:00/36\tGrossenbacher Systeme AG\n70:B3:D5:5E:30:00/36\tImecon Engineering SrL\n70:B3:D5:5E:40:00/36\tDsp Design\n70:B3:D5:5E:50:00/36\tHaiyang Olix Co.,Ltd.\n70:B3:D5:5E:60:00/36\tMechatronics Systems Private Limited\n70:B3:D5:5E:70:00/36\tHeroic Technologies Inc.\n70:B3:D5:5E:80:00/36\tVitec\n70:B3:D5:5E:90:00/36\tZehetner-Elektronik GmbH\n70:B3:D5:5E:A0:00/36\tKys,Inc\n70:B3:D5:5E:B0:00/36\tLoma Systems s.r.o.\n70:B3:D5:5E:C0:00/36\tCreative Electronics Ltd\n70:B3:D5:5E:D0:00/36\tEA Elektroautomatik GmbH & Co. KG\n70:B3:D5:5E:E0:00/36\tMikrotron Mikrocomputer, Digital- und Analogtechnik GmbH\n70:B3:D5:5E:F0:00/36\tStar Systems International Limited\n70:B3:D5:5F:00:00/36\tmanagee GmbH & Co KG\n70:B3:D5:5F:10:00/36\tFater Rasa Noor\n70:B3:D5:5F:20:00/36\tInvisible Systems Limited\n70:B3:D5:5F:30:00/36\tRtone\n70:B3:D5:5F:40:00/36\tFDSTiming\n70:B3:D5:5F:50:00/36\tMicrovision\n70:B3:D5:5F:60:00/36\tFreeFlight Systems\n70:B3:D5:5F:70:00/36\tJFA Electronics Industry and Commerce EIRELI\n70:B3:D5:5F:80:00/36\tForcite Helmet Systems Pty Ltd\n70:B3:D5:5F:90:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:5F:A0:00/36\tTex Computer Srl\n70:B3:D5:5F:B0:00/36\tTeleplatforms\n70:B3:D5:5F:C0:00/36\tSurtec\n70:B3:D5:5F:D0:00/36\tWindar Photonics\n70:B3:D5:5F:E0:00/36\tGrossenbacher Systeme AG\n70:B3:D5:5F:F0:00/36\tVaisala Oyj\n70:B3:D5:60:00:00/36\tStellwerk GmbH\n70:B3:D5:60:10:00/36\tTricom Research Inc.\n70:B3:D5:60:20:00/36\tQuantum Opus, LLC\n70:B3:D5:60:30:00/36\tEgistech Co.,Ltd.\n70:B3:D5:60:40:00/36\tFoxtrot Research Corp\n70:B3:D5:60:50:00/36\tAplex Technology Inc.\n70:B3:D5:60:60:00/36\tOOO Research and Production Center \"Computer Technologies\"\n70:B3:D5:60:70:00/36\tAteme\n70:B3:D5:60:80:00/36\tEiit Sa\n70:B3:D5:60:90:00/36\tPBSI Group Limited\n70:B3:D5:60:A0:00/36\tTata Power Sed\n70:B3:D5:60:B0:00/36\tEdgeware AB\n70:B3:D5:60:C0:00/36\tIST ElektronikgesmbH\n70:B3:D5:60:D0:00/36\tLink Electric & Safety Control Co.\n70:B3:D5:60:E0:00/36\tHdanywhere\n70:B3:D5:60:F0:00/36\tTanaka Information System, LLC.\n70:B3:D5:61:00:00/36\tPolvision\n70:B3:D5:61:10:00/36\tAvionica\n70:B3:D5:61:20:00/36\tEdge Power Solutions\n70:B3:D5:61:30:00/36\tSuprock Technologies\n70:B3:D5:61:40:00/36\tQualitteq Llc\n70:B3:D5:61:50:00/36\tJsc \"Otzvuk\"\n70:B3:D5:61:60:00/36\tAxxess Identification Ltd\n70:B3:D5:61:70:00/36\tCominfo, Inc.\n70:B3:D5:61:80:00/36\tMotec Pty Ltd\n70:B3:D5:61:90:00/36\tZao Zeo\n70:B3:D5:61:A0:00/36\tRocket Lab Ltd.\n70:B3:D5:61:B0:00/36\tNubewell Networks Pvt Ltd\n70:B3:D5:61:C0:00/36\tEarth Works\n70:B3:D5:61:D0:00/36\tTelonic Berkeley Inc\n70:B3:D5:61:E0:00/36\tPKE Electronics AG\n70:B3:D5:61:F0:00/36\tLabotect Labor-Technik-Göttingen GmbH\n70:B3:D5:62:00:00/36\tOrlaco Products B.V.\n70:B3:D5:62:10:00/36\tSertec Srl\n70:B3:D5:62:20:00/36\tPCS Inc.\n70:B3:D5:62:30:00/36\tBeijing HuaLian Technology Co, Ltd.\n70:B3:D5:62:40:00/36\tEBE Mobility & Green Energy GmbH\n70:B3:D5:62:50:00/36\tVX Instruments GmbH\n70:B3:D5:62:60:00/36\tKronotech Srl\n70:B3:D5:62:70:00/36\tEarTex\n70:B3:D5:62:80:00/36\tMect Srl\n70:B3:D5:62:90:00/36\tOzray\n70:B3:D5:62:A0:00/36\tDoga\n70:B3:D5:62:B0:00/36\tSilicann Systems GmbH\n70:B3:D5:62:C0:00/36\tOOO \"NTC Rotek\"\n70:B3:D5:62:D0:00/36\telements\n70:B3:D5:62:E0:00/36\tLineage Power Pvt Ltd.,\n70:B3:D5:62:F0:00/36\tBARCO, s.r.o.\n70:B3:D5:63:00:00/36\tLge\n70:B3:D5:63:10:00/36\tSenso2Me\n70:B3:D5:63:20:00/36\tPower Electronics Espana, S.L.\n70:B3:D5:63:30:00/36\tObserver Foundation\n70:B3:D5:63:40:00/36\tidaqs Co.,Ltd.\n70:B3:D5:63:50:00/36\tCosylab d.d.\n70:B3:D5:63:60:00/36\tGlobalcom Engineering SPA\n70:B3:D5:63:70:00/36\tIneo-Sense\n70:B3:D5:63:80:00/36\tParkalot Denmark ApS\n70:B3:D5:63:90:00/36\tDorlet Sau\n70:B3:D5:63:A0:00/36\tDave Srl\n70:B3:D5:63:B0:00/36\tLazer Safe Pty Ltd\n70:B3:D5:63:C0:00/36\tPivothead\n70:B3:D5:63:D0:00/36\tTopic Embedded Products B.V.\n70:B3:D5:63:E0:00/36\tRiken Optech Corporation\n70:B3:D5:63:F0:00/36\tDARBS Inc.\n70:B3:D5:64:00:00/36\tElectronic Equipment Company Pvt. Ltd.\n70:B3:D5:64:10:00/36\tBurk Technology\n70:B3:D5:64:20:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:64:30:00/36\tMarques,S.A.\n70:B3:D5:64:40:00/36\tATX Networks Corp\n70:B3:D5:64:50:00/36\tProject Decibel, Inc.\n70:B3:D5:64:60:00/36\tXirgo Technologies LLC\n70:B3:D5:64:70:00/36\tKzta\n70:B3:D5:64:80:00/36\tMagnamed Tecnologia Medica S/A\n70:B3:D5:64:90:00/36\tswissled technologies AG\n70:B3:D5:64:A0:00/36\tNetbric Technology Co.,Ltd.\n70:B3:D5:64:B0:00/36\tKalfire\n70:B3:D5:64:C0:00/36\tAcemis France\n70:B3:D5:64:D0:00/36\tSanmina Israel Medical Systems Ltd\n70:B3:D5:64:E0:00/36\tBigStuff3, Inc.\n70:B3:D5:64:F0:00/36\tGunma Electronics Co Ltd\n70:B3:D5:65:00:00/36\tGIFAS-ELECTRIC GmbH\n70:B3:D5:65:10:00/36\tRoxford\n70:B3:D5:65:20:00/36\tRobert Bosch, LLC\n70:B3:D5:65:30:00/36\tLuxar Tech, Inc.\n70:B3:D5:65:40:00/36\tEMAC, Inc.\n70:B3:D5:65:50:00/36\tAOT System GmbH\n70:B3:D5:65:60:00/36\tSonoSound ApS\n70:B3:D5:65:70:00/36\tID Quantique SA\n70:B3:D5:65:80:00/36\temperor brands\n70:B3:D5:65:90:00/36\tE2G srl\n70:B3:D5:65:A0:00/36\tAplex Technology Inc.\n70:B3:D5:65:B0:00/36\tRoush\n70:B3:D5:65:C0:00/36\tAplex Technology Inc.\n70:B3:D5:65:D0:00/36\tGega Electronique\n70:B3:D5:65:E0:00/36\tSeason Electronics Ltd\n70:B3:D5:65:F0:00/36\tAxnes AS\n70:B3:D5:66:00:00/36\tSmart Service Technologies CO., LTD\n70:B3:D5:66:10:00/36\tDesignA Electronics Limited\n70:B3:D5:66:20:00/36\tIcon Industrial Engineering\n70:B3:D5:66:30:00/36\tIntrinsic Group Limited\n70:B3:D5:66:40:00/36\tSankyo Intec co.,ltd\n70:B3:D5:66:50:00/36\tCertUsus GmbH\n70:B3:D5:66:60:00/36\tAplex Technology Inc.\n70:B3:D5:66:70:00/36\tCT Company\n70:B3:D5:66:80:00/36\tÖresundskraft AB\n70:B3:D5:66:90:00/36\tPanoramic Power\n70:B3:D5:66:A0:00/36\tNomadic\n70:B3:D5:66:B0:00/36\tInnitive B.V.\n70:B3:D5:66:C0:00/36\tKRISTECH Krzysztof Kajstura\n70:B3:D5:66:D0:00/36\tSanmina Israel\n70:B3:D5:66:E0:00/36\tSiame\n70:B3:D5:66:F0:00/36\tSimplified MFG\n70:B3:D5:67:00:00/36\tParticle sizing systems\n70:B3:D5:67:10:00/36\tSea Shell Corporation\n70:B3:D5:67:20:00/36\tKLEIBER Infrared GmbH\n70:B3:D5:67:30:00/36\tACD Elekronik GmbH\n70:B3:D5:67:40:00/36\tFortress Cyber Security\n70:B3:D5:67:50:00/36\talfamation spa\n70:B3:D5:67:60:00/36\tsamwooeleco\n70:B3:D5:67:70:00/36\tFraunhofer-Institut IIS\n70:B3:D5:67:80:00/36\tThe Dini Group, La Jolla inc.\n70:B3:D5:67:90:00/36\tEMAC, Inc.\n70:B3:D5:67:A0:00/36\tMicatu\n70:B3:D5:67:B0:00/36\tStesalit Systems Ltd\n70:B3:D5:67:C0:00/36\tBenchmark Electronics - Secure Technology\n70:B3:D5:67:D0:00/36\tAcrodea, Inc.\n70:B3:D5:67:E0:00/36\tSeason Electronics Ltd\n70:B3:D5:67:F0:00/36\tIAAN Co., Ltd\n70:B3:D5:68:00:00/36\tBASF Corporation\n70:B3:D5:68:10:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:68:20:00/36\tRosslare Enterprises Limited\n70:B3:D5:68:30:00/36\tDecyben\n70:B3:D5:68:40:00/36\tLECO Corporation\n70:B3:D5:68:50:00/36\tLDA Audiotech\n70:B3:D5:68:60:00/36\tAccess Protocol Pty Ltd\n70:B3:D5:68:70:00/36\tVolution Group UK\n70:B3:D5:68:80:00/36\tMG s.r.l.\n70:B3:D5:68:90:00/36\tPrisma Telecom Testing Srl\n70:B3:D5:68:A0:00/36\tAdvanced Telecommunications Research Institute International\n70:B3:D5:68:B0:00/36\tSadel S.p.A.\n70:B3:D5:68:C0:00/36\tNd Meter\n70:B3:D5:68:D0:00/36\t\"Meta-chrom\" Co. Ltd.\n70:B3:D5:68:E0:00/36\tCEA Technologies Pty Ltd\n70:B3:D5:68:F0:00/36\tPeek Traffic\n70:B3:D5:69:00:00/36\tSicon srl\n70:B3:D5:69:10:00/36\tPeek Traffic\n70:B3:D5:69:20:00/36\tHosin Industrial Limited\n70:B3:D5:69:30:00/36\tAltron, a.s.\n70:B3:D5:69:40:00/36\tMoviTHERM\n70:B3:D5:69:50:00/36\tTelevic Rail GmbH\n70:B3:D5:69:60:00/36\tOpen Grow\n70:B3:D5:69:70:00/36\tAlazar Technologies Inc.\n70:B3:D5:69:80:00/36\tZiehl-Abegg Se\n70:B3:D5:69:90:00/36\tFlextronics International Kft\n70:B3:D5:69:A0:00/36\tAltaneos\n70:B3:D5:69:B0:00/36\tHorizon.Inc\n70:B3:D5:69:C0:00/36\tKeepen\n70:B3:D5:69:D0:00/36\tJPEmbedded Mazan Filipek Sp. J.\n70:B3:D5:69:E0:00/36\tPTYPE Co., LTD.\n70:B3:D5:69:F0:00/36\tT+A elektroakustik GmbH & Co.KG\n70:B3:D5:6A:00:00/36\tActive Research Limited\n70:B3:D5:6A:10:00/36\tGlial Technology\n70:B3:D5:6A:20:00/36\tRoot Automation\n70:B3:D5:6A:30:00/36\tOutdoorLink\n70:B3:D5:6A:40:00/36\tAcrodea, Inc.\n70:B3:D5:6A:50:00/36\tAkenori PTE LTD\n70:B3:D5:6A:60:00/36\tWOW System\n70:B3:D5:6A:70:00/36\tPartilink Inc.\n70:B3:D5:6A:80:00/36\tVitsch Electronics\n70:B3:D5:6A:90:00/36\tOhmori Electric Industries Co.Ltd\n70:B3:D5:6A:A0:00/36\tIntermobility\n70:B3:D5:6A:B0:00/36\tArrow (China) Electronics Trading Co., Ltd.\n70:B3:D5:6A:C0:00/36\tKetronixs Sdn Bhd\n70:B3:D5:6A:D0:00/36\tConnit\n70:B3:D5:6A:E0:00/36\tHangzhou Weimu Technology Co,.Ltd.\n70:B3:D5:6A:F0:00/36\tSensorberg GmbH\n70:B3:D5:6B:00:00/36\tPTYPE Co., LTD.\n70:B3:D5:6B:10:00/36\tTTC TELEKOMUNIKACE, s.r.o.\n70:B3:D5:6B:20:00/36\tCrde\n70:B3:D5:6B:30:00/36\tDuraComm Corporation\n70:B3:D5:6B:40:00/36\tNudron IoT Solutions LLP\n70:B3:D5:6B:50:00/36\tArt Spa\n70:B3:D5:6B:60:00/36\tINRADIOS GmbH\n70:B3:D5:6B:70:00/36\tGrossenbacher Systeme AG\n70:B3:D5:6B:80:00/36\tBt9\n70:B3:D5:6B:90:00/36\tBecton Dickinson\n70:B3:D5:6B:A0:00/36\tIntegrotech sp. z o.o.\n70:B3:D5:6B:B0:00/36\tLuceo\n70:B3:D5:6B:C0:00/36\tEA Elektroautomatik GmbH & Co. KG\n70:B3:D5:6B:D0:00/36\tRch Spa\n70:B3:D5:6B:E0:00/36\tVantage Integrated Security Solutions Pvt Ltd\n70:B3:D5:6B:F0:00/36\tOtto Bihler Maschinenfabrik GmbH & Co. KG\n70:B3:D5:6C:00:00/36\tLLC \"NTZ \"Mekhanotronika\"\n70:B3:D5:6C:10:00/36\tR.A.I.T.88 Srl\n70:B3:D5:6C:20:00/36\tTex Computer Srl\n70:B3:D5:6C:30:00/36\tBeijing Zgh Security Research Institute Co., Ltd\n70:B3:D5:6C:40:00/36\tVeo Robotics, Inc.\n70:B3:D5:6C:50:00/36\tCJSC «Russian telecom equipment company» (CJSC RTEC)\n70:B3:D5:6C:60:00/36\tAbbott Diagnostics Technologies AS\n70:B3:D5:6C:70:00/36\tBecton Dickinson\n70:B3:D5:6C:80:00/36\tSicon srl\n70:B3:D5:6C:90:00/36\tRedstone Sunshine(Beijing)Technology Co.,Ltd.\n70:B3:D5:6C:A0:00/36\tLineage Power Pvt Ltd.,\n70:B3:D5:6C:B0:00/36\tNAJIN automation\n70:B3:D5:6C:C0:00/36\tArinax\n70:B3:D5:6C:D0:00/36\tNorthbound Networks Pty. Ltd.\n70:B3:D5:6C:E0:00/36\tEredi Giuseppe Mercuri SPA\n70:B3:D5:6C:F0:00/36\tPrivate\n70:B3:D5:6D:00:00/36\tCode Blue Corporation\n70:B3:D5:6D:10:00/36\tVisual Engineering Technologies Ltd\n70:B3:D5:6D:20:00/36\tAhrens & Birner Company GmbH\n70:B3:D5:6D:30:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:6D:40:00/36\tTelerob Gesellschaft für Fernhantierungs\n70:B3:D5:6D:50:00/36\tPotter Electric Signal Co. LLC\n70:B3:D5:6D:60:00/36\tKMtronic ltd\n70:B3:D5:6D:70:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:6D:80:00/36\tShanghai YuanAn Environmental Protection Technology Co.,Ltd\n70:B3:D5:6D:90:00/36\tVECTARE Inc\n70:B3:D5:6D:A0:00/36\tEnovative Networks, Inc.\n70:B3:D5:6D:B0:00/36\tTechimp - Altanova group Srl\n70:B3:D5:6D:C0:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:6D:D0:00/36\tAbbott Diagnostics Technologies AS\n70:B3:D5:6D:E0:00/36\tAmetek Solidstate Controls\n70:B3:D5:6D:F0:00/36\tMango DSP, Inc.\n70:B3:D5:6E:00:00/36\tAbb Spa - Dmpc\n70:B3:D5:6E:10:00/36\tShanghai Holystar Information Technology Co.,Ltd\n70:B3:D5:6E:20:00/36\tE-Controls\n70:B3:D5:6E:30:00/36\tShen Zhen Qls Electronic Technology Co.,Ltd.\n70:B3:D5:6E:40:00/36\tInstitute of Power Engineering, Gdansk Division\n70:B3:D5:6E:50:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:6E:60:00/36\tEleven Engineering Incorporated\n70:B3:D5:6E:70:00/36\tAml\n70:B3:D5:6E:80:00/36\tBlu Wireless Technology Ltd\n70:B3:D5:6E:90:00/36\tKrontech\n70:B3:D5:6E:A0:00/36\tEdgeware AB\n70:B3:D5:6E:B0:00/36\tQuantaflow\n70:B3:D5:6E:C0:00/36\tCrde\n70:B3:D5:6E:D0:00/36\tWiingtech International Co. LTD.\n70:B3:D5:6E:E0:00/36\tHankook Ctec Co,. Ltd.\n70:B3:D5:6E:F0:00/36\tBeringar\n70:B3:D5:6F:00:00/36\tiTelaSoft Pvt Ltd\n70:B3:D5:6F:10:00/36\tDiscover Battery\n70:B3:D5:6F:20:00/36\tP&C Micro's Pty Ltd\n70:B3:D5:6F:30:00/36\tiungo\n70:B3:D5:6F:40:00/36\tWDI Wise Device Inc.\n70:B3:D5:6F:50:00/36\tCominfo, Inc.\n70:B3:D5:6F:60:00/36\tAcco Brands Europe\n70:B3:D5:6F:70:00/36\tEgicon Srl\n70:B3:D5:6F:80:00/36\tSENSEON Corporation\n70:B3:D5:6F:90:00/36\tENVItech s.r.o.\n70:B3:D5:6F:A0:00/36\tDataforth Corporation\n70:B3:D5:6F:B0:00/36\tShachihata Inc.\n70:B3:D5:6F:C0:00/36\tMI Inc.\n70:B3:D5:6F:D0:00/36\tCore Akıllı Ev Sistemleri\n70:B3:D5:6F:E0:00/36\tNto Ire-Polus\n70:B3:D5:6F:F0:00/36\tAkeo Plus\n70:B3:D5:70:00:00/36\tUniversity Of Groningen\n70:B3:D5:70:10:00/36\tCOMPAR Computer GmbH\n70:B3:D5:70:20:00/36\tSensor Highway Ltd\n70:B3:D5:70:30:00/36\tStromIdee GmbH\n70:B3:D5:70:40:00/36\tMelecs EWS GmbH\n70:B3:D5:70:50:00/36\tDigital Matter Pty Ltd\n70:B3:D5:70:60:00/36\tSmith Meter, Inc.\n70:B3:D5:70:70:00/36\tKoco Motion US LLC\n70:B3:D5:70:80:00/36\tIBM Research GmbH\n70:B3:D5:70:90:00/36\tAml\n70:B3:D5:70:A0:00/36\tPullnet Technology, Sa De Cv Ssc1012302S73\n70:B3:D5:70:B0:00/36\tAlere Technologies AS\n70:B3:D5:70:C0:00/36\tPotter Electric Signal Co. LLC\n70:B3:D5:70:D0:00/36\tOmnisensing Photonics Llc\n70:B3:D5:70:E0:00/36\tWuhan Xingtuxinke ELectronic Co.,Ltd\n70:B3:D5:70:F0:00/36\tAlion Science & Technology\n70:B3:D5:71:00:00/36\tGuardian Controls International Ltd\n70:B3:D5:71:10:00/36\tX-Laser LLC\n70:B3:D5:71:20:00/36\tAPG Cash Drawer, LLC\n70:B3:D5:71:30:00/36\tColoet S.r.l.\n70:B3:D5:71:40:00/36\tAlturna Networks\n70:B3:D5:71:50:00/36\tRiot\n70:B3:D5:71:60:00/36\tLode BV\n70:B3:D5:71:70:00/36\tSecure Systems & Services\n70:B3:D5:71:80:00/36\tPeek Traffic\n70:B3:D5:71:90:00/36\t2M Technology\n70:B3:D5:71:A0:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:71:B0:00/36\telsys\n70:B3:D5:71:C0:00/36\tKonzept Informationssysteme GmbH\n70:B3:D5:71:D0:00/36\tConnido Limited\n70:B3:D5:71:E0:00/36\tMotec Pty Ltd\n70:B3:D5:71:F0:00/36\tGrayshift\n70:B3:D5:72:00:00/36\tJeio Tech\n70:B3:D5:72:10:00/36\tZoe Medical\n70:B3:D5:72:20:00/36\tUman\n70:B3:D5:72:30:00/36\tLG Electronics\n70:B3:D5:72:40:00/36\tQuan International Co., Ltd.\n70:B3:D5:72:50:00/36\tSwiss Timing LTD\n70:B3:D5:72:60:00/36\tAtgs\n70:B3:D5:72:70:00/36\tLP Technologies Inc.\n70:B3:D5:72:80:00/36\tBCD Audio\n70:B3:D5:72:90:00/36\tEMAC, Inc.\n70:B3:D5:72:A0:00/36\tMRC Systems GmbH\n70:B3:D5:72:B0:00/36\tMedipense Inc.\n70:B3:D5:72:C0:00/36\tNuRi&G Engineering co,.Ltd.\n70:B3:D5:72:D0:00/36\tKron Medidores\n70:B3:D5:72:E0:00/36\tMaharsystem\n70:B3:D5:72:F0:00/36\tAva Technologies\n70:B3:D5:73:00:00/36\tVideogenix\n70:B3:D5:73:10:00/36\tPhoniro Systems AB\n70:B3:D5:73:20:00/36\tTofwerk Ag\n70:B3:D5:73:30:00/36\tSA Instrumentation Limited\n70:B3:D5:73:40:00/36\tMansion Industry Co., Ltd.\n70:B3:D5:73:50:00/36\tSwiss Audio\n70:B3:D5:73:60:00/36\tJabil\n70:B3:D5:73:70:00/36\tSD Biosensor\n70:B3:D5:73:80:00/36\tGryphon Secure Inc\n70:B3:D5:73:90:00/36\tZigencorp, Inc\n70:B3:D5:73:A0:00/36\tDolby Laboratories, Inc.\n70:B3:D5:73:B0:00/36\tS-I-C\n70:B3:D5:73:C0:00/36\tCentro de Ingenieria y Desarrollo industrial\n70:B3:D5:73:D0:00/36\tNETWAYS GmbH\n70:B3:D5:73:E0:00/36\tTrident RFID Pty Ltd\n70:B3:D5:73:F0:00/36\tLLC Open Converged Networks\n70:B3:D5:74:00:00/36\tPrisma Telecom Testing Srl\n70:B3:D5:74:10:00/36\tHow-E\n70:B3:D5:74:20:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:74:30:00/36\tEA Elektroautomatik GmbH & Co. KG\n70:B3:D5:74:40:00/36\tPHYZHON Health Inc\n70:B3:D5:74:50:00/36\tTmsi Llc\n70:B3:D5:74:60:00/36\t\"Smart Systems\" LLC\n70:B3:D5:74:70:00/36\tEva Automation\n70:B3:D5:74:80:00/36\tKdt\n70:B3:D5:74:90:00/36\tGranite River Labs Inc\n70:B3:D5:74:A0:00/36\tMettler Toledo\n70:B3:D5:74:B0:00/36\tCode Blue Corporation\n70:B3:D5:74:C0:00/36\tKwant Controls BV\n70:B3:D5:74:D0:00/36\tSpeech Technology Center Limited\n70:B3:D5:74:E0:00/36\tPushCorp, Inc.\n70:B3:D5:74:F0:00/36\tUnited States Technologies Inc.\n70:B3:D5:75:00:00/36\tNeurio Technology Inc.\n70:B3:D5:75:10:00/36\tGnf\n70:B3:D5:75:20:00/36\tGuan Show Technologe Co., Ltd.\n70:B3:D5:75:30:00/36\tHCH. Kündig & CIE. AG\n70:B3:D5:75:40:00/36\tCosmoit.Co.Ltd\n70:B3:D5:75:50:00/36\tLandmarkTech Systems Technology Co.,Ltd.\n70:B3:D5:75:60:00/36\tTimeMachines Inc.\n70:B3:D5:75:70:00/36\tGabo\n70:B3:D5:75:80:00/36\tGrossenbacher Systeme AG\n70:B3:D5:75:90:00/36\tAml\n70:B3:D5:75:A0:00/36\tStandard Backhaul Communications\n70:B3:D5:75:B0:00/36\tNetool LLC\n70:B3:D5:75:C0:00/36\tUPM Technology, Inc\n70:B3:D5:75:D0:00/36\tNanjing Magewell Electronics Co., Ltd.\n70:B3:D5:75:E0:00/36\tCardinal Health\n70:B3:D5:75:F0:00/36\tVocality international T/A Cubic\n70:B3:D5:76:00:00/36\tQualitteq Llc\n70:B3:D5:76:10:00/36\tCritical Link LLC\n70:B3:D5:76:20:00/36\tTransformational Security, LLC\n70:B3:D5:76:30:00/36\tA Trap, USA\n70:B3:D5:76:40:00/36\tSCHMID electronic\n70:B3:D5:76:50:00/36\tLG Electronics\n70:B3:D5:76:60:00/36\tTirasoft Nederland\n70:B3:D5:76:70:00/36\tFranklin France\n70:B3:D5:76:80:00/36\tKazan Networks Corporation\n70:B3:D5:76:90:00/36\tBarber Creations LLC\n70:B3:D5:76:A0:00/36\tSwiftnet SOC Ltd\n70:B3:D5:76:B0:00/36\tEMPELOR GmbH\n70:B3:D5:76:C0:00/36\tAural Ltd\n70:B3:D5:76:D0:00/36\tTrimble\n70:B3:D5:76:E0:00/36\tGrupo Epelsa S.L.\n70:B3:D5:76:F0:00/36\tOti Ltd\n70:B3:D5:77:00:00/36\tStrega\n70:B3:D5:77:10:00/36\tApator Miitors ApS\n70:B3:D5:77:20:00/36\tenModus\n70:B3:D5:77:30:00/36\tRugged Science\n70:B3:D5:77:40:00/36\tMicram Instruments Ltd\n70:B3:D5:77:50:00/36\tSonel S.A.\n70:B3:D5:77:60:00/36\tPower Ltd.\n70:B3:D5:77:70:00/36\tQuercus Technologies, S.L.\n70:B3:D5:77:80:00/36\tLumacron Technology Ltd.\n70:B3:D5:77:90:00/36\tDr.Bridge Aquatech\n70:B3:D5:77:A0:00/36\tTecsag Innovation AG\n70:B3:D5:77:B0:00/36\tAeroVision Avionics, Inc.\n70:B3:D5:77:C0:00/36\tHUSTY M.Styczen J.Hupert Sp.J.\n70:B3:D5:77:D0:00/36\tAPG Cash Drawer, LLC\n70:B3:D5:77:E0:00/36\tBlue Marble Communications, Inc.\n70:B3:D5:77:F0:00/36\tMicrochip Technology Germany II GmbH&Co.KG\n70:B3:D5:78:00:00/36\tNidec Leroy-Somer\n70:B3:D5:78:10:00/36\tProject Service S.a.s.\n70:B3:D5:78:20:00/36\tthou&tech\n70:B3:D5:78:30:00/36\tCHIeru., CO., Ltd.\n70:B3:D5:78:40:00/36\tShenzhen bayue software co. LTD\n70:B3:D5:78:50:00/36\tDensity Inc.\n70:B3:D5:78:60:00/36\tRch Spa\n70:B3:D5:78:70:00/36\tDen Automation\n70:B3:D5:78:80:00/36\tSlan\n70:B3:D5:78:90:00/36\tSEMEX-EngCon GmbH\n70:B3:D5:78:A0:00/36\tHills Health Solutions\n70:B3:D5:78:B0:00/36\tJingtu Printing Systems Co., Ltd\n70:B3:D5:78:C0:00/36\tSurvalent Technology Corporation\n70:B3:D5:78:D0:00/36\tAVL DiTEST GmbH\n70:B3:D5:78:E0:00/36\teffectas GmbH\n70:B3:D5:78:F0:00/36\tSoFiHa\n70:B3:D5:79:00:00/36\tAVI Pty Ltd\n70:B3:D5:79:10:00/36\tRomteck Australia\n70:B3:D5:79:20:00/36\tImmolas\n70:B3:D5:79:30:00/36\tGastech Australia Pty Ltd\n70:B3:D5:79:40:00/36\tShadin Avionics\n70:B3:D5:79:50:00/36\tTIECHE Engineered Systems\n70:B3:D5:79:60:00/36\tGAMPT mbH\n70:B3:D5:79:70:00/36\tMitsubishi Electric India Pvt. Ltd.\n70:B3:D5:79:80:00/36\tTiama\n70:B3:D5:79:90:00/36\tVitec System Engineering Inc.\n70:B3:D5:79:A0:00/36\tInnerspec Technologies Inc.\n70:B3:D5:79:B0:00/36\tSoniclean Pty Ltd\n70:B3:D5:79:C0:00/36\tAdde\n70:B3:D5:79:D0:00/36\tEditech Co., Ltd\n70:B3:D5:79:E0:00/36\tCW2. Gmbh & Co. KG\n70:B3:D5:79:F0:00/36\tGreen Instruments A/S\n70:B3:D5:7A:00:00/36\tReactec Ltd\n70:B3:D5:7A:10:00/36\tExcelfore Corporation\n70:B3:D5:7A:20:00/36\tAlpha ESS Co., Ltd.\n70:B3:D5:7A:30:00/36\tImpulse Automation\n70:B3:D5:7A:40:00/36\tPotter Electric Signal Co. LLC\n70:B3:D5:7A:50:00/36\tTriton Electronics Ltd\n70:B3:D5:7A:60:00/36\tElectrolux\n70:B3:D5:7A:70:00/36\tSymbicon Ltd\n70:B3:D5:7A:80:00/36\tdieEntwickler Elektronik GmbH\n70:B3:D5:7A:90:00/36\tadidas AG\n70:B3:D5:7A:A0:00/36\tSadel S.p.A.\n70:B3:D5:7A:B0:00/36\tMicrogate Srl\n70:B3:D5:7A:C0:00/36\tVerity Studios AG\n70:B3:D5:7A:D0:00/36\tInsitu, Inc\n70:B3:D5:7A:E0:00/36\tExi Flow Measurement Ltd\n70:B3:D5:7A:F0:00/36\tHessware GmbH\n70:B3:D5:7B:00:00/36\tMedisafe International\n70:B3:D5:7B:10:00/36\tPanamera\n70:B3:D5:7B:20:00/36\tRail Power Systems GmbH\n70:B3:D5:7B:30:00/36\tBroadSoft Inc\n70:B3:D5:7B:40:00/36\tZumbach Electronic AG\n70:B3:D5:7B:50:00/36\tVOCAL Technologies Ltd.\n70:B3:D5:7B:60:00/36\tAmada Miyachi America Inc.\n70:B3:D5:7B:70:00/36\tLsb - La Salle Blanche\n70:B3:D5:7B:80:00/36\tSerEnergy A/S\n70:B3:D5:7B:90:00/36\tQIAGEN Instruments AG\n70:B3:D5:7B:A0:00/36\tDecentlab GmbH\n70:B3:D5:7B:B0:00/36\tAloxy\n70:B3:D5:7B:C0:00/36\tFIRST RF Corporation\n70:B3:D5:7B:D0:00/36\tTableConnect GmbH\n70:B3:D5:7B:E0:00/36\tPhytron GmbH\n70:B3:D5:7B:F0:00/36\tStone Three\n70:B3:D5:7C:00:00/36\tTorgovyy Dom  Tehnologiy Llc\n70:B3:D5:7C:10:00/36\tData Sciences International\n70:B3:D5:7C:20:00/36\tMorgan Schaffer\n70:B3:D5:7C:30:00/36\tFlexim Security Oy\n70:B3:D5:7C:40:00/36\tMect Srl\n70:B3:D5:7C:50:00/36\tProjects Unlimited Inc.\n70:B3:D5:7C:60:00/36\tUtrend Technology (Shanghai) Co., Ltd\n70:B3:D5:7C:70:00/36\tSicon srl\n70:B3:D5:7C:80:00/36\tCrde\n70:B3:D5:7C:90:00/36\tViridi Parente, Inc.\n70:B3:D5:7C:A0:00/36\tHunan Shengyun Photoelectric Technology Co., Ltd.\n70:B3:D5:7C:B0:00/36\tKeyW Corporation\n70:B3:D5:7C:C0:00/36\tMitsubishi Heavy Industries Thermal Systems, Ltd.\n70:B3:D5:7C:D0:00/36\tMolekuler Goruntuleme A.S.\n70:B3:D5:7C:E0:00/36\tAplex Technology Inc.\n70:B3:D5:7C:F0:00/36\tORCA Technologies, LLC\n70:B3:D5:7D:00:00/36\tCubitech\n70:B3:D5:7D:10:00/36\tSchneider Electric Motion USA\n70:B3:D5:7D:20:00/36\tSDK Kristall\n70:B3:D5:7D:30:00/36\tOledcomm\n70:B3:D5:7D:40:00/36\tComputechnic AG\n70:B3:D5:7D:50:00/36\tSICS Swedish ICT\n70:B3:D5:7D:60:00/36\tYukilab\n70:B3:D5:7D:70:00/36\tGedomo GmbH\n70:B3:D5:7D:80:00/36\tNuand LLC\n70:B3:D5:7D:90:00/36\tATOM GIKEN Co.,Ltd.\n70:B3:D5:7D:A0:00/36\tGrupo Epelsa S.L.\n70:B3:D5:7D:B0:00/36\taquila biolabs GmbH\n70:B3:D5:7D:C0:00/36\tSoftware Systems Plus\n70:B3:D5:7D:D0:00/36\tExcel Medical Electronics LLC\n70:B3:D5:7D:E0:00/36\tTelaeris, Inc.\n70:B3:D5:7D:F0:00/36\tRDT Ltd\n70:B3:D5:7E:00:00/36\tSanko-sha,inc.\n70:B3:D5:7E:10:00/36\tApplied Materials\n70:B3:D5:7E:20:00/36\tDepro Électronique inc\n70:B3:D5:7E:30:00/36\tRedLeaf Security\n70:B3:D5:7E:40:00/36\tC21 Systems Ltd\n70:B3:D5:7E:50:00/36\tMegaflex Oy\n70:B3:D5:7E:60:00/36\t11811347 CANADA Inc.\n70:B3:D5:7E:70:00/36\tAtessa, Inc.\n70:B3:D5:7E:80:00/36\tMannkind Corporation\n70:B3:D5:7E:90:00/36\tMecsel Oy\n70:B3:D5:7E:A0:00/36\tWaterkotte GmbH\n70:B3:D5:7E:B0:00/36\tXerox International Partners\n70:B3:D5:7E:C0:00/36\tCubic ITS, Inc. dba GRIDSMART Technologies\n70:B3:D5:7E:D0:00/36\tThe Things Network Foundation\n70:B3:D5:7E:E0:00/36\tAdveez\n70:B3:D5:7E:F0:00/36\tCravis Co., Limited\n70:B3:D5:7F:00:00/36\tYDK Technologies Co.,Ltd\n70:B3:D5:7F:10:00/36\tAeroVision Avionics, Inc.\n70:B3:D5:7F:20:00/36\tTci\n70:B3:D5:7F:30:00/36\tShenzhen Virtual Clusters Information Technology Co.,Ltd.\n70:B3:D5:7F:40:00/36\tKST technology\n70:B3:D5:7F:50:00/36\tIncusense\n70:B3:D5:7F:60:00/36\tIDZ Ltd\n70:B3:D5:7F:70:00/36\tJASCO Applied Sciences Canada Ltd\n70:B3:D5:7F:80:00/36\tSolvera Lynx d.d.\n70:B3:D5:7F:90:00/36\tCommunication Systems Solutions\n70:B3:D5:7F:A0:00/36\tmeoENERGY\n70:B3:D5:7F:B0:00/36\tdb Broadcast Products Ltd\n70:B3:D5:7F:C0:00/36\tSurion (Pty) Ltd\n70:B3:D5:7F:D0:00/36\tSYS TEC electronic GmbH\n70:B3:D5:7F:E0:00/36\tRch Italia Spa\n70:B3:D5:7F:F0:00/36\teumig industrie-TV GmbH.\n70:B3:D5:80:00:00/36\tHeadsafeIP PTY LTD\n70:B3:D5:80:10:00/36\tGlory Technology Service Inc.\n70:B3:D5:80:20:00/36\tQingdao CNR HITACH Railway Signal&communication co.,ltd\n70:B3:D5:80:30:00/36\tGrossenbacher Systeme AG\n70:B3:D5:80:40:00/36\tPMT Corporation\n70:B3:D5:80:50:00/36\tEurotronik Kranj d.o.o.\n70:B3:D5:80:60:00/36\tInternational Super Computer Co., Ltd.\n70:B3:D5:80:70:00/36\tCamsat Przemysław Gralak\n70:B3:D5:80:80:00/36\tBecton Dickinson\n70:B3:D5:80:90:00/36\tTecnint HTE SRL\n70:B3:D5:80:A0:00/36\tSensing Labs\n70:B3:D5:80:B0:00/36\tFischer Block, Inc.\n70:B3:D5:80:C0:00/36\tAlgra tec AG\n70:B3:D5:80:D0:00/36\tData Physics Corporation\n70:B3:D5:80:E0:00/36\tUtopi Ltd\n70:B3:D5:80:F0:00/36\tQuickware Eng & Des LLC\n70:B3:D5:81:00:00/36\tAdvice\n70:B3:D5:81:10:00/36\tCjsc «Interset»\n70:B3:D5:81:20:00/36\tTESCAN Brno, s.r.o.\n70:B3:D5:81:30:00/36\tWavemed srl\n70:B3:D5:81:40:00/36\tIngenieurbuero SOMTRONIK\n70:B3:D5:81:50:00/36\tWaco Giken Co.,  Ltd.\n70:B3:D5:81:60:00/36\tSmith Meter, Inc.\n70:B3:D5:81:70:00/36\tAplex Technology Inc.\n70:B3:D5:81:80:00/36\tCrde\n70:B3:D5:81:90:00/36\t«Intellect module» LLC\n70:B3:D5:81:A0:00/36\tJoehl & Koeferli AG\n70:B3:D5:81:B0:00/36\tbobz GmbH\n70:B3:D5:81:C0:00/36\tQIT Co., Ltd.\n70:B3:D5:81:D0:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:81:E0:00/36\tNovathings\n70:B3:D5:81:F0:00/36\tCAR-connect GmbH\n70:B3:D5:82:00:00/36\tBecker Nachrichtentechnik GmbH\n70:B3:D5:82:10:00/36\tHL2 group\n70:B3:D5:82:20:00/36\tAngora Networks\n70:B3:D5:82:30:00/36\tSP Controls\n70:B3:D5:82:40:00/36\tSongwoo Information & Technology Co., Ltd\n70:B3:D5:82:50:00/36\tTattile Srl\n70:B3:D5:82:60:00/36\tElbit Systems of America\n70:B3:D5:82:70:00/36\tMetromatics Pty Ltd\n70:B3:D5:82:80:00/36\tXacti Corporation\n70:B3:D5:82:90:00/36\tGuan Show Technologe Co., Ltd.\n70:B3:D5:82:A0:00/36\tC W F Hamilton & Co Ltd\n70:B3:D5:82:B0:00/36\tShangnuo company\n70:B3:D5:82:C0:00/36\tNELS Ltd.\n70:B3:D5:82:D0:00/36\tElektronik Art S.C.\n70:B3:D5:82:E0:00/36\tPlayAlive A/S\n70:B3:D5:82:F0:00/36\tSIANA Systems\n70:B3:D5:83:00:00/36\tNordson Corporation\n70:B3:D5:83:10:00/36\tArnouse Digital Devices Corp\n70:B3:D5:83:20:00/36\tPotter Electric Signal Co. LLC\n70:B3:D5:83:30:00/36\tAlpiq InTec Management AG\n70:B3:D5:83:40:00/36\tNCE Network Consulting Engineering srl\n70:B3:D5:83:50:00/36\tCommBox P/L\n70:B3:D5:83:60:00/36\tAuthenticdata\n70:B3:D5:83:70:00/36\tHiDes, Inc.\n70:B3:D5:83:80:00/36\tTofino\n70:B3:D5:83:90:00/36\tRockwell Collins Canada\n70:B3:D5:83:A0:00/36\tEmdep Centro Tecnologico Mexico\n70:B3:D5:83:B0:00/36\tTelefonix Incorporated\n70:B3:D5:83:C0:00/36\tSinoembed\n70:B3:D5:83:D0:00/36\tGentec\n70:B3:D5:83:E0:00/36\tThe Dini Group, La Jolla inc.\n70:B3:D5:83:F0:00/36\tLumine Lighting Solutions Oy\n70:B3:D5:84:00:00/36\txm\n70:B3:D5:84:10:00/36\tStanet Co.,Ltd\n70:B3:D5:84:20:00/36\tPLUTO Solution co.,ltd.\n70:B3:D5:84:30:00/36\tOOO Research and Production Center \"Computer Technologies\"\n70:B3:D5:84:40:00/36\tSANSFIL Technologies\n70:B3:D5:84:50:00/36\tHarborside Technology\n70:B3:D5:84:60:00/36\tNational Time & Signal Corp.\n70:B3:D5:84:70:00/36\tAi-Lynx\n70:B3:D5:84:80:00/36\tAldridge Electrical Industries\n70:B3:D5:84:90:00/36\tRF-Tuote Oy\n70:B3:D5:84:A0:00/36\tMOG Laboratories Pty Ltd\n70:B3:D5:84:B0:00/36\tQuestHouse, Inc.\n70:B3:D5:84:C0:00/36\tCoreKinect\n70:B3:D5:84:D0:00/36\tQuantum Design Inc.\n70:B3:D5:84:E0:00/36\tChromalox, Inc.\n70:B3:D5:84:F0:00/36\tMettler Toledo\n70:B3:D5:85:00:00/36\tReo Ag\n70:B3:D5:85:10:00/36\tExascend, Inc.\n70:B3:D5:85:20:00/36\tNetBoxSC, LLC\n70:B3:D5:85:30:00/36\tHgh Systemes Infrarouges\n70:B3:D5:85:40:00/36\tAdimec Advanced Image Systems\n70:B3:D5:85:50:00/36\tCrde\n70:B3:D5:85:60:00/36\tShanghai Westwell Information and Technology Company Ltd\n70:B3:D5:85:70:00/36\tRch Italia Spa\n70:B3:D5:85:80:00/36\tHubbell Power Systems\n70:B3:D5:85:90:00/36\tHan Chang\n70:B3:D5:85:A0:00/36\tBrushies\n70:B3:D5:85:B0:00/36\tTsubakimoto Chain Co.\n70:B3:D5:85:C0:00/36\tTabology\n70:B3:D5:85:D0:00/36\tAthreya Inc\n70:B3:D5:85:E0:00/36\tXLOGIC srl\n70:B3:D5:85:F0:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:86:00:00/36\tKBS Industrieelektronik GmbH\n70:B3:D5:86:10:00/36\tKST technology\n70:B3:D5:86:20:00/36\tTripleOre\n70:B3:D5:86:30:00/36\tShenzhen Wesion Technology Co., Ltd\n70:B3:D5:86:40:00/36\tBORMANN EDV und Zubehoer\n70:B3:D5:86:50:00/36\tInsitu, Inc.\n70:B3:D5:86:60:00/36\tMEPS Realtime\n70:B3:D5:86:70:00/36\tSpecialized Communications Corp.\n70:B3:D5:86:80:00/36\tU-JIN Mesco Co., Ltd.\n70:B3:D5:86:90:00/36\tchargeBIG\n70:B3:D5:86:A0:00/36\tStealth Communications\n70:B3:D5:86:B0:00/36\tAVL DiTEST\n70:B3:D5:86:C0:00/36\teeas gmbh\n70:B3:D5:86:D0:00/36\tCensus Digital Incorporated\n70:B3:D5:86:E0:00/36\tProfcon AB\n70:B3:D5:86:F0:00/36\tLlc \"Ntc Actor\"\n70:B3:D5:87:00:00/36\tbentrup Industriesteuerungen\n70:B3:D5:87:10:00/36\tOso Technologies\n70:B3:D5:87:20:00/36\tNippon Safety co,ltd\n70:B3:D5:87:30:00/36\tVishay Nobel AB\n70:B3:D5:87:40:00/36\tNorthbound Networks Pty. Ltd.\n70:B3:D5:87:50:00/36\tPeek Traffic\n70:B3:D5:87:60:00/36\tIonetech\n70:B3:D5:87:70:00/36\tPolynet Telecommunications Consulting and Contractor Ltd.\n70:B3:D5:87:80:00/36\tPackage Guard, Inc\n70:B3:D5:87:90:00/36\tZIGPOS GmbH\n70:B3:D5:87:A0:00/36\tAccolade Technology Inc\n70:B3:D5:87:B0:00/36\tLiquid Instruments Pty Ltd\n70:B3:D5:87:C0:00/36\tNautel LTD\n70:B3:D5:87:D0:00/36\tInvixium Access Inc.\n70:B3:D5:87:E0:00/36\tSeptentrio NV\n70:B3:D5:87:F0:00/36\tNAC Planning Co., Ltd.\n70:B3:D5:88:00:00/36\tSkopei B.V.\n70:B3:D5:88:10:00/36\tTattile Srl\n70:B3:D5:88:20:00/36\tSimon Tech, S.L.\n70:B3:D5:88:30:00/36\tContec Americas Inc.\n70:B3:D5:88:40:00/36\tLG Electronics\n70:B3:D5:88:50:00/36\tQuirkLogic\n70:B3:D5:88:60:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:88:70:00/36\tEntec Solar S.L.\n70:B3:D5:88:80:00/36\tZetechtics Ltd\n70:B3:D5:88:90:00/36\tInnovative Circuit Technology\n70:B3:D5:88:A0:00/36\tPerceptics, LLC\n70:B3:D5:88:B0:00/36\tWUHAN EASYLINKIN TECHNOLOGY co.,LTD\n70:B3:D5:88:D0:00/36\tLG Electronics\n70:B3:D5:88:E0:00/36\tRch Spa\n70:B3:D5:88:F0:00/36\tQuaesta Instruments, LLC\n70:B3:D5:89:00:00/36\tEIDOS s.r.l.\n70:B3:D5:89:10:00/36\tneocontrol soluções em automação\n70:B3:D5:89:20:00/36\tAbb\n70:B3:D5:89:30:00/36\tCubitech\n70:B3:D5:89:40:00/36\tUnI Systech Co.,Ltd\n70:B3:D5:89:50:00/36\tIntegrated Control Corp.\n70:B3:D5:89:60:00/36\tShanghai Longpal Communication Equipment Co., Ltd.\n70:B3:D5:89:70:00/36\tEFG CZ spol. s r.o.\n70:B3:D5:89:80:00/36\tSalupo Sas\n70:B3:D5:89:90:00/36\tViotec USA\n70:B3:D5:89:A0:00/36\tAlgodue Elettronica Srl\n70:B3:D5:89:B0:00/36\tControlWorks, Inc.\n70:B3:D5:89:C0:00/36\tIHI Rotating Machinery Engineering Co.,Ltd.\n70:B3:D5:89:D0:00/36\te-Matix Corporation\n70:B3:D5:89:E0:00/36\tInnovative Control Systems, LP\n70:B3:D5:89:F0:00/36\tLevel Up Holding Co., Inc.\n70:B3:D5:8A:00:00/36\tDm Radiocom\n70:B3:D5:8A:10:00/36\tTiama\n70:B3:D5:8A:20:00/36\tWinners Digital Corporation\n70:B3:D5:8A:30:00/36\tLoehnert Elektronik GmbH\n70:B3:D5:8A:40:00/36\tPhyton, Inc. Microsystems and Development Tools\n70:B3:D5:8A:50:00/36\tKST technology\n70:B3:D5:8A:60:00/36\tCrde\n70:B3:D5:8A:70:00/36\tTucsen Photonics Co., Ltd.\n70:B3:D5:8A:80:00/36\tmegatec electronic GmbH\n70:B3:D5:8A:90:00/36\tWoKa-Elektronik GmbH\n70:B3:D5:8A:A0:00/36\tTattile Srl\n70:B3:D5:8A:B0:00/36\tEMAC, Inc.\n70:B3:D5:8A:C0:00/36\t​ASUNG TECHNO CO.,Ltd\n70:B3:D5:8A:D0:00/36\tGlobal Communications Technology LLC\n70:B3:D5:8A:E0:00/36\tFareco\n70:B3:D5:8A:F0:00/36\tQbic Communications Dmcc\n70:B3:D5:8B:00:00/36\tIES S.r.l.\n70:B3:D5:8B:10:00/36\tM-Tech Innovations Limited\n70:B3:D5:8B:20:00/36\tNPF Modem, LLC\n70:B3:D5:8B:30:00/36\tFirefly RFID Solutions\n70:B3:D5:8B:40:00/36\tScenario Automation\n70:B3:D5:8B:50:00/36\txTom GmbH\n70:B3:D5:8B:60:00/36\tEldes Ltd\n70:B3:D5:8B:70:00/36\tContec Americas Inc.\n70:B3:D5:8B:80:00/36\tGDI Technology Inc\n70:B3:D5:8B:90:00/36\tToptech Systems, Inc.\n70:B3:D5:8B:A0:00/36\tTiama\n70:B3:D5:8B:B0:00/36\tKST technology\n70:B3:D5:8B:C0:00/36\tGSI GeoSolutions International Ltd\n70:B3:D5:8B:D0:00/36\tMahle Electronics, Slu\n70:B3:D5:8B:E0:00/36\tConnoiseur Electronics Private Limited\n70:B3:D5:8B:F0:00/36\tHangzhou Leaper Technology Co. Ltd.\n70:B3:D5:8C:00:00/36\tSenseNL\n70:B3:D5:8C:10:00/36\tRievtech Electronic Co.,Ltd\n70:B3:D5:8C:20:00/36\tF-domain corporation\n70:B3:D5:8C:30:00/36\tWyebot, Inc.\n70:B3:D5:8C:40:00/36\tAPE GmbH\n70:B3:D5:8C:50:00/36\tHMicro Inc\n70:B3:D5:8C:60:00/36\tOnosokki Co.,Ltd\n70:B3:D5:8C:70:00/36\tHenschel-Robotics GmbH\n70:B3:D5:8C:80:00/36\tKronotech Srl\n70:B3:D5:8C:90:00/36\tArwin Technology Limited\n70:B3:D5:8C:A0:00/36\tAllied Data Systems\n70:B3:D5:8C:B0:00/36\tWELT Corporation\n70:B3:D5:8C:C0:00/36\tPiranha EMS Inc.\n70:B3:D5:8C:D0:00/36\tEA Elektroautomatik GmbH & Co. KG\n70:B3:D5:8C:E0:00/36\tCORES Corporation\n70:B3:D5:8C:F0:00/36\tDainichi Denshi　Co.,LTD\n70:B3:D5:8D:00:00/36\tRaft Technologies\n70:B3:D5:8D:10:00/36\tField Design Inc.\n70:B3:D5:8D:20:00/36\tWizapply Co.,Ltd\n70:B3:D5:8D:30:00/36\tPerformance Controls, Inc.\n70:B3:D5:8D:40:00/36\tGuangdong Transtek Medical Electronics Co., Ltd.\n70:B3:D5:8D:50:00/36\tGuangzhou Wanglu\n70:B3:D5:8D:60:00/36\tBeijing Xiansheng Technology Co., Ltd\n70:B3:D5:8D:70:00/36\tSchneider Electric Motion USA\n70:B3:D5:8D:80:00/36\tVNG Corporation\n70:B3:D5:8D:90:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:8D:A0:00/36\tMicroElectronics System Co.Ltd\n70:B3:D5:8D:B0:00/36\tKratos Analytical Ltd\n70:B3:D5:8D:C0:00/36\tNiveo International BV\n70:B3:D5:8D:D0:00/36\tVertex Co.,Ltd.\n70:B3:D5:8D:E0:00/36\tIndutherm Giesstechnologie GmbH\n70:B3:D5:8D:F0:00/36\tDorlet Sau\n70:B3:D5:8E:00:00/36\tSoudax Equipements\n70:B3:D5:8E:10:00/36\tWoKa-Elektronik GmbH\n70:B3:D5:8E:20:00/36\tZhiye Electronics Co., Ltd.\n70:B3:D5:8E:30:00/36\tDorlet Sau\n70:B3:D5:8E:40:00/36\tAplex Technology Inc.\n70:B3:D5:8E:50:00/36\tShanghai Armour Technology Co., Ltd.\n70:B3:D5:8E:60:00/36\tMothonic AB\n70:B3:D5:8E:70:00/36\tReo Ag\n70:B3:D5:8E:80:00/36\tPreo Industries Far East Ltd\n70:B3:D5:8E:90:00/36\tCOONTROL Tecnologia em Combustão LTDA EPP\n70:B3:D5:8E:A0:00/36\tJLCooper Electronics\n70:B3:D5:8E:B0:00/36\tProcon Electronics Pty Ltd\n70:B3:D5:8E:C0:00/36\tRudy Tellert\n70:B3:D5:8E:D0:00/36\tNanoSense\n70:B3:D5:8E:E0:00/36\tNetwork Additions\n70:B3:D5:8E:F0:00/36\tBeeper Communications Ltd.\n70:B3:D5:8F:00:00/36\tERAESEEDS co.,ltd.\n70:B3:D5:8F:10:00/36\tParamount Bed Holdings Co., Ltd.\n70:B3:D5:8F:20:00/36\tRimota Limited\n70:B3:D5:8F:30:00/36\tTattile Srl\n70:B3:D5:8F:40:00/36\tACQUA-SYSTEMS srls\n70:B3:D5:8F:50:00/36\tStmovic\n70:B3:D5:8F:60:00/36\tDofuntech Co.,LTD.\n70:B3:D5:8F:70:00/36\tI.E. Sevko A.V.\n70:B3:D5:8F:80:00/36\tWi6labs\n70:B3:D5:8F:90:00/36\tIWS Global Pty Ltd\n70:B3:D5:8F:A0:00/36\tDea System Spa\n70:B3:D5:8F:B0:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:8F:C0:00/36\tMianjie Technology\n70:B3:D5:8F:D0:00/36\tsonatest\n70:B3:D5:8F:E0:00/36\tSelmatec AS\n70:B3:D5:8F:F0:00/36\tIMST GmbH\n70:B3:D5:90:00:00/36\tDCS Corp\n70:B3:D5:90:10:00/36\tAts-Convers,Llc\n70:B3:D5:90:20:00/36\tUnlimiterhear co.,ltd. taiwan branch\n70:B3:D5:90:30:00/36\tCymtec Ltd\n70:B3:D5:90:40:00/36\tPHB Eletronica Ltda.\n70:B3:D5:90:50:00/36\tWexiodisk AB\n70:B3:D5:90:60:00/36\tAplex Technology Inc.\n70:B3:D5:90:70:00/36\tNingbo Crrc Times Transducer Technology Co., Ltd\n70:B3:D5:90:80:00/36\tAccusonic\n70:B3:D5:90:90:00/36\ttetronik GmbH AEN\n70:B3:D5:90:A0:00/36\tHangzhou SunTown Intelligent Science & Technology Co.,Ltd.\n70:B3:D5:90:B0:00/36\tMatrix Switch Corporation\n70:B3:D5:90:C0:00/36\tANTEK GmbH\n70:B3:D5:90:D0:00/36\tModtronix Engineering\n70:B3:D5:90:E0:00/36\tMaytronics Ltd.\n70:B3:D5:90:F0:00/36\tDTRON Communications (Pty) Ltd\n70:B3:D5:91:00:00/36\tEginity, Inc.\n70:B3:D5:91:10:00/36\tEquatel\n70:B3:D5:91:20:00/36\tVertel Digital Private Limited\n70:B3:D5:91:30:00/36\tShenzhen Riitek Technology Co.,Ltd\n70:B3:D5:91:40:00/36\tContec Americas Inc.\n70:B3:D5:91:50:00/36\tDHK Storage, LLC\n70:B3:D5:91:60:00/36\tTechno Mathematical Co.,Ltd\n70:B3:D5:91:70:00/36\tKSJ Co.Ltd\n70:B3:D5:91:80:00/36\tGlova Rail A/S\n70:B3:D5:91:90:00/36\tThesycon Software Solutions GmbH & Co. KG\n70:B3:D5:91:A0:00/36\tFujian Landfone Information Technology Co.,Ltd\n70:B3:D5:91:B0:00/36\tDolotron d.o.o.\n70:B3:D5:91:C0:00/36\tAlere Technologies AS\n70:B3:D5:91:D0:00/36\tCubitech\n70:B3:D5:91:E0:00/36\tCreotech Instruments S.A.\n70:B3:D5:91:F0:00/36\tJSC \"InformInvestGroup\"\n70:B3:D5:92:00:00/36\tSlat\n70:B3:D5:92:10:00/36\tQDevil\n70:B3:D5:92:20:00/36\tAdcole Space\n70:B3:D5:92:30:00/36\teumig industrie-TV GmbH.\n70:B3:D5:92:40:00/36\tMeridian Technologies Inc\n70:B3:D5:92:50:00/36\tDiamante Lighting Srl\n70:B3:D5:92:60:00/36\tAdvice\n70:B3:D5:92:70:00/36\tLG Electronics\n70:B3:D5:92:80:00/36\tDone Design Inc\n70:B3:D5:92:90:00/36\tOutSys\n70:B3:D5:92:A0:00/36\tMiravue\n70:B3:D5:92:B0:00/36\tENTEC Electric & Electronic Co., LTD.\n70:B3:D5:92:C0:00/36\tDismuntel Sal\n70:B3:D5:92:D0:00/36\tSuzhou Wansong Electric Co.,Ltd\n70:B3:D5:92:E0:00/36\tMedical Monitoring Center OOD\n70:B3:D5:92:F0:00/36\tSiFive Inc\n70:B3:D5:93:00:00/36\tThe Institute of Mine Seismology\n70:B3:D5:93:10:00/36\tMarine Instruments, S.A.\n70:B3:D5:93:20:00/36\tRohde&Schwarz Topex SA\n70:B3:D5:93:30:00/36\tSarl S@Tis\n70:B3:D5:93:40:00/36\tRBS Netkom GmbH\n70:B3:D5:93:50:00/36\tSensor Developments\n70:B3:D5:93:60:00/36\tFaro Technologies, Inc.\n70:B3:D5:93:70:00/36\tTattile Srl\n70:B3:D5:93:80:00/36\tJETI Technische Instrumente GmbH\n70:B3:D5:93:90:00/36\tInvertek Drives Ltd\n70:B3:D5:93:A0:00/36\tBraemar Manufacturing, LLC\n70:B3:D5:93:B0:00/36\tChangchun FAW Yanfeng Visteon Automotive Electronics.,Ltd.\n70:B3:D5:93:C0:00/36\tTelevic Rail GmbH\n70:B3:D5:93:D0:00/36\tElmeasure India Pvt Ltd\n70:B3:D5:93:E0:00/36\tSystems With Intelligence Inc.\n70:B3:D5:93:F0:00/36\tVision Sensing Co., Ltd.\n70:B3:D5:94:00:00/36\tParadigm Technology Services B.V.\n70:B3:D5:94:10:00/36\tTriax A/S\n70:B3:D5:94:20:00/36\tTruTeq Devices (Pty) Ltd\n70:B3:D5:94:30:00/36\tAbbott Medical Optics Inc.\n70:B3:D5:94:40:00/36\tChromateq\n70:B3:D5:94:50:00/36\tSymboticware Incorporated\n70:B3:D5:94:60:00/36\tGREATWALL Infotech Co., Ltd.\n70:B3:D5:94:70:00/36\tCheckbill Co,Ltd.\n70:B3:D5:94:80:00/36\tVision Systems Aurtomotive (Safety Tech)\n70:B3:D5:94:90:00/36\tNational Radio & Telecommunication Corporation - NRTC\n70:B3:D5:94:A0:00/36\tShenzhen Wisewing Internet Technology Co.,Ltd\n70:B3:D5:94:B0:00/36\tRF Code\n70:B3:D5:94:C0:00/36\tHoneywell/Intelligrated\n70:B3:D5:94:D0:00/36\tSeason Design Technology\n70:B3:D5:94:E0:00/36\tBP Lubricants USA, Inc.\n70:B3:D5:94:F0:00/36\tMart Network Solutions Ltd\n70:B3:D5:95:00:00/36\tCMT Medical technologies\n70:B3:D5:95:10:00/36\tTrident Systems Inc\n70:B3:D5:95:20:00/36\tRequea\n70:B3:D5:95:30:00/36\tSpectrum Techniques, LLC\n70:B3:D5:95:40:00/36\tDot System S.r.l.\n70:B3:D5:95:50:00/36\tDynacard Co., Ltd.\n70:B3:D5:95:60:00/36\tAeroVision Avionics, Inc.\n70:B3:D5:95:70:00/36\tEA Elektroautomatik GmbH & Co. KG\n70:B3:D5:95:80:00/36\tpureLiFi Ltd\n70:B3:D5:95:90:00/36\tZulex International Co.,Ltd.\n70:B3:D5:95:A0:00/36\tSigmann Elektronik GmbH\n70:B3:D5:95:B0:00/36\tSRS Group s.r.o.\n70:B3:D5:95:C0:00/36\tWilson Electronics\n70:B3:D5:95:D0:00/36\tGiordano Controls Spa\n70:B3:D5:95:E0:00/36\tBlocksi Llc\n70:B3:D5:95:F0:00/36\tWiFi Nation Ltd\n70:B3:D5:96:00:00/36\tHorizon Telecom\n70:B3:D5:96:10:00/36\tTask Sistemas De Computacao Ltda\n70:B3:D5:96:20:00/36\tSenquire Pte. Ltd\n70:B3:D5:96:30:00/36\tTriax A/S\n70:B3:D5:96:40:00/36\tVisility\n70:B3:D5:96:50:00/36\tLineage Power Pvt Ltd.,\n70:B3:D5:96:60:00/36\tdA Tomato Limited\n70:B3:D5:96:70:00/36\tTattile Srl\n70:B3:D5:96:80:00/36\tLGM Ingénierie\n70:B3:D5:96:90:00/36\tEmtel System Sp. z o.o.\n70:B3:D5:96:A0:00/36\tAnello Photonics\n70:B3:D5:96:B0:00/36\tFOCAL-JMLab\n70:B3:D5:96:C0:00/36\tWeble Sàrl\n70:B3:D5:96:D0:00/36\tMSB Elektronik und Gerätebau GmbH\n70:B3:D5:96:E0:00/36\tMyostat Motion Control Inc\n70:B3:D5:96:F0:00/36\t4CAM GmbH\n70:B3:D5:97:00:00/36\tBintel AB\n70:B3:D5:97:10:00/36\tRch Italia Spa\n70:B3:D5:97:20:00/36\tAixControl GmbH\n70:B3:D5:97:30:00/36\tAutonomic Controls, Inc.\n70:B3:D5:97:40:00/36\tJireh Industries Ltd.\n70:B3:D5:97:50:00/36\tCoester Automação Ltda\n70:B3:D5:97:60:00/36\tAtonarp Micro-Systems India Pvt. Ltd.\n70:B3:D5:97:70:00/36\tEngage Technologies\n70:B3:D5:97:80:00/36\tSatixfy Israel Ltd.\n70:B3:D5:97:90:00/36\teSMART Technologies SA\n70:B3:D5:97:A0:00/36\tOrion Corporation\n70:B3:D5:97:B0:00/36\tWIKA Alexander Wiegand SE & Co. KG\n70:B3:D5:97:C0:00/36\tNu-Tek Power Controls and Automation\n70:B3:D5:97:D0:00/36\tRch Spa\n70:B3:D5:97:E0:00/36\tPublic Joint Stock Company Morion\n70:B3:D5:97:F0:00/36\tBISTOS.,Co.,Ltd\n70:B3:D5:98:00:00/36\tBeijing Yourong Runda Rechnology Development Co.Ltd.\n70:B3:D5:98:10:00/36\tZamir Recognition Systems Ltd.\n70:B3:D5:98:20:00/36\t3S - Sensors, Signal Processing, Systems GmbH\n70:B3:D5:98:30:00/36\tHavis Inc.\n70:B3:D5:98:40:00/36\tSanmina Israel\n70:B3:D5:98:50:00/36\tBurk Technology\n70:B3:D5:98:60:00/36\tAplex Technology Inc.\n70:B3:D5:98:70:00/36\tAxis Corporation\n70:B3:D5:98:80:00/36\tArris\n70:B3:D5:98:90:00/36\tDcns\n70:B3:D5:98:A0:00/36\tvision systems safety tech\n70:B3:D5:98:B0:00/36\tRichard Paul Russell Ltd\n70:B3:D5:98:C0:00/36\tUniversity of Wisconsin Madison - Department of High Energy Physics\n70:B3:D5:98:D0:00/36\tMotohaus Powersports Limited\n70:B3:D5:98:E0:00/36\tAutocom Diagnostic Partner AB\n70:B3:D5:98:F0:00/36\tSpaceflight Industries\n70:B3:D5:99:00:00/36\tEnergy Wall\n70:B3:D5:99:10:00/36\tJavasparrow Inc.\n70:B3:D5:99:20:00/36\tKaeonit\n70:B3:D5:99:30:00/36\tioThings\n70:B3:D5:99:40:00/36\tKeFF Networks\n70:B3:D5:99:50:00/36\tLayTec AG\n70:B3:D5:99:60:00/36\tXpertSea Solutions inc.\n70:B3:D5:99:70:00/36\tProTom International\n70:B3:D5:99:80:00/36\tKita Kirmizi Takim Bilgi Guvenligi Danismanlik ve Egitim A.S.\n70:B3:D5:99:90:00/36\tLogicube Inc\n70:B3:D5:99:A0:00/36\tKEVIC. inc,\n70:B3:D5:99:B0:00/36\tRch Italia Spa\n70:B3:D5:99:C0:00/36\tEnerwise Solutions Ltd.\n70:B3:D5:99:D0:00/36\tOpsys-Tech\n70:B3:D5:99:E0:00/36\tTrinity College Dublin\n70:B3:D5:99:F0:00/36\tConfed Holding B.V.\n70:B3:D5:9A:00:00/36\tEldes\n70:B3:D5:9A:10:00/36\tITS Industrial Turbine Services GmbH\n70:B3:D5:9A:20:00/36\tO-Net Communications(Shenzhen)Limited\n70:B3:D5:9A:30:00/36\tShanghai Hourui Technology Co., Ltd.\n70:B3:D5:9A:40:00/36\tNordmann International GmbH\n70:B3:D5:9A:50:00/36\tSoftel\n70:B3:D5:9A:60:00/36\tQunu Labs Private Limited\n70:B3:D5:9A:70:00/36\tHoneywell\n70:B3:D5:9A:80:00/36\tEgag, LLC\n70:B3:D5:9A:90:00/36\tPABLO AIR Co., LTD\n70:B3:D5:9A:A0:00/36\tTecsys do Brasil Industrial Ltda\n70:B3:D5:9A:B0:00/36\tGroupe Paris-Turf\n70:B3:D5:9A:C0:00/36\tSuzhou Sapa Automotive Technology Co.,Ltd\n70:B3:D5:9A:D0:00/36\tFortuna Impex Pvt ltd\n70:B3:D5:9A:E0:00/36\tVolansys technologies pvt ltd\n70:B3:D5:9A:F0:00/36\tShanghai Brellet Telecommunication Technology Co., Ltd.\n70:B3:D5:9B:00:00/36\tClearly IP Inc\n70:B3:D5:9B:10:00/36\tAplex Technology Inc.\n70:B3:D5:9B:20:00/36\tCONTINENT, Ltd\n70:B3:D5:9B:30:00/36\tK&J Schmittschneider AG\n70:B3:D5:9B:40:00/36\tMyoungSung System\n70:B3:D5:9B:50:00/36\tIdeetron b.v.\n70:B3:D5:9B:60:00/36\tIntercomp S.p.A.\n70:B3:D5:9B:70:00/36\tItronics Ltd\n70:B3:D5:9B:80:00/36\tLoma Systems s.r.o.\n70:B3:D5:9B:90:00/36\tAethera Technologies\n70:B3:D5:9B:A0:00/36\tATIM Radiocommunication\n70:B3:D5:9B:B0:00/36\tJinga-hi, Inc.\n70:B3:D5:9B:C0:00/36\tRadian Research, Inc.\n70:B3:D5:9B:D0:00/36\tSignal Processing Devices Sweden AB\n70:B3:D5:9B:E0:00/36\tIzome\n70:B3:D5:9B:F0:00/36\tXiris Automation Inc.\n70:B3:D5:9C:00:00/36\tSchneider Displaytechnik GmbH\n70:B3:D5:9C:10:00/36\tZeroplus Technology Co.,Ltd.\n70:B3:D5:9C:20:00/36\tSportsbeams Lighting, Inc.\n70:B3:D5:9C:30:00/36\tSevensense Robotics AG\n70:B3:D5:9C:40:00/36\taelettronica group srl\n70:B3:D5:9C:50:00/36\tLineage Power Pvt Ltd.,\n70:B3:D5:9C:60:00/36\tOverspeed SARL\n70:B3:D5:9C:70:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:9C:80:00/36\tApplied Systems Engineering, Inc.\n70:B3:D5:9C:90:00/36\tPK Sound\n70:B3:D5:9C:A0:00/36\tKomsis Elektronik Sistemleri San. Tic. Ltd.Sti\n70:B3:D5:9C:B0:00/36\tAlligator Communications\n70:B3:D5:9C:C0:00/36\tZaxcom Inc\n70:B3:D5:9C:D0:00/36\tWEPTECH elektronik GmbH\n70:B3:D5:9C:E0:00/36\tTerragene S.A\n70:B3:D5:9C:F0:00/36\tIotize\n70:B3:D5:9D:00:00/36\tRJ45 Technologies\n70:B3:D5:9D:10:00/36\tOS42 UG (haftungsbeschraenkt)\n70:B3:D5:9D:20:00/36\tAcs Motion Control\n70:B3:D5:9D:30:00/36\tCommunication Technology Ltd.\n70:B3:D5:9D:40:00/36\tWartsila Voyage Oy\n70:B3:D5:9D:50:00/36\tSouthern Tier Technologies\n70:B3:D5:9D:60:00/36\tCrown Solar Power Fencing Systems\n70:B3:D5:9D:70:00/36\tKM OptoElektronik GmbH\n70:B3:D5:9D:80:00/36\tJOLANYEE  Technology Co., Ltd.\n70:B3:D5:9D:90:00/36\tATX Networks Corp\n70:B3:D5:9D:A0:00/36\tBlake UK\n70:B3:D5:9D:B0:00/36\tCAS Medical Systems, Inc\n70:B3:D5:9D:C0:00/36\tShanghai Daorech Industry Developmnet Co.,Ltd\n70:B3:D5:9D:D0:00/36\tHumanEyes Technologies Ltd.\n70:B3:D5:9D:E0:00/36\tSystem 11 Sp. z o.o.\n70:B3:D5:9D:F0:00/36\tDOBE Computing\n70:B3:D5:9E:00:00/36\tES Industrial Systems Co., Ltd.\n70:B3:D5:9E:10:00/36\tBolide Technology Group, Inc.\n70:B3:D5:9E:20:00/36\tOfil USA\n70:B3:D5:9E:30:00/36\tLG Electronics\n70:B3:D5:9E:40:00/36\tK&A Electronics Inc.\n70:B3:D5:9E:50:00/36\tAntek Technology\n70:B3:D5:9E:60:00/36\tBlocksi Llc\n70:B3:D5:9E:70:00/36\tXiamen Maxincom Technologies Co., Ltd.\n70:B3:D5:9E:80:00/36\tZerospace ICT Services B.V.\n70:B3:D5:9E:90:00/36\tLiveCopper Inc.\n70:B3:D5:9E:A0:00/36\tBlue Storm Associates, Inc.\n70:B3:D5:9E:B0:00/36\tPreston Industries dba PolyScience\n70:B3:D5:9E:C0:00/36\teSoftThings\n70:B3:D5:9E:D0:00/36\tBenchmark Electronics BV\n70:B3:D5:9E:E0:00/36\tLockheed Martin - THAAD\n70:B3:D5:9E:F0:00/36\tCottonwood Creek Technologies, Inc.\n70:B3:D5:9F:00:00/36\tFUJICOM Co.,Ltd.\n70:B3:D5:9F:10:00/36\tRheinmetall Electronics UK Ltd\n70:B3:D5:9F:20:00/36\tAcorde Technologies\n70:B3:D5:9F:30:00/36\tIEEE Registration Authority\n70:B3:D5:9F:40:00/36\tTband srl\n70:B3:D5:9F:50:00/36\tVickers Electronics Ltd\n70:B3:D5:9F:60:00/36\tEdgeware AB\n70:B3:D5:9F:70:00/36\tFoerster-Technik GmbH\n70:B3:D5:9F:80:00/36\tAsymmetric Technologies\n70:B3:D5:9F:90:00/36\tFluid Components Intl\n70:B3:D5:9F:A0:00/36\tIdeas srl\n70:B3:D5:9F:B0:00/36\tUnicom Global, Inc.\n70:B3:D5:9F:C0:00/36\tTruecom Telesoft Private Limited\n70:B3:D5:9F:D0:00/36\tamakidenki\n70:B3:D5:9F:E0:00/36\tSuruga Seiki Co., Ltd.\n70:B3:D5:9F:F0:00/36\tNetwork Integrity Systems\n70:B3:D5:A0:00:00/36\tAtx Networks Ltd\n70:B3:D5:A0:10:00/36\tFeldTech GmbH\n70:B3:D5:A0:20:00/36\tGreenFlux\n70:B3:D5:A0:30:00/36\tProemion GmbH\n70:B3:D5:A0:40:00/36\tGalea Electric S.L.\n70:B3:D5:A0:50:00/36\tWartsila Voyage Oy\n70:B3:D5:A0:60:00/36\tKopis Mobile LLC\n70:B3:D5:A0:70:00/36\tIoTrek Technology Private Limited\n70:B3:D5:A0:80:00/36\tBioBusiness\n70:B3:D5:A0:90:00/36\tSmart Embedded Systems\n70:B3:D5:A0:A0:00/36\tCapsys\n70:B3:D5:A0:B0:00/36\tambiHome GmbH\n70:B3:D5:A0:C0:00/36\tLumiplan Duhamel\n70:B3:D5:A0:D0:00/36\tGlobalcom Engineering SPA\n70:B3:D5:A0:E0:00/36\tVetaphone A/S\n70:B3:D5:A0:F0:00/36\tOsaki Datatech Co., Ltd.\n70:B3:D5:A1:00:00/36\tw-tec AG\n70:B3:D5:A1:10:00/36\tTrioptics\n70:B3:D5:A1:20:00/36\tQuercus Technologies, S.L.\n70:B3:D5:A1:30:00/36\tUplevel Systems Inc\n70:B3:D5:A1:40:00/36\taelettronica group srl\n70:B3:D5:A1:50:00/36\tIntercore GmbH\n70:B3:D5:A1:60:00/36\tdevAIs s.r.l.\n70:B3:D5:A1:70:00/36\tTunstall A/S\n70:B3:D5:A1:80:00/36\tEmbedded Systems Lukasz Panasiuk\n70:B3:D5:A1:90:00/36\tQualitronix Madrass Pvt Ltd\n70:B3:D5:A1:A0:00/36\tNueon - The COR\n70:B3:D5:A1:B0:00/36\tPotter Electric Signal Co. LLC\n70:B3:D5:A1:C0:00/36\tMeca System\n70:B3:D5:A1:D0:00/36\tFluid Components Intl\n70:B3:D5:A1:E0:00/36\tMonnit Corporation\n70:B3:D5:A1:F0:00/36\tGlobalTest LLC\n70:B3:D5:A2:00:00/36\tDesign For Life Systems\n70:B3:D5:A2:10:00/36\tPPI Inc.\n70:B3:D5:A2:20:00/36\teSys Solutions Sweden AB\n70:B3:D5:A2:30:00/36\tLG Electronics\n70:B3:D5:A2:40:00/36\tBooz Allen Hamilton\n70:B3:D5:A2:50:00/36\tPulseTor LLC\n70:B3:D5:A2:60:00/36\tHear Gear, Inc.\n70:B3:D5:A2:70:00/36\tHDL da Amazônia Industria Eletrônica Ltda\n70:B3:D5:A2:80:00/36\tPeek Traffic\n70:B3:D5:A2:90:00/36\tQIAGEN Instruments AG\n70:B3:D5:A2:A0:00/36\tRedwood Systems\n70:B3:D5:A2:B0:00/36\tClever Devices\n70:B3:D5:A2:C0:00/36\tTlv Co., Ltd.\n70:B3:D5:A2:D0:00/36\tProject Service S.r.l.\n70:B3:D5:A2:E0:00/36\tKokam Co., Ltd\n70:B3:D5:A2:F0:00/36\tBotek Systems AB\n70:B3:D5:A3:00:00/36\tShen Zhen Huawang Technology Co; Ltd\n70:B3:D5:A3:10:00/36\tWise Ally Holdings Limited\n70:B3:D5:A3:20:00/36\tToughdog Security Systems\n70:B3:D5:A3:30:00/36\tTiama\n70:B3:D5:A3:40:00/36\tRch Italia Spa\n70:B3:D5:A3:50:00/36\tSicon srl\n70:B3:D5:A3:60:00/36\tBeijing DamingWuzhou Science&Technology Co., Ltd.\n70:B3:D5:A3:70:00/36\tMitsubishi Heavy Industries Thermal Systems, Ltd.\n70:B3:D5:A3:80:00/36\tAditec GmbH\n70:B3:D5:A3:90:00/36\tSPETSSTROY-SVYAZ Ltd\n70:B3:D5:A3:A0:00/36\tEPSOFT Co., Ltd\n70:B3:D5:A3:B0:00/36\tGrace Design/Lunatec LLC\n70:B3:D5:A3:C0:00/36\tWave Music Ltd\n70:B3:D5:A3:D0:00/36\tSMART IN OVATION GmbH\n70:B3:D5:A3:E0:00/36\tVigorcloud Co., Ltd.\n70:B3:D5:A3:F0:00/36\tPHPower Srl\n70:B3:D5:A4:00:00/36\tSTRACK LIFT AUTOMATION GmbH\n70:B3:D5:A4:10:00/36\tTHELIGHT Luminary for Cine and TV S.L.\n70:B3:D5:A4:20:00/36\tiMAR Navigation GmbH\n70:B3:D5:A4:30:00/36\tOledcomm\n70:B3:D5:A4:40:00/36\tFsr, Inc.\n70:B3:D5:A4:50:00/36\tViper Innovations Ltd\n70:B3:D5:A4:60:00/36\tFoxconn 4Tech\n70:B3:D5:A4:70:00/36\tKanoa Inc\n70:B3:D5:A4:80:00/36\tApplied Satellite Engineering\n70:B3:D5:A4:90:00/36\tUnipower AB\n70:B3:D5:A4:A0:00/36\tBeijing Arrow SEED Technology Co,.Ltd.\n70:B3:D5:A4:B0:00/36\tMcKay Brothers LLC\n70:B3:D5:A4:C0:00/36\tAlere Technologies AS\n70:B3:D5:A4:D0:00/36\tLansitec Technology Co., Ltd\n70:B3:D5:A4:E0:00/36\tArray Technologies Inc.\n70:B3:D5:A4:F0:00/36\tWeltek Technologies Co. Ltd.\n70:B3:D5:A5:00:00/36\tLecip Corporation\n70:B3:D5:A5:10:00/36\tRF Code\n70:B3:D5:A5:20:00/36\tAPEX Stabilizations GmbH\n70:B3:D5:A5:30:00/36\tGS Industrie-Elektronik GmbH\n70:B3:D5:A5:40:00/36\tprovedo\n70:B3:D5:A5:50:00/36\tEmbest Technology Co., Ltd\n70:B3:D5:A5:60:00/36\tDorlet Sau\n70:B3:D5:A5:70:00/36\tPcsc\n70:B3:D5:A5:80:00/36\tMCQ TECH GmbH\n70:B3:D5:A5:90:00/36\tMuuntosähkö Oy - Trafox\n70:B3:D5:A5:A0:00/36\tRCS Energy Management Ltd\n70:B3:D5:A5:B0:00/36\tChrist Elektronik GmbH\n70:B3:D5:A5:C0:00/36\tMolekule\n70:B3:D5:A5:D0:00/36\tPosition Imaging\n70:B3:D5:A5:E0:00/36\tConectaIP Tecnologia S.L.\n70:B3:D5:A5:F0:00/36\tDaatrics LTD\n70:B3:D5:A6:00:00/36\tPneumax S.p.A.\n70:B3:D5:A6:10:00/36\tOmsk Manufacturing Association named after A.S. Popov\n70:B3:D5:A6:20:00/36\tEnvironexus\n70:B3:D5:A6:30:00/36\tDesignA Electronics Limited\n70:B3:D5:A6:40:00/36\tNewshine\n70:B3:D5:A6:50:00/36\tCreative\n70:B3:D5:A6:60:00/36\tTrapeze Software Group Inc\n70:B3:D5:A6:70:00/36\tGstar Creation Co .,Ltd\n70:B3:D5:A6:80:00/36\tZhejiang Zhaolong Interconnect Technology Co.,Ltd\n70:B3:D5:A6:90:00/36\tLeviathan Solutions Ltd.\n70:B3:D5:A6:A0:00/36\tPrivafy, Inc\n70:B3:D5:A6:B0:00/36\txmi systems\n70:B3:D5:A6:C0:00/36\tControles S.A.\n70:B3:D5:A6:D0:00/36\tMetek Meteorologische Messtechnik GmbH\n70:B3:D5:A6:E0:00/36\tJSC Electrical Equipment Factory\n70:B3:D5:A6:F0:00/36\t8Cups\n70:B3:D5:A7:00:00/36\tGateview Technologies\n70:B3:D5:A7:10:00/36\tSamwell International Inc\n70:B3:D5:A7:20:00/36\tBusiness Marketers Group, Inc.\n70:B3:D5:A7:30:00/36\tMobiPromo\n70:B3:D5:A7:40:00/36\tSadel S.p.A.\n70:B3:D5:A7:50:00/36\tTaejin InfoTech\n70:B3:D5:A7:60:00/36\tPietro Fiorentini\n70:B3:D5:A7:70:00/36\tSPX Radiodetection\n70:B3:D5:A7:80:00/36\tBionics co.,ltd.\n70:B3:D5:A7:90:00/36\tNOREYA Technology e.U.\n70:B3:D5:A7:A0:00/36\tFluid Management Technology\n70:B3:D5:A7:B0:00/36\tSmartSafe\n70:B3:D5:A7:C0:00/36\tTranselektronik Messgeräte GmbH\n70:B3:D5:A7:D0:00/36\tPrior Scientific Instruments Ltd\n70:B3:D5:A7:E0:00/36\tQUICCO SOUND Corporation\n70:B3:D5:A7:F0:00/36\tAudio Visual Digital Systems\n70:B3:D5:A8:00:00/36\tEvco Spa\n70:B3:D5:A8:10:00/36\tSienda New Media Technologies GmbH\n70:B3:D5:A8:20:00/36\tTelefrank GmbH\n70:B3:D5:A8:30:00/36\tSHENZHEN HUINENGYUAN Technology Co., Ltd\n70:B3:D5:A8:40:00/36\tSOREL GmbH\n70:B3:D5:A8:50:00/36\texceet electronics GesmbH\n70:B3:D5:A8:60:00/36\tDivigraph (Pty) LTD\n70:B3:D5:A8:70:00/36\tTornado Modular Systems\n70:B3:D5:A8:80:00/36\tShangdong Bosure Automation Technology Ltd\n70:B3:D5:A8:90:00/36\tGbs Communications, Llc\n70:B3:D5:A8:A0:00/36\tJSC VIST Group\n70:B3:D5:A8:B0:00/36\tGiant Power Technology Biomedical Corporation\n70:B3:D5:A8:C0:00/36\tCyg Contron Co.Ltd\n70:B3:D5:A8:D0:00/36\tCode Blue Corporation\n70:B3:D5:A8:E0:00/36\tOmesh City Group\n70:B3:D5:A8:F0:00/36\tVK Integrated Systems\n70:B3:D5:A9:00:00/36\tERA a.s.\n70:B3:D5:A9:10:00/36\tIDEAL INDUSTRIES Ltd t/a Casella\n70:B3:D5:A9:20:00/36\tGrossenbacher Systeme AG\n70:B3:D5:A9:30:00/36\tMes Communication Co., Ltd\n70:B3:D5:A9:40:00/36\tETA Technology Pvt Ltd\n70:B3:D5:A9:50:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:A9:60:00/36\tÖstling Marking Systems GmbH\n70:B3:D5:A9:70:00/36\tBizwerks, LLC\n70:B3:D5:A9:80:00/36\tPantec AG\n70:B3:D5:A9:90:00/36\tBandelin electronic GmbH & Co. KG\n70:B3:D5:A9:A0:00/36\tAmphenol Advanced Sensors\n70:B3:D5:A9:B0:00/36\tOsmozis\n70:B3:D5:A9:C0:00/36\tVeo Technologies\n70:B3:D5:A9:D0:00/36\tVitec Multimedia\n70:B3:D5:A9:E0:00/36\tArgon ST\n70:B3:D5:A9:F0:00/36\tMaster Meter Inc.\n70:B3:D5:AA:00:00/36\tSimple Works, Inc.\n70:B3:D5:AA:10:00/36\tShenzhen Weema TV Technology Co.,Ltd.\n70:B3:D5:AA:20:00/36\teumig industrie-TV GmbH.\n70:B3:D5:AA:30:00/36\tLineage Power Pvt Ltd.,\n70:B3:D5:AA:40:00/36\tPullnet Technology,S.L.\n70:B3:D5:AA:50:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:AA:60:00/36\tProximus\n70:B3:D5:AA:70:00/36\tAteme\n70:B3:D5:AA:80:00/36\tWest-Com Nurse Call Systems, Inc.\n70:B3:D5:AA:90:00/36\tDatamars SA\n70:B3:D5:AA:A0:00/36\tXemex NV\n70:B3:D5:AA:B0:00/36\tQUISS GmbH\n70:B3:D5:AA:C0:00/36\tSensoTec GmbH\n70:B3:D5:AA:D0:00/36\tBartec GmbH\n70:B3:D5:AA:E0:00/36\tNuviz Oy\n70:B3:D5:AA:F0:00/36\tExi Flow Measurement Ltd\n70:B3:D5:AB:00:00/36\tOsr R&D Israel Ltd\n70:B3:D5:AB:10:00/36\tISRV Zrt.\n70:B3:D5:AB:20:00/36\tPower Electronics Espana, S.L.\n70:B3:D5:AB:30:00/36\tMicas Ag\n70:B3:D5:AB:40:00/36\tSYS TEC electronic GmbH\n70:B3:D5:AB:50:00/36\tBroadSoft Inc\n70:B3:D5:AB:60:00/36\tSmartD Technologies Inc\n70:B3:D5:AB:70:00/36\tSiglead Inc\n70:B3:D5:AB:80:00/36\tHoriba Abx Sas\n70:B3:D5:AB:90:00/36\tDynamic Controls\n70:B3:D5:AB:A0:00/36\tCL International\n70:B3:D5:AB:B0:00/36\tDavid Horn Communications Ltd\n70:B3:D5:AB:C0:00/36\tBKM-Micronic Richtfunkanlagen GmbH\n70:B3:D5:AB:D0:00/36\twtec GmbH\n70:B3:D5:AB:E0:00/36\tMart Network Solutions Ltd\n70:B3:D5:AB:F0:00/36\tAGR International\n70:B3:D5:AC:00:00/36\tRitec\n70:B3:D5:AC:10:00/36\tAEM Singapore Pte. Ltd.\n70:B3:D5:AC:20:00/36\tWisebox.,Co.Ltd\n70:B3:D5:AC:30:00/36\tNovoptel GmbH\n70:B3:D5:AC:40:00/36\tLexi Devices, Inc.\n70:B3:D5:AC:50:00/36\tATOM GIKEN Co.,Ltd.\n70:B3:D5:AC:60:00/36\tSMTC Corporation\n70:B3:D5:AC:70:00/36\tvivaMOS\n70:B3:D5:AC:80:00/36\tHeartland.Data Inc.\n70:B3:D5:AC:90:00/36\tTrinity Solutions LLC\n70:B3:D5:AC:A0:00/36\tTecnint HTE SRL\n70:B3:D5:AC:B0:00/36\tTattile Srl\n70:B3:D5:AC:C0:00/36\tSchneider Electric Motion USA\n70:B3:D5:AC:D0:00/36\tCrde\n70:B3:D5:AC:E0:00/36\tFarho Domotica Sl\n70:B3:D5:AC:F0:00/36\tAPG Cash Drawer, LLC\n70:B3:D5:AD:00:00/36\tReo Ag\n70:B3:D5:AD:10:00/36\tSensile Technologies SA\n70:B3:D5:AD:20:00/36\tWart-Elektronik\n70:B3:D5:AD:30:00/36\tWarecube,Inc\n70:B3:D5:AD:40:00/36\tInvissys\n70:B3:D5:AD:50:00/36\tBirdland Audio\n70:B3:D5:AD:60:00/36\tLemonade Lab Inc\n70:B3:D5:AD:70:00/36\tOctopus IoT srl\n70:B3:D5:AD:80:00/36\tEuklis by GSG International\n70:B3:D5:AD:90:00/36\taelettronica group srl\n70:B3:D5:AD:A0:00/36\tPrivate\n70:B3:D5:AD:B0:00/36\tRF Code\n70:B3:D5:AD:C0:00/36\tSodaq\n70:B3:D5:AD:D0:00/36\tGHL Systems Berhad\n70:B3:D5:AD:E0:00/36\tIsac Srl\n70:B3:D5:AD:F0:00/36\tSeraphim Optronics Ltd\n70:B3:D5:AE:00:00/36\tAnyComm.Co.,Ltd.\n70:B3:D5:AE:10:00/36\tDimoCore Corporation\n70:B3:D5:AE:20:00/36\tWartsila Voyage Oy\n70:B3:D5:AE:30:00/36\tZhejiang Wellsun Electric Meter Co.,Ltd\n70:B3:D5:AE:40:00/36\tNuance Hearing Ltd.\n70:B3:D5:AE:50:00/36\tBeatCraft, Inc.\n70:B3:D5:AE:60:00/36\tYa Batho Trading (Pty) Ltd\n70:B3:D5:AE:70:00/36\tE-T-A Elektrotechnische Apparate GmbH\n70:B3:D5:AE:80:00/36\tInnoknight\n70:B3:D5:AE:90:00/36\tCari Electronic\n70:B3:D5:AE:A0:00/36\tBBR Verkehrstechnik GmbH\n70:B3:D5:AE:B0:00/36\tAssociation Romandix\n70:B3:D5:AE:C0:00/36\tParatec Ltd.\n70:B3:D5:AE:D0:00/36\tCubitech\n70:B3:D5:AE:E0:00/36\tDiTEST Fahrzeugdiagnose GmbH\n70:B3:D5:AE:F0:00/36\tBaumtec GmbH\n70:B3:D5:AF:00:00/36\tSeason Design Technology\n70:B3:D5:AF:10:00/36\tEmka Technologies\n70:B3:D5:AF:20:00/36\tTrue Networks Ltd.\n70:B3:D5:AF:30:00/36\tNew Japan Radio Co., Ltd\n70:B3:D5:AF:40:00/36\tTattile Srl\n70:B3:D5:AF:50:00/36\tNet And Print Inc.\n70:B3:D5:AF:60:00/36\tS.C.E. srl\n70:B3:D5:AF:70:00/36\tDimoSystems BV\n70:B3:D5:AF:80:00/36\tboekel\n70:B3:D5:AF:90:00/36\tCritical Link LLC\n70:B3:D5:AF:A0:00/36\tPower Security Systems Ltd.\n70:B3:D5:AF:B0:00/36\tShanghai Tianhe Automation Instrumentation Co., Ltd.\n70:B3:D5:AF:C0:00/36\tBAE Systems\n70:B3:D5:AF:D0:00/36\tdongsheng\n70:B3:D5:AF:E0:00/36\tMesotechnic\n70:B3:D5:AF:F0:00/36\tdigital-spice\n70:B3:D5:B0:00:00/36\tHoriba Abx Sas\n70:B3:D5:B0:10:00/36\tG.S.D Group Inc.\n70:B3:D5:B0:20:00/36\tNordic Automation Systems AS\n70:B3:D5:B0:30:00/36\tSprintshield d.o.o.\n70:B3:D5:B0:40:00/36\tHerrmann Datensysteme GmbH\n70:B3:D5:B0:50:00/36\tE-Plus Technology Co., Ltd\n70:B3:D5:B0:60:00/36\tMultivoice Llc\n70:B3:D5:B0:70:00/36\tArrowvale Electronics\n70:B3:D5:B0:80:00/36\tSecuinfo Co. Ltd\n70:B3:D5:B0:90:00/36\tFirst Light Imaging\n70:B3:D5:B0:A0:00/36\tMitsubishi Electric India Pvt. Ltd.\n70:B3:D5:B0:B0:00/36\tInternet Protocolo Logica Sl\n70:B3:D5:B0:C0:00/36\tVigilate srl\n70:B3:D5:B0:D0:00/36\tAlfi\n70:B3:D5:B0:E0:00/36\tServotronix Motion Control\n70:B3:D5:B0:F0:00/36\tmerkur Funksysteme AG\n70:B3:D5:B1:00:00/36\tZumbach Electronic AG\n70:B3:D5:B1:10:00/36\tCab S.R.L.\n70:B3:D5:B1:20:00/36\tVteq\n70:B3:D5:B1:30:00/36\tOmwave\n70:B3:D5:B1:40:00/36\tPantherun Technologies Pvt Ltd\n70:B3:D5:B1:50:00/36\tEta Beta Srl\n70:B3:D5:B1:60:00/36\tXi'An Shenming Electron Technology Co.,Ltd\n70:B3:D5:B1:70:00/36\tIntesens\n70:B3:D5:B1:80:00/36\tAbbas, a.s.\n70:B3:D5:B1:90:00/36\tBrayden Automation Corp\n70:B3:D5:B1:A0:00/36\tAaronia AG\n70:B3:D5:B1:B0:00/36\tTechnology Link Corporation\n70:B3:D5:B1:C0:00/36\tServeron / Qualitrol\n70:B3:D5:B1:D0:00/36\tSafelet BV\n70:B3:D5:B1:E0:00/36\tFen Systems Ltd\n70:B3:D5:B1:F0:00/36\tTecnowatt\n70:B3:D5:B2:00:00/36\tICT BUSINESS GROUP of Humanrights Center for disabled people\n70:B3:D5:B2:10:00/36\tTattile Srl\n70:B3:D5:B2:20:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:B2:30:00/36\tSupervision Test et Pilotage\n70:B3:D5:B2:40:00/36\tDatasat Digital Entertainment\n70:B3:D5:B2:50:00/36\tHifocus Electronics India Private Limited\n70:B3:D5:B2:60:00/36\tINTEC International GmbH\n70:B3:D5:B2:70:00/36\tNaval Group\n70:B3:D5:B2:80:00/36\tHUSTY M.Styczen J.Hupert sp.j.\n70:B3:D5:B2:90:00/36\tWiViCom Co., Ltd.\n70:B3:D5:B2:A0:00/36\tMyro Control, LLC\n70:B3:D5:B2:B0:00/36\tVtron Pty Ltd\n70:B3:D5:B2:C0:00/36\tElman srl\n70:B3:D5:B2:D0:00/36\tPlexus\n70:B3:D5:B2:E0:00/36\tGreen Access Ltd\n70:B3:D5:B2:F0:00/36\tHermann Automation GmbH\n70:B3:D5:B3:00:00/36\tSystolé Hardware B.V.\n70:B3:D5:B3:10:00/36\tQwave Inc\n70:B3:D5:B3:20:00/36\tGridBeyond\n70:B3:D5:B3:30:00/36\tAplex Technology Inc.\n70:B3:D5:B3:40:00/36\tMedtronic\n70:B3:D5:B3:50:00/36\tRexxam Co.,Ltd.\n70:B3:D5:B3:60:00/36\tCetitec GmbH\n70:B3:D5:B3:70:00/36\tCODEC Co., Ltd.\n70:B3:D5:B3:80:00/36\tGoTrustID Inc.\n70:B3:D5:B3:90:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:B3:A0:00/36\tAdigitalmedia\n70:B3:D5:B3:B0:00/36\tInsitu, Inc\n70:B3:D5:B3:C0:00/36\tDorlet Sau\n70:B3:D5:B3:D0:00/36\tInras GmbH\n70:B3:D5:B3:E0:00/36\tParadigm Communication Systems Ltd\n70:B3:D5:B3:F0:00/36\tOrbit International\n70:B3:D5:B4:00:00/36\tWuhan Xingtuxinke ELectronic Co.,Ltd\n70:B3:D5:B4:10:00/36\tT&M Media Pty Ltd\n70:B3:D5:B4:20:00/36\tSamwell International Inc\n70:B3:D5:B4:30:00/36\tZao Zeo\n70:B3:D5:B4:40:00/36\tENTEC Electric & Electronic Co., LTD.\n70:B3:D5:B4:50:00/36\tHon Hai Precision IND.CO.,LTD\n70:B3:D5:B4:60:00/36\tFAS Electronics (Fujian) Co.,LTD.\n70:B3:D5:B4:70:00/36\tDSIT Solutions LTD\n70:B3:D5:B4:80:00/36\tDWQ Informatikai Tanacsado es Vezerlestechnikai KFT\n70:B3:D5:B4:90:00/36\tAnalogics Tech India Ltd\n70:B3:D5:B4:A0:00/36\tMedex\n70:B3:D5:B4:B0:00/36\tNetwork Customizing Technologies Inc\n70:B3:D5:B4:C0:00/36\tAmericanPharma Technologies\n70:B3:D5:B4:D0:00/36\tAvidbots Corporation\n70:B3:D5:B4:F0:00/36\tAvMap srlu\n70:B3:D5:B5:00:00/36\tiGrid T&D\n70:B3:D5:B5:10:00/36\tCritical Link LLC\n70:B3:D5:B5:20:00/36\tAEye, Inc.\n70:B3:D5:B5:30:00/36\tRevolution Retail Systems, LLC\n70:B3:D5:B5:40:00/36\tPacket Power\n70:B3:D5:B5:50:00/36\tCtag - Esg36871424\n70:B3:D5:B5:60:00/36\tPower Electronics Espana, S.L.\n70:B3:D5:B5:70:00/36\tShanghai Qinyue Communication Technology Co., Ltd.\n70:B3:D5:B5:80:00/36\tInternet Protocolo Logica Sl\n70:B3:D5:B5:90:00/36\tFutureTechnologyLaboratories INC.\n70:B3:D5:B5:A0:00/36\tGTI Technologies Inc\n70:B3:D5:B5:B0:00/36\tDynaMount LLC\n70:B3:D5:B5:C0:00/36\tProzess Technologie\n70:B3:D5:B5:D0:00/36\tShandhai Landleaf Architecture Technology Co.,Ltd\n70:B3:D5:B5:E0:00/36\tDynics\n70:B3:D5:B5:F0:00/36\tCrdmdeveoppements\n70:B3:D5:B6:00:00/36\tZao Zeo\n70:B3:D5:B6:10:00/36\tWuXi anktech Co., Ltd\n70:B3:D5:B6:20:00/36\tSakura Seiki Co.,Ltd.\n70:B3:D5:B6:30:00/36\tIdeas srl\n70:B3:D5:B6:40:00/36\tOsung Lst Co.,Ltd.\n70:B3:D5:B6:50:00/36\tRotem Industry LTD\n70:B3:D5:B6:60:00/36\tSilent Gliss International Ltd\n70:B3:D5:B6:70:00/36\tRedWave Labs Ltd\n70:B3:D5:B6:80:00/36\tS-Rain Control A/S\n70:B3:D5:B6:90:00/36\tDaatrics LTD\n70:B3:D5:B6:A0:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:B6:B0:00/36\tCambria Corporation\n70:B3:D5:B6:C0:00/36\tGHM-Messtechnik GmbH (Standort IMTRON)\n70:B3:D5:B6:D0:00/36\tMovis\n70:B3:D5:B6:E0:00/36\tEdgeware AB\n70:B3:D5:B6:F0:00/36\tIntegra Metering SAS\n70:B3:D5:B7:00:00/36\tTorion Plasma Corporation\n70:B3:D5:B7:10:00/36\tOptiver Pty Ltd\n70:B3:D5:B7:20:00/36\tUB330.net d.o.o.\n70:B3:D5:B7:30:00/36\tCetto Industries\n70:B3:D5:B7:40:00/36\tOnYield Inc Ltd\n70:B3:D5:B7:50:00/36\tGrossenbacher Systeme AG\n70:B3:D5:B7:60:00/36\tAtl-Sd\n70:B3:D5:B7:70:00/36\tMotec Pty Ltd\n70:B3:D5:B7:80:00/36\tHOERMANN GmbH\n70:B3:D5:B7:90:00/36\tDadacon GmbH\n70:B3:D5:B7:A0:00/36\tMahle\n70:B3:D5:B7:B0:00/36\tDoosan Digital Innovation America\n70:B3:D5:B7:C0:00/36\tElectronic Navigation Ltd\n70:B3:D5:B7:D0:00/36\tLOGIX ITS Inc\n70:B3:D5:B7:E0:00/36\tElbit Systems of America\n70:B3:D5:B7:F0:00/36\tJSK System\n70:B3:D5:B8:00:00/36\tBighouse.,Inc.\n70:B3:D5:B8:10:00/36\tInstro Precision Limited\n70:B3:D5:B8:20:00/36\tLookout Portable Security\n70:B3:D5:B8:30:00/36\tMatrix Telematics Limited\n70:B3:D5:B8:40:00/36\tOOO Research and Production Center \"Computer Technologies\"\n70:B3:D5:B8:50:00/36\tFenotech Inc.\n70:B3:D5:B8:60:00/36\tHilo\n70:B3:D5:B8:70:00/36\tCAITRON GmbH\n70:B3:D5:B8:80:00/36\tARP Corporation\n70:B3:D5:B8:90:00/36\tIda\n70:B3:D5:B8:A0:00/36\tNexus Tech. VN\n70:B3:D5:B8:B0:00/36\tProfound Medical Inc.\n70:B3:D5:B8:C0:00/36\tePOINT Embedded Computing Limited\n70:B3:D5:B8:D0:00/36\tJungwooEng Co., Ltd\n70:B3:D5:B8:E0:00/36\tUr Fog S.R.L.\n70:B3:D5:B8:F0:00/36\tAssembly Contracts Ltd\n70:B3:D5:B9:00:00/36\tAmico Corporation\n70:B3:D5:B9:10:00/36\tDynetics, Inc.\n70:B3:D5:B9:20:00/36\tN A Communications LLC\n70:B3:D5:B9:30:00/36\tInternet Protocolo Logica Sl\n70:B3:D5:B9:40:00/36\tCygnetic Technologies (Pty) Ltd\n70:B3:D5:B9:50:00/36\tEPIImaging\n70:B3:D5:B9:60:00/36\tOculii\n70:B3:D5:B9:70:00/36\tCanam Technology, Inc.\n70:B3:D5:B9:80:00/36\tGSF Corporation Pte Ltd\n70:B3:D5:B9:90:00/36\tDomoSafety S.A.\n70:B3:D5:B9:A0:00/36\tPotter Electric Signal Co. LLC\n70:B3:D5:B9:B0:00/36\tElektronik Art\n70:B3:D5:B9:C0:00/36\tEDCO Technology 1993 ltd\n70:B3:D5:B9:D0:00/36\tConclusive Engineering\n70:B3:D5:B9:E0:00/36\tPolsystem Si Sp. Z O.O., S.K.A.\n70:B3:D5:B9:F0:00/36\tYuksek Kapasite Radyolink Sistemleri San. ve Tic. A.S.\n70:B3:D5:BA:00:00/36\tSeason Electronics Ltd\n70:B3:D5:BA:10:00/36\tCathwell AS\n70:B3:D5:BA:20:00/36\tMAMAC Systems, Inc.\n70:B3:D5:BA:30:00/36\tTiama\n70:B3:D5:BA:40:00/36\tEiwa Giken Inc.\n70:B3:D5:BA:50:00/36\tfpgalabs.com\n70:B3:D5:BA:60:00/36\tGluon Solutions Inc.\n70:B3:D5:BA:70:00/36\tDigital Yacht Ltd\n70:B3:D5:BA:80:00/36\tControlled Power Company\n70:B3:D5:BA:90:00/36\tAlma\n70:B3:D5:BA:A0:00/36\tDevice Solutions Ltd\n70:B3:D5:BA:B0:00/36\tAxotec Technologies GmbH\n70:B3:D5:BA:C0:00/36\tAdInte, inc.\n70:B3:D5:BA:D0:00/36\tTechnik & Design GmbH\n70:B3:D5:BA:E0:00/36\tWarecube,Inc\n70:B3:D5:BA:F0:00/36\tSYS TEC electronic GmbH\n70:B3:D5:BB:00:00/36\tWicell Technology\n70:B3:D5:BB:10:00/36\tLumiplan Duhamel\n70:B3:D5:BB:20:00/36\tMettler Toledo\n70:B3:D5:BB:30:00/36\tAPG Cash Drawer, LLC\n70:B3:D5:BB:40:00/36\tIntegritech\n70:B3:D5:BB:50:00/36\tGrossenbacher Systeme AG\n70:B3:D5:BB:60:00/36\tFranke Aquarotter GmbH\n70:B3:D5:BB:70:00/36\tInnoflight, Inc.\n70:B3:D5:BB:80:00/36\tAl Kamel Systems S.L.\n70:B3:D5:BB:90:00/36\tKOSMEK.Ltd\n70:B3:D5:BB:A0:00/36\tSamriddi Automations Pvt. Ltd.\n70:B3:D5:BB:B0:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:BB:C0:00/36\tBoundary Technologies Ltd\n70:B3:D5:BB:D0:00/36\tProvidius Corp\n70:B3:D5:BB:E0:00/36\tSunrise Systems Electronics Co. Inc.\n70:B3:D5:BB:F0:00/36\tEnsys srl\n70:B3:D5:BC:00:00/36\tSenso2Me\n70:B3:D5:BC:10:00/36\tAbionic\n70:B3:D5:BC:20:00/36\tDWEWOONG ELECTRIC Co., Ltd.\n70:B3:D5:BC:30:00/36\teWireless\n70:B3:D5:BC:40:00/36\tDigital Media Professionals\n70:B3:D5:BC:50:00/36\tU&R GmbH Hardware- und Systemdesign\n70:B3:D5:BC:60:00/36\tHatteland Display AS\n70:B3:D5:BC:70:00/36\tAutonomic Controls, Inc.\n70:B3:D5:BC:80:00/36\tLoma Systems s.r.o.\n70:B3:D5:BC:90:00/36\tYite technology\n70:B3:D5:BC:A0:00/36\tDeymed Diagnostic\n70:B3:D5:BC:B0:00/36\tSmart Vision Lights\n70:B3:D5:BC:C0:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:BC:D0:00/36\tSasken Technologies Ltd\n70:B3:D5:BC:E0:00/36\tYawata Electric Industrial Co.,Ltd.\n70:B3:D5:BC:F0:00/36\tAPG Cash Drawer, LLC\n70:B3:D5:BD:00:00/36\tShs Srl\n70:B3:D5:BD:10:00/36\tCableLabs\n70:B3:D5:BD:20:00/36\tBurk Technology\n70:B3:D5:BD:30:00/36\tFotona D.D.\n70:B3:D5:BD:40:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:BD:50:00/36\tSynics AG\n70:B3:D5:BD:60:00/36\tConsarc Corporation\n70:B3:D5:BD:70:00/36\tTT Group SRL\n70:B3:D5:BD:80:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:BD:90:00/36\tSolwayTech\n70:B3:D5:BD:A0:00/36\t5-D Systems, Inc.\n70:B3:D5:BD:B0:00/36\tPower Electronics Espana, S.L.\n70:B3:D5:BD:C0:00/36\tEDF Lab\n70:B3:D5:BD:D0:00/36\tCdr Srl\n70:B3:D5:BD:E0:00/36\tCAST Group of Companies Inc.\n70:B3:D5:BD:F0:00/36\tH2O-Yug Llc\n70:B3:D5:BE:00:00/36\tCognosos, Inc.\n70:B3:D5:BE:10:00/36\tFeCon GmbH\n70:B3:D5:BE:20:00/36\tNocix, LLC\n70:B3:D5:BE:30:00/36\tSaratov Electrounit Production Plant named after Sergo Ordzhonikidze, OJSC\n70:B3:D5:BE:40:00/36\tKunshan excellent Intelligent Technology Co., Ltd.\n70:B3:D5:BE:50:00/36\tPantec Engineering AG\n70:B3:D5:BE:60:00/36\tCCII Systems (Pty) Ltd\n70:B3:D5:BE:70:00/36\tSyscom Instruments SA\n70:B3:D5:BE:80:00/36\tAndFun Co.,Ltd.\n70:B3:D5:BE:90:00/36\tTelecast Inc.\n70:B3:D5:BE:A0:00/36\tVirtuosys Ltd\n70:B3:D5:BE:B0:00/36\tPotter Electric Signal Co. LLC\n70:B3:D5:BE:C0:00/36\tTokyo Communication Equipment MFG Co.,ltd.\n70:B3:D5:BE:D0:00/36\tItrinegy Ltd.\n70:B3:D5:BE:E0:00/36\tSicon srl\n70:B3:D5:BE:F0:00/36\tSensortech Systems Inc.\n70:B3:D5:BF:00:00/36\tAlfa Elettronica srl\n70:B3:D5:BF:10:00/36\tFlashnet SRL\n70:B3:D5:BF:20:00/36\tTwin Development\n70:B3:D5:BF:30:00/36\tCg-Wireless\n70:B3:D5:BF:40:00/36\tCreevX\n70:B3:D5:BF:50:00/36\tAcacia Research\n70:B3:D5:BF:60:00/36\tcomtac AG\n70:B3:D5:BF:70:00/36\tFischer Connectors\n70:B3:D5:BF:80:00/36\tRch Italia Spa\n70:B3:D5:BF:90:00/36\tOkolab Srl\n70:B3:D5:BF:A0:00/36\tNesa Srl\n70:B3:D5:BF:B0:00/36\tSensor 42\n70:B3:D5:BF:C0:00/36\tVishay Nobel AB\n70:B3:D5:BF:D0:00/36\tLumentum\n70:B3:D5:BF:E0:00/36\tAplex Technology Inc.\n70:B3:D5:BF:F0:00/36\tSunsa, Inc\n70:B3:D5:C0:00:00/36\tBESO sp. z o.o.\n70:B3:D5:C0:10:00/36\tSmartGuard LLC\n70:B3:D5:C0:20:00/36\tGarmo Instruments S.L.\n70:B3:D5:C0:30:00/36\tXAVi Technologies Corp.\n70:B3:D5:C0:40:00/36\tProlan Zrt.\n70:B3:D5:C0:50:00/36\tKST technology\n70:B3:D5:C0:60:00/36\tXotonicsMED GmbH\n70:B3:D5:C0:70:00/36\tAreco\n70:B3:D5:C0:80:00/36\tTalleres de Escoriaza SA\n70:B3:D5:C0:90:00/36\tRch Spa\n70:B3:D5:C0:A0:00/36\tInfosocket Co., Ltd.\n70:B3:D5:C0:B0:00/36\tFstudio Co Ltd\n70:B3:D5:C0:C0:00/36\tTech4Race\n70:B3:D5:C0:D0:00/36\tClarity Medical Pvt Ltd\n70:B3:D5:C0:E0:00/36\tSYSDEV Srl\n70:B3:D5:C0:F0:00/36\tHoneywell Safety Products USA, Inc\n70:B3:D5:C1:00:00/36\tScanvaegt Systems A/S\n70:B3:D5:C1:10:00/36\tAriston Thermo s.p.a.\n70:B3:D5:C1:20:00/36\tBeijing Wisetone Information Technology Co.,Ltd.\n70:B3:D5:C1:30:00/36\tGuangzhou Xianhe Technology Engineering Co., Ltd\n70:B3:D5:C1:40:00/36\tGrupo Epelsa S.L.\n70:B3:D5:C1:50:00/36\tSensobox GmbH\n70:B3:D5:C1:60:00/36\tSouthern Innovation\n70:B3:D5:C1:70:00/36\tPotter Electric Signal Co. LLC\n70:B3:D5:C1:80:00/36\tSanmina Israel\n70:B3:D5:C1:90:00/36\tZumbach Electronic AG\n70:B3:D5:C1:A0:00/36\tXylon\n70:B3:D5:C1:B0:00/36\tLabinvent JSC\n70:B3:D5:C1:C0:00/36\tD.E.M. Spa\n70:B3:D5:C1:D0:00/36\tKranze Technology Solutions, Inc.\n70:B3:D5:C1:E0:00/36\tKron Medidores\n70:B3:D5:C1:F0:00/36\tBehr Technologies Inc\n70:B3:D5:C2:00:00/36\tMipot S.p.a.\n70:B3:D5:C2:10:00/36\tAplex Technology Inc.\n70:B3:D5:C2:20:00/36\tSkyriver Communications Inc.\n70:B3:D5:C2:30:00/36\tSumitomo Heavy Industries, Ltd.\n70:B3:D5:C2:40:00/36\tElbit Systems of America\n70:B3:D5:C2:50:00/36\tspeedsignal GmbH\n70:B3:D5:C2:60:00/36\tTriple Play Communications\n70:B3:D5:C2:70:00/36\tGD Mission Systems\n70:B3:D5:C2:80:00/36\tMitech Integrated Systems Inc.\n70:B3:D5:C2:90:00/36\tSoftland India Ltd\n70:B3:D5:C2:A0:00/36\tArray Telepresence\n70:B3:D5:C2:B0:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:C2:C0:00/36\tDromont S.p.A.\n70:B3:D5:C2:D0:00/36\tEnsotech Limited\n70:B3:D5:C2:E0:00/36\tTriax A/S\n70:B3:D5:C2:F0:00/36\tATBiS Co.,Ltd\n70:B3:D5:C3:00:00/36\tPolskie Sady Nowe Podole Sp. z o.o.\n70:B3:D5:C3:10:00/36\tGerman Power GmbH\n70:B3:D5:C3:20:00/36\tInfrasafe/ Advantor Systems\n70:B3:D5:C3:30:00/36\tDandong Dongfang Measurement & Control Technology Co., Ltd.\n70:B3:D5:C3:40:00/36\tTechnical Panels Co. Ltd.\n70:B3:D5:C3:50:00/36\tVibrationmaster\n70:B3:D5:C3:60:00/36\tKnowledge Resources GmbH\n70:B3:D5:C3:70:00/36\tKeycom Corp.\n70:B3:D5:C3:80:00/36\tCresprit Inc.\n70:B3:D5:C3:90:00/36\tMeshWorks Wireless Oy\n70:B3:D5:C3:A0:00/36\tHan Chang\n70:B3:D5:C3:B0:00/36\tVironova AB\n70:B3:D5:C3:C0:00/36\tPeek Traffic\n70:B3:D5:C3:D0:00/36\tCISTECH Solutions\n70:B3:D5:C3:E0:00/36\tDosadores Alltronic\n70:B3:D5:C3:F0:00/36\tCode Blue Corporation\n70:B3:D5:C4:00:00/36\tHongSeok Ltd.\n70:B3:D5:C4:10:00/36\tMerlin CSI\n70:B3:D5:C4:20:00/36\tCrde\n70:B3:D5:C4:30:00/36\tFuture Skies\n70:B3:D5:C4:40:00/36\tFranz Kessler GmbH\n70:B3:D5:C4:50:00/36\tStiebel Eltron Gmbh & Co. Kg\n70:B3:D5:C4:60:00/36\teumig industrie-TV GmbH.\n70:B3:D5:C4:70:00/36\tAbb\n70:B3:D5:C4:80:00/36\tWeltek Technologies Co. Ltd.\n70:B3:D5:C4:90:00/36\tBTG Instruments AB\n70:B3:D5:C4:A0:00/36\tTiama\n70:B3:D5:C4:B0:00/36\tAnker-East\n70:B3:D5:C4:C0:00/36\tVTC Digicom\n70:B3:D5:C4:D0:00/36\tRADA Electronics Industries Ltd.\n70:B3:D5:C4:E0:00/36\tARKRAY, Inc. Kyoto Laboratory\n70:B3:D5:C4:F0:00/36\tAE Van de Vliet BVBA\n70:B3:D5:C5:00:00/36\tCombilent\n70:B3:D5:C5:10:00/36\tInnotas Elektronik GmbH\n70:B3:D5:C5:20:00/36\tsensorway\n70:B3:D5:C5:30:00/36\tS Labs sp. z o.o.\n70:B3:D5:C5:40:00/36\tFlexsolution APS\n70:B3:D5:C5:50:00/36\tIntelligent Energy Ltd\n70:B3:D5:C5:60:00/36\tTeletask\n70:B3:D5:C5:70:00/36\teBZ GmbH\n70:B3:D5:C5:80:00/36\tRMI Laser LLC\n70:B3:D5:C5:90:00/36\tR Cubed Engineering, LLC\n70:B3:D5:C5:A0:00/36\tCommsignia Ltd.\n70:B3:D5:C5:B0:00/36\tACD Elektronik GmbH\n70:B3:D5:C5:C0:00/36\tLayer Logic Inc\n70:B3:D5:C5:D0:00/36\tFoshan Shilantian Network S.T. Co., Ltd.\n70:B3:D5:C5:E0:00/36\tFrog Cellsat Limited\n70:B3:D5:C5:F0:00/36\tClean-Lasersysteme GmbH\n70:B3:D5:C6:00:00/36\tGogo BA\n70:B3:D5:C6:10:00/36\tJc Hunter Technologies\n70:B3:D5:C6:20:00/36\tWiznova\n70:B3:D5:C6:30:00/36\tXentech Solutions Limited\n70:B3:D5:C6:40:00/36\tSYS TEC electronic GmbH\n70:B3:D5:C6:50:00/36\tPeek Traffic\n70:B3:D5:C6:60:00/36\tBlue Access Inc\n70:B3:D5:C6:70:00/36\tCollini Dienstleistungs GmbH\n70:B3:D5:C6:80:00/36\tMini Solution Co. Ltd.\n70:B3:D5:C6:90:00/36\tAz-Technology Sdn Bhd\n70:B3:D5:C6:A0:00/36\tPrivate\n70:B3:D5:C6:B0:00/36\tHerholdt Controls srl\n70:B3:D5:C6:C0:00/36\tMcQ Inc\n70:B3:D5:C6:D0:00/36\tCyviz AS\n70:B3:D5:C6:E0:00/36\tOrion Technologies, LLC\n70:B3:D5:C6:F0:00/36\tnyantec GmbH\n70:B3:D5:C7:00:00/36\tMagnetek\n70:B3:D5:C7:10:00/36\tThe Engineerix Group\n70:B3:D5:C7:20:00/36\tScharco Elektronik GmbH\n70:B3:D5:C7:30:00/36\tC.D.N.Corporation\n70:B3:D5:C7:40:00/36\tQtechnology A/S\n70:B3:D5:C7:50:00/36\tPlanet Innovation Products Inc.\n70:B3:D5:C7:60:00/36\tEla Innovation\n70:B3:D5:C7:70:00/36\tYönnet Akıllı Bina ve Otomasyon Sistemleri\n70:B3:D5:C7:80:00/36\tNETA Elektronik AS\n70:B3:D5:C7:90:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:C7:A0:00/36\tENTEC Electric & Electronic Co., LTD.\n70:B3:D5:C7:B0:00/36\tEM Clarity Pty Ltd\n70:B3:D5:C7:C0:00/36\tBeijing Aumiwalker technology CO.,LTD\n70:B3:D5:C7:D0:00/36\tMetatronics B.V.\n70:B3:D5:C7:E0:00/36\tBirdDog Australia\n70:B3:D5:C7:F0:00/36\tTattile Srl\n70:B3:D5:C8:00:00/36\tLink Care Services\n70:B3:D5:C8:10:00/36\tDsp Design\n70:B3:D5:C8:20:00/36\tSicon srl\n70:B3:D5:C8:30:00/36\tCertusNet Inc.\n70:B3:D5:C8:40:00/36\tLinc Technology Corporation dba Data-Linc Group\n70:B3:D5:C8:50:00/36\tSolid State Disks Ltd\n70:B3:D5:C8:60:00/36\tWoodam Co., Ltd.\n70:B3:D5:C8:70:00/36\tSiemens AG\n70:B3:D5:C8:80:00/36\tSINED srl\n70:B3:D5:C8:90:00/36\tArd\n70:B3:D5:C8:A0:00/36\tWTE Limited\n70:B3:D5:C8:B0:00/36\tAsia Pacific Satellite Coummunication Inc.\n70:B3:D5:C8:C0:00/36\tRollogo Limited\n70:B3:D5:C8:D0:00/36\tKST technology\n70:B3:D5:C8:E0:00/36\tCoral Telecom Limited\n70:B3:D5:C8:F0:00/36\tTrident Infosol Pvt Ltd\n70:B3:D5:C9:00:00/36\tDiretta\n70:B3:D5:C9:10:00/36\tGrossenbacher Systeme AG\n70:B3:D5:C9:20:00/36\tUnitro Fleischmann\n70:B3:D5:C9:30:00/36\tGMI Ltd\n70:B3:D5:C9:40:00/36\tVars Technology\n70:B3:D5:C9:50:00/36\tChengdu Meihuan Technology Co., Ltd\n70:B3:D5:C9:60:00/36\tUni Dimenxi Sdn Bhd\n70:B3:D5:C9:70:00/36\tCsinfotel\n70:B3:D5:C9:80:00/36\tTrust Automation\n70:B3:D5:C9:90:00/36\tRemote Diagnostic Technologies Ltd\n70:B3:D5:C9:A0:00/36\tTodd Digital Limited\n70:B3:D5:C9:B0:00/36\tTieto Sweden AB\n70:B3:D5:C9:C0:00/36\tConnected Response\n70:B3:D5:C9:D0:00/36\tAPG Cash Drawer, LLC\n70:B3:D5:C9:E0:00/36\tFukuda Sangyo Co., Ltd.\n70:B3:D5:C9:F0:00/36\tTriax A/S\n70:B3:D5:CA:00:00/36\tXirgo Technologies LLC\n70:B3:D5:CA:10:00/36\tWaldo System\n70:B3:D5:CA:20:00/36\tDe Haardt bv\n70:B3:D5:CA:30:00/36\tSaankhya Labs Private Limited\n70:B3:D5:CA:40:00/36\tNetemera Sp. z o.o.\n70:B3:D5:CA:50:00/36\tPTS Technologies Pte Ltd\n70:B3:D5:CA:60:00/36\tAxing Ag\n70:B3:D5:CA:70:00/36\ti-View Communication Inc.\n70:B3:D5:CA:80:00/36\tGrupo Epelsa S.L.\n70:B3:D5:CA:90:00/36\tNxcontrol system Co., Ltd.\n70:B3:D5:CA:A0:00/36\tBel Power Solutions GmbH\n70:B3:D5:CA:B0:00/36\tNOTICE Co., Ltd.\n70:B3:D5:CA:C0:00/36\tCrde\n70:B3:D5:CA:D0:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:CA:E0:00/36\tThema\n70:B3:D5:CA:F0:00/36\tDave Srl\n70:B3:D5:CB:00:00/36\tOssiaco\n70:B3:D5:CB:10:00/36\tRadar\n70:B3:D5:CB:20:00/36\tSeclab\n70:B3:D5:CB:30:00/36\tKST technology\n70:B3:D5:CB:40:00/36\tPlanewave Instruments\n70:B3:D5:CB:50:00/36\tAtlas Lighting Products\n70:B3:D5:CB:60:00/36\tKuebrich Ingeniergesellschaft mbh & Co. KG\n70:B3:D5:CB:70:00/36\tHKC Security Ltd.\n70:B3:D5:CB:80:00/36\tVerti Tecnologia\n70:B3:D5:CB:90:00/36\tJsc «Satis-Tl-94»\n70:B3:D5:CB:A0:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:CB:B0:00/36\tPostmark Incorporated\n70:B3:D5:CB:C0:00/36\tProcon Electronics Pty Ltd\n70:B3:D5:CB:D0:00/36\tPreo Industries Far East Ltd\n70:B3:D5:CB:E0:00/36\tEnsura Solutions BV\n70:B3:D5:CB:F0:00/36\tCubic ITS, Inc. dba GRIDSMART Technologies\n70:B3:D5:CC:00:00/36\tAvionica\n70:B3:D5:CC:10:00/36\tBEEcube Inc.\n70:B3:D5:CC:20:00/36\tLSC Lighting Systems (Aust) Pty Ltd\n70:B3:D5:CC:30:00/36\tFidalia Networks Inc\n70:B3:D5:CC:40:00/36\tBenchmark Electronics BV\n70:B3:D5:CC:50:00/36\tIntecom\n70:B3:D5:CC:60:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:CC:70:00/36\tSOtM\n70:B3:D5:CC:80:00/36\tProfen Communications\n70:B3:D5:CC:90:00/36\tRapiscan Systems\n70:B3:D5:CC:A0:00/36\tSiemens As\n70:B3:D5:CC:B0:00/36\tRealD, Inc.\n70:B3:D5:CC:C0:00/36\tAEC s.r.l.\n70:B3:D5:CC:D0:00/36\tSuzhou PowerCore Technology Co.,Ltd.\n70:B3:D5:CC:E0:00/36\tProconex 2010 Inc.\n70:B3:D5:CC:F0:00/36\tNetberg\n70:B3:D5:CD:00:00/36\tEllenex Pty Ltd\n70:B3:D5:CD:10:00/36\tCannex Technology Inc.\n70:B3:D5:CD:20:00/36\tTRUMPF Huttinger GmbH + Co. KG,\n70:B3:D5:CD:30:00/36\tControlrad\n70:B3:D5:CD:40:00/36\tSouthern Ground Audio LLC\n70:B3:D5:CD:50:00/36\tApantac LLC\n70:B3:D5:CD:60:00/36\tVideoRay LLC\n70:B3:D5:CD:70:00/36\tAutomationX GmbH\n70:B3:D5:CD:80:00/36\tNexus Electric S.A.\n70:B3:D5:CD:90:00/36\tPeter Huber Kaeltemaschinenbau SE\n70:B3:D5:CD:A0:00/36\tVitec\n70:B3:D5:CD:B0:00/36\tWuhan Xingtuxinke ELectronic Co.,Ltd\n70:B3:D5:CD:C0:00/36\tDat-Con d.o.o.\n70:B3:D5:CD:D0:00/36\tTeneo IoT B.V.\n70:B3:D5:CD:E0:00/36\tMultipure International\n70:B3:D5:CD:F0:00/36\t3D Printing Specialists\n70:B3:D5:CE:00:00/36\tM.S. Control\n70:B3:D5:CE:10:00/36\tEA Elektroautomatik GmbH & Co. KG\n70:B3:D5:CE:20:00/36\tCentero\n70:B3:D5:CE:30:00/36\tDalcnet srl\n70:B3:D5:CE:40:00/36\tWaves System\n70:B3:D5:CE:50:00/36\tGridBridge Inc\n70:B3:D5:CE:60:00/36\tDynim Oy\n70:B3:D5:CE:70:00/36\tJune Automation Singapore Pte. Ltd.\n70:B3:D5:CE:80:00/36\tGrossenbacher Systeme AG\n70:B3:D5:CE:90:00/36\tKinemetrics\n70:B3:D5:CE:A0:00/36\tComputerwise, Inc.\n70:B3:D5:CE:B0:00/36\tXirgo Technologies LLC\n70:B3:D5:CE:C0:00/36\tDeltronic Security AB\n70:B3:D5:CE:D0:00/36\tAdvanced Products Corporation Pte Ltd\n70:B3:D5:CE:E0:00/36\tACRIOS Systems s.r.o.\n70:B3:D5:CE:F0:00/36\tEllego Powertec Oy\n70:B3:D5:CF:00:00/36\tShenzhen Witlink Co.,Ltd.\n70:B3:D5:CF:10:00/36\tLightDec GmbH & Co. KG\n70:B3:D5:CF:20:00/36\ttinnos\n70:B3:D5:CF:30:00/36\tMesh Motion Inc\n70:B3:D5:CF:40:00/36\tHarbin Cheng Tian Technology Development Co., Ltd.\n70:B3:D5:CF:50:00/36\tPetring Energietechnik GmbH\n70:B3:D5:CF:60:00/36\tTornado Modular Systems\n70:B3:D5:CF:70:00/36\tGentec Electro-Optics\n70:B3:D5:CF:80:00/36\tIdneo Technologies S.A.U.\n70:B3:D5:CF:90:00/36\tBreas Medical AB\n70:B3:D5:CF:A0:00/36\tScheiber\n70:B3:D5:CF:B0:00/36\tScreen Innovations\n70:B3:D5:CF:C0:00/36\tVeilux Inc.\n70:B3:D5:CF:D0:00/36\tiLOQ Oy\n70:B3:D5:CF:E0:00/36\tSecturion Systems\n70:B3:D5:CF:F0:00/36\tDTECH Labs, Inc.\n70:B3:D5:D0:00:00/36\tDKI Technology Co., Ltd\n70:B3:D5:D0:10:00/36\tVision4ce Ltd\n70:B3:D5:D0:20:00/36\tArctos Showlasertechnik GmbH\n70:B3:D5:D0:30:00/36\tDigitella Inc.\n70:B3:D5:D0:40:00/36\tPlenty Unlimited Inc\n70:B3:D5:D0:50:00/36\tColmek\n70:B3:D5:D0:60:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:D0:70:00/36\tWaversa Systems\n70:B3:D5:D0:80:00/36\tVeeco Instruments\n70:B3:D5:D0:90:00/36\tRishaad Brown\n70:B3:D5:D0:A0:00/36\tPrivate\n70:B3:D5:D0:B0:00/36\tVendanor AS\n70:B3:D5:D0:C0:00/36\tConnor Winfield LTD\n70:B3:D5:D0:D0:00/36\tLogiwaste AB\n70:B3:D5:D0:E0:00/36\tBeijing Aumiwalker technology CO.,LTD\n70:B3:D5:D0:F0:00/36\tAlto Aviation\n70:B3:D5:D1:00:00/36\tContec Americas Inc.\n70:B3:D5:D1:10:00/36\tEREE Electronique\n70:B3:D5:D1:20:00/36\tFideltronik Poland Sp. Z O.O.\n70:B3:D5:D1:30:00/36\tIRT Technologies\n70:B3:D5:D1:40:00/36\tLigpt\n70:B3:D5:D1:50:00/36\t3DGence sp. z o.o.\n70:B3:D5:D1:60:00/36\tMonnit Corporation\n70:B3:D5:D1:70:00/36\tPower Element\n70:B3:D5:D1:80:00/36\tMetCom Solutions GmbH\n70:B3:D5:D1:90:00/36\tSenior Group LLC\n70:B3:D5:D1:A0:00/36\tMonnit Corporation\n70:B3:D5:D1:B0:00/36\tGrupo Epelsa S.L.\n70:B3:D5:D1:C0:00/36\tSpecialised Imaging Limited\n70:B3:D5:D1:D0:00/36\tStuyts Engineering Haarlem BV\n70:B3:D5:D1:E0:00/36\tHouston Radar LLC\n70:B3:D5:D1:F0:00/36\tEmbsec AB\n70:B3:D5:D2:00:00/36\tRheonics GmbH\n70:B3:D5:D2:10:00/36\tbiosilver .co.,ltd\n70:B3:D5:D2:20:00/36\tDEK Technologies\n70:B3:D5:D2:30:00/36\tCOTT Electronics\n70:B3:D5:D2:40:00/36\tMicrotronics Engineering GmbH\n70:B3:D5:D2:50:00/36\tENGenesis\n70:B3:D5:D2:60:00/36\tMI Inc.\n70:B3:D5:D2:70:00/36\tLight field Lab\n70:B3:D5:D2:80:00/36\tToshiba Electron Tubes & Devices Co., Ltd.\n70:B3:D5:D2:90:00/36\tSportzcast\n70:B3:D5:D2:A0:00/36\tITsynergy Ltd\n70:B3:D5:D2:B0:00/36\tStreamPlay Oy Ltd\n70:B3:D5:D2:C0:00/36\tmicroWerk GmbH\n70:B3:D5:D2:D0:00/36\tEvolute Systems Private Limited\n70:B3:D5:D2:E0:00/36\tCoheros Oy\n70:B3:D5:D2:F0:00/36\tL.I.F.E. Corporation SA\n70:B3:D5:D3:00:00/36\tLeica Microsystems Ltd. Shanghai\n70:B3:D5:D3:10:00/36\tSolace Systems Inc.\n70:B3:D5:D3:20:00/36\tEuklis by GSG International\n70:B3:D5:D3:30:00/36\tVector.Co.,Ltd.\n70:B3:D5:D3:40:00/36\tG-Philos Co.,Ltd\n70:B3:D5:D3:50:00/36\tKing-On Technology Ltd.\n70:B3:D5:D3:60:00/36\tInsitu Inc.\n70:B3:D5:D3:70:00/36\tSicon srl\n70:B3:D5:D3:80:00/36\tVista Research, Inc.\n70:B3:D5:D3:90:00/36\tASHIDA Electronics Pvt. Ltd\n70:B3:D5:D3:A0:00/36\tPromomed Rus Llc\n70:B3:D5:D3:B0:00/36\tNimbeLink Corp\n70:B3:D5:D3:C0:00/36\tHrt\n70:B3:D5:D3:D0:00/36\tNetzikon GmbH\n70:B3:D5:D3:E0:00/36\tenders GmbH\n70:B3:D5:D3:F0:00/36\tGlobalcom Engineering Spa\n70:B3:D5:D4:00:00/36\tCrde\n70:B3:D5:D4:10:00/36\tKSE GmbH\n70:B3:D5:D4:20:00/36\tDsp Design\n70:B3:D5:D4:30:00/36\tEZSYS Co., Ltd.\n70:B3:D5:D4:40:00/36\tic-automation GmbH\n70:B3:D5:D4:50:00/36\tVemco Sp. z o. o.\n70:B3:D5:D4:60:00/36\tContineo s.r.o.\n70:B3:D5:D4:70:00/36\tYotaScope Technologies Co., Ltd.\n70:B3:D5:D4:80:00/36\tHEADROOM Broadcast GmbH\n70:B3:D5:D4:90:00/36\tSicon srl\n70:B3:D5:D4:A0:00/36\tOÜ ELIKO Tehnoloogia Arenduskeskus\n70:B3:D5:D4:B0:00/36\tHermann Lümmen GmbH\n70:B3:D5:D4:C0:00/36\tElystec Technology Co., Ltd\n70:B3:D5:D4:D0:00/36\tThe Morey Corporation\n70:B3:D5:D4:E0:00/36\tFLSmidth\n70:B3:D5:D4:F0:00/36\tC-COM Satellite Systems Inc.\n70:B3:D5:D5:00:00/36\tCubic ITS, Inc. dba GRIDSMART Technologies\n70:B3:D5:D5:10:00/36\tAzcom Technology S.r.l.\n70:B3:D5:D5:20:00/36\tSensoronic Co.,Ltd\n70:B3:D5:D5:30:00/36\tBeiLi eTek (Zhangjiagang) Co., Ltd.\n70:B3:D5:D5:40:00/36\tJL World Corporation Limited\n70:B3:D5:D5:50:00/36\tWM Design s.r.o\n70:B3:D5:D5:60:00/36\tKronotech Srl\n70:B3:D5:D5:70:00/36\tTRIUMPH BOARD a.s.\n70:B3:D5:D5:80:00/36\tIdyllic Engineering Pte Ltd\n70:B3:D5:D5:90:00/36\tWyreStorm Technologies Ltd\n70:B3:D5:D5:A0:00/36\tWyreStorm Technologies Ltd\n70:B3:D5:D5:B0:00/36\tWyreStorm Technologies Ltd\n70:B3:D5:D5:C0:00/36\tCritical Link LLC\n70:B3:D5:D5:D0:00/36\tSeasons 4 Inc\n70:B3:D5:D5:E0:00/36\tBarcelona Smart Technologies\n70:B3:D5:D5:F0:00/36\tCore Balance Co., Ltd.\n70:B3:D5:D6:00:00/36\tFlintab AB\n70:B3:D5:D6:10:00/36\tVitec\n70:B3:D5:D6:20:00/36\tAndasis Elektronik San. ve Tic. A.Ş.\n70:B3:D5:D6:30:00/36\tCrde\n70:B3:D5:D6:40:00/36\tMettler Toledo\n70:B3:D5:D6:50:00/36\tCrde\n70:B3:D5:D6:60:00/36\tAscendent Technology Group\n70:B3:D5:D6:70:00/36\tALPHA　Corporation\n70:B3:D5:D6:80:00/36\tTobi Tribe Inc.\n70:B3:D5:D6:90:00/36\tThermo Fisher Scientific\n70:B3:D5:D6:A0:00/36\tKnowRoaming\n70:B3:D5:D6:B0:00/36\tUwinloc\n70:B3:D5:D6:C0:00/36\tGP Systems GmbH\n70:B3:D5:D6:D0:00/36\tACD Elekronik GmbH\n70:B3:D5:D6:E0:00/36\tard sa\n70:B3:D5:D6:F0:00/36\tX-SPEX GmbH\n70:B3:D5:D7:00:00/36\tRational Production srl Unipersonale\n70:B3:D5:D7:10:00/36\tRZB Rudolf Zimmermann, Bamberg GmbH\n70:B3:D5:D7:20:00/36\tOnYield Inc Ltd\n70:B3:D5:D7:30:00/36\tERMINE Corporation\n70:B3:D5:D7:40:00/36\tSandia National Laboratories\n70:B3:D5:D7:50:00/36\tHyundai MNSOFT\n70:B3:D5:D7:60:00/36\tattocube systems AG\n70:B3:D5:D7:70:00/36\tPortrait Displays, Inc.\n70:B3:D5:D7:80:00/36\tNxvi Microelectronics Technology (Jinan) Co., Ltd.\n70:B3:D5:D7:90:00/36\tGOMA ELETTRONICA SpA\n70:B3:D5:D7:A0:00/36\tSpeedifi Inc\n70:B3:D5:D7:B0:00/36\tPeter Huber Kaeltemaschinenbau SE\n70:B3:D5:D7:C0:00/36\tD.T.S Illuminazione Srl\n70:B3:D5:D7:D0:00/36\tBESO sp. z o.o.\n70:B3:D5:D7:E0:00/36\tTriax A/S\n70:B3:D5:D7:F0:00/36\tConectaIP Tecnologia S.L.\n70:B3:D5:D8:00:00/36\tAMMT GmbH\n70:B3:D5:D8:10:00/36\tPDD Group Ltd\n70:B3:D5:D8:20:00/36\tSun Electronics Co.,Ltd.\n70:B3:D5:D8:30:00/36\tAkasakatec  Inc.\n70:B3:D5:D8:40:00/36\tSentry360\n70:B3:D5:D8:50:00/36\tBTG Instruments AB\n70:B3:D5:D8:60:00/36\tWPGSYS Pte Ltd\n70:B3:D5:D8:70:00/36\tZigen Corp\n70:B3:D5:D8:80:00/36\tNidec asi spa\n70:B3:D5:D8:90:00/36\tResolution Systems\n70:B3:D5:D8:A0:00/36\tJiangsu Horaintel Co.,Ltd\n70:B3:D5:D8:B0:00/36\tLenoxi Automation s.r.o.\n70:B3:D5:D8:C0:00/36\tDamerell Design Limited (DCL)\n70:B3:D5:D8:D0:00/36\tPullnet Technology,S.L.\n70:B3:D5:D8:E0:00/36\tAxatel SrL\n70:B3:D5:D8:F0:00/36\tMolu Technology Inc., LTD.\n70:B3:D5:D9:00:00/36\tAplex Technology Inc.\n70:B3:D5:D9:10:00/36\tFoodALYT GmbH\n70:B3:D5:D9:20:00/36\tZamir Recognition Systems Ltd.\n70:B3:D5:D9:30:00/36\tPAMIR Inc\n70:B3:D5:D9:40:00/36\tDewetron GmbH\n70:B3:D5:D9:50:00/36\tSANO SERVICE Co.,Ltd\n70:B3:D5:D9:60:00/36\tThermo Fisher Scientific Inc.\n70:B3:D5:D9:70:00/36\tBRS Sistemas Eletrônicos\n70:B3:D5:D9:80:00/36\tACD Elekronik GmbH\n70:B3:D5:D9:90:00/36\tNilar AB\n70:B3:D5:D9:A0:00/36\tWuhan Xingtuxinke ELectronic Co.,Ltd\n70:B3:D5:D9:B0:00/36\tRussian Telecom Equipment Company\n70:B3:D5:D9:C0:00/36\tSubinitial LLC\n70:B3:D5:D9:D0:00/36\tElectroimpact, Inc.\n70:B3:D5:D9:E0:00/36\tGrupo Epelsa S.L.\n70:B3:D5:D9:F0:00/36\t\"Digital Solutions\" JSC\n70:B3:D5:DA:00:00/36\tJiangsu Etern Compamy Limited\n70:B3:D5:DA:10:00/36\tQprel srl\n70:B3:D5:DA:20:00/36\tACD Elekronik GmbH\n70:B3:D5:DA:30:00/36\tVoleatech GmbH\n70:B3:D5:DA:40:00/36\tCrde\n70:B3:D5:DA:50:00/36\tRoboteq\n70:B3:D5:DA:60:00/36\tRedfish Group Pty Ltd\n70:B3:D5:DA:70:00/36\tNetwork Innovations\n70:B3:D5:DA:80:00/36\tTagarno AS\n70:B3:D5:DA:90:00/36\tRch Spa\n70:B3:D5:DA:A0:00/36\tAmTote Australasia\n70:B3:D5:DA:B0:00/36\tSET Power Systems GmbH\n70:B3:D5:DA:C0:00/36\tDalian Laike Technology Development Co., Ltd\n70:B3:D5:DA:D0:00/36\tGD Mission Systems\n70:B3:D5:DA:E0:00/36\tLge\n70:B3:D5:DA:F0:00/36\tInnovative Concepts And Design Llc\n70:B3:D5:DB:00:00/36\tArnouse Digital Devices Corp\n70:B3:D5:DB:10:00/36\tBiovigil Hygiene Technologies\n70:B3:D5:DB:20:00/36\tMicro Electroninc Products\n70:B3:D5:DB:30:00/36\tKlaxoon\n70:B3:D5:DB:40:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:DB:50:00/36\tXiamen Point Circle Technologh Co,ltd\n70:B3:D5:DB:60:00/36\tcsintech\n70:B3:D5:DB:70:00/36\tPengo Technology Co., Ltd\n70:B3:D5:DB:80:00/36\tSistem Sa\n70:B3:D5:DB:90:00/36\tPULOON Tech\n70:B3:D5:DB:A0:00/36\tKodenshi Corp.\n70:B3:D5:DB:B0:00/36\tFuhr GmbH Filtertechnik\n70:B3:D5:DB:C0:00/36\tGamber Johnson-LLC\n70:B3:D5:DB:D0:00/36\tTranslite Global Llc\n70:B3:D5:DB:E0:00/36\tHiber\n70:B3:D5:DB:F0:00/36\tInfodev Electronic Designers Intl.\n70:B3:D5:DC:00:00/36\tAteme\n70:B3:D5:DC:10:00/36\tMetralight, Inc.\n70:B3:D5:DC:20:00/36\tSwineTech, Inc.\n70:B3:D5:DC:30:00/36\tFath Mechatronics\n70:B3:D5:DC:40:00/36\tPeter Huber Kaeltemaschinenbau SE\n70:B3:D5:DC:50:00/36\tExcel Medical Electronics LLC\n70:B3:D5:DC:60:00/36\tIdem Inc.\n70:B3:D5:DC:70:00/36\tNUBURU Inc.\n70:B3:D5:DC:80:00/36\tEnertex Bayern GmbH\n70:B3:D5:DC:90:00/36\tSensoterra BV\n70:B3:D5:DC:A0:00/36\tDSan Corporation\n70:B3:D5:DC:B0:00/36\tMijienetrtech Co.,Ltd\n70:B3:D5:DC:C0:00/36\tEutron SPA\n70:B3:D5:DC:D0:00/36\tC Tech Bilisim Teknolojileri San. Ve Tic. A.S.\n70:B3:D5:DC:E0:00/36\tStahl GmbH\n70:B3:D5:DC:F0:00/36\tKLS Netherlands B.V.\n70:B3:D5:DD:00:00/36\tDeep Secure Limited\n70:B3:D5:DD:10:00/36\tem-tec GmbH\n70:B3:D5:DD:20:00/36\tInsitu, Inc\n70:B3:D5:DD:30:00/36\tVitec\n70:B3:D5:DD:40:00/36\tResIOT UBLSOFTWARE SRL\n70:B3:D5:DD:50:00/36\tCooltera Limited\n70:B3:D5:DD:60:00/36\tUmweltanalytik Holbach GmbH\n70:B3:D5:DD:70:00/36\tDETECT Australia\n70:B3:D5:DD:80:00/36\tEMSCAN Corp.\n70:B3:D5:DD:90:00/36\tMaNima Technologies BV\n70:B3:D5:DD:A0:00/36\tHubbell Power Systems\n70:B3:D5:DD:B0:00/36\tIntra Corporation\n70:B3:D5:DD:C0:00/36\tSyscom Instruments SA\n70:B3:D5:DD:D0:00/36\tBio Rad Laboratories\n70:B3:D5:DD:E0:00/36\tAbbott Diagnostics Technologies AS\n70:B3:D5:DD:F0:00/36\tAeroVision Avionics, Inc.\n70:B3:D5:DE:00:00/36\teCozy GmbH\n70:B3:D5:DE:10:00/36\tDuplomatic MS spa\n70:B3:D5:DE:20:00/36\tACD Elekronik GmbH\n70:B3:D5:DE:30:00/36\tETL Elektrotechnik Lauter GmbH\n70:B3:D5:DE:40:00/36\tMavili Elektronik Tic. Ve San. A.S.\n70:B3:D5:DE:50:00/36\tAsml\n70:B3:D5:DE:60:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:DE:70:00/36\tInnominds Software Private Limited\n70:B3:D5:DE:80:00/36\tNation-E Ltd.\n70:B3:D5:DE:90:00/36\tEkspertStroyProekt LLC\n70:B3:D5:DE:A0:00/36\tAdvanced Ventilation Applications, Inc.\n70:B3:D5:DE:B0:00/36\tDorlet Sau\n70:B3:D5:DE:C0:00/36\tCondev-Automation GmbH\n70:B3:D5:DE:D0:00/36\tSimpulse\n70:B3:D5:DE:E0:00/36\tCrde\n70:B3:D5:DE:F0:00/36\tISG Nordic AB\n70:B3:D5:DF:00:00/36\tastozi consulting Tomasz Zieba\n70:B3:D5:DF:10:00/36\tCoXlab Inc.\n70:B3:D5:DF:20:00/36\tAml\n70:B3:D5:DF:30:00/36\tSPC Bioclinicum\n70:B3:D5:DF:40:00/36\tHeim- & Bürokommunikation Ilmert e.K.\n70:B3:D5:DF:50:00/36\tBeijing Huanyu Zhilian Science &Technology Co., Ltd.\n70:B3:D5:DF:60:00/36\tTiab Limited\n70:B3:D5:DF:70:00/36\tScopeSensor Oy\n70:B3:D5:DF:80:00/36\tRMA Mess- und Regeltechnik GmbH & Co.KG\n70:B3:D5:DF:90:00/36\tKorea Plant Maintenance\n70:B3:D5:DF:A0:00/36\tNewtouch Electronics (Shanghai) Co.,Ltd.\n70:B3:D5:DF:B0:00/36\tYamamoto Works Ltd.\n70:B3:D5:DF:C0:00/36\tElectronic Systems Design Sprl\n70:B3:D5:DF:D0:00/36\tContiweb\n70:B3:D5:DF:E0:00/36\tmicrotec Sicherheitstechnik GmbH\n70:B3:D5:DF:F0:00/36\tSpanawave Corporation\n70:B3:D5:E0:00:00/36\tJeaway CCTV Security Ltd,.\n70:B3:D5:E0:10:00/36\tEarTex\n70:B3:D5:E0:20:00/36\tYehl & Jordan Llc\n70:B3:D5:E0:30:00/36\tMbj\n70:B3:D5:E0:40:00/36\tCombilent\n70:B3:D5:E0:50:00/36\tLobaro GmbH\n70:B3:D5:E0:60:00/36\tSystem West dba ICS Electronics\n70:B3:D5:E0:70:00/36\tBaader Planetarium GmbH\n70:B3:D5:E0:80:00/36\tOlssen\n70:B3:D5:E0:90:00/36\tL-3 communications ComCept Division\n70:B3:D5:E0:A0:00/36\tAcouva, Inc.\n70:B3:D5:E0:B0:00/36\tENTEC Electric & Electronic Co., LTD.\n70:B3:D5:E0:C0:00/36\tCommunication Systems Solutions\n70:B3:D5:E0:D0:00/36\tSigma Connectivity AB\n70:B3:D5:E0:E0:00/36\tVulcanForms\n70:B3:D5:E0:F0:00/36\tVtron Pty Ltd\n70:B3:D5:E1:00:00/36\tLeidos\n70:B3:D5:E1:10:00/36\tEngage Technologies\n70:B3:D5:E1:20:00/36\tSNK, Inc.\n70:B3:D5:E1:30:00/36\tSuzhou ZhiCai Co.,Ltd.\n70:B3:D5:E1:40:00/36\tAutomata Spa\n70:B3:D5:E1:50:00/36\tBenetel\n70:B3:D5:E1:60:00/36\tChina Entropy Co., Ltd.\n70:B3:D5:E1:70:00/36\tSA Photonics\n70:B3:D5:E1:80:00/36\tPlasmapp Co.,Ltd.\n70:B3:D5:E1:90:00/36\tBAB TECHNOLOGIE GmbH\n70:B3:D5:E1:A0:00/36\tBizerba Luceo\n70:B3:D5:E1:B0:00/36\tNeuron GmbH\n70:B3:D5:E1:C0:00/36\tRoomMate AS\n70:B3:D5:E1:D0:00/36\tGalaxy Next Generation, Inc.\n70:B3:D5:E1:E0:00/36\tUmano Medical Inc.\n70:B3:D5:E1:F0:00/36\tTheta432\n70:B3:D5:E2:00:00/36\tSignature Control Systems, LLC.\n70:B3:D5:E2:10:00/36\tLlvision Technology Co.,Ltd\n70:B3:D5:E2:20:00/36\tFederated Wireless, Inc.\n70:B3:D5:E2:30:00/36\tSmith Meter, Inc.\n70:B3:D5:E2:40:00/36\tGogo Business Aviation\n70:B3:D5:E2:50:00/36\tGJD Manufacturing\n70:B3:D5:E2:60:00/36\tFeitian Co.,Ltd.\n70:B3:D5:E2:70:00/36\tWoodside Electronics\n70:B3:D5:E2:80:00/36\tiotec GmbH\n70:B3:D5:E2:90:00/36\tInvent Vision - iVision Sistemas de Imagem e Visão S.A.\n70:B3:D5:E2:A0:00/36\tCONTES, spol. s r.o.\n70:B3:D5:E2:B0:00/36\tGuan Show Technologe Co., Ltd.\n70:B3:D5:E2:C0:00/36\tFourth Frontier Technologies Private Limited\n70:B3:D5:E2:D0:00/36\tBAE Systems Apllied Intelligence\n70:B3:D5:E2:E0:00/36\tMerz s.r.o.\n70:B3:D5:E2:F0:00/36\tFlextronics International Kft\n70:B3:D5:E3:00:00/36\tQuiss Ag\n70:B3:D5:E3:10:00/36\tNEUROPHET, Inc.\n70:B3:D5:E3:20:00/36\tHerutu Electronics Corporation\n70:B3:D5:E3:30:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:E3:40:00/36\tGamber Johnson-LLC\n70:B3:D5:E3:50:00/36\tNanospeed Technologies Limited\n70:B3:D5:E3:60:00/36\tGuidance Navigation Limited\n70:B3:D5:E3:70:00/36\tEurotempest AB\n70:B3:D5:E3:80:00/36\tCursor Systems NV\n70:B3:D5:E3:90:00/36\tThinnect, Inc,\n70:B3:D5:E3:A0:00/36\tCyanview\n70:B3:D5:E3:B0:00/36\tComNav Technology Ltd.\n70:B3:D5:E3:C0:00/36\tDensitron Technologies Ltd\n70:B3:D5:E3:D0:00/36\tLeo Bodnar Electronics Ltd\n70:B3:D5:E3:E0:00/36\tSol Welding srl\n70:B3:D5:E3:F0:00/36\tBestcode Llc\n70:B3:D5:E4:00:00/36\tSiemens Mobility GmbH - MO TI SPA\n70:B3:D5:E4:10:00/36\t4neXt S.r.l.s.\n70:B3:D5:E4:20:00/36\tNeusoft Reach Automotive Technology (Shenyang) Co.,Ltd\n70:B3:D5:E4:30:00/36\tSL Audio A/S\n70:B3:D5:E4:40:00/36\tBrainboxAI Inc\n70:B3:D5:E4:50:00/36\tMomentum Data Systems\n70:B3:D5:E4:60:00/36\t7thSense Design Limited\n70:B3:D5:E4:70:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:E4:80:00/36\tTDI. Co., LTD\n70:B3:D5:E4:90:00/36\tKendrion Mechatronics Center GmbH\n70:B3:D5:E4:A0:00/36\tICP NewTech Ltd\n70:B3:D5:E4:B0:00/36\tDelta\n70:B3:D5:E4:C0:00/36\tIAI-Israel Aerospace Industries MBT\n70:B3:D5:E4:D0:00/36\tVulcan Wireless Inc.\n70:B3:D5:E4:E0:00/36\tMidfin Systems\n70:B3:D5:E4:F0:00/36\tRWS Automation GmbH\n70:B3:D5:E5:00:00/36\tAdvanced Vision Technology Ltd\n70:B3:D5:E5:10:00/36\tNooliTIC\n70:B3:D5:E5:20:00/36\tGuangzhou Moblin Technology Co., Ltd.\n70:B3:D5:E5:30:00/36\tMi Inc.\n70:B3:D5:E5:40:00/36\tBeijing PanGu Company\n70:B3:D5:E5:50:00/36\tBELT S.r.l.\n70:B3:D5:E5:60:00/36\tHipodromo De Agua Caliente, S.A. De C.V.\n70:B3:D5:E5:70:00/36\tIradimed\n70:B3:D5:E5:80:00/36\tThurlby Thandar Instruments LTD\n70:B3:D5:E5:90:00/36\tFracarro srl\n70:B3:D5:E5:A0:00/36\tCardinal Scales Manufacturing Co\n70:B3:D5:E5:B0:00/36\tArgosy Labs Inc.\n70:B3:D5:E5:C0:00/36\tWalton Hi-Tech Industries Ltd.\n70:B3:D5:E5:D0:00/36\tBoffins Technologies AB\n70:B3:D5:E5:E0:00/36\tCritical Link LLC\n70:B3:D5:E5:F0:00/36\tCesiumAstro Inc.\n70:B3:D5:E6:00:00/36\tDavitor AB\n70:B3:D5:E6:10:00/36\tAdeli\n70:B3:D5:E6:20:00/36\tEon\n70:B3:D5:E6:30:00/36\tPotomac Electric Corporation\n70:B3:D5:E6:40:00/36\tHong Jiang Electronics Co., Ltd.\n70:B3:D5:E6:50:00/36\tBirtech Technology\n70:B3:D5:E6:60:00/36\tEneon sp. z o.o.\n70:B3:D5:E6:70:00/36\tApplied Processing\n70:B3:D5:E6:80:00/36\tTransit Solutions, LLC.\n70:B3:D5:E6:90:00/36\tFire4 Systems UK Ltd\n70:B3:D5:E6:A0:00/36\tMAC Solutions (UK) Ltd\n70:B3:D5:E6:B0:00/36\tShenzhen Shi Fang Communication Technology Co., Ltd\n70:B3:D5:E6:C0:00/36\tFusar Technologies inc\n70:B3:D5:E6:D0:00/36\tDomus S.C.\n70:B3:D5:E6:E0:00/36\tLieron BVBA\n70:B3:D5:E6:F0:00/36\tAmazon Technologies Inc.\n70:B3:D5:E7:00:00/36\tDISK Multimedia s.r.o.\n70:B3:D5:E7:10:00/36\tSiS Technology\n70:B3:D5:E7:20:00/36\tKDT Corp.\n70:B3:D5:E7:30:00/36\tZeus Control Systems Ltd\n70:B3:D5:E7:40:00/36\tExfrontier Co., Ltd.\n70:B3:D5:E7:50:00/36\tWatteco\n70:B3:D5:E7:60:00/36\tDorsett Technologies Inc\n70:B3:D5:E7:70:00/36\tOptix Jsc\n70:B3:D5:E7:80:00/36\tCamwell India LLP\n70:B3:D5:E7:90:00/36\tAcrodea, Inc.\n70:B3:D5:E7:A0:00/36\tArt Spa\n70:B3:D5:E7:B0:00/36\tShenzhen  SanYeCao  Electronics  Co.,Ltd\n70:B3:D5:E7:C0:00/36\tAplex Technology Inc.\n70:B3:D5:E7:D0:00/36\tNanjing Dandick Science&technology development co., LTD\n70:B3:D5:E7:E0:00/36\tGroupe Citypassenger Inc\n70:B3:D5:E7:F0:00/36\tSankyo Intec Co,ltd\n70:B3:D5:E8:00:00/36\tChangzhou Rapid Information Technology Co,Ltd\n70:B3:D5:E8:10:00/36\tSlat\n70:B3:D5:E8:20:00/36\tRF Track\n70:B3:D5:E8:30:00/36\tTalleres de Escoriaza SA\n70:B3:D5:E8:40:00/36\tENTEC Electric & Electronic Co., LTD.\n70:B3:D5:E8:50:00/36\tExplorer Inc.\n70:B3:D5:E8:60:00/36\tYUYAMA MFG Co.,Ltd\n70:B3:D5:E8:70:00/36\tSTACKFORCE GmbH\n70:B3:D5:E8:80:00/36\tBreas Medical AB\n70:B3:D5:E8:90:00/36\tJSC Kaluga Astral\n70:B3:D5:E8:A0:00/36\tMelecs EWS GmbH\n70:B3:D5:E8:B0:00/36\tDream D&S Co.,Ltd\n70:B3:D5:E8:C0:00/36\tFracarro srl\n70:B3:D5:E8:D0:00/36\tNatav Services Ltd.\n70:B3:D5:E8:E0:00/36\tMacnica Technology\n70:B3:D5:E8:F0:00/36\tDismuntel, S.A.\n70:B3:D5:E9:00:00/36\tGetein Biotechnology Co.,ltd\n70:B3:D5:E9:10:00/36\tNAS Australia P/L\n70:B3:D5:E9:20:00/36\tFuji Data System Co.,Ltd.\n70:B3:D5:E9:30:00/36\tECON Technology Co.Ltd\n70:B3:D5:E9:40:00/36\tLumiplan Duhamel\n70:B3:D5:E9:50:00/36\tBroadSoft Inc\n70:B3:D5:E9:60:00/36\tCellier Domesticus inc\n70:B3:D5:E9:70:00/36\tToptech Systems, Inc.\n70:B3:D5:E9:80:00/36\tJSC Kaluga Astral\n70:B3:D5:E9:90:00/36\tAdvitronics telecom bv\n70:B3:D5:E9:A0:00/36\tMeta Computing Services, Corp\n70:B3:D5:E9:B0:00/36\tNUMATA R&D Co.,Ltd\n70:B3:D5:E9:C0:00/36\tATG UV Technology\n70:B3:D5:E9:D0:00/36\tIntech\n70:B3:D5:E9:E0:00/36\tMSB Elektronik und Gerätebau GmbH\n70:B3:D5:E9:F0:00/36\tGigaband IP LLC\n70:B3:D5:EA:00:00/36\tPark24\n70:B3:D5:EA:10:00/36\tQntra Technology\n70:B3:D5:EA:20:00/36\tTransportal Solutions Ltd\n70:B3:D5:EA:30:00/36\tGridless Power Corperation\n70:B3:D5:EA:40:00/36\tGrupo Epelsa S.L.\n70:B3:D5:EA:50:00/36\tLotes Tm Ooo\n70:B3:D5:EA:60:00/36\tGalios\n70:B3:D5:EA:70:00/36\tMeccalte Spa\n70:B3:D5:EA:80:00/36\tDia-Stron Limited\n70:B3:D5:EA:90:00/36\tZhuhai Lonl electric Co.,Ltd.\n70:B3:D5:EA:A0:00/36\tDruck Ltd.\n70:B3:D5:EA:B0:00/36\tAPEN GROUP SpA (VAT IT08767740155)\n70:B3:D5:EA:C0:00/36\tKentech Instruments Limited\n70:B3:D5:EA:D0:00/36\tCobo, Inc.\n70:B3:D5:EA:E0:00/36\tOrlaco Products B.V.\n70:B3:D5:EA:F0:00/36\tSicon srl\n70:B3:D5:EB:00:00/36\tNautel LTD\n70:B3:D5:EB:10:00/36\tCP contech electronic GmbH\n70:B3:D5:EB:20:00/36\tShooter Detection Systems\n70:B3:D5:EB:30:00/36\tKWS-Electronic GmbH\n70:B3:D5:EB:40:00/36\tRobotic Research, LLC\n70:B3:D5:EB:50:00/36\tJustek Inc\n70:B3:D5:EB:60:00/36\tEnergizeEV\n70:B3:D5:EB:70:00/36\tSkreens\n70:B3:D5:EB:80:00/36\tEmporia Renewable Energy Corp\n70:B3:D5:EB:90:00/36\tThiel Audio Products Company, LLC\n70:B3:D5:EB:A0:00/36\tLast Mile Gear\n70:B3:D5:EB:B0:00/36\tBeijing Wing ICT Technology Co., Ltd.\n70:B3:D5:EB:C0:00/36\tRefine Technology, LLC\n70:B3:D5:EB:D0:00/36\tmidBit Technologies, LLC\n70:B3:D5:EB:E0:00/36\tSierra Pacific Innovations Corp\n70:B3:D5:EB:F0:00/36\tAutomatica Y Regulacion S.A.\n70:B3:D5:EC:00:00/36\tProtoConvert Pty Ltd\n70:B3:D5:EC:10:00/36\tXafax Nederland bv\n70:B3:D5:EC:20:00/36\tLightside Instruments AS\n70:B3:D5:EC:30:00/36\tVirtual Control Systems Ltd\n70:B3:D5:EC:40:00/36\thmt telematik GmbH\n70:B3:D5:EC:50:00/36\tTattile Srl\n70:B3:D5:EC:60:00/36\tEsii\n70:B3:D5:EC:70:00/36\tNeoptix Inc.\n70:B3:D5:EC:80:00/36\tPanasonic Life Solutions Elektr?K Sanay? Ve T?Care\n70:B3:D5:EC:90:00/36\tQlinx Technologies\n70:B3:D5:EC:A0:00/36\tTranstronic AB\n70:B3:D5:EC:B0:00/36\tRe spa - Controlli Industriali - IT01782300154\n70:B3:D5:EC:C0:00/36\tDigifocus Technology Inc.\n70:B3:D5:EC:D0:00/36\tSBS-Feintechnik GmbH & Co. KG\n70:B3:D5:EC:E0:00/36\tCOMM-connect A/S\n70:B3:D5:EC:F0:00/36\tIpitek\n70:B3:D5:ED:00:00/36\tshanghai qiaoqi zhinengkeji\n70:B3:D5:ED:10:00/36\tPrzemyslowy Instytut Automatyki i Pomiarow\n70:B3:D5:ED:20:00/36\tPCTEL, Inc.\n70:B3:D5:ED:30:00/36\tBeijing Lihong Create Co., Ltd.\n70:B3:D5:ED:40:00/36\tWilmore Electronics Company\n70:B3:D5:ED:50:00/36\thangzhou battle link technology Co.,Ltd\n70:B3:D5:ED:60:00/36\tMetrasens Limited\n70:B3:D5:ED:70:00/36\tWave\n70:B3:D5:ED:80:00/36\tWartsila Voyage Oy\n70:B3:D5:ED:90:00/36\tAADONA Communication Pvt Ltd\n70:B3:D5:ED:A0:00/36\tBreas Medical AB\n70:B3:D5:ED:B0:00/36\tNetfort Solutions\n70:B3:D5:ED:C0:00/36\tJ.D. Koftinoff Software, Ltd.\n70:B3:D5:ED:D0:00/36\tSolar Network & Partners\n70:B3:D5:ED:E0:00/36\tAgrident GmbH\n70:B3:D5:ED:F0:00/36\tGridNavigator\n70:B3:D5:EE:00:00/36\tStecomp\n70:B3:D5:EE:10:00/36\tallora Factory BVBA\n70:B3:D5:EE:20:00/36\tMontrade Spa\n70:B3:D5:EE:30:00/36\tLithe Technology, LLC\n70:B3:D5:EE:40:00/36\tO-Net Automation Technology (Shenzhen)Limited\n70:B3:D5:EE:50:00/36\tBeijing Hzhytech Technology Co.Ltd\n70:B3:D5:EE:60:00/36\tVaunix Technology Corporation\n70:B3:D5:EE:70:00/36\tBlue-Solutions Canada Inc.\n70:B3:D5:EE:80:00/36\trobert juliat\n70:B3:D5:EE:90:00/36\tSC3 Automation\n70:B3:D5:EE:A0:00/36\tDameca a/s\n70:B3:D5:EE:B0:00/36\tshenzhen suofeixiang technology Co.,Ltd\n70:B3:D5:EE:C0:00/36\tImpolux GmbH\n70:B3:D5:EE:D0:00/36\tCOMM-connect A/S\n70:B3:D5:EE:E0:00/36\tSociedad Iberica De Construcciones Electricas, S.A. (Sice)\n70:B3:D5:EE:F0:00/36\tTattile Srl\n70:B3:D5:EF:00:00/36\tPnetworks\n70:B3:D5:EF:10:00/36\tNanotok LLC\n70:B3:D5:EF:20:00/36\tKongsberg Intergrated Tactical Systems\n70:B3:D5:EF:30:00/36\toctoScope\n70:B3:D5:EF:40:00/36\tOrange Tree Technologies Ltd\n70:B3:D5:EF:50:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:EF:60:00/36\tChargelib\n70:B3:D5:EF:70:00/36\tDave Srl\n70:B3:D5:EF:80:00/36\tDKS Dienstl.ges. f. Komm.anl. d. Stadt- u. Reg.verk. mbH\n70:B3:D5:EF:90:00/36\tCritical Link LLC\n70:B3:D5:EF:A0:00/36\tNextEra Energy Resources, LLC\n70:B3:D5:EF:B0:00/36\tPXM sp.k.\n70:B3:D5:EF:C0:00/36\tAbsolent AB\n70:B3:D5:EF:D0:00/36\tCambridge Technology, Inc.\n70:B3:D5:EF:E0:00/36\tMeiden System Solutions\n70:B3:D5:EF:F0:00/36\tCarlo Gavazzi Industri\n70:B3:D5:F0:00:00/36\tAplex Technology Inc.\n70:B3:D5:F0:10:00/36\tSoftware Systems Plus\n70:B3:D5:F0:20:00/36\tABECO Industrie Computer GmbH\n70:B3:D5:F0:30:00/36\tGMI Ltd\n70:B3:D5:F0:40:00/36\tScame Sistemi srl\n70:B3:D5:F0:50:00/36\tMotomuto Aps\n70:B3:D5:F0:60:00/36\tWarecube,Inc\n70:B3:D5:F0:70:00/36\tDuval Messien\n70:B3:D5:F0:80:00/36\tSzabo Software & Engineering UK Ltd\n70:B3:D5:F0:90:00/36\tMictrotrac Retsch GmbH\n70:B3:D5:F0:A0:00/36\tNeuronal Innovation Control S.L.\n70:B3:D5:F0:B0:00/36\tRF Industries\n70:B3:D5:F0:C0:00/36\tModulaTeam GmbH\n70:B3:D5:F0:D0:00/36\tMeQ Inc.\n70:B3:D5:F0:E0:00/36\tTextSpeak Corporation\n70:B3:D5:F0:F0:00/36\tKyoto Denkiki\n70:B3:D5:F1:00:00/36\tRiegl Laser Measurement Systems GmbH\n70:B3:D5:F1:10:00/36\tBroadSoft Inc\n70:B3:D5:F1:20:00/36\tIncoil Induktion AB\n70:B3:D5:F1:30:00/36\tMEDIAM Sp. z o.o.\n70:B3:D5:F1:40:00/36\tSanyu Switch Co., Ltd.\n70:B3:D5:F1:50:00/36\tAreca Embedded Systems Pvt Ltd\n70:B3:D5:F1:60:00/36\tBRS Sistemas Eletrônicos\n70:B3:D5:F1:70:00/36\tVitec\n70:B3:D5:F1:80:00/36\tHD Vision Systems GmbH\n70:B3:D5:F1:90:00/36\tVitro Technology Corporation\n70:B3:D5:F1:A0:00/36\tSator Controls s.r.o.\n70:B3:D5:F1:B0:00/36\tIndiNatus (IndiNatus India Private Limited)\n70:B3:D5:F1:C0:00/36\tBavaria Digital Technik GmbH\n70:B3:D5:F1:D0:00/36\tCritical Link LLC\n70:B3:D5:F1:E0:00/36\tAtx Networks Ltd\n70:B3:D5:F1:F0:00/36\tHKC Security Ltd.\n70:B3:D5:F2:00:00/36\tIbercomp SA\n70:B3:D5:F2:10:00/36\tdds\n70:B3:D5:F2:20:00/36\tShengli Technologies\n70:B3:D5:F2:30:00/36\tLyse AS\n70:B3:D5:F2:40:00/36\tDaavlin\n70:B3:D5:F2:50:00/36\tJSC “Scientific Industrial Enterprise \"Rubin\"\n70:B3:D5:F2:60:00/36\tXj Electric Co., Ltd.\n70:B3:D5:F2:70:00/36\tNIRIT- Xinwei  Telecom Technology Co., Ltd.\n70:B3:D5:F2:80:00/36\tYi An Electronics Co., Ltd\n70:B3:D5:F2:90:00/36\tSamabaNova Systems\n70:B3:D5:F2:A0:00/36\tWIBOND Informationssysteme GmbH\n70:B3:D5:F2:B0:00/36\tSENSYS GmbH\n70:B3:D5:F2:C0:00/36\tHengen Technologies GmbH\n70:B3:D5:F2:D0:00/36\tID Lock AS\n70:B3:D5:F2:E0:00/36\tShanghai JCY Technology Company\n70:B3:D5:F2:F0:00/36\tTeleplatforms\n70:B3:D5:F3:00:00/36\tADE Technology Inc.\n70:B3:D5:F3:10:00/36\tThe-Box Development\n70:B3:D5:F3:20:00/36\tElektronik Art\n70:B3:D5:F3:30:00/36\tBeijing Vizum Technology Co.,Ltd.\n70:B3:D5:F3:40:00/36\tMacGray Services\n70:B3:D5:F3:50:00/36\tcarbonTRACK\n70:B3:D5:F3:60:00/36\tdinosys\n70:B3:D5:F3:70:00/36\tMitsubishi Electric Micro-Computer Application Software Co.,Ltd.\n70:B3:D5:F3:80:00/36\tScanvaegt Nordic A/S\n70:B3:D5:F3:90:00/36\tZenros ApS\n70:B3:D5:F3:A0:00/36\tOOO Research and Production Center \"Computer Technologies\"\n70:B3:D5:F3:B0:00/36\tEpdm Pty Ltd\n70:B3:D5:F3:C0:00/36\tGigaray\n70:B3:D5:F3:D0:00/36\tKAYA Instruments\n70:B3:D5:F3:E0:00/36\tОоо \"Ронекс\"\n70:B3:D5:F3:F0:00/36\tcomtac AG\n70:B3:D5:F4:00:00/36\tHorizon.Inc\n70:B3:D5:F4:10:00/36\tDuevi Srl\n70:B3:D5:F4:20:00/36\tMatsuhisa Corporation\n70:B3:D5:F4:30:00/36\tDivelbiss Corporation\n70:B3:D5:F4:40:00/36\tMagneti Marelli S.p.A. Electronics\n70:B3:D5:F4:50:00/36\tNorbit ODM AS\n70:B3:D5:F4:60:00/36\tSeason Electronics Ltd\n70:B3:D5:F4:70:00/36\tTXMission Ltd.\n70:B3:D5:F4:80:00/36\tHeitec Ag\n70:B3:D5:F4:90:00/36\tZmbizi App Llc\n70:B3:D5:F4:A0:00/36\tLacs Srl\n70:B3:D5:F4:B0:00/36\tChengdu Lingya Technology Co., Ltd.\n70:B3:D5:F4:C0:00/36\tPolyTech A/S\n70:B3:D5:F4:D0:00/36\tHoneywell\n70:B3:D5:F4:E0:00/36\tHunan Lianzhong Technology Co.,Ltd.\n70:B3:D5:F4:F0:00/36\tPower Electronics Espana, S.L.\n70:B3:D5:F5:00:00/36\tVectology,Inc\n70:B3:D5:F5:10:00/36\tIoT Routers Limited\n70:B3:D5:F5:20:00/36\tAlere Technologies AS\n70:B3:D5:F5:30:00/36\tHighTechSystem Co.,Ltd.\n70:B3:D5:F5:40:00/36\tRevolution Retail Systems\n70:B3:D5:F5:50:00/36\tKohler Mira Ltd\n70:B3:D5:F5:60:00/36\tVirtualHere Pty. Ltd.\n70:B3:D5:F5:70:00/36\tAplex Technology Inc.\n70:B3:D5:F5:80:00/36\tCdr Srl\n70:B3:D5:F5:90:00/36\tKorea Spectral Products\n70:B3:D5:F5:A0:00/36\tHAMEG GmbH\n70:B3:D5:F5:B0:00/36\tA.F.Mensah, Inc\n70:B3:D5:F5:C0:00/36\tNable Communications, Inc.\n70:B3:D5:F5:D0:00/36\tPotter Electric Signal Co. LLC\n70:B3:D5:F5:E0:00/36\tSelex ES Inc.\n70:B3:D5:F5:F0:00/36\tRFRain LLC\n70:B3:D5:F6:00:00/36\tMPM Micro Präzision Marx GmbH\n70:B3:D5:F6:10:00/36\tPower Diagnostic Service\n70:B3:D5:F6:20:00/36\tFRS GmbH & Co. KG\n70:B3:D5:F6:30:00/36\tArs Products\n70:B3:D5:F6:40:00/36\tsilicom\n70:B3:D5:F6:50:00/36\tMarkus Labs\n70:B3:D5:F6:60:00/36\tSeznam.cz, a.s., CZ26168685\n70:B3:D5:F6:70:00/36\twinsun AG\n70:B3:D5:F6:80:00/36\tAl Zajel Modern Telecomm\n70:B3:D5:F6:90:00/36\tCopper Labs, Inc.\n70:B3:D5:F6:A0:00/36\tGuan Show Technologe Co., Ltd.\n70:B3:D5:F6:B0:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:F6:C0:00/36\tVisioGreen\n70:B3:D5:F6:D0:00/36\tQowisio\n70:B3:D5:F6:E0:00/36\tStreambox Inc\n70:B3:D5:F6:F0:00/36\tSmashtag Ltd\n70:B3:D5:F7:00:00/36\tHoneywell\n70:B3:D5:F7:10:00/36\tSonel S.A.\n70:B3:D5:F7:20:00/36\tHanshin Electronics\n70:B3:D5:F7:30:00/36\tASL Holdings\n70:B3:D5:F7:40:00/36\tTessa Agritech Srl\n70:B3:D5:F7:50:00/36\tEnlaps\n70:B3:D5:F7:60:00/36\tThermo Fisher Scientific\n70:B3:D5:F7:70:00/36\tSatcube AB\n70:B3:D5:F7:80:00/36\tManvish eTech Pvt. Ltd.\n70:B3:D5:F7:90:00/36\tFirehose Labs, Inc.\n70:B3:D5:F7:A0:00/36\tSenso2Me\n70:B3:D5:F7:B0:00/36\tKST technology\n70:B3:D5:F7:C0:00/36\tMedicomp, Inc\n70:B3:D5:F7:D0:00/36\t2M Technology\n70:B3:D5:F7:E0:00/36\tAlpha Elettronica s.r.l.\n70:B3:D5:F7:F0:00/36\tABL Space Systems\n70:B3:D5:F8:00:00/36\tGuan Show Technologe Co., Ltd.\n70:B3:D5:F8:10:00/36\tLittlemore Scientific\n70:B3:D5:F8:20:00/36\tPreston Industries dba PolyScience\n70:B3:D5:F8:30:00/36\tTata Communications Ltd.\n70:B3:D5:F8:40:00/36\tDEUTA-WERKE GmbH\n70:B3:D5:F8:50:00/36\tSolystic\n70:B3:D5:F8:60:00/36\tNxGen Comm LLC\n70:B3:D5:F8:70:00/36\tShinwa Industries, Inc.\n70:B3:D5:F8:80:00/36\tOdawarakiki Auto-Machine Mfg.Co.,Ltd\n70:B3:D5:F8:90:00/36\tSoehnle Industrial Solutions GmbH\n70:B3:D5:F8:A0:00/36\tFRS GmbH & Co. KG\n70:B3:D5:F8:B0:00/36\tIOOOTA Srl\n70:B3:D5:F8:C0:00/36\tEuropean Advanced Technologies\n70:B3:D5:F8:D0:00/36\tFlextronics Canafa Design Services\n70:B3:D5:F8:E0:00/36\tIsabellenhütte Heusler Gmbh &Co KG\n70:B3:D5:F8:F0:00/36\tDimastec Gestao De Ponto E Acesso Eireli-Me\n70:B3:D5:F9:00:00/36\tAtman Tecnologia Ltda\n70:B3:D5:F9:10:00/36\tSolid State Disks Ltd\n70:B3:D5:F9:20:00/36\tTechOne\n70:B3:D5:F9:30:00/36\tHella Gutmann Solutions GmbH\n70:B3:D5:F9:40:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:F9:50:00/36\tGet SAT\n70:B3:D5:F9:60:00/36\tEcologicsense\n70:B3:D5:F9:70:00/36\tTyphon Treatment Systems Ltd\n70:B3:D5:F9:80:00/36\tMetrum Sweden AB\n70:B3:D5:F9:90:00/36\tTex Computer Srl\n70:B3:D5:F9:A0:00/36\tKrabbenhøft og Ingolfsson\n70:B3:D5:F9:B0:00/36\tEvoLogics GmbH\n70:B3:D5:F9:C0:00/36\tSureFlap Ltd\n70:B3:D5:F9:D0:00/36\tTeledyne API\n70:B3:D5:F9:E0:00/36\tInternational Center for Elementary Particle Physics, The University of Tokyo\n70:B3:D5:F9:F0:00/36\tM.A.C. Solutions (UK) Ltd\n70:B3:D5:FA:00:00/36\tTiama\n70:B3:D5:FA:10:00/36\tBBI Engineering, Inc.\n70:B3:D5:FA:20:00/36\tSarokal Test Systems Oy\n70:B3:D5:FA:30:00/36\tElva-1 Microwave Handelsbolag\n70:B3:D5:FA:40:00/36\tEnergybox Limited\n70:B3:D5:FA:50:00/36\tShenzhen Hui Rui Tianyan Technology Co., Ltd.\n70:B3:D5:FA:60:00/36\tRFL Electronics, Inc.\n70:B3:D5:FA:70:00/36\tNordson Corporation\n70:B3:D5:FA:80:00/36\tMunters\n70:B3:D5:FA:90:00/36\tCorDes, LLC\n70:B3:D5:FA:A0:00/36\tLogiM GmbH Software und Entwicklung\n70:B3:D5:FA:B0:00/36\tOpen System Solutions Limited\n70:B3:D5:FA:C0:00/36\tIntegrated Protein Technologies, Inc.\n70:B3:D5:FA:D0:00/36\tARC Technology Solutions, LLC\n70:B3:D5:FA:E0:00/36\tSilixa Ltd\n70:B3:D5:FA:F0:00/36\tRadig Hard & Software\n70:B3:D5:FB:00:00/36\tRohde&Schwarz Topex SA\n70:B3:D5:FB:10:00/36\tTomei Tsushin Kogyo Co,.Ltd\n70:B3:D5:FB:20:00/36\tKJ3 Elektronik AB\n70:B3:D5:FB:30:00/36\t3PS Inc\n70:B3:D5:FB:40:00/36\tArray Technologies Inc.\n70:B3:D5:FB:50:00/36\tOrange Tree Technologies Ltd\n70:B3:D5:FB:60:00/36\tKronotech Srl\n70:B3:D5:FB:70:00/36\tSaice\n70:B3:D5:FB:80:00/36\tHyannis Port Research\n70:B3:D5:FB:90:00/36\tEyedea\n70:B3:D5:FB:A0:00/36\tApogee Applied Research, Inc.\n70:B3:D5:FB:B0:00/36\tVena Engineering Corporation\n70:B3:D5:FB:C0:00/36\tTwoway Communications, Inc.\n70:B3:D5:FB:D0:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:FB:E0:00/36\tHanbat National University\n70:B3:D5:FB:F0:00/36\tSenSys (Design Electronics Ltd)\n70:B3:D5:FC:00:00/36\tCODESYSTEM Co.,Ltd\n70:B3:D5:FC:10:00/36\tInDiCor\n70:B3:D5:FC:20:00/36\tHunter Liberty Corporation\n70:B3:D5:FC:30:00/36\tmyUpTech AB\n70:B3:D5:FC:40:00/36\tAERIAL CAMERA SYSTEMS Ltd\n70:B3:D5:FC:50:00/36\tEltwin A/S\n70:B3:D5:FC:60:00/36\tTecnint HTE SRL\n70:B3:D5:FC:70:00/36\tInvert Robotics Ltd.\n70:B3:D5:FC:80:00/36\tModuware PTY LTD\n70:B3:D5:FC:90:00/36\tShanghai EICT Global Service Co., Ltd\n70:B3:D5:FC:A0:00/36\tM2M Cybernetics Pvt Ltd\n70:B3:D5:FC:B0:00/36\tTieline Research Pty Ltd\n70:B3:D5:FC:C0:00/36\tDIgSILENT GmbH\n70:B3:D5:FC:D0:00/36\tEngage Technologies\n70:B3:D5:FC:E0:00/36\tFx Technology Limited\n70:B3:D5:FC:F0:00/36\tAcc+Ess Ltd\n70:B3:D5:FD:00:00/36\tAlcohol Countermeasure Systems\n70:B3:D5:FD:10:00/36\tRedRat Ltd\n70:B3:D5:FD:20:00/36\tDalian  Levear Electric  Co., Ltd\n70:B3:D5:FD:30:00/36\tAKIS technologies\n70:B3:D5:FD:40:00/36\tGetraline\n70:B3:D5:FD:50:00/36\tOceancctv Ltd\n70:B3:D5:FD:60:00/36\tVisual Fan\n70:B3:D5:FD:70:00/36\tCentum Adetel Group\n70:B3:D5:FD:80:00/36\tMB connect line GmbH Fernwartungssysteme\n70:B3:D5:FD:90:00/36\teSight\n70:B3:D5:FD:A0:00/36\tACD Elektronik GmbH\n70:B3:D5:FD:B0:00/36\tDesign SHIFT\n70:B3:D5:FD:C0:00/36\tTapdn\n70:B3:D5:FD:D0:00/36\tLaser Imagineering Vertriebs GmbH\n70:B3:D5:FD:E0:00/36\tAeronautical & General Instruments Ltd.\n70:B3:D5:FD:F0:00/36\tNara Controls Inc.\n70:B3:D5:FE:00:00/36\tBlueprint Lab\n70:B3:D5:FE:10:00/36\tShenzhen Zhiting Technology Co.,Ltd\n70:B3:D5:FE:20:00/36\tGalileo Tıp Teknolojileri San. ve Tic. A.S.\n70:B3:D5:FE:30:00/36\tCSM MACHINERY srl\n70:B3:D5:FE:40:00/36\tCare Pvt Ltd\n70:B3:D5:FE:50:00/36\tMalin Space Science System\n70:B3:D5:FE:60:00/36\tShizuki Electric Co.,Inc\n70:B3:D5:FE:70:00/36\tVeilux Inc.\n70:B3:D5:FE:80:00/36\tPCME Ltd.\n70:B3:D5:FE:90:00/36\tCamsat Przemysław Gralak\n70:B3:D5:FE:A0:00/36\tHeng Dian Technology Co., Ltd\n70:B3:D5:FE:B0:00/36\tLes distributions Multi-Secure incorporee\n70:B3:D5:FE:C0:00/36\tFinder SpA\n70:B3:D5:FE:D0:00/36\tNiron systems & Projects\n70:B3:D5:FE:E0:00/36\tKawasaki Robot Service,Ltd.\n70:B3:D5:FE:F0:00/36\tHangzhou Hualan Microelectronique Co.,Ltd\n70:B3:D5:FF:00:00/36\tE-MetroTel\n70:B3:D5:FF:10:00/36\tData Strategy Limited\n70:B3:D5:FF:20:00/36\ttiga.eleven GmbH\n70:B3:D5:FF:30:00/36\tAplex Technology Inc.\n70:B3:D5:FF:40:00/36\tServeron Corporation\n70:B3:D5:FF:50:00/36\tProlan Process Control Co.\n70:B3:D5:FF:60:00/36\tElektro Adrian\n70:B3:D5:FF:70:00/36\tCybercom AB\n70:B3:D5:FF:80:00/36\tDutile, Glines and Higgins Corporation\n70:B3:D5:FF:90:00/36\tInOut Communication Systems\n70:B3:D5:FF:A0:00/36\tBarracuda Measurement Solutions\n70:B3:D5:FF:B0:00/36\tQuercus Technologies, S.L.\n70:B3:D5:FF:C0:00/36\tSymetrics Industries d.b.a. Extant Aerospace\n70:B3:D5:FF:D0:00/36\ti2Systems\n70:B3:D5:FF:E0:00/36\tPrivate\n70:B3:D5:FF:F0:00/36\tPrivate\n70:B5:1A\t\tHuawei Device Co., Ltd.\n70:B5:99\t\tEmbedded Technologies s.r.o.\n70:B5:E8\t\tDell Inc.\n70:B6:4F\t\tGuangzhou V-SOLUTION Electronic Technology Co., Ltd.\n70:B6:51\t\tEight Sleep\n70:B7:AA\t\tvivo Mobile Communication Co., Ltd.\n70:B7:E2\t\tJiangsu Miter Technology Co.,Ltd.\n70:B7:E4\t\tBroadcom Limited\n70:B8:F6\t\tEspressif Inc.\n70:B9:21\t\tFiberhome Telecommunication Technologies Co.,LTD\n70:B9:50\t\tTexas Instruments\n70:B9:BB\t\tShenzhen Hankvision Technology CO.,LTD\n70:BA:EF\t\tHangzhou H3C Technologies Co., Limited\n70:BB:5B\t\tApple, Inc.\n70:BB:E9\t\tXiaomi Communications Co Ltd\n70:BC:10\t\tMicrosoft Corporation\n70:BC:48\t\tCisco Systems, Inc\n70:BD:96\t\tCisco Systems, Inc\n70:BD:D2\t\tAdva Network Security GmbH\n70:BF:3E\t\tCharles River Laboratories\n70:BF:92\t\tGN Audio A/S\n70:C5:9C\t\tSilicon Laboratories\n70:C6:AC\t\tBosch Automotive Aftermarket\n70:C6:DD\t\tNew H3C Technologies Co., Ltd\n70:C7:6F\t\tInno S\n70:C7:F2\t\tHuawei Technologies Co.,Ltd\n70:C8:33\t\tWirepas Oy\n70:C9:12\t\tSichuan AI-Link Technology Co., Ltd.\n70:C9:32\t\tDreame Technology (Suzhou) Limited\n70:C9:4E\t\tLiteon Technology Corporation\n70:C9:C6\t\tCisco Systems, Inc\n70:CA:4D\t\tShenzhen lnovance Technology Co.,Ltd.\n70:CA:97\t\tRuckus Wireless\n70:CA:9B\t\tCisco Systems, Inc\n70:CD:0D\t\tIntel Corporate\n70:CD:60\t\tApple, Inc.\n70:CD:91\t\tTeracom Telematica S.A\n70:CE:8C\t\tSamsung Electronics Co.,Ltd\n70:CF:49\t\tIntel Corporate\n70:D0:81\t\tBeijing Netpower Technologies Inc.\n70:D3:13\t\tHuawei Technologies Co.,Ltd\n70:D3:79\t\tCisco Systems, Inc\n70:D4:F2\t\tRim\n70:D5:1E\t\tFiberhome Telecommunication Technologies Co.,LTD\n70:D5:7E\t\tScalar Corporation\n70:D5:E7\t\tWellcore Corporation\n70:D6:B6\t\tMetrum Technologies\n70:D8:23\t\tIntel Corporate\n70:D8:80\t\tUpos System sp. z o.o.\n70:D8:C2\t\tIntel Corporate\n70:D9:23\t\tvivo Mobile Communication Co., Ltd.\n70:D9:31\t\tCambridge Industries(Group) Co.,Ltd.\n70:D9:83\t\tShanghai JINXVM Microelectronics Co.,Ltd.\n70:DA:17\t\tAustrian Audio GmbH\n70:DA:48\t\tCisco Systems, Inc\n70:DA:9C\t\tTecsen\n70:DB:98\t\tCisco Systems, Inc\n70:DD:A1\t\tTellabs\n70:DD:A8\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n70:DD:EF\t\tHuawei Device Co., Ltd.\n70:DE:E2\t\tApple, Inc.\n70:DE:F9\t\tFai Wah International (Hong Kong) Limited\n70:DF:2F\t\tCisco Systems, Inc\n70:DF:F7\t\tCommscope\n70:E0:27\t\tHongyu Communication Technology Limited\n70:E1:39\t\t3view Ltd\n70:E1:FD\t\tFlextronics\n70:E2:4C\t\tSAE IT-systems GmbH & Co. KG\n70:E2:84\t\tWistron Infocomm (Zhongshan) Corporation\n70:E4:22\t\tCisco Systems, Inc\n70:E4:6E\t\tLytx\n70:E5:6E\t\tTexas Instruments\n70:E7:2C\t\tApple, Inc.\n70:E8:43\t\tBeijing C&W Optical Communication Technology Co.,Ltd.\n70:EA:1A\t\tCisco Systems, Inc\n70:EA:5A\t\tApple, Inc.\n70:EB:74\t\tNingbo Goneo Electric Appliance Co., Ltd.\n70:EC:E4\t\tApple, Inc.\n70:ED:FA\t\timperix Ltd\n70:EE:50\t\tNetatmo\n70:EE:A3\t\tEoptolink Technology Inc. Ltd,\n70:EF:00\t\tApple, Inc.\n70:F0:87\t\tApple, Inc.\n70:F0:88\t\tNintendo Co.,Ltd\n70:F0:96\t\tCisco Systems, Inc\n70:F1:1C\t\tShenzhen Ogemray Technology Co.,Ltd\n70:F1:76\t\tData Modul AG\n70:F1:96\t\tActiontec Electronics, Inc\n70:F1:A1\t\tLiteon Technology Corporation\n70:F1:E5\t\tXetawave LLC\n70:F2:20\t\tActiontec Electronics, Inc\n70:F3:5A\t\tCisco Systems, Inc\n70:F3:95\t\tUniversal Global Scientific Industrial Co., Ltd.\n70:F6:CF\t\tRelay, Inc.\n70:F7:4F\t\tRobert Bosch JuP1\n70:F7:54\t\tAMPAK Technology,Inc.\n70:F8:2B\t\tDWnet Technologies(Suzhou) Corporation\n70:F8:AE\t\tMicrosoft Corporation\n70:F8:E7\t\tIEEE Registration Authority\n70:F8:E7:00:00:00/28\tSHENZHEN Xin JiuNing Electronics Co Ltd\n70:F8:E7:10:00:00/28\tSystem Level Solutions (India) Pvt.\n70:F8:E7:20:00:00/28\tVOXX International\n70:F8:E7:30:00:00/28\tDr. Simon Consulting GmbH\n70:F8:E7:40:00:00/28\tCLIP Inc.\n70:F8:E7:50:00:00/28\tBeijing Eehuu Technology Co.,Ltd.\n70:F8:E7:60:00:00/28\tFlexim Security Oy\n70:F8:E7:70:00:00/28\tNST Technology Limited Co.,Ltd.\n70:F8:E7:80:00:00/28\tEclipse Security\n70:F8:E7:90:00:00/28\tKontech Electronics Co., Ltd\n70:F8:E7:A0:00:00/28\tTiVACI CORPORATION PTE LTD\n70:F8:E7:B0:00:00/28\tPhotonfocus AG\n70:F8:E7:C0:00:00/28\tFixstars Corporation\n70:F8:E7:D0:00:00/28\tSystem-on-Chip engineering\n70:F8:E7:E0:00:00/28\tCuav\n70:F9:27\t\tSamsung Electronics Co.,Ltd\n70:F9:4A\t\tApple, Inc.\n70:F9:6D\t\tHangzhou H3C Technologies Co., Limited\n70:FC:8C\t\tOneAccess SA\n70:FC:8F\t\tFreebox Sas\n70:FD:45\t\tHuawei Technologies Co.,Ltd\n70:FD:46\t\tSamsung Electronics Co.,Ltd\n70:FD:88\t\tNanjing Jiahao Technology Co., Ltd.\n70:FF:5C\t\tCheerzing Communication(Xiamen)Technology Co.,Ltd\n70:FF:76\t\tTexas Instruments\n74:00:E8\t\tHuawei Technologies Co.,Ltd\n74:02:E1\t\tTexas Instruments\n74:03:BD\t\tBuffalo.Inc\n74:04:2B\t\tLenovo Mobile Communication (Wuhan) Company Limited\n74:04:F0\t\tMobiwire Mobiles (NingBo) Co., LTD\n74:04:F1\t\tIntel Corporate\n74:05:1D\t\tJiangxi Risound Electronics Co.,LTD\n74:05:7C\t\tQorvo International Pte. Ltd.\n74:05:A5\t\tTp-Link Technologies Co.,Ltd.\n74:06:35\t\tSernet (Suzhou) Technologies Corporation\n74:07:7E\t\tQuectel Wireless Solutions Co.,Ltd.\n74:08:DE\t\tFujian Landi Commercial Technology Co., Ltd.\n74:09:AC\t\tQuext, LLC\n74:0A:BC\t\tLightwaveRF Technology Ltd\n74:0A:E1\t\tHuawei Device Co., Ltd.\n74:0B:B0\t\tHirschmann Automation and Control GmbH\n74:0C:EE\t\tHuawei Device Co., Ltd.\n74:0E:A4\t\tApple, Inc.\n74:0E:DB\t\tOptowiz Co., Ltd\n74:10:E0\t\tBroadcom Limited\n74:11:B2\t\tCisco Systems, Inc\n74:12:13\t\tLinksys USA, Inc\n74:12:B3\t\tChongqing Fugui Electronics Co.,Ltd.\n74:12:BB\t\tFiberhome Telecommunication Technologies Co.,LTD\n74:13:EA\t\tIntel Corporate\n74:14:89\t\tSRT Wireless\n74:15:75\t\tXiaomi Communications Co Ltd\n74:15:E2\t\tTri-Sen Systems Corporation\n74:15:F5\t\tApple, Inc.\n74:18:65\t\tShanghai DareGlobal Technologies Co.,Ltd\n74:19:0A\t\tSamsung Electronics Co.,Ltd\n74:19:F8\t\tIEEE Registration Authority\n74:19:F8:00:00:00/28\tMarmitek\n74:19:F8:10:00:00/28\tTrend-tech Technology Co., Limited\n74:19:F8:20:00:00/28\tSymtop Instrument Co.\n74:19:F8:30:00:00/28\tEssential Trading Systems Corp\n74:19:F8:40:00:00/28\tCloudvue Technologies Corporation\n74:19:F8:50:00:00/28\tStarcor Beijing Co.,Limited\n74:19:F8:60:00:00/28\tBaudisch Electronic GmbH\n74:19:F8:70:00:00/28\tHeptagon Systems PTY. LTD.\n74:19:F8:80:00:00/28\tQuest Payment Systems\n74:19:F8:90:00:00/28\tPrincip a.s.\n74:19:F8:A0:00:00/28\tTanjarine\n74:19:F8:B0:00:00/28\tIDEXX Laboratories, Inc\n74:19:F8:C0:00:00/28\tBach Icon ApS\n74:19:F8:D0:00:00/28\tAnsjer Electronics Co., Ltd.\n74:19:F8:E0:00:00/28\tVolacomm Co., Ltd\n74:19:F8:F0:00:00/28\tPrivate\n74:1A:E0\t\tIEEE Registration Authority\n74:1A:E0:00:00:00/28\tHuano International Technology Limited\n74:1A:E0:10:00:00/28\tSocionext Inc.\n74:1A:E0:20:00:00/28\tNura Holdings Pty Ltd\n74:1A:E0:30:00:00/28\tPhilips Personal Health Solutions\n74:1A:E0:40:00:00/28\tRevl Inc.\n74:1A:E0:50:00:00/28\tFujian Taili Communication Technology Co.,Ltd\n74:1A:E0:60:00:00/28\tBlocks Wearables Inc.\n74:1A:E0:70:00:00/28\tBÄR Bahnsicherung AG\n74:1A:E0:80:00:00/28\tBroadcast Wireless Systems Ltd\n74:1A:E0:90:00:00/28\tPrivate\n74:1A:E0:A0:00:00/28\tSaiercom Corporation\n74:1A:E0:B0:00:00/28\tShen Zhen Yingjiachuang Electronics Technology Co.,Ltd.\n74:1A:E0:C0:00:00/28\tbistos.co.ltd\n74:1A:E0:D0:00:00/28\tVoltaware Services Limited\n74:1A:E0:E0:00:00/28\tITS Partner (O.B.S) S.L.\n74:1B:39\t\tConvey India Private Limited\n74:1B:B2\t\tApple, Inc.\n74:1C:27\t\tItel Mobile Limited\n74:1E:93\t\tFiberhome Telecommunication Technologies Co.,LTD\n74:1E:B1\t\tSamsung Electronics Co.,Ltd\n74:1F:4A\t\tHangzhou H3C Technologies Co., Limited\n74:1F:79\t\tYoungkook Electronics Co.,Ltd\n74:20:5F\t\tShenzhen Zhongruixin Intelligent Technology Co., Ltd.\n74:22:0D\t\tChengdu Xuguang Technology Co,Ltd\n74:22:BB\t\tHuawei Device Co., Ltd.\n74:23:44\t\tXiaomi Communications Co Ltd\n74:23:8D\t\tzte corporation\n74:24:9F\t\tTIBRO Corp.\n74:24:CA\t\tGuangzhou Shiyuan Electronic Technology Company Limited\n74:25:84\t\tIEEE Registration Authority\n74:25:84:00:00:00/28\tAlcon Wireless Private Limited\n74:25:84:10:00:00/28\tCreative Synergy Ventures Pty. Ltd.\n74:25:84:20:00:00/28\tSuzhou Surinno Photonics Technology Co.Ltd.\n74:25:84:30:00:00/28\talt digital s.r.o.\n74:25:84:40:00:00/28\tHive Media Control\n74:25:84:50:00:00/28\tDexter Laundry Inc.\n74:25:84:60:00:00/28\tEzeconet\n74:25:84:70:00:00/28\tAnnapurna labs\n74:25:84:80:00:00/28\tAnnapurna labs\n74:25:84:90:00:00/28\tSercomm Japan Corporation\n74:25:84:A0:00:00/28\tAnnapurna labs\n74:25:84:B0:00:00/28\tInternational Technology And Telecomminication FZC\n74:25:84:C0:00:00/28\tHsptek Jsc\n74:25:84:D0:00:00/28\tShenzhen smart-core technology co.,ltd.\n74:25:84:E0:00:00/28\tWDJ Hi-Tech Inc.\n74:25:8A\t\tHangzhou H3C Technologies Co., Limited\n74:26:AC\t\tCisco Systems, Inc\n74:26:FF\t\tzte corporation\n74:27:2C\t\tAdvanced Micro Devices, Inc.\n74:27:3C\t\tChangYang Technology (Nanjing) Co., LTD\n74:27:EA\t\tElitegroup Computer Systems Co.,Ltd.\n74:28:57\t\tMayfield Robotics\n74:28:69\t\tHuawei Device Co., Ltd.\n74:29:72\t\tJuniper Networks\n74:29:81\t\tTexas Instruments\n74:29:AF\t\tHon Hai Precision Ind. Co.,Ltd.\n74:2A:8A\t\tshenzhen worldelite electronics co., LTD\n74:2B:0F\t\tInfinidat Ltd.\n74:2B:62\t\tFujitsu Limited\n74:2D:0A\t\tNorfolk Elektronik AG\n74:2E:4F\t\tStienen Group\n74:2E:C1\t\tDixon Electro Appliances Pvt Ltd\n74:2E:DB\t\tPerinet GmbH\n74:2E:FC\t\tDirectPacket Research, Inc,\n74:2F:68\t\tAzureWave Technology Inc.\n74:30:9D\t\tInfinix mobility limited\n74:30:AF\t\tFiberhome Telecommunication Technologies Co.,LTD\n74:31:70\t\tArcadyan Technology Corporation\n74:31:74\t\tApple, Inc.\n74:32:56\t\tNT-ware Systemprg GmbH\n74:32:C2\t\tKyolis\n74:33:57\t\tvivo Mobile Communication Co., Ltd.\n74:33:A6\t\tShenzhen SuperElectron Technology Co.,Ltd.\n74:33:E9\t\tzte corporation\n74:34:00\t\tMTG Co., Ltd.\n74:34:2B\t\tHuawei Technologies Co.,Ltd\n74:34:91\t\tShenzhen Kings IoT Co., Ltd\n74:34:AE\t\tthis is engineering Inc.\n74:36:6D\t\tVodafone Italia S.p.A.\n74:37:2F\t\tTongfang Shenzhen Cloudcomputing Technology Co.,Ltd\n74:37:3B\t\tUNINET Co.,Ltd.\n74:37:5F\t\tSercomm Philippines Inc\n74:38:22\t\tXiaomi Communications Co Ltd\n74:38:89\t\tANNAX Anzeigesysteme GmbH\n74:38:B7\t\tCanon Inc.\n74:39:89\t\tTp-Link Technologies Co.,Ltd.\n74:3A:20\t\tNew H3C Technologies Co., Ltd\n74:3A:65\t\tNEC Corporation\n74:3A:EF\t\tKaon Group Co., Ltd.\n74:3A:F4\t\tIntel Corporate\n74:3C:18\t\tTaicang T&W Electronics\n74:3C:24\t\tHuawei Technologies Co.,Ltd\n74:3E:2B\t\tRuckus Wireless\n74:3E:39\t\tYUSUR Technology Co., Ltd.\n74:3E:CB\t\tGentrice tech\n74:3F:C2\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n74:40:BB\t\tHon Hai Precision Ind. Co.,Ltd.\n74:40:BE\t\tLG Innotek\n74:42:18\t\tApple, Inc.\n74:42:7F\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n74:42:8B\t\tApple, Inc.\n74:44:01\t\tNetgear\n74:45:2D\t\tHuawei Device Co., Ltd.\n74:45:8A\t\tSamsung Electronics Co.,Ltd\n74:45:CE\t\tCresyn\n74:46:87\t\tKingsignal Technology Co., Ltd.\n74:46:A0\t\tHewlett Packard\n74:46:B3\t\tTexas Instruments\n74:49:D2\t\tNew H3C Technologies Co., Ltd\n74:4A:A4\t\tzte corporation\n74:4B:E9\t\tExplorer Hypertech Co.,Ltd\n74:4C:A1\t\tLiteon Technology Corporation\n74:4D:28\t\tRouterboard.com\n74:4D:6D\t\tHuawei Technologies Co.,Ltd\n74:4D:79\t\tArrive Systems Inc.\n74:4D:BD\t\tEspressif Inc.\n74:4D:DC\t\tSonim Technologies, Inc\n74:50:4E\t\tNew H3C Technologies Co., Ltd\n74:50:CD\t\tHuawei Technologies Co.,Ltd\n74:51:BA\t\tXiaomi Communications Co Ltd\n74:53:27\t\tCommsen Co., Limited\n74:53:A8\t\tACL Airshop BV\n74:54:27\t\tShenzhen Fast Technologies Co.,Ltd\n74:54:6B\t\thangzhou zhiyi communication co., ltd\n74:54:7D\t\tCisco SPVTG\n74:56:12\t\tCommscope\n74:56:3C\t\tGiga-Byte Technology Co.,Ltd.\n74:57:98\t\tTRUMPF Laser GmbH + Co. KG\n74:58:89\t\tMultilaser Industrial S.A.\n74:58:F3\t\tAmazon Technologies Inc.\n74:59:09\t\tHuawei Technologies Co.,Ltd\n74:59:33\t\tDanal Entertainment\n74:5A:AA\t\tHuawei Technologies Co.,Ltd\n74:5B:C5\t\tIEEE Registration Authority\n74:5B:C5:00:00:00/28\tIRS Systementwicklung GmbH\n74:5B:C5:10:00:00/28\tBeijing Inspiry Technology Co., Ltd.\n74:5B:C5:20:00:00/28\tSiglent Technologies Co., Ltd.\n74:5B:C5:30:00:00/28\tOxon Ag\n74:5B:C5:40:00:00/28\tuGrid Network Inc.\n74:5B:C5:50:00:00/28\tSpringCard\n74:5B:C5:60:00:00/28\tYekani Manufacturing PTY Ltd\n74:5B:C5:70:00:00/28\tShenzhen Atx Technology Co.,Ltd\n74:5B:C5:80:00:00/28\tEDOMO Systems GmbH\n74:5B:C5:90:00:00/28\tHaikou Frun Flash&Mcu Microcontrol Technology Development Co.,Ltd\n74:5B:C5:A0:00:00/28\tFournie Grospaud Energie SASU\n74:5B:C5:B0:00:00/28\tSmartiply Inc.\n74:5B:C5:C0:00:00/28\tComNot\n74:5B:C5:D0:00:00/28\tCelyss Sas\n74:5B:C5:E0:00:00/28\tQingdao Wintec System Co., Ltd\n74:5C:4B\t\tGN Audio A/S\n74:5C:9F\t\tTCT mobile ltd\n74:5C:FA\t\tShenzhen Shunrui Gaojie Technology Co., Ltd.\n74:5D:22\t\tLCFC(Hefei) Electronics Technology co., ltd\n74:5D:43\t\tBSH Hausgeraete GmbH\n74:5D:68\t\tFiberhome Telecommunication Technologies Co.,LTD\n74:5E:1C\t\tPioneer Corporation\n74:5F:00\t\tSamsung Semiconductor Inc.\n74:5F:90\t\tLAM Technologies\n74:5F:AE\t\tTsl Ppl\n74:60:4C\t\tRode\n74:60:FA\t\tHuawei Technologies Co.,Ltd\n74:61:4B\t\tChongqing Huijiatong Information Technology Co., Ltd.\n74:63:C2\t\tHuawei Device Co., Ltd.\n74:63:DF\t\tVTS GmbH\n74:65:0C\t\tApple, Inc.\n74:65:D1\t\tAtlinks\n74:66:30\t\tT:mi Ytti\n74:67:5F\t\tCompal Information(Kunshan)Co.,Ltd.\n74:67:F7\t\tExtreme Networks Headquarters\n74:69:4A\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n74:6A:3A\t\tAperi Corporation\n74:6A:89\t\tRezolt Corporation\n74:6A:8F\t\tVS Vision Systems GmbH\n74:6A:B3\t\tMICIUS Laboratory\n74:6B:82\t\tMovek\n74:6B:AB\t\tGuangdong Enok Communication Co., Ltd\n74:6D:FA\t\tSamsung Electronics Co.,Ltd\n74:6E:E4\t\tAsia Vital Components Co.,Ltd.\n74:6F:19\t\tIcarvisions (Shenzhen) Technology Co., Ltd.\n74:6F:3D\t\tContec GmbH\n74:6F:88\t\tzte corporation\n74:6F:F7\t\tWistron Neweb Corporation\n74:70:69\t\tHuawei Device Co., Ltd.\n74:70:FD\t\tIntel Corporate\n74:71:8B\t\tApple, Inc.\n74:72:1E\t\tEdison Labs Inc.\n74:72:B0\t\tGuangzhou Shiyuan Electronics Co., Ltd.\n74:72:F2\t\tChipsip Technology Co., Ltd.\n74:73:1D\t\tifm electronic gmbh\n74:73:36\t\tMICRODIGTAL Inc\n74:73:B4\t\tApple, Inc.\n74:73:E2\t\tHillstone Networks Corp.\n74:74:46\t\tGoogle, Inc.\n74:75:48\t\tAmazon Technologies Inc.\n74:75:DF\t\tTeclink\n74:76:1F\t\tMicrosoft Corporation\n74:76:5B\t\tQuectel Wireless Solutions Co.,Ltd.\n74:76:7D\t\tshenzhen kexint technology co.,ltd\n74:77:86\t\tApple, Inc.\n74:78:18\t\tJurumani Solutions\n74:78:27\t\tDell Inc.\n74:78:47\t\tInterdisciplinary Consulting Corporation\n74:78:A6\t\tFortinet, Inc.\n74:7A:90\t\tMurata Manufacturing Co., Ltd.\n74:7B:7A\t\tETH Inc.\n74:7D:24\t\tPhicomm (Shanghai) Co., Ltd.\n74:7D:B6\t\tAliwei Communications, Inc\n74:7E:1A\t\tRed Embedded Design Limited\n74:7E:2D\t\tBeijing Thomson CITIC Digital Technology Co. LTD.\n74:80:3F\t\tRenesas Electronics (Penang) Sdn. Bhd.\n74:81:14\t\tApple, Inc.\n74:81:9A\t\tPT. Hartono Istana Teknologi\n74:83:C2\t\tUbiquiti Inc\n74:83:EF\t\tArista Networks\n74:84:69\t\tNintendo Co.,Ltd\n74:84:E1\t\tDongguan Haoyuan Electronics Co.,Ltd\n74:85:2A\t\tPegatron Corporation\n74:85:C4\t\tNew H3C Technologies Co., Ltd\n74:86:0B\t\tCisco Systems, Inc\n74:86:69\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n74:86:6F\t\tzte corporation\n74:86:7A\t\tDell Inc.\n74:86:E2\t\tDell Inc.\n74:87:2E\t\tHuawei Technologies Co.,Ltd\n74:87:A9\t\tOCT Technology Co., Ltd.\n74:87:BB\t\tCiena Corporation\n74:88:2A\t\tHuawei Technologies Co.,Ltd\n74:88:8B\t\tADB Broadband Italia\n74:88:A8\t\tBouffalo Lab (Nanjing) Co., Ltd.\n74:88:BB\t\tCisco Systems, Inc\n74:8A:0D\t\tCommscope\n74:8A:28\t\tHMD Global Oy\n74:8A:69\t\tKorea Image Technology Co., Ltd\n74:8B:29\t\tMicobiomed\n74:8B:34\t\tShanghai Smart System Technology Co., Ltd\n74:8D:08\t\tApple, Inc.\n74:8E:08\t\tBestek Corp.\n74:8E:F8\t\tBrocade Communications Systems LLC\n74:8F:1B\t\tMasterImage 3D\n74:8F:3C\t\tApple, Inc.\n74:8F:4D\t\tduagon Germany GmbH\n74:8F:C2\t\tCisco Systems, Inc\n74:90:1F\t\tRagile Networks Inc.\n74:90:50\t\tRenesas Electronics Corporation\n74:90:BC\t\tArcadyan Corporation\n74:91:1A\t\tRuckus Wireless\n74:91:BD\t\tFour systems Co.,Ltd.\n74:92:BA\t\tMovesense Ltd\n74:93:A4\t\tZebra Technologies Corp.\n74:93:DA\t\tAskey Computer Corp\n74:94:3D\t\tAgJunction\n74:95:33\t\tWestala Technologies Inc.\n74:95:52\t\tXuzhou WIKA Electronics Control Technology Co., Ltd.\n74:95:A7\t\tKeyence Corporation\n74:95:EC\t\tAlpsalpine Co,.Ltd\n74:96:37\t\tTodaair Electronic Co., Ltd\n74:97:79\t\tCloud Network Technology Singapore Pte. Ltd.\n74:97:81\t\tzte corporation\n74:97:8E\t\tNova Labs\n74:99:75\t\tIBM Corporation\n74:9A:C0\t\tCachengo, Inc.\n74:9B:89\t\tHuawei Technologies Co.,Ltd\n74:9B:E8\t\tHitron Technologies. Inc\n74:9C:52\t\tHuizhou Desay SV Automotive Co., Ltd.\n74:9C:E3\t\tKodaCloud Canada, Inc\n74:9D:79\t\tSercomm Corporation.\n74:9D:8F\t\tHuawei Technologies Co.,Ltd\n74:9D:DC\t\t2Wire Inc\n74:9E:75\t\tHewlett Packard Enterprise\n74:9E:A5\t\tOhsung\n74:9E:AF\t\tApple, Inc.\n74:9E:F5\t\tSamsung Electronics Co.,Ltd\n74:A0:2F\t\tCisco Systems, Inc\n74:A0:63\t\tHuawei Technologies Co.,Ltd\n74:A2:E6\t\tCisco Systems, Inc\n74:A3:4A\t\tZimi Corporation\n74:A4:A7\t\tQRS Music Technologies, Inc.\n74:A4:B5\t\tPowerleader Science and Technology Co. Ltd.\n74:A5:28\t\tHuawei Technologies Co.,Ltd\n74:A5:7E\t\tPanasonic Ecology Systems\n74:A5:8C\t\tTexas Instruments\n74:A5:C2\t\tKYOCERA Corporation\n74:A6:CD\t\tApple, Inc.\n74:A7:22\t\tLG Electronics (Mobile Communications)\n74:A7:8E\t\tzte corporation\n74:A7:EA\t\tAmazon Technologies Inc.\n74:AB:93\t\tBlink by Amazon\n74:AC:5F\t\tQiku Internet Network Scientific (Shenzhen) Co., Ltd.\n74:AC:B9\t\tUbiquiti Inc\n74:AD:45\t\tValeo Auto- Electric Hungary Ltd\n74:AD:98\t\tCisco Systems, Inc\n74:AD:B7\t\tChina Mobile Group Device Co.,Ltd.\n74:AD:CB\t\tNew H3C Technologies Co., Ltd\n74:AE:76\t\tiNovo Broadband, Inc.\n74:B0:0C\t\tNetwork Video Technologies, Inc\n74:B0:59\t\tMotorola Mobility LLC, a Lenovo Company\n74:B3:EA\t\tEk Inc.\n74:B4:72\t\tCiesse\n74:B5:7E\t\tzte corporation\n74:B5:87\t\tApple, Inc.\n74:B6:B6\t\teero inc.\n74:B7:25\t\tHuawei Device Co., Ltd.\n74:B7:B3\t\tShenzhen YOUHUA Technology Co., Ltd\n74:B7:E6\t\tZegna-Daidong Limited\n74:B8:0F\t\tZipline International Inc.\n74:B8:39\t\tTexas Instruments\n74:B8:A8\t\tHuawei Technologies Co.,Ltd\n74:B9:1E\t\tNanjing Bestway Automation System Co., Ltd\n74:B9:EB\t\tJinQianMao Technology Co.,Ltd.\n74:BA:DB\t\tLongconn Electornics(shenzhen)Co.,Ltd\n74:BB:D3\t\tShenzhen xeme Communication Co., Ltd.\n74:BE:08\t\tATEK Products, LLC\n74:BE:F3\t\tMotorola Mobility LLC, a Lenovo Company\n74:BF:A1\t\tHyunteck\n74:BF:B7\t\tNusoft Corporation\n74:BF:C0\t\tCanon Inc.\n74:C1:4F\t\tHuawei Technologies Co.,Ltd\n74:C1:7D\t\tInfinix mobility limited\n74:C1:7E\t\tLG Electronics\n74:C2:46\t\tAmazon Technologies Inc.\n74:C3:30\t\tShenzhen Fast Technologies Co.,Ltd\n74:C4:12\t\tMicrosoft Corporation\n74:C5:30\t\tvivo Mobile Communication Co., Ltd.\n74:C6:21\t\tZhejiang Hite Renewable Energy Co.,LTD\n74:C6:3B\t\tAzureWave Technology Inc.\n74:C6:4A\t\tAGOS Co.,Ltd\n74:C7:6E\t\tRtk-Technologies, Llc\n74:C9:0F\t\tMicrochip Technologies Inc\n74:C9:29\t\tZhejiang Dahua Technology Co., Ltd.\n74:C9:9A\t\tEricsson AB\n74:C9:A3\t\tFiberhome Telecommunication Technologies Co.,LTD\n74:CA:25\t\tCalxeda, Inc.\n74:CA:60\t\tSonos, Inc.\n74:CB:F3\t\tLava international limited\n74:CC:39\t\tFiberhome Telecommunication Technologies Co.,LTD\n74:CC:40\t\tApple, Inc.\n74:CD:0C\t\tSmith Myers Communications Ltd.\n74:CE:56\t\tPacket Force Technology Limited Company\n74:CF:00\t\tShenzhen SuperElectron Technology Co.,Ltd.\n74:D0:2B\t\tASUSTek COMPUTER INC.\n74:D0:DC\t\tEricsson AB\n74:D2:1D\t\tHuawei Technologies Co.,Ltd\n74:D2:85\t\tTexas Instruments\n74:D4:23\t\tAmazon Technologies Inc.\n74:D4:35\t\tGiga-Byte Technology Co.,Ltd.\n74:D4:DD\t\tQuanta Computer Inc.\n74:D5:58\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n74:D5:B8\t\tInfraeo Inc\n74:D5:C6\t\tMicrochip Technologies Inc\n74:D6:37\t\tAmazon Technologies Inc.\n74:D6:54\t\tGint\n74:D6:75\t\tWYMA Tecnologia\n74:D6:CB\t\tNew H3C Technologies Co., Ltd\n74:D6:E5\t\tHuawei Device Co., Ltd.\n74:D6:EA\t\tTexas Instruments\n74:D7:13\t\tHuaqin Technology Co. LTD\n74:D7:CA\t\tPanasonic Automotive Systems Co.,Ltd\n74:D8:3E\t\tIntel Corporate\n74:D8:50\t\tEvrisko Systems\n74:D8:73\t\tGuangdong Genius Technology Co., Ltd.\n74:D9:EB\t\tPetabit Scale, Inc.\n74:DA:38\t\tEdimax Technology Co. Ltd.\n74:DA:88\t\tTp-Link Technologies Co.,Ltd.\n74:DA:DA\t\tD-Link International\n74:DA:EA\t\tTexas Instruments\n74:DB:D1\t\tEbay Inc\n74:DD:CB\t\tChina Leadshine Technology Co.,Ltd\n74:DE:2B\t\tLiteon Technology Corporation\n74:DF:BF\t\tLiteon Technology Corporation\n74:E0:6E\t\tErgophone GmbH\n74:E1:47\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n74:E1:4A\t\tIEEE Registration Authority\n74:E1:4A:00:00:00/28\tAltenburger Electronic GmbH\n74:E1:4A:10:00:00/28\tCerevo Inc.\n74:E1:4A:20:00:00/28\tKLIMAT SOLEC Sp. z o.o.\n74:E1:4A:30:00:00/28\temz-Hanauer GmbH & Co. KGaA\n74:E1:4A:40:00:00/28\topen joint stock company \"YUG-SISTEMA plus\"\n74:E1:4A:50:00:00/28\tUTU Oy\n74:E1:4A:60:00:00/28\tEmerging Technology (Holdings) Ltd.\n74:E1:4A:70:00:00/28\tAPM Technologies (DongGuan) Ltd\n74:E1:4A:80:00:00/28\taritec gmbh\n74:E1:4A:90:00:00/28\tKanto Aircraft Instrument Co., Ltd.\n74:E1:4A:A0:00:00/28\tAStar Design Service Technologies Co., Ltd.\n74:E1:4A:B0:00:00/28\tLoctek Visual Technology Corp.\n74:E1:4A:C0:00:00/28\tWuhan Shenghong Laser Projection Technology Co.,LTD\n74:E1:4A:D0:00:00/28\tKnog Pty Ltd\n74:E1:4A:E0:00:00/28\tDiamond Kinetics\n74:E1:4A:F0:00:00/28\tPrivate\n74:E1:82\t\tTexas Instruments\n74:E1:9A\t\tFiberhome Telecommunication Technologies Co.,LTD\n74:E1:B6\t\tApple, Inc.\n74:E2:0C\t\tAmazon Technologies Inc.\n74:E2:77\t\tVizmonet Pte Ltd\n74:E2:8C\t\tMicrosoft Corporation\n74:E2:E7\t\tCisco Systems, Inc\n74:E2:F5\t\tApple, Inc.\n74:E3:36\t\tFujian Star-Net Communication Co.,Ltd\n74:E4:24\t\tApiste Corporation\n74:E5:0B\t\tIntel Corporate\n74:E5:37\t\tRadspin\n74:E5:43\t\tLiteon Technology Corporation\n74:E5:F9\t\tIntel Corporate\n74:E6:0F\t\tTecno Mobile Limited\n74:E6:B8\t\tLG Electronics\n74:E6:E2\t\tDell Inc.\n74:E7:98\t\tJuniper Networks\n74:E7:C6\t\tCommscope\n74:E9:87\t\tApple, Inc.\n74:E9:BF\t\tHuawei Technologies Co.,Ltd\n74:E9:D8\t\tShanghai High-Flying Electronics Technology Co.,Ltd\n74:EA:3A\t\tTp-Link Technologies Co.,Ltd.\n74:EA:C8\t\tNew H3C Technologies Co., Ltd\n74:EA:CB\t\tNew H3C Technologies Co., Ltd\n74:EA:E8\t\tCommscope\n74:EB:80\t\tSamsung Electronics Co.,Ltd\n74:EC:42\t\tFiberhome Telecommunication Technologies Co.,LTD\n74:EC:B2\t\tAmazon Technologies Inc.\n74:EC:F1\t\tAcumen\n74:EE:2A\t\tShenzhen Bilian Electronic Co.，Ltd\n74:EE:8D\t\tApollo Intelligent Connectivity (Beijing) Technology Co., Ltd.\n74:EF:4B\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n74:F0:6D\t\tAzureWave Technology Inc.\n74:F0:7D\t\tBnCOM Co.,Ltd\n74:F1:02\t\tBeijing HCHCOM Technology Co., Ltd\n74:F2:FA\t\tXiaomi Communications Co Ltd\n74:F4:13\t\tMaxwell Forest\n74:F4:41\t\tSamsung Electronics Co.,Ltd\n74:F6:12\t\tCommscope\n74:F6:1C\t\tHTC Corporation\n74:F6:61\t\tSchneider Electric Fire & Security Oy\n74:F6:7A\t\tSamsung Electronics Co.,Ltd\n74:F7:26\t\tNeuron Robotics\n74:F7:37\t\tKce\n74:F7:F6\t\tShanghai Sunmi Technology Co.,Ltd.\n74:F8:5D\t\tBerkeley Nucleonics Corp\n74:F8:DB\t\tIEEE Registration Authority\n74:F8:DB:00:00:00/28\tEnercon Technologies\n74:F8:DB:10:00:00/28\tGHL Advanced Technology GmbH & Co. KG\n74:F8:DB:20:00:00/28\tShenzhen Ruishi Information Technology Co.,Ltd.\n74:F8:DB:30:00:00/28\tAtx\n74:F8:DB:40:00:00/28\tWiFi Hotspots, SL\n74:F8:DB:50:00:00/28\tProvision-ISR\n74:F8:DB:60:00:00/28\tShenzhen Melon Electronics Co.,Ltd\n74:F8:DB:70:00:00/28\tWuhan Tianyu Information Industry Co., Ltd.\n74:F8:DB:80:00:00/28\tSongam Syscom Co. LTD.\n74:F8:DB:90:00:00/28\tAvantree Corporation\n74:F8:DB:A0:00:00/28\tBallard Technology, Inc,\n74:F8:DB:B0:00:00/28\tCapwave Technologies Inc\n74:F8:DB:C0:00:00/28\tTbm Co., Ltd.\n74:F8:DB:D0:00:00/28\tSimon Electric (China) Co.,ltd\n74:F8:DB:E0:00:00/28\tBernard Krone Holding GmbH & Co. KG\n74:F8:DB:F0:00:00/28\tPrivate\n74:F9:0F\t\tHuawei Technologies Co.,Ltd\n74:F9:1A\t\tOnface\n74:F9:CA\t\tNintendo Co.,Ltd\n74:FB:17\t\tQingdao Goertek  Horizons Tecnology  Co.,LTD\n74:FC:45\t\tSiemens Ag\n74:FD:A0\t\tCompupal (Group) Corporation\n74:FE:48\t\tAdvantech Co., Ltd.\n74:FE:CE\t\tTP-Link Systems Inc\n74:FF:4C\t\tSkyworth Digital Technology(Shenzhen) Co.,Ltd\n74:FF:7D\t\tWren Sound Systems, LLC\n78:00:9E\t\tSamsung Electronics Co.,Ltd\n78:00:A8\t\tPt Han Sung Electoronics Indonesia\n78:02:8B\t\tApple, Inc.\n78:02:8F\t\tAdaptive Spectrum and Signal Alignment (ASSIA), Inc.\n78:02:B1\t\tCisco Systems, Inc\n78:02:B7\t\tShenZhen Ultra Easy Technology CO.,LTD\n78:02:F8\t\tXiaomi Communications Co Ltd\n78:03:4F\t\tNokia\n78:04:73\t\tTexas Instruments\n78:04:7A\t\tEdge Networks LLC\n78:04:E3\t\tHuawei Device Co., Ltd.\n78:05:41\t\tQueclink Wireless Solutions Co., Ltd\n78:05:5F\t\tShenzhen WYC Technology Co., Ltd.\n78:05:8C\t\tmMax Communications, Inc.\n78:06:C9\t\tHuawei Device Co., Ltd.\n78:07:1C\t\tGreen Energy Options Ltd\n78:07:38\t\tZ.U.K. Elzab S.A.\n78:07:8F\t\tHuawei Technologies Co.,Ltd\n78:08:4D\t\tHuawei Technologies Co.,Ltd\n78:0A:C7\t\tBaofeng TV Co., Ltd.\n78:0B:8C\t\tPrivate\n78:0C:71\t\tInseego Wireless, Inc\n78:0C:B8\t\tIntel Corporate\n78:0C:F0\t\tCisco Systems, Inc\n78:0E:D1\t\tTRUMPF Werkzeugmaschinen GmbH+Co.KG\n78:0F:77\t\tHangZhou Gubei Electronics Technology Co.,Ltd\n78:0F:81\t\tCisco Meraki\n78:10:53\t\tChina Mobile Group Device Co.,Ltd.\n78:11:00\t\tQuantumsolution\n78:11:85\t\tNBS Payment Solutions Inc.\n78:11:DC\t\tXIAOMI Electronics,CO.,LTD\n78:12:3E\t\tTecno Mobile Limited\n78:12:B8\t\tOrantek Limited\n78:13:05\t\tIEEE Registration Authority\n78:13:05:00:00:00/28\tInnoSenT\n78:13:05:10:00:00/28\tGlobal Media Streaming LLC\n78:13:05:20:00:00/28\tLeaff Engineering Srl\n78:13:05:30:00:00/28\tmicrotec Sicherheitstechnik GmbH\n78:13:05:40:00:00/28\tJiangxi Winsky Intelligence Technology Co., Ltd\n78:13:05:50:00:00/28\tAts-Convers,Llc\n78:13:05:60:00:00/28\tCRRC Nangjing Puzhen Haitai Brake Equipment Co., LTD\n78:13:05:70:00:00/28\tE-Stone Electronics Co., Ltd\n78:13:05:80:00:00/28\tShenzhen AV-Display Co.,Ltd\n78:13:05:90:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n78:13:05:A0:00:00/28\tLeonardo SpA - Montevarchi\n78:13:05:B0:00:00/28\tBithouse Oy\n78:13:05:C0:00:00/28\tBrigates Microelectronics Co., Ltd.\n78:13:05:D0:00:00/28\tShanghai Siminics Optoelectronic Technology Co., Ltd\n78:13:05:E0:00:00/28\tDongguan zhenxing electronic technology co.,limited\n78:13:E0\t\tFujian Star-Net Communication Co.,Ltd\n78:15:2D\t\tUnion Chip Technology Limited\n78:16:99\t\tHuawei Technologies Co.,Ltd\n78:17:35\t\tNokia Shanghai Bell Co., Ltd.\n78:17:BE\t\tHuawei Technologies Co.,Ltd\n78:18:81\t\tAzureWave Technology Inc.\n78:18:A8\t\tHuawei Device Co., Ltd.\n78:18:EC\t\tFortinet, Inc.\n78:19:2E\t\tNASCENT Technology\n78:19:F7\t\tJuniper Networks\n78:1C:1E\t\tChongqing Yipingfang Technology Co., Ltd.\n78:1C:3C\t\tEspressif Inc.\n78:1C:5A\t\tSHARP Corporation\n78:1C:9D\t\tSilicon Laboratories\n78:1D:4A\t\tzte corporation\n78:1D:BA\t\tHuawei Technologies Co.,Ltd\n78:1D:FD\t\tJabil Inc\n78:1E:B8\t\tShenzhen iComm Semiconductor CO.,LTD\n78:1F:11\t\tRAB Lighting\n78:1F:7C\t\tNokia\n78:1F:DB\t\tSamsung Electronics Co.,Ltd\n78:20:2E\t\tSkychers Creations ShenZhen Limited\n78:20:51\t\tTP-Link Systems Inc.\n78:20:79\t\tID Tech\n78:20:A5\t\tNintendo Co.,Ltd\n78:20:BD\t\tPolysense (Beijing) Technologies Co. Ltd\n78:21:84\t\tEspressif Inc.\n78:22:3D\t\tAffirmed Networks\n78:22:88\t\tShenzhen Bilian Electronic Co.，Ltd\n78:23:27\t\tSamsung Electronics Co.,Ltd\n78:23:AE\t\tCommscope\n78:24:59\t\tAlcatel-Lucent Enterprise\n78:24:AF\t\tASUSTek COMPUTER INC.\n78:24:BE\t\tCisco Systems, Inc\n78:25:44\t\tOmnima Limited\n78:25:7A\t\tLEO Innovation Lab\n78:25:99\t\tHuawei Device Co., Ltd.\n78:25:AD\t\tSamsung Electronics Co.,Ltd\n78:26:A6\t\tzte corporation\n78:28:CA\t\tSonos, Inc.\n78:29:AD\t\tNingbo Qixiang Information Technology Co., Ltd\n78:29:ED\t\tAskey Computer Corp\n78:2A:79\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n78:2A:F8\t\tIethcom Information Technology Co., Ltd.\n78:2B:46\t\tIntel Corporate\n78:2B:60\t\tHuawei Device Co., Ltd.\n78:2B:64\t\tBose Corporation\n78:2B:CB\t\tDell Inc.\n78:2C:29\t\tNew H3C Technologies Co., Ltd\n78:2D:7E\t\tTRENDnet, Inc.\n78:2D:AD\t\tHuawei Technologies Co.,Ltd\n78:2E:03\t\tGuangdong Genius Technology Co., Ltd.\n78:2E:56\t\tChina Mobile Group Device Co.,Ltd.\n78:2E:EF\t\tNokia Corporation\n78:2F:17\t\tXlab Co.,Ltd\n78:30:3B\t\tStephen Technologies Co.,Limited\n78:30:5D\t\tzte corporation\n78:30:E1\t\tUltraClenz, LLC\n78:30:F5\t\tTBT Inc.\n78:31:2B\t\tzte corporation\n78:31:C1\t\tApple, Inc.\n78:32:1B\t\tD-Link International\n78:32:4F\t\tMillennium Group, Inc.\n78:33:C6\t\tSamsung Electronics Co.,Ltd\n78:34:09\t\tHuawei Technologies Co.,Ltd\n78:34:86\t\tNokia\n78:34:FD\t\tvivo Mobile Communication Co., Ltd.\n78:35:A0\t\tZurn Industries LLC\n78:36:07\t\tCermate Technologies Inc.\n78:36:90\t\tYulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd\n78:36:CC\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n78:37:16\t\tSamsung Electronics Co.,Ltd\n78:39:2D\t\tIEEE Registration Authority\n78:39:2D:00:00:00/28\tNeuron GmbH\n78:39:2D:10:00:00/28\tLivEye GmbH\n78:39:2D:20:00:00/28\tChengdu Shiketong Technology Co.,Ltd\n78:39:2D:30:00:00/28\tZeta Alarms Limited\n78:39:2D:40:00:00/28\tAnnapurna labs\n78:39:2D:50:00:00/28\tIO Master Technology\n78:39:2D:60:00:00/28\tAnnapurna labs\n78:39:2D:70:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n78:39:2D:80:00:00/28\tDreamtek\n78:39:2D:90:00:00/28\tAVATR Co., LTD.\n78:39:2D:A0:00:00/28\tEdgenectar Inc.\n78:39:2D:B0:00:00/28\tMedRx, Inc\n78:39:2D:C0:00:00/28\tJiangsu Yibang New Energy Technology Co., LTD\n78:39:2D:D0:00:00/28\tAvantree Corporation\n78:39:2D:E0:00:00/28\tPlaneta Informática Ltda\n78:3A:6C\t\tTecno Mobile Limited\n78:3A:84\t\tApple, Inc.\n78:3C:E3\t\tKai-EE\n78:3D:5B\t\tTELNET Redes Inteligentes S.A.\n78:3E:53\t\tSky Uk Limited\n78:3E:A1\t\tNokia Shanghai Bell Co., Ltd.\n78:3F:15\t\tEasySYNC Ltd.\n78:3F:4D\t\tApple, Inc.\n78:40:E4\t\tSamsung Electronics Co.,Ltd\n78:42:1C\t\tEspressif Inc.\n78:44:05\t\tFUJITU(HONG KONG) ELECTRONIC Co.,LTD.\n78:44:4A\t\tShenzhen Aiwinn information Technology Co., Ltd.\n78:44:76\t\tZioncom Electronics (Shenzhen) Ltd.\n78:44:FD\t\tTp-Link Technologies Co.,Ltd.\n78:45:01\t\tBiamp Systems\n78:45:58\t\tUbiquiti Inc\n78:45:61\t\tCyberTAN Technology Inc.\n78:45:B3\t\tHuawei Device Co., Ltd.\n78:45:C4\t\tDell Inc.\n78:46:5C\t\tCloud Network Technology Singapore Pte. Ltd.\n78:46:5F\t\tFiberhome Telecommunication Technologies Co.,LTD\n78:46:7D\t\tSKAIChips\n78:46:C4\t\tDaehap Hyper-Tech\n78:46:D4\t\tSamsung Electronics Co.,Ltd\n78:47:1D\t\tSamsung Electronics Co.,Ltd\n78:47:E3\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n78:48:2C\t\tStart Usa, Inc.\n78:48:59\t\tHewlett Packard\n78:49:1D\t\tThe Will-Burt Company\n78:49:46\t\tCambridge Mobile Telematics, Inc.\n78:4B:08\t\tf.robotics acquisitions ltd\n78:4B:87\t\tMurata Manufacturing Co., Ltd.\n78:4F:24\t\tTaicang T&W Electronics\n78:4F:43\t\tApple, Inc.\n78:4F:9B\t\tJuniper Networks\n78:50:05\t\tMOKO TECHNOLOGY Ltd\n78:50:7C\t\tJuniper Networks\n78:51:0C\t\tLiveU Ltd.\n78:52:1A\t\tSamsung Electronics Co.,Ltd\n78:52:37\t\tzte corporation\n78:52:4A\t\tOptonic GmbH\n78:52:62\t\tShenzhen Hojy Software Co., Ltd.\n78:53:0D\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n78:53:33\t\tBeijing Xiaomi Electronics Co.,Ltd\n78:53:64\t\tSHIFT GmbH\n78:53:F2\t\tRoxton Systems Ltd.\n78:54:2E\t\tD-Link International\n78:55:17\t\tSankyuElectronics\n78:55:36\t\tshenzhen AZW Technology(Group) Co.,Ltd\n78:57:12\t\tMobile Integration Workgroup\n78:57:73\t\tHuawei Technologies Co.,Ltd\n78:57:B0\t\tGertec Brasil Ltda\n78:58:44\t\tHangzhou Sciener Smart Technology Co., Ltd.\n78:58:60\t\tHuawei Technologies Co.,Ltd\n78:58:F3\t\tVachen Co.,Ltd\n78:59:3E\t\tRAFI GmbH & Co.KG\n78:59:5E\t\tSamsung Electronics Co.,Ltd\n78:59:68\t\tHon Hai Precision Ind. Co.,Ltd.\n78:59:94\t\tAlif Semiconductor, Inc.\n78:5B:64\t\tHuawei Device Co., Ltd.\n78:5C:28\t\tPrime Motion Inc.\n78:5C:5E\t\tHuawei Technologies Co.,Ltd\n78:5C:72\t\tHioso Technology Co., Ltd.\n78:5D:C8\t\tLG Electronics\n78:5E:A2\t\tSunitec Enterprise Co.,Ltd\n78:5E:CC\t\tApple, Inc.\n78:5E:E8\t\tIEEE Registration Authority\n78:5E:E8:00:00:00/28\tYoutransactor\n78:5E:E8:10:00:00/28\tRIKEN KEIKI NARA MFG. Co., Ltd.\n78:5E:E8:20:00:00/28\tVega-Absolute\n78:5E:E8:30:00:00/28\tIncontrol LLC\n78:5E:E8:40:00:00/28\tbeijing Areospace Hongda optoelectronics technology co.,ltd\n78:5E:E8:50:00:00/28\tInfomobility S.R.L.\n78:5E:E8:60:00:00/28\tGuangdong COROS Sports Technology Co., Ltd\n78:5E:E8:70:00:00/28\tMt B?Lg? Teknoloj?Ler? Ve Di? T?C. A.?.\n78:5E:E8:80:00:00/28\tJiangxi guoxuan radio and television technology Co.,Ltd\n78:5E:E8:90:00:00/28\tTOPDON TECHNOLOGY Co.,Ltd.\n78:5E:E8:A0:00:00/28\tYake (Tianjin) Technology Co.,Ltd.\n78:5E:E8:B0:00:00/28\tLantern Engineering (Pty) Ltd\n78:5E:E8:C0:00:00/28\tFinetooling Technology(Hong Kong)Co.,Limited\n78:5E:E8:D0:00:00/28\tTachyon Networks\n78:5E:E8:E0:00:00/28\tSuzhou Tianping Advanced Digital Technologies Co.Ltd\n78:5F:28\t\tEM Microelectronic\n78:5F:36\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n78:5F:4C\t\tArgox Information Co., Ltd.\n78:5F:6C\t\tArista Networks\n78:60:5B\t\tTp-Link Technologies Co.,Ltd.\n78:61:7C\t\tMitsumi Electric Co.,Ltd.\n78:62:56\t\tHuawei Technologies Co.,Ltd\n78:62:99\t\tBITSTREAM sp. z o.o.\n78:64:A0\t\tCisco Systems, Inc\n78:64:C0\t\tApple, Inc.\n78:64:E6\t\tGreen Motive Technology Limited\n78:65:3B\t\tShaoxing Ourten Electronics Co., Ltd.\n78:65:59\t\tSagemcom Broadband SAS\n78:66:9D\t\tHui Zhou Gaoshengda Technology Co.,LTD\n78:66:AE\t\tZTEC Instruments, Inc.\n78:66:D7\t\tGenstoraige Technology Co.Ltd.\n78:66:F3\t\tshenzhen worldelite electronics co., LTD\n78:67:0E\t\tWistron Neweb Corporation\n78:67:D7\t\tApple, Inc.\n78:68:29\t\teero inc.\n78:68:F7\t\tYSTen Technology Co.,Ltd\n78:69:D4\t\tShenyang Vibrotech Instruments Inc.\n78:6A:1F\t\tCommscope\n78:6A:89\t\tHuawei Technologies Co.,Ltd\n78:6C:1C\t\tApple, Inc.\n78:6C:84\t\tAmazon Technologies Inc.\n78:6C:AB\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n78:6D:94\t\tPalo Alto Networks\n78:6D:EB\t\tGE Lighting\n78:70:52\t\tWelotec GmbH\n78:71:04\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n78:71:9C\t\tCommscope\n78:72:5D\t\tCisco Systems, Inc\n78:72:64\t\tIEEE Registration Authority\n78:72:64:00:00:00/28\tSmartMore Co.,ltd.\n78:72:64:10:00:00/28\tZhengzhou Reform Intelligent Device Co., Ltd\n78:72:64:20:00:00/28\tBzbgear\n78:72:64:30:00:00/28\tGuangdong Hongqin Telecom Technology Co.,Ltd.\n78:72:64:40:00:00/28\tAsustor Inc.\n78:72:64:50:00:00/28\tCaltta Technologies Co.,Ltd.\n78:72:64:60:00:00/28\tShenzhen C-DIGI Technology Co.,Ltd.\n78:72:64:70:00:00/28\tConjing Networks Inc.\n78:72:64:80:00:00/28\tGsou Technology(Shenzhen)Co.,Ltd\n78:72:64:90:00:00/28\tShenzhen Fangzhicheng Technology Co., Ltd.\n78:72:64:A0:00:00/28\tTyphoon HIL, Inc.\n78:72:64:B0:00:00/28\tdigades GmbH\n78:72:64:C0:00:00/28\tComcast-SRL\n78:72:64:D0:00:00/28\tQT systems ab\n78:72:64:E0:00:00/28\tHeltec Automation\n78:75:3E\t\tApple, Inc.\n78:76:89\t\teero inc.\n78:76:D9\t\tEXARA Group\n78:78:35\t\tIEEE Registration Authority\n78:78:35:00:00:00/28\tATsens\n78:78:35:10:00:00/28\tENQT GmbH\n78:78:35:20:00:00/28\tEHTech (Beijing)Co., Ltd.\n78:78:35:30:00:00/28\tShenzhen Chuangwei Electronic Appliance Tech Co., Ltd.\n78:78:35:40:00:00/28\tJiaxing Cyber Sensor Intelligent Technology Co., Ltd.\n78:78:35:50:00:00/28\tIRISS Inc.\n78:78:35:60:00:00/28\tMAICUN Information Technology(Shanghai)Co.,Ltd\n78:78:35:70:00:00/28\tAmbient Life Inc.\n78:78:35:80:00:00/28\tShandong Xintong Electronics Co., Ltd\n78:78:35:90:00:00/28\tBloom View Limited\n78:78:35:A0:00:00/28\tSkylight\n78:78:35:B0:00:00/28\tShanghai Intchains Technology Co., Ltd.\n78:78:35:C0:00:00/28\tDBG Communications Technology Co.,Ltd.\n78:78:35:D0:00:00/28\tSuzhou Chena Information Technology Co., Ltd.\n78:78:35:E0:00:00/28\tNEOARK Corporation\n78:7A:6F\t\tJuice Technology AG\n78:7B:8A\t\tApple, Inc.\n78:7D:48\t\tItel Mobile Limited\n78:7D:53\t\tExtreme Networks Headquarters\n78:7D:F3\t\tSterlite Technologies Limited\n78:7E:42\t\tzte corporation\n78:7E:61\t\tApple, Inc.\n78:7F:62\t\tGiK mbH\n78:80:38\t\tFunai Electric Co., Ltd.\n78:81:02\t\tSercomm Corporation.\n78:81:8C\t\tNintendo Co.,Ltd\n78:81:8F\t\tServer Racks Australia Pty Ltd\n78:81:CE\t\tChina Mobile Iot Limited company\n78:83:71\t\tHuawei Technologies Co.,Ltd\n78:84:3C\t\tSony Corporation\n78:84:EE\t\tIndra Espacio S.A.\n78:85:17\t\tCisco Systems, Inc\n78:85:F4\t\tHuawei Device Co., Ltd.\n78:86:2E\t\tMicrosoft Corporation\n78:86:B6\t\tShenzhen YOUHUA Technology Co., Ltd\n78:87:0D\t\tUnifiedgateways India Private Limited\n78:88:6D\t\tApple, Inc.\n78:88:8A\t\tCDR Sp. z o.o. Sp. k.\n78:89:73\t\tCmc\n78:8A:20\t\tUbiquiti Inc\n78:8A:86\t\tChina Dragon Technology Limited\n78:8B:2A\t\tZhen Shi Information Technology (Shanghai) Co., Ltd.\n78:8B:77\t\tStandar Telecom\n78:8C:4D\t\tIndyme Solutions, LLC\n78:8C:54\t\tPing Communication\n78:8C:77\t\tLexmark International, Inc.\n78:8C:B5\t\tTP-Link Systems Inc\n78:8D:AF\t\tSagemcom Broadband SAS\n78:8D:F7\t\tHitron Technologies. Inc\n78:8E:33\t\tJiangsu SEUIC Technology Co.,Ltd\n78:8E:45\t\tJizaie inc.\n78:90:A2\t\tzte corporation\n78:91:DE\t\tGuangdong ACIGA Science&Technology Co.,Ltd\n78:91:E9\t\tRaisecom Technology CO., LTD\n78:92:3E\t\tNokia Corporation\n78:92:9C\t\tIntel Corporate\n78:93:C3\t\tHui Zhou Gaoshengda Technology Co.,LTD\n78:94:B4\t\tSercomm Corporation.\n78:94:E8\t\tRadio Bridge\n78:95:EB\t\tItel Mobile Limited\n78:96:82\t\tzte corporation\n78:96:84\t\tCommscope\n78:96:A3\t\tExtreme Networks Headquarters\n78:97:C3\t\tDingxin Information Technology Co.,Ltd\n78:98:E8\t\tD-Link International\n78:98:FD\t\tQ9 Networks Inc.\n78:99:12\t\tFlyingvoice (HongKong) Technologies Limited\n78:99:5C\t\tNationz Technologies Inc\n78:99:66\t\tMusilab Electronics (DongGuan)Co.,Ltd.\n78:99:87\t\tXiaomi Communications Co Ltd\n78:99:8F\t\tMediline Italia Srl\n78:9A:18\t\tRouterboard.com\n78:9C:85\t\tAugust Home, Inc.\n78:9C:E7\t\tShenzhen Aikede Technology Co., Ltd\n78:9E:D0\t\tSamsung Electronics Co.,Ltd\n78:9F:38\t\tShenzhen Feasycom Co., Ltd\n78:9F:4C\t\tHOERBIGER Elektronik GmbH\n78:9F:6A\t\tRuckus Wireless\n78:9F:70\t\tApple, Inc.\n78:9F:87\t\tSiemens AG I IA PP PRM\n78:9F:AA\t\tHuawei Device Co., Ltd.\n78:A0:3F\t\tAmazon Technologies Inc.\n78:A0:51\t\tiiNet Labs Pty Ltd\n78:A1:06\t\tTp-Link Technologies Co.,Ltd.\n78:A1:3E\t\tNew H3C Technologies Co., Ltd\n78:A1:83\t\tAdvidia\n78:A1:D8\t\tShenzhenEnjoyTechnologyCo.,Ltd\n78:A2:A0\t\tNintendo Co., Ltd.\n78:A3:51\t\tShenzhen Zhibotong Electronics Co.,Ltd\n78:A3:E4\t\tApple, Inc.\n78:A4:BA\t\tMarquardt India Pvt Ltd\n78:A5:04\t\tTexas Instruments\n78:A5:DD\t\tShenzhen Smarteye Digital Electronics Co., Ltd\n78:A6:83\t\tPrecidata\n78:A6:A0\t\tHangzhou Ezviz Software Co.,Ltd.\n78:A6:BD\t\tDAEYEON Control&Instrument Co,.Ltd\n78:A6:E1\t\tBrocade Communications Systems LLC\n78:A7:14\t\tAmphenol\n78:A7:C7\t\tApple, Inc.\n78:A7:EB\t\t1More\n78:A8:73\t\tSamsung Electronics Co.,Ltd\n78:AA:82\t\tNew H3C Technologies Co., Ltd\n78:AB:60\t\tABB Australia\n78:AB:BB\t\tSamsung Electronics Co.,Ltd\n78:AC:44\t\tDell Inc.\n78:AC:BF\t\tIgneous Systems\n78:AC:C0\t\tHewlett Packard\n78:AE:0C\t\tFar South Networks\n78:AF:08\t\tIntel Corporate\n78:AF:58\t\tGimasi Sa\n78:AF:E4\t\tComau S.p.A\n78:B2:13\t\tDWnet Technologies(Suzhou) Corporation\n78:B2:8D\t\tBeijing Tengling Technology CO.Ltd\n78:B3:9F\t\tSernet (Suzhou) Technologies Corporation\n78:B3:B9\t\tShangHai sunup lighting CO.,LTD\n78:B3:CE\t\tElo touch solutions\n78:B4:6A\t\tHuawei Technologies Co.,Ltd\n78:B5:54\t\tHuawei Device Co., Ltd.\n78:B5:D2\t\tEver Treasure Industrial Limited\n78:B6:C1\t\tAOBO Telecom Co.,Ltd\n78:B6:EC\t\tScuf Gaming International LLC\n78:B6:FE\t\tSamsung Electronics Co.,Ltd\n78:B8:1A\t\tInter Sales A/S\n78:B8:4B\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n78:B8:D6\t\tZebra Technologies Inc.\n78:BA:D0\t\tShinybow Technology Co. Ltd.\n78:BA:F9\t\tCisco Systems, Inc\n78:BB:88\t\tMaxio Technology (Hangzhou) Ltd.\n78:BB:C1\t\tServercom (India) Private Limited\n78:BC:1A\t\tCisco Systems, Inc\n78:BD:BC\t\tSamsung Electronics Co.,Ltd\n78:BE:81\t\tFN-LINK TECHNOLOGY Ltd.\n78:BE:B6\t\tEnhanced Vision\n78:BE:BD\t\tSTULZ GmbH\n78:C1:1D\t\tSamsung Electronics Co.,Ltd\n78:C1:A7\t\tzte corporation\n78:C1:AE\t\tHangzhou Ezviz Software Co.,Ltd.\n78:C2:13\t\tSagemcom Broadband SAS\n78:C2:C0\t\tIEEE Registration Authority\n78:C2:C0:00:00:00/28\tShenzhen ELI Technology co.,ltd\n78:C2:C0:10:00:00/28\tXronos-Inc\n78:C2:C0:20:00:00/28\tRONIX incorporated\n78:C2:C0:30:00:00/28\tNingbo Sanxing Electric Co., Ltd.\n78:C2:C0:40:00:00/28\tOry Laboratory Co., Ltd.\n78:C2:C0:50:00:00/28\tShenZhen TuLing Robot CO.,LTD\n78:C2:C0:60:00:00/28\tSichuan Tianyi Comheart Telecom Co.,LTD\n78:C2:C0:70:00:00/28\tGuangzhou Hongcai Stage Equipment co.,ltd\n78:C2:C0:80:00:00/28\tBeijing Coilabs technology co.,ltd\n78:C2:C0:90:00:00/28\tSes\n78:C2:C0:A0:00:00/28\tOmbitron, Inc.\n78:C2:C0:B0:00:00/28\tWan Chao An (Beijing) Technology Co., Ltd.\n78:C2:C0:C0:00:00/28\tShanghai Hanyi Technologies Co,.Ltd.\n78:C2:C0:D0:00:00/28\tKORF Inc.\n78:C2:C0:E0:00:00/28\tHuwomobility\n78:C2:C0:F0:00:00/28\tPrivate\n78:C3:13\t\tChina Mobile Group Device Co.,Ltd.\n78:C3:E9\t\tSamsung Electronics Co.,Ltd\n78:C4:0E\t\tH&D Wireless\n78:C4:AB\t\tShenzhen Runsil Technology Co.,Ltd\n78:C4:FA\t\tMeta Platforms, Inc.\n78:C5:7D\t\tZyxel Communications Corporation\n78:C5:E5\t\tTexas Instruments\n78:C5:F8\t\tHuawei Device Co., Ltd.\n78:C6:2B\t\tFujian Star-Net Communication Co.,Ltd\n78:C6:BB\t\tAnalog Devices, Inc.\n78:C8:81\t\tSony Interactive Entertainment Inc.\n78:C8:84\t\tHuawei Device Co., Ltd.\n78:C9:5E\t\tMidmark RTLS\n78:CA:04\t\tNokia Corporation\n78:CA:39\t\tApple, Inc.\n78:CA:5E\t\tElno\n78:CA:83\t\tIEEE Registration Authority\n78:CA:83:00:00:00/28\tDaincube\n78:CA:83:10:00:00/28\tExcelocity Inc.\n78:CA:83:20:00:00/28\tApc\n78:CA:83:30:00:00/28\tNeofon GmbH\n78:CA:83:40:00:00/28\tPinhole (Beijing) Technology Co., Ltd.\n78:CA:83:50:00:00/28\tHuatune Technology (Shanghai) Co., Ltd.\n78:CA:83:60:00:00/28\tNomiku\n78:CA:83:70:00:00/28\tBeijing CarePulse Electronic Technology\n78:CA:83:80:00:00/28\tIhm\n78:CA:83:90:00:00/28\tLouroe Electronics\n78:CA:83:A0:00:00/28\tEksagate Elektronik Mühendislik ve Bilgisayar San. Tic. A.Ş.\n78:CA:83:B0:00:00/28\tZhejiang Science Electronic Tech Co., Ltd\n78:CA:83:C0:00:00/28\tElanview Technology Co.,Ltd\n78:CA:83:D0:00:00/28\tHubei Boyuan Zhijia Network Media Co. Ltd.\n78:CA:83:E0:00:00/28\tKonecranes\n78:CB:2C\t\tJoin Digital, Inc.\n78:CB:33\t\tDHC Software Co.,Ltd\n78:CB:68\t\tDaehap Hyper-Tech\n78:CC:2B\t\tSinewy Technology Co., Ltd\n78:CD:55\t\tTexas Instruments\n78:CD:8E\t\tSMC Networks Inc\n78:CE:A5\t\tVital link vietnam company limited\n78:CF:2F\t\tHuawei Technologies Co.,Ltd\n78:CF:F9\t\tHuawei Device Co., Ltd.\n78:D0:04\t\tNeousys Technology Inc.\n78:D1:29\t\tVicos\n78:D1:62\t\tApple, Inc.\n78:D2:94\t\tNetgear\n78:D3:47\t\tEricsson AB\n78:D3:4F\t\tPace-O-Matic, Inc.\n78:D3:8D\t\tHongkong Yunlink Technology Limited\n78:D3:ED\t\tNorma\n78:D4:F1\t\tIEEE Registration Authority\n78:D4:F1:00:00:00/28\tBurisch Elektronik Bauteile GmbH\n78:D4:F1:10:00:00/28\tSilla Industries\n78:D4:F1:20:00:00/28\tLyngsoe Systems\n78:D4:F1:30:00:00/28\tEkoenergetyka - Polska S.A.\n78:D4:F1:40:00:00/28\tBYD Auto lndustry Co.,Ltd\n78:D4:F1:50:00:00/28\tHuaqin Telecom Technology Co.,Ltd.\n78:D4:F1:60:00:00/28\tGuangzhou Kingray information technology Co.,Ltd.\n78:D4:F1:70:00:00/28\tFamar Fueguina S.A.\n78:D4:F1:80:00:00/28\tXiamen Cheerzing IOT Technology Co.,Ltd.\n78:D4:F1:90:00:00/28\tshanghai baudcom communication device co.,ltd\n78:D4:F1:A0:00:00/28\tBoneng Transmission(Suzhou)Co.,Ltd\n78:D4:F1:B0:00:00/28\tJiangsu byzoro intelligent technology Co.,Ltd\n78:D4:F1:C0:00:00/28\tTnb\n78:D4:F1:D0:00:00/28\tQuidel Corporation\n78:D4:F1:E0:00:00/28\tBlue Sparq, Inc.\n78:D5:B5\t\tNavielektro Ky\n78:D6:6F\t\tAristocrat Technologies Australia Pty. Ltd.\n78:D6:B2\t\tToshiba\n78:D6:D6\t\teero inc.\n78:D6:DC\t\tMotorola (Wuhan) Mobility Technologies Communication Co., Ltd.\n78:D6:F0\t\tSamsung Electro Mechanics Co., Ltd.\n78:D7:1A\t\tCiena Corporation\n78:D7:52\t\tHuawei Technologies Co.,Ltd\n78:D7:5F\t\tApple, Inc.\n78:D8:00\t\tIEEE Registration Authority\n78:D8:00:00:00:00/28\tKverneland Group Mechatronics\n78:D8:00:10:00:00/28\tShenzhen Envicool Information Technology Co., Ltd\n78:D8:00:20:00:00/28\tShanghai Espacetime Technology Co.,Ltd.\n78:D8:00:30:00:00/28\tShenzhen Scodeno Technology Co,. Ltd.\n78:D8:00:40:00:00/28\tCS Instruments GmbH\n78:D8:00:50:00:00/28\tBjörkviks Consulting AB\n78:D8:00:60:00:00/28\tAlango Technologies Ltd\n78:D8:00:70:00:00/28\tNimbeLink Corp\n78:D8:00:80:00:00/28\tSalunda Ltd\n78:D8:00:90:00:00/28\tSightLine Applications\n78:D8:00:A0:00:00/28\tInsignal Co., Ltd.\n78:D8:00:B0:00:00/28\tMaddalena S.p.A.\n78:D8:00:C0:00:00/28\tShenzhen Chenzhuo Technology Co., Ltd.\n78:D8:00:D0:00:00/28\tKorea Micro Wireless Co.,Ltd.\n78:D8:00:E0:00:00/28\tCL International\n78:D8:40\t\tXiaomi Communications Co Ltd\n78:D9:9F\t\tNuCom HK Ltd.\n78:D9:E9\t\tMomentum Iot\n78:DA:07\t\tZhejiang Tmall Technology Co., Ltd.\n78:DA:6E\t\tCisco Systems, Inc\n78:DA:A2\t\tCynosure Technologies Co.,Ltd\n78:DA:AF\t\tHuawei Technologies Co.,Ltd\n78:DA:B3\t\tGBO Technology\n78:DB:2F\t\tTexas Instruments\n78:DC:87\t\tHuawei Technologies Co.,Ltd\n78:DD:08\t\tHon Hai Precision Ind. Co.,Ltd.\n78:DD:12\t\tArcadyan Corporation\n78:DD:33\t\tHuawei Technologies Co.,Ltd\n78:DD:D6\t\tc-scape\n78:DD:D9\t\tGuangzhou Shiyuan Electronics Co., Ltd.\n78:DE:E4\t\tTexas Instruments\n78:DF:72\t\tShanghai Imilab Technology Co.Ltd\n78:E1:03\t\tAmazon Technologies Inc.\n78:E1:67\t\tLaunch Tech Co., Ltd.\n78:E2:2C\t\tHuawei Device Co., Ltd.\n78:E2:BD\t\tVodafone Automotive S.p.A.\n78:E3:6D\t\tEspressif Inc.\n78:E3:B5\t\tHewlett Packard\n78:E3:DE\t\tApple, Inc.\n78:E4:00\t\tHon Hai Precision Ind. Co.,Ltd.\n78:E6:1C\t\tHonor Device Co., Ltd.\n78:E7:D1\t\tHewlett Packard\n78:E8:B6\t\tzte corporation\n78:E9:80\t\tRainUs Co.,Ltd\n78:E9:96\t\tIEEE Registration Authority\n78:E9:96:00:00:00/28\tShenzhen Eeguard Technology Co.,Limited\n78:E9:96:10:00:00/28\tCogito Tech Company Limited\n78:E9:96:20:00:00/28\tStiebel Eltron Gmbh & Co. Kg\n78:E9:96:30:00:00/28\tACL Co.,Ltd.\n78:E9:96:40:00:00/28\tShenzhen Jin Hao Mi Technology Co., LTD\n78:E9:96:50:00:00/28\tChuangming Futre Technology Co., Ltd.\n78:E9:96:60:00:00/28\tKilews\n78:E9:96:70:00:00/28\tBeisit Electric Tech(Hangzhou)Co.,Ltd.\n78:E9:96:80:00:00/28\tShenzhen Zhiting Technology Co.,Ltd\n78:E9:96:90:00:00/28\tAtm Solutions\n78:E9:96:A0:00:00/28\tShenzhen Farben lnformation Technology CO.,Ltd.\n78:E9:96:B0:00:00/28\tCelAudio (Beijing) Technology Inc\n78:E9:96:C0:00:00/28\tGarantir Technologies Private Limited\n78:E9:96:D0:00:00/28\tLorch Schweisstechnik GmbH\n78:E9:96:E0:00:00/28\tBita-International Co.,Ltd\n78:E9:CF\t\tTellescom Industria E Comercio Em Telecomunicacao\n78:EB:14\t\tShenzhen Fast Technologies Co.,Ltd\n78:EB:39\t\tInstituto Nacional de Tecnología Industrial\n78:EB:46\t\tHuawei Technologies Co.,Ltd\n78:EC:22\t\tShanghai Qihui Telecom Technology Co., LTD\n78:EC:74\t\tKyland-USA\n78:ED:25\t\tNew H3C Technologies Co., Ltd\n78:ED:BC\t\tOnePlus Technology (Shenzhen) Co., Ltd\n78:EE:4C\t\tEspressif Inc.\n78:EF:4C\t\tUnetconvergence Co., Ltd.\n78:F0:9B\t\tHuawei Device Co., Ltd.\n78:F1:C6\t\tCisco Systems, Inc\n78:F2:35\t\tSichuan AI-Link Technology Co., Ltd.\n78:F2:38\t\tSamsung Electronics Co.,Ltd\n78:F2:76\t\tCyklop Fastjet Technologies (Shanghai) Inc.\n78:F2:9E\t\tPegatron Corporation\n78:F5:05\t\tMurata Manufacturing Co., Ltd.\n78:F5:57\t\tHuawei Technologies Co.,Ltd\n78:F5:E5\t\tBEGA Gantenbrink-Leuchten KG\n78:F5:FD\t\tHuawei Technologies Co.,Ltd\n78:F7:A3\t\tOpentext\n78:F7:BE\t\tSamsung Electronics Co.,Ltd\n78:F7:D0\t\tSilverbrook Research\n78:F8:82\t\tLG Electronics (Mobile Communications)\n78:F8:B8\t\tRako Controls Ltd\n78:F9:44\t\tPrivate\n78:F9:B4\t\tNokia Solutions and Networks GmbH & Co. KG\n78:FB:D8\t\tApple, Inc.\n78:FC:14\t\tFamily Zone Cyber Safety Ltd\n78:FD:94\t\tApple, Inc.\n78:FE:3D\t\tJuniper Networks\n78:FE:41\t\tSocus networks\n78:FE:E2\t\tShanghai Diveo Technology Co., Ltd\n78:FF:57\t\tIntel Corporate\n78:FF:CA\t\tTecno Mobile Limited\n7A:15:EC\t\tYatomi Techology(ZheJiang) Co.,Ltd\n7A:35:EA\t\tSHARP Corporation\n7A:38:4E\t\tPROFIBUS Nutzerorganisation e.V.\n7A:3F:8C\t\tSeagate Technology Thailand Ltd.\n7A:4B:A4\t\tInnostor Technology Corporation\n7A:4B:F3\t\tDilon Technologies\n7A:4D:2F\t\tOpen Compute Project\n7A:84:F0\t\tMcDowell Signal Processing, LLC (dba McDSP)\n7A:8D:D1\t\tTePS'EG\n7A:AB:77\t\tOrange\n7A:F9:55\t\tRelay, Inc.\n7A:FD:44\t\tRosenberger Hochfrequenztechnik GmbH & Co. KG\n7C:00:4D\t\tHuawei Technologies Co.,Ltd\n7C:01:0A\t\tTexas Instruments\n7C:01:87\t\tCurtis Instruments, Inc.\n7C:01:91\t\tApple, Inc.\n7C:02:BC\t\tHansung Electronics Co. LTD\n7C:03:4C\t\tSagemcom Broadband SAS\n7C:03:5E\t\tXiaomi Communications Co Ltd\n7C:03:AB\t\tXiaomi Communications Co Ltd\n7C:03:C9\t\tShenzhen YOUHUA Technology Co., Ltd\n7C:03:D8\t\tSagemcom Broadband SAS\n7C:04:D0\t\tApple, Inc.\n7C:05:07\t\tPegatron Corporation\n7C:05:1E\t\tRafael Ltd.\n7C:06:23\t\tUltra Electronics Sonar System Division\n7C:08:D9\t\tShanghai B-Star Technology Co\n7C:09:2B\t\tBekey A/S\n7C:0A:3F\t\tSamsung Electronics Co.,Ltd\n7C:0A:50\t\tJ-MEX Inc.\n7C:0B:C6\t\tSamsung Electronics Co.,Ltd\n7C:0C:92\t\tSuzhou Mobydata Smart System Co.,Ltd.\n7C:0C:F6\t\tGuangdong Huiwei High-tech Co., Ltd.\n7C:0C:FA\t\tHuawei Technologies Co.,Ltd\n7C:0E:CE\t\tCisco Systems, Inc\n7C:10:15\t\tBrilliant Home Technology, Inc.\n7C:10:C9\t\tASUSTek COMPUTER INC.\n7C:11:BE\t\tApple, Inc.\n7C:11:CB\t\tHuawei Technologies Co.,Ltd\n7C:11:CD\t\tQianTang Technology\n7C:13:1D\t\tSernet (Suzhou) Technologies Corporation\n7C:14:76\t\tDamall Technologies SAS\n7C:15:2D\t\tRenesas Electronics (Penang) Sdn. Bhd.\n7C:16:0D\t\tSaia-Burgess Controls AG\n7C:16:89\t\tSagemcom Broadband SAS\n7C:17:79\t\tEM Microelectronic\n7C:18:CD\t\tE-TRON Co.,Ltd.\n7C:1A:03\t\t8Locations Co., Ltd.\n7C:1A:C0\t\tHuawei Technologies Co.,Ltd\n7C:1A:FC\t\tDalian Co-Edifice Video Technology Co., Ltd\n7C:1B:93\t\tHuawei Device Co., Ltd.\n7C:1C:4E\t\tLG Innotek\n7C:1C:68\t\tSamsung Electronics Co.,Ltd\n7C:1C:F1\t\tHuawei Technologies Co.,Ltd\n7C:1D:D9\t\tXiaomi Communications Co Ltd\n7C:1E:06\t\tNew H3C Technologies Co., Ltd\n7C:1E:4A\t\tFortune Marketing Private Limited\n7C:1E:52\t\tMicrosoft\n7C:1E:B3\t\t2N TELEKOMUNIKACE a.s.\n7C:20:48\t\tKoamTac\n7C:20:64\t\tAlcatel-Lucent IPD\n7C:21:0D\t\tCisco Systems, Inc\n7C:21:0E\t\tCisco Systems, Inc\n7C:21:4A\t\tIntel Corporate\n7C:21:D8\t\tShenzhen Think Will Communication Technology co., LTD.\n7C:23:02\t\tSamsung Electronics Co.,Ltd\n7C:24:0C\t\tTelechips, Inc.\n7C:24:99\t\tApple, Inc.\n7C:25:86\t\tJuniper Networks\n7C:25:87\t\tchaowifi.com\n7C:25:DA\t\tFn-Link Technology Limited\n7C:26:34\t\tCommscope\n7C:26:64\t\tSagemcom Broadband SAS\n7C:27:3C\t\tShenzhen Yunlink Technology Co., Ltd\n7C:27:BC\t\tHui Zhou Gaoshengda Technology Co.,LTD\n7C:29:6F\t\tApple, Inc.\n7C:2A:31\t\tIntel Corporate\n7C:2A:CA\t\tApple, Inc.\n7C:2A:DB\t\tXiaomi Communications Co Ltd\n7C:2B:E1\t\tShenzhen Ferex Electrical Co.,Ltd\n7C:2C:67\t\tEspressif Inc.\n7C:2C:F3\t\tSecure Electrans Ltd\n7C:2E:0D\t\tBlackmagic Design\n7C:2E:BD\t\tGoogle, Inc.\n7C:2E:DD\t\tSamsung Electronics Co.,Ltd\n7C:2F:80\t\tGigaset Communications GmbH\n7C:31:0E\t\tCisco Systems, Inc\n7C:31:80\t\tSMK corporation\n7C:31:FA\t\tSilicon Laboratories\n7C:33:6E\t\tMEG Electronics Inc.\n7C:33:F9\t\tHuawei Technologies Co.,Ltd\n7C:35:48\t\tTranscend Information\n7C:35:F8\t\tZhejiang Tmall Technology Co., Ltd.\n7C:36:26\t\tHuawei Technologies Co.,Ltd\n7C:38:66\t\tTexas Instruments\n7C:38:6C\t\tReal Time Logic\n7C:38:AD\t\tSamsung Electronics Co.,Ltd\n7C:39:20\t\tSsoma Security\n7C:39:53\t\tzte corporation\n7C:39:85\t\tHuawei Technologies Co.,Ltd\n7C:3B:2D\t\tApple, Inc.\n7C:3B:D5\t\tImago Group\n7C:3C:B6\t\tShenzhen Homecare Technology Co.,Ltd.\n7C:3D:2B\t\tHuawei Device Co., Ltd.\n7C:3E:74\t\tHuawei Device Co., Ltd.\n7C:3E:82\t\tBouffalo Lab (Nanjing) Co., Ltd.\n7C:3E:9D\t\tPatech\n7C:41:A2\t\tNokia\n7C:43:8F\t\tE-Band Communications Corp.\n7C:44:4C\t\tEntertainment Solutions, S.L.\n7C:45:D0\t\tShenzhen Wewins Wireless Co., ltd\n7C:45:F9\t\tIEEE Registration Authority\n7C:45:F9:00:00:00/28\tSENSeOR\n7C:45:F9:10:00:00/28\tHunan Shengyun Photoelectric Technology Co., LTD\n7C:45:F9:20:00:00/28\tDongguan Boyye Industrial Co., Ltd\n7C:45:F9:30:00:00/28\tHangzhou LUXAR Technologies Co., Ltd\n7C:45:F9:40:00:00/28\tSPECS Surface Nano Analysis GmbH\n7C:45:F9:50:00:00/28\tInteractive Technologies, Inc.\n7C:45:F9:60:00:00/28\tHank Electronics Co., Ltd\n7C:45:F9:70:00:00/28\tGeorg Fischer Piping Systems Ltd.\n7C:45:F9:80:00:00/28\tFeller AG\n7C:45:F9:90:00:00/28\tMij Co Ltd\n7C:45:F9:A0:00:00/28\tqiio AG\n7C:45:F9:B0:00:00/28\tIngDan China-chip Electronic Technology(Wuxi) Co.,Ltd.\n7C:45:F9:C0:00:00/28\tXemex NV\n7C:45:F9:D0:00:00/28\tMobilaris Industrial Solutions\n7C:45:F9:E0:00:00/28\tScania CV AB\n7C:46:85\t\tMotorola (Wuhan) Mobility Technologies Communication Co., Ltd.\n7C:47:7C\t\tIEEE Registration Authority\n7C:47:7C:00:00:00/28\tBungBungame Inc\n7C:47:7C:10:00:00/28\tPhotosynth Inc.\n7C:47:7C:20:00:00/28\tPowerland Limited\n7C:47:7C:30:00:00/28\tEyeLock LLC\n7C:47:7C:40:00:00/28\tRLC Electronics Systems\n7C:47:7C:50:00:00/28\tMidwest Microwave Solutions\n7C:47:7C:60:00:00/28\tZerosystem LTD.Co\n7C:47:7C:70:00:00/28\tBlueSmart Technology Corporation\n7C:47:7C:80:00:00/28\tShenzhen Eunicum Electric Co.,Ltd.\n7C:47:7C:90:00:00/28\tDaLian Cheering Tech Co.,Ltd\n7C:47:7C:A0:00:00/28\tDspread Technology (Beijing) Inc.\n7C:47:7C:B0:00:00/28\tHangzhou Yiyitaidi Information Technology Co., Ltd.\n7C:47:7C:C0:00:00/28\tAnnapurna labs\n7C:47:7C:D0:00:00/28\tSpeedifi Inc\n7C:47:7C:E0:00:00/28\tI-Convergence.com\n7C:48:B2\t\tVida Resources Lte Ltd\n7C:49:B9\t\tPlexus Manufacturing Sdn Bhd\n7C:49:CF\t\teero inc.\n7C:49:EB\t\tXIAOMI Electronics,CO.,LTD\n7C:4A:82\t\tPortsmith LLC\n7C:4A:A8\t\tMindTree Wireless PVT Ltd\n7C:4B:26\t\tApple, Inc.\n7C:4B:78\t\tRed Sun Synthesis Pte Ltd\n7C:4C:58\t\tScale Computing, Inc.\n7C:4C:A5\t\tSky Uk Limited\n7C:4D:8F\t\tHP Inc.\n7C:4E:09\t\tShenzhen Skyworth Wireless Technology Co.,Ltd\n7C:4F:7D\t\tSawwave\n7C:4F:B5\t\tArcadyan Technology Corporation\n7C:50:49\t\tApple, Inc.\n7C:50:79\t\tIntel Corporate\n7C:50:DA\t\tE.J Ward\n7C:51:84\t\tUnis Flash Memory Technology(Chengdu)Co.,Ltd.\n7C:51:89\t\tSG Wireless Limited\n7C:52:59\t\tSichuan Jiuzhou Electronic Technology Co., Ltd.\n7C:53:4A\t\tMetamako\n7C:55:A7\t\tKastle Systems\n7C:55:E7\t\tYSI, Inc.\n7C:57:3C\t\tHewlett Packard Enterprise\n7C:57:4E\t\tCOBI GmbH\n7C:57:58\t\tHP Inc.\n7C:5A:1C\t\tSophos Ltd\n7C:5A:67\t\tJNC Systems, Inc.\n7C:5C:F8\t\tIntel Corporate\n7C:5E:98\t\teero inc.\n7C:60:4A\t\tAvelon\n7C:60:97\t\tHuawei Technologies Co.,Ltd\n7C:60:DB\t\tzte corporation\n7C:61:30\t\tApple, Inc.\n7C:61:66\t\tAmazon Technologies Inc.\n7C:61:93\t\tHTC Corporation\n7C:63:05\t\tAmazon Technologies Inc.\n7C:64:56\t\tSamsung Electronics Co.,Ltd\n7C:64:6C\t\tLG Electronics\n7C:66:9A\t\tHuawei Technologies Co.,Ltd\n7C:66:9D\t\tTexas Instruments\n7C:66:EF\t\tHon Hai Precision IND.CO.,LTD\n7C:67:A2\t\tIntel Corporate\n7C:67:AB\t\tRoku, Inc\n7C:68:B9\t\tHuawei Device Co., Ltd.\n7C:69:2B\t\tHuawei Technologies Co.,Ltd\n7C:69:6B\t\tAtmosic Technologies\n7C:69:F6\t\tCisco Systems, Inc\n7C:6A:60\t\tChina Mobile Group Device Co.,Ltd.\n7C:6A:8A\t\tSINOBONDER Technology Co., Ltd.\n7C:6A:B3\t\tIbc Technologies Inc.\n7C:6A:C3\t\tGatesAir, Inc\n7C:6A:DB\t\tSafeTone Technology Co.,Ltd\n7C:6A:F3\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n7C:6B:33\t\tTenyu Tech Co. Ltd.\n7C:6B:52\t\tTigaro Wireless\n7C:6B:9C\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n7C:6B:F7\t\tNTI co., ltd.\n7C:6C:39\t\tPixsys Srl\n7C:6C:8F\t\tAms Neve Ltd\n7C:6C:F0\t\tShenzhen TINNO Mobile Technology Corp.\n7C:6D:62\t\tApple, Inc.\n7C:6D:A6\t\tSuperwave Group LLC\n7C:6D:F8\t\tApple, Inc.\n7C:6F:06\t\tCaterpillar Trimble Control Technologies\n7C:6F:F8\t\tShenZhen ACTO Digital Video Technology Co.,Ltd.\n7C:70:BC\t\tIEEE Registration Authority\n7C:70:BC:00:00:00/28\tShanghai magcomm communication technology co ltd\n7C:70:BC:10:00:00/28\tXD-GE Automation CO.,LTD\n7C:70:BC:20:00:00/28\tDigital Lumens\n7C:70:BC:30:00:00/28\tFLEXIM GmbH\n7C:70:BC:40:00:00/28\tK-Vision Technology (Shanghai), Ltd\n7C:70:BC:50:00:00/28\tCanary Connect, Inc.\n7C:70:BC:60:00:00/28\tBidgely\n7C:70:BC:70:00:00/28\tNomad Digital Ltd.\n7C:70:BC:80:00:00/28\tMennekes Elektrotechnik GmbH & Co. KG\n7C:70:BC:90:00:00/28\tdogtra\n7C:70:BC:A0:00:00/28\tMotec GmbH\n7C:70:BC:B0:00:00/28\tTohan　Engineering　Corporation\n7C:70:BC:C0:00:00/28\tLukup Media\n7C:70:BC:D0:00:00/28\tmk-messtechnik GmbH\n7C:70:BC:E0:00:00/28\tHoperun Mmax Digital Pte. Ltd.\n7C:70:BC:F0:00:00/28\tPrivate\n7C:70:DB\t\tIntel Corporate\n7C:71:76\t\tWuxi iData Technology Company Ltd.\n7C:72:6E\t\tEricsson AB\n7C:72:E4\t\tUnikey Technologies\n7C:72:E7\t\tTexas Instruments\n7C:73:8B\t\tCocoon Alarm Ltd\n7C:73:98\t\tEspressif Inc.\n7C:73:EB\t\tHuawei Device Co., Ltd.\n7C:75:2D\t\tSamsung Electronics Co.,Ltd\n7C:76:30\t\tShenzhen YOUHUA Technology Co., Ltd\n7C:76:35\t\tIntel Corporate\n7C:76:68\t\tHuawei Technologies Co.,Ltd\n7C:76:73\t\tENMAS GmbH\n7C:77:16\t\tZyxel Communications Corporation\n7C:78:7E\t\tSamsung Electronics Co.,Ltd\n7C:78:B2\t\tWyze Labs Inc\n7C:79:E8\t\tPayRange Inc.\n7C:7A:3C\t\tNew H3C Technologies Co., Ltd\n7C:7A:53\t\tPhytrex Technology Corp.\n7C:7A:91\t\tIntel Corporate\n7C:7B:1C\t\tMotorola Mobility LLC, a Lenovo Company\n7C:7B:68\t\tVietnam Post And Telecommunication Industry Technology Join Stock Company\n7C:7B:8B\t\tControl Concepts, Inc.\n7C:7B:BF\t\tSamsung Electronics Co.,Ltd\n7C:7B:E4\t\tZ'Sedai Kenkyusho Corporation\n7C:7D:21\t\tzte corporation\n7C:7D:3D\t\tHuawei Technologies Co.,Ltd\n7C:7D:41\t\tJinmuyu Electronics Co., Ltd.\n7C:7E:F9\t\teero inc.\n7C:82:2D\t\tNortec\n7C:82:74\t\tShenzhen Hikeen Technology CO.,LTD\n7C:83:06\t\tGlen Dimplex Nordic as\n7C:83:34\t\tIEEE Registration Authority\n7C:83:34:00:00:00/28\tThermalimage\n7C:83:34:10:00:00/28\tLinear Logic LLC\n7C:83:34:20:00:00/28\tPEMtronics LLC\n7C:83:34:30:00:00/28\tBeijing Changkun Technology Co., Ltd.\n7C:83:34:40:00:00/28\tFusus\n7C:83:34:50:00:00/28\tPro Brand Technology (Tw)\n7C:83:34:60:00:00/28\tWojinxin Beijing Technology Co., LTD\n7C:83:34:70:00:00/28\tChengDU Yi Gong Intelligence Technology Co., Ltd.\n7C:83:34:80:00:00/28\tSilicon Xpandas Electronics Co., Ltd.\n7C:83:34:90:00:00/28\tSernet (Suzhou) Technologies Corporation\n7C:83:34:A0:00:00/28\tEnginetech (Tianjin) Computer Co.,Ltd.\n7C:83:34:B0:00:00/28\tShenzhen AZW Technology Co., Ltd.\n7C:83:34:C0:00:00/28\tHunan Datang Xianyi Technology Co.,Ltd\n7C:83:34:D0:00:00/28\tMSV elektronika s.r.o.\n7C:83:34:E0:00:00/28\tBalter GmbH\n7C:84:37\t\tChina Post Communications Equipment Co., Ltd.\n7C:85:30\t\tNokia\n7C:87:CE\t\tEspressif Inc.\n7C:88:99\t\tFN-LINK TECHNOLOGY Ltd.\n7C:89:31\t\tHuawei Device Co., Ltd.\n7C:89:56\t\tSamsung Electronics Co.,Ltd\n7C:89:C1\t\tPalo Alto Networks\n7C:8A:E1\t\tCompal Information (Kunshan) Co., Ltd.\n7C:8B:B5\t\tSamsung Electronics Co.,Ltd\n7C:8B:C1\t\tInfinix mobility limited\n7C:8B:CA\t\tTp-Link Technologies Co.,Ltd.\n7C:8C:09\t\tMellanox Technologies, Inc.\n7C:8D:91\t\tShanghai Hongzhuo Information Technology co.,LTD\n7C:8D:9C\t\tEdgecore Americas Networking Corporation\n7C:8E:E4\t\tTexas Instruments\n7C:8F:DE\t\tDWnet Technologies(Suzhou) Corporation\n7C:91:22\t\tSamsung Electronics Co.,Ltd\n7C:94:2A\t\tHuawei Technologies Co.,Ltd\n7C:94:9F\t\tShenzhen iComm Semiconductor CO.,LTD\n7C:94:B2\t\tPhilips Healthcare PCCI\n7C:95:B1\t\tExtreme Networks Headquarters\n7C:95:F3\t\tCisco Systems, Inc\n7C:96:D2\t\tFihonest communication co.,Ltd\n7C:97:63\t\tOpenmatics s.r.o.\n7C:97:E1\t\tHuawei Device Co., Ltd.\n7C:99:2E\t\tShanghai Notion lnformatio Technology Co.,Ltd.\n7C:99:46\t\tSector Alarm Tech S.L.\n7C:9A:1D\t\tApple, Inc.\n7C:9A:54\t\tVantiva USA LLC\n7C:9A:9B\t\tVSE valencia smart energy\n7C:9E:BD\t\tEspressif Inc.\n7C:9F:07\t\tCig Shanghai Co Ltd\n7C:A1:5D\t\tGN ReSound A/S\n7C:A1:77\t\tHuawei Technologies Co.,Ltd\n7C:A1:AE\t\tApple, Inc.\n7C:A2:37\t\tKing Slide Technology CO., LTD.\n7C:A2:3E\t\tHuawei Technologies Co.,Ltd\n7C:A2:9B\t\tD.SignT GmbH & Co. KG\n7C:A4:49\t\tXiaomi Communications Co Ltd\n7C:A4:F7\t\tExtreme Networks Headquarters\n7C:A5:8F\t\tshenzhen Qikai Electronic Co., Ltd.\n7C:A6:1D\t\tMhl, Llc\n7C:A6:2A\t\tHewlett Packard Enterprise\n7C:A7:B0\t\tShenzhen Bilian Electronic Co.，Ltd\n7C:A8:EC\t\tHewlett Packard Enterprise\n7C:A9:09\t\tHui Zhou Gaoshengda Technology Co.,LTD\n7C:A9:6B\t\tSyrotech Networks. Ltd.\n7C:A9:7D\t\tObjenious\n7C:AA:DE\t\tAltoBeam Inc.\n7C:AB:25\t\tMesmo Technology Inc.\n7C:AB:60\t\tApple, Inc.\n7C:AC:B2\t\tBosch Software Innovations GmbH\n7C:AD:4F\t\tCisco Systems, Inc\n7C:AD:74\t\tCisco Systems, Inc\n7C:B0:3E\t\tOSRAM GmbH\n7C:B0:73\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n7C:B0:C2\t\tIntel Corporate\n7C:B1:5D\t\tHuawei Technologies Co.,Ltd\n7C:B1:77\t\tSatelco AG\n7C:B2:1B\t\tCisco SPVTG\n7C:B2:32\t\tHui Zhou Gaoshengda Technology Co.,LTD\n7C:B2:5C\t\tAcacia Communications\n7C:B2:7D\t\tIntel Corporate\n7C:B3:0A\t\tzte corporation\n7C:B3:53\t\tCisco Systems, Inc\n7C:B3:7B\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\n7C:B5:42\t\tACES Technology\n7C:B5:66\t\tIntel Corporate\n7C:B5:9B\t\tTp-Link Technologies Co.,Ltd.\n7C:B5:9F\t\tHuawei Technologies Co.,Ltd\n7C:B6:8D\t\tMist Systems, Inc.\n7C:B7:33\t\tAskey Computer Corp\n7C:B7:7B\t\tParadigm Electronics Inc\n7C:B8:DA\t\tMurata Manufacturing Co., Ltd.\n7C:B8:E6\t\tGree Electric Appliances, Inc. Of Zhuhai\n7C:B9:4C\t\tBouffalo Lab (Nanjing) Co., Ltd.\n7C:B9:60\t\tShanghai X-Cheng telecom LTD\n7C:BA:C0\t\tEVBox BV\n7C:BA:C6\t\tSolar Manager AG\n7C:BA:CC\t\tIEEE Registration Authority\n7C:BA:CC:00:00:00/28\tTGT Limited\n7C:BA:CC:10:00:00/28\tChangsha SUNYE Electric Co., Ltd.\n7C:BA:CC:20:00:00/28\tMaco Lighting Pty. Ltd.\n7C:BA:CC:30:00:00/28\tIzkare\n7C:BA:CC:40:00:00/28\tSun Asia Trade Co.\n7C:BA:CC:50:00:00/28\tFortem Technologies, Inc.\n7C:BA:CC:60:00:00/28\tFossil Power Systems Inc\n7C:BA:CC:70:00:00/28\tVirgin Orbit\n7C:BA:CC:80:00:00/28\tCollinear Networks Inc.\n7C:BA:CC:90:00:00/28\tYongguan Electronic Technology (D.G)LTD\n7C:BA:CC:A0:00:00/28\tAnnapurna labs\n7C:BA:CC:B0:00:00/28\tBriowireless Inc.\n7C:BA:CC:C0:00:00/28\tFlying Loft Inc.\n7C:BA:CC:D0:00:00/28\tSIGMA-ELEKTRO GmbH\n7C:BA:CC:E0:00:00/28\tAlpha Technologies, Llc\n7C:BB:6F\t\tCosco Electronics Co., Ltd.\n7C:BB:8A\t\tNintendo Co., Ltd.\n7C:BC:84\t\tIEEE Registration Authority\n7C:BC:84:00:00:00/28\tAG Neovo\n7C:BC:84:10:00:00/28\tXiamen Mage Information Technology Co.,Ltd.\n7C:BC:84:20:00:00/28\t3S Technology Co., Ltd.\n7C:BC:84:30:00:00/28\tShanghai Yitu Technology Co. Ltd\n7C:BC:84:40:00:00/28\tContinental\n7C:BC:84:50:00:00/28\tNanning auto digital technology co.,LTD\n7C:BC:84:60:00:00/28\tSociété de Transport de Montréal\n7C:BC:84:70:00:00/28\tXuji Changnan Communication Equipment Co., Ltd.\n7C:BC:84:80:00:00/28\tShenzhen Kuang-chi  Space Technology Co., Ltd.\n7C:BC:84:90:00:00/28\tHitiq Limited\n7C:BC:84:A0:00:00/28\tOpnt Bv\n7C:BC:84:B0:00:00/28\tGuangzhou Puppyrobot Technology Co.Ltd Beijing Branch\n7C:BC:84:C0:00:00/28\tTibit Communications\n7C:BC:84:D0:00:00/28\tVantage Integrated Security Solutions Pvt Ltd\n7C:BC:84:E0:00:00/28\tBeijing Topnew Group Co., Ltd\n7C:BD:06\t\tAE REFUsol\n7C:BE:CE\t\tPrivate\n7C:BF:77\t\tSpeedtech Corp.\n7C:BF:88\t\tMobilicom LTD\n7C:BF:AE\t\tRenesas Electronics (Penang) Sdn. Bhd.\n7C:BF:B1\t\tCommscope\n7C:C0:25\t\tPalo Alto Networks\n7C:C0:6F\t\tApple, Inc.\n7C:C0:AA\t\tMicrosoft Corporation\n7C:C1:77\t\tIngram Micro Services\n7C:C1:78\t\tEricsson AB\n7C:C1:80\t\tApple, Inc.\n7C:C2:25\t\tSamsung Electronics Co.,Ltd\n7C:C2:55\t\tSuper Micro Computer, Inc.\n7C:C2:94\t\tBeijing Xiaomi Mobile Software Co., Ltd\n7C:C2:C6\t\tTP-Link Systems Inc\n7C:C3:85\t\tHuawei Technologies Co.,Ltd\n7C:C3:A1\t\tApple, Inc.\n7C:C4:EF\t\tDevialet\n7C:C5:18\t\tvivo Mobile Communication Co., Ltd.\n7C:C5:37\t\tApple, Inc.\n7C:C6:B6\t\tSilicon Laboratories\n7C:C6:C4\t\tKolff Computer Supplies b.v.\n7C:C7:09\t\tShenzhen Rf-Link Technology Co.,Ltd.\n7C:C7:4A\t\tFiberhome Telecommunication Technologies Co.,LTD\n7C:C7:7E\t\tFiberhome Telecommunication Technologies Co.,LTD\n7C:C7:90\t\tPalo Alto Networks\n7C:C8:82\t\tHuawei Technologies Co.,Ltd\n7C:C8:AB\t\tAcro Associates, Inc.\n7C:C8:D0\t\tTianjin Yaan Technology Co., Ltd.\n7C:C8:D7\t\tDamalisk\n7C:C8:DF\t\tApple, Inc.\n7C:C9:26\t\tWuhan GreeNet Information Service Co.,Ltd.\n7C:C9:5A\t\tDell EMC\n7C:C9:5E\t\tDongguan Liesheng Electronic Co., Ltd.\n7C:CB:0D\t\tAntaira Technologies, LLC\n7C:CB:E2\t\tIEEE Registration Authority\n7C:CB:E2:00:00:00/28\tHeyuan Yongyida Technology Holdings Co.,Ltd.\n7C:CB:E2:10:00:00/28\tCeoTronics AG\n7C:CB:E2:20:00:00/28\t1000eyes GmbH\n7C:CB:E2:30:00:00/28\tAstrum Technologies CC\n7C:CB:E2:40:00:00/28\tNingbo bird sales co.,LTD\n7C:CB:E2:50:00:00/28\tDTECH Labs, Inc.\n7C:CB:E2:60:00:00/28\tSY Electronics Limited\n7C:CB:E2:70:00:00/28\tHangzhou Kaicom Communication Co.,Ltd\n7C:CB:E2:80:00:00/28\tPolarteknik Oy\n7C:CB:E2:90:00:00/28\tHangzhou Haohaokaiche Technology Co.,Ltd.\n7C:CB:E2:A0:00:00/28\tShanghai Institute of Applied Physics, Chinese Academy of Sciences\n7C:CB:E2:B0:00:00/28\tEasy Broadband Technology Co., Ltd.\n7C:CB:E2:C0:00:00/28\tmirakonta s.l.\n7C:CB:E2:D0:00:00/28\toptilink networks pvt ltd\n7C:CB:E2:E0:00:00/28\tAplex Technology Inc.\n7C:CC:1F\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n7C:CC:B8\t\tIntel Corporate\n7C:CC:FC\t\tQuectel Wireless Solutions Co.,Ltd.\n7C:CD:11\t\tMS-Magnet\n7C:CD:3C\t\tGuangzhou Juzing Technology Co., Ltd\n7C:CF:CF\t\tShanghai SEARI Intelligent System Co., Ltd\n7C:D1:C3\t\tApple, Inc.\n7C:D2:DA\t\tApple, Inc.\n7C:D3:0A\t\tInventec Corporation\n7C:D3:E5\t\tHuawei Technologies Co.,Ltd\n7C:D4:4D\t\tShanghai Moorewatt Energy Technology Co.,Ltd\n7C:D5:66\t\tAmazon Technologies Inc.\n7C:D6:61\t\tXiaomi Communications Co Ltd\n7C:D7:62\t\tFreestyle Technology Pty Ltd\n7C:D8:44\t\tEnmotus Inc\n7C:D9:5C\t\tGoogle, Inc.\n7C:D9:A0\t\tHuawei Technologies Co.,Ltd\n7C:D9:F4\t\tUAB \"Teltonika Telematics\"\n7C:D9:FE\t\tNew Cosmos Electric Co., Ltd.\n7C:DA:84\t\tDongnian Networks Inc.\n7C:DA:C3\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n7C:DB:98\t\tAskey Computer Corp\n7C:DC:73\t\tHuawei Technologies Co.,Ltd\n7C:DC:CC\t\tBeijing Starblaze Technology Co.,Ltd\n7C:DD:11\t\tChongqing MAS SCI&TECH.Co.,Ltd\n7C:DD:20\t\tIOXOS Technologies S.A.\n7C:DD:76\t\tSuzhou Hanming Technologies Co., Ltd.\n7C:DD:90\t\tShenzhen Ogemray Technology Co., Ltd.\n7C:DD:E9\t\tATOM tech Inc.\n7C:DE:78\t\tNew H3C Technologies Co., Ltd\n7C:DF:A1\t\tEspressif Inc.\n7C:E0:44\t\tNEON Inc\n7C:E1:52\t\tThe Goodyear Tire & Rubber Company\n7C:E1:FF\t\tComputer Performance, Inc. DBA Digital Loggers, Inc.\n7C:E2:69\t\tTexas Instruments\n7C:E2:CA\t\tJuniper Networks\n7C:E4:AA\t\tPrivate\n7C:E5:24\t\tQuirky, Inc.\n7C:E5:3F\t\tHuawei Technologies Co.,Ltd\n7C:E5:6B\t\tESEN Optoelectronics Technology Co.,Ltd.\n7C:E7:12\t\tQuectel Wireless Solutions Co.,Ltd.\n7C:E8:7F\t\tSagemcom Broadband SAS\n7C:E9:13\t\tFantasia Trading LLC\n7C:E9:7C\t\tItel Mobile Limited\n7C:E9:D3\t\tHon Hai Precision Ind. Co.,Ltd.\n7C:EB:7F\t\tDmet Products Corp.\n7C:EB:AE\t\tRidgeline Instruments\n7C:EB:EA\t\tAsct\n7C:EC:79\t\tTexas Instruments\n7C:EC:9B\t\tFuzhou Teraway Information Technology Co.,Ltd\n7C:EC:B1\t\tApple, Inc.\n7C:ED:8D\t\tMicrosoft\n7C:ED:C6\t\tAmazon Technologies Inc.\n7C:EE:7B\t\tLogically Us Ltd\n7C:EF:18\t\tCreative Product Design Pty. Ltd.\n7C:EF:40\t\tNextorage Corporation\n7C:EF:61\t\tSTR Elektronik Josef Schlechtinger GmbH\n7C:EF:8A\t\tInhon International Ltd.\n7C:F0:5F\t\tApple, Inc.\n7C:F0:98\t\tBee Beans Technologies, Inc.\n7C:F0:BA\t\tLinkwell Telesystems Pvt Ltd\n7C:F0:E5\t\tOnePlus Technology (Shenzhen) Co., Ltd\n7C:F1:7E\t\tTP-Link Systems Inc\n7C:F2:DD\t\tVence Corp\n7C:F3:1B\t\tLG Electronics (Mobile Communications)\n7C:F3:4D\t\tApple, Inc.\n7C:F4:29\t\tNUUO Inc.\n7C:F4:62\t\tBeijing Huawoo Technologies Co.Ltd\n7C:F6:66\t\tTuya Smart Inc.\n7C:F8:54\t\tSamsung Electronics Co.,Ltd\n7C:F8:80\t\tCisco Systems, Inc\n7C:F9:0E\t\tSamsung Electronics Co.,Ltd\n7C:F9:5C\t\tU.I. Lapp GmbH\n7C:F9:A0\t\tFiberhome Telecommunication Technologies Co.,LTD\n7C:FA:80\t\tJiangSu Fulian Communication Technology Co., Ltd\n7C:FA:D6\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n7C:FA:DF\t\tApple, Inc.\n7C:FC:16\t\tApple, Inc.\n7C:FC:3C\t\tVisteon Corporation\n7C:FC:FD\t\tFiberhome Telecommunication Technologies Co.,LTD\n7C:FD:6B\t\tXiaomi Communications Co Ltd\n7C:FD:82\t\tGuangdong Genius Technology Co., Ltd.\n7C:FE:28\t\tSalutron Inc.\n7C:FE:4E\t\tShenzhen Safe vision Technology Co.,LTD\n7C:FE:62\t\tShenZhen XinZhongXin Technology Co.， Ltd\n7C:FE:90\t\tMellanox Technologies, Inc.\n7C:FF:4D\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n7C:FF:62\t\tHuizhou Super Electron Technology Co.,Ltd.\n80:00:0B\t\tIntel Corporate\n80:00:10\t\tAt&T\n80:00:6E\t\tApple, Inc.\n80:01:5C\t\tSynaptics, Inc\n80:01:84\t\tHTC Corporation\n80:02:9C\t\tGemtek Technology Co., Ltd.\n80:02:DF\t\tORA Inc.\n80:02:F4\t\tIEEE Registration Authority\n80:02:F4:00:00:00/28\tBK Networks Co,. Ltd.\n80:02:F4:10:00:00/28\tSichuan lookout environment protection technology co.,Ltd\n80:02:F4:20:00:00/28\tBeijing Cybercore\n80:02:F4:30:00:00/28\tShenzhen Suanzi Technology Co., Ltd\n80:02:F4:40:00:00/28\tInfors AG\n80:02:F4:50:00:00/28\tSichuan Fanyi Technology Co. Ltd.\n80:02:F4:60:00:00/28\tMech-Mind Robotics Technologies Ltd.\n80:02:F4:70:00:00/28\tLazer Safe Pty Ltd\n80:02:F4:80:00:00/28\tAnnapurna labs\n80:02:F4:90:00:00/28\tXundi(Xiamen) Electronic Technology Co.,Ltd.\n80:02:F4:A0:00:00/28\tPassiveLogic\n80:02:F4:B0:00:00/28\tBaicells Technologies Co., Ltd\n80:02:F4:C0:00:00/28\tWuhan Glory Road Intelligent Technology Co., Ltd.\n80:02:F4:D0:00:00/28\tJiangsu Vedkang Medicl Sclence and Technology Co.,Ltd\n80:02:F4:E0:00:00/28\tAlfred Systems Inc\n80:03:0D\t\tCanon Inc.\n80:03:84\t\tRuckus Wireless\n80:04:5F\t\tApple, Inc.\n80:05:18\t\tHuawei Technologies Co.,Ltd\n80:05:1F\t\tVizio, Inc\n80:05:3A\t\tCHeKT Inc.\n80:05:88\t\tRuijie Networks Co.,LTD\n80:05:DF\t\tMontage Technology Group Limited\n80:06:D9\t\tzte corporation\n80:07:1B\t\tVsolution Telecommunication Technology Co.,Ltd.\n80:07:94\t\tSamsung Electronics Co.,Ltd\n80:07:A2\t\tEsson Technology Inc.\n80:09:02\t\tKeysight Technologies, Inc.\n80:0A:06\t\tCOMTEC co.,ltd\n80:0A:80\t\tIEEE Registration Authority\n80:0A:80:00:00:00/28\tGolana Technology (Shenzhen) Co., Ltd.\n80:0A:80:10:00:00/28\tDongguan I-Chime electrinics Co.,Ltd\n80:0A:80:20:00:00/28\tSumitomo Wiring Systems, Ltd.\n80:0A:80:30:00:00/28\tBeijing VControl Technology Co., Ltd.\n80:0A:80:40:00:00/28\tLlvision Technology Co.,Ltd\n80:0A:80:50:00:00/28\tShenzhen Zidoo Technology Co., Ltd.\n80:0A:80:60:00:00/28\tBeijing Gooagoo Technical Service Co.,Ltd.\n80:0A:80:F0:00:00/28\tPrivate\n80:0B:51\t\tChengdu XGimi Technology Co.,Ltd\n80:0C:67\t\tApple, Inc.\n80:0C:F9\t\tAmazon Technologies Inc.\n80:0D:D7\t\tLatticework, Inc\n80:0E:24\t\tForgetBox\n80:0E:A9\t\tTCL Yuxin Zhixing Technology (Huizhou) Co.,Ltd\n80:12:42\t\tApple, Inc.\n80:12:DF\t\tShenzhen SuperElectron Technology Co.,Ltd.\n80:13:82\t\tHuawei Technologies Co.,Ltd\n80:14:40\t\tSunlit System Technology Corp\n80:14:A8\t\tGuangzhou V-SOLUTION Electronic Technology Co., Ltd.\n80:16:05\t\tVodafone Italia S.p.A.\n80:16:09\t\tSleep Number\n80:16:B7\t\tBrunel University\n80:17:7D\t\tNortel Networks\n80:18:44\t\tDell Inc.\n80:18:A7\t\tSamsung Electronics Co.,Ltd\n80:19:34\t\tIntel Corporate\n80:19:67\t\tShanghai Reallytek Information Technology  Co.,Ltd\n80:19:70\t\tSamsung Electronics Co.,Ltd\n80:19:FE\t\tJianLing Technology CO., LTD\n80:1D:AA\t\tAvaya Inc\n80:1F:02\t\tEdimax Technology Co. Ltd.\n80:1F:12\t\tMicrochip Technology Inc.\n80:20:AF\t\tTrade FIDES, a.s.\n80:20:DA\t\tSagemcom Broadband SAS\n80:20:E1\t\tBVBA DPTechnics\n80:20:FD\t\tSamsung Electronics Co.,Ltd\n80:22:75\t\tBeijing Beny Wave Technology Co Ltd\n80:22:78\t\tChina Mobile IOT Company Limited\n80:22:A7\t\tNEC Platforms, Ltd.\n80:22:FA\t\tItel Mobile Limited\n80:23:95\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n80:24:8F\t\tCisco Systems, Inc\n80:25:11\t\tItel Mobile Limited\n80:26:89\t\tD-Link International\n80:27:6C\t\tCisco Systems, Inc\n80:28:3C\t\tSonova AG\n80:29:94\t\tVantiva USA LLC\n80:2A:A8\t\tUbiquiti Inc\n80:2A:FA\t\tGermaneers GmbH\n80:2B:F9\t\tHon Hai Precision Ind. Co.,Ltd.\n80:2D:1A\t\tzte corporation\n80:2D:BF\t\tCisco Systems, Inc\n80:2D:E1\t\tSolarbridge Technologies\n80:2E:14\t\tazeti Networks AG\n80:2E:C3\t\tHuawei Technologies Co.,Ltd\n80:2E:DE\t\tHuawei Device Co., Ltd.\n80:2F:DE\t\tZurich Instruments AG\n80:30:49\t\tLiteon Technology Corporation\n80:30:DC\t\tTexas Instruments\n80:30:E0\t\tHewlett Packard Enterprise\n80:31:F0\t\tSamsung Electronics Co.,Ltd\n80:32:53\t\tIntel Corporate\n80:34:28\t\tMicrochip Technology Inc.\n80:34:57\t\tOT Systems Limited\n80:35:C1\t\tXiaomi Communications Co Ltd\n80:37:73\t\tNetgear\n80:38:96\t\tSHARP Corporation\n80:38:BC\t\tHuawei Technologies Co.,Ltd\n80:38:D4\t\tFibercentury Network Technology Co.,Ltd.\n80:38:FB\t\tIntel Corporate\n80:38:FD\t\tLeapFrog Enterprises, Inc.\n80:39:8C\t\tSamsung Electronics Co.,Ltd\n80:39:E5\t\tPatlite Corporation\n80:3A:0A\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n80:3A:59\t\tAt&T\n80:3A:F4\t\tFiberhome Telecommunication Technologies Co.,LTD\n80:3B:2A\t\tABB Xiamen Low Voltage Equipment Co.,Ltd.\n80:3B:9A\t\tghe-ces electronic ag\n80:3B:F6\t\tLook Easy International Limited\n80:3C:04\t\tTP-Link Systems Inc.\n80:3C:20\t\tHuawei Technologies Co.,Ltd\n80:3E:48\t\tShenzhen Gongjin Electronics Co.,Lt\n80:3E:4F\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n80:3F:5D\t\tWinstars Technology Ltd\n80:3F:D6\t\tbytes at work AG\n80:40:05\t\tGuangdong COROS Sports Technology Co.,Ltd\n80:41:26\t\tHuawei Technologies Co.,Ltd\n80:41:4E\t\tBbk Educational Electronics Corp.,Ltd.\n80:42:7C\t\tAdolf Tedsen GmbH & Co. KG\n80:43:3F\t\tJuniper Networks\n80:44:FD\t\tChina Mobile (Hangzhou) Information Technology Co., Ltd.\n80:45:DD\t\tIntel Corporate\n80:47:31\t\tPacket Design, Inc.\n80:47:86\t\tSamsung Electronics Co.,Ltd\n80:48:2C\t\tWyze Labs Inc\n80:48:9F\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n80:48:A5\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n80:49:71\t\tApple, Inc.\n80:4A:14\t\tApple, Inc.\n80:4A:F2\t\tSonos, Inc.\n80:4B:20\t\tVentilation Control\n80:4B:50\t\tSilicon Laboratories\n80:4C:5D\t\tNXP Semiconductor (Tianjin) LTD.\n80:4E:70\t\tSamsung Electronics Co.,Ltd\n80:4E:81\t\tSamsung Electronics Co.,Ltd\n80:4F:58\t\tThinkEco, Inc.\n80:50:1B\t\tNokia Corporation\n80:50:67\t\tW & D Technology Corporation\n80:50:F6\t\tItel Mobile Limited\n80:54:2D\t\tSamsung Electronics Co.,Ltd\n80:54:6A\t\tShenzhen Gongjin Electronics Co.,Lt\n80:54:9C\t\tSamsung Electronics Co.,Ltd\n80:54:D9\t\tHuawei Technologies Co.,Ltd\n80:54:E3\t\tApple, Inc.\n80:56:3C\t\tZf\n80:56:F2\t\tHon Hai Precision Ind. Co.,Ltd.\n80:57:19\t\tSamsung Electronics Co.,Ltd\n80:58:C5\t\tNovaTec Kommunikationstechnik GmbH\n80:58:F8\t\tMotorola Mobility LLC, a Lenovo Company\n80:59:FD\t\tNoviga\n80:5A:04\t\tLG Electronics (Mobile Communications)\n80:5B:65\t\tLG Innotek\n80:5E:0C\t\tYealink(Xiamen) Network Technology Co.,Ltd.\n80:5E:4F\t\tFn-Link Technology Limited\n80:5E:C0\t\tYealink(Xiamen) Network Technology Co.,Ltd.\n80:5F:8E\t\tHuizhou BYD Electronic Co., Ltd.\n80:5F:C5\t\tApple, Inc.\n80:60:07\t\tRim\n80:60:36\t\tHuawei Technologies Co.,Ltd\n80:60:B7\t\tCloud Network Technology Singapore Pte. Ltd.\n80:61:5F\t\tBeijing Sinead Technology Co., Ltd.\n80:61:6C\t\tNew H3C Technologies Co., Ltd\n80:61:8F\t\tShenzhen sangfei consumer communications co.,ltd\n80:64:59\t\tNimbus Inc.\n80:64:6F\t\tEspressif Inc.\n80:64:7A\t\tOla Sense Inc\n80:64:7C\t\tTuya Smart Inc.\n80:65:59\t\tEM Microelectronic\n80:65:6D\t\tSamsung Electronics Co.,Ltd\n80:65:7C\t\tApple, Inc.\n80:65:99\t\tEspressif Inc.\n80:65:E9\t\tBenQ Corporation\n80:66:29\t\tPrescope Technologies CO.,LTD.\n80:69:1A\t\tBelkin International Inc.\n80:69:33\t\tHuawei Technologies Co.,Ltd\n80:69:40\t\tLexar Co.,Limited\n80:6A:00\t\tCisco Systems, Inc\n80:6A:10\t\tWhisker Labs - Ting\n80:6A:34\t\tBouffalo Lab (Nanjing) Co., Ltd.\n80:6A:B0\t\tShenzhen TINNO Mobile Technology Corp.\n80:6C:1B\t\tMotorola Mobility LLC, a Lenovo Company\n80:6C:8B\t\tKaeser Kompressoren Ag\n80:6C:BC\t\tNET New Electronic Technology GmbH\n80:6D:71\t\tAmazon Technologies Inc.\n80:6D:97\t\tPrivate\n80:6F:1C\t\tHuawei Device Co., Ltd.\n80:6F:B0\t\tTexas Instruments\n80:71:1F\t\tJuniper Networks\n80:71:7A\t\tHuawei Technologies Co.,Ltd\n80:72:15\t\tSky Uk Limited\n80:72:64\t\tHuawei Device Co., Ltd.\n80:73:9F\t\tKyocera Corporation\n80:74:59\t\tK's Co.,Ltd.\n80:74:84\t\tALL Winner (Hong Kong) Limited\n80:75:1F\t\tSky Uk Limited\n80:75:BF\t\tSamsung Electronics Co.,Ltd\n80:76:77\t\thangzhou puwell cloud tech co., ltd.\n80:76:93\t\tNewag SA\n80:76:C2\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n80:77:A4\t\tTecno Mobile Limited\n80:78:71\t\tAskey Computer Corp\n80:79:33\t\tAigentec Technology(Zhejiang) Co., Ltd.\n80:79:5D\t\tInfinix mobility limited\n80:79:AE\t\tShanDong Tecsunrise  Co.,Ltd\n80:7A:7F\t\tABB Genway Xiamen Electrical Equipment CO., LTD\n80:7A:BF\t\tHTC Corporation\n80:7B:1E\t\tCorsair Memory, Inc.\n80:7B:3E\t\tSamsung Electronics Co.,Ltd\n80:7B:85\t\tIEEE Registration Authority\n80:7B:85:00:00:00/28\tShiroshita Industrial Co., Ltd.\n80:7B:85:10:00:00/28\tHangzhou Synway Information Engineering Co., Ltd\n80:7B:85:20:00:00/28\tPhoenix Co.,Ltd.\n80:7B:85:30:00:00/28\tZhuhai TOP Intelligence Electric Co., Ltd.\n80:7B:85:40:00:00/28\tQuantel USA, Inc.\n80:7B:85:50:00:00/28\tEfco\n80:7B:85:60:00:00/28\tQuickte Technology Co.,Ltd\n80:7B:85:70:00:00/28\tChendu Ningshui Technology Co.,Ltd\n80:7B:85:80:00:00/28\tIDair, LLC\n80:7B:85:90:00:00/28\tSmart Electronics Nz Limited\n80:7B:85:A0:00:00/28\tInterplan Co., Ltd.\n80:7B:85:B0:00:00/28\tOliotalo Oy\n80:7B:85:C0:00:00/28\tSCALA Digital Technology(Ningbo) CO, LTD\n80:7B:85:D0:00:00/28\tKaynes Technology India Pvt Ltd\n80:7B:85:E0:00:00/28\tMersen\n80:7B:85:F0:00:00/28\tPrivate\n80:7C:0A\t\tzte corporation\n80:7C:62\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n80:7D:14\t\tHuawei Technologies Co.,Ltd\n80:7D:1B\t\tNeosystem Co. Ltd.\n80:7D:3A\t\tEspressif Inc.\n80:7D:E3\t\tChongqing Sichuan Instrument Microcircuit Co.LTD.\n80:7E:B4\t\tShenzhen SuperElectron Technology Co.,Ltd.\n80:7F:F8\t\tJuniper Networks\n80:80:2C\t\tFortinet, Inc.\n80:81:A5\t\tTONGQING COMMUNICATION EQUIPMENT (SHENZHEN) Co.,Ltd\n80:82:23\t\tApple, Inc.\n80:82:87\t\tATCOM Technology Co.Ltd.\n80:82:F5\t\tSTMicrolectronics International NV\n80:82:FE\t\tArcadyan Corporation\n80:83:F6\t\tApple, Inc.\n80:84:89\t\tIntel Corporate\n80:84:A9\t\toshkosh Corporation\n80:85:44\t\tIntelbras\n80:86:98\t\tNetronics Technologies Inc.\n80:86:D9\t\tSamsung Electronics Co.,Ltd\n80:86:F2\t\tIntel Corporate\n80:88:00\t\tzte corporation\n80:89:17\t\tTp-Link Technologies Co.,Ltd.\n80:8A:8B\t\tvivo Mobile Communication Co., Ltd.\n80:8A:BD\t\tSamsung Electronics Co.,Ltd\n80:8A:F7\t\tNanoleaf\n80:8B:5C\t\tShenzhen Runhuicheng Technology Co., Ltd\n80:8C:97\t\tKaon Group Co., Ltd.\n80:8D:B7\t\tHewlett Packard Enterprise\n80:8F:1D\t\tTp-Link Technologies Co.,Ltd.\n80:8F:E8\t\tIntelbras\n80:91:2A\t\tLih Rong electronic Enterprise Co., Ltd.\n80:91:33\t\tAzureWave Technology Inc.\n80:91:C0\t\tAgileMesh, Inc.\n80:92:9F\t\tApple, Inc.\n80:92:A5\t\tValeo Interior Controls (Shenzhen) Co.,Ltd\n80:93:93\t\tXapt GmbH\n80:94:6C\t\tTokyo Radar Corporation\n80:95:3A\t\tApple, Inc.\n80:95:62\t\tExtreme Networks Headquarters\n80:96:21\t\tLenovo\n80:96:98\t\tApple, Inc.\n80:96:B1\t\tCommscope\n80:96:CA\t\tHon Hai Precision Ind. Co.,Ltd.\n80:97:1B\t\tAltenergy Power System,Inc.\n80:97:33\t\tShenzhen Elebao Technology Co., Ltd\n80:99:E7\t\tSony Corporation\n80:9B:20\t\tIntel Corporate\n80:9D:65\t\tFN-LINK TECHNOLOGY Ltd.\n80:9F:9B\t\tSichuan AI-Link Technology Co., Ltd.\n80:9F:AB\t\tFiberhome Telecommunication Technologies Co.,LTD\n80:9F:F5\t\tSamsung Electronics Co.,Ltd\n80:A0:36\t\tShanghai MXCHIP Information Technology Co., Ltd.\n80:A1:97\t\tu-blox AG\n80:A1:AB\t\tIntellisis\n80:A1:D7\t\tShanghai DareGlobal Technologies Co.,Ltd\n80:A2:35\t\tEdgecore Networks Corporation\n80:A5:79\t\tIEEE Registration Authority\n80:A5:79:00:00:00/28\tBenano Inc.\n80:A5:79:10:00:00/28\tZhe Jiang EV-Tech Co.,Ltd\n80:A5:79:20:00:00/28\tJiangsu wonder-working electric co., LTD\n80:A5:79:30:00:00/28\tTool-Temp AG\n80:A5:79:40:00:00/28\tHardened Networks\n80:A5:79:50:00:00/28\tPotron Technology Co.,Ltd.,\n80:A5:79:60:00:00/28\tXiamen Pinnacle Electrical Co., Ltd\n80:A5:79:70:00:00/28\tSiemens Energy Global GmbH & Co. KG\n80:A5:79:80:00:00/28\tDi3 Infotech Llp\n80:A5:79:90:00:00/28\tYovil Ltd.\n80:A5:79:A0:00:00/28\tViewSonic Corp\n80:A5:79:B0:00:00/28\tGround Control Technologies UK Ltd.\n80:A5:79:C0:00:00/28\tBluArmor\n80:A5:79:D0:00:00/28\tGuangdong Province Ivsuan technology co., ltd\n80:A5:79:E0:00:00/28\tUnplugged Technologies Ltd.\n80:A5:89\t\tAzureWave Technology Inc.\n80:A7:96\t\tNeuralink Corp.\n80:A8:5D\t\tOsterhout Design Group\n80:A9:97\t\tApple, Inc.\n80:AA:1C\t\tLuxottica Tristar (Dongguan) Optical Co.,Ltd\n80:AA:A4\t\tUsag\n80:AB:4D\t\tNokia Solutions and Networks GmbH & Co. KG\n80:AC:7C\t\tSichuan AI-Link Technology Co., Ltd.\n80:AC:AC\t\tJuniper Networks\n80:AC:C8\t\tPhyplus Microelectronics Limited\n80:AD:16\t\tXiaomi Communications Co Ltd\n80:AD:67\t\tKasda Networks Inc\n80:AE:3C\t\tTaicang T&W Electronics\n80:AE:54\t\tTp-Link Technologies Co.,Ltd.\n80:AF:19\t\tApple, Inc.\n80:AF:CA\t\tShenzhen Cudy Technology Co., Ltd.\n80:B0:3D\t\tApple, Inc.\n80:B0:7B\t\tzte corporation\n80:B2:19\t\tElektron Technology Uk Limited\n80:B2:34\t\tVantiva USA LLC\n80:B2:89\t\tForworld Electronics Ltd.\n80:B3:2A\t\tUK Grid Solutions Ltd\n80:B5:4E\t\tEspressif Inc.\n80:B5:75\t\tHuawei Technologies Co.,Ltd\n80:B6:24\t\tIvs\n80:B6:55\t\tIntel Corporate\n80:B6:86\t\tHuawei Technologies Co.,Ltd\n80:B7:08\t\tBlue Danube Systems, Inc\n80:B7:09\t\tViptela, Inc\n80:B7:45\t\tThe Silk Technologies ILC LTD\n80:B9:46\t\tNokia\n80:B9:5C\t\tELFTECH Co., Ltd.\n80:B9:7A\t\teero inc.\n80:B9:89\t\tApple, Inc.\n80:BA:16\t\tMicas Networks Inc.\n80:BA:AC\t\tTeleAdapt Ltd\n80:BA:E6\t\tNeets\n80:BB:EB\t\tSatmap Systems Ltd\n80:BC:37\t\tRuckus Wireless\n80:BE:05\t\tApple, Inc.\n80:BE:AF\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n80:C0:1E\t\tIntel Corporate\n80:C1:6E\t\tHewlett Packard\n80:C3:BA\t\tSonova Consumer Hearing GmbH\n80:C4:1B\t\tTexas Instruments\n80:C4:5D\t\tIPG Laser GmbH\n80:C5:01\t\tOctoGate IT Security Systems GmbH\n80:C5:48\t\tShenzhen Zowee Technology Co.,Ltd\n80:C5:E6\t\tMicrosoft Corporation\n80:C5:F2\t\tAzureWave Technology Inc.\n80:C6:3F\t\tRemec Broadband Wireless , LLC\n80:C6:AB\t\tVantiva USA LLC\n80:C6:CA\t\tEndian s.r.l.\n80:C7:55\t\tPanasonic Appliances Company\n80:C7:C5\t\tFiberhome Telecommunication Technologies Co.,LTD\n80:C8:62\t\tOpenpeak, Inc\n80:C9:55\t\tRedpine Signals, Inc.\n80:CA:4B\t\tShenzhen Gongjin Electronics Co.,Ltd\n80:CA:52\t\tWistron InfoComm(Chongqing)Co.,Ltd.\n80:CB:BC\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\n80:CC:12\t\tHuawei Device Co., Ltd.\n80:CC:9C\t\tNetgear\n80:CE:62\t\tHewlett Packard\n80:CE:B1\t\tTheissen Training Systems GmbH\n80:CE:B9\t\tSamsung Electronics Co.,Ltd\n80:CF:41\t\tLenovo Mobile Communication Technology Ltd.\n80:CF:A2\t\tHuawei Device Co., Ltd.\n80:D0:19\t\tEmbed, Inc\n80:D0:4A\t\tVantiva USA LLC\n80:D0:65\t\tCKS Corporation\n80:D0:9B\t\tHuawei Technologies Co.,Ltd\n80:D1:0A\t\tSichuan AI-Link Technology Co., Ltd.\n80:D1:60\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n80:D1:8B\t\tHangzhou I'converge Technology Co.,Ltd\n80:D2:1D\t\tAzureWave Technology Inc.\n80:D2:66\t\tScaleFlux\n80:D2:E5\t\tNintendo Co.,Ltd\n80:D3:36\t\tCern\n80:D4:33\t\tLzLabs GmbH\n80:D4:A5\t\tHuawei Technologies Co.,Ltd\n80:D5:2C\t\tBeijing Cheering Networks Technology Co.,Ltd.\n80:D6:05\t\tApple, Inc.\n80:D7:33\t\tQSR Automations, Inc.\n80:DA:13\t\teero inc.\n80:DA:BC\t\tMegafone Limited\n80:DA:C2\t\tVantiva USA LLC\n80:DB:17\t\tJuniper Networks\n80:DB:31\t\tPower Quotient International Co., Ltd.\n80:DE:CC\t\tHYBE Co.,LTD\n80:E0:1D\t\tCisco Systems, Inc\n80:E1:BF\t\tHuawei Technologies Co.,Ltd\n80:E4:55\t\tNew H3C Technologies Co., Ltd\n80:E4:BA\t\tIntel Corporate\n80:E4:DA\t\tIEEE Registration Authority\n80:E4:DA:00:00:00/28\tWheatstone Corporation\n80:E4:DA:10:00:00/28\tGuangzhou Pinzhong Electronic Technology CO., LTD\n80:E4:DA:20:00:00/28\tThurlby Thandar Instruments LTD\n80:E4:DA:30:00:00/28\tBeijing Gaokezhongtian Technology Co Ltd\n80:E4:DA:40:00:00/28\tBeijing Yuantel Technolgy Co.,Ltd-Shenzhen Branch\n80:E4:DA:50:00:00/28\tCavalry Storage Inc\n80:E4:DA:60:00:00/28\tBroadMedia Co., Ltd.\n80:E4:DA:70:00:00/28\tShortcut Labs\n80:E4:DA:80:00:00/28\tKrizer international Co,. Ltd.\n80:E4:DA:90:00:00/28\tElcus\n80:E4:DA:A0:00:00/28\tNeutronics\n80:E4:DA:B0:00:00/28\tNanjing LILO Technology Co. Ltd.\n80:E4:DA:C0:00:00/28\tEVER Sp. z o.o.\n80:E4:DA:D0:00:00/28\tDalian Roiland Technology Co.,Ltd\n80:E4:DA:E0:00:00/28\tAkenori PTE LTD\n80:E4:DA:F0:00:00/28\tPrivate\n80:E5:40\t\tCommscope\n80:E6:50\t\tApple, Inc.\n80:E7:69\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n80:E8:2C\t\tHewlett Packard\n80:E8:6F\t\tCisco Systems, Inc\n80:E9:4A\t\tLEAPS s.r.o.\n80:EA:07\t\tTp-Link Technologies Co.,Ltd.\n80:EA:0B\t\tZyxel Communications Corporation\n80:EA:23\t\tWistron Neweb Corporation\n80:EA:96\t\tApple, Inc.\n80:EA:CA\t\tDialog Semiconductor Hellas SA\n80:EB:77\t\tWistron Corporation\n80:ED:2C\t\tApple, Inc.\n80:EE:25\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n80:EE:73\t\tShuttle Inc.\n80:F0:CF\t\tRuckus Wireless\n80:F1:A4\t\tHuawei Technologies Co.,Ltd\n80:F1:B2\t\tEspressif Inc.\n80:F1:F1\t\tTech4home, Lda\n80:F2:5E\t\tKyynel\n80:F3:DA\t\tEspressif Inc.\n80:F3:EF\t\tMeta Platforms, Inc.\n80:F4:16\t\tChipsea Technologies (Shenzhen) Corp.\n80:F5:03\t\tCommscope\n80:F5:93\t\tIRCO Sistemas de Telecomunicación S.A.\n80:F5:AE\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n80:F5:B5\t\tTexas Instruments\n80:F6:2E\t\tHangzhou H3C Technologies Co., Limited\n80:F7:A6\t\tShenzhen C-Data Technology Co., Ltd.\n80:F8:EB\t\tRayTight\n80:FA:5B\t\tClevo Co.\n80:FB:06\t\tHuawei Technologies Co.,Ltd\n80:FB:F0\t\tQuectel Wireless Solutions Co.,Ltd.\n80:FB:F1\t\tFreescale Semiconductor (China) Ltd.\n80:FD:7A\t\tBLU Products Inc\n80:FD:7B\t\tBLU Products Inc\n80:FF:A8\t\tUnidis\n84:00:2D\t\tPegatron Corporation\n84:00:D2\t\tSony Corporation\n84:01:12\t\tKaon Group Co., Ltd.\n84:01:A7\t\tGreyware Automation Products, Inc\n84:02:83\t\tHUMAX Co., Ltd.\n84:03:28\t\tJuniper Networks\n84:04:D2\t\tKirale Technologies SL\n84:05:11\t\tApple, Inc.\n84:06:FA\t\tFiberhome Telecommunication Technologies Co.,LTD\n84:07:C4\t\tWalter Kidde Portable Equipment, Inc.\n84:0A:9E\t\tNexapp Technologies Pvt Ltd\n84:0B:2D\t\tSamsung Electro Mechanics Co., Ltd.\n84:0B:7C\t\tHitron Technologies. Inc\n84:0B:BB\t\tMitraStar Technology Corp.\n84:0D:8E\t\tEspressif Inc.\n84:0F:2A\t\tJiangxi Risound Electronics Co.,LTD\n84:0F:45\t\tShanghai GMT Digital Technologies Co., Ltd\n84:0F:4C\t\tApple, Inc.\n84:10:0D\t\tMotorola Mobility LLC, a Lenovo Company\n84:11:9E\t\tSamsung Electronics Co.,Ltd\n84:11:C2\t\tIEEE Registration Authority\n84:11:C2:00:00:00/28\tKazdream Technologies LLP\n84:11:C2:10:00:00/28\tBeijing Dayu Technology Co., Ltd.\n84:11:C2:20:00:00/28\tFuturecom Systems Group\n84:11:C2:30:00:00/28\tFUJIFILM Healthcare Corporation\n84:11:C2:40:00:00/28\tLlc Stc Mzta\n84:11:C2:50:00:00/28\tAIBIoT GmbH\n84:11:C2:60:00:00/28\tKessel Ag\n84:11:C2:70:00:00/28\tEi3 Corporation\n84:11:C2:80:00:00/28\tLeybold GmbH\n84:11:C2:90:00:00/28\tC Tech Bilisim Teknolojileri San. Ve Tic. A.S.\n84:11:C2:A0:00:00/28\tigus GmbH\n84:11:C2:B0:00:00/28\tGuangdong Creator&Flyaudio Electronic Technology Co.,LTD\n84:11:C2:C0:00:00/28\tProvision-ISR\n84:11:C2:D0:00:00/28\tGoldmund Switzerland\n84:11:C2:E0:00:00/28\tDangerous Music Group, LLC\n84:13:9F\t\tzte corporation\n84:14:4D\t\tIntel Corporate\n84:15:71\t\tTCT mobile ltd\n84:15:D3\t\tHuawei Technologies Co.,Ltd\n84:16:0C\t\tBroadcom Limited\n84:16:F9\t\tTp-Link Technologies Co.,Ltd.\n84:17:15\t\tGP Electronics (HK) Ltd.\n84:17:66\t\tWeifang Goertek Electronics Co.,Ltd\n84:17:EF\t\tVantiva USA LLC\n84:18:26\t\tOsram GmbH\n84:18:3A\t\tRuckus Wireless\n84:18:88\t\tJuniper Networks\n84:1A:24\t\tUnionman Technology Co.,Ltd\n84:1B:38\t\tShenzhen Excelsecu Data Technology Co.,Ltd\n84:1B:5E\t\tNetgear\n84:1B:77\t\tIntel Corporate\n84:1C:70\t\tzte corporation\n84:1E:26\t\tKERNEL-I Co.,LTD\n84:1E:A3\t\tSagemcom Broadband SAS\n84:1F:E8\t\tEspressif Inc.\n84:20:96\t\tShenzhen Rf-Link Technology Co.,Ltd.\n84:21:41\t\tShenzhen Ginwave Technologies Ltd.\n84:21:F1\t\tHuawei Technologies Co.,Ltd\n84:22:5E\t\tShenzhen Technewchip Technology Co.,Ltd.\n84:22:89\t\tSamsung Electronics Co.,Ltd\n84:23:88\t\tRuckus Wireless\n84:24:8D\t\tZebra Technologies Inc\n84:25:19\t\tSamsung Electronics\n84:25:3F\t\tsilex technology, Inc.\n84:25:A4\t\tTariox Limited\n84:25:DB\t\tSamsung Electronics Co.,Ltd\n84:26:15\t\tADB Broadband Italia\n84:26:2B\t\tNokia\n84:26:7A\t\tGuangdong Taide Zhilian Technology Co.,Ltd\n84:26:90\t\tBeijing Thought Science Co.,Ltd.\n84:27:12\t\tSilicon Laboratories\n84:27:B6\t\tChina Mobile IOT Company Limited\n84:27:CE\t\tCorporation of the Presiding Bishop of The Church of Jesus Christ of Latter-day Saints\n84:28:59\t\tAmazon Technologies Inc.\n84:28:5A\t\tSaffron Solutions Inc\n84:28:D6\t\tServercom (India) Private Limited\n84:29:14\t\tEMPORIA TELECOM Produktions- und VertriebsgesmbH & Co KG\n84:29:99\t\tApple, Inc.\n84:2A:FD\t\tHP Inc.\n84:2B:2B\t\tDell Inc.\n84:2B:50\t\tHuria Co.,Ltd.\n84:2B:BC\t\tModelleisenbahn GmbH\n84:2C:80\t\tSichuan Changhong Electric Ltd.\n84:2E:14\t\tSilicon Laboratories\n84:2E:27\t\tSamsung Electronics Co.,Ltd\n84:2F:57\t\tApple, Inc.\n84:2F:75\t\tInnokas Group\n84:30:95\t\tHon Hai Precision IND.CO.,LTD\n84:30:CE\t\tShenzhen Jaguar Microsystems Co., Ltd\n84:30:E5\t\tSkyHawke Technologies, LLC\n84:31:A8\t\tFunshion Online Technologies Co.,Ltd\n84:32:6F\t\tGuangzhou Ava Electronics Technology Co.,Ltd\n84:32:EA\t\tAnhui Wanzten P&T Co., Ltd\n84:33:F2\t\tShenzhen Stellamore Technology Co.,Ltd\n84:34:97\t\tHewlett Packard\n84:36:11\t\thyungseul publishing networks\n84:37:D5\t\tSamsung Electronics Co.,Ltd\n84:38:35\t\tApple, Inc.\n84:38:38\t\tSamsung Electro-Mechanics(Thailand)\n84:39:8F\t\tFortinet, Inc.\n84:39:BE:00:00:00/28\tHino Engineering, Inc\n84:39:BE:10:00:00/28\tGuangzhou Heygears Technology Ltd\n84:39:BE:20:00:00/28\tCheng Du virtual world Technology Limited.\n84:39:BE:30:00:00/28\tShenZhen Fudeyu Technology co.,Ltd\n84:39:BE:40:00:00/28\tShenzhen Ramos Digital Technology Co,.Ltd.\n84:39:BE:50:00:00/28\tNeat S.r.l.\n84:39:BE:60:00:00/28\tShenzhen IP3 Century Intelligent Technology Co., Ltd\n84:39:BE:80:00:00/28\tDiamond Products LLC\n84:39:BE:90:00:00/28\tGuangdong SunMeng Information Technology Co. Ltd.\n84:39:BE:A0:00:00/28\tEmotiq s.r.l.\n84:39:BE:B0:00:00/28\tShenzhen Horn Audio Co.,Ltd.\n84:39:BE:C0:00:00/28\tEDC Electronic Design Chemnitz GmbH\n84:39:BE:D0:00:00/28\tShenzhen Lidaxun Digital Technology Co.,Ltd\n84:39:FC\t\tNokia\n84:3A:4B\t\tIntel Corporate\n84:3A:5B\t\tInventec(Chongqing) Corporation\n84:3B:10\t\tLvswitches Inc.\n84:3C:4C\t\tRobert Bosch SRL\n84:3C:99\t\tzte corporation\n84:3D:C6\t\tCisco Systems, Inc\n84:3E:03\t\tSagemcom Broadband SAS\n84:3E:1D\t\tHui Zhou Gaoshengda Technology Co.,LTD\n84:3E:79\t\tShenzhen Belon Technology CO.,LTD\n84:3E:92\t\tHuawei Technologies Co.,Ltd\n84:3F:4E\t\tTri-Tech Manufacturing, Inc.\n84:40:76\t\tDrivenets\n84:41:67\t\tApple, Inc.\n84:44:64\t\tServerU Inc\n84:44:AF\t\tZhejiang Tmall Technology Co., Ltd.\n84:46:93\t\tBeijing Xiaomi Mobile Software Co., Ltd\n84:46:FE\t\tHuawei Technologies Co.,Ltd\n84:47:09\t\tShenzhen IP3 Century Intelligent Technology CO.,Ltd\n84:47:65\t\tHuawei Technologies Co.,Ltd\n84:48:23\t\tWOXTER TECHNOLOGY Co. Ltd\n84:49:15\t\tvArmour Networks, Inc.\n84:49:EE\t\tDemant Enterprise A/S\n84:4B:B7\t\tBeijing Sankuai Online Technology Co.,Ltd\n84:4B:F5\t\tHon Hai Precision Ind. Co.,Ltd.\n84:4D:4C\t\tAdtran Inc\n84:4D:BE\t\tFiberhome Telecommunication Technologies Co.,LTD\n84:4F:03\t\tAblelink Electronics Ltd\n84:50:75\t\tHuawei Device Co., Ltd.\n84:50:9A\t\tEasy Soft TV Co., Ltd\n84:51:81\t\tSamsung Electronics Co.,Ltd\n84:52:34\t\tJuniper Networks\n84:53:CD\t\tChina Mobile Group Device Co.,Ltd.\n84:54:DF\t\tHuawei Device Co., Ltd.\n84:55:A5\t\tSamsung Electronics Co.,Ltd\n84:56:9C\t\tCoho Data, Inc.,\n84:57:33\t\tMicrosoft Corporation\n84:57:87\t\tDVR C&C Co., Ltd.\n84:57:F7\t\tMeta Platforms, Inc.\n84:5A:3E\t\tCisco Systems, Inc\n84:5A:81\t\tffly4u\n84:5B:12\t\tHuawei Technologies Co.,Ltd\n84:5C:93\t\tChabrier Services\n84:5C:F3\t\tIntel Corporate\n84:5D:D7\t\tShenzhen Netcom Electronics Co.,Ltd\n84:5F:04\t\tSamsung Electronics Co.,Ltd\n84:60:82\t\tHyperloop Technologies, Inc dba Virgin Hyperloop\n84:61:A0\t\tCommscope\n84:62:23\t\tShenzhen Coship Electronics Co., Ltd.\n84:62:A6\t\tEuroCB (Phils), Inc.\n84:63:D6\t\tMicrosoft Corporation\n84:64:DD\t\tHuawei Technologies Co.,Ltd\n84:65:2B\t\tDonaldson Company\n84:65:69\t\tNew H3C Technologies Co., Ltd\n84:68:3E\t\tIntel Corporate\n84:68:78\t\tApple, Inc.\n84:68:C8\t\tTotolink Technology Int‘L Limited\n84:69:91\t\tNokia\n84:69:93\t\tHP Inc.\n84:6A:66\t\tSumitomo Kizai  Co.,Ltd.\n84:6A:ED\t\tWireless Tsukamoto.,co.LTD\n84:6B:48\t\tShenZhen EepuLink Co., Ltd.\n84:6E:B1\t\tPark Assist LLC\n84:6E:BC\t\tNokia Solutions and Networks India Private Limited\n84:6F:CE\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n84:70:51\t\tAlpsalpine Co,.Ltd\n84:70:D7\t\teero inc.\n84:71:27\t\tSilicon Laboratories\n84:71:6A\t\tHuawei Device Co., Ltd.\n84:72:07\t\tI&C Technology\n84:72:93\t\tTexas Instruments\n84:73:03\t\tLetv Mobile and Intelligent Information Technology (Beijing) Corporation Ltd.\n84:74:2A\t\tzte corporation\n84:74:60\t\tzte corporation\n84:76:16\t\tAddat s.r.o.\n84:76:37\t\tHuawei Technologies Co.,Ltd\n84:77:78\t\tCochlear Limited\n84:78:48\t\tUbiquiti Inc\n84:78:8B\t\tApple, Inc.\n84:78:AC\t\tCisco Systems, Inc\n84:79:33\t\tprofichip GmbH\n84:79:73\t\tShanghai Baud Data Communication Co.,Ltd.\n84:7A:88\t\tHTC Corporation\n84:7A:B6\t\tAltoBeam (China) Inc.\n84:7A:DF\t\tFujian Star-Net Communication Co.,Ltd\n84:7B:57\t\tIntel Corporate\n84:7B:EB\t\tDell Inc.\n84:7C:9B\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n84:7D:50\t\tHolley Metering Limited\n84:7E:40\t\tTexas Instruments\n84:7F:3D\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n84:80:2D\t\tCisco Systems, Inc\n84:80:94\t\tMeter, Inc.\n84:81:02\t\tFiberhome Telecommunication Technologies Co.,LTD\n84:82:1B\t\tPROX SG Pte Ltd\n84:82:F4\t\tBeijing Huasun Unicreate Technology Co., Ltd\n84:83:19\t\tHangzhou Zero Zero Technology Co., Ltd.\n84:83:36\t\tNewrun\n84:83:71\t\tAvaya Inc\n84:84:33\t\tParadox Engineering SA\n84:85:06\t\tApple, Inc.\n84:85:0A\t\tHella Sonnen- und Wetterschutztechnik GmbH\n84:85:53\t\tBiznes Systema Telecom, LLC\n84:85:E6\t\tGuangdong Asano Technology CO.,Ltd.\n84:86:87\t\tweiyuantechnology\n84:86:F3\t\tGreenvity Communications\n84:87:FF\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n84:88:E1\t\tApple, Inc.\n84:89:AD\t\tApple, Inc.\n84:89:EC\t\tIEEE Registration Authority\n84:89:EC:00:00:00/28\tSmartGiant Technology\n84:89:EC:10:00:00/28\tResearch Electronics International, LLC.\n84:89:EC:20:00:00/28\tthousand star tech LTD.\n84:89:EC:30:00:00/28\tAerionics Inc.\n84:89:EC:40:00:00/28\tVayyar Imaging Ltd.\n84:89:EC:50:00:00/28\tZephyr Engineering, Inc.\n84:89:EC:60:00:00/28\tPOCT biotechnology\n84:89:EC:70:00:00/28\tBYDA Co. Ltd.,\n84:89:EC:80:00:00/28\tArts Digital Technology (HK) Ltd.\n84:89:EC:90:00:00/28\tShenzhen Xtooltech Co., Ltd\n84:89:EC:A0:00:00/28\tNewell Brands\n84:89:EC:B0:00:00/28\tEPSa Elektronik & Präzisionsbau Saalfeld GmbH\n84:89:EC:C0:00:00/28\tShinkawa Ltd.\n84:89:EC:D0:00:00/28\tPrice Industries Limited\n84:89:EC:E0:00:00/28\tShenzhen Intellifusion Technologies Co., Ltd.\n84:8A:59\t\tHisilicon Technologies Co., Ltd\n84:8A:8D\t\tCisco Systems, Inc\n84:8B:CD\t\tIEEE Registration Authority\n84:8B:CD:00:00:00/28\tSouXin Corporate\n84:8B:CD:10:00:00/28\tShenzhen LTIME In-Vehicle Entertainment System Company Limited\n84:8B:CD:20:00:00/28\tCCX Technologies Inc.\n84:8B:CD:30:00:00/28\tAnnapurna labs\n84:8B:CD:40:00:00/28\tLogic Supply\n84:8B:CD:50:00:00/28\texodraft a/s\n84:8B:CD:60:00:00/28\tTwtg R&D B.V.\n84:8B:CD:70:00:00/28\tSmart Code (Shenzhen) Technology Co.,Ltd\n84:8B:CD:80:00:00/28\tDunst tronic GmbH\n84:8B:CD:90:00:00/28\tNoralsy\n84:8B:CD:A0:00:00/28\tSphera Telecom\n84:8B:CD:B0:00:00/28\tChongqing Huayi Kangdao Technology Co.,Ltd.\n84:8B:CD:C0:00:00/28\tWormit\n84:8B:CD:D0:00:00/28\tEngisat Lda\n84:8B:CD:E0:00:00/28\tEmotiv Inc\n84:8C:8D\t\tApple, Inc.\n84:8D:84\t\tRajant Corporation\n84:8D:C7\t\tCisco SPVTG\n84:8D:CE\t\tCiena Corporation\n84:8E:0C\t\tApple, Inc.\n84:8E:96\t\tEmbertec Pty Ltd\n84:8E:DF\t\tSony Corporation\n84:8F:69\t\tDell Inc.\n84:90:00\t\tArnold&Richter Cine Technik GmbH & Co. Betriebs KG\n84:90:0A\t\tArcadyan Corporation\n84:92:E5\t\tHuawei Technologies Co.,Ltd\n84:93:0C\t\tInCoax Networks Europe AB\n84:93:A0\t\tHuawei Device Co., Ltd.\n84:93:B2\t\tzte corporation\n84:94:37\t\tApple, Inc.\n84:94:59\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n84:94:8C\t\tHitron Technologies. Inc\n84:96:81\t\tCathay Communication Co.,Ltd\n84:96:90\t\tMurata Manufacturing Co., Ltd.\n84:96:D8\t\tCommscope\n84:97:B8\t\tMemjet Inc.\n84:98:66\t\tSamsung Electronics Co.,Ltd\n84:9A:40\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n84:9C:02\t\tDruid Software\n84:9C:A4\t\tMimosa Networks\n84:9C:A6\t\tArcadyan Technology Corporation\n84:9D:64\t\tSMC Corporation\n84:9D:C2\t\tShanghai MXCHIP Information Technology Co., Ltd.\n84:9D:C5\t\tCentera Photonics Inc.\n84:9E:56\t\tCloud Network Technology Singapore Pte. Ltd.\n84:9F:B5\t\tHuawei Technologies Co.,Ltd\n84:A0:6E\t\tSagemcom Broadband SAS\n84:A1:34\t\tApple, Inc.\n84:A1:B7\t\tHonor Device Co., Ltd.\n84:A1:D1\t\tSagemcom Broadband SAS\n84:A2:4D\t\tBirds Eye Systems Private Limited\n84:A3:29\t\tArcadyan Corporation\n84:A3:B5\t\tPropulsion systems\n84:A4:23\t\tSagemcom Broadband SAS\n84:A4:66\t\tSamsung Electronics Co.,Ltd\n84:A6:C8\t\tIntel Corporate\n84:A7:83\t\tAlcatel Lucent\n84:A7:88\t\tPerples\n84:A8:24\t\tGoogle, Inc.\n84:A8:E4\t\tHuawei Technologies Co.,Ltd\n84:A9:38\t\tLCFC(Hefei) Electronics Technology co., ltd\n84:A9:3E\t\tHewlett Packard\n84:A9:91\t\tCyber Trans Japan Co.,Ltd.\n84:A9:C4\t\tHuawei Technologies Co.,Ltd\n84:A9:EA\t\tCareer Technologies USA\n84:AA:9C\t\tMitraStar Technology Corp.\n84:AA:A4\t\tSONoC Corp.\n84:AB:1A\t\tApple, Inc.\n84:AB:26\t\tTiinlab Corporation\n84:AC:16\t\tApple, Inc.\n84:AC:60\t\tGuangxi Hesheng Electronics Co., Ltd.\n84:AC:A4\t\tBeijing Novel Super Digital TV Technology Co., Ltd\n84:AC:FB\t\tCrouzet Automatismes\n84:AD:58\t\tHuawei Technologies Co.,Ltd\n84:AD:8D\t\tApple, Inc.\n84:AF:1F\t\tGopherTec Inc.\n84:AF:EC\t\tBuffalo.Inc\n84:B1:53\t\tApple, Inc.\n84:B1:E2\t\tMicrosoft Corporation\n84:B1:E4\t\tApple, Inc.\n84:B2:61\t\tCisco Systems, Inc\n84:B3:1B\t\tKinexon GmbH\n84:B3:86\t\tIEEE Registration Authority\n84:B3:86:00:00:00/28\tNan Jing WZX Technology Limited\n84:B3:86:10:00:00/28\tSichuan Huakun Zhenyu Intelligent Technology Co., Ltd\n84:B3:86:20:00:00/28\tAnnapurna labs\n84:B3:86:30:00:00/28\tPhonesuite\n84:B3:86:40:00:00/28\tCobham\n84:B3:86:50:00:00/28\tFusus\n84:B3:86:60:00:00/28\tALPHA Corporation\n84:B3:86:70:00:00/28\tFOTILE GROUP NINGBO FOTILE KITCHENWARE Co.,Ltd\n84:B3:86:80:00:00/28\tNetworX\n84:B3:86:90:00:00/28\tWeiss Robotics GmbH & Co. KG\n84:B3:86:A0:00:00/28\tVelocio Networks, Inc.\n84:B3:86:B0:00:00/28\tSineng electric CO., Ltd\n84:B3:86:C0:00:00/28\tPalomar Products Inc\n84:B3:86:D0:00:00/28\tDongguan Amsamotion Automation Technology Co., Ltd\n84:B3:86:E0:00:00/28\tNingbo Xinsuan Technology Co.,Ltd\n84:B4:D2\t\tShenzhen iComm Semiconductor CO.,LTD\n84:B4:DB\t\tSilicon Laboratories\n84:B5:17\t\tCisco Systems, Inc\n84:B5:41\t\tSamsung Electronics Co.,Ltd\n84:B5:9C\t\tJuniper Networks\n84:B6:30\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n84:B8:02\t\tCisco Systems, Inc\n84:B8:66\t\tBeijing XiaoLu technology co. LTD\n84:B8:B8\t\tMotorola (Wuhan) Mobility Technologies Communication Co., Ltd.\n84:BA:20\t\tSilicon Laboratories\n84:BA:3B\t\tCanon Inc.\n84:BA:59\t\tWistron InfoComm(Chongqing)Co.,Ltd.\n84:BB:26\t\tTexas Instruments\n84:BB:69\t\tCommscope\n84:BE:52\t\tHuawei Technologies Co.,Ltd\n84:BE:8B\t\tChengdu Geeker Technology Co., Ltd.\n84:C0:EF\t\tSamsung Electronics Co.,Ltd\n84:C1:C1\t\tJuniper Networks\n84:C2:E4\t\tJiangsu Qinheng Co., Ltd.\n84:C3:E8\t\tVaillant GmbH\n84:C5:A6\t\tIntel Corporate\n84:C6:92\t\tTexas Instruments\n84:C7:27\t\tGnodal Ltd\n84:C7:8F\t\tAPS Networks GmbH\n84:C7:A9\t\tC3Po S.A.\n84:C7:EA\t\tSony Corporation\n84:C8:07\t\tADVA Optical Networking Ltd.\n84:C8:A0\t\tHui Zhou Gaoshengda Technology Co.,LTD\n84:C8:B1\t\tIncognito Software Systems Inc.\n84:C9:B2\t\tD-Link International\n84:C9:C6\t\tShenzhen Gongjin Electronics Co.,Lt\n84:CB:85\t\tEM Microelectronic\n84:CC:11\t\tLG Electornics\n84:CC:63\t\tHuawei Device Co., Ltd.\n84:CC:A8\t\tEspressif Inc.\n84:CD:62\t\tShenZhen IDWELL Technology CO.,Ltd\n84:CF:BF\t\tFairphone\n84:D0:DB\t\tGuangdong Juan Intelligent Technology Joint Stock Co., Ltd.\n84:D1:5A\t\tTCT mobile ltd\n84:D3:28\t\tApple, Inc.\n84:D3:2A\t\tIeee 1905.1\n84:D3:43\t\tCalix Inc.\n84:D3:52\t\tTonly Technology Co. Ltd\n84:D3:D5\t\tHuawei Device Co., Ltd.\n84:D4:12\t\tPalo Alto Networks\n84:D4:7E\t\tHewlett Packard Enterprise\n84:D4:C8\t\tWidex A/S\n84:D5:A0\t\tMcot Inc.\n84:D6:08\t\tWingtech Mobile Communications Co., Ltd.\n84:D6:C5\t\tSolarEdge Technologies\n84:D6:D0\t\tAmazon Technologies Inc.\n84:D7:DE\t\tHuawei Technologies Co.,Ltd\n84:D8:1B\t\tTp-Link Technologies Co.,Ltd.\n84:D9:31\t\tHangzhou H3C Technologies Co., Limited\n84:D9:C8\t\tUnipattern Co.,\n84:DB:2F\t\tSierra Wireless, ULC\n84:DB:9E\t\tPink Nectarine Health AB\n84:DB:A4\t\tHuawei Device Co., Ltd.\n84:DB:AC\t\tHuawei Technologies Co.,Ltd\n84:DB:FC\t\tNokia\n84:DD:20\t\tTexas Instruments\n84:DD:B7\t\tCilag GmbH International\n84:DE:3D\t\tCrystal Vision Ltd\n84:DF:0C\t\tNet2Grid Bv\n84:DF:19\t\tChuango Security Technology Corporation\n84:E0:58\t\tCommscope\n84:E0:F4\t\tIEEE Registration Authority\n84:E0:F4:00:00:00/28\tShenZhen Panrich Technology Limited\n84:E0:F4:10:00:00/28\tMedicusTek Inc.\n84:E0:F4:20:00:00/28\tHangzhou Uni-Ubi Co.,Ltd.\n84:E0:F4:30:00:00/28\tASL Intercom B.V.\n84:E0:F4:40:00:00/28\tPetroInTrade\n84:E0:F4:50:00:00/28\tHangzhou Nationalchip Science & Technology Co.,Ltd.\n84:E0:F4:60:00:00/28\tLiaoning IK'SONYA Science and Technology Co., Ltd.\n84:E0:F4:70:00:00/28\tDantherm\n84:E0:F4:80:00:00/28\tRAY Co.,LTD\n84:E0:F4:90:00:00/28\tShenzhen Hcn.Electronics Co.,Ltd.\n84:E0:F4:A0:00:00/28\tiSolution Technologies Co.,Ltd.\n84:E0:F4:B0:00:00/28\tOrchard Electronics Co., Ltd.\n84:E0:F4:C0:00:00/28\tAimtron Corporation\n84:E0:F4:D0:00:00/28\tLogos01 Srl\n84:E0:F4:E0:00:00/28\tScale-Tec Ltd.\n84:E3:23\t\tGreen Wave Telecommunication SDN BHD\n84:E3:27\t\tTailyn Technologies Inc\n84:E3:42\t\tTuya Smart Inc.\n84:E4:D9\t\tShenzhen NEED technology Ltd.\n84:E5:85\t\tEM Microelectronic\n84:E5:D8\t\tGuangdong UNIPOE IoT Technology Co.,Ltd.\n84:E6:29\t\tBluwan SA\n84:E6:57\t\tSony Interactive Entertainment Inc.\n84:E7:14\t\tLiang Herng Enterprise,Co.Ltd.\n84:E8:92\t\tActiontec Electronics, Inc\n84:E8:CB\t\tBuffalo.Inc\n84:E9:86\t\tHuawei Device Co., Ltd.\n84:E9:C1\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n84:EA:97\t\tShenzhen iComm Semiconductor CO.,LTD\n84:EA:99\t\tVieworks\n84:EA:D2\t\tKoganei Corporation\n84:EA:ED\t\tRoku, Inc\n84:EB:18\t\tTexas Instruments\n84:EB:3E\t\tVivint Smart Home\n84:EB:3F\t\tVivint Inc\n84:EB:EF\t\tCisco Systems, Inc\n84:ED:33\t\tBBMC Co.,Ltd\n84:EE:7F\t\tHuawei Technologies Co.,Ltd\n84:EE:E4\t\tSamsung Electronics Co.,Ltd\n84:EF:18\t\tIntel Corporate\n84:F1:17\t\tNewseason\n84:F1:29\t\tMetrascale Inc.\n84:F1:47\t\tCisco Systems, Inc\n84:F1:75\t\tJiangxi Xunte Intelligent Terminal Co., Ltd\n84:F1:D0\t\tEhoome Iot Private Limited\n84:F1:F7\t\tNXP Semiconductor (Tianjin) LTD.\n84:F2:C1\t\tzte corporation\n84:F3:EB\t\tEspressif Inc.\n84:F4:4C\t\tInternational Integrated Systems., Inc.\n84:F4:93\t\tOMS spol. s.r.o.\n84:F5:EB\t\tzte corporation\n84:F6:4C\t\tCross Point BV\n84:F6:FA\t\tMiovision Technologies Incorporated\n84:F7:03\t\tEspressif Inc.\n84:F7:58\t\tHuizhou BYD Electronic Co., Ltd.\n84:F8:83\t\tLuminar Technologies\n84:FB:43\t\tCentral Denshi Seigyo\n84:FC:AC\t\tApple, Inc.\n84:FC:E6\t\tEspressif Inc.\n84:FC:FE\t\tApple, Inc.\n84:FD:27\t\tSilicon Laboratories\n84:FD:D1\t\tIntel Corporate\n84:FE:40\t\tHuawei Technologies Co.,Ltd\n84:FE:9E\t\tRTC Industries, Inc.\n84:FE:DC\t\tBorqs Beijing Ltd.\n84:FF:C2\t\tCisco Systems, Inc\n88:01:0C\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n88:01:18\t\tBLT Co\n88:01:F2\t\tVitec System Engineering Inc.\n88:01:F9\t\tTexas Instruments\n88:02:64\t\tPascal Audio\n88:03:4C\t\tWeifang Goertek Electronics Co.,Ltd\n88:03:55\t\tArcadyan Technology Corporation\n88:03:E9\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n88:07:4B\t\tLG Electronics (Mobile Communications)\n88:08:94\t\tSkullcandy\n88:09:05\t\tMTMCommunications\n88:09:07\t\tMKT Systemtechnik GmbH & Co. KG\n88:09:AF\t\tMasimo Corporation\n88:0A:A3\t\tJuniper Networks\n88:0C:E0\t\tTexas Instruments\n88:0E:85\t\tShenzhen Boomtech Industrial Corporation\n88:0F:10\t\tHuami Information Technology Co.,Ltd.\n88:0F:62\t\tSilicon Laboratories\n88:0F:A2\t\tSagemcom Broadband SAS\n88:0F:B6\t\tJabil Circuits India Pvt Ltd,-EHTP unit\n88:10:36\t\tPanodic(ShenZhen) Electronics Limted\n88:10:8F\t\tHuawei Technologies Co.,Ltd\n88:11:96\t\tHuawei Technologies Co.,Ltd\n88:12:3D\t\tSuzhou Aquila Solutions Inc.\n88:12:4E\t\tQualcomm Inc.\n88:12:7D\t\tShenzhen Melon Electronics Co.,Ltd\n88:12:AC\t\tHunan Fn-Link Technology Limited\n88:13:BF\t\tEspressif Inc.\n88:14:2B\t\tProtonic Holland\n88:15:44\t\tCisco Meraki\n88:15:66\t\tHuawei Device Co., Ltd.\n88:15:C5\t\tHuawei Device Co., Ltd.\n88:17:A3\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n88:18:AE\t\tTamron Co., Ltd\n88:19:08\t\tApple, Inc.\n88:1A:14\t\tSilicon Laboratories\n88:1B:99\t\tShenzhen Xin Fei Jia Electronic Co. Ltd.\n88:1C:95\t\tItel Mobile Limited\n88:1D:FC\t\tCisco Systems, Inc\n88:1E:59\t\tOnion Corporation\n88:1E:5A\t\tApple, Inc.\n88:1F:A1\t\tApple, Inc.\n88:20:0D\t\tApple, Inc.\n88:20:12\t\tLMI Technologies\n88:20:67\t\tFiberhome Telecommunication Technologies Co.,LTD\n88:21:E3\t\tNebusens, S.L.\n88:22:22\t\tVusionGroup\n88:22:5B\t\tHewlett Packard Enterprise\n88:22:B2\t\tChipsea Technologies (Shenzhen) Corp.\n88:23:1F\t\tFibocom Wireless Inc.\n88:23:64\t\tWatchnet DVR Inc\n88:23:8C\t\tFiberhome Telecommunication Technologies Co.,LTD\n88:23:FE\t\tTTTech Computertechnik AG\n88:25:08\t\tMeta Platforms, Inc.\n88:25:10\t\tHewlett Packard Enterprise\n88:25:2C\t\tArcadyan Technology Corporation\n88:25:93\t\tTp-Link Technologies Co.,Ltd.\n88:26:3F\t\tZhejiang Uniview Technologies Co.,Ltd.\n88:28:7D\t\tAltoBeam (China) Inc.\n88:28:B3\t\tHuawei Technologies Co.,Ltd\n88:28:FB\t\tJuniper Networks\n88:29:49\t\tRenesas Electronics (Penang) Sdn. Bhd.\n88:29:50\t\tNetmoon Technology Co., Ltd\n88:29:9C\t\tSamsung Electronics Co.,Ltd\n88:2A:5E\t\tNew H3C Technologies Co., Ltd\n88:2A:E1\t\tMrc Inc.\n88:2B:94\t\tMADOKA SYSTEM Co.,Ltd.\n88:2B:D7\t\tAddénergie  Technologies\n88:2D:53\t\tBaidu Online Network Technology (Beijing) Co., Ltd.\n88:2E:5A\t\tstorONE\n88:2F:64\t\tBCOM Networks Limited\n88:30:37\t\tJuniper Networks\n88:30:8A\t\tMurata Manufacturing Co., Ltd.\n88:32:9B\t\tSamsung Electro-Mechanics(Thailand)\n88:33:14\t\tTexas Instruments\n88:33:BE\t\tIvenix, Inc.\n88:34:FE\t\tBosch Automotive Products (Suzhou) Co. Ltd\n88:35:4C\t\tTransics\n88:35:C1\t\tOi Electric Co.,Ltd\n88:36:12\t\tSRC Computers, LLC\n88:36:5F\t\tLG Electronics (Mobile Communications)\n88:36:6C\t\tEFM Networks\n88:36:CF\t\tHuawei Device Co., Ltd.\n88:3A:30\t\tHewlett Packard Enterprise\n88:3B:8B\t\tCheering Connection Co. Ltd.\n88:3C:1C\t\tMercury Corporation\n88:3C:93\t\tAlcatel-Lucent Enterprise\n88:3C:C5\t\tIEEE Registration Authority\n88:3C:C5:00:00:00/28\tChengdu Data Sky Technology Co., Ltd.\n88:3C:C5:10:00:00/28\tHanwei Electronics Group Corporation\n88:3C:C5:20:00:00/28\tNetgen Hitech Solutions Llp\n88:3C:C5:30:00:00/28\tshenzhen Feng Jing Sheng Electronics Technology Co.,Ltd\n88:3C:C5:40:00:00/28\tSwabian Instruments GmbH\n88:3C:C5:50:00:00/28\tShanghai Ucan Automation Equipment Co., Ltd.\n88:3C:C5:60:00:00/28\tmfJebsen Electronics Ltd.\n88:3C:C5:70:00:00/28\tKMtronic ltd\n88:3C:C5:80:00:00/28\tWuhan Guangying Intelligence Technology Co., Ltd\n88:3C:C5:90:00:00/28\tSernet (Suzhou) Technologies Corporation\n88:3C:C5:A0:00:00/28\tCorigine,Inc.\n88:3C:C5:B0:00:00/28\tShenzhen shijia chuangxin Technology Co., Ltd\n88:3C:C5:C0:00:00/28\tHDL da Amazônia Industria Eletrônica Ltda\n88:3C:C5:D0:00:00/28\tLenard Enterprises Inc\n88:3C:C5:E0:00:00/28\tmyUpTech AB\n88:3D:24\t\tGoogle, Inc.\n88:3E:0D\t\tHD Hyundai Electric\n88:3F:0C\t\tsystem a.v. co., ltd.\n88:3F:27\t\tHuawei Device Co., Ltd.\n88:3F:37\t\tUhtek Co., Ltd.\n88:3F:4A\t\tTexas Instruments\n88:3F:99\t\tSiemens AG\n88:3F:D3\t\tHuawei Technologies Co.,Ltd\n88:40:33\t\tHuawei Technologies Co.,Ltd\n88:40:3B\t\tHuawei Technologies Co.,Ltd\n88:40:67\t\tinfomark\n88:41:57\t\tShenzhen Atsmart Technology Co.,Ltd.\n88:41:C1\t\tOrbisat Da Amazonia Ind E Aerol Sa\n88:41:FC\t\tAirTies Wireless Networks\n88:43:E1\t\tCisco Systems, Inc\n88:44:77\t\tHuawei Technologies Co.,Ltd\n88:44:F6\t\tNokia Corporation\n88:45:F0\t\tGuangdong Genius Technology Co., Ltd.\n88:46:04\t\tXiaomi Communications Co Ltd\n88:46:2A\t\tTelechips Inc.\n88:4A:18\t\tOpulinks\n88:4A:70\t\tWacom Co.,Ltd.\n88:4A:EA\t\tTexas Instruments\n88:4B:39\t\tSiemens AG, Healthcare Sector\n88:4C:CF\t\tPulzze Systems, Inc\n88:4D:7C\t\tApple, Inc.\n88:4F:59\t\tCisco Systems, Inc\n88:50:46\t\tLear\n88:50:DD\t\tInfiniband Trade Association\n88:50:F6\t\tShenzhen Jingxun Software Telecommunication Technology Co.,Ltd\n88:51:7A\t\tHMD Global Oy\n88:51:F2\t\tApple, Inc.\n88:51:FB\t\tHewlett Packard\n88:52:EB\t\tXiaomi Communications Co Ltd\n88:53:2E\t\tIntel Corporate\n88:53:95\t\tApple, Inc.\n88:53:D4\t\tHuawei Technologies Co.,Ltd\n88:54:1F\t\tGoogle, Inc.\n88:54:8E\t\tvivo Mobile Communication Co., Ltd.\n88:57:1D\t\tSeongji Industry Company\n88:57:21\t\tEspressif Inc.\n88:57:6D\t\tXTA Electronics Ltd\n88:57:EE\t\tBuffalo.Inc\n88:58:BE\t\tkuosheng.com\n88:5A:06\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n88:5A:23\t\tCelestica Inc.\n88:5A:85\t\tWistron Neweb Corporation\n88:5A:92\t\tCisco Systems, Inc\n88:5B:DD\t\tExtreme Networks Headquarters\n88:5C:47\t\tAlcatel Lucent\n88:5D:90\t\tIEEE Registration Authority\n88:5D:90:00:00:00/28\tFoshan Huaguo Optical Co.,Ltd\n88:5D:90:10:00:00/28\tShenZhen Yuyangsheng technology company LTD\n88:5D:90:20:00:00/28\tDAIDONG Industrial System Co., Ltd.\n88:5D:90:30:00:00/28\tCPAC Systems\n88:5D:90:40:00:00/28\tWuhan Strong Electronics Co., Ltd\n88:5D:90:50:00:00/28\tShenzhen JingHanDa Electronics Co.Ltd\n88:5D:90:60:00:00/28\tHi-Profile Achievement (M) Sdn Bhd\n88:5D:90:70:00:00/28\tSchmidt & Co.,(H.K.)Ltd.\n88:5D:90:80:00:00/28\tCreative Sensor Inc.\n88:5D:90:90:00:00/28\tGigatech R&D Corp.\n88:5D:90:A0:00:00/28\tShenzhen Speedrun Technologies Co.,Ltd.\n88:5D:90:B0:00:00/28\tPremier Merchandises Limited\n88:5D:90:C0:00:00/28\tiRoom GmbH\n88:5D:90:D0:00:00/28\tHexaglobe\n88:5D:90:E0:00:00/28\tUnitac Technology Limited\n88:5D:90:F0:00:00/28\tPrivate\n88:5D:FB\t\tzte corporation\n88:5E:BD\t\tNCKOREA Co.,Ltd.\n88:5F:E8\t\tIEEE Registration Authority\n88:5F:E8:00:00:00/28\tJungheinrich Norderstedt AG & Co. KG\n88:5F:E8:10:00:00/28\tApoidea Technology Co., Ltd.\n88:5F:E8:20:00:00/28\tOpto Engineering\n88:5F:E8:30:00:00/28\tSonnet Labs Inc.\n88:5F:E8:40:00:00/28\tBeijing laiwei Technology  Co.,Ltd\n88:5F:E8:50:00:00/28\tHauch & Bach ApS\n88:5F:E8:60:00:00/28\tShenzhen Xin Kingbrand Enterprises Co.,Ltd\n88:5F:E8:70:00:00/28\tRed Technologies, LLC.\n88:5F:E8:80:00:00/28\tChangsha Xiangji-Haidun Technology Co., Ltd\n88:5F:E8:90:00:00/28\tSowee\n88:5F:E8:A0:00:00/28\tLisle Design Ltd\n88:5F:E8:B0:00:00/28\tShenzhen ORVIBO Technology Co., Ltd\n88:5F:E8:C0:00:00/28\tInor Process AB\n88:5F:E8:D0:00:00/28\tzhejiang yuanwang communication technolgy co.,ltd\n88:5F:E8:E0:00:00/28\tUnicom Global, Inc.\n88:60:76\t\tSparnex n.v.\n88:60:78\t\tSparnex n.v.\n88:61:5A\t\tSiano Mobile Silicon Ltd.\n88:62:5D\t\tBitnetworks Co.,Ltd\n88:63:C5\t\tHuawei Technologies Co.,Ltd\n88:63:DF\t\tApple, Inc.\n88:64:40\t\tApple, Inc.\n88:65:9F\t\tFiberhome Telecommunication Technologies Co.,LTD\n88:66:39\t\tHuawei Technologies Co.,Ltd\n88:66:5A\t\tApple, Inc.\n88:66:A5\t\tApple, Inc.\n88:67:46\t\teero inc.\n88:67:DC\t\tHuawei Technologies Co.,Ltd\n88:68:4B\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n88:68:5C\t\tShenzhen ChuangDao & Perpetual Eternal Technology Co.,Ltd\n88:69:3D\t\tHuawei Technologies Co.,Ltd\n88:6A:B1\t\tvivo Mobile Communication Co., Ltd.\n88:6A:E3\t\tAlpha Networks Inc.\n88:6B:0F\t\tBluegiga Technologies OY\n88:6B:44\t\tSunnovo International Limited\n88:6B:6E\t\tApple, Inc.\n88:6B:76\t\tChina Hopeful Group Hopeful Electric Co.,Ltd\n88:6B:DB\t\tApple, Inc.\n88:6C:60\t\tXiaomi Communications Co Ltd\n88:6D:2D\t\tHuawei Device Co., Ltd.\n88:6E:DD\t\tMicronet union Technology(Chengdu)Co., Ltd.\n88:6E:E1\t\tErbe Elektromedizin GmbH\n88:6E:EB\t\tHuawei Technologies Co.,Ltd\n88:6F:29\t\tPocketbook International SA\n88:6F:D4\t\tDell Inc.\n88:70:33\t\tHangzhou Silan Microelectronic Inc\n88:70:8C\t\tLenovo Mobile Communication Technology Ltd.\n88:70:EF\t\tSC Professional Trading Co., Ltd.\n88:71:B1\t\tCommscope\n88:71:E5\t\tAmazon Technologies Inc.\n88:73:84\t\tToshiba\n88:73:98\t\tK2E Tekpoint\n88:74:77\t\tHuawei Technologies Co.,Ltd\n88:75:56\t\tCisco Systems, Inc\n88:75:98\t\tSamsung Electronics Co.,Ltd\n88:76:B9\t\tD-Link Corporation\n88:78:73\t\tIntel Corporate\n88:78:9C\t\tGame Technologies SA\n88:79:5B\t\tKonka Group Co., Ltd.\n88:79:7E\t\tMotorola Mobility LLC, a Lenovo Company\n88:7A:31\t\tVelankani Electronics Pvt. Ltd.\n88:7A:BC\t\tCisco Systems, Inc\n88:7B:2C\t\tzte corporation\n88:7E:25\t\tExtreme Networks Headquarters\n88:7F:03\t\tComper Technology Investment Limited\n88:7F:D5\t\tzte corporation\n88:81:87\t\tUmeox Innovations Co.,Ltd\n88:81:B9\t\tHuawei Device Co., Ltd.\n88:82:79\t\tShenzhen RB-LINK Intelligent Technology Co.Ltd\n88:83:22\t\tSamsung Electronics Co.,Ltd\n88:83:5D\t\tFn-Link Technology Limited\n88:86:03\t\tHuawei Technologies Co.,Ltd\n88:86:A0\t\tSimton Technologies, Ltd.\n88:86:C2\t\tSTABILO International GmbH\n88:87:17\t\tCanon Inc.\n88:87:DD\t\tDarbeeVision Inc.\n88:89:14\t\tAll Components Incorporated\n88:89:2F\t\tHuawei Technologies Co.,Ltd\n88:89:64\t\tGSI Electronics Inc.\n88:8B:5D\t\tStorage Appliance Corporation\n88:8C:19\t\tBrady Corp Asia Pacific Ltd\n88:8C:1B\t\tEM Microelectronic\n88:8E:68\t\tHuawei Device Co., Ltd.\n88:8E:7F\t\tAtop Corporation\n88:8F:10\t\tShenzhen Max Infinite Technology Co.,Ltd.\n88:8F:A4\t\tHuawei Device Co., Ltd.\n88:90:09\t\tJuniper Networks\n88:90:8D\t\tCisco Systems, Inc\n88:91:66\t\tViewcooper Corp.\n88:91:DD\t\tRacktivity\n88:92:CC\t\tTonly Technology Co. Ltd\n88:94:71\t\tBrocade Communications Systems LLC\n88:94:7E\t\tFiberhome Telecommunication Technologies Co.,LTD\n88:94:8E\t\tMax Weishaupt SE\n88:94:8F\t\tXi'an Zhisensor Technologies Co.,Ltd\n88:94:F9\t\tGemicom Technology, Inc.\n88:95:B9\t\tUnified Packet Systems Crop\n88:96:4E\t\tCommscope\n88:96:55\t\tZitte corporation\n88:96:76\t\tTTC MARCONI s.r.o.\n88:96:B6\t\tGlobal Fire Equipment S.A.\n88:96:F2\t\tValeo Schalter und Sensoren GmbH\n88:97:46\t\tSichuan AI-Link Technology Co., Ltd.\n88:97:65\t\texands\n88:97:DF\t\tEntrypass Corporation Sdn. Bhd.\n88:98:21\t\tTeraon\n88:9A:FF\t\tSystemX Co.,Ltd.\n88:9B:39\t\tSamsung Electronics Co.,Ltd\n88:9C:A6\t\tBTB Korea INC\n88:9C:AD\t\tCisco Systems, Inc\n88:9D:98\t\tAllied-telesisK.K.\n88:9E:33\t\tTCT mobile ltd\n88:9E:68\t\tVantiva USA LLC\n88:9E:96\t\tzte corporation\n88:9F:6F\t\tSamsung Electronics Co.,Ltd\n88:9F:AA\t\tHella Gutmann Solutions GmbH\n88:9F:FA\t\tHon Hai Precision Ind. Co.,Ltd.\n88:A0:84\t\tFormation Data Systems\n88:A0:BE\t\tHuawei Technologies Co.,Ltd\n88:A2:5E\t\tJuniper Networks\n88:A2:9E\t\tRaspberry Pi (Trading) Ltd\n88:A2:D7\t\tHuawei Technologies Co.,Ltd\n88:A3:03\t\tSamsung Electronics Co.,Ltd\n88:A3:CC\t\tAmatis Controls\n88:A4:79\t\tApple, Inc.\n88:A4:C2\t\tLCFC(Hefei) Electronics Technology co., ltd\n88:A5:BD\t\tQpcom Inc.\n88:A6:C6\t\tSagemcom Broadband SAS\n88:A6:EF\t\tIEEE Registration Authority\n88:A6:EF:00:00:00/28\tEnerget LLC\n88:A6:EF:10:00:00/28\tShenzhen YAKO Automation Technology Co.,Ltd.\n88:A6:EF:20:00:00/28\tMetro Electronics\n88:A6:EF:30:00:00/28\tEnlaps\n88:A6:EF:40:00:00/28\tPT communication Systems Pvt LTD\n88:A6:EF:50:00:00/28\tLabpano Technology (Changzhou) Co., Ltd.\n88:A6:EF:60:00:00/28\tShenZhen KZIot Technology LLC.\n88:A6:EF:70:00:00/28\tTruwin\n88:A6:EF:80:00:00/28\tTechPLEX Inc.\n88:A6:EF:90:00:00/28\tKii Audio GmbH\n88:A6:EF:A0:00:00/28\tDraper, Inc.\n88:A6:EF:B0:00:00/28\tBeijing ThinRedline Technology Co.,Ltd.\n88:A6:EF:C0:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n88:A6:EF:D0:00:00/28\tHash Mining s.r.o.\n88:A6:EF:E0:00:00/28\tIONA Tech\n88:A7:3C\t\tRagentek Technology Group\n88:A9:A7\t\tIEEE Registration Authority\n88:A9:A7:00:00:00/28\tShenzhenshi kechuangzhixian technology Co.LTD\n88:A9:A7:10:00:00/28\tSolaredge LTD.\n88:A9:A7:20:00:00/28\tHoneywell spol. s.r.o. HTS CZ o.z.\n88:A9:A7:30:00:00/28\tMikroelektronika\n88:A9:A7:40:00:00/28\tThomas & Darden, Inc\n88:A9:A7:50:00:00/28\tVolterman Inc.\n88:A9:A7:60:00:00/28\tSieper Lüdenscheid GmbH & Co. KG\n88:A9:A7:70:00:00/28\tkimura giken corporation\n88:A9:A7:80:00:00/28\tpsb intralogistics GmbH\n88:A9:A7:90:00:00/28\tFlashForge Corporation\n88:A9:A7:A0:00:00/28\tZhejiang Haoteng Electronic Technology Co.,Ltd.\n88:A9:A7:B0:00:00/28\tTwk-Elektronik\n88:A9:A7:C0:00:00/28\tAndroVideo Inc.\n88:A9:A7:D0:00:00/28\tAvlink Industrial Co., Ltd\n88:A9:A7:E0:00:00/28\tImpact Distribution\n88:A9:B7\t\tApple, Inc.\n88:AC:9E\t\tShenzhen YOUHUA Technology Co., Ltd\n88:AC:C0\t\tZyxel Communications Corporation\n88:AC:C1\t\tGeneriton Co., Ltd.\n88:AD:43\t\tPegatron Corporation\n88:AD:D2\t\tSamsung Electronics Co.,Ltd\n88:AE:07\t\tApple, Inc.\n88:AE:1D\t\tCompal Information (Kunshan) Co., Ltd.\n88:AE:35\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n88:AE:DD\t\tEliteGroup Computer Systems Co., LTD\n88:AF:7B\t\tNanjing Powercore Tech Co.,Ltd\n88:B1:11\t\tIntel Corporate\n88:B1:68\t\tDelta Control GmbH\n88:B1:E1\t\tMojo Networks, Inc.\n88:B2:91\t\tApple, Inc.\n88:B2:AB\t\tFiberhome Telecommunication Technologies Co.,LTD\n88:B3:62\t\tNokia Shanghai Bell Co., Ltd.\n88:B4:36\t\tFUJIFILM Corporation\n88:B4:A6\t\tMotorola Mobility LLC, a Lenovo Company\n88:B4:BE\t\tHuawei Technologies Co.,Ltd\n88:B5:FF\t\tShenzhen iComm Semiconductor CO.,LTD\n88:B6:27\t\tGembird Europe BV\n88:B6:6B\t\teasynetworks\n88:B6:BD\t\tFlaircomm Microelectronics, Inc.\n88:B6:EE\t\tDish Technologies Corp\n88:B7:EB\t\tApple, Inc.\n88:B8:63\t\tHisense Visual Technology Co.,Ltd\n88:B8:6F\t\tInfinix mobility limited\n88:B8:D0\t\tDongguan Koppo Electronic Co.,Ltd\n88:B9:45\t\tApple, Inc.\n88:B9:51\t\tXiaomi Communications Co Ltd\n88:BA:7F\t\tQfiednet Co., Ltd.\n88:BC:AC\t\tZebra Technologies Inc.\n88:BC:C1\t\tHuawei Technologies Co.,Ltd\n88:BD:09\t\tNetis Technology Co., Ltd.\n88:BD:45\t\tSamsung Electronics Co.,Ltd\n88:BD:78\t\tFlaircomm Microelectronics,Inc.\n88:BF:35\t\tVerifone, Inc.\n88:BF:D5\t\tSimple Audio Ltd\n88:BF:E4\t\tHuawei Technologies Co.,Ltd\n88:C0:8B\t\tApple, Inc.\n88:C1:74\t\tzte corporation\n88:C2:27\t\tHuawei Technologies Co.,Ltd\n88:C2:42\t\tPoynt Co.\n88:C2:55\t\tTexas Instruments\n88:C3:6E\t\tBeijing Ereneben lnformation Technology Limited\n88:C3:97\t\tBeijing Xiaomi Mobile Software Co., Ltd\n88:C3:B3\t\tSovico\n88:C3:E5\t\tBetop Techonologies\n88:C4:8E\t\tUneeviu Technologies India Private Limited\n88:C6:26\t\tLogitech, Inc\n88:C6:63\t\tApple, Inc.\n88:C6:E8\t\tHuawei Technologies Co.,Ltd\n88:C7:8F\t\tzte corporation\n88:C9:B3\t\tIEEE Registration Authority\n88:C9:B3:00:00:00/28\tAdopt Nettech Pvt Ltd\n88:C9:B3:10:00:00/28\tCervoz Technology Co; Ltd.\n88:C9:B3:20:00:00/28\tshenzhen franklin ESS technology CO.,Ltd\n88:C9:B3:30:00:00/28\tFortive Setra-ICG(Tianjin)Co.,Ltd\n88:C9:B3:40:00:00/28\tHasbro Inc\n88:C9:B3:50:00:00/28\tBrabender Technologie GmbH & Co, KG\n88:C9:B3:60:00:00/28\tHugo Techno\n88:C9:B3:70:00:00/28\tRobert Bosch JuP1\n88:C9:B3:80:00:00/28\tDivelbiss Corporation\n88:C9:B3:90:00:00/28\tRichbeam (Beijing) Technology Co., Ltd.\n88:C9:B3:A0:00:00/28\tWeg Automation Europe S.R.L.\n88:C9:B3:B0:00:00/28\tShenzhen MMUI Co.,Ltd\n88:C9:B3:C0:00:00/28\tShenzhen Viewsmart Technology Co.,Ltd\n88:C9:B3:D0:00:00/28\tOrigins Technology Limited\n88:C9:B3:E0:00:00/28\tSercomm Corporation.\n88:C9:D0\t\tLG Electronics (Mobile Communications)\n88:C9:E8\t\tSony Corporation\n88:CB:87\t\tApple, Inc.\n88:CB:A5\t\tSuzhou Torchstar Intelligent Technology Co.,Ltd\n88:CC:45\t\tSkyworth Digital Technology(Shenzhen) Co.,Ltd\n88:CE:3F\t\tHuawei Technologies Co.,Ltd\n88:CE:FA\t\tHuawei Technologies Co.,Ltd\n88:CF:98\t\tHuawei Technologies Co.,Ltd\n88:CF:CD\t\tTexas Instruments\n88:D0:39\t\tTonly Technology Co. Ltd\n88:D1:71\t\tBeghelli S.P.A\n88:D1:99\t\tVencer Co., Ltd.\n88:D2:11\t\tEko Devices, Inc.\n88:D2:74\t\tzte corporation\n88:D2:BF\t\tGerman Autolabs\n88:D3:7B\t\tFirmTek, LLC\n88:D5:0C\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n88:D5:46\t\tApple, Inc.\n88:D5:A8\t\tItel Mobile Limited\n88:D6:52\t\tAMERGINT Technologies\n88:D7:BC\t\tDEP Company\n88:D7:F6\t\tASUSTek COMPUTER INC.\n88:D8:2E\t\tIntel Corporate\n88:D9:62\t\tCanopus Systems US LLC\n88:D9:8F\t\tJuniper Networks\n88:DA:04\t\tHuawei Technologies Co.,Ltd\n88:DA:18\t\tChina Mobile Group Device Co.,Ltd.\n88:DA:1A\t\tRedpine Signals, Inc.\n88:DA:33\t\tBeijing Xiaoyuer Network Technology Co., Ltd\n88:DA:36\t\tCalix Inc.\n88:DC:96\t\tEnGenius Technologies, Inc.\n88:DD:79\t\tVoltaire\n88:DD:B8\t\tHuawei Device Co., Ltd.\n88:DE:39\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n88:DE:7C\t\tAskey Computer Corp\n88:DE:A9\t\tRoku, Inc.\n88:DF:9E\t\tNew H3C Technologies Co., Ltd\n88:E0:34\t\tShinwa industries(China) ltd.\n88:E0:56\t\tHuawei Technologies Co.,Ltd\n88:E0:A0\t\tShenzhen VisionSTOR Technologies Co., Ltd\n88:E0:F3\t\tJuniper Networks\n88:E1:61\t\tArt Beijing Science and Technology Development Co., Ltd.\n88:E3:AB\t\tHuawei Technologies Co.,Ltd\n88:E6:03\t\tAvotek corporation\n88:E6:28\t\tShenzhen Kezhonglong Optoelectronic Technology Co.,Ltd\n88:E6:4B\t\tJuniper Networks\n88:E7:12\t\tWhirlpool Corporation\n88:E7:A6\t\tiKnowledge Integration Corp.\n88:E8:7F\t\tApple, Inc.\n88:E8:F8\t\tYong Tai Electronic (Dongguan) Ltd.\n88:E9:0F\t\tinnomdlelab\n88:E9:17\t\tTamaggo\n88:E9:A4\t\tHewlett Packard Enterprise\n88:E9:FE\t\tApple, Inc.\n88:ED:1C\t\tCudo Communication Co., Ltd.\n88:EF:16\t\tCommscope\n88:F0:0F\t\tMiraeil\n88:F0:31\t\tCisco Systems, Inc\n88:F0:77\t\tCisco Systems, Inc\n88:F2:BD\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n88:F4:88\t\tcellon communications technology(shenzhen)Co.,Ltd.\n88:F4:90\t\tJetmobile Pte Ltd\n88:F4:DA\t\tIntel Corporate\n88:F5:6E\t\tHuawei Technologies Co.,Ltd\n88:F6:DC\t\tHuawei Device Co., Ltd.\n88:F7:15\t\tArista Networks\n88:F7:BF\t\tvivo Mobile Communication Co., Ltd.\n88:F7:C7\t\tVantiva USA LLC\n88:F8:72\t\tHuawei Technologies Co.,Ltd\n88:F9:16\t\tQingdao Dayu Dance Digital Technology Co.,Ltd\n88:FC:5D\t\tCisco Systems, Inc\n88:FC:A6\t\tdevolo AG\n88:FD:15\t\tLineeye Co., Ltd\n88:FE:D6\t\tShangHai WangYong Software Co., Ltd.\n8A:00:B0\t\tEoptolink Technology Inc. Ltd,\n8A:07:75\t\tHorys Technologies Llc\n8A:0A:F7\t\tMontage Technology Co,.LTD\n8A:34:BC\t\tFiberworks AS\n8A:4F:8B\t\tIrdeto\n8A:7D:B3\t\tEvolv Technology, Inc.\n8A:85:2E\t\tKampr Systems\n8A:94:AD\t\tNexgen A/S\n8A:A5:C1\t\tRanovus USA\n8A:B3:DA\t\tHomePlug Powerline Alliance, Inc.\n8A:C7:2E\t\tRoku, Inc.\n8A:CB:A4\t\tResideo\n8A:D2:0F\t\tPro Optix AB\n8A:D8:5E\t\tGigaIO Networks, Inc.\n8A:DA:26\t\tEleven Inc.\n8A:FB:16\t\tTeraByte, Inc.\n8C:00:6D\t\tApple, Inc.\n8C:01:9D\t\tArista Networks\n8C:02:CD\t\tFujian Star-Net Communication Co.,Ltd\n8C:02:FA\t\tCOMMANDO Networks Limited\n8C:04:BA\t\tDell Inc.\n8C:04:FF\t\tVantiva USA LLC\n8C:05:51\t\tKoubachi AG\n8C:05:72\t\tHuawei Device Co., Ltd.\n8C:06:CB\t\tToradex AG\n8C:07:34\t\tPrivate\n8C:07:8C\t\tFlow Data Inc\n8C:08:79\t\tTexas Instruments\n8C:08:8B\t\tRemote Solution\n8C:08:AA\t\tApple, Inc.\n8C:09:F4\t\tCommscope\n8C:0C:87\t\tNokia\n8C:0C:90\t\tRuckus Wireless\n8C:0C:A3\t\tAmper\n8C:0D:76\t\tHuawei Technologies Co.,Ltd\n8C:0D:D9\t\tSkullcandy\n8C:0E:60\t\tNanjing Juplink Intelligent Technologies Co., Ltd.\n8C:0E:E3\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n8C:0F:6F\t\tPegatron Corporation\n8C:0F:83\t\tAngie Hospitality LLC\n8C:0F:A0\t\tdi-soric GmbH & Co. KG\n8C:0F:C9\t\tHuawei Device Co., Ltd.\n8C:0F:FA\t\tHutec co.,ltd\n8C:10:D4\t\tSagemcom Broadband SAS\n8C:11:CB\t\tABUS Security-Center GmbH & Co. KG\n8C:12:C2\t\tGLBB Japan\n8C:13:E2\t\tNetlink Ict\n8C:14:7D\t\tIEEE Registration Authority\n8C:14:7D:00:00:00/28\tNio\n8C:14:7D:10:00:00/28\tPrivate\n8C:14:7D:20:00:00/28\tAgilent S.p.A\n8C:14:7D:30:00:00/28\tRemotec Technology Limited\n8C:14:7D:40:00:00/28\tNanjing bilian information Technology Co.,Ltd.\n8C:14:7D:50:00:00/28\tUnwired Networks\n8C:14:7D:60:00:00/28\tShenzhen Meidou Technology Co, Ltd.\n8C:14:7D:70:00:00/28\tUrbanHello\n8C:14:7D:80:00:00/28\tV2 S.p.A.\n8C:14:7D:90:00:00/28\tAnyware Solutions ApS\n8C:14:7D:A0:00:00/28\tBluemega Document & Print Services\n8C:14:7D:B0:00:00/28\tBausch Datacom NV/SA\n8C:14:7D:C0:00:00/28\tReynaers Aluminium\n8C:14:7D:D0:00:00/28\tShenzhen  Lanxus  technology Co. Ltd.\n8C:14:7D:E0:00:00/28\tElectrical & Automation Larsen & Toubro Limited\n8C:14:B4\t\tzte corporation\n8C:15:53\t\tBeijing Memblaze Technology Co Ltd\n8C:15:C7\t\tHuawei Technologies Co.,Ltd\n8C:16:45\t\tLCFC(Hefei) Electronics Technology co., ltd\n8C:17:59\t\tIntel Corporate\n8C:17:B6\t\tHuawei Device Co., Ltd.\n8C:18:50\t\tChina Mobile (Hangzhou) Information Technology Co., Ltd.\n8C:18:D9\t\tShenzhen RF Technology Co., Ltd\n8C:19:2D\t\tIEEE Registration Authority\n8C:19:2D:00:00:00/28\tNoritsu Precision Co., Ltd.\n8C:19:2D:10:00:00/28\tShenzhen Huanuo Internet Technology Co.,Ltd\n8C:19:2D:20:00:00/28\tDataRemote Inc.\n8C:19:2D:30:00:00/28\tGreenfield Technology\n8C:19:2D:40:00:00/28\tCharmlink Tech(HK) Co.,Limited\n8C:19:2D:50:00:00/28\tElco(Tianjin)Electronics Co.,Ltd.\n8C:19:2D:60:00:00/28\tsmartHome Partner GmbH\n8C:19:2D:70:00:00/28\tSrett\n8C:19:2D:80:00:00/28\tShenzhen Cylan Technology Co.,Ltd\n8C:19:2D:90:00:00/28\tViaWear, Inc.\n8C:19:2D:A0:00:00/28\tTeleAlarm SA\n8C:19:2D:B0:00:00/28\tAbside Networks, Inc.\n8C:19:2D:C0:00:00/28\tYou Zhengcheng co.,ltd\n8C:19:2D:D0:00:00/28\tPyras Technology Inc.\n8C:19:2D:E0:00:00/28\tElcon AB\n8C:19:B5\t\tArcadyan Corporation\n8C:1A:50\t\tChina Mobile Group Device Co.,Ltd.\n8C:1A:BF\t\tSamsung Electronics Co.,Ltd\n8C:1A:F3\t\tShenzhen Gooxi Information Security CO.,Ltd.\n8C:1C:DA\t\tIEEE Registration Authority\n8C:1C:DA:00:00:00/28\tCEOS Pty Ltd\n8C:1C:DA:10:00:00/28\tGESAS GmbH\n8C:1C:DA:20:00:00/28\tGeomc\n8C:1C:DA:30:00:00/28\tStructura Technology & Innovation\n8C:1C:DA:40:00:00/28\tAnntec （Beijing） Technology Co.,Ltd.\n8C:1C:DA:50:00:00/28\tSeptentrio NV\n8C:1C:DA:60:00:00/28\tLocoLabs LLC\n8C:1C:DA:70:00:00/28\tK Technology Corporation\n8C:1C:DA:80:00:00/28\tAtol Llc\n8C:1C:DA:90:00:00/28\tRaychem RPG PVT. LTD.\n8C:1C:DA:A0:00:00/28\tChina Potevio Co., Ltd\n8C:1C:DA:B0:00:00/28\tT+A elektroakustik GmbH & Co.KG\n8C:1C:DA:C0:00:00/28\tAlcidae Inc\n8C:1C:DA:D0:00:00/28\tRiegl Laser Measurement Systems GmbH\n8C:1C:DA:E0:00:00/28\tElectronic Controlled Systems, Inc.\n8C:1D:55\t\tHanwha NxMD (Thailand) Co., Ltd.\n8C:1D:96\t\tIntel Corporate\n8C:1E:80\t\tCisco Systems, Inc\n8C:1E:CB\t\tNanjing Jiahao Technology Co., Ltd.\n8C:1E:CF\t\tUnionman Technology Co.,Ltd\n8C:1E:D9\t\tBeijing Unigroup Tsingteng Microsystem Co., LTD.\n8C:1F:64\t\tIEEE Registration Authority\n8C:1F:64:00:00:00/36\tSuzhou Xingxiangyi Precision Manufacturing Co.,Ltd.\n8C:1F:64:00:10:00/36\tHYFIX Spatial Intelligence\n8C:1F:64:00:30:00/36\tBrighten Controls LLP\n8C:1F:64:00:60:00/36\tDunasys Ingenierie\n8C:1F:64:00:90:00/36\tConverging Systems Inc.\n8C:1F:64:00:A0:00/36\tTaskUnite Inc. (dba AMPAworks)\n8C:1F:64:00:C0:00/36\tGuan Show Technologe Co., Ltd.\n8C:1F:64:00:D0:00/36\tT4I Sp. z o.o.\n8C:1F:64:01:10:00/36\tDEUTA-WERKE GmbH\n8C:1F:64:01:40:00/36\tCristal Controles Ltee\n8C:1F:64:01:60:00/36\tSigntel Communications Pvt Ltd\n8C:1F:64:01:70:00/36\tFarmote Limited\n8C:1F:64:01:80:00/36\tRax-Tech International\n8C:1F:64:01:A0:00/36\tParagraf\n8C:1F:64:01:D0:00/36\tNordson Corporation\n8C:1F:64:01:E0:00/36\tSCIREQ Scientific Respiratory Equipment  Inc\n8C:1F:64:02:00:00/36\tUtthunga Techologies Pvt Ltd\n8C:1F:64:02:10:00/36\tSavant Group\n8C:1F:64:02:20:00/36\tTelica Telecom Private Limited\n8C:1F:64:02:40:00/36\tShin Nihon Denshi Co., Ltd.\n8C:1F:64:02:50:00/36\tSMITEC S.p.A.\n8C:1F:64:02:80:00/36\teyrise B.V.\n8C:1F:64:02:90:00/36\tHunan Shengyun Photoelectric Technology Co.,LTD\n8C:1F:64:02:F0:00/36\tSOLIDpower SpA\n8C:1F:64:03:10:00/36\tEktos A/S\n8C:1F:64:03:30:00/36\tIQ Home Kft.\n8C:1F:64:03:50:00/36\tRealWear\n8C:1F:64:03:A0:00/36\tOrion Computers\n8C:1F:64:03:B0:00/36\tOrion Power Systems, Inc.\n8C:1F:64:03:C0:00/36\tSona Business B.V.\n8C:1F:64:03:D0:00/36\tHorizon.Inc\n8C:1F:64:04:20:00/36\tHeitec Ag\n8C:1F:64:04:30:00/36\tAperNet, LLC\n8C:1F:64:04:50:00/36\tVeilux Inc.\n8C:1F:64:04:60:00/36\tAmerican Fullway Corp.\n8C:1F:64:04:80:00/36\tFieldLine Medical\n8C:1F:64:04:90:00/36\tNuances Org\n8C:1F:64:04:A0:00/36\tGS Elektromedizinsiche Geräte G. Stemple GmbH\n8C:1F:64:04:C0:00/36\tGamber-Johnson LLC\n8C:1F:64:04:E0:00/36\tAuditdata\n8C:1F:64:04:F0:00/36\tISILINE srl\n8C:1F:64:05:10:00/36\tCP contech electronic GmbH\n8C:1F:64:05:30:00/36\tHS.com Kft\n8C:1F:64:05:40:00/36\tWatter\n8C:1F:64:05:50:00/36\tIntercreate\n8C:1F:64:05:60:00/36\tDong Guan Yung Fu Electronics Ltd.\n8C:1F:64:05:70:00/36\tShenzhen Broadradio RFID Technology Co., Ltd\n8C:1F:64:05:80:00/36\tMect Srl\n8C:1F:64:05:90:00/36\tMB connect line GmbH Fernwartungssysteme\n8C:1F:64:05:C0:00/36\ttickIoT Inc.\n8C:1F:64:05:F0:00/36\tESCAD AUTOMATION GmbH\n8C:1F:64:06:00:00/36\tZadar Labs Inc\n8C:1F:64:06:10:00/36\tMicron Systems\n8C:1F:64:06:20:00/36\tAton Green Storage Spa\n8C:1F:64:06:30:00/36\tEfftronics Systems (P) Ltd\n8C:1F:64:06:60:00/36\tSiemens Energy Global GmbH & Co. KG\n8C:1F:64:06:70:00/36\tGenius Vision Digital Private Limited\n8C:1F:64:06:80:00/36\tShenzhen ROLSTONE Technology Co., Ltd\n8C:1F:64:06:A0:00/36\tIntellisense Systems Inc.\n8C:1F:64:06:B0:00/36\tSanwa Supply Inc.\n8C:1F:64:06:C0:00/36\tCOBES GmbH\n8C:1F:64:06:D0:00/36\tMonnit Corporation\n8C:1F:64:07:10:00/36\tDorlet Sau\n8C:1F:64:07:20:00/36\tEyecloud, Inc\n8C:1F:64:07:30:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:07:60:00/36\tPack'R\n8C:1F:64:07:70:00/36\tEngage Technologies\n8C:1F:64:07:A0:00/36\tFlextronics International Kft\n8C:1F:64:07:D0:00/36\tTalleres de Escoriaza SAU\n8C:1F:64:07:E0:00/36\tFLOYD inc.\n8C:1F:64:07:F0:00/36\tG.S.D Group Inc.\n8C:1F:64:08:00:00/36\tTwinleaf LLC\n8C:1F:64:08:10:00/36\tHarmony Fire Ltd\n8C:1F:64:08:20:00/36\tZhongcheng Technology Co.,Ltd\n8C:1F:64:08:30:00/36\tAvionica\n8C:1F:64:08:50:00/36\tSorb Engineering Llc\n8C:1F:64:08:60:00/36\tWEPTECH elektronik GmbH\n8C:1F:64:08:90:00/36\tAnser-Net Co ., Ltd\n8C:1F:64:08:B0:00/36\tShanghai Shenxu Technology Co., Ltd\n8C:1F:64:08:C0:00/36\teviateg GmbH\n8C:1F:64:08:D0:00/36\tNeetra Srl Sb\n8C:1F:64:08:E0:00/36\tqiio AG\n8C:1F:64:08:F0:00/36\tAixControl GmbH\n8C:1F:64:09:00:00/36\tkousyuhaneturen\n8C:1F:64:09:10:00/36\tLimitless Electromechanical Works LLC\n8C:1F:64:09:20:00/36\tGogo BA\n8C:1F:64:09:30:00/36\tMAG Audio LLC\n8C:1F:64:09:40:00/36\tEl.En. Spa\n8C:1F:64:09:60:00/36\tIPCOMM GmbH\n8C:1F:64:09:70:00/36\tFoMa Systems GmbH\n8C:1F:64:09:80:00/36\tAgvolution GmbH\n8C:1F:64:09:90:00/36\tPantherun Technologies Pvt Ltd\n8C:1F:64:09:B0:00/36\tTaiv\n8C:1F:64:09:D0:00/36\tFlextronics International Kft\n8C:1F:64:09:E0:00/36\tIWS Global Pty Ltd\n8C:1F:64:09:F0:00/36\tMB connect line GmbH Fernwartungssysteme\n8C:1F:64:0A:00:00/36\tTechniwave\n8C:1F:64:0A:40:00/36\tDynamic Research, Inc.\n8C:1F:64:0A:50:00/36\tGomero Nordic AB\n8C:1F:64:0A:80:00/36\tSamabaNova Systems\n8C:1F:64:0A:A0:00/36\tDi3 Infotech Llp\n8C:1F:64:0A:B0:00/36\tNorbit ODM AS\n8C:1F:64:0A:C0:00/36\tPatch Technologies, Inc.\n8C:1F:64:0A:D0:00/36\tE2 Nova Corporation\n8C:1F:64:0A:F0:00/36\tForsee Power\n8C:1F:64:0B:00:00/36\tBunka Shutter Co., Ltd.\n8C:1F:64:0B:60:00/36\tLuke Granger-Brown\n8C:1F:64:0B:70:00/36\tTiama\n8C:1F:64:0B:80:00/36\tSignatrol Ltd\n8C:1F:64:0B:90:00/36\tNewin Tech\n8C:1F:64:0B:B0:00/36\tInfraChen Technology Co., Ltd.\n8C:1F:64:0B:D0:00/36\tSolace Systems Inc.\n8C:1F:64:0B:E0:00/36\tBnb\n8C:1F:64:0B:F0:00/36\tAurora Communication Technologies Corp.\n8C:1F:64:0C:00:00/36\tActive Research Limited\n8C:1F:64:0C:30:00/36\tEurek srl\n8C:1F:64:0C:50:00/36\tTechnipFMC\n8C:1F:64:0C:80:00/36\tEA Elektro-Automatik GmbH\n8C:1F:64:0C:A0:00/36\tCLOUD TELECOM Inc.\n8C:1F:64:0C:C0:00/36\tSmart I Electronics Systems Pvt. Ltd.\n8C:1F:64:0C:D0:00/36\tDEUTA Werke GmbH\n8C:1F:64:0C:E0:00/36\tDigitella Inc.\n8C:1F:64:0D:20:00/36\tbiosilver .co.,ltd\n8C:1F:64:0D:30:00/36\terfi Ernst Fischer GmbH+Co.KG\n8C:1F:64:0D:40:00/36\tDalcnet srl\n8C:1F:64:0D:50:00/36\tRealD, Inc.\n8C:1F:64:0D:60:00/36\tAvd Innovation Limited\n8C:1F:64:0D:80:00/36\tPower Electronics Espana, S.L.\n8C:1F:64:0D:F0:00/36\tLeidos\n8C:1F:64:0E:00:00/36\tAutopharma\n8C:1F:64:0E:50:00/36\tRugged Science\n8C:1F:64:0E:60:00/36\tCleanwatts Digital, S.A.\n8C:1F:64:0E:A0:00/36\tSmartSky Networks LLC\n8C:1F:64:0E:D0:00/36\tSaskatchewan Research Council\n8C:1F:64:0E:E0:00/36\tRich Source Precision IND., Co., LTD.\n8C:1F:64:0E:F0:00/36\tDave Srl\n8C:1F:64:0F:00:00/36\tXylon\n8C:1F:64:0F:10:00/36\tideaForge Technology Limited\n8C:1F:64:0F:20:00/36\tGraphimecc Group SRL\n8C:1F:64:0F:30:00/36\tLsi\n8C:1F:64:0F:40:00/36\tAW-SOM Technologies LLC\n8C:1F:64:0F:50:00/36\tVishay Nobel AB\n8C:1F:64:0F:70:00/36\tCombilent\n8C:1F:64:0F:90:00/36\tikan International LLC\n8C:1F:64:0F:A0:00/36\tNautel LTD\n8C:1F:64:0F:E0:00/36\tIndra Heera Technology LLP\n8C:1F:64:0F:F0:00/36\tPneumax Spa\n8C:1F:64:10:00:00/36\tBeijing Zhenlong Technology Co.,Ltd.\n8C:1F:64:10:10:00/36\tASW-ATI Srl\n8C:1F:64:10:30:00/36\tKronotech Srl\n8C:1F:64:10:40:00/36\tTimebeat.app Ltd\n8C:1F:64:10:50:00/36\tAixControl GmbH\n8C:1F:64:10:60:00/36\tWuhan Xingtuxinke ELectronic Co.,Ltd\n8C:1F:64:10:70:00/36\tSCI Technology, Inc.\n8C:1F:64:10:A0:00/36\tSicon srl\n8C:1F:64:10:B0:00/36\tRed Lion Europe GmbH\n8C:1F:64:10:F0:00/36\tScenario Automation\n8C:1F:64:11:00:00/36\tXian Linking Backhaul Telecom Technology Co.,Ltd\n8C:1F:64:11:10:00/36\tIsac Srl\n8C:1F:64:11:30:00/36\tTimberline Manufacturing\n8C:1F:64:11:40:00/36\tSanmina SCI Medical\n8C:1F:64:11:50:00/36\tNeuralog LP\n8C:1F:64:11:60:00/36\tSicon srl\n8C:1F:64:11:70:00/36\tGrossenbacher Systeme AG\n8C:1F:64:11:80:00/36\tAutomata GmbH & Co. KG\n8C:1F:64:11:90:00/36\tFoxconn Technology Co., Ltd.\n8C:1F:64:11:B0:00/36\tPower Electronics Espana, S.L.\n8C:1F:64:11:E0:00/36\tInfosoft Digital Design and Services P L\n8C:1F:64:11:F0:00/36\tNodeUDesign\n8C:1F:64:12:10:00/36\tHefei EverACQ Technology Co., LTD\n8C:1F:64:12:50:00/36\tHangzhou Sciener Smart Technology Co., Ltd.\n8C:1F:64:12:60:00/36\tHarvest Technology Pty Ltd\n8C:1F:64:12:70:00/36\tRetronix Technology Inc.\n8C:1F:64:12:80:00/36\tYulista Integrated Solution\n8C:1F:64:12:90:00/36\tNavtech Radar Ltd.\n8C:1F:64:12:B0:00/36\tBeijing Tongtech Technology Co., Ltd.\n8C:1F:64:12:D0:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:12:E0:00/36\tinomatic GmbH\n8C:1F:64:13:30:00/36\tVtron Pty Ltd\n8C:1F:64:13:50:00/36\tYuval Fichman\n8C:1F:64:13:80:00/36\tVissavi sp. z o.o.\n8C:1F:64:13:C0:00/36\tSiFive Inc\n8C:1F:64:13:E0:00/36\tBtec Industrial Instrument Sdn. Bhd.\n8C:1F:64:13:F0:00/36\tElsist Srl\n8C:1F:64:14:00:00/36\tRF-Tuote Oy\n8C:1F:64:14:10:00/36\tCode Blue Corporation\n8C:1F:64:14:40:00/36\tLangfang ENN lntelligent Technology Co.,Ltd.\n8C:1F:64:14:50:00/36\tSpectrum FiftyNine BV\n8C:1F:64:14:60:00/36\tZhongrun Xinchan (Beijing) Technology Co., Ltd\n8C:1F:64:14:80:00/36\tCarehawk\n8C:1F:64:14:90:00/36\tClock-O-Matic\n8C:1F:64:14:A0:00/36\tRichie Ltd\n8C:1F:64:14:B0:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:14:D0:00/36\tVertesz Elektronika Kft.\n8C:1F:64:14:F0:00/36\tNsm\n8C:1F:64:15:10:00/36\tGogo Business Aviation\n8C:1F:64:15:40:00/36\tFlextronics International Kft\n8C:1F:64:15:50:00/36\tSlat\n8C:1F:64:15:90:00/36\tMediana Co., Ltd.\n8C:1F:64:15:A0:00/36\tASHIDA Electronics Pvt. Ltd\n8C:1F:64:15:C0:00/36\tTron Future Tech Inc.\n8C:1F:64:15:D0:00/36\tNhoa Energy Srl\n8C:1F:64:15:E0:00/36\tDynomotion, Inc\n8C:1F:64:16:40:00/36\tRevo - Tec GmbH\n8C:1F:64:16:60:00/36\tHikari Alphax Inc.\n8C:1F:64:16:90:00/36\tCreative Telecom Pvt. Ltd.\n8C:1F:64:16:A0:00/36\tKeyline S.P.A.\n8C:1F:64:16:B0:00/36\tTKR Spezialwerkzeuge GmbH\n8C:1F:64:16:D0:00/36\tXiamen Rgblink Science & Technology Co., Ltd.\n8C:1F:64:16:E0:00/36\tBenchmark Electronics BV\n8C:1F:64:16:F0:00/36\tCodasip s.r.o.\n8C:1F:64:17:00:00/36\tFracarro Radioindustrie Srl\n8C:1F:64:17:40:00/36\tKST technology\n8C:1F:64:17:50:00/36\tWuhan YiValley Opto-electric technology Co.,Ltd\n8C:1F:64:17:60:00/36\tLeidos Inc\n8C:1F:64:17:70:00/36\tEmcom Systems\n8C:1F:64:17:90:00/36\tAgrowtek Inc.\n8C:1F:64:17:B0:00/36\tBavaria Digital Technik GmbH\n8C:1F:64:17:C0:00/36\tZelp Ltd\n8C:1F:64:17:E0:00/36\tMI Inc.\n8C:1F:64:18:00:00/36\tStructural Integrity Services\n8C:1F:64:18:30:00/36\tNICE Total Cash Management Co., Ltd.\n8C:1F:64:18:50:00/36\tBiotage Gb Ltd\n8C:1F:64:18:60:00/36\tBreas Medical AB\n8C:1F:64:18:70:00/36\tSicon srl\n8C:1F:64:18:B0:00/36\tM-Pulse GmbH & Co.KG\n8C:1F:64:18:E0:00/36\tJ1-LED Intelligent Transport Systems Pty Ltd\n8C:1F:64:19:30:00/36\tSicon srl\n8C:1F:64:19:40:00/36\tTiflex\n8C:1F:64:19:50:00/36\tVERIDAS Digital Authentication Solutions S.L\n8C:1F:64:19:60:00/36\tSecuinfo Co.Ltd\n8C:1F:64:19:70:00/36\tTEKVOX, Inc\n8C:1F:64:19:80:00/36\tReo Ag\n8C:1F:64:19:90:00/36\tShenzhen Arctec Innovation Technology Co.,Ltd\n8C:1F:64:19:B0:00/36\tFeedFlo\n8C:1F:64:19:C0:00/36\tAton srl\n8C:1F:64:1A:00:00/36\tEngage Technologies\n8C:1F:64:1A:50:00/36\tDialtronics Systems Pvt Ltd\n8C:1F:64:1A:70:00/36\taelettronica group srl\n8C:1F:64:1A:80:00/36\tPrivate\n8C:1F:64:1A:D0:00/36\tNexxto Servicos Em Tecnologia da Informacao SA\n8C:1F:64:1A:F0:00/36\tEnviroNode IoT Solutions\n8C:1F:64:1B:10:00/36\tperson-AIz AS\n8C:1F:64:1B:20:00/36\tRapid-e-Engineering Steffen Kramer\n8C:1F:64:1B:50:00/36\tXicato\n8C:1F:64:1B:60:00/36\tRed Sensors Limited\n8C:1F:64:1B:70:00/36\tRax-Tech International\n8C:1F:64:1B:90:00/36\tD.T.S Illuminazione Srl\n8C:1F:64:1B:B0:00/36\tRenwei Electronics Technology (Shenzhen) Co.,LTD.\n8C:1F:64:1B:C0:00/36\tTransit Solutions, LLC.\n8C:1F:64:1B:D0:00/36\tDorlet Sau\n8C:1F:64:1B:E0:00/36\tMideum Eng\n8C:1F:64:1B:F0:00/36\tOssia Inc\n8C:1F:64:1C:00:00/36\tINVENTIA Sp. z o.o.\n8C:1F:64:1C:20:00/36\tSolid Invent Ltda.\n8C:1F:64:1C:90:00/36\tPneumax Spa\n8C:1F:64:1C:A0:00/36\tPower Electronics Espana, S.L.\n8C:1F:64:1C:B0:00/36\tSASYS e.K.\n8C:1F:64:1C:E0:00/36\tEiden Co.,Ltd.\n8C:1F:64:1D:00:00/36\tMB connect line GmbH Fernwartungssysteme\n8C:1F:64:1D:10:00/36\tAS Strömungstechnik GmbH\n8C:1F:64:1D:30:00/36\tOpus-Two ICS\n8C:1F:64:1D:40:00/36\tInteger.pl S.A.\n8C:1F:64:1D:50:00/36\tBeijing Diwei Shuangxing Communication Technology Co., Ltd.\n8C:1F:64:1D:60:00/36\tZhejiang Qian Information & Technologies\n8C:1F:64:1D:70:00/36\tBeanair Sensors\n8C:1F:64:1D:80:00/36\tMesomat inc.\n8C:1F:64:1D:A0:00/36\tChongqing Huaxiu Technology Co.,Ltd\n8C:1F:64:1D:B0:00/36\tCycle GmbH\n8C:1F:64:1D:D0:00/36\tBeijing Shengtongnaan Technology Development Co ., Ltd\n8C:1F:64:1D:E0:00/36\tPower Electronics Espana, S.L.\n8C:1F:64:1E:10:00/36\tVAF Co.\n8C:1F:64:1E:20:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:1E:30:00/36\tWBNet\n8C:1F:64:1E:60:00/36\tRadian Research, Inc.\n8C:1F:64:1E:70:00/36\tCanon Electron Tubes & Devices Co., Ltd.\n8C:1F:64:1E:80:00/36\tHaptech Defense Systems\n8C:1F:64:1E:D0:00/36\tLichtwart GmbH\n8C:1F:64:1E:F0:00/36\tTantronic AG\n8C:1F:64:1F:00:00/36\tAVCOMM Technologies Inc\n8C:1F:64:1F:40:00/36\tEiffage Energie Electronique\n8C:1F:64:1F:50:00/36\tNanoThings Inc.\n8C:1F:64:1F:70:00/36\tSicon srl\n8C:1F:64:1F:90:00/36\tTelecomWadi\n8C:1F:64:1F:C0:00/36\tYu Heng Electric CO. TD\n8C:1F:64:1F:E0:00/36\tBurk Technology\n8C:1F:64:20:10:00/36\tHiwin Mikrosystem Corp.\n8C:1F:64:20:30:00/36\tENTOSS Co.,Ltd\n8C:1F:64:20:40:00/36\tcastcore\n8C:1F:64:20:60:00/36\tKryfs Technologies Private Limited\n8C:1F:64:20:80:00/36\tSichuan AnSphere Technology Co. Ltd.\n8C:1F:64:20:A0:00/36\tOriux\n8C:1F:64:20:C0:00/36\tShanghai Stairmed Technology Co.,ltd\n8C:1F:64:20:D0:00/36\tGrossenbacher Systeme AG\n8C:1F:64:20:E0:00/36\tAlpha Bridge Technologies Private Limited\n8C:1F:64:21:10:00/36\tBipom Electronics, Inc.\n8C:1F:64:21:50:00/36\tXLOGIC srl\n8C:1F:64:21:90:00/36\tGuangzhou Desam Audio Co.,Ltd\n8C:1F:64:21:A0:00/36\tExicom Technologies India Pvt. Ltd.\n8C:1F:64:21:C0:00/36\tLLC \"EMS-Expert\"\n8C:1F:64:21:E0:00/36\tThe Bionetics Corporation\n8C:1F:64:22:10:00/36\tYuansiang Optoelectronics Co.,Ltd.\n8C:1F:64:22:40:00/36\tPHB Eletronica Ltda.\n8C:1F:64:22:70:00/36\tDigilens\n8C:1F:64:22:80:00/36\tShenzhen Chuanxin Micro Technology Co., Ltd\n8C:1F:64:22:D0:00/36\tKaysons Electricals Private Limited\n8C:1F:64:22:E0:00/36\tJide Car Rastreamento e Monitoramento LTDA\n8C:1F:64:23:10:00/36\tShenzhen zhushida Technology lnformation Co.,Ltd\n8C:1F:64:23:20:00/36\tMonnit Corporation\n8C:1F:64:23:50:00/36\tMarson Technology Co., Ltd.\n8C:1F:64:23:70:00/36\tMB connect line GmbH\n8C:1F:64:23:90:00/36\tShekel Scales 2008 Ltd\n8C:1F:64:23:D0:00/36\tMokila Networks Pvt Ltd\n8C:1F:64:23:E0:00/36\tQuantum Blockchains Sp. z o.o.\n8C:1F:64:24:00:00/36\tHuiTong intelligence Company\n8C:1F:64:24:20:00/36\tGiordano Controls Spa\n8C:1F:64:24:40:00/36\tHutchison Drei Austria Gmbh\n8C:1F:64:24:60:00/36\tOriux\n8C:1F:64:24:70:00/36\tDadhwal Weighing Instrument Repairing Works\n8C:1F:64:24:90:00/36\tTex Computer Srl\n8C:1F:64:24:C0:00/36\tShenzhen Link-All Technolgy Co., Ltd\n8C:1F:64:24:D0:00/36\tXi'An Jiaoda Kaida New Technology Co.Ltd\n8C:1F:64:24:E0:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:25:00:00/36\tAccurate Optoelectronics Pvt. Ltd.\n8C:1F:64:25:10:00/36\tWatchdog Systems\n8C:1F:64:25:20:00/36\tTYT Electronics CO., LTD\n8C:1F:64:25:40:00/36\tZhuhai Yunzhou Intelligence Technology Ltd.\n8C:1F:64:25:60:00/36\tLandinger\n8C:1F:64:25:70:00/36\tFour Bars Design\n8C:1F:64:25:A0:00/36\tWuhan Xingtuxinke ELectronic Co.,Ltd\n8C:1F:64:25:C0:00/36\tTimeMachines Inc.\n8C:1F:64:25:E0:00/36\tR2Sonic, LLC\n8C:1F:64:25:F0:00/36\tAcuris Inc\n8C:1F:64:26:00:00/36\tE-alarms\n8C:1F:64:26:10:00/36\tTargaSystem S.r.L.\n8C:1F:64:26:30:00/36\tEPC Power Corporation\n8C:1F:64:26:40:00/36\tBR. Voss Ingenjörsfirma AB\n8C:1F:64:26:70:00/36\tKarl DUNGS GmbH & Co. KG\n8C:1F:64:26:80:00/36\tAstro Machine Corporation\n8C:1F:64:26:90:00/36\tSicon srl\n8C:1F:64:26:B0:00/36\tProfcon AB\n8C:1F:64:26:E0:00/36\tKoizumi Lighting Technology Corp.\n8C:1F:64:26:F0:00/36\tQUISS GmbH\n8C:1F:64:27:00:00/36\tXi‘an Hangguang Satellite and Control Technology Co.,Ltd\n8C:1F:64:27:10:00/36\tWuhan YiValley Opto-electric technology Co.,Ltd\n8C:1F:64:27:20:00/36\tComminent Pvt Ltd\n8C:1F:64:27:30:00/36\tDistran AG\n8C:1F:64:27:40:00/36\tInvixium Access Inc\n8C:1F:64:27:50:00/36\tIDA North America Inc.\n8C:1F:64:27:70:00/36\tShenzhen Angstrom Excellence Technology Co., Ltd\n8C:1F:64:27:B0:00/36\tOriux\n8C:1F:64:27:C0:00/36\tTactical Blue Space Ventures LLC\n8C:1F:64:27:D0:00/36\tPneumax Spa\n8C:1F:64:27:F0:00/36\tWhizz Systems Inc.\n8C:1F:64:28:00:00/36\tHeitec Ag\n8C:1F:64:28:10:00/36\tNvp Teco Ltd\n8C:1F:64:28:60:00/36\ti2s\n8C:1F:64:28:80:00/36\tVision Systems Safety Tech\n8C:1F:64:28:90:00/36\tCraft4 Digital GmbH\n8C:1F:64:28:A0:00/36\tArcopie\n8C:1F:64:28:B0:00/36\tPower Electronics Espana, S.L.\n8C:1F:64:28:C0:00/36\tSakura Seiki Co.,Ltd.\n8C:1F:64:28:D0:00/36\tAVA Monitoring AB\n8C:1F:64:29:10:00/36\tJiangsu Ruidong Electric Power Technology Co.,Ltd\n8C:1F:64:29:20:00/36\tGogo Business Aviation\n8C:1F:64:29:30:00/36\tLandis+Gyr Equipamentos de Medição Ltda\n8C:1F:64:29:40:00/36\tnanoTRONIX Computing Inc.\n8C:1F:64:29:50:00/36\tOphir Manufacturing Solutions Pte Ltd\n8C:1F:64:29:60:00/36\tRoog zhi tong Technology(Beijing) Co.,Ltd\n8C:1F:64:29:70:00/36\tIGEMA GmbH\n8C:1F:64:29:80:00/36\tMegger Germany GmbH\n8C:1F:64:29:90:00/36\tInteger.pl S.A.\n8C:1F:64:29:B0:00/36\tTT electronics integrated manufacturing services (Suzhou) Limited\n8C:1F:64:29:D0:00/36\tAutomata GmbH & Co. KG\n8C:1F:64:29:E0:00/36\tAD Parts, S.L.\n8C:1F:64:29:F0:00/36\tNagtech Llc\n8C:1F:64:2A:00:00/36\tConnected Development\n8C:1F:64:2A:10:00/36\tPantherun Technologies Pvt Ltd\n8C:1F:64:2A:20:00/36\tSerap\n8C:1F:64:2A:30:00/36\tNSK Co.,Ltd.\n8C:1F:64:2A:40:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:2A:50:00/36\tNonet Inc\n8C:1F:64:2A:60:00/36\tRadiation Solutions Inc.\n8C:1F:64:2A:70:00/36\taelettronica group srl\n8C:1F:64:2A:80:00/36\tSHALARM SECURITY Co.,LTD\n8C:1F:64:2A:90:00/36\tElbit Systems of America, LLC\n8C:1F:64:2A:C0:00/36\tDco Systems Ltd\n8C:1F:64:2B:10:00/36\tU -Mei-Dah Int'L Enterprise Co.,Ltd.\n8C:1F:64:2B:40:00/36\tSonel S.A.\n8C:1F:64:2B:60:00/36\tStercom Power Solutions GmbH\n8C:1F:64:2B:80:00/36\tVeinland GmbH\n8C:1F:64:2B:B0:00/36\tChakra Technology Ltd\n8C:1F:64:2B:C0:00/36\tDEUTA Werke GmbH\n8C:1F:64:2B:F0:00/36\tGogo Business Aviation\n8C:1F:64:2C:00:00/36\tTieline Research Pty Ltd\n8C:1F:64:2C:20:00/36\tTex Computer Srl\n8C:1F:64:2C:30:00/36\tTeraDiode / Panasonic\n8C:1F:64:2C:40:00/36\tXylon\n8C:1F:64:2C:50:00/36\tSysn\n8C:1F:64:2C:60:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:2C:70:00/36\tContralto Audio Srl\n8C:1F:64:2C:80:00/36\tBRS Sistemas Eletrônicos\n8C:1F:64:2C:B0:00/36\tSmart Component Technologies Ltd\n8C:1F:64:2C:C0:00/36\tSBS SpA\n8C:1F:64:2C:D0:00/36\tTaiwan Vtron\n8C:1F:64:2C:E0:00/36\tE2 Nova Corporation\n8C:1F:64:2D:00:00/36\tCambridge Research Systems Ltd\n8C:1F:64:2D:50:00/36\tJ&J Philippines Corporation\n8C:1F:64:2D:80:00/36\tCONTROL SYSTEMS Srl\n8C:1F:64:2D:C0:00/36\tTimeMachines Inc.\n8C:1F:64:2D:D0:00/36\tFlextronics International Kft\n8C:1F:64:2D:E0:00/36\tPolar Bear Design\n8C:1F:64:2D:F0:00/36\tUbotica Technologies\n8C:1F:64:2E:20:00/36\tMark Roberts Motion Control\n8C:1F:64:2E:30:00/36\tErba Lachema s.r.o.\n8C:1F:64:2E:40:00/36\tVision Systems Safety Tech\n8C:1F:64:2E:50:00/36\tGS Elektromedizinsiche Geräte G. Stemple GmbH\n8C:1F:64:2E:80:00/36\tSonora Network Solutions\n8C:1F:64:2E:C0:00/36\tHD Vision Systems GmbH\n8C:1F:64:2E:E0:00/36\tQualitrol LLC\n8C:1F:64:2E:F0:00/36\tInvisense AB\n8C:1F:64:2F:00:00/36\tSwitch Science, Inc.\n8C:1F:64:2F:10:00/36\tDEUTA Werke GmbH\n8C:1F:64:2F:20:00/36\tEnless Wireless\n8C:1F:64:2F:40:00/36\tScame Sistemi srl\n8C:1F:64:2F:50:00/36\tFlorida R&D Associates LLC\n8C:1F:64:2F:90:00/36\tTSS COMPANY s.r.o.\n8C:1F:64:2F:A0:00/36\tRfengine Co., Ltd.\n8C:1F:64:2F:B0:00/36\tMB connect line GmbH Fernwartungssysteme\n8C:1F:64:2F:C0:00/36\tUnimar, Inc.\n8C:1F:64:2F:D0:00/36\tEnestone Corporation\n8C:1F:64:2F:E0:00/36\tVERSITRON, Inc.\n8C:1F:64:30:00:00/36\tAbbott Diagnostics Technologies AS\n8C:1F:64:30:10:00/36\tAgar Corporation Inc.\n8C:1F:64:30:30:00/36\tIntelliPlanner Software System India Pvt Ltd\n8C:1F:64:30:40:00/36\tJemac Sweden AB\n8C:1F:64:30:60:00/36\tCorigine,Inc.\n8C:1F:64:30:90:00/36\tMect Srl\n8C:1F:64:30:A0:00/36\tXCOM Labs\n8C:1F:64:30:C0:00/36\tNarnix Edge Pvt. Ltd.\n8C:1F:64:30:D0:00/36\tFlextronics International Kft\n8C:1F:64:30:E0:00/36\tTangent Design Engineering\n8C:1F:64:30:F0:00/36\tEast Photonics\n8C:1F:64:31:30:00/36\tSb-Group Ltd\n8C:1F:64:31:40:00/36\tCedel BV\n8C:1F:64:31:60:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:31:70:00/36\tBacancy Systems LLP\n8C:1F:64:31:90:00/36\tExato Company\n8C:1F:64:31:A0:00/36\tAsiga Pty Ltd\n8C:1F:64:31:B0:00/36\tjoint analytical systems GmbH\n8C:1F:64:31:C0:00/36\tAccumetrics\n8C:1F:64:31:F0:00/36\tSTV Electronic GmbH\n8C:1F:64:32:40:00/36\tKinetic Technologies\n8C:1F:64:32:70:00/36\tDeutescher Wetterdienst\n8C:1F:64:32:80:00/36\tCom Video Security Systems Co., Ltd.\n8C:1F:64:32:90:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:32:A0:00/36\tAbb\n8C:1F:64:32:B0:00/36\tShenyang Taihua Technology Co., Ltd.\n8C:1F:64:32:C0:00/36\tTaiko Audio B.V.\n8C:1F:64:32:E0:00/36\tTrineo Systems Sp. z o.o.\n8C:1F:64:32:F0:00/36\tDEUTA Controls GmbH\n8C:1F:64:33:00:00/36\tVision Systems Safety Tech\n8C:1F:64:33:20:00/36\tNexet Llc\n8C:1F:64:33:40:00/36\tOutdoorLink\n8C:1F:64:33:80:00/36\tRheingold Heavy LLC\n8C:1F:64:33:C0:00/36\tHubris Technologies Private Limited\n8C:1F:64:33:D0:00/36\tArrow (China) Electronics Trading Co., Ltd.\n8C:1F:64:34:00:00/36\tBRS Sistemas Eletrônicos\n8C:1F:64:34:20:00/36\tTimeMachines Inc.\n8C:1F:64:34:50:00/36\tKreafeuer AG, Swiss finsh\n8C:1F:64:34:70:00/36\tPlut d.o.o.\n8C:1F:64:34:90:00/36\tWaves System\n8C:1F:64:34:B0:00/36\tInfrared Inspection Systems\n8C:1F:64:34:C0:00/36\tKyushu Keisokki Co.,Ltd.\n8C:1F:64:34:D0:00/36\tbiosilver .co.,ltd\n8C:1F:64:34:F0:00/36\tSystec Designs BV\n8C:1F:64:35:00:00/36\tbiosilver .co.,ltd\n8C:1F:64:35:20:00/36\tMediashare Ltd\n8C:1F:64:35:40:00/36\tPaul Tagliamonte\n8C:1F:64:35:70:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:35:80:00/36\tDenso Manufacturing Tennessee\n8C:1F:64:35:C0:00/36\tOpgal Optronic Industries ltd\n8C:1F:64:35:D0:00/36\tSecurity&Best\n8C:1F:64:35:E0:00/36\tTest21 Taiwan Corp\n8C:1F:64:36:20:00/36\tPower Electronics Espana, S.L.\n8C:1F:64:36:30:00/36\tGrossenbacher Systeme AG\n8C:1F:64:36:40:00/36\tTilak International\n8C:1F:64:36:50:00/36\tVector Technologies, Llc\n8C:1F:64:36:60:00/36\tMB connect line GmbH Fernwartungssysteme\n8C:1F:64:36:70:00/36\tLAMTEC Mess- und Regeltechnik für Feuerungen GmbH & Co. KG\n8C:1F:64:36:80:00/36\tCrosstek Co., Ltd\n8C:1F:64:36:90:00/36\tOrbital Astronautics Ltd\n8C:1F:64:36:A0:00/36\tINVENTIS S.r.l.\n8C:1F:64:36:B0:00/36\tViewSonic Corp\n8C:1F:64:36:E0:00/36\tAbbott Diagnostics Technologies AS\n8C:1F:64:36:F0:00/36\tSp Manufacturing Pte Ltd\n8C:1F:64:37:00:00/36\tWOLF Advanced Technology\n8C:1F:64:37:10:00/36\tLimab Ab\n8C:1F:64:37:20:00/36\tWINK Streaming\n8C:1F:64:37:40:00/36\tAccord Communications Ltd\n8C:1F:64:37:50:00/36\tDuevi Srl\n8C:1F:64:37:60:00/36\tDIAS Infrared GmbH\n8C:1F:64:37:70:00/36\tSolotech\n8C:1F:64:37:80:00/36\tspar Power Technologies Inc.\n8C:1F:64:37:B0:00/36\tMitsubishi Electric India Pvt. Ltd.\n8C:1F:64:37:D0:00/36\tSeason Electronics Ltd\n8C:1F:64:37:E0:00/36\tSIDUS Solutions, LLC\n8C:1F:64:37:F0:00/36\tScarlet Tech Co., Ltd.\n8C:1F:64:38:00:00/36\tYslab\n8C:1F:64:38:20:00/36\tShenzhen ROLSTONE Technology Co., Ltd\n8C:1F:64:38:40:00/36\tTango Tango\n8C:1F:64:38:50:00/36\tMultilane Inc\n8C:1F:64:38:70:00/36\tOmnivision\n8C:1F:64:38:80:00/36\tMB connect line GmbH Fernwartungssysteme\n8C:1F:64:38:A0:00/36\tAll Points Broadband\n8C:1F:64:38:B0:00/36\tBorrell USA Corp\n8C:1F:64:38:C0:00/36\tXiamen Zhixiaojin Intelligent Technology Co., Ltd\n8C:1F:64:38:D0:00/36\tWilson Electronics\n8C:1F:64:38:E0:00/36\tWartsila Voyage Oy\n8C:1F:64:38:F0:00/36\tUnabiz\n8C:1F:64:39:00:00/36\tSkyLabs d.o.o.\n8C:1F:64:39:10:00/36\tCpc (Uk)\n8C:1F:64:39:20:00/36\tmmc kommunikationstechnologie gmbh\n8C:1F:64:39:30:00/36\tGre System Inc.\n8C:1F:64:39:40:00/36\tCeranext Ltd\n8C:1F:64:39:50:00/36\tBeijing Ceresdata Technology Co., LTD\n8C:1F:64:39:60:00/36\tMixWave, Inc.\n8C:1F:64:39:70:00/36\tIntel Corporate\n8C:1F:64:39:80:00/36\tSoftware Systems Plus\n8C:1F:64:39:A0:00/36\tGolding Audio Ltd\n8C:1F:64:39:B0:00/36\tDeviceworx Technologies Inc.\n8C:1F:64:39:E0:00/36\tAbbott Diagnostics Technologies AS\n8C:1F:64:3A:20:00/36\tKron Medidores\n8C:1F:64:3A:30:00/36\tLumentum\n8C:1F:64:3A:40:00/36\tQLM Technology Ltd\n8C:1F:64:3A:C0:00/36\tBenison Tech\n8C:1F:64:3A:D0:00/36\tTowerIQ\n8C:1F:64:3A:F0:00/36\tPSA Technology Ltda.\n8C:1F:64:3B:00:00/36\tFlextronics International Kft\n8C:1F:64:3B:10:00/36\tPanoramic Power\n8C:1F:64:3B:20:00/36\tReal Digital\n8C:1F:64:3B:50:00/36\tSvms\n8C:1F:64:3B:60:00/36\tTex Computer Srl\n8C:1F:64:3B:70:00/36\tAi-Blox\n8C:1F:64:3B:80:00/36\tHubris Technologies Private Limited\n8C:1F:64:3B:A0:00/36\tMitsubishi Electric India Pvt. Ltd.\n8C:1F:64:3B:B0:00/36\tClausal Computing Oy\n8C:1F:64:3B:D0:00/36\tOriux\n8C:1F:64:3C:00:00/36\tSnek\n8C:1F:64:3C:10:00/36\tSuzhou Lianshichuangzhi Technology Co., Ltd\n8C:1F:64:3C:20:00/36\tSamuel Cosgrove\n8C:1F:64:3C:40:00/36\tNavSys Technology Inc.\n8C:1F:64:3C:50:00/36\tStratis IOT\n8C:1F:64:3C:60:00/36\tWavestream Corp\n8C:1F:64:3C:80:00/36\tBTG Instruments AB\n8C:1F:64:3C:90:00/36\tTECHPLUS-LINK Technology Co.,Ltd\n8C:1F:64:3C:D0:00/36\tSejong security system Cor.\n8C:1F:64:3C:E0:00/36\tMahindr & Mahindra\n8C:1F:64:3D:00:00/36\tTripltek\n8C:1F:64:3D:10:00/36\tEMIT GmbH\n8C:1F:64:3D:20:00/36\tUVIRCO Technologies\n8C:1F:64:3D:40:00/36\te.p.g. Elettronica s.r.l.\n8C:1F:64:3D:50:00/36\tFRAKO Kondensatoren- und Anlagenbau GmbH\n8C:1F:64:3D:70:00/36\tEiden Co.,Ltd.\n8C:1F:64:3D:90:00/36\tUnlimited Bandwidth LLC\n8C:1F:64:3D:B0:00/36\tBRS Sistemas Eletrônicos\n8C:1F:64:3E:00:00/36\tYPP Corporation\n8C:1F:64:3E:20:00/36\tAgrico\n8C:1F:64:3E:30:00/36\tFMTec GmbH - Future Management Technologies\n8C:1F:64:3E:50:00/36\tSystems Mechanics\n8C:1F:64:3E:60:00/36\telbe informatik GmbH\n8C:1F:64:3E:80:00/36\tRuichuangte\n8C:1F:64:3E:90:00/36\tHeitec Ag\n8C:1F:64:3E:A0:00/36\tChipscape Security Systems\n8C:1F:64:3E:B0:00/36\tSamwell International Inc\n8C:1F:64:3E:D0:00/36\tThe Exploration Company\n8C:1F:64:3E:E0:00/36\tBnB Information Technology\n8C:1F:64:3F:20:00/36\tSurya Electronics\n8C:1F:64:3F:30:00/36\tCambrian Works, Inc.\n8C:1F:64:3F:40:00/36\tActelser S.L.\n8C:1F:64:3F:70:00/36\tMitsubishi Electric India Pvt. Ltd.\n8C:1F:64:3F:90:00/36\tYu Yan System Technology Co., Ltd.\n8C:1F:64:3F:C0:00/36\tSTV Electronic GmbH\n8C:1F:64:3F:E0:00/36\tPlum sp. z.o.o.\n8C:1F:64:3F:F0:00/36\tUisee(Shanghai) Automotive Technologies Ltd.\n8C:1F:64:40:20:00/36\tInteger.pl S.A.\n8C:1F:64:40:60:00/36\tAnda Telecom Pvt Ltd\n8C:1F:64:40:70:00/36\tbroadtek\n8C:1F:64:40:80:00/36\ttechone system\n8C:1F:64:40:A0:00/36\tEnki Multimedia\n8C:1F:64:40:C0:00/36\tSichuan Aiyijan Technology Company Ltd.\n8C:1F:64:40:D0:00/36\tPROFITT Ltd\n8C:1F:64:40:E0:00/36\tBaker Hughes EMEA\n8C:1F:64:41:00:00/36\tRoboteq\n8C:1F:64:41:20:00/36\tComercial Electronica Studio-2 s.l.\n8C:1F:64:41:40:00/36\tINSEVIS GmbH\n8C:1F:64:41:50:00/36\tOnAsset Intelligence\n8C:1F:64:41:70:00/36\tFracarro srl\n8C:1F:64:41:90:00/36\tNaval Group\n8C:1F:64:41:B0:00/36\tEnergy Power Products Limited\n8C:1F:64:41:C0:00/36\tKSE GmbH\n8C:1F:64:41:D0:00/36\tAspen Spectra Sdn Bhd\n8C:1F:64:41:E0:00/36\tLinxpeed Limited\n8C:1F:64:41:F0:00/36\tGigalane\n8C:1F:64:42:10:00/36\tJ B Electronics Corp\n8C:1F:64:42:30:00/36\tHiwin Mikrosystem Corp.\n8C:1F:64:42:60:00/36\teumig industrie-TV GmbH.\n8C:1F:64:42:70:00/36\tMB connect line GmbH Fernwartungssysteme\n8C:1F:64:42:90:00/36\tAbbott Diagnostics Technologies AS\n8C:1F:64:42:A0:00/36\tAtonarp Inc.\n8C:1F:64:42:B0:00/36\tGamber Johnson-LLC\n8C:1F:64:42:D0:00/36\tJemac Sweden AB\n8C:1F:64:42:F0:00/36\tTomorrow Companies Inc\n8C:1F:64:43:20:00/36\tRebel Systems\n8C:1F:64:43:70:00/36\tGogo BA\n8C:1F:64:43:80:00/36\tInteger.pl S.A.\n8C:1F:64:43:90:00/36\tBornico\n8C:1F:64:43:A0:00/36\tSpacelite Inc\n8C:1F:64:43:D0:00/36\tSolid State Supplies Ltd\n8C:1F:64:44:00:00/36\tMB connect line GmbH Fernwartungssysteme\n8C:1F:64:44:10:00/36\tNovanta IMS\n8C:1F:64:44:20:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:44:40:00/36\tContrive Srl\n8C:1F:64:44:50:00/36\tFigment Design Laboratories\n8C:1F:64:44:A0:00/36\tOnbitel\n8C:1F:64:44:D0:00/36\tDesign and Manufacturing Vista Electronics Pvt.Ltd.\n8C:1F:64:44:E0:00/36\tGVA Lighting, Inc.\n8C:1F:64:44:F0:00/36\tRealD, Inc.\n8C:1F:64:45:10:00/36\tGuan Show Technologe Co., Ltd.\n8C:1F:64:45:40:00/36\tKJ Klimateknik A/S\n8C:1F:64:45:70:00/36\tShanghai Angwei Information Technology Co.,Ltd.\n8C:1F:64:45:90:00/36\tGreenTally LLC\n8C:1F:64:45:A0:00/36\tInspur Digital Enterprise Technology Co., Ltd.\n8C:1F:64:45:B0:00/36\tBeijing Aoxing Technology Co.,Ltd\n8C:1F:64:45:D0:00/36\tFuzhou Tucsen Photonics Co.,Ltd\n8C:1F:64:45:E0:00/36\tHangzhou Zhongchuan Digital Equipment Co., Ltd.\n8C:1F:64:45:F0:00/36\tToshniwal Security Solutions Pvt Ltd\n8C:1F:64:46:00:00/36\tSolace Systems Inc.\n8C:1F:64:46:10:00/36\tKara Partners LLC\n8C:1F:64:46:20:00/36\tReo Ag\n8C:1F:64:46:50:00/36\tIxorigue Technologies Sl\n8C:1F:64:46:60:00/36\tIntamsys Technology Co.Ltd\n8C:1F:64:46:A0:00/36\tPharsighted LLC\n8C:1F:64:47:00:00/36\tCanfield Scientific Inc\n8C:1F:64:47:20:00/36\tSurge Networks, Inc.\n8C:1F:64:47:30:00/36\tPlum sp. z.o.o.\n8C:1F:64:47:40:00/36\tAudiobyte S.R.L.\n8C:1F:64:47:50:00/36\tAlpine Quantum Technologies GmbH\n8C:1F:64:47:60:00/36\tClair Global Corporation\n8C:1F:64:47:70:00/36\tBlaucomm Ltd\n8C:1F:64:47:90:00/36\tAKSE srl\n8C:1F:64:47:A0:00/36\tMissing Link Electronics, Inc.\n8C:1F:64:47:B0:00/36\tFluid Components Intl\n8C:1F:64:47:D0:00/36\tEb Neuro Spa\n8C:1F:64:47:E0:00/36\tNovanta IMS\n8C:1F:64:48:00:00/36\tSoca Technology Co., Ltd.\n8C:1F:64:48:10:00/36\tVirtualV Trading Limited\n8C:1F:64:48:20:00/36\tVismes sarl\n8C:1F:64:48:60:00/36\tLonghorn lntelligent Tech Co.,Ltd.\n8C:1F:64:48:70:00/36\tTECHKON GmbH\n8C:1F:64:48:90:00/36\tHupi\n8C:1F:64:48:B0:00/36\tMonnit Corporation\n8C:1F:64:48:D0:00/36\tPrivate\n8C:1F:64:48:F0:00/36\tMecos AG\n8C:1F:64:49:30:00/36\tSecurity Products International, LLC\n8C:1F:64:49:50:00/36\tDave Srl\n8C:1F:64:49:60:00/36\tQualsen(Guangzhou)Technologies Co.,Ltd\n8C:1F:64:49:70:00/36\tPrimalucelab S.p.A.\n8C:1F:64:49:80:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:49:90:00/36\tTiama\n8C:1F:64:49:B0:00/36\tWartsila Voyage Oy\n8C:1F:64:49:C0:00/36\tRed Lion Europe GmbH\n8C:1F:64:49:F0:00/36\tShenzhen Dongman Technology Co.,Ltd\n8C:1F:64:4A:00:00/36\tTantec A/S\n8C:1F:64:4A:10:00/36\tBreas Medical AB\n8C:1F:64:4A:20:00/36\tBludigit SpA\n8C:1F:64:4A:40:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:4A:60:00/36\tAlaire Technologies Inc\n8C:1F:64:4A:70:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:4A:80:00/36\tExact Sciences\n8C:1F:64:4A:90:00/36\tMartec Marine S.p.a.\n8C:1F:64:4A:A0:00/36\tGigaIO Networks, Inc.\n8C:1F:64:4A:C0:00/36\tVekto\n8C:1F:64:4A:E0:00/36\tKCS Co., Ltd.\n8C:1F:64:4A:F0:00/36\tminiDSP\n8C:1F:64:4B:00:00/36\tU -Mei-Dah Int'L Enterprise Co.,Ltd.\n8C:1F:64:4B:40:00/36\tPoint One Navigation\n8C:1F:64:4B:80:00/36\tastTECS Communications Private Limited\n8C:1F:64:4B:B0:00/36\tIWS Global Pty Ltd\n8C:1F:64:4B:F0:00/36\tSmart Monitoring Innovations Private Limited\n8C:1F:64:4C:10:00/36\tClock-O-Matic\n8C:1F:64:4C:20:00/36\tLaser Imagineering Vertriebs GmbH\n8C:1F:64:4C:40:00/36\tInnovative Industries\n8C:1F:64:4C:70:00/36\tSBS SpA\n8C:1F:64:4C:90:00/36\tApantac LLC\n8C:1F:64:4C:A0:00/36\tNorth Building Technologies Limited\n8C:1F:64:4C:D0:00/36\tGuan Show Technologe Co., Ltd.\n8C:1F:64:4C:F0:00/36\tSicon srl\n8C:1F:64:4D:00:00/36\tSunSonic LLC\n8C:1F:64:4D:60:00/36\tDan Smith LLC\n8C:1F:64:4D:70:00/36\tFlextronics International Kft\n8C:1F:64:4D:90:00/36\tSecurico Electronics India Ltd\n8C:1F:64:4D:A0:00/36\tDTDS Technology Pte Ltd\n8C:1F:64:4D:B0:00/36\tPrivate\n8C:1F:64:4D:C0:00/36\tBESO sp. z o.o.\n8C:1F:64:4D:D0:00/36\tGriffyn Robotech Private Limited\n8C:1F:64:4D:F0:00/36\tEmri\n8C:1F:64:4E:00:00/36\tPuS GmbH und Co. KG\n8C:1F:64:4E:30:00/36\tExi Flow Measurement Ltd\n8C:1F:64:4E:40:00/36\tNuvation Energy\n8C:1F:64:4E:50:00/36\tRenukas Castle Hard- and Software\n8C:1F:64:4E:60:00/36\tSchippers Europe BV\n8C:1F:64:4E:70:00/36\tCircuit Solutions\n8C:1F:64:4E:90:00/36\tEers Global Technologies Inc.\n8C:1F:64:4E:B0:00/36\tflsystem\n8C:1F:64:4E:C0:00/36\tXOR UK Corporation Limited\n8C:1F:64:4E:D0:00/36\tVentionex Innovations Sdn Bhd\n8C:1F:64:4F:00:00/36\tTieline Research Pty Ltd\n8C:1F:64:4F:10:00/36\tAbbott Diagnostics Technologies AS\n8C:1F:64:4F:40:00/36\tStaco Energy Products\n8C:1F:64:4F:60:00/36\tPrivate\n8C:1F:64:4F:70:00/36\tSmartD Technologies Inc\n8C:1F:64:4F:90:00/36\tPhotonic Science and Engineering Ltd\n8C:1F:64:4F:A0:00/36\tSanskruti\n8C:1F:64:4F:B0:00/36\tMesa Technologies Llc\n8C:1F:64:50:00:00/36\tNepean Networks Pty Ltd\n8C:1F:64:50:10:00/36\tQUISS GmbH\n8C:1F:64:50:20:00/36\tSamwell International Inc\n8C:1F:64:50:30:00/36\tTualcom Elektronik A.S.\n8C:1F:64:50:40:00/36\tEA Elektroautomatik GmbH & Co. KG\n8C:1F:64:50:60:00/36\tUrbanChain Group Co., Ltd\n8C:1F:64:50:90:00/36\tSeason Electronics Ltd\n8C:1F:64:50:A0:00/36\tBellco Trading Company (Pvt) Ltd\n8C:1F:64:50:B0:00/36\tBeijing Entian Technology Development Co., Ltd\n8C:1F:64:50:C0:00/36\tAutomata GmbH & Co. KG\n8C:1F:64:50:D0:00/36\tShenzhen Guanxin Information Technology Co.,Ltd\n8C:1F:64:50:E0:00/36\tPanoramic Power\n8C:1F:64:51:00:00/36\tNovanta IMS\n8C:1F:64:51:10:00/36\tControl Aut Tecnologia em Automação LTDA\n8C:1F:64:51:20:00/36\tBlik Sensing B.V.\n8C:1F:64:51:40:00/36\tiOpt\n8C:1F:64:51:60:00/36\tTcl Operations Polska Sp. Z O.O.\n8C:1F:64:51:70:00/36\tSmart Radar System, Inc\n8C:1F:64:51:80:00/36\tWagner Group GmbH\n8C:1F:64:51:90:00/36\tShenzhen Gw Technology Co.,Ltd\n8C:1F:64:51:A0:00/36\tTELE Haase Steuergeräte Ges.m.b.H\n8C:1F:64:52:10:00/36\tMP-SENSOR GmbH\n8C:1F:64:52:30:00/36\tSPEKTRA Schwingungstechnik und Akustik GmbH Dresden\n8C:1F:64:52:40:00/36\tAski Industrie Elektronik GmbH\n8C:1F:64:52:50:00/36\tUnited States Technologies Inc.\n8C:1F:64:52:60:00/36\tCAITRON GmbH\n8C:1F:64:52:70:00/36\tPdw\n8C:1F:64:52:A0:00/36\tHiwin Mikrosystem Corp.\n8C:1F:64:52:D0:00/36\tCubic ITS, Inc. dba GRIDSMART Technologies\n8C:1F:64:52:E0:00/36\tCLOUD TELECOM Inc.\n8C:1F:64:53:00:00/36\tSIPazon AB\n8C:1F:64:53:30:00/36\tBoeing India Private Limited\n8C:1F:64:53:40:00/36\tSurya Electronics\n8C:1F:64:53:50:00/36\tColumbus McKinnon\n8C:1F:64:53:60:00/36\tBeijing Lxtv Technology Co.,Ltd\n8C:1F:64:53:A0:00/36\tTPVision Europe B.V\n8C:1F:64:53:B0:00/36\tREFU Storage System GmbH\n8C:1F:64:53:C0:00/36\tFilgis Elektronik\n8C:1F:64:53:D0:00/36\tNexcontech\n8C:1F:64:53:F0:00/36\tVelvac Incorporated\n8C:1F:64:54:00:00/36\tEnclavamientos y Señalización Ferroviaria Enyse S.A.\n8C:1F:64:54:20:00/36\tLandis+Gyr Equipamentos de Medição Ltda\n8C:1F:64:54:40:00/36\tTinkerbee Innovations Private Limited\n8C:1F:64:54:80:00/36\tBeijing Congyun Technology Co.,Ltd\n8C:1F:64:54:90:00/36\tBrad Technology\n8C:1F:64:54:A0:00/36\tBelden India Private Limited\n8C:1F:64:54:B0:00/36\tMect Srl\n8C:1F:64:54:C0:00/36\tGemini Electronics B.V.\n8C:1F:64:54:F0:00/36\tToolplanet Co., Ltd.\n8C:1F:64:55:00:00/36\tard sa\n8C:1F:64:55:20:00/36\tProterra, Inc\n8C:1F:64:55:30:00/36\tENIGMA SOI Sp. z o.o.\n8C:1F:64:55:40:00/36\tHerholdt Controls srl\n8C:1F:64:55:60:00/36\tBAE Systems\n8C:1F:64:55:70:00/36\tIn-lite Design BV\n8C:1F:64:55:80:00/36\tScitel\n8C:1F:64:55:90:00/36\tIntozi Tech Pvt Ltd\n8C:1F:64:55:B0:00/36\tSheetal Wireless Technologies Pvt Ltd\n8C:1F:64:55:C0:00/36\tSchildknecht AG\n8C:1F:64:55:E0:00/36\tHanateksystem\n8C:1F:64:56:00:00/36\tDexter Laundry Inc.\n8C:1F:64:56:10:00/36\tDeep Detection / ESB01736990\n8C:1F:64:56:60:00/36\tUltiroam\n8C:1F:64:56:80:00/36\tInteger.pl S.A.\n8C:1F:64:56:A0:00/36\tRadaz Indústria e Comércio de Produtos Eletronicos S/A\n8C:1F:64:56:B0:00/36\tAvida, Inc.\n8C:1F:64:56:C0:00/36\tELTEK SpA\n8C:1F:64:56:D0:00/36\tAcod\n8C:1F:64:56:E0:00/36\tEuklis srl\n8C:1F:64:56:F0:00/36\tAdetec Sas\n8C:1F:64:57:20:00/36\tZmbizi App Llc\n8C:1F:64:57:30:00/36\tIngenious Technology LLC\n8C:1F:64:57:40:00/36\tFlock Audio Inc.\n8C:1F:64:57:50:00/36\tYu Heng Electric CO. TD\n8C:1F:64:57:A0:00/36\tNPO ECO-INTECH Ltd.\n8C:1F:64:57:B0:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:57:D0:00/36\tISDI Ltd\n8C:1F:64:57:E0:00/36\tGuoqing (shangdong) Information Technology Co.,Ltd\n8C:1F:64:58:00:00/36\tSAKURA SEIKI Co., Ltd.\n8C:1F:64:58:10:00/36\tSpectraDynamics, Inc.\n8C:1F:64:58:30:00/36\t3Egreen tech. Co. Ltd.\n8C:1F:64:58:50:00/36\tShanghai DIDON Industry Co,. Ltd.\n8C:1F:64:58:90:00/36\tHvrnd\n8C:1F:64:58:B0:00/36\tQuectel Wireless Solutions Co.,Ltd.\n8C:1F:64:58:C0:00/36\tEar Micro LLC\n8C:1F:64:58:E0:00/36\tNovanta IMS\n8C:1F:64:59:10:00/36\tMB connect line GmbH Fernwartungssysteme\n8C:1F:64:59:30:00/36\tBrillian Network & Automation Integrated System Co., Ltd.\n8C:1F:64:59:50:00/36\tInspinia Technology s.r.o.\n8C:1F:64:59:60:00/36\tRF Code\n8C:1F:64:59:80:00/36\tTirasoft Technology\n8C:1F:64:59:A0:00/36\tPrimalucelab isrl\n8C:1F:64:59:C0:00/36\tPrivate\n8C:1F:64:59:F0:00/36\tDelta Computers LLC.\n8C:1F:64:5A:00:00/36\tSeongwon Eng Co.,Ltd\n8C:1F:64:5A:10:00/36\tBreas Medical AB\n8C:1F:64:5A:40:00/36\tDave Srl\n8C:1F:64:5A:60:00/36\tKinney Industries, Inc\n8C:1F:64:5A:70:00/36\tRch Spa\n8C:1F:64:5A:90:00/36\tAktiebolag Solask Energi\n8C:1F:64:5A:A0:00/36\tLandis+Gyr Equipamentos de Medição Ltda\n8C:1F:64:5A:C0:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:5A:E0:00/36\tSuzhou Motorcomm Electronic Technology Co., Ltd\n8C:1F:64:5A:F0:00/36\tTeq Diligent Product Solutions Pvt. Ltd.\n8C:1F:64:5B:00:00/36\tSonel S.A.\n8C:1F:64:5B:30:00/36\teumig industrie-TV GmbH.\n8C:1F:64:5B:40:00/36\tAxion Lighting\n8C:1F:64:5B:50:00/36\tHubris Technologies Private Limited\n8C:1F:64:5B:60:00/36\tShenZhen melevet medical Inc.,Ltd.\n8C:1F:64:5B:70:00/36\tVortex Sp. z o.o.\n8C:1F:64:5B:90:00/36\tViewSonic Corp\n8C:1F:64:5B:A0:00/36\tConnectcom System Co., Ltd\n8C:1F:64:5B:C0:00/36\tHeitec Ag\n8C:1F:64:5B:D0:00/36\tMPT-Service project\n8C:1F:64:5B:E0:00/36\tBenchmark Electronics BV\n8C:1F:64:5B:F0:00/36\tSUS Corporation\n8C:1F:64:5C:30:00/36\tR3Vox Ltd\n8C:1F:64:5C:40:00/36\tCooltera Limited\n8C:1F:64:5C:50:00/36\tActive Research Limited\n8C:1F:64:5C:60:00/36\tSystems With Intelligence Inc.\n8C:1F:64:5C:90:00/36\tAbbott Diagnostics Technologies AS\n8C:1F:64:5C:B0:00/36\tdinosys\n8C:1F:64:5C:C0:00/36\tAlpes recherche et développement\n8C:1F:64:5C:D0:00/36\tMahindr & Mahindra\n8C:1F:64:5C:E0:00/36\tPacketalk LLC\n8C:1F:64:5D:00:00/36\tImage Engineering\n8C:1F:64:5D:10:00/36\tTwin Development\n8C:1F:64:5D:30:00/36\tEloy Water\n8C:1F:64:5D:60:00/36\tPortrait Displays, Inc.\n8C:1F:64:5D:90:00/36\tOpdi-tex GmbH\n8C:1F:64:5D:A0:00/36\tWhite2net srl\n8C:1F:64:5D:B0:00/36\tGlobalInvacom\n8C:1F:64:5D:E0:00/36\tSekureTrak Inc. dba TraknProtect\n8C:1F:64:5D:F0:00/36\tRoesch Walter Industrie-Elektronik GmbH\n8C:1F:64:5E:10:00/36\tPower Electronics Espana, S.L.\n8C:1F:64:5E:30:00/36\tNixer Ltd\n8C:1F:64:5E:40:00/36\tWuxi Zetai Microelectronics Co., LTD\n8C:1F:64:5E:50:00/36\tTelemetrics Inc.\n8C:1F:64:5E:60:00/36\tOdyssee-Systemes\n8C:1F:64:5E:70:00/36\tHOSCH Gebäude Automation Neue Produkte GmbH\n8C:1F:64:5E:80:00/36\tSterna Security Devices Pvt Ltd\n8C:1F:64:5E:A0:00/36\tBTG Instruments AB\n8C:1F:64:5E:B0:00/36\tTiama\n8C:1F:64:5E:C0:00/36\tNv Bekaert Sa\n8C:1F:64:5E:D0:00/36\tDEUTA Werke GmbH\n8C:1F:64:5F:10:00/36\tHD Link Co., Ltd.\n8C:1F:64:5F:50:00/36\tHongSeok Ltd.\n8C:1F:64:5F:60:00/36\tForward Edge.AI\n8C:1F:64:5F:70:00/36\tEagle Harbor Technologies, Inc.\n8C:1F:64:5F:90:00/36\tKronotech Srl\n8C:1F:64:5F:A0:00/36\tPolCam Systems Sp. z o.o.\n8C:1F:64:5F:B0:00/36\tRecom Llc.\n8C:1F:64:5F:C0:00/36\tLance Design LLC\n8C:1F:64:60:00:00/36\tAnhui Chaokun Testing Equipment Co., Ltd\n8C:1F:64:60:10:00/36\tCamius\n8C:1F:64:60:30:00/36\tFuku Energy Technology Co., Ltd.\n8C:1F:64:60:50:00/36\tXacti Corporation\n8C:1F:64:60:70:00/36\tNanjing Aotong Intelligent Technology Co.,Ltd\n8C:1F:64:60:80:00/36\tCong Ty Co Phan Ky Thuat Moi Truong Viet An\n8C:1F:64:60:A0:00/36\tRfengine Co., Ltd.\n8C:1F:64:60:E0:00/36\tICT International\n8C:1F:64:61:00:00/36\tBeijing Zhongzhi Huida Technology Co., Ltd\n8C:1F:64:61:10:00/36\tSiemens Industry Software Inc.\n8C:1F:64:61:60:00/36\tDEUTA Werke GmbH\n8C:1F:64:61:80:00/36\tFoshan YiFeng Electric Industrial Co., ltd\n8C:1F:64:61:90:00/36\tLabtrino AB\n8C:1F:64:61:C0:00/36\tAutomata GmbH & Co. KG\n8C:1F:64:61:D0:00/36\tLewitt GmbH\n8C:1F:64:61:F0:00/36\tLightworks GmbH\n8C:1F:64:62:00:00/36\tSolace Systems Inc.\n8C:1F:64:62:10:00/36\tJTL Systems Ltd.\n8C:1F:64:62:20:00/36\tLogical Product\n8C:1F:64:62:30:00/36\tRyoyu-GC Co.,Ltd\n8C:1F:64:62:40:00/36\tCanastra AG\n8C:1F:64:62:50:00/36\tStresstech OY\n8C:1F:64:62:60:00/36\tCsiro\n8C:1F:64:62:70:00/36\tibg Prüfcomputer GmbH\n8C:1F:64:62:C0:00/36\tHangzhou EasyXR Advanced Technology Co., Ltd.\n8C:1F:64:62:D0:00/36\tEmbeddded Plus Plus\n8C:1F:64:62:E0:00/36\tViewSonic Corp\n8C:1F:64:63:10:00/36\tHaiyang Olix Co.,Ltd.\n8C:1F:64:63:40:00/36\tAml\n8C:1F:64:63:60:00/36\tEurope Trade\n8C:1F:64:63:80:00/36\tThunder Data Taiwan Co., Ltd.\n8C:1F:64:63:B0:00/36\tTiama\n8C:1F:64:63:C0:00/36\tGalios\n8C:1F:64:63:D0:00/36\tRax-Tech International\n8C:1F:64:63:E0:00/36\tMonnit Corporation\n8C:1F:64:63:F0:00/36\tPreo Industries Far East Ltd\n8C:1F:64:64:10:00/36\tbiosilver .co.,ltd\n8C:1F:64:64:40:00/36\tDave Srl\n8C:1F:64:64:70:00/36\tSenior Group LLC\n8C:1F:64:64:80:00/36\tGridpulse c.o.o.\n8C:1F:64:64:E0:00/36\tNilfisk Food\n8C:1F:64:65:00:00/36\tL tec Co.,Ltd\n8C:1F:64:65:10:00/36\tTeledyne Cetac\n8C:1F:64:65:30:00/36\tP5\n8C:1F:64:65:50:00/36\tS.E.I. Co.,Ltd.\n8C:1F:64:65:60:00/36\tOptotune Switzerland AG\n8C:1F:64:65:70:00/36\tBright Solutions PTE LTD\n8C:1F:64:65:B0:00/36\tSUS Corporation\n8C:1F:64:65:D0:00/36\tAction Streamer LLC\n8C:1F:64:65:F0:00/36\tAstrometric Instruments, Inc.\n8C:1F:64:66:00:00/36\tLlc Ntpc\n8C:1F:64:66:10:00/36\tSpyder Controls Corp.\n8C:1F:64:66:20:00/36\tSuzhou Leamore Optronics Co., Ltd.\n8C:1F:64:66:30:00/36\tmal-tech Technological Solutions Ltd/CRISP\n8C:1F:64:66:40:00/36\tThermoeye Inc\n8C:1F:64:66:C0:00/36\tLineage Power Pvt Ltd.,\n8C:1F:64:66:D0:00/36\tVt100 Srl\n8C:1F:64:66:E0:00/36\tMonnit Corporation\n8C:1F:64:66:F0:00/36\tElix Systems SA\n8C:1F:64:67:20:00/36\tFarmobile LLC\n8C:1F:64:67:30:00/36\tMEDIASCOPE Inc.\n8C:1F:64:67:50:00/36\tTransit Solutions, LLC.\n8C:1F:64:67:60:00/36\tsdt.net AG\n8C:1F:64:67:70:00/36\tFrey S.J.\n8C:1F:64:67:A0:00/36\tMG s.r.l.\n8C:1F:64:67:B0:00/36\tWi-DAS LLC\n8C:1F:64:67:C0:00/36\tEnsto Protrol AB\n8C:1F:64:67:D0:00/36\tRavi Teleinfomatics\n8C:1F:64:67:E0:00/36\tLDA Audiotech\n8C:1F:64:67:F0:00/36\tHamamatsu Photonics K.K.\n8C:1F:64:68:00:00/36\tMitrol S.R.L.\n8C:1F:64:68:10:00/36\twayfiwireless.com\n8C:1F:64:68:30:00/36\tSlat\n8C:1F:64:68:50:00/36\tSanchar Wireless Communications Ltd\n8C:1F:64:68:70:00/36\tLamontec\n8C:1F:64:68:C0:00/36\tGuangZhou HOKO Electric CO.,LTD\n8C:1F:64:68:E0:00/36\tOriental Electronics, Inc.\n8C:1F:64:69:10:00/36\tWende Tan\n8C:1F:64:69:20:00/36\tNexilis Electronics India Pvt Ltd (PICSYS)\n8C:1F:64:69:30:00/36\tAdaptiv LTD\n8C:1F:64:69:40:00/36\tHubbell Power Systems\n8C:1F:64:69:50:00/36\taeroLiFi GmbH\n8C:1F:64:69:60:00/36\tEmerson Rosemount Analytical\n8C:1F:64:69:70:00/36\tSontay Ltd.\n8C:1F:64:69:80:00/36\tArcus-EDS GmbH\n8C:1F:64:69:90:00/36\tFIDICA GmbH & Co. KG\n8C:1F:64:69:E0:00/36\tAT-Automation Technology GmbH\n8C:1F:64:69:F0:00/36\tInsightec\n8C:1F:64:6A:00:00/36\tAvionica\n8C:1F:64:6A:30:00/36\tBecton Dickinson\n8C:1F:64:6A:40:00/36\tAutomata Spa\n8C:1F:64:6A:60:00/36\tQ (Cue), Inc.\n8C:1F:64:6A:80:00/36\tBulwark\n8C:1F:64:6A:B0:00/36\tToho System Co., Ltd.\n8C:1F:64:6A:D0:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:6A:E0:00/36\tBray International\n8C:1F:64:6B:00:00/36\tO-Net Technologies(Shenzhen)Group Co.,Ltd.\n8C:1F:64:6B:10:00/36\tSpecialist Mechanical Engineers (PTY)LTD\n8C:1F:64:6B:30:00/36\tFeritech Ltd.\n8C:1F:64:6B:50:00/36\tO-Net Communications(Shenzhen)Limited\n8C:1F:64:6B:60:00/36\tEngelmann Sensor GmbH\n8C:1F:64:6B:70:00/36\tAlpha-Omega Technology GmbH & Co. KG\n8C:1F:64:6B:80:00/36\tLarraioz Elektronika\n8C:1F:64:6B:90:00/36\tGS Industrie-Elektronik GmbH\n8C:1F:64:6B:B0:00/36\tSeason Electronics Ltd\n8C:1F:64:6B:D0:00/36\tIoT Water Analytics S.L.\n8C:1F:64:6B:F0:00/36\tAutomata GmbH & Co. KG\n8C:1F:64:6C:60:00/36\tFit\n8C:1F:64:6C:80:00/36\tTaiko Audio B.V.\n8C:1F:64:6C:A0:00/36\tMelissa Climate Jsc\n8C:1F:64:6C:B0:00/36\tGJD Manufacturing\n8C:1F:64:6C:C0:00/36\tNewtouch Electronics (Shanghai) Co., LTD.\n8C:1F:64:6C:D0:00/36\tWuhan Xingtuxinke ELectronic Co.,Ltd\n8C:1F:64:6C:E0:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:6C:F0:00/36\tItalora\n8C:1F:64:6D:00:00/36\tAbb\n8C:1F:64:6D:10:00/36\tSmith meter Inc\n8C:1F:64:6D:20:00/36\tVectorNav Technologies\n8C:1F:64:6D:40:00/36\tHitachi Energy Poland sp. Z o o\n8C:1F:64:6D:50:00/36\tHTK Hamburg GmbH\n8C:1F:64:6D:60:00/36\tArgosdyne Co., Ltd\n8C:1F:64:6D:70:00/36\tLeopard Imaging Inc\n8C:1F:64:6D:90:00/36\tKhimo\n8C:1F:64:6D:C0:00/36\tIntrinsic Innovation, LLC\n8C:1F:64:6D:D0:00/36\tViewSonic Corp\n8C:1F:64:6D:E0:00/36\tSUN･TECTRO,Ltd.\n8C:1F:64:6D:F0:00/36\tALPHI Technology Corporation\n8C:1F:64:6E:20:00/36\tSCU Co., Ltd.\n8C:1F:64:6E:30:00/36\tViewSonic International Corporation\n8C:1F:64:6E:40:00/36\tRAB Microfluidics R&D Company Ltd\n8C:1F:64:6E:70:00/36\tWiTricity Corporation\n8C:1F:64:6E:90:00/36\tSHENZHEN sunforest Co.LTD\n8C:1F:64:6E:A0:00/36\tKMtronic ltd\n8C:1F:64:6E:B0:00/36\tEnless Wireless\n8C:1F:64:6E:C0:00/36\tBit Trade One, Ltd.\n8C:1F:64:6E:D0:00/36\tElbit Systems of America\n8C:1F:64:6E:E0:00/36\tCortical Labs Pte Ltd\n8C:1F:64:6F:40:00/36\tElsist Srl\n8C:1F:64:6F:70:00/36\tEddyWorks Co.,Ltd\n8C:1F:64:6F:80:00/36\tProiker Technology Sl\n8C:1F:64:6F:90:00/36\tAnddoro Llc\n8C:1F:64:6F:B0:00/36\tExatron Servers Manufacturing Pvt Ltd\n8C:1F:64:6F:C0:00/36\tHM Systems A/S\n8C:1F:64:70:00:00/36\tQuantaflow\n8C:1F:64:70:20:00/36\tAIDirections\n8C:1F:64:70:30:00/36\tCalnex Solutions plc\n8C:1F:64:70:70:00/36\tOas Ag\n8C:1F:64:70:80:00/36\tZuum\n8C:1F:64:70:B0:00/36\tOnicon\n8C:1F:64:70:C0:00/36\tBroyce Control Ltd\n8C:1F:64:70:E0:00/36\tOvercomTech\n8C:1F:64:71:20:00/36\tNexion Data Systems P/L\n8C:1F:64:71:30:00/36\tNstek Co., Ltd.\n8C:1F:64:71:50:00/36\tInternet Protocolo Logica Sl\n8C:1F:64:71:80:00/36\tAbb\n8C:1F:64:71:A0:00/36\tChell Instruments Ltd\n8C:1F:64:71:B0:00/36\tAdasky Ltd.\n8C:1F:64:71:D0:00/36\tEpigon spol. s r.o.\n8C:1F:64:72:00:00/36\tHangzhou Huasu Technology CO., LTD.\n8C:1F:64:72:10:00/36\tM/S Milind Ramachandra Rajwade\n8C:1F:64:72:20:00/36\tArtome Oy\n8C:1F:64:72:30:00/36\tCelestica Inc.\n8C:1F:64:72:40:00/36\tHeitec Ag\n8C:1F:64:72:60:00/36\tDave Srl\n8C:1F:64:72:90:00/36\tZER01CHI Corporation\n8C:1F:64:72:A0:00/36\tDorlet Sau\n8C:1F:64:72:B0:00/36\tAbbott Diagnostics Technologies AS\n8C:1F:64:72:C0:00/36\tAntai technology Co.,Ltd\n8C:1F:64:72:D0:00/36\tHills Health Solutions\n8C:1F:64:72:F0:00/36\tGMV Aerospace and Defence SAU\n8C:1F:64:73:10:00/36\tehoosys Co.,LTD.\n8C:1F:64:73:30:00/36\tVideo Network Security\n8C:1F:64:73:70:00/36\tVytahy-Vymyslicky s.r.o.\n8C:1F:64:73:80:00/36\tssolgrid\n8C:1F:64:73:90:00/36\tMonnit Corporation\n8C:1F:64:73:B0:00/36\tFink Zeitsysteme GmbH\n8C:1F:64:73:C0:00/36\tReo Ag\n8C:1F:64:73:D0:00/36\tNewAgeMicro\n8C:1F:64:73:E0:00/36\tBeijing LJ Technology Co., Ltd.\n8C:1F:64:73:F0:00/36\tUbiscale\n8C:1F:64:74:00:00/36\tNorvento Tecnología, S.L.\n8C:1F:64:74:10:00/36\tTraton Ab\n8C:1F:64:74:30:00/36\tRosenxt Technology USA\n8C:1F:64:74:40:00/36\tChaseo Connectome\n8C:1F:64:74:50:00/36\tR2D Automation\n8C:1F:64:74:60:00/36\tSensus Healthcare\n8C:1F:64:74:70:00/36\tVisionTIR Multispectral Technology\n8C:1F:64:74:90:00/36\tTiama\n8C:1F:64:74:B0:00/36\tAR Modular RF\n8C:1F:64:74:E0:00/36\tOpenPark Technologies Kft\n8C:1F:64:75:10:00/36\tCITSA Technologies Private Limited\n8C:1F:64:75:40:00/36\tDevRay IT Solutions Private Limited\n8C:1F:64:75:50:00/36\tFlextronics International Kft\n8C:1F:64:75:60:00/36\tStar Systems International Limited\n8C:1F:64:75:90:00/36\tSystel Inc\n8C:1F:64:75:C0:00/36\tAmerican Energy Storage Innovations\n8C:1F:64:75:F0:00/36\tASTRACOM Co. Ltd\n8C:1F:64:76:00:00/36\tQ-Light AS\n8C:1F:64:76:10:00/36\tBOE Smart IoT Technology Co.,Ltd\n8C:1F:64:76:20:00/36\tSupport Professionals B.V.\n8C:1F:64:76:30:00/36\tAnduril Imaging\n8C:1F:64:76:40:00/36\tnanoTRONIX Computing Inc.\n8C:1F:64:76:50:00/36\tMicro Electroninc Products\n8C:1F:64:76:70:00/36\tCAES Systems LLC\n8C:1F:64:76:80:00/36\tmapna group\n8C:1F:64:76:90:00/36\tVonamic GmbH\n8C:1F:64:76:A0:00/36\tDorlet Sau\n8C:1F:64:76:C0:00/36\tGuan Show Technologe Co., Ltd.\n8C:1F:64:76:E0:00/36\tdevelogic GmbH\n8C:1F:64:76:F0:00/36\tINVENTIA Sp. z o.o.\n8C:1F:64:77:10:00/36\tAutomatizacion Y Conectividad\n8C:1F:64:77:40:00/36\tnavXperience GmbH\n8C:1F:64:77:50:00/36\tBecton Dickinson\n8C:1F:64:77:60:00/36\tVisiosoft Pty Ltd\n8C:1F:64:77:70:00/36\tSicon srl\n8C:1F:64:77:80:00/36\tERS Elektronik GmbH\n8C:1F:64:77:90:00/36\tInventio Di Nicolo' Bordoli\n8C:1F:64:77:A0:00/36\tDatacomm Networks\n8C:1F:64:77:B0:00/36\tDb Sas\n8C:1F:64:77:C0:00/36\tOrange Tree Technologies Ltd\n8C:1F:64:77:E0:00/36\tInstitute of geophysics, China earthquake administration\n8C:1F:64:77:F0:00/36\tTargaSystem S.r.L.\n8C:1F:64:78:00:00/36\tHME Co.,ltd\n8C:1F:64:78:10:00/36\tDruck Ltd.\n8C:1F:64:78:20:00/36\tAtm Llc\n8C:1F:64:78:70:00/36\tTabology\n8C:1F:64:78:90:00/36\tDEUTA Werke GmbH\n8C:1F:64:78:F0:00/36\tConnection Systems\n8C:1F:64:79:10:00/36\tOtis Technology and Development(Shanghai) Co., Ltd.\n8C:1F:64:79:30:00/36\tAditec GmbH\n8C:1F:64:79:70:00/36\tAlban Giacomo S.p.a.\n8C:1F:64:79:B0:00/36\tFoerster-Technik GmbH\n8C:1F:64:79:D0:00/36\tMurata Manufacturing Co., Ltd.\n8C:1F:64:79:E0:00/36\tAccemic Technologies GmbH\n8C:1F:64:79:F0:00/36\tHiwin Mikrosystem Corp.\n8C:1F:64:7A:00:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:7A:10:00/36\tGuardian Controls International Ltd\n8C:1F:64:7A:30:00/36\tIbercomp SA\n8C:1F:64:7A:40:00/36\tHirotech inc.\n8C:1F:64:7A:50:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:7A:60:00/36\tOTMetric\n8C:1F:64:7A:70:00/36\tTimegate Instruments Ltd.\n8C:1F:64:7A:A0:00/36\tXSENSOR Technology Corp.\n8C:1F:64:7A:B0:00/36\tDEUTA Werke GmbH\n8C:1F:64:7A:E0:00/36\tD-E-K GmbH & Co.KG\n8C:1F:64:7A:F0:00/36\tE Vision India Pvt Ltd\n8C:1F:64:7B:00:00/36\tAxid System\n8C:1F:64:7B:10:00/36\tEA Elektro-Automatik GmbH\n8C:1F:64:7B:50:00/36\tGuan Show Technologe Co., Ltd.\n8C:1F:64:7B:60:00/36\tKeyline S.P.A.\n8C:1F:64:7B:70:00/36\tJames G. Biddle dba Megger\n8C:1F:64:7B:80:00/36\tTimeMachines Inc.\n8C:1F:64:7B:90:00/36\tDeviceroy\n8C:1F:64:7B:B0:00/36\tKotsu Dengyosha Co., Ltd.\n8C:1F:64:7B:C0:00/36\tGO development GmbH\n8C:1F:64:7B:E0:00/36\tinomatic GmbH\n8C:1F:64:7C:20:00/36\tCTI Intl Solutions\n8C:1F:64:7C:40:00/36\tMB connect line GmbH\n8C:1F:64:7C:60:00/36\tFlextronics International Kft\n8C:1F:64:7C:70:00/36\tAscon Tecnologic S.r.l.\n8C:1F:64:7C:80:00/36\tJacquet Dechaume\n8C:1F:64:7C:D0:00/36\tFugro Technology B.V.\n8C:1F:64:7C:E0:00/36\tShanghai smartlogic technology Co.,Ltd.\n8C:1F:64:7C:F0:00/36\tTransdigital Pty Ltd\n8C:1F:64:7D:00:00/36\tTecsys do Brasil Industrial Ltda\n8C:1F:64:7D:20:00/36\tEnlaps\n8C:1F:64:7D:30:00/36\tSuntech Engineering\n8C:1F:64:7D:40:00/36\tPenteon Corporation\n8C:1F:64:7D:60:00/36\tAlgodue Elettronica Srl\n8C:1F:64:7D:70:00/36\tMetronic AKP sp.j.\n8C:1F:64:7D:80:00/36\tHIROSAWA ELECTRIC Co.,Ltd.\n8C:1F:64:7D:90:00/36\tNoisewave Corporation\n8C:1F:64:7D:A0:00/36\tXpti Tecnologias em Segurança Ltda\n8C:1F:64:7D:C0:00/36\tLineage Power Pvt Ltd.,\n8C:1F:64:7D:D0:00/36\tTAKASAKI KYODO COMPUTING CENTER Co.,LTD.\n8C:1F:64:7D:E0:00/36\tSOCNOC AI Inc\n8C:1F:64:7D:F0:00/36\tSecury360\n8C:1F:64:7E:00:00/36\tColombo Sales & Engineering, Inc.\n8C:1F:64:7E:10:00/36\tHeitec Ag\n8C:1F:64:7E:20:00/36\tAaronn Electronic GmbH\n8C:1F:64:7E:30:00/36\tUne Srl\n8C:1F:64:7E:70:00/36\trobert juliat\n8C:1F:64:7E:80:00/36\tEA Elektro-Automatik GmbH\n8C:1F:64:7E:C0:00/36\tMethods2Business B.V.\n8C:1F:64:7E:D0:00/36\tEding CNC bv\n8C:1F:64:7E:E0:00/36\tOrange Precision Measurement LLC\n8C:1F:64:7E:F0:00/36\tSAXOGY POWER ELECTRONICS GmbH\n8C:1F:64:7F:10:00/36\tAEM Singapore Pte Ltd\n8C:1F:64:7F:20:00/36\tAT-Automation Technology GmbH\n8C:1F:64:7F:30:00/36\tVideosys Broadcast Ltd\n8C:1F:64:7F:40:00/36\tG.M. International srl\n8C:1F:64:7F:80:00/36\tFleetSafe India Private Limited\n8C:1F:64:7F:C0:00/36\tMitsubishi Electric Klimat Transportation Systems S.p.A.\n8C:1F:64:80:00:00/36\tShenzhen SDG Telecom Equipment Co.,Ltd.\n8C:1F:64:80:10:00/36\tZhejiang Laolan Information Technology Co., Ltd\n8C:1F:64:80:20:00/36\tDaiichi Electric Industry Co., Ltd\n8C:1F:64:80:30:00/36\tMOSCA Elektronik und Antriebstechnik GmbH\n8C:1F:64:80:40:00/36\tEA Elektro-Automatik GmbH\n8C:1F:64:80:60:00/36\tMatrixspace\n8C:1F:64:80:70:00/36\tGiordano Controls Spa\n8C:1F:64:80:C0:00/36\tThermify Holdings Ltd\n8C:1F:64:80:D0:00/36\tjooyon electronics Service co.LTD\n8C:1F:64:80:E0:00/36\tTxWireless Limited\n8C:1F:64:80:F0:00/36\tASYS Corporation\n8C:1F:64:81:00:00/36\tKymata Srl\n8C:1F:64:81:10:00/36\tPanoramic Power\n8C:1F:64:81:30:00/36\tPribusin Inc.\n8C:1F:64:81:40:00/36\tDti Srl\n8C:1F:64:81:60:00/36\tPalmSens BV\n8C:1F:64:81:70:00/36\tnke marine electronics\n8C:1F:64:81:90:00/36\tWarecube, Inc.\n8C:1F:64:81:A0:00/36\tGemini Electronics B.V.\n8C:1F:64:81:B0:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:81:D0:00/36\tGogo BA\n8C:1F:64:81:F0:00/36\tViewSonic Corp\n8C:1F:64:82:00:00/36\tTiama\n8C:1F:64:82:20:00/36\tIP Devices\n8C:1F:64:82:40:00/36\tLogicube Inc\n8C:1F:64:82:50:00/36\tMTU Aero Engines AG\n8C:1F:64:82:80:00/36\tAurcore Technology Inc.\n8C:1F:64:82:B0:00/36\tFlow Power\n8C:1F:64:82:C0:00/36\tPower Electronics Espana, S.L.\n8C:1F:64:82:F0:00/36\tAnySignal\n8C:1F:64:83:00:00/36\tVtron Pty Ltd\n8C:1F:64:83:70:00/36\trunZero, Inc\n8C:1F:64:83:80:00/36\tDrimaes Inc.\n8C:1F:64:83:90:00/36\tCEDAR Audio Ltd\n8C:1F:64:83:A0:00/36\tGrossenbacher Systeme AG\n8C:1F:64:83:C0:00/36\tXtend Technologies Pvt Ltd\n8C:1F:64:83:D0:00/36\tL-signature\n8C:1F:64:83:E0:00/36\tSicon srl\n8C:1F:64:84:20:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:84:60:00/36\tFo Xie Optoelectronics Technology Co., Ltd\n8C:1F:64:84:80:00/36\tJena-Optronik GmbH\n8C:1F:64:84:90:00/36\tTalleres de Escoriaza SAU\n8C:1F:64:84:A0:00/36\tBitmapper Integration Technologies Private Limited\n8C:1F:64:84:C0:00/36\tAvMap srlu\n8C:1F:64:84:D0:00/36\tDave Srl\n8C:1F:64:84:E0:00/36\tWest Pharmaceutical Services, Inc.\n8C:1F:64:85:20:00/36\tAbb\n8C:1F:64:85:50:00/36\te.kundenservice Netz GmbH\n8C:1F:64:85:60:00/36\tGarten Automation\n8C:1F:64:85:70:00/36\troda computer GmbH\n8C:1F:64:85:80:00/36\tSFERA srl\n8C:1F:64:85:A0:00/36\tENBIK Technology Co., Ltd\n8C:1F:64:85:B0:00/36\tAtlantic Pumps Ltd\n8C:1F:64:85:C0:00/36\tZing 5g Communications Canada Inc.\n8C:1F:64:85:E0:00/36\tApen Group S.p.A.  (VAT IT08767740155)\n8C:1F:64:85:F0:00/36\tNEC Asia Pacific Pte Ltd\n8C:1F:64:86:30:00/36\tEngiNe srl\n8C:1F:64:86:40:00/36\tIMI Thomson Valves\n8C:1F:64:86:60:00/36\tUnitron Systems b.v.\n8C:1F:64:86:70:00/36\tForever Engineering Systems Pvt. Ltd.\n8C:1F:64:86:80:00/36\tShenzhen Peake Technology Co.,Ltd.\n8C:1F:64:86:A0:00/36\tVisionTools Bildanalyse Systeme GmbH\n8C:1F:64:86:B0:00/36\tNyien-Yi Technology(Zhuhai)Co.,Ltd.\n8C:1F:64:86:C0:00/36\tAbbott Diagnostics Technologies AS\n8C:1F:64:86:F0:00/36\tNewEdge Signal Solutions LLC\n8C:1F:64:87:00:00/36\tChengdu Xiuwei TechnologyDevelopment Co., Ltd\n8C:1F:64:87:10:00/36\tENTE Sp. z o.o.\n8C:1F:64:87:50:00/36\tEPC Power Corporation\n8C:1F:64:87:60:00/36\tfmad engineering\n8C:1F:64:87:80:00/36\tGreen Access Ltd\n8C:1F:64:87:90:00/36\tASHIDA Electronics Pvt. Ltd\n8C:1F:64:87:B0:00/36\tJSE s.r.o.\n8C:1F:64:87:C0:00/36\tENA Solution\n8C:1F:64:88:00:00/36\tMB connect line GmbH Fernwartungssysteme\n8C:1F:64:88:10:00/36\tFlextronics International Kft\n8C:1F:64:88:20:00/36\tTmy Technology Inc.\n8C:1F:64:88:30:00/36\tDEUTA-WERKE GmbH\n8C:1F:64:88:80:00/36\tNARI TECH Co., Ltd\n8C:1F:64:88:90:00/36\tPrivate\n8C:1F:64:88:A0:00/36\tLongoo Limited\n8C:1F:64:88:B0:00/36\tTaiwan Aulisa Medical Devices Technologies, Inc\n8C:1F:64:88:C0:00/36\tSAL Navigation AB\n8C:1F:64:88:D0:00/36\tPantherun Technologies Pvt Ltd\n8C:1F:64:88:E0:00/36\tCubeWorks, Inc.\n8C:1F:64:89:00:00/36\tWonATech Co., Ltd.\n8C:1F:64:89:10:00/36\tBrocere electronics corp. ltd.\n8C:1F:64:89:20:00/36\tMDI Industrial\n8C:1F:64:89:50:00/36\tDacom West GmbH\n8C:1F:64:89:80:00/36\tCopper Connections Ltd\n8C:1F:64:89:90:00/36\tAmerican Edge IP\n8C:1F:64:89:E0:00/36\tCinetix Srl\n8C:1F:64:8A:00:00/36\tH&abyz\n8C:1F:64:8A:40:00/36\tGenesis Technologies AG\n8C:1F:64:8A:80:00/36\tMassachusetts Institute of Technology\n8C:1F:64:8A:90:00/36\tGuan Show Technologe Co., Ltd.\n8C:1F:64:8A:A0:00/36\tForever Engineering Systems Pvt. Ltd.\n8C:1F:64:8A:B0:00/36\tAsml Us, Lp\n8C:1F:64:8A:C0:00/36\tBOZHON Precision Industry Technology Co.,Ltd\n8C:1F:64:8A:D0:00/36\tGateview Technologies\n8C:1F:64:8A:E0:00/36\tShenzhen Qunfang Technology Co., LTD.\n8C:1F:64:8A:F0:00/36\tIbeos\n8C:1F:64:8B:10:00/36\tViewpixel Pvt. Ltd.\n8C:1F:64:8B:20:00/36\tAbbott Diagnostics Technologies AS\n8C:1F:64:8B:30:00/36\tHubbell Power Systems\n8C:1F:64:8B:50:00/36\tAshton Bentley Collaboration Spaces\n8C:1F:64:8B:60:00/36\tAXIS Sp z o.o.\n8C:1F:64:8B:70:00/36\tDA-Design Oy\n8C:1F:64:8B:80:00/36\tWien Energie GmbH\n8C:1F:64:8B:90:00/36\tZynex Monitoring Solutions\n8C:1F:64:8B:C0:00/36\tPeter Huber Kaeltemaschinenbau SE\n8C:1F:64:8B:E0:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:8C:20:00/36\tCirrus Systems, Inc.\n8C:1F:64:8C:40:00/36\tHermes Network Inc\n8C:1F:64:8C:50:00/36\tNextT Microwave Inc\n8C:1F:64:8C:A0:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:8C:B0:00/36\tChromaviso A/S\n8C:1F:64:8C:D0:00/36\tGuan Show Technologe Co., Ltd.\n8C:1F:64:8C:E0:00/36\tSanmina SCI Medical\n8C:1F:64:8C:F0:00/36\tDiffraction Limited\n8C:1F:64:8D:00:00/36\tEnerthing GmbH\n8C:1F:64:8D:10:00/36\tOrlaco Products B.V.\n8C:1F:64:8D:40:00/36\tRecab Sweden AB\n8C:1F:64:8D:50:00/36\tAgramkow A/S\n8C:1F:64:8D:60:00/36\tADC Global Technology Sdn Bhd\n8C:1F:64:8D:80:00/36\tMbv Ag\n8C:1F:64:8D:90:00/36\tPietro Fiorentini Spa\n8C:1F:64:8D:A0:00/36\tDart Systems Ltd\n8C:1F:64:8D:E0:00/36\tIconet Services\n8C:1F:64:8D:F0:00/36\tGrossenbacher Systeme AG\n8C:1F:64:8E:00:00/36\tReivax S/A Automação e Controle\n8C:1F:64:8E:20:00/36\tALPHA Corporation\n8C:1F:64:8E:30:00/36\tUniTik Technology Co., Limited\n8C:1F:64:8E:40:00/36\tCominfo, Inc.\n8C:1F:64:8E:50:00/36\tDruck Ltd.\n8C:1F:64:8E:80:00/36\tCominfo, Inc.\n8C:1F:64:8E:90:00/36\tVesperix Corporation\n8C:1F:64:8E:B0:00/36\tNuma Products LLC\n8C:1F:64:8E:C0:00/36\tLMS Services GmbH & Co. KG\n8C:1F:64:8E:E0:00/36\tAbbott Diagnostics Technologies AS\n8C:1F:64:8F:00:00/36\tIgl\n8C:1F:64:8F:40:00/36\tLoadrite (Auckland) Limited\n8C:1F:64:8F:50:00/36\tDave Srl\n8C:1F:64:8F:60:00/36\tIdneo Technologies S.A.U.\n8C:1F:64:8F:80:00/36\tHIGHVOLT Prüftechnik\n8C:1F:64:8F:B0:00/36\tTelevic Rail GmbH\n8C:1F:64:8F:E0:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:8F:F0:00/36\tKruger DB Series Indústria Eletrônica ltda\n8C:1F:64:90:10:00/36\tComrex\n8C:1F:64:90:20:00/36\tTimeMachines Inc.\n8C:1F:64:90:30:00/36\tPortrait Displays, Inc.\n8C:1F:64:90:40:00/36\tHensoldt Sensors GmbH\n8C:1F:64:90:50:00/36\tQualitrol LLC\n8C:1F:64:90:70:00/36\tSicon srl\n8C:1F:64:90:90:00/36\tMatelex\n8C:1F:64:90:C0:00/36\tCool Air Incorporated\n8C:1F:64:90:D0:00/36\tAlgodue Elettronica Srl\n8C:1F:64:90:E0:00/36\tXacti Corporation\n8C:1F:64:90:F0:00/36\tBELIMO Automation AG\n8C:1F:64:91:00:00/36\tVortex IoT Ltd\n8C:1F:64:91:10:00/36\tEolane\n8C:1F:64:91:20:00/36\tMARIAN GmbH\n8C:1F:64:91:30:00/36\tZeus Product Design Ltd\n8C:1F:64:91:40:00/36\tMitomi Giken Co.,Ltd\n8C:1F:64:91:80:00/36\tAbbott Diagnostics Technologies AS\n8C:1F:64:91:A0:00/36\tProfcon AB\n8C:1F:64:91:B0:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:91:C0:00/36\tCospowers Changsha Branch\n8C:1F:64:91:D0:00/36\tenlighten\n8C:1F:64:92:00:00/36\tVuWall Technology Europe GmbH\n8C:1F:64:92:10:00/36\tAbbott Diagnostics Technologies AS\n8C:1F:64:92:30:00/36\tMB connect line GmbH Fernwartungssysteme\n8C:1F:64:92:40:00/36\tMagics Technologies\n8C:1F:64:92:60:00/36\tMJK Automation AB\n8C:1F:64:92:70:00/36\tBTG Instruments AB\n8C:1F:64:92:80:00/36\tITG Co.Ltd\n8C:1F:64:92:A0:00/36\tThermo Onix Ltd\n8C:1F:64:92:D0:00/36\tIVOR Intelligent Electrical Appliance Co., Ltd\n8C:1F:64:93:10:00/36\tNoptel Oy\n8C:1F:64:93:50:00/36\tBreas Medical AB\n8C:1F:64:93:60:00/36\tJiangsu Eman Electronic Technology Co., Ltd\n8C:1F:64:93:70:00/36\tH2Ok Innovations\n8C:1F:64:93:90:00/36\tSPIT Technology, Inc\n8C:1F:64:93:A0:00/36\tRejås of Sweden AB\n8C:1F:64:94:10:00/36\tLorenz GmbH & Co. KG\n8C:1F:64:94:30:00/36\tAutark GmbH\n8C:1F:64:94:50:00/36\tDeqin Showcase\n8C:1F:64:94:60:00/36\tUniJet Co., Ltd.\n8C:1F:64:94:70:00/36\tLLC \"TC \"Vympel\"\n8C:1F:64:94:90:00/36\ttickIoT Inc.\n8C:1F:64:94:A0:00/36\tVision Systems Safety Tech\n8C:1F:64:94:C0:00/36\tBcmtech\n8C:1F:64:94:E0:00/36\tMonnit Corporation\n8C:1F:64:94:F0:00/36\tFörster Technik GmbH\n8C:1F:64:95:30:00/36\tVAF Instruments BV\n8C:1F:64:95:60:00/36\tPaulmann Licht GmbH\n8C:1F:64:95:80:00/36\tSanchar Telesystems limited\n8C:1F:64:95:A0:00/36\tShenzhen Longyun Lighting Electric Appliances Co., Ltd\n8C:1F:64:95:B0:00/36\tQualitel Corporation\n8C:1F:64:95:C0:00/36\tFasetto, Inc.\n8C:1F:64:95:E0:00/36\tLandis+Gyr Equipamentos de Medição Ltda\n8C:1F:64:96:20:00/36\tUmano Medical Inc.\n8C:1F:64:96:30:00/36\tGogo Business Aviation\n8C:1F:64:96:40:00/36\tPower Electronics Espana, S.L.\n8C:1F:64:96:50:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:96:60:00/36\tRaster Images Pvt. Ltd\n8C:1F:64:96:70:00/36\tDave Srl\n8C:1F:64:96:80:00/36\tIav Engineering Sarl\n8C:1F:64:96:A0:00/36\tEA Elektro-Automatik GmbH\n8C:1F:64:96:B0:00/36\tVantageo Private Limited\n8C:1F:64:97:00:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:97:10:00/36\tInfrasafe/ Advantor Systems\n8C:1F:64:97:30:00/36\tDorsett Technologies Inc\n8C:1F:64:97:80:00/36\tPlanet Innovation Products Inc.\n8C:1F:64:97:90:00/36\tArktis Radiation Detectors\n8C:1F:64:97:C0:00/36\tMB connect line GmbH Fernwartungssysteme\n8C:1F:64:97:D0:00/36\tKSE GmbH\n8C:1F:64:97:E0:00/36\tSona Networks Private Limited\n8C:1F:64:97:F0:00/36\tTalleres de Escoriaza SA\n8C:1F:64:98:40:00/36\tAbacus Peripherals Pvt Ltd\n8C:1F:64:98:70:00/36\tPeter Huber Kaeltemaschinenbau SE\n8C:1F:64:98:90:00/36\tPhe-nX B.V.\n8C:1F:64:98:A0:00/36\tLigpt\n8C:1F:64:98:B0:00/36\tSyscom Instruments SA\n8C:1F:64:98:C0:00/36\tPAN Business & Consulting (ANYOS]\n8C:1F:64:98:D0:00/36\tAksel sp. z o.o.\n8C:1F:64:98:F0:00/36\tBreas Medical AB\n8C:1F:64:99:10:00/36\tDB Systel GmbH\n8C:1F:64:99:30:00/36\tApplied Electro Magnetics Pvt. Ltd.\n8C:1F:64:99:40:00/36\tuHave Control, Inc\n8C:1F:64:99:80:00/36\tEVLO Stockage Énergie\n8C:1F:64:99:90:00/36\tAdvanced Techne\n8C:1F:64:99:C0:00/36\ti2A Systems Co., Ltd.\n8C:1F:64:99:E0:00/36\tEIDOS s.r.l.\n8C:1F:64:9A:10:00/36\tPacific Software Development Co., Ltd.\n8C:1F:64:9A:20:00/36\tLadyBug Technologies, LLC\n8C:1F:64:9A:40:00/36\tLabLogic Systems\n8C:1F:64:9A:50:00/36\tXi‘an Shengxin Science& Technology Development Co.?Ltd.\n8C:1F:64:9A:60:00/36\tInstituto De Gestão, Redes Tecnológicas E Nergias\n8C:1F:64:9A:90:00/36\tTiama\n8C:1F:64:9A:B0:00/36\tDave Srl\n8C:1F:64:9A:C0:00/36\tHangzhou Jingtang Communication Technology Co.,Ltd.\n8C:1F:64:9B:20:00/36\tEmerson Rosemount Analytical\n8C:1F:64:9B:30:00/36\tBöckelt GmbH\n8C:1F:64:9B:50:00/36\tBerkeley Nucleonics Corp\n8C:1F:64:9B:60:00/36\tGS Elektromedizinsiche Geräte G. Stemple GmbH\n8C:1F:64:9B:70:00/36\tStercom Power Soltions GmbH\n8C:1F:64:9B:80:00/36\tMakel Elektrik Malzemeleri A.Ş.\n8C:1F:64:9B:90:00/36\tQuercus Technologies, S.L.\n8C:1F:64:9B:A0:00/36\tWintus System\n8C:1F:64:9B:D0:00/36\tAtm Solutions\n8C:1F:64:9B:F0:00/36\tArgusEye TECH. INC\n8C:1F:64:9C:00:00/36\tHeader Rhyme\n8C:1F:64:9C:10:00/36\tRealWear\n8C:1F:64:9C:30:00/36\tCamozzi Automation SpA\n8C:1F:64:9C:60:00/36\tGolding Audio Ltd\n8C:1F:64:9C:A0:00/36\tEDC Acoustics\n8C:1F:64:9C:B0:00/36\tShanghai Sizhong Information Technology Co., Ltd\n8C:1F:64:9C:D0:00/36\tJiangYu Innovative Medical Technology\n8C:1F:64:9C:E0:00/36\tExi Flow Measurement Ltd\n8C:1F:64:9C:F0:00/36\tASAP Electronics GmbH\n8C:1F:64:9D:00:00/36\tSaline Lectronics, Inc.\n8C:1F:64:9D:30:00/36\tEA Elektro-Automatik GmbH\n8C:1F:64:9D:40:00/36\tWolfspyre Labs\n8C:1F:64:9D:80:00/36\tInteger.pl S.A.\n8C:1F:64:9D:90:00/36\tEPC Power Corporation\n8C:1F:64:9D:B0:00/36\tHD Renewable Energy Co.,Ltd\n8C:1F:64:9D:F0:00/36\tastTECS Communications Private Limited\n8C:1F:64:9E:00:00/36\tDruck Ltd.\n8C:1F:64:9E:20:00/36\tTechnology for Energy Corp\n8C:1F:64:9E:40:00/36\tRMDS innovation inc.\n8C:1F:64:9E:50:00/36\tSchunk Sonosystems GmbH\n8C:1F:64:9E:60:00/36\tMB connect line GmbH Fernwartungssysteme\n8C:1F:64:9E:70:00/36\tMicroPilot Inc.\n8C:1F:64:9E:80:00/36\tGHM Messtechnik GmbH\n8C:1F:64:9E:A0:00/36\tMSolutions\n8C:1F:64:9E:C0:00/36\tSpecialized Communications Corp.\n8C:1F:64:9F:00:00/36\tePlant, Inc.\n8C:1F:64:9F:10:00/36\tSkymira\n8C:1F:64:9F:20:00/36\tMB connect line GmbH Fernwartungssysteme\n8C:1F:64:9F:40:00/36\tGrossenbacher Systeme AG\n8C:1F:64:9F:50:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:9F:60:00/36\tVision Systems Safety Tech\n8C:1F:64:9F:80:00/36\tExypnos - Creative Solutions LTD\n8C:1F:64:9F:A0:00/36\tMETRONA-Union GmbH\n8C:1F:64:9F:B0:00/36\tCi Systems Israel Ltd\n8C:1F:64:9F:D0:00/36\tVishay Nobel AB\n8C:1F:64:9F:E0:00/36\tMetroval Controle de Fluidos Ltda\n8C:1F:64:9F:F0:00/36\tSatelles Inc\n8C:1F:64:A0:00:00/36\tBITECHNIK GmbH\n8C:1F:64:A0:10:00/36\tGuan Show Technologe Co., Ltd.\n8C:1F:64:A0:60:00/36\tsecutech Co.,Ltd.\n8C:1F:64:A0:70:00/36\tGJD Manufacturing\n8C:1F:64:A0:80:00/36\tStatcon Electronics India Ltd.\n8C:1F:64:A0:A0:00/36\tShanghai Wise-Tech Intelligent Technology Co.,Ltd.\n8C:1F:64:A0:B0:00/36\tChannel Master LLC\n8C:1F:64:A0:D0:00/36\tLumiplan Duhamel\n8C:1F:64:A0:E0:00/36\tElac Americas Inc.\n8C:1F:64:A0:F0:00/36\tDorlet Sau\n8C:1F:64:A1:20:00/36\tFUJIHENSOKUKI Co., Ltd.\n8C:1F:64:A1:30:00/36\tINVENTIA Sp. z o.o.\n8C:1F:64:A1:40:00/36\tUplusit\n8C:1F:64:A1:50:00/36\tSee All AI Inc.\n8C:1F:64:A1:70:00/36\tPneumax Spa\n8C:1F:64:A1:B0:00/36\tZilica Limited\n8C:1F:64:A1:C0:00/36\tmanageon\n8C:1F:64:A1:F0:00/36\tHitachi Energy  India Limited\n8C:1F:64:A2:00:00/36\tIntenseye Inc.\n8C:1F:64:A2:60:00/36\tAutomatic Pty Ltd\n8C:1F:64:A2:70:00/36\tNapino Continental Vehicle Elctronics Private Limited\n8C:1F:64:A2:90:00/36\tRingtail Security\n8C:1F:64:A2:B0:00/36\tWENet Vietnam Joint Stock company\n8C:1F:64:A2:D0:00/36\tACSL Ltd.\n8C:1F:64:A2:E0:00/36\tEA Elektro-Automatik GmbH\n8C:1F:64:A3:00:00/36\tTMP Srl\n8C:1F:64:A3:10:00/36\tZing Communications Inc\n8C:1F:64:A3:20:00/36\tNautel LTD\n8C:1F:64:A3:30:00/36\tRT Vision Technologies PVT LTD\n8C:1F:64:A3:40:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:A3:50:00/36\tJoust Security Inc.\n8C:1F:64:A3:60:00/36\tDongguan Gago Electronics Co.,Ltd\n8C:1F:64:A3:80:00/36\tNuGrid Power\n8C:1F:64:A3:90:00/36\tMG s.r.l.\n8C:1F:64:A3:B0:00/36\tFujian Satlink Electronics Co., Ltd\n8C:1F:64:A3:E0:00/36\tHiwin Mikrosystem Corp.\n8C:1F:64:A3:F0:00/36\tViewSonic Corp\n8C:1F:64:A4:20:00/36\tRodgers Instruments US LLC\n8C:1F:64:A4:40:00/36\tRapidev Pvt Ltd\n8C:1F:64:A4:50:00/36\tU -Mei-Dah Int'L Enterprise Co.,Ltd.\n8C:1F:64:A4:70:00/36\tSaarni Cloud Oy\n8C:1F:64:A4:80:00/36\tWallenius Water Innovation AB\n8C:1F:64:A4:90:00/36\tInteger.pl S.A.\n8C:1F:64:A4:A0:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:A4:C0:00/36\tFlextronics International Kft\n8C:1F:64:A4:E0:00/36\tSyscom Instruments SA\n8C:1F:64:A4:F0:00/36\tAscon Tecnologic S.r.l.\n8C:1F:64:A5:10:00/36\tBabtel\n8C:1F:64:A5:60:00/36\tFlextronics International Kft\n8C:1F:64:A5:70:00/36\tEkspertStroyProekt\n8C:1F:64:A5:A0:00/36\tUniPOS EOOD\n8C:1F:64:A5:C0:00/36\tProsys\n8C:1F:64:A5:D0:00/36\tShenzhen zhushida Technology lnformation Co.,Ltd\n8C:1F:64:A5:E0:00/36\tXTIA Ltd.\n8C:1F:64:A5:F0:00/36\tWattson Audio SA\n8C:1F:64:A6:00:00/36\tActive Optical Systems, LLC\n8C:1F:64:A6:10:00/36\tBreas Medical AB\n8C:1F:64:A6:70:00/36\tElectrovymir LLC\n8C:1F:64:A6:A0:00/36\tSphere Com Services Pvt Ltd\n8C:1F:64:A6:D0:00/36\tCyberneX Co., Ltd\n8C:1F:64:A6:E0:00/36\tshenzhen beswave co.,ltd\n8C:1F:64:A6:F0:00/36\tCardinal Scales Manufacturing Co\n8C:1F:64:A7:00:00/36\tV-teknik Elektronik AB\n8C:1F:64:A7:10:00/36\tMartec S.p.A.\n8C:1F:64:A7:50:00/36\tProcon Electronics Pty Ltd\n8C:1F:64:A7:60:00/36\tDEUTA-WERKE GmbH\n8C:1F:64:A7:70:00/36\tRax-Tech International\n8C:1F:64:A7:B0:00/36\tCPAT Flex Inc.\n8C:1F:64:A7:C0:00/36\tProprietary Controls Systems Corporation\n8C:1F:64:A8:00:00/36\tNEXTtec srl\n8C:1F:64:A8:10:00/36\t3D perception AS\n8C:1F:64:A8:30:00/36\tEkspertStroyProekt\n8C:1F:64:A8:40:00/36\tBeijing Wenrise Technology Co., Ltd.\n8C:1F:64:A8:60:00/36\tGlobal Design Tech(ZS) Co.,Ltd\n8C:1F:64:A8:70:00/36\tMorgen Technology\n8C:1F:64:A8:90:00/36\tMitsubishi Electric India Pvt. Ltd.\n8C:1F:64:A8:C0:00/36\tElektronik Art\n8C:1F:64:A9:00:00/36\tDSGio Global Pte Ltd\n8C:1F:64:A9:10:00/36\tInfinitive Group Limited\n8C:1F:64:A9:20:00/36\tAgrology, PBC\n8C:1F:64:A9:40:00/36\tFuture wave ultra tech Company\n8C:1F:64:A9:70:00/36\tInteger.pl S.A.\n8C:1F:64:A9:80:00/36\tJacobs Technology, Inc.\n8C:1F:64:A9:A0:00/36\tSignasystems Elektronik San. ve Tic. Ltd. Sti.\n8C:1F:64:A9:B0:00/36\tOvide Maudet SL\n8C:1F:64:A9:C0:00/36\tUpstart Power\n8C:1F:64:A9:D0:00/36\tAegex Technologies LLC Magyarországi Fióktelepe\n8C:1F:64:A9:E0:00/36\tOptimum Instruments Inc.\n8C:1F:64:AA:00:00/36\tFlextronics International Kft\n8C:1F:64:AA:10:00/36\tTech Fass s.r.o.\n8C:1F:64:AA:30:00/36\tPeter Huber Kaeltemaschinenbau SE\n8C:1F:64:AA:40:00/36\tHEINEN ELEKTRONIK GmbH\n8C:1F:64:AA:60:00/36\tData Conversion Systems Ltd\n8C:1F:64:AA:70:00/36\tShenzhen Anliji Electronics Co.,Ltd\n8C:1F:64:AA:80:00/36\taxelife\n8C:1F:64:AA:A0:00/36\tLeder Elektronik Design GmbH\n8C:1F:64:AA:B0:00/36\tBlueSword Intelligent Technology Co., Ltd.\n8C:1F:64:AB:30:00/36\tVelvu Technologies Private Limited\n8C:1F:64:AB:40:00/36\tBeijing Zhongchen Microelectronics Co.,Ltd\n8C:1F:64:AB:50:00/36\tJustmorph Pte. Ltd.\n8C:1F:64:AB:60:00/36\tEMIT GmbH\n8C:1F:64:AB:70:00/36\tMClavis Co.,Ltd.\n8C:1F:64:AB:80:00/36\tPrivate\n8C:1F:64:AB:E0:00/36\tTAIYO DENON Corporation\n8C:1F:64:AB:F0:00/36\tStackiot Technologies Private Limited\n8C:1F:64:AC:00:00/36\tAIQuatro\n8C:1F:64:AC:10:00/36\tKA Imaging Inc.\n8C:1F:64:AC:30:00/36\tWaves System\n8C:1F:64:AC:40:00/36\tcomelec\n8C:1F:64:AC:50:00/36\tForever Engineering Systems Pvt. Ltd.\n8C:1F:64:AC:80:00/36\tTeledatics Incorporated\n8C:1F:64:AC:90:00/36\tShenYang LeShun Technology Co.,Ltd\n8C:1F:64:AC:B0:00/36\tVillari B.V.\n8C:1F:64:AC:D0:00/36\tEscape Velocity Technologies\n8C:1F:64:AC:E0:00/36\tRayhaan Networks\n8C:1F:64:AD:00:00/36\tElektrotechnik & Elektronik Oltmann GmbH\n8C:1F:64:AD:20:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:AD:30:00/36\tWorking Set Software Solutions\n8C:1F:64:AD:40:00/36\tFlextronics International Kft\n8C:1F:64:AD:70:00/36\tMonnit Corporation\n8C:1F:64:AD:80:00/36\tNovanta IMS\n8C:1F:64:AD:B0:00/36\tHebei Weiji Electric Co.,Ltd\n8C:1F:64:AD:C0:00/36\tMotor Protection Electronics\n8C:1F:64:AE:10:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:AE:20:00/36\tJiangsu Yi Rong Mstar Technology Ltd.\n8C:1F:64:AE:30:00/36\tPrivate\n8C:1F:64:AE:50:00/36\tLtec Co.,Ltd\n8C:1F:64:AE:80:00/36\tAdetec Sas\n8C:1F:64:AE:90:00/36\tEnnple\n8C:1F:64:AE:A0:00/36\tINHEMETER Co.,Ltd\n8C:1F:64:AE:C0:00/36\tPixel Design & Manufacturing Sdn. Bhd.\n8C:1F:64:AE:D0:00/36\tMB connect line GmbH Fernwartungssysteme\n8C:1F:64:AE:F0:00/36\tScenario Automation\n8C:1F:64:AF:00:00/36\tMinebeaMitsumi Inc.\n8C:1F:64:AF:10:00/36\tE-S-Tel\n8C:1F:64:AF:30:00/36\tHY smart\n8C:1F:64:AF:40:00/36\tNokia Bell Labs\n8C:1F:64:AF:50:00/36\tSanmina Israel Medical Systems Ltd\n8C:1F:64:AF:70:00/36\tard sa\n8C:1F:64:AF:80:00/36\tPower Electronics Espana, S.L.\n8C:1F:64:AF:90:00/36\tGrossenbacher Systeme AG\n8C:1F:64:AF:A0:00/36\tData Electronic Devices, Inc\n8C:1F:64:AF:D0:00/36\tUniversal Robots A/S\n8C:1F:64:AF:E0:00/36\tMotec USA, Inc.\n8C:1F:64:AF:F0:00/36\tQtechnology A/S\n8C:1F:64:B0:00:00/36\tGets MSS\n8C:1F:64:B0:10:00/36\tBlue Ocean UG\n8C:1F:64:B0:30:00/36\tShenzhen Pisoftware Technology Co.,Ltd.\n8C:1F:64:B0:80:00/36\tCronus Electronics\n8C:1F:64:B0:C0:00/36\tBarkodes Bilgisayar Sistemleri Bilgi Iletisim ve Y\n8C:1F:64:B0:F0:00/36\tHKC Security Ltd.\n8C:1F:64:B1:00:00/36\tMTU Aero Engines AG\n8C:1F:64:B1:30:00/36\tAbode Systems Inc\n8C:1F:64:B1:40:00/36\tMurata Manufacturing CO., Ltd.\n8C:1F:64:B1:70:00/36\tDAT Informatics Pvt Ltd\n8C:1F:64:B1:80:00/36\tGrossenbacher Systeme AG\n8C:1F:64:B1:90:00/36\tDITRON S.r.l.\n8C:1F:64:B1:B0:00/36\tNov'in\n8C:1F:64:B1:D0:00/36\tTocho Marking Systems America, Inc\n8C:1F:64:B1:F0:00/36\twincker international enterprise co., ltd\n8C:1F:64:B2:00:00/36\tLechpol Electronics Spółka z o.o. Sp.k.\n8C:1F:64:B2:20:00/36\tBlighter Surveillance Systems Ltd\n8C:1F:64:B2:40:00/36\tAbb\n8C:1F:64:B2:60:00/36\tAVL DiTEST GmbH\n8C:1F:64:B2:70:00/36\tInHandPlus Inc.\n8C:1F:64:B2:80:00/36\tSeason Electronics Ltd\n8C:1F:64:B2:A0:00/36\tLumiplan Duhamel\n8C:1F:64:B2:B0:00/36\tRhombus Europe\n8C:1F:64:B2:C0:00/36\tSanmina Israel Medical Systems Ltd\n8C:1F:64:B2:D0:00/36\twonder meditec\n8C:1F:64:B2:F0:00/36\tMtechnology - Gamma Commerciale Srl\n8C:1F:64:B3:20:00/36\tPlug Power\n8C:1F:64:B3:60:00/36\tPneumax Spa\n8C:1F:64:B3:70:00/36\tFlextronics International Kft\n8C:1F:64:B3:A0:00/36\tdream DNS\n8C:1F:64:B3:B0:00/36\tSicon srl\n8C:1F:64:B3:C0:00/36\tSafepro AI Video Research Labs Pvt Ltd\n8C:1F:64:B3:D0:00/36\tRealD, Inc.\n8C:1F:64:B3:F0:00/36\tFell Technology AS\n8C:1F:64:B4:10:00/36\tState Grid Intelligence Technology Co.,Ltd.\n8C:1F:64:B4:60:00/36\tPhygitall Soluções Em Internet Das Coisas\n8C:1F:64:B4:70:00/36\tLineage Power Pvt Ltd.,\n8C:1F:64:B4:C0:00/36\tPicocom Technology Ltd\n8C:1F:64:B4:F0:00/36\tVaunix Technology Corporation\n8C:1F:64:B5:40:00/36\tFramatome Inc.\n8C:1F:64:B5:50:00/36\tSanchar Telesystems limited\n8C:1F:64:B5:60:00/36\tArcvideo\n8C:1F:64:B5:90:00/36\tVision Systems Safety Tech\n8C:1F:64:B5:A0:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:B5:B0:00/36\tTri-light Wuhan Electronics Technology Co.,Ltd\n8C:1F:64:B5:F0:00/36\tCode Blue Corporation\n8C:1F:64:B6:10:00/36\tBreas Medical AB\n8C:1F:64:B6:40:00/36\tTelevic Rail GmbH\n8C:1F:64:B6:50:00/36\tHomyHub SL\n8C:1F:64:B6:70:00/36\tM2M craft Co., Ltd.\n8C:1F:64:B6:80:00/36\tAll-Systems Electronics Pty Ltd\n8C:1F:64:B6:90:00/36\tQuanxing Tech Co.,LTD\n8C:1F:64:B6:A0:00/36\tMobileye Vision Technologies LTD\n8C:1F:64:B6:B0:00/36\tKELC Electronics System Co., LTD.\n8C:1F:64:B6:C0:00/36\tLaser Mechanisms, Inc.\n8C:1F:64:B6:D0:00/36\tAndy-L Ltd\n8C:1F:64:B6:E0:00/36\tLoop Technologies\n8C:1F:64:B6:F0:00/36\tProsecure Fzco\n8C:1F:64:B7:10:00/36\tSichuan Youke Communication Technology Co., Ltd\n8C:1F:64:B7:30:00/36\tComm-ence, Inc.\n8C:1F:64:B7:70:00/36\tCarestream Dental LLC\n8C:1F:64:B7:90:00/36\tAddSecure Smart Grids\n8C:1F:64:B7:A0:00/36\tMG s.r.l.\n8C:1F:64:B7:B0:00/36\tGateview Technologies\n8C:1F:64:B7:C0:00/36\tEvernet Co,.Ltd Taiwan\n8C:1F:64:B7:D0:00/36\tScheurich GmbH\n8C:1F:64:B8:10:00/36\tProlife Equipamentos Médicos Ltda.\n8C:1F:64:B8:20:00/36\tSeed Core Co., LTD.\n8C:1F:64:B8:30:00/36\tShenZhen Australis Electronic Technology Co.,Ltd.\n8C:1F:64:B8:40:00/36\tSPX Flow Technology\n8C:1F:64:B8:50:00/36\tCandela Technologies Inc\n8C:1F:64:B8:60:00/36\tElektronik & Modellprodukter Gävle AB\n8C:1F:64:B8:80:00/36\tINTRONIK GmbH\n8C:1F:64:B8:B0:00/36\tDogWatch Inc\n8C:1F:64:B8:D0:00/36\tTongye lnnovation Science and Technology (Shenzhen) Co.,Ltd\n8C:1F:64:B8:E0:00/36\tRevert Technologies\n8C:1F:64:B9:10:00/36\tClealink Technology\n8C:1F:64:B9:20:00/36\tNeurable\n8C:1F:64:B9:30:00/36\tModern Server Solutions LLP\n8C:1F:64:B9:60:00/36\tObservable Space\n8C:1F:64:B9:70:00/36\tGemini Electronics B.V.\n8C:1F:64:B9:80:00/36\tCalamity, Inc.\n8C:1F:64:B9:90:00/36\tiLifeX\n8C:1F:64:B9:A0:00/36\tQuercus Technologies, S.L.\n8C:1F:64:B9:B0:00/36\tKromek Limited\n8C:1F:64:B9:E0:00/36\tPower Electronics Espana, S.L.\n8C:1F:64:B9:F0:00/36\tLithion Battery Inc\n8C:1F:64:BA:00:00/36\tJmv Lps Ltd\n8C:1F:64:BA:20:00/36\tBESO sp. z o.o.\n8C:1F:64:BA:30:00/36\tDEUTA-WERKE GmbH\n8C:1F:64:BA:60:00/36\tFMC Technologies Measurement Solutions Inc\n8C:1F:64:BA:70:00/36\tiLensys Technologies PVT LTD\n8C:1F:64:BA:80:00/36\tAvMap srlu\n8C:1F:64:BA:90:00/36\tBeijing Fuzheng Transportation Technology Co., Ltd\n8C:1F:64:BA:A0:00/36\tMine Vision Systems\n8C:1F:64:BA:B0:00/36\tYcn\n8C:1F:64:BA:D0:00/36\tJemac Sweden AB\n8C:1F:64:BA:E0:00/36\tTieline Research Pty Ltd\n8C:1F:64:BA:F0:00/36\tELKA - Torantriebe GmbH u. Co. Betriebs KG\n8C:1F:64:BB:00:00/36\tShanghai Sansi Electronic Engineering Co., Ltd.\n8C:1F:64:BB:10:00/36\tTransit Solutions, LLC.\n8C:1F:64:BB:20:00/36\tGrupo Epelsa S.L.\n8C:1F:64:BB:30:00/36\tZaruc Tecnologia LTDA\n8C:1F:64:BB:40:00/36\tHIGH RIGHT CO.,Ltd\n8C:1F:64:BB:60:00/36\tNEOiD\n8C:1F:64:BB:70:00/36\tJiangxi Lv C-Chong Charging Technology Co.Ltd\n8C:1F:64:BB:80:00/36\tezDOOR, LLC\n8C:1F:64:BB:90:00/36\tSmartD Technologies Inc\n8C:1F:64:BB:A0:00/36\telysia GmbH\n8C:1F:64:BB:C0:00/36\tLiberator Pty Ltd\n8C:1F:64:BB:E0:00/36\tAirScan, Inc. dba HemaTechnologies\n8C:1F:64:BB:F0:00/36\tRetency\n8C:1F:64:BC:00:00/36\tGS Elektromedizinsiche Geräte G. Stemple GmbH\n8C:1F:64:BC:10:00/36\tCominTech, LLC\n8C:1F:64:BC:20:00/36\tHuz Electronics Ltd\n8C:1F:64:BC:30:00/36\tFoxIoT OÜ\n8C:1F:64:BC:40:00/36\tEasyNet Industry (Shenzhen) Co., Ltd\n8C:1F:64:BC:60:00/36\tChengdu ZiChen Time&Frequency Technology Co.,Ltd\n8C:1F:64:BC:70:00/36\tUGUARD NETWORKS TECHNOLOGY Co.,LTD\n8C:1F:64:BC:90:00/36\tGl Tech Co.,Ltd\n8C:1F:64:BC:A0:00/36\tOPTOKON, a.s.\n8C:1F:64:BC:B0:00/36\tA&T Corporation\n8C:1F:64:BC:C0:00/36\tSound Health Systems\n8C:1F:64:BC:D0:00/36\tA.L.S.E.\n8C:1F:64:BC:E0:00/36\tBESO sp. z o.o.\n8C:1F:64:BD:20:00/36\tattocube systems AG\n8C:1F:64:BD:30:00/36\tIO Master Technology\n8C:1F:64:BD:50:00/36\tPro-Custom Group\n8C:1F:64:BD:60:00/36\tNOVA Products GmbH\n8C:1F:64:BD:70:00/36\tUnion Electronic.\n8C:1F:64:BD:90:00/36\tWatts\n8C:1F:64:BD:B0:00/36\tCardinal Scales Manufacturing Co\n8C:1F:64:BD:F0:00/36\tMas Technology\n8C:1F:64:BE:10:00/36\tGeolux\n8C:1F:64:BE:30:00/36\tReo Ag\n8C:1F:64:BE:80:00/36\tTechnologies Bacmove Inc.\n8C:1F:64:BE:D0:00/36\tGenius Sports SS LLC\n8C:1F:64:BE:E0:00/36\tSirius LLC\n8C:1F:64:BE:F0:00/36\tTriumph SEC\n8C:1F:64:BF:00:00/36\tNewtec A/S\n8C:1F:64:BF:10:00/36\tSoha Jin\n8C:1F:64:BF:20:00/36\tYujun Electricity Industry Co., Ltd\n8C:1F:64:BF:30:00/36\tAlphatek AS\n8C:1F:64:BF:40:00/36\tFluid Components Intl\n8C:1F:64:BF:50:00/36\tThe Urban Jungle Project\n8C:1F:64:BF:60:00/36\tPanoramic Power\n8C:1F:64:BF:80:00/36\tCdsi\n8C:1F:64:BF:B0:00/36\tTechArgos\n8C:1F:64:BF:C0:00/36\tASiS Technologies Pte Ltd\n8C:1F:64:BF:D0:00/36\tInnos Technologies\n8C:1F:64:BF:E0:00/36\tPuS GmbH und Co. KG\n8C:1F:64:BF:F0:00/36\tEvolution Ventures LLC\n8C:1F:64:C0:10:00/36\tHoriba Abx Sas\n8C:1F:64:C0:30:00/36\tAbiman Engineering\n8C:1F:64:C0:40:00/36\tSanwa Corporation\n8C:1F:64:C0:50:00/36\tSkyCell AG\n8C:1F:64:C0:60:00/36\tTardis Technology\n8C:1F:64:C0:70:00/36\tHYOSUNG Heavy Industries Corporation\n8C:1F:64:C0:80:00/36\tTriamec Motion AG\n8C:1F:64:C0:90:00/36\tS.E.I. Co.,Ltd.\n8C:1F:64:C0:A0:00/36\tAcrolabs,Inc\n8C:1F:64:C0:C0:00/36\tGiordano Controls Spa\n8C:1F:64:C0:D0:00/36\tAbbott Diagnostics Technologies AS\n8C:1F:64:C0:E0:00/36\tGoodtech AS dep Fredrikstad\n8C:1F:64:C1:20:00/36\tPHYSEC GmbH\n8C:1F:64:C1:30:00/36\tGlucoloop AG\n8C:1F:64:C1:60:00/36\tAlisonic Srl\n8C:1F:64:C1:70:00/36\tMetreg Technologies GmbH\n8C:1F:64:C1:90:00/36\tOOO \"Mig Trading\"\n8C:1F:64:C1:A0:00/36\tViewSonic Corp\n8C:1F:64:C1:B0:00/36\thiSky SCS Ltd\n8C:1F:64:C1:C0:00/36\tVektrex Electronics Systems, Inc.\n8C:1F:64:C1:E0:00/36\tVa Syd\n8C:1F:64:C1:F0:00/36\tEsys Srl\n8C:1F:64:C2:20:00/36\tPulcro.io LLC\n8C:1F:64:C2:40:00/36\tAlifax S.r.l.\n8C:1F:64:C2:70:00/36\tLift Ventures, Inc\n8C:1F:64:C2:80:00/36\tTornado Spectral Systems Inc.\n8C:1F:64:C2:90:00/36\tBRS Sistemas Eletrônicos\n8C:1F:64:C2:B0:00/36\tWuhan Xingtuxinke ELectronic Co.,Ltd\n8C:1F:64:C2:D0:00/36\tiENSO Inc.\n8C:1F:64:C2:F0:00/36\tPower Electronics Espana, S.L.\n8C:1F:64:C3:10:00/36\tAmbarella Inc.\n8C:1F:64:C3:50:00/36\tPeter Huber Kaeltemaschinenbau SE\n8C:1F:64:C3:60:00/36\tODTech Co., Ltd.\n8C:1F:64:C3:80:00/36\tEco-Adapt\n8C:1F:64:C3:A0:00/36\tYUSUR Technology Co., Ltd.\n8C:1F:64:C3:E0:00/36\tISMA Microsolutions INC\n8C:1F:64:C3:F0:00/36\tSonic Corporation\n8C:1F:64:C4:00:00/36\tSciospec Scientific Instruments GmbH\n8C:1F:64:C4:10:00/36\tKatronic AG & Co. KG\n8C:1F:64:C4:20:00/36\tSd Optics\n8C:1F:64:C4:30:00/36\tShenzhen Smartlog Technologies Co.,Ltd\n8C:1F:64:C4:40:00/36\tSypris Electronics\n8C:1F:64:C4:50:00/36\tFlextroincs International (Taiwain Ltd\n8C:1F:64:C4:A0:00/36\tSGi Technology Group Ltd.\n8C:1F:64:C4:C0:00/36\tLumiplan Duhamel\n8C:1F:64:C4:E0:00/36\tiCE-Intelligent Controlled Environments\n8C:1F:64:C5:00:00/36\tSpacee\n8C:1F:64:C5:10:00/36\tEPC Energy Inc\n8C:1F:64:C5:20:00/36\tInvendis Technologies India Pvt Ltd\n8C:1F:64:C5:30:00/36\tClockwork Dog\n8C:1F:64:C5:40:00/36\tFirst Mode\n8C:1F:64:C5:60:00/36\tEridan\n8C:1F:64:C5:70:00/36\tStrategic Robotic Systems\n8C:1F:64:C5:80:00/36\tKitagawa Corporation\n8C:1F:64:C5:90:00/36\tTunstall A/S\n8C:1F:64:C5:D0:00/36\tAlfa Proxima d.o.o.\n8C:1F:64:C5:E0:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:C6:00:00/36\tIntelligent Security Systems (ISS)\n8C:1F:64:C6:10:00/36\tBeijing Ceresdate Technology Co.,LTD\n8C:1F:64:C6:20:00/36\tGMI Ltd\n8C:1F:64:C6:40:00/36\tAjeco Oy\n8C:1F:64:C6:70:00/36\tOriux\n8C:1F:64:C6:80:00/36\tFiberme Communications Llc\n8C:1F:64:C6:A0:00/36\tRed Phase Technologies Limited\n8C:1F:64:C6:B0:00/36\tMediana\n8C:1F:64:C6:D0:00/36\tEA Elektro-Automatik GmbH\n8C:1F:64:C6:E0:00/36\tSafe Instruments\n8C:1F:64:C7:10:00/36\tYaviar LLC\n8C:1F:64:C7:40:00/36\tNippon Techno Lab Inc\n8C:1F:64:C7:50:00/36\tAbbott Diagnostics Technologies AS\n8C:1F:64:C7:80:00/36\tPolon-Alfa S.A.\n8C:1F:64:C7:90:00/36\tP3Lab\n8C:1F:64:C7:B0:00/36\tFreedom Atlantic\n8C:1F:64:C7:C0:00/36\tMERKLE Schweissanlagen-Technik GmbH\n8C:1F:64:C7:D0:00/36\tGlasson Electronics Ltd\n8C:1F:64:C8:00:00/36\tVECOS Europe B.V.\n8C:1F:64:C8:10:00/36\tTaolink Technologies Corporation\n8C:1F:64:C8:30:00/36\tPower Electronics Espana, S.L.\n8C:1F:64:C8:50:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:C8:D0:00/36\tAeronautics Ltd.\n8C:1F:64:C8:F0:00/36\tJW Froehlich Maschinenfabrik GmbH\n8C:1F:64:C9:10:00/36\tSoehnle Industrial Solutions GmbH\n8C:1F:64:C9:20:00/36\tEQ Earthquake Ltd.\n8C:1F:64:C9:60:00/36\tSmart Data (Shenzhen) Intelligent System Co., Ltd.\n8C:1F:64:C9:70:00/36\tMagnet-Physik Dr. Steingroever GmbH\n8C:1F:64:C9:90:00/36\tVinfast Trading and Production JSC\n8C:1F:64:C9:A0:00/36\tInfosoft Digital Design and Services P L\n8C:1F:64:C9:B0:00/36\tJ.M. Voith SE & Co. KG\n8C:1F:64:C9:E0:00/36\tCytoTronics\n8C:1F:64:C9:F0:00/36\tPeachCreek\n8C:1F:64:CA:00:00/36\tSarv Webs Private Limited\n8C:1F:64:CA:10:00/36\tPantherun Technologies Pvt Ltd\n8C:1F:64:CA:20:00/36\teumig industrie-TV GmbH.\n8C:1F:64:CA:40:00/36\tBit Part LLC\n8C:1F:64:CA:60:00/36\tReliaSpeak Information Technology Co., Ltd.\n8C:1F:64:CA:70:00/36\teumig industrie-TV GmbH.\n8C:1F:64:CA:90:00/36\tAvant Technologies\n8C:1F:64:CA:B0:00/36\tSpyder Controls Corp.\n8C:1F:64:CA:D0:00/36\tGeneral Motors\n8C:1F:64:CA:E0:00/36\tOphir Manufacturing Solutions Pte Ltd\n8C:1F:64:CA:F0:00/36\tBRS Sistemas Eletrônicos\n8C:1F:64:CB:10:00/36\tXi’an Sunway Communication Co., Ltd.\n8C:1F:64:CB:20:00/36\tDyncir Soluções Tecnológicas Ltda\n8C:1F:64:CB:30:00/36\tDELO Industrie Klebstoffe GmbH & Co. KGaA\n8C:1F:64:CB:50:00/36\tGamber-Johnson LLC\n8C:1F:64:CB:60:00/36\tRowan Elettronica Srl\n8C:1F:64:CB:70:00/36\tARKRAY,Inc.Kyoto Laboratory\n8C:1F:64:CB:90:00/36\tiC-Haus GmbH\n8C:1F:64:CB:A0:00/36\thiSky SCS Ltd\n8C:1F:64:CB:B0:00/36\tMaris Tech Ltd.\n8C:1F:64:CB:E0:00/36\tCirca Enterprises Inc\n8C:1F:64:CC:10:00/36\tVITREA Smart Home Technologies Ltd.\n8C:1F:64:CC:20:00/36\tToyogiken Co.,Ltd.\n8C:1F:64:CC:50:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:CC:60:00/36\tGenius Vision Digital Private Limited\n8C:1F:64:CC:B0:00/36\tsuzhou yuecrown Electronic Technology Co.,LTD\n8C:1F:64:CC:E0:00/36\tTesollo\n8C:1F:64:CC:F0:00/36\tTiptop Platform P. Ltd\n8C:1F:64:CD:00:00/36\tReo Ag\n8C:1F:64:CD:10:00/36\tFlextronics International Kft\n8C:1F:64:CD:30:00/36\tPionierkraft GmbH\n8C:1F:64:CD:40:00/36\tShengli Technologies\n8C:1F:64:CD:60:00/36\tUSM Pty Ltd\n8C:1F:64:CD:80:00/36\tGogo Business Aviation\n8C:1F:64:CD:90:00/36\tFingoti Limited\n8C:1F:64:CD:A0:00/36\tSPX Flow Technology BV\n8C:1F:64:CD:B0:00/36\tEuropean Telecommunication International Kft\n8C:1F:64:CD:D0:00/36\tThe Signalling Company\n8C:1F:64:CD:F0:00/36\tCanway Technology GmbH\n8C:1F:64:CE:00:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:CE:30:00/36\tPixel Design & Manufacturing Sdn. Bhd.\n8C:1F:64:CE:40:00/36\tSl Usa, Llc\n8C:1F:64:CE:50:00/36\tPrivate\n8C:1F:64:CE:B0:00/36\tEureka For Smart Properties Co. W.L.L\n8C:1F:64:CE:C0:00/36\tZhuhai Huaya machinery Technology Co., LTD\n8C:1F:64:CE:E0:00/36\tDisplax S.A.\n8C:1F:64:CE:F0:00/36\tGoertek Robotics Co.,Ltd.\n8C:1F:64:CF:10:00/36\tROBOfiber, Inc.\n8C:1F:64:CF:30:00/36\tABB S.p.A.\n8C:1F:64:CF:40:00/36\tNt\n8C:1F:64:CF:60:00/36\tNYBSYS Inc\n8C:1F:64:CF:70:00/36\tBusPas\n8C:1F:64:CF:90:00/36\tVeoTech\n8C:1F:64:CF:A0:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:CF:B0:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:CF:C0:00/36\tAbbott Diagnostics Technologies AS\n8C:1F:64:CF:D0:00/36\tSmart-VOD Pty Ltd\n8C:1F:64:CF:E0:00/36\tInstrument Development Group (IDG) at Johns Hopkins University\n8C:1F:64:D0:00:00/36\tPOLAK CZ s.r.o.\n8C:1F:64:D0:20:00/36\tFlextronics International Kft\n8C:1F:64:D0:70:00/36\tTalleres de Escoriaza SAU\n8C:1F:64:D0:80:00/36\tPower Electronics Espana, S.L.\n8C:1F:64:D0:90:00/36\tMinartime(Beijing)Science &Technology Development Co.,Ltd\n8C:1F:64:D0:A0:00/36\tBOTEVO Building Solutions GmbH\n8C:1F:64:D0:C0:00/36\tKS Beschallungstechnik GmbH\n8C:1F:64:D0:E0:00/36\tLabforge Inc.\n8C:1F:64:D0:F0:00/36\tMecco LLC\n8C:1F:64:D1:10:00/36\tBenetel\n8C:1F:64:D1:30:00/36\tEYatsko Individual\n8C:1F:64:D1:50:00/36\tMB connect line GmbH\n8C:1F:64:D1:70:00/36\tI.S.A. - Altanova group srl\n8C:1F:64:D1:80:00/36\tWuxi Tongxin Hengtong Technology Co., Ltd.\n8C:1F:64:D1:90:00/36\tYnm Systems Inc.\n8C:1F:64:D1:A0:00/36\tMonnit Corporation\n8C:1F:64:D1:B0:00/36\tAudiodo International AB\n8C:1F:64:D1:C0:00/36\tVesper Technologies\n8C:1F:64:D1:E0:00/36\tTycon Systems Inc\n8C:1F:64:D1:F0:00/36\tFree Talk Engineering Co., Ltd\n8C:1F:64:D2:00:00/36\tNAS Engineering PRO\n8C:1F:64:D2:10:00/36\tAmetek Cts Gmbh\n8C:1F:64:D2:30:00/36\tPLX Inc.\n8C:1F:64:D2:40:00/36\tR3 IoT Ltd.\n8C:1F:64:D2:70:00/36\tTaiv Inc\n8C:1F:64:D2:80:00/36\tMapleCloud Technologies\n8C:1F:64:D2:90:00/36\tSecure Bits\n8C:1F:64:D2:A0:00/36\tAnteus Kft.\n8C:1F:64:D2:D0:00/36\tEskomar Ltd.\n8C:1F:64:D2:F0:00/36\tLtec Co.,Ltd\n8C:1F:64:D3:00:00/36\tFMC Technologies Measurement Solutions Inc\n8C:1F:64:D3:40:00/36\tKronotech Srl\n8C:1F:64:D3:80:00/36\tCuu Long Technology And Trading Company Limited\n8C:1F:64:D3:A0:00/36\tApplied Materials\n8C:1F:64:D3:B0:00/36\tGogo BA\n8C:1F:64:D3:C0:00/36\t\"KIB Energo\" LLC\n8C:1F:64:D3:F0:00/36\tSchnoor Industrieelektronik GmbH\n8C:1F:64:D4:00:00/36\tBreas Medical AB\n8C:1F:64:D4:20:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:D4:40:00/36\tMonarch Instrument\n8C:1F:64:D4:60:00/36\tEnd 2 End Technologies\n8C:1F:64:D4:90:00/36\tFuture Life Technology\n8C:1F:64:D4:A0:00/36\tCaproc Oy\n8C:1F:64:D4:D0:00/36\tLiburdi Dimetrics Corp.\n8C:1F:64:D4:E0:00/36\tMagnatek ApS\n8C:1F:64:D4:F0:00/36\tHenan Creatbot Technology Limited\n8C:1F:64:D5:10:00/36\tZIGEN Lighting Solution co., ltd.\n8C:1F:64:D5:20:00/36\tCritical Software SA\n8C:1F:64:D5:30:00/36\tGridnt\n8C:1F:64:D5:40:00/36\tGrupo Epelsa S.L.\n8C:1F:64:D5:60:00/36\tWisdom Audio\n8C:1F:64:D5:80:00/36\tZumbach Electronic AG\n8C:1F:64:D5:B0:00/36\tLocal Security\n8C:1F:64:D5:D0:00/36\tGenius Vision Digital Private Limited\n8C:1F:64:D5:E0:00/36\tInteger.pl S.A.\n8C:1F:64:D6:00:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:D6:10:00/36\tAdvent Diamond\n8C:1F:64:D6:20:00/36\tAlpes recherche et développement\n8C:1F:64:D6:30:00/36\tMobileye\n8C:1F:64:D6:40:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:D6:90:00/36\tADiCo Corporation\n8C:1F:64:D6:C0:00/36\tPacketalk LLC\n8C:1F:64:D7:10:00/36\tComputech International\n8C:1F:64:D7:30:00/36\tBRS Sistemas Eletrônicos\n8C:1F:64:D7:40:00/36\tTex Computer Srl\n8C:1F:64:D7:70:00/36\tPrivate\n8C:1F:64:D7:80:00/36\tHunan Oushi Electronic Technology Co.,Ltd\n8C:1F:64:D7:B0:00/36\tGlobal Design Solutions Korea\n8C:1F:64:D7:C0:00/36\tQuercus Technologies, S.L.\n8C:1F:64:D7:E0:00/36\tThales Belgium\n8C:1F:64:D7:F0:00/36\tFiberstory communications Pvt Ltd\n8C:1F:64:D8:00:00/36\tAztek Sa\n8C:1F:64:D8:10:00/36\tMitsubishi Electric India Pvt. Ltd.\n8C:1F:64:D8:80:00/36\tUniversity of Geneva - Department of Particle Physics\n8C:1F:64:D8:A0:00/36\tBoon Arthur Engineering Pte Ltd\n8C:1F:64:D8:C0:00/36\tSmri\n8C:1F:64:D8:D0:00/36\tWi-Tronix, LLC\n8C:1F:64:D8:E0:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:D8:F0:00/36\tDEUTA-WERKE GmbH\n8C:1F:64:D9:00:00/36\tSMITEC S.p.A.\n8C:1F:64:D9:10:00/36\tZhejiang Healnoc Technology Co., Ltd.\n8C:1F:64:D9:20:00/36\tMitsubishi Electric India Pvt. Ltd.\n8C:1F:64:D9:30:00/36\tAlgodue Elettronica Srl\n8C:1F:64:D9:50:00/36\tTeczz Llc\n8C:1F:64:D9:60:00/36\tSmart Cabling & Transmission Corp.\n8C:1F:64:D9:80:00/36\tGnewtek photoelectric technology Ltd.\n8C:1F:64:D9:90:00/36\tInvixium Access Inc\n8C:1F:64:D9:A0:00/36\tBeijing Redlink Information Technology Co., Ltd.\n8C:1F:64:D9:B0:00/36\tGiS mbH\n8C:1F:64:D9:C0:00/36\tRelcom, Inc.\n8C:1F:64:D9:D0:00/36\tMitsubishi Heavy Industries Thermal Systems, Ltd.\n8C:1F:64:D9:E0:00/36\tWagner Group GmbH\n8C:1F:64:DA:10:00/36\tHangteng (HK) Technology Co., Limited\n8C:1F:64:DA:50:00/36\tDaom\n8C:1F:64:DA:60:00/36\tPower Electronics Espana, S.L.\n8C:1F:64:DA:A0:00/36\tDavetech Limited\n8C:1F:64:DA:E0:00/36\tMainco automotion s.l.\n8C:1F:64:DA:F0:00/36\tZhuhai Lonl electric Co.,Ltd\n8C:1F:64:DB:10:00/36\tShanghai Yamato Scale Co., Ltd\n8C:1F:64:DB:50:00/36\tvicttron\n8C:1F:64:DB:70:00/36\tLambda Systems Inc.\n8C:1F:64:DB:90:00/36\tErmes Elettronica s.r.l.\n8C:1F:64:DB:A0:00/36\tElectronic Equipment Company Pvt. Ltd.\n8C:1F:64:DB:B0:00/36\tWürth Elektronik ICS GmbH & Co. KG\n8C:1F:64:DB:D0:00/36\tGiordano Controls Spa\n8C:1F:64:DB:F0:00/36\tRugged Controls\n8C:1F:64:DC:00:00/36\tPigs Can Fly Labs LLC\n8C:1F:64:DC:20:00/36\tProcon Electronics Pty Ltd\n8C:1F:64:DC:30:00/36\tPacket Digital, LLC\n8C:1F:64:DC:40:00/36\tAmazon Robotics MTAC Matrix NPI\n8C:1F:64:DC:60:00/36\tR&K\n8C:1F:64:DC:70:00/36\tWide Swath Research, LLC\n8C:1F:64:DC:80:00/36\tDwdm.Ru Llc\n8C:1F:64:DC:90:00/36\tPeter Huber Kaeltemaschinenbau SE\n8C:1F:64:DC:A0:00/36\tPorsche engineering\n8C:1F:64:DC:B0:00/36\tBeijing Ceresdata Technology Co., LTD\n8C:1F:64:DC:F0:00/36\tReo Ag\n8C:1F:64:DD:20:00/36\tShield-Cctv Co.,Ltd.\n8C:1F:64:DD:30:00/36\tCHUGOKU ELECTRICAL INSTRUMENTS Co.,LTD.\n8C:1F:64:DD:40:00/36\tMidlands Technical Co., Ltd.\n8C:1F:64:DD:50:00/36\tCardinal Scales Manufacturing Co\n8C:1F:64:DD:70:00/36\tKST technology\n8C:1F:64:DD:90:00/36\tAbbott Diagnostics Technologies AS\n8C:1F:64:DD:B0:00/36\tEfficient Residential Heating GmbH\n8C:1F:64:DD:E0:00/36\tJemac Sweden AB\n8C:1F:64:DE:00:00/36\tBorgWarner Engineering Services AG\n8C:1F:64:DE:10:00/36\tFranke Aquarotter GmbH\n8C:1F:64:DE:20:00/36\tSoftgent sp. z o.o.\n8C:1F:64:DE:50:00/36\tGogo Business Aviation\n8C:1F:64:DE:60:00/36\tIHI Inspection & Instrumentation Co.,Ltd.\n8C:1F:64:DE:90:00/36\tEON Technology, Corp\n8C:1F:64:DE:A0:00/36\tNatron Energy\n8C:1F:64:DE:B0:00/36\tPXM Marek Zupnik spolka komandytowa\n8C:1F:64:DE:D0:00/36\tPhotonPath\n8C:1F:64:DF:50:00/36\tConcept Pro Surveillance\n8C:1F:64:DF:60:00/36\tMicronova srl\n8C:1F:64:DF:80:00/36\tWittra Networks AB\n8C:1F:64:DF:90:00/36\tVuWall Technology Europe GmbH\n8C:1F:64:DF:A0:00/36\tAtse Llc\n8C:1F:64:DF:B0:00/36\tBobeesc Co.\n8C:1F:64:DF:C0:00/36\tMeiko Electronics Co.,Ltd.\n8C:1F:64:DF:E0:00/36\tNuvation Energy\n8C:1F:64:E0:00:00/36\tDvb-Tech S.R.L.\n8C:1F:64:E0:20:00/36\tITS Teknik A/S\n8C:1F:64:E0:40:00/36\t新川センサテクノロジ株式会社\n8C:1F:64:E0:50:00/36\tMitsubishi Electric System & Service Co., Ltd.\n8C:1F:64:E0:80:00/36\tImagenet Co.,Ltd\n8C:1F:64:E0:90:00/36\tEnless Wireless\n8C:1F:64:E0:B0:00/36\tLaurel Electronics LLC\n8C:1F:64:E0:C0:00/36\tTelestrider Sa\n8C:1F:64:E0:E0:00/36\tNokeval Oy\n8C:1F:64:E1:00:00/36\tScenario Automation\n8C:1F:64:E1:10:00/36\tC-Octopus\n8C:1F:64:E1:20:00/36\tPixus Technologies Inc.\n8C:1F:64:E1:40:00/36\tProserv\n8C:1F:64:E1:50:00/36\tPanascais ehf.\n8C:1F:64:E1:A0:00/36\tDAccess Security Systems P Ltd\n8C:1F:64:E1:C0:00/36\tCLOUD TELECOM Inc.\n8C:1F:64:E1:D0:00/36\tXworks NZ Limited\n8C:1F:64:E1:E0:00/36\tFlextronics International Kft\n8C:1F:64:E2:10:00/36\tLG-LHT Aircraft Solutions GmbH\n8C:1F:64:E2:30:00/36\tChemito Infotech PVT LTD\n8C:1F:64:E2:40:00/36\tCometa Sas\n8C:1F:64:E2:B0:00/36\tGlotech Exim Private Limited\n8C:1F:64:E2:D0:00/36\tRADA Electronics Industries Ltd.\n8C:1F:64:E2:E0:00/36\tRADA Electronics Industries Ltd.\n8C:1F:64:E2:F0:00/36\tBreas Medical AB\n8C:1F:64:E3:00:00/36\tVMukti Solutions Private Limited\n8C:1F:64:E3:20:00/36\tSeAIoT Solutions Ltda\n8C:1F:64:E3:30:00/36\tAmiad Water Systems\n8C:1F:64:E3:50:00/36\tHorcery LLC\n8C:1F:64:E3:A0:00/36\tAITEC Corporation\n8C:1F:64:E3:B0:00/36\tNeways Technologies B.V.\n8C:1F:64:E3:C0:00/36\tFinotex Electronic Solutions PVT LTD\n8C:1F:64:E3:F0:00/36\tTeletech Services\n8C:1F:64:E4:00:00/36\tThermoG Limited\n8C:1F:64:E4:10:00/36\tGrossenbacher Systeme AG\n8C:1F:64:E4:20:00/36\tShenzhen Forddok Technology Co., Ltd\n8C:1F:64:E4:30:00/36\tDaedalean AG\n8C:1F:64:E4:50:00/36\tInteger.pl S.A.\n8C:1F:64:E4:60:00/36\tNautel LTD\n8C:1F:64:E4:70:00/36\tBRS Sistemas Eletrônicos\n8C:1F:64:E4:90:00/36\tSamwell International Inc\n8C:1F:64:E4:B0:00/36\tAlgazira Telecom Solutions\n8C:1F:64:E4:C0:00/36\tTTC TELEKOMUNIKACE, s.r.o.\n8C:1F:64:E4:D0:00/36\tSan Telequip (P) Ltd.,\n8C:1F:64:E4:E0:00/36\tTrivedi Advanced Technologies LLC\n8C:1F:64:E4:F0:00/36\tSabl Systems Pty Ltd\n8C:1F:64:E5:20:00/36\tLcmVeloci ApS\n8C:1F:64:E5:30:00/36\tT Proje Muhendislik Dis Tic. Ltd. Sti.\n8C:1F:64:E5:80:00/36\tHeitec Ag\n8C:1F:64:E5:B0:00/36\tComVetia AG\n8C:1F:64:E5:C0:00/36\tScientific Lightning Solutions\n8C:1F:64:E5:D0:00/36\tJinYuan International Corporation\n8C:1F:64:E5:E0:00/36\tBRICKMAKERS GmbH\n8C:1F:64:E6:10:00/36\tStange Elektronik GmbH\n8C:1F:64:E6:20:00/36\tAxcend\n8C:1F:64:E6:30:00/36\tInfosoft Digital Design and Services P L\n8C:1F:64:E6:40:00/36\tIndefac company\n8C:1F:64:E6:60:00/36\tEnless Wireless\n8C:1F:64:E6:80:00/36\tLHA Systems (Pty) Ltd\n8C:1F:64:E6:E0:00/36\tHuman Dgm. Co., Ltd.\n8C:1F:64:E6:F0:00/36\tVision Systems Safety Tech\n8C:1F:64:E7:00:00/36\tTelfi Technologies Private Limited\n8C:1F:64:E7:10:00/36\tAlma\n8C:1F:64:E7:30:00/36\tGTR Industries\n8C:1F:64:E7:40:00/36\tMagosys Systems LTD\n8C:1F:64:E7:50:00/36\tStercom Power Soltions GmbH\n8C:1F:64:E7:60:00/36\tHeitec Ag\n8C:1F:64:E7:70:00/36\tGy-Fx Sas\n8C:1F:64:E7:80:00/36\tElettronica Adriatica Srl\n8C:1F:64:E7:90:00/36\tShenzhen Guangwen Industrial Co.,Ltd\n8C:1F:64:E7:B0:00/36\tDongguan Pengchen Earth Instrument CO. LT\n8C:1F:64:E7:C0:00/36\tAshinne Technology Co., Ltd\n8C:1F:64:E7:D0:00/36\tAudio Visual Digital Systems\n8C:1F:64:E8:00:00/36\tPower Electronics Espana, S.L.\n8C:1F:64:E8:60:00/36\tComVetia AG\n8C:1F:64:E8:70:00/36\tChemi-Con\n8C:1F:64:E8:80:00/36\tSiFive Inc\n8C:1F:64:E8:90:00/36\tPADL Software Pty Ltd\n8C:1F:64:E8:A0:00/36\tChangzhou MITO electronics Technology Co;LTD\n8C:1F:64:E8:B0:00/36\tTelevic Rail GmbH\n8C:1F:64:E8:D0:00/36\tPlura\n8C:1F:64:E8:F0:00/36\tJieChuang HeYi(Beijing) Technology Co., Ltd.\n8C:1F:64:E9:00:00/36\tMHE Electronics\n8C:1F:64:E9:20:00/36\tEA Elektro-Automatik GmbH\n8C:1F:64:E9:40:00/36\tZin Technologies\n8C:1F:64:E9:80:00/36\tLuxshare Electronic Technology (Kunshan) LTD\n8C:1F:64:E9:90:00/36\tPantherun Technologies Pvt Ltd\n8C:1F:64:E9:A0:00/36\tSiFive Inc\n8C:1F:64:E9:B0:00/36\tDiscover Energy Systems Corp.\n8C:1F:64:E9:F0:00/36\tLumiplan Duhamel\n8C:1F:64:EA:60:00/36\tDial Plan Limited\n8C:1F:64:EA:80:00/36\tZumbach Electronic AG\n8C:1F:64:EA:A0:00/36\t\"KB \"Modul\", LLC\n8C:1F:64:EA:C0:00/36\tMiracle Healthcare, Inc.\n8C:1F:64:EA:D0:00/36\tMessung Systems Pvt Ltd\n8C:1F:64:EA:E0:00/36\tTraffic Polska sp. z o. o.\n8C:1F:64:EB:00:00/36\tExyte Technology GmbH\n8C:1F:64:EB:20:00/36\tAqua Broadcast Ltd\n8C:1F:64:EB:50:00/36\tMeiryo Denshi Corp.\n8C:1F:64:EB:70:00/36\tDelta Solutions LLC\n8C:1F:64:EB:90:00/36\tKxS Technologies Oy\n8C:1F:64:EB:A0:00/36\tHyve Solutions\n8C:1F:64:EB:B0:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:EB:C0:00/36\tProject92.com\n8C:1F:64:EB:D0:00/36\tEsprit Digital Ltd\n8C:1F:64:EB:E0:00/36\tTrafag Italia S.r.l.\n8C:1F:64:EB:F0:00/36\tSTEAMIQ, Inc.\n8C:1F:64:EC:10:00/36\tActronika SAS\n8C:1F:64:EC:C0:00/36\tBaldwin Jimek AB\n8C:1F:64:EC:F0:00/36\tMonnit Corporation\n8C:1F:64:ED:00:00/36\tShanghai Jupper Technology Co.Ltd\n8C:1F:64:ED:30:00/36\tSenso2Me Nv\n8C:1F:64:ED:40:00/36\tZhejiang Chitic-Safeway New Energy Technical Co.,Ltd.\n8C:1F:64:ED:50:00/36\tSmart Data (Shenzhen) Intelligent System Co., Ltd.\n8C:1F:64:ED:60:00/36\tPowTechnology Limited\n8C:1F:64:ED:70:00/36\tCS-Tech s.r.o.\n8C:1F:64:ED:80:00/36\tMcs Innovation Pvt Ltd\n8C:1F:64:ED:90:00/36\tNetgen Hitech Solutions Llp\n8C:1F:64:ED:A0:00/36\tDEUTA-WERKE GmbH\n8C:1F:64:ED:D0:00/36\tOnDis Solutions Ltd\n8C:1F:64:ED:F0:00/36\tXlera Solutions, LLC\n8C:1F:64:EE:00:00/36\tPrivate\n8C:1F:64:EE:10:00/36\tPuS GmbH und Co. KG\n8C:1F:64:EE:30:00/36\tSichuan Huacun Zhigu Technology Co.,Ltd\n8C:1F:64:EE:60:00/36\tLynkx\n8C:1F:64:EE:80:00/36\tGlobal Organ Group B.V.\n8C:1F:64:EE:A0:00/36\tAmess\n8C:1F:64:EE:D0:00/36\tViziontech UK\n8C:1F:64:EE:F0:00/36\tAiUnion Co.,Ltd\n8C:1F:64:EF:00:00/36\tSonendo Inc\n8C:1F:64:EF:10:00/36\tBiotage Gb Ltd\n8C:1F:64:EF:40:00/36\tMediaport Systems Ltd\n8C:1F:64:EF:50:00/36\tSigma Defense Systems LLC\n8C:1F:64:EF:80:00/36\tNorthwest Central Indiana Community Partnerships Inc dba Wabash Heartland Innovation Network (WHIN)\n8C:1F:64:EF:B0:00/36\tWarecube,Inc\n8C:1F:64:EF:D0:00/36\tNovatera(Shenzhen)Technologies Co.,Ltd.\n8C:1F:64:F0:30:00/36\tFaust ApS\n8C:1F:64:F0:40:00/36\tIoTSecure, LLC\n8C:1F:64:F0:50:00/36\tPreston Industries dba PolyScience\n8C:1F:64:F0:80:00/36\tAdvantor Corporation\n8C:1F:64:F0:90:00/36\tTexi AS\n8C:1F:64:F0:A0:00/36\tHorizon.Inc\n8C:1F:64:F0:B0:00/36\tNagy Márton Jozsef e.v.\n8C:1F:64:F1:00:00/36\tTelevic Rail GmbH\n8C:1F:64:F1:10:00/36\tOttronic GmbH\n8C:1F:64:F1:20:00/36\tCAITRON GmbH\n8C:1F:64:F1:30:00/36\tACS Motion Control\n8C:1F:64:F1:40:00/36\tElektrosil GmbH\n8C:1F:64:F1:80:00/36\tNorthern Design (Electronics) Ltd\n8C:1F:64:F1:90:00/36\tHurry-tech\n8C:1F:64:F1:B0:00/36\tNextep Co.,Ltd.\n8C:1F:64:F1:C0:00/36\tRigel Engineering, LLC\n8C:1F:64:F1:D0:00/36\tMB connect line GmbH Fernwartungssysteme\n8C:1F:64:F2:20:00/36\tVoyage Audio LLC\n8C:1F:64:F2:30:00/36\tIDEX India Pvt Ltd\n8C:1F:64:F2:40:00/36\tAlbotronic\n8C:1F:64:F2:50:00/36\tMisaka Network, Inc.\n8C:1F:64:F2:70:00/36\tTesat-Spacecom GmbH & Co. KG\n8C:1F:64:F2:80:00/36\tDEUTA Werke GmbH\n8C:1F:64:F2:C0:00/36\tTunstall A/S\n8C:1F:64:F2:D0:00/36\tHUERNER Schweisstechnik GmbH\n8C:1F:64:F2:F0:00/36\tQuantum Technologies Inc\n8C:1F:64:F3:10:00/36\tInternational Water Treatment Maritime AS\n8C:1F:64:F3:20:00/36\tShenzhen INVT Electric Co.,Ltd\n8C:1F:64:F3:30:00/36\tSicon srl\n8C:1F:64:F3:90:00/36\tWeinan Wins Future Technology Co.,Ltd\n8C:1F:64:F3:A0:00/36\tintersaar GmbH\n8C:1F:64:F3:B0:00/36\tBeijing REMANG Technology Co., Ltd.\n8C:1F:64:F3:C0:00/36\tMicrolynx Systems Ltd\n8C:1F:64:F3:D0:00/36\tByte Lab Grupa d.o.o.\n8C:1F:64:F3:F0:00/36\tIndustrial Laser Machines, LLC\n8C:1F:64:F4:10:00/36\tAutomatizacion Y Conectividad Sa De Cv\n8C:1F:64:F4:30:00/36\twtec GmbH\n8C:1F:64:F4:50:00/36\tJbf\n8C:1F:64:F4:60:00/36\tBroadcast Tools, Inc.\n8C:1F:64:F4:90:00/36\tCenterClick LLC\n8C:1F:64:F4:A0:00/36\tIn-lite Design BV\n8C:1F:64:F4:B0:00/36\tJorex Lorex India Private Limited\n8C:1F:64:F4:C0:00/36\tinomatic GmbH\n8C:1F:64:F4:E0:00/36\tADAMCZEWSKI elektronische Messtechnik GmbH\n8C:1F:64:F4:F0:00/36\tLeonardo Germany GmbH\n8C:1F:64:F5:00:00/36\tVigor Electric Corp.\n8C:1F:64:F5:20:00/36\tAMF Medical SA\n8C:1F:64:F5:30:00/36\tBeckman Coulter Inc\n8C:1F:64:F5:60:00/36\tKC5 International Sdn Bhd\n8C:1F:64:F5:70:00/36\tEA Elektro-Automatik GmbH\n8C:1F:64:F5:90:00/36\tInovonics Inc.\n8C:1F:64:F5:A0:00/36\tTelco Antennas Pty Ltd\n8C:1F:64:F5:B0:00/36\tSemaConnect, Inc\n8C:1F:64:F5:C0:00/36\tFlextronics International Kft\n8C:1F:64:F5:F0:00/36\tTR7 Siber Savunma A.S.\n8C:1F:64:F6:00:00/36\tPortrait Displays, Inc.\n8C:1F:64:F6:30:00/36\tQuantum Media Systems\n8C:1F:64:F6:50:00/36\tTalleres de Escoriaza SA\n8C:1F:64:F6:70:00/36\tDistron S.L.\n8C:1F:64:F6:80:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:F6:90:00/36\tSUS Corporation\n8C:1F:64:F6:C0:00/36\tSonatronic\n8C:1F:64:F6:D0:00/36\tOphir Manufacturing Solutions Pte Ltd\n8C:1F:64:F6:E0:00/36\tITG Co.Ltd\n8C:1F:64:F6:F0:00/36\tMotion Impossible Ltd\n8C:1F:64:F7:00:00/36\tVision Systems Safety Tech\n8C:1F:64:F7:20:00/36\tContrader\n8C:1F:64:F7:40:00/36\tGE AVIC Civil Avionics Systems Company Limited\n8C:1F:64:F7:70:00/36\tInvertek Drives Ltd\n8C:1F:64:F7:80:00/36\tTernary Research Corporation\n8C:1F:64:F7:90:00/36\tYUYAMA MFG Co.,Ltd\n8C:1F:64:F7:A0:00/36\tSiEngine Technology Co., Ltd.\n8C:1F:64:F7:C0:00/36\tGeneral Dynamics IT\n8C:1F:64:F7:D0:00/36\tRpg Informatica, S.A.\n8C:1F:64:F7:F0:00/36\tVision Systems Safety Tech\n8C:1F:64:F8:30:00/36\tVishay Nobel AB\n8C:1F:64:F8:40:00/36\tKST technology\n8C:1F:64:F8:60:00/36\tINFOSTECH Co., Ltd.\n8C:1F:64:F8:70:00/36\tFly Electronic (Shang Hai) Technology Co.,Ltd\n8C:1F:64:F8:80:00/36\tLAMTEC Mess- und Regeltechnik für Feuerungen GmbH & Co. KG\n8C:1F:64:F8:C0:00/36\tBk Lab\n8C:1F:64:F9:00:00/36\tEnfabrica\n8C:1F:64:F9:10:00/36\tConsonance\n8C:1F:64:F9:20:00/36\tVision Systems Safety Tech\n8C:1F:64:F9:30:00/36\tGigawave LLC\n8C:1F:64:F9:40:00/36\tEA Elektroautomatik GmbH & Co. KG\n8C:1F:64:F9:60:00/36\tSACO Controls Inc.\n8C:1F:64:F9:70:00/36\tDentalhitec\n8C:1F:64:F9:80:00/36\tXps Eletronica Ltda\n8C:1F:64:F9:B0:00/36\tElsist Srl\n8C:1F:64:F9:C0:00/36\tBeijing Tong Cybsec Technology Co.,LTD\n8C:1F:64:F9:E0:00/36\tDREAMSWELL Technology CO.,Ltd\n8C:1F:64:FA:20:00/36\tAZD Praha s.r.o., ZOZ Olomouc\n8C:1F:64:FA:40:00/36\tChina Information Technology Designing &Consulting Institute Co.,Ltd.\n8C:1F:64:FA:50:00/36\tFrazer-Nash Consultancy\n8C:1F:64:FA:60:00/36\tSurveyorLabs LLC\n8C:1F:64:FA:80:00/36\tUnitron Systems b.v.\n8C:1F:64:FA:A0:00/36\tMassar Networks\n8C:1F:64:FA:B0:00/36\tLIAN Corporation\n8C:1F:64:FA:C0:00/36\tShowa Electric Laboratory co.,ltd.\n8C:1F:64:FB:00:00/36\tMARIAN GmbH\n8C:1F:64:FB:10:00/36\tAbb\n8C:1F:64:FB:40:00/36\tThales Nederland BV\n8C:1F:64:FB:50:00/36\tBavaria Digital Technik GmbH\n8C:1F:64:FB:60:00/36\tRacelogic Ltd\n8C:1F:64:FB:70:00/36\tGrace Design/Lunatec LLC\n8C:1F:64:FB:90:00/36\tIWS Global Pty Ltd\n8C:1F:64:FB:A0:00/36\tOnto Innovation\n8C:1F:64:FB:D0:00/36\tSAN-AI Electronic Industries Co.,Ltd.\n8C:1F:64:FC:10:00/36\tNidec asi spa\n8C:1F:64:FC:20:00/36\tI/O Controls\n8C:1F:64:FC:30:00/36\tCyclops Technology Group\n8C:1F:64:FC:40:00/36\tDorlet Sau\n8C:1F:64:FC:50:00/36\tSumico\n8C:1F:64:FC:C0:00/36\tGredmann Taiwan Ltd.\n8C:1F:64:FC:D0:00/36\telbit systems - EW and sigint - Elisra\n8C:1F:64:FD:00:00/36\tNear Earth Autonomy\n8C:1F:64:FD:10:00/36\tEdgeware AB\n8C:1F:64:FD:20:00/36\tGuo He Xing Ke (ShenZhen) Technology Co.,Ltd.\n8C:1F:64:FD:30:00/36\tSmilics Technologies, S.L.\n8C:1F:64:FD:40:00/36\tEmbsys Sistemas Embarcados\n8C:1F:64:FD:50:00/36\tTHE WHY HOW DO COMPANY, Inc.\n8C:1F:64:FD:70:00/36\tBeijing Yahong Century Technology Co., Ltd\n8C:1F:64:FD:A0:00/36\tArkham Technology\n8C:1F:64:FD:B0:00/36\tDeepSenXe International ltd.\n8C:1F:64:FD:C0:00/36\tNuphoton Technologies\n8C:1F:64:FD:F0:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:FE:00:00/36\tPotter Electric Signal Co. LLC\n8C:1F:64:FE:10:00/36\tSOREL GmbH\n8C:1F:64:FE:20:00/36\tVUV Analytics, Inc.\n8C:1F:64:FE:30:00/36\tPower Electronics Espana, S.L.\n8C:1F:64:FE:50:00/36\tTruenorth\n8C:1F:64:FE:90:00/36\tAlzajel Modern Telecommunication\n8C:1F:64:FE:A0:00/36\tAKON Co.,Ltd.\n8C:1F:64:FE:B0:00/36\tZhejiang Saijin Semiiconductor Technology Co., Ltd.\n8C:1F:64:FE:C0:00/36\tNewtec A/S\n8C:1F:64:FE:D0:00/36\tTelevic Rail GmbH\n8C:1F:64:FE:E0:00/36\tLeap Info Systems Pvt. Ltd.\n8C:1F:64:FF:30:00/36\tFuzhou Tucsen Photonics Co.,Ltd\n8C:1F:64:FF:40:00/36\tSMS group GmbH\n8C:1F:64:FF:50:00/36\tIQ Tools LLC\n8C:1F:64:FF:60:00/36\tAscon Tecnologic S.r.l.\n8C:1F:64:FF:80:00/36\tChamsys Ltd\n8C:1F:64:FF:90:00/36\tVtron Pty Ltd\n8C:1F:64:FF:B0:00/36\tTaicang T&W Electronics\n8C:1F:64:FF:C0:00/36\tInvendis Technologies India Pvt Ltd\n8C:1F:94\t\tRF Surgical System Inc.\n8C:21:0A\t\tTp-Link Technologies Co.,Ltd.\n8C:25:05\t\tHuawei Technologies Co.,Ltd\n8C:25:5E\t\tVoltServer\n8C:26:AA\t\tApple, Inc.\n8C:27:1D\t\tQuantHouse\n8C:27:8A\t\tVocollect Inc\n8C:29:37\t\tApple, Inc.\n8C:2A:85\t\tAmazon Technologies Inc.\n8C:2A:8E\t\tDongGuan Ramaxel Memory Technology\n8C:2D:AA\t\tApple, Inc.\n8C:2E:72\t\tSamsung Electronics Co.,Ltd\n8C:2F:39\t\tIBA Dosimetry GmbH\n8C:2F:A6\t\tSolid Optics B.V.\n8C:30:66\t\tUbiquiti Inc\n8C:31:E2\t\tDayouplus\n8C:32:23\t\tJWIPC Technology Co.,Ltd.\n8C:33:30\t\tEmFirst Co., Ltd.\n8C:33:57\t\tHiteVision Digital Media Technology Co.,Ltd.\n8C:33:96\t\tApple, Inc.\n8C:34:01\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n8C:34:46\t\tHuawei Device Co., Ltd.\n8C:34:FD\t\tHuawei Technologies Co.,Ltd\n8C:35:79\t\tQDIQO Sp. z o.o.\n8C:35:92\t\tGuangzhou Shiyuan Electronic Technology Company Limited\n8C:36:7A\t\tPalo Alto Networks\n8C:39:5C\t\tBit4id Srl\n8C:3A:7E\t\tUniversal Electronics, Inc.\n8C:3A:E3\t\tLG Electronics (Mobile Communications)\n8C:3B:32\t\tMicrofan B.V.\n8C:3B:4A\t\tUniversal Global Scientific Industrial Co., Ltd.\n8C:3B:AD\t\tNetgear\n8C:3C:07\t\tSkiva Technologies, Inc.\n8C:3C:4A\t\tNAKAYO Inc\n8C:3D:16\t\tShenzhen Four Seas Global Link Network Technology Co.,Ltd\n8C:3D:B1\t\tBeijing H-IoT Technology Co., Ltd.\n8C:3F:44\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n8C:41:F2\t\tRDA Technologies Ltd.\n8C:41:F4\t\tIPmotion GmbH\n8C:42:6D\t\tHuawei Technologies Co.,Ltd\n8C:43:61\t\tHailo Digital Hub GmbH & Co. KG\n8C:44:35\t\tShanghai BroadMobi Communication Technology Co., Ltd.\n8C:44:4F\t\tHUMAX Co., Ltd.\n8C:44:A5\t\tCisco Systems, Inc\n8C:44:BB\t\tShen Zhen Tenda Technology Co.,Ltd\n8C:45:00\t\tMurata Manufacturing Co., Ltd.\n8C:47:6E\t\tIEEE Registration Authority\n8C:47:6E:00:00:00/28\tChipsafer Pte. Ltd.\n8C:47:6E:10:00:00/28\tTelWare Corporation\n8C:47:6E:20:00:00/28\tHuiZhou MIKI Communication Equipment Co.,LTD\n8C:47:6E:30:00:00/28\tShanghai Satellite Communication Technology Co.,Ltd\n8C:47:6E:40:00:00/28\tShenzhen Juding Electronics Co., Ltd.\n8C:47:6E:50:00:00/28\tSquare Inc.\n8C:47:6E:60:00:00/28\tOxford Nanopore Technologies Ltd.\n8C:47:6E:70:00:00/28\tSyng, Inc.\n8C:47:6E:80:00:00/28\tIntelliVIX Co. Ltd.\n8C:47:6E:90:00:00/28\tXertified AB\n8C:47:6E:A0:00:00/28\tAU Optronics Corporation\n8C:47:6E:B0:00:00/28\tFaravid Communication&Data Analysis\n8C:47:6E:C0:00:00/28\tEdge Networks Inc\n8C:47:6E:D0:00:00/28\tinnolectric AG\n8C:47:6E:E0:00:00/28\tAnnapurna labs\n8C:47:7F\t\tNambooSolution\n8C:47:BE\t\tDell Inc.\n8C:49:62\t\tRoku, Inc\n8C:49:7A\t\tExtreme Networks Headquarters\n8C:49:B6\t\tvivo Mobile Communication Co., Ltd.\n8C:4A:EE\t\tGiga Tms Inc\n8C:4B:14\t\tEspressif Inc.\n8C:4B:59\t\t3D Imaging & Simulations Corp\n8C:4C:AD\t\tEvoluzn Inc.\n8C:4C:DC\t\tPlanex Communications Inc.\n8C:4D:B9\t\tUnmonday Ltd\n8C:4D:EA\t\tCerio Corporation\n8C:4E:46\t\tMotorola Mobility LLC, a Lenovo Company\n8C:4F:00\t\tEspressif Inc.\n8C:50:1A\t\tPrivate\n8C:51:05\t\tShenzhen ireadygo Information Technology CO.,LTD.\n8C:51:09\t\tIEEE Registration Authority\n8C:51:09:00:00:00/28\tTianJin JointOptic Technology Co., LTD.\n8C:51:09:10:00:00/28\tAmzetta Technologies, LLC\n8C:51:09:20:00:00/28\tPROCET Technology Co., Ltd(HK)\n8C:51:09:30:00:00/28\tShenzhen Ldrobot Co., Ltd.\n8C:51:09:40:00:00/28\tShenzhen WOWOTO Technology Co., Ltd.\n8C:51:09:50:00:00/28\tHeliox Automotive B.V.\n8C:51:09:60:00:00/28\tAvxav Electronic Trading LLC\n8C:51:09:70:00:00/28\tENPLUG Co., Ltd.\n8C:51:09:80:00:00/28\tnerospec\n8C:51:09:90:00:00/28\tFrontmatec\n8C:51:09:A0:00:00/28\tSernet (Suzhou) Technologies Corporation\n8C:51:09:B0:00:00/28\tBeijing Superhexa Century Technology Co., Ltd.\n8C:51:09:C0:00:00/28\tSpotterRF LLC\n8C:51:09:D0:00:00/28\tSurpedia Technologies Co., Ltd.\n8C:51:09:E0:00:00/28\tIROOTELLUCKY Corp.\n8C:52:19\t\tSHARP Corporation\n8C:53:C3\t\tBeijing Xiaomi Mobile Software Co., Ltd\n8C:53:D2\t\tChina Mobile Group Device Co.,Ltd.\n8C:53:E6\t\tWistron Neweb Corporation\n8C:53:F7\t\tA&D Engineering Co., Ltd.\n8C:54:1D\t\tLge\n8C:55:4A\t\tIntel Corporate\n8C:55:70\t\tIEEE Registration Authority\n8C:55:70:00:00:00/28\tAST International GmbH\n8C:55:70:10:00:00/28\tLLC Katusha Print\n8C:55:70:20:00:00/28\tMicrovision Inc\n8C:55:70:30:00:00/28\tScandiNova Systems\n8C:55:70:40:00:00/28\tNext Vision Tech(Ningbo)Co.,LTD\n8C:55:70:50:00:00/28\tPrivate\n8C:55:70:60:00:00/28\tJoule Group Limites\n8C:55:70:70:00:00/28\tEideal Company Limited\n8C:55:70:80:00:00/28\tNayax LTD\n8C:55:70:90:00:00/28\tNeptronic Ltd\n8C:55:70:A0:00:00/28\tFortune Brands Innovations, Inc.\n8C:55:70:B0:00:00/28\tSernet (Suzhou) Technologies Corporation\n8C:55:70:C0:00:00/28\tAntronix Inc.,\n8C:55:70:D0:00:00/28\tEPSa Elektronik & Präzisionsbau Saalfeld GmbH\n8C:55:70:E0:00:00/28\tJohnson Health Tech. (Shanghai) Co.,Ltd.\n8C:55:BB\t\tSongwoo Information & Technology Co., Ltd\n8C:56:46\t\tLG Electronics\n8C:56:9D\t\tImaging Solutions Group\n8C:56:C5\t\tNintendo Co., Ltd.\n8C:57:9B\t\tWistron Neweb Corporation\n8C:57:FD\t\tLVX Western\n8C:58:23\t\tSz Dji Technology Co.,Ltd\n8C:58:77\t\tApple, Inc.\n8C:59:3C\t\tIEEE Registration Authority\n8C:59:3C:00:00:00/28\tFujian Chaozhi Group Co., Ltd.\n8C:59:3C:10:00:00/28\tFuture Robot Technology Co., Limited\n8C:59:3C:20:00:00/28\tBeida Jade Bird Universal Fire Alarm Device CO.,LTD.\n8C:59:3C:30:00:00/28\tChongqing beimoting technology co.ltd\n8C:59:3C:40:00:00/28\tGuralp Systems Limited\n8C:59:3C:50:00:00/28\tSpectranetix\n8C:59:3C:60:00:00/28\tQbic Technology Co., Ltd\n8C:59:3C:70:00:00/28\tOBO Pro.2 Inc.\n8C:59:3C:80:00:00/28\tNanonord A/S\n8C:59:3C:90:00:00/28\tGenis\n8C:59:3C:A0:00:00/28\tecom instruments GmbH\n8C:59:3C:B0:00:00/28\tScharfe-Sicht GmbH\n8C:59:3C:C0:00:00/28\tDantherm Cooling Inc.\n8C:59:3C:D0:00:00/28\tIdro-Elettrica S.P.A.\n8C:59:3C:E0:00:00/28\tShenzhen Tian-Power Technology Co.,Ltd.\n8C:59:73\t\tZyxel Communications Corporation\n8C:59:8B\t\tC Technologies AB\n8C:59:C3\t\tADB Italia\n8C:59:DC\t\tASR Microelectronics (Shanghai) Co., Ltd.\n8C:5A:25\t\tCommscope\n8C:5A:C1\t\tHuawei Device Co., Ltd.\n8C:5A:F0\t\tExeltech Solar Products\n8C:5A:F8\t\tBeijing Xiaomi Electronics Co., Ltd.\n8C:5B:F0\t\tCommscope\n8C:5C:20\t\tVantiva USA LLC\n8C:5C:53\t\tAltoBeam Inc.\n8C:5C:A1\t\td-broad,INC\n8C:5D:60\t\tUCI Corporation Co.,Ltd.\n8C:5D:B2\t\tIEEE Registration Authority\n8C:5D:B2:00:00:00/28\tNpp Ntt Llc\n8C:5D:B2:10:00:00/28\tDayouplus\n8C:5D:B2:20:00:00/28\tF+ Networks\n8C:5D:B2:30:00:00/28\tYuzhou Zhongnan lnformation Technology Co.,Ltd\n8C:5D:B2:40:00:00/28\tCoreTigo\n8C:5D:B2:50:00:00/28\tUnite Audio\n8C:5D:B2:60:00:00/28\tSmartMore Corporation Limited\n8C:5D:B2:70:00:00/28\tCleartex s.r.o.\n8C:5D:B2:80:00:00/28\tGuangzhou Phimax Electronic Technology Co.,Ltd\n8C:5D:B2:90:00:00/28\tIssendorff Kg\n8C:5D:B2:A0:00:00/28\tBeijing Scistor Technologies Co., Ltd\n8C:5D:B2:B0:00:00/28\tNaddod\n8C:5D:B2:C0:00:00/28\tHEXIN Technologies Co., Ltd.\n8C:5D:B2:D0:00:00/28\tGuandong Yuhang Automation Technology Co.,Ltd\n8C:5D:B2:E0:00:00/28\tSurbhi Satcom Pvt Ltd\n8C:5E:4D\t\tDragonWave Technologies DMCC\n8C:5E:BD\t\tHuawei Device Co., Ltd.\n8C:5F:48\t\tContinental Intelligent Transportation Systems LLC\n8C:5F:AD\t\tFiberhome Telecommunication Technologies Co.,LTD\n8C:5F:DF\t\tBeijing Railway Signal Factory\n8C:60:4F\t\tCisco Systems, Inc\n8C:60:78\t\tSwissbit AG\n8C:60:E7\t\tMpgio Co.,Ltd\n8C:61:02\t\tBeijing Baofengmojing Technologies Co., Ltd\n8C:61:20\t\tEM Microelectronic\n8C:61:A3\t\tCommscope\n8C:64:0B\t\tBeyond Devices d.o.o.\n8C:64:22\t\tSony Corporation\n8C:64:A2\t\tOnePlus Technology (Shenzhen) Co., Ltd\n8C:64:D4\t\tHyeco Smart Tech Co.,Ltd\n8C:65:A3\t\tSilicon Laboratories\n8C:67:94\t\tvivo Mobile Communication Co., Ltd.\n8C:68:3A\t\tHuawei Technologies Co.,Ltd\n8C:68:78\t\tNortek-AS\n8C:68:C8\t\tzte corporation\n8C:6A:3B\t\tSamsung Electronics Co.,Ltd\n8C:6A:8D\t\tVantiva USA LLC\n8C:6A:E4\t\tViogem Limited\n8C:6B:DB\t\tHuawei Device Co., Ltd.\n8C:6D:50\t\tShenzhen Mtc Co Ltd\n8C:6D:77\t\tHuawei Technologies Co.,Ltd\n8C:6D:C4\t\tMegapixel VR\n8C:6F:B9\t\tSilicon Laboratories\n8C:70:5A\t\tIntel Corporate\n8C:70:86\t\tGesellschaft für Sonder-EDV-Anlagen mbH\n8C:71:12\t\tMicrochip Technologies Inc\n8C:71:F8\t\tSamsung Electronics Co.,Ltd\n8C:73:6E\t\tFujitsu Limited\n8C:73:A0\t\tFiberhome Telecommunication Technologies Co.,LTD\n8C:73:DA\t\tSilicon Laboratories\n8C:76:3F\t\tCommscope\n8C:76:C1\t\tGoden Tech Limited\n8C:77:12\t\tSamsung Electronics Co.,Ltd\n8C:77:16\t\tLongcheer Telecommunication Limited\n8C:78:D7\t\tShenzhen Fast Technologies Co.,Ltd\n8C:79:09\t\tHewlett Packard Enterprise\n8C:79:67\t\tzte corporation\n8C:79:F5\t\tSamsung Electronics Co.,Ltd\n8C:7A:00\t\tNokia\n8C:7A:15\t\tRuckus Wireless\n8C:7A:3D\t\tXiaomi Communications Co Ltd\n8C:7A:AA\t\tApple, Inc.\n8C:7A:B3\t\tGuangzhou Shiyuan Electronic Technology Company Limited\n8C:7B:9D\t\tApple, Inc.\n8C:7B:F0\t\tXufeng Development Limited\n8C:7C:92\t\tApple, Inc.\n8C:7C:B5\t\tHon Hai Precision Ind. Co.,Ltd.\n8C:7C:FF\t\tBrocade Communications Systems LLC\n8C:7E:B3\t\tLytro, Inc.\n8C:7F:3B\t\tCommscope\n8C:81:26\t\tArcom\n8C:81:72\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n8C:82:A8\t\tInsigma Technology Co.,Ltd\n8C:83:94\t\tArcadyan Corporation\n8C:83:9D\t\tShenzhen Xinyupeng Electronic Technology Co., Ltd\n8C:83:DF\t\tNokia\n8C:83:E1\t\tSamsung Electronics Co.,Ltd\n8C:83:E8\t\tHuawei Technologies Co.,Ltd\n8C:83:FC\t\tAxioma Metering UAB\n8C:84:01\t\tPrivate\n8C:84:42\t\tCisco Systems, Inc\n8C:84:74\t\tBroadcom Limited\n8C:85:80\t\tSmart Innovation LLC\n8C:85:90\t\tApple, Inc.\n8C:85:C1\t\tHewlett Packard Enterprise\n8C:85:E6\t\tCleondris GmbH\n8C:86:1E\t\tApple, Inc.\n8C:86:2A\t\tHuawei Technologies Co.,Ltd\n8C:86:DD\t\tTP-Link Systems Inc.\n8C:87:26\t\tVAST Data Inc\n8C:87:3B\t\tLeica Camera AG\n8C:87:D0\t\tShenzhen Uascent Technology Co.,Ltd\n8C:88:81\t\tCisco Meraki\n8C:89:7A\t\tAugtek\n8C:89:A5\t\tMicro-Star INT'L CO., LTD\n8C:89:FA\t\tZhejiang Hechuan Technology Co., Ltd.\n8C:8A:6E\t\tEstun Automation Technoloy Co., Ltd\n8C:8A:BB\t\tBeijing Orient View Technology Co., Ltd.\n8C:8A:CD\t\tHuawei Technologies Co.,Ltd\n8C:8B:48\t\tSilicon Laboratories\n8C:8B:5B\t\tWistron Neweb Corporation\n8C:8B:83\t\tTexas Instruments\n8C:8C:AA\t\tLCFC(Hefei) Electronics Technology co., ltd\n8C:8D:28\t\tIntel Corporate\n8C:8E:0D\t\tzte corporation\n8C:8E:4E\t\tBaylan Olcu Aletleri San. ve Tic.A.S.\n8C:8E:76\t\ttaskit GmbH\n8C:8E:F2\t\tApple, Inc.\n8C:8F:8B\t\tChina Mobile Chongqing branch\n8C:8F:E9\t\tApple, Inc.\n8C:90:2D\t\tTP-Link Systems Inc.\n8C:90:D3\t\tNokia\n8C:91:09\t\tToyoshima Electric Technoeogy(Suzhou) Co.,Ltd.\n8C:91:3A\t\tMellanox Technologies, Inc.\n8C:92:36\t\tAus.Linx Technology Co., Ltd.\n8C:92:46\t\tOerlikon Textile Gmbh&Co.KG\n8C:93:51\t\tJigowatts Inc.\n8C:93:8B\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n8C:94:1F\t\tCisco Systems, Inc\n8C:94:61\t\tCisco Systems, Inc\n8C:94:6A\t\tNew H3C Technologies Co., Ltd\n8C:94:CC\t\tSfr\n8C:94:CF\t\tEncell Technology, Inc.\n8C:96:5F\t\tShandong Zhongan Technology Co., Ltd.\n8C:96:A5\t\tNew H3C Technologies Co., Ltd\n8C:97:EA\t\tFreebox Sas\n8C:98:06\t\tShenzhen Sei Robotics Co.,Ltd\n8C:98:6B\t\tApple, Inc.\n8C:99:E6\t\tTCT mobile ltd\n8C:9A:8F\t\tSagemcom Broadband SAS\n8C:9B:2D\t\tPlantronics, Inc.\n8C:9F:3B\t\tQingdao Hisense Communications Co.,Ltd.\n8C:A0:48\t\tBeijing NeTopChip Technology Co.,LTD\n8C:A2:FD\t\tStarry, Inc.\n8C:A3:99\t\tServercom (India) Private Limited\n8C:A4:01\t\tShenzhen New Chip Intelligence Co.,LTD\n8C:A5:A1\t\tOregano Systems - Design & Consulting GmbH\n8C:A5:CF\t\tHuawei Technologies Co.,Ltd\n8C:A6:82\t\tIEEE Registration Authority\n8C:A6:82:00:00:00/28\tAI SECURITY Co.Ltd.\n8C:A6:82:10:00:00/28\tFightCamp\n8C:A6:82:20:00:00/28\tLion Energy\n8C:A6:82:30:00:00/28\tRoyal Way General Trading LLC\n8C:A6:82:40:00:00/28\tChina Information Technology Designing&Consulting Institute Co., Ltd.\n8C:A6:82:50:00:00/28\tQstar Technology Co,Ltd\n8C:A6:82:60:00:00/28\tShangHai Huijue Network Communication Equipment CO., Ltd.\n8C:A6:82:70:00:00/28\tAnhui seeker electronic technology Co.,LTD\n8C:A6:82:80:00:00/28\tSchok LLC\n8C:A6:82:90:00:00/28\tBarkodes Bilgisayar Sistemleri Bilgi Iletisim ve Y\n8C:A6:82:A0:00:00/28\tSchok LLC\n8C:A6:82:B0:00:00/28\tPocketalk Corp.\n8C:A6:82:C0:00:00/28\tNetskope\n8C:A6:82:D0:00:00/28\tEFit partners\n8C:A6:82:E0:00:00/28\tTexys International\n8C:A6:DF\t\tTp-Link Technologies Co.,Ltd.\n8C:A9:6D\t\tHuawei Technologies Co.,Ltd\n8C:A9:6F\t\tD&M Holdings Inc.\n8C:A9:82\t\tIntel Corporate\n8C:AA:B5\t\tEspressif Inc.\n8C:AA:CE\t\tXiaomi Communications Co Ltd\n8C:AB:8E\t\tShanghai Feixun Communication Co.,Ltd.\n8C:AE:49\t\tIEEE Registration Authority\n8C:AE:49:00:00:00/28\tOuman Oy\n8C:AE:49:10:00:00/28\tH3 Platform\n8C:AE:49:20:00:00/28\tSEVERIN Elektrogeräte GmbH\n8C:AE:49:30:00:00/28\tBertin Technologies\n8C:AE:49:40:00:00/28\tJiangsu Sixingda Information Technology Co., Ltd.\n8C:AE:49:50:00:00/28\tGati Information Technolog(Kunshan)Co.,Ltd.\n8C:AE:49:60:00:00/28\tChengdu BillDTE Technology Co., Ltd\n8C:AE:49:70:00:00/28\tPrecitec Optronik GmbH\n8C:AE:49:80:00:00/28\tLLC Taipit - Measuring Equipment\n8C:AE:49:90:00:00/28\tTTR Corporation\n8C:AE:49:A0:00:00/28\tGigawave\n8C:AE:49:B0:00:00/28\tSuzhou Guowang Electronics Technology Co., Ltd.\n8C:AE:49:C0:00:00/28\tParametric GmbH\n8C:AE:49:D0:00:00/28\tLarch Networks\n8C:AE:49:E0:00:00/28\tShenzhen C & D Electronics Co., Ltd.\n8C:AE:4C\t\tPlugable Technologies\n8C:AE:89\t\tY-cam Solutions Ltd\n8C:AE:DB\t\tNagtech Llc\n8C:B0:94\t\tAirtech I&C Co., Ltd\n8C:B0:E9\t\tSamsung Electronics.,LTD\n8C:B5:0E\t\tCisco Systems, Inc\n8C:B6:4F\t\tCisco Systems, Inc\n8C:B6:C5\t\tMimosa Networks\n8C:B7:F7\t\tShenzhen UniStrong Science & Technology Co., Ltd\n8C:B8:2C\t\tIPitomy Communications\n8C:B8:4A\t\tSamsung Electro-Mechanics(Thailand)\n8C:B8:64\t\tAcSiP Technology Corp.\n8C:B8:7E\t\tIntel Corporate\n8C:BA:25\t\tUnion Man Technology Co.,Ltd\n8C:BA:FC\t\tJOYNEXT GmbH\n8C:BD:37\t\tShenzhen Phaten Tech. LTD\n8C:BE:24\t\tTashang Semiconductor(Shanghai) Co., Ltd.\n8C:BE:6F\t\tTianyi Telecom Terminals Company Limited\n8C:BE:BE\t\tXiaomi Communications Co Ltd\n8C:BF:9D\t\tShanghai Xinyou Information Technology Ltd. Co.\n8C:BF:A6\t\tSamsung Electronics Co.,Ltd\n8C:BF:EA\t\tEspressif Inc.\n8C:C1:21\t\tPanasonic Corporation AVC Networks Company\n8C:C5:73\t\tXsight Labs LTD.\n8C:C5:8C\t\tShenZhen Elsky Technology Co.,LTD\n8C:C5:B4\t\tSagemcom Broadband SAS\n8C:C5:D0\t\tSamsung Electronics Co.,Ltd\n8C:C5:E1\t\tShenZhen Konka Telecommunication Technology Co.,Ltd\n8C:C6:61\t\tCurrent, powered by GE\n8C:C6:81\t\tIntel Corporate\n8C:C7:AA\t\tRadinet Communications Inc.\n8C:C7:C3\t\tNetlink Ict\n8C:C7:D0\t\tzhejiang ebang communication co.,ltd\n8C:C8:4B\t\tChongqing Fugui Electronics Co.,Ltd.\n8C:C8:CD\t\tSamsung Electronics Co.,Ltd\n8C:C8:F4\t\tIEEE Registration Authority\n8C:C8:F4:00:00:00/28\tGuardtec,Inc\n8C:C8:F4:10:00:00/28\tLanhomex Technology(Shen Zhen)Co.,Ltd.\n8C:C8:F4:20:00:00/28\tDark Horse Connect LLC\n8C:C8:F4:30:00:00/28\tToho Denki Ind.Co.,Ltd\n8C:C8:F4:40:00:00/28\tITECH Electronic Co.,ltd.\n8C:C8:F4:50:00:00/28\tBeijing KXWELL Technology CO., LTD\n8C:C8:F4:60:00:00/28\tSHENZHEN D-light Technolgy Limited\n8C:C8:F4:70:00:00/28\tTableSafe\n8C:C8:F4:80:00:00/28\tStrongbyte Solutions Limited\n8C:C8:F4:90:00:00/28\tSwift Navigation Inc\n8C:C8:F4:A0:00:00/28\tTrilux Group Management GmbH\n8C:C8:F4:B0:00:00/28\tPTYPE Co., LTD.\n8C:C8:F4:C0:00:00/28\tShenzhen KSTAR Science and Technology Co., Ltd\n8C:C8:F4:D0:00:00/28\tBeijing Xinxunxintong Eletronics Co.,Ltd\n8C:C8:F4:E0:00:00/28\tEvaporcool Solutions\n8C:C9:E9\t\tHuawei Device Co., Ltd.\n8C:CB:14\t\tTBS GmbH\n8C:CB:DF\t\tFoxconn Interconnect Technology\n8C:CD:55\t\tEM Microelectronic\n8C:CD:A2\t\tACTP, Inc.\n8C:CD:E8\t\tNintendo Co., Ltd.\n8C:CD:FE\t\tAMPAK Technology,Inc.\n8C:CE:4E\t\tEspressif Inc.\n8C:CE:FD\t\tShenzhen zhouhai technology co.,LTD\n8C:CF:09\t\tDell EMC\n8C:CF:5C\t\tBEFEGA GmbH\n8C:CF:8F\t\tITC Systems\n8C:D0:8B\t\tWuXi Rigosys Technology Co.,LTD\n8C:D0:B2\t\tBeijing Xiaomi Mobile Software Co., Ltd\n8C:D1:7B\t\tCG Mobile\n8C:D2:E9\t\tYokote Seiko Co., Ltd.\n8C:D3:A2\t\tVisSim AS\n8C:D4:8E\t\tItel Mobile Limited\n8C:D5:4A\t\tTaiyo Yuden Co.,Ltd\n8C:D6:28\t\tIkor Metering\n8C:D6:7F\t\tEM Microelectronic\n8C:D9:D6\t\tXiaomi Communications Co Ltd\n8C:DB:25\t\tESG Solutions\n8C:DC:02\t\tzte corporation\n8C:DC:D4\t\tHewlett Packard\n8C:DD:0B\t\teero inc.\n8C:DD:8D\t\tWifly-City System Inc.\n8C:DE:52\t\tISSC Technologies Corp.\n8C:DE:99\t\tComlab Inc.\n8C:DE:E6\t\tSamsung Electronics Co.,Ltd\n8C:DE:F9\t\tBeijing Xiaomi Mobile Software Co., Ltd\n8C:DF:2C\t\tvivo Mobile Communication Co., Ltd.\n8C:DF:9D\t\tNEC Corporation\n8C:E0:42\t\tvivo Mobile Communication Co., Ltd.\n8C:E0:81\t\tzte corporation\n8C:E1:17\t\tzte corporation\n8C:E2:DA\t\tCircle Media Inc\n8C:E3:8E\t\tKioxia Corporation\n8C:E4:68\t\tGuangzhou Sageran Technology Co., Ltd.\n8C:E4:DB\t\tShenzhen MiaoMing Intelligent Technology Co.,Ltd\n8C:E5:C0\t\tSamsung Electronics Co.,Ltd\n8C:E5:EF\t\tHuawei Technologies Co.,Ltd\n8C:E7:48\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n8C:E7:8C\t\tDK Networks\n8C:E7:B3\t\tSonardyne International Ltd\n8C:E9:B4\t\tZhejiang Dahua Technology Co., Ltd.\n8C:E9:EE\t\tIntel Corporate\n8C:E9:FF\t\tDell Inc.\n8C:EA:12\t\tShenzhen MiaoMing  Intelligent Technology Co.,Ltd\n8C:EA:1B\t\tEdgecore Networks Corporation\n8C:EA:48\t\tSamsung Electronics Co.,Ltd\n8C:EA:88\t\tChengdu Yocto Communication Technology Co.Ltd.\n8C:EB:C6\t\tHuawei Technologies Co.,Ltd\n8C:EC:4B\t\tDell Inc.\n8C:EC:7B\t\tApple, Inc.\n8C:ED:E1\t\tUbiquiti Inc\n8C:EE:C6\t\tPrecepscion Pty. Ltd.\n8C:EE:FD\t\tzte corporation\n8C:F0:DF\t\tBeijing Zhongyuan Yishang Technology Co.,LTD\n8C:F1:12\t\tMotorola Mobility LLC, a Lenovo Company\n8C:F2:28\t\tMercury Communication Technologies Co.,Ltd.\n8C:F3:19\t\tSiemens Industrial Automation Products Ltd., Chengdu\n8C:F3:E7\t\tsolidotech\n8C:F5:A3\t\tSamsung Electro-Mechanics(Thailand)\n8C:F6:81\t\tSilicon Laboratories\n8C:F7:10\t\tAMPAK Technology, Inc.\n8C:F7:73\t\tNokia\n8C:F8:13\t\tOrange Polska\n8C:F8:C5\t\tIntel Corporate\n8C:F9:45\t\tPower Automation pte Ltd\n8C:F9:57\t\tRuiXingHengFang Network (Shenzhen) Co.,Ltd\n8C:F9:C9\t\tMESADA Technology Co.,Ltd.\n8C:FA:BA\t\tApple, Inc.\n8C:FA:DD\t\tHuawei Technologies Co.,Ltd\n8C:FC:A0\t\tShenzhen Smart Device Technology Co., LTD.\n8C:FD:15\t\tImagine Marketing Private Limited\n8C:FD:18\t\tHuawei Technologies Co.,Ltd\n8C:FD:DE\t\tSagemcom Broadband SAS\n8C:FD:F0\t\tQualcomm Inc.\n8C:FE:57\t\tApple, Inc.\n8C:FE:74\t\tRuckus Wireless\n8C:FE:B4\t\tVsoontech Electronics Co., Limited\n90:00:4E\t\tHon Hai Precision Ind. Co.,Ltd.\n90:00:DB\t\tSamsung Electronics Co.,Ltd\n90:01:17\t\tHuawei Technologies Co.,Ltd\n90:01:3B\t\tSagemcom Broadband SAS\n90:02:18\t\tSky Uk Limited\n90:02:7A\t\tShenzhen Sworix Techonlogy Co., Ltd\n90:02:8A\t\tShenzhen Shidean Legrand Electronic Products Co.,Ltd\n90:02:A9\t\tZhejiang Dahua Technology Co., Ltd.\n90:03:25\t\tHuawei Technologies Co.,Ltd\n90:03:2E\t\tTaicang T&W Electronics\n90:03:71\t\tQuectel Wireless Solutions Co.,Ltd.\n90:03:72\t\tLongnan Junya Digital Technology Co. Ltd.\n90:03:B7\t\tParrot Sa\n90:06:28\t\tSamsung Electronics Co.,Ltd\n90:06:F2\t\tTexas Instruments\n90:09:17\t\tFar-sighted mobile\n90:09:D0\t\tSynology Incorporated\n90:09:DF\t\tIntel Corporate\n90:0A:1A\t\tTaicang T&W Electronics\n90:0A:39\t\tWiio, Inc.\n90:0A:3A\t\tPSG Plastic Service GmbH\n90:0A:62\t\tInventus Power Eletronica do Brasil LTDA\n90:0A:84\t\tMellanox Technologies, Inc.\n90:0B:C1\t\tSprocomm Technologies CO.,Ltd\n90:0C:B4\t\tAlinket Electronic Technology Co., Ltd\n90:0C:C8\t\tGoogle, Inc.\n90:0D:66\t\tDigimore Electronics Co., Ltd\n90:0D:CB\t\tCommscope\n90:0E:83\t\tMonico Monitoring, Inc.\n90:0E:9E\t\tShenzhen SuperElectron Technology Co.,Ltd.\n90:0E:B3\t\tShenzhen Amediatech Technology Co., Ltd.\n90:0F:0C\t\tCloud Network Technology Singapore Pte. Ltd.\n90:10:57\t\tIntel Corporate\n90:11:95\t\tAmazon Technologies Inc.\n90:12:34\t\tShenzhen YOUHUA Technology Co., Ltd\n90:12:A1\t\tWe Corporation Inc.\n90:13:DA\t\tAthom B.V.\n90:14:AF\t\tCambium Networks Limited\n90:15:06\t\tEspressif Inc.\n90:15:64\t\tIEEE Registration Authority\n90:15:64:00:00:00/28\tFengzhushou Co., Ltd.\n90:15:64:20:00:00/28\tPin Genie, Inc.Dba Lockly\n90:15:64:30:00:00/28\tClinton Electronics Corporation\n90:15:64:40:00:00/28\tKontakt Micro-Location Sp z o.o.\n90:15:64:50:00:00/28\tRelectrify Pty Ltd\n90:15:64:60:00:00/28\tfinal Inc.\n90:15:64:70:00:00/28\tHangzhou System Technology Co.,Ltd\n90:15:64:80:00:00/28\tHeliogen\n90:15:64:90:00:00/28\tAnnapurna labs\n90:15:64:A0:00:00/28\tBunka Shutter Co., Ltd.\n90:15:64:B0:00:00/28\tShanghai AMP&MOONS'Automation Co.,Ltd.\n90:15:64:C0:00:00/28\tLinak A/S\n90:15:64:D0:00:00/28\tJiangsu Kangjie Data Co., Ltd.\n90:15:64:E0:00:00/28\tGuiyag Electrlcal Control Equipment Co.,Ltd\n90:16:BA\t\tHuawei Technologies Co.,Ltd\n90:17:11\t\tHagenuk Marinekommunikation GmbH\n90:17:3F\t\tHuawei Technologies Co.,Ltd\n90:17:9B\t\tNanomegas\n90:17:AC\t\tHuawei Technologies Co.,Ltd\n90:17:C8\t\tHuawei Technologies Co.,Ltd\n90:18:5E\t\tApex Tool Group GmbH & Co OHG\n90:18:7C\t\tSamsung Electro Mechanics Co., Ltd.\n90:18:AE\t\tShanghai Meridian Technologies, Co. Ltd.\n90:19:00\t\tScs Sa\n90:1A:4F\t\tEM Microelectronic\n90:1A:CA\t\tCommscope\n90:1B:0E\t\tFujitsu Technology Solutions GmbH\n90:1D:27\t\tzte corporation\n90:1E:DD\t\tGreat Computer Corporation\n90:20:3A\t\tBYD Precision Manufacture Co.,Ltd\n90:20:83\t\tGeneral Engine Management Systems Ltd.\n90:20:C2\t\tHewlett Packard Enterprise\n90:21:06\t\tSky Uk Limited\n90:21:2E\t\tApption Labs Ltd\n90:21:55\t\tHTC Corporation\n90:21:81\t\tShanghai Huaqin Telecom Technology Co.,Ltd\n90:23:5B\t\tAmazon Technologies Inc.\n90:23:B4\t\tNew H3C Technologies Co., Ltd\n90:23:EC\t\tAvailink, Inc.\n90:25:F2\t\tHuawei Technologies Co.,Ltd\n90:27:2B\t\tAlgorab S.r.l.\n90:27:59\t\tNanjing Jiahao Technology Co., Ltd.\n90:27:78\t\tOpen Infrastructure\n90:27:E4\t\tApple, Inc.\n90:28:F6\t\tWuhan Yangtze Optical Technology CO.,Ltd.\n90:2A:EE\t\tXiaomi Communications Co Ltd\n90:2B:34\t\tGiga-Byte Technology Co.,Ltd.\n90:2B:D2\t\tHuawei Technologies Co.,Ltd\n90:2C:09\t\tApple, Inc.\n90:2C:C7\t\tC-MAX Asia Limited\n90:2C:FB\t\tCanTops Co,.Ltd.\n90:2D:77\t\tEdgecore Americas Networking Corporation\n90:2E:16\t\tLCFC(Hefei) Electronics Technology co., ltd\n90:2E:1C\t\tIntel Corporate\n90:2E:87\t\tLabJack\n90:31:4B\t\tAltoBeam Inc.\n90:31:CD\t\tOnyx Healthcare Inc.\n90:32:4B\t\tHon Hai Precision Ind. Co.,Ltd.\n90:34:2B\t\tGatekeeper Systems, Inc.\n90:34:FC\t\tHon Hai Precision Ind. Co.,Ltd.\n90:35:6E\t\tVodafone Omnitel N.V.\n90:35:EA\t\tSilicon Laboratories\n90:38:09\t\tEricsson AB\n90:38:0C\t\tEspressif Inc.\n90:38:DF\t\tChangzhou Tiannengbo System Co. Ltd.\n90:39:5E\t\tSilicon Laboratories\n90:39:5F\t\tAmazon Technologies Inc.\n90:3A:72\t\tRuckus Wireless\n90:3A:A0\t\tNokia\n90:3A:E6\t\tParrot Sa\n90:3C:1D\t\tHisense Visual Technology Co.,Ltd\n90:3C:92\t\tApple, Inc.\n90:3C:AE\t\tYunnan KSEC Digital Technology Co.,Ltd.\n90:3C:B3\t\tEdgecore Networks Corporation\n90:3C:DA\t\tFiberhome Telecommunication Technologies Co.,LTD\n90:3D:5A\t\tShenzhen Wision Technology Holding Limited\n90:3D:68\t\tG-Printec, Inc.\n90:3D:6B\t\tZicon Technology Corp.\n90:3D:BD\t\tSecure Meters Limited\n90:3E:7F\t\tFiberhome Telecommunication Technologies Co.,LTD\n90:3E:AB\t\tCommscope\n90:3F:C3\t\tHuawei Device Co., Ltd.\n90:3F:EA\t\tHuawei Technologies Co.,Ltd\n90:43:E2\t\tCornami, Inc\n90:45:06\t\tTokyo Boeki Medisys Inc.\n90:45:28\t\tNintendo Co.,Ltd\n90:46:A2\t\tTedipay UK Ltd\n90:46:B7\t\tVadaro Pte Ltd\n90:47:16\t\tRorze Corporation\n90:47:3C\t\tChina Mobile Group Device Co.,Ltd.\n90:47:48\t\tSony Interactive Entertainment Inc.\n90:48:46\t\tTexas Instruments\n90:48:6C\t\tRing LLC\n90:48:9A\t\tHon Hai Precision Ind. Co.,Ltd.\n90:49:92\t\tYSTen Technology Co.,Ltd\n90:49:FA\t\tIntel Corporate\n90:4C:02\t\tvivo Mobile Communication Co., Ltd.\n90:4C:81\t\tHewlett Packard Enterprise\n90:4C:C5\t\tApple, Inc.\n90:4C:E5\t\tHon Hai Precision Ind. Co.,Ltd.\n90:4D:4A\t\tSagemcom Broadband SAS\n90:4D:C3\t\tFlonidan A/S\n90:4E:2B\t\tHuawei Technologies Co.,Ltd\n90:4E:91\t\tIEEE Registration Authority\n90:4E:91:00:00:00/28\tSpirtech\n90:4E:91:10:00:00/28\tApollo Video Technology\n90:4E:91:20:00:00/28\tNorth Pole Engineering, Inc.\n90:4E:91:30:00:00/28\tGreat Talent Technology Limited\n90:4E:91:40:00:00/28\tWrtnode technology Inc.\n90:4E:91:50:00:00/28\tEnginko Srl\n90:4E:91:60:00:00/28\tNuwa Robotics (HK) Limited Taiwan Branch\n90:4E:91:70:00:00/28\tIbm\n90:4E:91:80:00:00/28\tCommandScape, Inc.\n90:4E:91:90:00:00/28\tCUTTER Systems spol. s r.o.\n90:4E:91:A0:00:00/28\tKaertech Limited\n90:4E:91:B0:00:00/28\tShanghai JaWay Information Technology Co., Ltd.\n90:4E:91:C0:00:00/28\tShowtacle s.r.o.\n90:4E:91:D0:00:00/28\tSKODA ELECTRIC a.s.\n90:4E:91:E0:00:00/28\tShenzhen Cloudynamo Internet Technologies Co.,LTD.\n90:50:5A\t\tunGlue, Inc\n90:50:7B\t\tAdvanced PANMOBIL Systems GmbH & Co. KG\n90:50:CA\t\tHitron Technologies. Inc\n90:51:3F\t\tElettronica Santerno SpA\n90:52:BF\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n90:54:46\t\tTes Electronic Solutions\n90:54:B7\t\tEltex Enterprise LTD\n90:55:AE\t\tEricsson, EAB/RWI/K\n90:55:DE\t\tFiberhome Telecommunication Technologies Co.,LTD\n90:56:07\t\tSichuan AI-Link Technology Co., Ltd.\n90:56:71\t\tCisco Systems, Inc\n90:56:82\t\tLenbrook Industries Limited\n90:56:92\t\tAutotalks Ltd.\n90:56:FC\t\tTecno Mobile Limited\n90:58:51\t\tVantiva USA LLC\n90:59:3C\t\tAz-Technology Sdn Bhd\n90:59:AF\t\tTexas Instruments\n90:5A:08\t\tSuper Micro Computer, Inc.\n90:5C:34\t\tSirius Electronic Systems Srl\n90:5C:44\t\tCompal Broadband Networks, Inc.\n90:5D:7C\t\tNew H3C Technologies Co., Ltd\n90:5E:44\t\tHuawei Technologies Co.,Ltd\n90:5F:2E\t\tTCT mobile ltd\n90:5F:7A\t\tApple, Inc.\n90:5F:8D\t\tmodas GmbH\n90:60:F1\t\tApple, Inc.\n90:61:0C\t\tFida International (S) Pte Ltd\n90:61:AE\t\tIntel Corporate\n90:62:3F\t\tApple, Inc.\n90:63:3B\t\tSamsung Electronics Co.,Ltd\n90:64:AD\t\tHuawei Technologies Co.,Ltd\n90:65:60\t\tEM Microelectronic\n90:65:84\t\tIntel Corporate\n90:67:17\t\tAlphion India Private Limited\n90:67:1C\t\tHuawei Technologies Co.,Ltd\n90:67:B5\t\tAlcatel-Lucent\n90:67:F3\t\tAlcatel Lucent\n90:68:C3\t\tMotorola Mobility LLC, a Lenovo Company\n90:69:76\t\tWithrobot Inc.\n90:6A:94\t\thangzhou huacheng network technology co., ltd\n90:6A:EB\t\tMicrosoft Corporation\n90:6C:4B\t\tAdvance Security Electronics\n90:6C:AC\t\tFortinet, Inc.\n90:6D:05\t\tBxb Electronics Co., Ltd\n90:6D:62\t\tCambium Networks Limited\n90:6D:C8\t\tDLG Automação Industrial Ltda\n90:6E:BB\t\tHon Hai Precision Ind. Co.,Ltd.\n90:6F:18\t\tPrivate\n90:6F:A9\t\tNanjing Putian Telecommunications Technology Co.,Ltd.\n90:70:25\t\tGarea Microsys Co.,Ltd.\n90:70:65\t\tTexas Instruments\n90:70:BF\t\tMimosa Networks\n90:70:D3\t\tFiberhome Telecommunication Technologies Co.,LTD\n90:72:40\t\tApple, Inc.\n90:72:82\t\tSagemcom Broadband SAS\n90:73:5A\t\tMotorola Mobility LLC, a Lenovo Company\n90:74:2E\t\tNew H3C Technologies Co., Ltd\n90:74:9D\t\tIRay Technology Co., Ltd.\n90:75:BC\t\tNokia Shanghai Bell Co., Ltd.\n90:75:DE\t\tZebra Technologies Inc.\n90:76:9F\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\n90:77:EE\t\tCisco Systems, Inc\n90:78:41\t\tIntel Corporate\n90:78:B2\t\tXiaomi Communications Co Ltd\n90:79:10\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n90:79:90\t\tBenchmark Electronics Romania SRL\n90:79:CF\t\tzte corporation\n90:7A:0A\t\tGebr. Bode GmbH & Co KG\n90:7A:28\t\tBeijing Morncloud Information And Technology Co. Ltd.\n90:7A:58\t\tZegna-Daidong Limited\n90:7A:F1\t\tWally\n90:7B:C6\t\tTexas Instruments\n90:7E:30\t\tLars\n90:7E:43\t\tzte corporation\n90:7E:BA\t\tUtek Technology (Shenzhen) Co.,Ltd\n90:7F:61\t\tChicony Electronics Co., Ltd.\n90:80:60\t\tNilfisk A/S\n90:80:8F\t\tHuawei Device Co., Ltd.\n90:81:2A\t\tApple, Inc.\n90:81:58\t\tApple, Inc.\n90:81:75\t\tSamsung Electronics Co.,Ltd\n90:82:60\t\tIEEE 1904.1 Working Group\n90:82:C3\t\tQuanta Computer Inc.\n90:83:4B\t\tBeijing Yunyi Times Technology Co,.Ltd\n90:83:7A\t\tGeneral Electric Water & Process Technologies\n90:83:7E\t\tFiberhome Telecommunication Technologies Co.,LTD\n90:84:0D\t\tApple, Inc.\n90:84:2B\t\tLEGO System A/S\n90:84:8B\t\tHDR10+ Technologies, LLC\n90:86:74\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n90:86:9B\t\tzte corporation\n90:88:55\t\tCisco Systems, Inc\n90:88:A2\t\tIonics Technology Me Ltda\n90:88:A9\t\tIEEE Registration Authority\n90:88:A9:00:00:00/28\tshenzhen zovoton electronic co.,ltd\n90:88:A9:10:00:00/28\tAkarui Networks Pvt Ltd\n90:88:A9:20:00:00/28\t合肥乾盾智能科技有限公司\n90:88:A9:30:00:00/28\tHangzhou Hollysys Automation Co., Ltd\n90:88:A9:40:00:00/28\tasmote ltd.\n90:88:A9:50:00:00/28\tShortcut Labs AB\n90:88:A9:60:00:00/28\tSkysolid Information Security Systems(Shenzhen) Co., Ltd\n90:88:A9:70:00:00/28\tWingtech Mobile Communications Co.,Ltd.\n90:88:A9:80:00:00/28\tSamway Electronic SRL\n90:88:A9:90:00:00/28\tNanjing Boswell Industrial Communication Technology Co., Ltd\n90:88:A9:A0:00:00/28\tYi Tunnel(beijing) Technology Co.,Ltd\n90:88:A9:B0:00:00/28\tUXV Technologies ApS\n90:88:A9:C0:00:00/28\tRikom Technologies Sdn Bhd\n90:88:A9:D0:00:00/28\tRemowireless Communication International Co.,Limited\n90:88:A9:E0:00:00/28\tTeeJet Technologies\n90:89:38\t\tHefei Linkin Technology Co., Ltd.\n90:89:5F\t\tWeifang Goertek Electronics Co.,Ltd\n90:8C:09\t\tTotal Phase\n90:8C:43\t\tApple, Inc.\n90:8C:44\t\tH.K Zongmu Technology Co., Ltd.\n90:8C:63\t\tGZ Weedong Networks Technology Co. , Ltd\n90:8D:1D\t\tGH Technologies\n90:8D:6C\t\tApple, Inc.\n90:8D:6E\t\tDell Inc.\n90:8D:78\t\tD-Link International\n90:8F:CF\t\tUNO System Co., Ltd\n90:90:3C\t\tTrison Technology Corporation\n90:90:60\t\tRsi Video Technologies\n90:91:64\t\tChongQing Lavid Technology Co., Ltd.\n90:92:B4\t\tDiehl BGT Defence GmbH & Co. KG\n90:93:5A\t\tCommscope\n90:94:0A\t\tAnalog Devices, Inc\n90:94:97\t\tHuawei Technologies Co.,Ltd\n90:94:E4\t\tD-Link International\n90:95:07\t\tHuawei Technologies Co.,Ltd\n90:96:F3\t\tBuffalo.Inc\n90:97:D5\t\tEspressif Inc.\n90:97:F3\t\tSamsung Electronics Co.,Ltd\n90:98:38\t\tHuawei Device Co., Ltd.\n90:98:64\t\tImpex-Sat GmbH&Co KG\n90:98:77\t\tVestel Elektronik San ve Tic. A.S.\n90:99:16\t\tELVEES NeoTek OJSC\n90:9A:4A\t\tTp-Link Technologies Co.,Ltd.\n90:9A:77\t\tTexas Instruments\n90:9B:6F\t\tApple, Inc.\n90:9C:4A\t\tApple, Inc.\n90:9D:7D\t\tCommscope\n90:9D:AC\t\tInfinix mobility limited\n90:9D:E0\t\tNewland Design + Assoc. Inc.\n90:9E:24\t\tekey biometric systems gmbh\n90:9F:22\t\tZyxel Communications Corporation\n90:9F:33\t\tEFM Networks\n90:9F:43\t\tAccutron Instruments Inc.\n90:A0:BE\t\tCannice\n90:A1:37\t\tBeijing Splendidtel Communication Technology Co,. Ltd\n90:A1:96\t\tPrivate\n90:A1:BA\t\tPNetworks Electronics Information\n90:A2:10\t\tUnited Telecoms Ltd\n90:A2:5B\t\tApple, Inc.\n90:A2:DA\t\tGheo Sa\n90:A3:65\t\tHMD Global Oy\n90:A4:6A\t\tSisnet Co., Ltd\n90:A4:DE\t\tWistron Neweb Corporation\n90:A5:7D\t\tHuawei Device Co., Ltd.\n90:A5:AF\t\tHuawei Technologies Co.,Ltd\n90:A6:2F\t\tNaver\n90:A6:BF\t\tQuectel Wireless Solutions Co.,Ltd.\n90:A7:83\t\tJsw Pacific Corporation\n90:A7:BF\t\tEM Microelectronic\n90:A7:C1\t\tPakedge Device and Software Inc.\n90:A8:22\t\tAmazon Technologies Inc.\n90:A9:35\t\tJWEntertainment\n90:A9:F7\t\tIEEE Registration Authority\n90:A9:F7:00:00:00/28\tVersta\n90:A9:F7:10:00:00/28\tShenzhen Chainway Information Technology Co., Ltd\n90:A9:F7:20:00:00/28\tSuzhou Lingchen Acquisition Computer\n90:A9:F7:30:00:00/28\tSuzhou Etag-Technology Corporation\n90:A9:F7:40:00:00/28\tLab-El Elektronika Laboratoryjna\n90:A9:F7:50:00:00/28\tShenzhen DOOGEE Hengtong Technology CO.,LTD\n90:A9:F7:60:00:00/28\tShenzhen Eevin Technology Co.,Ltd\n90:A9:F7:70:00:00/28\tGuangdong Keruide Electrical Technology Co., Ltd.\n90:A9:F7:80:00:00/28\tBaoding Forlinx Embeddedtechnology Co., Ltd\n90:A9:F7:90:00:00/28\tZekler Safety AB\n90:A9:F7:A0:00:00/28\tChi Geng Technology Co., Ltd\n90:A9:F7:B0:00:00/28\tKranze Technology Solutions, Inc.\n90:A9:F7:C0:00:00/28\tSkyLine Limited Technologies Co., Ltd\n90:A9:F7:D0:00:00/28\tShanghai Jiehezhi Technology Co., Ltd.\n90:A9:F7:E0:00:00/28\tThe Engineerix Group\n90:AA:C3\t\tHitron Technologies. Inc\n90:AB:96\t\tSilicon Laboratories\n90:AC:3F\t\tBrightSign LLC\n90:AC:6D\t\tApple, Inc.\n90:AD:F7\t\tvivo Mobile Communication Co., Ltd.\n90:AD:FC\t\tTelechips, Inc.\n90:AE:1B\t\tTp-Link Technologies Co.,Ltd.\n90:AF:D1\t\tnetKTI Co., Ltd\n90:B0:ED\t\tApple, Inc.\n90:B1:1C\t\tDell Inc.\n90:B1:34\t\tCommscope\n90:B1:44\t\tSamsung Electronics Co.,Ltd\n90:B1:E0\t\tBeijing Nebula Link Technology Co., Ltd\n90:B2:1F\t\tApple, Inc.\n90:B4:DD\t\tZpt R&D\n90:B5:7F\t\tShenzhen iComm Semiconductor CO.,LTD\n90:B6:22\t\tSamsung Electronics Co.,Ltd\n90:B6:7A\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n90:B6:85\t\tWeifang Goertek Electronics Co.,Ltd\n90:B6:86\t\tMurata Manufacturing Co., Ltd.\n90:B7:90\t\tApple, Inc.\n90:B8:32\t\tExtreme Networks Headquarters\n90:B8:D0\t\tJoyent, Inc.\n90:B8:E0\t\tShenzhen Yanray Technology Co.,Ltd\n90:B9:31\t\tApple, Inc.\n90:B9:42\t\tzte corporation\n90:B9:7D\t\tJohnson Outdoors Marine Electronics d/b/a Minnkota\n90:BD:E6\t\tQuectel Wireless Solutions Co.,Ltd.\n90:BF:D9\t\tSmart Innovation LLC\n90:C1:15\t\tSony Corporation\n90:C1:19\t\tNokia\n90:C1:C6\t\tApple, Inc.\n90:C3:5F\t\tNanjing Jiahao Technology Co., Ltd.\n90:C5:4A\t\tvivo Mobile Communication Co., Ltd.\n90:C6:82\t\tIEEE Registration Authority\n90:C6:82:00:00:00/28\tShenzhen Lencotion Technology Co.,Ltd\n90:C6:82:10:00:00/28\tShenzhen Photon Broadband Technology CO., LTD\n90:C6:82:20:00:00/28\tekey biometric systems gmbh\n90:C6:82:30:00:00/28\tInnovative Electronic Technology\n90:C6:82:40:00:00/28\tNeone, Inc.\n90:C6:82:50:00:00/28\tS.A.E.T. S.R.L.\n90:C6:82:60:00:00/28\tNanjing Jiexi Technologies Co., Ltd.\n90:C6:82:70:00:00/28\tCinet Inc\n90:C6:82:80:00:00/28\tTeletek Electronics\n90:C6:82:90:00:00/28\tAct\n90:C6:82:A0:00:00/28\tBeijing Acorn Networks Corporation\n90:C6:82:B0:00:00/28\tLachmann & Rink GmbH\n90:C6:82:C0:00:00/28\tLi Seng Technology Ltd.\n90:C6:82:D0:00:00/28\tPowerShield Limited\n90:C6:82:E0:00:00/28\tShanghai HuRong Communication Technology Development Co., Ltd.\n90:C6:82:F0:00:00/28\tPrivate\n90:C7:10\t\tzte corporation\n90:C7:92\t\tCommscope\n90:C7:D8\t\tzte corporation\n90:C9:9B\t\tTesorion Nederland B.V.\n90:CA:FA\t\tGoogle, Inc.\n90:CB:A3\t\tTecno Mobile Limited\n90:CC:24\t\tSynaptics, Inc\n90:CC:7A\t\tHuawei Device Co., Ltd.\n90:CC:DF\t\tIntel Corporate\n90:CD:1F\t\tQuectel Wireless Solutions Co.,Ltd.\n90:CD:B6\t\tHon Hai Precision Ind. Co.,Ltd.\n90:CD:E8\t\tApple, Inc.\n90:CE:B8\t\tTexas Instruments\n90:CF:15\t\tNokia Corporation\n90:CF:6F\t\tDlogixs Co Ltd\n90:CF:7D\t\tQingdao Hisense Communications Co.,Ltd.\n90:D0:92\t\tHUMAX Co., Ltd.\n90:D1:1B\t\tPalomar Medical Technologies\n90:D2:0B\t\tNokia Shanghai Bell Co., Ltd.\n90:D3:CF\t\tAskey Computer Corp\n90:D4:32\t\tzte corporation\n90:D4:73\t\tvivo Mobile Communication Co., Ltd.\n90:D6:89\t\tHuahao Fangzhou Technology Co.,Ltd\n90:D7:4F\t\tBookeen\n90:D7:BE\t\tWavelab Global Inc.\n90:D7:EB\t\tTexas Instruments\n90:D8:52\t\tComtec Co., Ltd.\n90:D8:F3\t\tzte corporation\n90:D9:2C\t\tHug-Witschi Ag\n90:DA:4E\t\tAvanu\n90:DA:6A\t\tFOCUS H&S Co., Ltd.\n90:DA:F9\t\tSiemens Rail Automation SAU\n90:DB:46\t\tE-Lead Electronic Co., Ltd\n90:DD:5D\t\tApple, Inc.\n90:DE:80\t\tShenzhen Century Xinyang Technology Co., Ltd\n90:DF:7D\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n90:DF:B7\t\ts.m.s smart microwave sensors GmbH\n90:DF:FB\t\tHomerider Systems\n90:E0:F0\t\tIEEE 1722a Working Group\n90:E1:7B\t\tApple, Inc.\n90:E2:02\t\tTexas Instruments\n90:E2:BA\t\tIntel Corporate\n90:E2:FC\t\tIEEE Registration Authority\n90:E2:FC:00:00:00/28\tPEA (DBT-Technology)\n90:E2:FC:10:00:00/28\tYite technology\n90:E2:FC:20:00:00/28\tShenZhen Temwey Innovation Technology Co.,Ltd.\n90:E2:FC:30:00:00/28\tShenzhen Hisource Technology Development CO.,Ltd.\n90:E2:FC:40:00:00/28\tDongguan Kangyong electronics technology Co. Ltd\n90:E2:FC:50:00:00/28\tTotalone Technology Co., Ltd.\n90:E2:FC:60:00:00/28\tSindoh Techno Co., Ltd.\n90:E2:FC:70:00:00/28\tFair Winds Digital srl\n90:E2:FC:80:00:00/28\tbitsensing Inc.\n90:E2:FC:90:00:00/28\tHuddly AS\n90:E2:FC:A0:00:00/28\tPower Engineering & Manufacturing, Inc.\n90:E2:FC:B0:00:00/28\tShenzhen Dingsheng Intelligent Technology Co., Ltd\n90:E2:FC:C0:00:00/28\tStanley Security\n90:E2:FC:D0:00:00/28\tBeijing Lanxum Computer Technology CO.,LTD.\n90:E2:FC:E0:00:00/28\tDevCom spol. s r.o.\n90:E3:17\t\tMellanox Technologies, Inc.\n90:E4:68\t\tGuangzhou Shiyuan Electronic Technology Company Limited\n90:E4:B0\t\tSHARP Corporation\n90:E5:B1\t\tEspressif Inc.\n90:E6:43\t\tTesla,Inc.\n90:E6:BA\t\tASUSTek COMPUTER INC.\n90:E7:10\t\tNew H3C Technologies Co., Ltd\n90:E7:C4\t\tHTC Corporation\n90:E8:68\t\tAzureWave Technology Inc.\n90:E9:5E\t\tCisco Systems, Inc\n90:EA:60\t\tSPI Lasers Ltd\n90:EB:48\t\tShanghai XinMiaoLink Technology Co., Ltd\n90:EB:50\t\tCisco Systems, Inc\n90:EC:50\t\tC.O.B.O. Spa\n90:EC:77\t\tsilicom\n90:EC:E3\t\tNokia\n90:EC:EA\t\tApple, Inc.\n90:EE:C7\t\tSamsung Electronics Co.,Ltd\n90:EE:D9\t\tUniversal De Desarrollos Electrónicos, Sa\n90:EF:4A\t\tDongguan Liesheng Electronic Co., Ltd.\n90:EF:68\t\tZyxel Communications Corporation\n90:F0:05\t\tXi'an Molead Technology Co., Ltd\n90:F0:52\t\tMEIZU Technology Co., Ltd.\n90:F1:57\t\tGarmin International\n90:F1:AA\t\tSamsung Electronics Co.,Ltd\n90:F1:B0\t\tHangzhou Anheng Info&Tech CO.,LTD\n90:F2:60\t\tShenzhen Honesty Electronics Co.,Ltd.\n90:F2:78\t\tRadius Gateway\n90:F3:05\t\tHUMAX Co., Ltd.\n90:F3:B7\t\tKirisun Communications Co., Ltd.\n90:F3:B8\t\tChina Mobile Group Device Co.,Ltd.\n90:F4:21\t\tIEEE Registration Authority\n90:F4:21:00:00:00/28\tGemstone Lights\n90:F4:21:10:00:00/28\tBeEnergy SG GmbH\n90:F4:21:20:00:00/28\tCatvision Ltd.\n90:F4:21:30:00:00/28\tSinpeng(Guangzhou)Technology Co.,Ltd\n90:F4:21:40:00:00/28\tSansap Technology Pvt. Ltd.\n90:F4:21:50:00:00/28\tDESKO GmbH\n90:F4:21:60:00:00/28\tWuxi Sunning Smart Devices Co.,Ltd\n90:F4:21:70:00:00/28\tSenstar Corporation\n90:F4:21:80:00:00/28\tMi-Jack Products\n90:F4:21:90:00:00/28\tTwunicom Life Tech. Co., Ltd.\n90:F4:21:A0:00:00/28\tProqualit Telecom LTDA\n90:F4:21:B0:00:00/28\tJiangsu MSInfo Technology Co.,Ltd.\n90:F4:21:C0:00:00/28\tAcoba\n90:F4:21:D0:00:00/28\tTaichitel Technology Shanghai Co.,Ltd.\n90:F4:21:E0:00:00/28\tVelan Studios Inc.\n90:F4:C1\t\tRand McNally\n90:F6:44\t\tHuawei Device Co., Ltd.\n90:F6:52\t\tTp-Link Technologies Co.,Ltd.\n90:F7:21\t\tIndiNatus (IndiNatus India Private Limited)\n90:F7:2F\t\tPhillips Machine & Welding Co., Inc.\n90:F7:B2\t\tNew H3C Technologies Co., Ltd\n90:F8:2E\t\tAmazon Technologies Inc.\n90:F8:91\t\tKaon Group Co., Ltd.\n90:F9:64\t\tRawasi Co\n90:F9:70\t\tHuawei Technologies Co.,Ltd\n90:F9:B7\t\tHuawei Technologies Co.,Ltd\n90:FB:5B\t\tAvaya Inc\n90:FB:5D\t\tBeijing Xiaomi Mobile Software Co., Ltd\n90:FB:A6\t\tHon Hai Precision Ind. Co.,Ltd.\n90:FD:61\t\tApple, Inc.\n90:FD:73\t\tzte corporation\n90:FD:9F\t\tSilicon Laboratories\n90:FF:79\t\tMetro Ethernet Forum\n90:FF:D6\t\tHonor Device Co., Ltd.\n94:00:06\t\tjinyoung\n94:00:70\t\tNokia Corporation\n94:00:B0\t\tHuawei Technologies Co.,Ltd\n94:01:49\t\tAutoHotBox\n94:01:7D\t\tShenzhen Shlink.Co.,Limited\n94:01:AC\t\tWuhan Qianyang Iotian Technology Co., Ltd\n94:01:C2\t\tSamsung Electronics Co.,Ltd\n94:02:30\t\tLogitech\n94:02:6B\t\tOptictimes Co.,Ltd\n94:04:9C\t\tHuawei Technologies Co.,Ltd\n94:04:E3\t\tVantiva USA LLC\n94:05:B6\t\tLiling FullRiver Electronics & Technology Ltd\n94:05:BB\t\tIEEE Registration Authority\n94:05:BB:00:00:00/28\tQingdao Maotran Electronics co., ltd\n94:05:BB:10:00:00/28\tDongguan Kingtron Electronics Tech Co., Ltd\n94:05:BB:20:00:00/28\tDongguan CXWE Technology Co.,Ltd.\n94:05:BB:30:00:00/28\tNeutrik AG\n94:05:BB:40:00:00/28\tShenzhen Baolijie Technology Co., Ltd.\n94:05:BB:50:00:00/28\tChengdu Zhongheng Network Co.,Ltd.\n94:05:BB:60:00:00/28\tZIGPOS GmbH\n94:05:BB:70:00:00/28\tclosip Inc.\n94:05:BB:80:00:00/28\tiungo\n94:05:BB:90:00:00/28\tZimmer GmbH\n94:05:BB:A0:00:00/28\tSolarEdge Technologies\n94:05:BB:B0:00:00/28\tAustar Hearing Science And Techniligy(Xiamen)Co.,Ltd\n94:05:BB:C0:00:00/28\tLao Industria Ltda\n94:05:BB:D0:00:00/28\tSunthink S&T Development Co.,Ltd\n94:05:BB:E0:00:00/28\tBAE Systems\n94:08:53\t\tLiteon Technology Corporation\n94:08:C7\t\tHuawei Device Co., Ltd.\n94:09:37\t\tHUMAX Co., Ltd.\n94:09:C9\t\tAlpsalpine Co,.Ltd\n94:09:D3\t\tshenzhen maxtopic technology co.,ltd\n94:0B:19\t\tHuawei Technologies Co.,Ltd\n94:0B:2D\t\tNetView Technologies(Shenzhen) Co., Ltd\n94:0B:83\t\tzte corporation\n94:0B:CD\t\tApple, Inc.\n94:0B:D5\t\tHimax Technologies, Inc\n94:0B:FA\t\tEM Microelectronic\n94:0C:6D\t\tTp-Link Technologies Co.,Ltd.\n94:0C:98\t\tApple, Inc.\n94:0D:2D\t\tUniversal Electronics, Inc.\n94:0D:4B\t\tCisco Systems, Inc\n94:0E:2A\t\tNXP Semiconductors Taiwan Ltd.\n94:0E:6B\t\tHuawei Technologies Co.,Ltd\n94:0E:E7\t\tHuawei Technologies Co.,Ltd\n94:10:3E\t\tBelkin International Inc.\n94:10:42\t\tFanox Electronic S.L.\n94:11:DA\t\tITF Fröschl GmbH\n94:14:57\t\tShenzhen Sundray Technologies company Limited\n94:14:7A\t\tvivo Mobile Communication Co., Ltd.\n94:15:B2\t\tHuawei Device Co., Ltd.\n94:16:25\t\tApple, Inc.\n94:16:73\t\tPoint Core SARL\n94:17:00\t\tXiaomi Communications Co Ltd\n94:17:24\t\tAnhui Guoke Ruidian communication technology  Co.,Ltd.\n94:17:87\t\tNokia\n94:18:65\t\tNetgear\n94:18:82\t\tHewlett Packard Enterprise\n94:19:3A\t\tElvaco AB\n94:1C:56\t\tActiontec Electronics, Inc\n94:1D:1C\t\tTLab West Systems AB\n94:1F:3A\t\tAmbiq\n94:1F:A2\t\tWuhan YuXin Semiconductor Co., Ltd.\n94:20:53\t\tNokia Corporation\n94:21:57\t\tApple, Inc.\n94:21:97\t\tStalmart Technology Limited\n94:22:4C\t\tQingdao Haier Technology Co.,Ltd\n94:23:6E\t\tShenzhen Junlan Electronic Ltd\n94:24:53\t\tHuawei Technologies Co.,Ltd\n94:24:B8\t\tGree Electric Appliances, Inc. Of Zhuhai\n94:24:E1\t\tAlcatel-Lucent Enterprise\n94:25:33\t\tHuawei Technologies Co.,Ltd\n94:26:1D\t\tHuawei Technologies Co.,Ltd\n94:27:70\t\tBSH Hausgeräte GmbH\n94:27:90\t\tTCT mobile ltd\n94:28:2E\t\tNew H3C Technologies Co., Ltd\n94:28:6F\t\tzte corporation\n94:29:0C\t\tShenyang wisdom Foundation Technology Development Co., Ltd.\n94:29:2F\t\tNew H3C Technologies Co., Ltd\n94:29:57\t\tAirpo Networks Technology Co.,Ltd.\n94:29:8D\t\tShanghai AdaptComm Technology Co., Ltd.\n94:2A:3F\t\tDiversey Inc\n94:2A:6F\t\tUbiquiti Inc\n94:2B:68\t\tApple, Inc.\n94:2C:B3\t\tHUMAX Co., Ltd.\n94:2D:DC\t\tSamsung Electronics Co.,Ltd\n94:2E:17\t\tSchneider Electric Canada Inc\n94:2E:63\t\tFinsécur\n94:31:9B\t\tAlphatronics BV\n94:31:CB\t\tvivo Mobile Communication Co., Ltd.\n94:32:51\t\tAskey Computer Corp\n94:32:C1\t\tHonor Device Co., Ltd.\n94:33:D8\t\tCisco Systems, Inc\n94:33:DD\t\tTaco Inc\n94:34:2F\t\tItel Mobile Limited\n94:34:69\t\tSilicon Laboratories\n94:35:0A\t\tSamsung Electronics Co.,Ltd\n94:35:89\t\tHuawei Technologies Co.,Ltd\n94:36:E0\t\tSichuan Bihong Broadcast & Television New Technologies Co.,Ltd\n94:37:F7\t\tHuawei Device Co., Ltd.\n94:38:AA\t\tTechnology Innovation Institute\n94:39:0E\t\tIntel Corporate\n94:39:E5\t\tHon Hai Precision Ind. Co.,Ltd.\n94:3A:91\t\tAmazon Technologies Inc.\n94:3A:F0\t\tNokia Corporation\n94:3B:B0\t\tNew H3C Technologies Co., Ltd\n94:3B:B1\t\tKaon Group Co., Ltd.\n94:3C:96\t\tSagemcom Broadband SAS\n94:3C:C6\t\tEspressif Inc.\n94:3D:C9\t\tAsahi Net, Inc.\n94:3E:E4\t\tWiSA Technologies Inc\n94:3E:FD\t\tIEEE Registration Authority\n94:3E:FD:00:00:00/28\tBrooks Instrument\n94:3E:FD:10:00:00/28\tShenZhen Chino-e Communication Co., Ltd.\n94:3E:FD:20:00:00/28\tYunzhi Iot Technology Co,.Limited\n94:3E:FD:30:00:00/28\tBertin GmbH\n94:3E:FD:40:00:00/28\tVantive Manufacturing Pte Ltd\n94:3E:FD:50:00:00/28\tAM General LLC\n94:3E:FD:60:00:00/28\tShenzhen Gigaopto Technology Co., Ltd.\n94:3E:FD:70:00:00/28\tBeijing Cunyin Chengqi Technology Co., Ltd.\n94:3E:FD:80:00:00/28\tLUIS Technology GmbH\n94:3E:FD:90:00:00/28\tLecoo Technology Co.,Ltd.\n94:3E:FD:A0:00:00/28\tGebr. Kemper GmbH + Co. KG\n94:3E:FD:B0:00:00/28\tShenzhen Celltel Communication Technology Co.,Ltd\n94:3E:FD:C0:00:00/28\tAnnapurna labs\n94:3E:FD:D0:00:00/28\tKulpLights LLC\n94:3E:FD:E0:00:00/28\tAnnapurna labs\n94:3F:0C\t\tGenexis B.V.\n94:3F:BB\t\tJSC RPC Istok named after Shokin\n94:3F:C2\t\tHewlett Packard Enterprise\n94:3F:D6\t\tApple, Inc.\n94:40:A2\t\tAnywave Communication Technologies, Inc.\n94:40:C9\t\tHewlett Packard Enterprise\n94:40:F3\t\tHuawei Technologies Co.,Ltd\n94:41:C1\t\tMini-Cam Limited\n94:43:4D\t\tCiena Corporation\n94:44:44\t\tLG Innotek\n94:44:52\t\tBelkin International Inc.\n94:45:60\t\tGoogle, Inc.\n94:46:96\t\tBaudTec Corporation\n94:47:88\t\tHuawei Technologies Co.,Ltd\n94:47:B0\t\tBeijing Eswin Computing Technology Co., Ltd\n94:49:96\t\tWiSilica Inc\n94:4A:09\t\tBitWise Controls\n94:4A:0C\t\tSercomm Corporation.\n94:4B:F8\t\tTozo Inc\n94:4E:5B\t\tUbee Interactive Co., Limited\n94:4F:4C\t\tSound United LLC\n94:4F:DB\t\tNokia\n94:50:44\t\tTexas Instruments\n94:50:47\t\tRechnerbetriebsgruppe\n94:50:89\t\tSimonsVoss Technologies GmbH\n94:51:03\t\tSamsung Electronics Co.,Ltd\n94:51:3D\t\tiSmart Alarm, Inc.\n94:51:BF\t\tHyundai ESG\n94:51:DC\t\tEspressif Inc.\n94:52:44\t\tSamsung Electronics Co.,Ltd\n94:53:30\t\tHon Hai Precision Ind. Co.,Ltd.\n94:54:93\t\tRigado, LLC\n94:54:C5\t\tEspressif Inc.\n94:54:CE\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n94:54:DF\t\tYst Corp.\n94:56:41\t\tPalo Alto Networks\n94:57:A5\t\tHewlett Packard\n94:58:CB\t\tNintendo Co.,Ltd\n94:59:07\t\tShanghai HITE-BELDEN Network Technology Co., Ltd.\n94:59:2D\t\tEKE Building Technology Systems Ltd\n94:5A:FC\t\tAmazon Technologies Inc.\n94:5B:7E\t\tTrilobit Ltda.\n94:5C:9A\t\tApple, Inc.\n94:5F:34\t\tRenesas Electronics (Penang) Sdn. Bhd.\n94:60:10\t\tHuawei Device Co., Ltd.\n94:60:D5\t\tHewlett Packard Enterprise\n94:61:1E\t\tWata Electronics Co.,Ltd.\n94:61:24\t\tPason Systems\n94:62:69\t\tCommscope\n94:63:72\t\tvivo Mobile Communication Co., Ltd.\n94:63:D1\t\tSamsung Electronics Co.,Ltd\n94:64:24\t\tHewlett Packard Enterprise\n94:65:2D\t\tOnePlus Technology (Shenzhen) Co., Ltd\n94:65:9C\t\tIntel Corporate\n94:66:E7\t\tWOM Engineering\n94:67:7E\t\tBelden India Private Limited\n94:6A:77\t\tVantiva USA LLC\n94:6A:B0\t\tArcadyan Corporation\n94:6C:04\t\tEM Microelectronic\n94:6D:AE\t\tMellanox Technologies, Inc.\n94:70:6C\t\tQuectel Wireless Solutions Co.,Ltd.\n94:70:D2\t\tWinfirm Technology\n94:71:AC\t\tTCT mobile ltd\n94:72:0F\t\tGuangdong Nanguang Photo&Video Systems Co., Ltd.\n94:74:2E\t\tMercusys Technologies Co., Ltd.\n94:75:6E\t\tQinetiQ North America\n94:76:B7\t\tSamsung Electronics Co.,Ltd\n94:77:2B\t\tHuawei Technologies Co.,Ltd\n94:78:06\t\tNingbo Sunvot Technology Co.,Ltd\n94:79:18\t\tItel Mobile Limited\n94:7A:F4\t\tHuawei Technologies Co.,Ltd\n94:7B:AE\t\tXiaomi Communications Co Ltd\n94:7B:BE\t\tUbicquia LLC\n94:7B:E7\t\tSamsung Electronics Co.,Ltd\n94:7C:3E\t\tPolewall Norge AS\n94:7D:77\t\tHuawei Technologies Co.,Ltd\n94:7E:B9\t\tNational Narrowband Network Communications Pty Ltd\n94:7F:1D\t\tShenzhen Fastrain Technology Co., Ltd.\n94:7F:D8\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n94:81:A4\t\tAzuray Technologies\n94:83:C4\t\tGL Technologies (Hong Kong) Limited\n94:85:7A\t\tEvantage Industries Corp\n94:86:CD\t\tSeoul Electronics&Telecom\n94:86:D4\t\tSurveillance Pro Corporation\n94:87:7C\t\tCommscope\n94:87:E0\t\tXiaomi Communications Co Ltd\n94:88:15\t\tInfinique Worldwide Inc\n94:88:54\t\tTexas Instruments\n94:88:5E\t\tSurfilter Network Technology Co., Ltd.\n94:8A:C6\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n94:8B:03\t\tEAGET Innovation and Technology Co., Ltd.\n94:8B:93\t\tXiaomi Communications Co Ltd\n94:8B:C1\t\tSamsung Electronics Co.,Ltd\n94:8C:D7\t\tHui Zhou Gaoshengda Technology Co.,LTD\n94:8D:50\t\tBeamex Oy Ab\n94:8D:EF\t\tOetiker Schweiz AG\n94:8E:6D\t\tNintendo Co.,Ltd\n94:8E:89\t\tIndustrias Unidas Sa De Cv\n94:8E:D3\t\tArista Networks\n94:8F:CF\t\tCommscope\n94:8F:EE\t\tVerizon Telematics\n94:90:10\t\tHuawei Technologies Co.,Ltd\n94:90:34\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\n94:91:7F\t\tAskey Computer Corp\n94:92:BC\t\tSyntech(Hk) Technology Limited\n94:92:D2\t\tKCF Technologies, Inc.\n94:93:86\t\tShenzhen SiACRRIER Industry Machines Co.,LTD\n94:94:26\t\tApple, Inc.\n94:94:4A\t\tParticle Industries Inc.\n94:95:A0\t\tGoogle, Inc.\n94:97:AE\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n94:98:69\t\tzte corporation\n94:98:8F\t\tSagemcom Broadband SAS\n94:98:A2\t\tShanghai LISTEN TECH.LTD\n94:99:01\t\tShenzhen YITOA Digital Appliance CO.,LTD\n94:99:90\t\tVTC Telecommunications\n94:9A:A9\t\tMicrosoft Corporation\n94:9B:2C\t\tExtreme Networks Headquarters\n94:9B:FD\t\tTrans New Technology, Inc.\n94:9C:55\t\tAlta Data Technologies\n94:9D:57\t\tPanasonic do Brasil Limitada\n94:9F:3E\t\tSonos, Inc.\n94:9F:3F\t\tOptek Digital Technology company limited\n94:9F:8B\t\tzte corporation\n94:9F:B4\t\tChengDu JiaFaAnTai Technology Co.,Ltd\n94:A0:4E\t\tBostex Technology Co., LTD\n94:A0:7D\t\tHuawei Device Co., Ltd.\n94:A0:81\t\tSilicon Laboratories\n94:A1:A2\t\tAMPAK Technology, Inc.\n94:A3:CA\t\tKonnectONE, LLC\n94:A4:08\t\tShenzhen Trolink Technology CO, LTD\n94:A4:0C\t\tDiehl Metering GmbH\n94:A4:B5\t\tMitsubishi Electric Corporation\n94:A4:CE\t\tSensear Pty Ltd\n94:A4:F9\t\tHuawei Technologies Co.,Ltd\n94:A6:7E\t\tNetgear\n94:A6:D8\t\tNew H3C Technologies Co., Ltd\n94:A7:48\t\tNew H3C Technologies Co., Ltd\n94:A7:B7\t\tzte corporation\n94:A7:BC\t\tBodyMedia, Inc.\n94:A9:90\t\tEspressif Inc.\n94:A9:A8\t\tTexas Instruments\n94:AA:0A\t\tFiberhome Telecommunication Technologies Co.,LTD\n94:AA:B8\t\tJoview(Beijing) Technology Co. Ltd.\n94:AB:18\t\tcellXica ltd\n94:AB:DE\t\tOMX Technology - FZE\n94:AB:FE\t\tNokia\n94:AC:CA\t\ttrivum technologies GmbH\n94:AD:23\t\tApple, Inc.\n94:AE:61\t\tAlcatel Lucent\n94:AE:E3\t\tBelden Hirschmann Industries (Suzhou) Ltd.\n94:AE:F0\t\tCisco Systems, Inc\n94:B0:1F\t\tApple, Inc.\n94:B1:0A\t\tSamsung Electronics Co.,Ltd\n94:B2:16\t\tSilicon Laboratories\n94:B2:71\t\tHuawei Technologies Co.,Ltd\n94:B2:CC\t\tPioneer Corporation\n94:B3:4F\t\tRuckus Wireless\n94:B3:F7\t\tHui Zhou Gaoshengda Technology Co.,LTD\n94:B4:0F\t\tHewlett Packard Enterprise\n94:B5:55\t\tEspressif Inc.\n94:B6:09\t\tIntel Corporate\n94:B8:19\t\tNokia\n94:B8:6D\t\tIntel Corporate\n94:B8:C5\t\tRuggedCom Inc.\n94:B9:7E\t\tEspressif Inc.\n94:B9:B4\t\tAptos Technology\n94:BA:06\t\tShenzhen Bilian Electronic Co.，Ltd\n94:BA:31\t\tVisiontec da Amazônia Ltda.\n94:BA:56\t\tShenzhen Coship Electronics Co., Ltd.\n94:BB:43\t\tAzureWave Technology Inc.\n94:BB:AE\t\tHusqvarna AB\n94:BD:BE\t\tTPV Display Technology (Xiamen) Co.,Ltd.\n94:BE:09\t\tChina Mobile Group Device Co.,Ltd.\n94:BE:36\t\tAdopt Nettech Pvt Ltd\n94:BE:46\t\tMotorola (Wuhan) Mobility Technologies Communication Co., Ltd.\n94:BE:50\t\tRemote Solution\n94:BF:1E\t\teflow Inc. / Smart Device Planning and Development Division\n94:BF:2D\t\tApple, Inc.\n94:BF:80\t\tzte corporation\n94:BF:94\t\tJuniper Networks\n94:BF:95\t\tShenzhen Coship Electronics Co., Ltd\n94:BF:C4\t\tRuckus Wireless\n94:C0:14\t\tSorter Sp. j. Konrad Grzeszczyk MichaA, Ziomek\n94:C0:38\t\tTallac Networks\n94:C1:50\t\t2Wire Inc\n94:C2:BD\t\tTecnobit\n94:C2:EF\t\tAskey Computer Corp\n94:C3:6B\t\tDRD Automation GmbH\n94:C3:E4\t\tAtlas Copco IAS GmbH\n94:C4:E9\t\tPowerLayer Microsystems HongKong Limited\n94:C5:A6\t\tItel Mobile Limited\n94:C6:91\t\tEliteGroup Computer Systems Co., LTD\n94:C6:EB\t\tNOVA electronics, Inc.\n94:C7:A8\t\tJiangsu Huitong Group Co.,Ltd.\n94:C7:AF\t\tRaylios Technology\n94:C9:60\t\tZhongshan B&T technology.co.,ltd\n94:C9:62\t\tTeseq AG\n94:C9:B7\t\tIEEE Registration Authority\n94:C9:B7:00:00:00/28\tFairy Devices Inc.\n94:C9:B7:10:00:00/28\tC-Mer Rainsoptics Limited\n94:C9:B7:20:00:00/28\tAnnapurna labs\n94:C9:B7:30:00:00/28\tSitronics JSC\n94:C9:B7:40:00:00/28\tZhejiang Hengjie Communication Technology Co,. Ltd.\n94:C9:B7:50:00:00/28\tBeijing Anyunshiji Technology Co., Ltd.\n94:C9:B7:60:00:00/28\tRealtimes Beijing Technology Co., Ltd.\n94:C9:B7:70:00:00/28\tMammothtek Cloud(Dong Guan)Technology Co., Ltd\n94:C9:B7:80:00:00/28\tOSOM Products Inc\n94:C9:B7:90:00:00/28\tTitanium union(shenzhen)technology co.,ltd\n94:C9:B7:A0:00:00/28\tShenZhen Beide Technology Co.,LTD\n94:C9:B7:B0:00:00/28\t3D Biomedicine Science & Technology Co., Limited\n94:C9:B7:C0:00:00/28\tJinjin Technology (Shenzhen) Co., Ltd\n94:C9:B7:D0:00:00/28\tDspread Technology (Beijing) Inc.\n94:C9:B7:E0:00:00/28\tshenzhen UDD Technologies,co.,Ltd\n94:CA:0F\t\tHoneywell Analytics\n94:CA:9A\t\tPaul Vahle GmbH & Co. KG\n94:CB:CD\t\tzte corporation\n94:CC:04\t\tIEEE Registration Authority\n94:CC:04:00:00:00/28\tHangzhou Yongkong Technology Co., Ltd.\n94:CC:04:10:00:00/28\tGocoax, Inc\n94:CC:04:20:00:00/28\tNanjing Yacer Communication Technology Co. Ltd.\n94:CC:04:30:00:00/28\tShenzhen Link technology Co.,Ltd\n94:CC:04:40:00:00/28\tProConnections, Inc.\n94:CC:04:50:00:00/28\tShenzhen Sanray Technology Co.,Ltd\n94:CC:04:60:00:00/28\tSam Nazarko Trading Ltd\n94:CC:04:70:00:00/28\tGowing Business And Contracting Wenzhou Co., LTD\n94:CC:04:80:00:00/28\tCircuitWerkes, Inc.\n94:CC:04:90:00:00/28\tENTEC Electric & Electronic Co., LTD.\n94:CC:04:A0:00:00/28\thyBee Inc.\n94:CC:04:B0:00:00/28\tShandong free optical technology co., ltd.\n94:CC:04:C0:00:00/28\tShanxi Baixin Information Technology Co., Ltd.\n94:CC:04:D0:00:00/28\tHanzhuo Information Technology(Shanghai) Ltd.\n94:CC:04:E0:00:00/28\tSynchronicIT BV\n94:CC:B9\t\tCommscope\n94:CD:AC\t\tCreowave Oy\n94:CD:FD\t\teero inc.\n94:CE:0F\t\tHuawei Device Co., Ltd.\n94:CE:2C\t\tSony Corporation\n94:CE:31\t\tCTS Limited\n94:CF:B0\t\tHuawei Device Co., Ltd.\n94:D0:0D\t\tHuawei Technologies Co.,Ltd\n94:D0:19\t\tCydle Corp.\n94:D0:29\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n94:D0:75\t\tCIS Crypto\n94:D2:99\t\tTechmation Co.,Ltd.\n94:D2:BC\t\tHuawei Technologies Co.,Ltd\n94:D3:31\t\tXiaomi Communications Co Ltd\n94:D4:17\t\tGpi Korea Inc.\n94:D4:69\t\tCisco Systems, Inc\n94:D5:05\t\tFiberhome Telecommunication Technologies Co.,LTD\n94:D5:4D\t\tHuawei Technologies Co.,Ltd\n94:D6:0E\t\tshenzhen yunmao information technologies co., ltd\n94:D6:DB\t\tNexFi\n94:D7:23\t\tShanghai DareGlobal Technologies Co.,Ltd\n94:D7:71\t\tSamsung Electronics Co.,Ltd\n94:D8:59\t\tTCT mobile ltd\n94:D8:6B\t\tnass magnet Hungária Kft.\n94:D9:3C\t\tEnelps\n94:D9:B3\t\tTp-Link Technologies Co.,Ltd.\n94:DB:49\t\tSitcorp\n94:DB:56\t\tSony Home Entertainment&Sound Products Inc\n94:DB:C9\t\tAzureWave Technology Inc.\n94:DB:DA\t\tHuawei Technologies Co.,Ltd\n94:DC:4E\t\tAEV, spol. s r. o.\n94:DD:3F\t\tA+V Link Technologies, Corp.\n94:DD:F8\t\tBrother Industries, LTD.\n94:DE:0E\t\tSmartOptics AS\n94:DE:80\t\tGiga-Byte Technology Co.,Ltd.\n94:DE:B8\t\tSilicon Laboratories\n94:DF:34\t\tHuawei Technologies Co.,Ltd\n94:DF:4E\t\tWistron InfoComm(Kunshan)Co.,Ltd.\n94:DF:58\t\tIJ Electron CO.,Ltd.\n94:E0:D0\t\tHealthStream Taiwan Inc.\n94:E0:D6\t\tChina Dragon Technology Limited\n94:E1:29\t\tSamsung Electronics Co.,Ltd\n94:E1:AC\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n94:E2:26\t\tD. ORtiz Consulting, LLC\n94:E2:3C\t\tIntel Corporate\n94:E2:FD\t\tBoge Kompressoren OTTO Boge GmbH & Co. KG\n94:E3:00\t\tHuawei Technologies Co.,Ltd\n94:E3:6D\t\tTexas Instruments\n94:E3:EE\t\tzte corporation\n94:E4:BA\t\tHuawei Device Co., Ltd.\n94:E6:86\t\tEspressif Inc.\n94:E6:BA\t\tSamsung Electronics Co.,Ltd\n94:E6:F7\t\tIntel Corporate\n94:E7:0B\t\tIntel Corporate\n94:E7:11\t\tXirka Dama Persada PT\n94:E7:EA\t\tHuawei Technologies Co.,Ltd\n94:E7:F3\t\tHuawei Technologies Co.,Ltd\n94:E8:48\t\tFylde Micro Ltd\n94:E8:C5\t\tCommscope\n94:E9:6A\t\tApple, Inc.\n94:E9:79\t\tLiteon Technology Corporation\n94:E9:8C\t\tNokia\n94:E9:EE\t\tHuawei Device Co., Ltd.\n94:EA:32\t\tApple, Inc.\n94:EA:EA\t\tTellescom Industria E Comercio Em Telecomunicacao\n94:EB:2C\t\tGoogle, Inc.\n94:EB:CD\t\tBlackBerry RTS\n94:EC:13\t\tHangzhou Ezviz Software Co.,Ltd.\n94:EC:32\t\tSilicon Laboratories\n94:EE:9F\t\tHMD Global Oy\n94:EF:49\t\tBDR Thermea Group B.V\n94:EF:50\t\tTP-Link Systems Inc.\n94:F1:28\t\tHewlett Packard Enterprise\n94:F1:9E\t\tHuizhou Maorong Intelligent Technology Co.,Ltd\n94:F2:78\t\tElma Electronic\n94:F2:BB\t\tValeo Vision Systems\n94:F3:92\t\tFortinet, Inc.\n94:F5:24\t\tChengdu BeiZhongWangXin Technology Co.Ltd\n94:F5:51\t\tCadi Scientific Pte Ltd\n94:F6:65\t\tRuckus Wireless\n94:F6:92\t\tGeminico co.,Ltd.\n94:F6:A3\t\tApple, Inc.\n94:F6:D6\t\tApple, Inc.\n94:F6:F2\t\tHonor Device Co., Ltd.\n94:F7:17\t\tCig Shanghai Co Ltd\n94:F7:20\t\tTianjin Deviser Electronics Instrument Co., Ltd\n94:F7:AD\t\tJuniper Networks\n94:F7:BE\t\tSercomm Philippines Inc\n94:F8:27\t\tShanghai Imilab Technology Co.Ltd\n94:F9:29\t\tMeta Platforms, Inc.\n94:FA:E8\t\tShenzhen Eycom Technology Co., Ltd\n94:FB:29\t\tZebra Technologies Inc.\n94:FB:A7\t\tIEEE Registration Authority\n94:FB:A7:00:00:00/28\tReichert Inc.\n94:FB:A7:10:00:00/28\tInaxsys Security Systems inc.\n94:FB:A7:20:00:00/28\tBeijing Leja Tech co., Ltd.\n94:FB:A7:30:00:00/28\tGuang Dong Takstar Electronic Co.,Ltd.\n94:FB:A7:40:00:00/28\tUoi Technology Corporation\n94:FB:A7:50:00:00/28\tCavity Eye\n94:FB:A7:60:00:00/28\tSercomm Corporation.\n94:FB:A7:70:00:00/28\tAnvil Systems Group, Inc.\n94:FB:A7:80:00:00/28\tSilver-I Co.,LTD.\n94:FB:A7:90:00:00/28\tShanghai Hyco Genyong Technology Co., Ltd.\n94:FB:A7:A0:00:00/28\tElkron\n94:FB:A7:B0:00:00/28\tShenzhen Golden Star Technology Ltd\n94:FB:A7:C0:00:00/28\tSolaborate Inc.\n94:FB:A7:D0:00:00/28\tRosenberger Technologies Co.,Ltd.\n94:FB:A7:E0:00:00/28\tSkyring Smart Technologies(Shenzhen) Co., Ltd.\n94:FB:B2\t\tShenzhen Gongjin Electronics Co.,Lt\n94:FD:1D\t\tWhereWhen Corp\n94:FD:2E\t\tShanghai Uniscope Technologies Co.,Ltd\n94:FE:22\t\tHuawei Technologies Co.,Ltd\n94:FE:9D\t\tShenzhen Gongjin Electronics Co.,Lt\n94:FE:F4\t\tSagemcom Broadband SAS\n94:FF:06\t\tHewlett Packard Enterprise\n94:FF:34\t\tHanshow Technology Co.,Ltd.\n94:FF:3C\t\tFortinet, Inc.\n94:FF:61\t\tChina Mobile Group Device Co.,Ltd.\n94:FF:7D\t\tAltoBeam Inc.\n98:00:6A\t\tzte corporation\n98:00:74\t\tRaisecom Technology CO., LTD\n98:00:C1\t\tGuangZhou CREATOR Technology Co.,Ltd.(CHINA)\n98:00:C6\t\tApple, Inc.\n98:01:A7\t\tApple, Inc.\n98:02:84\t\tTheobroma Systems GmbH\n98:02:D8\t\tIEEE Registration Authority\n98:02:D8:00:00:00/28\tStoerk-Tronic, Stoerk GmbH & Co.KG\n98:02:D8:10:00:00/28\tShenzhen Ateko Photoelectricity Co Ltd\n98:02:D8:20:00:00/28\tUnited Power Research Technology Corp.\n98:02:D8:30:00:00/28\tGrammer EiA Electronics nv\n98:02:D8:40:00:00/28\tZedi, Inc.\n98:02:D8:50:00:00/28\tEBI  Ltd.\n98:02:D8:60:00:00/28\tFritz Kuebler GmbH\n98:02:D8:70:00:00/28\tOrmazabal Protection&Automation\n98:02:D8:80:00:00/28\tSimplo Technology Co.,LTD\n98:02:D8:90:00:00/28\tNavroom Beijing, China\n98:02:D8:A0:00:00/28\tHySecurity\n98:02:D8:B0:00:00/28\tHanshin Medical Co., Ltd.\n98:02:D8:C0:00:00/28\tAGV spa\n98:02:D8:D0:00:00/28\tPromicon Elektronik GmbH + Co.KG\n98:02:D8:E0:00:00/28\tPrivate\n98:02:D8:F0:00:00/28\tPrivate\n98:03:8A\t\tTexas Instruments\n98:03:8E\t\tTP-Link Systems Inc.\n98:03:9B\t\tMellanox Technologies, Inc.\n98:03:A0\t\tABB n.v. Power Quality Products\n98:03:CF\t\tShenzhen Bilian Electronic Co.，Ltd\n98:03:D8\t\tApple, Inc.\n98:06:37\t\tIEEE Registration Authority\n98:06:37:00:00:00/28\tZoleo Inc.\n98:06:37:10:00:00/28\tE. P. Schlumberger\n98:06:37:20:00:00/28\tSumma nv\n98:06:37:30:00:00/28\tHangzhou Sanxin Network Technology Co.,Ltd\n98:06:37:40:00:00/28\tChengdu Shuwei Communication Technology Co.,Ltd\n98:06:37:50:00:00/28\tGs Global Security Inc\n98:06:37:60:00:00/28\tBoeing Ssg\n98:06:37:70:00:00/28\tSamwontech\n98:06:37:80:00:00/28\tShenzhen Y&D Electronics Information Co., Ltd\n98:06:37:90:00:00/28\tNAB co,.LTD\n98:06:37:A0:00:00/28\tAngora Networks\n98:06:37:B0:00:00/28\tPetersime\n98:06:37:C0:00:00/28\tHwaCom Systems Inc.\n98:06:37:D0:00:00/28\tVR Technology(Shenzhen) Limited\n98:06:37:E0:00:00/28\tShanghai Jinnian information technology Co. Ltd\n98:06:3A\t\tHome Control Singapore Pte Ltd\n98:06:3C\t\tSamsung Electronics Co.,Ltd\n98:07:09\t\tHuawei Device Co., Ltd.\n98:07:2D\t\tTexas Instruments\n98:08:02\t\tOrbis Bv\n98:09:CF\t\tOnePlus Technology (Shenzhen) Co., Ltd\n98:0C:33\t\tSilicon Laboratories\n98:0C:82\t\tSamsung Electro Mechanics Co., Ltd.\n98:0C:A5\t\tMotorola (Wuhan) Mobility Technologies Communication Co., Ltd.\n98:0D:2E\t\tHTC Corporation\n98:0D:51\t\tHuawei Device Co., Ltd.\n98:0D:67\t\tZyxel Communications Corporation\n98:0D:6F\t\tSamsung Electronics Co.,Ltd\n98:0D:AF\t\tApple, Inc.\n98:0E:24\t\tPhytium Technology Co.,Ltd.\n98:0E:E4\t\tPrivate\n98:10:82\t\tNsolution Co., Ltd.\n98:10:94\t\tShenzhen Vsun communication technology Co.,ltd\n98:10:E8\t\tApple, Inc.\n98:12:23\t\tTarmoc Network LTD\n98:12:E0\t\tXiaomi Communications Co Ltd\n98:13:33\t\tzte corporation\n98:14:D2\t\tAvonic\n98:16:CD\t\tleapio\n98:16:EC\t\tIC Intracom\n98:17:1A\t\tBeijing Xiaomi Mobile Software Co., Ltd\n98:17:3C\t\tPrivate\n98:17:F1\t\tzte corporation\n98:18:88\t\tCisco Meraki\n98:19:2C\t\tEdgecore Networks Corporation\n98:1A:35\t\tHuawei Technologies Co.,Ltd\n98:1B:B5\t\tASSA ABLOY Korea Co., Ltd iRevo\n98:1C:42\t\tLaiier\n98:1C:A2\t\tApple, Inc.\n98:1D:AC\t\tCyviz AS\n98:1D:FA\t\tSamsung Electronics Co.,Ltd\n98:1E:0F\t\tJeelan (Shanghai Jeelan Technology Information Inc\n98:1E:19\t\tSagemcom Broadband SAS\n98:1E:89\t\tTianyi Telecom Terminals Company Limited\n98:1F:B1\t\tShenzhen Lemon Network Technology Co.,Ltd\n98:20:44\t\tNew H3C Technologies Co., Ltd\n98:20:8E\t\tDefinium Technologies\n98:22:6E\t\tAmazon Technologies Inc.\n98:22:EF\t\tLiteon Technology Corporation\n98:23:4E\t\tMicromedia AG\n98:24:7B\t\tHuawei Technologies Co.,Ltd\n98:25:4A\t\tTP-Link Systems Inc\n98:25:6E\t\tPrivate\n98:26:2A\t\tApplied Research Associates, Inc\n98:26:AD\t\tQuectel Wireless Solutions Co.,Ltd.\n98:27:82\t\tIEEE Registration Authority\n98:27:82:00:00:00/28\tShenzhen Herofun Bio-Tech Co., Ltd\n98:27:82:10:00:00/28\tINFODAS GmbH\n98:27:82:20:00:00/28\tAnhui Shengren Electronic Technology Co., Ltd\n98:27:82:30:00:00/28\tDanfoss Power Solutions\n98:27:82:40:00:00/28\tDspread Technology (Beijing) Inc.\n98:27:82:50:00:00/28\tGuangzhou Wuzhou Technology Co, Ltd.\n98:27:82:60:00:00/28\tWestern Security Solutions\n98:27:82:70:00:00/28\tKortek Corporation\n98:27:82:80:00:00/28\tCATS Power design\n98:27:82:90:00:00/28\tWuxi GuoYiHaiJu Technology Co.,Ltd.\n98:27:82:A0:00:00/28\tNanjing BianYu Future Home Technology Co.Ltd\n98:27:82:B0:00:00/28\tRayTron, INC.\n98:27:82:C0:00:00/28\tKRISTECH Krzysztof Kajstura\n98:27:82:D0:00:00/28\tThorlabs GmbH\n98:27:82:E0:00:00/28\tSureFlap Ltd\n98:28:8B\t\tzhejiang Dusun Electron Co.,Ltd\n98:28:A6\t\tCompal Information (Kunshan) Co., Ltd.\n98:29:1D\t\tJaguar de Mexico, SA de CV\n98:29:3F\t\tFujian Start Computer Equipment Co.,Ltd\n98:29:A6\t\tCompal Information (Kunshan) Co., Ltd.\n98:2A:0A\t\tIntelbras\n98:2C:BC\t\tIntel Corporate\n98:2C:BE\t\t2Wire Inc\n98:2D:56\t\tResolution Audio\n98:2D:68\t\tSamsung Electronics Co., Ltd\n98:2D:BA\t\tFibergate Inc.\n98:2F:3C\t\tSichuan Changhong Electric Ltd.\n98:2F:86\t\tvivo Mobile Communication Co., Ltd.\n98:2F:F8\t\tHuawei Device Co., Ltd.\n98:30:00\t\tBeijing KEMACOM Technologies Co., Ltd.\n98:30:71\t\tDaikyung Vascom\n98:32:68\t\tSilicon Laboratories\n98:34:8C\t\tGreat Talent Technology Limited\n98:34:9D\t\tKrauss Maffei Technologies GmbH\n98:35:71\t\tSub10 Systems Ltd\n98:35:B8\t\tAssembled Products Corporation\n98:35:ED\t\tHuawei Technologies Co.,Ltd\n98:37:13\t\tPT.Navicom Indonesia\n98:38:7D\t\tItronic  Technology Co . , Ltd .\n98:39:10\t\tKaon Group Co., Ltd.\n98:39:8E\t\tSamsung Electronics Co.,Ltd\n98:39:C0\t\tFlextronics\n98:3A:1F\t\tGoogle, Inc.\n98:3B:16\t\tAMPAK Technology, Inc.\n98:3B:67\t\tDWnet Technologies(Suzhou) Corporation\n98:3B:8F\t\tIntel Corporate\n98:3C:8C\t\tApple, Inc.\n98:3D:AE\t\tEspressif Inc.\n98:3F:60\t\tHuawei Technologies Co.,Ltd\n98:3F:66\t\tFunshion Online Technologies Co.,Ltd\n98:3F:9F\t\tChina SSJ (Suzhou) Network Technology Inc.\n98:3F:E8\t\tSamsung Electronics Co.,Ltd\n98:40:BB\t\tDell Inc.\n98:41:5C\t\tNintendo Co.,Ltd\n98:42:46\t\tSol Industry Pte., Ltd\n98:42:65\t\tSagemcom Broadband SAS\n98:43:DA\t\tIntertech\n98:43:FA\t\tIntel Corporate\n98:44:B6\t\tInfranor Sas\n98:44:CE\t\tHuawei Technologies Co.,Ltd\n98:45:62\t\tShanghai Baud Data Communication Co.,Ltd.\n98:46:0A\t\tApple, Inc.\n98:47:3C\t\tShanghai Sunmon Communication Technogy Co.,Ltd\n98:47:44\t\tShenzhen Boomtech Industrial Corporation\n98:48:27\t\tTp-Link Technologies Co.,Ltd.\n98:48:74\t\tHuawei Technologies Co.,Ltd\n98:49:14\t\tWistron Neweb Corporation\n98:49:25\t\tJuniper Networks\n98:49:9F\t\tDomo Tactical Communications\n98:49:E1\t\tBoeing Defence Australia\n98:4A:47\t\tCHG Hospital Beds\n98:4A:6B\t\tRuijie Networks Co.,LTD\n98:4B:06\t\tHuawei Technologies Co.,Ltd\n98:4B:4A\t\tCommscope\n98:4B:E1\t\tHewlett Packard\n98:4C:04\t\tZhangzhou Keneng Electrical Equipment Co Ltd\n98:4C:D3\t\tMantis Deposition\n98:4E:8A\t\tSamsung Electronics Co.,Ltd\n98:4E:97\t\tStarlight Marketing (H. K.) Ltd.\n98:4F:EE\t\tIntel Corporate\n98:50:2E\t\tApple, Inc.\n98:50:A3\t\tSignaltek Jsc\n98:52:07\t\tHuawei Technologies Co.,Ltd\n98:52:3D\t\tSunitec Enterprise Co.,Ltd\n98:52:4A\t\tVantiva USA LLC\n98:52:B1\t\tSamsung Electronics Co.,Ltd\n98:54:1B\t\tIntel Corporate\n98:57:D3\t\tHon Hai-Ccpbg  Precision Ind.Co.,Ltd.\n98:58:8A\t\tSYSGRATION Ltd.\n98:59:45\t\tTexas Instruments\n98:59:49\t\tLuxottica Group S.P.A.\n98:59:7A\t\tIntel Corporate\n98:5A:98\t\tHuawei Technologies Co.,Ltd\n98:5A:EB\t\tApple, Inc.\n98:5B:B0\t\tKmdata Inc.\n98:5C:93\t\tSBG Systems SAS\n98:5D:46\t\tPeopleNet Communication\n98:5D:82\t\tArista Networks\n98:5D:AD\t\tTexas Instruments\n98:5E:1B\t\tConversDigital Co., Ltd.\n98:5F:41\t\tIntel Corporate\n98:5F:4F\t\tTongfang Computer Co.,Ltd.\n98:5F:D3\t\tMicrosoft Corporation\n98:60:22\t\tEMW Co., Ltd.\n98:60:CA\t\tApple, Inc.\n98:61:10\t\tHuawei Technologies Co.,Ltd\n98:62:97\t\tShenzhen Techwinsemi Technology Co., Ltd.\n98:66:10\t\tzte corporation\n98:66:EA\t\tIndustrial Control Communications, Inc.\n98:67:2E\t\tSkullcandy\n98:69:8A\t\tApple, Inc.\n98:6B:3D\t\tCommscope\n98:6C:5C\t\tJiangxi Gosun Guard Security Co.,Ltd\n98:6C:F5\t\tzte corporation\n98:6D:35\t\tIEEE Registration Authority\n98:6D:35:00:00:00/28\tShenzhen MALATA Mobile Communication Co.,LTD\n98:6D:35:10:00:00/28\tShenzhen cositea electronics technology co.,LTD\n98:6D:35:20:00:00/28\tShenzhen Fise Technology Holding Co.,Ltd.\n98:6D:35:30:00:00/28\tDH Mechatronic AG\n98:6D:35:40:00:00/28\tblossom communications corp.\n98:6D:35:50:00:00/28\tPdahl\n98:6D:35:60:00:00/28\tVitronic Dr.-Ing. Stein Bildverarbeitungssysteme GmbH\n98:6D:35:70:00:00/28\tZhejiang Hanshow Technology Co., Ltd.\n98:6D:35:80:00:00/28\tBeijing 3CAVI Tech Co.,Ltd\n98:6D:35:90:00:00/28\tAdvanced Diagnostics LTD\n98:6D:35:A0:00:00/28\tiWave Japan, Inc.\n98:6D:35:B0:00:00/28\tIntech\n98:6D:35:C0:00:00/28\tmy-PV GmbH\n98:6D:35:D0:00:00/28\tPraesideo B.V.\n98:6D:35:E0:00:00/28\tBaycom Opto-Electronics Technolgy Co., Ltd.\n98:6D:C8\t\tToshiba Mitsubishi-Electric Industrial Systems Corporation\n98:6E:E8\t\tIEEE Registration Authority\n98:6E:E8:00:00:00/28\tSbarco Technology CO., Ltd.\n98:6E:E8:10:00:00/28\tShanghai Pixsur Smart Technology Co.,Ltd\n98:6E:E8:20:00:00/28\tUgreen Group Limited\n98:6E:E8:30:00:00/28\tReeR SpA\n98:6E:E8:40:00:00/28\tFujitsu component limited\n98:6E:E8:50:00:00/28\tSuzhou Auditoryworks Co., Ltd.\n98:6E:E8:60:00:00/28\tBlair Companies\n98:6E:E8:70:00:00/28\tCentro de Pesquisas Av Wernher Von Braun\n98:6E:E8:80:00:00/28\tSisgeo Srl\n98:6E:E8:90:00:00/28\tSpan.IO, Inc.\n98:6E:E8:A0:00:00/28\tLogos Payment Solutions A/S\n98:6E:E8:B0:00:00/28\tPrivate\n98:6E:E8:C0:00:00/28\tSercomm Corporation.\n98:6E:E8:D0:00:00/28\tChangzhou Jiahao Radio&TV device CO.,LTD\n98:6E:E8:E0:00:00/28\tFirst Design System Inc.\n98:6F:60\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n98:70:E8\t\tInnatech Sdn Bhd\n98:73:C4\t\tSage Electronic Engineering LLC\n98:74:3D\t\tShenzhen Jun Kai Hengye Technology Co. Ltd\n98:74:DA\t\tInfinix mobility limited\n98:75:1A\t\tHuawei Device Co., Ltd.\n98:75:96\t\tEM Microelectronic\n98:76:B6\t\tAdafruit\n98:77:70\t\tPep Digital Technology (Guangzhou) Co., Ltd\n98:77:CB\t\tVorteks ED\n98:77:D5\t\tWiZ\n98:77:E7\t\tKaon Group Co., Ltd.\n98:7A:10\t\tEricsson AB\n98:7A:14\t\tMicrosoft Corporation\n98:7A:9B\t\tTCL MOKA International Limited\n98:7B:F3\t\tTexas Instruments\n98:7D:DD\t\tChina Mobile Group Device Co.,Ltd.\n98:7E:46\t\tEmizon Networks Limited\n98:7E:B5\t\tHuawei Device Co., Ltd.\n98:7E:CA\t\tInventus Power Eletronica do Brasil LTDA\n98:7E:E3\t\tvivo Mobile Communication Co., Ltd.\n98:80:BB\t\tIEEE Registration Authority\n98:80:BB:00:00:00/28\tRYEEX Technology Co.,Ltd.\n98:80:BB:10:00:00/28\tGreatWall Information Co.,Ltd\n98:80:BB:20:00:00/28\tShanghai ECone Technology Co.,Ltd.\n98:80:BB:30:00:00/28\tAnnapurna labs\n98:80:BB:40:00:00/28\tShenzhen Ginto E-commerce CO.,LTD\n98:80:BB:50:00:00/28\tMelexis Technologies NV\n98:80:BB:60:00:00/28\tNeusoft Reach Automotive Technology (Shenyang) Co.,Ltd\n98:80:BB:70:00:00/28\tGuangdong-Hong Kong-Macao Greater Bay Area Research Innovation Institute for Nanotechnology\n98:80:BB:80:00:00/28\tJyh Eng Technology Co., Ltd\n98:80:BB:90:00:00/28\tShenzhen Hebang Electronic Co., Ltd\n98:80:BB:A0:00:00/28\tGuangzhou Shortcut Technology Co.,Ltd.\n98:80:BB:B0:00:00/28\tHilo\n98:80:BB:C0:00:00/28\tShenzhen Xin Kingbrand Enterprises Co., Ltd\n98:80:BB:D0:00:00/28\tWyebot, Inc.\n98:80:BB:E0:00:00/28\tD.Med Technical Products GmbH\n98:80:EE\t\tSamsung Electronics Co.,Ltd\n98:81:8A\t\tHuawei Device Co., Ltd.\n98:82:17\t\tDisruptive Ltd\n98:83:89\t\tSamsung Electronics Co.,Ltd\n98:84:E3\t\tTexas Instruments\n98:86:5D\t\tNokia Shanghai Bell Co., Ltd.\n98:86:8B\t\tJuniper Networks\n98:86:B1\t\tFlyaudio corporation (China)\n98:87:44\t\tWuxi Hongda Science and Technology Co.,LTD\n98:87:4C\t\tServercom (India) Private Limited\n98:87:6C\t\tHuawei Device Co., Ltd.\n98:88:6C\t\tHuawei Device Co., Ltd.\n98:88:E0\t\tEspressif Inc.\n98:89:24\t\tTexas Instruments\n98:89:ED\t\tAnadem Information Inc.\n98:8B:0A\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n98:8B:5D\t\tSagemcom Broadband SAS\n98:8B:69\t\tShenzhen hylitech Co.,LTD\n98:8B:AD\t\tCorintech Ltd.\n98:8C:B3\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n98:8D:46\t\tIntel Corporate\n98:8E:34\t\tZhejiang Boxsam Electronic Co.,Ltd\n98:8E:4A\t\tNoxus(Beijing) Technology Co.,Ltd\n98:8E:79\t\tQudelix, Inc.\n98:8E:D4\t\tItel Mobile Limited\n98:8E:DD\t\tTE Connectivity Limerick\n98:8F:00\t\tHewlett Packard Enterprise\n98:8F:E0\t\tIEEE Registration Authority\n98:8F:E0:00:00:00/28\tValinso B.V.\n98:8F:E0:10:00:00/28\tGuangzhou Herystorm Technology Co.,Ltd.\n98:8F:E0:20:00:00/28\tvhf elektronik GmbH\n98:8F:E0:30:00:00/28\tEmpowerment Technologies Inc.\n98:8F:E0:40:00:00/28\tSchmid AG, energy solutions\n98:8F:E0:50:00:00/28\tKuaiZhu SmartTechnology?Suzhou?CO.,Ltd\n98:8F:E0:60:00:00/28\tHuaqin Technology Co.,Ltd.\n98:8F:E0:70:00:00/28\tChina Huaxin Post and Telecom Technologies Co., Ltd.\n98:8F:E0:80:00:00/28\tChangzhou Perceptime Technology Co.,Ltd.\n98:8F:E0:90:00:00/28\tNawon Machinery\n98:8F:E0:A0:00:00/28\tPavana Technologies JSC.\n98:8F:E0:B0:00:00/28\tDongguan Synst Electronics Co., LTD.\n98:8F:E0:C0:00:00/28\tShenzhen Micro&Nano Perception Computing Technology Co.,Ltd\n98:8F:E0:D0:00:00/28\tShenzhen Vitalitim Technology Co., Ltd\n98:8F:E0:E0:00:00/28\tCEL Terminus (Shanghai) Information Technologies Co.,Ltd.\n98:90:80\t\tLinkpower Network System Inc Ltd.\n98:90:96\t\tDell Inc.\n98:93:CC\t\tLg Electronics Inc\n98:94:49\t\tSkyworth Wireless Technology Ltd.\n98:97:CC\t\tTp-Link Technologies Co.,Ltd.\n98:97:D1\t\tMitraStar Technology Corp.\n98:98:FB\t\tGoogle, Inc.\n98:9A:B9\t\tzte corporation\n98:9B:CB\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n98:9C:57\t\tHuawei Technologies Co.,Ltd\n98:9D:39\t\tChina Mobile Group Device Co.,Ltd.\n98:9D:40\t\tMiwa Lock Co.,Ltd.\n98:9D:5D\t\tVantiva USA LLC\n98:9D:B2\t\tGOIP Global Services Pvt. Ltd.\n98:9D:E5\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n98:9E:63\t\tApple, Inc.\n98:9F:1A\t\tPrivate\n98:9F:1E\t\tHuawei Technologies Co.,Ltd\n98:A1:4A\t\tQuectel Wireless Solutions Co.,Ltd.\n98:A2:C0\t\tCisco Systems, Inc\n98:A3:16\t\tEspressif Inc.\n98:A4:04\t\tEricsson AB\n98:A4:0E\t\tSnap, Inc.\n98:A4:4E\t\tIEC Technologies S. de R.L de C.V.\n98:A5:F9\t\tApple, Inc.\n98:A7:B0\t\tMcst Zao\n98:A8:29\t\tAltoBeam Inc.\n98:A8:78\t\tAgnigate Technologies Private Limited\n98:A9:2D\t\tNew H3C Technologies Co., Ltd\n98:A9:42\t\tGuangzhou Tozed Kangwei Intelligent Technology Co., LTD\n98:A9:65\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\n98:AA:3C\t\tWill i-tech Co., Ltd.\n98:AA:D7\t\tBlue Wave Networking Co Ltd\n98:AA:FC\t\tIEEE Registration Authority\n98:AA:FC:00:00:00/28\tDalian Eastern Display Co., Ltd.\n98:AA:FC:10:00:00/28\tSurtec\n98:AA:FC:20:00:00/28\tShenzhen UniStrong Science & Technology Co., Ltd\n98:AA:FC:30:00:00/28\tNexus Electrical(Jiaxing) Limited\n98:AA:FC:40:00:00/28\tRpe \"Radico\"\n98:AA:FC:50:00:00/28\tSPM Instrument AB\n98:AA:FC:60:00:00/28\tMekotronics Co., Ltd\n98:AA:FC:70:00:00/28\tShenzhen Hubsan Technology Co.，LTD.\n98:AA:FC:80:00:00/28\tBeijing Tiandi-Marco Electro-Hydraulic Control System Company Ltd.\n98:AA:FC:90:00:00/28\tBEAM Authentic\n98:AA:FC:A0:00:00/28\tSENKO Co.,Ltd.\n98:AA:FC:B0:00:00/28\tResonant Systems Inc.\n98:AA:FC:C0:00:00/28\tdots Inc.\n98:AA:FC:D0:00:00/28\tMCS Micronic Computer Systeme GmbH\n98:AA:FC:E0:00:00/28\tComarch S.A.\n98:AB:15\t\tFujian Youyike Technology Co.,Ltd\n98:AC:EF\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\n98:AD:1D\t\tHuawei Device Co., Ltd.\n98:AE:71\t\tVVDN Technologies Pvt Ltd\n98:AF:65\t\tIntel Corporate\n98:B0:39\t\tNokia\n98:B0:8B\t\tSamsung Electronics Co.,Ltd\n98:B1:77\t\tLandis + Gyr\n98:B3:79\t\tApple, Inc.\n98:B3:EF\t\tHuawei Device Co., Ltd.\n98:B6:E9\t\tNintendo Co.,Ltd\n98:B7:1E\t\tInfinix mobility limited\n98:B7:85\t\tShenzhen 10Gtek Transceivers Co., Limited\n98:B8:BA\t\tLG Electronics (Mobile Communications)\n98:B8:BC\t\tSamsung Electronics Co.,Ltd\n98:B8:E3\t\tApple, Inc.\n98:BA:39\t\tDoro AB\n98:BA:5F\t\tTP-Link Systems Inc.\n98:BB:1E\t\tBYD Precision Manufacture Company Ltd.\n98:BB:99\t\tPhicomm (Sichuan) Co.,Ltd.\n98:BC:57\t\tSva Technologies Co.Ltd\n98:BC:99\t\tEdeltech Co.,Ltd.\n98:BD:80\t\tIntel Corporate\n98:BE:94\t\tIbm\n98:BE:DC\t\tHonor Device Co., Ltd.\n98:BF:F4\t\tMARKIN co., Ltd.\n98:C0:8A\t\tHuawei Technologies Co.,Ltd\n98:C0:EB\t\tGlobal Regency Ltd\n98:C3:D2\t\tNingbo Sanxing Medical Electric Co.,Ltd\n98:C5:DB\t\tEricsson AB\n98:C7:A4\t\tShenzhen HS Fiber Communication Equipment CO., LTD\n98:C8:1C\t\tBaytec Limited\n98:C8:45\t\tPacketAccess\n98:C8:54\t\tChiun Mai Communication System, Inc\n98:C8:B8\t\tvivo Mobile Communication Co., Ltd.\n98:C9:7C\t\tShenzhen iComm Semiconductor CO.,LTD\n98:C9:BE\t\tShenzhen SDMC Technology CO., LTD\n98:CA:20\t\tShanghai SIMCOM Ltd.\n98:CA:33\t\tApple, Inc.\n98:CB:27\t\tGalore Networks Pvt. Ltd.\n98:CB:38\t\tBoxin Communications Limited Liability Company\n98:CB:A4\t\tBenchmark Electronics\n98:CC:4D\t\tShenzhen mantunsci co., LTD\n98:CC:D9\t\tShenzhen SuperElectron Technology Co.,Ltd.\n98:CC:E4\t\tShenzhen Mindray Animal Medical Technology Co.,LTD\n98:CC:F3\t\tAmazon Technologies Inc.\n98:CD:AC\t\tEspressif Inc.\n98:CD:B4\t\tVirident Systems, Inc.\n98:CF:53\t\tBbk Educational Electronics Corp.,Ltd.\n98:D2:93\t\tGoogle, Inc.\n98:D3:31\t\tShenzhen Bolutek Technology Co.,Ltd.\n98:D3:D2\t\tMEKRA Lang GmbH & Co. KG\n98:D3:D7\t\tHuawei Technologies Co.,Ltd\n98:D3:E7\t\tNetafim L\n98:D6:86\t\tChyi Lee industry Co., ltd.\n98:D6:BB\t\tApple, Inc.\n98:D6:F7\t\tLG Electronics (Mobile Communications)\n98:D7:42\t\tSamsung Electronics Co.,Ltd\n98:D7:E1\t\tCisco Systems, Inc\n98:D8:63\t\tShanghai High-Flying Electronics Technology Co., Ltd\n98:D8:8C\t\tNortel Networks\n98:D9:3D\t\tDemant Enterprise A/S\n98:DA:92\t\tVuzix Corporation\n98:DA:C4\t\tTp-Link Technologies Co.,Ltd.\n98:DC:D9\t\tUNITEC Co., Ltd.\n98:DD:5B\t\tTakumi Japan Ltd\n98:DD:60\t\tApple, Inc.\n98:DD:EA\t\tInfinix mobility limited\n98:DE:D0\t\tTp-Link Technologies Co.,Ltd.\n98:DF:82\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n98:E0:D9\t\tApple, Inc.\n98:E1:65\t\tAccutome\n98:E2:55\t\tNintendo Co.,Ltd\n98:E4:76\t\tZentan\n98:E5:5B\t\tIntelbras\n98:E7:43\t\tDell Inc.\n98:E7:9A\t\tFoxconn(NanJing) Communication Co.,Ltd.\n98:E7:D5\t\tNXP Semiconductor (Tianjin) LTD.\n98:E7:F4\t\tHewlett Packard\n98:E7:F5\t\tHuawei Technologies Co.,Ltd\n98:E8:48\t\tAxiim\n98:E8:FA\t\tNintendo Co.,Ltd\n98:EC:65\t\tCosesy ApS\n98:ED:5C\t\tTesla,Inc.\n98:ED:7E\t\teero inc.\n98:ED:CA\t\tFiberhome Telecommunication Technologies Co.,LTD\n98:EE:8C\t\tzte corporation\n98:EE:94\t\tXiaomi Communications Co Ltd\n98:EE:CB\t\tWistron Infocomm (Zhongshan) Corporation\n98:EF:9B\t\tOhsung\n98:F0:58\t\tLynxspring, Incl.\n98:F0:7B\t\tTexas Instruments\n98:F0:83\t\tHuawei Technologies Co.,Ltd\n98:F0:AB\t\tApple, Inc.\n98:F1:12\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\n98:F1:70\t\tMurata Manufacturing Co., Ltd.\n98:F1:81\t\tNew H3C Technologies Co., Ltd\n98:F1:99\t\tNEC Platforms, Ltd.\n98:F1:AE\t\tSenaisc\n98:F2:17\t\tCastlenet Technology Inc.\n98:F2:B3\t\tHewlett Packard Enterprise\n98:F3:F6\t\tHuawei Technologies Co.,Ltd\n98:F4:28\t\tzte corporation\n98:F4:87\t\tTexas Instruments\n98:F4:AB\t\tEspressif Inc.\n98:F5:37\t\tzte corporation\n98:F5:A9\t\tOhsung\n98:F6:21\t\tXiaomi Communications Co Ltd\n98:F6:7A\t\tChipsea Technologies (Shenzhen) Crop.\n98:F7:81\t\tCommscope\n98:F7:D7\t\tCommscope\n98:F8:C1\t\tIDT Technology Limited\n98:F8:DB\t\tMarini Impianti Industriali s.r.l.\n98:F9:C7\t\tIEEE Registration Authority\n98:F9:C7:00:00:00/28\tShenzhen Huntkey Electric Co., Ltd.\n98:F9:C7:10:00:00/28\tHighSecLabs\n98:F9:C7:20:00:00/28\tPozyx NV\n98:F9:C7:30:00:00/28\tBeijing Horizon Information Technology Co., Ltd\n98:F9:C7:40:00:00/28\tPromess GmbH\n98:F9:C7:50:00:00/28\tTonycore Technology Co.,Ltd.\n98:F9:C7:60:00:00/28\tGoodBox\n98:F9:C7:70:00:00/28\tARIMA Communications Corp.\n98:F9:C7:80:00:00/28\tRenalsense\n98:F9:C7:90:00:00/28\tKoala Technology CO., LTD.\n98:F9:C7:A0:00:00/28\tMSB Elektronik und Gerätebau GmbH\n98:F9:C7:B0:00:00/28\tHIROIA Communications Pte. Ltd. Taiwan Branch\n98:F9:C7:C0:00:00/28\tShenZhen Chuangwei Electronic Appliance Co.,Ltd\n98:F9:C7:D0:00:00/28\thangzhou soar security technologies limited liability company\n98:F9:C7:E0:00:00/28\tNC-LINK Technology Co., Ltd.\n98:F9:CC\t\tZhejiang Dahua Technology Co., Ltd.\n98:FA:2E\t\tSony Interactive Entertainment Inc.\n98:FA:9B\t\tLCFC(Hefei) Electronics Technology co., ltd\n98:FA:A7\t\tInnonet\n98:FA:E3\t\tXiaomi Communications Co Ltd\n98:FB:12\t\tGrand Electronics (HK) Ltd\n98:FB:27\t\tSamsung Electronics Co.,Ltd\n98:FB:F5\t\tAtraltech\n98:FC:11\t\tCisco-Linksys, LLC\n98:FC:84\t\tIEEE Registration Authority\n98:FC:84:00:00:00/28\tLeia, Inc\n98:FC:84:10:00:00/28\tgo-e GmbH\n98:FC:84:20:00:00/28\tJuketek Co., Ltd.\n98:FC:84:30:00:00/28\tZeXin (Shanghai) Information Technologies Co.,Ltd\n98:FC:84:40:00:00/28\tSferrum GmbH\n98:FC:84:50:00:00/28\tZymbit\n98:FC:84:60:00:00/28\tZerone Co., Ltd.\n98:FC:84:70:00:00/28\tBroadtech Technologies Co., Ltd.\n98:FC:84:80:00:00/28\tGuangdong DE at science and technology co., LTD\n98:FC:84:90:00:00/28\tFath Mechatronics\n98:FC:84:A0:00:00/28\tShield Inc.\n98:FC:84:B0:00:00/28\tchiconypower\n98:FC:84:C0:00:00/28\tShenzhen Incar Technology Co., Ltd.\n98:FC:84:D0:00:00/28\tJazwares LLC\n98:FC:84:E0:00:00/28\tDongguan Kingtron Electronics Tech Co., Ltd\n98:FD:74\t\tAct.Co.Ltd\n98:FD:B4\t\tPrimax Electronics Ltd.\n98:FE:03\t\tEricsson - North America\n98:FE:3E\t\tIntel Corporate\n98:FE:94\t\tApple, Inc.\n98:FE:E1\t\tApple, Inc.\n98:FF:6A\t\tOTEC(Shanghai)Technology Co.,Ltd.\n98:FF:D0\t\tLenovo Mobile Communication Technology Ltd.\n9A:1B:22\t\tInfoCore Co.,Ltd.\n9A:56:4B\t\tCubix Corporation\n9A:AD:CA\t\tCredo\n9A:B2:F8\t\tSFF Committee\n9A:D2:63\t\tFirmTek, LLC\n9C:00:D3\t\tSHENZHEN IK WORLD Technology Co., Ltd\n9C:01:11\t\tShenzhen Newabel Electronic Co., Ltd.\n9C:02:98\t\tSamsung Electronics Co.,Ltd\n9C:03:51\t\tHuawei Technologies Co.,Ltd\n9C:03:9E\t\tBeijing Winchannel Software Technology Co., Ltd\n9C:04:73\t\tTecmobile (International) Ltd.\n9C:04:EB\t\tApple, Inc.\n9C:05:67\t\tHonor Device Co., Ltd.\n9C:05:91\t\tMellanox Technologies, Inc.\n9C:05:D6\t\tUbiquiti Inc\n9C:06:1B\t\tHangzhou H3C Technologies Co., Limited\n9C:06:6E\t\tHytera Communications Corporation Limited\n9C:06:CF\t\tPLAUD Inc.\n9C:09:71\t\tNew H3C Technologies Co., Ltd\n9C:09:8B\t\tCisco Systems, Inc\n9C:0B:05\t\teero inc.\n9C:0C:35\t\tShenzhenshi Xinzhongxin Technology Co.Ltd\n9C:0C:DF\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n9C:0D:AC\t\tTymphany HK Limited\n9C:0E:4A\t\tShenzhen Vastking Electronic Co.,Ltd.\n9C:0E:51\t\tSchneider Electric\n9C:12:21\t\tSichuan AI-Link Technology Co., Ltd.\n9C:13:9E\t\tEspressif Inc.\n9C:13:AB\t\tChanson Water Co., Ltd.\n9C:14:63\t\tZhejiang Dahua Technology Co., Ltd.\n9C:14:65\t\tEdata Elektronik San. ve Tic. A.Ş.\n9C:18:74\t\tNokia Danmark A/S\n9C:19:C2\t\tDongguan Liesheng Electronic Co., Ltd.\n9C:1A:25\t\tApple, Inc.\n9C:1C:12\t\tHewlett Packard Enterprise\n9C:1C:37\t\tAltoBeam (China) Inc.\n9C:1C:6D\t\tHefei Datang Storage Technology Co.,Ltd\n9C:1D:36\t\tHuawei Technologies Co.,Ltd\n9C:1D:58\t\tTexas Instruments\n9C:1E:95\t\tActiontec Electronics, Inc\n9C:1E:A4\t\tRenesas Electronics (Penang) Sdn. Bhd.\n9C:1E:CE\t\tALT Co., Ltd.\n9C:1E:CF\t\tValeo Telematik und Akustik GmbH\n9C:1F:CA\t\tHangzhou AlmightyDigit Technology Co., Ltd\n9C:1F:DD\t\tAccupix Inc.\n9C:20:7B\t\tApple, Inc.\n9C:21:6A\t\tTp-Link Technologies Co.,Ltd.\n9C:21:83\t\tBroadcom Limited\n9C:22:0E\t\tTASCAN Systems GmbH\n9C:24:72\t\tSagemcom Broadband SAS\n9C:25:95\t\tSamsung Electronics Co.,Ltd\n9C:25:BE\t\tWildlife Acoustics, Inc.\n9C:28:40\t\tDiscovery Technology,LTD..\n9C:28:B3\t\tApple, Inc.\n9C:28:BF\t\tContinental Automotive Czech Republic s.r.o.\n9C:28:EF\t\tHuawei Technologies Co.,Ltd\n9C:28:F7\t\tXiaomi Communications Co Ltd\n9C:29:3F\t\tApple, Inc.\n9C:29:76\t\tIntel Corporate\n9C:2A:70\t\tHon Hai Precision Ind. Co.,Ltd.\n9C:2A:83\t\tSamsung Electronics Co.,Ltd\n9C:2B:A6\t\tRuijie Networks Co.,LTD\n9C:2D:49\t\tNanowell Info Tech Co., Limited\n9C:2D:CD\t\tLCFC(Hefei) Electronics Technology co., ltd\n9C:2D:CF\t\tShishi Tongyun Technology(Chengdu)Co.,Ltd.\n9C:2E:7A\t\tSamsung Electronics Co.,Ltd\n9C:2E:A1\t\tXiaomi Communications Co Ltd\n9C:2F:4E\t\tzte corporation\n9C:2F:73\t\tUniversal Tiancheng Technology (Beijing) Co., Ltd.\n9C:2F:9D\t\tLiteon Technology Corporation\n9C:30:5B\t\tHon Hai Precision Ind. Co.,Ltd.\n9C:30:66\t\tRWE Effizienz GmbH\n9C:31:78\t\tFoshan Huadian Intelligent Communications Teachnologies Co.,Ltd\n9C:31:B6\t\tKulite Semiconductor Products Inc\n9C:31:C3\t\tSky Uk Limited\n9C:32:A9\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n9C:32:CE\t\tCanon Inc.\n9C:34:26\t\tCommscope\n9C:35:83\t\tNipro Diagnostics, Inc\n9C:35:EB\t\tApple, Inc.\n9C:36:F8\t\tHyundai Kefico\n9C:37:08\t\tHewlett Packard Enterprise\n9C:37:CB\t\tSony Interactive Entertainment Inc.\n9C:37:F4\t\tHuawei Technologies Co.,Ltd\n9C:38:18\t\tCisco Systems, Inc\n9C:39:28\t\tSamsung Electronics Co.,Ltd\n9C:3A:9A\t\tShenzhen Sundray Technologies company Limited\n9C:3A:AF\t\tSamsung Electronics Co.,Ltd\n9C:3D:CF\t\tNetgear\n9C:3E:53\t\tApple, Inc.\n9C:3E:AA\t\tEnvyLogic Co.,Ltd.\n9C:40:CD\t\tSynclayer Inc.\n9C:41:7C\t\tHame  Technology Co.,  Limited\n9C:43:1E\t\tIEEE Registration Authority\n9C:43:1E:00:00:00/28\tAntailiye Technology Co.,Ltd\n9C:43:1E:10:00:00/28\tSymfun Telecom Ltd\n9C:43:1E:20:00:00/28\tHaesung Ds\n9C:43:1E:30:00:00/28\tAdvanced Logic Technology (ALT) sa\n9C:43:1E:40:00:00/28\tWireless Environment, LLC\n9C:43:1E:50:00:00/28\tProMOS Technologies Inc.\n9C:43:1E:60:00:00/28\tR-S-I Elektrotechnik GmbH  CO KG\n9C:43:1E:70:00:00/28\tOptris GmbH\n9C:43:1E:80:00:00/28\tWunda Group plc\n9C:43:1E:90:00:00/28\t\"CONTINENT\" Co. Ltd\n9C:43:1E:A0:00:00/28\tST Access Control System Corp.\n9C:43:1E:B0:00:00/28\tJNL Technologies Inc\n9C:43:1E:C0:00:00/28\tSuZhou Jinruiyang Information Technology CO.,LTD\n9C:43:1E:D0:00:00/28\tHK ELEPHONE Communication Tech Co.,Limited\n9C:43:1E:E0:00:00/28\tShure Incorporated\n9C:44:3D\t\tChengdu Xuguang Technology Co, Ltd\n9C:44:A6\t\tSwiftTest, Inc.\n9C:45:63\t\tDIMEP Sistemas\n9C:45:F0\t\tSkylark Electronics Pvt Ltd\n9C:47:82\t\tTp-Link Technologies Co.,Ltd.\n9C:47:F4\t\tNokia\n9C:47:F9\t\tLJU Automatisierungstechnik GmbH\n9C:49:29\t\tHuawei Technologies Co.,Ltd\n9C:49:52\t\tDongguan Liesheng Electronic Co., Ltd.\n9C:49:7F\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n9C:4A:7B\t\tNokia Corporation\n9C:4B:6B\t\tiFlight Technology Company Limited\n9C:4C:AE\t\tMesa Labs\n9C:4E:20\t\tCisco Systems, Inc\n9C:4E:36\t\tIntel Corporate\n9C:4E:8E\t\tALT Systems Ltd\n9C:4E:BF\t\tBoxCast\n9C:4F:5F\t\tGoogle, Inc.\n9C:4F:AC\t\tzte corporation\n9C:4F:CF\t\tTCT mobile ltd\n9C:4F:DA\t\tApple, Inc.\n9C:50:D1\t\tMurata Manufacturing Co., Ltd.\n9C:50:EE\t\tCambridge Industries(Group) Co.,Ltd.\n9C:52:F8\t\tHuawei Technologies Co.,Ltd\n9C:53:22\t\tTP-Link Systems Inc\n9C:53:85\t\tPT. Hartono Istana Teknologi\n9C:53:CD\t\tENGICAM s.r.l.\n9C:54:16\t\tCisco Systems, Inc\n9C:54:1C\t\tShenzhen My-power Technology Co.,Ltd\n9C:54:40\t\tChengDu TD Tech\n9C:54:67\t\tNokia\n9C:54:C2\t\tNew H3C Technologies Co., Ltd\n9C:54:CA\t\tZhengzhou VCOM Science and Technology Co.,Ltd\n9C:54:DA\t\tSkyBell Technologies Inc.\n9C:55:8F\t\tLockin Technology(Beijing) Co.,Ltd.\n9C:55:B4\t\tI.S.E. S.r.l.\n9C:56:36\t\tHuawei Device Co., Ltd.\n9C:57:11\t\tFeitian Xunda(Beijing) Aeronautical Information Technology Co., Ltd.\n9C:57:66\t\tHuawei Technologies Co.,Ltd\n9C:57:AD\t\tCisco Systems, Inc\n9C:57:BC\t\teero inc.\n9C:58:3C\t\tApple, Inc.\n9C:58:84\t\tApple, Inc.\n9C:5A:44\t\tCompal Information (Kunshan) Co., Ltd.\n9C:5A:80\t\tJuniper Networks\n9C:5A:81\t\tXiaomi Communications Co Ltd\n9C:5A:8A\t\tDji Baiwang Technology Co Ltd\n9C:5B:96\t\tNMR Corporation\n9C:5C:8D\t\tFiremax Indústria E Comércio De Produtos Eletrônicos  Ltda\n9C:5C:8E\t\tASUSTek COMPUTER INC.\n9C:5C:F9\t\tSony Corporation\n9C:5D:12\t\tExtreme Networks Headquarters\n9C:5D:95\t\tVTC Electronics Corp.\n9C:5E:73\t\tCalibre UK LTD\n9C:5F:5A\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n9C:5F:B0\t\tSamsung Electronics Co.,Ltd\n9C:60:76\t\tApple, Inc.\n9C:61:1D\t\tPanasonic Corporation of North America\n9C:61:21\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n9C:61:D7\t\tHuawei Technologies Co.,Ltd\n9C:62:AB\t\tSumavision Technologies Co.,Ltd\n9C:63:5B\t\tzte corporation\n9C:63:C0\t\tMellanox Technologies, Inc.\n9C:63:ED\t\tzte corporation\n9C:64:5E\t\tHarman Consumer Group\n9C:64:8B\t\tApple, Inc.\n9C:65:B0\t\tSamsung Electronics Co.,Ltd\n9C:65:EB\t\tIntel Corporate\n9C:65:EE\t\tZhone Technologies, Inc.\n9C:65:F9\t\tAcSiP Technology Corp.\n9C:65:FA\t\tAcSiP\n9C:66:50\t\tGlodio Technolies Co.,Ltd Tianjin Branch\n9C:66:97\t\tCisco Systems, Inc\n9C:67:D6\t\tIntel Corporate\n9C:68:5B\t\tOctonion SA\n9C:68:65\t\tFiberhome Telecommunication Technologies Co.,LTD\n9C:69:37\t\tQorvo International Pte. Ltd.\n9C:69:B4\t\tIEEE Registration Authority\n9C:69:B4:00:00:00/28\tSuzhou Fitcan Technology Co.,LTD\n9C:69:B4:10:00:00/28\tEA Technology Ltd\n9C:69:B4:20:00:00/28\tMOZI (Shenzhen) Artificial Intelligence Technology Co., Ltd.\n9C:69:B4:30:00:00/28\tAppareo Systems, LLC\n9C:69:B4:40:00:00/28\tGlobalcom Engineering SPA\n9C:69:B4:50:00:00/28\tElesta GmbH\n9C:69:B4:60:00:00/28\tShenzhen jiahua zhongli technology co.LTD\n9C:69:B4:70:00:00/28\tPCI Limited\n9C:69:B4:80:00:00/28\tSkydock do Brasil Ltda\n9C:69:B4:90:00:00/28\tTeptron AB\n9C:69:B4:A0:00:00/28\tBeijing Picohood Technology Co.,Ltd\n9C:69:B4:B0:00:00/28\tToughdog Security Systems\n9C:69:B4:C0:00:00/28\tGuangdong Hanwei intergration Co.,Ltd\n9C:69:B4:D0:00:00/28\t\"Intellect module\" LLC\n9C:69:B4:E0:00:00/28\tNingbo Shen Link Communication Technology Co., Ltd\n9C:69:D1\t\tHuawei Technologies Co.,Ltd\n9C:69:D3\t\tASIX Electronics Corporation\n9C:69:ED\t\tArista Networks\n9C:6A:BE\t\tQEES ApS.\n9C:6B:00\t\tASRock Incorporation\n9C:6B:37\t\tRenesas Electronics (Penang) Sdn. Bhd.\n9C:6B:72\t\tRealme Chongqing MobileTelecommunications Corp Ltd\n9C:6B:F0\t\tShenzhen Yipingfang Network Technology Co., Ltd.\n9C:6C:15\t\tMicrosoft Corporation\n9C:6F:52\t\tzte corporation\n9C:71:3A\t\tHuawei Technologies Co.,Ltd\n9C:73:70\t\tHuawei Technologies Co.,Ltd\n9C:73:B1\t\tSamsung Electronics Co.,Ltd\n9C:74:03\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n9C:74:1A\t\tHuawei Technologies Co.,Ltd\n9C:74:6F\t\tHuawei Technologies Co.,Ltd\n9C:75:14\t\tWildix srl\n9C:75:6E\t\tAjax Systems DMCC\n9C:76:0E\t\tApple, Inc.\n9C:76:13\t\tRing LLC\n9C:77:AA\t\tNadasnv\n9C:79:AC\t\tSuntec Software(Shanghai) Co., Ltd.\n9C:79:E3\t\tApple, Inc.\n9C:7A:03\t\tCiena Corporation\n9C:7B:D2\t\tNEOLAB Convergence\n9C:7B:EF\t\tHewlett Packard\n9C:7D:A3\t\tHuawei Technologies Co.,Ltd\n9C:7D:C0\t\tTech4home, Lda\n9C:7F:57\t\tUNIC Memory Technology Co Ltd\n9C:7F:81\t\tShenzhen Fast Technologies Co.,Ltd\n9C:80:7D\t\tSYSCABLE Korea Inc.\n9C:80:DF\t\tArcadyan Technology Corporation\n9C:82:3F\t\tHuawei Device Co., Ltd.\n9C:82:75\t\tYichip Microelectronics (Hangzhou) Co.,Ltd\n9C:82:81\t\tvivo Mobile Communication Co., Ltd.\n9C:83:06\t\tSamsung Electronics Co.,Ltd\n9C:83:BF\t\tPRO-VISION, Inc.\n9C:84:B6\t\tShenzhen iComm Semiconductor CO.,LTD\n9C:84:BF\t\tApple, Inc.\n9C:85:66\t\tWingtech Mobile Communications Co.,Ltd.\n9C:86:DA\t\tPhoenix Geophysics Ltd.\n9C:88:24\t\tPetroCloud LLC\n9C:88:88\t\tSimac Techniek NV\n9C:88:AD\t\tFiberhome Telecommunication Technologies Co.,LTD\n9C:89:1E\t\tFireBrick Ltd\n9C:8A:CB\t\tJuniper Networks\n9C:8B:A0\t\tApple, Inc.\n9C:8B:F1\t\tThe Warehouse Limited\n9C:8C:6E\t\tSamsung Electronics Co.,Ltd\n9C:8C:D8\t\tHewlett Packard Enterprise\n9C:8D:1A\t\tINTEG process group inc\n9C:8D:7C\t\tAlpsalpine Co,.Ltd\n9C:8D:D3\t\tLeonton Technologies\n9C:8E:99\t\tHewlett Packard\n9C:8E:9C\t\tHuawei Device Co., Ltd.\n9C:8E:CD\t\tAmcrest Technologies\n9C:8E:DC\t\tTeracom Limited\n9C:90:19\t\tBeyless\n9C:92:4F\t\tApple, Inc.\n9C:93:4E\t\tXerox Corporation\n9C:93:B0\t\tMegatronix (Beijing) Technology Co., Ltd.\n9C:93:E4\t\tPrivate\n9C:95:61\t\tHui Zhou Gaoshengda Technology Co.,LTD\n9C:95:67\t\tHuawei Device Co., Ltd.\n9C:95:6E\t\tMicrochip Technology Inc.\n9C:95:F8\t\tSmartDoor Systems, LLC\n9C:96:13\t\tLenovo Future Communication Technology (Chongqing) Company Limited\n9C:97:1B\t\tIntel Corporate\n9C:97:26\t\tTechnicolor Delivery Technologies Belgium NV\n9C:97:89\t\t1More\n9C:97:93\t\tHuawei Technologies Co.,Ltd\n9C:98:11\t\tGuangzhou Sunrise Electronics Development Co., Ltd\n9C:99:A0\t\tXiaomi Communications Co Ltd\n9C:99:CD\t\tVoippartners\n9C:9A:C0\t\tLEGO System A/S\n9C:9C:1D\t\tStarkey Labs Inc.\n9C:9C:1F\t\tEspressif Inc.\n9C:9C:40\t\tSichuan Tianyi Comheart Telecom Co.,LTD\n9C:9D:5D\t\tRaden Inc\n9C:9D:7E\t\tBeijing Xiaomi Mobile Software Co., Ltd\n9C:9E:03\t\tawayfrom\n9C:9E:6E\t\tEspressif Inc.\n9C:9E:71\t\tHuawei Device Co., Ltd.\n9C:9E:D5\t\tXiaomi Communications Co Ltd\n9C:A1:0A\t\tScle Sfe\n9C:A1:34\t\tNike, Inc.\n9C:A2:F4\t\tTP-Link Systems Inc\n9C:A3:89\t\tNokia\n9C:A3:A9\t\tGuangzhou Juan Optical and Electronical Tech Joint Stock Co., Ltd\n9C:A3:BA\t\tSAKURA Internet Inc.\n9C:A5:13\t\tSamsung Electronics Co.,Ltd\n9C:A5:25\t\tShandong USR IOT Technology Limited\n9C:A5:70\t\teero inc.\n9C:A5:77\t\tOsorno Enterprises Inc.\n9C:A5:C0\t\tvivo Mobile Communication Co., Ltd.\n9C:A6:15\t\tTp-Link Technologies Co.,Ltd.\n9C:A6:9D\t\tWhaley Technology Co.Ltd\n9C:A6:D8\t\tFiberhome Telecommunication Technologies Co.,LTD\n9C:A9:B8\t\tCisco Systems, Inc\n9C:A9:C5\t\tApple, Inc.\n9C:A9:E4\t\tzte corporation\n9C:AA:1B\t\tMicrosoft Corporation\n9C:AA:5D\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n9C:AC:6D\t\tUniversal Electronics, Inc.\n9C:AD:97\t\tHon Hai Precision Ind. Co.,Ltd.\n9C:AD:EF\t\tObihai Technology, Inc.\n9C:AE:D3\t\tSeiko Epson Corporation\n9C:AF:6F\t\tItel Mobile Limited\n9C:AF:CA\t\tCisco Systems, Inc\n9C:B0:08\t\tUbiquitous Computing Technology Corporation\n9C:B1:50\t\tIntel Corporate\n9C:B1:DC\t\tEarda Technologies co Ltd\n9C:B2:06\t\tHMS Industrial Networks\n9C:B2:B2\t\tHuawei Technologies Co.,Ltd\n9C:B2:E8\t\tHuawei Technologies Co.,Ltd\n9C:B4:00\t\tzte corporation\n9C:B6:54\t\tHewlett Packard\n9C:B6:D0\t\tRivet Networks\n9C:B7:0D\t\tLiteon Technology Corporation\n9C:B7:93\t\tCreatcomm Technology Inc.\n9C:B8:B4\t\tAMPAK Technology,Inc.\n9C:BA:C9\t\tTelit Communication s.p.a\n9C:BB:98\t\tShen Zhen RND Electronic Co.,LTD\n9C:BC:F0\t\tXiaomi Communications Co Ltd\n9C:BD:6E\t\tDERA Co., Ltd\n9C:BD:9D\t\tSkyDisk, Inc.\n9C:BE:E0\t\tBiosoundlab Co., Ltd.\n9C:BF:0D\t\tFramework Computer Inc.\n9C:BF:CD\t\tHuawei Technologies Co.,Ltd\n9C:C0:77\t\tPrintCounts, LLC\n9C:C0:D2\t\tConductix-Wampfler GmbH\n9C:C1:2D\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\n9C:C1:72\t\tHuawei Technologies Co.,Ltd\n9C:C2:C4\t\tIEIT SYSTEMS Co., Ltd.\n9C:C7:A6\t\tAVM GmbH\n9C:C7:B1\t\tElitegroup Computer Systems Co.,Ltd.\n9C:C7:D1\t\tSHARP Corporation\n9C:C7:D3\t\tAzureWave Technology Inc.\n9C:C8:93\t\tJuniper Networks\n9C:C8:AE\t\tBecton, Dickinson  and Company\n9C:C8:E9\t\tAmazon Technologies Inc.\n9C:C8:FC\t\tCommscope\n9C:C9:50\t\tBaumer Holding\n9C:C9:EB\t\tNetgear\n9C:CA:D9\t\tNokia Corporation\n9C:CB:F7\t\tCloud Star Technology Co., Ltd.\n9C:CC:83\t\tJuniper Networks\n9C:CD:82\t\tCheng Uei Precision Industry Co.,Ltd\n9C:CE:88\t\tRuijie Networks Co.,LTD\n9C:D1:D0\t\tGuangzhou Ronsuo Electronic Technology Co.,Ltd\n9C:D2:1E\t\tHon Hai Precision Ind. Co.,Ltd.\n9C:D2:4B\t\tzte corporation\n9C:D3:32\t\tPLC Technology Ltd\n9C:D3:5B\t\tSamsung Electronics Co.,Ltd\n9C:D3:6D\t\tNetgear\n9C:D4:8B\t\tInnolux Technology Europe BV\n9C:D4:A6\t\tServercom (India) Private Limited\n9C:D5:7D\t\tCisco Systems, Inc\n9C:D6:43\t\tD-Link International\n9C:D8:E3\t\tWuhan Huazhong Numerical Control Co., Ltd\n9C:D9:17\t\tMotorola Mobility LLC, a Lenovo Company\n9C:D9:CB\t\tLesira Manufacturing Pty Ltd\n9C:DA:36\t\tTecno Mobile Limited\n9C:DA:3E\t\tIntel Corporate\n9C:DA:A8\t\tApple, Inc.\n9C:DA:B7\t\tHewlett Packard Enterprise\n9C:DB:07\t\tYellowtec GmbH\n9C:DB:AF\t\tHuawei Technologies Co.,Ltd\n9C:DB:CB\t\tFunshion Online Technologies Co.,Ltd\n9C:DC:71\t\tHewlett Packard Enterprise\n9C:DD:1F\t\tIntelligent Steward Co.,Ltd\n9C:DE:4D\t\tML vision Co.,LTD\n9C:DE:F0\t\tJiangxi Risound Electronics Co.,LTD\n9C:DF:03\t\tHarman/Becker Automotive Systems GmbH\n9C:DF:B1\t\tShenzhen Crave Communication Co., LTD\n9C:DF:B3\t\tNXP Semiconductor (Tianjin) LTD.\n9C:E0:41\t\tNokia\n9C:E0:63\t\tSamsung Electronics Co.,Ltd\n9C:E1:0E\t\tNCTech Ltd\n9C:E1:76\t\tCisco Systems, Inc\n9C:E1:D6\t\tJunger Audio-Studiotechnik GmbH\n9C:E2:30\t\tJulong Co,.Ltd.\n9C:E3:30\t\tCisco Meraki\n9C:E3:3F\t\tApple, Inc.\n9C:E3:74\t\tHuawei Technologies Co.,Ltd\n9C:E5:49\t\tIEEE Registration Authority\n9C:E5:49:00:00:00/28\tSpeedtech Corp.\n9C:E5:49:10:00:00/28\tLightmatter, Inc.\n9C:E5:49:20:00:00/28\tVolumatic Limited\n9C:E5:49:30:00:00/28\tShenzhen Jooan Technology  Co., Ltd\n9C:E5:49:40:00:00/28\tBeijing Lingji Innovations technology Co,LTD.\n9C:E5:49:50:00:00/28\tWetek Electronics Limited\n9C:E5:49:60:00:00/28\tshenzhen Huaxufeng Technology Development Co.,Ltd\n9C:E5:49:70:00:00/28\tecodata solutions GmbH\n9C:E5:49:80:00:00/28\tHemla Group AB\n9C:E5:49:90:00:00/28\tHangzhou Xieneng Technology Co., Ltd.\n9C:E5:49:A0:00:00/28\tArcteq Relays Ltd.\n9C:E5:49:B0:00:00/28\tShenzhen Lingdu Auto Electronics Co.,Ltd\n9C:E5:49:C0:00:00/28\tInnodep Inc.\n9C:E5:49:D0:00:00/28\tAnnapurna labs\n9C:E5:49:E0:00:00/28\tAmoi Mobile Co.,Ltd.\n9C:E6:35\t\tNintendo Co., Ltd.\n9C:E6:5E\t\tApple, Inc.\n9C:E6:E7\t\tSamsung Electronics Co.,Ltd\n9C:E7:BD\t\tWinduskorea co., Ltd\n9C:E8:2B\t\tvivo Mobile Communication Co., Ltd.\n9C:E8:95\t\tNew H3C Technologies Co., Ltd\n9C:E9:1C\t\tzte corporation\n9C:E9:1E\t\tTejas Networks Ltd\n9C:E9:51\t\tShenzhen Sang Fei Consumer Communications Ltd., Co.\n9C:EA:97\t\tHonor Device Co., Ltd.\n9C:EB:E8\t\tBizLink (Kunshan) Co.,Ltd\n9C:EC:61\t\tHuawei Device Co., Ltd.\n9C:ED:FA\t\tEVUlution AG\n9C:EF:D5\t\tPanda Wireless, Inc.\n9C:F0:29\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\n9C:F1:55\t\tNokia\n9C:F1:D4\t\tRoku, Inc\n9C:F3:87\t\tApple, Inc.\n9C:F3:AC\t\tApple, Inc.\n9C:F4:8E\t\tApple, Inc.\n9C:F5:31\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n9C:F5:5F\t\tHarman/Becker Automotive Systems GmbH\n9C:F6:1A\t\tCarrier Fire & Security\n9C:F6:7D\t\tRicardo Prague, s.r.o.\n9C:F6:DD\t\tIEEE Registration Authority\n9C:F6:DD:00:00:00/28\tAnnapurna labs\n9C:F6:DD:10:00:00/28\tIthor IT Co.,Ltd.\n9C:F6:DD:20:00:00/28\tBeijing Sifang Automation Co., Ltd.\n9C:F6:DD:30:00:00/28\tRYEEX Technology Co.,Ltd.\n9C:F6:DD:40:00:00/28\tCapital Engineering & Research Incorporation Ltd.\n9C:F6:DD:50:00:00/28\tb8ta Inc.\n9C:F6:DD:60:00:00/28\tShenzhen Xtooltech Co., Ltd\n9C:F6:DD:70:00:00/28\tKXT Technology Co., Ltd.\n9C:F6:DD:80:00:00/28\tSavari Inc\n9C:F6:DD:90:00:00/28\tCAMA（Luoyang）Electronics Co.，Ltd\n9C:F6:DD:A0:00:00/28\tAVI Pty Ltd\n9C:F6:DD:B0:00:00/28\tGuangzhou LANGO Electronics Technology Co., Ltd.\n9C:F6:DD:C0:00:00/28\tLighting New Energy Technology Co., Ltd.\n9C:F6:DD:D0:00:00/28\tFoshan Synwit Technology Co.,Ltd.\n9C:F6:DD:E0:00:00/28\tShanxi ZhuoZhi fei High Electronic Technology Co. Ltd.\n9C:F8:6B\t\tAgiTech Distribution Limited - Linki\n9C:F8:B8\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\n9C:F8:DB\t\tshenzhen eyunmei technology co,.ltd\n9C:F9:38\t\tAREVA NP GmbH\n9C:FA:3C\t\tDaeyoung Electronics\n9C:FA:76\t\tApple, Inc.\n9C:FB:77\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\n9C:FB:D5\t\tvivo Mobile Communication Co., Ltd.\n9C:FB:F1\t\tMESOMATIC GmbH & Co.KG\n9C:FC:01\t\tApple, Inc.\n9C:FC:28\t\tApple, Inc.\n9C:FC:D1\t\tAetheris Technology (Shanghai) Co., Ltd.\n9C:FC:E8\t\tIntel Corporate\n9C:FE:A1\t\tFiberhome Telecommunication Technologies Co.,LTD\n9C:FF:BE\t\tOTSL Inc.\n9C:FF:C2\t\tAVI Systems GmbH\nA0:00:4C\t\tHisense Visual Technology Co.,Ltd\nA0:02:4A\t\tIEEE Registration Authority\nA0:02:4A:00:00:00/28\tZhejiang Hechuan Technology Co.,Ltd\nA0:02:4A:10:00:00/28\tVidendum Media Solutions Spa\nA0:02:4A:20:00:00/28\tDanriver Technologies Corp.\nA0:02:4A:30:00:00/28\tSomaDetect Inc\nA0:02:4A:40:00:00/28\tArgos Solutions AS\nA0:02:4A:50:00:00/28\tDongguan Amsamotion Automation Technology Co., Ltd\nA0:02:4A:60:00:00/28\tXiaojie Technology (Shenzhen) Co., Ltd\nA0:02:4A:70:00:00/28\tEnnebi Elettronica Srl\nA0:02:4A:80:00:00/28\tBeijing Lyratone Technology Co., Ltd\nA0:02:4A:90:00:00/28\tKontakt Micro-Location Sp z o.o.\nA0:02:4A:A0:00:00/28\tGuangdong Jinpeng Technology Co. LTD\nA0:02:4A:B0:00:00/28\tXi'an Yingsheng Electric Technology Co.,Ltd.\nA0:02:4A:C0:00:00/28\tEncroute AB\nA0:02:4A:D0:00:00/28\tbitbee Inc\nA0:02:4A:E0:00:00/28\tIoTecha Corp\nA0:02:A5\t\tIntel Corporate\nA0:02:DC\t\tAmazon Technologies Inc.\nA0:03:63\t\tRobert Bosch Healthcare GmbH\nA0:04:3E\t\tParker Hannifin Manufacturing Germany GmbH & Co. KG\nA0:04:60\t\tNetgear\nA0:06:27\t\tNEXPA System\nA0:07:98\t\tSamsung Electronics Co.,Ltd\nA0:07:B6\t\tAdvanced Technical Support, Inc.\nA0:08:6F\t\tHuawei Technologies Co.,Ltd\nA0:09:2E\t\tzte corporation\nA0:09:4C\t\tCenturyLink\nA0:09:ED\t\tAvaya Inc\nA0:0A:9A\t\tHuawei Device Co., Ltd.\nA0:0A:BF\t\tWieson Technologies Co., Ltd.\nA0:0B:BA\t\tSamsung Electro Mechanics Co., Ltd.\nA0:0C:A1\t\tSKTB SKiT\nA0:0C:E2\t\tShenzhen Shokz Co., Ltd.\nA0:0E:98\t\tHuawei Technologies Co.,Ltd\nA0:0F:37\t\tCisco Systems, Inc\nA0:10:77\t\tzte corporation\nA0:10:81\t\tSamsung Electronics Co.,Ltd\nA0:12:90\t\tAvaya Inc\nA0:12:DB\t\tTabuchi Electric Co.,Ltd\nA0:13:3B\t\tHiTi Digital, Inc.\nA0:13:CB\t\tFiberhome Telecommunication Technologies Co.,LTD\nA0:14:3D\t\tParrot Sa\nA0:16:5C\t\tTriteka LTD\nA0:17:F1\t\tAllwinner Technology Co., Ltd\nA0:18:28\t\tApple, Inc.\nA0:18:42\t\tComtrend Corporation\nA0:18:59\t\tShenzhen Yidashi Electronics Co Ltd\nA0:19:17\t\tBertel S.p.a.\nA0:19:B2\t\tIEEE Registration Authority\nA0:19:B2:00:00:00/28\tVast Production Services\nA0:19:B2:10:00:00/28\tEl Sewedy Electrometer Egypt S.A.E.\nA0:19:B2:20:00:00/28\tBeijing Deephi Intelligent Technology Co., Ltd\nA0:19:B2:30:00:00/28\tPower Diagnostic Service Co., LTD.\nA0:19:B2:40:00:00/28\tOsatec\nA0:19:B2:50:00:00/28\tSzbroad   Technology (Hk) Co.,Ltmited\nA0:19:B2:60:00:00/28\tGfG mbH\nA0:19:B2:70:00:00/28\tARIMA Communications Corp.\nA0:19:B2:80:00:00/28\tMIS Industrie Systeme GmbH & Co. KG\nA0:19:B2:90:00:00/28\tLon Microsystems Inc.\nA0:19:B2:A0:00:00/28\tAdomi\nA0:19:B2:B0:00:00/28\tHangZhou iMagic Technology Co., Ltd\nA0:19:B2:C0:00:00/28\tLDA Technologies\nA0:19:B2:D0:00:00/28\tRYD Electronic Technology Co.,Ltd.\nA0:19:B2:E0:00:00/28\tAhgora Sistemas SA\nA0:1A:E3\t\tEdgecore Americas Networking Corporation\nA0:1B:29\t\tSagemcom Broadband SAS\nA0:1B:9E\t\tSamsung Electronics Co.,Ltd\nA0:1B:D6\t\tNautitech Mining Systems Pty. Ltd.\nA0:1C:05\t\tNimax Telecom Co.,Ltd.\nA0:1C:87\t\tUnion Man Technology Co.,Ltd\nA0:1C:8D\t\tHuawei Technologies Co.,Ltd\nA0:1D:48\t\tHewlett Packard\nA0:1E:0B\t\tMINIX Technology Limited\nA0:20:A6\t\tEspressif Inc.\nA0:21:8B\t\tACE Antenna Co., ltd\nA0:21:95\t\tSamsung Electronics Co.,Ltd\nA0:21:AA\t\tChina Mobile Group Device Co.,Ltd.\nA0:21:B7\t\tNetgear\nA0:22:4E\t\tIEEE Registration Authority\nA0:22:4E:00:00:00/28\tKyung In Electronics\nA0:22:4E:10:00:00/28\tPoE Texas\nA0:22:4E:20:00:00/28\tClosed Joint-Stock Company \"NORSI-TRANS\"\nA0:22:4E:30:00:00/28\tProPhotonix\nA0:22:4E:40:00:00/28\tTMGcore, Inc.\nA0:22:4E:50:00:00/28\tZhuhai Cheer Technology Co., LTD.\nA0:22:4E:60:00:00/28\tMESIT asd, s.r.o.\nA0:22:4E:70:00:00/28\tApplied Information, Inc.\nA0:22:4E:80:00:00/28\tEISST  International Ltd\nA0:22:4E:90:00:00/28\tDelta Tau Data Systems, Inc.\nA0:22:4E:A0:00:00/28\tIST ElektronikgesmbH\nA0:22:4E:B0:00:00/28\tAll Inspire Health Inc.\nA0:22:4E:C0:00:00/28\tStandartoptic, Limited Liability Company\nA0:22:4E:D0:00:00/28\tDigifocus Technology Inc.\nA0:22:4E:E0:00:00/28\tHunan Youmei Science&Technology Development Co.,Ltd.\nA0:22:52\t\tAstra Wireless Technology FZ-LLC\nA0:22:DE\t\tvivo Mobile Communication Co., Ltd.\nA0:23:1B\t\tTeleComp R&D Corp.\nA0:23:9F\t\tCisco Systems, Inc\nA0:24:42\t\tShenzhenshi Xinzhongxin Technology Co.Ltd\nA0:24:F9\t\tChengdu InnovaTest Technology Co., Ltd\nA0:25:D7\t\tHewlett Packard Enterprise\nA0:27:B6\t\tSamsung Electronics Co.,Ltd\nA0:28:33\t\tIEEE Registration Authority\nA0:28:33:00:00:00/28\tGERSYS GmbH\nA0:28:33:10:00:00/28\tOrdercube GmbH\nA0:28:33:20:00:00/28\tShanghai Nohmi Secom Fire Protection  Equipment Co.,Ltd.\nA0:28:33:30:00:00/28\tShanghai Xuntai Information Technology Co.,Ltd.\nA0:28:33:40:00:00/28\tFirm INFORMTEST Ltd.\nA0:28:33:50:00:00/28\tJGR Optics Inc\nA0:28:33:60:00:00/28\tXiamen Caimore Communication Technology Co.,Ltd.\nA0:28:33:70:00:00/28\tKryptus Information Security S/A\nA0:28:33:80:00:00/28\tHzhy Technology\nA0:28:33:90:00:00/28\tImeshx Corporation Limited\nA0:28:33:A0:00:00/28\tMedical Evolution Kft\nA0:28:33:B0:00:00/28\tFlexLink AB\nA0:28:33:C0:00:00/28\tKalray S.A.\nA0:28:33:D0:00:00/28\tAudix\nA0:28:33:E0:00:00/28\tPrecision Planting, LLC.\nA0:28:84\t\tGarmin International\nA0:28:ED\t\tHMD Global Oy\nA0:29:19\t\tDell Inc.\nA0:29:42\t\tIntel Corporate\nA0:29:BD\t\tTeam Group Inc\nA0:2B:44\t\tWaveGo Tech LLC\nA0:2B:B8\t\tHewlett Packard\nA0:2C:36\t\tFn-Link Technology Limited\nA0:2D:13\t\tAirTies Wireless Networks\nA0:2D:DB\t\tSagemcom Broadband SAS\nA0:2E:F3\t\tUnited Integrated Services Co., Led.\nA0:31:31\t\tProcenne Digital Security\nA0:31:DB\t\tHuawei Technologies Co.,Ltd\nA0:31:EB\t\tSemikron Elektronik GmbH & Co. KG\nA0:32:99\t\tLenovo (Beijing) Co., Ltd.\nA0:33:4F\t\tCisco Systems, Inc\nA0:34:1B\t\tAdero Inc\nA0:36:79\t\tHuawei Technologies Co.,Ltd\nA0:36:9F\t\tIntel Corporate\nA0:36:BC\t\tASUSTek COMPUTER INC.\nA0:36:F0\t\tComprehensive Power\nA0:36:FA\t\tEttus Research LLC\nA0:37:68\t\tShenzhen E-Life Intelligence Technology Co.,Ltd.\nA0:38:F8\t\tOURA Health Oy\nA0:39:75\t\tLeo Bodnar Electronics Ltd\nA0:39:EE\t\tSagemcom Broadband SAS\nA0:39:F7\t\tLG Electronics (Mobile Communications)\nA0:39:F9\t\tSagemcom Broadband SAS\nA0:3A:75\t\tPSS Belgium N.V.\nA0:3B:01\t\tKyung In Electronics\nA0:3B:1B\t\tInspire Tech\nA0:3B:E3\t\tApple, Inc.\nA0:3C:20\t\tSagemcom Broadband SAS\nA0:3C:31\t\tShenzhen Belon Technology CO.,LTD\nA0:3D:6E\t\tCisco Systems, Inc\nA0:3D:6F\t\tCisco Systems, Inc\nA0:3E:6B\t\tIEEE Registration Authority\nA0:3E:6B:00:00:00/28\ts&t embedded GmbH\nA0:3E:6B:10:00:00/28\tBusiness Support Consultant Co.,Ltd\nA0:3E:6B:20:00:00/28\tVidex Electronics S.p.A.\nA0:3E:6B:30:00:00/28\tiLoda Solutions Limited\nA0:3E:6B:40:00:00/28\tShenzhen Nufilo Inc.\nA0:3E:6B:50:00:00/28\tFriday Lab, UAB\nA0:3E:6B:60:00:00/28\tWuhan Rui Ying Tong Network Technology Co., Ltd(China)\nA0:3E:6B:70:00:00/28\tSinoGrid Software Systems Inc.\nA0:3E:6B:80:00:00/28\t718th  Research  Institute  of  CSIC\nA0:3E:6B:90:00:00/28\tIncogniteam Ltd.\nA0:3E:6B:A0:00:00/28\tShenzhen Neostra Technology Co.Ltd\nA0:3E:6B:B0:00:00/28\tKoCoS Messtechnik AG\nA0:3E:6B:C0:00:00/28\tQunar.com\nA0:3E:6B:D0:00:00/28\tJining SmartCity Infotech Co.Ltd.\nA0:3E:6B:E0:00:00/28\tNanjing zhanyi software technology co., LTD\nA0:3E:6B:F0:00:00/28\tPrivate\nA0:40:25\t\tActioncable, Inc.\nA0:40:41\t\tSAMWONFA Co.,Ltd.\nA0:40:6F\t\tHuawei Technologies Co.,Ltd\nA0:40:A0\t\tNetgear\nA0:41:2D\t\tLansen Systems AB\nA0:41:47\t\tHuawei Device Co., Ltd.\nA0:41:5E\t\tOpsens Solution Inc.\nA0:41:A7\t\tNL Ministry of Defense\nA0:42:3F\t\tTyan Computer Corp\nA0:42:46\t\tIT Telecom Co., Ltd.\nA0:42:D1\t\tHuawei Device Co., Ltd.\nA0:43:B0\t\tHangzhou BroadLink Technology Co.,Ltd\nA0:43:DB\t\tSitael S.p.A.\nA0:44:5C\t\tHuawei Technologies Co.,Ltd\nA0:44:66\t\tIntellics\nA0:44:B7\t\tPAX Computer Technology(Shenzhen) Ltd.\nA0:44:F3\t\tRafaelMicro\nA0:46:5A\t\tMotorola Mobility LLC, a Lenovo Company\nA0:47:9B\t\tPROCITEC GmbH\nA0:47:D7\t\tBest IT World (India) Pvt Ltd\nA0:48:1C\t\tHewlett Packard\nA0:48:39\t\tHuawei Technologies Co.,Ltd\nA0:4A:5E\t\tMicrosoft Corporation\nA0:4C:0C\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nA0:4C:5B\t\tShenzhen TINNO Mobile Technology Corp.\nA0:4C:C1\t\tHelixtech Corp.\nA0:4E:01\t\tCENTRAL ENGINEERING co.,ltd.\nA0:4E:04\t\tNokia Corporation\nA0:4E:A7\t\tApple, Inc.\nA0:4E:CF\t\tApple, Inc.\nA0:4F:52\t\tIntel Corporate\nA0:4F:85\t\tLG Electronics (Mobile Communications)\nA0:4F:D4\t\tADB Broadband Italia\nA0:4F:E4\t\tPAX Computer Technology(Shenzhen) Ltd.\nA0:51:0B\t\tIntel Corporate\nA0:51:C6\t\tAvaya Inc\nA0:52:72\t\tApple, Inc.\nA0:52:AB\t\tAvm Electronics Pte Ltd\nA0:53:94\t\tShenzhen zediel co., Ltd.\nA0:55:1F\t\tSagemcom Broadband SAS\nA0:55:4F\t\tCisco Systems, Inc\nA0:55:DE\t\tCommscope\nA0:56:2C\t\tSamsung Electronics Co.,Ltd\nA0:56:B2\t\tHarman/Becker Automotive Systems GmbH\nA0:56:F3\t\tApple, Inc.\nA0:57:E3\t\tHuawei Technologies Co.,Ltd\nA0:59:3A\t\tV.D.S. Video Display Systems srl\nA0:59:50\t\tIntel Corporate\nA0:5A:A4\t\tGrand Products Nevada, Inc.\nA0:5B:21\t\tENVINET GmbH\nA0:5D:C1\t\tTMCT Co., LTD.\nA0:5D:E7\t\tDIRECTV, Inc.\nA0:5E:6B\t\tMELPER Co., Ltd.\nA0:60:32\t\tAmcrest Technologies\nA0:60:90\t\tSamsung Electronics Co.,Ltd\nA0:62:60\t\tPrivate\nA0:62:FB\t\tHisense Visual Technology Co.,Ltd\nA0:63:91\t\tNetgear\nA0:64:8F\t\tAskey Computer Corp\nA0:65:18\t\tVnpt Technology\nA0:66:10\t\tFujitsu Limited\nA0:66:36\t\tIntracom SA Telecom Solutions\nA0:67:20\t\tChina Dragon Technology Limited\nA0:67:BE\t\tSicon srl\nA0:67:D6\t\tNokia\nA0:68:1C\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nA0:68:7E\t\tCommscope\nA0:69:74\t\tHonor Device Co., Ltd.\nA0:69:86\t\tWellav Technologies Ltd\nA0:69:D9\t\tNew H3C Technologies Co., Ltd\nA0:6A:00\t\tVerilink Corporation\nA0:6A:44\t\tVizio, Inc\nA0:6B:4A\t\tTCT mobile ltd\nA0:6C:65\t\tTexas Instruments\nA0:6C:EC\t\tRim\nA0:6D:09\t\tIntelcan Technosystems Inc.\nA0:6E:50\t\tNanotek Elektronik Sistemler Ltd. Sti.\nA0:6F:AA\t\tLG Innotek\nA0:70:99\t\tBeijing Huacan Electronics Co., Ltd\nA0:70:B7\t\tHuawei Technologies Co.,Ltd\nA0:71:A9\t\tNokia Corporation\nA0:72:2C\t\tHUMAX Co., Ltd.\nA0:72:E4\t\tNj System Co.,Ltd\nA0:73:32\t\tCashmaster International Limited\nA0:73:FC\t\tRancore Technologies Private Limited\nA0:75:91\t\tSamsung Electronics Co.,Ltd\nA0:75:EA\t\tBoxLock, Inc.\nA0:76:4E\t\tEspressif Inc.\nA0:77:51\t\tASMedia Technology Inc.\nA0:77:71\t\tVialis BV\nA0:77:9E\t\tChipsea Technologies (Shenzhen) Corp.\nA0:78:17\t\tApple, Inc.\nA0:78:2D\t\tApple, Inc.\nA0:78:BA\t\tPantech Co., Ltd.\nA0:7D:9C\t\tSamsung Electronics Co.,Ltd\nA0:7F:8A\t\tSagemcom Broadband SAS\nA0:80:69\t\tIntel Corporate\nA0:82:1F\t\tSamsung Electronics Co.,Ltd\nA0:82:22\t\tQingdao Haier Technology Co.,Ltd\nA0:82:AC\t\tLinear DMS Solutions Sdn. Bhd.\nA0:82:C7\t\tP.T.I Co.,LTD\nA0:83:B4\t\tVelorum B.V\nA0:84:CB\t\tSonicSensory,Inc.\nA0:85:27\t\tIntel Corporate\nA0:85:E3\t\tEspressif Inc.\nA0:85:FC\t\tMicrosoft Corporation\nA0:86:1D\t\tChengdu Fuhuaxin Technology co.,Ltd\nA0:86:C6\t\tXiaomi Communications Co Ltd\nA0:86:EC\t\tSAEHAN HITEC Co., Ltd\nA0:88:5E\t\tAnhui Xiangyao New Energy Technology Co., Ltd.\nA0:88:69\t\tIntel Corporate\nA0:88:9D\t\tHuawei Device Co., Ltd.\nA0:88:B4\t\tIntel Corporate\nA0:88:C2\t\tMellanox Technologies, Inc.\nA0:89:66\t\tCig Shanghai Co Ltd\nA0:89:E4\t\tSkyworth Digital Technology(Shenzhen) Co.,Ltd\nA0:8A:06\t\tAskey Computer Corp\nA0:8A:87\t\tHuiZhou KaiYue Electronic Co.,Ltd\nA0:8C:15\t\tGerhard D. Wempe KG\nA0:8C:9B\t\tXtreme Technologies Corp\nA0:8C:F2\t\tYinuolink Co.,Ltd\nA0:8C:F8\t\tHuawei Technologies Co.,Ltd\nA0:8C:FD\t\tHewlett Packard\nA0:8D:16\t\tHuawei Technologies Co.,Ltd\nA0:8E:24\t\teero inc.\nA0:8E:78\t\tSagemcom Broadband SAS\nA0:90:DE\t\tVeedims,Llc\nA0:91:69\t\tLG Electronics (Mobile Communications)\nA0:91:A2\t\tOnePlus Electronics (Shenzhen) Co., Ltd.\nA0:91:C8\t\tzte corporation\nA0:91:CA\t\tNokia Solutions and Networks GmbH & Co. KG\nA0:92:08\t\tTuya Smart Inc.\nA0:93:47\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nA0:93:51\t\tCisco Systems, Inc\nA0:94:1A\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nA0:94:6A\t\tShenzhen XGTEC Technology Co,.Ltd.\nA0:95:0C\t\tChina Mobile IOT Company Limited\nA0:95:7F\t\tSernet (Suzhou) Technologies Corporation\nA0:98:05\t\tOpenVox Communication Co Ltd\nA0:98:57\t\tShenzhen ELINK Technology Co., Ltd.\nA0:98:ED\t\tShandong Intelligent Optical Communication Development Co., Ltd.\nA0:99:21\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nA0:99:9B\t\tApple, Inc.\nA0:9A:52\t\tShenzhen MoreSense Technology Co., Ltd.\nA0:9A:5A\t\tTime Domain\nA0:9A:8E\t\tApple, Inc.\nA0:9B:12\t\tChina Mobile IOT Company Limited\nA0:9B:17\t\tTaicang T&W Electronics\nA0:9B:BD\t\tTotal Aviation Solutions Pty Ltd\nA0:9D:22\t\tApple, Inc.\nA0:9D:86\t\tAlcatel-Lucent Shanghai Bell Co., Ltd\nA0:9D:91\t\tSoundBridge\nA0:9D:C1\t\tChina Dragon Technology Limited\nA0:9E:1A\t\tPolar Electro Oy\nA0:9F:10\t\tShenzhen Bilian Electronic Co.，Ltd\nA0:9F:7A\t\tD-Link Middle East FZCO\nA0:A0:01\t\tHewlett Packard Enterprise\nA0:A0:DC\t\tHuawei Device Co., Ltd.\nA0:A1:30\t\tDLI Taiwan Branch office\nA0:A2:3C\t\tGpms\nA0:A3:09\t\tApple, Inc.\nA0:A3:3B\t\tHuawei Technologies Co.,Ltd\nA0:A3:B3\t\tEspressif Inc.\nA0:A3:B8\t\tWiscloud\nA0:A3:E2\t\tActiontec Electronics, Inc\nA0:A3:F0\t\tD-Link International\nA0:A4:7F\t\tCisco Systems, Inc\nA0:A4:C5\t\tIntel Corporate\nA0:A6:5C\t\tSupercomputing Systems AG\nA0:A7:63\t\tPolytron Vertrieb GmbH\nA0:A8:CD\t\tIntel Corporate\nA0:AA:FD\t\tEraThink Technologies Corp.\nA0:AB:1B\t\tD-Link International\nA0:AB:51\t\tWeifang Goertek Electronics Co.,Ltd\nA0:AC:69\t\tSamsung Electronics Co.,Ltd\nA0:AC:78\t\tShenzhen iComm Semiconductor CO.,LTD\nA0:AD:62\t\tHuawei Technologies Co.,Ltd\nA0:AD:9F\t\tASUSTek COMPUTER INC.\nA0:AD:A1\t\tJMR Electronics, Inc\nA0:AF:12\t\tHuawei Technologies Co.,Ltd\nA0:AF:BD\t\tIntel Corporate\nA0:B0:45\t\tHalong Mining\nA0:B0:86\t\tHirschmann Automation and Control GmbH\nA0:B0:BD\t\tSamsung Electronics Co.,Ltd\nA0:B1:00\t\tShenZhen Cando Electronics Co.,Ltd\nA0:B3:39\t\tIntel Corporate\nA0:B3:CC\t\tHewlett Packard\nA0:B4:0F\t\tApple, Inc.\nA0:B4:37\t\tGD Mission Systems\nA0:B4:39\t\tCisco Systems, Inc\nA0:B4:A5\t\tSamsung Electronics Co.,Ltd\nA0:B4:BF\t\tInfiNet LLC\nA0:B5:3C\t\tTechnicolor Delivery Technologies Belgium NV\nA0:B5:49\t\tArcadyan Corporation\nA0:B5:DA\t\tHongKong THTF Co., Ltd\nA0:B6:62\t\tAcutvista Innovation Co., Ltd.\nA0:B7:65\t\tEspressif Inc.\nA0:B8:F8\t\tAmgen U.S.A. Inc.\nA0:B9:ED\t\tSkytap\nA0:BA:B8\t\tPixon Imaging\nA0:BB:3E\t\tIEEE Registration Authority\nA0:BB:3E:00:00:00/28\tLink Labs\nA0:BB:3E:10:00:00/28\tIVision Electronics Co.,Ltd\nA0:BB:3E:20:00:00/28\tDirectOut GmbH\nA0:BB:3E:30:00:00/28\tWiteRiver Technology LLC\nA0:BB:3E:40:00:00/28\tCOMSYS Communications Systems Service GmbH\nA0:BB:3E:50:00:00/28\tManTech International Corporation\nA0:BB:3E:60:00:00/28\tXiamen Kehua Hengsheng Co.,Ltd\nA0:BB:3E:70:00:00/28\tSIMTEC Elektronik GmbH\nA0:BB:3E:80:00:00/28\tAutarcTech GmbH\nA0:BB:3E:90:00:00/28\tSandal Plc\nA0:BB:3E:A0:00:00/28\tFilo SRL\nA0:BB:3E:B0:00:00/28\tBeijing Techshino Technology Co., Ltd.\nA0:BB:3E:C0:00:00/28\tEwig Industries Macao Commercial Offshore Ltd\nA0:BB:3E:D0:00:00/28\tShenzhen Talent Technology company limited\nA0:BB:3E:E0:00:00/28\tMesstechnik Sachs GmbH\nA0:BB:3E:F0:00:00/28\tPrivate\nA0:BC:6F\t\tCisco Systems, Inc\nA0:BD:1D\t\tZhejiang Dahua Technology Co., Ltd.\nA0:BD:71\t\tQUALCOMM Incorporated\nA0:BD:CD\t\tSky Uk Limited\nA0:BF:50\t\tS.C. Add-Production S.R.L.\nA0:BF:A5\t\tCoresys\nA0:C0:16\t\tSichuan Changhong Network Technologies Co., Ltd.\nA0:C1:C5\t\tApple, Inc.\nA0:C2:0D\t\tHuawei Device Co., Ltd.\nA0:C2:DE\t\tCostar Video Systems\nA0:C3:DE\t\tTriton Electronic Systems Ltd.\nA0:C4:A5\t\tSygn House Inc.\nA0:C5:62\t\tCommscope\nA0:C5:89\t\tIntel Corporate\nA0:C5:F2\t\tIEEE Registration Authority\nA0:C5:F2:00:00:00/28\tQuantlab Financial, LLC\nA0:C5:F2:10:00:00/28\tKNS Group LLC (YADRO Company)\nA0:C5:F2:20:00:00/28\tSpeedgoat GmbH\nA0:C5:F2:30:00:00/28\tShenzhen Feima Robotics Technology Co.,Ltd\nA0:C5:F2:40:00:00/28\tAiCare Corp.\nA0:C5:F2:50:00:00/28\tSpacepath Communications Ltd\nA0:C5:F2:60:00:00/28\tShenZhen JuWangShi Tech\nA0:C5:F2:70:00:00/28\tViettronimex JSC\nA0:C5:F2:80:00:00/28\tCoolR Group Inc\nA0:C5:F2:90:00:00/28\tImpulse Networks Pte Ltd\nA0:C5:F2:A0:00:00/28\tSerious Integrated, Inc.\nA0:C5:F2:B0:00:00/28\tOray.com co., LTD.\nA0:C5:F2:C0:00:00/28\tGlooko inc\nA0:C5:F2:D0:00:00/28\tUnaliWear, Inc.\nA0:C5:F2:E0:00:00/28\tSynapsys Solutions Ltd.\nA0:C6:EC\t\tShenZhen ANYK Technology Co.,LTD\nA0:C7:D2\t\tCisco Systems, Inc\nA0:C9:8B\t\tNokia Solutions and Networks GmbH & Co. KG\nA0:C9:A0\t\tMurata Manufacturing Co., Ltd.\nA0:CA:A5\t\tIntelligence Technology Of Cec Co., Ltd\nA0:CB:FD\t\tSamsung Electronics Co.,Ltd\nA0:CC:2B\t\tMurata Manufacturing Co., Ltd.\nA0:CD:F3\t\tMurata Manufacturing Co., Ltd.\nA0:CE:C8\t\tCe Link Limited\nA0:CF:5B\t\tCisco Systems, Inc\nA0:CF:F5\t\tzte corporation\nA0:D0:5B\t\tSamsung Electronics Co.,Ltd\nA0:D0:DC\t\tAmazon Technologies Inc.\nA0:D1:2A\t\tAXPRO Technology Inc.\nA0:D1:B3\t\tApple, Inc.\nA0:D2:B1\t\tAmazon Technologies Inc.\nA0:D3:65\t\tIntel Corporate\nA0:D3:7A\t\tIntel Corporate\nA0:D3:85\t\tAUMA Riester GmbH & Co. KG\nA0:D3:C1\t\tHewlett Packard\nA0:D4:2D\t\tG.Tech Technology Ltd.\nA0:D6:35\t\tWBS Technology\nA0:D7:22\t\tSamsung Electronics Co.,Ltd\nA0:D7:95\t\tApple, Inc.\nA0:D7:A0\t\tHuawei Device Co., Ltd.\nA0:D7:F3\t\tSamsung Electronics Co.,Ltd\nA0:D8:07\t\tHuawei Device Co., Ltd.\nA0:D8:3D\t\tFiberhome Telecommunication Technologies Co.,LTD\nA0:D8:6F\t\tArgo Ai, Llc\nA0:D9:1A\t\tTexas Instruments\nA0:DA:92\t\tNanjing Glarun Atten Technology Co. Ltd.\nA0:DC:04\t\tBecker-Antriebe GmbH\nA0:DD:6C\t\tEspressif Inc.\nA0:DD:97\t\tPolarLink Technologies, Ltd\nA0:DD:E5\t\tSHARP Corporation\nA0:DE:05\t\tJSC \"Irbis-T\"\nA0:DE:0F\t\tHuawei Device Co., Ltd.\nA0:DF:15\t\tHuawei Technologies Co.,Ltd\nA0:E0:25\t\tProvision-ISR\nA0:E0:6D\t\tFiberhome Telecommunication Technologies Co.,LTD\nA0:E0:AF\t\tCisco Systems, Inc\nA0:E2:01\t\tAVTrace Ltd.(China)\nA0:E2:5A\t\tAmicus SK, s.r.o.\nA0:E2:95\t\tDAT System Co.,Ltd\nA0:E4:53\t\tSony Corporation\nA0:E4:CB\t\tZyxel Communications Corporation\nA0:E5:34\t\tStratec Biomedical AG\nA0:E5:E9\t\tenimai Inc\nA0:E6:17\t\tMatis\nA0:E6:F8\t\tTexas Instruments\nA0:E7:0B\t\tIntel Corporate\nA0:E7:AE\t\tCommscope\nA0:E9:DB\t\tNingbo FreeWings Technologies Co.,Ltd\nA0:EB:76\t\tAirCUVE Inc.\nA0:EC:80\t\tzte corporation\nA0:EC:F9\t\tCisco Systems, Inc\nA0:ED:6D\t\tUbee Interactive Co., Limited\nA0:ED:CD\t\tApple, Inc.\nA0:ED:FB\t\tQuectel Wireless Solutions Co.,Ltd.\nA0:EE:1A\t\tApple, Inc.\nA0:EE:EE\t\tCig Shanghai Co Ltd\nA0:EF:84\t\tSeine Image Int'l Co., Ltd\nA0:F2:17\t\tGE Medical System(China) Co., Ltd.\nA0:F3:C1\t\tTp-Link Technologies Co.,Ltd.\nA0:F3:E4\t\tAlcatel-Lucent IPD\nA0:F4:19\t\tNokia Corporation\nA0:F4:50\t\tHTC Corporation\nA0:F4:59\t\tFn-Link Technology Limited\nA0:F4:79\t\tHuawei Technologies Co.,Ltd\nA0:F5:09\t\tIEI Integration Corp.\nA0:F6:FD\t\tTexas Instruments\nA0:F8:49\t\tCisco Systems, Inc\nA0:F8:95\t\tShenzhen TINNO Mobile Technology Corp.\nA0:F9:B7\t\tAdemco Smart Homes Technology(Tianjin)Co.,Ltd.\nA0:F9:E0\t\tVivatel Company Limited\nA0:FA:9C\t\tWeifang Goertek Electronics Co.,Ltd\nA0:FA:C8\t\tHuawei Technologies Co.,Ltd\nA0:FB:68\t\tMiba Battery Systems GmbH\nA0:FB:83\t\tHonor Device Co., Ltd.\nA0:FB:C5\t\tApple, Inc.\nA0:FC:6E\t\tTelegrafia a.s.\nA0:FE:61\t\tVivint Wireless Inc.\nA0:FE:91\t\tAVAT Automation GmbH\nA0:FF:0C\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nA0:FF:22\t\tShenzhen Apical Technology Co., Ltd\nA0:FF:70\t\tVantiva USA LLC\nA4:00:4E\t\tCisco Systems, Inc\nA4:00:E2\t\tHuawei Technologies Co.,Ltd\nA4:01:30\t\tABIsystems Co., LTD\nA4:01:DE\t\tSercomm Philippines Inc\nA4:02:B7\t\tAmazon Technologies Inc.\nA4:02:B9\t\tIntel Corporate\nA4:04:50\t\tnFore Technology Inc.\nA4:05:6E\t\tTiinlab Corporation\nA4:05:9E\t\tSTA Infinity LLP\nA4:05:D6\t\tCommscope\nA4:06:E9\t\tTexas Instruments\nA4:07:B6\t\tSamsung Electronics Co.,Ltd\nA4:08:01\t\tAmazon Technologies Inc.\nA4:08:EA\t\tMurata Manufacturing Co., Ltd.\nA4:08:F5\t\tSagemcom Broadband SAS\nA4:09:87\t\tApple, Inc.\nA4:09:B3\t\tHuawei Technologies Co.,Ltd\nA4:09:CB\t\tAlfred Kaercher GmbH & Co KG\nA4:0B:78\t\tFast Photonics Hk Co., Limited\nA4:0B:ED\t\tCarry Technology Co.,Ltd\nA4:0C:66\t\tShenzhen Colorful Yugong Technology and Development Co., Ltd.\nA4:0C:C3\t\tCisco Systems, Inc\nA4:0D:BC\t\tXiamen Intretech Inc.\nA4:0E:2B\t\tFacebook Inc\nA4:0E:75\t\tHewlett Packard Enterprise\nA4:0F:98\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nA4:10:B6\t\tCisco Systems, Inc\nA4:11:15\t\tRobert Bosch Engineering and Business Solutions pvt. Ltd.\nA4:11:62\t\tArlo Technology\nA4:11:63\t\tIEEE Registration Authority\nA4:11:63:00:00:00/28\tAdetel Equipment\nA4:11:63:10:00:00/28\tINTER CONTROL Hermann Köhler Elektrik GmbH & Co.KG\nA4:11:63:20:00:00/28\tAllgo Tech. (Beijing) Co.,Ltd\nA4:11:63:30:00:00/28\tPax\nA4:11:63:40:00:00/28\tAlterG, Inc.\nA4:11:63:50:00:00/28\tCarbon, Inc.\nA4:11:63:60:00:00/28\tBeijing XiaoRui Technology Co., Ltd\nA4:11:63:70:00:00/28\tShenzhen Yiwanjia Information Technology Co.,Ltd\nA4:11:63:80:00:00/28\tDspread Technology (Beijing) Inc.\nA4:11:63:90:00:00/28\taccesso Technology Group\nA4:11:63:A0:00:00/28\tISE GmbH\nA4:11:63:B0:00:00/28\tMoog Music Inc.\nA4:11:63:C0:00:00/28\tViloc\nA4:11:63:D0:00:00/28\tShenzhen Zhishi Technology Co., Ltd.\nA4:11:63:E0:00:00/28\ttinylogics\nA4:11:94\t\tLenovo\nA4:11:BB\t\tCisco Systems, Inc\nA4:12:32\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nA4:12:42\t\tNEC Platforms, Ltd.\nA4:13:4E\t\tLuxul\nA4:14:37\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nA4:15:66\t\tWeifang Goertek Electronics Co.,Ltd\nA4:15:88\t\tCommscope\nA4:16:C0\t\tApple, Inc.\nA4:16:E7\t\tHuawei Technologies Co.,Ltd\nA4:17:31\t\tHon Hai Precision Ind. Co.,Ltd.\nA4:17:52\t\tHifocus Electronics India Private Limited\nA4:17:8B\t\tHuawei Technologies Co.,Ltd\nA4:17:91\t\tShenzhen Decnta Technology Co.,LTD.\nA4:18:75\t\tCisco Systems, Inc\nA4:18:94\t\tBosch Security Systems B.V.\nA4:19:08\t\tFiberhome Telecommunication Technologies Co.,LTD\nA4:1A:3A\t\tTp-Link Technologies Co.,Ltd.\nA4:1A:6E\t\tzte corporation\nA4:1B:34\t\tChina Mobile Group Device Co.,Ltd.\nA4:1B:C0\t\tFastec Imaging Corporation\nA4:1C:B4\t\tDFI Inc\nA4:1E:E1\t\tTaicang T&W Electronics\nA4:1F:72\t\tDell Inc.\nA4:21:8A\t\tNortel Networks\nA4:22:49\t\tSagemcom Broadband SAS\nA4:23:05\t\tOpen Networking Laboratory\nA4:24:B3\t\tFlatFrog Laboratories AB\nA4:24:DD\t\tCambrionix Ltd\nA4:25:1B\t\tAvaya Inc\nA4:26:18\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\nA4:26:55\t\tLTI Motion (Shanghai) Co., Ltd.\nA4:27:A5\t\tPalo Alto Networks\nA4:28:B7\t\tYangtze Memory Technologies Co., Ltd.\nA4:29:02\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nA4:29:40\t\tShenzhen YOUHUA Technology Co., Ltd\nA4:29:83\t\tBoeing Defence Australia\nA4:29:85\t\tSichuan AI-Link Technology Co., Ltd.\nA4:29:B7\t\tbluesky\nA4:2A:71\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nA4:2A:95\t\tD-Link International\nA4:2B:8C\t\tNetgear\nA4:2B:B0\t\tTp-Link Technologies Co.,Ltd.\nA4:2C:08\t\tMasterwork Automodules\nA4:30:7A\t\tSamsung Electronics Co.,Ltd\nA4:31:11\t\tZiv\nA4:31:35\t\tApple, Inc.\nA4:33:D1\t\tFibrlink Communications Co.,Ltd.\nA4:33:D7\t\tMitraStar Technology Corp.\nA4:34:12\t\tThales Alenia Space\nA4:34:D9\t\tIntel Corporate\nA4:34:F1\t\tTexas Instruments\nA4:35:23\t\tGuangdong Donyan Network Technologies Co.,Ltd.\nA4:35:2D\t\tTRIZ Networks corp.\nA4:36:C7\t\tLG Innotek\nA4:37:3E\t\tHuawei Device Co., Ltd.\nA4:38:31\t\tRF elements s.r.o.\nA4:38:CC\t\tNintendo Co.,Ltd\nA4:38:FC\t\tPlastic Logic\nA4:39:B3\t\tBeijing Xiaomi Mobile Software Co., Ltd\nA4:39:B6\t\tShenzhen Peizhe Microelectronics Co .Ltd\nA4:3A:69\t\tVers Inc\nA4:3B:0E\t\tHuawei Device Co., Ltd.\nA4:3B:FA\t\tIEEE Registration Authority\nA4:3B:FA:00:00:00/28\tChengdu Territory Technology Co.,Ltd\nA4:3B:FA:10:00:00/28\tBeijing Uniwill Science and Technology Co,Ltd\nA4:3B:FA:20:00:00/28\tPowell Industries\nA4:3B:FA:30:00:00/28\tCircus World Displays Ltd\nA4:3B:FA:40:00:00/28\tMaxon Australia\nA4:3B:FA:50:00:00/28\tBOI Solutions\nA4:3B:FA:60:00:00/28\tRecognition Systems LLC\nA4:3B:FA:70:00:00/28\tDeatronic srl\nA4:3B:FA:80:00:00/28\tAlpwise\nA4:3B:FA:90:00:00/28\tShen Zhen Pasun Tech Co.Ltd.\nA4:3B:FA:A0:00:00/28\tPlus One Japan Ltd.\nA4:3B:FA:B0:00:00/28\tALSTOM Strongwish (Shenzhen) Co., Ltd\nA4:3B:FA:C0:00:00/28\tShanghai Xietong Technology Inc.\nA4:3B:FA:D0:00:00/28\tJSC “Component-ASU”\nA4:3B:FA:E0:00:00/28\tThe Magstim Company Ltd.\nA4:3B:FA:F0:00:00/28\tPrivate\nA4:3C:D7\t\tNTX Electronics YangZhou co.,LTD\nA4:3D:78\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nA4:3E:51\t\tAnov France\nA4:3E:A0\t\tiComm HK LIMITED\nA4:3F:51\t\tShenzhen Benew Technology  Co.,Ltd.\nA4:3F:68\t\tArista Network, Inc.\nA4:40:27\t\tzte corporation\nA4:40:3D\t\tShenzhen Baseus Technology Co., Ltd.\nA4:42:3B\t\tIntel Corporate\nA4:43:43\t\tHuawei Device Co., Ltd.\nA4:43:80\t\tHuawei Device Co., Ltd.\nA4:43:8C\t\tCommscope\nA4:44:D1\t\tWingtech Group (HongKong）Limited\nA4:45:19\t\tXiaomi Communications Co Ltd\nA4:45:CD\t\tIoT Diagnostics\nA4:46:6B\t\tEOC Technology\nA4:46:B4\t\tHuawei Device Co., Ltd.\nA4:46:FA\t\tAmTRAN Video Corporation\nA4:4A:D3\t\tST Electronics(Shanghai) Co.,Ltd\nA4:4B:15\t\tSun Cupid Technology (HK) LTD\nA4:4B:D5\t\tXiaomi Communications Co Ltd\nA4:4B:D9\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nA4:4C:11\t\tCisco Systems, Inc\nA4:4C:62\t\tHangzhou Microimage Software Co., Ltd\nA4:4C:C8\t\tDell Inc.\nA4:4E:2D\t\tAdaptive Wireless Solutions, LLC\nA4:4E:31\t\tIntel Corporate\nA4:4F:29\t\tIEEE Registration Authority\nA4:4F:29:00:00:00/28\tDermalog Identification Systems GmbH\nA4:4F:29:10:00:00/28\tOlssen B.V.\nA4:4F:29:20:00:00/28\tLuceor\nA4:4F:29:30:00:00/28\tComsel System Ltd\nA4:4F:29:40:00:00/28\tDGC Access AB\nA4:4F:29:50:00:00/28\tShanghai KuanYu Industrial Network Equipment Co.,Ltd\nA4:4F:29:60:00:00/28\tSelektro Power Inc\nA4:4F:29:70:00:00/28\tProtean Payment\nA4:4F:29:80:00:00/28\tInnovations in Optics, Inc.\nA4:4F:29:90:00:00/28\tCerti Networks Sdn Bhd\nA4:4F:29:A0:00:00/28\tHtd\nA4:4F:29:B0:00:00/28\tGuangdong Real-Design Intelligent Technology Co.,Ltd\nA4:4F:29:C0:00:00/28\tShenzhen Huadoo Bright Group Limitied\nA4:4F:29:D0:00:00/28\tHalliburton\nA4:4F:29:E0:00:00/28\tNeotech Systems Pvt. Ltd.\nA4:4F:29:F0:00:00/28\tPrivate\nA4:50:06\t\tShenzhen Huachuang Shidai Technologyco.,Ltd\nA4:50:46\t\tXiaomi Communications Co Ltd\nA4:50:55\t\tBusware.De\nA4:51:29\t\tXag\nA4:51:5E\t\tJuniper Networks\nA4:51:6F\t\tMicrosoft Mobile Oy\nA4:52:6F\t\tADB Broadband Italia\nA4:53:0E\t\tCisco Systems, Inc\nA4:53:85\t\tWeifang Goertek Electronics Co.,Ltd\nA4:53:EE\t\tIEEE Registration Authority\nA4:53:EE:00:00:00/28\tMahle Electronics, Slu\nA4:53:EE:10:00:00/28\tStellamore\nA4:53:EE:20:00:00/28\tUbisafe Smart Devices\nA4:53:EE:30:00:00/28\tLarva.io OÜ\nA4:53:EE:40:00:00/28\tWilliamson Corporation\nA4:53:EE:50:00:00/28\tFoshan Yisihang Electrical Technology Co., Ltd.\nA4:53:EE:60:00:00/28\tShenzhen Xunqi Interconnet Technology Co., Ltd\nA4:53:EE:70:00:00/28\tBeijing Lanke Science and Technology Co.,LTd.\nA4:53:EE:80:00:00/28\tT-Touching Co., Ltd.\nA4:53:EE:90:00:00/28\tDongguan HuaFuu industrial co., LTD\nA4:53:EE:A0:00:00/28\tshanggong technology Ltd\nA4:53:EE:B0:00:00/28\tViper Design, LLC\nA4:53:EE:C0:00:00/28\tSOS LAB Co., Ltd.\nA4:53:EE:D0:00:00/28\tSsk Corporation\nA4:53:EE:E0:00:00/28\tMegacount\nA4:55:90\t\tXiaomi Communications Co Ltd\nA4:56:02\t\tfenglian Technology Co.,Ltd.\nA4:56:1B\t\tMCOT Corporation\nA4:56:30\t\tCisco Systems, Inc\nA4:56:CC\t\tVantiva USA LLC\nA4:57:A0\t\tSAMJIN Co., Ltd.\nA4:58:02\t\tShin-Il Tech\nA4:58:0F\t\tIEEE Registration Authority\nA4:58:0F:00:00:00/28\tInnopro\nA4:58:0F:10:00:00/28\tStone Lock Global, Inc.\nA4:58:0F:20:00:00/28\tBLOKS. GmbH\nA4:58:0F:30:00:00/28\tEngineered SA\nA4:58:0F:40:00:00/28\tShenzhen City billion Leiden science and Technology Co., Ltd.\nA4:58:0F:50:00:00/28\tCoAsia Microelectronics Corp.\nA4:58:0F:60:00:00/28\tAstro, Inc\nA4:58:0F:70:00:00/28\tChangsha Tai Hui Network Technology Co.,Ltd\nA4:58:0F:80:00:00/28\tAir Liquide Medical Systems\nA4:58:0F:90:00:00/28\tKsenia Security srl\nA4:58:0F:A0:00:00/28\tGuangzhou Optical Bridge Communication Equipment Co.,Ltd.\nA4:58:0F:B0:00:00/28\tAbb Ab Pghv\nA4:58:0F:C0:00:00/28\tHomebeaver\nA4:58:0F:D0:00:00/28\tEye Io, Llc\nA4:58:0F:E0:00:00/28\tFinetree Communications Inc\nA4:59:D3\t\tIEEE Registration Authority\nA4:59:D3:00:00:00/28\tVTECH Technology Corportion\nA4:59:D3:10:00:00/28\tRheinmetall Electronics UK Ltd\nA4:59:D3:20:00:00/28\tShenzhen Welltech Cable Co., Ltd\nA4:59:D3:30:00:00/28\tSoftEnergy Controls  Inc.\nA4:59:D3:40:00:00/28\tGre System Inc.\nA4:59:D3:50:00:00/28\tBettear - Accessibility Technologies Development Ltd\nA4:59:D3:60:00:00/28\tFrontAct Co., Ltd.\nA4:59:D3:70:00:00/28\tDong Guan Fu Qiang Electronic Co.,Ltd\nA4:59:D3:80:00:00/28\tGot Co.,Ltd\nA4:59:D3:90:00:00/28\tVivi International Pty Ltd\nA4:59:D3:A0:00:00/28\tOREX SAI Inc.\nA4:59:D3:B0:00:00/28\tHANSHIN YUSOKI Co,Ltd\nA4:59:D3:C0:00:00/28\tSafebase AS\nA4:59:D3:D0:00:00/28\tSeavan Technology Limited\nA4:59:D3:E0:00:00/28\tNgen d.o.o.\nA4:5A:1C\t\tsmart-electronic GmbH\nA4:5C:25\t\tTexas Instruments\nA4:5C:27\t\tNintendo Co., Ltd.\nA4:5D:36\t\tHewlett Packard\nA4:5D:5E\t\tWilk Elektronik S.A.\nA4:5D:A1\t\tADB Broadband Italia\nA4:5E:5A\t\tACTIVIO Inc.\nA4:5E:60\t\tApple, Inc.\nA4:5F:9B\t\tNexell\nA4:5F:B9\t\tDreamBig Semiconductor, Inc.\nA4:60:11\t\tVerifone, Inc.\nA4:60:32\t\tMRV Communications (Networks) LTD\nA4:61:91\t\tNamJunSa\nA4:62:DF\t\tDS Global. Co., LTD\nA4:63:A1\t\tInventus Power Eletronica do Brasil LTDA\nA4:67:06\t\tApple, Inc.\nA4:68:BC\t\tOakley Inc.\nA4:6B:1F\t\teero inc.\nA4:6B:B6\t\tIntel Corporate\nA4:6C:24\t\tHuawei Technologies Co.,Ltd\nA4:6C:2A\t\tCisco Systems, Inc\nA4:6C:C1\t\tLTi REEnergy GmbH\nA4:6C:F1\t\tSamsung Electronics Co.,Ltd\nA4:6D:33\t\tPhyplus Technology (Shanghai) Co., Ltd\nA4:6D:A4\t\tHuawei Technologies Co.,Ltd\nA4:6D:D4\t\tSilicon Laboratories\nA4:6E:79\t\tDFT System Co.Ltd\nA4:6E:A7\t\tDx Antenna Co.,Ltd.\nA4:70:D6\t\tMotorola Mobility LLC, a Lenovo Company\nA4:71:74\t\tHuawei Technologies Co.,Ltd\nA4:73:AB\t\tExtreme Networks Headquarters\nA4:75:B9\t\tSamsung Electronics Co.,Ltd\nA4:77:33\t\tGoogle, Inc.\nA4:77:58\t\tNingbo Freewings Technologies Co.,Ltd\nA4:77:60\t\tNokia Corporation\nA4:77:F3\t\tApple, Inc.\nA4:78:06\t\tCisco Systems, Inc\nA4:78:86\t\tAvaya Inc\nA4:79:52\t\tHuawei Device Co., Ltd.\nA4:79:E4\t\tKLINFO Corp\nA4:7A:72\t\tArista Networks\nA4:7A:A4\t\tCommscope\nA4:7A:CF\t\tVibicom Communications Inc.\nA4:7B:1A\t\tHuawei Device Co., Ltd.\nA4:7B:2C\t\tNokia\nA4:7B:52\t\tJoulWatt Technology Co., Ltd\nA4:7B:85\t\tULTIMEDIA Co Ltd,\nA4:7B:9D\t\tEspressif Inc.\nA4:7C:14\t\tChargeStorm AB\nA4:7C:1F\t\tCobham plc\nA4:7C:C9\t\tHuawei Technologies Co.,Ltd\nA4:7D:78\t\tEdgecore Americas Networking Corporation\nA4:7D:9F\t\tShenzhen iComm Semiconductor CO.,LTD\nA4:7E:36\t\tEM Microelectronic\nA4:7E:39\t\tzte corporation\nA4:7E:FA\t\tWithings\nA4:7F:1B\t\tJuniper Networks\nA4:81:7A\t\tCig Shanghai Co Ltd\nA4:81:EE\t\tNokia Corporation\nA4:82:69\t\tDatrium, Inc.\nA4:83:E7\t\tApple, Inc.\nA4:84:31\t\tSamsung Electronics Co.,Ltd\nA4:85:6B\t\tQ Electronics Ltd\nA4:86:AE\t\tQuectel Wireless Solutions Co.,Ltd.\nA4:86:DB\t\tGuangdong Juan Intelligent Technology Joint Stock Co., Ltd.\nA4:88:73\t\tCisco Systems, Inc\nA4:89:5B\t\tArk Infosolutions Pvt Ltd\nA4:89:7E\t\tGuangzhou Yuhong Technology Co.,Ltd.\nA4:8C:C0\t\tJLG Industries, Inc.\nA4:8C:DB\t\tLenovo\nA4:8D:3B\t\tVizio, Inc\nA4:8E:0A\t\tDeLaval International AB\nA4:90:05\t\tChina Greatwall Computer Shenzhen Co.,Ltd\nA4:90:CE\t\tvivo Mobile Communication Co., Ltd.\nA4:91:B1\t\tTechnicolor Delivery Technologies Belgium NV\nA4:92:CB\t\tNokia\nA4:93:3F\t\tHuawei Technologies Co.,Ltd\nA4:93:40\t\tBeijing Supvan Information Technology Co.,Ltd.\nA4:93:4C\t\tCisco Systems, Inc\nA4:94:26\t\tElgama-Elektronika Ltd.\nA4:94:DC\t\tInfinite Clouds\nA4:97:00\t\tCisco Systems, Inc\nA4:97:33\t\tAskey Computer Corp\nA4:97:5C\t\tVTech Telecommunications Ltd.\nA4:97:8A\t\tLear\nA4:97:91\t\tExtreme Networks Headquarters\nA4:97:B1\t\tChongqing Fugui Electronics Co.,Ltd.\nA4:97:BB\t\tHitachi Industrial Equipment Systems Co.,Ltd\nA4:98:13\t\tCommscope\nA4:99:47\t\tHuawei Technologies Co.,Ltd\nA4:99:81\t\tFuJian Elite Power Tech CO.,LTD.\nA4:99:A8\t\teero inc.\nA4:9A:58\t\tSamsung Electronics Co.,Ltd\nA4:9B:13\t\tDigital Check\nA4:9B:4F\t\tHuawei Technologies Co.,Ltd\nA4:9B:CD\t\tCisco Systems, Inc\nA4:9B:F5\t\tHybridserver Tec GmbH\nA4:9D:49\t\tKetra, Inc.\nA4:9D:DD\t\tSamsung Electronics Co.,Ltd\nA4:9E:69\t\tSilicon Laboratories\nA4:9E:DB\t\tAutoCrib, Inc.\nA4:9F:85\t\tLyve Minds, Inc\nA4:9F:89\t\tShanghai Rui Rui Communication Technology Co.Ltd.\nA4:9F:E7\t\tSamsung Electronics Co.,Ltd\nA4:A1:79\t\tNanjing dianyan electric power automation co. LTD\nA4:A1:C2\t\tEricsson AB\nA4:A1:E4\t\tInnotube, Inc.\nA4:A2:4A\t\tCisco SPVTG\nA4:A4:04\t\tBubendorff SAS\nA4:A4:59\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nA4:A4:6B\t\tHuawei Technologies Co.,Ltd\nA4:A4:90\t\tSamsung Electronics Co.,Ltd\nA4:A4:D3\t\tBluebank Communication Technology Co.Ltd\nA4:A5:28\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nA4:A5:84\t\tCisco Systems, Inc\nA4:A6:A9\t\tPrivate\nA4:A8:0F\t\tShenzhen Coship Electronics Co., Ltd.\nA4:A9:30\t\tBeijing Xiaomi Mobile Software Co., Ltd\nA4:AA:FE\t\tHuawei Device Co., Ltd.\nA4:AC:0F\t\tHuawei Device Co., Ltd.\nA4:AD:00\t\tRagsdale Technology\nA4:AD:9E\t\tNexaiot\nA4:AD:B8\t\tVitec Group, Camera Dynamics Ltd\nA4:AE:11\t\tHon Hai Precision Industry Co., Ltd.\nA4:AE:12\t\tHon Hai Precision Industry Co., Ltd.\nA4:AE:9A\t\tMaestro Wireless Solutions ltd.\nA4:B0:39\t\tShenzhen iComm Semiconductor CO.,LTD\nA4:B0:F5\t\tTexas Instruments\nA4:B1:21\t\tArantia 2010 S.L.\nA4:B1:97\t\tApple, Inc.\nA4:B1:C1\t\tIntel Corporate\nA4:B1:E9\t\tTechnicolor Delivery Technologies Belgium NV\nA4:B1:EE\t\tH. ZANDER GmbH & Co. KG\nA4:B2:39\t\tCisco Systems, Inc\nA4:B2:A7\t\tAdaxys Solutions AG\nA4:B3:6A\t\tJSC SDO Chromatec\nA4:B4:39\t\tCisco Systems, Inc\nA4:B5:2E\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\nA4:B6:1E\t\tHuawei Device Co., Ltd.\nA4:B8:05\t\tApple, Inc.\nA4:B8:18\t\tPENTA Gesellschaft für elektronische Industriedatenverarbeitung mbH\nA4:B9:80\t\tParking BOXX Inc.\nA4:BA:70\t\tBeijing Xiaomi Mobile Software Co., Ltd\nA4:BA:76\t\tHuawei Technologies Co.,Ltd\nA4:BA:DB\t\tDell Inc.\nA4:BB:6D\t\tDell Inc.\nA4:BB:AF\t\tLime Instruments\nA4:BD:7E\t\tHMD Global Oy\nA4:BD:C4\t\tHuawei Technologies Co.,Ltd\nA4:BE:2B\t\tHuawei Technologies Co.,Ltd\nA4:BE:61\t\tEutroVision System, Inc.\nA4:BF:01\t\tIntel Corporate\nA4:C0:C7\t\tShenZhen Hitom Communication Technology Co..LTD\nA4:C0:E1\t\tNintendo Co., Ltd.\nA4:C1:38\t\tTelink Semiconductor (Taipei) Co. Ltd.\nA4:C1:E8\t\tNintendo Co.,Ltd\nA4:C2:3E\t\tHuizhou Speed Wireless Technology Co.,Ltd\nA4:C2:AB\t\tHangzhou LEAD-IT Information & Technology Co.,Ltd\nA4:C3:37\t\tApple, Inc.\nA4:C3:4E\t\tTexas Instruments\nA4:C3:61\t\tApple, Inc.\nA4:C3:BE\t\tXiaomi Communications Co Ltd\nA4:C3:F0\t\tIntel Corporate\nA4:C4:0D\t\tWAC Lighting\nA4:C4:94\t\tIntel Corporate\nA4:C5:4E\t\tHuawei Device Co., Ltd.\nA4:C6:4F\t\tHuawei Technologies Co.,Ltd\nA4:C6:9A\t\tSamsung Electronics Co.,Ltd\nA4:C6:F0\t\tApple, Inc.\nA4:C7:4B\t\tHuawei Device Co., Ltd.\nA4:C7:88\t\tXiaomi Communications Co Ltd\nA4:C7:DE\t\tCambridge Industries(Group) Co.,Ltd.\nA4:C7:F6\t\tExtreme Networks Headquarters\nA4:C9:39\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nA4:CA:A0\t\tHuawei Technologies Co.,Ltd\nA4:CC:32\t\tInficomm Co., Ltd\nA4:CC:B3\t\tXiaomi Communications Co Ltd\nA4:CC:B9\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nA4:CD:23\t\tShenzhenshi Xinzhongxin  Co., Ltd\nA4:CE:DA\t\tArcadyan Corporation\nA4:CF:12\t\tEspressif Inc.\nA4:CF:99\t\tApple, Inc.\nA4:CF:D2\t\tUbee Interactive Co., Limited\nA4:D0:94\t\tVivavis Ag\nA4:D1:8C\t\tApple, Inc.\nA4:D1:8F\t\tShenzhen Skyee Optical Fiber Communication Technology Ltd.\nA4:D1:D1\t\tECOtality North America\nA4:D1:D2\t\tApple, Inc.\nA4:D2:3E\t\tApple, Inc.\nA4:D3:B5\t\tGLITEL Stropkov, s.r.o.\nA4:D4:B2\t\tShenzhen MeiG Smart Technology Co.,Ltd\nA4:D5:01\t\tYucca Technology Company Limited.\nA4:D5:30\t\tAvaya LLC\nA4:D5:78\t\tTexas Instruments\nA4:D5:C2\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nA4:D7:3C\t\tSeiko Epson Corporation\nA4:D7:95\t\tWingtech Mobile Communications Co.,Ltd\nA4:D8:56\t\tGimbal, Inc\nA4:D8:CA\t\tHong Kong Water World Technology Co. Limited\nA4:D9:31\t\tApple, Inc.\nA4:D9:90\t\tSamsung Electronics Co.,Ltd\nA4:D9:A4\t\tneXus ID Solutions AB\nA4:DA:22\t\tIEEE Registration Authority\nA4:DA:22:00:00:00/28\tGeneral Electric Company\nA4:DA:22:10:00:00/28\tT2T System\nA4:DA:22:20:00:00/28\tWyze Labs Inc\nA4:DA:22:30:00:00/28\tDURATECH Enterprise,LLC\nA4:DA:22:40:00:00/28\tLoriot Ag\nA4:DA:22:50:00:00/28\tOriginal Products Pvt. Ltd.\nA4:DA:22:60:00:00/28\tAuranext\nA4:DA:22:70:00:00/28\tHydro Electronic Devices, Inc.\nA4:DA:22:80:00:00/28\tSolidPro Technology Corporation\nA4:DA:22:90:00:00/28\tMalldon Technology Limited\nA4:DA:22:A0:00:00/28\tGrundig\nA4:DA:22:B0:00:00/28\tKlashwerks Inc.\nA4:DA:22:C0:00:00/28\tEho.Link\nA4:DA:22:D0:00:00/28\tShen Zhen City YaKun Electronics Co., Ltd\nA4:DA:22:E0:00:00/28\tQuuppa Oy\nA4:DA:32\t\tTexas Instruments\nA4:DA:3F\t\tBionics Corp.\nA4:DA:D4\t\tYamato Denki Co.,Ltd.\nA4:DB:2E\t\tKingspan Environmental Ltd\nA4:DB:30\t\tLiteon Technology Corporation\nA4:DB:4C\t\tRAI Institute\nA4:DC:BE\t\tHuawei Technologies Co.,Ltd\nA4:DD:58\t\tHuawei Technologies Co.,Ltd\nA4:DE:26\t\tSumitomo Electric Industries, Ltd\nA4:DE:50\t\tTotal Walther GmbH\nA4:DE:C9\t\tQLove Mobile Intelligence Information Technology (W.H.) Co. Ltd.\nA4:E0:E6\t\tFilizola S.A. Pesagem E Automacao\nA4:E1:1A\t\tJuniper Networks\nA4:E2:87\t\tXiaomi Communications Co Ltd\nA4:E3:1B\t\tNokia\nA4:E3:2E\t\tSilicon & Software Systems Ltd.\nA4:E3:91\t\tDeny Fontaine\nA4:E4:B8\t\tBlackBerry RTS\nA4:E5:7C\t\tEspressif Inc.\nA4:E5:97\t\tGessler GmbH\nA4:E6:15\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\nA4:E6:B1\t\tShanghai Joindata Technology Co.,Ltd.\nA4:E7:31\t\tNokia Corporation\nA4:E7:E4\t\tConnex GmbH\nA4:E8:8D\t\tFN-LINK TECHNOLOGY Ltd.\nA4:E8:A3\t\tFujian Newland Auto-ID Tech Co.,Ltd.\nA4:E9:75\t\tApple, Inc.\nA4:E9:91\t\tSistemas Audiovisuales Itelsis S.L.\nA4:E9:A3\t\tHonest Technology Co., Ltd\nA4:EA:4F\t\tVusionGroup\nA4:EA:8E\t\tExtreme Networks Headquarters\nA4:EB:D3\t\tSamsung Electronics Co.,Ltd\nA4:ED:43\t\tIEEE Registration Authority\nA4:ED:43:00:00:00/28\tSweam AB\nA4:ED:43:10:00:00/28\tIngelabs S.L.\nA4:ED:43:20:00:00/28\tShanghai Mission Information Technologies (Group) Co.,Ltd\nA4:ED:43:30:00:00/28\tDongguan Mingji Electronics technology Group Co., Ltd.\nA4:ED:43:40:00:00/28\tNetas Telekomunikasyon A.S.\nA4:ED:43:50:00:00/28\tBeijing ICPC CO.,Ltd.\nA4:ED:43:60:00:00/28\tShanghai  Facom  Electronics Technology  Co, ltd.\nA4:ED:43:70:00:00/28\tWuxi Junction Infomation Technology Incorporated Company\nA4:ED:43:80:00:00/28\tLinseis Messgeraete GmbH\nA4:ED:43:90:00:00/28\tHeyuan intelligence technology CO.,Ltd\nA4:ED:43:A0:00:00/28\tGuangzhou Maxfaith Communication Technology Co.,LTD.\nA4:ED:43:B0:00:00/28\tParagon Business Solutions Ltd.\nA4:ED:43:C0:00:00/28\tleakSMART\nA4:ED:43:D0:00:00/28\tBrand New Brand Nordic AB\nA4:ED:43:E0:00:00/28\tToec Technology Co.，Ltd.\nA4:ED:4E\t\tCommscope\nA4:EE:57\t\tSeiko Epson Corporation\nA4:EF:15\t\tAltoBeam (China) Inc.\nA4:EF:52\t\tTelewave Co., Ltd.\nA4:F0:5E\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nA4:F1:E8\t\tApple, Inc.\nA4:F3:3B\t\tzte corporation\nA4:F3:C1\t\tOpen Source Robotics Foundation, Inc.\nA4:F3:E7\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\nA4:F4:65\t\tItel Mobile Limited\nA4:F4:C2\t\tVnpt Technology\nA4:F5:22\t\tChofu Seisakusho Co.,Ltd\nA4:F6:E6\t\tApple, Inc.\nA4:F6:E8\t\tApple, Inc.\nA4:F7:D0\t\tLAN Accessories Co., Ltd.\nA4:F8:41\t\tApple, Inc.\nA4:F9:21\t\tApple, Inc.\nA4:F9:33\t\tIntel Corporate\nA4:F9:E4\t\tAirVine Scientific, Inc.\nA4:FA:76\t\tNew H3C Technologies Co., Ltd\nA4:FB:8D\t\tHangzhou Dunchong Technology Co.Ltd\nA4:FC:14\t\tApple, Inc.\nA4:FC:77\t\tMega Well Limited\nA4:FC:A1\t\tNokia Solutions and Networks GmbH & Co. KG\nA4:FC:CE\t\tSecurity Expert Ltd.\nA4:FF:95\t\tNokia\nA4:FF:9F\t\tXiaomi Communications Co Ltd\nA8:00:E3\t\tStarkey Labs Inc.\nA8:01:6D\t\tAiwa Corporation\nA8:01:80\t\tIMAGO Technologies GmbH\nA8:02:DB\t\tzte corporation\nA8:03:2A\t\tEspressif Inc.\nA8:05:56\t\tvivo Mobile Communication Co., Ltd.\nA8:05:77\t\tNetlist, Inc.\nA8:06:00\t\tSamsung Electronics Co.,Ltd\nA8:08:CF\t\tVestel Elektronik San ve Tic. A.S.\nA8:09:B1\t\tHuawei Device Co., Ltd.\nA8:0B:6B\t\tChipsea Technologies (Shenzhen) Corp.\nA8:0B:FB\t\tRuckus Wireless\nA8:0C:03\t\tFlorawise\nA8:0C:0D\t\tCisco Systems, Inc\nA8:0C:63\t\tHuawei Technologies Co.,Ltd\nA8:0C:CA\t\tShenzhen Sundray Technologies company Limited\nA8:0D:E1\t\tHuawei Technologies Co.,Ltd\nA8:10:87\t\tTexas Instruments\nA8:11:FC\t\tCommscope\nA8:13:06\t\tvivo Mobile Communication Co., Ltd.\nA8:13:0B\t\teero inc.\nA8:13:74\t\tPanasonic Corporation AVC Networks Company\nA8:15:4D\t\tTp-Link Technologies Co.,Ltd.\nA8:15:59\t\tBreathometer, Inc.\nA8:15:D6\t\tShenzhen Meione Technology CO., LTD\nA8:16:9D\t\tHui Zhou Gaoshengda Technology Co.,LTD\nA8:16:B2\t\tLG Electronics (Mobile Communications)\nA8:16:D0\t\tSamsung Electronics Co.,Ltd\nA8:17:10\t\tBouffalo Lab (Nanjing) Co., Ltd.\nA8:17:58\t\tElektronik System i Umeå AB\nA8:1A:F1\t\tApple, Inc.\nA8:1B:18\t\tXts Corp\nA8:1B:5A\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nA8:1B:5D\t\tFoxtel Management Pty Ltd\nA8:1B:6A\t\tTexas Instruments\nA8:1D:16\t\tAzureWave Technology Inc.\nA8:1E:84\t\tQuanta Computer Inc.\nA8:1F:79\t\tYingling Innovations Pte. Ltd.\nA8:1F:AF\t\tKrypton Polska\nA8:20:66\t\tApple, Inc.\nA8:23:16\t\tNokia\nA8:23:FE\t\tLG Electronics\nA8:24:50\t\tBeijing Huadianzhongxin Tech.Co.,Ltd\nA8:24:B8\t\tNokia\nA8:24:EB\t\tZAO NPO Introtest\nA8:25:EB\t\tCambridge Industries(Group) Co.,Ltd.\nA8:26:D9\t\tHTC Corporation\nA8:27:C8\t\tEdgecore Americas Networking Corporation\nA8:29:48\t\tTP-Link Systems Inc.\nA8:29:4C\t\tPrecision Optical Transceivers, Inc.\nA8:2A:D6\t\tArthrex Inc.\nA8:2B:B5\t\tEdgecore Networks Corporation\nA8:2B:B9\t\tSamsung Electronics Co.,Ltd\nA8:2B:CD\t\tHuawei Technologies Co.,Ltd\nA8:2B:D5\t\tXiaomi Communications Co Ltd\nA8:2B:D6\t\tShina System Co., Ltd\nA8:2B:DD\t\tLCFC(Hefei) Electronics Technology co., ltd\nA8:2C:3E\t\tShenzhen Cultraview Digital Technology Co., Ltd\nA8:2C:89\t\tApple, Inc.\nA8:30:1C\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\nA8:30:AD\t\tWeifang Goertek Electronics Co.,Ltd\nA8:30:BC\t\tSamsung Electronics Co.,Ltd\nA8:31:62\t\tHangzhou Huacheng Network Technology Co.,Ltd\nA8:32:9A\t\tDigicom Futuristic Technologies Ltd.\nA8:34:6A\t\tSamsung Electronics Co.,Ltd\nA8:35:12\t\tHuawei Device Co., Ltd.\nA8:36:7A\t\tfrogblue TECHNOLOGY GmbH\nA8:37:59\t\tHuawei Device Co., Ltd.\nA8:39:44\t\tActiontec Electronics, Inc\nA8:3A:48\t\tUbiqcom India Pvt Ltd\nA8:3A:79\t\tMist Systems, Inc.\nA8:3B:5C\t\tHuawei Technologies Co.,Ltd\nA8:3B:76\t\tCloud Network Technology Singapore Pte. Ltd.\nA8:3C:A5\t\tDell Inc.\nA8:3C:CB\t\tRossma\nA8:3E:0E\t\tHMD Global Oy\nA8:3E:D3\t\tHuawei Technologies Co.,Ltd\nA8:3F:A1\t\tIEEE Registration Authority\nA8:3F:A1:00:00:00/28\tImecon Engineering SrL\nA8:3F:A1:10:00:00/28\tGTDevice LLC\nA8:3F:A1:20:00:00/28\tMedcaptain Medical Technology Co., Ltd.\nA8:3F:A1:30:00:00/28\tGuangzhou Tupu Internet Technology Co., Ltd.\nA8:3F:A1:40:00:00/28\tZhejiang Wellsun Intelligent Technology Co.,Ltd.\nA8:3F:A1:50:00:00/28\tSercomm Corporation.\nA8:3F:A1:60:00:00/28\tBeglec\nA8:3F:A1:70:00:00/28\tPlejd AB\nA8:3F:A1:80:00:00/28\tNeos Ventures Limited\nA8:3F:A1:90:00:00/28\tShenzhen ITLONG Intelligent Technology Co.,Ltd\nA8:3F:A1:A0:00:00/28\tShanghai East China Computer Co., Ltd\nA8:3F:A1:B0:00:00/28\tExel s.r.l. unipersonale\nA8:3F:A1:C0:00:00/28\tLaonz Co.,Ltd\nA8:3F:A1:D0:00:00/28\tShenzhen BIO I/E Co.,Ltd\nA8:3F:A1:E0:00:00/28\tGuangzhou Navigateworx Technologies Co., Limited\nA8:40:0B\t\tVisteon Corporation\nA8:40:25\t\tOxide Computer Company\nA8:40:41\t\tDragino Technology Co., Limited\nA8:40:7D\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nA8:40:F8\t\tHumax Networks\nA8:41:22\t\tChina Mobile (Hangzhou) Information Technology Co.,Ltd.\nA8:41:F4\t\tAzureWave Technology Inc.\nA8:42:A1\t\tTP-Link Systems Inc\nA8:42:A7\t\tJiangsu Huitong Group Co.,Ltd.\nA8:42:E3\t\tEspressif Inc.\nA8:43:97\t\tInnogrit Corporation\nA8:43:A4\t\tChina Dragon Technology Limited\nA8:44:81\t\tNokia Corporation\nA8:44:AA\t\tFiberhome Telecommunication Technologies Co.,LTD\nA8:45:CD\t\tSiselectron Technology LTD.\nA8:45:E9\t\tFirich Enterprises CO., LTD.\nA8:46:16\t\tHuawei Technologies Co.,Ltd\nA8:46:74\t\tEspressif Inc.\nA8:46:9D\t\tCisco Meraki\nA8:47:4A\t\tHon Hai Precision Ind. Co.,Ltd.\nA8:48:FA\t\tEspressif Inc.\nA8:49:4D\t\tHuawei Technologies Co.,Ltd\nA8:49:A5\t\tLisantech Co., Ltd.\nA8:4A:28\t\tApple, Inc.\nA8:4A:63\t\tTPV Display Technology(Xiamen) Co.,Ltd.\nA8:4B:4D\t\tSamsung Electronics Co.,Ltd\nA8:4D:4A\t\tAudiowise Technology Inc.\nA8:4E:3F\t\tHitron Technologies. Inc\nA8:4F:A4\t\tChina Dragon Technology Limited\nA8:4F:B1\t\tCisco Systems, Inc\nA8:50:08\t\tFelion Technologies Company Limited\nA8:50:81\t\tHuawei Technologies Co.,Ltd\nA8:51:5B\t\tSamsung Electronics Co.,Ltd\nA8:51:AB\t\tApple, Inc.\nA8:52:D4\t\tHewlett Packard Enterprise\nA8:53:7D\t\tMist Systems, Inc.\nA8:54:A2\t\tHeimgard Technologies AS\nA8:54:B2\t\tWistron Neweb Corporation\nA8:55:6A\t\t3S System Technology Inc.\nA8:57:4E\t\tTp-Link Technologies Co.,Ltd.\nA8:58:40\t\tCambridge Industries(Group) Co.,Ltd.\nA8:58:4E\t\tPk Vega\nA8:58:7C\t\tShoogee GmbH & Co. KG\nA8:59:5F\t\tIntel Corporate\nA8:5A:E0\t\tHuawei Device Co., Ltd.\nA8:5A:F3\t\tShanghai Siflower Communication Technology Co., Ltd\nA8:5B:36\t\tIEEE Registration Authority\nA8:5B:36:00:00:00/28\tBluesoo Tech (HongKong) Co.,Limited\nA8:5B:36:10:00:00/28\tParma Llc\nA8:5B:36:20:00:00/28\tLoomanet Inc.\nA8:5B:36:30:00:00/28\tShenzhen Dandelion Intelligent Cloud Technology Development Co., LTD\nA8:5B:36:40:00:00/28\tLuoxian (Guandong) Technology Co., Ltd\nA8:5B:36:50:00:00/28\tJuganu Ltd\nA8:5B:36:60:00:00/28\tVersuni\nA8:5B:36:70:00:00/28\tLouis Vuitton Malletier\nA8:5B:36:80:00:00/28\tShangHai SnowLake Technology Co.,LTD.\nA8:5B:36:90:00:00/28\tAvista Edge\nA8:5B:36:A0:00:00/28\tTaiden Industrial Co.,Ltd\nA8:5B:36:B0:00:00/28\t\"Lampyris Plant\" LLC\nA8:5B:36:C0:00:00/28\tATER Technologies Co Ltd\nA8:5B:36:D0:00:00/28\tAdam Hall GmbH\nA8:5B:36:E0:00:00/28\tORBITVU Sp. z o. o.\nA8:5B:6C\t\tRobert Bosch Gmbh, CM-CI2\nA8:5B:78\t\tApple, Inc.\nA8:5B:B0\t\tShenzhen Dehoo Technology Co.,Ltd\nA8:5B:B7\t\tApple, Inc.\nA8:5B:D1\t\tInventec Corporation\nA8:5B:F3\t\tAudivo GmbH\nA8:5B:F7\t\tHewlett Packard Enterprise\nA8:5C:03\t\tJiangSu Fulian Communication Technology Co., Ltd\nA8:5C:2C\t\tApple, Inc.\nA8:5E:45\t\tASUSTek COMPUTER INC.\nA8:5E:E4\t\t12Sided Technology, LLC\nA8:5E:F2\t\tTecno Mobile Limited\nA8:60:B6\t\tApple, Inc.\nA8:61:0A\t\tArduino Ag\nA8:61:AA\t\tCloudview Limited\nA8:61:DF\t\tChina Mobile Group Device Co.,Ltd.\nA8:62:A2\t\tJiwumedia Co., Ltd.\nA8:63:08\t\tAvutec\nA8:63:7D\t\tD-Link International\nA8:63:DF\t\tDisplaire Corporation\nA8:63:F2\t\tTexas Instruments\nA8:64:05\t\tnimbus 9, Inc\nA8:64:F1\t\tIntel Corporate\nA8:65:B2\t\tDongguan Yishang Electronic Technology Co., Limited\nA8:66:7F\t\tApple, Inc.\nA8:67:1E\t\tRatp\nA8:69:8C\t\tOracle Corporation\nA8:6A:6F\t\tRim\nA8:6A:86\t\tXiaomi Communications Co Ltd\nA8:6A:BB\t\tSagemcom Broadband SAS\nA8:6A:C1\t\tHanbitEDS Co., Ltd.\nA8:6B:7C\t\tShenzhen Fenglian Technology Co., Ltd.\nA8:6B:AD\t\tHon Hai Precision Ind. Co.,Ltd.\nA8:6D:04\t\tSiemens AG\nA8:6D:5F\t\tRaisecom Technology CO., LTD\nA8:6D:AA\t\tIntel Corporate\nA8:6E:4E\t\tHuawei Device Co., Ltd.\nA8:6E:84\t\tTP-Link Systems Inc\nA8:6F:36\t\tvivo Mobile Communication Co., Ltd.\nA8:70:5D\t\tCommscope\nA8:70:A5\t\tUniComm Inc.\nA8:71:16\t\tEarda Technologies co Ltd\nA8:72:7E\t\tWISDRI (wuhan) Automation Company Limited\nA8:72:85\t\tIdt, Inc.\nA8:74:1D\t\tPhoenix Contact GmbH & Co. KG\nA8:74:84\t\tzte corporation\nA8:75:D6\t\tFreeTek International Co., Ltd.\nA8:75:E2\t\tAventura Technologies, Inc.\nA8:76:50\t\tSamsung Electronics Co.,Ltd\nA8:77:6F\t\tZonoff\nA8:77:E5\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\nA8:79:71\t\tHuawei Technologies Co.,Ltd\nA8:79:8D\t\tSamsung Electronics Co.,Ltd\nA8:7B:39\t\tNokia Corporation\nA8:7C:01\t\tSamsung Electronics Co.,Ltd\nA8:7C:45\t\tHuawei Technologies Co.,Ltd\nA8:7C:F8\t\tApple, Inc.\nA8:7D:12\t\tHuawei Technologies Co.,Ltd\nA8:7E:33\t\tNokia Danmark A/S\nA8:7E:EA\t\tIntel Corporate\nA8:80:38\t\tShenZhen MovingComm Technology Co., Limited\nA8:80:55\t\tTuya Smart Inc.\nA8:81:7E\t\tApple, Inc.\nA8:81:95\t\tSamsung Electronics Co.,Ltd\nA8:81:F1\t\tBmeye B.V.\nA8:81:FE\t\tLuxul Tech Co., Ltd\nA8:82:00\t\tHisense Electric Co.,Ltd\nA8:82:7F\t\tCIBN Oriental Network(Beijing) CO.,Ltd\nA8:85:D7\t\tSangfor Technologies Inc.\nA8:86:DD\t\tApple, Inc.\nA8:87:92\t\tBroadband Antenna Tracking Systems\nA8:87:B3\t\tSamsung Electronics Co.,Ltd\nA8:87:ED\t\tARC Wireless LLC\nA8:88:08\t\tApple, Inc.\nA8:88:1F\t\tServercom (India) Private Limited\nA8:88:CE\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nA8:89:40\t\tHuawei Device Co., Ltd.\nA8:8B:28\t\tShenzhen Diyang Smart Technology Co.,Ltd.\nA8:8C:3E\t\tMicrosoft Corporation\nA8:8C:EE\t\tMicroMade Galka i Drozdz sp.j.\nA8:8D:7B\t\tSunDroid Global limited.\nA8:8E:24\t\tApple, Inc.\nA8:8F:99\t\tArista Networks\nA8:8F:D9\t\tApple, Inc.\nA8:90:08\t\tBeijing Yuecheng Technology Co. Ltd.\nA8:90:42\t\tBeijing Wanwei Intelligent Technology Co., Ltd.\nA8:91:3D\t\tApple, Inc.\nA8:91:62\t\tSophos Ltd\nA8:92:2C\t\tLG Electronics (Mobile Communications)\nA8:93:4A\t\tChongqing Fugui Electronics Co.,Ltd.\nA8:93:52\t\tShanghai Zhongmi Communication Technology Co.,Ltd\nA8:93:E6\t\tJiangxi Jinggangshan Cking Communication Technology Co.,Ltd\nA8:95:B0\t\tAker Subsea Ltd\nA8:96:09\t\tFN-LINK TECHNOLOGY Ltd.\nA8:96:75\t\tMotorola Mobility LLC, a Lenovo Company\nA8:96:8A\t\tApple, Inc.\nA8:97:CD\t\tCommscope\nA8:97:DC\t\tIbm\nA8:98:92\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nA8:98:C6\t\tShinbo Co., Ltd.\nA8:99:5C\t\taizo ag\nA8:99:69\t\tDell Inc.\nA8:99:AD\t\tChaoyue Technology Co., Ltd.\nA8:99:DC\t\ti-TOP DESING TECHNOLOGY CO.,LTD\nA8:9A:8C\t\tzte corporation\nA8:9A:93\t\tSagemcom Broadband SAS\nA8:9A:D7\t\tNokia\nA8:9B:10\t\tinMotion Ltd.\nA8:9C:6C\t\tUbiquiti Inc\nA8:9C:78\t\tApple, Inc.\nA8:9C:A4\t\tFurrion Limited\nA8:9C:ED\t\tXiaomi Communications Co Ltd\nA8:9D:21\t\tCisco Systems, Inc\nA8:9D:D2\t\tShanghai DareGlobal Technologies Co.,Ltd\nA8:9F:BA\t\tSamsung Electronics Co.,Ltd\nA8:9F:EC\t\tCommscope\nA8:A0:89\t\tTactical Communications\nA8:A0:97\t\tScioTeq bvba\nA8:A1:59\t\tASRock Incorporation\nA8:A1:98\t\tTCT mobile ltd\nA8:A2:37\t\tArcadyan Corporation\nA8:A5:E2\t\tMSF-Vathauer Antriebstechnik GmbH & Co KG\nA8:A6:48\t\tQingdao Hisense Communications Co.,Ltd.\nA8:A6:68\t\tzte corporation\nA8:A7:95\t\tHon Hai Precision Ind. Co.,Ltd.\nA8:A9:13\t\tGN Hearing A/S\nA8:AA:7C\t\tHuawei Device Co., Ltd.\nA8:AB:B5\t\tApple, Inc.\nA8:AD:3D\t\tAlcatel-Lucent Shanghai Bell Co., Ltd\nA8:B0:28\t\tCubePilot Pty Ltd\nA8:B0:88\t\teero inc.\nA8:B0:AE\t\tBizLink Special Cables Germany GmbH\nA8:B0:D1\t\tEFUN Display Technology (Shenzhen) Co., Ltd.\nA8:B1:3B\t\tHP Inc.\nA8:B1:D4\t\tCisco Systems, Inc\nA8:B2:71\t\tHuawei Technologies Co.,Ltd\nA8:B2:DA\t\tFujitsu Limited\nA8:B4:56\t\tCisco Systems, Inc\nA8:B4:83\t\tShenzhen SuperElectron Technology Co.,Ltd.\nA8:B5:7C\t\tRoku, Inc\nA8:B5:8E\t\tShenzhen Bilian Electronic Co.，Ltd\nA8:B8:6E\t\tLG Electronics (Mobile Communications)\nA8:B8:E0\t\tChangwang Technology inc.\nA8:B9:B3\t\tEssys\nA8:BA:25\t\tHewlett Packard Enterprise\nA8:BA:69\t\tSamsung Electronics Co.,Ltd\nA8:BB:50\t\tWiZ IoT Company Limited\nA8:BB:56\t\tApple, Inc.\nA8:BB:CF\t\tApple, Inc.\nA8:BC:9C\t\tCloud Light Technology Limited\nA8:BD:1A\t\tHoney Bee (Hong Kong) Limited\nA8:BD:27\t\tHewlett Packard Enterprise\nA8:BD:3A\t\tUnion Man Technology Co.,Ltd\nA8:BE:27\t\tApple, Inc.\nA8:BF:3C\t\tHDV Phoelectron Technology Limited\nA8:C0:92\t\tHuawei Device Co., Ltd.\nA8:C0:EA\t\tPepwave Limited\nA8:C2:22\t\tTM-Research Inc.\nA8:C2:46\t\tGemtek Technology Co., Ltd.\nA8:C2:52\t\tHuawei Device Co., Ltd.\nA8:C2:66\t\tHUMAX Co., Ltd.\nA8:C4:07\t\tHuawei Technologies Co.,Ltd\nA8:C5:6F\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nA8:C6:47\t\tExtreme Networks Headquarters\nA8:C8:3A\t\tHuawei Technologies Co.,Ltd\nA8:C8:7F\t\tRoqos, Inc.\nA8:C9:8A\t\tNew H3C Technologies Co., Ltd\nA8:CA:77\t\tAmazon Technologies Inc.\nA8:CA:7B\t\tHuawei Technologies Co.,Ltd\nA8:CA:B9\t\tSamsung Electro Mechanics Co., Ltd.\nA8:CB:95\t\tEast Best Co., Ltd.\nA8:CC:6F\t\tHMD Global Oy\nA8:CC:C5\t\tSaab AB (publ)\nA8:CE:90\t\tCvc\nA8:CF:E0\t\tGDN Enterprises Private Limited\nA8:D0:81\t\tHuawei Device Co., Ltd.\nA8:D0:E3\t\tSystech Electronics Ltd\nA8:D0:E5\t\tJuniper Networks\nA8:D2:36\t\tLightware Visual Engineering\nA8:D3:C8\t\tWachendorff Automation GmbH & CO.KG\nA8:D3:F7\t\tArcadyan Technology Corporation\nA8:D4:09\t\tUSA 111 Inc\nA8:D4:98\t\tAvira Operations GmbH & Co. KG\nA8:D4:E0\t\tHuawei Technologies Co.,Ltd\nA8:D5:79\t\tBeijing Chushang Science and Technology Co.,Ltd\nA8:D8:28\t\tAscensia Diabetes Care\nA8:D8:61\t\tItel Mobile Limited\nA8:D8:8A\t\tWyconn\nA8:DA:01\t\tShenzhen NUOLIJIA Digital Technology Co.,Ltd\nA8:DA:0C\t\tServercom (India) Private Limited\nA8:DB:03\t\tSamsung Electro-Mechanics(Thailand)\nA8:DC:5A\t\tDigital Watchdog\nA8:DE:68\t\tBeijing Wide Technology Co.,Ltd\nA8:E0:18\t\tNokia Corporation\nA8:E2:07\t\tGOIP Global Services Pvt. Ltd.\nA8:E2:91\t\tAzureWave Technology Inc.\nA8:E2:C1\t\tTexas Instruments\nA8:E2:C3\t\tShenzhen YOUHUA Technology Co., Ltd\nA8:E3:EE\t\tSony Interactive Entertainment Inc.\nA8:E5:39\t\tNurivoice Co., Ltd\nA8:E5:44\t\tHuawei Technologies Co.,Ltd\nA8:E5:52\t\tJUWEL Aquarium AG & Co. KG\nA8:E5:EC\t\tNokia\nA8:E6:21\t\tAmazon Technologies Inc.\nA8:E6:E8\t\tTonly Technology Co. Ltd\nA8:E7:05\t\tFiberhome Telecommunication Technologies Co.,LTD\nA8:E7:7D\t\tTexas Instruments\nA8:E8:1E\t\tAtw Technology, Inc.\nA8:E8:24\t\tInim Electronics S.R.L.\nA8:E9:78\t\tHuawei Device Co., Ltd.\nA8:EA:71\t\tFiberhome Telecommunication Technologies Co.,LTD\nA8:EA:E4\t\tWeiser\nA8:ED:71\t\tAnalogue Enterprises Limited\nA8:EE:67\t\tSamsung Electronics Co.,Ltd\nA8:EE:6D\t\tFine Point-High Export\nA8:EE:C6\t\tMuuselabs NV/SA\nA8:EF:26\t\tTritonwave\nA8:EF:5F\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nA8:F0:38\t\tShen Zhen Shi Jin Hua Tai Electronics Co.,Ltd\nA8:F0:59\t\tHuawei Technologies Co.,Ltd\nA8:F1:B2\t\tAllwinner Technology Co., Ltd\nA8:F2:66\t\tHuawei Device Co., Ltd.\nA8:F2:74\t\tSamsung Electronics Co.,Ltd\nA8:F4:70\t\tFujian Newland Communication Science Technologies Co.,Ltd.\nA8:F5:AC\t\tHuawei Technologies Co.,Ltd\nA8:F5:DD\t\tCommscope\nA8:F5:E1\t\tShenzhen Shokz Co., Ltd.\nA8:F7:66\t\tITE Tech Inc\nA8:F7:D9\t\tMist Systems, Inc.\nA8:F7:E0\t\tPLANET Technology Corporation\nA8:F8:C9\t\tNXP Semiconductor (Tianjin) LTD.\nA8:F9:4B\t\tEltex Enterprise Ltd.\nA8:FA:D8\t\tApple, Inc.\nA8:FB:40\t\tNokia Solutions and Networks GmbH & Co. KG\nA8:FB:70\t\tWiseSec L.t.d\nA8:FC:B7\t\tConsolidated Resource Imaging\nA8:FE:9D\t\tApple, Inc.\nA8:FE:CE\t\tFiberhome Telecommunication Technologies Co.,LTD\nA8:FF:BA\t\tHuawei Technologies Co.,Ltd\nAA:00:00\t\tDigital Equipment Corporation\nAA:00:01\t\tDigital Equipment Corporation\nAA:00:02\t\tDigital Equipment Corporation\nAA:00:03\t\tDigital Equipment Corporation\nAA:00:04\t\tDigital Equipment Corporation\nAA:0F:85\t\tYamaichi Electronics\nAA:14:6B\t\tIronWiFi\nAA:34:D4\t\tCDVI Wireless SpA\nAA:38:C7\t\tKaloom inc\nAA:54:8B\t\tTintri\nAA:78:A3\t\tDongguan Yiertek Co., Ltd\nAA:DC:47\t\tCachengo, Inc.\nAA:F0:19\t\tTransferJet Consortium Incorporated Association\nAC:00:7A\t\tApple, Inc.\nAC:00:D0\t\tzte corporation\nAC:00:F9\t\tBizLink Technology (S.E.A) Sdn. Bhd.\nAC:01:42\t\tUriel Technologies SIA\nAC:01:7A\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nAC:02:CA\t\tHI Solutions, Inc.\nAC:02:CF\t\tRW Tecnologia Industria e Comercio Ltda\nAC:02:EF\t\tComsis\nAC:04:0B\t\tPeloton Interactive, Inc\nAC:04:25\t\tball-b GmbH Co KG\nAC:04:81\t\tJiangsu Huaxing Electronics Co., Ltd.\nAC:04:AA\t\tGoPro\nAC:06:13\t\tSenselogix Ltd\nAC:06:50\t\tShanghai Baosight Software Co., Ltd\nAC:06:C7\t\tServerNet S.r.l.\nAC:07:5F\t\tHuawei Technologies Co.,Ltd\nAC:07:75\t\tApple, Inc.\nAC:0A:61\t\tLabor S.r.L.\nAC:0B:FB\t\tEspressif Inc.\nAC:0D:1B\t\tLG Electronics (Mobile Communications)\nAC:0D:FE\t\tEkon GmbH - myGEKKO\nAC:10:07\t\tArcadyan Corporation\nAC:10:65\t\tKT Micro, Inc.\nAC:11:D3\t\tSuzhou HOTEK  Video Technology Co. Ltd\nAC:12:03\t\tIntel Corporate\nAC:12:2F\t\tFantasia Trading LLC\nAC:12:8E\t\tShanghai Baud Data Communication Co.,Ltd.\nAC:13:9C\t\tAdtran Inc\nAC:14:61\t\tATAW  Co., Ltd.\nAC:14:D2\t\twi-daq, inc.\nAC:15:18\t\tEspressif Inc.\nAC:15:85\t\tsilergy corp\nAC:15:A2\t\tTP-Link Systems Inc\nAC:15:F4\t\tApple, Inc.\nAC:16:15\t\tApple, Inc.\nAC:16:2D\t\tHewlett Packard\nAC:16:DE\t\tIntel Corporate\nAC:17:02\t\tFibar Group sp. z o.o.\nAC:17:54\t\ttiko Energy Solutions AG\nAC:17:94\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\nAC:17:C8\t\tCisco Meraki\nAC:18:26\t\tSeiko Epson Corporation\nAC:19:8E\t\tIntel Corporate\nAC:19:9F\t\tSungrow Power Supply Co.,Ltd.\nAC:1A:3D\t\tDell Inc.\nAC:1C:26\t\tHangzhou Ezviz Software Co.,Ltd.\nAC:1D:06\t\tApple, Inc.\nAC:1D:DF\t\tIEEE Registration Authority\nAC:1D:DF:00:00:00/28\tPiOctave Solutions Pvt Ltd\nAC:1D:DF:10:00:00/28\tHellaStorm, Inc.\nAC:1D:DF:20:00:00/28\tConectaIP Tecnologia S.L.\nAC:1D:DF:30:00:00/28\tCrde\nAC:1D:DF:40:00:00/28\tMotec Pty Ltd\nAC:1D:DF:50:00:00/28\tShenzhen Ouzheng Electronic Tech Co,.Ltd\nAC:1D:DF:60:00:00/28\tShenzheng SenseTime Technology Co. Ltd\nAC:1D:DF:70:00:00/28\tGreen IT Korea Co., Ltd.\nAC:1D:DF:80:00:00/28\tSichuan Odot Automation System Co.,Ltd.\nAC:1D:DF:90:00:00/28\tSolare Datensysteme GmbH\nAC:1D:DF:A0:00:00/28\tWesco Integrated Supply\nAC:1D:DF:B0:00:00/28\tFINEpowerX INC\nAC:1D:DF:C0:00:00/28\tBeijing Chunhong Technology Co., Ltd.\nAC:1D:DF:D0:00:00/28\tElekon AG\nAC:1D:DF:E0:00:00/28\tDuravit AG\nAC:1E:92\t\tSamsung Electronics Co.,Ltd\nAC:1E:9E\t\tXiaomi Communications Co Ltd\nAC:1E:A9\t\tIntelbras\nAC:1E:D0\t\tTemic Automotive Philippines Inc.\nAC:1F:09\t\tshenzhen RAKwireless technology  Co.,Ltd\nAC:1F:0F\t\tTexas Instruments\nAC:1F:6B\t\tSuper Micro Computer, Inc.\nAC:1F:74\t\tApple, Inc.\nAC:1F:D7\t\tReal Vision Technology Co.,Ltd.\nAC:20:2E\t\tHitron Technologies. Inc\nAC:20:3E\t\tWuhan Tianyu Information Industry Co., Ltd.\nAC:20:AA\t\tDMATEK Co., Ltd.\nAC:22:05\t\tCompal Broadband Networks, Inc.\nAC:22:0B\t\tASUSTek COMPUTER INC.\nAC:23:16\t\tMist Systems, Inc.\nAC:23:34\t\tInfinix mobility limited\nAC:23:3F\t\tShenzhen Minew Technologies Co., Ltd.\nAC:29:29\t\tInfinix mobility limited\nAC:29:3A\t\tApple, Inc.\nAC:2A:0C\t\tCsr Zhuzhou Institute Co.,Ltd.\nAC:2A:A1\t\tCisco Systems, Inc\nAC:2B:6E\t\tIntel Corporate\nAC:2D:A3\t\tTXTR GmbH\nAC:2D:A9\t\tTecno Mobile Limited\nAC:2F:A8\t\tHumannix Co.,Ltd.\nAC:31:84\t\tHuawei Device Co., Ltd.\nAC:31:9D\t\tShenzhen TG-NET Botone Technology Co.,Ltd.\nAC:33:0B\t\tJapan Computer Vision Corp.\nAC:33:28\t\tHuawei Device Co., Ltd.\nAC:33:51\t\tEricsson AB\nAC:34:CB\t\tShanhai GBCOM Communication Technology Co. Ltd\nAC:35:EE\t\tFn-Link Technology Limited\nAC:36:13\t\tSamsung Electronics Co.,Ltd\nAC:36:1B\t\tHon Hai Precision Industry Co.,LTD\nAC:36:51\t\tJiangsu Hengtong Terahertz Technology Co., Ltd.\nAC:37:28\t\tTaicang T&W Electronics\nAC:37:43\t\tHTC Corporation\nAC:37:C9\t\tRAID Incorporated\nAC:38:70\t\tLenovo Mobile Communication Technology Ltd.\nAC:39:71\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nAC:3A:67\t\tCisco Systems, Inc\nAC:3A:7A\t\tRoku, Inc.\nAC:3B:77\t\tSagemcom Broadband SAS\nAC:3B:96\t\tNXP Semiconductor (Tianjin) LTD.\nAC:3C:0B\t\tApple, Inc.\nAC:3C:8E\t\tFlextronics Computing(Suzhou)Co.,Ltd.\nAC:3C:B4\t\tNilan A/S\nAC:3D:05\t\tInstorescreen Aisa\nAC:3D:75\t\tHangzhou Zhiway Technologies Co.,Ltd.\nAC:3D:94\t\tArista Networks\nAC:3D:CB\t\tIntel Corporate\nAC:3E:B1\t\tGoogle, Inc.\nAC:3F:A4\t\tTaiyo Yuden Co.,Ltd\nAC:40:EA\t\tC&T Solution Inc.\nAC:41:22\t\tEclipse Electronic Systems Inc.\nAC:41:6A\t\tAmazon Technologies Inc.\nAC:42:28\t\tParta Networks\nAC:43:30\t\tVersa Networks\nAC:44:F2\t\tYamaha Corporation\nAC:45:00\t\tApple, Inc.\nAC:45:CA\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nAC:45:EF\t\tIntel Corporate\nAC:47:1B\t\tHuawei Device Co., Ltd.\nAC:47:23\t\tGenelec\nAC:48:2D\t\tRalinwi Nanjing Electronic Technology Co., Ltd.\nAC:49:DB\t\tApple, Inc.\nAC:4A:56\t\tCisco Systems, Inc\nAC:4A:67\t\tCisco Systems, Inc\nAC:4A:FE\t\tHisense Broadband Multimedia Technology Co.,Ltd.\nAC:4B:1E\t\tIntegri-Sys.Com LLC\nAC:4B:C8\t\tJuniper Networks\nAC:4C:A5\t\tVantiva USA LLC\nAC:4D:16\t\tTexas Instruments\nAC:4D:D9\t\tExtreme Networks Headquarters\nAC:4E:2E\t\tShenzhen JingHanDa Electronics Co.Ltd\nAC:4E:65\t\tFiberhome Telecommunication Technologies Co.,LTD\nAC:4E:91\t\tHuawei Technologies Co.,Ltd\nAC:4F:FC\t\tSVS-VISTEK GmbH\nAC:50:36\t\tPi-Coral Inc\nAC:50:93\t\tMagna Electronics Europe GmbH & Co. OHG\nAC:50:DE\t\tCloud Network Technology Singapore Pte. Ltd.\nAC:50:EE\t\tTianyi Telecom Terminals Company Limited\nAC:51:2C\t\tInfinix mobility limited\nAC:51:35\t\tMpi Tech\nAC:51:AB\t\tHuawei Technologies Co.,Ltd\nAC:51:EE\t\tAdtran Inc\nAC:54:74\t\tChina Mobile IOT Company Limited\nAC:54:EC\t\tIEEE P1823 Standards Working Group\nAC:56:2C\t\tLava International(H.K) Limited\nAC:56:7B\t\tSunnovo International Limited\nAC:57:75\t\tHMD Global Oy\nAC:58:3B\t\tHuman Assembler, Inc.\nAC:58:7B\t\tJCT Healthcare\nAC:5A:14\t\tSamsung Electronics Co.,Ltd\nAC:5A:EE\t\tChina Mobile Group Device Co.,Ltd.\nAC:5A:F0\t\tLG Electronics\nAC:5A:FC\t\tIntel Corporate\nAC:5C:2C\t\tApple, Inc.\nAC:5C:80\t\tTelink Micro LLC\nAC:5D:10\t\tPace Americas\nAC:5D:5C\t\tFn-Link Technology Limited\nAC:5E:14\t\tHuawei Technologies Co.,Ltd\nAC:5E:8C\t\tUtillink\nAC:5F:3E\t\tSamsung Electro-Mechanics(Thailand)\nAC:5F:EA\t\tOnePlus Technology (Shenzhen) Co., Ltd\nAC:60:6F\t\tNokia Shanghai Bell Co., Ltd.\nAC:60:89\t\tHuawei Technologies Co.,Ltd\nAC:60:B6\t\tEricsson AB\nAC:61:23\t\tDrivven, Inc.\nAC:61:75\t\tHuawei Technologies Co.,Ltd\nAC:61:B9\t\tWAMA Technology Limited\nAC:61:EA\t\tApple, Inc.\nAC:62:0D\t\tJabil Circuit(Wuxi) Co.,Ltd\nAC:63:BE\t\tAmazon Technologies Inc.\nAC:64:17\t\tSiemens AG\nAC:64:62\t\tzte corporation\nAC:64:90\t\tHuawei Technologies Co.,Ltd\nAC:64:CF\t\tFn-Link Technology Limited\nAC:64:DD\t\tIEEE Registration Authority\nAC:64:DD:00:00:00/28\tJia-Teng\nAC:64:DD:10:00:00/28\tJSC InfoTeCS\nAC:64:DD:20:00:00/28\tShenzhen PuHua Technology Co., Ltd\nAC:64:DD:30:00:00/28\tinfypower Co., Ltd\nAC:64:DD:40:00:00/28\t8Cups\nAC:64:DD:50:00:00/28\tShanghai Zte Technologies Co.,Ltd\nAC:64:DD:60:00:00/28\tKpnetworks Ltd.\nAC:64:DD:70:00:00/28\tWittmann Kunststoffgeräte GmbH\nAC:64:DD:80:00:00/28\tPfdc Elancyl\nAC:64:DD:90:00:00/28\tMicro Connect Pty Ltd\nAC:64:DD:A0:00:00/28\tBluewave Global Manufacturing Limited\nAC:64:DD:B0:00:00/28\tGroupe Citypassenger Inc\nAC:64:DD:C0:00:00/28\tBeijing Hamigua Technology Co., Ltd.\nAC:64:DD:D0:00:00/28\tHMicro Inc\nAC:64:DD:E0:00:00/28\tDigibird Technology Co., Ltd.\nAC:67:06\t\tRuckus Wireless\nAC:67:5D\t\tIntel Corporate\nAC:67:6F\t\tElectrocompaniet A.S.\nAC:67:84\t\tGoogle, Inc.\nAC:67:B2\t\tEspressif Inc.\nAC:69:CF\t\tCisco Meraki\nAC:6A:A3\t\tShenzhen Kertong Technology Co.,Ltd\nAC:6B:0F\t\tCadence Design Systems Inc\nAC:6B:AC\t\tJenny Science AG\nAC:6C:90\t\tSamsung Electronics Co.,Ltd\nAC:6E:1A\t\tShenzhen Gongjin Electronics Co.,Lt\nAC:6F:4F\t\tEnspert Inc\nAC:6F:BB\t\tTATUNG Technology Inc.\nAC:6F:D9\t\tValueplus Inc.\nAC:71:0C\t\tChina Mobile Group Device Co.,Ltd.\nAC:71:2E\t\tFortinet, Inc.\nAC:72:36\t\tLexking Technology Co., Ltd.\nAC:72:89\t\tIntel Corporate\nAC:72:DD\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nAC:73:52\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nAC:74:09\t\tHangzhou H3C Technologies Co., Limited\nAC:74:B1\t\tIntel Corporate\nAC:74:C4\t\tMaytronics Ltd.\nAC:75:1D\t\tHuawei Technologies Co.,Ltd\nAC:76:4C\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nAC:77:13\t\tHoneywell Safety Products (Shanghai) Co.,Ltd\nAC:77:B9\t\tNanjing Yufei Intelligent Control Technology Co.,LTD\nAC:78:D1\t\tJuniper Networks\nAC:7A:42\t\tiConnectivity\nAC:7A:4D\t\tAlpsalpine Co,.Ltd\nAC:7A:56\t\tCisco Systems, Inc\nAC:7A:94\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nAC:7B:A1\t\tIntel Corporate\nAC:7E:01\t\tHuawei Device Co., Ltd.\nAC:7E:8A\t\tCisco Systems, Inc\nAC:7F:3E\t\tApple, Inc.\nAC:7F:8D\t\tExtreme Networks Headquarters\nAC:80:0A\t\tSony Corporation\nAC:80:AE\t\tFiberhome Telecommunication Technologies Co.,LTD\nAC:80:D6\t\tHexatronic AB\nAC:80:FB\t\tSamsung Electronics Co.,Ltd\nAC:81:12\t\tGemtek Technology Co., Ltd.\nAC:81:B5\t\tAccton Technology Corporation\nAC:81:F3\t\tNokia Corporation\nAC:82:26\t\tQingdao Haier Technology Co.,Ltd\nAC:82:47\t\tIntel Corporate\nAC:83:17\t\tShenzhen Furtunetel Communication Co., Ltd\nAC:83:E9\t\tBeijing Zile Technology Co., Ltd\nAC:83:F0\t\tCobalt Digital Inc.\nAC:83:F3\t\tAMPAK Technology, Inc.\nAC:84:C6\t\tTp-Link Technologies Co.,Ltd.\nAC:84:C9\t\tSagemcom Broadband SAS\nAC:84:FA\t\tZhejiang Weilai Jingling Artificial Intelligence Technology Co., Ltd.\nAC:85:3D\t\tHuawei Technologies Co.,Ltd\nAC:86:74\t\tOpen Mesh, Inc.\nAC:86:7E\t\tCreate New Technology (HK) Limited Company\nAC:86:A3\t\tApple, Inc.\nAC:86:D1\t\tIEEE Registration Authority\nAC:86:D1:00:00:00/28\tAdvanced Rugged System Co., LTD\nAC:86:D1:10:00:00/28\tBeijing Fantasy Mofang Technology Co.,Ltd\nAC:86:D1:20:00:00/28\tHamsa India\nAC:86:D1:30:00:00/28\tInovaxe Corporation\nAC:86:D1:40:00:00/28\tRayThink Technology Co.,Ltd\nAC:86:D1:50:00:00/28\tHangzhou Lingban Technology Co., Ltd\nAC:86:D1:60:00:00/28\tAdveco Technology Co., Ltd\nAC:86:D1:70:00:00/28\tQuantum-Systems GmbH\nAC:86:D1:80:00:00/28\tPK Sound\nAC:86:D1:90:00:00/28\tAnnapurna labs\nAC:86:D1:A0:00:00/28\tEMIT GmbH\nAC:86:D1:B0:00:00/28\tshenzhen ceita communications technology co.,ltd\nAC:86:D1:C0:00:00/28\tMOTUSTECHS(Wuhan)Co.,Ltd.\nAC:86:D1:D0:00:00/28\tKrixe Pte. Ltd.\nAC:86:D1:E0:00:00/28\tRetina Development B.V.\nAC:87:A3\t\tApple, Inc.\nAC:88:66\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nAC:88:FD\t\tApple, Inc.\nAC:89:95\t\tAzureWave Technology Inc.\nAC:89:D2\t\tCiena Corporation\nAC:8A:CD\t\tROGER D.Wensker, G.Wensker sp.j.\nAC:8B:6A\t\tChina Mobile IOT Company Limited\nAC:8B:9C\t\tPrimera Technology, Inc.\nAC:8B:A9\t\tUbiquiti Inc\nAC:8C:46\t\tBeijing Xiaomi Mobile Software Co., Ltd\nAC:8D:14\t\tSmartrove Inc\nAC:8D:34\t\tHuawei Technologies Co.,Ltd\nAC:8E:BD\t\tMicrosoft Corporation\nAC:8F:A9\t\tNokia Solutions and Networks GmbH & Co. KG\nAC:8F:F8\t\tNokia\nAC:90:73\t\tHuawei Technologies Co.,Ltd\nAC:90:85\t\tApple, Inc.\nAC:91:5D\t\tDigital Control Technology Limited\nAC:91:9B\t\tWistron Neweb Corporation\nAC:91:A1\t\tDell Inc.\nAC:92:32\t\tHuawei Technologies Co.,Ltd\nAC:93:2F\t\tNokia Corporation\nAC:93:6A\t\tHuawei Device Co., Ltd.\nAC:93:C4\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nAC:94:03\t\tEnvision Peripherals Inc\nAC:95:72\t\tJovision Technology Co., Ltd.\nAC:96:5B\t\tLucid Motors\nAC:97:38\t\tApple, Inc.\nAC:97:6C\t\tGreenliant\nAC:99:29\t\tHuawei Technologies Co.,Ltd\nAC:9A:22\t\tNXP Semiconductors\nAC:9A:96\t\tMaxlinear, Inc\nAC:9B:0A\t\tSony Corporation\nAC:9B:84\t\tSmak Tecnologia e Automacao\nAC:9C:E4\t\tAlcatel-Lucent Shanghai Bell Co., Ltd\nAC:9E:17\t\tASUSTek COMPUTER INC.\nAC:9F:C3\t\tRing LLC\nAC:A0:16\t\tCisco Systems, Inc\nAC:A0:9D\t\tJuniper Networks\nAC:A2:13\t\tShenzhen Bilian electronic CO.,LTD\nAC:A2:2C\t\tBaycity Technologies Ltd\nAC:A3:1E\t\tHewlett Packard Enterprise\nAC:A3:2F\t\tSolidigm Technology\nAC:A4:30\t\tPeerless AV\nAC:A4:6E\t\tShenzhen Gongjin Electronics Co.,Lt\nAC:A6:13\t\tAivres SYSTEMS INC\nAC:A6:67\t\tElectronic Systems Protection, Inc.\nAC:A8:8E\t\tSHARP Corporation\nAC:A9:19\t\tTrekStor GmbH\nAC:A9:A0\t\tAudioengine, Ltd.\nAC:AB:2E\t\tBeijing LasNubes Technology Co., Ltd.\nAC:AB:8D\t\tLyngso Marine A/S\nAC:AB:BF\t\tAthenTek Inc.\nAC:AC:E2\t\tChanghong (Hongkong) Trading Limited\nAC:AD:4B\t\tzte corporation\nAC:AE:19\t\tRoku, Inc\nAC:AF:B9\t\tSamsung Electronics Co.,Ltd\nAC:B1:81\t\tBelden Mooresville\nAC:B1:EE\t\tShenzhen Fenda Technology Co., Ltd\nAC:B3:13\t\tCommscope\nAC:B3:B5\t\tHuawei Technologies Co.,Ltd\nAC:B4:80\t\tDell Inc.\nAC:B5:66\t\tRenesas Electronics (Penang) Sdn. Bhd.\nAC:B5:7D\t\tLiteon Technology Corporation\nAC:B6:87\t\tArcadyan Corporation\nAC:B7:22\t\tQingdao Haier Technology Co.,Ltd\nAC:B7:4F\t\tMETEL s.r.o.\nAC:B8:59\t\tUniband Electronic Corp,\nAC:B9:2F\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nAC:BA:C0\t\tIntertech Services AG\nAC:BB:61\t\tYSTen Technology Co.,Ltd\nAC:BC:32\t\tApple, Inc.\nAC:BC:5B\t\tVivibit Inc\nAC:BC:B5\t\tApple, Inc.\nAC:BC:D9\t\tCisco Systems, Inc\nAC:BD:0B\t\tLeimac Ltd.\nAC:BD:70\t\tHuawei Device Co., Ltd.\nAC:BD:F7\t\tCisco Meraki\nAC:BE:75\t\tUfine Technologies Co.,Ltd.\nAC:BE:B6\t\tVisualedge Technology Co., Ltd.\nAC:BF:71\t\tBose Corporation\nAC:C0:48\t\tOnePlus Technology (Shenzhen) Co., Ltd\nAC:C1:EE\t\tXiaomi Communications Co Ltd\nAC:C2:5D\t\tFiberhome Telecommunication Technologies Co.,LTD\nAC:C2:EC\t\tClt Int'L Ind. Corp.\nAC:C3:3A\t\tSamsung Electronics Co.,Ltd\nAC:C3:58\t\tContinental Automotive Czech Republic s.r.o.\nAC:C3:E5\t\tCisco Meraki\nAC:C4:A9\t\tFiberhome Telecommunication Technologies Co.,LTD\nAC:C4:BD\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nAC:C5:1B\t\tZhuhai Pantum Electronics Co., Ltd.\nAC:C5:95\t\tGraphite Systems\nAC:C5:B4\t\tHuawei Technologies Co.,Ltd\nAC:C6:62\t\tMitraStar Technology Corp.\nAC:C6:98\t\tKohzu Precision Co., Ltd.\nAC:C7:3F\t\tVitsmo Co., Ltd.\nAC:C9:06\t\tApple, Inc.\nAC:C9:35\t\tNess Corporation\nAC:C9:FF\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nAC:CA:0F\t\tIndisr Communication Services And Technologies India\nAC:CA:54\t\tTelldus Technologies AB\nAC:CA:8E\t\tODA Technologies\nAC:CA:AB\t\tVirtual Electric Inc\nAC:CA:BA\t\tMidokura Co., Ltd.\nAC:CB:09\t\tHefcom Metering (Pty) Ltd\nAC:CB:36\t\tFiberhome Telecommunication Technologies Co.,LTD\nAC:CB:51\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nAC:CC:8E\t\tAxis Communications AB\nAC:CC:FC\t\tAmazon Technologies Inc.\nAC:CE:8F\t\tHwa Yao Technologies Co., Ltd\nAC:CE:92\t\tNew H3C Technologies Co., Ltd\nAC:CF:23\t\tHi-flying electronics technology Co.,Ltd\nAC:CF:5C\t\tApple, Inc.\nAC:CF:7B\t\tIngram Micro Services\nAC:CF:85\t\tHuawei Technologies Co.,Ltd\nAC:D0:74\t\tEspressif Inc.\nAC:D1:80\t\tCrexendo Business Solutions, Inc.\nAC:D1:B8\t\tHon Hai Precision Ind. Co.,Ltd.\nAC:D3:1D\t\tCisco Meraki\nAC:D3:64\t\tAbb Spa, Abb Sace Div.\nAC:D5:64\t\tChongqing Fugui Electronics Co.,Ltd.\nAC:D6:18\t\tOnePlus Technology (Shenzhen) Co., Ltd\nAC:D6:57\t\tShaanxi GuoLian Digital TV Technology Co.,Ltd.\nAC:D7:5B\t\tSagemcom Broadband SAS\nAC:D8:29\t\tBouffalo Lab (Nanjing) Co., Ltd.\nAC:D8:A7\t\tBELLDESIGN Inc.\nAC:D9:29\t\tQuectel Wireless Solutions Co.,Ltd.\nAC:D9:D6\t\ttci GmbH\nAC:DB:22\t\tMarquardt Schaltsysteme SCS\nAC:DB:48\t\tCommscope\nAC:DB:DA\t\tShenzhen Geniatech Inc, Ltd\nAC:DC:CA\t\tHuawei Technologies Co.,Ltd\nAC:DC:E5\t\tProcter & Gamble Company\nAC:DE:48\t\tPrivate\nAC:DF:9F\t\tArcadyan Corporation\nAC:DF:A1\t\tApple, Inc.\nAC:E0:10\t\tLiteon Technology Corporation\nAC:E0:69\t\tISAAC Instruments\nAC:E0:D6\t\tkoreabts\nAC:E1:4F\t\tAutonomic Controls, Inc.\nAC:E2:15\t\tHuawei Technologies Co.,Ltd\nAC:E2:D3\t\tHewlett Packard\nAC:E3:42\t\tHuawei Technologies Co.,Ltd\nAC:E3:48\t\tMadgeTech, Inc\nAC:E4:03\t\tShenzhen Visteng Technology CO.,LTD\nAC:E4:2E\t\tSK hynix\nAC:E4:B5\t\tApple, Inc.\nAC:E5:F0\t\tDoppler Labs\nAC:E6:4B\t\tShenzhen Baojia Battery Technology Co., Ltd.\nAC:E7:7B\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nAC:E8:7B\t\tHuawei Technologies Co.,Ltd\nAC:E8:7E\t\tBytemark Computer Consulting Ltd\nAC:E9:7F\t\tIoT Tech Limited\nAC:E9:AA\t\tHay Systems Ltd\nAC:EA:6A\t\tGenix Infocomm Co., Ltd.\nAC:EA:EA\t\tHuawei Technologies Co.,Ltd\nAC:EB:51\t\tUniversal Electronics, Inc.\nAC:EC:80\t\tCommscope\nAC:EC:85\t\teero inc.\nAC:ED:32\t\tExtreme Networks Headquarters\nAC:ED:5C\t\tIntel Corporate\nAC:EE:3B\t\t6harmonics Inc\nAC:EE:64\t\tShenzhen SuperElectron Technology Co.,Ltd.\nAC:EE:70\t\tFontem Ventures BV\nAC:EE:9E\t\tSamsung Electronics Co.,Ltd\nAC:EF:92\t\tIEEE Registration Authority\nAC:EF:92:00:00:00/28\tCeer National Automotive Company\nAC:EF:92:10:00:00/28\tDongguan Sunhans Technology Co., Ltd.\nAC:EF:92:20:00:00/28\tEVA Precision Industrial Holdings Limited\nAC:EF:92:30:00:00/28\tJiZhiKang (Beijing) Technology Co., Ltd\nAC:EF:92:40:00:00/28\tLift Controls Private Limited\nAC:EF:92:50:00:00/28\tPROGNOST Systems GmbH\nAC:EF:92:60:00:00/28\tshenzhen Microlumin Electronic Technology Co., Ltd.\nAC:EF:92:70:00:00/28\tAbc Optic Solution Srl\nAC:EF:92:80:00:00/28\tHangzhou Lifesmart Technology Co., Ltd.\nAC:EF:92:90:00:00/28\tDKK North America\nAC:EF:92:A0:00:00/28\tTechyauld Co.,Ltd\nAC:EF:92:B0:00:00/28\tHunan ciwei intelligent Technology Co., LTD\nAC:EF:92:C0:00:00/28\tGanzhou Dehuida Technology Co., Ltd\nAC:EF:92:D0:00:00/28\tRobotic Assistance Devices Residential Inc\nAC:EF:92:E0:00:00/28\tJet Optoelectronics Co., Ltd.\nAC:F0:B2\t\tBecker Electronics Taiwan Ltd.\nAC:F1:08\t\tLG Innotek\nAC:F1:DF\t\tD-Link International\nAC:F2:3C\t\tCloud Network Technology Singapore Pte. Ltd.\nAC:F2:C5\t\tCisco Systems, Inc\nAC:F4:2C\t\tEarda Technologies co Ltd\nAC:F4:73\t\tiRobot Corporation\nAC:F5:E6\t\tCisco Systems, Inc\nAC:F6:F7\t\tLG Electronics (Mobile Communications)\nAC:F7:0D\t\tChina Mobile Group Device Co.,Ltd.\nAC:F7:F3\t\tXiaomi Communications Co Ltd\nAC:F8:5C\t\tChengdu Higon Integrated Circuit Design Co,. Ltd.\nAC:F8:CC\t\tCommscope\nAC:F9:70\t\tHuawei Technologies Co.,Ltd\nAC:F9:7E\t\tElesys Inc.\nAC:FA:A5\t\tdigitron\nAC:FA:E4\t\tNintendo Co.,Ltd\nAC:FB:C2\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nAC:FC:82\t\tShenzhen Sundray Technologies company Limited\nAC:FC:E3\t\tEM Microelectronic\nAC:FD:93\t\tWeifang Goertek Electronics Co.,Ltd\nAC:FD:CE\t\tIntel Corporate\nAC:FD:EC\t\tApple, Inc.\nAC:FE:05\t\tItel Mobile Limited\nAC:FF:6B\t\tHuawei Technologies Co.,Ltd\nB0:00:73\t\tWistron Neweb Corporation\nB0:00:B4\t\tCisco Systems, Inc\nB0:02:47\t\tAMPAK Technology, Inc.\nB0:02:7E\t\tMuller Services\nB0:05:94\t\tLiteon Technology Corporation\nB0:08:75\t\tHuawei Technologies Co.,Ltd\nB0:08:BF\t\tVital Connect, Inc.\nB0:09:D3\t\tAvizia\nB0:09:DA\t\tRing Solutions\nB0:0A:D5\t\tzte corporation\nB0:0B:22\t\tHuawei Device Co., Ltd.\nB0:0C:9D\t\tQuectel Wireless Solutions Co.,Ltd.\nB0:0C:D1\t\tHewlett Packard\nB0:10:41\t\tHon Hai Precision Ind. Co.,Ltd.\nB0:10:4B\t\tFiberhome Telecommunication Technologies Co.,LTD\nB0:10:A0\t\tTexas Instruments\nB0:12:03\t\tDynamics Hong Kong Limited\nB0:12:66\t\tFutaba-Kikaku\nB0:14:08\t\tLightspeed International Co.\nB0:16:56\t\tHuawei Technologies Co.,Ltd\nB0:17:43\t\tEdison Global Circuits Llc\nB0:18:31\t\tApple, Inc.\nB0:18:86\t\tSmarDTV Corporation\nB0:19:21\t\tTP-Link Systems Inc\nB0:19:C6\t\tApple, Inc.\nB0:1B:4B\t\tInvisible Fun Studio Limited\nB0:1B:7C\t\tOntrol A.S.\nB0:1B:D2\t\tLe Shi Zhi Xin Electronic Technology (Tianjin) Limited\nB0:1C:0C\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\nB0:1C:91\t\tElim Co\nB0:1F:29\t\tHelvetia INC.\nB0:1F:47\t\tHeights Telecom T ltd\nB0:1F:81\t\tIEEE Registration Authority\nB0:1F:81:00:00:00/28\tDalian GigaTec Electronics Co.,Ltd\nB0:1F:81:10:00:00/28\tUvax Concepts\nB0:1F:81:20:00:00/28\tPrivate\nB0:1F:81:30:00:00/28\tSound United\nB0:1F:81:40:00:00/28\tShenzhen Yifang Digital Technology Co.,Ltd.\nB0:1F:81:50:00:00/28\tShenzhen Grid Technology Co.,Ltd\nB0:1F:81:60:00:00/28\tCOMOTA Co., Ltd.\nB0:1F:81:70:00:00/28\tAether Services, Inc.\nB0:1F:81:80:00:00/28\tTechnion Oy\nB0:1F:81:90:00:00/28\tCIDE Interactive\nB0:1F:81:A0:00:00/28\tSteffens Systems GmbH\nB0:1F:81:B0:00:00/28\tRademacher Geraete-Elektronik GmbH\nB0:1F:81:C0:00:00/28\tAccess Device Integrated Communications Corp.\nB0:1F:81:D0:00:00/28\tTAIWAN Anjie Electronics Co.,Ltd.\nB0:1F:81:E0:00:00/28\tAdvanced & Wise Technology Corp.\nB0:1F:81:F0:00:00/28\tPrivate\nB0:1F:8C\t\tHewlett Packard Enterprise\nB0:21:6F\t\tHuawei Technologies Co.,Ltd\nB0:22:7A\t\tHP Inc.\nB0:23:47\t\tShenzhen Giant Microelectronics Company Limited\nB0:24:91\t\tHuawei Device Co., Ltd.\nB0:24:F3\t\tProgeny Systems\nB0:25:AA\t\tAIstone Global Limited\nB0:26:28\t\tBroadcom Limited\nB0:26:80\t\tCisco Systems, Inc\nB0:27:CF\t\tExtreme Networks Headquarters\nB0:28:5B\t\tJUHUA Technology Inc.\nB0:2A:1F\t\tWingtech Group (HongKong）Limited\nB0:2A:43\t\tGoogle, Inc.\nB0:2E:E0\t\tHuawei Device Co., Ltd.\nB0:30:55\t\tChina Mobile IOT Company Limited\nB0:30:C8\t\tTeal Drones, Inc.\nB0:32:26\t\tKeheng Information Industry Co., Ltd.\nB0:33:66\t\tvivo Mobile Communication Co., Ltd.\nB0:33:A6\t\tJuniper Networks\nB0:34:95\t\tApple, Inc.\nB0:34:FB\t\tShenZhen Microtest Automation Co.,Ltd\nB0:35:0B\t\tMobiwire Mobiles (Ningbo) Co.,Ltd\nB0:35:8D\t\tNokia Corporation\nB0:35:9F\t\tIntel Corporate\nB0:35:B5\t\tApple, Inc.\nB0:37:95\t\tLG Electronics\nB0:38:29\t\tSiliconware Precision Industries Co., Ltd.\nB0:38:50\t\tNanjing CAS-ZDC IOT SYSTEM CO.,LTD\nB0:38:6C\t\tEFM Networks\nB0:38:93\t\tOnda TLC Italia S.r.l.\nB0:38:E2\t\tWanan Hongsheng Electronic Co.Ltd\nB0:39:56\t\tNetgear\nB0:3A:CE\t\tHuawei Device Co., Ltd.\nB0:3B:1B\t\tKontrolnext Technology (Beijing) Ltd.\nB0:3C:DC\t\tIntel Corporate\nB0:3D:96\t\tVision Valley FZ LLC\nB0:3D:C2\t\tWasp artificial intelligence(Shenzhen) Co.,ltd\nB0:3E:51\t\tSky Uk Limited\nB0:3E:B0\t\tMICRODIA Ltd.\nB0:3F:64\t\tApple, Inc.\nB0:40:89\t\tSenient Systems LTD\nB0:41:1D\t\tITTIM Technologies\nB0:41:6F\t\tShenzhen Maxtang Computer Co.,Ltd\nB0:43:5D\t\tNuLEDs, Inc.\nB0:44:14\t\tNew H3C Technologies Co., Ltd\nB0:44:9C\t\tAssa Abloy AB - Yale\nB0:45:02\t\tHuawei Device Co., Ltd.\nB0:45:15\t\tmira fitness,LLC.\nB0:45:19\t\tTCT mobile ltd\nB0:45:30\t\tSky Uk Limited\nB0:45:45\t\tYACOUB Automation GmbH\nB0:46:92\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nB0:46:FC\t\tMitraStar Technology Corp.\nB0:47:5E\t\tIEEE Registration Authority\nB0:47:5E:00:00:00/28\tShenzhen C & D Electronics Co., Ltd.\nB0:47:5E:10:00:00/28\ttintech\nB0:47:5E:20:00:00/28\tLanmus Networks Ltd\nB0:47:5E:30:00:00/28\tQsic Pty Ltd\nB0:47:5E:40:00:00/28\tAnnapurna labs\nB0:47:5E:50:00:00/28\tOmnitech Security\nB0:47:5E:60:00:00/28\tDRS Sustainment Systems, Inc.\nB0:47:5E:70:00:00/28\tMK Vision Joint Stock Company\nB0:47:5E:80:00:00/28\tShri Mohan Ji International\nB0:47:5E:90:00:00/28\tMIVO Technology AB\nB0:47:5E:A0:00:00/28\tShenzhen Jointelli Technologies Co.,Ltd\nB0:47:5E:B0:00:00/28\tBright Oceans Inter-Telecom Corporation\nB0:47:5E:C0:00:00/28\tikegawa co., Ltd\nB0:47:5E:D0:00:00/28\tNetitest\nB0:47:5E:E0:00:00/28\tNEO.NET Jakub Koperski\nB0:47:BF\t\tSamsung Electronics Co.,Ltd\nB0:47:E9\t\tIntel Corporate\nB0:48:1A\t\tApple, Inc.\nB0:48:7A\t\tTp-Link Technologies Co.,Ltd.\nB0:49:5F\t\tOMRON HEALTHCARE Co., Ltd.\nB0:4A:39\t\tBeijing Roborock Technology Co., Ltd.\nB0:4A:6A\t\tSamsung Electronics Co.,Ltd\nB0:4A:B4\t\tMotorola Mobility LLC, a Lenovo Company\nB0:4B:68\t\tNAKAYO Inc\nB0:4B:BF\t\tPt Han Sung Electoronics Indonesia\nB0:4C:05\t\tFresenius Medical Care Deutschland GmbH\nB0:4E:26\t\tTp-Link Technologies Co.,Ltd.\nB0:4F:13\t\tDell Inc.\nB0:4F:3C\t\tGenuine Optics\nB0:4F:A6\t\tDongGuan Ramaxel Memory Technology\nB0:4F:C3\t\tShenzhen NVC Cloud Technology Co., Ltd.\nB0:50:BC\t\tShenzhen Basicom Electronic Co.,Ltd.\nB0:51:8E\t\tHoll technology CO.Ltd.\nB0:52:16\t\tHon Hai Precision Ind. Co.,Ltd.\nB0:52:46\t\tNXP Semiconductor (Tianjin) LTD.\nB0:53:65\t\tChina Mobile IOT Company Limited\nB0:54:76\t\tSamsung Electronics Co.,Ltd\nB0:55:08\t\tHuawei Technologies Co.,Ltd\nB0:57:06\t\tVallox Oy\nB0:58:C4\t\tBroadcast Microwave Services, Inc\nB0:59:47\t\tShenzhen Qihu Intelligent Technology Company Limited\nB0:5A:44\t\tFibocom Wireless Inc.\nB0:5A:7B\t\tHuawei Device Co., Ltd.\nB0:5A:DA\t\tHewlett Packard\nB0:5B:1F\t\tThermo Fisher Scientific S.P.A.\nB0:5B:67\t\tHuawei Technologies Co.,Ltd\nB0:5B:99\t\tSagemcom Broadband SAS\nB0:5C:16\t\tFiberhome Telecommunication Technologies Co.,LTD\nB0:5C:DA\t\tHP Inc.\nB0:5C:E5\t\tNokia Corporation\nB0:5D:D4\t\tCommscope\nB0:60:88\t\tIntel Corporate\nB0:61:C7\t\tEricsson-LG Enterprise\nB0:65:3A\t\tMurata Manufacturing Co., Ltd.\nB0:65:63\t\tShanghai Railway Communication Factory\nB0:65:BD\t\tApple, Inc.\nB0:65:F1\t\tWIO Manufacturing HK Limited\nB0:67:2F\t\tBowers & Wilkins\nB0:67:B5\t\tApple, Inc.\nB0:68:B6\t\tHangzhou OYE Technology Co. Ltd\nB0:68:E6\t\tChongqing Fugui Electronics Co.,Ltd.\nB0:69:71\t\tDEI Sales, Inc.\nB0:6A:41\t\tGoogle, Inc.\nB0:6B:11\t\tHui Zhou Gaoshengda Technology Co.,LTD\nB0:6B:B3\t\tGrt\nB0:6C:BF\t\t3ality Digital Systems GmbH\nB0:6E:72\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nB0:6E:BF\t\tASUSTek COMPUTER INC.\nB0:6F:E0\t\tSamsung Electronics Co.,Ltd\nB0:70:0D\t\tNokia\nB0:70:2D\t\tApple, Inc.\nB0:72:19\t\tApple, Inc.\nB0:72:BF\t\tMurata Manufacturing Co., Ltd.\nB0:73:5D\t\tHuawei Device Co., Ltd.\nB0:73:9C\t\tAmazon Technologies Inc.\nB0:75:0C\t\tQA Cafe\nB0:75:4D\t\tNokia\nB0:75:D5\t\tzte corporation\nB0:76:1B\t\tHuawei Technologies Co.,Ltd\nB0:77:AC\t\tCommscope\nB0:78:39\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nB0:78:70\t\tWi-NEXT, Inc.\nB0:78:F0\t\tBeijing HuaqinWorld Technology Co.,Ltd.\nB0:79:08\t\tCummings Engineering\nB0:79:3C\t\tRevolv Inc\nB0:79:94\t\tMotorola Mobility LLC, a Lenovo Company\nB0:7A:DF\t\tHuawei Technologies Co.,Ltd\nB0:7B:25\t\tDell Inc.\nB0:7C:51\t\tRuckus Wireless\nB0:7C:8E\t\tBrother Industries, LTD.\nB0:7D:47\t\tCisco Systems, Inc\nB0:7D:62\t\tDipl.-Ing. H. Horstmann GmbH\nB0:7D:64\t\tIntel Corporate\nB0:7E:11\t\tTexas Instruments\nB0:7E:70\t\tZadara Storage Ltd.\nB0:7F:B9\t\tNetgear\nB0:80:8C\t\tLaser Light Engines\nB0:81:01\t\tHonor Device Co., Ltd.\nB0:81:84\t\tEspressif Inc.\nB0:81:D8\t\tI-sys Corp\nB0:83:D6\t\tCommscope\nB0:83:FE\t\tDell Inc.\nB0:86:9E\t\tChloride S.r.L\nB0:88:07\t\tStrata Worldwide\nB0:89:00\t\tHuawei Technologies Co.,Ltd\nB0:89:91\t\tLge\nB0:89:C2\t\tZyptonite\nB0:8B:92\t\tzte corporation\nB0:8B:9E\t\tTelechips, Inc.\nB0:8B:A8\t\tAmazon Technologies Inc.\nB0:8B:BE\t\tABL GmbH\nB0:8B:CF\t\tCisco Systems, Inc\nB0:8B:D0\t\tCisco Systems, Inc\nB0:8C:75\t\tApple, Inc.\nB0:8D:57\t\tCisco Systems, Inc\nB0:8E:1A\t\tURadio Systems Co., Ltd\nB0:90:74\t\tFulan Electronics Limited\nB0:90:7E\t\tCisco Systems, Inc\nB0:90:D4\t\tShenzhen Hoin Internet Technology Co., Ltd\nB0:91:22\t\tTexas Instruments\nB0:91:34\t\tTaleo\nB0:91:37\t\tISis ImageStream Internet Solutions, Inc\nB0:92:00\t\tApple, Inc.\nB0:92:4A\t\tSagemcom Broadband SAS\nB0:93:5B\t\tCommscope\nB0:95:75\t\tTp-Link Technologies Co.,Ltd.\nB0:95:8E\t\tTp-Link Technologies Co.,Ltd.\nB0:96:6C\t\tLanbowan Technology Ltd.\nB0:96:EA\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nB0:97:38\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nB0:97:3A\t\tE-Fuel Corporation\nB0:98:2B\t\tSagemcom Broadband SAS\nB0:98:9F\t\tLg Cns\nB0:98:BC\t\tHuawei Device Co., Ltd.\nB0:99:28\t\tFujitsu Limited\nB0:99:5A\t\tHuawei Technologies Co.,Ltd\nB0:99:D7\t\tSamsung Electronics Co.,Ltd\nB0:9A:E2\t\tSTEMMER IMAGING GmbH\nB0:9B:D4\t\tGNH Software India Private Limited\nB0:9C:63\t\tXiaomi Communications Co Ltd\nB0:9E:1B\t\tButlr Technologies, Inc.\nB0:9F:BA\t\tApple, Inc.\nB0:A1:0A\t\tPivotal Systems Corporation\nB0:A1:87\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nB0:A2:E7\t\tShenzhen TINNO Mobile Technology Corp.\nB0:A3:7E\t\tQing Dao Haier Telecom Co.,Ltd.\nB0:A3:F2\t\tHuaqin Technology Co. LTD\nB0:A4:54\t\tTripwire Inc.\nB0:A4:60\t\tIntel Corporate\nB0:A4:F0\t\tHuawei Technologies Co.,Ltd\nB0:A6:51\t\tCisco Systems, Inc\nB0:A6:F5\t\tXaptum, Inc.\nB0:A7:2A\t\tEnsemble Designs, Inc.\nB0:A7:32\t\tEspressif Inc.\nB0:A7:37\t\tRoku, Inc.\nB0:A7:B9\t\tTP-Link Systems Inc\nB0:A7:D2\t\tFiberhome Telecommunication Technologies Co.,LTD\nB0:A8:6E\t\tJuniper Networks\nB0:AA:36\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nB0:AA:77\t\tCisco Systems, Inc\nB0:AA:D2\t\tSichuan tianyi kanghe communications co., LTD\nB0:AC:82\t\tChina Dragon Technology Limited\nB0:AC:D2\t\tzte corporation\nB0:AC:FA\t\tFujitsu Limited\nB0:AD:AA\t\tAvaya Inc\nB0:AE:25\t\tVarikorea\nB0:AF:F7\t\tShenzhen Yipingfang Network Technology Co., Ltd.\nB0:B1:13\t\tTexas Instruments\nB0:B1:94\t\tzte corporation\nB0:B2:1C\t\tEspressif Inc.\nB0:B2:8F\t\tSagemcom Broadband SAS\nB0:B2:DC\t\tZyxel Communications Corporation\nB0:B3:2B\t\tSlican Sp. z o.o.\nB0:B3:53\t\tIEEE Registration Authority\nB0:B3:53:00:00:00/28\tBlake UK\nB0:B3:53:10:00:00/28\tSprocomm Technologies CO.,LTD.\nB0:B3:53:20:00:00/28\tRizhao SUNWAM International Co., Ltd.\nB0:B3:53:30:00:00/28\tAd Hoc Developments S.L\nB0:B3:53:40:00:00/28\tInnotas Elektronik GmbH\nB0:B3:53:50:00:00/28\tZenlayer\nB0:B3:53:60:00:00/28\tHangzhou Hikrobot Technology Co., Ltd.\nB0:B3:53:70:00:00/28\tWuuk Labs Corp.\nB0:B3:53:80:00:00/28\tVoxiscom\nB0:B3:53:90:00:00/28\tHanmecips Co.\nB0:B3:53:A0:00:00/28\tLedger\nB0:B3:53:B0:00:00/28\tZoox\nB0:B3:53:C0:00:00/28\tBeijing Geekplus Technology Co.,Ltd.\nB0:B3:53:D0:00:00/28\tIPvideo Corporation\nB0:B3:53:E0:00:00/28\tNanjing Yining Intelligent Technology Co., Ltd.\nB0:B3:69\t\tShenzhen SDMC Technology CO.,Ltd.\nB0:B3:AD\t\tHUMAX Co., Ltd.\nB0:B4:48\t\tTexas Instruments\nB0:B5:C3\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nB0:B5:E8\t\tRuroc LTD\nB0:B8:67\t\tHewlett Packard Enterprise\nB0:B8:D5\t\tNanjing Nengrui Auto Equipment CO.,Ltd\nB0:B9:8A\t\tNetgear\nB0:BB:8B\t\tWavetel Technology Limited\nB0:BB:E5\t\tSagemcom Broadband SAS\nB0:BC:7A\t\tHarman/Becker Automotive Systems GmbH\nB0:BD:1B\t\tDongguan Liesheng Electronic Co., Ltd.\nB0:BD:6D\t\tEchostreams Innovative Solutions\nB0:BD:A1\t\tZaklad Elektroniczny Sims\nB0:BE:76\t\tTp-Link Technologies Co.,Ltd.\nB0:BE:83\t\tApple, Inc.\nB0:BF:99\t\tWizitdongdo\nB0:C0:90\t\tChicony Electronics Co., Ltd.\nB0:C1:28\t\tAdler ELREHA GmbH\nB0:C1:9E\t\tzte corporation\nB0:C2:05\t\tBionime\nB0:C2:87\t\tVantiva USA LLC\nB0:C2:C7\t\tMotorola Mobility LLC, a Lenovo Company\nB0:C3:87\t\tGOEFER, Inc.\nB0:C3:8E\t\tHuawei Device Co., Ltd.\nB0:C4:6C\t\tSenseit\nB0:C4:E7\t\tSamsung Electronics Co.,Ltd\nB0:C5:3C\t\tCisco Systems, Inc\nB0:C5:54\t\tD-Link International\nB0:C5:59\t\tSamsung Electronics Co.,Ltd\nB0:C5:CA\t\tIEEE Registration Authority\nB0:C5:CA:00:00:00/28\tEM-Tech\nB0:C5:CA:10:00:00/28\tIvk-Sayany\nB0:C5:CA:20:00:00/28\tLOWOTEC GmbH\nB0:C5:CA:30:00:00/28\tabode systems, inc.\nB0:C5:CA:40:00:00/28\tshanghai University Ding-Tech software Corp.,ltd\nB0:C5:CA:50:00:00/28\tSystovi\nB0:C5:CA:60:00:00/28\tSunTech Medical, Inc.\nB0:C5:CA:70:00:00/28\tShenzhen Ktc Technology Group\nB0:C5:CA:80:00:00/28\tAstyx GmbH\nB0:C5:CA:90:00:00/28\tD&T Inc.\nB0:C5:CA:A0:00:00/28\tTEM Mobile Limited\nB0:C5:CA:B0:00:00/28\tRisecomm  (Hk) Technology Co. Limited\nB0:C5:CA:C0:00:00/28\tXMetrics\nB0:C5:CA:D0:00:00/28\tPrivate\nB0:C5:CA:E0:00:00/28\tAudio Elektronik İthalat İhracat San ve Tic A.Ş.\nB0:C5:CA:F0:00:00/28\tPrivate\nB0:C6:1C\t\tHuawei Technologies Co.,Ltd\nB0:C6:9A\t\tJuniper Networks\nB0:C7:45\t\tBuffalo.Inc\nB0:C7:87\t\tHuawei Technologies Co.,Ltd\nB0:C7:DE\t\tSilicon Laboratories\nB0:C8:3F\t\tJiangsu Cynray IOT Co., Ltd.\nB0:C8:AD\t\tPeople Power Company\nB0:C9:52\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nB0:C9:5B\t\tBeijing Symtech CO.,LTD\nB0:CA:68\t\tApple, Inc.\nB0:CA:E7\t\tHuawei Device Co., Ltd.\nB0:CC:CE\t\tIEEE Registration Authority\nB0:CC:CE:00:00:00/28\tSteelco SpA\nB0:CC:CE:10:00:00/28\tAgrisys A/S\nB0:CC:CE:20:00:00/28\t4MOD Technology\nB0:CC:CE:30:00:00/28\tGateview Technologies\nB0:CC:CE:40:00:00/28\tShenzhen Xtooltech Intelligent Co.,Ltd.\nB0:CC:CE:50:00:00/28\tBeijing Viazijing Technology Co., Ltd.\nB0:CC:CE:60:00:00/28\tMulti-Field Low Temperature Technology(Beijing) Co., Ltd.\nB0:CC:CE:70:00:00/28\tEBI Patient Care, Inc.\nB0:CC:CE:80:00:00/28\tShanghai CloudPrime.ai Technology Co, Ltd\nB0:CC:CE:90:00:00/28\tTaiv Inc\nB0:CC:CE:A0:00:00/28\tShenzhen Dangs Science and Technology CO.,Ltd.\nB0:CC:CE:B0:00:00/28\tWatermark Systems (India) Private Limited\nB0:CC:CE:C0:00:00/28\tFaaftech\nB0:CC:CE:D0:00:00/28\tXiaomi EV Technology Co., Ltd.\nB0:CC:CE:E0:00:00/28\tMicrotest\nB0:CC:FE\t\tHuawei Device Co., Ltd.\nB0:CE:18\t\tZhejiang shenghui lighting co.,Ltd\nB0:CF:0E\t\tMellanox Technologies, Inc.\nB0:CF:4D\t\tMI-Zone Technology Ireland\nB0:CF:CB\t\tAmazon Technologies Inc.\nB0:D0:9C\t\tSamsung Electronics Co.,Ltd\nB0:D1:D6\t\tNokia Shanghai Bell Co., Ltd.\nB0:D2:78\t\tTexas Instruments\nB0:D2:F5\t\tVello Systems, Inc.\nB0:D4:1F\t\tMobititecabsolut S.A.\nB0:D5:68\t\tShenzhen Cultraview Digital Technology Co., Ltd\nB0:D5:76\t\tApple, Inc.\nB0:D5:9D\t\tShenzhen Zowee Technology Co., Ltd\nB0:D5:CC\t\tTexas Instruments\nB0:D5:FB\t\tGoogle, Inc.\nB0:D7:7E\t\tHuawei Technologies Co.,Ltd\nB0:D7:C5\t\tLogipix Ltd\nB0:D7:CC\t\tTridonic GmbH & Co KG\nB0:D8:88\t\tPanasonic Automotive Systems Co.,Ltd\nB0:DA:00\t\tCera Electronique\nB0:DA:F9\t\tCommscope\nB0:DC:EF\t\tIntel Corporate\nB0:DD:74\t\tHeimgard Technologies AS\nB0:DE:28\t\tApple, Inc.\nB0:DF:3A\t\tSamsung Electronics Co.,Ltd\nB0:DF:C1\t\tTenda Technology Co.,Ltd.Dongguan branch\nB0:E0:3C\t\tTCT mobile ltd\nB0:E1:7E\t\tHuawei Technologies Co.,Ltd\nB0:E2:35\t\tXiaomi Communications Co Ltd\nB0:E2:E5\t\tFiberhome Telecommunication Technologies Co.,LTD\nB0:E3:9D\t\tCat System Co.,Ltd.\nB0:E4:5C\t\tSamsung Electronics Co.,Ltd\nB0:E4:D5\t\tGoogle, Inc.\nB0:E5:0E\t\tNrg Systems Inc\nB0:E5:ED\t\tHuawei Technologies Co.,Ltd\nB0:E5:EF\t\tApple, Inc.\nB0:E5:F9\t\tApple, Inc.\nB0:E7:1D\t\tShanghai Maigantech Co.,Ltd\nB0:E7:54\t\t2Wire Inc\nB0:E7:DE\t\tHoma Technologies JSC\nB0:E8:92\t\tSeiko Epson Corporation\nB0:E9:7E\t\tAdvanced Micro Peripherals\nB0:E9:FE\t\tWoan Technology (Shenzhen) Co., Ltd.\nB0:EA:19\t\tTPV Audio and Visual Technology (Shenzhen) Co.,Ltd.\nB0:EA:BC\t\tAskey Computer Corp\nB0:EB:57\t\tHuawei Technologies Co.,Ltd\nB0:EB:7F\t\tJuniper Networks\nB0:EC:71\t\tSamsung Electronics Co.,Ltd\nB0:EC:8F\t\tGmx Sas\nB0:EC:DD\t\tHuawei Technologies Co.,Ltd\nB0:EC:E1\t\tPrivate\nB0:EE:45\t\tAzureWave Technology Inc.\nB0:EE:7B\t\tRoku, Inc\nB0:F0:0C\t\tDongguan Wecxw CO.,Ltd.\nB0:F1:A3\t\tFengfan (BeiJing) Technology Co., Ltd.\nB0:F1:BC\t\tDhemax Ingenieros Ltda\nB0:F1:D8\t\tApple, Inc.\nB0:F1:EC\t\tAMPAK Technology, Inc.\nB0:F2:08\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\nB0:F2:F6\t\tSamsung Electronics Co.,Ltd\nB0:F3:E9\t\tPATEO CONNECT (Xiamen) Co., Ltd.\nB0:F5:30\t\tHitron Technologies. Inc\nB0:F5:C8\t\tAMPAK Technology Inc.\nB0:F7:C4\t\tAmazon Technologies Inc.\nB0:F8:93\t\tShanghai MXCHIP Information Technology Co., Ltd.\nB0:F9:63\t\tHangzhou H3C Technologies Co., Limited\nB0:FA:8B\t\tHuawei Device Co., Ltd.\nB0:FA:91\t\tEM Microelectronic\nB0:FA:EB\t\tCisco Systems, Inc\nB0:FB:15\t\tLaird Connectivity\nB0:FB:DD\t\tShenzhen SuperElectron Technology Co.,Ltd.\nB0:FC:0D\t\tAmazon Technologies Inc.\nB0:FC:36\t\tCyberTAN Technology Inc.\nB0:FC:88\t\tSagemcom Broadband SAS\nB0:FD:0B\t\tIEEE Registration Authority\nB0:FD:0B:00:00:00/28\tTAE HYUNG Industrial Electronics Co., Ltd.\nB0:FD:0B:10:00:00/28\tIDspire Corporation Ltd.\nB0:FD:0B:20:00:00/28\tVista Manufacturing\nB0:FD:0B:30:00:00/28\tDMAC Security LLC\nB0:FD:0B:40:00:00/28\tFasii Information Technology (Shanghai) Ltd.\nB0:FD:0B:50:00:00/28\tTaian Yuqi Communication Technology Co., Ltd\nB0:FD:0B:60:00:00/28\tDNESO TEN Ltd.\nB0:FD:0B:70:00:00/28\tEverynet Oy\nB0:FD:0B:80:00:00/28\teSenseLab Ltd.\nB0:FD:0B:90:00:00/28\tEagle Acoustics Manufacturing, LLC\nB0:FD:0B:A0:00:00/28\tTemco Japan Co., Ltd.\nB0:FD:0B:B0:00:00/28\tMartinLogan, Ltd.\nB0:FD:0B:C0:00:00/28\tHaltian Products Oy\nB0:FD:0B:D0:00:00/28\tHabana Labs LTD.\nB0:FD:0B:E0:00:00/28\tShenzhen FEIBIT Electronic Technology Co.,LTD\nB0:FE:BD\t\tPrivate\nB0:FE:E5\t\tHuawei Device Co., Ltd.\nB0:FF:72\t\tIEEE Registration Authority\nB0:FF:72:00:00:00/28\tShenYang LeShun Technology Co.,Ltd\nB0:FF:72:10:00:00/28\tGuangzhou Senguang Communication Technology Co., Ltd\nB0:FF:72:20:00:00/28\tMVT Elektrik Sanayi ve Ticaret Limited Sirketi\nB0:FF:72:30:00:00/28\tHammerhead Navigation Inc.\nB0:FF:72:40:00:00/28\tJiangxi Xingchi Electronic Technology Co.,Ltd.\nB0:FF:72:50:00:00/28\tShenzhen Ruilian Electronic Technology Co.,Ltd\nB0:FF:72:60:00:00/28\tTachyon Energy\nB0:FF:72:70:00:00/28\tBL Innovare\nB0:FF:72:80:00:00/28\tERA RF Technologies\nB0:FF:72:90:00:00/28\tJIUYEE?shenzhen) Medical Technology Co.,Ltd\nB0:FF:72:A0:00:00/28\tSimple Things\nB0:FF:72:B0:00:00/28\tLaunch Tech Co., Ltd.\nB0:FF:72:C0:00:00/28\tHopewheel info.Co.,Ltd.\nB0:FF:72:D0:00:00/28\tTBB Renewable (Xiamen) Co Ltd\nB0:FF:72:E0:00:00/28\tHANNING & KAHL GmbH & Co. KG\nB4:00:16\t\tIngenico Terminals Sas\nB4:00:9C\t\tCableWorld Ltd.\nB4:01:42\t\tGCI Science & Technology Co.,LTD\nB4:02:16\t\tCisco Systems, Inc\nB4:02:F2\t\tSynaptics, Inc\nB4:04:18\t\tSmartchip Integrated Inc.\nB4:04:21\t\tzte corporation\nB4:05:5D\t\tIEIT SYSTEMS Co., Ltd.\nB4:05:66\t\tSP Best Corporation Co., LTD.\nB4:05:A1\t\tXiaomi Communications Co Ltd\nB4:07:F9\t\tSamsung Electro Mechanics Co., Ltd.\nB4:08:32\t\tTC Communications\nB4:09:31\t\tHuawei Technologies Co.,Ltd\nB4:0A:C6\t\tDEXON Systems Ltd.\nB4:0A:D8\t\tSony Interactive Entertainment Inc.\nB4:0B:1D\t\tSamsung Electronics Co.,Ltd\nB4:0B:44\t\tSmartisan Technology Co., Ltd.\nB4:0B:78\t\tBrusa Elektronik AG\nB4:0B:7A\t\tBrusa Elektronik AG\nB4:0C:25\t\tPalo Alto Networks\nB4:0E:06\t\tThird Reality, Inc\nB4:0E:96\t\tHeran\nB4:0E:CF\t\tBouffalo Lab (Nanjing) Co., Ltd.\nB4:0E:DC\t\tLG-Ericsson Co.,Ltd.\nB4:0E:DE\t\tIntel Corporate\nB4:0F:3B\t\tTenda Technology Co.,Ltd.Dongguan branch\nB4:0F:B3\t\tvivo Mobile Communication Co., Ltd.\nB4:10:7A\t\tAmazon Technologies Inc.\nB4:10:7B\t\tTexas Instruments\nB4:13:24\t\tGoogle, Inc.\nB4:14:89\t\tCisco Systems, Inc\nB4:14:E6\t\tHuawei Technologies Co.,Ltd\nB4:15:13\t\tHuawei Technologies Co.,Ltd\nB4:15:7E\t\tCelona Inc.\nB4:16:78\t\tJuniper Networks\nB4:17:4D\t\tProject Monitor Inc\nB4:17:80\t\tDTI Group Ltd\nB4:17:A8\t\tMeta Platforms, Inc.\nB4:18:D1\t\tApple, Inc.\nB4:19:74\t\tApple, Inc.\nB4:1A:1D\t\tSamsung Electronics Co.,Ltd\nB4:1B:B0\t\tApple, Inc.\nB4:1C:30\t\tzte corporation\nB4:1C:AB\t\tICR, inc.\nB4:1D:2B\t\tShenzhen YOUHUA Technology Co., Ltd\nB4:1D:C4\t\tHuawei Technologies Co.,Ltd\nB4:1D:EF\t\tInternet Laboratories, Inc.\nB4:1E:52\t\tFlock Safety\nB4:1F:4D\t\tSony Interactive Entertainment Inc.\nB4:20:46\t\teero inc.\nB4:20:5B\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nB4:21:1D\t\tBeijing GuangXin Technology Co., Ltd\nB4:21:8A\t\tDog Hunter LLC\nB4:22:00\t\tBrother Industries, LTD.\nB4:23:30\t\tItron Inc\nB4:23:A2\t\tGoogle, Inc.\nB4:24:E7\t\tCodetek Technology Co.,Ltd\nB4:26:5D\t\tTaicang T&W Electronics\nB4:28:75\t\tFutecho Solutions Private Limited\nB4:28:F1\t\tE-Prime Co., Ltd.\nB4:29:3D\t\tShenzhen Urovo Technology Co.,Ltd.\nB4:2A:0E\t\tVantiva USA LLC\nB4:2A:39\t\tORBIT MERRET, spol. s r. o.\nB4:2B:B9\t\tHuawei Technologies Co.,Ltd\nB4:2C:92\t\tZhejiang Weirong Electronic Co., Ltd\nB4:2C:BE\t\tDirect Payment Solutions Limited\nB4:2D:56\t\tExtreme Networks Headquarters\nB4:2E:99\t\tGiga-Byte Technology Co.,Ltd.\nB4:2E:F8\t\tEline Technology co.Ltd\nB4:2F:03\t\tQuectel Wireless Solutions Co.,Ltd.\nB4:30:52\t\tHuawei Technologies Co.,Ltd\nB4:30:C0\t\tYork Instruments Ltd\nB4:31:61\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nB4:31:B8\t\tAviwest\nB4:34:6C\t\tMatsunichi Digital Technology (Hong Kong) Limited\nB4:35:22\t\tSilicon Laboratories\nB4:35:64\t\tFujian Tian Cheng Electron Science & Technical Development Co.,Ltd.\nB4:35:F7\t\tZhejiang Pearmain Electronics Co.ltd.\nB4:36:A9\t\tFibocom Wireless Inc.\nB4:36:D1\t\tRenesas Electronics (Penang) Sdn. Bhd.\nB4:36:E3\t\tKbvision Group\nB4:37:41\t\tConsert, Inc.\nB4:37:D1\t\tIEEE Registration Authority\nB4:37:D1:00:00:00/28\tLezyne INC USA\nB4:37:D1:10:00:00/28\tAlturna Networks\nB4:37:D1:20:00:00/28\tFibersystem AB\nB4:37:D1:30:00:00/28\tDimton Co.,Ltd.\nB4:37:D1:40:00:00/28\tKomsis Elektronik Sistemleri San. Tic. Ltd.Sti\nB4:37:D1:50:00:00/28\tStratom, Inc.\nB4:37:D1:60:00:00/28\tYireh Auto Tech Co.,Ltd.\nB4:37:D1:70:00:00/28\tGE Power Management\nB4:37:D1:80:00:00/28\teInfochips Limited\nB4:37:D1:90:00:00/28\tNanjing yuekong Intelligent Technology\nB4:37:D1:A0:00:00/28\tAxiomatic Technologies Corporation\nB4:37:D1:B0:00:00/28\tNSI Co., Ltd.\nB4:37:D1:C0:00:00/28\tNanjing Putian Telecommunications Technology Co.,Ltd.\nB4:37:D1:D0:00:00/28\tZXY Sport Tracking\nB4:37:D1:E0:00:00/28\tUnion Tecnologica Noxium S.L.\nB4:37:D1:F0:00:00/28\tPrivate\nB4:37:D8\t\tD-Link (Shanghai) Limited Corp.\nB4:39:34\t\tPen Generations, Inc.\nB4:39:39\t\tShenzhen TINNO Mobile Technology Corp.\nB4:39:4C\t\tHuawei Technologies Co.,Ltd\nB4:39:D6\t\tProCurve Networking by HP\nB4:3A:28\t\tSamsung Electronics Co.,Ltd\nB4:3A:31\t\tSilicon Laboratories\nB4:3A:45\t\tEspressif Inc.\nB4:3A:96\t\tArista Networks\nB4:3A:E2\t\tHuawei Technologies Co.,Ltd\nB4:3D:08\t\tGX International BV\nB4:3D:6B\t\tNXP Semiconductor (Tianjin) LTD.\nB4:3D:B2\t\tDegreane Horizon\nB4:3E:3B\t\tViableware, Inc\nB4:40:A4\t\tApple, Inc.\nB4:40:DC\t\tSamsung Electronics Co.,Ltd\nB4:41:30\t\tJabil Circuit (Guangzhou) Ltd.\nB4:41:7A\t\tShenzhen Gongjin Electronics Co.,Lt\nB4:43:0D\t\tBroadlink Pty Ltd\nB4:43:26\t\tHuawei Technologies Co.,Ltd\nB4:45:06\t\tDell Inc.\nB4:46:6B\t\tRealtimeid As\nB4:47:5E\t\tAvaya Inc\nB4:47:F5\t\tEarda Technologies co Ltd\nB4:4B:D2\t\tApple, Inc.\nB4:4B:D6\t\tIEEE Registration Authority\nB4:4B:D6:00:00:00/28\tG4S Monitoring Technologies Ltd\nB4:4B:D6:10:00:00/28\tShenzhen Tita Interactive Technology Co.,Ltd\nB4:4B:D6:20:00:00/28\tShenzhen Cudy Technology Co., Ltd.\nB4:4B:D6:30:00:00/28\tHuizhou Sunoda Technology Co. Ltd\nB4:4B:D6:40:00:00/28\tShenzhen Hi-Net Technology Co., Ltd.\nB4:4B:D6:50:00:00/28\tShenZhen Comstar Technology Company\nB4:4B:D6:60:00:00/28\tPerspicace Intellegince Technology\nB4:4B:D6:70:00:00/28\tTaizhou convergence Information technology Co.,LTD\nB4:4B:D6:80:00:00/28\tArnouse Digital Devices Corp\nB4:4B:D6:90:00:00/28\tPrivate\nB4:4B:D6:A0:00:00/28\tShenzhen Huabai Intelligent Technology Co., Ltd.\nB4:4B:D6:B0:00:00/28\tDongYoung media\nB4:4B:D6:C0:00:00/28\tImpakt S.A.\nB4:4B:D6:D0:00:00/28\tElleta Solutions Ltd\nB4:4B:D6:E0:00:00/28\tChunghsin International Electronics Co.,Ltd.\nB4:4C:3B\t\tZhejiang Dahua Technology Co., Ltd.\nB4:4C:90\t\tCisco Systems, Inc\nB4:4C:C2\t\tNr Electric Co., Ltd\nB4:4D:43\t\tIEEE Registration Authority\nB4:4D:43:00:00:00/28\tMihoyo\nB4:4D:43:10:00:00/28\tiLine Microsystems S.L. (B20956751)\nB4:4D:43:20:00:00/28\tRg Solutions Ltd\nB4:4D:43:30:00:00/28\tETSME Technologies C0., Ltd.\nB4:4D:43:40:00:00/28\tALL.SPACE Networks Ltd\nB4:4D:43:50:00:00/28\thalstrup-walcher GmbH\nB4:4D:43:60:00:00/28\tSpot AI, Inc.\nB4:4D:43:70:00:00/28\tSernet (Suzhou) Technologies Corporation\nB4:4D:43:80:00:00/28\tShenZhen Launch-Wonder Technology co., LTD\nB4:4D:43:90:00:00/28\tAd Hoc Developments S.L\nB4:4D:43:A0:00:00/28\tUAV Navigation\nB4:4D:43:B0:00:00/28\tPaulmann Licht GmbH\nB4:4D:43:C0:00:00/28\tShenzhen Kosky Technology Co.,Ltd.\nB4:4D:43:D0:00:00/28\tShenzhen CreatLentem Technology Co.,Ltd\nB4:4D:43:E0:00:00/28\tGearUP Portal Pte. Ltd.\nB4:4F:96\t\tZhejiang Xinzailing Technology co., ltd\nB4:50:62\t\tEmBestor Technology Inc.\nB4:51:F9\t\tNB Software\nB4:52:53\t\tSeagate Technology\nB4:52:7D\t\tSony Corporation\nB4:52:7E\t\tSony Corporation\nB4:52:A9\t\tTexas Instruments\nB4:54:59\t\tChina Mobile (Hangzhou) Information Technology Co., Ltd.\nB4:55:70\t\tBorea\nB4:56:5D\t\tChipsea Technologies (Shenzhen) Corp.\nB4:56:B9\t\tTeraspek Technologies Co.,Ltd\nB4:56:E3\t\tApple, Inc.\nB4:56:FA\t\tIOPSYS Software Solutions\nB4:57:E6\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nB4:58:61\t\tCRemote, LLC\nB4:59:76\t\tApple, Inc.\nB4:5B:86\t\tFunshion Online Technologies Co.,Ltd\nB4:5B:D1\t\tTP-Link Systems Inc.\nB4:5C:A4\t\tThing-talk Wireless Communication Technologies Corporation Limited\nB4:5D:50\t\tHewlett Packard Enterprise\nB4:5F:84\t\tzte corporation\nB4:60:77\t\tSichuan Changhong Electric Ltd.\nB4:60:8C\t\tFiberhome Telecommunication Technologies Co.,LTD\nB4:60:ED\t\tBeijing Xiaomi Mobile Software Co., Ltd\nB4:61:42\t\tHuawei Technologies Co.,Ltd\nB4:61:E9\t\tSichuan AI-Link Technology Co., Ltd.\nB4:61:FF\t\tLumigon A/S\nB4:62:2E\t\tZhong Ge Smart Technology Co., Ltd.\nB4:62:38\t\tExablox\nB4:62:93\t\tSamsung Electronics Co.,Ltd\nB4:62:AD\t\tElysia Germany GmbH\nB4:63:6F\t\tNokia Solutions and Networks GmbH & Co. KG\nB4:64:15\t\tGuangzhou V-Solution Telecommunication Technology Co.,Ltd.\nB4:66:98\t\tZealabs srl\nB4:67:E9\t\tQingdao GoerTek Technology Co., Ltd.\nB4:69:21\t\tIntel Corporate\nB4:69:5F\t\tTCT mobile ltd\nB4:6A:D4\t\tEdgecore Americas Networking Corporation\nB4:6B:FC\t\tIntel Corporate\nB4:6C:47\t\tPanasonic Appliances Company\nB4:6D:35\t\tDalian Seasky Automation Co;Ltd\nB4:6D:83\t\tIntel Corporate\nB4:6D:C2\t\tShenzhen Bilian Electronic Co.，Ltd\nB4:6E:08\t\tHuawei Technologies Co.,Ltd\nB4:6E:10\t\tvivo Mobile Communication Co., Ltd.\nB4:6F:2D\t\tWahoo Fitness\nB4:70:64\t\tSamsung Electronics Co.,Ltd\nB4:73:56\t\tHangzhou Treebear Networking Co., Ltd.\nB4:74:43\t\tSamsung Electronics Co.,Ltd\nB4:74:47\t\tCoreOS\nB4:74:9F\t\tAskey Computer Corp\nB4:75:0E\t\tBelkin International Inc.\nB4:76:A4\t\tHuawei Device Co., Ltd.\nB4:77:48\t\tShenzhen Neoway Technology Co.,Ltd.\nB4:79:47\t\tNutanix\nB4:79:A7\t\tSamsung Electro-Mechanics(Thailand)\nB4:79:C8\t\tRuckus Wireless\nB4:7A:F1\t\tHewlett Packard Enterprise\nB4:7B:1A\t\tHuawei Technologies Co.,Ltd\nB4:7C:29\t\tShenzhen Guzidi Technology Co.,Ltd\nB4:7C:59\t\tJiangsu Hengxin Technology Co.,Ltd.\nB4:7C:9C\t\tAmazon Technologies Inc.\nB4:7C:A6\t\tzte corporation\nB4:7D:76\t\tKNS Group LLC\nB4:7F:5E\t\tForesight Manufacture (S) Pte Ltd\nB4:81:07\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\nB4:81:BF\t\tMeta-Networks, LLC\nB4:82:55\t\tResearch Products Corporation\nB4:82:7B\t\tAKG Acoustics GmbH\nB4:82:C5\t\tRelay2, Inc.\nB4:82:FE\t\tAskey Computer Corp\nB4:83:51\t\tIntel Corporate\nB4:84:D5\t\tGooWi Wireless Technology Co., Limited\nB4:85:47\t\tAmptown System Company GmbH\nB4:85:E1\t\tApple, Inc.\nB4:86:18\t\tGX India Pvt Ltd\nB4:86:55\t\tHuawei Technologies Co.,Ltd\nB4:89:01\t\tHuawei Technologies Co.,Ltd\nB4:89:10\t\tCoster T.E. S.P.A.\nB4:89:31\t\tSilicon Laboratories\nB4:89:70\t\tIGEN Tech Co., Ltd.\nB4:8A:0A\t\tEspressif Inc.\nB4:8A:5F\t\tJuniper Networks\nB4:8B:19\t\tApple, Inc.\nB4:8C:9D\t\tAzureWave Technology Inc.\nB4:92:FE\t\tArista Network, Inc.\nB4:94:4E\t\tWeTelecom Co., Ltd.\nB4:96:91\t\tIntel Corporate\nB4:96:A5\t\tApple, Inc.\nB4:98:42\t\tzte corporation\nB4:98:82\t\tBrusa HyPower AG\nB4:99:4C\t\tTexas Instruments\nB4:99:BA\t\tHewlett Packard\nB4:9A:95\t\tShenzhen Boomtech Industrial Corporation\nB4:9C:DF\t\tApple, Inc.\nB4:9D:02\t\tSamsung Electronics Co.,Ltd\nB4:9D:0B\t\tBq\nB4:9D:B4\t\tAxion Technologies Inc.\nB4:9D:FD\t\tShenzhen SDMC Technology CO.,Ltd.\nB4:9E:80\t\tSichuan Changhong Electric Ltd.\nB4:9E:AC\t\tImagik Int'l Corp\nB4:9E:E6\t\tShenzhen Technology Co Ltd\nB4:9F:4D\t\tFiberhome Telecommunication Technologies Co.,LTD\nB4:A1:0A\t\tHuawei Device Co., Ltd.\nB4:A2:5C\t\tCambium Networks Limited\nB4:A2:EB\t\tIEEE Registration Authority\nB4:A2:EB:00:00:00/28\tQKM Technology(Dongguan)Co.,Ltd\nB4:A2:EB:10:00:00/28\tDCI International, LLC.\nB4:A2:EB:20:00:00/28\tONX Inc.\nB4:A2:EB:30:00:00/28\tCanaan Creative Co.,Ltd.\nB4:A2:EB:40:00:00/28\tSoftel SA de CV\nB4:A2:EB:50:00:00/28\tAnnapurna labs\nB4:A2:EB:60:00:00/28\tShenZhen Lark Acoustics Co., Ltd.\nB4:A2:EB:70:00:00/28\tKona I\nB4:A2:EB:80:00:00/28\tShenzhen Zhuifengma Technology Co., Ltd\nB4:A2:EB:90:00:00/28\tCurrent Ways, Inc.\nB4:A2:EB:A0:00:00/28\tHengkang（Hangzhou）Co.,Ltd\nB4:A2:EB:B0:00:00/28\tQuantitec GmbH\nB4:A2:EB:C0:00:00/28\tShanghai Shenou Communication Equipment Co., Ltd.\nB4:A2:EB:D0:00:00/28\tSALZBRENNER media GmbH\nB4:A2:EB:E0:00:00/28\tDongguan Finslink Communication Technology Co.,Ltd.\nB4:A3:05\t\tXiamen Yaxon Network Co., Ltd.\nB4:A3:82\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nB4:A3:BD\t\tExtreme Networks Headquarters\nB4:A4:B5\t\tZen Eye Co.,Ltd\nB4:A4:E3\t\tCisco Systems, Inc\nB4:A5:A9\t\tMODI GmbH\nB4:A5:AC\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nB4:A5:EF\t\tSercomm Corporation.\nB4:A6:78\t\tZhejiang Tmall Technology Co., Ltd.\nB4:A7:C6\t\tServercom (India) Private Limited\nB4:A8:28\t\tShenzhen Concox Information Technology Co., Ltd\nB4:A8:2B\t\tHistar Digital Electronics Co., Ltd.\nB4:A8:98\t\tHuawei Device Co., Ltd.\nB4:A8:B9\t\tCisco Systems, Inc\nB4:A9:4F\t\tMercury Corporation\nB4:A9:5A\t\tAvaya Inc\nB4:A9:84\t\tSymantec Corporation\nB4:A9:FC\t\tQuanta Computer Inc.\nB4:A9:FE\t\tGHIA Technology (Shenzhen) LTD\nB4:AA:4D\t\tEnsequence, Inc.\nB4:AB:2C\t\tMtM Technology Corporation\nB4:AC:8C\t\tBern University of Applied Sciences\nB4:AC:9D\t\tTexas Instruments\nB4:AD:A3\t\tGuangzhou Shiyuan Electronic Technology Company Limited\nB4:AE:2B\t\tMicrosoft\nB4:AE:6F\t\tCircle Reliance, Inc DBA Cranberry Networks\nB4:AE:C1\t\tApple, Inc.\nB4:B0:17\t\tAvaya Inc\nB4:B0:24\t\tTP-Link Systems Inc\nB4:B0:55\t\tHuawei Technologies Co.,Ltd\nB4:B1:5A\t\tSiemens AG Energy Management Division\nB4:B2:65\t\tDaeho I&T\nB4:B2:91\t\tLG Electronics\nB4:B2:E9\t\tFortinet, Inc.\nB4:B3:62\t\tzte corporation\nB4:B3:84\t\tShenZhen Figigantic Electronic Co.,Ltd\nB4:B5:2F\t\tHewlett Packard\nB4:B5:42\t\tHubbell Power Systems, Inc.\nB4:B5:AF\t\tMinsung Electronics\nB4:B5:B6\t\tChongqing Fugui Electronics Co.,Ltd.\nB4:B6:76\t\tIntel Corporate\nB4:B6:86\t\tHewlett Packard\nB4:B7:42\t\tAmazon Technologies Inc.\nB4:B8:59\t\tTexa Spa\nB4:B8:8D\t\tThuh Company\nB4:B9:E6\t\teero inc.\nB4:BA:02\t\tAgatel Ltd\nB4:BA:12\t\tChina Mobile (Hangzhou) Information Technology Co.,Ltd.\nB4:BA:6A\t\tTecno Mobile Limited\nB4:BA:9D\t\tSky Uk Limited\nB4:BC:7C\t\tTexas Instruments\nB4:BF:F6\t\tSamsung Electronics Co.,Ltd\nB4:C0:F5\t\tShenzhen TINNO Mobile Technology Corp.\nB4:C1:70\t\tYi chip Microelectronics (Hangzhou) Co., Ltd\nB4:C2:6A\t\tGarmin International\nB4:C2:E0\t\tBouffalo Lab (Nanjing) Co., Ltd.\nB4:C2:F7\t\tHuawei Device Co., Ltd.\nB4:C4:4E\t\tVXL eTech Pvt Ltd\nB4:C4:76\t\tWuhan Maritime Communication Research Institute\nB4:C4:FC\t\tXiaomi Communications Co Ltd\nB4:C5:56\t\tShanghai Kenmyond Industrial Network Equipment Co., Ltd\nB4:C6:2E\t\tMolex CMS\nB4:C6:F8\t\tAxilspot Communication\nB4:C7:99\t\tExtreme Networks Headquarters\nB4:C8:10\t\tUmpi srl\nB4:C9:B9\t\tSichuan AI-Link Technology Co., Ltd.\nB4:CA:DD\t\tCisco Systems, Inc\nB4:CB:57\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nB4:CB:B8\t\tUniversal Electronics, Inc.\nB4:CC:04\t\tPiranti\nB4:CC:E9\t\tProsyst\nB4:CD:27\t\tHuawei Technologies Co.,Ltd\nB4:CD:F5\t\tCub Elecparts Inc.\nB4:CE:40\t\tSamsung Electronics Co.,Ltd\nB4:CE:F6\t\tHTC Corporation\nB4:CE:FE\t\tJames Czekaj\nB4:CF:DB\t\tShenzhen Jiuzhou Electric Co.,LTD\nB4:CF:E0\t\tSichuan tianyi kanghe communications co., LTD\nB4:D0:A9\t\tChina Mobile Group Device Co.,Ltd.\nB4:D1:35\t\tCloudistics\nB4:D2:86\t\tTelechips, Inc.\nB4:D3:1A\t\tLysora Technology Inc.\nB4:D5:BD\t\tIntel Corporate\nB4:D5:E5\t\tSamsung Electronics Co.,Ltd\nB4:D6:4E\t\tCaldero Limited\nB4:D7:DB\t\tNew H3C Technologies Co., Ltd\nB4:D8:A9\t\tBetterBots\nB4:D8:DE\t\tiota Computing, Inc.\nB4:DB:91\t\tCelestica Inc.\nB4:DC:09\t\tGuangzhou Dawei Communication Co.,Ltd\nB4:DD:15\t\tControlThings Oy Ab\nB4:DD:D0\t\tContinental Automotive Hungary Kft\nB4:DD:E0\t\tShanghai Amphenol Airwave Communication Electronics Co.,Ltd.\nB4:DE:31\t\tCisco Systems, Inc\nB4:DE:DF\t\tzte corporation\nB4:DF:3B\t\tChromlech\nB4:DF:91\t\tCisco Meraki\nB4:DF:FA\t\tLitemax Electronics Inc.\nB4:E0:1D\t\tConception Electronique\nB4:E0:25\t\tITLook\nB4:E0:CD\t\tFusion-io, Inc\nB4:E1:0F\t\tDell Inc.\nB4:E1:C4\t\tMicrosoft Mobile Oy\nB4:E1:EB\t\tPrivate\nB4:E2:65\t\tShenzhen SDMC Technology CO.,Ltd.\nB4:E3:D0\t\tLG Electronics\nB4:E3:F9\t\tSilicon Laboratories\nB4:E4:54\t\tAmazon Technologies Inc.\nB4:E4:6B\t\tChina Mobile IOT Company Limited\nB4:E5:3E\t\tRuckus Wireless\nB4:E5:4C\t\tLLC \"Elektra\"\nB4:E6:2A\t\tLG Innotek\nB4:E6:2D\t\tEspressif Inc.\nB4:E7:82\t\tVivalnk\nB4:E7:B3\t\tEdifier International\nB4:E8:42\t\tHong Kong Bouffalo Lab Limited\nB4:E8:5C\t\tfünfeinhalb Funksysteme GmbH\nB4:E8:C9\t\tXADA Technologies\nB4:E9:A3\t\tport industrial automation GmbH\nB4:E9:B0\t\tCisco Systems, Inc\nB4:E9:B8\t\tDell Inc.\nB4:EC:02\t\tAlpsalpine Co,.Ltd\nB4:EC:F2\t\tShanghai Listent Medical Tech Co., Ltd.\nB4:EC:FF\t\tWuhan IPG Technologies Co., Ltd.\nB4:ED:19\t\tPie Digital, Inc.\nB4:ED:54\t\tWohler Technologies\nB4:ED:D5\t\tQuectel Wireless Solutions Co.,Ltd.\nB4:EE:25\t\tShenzhen Belon Technology CO.,LTD\nB4:EE:B4\t\tAskey Computer Corp\nB4:EE:D4\t\tTexas Instruments\nB4:EF:04\t\tDAIHAN Scientific Co., Ltd.\nB4:EF:1C\t\t360 AI Technology Co.Ltd\nB4:EF:30\t\tShanghai SYH Technology CO.,LTD\nB4:EF:39\t\tSamsung Electronics Co.,Ltd\nB4:EF:FA\t\tLemobile Information Technology (Beijing) Co., Ltd.\nB4:F0:AB\t\tApple, Inc.\nB4:F1:8C\t\tHuawei Device Co., Ltd.\nB4:F1:DA\t\tLG Electronics (Mobile Communications)\nB4:F2:67\t\tCompal Broadband Networks, Inc.\nB4:F2:E8\t\tCommscope\nB4:F3:23\t\tPetatel Inc.\nB4:F5:8E\t\tHuawei Technologies Co.,Ltd\nB4:F6:1C\t\tApple, Inc.\nB4:F7:A1\t\tLG Electronics (Mobile Communications)\nB4:F8:1E\t\tKinova\nB4:F9:49\t\toptilink networks pvt ltd\nB4:F9:5D\t\tJuniper Networks\nB4:FA:48\t\tApple, Inc.\nB4:FB:E3\t\tAltoBeam (China) Inc.\nB4:FB:E4\t\tUbiquiti Inc\nB4:FB:F9\t\tHuawei Technologies Co.,Ltd\nB4:FC:75\t\tSEMA Electronics(HK) CO.,LTD\nB4:FC:7D\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\nB4:FE:8C\t\tCentro Sicurezza Italia SpA\nB4:FF:98\t\tHuawei Technologies Co.,Ltd\nB8:00:18\t\tHtel\nB8:01:1F\t\tApple, Inc.\nB8:02:A4\t\tAeonsemi, Inc.\nB8:03:05\t\tIntel Corporate\nB8:04:15\t\tBayan Audio\nB8:05:33\t\tApple, Inc.\nB8:05:AB\t\tzte corporation\nB8:06:0D\t\tTuya Smart Inc.\nB8:07:16\t\tvivo Mobile Communication Co., Ltd.\nB8:07:56\t\tCisco Meraki\nB8:08:CF\t\tIntel Corporate\nB8:08:D7\t\tHuawei Technologies Co.,Ltd\nB8:09:8A\t\tApple, Inc.\nB8:0B:9D\t\tROPEX Industrie-Elektronik GmbH\nB8:0B:DA\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nB8:10:D4\t\tMasimo Corporation\nB8:11:4B\t\tCisco Systems, Inc\nB8:12:DA\t\tLvswitches Inc.\nB8:13:32\t\tAMPAK Technology,Inc.\nB8:13:E9\t\tTrace Live Network\nB8:14:13\t\tKeen High Holding(HK) Ltd.\nB8:14:4D\t\tApple, Inc.\nB8:14:5C\t\tHuawei Device Co., Ltd.\nB8:14:DB\t\tOhsung\nB8:16:19\t\tCommscope\nB8:16:5F\t\tLG Innotek\nB8:16:DB\t\tChant Sincere Co.,Ltd\nB8:17:43\t\tshenzhen worldelite electronics co., LTD\nB8:17:C2\t\tApple, Inc.\nB8:18:6F\t\tOriental Motor Co., Ltd.\nB8:19:04\t\tNokia Shanghai Bell Co., Ltd.\nB8:19:99\t\tNesys\nB8:1D:1F\t\tHuawei Technologies Co.,Ltd\nB8:1D:AA\t\tLG Electronics (Mobile Communications)\nB8:1E:9E\t\tHuawei Technologies Co.,Ltd\nB8:1E:A4\t\tLiteon Technology Corporation\nB8:1F:5E\t\tApption Labs Limited\nB8:20:8E\t\tPanasonic Connect Co., Ltd.\nB8:20:E7\t\tGuangzhou Horizontal Information & Network Integration Co. Ltd\nB8:21:1C\t\tApple, Inc.\nB8:22:0C\t\tApple, Inc.\nB8:22:4F\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nB8:24:10\t\tMagneti Marelli Slovakia s.r.o.\nB8:24:1A\t\tSweda Informatica Ltda\nB8:24:F0\t\tSOYO Technology Development Co., Ltd.\nB8:25:9A\t\tThalmic Labs\nB8:25:B5\t\tTrakm8 Ltd\nB8:26:6C\t\tANOV France\nB8:26:D4\t\tFurukawa Industrial S.A. Produtos Elétricos\nB8:27:C5\t\tHuawei Device Co., Ltd.\nB8:27:EB\t\tRaspberry Pi Foundation\nB8:28:8B\t\tParker Hannifin Manufacturing (UK) Ltd\nB8:29:03\t\tVietnam Post And Telecommunication Industry Technology Join Stock Company\nB8:29:F7\t\tBlaster Tech\nB8:2A:72\t\tDell Inc.\nB8:2A:A9\t\tApple, Inc.\nB8:2A:DC\t\tEFR Europäische Funk-Rundsteuerung GmbH\nB8:2B:68\t\tHuawei Device Co., Ltd.\nB8:2C:A0\t\tResideo\nB8:2D:28\t\tAMPAK Technology,Inc.\nB8:2F:CB\t\tCMS Electracom\nB8:30:A8\t\tRoad-Track Telematics Development\nB8:31:B5\t\tMicrosoft Corporation\nB8:32:41\t\tWuhan Tianyu Information Industry Co., Ltd.\nB8:36:D8\t\tVideoswitch\nB8:37:4A\t\tApple, Inc.\nB8:37:4B\t\tHewlett Packard Enterprise\nB8:37:65\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nB8:37:B2\t\tHewlett Packard Enterprise\nB8:38:61\t\tCisco Systems, Inc\nB8:38:CA\t\tKyokko Tsushin System CO.,LTD\nB8:38:EF\t\tADVA Optical Networking Ltd.\nB8:3A:08\t\tTenda Technology Co.,Ltd.Dongguan branch\nB8:3A:5A\t\tHewlett Packard Enterprise\nB8:3A:7B\t\tWorldplay (Canada) Inc.\nB8:3A:9D\t\tAlarm.com\nB8:3B:8F\t\tHangzhou Hylin IoT Techonology Co.,Ltd.\nB8:3B:AB\t\tArcadyan Corporation\nB8:3B:CC\t\tXiaomi Communications Co Ltd\nB8:3C:20\t\tHuawei Device Co., Ltd.\nB8:3C:28\t\tApple, Inc.\nB8:3D:4E\t\tShenzhen Cultraview Digital Technology Co.,Ltd Shanghai Branch\nB8:3D:F6\t\tTexas Instruments\nB8:3D:FB\t\tBouffalo Lab (Nanjing) Co., Ltd.\nB8:3E:59\t\tRoku, Inc.\nB8:3F:D2\t\tMellanox Technologies, Inc.\nB8:41:5F\t\tAsp Ag\nB8:41:A4\t\tApple, Inc.\nB8:41:D9\t\tGuangzhou Shiyuan Electronic Technology Company Limited\nB8:43:E4\t\tVlatacom\nB8:44:AE\t\tTCT mobile ltd\nB8:44:D9\t\tApple, Inc.\nB8:45:EB\t\tApple, Inc.\nB8:45:F4\t\tNew H3C Technologies Co., Ltd\nB8:47:7A\t\tDasan Electron Co., Ltd.\nB8:47:C6\t\tSanJet Technology Corp.\nB8:48:AA\t\tEM Microelectronic\nB8:48:EC\t\tPrivate\nB8:49:6D\t\tApple, Inc.\nB8:4C:87\t\tIEEE Registration Authority\nB8:4C:87:00:00:00/28\tAnnapurna labs\nB8:4C:87:10:00:00/28\tem-trak\nB8:4C:87:20:00:00/28\tShenzhen Huixiangfeng Electronic Technology Co., Ltd.\nB8:4C:87:30:00:00/28\tShenzhen Link-all Technology Co., Ltd\nB8:4C:87:40:00:00/28\tBlum Novotest GmbH\nB8:4C:87:50:00:00/28\tPsync Labs, Inc.\nB8:4C:87:60:00:00/28\tHORIBA Precision Instruments (Beijing) Co.,Ltd\nB8:4C:87:70:00:00/28\tBeijing Jiyuan Automation Technology CO.,LTD\nB8:4C:87:80:00:00/28\tFujian Morefun Electronic Technology Co., Ltd.\nB8:4C:87:90:00:00/28\tAirgain Inc.\nB8:4C:87:A0:00:00/28\tAltronix , Corp\nB8:4C:87:B0:00:00/28\tBeijing Yunji Technology Co., Ltd.\nB8:4C:87:C0:00:00/28\tSond\nB8:4C:87:D0:00:00/28\tDfun (Zhuhai) Co,. Ltd.\nB8:4C:87:E0:00:00/28\tPrivate\nB8:4D:43\t\tHunan Fn-Link Technology Limited\nB8:4D:EE\t\tHisense broadband multimedia technology Co.,Ltd\nB8:4F:A7\t\tApple, Inc.\nB8:4F:D5\t\tMicrosoft Corporation\nB8:50:01\t\tExtreme Networks Headquarters\nB8:50:D8\t\tBeijing Xiaomi Mobile Software Co., Ltd\nB8:51:A9\t\tNokia\nB8:52:E0\t\tBeijing Xiaomi Electronics Co.,Ltd\nB8:53:AC\t\tApple, Inc.\nB8:55:10\t\tZioncom Electronics (Shenzhen) Ltd.\nB8:56:00\t\tHuawei Technologies Co.,Ltd\nB8:56:BD\t\tItt Llc\nB8:57:76\t\tlignex1\nB8:57:D8\t\tSamsung Electronics Co.,Ltd\nB8:58:10\t\tNumera, Inc.\nB8:59:9F\t\tMellanox Technologies, Inc.\nB8:59:C8\t\t70mai Co.,Ltd.\nB8:59:CE\t\tEarda Technologies co Ltd\nB8:5A:73\t\tSamsung Electronics Co.,Ltd\nB8:5A:F7\t\tOuya, Inc\nB8:5A:FE\t\tHandaer Communication Technology (Beijing) Co., Ltd\nB8:5B:6C\t\tControl Accessories LLC\nB8:5C:5C\t\tMicrosoft Corporation\nB8:5C:EE\t\tBaidu Online Network Technology (Beijing) Co., Ltd\nB8:5D:0A\t\tApple, Inc.\nB8:5D:C3\t\tHuawei Technologies Co.,Ltd\nB8:5E:71\t\tVantiva USA LLC\nB8:5E:7B\t\tSamsung Electronics Co.,Ltd\nB8:5F:98\t\tAmazon Technologies Inc.\nB8:5F:B0\t\tHuawei Technologies Co.,Ltd\nB8:60:61\t\tChina Mobile Group Device Co.,Ltd.\nB8:60:91\t\tOnnet Technologies and Innovations LLC\nB8:61:42\t\tBeijing Tricolor Technology Co., Ltd\nB8:61:6F\t\tAccton Technology Corp\nB8:62:1F\t\tCisco Systems, Inc\nB8:63:4D\t\tApple, Inc.\nB8:63:92\t\tGuangdong Genius Technology Co., Ltd.\nB8:63:BC\t\tROBOTIS, Co, Ltd\nB8:64:91\t\tCK Telecom Ltd\nB8:65:3B\t\tBolymin, Inc.\nB8:66:85\t\tSagemcom Broadband SAS\nB8:69:C2\t\tSunitec Enterprise Co., Ltd.\nB8:69:F4\t\tRouterboard.com\nB8:6A:97\t\tEdgecore Networks Corporation\nB8:6A:F1\t\tSagemcom Broadband SAS\nB8:6B:23\t\tToshiba\nB8:6C:E0\t\tHewlett Packard Enterprise\nB8:6C:E8\t\tSamsung Electronics Co.,Ltd\nB8:70:29\t\tShenzhen Ruiyuanchuangxin Technology Co.,Ltd.\nB8:70:F4\t\tCompal Information (Kunshan) Co., Ltd.\nB8:74:24\t\tViessmann Elektronik GmbH\nB8:74:47\t\tConvergence Technologies\nB8:75:C0\t\tPayPal, Inc.\nB8:76:3F\t\tHon Hai Precision Ind. Co.,Ltd.\nB8:77:C3\t\tMETER Group\nB8:78:26\t\tNintendo Co.,Ltd\nB8:78:2E\t\tApple, Inc.\nB8:78:79\t\tRoche Diagnostics GmbH\nB8:79:7E\t\tSecure Meters (UK) Limited\nB8:7A:C9\t\tSiemens Ltd.\nB8:7B:C5\t\tApple, Inc.\nB8:7B:D4\t\tGoogle, Inc.\nB8:7C:6F\t\tNXP (China) Management Ltd.\nB8:7C:D0\t\tHuawei Device Co., Ltd.\nB8:7C:F2\t\tExtreme Networks Headquarters\nB8:7E:39\t\tMotorola Mobility LLC, a Lenovo Company\nB8:7E:40\t\tHuawei Device Co., Ltd.\nB8:7E:E5\t\tIntelbras\nB8:80:35\t\tShenzhen Qihu Intelligent Technology Company Limited\nB8:80:4F\t\tTexas Instruments\nB8:81:98\t\tIntel Corporate\nB8:81:FA\t\tApple, Inc.\nB8:82:F2\t\tWistron Neweb Corporation\nB8:83:03\t\tHewlett Packard Enterprise\nB8:85:7B\t\tHuawei Technologies Co.,Ltd\nB8:85:84\t\tDell Inc.\nB8:86:87\t\tLiteon Technology Corporation\nB8:87:1E\t\tGood Mind Industries Co., Ltd.\nB8:87:6E\t\tIntertech Services AG\nB8:87:A8\t\tStep Ahead Innovations Inc.\nB8:87:C6\t\tPrudential Technology co.,LTD\nB8:88:80\t\tShanghai Imilab Technology Co.Ltd\nB8:88:E3\t\tCompal Information (Kunshan) Co., Ltd.\nB8:89:81\t\tChengdu InnoThings Technology Co., Ltd.\nB8:89:CA\t\tILJIN ELECTRIC Co., Ltd.\nB8:8A:60\t\tIntel Corporate\nB8:8A:72\t\tRenesas Electronics (Penang) Sdn. Bhd.\nB8:8A:EC\t\tNintendo Co.,Ltd\nB8:8C:29\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nB8:8C:2B\t\tSagemcom Broadband SAS\nB8:8D:12\t\tApple, Inc.\nB8:8D:F1\t\tNanjing BigFish Semiconductor Co., Ltd.\nB8:8E:3A\t\tInfinite Technologies JLT\nB8:8E:82\t\tHuawei Device Co., Ltd.\nB8:8E:B0\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nB8:8E:C6\t\tStateless Networks\nB8:8E:DF\t\tZencheer Communication Technology Co., Ltd.\nB8:8F:14\t\tAnalytica GmbH\nB8:8F:27\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nB8:8F:B4\t\tJabil Circuit Italia S.R.L\nB8:90:47\t\tApple, Inc.\nB8:91:65\t\tZhejiang Tmall Technology Co., Ltd.\nB8:91:C9\t\tHandreamnet\nB8:92:1D\t\tBg T&A\nB8:94:36\t\tHuawei Technologies Co.,Ltd\nB8:94:70\t\tCalix Inc.\nB8:94:D2\t\tRetail Innovation HTT AB\nB8:94:D9\t\tTexas Instruments\nB8:94:E7\t\tXiaomi Communications Co Ltd\nB8:96:74\t\tAllDSP GmbH & Co. KG\nB8:97:5A\t\tBIOSTAR Microtech Int'l Corp.\nB8:97:7A\t\tNokia Solutions and Networks GmbH & Co. KG\nB8:98:AD\t\tMotorola Mobility LLC, a Lenovo Company\nB8:98:B0\t\tAtlona Inc.\nB8:98:F7\t\tGionee Communication Equipment Co,Ltd.ShenZhen\nB8:99:19\t\t7signal Solutions, Inc\nB8:99:AE\t\tShenzhen MiaoMing  Intelligent Technology Co.,Ltd\nB8:99:B0\t\tCohere Technologies\nB8:9A:2A\t\tIntel Corporate\nB8:9A:9A\t\tXin Shi Jia Technology (Beijing) Co.,Ltd\nB8:9A:CD\t\tElite Optoelectronic(Asia)Co.,Ltd\nB8:9A:ED\t\tOceanServer Technology, Inc\nB8:9B:C9\t\tSMC Networks Inc\nB8:9B:E4\t\tABB Power Systems Power Generation\nB8:9C:13\t\tAlps Alpine\nB8:9E:A6\t\tSpbec-Mining Co.Ltd\nB8:9F:09\t\tWistron Neweb Corporation\nB8:9F:CC\t\tHuawei Technologies Co.,Ltd\nB8:A0:B8\t\tSamsung Electronics Co.,Ltd\nB8:A1:4A\t\tRaisecom Technology CO., LTD\nB8:A1:75\t\tRoku, Inc.\nB8:A1:B8\t\tArista Networks\nB8:A2:5D\t\tMotorola Mobility LLC, a Lenovo Company\nB8:A3:77\t\tCisco Systems, Inc\nB8:A3:86\t\tD-Link International\nB8:A3:E0\t\tBenRui Technology Co.,Ltd\nB8:A4:4F\t\tAxis Communications AB\nB8:A5:35\t\tVantiva USA LLC\nB8:A5:8D\t\tAxe Group Holdings Limited\nB8:A7:5E\t\tWuxi Xinjie Electric Co.,Ltd\nB8:A8:25\t\tSamsung Electronics Co.,Ltd\nB8:A8:AF\t\tLogic S.p.A.\nB8:AB:61\t\tCisco Meraki\nB8:AB:62\t\tHui Zhou Gaoshengda Technology Co.,LTD\nB8:AC:6F\t\tDell Inc.\nB8:AD:3E\t\tBluecom\nB8:AE:1C\t\tSmart Cube., Ltd\nB8:AE:1D\t\tGuangzhou Xingyi Electronic Technology Co.,Ltd\nB8:AE:6E\t\tNintendo Co., Ltd.\nB8:AE:ED\t\tElitegroup Computer Systems Co.,Ltd.\nB8:AF:67\t\tHewlett Packard\nB8:B1:C7\t\tBt&Com Co.,Ltd\nB8:B1:EA\t\tHonor Device Co., Ltd.\nB8:B2:EB\t\tGoogol Technology (HK) Limited\nB8:B2:F7\t\tDrimaes Inc.\nB8:B2:F8\t\tApple, Inc.\nB8:B3:DC\t\tDerek (Shaoguan) Limited\nB8:B4:09\t\tSamsung Electronics Co.,Ltd\nB8:B4:2E\t\tGionee Communication Equipment Co,Ltd.ShenZhen\nB8:B4:C9\t\tCisco Meraki\nB8:B7:7D\t\tGuangdong Transtek Medical Electronics CO.,Ltd\nB8:B7:D7\t\t2GIG Technologies\nB8:B7:DB\t\tGOIP Global Services Pvt. Ltd.\nB8:B7:F1\t\tWistron Neweb Corporation\nB8:B8:1E\t\tIntel Corporate\nB8:B9:4E\t\tShenzhen iBaby Labs, Inc.\nB8:BA:68\t\tXi'an Jizhong Digital Communication Co.,Ltd\nB8:BA:72\t\tCynove\nB8:BB:23\t\tGuangdong Nufront CSC Co., Ltd\nB8:BB:6D\t\tENERES Co.,Ltd.\nB8:BB:AF\t\tSamsung Electronics Co.,Ltd\nB8:BC:1B\t\tHuawei Technologies Co.,Ltd\nB8:BC:5B\t\tSamsung Electronics Co.,Ltd\nB8:BD:79\t\tTrendPoint Systems\nB8:BE:BF\t\tCisco Systems, Inc\nB8:BE:F4\t\tdevolo AG\nB8:BF:83\t\tIntel Corporate\nB8:C0:07\t\ttickIoT Inc.\nB8:C0:51\t\tVusionGroup\nB8:C0:65\t\tUniversal Electronics, Inc.\nB8:C1:11\t\tApple, Inc.\nB8:C1:A2\t\tDragon Path Technologies Co., Limited\nB8:C2:27\t\tPSTec\nB8:C2:53\t\tJuniper Networks\nB8:C3:85\t\tHuawei Technologies Co.,Ltd\nB8:C3:BF\t\tHenan Chengshi NetWork Technology Co.，Ltd\nB8:C4:6F\t\tPrimmcon Industries Inc\nB8:C6:8E\t\tSamsung Electronics Co.,Ltd\nB8:C6:AA\t\tEarda Technologies co Ltd\nB8:C7:16\t\tFiberhome Telecommunication Technologies Co.,LTD\nB8:C7:4A\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nB8:C7:5D\t\tApple, Inc.\nB8:C8:55\t\tShanghai GBCOM Communication Technology Co.,Ltd.\nB8:C8:EB\t\tItel Mobile Limited\nB8:C9:B5\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nB8:CA:04\t\tHoltek Semiconductor Inc.\nB8:CA:3A\t\tDell Inc.\nB8:CB:29\t\tDell Inc.\nB8:CB:93\t\tIc Boss.Com Tech Inc\nB8:CC:5F\t\tShenzhen iComm Semiconductor CO.,LTD\nB8:CD:93\t\tPenetek, Inc\nB8:CD:A7\t\tMaxeler Technologies Ltd.\nB8:CE:F6\t\tMellanox Technologies, Inc.\nB8:D0:6F\t\tGuangzhou Hkust Fok Ying Tung Research Institute\nB8:D0:F0\t\tFcnt Llc\nB8:D3:09\t\tCox Communications, Inc\nB8:D4:3E\t\tvivo Mobile Communication Co., Ltd.\nB8:D4:9D\t\tM Seven System Ltd.\nB8:D4:BC\t\tzte corporation\nB8:D4:C3\t\tHuawei Technologies Co.,Ltd\nB8:D4:E7\t\tHewlett Packard Enterprise\nB8:D4:F7\t\tNew H3C Technologies Co., Ltd\nB8:D5:0B\t\tSunitec Enterprise Co.,Ltd\nB8:D5:26\t\tZyxel Communications Corporation\nB8:D5:6B\t\tMirka Ltd.\nB8:D6:1A\t\tEspressif Inc.\nB8:D6:F6\t\tHuawei Technologies Co.,Ltd\nB8:D7:AF\t\tMurata Manufacturing Co., Ltd.\nB8:D8:12\t\tIEEE Registration Authority\nB8:D8:12:00:00:00/28\tGlamo Inc.\nB8:D8:12:10:00:00/28\tVotem\nB8:D8:12:20:00:00/28\tIPM Sales and service Co.,Ltd.\nB8:D8:12:30:00:00/28\tiModesty Technology Corp.\nB8:D8:12:40:00:00/28\tV5 Technology Corporation\nB8:D8:12:50:00:00/28\tXiamen Xindeco Ltd.\nB8:D8:12:60:00:00/28\tVonger Electronic Technology Co.,Ltd.\nB8:D8:12:70:00:00/28\tNeuropace Inc.\nB8:D8:12:80:00:00/28\tVisual Productions BV\nB8:D8:12:90:00:00/28\tEntotem LTD\nB8:D8:12:A0:00:00/28\tKiwigrid GmbH\nB8:D8:12:B0:00:00/28\tDocobo Limited\nB8:D8:12:C0:00:00/28\tYuwei Info&Tech Development Co.,Ltd\nB8:D8:12:D0:00:00/28\tLam Research\nB8:D8:12:E0:00:00/28\tZheJiang FangTai Electirc Co., Ltd\nB8:D8:12:F0:00:00/28\tPrivate\nB8:D8:2D\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\nB8:D9:4D\t\tSagemcom Broadband SAS\nB8:D9:CE\t\tSamsung Electronics Co.,Ltd\nB8:DA:E8\t\tHuawei Device Co., Ltd.\nB8:DA:F1\t\tStrahlenschutz- Entwicklungs- und Ausruestungsgesellschaft mbH\nB8:DA:F7\t\tAdvanced Photonics, Inc.\nB8:DB:1C\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\nB8:DB:38\t\tGoogle, Inc.\nB8:DC:87\t\tIAI Corporation\nB8:DD:71\t\tzte corporation\nB8:DD:E8\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nB8:DE:5E\t\tLongcheer Telecommunication Limited\nB8:DF:6B\t\tSpotCam Co., Ltd.\nB8:DF:D4\t\tFiberhome Telecommunication Technologies Co.,LTD\nB8:E2:8C\t\tMotorola Solutions Malaysia Sdn. Bhd.\nB8:E3:B1\t\tHuawei Technologies Co.,Ltd\nB8:E3:EE\t\tUniversal Electronics, Inc.\nB8:E4:4A\t\tXconnect\nB8:E5:89\t\tPayter BV\nB8:E6:0C\t\tApple, Inc.\nB8:E6:25\t\t2Wire Inc\nB8:E7:79\t\t9Solutions Oy\nB8:E8:56\t\tApple, Inc.\nB8:E9:24\t\tMellanox Technologies, Inc.\nB8:E9:37\t\tSonos, Inc.\nB8:EA:98\t\tXiaomi Communications Co Ltd\nB8:EA:AA\t\tICG NETWORKS CO.,ltd\nB8:EC:A3\t\tZyxel Communications Corporation\nB8:EE:0E\t\tSagemcom Broadband SAS\nB8:EE:65\t\tLiteon Technology Corporation\nB8:EE:79\t\tYWire Technologies, Inc.\nB8:EF:8B\t\tShenzhen Cannice Technology Co.,Ltd\nB8:F0:09\t\tEspressif Inc.\nB8:F0:15\t\tJuniper Networks\nB8:F0:80\t\tSps, Inc.\nB8:F0:B9\t\tzte corporation\nB8:F1:2A\t\tApple, Inc.\nB8:F2:55\t\tUniversal Electronics, Inc.\nB8:F3:17\t\tiSun Smasher Communications Private Limited\nB8:F4:4F\t\tu-blox AG\nB8:F4:D0\t\tHerrmann Ultraschalltechnik GmbH & Co. Kg\nB8:F5:E7\t\tWayTools, LLC\nB8:F6:53\t\tShenzhen Jingxun Software Telecommunication Technology Co.,Ltd\nB8:F6:B1\t\tApple, Inc.\nB8:F7:32\t\tAryaka Networks Inc\nB8:F7:4A\t\tRcntec\nB8:F7:74\t\tFiberhome Telecommunication Technologies Co.,LTD\nB8:F7:75\t\tIntel Corporate\nB8:F8:28\t\tChangshu Gaoshida Optoelectronic Technology Co. Ltd.\nB8:F8:53\t\tArcadyan Corporation\nB8:F8:62\t\tEspressif Inc.\nB8:F8:83\t\tTp-Link Technologies Co.,Ltd.\nB8:F8:BE\t\tBluecom\nB8:F9:34\t\tSony Corporation\nB8:FB:AF\t\tXiamen IPRT Technology CO.,LTD\nB8:FC:28\t\tValeo Vision Systems\nB8:FC:9A\t\tLe Shi Zhi Xin Electronic Technology (Tianjin) Limited\nB8:FD:32\t\tZhejiang ROICX Microelectronics\nB8:FF:61\t\tApple, Inc.\nB8:FF:6F\t\tShanghai Typrotech Technology Co.Ltd\nB8:FF:B3\t\tMitraStar Technology Corp.\nB8:FF:FE\t\tTexas Instruments\nBA:03:C6\t\tSchüco International KG\nBA:07:DA\t\tInfinix mobility limited\nBA:2D:FC\t\tLinkwing(Dongguan)Intelligent Electronics Co.,Ltd\nBA:30:54\t\tGeorge Wilson Industries Ltd\nBA:41:59\t\tAnapass Inc.\nBA:4D:EA\t\tEnvironexus\nBA:55:EC\t\tIeee 802.15\nBA:63:12\t\tIdteck\nBA:67:91\t\tKandou Bus SA\nBA:A2:D0\t\tWireless Broadband Alliance, Inc\nBA:C4:85\t\tFraunhofer IIS\nBA:C8:C4\t\tTransponder & Reader Engineered Systems, Inc\nBA:F2:1C\t\tIso/Tc22/Sc31\nBA:FE:3A\t\tDenso Corporation\nBC:00:04\t\tFiberhome Telecommunication Technologies Co.,LTD\nBC:02:00\t\tStewart Audio\nBC:02:4A\t\tHMD Global Oy\nBC:02:6E\t\tSilicon Laboratories\nBC:03:58\t\tIntel Corporate\nBC:03:A7\t\tMfp Michelin\nBC:04:35\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nBC:05:43\t\tAVM GmbH\nBC:06:2D\t\tWacom Co.,Ltd.\nBC:07:1D\t\tTP-Link Systems Inc.\nBC:08:66\t\tNestle Purina PetCare\nBC:09:1B\t\tIntel Corporate\nBC:09:5C\t\tFiSens GmbH\nBC:09:63\t\tApple, Inc.\nBC:09:EB\t\tTecno Mobile Limited\nBC:0D:A5\t\tTexas Instruments\nBC:0E:AB\t\tSamsung Electronics Co.,Ltd\nBC:0F:2B\t\tFortune Techgroup Co.,Ltd\nBC:0F:64\t\tIntel Corporate\nBC:0F:9A\t\tD-Link International\nBC:0F:A7\t\tOuster\nBC:0F:B7\t\tsywinkey HongKong Co,. Limited?\nBC:0F:F3\t\tHP Inc.\nBC:0F:FE\t\tJuniper Networks\nBC:10:2F\t\tSJI Industry Company\nBC:10:7B\t\tSamsung Electronics Co.,Ltd\nBC:12:5E\t\tBeijing  WisVideo  INC.\nBC:13:A8\t\tShenzhen YOUHUA Technology Co., Ltd\nBC:14:01\t\tHitron Technologies. Inc\nBC:14:85\t\tSamsung Electronics Co.,Ltd\nBC:14:EF\t\tITON Technology Limited\nBC:15:41\t\tNokia\nBC:15:A6\t\tTaiwan Jantek Electronics,Ltd.\nBC:15:AC\t\tVodafone Italia S.p.A.\nBC:16:65\t\tCisco Systems, Inc\nBC:16:95\t\tzte corporation\nBC:16:F5\t\tCisco Systems, Inc\nBC:17:B8\t\tIntel Corporate\nBC:18:96\t\tHuawei Technologies Co.,Ltd\nBC:1A:67\t\tYF Technology Co., Ltd\nBC:1A:E4\t\tHuawei Device Co., Ltd.\nBC:1C:81\t\tSichuan iLink Technology Co., Ltd.\nBC:1D:89\t\tMotorola Mobility LLC, a Lenovo Company\nBC:1E:85\t\tHuawei Technologies Co.,Ltd\nBC:1F:E1\t\tAscendent Technology Group\nBC:20:A4\t\tSamsung Electronics Co.,Ltd\nBC:20:BA\t\tInspur (Shandong) Electronic Information Co., Ltd\nBC:21:06\t\tAdtran Inc\nBC:22:28\t\tD-Link International\nBC:22:47\t\tNew H3C Technologies Co., Ltd\nBC:22:FB\t\tRF Industries\nBC:23:92\t\tBYD Precision Manufacture Company Ltd.\nBC:24:11\t\tProxmox Server Solutions GmbH\nBC:25:E0\t\tHuawei Technologies Co.,Ltd\nBC:25:F0\t\t3D Display Technologies Co., Ltd.\nBC:26:1D\t\tHong Kong Tecon Technology\nBC:26:43\t\tElprotronic Inc.\nBC:26:A1\t\tFACTORY FIVE Corporation\nBC:26:C7\t\tCisco Systems, Inc\nBC:28:2C\t\te-Smart Systems Pvt. Ltd\nBC:28:46\t\tNextBIT Computing Pvt. Ltd.\nBC:28:D6\t\tRowley Associates Limited\nBC:29:78\t\tPrama Hikvision India Private Limited\nBC:2A:33\t\tQuectel Wireless Solutions Co.,Ltd.\nBC:2B:02\t\tChina Dragon Technology Limited\nBC:2B:6B\t\tBeijing Haier IC Design Co.,Ltd\nBC:2B:D7\t\tRevogi Innovation Co., Ltd.\nBC:2C:55\t\tBear Flag Design, Inc.\nBC:2C:E6\t\tCisco Systems, Inc\nBC:2D:98\t\tThinGlobal LLC\nBC:2D:EF\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nBC:2E:48\t\tCommscope\nBC:2E:C3\t\tShenzhen Tianruixiang Communication Equipment Co.,Ltd\nBC:2E:F6\t\tHuawei Device Co., Ltd.\nBC:2F:3D\t\tvivo Mobile Communication Co., Ltd.\nBC:30:5B\t\tDell Inc.\nBC:30:7D\t\tWistron Neweb Corporation\nBC:30:7E\t\tWistron Neweb Corporation\nBC:30:D9\t\tArcadyan Corporation\nBC:31:98\t\tIEEE Registration Authority\nBC:31:98:00:00:00/28\tThinkcar Tech Co.,Ltd.\nBC:31:98:10:00:00/28\tswiss-sonic Ultraschall AG\nBC:31:98:20:00:00/28\tJSC Megapolis-telecom region\nBC:31:98:30:00:00/28\tShenzhen Qichang Intelligent Technology Co., Ltd.\nBC:31:98:40:00:00/28\tChongqing e-skybest ELECT CO.,LIMITED\nBC:31:98:50:00:00/28\tHunan Gukam Railway Equipment Co.,Ltd\nBC:31:98:60:00:00/28\tntc mekhanotronnika\nBC:31:98:70:00:00/28\tZhejiang Delixi Electric Appliance Co., Ltd\nBC:31:98:80:00:00/28\tTemposonics,LLC\nBC:31:98:90:00:00/28\tBaisstar (Shenzhen) Intelligence Co., Ltd.\nBC:31:98:A0:00:00/28\tFcl Components Limited\nBC:31:98:B0:00:00/28\tSuzhou Anchi Control system.,Co.Ltd\nBC:31:98:C0:00:00/28\tInnoflight, Inc.\nBC:31:98:D0:00:00/28\tShanghai Sigen New Energy Technology Co., Ltd\nBC:31:98:E0:00:00/28\tRadar\nBC:31:E2\t\tNew H3C Technologies Co., Ltd\nBC:32:5F\t\tZhejiang Dahua Technology Co., Ltd.\nBC:32:B2\t\tSamsung Electronics Co.,Ltd\nBC:33:29\t\tSony Interactive Entertainment Inc.\nBC:33:40\t\tCisco Meraki\nBC:33:AC\t\tSilicon Laboratories\nBC:34:00\t\tIEEE Registration Authority\nBC:34:00:00:00:00/28\tRedvision CCTV\nBC:34:00:10:00:00/28\tIPLINK Technology Corp\nBC:34:00:20:00:00/28\tLifeSmart\nBC:34:00:30:00:00/28\tAltronix Corporation\nBC:34:00:40:00:00/28\tDexcel Design Pvt Ltd\nBC:34:00:50:00:00/28\tNDSL, Inc.\nBC:34:00:60:00:00/28\tCameron\nBC:34:00:70:00:00/28\tQ-PRODUCTS a. s.\nBC:34:00:80:00:00/28\tMatica Technologies Ag\nBC:34:00:90:00:00/28\tShenzhen PHilorise Technical Limited\nBC:34:00:A0:00:00/28\tAuralic Limited\nBC:34:00:B0:00:00/28\tFaro Technologies, Inc.\nBC:34:00:C0:00:00/28\tParlay Labs dba Highfive\nBC:34:00:D0:00:00/28\tHangzhou Linker Digital Technology Co., Ltd\nBC:34:00:E0:00:00/28\tLLD Technology Ltd.\nBC:34:00:F0:00:00/28\tPrivate\nBC:34:CA\t\tInovance\nBC:35:1E\t\tTuya Smart Inc.\nBC:35:E5\t\tHydro Systems Company\nBC:37:D3\t\tApple, Inc.\nBC:38:65\t\tJwcnetworks\nBC:38:98\t\tIntel Corporate\nBC:38:D2\t\tPandachip Limited\nBC:39:A6\t\tCSUN System Technology Co.,LTD\nBC:39:D9\t\tZ-Tec\nBC:3A:EA\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nBC:3B:AF\t\tApple, Inc.\nBC:3D:85\t\tHuawei Technologies Co.,Ltd\nBC:3E:07\t\tHitron Technologies. Inc\nBC:3E:0B\t\tPanasonic Connect Co., Ltd.\nBC:3E:13\t\tAccordance Systems Inc.\nBC:3E:CB\t\tvivo Mobile Communication Co., Ltd.\nBC:3F:4E\t\tGreat Talent Technology Limited\nBC:3F:8F\t\tHuawei Technologies Co.,Ltd\nBC:41:00\t\tCODACO ELECTRONIC s.r.o.\nBC:41:01\t\tShenzhen TINNO Mobile Technology Corp.\nBC:41:A0\t\tzte corporation\nBC:42:8C\t\tAlpsalpine Co,.Ltd\nBC:43:77\t\tHang Zhou Huite Technology Co.,ltd.\nBC:44:34\t\tShenzhen TINNO Mobile Technology Corp.\nBC:44:86\t\tSamsung Electronics Co.,Ltd\nBC:44:B0\t\tElastifile\nBC:45:29\t\tzte corporation\nBC:45:2E\t\tKnowledge Development for POF S.L.\nBC:45:48\t\tBeijing gpthink technology co.,LTD.\nBC:45:5B\t\tSamsung Electronics Co.,Ltd\nBC:45:8C\t\tShenzhen Topwise Communication Co.,Ltd\nBC:46:32\t\tFiberhome Telecommunication Technologies Co.,LTD\nBC:46:99\t\tTp-Link Technologies Co.,Ltd.\nBC:47:60\t\tSamsung Electronics Co.,Ltd\nBC:49:B2\t\tShenzhen Along Communication Tech Co., Ltd\nBC:4A:56\t\tCisco Systems, Inc\nBC:4B:79\t\tSensingTek\nBC:4C:78\t\tHuawei Technologies Co.,Ltd\nBC:4C:A0\t\tHuawei Technologies Co.,Ltd\nBC:4C:C4\t\tApple, Inc.\nBC:4D:FB\t\tHitron Technologies. Inc\nBC:4E:3C\t\tCore Staff Co., Ltd.\nBC:4E:5D\t\tZhongMiao Technology Co., Ltd.\nBC:51:5F\t\tNokia Solutions and Networks India Private Limited\nBC:51:FE\t\tSwann communications Pty Ltd\nBC:52:74\t\tSamsung Electronics Co.,Ltd\nBC:52:B4\t\tNokia\nBC:52:B7\t\tApple, Inc.\nBC:54:2F\t\tIntel Corporate\nBC:54:36\t\tApple, Inc.\nBC:54:51\t\tSamsung Electronics Co.,Ltd\nBC:54:F9\t\tDrogoo Technology Co., Ltd.\nBC:54:FC\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\nBC:57:29\t\tShenzhen KKM Co., Ltd\nBC:5A:56\t\tCisco Systems, Inc\nBC:5B:D5\t\tCommscope\nBC:5C:17\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\nBC:5C:4C\t\tElecom Co.,Ltd.\nBC:5D:A3\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nBC:5E:33\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nBC:5E:91\t\tHonor Device Co., Ltd.\nBC:5E:A1\t\tPsiKick, Inc.\nBC:5F:F4\t\tASRock Incorporation\nBC:5F:F6\t\tMercury Communication Technologies Co.,Ltd.\nBC:60:10\t\tQingdao Hisense Communications Co.,Ltd.\nBC:60:6B\t\tShanghai Baud Data Communication Co.,Ltd.\nBC:60:A7\t\tSony Interactive Entertainment Inc.\nBC:61:93\t\tXiaomi Communications Co Ltd\nBC:62:0E\t\tHuawei Technologies Co.,Ltd\nBC:62:9C\t\tzte corporation\nBC:62:9F\t\tTelenet Systems P. Ltd.\nBC:62:CE\t\tNetis Technology Co., Ltd.\nBC:62:D2\t\tGenexis International B.V.\nBC:64:4B\t\tCommscope\nBC:64:D9\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nBC:66:41\t\tIEEE Registration Authority\nBC:66:41:00:00:00/28\tInSync Technology Ltd\nBC:66:41:10:00:00/28\tGlobal China Technology Limited\nBC:66:41:20:00:00/28\tProcess-Electronic Sp. z o.o.\nBC:66:41:30:00:00/28\tSolectria Renewables, LLC\nBC:66:41:40:00:00/28\tArgus-Spectrum\nBC:66:41:50:00:00/28\tScientific Games\nBC:66:41:60:00:00/28\tIntuitive Surgical, Inc\nBC:66:41:70:00:00/28\tVSN Mobil\nBC:66:41:80:00:00/28\tShenzhen Yaguang communication CO.,LTD\nBC:66:41:90:00:00/28\tShenzhen General Measure Technology Co., Ltd\nBC:66:41:A0:00:00/28\tEBlink\nBC:66:41:B0:00:00/28\tSidus Novum Sp. z o. o.\nBC:66:41:C0:00:00/28\tShenzhen Crave Communication Co.,ltd\nBC:66:41:D0:00:00/28\tUtilLighting Co.,Ltd.\nBC:66:41:E0:00:00/28\tLucent Trans Electronics Co., Ltd\nBC:66:41:F0:00:00/28\tPrivate\nBC:66:DE\t\tShadow Creator Information Technology Co.,Ltd.\nBC:67:1C\t\tCisco Systems, Inc\nBC:67:78\t\tApple, Inc.\nBC:67:84\t\tEnvironics Oy\nBC:69:CB\t\tPanasonic Electric Works Networks Co., Ltd.\nBC:6A:16\t\ttdvine\nBC:6A:29\t\tTexas Instruments\nBC:6A:2F\t\tHenge Docks LLC\nBC:6A:44\t\tCommend International GmbH\nBC:6A:D1\t\tXiaomi Communications Co Ltd\nBC:6B:4D\t\tNokia\nBC:6B:FF\t\tGuangzhou Shiyuan Electronic Technology Company Limited\nBC:6C:21\t\tApple, Inc.\nBC:6D:05\t\tDusun Electron Co.,Ltd.\nBC:6E:64\t\tSony Corporation\nBC:6E:6D\t\tEM Microelectronic\nBC:6E:76\t\tGreen Energy Options Ltd\nBC:6E:E2\t\tIntel Corporate\nBC:71:C1\t\tXTrillion, Inc.\nBC:72:B1\t\tSamsung Electronics Co.,Ltd\nBC:73:A4\t\tAnda Telecom Pvt Ltd\nBC:74:4B\t\tNintendo Co.,Ltd\nBC:74:D7\t\tHangZhou JuRu Technology CO.,LTD\nBC:75:36\t\tAlpsalpine Co,.Ltd\nBC:75:74\t\tHuawei Technologies Co.,Ltd\nBC:75:96\t\tBeijing Broadwit Technology Co., Ltd.\nBC:76:4E\t\tRackspace US, Inc.\nBC:76:5E\t\tSamsung Electronics Co.,Ltd\nBC:76:70\t\tHuawei Technologies Co.,Ltd\nBC:76:C5\t\tHuawei Technologies Co.,Ltd\nBC:76:F9\t\tUbiquoss Inc\nBC:77:37\t\tIntel Corporate\nBC:77:9F\t\tSBM Co., Ltd.\nBC:79:AD\t\tSamsung Electronics Co.,Ltd\nBC:7A:BF\t\tSamsung Electronics Co.,Ltd\nBC:7B:72\t\tHuawei Device Co., Ltd.\nBC:7D:D1\t\tRadio Data Comms\nBC:7E:8B\t\tSamsung Electronics Co.,Ltd\nBC:7E:C3\t\tZyxel Communications Corporation\nBC:7F:7B\t\tHuawei Device Co., Ltd.\nBC:7F:A4\t\tXiaomi Communications Co Ltd\nBC:80:4E\t\tApple, Inc.\nBC:81:1F\t\tIngate Systems\nBC:81:99\t\tBASIC Co.,Ltd.\nBC:82:5D\t\tMitsumi Electric Co.,Ltd.\nBC:83:85\t\tMicrosoft Corporation\nBC:83:A7\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\nBC:85:1F\t\tSamsung Electronics Co.,Ltd\nBC:85:29\t\tJiangxi Remote lntelligence Technology Co.,Ltd\nBC:85:56\t\tHon Hai Precision Ind. Co.,Ltd.\nBC:85:D0\t\tSky Uk Limited\nBC:86:A5\t\tCambridge Mobile Telematics, Inc.\nBC:87:FA\t\tBose Corporation\nBC:88:93\t\tVILLBAU Ltd.\nBC:88:C3\t\tNingbo Dooya Mechanic & Electronic Technology Co., Ltd\nBC:89:A6\t\tNintendo Co.,Ltd\nBC:89:A7\t\tApple, Inc.\nBC:8A:A3\t\tNHN Entertainment\nBC:8A:E8\t\tQing Dao Haier Telecom Co.,Ltd.\nBC:8B:55\t\tNPP ELIKS America Inc. DBA T&M Atlantic\nBC:8C:CD\t\tSamsung Electro-Mechanics(Thailand)\nBC:8D:0E\t\tNokia\nBC:8D:1F\t\tCisco Systems, Inc\nBC:8D:7E\t\tSilicon Laboratories\nBC:90:3A\t\tRobert Bosch GmbH\nBC:91:B5\t\tInfinix mobility limited\nBC:92:6B\t\tApple, Inc.\nBC:93:07\t\tSamsung Electronics Co.,Ltd\nBC:93:25\t\tNingbo Joyson Preh Car Connect Co.,Ltd.\nBC:94:24\t\tTCT mobile ltd\nBC:96:80\t\tShenzhen Gongjin Electronics Co.,Lt\nBC:96:E5\t\tSercomm Philippines Inc\nBC:97:40\t\tIEEE Registration Authority\nBC:97:40:00:00:00/28\tAlpha ESS Co., Ltd.\nBC:97:40:10:00:00/28\tcomtac AG\nBC:97:40:20:00:00/28\tLattec I/S\nBC:97:40:30:00:00/28\tPrecision Galaxy Pvt. Ltd\nBC:97:40:40:00:00/28\tWind Mobility Technology (Beijing) Co., Ltd\nBC:97:40:50:00:00/28\tShanghai Laisi Information Technology Co.,Ltd\nBC:97:40:60:00:00/28\tShenzhen Colorwin Optical Technology Co.,Ltd\nBC:97:40:70:00:00/28\tAirfi Oy AB\nBC:97:40:80:00:00/28\tGaodi Rus\nBC:97:40:90:00:00/28\tDirect Communication Solutions\nBC:97:40:A0:00:00/28\tAmap Information Technology Co., Ltd\nBC:97:40:B0:00:00/28\tForoTel\nBC:97:40:C0:00:00/28\tLISTEC GmbH\nBC:97:40:D0:00:00/28\tRollock Oy\nBC:97:40:E0:00:00/28\tB4ComTechnologies LLC\nBC:97:89\t\tHuawei Device Co., Ltd.\nBC:97:E1\t\tBroadcom Limited\nBC:98:29\t\tvivo Mobile Communication Co., Ltd.\nBC:98:89\t\tFiberhome Telecommunication Technologies Co.,LTD\nBC:98:DF\t\tMotorola Mobility LLC, a Lenovo Company\nBC:99:11\t\tZyxel Communications Corporation\nBC:99:30\t\tHuawei Technologies Co.,Ltd\nBC:99:BC\t\tFonSee Technology Inc.\nBC:9A:53\t\tHuawei Device Co., Ltd.\nBC:9A:8E\t\tHumax Networks\nBC:9B:5E\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nBC:9B:68\t\tVantiva USA LLC\nBC:9C:31\t\tHuawei Technologies Co.,Ltd\nBC:9C:C5\t\tBeijing Huafei Technology Co., Ltd.\nBC:9D:37\t\tTelink Micro LLC\nBC:9D:42\t\tShenzhen Rf-Link Technology Co.,Ltd.\nBC:9D:4E\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nBC:9D:A5\t\tDASCOM Europe GmbH\nBC:9E:2C\t\tChina Mobile Group Device Co.,Ltd.\nBC:9E:BB\t\tNintendo Co.,Ltd\nBC:9F:58\t\tApple, Inc.\nBC:9F:E4\t\tHewlett Packard Enterprise\nBC:9F:EF\t\tApple, Inc.\nBC:A0:42\t\tShanghai Flyco Electrical Appliance Co.,Ltd\nBC:A0:80\t\tSamsung Electronics Co.,Ltd\nBC:A0:B9\t\tHuawei Technologies Co.,Ltd\nBC:A1:3A\t\tVusionGroup\nBC:A2:31\t\tHuawei Technologies Co.,Ltd\nBC:A3:7F\t\tRail-Mil Sp. z o.o. Sp. K.\nBC:A4:E1\t\tNabto\nBC:A5:11\t\tNetgear\nBC:A5:8B\t\tSamsung Electronics Co.,Ltd\nBC:A5:A9\t\tApple, Inc.\nBC:A6:8D\t\tContinetal Automotive Systems Sibiu\nBC:A8:A6\t\tIntel Corporate\nBC:A9:20\t\tApple, Inc.\nBC:A9:93\t\tCambium Networks Limited\nBC:A9:D6\t\tCyber-Rain, Inc.\nBC:AB:7C\t\tTRnP KOREA Co Ltd\nBC:AD:28\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nBC:AD:90\t\tKymeta Purchasing\nBC:AD:AB\t\tAvaya Inc\nBC:AD:AE\t\tAltoBeam Inc.\nBC:AE:C5\t\tASUSTek COMPUTER INC.\nBC:AF:87\t\tsmartAC.com, Inc.\nBC:AF:91\t\tTE Connectivity Sensor Solutions\nBC:B0:E7\t\tHuawei Technologies Co.,Ltd\nBC:B1:81\t\tSharp Corporation\nBC:B1:D3\t\tCisco Meraki\nBC:B1:F3\t\tSamsung Electronics Co.,Ltd\nBC:B2:2B\t\tEM-Tech\nBC:B2:CC\t\tSamsung Electronics Co.,Ltd\nBC:B3:08\t\tHongkong Ragentek Communication Technology Co.,Limited\nBC:B4:FD\t\tNXP Semiconductor (Tianjin) LTD.\nBC:B6:FB\t\tP4Q Electronics, S.L.\nBC:B8:52\t\tCybera, Inc.\nBC:B8:63\t\tApple, Inc.\nBC:B9:23\t\tAlta Networks\nBC:BA:C2\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nBC:BA:E1\t\tAREC Inc.\nBC:BB:58\t\tApple, Inc.\nBC:BB:C9\t\tKellendonk Elektronik GmbH\nBC:BC:46\t\tSKS Welding Systems GmbH\nBC:BD:84\t\tzte corporation\nBC:BD:9E\t\tItel Mobile Limited\nBC:BE:FB\t\tASL Xiamen Technology CO., LTD\nBC:C0:0F\t\tFiberhome Telecommunication Technologies Co.,LTD\nBC:C1:68\t\tDinBox Sverige AB\nBC:C2:3A\t\tThomson Video Networks\nBC:C2:D9\t\tPrivate\nBC:C3:1B\t\tKygo Life A\nBC:C3:42\t\tPanasonic Communications Co., Ltd.\nBC:C4:27\t\tHuawei Technologies Co.,Ltd\nBC:C4:93\t\tCisco Systems, Inc\nBC:C6:1A\t\tSpectra Embedded Systems\nBC:C6:DB\t\tNokia Corporation\nBC:C7:46\t\tHon Hai Precision IND.CO.,LTD\nBC:C7:DA\t\tEarda Technologies co Ltd\nBC:C8:10\t\tCisco SPVTG\nBC:CA:B5\t\tCommscope\nBC:CD:45\t\tVoismart\nBC:CD:7F\t\tHuawei Device Co., Ltd.\nBC:CD:99\t\tIntel Corporate\nBC:CE:25\t\tNintendo Co.,Ltd\nBC:CF:4F\t\tZyxel Communications Corporation\nBC:CF:CC\t\tHTC Corporation\nBC:D0:74\t\tApple, Inc.\nBC:D0:EB\t\tNew H3C Technologies Co., Ltd\nBC:D1:1F\t\tSamsung Electronics Co.,Ltd\nBC:D1:65\t\tCisco SPVTG\nBC:D1:77\t\tTp-Link Technologies Co.,Ltd.\nBC:D1:D3\t\tShenzhen TINNO Mobile Technology Corp.\nBC:D2:06\t\tHuawei Technologies Co.,Ltd\nBC:D2:2C\t\tIntel Corporate\nBC:D2:95\t\tCisco Systems, Inc\nBC:D5:B6\t\td2d technologies\nBC:D5:ED\t\tSagemcom Broadband SAS\nBC:D7:13\t\tOwl Labs\nBC:D7:67\t\tBAE Systems Apllied Intelligence\nBC:D7:A5\t\tHewlett Packard Enterprise\nBC:D7:CE\t\tChina Mobile (Hangzhou) Information Technology Co., Ltd.\nBC:D7:D4\t\tRoku, Inc\nBC:D9:40\t\tASR Co,.Ltd.\nBC:DB:09\t\tCisco Meraki\nBC:DD:C2\t\tEspressif Inc.\nBC:DF:58\t\tGoogle, Inc.\nBC:DF:E1\t\tIEEE Registration Authority\nBC:DF:E1:00:00:00/28\tShenzhen Galaxy Century Information Technology Co.,Ltd\nBC:DF:E1:10:00:00/28\tShenzhen Valley Ventures Co.,Ltd.\nBC:DF:E1:20:00:00/28\tShanghai Zhuoyu Communication Technology Co., Ltd\nBC:DF:E1:30:00:00/28\tSystem Industrie Electronic GmbH\nBC:DF:E1:40:00:00/28\tOchno AB\nBC:DF:E1:50:00:00/28\tEnli Inc.\nBC:DF:E1:60:00:00/28\tD3 Technical Partners, LLC\nBC:DF:E1:70:00:00/28\tDatabridge Dynamic\nBC:DF:E1:80:00:00/28\tCortex Systems\nBC:DF:E1:90:00:00/28\tAnnapurna labs\nBC:DF:E1:A0:00:00/28\tBuilding Automation Products Inc.\nBC:DF:E1:B0:00:00/28\tHi-Target Surveying Instrument Co.,Ltd\nBC:DF:E1:C0:00:00/28\tXY Sense, Inc.\nBC:DF:E1:D0:00:00/28\tUgpa Llc\nBC:DF:E1:E0:00:00/28\tClairvoyant Technology Inc.\nBC:E0:01\t\tNetis Technology Co., Ltd.\nBC:E0:9D\t\tEoslink\nBC:E1:43\t\tApple, Inc.\nBC:E2:65\t\tHuawei Technologies Co.,Ltd\nBC:E5:9F\t\tWATERWORLD Technology Co.,LTD\nBC:E6:3F\t\tSamsung Electronics Co.,Ltd\nBC:E6:7C\t\tCambium Networks Limited\nBC:E7:12\t\tCisco Systems, Inc\nBC:E7:67\t\tQuanzhou  TDX Electronics Co., Ltd\nBC:E7:96\t\tWireless CCTV Ltd\nBC:E8:FA\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nBC:E9:2F\t\tHP Inc.\nBC:E9:E2\t\tBrocade Communications Systems LLC\nBC:EA:2B\t\tCityCom GmbH\nBC:EA:9C\t\tItel Mobile Limited\nBC:EA:FA\t\tHewlett Packard\nBC:EB:5F\t\tFujian Beifeng Telecom Technology Co., Ltd.\nBC:EC:23\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\nBC:EC:5D\t\tApple, Inc.\nBC:EC:A0\t\tCompal Information (Kunshan) Co., Ltd.\nBC:EE:7B\t\tASUSTek COMPUTER INC.\nBC:F1:05\t\tIntel Corporate\nBC:F1:71\t\tIntel Corporate\nBC:F1:F2\t\tCisco Systems, Inc\nBC:F2:12\t\tTelink Micro LLC\nBC:F2:92\t\tPlantronics, Inc.\nBC:F2:AF\t\tdevolo AG\nBC:F2:E5\t\tPowerful Devices\nBC:F3:10\t\tExtreme Networks Headquarters\nBC:F4:5F\t\tzte corporation\nBC:F4:99\t\tRockwell Automation\nBC:F4:D4\t\tCloud Network Technology Singapore Pte. Ltd.\nBC:F5:AC\t\tLG Electronics (Mobile Communications)\nBC:F6:1C\t\tGeomodeling Wuxi Technology Co. Ltd.\nBC:F6:85\t\tD-Link International\nBC:F7:30\t\tSamsung Electronics Co.,Ltd\nBC:F8:11\t\tXiamen DNAKE Technology Co.,Ltd\nBC:F8:7E\t\tArcadyan Corporation\nBC:F8:8B\t\tzte corporation\nBC:F9:F2\t\tTeko\nBC:FA:B8\t\tGuangzhou Shiyuan Electronic Technology Company Limited\nBC:FA:EB\t\tCisco Systems, Inc\nBC:FC:E7\t\tASUSTek COMPUTER INC.\nBC:FD:0C\t\tShenzhen Phaten Tech. LTD\nBC:FE:8C\t\tAltronic, LLC\nBC:FE:D9\t\tApple, Inc.\nBC:FF:21\t\tSmart Code(shenzhen)Technology Co.,Ltd\nBC:FF:4D\t\tEspressif Inc.\nBC:FF:54\t\tzte corporation\nBC:FF:AC\t\tTopcon Corporation\nBC:FF:EB\t\tMotorola Mobility LLC, a Lenovo Company\nC0:02:8D\t\tWINSTAR Display CO.,Ltd\nC0:03:80\t\tJuniper Networks\nC0:05:C2\t\tCommscope\nC0:06:0C\t\tHuawei Technologies Co.,Ltd\nC0:06:C3\t\tTP-Link Systems Inc\nC0:07:4A\t\tBrita GmbH\nC0:09:25\t\tFN-LINK TECHNOLOGY Ltd.\nC0:0D:7E\t\tAdditech, Inc.\nC0:10:B1\t\tHMD Global Oy\nC0:11:73\t\tSamsung Electronics Co.,Ltd\nC0:11:A6\t\tFort-Telecom ltd.\nC0:12:42\t\tAlpha Security Products\nC0:13:2B\t\tSichuan Changhong Electric Ltd.\nC0:14:3D\t\tHon Hai Precision Ind. Co.,Ltd.\nC0:14:B8\t\tNokia\nC0:14:FE\t\tCisco Systems, Inc\nC0:15:1B\t\tSony Interactive Entertainment Inc.\nC0:16:92\t\tChina Mobile Group Device Co.,Ltd.\nC0:16:93\t\tXiaomi Communications Co Ltd\nC0:17:4D\t\tSamsung Electronics Co.,Ltd\nC0:17:54\t\tApple, Inc.\nC0:18:03\t\tHP Inc.\nC0:18:50\t\tQuanta Computer Inc.\nC0:18:85\t\tHon Hai Precision Ind. Co.,Ltd.\nC0:19:44\t\tJuniper Networks\nC0:1A:DA\t\tApple, Inc.\nC0:1B:23\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nC0:1C:30\t\tShenzhen WIFI-3L Technology Co.,Ltd\nC0:1C:6A\t\tGoogle, Inc.\nC0:1E:9B\t\tPixavi AS\nC0:21:0D\t\tShenzhen Rf-Link Technology Co.,Ltd.\nC0:22:42\t\tChauvet\nC0:22:50\t\tKoss Corporation\nC0:22:F1\t\tIEEE Registration Authority\nC0:22:F1:00:00:00/28\tRCT Power GmbH\nC0:22:F1:10:00:00/28\tCommup Wuhan Network Technology Co.,Ltd\nC0:22:F1:20:00:00/28\tTSURUGA Electric Corporation\nC0:22:F1:30:00:00/28\tSpectra Technologies India Private Limited\nC0:22:F1:40:00:00/28\tAndritz AB\nC0:22:F1:50:00:00/28\tCanon Electronic Business Machines (H.K.) Co., Ltd.\nC0:22:F1:60:00:00/28\tPony.AI, INC.\nC0:22:F1:70:00:00/28\tShenzhen Chengfenghao Electronics Co.;LTD.\nC0:22:F1:80:00:00/28\tUtopiaTech Private Limited\nC0:22:F1:90:00:00/28\tMahindr & Mahindra\nC0:22:F1:A0:00:00/28\tBosch Automotive Products (Suzhou) Co., Ltd.\nC0:22:F1:B0:00:00/28\tLafayette AB\nC0:22:F1:C0:00:00/28\tAccelsius LLC\nC0:22:F1:D0:00:00/28\tEnvent Engineering\nC0:22:F1:E0:00:00/28\tMasimo Corporation\nC0:23:8D\t\tSamsung Electronics Co.,Ltd\nC0:25:06\t\tAVM GmbH\nC0:25:2F\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\nC0:25:5C\t\tCisco Systems, Inc\nC0:25:67\t\tNexxt Solutions\nC0:25:A2\t\tNEC Platforms, Ltd.\nC0:25:A5\t\tDell Inc.\nC0:25:E9\t\tTp-Link Technologies Co.,Ltd.\nC0:27:B9\t\tBeijing National Railway Research & Design Institute  of Signal & Communication Co., Ltd.\nC0:28:0B\t\tHonor Device Co., Ltd.\nC0:28:8D\t\tLogitech, Inc\nC0:29:73\t\tAudyssey Laboratories Inc.\nC0:29:F3\t\tXySystem\nC0:2B:31\t\tPhytium Technology Co.,Ltd.\nC0:2B:56\t\tCandid Optronix Private Limited\nC0:2B:FC\t\tiNES. applied informatics GmbH\nC0:2C:17\t\tCisco Systems, Inc\nC0:2C:5C\t\tApple, Inc.\nC0:2C:7A\t\tShenzhen Horn Audio Co.,Ltd.\nC0:2C:ED\t\tSilicon Laboratories\nC0:2D:2E\t\tChina Mobile Group Device Co.,Ltd.\nC0:2D:EE\t\tCuff\nC0:2E:25\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nC0:2E:26\t\tiRhythm Technologies, Inc.\nC0:2F:F1\t\tVolta Networks\nC0:33:5E\t\tMicrosoft\nC0:33:79\t\tHuawei Technologies Co.,Ltd\nC0:33:DA\t\tShenzhen JRUN Technologies CO., LTD\nC0:34:B4\t\tGigastone Corporation\nC0:35:32\t\tLiteon Technology Corporation\nC0:35:80\t\tA&R Tech\nC0:35:BD\t\tVelocytech Aps\nC0:35:C5\t\tProsoft Systems LTD\nC0:36:53\t\teero inc.\nC0:36:56\t\tFiberhome Telecommunication Technologies Co.,LTD\nC0:38:96\t\tHon Hai Precision Ind. Co.,Ltd.\nC0:38:F9\t\tNokia Danmark A/S\nC0:39:37\t\tGree Electric Appliances, Inc. Of Zhuhai\nC0:39:5A\t\tZhejiang Dahua Technology Co., Ltd.\nC0:3B:8F\t\tMinicom Digital Signage\nC0:3C:04\t\tSagemcom Broadband SAS\nC0:3C:59\t\tIntel Corporate\nC0:3D:03\t\tSamsung Electronics Co.,Ltd\nC0:3D:46\t\tShanghai Sango Network Technology Co.,Ltd\nC0:3D:D9\t\tMitraStar Technology Corp.\nC0:3E:0F\t\tSky Uk Limited\nC0:3E:50\t\tHuawei Technologies Co.,Ltd\nC0:3E:BA\t\tDell Inc.\nC0:3F:0E\t\tNetgear\nC0:3F:2A\t\tBiscotti, Inc.\nC0:3F:BB\t\tZhongshan Zhiniu Electronics Co.,Ltd.\nC0:3F:D5\t\tElitegroup Computer Systems Co.,Ltd.\nC0:3F:DD\t\tHuawei Technologies Co.,Ltd\nC0:40:04\t\tMedicaroid Corporation\nC0:41:21\t\tNokia Solutions and Networks GmbH & Co. KG\nC0:41:F6\t\tLg Electronics Inc\nC0:42:D0\t\tJuniper Networks\nC0:43:01\t\tEpec Oy\nC0:43:27\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nC0:44:42\t\tApple, Inc.\nC0:44:E3\t\tShenzhen Sinkna Electronics Co., LTD\nC0:47:0E\t\tDell Inc.\nC0:47:54\t\tvivo Mobile Communication Co., Ltd.\nC0:48:2F\t\tIEEE Registration Authority\nC0:48:2F:00:00:00/28\tProtect A/S\nC0:48:2F:10:00:00/28\tSichuan Xutai communication equipment Co., LTD\nC0:48:2F:20:00:00/28\tAISWEI Technology Co.\nC0:48:2F:30:00:00/28\tQingdao Xijiao Ruihang Rail Equipment Co., Ltd.\nC0:48:2F:40:00:00/28\tAltice Labs India\nC0:48:2F:50:00:00/28\tShenzhen Thinkercu Electronic Technology Co., Ltd\nC0:48:2F:60:00:00/28\tChengdu Dingfeng Huizhi Technology Co., Ltd\nC0:48:2F:70:00:00/28\tMegawin Switchgear Pvt. Ltd.\nC0:48:2F:80:00:00/28\tBeijing D&S Fieldbus Technology co.,Ltd\nC0:48:2F:90:00:00/28\tHystrone Technology (HongKong) Co., Limited\nC0:48:2F:A0:00:00/28\tWillstrong Solutions Private Limited\nC0:48:2F:B0:00:00/28\tShenzhen C & D Electronics Co., Ltd.\nC0:48:2F:C0:00:00/28\tLunar USA Inc.\nC0:48:2F:D0:00:00/28\tSecurico Electronics India Ltd\nC0:48:2F:E0:00:00/28\tShenzhen Guan Chen Electronic Co.,LTD\nC0:48:84\t\tSigma Bilisim Sist. Tekn. Elk. Enj. ve San. D??. Tic. Ltd. ?ti.\nC0:48:E6\t\tSamsung Electronics Co.,Ltd\nC0:48:FB\t\tShenzhen JingHanDa Electronics Co.Ltd\nC0:49:3D\t\tMaitrise Technologique\nC0:49:43\t\tzte corporation\nC0:49:BD\t\tEM Microelectronic\nC0:49:EF\t\tEspressif Inc.\nC0:4A:00\t\tTp-Link Technologies Co.,Ltd.\nC0:4A:09\t\tZhejiang Everbright Communication Equip. Co,. Ltd\nC0:4A:0E\t\tTexas Instruments\nC0:4B:13\t\tWonderSound Technology Co., Ltd\nC0:4D:F7\t\tSerelec\nC0:4E:30\t\tEspressif Inc.\nC0:4E:8A\t\tHuawei Technologies Co.,Ltd\nC0:50:64\t\tShennan Circuits Co.,Ltd\nC0:51:5C\t\tzte corporation\nC0:51:7E\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nC0:51:F3\t\tCig Shanghai Co Ltd\nC0:52:34\t\tHuawei Technologies Co.,Ltd\nC0:53:36\t\tBeijing National Railway Research & Design Institute of Signal & Communication Group Co..Ltd.\nC0:54:4D\t\tNokia Shanghai Bell Co., Ltd.\nC0:55:5C\t\tImpulse Labs\nC0:56:27\t\tBelkin International Inc.\nC0:56:E3\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nC0:57:BC\t\tAvaya Inc\nC0:58:A7\t\tPico Systems Co., Ltd.\nC0:5B:44\t\tBeijing Xiaomi Mobile Software Co., Ltd\nC0:5D:39\t\tJiangsu Huitong Group Co.,Ltd.\nC0:5D:89\t\tEspressif Inc.\nC0:5E:6F\t\tV. Stonkaus firma \"Kodinis Raktas\"\nC0:5E:79\t\tShenzhen Huaxun Ark Technologies Co.,Ltd\nC0:5F:87\t\tLegrand INTELLIGENT ELECTRICAL(HUIZHOU)CO.,LTD.\nC0:61:18\t\tTp-Link Technologies Co.,Ltd.\nC0:61:3D\t\tBioIntelliSense, Inc.\nC0:61:9A\t\tIEEE Registration Authority\nC0:61:9A:00:00:00/28\tParagon Robotics LLC\nC0:61:9A:10:00:00/28\tKidKraft\nC0:61:9A:20:00:00/28\tGrup Arge Enerji ve Kontrol Sistemleri\nC0:61:9A:30:00:00/28\tLyand Acoustic Technology Co.,Ltd.\nC0:61:9A:40:00:00/28\tStello\nC0:61:9A:50:00:00/28\tNanjing Balance Network Technology Co., Ltd\nC0:61:9A:60:00:00/28\tIPG Automotive GmbH\nC0:61:9A:70:00:00/28\tMad Piece Llc.\nC0:61:9A:80:00:00/28\tNanjing SinoVatio Technology Co., Ltd\nC0:61:9A:90:00:00/28\tWingtech Mobile Communications  Co.,Ltd.\nC0:61:9A:A0:00:00/28\tGronn Kontakt AS\nC0:61:9A:B0:00:00/28\tVictron Energy B.V.\nC0:61:9A:C0:00:00/28\tJAM-Labs Corp\nC0:61:9A:D0:00:00/28\tUhnder\nC0:61:9A:E0:00:00/28\tZhejiang Haikang Science And Technology Co.,Ltd\nC0:62:6B\t\tCisco Systems, Inc\nC0:63:69\t\tBinxin Technology(Zhejiang) Ltd.\nC0:63:80\t\tTexas Instruments\nC0:63:94\t\tApple, Inc.\nC0:64:C6\t\tNokia Corporation\nC0:64:E4\t\tCisco Systems, Inc\nC0:65:99\t\tSamsung Electronics Co.,Ltd\nC0:67:AF\t\tCisco Systems, Inc\nC0:68:CC\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nC0:69:11\t\tArista Networks\nC0:6B:55\t\tMotorola Mobility LLC, a Lenovo Company\nC0:6C:0C\t\tApple, Inc.\nC0:6C:0F\t\tDobbs Stanford\nC0:6C:6D\t\tMagneMotion, Inc.\nC0:6D:1A\t\tTianjin Henxinhuifeng Technology Co.,Ltd.\nC0:6D:ED\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nC0:6F:98\t\teero inc.\nC0:70:09\t\tHuawei Technologies Co.,Ltd\nC0:71:AA\t\tShenZhen OnMicro Electronics Co.,Ltd.\nC0:74:15\t\tIntelPro Inc.\nC0:74:2B\t\tShenzhen Xunlong Software Co.,Limited\nC0:74:AD\t\tGrandstream Networks, Inc.\nC0:78:31\t\tHuawei Device Co., Ltd.\nC0:78:78\t\tFlextronics Manufacturing(Zhuhai)Co.,Ltd.\nC0:79:82\t\tTCL King Electrical Appliances(Huizhou)Co.,Ltd\nC0:7A:D6\t\tSamsung Electronics Co.,Ltd\nC0:7B:BC\t\tCisco Systems, Inc\nC0:7C:90\t\tShenzhen YOUHUA Technology Co., Ltd\nC0:7C:D1\t\tPegatron Corporation\nC0:7E:40\t\tShenzhen Xdk Communication Equipment Co.,Ltd\nC0:81:35\t\tNingbo Forfan technology Co., LTD\nC0:81:70\t\tEffigis GeoSolutions\nC0:83:0A\t\t2Wire Inc\nC0:83:59\t\tIEEE Registration Authority\nC0:83:59:00:00:00/28\tChongqing Jiuyu Smart Technology Co.Ltd.\nC0:83:59:10:00:00/28\tGemvax Technology ,. Co.Ltd\nC0:83:59:20:00:00/28\tHuaxin SM Optics Co. LTD.\nC0:83:59:30:00:00/28\tPCH Engineering A/S\nC0:83:59:40:00:00/28\tUNA Digital Inc.\nC0:83:59:50:00:00/28\tViper Design, LLC\nC0:83:59:60:00:00/28\tBeijing Cloud Fly Technology Development Co.Ltd\nC0:83:59:70:00:00/28\tFuzhou Fdlinker Technology Co.,LTD\nC0:83:59:80:00:00/28\tIsta SE\nC0:83:59:90:00:00/28\tShenzhen Pay Device Technology Co., Ltd.\nC0:83:59:A0:00:00/28\tShanghai Charmhope Information Technology Co.,Ltd.\nC0:83:59:B0:00:00/28\tSuzhou Siheng Science and Technology Ltd.\nC0:83:59:C0:00:00/28\tPrivate\nC0:83:59:D0:00:00/28\tGardner Denver Thomas GmbH\nC0:83:59:E0:00:00/28\tTrystar, LLC\nC0:83:C9\t\tHuawei Device Co., Ltd.\nC0:84:7A\t\tApple, Inc.\nC0:84:7D\t\tAMPAK Technology, Inc.\nC0:84:88\t\tFinis Inc\nC0:84:E0\t\tHuawei Technologies Co.,Ltd\nC0:84:FF\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nC0:85:4C\t\tRagentek Technology Group\nC0:86:B3\t\tShenzhen Voxtech Co., Ltd.\nC0:87:06\t\tShenzhen Qianfenyi Intelligent Technology Co.,LTD\nC0:87:EB\t\tSamsung Electronics Co.,Ltd\nC0:88:40\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nC0:88:5B\t\tSnD Tech Co., Ltd.\nC0:88:6D\t\tSecurosys SA\nC0:89:97\t\tSamsung Electronics Co.,Ltd\nC0:89:AB\t\tCommscope\nC0:8A:60\t\tAltoBeam Inc.\nC0:8A:CD\t\tGuangzhou Shiyuan Electronic Technology Company Limited\nC0:8A:DE\t\tRuckus Wireless\nC0:8B:05\t\tHuawei Technologies Co.,Ltd\nC0:8B:2A\t\tCisco Systems, Inc\nC0:8B:6F\t\tS I Sistemas Inteligentes Eletrônicos Ltda\nC0:8C:60\t\tCisco Systems, Inc\nC0:8C:71\t\tMotorola Mobility LLC, a Lenovo Company\nC0:8D:51\t\tAmazon Technologies Inc.\nC0:8F:20\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nC0:91:20\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nC0:91:32\t\tPatriot Memory\nC0:91:34\t\tProCurve Networking by HP\nC0:91:B9\t\tAmazon Technologies Inc.\nC0:92:96\t\tzte corporation\nC0:94:35\t\tCommscope\nC0:94:AD\t\tzte corporation\nC0:95:6D\t\tApple, Inc.\nC0:95:73\t\tAIxLink\nC0:95:CF\t\tAmazon Technologies Inc.\nC0:95:DA\t\tNXP India Private Limited\nC0:96:A4\t\tFiberhome Telecommunication Technologies Co.,LTD\nC0:97:27\t\tSamsung Electro-Mechanics(Thailand)\nC0:98:79\t\tAcer Inc.\nC0:98:DA\t\tChina Mobile IOT Company Limited\nC0:98:E5\t\tUniversity of Michigan\nC0:9A:71\t\tXiamen Meitu Mobile Technology Co.Ltd\nC0:9A:D0\t\tApple, Inc.\nC0:9B:63\t\tHuawei Technologies Co.,Ltd\nC0:9B:9E\t\tSilicon Laboratories\nC0:9B:F4\t\tIEEE Registration Authority\nC0:9B:F4:00:00:00/28\tAnnapurna labs\nC0:9B:F4:10:00:00/28\tConnected Space Management\nC0:9B:F4:20:00:00/28\tHitachi High-Tech Materials Corporation\nC0:9B:F4:30:00:00/28\tOsprey Video, Inc\nC0:9B:F4:40:00:00/28\tJsc Npk Atronik\nC0:9B:F4:50:00:00/28\tInfiot Inc.\nC0:9B:F4:60:00:00/28\tLTD Delovoy Office\nC0:9B:F4:70:00:00/28\tBig Dutchman International GmbH\nC0:9B:F4:80:00:00/28\tShenzhen Wins Electronic Technology Co., Ltd\nC0:9B:F4:90:00:00/28\tAlcatraz AI Inc.\nC0:9B:F4:A0:00:00/28\tInveo\nC0:9B:F4:B0:00:00/28\tNuctech Company Limited\nC0:9B:F4:C0:00:00/28\tPinpark Inc.\nC0:9B:F4:D0:00:00/28\tThe Professional Monitor Company Ltd\nC0:9B:F4:E0:00:00/28\tContinental Automotive Component Malaysia Sdn.Bhd.\nC0:9C:04\t\tShaanxi GuoLian Digital TV Technology Co.,Ltd.\nC0:9C:92\t\tCoby\nC0:9D:26\t\tTopicon HK Lmd.\nC0:9F:05\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nC0:9F:42\t\tApple, Inc.\nC0:9F:51\t\tSernet (Suzhou) Technologies Corporation\nC0:9F:E1\t\tzte corporation\nC0:A0:0D\t\tCommscope\nC0:A0:BB\t\tD-Link International\nC0:A0:C7\t\tFairfield Industries\nC0:A0:DE\t\tMulti Touch Oy\nC0:A0:E2\t\tEden Innovations\nC0:A1:A2\t\tMarqMetrix\nC0:A2:6D\t\tAbbott Point of Care\nC0:A3:64\t\t3D Systems Massachusetts\nC0:A3:6E\t\tSky Uk Limited\nC0:A3:9E\t\tEarthCam, Inc.\nC0:A3:C7\t\tTelink Micro LLC\nC0:A4:76\t\tRuijie Networks Co.,LTD\nC0:A5:3E\t\tApple, Inc.\nC0:A5:DD\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\nC0:A5:E8\t\tIntel Corporate\nC0:A6:00\t\tApple, Inc.\nC0:A6:6D\t\tInspur Group Co., Ltd.\nC0:A8:10\t\tIntel Corporate\nC0:A8:F0\t\tAdamson Systems Engineering\nC0:A9:38\t\tHuawei Technologies Co.,Ltd\nC0:AA:68\t\tOSASI Technos Inc.\nC0:AB:2B\t\tHuawei Device Co., Ltd.\nC0:AC:54\t\tSagemcom Broadband SAS\nC0:AD:97\t\tTecno Mobile Limited\nC0:AE:FD\t\tShenzhen HC-WLAN Technology Co.,Ltd\nC0:AF:F2\t\tDyson Limited\nC0:B1:01\t\tzte corporation\nC0:B2:2F\t\tApple, Inc.\nC0:B3:39\t\tComigo Ltd.\nC0:B3:57\t\tYoshiki Electronics Industry Ltd.\nC0:B3:C8\t\tLLC \"NTC Rotek\"\nC0:B4:7D\t\tHuawei Device Co., Ltd.\nC0:B5:CD\t\tHuawei Device Co., Ltd.\nC0:B5:D7\t\tChongqing Fugui Electronics Co.,Ltd.\nC0:B6:58\t\tApple, Inc.\nC0:B6:F9\t\tIntel Corporate\nC0:B7:13\t\tBeijing Xiaoyuer Technology Co. Ltd.\nC0:B8:83\t\tIntel Corporate\nC0:B8:B1\t\tBitBox Ltd\nC0:B8:E6\t\tRuijie Networks Co.,LTD\nC0:BA:1F\t\tPrivate\nC0:BA:E6\t\tZenitel GB Ltd\nC0:BC:9A\t\tHuawei Technologies Co.,Ltd\nC0:BD:42\t\tZPA Smart Energy a.s.\nC0:BD:C8\t\tSamsung Electronics Co.,Ltd\nC0:BD:D1\t\tSamsung Electro-Mechanics(Thailand)\nC0:BF:A7\t\tJuniper Networks\nC0:BF:AC\t\tHuawei Device Co., Ltd.\nC0:BF:BE\t\tAzureWave Technology Inc.\nC0:BF:C0\t\tHuawei Technologies Co.,Ltd\nC0:C1:70\t\tShenzhen SuperElectron Technology Co.,Ltd.\nC0:C1:C0\t\tCisco-Linksys, LLC\nC0:C3:B6\t\tAutomatic Systems\nC0:C4:F9\t\tQisda Corporation\nC0:C5:20\t\tRuckus Wireless\nC0:C5:22\t\tCommscope\nC0:C5:69\t\tShanghai Lynuc Cnc Technology Co.,Ltd\nC0:C6:87\t\tCisco SPVTG\nC0:C7:0A\t\tRuckus Wireless\nC0:C7:DB\t\tApple, Inc.\nC0:C9:46\t\tMitsuya Laboratories Inc.\nC0:C9:76\t\tShenzhen TINNO Mobile Technology Corp.\nC0:C9:89\t\tEdgecore Americas Networking Corporation\nC0:C9:E3\t\tTp-Link Technologies Co.,Ltd.\nC0:CB:38\t\tHon Hai Precision Ind. Co.,Ltd.\nC0:CB:F1\t\tMobiwire Mobiles (NingBo) Co., LTD\nC0:CC:42\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nC0:CC:F8\t\tApple, Inc.\nC0:CD:D6\t\tEspressif Inc.\nC0:CE:CD\t\tApple, Inc.\nC0:CF:A3\t\tCreative Electronics & Software, Inc.\nC0:D0:12\t\tApple, Inc.\nC0:D0:26\t\tHuawei Device Co., Ltd.\nC0:D0:44\t\tSagemcom Broadband SAS\nC0:D0:63\t\tEM Microelectronic\nC0:D0:FF\t\tChina Mobile IOT Company Limited\nC0:D1:93\t\tHuawei Device Co., Ltd.\nC0:D2:DD\t\tSamsung Electronics Co.,Ltd\nC0:D2:F3\t\tHui Zhou Gaoshengda Technology Co.,LTD\nC0:D3:91\t\tIEEE Registration Authority\nC0:D3:91:00:00:00/28\tFuzhou Jinshi Technology Co.,Ltd.\nC0:D3:91:10:00:00/28\tB9Creations\nC0:D3:91:20:00:00/28\tHofon Automation Co.,Ltd\nC0:D3:91:30:00:00/28\tIxon B.V.\nC0:D3:91:40:00:00/28\tVernier Software & Technology\nC0:D3:91:50:00:00/28\tWiTagg, Inc\nC0:D3:91:60:00:00/28\tErnitec\nC0:D3:91:70:00:00/28\tALNETz Co.,LTD\nC0:D3:91:80:00:00/28\tXena Security Limited\nC0:D3:91:90:00:00/28\txxter bv\nC0:D3:91:A0:00:00/28\tAlpha Audiotronics, Inc.\nC0:D3:91:B0:00:00/28\tCelliber Technologies Pvt Limited\nC0:D3:91:C0:00:00/28\tZhinengguo technology company limited\nC0:D3:91:D0:00:00/28\tRegulus Co.,Ltd.\nC0:D3:91:E0:00:00/28\tSamsara Networks Inc\nC0:D3:C0\t\tSamsung Electronics Co.,Ltd\nC0:D4:6B\t\tHuawei Device Co., Ltd.\nC0:D5:E2\t\tSamsung Electronics Co.,Ltd\nC0:D6:0A\t\tTexas Instruments\nC0:D6:82\t\tArista Networks\nC0:D6:D5\t\tMicrosoft Corporation\nC0:D7:AA\t\tArcadyan Corporation\nC0:D8:34\t\txvtec ltd\nC0:D9:41\t\tShenzhen VMAX Software Co., Ltd.\nC0:D9:62\t\tAskey Computer Corp\nC0:D9:F7\t\tShanDong Domor Intelligent S&T CO.,Ltd\nC0:DA:5E\t\tHuawei Device Co., Ltd.\nC0:DA:74\t\tHangzhou Sunyard Technology Co., Ltd.\nC0:DC:6A\t\tQingdao Eastsoft Communication Technology Co.,LTD\nC0:DC:AB\t\tLG Innotek\nC0:DC:D7\t\tHuawei Device Co., Ltd.\nC0:DC:DA\t\tSamsung Electronics Co.,Ltd\nC0:DD:8A\t\tMeta Platforms, Inc.\nC0:DF:77\t\tConrad Electronic SE\nC0:DF:ED\t\tJuniper Networks\nC0:E0:18\t\tHuawei Technologies Co.,Ltd\nC0:E0:1C\t\tIoT Security Group, SL\nC0:E1:BE\t\tHuawei Technologies Co.,Ltd\nC0:E3:50\t\tChina Dragon Technology Limited\nC0:E3:A0\t\tRenesas Electronics (Penang) Sdn. Bhd.\nC0:E3:FB\t\tHuawei Technologies Co.,Ltd\nC0:E4:22\t\tTexas Instruments\nC0:E4:2D\t\tTp-Link Technologies Co.,Ltd.\nC0:E4:34\t\tAzureWave Technology Inc.\nC0:E5:4E\t\tARIES Embedded GmbH\nC0:E5:DA\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\nC0:E7:BF\t\tSichuan AI-Link Technology Co., Ltd.\nC0:E8:62\t\tApple, Inc.\nC0:E9:11\t\tRealNetworks\nC0:EA:C3\t\tIEEE Registration Authority\nC0:EA:C3:00:00:00/28\tAnhui Shengjiaruiduo Electronic Technology Co., Ltd.\nC0:EA:C3:10:00:00/28\tDongguan Wecxw CO.,Ltd.\nC0:EA:C3:20:00:00/28\tNEXSEC Incorporated\nC0:EA:C3:30:00:00/28\tHangzhou Qixun Technology Co., Ltd\nC0:EA:C3:40:00:00/28\tTokoz a.s.\nC0:EA:C3:50:00:00/28\tTechem Energy Services GmbH\nC0:EA:C3:60:00:00/28\tWorldpass industrial Company Limited\nC0:EA:C3:70:00:00/28\tAnnapurna labs\nC0:EA:C3:80:00:00/28\tCDSTech\nC0:EA:C3:90:00:00/28\tOledcomm\nC0:EA:C3:A0:00:00/28\tVolt Equipamentos Eletronicos Ltda\nC0:EA:C3:B0:00:00/28\tSeongHo Information and Communication Corp.\nC0:EA:C3:C0:00:00/28\tTrumeter\nC0:EA:C3:D0:00:00/28\tKontron Asia Technology Inc.\nC0:EA:C3:E0:00:00/28\tBeijing Zhongyuanyishang Technology Co Ltd\nC0:EA:E4\t\tSonicwall\nC0:ED:E5\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nC0:EE:40\t\tLaird Connectivity\nC0:EE:B5\t\tEnice Network.\nC0:EE:FB\t\tOnePlus Tech (Shenzhen) Ltd\nC0:F1:C4\t\tPacidal Corporation Ltd.\nC0:F2:FB\t\tApple, Inc.\nC0:F4:E6\t\tHuawei Technologies Co.,Ltd\nC0:F5:35\t\tAMPAK Technology,Inc.\nC0:F6:36\t\tHangzhou Kuaiyue Technologies, Ltd.\nC0:F6:C2\t\tHuawei Technologies Co.,Ltd\nC0:F6:EC\t\tHuawei Technologies Co.,Ltd\nC0:F7:9D\t\tPowercode\nC0:F8:27\t\tRapidmax Technology Corporation\nC0:F8:53\t\tTuya Smart Inc.\nC0:F8:7F\t\tCisco Systems, Inc\nC0:F8:DA\t\tHon Hai Precision Ind. Co.,Ltd.\nC0:F9:45\t\tToshiba Toko Meter Systems Co., LTD.\nC0:F9:91\t\tGME Standard Communications P/L\nC0:F9:B0\t\tHuawei Technologies Co.,Ltd\nC0:F9:D2\t\tarkona technologies GmbH\nC0:FB:C1\t\tItel Mobile Limited\nC0:FB:F9\t\tIEEE Registration Authority\nC0:FB:F9:00:00:00/28\tXerox Corporation\nC0:FB:F9:10:00:00/28\tLIXIL Corporation\nC0:FB:F9:20:00:00/28\tDongguan Chuan OptoElectronics Limited\nC0:FB:F9:30:00:00/28\tShenzhen Heqiang Electronics Limited\nC0:FB:F9:40:00:00/28\tMinato Advanced Technologies inc\nC0:FB:F9:50:00:00/28\tHaguenet\nC0:FB:F9:60:00:00/28\tIVT corporation\nC0:FB:F9:70:00:00/28\tLongSung Technology (Shanghai) Co.,Ltd.\nC0:FB:F9:80:00:00/28\tDongmengling\nC0:FB:F9:90:00:00/28\tzxsolution\nC0:FB:F9:A0:00:00/28\tTiandi(Changzhou) Automation Co., Ltd.\nC0:FB:F9:B0:00:00/28\tShenzhen Comix Hst Cloud Computing Co., Ltd.\nC0:FB:F9:C0:00:00/28\tShenzhen Elsky Technology Co., Ltd\nC0:FB:F9:D0:00:00/28\tDropbeats Technology Co., Ltd.\nC0:FB:F9:E0:00:00/28\tNavitas Digital Safety Ltd\nC0:FD:84\t\tzte corporation\nC0:FF:A8\t\tHuawei Technologies Co.,Ltd\nC0:FF:D4\t\tNetgear\nC4:00:06\t\tLipi Data Systems Ltd.\nC4:00:49\t\tKamama\nC4:00:AD\t\tAdvantech Technology (CHINA) Co., Ltd.\nC4:00:B5\t\tHongKong Tenry Technology Co., Ltd.\nC4:01:42\t\tMaxMedia Technology Limited\nC4:01:7C\t\tRuckus Wireless\nC4:01:B1\t\tSeekTech INC\nC4:01:CE\t\tPresition (2000) Co., Ltd.\nC4:02:E1\t\tKhwahish Technologies Private Limited\nC4:03:A8\t\tIntel Corporate\nC4:04:15\t\tNetgear\nC4:04:7B\t\tShenzhen YOUHUA Technology Co., Ltd\nC4:04:D8\t\tAviva Links Inc.\nC4:05:28\t\tHuawei Technologies Co.,Ltd\nC4:06:83\t\tHuawei Technologies Co.,Ltd\nC4:07:2F\t\tHuawei Technologies Co.,Ltd\nC4:07:78\t\tNew H3C Technologies Co., Ltd\nC4:08:26\t\tHisense Visual Technology Co.,Ltd\nC4:08:4A\t\tNokia\nC4:08:80\t\tShenzhen UTEPO Tech Co., Ltd.\nC4:08:98\t\tDropbeats Technology Co., Ltd.\nC4:09:38\t\tFujian Star-Net Communication Co.,Ltd\nC4:09:B7\t\tJuniper Networks\nC4:0A:CB\t\tCisco Systems, Inc\nC4:0B:31\t\tApple, Inc.\nC4:0B:CB\t\tXiaomi Communications Co Ltd\nC4:0D:96\t\tHuawei Technologies Co.,Ltd\nC4:0E:45\t\tACK Networks,Inc.\nC4:0F:08\t\tIntel Corporate\nC4:0F:09\t\tHermes electronic GmbH\nC4:0F:A6\t\tSernet (Suzhou) Technologies Corporation\nC4:10:8A\t\tRuckus Wireless\nC4:11:E0\t\tBull Group Co., Ltd\nC4:12:34\t\tApple, Inc.\nC4:12:EC\t\tHuawei Technologies Co.,Ltd\nC4:12:F5\t\tD-Link International\nC4:13:75\t\tCloud Network Technology Singapore Pte. Ltd.\nC4:13:E2\t\tExtreme Networks Headquarters\nC4:14:11\t\tApple, Inc.\nC4:14:3C\t\tCisco Systems, Inc\nC4:14:A2\t\tCisco Meraki\nC4:16:88\t\tHuawei Device Co., Ltd.\nC4:16:C8\t\tHuawei Technologies Co.,Ltd\nC4:16:FA\t\tPrysm Inc\nC4:17:0E\t\tHuawei Device Co., Ltd.\nC4:17:FE\t\tHon Hai Precision Ind. Co.,Ltd.\nC4:18:E9\t\tSamsung Electronics Co.,Ltd\nC4:18:FC\t\tCisco Systems, Inc\nC4:19:8B\t\tDominion Voting Systems Corporation\nC4:19:D1\t\tTelink Semiconductor (Shanghai) Co., Ltd.\nC4:19:EC\t\tQualisys AB\nC4:1C:07\t\tSamsung Electronics Co.,Ltd\nC4:1C:9C\t\tJiQiDao\nC4:1C:FF\t\tVizio, Inc\nC4:1E:CE\t\tHMI Sources Ltd.\nC4:21:B9\t\tzte corporation\nC4:21:C8\t\tKyocera Corporation\nC4:22:4E\t\tTelink Micro LLC\nC4:23:60\t\tIntel Corporate\nC4:23:7A\t\tWhizNets Inc.\nC4:23:A2\t\tPT. Emsonic Indonesia\nC4:24:2E\t\tGalvanic Applied Sciences Inc\nC4:24:56\t\tPalo Alto Networks\nC4:26:28\t\tAiro Wireless\nC4:27:28\t\tzte corporation\nC4:27:8C\t\tHuawei Device Co., Ltd.\nC4:27:95\t\tVantiva USA LLC\nC4:28:2D\t\tEmbedded Intellect Pty Ltd\nC4:29:1D\t\tKlemsan Elektrik Elektronik San.Ve Tic.As.\nC4:29:96\t\tSignify B.V.\nC4:2A:D0\t\tApple, Inc.\nC4:2B:44\t\tHuawei Device Co., Ltd.\nC4:2C:03\t\tApple, Inc.\nC4:2C:4F\t\tQingdao Hisense Mobile Communication Technology Co,Ltd\nC4:2F:90\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nC4:30:18\t\tMCS Logic Inc.\nC4:30:CA\t\tSD Biosensor\nC4:32:D1\t\tFarlink Technology Limited\nC4:33:06\t\tChina Mobile Group Device Co.,Ltd.\nC4:33:96\t\tDongguan Hele Electronics Co., Ltd.\nC4:34:5B\t\tHuawei Technologies Co.,Ltd\nC4:34:6B\t\tHewlett Packard\nC4:35:D9\t\tApple, Inc.\nC4:36:55\t\tShenzhen Fenglian Technology Co., Ltd.\nC4:36:6C\t\tLG Innotek\nC4:36:C0\t\tBuffalo.Inc\nC4:36:DA\t\tRusteletech Ltd.\nC4:37:72\t\tVirtuozzo International GmbH\nC4:38:75\t\tSonos, Inc.\nC4:38:D3\t\tTagatec Co.,Ltd\nC4:39:3A\t\tSMC Networks Inc\nC4:39:60\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nC4:3A:35\t\tFn-Link Technology Limited\nC4:3A:9F\t\tSiconix Inc.\nC4:3A:BE\t\tSony Corporation\nC4:3C:3C\t\tCybelec Sa\nC4:3C:B0\t\tShenzhen Bilian Electronic Co.，Ltd\nC4:3C:EA\t\tBuffalo.Inc\nC4:3D:1A\t\tIntel Corporate\nC4:3D:C7\t\tNetgear\nC4:3E:AB\t\tHuawei Device Co., Ltd.\nC4:40:44\t\tRackTop Systems Inc.\nC4:40:F6\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nC4:41:1E\t\tBelkin International Inc.\nC4:41:37\t\tQuectel Wireless Solutions Co.,Ltd.\nC4:42:02\t\tSamsung Electronics Co.,Ltd\nC4:42:68\t\tCrestron Electronics, Inc.\nC4:43:8F\t\tLG Electronics (Mobile Communications)\nC4:44:7D\t\tHuawei Technologies Co.,Ltd\nC4:44:A0\t\tCisco Systems, Inc\nC4:45:67\t\tSAMBON PRECISON and ELECTRONICS\nC4:45:EC\t\tShanghai Yali Electron Co.,LTD\nC4:46:06\t\tCisco Systems, Inc\nC4:46:19\t\tHon Hai Precision Ind. Co.,Ltd.\nC4:47:3F\t\tHuawei Technologies Co.,Ltd\nC4:47:4E\t\tIntel Corporate\nC4:48:38\t\tSatcom Direct, Inc.\nC4:48:FA\t\tTaicang T&W Electronics\nC4:49:3E\t\tMotorola Mobility LLC, a Lenovo Company\nC4:49:BB\t\tMitsumi Electric Co.,Ltd.\nC4:4A:D0\t\tFireflies Systems\nC4:4B:44\t\tOmniprint Inc.\nC4:4B:D1\t\tWallys Communications  Teachnologies Co.,Ltd.\nC4:4D:84\t\tCisco Systems, Inc\nC4:4E:1F\t\tBlueN\nC4:4E:AC\t\tShenzhen Shiningworth Technology Co., Ltd.\nC4:4F:33\t\tEspressif Inc.\nC4:4F:5F\t\tHuawei Device Co., Ltd.\nC4:4F:96\t\tAlps Alpine\nC4:4F:D5\t\tVantiva - Connected Home\nC4:50:06\t\tSamsung Electronics Co.,Ltd\nC4:50:9C\t\tVantiva - Connected Home\nC4:51:8D\t\tShenzhen YOUHUA Technology Co., Ltd\nC4:52:4F\t\tApple, Inc.\nC4:53:79\t\tMicronview Limited Liability Company\nC4:54:44\t\tQuanta Computer Inc.\nC4:55:A6\t\tCadac Holdings Ltd\nC4:55:C2\t\tBach-Simpson\nC4:56:00\t\tGalleon Embedded Computing\nC4:56:FE\t\tLava International Ltd.\nC4:57:1F\t\tJune Life Inc\nC4:57:46\t\tTexas Instruments\nC4:57:6E\t\tSamsung Electronics Co.,Ltd\nC4:57:81\t\tWingtech Group (HongKong) Limited\nC4:57:CD\t\tHuawei Technologies Co.,Ltd\nC4:58:C2\t\tShenzhen TATFOOK Technology Co., Ltd.\nC4:59:76\t\tFugoo Coorporation\nC4:5A:86\t\tHuawei Device Co., Ltd.\nC4:5A:B1\t\tDell Inc.\nC4:5B:BE\t\tEspressif Inc.\nC4:5B:F7\t\tants\nC4:5D:83\t\tSamsung Electronics Co.,Ltd\nC4:5D:D8\t\tHDMI Forum\nC4:5E:5C\t\tHuawei Technologies Co.,Ltd\nC4:60:0A\t\tHuaqin Technology Co.LTD\nC4:60:26\t\tSky Uk Limited\nC4:60:44\t\tEverex Electronics Limited\nC4:61:8B\t\tApple, Inc.\nC4:61:C7\t\tMicrosoft Corporation\nC4:62:37\t\tsunweit industrial limited\nC4:62:6B\t\tZPT Vigantice\nC4:62:EA\t\tSamsung Electronics Co.,Ltd\nC4:63:54\t\tU-Raku, Inc.\nC4:63:C4\t\tHuawei Technologies Co.,Ltd\nC4:63:FB\t\tNeatframe AS\nC4:64:13\t\tCisco Systems, Inc\nC4:64:B7\t\tFiberhome Telecommunication Technologies Co.,LTD\nC4:64:E3\t\tTexas Instruments\nC4:64:F2\t\tInfinix mobility limited\nC4:65:16\t\tHewlett Packard\nC4:66:99\t\tvivo Mobile Communication Co., Ltd.\nC4:67:8B\t\tAlphabet Capital Sdn Bhd\nC4:67:B5\t\tLibratone A/S\nC4:67:D1\t\tHuawei Technologies Co.,Ltd\nC4:68:D0\t\tVTech Telecommunications Ltd.\nC4:69:3E\t\tTurbulence Design Inc.\nC4:69:F0\t\tHuawei Technologies Co.,Ltd\nC4:6A:B7\t\tXiaomi Communications Co Ltd\nC4:6B:B4\t\tmyIDkey\nC4:6D:F1\t\tDataGravity\nC4:6E:1F\t\tTp-Link Technologies Co.,Ltd.\nC4:6E:33\t\tZhong Ge Smart Technology Co., Ltd.\nC4:6E:7B\t\tShenzhen Rf-Link Technology Co.,Ltd.\nC4:70:0B\t\tGuangzhou Chip Technologies Co.,Ltd\nC4:70:AB\t\tRuijie Networks Co.,LTD\nC4:70:BD\t\tMellanox Technologies, Inc.\nC4:71:0F\t\tXiaomi Communications Co Ltd\nC4:71:30\t\tFon Technology S.L.\nC4:71:54\t\tTp-Link Technologies Co.,Ltd.\nC4:71:FE\t\tCisco Systems, Inc\nC4:72:95\t\tCisco Systems, Inc\nC4:73:1E\t\tSamsung Electronics Co.,Ltd\nC4:74:1E\t\tzte corporation\nC4:74:69\t\tBt9\nC4:74:F8\t\tHot Pepper, Inc.\nC4:75:AB\t\tIntel Corporate\nC4:75:EA\t\tHuawei Technologies Co.,Ltd\nC4:77:64\t\tSamsung Electronics Co.,Ltd\nC4:77:AB\t\tBeijing ASU Tech Co.,Ltd\nC4:77:AF\t\tAdvanced Digital Broadcast SA\nC4:78:A2\t\tHuawei Device Co., Ltd.\nC4:79:05\t\tZhejiang Uniview Technologies Co.,Ltd.\nC4:79:81\t\tEhya LTD\nC4:79:9F\t\tHaiguang Smart Device Co.,Ltd.\nC4:7B:2F\t\tBeijing JoinHope Image Technology Ltd.\nC4:7B:80\t\tProtempis, LLC\nC4:7B:A3\t\tNAVIS Inc.\nC4:7C:8D\t\tIEEE Registration Authority\nC4:7C:8D:00:00:00/28\tAti\nC4:7C:8D:10:00:00/28\tLynx Innovation Litimed\nC4:7C:8D:20:00:00/28\tStar2Star Communications, LLC\nC4:7C:8D:30:00:00/28\tWatec Co., Ltd.\nC4:7C:8D:40:00:00/28\tRobostar\nC4:7C:8D:50:00:00/28\tPASCAL Co., Ltd.\nC4:7C:8D:60:00:00/28\tHHCC Plant Technology Co.,Ltd.\nC4:7C:8D:70:00:00/28\tAwiselink Co., Ltd.\nC4:7C:8D:80:00:00/28\tGETEMED Medizin- und Informationstechnik AG\nC4:7C:8D:90:00:00/28\tAirbus DS - SLC\nC4:7C:8D:A0:00:00/28\tSilvus technologies inc\nC4:7C:8D:B0:00:00/28\tGc Automation Co,Ltd\nC4:7C:8D:C0:00:00/28\tINOTEC Sicherheitstechnik GmbH\nC4:7C:8D:D0:00:00/28\tAnhui GuangXing Linked-Video Communication Technology Co, Ltd.\nC4:7C:8D:E0:00:00/28\tLabor Strauss Sicherungsanlagenbau GmbH\nC4:7D:46\t\tFujitsu Limited\nC4:7D:4F\t\tCisco Systems, Inc\nC4:7D:9F\t\tSamsung Electronics Co.,Ltd\nC4:7D:A8\t\tNXP Semiconductor (Tianjin) LTD.\nC4:7D:CC\t\tZebra Technologies Inc\nC4:7D:FE\t\tA.N. Solutions GmbH\nC4:7E:E0\t\tCisco Systems, Inc\nC4:7F:51\t\tInventek Systems\nC4:80:25\t\tHuawei Device Co., Ltd.\nC4:80:8A\t\tCloud Diagnostics Canada ULC\nC4:82:3F\t\tFujian Newland Auto-ID Tech. Co,.Ltd.\nC4:82:4E\t\tChangzhou Uchip Electronics Co., LTD.\nC4:82:E1\t\tTuya Smart Inc.\nC4:83:6F\t\tCiena Corporation\nC4:83:72\t\tIEEE Registration Authority\nC4:83:72:00:00:00/28\tCompumedics Germany GmbH\nC4:83:72:10:00:00/28\tShenzhen King Will Technology Co., LTD\nC4:83:72:20:00:00/28\tAi-Rider Corporation\nC4:83:72:30:00:00/28\tNextSilicon\nC4:83:72:40:00:00/28\tTransact Technologies Inc\nC4:83:72:50:00:00/28\tWuhan Da Ta Technologies Co.,Ltd.\nC4:83:72:60:00:00/28\tNetplus Co., Ltd.\nC4:83:72:70:00:00/28\tclk2.inc\nC4:83:72:80:00:00/28\tAccelecom Ltd.\nC4:83:72:90:00:00/28\tBiwave Technologies, Inc.\nC4:83:72:A0:00:00/28\tVie Style,Inc,\nC4:83:72:B0:00:00/28\tcare.ai\nC4:83:72:C0:00:00/28\tAcenew technology(shenzhen) limited company\nC4:83:72:D0:00:00/28\tAnnapurna labs\nC4:83:72:E0:00:00/28\tSuzhou LZY technology Co.,Ltd\nC4:84:66\t\tApple, Inc.\nC4:84:FC\t\tApple, Inc.\nC4:85:08\t\tIntel Corporate\nC4:86:4F\t\tBeijing BitIntelligence Information Technology Co. Ltd.\nC4:86:E9\t\tHuawei Technologies Co.,Ltd\nC4:88:E5\t\tSamsung Electronics Co.,Ltd\nC4:89:ED\t\tSolid Optics EU N.V.\nC4:8A:5A\t\tJfcontrol\nC4:8B:66\t\tHui Zhou Gaoshengda Technology Co.,LTD\nC4:8B:A3\t\tCisco Meraki\nC4:8E:8F\t\tHon Hai Precision Ind. Co.,Ltd.\nC4:8F:07\t\tShenzhen Yihao Hulian Science and Technology Co., Ltd.\nC4:8F:C1\t\tDeeptrack S.L.U.\nC4:91:0C\t\tApple, Inc.\nC4:91:3A\t\tShenzhen Sanland Electronic Co., ltd.\nC4:91:CF\t\tLuxul\nC4:92:4C\t\tKeisokuki Center Co.,Ltd.\nC4:93:00\t\t8Devices\nC4:93:13\t\t100fio networks technology llc\nC4:93:80\t\tSpeedytel technology\nC4:93:BB\t\tBeijing Xiaomi Mobile Software Co., Ltd\nC4:93:D9\t\tSamsung Electronics Co.,Ltd\nC4:95:00\t\tAmazon Technologies Inc.\nC4:95:4D\t\tIEEE Registration Authority\nC4:95:4D:00:00:00/28\tBA International Electronics Co. Ltd.\nC4:95:4D:10:00:00/28\tTeletronik AG\nC4:95:4D:20:00:00/28\tShen Zhen Euse Technology Co.,Ltd\nC4:95:4D:30:00:00/28\tSercomm Corporation.\nC4:95:4D:40:00:00/28\tGL Solutions Inc.\nC4:95:4D:50:00:00/28\tMarble Automation\nC4:95:4D:60:00:00/28\tAKKA Germany GmbH\nC4:95:4D:70:00:00/28\tLLC \"TechnoEnergo\"\nC4:95:4D:80:00:00/28\tXinjiang Golden Calf Energy IOT Technology Co., Ltd\nC4:95:4D:90:00:00/28\tShenzhen Xtooltech Co., Ltd\nC4:95:4D:A0:00:00/28\tKAT Mekatronik Urunleri AS\nC4:95:4D:B0:00:00/28\tMulticom, Inc\nC4:95:4D:C0:00:00/28\tSolidGear Corporation\nC4:95:4D:D0:00:00/28\tNewland Era Edu Hi-Tech(BeiJing)Co.,Ltd\nC4:95:4D:E0:00:00/28\tCanare Electric Co., Ltd.\nC4:95:5F\t\tAnhui Saida Technology Limited Liability Company\nC4:95:A2\t\tShenzhen Weijiu Industry And Trade Development Co., Ltd\nC4:98:05\t\tMinieum Networks, Inc\nC4:98:5C\t\tHui Zhou Gaoshengda Technology Co.,LTD\nC4:98:78\t\tShanghai Moaan Intelligent Technology Co.,Ltd\nC4:98:80\t\tApple, Inc.\nC4:98:86\t\tQorvo International Pte. Ltd.\nC4:98:94\t\tIEEE Registration Authority\nC4:98:94:00:00:00/28\tShenzhen Megmeet Drive Technology Co.,Ltd.\nC4:98:94:10:00:00/28\tSeaview Telecom\nC4:98:94:20:00:00/28\tMetasphere Ltd\nC4:98:94:30:00:00/28\tBTL Industries JSC\nC4:98:94:40:00:00/28\tAlpine Electronics Marketing, Inc.\nC4:98:94:50:00:00/28\tshenzhen lanodo technology Co., Ltd\nC4:98:94:60:00:00/28\tAetina Corporation\nC4:98:94:70:00:00/28\tShenzhen C & D Electronics Co., Ltd.\nC4:98:94:80:00:00/28\tPliem (Shanghai) Intelligent Technology Co., Ltd\nC4:98:94:90:00:00/28\tShenzhen  Hexin Automation Technology Co.,Ltd.\nC4:98:94:A0:00:00/28\tNeron Informatics Pvt Ltd\nC4:98:94:B0:00:00/28\tShanghai YVR Technology Co., Ltd.\nC4:98:94:C0:00:00/28\tZhejiang Rexense loT Technology Co., Ltd\nC4:98:94:D0:00:00/28\tJiangsu AIDriving Co.,Ltd.\nC4:98:94:E0:00:00/28\tHans Sasserath GmbH & Co. KG\nC4:9A:02\t\tLG Electronics (Mobile Communications)\nC4:9A:31\t\tZyxel Communications Corporation\nC4:9A:89\t\tSuzhou K-Hiragawa Electronic Technology Co.,Ltd\nC4:9D:08\t\tHuawei Device Co., Ltd.\nC4:9D:ED\t\tMicrosoft Corporation\nC4:9E:41\t\tG24 Power Limited\nC4:9F:4C\t\tHuawei Technologies Co.,Ltd\nC4:9F:F3\t\tMciao Technologies, Inc.\nC4:A0:52\t\tMotorola Mobility LLC, a Lenovo Company\nC4:A1:0E\t\tIEEE Registration Authority\nC4:A1:0E:00:00:00/28\tHYOSUNG Heavy Industries Corporation\nC4:A1:0E:10:00:00/28\tBartec Pixavi As\nC4:A1:0E:20:00:00/28\tWistron InfoComn (Kunshan) Co., Ltd.\nC4:A1:0E:30:00:00/28\tConsolinno Energy GmbH\nC4:A1:0E:40:00:00/28\tHarbour Cross Technology Ltd\nC4:A1:0E:50:00:00/28\tO-NET Industrial Technologies (Shenzhen) Limited\nC4:A1:0E:60:00:00/28\tHainan World Electronic Science and Techology Co.,Ltd\nC4:A1:0E:70:00:00/28\tGuangzhou South Satellite Navigation Instrument Co., Ltd.\nC4:A1:0E:80:00:00/28\tAyla Networks (Shenzhen) Co., Ltd.\nC4:A1:0E:90:00:00/28\tXi'An Yep Telecom Technology Co.,Ltd\nC4:A1:0E:A0:00:00/28\tJiangsu Perceive World Technology Co.,Ltd.\nC4:A1:0E:B0:00:00/28\tClinton Electronics Corporation\nC4:A1:0E:C0:00:00/28\tFocus-on\nC4:A1:0E:D0:00:00/28\tConnectlab SRL\nC4:A1:0E:E0:00:00/28\tAlio, Inc\nC4:A1:51\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nC4:A1:AE\t\tHuawei Device Co., Ltd.\nC4:A3:66\t\tzte corporation\nC4:A4:02\t\tHuawei Technologies Co.,Ltd\nC4:A4:51\t\tTecno Mobile Limited\nC4:A5:59\t\tIEEE Registration Authority\nC4:A5:59:00:00:00/28\tArchermind Japan Co.,Ltd.\nC4:A5:59:10:00:00/28\tMotive Technologies, Inc.\nC4:A5:59:20:00:00/28\tShenzhen Orfa Tech Co., Ltd\nC4:A5:59:30:00:00/28\tX-speed lnformation Technology Co.,Ltd\nC4:A5:59:40:00:00/28\tNational Company of Telecommunication and Information Security\nC4:A5:59:50:00:00/28\tMoultrie Mobile\nC4:A5:59:60:00:00/28\tAnnapurna labs\nC4:A5:59:70:00:00/28\tAviron Interactive Inc.\nC4:A5:59:80:00:00/28\tMetics\nC4:A5:59:90:00:00/28\tShenzhen Meishifu Technology Co.,Ltd.\nC4:A5:59:A0:00:00/28\tHebei Far-East Communication System Engineerning Co.,Ltd.\nC4:A5:59:B0:00:00/28\tSMH Technologies SRL\nC4:A5:59:C0:00:00/28\tAltam Systems Sl\nC4:A5:59:D0:00:00/28\tMinolta Security\nC4:A5:59:E0:00:00/28\tSernet (Suzhou) Technologies Corporation\nC4:A6:4E\t\tQuectel Wireless Solutions Co.,Ltd.\nC4:A7:2B\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\nC4:A8:16\t\teero inc.\nC4:A8:1D\t\tD-Link International\nC4:A9:B8\t\tXiamenshi C-Chip Technology Co.,Ltd\nC4:AA:99\t\tHuawei Technologies Co.,Ltd\nC4:AA:A1\t\tSUMMIT DEVELOPMENT, spol.s r.o.\nC4:AA:C4\t\tZhejiang Dahua Technology Co., Ltd.\nC4:AB:4D\t\tCisco Systems, Inc\nC4:AB:B2\t\tvivo Mobile Communication Co., Ltd.\nC4:AC:59\t\tMurata Manufacturing Co., Ltd.\nC4:AC:AA\t\tApple, Inc.\nC4:AD:21\t\tMEDIAEDGE Corporation\nC4:AD:34\t\tRouterboard.com\nC4:AD:F1\t\tGOPEACE Inc.\nC4:AE:12\t\tSamsung Electronics Co.,Ltd\nC4:B1:D9\t\tHuawei Technologies Co.,Ltd\nC4:B2:39\t\tCisco Systems, Inc\nC4:B2:5B\t\tRuijie Networks Co.,LTD\nC4:B3:01\t\tApple, Inc.\nC4:B3:49\t\tApple, Inc.\nC4:B3:6A\t\tCisco Systems, Inc\nC4:B5:12\t\tGeneral Electric Digital Energy\nC4:B6:91\t\tAngel Robotics\nC4:B7:57\t\tAlpsalpine Co,.Ltd\nC4:B8:B4\t\tHuawei Technologies Co.,Ltd\nC4:B9:CD\t\tCisco Systems, Inc\nC4:BA:99\t\tI+ME Actia Informatik und Mikro-Elektronik GmbH\nC4:BA:A3\t\tBeijing Winicssec Technologies Co., Ltd.\nC4:BB:03\t\tHuawei Technologies Co.,Ltd\nC4:BB:4C\t\tZebra Information Tech Co. Ltd\nC4:BB:EA\t\tPakedge Device and Software Inc\nC4:BC:D7\t\tNew Ryatek\nC4:BD:6A\t\tSKF GmbH\nC4:BD:8D\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\nC4:BD:E5\t\tIntel Corporate\nC4:BE:84\t\tTexas Instruments\nC4:BE:D4\t\tAvaya Inc\nC4:BF:60\t\tTecno Mobile Limited\nC4:C0:63\t\tNew H3C Technologies Co., Ltd\nC4:C0:AE\t\tMidori Electronic Co., Ltd.\nC4:C1:38\t\tOWLink Technology Inc\nC4:C1:7D\t\tApple, Inc.\nC4:C1:9F\t\tNational Oilwell Varco Instrumentation, Monitoring, and Optimization (NOV IMO)\nC4:C3:6B\t\tApple, Inc.\nC4:C5:63\t\tTecno Mobile Limited\nC4:C6:03\t\tCisco Systems, Inc\nC4:C6:E6\t\tLCFC(Hefei) Electronics Technology co., ltd\nC4:C7:55\t\tBeijing HuaqinWorld Technology Co.,Ltd\nC4:C9:19\t\tEnergy Imports Ltd\nC4:C9:EC\t\tGugaoo   HK Limited\nC4:CA:2B\t\tArista Networks\nC4:CA:67\t\tChongqing ZQZER Technology Co., LTD\nC4:CA:D9\t\tHangzhou H3C Technologies Co., Limited\nC4:CB:54\t\tFibocom Auto Inc.\nC4:CB:6B\t\tAirista Flow, Inc.\nC4:CB:76\t\tMicrosoft Corporation\nC4:CB:BE\t\tGreat Talent Technology Limited\nC4:CB:E1\t\tDell Inc.\nC4:CC:37\t\tIEEE Registration Authority\nC4:CC:37:00:00:00/28\tKAIS Co.,Ltd.\nC4:CC:37:10:00:00/28\tTaiwan Inpro International Co.Ltd\nC4:CC:37:20:00:00/28\tCix Technology Inc.\nC4:CC:37:30:00:00/28\tQingdao Goertek Intelligent Sensor Co.,Ltd\nC4:CC:37:40:00:00/28\tPineberry Pi\nC4:CC:37:50:00:00/28\tChangzhou runningtech industrial technology Co., Ltd.\nC4:CC:37:60:00:00/28\tSafety System Product GmbH & Co. KG\nC4:CC:37:70:00:00/28\tVicinity Technologies Limited\nC4:CC:37:80:00:00/28\tSmartLicht systems co., ltd\nC4:CC:37:90:00:00/28\tSkychers Creations ShenZhen Limited\nC4:CC:37:A0:00:00/28\tINPAQ Technology Co., Ltd\nC4:CC:37:B0:00:00/28\tDRS Naval Power Systems, Inc.\nC4:CC:37:C0:00:00/28\tCHAINTECH Technology Corp.\nC4:CC:37:D0:00:00/28\tNetavo Global Data Services Ltd\nC4:CC:37:E0:00:00/28\tJoby Aviation, Inc.\nC4:CC:F9\t\tzte corporation\nC4:CD:45\t\tBeijing Boomsense Technology CO.,LTD.\nC4:CD:82\t\tHangzhou Lowan Information Technology Co., Ltd.\nC4:D0:E3\t\tIntel Corporate\nC4:D1:97\t\tVentia Utility Services\nC4:D3:6A\t\tTexas Instruments\nC4:D4:38\t\tHuawei Technologies Co.,Ltd\nC4:D4:89\t\tJiangSu Joyque Information Industry Co.,Ltd\nC4:D4:96\t\tShenzhen Excelsecu Data Technology Co.,Ltd\nC4:D6:55\t\tTercel technology co.,ltd\nC4:D6:66\t\tCisco Meraki\nC4:D6:D3\t\tDell Inc.\nC4:D7:38\t\tHuawei Device Co., Ltd.\nC4:D7:DC\t\tZhejiang Weilai Jingling Artificial Intelligence Technology Co., Ltd.\nC4:D7:FD\t\tBouffalo Lab (Nanjing) Co., Ltd.\nC4:D8:C8\t\tSilicon Laboratories\nC4:D8:D4\t\tHuawei Technologies Co.,Ltd\nC4:D8:D5\t\tEspressif Inc.\nC4:D8:F3\t\tiZotope\nC4:D9:87\t\tIntel Corporate\nC4:DA:26\t\tNoblex Sa\nC4:DA:7D\t\tIvium Technologies B.V.\nC4:DB:04\t\tHuawei Technologies Co.,Ltd\nC4:DB:AD\t\tRing LLC\nC4:DD:57\t\tEspressif Inc.\nC4:DE:7B\t\tHuawei Device Co., Ltd.\nC4:DE:E2\t\tEspressif Inc.\nC4:DF:39\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nC4:E0:32\t\tIEEE 1904.1 Working Group\nC4:E0:DE\t\tZhengzhou XindaJiean Information Technology Co.,Ltd.\nC4:E1:7C\t\tU2S co.\nC4:E1:A1\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nC4:E2:87\t\tHuawei Technologies Co.,Ltd\nC4:E3:9F\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nC4:E3:CE\t\tEnGenius Technologies, Inc.\nC4:E5:06\t\tPiper Networks, Inc.\nC4:E5:10\t\tMechatro, Inc.\nC4:E5:32\t\tArcadyan Corporation\nC4:E5:B1\t\tSuzhou PanKore Integrated Circuit Technology Co. Ltd.\nC4:E7:33\t\tClear Align LLC\nC4:E7:AE\t\tChengdu Meross Technology Co., Ltd.\nC4:E7:BE\t\tSCSpro Co.,Ltd\nC4:E9:0A\t\tD-Link International\nC4:E9:2F\t\tAB Sciex\nC4:E9:84\t\tTp-Link Technologies Co.,Ltd.\nC4:EA:1D\t\tTechnicolor Delivery Technologies Belgium NV\nC4:EB:39\t\tSagemcom Broadband SAS\nC4:EB:41\t\tSagemcom Broadband SAS\nC4:EB:42\t\tSagemcom Broadband SAS\nC4:EB:43\t\tSagemcom Broadband SAS\nC4:EB:68\t\tVusionGroup\nC4:EB:E3\t\tRrcn Sas\nC4:EB:FF\t\tzte corporation\nC4:ED:BA\t\tTexas Instruments\nC4:EE:AE\t\tVSS Monitoring\nC4:EE:F5\t\tII-VI Incorporated\nC4:EF:3D\t\tSamsung Electronics Co.,Ltd\nC4:EF:70\t\tHome Skinovations\nC4:EF:BB\t\tLCFC(Hefei) Electronics Technology co., ltd\nC4:EF:DA\t\tHoneywell\nC4:F0:35\t\tHughes Network Systems, LLC\nC4:F0:81\t\tHuawei Technologies Co.,Ltd\nC4:F0:EC\t\tFiberhome Telecommunication Technologies Co.,LTD\nC4:F1:22\t\tNexar Ltd.\nC4:F1:74\t\teero inc.\nC4:F1:D1\t\tBeijing Sogou Technology Development Co., Ltd.\nC4:F3:12\t\tTexas Instruments\nC4:F4:64\t\tSpica international\nC4:F5:7C\t\tBrocade Communications Systems LLC\nC4:F5:A5\t\tKumalift Co., Ltd.\nC4:F7:C1\t\tApple, Inc.\nC4:F7:D5\t\tCisco Systems, Inc\nC4:F8:39\t\tActia Automotive\nC4:FB:AA\t\tHuawei Technologies Co.,Ltd\nC4:FB:C8\t\tShenzhen Candour Co., Ltd.\nC4:FC:22\t\tYealink(Xiamen) Network Technology Co.,Ltd.\nC4:FC:E4\t\tDishTV NZ Ltd\nC4:FC:EF\t\tSambaNova Systems, Inc.\nC4:FD:E6\t\tDrtech\nC4:FE:5B\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nC4:FE:E2\t\tAMICCOM Electronics Corporation\nC4:FF:1F\t\tHuawei Technologies Co.,Ltd\nC4:FF:22\t\tHuawei Device Co., Ltd.\nC4:FF:84\t\tIEEE Registration Authority\nC4:FF:84:00:00:00/28\tZhuhai Ninestar Information Technology Co., Ltd.\nC4:FF:84:10:00:00/28\tTuring Machines Inc.\nC4:FF:84:20:00:00/28\tShenZhen BoQiao Technologies CO.,LTD.\nC4:FF:84:30:00:00/28\tCloudhop Inc\nC4:FF:84:40:00:00/28\tMalhotra Electronics Private Limited\nC4:FF:84:50:00:00/28\tEastern Acoustic Works\nC4:FF:84:60:00:00/28\tLens Technology (Xiangtan) Co.,Ltd\nC4:FF:84:70:00:00/28\tNEKMA M.Mesek P.Mesek B.Mesek\nC4:FF:84:80:00:00/28\tIbm\nC4:FF:84:90:00:00/28\tAtlas Copco\nC4:FF:84:A0:00:00/28\tOpeneye\nC4:FF:84:B0:00:00/28\tElaraby Company For Engineering Industries\nC4:FF:84:C0:00:00/28\tKSB SE & Co. KGaA\nC4:FF:84:D0:00:00/28\tAosaishi (Hong Kong) Co.,Limited\nC4:FF:84:E0:00:00/28\tElbit system EW and SIGINT Elisra ltd\nC4:FF:99\t\tIntel Corporate\nC4:FF:BC\t\tIEEE Registration Authority\nC4:FF:BC:00:00:00/28\tDanego BV\nC4:FF:BC:10:00:00/28\tVisatech C0., Ltd.\nC4:FF:BC:20:00:00/28\tMobiletron Electronics Co., Ltd\nC4:FF:BC:30:00:00/28\tShenzhen Kalif Electronics Co.,Ltd\nC4:FF:BC:40:00:00/28\tiMageTech CO.,LTD.\nC4:FF:BC:50:00:00/28\tcomtime GmbH\nC4:FF:BC:60:00:00/28\tShenzhen C & D Electronics Co., Ltd.\nC4:FF:BC:70:00:00/28\tCritical Link\nC4:FF:BC:80:00:00/28\tShenZhen ZYT Technology co., Ltd\nC4:FF:BC:90:00:00/28\tGSM Innovations Pty Ltd\nC4:FF:BC:A0:00:00/28\tAdvanced Navigation\nC4:FF:BC:B0:00:00/28\tKaga Electronics Co.,Ltd.\nC4:FF:BC:C0:00:00/28\tKyongBo Electric Co., Ltd.\nC4:FF:BC:D0:00:00/28\tBeijing  KDF information technology co. LTD.\nC4:FF:BC:E0:00:00/28\tviRaTec GmbH\nC8:00:84\t\tCisco Systems, Inc\nC8:02:10\t\tLG Innotek\nC8:02:58\t\tITW GSE ApS\nC8:02:8F\t\tNova Electronics (Shanghai) Co., Ltd.\nC8:02:A6\t\tBeijing Newmine Technology\nC8:03:F5\t\tRuckus Wireless\nC8:05:9E\t\tHefei Symboltek Co.,Ltd\nC8:05:A4\t\tMotorola(Wuhan) Mobility Technologies Communication Co.,Ltd\nC8:07:18\t\tTDSi\nC8:07:39\t\tNAKAYO Inc\nC8:08:73\t\tRuckus Wireless\nC8:08:8B\t\tArista Networks\nC8:08:E9\t\tLG Electronics\nC8:09:A8\t\tIntel Corporate\nC8:0A:35\t\tQingdao Hisense Smart Life Technology Co., Ltd\nC8:0A:A9\t\tQuanta Computer Inc.\nC8:0C:53\t\tChina Mobile Group Device Co.,Ltd.\nC8:0C:C8\t\tHuawei Technologies Co.,Ltd\nC8:0D:32\t\tHoloplot GmbH\nC8:0E:14\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\nC8:0E:77\t\tLe Shi Zhi Xin Electronic Technology (Tianjin) Limited\nC8:0E:95\t\tOmniLync Inc.\nC8:10:2F\t\tNetgear\nC8:10:72\t\tBBPOS Limited\nC8:10:73\t\tCentury Opticomm Co.,Ltd\nC8:12:0B\t\tSamsung Electronics Co.,Ltd\nC8:13:37\t\tJuniper Networks\nC8:13:8B\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nC8:14:51\t\tHuawei Technologies Co.,Ltd\nC8:14:79\t\tSamsung Electronics Co.,Ltd\nC8:14:B4\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nC8:15:4E\t\tIntel Corporate\nC8:16:A5\t\tMasimo Corporation\nC8:16:BD\t\tQingdao Hisense Communications Co.,Ltd.\nC8:16:DA\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nC8:17:39\t\tItel Mobile Limited\nC8:17:F5\t\tNanjing Qinheng Microelectronics Co., Ltd.\nC8:19:F7\t\tSamsung Electronics Co.,Ltd\nC8:1A:FE\t\tDLOGIC GmbH\nC8:1B:5C\t\tBCTech\nC8:1B:6B\t\tInnova Security\nC8:1C:FE\t\tZebra Technologies Inc.\nC8:1E:8E\t\tADV Security (S) Pte Ltd\nC8:1E:C2\t\tItel Mobile Limited\nC8:1E:E7\t\tApple, Inc.\nC8:1F:66\t\tDell Inc.\nC8:1F:BE\t\tHuawei Technologies Co.,Ltd\nC8:1F:E8\t\tApple, Inc.\nC8:1F:EA\t\tAvaya Inc\nC8:20:8E\t\tStoragedata\nC8:21:58\t\tIntel Corporate\nC8:21:DA\t\tShenzhen YOUHUA Technology Co., Ltd\nC8:24:78\t\tEdifier International\nC8:24:96\t\tJiangsu Yinhe  Electronics Co.,Ltd.\nC8:25:E1\t\tLemobile Information Technology (Beijing) Co., Ltd\nC8:26:E2\t\tChina Dragon Technology Limited\nC8:28:32\t\tBeijing Xiaomi Electronics Co., Ltd.\nC8:28:E5\t\tCisco Systems, Inc\nC8:29:2A\t\tBarun Electronics\nC8:29:C8\t\tPalo Alto Networks\nC8:2A:14\t\tApple, Inc.\nC8:2A:DD\t\tGoogle, Inc.\nC8:2A:F1\t\tTCT mobile ltd\nC8:2B:6B\t\tshenzhen worldelite electronics co., LTD\nC8:2B:96\t\tEspressif Inc.\nC8:2C:2B\t\tIEEE Registration Authority\nC8:2C:2B:00:00:00/28\tFungible, Inc.\nC8:2C:2B:10:00:00/28\tGalgus\nC8:2C:2B:20:00:00/28\tRepp Health\nC8:2C:2B:30:00:00/28\tRF Engineering and Energy Resource\nC8:2C:2B:40:00:00/28\tiWave Systems Tech Pvt Ltd\nC8:2C:2B:50:00:00/28\tDalco Ag\nC8:2C:2B:60:00:00/28\tGrav I.T.\nC8:2C:2B:70:00:00/28\tMerpa Bilgi Islem Ltd.Sti\nC8:2C:2B:80:00:00/28\tVerifone Systems (China),lnc.\nC8:2C:2B:90:00:00/28\tBIOT Sp. z o.o.\nC8:2C:2B:A0:00:00/28\tShiftall Inc.\nC8:2C:2B:B0:00:00/28\tKunshan SVL Electric  Co.,Ltd\nC8:2C:2B:C0:00:00/28\tSmart Wires Inc\nC8:2C:2B:D0:00:00/28\tUBITRON Co.,LTD\nC8:2C:2B:E0:00:00/28\tFränkische Rohrwerke Gebr. Kirchner GmbH & Co. KG\nC8:2E:18\t\tEspressif Inc.\nC8:2E:47\t\tSuzhou SmartChip Semiconductor Co., LTD\nC8:2E:94\t\tHalfa Enterprise Co., Ltd.\nC8:31:68\t\teZEX corporation\nC8:32:32\t\tHunting Innova\nC8:33:4B\t\tApple, Inc.\nC8:33:E5\t\tHuawei Technologies Co.,Ltd\nC8:34:8E\t\tIntel Corporate\nC8:35:B8\t\tEricsson, EAB/RWI/K\nC8:36:A3\t\tGertec Brasil Ltda\nC8:38:70\t\tSamsung Electronics Co.,Ltd\nC8:39:AC\t\tHuawei Device Co., Ltd.\nC8:3A:1B\t\tToshiba TEC Corporation Inc\nC8:3A:35\t\tTenda Technology Co., Ltd.\nC8:3A:6B\t\tRoku, Inc\nC8:3B:45\t\tJri\nC8:3C:85\t\tApple, Inc.\nC8:3D:97\t\tNokia Corporation\nC8:3D:D4\t\tCyberTAN Technology Inc.\nC8:3D:DC\t\tXiaomi Communications Co Ltd\nC8:3D:FC\t\tAlphaTheta Corporation\nC8:3E:99\t\tTexas Instruments\nC8:3E:9E\t\tHuawei Device Co., Ltd.\nC8:3E:A7\t\tKUNBUS GmbH\nC8:3F:26\t\tMicrosoft Corporation\nC8:3F:B4\t\tCommscope\nC8:40:29\t\tFiberhome Telecommunication Technologies Co.,LTD\nC8:40:52\t\tPAX Computer Technology(Shenzhen) Ltd.\nC8:41:8A\t\tSamsung Electronics.,LTD\nC8:45:29\t\tIMK Networks Co.,Ltd\nC8:45:44\t\tAsia Pacific CIS (Wuxi) Co, Ltd\nC8:45:8F\t\tWyler AG\nC8:47:09\t\tCisco Systems, Inc\nC8:47:82\t\tAreson Technology Corp.\nC8:47:8C\t\tBeken Corporation\nC8:48:05\t\tNintendo Co.,Ltd\nC8:48:F5\t\tMEDISON Xray Co., Ltd\nC8:4A:A0\t\tSony Interactive Entertainment Inc.\nC8:4B:D6\t\tDell Inc.\nC8:4C:75\t\tCisco Systems, Inc\nC8:4C:78\t\tzte corporation\nC8:4D:34\t\tLIONS Taiwan Technology Inc.\nC8:4D:44\t\tShenzhen Jiapeng Huaxiang Technology Co.,Ltd\nC8:4F:0E\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\nC8:4F:86\t\tSophos Ltd\nC8:50:CE\t\tHuawei Technologies Co.,Ltd\nC8:50:E9\t\tRaisecom Technology CO., LTD\nC8:51:42\t\tSamsung Electronics Co.,Ltd\nC8:51:95\t\tHuawei Technologies Co.,Ltd\nC8:51:FB\t\tExtreme Networks Headquarters\nC8:52:61\t\tCommscope\nC8:53:09\t\tLCFC(Hefei) Electronics Technology co., ltd\nC8:53:E1\t\tDouyin Vision Co., Ltd\nC8:54:4B\t\tZyxel Communications Corporation\nC8:54:A4\t\tInfinix mobility limited\nC8:56:45\t\tIntermas France\nC8:56:63\t\tSunflex Europe GmbH\nC8:58:6A\t\tBeijing Winner Microelectronics Co.,Ltd.\nC8:58:95\t\tMotorola Mobility LLC, a Lenovo Company\nC8:58:B3\t\tIntel Corporate\nC8:58:C0\t\tIntel Corporate\nC8:5A:9F\t\tzte corporation\nC8:5A:CF\t\tHP Inc.\nC8:5B:76\t\tLCFC(Hefei) Electronics Technology co., ltd\nC8:5B:A0\t\tShenzhen Qihu Intelligent Technology Company Limited\nC8:5C:CC\t\tBeijing Xiaomi Mobile Software Co., Ltd\nC8:5C:E2\t\tIEEE Registration Authority\nC8:5C:E2:00:00:00/28\tFela Management AG\nC8:5C:E2:10:00:00/28\tAnnapurna labs\nC8:5C:E2:20:00:00/28\tSamabaNova Systems\nC8:5C:E2:30:00:00/28\tECOCHIP Communication Technology(shenzhen)Co.Ltd.\nC8:5C:E2:40:00:00/28\tJector Digital Corporation\nC8:5C:E2:50:00:00/28\tCranns Limited\nC8:5C:E2:60:00:00/28\tbrinfotec\nC8:5C:E2:70:00:00/28\tSynergy Systems And Solutions\nC8:5C:E2:80:00:00/28\tLYNX Technik AG\nC8:5C:E2:90:00:00/28\tQuthc Limited\nC8:5C:E2:A0:00:00/28\tSan Telequip (P) Ltd.,\nC8:5C:E2:B0:00:00/28\tAloT Tech\nC8:5C:E2:C0:00:00/28\tShanghai Gaviota Intelligent Technology Co.,Ltd.\nC8:5C:E2:D0:00:00/28\tUnilumin Group Co., Ltd.\nC8:5C:E2:E0:00:00/28\tWonder Education Tech Limited\nC8:5D:38\t\tHUMAX Co., Ltd.\nC8:5E:A9\t\tIntel Corporate\nC8:60:00\t\tASUSTek COMPUTER INC.\nC8:60:8F\t\tCisco Systems, Inc\nC8:61:D0\t\tShen Zhen Ktc Technology.,Ltd.\nC8:63:14\t\tIEEE Registration Authority\nC8:63:14:00:00:00/28\tWestern Reserve Controls, Inc.\nC8:63:14:10:00:00/28\tAutonics Co., Ltd.\nC8:63:14:20:00:00/28\tTymphany Acoustic Technology (Huizhou) Co.,  Ltd.\nC8:63:14:30:00:00/28\tTrackMan\nC8:63:14:40:00:00/28\tShenzhen Zero Zero Infinity Technology Co.，Ltd.\nC8:63:14:50:00:00/28\tMeyer Electronics Limited\nC8:63:14:60:00:00/28\tGrinbi Partners\nC8:63:14:70:00:00/28\tShenzhen Wesion Technology Co., Ltd\nC8:63:14:80:00:00/28\tThinci, Inc.\nC8:63:14:90:00:00/28\tMaxcom S.A.\nC8:63:14:A0:00:00/28\tOptictimes Co.,Ltd\nC8:63:14:B0:00:00/28\tShenzhen Lihewei Electronics Co.,Ltd.Hunan Branch\nC8:63:14:C0:00:00/28\tFreeus LLC\nC8:63:14:D0:00:00/28\tTelematix AG\nC8:63:14:E0:00:00/28\tTaylor Dynamometer\nC8:63:F1\t\tSony Interactive Entertainment Inc.\nC8:63:FC\t\tCommscope\nC8:64:C7\t\tzte corporation\nC8:66:2C\t\tBeijing Haitai Fangyuan High Technology Co,.Ltd.\nC8:66:4B\t\tAperion Technologies LLC\nC8:66:5D\t\tExtreme Networks Headquarters\nC8:67:5E\t\tExtreme Networks Headquarters\nC8:68:DE\t\tHuawei Device Co., Ltd.\nC8:69:CD\t\tApple, Inc.\nC8:6B:BC\t\tIEEE Registration Authority\nC8:6B:BC:00:00:00/28\tSafelyYou\nC8:6B:BC:10:00:00/28\tWeLink Solutions, Inc.\nC8:6B:BC:20:00:00/28\tVipaks + Ltd\nC8:6B:BC:30:00:00/28\tAntevia Networks\nC8:6B:BC:40:00:00/28\tLiuzhou Zuo You Trade Co., Ltd.\nC8:6B:BC:50:00:00/28\tShenzhen Hebang Electronic Co., Ltd\nC8:6B:BC:60:00:00/28\tDrowsy Digital Inc\nC8:6B:BC:70:00:00/28\tShenzhen smart-core technology co.,ltd.\nC8:6B:BC:80:00:00/28\tSinsegye Beijing Technology Co., Ltd\nC8:6B:BC:90:00:00/28\tOsee Technology LTD.\nC8:6B:BC:A0:00:00/28\tAlpha Bridge Technologies Private Limited\nC8:6B:BC:B0:00:00/28\tHAI ROBOTICS Co.,Ltd.\nC8:6B:BC:C0:00:00/28\tZeus\nC8:6B:BC:D0:00:00/28\tScantech(Hangzhou)Co.,Ltd\nC8:6B:BC:E0:00:00/28\tWaterkotte GmbH\nC8:6C:1E\t\tDisplay Systems Ltd\nC8:6C:20\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nC8:6C:3D\t\tAmazon Technologies Inc.\nC8:6C:87\t\tZyxel Communications Corporation\nC8:6C:B6\t\tOptcom Co., Ltd.\nC8:6E:08\t\tIntel Corporate\nC8:6F:1D\t\tApple, Inc.\nC8:70:23\t\tAltice Labs\nC8:70:D4\t\tIBO Technology Co,Ltd\nC8:71:1F\t\tSuzhou Tesien Technology Co., Ltd.\nC8:71:25\t\tJohnson Outdoors Marine Electronics d/b/a Minnkota\nC8:72:48\t\tAplicom Oy\nC8:72:7E\t\tNokia\nC8:73:24\t\tSow Cheng Technology Co. Ltd.\nC8:75:5B\t\tQuantify Technology Pty. Ltd.\nC8:75:DD\t\tLG Electronics NV\nC8:75:F4\t\tChina Mobile Group Device Co.,Ltd.\nC8:77:65\t\tTiesse SpA\nC8:77:8B\t\tMercury Systems – Trusted Mission Solutions, Inc.\nC8:77:F3\t\tVusionGroup\nC8:78:67\t\tMist Systems, Inc.\nC8:78:7D\t\tD-Link Corporation\nC8:7B:23\t\tBose Corporation\nC8:7B:5B\t\tzte corporation\nC8:7C:BC\t\tValink Co., Ltd.\nC8:7C:E2\t\tInfrawaves\nC8:7D:77\t\tShenzhen Kingtech Communication Equipment Co.,Ltd\nC8:7E:75\t\tSamsung Electronics Co.,Ltd\nC8:7E:A1\t\tTCL MOKA International Limited\nC8:7F:2B\t\tIngram Micro Services\nC8:7F:54\t\tASUSTek COMPUTER INC.\nC8:82:34\t\tCisco Systems, Inc\nC8:83:14\t\tTempo Communications\nC8:84:39\t\tSunrise Technologies\nC8:84:47\t\tBeautiful Enterprise Co., Ltd\nC8:84:4E\t\tFlextronics International Kft\nC8:84:8C\t\tRuckus Wireless\nC8:84:A1\t\tCisco Systems, Inc\nC8:84:CF\t\tHuawei Technologies Co.,Ltd\nC8:85:50\t\tApple, Inc.\nC8:86:29\t\tShenzhen Duubee Intelligent Technologies Co.,LTD.\nC8:87:22\t\tLumenpulse\nC8:87:3B\t\tNet Optics\nC8:89:F3\t\tApple, Inc.\nC8:8A:83\t\tDongguan HuaHong Electronics Co.,Ltd\nC8:8A:9A\t\tIntel Corporate\nC8:8A:D8\t\tChina Dragon Technology Limited\nC8:8B:47\t\tNolangroup S.P.A con Socio Unico\nC8:8B:E8\t\tMasimo Corporation\nC8:8D:83\t\tHuawei Technologies Co.,Ltd\nC8:8D:D4\t\tMarkone technology Co., Ltd.\nC8:8E:D1\t\tIEEE Registration Authority\nC8:8E:D1:00:00:00/28\tAisworld Private Limited\nC8:8E:D1:10:00:00/28\tGerman Pipe GmbH\nC8:8E:D1:20:00:00/28\tRotronic Ag\nC8:8E:D1:30:00:00/28\tLinx Technologies\nC8:8E:D1:40:00:00/28\tComlab AG\nC8:8E:D1:50:00:00/28\tFibergate.Inc\nC8:8E:D1:60:00:00/28\tShenyang Machine Tool(Group) Research & Design Institute Co., Ltd, Shanghai Branch\nC8:8E:D1:70:00:00/28\tUbe, Inc. (dba Plum)\nC8:8E:D1:80:00:00/28\tElectronic Controls Design, Inc.\nC8:8E:D1:90:00:00/28\tFocalcrest, Ltd.\nC8:8E:D1:A0:00:00/28\tAP Sensing GmbH\nC8:8E:D1:B0:00:00/28\tAdvanced Micro Controls Inc.\nC8:8E:D1:C0:00:00/28\tShanghai Bwave Technology Co.,Ltd\nC8:8E:D1:D0:00:00/28\tPhoenix Engineering Corp.\nC8:8E:D1:E0:00:00/28\tAventics GmbH\nC8:8E:D1:F0:00:00/28\tPrivate\nC8:8F:26\t\tSkyworth Digital Technology(Shenzhen) Co.,Ltd\nC8:90:09\t\tBudderfly Inc.\nC8:90:3E\t\tPakton Technologies\nC8:90:8A\t\tSamsung Electronics Co.,Ltd\nC8:90:A8\t\tBouffalo Lab (Nanjing) Co., Ltd.\nC8:91:F9\t\tSagemcom Broadband SAS\nC8:93:46\t\tMXCHIP Company Limited\nC8:93:83\t\tEmbedded Automation, Inc.\nC8:94:02\t\tChongqing Fugui Electronics Co.,Ltd.\nC8:94:BB\t\tHuawei Technologies Co.,Ltd\nC8:94:D2\t\tJiangsu Datang  Electronic Products Co., Ltd\nC8:95:CE\t\tIntel Corporate\nC8:96:5A\t\tSky Uk Limited\nC8:96:65\t\tMicrosoft Corporation\nC8:97:9F\t\tNokia Corporation\nC8:98:28\t\tzte corporation\nC8:98:DB:00:00:00/28\tUnicore Communications Inc.\nC8:98:DB:10:00:00/28\tBlock, Inc.\nC8:98:DB:20:00:00/28\tfreecle Inc.\nC8:98:DB:30:00:00/28\tShenzhen Kedakeda Technology Co., Ltd.\nC8:98:DB:40:00:00/28\tShenzhen IBD Intelligence Technology Co,.Ltd.\nC8:98:DB:50:00:00/28\tPrivate\nC8:98:DB:60:00:00/28\tQuantum Co., Ltd.\nC8:98:DB:70:00:00/28\tJ&R Technology Limited\nC8:98:DB:80:00:00/28\tVoleatech GmbH\nC8:98:DB:90:00:00/28\tMindtec\nC8:98:DB:A0:00:00/28\tChampin\nC8:98:DB:B0:00:00/28\tShenzhen Hooolink Technology Co., LTD\nC8:98:DB:C0:00:00/28\tSmartrend Manufacturing Group\nC8:98:DB:D0:00:00/28\tQuilt Systems, Inc\nC8:98:DB:E0:00:00/28\tqihangzhitong\nC8:99:B2\t\tArcadyan Corporation\nC8:9B:AD\t\tHonor Device Co., Ltd.\nC8:9B:D7\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nC8:9C:13\t\tInspiremobile\nC8:9C:1D\t\tCisco Systems, Inc\nC8:9C:BB\t\tTaicang T&W Electronics\nC8:9C:DC\t\tElitegroup Computer Systems Co.,Ltd.\nC8:9D:18\t\tHuawei Device Co., Ltd.\nC8:9D:6D\t\tItel Mobile Limited\nC8:9E:43\t\tNetgear\nC8:9E:61\t\tLyngsoe Systems LTd\nC8:9F:0C\t\tMotorola Mobility LLC, a Lenovo Company\nC8:9F:1A\t\tHuawei Technologies Co.,Ltd\nC8:9F:1D\t\tShenzhen Communication Technologies Co.,Ltd\nC8:9F:42\t\tVDII Innovation AB\nC8:A0:30\t\tTexas Instruments\nC8:A1:B6\t\tShenzhen Longway Technologies Co., Ltd\nC8:A1:BA\t\tNeul Ltd\nC8:A1:DC\t\tMotorola Mobility LLC, a Lenovo Company\nC8:A2:3B\t\tShenzhen Sundray Technologies company Limited\nC8:A2:CE\t\tOasis Media Systems LLC\nC8:A3:62\t\tASIX Electronics Corporation\nC8:A3:E8\t\tCloud Network Technology Singapore Pte. Ltd.\nC8:A4:0D\t\tCooler Master Technology Inc\nC8:A4:CD\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nC8:A6:08\t\tRuckus Wireless\nC8:A6:20\t\tNebula, Inc\nC8:A6:EF\t\tSamsung Electronics Co.,Ltd\nC8:A7:02\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nC8:A7:0A\t\tVerizon Business\nC8:A7:29\t\tSYStronics Co., Ltd.\nC8:A7:76\t\tHuawei Technologies Co.,Ltd\nC8:A8:23\t\tSamsung Electronics Co.,Ltd\nC8:A9:13\t\tLontium Semiconductor Corporation\nC8:A9:FC\t\tGoyoo Networks Inc.\nC8:AA:21\t\tCommscope\nC8:AA:55\t\tHunan Comtom Electronic Incorporated Co.,Ltd\nC8:AA:B2\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\nC8:AA:CC\t\tPrivate\nC8:AC:35\t\tPiLink Co., Ltd.\nC8:AE:9C\t\tShanghai TYD Elecronic Technology Co. Ltd\nC8:AF:40\t\tmarco Systemanalyse und Entwicklung GmbH\nC8:AF:E3\t\tHefei Radio Communication Technology Co., Ltd\nC8:B1:CD\t\tApple, Inc.\nC8:B1:EE\t\tQorvo\nC8:B2:1E\t\tChipsea Technologies (Shenzhen) Corp.\nC8:B2:9B\t\tIntel Corporate\nC8:B3:73\t\tCisco-Linksys, LLC\nC8:B4:22\t\tAskey Computer Corp\nC8:B4:AB\t\tInspur Computer Technology Co.,Ltd.\nC8:B5:AD\t\tHewlett Packard Enterprise\nC8:B5:B7\t\tApple, Inc.\nC8:B6:D3\t\tHuawei Technologies Co.,Ltd\nC8:B6:FE\t\tFitbit, Inc.\nC8:B8:2F\t\teero inc.\nC8:BA:94\t\tSamsung Electro-Mechanics(Thailand)\nC8:BA:E9\t\tQdis\nC8:BB:81\t\tHuawei Device Co., Ltd.\nC8:BB:D3\t\tEmbrane\nC8:BC:9C\t\tHuawei Device Co., Ltd.\nC8:BC:C8\t\tApple, Inc.\nC8:BC:E5\t\tSense Things Japan INC.\nC8:BD:4D\t\tSamsung Electronics Co.,Ltd\nC8:BD:69\t\tSamsung Electronics Co.,Ltd\nC8:BE:19\t\tD-Link International\nC8:BE:35\t\tExtreme Networks Headquarters\nC8:BF:4C\t\tBeijing Xiaomi Mobile Software Co., Ltd\nC8:BF:FE\t\tHuawei Device Co., Ltd.\nC8:C1:26\t\tZPM Industria e Comercio Ltda\nC8:C1:3C\t\tRuggedTek Hangzhou Co., Ltd\nC8:C2:C6\t\tShanghai Airm2m Communication Technology Co., Ltd\nC8:C2:F5\t\tFlextronics Manufacturing(Zhuhai)Co.,Ltd.\nC8:C2:FA\t\tHuawei Technologies Co.,Ltd\nC8:C4:32\t\tSG Armaturen AS\nC8:C4:65\t\tHuawei Technologies Co.,Ltd\nC8:C5:0E\t\tShenzhen Primestone Network Technologies.Co., Ltd.\nC8:C6:4A\t\tFlextronics Tech.(Ind) Pvt Ltd\nC8:C6:FE\t\teero inc.\nC8:C7:50\t\tMotorola Mobility LLC, a Lenovo Company\nC8:C7:91\t\tZero1.tv GmbH\nC8:C9:A3\t\tEspressif Inc.\nC8:CA:63\t\tHuawei Device Co., Ltd.\nC8:CA:79\t\tCiena Corporation\nC8:CB:9E\t\tIntel Corporate\nC8:CB:B8\t\tHewlett Packard\nC8:CC:B5\t\tHunter Douglas\nC8:CD:55\t\tRuijie Networks Co.,LTD\nC8:CD:72\t\tSagemcom Broadband SAS\nC8:D0:19\t\tShanghai Tigercel Communication Technology Co.,Ltd\nC8:D0:83\t\tApple, Inc.\nC8:D1:0B\t\tNokia Corporation\nC8:D1:2A\t\tComtrend Corporation\nC8:D1:5E\t\tHuawei Technologies Co.,Ltd\nC8:D1:A9\t\tHuawei Technologies Co.,Ltd\nC8:D1:D1\t\tAGAiT Technology Corporation\nC8:D2:C1\t\tJetlun (Shenzhen) Corporation\nC8:D3:A3\t\tD-Link International\nC8:D3:FF\t\tHewlett Packard\nC8:D4:29\t\tMuehlbauer AG\nC8:D5:90\t\tFlight Data Systems\nC8:D5:FE\t\tShenzhen Zowee Technology Co., Ltd\nC8:D6:9D\t\tArab International Optronics\nC8:D6:B7\t\tSolidigm Technology\nC8:D7:19\t\tCisco-Linksys, LLC\nC8:D7:78\t\tBSH Hausgeraete GmbH\nC8:D7:79\t\tQing Dao Haier Telecom Co.,Ltd.\nC8:D7:B0\t\tSamsung Electronics Co.,Ltd\nC8:D8:84\t\tUniversal Electronics, Inc.\nC8:D9:59\t\tMotorola Mobility LLC, a Lenovo Company\nC8:D9:95\t\tJuniper Networks\nC8:D9:D2\t\tHewlett Packard\nC8:DB:26\t\tLogitech\nC8:DD:6A\t\tOhsung\nC8:DD:C9\t\tLenovo Mobile Communication Technology Ltd.\nC8:DE:41\t\tSky Uk Limited\nC8:DE:51\t\tIntegraOptics\nC8:DE:C9\t\tCoriant\nC8:DF:7C\t\tNokia Corporation\nC8:DF:84\t\tTexas Instruments\nC8:E0:7A\t\tFiberhome Telecommunication Technologies Co.,LTD\nC8:E0:EB\t\tApple, Inc.\nC8:E1:30\t\tMilkyway Group Ltd\nC8:E1:93\t\tItel Mobile Limited\nC8:E1:A7\t\tVertu Corporation Limited\nC8:E2:65\t\tIntel Corporate\nC8:E3:06\t\teero inc.\nC8:E3:1D\t\tHuawei Technologies Co.,Ltd\nC8:E4:2F\t\tTechnical Research Design and Development\nC8:E5:E0\t\tHuawei Technologies Co.,Ltd\nC8:E6:00\t\tHuawei Technologies Co.,Ltd\nC8:E7:76\t\tPTCOM Technology\nC8:E7:D8\t\tMercury Communication Technologies Co.,Ltd.\nC8:E7:F0\t\tJuniper Networks\nC8:EA:F8\t\tzte corporation\nC8:EB:EC\t\tShenzhen YOUHUA Technology Co., Ltd\nC8:ED:FC\t\tShenzhen Ideaform Industrial Product Design Co., Ltd\nC8:EE:08\t\tTangtop Technology Co.,Ltd\nC8:EE:75\t\tPishion International Co. Ltd\nC8:EE:A6\t\tShenzhen SHX Technology Co., Ltd\nC8:EE:D7\t\tLightspeed Technologies Inc.\nC8:EF:2E\t\tBeijing Gefei Tech. Co., Ltd\nC8:EF:BC\t\tInspur Communication Technology Co.,Ltd.\nC8:F0:9E\t\tEspressif Inc.\nC8:F2:25\t\tEM Microelectronic\nC8:F2:30\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nC8:F2:B4\t\tGuizhou Huaxin Information Technology Co., Ltd.\nC8:F3:19\t\tLG Electronics (Mobile Communications)\nC8:F3:6B\t\tYamato Scale Co.,Ltd.\nC8:F3:86\t\tShenzhen Xiaoniao Technology Co.,Ltd\nC8:F4:06\t\tAvaya Inc\nC8:F5:D6\t\tIEEE Registration Authority\nC8:F5:D6:00:00:00/28\tMeiryo Technica Corporation\nC8:F5:D6:10:00:00/28\tValeo Interior Controls (Shenzhen) Co.,Ltd\nC8:F5:D6:20:00:00/28\tQbic Technology Co., Ltd\nC8:F5:D6:30:00:00/28\tBBPOS Limited\nC8:F5:D6:40:00:00/28\tEvotor Llc\nC8:F5:D6:50:00:00/28\tPinmicro K K\nC8:F5:D6:60:00:00/28\tJabil\nC8:F5:D6:70:00:00/28\tOscars Pro\nC8:F5:D6:80:00:00/28\tYarward Electronics  Co., Ltd.\nC8:F5:D6:90:00:00/28\tShanghai Mo xiang Network Technology CO.,ltd\nC8:F5:D6:A0:00:00/28\tHENAN FOXSTAR DIGITAL DISPLAY Co.,Ltd.\nC8:F5:D6:B0:00:00/28\tUnited Barcode Systems\nC8:F5:D6:C0:00:00/28\tEltako GmbH\nC8:F5:D6:D0:00:00/28\tVolansys technologies pvt ltd\nC8:F5:D6:E0:00:00/28\tHeitec Ag\nC8:F6:50\t\tApple, Inc.\nC8:F6:8D\t\tS.E.Technologies Limited\nC8:F6:C8\t\tFiberhome Telecommunication Technologies Co.,LTD\nC8:F7:04\t\tBuilding Block Video\nC8:F7:33\t\tIntel Corporate\nC8:F7:42\t\tHangZhou Gubei Electronics Technology Co.,Ltd\nC8:F7:50\t\tDell Inc.\nC8:F8:6D\t\tAlcatel-Lucent Shanghai Bell Co., Ltd\nC8:F9:46\t\tLOCOSYS Technology Inc.\nC8:F9:81\t\tSeneca s.r.l.\nC8:F9:C8\t\tNewSharp Technology(SuZhou)Co,Ltd\nC8:F9:F9\t\tCisco Systems, Inc\nC8:FA:84\t\tTrusonus corp.\nC8:FA:E1\t\tARQ Digital LLC\nC8:FB:26\t\tCisco SPVTG\nC8:FB:54\t\tiMin Technology Pte. Ltd.\nC8:FD:19\t\tTexas Instruments\nC8:FE:0F\t\tShenzhen Bilian Electronic Co.，Ltd\nC8:FE:30\t\tBejing DAYO Mobile Communication Technology Ltd.\nC8:FE:6A\t\tJuniper Networks\nC8:FF:28\t\tLiteon Technology Corporation\nC8:FF:77\t\tDyson Limited\nC8:FF:BF\t\tIEEE Registration Authority\nC8:FF:BF:00:00:00/28\tShenzhen HC Electronic Technology Co.,LTD\nC8:FF:BF:10:00:00/28\trobert juliat\nC8:FF:BF:20:00:00/28\tCognizant Mobility GmbH\nC8:FF:BF:30:00:00/28\tTectoy S.A\nC8:FF:BF:40:00:00/28\tBeijing Jingyibeifang Instrument Co.,Ltd.\nC8:FF:BF:50:00:00/28\tChongqing Zhizhu Huaxin Technology Co.,Ltd\nC8:FF:BF:60:00:00/28\tAccuphy Technologies Beijing Ltd\nC8:FF:BF:70:00:00/28\tIndra Renewable Technologies\nC8:FF:BF:80:00:00/28\tShenzhen Fengrunda Technology Co.,Ltd\nC8:FF:BF:90:00:00/28\tShandong Wanshuo Optoelectronic Equipment Co.,Ltd\nC8:FF:BF:A0:00:00/28\tMaestro Food Co.\nC8:FF:BF:B0:00:00/28\tPubliBike SA\nC8:FF:BF:C0:00:00/28\tDensity.IO\nC8:FF:BF:D0:00:00/28\tALDES DomNexX\nC8:FF:BF:E0:00:00/28\tHt Italia Srl\nCA:04:5A\t\tOssia Inc\nCA:08:3C\t\tWestern Digital Technologies, Inc.\nCA:12:5C\t\tMicrosoft Corporation\nCA:1E:45\t\tASMedia Technology Inc.\nCA:22:2B\t\tBeijing Puma Gear Power Equipment Co.,Ltd\nCA:2B:5E\t\tSuzhou Motor-comm Electronic Technology Co.,Ltd\nCA:30:BF\t\tIEEE 802.1 Chair\nCA:37:82\t\tStorbyte, Inc.\nCA:3E:A6\t\tSyng, Inc.\nCA:44:3E\t\tAllianz Technology SE\nCA:44:6C\t\tCypress Computer Systems, Inc.\nCA:7D:DD\t\tEmOne (Thailand) Co.,Ltd.\nCA:8F:A5\t\tAdvanced TS Migrations, Co\nCA:C2:76\t\tSaab Seaeye Ltd\nCA:C8:7E\t\tAllen Organ Company\nCA:E5:05\t\tMobilitie\nCA:F2:5B\t\tLexar Electronics(Shenzhen) Co.,Ltd.\nCA:FA:E6\t\tTianjin Ronghui microelectronics Technology Co., Ltd.\nCC:00:80\t\tBettini Srl\nCC:00:F1\t\tSagemcom Broadband SAS\nCC:03:7B\t\tTexas Instruments\nCC:03:88\t\tMangoBoost Inc\nCC:03:D9\t\tCisco Meraki\nCC:03:FA\t\tVantiva USA LLC\nCC:04:7C\t\tG-WAY Microwave\nCC:04:B4\t\tSelect Comfort\nCC:05:1B\t\tSamsung Electronics Co.,Ltd\nCC:05:77\t\tHuawei Technologies Co.,Ltd\nCC:06:77\t\tFiberhome Telecommunication Technologies Co.,LTD\nCC:07:AB\t\tSamsung Electronics Co.,Ltd\nCC:07:E4\t\tLenovo Mobile Communication Technology Ltd.\nCC:08:7B\t\tHuawei Technologies Co.,Ltd\nCC:08:8D\t\tApple, Inc.\nCC:08:E0\t\tApple, Inc.\nCC:08:FA\t\tApple, Inc.\nCC:08:FB\t\tTp-Link Technologies Co.,Ltd.\nCC:09:C8\t\tImaqliq Ltd\nCC:0C:DA\t\tMiljovakt AS\nCC:0D:E7\t\tB Meters S.R.L.\nCC:0D:EC\t\tCisco SPVTG\nCC:0D:F2\t\tMotorola Mobility LLC, a Lenovo Company\nCC:10:A3\t\tBeijing Nan Bao Technology Co., Ltd.\nCC:11:5A\t\tApple, Inc.\nCC:12:28\t\tHisense Visual Technology Co.,Ltd\nCC:14:A6\t\tYichun MyEnergy Domain, Inc\nCC:14:BC\t\tEdifier International\nCC:15:31\t\tIntel Corporate\nCC:16:7E\t\tCisco Systems, Inc\nCC:18:7B\t\tManzanita Systems, Inc.\nCC:19:A8\t\tPT Inovação e Sistemas SA\nCC:1A:A3\t\tArista Networks\nCC:1A:FA\t\tzte corporation\nCC:1B:5A\t\tRuckus Wireless\nCC:1B:E0\t\tIEEE Registration Authority\nCC:1B:E0:00:00:00/28\tMicrotech System,Inc\nCC:1B:E0:10:00:00/28\tBeijing Daotongtianxia Co.Ltd.\nCC:1B:E0:20:00:00/28\ti-Trinetech Co.,Ltd.\nCC:1B:E0:30:00:00/28\tShenzhen Vanstor Technology Co.,Ltd\nCC:1B:E0:40:00:00/28\tLaserworld (Switzerland) AG\nCC:1B:E0:50:00:00/28\tEarphone Connection, Ubc.\nCC:1B:E0:60:00:00/28\tIC RealTech\nCC:1B:E0:70:00:00/28\tSichuan Dianjia network technology Co.Ltd.\nCC:1B:E0:80:00:00/28\tMDT technologies GmbH\nCC:1B:E0:90:00:00/28\tMobiStor Technology Inc.\nCC:1B:E0:A0:00:00/28\tMatter Labs Pty Ltd\nCC:1B:E0:B0:00:00/28\tART&CORE Inc\nCC:1B:E0:C0:00:00/28\tGuangzhou Southelectric Power Science Technology Development Co.,Ltd.\nCC:1B:E0:D0:00:00/28\tNewstar (Hk) Electronic Development Limited\nCC:1B:E0:E0:00:00/28\tCassia Networks\nCC:1B:E0:F0:00:00/28\tPrivate\nCC:1E:56\t\tHuawei Technologies Co.,Ltd\nCC:1E:97\t\tHuawei Technologies Co.,Ltd\nCC:1E:FF\t\tMetrological Group BV\nCC:1F:C4\t\tInVue\nCC:20:8C\t\tHuawei Technologies Co.,Ltd\nCC:20:AC\t\tSamsung Electronics Co.,Ltd\nCC:20:E8\t\tApple, Inc.\nCC:21:19\t\tSamsung Electronics Co.,Ltd\nCC:22:18\t\tInnoDigital Co., Ltd.\nCC:22:37\t\tIEEE Registration Authority\nCC:22:37:00:00:00/28\tMEDCOM sp. z o.o.\nCC:22:37:10:00:00/28\tTerma Sp. z o.o.\nCC:22:37:20:00:00/28\tApeiron Data Systems\nCC:22:37:30:00:00/28\tXConnect Professional Services\nCC:22:37:40:00:00/28\tShanghai Cargoa M.&E.Equipment Co.Ltd\nCC:22:37:50:00:00/28\tBeijing Safesoft Greatmaker Co.,ltd\nCC:22:37:60:00:00/28\tSiemens AG Austria\nCC:22:37:70:00:00/28\tShanghai Doit IOT Technology Co.,Ltd.\nCC:22:37:80:00:00/28\tSafilo S.p.A.\nCC:22:37:90:00:00/28\tE Ink Corp\nCC:22:37:A0:00:00/28\tshenzhen zonglian network technology limited\nCC:22:37:B0:00:00/28\tTolomatic, Inc.\nCC:22:37:C0:00:00/28\tHebei ZHSF Technology Co.,Ltd.\nCC:22:37:D0:00:00/28\tShenzhen Hooenergy Technology Co.,Ltd\nCC:22:37:E0:00:00/28\tManufacturas Y Transformados Ab, S.L.\nCC:22:93\t\tAmazon Technologies Inc.\nCC:22:DF\t\tEM Microelectronic\nCC:22:FE\t\tApple, Inc.\nCC:24:2E\t\tShenzhen SuperElectron Technology Co.,Ltd.\nCC:25:EF\t\tApple, Inc.\nCC:26:14\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nCC:26:2D\t\tVerifi, LLC\nCC:27:46\t\tApple, Inc.\nCC:28:AA\t\tASUSTek COMPUTER INC.\nCC:29:BD\t\tzte corporation\nCC:29:F5\t\tApple, Inc.\nCC:2A:80\t\tMicro-Biz intelligence solutions Co.,Ltd\nCC:2A:AC\t\tYunjing lntelligent Technology(Dongguan).,Ltd\nCC:2C:83\t\tDarkMatter L.L.C\nCC:2D:1B\t\tSfr\nCC:2D:21\t\tTenda Technology Co.,Ltd.Dongguan branch\nCC:2D:83\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nCC:2D:8C\t\tLg Electronics Inc\nCC:2D:B7\t\tApple, Inc.\nCC:2D:E0\t\tRouterboard.com\nCC:2F:71\t\tIntel Corporate\nCC:30:80\t\tVAIO Corporation\nCC:31:2A\t\tHuizhou Tcl Communication Electron Co.,Ltd\nCC:32:96\t\tHuawei Device Co., Ltd.\nCC:32:E5\t\tTp-Link Technologies Co.,Ltd.\nCC:33:31\t\tTexas Instruments\nCC:33:BB\t\tSagemcom Broadband SAS\nCC:34:29\t\tTp-Link Technologies Co.,Ltd.\nCC:34:D7\t\tGewiss S.P.A.\nCC:35:40\t\tVantiva USA LLC\nCC:35:5A\t\tSecuGen Corporation\nCC:36:CF\t\tCisco Systems, Inc\nCC:37:AB\t\tEdgecore Networks Corporation\nCC:38:D0\t\tPalo Alto Networks\nCC:39:8C\t\tShiningtek\nCC:3A:61\t\tSamsung Electro Mechanics Co., Ltd.\nCC:3A:DF\t\tNeptune Technology Group Inc.\nCC:3B:27\t\tTecno Mobile Limited\nCC:3B:3E\t\tLester Electrical\nCC:3B:58\t\tCuriouser Products Inc\nCC:3B:FB\t\tRing LLC\nCC:3C:3F\t\tSA.S.S. Datentechnik AG\nCC:3D:82\t\tIntel Corporate\nCC:3D:D1\t\tHuawei Technologies Co.,Ltd\nCC:3E:5F\t\tHewlett Packard\nCC:3E:79\t\tCommscope\nCC:3F:1D\t\tHMS Industrial Networks SLU\nCC:3F:36\t\tApple, Inc.\nCC:3F:8A\t\tKomatsu Ltd.\nCC:3F:EA\t\tBAE Systems, Inc\nCC:40:85\t\tWiZ\nCC:40:B2\t\tECI Telecom Ltd.\nCC:40:D0\t\tNetgear\nCC:40:F3\t\tMellanox Technologies, Inc.\nCC:41:8E\t\tMSA Innovation\nCC:42:10\t\tXiaomi Communications Co Ltd\nCC:43:E3\t\tTrump s.a.\nCC:44:60\t\tHuawei Device Co., Ltd.\nCC:44:63\t\tApple, Inc.\nCC:45:A5\t\tTexas Instruments\nCC:46:39\t\tWAAV, Inc.\nCC:46:4E\t\tSamsung Electronics Co.,Ltd\nCC:46:D6\t\tCisco Systems, Inc\nCC:47:03\t\tIntercon Systems Co., Ltd.\nCC:47:40\t\tAzureWave Technology Inc.\nCC:47:92\t\tASIX Electronics Corporation\nCC:47:BD\t\tRhombus Systems\nCC:48:3A\t\tDell Inc.\nCC:4A:E1\t\tfourtec -Fourier Technologies\nCC:4B:04\t\tApple, Inc.\nCC:4B:73\t\tAMPAK Technology, Inc.\nCC:4B:FB\t\tHellberg Safety AB\nCC:4D:38\t\tCarnegie Technologies\nCC:4D:74\t\tFujian Newland Payment Technology Co., Ltd.\nCC:4D:75\t\tBeijing Xiaomi Mobile Software Co., Ltd\nCC:4E:24\t\tBrocade Communications Systems LLC\nCC:4E:EC\t\tHUMAX Co., Ltd.\nCC:4F:5C\t\tIEEE Registration Authority\nCC:4F:5C:00:00:00/28\tChengdu Ren Heng Mei Guang Technology Co.,Ltd.\nCC:4F:5C:10:00:00/28\tlesswire GmbH\nCC:4F:5C:20:00:00/28\tMatchX GmbH\nCC:4F:5C:30:00:00/28\tShanghai Zenchant Electornics Co.,LTD\nCC:4F:5C:40:00:00/28\tSpark Biomedical\nCC:4F:5C:50:00:00/28\tKymati GmbH\nCC:4F:5C:60:00:00/28\tWatertech S.p.A.\nCC:4F:5C:70:00:00/28\tSmiths US Innovation LLC\nCC:4F:5C:80:00:00/28\tFeelmore Labs\nCC:4F:5C:90:00:00/28\tDtrovision\nCC:4F:5C:A0:00:00/28\tAz-Technology Sdn Bhd\nCC:4F:5C:B0:00:00/28\tOntex BV\nCC:4F:5C:C0:00:00/28\tBeijing Cotytech Technology Co.,LTD.\nCC:4F:5C:D0:00:00/28\tBeijing Neutron Technology CO.,LTD.\nCC:4F:5C:E0:00:00/28\tBeijing Techao Weijia Technology Limited\nCC:50:0A\t\tFiberhome Telecommunication Technologies Co.,LTD\nCC:50:1C\t\tKVH Industries, Inc.\nCC:50:76\t\tOcom Communications, Inc.\nCC:50:E3\t\tEspressif Inc.\nCC:51:B4\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\nCC:52:89\t\tShenzhen Optfocus Technology.,Ltd\nCC:52:AF\t\tUniversal Global Scientific Industrial Co., Ltd.\nCC:53:B5\t\tHuawei Technologies Co.,Ltd\nCC:54:59\t\tOnTime Networks AS\nCC:54:FE\t\tMimosa Networks\nCC:55:AD\t\tRim\nCC:57:63\t\tPanasonic Automotive Systems Co.,Ltd\nCC:58:30\t\tSagemcom Broadband SAS\nCC:59:3E\t\tSensium Healthcare Limited\nCC:5A:53\t\tCisco Systems, Inc\nCC:5B:31\t\tNintendo Co.,Ltd\nCC:5C:61\t\tHuawei Device Co., Ltd.\nCC:5C:75\t\tWeightech Com. Imp. Exp. Equip. Pesagem Ltda\nCC:5C:DE\t\tChina Mobile Group Device Co.,Ltd.\nCC:5D:4E\t\tZyxel Communications Corporation\nCC:5D:57\t\tInformation  System Research Institute,Inc.\nCC:5D:78\t\tJTD Consulting\nCC:5E:F8\t\tCloud Network Technology Singapore Pte. Ltd.\nCC:5F:BF\t\tTopwise 3G Communication Co., Ltd.\nCC:60:23\t\tApple, Inc.\nCC:60:BB\t\tEmpower RF Systems\nCC:60:C8\t\tMicrosoft Corporation\nCC:61:E5\t\tMotorola Mobility LLC, a Lenovo Company\nCC:62:00\t\tHonor Device Co., Ltd.\nCC:62:FE\t\tUnion Man Technology Co.,Ltd\nCC:64:1A\t\tShenzhen Bilian Electronic Co.，Ltd\nCC:64:A6\t\tHuawei Technologies Co.,Ltd\nCC:65:AD\t\tCommscope\nCC:66:0A\t\tApple, Inc.\nCC:66:18\t\tAdtran Inc\nCC:66:B2\t\tNokia\nCC:67:D8\t\tTelin Semiconductor (Wuhan) Co.,Ltd\nCC:68:B6\t\tTP-Link Systems Inc\nCC:68:E0\t\tApple, Inc.\nCC:69:B0\t\tGlobal Traffic Technologies, LLC\nCC:69:FA\t\tApple, Inc.\nCC:6A:10\t\tThe Chamberlain Group, Inc\nCC:6A:33\t\tCisco Systems, Inc\nCC:6B:1E\t\tCloud Network Technology Singapore Pte. Ltd.\nCC:6B:98\t\tMinetec Wireless Technologies\nCC:6B:F1\t\tSound Masking Inc.\nCC:6C:52\t\tZhone Technologies, Inc.\nCC:6D:55\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nCC:6D:A0\t\tRoku, Inc.\nCC:6D:EF\t\tTJK Tietolaite Oy\nCC:6E:2A\t\tCisco Meraki\nCC:6E:A4\t\tSamsung Electronics Co.,Ltd\nCC:70:ED\t\tCisco Systems, Inc\nCC:71:90\t\tVietnam Post And Telecommunication Industry Technology Joint Stock Company\nCC:72:0F\t\tViscount Systems Inc.\nCC:72:86\t\tXi'an Fengyu Information Technology Co., Ltd.\nCC:73:14\t\tHong Kong Wheatek Technology Limited\nCC:74:98\t\tFilmetrics Inc.\nCC:75:E2\t\tCommscope\nCC:76:3A\t\tzte corporation\nCC:76:69\t\tSeetech\nCC:77:C9\t\tFiberhome Telecommunication Technologies Co.,LTD\nCC:78:5F\t\tApple, Inc.\nCC:78:AB\t\tTexas Instruments\nCC:79:4A\t\tBLU Products Inc.\nCC:79:CF\t\tShenzhen Rf-Link Technology Co.,Ltd.\nCC:79:D7\t\tCisco Systems, Inc\nCC:7A:30\t\tCMAX Wireless Co., Ltd.\nCC:7B:35\t\tzte corporation\nCC:7B:5C\t\tEspressif Inc.\nCC:7B:61\t\tNikkiso Co., Ltd.\nCC:7D:37\t\tCommscope\nCC:7D:5B\t\tTelink Semiconductor (Shanghai) Co., Ltd.\nCC:7E:0F\t\tTheben AG\nCC:7E:E7\t\tPanasonic Corporation AVC Networks Company\nCC:7F:75\t\tCisco Systems, Inc\nCC:7F:76\t\tCisco Systems, Inc\nCC:81:2A\t\tvivo Mobile Communication Co., Ltd.\nCC:81:7D\t\tApple, Inc.\nCC:81:DA\t\tPhicomm (Shanghai) Co., Ltd.\nCC:82:7F\t\tAdvantech Technology (CHINA) Co., Ltd.\nCC:82:EB\t\tKyocera Corporation\nCC:85:6C\t\tShenzhen Mdk Digital Technology Co.,Ltd\nCC:86:EC\t\tSilicon Laboratories\nCC:87:4A\t\tNokia\nCC:88:26\t\tLG Innotek\nCC:88:C7\t\tHewlett Packard Enterprise\nCC:89:5E\t\tHuawei Technologies Co.,Ltd\nCC:89:6C\t\tGN Hearing A/S\nCC:89:FD\t\tNokia Corporation\nCC:8A:84\t\tHuawei Device Co., Ltd.\nCC:8C:17\t\tItel Mobile Limited\nCC:8C:BF\t\tTuya Smart Inc.\nCC:8C:DA\t\tShenzhen Wei Da Intelligent Technology Go.,Ltd\nCC:8C:E3\t\tTexas Instruments\nCC:8D:A2\t\tEspressif Inc.\nCC:8D:B5\t\tShenzhen SuperElectron Technology Co.,Ltd.\nCC:8E:71\t\tCisco Systems, Inc\nCC:90:70\t\tCisco Systems, Inc\nCC:90:93\t\tHansong Tehnologies\nCC:90:96\t\tHuawei Device Co., Ltd.\nCC:90:E8\t\tShenzhen YOUHUA Technology Co., Ltd\nCC:91:2B\t\tTE Connectivity Touch Solutions\nCC:93:4A\t\tSierra Wireless, ULC\nCC:94:4A\t\tPfeiffer Vacuum GmbH\nCC:94:70\t\tKinestral Technologies, Inc.\nCC:95:D7\t\tVizio, Inc\nCC:96:35\t\tLVS Co.,Ltd.\nCC:96:A0\t\tHuawei Technologies Co.,Ltd\nCC:96:A2\t\tChina Mobile Group Device Co.,Ltd.\nCC:96:E5\t\tDell Inc.\nCC:98:8B\t\tSONY Visual Products Inc.\nCC:98:91\t\tCisco Systems, Inc\nCC:99:16\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\nCC:9C:3E\t\tCisco Meraki\nCC:9D:A2\t\tEltex Enterprise Ltd.\nCC:9E:00\t\tNintendo Co., Ltd.\nCC:9E:A2\t\tAmazon Technologies Inc.\nCC:9E:CA\t\tHMD Global Oy\nCC:9F:35\t\tTransbit Sp. z o.o.\nCC:9F:7A\t\tChiun Mai Communication System, Inc\nCC:A0:8F\t\tzte corporation\nCC:A0:E5\t\tDZG Metering GmbH\nCC:A1:2B\t\tTCL King Electrical Appliances (Huizhou) Co., Ltd\nCC:A1:50\t\tSystemX Co.,Ltd.\nCC:A1:74\t\tMeta Platforms, Inc.\nCC:A2:19\t\tShenzhen Along Investment Co.,Ltd\nCC:A2:23\t\tHuawei Technologies Co.,Ltd\nCC:A2:60\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nCC:A3:74\t\tGuangdong Guanglian Electronic Technology Co.Ltd\nCC:A3:BD\t\tItel Mobile Limited\nCC:A4:62\t\tCommscope\nCC:A4:AF\t\tShenzhen Sowell Technology Co., LTD\nCC:A6:14\t\tAifa Technology Corp.\nCC:A7:C1\t\tGoogle, Inc.\nCC:AB:2C\t\tHUMAX Co., Ltd.\nCC:AC:FE\t\tTelink Semiconductor (Shanghai) Co., Ltd.\nCC:AF:78\t\tHon Hai Precision Ind. Co.,Ltd.\nCC:B0:71\t\tFiberhome Telecommunication Technologies Co.,LTD\nCC:B0:A8\t\tHuawei Device Co., Ltd.\nCC:B0:B3\t\tMicrosoft Corporation\nCC:B0:DA\t\tLiteon Technology Corporation\nCC:B1:1A\t\tSamsung Electronics Co.,Ltd\nCC:B1:48\t\tArcadyan Corporation\nCC:B1:82\t\tHuawei Technologies Co.,Ltd\nCC:B2:55\t\tD-Link International\nCC:B3:AB\t\tshenzhen Biocare Bio-Medical Equipment Co.,Ltd.\nCC:B3:F8\t\tFujitsu Isotec Limited\nCC:B5:4C\t\tTexas Instruments\nCC:B5:5A\t\tFraunhofer ITWM\nCC:B5:D1\t\tBeijing Xiaomi Mobile Software Co., Ltd\nCC:B6:91\t\tNECMagnusCommunications\nCC:B6:C8\t\tCisco Systems, Inc\nCC:B7:77\t\tzte corporation\nCC:B7:C4\t\tHuawei Technologies Co.,Ltd\nCC:B8:5E\t\tShenzhen Phaten Tech. LTD\nCC:B8:88\t\tAnB Securite s.a.\nCC:B8:A8\t\tAMPAK Technology, Inc.\nCC:B8:F1\t\tEagle Kingdom Technologies Limited\nCC:BA:6F\t\tHuawei Technologies Co.,Ltd\nCC:BA:97\t\tEspressif Inc.\nCC:BA:BD\t\tTP-Link Systems Inc.\nCC:BB:FE\t\tHuawei Technologies Co.,Ltd\nCC:BC:2B\t\tHuawei Device Co., Ltd.\nCC:BC:E3\t\tHuawei Technologies Co.,Ltd\nCC:BD:35\t\tSteinel GmbH\nCC:BD:D3\t\tUltimaker B.V.\nCC:BE:59\t\tCalix Inc.\nCC:BE:71\t\tOptiLogix BV\nCC:BF:0C\t\tShenzhen Fenda Technology Co., Ltd\nCC:C0:79\t\tMurata Manufacturing Co., Ltd.\nCC:C1:04\t\tApplied Technical Systems\nCC:C2:61\t\tIEEE Registration Authority\nCC:C2:61:00:00:00/28\tEbiologic Technology Co., Ltd.\nCC:C2:61:10:00:00/28\tNWL Inc.\nCC:C2:61:20:00:00/28\tTecnoideal Srl\nCC:C2:61:30:00:00/28\tNetradyne, Inc.\nCC:C2:61:40:00:00/28\tEDAG Engineering GmbH\nCC:C2:61:50:00:00/28\tViper Design, LLC\nCC:C2:61:60:00:00/28\tGuardiar USA\nCC:C2:61:70:00:00/28\tAbility Enterprise Co., Ltd\nCC:C2:61:80:00:00/28\tRoomMate AS\nCC:C2:61:90:00:00/28\tByterg Llc\nCC:C2:61:A0:00:00/28\tShenzhen Uyesee Technology Co.,Ltd\nCC:C2:61:B0:00:00/28\tWinterthur Gas & Diesel Ltd.\nCC:C2:61:C0:00:00/28\tNortek Security & Control\nCC:C2:61:D0:00:00/28\tDspread Technology (Beijing) Inc.\nCC:C2:61:E0:00:00/28\tToong In Electronic Corp.\nCC:C2:E0\t\tRaisecom Technology CO., LTD\nCC:C3:EA\t\tMotorola Mobility LLC, a Lenovo Company\nCC:C5:0A\t\tShenzhen Dajiahao Technology Co.,Ltd\nCC:C5:E5\t\tDell Inc.\nCC:C5:EF\t\tCo-Comm Servicios Telecomunicaciones S.L.\nCC:C6:2B\t\tTri-Systems Corporation\nCC:C7:60\t\tApple, Inc.\nCC:C8:D7\t\tCIAS Elettronica srl\nCC:C9:2C\t\tSchindler - PORT Technology\nCC:C9:5D\t\tApple, Inc.\nCC:CC:4E\t\tSun Fountainhead USA. Corp\nCC:CC:77\t\tZaram Technology. Inc.\nCC:CC:81\t\tHuawei Technologies Co.,Ltd\nCC:CC:CC\t\tSilicon Laboratories\nCC:CC:EA\t\tPhoenix Contact GmbH & Co. KG\nCC:CD:64\t\tSM-Electronic GmbH\nCC:CE:1E\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\nCC:CE:40\t\tJanteq Corp\nCC:CF:83\t\tCig Shanghai Co Ltd\nCC:CF:FE\t\tHenan Lingyunda Information Technology Co., Ltd\nCC:D0:83\t\tHewlett Packard Enterprise\nCC:D2:81\t\tApple, Inc.\nCC:D2:9B\t\tShenzhen Bopengfa Elec&Technology CO.,Ltd\nCC:D3:1E\t\tIEEE Registration Authority\nCC:D3:1E:00:00:00/28\tSAMIM Co\nCC:D3:1E:10:00:00/28\tRondo Burgdorf AG\nCC:D3:1E:20:00:00/28\tNeptune Systems\nCC:D3:1E:30:00:00/28\tKen A/S\nCC:D3:1E:40:00:00/28\tPJG Systementwicklung GmbH\nCC:D3:1E:50:00:00/28\tNTmore.Co.,Ltd\nCC:D3:1E:60:00:00/28\tBBPOS Limited\nCC:D3:1E:70:00:00/28\tShenzhen Decnta Technology Co.,LTD.\nCC:D3:1E:80:00:00/28\tinoage GmbH\nCC:D3:1E:90:00:00/28\tSiemens AG, MO MLT BG\nCC:D3:1E:A0:00:00/28\tHaishu Technology LIMITED\nCC:D3:1E:B0:00:00/28\tElk Products\nCC:D3:1E:C0:00:00/28\tNantEnergy\nCC:D3:1E:D0:00:00/28\tCujo Llc\nCC:D3:1E:E0:00:00/28\tShenZhenBoryNet Co.,LTD.\nCC:D3:42\t\tCisco Systems, Inc\nCC:D3:9D\t\tIEEE Registration Authority\nCC:D3:9D:00:00:00/28\tInx Co.,Ltd.\nCC:D3:9D:10:00:00/28\tEvoko Unlimited AB\nCC:D3:9D:20:00:00/28\tContinental Control Systems\nCC:D3:9D:30:00:00/28\tMagTarget LLC\nCC:D3:9D:40:00:00/28\tShenzhen Chenggu Technology Co., Ltd\nCC:D3:9D:50:00:00/28\tShenzhen Royole Technologies Co., Ltd.\nCC:D3:9D:60:00:00/28\tKrontech\nCC:D3:9D:70:00:00/28\tGlenair\nCC:D3:9D:80:00:00/28\tObelisk Inc.\nCC:D3:9D:90:00:00/28\tBejing Nexsec Inc.\nCC:D3:9D:A0:00:00/28\tLubelskie Fabryki Wag FAWAG S.A.\nCC:D3:9D:B0:00:00/28\tQ-Branch Labs, Inc.\nCC:D3:9D:C0:00:00/28\tHangzhou Scooper Technology Co.,Ltd.\nCC:D3:9D:D0:00:00/28\tEthernity Networks\nCC:D3:9D:E0:00:00/28\tShanghai tongli information technology co. LTD\nCC:D3:C1\t\tVestel Elektronik San ve Tic. A.S.\nCC:D3:E2\t\tJiangsu Yinhe  Electronics Co.,Ltd.\nCC:D4:2E\t\tArcadyan Corporation\nCC:D4:A1\t\tMitraStar Technology Corp.\nCC:D5:39\t\tCisco Systems, Inc\nCC:D7:3C\t\tHuawei Technologies Co.,Ltd\nCC:D8:11\t\tAiconn Technology Corporation\nCC:D8:1F\t\tMaipu Communication Technology Co.,Ltd.\nCC:D8:43\t\tBeijing Xiaomi Mobile Software Co., Ltd\nCC:D8:C1\t\tCisco Systems, Inc\nCC:D9:20\t\tHuizhou Desay SV Automotive Co., Ltd.\nCC:D9:AC\t\tIntel Corporate\nCC:D9:E9\t\tSCR Engineers Ltd.\nCC:DA:20\t\tBeijing Xiaomi Mobile Software Co., Ltd\nCC:DA:B5\t\tTexas Instruments\nCC:DB:04\t\tDataRemote Inc.\nCC:DB:93\t\tCisco Systems, Inc\nCC:DB:A7\t\tEspressif Inc.\nCC:DC:55\t\tDragonchip Limited\nCC:DD:58\t\tRobert Bosch GmbH\nCC:DE:DE\t\tNokia\nCC:E0:C3\t\tEXTEN Technologies, Inc.\nCC:E0:DA\t\tBaidu Online Network Technology (Beijing) Co., Ltd\nCC:E1:7F\t\tJuniper Networks\nCC:E1:94\t\tJuniper Networks\nCC:E1:D5\t\tBuffalo.Inc\nCC:E2:36\t\tHangzhou Yaguan Technology Co. LTD\nCC:E5:36\t\tittim\nCC:E6:86\t\tSamsung Electronics Co.,Ltd\nCC:E7:98\t\tMy Social Stuff\nCC:E7:DF\t\tAmerican Magnetics, Inc.\nCC:E8:AC\t\tSOYEA Technology Co.,Ltd.\nCC:E9:FA\t\tSamsung Electronics Co.,Ltd\nCC:EA:1C\t\tDCONWORKS  Co., Ltd\nCC:EA:27\t\tGE Appliances\nCC:EB:18\t\tOoo \"Tss\"\nCC:EB:5E\t\tXiaomi Communications Co Ltd\nCC:EC:B7\t\tShenZhen Linked-Z Intelligent Display Co., Ltd\nCC:ED:21\t\tNokia Shanghai Bell Co., Ltd.\nCC:ED:4D\t\tCisco Systems, Inc\nCC:ED:DC\t\tMitraStar Technology Corp.\nCC:EE:D9\t\tVAHLE Automation GmbH\nCC:EF:03\t\tHunan Keyshare Communication Technology Co., Ltd.\nCC:EF:48\t\tCisco Systems, Inc\nCC:F0:FD\t\tChina Mobile (Hangzhou) Information Technology Co., Ltd.\nCC:F3:05\t\tShenzhen Tian Xing Chuang Zhan Electronic Co.,Ltd\nCC:F3:A5\t\tChi Mei Communication Systems, Inc\nCC:F3:C8\t\tVantiva USA LLC\nCC:F4:07\t\tEukrea Electromatique Sarl\nCC:F4:11\t\tGoogle, Inc.\nCC:F5:38\t\t3isysnetworks\nCC:F5:5F\t\tE Focus Instruments India Private Limited\nCC:F6:7A\t\tAyecka Communication Systems LTD\nCC:F7:35\t\tAmazon Technologies Inc.\nCC:F8:26\t\tSamsung Electronics Co.,Ltd\nCC:F8:41\t\tLumewave\nCC:F8:F0\t\tXi'an HISU Multimedia Technology Co.,Ltd.\nCC:F9:54\t\tAvaya Inc\nCC:F9:57\t\tu-blox AG\nCC:F9:E4\t\tIntel Corporate\nCC:F9:E8\t\tSamsung Electronics Co.,Ltd\nCC:F9:F0\t\tSamsung Electronics Co.,Ltd\nCC:FA:00\t\tLG Electronics (Mobile Communications)\nCC:FA:66\t\tHuawei Device Co., Ltd.\nCC:FA:F1\t\tSagemcom Broadband SAS\nCC:FB:65\t\tNintendo Co., Ltd.\nCC:FC:6D\t\tRiz Transmitters\nCC:FC:B1\t\tWireless Technology, Inc.\nCC:FD:17\t\tTCT mobile ltd\nCC:FE:3C\t\tSamsung Electronics Co.,Ltd\nCC:FF:90\t\tHuawei Device Co., Ltd.\nD0:03:4B\t\tApple, Inc.\nD0:03:DF\t\tSamsung Electronics Co.,Ltd\nD0:03:EB\t\tTexas Instruments\nD0:04:01\t\tMotorola Mobility LLC, a Lenovo Company\nD0:04:92\t\tFiberhome Telecommunication Technologies Co.,LTD\nD0:04:B0\t\tSamsung Electronics Co.,Ltd\nD0:05:2A\t\tArcadyan Corporation\nD0:05:E4\t\tHuawei Device Co., Ltd.\nD0:06:6A\t\tCornelis Networks, Inc.\nD0:07:90\t\tTexas Instruments\nD0:07:CA\t\tJuniper Networks\nD0:09:C8\t\tCisco Systems, Inc\nD0:09:F5\t\tHosiden Corporation\nD0:0A:AB\t\tYokogawa Digital Computer Corporation\nD0:0B:27\t\tMurata Manufacturing Co., Ltd.\nD0:0D:F7\t\tHuawei Device Co., Ltd.\nD0:0E:A4\t\tPorsche Cars North America\nD0:0E:D9\t\tTaicang T&W Electronics\nD0:0F:6D\t\tT&W Electronics Company\nD0:11:E5\t\tApple, Inc.\nD0:12:42\t\tBIOS Corporation\nD0:12:55\t\tHui Zhou Gaoshengda Technology Co.,LTD\nD0:12:CB\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\nD0:13:1E\t\tSunrex Technology Corp\nD0:13:FD\t\tLG Electronics (Mobile Communications)\nD0:14:11\t\tIEEE Registration Authority\nD0:14:11:00:00:00/28\tEkkoSense Ltd\nD0:14:11:10:00:00/28\tP.B. Elettronica srl\nD0:14:11:20:00:00/28\tEvoco Labs CO., LTD\nD0:14:11:30:00:00/28\tiLOQ Oy\nD0:14:11:40:00:00/28\tpowerall\nD0:14:11:50:00:00/28\tSuperlead\nD0:14:11:60:00:00/28\tAhnnet\nD0:14:11:70:00:00/28\tRealwave Inc.\nD0:14:11:80:00:00/28\tVideo Security, Inc.\nD0:14:11:90:00:00/28\tAirthings\nD0:14:11:A0:00:00/28\tAbb Evi Spa\nD0:14:11:B0:00:00/28\tCYLTek Limited\nD0:14:11:C0:00:00/28\tShen Zhen HaiHe Hi-Tech Co., Ltd\nD0:14:11:D0:00:00/28\tGuangdong Shiqi Manufacture Co., Ltd.\nD0:14:11:E0:00:00/28\tTecnosoft srl\nD0:15:4A\t\tzte corporation\nD0:15:A6\t\tHewlett Packard Enterprise\nD0:15:BB\t\tIEEE Registration Authority\nD0:15:BB:00:00:00/28\tFortune Marketing Private Limited\nD0:15:BB:10:00:00/28\tJiangsu Eastone Technology Co.,Ltd\nD0:15:BB:20:00:00/28\tBeijing Guangshu Zhiying Technology Development Co., Ltd.\nD0:15:BB:30:00:00/28\tTePS'EG\nD0:15:BB:40:00:00/28\tEsders GmbH\nD0:15:BB:50:00:00/28\tListen Technologies\nD0:15:BB:60:00:00/28\tShenZhen Zhongke GuanJie Data Technology Co.,Ltd.\nD0:15:BB:70:00:00/28\tNew Tech IoT\nD0:15:BB:80:00:00/28\tAlekto-Systems Ltd\nD0:15:BB:90:00:00/28\tStellar Blu Solutions\nD0:15:BB:A0:00:00/28\tHong Kong Cohonest Technology Limited\nD0:15:BB:B0:00:00/28\tEdgeDX\nD0:15:BB:C0:00:00/28\tShenzhen Waystar Communication Technology Co. Ltd.\nD0:15:BB:D0:00:00/28\tBluewaves Mobility Innovation Inc\nD0:15:BB:E0:00:00/28\tPhytec Embedded Pvt Ltd\nD0:16:7C\t\teero inc.\nD0:16:B4\t\tHuawei Technologies Co.,Ltd\nD0:16:F0\t\tIEEE Registration Authority\nD0:16:F0:00:00:00/28\tShenzhen Lesingle Technology CO., LTD.\nD0:16:F0:10:00:00/28\tQbic Communications Dmcc\nD0:16:F0:20:00:00/28\tRYSE Inc.\nD0:16:F0:30:00:00/28\tSofinet LLC\nD0:16:F0:40:00:00/28\tBeijing Xiaoyuan Wenhua Culture Communication Co., Ltd.\nD0:16:F0:50:00:00/28\twuxi high information Security Technolog\nD0:16:F0:60:00:00/28\tTornado Modular Systems\nD0:16:F0:70:00:00/28\tHydac Electronic\nD0:16:F0:80:00:00/28\tShenzhen DOOGEE Hengtong Technology CO.,LTD\nD0:16:F0:90:00:00/28\tCrystal Alarm AB\nD0:16:F0:A0:00:00/28\tOptitera Global Networks Private Limited\nD0:16:F0:B0:00:00/28\tworldcns inc.\nD0:16:F0:C0:00:00/28\tPeralex Electronics (Pty) Ltd\nD0:16:F0:D0:00:00/28\tTop Guard Technologies\nD0:16:F0:E0:00:00/28\tBBPOS Limited\nD0:17:69\t\tMurata Manufacturing Co., Ltd.\nD0:17:6A\t\tSamsung Electronics Co.,Ltd\nD0:17:C2\t\tASUSTek COMPUTER INC.\nD0:19:6A\t\tCiena Corporation\nD0:19:D3\t\tItel Mobile Limited\nD0:1A:A7\t\tUniPrint\nD0:1B:1F\t\tOhsung\nD0:1B:49\t\tSamsung Electronics Co.,Ltd\nD0:1B:BE\t\tOnward Brands\nD0:1B:F4\t\tSagemcom Broadband SAS\nD0:1C:3C\t\tTecno Mobile Limited\nD0:1C:BB\t\tBeijing Ctimes Digital Technology Co., Ltd.\nD0:1E:1D\t\tSaiNXT Technologies LLP\nD0:20:DD\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nD0:21:AC\t\tYohana\nD0:21:F9\t\tUbiquiti Inc\nD0:22:12\t\tIEEE Registration Authority\nD0:22:12:00:00:00/28\tSpirit IT B.V.\nD0:22:12:10:00:00/28\tAim\nD0:22:12:20:00:00/28\tRHENAC Systems GmbH\nD0:22:12:40:00:00/28\tViatron GmbH\nD0:22:12:50:00:00/28\tShanghai Routech Co., Ltd\nD0:22:12:60:00:00/28\tUrano Industria De Balancas E Equipamentos Ltda\nD0:22:12:70:00:00/28\tCliptech Industria e Comercio Ltda\nD0:22:12:80:00:00/28\tShenzhen SIC Technology. Co., Ltd.\nD0:22:12:90:00:00/28\tUab \"Salda\"\nD0:22:12:A0:00:00/28\tGNS-GmbH\nD0:22:12:B0:00:00/28\tSchleifenbauer Holding BV\nD0:22:12:C0:00:00/28\tXperio Labs Ltd.\nD0:22:12:D0:00:00/28\tShenzhen Zhongxi Security Co.,Ltd\nD0:22:12:E0:00:00/28\tu::Lux GmbH\nD0:22:12:F0:00:00/28\tPrivate\nD0:22:BE\t\tSamsung Electro-Mechanics(Thailand)\nD0:23:DB\t\tApple, Inc.\nD0:25:16\t\tMercury Communication Technologies Co.,Ltd.\nD0:25:44\t\tSamsung Electro-Mechanics(Thailand)\nD0:25:98\t\tApple, Inc.\nD0:27:88\t\tHon Hai Precision Ind. Co.,Ltd.\nD0:28:BA\t\tRealme Chongqing MobileTelecommunications Corp Ltd\nD0:2A:AA\t\tInfinix mobility limited\nD0:2B:20\t\tApple, Inc.\nD0:2C:45\t\tlittleBits Electronics, Inc.\nD0:2D:B3\t\tHuawei Technologies Co.,Ltd\nD0:2E:AB\t\tTexas Instruments\nD0:31:10\t\tIngenic Semiconductor Co.,Ltd\nD0:31:69\t\tSamsung Electronics Co.,Ltd\nD0:32:C3\t\tD-Link Corporation\nD0:33:11\t\tApple, Inc.\nD0:35:E5\t\tEM Microelectronic\nD0:37:42\t\tYulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd\nD0:37:45\t\tTp-Link Technologies Co.,Ltd.\nD0:37:61\t\tTexas Instruments\nD0:39:57\t\tLiteon Technology Corporation\nD0:39:72\t\tTexas Instruments\nD0:39:B3\t\tCommscope\nD0:39:EA\t\tNetApp\nD0:39:FA\t\tSamsung Electronics Co.,Ltd\nD0:3B:F4\t\tShenzhen Kean Digital Co.,Ltd\nD0:3C:1F\t\tIntel Corporate\nD0:3D:52\t\tAva Security Limited\nD0:3D:C3\t\tAQ Corporation\nD0:3E:07\t\tApple, Inc.\nD0:3E:5C\t\tHuawei Technologies Co.,Ltd\nD0:3E:7D\t\tChipsea Technologies (Shenzhen) Corp.\nD0:3F:27\t\tWyze Labs Inc\nD0:3F:AA\t\tApple, Inc.\nD0:40:BE\t\tNpo Rps Llc\nD0:40:EF\t\tMurata Manufacturing Co., Ltd.\nD0:41:C9\t\tFiberhome Telecommunication Technologies Co.,LTD\nD0:43:1E\t\tDell Inc.\nD0:44:33\t\tClourney Semiconductor\nD0:46:0C\t\tDell Inc.\nD0:46:DC\t\tSouthwest Research Institute\nD0:47:C1\t\tElma Electronic AG\nD0:48:4F\t\tNokia Solutions and Networks GmbH & Co. KG\nD0:48:A1\t\tJuniper Networks\nD0:48:F3\t\tDATTUS Inc\nD0:49:7C\t\tOnePlus Technology (Shenzhen) Co., Ltd\nD0:49:8B\t\tZoom Server\nD0:4C:C1\t\tSINTRONES Technology Corp.\nD0:4D:2C\t\tRoku, Inc.\nD0:4D:86\t\tApple, Inc.\nD0:4D:C6\t\tHewlett Packard Enterprise\nD0:4E:50\t\tMobiwire Mobiles (NingBo) Co., LTD\nD0:4E:99\t\tHuawei Technologies Co.,Ltd\nD0:4F:58\t\tRuckus Wireless\nD0:4F:7E\t\tApple, Inc.\nD0:4F:AB\t\tYoqu Technology (Shenzhen) Co., Ltd.\nD0:50:99\t\tASRock Incorporation\nD0:51:57\t\tLEAX Arkivator Telecom\nD0:51:62\t\tSony Corporation\nD0:52:A8\t\tPhysical Graph Corporation\nD0:53:49\t\tLiteon Technology Corporation\nD0:54:2D\t\tCambridge Industries(Group) Co.,Ltd.\nD0:54:75\t\tSAVI Controls\nD0:55:09\t\tNintendo Co.,Ltd\nD0:55:B2\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\nD0:56:BF\t\tAmosense\nD0:56:FB\t\tSamsung Electronics Co.,Ltd\nD0:57:4C\t\tCisco Systems, Inc\nD0:57:7B\t\tIntel Corporate\nD0:57:7E\t\tIntel Corporate\nD0:57:85\t\tPantech Co., Ltd.\nD0:57:94\t\tSagemcom Broadband SAS\nD0:57:A1\t\tWerma Signaltechnik GmbH & Co. KG\nD0:58:75\t\tActive Control Technology Inc.\nD0:58:A5\t\tApple, Inc.\nD0:58:A8\t\tzte corporation\nD0:58:AB\t\tMara Tech LLC\nD0:58:C0\t\tQingdao Haier Multimedia Limited.\nD0:58:FC\t\tSky Uk Limited\nD0:59:19\t\tzte corporation\nD0:59:95\t\tFiberhome Telecommunication Technologies Co.,LTD\nD0:59:C3\t\tCeraMicro Technology Corporation\nD0:59:E4\t\tSamsung Electronics Co.,Ltd\nD0:5A:00\t\tVantiva USA LLC\nD0:5A:0F\t\tI-Bt Digital Co.,Ltd\nD0:5A:F1\t\tShenzhen Pulier Tech CO.,Ltd\nD0:5A:FD\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nD0:5B:A8\t\tzte corporation\nD0:5B:CB\t\tTianyi Telecom Terminals Company Limited\nD0:5C:7A\t\tSartura d.o.o.\nD0:5F:64\t\tIEEE Registration Authority\nD0:5F:64:00:00:00/28\tDecathlon SA\nD0:5F:64:10:00:00/28\tHangzhou ToupTek Photonics Co., Ltd.\nD0:5F:64:20:00:00/28\tShanghai Zhongmi Communication Technology Co.,Ltd\nD0:5F:64:30:00:00/28\tHuaqin Telecom Hong Kong Ltd\nD0:5F:64:40:00:00/28\twallbe GmbH\nD0:5F:64:50:00:00/28\tAtoll Solutions Private Limited\nD0:5F:64:60:00:00/28\tCyrus Technology GmbH\nD0:5F:64:70:00:00/28\tBeijing Core Shield Group Co., Ltd.\nD0:5F:64:80:00:00/28\tTytoCare LTD.\nD0:5F:64:90:00:00/28\tShanghai Luying International Trade Co.,Ltd\nD0:5F:64:A0:00:00/28\tPartnerNET LTD\nD0:5F:64:B0:00:00/28\tNorth American Blue Tiger Company, LLC\nD0:5F:64:C0:00:00/28\tNanjing Huamai Technology Co.,Ltd\nD0:5F:64:D0:00:00/28\tShenzhen Canzone Technology Co.,Ltd.\nD0:5F:64:E0:00:00/28\tMontblanc-Simplo GmbH\nD0:5F:AF\t\tShenzhen C-Data Technology Co., Ltd.\nD0:5F:B8\t\tTexas Instruments\nD0:5F:CE\t\tHitachi Data Systems\nD0:60:8C\t\tzte corporation\nD0:61:58\t\tHuawei Technologies Co.,Ltd\nD0:62:2C\t\tXi'an Yipu Telecom Technology Co.,Ltd.\nD0:62:A0\t\tChina Essence Technology (Zhumadian) Co., Ltd.\nD0:63:4D\t\tMeiko Maschinenbau GmbH & Co. KG\nD0:63:B4\t\tSolidRun Ltd.\nD0:65:44\t\tApple, Inc.\nD0:65:78\t\tIntel Corporate\nD0:65:B3\t\tTCL King Electrical Appliances(Huizhou)Co.,Ltd\nD0:65:CA\t\tHuawei Technologies Co.,Ltd\nD0:66:6D\t\tShenzhen Bus-Lan Technology Co., Ltd.\nD0:66:7B\t\tSamsung Electronics Co.,Ltd\nD0:67:26\t\tHewlett Packard Enterprise\nD0:67:E5\t\tDell Inc.\nD0:69:9E\t\tLUMINEX Lighting Control Equipment\nD0:69:C1\t\tHuawei Technologies Co.,Ltd\nD0:69:D0\t\tVerto Medical Solutions, LLC\nD0:69:FF\t\tFiberhome Telecommunication Technologies Co.,LTD\nD0:6A:1F\t\tBse Co.,Ltd.\nD0:6B:78\t\tApple, Inc.\nD0:6C:37\t\tikeja wireless (pty) ltd\nD0:6D:C8\t\tHuawei Technologies Co.,Ltd\nD0:6D:C9\t\tSagemcom Broadband SAS\nD0:6E:DE\t\tSagemcom Broadband SAS\nD0:6F:4A\t\tTopwell International Holdings Limited\nD0:6F:82\t\tHuawei Technologies Co.,Ltd\nD0:71:C4\t\tzte corporation\nD0:72:DC\t\tCisco Systems, Inc\nD0:73:7F\t\tMini-Circuits\nD0:73:80\t\tHuawei Device Co., Ltd.\nD0:73:8E\t\tDong Oh Precision Co., Ltd.\nD0:73:D5\t\tLifi Labs Management Pty Ltd\nD0:75:BE\t\tReno A&E\nD0:76:02\t\tHui Zhou Gaoshengda Technology Co.,LTD\nD0:76:0C\t\tQisda Corporation\nD0:76:50\t\tIEEE Registration Authority\nD0:76:50:00:00:00/28\tCentrAlert, Inc.\nD0:76:50:10:00:00/28\tDaiken Automacao Ltda\nD0:76:50:20:00:00/28\tHappo Solutions Oy\nD0:76:50:30:00:00/28\tTAPKO Technologies GmbH\nD0:76:50:40:00:00/28\tPrivate\nD0:76:50:50:00:00/28\tAnnapurna Labs\nD0:76:50:60:00:00/28\tPicobrew LLC\nD0:76:50:70:00:00/28\tENCORED Technologies, Inc.\nD0:76:50:80:00:00/28\tAccumulate AB\nD0:76:50:90:00:00/28\tGreenwave Scientific\nD0:76:50:A0:00:00/28\tInventDesign\nD0:76:50:B0:00:00/28\tPelKorea\nD0:76:50:C0:00:00/28\tElectro-Motive Diesel\nD0:76:50:D0:00:00/28\ttecnotron elekronik gmbh\nD0:76:50:E0:00:00/28\tRevox Inc.\nD0:76:50:F0:00:00/28\tPrivate\nD0:76:8F\t\tCalix Inc.\nD0:76:E7\t\tTp-Link Technologies Co.,Ltd.\nD0:77:14\t\tMotorola Mobility LLC, a Lenovo Company\nD0:77:CE\t\tEdgecore Networks Corporation\nD0:78:80\t\tFiberhome Telecommunication Technologies Co.,LTD\nD0:78:9A\t\tVantiva - Connected Home\nD0:7A:B5\t\tHuawei Technologies Co.,Ltd\nD0:7B:6F\t\tZhuhai Yunmai Technology Co.,Ltd\nD0:7C:2D\t\tLeie IOT technology Co., Ltd\nD0:7C:B2\t\tSigmastar Technology Ltd.\nD0:7D:33\t\tHuawei Device Co., Ltd.\nD0:7D:E5\t\tForward Pay Systems, Inc.\nD0:7E:01\t\tHuawei Device Co., Ltd.\nD0:7E:28\t\tHewlett Packard\nD0:7E:35\t\tIntel Corporate\nD0:7F:A0\t\tSamsung Electronics Co.,Ltd\nD0:7F:C4\t\tOu Wei Technology Co.，Ltd. of Shenzhen City\nD0:81:7A\t\tApple, Inc.\nD0:81:C5\t\tJuniper Networks\nD0:83:D4\t\tXtel Wireless ApS\nD0:84:B0\t\tSagemcom Broadband SAS\nD0:85:43\t\tCisco Systems, Inc\nD0:87:B5\t\tSafemo Pte. Ltd.\nD0:87:E2\t\tSamsung Electronics Co.,Ltd\nD0:88:0C\t\tApple, Inc.\nD0:89:99\t\tAPCON, Inc.\nD0:8A:55\t\tSkullcandy\nD0:8A:91\t\tVantiva USA LLC\nD0:8B:7E\t\tPassif Semiconductor\nD0:8C:B5\t\tTexas Instruments\nD0:8C:FF\t\tUpwis Ab\nD0:8E:79\t\tDell Inc.\nD0:91:68\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\nD0:92:00\t\tFiRa Consortium\nD0:92:88\t\tPowertek Limited\nD0:92:9E\t\tMicrosoft Corporation\nD0:92:FA\t\tFiberhome Telecommunication Technologies Co.,LTD\nD0:93:80\t\tDucere Technologies Pvt. Ltd.\nD0:93:95\t\tIEEE Registration Authority\nD0:93:95:00:00:00/28\tZhejiang Ruiyi lntelligent Technology Co. Ltd\nD0:93:95:10:00:00/28\tHefei Siqiang Electronic Technology Co.,Ltd\nD0:93:95:20:00:00/28\tAt&T\nD0:93:95:30:00:00/28\tNesecure Telecom Pvt Ltd\nD0:93:95:40:00:00/28\tDaesung Celtic Enersys\nD0:93:95:50:00:00/28\tFungHwa i-Link Technology CO., LTD\nD0:93:95:60:00:00/28\tAnnapurna labs\nD0:93:95:70:00:00/28\tiSolution Technologies Co.,Ltd.\nD0:93:95:80:00:00/28\tAnnapurna labs\nD0:93:95:90:00:00/28\tNingbo Sunny Opotech Co.,Ltd\nD0:93:95:A0:00:00/28\tAutomatic Devices\nD0:93:95:B0:00:00/28\tInvendis Technologies India Pvt Ltd\nD0:93:95:C0:00:00/28\tBRICK4U GmbH\nD0:93:95:D0:00:00/28\tT-Com Llc\nD0:93:95:E0:00:00/28\tShenzhen Hotack Technology Co.,Ltd\nD0:93:F8\t\tStonestreet One LLC\nD0:94:66\t\tDell Inc.\nD0:94:CF\t\tHuawei Technologies Co.,Ltd\nD0:95:C7\t\tPantech Co., Ltd.\nD0:96:86\t\tIEEE Registration Authority\nD0:96:86:00:00:00/28\tSernet (Suzhou) Technologies Corporation\nD0:96:86:10:00:00/28\tProvcom Ltd\nD0:96:86:20:00:00/28\tTMLake Technology Ltd.,\nD0:96:86:30:00:00/28\tEphi B.V.\nD0:96:86:40:00:00/28\tHouston Radar LLC\nD0:96:86:50:00:00/28\tAnnapurna labs\nD0:96:86:60:00:00/28\tShenzhen Ntmer Technology Co., Ltd.\nD0:96:86:70:00:00/28\tPrivate\nD0:96:86:80:00:00/28\tEnergiekonzepte Deutschland GmbH\nD0:96:86:90:00:00/28\tCamfil\nD0:96:86:A0:00:00/28\tHero Health Inc.\nD0:96:86:B0:00:00/28\tChangsha keruijie lnformation Technology Co.,Ltd\nD0:96:86:C0:00:00/28\tECS s.r.l.\nD0:96:86:D0:00:00/28\tCertusNet Information Technology Co.,LTD\nD0:96:86:E0:00:00/28\twithnetworks\nD0:96:FB\t\tZhone Technologies, Inc.\nD0:97:FE\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nD0:98:9C\t\tConMet\nD0:99:D5\t\tAlcatel-Lucent\nD0:9B:05\t\tEmtronix\nD0:9C:30\t\tFoster Electric Company, Limited\nD0:9C:7A\t\tXiaomi Communications Co Ltd\nD0:9C:AE\t\tvivo Mobile Communication Co., Ltd.\nD0:9D:0A\t\tLinkcom\nD0:9D:AB\t\tTCT mobile ltd\nD0:9F:D9\t\tIEEE Registration Authority\nD0:9F:D9:00:00:00/28\tLemei Intelligent IOT (Shenzhen) Co., Ltd\nD0:9F:D9:10:00:00/28\telecgator bvba\nD0:9F:D9:20:00:00/28\tWestar Display Technologies\nD0:9F:D9:30:00:00/28\tGS Yuasa International Ltd.\nD0:9F:D9:40:00:00/28\tPoten (Shanghai) Technology Co.,Ltd.\nD0:9F:D9:50:00:00/28\tCarbon Mobile GmbH\nD0:9F:D9:60:00:00/28\tElevoc Technology Co., Ltd.\nD0:9F:D9:70:00:00/28\tRaymax Technology Ltd.\nD0:9F:D9:80:00:00/28\tQueclink Wireless Solutions Co., Ltd.\nD0:9F:D9:90:00:00/28\tENTTEC Pty Ltd.\nD0:9F:D9:A0:00:00/28\tEurolan Ltd\nD0:9F:D9:B0:00:00/28\tCablewireless Laboratory Co., Ltd\nD0:9F:D9:C0:00:00/28\tFujian Newland Auto-ID Tech. Co,.Ltd.\nD0:9F:D9:D0:00:00/28\tShenzhen eloT Technology Co.,Ltd\nD0:9F:D9:E0:00:00/28\tMinibems Ltd\nD0:A0:11\t\tIEEE Registration Authority\nD0:A0:11:00:00:00/28\tSionyx, Llc\nD0:A0:11:10:00:00/28\tShanghai Railway Communication Co. Ltd.\nD0:A0:11:20:00:00/28\tShanghai Hongqia Industry and Trade Co., LTD\nD0:A0:11:30:00:00/28\tV-Count Teknoloji A.Ş.\nD0:A0:11:40:00:00/28\tSumico\nD0:A0:11:50:00:00/28\tShenzhen DOOGEE Hengtong Technology CO.,LTD\nD0:A0:11:60:00:00/28\tOCEM Energy Technology\nD0:A0:11:70:00:00/28\tShenzhen Liandian Communication Technology Co.LTD\nD0:A0:11:80:00:00/28\tAnnapurna labs\nD0:A0:11:90:00:00/28\tVastai Technologies(Shanghai)Inc\nD0:A0:11:A0:00:00/28\tWuhan Tabebuia Technology Co.Ltd\nD0:A0:11:B0:00:00/28\tTYRI Sweden AB\nD0:A0:11:C0:00:00/28\tTASKA Prosthetics\nD0:A0:11:D0:00:00/28\tRemowireless Communication International Co.,Limited\nD0:A0:11:E0:00:00/28\tAnnapurna labs\nD0:A0:BB\t\tShenzhen iComm Semiconductor CO.,LTD\nD0:A0:D6\t\tChengDu TD Tech\nD0:A3:11\t\tNeuberger Gebäudeautomation GmbH\nD0:A4:6F\t\tChina Dragon Technology Limited\nD0:A4:B1\t\tSonifex Ltd.\nD0:A5:A6\t\tCisco Systems, Inc\nD0:A6:37\t\tApple, Inc.\nD0:A9:D3\t\tEM Microelectronic\nD0:AA:5F\t\tIEEE Registration Authority\nD0:AA:5F:00:00:00/28\tHangzhou Jingtang Communication Technology Co.,Ltd.\nD0:AA:5F:10:00:00/28\tXiaomi EV Technology Co., Ltd.\nD0:AA:5F:20:00:00/28\tACCEL LAB ltd.\nD0:AA:5F:30:00:00/28\tShenzhen Liandian Communication Technology Co.LTD\nD0:AA:5F:40:00:00/28\tKomer\nD0:AA:5F:50:00:00/28\t深圳麦源实业有限公司\nD0:AA:5F:60:00:00/28\tSordin Ab\nD0:AA:5F:70:00:00/28\tGD Midea Heating & Ventilating Equipment Co., Ltd\nD0:AA:5F:80:00:00/28\tWeBank Co., Ltd.\nD0:AA:5F:90:00:00/28\tHongci Monitor International Co., Ltd.\nD0:AA:5F:A0:00:00/28\tIndra Air Traffic Inc\nD0:AA:5F:B0:00:00/28\tWarner Electronics (I) Pvt. Ltd.\nD0:AA:5F:C0:00:00/28\tPacific Electronics\nD0:AA:5F:D0:00:00/28\tLevel Up Holding Co., Inc.\nD0:AA:5F:E0:00:00/28\tMBX International Ltd.\nD0:AB:4A\t\tTelink Micro LLC\nD0:AB:D5\t\tIntel Corporate\nD0:AD:08\t\tHP Inc.\nD0:AE:05\t\tXiaomi Communications Co Ltd\nD0:AE:EC\t\tAlpha Networks Inc.\nD0:AF:B6\t\tLinktop Technology Co., LTD\nD0:B0:CD\t\tMoen\nD0:B1:28\t\tSamsung Electronics Co.,Ltd\nD0:B1:CA\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nD0:B2:14\t\tPoeWit Inc\nD0:B2:70\t\tVisteon Portuguesa, Ltd\nD0:B2:C4\t\tVantiva USA LLC\nD0:B3:3F\t\tShenzhen TINNO Mobile Technology Corp.\nD0:B3:C2\t\tMeta Platforms, Inc.\nD0:B4:5D\t\tHuawei Device Co., Ltd.\nD0:B4:98\t\tRobert Bosch LLC Automotive Electronics\nD0:B5:23\t\tBestcare Cloucal Corp.\nD0:B5:3D\t\tSepro Robotique\nD0:B5:C2\t\tTexas Instruments\nD0:B6:0A\t\tXingluo Technology Company  Limited\nD0:B6:6F\t\tSernet (Suzhou) Technologies Corporation\nD0:BA:E4\t\tShanghai MXCHIP Information Technology Co., Ltd.\nD0:BB:61\t\tzte corporation\nD0:BB:80\t\tSHL Telemedicine International Ltd.\nD0:BC:C1\t\tWeifang Goertek Electronics Co.,Ltd\nD0:BD:01\t\tDS International\nD0:BE:2C\t\tCNSLink Co., Ltd.\nD0:BF:9C\t\tHewlett Packard\nD0:C0:50\t\tApple, Inc.\nD0:C0:BF\t\tActions Microelectronics\nD0:C1:93\t\tSkybell, Inc\nD0:C1:B1\t\tSamsung Electronics Co.,Ltd\nD0:C1:B5\t\tDell Inc.\nD0:C1:BF\t\tXiaomi Communications Co Ltd\nD0:C2:4E\t\tSamsung Electronics Co.,Ltd\nD0:C2:82\t\tCisco Systems, Inc\nD0:C3:1E\t\tJUNGJIN Electronics Co.,Ltd\nD0:C3:5A\t\tJabil Circuit de Chihuahua\nD0:C4:2F\t\tTamagawa Seiki Co.,Ltd.\nD0:C5:D3\t\tAzureWave Technology Inc.\nD0:C5:D8\t\tLatecoere\nD0:C5:F3\t\tApple, Inc.\nD0:C6:37\t\tIntel Corporate\nD0:C6:5B\t\tHuawei Technologies Co.,Ltd\nD0:C6:7F\t\tHuawei Technologies Co.,Ltd\nD0:C7:30\t\tzte corporation\nD0:C7:89\t\tCisco Systems, Inc\nD0:C7:C0\t\tTp-Link Technologies Co.,Ltd.\nD0:C8:57\t\tIEEE Registration Authority\nD0:C8:57:00:00:00/28\tYUAN High-Tech Development Co., Ltd.\nD0:C8:57:10:00:00/28\tDali A/S\nD0:C8:57:20:00:00/28\tForgamers Inc.\nD0:C8:57:30:00:00/28\tMobicon\nD0:C8:57:40:00:00/28\tImin Technology Pte Ltd\nD0:C8:57:50:00:00/28\tBeijing Inspiry Technology Co., Ltd.\nD0:C8:57:60:00:00/28\tInnovative Industrial(HK)Co., Limited\nD0:C8:57:70:00:00/28\tEco Mobile\nD0:C8:57:80:00:00/28\tNanjing Magewell Electronics Co.,Ltd\nD0:C8:57:90:00:00/28\tShenzhen xiaosha  Intelligence  Technology Co. Ltd\nD0:C8:57:A0:00:00/28\tshenzhen cnsun\nD0:C8:57:B0:00:00/28\tChunghsin International Electronics Co.,Ltd.\nD0:C8:57:C0:00:00/28\tDante Security Inc.\nD0:C8:57:D0:00:00/28\tIflytek Co.,Ltd.\nD0:C8:57:E0:00:00/28\tE-T-A Elektrotechnische Apparate GmbH\nD0:C9:01\t\tGla Electronics Pvt Ltd\nD0:C9:07\t\tPrivate\nD0:CB:DD\t\teero inc.\nD0:CD:E1\t\tScientech Electronics\nD0:CE:C0\t\tXiaomi Communications Co Ltd\nD0:CE:C9\t\tHan Chang\nD0:CF:0E\t\tSagemcom Broadband SAS\nD0:CF:13\t\tEspressif Inc.\nD0:CF:5E\t\tEnergy Micro AS\nD0:CF:D8\t\tHuizhou Boshijie Technology Co.,Ltd\nD0:D0:03\t\tSamsung Electronics Co.,Ltd\nD0:D0:4B\t\tHuawei Technologies Co.,Ltd\nD0:D0:FD\t\tCisco Systems, Inc\nD0:D2:12\t\tK2NET Co.,Ltd.\nD0:D2:3C\t\tApple, Inc.\nD0:D2:86\t\tBeckman Coulter K.K.\nD0:D2:B0\t\tApple, Inc.\nD0:D3:E0\t\tHewlett Packard Enterprise\nD0:D3:FC\t\tMios, Ltd.\nD0:D4:12\t\tADB Broadband Italia\nD0:D4:71\t\tMVTECH co., Ltd\nD0:D4:9F\t\tApple, Inc.\nD0:D6:CC\t\tWintop\nD0:D7:83\t\tHuawei Technologies Co.,Ltd\nD0:D7:BE\t\tHuawei Technologies Co.,Ltd\nD0:D9:4F\t\tIEEE Registration Authority\nD0:D9:4F:00:00:00/28\tPerfant Technology Co., Ltd\nD0:D9:4F:10:00:00/28\tmycable GmbH\nD0:D9:4F:20:00:00/28\tTeco Image Systems Co., Ltd.\nD0:D9:4F:30:00:00/28\tBeijing Yiwangxuntong Technology\nD0:D9:4F:40:00:00/28\tpeiker CEE\nD0:D9:4F:50:00:00/28\tOptigo Networks\nD0:D9:4F:60:00:00/28\tHyundai Autohow\nD0:D9:4F:70:00:00/28\tMitsubishi Electric US, Inc.\nD0:D9:4F:80:00:00/28\tApption Labs Limited\nD0:D9:4F:90:00:00/28\tHangzhou xiaoben technology co.,Ltd\nD0:D9:4F:A0:00:00/28\tShenzhen FDC Electuonic Co.,Ltd.\nD0:D9:4F:B0:00:00/28\tMAX Smart Home, LLC\nD0:D9:4F:C0:00:00/28\tArrowave Technologies Limited\nD0:D9:4F:D0:00:00/28\tDuksanmecasys Co., Ltd.\nD0:D9:4F:E0:00:00/28\tAppotronics Co., Ltd\nD0:DA:D7\t\tApple, Inc.\nD0:DB:32\t\tNokia Corporation\nD0:DB:B7\t\tCasa Systems\nD0:DC:2C\t\tCisco Systems, Inc\nD0:DD:49\t\tJuniper Networks\nD0:DD:7C\t\tzte corporation\nD0:DF:9A\t\tLiteon Technology Corporation\nD0:DF:B2\t\tGenie Networks Limited\nD0:DF:C7\t\tSamsung Electronics Co.,Ltd\nD0:E0:42\t\tCisco Systems, Inc\nD0:E1:40\t\tApple, Inc.\nD0:E3:47\t\tYoga\nD0:E4:0B\t\tWearable Inc.\nD0:E4:4A\t\tMurata Manufacturing Co., Ltd.\nD0:E5:4D\t\tCommscope\nD0:E5:81\t\tApple, Inc.\nD0:E7:82\t\tAzureWave Technology Inc.\nD0:E8:28\t\tRadiant Industries Incorporated\nD0:EB:03\t\tZhehua technology limited\nD0:EB:9E\t\tSeowoo Inc.\nD0:EC:35\t\tCisco Systems, Inc\nD0:ED:FF\t\tZf Cvcs\nD0:EE:47\t\tHitron Technologies. Inc\nD0:EF:76\t\tEspressif Inc.\nD0:EF:C1\t\tHuawei Technologies Co.,Ltd\nD0:F0:DB\t\tEricsson\nD0:F1:21\t\tXi'an LINKSCI Technology Co., Ltd\nD0:F2:7F\t\tBrewLogix, LLC\nD0:F3:F5\t\tHuawei Device Co., Ltd.\nD0:F4:05\t\tHon Hai Precision Industry Co., Ltd.\nD0:F4:F7\t\tHuawei Device Co., Ltd.\nD0:F5:20\t\tKYOCERA Corporation\nD0:F7:3B\t\tHelmut Mauell GmbH Werk Weida\nD0:F7:6E\t\tShenzhen YOUHUA Technology Co., Ltd\nD0:F8:65\t\tItel Mobile Limited\nD0:F8:8C\t\tMotorola (Wuhan) Mobility Technologies Communication Co., Ltd.\nD0:F8:E7\t\tShenzhen Shutong Space Technology Co., Ltd\nD0:F9:28\t\tzte corporation\nD0:F9:9B\t\tzte corporation\nD0:FA:1D\t\tQihoo  360  Technology Co.,Ltd\nD0:FC:CC\t\tSamsung Electronics Co.,Ltd\nD0:FC:D0\t\tHUMAX Co., Ltd.\nD0:FF:50\t\tTexas Instruments\nD0:FF:98\t\tHuawei Technologies Co.,Ltd\nD4:00:0D\t\tPhoenix Broadband Technologies, LLC.\nD4:00:57\t\tMC Technologies GmbH\nD4:00:68\t\tFiberhome Telecommunication Technologies Co.,LTD\nD4:00:CA\t\tContinental Automotive Systems S.R.L\nD4:01:29\t\tBroadcom\nD4:01:45\t\tAtw Technology, Inc.\nD4:01:6D\t\tTp-Link Technologies Co.,Ltd.\nD4:01:C3\t\tRouterboard.com\nD4:02:4A\t\tDelphian Systems LLC\nD4:04:CD\t\tCommscope\nD4:04:E6\t\tBroadcom Limited\nD4:04:FF\t\tJuniper Networks\nD4:05:98\t\tCommscope\nD4:05:DE\t\teero inc.\nD4:06:0F\t\tTexas Instruments\nD4:08:68\t\tBeijing Lanxum Computer Technology CO.,LTD.\nD4:0A:9E\t\tGO development GmbH\nD4:0A:A9\t\tCommscope\nD4:0A:DC\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\nD4:0B:1A\t\tHTC Corporation\nD4:0B:B9\t\tSolid Semecs bv.\nD4:0E:60\t\tNanjing phx-gctech Information Technology Co., Ltd\nD4:0F:9E\t\tApple, Inc.\nD4:0F:B2\t\tApplied Micro Electronics AME bv\nD4:10:90\t\tiNFORM Systems AG\nD4:10:CF\t\tHuanshun Network Science and Technology Co., Ltd.\nD4:11:A3\t\tSamsung Electronics Co.,Ltd\nD4:11:D6\t\tShotSpotter, Inc.\nD4:12:43\t\tAMPAK Technology, Inc.\nD4:12:96\t\tAnobit Technologies Ltd.\nD4:12:BB\t\tQuadrant Components Inc. Ltd\nD4:13:6F\t\tAsia Pacific Brands\nD4:13:B3\t\tWu Qi Technologies,Inc.\nD4:13:F8\t\tPeplink International Ltd.\nD4:17:61\t\tXiaomi Communications Co Ltd\nD4:19:72\t\tHewlett Packard Enterprise\nD4:19:F6\t\tNXP Semiconductor (Tianjin) LTD.\nD4:1A:3F\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nD4:1A:C8\t\tNippon Printer Engineering\nD4:1A:D1\t\tZyxel Communications Corporation\nD4:1B:81\t\tChongqing Fugui Electronics Co.,Ltd.\nD4:1C:1C\t\tRcf S.P.A.\nD4:1D:71\t\tPalo Alto Networks\nD4:1E:35\t\tTOHO Electronics INC.\nD4:1F:0C\t\tJAI Manufacturing\nD4:20:00\t\tIEEE Registration Authority\nD4:20:00:00:00:00/28\tWattsense\nD4:20:00:10:00:00/28\tZelus(HuangZhou) Technology Ltd.\nD4:20:00:20:00:00/28\tShenzhen AI Develop & Manufacture Co.,LTD.\nD4:20:00:30:00:00/28\tArbe Robotics Ltd.\nD4:20:00:40:00:00/28\tEVOC VIN Technology Co.,Ltd\nD4:20:00:50:00:00/28\tMonolith Electric?Changzhou?Co.,Ltd.\nD4:20:00:60:00:00/28\tHiAR Information Technology Co.,Ltd\nD4:20:00:70:00:00/28\tAnnapurna labs\nD4:20:00:80:00:00/28\tDalian Baishengyuan Technology Co.,Ltd\nD4:20:00:90:00:00/28\tWeathex Co., Ltd.\nD4:20:00:A0:00:00/28\tBirdDog Australia\nD4:20:00:B0:00:00/28\tShenzhen Volt IoT technology co.,ltd.\nD4:20:00:C0:00:00/28\tGentec Systems  Co.\nD4:20:00:D0:00:00/28\tZuum\nD4:20:00:E0:00:00/28\tRPUSI Communication Technology  Co.,Ltd.\nD4:20:6D\t\tHTC Corporation\nD4:20:B0\t\tMist Systems, Inc.\nD4:21:22\t\tSercomm Corporation.\nD4:22:3F\t\tLenovo Mobile Communication Technology Ltd.\nD4:22:4E\t\tAlcatel Lucent\nD4:22:CD\t\tMovella Technologies B.V.\nD4:24:93\t\tGW Technologies Co.,Ltd\nD4:24:DD\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\nD4:25:8B\t\tIntel Corporate\nD4:25:CC\t\tIEEE Registration Authority\nD4:25:CC:00:00:00/28\tNordi Telekommunikatsiooni Oü\nD4:25:CC:10:00:00/28\tEware Information Technology com.,Ltd\nD4:25:CC:20:00:00/28\tMusicLens Inc.\nD4:25:CC:30:00:00/28\tEISST Ltd\nD4:25:CC:40:00:00/28\tBarobo, Inc.\nD4:25:CC:50:00:00/28\tbvk technology\nD4:25:CC:60:00:00/28\tNanjing LES Information Technology Co., Ltd\nD4:25:CC:70:00:00/28\tBlueCats US, LLC\nD4:25:CC:80:00:00/28\tDolby Laboratories, Inc.\nD4:25:CC:90:00:00/28\tTakumi Japan Ltd\nD4:25:CC:A0:00:00/28\tE-MetroTel\nD4:25:CC:B0:00:00/28\tVeea\nD4:25:CC:C0:00:00/28\tPOSNET Polska S.A.\nD4:25:CC:D0:00:00/28\tCombined Energy Technologies Pty Ltd\nD4:25:CC:E0:00:00/28\tCoperion\nD4:27:51\t\tInfopia Co., Ltd\nD4:27:87\t\tShanghai High-Flying Electronics  Technology Co., Ltd\nD4:27:FF\t\tSagemcom Broadband SAS\nD4:28:B2\t\tioBridge, Inc.\nD4:28:D5\t\tTCT mobile ltd\nD4:29:A7\t\tInfinix mobility limited\nD4:29:EA\t\tZimory GmbH\nD4:2C:0F\t\tCommscope\nD4:2C:3D\t\tSky Light Digital Limited\nD4:2C:44\t\tCisco Systems, Inc\nD4:2C:46\t\tBuffalo.Inc\nD4:2D:C5\t\ti-PRO Co., Ltd.\nD4:2F:23\t\tAkenori PTE Ltd\nD4:2F:CA\t\tApple, Inc.\nD4:31:27\t\tRuijie Networks Co.,LTD\nD4:31:9D\t\tSinwatec\nD4:32:60\t\tGoPro\nD4:32:66\t\tFike Corporation\nD4:35:1D\t\tTechnicolor Delivery Technologies Belgium NV\nD4:35:38\t\tBeijing Xiaomi Mobile Software Co., Ltd\nD4:35:4A\t\tALAXALA Networks Corporation\nD4:36:39\t\tTexas Instruments\nD4:36:DB\t\tJiangsu Toppower Automotive Electronics Co., Ltd\nD4:37:D7\t\tzte corporation\nD4:38:44\t\tUnion Man Technology Co.,Ltd\nD4:38:9C\t\tSony Corporation\nD4:39:B8\t\tCiena Corporation\nD4:3A:2C\t\tGoogle, Inc.\nD4:3A:2E\t\tShenzhen Mtc Co Ltd\nD4:3A:2F\t\tShenzhen Mtc Co Ltd\nD4:3A:65\t\tIGRS Engineering Lab Ltd.\nD4:3A:E9\t\tDONGGUAN ipt INDUSTRIAL CO., LTD\nD4:3B:04\t\tIntel Corporate\nD4:3B:8A\t\tShenzhen Zhide technology Co., LTD\nD4:3D:39\t\tDialog Semiconductor\nD4:3D:67\t\tCarma Industries Inc.\nD4:3D:7E\t\tMicro-Star Int'l Co, Ltd\nD4:3D:F3\t\tZyxel Communications Corporation\nD4:3F:32\t\teero inc.\nD4:3F:CB\t\tCommscope\nD4:40:D0\t\tOCOSMOS Co., LTD\nD4:40:F0\t\tHuawei Technologies Co.,Ltd\nD4:41:3F\t\tGen IV Technology LLC\nD4:41:65\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nD4:43:0E\t\tZhejiang Dahua Technology Co., Ltd.\nD4:43:8A\t\tBeijing Xiaomi Mobile Software Co., Ltd\nD4:43:A8\t\tChangzhou Haojie Electric Co., Ltd.\nD4:45:E8\t\tJiangxi Hongpai Technology Co., Ltd.\nD4:46:49\t\tHuawei Technologies Co.,Ltd\nD4:46:E1\t\tApple, Inc.\nD4:47:5A\t\tScreenBeam, Inc.\nD4:48:2D\t\tShenzhen Deejoy Lighting Technology Co.,Ltd.\nD4:48:67\t\tSilicon Laboratories\nD4:4B:5E\t\tTaiyo Yuden Co., Ltd.\nD4:4B:B6\t\tZhejiang Tmall Technology Co., Ltd.\nD4:4C:24\t\tVuppalamritha Magnetic Components LTD\nD4:4C:9C\t\tShenzhen YOOBAO Technology Co.Ltd\nD4:4C:A7\t\tInformtekhnika & Communication, LLC\nD4:4D:77\t\tNokia\nD4:4D:9F\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nD4:4D:A4\t\tMurata Manufacturing Co., Ltd.\nD4:4F:67\t\tHuawei Technologies Co.,Ltd\nD4:4F:68\t\tEidetic Communications Inc\nD4:4F:80\t\tKemper Digital GmbH\nD4:50:3F\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nD4:50:7A\t\tCEIVA Logic, Inc\nD4:50:EE\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nD4:52:2A\t\tTangoWiFi.com\nD4:52:51\t\tIBT Ingenieurbureau Broennimann Thun\nD4:52:97\t\tnSTREAMS Technologies, Inc.\nD4:52:C7\t\tBeijing L&S Lancom Platform Tech. Co., Ltd.\nD4:52:EE\t\tSky Uk Limited\nD4:53:2A\t\tBeijing Xiaomi Mobile Software Co., Ltd\nD4:53:47\t\tMerytronic 2012, S.L.\nD4:53:83\t\tMurata Manufacturing Co., Ltd.\nD4:53:AF\t\tVIGO System S.A.\nD4:54:8B\t\tIntel Corporate\nD4:55:56\t\tFiber Mountain Inc.\nD4:55:BE\t\tShenzhen Fast Technologies Co.,Ltd\nD4:57:63\t\tApple, Inc.\nD4:58:00\t\tFiberhome Telecommunication Technologies Co.,LTD\nD4:59:44\t\ttonies GmbH\nD4:5A:3F\t\tJuniper Networks\nD4:5A:B2\t\tGalleon Systems\nD4:5B:51\t\tMotorola Mobility LLC, a Lenovo Company\nD4:5C:70\t\tWi-Fi Alliance\nD4:5D:42\t\tNokia Corporation\nD4:5D:64\t\tASUSTek COMPUTER INC.\nD4:5D:DF\t\tPegatron Corporation\nD4:5E:89\t\tMotorola Mobility LLC, a Lenovo Company\nD4:5E:EC\t\tBeijing Xiaomi Electronics Co., Ltd.\nD4:5F:25\t\tShenzhen YOUHUA Technology Co., Ltd\nD4:5F:2C\t\tzte corporation\nD4:5F:7A\t\tHuawei Technologies Co.,Ltd\nD4:60:75\t\tBaidu Online Network Technology (Beijing) Co., Ltd\nD4:60:E3\t\tSercomm Corporation.\nD4:61:2E\t\tHuawei Technologies Co.,Ltd\nD4:61:32\t\tPro Concept Manufacturer Co.,Ltd.\nD4:61:37\t\tIEEE Registration Authority\nD4:61:37:00:00:00/28\tWistron Corporation\nD4:61:37:10:00:00/28\tShenzhen smart-core technology co.,ltd.\nD4:61:37:20:00:00/28\tRobert Bosch Elektronikai Kft.\nD4:61:37:30:00:00/28\tAppotronics Co., Ltd\nD4:61:37:40:00:00/28\tBeijing TAIXINYUN Technology Co.,Ltd\nD4:61:37:50:00:00/28\tEstelle AB\nD4:61:37:60:00:00/28\tSecurus CCTV India\nD4:61:37:70:00:00/28\tBeijing Shudun Information Technology Co., Ltd\nD4:61:37:80:00:00/28\tBeijing Digital China Yunke Technology Limited\nD4:61:37:90:00:00/28\tMavenir Systems, Inc.\nD4:61:37:A0:00:00/28\tShenzhen Xunjie International Trade Co., LTD\nD4:61:37:B0:00:00/28\tKunPeng Instrument (Dalian)Co.,Ltd.\nD4:61:37:C0:00:00/28\tMusashi Engineering,Inc.\nD4:61:37:D0:00:00/28\tIptechview\nD4:61:37:E0:00:00/28\tUAB Brolis sensor technology\nD4:61:95\t\tzte corporation\nD4:61:9D\t\tApple, Inc.\nD4:61:DA\t\tApple, Inc.\nD4:61:FE\t\tHangzhou H3C Technologies Co., Limited\nD4:62:EA\t\tHuawei Technologies Co.,Ltd\nD4:63:52\t\tVutility Inc.\nD4:63:C0\t\tApple, Inc.\nD4:63:C6\t\tMotorola Mobility LLC, a Lenovo Company\nD4:63:DE\t\tvivo Mobile Communication Co., Ltd.\nD4:63:FE\t\tArcadyan Corporation\nD4:64:F7\t\tChengdu Usee Digital Technology Co., Ltd\nD4:66:24\t\tCisco Systems, Inc\nD4:66:A8\t\tRiedo Networks Ltd\nD4:67:61\t\tXonTel Technology Co.\nD4:67:D3\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nD4:67:E7\t\tFiberhome Telecommunication Technologies Co.,LTD\nD4:68:4D\t\tRuckus Wireless\nD4:68:67\t\tNeoventus Design Group\nD4:68:AA\t\tApple, Inc.\nD4:68:BA\t\tShenzhen Sundray Technologies company Limited\nD4:69:A5\t\tMiura Systems Ltd.\nD4:6A:35\t\tCisco Systems, Inc\nD4:6A:6A\t\tHon Hai Precision Ind. Co.,Ltd.\nD4:6A:91\t\tSnapAV\nD4:6A:A8\t\tHuawei Technologies Co.,Ltd\nD4:6B:A6\t\tHuawei Technologies Co.,Ltd\nD4:6C:62\t\tMultiTracks.com, LLC\nD4:6C:6D\t\tCommscope\nD4:6C:BF\t\tGoodrich ISR\nD4:6C:DA\t\tCSM GmbH\nD4:6D:50\t\tCisco Systems, Inc\nD4:6D:6D\t\tIntel Corporate\nD4:6E:0E\t\tTp-Link Technologies Co.,Ltd.\nD4:6E:5C\t\tHuawei Technologies Co.,Ltd\nD4:6F:42\t\tWAXESS USA Inc\nD4:72:08\t\tBragi GmbH\nD4:72:26\t\tzte corporation\nD4:73:50\t\tDBG Commnunications Technology  Co., Ltd.\nD4:74:15\t\tHuawei Device Co., Ltd.\nD4:74:1B\t\tBeijing HuaDa ZhiBao Electronic System Co.,Ltd.\nD4:76:A0\t\tFortinet, Inc.\nD4:76:EA\t\tzte corporation\nD4:77:2B\t\tNanjing Ztlink Network Technology Co.,Ltd\nD4:77:98\t\tCisco Systems, Inc\nD4:77:B2\t\tNetix Global B.V.\nD4:78:56\t\tAvaya Inc\nD4:78:9B\t\tCisco Systems, Inc\nD4:79:54\t\tHuawei Device Co., Ltd.\nD4:79:C3\t\tCameronet GmbH & Co. KG\nD4:7A:E2\t\tSamsung Electronics Co.,Ltd\nD4:7A:EC\t\tFunshion Online Technologies Co.,Ltd\nD4:7B:35\t\tNEO Monitors AS\nD4:7B:6B\t\tShanghai Cygnus Semiconductor Co., Ltd.\nD4:7B:75\t\tHARTING Electronics GmbH\nD4:7B:B0\t\tAskey Computer Corp\nD4:7C:44\t\tIEEE Registration Authority\nD4:7C:44:00:00:00/28\tExafore Oy\nD4:7C:44:10:00:00/28\tInnoviz Technologies LTD\nD4:7C:44:20:00:00/28\tYunDing Network Technology (Beijing) Co., Ltd\nD4:7C:44:30:00:00/28\tOmron Sentech Co., Ltd.\nD4:7C:44:40:00:00/28\tSammi Onformation Systems\nD4:7C:44:50:00:00/28\tLS Communication Co.,Ltd.\nD4:7C:44:60:00:00/28\tASDA ICT Co., Ltd.\nD4:7C:44:70:00:00/28\tPongee Industries Co., Ltd.\nD4:7C:44:80:00:00/28\tBeijing Maystar Information Technology Co., Ltd.\nD4:7C:44:90:00:00/28\tSuzhou Wan Dian Zhang Network Technology Co., Ltd\nD4:7C:44:A0:00:00/28\tTendzone International Pte Ltd\nD4:7C:44:B0:00:00/28\tOPTiM Corporation\nD4:7C:44:C0:00:00/28\tStrive Orthopedics Inc\nD4:7C:44:D0:00:00/28\tHuaqin Telecom Technology Co.,Ltd.\nD4:7C:44:E0:00:00/28\tShenzhen Anysec Technology Co. Ltd\nD4:7D:FC\t\tTecno Mobile Limited\nD4:7E:E4\t\tChina Mobile IOT Company Limited\nD4:7F:35\t\tCisco Systems, Inc\nD4:7F:78\t\tDopple B.V.\nD4:80:8B\t\tSeiko Epson Corporation\nD4:81:CA\t\tiDevices, LLC\nD4:81:D7\t\tDell Inc.\nD4:82:3E\t\tArgosy Technologies, Ltd.\nD4:83:04\t\tShenzhen Fast Technologies Co.,Ltd\nD4:84:09\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\nD4:84:57\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nD4:84:D0\t\tShanghai Xiaodu Technology Limited\nD4:85:64\t\tHewlett Packard\nD4:86:60\t\tArcadyan Corporation\nD4:87:CC\t\tSivantos GmbH\nD4:87:D8\t\tSamsung Electronics Co.,Ltd\nD4:88:3F\t\tHdpro Co., Ltd.\nD4:88:66\t\tHuawei Technologies Co.,Ltd\nD4:88:90\t\tSamsung Electronics Co.,Ltd\nD4:8A:39\t\tSamsung Electronics Co.,Ltd\nD4:8A:3B\t\tHunan Fn-Link Technology Limited\nD4:8A:FC\t\tEspressif Inc.\nD4:8C:49\t\tEspressif Inc.\nD4:8C:B5\t\tCisco Systems, Inc\nD4:8D:26\t\tLG Innotek\nD4:8D:D9\t\tMeld Technology, Inc\nD4:8F:33\t\tMicrosoft Corporation\nD4:8F:A2\t\tHuawei Device Co., Ltd.\nD4:8F:AA\t\tSogecam Industrial, S.A.\nD4:90:9C\t\tApple, Inc.\nD4:90:E0\t\tWachendorff Automation GmbH & CO.KG\nD4:91:0F\t\tAmazon Technologies Inc.\nD4:91:AF\t\tElectroacustica General Iberica, S.A.\nD4:92:34\t\tNEC Corporation\nD4:92:5E\t\tTechnicolor Delivery Technologies Belgium NV\nD4:92:B9\t\tOrion Nova, S.L.\nD4:93:90\t\tClevo Co.\nD4:93:98\t\tNokia Corporation\nD4:93:A0\t\tFidelix Oy\nD4:94:00\t\tHuawei Technologies Co.,Ltd\nD4:94:5A\t\tCosmo Co., Ltd\nD4:94:A1\t\tTexas Instruments\nD4:94:E8\t\tHuawei Technologies Co.,Ltd\nD4:94:FB\t\tContinental Automotive Systems Inc.\nD4:95:24\t\tClover Network, Inc.\nD4:95:5D\t\tzte corporation\nD4:95:8E\t\tUniversal Electronics, Inc.\nD4:96:DF\t\tSungjin C&T Co.,Ltd\nD4:97:0B\t\tXiaomi Communications Co Ltd\nD4:98:B9\t\tvivo Mobile Communication Co., Ltd.\nD4:99:6C\t\tJuniper Networks\nD4:9A:20\t\tApple, Inc.\nD4:9A:A0\t\tVnpt Technology\nD4:9A:F6\t\tAzureWave Technology Inc.\nD4:9B:5C\t\tChongqing Miedu Technology Co., Ltd.\nD4:9B:74\t\tKinetic Technologies\nD4:9C:28\t\tJayBird LLC\nD4:9C:53\t\tNetcraze Llc\nD4:9C:8E\t\tUniversity of FUKUI\nD4:9C:DD\t\tAMPAK Technology,Inc.\nD4:9C:F4\t\tPalo Alto Networks\nD4:9D:9D\t\tShenzhen Goodocom lnformation Technology Co.,Ltd.\nD4:9D:C0\t\tSamsung Electronics Co.,Ltd\nD4:9E:05\t\tzte corporation\nD4:9E:3B\t\tGuangzhou Shiyuan Electronic Technology Company Limited\nD4:9E:6D\t\tWuhan Zhongyuan Huadian Science & Technology Co.,\nD4:9F:DD\t\tHuawei Device Co., Ltd.\nD4:A0:2A\t\tCisco Systems, Inc\nD4:A0:FB\t\tIEEE Registration Authority\nD4:A0:FB:00:00:00/28\tM2MD Technologies, Inc.\nD4:A0:FB:10:00:00/28\tIntersvyaz IT\nD4:A0:FB:20:00:00/28\tBeijing Lingji Innovations technology Co,LTD.\nD4:A0:FB:30:00:00/28\tNexxus Networks India Private Limited\nD4:A0:FB:40:00:00/28\tShenzhen Dijiean Technology Co., Ltd\nD4:A0:FB:50:00:00/28\tCorelase Oy\nD4:A0:FB:60:00:00/28\tHuizhou Jiemeisi Technology Co.,Ltd.\nD4:A0:FB:70:00:00/28\tSkyfri Corp\nD4:A0:FB:80:00:00/28\tParpro System Corporation\nD4:A0:FB:90:00:00/28\tHangteng (HK) Technology Co., Limited\nD4:A0:FB:A0:00:00/28\tImpulse Cctv Networks India Pvt. Ltd.\nD4:A0:FB:B0:00:00/28\tSpatial Hover  Inc\nD4:A0:FB:C0:00:00/28\tSnap-on Tools\nD4:A0:FB:D0:00:00/28\tFastwel Electronics India Private Limited\nD4:A0:FB:E0:00:00/28\tGtek Global Co.,Ltd\nD4:A1:48\t\tHuawei Technologies Co.,Ltd\nD4:A2:3D\t\tNew H3C Technologies Co., Ltd\nD4:A2:CD\t\tDell Inc.\nD4:A3:3D\t\tApple, Inc.\nD4:A3:65\t\tXiaomi Communications Co Ltd\nD4:A3:8B\t\tEle(Group)Co.,Ltd\nD4:A3:EB\t\tShenzhen iComm Semiconductor CO.,LTD\nD4:A4:25\t\tSMAX Technology Co., Ltd.\nD4:A4:99\t\tInView Technology Corporation\nD4:A5:B4\t\tHengji Jiaye (Hangzhou) Technology Co., Ltd\nD4:A6:51\t\tTuya Smart Inc.\nD4:A9:23\t\tHuawei Technologies Co.,Ltd\nD4:A9:28\t\tGreenWave Reality Inc\nD4:AA:FF\t\tMicro World\nD4:AB:61\t\tIntel Corporate\nD4:AB:82\t\tCommscope\nD4:AB:CD\t\tHui Zhou Gaoshengda Technology Co.,LTD\nD4:AC:4E\t\tBODi rS, LLC\nD4:AD:20\t\tJinan USR IOT Technology Limited\nD4:AD:2D\t\tFiberhome Telecommunication Technologies Co.,LTD\nD4:AD:71\t\tCisco Systems, Inc\nD4:AD:BD\t\tCisco Systems, Inc\nD4:AD:FC\t\tShenzhen Intellirocks Tech. Co. Ltd.\nD4:AE:05\t\tSamsung Electronics Co.,Ltd\nD4:AE:52\t\tDell Inc.\nD4:AF:F7\t\tArista Networks\nD4:B1:10\t\tHuawei Technologies Co.,Ltd\nD4:B1:69\t\tLe Shi Zhi Xin Electronic Technology (Tianjin) Limited\nD4:B2:7A\t\tCommscope\nD4:B4:3E\t\tMesscomp Datentechnik GmbH\nD4:B4:C0\t\tFortinet, Inc.\nD4:B5:CD\t\tSagemcom Broadband SAS\nD4:B6:80\t\tShanghai Linkyum Microeletronics Co.,Ltd\nD4:B7:09\t\tzte corporation\nD4:B7:61\t\tSichuan AI-Link Technology Co., Ltd.\nD4:B7:D0\t\tCiena Corporation\nD4:B8:FF\t\tHome Control Singapore Pte Ltd\nD4:B9:2F\t\tVantiva USA LLC\nD4:BA:BA\t\tIEEE Registration Authority\nD4:BA:BA:00:00:00/28\tShenzhen Action Technologies Co., Ltd.\nD4:BA:BA:10:00:00/28\tAnnapurna labs\nD4:BA:BA:20:00:00/28\tGuangZhou Ostec Electronic Technology Co.,Limited\nD4:BA:BA:30:00:00/28\tShenzhen Pu Ying Innovation Technology Corporation Limited\nD4:BA:BA:40:00:00/28\tBeijing Yuanxin Junsheng Technology Co.,ltd\nD4:BA:BA:50:00:00/28\tReeR SpA\nD4:BA:BA:60:00:00/28\tShenzhen Yueer Innovation Technology Co., Ltd\nD4:BA:BA:70:00:00/28\tShenzhen Double Better Technology Co., Ltd\nD4:BA:BA:80:00:00/28\tChengdu Ba SAN SI YI Information Technology Co., LTD\nD4:BA:BA:90:00:00/28\tShenzhen Chuangyou Acoustic Technology Co., Ltd.\nD4:BA:BA:A0:00:00/28\tActiontec Electronics Inc.\nD4:BA:BA:B0:00:00/28\tQingdao Vzense Technology Co., Ltd.\nD4:BA:BA:C0:00:00/28\tRusatom Automated Control Systems, Joint-Stock Company\nD4:BA:BA:D0:00:00/28\tAADONA Communication Pvt Ltd\nD4:BA:BA:E0:00:00/28\tCamozzi Automation SpA\nD4:BA:FA\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nD4:BB:C8\t\tvivo Mobile Communication Co., Ltd.\nD4:BB:E6\t\tHuawei Device Co., Ltd.\nD4:BD:1E\t\t5VT Technologies,Taiwan LTd.\nD4:BD:4F\t\tRuckus Wireless\nD4:BE:D9\t\tDell Inc.\nD4:BE:DC\t\tRoku, Inc\nD4:BF:2D\t\tSE Controls Asia Pacific Ltd\nD4:BF:7F\t\tUpvel\nD4:C1:9E\t\tRuckus Wireless\nD4:C1:C8\t\tzte corporation\nD4:C1:FC\t\tNokia Corporation\nD4:C3:B0\t\tGearlinx Pty Ltd\nD4:C7:66\t\tAcentic GmbH\nD4:C8:B0\t\tPrime Electronics & Satellitics Inc.\nD4:C9:3C\t\tCisco Systems, Inc\nD4:C9:4B\t\tMotorola Mobility LLC, a Lenovo Company\nD4:C9:B2\t\tQuanergy Solutions Inc\nD4:C9:EF\t\tHewlett Packard\nD4:CA:6D\t\tRouterboard.com\nD4:CA:6E\t\tu-blox AG\nD4:CB:AF\t\tNokia Corporation\nD4:CB:CC\t\tvivo Mobile Communication Co., Ltd.\nD4:CE:B8\t\tEnatel LTD\nD4:CF:37\t\tSymbolic IO\nD4:CF:F9\t\tShenzhen SEI Robotics Co.,Ltd\nD4:D1:84\t\tADB Broadband Italia\nD4:D2:49\t\tPower Ethernet\nD4:D2:52\t\tIntel Corporate\nD4:D2:D6\t\tFn-Link Technology Limited\nD4:D2:E5\t\tBKAV Corporation\nD4:D4:DA\t\tEspressif Inc.\nD4:D5:0D\t\tSouthwest Microwave, Inc\nD4:D5:1B\t\tHuawei Technologies Co.,Ltd\nD4:D6:59\t\tMeta Platforms, Inc.\nD4:D7:48\t\tCisco Systems, Inc\nD4:D7:A9\t\tShanghai Kaixiang Info Tech LTD\nD4:D7:CF\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nD4:D8:53\t\tIntel Corporate\nD4:D8:92\t\tHuawei Technologies Co.,Ltd\nD4:D8:98\t\tKorea CNO Tech Co., Ltd\nD4:D9:19\t\tGoPro\nD4:DA:21\t\tBeijing Xiaomi Mobile Software Co., Ltd\nD4:DA:CD\t\tSky Uk Limited\nD4:DC:09\t\tMist Systems, Inc.\nD4:DC:85\t\tEdgecore Americas Networking Corporation\nD4:DC:CD\t\tApple, Inc.\nD4:DD:0B\t\tWavetel Technology Limited\nD4:DF:57\t\tAlpinion Medical Systems\nD4:E0:53\t\tHewlett Packard Enterprise\nD4:E0:8E\t\tValueHD Corporation\nD4:E2:2F\t\tRoku, Inc\nD4:E2:CB\t\tVantiva USA LLC\nD4:E3:2C\t\tS. Siedle & Sohne\nD4:E3:3F\t\tNokia\nD4:E3:C5\t\tzte corporation\nD4:E4:C3\t\tCiena Corporation\nD4:E5:C9\t\tSenao Networks Inc.\nD4:E6:B7\t\tSamsung Electronics Co.,Ltd\nD4:E8:53\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nD4:E8:80\t\tCisco Systems, Inc\nD4:E8:B2\t\tSamsung Electronics Co.,Ltd\nD4:E9:0B\t\tCvt Co.,Ltd\nD4:E9:5E\t\tTexas Instruments\nD4:E9:8A\t\tIntel Corporate\nD4:EA:0E\t\tAvaya Inc\nD4:EB:68\t\tCisco Systems, Inc\nD4:EC:0C\t\tHarley-Davidson Motor Company\nD4:EC:86\t\tLinkedHope Intelligent Technologies Co., Ltd\nD4:EC:AB\t\tvivo Mobile Communication Co., Ltd.\nD4:EE:07\t\tHIWIFI Co., Ltd.\nD4:EE:DE\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nD4:F0:27\t\tTrust Power Ltd.\nD4:F0:4A\t\tSky Uk Limited\nD4:F0:57\t\tNintendo Co.,Ltd\nD4:F0:B4\t\tNapco Security Technologies\nD4:F0:C9\t\tKYOCERA Document Solutions Inc.\nD4:F0:EA\t\tBeijing Xiaomi Mobile Software Co., Ltd\nD4:F1:43\t\tIPROAD.,Inc\nD4:F2:07\t\tDIAODIAO(Beijing)Technology CO.,Ltd\nD4:F2:42\t\tHuawei Device Co., Ltd.\nD4:F3:2D\t\tIntel Corporate\nD4:F3:37\t\tXunison Ltd.\nD4:F4:6F\t\tApple, Inc.\nD4:F4:BE\t\tPalo Alto Networks\nD4:F5:13\t\tTexas Instruments\nD4:F5:27\t\tSiemens Ag\nD4:F5:47\t\tGoogle, Inc.\nD4:F5:EF\t\tHewlett Packard Enterprise\nD4:F6:3F\t\tIea S.R.L.\nD4:F7:56\t\tzte corporation\nD4:F7:86\t\tFiberhome Telecommunication Technologies Co.,LTD\nD4:F7:D5\t\tSony Interactive Entertainment Inc.\nD4:F8:29\t\tSagemcom Broadband SAS\nD4:F9:21\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\nD4:F9:8D\t\tEspressif Inc.\nD4:F9:A1\t\tHuawei Technologies Co.,Ltd\nD4:FB:8E\t\tApple, Inc.\nD4:FC:13\t\tFiberhome Telecommunication Technologies Co.,LTD\nD4:FE:28\t\tSilicon Laboratories\nD4:FF:26\t\tOhsung\nD8:00:4D\t\tApple, Inc.\nD8:00:93\t\tAurender Inc.\nD8:01:D0\t\tHuawei Technologies Co.,Ltd\nD8:01:EB\t\tInfinity Electronics Ltd\nD8:02:8A\t\tShenzhen YOUHUA Technology Co., Ltd\nD8:02:C0\t\tExtreme Networks Headquarters\nD8:03:1A\t\tLaird Connectivity\nD8:03:2A\t\tCommtact Ltd\nD8:05:2E\t\tSkyviia Corporation\nD8:06:D1\t\tHoneywell Fire System (Shanghai) Co,. Ltd.\nD8:06:F3\t\tArista Networks\nD8:07:B6\t\tTp-Link Technologies Co.,Ltd.\nD8:08:31\t\tSamsung Electronics Co.,Ltd\nD8:08:F5\t\tArcadia Networks Co. Ltd.\nD8:09:4E\t\tActive Brains\nD8:09:7F\t\tzte corporation\nD8:09:C3\t\tCercacor Labs\nD8:09:D6\t\tZexelon Co., Ltd.\nD8:0A:42\t\tShanghai Lixun Information Technology Co., Ltd.\nD8:0A:60\t\tHuawei Technologies Co.,Ltd\nD8:0A:E6\t\tzte corporation\nD8:0B:9A\t\tSamsung Electronics Co.,Ltd\nD8:0B:CB\t\tTelink Semiconductor (Shanghai) Co., Ltd.\nD8:0C:CF\t\tC.G.V. S.A.S.\nD8:0D:17\t\tTp-Link Technologies Co.,Ltd.\nD8:0D:E3\t\tFxi Technologies As\nD8:0E:29\t\tvivo Mobile Communication Co., Ltd.\nD8:0F:99\t\tHon Hai Precision Ind. Co.,Ltd.\nD8:0F:B5\t\tShenzhen Ultraeasy Technology Co Ltd\nD8:10:68\t\tMurata Manufacturing Co., Ltd.\nD8:10:9F\t\tHuawei Technologies Co.,Ltd\nD8:10:CB\t\tAndrea Informatique\nD8:12:65\t\tChongqing Fugui Electronics Co.,Ltd.\nD8:13:2A\t\tEspressif Inc.\nD8:13:99\t\tHui Zhou Gaoshengda Technology Co.,LTD\nD8:14:D6\t\tSURE SYSTEM Co Ltd\nD8:14:DF\t\tTCL King Electrical Appliances (Huizhou) Co., Ltd\nD8:15:0D\t\tTp-Link Technologies Co.,Ltd.\nD8:16:0A\t\tNippon Electro-Sensory Devices\nD8:16:C1\t\tDewav (Hk) Electronics Limited\nD8:18:2B\t\tConti Temic Microelectronic GmbH\nD8:18:D3\t\tJuniper Networks\nD8:19:09\t\tWiwynn Technology Service Malaysia\nD8:19:7A\t\tNuheara Ltd\nD8:19:CE\t\tTelesquare\nD8:1B:B5\t\tHuawei Technologies Co.,Ltd\nD8:1B:FE\t\tTwinlinx Corporation\nD8:1C:14\t\tCompacta International, Ltd.\nD8:1C:79\t\tApple, Inc.\nD8:1D:72\t\tApple, Inc.\nD8:1E:DD\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nD8:1E:DE\t\tB&W Group Ltd\nD8:1F:12\t\tTuya Smart Inc.\nD8:1F:65\t\tPrivate\nD8:1F:CC\t\tBrocade Communications Systems LLC\nD8:20:9F\t\tCubro Acronet GesmbH\nD8:20:A2\t\tHuawei Technologies Co.,Ltd\nD8:21:DA\t\tSernet (Suzhou) Technologies Corporation\nD8:22:F4\t\tAvnet Silica\nD8:23:E0\t\tSpeedtech Corp.\nD8:24:77\t\tUniversal Electric Corporation\nD8:24:BD\t\tCisco Systems, Inc\nD8:24:EC\t\tPlenom A/S\nD8:25:22\t\tCommscope\nD8:25:B0\t\tRockeetech Systems Co.,Ltd.\nD8:25:DF\t\tCame Uk\nD8:26:B9\t\tGuangdong Coagent Electronics S&T Co.,Ltd.\nD8:26:FA\t\tJiangxi Zhentian Technology CO.,LTD\nD8:27:0C\t\tMaxTronic International Co., Ltd.\nD8:28:C9\t\tGeneral Electric Consumer and Industrial\nD8:29:16\t\tAscent Communication Technology\nD8:29:18\t\tHuawei Technologies Co.,Ltd\nD8:29:86\t\tBest Wish Technology LTD\nD8:29:F8\t\tHuawei Technologies Co.,Ltd\nD8:2A:15\t\tLeitner SpA\nD8:2A:7E\t\tNokia Corporation\nD8:2D:40\t\tJanz - Contagem e Gestão de Fluídos S.A.\nD8:2D:9B\t\tShenzhen G.Credit Communication Technology Co., Ltd\nD8:2D:E1\t\tTricascade Inc.\nD8:2F:E6\t\tZhejiang Tmall Technology Co., Ltd.\nD8:30:62\t\tApple, Inc.\nD8:31:2C\t\tzte corporation\nD8:31:34\t\tRoku, Inc\nD8:31:CF\t\tSamsung Electronics Co.,Ltd\nD8:32:14\t\tTenda Technology Co.,Ltd.Dongguan branch\nD8:32:5A\t\tShenzhen YOUHUA Technology Co., Ltd\nD8:32:E3\t\tXiaomi Communications Co Ltd\nD8:33:7F\t\tOffice FA.com Co.,Ltd.\nD8:33:B7\t\tSagemcom Broadband SAS\nD8:34:1C\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nD8:34:D1\t\tShenzhen Orange Digital Technology Co.,Ltd\nD8:34:EE\t\tShure Incorporated\nD8:36:5F\t\tIntelbras\nD8:37:3B\t\tShenzhen Jingxun Software Telecommunication Technology Co.,Ltd\nD8:37:BE\t\tShenzhen Gongjin Electronics Co.,Lt\nD8:38:0D\t\tSHENZHEN IP-COM Network Co.,Ltd\nD8:38:FC\t\tRuckus Wireless\nD8:3A:DD\t\tRaspberry Pi Trading Ltd\nD8:3A:F5\t\tWideband Labs LLC\nD8:3B:BF\t\tIntel Corporate\nD8:3B:DA\t\tEspressif Inc.\nD8:3C:69\t\tShenzhen TINNO Mobile Technology Corp.\nD8:3D:3F\t\tJOYNED GmbH\nD8:3D:CC\t\tshenzhen UDD Technologies,co.,Ltd\nD8:3E:EF\t\tCoosea Group (Hk) Company Limited\nD8:40:08\t\tHuawei Technologies Co.,Ltd\nD8:42:AC\t\tShanghai Feixun Communication Co.,Ltd.\nD8:42:E2\t\tCanary Connect, Inc.\nD8:42:F7\t\tTozed Kangwei Tech Co.,Ltd\nD8:43:AE\t\tMicro-Star INTL CO., LTD.\nD8:43:EA\t\tSY Electronics Ltd\nD8:43:ED\t\tSuzuken\nD8:44:5C\t\tDEV Tecnologia Ind Com Man Eq LTDA\nD8:44:89\t\tTP-Link Systems Inc\nD8:45:2B\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\nD8:45:67\t\tTecno Mobile Limited\nD8:46:06\t\tSilicon Valley Global Marketing\nD8:47:10\t\tSichuan Changhong Electric Ltd.\nD8:47:32\t\tTp-Link Technologies Co.,Ltd.\nD8:47:8F\t\tMicrochip Technology Inc.\nD8:47:BB\t\tHuawei Device Co., Ltd.\nD8:48:EE\t\tHangzhou Xueji Technology Co., Ltd.\nD8:49:0B\t\tHuawei Technologies Co.,Ltd\nD8:49:2F\t\tCanon Inc.\nD8:49:BF\t\tCelestica Inc.\nD8:4A:2B\t\tzte corporation\nD8:4A:83\t\tvivo Mobile Communication Co., Ltd.\nD8:4A:87\t\tOi Electric Co.,Ltd\nD8:4B:2A\t\tCognitas Technologies, Inc.\nD8:4C:90\t\tApple, Inc.\nD8:4D:B9\t\tWu Qi Technologies,Inc.\nD8:4F:37\t\tProxis, spol. s r.o.\nD8:4F:B8\t\tLg Electronics\nD8:50:A1\t\tHunan Danuo Technology Co.,LTD\nD8:50:E6\t\tASUSTek COMPUTER INC.\nD8:53:9A\t\tJuniper Networks\nD8:53:AD\t\tCisco Meraki\nD8:53:BC\t\tLenovo Information Products (Shenzhen)Co.,Ltd\nD8:54:3A\t\tTexas Instruments\nD8:54:82\t\tOxit, LLC\nD8:54:A2\t\tExtreme Networks Headquarters\nD8:54:F2\t\tHuawei Device Co., Ltd.\nD8:55:75\t\tSamsung Electronics Co.,Ltd\nD8:55:A3\t\tzte corporation\nD8:57:EF\t\tSamsung Electronics Co.,Ltd\nD8:58:C6\t\tKatch Asset Tracking Pty Limited\nD8:58:D7\t\tCZ.NIC, z.s.p.o.\nD8:59:82\t\tHuawei Technologies Co.,Ltd\nD8:5A:49\t\tINGCHIPS Technology Co., Ltd\nD8:5B:22\t\tShenzhen Hohunet Technology Co., Ltd\nD8:5B:2A\t\tSamsung Electronics Co.,Ltd\nD8:5D:4C\t\tTp-Link Technologies Co.,Ltd.\nD8:5D:84\t\tCAx soft GmbH\nD8:5D:E2\t\tHon Hai Precision Ind. Co.,Ltd.\nD8:5D:EF\t\tBusch-Jaeger Elektro GmbH\nD8:5D:FB\t\tPrivate\nD8:5E:D3\t\tGiga-Byte Technology Co.,Ltd.\nD8:5F:77\t\tTelink Semiconductor (Shanghai) Co., Ltd.\nD8:60:B0\t\tbioMérieux Italia S.p.A.\nD8:60:B3\t\tGuangdong Global Electronic Technology CO.，LTD\nD8:61:62\t\tWistron Neweb Corporation\nD8:61:94\t\tObjetivos y Sevicios de Valor Añadido\nD8:62:DB\t\tEno Inc.\nD8:63:0D\t\tMotorola (Wuhan) Mobility Technologies Communication Co., Ltd.\nD8:63:75\t\tXiaomi Communications Co Ltd\nD8:63:8C\t\tShenzhen Dttek Technology Co., Ltd.\nD8:65:95\t\tToy's Myth Inc.\nD8:66:C6\t\tShenzhen Daystar Technology Co.,ltd\nD8:66:EE\t\tBoxin Communication Co.,Ltd.\nD8:67:D3\t\tHuawei Device Co., Ltd.\nD8:67:D9\t\tCisco Systems, Inc\nD8:68:52\t\tHuawei Technologies Co.,Ltd\nD8:68:A0\t\tSamsung Electronics Co.,Ltd\nD8:68:C3\t\tSamsung Electronics Co.,Ltd\nD8:69:60\t\tSteinsvik\nD8:6B:83\t\tNintendo Co.,Ltd\nD8:6B:F7\t\tNintendo Co., Ltd.\nD8:6B:FC\t\tzte corporation\nD8:6C:02\t\tHuaqin Telecom Technology Co.,Ltd\nD8:6C:5A\t\tHUMAX Co., Ltd.\nD8:6C:63\t\tGoogle, Inc.\nD8:6C:E9\t\tSagemcom Broadband SAS\nD8:6D:17\t\tHuawei Technologies Co.,Ltd\nD8:71:4D\t\tTexas Instruments\nD8:71:54\t\tSamsung Electronics Co.,Ltd\nD8:71:57\t\tLenovo Mobile Communication Technology Ltd.\nD8:74:75\t\tApple, Inc.\nD8:74:95\t\tzte corporation\nD8:74:DF\t\tHuawei Technologies Co.,Ltd\nD8:74:EF\t\tGuangzhou Shiyuan Electronic Technology Company Limited\nD8:75:33\t\tNokia Corporation\nD8:76:0A\t\tEscort, Inc.\nD8:76:AE\t\tHuawei Technologies Co.,Ltd\nD8:77:66\t\tNurivoice Co., Ltd\nD8:77:8B\t\tIntelbras\nD8:78:7F\t\tUbee Interactive Co., Limited\nD8:78:C9\t\tServercom (India) Private Limited\nD8:78:E5\t\tKuhn Sa\nD8:79:88\t\tHon Hai Precision Ind. Co.,Ltd.\nD8:7A:3B\t\tSilicon Laboratories\nD8:7C:DD\t\tSanix Incorporated\nD8:7D:45\t\tNicent Technology Co., Ltd.\nD8:7D:7F\t\tSagemcom Broadband SAS\nD8:7E:6F\t\tCascination Ag\nD8:7E:76\t\tItel Mobile Limited\nD8:7E:B1\t\tx.o.ware, inc.\nD8:80:39\t\tMicrochip Technology Inc.\nD8:80:3C\t\tAnhui Huami Information Technology Company Limited\nD8:80:83\t\tCloud Network Technology Singapore Pte. Ltd.\nD8:80:DC\t\tHuawei Device Co., Ltd.\nD8:81:CE\t\tAhn Inc.\nD8:83:32\t\tTaiXin Semiconductor Co., Ltd\nD8:84:66\t\tExtreme Networks Headquarters\nD8:86:0B\t\tIEEE Registration Authority\nD8:86:0B:00:00:00/28\tInspur Group Co., Ltd.\nD8:86:0B:10:00:00/28\tKrspace\nD8:86:0B:20:00:00/28\tGet SAT\nD8:86:0B:30:00:00/28\tAuvidea GmbH\nD8:86:0B:40:00:00/28\tTeplovodokhran Ltd.\nD8:86:0B:50:00:00/28\tCamtrace\nD8:86:0B:60:00:00/28\tScanmatik\nD8:86:0B:70:00:00/28\tGrünbeck Wasseraufbereitung GmbH\nD8:86:0B:80:00:00/28\tVrinda Nano Technologies Pvt Ltd\nD8:86:0B:90:00:00/28\tDigital Concepts\nD8:86:0B:A0:00:00/28\tGLO Science\nD8:86:0B:B0:00:00/28\tLibrary Ideas\nD8:86:0B:C0:00:00/28\tYusan Industries Limited\nD8:86:0B:D0:00:00/28\tComNav Technology Ltd.\nD8:86:0B:E0:00:00/28\tShenzhen Yidong Technology Co.,Ltd\nD8:87:D5\t\tLeadcore Technology CO.,LTD\nD8:88:63\t\tHuawei Technologies Co.,Ltd\nD8:88:CE\t\tRF Technology Pty Ltd\nD8:8A:3B\t\tUnit-Em\nD8:8A:DC\t\tHuawei Device Co., Ltd.\nD8:8B:4C\t\tKingTing Tech.\nD8:8C:73\t\tzte corporation\nD8:8C:79\t\tGoogle, Inc.\nD8:8D:5C\t\tElentec\nD8:8D:C8\t\tAtil Technology Co., LTD\nD8:8E:D4\t\teero inc.\nD8:8F:76\t\tApple, Inc.\nD8:90:E8\t\tSamsung Electronics Co.,Ltd\nD8:91:2A\t\tZyxel Communications Corporation\nD8:91:36\t\tDover Fueling Solutions\nD8:93:41\t\tGeneral Electric Global Research\nD8:93:D4\t\tXiaomi Communications Co Ltd\nD8:94:03\t\tHewlett Packard Enterprise\nD8:94:24\t\tMellanox Technologies, Inc.\nD8:95:2F\t\tTexas Instruments\nD8:95:63\t\tTaiwan Digital Streaming Co.\nD8:96:85\t\tGoPro\nD8:96:95\t\tApple, Inc.\nD8:96:E0\t\tAlibaba Cloud Computing Ltd.\nD8:97:3B\t\tArtesyn Embedded Technologies\nD8:97:60\t\tC2 Development, Inc.\nD8:97:7C\t\tGrey Innovation\nD8:97:90\t\tCommonwealth Scientific and Industrial Research Organisation\nD8:97:BA\t\tPegatron Corporation\nD8:9A:0D\t\tzte corporation\nD8:9A:34\t\tBeijing SHENQI Technology Co., Ltd.\nD8:9A:C1\t\tNokia\nD8:9B:3B\t\tHuawei Technologies Co.,Ltd\nD8:9C:67\t\tHon Hai Precision Ind. Co.,Ltd.\nD8:9C:8E\t\tComcast Cable Corporation\nD8:9D:67\t\tHewlett Packard\nD8:9D:B9\t\teMegatech International Corp.\nD8:9E:3F\t\tApple, Inc.\nD8:9E:61\t\tHuawei Device Co., Ltd.\nD8:9E:D4\t\tFiberhome Telecommunication Technologies Co.,LTD\nD8:9E:F3\t\tDell Inc.\nD8:A0:11\t\tWiZ\nD8:A0:1D\t\tEspressif Inc.\nD8:A0:E6\t\tChongqing Yipingfang Technology Co., Ltd.\nD8:A0:E8\t\tzte corporation\nD8:A1:05\t\tSyslane, Co., Ltd.\nD8:A2:5E\t\tApple, Inc.\nD8:A3:15\t\tvivo Mobile Communication Co., Ltd.\nD8:A3:5C\t\tSamsung Electronics Co.,Ltd\nD8:A4:91\t\tHuawei Device Co., Ltd.\nD8:A5:34\t\tSpectronix Corporation\nD8:A6:F0\t\tWu Qi Technologies,Inc.\nD8:A6:FD\t\tGhost Autonomy Inc.\nD8:A7:56\t\tSagemcom Broadband SAS\nD8:A8:C8\t\tzte corporation\nD8:A9:8B\t\tTexas Instruments\nD8:AA:59\t\tTonly Technology Co. Ltd\nD8:AD:49\t\tHonor Device Co., Ltd.\nD8:AD:DD\t\tSonavation, Inc.\nD8:AE:90\t\tItibia Technologies\nD8:AE:D0\t\tShanghai Engineering Science & Technology Co.,LTD CGNPC\nD8:AF:3B\t\tHangzhou Bigbright Integrated communications system Co.,Ltd\nD8:AF:81\t\tAo\nD8:AF:F1\t\tPanasonic Appliances Company\nD8:B0:20\t\tTaicang T&W Electronics\nD8:B0:2E\t\tGuangzhou Zonerich Business Machine Co., LTD.\nD8:B0:4C\t\tJinan USR IOT Technology Co., Ltd.\nD8:B0:53\t\tXiaomi Communications Co Ltd\nD8:B0:61\t\tShenzhen Wenxun Technology Co.,Ltd\nD8:B1:22\t\tJuniper Networks\nD8:B1:2A\t\tPanasonic Mobile Communications Co.,Ltd.\nD8:B1:90\t\tCisco Systems, Inc\nD8:B2:49\t\tHuawei Device Co., Ltd.\nD8:B2:93\t\tTopssd\nD8:B2:AA\t\tzte corporation\nD8:B3:2F\t\tCloud Network Technology Singapore Pte. Ltd.\nD8:B3:70\t\tUbiquiti Inc\nD8:B3:77\t\tHTC Corporation\nD8:B6:73\t\tTexas Instruments\nD8:B6:B7\t\tComtrend Corporation\nD8:B6:C1\t\tNetworkAccountant, Inc.\nD8:B6:D6\t\tBlu Tether Limited\nD8:B8:F6\t\tNantworks\nD8:B9:0E\t\tTriple Domain Vision Co.,Ltd.\nD8:BB:2C\t\tApple, Inc.\nD8:BB:C1\t\tMicro-Star INTL CO., LTD.\nD8:BC:38\t\tEspressif Inc.\nD8:BC:59\t\tShenzhen DAPU Microelectronics Co., Ltd\nD8:BE:1F\t\tApple, Inc.\nD8:BE:65\t\tAmazon Technologies Inc.\nD8:BF:4C\t\tVictory Concept Electronics Limited\nD8:BF:C0\t\tEspressif Inc.\nD8:C0:68\t\tNetgenetech.co.,ltd.\nD8:C0:6A\t\tHunantv.com Interactive Entertainment Media Co.,Ltd.\nD8:C0:A6\t\tAzureWave Technology Inc.\nD8:C3:FB\t\tDetracom\nD8:C4:6A\t\tMurata Manufacturing Co., Ltd.\nD8:C4:97\t\tQuanta Computer Inc.\nD8:C4:E9\t\tSamsung Electronics Co.,Ltd\nD8:C5:61\t\tCommFront Communications Pte Ltd\nD8:C6:78\t\tMitraStar Technology Corp.\nD8:C6:91\t\tHichan Technology Corp.\nD8:C6:F9\t\tTracklab Inc\nD8:C7:71\t\tHuawei Technologies Co.,Ltd\nD8:C7:C8\t\tHewlett Packard Enterprise\nD8:C8:0C\t\tTuya Smart Inc.\nD8:C8:E9\t\tPhicomm (Shanghai) Co., Ltd.\nD8:C9:9D\t\tEa Display Limited\nD8:CA:06\t\tTitan DataCenters France\nD8:CB:8A\t\tMicro-Star INTL CO., LTD.\nD8:CC:98\t\tHuawei Device Co., Ltd.\nD8:CD:2C\t\tWuxi Neihua Network Technology Co., Ltd\nD8:CE:3A\t\tXiaomi Communications Co Ltd\nD8:CF:61\t\tSagemcom Broadband SAS\nD8:CF:89\t\tBeijing DoSee Science and Technology Co., Ltd.\nD8:CF:9C\t\tApple, Inc.\nD8:CF:BF\t\tMotorola Mobility LLC, a Lenovo Company\nD8:D0:90\t\tDell Inc.\nD8:D1:CB\t\tApple, Inc.\nD8:D2:61\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nD8:D2:7C\t\tJema Energy, Sa\nD8:D3:85\t\tHewlett Packard\nD8:D4:3C\t\tSony Corporation\nD8:D4:5D\t\tOrbic North America\nD8:D4:E6\t\tHytec Inter Co., Ltd.\nD8:D5:B9\t\tRainforest Automation, Inc.\nD8:D6:68\t\tTuya Smart Inc.\nD8:D6:7E\t\tGsk Cnc Equipment Co.,Ltd\nD8:D6:F3\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\nD8:D7:23\t\tIDS, Inc\nD8:D7:75\t\tSagemcom Broadband SAS\nD8:D8:66\t\tShenzhen Tozed Technologies Co.,Ltd.\nD8:D8:E5\t\tVantiva Connected Home - Technologies Telco\nD8:DA:52\t\tApator S.A.\nD8:DA:F1\t\tHuawei Technologies Co.,Ltd\nD8:DC:40\t\tApple, Inc.\nD8:DC:E9\t\tKunshan Erlab ductless filtration system Co.,Ltd\nD8:DD:5F\t\tBALMUDA Inc.\nD8:DD:FD\t\tTexas Instruments\nD8:DE:3A\t\tApple, Inc.\nD8:DE:CE\t\tIsung Co.,Ltd\nD8:DF:0D\t\tberoNet GmbH\nD8:DF:7A\t\tQuest Software, Inc.\nD8:E0:04\t\tVodia Networks Inc\nD8:E0:B8\t\tBulat Llc\nD8:E0:E1\t\tSamsung Electronics Co.,Ltd\nD8:E2:3F\t\tQingdao Haier Technology Co.,Ltd\nD8:E2:DF\t\tMicrosoft Corporation\nD8:E3:5E\t\tLG Innotek\nD8:E3:AE\t\tCirtec Medical Systems\nD8:E5:6D\t\tTCT mobile ltd\nD8:E5:93\t\tApple, Inc.\nD8:E7:2B\t\tNetscout Systems Inc\nD8:E7:2F\t\tChipsea Technologies (Shenzhen) Corp.\nD8:E7:43\t\tWush, Inc\nD8:E8:44\t\tzte corporation\nD8:E9:52\t\tKeopsys\nD8:EB:46\t\tGoogle, Inc.\nD8:EB:97\t\tTRENDnet, Inc.\nD8:EC:5E\t\tBelkin International Inc.\nD8:EC:E5\t\tZyxel Communications Corporation\nD8:ED:1C\t\tMagna Technology SL\nD8:EE:42\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nD8:EE:78\t\tMoog Protokraft\nD8:EF:42\t\tHuawei Device Co., Ltd.\nD8:EF:CD\t\tNokia Solutions and Networks GmbH & Co. KG\nD8:F0:F2\t\tZeebo Inc\nD8:F1:2E\t\tTP-Link Systems Inc.\nD8:F1:5B\t\tEspressif Inc.\nD8:F1:D8\t\tOi Electric Co.,Ltd\nD8:F1:F0\t\tPepxim International Limited\nD8:F2:CA\t\tIntel Corporate\nD8:F3:BC\t\tLiteon Technology Corporation\nD8:F3:DB\t\tPost CH AG\nD8:F5:07\t\tFiberhome Telecommunication Technologies Co.,LTD\nD8:F7:10\t\tLibre Wireless Technologies Inc.\nD8:F7:60\t\tEM Microelectronic\nD8:F8:83\t\tIntel Corporate\nD8:F8:AF\t\tDaontec\nD8:FB:11\t\tAxacore\nD8:FB:5E\t\tAskey Computer Corp\nD8:FB:68\t\tCloud Corner Ltd.\nD8:FB:D6\t\tAmazon Technologies Inc.\nD8:FC:38\t\tGiantec Semiconductor Inc\nD8:FC:93\t\tIntel Corporate\nD8:FE:8F\t\tIDFone Co., Ltd.\nD8:FE:E3\t\tD-Link International\nD8:FF:C3\t\tShenzhen 3SNIC information technology company Limited\nDA:0D:38\t\tFarpointe Data, Inc.\nDA:19:B3\t\tLG Uplus\nDA:1C:21\t\tSesam GmbH\nDA:1E:56\t\tOSNexus\nDA:28:EC\t\tHG Genuine\nDA:2B:DD\t\tAT&T, Inc.\nDA:41:62\t\tXperi Corporation\nDA:7D:2E\t\tDelta Computers LLC.\nDA:9D:49\t\tCalix Inc.\nDA:A1:19\t\tGoogle, Inc.\nDA:C4:51\t\tTakaratomy\nDA:C8:7D\t\tSE Development AB\nDA:E6:D7\t\tNVM Express, Inc.\nDA:FF:6B\t\tTeam Precision Public Company Limited\nDC:00:77\t\tTp-Link Technologies Co.,Ltd.\nDC:00:B0\t\tFreebox Sas\nDC:02:65\t\tMeditech Kft\nDC:02:8E\t\tzte corporation\nDC:03:98\t\tLG Innotek\nDC:05:2F\t\tNational Products Inc.\nDC:05:39\t\tCisco Systems, Inc\nDC:05:75\t\tSiemens Energy Automation\nDC:05:ED\t\tNabtesco  Corporation\nDC:06:75\t\tEspressif Inc.\nDC:06:82\t\tAccessia Technology Ltd.\nDC:07:C1\t\tHangZhou QiYang Technology Co.,Ltd.\nDC:07:F8\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nDC:08:0F\t\tApple, Inc.\nDC:08:56\t\tAlcatel-Lucent Enterprise\nDC:08:DA\t\tAskey Computer Corp\nDC:09:14\t\tTalk-A-Phone Co.\nDC:09:4C\t\tHuawei Technologies Co.,Ltd\nDC:0B:09\t\tCisco Systems, Inc\nDC:0B:1A\t\tADB Broadband Italia\nDC:0B:34\t\tLG Electronics (Mobile Communications)\nDC:0C:2D\t\tWeifang Goertek Electronics Co.,Ltd\nDC:0C:5C\t\tApple, Inc.\nDC:0D:30\t\tShenzhen Feasycom Technology Co., Ltd.\nDC:0E:96\t\tPalo Alto Networks\nDC:0E:A1\t\tCompal Information (Kunshan) Co., Ltd.\nDC:10:57\t\tApple, Inc.\nDC:12:1D\t\tHuawei Technologies Co.,Ltd\nDC:15:2D\t\tChina Mobile Group Device Co.,Ltd.\nDC:15:C8\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\nDC:15:DB\t\tGe Ruili Intelligent Technology ( Beijing ) Co., Ltd.\nDC:16:A2\t\tMedtronic Diabetes\nDC:16:B2\t\tHuawei Technologies Co.,Ltd\nDC:17:5A\t\tHitachi High-Technologies Corporation\nDC:17:92\t\tCaptivate Network\nDC:1A:01\t\tEcoliv Technology ( Shenzhen ) Ltd.\nDC:1A:C5\t\tvivo Mobile Communication Co., Ltd.\nDC:1B:A1\t\tIntel Corporate\nDC:1D:9F\t\tU & B tech\nDC:1D:D4\t\tMicrostep-MIS spol. s r.o.\nDC:1E:A3\t\tAccensus LLC\nDC:1E:D5\t\tEspressif Inc.\nDC:20:08\t\tASD Electronics Ltd\nDC:21:48\t\tIntel Corporate\nDC:21:5C\t\tIntel Corporate\nDC:21:B9\t\tSentec Co.Ltd\nDC:21:E2\t\tHuawei Technologies Co.,Ltd\nDC:23:3B\t\tExtreme Networks Headquarters\nDC:27:27\t\tHuawei Device Co., Ltd.\nDC:28:34\t\tHAKKO Corporation\nDC:29:19\t\tAltoBeam (Xiamen) Technology Ltd, Co.\nDC:29:3A\t\tShenzhen Nuoshi Technology Co., LTD.\nDC:2A:14\t\tShanghai Longjing Technology Co.\nDC:2A:A1\t\tMedHab LLC\nDC:2B:2A\t\tApple, Inc.\nDC:2B:61\t\tApple, Inc.\nDC:2B:66\t\tInfoBLOCK S.A. de C.V.\nDC:2B:CA\t\tZera GmbH\nDC:2C:26\t\tIton Technology Limited\nDC:2C:6E\t\tRouterboard.com\nDC:2D:04\t\tvivo Mobile Communication Co., Ltd.\nDC:2D:3C\t\tHuawei Device Co., Ltd.\nDC:2D:CB\t\tBeijing Unis HengYue Technology Co., Ltd.\nDC:2D:DE\t\tLedworks SRL\nDC:2E:6A\t\tHCT. Co., Ltd.\nDC:2E:97\t\tQuectel Wireless Solutions Co.,Ltd.\nDC:2F:03\t\tStep forward Group Co., Ltd.\nDC:2F:FA\t\tGE Lighting\nDC:30:9C\t\tHeyrex Limited\nDC:31:30\t\t3onedata Technology Co. Ltd.\nDC:31:D1\t\tvivo Mobile Communication Co., Ltd.\nDC:32:62\t\tNanjing Qinheng Microelectronics Co., Ltd.\nDC:33:0D\t\tQing Dao Haier Telecom Co.,Ltd.\nDC:33:3D\t\tHuawei Device Co., Ltd.\nDC:33:50\t\tTechSAT GmbH\nDC:35:F1\t\tPositivo Tecnologia S.A.\nDC:36:0C\t\tHitron Technologies. Inc\nDC:36:42\t\tzte corporation\nDC:36:43\t\tIEEE Registration Authority\nDC:36:43:00:00:00/28\tMeier Tobler AG\nDC:36:43:10:00:00/28\tDongguan Pengchen Earth Instrument CO. LT\nDC:36:43:20:00:00/28\tWuhan Linptech Co. ,Ltd.\nDC:36:43:30:00:00/28\tWIS Networks\nDC:36:43:40:00:00/28\tFresenius Medical Care R&D (Shanghai) Co.,Ltd.\nDC:36:43:50:00:00/28\tHangzhou Chingan Tech Co., Ltd.\nDC:36:43:60:00:00/28\tShenzhen smart-core technology co.,ltd.\nDC:36:43:70:00:00/28\tUkg\nDC:36:43:80:00:00/28\tOak Information System Co.\nDC:36:43:90:00:00/28\tHefei EA Excelsior Information Security Co., Ltd.\nDC:36:43:A0:00:00/28\tKuantech (Cambodia) Corporation Limited\nDC:36:43:B0:00:00/28\tnami.ai\nDC:36:43:C0:00:00/28\tOrlaco Products B.V.\nDC:36:43:D0:00:00/28\tHangzhou Huanyu Vision Technology Co., Ltd\nDC:36:43:E0:00:00/28\tBeijing L&S Lancom Platform Tech. Co., Ltd.\nDC:37:14\t\tApple, Inc.\nDC:37:52\t\tGe\nDC:37:57\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\nDC:37:D2\t\tHunan HKT Electronic Technology Co., Ltd\nDC:38:E1\t\tJuniper Networks\nDC:39:6F\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\nDC:39:79\t\tCisco Systems, Inc\nDC:3A:5E\t\tRoku, Inc.\nDC:3C:2E\t\tManufacturing System Insights, Inc.\nDC:3C:84\t\tTicom Geomatics, Inc.\nDC:3C:F6\t\tAtomic Rules LLC\nDC:3E:51\t\tSolberg & Andersen AS\nDC:3E:F8\t\tNokia Corporation\nDC:41:5F\t\tApple, Inc.\nDC:41:A9\t\tIntel Corporate\nDC:41:E5\t\tShenzhen Zhixin Data Service Co., Ltd.\nDC:42:C8\t\tHuawei Device Co., Ltd.\nDC:44:27\t\tIEEE Registration Authority\nDC:44:27:00:00:00/28\tSuritel\nDC:44:27:10:00:00/28\tTesla,Inc.\nDC:44:27:20:00:00/28\tSkywave Technology Co,.Ltd.\nDC:44:27:30:00:00/28\tGeneral Microsystems Sdn Bhd\nDC:44:27:40:00:00/28\tNex Technologies PTY LTD\nDC:44:27:50:00:00/28\tCentury Audio, Inc.\nDC:44:27:60:00:00/28\tEK-TEAM Elektronik- u. Kunststoff-Technik GmbH\nDC:44:27:70:00:00/28\tEcoGuard AB\nDC:44:27:80:00:00/28\tWharton Electronics Ltd\nDC:44:27:90:00:00/28\tNeusoft Corporation\nDC:44:27:A0:00:00/28\tShanghai Huahong Integrated Circuit Co.,Ltd\nDC:44:27:B0:00:00/28\tNautilus Infotech CO., Ltd.\nDC:44:27:C0:00:00/28\tPyrexx Technologies GmbH\nDC:44:27:D0:00:00/28\tRohde&Schwarz Topex SA\nDC:44:27:E0:00:00/28\tVerifEye Technologies\nDC:44:27:F0:00:00/28\tPrivate\nDC:44:6D\t\tAllwinner Technology Co., Ltd\nDC:44:B6\t\tSamsung Electronics Co.,Ltd\nDC:45:17\t\tCommscope\nDC:45:46\t\tIntel Corporate\nDC:45:B8\t\tApple, Inc.\nDC:46:28\t\tIntel Corporate\nDC:48:B2\t\tBaraja Pty. Ltd.\nDC:49:65\t\tDASAN Newtork Solutions\nDC:49:C9\t\tCasco Signal Ltd\nDC:4A:3E\t\tHewlett Packard\nDC:4A:9E\t\tIEEE Registration Authority\nDC:4A:9E:00:00:00/28\tDongguan Huili electroacoustic Industrial Co.,ltd\nDC:4A:9E:10:00:00/28\tAdvanced Electronics Ltd\nDC:4A:9E:20:00:00/28\tAnnapurna labs\nDC:4A:9E:30:00:00/28\tLeach International Europe\nDC:4A:9E:40:00:00/28\tAdial\nDC:4A:9E:50:00:00/28\tNuove Tecnologie srl\nDC:4A:9E:60:00:00/28\tTattile Srl\nDC:4A:9E:70:00:00/28\tAstrogate Inc.\nDC:4A:9E:80:00:00/28\tMethodex Systems Pvt. Ltd.\nDC:4A:9E:90:00:00/28\tAiSight GmbH\nDC:4A:9E:A0:00:00/28\tLongSung Technology (Shanghai) Co.,Ltd.\nDC:4A:9E:B0:00:00/28\tMaxvision Technology Corp.\nDC:4A:9E:C0:00:00/28\tHefei Datang Storage Technology Co.,Ltd\nDC:4A:9E:D0:00:00/28\tHappiest Baby Inc.\nDC:4A:9E:E0:00:00/28\tSES-imagotag Deutschland GmbH\nDC:4B:A1\t\tWistron Neweb Corporation\nDC:4B:DD\t\tShenzhen SuperElectron Technology Co.,Ltd.\nDC:4B:FE\t\tShenzhen Belon Technology CO.,LTD\nDC:4D:23\t\tMRV Comunications\nDC:4E:DE\t\tShinyei Technology Co., Ltd.\nDC:4E:F4\t\tShenzhen MTN Electronics CO., Ltd\nDC:4F:22\t\tEspressif Inc.\nDC:50:3A\t\tNanjing Ticom Tech Co., Ltd.\nDC:51:93\t\tzte corporation\nDC:52:85\t\tApple, Inc.\nDC:53:60\t\tIntel Corporate\nDC:53:7C\t\tCompal Broadband Networks, Inc.\nDC:53:92\t\tApple, Inc.\nDC:54:3D\t\tItel Mobile Limited\nDC:54:75\t\tEspressif Inc.\nDC:54:AD\t\tHangzhou RunZhou Fiber Technologies Co.,Ltd\nDC:54:D7\t\tAmazon Technologies Inc.\nDC:55:83\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nDC:56:7B\t\tCloud Network Technology Singapore Pte. Ltd.\nDC:56:E6\t\tShenzhen Bococom Technology Co.,LTD\nDC:56:E7\t\tApple, Inc.\nDC:57:26\t\tPower-One\nDC:58:BC\t\tThomas-Krenn.AG\nDC:5E:36\t\tPaterson Technology\nDC:60:A1\t\tTeledyne DALSA Professional Imaging\nDC:61:80\t\tHuawei Technologies Co.,Ltd\nDC:62:1F\t\tHuawei Technologies Co.,Ltd\nDC:62:79\t\tTP-Link Systems Inc\nDC:62:94\t\tGuangzhou Lango Electronics Technology Co.,Ltd.\nDC:63:73\t\tObara Korea\nDC:64:7C\t\tC.R.S. iiMotion GmbH\nDC:64:B8\t\tShenzhen JingHanDa Electronics Co.Ltd\nDC:65:55\t\tNew H3C Intelligence Terminal Co., Ltd.\nDC:66:3A\t\tApacer Technology Inc.\nDC:66:72\t\tSamsung Electronics Co.,Ltd\nDC:67:23\t\tbarox Kommunikation GmbH\nDC:68:0C\t\tHewlett Packard Enterprise\nDC:68:80\t\tzte corporation\nDC:68:EB\t\tNintendo Co.,Ltd\nDC:69:B5\t\teero inc.\nDC:69:E2\t\tSamsung Electronics Co.,Ltd\nDC:6A:E7\t\tXiaomi Communications Co Ltd\nDC:6A:EA\t\tInfinix mobility limited\nDC:6B:12\t\tworldcns inc.\nDC:6B:1B\t\tHuawei Device Co., Ltd.\nDC:6D:BC\t\tApple, Inc.\nDC:6D:CD\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nDC:6F:00\t\tLivescribe, Inc.\nDC:6F:08\t\tBay Storage Technology\nDC:70:14\t\tPrivate\nDC:70:35\t\tShengzhen Gongjin Electronics\nDC:71:37\t\tzte corporation\nDC:71:44\t\tSamsung Electro Mechanics Co., Ltd.\nDC:71:96\t\tIntel Corporate\nDC:71:D0\t\tApple, Inc.\nDC:71:DD\t\tAX Technologies\nDC:72:23\t\tHui Zhou Gaoshengda Technology Co.,LTD\nDC:72:9B\t\tHuawei Technologies Co.,Ltd\nDC:73:06\t\tVantiva Connected Home - Home Networks\nDC:73:85\t\tHuawei Device Co., Ltd.\nDC:74:A8\t\tSamsung Electronics Co.,Ltd\nDC:76:C3\t\tIEEE Registration Authority\nDC:76:C3:00:00:00/28\tGenius Vision Digital Private Limited\nDC:76:C3:10:00:00/28\tBangyan Technology Co., Ltd\nDC:76:C3:20:00:00/28\tIre Solution\nDC:76:C3:30:00:00/28\tShenzhen C & D Electronics Co., Ltd.\nDC:76:C3:40:00:00/28\tseadee\nDC:76:C3:50:00:00/28\theinrich corporation India private limited\nDC:76:C3:60:00:00/28\tShangHai Zhousheng Intelligent Technology Co., Ltd\nDC:76:C3:70:00:00/28\tNanjing Loyst Industrial Networks Co.,Ltd.\nDC:76:C3:80:00:00/28\tJ&J Philippines Corporation\nDC:76:C3:90:00:00/28\tHunan Zhizhou Technology Co., Ltd\nDC:76:C3:A0:00:00/28\tAnnapurna labs\nDC:76:C3:B0:00:00/28\tNCE Network Consulting Engineering srl\nDC:76:C3:C0:00:00/28\tKunshan QTech Smart-Forward Limited\nDC:76:C3:D0:00:00/28\tChen Uei Precision Industry Co., Ltd\nDC:76:C3:E0:00:00/28\tMorelink\nDC:77:4C\t\tCisco Systems, Inc\nDC:77:94\t\tHuawei Device Co., Ltd.\nDC:78:34\t\tLogicom Sa\nDC:7B:94\t\tCisco Systems, Inc\nDC:7C:F7\t\tChina Mobile Group Device Co.,Ltd.\nDC:7E:1D\t\tHuawei Technologies Co.,Ltd\nDC:7F:A4\t\t2Wire Inc\nDC:80:84\t\tApple, Inc.\nDC:81:3D\t\tShanghai Xiangcheng Communication Technology Co., Ltd\nDC:82:5B\t\tJANUS, spol. s r.o.\nDC:82:F6\t\tiPort\nDC:84:03\t\tshenzhen trolink  Technology Co.,Ltd\nDC:84:E9\t\tShenzhen Qihoo Intelligent Technology Co.,Ltd\nDC:85:DE\t\tAzureWave Technology Inc.\nDC:86:8D\t\tHuawei Technologies Co.,Ltd\nDC:86:D8\t\tApple, Inc.\nDC:87:CB\t\tBeijing Perfectek Technologies Co., Ltd.\nDC:88:A1\t\tItel Mobile Limited\nDC:89:83\t\tSamsung Electronics Co.,Ltd\nDC:8B:28\t\tIntel Corporate\nDC:8C:1B\t\tvivo Mobile Communication Co., Ltd.\nDC:8C:37\t\tCisco Systems, Inc\nDC:8D:8A\t\tNokia Solutions and Networks GmbH & Co. KG\nDC:8D:91\t\tInfinix mobility limited\nDC:8D:B7\t\tAtw Technology, Inc.\nDC:8E:8D\t\tNetis Technology Co., Ltd.\nDC:8E:95\t\tSilicon Laboratories\nDC:90:09\t\tIntel Corporate\nDC:90:20\t\tRuru Tek Private Limited\nDC:90:88\t\tHuawei Technologies Co.,Ltd\nDC:91:66\t\tHuawei Device Co., Ltd.\nDC:91:BF\t\tAmazon Technologies Inc.\nDC:92:72\t\tSagemcom Broadband SAS\nDC:93:96\t\tApple, Inc.\nDC:95:66\t\tApple, Inc.\nDC:96:2C\t\tNST Audio Ltd\nDC:97:3A\t\tVerana Networks\nDC:97:58\t\tSichuan AI-Link Technology Co., Ltd.\nDC:97:BA\t\tIntel Corporate\nDC:97:E6\t\tSagemcom Broadband SAS\nDC:98:40\t\tMicrosoft Corporation\nDC:99:14\t\tHuawei Technologies Co.,Ltd\nDC:99:FE\t\tArmatura LLC\nDC:9A:7D\t\tHisense Visual Technology Co.,Ltd\nDC:9A:8E\t\tNanjing Cocomm electronics co., LTD\nDC:9B:1E\t\tIntercom, Inc.\nDC:9B:95\t\tPhyplus Technology (Shanghai) Co., Ltd\nDC:9B:9C\t\tApple, Inc.\nDC:9B:D6\t\tTCT mobile ltd\nDC:9C:52\t\tSapphire Technology Limited.\nDC:9C:99\t\tHuawei Technologies Co.,Ltd\nDC:9C:9F\t\tShenzhen YOUHUA Technology Co., Ltd\nDC:9E:8F\t\tApple, Inc.\nDC:9E:AB\t\tChongqing Yipingfang Technology Co., Ltd.\nDC:9F:A4\t\tNokia Corporation\nDC:9F:DB\t\tUbiquiti Inc\nDC:A0:D0\t\tAmazon Technologies Inc.\nDC:A1:20\t\tNokia\nDC:A2:66\t\tHon Hai Precision Ind. Co.,Ltd.\nDC:A2:81\t\tHonor Device Co., Ltd.\nDC:A3:13\t\tShenzhen Changjin Communication Technology Co.,Ltd\nDC:A3:33\t\tShenzhen YOUHUA Technology Co., Ltd\nDC:A3:A2\t\tFeng mi(Beijing)technology co., LTD\nDC:A3:AC\t\tRBcloudtech\nDC:A4:CA\t\tApple, Inc.\nDC:A5:F4\t\tCisco Systems, Inc\nDC:A6:32\t\tRaspberry Pi Trading Ltd\nDC:A6:33\t\tCommscope\nDC:A6:BD\t\tBeijing Lanbo Technology Co., Ltd.\nDC:A7:06\t\tChengdu Kt Electronic Hi-Tech Co.,Ltd\nDC:A7:82\t\tHuawei Technologies Co.,Ltd\nDC:A7:D9\t\tCompressor Controls Corp\nDC:A8:CF\t\tNew Spin Golf, LLC.\nDC:A9:04\t\tApple, Inc.\nDC:A9:56\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nDC:A9:71\t\tIntel Corporate\nDC:A9:89\t\tMacandc\nDC:AA:43\t\tShenzhen Terca Information Technology Co., Ltd.\nDC:AC:6F\t\tEverytale Inc\nDC:AD:9E\t\tGreenPriz\nDC:AE:04\t\tCELOXICA Ltd\nDC:AE:EB\t\tRuckus Wireless\nDC:AF:68\t\tWeifang Goertek Electronics Co.,Ltd\nDC:B0:58\t\tBürkert Werke GmbH\nDC:B0:82\t\tNokia\nDC:B1:31\t\tShenzhen Huaruian Technology Co.,Ltd\nDC:B3:47\t\tShenzhen Fast Technologies Co.,Ltd\nDC:B3:B4\t\tHoneywell Environmental & Combustion Controls (Tianjin) Co., Ltd.\nDC:B4:AC\t\tFlextronics Manufacturing(Zhuhai)Co.,Ltd.\nDC:B4:C4\t\tMicrosoft XCG\nDC:B4:CA\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nDC:B4:D9\t\tEspressif Inc.\nDC:B5:4F\t\tApple, Inc.\nDC:B7:2E\t\tXiaomi Communications Co Ltd\nDC:B7:AC\t\tHewlett Packard Enterprise\nDC:B7:FC\t\tAlps Electric (Ireland) Ltd\nDC:B8:08\t\tExtreme Networks Headquarters\nDC:BB:3D\t\tExtreme Networks Headquarters\nDC:BB:96\t\tFull Solution Telecom\nDC:BD:7A\t\tGuangzhou Shiyuan Electronic Technology Company Limited\nDC:BD:CC\t\tQuectel Wireless Solutions Co.,Ltd.\nDC:BE:04\t\tTexas Instruments\nDC:BE:49\t\tItel Mobile Limited\nDC:BE:7A\t\tZhejiang Nurotron Biotechnology Co.\nDC:BF:90\t\tHuizhou Qiaoxing Telecommunication Industry Co.,Ltd.\nDC:BF:E9\t\tMotorola Mobility LLC, a Lenovo Company\nDC:C0:DB\t\tShenzhen Kaiboer Technology Co., Ltd.\nDC:C0:EB\t\tAssa Abloy Côte Picarde\nDC:C1:01\t\tSOLiD Technologies, Inc.\nDC:C2:C9\t\tCanon Inc.\nDC:C4:22\t\tSystembase Limited\nDC:C4:9C\t\tSamsung Electronics Co.,Ltd\nDC:C6:22\t\tBuheung System\nDC:C6:4B\t\tHuawei Technologies Co.,Ltd\nDC:C7:93\t\tNokia Corporation\nDC:C8:F5\t\tShanghai UMEinfo CO.,LTD.\nDC:CB:A8\t\tExplora Technologies Inc\nDC:CC:8D\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\nDC:CC:E6\t\tSamsung Electronics Co.,Ltd\nDC:CD:18\t\tNintendo Co.,Ltd\nDC:CD:2F\t\tSeiko Epson Corporation\nDC:CD:66\t\tNXP Semiconductor (Tianjin) LTD.\nDC:CD:74\t\tJapan E.M.Solutions Co., Ltd.\nDC:CE:41\t\tFe Global Hong Kong Limited\nDC:CE:BC\t\tShenzhen JSR Technology Co.,Ltd.\nDC:CE:C1\t\tCisco Systems, Inc\nDC:CF:94\t\tBeijing Rongcheng Hutong Technology Co., Ltd.\nDC:CF:96\t\tSamsung Electronics Co.,Ltd\nDC:D0:F7\t\tBentek Systems Ltd.\nDC:D1:60\t\tTianjin Changdatong Technology Co.,LTD\nDC:D2:55\t\tKinpo Electronics, Inc.\nDC:D2:6A\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nDC:D2:FC\t\tHuawei Technologies Co.,Ltd\nDC:D2:FD\t\tHuawei Technologies Co.,Ltd\nDC:D3:21\t\tHUMAX Co., Ltd.\nDC:D3:A2\t\tApple, Inc.\nDC:D4:44\t\tHuawei Device Co., Ltd.\nDC:D5:2A\t\tSunny Heart Limited\nDC:D7:A0\t\tHuawei Device Co., Ltd.\nDC:D8:7C\t\tBeijing Jingdong Century Trading Co., LTD.\nDC:D8:7F\t\tShenzhen JoinCyber Telecom Equipment Ltd\nDC:D9:16\t\tHuawei Technologies Co.,Ltd\nDC:D9:AE\t\tNokia Shanghai Bell Co., Ltd.\nDC:DA:0C\t\tEspressif Inc.\nDC:DA:4D\t\tCelestica Inc.\nDC:DA:4F\t\tGetck Technology,  Inc\nDC:DA:80\t\tNew H3C Technologies Co., Ltd\nDC:DB:27\t\tHuawei Device Co., Ltd.\nDC:DB:70\t\tTonfunk Systementwicklung und Service GmbH\nDC:DC:07\t\tTRP Systems BV\nDC:DC:C3\t\tExtreme Networks Headquarters\nDC:DC:E2\t\tSamsung Electronics Co.,Ltd\nDC:DD:24\t\tEnergica Motor Company SpA\nDC:DE:4F\t\tGionee Communication Equipment Co Ltd\nDC:DE:CA\t\tAkyllor\nDC:DF:D6\t\tzte corporation\nDC:E0:26\t\tPatrol Tag, Inc\nDC:E0:EB\t\tNanjing Aozheng Information Technology Co.Ltd\nDC:E1:AD\t\tShenzhen Wintop Photoelectric Technology Co., Ltd\nDC:E2:AC\t\tLumens Digital Optics Inc.\nDC:E3:05\t\tAo\nDC:E5:33\t\tIEEE Registration Authority\nDC:E5:33:00:00:00/28\tFLYHT Aerospace\nDC:E5:33:10:00:00/28\tAmbi Labs Limited\nDC:E5:33:20:00:00/28\tRemko GmbH & Co. KG\nDC:E5:33:30:00:00/28\tShenZhen C&D Electronics CO.Ltd.\nDC:E5:33:40:00:00/28\tshenzhen bangying electronics co,.ltd\nDC:E5:33:50:00:00/28\tControls Inc\nDC:E5:33:60:00:00/28\tWECAN Solution Inc.\nDC:E5:33:70:00:00/28\tSAN Engineering\nDC:E5:33:80:00:00/28\tJB-Lighting Lichtanlagen GmbH\nDC:E5:33:90:00:00/28\tTiertime Corporation\nDC:E5:33:A0:00:00/28\tAmazinglayer Network Co., Ltd.\nDC:E5:33:B0:00:00/28\tTintel Hongkong Co.Ltd\nDC:E5:33:C0:00:00/28\tBrck\nDC:E5:33:D0:00:00/28\tSuzhou ATES electronic technology co.LTD\nDC:E5:33:E0:00:00/28\tGiant Power Technology Biomedical Corporation\nDC:E5:5B\t\tGoogle, Inc.\nDC:E5:78\t\tExperimental Factory of Scientific Engineering and Special Design Department\nDC:E5:D8\t\tzte corporation\nDC:E6:50\t\tExtreme Networks Headquarters\nDC:E7:1C\t\tAUG Elektronik GmbH\nDC:E8:38\t\tCK Telecom (Shenzhen) Limited\nDC:E9:94\t\tCloud Network Technology Singapore Pte. Ltd.\nDC:EA:E7\t\tD-Link Corporation\nDC:EB:4D\t\tMotorola (Wuhan) Mobility Technologies Communication Co., Ltd.\nDC:EB:53\t\tWuhan QianXiao Elecronic Technology CO.,LTD\nDC:EB:69\t\tVantiva USA LLC\nDC:EB:94\t\tCisco Systems, Inc\nDC:EC:06\t\tHeimi Network Technology Co., Ltd.\nDC:EC:4F\t\tGuangzhou Shiyuan Electronic Technology Company Limited\nDC:EC:E3\t\tHorys Technologies Llc\nDC:ED:83\t\tBeijing Xiaomi Mobile Software Co., Ltd\nDC:ED:84\t\tHaverford Systems Inc\nDC:EE:06\t\tHuawei Technologies Co.,Ltd\nDC:EE:14\t\tADT Technology\nDC:EF:09\t\tNetgear\nDC:EF:80\t\tHuawei Technologies Co.,Ltd\nDC:EF:CA\t\tMurata Manufacturing Co., Ltd.\nDC:F0:5D\t\tLetta Teknoloji\nDC:F0:90\t\tNubia Technology Co.,Ltd.\nDC:F1:10\t\tNokia Corporation\nDC:F3:1C\t\tTexas Instruments\nDC:F4:01\t\tDell Inc.\nDC:F4:CA\t\tApple, Inc.\nDC:F5:05\t\tAzureWave Technology Inc.\nDC:F5:1B\t\tArcadyan Corporation\nDC:F5:6E\t\tWellysis Corp.\nDC:F7:19\t\tCisco Systems, Inc\nDC:F7:55\t\tSitronik\nDC:F7:56\t\tSamsung Electronics Co.,Ltd\nDC:F8:58\t\tLorent Networks, Inc.\nDC:F8:B9\t\tzte corporation\nDC:FA:D5\t\tSTRONG Ges.m.b.H.\nDC:FB:02\t\tBuffalo.Inc\nDC:FB:48\t\tIntel Corporate\nDC:FB:B8\t\tMeizhou Guo Wei Electronics Co., Ltd\nDC:FE:07\t\tPegatron Corporation\nDC:FE:18\t\tTp-Link Technologies Co.,Ltd.\nDC:FE:23\t\tMurata Manufacturing Co., Ltd.\nE0:00:84\t\tHuawei Technologies Co.,Ltd\nE0:01:A6\t\tEdgecore Networks Corporation\nE0:01:C7\t\tHui Zhou Gaoshengda Technology Co.,LTD\nE0:02:A5\t\tABB Robotics\nE0:03:6B\t\tSamsung Electronics Co.,Ltd\nE0:03:70\t\tShenZhen Continental Wireless Technology Co., Ltd.\nE0:05:1C\t\tGigaDevice Semiconductor Inc.\nE0:05:C5\t\tTp-Link Technologies Co.,Ltd.\nE0:06:30\t\tHuawei Technologies Co.,Ltd\nE0:06:E6\t\tHon Hai Precision Ind. Co.,Ltd.\nE0:07:1B\t\tHewlett Packard Enterprise\nE0:07:C2\t\tFujian Star-Net Communication Co.,Ltd\nE0:08:55\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\nE0:08:71\t\tDongguan Liesheng Electronic Co., Ltd.\nE0:09:BF\t\tSHENZHEN TONG BO WEI TECHNOLOGY Co.,LTD\nE0:0A:F6\t\tLiteon Technology Corporation\nE0:0B:28\t\tInovonics\nE0:0C:7F\t\tNintendo Co., Ltd.\nE0:0C:E5\t\tHuawei Technologies Co.,Ltd\nE0:0D:B9\t\tCree, Inc.\nE0:0D:EE\t\tHuawei Device Co., Ltd.\nE0:0E:CE\t\tFiberhome Telecommunication Technologies Co.,LTD\nE0:0E:DA\t\tCisco Systems, Inc\nE0:0E:E1\t\tWe Corporation Inc.\nE0:0E:E4\t\tDWnet Technologies(Suzhou) Corporation\nE0:10:7F\t\tRuckus Wireless\nE0:12:83\t\tShenzhen Fanzhuo Communication Technology Co., Lt\nE0:13:33\t\tGeneral Motors\nE0:13:B5\t\tvivo Mobile Communication Co., Ltd.\nE0:14:3E\t\tModoosis Inc.\nE0:16:B1\t\tAdvanced Design Technology co.,ltd.\nE0:18:77\t\tFujitsu Limited\nE0:18:9F\t\tEM Microelectronic\nE0:19:1D\t\tHuawei Technologies Co.,Ltd\nE0:19:54\t\tzte corporation\nE0:19:95\t\tNutanix\nE0:19:D8\t\tBh Technologies\nE0:1A:EA\t\tAllied Telesis, Inc.\nE0:1C:41\t\tExtreme Networks Headquarters\nE0:1C:A7\t\tArista Networks\nE0:1C:EE\t\tBravo Tech, Inc.\nE0:1C:FC\t\tD-Link International\nE0:1D:38\t\tBeijing HuaqinWorld Technology Co.,Ltd\nE0:1D:3B\t\tCambridge Industries(Group) Co.,Ltd.\nE0:1E:07\t\tAnite Telecoms  US. Inc\nE0:1F:0A\t\tXslent Energy Technologies. LLC\nE0:1F:2B\t\tNokia Solutions and Networks GmbH & Co. KG\nE0:1F:34\t\tHMD Global Oy\nE0:1F:6A\t\tHuawei Device Co., Ltd.\nE0:1F:88\t\tXiaomi Communications Co Ltd\nE0:1F:ED\t\tNokia Shanghai Bell Co., Ltd.\nE0:1F:FC\t\tMotorola (Wuhan) Mobility Technologies Communication Co., Ltd.\nE0:21:FE\t\tRicher Link Technologies CO.,LTD\nE0:22:02\t\tCommscope\nE0:22:A1\t\tAltoBeam Inc.\nE0:23:D7\t\tSleep Number\nE0:23:FF\t\tFortinet, Inc.\nE0:24:7F\t\tHuawei Technologies Co.,Ltd\nE0:24:81\t\tHuawei Technologies Co.,Ltd\nE0:25:38\t\tTitan Pet Products\nE0:26:30\t\tIntrigue Technologies, Inc.\nE0:26:36\t\tNortel Networks\nE0:27:1A\t\tTTC Next-generation Home Network System WG\nE0:27:6C\t\tGuangzhou Shiyuan Electronic Technology Company Limited\nE0:28:0A\t\tTP-Link Systems Inc.\nE0:28:61\t\tHuawei Technologies Co.,Ltd\nE0:28:6D\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\nE0:28:B1\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nE0:29:67\t\tHMD Global Oy\nE0:2A:66\t\tCisco Systems, Inc\nE0:2A:82\t\tUniversal Global Scientific Industrial Co., Ltd.\nE0:2A:E6\t\tFiberhome Telecommunication Technologies Co.,LTD\nE0:2B:96\t\tApple, Inc.\nE0:2B:E9\t\tIntel Corporate\nE0:2C:B2\t\tLenovo Mobile Communication (Wuhan) Company Limited\nE0:2C:F3\t\tMRS Electronic GmbH\nE0:2D:F0\t\tAlpsalpine Co,.Ltd\nE0:2E:0B\t\tIntel Corporate\nE0:2E:3F\t\tHuawei Device Co., Ltd.\nE0:2E:FE\t\tZhejiang Dahua Technology Co., Ltd.\nE0:2F:6D\t\tCisco Systems, Inc\nE0:30:05\t\tAlcatel-Lucent Shanghai Bell Co., Ltd\nE0:30:F9\t\tJuniper Networks\nE0:31:9E\t\tValve Corporation\nE0:31:D0\t\tSZ Telstar CO., LTD\nE0:33:8E\t\tApple, Inc.\nE0:34:E4\t\tFeit Electric Company, Inc.\nE0:35:60\t\tChallenger Supply Holdings, LLC\nE0:36:76\t\tHuawei Technologies Co.,Ltd\nE0:36:E3\t\tStage One International Co., Ltd.\nE0:37:17\t\tVantiva USA LLC\nE0:37:BF\t\tWistron Neweb Corporation\nE0:38:2D\t\tIEEE Registration Authority\nE0:38:2D:00:00:00/28\tBeijing Cgprintech Technology Co.,Ltd\nE0:38:2D:10:00:00/28\tAnnapurna labs\nE0:38:2D:20:00:00/28\tXi'an Xiangxun Technology Co., Ltd.\nE0:38:2D:30:00:00/28\tAnnapurna labs\nE0:38:2D:40:00:00/28\tQingdao Unovo Technologies Co., Ltd\nE0:38:2D:50:00:00/28\tWeishi Intelligent Information Technology (Guangzhou) Co., LTD\nE0:38:2D:60:00:00/28\tiTracxing\nE0:38:2D:70:00:00/28\tFamar Fueguina S.A.\nE0:38:2D:80:00:00/28\tShenzhen iTest Technology Co.,Ltd\nE0:38:2D:90:00:00/28\tVelvac Incorporated\nE0:38:2D:A0:00:00/28\t4D Photonics GmbH\nE0:38:2D:B0:00:00/28\tSercomm Philippines Inc\nE0:38:2D:C0:00:00/28\tSiLAND Chengdu Technology Co., Ltd\nE0:38:2D:D0:00:00/28\tKepler Communications Inc.\nE0:38:2D:E0:00:00/28\tAnysafe\nE0:38:3F\t\tzte corporation\nE0:39:D7\t\tPlexxi, Inc.\nE0:3A:AA\t\tIntel Corporate\nE0:3C:1C\t\tIEEE Registration Authority\nE0:3C:1C:00:00:00/28\tScangrip\nE0:3C:1C:10:00:00/28\tShikino High-Tech Co., Ltd.\nE0:3C:1C:20:00:00/28\tHoplite Industries, Inc.\nE0:3C:1C:30:00:00/28\tDewetron GmbH\nE0:3C:1C:40:00:00/28\tEarable Inc.\nE0:3C:1C:50:00:00/28\tSemic Inc.\nE0:3C:1C:60:00:00/28\tGhinF Digital information technology (hangzhou) Co., Ltd\nE0:3C:1C:70:00:00/28\tTap Home, s.r.o.\nE0:3C:1C:80:00:00/28\tJiangsu Riying Electronics Co.,Ltd.\nE0:3C:1C:90:00:00/28\tOcamar Technologies (Shanghai) Co.,Ltd.\nE0:3C:1C:A0:00:00/28\tMELAG Medizintechnik GmbH & Co. KG\nE0:3C:1C:B0:00:00/28\tHangzhou Uni-Ubi Co.,Ltd.\nE0:3C:1C:C0:00:00/28\tMeferi Technologies Co.,Ltd.\nE0:3C:1C:D0:00:00/28\tSprintshield d.o.o.\nE0:3C:1C:E0:00:00/28\tAnnapurna labs\nE0:3C:5B\t\tShenzhen Jiaxinjie Electron Co.,Ltd\nE0:3D:A6\t\tTaicang T&W Electronics\nE0:3E:44\t\tBroadcom\nE0:3E:4A\t\tCavanagh Group International\nE0:3E:7D\t\tdata-complex GmbH\nE0:3E:CB\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\nE0:3F:49\t\tASUSTek COMPUTER INC.\nE0:40:07\t\tHuawei Device Co., Ltd.\nE0:40:27\t\tHuawei Device Co., Ltd.\nE0:41:02\t\tzte corporation\nE0:41:36\t\tMitraStar Technology Corp.\nE0:42:6D\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nE0:43:DB\t\tShenzhen ViewAt Technology Co.,Ltd.\nE0:45:6D\t\tChina Mobile Group Device Co.,Ltd.\nE0:46:9A\t\tNetgear\nE0:46:E5\t\tGosuncn Technology Group Co., Ltd.\nE0:46:EE\t\tNetgear\nE0:47:35\t\tEricsson AB\nE0:48:24\t\tGarmin International\nE0:48:AF\t\tPremietech Limited\nE0:48:D3\t\tMobiwire Mobiles (Ningbo) Co.,Ltd\nE0:48:D8\t\tGuangzhi Wulian Technology(Guangzhou) Co., Ltd\nE0:49:34\t\tCalix Inc.\nE0:49:ED\t\tAudeze LLC\nE0:4B:41\t\tHangzhou Beilian Low Carbon Technology Co., Ltd.\nE0:4B:45\t\tHi-P Electronics Pte Ltd\nE0:4B:A6\t\tHuawei Technologies Co.,Ltd\nE0:4C:05\t\tEverCharge\nE0:4C:12\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nE0:4E:5D\t\tHuawei Technologies Co.,Ltd\nE0:4E:7A\t\tNanjing Qinheng Microelectronics Co., Ltd.\nE0:4F:43\t\tUniversal Global Scientific Industrial Co., Ltd.\nE0:4F:BD\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nE0:50:8B\t\tZhejiang Dahua Technology Co., Ltd.\nE0:51:24\t\tNXP Semiconductors\nE0:51:63\t\tArcadyan Corporation\nE0:51:D8\t\tChina Dragon Technology Limited\nE0:55:3D\t\tCisco Meraki\nE0:55:97\t\tEmergent Vision Technologies Inc.\nE0:56:89\t\tLootom Telcovideo Network (Wuxi) Co Ltd\nE0:56:94\t\tYunhight Microelectronics\nE0:56:F4\t\tAxesNetwork Solutions inc.\nE0:58:9E\t\tLaerdal Medical\nE0:5A:1B\t\tEspressif Inc.\nE0:5A:9F\t\tIEEE Registration Authority\nE0:5A:9F:00:00:00/28\tAnnapurna labs\nE0:5A:9F:10:00:00/28\tAitec System Co., Ltd.\nE0:5A:9F:20:00:00/28\tChengdu Song Yuan Electronic Technology Co.,Ltd\nE0:5A:9F:30:00:00/28\tLink of Things Co., Ltd.\nE0:5A:9F:40:00:00/28\tHale Products\nE0:5A:9F:50:00:00/28\tTryen\nE0:5A:9F:60:00:00/28\tFibrain\nE0:5A:9F:70:00:00/28\tOMB Guitars LLC\nE0:5A:9F:80:00:00/28\tFujian Newland Auto-ID Tech. Co,.Ltd.\nE0:5A:9F:90:00:00/28\tGemalto \"Document Readers\"\nE0:5A:9F:A0:00:00/28\tContemporary Amperex Technology Co., Limited\nE0:5A:9F:B0:00:00/28\tShenzhen Rongan Networks Technology Co.,Ltd\nE0:5A:9F:C0:00:00/28\tShenZhen Mornsun Smartlinker Limited Co., LTD\nE0:5A:9F:D0:00:00/28\tMountz, Inc.\nE0:5A:9F:E0:00:00/28\tShenZhen Arts Changhua Intelligent Technology Co., Ltd\nE0:5B:70\t\tInnovid, Co., Ltd.\nE0:5D:54\t\tRuijie Networks Co.,LTD\nE0:5D:5C\t\tOy Everon Ab\nE0:5D:A6\t\tDetlef Fink Elektronik & Softwareentwicklung\nE0:5F:45\t\tApple, Inc.\nE0:5F:B9\t\tCisco Systems, Inc\nE0:60:4A\t\tFiberhome Telecommunication Technologies Co.,LTD\nE0:60:66\t\tSercomm Corporation.\nE0:60:89\t\tCloudleaf, Inc.\nE0:61:B2\t\tHangzhou Zenointel Technology Co., Ltd\nE0:62:34\t\tTexas Instruments\nE0:62:67\t\tXiaomi Communications Co Ltd\nE0:62:90\t\tJinan Jovision Science & Technology Co., Ltd.\nE0:63:DA\t\tUbiquiti Inc\nE0:63:E5\t\tSony Corporation\nE0:64:BB\t\tDigiView S.r.l.\nE0:66:78\t\tApple, Inc.\nE0:67:81\t\tDongguan Liesheng Electronic Co., Ltd.\nE0:67:B3\t\tShenzhen C-Data Technology Co., Ltd.\nE0:68:6D\t\tRaybased AB\nE0:68:EE\t\tPhyplus Microelectronics Limited\nE0:69:3A\t\tInnophase Inc.\nE0:69:95\t\tPegatron Corporation\nE0:69:BA\t\tCisco Systems, Inc\nE0:6A:05\t\tShenzhen YOUHUA Technology Co., Ltd\nE0:6C:4E\t\tShenzhen TINNO Mobile Technology Corp.\nE0:6C:A6\t\tCreotech Instruments S.A.\nE0:6C:C5\t\tHuawei Device Co., Ltd.\nE0:6C:F6\t\tESSENCORE limited\nE0:6D:17\t\tApple, Inc.\nE0:6D:18\t\tPioneercorporation\nE0:70:EA\t\tHP Inc.\nE0:72:0A\t\tShenzhen SuperElectron Technology Co.,Ltd.\nE0:73:5F\t\tNucom\nE0:73:E7\t\tHP Inc.\nE0:75:0A\t\tAlpsalpine Co,.Ltd\nE0:75:26\t\tChina Dragon Technology Limited\nE0:75:7D\t\tMotorola Mobility LLC, a Lenovo Company\nE0:75:AA\t\tBeijing Jingling Information System Technology Co., Ltd.\nE0:76:D0\t\tAMPAK Technology, Inc.\nE0:77:26\t\tHuawei Device Co., Ltd.\nE0:78:A3\t\tShanghai Winner Information Technology Co.,Inc\nE0:79:5E\t\tWuxi Xiaohu Technology Co.,Ltd.\nE0:79:8D\t\tSilicon Laboratories\nE0:79:C4\t\tiRay Technology Company Limited\nE0:7C:13\t\tzte corporation\nE0:7C:62\t\tWhistle Labs, Inc.\nE0:7D:EA\t\tTexas Instruments\nE0:7E:5F\t\tRenesas Electronics (Penang) Sdn. Bhd.\nE0:7F:53\t\tTechboard Srl\nE0:7F:88\t\tEVIDENCE Network SIA\nE0:80:6B\t\tXiaomi Communications Co Ltd\nE0:81:77\t\tGreenBytes, Inc.\nE0:84:F3\t\tHigh Grade Controls Corporation\nE0:85:4D\t\tLG Innotek\nE0:85:9A\t\tShenzhen Rf-Link Technology Co.,Ltd.\nE0:86:14\t\tInseego Wireless, Inc\nE0:87:B1\t\tNata-Info Ltd.\nE0:88:5D\t\tVantiva USA LLC\nE0:89:7E\t\tApple, Inc.\nE0:89:9D\t\tCisco Systems, Inc\nE0:8A:7E\t\tExponent\nE0:8C:3C\t\tCisco Systems, Inc\nE0:8E:3C\t\tAztech Electronics Pte Ltd\nE0:8F:4C\t\tIntel Corporate\nE0:8F:EC\t\tRepotec Co., Ltd.\nE0:91:3C\t\tKyeungin CNS Co., Ltd.\nE0:91:53\t\tXAVi Technologies Corp.\nE0:91:F5\t\tNetgear\nE0:92:5C\t\tApple, Inc.\nE0:92:8F\t\tTexas Instruments\nE0:92:A7\t\tFeitian Technologies Co., Ltd\nE0:94:67\t\tIntel Corporate\nE0:95:79\t\tORTHOsoft inc, d/b/a Zimmer CAS\nE0:95:FF\t\tInfinix mobility limited\nE0:97:96\t\tHuawei Technologies Co.,Ltd\nE0:97:F2\t\tAtomax Inc.\nE0:98:06\t\tEspressif Inc.\nE0:98:61\t\tMotorola Mobility LLC, a Lenovo Company\nE0:99:71\t\tSamsung Electronics Co.,Ltd\nE0:9B:27\t\tCiena Corporation\nE0:9C:8D\t\tSeakeeper, Inc.\nE0:9C:E5\t\tShanghai Tricheer Technology Co.,Ltd.\nE0:9D:13\t\tSamsung Electronics Co.,Ltd\nE0:9D:31\t\tIntel Corporate\nE0:9D:73\t\tMellanox Technologies, Inc.\nE0:9D:B8\t\tPlanex Communications Inc.\nE0:9D:FA\t\tWanan Hongsheng Electronic Co.Ltd\nE0:9F:2A\t\tIton Technology Corp.\nE0:A1:29\t\tExtreme Networks Headquarters\nE0:A1:98\t\tNOJA Power Switchgear Pty Ltd\nE0:A1:CE\t\tzte corporation\nE0:A1:D7\t\tSfr\nE0:A2:58\t\tWanbang Digital Energy Co.,Ltd\nE0:A2:5A\t\tShanghai Mo xiang Network Technology CO.,ltd\nE0:A3:0F\t\tPevco\nE0:A3:AC\t\tHuawei Technologies Co.,Ltd\nE0:A4:98\t\tShenzhen Orfa Tech Co.,Ltd\nE0:A5:09\t\tBitmain Technologies Inc\nE0:A6:70\t\tNokia Corporation\nE0:A7:00\t\tVerkada Inc\nE0:A8:B8\t\tLe Shi Zhi Xin Electronic Technology (Tianjin) Limited\nE0:AA:96\t\tSamsung Electronics Co.,Ltd\nE0:AA:B0\t\tSuntaili Enterprise Co. Ltd,\nE0:AA:DB\t\tNanjing PANENG Technology Development Co.,Ltd\nE0:AB:FE\t\tOrb Networks, Inc.\nE0:AC:CB\t\tApple, Inc.\nE0:AC:F1\t\tCisco Systems, Inc\nE0:AD:9B\t\tHuawei Technologies Co.,Ltd\nE0:AE:5E\t\tAlpsalpine Co,.Ltd\nE0:AE:A2\t\tHuawei Technologies Co.,Ltd\nE0:AE:B2\t\tBender GmbH & Co.KG\nE0:AE:ED\t\tLoenk\nE0:AF:4B\t\tPluribus Networks, Inc.\nE0:AF:4F\t\tDeutsche Telekom AG\nE0:B2:60\t\tTeno Network Technologies Company Limited\nE0:B2:F1\t\tFn-Link Technology Limited\nE0:B5:2D\t\tApple, Inc.\nE0:B5:5F\t\tApple, Inc.\nE0:B6:55\t\tBeijing Xiaomi Electronics Co., Ltd.\nE0:B6:68\t\tzte corporation\nE0:B6:F5\t\tIEEE Registration Authority\nE0:B6:F5:00:00:00/28\tBeSTAR Corporation\nE0:B6:F5:10:00:00/28\tStart Today Co.,Ltd.\nE0:B6:F5:20:00:00/28\tShanghai- British Information Technology Co., Ltd\nE0:B6:F5:30:00:00/28\tHuizhou GISUN Industrial CO. LTD\nE0:B6:F5:40:00:00/28\tAgora\nE0:B6:F5:50:00:00/28\tShenzhen Civicom Technology Co.,Limited\nE0:B6:F5:60:00:00/28\tPOMCube Inc.\nE0:B6:F5:70:00:00/28\tShenzhen Xrinda Technology Ltd\nE0:B6:F5:80:00:00/28\tYuneec International（China）Co.，Ltd\nE0:B6:F5:90:00:00/28\tMotiveprime Consumer Electronics Pvt Ltd\nE0:B6:F5:A0:00:00/28\tFolksam AB\nE0:B6:F5:B0:00:00/28\tMoog Crossbow\nE0:B6:F5:C0:00:00/28\tfunktel GmbH\nE0:B6:F5:D0:00:00/28\tItel Mobile Limited\nE0:B6:F5:E0:00:00/28\tAdvatek Lighting Pty Ltd\nE0:B7:0A\t\tCommscope\nE0:B7:2E\t\tShenZhen Qualmesh Technology Co.,Ltd.\nE0:B7:63\t\tBosch Automotive Products (Suzhou) Co., Ltd. Changzhou Branch\nE0:B7:B1\t\tCommscope\nE0:B9:4D\t\tShenzhen Bilian Electronic Co.，Ltd\nE0:B9:8A\t\tShenzhen Taike industrial automation company,Ltd\nE0:B9:A5\t\tAzureWave Technology Inc.\nE0:B9:BA\t\tApple, Inc.\nE0:B9:E5\t\tTechnicolor Delivery Technologies Belgium NV\nE0:BA:AD\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nE0:BA:B4\t\tArrcus, Inc\nE0:BB:0C\t\tSynertau LLC\nE0:BB:9E\t\tSeiko Epson Corporation\nE0:BC:43\t\tC2 Microsystems, Inc.\nE0:BD:A0\t\tApple, Inc.\nE0:BE:03\t\tLite-On Network Communication (Dongguan) Limited\nE0:BF:B2\t\tApple, Inc.\nE0:C0:D1\t\tCK Telecom (Shenzhen) Limited\nE0:C2:50\t\tNetgear\nE0:C2:64\t\tIntel Corporate\nE0:C2:86\t\tAisai Communication Technology Co., Ltd.\nE0:C2:9E\t\tzte corporation\nE0:C2:B7\t\tMasimo Corporation\nE0:C3:77\t\tSamsung Electronics Co.,Ltd\nE0:C3:EA\t\tApple, Inc.\nE0:C3:F3\t\tzte corporation\nE0:C5:8F\t\tChina Mobile IOT Company Limited\nE0:C6:3C\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nE0:C6:B3\t\tMilDef AB\nE0:C7:67\t\tApple, Inc.\nE0:C7:9D\t\tTexas Instruments\nE0:C8:6A\t\tSHENZHEN TW-SCIE Co., Ltd\nE0:C9:22\t\tJireh Energy Tech., Ltd.\nE0:C9:7A\t\tApple, Inc.\nE0:CA:3C\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nE0:CA:4D\t\tShenzhen Unistar Communication Co.,LTD\nE0:CA:94\t\tAskey Computer Corp\nE0:CB:19\t\tNokia\nE0:CB:1D\t\tAmazon Technologies Inc.\nE0:CB:4E\t\tASUSTek COMPUTER INC.\nE0:CB:56\t\tShenzhen iComm Semiconductor CO.,LTD\nE0:CB:BC\t\tCisco Meraki\nE0:CB:EE\t\tSamsung Electronics Co.,Ltd\nE0:CC:7A\t\tHuawei Technologies Co.,Ltd\nE0:CC:F8\t\tXiaomi Communications Co Ltd\nE0:CD:FD\t\tBeijing E3Control Technology Co, LTD\nE0:CE:C3\t\tAskey Computer Corp\nE0:CF:2D\t\tGemintek Corporation\nE0:D0:45\t\tIntel Corporate\nE0:D0:83\t\tSamsung Electronics Co.,Ltd\nE0:D1:0A\t\tKatoudenkikougyousyo co ltd\nE0:D1:73\t\tCisco Systems, Inc\nE0:D1:E6\t\tAliph dba Jawbone\nE0:D3:1A\t\tEQUES Technology Co., Limited\nE0:D3:62\t\tTP-Link Systems Inc.\nE0:D3:B4\t\tCisco Meraki\nE0:D4:62\t\tHuawei Device Co., Ltd.\nE0:D4:64\t\tIntel Corporate\nE0:D4:E8\t\tIntel Corporate\nE0:D5:5D\t\tIntel Corporate\nE0:D5:5E\t\tGiga-Byte Technology Co.,Ltd.\nE0:D7:38\t\tWireStar Networks\nE0:D7:BA\t\tTexas Instruments\nE0:D8:48\t\tDell Inc.\nE0:D8:C4\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\nE0:D9:A2\t\tHippih aps\nE0:D9:E3\t\tEltex Enterprise Ltd.\nE0:DA:90\t\tHuawei Technologies Co.,Ltd\nE0:DA:D7\t\tzte corporation\nE0:DA:DC\t\tJVC KENWOOD Corporation\nE0:DB:10\t\tSamsung Electronics Co.,Ltd\nE0:DB:55\t\tDell Inc.\nE0:DB:88\t\tOpen Standard Digital-IF Interface for SATCOM Systems\nE0:DB:D1\t\tVantiva USA LLC\nE0:DC:A0\t\tSiemens Industrial Automation Products Ltd., Chengdu\nE0:DC:FF\t\tXiaomi Communications Co Ltd\nE0:DD:C0\t\tvivo Mobile Communication Co., Ltd.\nE0:DF:13\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nE0:E0:C2\t\tChina Mobile Group Device Co.,Ltd.\nE0:E0:FC\t\tHuawei Device Co., Ltd.\nE0:E1:A9\t\tShenzhen Four Seas Global Link Network Technology Co., Ltd.\nE0:E2:58\t\tIntel Corporate\nE0:E2:D1\t\tBeijing Netswift Technology Co.,Ltd.\nE0:E2:E6\t\tEspressif Inc.\nE0:E3:7C\t\tHuawei Device Co., Ltd.\nE0:E5:CF\t\tTexas Instruments\nE0:E6:2E\t\tTCT mobile ltd\nE0:E6:31\t\tSnb Technologies Limited\nE0:E6:56\t\tNethesis  srl\nE0:E6:E3\t\tTeamF1 Networks Pvt Limited\nE0:E7:51\t\tNintendo Co., Ltd.\nE0:E7:BB\t\tNureva, Inc.\nE0:E8:BB\t\tUnicom Vsens Telecommunications Co., Ltd.\nE0:E8:E6\t\tShenzhen C-Data Technology Co., Ltd.\nE0:E8:E8\t\tOlive Telecommunication Pvt. Ltd\nE0:EB:40\t\tApple, Inc.\nE0:EB:62\t\tShanghai Hulu Devices Co., Ltd\nE0:ED:1A\t\tvastriver Technology Co., Ltd\nE0:ED:C7\t\tShenzhen Friendcom Technology Development Co., Ltd\nE0:EE:1B\t\tPanasonic Automotive Systems Company of America\nE0:EF:02\t\tChengdu Quanjing Intelligent Technology Co.,Ltd\nE0:EF:25\t\tLintes Technology Co., Ltd.\nE0:EF:BF\t\tNintendo Co.,Ltd\nE0:F2:11\t\tDigitalwatt\nE0:F3:18\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nE0:F3:25\t\tElkor Technologies Inc.\nE0:F3:30\t\tHuawei Technologies Co.,Ltd\nE0:F3:79\t\tVaddio\nE0:F4:42\t\tHuawei Device Co., Ltd.\nE0:F5:C6\t\tApple, Inc.\nE0:F5:CA\t\tCheng Uei Precision Industry Co.,Ltd.\nE0:F6:2D\t\tJuniper Networks\nE0:F6:78\t\tFiberhome Telecommunication Technologies Co.,LTD\nE0:F6:B5\t\tNintendo Co.,Ltd\nE0:F7:28\t\tAmazon Technologies Inc.\nE0:F8:47\t\tApple, Inc.\nE0:F9:BE\t\tCloudena Corp.\nE0:FA:EC\t\tPlatan sp. z o.o. sp. k.\nE0:FF:F1\t\tTexas Instruments\nE0:FF:F7\t\tSoftiron Inc.\nE4:02:9B\t\tIntel Corporate\nE4:04:39\t\tTomTom Software Ltd\nE4:05:F8\t\tBytedance\nE4:06:BF\t\tSilicon Laboratories\nE4:07:2B\t\tHuawei Device Co., Ltd.\nE4:08:E7\t\tQuectel Wireless Solutions Co.,Ltd.\nE4:0A:16\t\tHuawei Technologies Co.,Ltd\nE4:0C:FD\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nE4:0D:36\t\tIntel Corporate\nE4:0D:3B\t\tEricsson AB\nE4:0E:EE\t\tHuawei Technologies Co.,Ltd\nE4:10:88\t\tSamsung Electronics Co.,Ltd\nE4:11:5B\t\tHewlett Packard\nE4:12:18\t\tShenZhen Rapoo Technology Co., Ltd.\nE4:12:1D\t\tSamsung Electronics Co.,Ltd\nE4:12:26\t\tContinental Automotive Romania SLR\nE4:12:89\t\ttopsystem GmbH\nE4:15:F6\t\tTexas Instruments\nE4:17:D8\t\t8Bitdo Technology Hk Limited\nE4:18:6B\t\tZyxel Communications Corporation\nE4:19:7F\t\teero inc.\nE4:19:C1\t\tHuawei Technologies Co.,Ltd\nE4:1A:1D\t\tNovea Energies\nE4:1A:2C\t\tZPE Systems, Inc.\nE4:1C:4B\t\tV2 Technology, Inc.\nE4:1D:2D\t\tMellanox Technologies, Inc.\nE4:1E:0A\t\tIEEE Registration Authority\nE4:1E:0A:00:00:00/28\tZavod № 423\nE4:1E:0A:10:00:00/28\tConnected Cars A/S\nE4:1E:0A:20:00:00/28\tIDvaco Private Limited\nE4:1E:0A:30:00:00/28\tAvast Software s.r.o.\nE4:1E:0A:40:00:00/28\tXPR Group\nE4:1E:0A:50:00:00/28\tAeroel srl\nE4:1E:0A:60:00:00/28\tSFC Energy AG\nE4:1E:0A:70:00:00/28\tTritium Pty Ltd\nE4:1E:0A:80:00:00/28\tSAGE Glass\nE4:1E:0A:90:00:00/28\tB Meters S.R.L.\nE4:1E:0A:A0:00:00/28\tFireAngel Safety Technology Ltd\nE4:1E:0A:B0:00:00/28\tSafety Vision, LLC\nE4:1E:0A:C0:00:00/28\tTeletask Belgium\nE4:1E:0A:D0:00:00/28\tROMO Wind A/S\nE4:1E:0A:E0:00:00/28\tShanghai LeXiang Technology Co., Ltd\nE4:1E:33\t\tContinental Automotive Technologies GmbH\nE4:1F:13\t\tIBM Corp\nE4:1F:7B\t\tCisco Systems, Inc\nE4:1F:D5\t\tIntel Corporate\nE4:1F:E9\t\tDunkermotoren GmbH\nE4:21:50\t\tShanghai Chint low voltage electrical technology Co.,Ltd.\nE4:22:A5\t\tPlantronics, Inc.\nE4:23:3C\t\tJuniper Networks\nE4:23:54\t\tShenzhen Fuzhi Software Technology Co.,Ltd\nE4:24:6C\t\tZhejiang Dahua Technology Co., Ltd.\nE4:25:E7\t\tApple, Inc.\nE4:25:E9\t\tColor-Chip\nE4:26:86\t\tDWnet Technologies(Suzhou) Corporation\nE4:26:8B\t\tHuawei Device Co., Ltd.\nE4:26:D5\t\tMotorola Mobility LLC, a Lenovo Company\nE4:27:61\t\tHonor Device Co., Ltd.\nE4:27:71\t\tSmartlabs\nE4:28:05\t\tPivotal Optics\nE4:28:A4\t\tPrama India Private Limited\nE4:29:3D\t\tShenzhen Sy-Fiber Optical Communication Technology.Co.,Ltd\nE4:2A:AC\t\tMicrosoft Corporation\nE4:2A:D3\t\tMagneti Marelli S.p.A. Powertrain\nE4:2B:34\t\tApple, Inc.\nE4:2B:79\t\tNokia\nE4:2C:56\t\tLilee Systems, Ltd.\nE4:2D:02\t\tTCT mobile ltd\nE4:2D:7B\t\tChina Mobile IOT Company Limited\nE4:2F:26\t\tFiberhome Telecommunication Technologies Co.,LTD\nE4:2F:56\t\tOptoMET GmbH\nE4:2F:F6\t\tUnicore communication Inc.\nE4:30:22\t\tHanwha Vision VietNam\nE4:32:CB\t\tSamsung Electronics Co.,Ltd\nE4:33:AE\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nE4:34:93\t\tHuawei Technologies Co.,Ltd\nE4:35:93\t\tHangzhou GoTo technology Co.Ltd\nE4:35:C8\t\tHuawei Technologies Co.,Ltd\nE4:35:FB\t\tSabre Technology (Hull) Ltd\nE4:37:9F\t\tCisco Systems, Inc\nE4:37:D7\t\tHenri Depaepe S.A.S.\nE4:38:19\t\tShenzhen Hi-Link Electronic CO.,Ltd.\nE4:38:7E\t\tCisco Systems, Inc\nE4:38:83\t\tUbiquiti Inc\nE4:38:8C\t\tDigital Products Limited\nE4:38:F2\t\tAdvantage Controls\nE4:3A:65\t\tMofiNetwork Inc\nE4:3A:6E\t\tShenzhen Zeroone Technology CO.,LTD\nE4:3B:C9\t\tHisense Visual Technology Co.,Ltd\nE4:3C:80\t\tUniversity of Oklahoma\nE4:3D:1A\t\tBroadcom Limited\nE4:3E:C6\t\tHuawei Technologies Co.,Ltd\nE4:3E:D7\t\tArcadyan Corporation\nE4:3F:A2\t\tWuxi DSP Technologies Inc.\nE4:40:97\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nE4:40:E2\t\tSamsung Electronics Co.,Ltd\nE4:41:22\t\tOnePlus Technology (Shenzhen) Co., Ltd\nE4:41:64\t\tNokia\nE4:41:D4\t\tvivo Mobile Communication Co., Ltd.\nE4:41:E6\t\tOttec Technology GmbH\nE4:42:A6\t\tIntel Corporate\nE4:43:4B\t\tDell Inc.\nE4:43:89\t\tApple, Inc.\nE4:44:E5\t\tExtreme Networks Headquarters\nE4:45:19\t\tBeijing Xiaomi Electronics Co.,Ltd\nE4:46:B0\t\tFujitsu Client Computing Limited\nE4:46:BD\t\tC&C Technic Taiwan Co., Ltd.\nE4:46:DA\t\tXiaomi Communications Co Ltd\nE4:47:90\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nE4:47:91\t\tIris ID Systems, Inc.\nE4:47:B3\t\tzte corporation\nE4:48:C7\t\tCisco SPVTG\nE4:4A:E0\t\tIntel Corporate\nE4:4C:6C\t\tShenzhen Guo Wei Electronic Co,. Ltd.\nE4:4C:C7\t\tIEEE Registration Authority\nE4:4C:C7:00:00:00/28\tAlert Alarm AB\nE4:4C:C7:10:00:00/28\tACS-Solutions GmbH\nE4:4C:C7:20:00:00/28\tDoowon Electronics & Telecom Co.,Ltd\nE4:4C:C7:30:00:00/28\tJSC \"Svyaz Inginiring M\"\nE4:4C:C7:40:00:00/28\tBeijing Zhongchuangwei Nanjing Quantum Communication Technology Co., Ltd.\nE4:4C:C7:50:00:00/28\tCe Labs, Llc\nE4:4C:C7:60:00:00/28\tHangzhou Ole-Systems Co., Ltd\nE4:4C:C7:70:00:00/28\tChannel Enterprises (HK) Ltd.\nE4:4C:C7:80:00:00/28\tIag Group Ltd\nE4:4C:C7:90:00:00/28\tOttomate International Pvt. Ltd.\nE4:4C:C7:A0:00:00/28\tMuzik Inc\nE4:4C:C7:B0:00:00/28\tSmallHD\nE4:4C:C7:C0:00:00/28\tEPS Bio\nE4:4C:C7:D0:00:00/28\tTelo Systems Limitd\nE4:4C:C7:E0:00:00/28\tFLK information security technology Co,. Ltd\nE4:4E:12\t\tzte corporation\nE4:4E:18\t\tGardasoft VisionLimited\nE4:4E:2D\t\tCisco Systems, Inc\nE4:4E:76\t\tChampiontech  Enterprise (Shenzhen) Inc\nE4:4F:29\t\tMA Lighting Technology GmbH\nE4:4F:5F\t\tEDS Elektronik Destek San.Tic.Ltd.Sti\nE4:50:9A\t\tHW Communications Ltd\nE4:50:EB\t\tApple, Inc.\nE4:51:A9\t\tNanjing Xinlian Electronics Co., Ltd\nE4:52:1E\t\tTexas Instruments\nE4:54:E5\t\tHuawei Device Co., Ltd.\nE4:54:E8\t\tDell Inc.\nE4:55:A8\t\tCisco Meraki\nE4:55:EA\t\tDedicated Computing\nE4:56:14\t\tSuttle Apparatus\nE4:56:AC\t\tSilicon Laboratories\nE4:57:40\t\tCommscope\nE4:57:68\t\tvivo Mobile Communication Co., Ltd.\nE4:57:A8\t\tStuart Manufacturing, Inc.\nE4:58:B8\t\tSamsung Electronics Co.,Ltd\nE4:58:BC\t\tBose Corporation\nE4:58:E7\t\tSamsung Electronics Co.,Ltd\nE4:5A:A2\t\tvivo Mobile Communication Co., Ltd.\nE4:5A:D4\t\tEltex Enterprise Ltd.\nE4:5B:B3\t\tzte corporation\nE4:5D:37\t\tJuniper Networks\nE4:5D:39\t\tTexas Instruments\nE4:5D:51\t\tSfr\nE4:5D:52\t\tAvaya Inc\nE4:5D:75\t\tSamsung Electronics Co.,Ltd\nE4:5E:1B\t\tGoogle, Inc.\nE4:5E:37\t\tIntel Corporate\nE4:5E:CC\t\tJuniper Networks\nE4:5F:01\t\tRaspberry Pi Trading Ltd\nE4:60:17\t\tIntel Corporate\nE4:60:4D\t\tzte corporation\nE4:60:59\t\tPingtek Co., Ltd.\nE4:61:F4\t\tshenzhen worldelite electronics co., LTD\nE4:62:51\t\tHao Cheng Group Limited\nE4:62:C4\t\tCisco Systems, Inc\nE4:64:47\t\tEM Microelectronic\nE4:64:49\t\tCommscope\nE4:65:64\t\tShenzhen Ktc Technology Co.,Ltd\nE4:65:B8\t\tEspressif Inc.\nE4:66:AB\t\tzte corporation\nE4:66:E5\t\tNanjing Qinheng Microelectronics Co., Ltd.\nE4:67:1E\t\tSHEN ZHEN NUO XIN CHENG TECHNOLOGY co., Ltd.\nE4:67:A6\t\tBSH Hausgeräte GmbH\nE4:67:BA\t\tDanish Interpretation Systems A/S\nE4:67:DD\t\tEla Innovation\nE4:68:A3\t\tHuawei Technologies Co.,Ltd\nE4:69:5A\t\tDictum Health, Inc.\nE4:6A:35\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nE4:6C:21\t\tmessMa GmbH\nE4:6C:D1\t\tCalix Inc.\nE4:6D:7F\t\tCiena Corporation\nE4:6F:13\t\tD-Link International\nE4:70:B8\t\tIntel Corporate\nE4:71:85\t\tSecurifi Ltd\nE4:72:E2\t\tHuawei Technologies Co.,Ltd\nE4:73:05\t\tShenzhen INVT Electric CO.,Ltd\nE4:74:50\t\tShenzhen Grandsun Electronic Co.,Ltd.\nE4:75:1E\t\tGetinge Sterilization AB\nE4:75:DC\t\tArcadyan Corporation\nE4:76:84\t\tApple, Inc.\nE4:77:23\t\tzte corporation\nE4:77:27\t\tHuawei Technologies Co.,Ltd\nE4:77:6B\t\tAartesys Ag\nE4:77:D4\t\tMinrray Industry Co.,Ltd\nE4:78:76\t\tArista Networks\nE4:7A:2C\t\tSz Dji Technology Co.,Ltd\nE4:7B:3F\t\tBeijing Co-Cloud Technology Ltd.\nE4:7C:65\t\tSunstar Communication Technology  Co., Ltd\nE4:7C:F9\t\tSamsung Electronics Co.,Ltd\nE4:7D:5A\t\tBeijing Hanbang Technology Corp.\nE4:7D:BD\t\tSamsung Electronics Co.,Ltd\nE4:7D:EB\t\tShanghai Notion Information Technology CO.,LTD.\nE4:7E:66\t\tHuawei Technologies Co.,Ltd\nE4:7E:9A\t\tzte corporation\nE4:7F:3C\t\tzte corporation\nE4:7F:B2\t\tFujitsu Limited\nE4:81:84\t\tNokia\nE4:81:B3\t\tShenzhen ACT Industrial Co.,Ltd.\nE4:82:10\t\tHuawei Technologies Co.,Ltd\nE4:82:CC\t\tJumptronic GmbH\nE4:82:FF\t\tEcliptic Enterprises Corp\nE4:83:26\t\tHuawei Technologies Co.,Ltd\nE4:83:99\t\tCommscope\nE4:84:29\t\tNew H3C Technologies Co., Ltd\nE4:84:2B\t\tHangzhou Softel Optic Co., Ltd\nE4:84:D3\t\tXiaomi Communications Co Ltd\nE4:85:01\t\tGeberit International AG\nE4:89:CA\t\tCisco Systems, Inc\nE4:8A:93\t\tHisense Visual Technology Co.,Ltd\nE4:8A:D5\t\tRf Window Co., Ltd.\nE4:8B:7F\t\tApple, Inc.\nE4:8C:0F\t\tDiscovery Insure\nE4:8C:73\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nE4:8D:8C\t\tRouterboard.com\nE4:8E:10\t\tCig Shanghai Co Ltd\nE4:8E:BB\t\tRockwell Automation\nE4:8F:1D\t\tHuawei Device Co., Ltd.\nE4:8F:34\t\tVodafone Italia S.p.A.\nE4:8F:65\t\tYelatma Instrument Making Enterprise, JSC\nE4:90:2A\t\tHuawei Technologies Co.,Ltd\nE4:90:69\t\tRockwell Automation\nE4:90:7E\t\tMotorola Mobility LLC, a Lenovo Company\nE4:90:FD\t\tApple, Inc.\nE4:92:2A\t\tDbg Holdings Limited\nE4:92:82\t\tSamsung Electronics Co.,Ltd\nE4:92:E7\t\tGridlink Tech. Co.,Ltd.\nE4:92:FB\t\tSamsung Electronics Co.,Ltd\nE4:93:6A\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nE4:95:6E\t\tIEEE Registration Authority\nE4:95:6E:00:00:00/28\tSMC Networks, Inc\nE4:95:6E:10:00:00/28\tTband srl\nE4:95:6E:20:00:00/28\tShanghai Hoping Technology Co., Ltd.\nE4:95:6E:30:00:00/28\tShanghai DGE Co., Ltd\nE4:95:6E:40:00:00/28\tGuang Lian Zhi Tong Technology Limited\nE4:95:6E:50:00:00/28\tBucher Automation Budapest\nE4:95:6E:60:00:00/28\tShenzhen Joyetech Electronics Co., Ltd.\nE4:95:6E:70:00:00/28\tNationalchipKorea\nE4:95:6E:80:00:00/28\tPT.MLWTelecom\nE4:95:6E:90:00:00/28\teZeLink LLC\nE4:95:6E:A0:00:00/28\tRed Point Positioning, Corp.\nE4:95:6E:B0:00:00/28\tiConservo Inc\nE4:95:6E:C0:00:00/28\tShenzhen Arronna Telecom Co.,Ltd\nE4:95:6E:D0:00:00/28\tShanghai Tieda Telecommunications Equipment Co.,LTD.\nE4:95:6E:E0:00:00/28\tTacom Projetos Bilhetagem Inteligente ltda\nE4:95:6E:F0:00:00/28\tPrivate\nE4:96:52\t\tvivo Mobile Communication Co., Ltd.\nE4:96:AE\t\tALTOGRAPHICS Inc.\nE4:97:F0\t\tShanghai VLC Technologies Ltd. Co.\nE4:98:BB\t\tPhyplus Microelectronics Limited\nE4:98:D1\t\tMicrosoft Mobile Oy\nE4:98:D6\t\tApple, Inc.\nE4:99:5F\t\tHuawei Technologies Co.,Ltd\nE4:9A:79\t\tApple, Inc.\nE4:9A:DC\t\tApple, Inc.\nE4:9C:67\t\tApple, Inc.\nE4:9D:73\t\tEdgecore Networks Corporation\nE4:9E:12\t\tFreebox Sas\nE4:9F:1E\t\tCommscope\nE4:9F:7D\t\tSamsung Electronics Co.,Ltd\nE4:A1:E6\t\tAlcatel-Lucent Shanghai Bell Co., Ltd\nE4:A3:2F\t\tShanghai Artimen Technology Co., Ltd.\nE4:A3:87\t\tControl Solutions LLC\nE4:A4:1C\t\tCisco Systems, Inc\nE4:A4:30\t\tSamsung Electronics Co.,Ltd\nE4:A4:71\t\tIntel Corporate\nE4:A5:EF\t\tTron Link Electronics Co., Ltd.\nE4:A6:34\t\tUniversal Electronics, Inc.\nE4:A7:49\t\tPalo Alto Networks\nE4:A7:A0\t\tIntel Corporate\nE4:A7:C5\t\tHuawei Technologies Co.,Ltd\nE4:A7:D0\t\tHuawei Technologies Co.,Ltd\nE4:A7:FD\t\tCellco Partnership\nE4:A8:B6\t\tHuawei Technologies Co.,Ltd\nE4:A8:DF\t\tCompal Information (Kunshan) Co., Ltd.\nE4:AA:5D\t\tCisco Systems, Inc\nE4:AA:E4\t\tXiaomi Communications Co Ltd\nE4:AA:EA\t\tLiteon Technology Corporation\nE4:AA:EC\t\tTianjin Hualai Technology Co., Ltd\nE4:AB:46\t\tUAB Selteka\nE4:AB:89\t\tMitraStar Technology Corp.\nE4:AD:7D\t\tSCL Elements\nE4:AF:A1\t\tHes-So\nE4:B0:05\t\tBeijing IQIYI Science & Technology Co., Ltd.\nE4:B0:21\t\tSamsung Electronics Co.,Ltd\nE4:B0:63\t\tEspressif Inc.\nE4:B1:07\t\tHuawei Device Co., Ltd.\nE4:B2:24\t\tHuawei Technologies Co.,Ltd\nE4:B2:FB\t\tApple, Inc.\nE4:B3:18\t\tIntel Corporate\nE4:B3:23\t\tEspressif Inc.\nE4:B5:03\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nE4:B5:55\t\tHuawei Device Co., Ltd.\nE4:B6:33\t\tWuxi Stars Microsystem Technology Co., Ltd\nE4:B7:31\t\tHangzhou Advance IOT Connectivity System Co., Ltd.\nE4:B9:7A\t\tDell Inc.\nE4:BA:D9\t\t360 Fly Inc.\nE4:BC:96\t\tVersuni\nE4:BC:AA\t\tXiaomi Communications Co Ltd\nE4:BD:4B\t\tzte corporation\nE4:BE:ED\t\tNetis Technology Co., Ltd.\nE4:BE:FB\t\tHuawei Technologies Co.,Ltd\nE4:BF:FA\t\tVantiva USA LLC\nE4:C0:CC\t\tChina Mobile Group Device Co.,Ltd.\nE4:C0:E2\t\tSagemcom Broadband SAS\nE4:C1:46\t\tObjetivos y Servicios de Valor A\nE4:C1:F1\t\tSHENZHEN SPOTMAU INFORMATION TECHNOLIGY CO., Ltd\nE4:C2:D1\t\tHuawei Technologies Co.,Ltd\nE4:C3:2A\t\tTp-Link Technologies Co.,Ltd.\nE4:C4:83\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nE4:C6:2B\t\tAirware\nE4:C6:3D\t\tApple, Inc.\nE4:C6:E6\t\tMophie, LLC\nE4:C7:22\t\tCisco Systems, Inc\nE4:C7:67\t\tIntel Corporate\nE4:C7:70\t\tRaisecom Technology CO., LTD\nE4:C8:01\t\tBLU Products Inc\nE4:C8:06\t\tCeiec Electric Technology Inc.\nE4:C9:0B\t\tRadwin\nE4:CA:12\t\tzte corporation\nE4:CB:59\t\tBeijing Loveair Science and Technology Co. Ltd.\nE4:CC:9D\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\nE4:CD:A7\t\tzte corporation\nE4:CE:02\t\tWyreStorm Technologies Ltd\nE4:CE:70\t\tHealth & Life co., Ltd.\nE4:CE:8F\t\tApple, Inc.\nE4:D1:24\t\tMojo Networks, Inc.\nE4:D3:32\t\tTp-Link Technologies Co.,Ltd.\nE4:D3:73\t\tHuawei Technologies Co.,Ltd\nE4:D3:AA\t\tFcnt Llc\nE4:D3:F1\t\tCisco Systems, Inc\nE4:D5:3D\t\tHon Hai Precision Ind. Co.,Ltd.\nE4:D5:8B\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nE4:D7:1D\t\tOraya Therapeutics\nE4:DA:DF\t\tTaicang T&W Electronics\nE4:DB:6D\t\tBeijing Xiaomi Electronics Co., Ltd.\nE4:DB:AE\t\tExtreme Networks Headquarters\nE4:DC:43\t\tHuawei Device Co., Ltd.\nE4:DC:5F\t\tCofractal, Inc.\nE4:DC:CC\t\tHuawei Technologies Co.,Ltd\nE4:DD:79\t\tEn-Vision America, Inc.\nE4:DE:40\t\tHewlett Packard Enterprise\nE4:E0:A6\t\tApple, Inc.\nE4:E0:C5\t\tSamsung Electronics Co.,Ltd\nE4:E1:12\t\tTexas Instruments\nE4:E1:30\t\tTCT mobile ltd\nE4:E2:6C\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nE4:E3:3D\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\nE4:E4:09\t\tLeifheit Ag\nE4:E4:AB\t\tApple, Inc.\nE4:E6:08\t\tKiwibit Inc.\nE4:E6:6C\t\tTiandy Technologies Co.,LTD\nE4:E7:49\t\tHewlett Packard\nE4:EA:83\t\tShenzhen Gongjin Electronics Co.,Lt\nE4:EC:10\t\tNokia Corporation\nE4:EC:E8\t\tSamsung Electronics Co.,Ltd\nE4:EE:FD\t\tMR&D Manufacturing\nE4:F0:04\t\tDell Inc.\nE4:F0:42\t\tGoogle, Inc.\nE4:F1:4C\t\tPrivate\nE4:F1:D4\t\tvivo Mobile Communication Co., Ltd.\nE4:F2:7C\t\tJuniper Networks\nE4:F3:27\t\tAtol Llc\nE4:F3:65\t\tTime-O-Matic, Inc.\nE4:F3:C4\t\tSamsung Electronics Co.,Ltd\nE4:F3:E3\t\tShanghai iComhome Co.,Ltd.\nE4:F3:E8\t\tShenzhen SuperElectron Technology Co.,Ltd.\nE4:F3:F5\t\tShenzhen Mercury Communication Technologies Co.,Ltd.\nE4:F4:C6\t\tNetgear\nE4:F5:8E\t\tSchneider Electric USA\nE4:F7:5B\t\tCommscope\nE4:F7:A1\t\tDatafox GmbH\nE4:F8:9C\t\tIntel Corporate\nE4:F8:BE\t\tTecno Mobile Limited\nE4:F8:EF\t\tSamsung Electronics Co.,Ltd\nE4:F9:39\t\tMinxon Hotel Technology INC.\nE4:FA:1D\t\tPAD Peripheral Advanced Design Inc.\nE4:FA:5B\t\tTexas Instruments\nE4:FA:C4\t\tTP-Link Systems Inc\nE4:FA:ED\t\tSamsung Electronics Co.,Ltd\nE4:FA:FD\t\tIntel Corporate\nE4:FB:5D\t\tHuawei Technologies Co.,Ltd\nE4:FB:8F\t\tMobiwire Mobiles (Ningbo) Co.,Ltd\nE4:FC:82\t\tJuniper Networks\nE4:FD:45\t\tIntel Corporate\nE4:FD:8C\t\tExtreme Networks Headquarters\nE4:FD:A1\t\tHuawei Technologies Co.,Ltd\nE4:FE:43\t\tBeijing Xiaomi Mobile Software Co., Ltd\nE4:FE:D9\t\tEDMI Europe Ltd\nE4:FF:DD\t\tElectron India\nE8:00:36\t\tBefs co,. ltd\nE8:01:15\t\tCOOCAA Network Technology CO.,TD.\nE8:01:8D\t\tFiberhome Telecommunication Technologies Co.,LTD\nE8:03:9A\t\tSamsung Electronics Co.,Ltd\nE8:04:0B\t\tApple, Inc.\nE8:04:10\t\tPrivate\nE8:04:62\t\tCisco Systems, Inc\nE8:04:F3\t\tThroughtek Co., Ltd.\nE8:05:6D\t\tNortel Networks\nE8:05:DC\t\tVerifone, Inc.\nE8:06:88\t\tApple, Inc.\nE8:06:90\t\tEspressif Inc.\nE8:06:EB\t\tShieldSOS LLC\nE8:07:34\t\tChampion Optical Network Engineering, LLC\nE8:07:BF\t\tShenzhen Boomtech Industry Co.,Ltd\nE8:08:8B\t\tHuawei Technologies Co.,Ltd\nE8:08:AF\t\tzte corporation\nE8:09:45\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\nE8:09:59\t\tGuoguang Electric Co.,Ltd\nE8:0A:B9\t\tCisco Systems, Inc\nE8:0A:EC\t\tJiangsu Hengtong Optic-Electric Co., LTD\nE8:0B:13\t\tAkib Systems Taiwan, INC\nE8:0C:38\t\tDaeyoung Information System Co., Ltd\nE8:0C:75\t\tSyncbak, Inc.\nE8:0F:C8\t\tUniversal Electronics, Inc.\nE8:10:2E\t\tReally Simple Software, Inc\nE8:10:98\t\tHewlett Packard Enterprise\nE8:11:32\t\tSamsung Electronics Co.,Ltd\nE8:11:CA\t\tShandong Kaer Electric.Co.,Ltd\nE8:12:2D\t\tUnionman Technology Co.,Ltd\nE8:13:24\t\tGuangZhou Bonsoninfo System CO.,LTD\nE8:13:63\t\tComstock RD, Inc.\nE8:13:67\t\tAIRSOUND Inc.\nE8:13:6E\t\tHuawei Technologies Co.,Ltd\nE8:14:99\t\tYoqu Technology(Shenzhen)Co.,Ltd.\nE8:15:0E\t\tNokia Corporation\nE8:16:2B\t\tIDEO Security Co., Ltd.\nE8:16:56\t\tHangzhou BroadLink Technology Co.,Ltd\nE8:17:11\t\tShenzhen Vipstech Co., Ltd\nE8:17:FC\t\tFujitsu Limited\nE8:18:63\t\tIEEE Registration Authority\nE8:18:63:00:00:00/28\tDigiMagus Technology (Shenzhen) Co., Ltd\nE8:18:63:10:00:00/28\tclabsys\nE8:18:63:20:00:00/28\tAVCON Information Technology Co.,Ltd\nE8:18:63:30:00:00/28\tDongGuan Pengxun Electronics Technology Co., Ltd.\nE8:18:63:40:00:00/28\tGuangzhou Tianyi Electronics Co., Ltd\nE8:18:63:50:00:00/28\tWetek Electronics Limited\nE8:18:63:60:00:00/28\tArtech Solution Co.,Ltd\nE8:18:63:70:00:00/28\tSiliconcube\nE8:18:63:90:00:00/28\tBSM Wireless Inc.\nE8:18:63:A0:00:00/28\tJDM Mobile Internet Solution(Shanghai) Co., Ltd.\nE8:18:63:B0:00:00/28\tProtek Electronics Group Co.,LTD\nE8:18:63:C0:00:00/28\tShenzhen Hipad Telecommunication Technology Co.,Ltd\nE8:18:63:D0:00:00/28\tDigital Dynamics, Inc.\nE8:18:63:E0:00:00/28\tAcopian Technical Company\nE8:18:63:F0:00:00/28\tPrivate\nE8:1A:58\t\tTechnologic Systems\nE8:1A:AC\t\tORFEO SOUNDWORKS Inc.\nE8:1B:4B\t\tamnimo Inc.\nE8:1B:69\t\tSercomm Corporation.\nE8:1C:A5\t\tHewlett Packard Enterprise\nE8:1C:BA\t\tFortinet, Inc.\nE8:1C:D8\t\tApple, Inc.\nE8:1D:A8\t\tRuckus Wireless\nE8:1D:EE\t\ti-TEK RFID\nE8:1E:92\t\tHuawei Device Co., Ltd.\nE8:20:E2\t\tHUMAX Co., Ltd.\nE8:22:81\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nE8:22:B8\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nE8:24:04\t\tQuectel Wireless Solutions Co.,Ltd.\nE8:24:A6\t\tJuniper Networks\nE8:25:87\t\tShenzhen Chilink IoT Technology Co., Ltd.\nE8:26:89\t\tHewlett Packard Enterprise\nE8:26:8D\t\tShenzhen SuperElectron Technology Co.,Ltd.\nE8:26:B6\t\tCompanies House to GlucoRx Technologies Ltd.\nE8:26:CF\t\tShenzhen Jingxun Technology Co., Ltd.\nE8:27:25\t\tAxis Communications AB\nE8:28:77\t\tTMY Co., Ltd.\nE8:28:8D\t\tHuawei Device Co., Ltd.\nE8:28:C1\t\tEltex Enterprise Ltd.\nE8:28:D5\t\tCots Technology\nE8:2A:44\t\tLiteon Technology Corporation\nE8:2A:EA\t\tIntel Corporate\nE8:2B:C5\t\tHuawei Device Co., Ltd.\nE8:2C:6D\t\tSmartRG, Inc.\nE8:2E:0C\t\tNETINT Technologies Inc.\nE8:2E:24\t\tOut of the Fog Research LLC\nE8:31:CD\t\tEspressif Inc.\nE8:33:0D\t\tXaptec GmbH\nE8:33:81\t\tCommscope\nE8:34:3E\t\tBeijing Infosec Technologies Co., LTD.\nE8:36:17\t\tApple, Inc.\nE8:36:1D\t\tSense Labs, Inc.\nE8:37:7A\t\tZyxel Communications Corporation\nE8:38:A0\t\tVizio, Inc\nE8:39:35\t\tHewlett Packard\nE8:39:DF\t\tAskey Computer Corp\nE8:3A:12\t\tSamsung Electronics Co.,Ltd\nE8:3A:4B\t\tChina Mobile Group Device Co.,Ltd.\nE8:3A:97\t\tToshiba Corporation\nE8:3E:B6\t\tRim\nE8:3E:FB\t\tGeodesic Ltd.\nE8:3E:FC\t\tCommscope\nE8:3F:67\t\tHuawei Device Co., Ltd.\nE8:40:40\t\tCisco Systems, Inc\nE8:40:F2\t\tPegatron Corporation\nE8:43:68\t\tzte corporation\nE8:43:B6\t\tQNAP Systems, Inc.\nE8:44:7E\t\tBitdefender SRL\nE8:45:8B\t\tMitraStar Technology Corp.\nE8:45:EB\t\tKohler Ventures, Inc.\nE8:47:27\t\tQuectel Wireless Solutions Co.,Ltd.\nE8:47:3A\t\tHon Hai Precision Industry Co.,LTD\nE8:48:1F\t\tAdvanced Automotive Antennas\nE8:48:B8\t\tTP-Link Systems Inc\nE8:49:43\t\tYUGE Information technology Co. Ltd\nE8:4A:54\t\tBeijing Xiaomi Mobile Software Co., Ltd\nE8:4A:78\t\tApple, Inc.\nE8:4C:4A\t\tAmazon Technologies Inc.\nE8:4C:56\t\tIntercept Services Limited\nE8:4D:74\t\tHuawei Technologies Co.,Ltd\nE8:4D:D0\t\tHuawei Technologies Co.,Ltd\nE8:4D:EC\t\tXerox Corporation\nE8:4E:06\t\tEdup International (Hk) Co., Ltd\nE8:4E:84\t\tSamsung Electronics Co.,Ltd\nE8:4E:CE\t\tNintendo Co., Ltd.\nE8:4F:25\t\tMurata Manufacturing Co., Ltd.\nE8:4F:4B\t\tShenzhen Delos Electronic Co., Ltd\nE8:4F:A7\t\tHuawei Device Co., Ltd.\nE8:50:8B\t\tSamsung Electro-Mechanics(Thailand)\nE8:51:6E\t\tTSMART Inc.\nE8:51:77\t\tQingdao Intelligent&Precise Electronics Co.,Ltd.\nE8:51:9D\t\tYeonhab Precision Co.,LTD\nE8:51:9E\t\tGuangzhou Shiyuan Electronic Technology Company Limited\nE8:54:84\t\tNEO Information Systems Co., Ltd.\nE8:54:97\t\tSamsung Electronics Co.,Ltd\nE8:55:40\t\tWuxi Funide Digital Co.,Ltd\nE8:55:B4\t\tSAI Technology Inc.\nE8:56:59\t\tAdvanced-Connectek Inc.\nE8:56:D6\t\tNCTech Ltd\nE8:5A:8B\t\tXiaomi Communications Co Ltd\nE8:5A:A7\t\tLLC Emzior\nE8:5A:D1\t\tFiberhome Telecommunication Technologies Co.,LTD\nE8:5B:5B\t\tLg Electronics Inc\nE8:5B:B7\t\tAmple Systems Inc.\nE8:5B:F0\t\tImaging Diagnostics\nE8:5C:0A\t\tCisco Systems, Inc\nE8:5C:5F\t\tFN-LINK TECHNOLOGY Ltd.\nE8:5D:6B\t\tLuminate Wireless\nE8:5D:86\t\tChang Yow Technologies International Co.,Ltd.\nE8:5E:53\t\tInfratec Datentechnik GmbH\nE8:5F:02\t\tApple, Inc.\nE8:5F:B4\t\tXiaomi Communications Co Ltd\nE8:61:1F\t\tDawning Information Industry Co.,Ltd\nE8:61:7E\t\tLiteon Technology Corporation\nE8:61:83\t\tBlack Diamond Advanced Technology, LLC\nE8:61:BE\t\tMelec Inc.\nE8:62:BE\t\tIntel Corporate\nE8:65:38\t\tCloud Network Technology Singapore Pte. Ltd.\nE8:65:49\t\tCisco Systems, Inc\nE8:65:5F\t\tDell Inc.\nE8:65:D4\t\tTenda Technology Co.,Ltd.Dongguan branch\nE8:66:C4\t\tDiamanti\nE8:68:19\t\tHuawei Technologies Co.,Ltd\nE8:68:E7\t\tEspressif Inc.\nE8:6A:64\t\tLCFC(Hefei) Electronics Technology co., ltd\nE8:6B:EA\t\tEspressif Inc.\nE8:6C:C7\t\tIEEE Registration Authority\nE8:6C:C7:00:00:00/28\tTrapeze Switzerland GmbH\nE8:6C:C7:10:00:00/28\tASSA ABLOY(GuangZhou) Smart Technology Co., Ltd\nE8:6C:C7:20:00:00/28\tXirgo Technologies LLC\nE8:6C:C7:30:00:00/28\tShenzhen Yibaifen Industrial Co.,Ltd.\nE8:6C:C7:40:00:00/28\tKoal Software Co., Ltd\nE8:6C:C7:50:00:00/28\tShenzhen Rongda Computer Co.,Ltd\nE8:6C:C7:60:00:00/28\tKlab\nE8:6C:C7:70:00:00/28\tHuaqin Technology Co.,Ltd.\nE8:6C:C7:80:00:00/28\tLighthouse EIP\nE8:6C:C7:90:00:00/28\tHangzhou Lanxum Security Technology Co., Ltd\nE8:6C:C7:A0:00:00/28\tCoxSpace\nE8:6C:C7:B0:00:00/28\tMORNSUN Guangzhou Science & Technology Co., Ltd.\nE8:6C:C7:C0:00:00/28\tLimited Liability Company M.S.Korp\nE8:6C:C7:D0:00:00/28\tz-max mediasolution\nE8:6C:C7:E0:00:00/28\tAnnapurna labs\nE8:6C:DA\t\tSupercomputers and Neurocomputers Research Center\nE8:6D:16\t\tElmec Elettronica SRL\nE8:6D:52\t\tCommscope\nE8:6D:54\t\tDigit Mobile Inc\nE8:6D:65\t\tAUDIO MOBIL Elektronik GmbH\nE8:6D:6E\t\tvoestalpine Signaling UK Ltd.\nE8:6D:CB\t\tSamsung Electronics Co.,Ltd\nE8:6D:E9\t\tHuawei Technologies Co.,Ltd\nE8:6E:3A\t\tSony Interactive Entertainment Inc.\nE8:6E:44\t\tzte corporation\nE8:6E:AD\t\tGuangzhou Gizwits loT Technology Co.,Ltd\nE8:6F:38\t\tChongqing Fugui Electronics Co.,Ltd.\nE8:6F:F2\t\tActiontec Electronics, Inc\nE8:70:72\t\tHangzhou BroadLink Technology Co.,Ltd\nE8:71:8D\t\tElsys Equipamentos Eletronicos Ltda\nE8:74:C7\t\tSentinhealth\nE8:74:E6\t\tADB Broadband Italia\nE8:75:7F\t\tFIRS Technologies(Shenzhen) Co., Ltd\nE8:76:40\t\tSky Uk Limited\nE8:78:29\t\tIEEE Registration Authority\nE8:78:29:00:00:00/28\tTanz Security Technology Ltd.\nE8:78:29:10:00:00/28\tShenzhen Jointelli Technologies Co.,Ltd\nE8:78:29:20:00:00/28\tGalcon\nE8:78:29:30:00:00/28\tElectronic Controlled Systems, Inc.\nE8:78:29:40:00:00/28\tAnnapurna labs\nE8:78:29:50:00:00/28\tShen Zhen Skysi Wisdom Technology Co.,Ltd.\nE8:78:29:60:00:00/28\tAxing Ag\nE8:78:29:70:00:00/28\tFAIOT Co., LTD\nE8:78:29:80:00:00/28\tJVISMall CO.,LTD\nE8:78:29:90:00:00/28\tRyu Tech. LTD\nE8:78:29:A0:00:00/28\tMETZ CONNECT GmbH\nE8:78:29:B0:00:00/28\tAmpner Ltd\nE8:78:29:C0:00:00/28\tFairPhone B.V.\nE8:78:29:D0:00:00/28\tBernd Walter Computer Technology\nE8:78:29:E0:00:00/28\tSolos Technology Limited\nE8:78:65\t\tApple, Inc.\nE8:78:A1\t\tBeoview Intercom Doo\nE8:78:EE\t\tNew H3C Technologies Co., Ltd\nE8:79:A3\t\tCisco Systems, Inc\nE8:7A:F3\t\tS5 Tech S.r.l.\nE8:7E:1C\t\tHuawei Technologies Co.,Ltd\nE8:7F:6B\t\tSamsung Electronics Co.,Ltd\nE8:7F:95\t\tApple, Inc.\nE8:80:2E\t\tApple, Inc.\nE8:80:88\t\tLCFC(Hefei) Electronics Technology co., ltd\nE8:80:D8\t\tGNTEK Electronics Co.,Ltd.\nE8:81:52\t\tApple, Inc.\nE8:81:75\t\tzte corporation\nE8:81:AB\t\tBeijing Sankuai Online Technology Co.,Ltd\nE8:82:5B\t\tCommscope\nE8:84:A5\t\tIntel Corporate\nE8:84:C6\t\tHuawei Technologies Co.,Ltd\nE8:85:4B\t\tApple, Inc.\nE8:86:CF\t\tNokia\nE8:87:A3\t\tLoxley Public Company Limited\nE8:88:43\t\tXiaomi Communications Co Ltd\nE8:88:6C\t\tShenzhen SC Technologies Co.,LTD\nE8:89:2C\t\tCommscope\nE8:8D:28\t\tApple, Inc.\nE8:8D:A6\t\tQuectel Wireless Solutions Co.,Ltd.\nE8:8D:F5\t\tZNYX Networks, Inc.\nE8:8E:60\t\tNSD Corporation\nE8:8F:6F\t\tTCT mobile ltd\nE8:8F:C4\t\tMobiwire Mobiles(Ningbo) Co.,Ltd\nE8:91:0F\t\tFiberhome Telecommunication Technologies Co.,LTD\nE8:91:20\t\tMotorola Mobility LLC, a Lenovo Company\nE8:92:18\t\tArcontia International AB\nE8:92:A4\t\tLG Electronics (Mobile Communications)\nE8:93:09\t\tSamsung Electronics Co.,Ltd\nE8:93:63\t\tNokia\nE8:93:F3\t\tGraphiant Inc\nE8:94:4C\t\tCogent Healthcare Systems Ltd\nE8:94:F6\t\tTp-Link Technologies Co.,Ltd.\nE8:95:05\t\tShenzhen MiaoMing Intelligent Technology Co.,Ltd\nE8:95:26\t\tLuxshare Precision Industry CO., LTD.\nE8:96:06\t\ttesto Instruments (Shenzhen) Co., Ltd.\nE8:97:9A\t\tQuectel Wireless Solutions Co.,Ltd.\nE8:97:B8\t\tChiun Mai Communication System, Inc\nE8:98:47\t\tXiaomi Communications Co Ltd\nE8:98:6D\t\tPalo Alto Networks\nE8:98:C2\t\tZETLAB Company\nE8:99:5A\t\tPiiGAB, Processinformation i Goteborg AB\nE8:99:C4\t\tHTC Corporation\nE8:9A:8F\t\tQuanta Computer Inc.\nE8:9A:FF\t\tFujian LANDI Commercial Equipment Co.,Ltd\nE8:9C:25\t\tASUSTek COMPUTER INC.\nE8:9D:87\t\tToshiba\nE8:9E:0C\t\tMax8Usa Distributors Inc.\nE8:9E:13\t\tCresyn\nE8:9E:49\t\tMellanox Technologies, Inc.\nE8:9E:B4\t\tHon Hai Precision Ind. Co.,Ltd.\nE8:9F:39\t\tNokia\nE8:9F:6D\t\tEspressif Inc.\nE8:9F:80\t\tBelkin International Inc.\nE8:9F:EC\t\tChengdu Kt Electronic Hi-Tech Co.,Ltd\nE8:A0:CD\t\tNintendo Co.,Ltd\nE8:A0:ED\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nE8:A1:F8\t\tzte corporation\nE8:A2:45\t\tJuniper Networks\nE8:A3:4E\t\tHuawei Technologies Co.,Ltd\nE8:A3:64\t\tSignal Path International / Peachtree Audio\nE8:A4:C1\t\tDeep Sea Electronics Ltd\nE8:A6:60\t\tHuawei Technologies Co.,Ltd\nE8:A6:CA\t\tHuawei Device Co., Ltd.\nE8:A7:2F\t\tMicrosoft Corporation\nE8:A7:30\t\tApple, Inc.\nE8:A7:88\t\tXiamen Leelen Technology Co., Ltd\nE8:A7:F2\t\tsTraffic\nE8:A8:48\t\tWacom Co.,Ltd.\nE8:AA:CB\t\tSamsung Electronics Co.,Ltd\nE8:AB:F3\t\tHuawei Technologies Co.,Ltd\nE8:AB:FA\t\tShenzhen Reecam Tech.Ltd.\nE8:AC:23\t\tHuawei Technologies Co.,Ltd\nE8:AC:7E\t\tTerahop Pte.Ltd.\nE8:AC:AD\t\tzte corporation\nE8:AD:A6\t\tSagemcom Broadband SAS\nE8:AE:C5\t\tArista Networks\nE8:B0:C5\t\tIntel Corporate\nE8:B1:FC\t\tIntel Corporate\nE8:B2:65\t\tDell Inc.\nE8:B2:AC\t\tApple, Inc.\nE8:B2:FE\t\tHUMAX Co., Ltd.\nE8:B3:EF\t\tFiberhome Telecommunication Technologies Co.,LTD\nE8:B4:70\t\tIEEE Registration Authority\nE8:B4:70:00:00:00/28\tDongGuan Ramaxel Memory Technology\nE8:B4:70:10:00:00/28\tAutocom Diagnostic Partner AB\nE8:B4:70:20:00:00/28\tinternet domain name system beijing engineering research center ltd\nE8:B4:70:30:00:00/28\tWebfleet Solutions B.V.\nE8:B4:70:40:00:00/28\tYawata Electric Industrial Co.,Ltd.\nE8:B4:70:50:00:00/28\tAlperia Fiber srl\nE8:B4:70:60:00:00/28\tElcoma\nE8:B4:70:70:00:00/28\tTibit Communications\nE8:B4:70:80:00:00/28\tDEHN SE + Co KG\nE8:B4:70:90:00:00/28\tMiltek Industries Pte Ltd\nE8:B4:70:A0:00:00/28\tplc2 Design GmbH\nE8:B4:70:B0:00:00/28\tDigifocus Technology Inc.\nE8:B4:70:C0:00:00/28\tAnduril Industries\nE8:B4:70:D0:00:00/28\tMedica Corporation\nE8:B4:70:E0:00:00/28\tUnicacces Groupe\nE8:B4:AE\t\tShenzhen C&D Electronics Co.,Ltd\nE8:B4:C8\t\tSamsung Electronics Co.,Ltd\nE8:B5:27\t\tPhyplus Technology (Shanghai) Co., Ltd\nE8:B5:41\t\tzte corporation\nE8:B5:D0\t\tDell Inc.\nE8:B6:C2\t\tJuniper Networks\nE8:B7:22\t\tGreenTrol Automation\nE8:B7:23\t\tShenzhen Vatilon Electronics Co.,Ltd\nE8:B7:48\t\tCisco Systems, Inc\nE8:BA:70\t\tCisco Systems, Inc\nE8:BA:E2\t\tXplora Technologies AS\nE8:BB:3D\t\tSino Prime-Tech Limited\nE8:BB:A8\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nE8:BC:E4\t\tCisco Systems, Inc\nE8:BD:D1\t\tHuawei Technologies Co.,Ltd\nE8:BE:81\t\tSagemcom Broadband SAS\nE8:BF:B8\t\tIntel Corporate\nE8:BF:DB\t\tInodesign Group\nE8:BF:E1\t\tIntel Corporate\nE8:C1:B8\t\tNanjing Bangzhong Electronic Commerce Limited\nE8:C1:D7\t\tPhilips\nE8:C1:E8\t\tShenzhen Xiao Bi En Culture Education Technology Co.,Ltd.\nE8:C2:29\t\tH-Displays (MSC) Bhd\nE8:C2:DD\t\tInfinix mobility limited\nE8:C3:20\t\tAustco Marketing & Service (USA) ltd.\nE8:C4:17\t\tFiberhome Telecommunication Technologies Co.,LTD\nE8:C5:7A\t\tUfispace Co., LTD.\nE8:C6:E6\t\tChanghong (Hongkong) Trading Limited\nE8:C7:4F\t\tLiteon Technology Corporation\nE8:C7:CF\t\tWistron Neweb Corporation\nE8:C8:29\t\tIntel Corporate\nE8:C9:13\t\tSamsung Electronics Co.,Ltd\nE8:CA:50\t\tBouffalo Lab (Nanjing) Co., Ltd.\nE8:CA:C8\t\tHui Zhou Gaoshengda Technology Co.,LTD\nE8:CB:A1\t\tNokia Corporation\nE8:CB:ED\t\tChipsea Technologies(Shenzhen) Corp.\nE8:CB:F5\t\tLaird Connectivity\nE8:CC:18\t\tD-Link International\nE8:CC:32\t\tMicronet  LTD\nE8:CC:8C\t\tChengdu Jiarui Hualian Communication Technology Co\nE8:CD:15\t\tVantiva USA LLC\nE8:CD:2D\t\tHuawei Technologies Co.,Ltd\nE8:CE:06\t\tSkyHawke Technologies, LLC.\nE8:CF:83\t\tDell Inc.\nE8:D0:3C\t\tShenzhen Jingxun Software Telecommunication Technology Co.,Ltd\nE8:D0:99\t\tFiberhome Telecommunication Technologies Co.,LTD\nE8:D0:B9\t\tTaicang T&W Electronics\nE8:D0:FA\t\tMKS Instruments Deutschland GmbH\nE8:D0:FC\t\tLiteon Technology Corporation\nE8:D1:1B\t\tAskey Computer Corp\nE8:D2:FF\t\tSagemcom Broadband SAS\nE8:D3:22\t\tCisco Systems, Inc\nE8:D3:EB\t\teero inc.\nE8:D4:83\t\tULTIMATE Europe Transportation Equipment GmbH\nE8:D4:E0\t\tBeijing BenyWave Technology Co., Ltd.\nE8:D5:2B\t\tGoogle, Inc.\nE8:D7:65\t\tHuawei Technologies Co.,Ltd\nE8:D7:75\t\tHuawei Technologies Co.,Ltd\nE8:D8:19\t\tAzureWave Technology Inc.\nE8:D8:7E\t\tAmazon Technologies Inc.\nE8:D8:D1\t\tHP Inc.\nE8:DA:00\t\tKivo Technology, Inc.\nE8:DA:20\t\tNintendo Co.,Ltd\nE8:DA:3E\t\tHuawei Device Co., Ltd.\nE8:DA:96\t\tZhuhai Tianrui Electrical Power Tech. Co., Ltd.\nE8:DA:AA\t\tVideoHome Technology Corp.\nE8:DB:84\t\tEspressif Inc.\nE8:DC:6C\t\tCisco Systems, Inc\nE8:DE:00\t\tChongQing GuanFang Technology Co.,LTD\nE8:DE:27\t\tTp-Link Technologies Co.,Ltd.\nE8:DE:8E\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\nE8:DE:D6\t\tIntrising Networks, Inc.\nE8:DE:FB\t\tMesotic Sas\nE8:DF:24\t\tOhsung\nE8:DF:70\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\nE8:DF:F2\t\tPRF Co., Ltd.\nE8:E0:7E\t\tSilicon Laboratories\nE8:E0:8F\t\tGravotech Marking Sas\nE8:E0:B7\t\tToshiba\nE8:E1:E1\t\tGemtek Technology Co., Ltd.\nE8:E1:E2\t\tEnergotest\nE8:E4:9D\t\tNexthop Systems Inc.\nE8:E5:D6\t\tSamsung Electronics Co.,Ltd\nE8:E6:09\t\tChongqing Zhouhai  intelligent  technology CO., Ltd\nE8:E7:32\t\tAlcatel-Lucent Enterprise\nE8:E7:70\t\tWarp9 Tech Design, Inc.\nE8:E7:76\t\tShenzhen Kootion Technology Co., Ltd\nE8:E7:C3\t\tzte corporation\nE8:E8:75\t\tiS5 Communications Inc.\nE8:E8:B7\t\tMurata Manufacturing Co., Ltd.\nE8:E9:8E\t\tSOLAR controls s.r.o.\nE8:EA:4D\t\tHuawei Technologies Co.,Ltd\nE8:EA:6A\t\tStarTech.com\nE8:EA:DA\t\tDenkovi Assembly Electronics LTD\nE8:EA:FA\t\tQingdao Haier Technology Co.,Ltd\nE8:EB:11\t\tTexas Instruments\nE8:EB:1B\t\tMicrochip Technology Inc.\nE8:EB:34\t\tCisco Systems, Inc\nE8:EB:D3\t\tMellanox Technologies, Inc.\nE8:EB:DD\t\tGuangzhou Qingying Acoustics Technology Co., Ltd\nE8:EC:A3\t\tDongguan Liesheng Electronic Co.Ltd\nE8:ED:05\t\tCommscope\nE8:ED:D6\t\tFortinet, Inc.\nE8:ED:F3\t\tCisco Systems, Inc\nE8:EE:CC\t\tFantasia Trading LLC\nE8:EF:05\t\tMind Tech International Limited\nE8:EF:22\t\tSiemens Numerical Control Ltd., Nanjing\nE8:EF:89\t\tOPMEX Tech.\nE8:F0:85\t\tHuawei Technologies Co.,Ltd\nE8:F0:A4\t\tAntonios A. Chariton\nE8:F1:B0\t\tSagemcom Broadband SAS\nE8:F2:26\t\tMillson Custom Solutions Inc.\nE8:F2:E2\t\tLG Innotek\nE8:F2:E3\t\tStarcor Beijing Co.,Limited\nE8:F3:75\t\tNokia\nE8:F4:08\t\tIntel Corporate\nE8:F4:94\t\tAltoBeam Inc.\nE8:F6:54\t\tHuawei Technologies Co.,Ltd\nE8:F6:73\t\tMicrosoft Corporation\nE8:F7:24\t\tHewlett Packard Enterprise\nE8:F7:2F\t\tHuawei Technologies Co.,Ltd\nE8:F7:91\t\tXiaomi Communications Co Ltd\nE8:F8:D0\t\tNokia Shanghai Bell Co., Ltd.\nE8:F9:28\t\tEnginko Srl\nE8:F9:D4\t\tHuawei Technologies Co.,Ltd\nE8:FA:23\t\tHuawei Device Co., Ltd.\nE8:FA:F7\t\tGuangdong Uniteddata Holding Group Co., Ltd.\nE8:FB:1C\t\tAzureWave Technology Inc.\nE8:FB:E9\t\tApple, Inc.\nE8:FC:60\t\tELCOM Innovations Private Limited\nE8:FC:AF\t\tNetgear\nE8:FD:35\t\tHuawei Device Co., Ltd.\nE8:FD:72\t\tShanghai Linguo Technology Co., Ltd.\nE8:FD:90\t\tTurbostor\nE8:FD:E8\t\tCeLa Link Corporation\nE8:FD:F8\t\tShanghai High-Flying Electronics  Technology Co., Ltd\nE8:FF:1E\t\tIEEE Registration Authority\nE8:FF:1E:00:00:00/28\tPrivate\nE8:FF:1E:10:00:00/28\thard & softWERK GmbH\nE8:FF:1E:20:00:00/28\tMinami Medical Technology (Guangdong) Co.,Ltd\nE8:FF:1E:30:00:00/28\tLlp \"Nic \"Fors\"\nE8:FF:1E:40:00:00/28\tHMN Technologies Co., Ltd\nE8:FF:1E:50:00:00/28\tCarve Viet Nam Technology Company Limited\nE8:FF:1E:60:00:00/28\tPartizan Security s.r.o.\nE8:FF:1E:70:00:00/28\tNRT Technology Taiwan Co., Ltd.\nE8:FF:1E:80:00:00/28\tAnnapurna labs\nE8:FF:1E:90:00:00/28\tShenzhen Justinfo Technology Co.,Ltd\nE8:FF:1E:A0:00:00/28\tGeotab Inc.\nE8:FF:1E:B0:00:00/28\tMelisono AB\nE8:FF:1E:C0:00:00/28\tFracarro Radioindustrie Srl\nE8:FF:1E:D0:00:00/28\tShenzhen AZW Technology Co., Ltd.\nE8:FF:1E:E0:00:00/28\tShenzhen kstar Science & Technology Co., Ltd\nE8:FF:98\t\tHuawei Device Co., Ltd.\nE8:FF:F4\t\tApple, Inc.\nEA:11:5D\t\tAutovision Technology Inc.\nEA:1E:D0\t\tZIGPOS GmbH\nEA:27:01\t\tACCE Technology Corp.\nEA:2A:DB\t\tLabs Network Industrie 4. 0 e.V.\nEA:34:B4\t\tThinkRF Inc.\nEA:60:76\t\tCloudSimple, Inc.\nEA:8F:96\t\tProficium, LLC\nEA:9F:B1\t\tPhilips International B.V.\nEA:B8:9B\t\tThread Group, Inc.\nEA:BC:04\t\tG3-PLC Alliance\nEA:BE:A7\t\tSonos, Inc.\nEA:DA:6E\t\tFUJIFILM Recording Media GmbH\nEA:DD:88\t\tIEEE PES-PSRC Working Group H3, PC37.237\nEA:E0:D9\t\tBerk-tek LLC\nEC:01:33\t\tTrinus Systems Inc.\nEC:01:D5\t\tCisco Systems, Inc\nEC:01:E2\t\tFoxconn Interconnect Technology\nEC:01:EE\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nEC:02:73\t\tHewlett Packard Enterprise\nEC:04:41\t\tShenZhen TIGO Semiconductor Co., Ltd.\nEC:04:82\t\tSTL Systems AG\nEC:08:6B\t\tTp-Link Technologies Co.,Ltd.\nEC:08:E5\t\tMotorola Mobility LLC, a Lenovo Company\nEC:09:C9\t\tTexas Instruments\nEC:0B:AE\t\tHangzhou BroadLink Technology Co.,Ltd\nEC:0C:96\t\tNokia\nEC:0D:51\t\tApple, Inc.\nEC:0D:9A\t\tMellanox Technologies, Inc.\nEC:0D:E4\t\tAmazon Technologies Inc.\nEC:0E:C4\t\tHon Hai Precision Ind. Co.,Ltd.\nEC:0E:D6\t\tItech Instruments Sas\nEC:10:55\t\tBeijing Xiaomi Electronics Co.,Ltd\nEC:10:7B\t\tSamsung Electronics Co.,Ltd\nEC:11:20\t\tFloDesign Wind Turbine Corporation\nEC:11:27\t\tTexas Instruments\nEC:13:B2\t\tNetonix\nEC:13:DB\t\tJuniper Networks\nEC:14:F6\t\tBioControl AS\nEC:15:3D\t\tBeijing Yaxunhongda Technology Co., Ltd.\nEC:17:2F\t\tTp-Link Technologies Co.,Ltd.\nEC:17:66\t\tResearch Centre Module\nEC:19:2E\t\tCisco Systems, Inc\nEC:1A:02\t\tHuawei Technologies Co.,Ltd\nEC:1A:59\t\tBelkin International Inc.\nEC:1B:5F\t\tHewlett Packard Enterprise\nEC:1B:BD\t\tSilicon Laboratories\nEC:1B:CF\t\tBrain Technologies, Inc.\nEC:1B:FA\t\tEM Microelectronic\nEC:1C:5D\t\tSiemens AG\nEC:1D:53\t\tHuawei Technologies Co.,Ltd\nEC:1D:7F\t\tzte corporation\nEC:1D:8B\t\tCisco Systems, Inc\nEC:1D:9E\t\tQuectel Wireless Solutions Co.,Ltd.\nEC:1D:A9\t\tYealink(Xiamen) Network Technology Co.,Ltd.\nEC:1F:72\t\tSamsung Electro-Mechanics(Thailand)\nEC:21:25\t\tToshiba Corp.\nEC:21:50\t\tvivo Mobile Communication Co., Ltd.\nEC:21:9F\t\tVidaBox LLC\nEC:21:E5\t\tToshiba\nEC:22:57\t\tJiangSu NanJing University Electronic Information Technology Co.,Ltd\nEC:22:80\t\tD-Link International\nEC:23:3D\t\tHuawei Technologies Co.,Ltd\nEC:23:68\t\tIntelliVoice Co.,Ltd.\nEC:23:7B\t\tzte corporation\nEC:24:B8\t\tTexas Instruments\nEC:26:51\t\tApple, Inc.\nEC:26:CA\t\tTp-Link Technologies Co.,Ltd.\nEC:26:FB\t\tTecc Co.,Ltd.\nEC:28:D3\t\tApple, Inc.\nEC:2A:72\t\tDell Inc.\nEC:2A:F0\t\tYpsomed AG\nEC:2B:EB\t\tAmazon Technologies Inc.\nEC:2C:11\t\tCwd Innovation Limited\nEC:2C:49\t\tNakaoLab, The University of Tokyo\nEC:2C:73\t\tApple, Inc.\nEC:2C:E2\t\tApple, Inc.\nEC:2E:4E\t\tHitachi-Lg Data Storage Inc\nEC:2E:98\t\tAzureWave Technology Inc.\nEC:2F:20\t\tHyundai Wia\nEC:2F:90\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nEC:30:8E\t\tLierda Science & Technology Group Co., Ltd\nEC:30:91\t\tCisco Systems, Inc\nEC:30:B3\t\tXiaomi Communications Co Ltd\nEC:31:11\t\tSichuan AI-Link Technology Co., Ltd.\nEC:31:4A\t\tChengdu Quanjing Intelligent Technology Co.,Ltd\nEC:31:6D\t\tHansgrohe\nEC:34:E2\t\tPrivate\nEC:35:32\t\tTactrix Inc.\nEC:35:4D\t\tWingtech Mobile Communications Co.,Ltd\nEC:35:86\t\tApple, Inc.\nEC:36:3F\t\tMarkov Corporation\nEC:38:73\t\tJuniper Networks\nEC:38:8F\t\tHuawei Technologies Co.,Ltd\nEC:3A:52\t\tHuawei Device Co., Ltd.\nEC:3B:AF\t\tEM Microelectronic\nEC:3B:F0\t\tNovelSat\nEC:3C:5A\t\tShen Zhen Heng Sheng Hui Digital Technology Co.,Ltd\nEC:3C:88\t\tMCNEX Co.,Ltd.\nEC:3C:BB\t\tHuawei Device Co., Ltd.\nEC:3D:FD\t\tShenzhen Bilian Electronic Co.，Ltd\nEC:3E:09\t\tPerformance Designed Products, Llc\nEC:3E:B3\t\tZyxel Communications Corporation\nEC:3E:F7\t\tJuniper Networks\nEC:3F:05\t\tInstitute 706, The Second Academy China Aerospace Science & Industry Corp\nEC:41:18\t\tXIAOMI Electronics,CO.,LTD\nEC:41:CA\t\tShenzhen TecAnswer Technology co.,ltd\nEC:41:F9\t\tShenzhen iComm Semiconductor CO.,LTD\nEC:42:69\t\tHMD Global Oy\nEC:42:B4\t\tADC Corporation\nEC:42:CC\t\tApple, Inc.\nEC:42:F0\t\tADL Embedded Solutions, Inc.\nEC:43:8B\t\tYaptv\nEC:43:E6\t\tAWCER Ltd.\nEC:43:F6\t\tZyxel Communications Corporation\nEC:44:76\t\tCisco Systems, Inc\nEC:46:2C\t\tInfinix mobility limited\nEC:46:44\t\tTtk Sas\nEC:46:54\t\tApple, Inc.\nEC:46:70\t\tMeinberg Funkuhren GmbH & Co. KG\nEC:47:0C\t\tUniversal Electronics, Inc.\nEC:47:3C\t\tRedwire, LLC\nEC:49:93\t\tQihan Technology Co., Ltd\nEC:4C:4D\t\tZAO NPK RoTeK\nEC:4C:8C\t\tIntel Corporate\nEC:4D:3E\t\tBeijing Xiaomi Mobile Software Co., Ltd\nEC:4D:47\t\tHuawei Technologies Co.,Ltd\nEC:4F:82\t\tCalix Inc.\nEC:50:AA\t\tHewlett Packard Enterprise\nEC:51:BC\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nEC:52:DC\t\tWORLD MEDIA AND TECHNOLOGY Corp.\nEC:53:6F\t\tHuawei Technologies Co.,Ltd\nEC:53:82\t\tHonor Device Co., Ltd.\nEC:54:2E\t\tShanghai XiMei Electronic Technology Co. Ltd\nEC:55:1C\t\tHuawei Technologies Co.,Ltd\nEC:55:4D\t\tPrivate\nEC:55:F9\t\tHon Hai Precision Ind. Co.,Ltd.\nEC:56:23\t\tHuawei Technologies Co.,Ltd\nEC:57:0D\t\tAFE Inc.\nEC:58:EA\t\tRuckus Wireless\nEC:59:E7\t\tMicrosoft Corporation\nEC:5A:31\t\tBuffalo.Inc\nEC:5A:86\t\tYulong Computer Telecommunication Scientific (Shenzhen) Co.,Ltd\nEC:5A:A3\t\tHuawei Device Co., Ltd.\nEC:5B:73\t\tAdvanced & Wise Technology Corp.\nEC:5B:CD\t\tIEEE Registration Authority\nEC:5B:CD:00:00:00/28\tDong Guan Yung Fu Electronics Ltd.\nEC:5B:CD:10:00:00/28\tIngersoll Rand\nEC:5B:CD:20:00:00/28\tSfera Labs S.r.l.\nEC:5B:CD:30:00:00/28\tHefei BOE Vision-electronic Technology Co.,Ltd.\nEC:5B:CD:40:00:00/28\tGreen Solutions (Chengdu) Co., Ltd\nEC:5B:CD:50:00:00/28\tShenzhen Qunfang Technology Co., LTD.\nEC:5B:CD:60:00:00/28\tJiangsu Fushi Electronic Technology Co., Ltd\nEC:5B:CD:70:00:00/28\tAnnapurna labs\nEC:5B:CD:80:00:00/28\tDoosan Bobcat North America\nEC:5B:CD:90:00:00/28\tC&D Technologies\nEC:5B:CD:A0:00:00/28\tCareSix Inc.\nEC:5B:CD:B0:00:00/28\tStepOver GmbH\nEC:5B:CD:C0:00:00/28\tQuicklert Inc\nEC:5B:CD:D0:00:00/28\tASHIDA Electronics Pvt. Ltd\nEC:5B:CD:E0:00:00/28\tAutel Robotics USA LLC\nEC:5C:68\t\tChongqing Fugui Electronics Co.,Ltd.\nEC:5C:69\t\tMitsubishi Heavy Industries Mechatronics Systems,Ltd.\nEC:5C:84\t\tMurata Manufacturing Co., Ltd.\nEC:5F:23\t\tQinghai Kimascend Electronics Technology Co. Ltd.\nEC:60:73\t\tTp-Link Technologies Co.,Ltd.\nEC:60:E0\t\tAvi-On Labs\nEC:62:60\t\tEspressif Inc.\nEC:62:64\t\tGlobal411 Internet Services, LLC\nEC:63:D7\t\tIntel Corporate\nEC:63:E5\t\tePBoard Design LLC\nEC:63:ED\t\tHyundai Autoever Corp.\nEC:64:88\t\tHonor Device Co., Ltd.\nEC:64:C9\t\tEspressif Inc.\nEC:64:E7\t\tMOCACARE Corporation\nEC:65:6E\t\tThe Things Industries B.V.\nEC:65:CC\t\tPanasonic Automotive Systems Company of America\nEC:66:52\t\tInfo Fiber Solutions Pvt Ltd\nEC:66:D1\t\tB&W Group LTD\nEC:67:94\t\tHewlett Packard Enterprise\nEC:68:81\t\tPalo Alto Networks\nEC:6C:9A\t\tArcadyan Corporation\nEC:6C:9F\t\tChengdu Volans Technology CO.,LTD\nEC:6C:B5\t\tzte corporation\nEC:6E:79\t\tInHand Networks, INC.\nEC:6F:0B\t\tFADU, Inc.\nEC:70:97\t\tCommscope\nEC:71:DB\t\tReolink Innovation Limited\nEC:72:5B\t\tzte corporation\nEC:73:59\t\tShenzhen Cloudsky Technologies Co., Ltd.\nEC:73:79\t\tApple, Inc.\nEC:74:27\t\teero inc.\nEC:74:8C\t\tSony Interactive Entertainment Inc.\nEC:74:BA\t\tHirschmann Automation and Control GmbH\nEC:74:CD\t\tIEEE Registration Authority\nEC:74:CD:00:00:00/28\tNexxus Networks Pte Ltd\nEC:74:CD:10:00:00/28\tShenzhen C & D Electronics Co., Ltd.\nEC:74:CD:20:00:00/28\tL.T.H. Electronics Limited\nEC:74:CD:30:00:00/28\tiSolution Technologies Co.,Ltd.\nEC:74:CD:40:00:00/28\tVialis BV\nEC:74:CD:50:00:00/28\tStandard Backhaul Communications\nEC:74:CD:60:00:00/28\tPlatypus\nEC:74:CD:70:00:00/28\tKONČAR - Electrical Engineering Institute Ltd.\nEC:74:CD:80:00:00/28\tTrans Audio Video Srl\nEC:74:CD:90:00:00/28\tSound Health Systems\nEC:74:CD:A0:00:00/28\tBosch (zhuhai) Security Systems Company, Ltd.\nEC:74:CD:B0:00:00/28\tHitachi Rail GTS Austria GmbH\nEC:74:CD:C0:00:00/28\tSmart Data (Shenzhen) Intelligent System Co., Ltd.\nEC:74:CD:D0:00:00/28\tShenzhen Ting-Shine Technology Co., Ltd.\nEC:74:CD:E0:00:00/28\tShenzhen Eweat Technology Co.,Ltd\nEC:74:D7\t\tGrandstream Networks Inc\nEC:75:0C\t\tTP-Link Systems Inc.\nEC:75:3E\t\tHuawei Technologies Co.,Ltd\nEC:75:ED\t\tCitrix Systems, Inc.\nEC:79:49\t\tFujitsu Limited\nEC:79:F2\t\tStartel\nEC:7C:2C\t\tHuawei Technologies Co.,Ltd\nEC:7C:5C\t\tJuniper Networks\nEC:7C:74\t\tJustone Technologies Co., Ltd.\nEC:7C:B6\t\tSamsung Electronics Co.,Ltd\nEC:7C:BA\t\tHewlett Packard Enterprise\nEC:7D:11\t\tvivo Mobile Communication Co., Ltd.\nEC:7D:9D\t\tCpi\nEC:7E:91\t\tItel Mobile Limited\nEC:7F:C6\t\tEccel Corporation Sas\nEC:80:09\t\tNovaSparks\nEC:81:50\t\tApple, Inc.\nEC:81:93\t\tLogitech, Inc\nEC:81:9C\t\tHuawei Technologies Co.,Ltd\nEC:82:63\t\tzte corporation\nEC:83:50\t\tMicrosoft Corporation\nEC:83:6C\t\tRM Tech Co., Ltd.\nEC:83:B7\t\tPuwell Cloud Tech Limited\nEC:83:D5\t\tGIRD Systems Inc\nEC:84:39\t\tPrivate\nEC:84:B4\t\tCig Shanghai Co Ltd\nEC:85:2F\t\tApple, Inc.\nEC:88:8F\t\tTp-Link Technologies Co.,Ltd.\nEC:88:92\t\tMotorola Mobility LLC, a Lenovo Company\nEC:89:14\t\tHuawei Technologies Co.,Ltd\nEC:89:F5\t\tLenovo Mobile Communication Technology Ltd.\nEC:8A:48\t\tArista Networks\nEC:8A:4C\t\tzte corporation\nEC:8A:C4\t\tAmazon Technologies Inc.\nEC:8A:C7\t\tFiberhome Telecommunication Technologies Co.,LTD\nEC:8C:9A\t\tHuawei Technologies Co.,Ltd\nEC:8C:A2\t\tRuckus Wireless\nEC:8E:12\t\tNokia\nEC:8E:77\t\tIntel Corporate\nEC:8E:AD\t\tDlx\nEC:8E:AE\t\tNagravision SA\nEC:8E:B5\t\tHewlett Packard\nEC:90:C1\t\tSamsung Electronics Co.,Ltd\nEC:91:61\t\tCloud Network Technology Singapore Pte. Ltd.\nEC:92:33\t\tEddyfi NDT Inc\nEC:93:27\t\tMEMMERT GmbH + Co. KG\nEC:93:65\t\tMapper.ai, Inc.\nEC:93:7D\t\tVantiva USA LLC\nEC:93:ED\t\tDDoS-Guard LTD\nEC:94:68\t\tMeta System Spa\nEC:94:CB\t\tEspressif Inc.\nEC:94:D5\t\tJuniper Networks\nEC:96:81\t\t2276427 Ontario Inc\nEC:96:BF\t\teSystems MTG GmbH\nEC:97:A2\t\tApple, Inc.\nEC:97:B2\t\tSUMEC Machinery & Electric Co.,Ltd.\nEC:97:E0\t\tHangzhou Ezviz Software Co.,Ltd.\nEC:98:6C\t\tLufft Mess- und Regeltechnik GmbH\nEC:98:C1\t\tBeijing Risbo Network Technology Co.,Ltd\nEC:9A:0C\t\tIEEE Registration Authority\nEC:9A:0C:00:00:00/28\tShenzhen Hexinda Supply Chain Management Co.Ltd\nEC:9A:0C:10:00:00/28\tShenzhen Naxiang Technology Co., Ltd\nEC:9A:0C:20:00:00/28\tShenzhen Yitoa Digital Technology Co., Ltd.\nEC:9A:0C:30:00:00/28\tProtect Animals with Satellites LLC\nEC:9A:0C:40:00:00/28\tHangzhou Saicom Communication Technology Co., LTD\nEC:9A:0C:50:00:00/28\tSmartRay GmbH\nEC:9A:0C:60:00:00/28\tSeek Thermal\nEC:9A:0C:70:00:00/28\tJiangsu Maodu Yunke Medical Technology Co., Ltd\nEC:9A:0C:80:00:00/28\tNXC Systems LLC\nEC:9A:0C:90:00:00/28\tTianjin Meiteng Technology Co.,Ltd\nEC:9A:0C:A0:00:00/28\tFancom\nEC:9A:0C:B0:00:00/28\tReVibe Energy AB\nEC:9A:0C:C0:00:00/28\tFujian Zhongliang Zhihui Technology Co., Ltd\nEC:9A:0C:D0:00:00/28\tViGEM GmbH\nEC:9A:0C:E0:00:00/28\tRisuntek Inc\nEC:9A:34\t\tTexas Instruments\nEC:9A:74\t\tHewlett Packard\nEC:9B:2D\t\tChina Mobile Group Device Co.,Ltd.\nEC:9B:5B\t\tNokia Corporation\nEC:9B:8B\t\tHewlett Packard Enterprise\nEC:9B:F3\t\tSamsung Electro-Mechanics(Thailand)\nEC:9C:32\t\tSichuan AI-Link Technology Co., Ltd.\nEC:9E:CD\t\tArtesyn Embedded Technologies\nEC:9E:EA\t\tXtra Technology LLC\nEC:9F:0D\t\tIEEE Registration Authority\nEC:9F:0D:00:00:00/28\tHesai Photonics Technology Co., Ltd\nEC:9F:0D:10:00:00/28\tSimula Technology Inc.\nEC:9F:0D:20:00:00/28\tDRB Systems\nEC:9F:0D:30:00:00/28\tWaverly Labs Inc.\nEC:9F:0D:40:00:00/28\tWisIOE\nEC:9F:0D:50:00:00/28\tPaw-Taw-John Services, Inc.\nEC:9F:0D:60:00:00/28\tShenzhen Compare Electronics Co., Ltd\nEC:9F:0D:70:00:00/28\tBei jing Lian Shan times Techonology Co.Ltd\nEC:9F:0D:80:00:00/28\tZhejiang HEJU Communication Technology Co., Ltd\nEC:9F:0D:90:00:00/28\tFci\nEC:9F:0D:A0:00:00/28\tflexlog GmbH\nEC:9F:0D:B0:00:00/28\tCrrc Qingdao Sifang Rolling Stock Research Institute Co.,Ltd\nEC:9F:0D:C0:00:00/28\tSarcos Corp\nEC:9F:0D:D0:00:00/28\tSKS Control Oy\nEC:9F:0D:E0:00:00/28\tMAX Technologies\nEC:A1:38\t\tAmazon Technologies Inc.\nEC:A1:D1\t\tHuawei Technologies Co.,Ltd\nEC:A2:9B\t\tKemppi Oy\nEC:A2:A0\t\tTaicang T&W Electronics\nEC:A5:DE\t\tONYX WIFI Inc\nEC:A6:2F\t\tHuawei Technologies Co.,Ltd\nEC:A7:AD\t\tBarrot Technology Co.,Ltd.\nEC:A7:B1\t\tIEEE Registration Authority\nEC:A7:B1:00:00:00/28\tNanjing Xinyun Technology Co., Ltd\nEC:A7:B1:10:00:00/28\tAKOM Technologies Private Limited\nEC:A7:B1:20:00:00/28\tAnnapurna labs\nEC:A7:B1:30:00:00/28\tStrongbyte Solutions Limited\nEC:A7:B1:40:00:00/28\tSichuan Ruiting Zhihui Technology Co., Ltd\nEC:A7:B1:50:00:00/28\tChicony Power Technology (Dongguan) Co,. Ltd.\nEC:A7:B1:60:00:00/28\tDigital Audio Labs\nEC:A7:B1:70:00:00/28\tShenzhen Lanroot Technology Co., Ltd\nEC:A7:B1:80:00:00/28\tShenzhen zhst video technology co.,ltd\nEC:A7:B1:90:00:00/28\tPrint International Limited\nEC:A7:B1:A0:00:00/28\tAnnapurna labs\nEC:A7:B1:B0:00:00/28\tShenzhen Adreamer Elite Co.,Ltd\nEC:A7:B1:C0:00:00/28\tHiromokuten Co.,Ltd.\nEC:A7:B1:D0:00:00/28\tUsu Telecom India Private Limited\nEC:A7:B1:E0:00:00/28\tArtisight, Inc.\nEC:A8:1F\t\tVantiva USA LLC\nEC:A8:6B\t\tElitegroup Computer Systems Co.,Ltd.\nEC:A9:07\t\tApple, Inc.\nEC:A9:40\t\tCommscope\nEC:A9:71\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nEC:A9:FA\t\tGuangdong Genius Technology Co., Ltd.\nEC:AA:25\t\tSamsung Electronics Co.,Ltd\nEC:AA:8F\t\tHuawei Technologies Co.,Ltd\nEC:AA:A0\t\tPegatron Corporation\nEC:AB:3E\t\tEssys\nEC:AD:B8\t\tApple, Inc.\nEC:AD:E0\t\tD-Link International\nEC:AF:97\t\tGit\nEC:AF:F9\t\tHailo Technologies Ltd.\nEC:B0:D2\t\tEM Microelectronic\nEC:B0:E1\t\tCiena Corporation\nEC:B1:06\t\tAcuro Networks, Inc\nEC:B1:D7\t\tHewlett Packard\nEC:B1:E0\t\tEltex Enterprise LTD\nEC:B3:13\t\tShenzhen Gongjin Electronics Co.,Lt\nEC:B4:E8\t\tWistron Mexico SA de CV\nEC:B5:41\t\tSHINANO E and E Co.Ltd.\nEC:B5:50\t\tSamsung Electronics Co.,Ltd\nEC:B5:FA\t\tPhilips Lighting BV\nEC:B8:70\t\tBeijing Heweinet Technology Co.,Ltd.\nEC:B8:78\t\tHuawei Device Co., Ltd.\nEC:B9:07\t\tCloudGenix Inc\nEC:B9:70\t\tRuijie Networks Co.,LTD\nEC:BA:FE\t\tGiroptic\nEC:BB:78\t\tCisco Systems, Inc\nEC:BB:AE\t\tDigivoice Tecnologia em Eletronica Ltda\nEC:BD:09\t\tFUSION Electronics Ltd\nEC:BD:1D\t\tCisco Systems, Inc\nEC:BE:5F\t\tVestel Elektronik San ve Tic. A.S.\nEC:BE:DD\t\tSagemcom Broadband SAS\nEC:BF:D0\t\tTexas Instruments\nEC:C0:18\t\tCisco Systems, Inc\nEC:C0:1B\t\tHuawei Technologies Co.,Ltd\nEC:C0:6A\t\tPowerChord Group Limited\nEC:C0:7A\t\tLaird Connectivity\nEC:C1:AB\t\tGuangzhou Shiyuan Electronic Technology Company Limited\nEC:C3:02\t\tHUMAX Co., Ltd.\nEC:C3:42\t\tzte corporation\nEC:C3:8A\t\tAccuenergy (CANADA) Inc\nEC:C3:B0\t\tzte corporation\nEC:C4:0D\t\tNintendo Co.,Ltd\nEC:C5:7F\t\tSuzhou Pairlink Network Technology\nEC:C5:D2\t\tHuawei Device Co., Ltd.\nEC:C8:82\t\tCisco Systems, Inc\nEC:C8:9C\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nEC:C9:FF\t\tEspressif Inc.\nEC:CB:30\t\tHuawei Technologies Co.,Ltd\nEC:CD:4C\t\tNew H3C Technologies Co., Ltd\nEC:CD:6D\t\tAllied Telesis, Inc.\nEC:CE:13\t\tCisco Systems, Inc\nEC:CE:D7\t\tApple, Inc.\nEC:CF:70\t\tFujian Star-Net Communication Co.,Ltd\nEC:D0:0E\t\tMiraeRecognition Co., Ltd.\nEC:D0:40\t\tGEA Farm Technologies GmbH\nEC:D0:9F\t\tXiaomi Communications Co Ltd\nEC:D1:9A\t\tZhuhai Liming Industries Co., Ltd\nEC:D6:8A\t\tShenzhen JMicron Intelligent Technology Developmen\nEC:D9:09\t\tAlpsalpine Co,.Ltd\nEC:D9:25\t\tRami\nEC:D9:50\t\tIrt Sa\nEC:D9:D1\t\tShenzhen TG-NET Botone Technology Co.,Ltd.\nEC:DA:3B\t\tEspressif Inc.\nEC:DA:59\t\tNew H3C Technologies Co., Ltd\nEC:DB:86\t\tApi-K\nEC:DD:24\t\tCisco Systems, Inc\nEC:DE:3D\t\tLamprey Networks, Inc.\nEC:DF:3A\t\tvivo Mobile Communication Co., Ltd.\nEC:DF:C9\t\tHangzhou Microimage Software Co., Ltd\nEC:E0:9B\t\tSamsung Electronics Co.,Ltd\nEC:E1:54\t\tBeijing Unisound Information Technology Co.,Ltd.\nEC:E1:A9\t\tCisco Systems, Inc\nEC:E2:FD\t\tSKG Electric Group(Thailand) Co., Ltd.\nEC:E3:34\t\tEspressif Inc.\nEC:E5:12\t\ttado GmbH\nEC:E5:55\t\tHirschmann Automation\nEC:E6:1D\t\tHuawei Device Co., Ltd.\nEC:E6:60\t\tQingdao Hisense Communications Co.,Ltd.\nEC:E6:A2\t\tFiberhome Telecommunication Technologies Co.,LTD\nEC:E7:44\t\tOmntec mfg. inc\nEC:E7:8E\t\tAsiaTelco Technologies Co.\nEC:E7:A7\t\tIntel Corporate\nEC:E7:C2\t\tChina Mobile Group Device Co.,Ltd.\nEC:E9:0B\t\tSistema Solucoes Eletronicas Ltda - Easytech\nEC:E9:15\t\tSTI Ltd\nEC:E9:F5\t\tHuawei Technologies Co.,Ltd\nEC:E9:F8\t\tGuang Zhou TRI-SUN Electronics Technology  Co., Ltd\nEC:EA:03\t\tDarfon Lighting Corp\nEC:EB:B8\t\tHewlett Packard Enterprise\nEC:ED:04\t\tIntel Corporate\nEC:ED:73\t\tMotorola Mobility LLC, a Lenovo Company\nEC:EE:D8\t\tZTLX Network Technology Co.,Ltd\nEC:EF:17\t\tSunplus Technology Co., Ltd.\nEC:F0:0E\t\tAboCom\nEC:F0:FE\t\tzte corporation\nEC:F2:2B\t\tTecno Mobile Limited\nEC:F2:36\t\tNeomontana Electronics\nEC:F3:42\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nEC:F3:5B\t\tNokia Corporation\nEC:F3:7A\t\tForecr OU\nEC:F4:0C\t\tCisco Systems, Inc\nEC:F4:51\t\tArcadyan Corporation\nEC:F4:BB\t\tDell Inc.\nEC:F6:4C\t\tSilicon Laboratories\nEC:F6:BD\t\tSncf Mobilités\nEC:F7:2B\t\tHd Digital Tech Co., Ltd.\nEC:F8:D0\t\tHuawei Technologies Co.,Ltd\nEC:F8:EB\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nEC:FA:03\t\tFca\nEC:FA:5C\t\tBeijing Xiaomi Electronics Co., Ltd.\nEC:FA:AA\t\tThe IMS Company\nEC:FA:BC\t\tEspressif Inc.\nEC:FA:F4\t\tSenRa Tech Pvt. Ltd\nEC:FC:2F\t\tSagemcom Broadband SAS\nEC:FC:55\t\tA. Eberle GmbH & Co. KG\nEC:FC:C6\t\tHewlett Packard Enterprise\nEC:FE:7E\t\tBlueRadios, Inc.\nEC:FF:3A\t\tApple, Inc.\nF0:00:7F\t\tJanz - Contadores de Energia, SA\nF0:01:6E\t\tTianyi Telecom Terminals Company Limited\nF0:02:2B\t\tChrontel\nF0:02:48\t\tSmarteBuilding\nF0:03:8C\t\tAzureWave Technology Inc.\nF0:03:BC\t\tCisco Systems, Inc\nF0:04:E1\t\tApple, Inc.\nF0:05:1B\t\tSamsung Electronics Co.,Ltd\nF0:07:27\t\tInterel Building Automation\nF0:07:86\t\tShandong Bittel Electronics Co., Ltd\nF0:08:D1\t\tEspressif Inc.\nF0:08:F1\t\tSamsung Electronics Co.,Ltd\nF0:09:0D\t\tTP-Link Systems Inc\nF0:0D:5C\t\tJinQianMao  Technology Co.,Ltd.\nF0:0D:F5\t\tACOMA Medical Industry Co,. Ltd.\nF0:0E:1D\t\tMegafone Limited\nF0:0E:BF\t\tZettaHash Inc.\nF0:0F:EC\t\tHuawei Technologies Co.,Ltd\nF0:10:90\t\tNew H3C Technologies Co., Ltd\nF0:10:A5\t\tTexas Instruments\nF0:10:AB\t\tChina Mobile (Hangzhou) Information Technology Co., Ltd.\nF0:12:04\t\tIEEE Registration Authority\nF0:12:04:00:00:00/28\tAnnapurna labs\nF0:12:04:10:00:00/28\tMetaX\nF0:12:04:20:00:00/28\tWiSig Networks Private Limited\nF0:12:04:30:00:00/28\tAPCON, Inc.\nF0:12:04:40:00:00/28\tDongguan Onyx Electronics Co., Ltd\nF0:12:04:50:00:00/28\tMaple Systems. Inc.\nF0:12:04:60:00:00/28\tShenzhen FENVI Technology co.,ltd\nF0:12:04:70:00:00/28\tAutani LLC\nF0:12:04:80:00:00/28\tAnnapurna labs\nF0:12:04:90:00:00/28\tFlextronics Tech I Pvt Ltd\nF0:12:04:A0:00:00/28\tAstrome Technoogies Pvt Ltd\nF0:12:04:B0:00:00/28\tHoneyComm IoT Technology(Shenzhen)Co.,Ltd.\nF0:12:04:C0:00:00/28\tFairPhone B.V.\nF0:12:04:D0:00:00/28\tLightShark\nF0:12:04:E0:00:00/28\tTianjin Tianchuan Electric Drive Co.,Ltd.\nF0:13:C1\t\tHannto Technology Co., Ltd\nF0:13:C3\t\tShenzhen Fenda Technology Co., Ltd\nF0:15:A0\t\tKyungDong One Co., Ltd.\nF0:15:B9\t\tPlayFusion Limited\nF0:16:28\t\tTechnicolor (China) Technology Co., Ltd.\nF0:18:2B\t\tLG Chem\nF0:18:98\t\tApple, Inc.\nF0:1A:A0\t\tHewlett Packard Enterprise\nF0:1B:24\t\tzte corporation\nF0:1B:6C\t\tvivo Mobile Communication Co., Ltd.\nF0:1C:13\t\tLG Electronics (Mobile Communications)\nF0:1C:2D\t\tJuniper Networks\nF0:1D:2D\t\tCisco Systems, Inc\nF0:1D:BC\t\tMicrosoft Corporation\nF0:1E:34\t\tORICO Technologies Co., Ltd\nF0:1E:AC\t\tRentokil Initial\nF0:1F:AF\t\tDell Inc.\nF0:1F:C7\t\tApple, Inc.\nF0:20:FF\t\tIntel Corporate\nF0:21:78\t\tUnionman Technology Co.,Ltd\nF0:21:9D\t\tCal-Comp Electronics & Communications Company Ltd.\nF0:21:E0\t\teero inc.\nF0:22:1D\t\tIEEE Registration Authority\nF0:22:1D:00:00:00/28\tThanhbinh Company - E111 Factory\nF0:22:1D:10:00:00/28\tDr. Eberl MBE Komponenten GmbH\nF0:22:1D:20:00:00/28\tChonel Industry?shanghai?Co., Ltd.\nF0:22:1D:30:00:00/28\tShenZhen Shizao Electronic Technology\nF0:22:1D:40:00:00/28\tSynergies Intelligent Systems Inc.\nF0:22:1D:50:00:00/28\tShenzhen SuyuVisonTechnology Co.,Ltd\nF0:22:1D:60:00:00/28\tVcognition Technologies Inc.\nF0:22:1D:70:00:00/28\tBulat Co., Limited\nF0:22:1D:80:00:00/28\tShenzhen Glazero Technology Co., Ltd.\nF0:22:1D:90:00:00/28\tShanghai Gfanxvision Intelligent Technology Co.Ltd\nF0:22:1D:A0:00:00/28\tHangzhou Gold Electronic Equipment Co., Ltd\nF0:22:1D:B0:00:00/28\tLK Systems AB\nF0:22:1D:C0:00:00/28\tEstone Technology LTD\nF0:22:1D:D0:00:00/28\tSchleissheimer Soft- und Hardwareentwicklung GmbH\nF0:22:1D:E0:00:00/28\toToBrite Electronics, Inc.\nF0:22:4E\t\tEsan electronic co.\nF0:23:29\t\tShowa Denki Co.,Ltd.\nF0:23:AE\t\tAMPAK Technology,Inc.\nF0:23:B9\t\tIEEE Registration Authority\nF0:23:B9:00:00:00/28\tAquametro AG\nF0:23:B9:10:00:00/28\tUbiant\nF0:23:B9:20:00:00/28\tRaysgem Electronics and Technology Co.Ltd\nF0:23:B9:30:00:00/28\tBSP RUS Ltd.\nF0:23:B9:40:00:00/28\tEzvis Limited\nF0:23:B9:50:00:00/28\tAudeara Pty. Ltd.\nF0:23:B9:60:00:00/28\tXiamen Jinhaode Electronic Co.,Ltd\nF0:23:B9:70:00:00/28\tTranscend Building Automation control network corporation\nF0:23:B9:80:00:00/28\tG3 Technologies< Inc\nF0:23:B9:90:00:00/28\tEmu Technology\nF0:23:B9:A0:00:00/28\tAnnapurna labs\nF0:23:B9:B0:00:00/28\tQ Core Medical Ltd\nF0:23:B9:C0:00:00/28\tShenzhen Lachesis Mhealth Co., Ltd.\nF0:23:B9:D0:00:00/28\tShenyang Ali Technology Company Limited\nF0:23:B9:E0:00:00/28\tDomotz Ltd\nF0:24:05\t\tOPUS High Technology Corporation\nF0:24:08\t\tTalaris (Sweden) AB\nF0:24:75\t\tApple, Inc.\nF0:24:F9\t\tEspressif Inc.\nF0:25:72\t\tCisco Systems, Inc\nF0:25:8E\t\tHuawei Technologies Co.,Ltd\nF0:25:B7\t\tSamsung Electro-Mechanics(Thailand)\nF0:26:24\t\tWafa Technologies Co., Ltd.\nF0:26:4C\t\tSigrist-Photometer AG\nF0:26:F8\t\tWorldcns Co.,Ltd.\nF0:27:2D\t\tAmazon Technologies Inc.\nF0:27:45\t\tF-Secure Corporation\nF0:27:65\t\tMurata Manufacturing Co., Ltd.\nF0:27:A0\t\tApple, Inc.\nF0:29:29\t\tCisco Systems, Inc\nF0:2A:23\t\tCreative Next Design\nF0:2A:2B\t\tIEEE Registration Authority\nF0:2A:2B:00:00:00/28\tMerlin Security Inc.\nF0:2A:2B:10:00:00/28\tTobi Tribe Inc.\nF0:2A:2B:20:00:00/28\tShanghai Armour Technology Co., Ltd.\nF0:2A:2B:30:00:00/28\tFrigotel SRL\nF0:2A:2B:40:00:00/28\tOnclave Networks\nF0:2A:2B:50:00:00/28\tAgile Sports Technologies, dba Hudl\nF0:2A:2B:60:00:00/28\tShenzhen ORVIBO Technology Co., Ltd.\nF0:2A:2B:70:00:00/28\tProtronix s.r.o.\nF0:2A:2B:80:00:00/28\tTenways Engineering Service Ltd\nF0:2A:2B:90:00:00/28\tZiGong Pengcheng Technology Co.,Ltd\nF0:2A:2B:A0:00:00/28\tNavigil Ltd\nF0:2A:2B:B0:00:00/28\tEL.MO. spa\nF0:2A:2B:C0:00:00/28\tComexio GmbH\nF0:2A:2B:D0:00:00/28\tDefinitely Win Corp.,Ltd.\nF0:2A:2B:E0:00:00/28\tShenzhen CUCO Technology Co., Ltd\nF0:2A:61\t\tWaldo Networks, Inc.\nF0:2B:18\t\tNanjing Jiahao Technology Co., Ltd.\nF0:2B:7C\t\tExtreme Networks Headquarters\nF0:2C:59\t\tChipsea Technologies (Shenzhen) Crop.\nF0:2E:51\t\tCasa Systems\nF0:2F:4B\t\tApple, Inc.\nF0:2F:74\t\tASUSTek COMPUTER INC.\nF0:2F:9E\t\tAmazon Technologies Inc.\nF0:2F:A7\t\tHuawei Technologies Co.,Ltd\nF0:2F:D8\t\tBi2-Vision\nF0:32:1A\t\tMita-Teknik A/S\nF0:33:E5\t\tHuawei Technologies Co.,Ltd\nF0:34:04\t\tTCT mobile ltd\nF0:35:75\t\tHui Zhou Gaoshengda Technology Co.,LTD\nF0:37:A1\t\tHuike Electronics (SHENZHEN) CO., LTD.\nF0:37:CF\t\tHuawei Device Co., Ltd.\nF0:39:65\t\tSamsung Electronics Co.,Ltd\nF0:3A:4B\t\tBloombase, Inc.\nF0:3A:55\t\tOmega Elektronik AS\nF0:3D:03\t\tTecno Mobile Limited\nF0:3D:29\t\tActility\nF0:3E:90\t\tRuckus Wireless\nF0:3E:BF\t\tGogoro Taiwan Limited\nF0:3F:03\t\tPrivate\nF0:3F:95\t\tHuawei Technologies Co.,Ltd\nF0:3F:F8\t\tR L Drake\nF0:40:7B\t\tFiberhome Telecommunication Technologies Co.,LTD\nF0:40:EC\t\tRainX PTE. LTD.\nF0:41:C6\t\tHeat Tech Company, Ltd.\nF0:41:C8\t\tIEEE Registration Authority\nF0:41:C8:00:00:00/28\tLinpa Acoustic Technology Co.,Ltd\nF0:41:C8:10:00:00/28\tDongGuan Siyoto Electronics Co., Ltd\nF0:41:C8:20:00:00/28\tShenzhen Medica Technology Development Co., Ltd.\nF0:41:C8:30:00:00/28\tShenzhen Wisewing Internet Technology Co.,Ltd\nF0:41:C8:40:00:00/28\tCandelic Limited\nF0:41:C8:50:00:00/28\tXI'AN MEI SHANG MEI WIRELESS TECHNOLOGY.Co., Ltd.\nF0:41:C8:60:00:00/28\tAED Engineering GmbH\nF0:41:C8:70:00:00/28\tNanchang BlackShark Co.,Ltd.\nF0:41:C8:80:00:00/28\tPostium Korea Co., Ltd.\nF0:41:C8:90:00:00/28\tShenzhen  Nufilo Electronic Technology Co., Ltd.\nF0:41:C8:A0:00:00/28\tTelstra\nF0:41:C8:B0:00:00/28\tPowervault Ltd\nF0:41:C8:C0:00:00/28\tShanghai Think-Force Electronic Technology Co. Ltd\nF0:41:C8:D0:00:00/28\tATN Media Group FZ LLC\nF0:41:C8:E0:00:00/28\tShenzhen Umind Technology Co., Ltd.\nF0:42:1C\t\tIntel Corporate\nF0:42:F5\t\tHuawei Device Co., Ltd.\nF0:43:35\t\tDVN(Shanghai)Ltd.\nF0:43:47\t\tHuawei Technologies Co.,Ltd\nF0:45:DA\t\tTexas Instruments\nF0:46:3B\t\tComcast Cable Corporation\nF0:4A:02\t\tCisco Systems, Inc\nF0:4A:2B\t\tPYRAMID Computer GmbH\nF0:4A:3D\t\tBosch Thermotechnik GmbH\nF0:4B:3A\t\tJuniper Networks\nF0:4B:6A\t\tScientific Production Association Siberian Arsenal, Ltd.\nF0:4B:8A\t\tVantiva USA LLC\nF0:4B:F2\t\tJTECH Communications, Inc.\nF0:4C:D5\t\tMaxlinear, Inc\nF0:4D:A2\t\tDell Inc.\nF0:4D:D4\t\tSagemcom Broadband SAS\nF0:4F:7C\t\tAmazon Technologies Inc.\nF0:51:36\t\tTCT mobile ltd\nF0:51:EA\t\tFitbit, Inc.\nF0:54:94\t\tHoneywell Connected Building\nF0:55:01\t\tHuawei Device Co., Ltd.\nF0:57:8D\t\tJetHome LLC\nF0:57:A6\t\tIntel Corporate\nF0:58:49\t\tCareView Communications\nF0:5A:09\t\tSamsung Electronics Co.,Ltd\nF0:5B:7B\t\tSamsung Electronics Co.,Ltd\nF0:5C:0E\t\tHuawei Device Co., Ltd.\nF0:5C:19\t\tHewlett Packard Enterprise\nF0:5C:77\t\tGoogle, Inc.\nF0:5C:D5\t\tApple, Inc.\nF0:5D:89\t\tDycon Limited\nF0:5D:C8\t\tDuracell Powermat\nF0:5E:CD\t\tTexas Instruments\nF0:5F:5A\t\tGetriebebau NORD GmbH and Co. KG\nF0:61:30\t\tAdvantage Pharmacy Services, LLC\nF0:61:C0\t\tHewlett Packard Enterprise\nF0:61:F3\t\tComcast Cable Corporation\nF0:62:0D\t\tShenzhen Egreat Tech Corp.,Ltd\nF0:62:5A\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nF0:62:81\t\tProCurve Networking by HP\nF0:63:F9\t\tHuawei Technologies Co.,Ltd\nF0:64:26\t\tExtreme Networks Headquarters\nF0:65:AE\t\tSamsung Electronics Co.,Ltd\nF0:65:C2\t\tYanfeng Visteon Electronics Technology (Shanghai) Co.,Ltd.\nF0:65:DD\t\tPrimax Electronics Ltd.\nF0:67:28\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nF0:68:53\t\tIntegrated Corporation\nF0:68:65\t\tTaicang T&W Electronics\nF0:6B:CA\t\tSamsung Electronics Co.,Ltd\nF0:6C:5D\t\tXiaomi Communications Co Ltd\nF0:6C:73\t\tNokia\nF0:6D:78\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nF0:6E:0B\t\tMicrosoft Corporation\nF0:6E:32\t\tMicrotel Innovation S.R.L.\nF0:6F:46\t\tUbiik\nF0:6F:CE\t\tRuckus Wireless\nF0:70:4F\t\tSamsung Electronics Co.,Ltd\nF0:72:8C\t\tSamsung Electronics Co.,Ltd\nF0:72:EA\t\tGoogle, Inc.\nF0:73:AE\t\tPEAK-System Technik\nF0:74:85\t\tNGD Systems, Inc.\nF0:74:8D\t\tRuijie Networks Co.,LTD\nF0:74:BF\t\tSilicon Laboratories\nF0:74:E4\t\tThundercomm Technology Co., Ltd\nF0:76:1C\t\tCompal Information (Kunshan) Co., Ltd.\nF0:76:6F\t\tApple, Inc.\nF0:77:65\t\tSourcefire, Inc\nF0:77:C3\t\tIntel Corporate\nF0:77:D0\t\tXcellen\nF0:78:07\t\tApple, Inc.\nF0:78:16\t\tCisco Systems, Inc\nF0:79:59\t\tASUSTek COMPUTER INC.\nF0:79:60\t\tApple, Inc.\nF0:79:E8\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nF0:7A:55\t\tzte corporation\nF0:7B:65\t\tSagemcom Broadband SAS\nF0:7B:CB\t\tHon Hai Precision Ind. Co.,Ltd.\nF0:7C:C7\t\tJuniper Networks\nF0:7D:68\t\tD-Link Corporation\nF0:7F:06\t\tCisco Systems, Inc\nF0:7F:0C\t\tLeopold Kostal GmbH &Co. KG\nF0:81:73\t\tAmazon Technologies Inc.\nF0:81:75\t\tSagemcom Broadband SAS\nF0:81:AF\t\tIrz Automation Technologies Ltd\nF0:82:61\t\tSagemcom Broadband SAS\nF0:82:C0\t\tSilicon Laboratories\nF0:84:2F\t\tADB Broadband Italia\nF0:84:C9\t\tzte corporation\nF0:85:C1\t\tShenzhen Rf-Link Technology Co.,Ltd.\nF0:86:20\t\tArcadyan Corporation\nF0:86:6F\t\tEM Microelectronic\nF0:87:56\t\tZyxel Communications Corporation\nF0:87:7F\t\tMagnetar Technology Shenzhen Co., LTD.\nF0:8A:28\t\tJIANGSU HENGSION ELECTRONIC S and T CO.,LTD\nF0:8A:76\t\tSamsung Electronics Co.,Ltd\nF0:8B:FE\t\tCostel.,Co.Ltd\nF0:8C:FB\t\tFiberhome Telecommunication Technologies Co.,LTD\nF0:8E:DB\t\tVeloCloud Networks\nF0:90:08\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nF0:92:1C\t\tHewlett Packard\nF0:92:B4\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nF0:93:3A\t\tNxtConect\nF0:93:C5\t\tGarland Technology\nF0:95:F1\t\tCarl Zeiss AG\nF0:96:02\t\tEarda Technologies co Ltd\nF0:97:E5\t\tTamio, Inc\nF0:98:38\t\tHuawei Technologies Co.,Ltd\nF0:98:9D\t\tApple, Inc.\nF0:99:19\t\tGarmin International\nF0:99:B6\t\tApple, Inc.\nF0:99:BF\t\tApple, Inc.\nF0:9A:51\t\tShanghai Viroyal Electronic Technology Company Limited\nF0:9B:B8\t\tHuawei Technologies Co.,Ltd\nF0:9C:BB\t\tRaonThink Inc.\nF0:9C:D7\t\tGuangzhou Blue Cheetah Intelligent Technology Co., Ltd.\nF0:9C:E9\t\tExtreme Networks Headquarters\nF0:9E:4A\t\tIntel Corporate\nF0:9E:63\t\tCisco Systems, Inc\nF0:9E:9E\t\tEspressif Inc.\nF0:9F:C2\t\tUbiquiti Inc\nF0:9F:FC\t\tSHARP Corporation\nF0:A0:B1\t\tHuawei Technologies Co.,Ltd\nF0:A2:25\t\tAmazon Technologies Inc.\nF0:A3:5A\t\tApple, Inc.\nF0:A3:B2\t\tHui Zhou Gaoshengda Technology Co.,LTD\nF0:A6:54\t\tCloud Network Technology Singapore Pte. Ltd.\nF0:A7:31\t\tTP-Link Systems Inc\nF0:A7:64\t\tGST Co., Ltd.\nF0:A7:B2\t\tFutaba Corporation\nF0:A8:82\t\tshenzhen trolink  Technology Co.,Ltd\nF0:A9:51\t\tHuawei Technologies Co.,Ltd\nF0:A9:68\t\tAntailiye Technology Co.,Ltd\nF0:AA:0B\t\tArra Networks/ Spectramesh\nF0:AB:1F\t\tzte corporation\nF0:AB:54\t\tMitsumi Electric Co.,Ltd.\nF0:AB:F3\t\tFiberhome Telecommunication Technologies Co.,LTD\nF0:AC:A4\t\tHBC-radiomatic\nF0:AC:D7\t\tIEEE Registration Authority\nF0:AC:D7:00:00:00/28\tGuilin glsun Science and Tech Co.,LTD\nF0:AC:D7:10:00:00/28\tIntenta GmbH\nF0:AC:D7:20:00:00/28\tQuantum Power Systems\nF0:AC:D7:30:00:00/28\tMed-Pat/Inn-Phone\nF0:AC:D7:40:00:00/28\tSercomm Corporation.\nF0:AC:D7:50:00:00/28\tPavo Tasarim Uretim Ticaret A.S.\nF0:AC:D7:60:00:00/28\tSuzhou Pairlink Network Technology\nF0:AC:D7:70:00:00/28\tHanju Network Technologies Co.\nF0:AC:D7:80:00:00/28\tTelefonix Incorporated\nF0:AC:D7:90:00:00/28\tU3storage Technologies Co., Ltd\nF0:AC:D7:A0:00:00/28\tGroupeer Technologies\nF0:AC:D7:B0:00:00/28\tZhejiang Makepower Electronics,Inc.\nF0:AC:D7:C0:00:00/28\tSimprints Technology Ltd\nF0:AC:D7:D0:00:00/28\tSmart Power Technology Co., Ltd.\nF0:AC:D7:E0:00:00/28\tFiziico Co., Ltd.\nF0:AD:4E\t\tGlobalscale Technologies, Inc.\nF0:AE:51\t\tXi3 Corp\nF0:AE:66\t\tCosonic Intelligent Technologies Co., Ltd.\nF0:AF:50\t\tPhantom Intelligence\nF0:AF:85\t\tCommscope\nF0:B0:14\t\tAVM Audiovisuelles Marketing und Computersysteme GmbH\nF0:B0:22\t\tTOHO Electronics INC.\nF0:B0:40\t\tHunan Fn-Link Technology Limited\nF0:B0:52\t\tRuckus Wireless\nF0:B0:E7\t\tApple, Inc.\nF0:B1:07\t\tEricsson AB\nF0:B1:1D\t\tNokia\nF0:B1:3F\t\tHuawei Device Co., Ltd.\nF0:B2:B9\t\tIntel Corporate\nF0:B2:E5\t\tCisco Systems, Inc\nF0:B3:1E\t\tUniversal Electronics, Inc.\nF0:B3:EC\t\tApple, Inc.\nF0:B4:29\t\tXiaomi Communications Co Ltd\nF0:B4:79\t\tApple, Inc.\nF0:B4:D2\t\tD-Link International\nF0:B5:B7\t\tDisruptive Technologies Research AS\nF0:B5:D1\t\tTexas Instruments\nF0:B6:1E\t\tIntel Corporate\nF0:B6:61\t\teero inc.\nF0:B6:EB\t\tPoslab Technology Co., Ltd.\nF0:B9:68\t\tItel Mobile Limited\nF0:BC:C8\t\tMaxID (Pty) Ltd\nF0:BC:C9\t\tPfu Limited\nF0:BD:2E\t\tH+S Polatis Ltd\nF0:BD:EE\t\tHuawei Device Co., Ltd.\nF0:BD:F1\t\tSipod Inc.\nF0:BE:25\t\tDongguan Cannice Precision Manufacturing Co., Ltd.\nF0:BF:97\t\tSony Corporation\nF0:C1:CE\t\tGoodWe Technologies CO., Ltd\nF0:C1:F1\t\tApple, Inc.\nF0:C2:4C\t\tZhejiang FeiYue Digital Technology Co., Ltd\nF0:C2:7C\t\tMianyang Netop Telecom Equipment Co.,Ltd.\nF0:C3:71\t\tApple, Inc.\nF0:C4:2F\t\tHuawei Device Co., Ltd.\nF0:C4:78\t\tHuawei Technologies Co.,Ltd\nF0:C5:58\t\tU.D.Electronic Corp.\nF0:C7:25\t\tApple, Inc.\nF0:C7:45\t\tTecno Mobile Limited\nF0:C7:7F\t\tTexas Instruments\nF0:C8:14\t\tShenzhen Bilian Electronic Co.，Ltd\nF0:C8:50\t\tHuawei Technologies Co.,Ltd\nF0:C8:8C\t\tLeddarTech Inc.\nF0:C8:B5\t\tHuawei Technologies Co.,Ltd\nF0:C9:D1\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nF0:CB:A1\t\tApple, Inc.\nF0:CC:E0\t\tShenzhen All-Smartlink Technology Co.,Ltd.\nF0:CD:31\t\tSamsung Electronics Co.,Ltd\nF0:CF:4D\t\tBitRecords GmbH\nF0:D0:8C\t\tTCT mobile ltd\nF0:D1:4F\t\tLinear Llc\nF0:D1:A9\t\tApple, Inc.\nF0:D1:B8\t\tLedvance\nF0:D2:F1\t\tAmazon Technologies Inc.\nF0:D3:1F\t\tApple, Inc.\nF0:D3:A7\t\tCobaltRay Co., Ltd\nF0:D3:E7\t\tSensometrix SA\nF0:D4:15\t\tIntel Corporate\nF0:D4:E2\t\tDell Inc.\nF0:D4:F6\t\tLars Thrane A/S\nF0:D4:F7\t\tvarram system\nF0:D5:06\t\tUbee Interactive Co., Limited\nF0:D5:BF\t\tIntel Corporate\nF0:D6:35\t\tApple, Inc.\nF0:D6:57\t\tEchosens\nF0:D7:67\t\tAxema Passagekontroll AB\nF0:D7:93\t\tApple, Inc.\nF0:D7:AA\t\tMotorola Mobility LLC, a Lenovo Company\nF0:D7:AF\t\tIEEE Registration Authority\nF0:D7:AF:00:00:00/28\tID Tech Japan Co.,Ltd.\nF0:D7:AF:10:00:00/28\tBeijing Serviatech lnformation Tech Co.,Ltd\nF0:D7:AF:20:00:00/28\tBlacknight Internet Solutions Limited\nF0:D7:AF:30:00:00/28\t720?bei jing?Health iTech Co.,Ltd\nF0:D7:AF:40:00:00/28\tADAM Audio GmbH\nF0:D7:AF:50:00:00/28\tDongguan Huili electroacoustic Industrial Co.,ltd\nF0:D7:AF:60:00:00/28\tAnord Mardix (USA) Inc.\nF0:D7:AF:70:00:00/28\tRievtech Electronic Co.,Ltd\nF0:D7:AF:80:00:00/28\tShen Zhen Michip Technologies Co.,Ltd.\nF0:D7:AF:90:00:00/28\tNew IT Project LLC\nF0:D7:AF:A0:00:00/28\tMstar Technologies,Inc\nF0:D7:AF:B0:00:00/28\tEvco Spa\nF0:D7:AF:C0:00:00/28\tShenzhen Virtual Clusters Information Technology Co.,Ltd.\nF0:D7:AF:D0:00:00/28\tDongguan Gedi Electrons Techeology Co.,LTD\nF0:D7:AF:E0:00:00/28\tWren Associates, LTD\nF0:D7:DC\t\tWesine (Wuhan) Technology Co., Ltd.\nF0:D7:EE\t\tHuawei Device Co., Ltd.\nF0:D8:05\t\tCisco Systems, Inc\nF0:D9:B2\t\tExo S.A.\nF0:DA:7C\t\tRlh Industries,Inc.\nF0:DB:2A\t\tLanner Electronics, Inc.\nF0:DB:30\t\tYottabyte\nF0:DB:E2\t\tApple, Inc.\nF0:DB:F8\t\tApple, Inc.\nF0:DC:E2\t\tApple, Inc.\nF0:DE:71\t\tShanghai EDO Technologies Co.,Ltd.\nF0:DE:B9\t\tShangHai Y&Y Electronics Co., Ltd\nF0:DE:F1\t\tWistron Infocomm (Zhongshan) Corporation\nF0:E3:DC\t\tTecon MT, LLC\nF0:E4:A2\t\tHuawei Technologies Co.,Ltd\nF0:E5:C3\t\tDrägerwerk AG & Co. KG aA\nF0:E7:52\t\tShenzhen Huajuxin Semiconductor Co.,ltd\nF0:E7:7E\t\tSamsung Electronics Co.,Ltd\nF0:EB:D0\t\tShanghai Feixun Communication Co.,Ltd.\nF0:EC:39\t\tEssec\nF0:ED:19\t\tzte corporation\nF0:ED:1E\t\tBilkon Bilgisayar Kontrollu Cih. Im.Ltd.\nF0:ED:B8\t\tServercom (India) Private Limited\nF0:EE:10\t\tSamsung Electronics Co.,Ltd\nF0:EE:58\t\tPACE Telematics GmbH\nF0:EE:7A\t\tApple, Inc.\nF0:EE:BB\t\tVIPAR GmbH\nF0:EF:86\t\tGoogle, Inc.\nF0:EF:D2\t\tTf Payment Service Co., Ltd\nF0:F0:02\t\tHon Hai Precision Ind. Co.,Ltd.\nF0:F0:69\t\tPrivate\nF0:F0:8F\t\tNextek Solutions Pte Ltd\nF0:F0:A4\t\tAmazon Technologies Inc.\nF0:F2:49\t\tHitron Technologies. Inc\nF0:F2:60\t\tMobitec AB\nF0:F3:36\t\tTp-Link Technologies Co.,Ltd.\nF0:F5:64\t\tSamsung Electronics Co.,Ltd\nF0:F5:6D\t\tKubota Corporation\nF0:F5:AE\t\tAdaptrum Inc.\nF0:F5:BD\t\tEspressif Inc.\nF0:F6:1C\t\tApple, Inc.\nF0:F6:44\t\tWhitesky Science & Technology Co.,Ltd.\nF0:F6:69\t\tMotion Analysis Corporation\nF0:F6:9C\t\tNIO Co., Ltd.\nF0:F6:C1\t\tSonos, Inc.\nF0:F7:55\t\tCisco Systems, Inc\nF0:F7:B3\t\tPhorm\nF0:F7:E7\t\tHuawei Technologies Co.,Ltd\nF0:F7:FC\t\tHuawei Technologies Co.,Ltd\nF0:F8:42\t\tKEEBOX, Inc.\nF0:F8:4A\t\tBuffalo.Inc\nF0:F8:F2\t\tTexas Instruments\nF0:F9:F7\t\tIES GmbH & Co. KG\nF0:FA:C7\t\tHuawei Device Co., Ltd.\nF0:FC:65\t\tSynaXG Technologies Pte. Ltd.\nF0:FC:C8\t\tCommscope\nF0:FD:45\t\tSilicon Laboratories\nF0:FD:A0\t\tAcurix Networks Pty Ltd\nF0:FD:DD\t\tFoxtron Vehicle Technologies Co., Ltd.\nF0:FE:6B\t\tShanghai High-Flying Electronics Technology Co., Ltd\nF0:FE:E7\t\tHuawei Device Co., Ltd.\nF4:00:46\t\tON Semiconductor\nF4:02:23\t\tPAX Computer Technology(Shenzhen) Ltd.\nF4:02:28\t\tSamsung Electro-Mechanics(Thailand)\nF4:02:70\t\tDell Inc.\nF4:03:04\t\tGoogle, Inc.\nF4:03:21\t\tBeNeXt B.V.\nF4:03:2A\t\tAmazon Technologies Inc.\nF4:03:2F\t\tReduxio Systems\nF4:03:43\t\tHewlett Packard Enterprise\nF4:04:4C\t\tValenceTech Limited\nF4:05:95\t\tSagemcom Broadband SAS\nF4:06:16\t\tApple, Inc.\nF4:06:69\t\tIntel Corporate\nF4:06:8D\t\tdevolo AG\nF4:06:A5\t\tHangzhou Bianfeng Networking Technology Co., Ltd.\nF4:09:D8\t\tSamsung Electro-Mechanics(Thailand)\nF4:0A:2E\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nF4:0A:4A\t\tINDUSNET Communication Technology Co.,LTD\nF4:0B:93\t\tBlackBerry RTS\nF4:0B:9F\t\tCig Shanghai Co Ltd\nF4:0E:01\t\tApple, Inc.\nF4:0E:11\t\tIEEE Registration Authority\nF4:0E:11:00:00:00/28\trealphone technology co.,ltd\nF4:0E:11:10:00:00/28\tBeijing Dongjin Aero-Tech Co., Ltd\nF4:0E:11:20:00:00/28\tAxel srl\nF4:0E:11:30:00:00/28\tShenzhen headsun technology\nF4:0E:11:40:00:00/28\tDayang Technology Development Inc.\nF4:0E:11:50:00:00/28\tE-Song\nF4:0E:11:60:00:00/28\tAlpha Design Technologies Pvt Ltd\nF4:0E:11:70:00:00/28\tShenzhen Grandsun Electronic Co.,Ltd.\nF4:0E:11:80:00:00/28\tZeepro Inc.\nF4:0E:11:90:00:00/28\tSterna Security\nF4:0E:11:A0:00:00/28\tKodpro Ltd.\nF4:0E:11:B0:00:00/28\tBradar Industria Sa\nF4:0E:11:C0:00:00/28\tNihon Mega Logic Co.,Ltd.\nF4:0E:11:D0:00:00/28\tDXG Technology Corp.\nF4:0E:11:E0:00:00/28\tElektronika Naglic d.o.o.\nF4:0E:11:F0:00:00/28\tPrivate\nF4:0E:22\t\tSamsung Electronics Co.,Ltd\nF4:0E:83\t\tCommscope\nF4:0F:1B\t\tCisco Systems, Inc\nF4:0F:24\t\tApple, Inc.\nF4:0F:9B\t\tWavelink\nF4:12:DA\t\tzte corporation\nF4:12:FA\t\tEspressif Inc.\nF4:13:99\t\tAerospace new generation communications Co.,Ltd\nF4:14:BF\t\tLG Innotek\nF4:15:32\t\tPETAiO (NanJing), Inc.\nF4:15:35\t\tSPON Communication Technology Co.,Ltd\nF4:15:63\t\tF5 Inc.\nF4:15:FD\t\tShanghai Pateo Electronic Equipment Manufacturing Co., Ltd.\nF4:17:B8\t\tAirTies Wireless Networks\nF4:19:E2\t\tVolterra\nF4:1A:79\t\tIEEE Registration Authority\nF4:1A:79:00:00:00/28\tMetCom Solutions GmbH\nF4:1A:79:10:00:00/28\tJide Car Rastreamento e Monitoramento LTDA\nF4:1A:79:20:00:00/28\tHCTEK Co.,Ltd.\nF4:1A:79:30:00:00/28\tShenzhen Xianxin Electronics Co., Ltd.\nF4:1A:79:40:00:00/28\tGuangdong Sygole Intelligent Technology Co.,Ltd\nF4:1A:79:50:00:00/28\tMeta-Bounds Inc.\nF4:1A:79:60:00:00/28\teddylab GmbH\nF4:1A:79:70:00:00/28\tAvedis Zildjian Company\nF4:1A:79:80:00:00/28\tAnnapurna labs\nF4:1A:79:90:00:00/28\tTERZ Industrial Electronics GmbH\nF4:1A:79:A0:00:00/28\tBirtech Technology\nF4:1A:79:B0:00:00/28\tShenzhen High Speed Technology Co., Ltd\nF4:1A:79:C0:00:00/28\tTA Technology (Shanghai) Co., Ltd\nF4:1A:79:D0:00:00/28\tDirected Electronics OE Pty Ltd\nF4:1A:79:E0:00:00/28\tShenzhen Yizhao Innovation Technology Co., Ltd.\nF4:1A:9C\t\tXiaomi Communications Co Ltd\nF4:1A:B0\t\tShenzhen Xingguodu Technology Co., Ltd.\nF4:1B:A1\t\tApple, Inc.\nF4:1C:71\t\tShenzhen Sanmu Communication Technology Co., Ltd\nF4:1C:95\t\tBeijing Yunyi Times Technology Co,.Ltd\nF4:1D:6B\t\tHuawei Technologies Co.,Ltd\nF4:1E:26\t\tSimon-Kaloi Engineering\nF4:1E:57\t\tRouterboard.com\nF4:1E:5E\t\tRtBrick Inc.\nF4:1F:0B\t\tYAMABISHI Corporation\nF4:1F:88\t\tzte corporation\nF4:1F:C2\t\tCisco Systems, Inc\nF4:20:12\t\tCuciniale GmbH\nF4:20:15\t\tGuangzhou Shiyuan Electronic Technology Company Limited\nF4:20:55\t\tIEEE Registration Authority\nF4:20:55:00:00:00/28\tAsicFlag\nF4:20:55:10:00:00/28\tSichuan Gengyuan Technology Co.,Ltd\nF4:20:55:20:00:00/28\tElehear inc.\nF4:20:55:30:00:00/28\tAnnapurna labs\nF4:20:55:40:00:00/28\tPulsotronic-Anlagentechnik GmbH\nF4:20:55:50:00:00/28\tProqualit Telecom LTDA\nF4:20:55:60:00:00/28\tShenzhen GuangXu Electronic Technology Co.,Ltd.\nF4:20:55:70:00:00/28\tBeyond Laser Systems LLC\nF4:20:55:80:00:00/28\tHuzhou Luxshare Precision Industry Co.LTD\nF4:20:55:90:00:00/28\tLens Technology (Xiangtan) Co.,Ltd\nF4:20:55:A0:00:00/28\tShenzhen C & D Electronics Co., Ltd.\nF4:20:55:B0:00:00/28\tSynaps Technology S.r.l.\nF4:20:55:C0:00:00/28\tShenzhen Guangjian Technology Co.,Ltd\nF4:20:55:D0:00:00/28\tWuxi Sunning Smart Devices Co.,Ltd\nF4:20:55:E0:00:00/28\tShenzhen Keyking Technology Limited\nF4:21:AE\t\tShanghai Xiaodu Technology Limited\nF4:21:CA\t\tApple, Inc.\nF4:22:7A\t\tGuangdong Seneasy Intelligent Technology Co., Ltd.\nF4:23:9C\t\tSernet (Suzhou) Technologies Corporation\nF4:24:62\t\tSelcom Electronics (Shanghai) Co., Ltd\nF4:24:8B\t\tHuawei Technologies Co.,Ltd\nF4:26:79\t\tIntel Corporate\nF4:27:56\t\tDASAN Newtork Solutions\nF4:28:33\t\tMMPC Inc.\nF4:28:53\t\tZioncom Electronics (Shenzhen) Ltd.\nF4:28:96\t\tSpecto Paineis Eletronicos Ltda\nF4:28:9D\t\tCloud Network Technology Singapore Pte. Ltd.\nF4:29:81\t\tvivo Mobile Communication Co., Ltd.\nF4:2A:7D\t\tTp-Link Technologies Co.,Ltd.\nF4:2B:48\t\tUbiqam\nF4:2B:7D\t\tChipsguide technology CO.,LTD.\nF4:2B:8C\t\tSamsung Electronics Co.,Ltd\nF4:2C:56\t\tSenor Tech Co Ltd\nF4:2D:06\t\tzte corporation\nF4:2E:48\t\tzte corporation\nF4:2E:7F\t\tHewlett Packard Enterprise\nF4:30:8B\t\tXiaomi Communications Co Ltd\nF4:30:B9\t\tHewlett Packard\nF4:31:49\t\tPixel FX\nF4:31:C3\t\tApple, Inc.\nF4:32:3D\t\tSichuan tianyi kanghe communications co., LTD\nF4:33:1C\t\tToast, Inc.\nF4:33:28\t\tCIMCON Lighting Inc.\nF4:33:92\t\tCisco Systems, Inc\nF4:34:F0\t\tApple, Inc.\nF4:36:E1\t\tAbilis Systems SARL\nF4:37:B7\t\tApple, Inc.\nF4:38:14\t\tShanghai Howell Electronic Co.,Ltd\nF4:38:C1\t\tHuawei Device Co., Ltd.\nF4:39:09\t\tHewlett Packard\nF4:39:A6\t\tApple, Inc.\nF4:3A:7B\t\tzte corporation\nF4:3A:FA\t\tIEEE Registration Authority\nF4:3A:FA:00:00:00/28\tAugustDevices India Private limited\nF4:3A:FA:10:00:00/28\tDspread Technology (Beijing) Inc.\nF4:3A:FA:20:00:00/28\tPrivate\nF4:3A:FA:30:00:00/28\tJiaxing Haishijiaan Smartcity Technology CO., LTD.\nF4:3A:FA:40:00:00/28\tAifrutech Co.,LTD\nF4:3A:FA:50:00:00/28\tGrayeye IT Systems Private Limited\nF4:3A:FA:60:00:00/28\tsungshinsolution\nF4:3A:FA:70:00:00/28\tValeo Schalter und Sensoren GmbH\nF4:3A:FA:80:00:00/28\tMetrasens Limited\nF4:3A:FA:90:00:00/28\tHemant Electronics\nF4:3A:FA:A0:00:00/28\tAnnapurna labs\nF4:3A:FA:B0:00:00/28\tCETC Suntai Information Technology Co., Ltd.\nF4:3A:FA:C0:00:00/28\tLenovo India Private Limited\nF4:3A:FA:D0:00:00/28\tHoungfu Technology\nF4:3A:FA:E0:00:00/28\tWakari Solutions,S.L.\nF4:3B:D8\t\tIntel Corporate\nF4:3C:3B\t\tHunan Fn-Link Technology Limited\nF4:3C:96\t\tEricsson AB\nF4:3D:80\t\tFAG Industrial Services GmbH\nF4:3E:61\t\tShenzhen Gongjin Electronics Co.,Lt\nF4:3E:66\t\tBee Computing (HK) Limited\nF4:3E:9D\t\tBenu Networks, Inc.\nF4:41:56\t\tArrikto Inc.\nF4:41:9E\t\tHuawei Device Co., Ltd.\nF4:42:27\t\tS & S Research Inc.\nF4:42:50\t\tBouffalo Lab (Nanjing) Co., Ltd.\nF4:42:8F\t\tSamsung Electronics Co.,Ltd\nF4:44:2C\t\tShenzhen SuperElectron Technology Co.,Ltd.\nF4:44:50\t\tBND Co., Ltd.\nF4:45:88\t\tHuawei Technologies Co.,Ltd\nF4:45:ED\t\tPortable Innovation Technology Ltd.\nF4:46:2A\t\tmaxon zub\nF4:46:37\t\tIntel Corporate\nF4:47:13\t\tLeading Public Performance Co., Ltd.\nF4:47:2A\t\tNanjing Rousing Sci. and Tech. Industrial Co., Ltd\nF4:48:48\t\tAmscreen Group Ltd\nF4:49:55\t\tMIMO TECH Co., Ltd.\nF4:49:EF\t\tEmstone\nF4:4B:2A\t\tCisco SPVTG\nF4:4C:70\t\tSkyworth Digital Technology(Shenzhen) Co.,Ltd\nF4:4C:7F\t\tHuawei Technologies Co.,Ltd\nF4:4D:17\t\tGoldcard High-Tech Co.,Ltd.\nF4:4D:30\t\tElitegroup Computer Systems Co.,Ltd.\nF4:4D:5C\t\tZyxel Communications Corporation\nF4:4D:AD\t\tCable Matters Inc.\nF4:4E:05\t\tCisco Systems, Inc\nF4:4E:38\t\tOlibra LLC\nF4:4E:B4\t\tCloud Network Technology Singapore Pte. Ltd.\nF4:4E:E3\t\tIntel Corporate\nF4:4E:FD\t\tActions Semiconductor Co.,Ltd.(Cayman Islands)\nF4:4F:D3\t\tshenzhen hemuwei technology co.,ltd\nF4:50:EB\t\tTelechips Inc\nF4:52:14\t\tMellanox Technologies, Inc.\nF4:52:46\t\tAskey Computer Corp\nF4:52:93\t\tApple, Inc.\nF4:54:20\t\tTellescom Industria E Comercio Em Telecomunicacao\nF4:54:24\t\tExtreme Networks Headquarters\nF4:54:33\t\tRockwell Automation\nF4:55:95\t\tHENGBAO Corporation LTD.\nF4:55:9C\t\tHuawei Technologies Co.,Ltd\nF4:55:E0\t\tNiceway CNC Technology Co.,Ltd.Hunan Province\nF4:57:3E\t\tFiberhome Telecommunication Technologies Co.,LTD\nF4:58:42\t\tBoxx TV Ltd\nF4:5B:29\t\tHuawei Technologies Co.,Ltd\nF4:5B:73\t\tWanjiaan Interconnected Technology Co., Ltd\nF4:5C:89\t\tApple, Inc.\nF4:5E:AB\t\tTexas Instruments\nF4:5F:69\t\tMatsufu Electronics distribution Company\nF4:5F:D4\t\tCisco SPVTG\nF4:5F:F7\t\tDQ Technology Inc.\nF4:60:0D\t\tPanoptic Technology, Inc\nF4:60:77\t\tTexas Instruments\nF4:60:E2\t\tXiaomi Communications Co Ltd\nF4:62:D0\t\tNot for Radio, LLC\nF4:62:DC\t\tHuawei Device Co., Ltd.\nF4:63:1F\t\tHuawei Technologies Co.,Ltd\nF4:63:49\t\tDiffon Corporation\nF4:63:5A\t\tNXP Semiconductor (Tianjin) LTD.\nF4:63:E7\t\tNanjing Maxon O.E. Tech. Co., LTD\nF4:63:FC\t\tvivo Mobile Communication Co., Ltd.\nF4:64:12\t\tSony Interactive Entertainment Inc.\nF4:64:5D\t\tToshiba\nF4:65:0B\t\tEspressif Inc.\nF4:65:A6\t\tApple, Inc.\nF4:67:2D\t\tShenZhen Topstar Technology Company\nF4:68:02\t\tHuawei Technologies Co.,Ltd\nF4:69:42\t\tAskey Computer Corp\nF4:69:D5\t\tIEEE Registration Authority\nF4:69:D5:00:00:00/28\tMossman Limited\nF4:69:D5:10:00:00/28\tJunchuang (Xiamen) Automation Technology Co.,Ltd\nF4:69:D5:20:00:00/28\tPulsar Engineering srl\nF4:69:D5:30:00:00/28\tITS Co., Ltd.\nF4:69:D5:40:00:00/28\tStype CS d.o.o.\nF4:69:D5:50:00:00/28\tHefei STAROT Technology Co.,Ltd\nF4:69:D5:60:00:00/28\tTianJin KCHT Information Technology Co., Ltd.\nF4:69:D5:70:00:00/28\tRosco, Inc\nF4:69:D5:80:00:00/28\tWiFi Nation Ltd\nF4:69:D5:90:00:00/28\tTerminus (Shanghai) Technology Co.,Ltd.\nF4:69:D5:A0:00:00/28\tShenZhenShi EVADA technology Co.,Ltd\nF4:69:D5:B0:00:00/28\tKonntek Inc\nF4:69:D5:C0:00:00/28\tHuaqin Telecom Technology Co.,Ltd.\nF4:69:D5:D0:00:00/28\tNantong ZYDZ Electronic.,Co.Ltd\nF4:69:D5:E0:00:00/28\tORtek Technology, Inc.\nF4:6A:92\t\tShenzhen Fast Technologies Co.,Ltd\nF4:6A:BC\t\tAdonit Corp. Ltd.\nF4:6A:D7\t\tMicrosoft Corporation\nF4:6A:DD\t\tLiteon Technology Corporation\nF4:6B:8C\t\tHon Hai Precision Industry Co., Ltd.\nF4:6B:EF\t\tSagemcom Broadband SAS\nF4:6C:68\t\tWistron Neweb Corporation\nF4:6D:04\t\tASUSTek COMPUTER INC.\nF4:6D:2F\t\tTp-Link Technologies Co.,Ltd.\nF4:6D:3F\t\tIntel Corporate\nF4:6D:E2\t\tzte corporation\nF4:6E:24\t\tNEC Personal Computers, Ltd.\nF4:6E:95\t\tExtreme Networks Headquarters\nF4:6E:D6\t\tEM Microelectronic\nF4:6F:4E\t\tEchowell\nF4:6F:A4\t\tPhysik Instrumente GmbH & Co. KG\nF4:6F:ED\t\tFiberhome Telecommunication Technologies Co.,LTD\nF4:70:0C\t\tIEEE Registration Authority\nF4:70:0C:00:00:00/28\tHyunsung Convergence\nF4:70:0C:10:00:00/28\tShenzhen Excelland Technology Co., Ltd.\nF4:70:0C:20:00:00/28\tBeijing ASU Tech Co., Ltd.\nF4:70:0C:30:00:00/28\tUnion Source Technology(HK)LTD\nF4:70:0C:40:00:00/28\tShenzhen Anycon Electronics Technology Co.,Ltd\nF4:70:0C:50:00:00/28\tShenzhen Lidaxun Digital Technology Co., LTD\nF4:70:0C:60:00:00/28\tJinan USR IOT Technology Limited\nF4:70:0C:70:00:00/28\tChangde xsound lnnovation technologies co;ltd.\nF4:70:0C:80:00:00/28\tShenzhen Focuscom Communication Technology Co.,Ltd.\nF4:70:0C:90:00:00/28\tAnnapurna labs\nF4:70:0C:A0:00:00/28\tJinan Huake Electrical Device Co., Ltd.\nF4:70:0C:B0:00:00/28\tShanghai Risingpo Electronics CO.,LTD\nF4:70:0C:C0:00:00/28\tG.S.D Group Inc.\nF4:70:0C:D0:00:00/28\tFreeus LLC\nF4:70:0C:E0:00:00/28\tShenzhen WeProTalk Technology Co., Ltd.\nF4:70:AB\t\tvivo Mobile Communication Co., Ltd.\nF4:71:90\t\tSamsung Electronics Co.,Ltd\nF4:72:57\t\tJiangxi Remote lntelligence Technology Co.,Ltd\nF4:73:35\t\tLogitech Far East\nF4:73:CA\t\tConversion Sound Inc.\nF4:74:70\t\tCisco Systems, Inc\nF4:74:88\t\tNew H3C Technologies Co., Ltd\nF4:76:26\t\tViltechmeda UAB\nF4:79:46\t\tHuawei Technologies Co.,Ltd\nF4:79:60\t\tHuawei Technologies Co.,Ltd\nF4:7A:4E\t\tWoojeon&Handan\nF4:7A:CC\t\tSolidFire, Inc.\nF4:7B:09\t\tIntel Corporate\nF4:7B:5E\t\tSamsung Electronics Co.,Ltd\nF4:7D:EF\t\tSamsung Electronics Co.,Ltd\nF4:7F:35\t\tCisco Systems, Inc\nF4:81:39\t\tCanon Inc.\nF4:81:C4\t\tApple, Inc.\nF4:83:2C\t\tOhsung\nF4:83:CD\t\tTp-Link Technologies Co.,Ltd.\nF4:83:E1\t\tShanghai Clouder Semiconductor Co.,Ltd\nF4:84:4C\t\tTexas Instruments\nF4:84:8D\t\tTp-Link Technologies Co.,Ltd.\nF4:85:AE\t\tSenbiosys SA\nF4:85:C6\t\tFDT Technologies\nF4:87:71\t\tInfoblox\nF4:87:C5\t\tHuawei Device Co., Ltd.\nF4:89:18\t\tHuawei Technologies Co.,Ltd\nF4:8B:32\t\tXiaomi Communications Co Ltd\nF4:8C:50\t\tIntel Corporate\nF4:8C:EB\t\tD-Link International\nF4:8E:09\t\tNokia Corporation\nF4:8E:38\t\tDell Inc.\nF4:8E:92\t\tHuawei Technologies Co.,Ltd\nF4:90:CA\t\tTensorcom\nF4:90:CB\t\tIEEE Registration Authority\nF4:90:CB:00:00:00/28\tEpitel, Inc.\nF4:90:CB:10:00:00/28\tDelem Bv\nF4:90:CB:20:00:00/28\tICE Gateway GmbH\nF4:90:CB:30:00:00/28\tRicker Lyman Robotic\nF4:90:CB:40:00:00/28\tOmniNet\nF4:90:CB:50:00:00/28\tAvilution\nF4:90:CB:60:00:00/28\tAirbeam Wireless Technologies Inc.\nF4:90:CB:70:00:00/28\tTeq Sa\nF4:90:CB:80:00:00/28\tBeijing Penslink Co., Ltd.\nF4:90:CB:90:00:00/28\tFractyl Labs\nF4:90:CB:A0:00:00/28\tFend Incorporated\nF4:90:CB:B0:00:00/28\tA-dec Inc.\nF4:90:CB:C0:00:00/28\tCheetah Medical\nF4:90:CB:D0:00:00/28\tSimavita (Aust) Pty Ltd\nF4:90:CB:E0:00:00/28\tRSAE Labs Inc\nF4:90:EA\t\tDeciso B.V.\nF4:91:1E\t\tZhuhai Ewpe Information Technology Inc\nF4:92:BF\t\tUbiquiti Inc\nF4:93:1C\t\tUniversal Electronics, Inc.\nF4:93:9F\t\tHon Hai Precision Industry Co., Ltd.\nF4:94:61\t\tNexGen Storage\nF4:94:66\t\tCountMax,  ltd\nF4:95:1B\t\tHefei Radio Communication Technology Co., Ltd\nF4:96:34\t\tIntel Corporate\nF4:96:51\t\tNAKAYO Inc\nF4:97:9D\t\tIEEE Registration Authority\nF4:97:9D:70:00:00/28\tLuxshare - Ict(Nghe An) Limited\nF4:97:C2\t\tNebulon Inc\nF4:99:AC\t\tWEBER Schraubautomaten GmbH\nF4:9C:12\t\tStructab AB\nF4:9D:8A\t\tFantasia Trading LLC\nF4:9D:A7\t\tPrivate\nF4:9E:A4\t\tEpiq Solutions\nF4:9E:CE\t\tSena Technologies Co., Ltd.\nF4:9E:EF\t\tTaicang T&W Electronics\nF4:9F:54\t\tSamsung Electronics Co.,Ltd\nF4:9F:F3\t\tHuawei Technologies Co.,Ltd\nF4:A1:7F\t\tMarquardt Electronics Technology (Shanghai) Co.Ltd\nF4:A2:94\t\tEagle World Development Co., Limited\nF4:A3:10\t\tApple, Inc.\nF4:A4:54\t\tIEEE Registration Authority\nF4:A4:54:00:00:00/28\tNKT Photonics A/S\nF4:A4:54:10:00:00/28\tPT Telkom Indonesia\nF4:A4:54:20:00:00/28\tTri Works\nF4:A4:54:30:00:00/28\tChongqing Hengxun Liansheng Industrial Co.,Ltd\nF4:A4:54:40:00:00/28\tEarshots\nF4:A4:54:50:00:00/28\tDenshijiki Industry Co.,Ltd\nF4:A4:54:60:00:00/28\tIntrol Design\nF4:A4:54:70:00:00/28\tAdvanced Mechanical Technology, Inc. d/b/a AMTI\nF4:A4:54:80:00:00/28\tShenzhen Cudy Technology Co., Ltd.\nF4:A4:54:90:00:00/28\tLonton infomation tech Ltd., Co\nF4:A4:54:A0:00:00/28\tAnnapurna labs\nF4:A4:54:B0:00:00/28\tGraco Inc.\nF4:A4:54:C0:00:00/28\tIntegrated Dynamics Engineering GmbH\nF4:A4:54:D0:00:00/28\tSael Srl\nF4:A4:54:E0:00:00/28\tCare Bloom, LLC\nF4:A4:75\t\tIntel Corporate\nF4:A4:D6\t\tHuawei Technologies Co.,Ltd\nF4:A5:2A\t\tHawa Technologies Inc\nF4:A5:9D\t\tHuawei Device Co., Ltd.\nF4:A7:39\t\tJuniper Networks\nF4:A8:0D\t\tWistron InfoComm(Kunshan)Co.,Ltd.\nF4:A9:97\t\tCanon Inc.\nF4:AA:D0\t\tOhsung\nF4:AB:5C\t\tQuectel Wireless Solutions Co.,Ltd.\nF4:AC:C1\t\tCisco Systems, Inc\nF4:AF:E7\t\tApple, Inc.\nF4:B1:64\t\tLightning Telecommunications Technology Co. Ltd\nF4:B1:9C\t\tAltoBeam (China) Inc.\nF4:B1:C2\t\tZhejiang Dahua Technology Co., Ltd.\nF4:B3:01\t\tIntel Corporate\nF4:B3:81\t\tWindowMaster A/S\nF4:B3:B1\t\tSilicon Laboratories\nF4:B5:20\t\tBiostar Microtech international corp.\nF4:B5:2F\t\tJuniper Networks\nF4:B5:49\t\tXiamen Yeastar Digital Technology Co., Ltd\nF4:B5:AA\t\tzte corporation\nF4:B5:BB\t\tCeragon Networks\nF4:B6:2D\t\tDongguan Huayin Electronic Technology Co., Ltd.\nF4:B6:88\t\tPlantronics, Inc.\nF4:B6:C6\t\tIndra Heera Technology LLP\nF4:B6:E5\t\tTerraSem Co.,Ltd\nF4:B7:2A\t\tTime Interconnect Ltd\nF4:B7:8D\t\tHuawei Technologies Co.,Ltd\nF4:B7:B3\t\tvivo Mobile Communication Co., Ltd.\nF4:B7:E2\t\tHon Hai Precision Ind. Co.,Ltd.\nF4:B8:5E\t\tTexas Instruments\nF4:B8:98\t\tTexas Instruments\nF4:B8:A7\t\tzte corporation\nF4:BB:C7\t\tvivo Mobile Communication Co., Ltd.\nF4:BC:97\t\tShenzhen Crave Communication Co., LTD\nF4:BC:DA\t\tShenzhen Jingxun Software Telecommunication Technology Co.,Ltd\nF4:BD:7C\t\tChengdu jinshi communication Co., LTD\nF4:BD:9E\t\tCisco Systems, Inc\nF4:BD:B9\t\tUbiqcom India Pvt Ltd\nF4:BE:EC\t\tApple, Inc.\nF4:BF:80\t\tHuawei Technologies Co.,Ltd\nF4:BF:A8\t\tJuniper Networks\nF4:BF:BB\t\tChina Mobile Group Device Co.,Ltd.\nF4:C0:2F\t\tBlueBite\nF4:C1:14\t\tVantiva USA LLC\nF4:C2:48\t\tSamsung Electronics Co.,Ltd\nF4:C4:47\t\tCoagent International Enterprise Limited\nF4:C4:D6\t\tShenzhen Xinfa Electronic Co.,ltd\nF4:C6:13\t\tAlcatel-Lucent Shanghai Bell Co., Ltd\nF4:C6:D7\t\tblackned GmbH\nF4:C7:14\t\tHuawei Technologies Co.,Ltd\nF4:C7:95\t\tWEY Technology AG\nF4:C7:AA\t\tMarvell Semiconductors\nF4:C7:C8\t\tKelvin Inc.\nF4:C8:8A\t\tIntel Corporate\nF4:CA:24\t\tFreeBit Co., Ltd.\nF4:CA:E5\t\tFreebox Sas\nF4:CA:E7\t\tArcadyan Corporation\nF4:CB:52\t\tHuawei Technologies Co.,Ltd\nF4:CB:E7\t\tApple, Inc.\nF4:CC:55\t\tJuniper Networks\nF4:CD:90\t\tVispiron Rotec GmbH\nF4:CE:23\t\tIntel Corporate\nF4:CE:36\t\tNordic Semiconductor ASA\nF4:CE:46\t\tHewlett Packard\nF4:CE:48\t\tExtreme Networks Headquarters\nF4:CF:A2\t\tEspressif Inc.\nF4:CF:E2\t\tCisco Systems, Inc\nF4:D0:32\t\tYunnan Ideal Information&Technology.,Ltd\nF4:D0:A7\t\tZhejiang Weilai Jingling Artificial Intelligence Technology Co., Ltd.\nF4:D1:08\t\tIntel Corporate\nF4:D2:61\t\tSEMOCON Co., Ltd\nF4:D4:54\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nF4:D4:88\t\tApple, Inc.\nF4:D5:80\t\tYamaha Corporation\nF4:D5:8A\t\tPalo Alto Networks\nF4:D6:20\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nF4:D7:B2\t\tLGS Innovations, LLC\nF4:D9:C6\t\tUnion Man Technology Co.,Ltd\nF4:D9:FB\t\tSamsung Electronics Co.,Ltd\nF4:DB:E3\t\tApple, Inc.\nF4:DB:E6\t\tCisco Systems, Inc\nF4:DC:41\t\tYoungzone Culture (Shanghai) Corp\nF4:DC:4D\t\tBeijing CCD Digital Technology Co., Ltd\nF4:DC:A5\t\tDawon Dns\nF4:DC:DA\t\tZhuhai Jiahe Communication Technology Co., limited\nF4:DC:F9\t\tHuawei Technologies Co.,Ltd\nF4:DD:06\t\tSamsung Electronics Co.,Ltd\nF4:DD:9E\t\tGoPro\nF4:DE:0C\t\tESPOD Ltd.\nF4:DE:AF\t\tHuawei Technologies Co.,Ltd\nF4:E1:1E\t\tTexas Instruments\nF4:E1:42\t\tDelta Elektronika BV\nF4:E2:04\t\tCoyote System\nF4:E2:C6\t\tUbiquiti Inc\nF4:E3:FB\t\tHuawei Technologies Co.,Ltd\nF4:E4:51\t\tHuawei Technologies Co.,Ltd\nF4:E4:AD\t\tzte corporation\nF4:E4:D7\t\tFujian Star-Net Communication Co.,Ltd\nF4:E5:78\t\tLLC Proizvodstvennaya Kompania \"TransService\"\nF4:E5:F2\t\tHuawei Technologies Co.,Ltd\nF4:E6:D7\t\tSolar Power Technologies, Inc.\nF4:E8:4F\t\tzte corporation\nF4:E8:C7\t\tApple, Inc.\nF4:E9:26\t\tTianjin Zanpu Technology Inc.\nF4:E9:75\t\tNew H3C Technologies Co., Ltd\nF4:E9:D4\t\tQLogic Corporation\nF4:EA:67\t\tCisco Systems, Inc\nF4:EA:B5\t\tExtreme Networks Headquarters\nF4:EB:38\t\tSagemcom Broadband SAS\nF4:EB:9F\t\tEllu Company 2019 SL\nF4:EC:38\t\tTp-Link Technologies Co.,Ltd.\nF4:ED:37\t\tQingdao Yuze lntelligent Technology Co.,Ltd\nF4:ED:5F\t\tShenzhen Ktc Technology Group\nF4:EE:08\t\tDell Inc.\nF4:EE:14\t\tMercury Communication Technologies Co.,Ltd.\nF4:EE:31\t\tCisco Systems, Inc\nF4:EF:9E\t\tSgsg Science & Technology Co. Ltd\nF4:F1:5A\t\tApple, Inc.\nF4:F1:97\t\tEMTAKE Inc\nF4:F1:9E\t\tWistron InforComm (Zhongshan) Corporation\nF4:F1:E1\t\tMotorola Mobility LLC, a Lenovo Company\nF4:F2:6D\t\tTp-Link Technologies Co.,Ltd.\nF4:F2:8A\t\tHuawei Technologies Co.,Ltd\nF4:F3:09\t\tSamsung Electronics Co.,Ltd\nF4:F3:AA\t\tJBL GmbH & Co. KG\nF4:F5:0B\t\tTP-Link Systems Inc.\nF4:F5:24\t\tMotorola Mobility LLC, a Lenovo Company\nF4:F5:A5\t\tNokia Corporation\nF4:F5:D8\t\tGoogle, Inc.\nF4:F5:DB\t\tXiaomi Communications Co Ltd\nF4:F5:E8\t\tGoogle, Inc.\nF4:F6:46\t\tDediprog Technology Co. Ltd.\nF4:F6:47\t\tzte corporation\nF4:F7:0C\t\tAvang - neterbit\nF4:F9:51\t\tApple, Inc.\nF4:FB:B8\t\tHuawei Technologies Co.,Ltd\nF4:FB:F5\t\tEM Microelectronic\nF4:FC:32\t\tTexas Instruments\nF4:FC:49\t\tzte corporation\nF4:FC:B1\t\tJJ Corp\nF4:FD:2B\t\tZOYI Company\nF4:FE:3E\t\tApple, Inc.\nF4:FE:FB\t\tSamsung Electronics Co.,Ltd\nF8:00:9D\t\tIntracom Defense S.A.\nF8:00:A1\t\tHuawei Technologies Co.,Ltd\nF8:01:13\t\tHuawei Technologies Co.,Ltd\nF8:01:B4\t\tLG Electronics\nF8:02:78\t\tIEEE Registration Authority\nF8:02:78:00:00:00/28\tDigatron Power Electronics GmbH\nF8:02:78:10:00:00/28\tReason Tecnologia SA\nF8:02:78:20:00:00/28\tInnodisk\nF8:02:78:30:00:00/28\t3Shape Holding A/S\nF8:02:78:40:00:00/28\tCLARUS Korea Co., Ltd\nF8:02:78:50:00:00/28\tElectric Objects\nF8:02:78:60:00:00/28\tWitium Co., Ltd\nF8:02:78:70:00:00/28\tBettini Srl\nF8:02:78:80:00:00/28\tEMBUX Technology Co., Ltd.\nF8:02:78:90:00:00/28\tBeijing Redcdn Technology, Co., Ltd\nF8:02:78:A0:00:00/28\tLuxul Technology Inc\nF8:02:78:B0:00:00/28\tRosemount Analytical\nF8:02:78:C0:00:00/28\tTechnology Research, LLC\nF8:02:78:D0:00:00/28\tDueton Systems s.r.o.\nF8:02:78:E0:00:00/28\tLit Technologies\nF8:02:78:F0:00:00/28\tPrivate\nF8:03:32\t\tKhomp\nF8:03:77\t\tApple, Inc.\nF8:04:2E\t\tSamsung Electro-Mechanics(Thailand)\nF8:05:1C\t\tDRS Imaging and Targeting Solutions\nF8:05:84\t\tEM Microelectronic\nF8:07:5D\t\tHuawei Device Co., Ltd.\nF8:08:4F\t\tSagemcom Broadband SAS\nF8:09:A4\t\tHenan Thinker Rail Transportation Research Inc.\nF8:0B:BE\t\tCommscope\nF8:0B:CB\t\tCisco Systems, Inc\nF8:0B:D0\t\tDatang Telecom communication terminal (Tianjin) Co., Ltd.\nF8:0C:58\t\tTaicang T&W Electronics\nF8:0C:F3\t\tLG Electronics (Mobile Communications)\nF8:0D:43\t\tHon Hai Precision Ind. Co.,Ltd.\nF8:0D:4B\t\tNextracker, Inc.\nF8:0D:60\t\tCanon Inc.\nF8:0D:A9\t\tZyxel Communications Corporation\nF8:0D:AC\t\tHP Inc.\nF8:0D:EA\t\tZyCast Technology Inc.\nF8:0D:F0\t\tzte corporation\nF8:0D:F1\t\tSontex SA\nF8:0F:41\t\tWistron Infocomm (Zhongshan) Corporation\nF8:0F:6F\t\tCisco Systems, Inc\nF8:0F:84\t\tNatural Security SAS\nF8:0F:F9\t\tGoogle, Inc.\nF8:10:37\t\tAtopia Systems, LP\nF8:10:93\t\tApple, Inc.\nF8:10:A0\t\tXtreme Testek Inc.\nF8:13:08\t\tNokia\nF8:14:DD\t\tCisco Systems, Inc\nF8:14:FE\t\tUnion Man Technology Co.,Ltd\nF8:15:47\t\tAvaya Inc\nF8:15:E0\t\tSiemens Canada\nF8:16:0C\t\tShenzhen iComm Semiconductor CO.,LTD\nF8:16:54\t\tIntel Corporate\nF8:17:2D\t\tTuya Smart Inc.\nF8:18:97\t\t2Wire Inc\nF8:1A:2B\t\tGoogle, Inc.\nF8:1A:67\t\tTp-Link Technologies Co.,Ltd.\nF8:1B:04\t\tZhong Shan City Richsound Electronic Industrial Ltd\nF8:1C:E5\t\tTelefonbau Behnke GmbH\nF8:1D:0F\t\tHitron Technologies. Inc\nF8:1D:78\t\tIEEE Registration Authority\nF8:1D:78:00:00:00/28\tDongguan Shun Hing Plastics Limited\nF8:1D:78:10:00:00/28\tADTECHNO Inc.\nF8:1D:78:20:00:00/28\tXperio Labs Limited\nF8:1D:78:30:00:00/28\tShanghai Sun Telecommunication Co., Ltd.\nF8:1D:78:40:00:00/28\tDigital Imaging Technology\nF8:1D:78:50:00:00/28\tDacons\nF8:1D:78:60:00:00/28\tZengge Co., Limited\nF8:1D:78:70:00:00/28\tWuhan Guide Infrared Co.,Ltd\nF8:1D:78:80:00:00/28\tTeleofis\nF8:1D:78:90:00:00/28\tOphrys Systèmes\nF8:1D:78:A0:00:00/28\tAVPro Global Holdings LLC\nF8:1D:78:B0:00:00/28\tSigmaConnectivityAB\nF8:1D:78:C0:00:00/28\tShenzhuoyue Technology.,Ltd\nF8:1D:78:D0:00:00/28\tTofino\nF8:1D:78:E0:00:00/28\tGuangdong Enok Communication Co., Ltd.\nF8:1D:90\t\tSolidwintech\nF8:1D:93\t\tLongdhua(Beijing) Controls Technology Co.,Ltd\nF8:1E:6F\t\tEBG compleo GmbH\nF8:1E:DF\t\tApple, Inc.\nF8:1F:32\t\tMotorola Mobility LLC, a Lenovo Company\nF8:20:55\t\tGreen Information System\nF8:20:A9\t\tHuawei Device Co., Ltd.\nF8:20:D2\t\tVantiva USA LLC\nF8:21:11\t\tHMD Global Oy\nF8:22:29\t\tNokia Shanghai Bell Co., Ltd.\nF8:22:85\t\tCypress Technology CO., LTD.\nF8:23:87\t\tShenzhen Horn Audio Co.,Ltd.\nF8:23:B2\t\tHuawei Technologies Co.,Ltd\nF8:24:41\t\tYeelink\nF8:24:DB\t\tEntryPoint Networks, Inc\nF8:24:E4\t\tBeyonics Technology Electronic (Changshu) Co., Ltd\nF8:25:51\t\tSeiko Epson Corporation\nF8:27:2E\t\tMercku\nF8:27:93\t\tApple, Inc.\nF8:28:19\t\tLiteon Technology Corporation\nF8:28:C9\t\tHuawei Technologies Co.,Ltd\nF8:29:C0\t\tAvailink, Inc.\nF8:2A:53\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nF8:2B:7F\t\tHuawei Device Co., Ltd.\nF8:2B:C8\t\tJiangsu Switter Co., Ltd\nF8:2B:E6\t\tIEEE Registration Authority\nF8:2B:E6:00:00:00/28\tViewSonic Corp\nF8:2B:E6:10:00:00/28\tCoastal Source\nF8:2B:E6:20:00:00/28\tFlextronics Computing（SuZhou)Co.,LTD.\nF8:2B:E6:30:00:00/28\tBrinno Incorporated\nF8:2B:E6:40:00:00/28\tWistron Corporation\nF8:2B:E6:50:00:00/28\tVNT electronics s.r.o.\nF8:2B:E6:60:00:00/28\tWayren OÜ\nF8:2B:E6:70:00:00/28\tS-Bond Technology Corp.\nF8:2B:E6:80:00:00/28\tHitek Electronics Co.,Ltd\nF8:2B:E6:90:00:00/28\tAnnapurna labs\nF8:2B:E6:A0:00:00/28\tTechwin Solutions Pvt Ltd\nF8:2B:E6:B0:00:00/28\tShenzhen C & D Electronics Co., Ltd.\nF8:2B:E6:C0:00:00/28\tMaiaEdge, Inc.\nF8:2B:E6:D0:00:00/28\tAtheer Connectivity\nF8:2B:E6:E0:00:00/28\tSuzhou Etag-Technology Corporation\nF8:2C:18\t\t2Wire Inc\nF8:2D:7C\t\tApple, Inc.\nF8:2D:C0\t\tCommscope\nF8:2E:0C\t\tTexas Instruments\nF8:2E:3F\t\tHuawei Technologies Co.,Ltd\nF8:2E:8E\t\tNanjing Kechen Electric Co., Ltd.\nF8:2E:DB\t\tRTW GmbH & Co. KG\nF8:2F:08\t\tMolex CMS\nF8:2F:5B\t\teGauge Systems LLC\nF8:2F:65\t\tHuawei Device Co., Ltd.\nF8:2F:6A\t\tItel Mobile Limited\nF8:2F:A8\t\tHon Hai Precision Ind. Co.,Ltd.\nF8:30:02\t\tTexas Instruments\nF8:30:94\t\tAlcatel-Lucent Telecom Limited\nF8:31:3E\t\tendeavour GmbH\nF8:32:E4\t\tASUSTek COMPUTER INC.\nF8:33:31\t\tTexas Instruments\nF8:33:76\t\tGood Mind Innovation Co., Ltd.\nF8:34:41\t\tIntel Corporate\nF8:34:51\t\tComcast-SRL\nF8:34:5A\t\tHitron Technologies. Inc\nF8:35:53\t\tMagenta Research Ltd.\nF8:35:DD\t\tGemtek Technology Co., Ltd.\nF8:36:9B\t\tTexas Instruments\nF8:38:69\t\tLG Electronics\nF8:38:80\t\tApple, Inc.\nF8:38:8D\t\tNew H3C Technologies Co., Ltd\nF8:39:18\t\tCisco Systems, Inc\nF8:3B:1D\t\tVantiva USA LLC\nF8:3B:7E\t\tHuawei Device Co., Ltd.\nF8:3C:44\t\tShenzhen Transchan Technology Limited\nF8:3C:80\t\tMitsumi Electric Co.,Ltd.\nF8:3C:BF\t\tBotato Electronics Sdn Bhd\nF8:3D:4E\t\tSoftlink Automation System Co., Ltd\nF8:3D:C6\t\tAzureWave Technology Inc.\nF8:3D:FF\t\tHuawei Technologies Co.,Ltd\nF8:3E:95\t\tHuawei Technologies Co.,Ltd\nF8:3E:B0\t\tArcadyan Corporation\nF8:3F:51\t\tSamsung Electronics Co.,Ltd\nF8:42:88\t\tApple, Inc.\nF8:42:FB\t\tYasuda Joho Co.,ltd.\nF8:43:EF\t\tXiaomi Communications Co Ltd\nF8:44:77\t\tSilicon Laboratories\nF8:44:E3\t\tTaicang T&W Electronics\nF8:45:AD\t\tKonka Group Co., Ltd.\nF8:45:C4\t\tShenzhen Netforward Micro-Electronic Co., Ltd.\nF8:46:1C\t\tSony Interactive Entertainment Inc.\nF8:46:2D\t\tSYNTEC Incorporation\nF8:47:2D\t\tX2gen Digital Corp. Ltd\nF8:47:E3\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nF8:48:97\t\tHitachi, Ltd.\nF8:48:FD\t\tChina Mobile Group Device Co.,Ltd.\nF8:4A:73\t\tEumtech Co., Ltd\nF8:4A:7F\t\tInnometriks Inc\nF8:4A:BF\t\tHuawei Technologies Co.,Ltd\nF8:4C:DA\t\tHuawei Technologies Co.,Ltd\nF8:4D:33\t\tFiberhome Telecommunication Technologies Co.,LTD\nF8:4D:89\t\tApple, Inc.\nF8:4D:8B\t\tecamtek\nF8:4D:FC\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nF8:4E:17\t\tSony Corporation\nF8:4E:58\t\tSamsung Electronics Co.,Ltd\nF8:4E:73\t\tApple, Inc.\nF8:4F:57\t\tCisco Systems, Inc\nF8:4F:AD\t\tHui Zhou Gaoshengda Technology Co.,LTD\nF8:50:1C\t\tTianjin Geneuo Technology Co.,Ltd\nF8:50:63\t\tVerathon\nF8:51:28\t\tSimpliSafe\nF8:51:6D\t\tDenwa Technology Corp.\nF8:52:DF\t\tVNL Europe AB\nF8:53:29\t\tHuawei Technologies Co.,Ltd\nF8:54:AF\t\tECI Telecom Ltd.\nF8:54:B8\t\tAmazon Technologies Inc.\nF8:54:F6\t\tAzureWave Technology Inc.\nF8:55:48\t\tTexas Instruments\nF8:55:4B\t\tWirelessMobility Engineering Centre SDN. BHD\nF8:55:CD\t\tVisteon Corporation\nF8:56:C3\t\tzte corporation\nF8:57:2E\t\tCore Brands, LLC\nF8:59:71\t\tIntel Corporate\nF8:5A:00\t\tSanford LP\nF8:5B:3B\t\tAskey Computer Corp\nF8:5B:6E\t\tSamsung Electronics Co.,Ltd\nF8:5B:9B\t\tiMercury\nF8:5B:9C\t\tSB SYSTEMS Co.,Ltd\nF8:5B:C9\t\tM-Cube Spa\nF8:5C:24\t\tSonos Inc.\nF8:5C:45\t\tIC Nexus Co. Ltd.\nF8:5C:4D\t\tNokia\nF8:5C:7D\t\tShenzhen Honesty Electronics Co.,Ltd.\nF8:5C:7E\t\tShenzhen Honesty Electronics Co.,Ltd.\nF8:5E:0B\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nF8:5E:3C\t\tShenzhen Zhibotong Electronics Co.,Ltd\nF8:5E:42\t\tVantiva USA LLC\nF8:5E:A0\t\tIntel Corporate\nF8:5F:2A\t\tNokia Corporation\nF8:60:F0\t\tHewlett Packard Enterprise\nF8:62:14\t\tApple, Inc.\nF8:62:AA\t\txn systems\nF8:63:3F\t\tIntel Corporate\nF8:63:D9\t\tCommscope\nF8:64:65\t\tAnova Applied Electronics, Inc.\nF8:64:B8\t\tzte corporation\nF8:66:01\t\tSuzhou Chi-tek information technology Co., Ltd\nF8:66:5A\t\tApple, Inc.\nF8:66:91\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nF8:66:D1\t\tHon Hai Precision Ind. Co.,Ltd.\nF8:66:F2\t\tCisco Systems, Inc\nF8:68:FF\t\tCisco Systems, Inc\nF8:69:71\t\tSeibu Electric Co.,\nF8:6B:14\t\tBarrot Technology Co.,LTD\nF8:6B:D9\t\tCisco Systems, Inc\nF8:6B:FA\t\tInfinix mobility limited\nF8:6C:03\t\tShenzhen Teleone Technology Co., Ltd\nF8:6C:E1\t\tTaicang T&W Electronics\nF8:6D:73\t\tZengge Co., Limited\nF8:6D:CC\t\tWistron Neweb Corporation\nF8:6E:CF\t\tArcx Inc\nF8:6E:EE\t\tHuawei Technologies Co.,Ltd\nF8:6F:B0\t\tTp-Link Technologies Co.,Ltd.\nF8:6F:C1\t\tApple, Inc.\nF8:6F:DE\t\tShenzhen Goodix Technology Co.,Ltd.\nF8:71:0C\t\tXiaomi Communications Co Ltd\nF8:71:A6\t\tApple, Inc.\nF8:71:FE\t\tThe Goldman Sachs Group, Inc.\nF8:72:EA\t\tCisco Systems, Inc\nF8:73:1A\t\tzte corporation\nF8:73:94\t\tNetgear\nF8:73:A2\t\tAvaya Inc\nF8:73:DF\t\tApple, Inc.\nF8:75:88\t\tHuawei Technologies Co.,Ltd\nF8:75:A4\t\tLCFC(Hefei) Electronics Technology co., ltd\nF8:76:9B\t\tNeopis Co., Ltd.\nF8:77:B8\t\tSamsung Electronics Co.,Ltd\nF8:79:07\t\tHuawei Device Co., Ltd.\nF8:79:0A\t\tCommscope\nF8:79:28\t\tzte corporation\nF8:79:99\t\tGuangdong Jiuzhi Technology Co.,Ltd\nF8:7A:39\t\tIEEE Registration Authority\nF8:7A:39:00:00:00/28\tHangzhou Yongxie Technology Co., Ltd\nF8:7A:39:10:00:00/28\tHangzhou Jiemu Electronic Technology Co.,Ltd\nF8:7A:39:20:00:00/28\tTotal-one TECHNOLOGY CO., LTD.\nF8:7A:39:30:00:00/28\tOverview Limited\nF8:7A:39:40:00:00/28\tZsystem technology co.,\nF8:7A:39:50:00:00/28\ttatwah SA\nF8:7A:39:60:00:00/28\tAnnapurna labs\nF8:7A:39:70:00:00/28\tShenzhen Electron Technology Co., LTD.\nF8:7A:39:80:00:00/28\tBeijing Zhongyuan Yishang Technology Co.,LTD\nF8:7A:39:90:00:00/28\tShenzhenshilemaikejiyouxiangongsi\nF8:7A:39:A0:00:00/28\tFeltrin Industria E Comercio\nF8:7A:39:B0:00:00/28\tFuyanshengElectronicFujian Co.ltd\nF8:7A:39:C0:00:00/28\tFlextronics International Kft\nF8:7A:39:D0:00:00/28\tXiamen Tonmind Technology Co.,Ltd\nF8:7A:39:E0:00:00/28\tCognosos, Inc.\nF8:7A:41\t\tCisco Systems, Inc\nF8:7A:EF\t\tRosonix Technology, Inc.\nF8:7B:20\t\tCisco Systems, Inc\nF8:7B:62\t\tFASTWEL INTERNATIONAL CO., LTD. Taiwan Branch\nF8:7B:7A\t\tCommscope\nF8:7B:8C\t\tAmped Wireless\nF8:7B:E0\t\tFuntime Pickleball Inc.\nF8:7D:3F\t\tHuawei Device Co., Ltd.\nF8:7D:76\t\tApple, Inc.\nF8:7F:A5\t\tGreatek\nF8:80:96\t\tElsys Equipamentos Eletrônicos Ltda\nF8:81:1A\t\tOverkiz\nF8:82:00\t\tCaptionCall\nF8:83:06\t\tBeijing Xiaomi Mobile Software Co., Ltd\nF8:84:79\t\tYaojin Technology(Shenzhen)Co.,Ltd\nF8:84:F2\t\tSamsung Electronics Co.,Ltd\nF8:85:F9\t\tCalix Inc.\nF8:87:F1\t\tApple, Inc.\nF8:89:3C\t\tInventec Appliances Corp.\nF8:89:D2\t\tCloud Network Technology Singapore Pte. Ltd.\nF8:8A:3C\t\tIEEE Registration Authority\nF8:8A:3C:00:00:00/28\tArt Spa\nF8:8A:3C:10:00:00/28\tCarefree of Colorado\nF8:8A:3C:20:00:00/28\tKLATU Networks Inc\nF8:8A:3C:30:00:00/28\tShenzhen Shengyuan Tech Ltd.\nF8:8A:3C:40:00:00/28\tGo-Link Technology Co., Ltd.\nF8:8A:3C:50:00:00/28\tKokkia Inc\nF8:8A:3C:60:00:00/28\tBeijing Zhong Chuang Communication Technology Ltd.\nF8:8A:3C:70:00:00/28\tJosh.ai\nF8:8A:3C:80:00:00/28\tCadmus Electronic Co.,Ltd.\nF8:8A:3C:90:00:00/28\twithus\nF8:8A:3C:A0:00:00/28\tProtos GmbH\nF8:8A:3C:B0:00:00/28\tFara As\nF8:8A:3C:C0:00:00/28\tExcetop Technology (Beijing) Co., Ltd.\nF8:8A:3C:D0:00:00/28\tTHK Co.,LTD.\nF8:8A:3C:E0:00:00/28\tAvateq Corp.\nF8:8A:5E\t\tTexas Instruments\nF8:8B:37\t\tCommscope\nF8:8C:1C\t\tKaishun Electronic Technology Co., Ltd. Beijing\nF8:8C:21\t\tTp-Link Technologies Co.,Ltd.\nF8:8D:EF\t\tTenebraex\nF8:8E:85\t\tComtrend Corporation\nF8:8E:A1\t\tEdgecore Networks Corporation\nF8:8F:07\t\tSamsung Electronics Co.,Ltd\nF8:8F:C8\t\tChipsea Technologies (Shenzhen) Corp.\nF8:8F:CA\t\tGoogle, Inc.\nF8:90:66\t\tNain Inc.\nF8:91:2A\t\tGLP German Light Products GmbH\nF8:91:6F\t\tTexas Instruments\nF8:91:73\t\tAedle Sas\nF8:93:F3\t\tVolans\nF8:94:97\t\tBuffalo.Inc\nF8:94:C2\t\tIntel Corporate\nF8:95:22\t\tHuawei Technologies Co.,Ltd\nF8:95:50\t\tProton Products Chengdu Ltd\nF8:95:C7\t\tLG Electronics (Mobile Communications)\nF8:95:EA\t\tApple, Inc.\nF8:96:FE\t\tLG Innotek\nF8:97:25\t\tOpple Lighting Co., Ltd\nF8:97:53\t\tHuawei Device Co., Ltd.\nF8:97:A9\t\tEricsson AB\nF8:97:B0\t\tGoki Pty Ltd\nF8:97:CF\t\tDaeshin-Information Technology Co., Ltd.\nF8:98:3A\t\tLeeman International (HongKong) Limited\nF8:98:B9\t\tHuawei Technologies Co.,Ltd\nF8:98:EF\t\tHuawei Technologies Co.,Ltd\nF8:99:10\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\nF8:99:55\t\tFortress Technology Inc\nF8:9A:25\t\tHuawei Technologies Co.,Ltd\nF8:9A:78\t\tHuawei Technologies Co.,Ltd\nF8:9B:6E\t\tNokia Solutions and Networks GmbH & Co. KG\nF8:9D:0D\t\tControl Technology Inc.\nF8:9D:9D\t\tShenzhen MinewSemi Co.,LTD.\nF8:9D:BB\t\tTintri\nF8:9E:28\t\tCisco Meraki\nF8:9E:94\t\tIntel Corporate\nF8:9F:B8\t\tYAZAKI Energy System Corporation\nF8:A0:3D\t\tDinstar Technologies Co., Ltd.\nF8:A0:97\t\tCommscope\nF8:A1:88\t\tLED Roadway Lighting\nF8:A2:6D\t\tCanon Inc.\nF8:A2:B4\t\tRHEWA-WAAGENFABRIK August Freudewald GmbH &Co. KG\nF8:A2:D6\t\tLiteon Technology Corporation\nF8:A3:4F\t\tzte corporation\nF8:A4:5F\t\tXiaomi Communications Co Ltd\nF8:A4:75\t\tPT Indoreka Jaya Wutama\nF8:A4:FB\t\tNanjing Decowell Automation Co.,LTD\nF8:A5:C5\t\tCisco Systems, Inc\nF8:A7:3A\t\tCisco Systems, Inc\nF8:A7:63\t\tZhejiang Tmall Technology Co., Ltd.\nF8:A9:1F\t\tZVISION Technologies Co., Ltd\nF8:A9:63\t\tCompal Information (Kunshan) Co., Ltd.\nF8:A9:D0\t\tLG Electronics (Mobile Communications)\nF8:A9:DE\t\tPuissance Plus\nF8:AA:3F\t\tDWnet Technologies(Suzhou) Corporation\nF8:AA:8A\t\tAxview Technology (Shenzhen) Co.,Ltd\nF8:AA:B3\t\tDESSMANN (China) Machinery & Electronic  Co., Ltd\nF8:AB:05\t\tSagemcom Broadband SAS\nF8:AB:82\t\tXiaomi Communications Co Ltd\nF8:AB:E5\t\tshenzhen worldelite electronics co., LTD\nF8:AC:65\t\tIntel Corporate\nF8:AC:6D\t\tDeltenna Ltd\nF8:AC:C1\t\tInnoXings Co., LTD.\nF8:AD:24\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nF8:AD:CB\t\tHMD Global Oy\nF8:AE:27\t\tJohn Deere Electronic Solutions\nF8:AF:05\t\tHuawei Device Co., Ltd.\nF8:AF:DB\t\tFiberhome Telecommunication Technologies Co.,LTD\nF8:B1:32\t\tHuawei Technologies Co.,Ltd\nF8:B1:56\t\tDell Inc.\nF8:B1:DD\t\tApple, Inc.\nF8:B2:F3\t\tGuangzhou Bosma Technology Co.,Ltd\nF8:B3:B7\t\tEspressif Inc.\nF8:B4:6A\t\tHewlett Packard\nF8:B5:4D\t\tIntel Corporate\nF8:B5:68\t\tIEEE Registration Authority\nF8:B5:68:00:00:00/28\tLifePrint Products, Inc.\nF8:B5:68:10:00:00/28\tPT. Eyro Digital Teknologi\nF8:B5:68:20:00:00/28\tShenzhen New-Bund Technology Co., Ltd.\nF8:B5:68:30:00:00/28\tDongwoo Engineering Co.,Ltd\nF8:B5:68:40:00:00/28\tCombiwins Technology Co.,Limited\nF8:B5:68:50:00:00/28\tetectRx\nF8:B5:68:60:00:00/28\tPackage Guard, Inc\nF8:B5:68:70:00:00/28\tCloudMinds (Shenzhen) Holdings Co., Ltd\nF8:B5:68:80:00:00/28\tMaven Wireless AB\nF8:B5:68:90:00:00/28\tBeijing Wanji Techonology Co., Ltd.\nF8:B5:68:A0:00:00/28\tSinePulse GmbH\nF8:B5:68:B0:00:00/28\tWhizpace Pte. Ltd.\nF8:B5:68:C0:00:00/28\t3SI Security Systems, Inc\nF8:B5:68:D0:00:00/28\tSolarius\nF8:B5:68:E0:00:00/28\tZAO \"RADIUS Avtomatika\"\nF8:B5:99\t\tGuangzhou CHNAVS Digital Technology Co.,Ltd\nF8:B7:97\t\tNEC Platforms, Ltd.\nF8:B7:E2\t\tCisco Systems, Inc\nF8:B8:B4\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nF8:B9:5A\t\tLG Innotek\nF8:BA:E6\t\tNokia\nF8:BB:BF\t\teero inc.\nF8:BC:0E\t\teero inc.\nF8:BC:12\t\tDell Inc.\nF8:BC:41\t\tRosslare Enterprises Limited\nF8:BE:0D\t\tA2UICT Co.,Ltd.\nF8:BF:09\t\tHuawei Technologies Co.,Ltd\nF8:C0:01\t\tJuniper Networks\nF8:C0:91\t\tHighgates Technology\nF8:C1:16\t\tJuniper Networks\nF8:C1:20\t\tXi'an Link-Science Technology Co.,Ltd\nF8:C2:49\t\tAmpere Computing Llc\nF8:C2:88\t\tCisco Systems, Inc\nF8:C3:72\t\tTsuzuki Denki\nF8:C3:97\t\tNZXT Corp. Ltd.\nF8:C3:9E\t\tHuawei Technologies Co.,Ltd\nF8:C3:CC\t\tApple, Inc.\nF8:C3:F1\t\tRaytron Photonics Co.,Ltd.\nF8:C4:AE\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nF8:C4:F3\t\tShanghai Infinity Wireless Technologies Co.,Ltd.\nF8:C4:FA\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nF8:C6:50\t\tCisco Systems, Inc\nF8:C6:78\t\tCarefusion\nF8:C9:03\t\tTp-Link Technologies Co.,Ltd.\nF8:C9:6C\t\tFiberhome Telecommunication Technologies Co.,LTD\nF8:CA:59\t\tNetComm Wireless\nF8:CA:85\t\tNEC Corporation\nF8:CA:B8\t\tDell Inc.\nF8:CC:6E\t\tDEPO Electronics Ltd\nF8:CD:C8\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nF8:CE:07\t\tZhejiang Dahua Technologyco.,Ltd\nF8:CE:21\t\tTp-Link Technologies Co.,Ltd.\nF8:CE:72\t\tWistron Corporation\nF8:CF:52\t\tIntel Corporate\nF8:CF:C5\t\tMotorola Mobility LLC, a Lenovo Company\nF8:D0:27\t\tSeiko Epson Corporation\nF8:D0:AC\t\tSony Interactive Entertainment Inc.\nF8:D0:BD\t\tSamsung Electronics Co.,Ltd\nF8:D0:C5\t\tSector Alarm Tech S.L.\nF8:D1:11\t\tTp-Link Technologies Co.,Ltd.\nF8:D2:AC\t\tVantiva USA LLC\nF8:D3:A9\t\tAXAN Networks\nF8:D3:F0\t\tApple, Inc.\nF8:D4:62\t\tPumatronix Equipamentos Eletronicos Ltda.\nF8:D4:78\t\tFlextronics Tech.(Ind) Pvt Ltd\nF8:D5:54\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nF8:D7:56\t\tSimm Tronic Limited\nF8:D7:58\t\tVeratron AG\nF8:D7:BF\t\tREV Ritter GmbH\nF8:D9:B8\t\tOpen Mesh, Inc.\nF8:DA:0C\t\tHon Hai Precision Ind. Co.,Ltd.\nF8:DA:DF\t\tEcoTech, Inc.\nF8:DA:E2\t\tNDC Technologies\nF8:DA:F4\t\tTaishan Online Technology Co., Ltd.\nF8:DB:4C\t\tPNY Technologies, INC.\nF8:DB:7F\t\tHTC Corporation\nF8:DB:88\t\tDell Inc.\nF8:DC:7A\t\tVariscite LTD\nF8:DE:73\t\tHuawei Technologies Co.,Ltd\nF8:DF:15\t\tSunitec Enterprise Co.,Ltd\nF8:DF:A8\t\tzte corporation\nF8:DF:E1\t\tMyLight Systems\nF8:E0:79\t\tMotorola Mobility LLC, a Lenovo Company\nF8:E2:52\t\tApple, Inc.\nF8:E3:5F\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nF8:E4:3B\t\tASIX Electronics Corporation\nF8:E4:4E\t\tMcot Inc.\nF8:E4:A4\t\tFiberhome Telecommunication Technologies Co.,LTD\nF8:E4:E3\t\tIntel Corporate\nF8:E4:FB\t\tActiontec Electronics, Inc\nF8:E5:7E\t\tCisco Systems, Inc\nF8:E5:CE\t\tApple, Inc.\nF8:E5:CF\t\tCgi It Uk Limited\nF8:E6:1A\t\tSamsung Electronics Co.,Ltd\nF8:E7:1E\t\tRuckus Wireless\nF8:E7:A0\t\tvivo Mobile Communication Co., Ltd.\nF8:E7:B5\t\tµTech Tecnologia LTDA\nF8:E8:11\t\tHuawei Technologies Co.,Ltd\nF8:E8:77\t\tHarman/Becker Automotive Systems GmbH\nF8:E9:03\t\tD-Link International\nF8:E9:4E\t\tApple, Inc.\nF8:E9:4F\t\tCisco Systems, Inc\nF8:E9:68\t\tEgker Kft.\nF8:EA:0A\t\tDipl.-Math. Michael Rauch\nF8:ED:A5\t\tCommscope\nF8:ED:AE\t\tMobiwire Mobiles(Ningbo) Co.,Ltd\nF8:ED:FC\t\tHP Inc.\nF8:EF:5D\t\tMotorola Mobility LLC, a Lenovo Company\nF8:EF:B1\t\tHangzhou Zhongxinhui lntelligent Technology Co.,Ltd.\nF8:F0:05\t\tNewport Media Inc.\nF8:F0:14\t\tRackWare Inc.\nF8:F0:82\t\tNagtech Llc\nF8:F0:9D\t\tHangzhou Prevail Communication Technology Co., Ltd\nF8:F0:C5\t\tSuzhou Kuhan Information Technologies Co.,Ltd.\nF8:F1:B6\t\tMotorola Mobility LLC, a Lenovo Company\nF8:F1:E6\t\tSamsung Electronics Co.,Ltd\nF8:F2:1E\t\tIntel Corporate\nF8:F2:5A\t\tG-Lab GmbH\nF8:F2:95\t\tAnnapurna labs\nF8:F3:D3\t\tShenzhen Gotron electronic CO.,LTD\nF8:F4:64\t\tRawe Electonic GmbH\nF8:F5:19\t\tRulogic Inc.\nF8:F5:32\t\tCommscope\nF8:F5:8C\t\tApple, Inc.\nF8:F7:B9\t\tHuawei Technologies Co.,Ltd\nF8:F7:D2\t\tEqual Optics, LLC\nF8:F7:D3\t\tInternational Communications Corporation\nF8:F7:FF\t\tSyn-Tech Systems Inc\nF8:FB:2F\t\tSantur Corporation\nF8:FB:90\t\tTexas Instruments\nF8:FC:E1\t\tAmazon Technologies Inc.\nF8:FE:5C\t\tReciprocal Labs Corp\nF8:FE:5E\t\tIntel Corporate\nF8:FE:A8\t\tTechnico Japan Corporation\nF8:FF:0B\t\tElectronic Technology Inc.\nF8:FF:5F\t\tShenzhen Communication Technology Co.,Ltd\nF8:FF:C2\t\tApple, Inc.\nFA:00:E7\t\tQuantum Machines ltd\nFA:07:3E\t\tNBASE-T Alliance\nFA:0B:BC\t\tCen\nFA:14:66\t\tAllegion PLC\nFA:16:19\t\ttrendytech\nFA:2E:E9\t\tOCA Alliance, Inc.\nFA:4C:77\t\tOccitaline\nFA:55:6F\t\tSymbolicIO\nFA:61:0E\t\tLaboratory for Computational Sensing and Robotics, Johns Hopkins University\nFA:63:E1\t\tSamsung Electronics (UK) Ltd\nFA:66:73\t\tNells Electronic Systems (Nes)\nFA:7A:CB\t\tUltra Ethernet Consortium\nFA:94:F1\t\tIEEE 802.1 Chair\nFA:BA:85\t\tAPAT Optoelectronics Components Co., Ltd.\nFA:D9:88\t\tMomentum Data Systems\nFA:E1:90\t\tIn Win Development Inc.\nFA:E5:1A\t\tRSAE Labs Inc\nFA:EB:6E\t\txRAN.org\nFA:EE:B6\t\tShenzhen Jiahua Zhongli Technology Co., LTD\nFA:F9:C0\t\tRAID Incorporated\nFC:00:12\t\tToshiba Samsung Storage Technolgoy Korea Corporation\nFC:01:2C\t\tEspressif Inc.\nFC:01:7C\t\tHon Hai Precision Ind. Co.,Ltd.\nFC:01:9E\t\tVievu\nFC:01:CD\t\tFundacion Tekniker\nFC:02:96\t\tXiaomi Communications Co Ltd\nFC:03:9F\t\tSamsung Electronics Co.,Ltd\nFC:04:1C\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nFC:06:47\t\tCortland Research, LLC\nFC:06:8C\t\tShenzhen Micipc Technology Co.,Ltd\nFC:06:ED\t\tM2Motive Technology Inc.\nFC:07:36\t\tHuawei Device Co., Ltd.\nFC:07:A0\t\tLRE Medical GmbH\nFC:08:4A\t\tFujitsu Limited\nFC:08:77\t\tPrentke Romich Company\nFC:09:D8\t\tACTEON Group\nFC:09:F6\t\tGuangdong Tonze Electric Co.,Ltd\nFC:0A:81\t\tExtreme Networks Headquarters\nFC:0C:45\t\tShenzhen SuperElectron Technology Co.,Ltd.\nFC:0F:4B\t\tTexas Instruments\nFC:0F:E6\t\tSony Interactive Entertainment Inc.\nFC:0F:E7\t\tMicrochip Technology Inc.\nFC:10:1A\t\tPalo Alto Networks\nFC:10:BD\t\tControl Sistematizado S.A.\nFC:10:C6\t\tTaicang T&W Electronics\nFC:11:65\t\tCambium Networks Limited\nFC:11:86\t\tLogic3 plc\nFC:11:93\t\tHuawei Technologies Co.,Ltd\nFC:12:2C\t\tHuawei Technologies Co.,Ltd\nFC:12:63\t\tAskey Computer Corp\nFC:13:49\t\tGlobal Apps Corp.\nFC:13:F0\t\tBouffalo Lab (Nanjing) Co., Ltd.\nFC:14:99\t\tAimore Acoustics Incorporation\nFC:15:B4\t\tHewlett Packard\nFC:16:07\t\tTaian Technology(Wuxi) Co.,Ltd.\nFC:17:94\t\tInterCreative Co., Ltd\nFC:18:03\t\tHuawei Technologies Co.,Ltd\nFC:18:3C\t\tApple, Inc.\nFC:19:10\t\tSamsung Electronics Co.,Ltd\nFC:19:28\t\tActions Microelectronics\nFC:19:99\t\tXiaomi Communications Co Ltd\nFC:19:D0\t\tCloud Vision Networks Technology Co.,Ltd.\nFC:1A:11\t\tvivo Mobile Communication Co., Ltd.\nFC:1A:46\t\tSamsung Electronics Co.,Ltd\nFC:1B:D1\t\tHuawei Technologies Co.,Ltd\nFC:1B:FF\t\tV-Zug Ag\nFC:1C:A1\t\tNokia\nFC:1D:2A\t\tvivo Mobile Communication Co., Ltd.\nFC:1D:3A\t\tHuawei Technologies Co.,Ltd\nFC:1D:43\t\tApple, Inc.\nFC:1D:59\t\tI Smart Cities HK Ltd\nFC:1D:84\t\tAutobase\nFC:1E:16\t\tIPEVO corp\nFC:1F:19\t\tSamsung Electro Mechanics Co., Ltd.\nFC:1F:C0\t\tEurecam\nFC:22:1C\t\tShenzhen Xunman Technology Co., Ltd\nFC:22:9C\t\tHan Kyung I Net Co.,Ltd.\nFC:22:D3\t\tFdsys\nFC:22:F4\t\tZyxel Communications Corporation\nFC:23:25\t\tEosTek (Shenzhen) Co., Ltd.\nFC:23:CD\t\tShenzhen Bilian Electronic Co.，Ltd\nFC:25:3F\t\tApple, Inc.\nFC:27:A2\t\tTrans Electric Co., Ltd.\nFC:29:E3\t\tInfinix mobility limited\nFC:29:F3\t\tMcPay Co.,LTD.\nFC:2A:46\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nFC:2A:54\t\tConnected Data, Inc.\nFC:2A:9C\t\tApple, Inc.\nFC:2B:B2\t\tActiontec Electronics, Inc\nFC:2C:FD\t\tdormakaba Canada Inc. - Keyscan\nFC:2D:5E\t\tzte corporation\nFC:2E:19\t\tChina Mobile Group Device Co.,Ltd.\nFC:2E:2D\t\tLorom Industrial Co.LTD.\nFC:2F:40\t\tCalxeda, Inc.\nFC:2F:6B\t\tEverspin Technologies, Inc.\nFC:2F:AA\t\tNokia\nFC:2F:EF\t\tUTT Technologies Co., Ltd.\nFC:31:5D\t\tApple, Inc.\nFC:32:88\t\tCELOT Wireless Co., Ltd\nFC:33:42\t\tJuniper Networks\nFC:33:57\t\tKAGA FEI Co., Ltd.\nFC:33:5F\t\tPolyera\nFC:34:97\t\tASUSTek COMPUTER INC.\nFC:34:E2\t\tShenzhen YOUHUA Technology Co., Ltd\nFC:35:98\t\tFavite Inc.\nFC:35:E6\t\tVisteon Corporation\nFC:37:2B\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nFC:38:6A\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nFC:38:76\t\tForum Communication Systems, Inc\nFC:38:82\t\tInfinix mobility limited\nFC:38:C4\t\tChina Grand Communications Co.,Ltd.\nFC:39:5A\t\tSonicWall\nFC:39:64\t\tItel Mobile Limited\nFC:3C:D7\t\tTuya Smart Inc.\nFC:3C:E9\t\tTsingtong Technologies Co, Ltd.\nFC:3D:73\t\teero inc.\nFC:3D:93\t\tLongcheer Telecommunication Limited\nFC:3D:A5\t\tArcadyan Corporation\nFC:3F:7C\t\tHuawei Technologies Co.,Ltd\nFC:3F:A6\t\teero inc.\nFC:3F:AB\t\tHenan Lanxin Technology Co., Ltd\nFC:3F:DB\t\tHewlett Packard\nFC:3F:FC\t\tTozed Kangwei Tech Co.,Ltd\nFC:40:09\t\tzte corporation\nFC:41:16\t\tGoogle, Inc.\nFC:42:03\t\tSamsung Electronics Co.,Ltd\nFC:42:65\t\tZhejiang Tmall Technology Co., Ltd.\nFC:43:45\t\tXiaomi Communications Co Ltd\nFC:44:63\t\tUniversal Audio, Inc\nFC:44:82\t\tIntel Corporate\nFC:44:99\t\tSwarco LEA d.o.o.\nFC:44:9F\t\tzte corporation\nFC:45:5F\t\tJiangxi Shanshui Optoelectronic Technology Co.,Ltd\nFC:45:96\t\tCompal Information (Kunshan) Co., Ltd.\nFC:45:C3\t\tTexas Instruments\nFC:47:8D\t\tShenzhen Topwell Technology Co., Ltd.\nFC:47:D8\t\tApple, Inc.\nFC:48:C9\t\tYobiiq Intelligence B.V.\nFC:48:EF\t\tHuawei Technologies Co.,Ltd\nFC:49:2D\t\tAmazon Technologies Inc.\nFC:4A:E9\t\tCastlenet Technology Inc.\nFC:4B:1C\t\tIntersensor S.R.L.\nFC:4B:57\t\tPeerless Instrument Division of Curtiss-Wright\nFC:4B:BC\t\tSunplus Technology Co., Ltd.\nFC:4C:EA\t\tDell Inc.\nFC:4C:EF\t\tHuawei Device Co., Ltd.\nFC:4D:6A\t\tSilicon Laboratories\nFC:4D:8C\t\tShenzhen Pante Electronics Technology Co., Ltd\nFC:4D:A6\t\tHuawei Technologies Co.,Ltd\nFC:4D:D4\t\tUniversal Global Scientific Industrial Co., Ltd.\nFC:4E:6D\t\tHuawei Technologies Co.,Ltd\nFC:4E:A4\t\tApple, Inc.\nFC:50:0C\t\tSitehop Ltd\nFC:50:90\t\tSIMEX Sp. z o.o.\nFC:50:D6\t\tHuawei Device Co., Ltd.\nFC:51:A4\t\tCommscope\nFC:51:B5\t\tHuawei Technologies Co.,Ltd\nFC:52:8D\t\tVantiva USA LLC\nFC:52:CE\t\tControl iD\nFC:53:9E\t\tShanghai Wind Technologies Co.,Ltd\nFC:55:57\t\tApple, Inc.\nFC:55:DC\t\tBaltic Latvian Universal Electronics LLC\nFC:57:03\t\tHisense broadband multimedia technology Co.,Ltd\nFC:58:4A\t\txiamenshi c-chip technology co., ltd\nFC:58:9A\t\tCisco Systems, Inc\nFC:58:DF\t\tInterphone Service\nFC:58:FA\t\tShen Zhen Shi Xin Zhong Xin Technology Co.,Ltd.\nFC:59:9F\t\tRuijie Networks Co.,LTD\nFC:59:C0\t\tArista Networks\nFC:5A:1D\t\tHitron Technologies. Inc\nFC:5A:DC\t\tKeenetic Limited\nFC:5B:24\t\tWeibel Scientific A/S\nFC:5B:26\t\tMikroBits\nFC:5B:39\t\tCisco Systems, Inc\nFC:5B:8C\t\tXiaomi Communications Co Ltd\nFC:5C:45\t\tRuckus Wireless\nFC:5C:EE\t\tLCFC(Hefei) Electronics Technology co., ltd\nFC:5F:49\t\tZhejiang Dahua Technology Co., Ltd.\nFC:60:18\t\tZhejiang Kangtai Electric Co., Ltd.\nFC:60:9B\t\tNew H3C Technologies Co., Ltd\nFC:61:79\t\tIEEE Registration Authority\nFC:61:79:00:00:00/28\tZhuhai Anjubao Electronics Technology Co., Ltd.\nFC:61:79:10:00:00/28\tSignalinks Communication Technology Co., Ltd\nFC:61:79:20:00:00/28\tShenzhen Shenshui Electronic Commerce Co.,Ltd\nFC:61:79:30:00:00/28\tEchoStar Mobile\nFC:61:79:40:00:00/28\tChoeuneng\nFC:61:79:50:00:00/28\tQisda Corporation\nFC:61:79:60:00:00/28\tHangzhou LiDe Communication Co.,Ltd\nFC:61:79:70:00:00/28\tKvaliteta Systems and Solutions Private Limited\nFC:61:79:80:00:00/28\tAnnapurna labs\nFC:61:79:90:00:00/28\tMACH SYSTEMS s.r.o.\nFC:61:79:A0:00:00/28\tShenzhen Dptek Technology Co., Ltd.\nFC:61:79:B0:00:00/28\tFulian Precision Electronics(Tianjin) Co., Ltd\nFC:61:79:C0:00:00/28\tShenzhen Xmitech Electronic Co.,Ltd\nFC:61:79:D0:00:00/28\tInt'Act Pty Ltd\nFC:61:79:E0:00:00/28\tACCO Brands USA LLC\nFC:61:98\t\tNEC Personal Products, Ltd\nFC:61:E9\t\tFiberhome Telecommunication Technologies Co.,LTD\nFC:62:6E\t\tBeijing MDC Telecom\nFC:62:6F\t\tFortx\nFC:62:B9\t\tAlpsalpine Co,.Ltd\nFC:64:3A\t\tSamsung Electronics Co.,Ltd\nFC:64:BA\t\tXiaomi Communications Co Ltd\nFC:65:B3\t\tHuawei Device Co., Ltd.\nFC:65:DE\t\tAmazon Technologies Inc.\nFC:66:CF\t\tApple, Inc.\nFC:67:1F\t\tTuya Smart Inc.\nFC:68:3E\t\tDirected Perception, Inc\nFC:69:47\t\tTexas Instruments\nFC:69:8C\t\tANDREAS STIHL AG & Co. KG\nFC:6A:1C\t\tMellanox Technologies, Inc.\nFC:6B:F0\t\tTopwell International Holdinds Limited\nFC:6C:31\t\tLXinstruments GmbH\nFC:6D:77\t\tIntel Corporate\nFC:6D:C0\t\tBme Corporation\nFC:6D:D1\t\tAPRESIA Systems, Ltd.\nFC:6F:B7\t\tCommscope\nFC:70:2E\t\tSichuan AI-Link Technology Co., Ltd.\nFC:71:FA\t\tTrane Technologies\nFC:73:FB\t\tHuawei Technologies Co.,Ltd\nFC:75:16\t\tD-Link International\nFC:75:E6\t\tHandreamnet\nFC:76:92\t\tSemptian Co.,Ltd.\nFC:77:74\t\tIntel Corporate\nFC:77:7B\t\tHitron Technologies. Inc\nFC:79:0B\t\tHitachi High Technologies America, Inc.\nFC:79:DD\t\tHuawei Device Co., Ltd.\nFC:7A:58\t\tShenzhen Skyworth Digital  Technology  CO., Ltd\nFC:7C:02\t\tPhicomm (Shanghai) Co., Ltd.\nFC:7C:E7\t\tFci Usa Llc\nFC:7D:6C\t\tHYESUNG TECHWIN Co., Ltd\nFC:7F:56\t\tCoSyst Control Systems GmbH\nFC:7F:F1\t\tHewlett Packard Enterprise\nFC:83:29\t\tTrei technics\nFC:83:99\t\tAvaya Inc\nFC:83:C6\t\tN-Radio Technologies Co., Ltd.\nFC:84:17\t\tHonor Device Co., Ltd.\nFC:84:A7\t\tMurata Manufacturing Co., Ltd.\nFC:85:96\t\tAxonne Inc.\nFC:86:2A\t\tHuawei Device Co., Ltd.\nFC:87:43\t\tHuawei Technologies Co.,Ltd\nFC:8A:3D\t\tzte corporation\nFC:8A:F7\t\tzte corporation\nFC:8B:97\t\tShenzhen Gongjin Electronics Co.,Lt\nFC:8C:11\t\tMicrosoft Corporation\nFC:8D:13\t\tFujian Star-Net Communication Co.,Ltd\nFC:8D:3D\t\tLeapfive Tech. Ltd.\nFC:8E:5B\t\tChina Mobile Iot Limited company\nFC:8E:6E\t\tStreamCCTV, LLC\nFC:8E:7E\t\tCommscope\nFC:8F:7D\t\tShenzhen Gongjin Electronics Co.,Lt\nFC:8F:90\t\tSamsung Electronics Co.,Ltd\nFC:8F:C4\t\tIntelligent Technology Inc.\nFC:90:FA\t\tIndependent Technologies\nFC:91:14\t\tVantiva USA LLC\nFC:91:5D\t\tGoogle, Inc.\nFC:91:89\t\tSichuan Tianyi Comheart Telecom Co.,LTD\nFC:92:3B\t\tNokia Corporation\nFC:92:57\t\tRenesas Electronics (Penang) Sdn. Bhd.\nFC:93:1D\t\tHuawei Technologies Co.,Ltd\nFC:93:6B\t\tSamsung Electronics Co.,Ltd\nFC:94:2E\t\tCisco Meraki\nFC:94:35\t\tHuawei Technologies Co.,Ltd\nFC:94:6C\t\tUbivelox\nFC:94:CE\t\tzte corporation\nFC:94:E3\t\tVantiva USA LLC\nFC:95:6A\t\tOctagon Systems Corp.\nFC:96:43\t\tJuniper Networks\nFC:97:A8\t\tCricut Inc.\nFC:98:16\t\tAlpsalpine Co,.Ltd\nFC:99:47\t\tCisco Systems, Inc\nFC:9A:FA\t\tMotus Global Inc.\nFC:9B:C6\t\tSumavision Technologies Co.,Ltd\nFC:9B:D4\t\tEdgeQ\nFC:9C:98\t\tArlo Technology\nFC:9C:A7\t\tApple, Inc.\nFC:9D:05\t\tMicro-Star INTL CO., LTD.\nFC:9D:D8\t\tBeijing TongTongYiLian Science and Technology Ltd.\nFC:9F:2A\t\tZyxel Communications Corporation\nFC:9F:AE\t\tFidus Systems Inc\nFC:9F:E1\t\tCONWIN.Tech. Ltd\nFC:9F:FD\t\tHangzhou Hikvision Digital Technology Co.,Ltd.\nFC:A0:5A\t\tOray.com co., LTD.\nFC:A0:F3\t\tHuawei Technologies Co.,Ltd\nFC:A1:3E\t\tSamsung Electronics Co.,Ltd\nFC:A1:83\t\tAmazon Technologies Inc.\nFC:A2:2A\t\tPT. Callysta Multi Engineering\nFC:A2:DF\t\tIEEE Registration Authority\nFC:A2:DF:00:00:00/28\tSolink Corporation\nFC:A2:DF:10:00:00/28\tSpacemiT\nFC:A2:DF:20:00:00/28\tPdi Communication Systems Inc.\nFC:A2:DF:30:00:00/28\tPavone Sistemi Srl\nFC:A2:DF:40:00:00/28\tHangzhou Laizhi Technology Co.,Ltd\nFC:A2:DF:50:00:00/28\tAnnapurna labs\nFC:A2:DF:60:00:00/28\tshenzhen zovoton electronic co.,ltd\nFC:A2:DF:70:00:00/28\tFlexmedia ind e com\nFC:A2:DF:80:00:00/28\tboger electronics gmbh\nFC:A2:DF:90:00:00/28\tBeijing KSL Electromechanical Technology Development Co.,Ltd\nFC:A2:DF:A0:00:00/28\tBpl Medical Technologies Private Limited\nFC:A2:DF:B0:00:00/28\tLumentum\nFC:A2:DF:C0:00:00/28\tTiGHT AV\nFC:A2:DF:D0:00:00/28\tMBio Diagnostics, Inc.\nFC:A2:DF:E0:00:00/28\tOrion Power Systems, Inc.\nFC:A3:86\t\tShenzhen Chuangwei-Rgb Electronics Co.,Ltd\nFC:A4:7A\t\tIEEE Registration Authority\nFC:A4:7A:00:00:00/28\tBroadcom Inc.\nFC:A4:7A:10:00:00/28\tShenzhen VMAX New Energy Co., Ltd.\nFC:A4:7A:20:00:00/28\tAnt Financial（Hang Zhou）Network Technology Co.,Ltd.\nFC:A4:7A:30:00:00/28\tCliptech Industria e Comercio Ltda\nFC:A4:7A:40:00:00/28\tHooc Ag\nFC:A4:7A:50:00:00/28\tSyfer\nFC:A4:7A:60:00:00/28\tToken\nFC:A4:7A:70:00:00/28\tInnovative Advantage\nFC:A4:7A:80:00:00/28\tKarry Communication Limited\nFC:A4:7A:90:00:00/28\tOberix Group Pty Ltd\nFC:A4:7A:A0:00:00/28\tShenzhen Elebao Technology Co., Ltd\nFC:A4:7A:B0:00:00/28\tShenzhen Nokelock Technology Co, Ltd.\nFC:A4:7A:C0:00:00/28\tShenzhen ALFEYE Technology CO.,Ltd\nFC:A4:7A:D0:00:00/28\tShenzhen Kuku Technology Co.,Ltd\nFC:A4:7A:E0:00:00/28\tHefei Feier Smart Science&Technology Co. Ltd\nFC:A5:C8\t\tApple, Inc.\nFC:A5:D0\t\tGuangdong Oppo Mobile Telecommunications Corp.,Ltd\nFC:A6:21\t\tSamsung Electronics Co.,Ltd\nFC:A6:4C\t\tAlibaba cloud computing Co., Ltd\nFC:A6:67\t\tAmazon Technologies Inc.\nFC:A6:CD\t\tFiberhome Telecommunication Technologies Co.,LTD\nFC:A8:41\t\tAvaya Inc\nFC:A8:4A\t\tSentinum GmbH\nFC:A8:9A\t\tSunitec Enterprise Co.,Ltd\nFC:A8:9B\t\tTexas Instruments\nFC:A8:E0\t\tThe Furukawa Electric Co., Ltd\nFC:A9:B0\t\tMiartech (Shanghai),Inc.\nFC:A9:DC\t\tRenesas Electronics (Penang) Sdn. Bhd.\nFC:A9:F5\t\tXiaomi Communications Co Ltd\nFC:AA:14\t\tGiga-Byte Technology Co.,Ltd.\nFC:AA:81\t\tApple, Inc.\nFC:AA:B6\t\tSamsung Electronics Co.,Ltd\nFC:AB:90\t\tHuawei Technologies Co.,Ltd\nFC:AB:D0\t\tvivo Mobile Communication Co., Ltd.\nFC:AB:F5\t\tzte corporation\nFC:AD:0F\t\tQts Networks\nFC:AE:2B\t\tTitan Products Ltd.\nFC:AE:34\t\tCommscope\nFC:AF:6A\t\tQulsar Inc\nFC:AF:AC\t\tSocionext Inc.\nFC:AF:BE\t\tTireCheck GmbH\nFC:B0:C4\t\tShanghai DareGlobal Technologies Co.,Ltd\nFC:B0:DE\t\tCloud Network Technology Singapore Pte. Ltd.\nFC:B1:0D\t\tShenzhen Tian Kun Technology Co.,LTD.\nFC:B2:14\t\tApple, Inc.\nFC:B2:D6\t\tCig Shanghai Co Ltd\nFC:B3:87\t\tLeapmotor (Jinhua) New Energy Vehicle Parts Technology Co., Ltd.\nFC:B3:AA\t\tIntel Corporate\nFC:B3:BC\t\tIntel Corporate\nFC:B4:67\t\tEspressif Inc.\nFC:B4:E6\t\tAskey Computer Corp\nFC:B5:77\t\tCortex Security Inc\nFC:B5:85\t\tShenzhen Water World Information Co.,Ltd.\nFC:B5:8A\t\tWapice Ltd.\nFC:B6:62\t\tIC Holdings LLC\nFC:B6:98\t\tCambridge Industries(Group) Co.,Ltd.\nFC:B6:9D\t\tZhejiang Dahua Technology Co., Ltd.\nFC:B6:D8\t\tApple, Inc.\nFC:B7:F0\t\tIdaho National Laboratory\nFC:B9:7E\t\tGE Appliances\nFC:B9:DF\t\tMotorola Mobility LLC, a Lenovo Company\nFC:BB:A1\t\tShenzhen Minicreate Technology Co.,Ltd\nFC:BC:0E\t\tZhejiang Cainiao Supply Chain Management Co., Ltd\nFC:BC:9C\t\tVimar Spa\nFC:BC:D1\t\tHuawei Technologies Co.,Ltd\nFC:BD:67\t\tArista Networks\nFC:BE:7B\t\tvivo Mobile Communication Co., Ltd.\nFC:C0:CC\t\tYunke China Information Technology Limited\nFC:C2:33\t\tASUSTek COMPUTER INC.\nFC:C2:3D\t\tAtmel Corporation\nFC:C2:DE\t\tMurata Manufacturing Co., Ltd.\nFC:C2:E5\t\tHolowits Technologies Co.,Ltd\nFC:C7:34\t\tSamsung Electronics Co.,Ltd\nFC:C7:37\t\tShaanxi Gangsion Electronic Technology Co., Ltd\nFC:C8:97\t\tzte corporation\nFC:CA:C4\t\tLifeHealth, LLC\nFC:CC:E4\t\tAscon Ltd.\nFC:CD:2F\t\tIEEE Registration Authority\nFC:CD:2F:00:00:00/28\tNingbo Bull Digital Technology Co., LTD\nFC:CD:2F:10:00:00/28\tSiren Care(Shanghai) information and technology company\nFC:CD:2F:20:00:00/28\tLoupedeck Oy\nFC:CD:2F:30:00:00/28\tXmitech Technology Co., Limited\nFC:CD:2F:40:00:00/28\tGenitek Engineering sprl\nFC:CD:2F:50:00:00/28\tQctek Co.,Ltd.\nFC:CD:2F:60:00:00/28\tAnnapurna labs\nFC:CD:2F:70:00:00/28\tSuzhou lehui display co.,ltd\nFC:CD:2F:80:00:00/28\tAsesorias y Servicios Innovaxxion SPA\nFC:CD:2F:90:00:00/28\tAroma Retail\nFC:CD:2F:A0:00:00/28\tScopus International Pvt. Ltd.\nFC:CD:2F:B0:00:00/28\tHEAD-DIRECT (KUNSHAN) Co. Ltd\nFC:CD:2F:C0:00:00/28\tSpedos ADS a.s.\nFC:CD:2F:D0:00:00/28\tShenzhen Smartbyte Technology Co., Ltd.\nFC:CD:2F:E0:00:00/28\tEltek brojila d.o.o.\nFC:CF:43\t\tHuizhou City Huiyang District Meisiqi Industry Development Co,.Ltd\nFC:CF:62\t\tIBM Corp\nFC:D2:02\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nFC:D2:90\t\tSky Uk Limited\nFC:D2:B6\t\tIEEE Registration Authority\nFC:D2:B6:00:00:00/28\tCg Power And Industrial Solutions Ltd\nFC:D2:B6:10:00:00/28\tLink (Far-East) Corporation\nFC:D2:B6:20:00:00/28\tSoma GmbH\nFC:D2:B6:30:00:00/28\tCoet Costruzioni Elettrotecniche\nFC:D2:B6:40:00:00/28\tShen Zhen Xin Hao Yuan Precision Technology Co.,L Td\nFC:D2:B6:50:00:00/28\tGrandway Technology (Shenzhen) Limited\nFC:D2:B6:60:00:00/28\tCirque Audio Technology Co.,Ltd\nFC:D2:B6:70:00:00/28\tTeamly Digital\nFC:D2:B6:80:00:00/28\tOviss Labs Inc.\nFC:D2:B6:90:00:00/28\tWinglet Systems Inc.\nFC:D2:B6:A0:00:00/28\tNreal Technology Limited\nFC:D2:B6:B0:00:00/28\tT Chip Digital Technology Co.Ltd\nFC:D2:B6:C0:00:00/28\tSilicon (Shenzhen) Electronic Technology Co.,Ltd.\nFC:D2:B6:D0:00:00/28\tBee Smart(Changzhou) Information Technology Co., Ltd\nFC:D2:B6:E0:00:00/28\tUniver S.p.A.\nFC:D4:36\t\tMotorola Mobility LLC, a Lenovo Company\nFC:D4:F2\t\tThe Coca Cola Company\nFC:D4:F6\t\tMessana Air.Ray Conditioning s.r.l.\nFC:D5:86\t\tShenzhen SuperElectron Technology Co.,Ltd.\nFC:D5:D9\t\tShenzhen SDMC Technology CO.,Ltd.\nFC:D6:BD\t\tRobert Bosch GmbH\nFC:D7:33\t\tTp-Link Technologies Co.,Ltd.\nFC:D7:49\t\tAmazon Technologies Inc.\nFC:D8:17\t\tBeijing Hesun Technologies Co.Ltd.\nFC:D8:48\t\tApple, Inc.\nFC:D9:08\t\tXiaomi Communications Co Ltd\nFC:D9:6B\t\tRealme Chongqing Mobile Telecommunications Corp.,Ltd.\nFC:DB:21\t\tSamsara Networks Inc\nFC:DB:96\t\tEnervalley Co., Ltd\nFC:DB:B3\t\tMurata Manufacturing Co., Ltd.\nFC:DC:4A\t\tG-Wearables Corp.\nFC:DD:55\t\tShenzhen WeWins wireless Co.,Ltd\nFC:DE:90\t\tSamsung Electronics Co.,Ltd\nFC:DE:C5\t\tTexas Instruments\nFC:DF:00\t\tGD Midea Air-Conditioning Equipment Co.,Ltd.\nFC:E1:4F\t\tBRK Brands, Inc.\nFC:E1:86\t\tA3M Co., LTD\nFC:E1:92\t\tSichuan Jinwangtong Electronic Science&Technology Co,.Ltd\nFC:E1:A6\t\tHuawei Technologies Co.,Ltd\nFC:E1:D9\t\tStable Imaging Solutions LLC\nFC:E1:FB\t\tArray Networks\nFC:E2:3F\t\tClay Paky Spa\nFC:E2:6C\t\tApple, Inc.\nFC:E3:3C\t\tHuawei Technologies Co.,Ltd\nFC:E4:98\t\tIEEE Registration Authority\nFC:E4:98:00:00:00/28\tNtcsoft\nFC:E4:98:10:00:00/28\tQuEL, Inc.\nFC:E4:98:20:00:00/28\tART Finex Co.,Ltd.\nFC:E4:98:30:00:00/28\tShenzhen C & D Electronics Co., Ltd.\nFC:E4:98:40:00:00/28\tTScale Electronics Mfg. (Kunshan) Co., Ltd\nFC:E4:98:50:00:00/28\tSM Instruments\nFC:E4:98:60:00:00/28\tVideonetics Technology Private Limited\nFC:E4:98:70:00:00/28\tE Haute Intelligent Technology Co., Ltd\nFC:E4:98:80:00:00/28\tChangzhou Leading Weighing Technology Co., Ltd\nFC:E4:98:90:00:00/28\tAVCON Information Technology Co.,Ltd.\nFC:E4:98:A0:00:00/28\tSATEL Ltd\nFC:E4:98:B0:00:00/28\tGIGA Copper Networks GmbH\nFC:E4:98:C0:00:00/28\tSiretta Ltd\nFC:E4:98:D0:00:00/28\tInfinity Electronics Ltd\nFC:E4:98:E0:00:00/28\tTIH Microelectronics Technology Co. Ltd.\nFC:E5:57\t\tNokia Corporation\nFC:E6:6A\t\tIndustrial Software Co\nFC:E8:06\t\tEdifier International\nFC:E8:92\t\tHangzhou Lancable Technology Co.,Ltd\nFC:E8:C0\t\tEspressif Inc.\nFC:E9:98\t\tApple, Inc.\nFC:E9:D8\t\tAmazon Technologies Inc.\nFC:EA:50\t\tIntegrated Device Technology (Malaysia) Sdn. Bhd.\nFC:EC:DA\t\tUbiquiti Inc\nFC:ED:B9\t\tArrayent\nFC:EE:E6\t\tFormike Electronic Co., Ltd\nFC:F1:36\t\tSamsung Electronics Co.,Ltd\nFC:F1:52\t\tSony Corporation\nFC:F1:CD\t\tOptex-Fa Co.,Ltd.\nFC:F2:9F\t\tChina Mobile Iot Limited company\nFC:F5:28\t\tZyxel Communications Corporation\nFC:F5:C4\t\tEspressif Inc.\nFC:F6:47\t\tFiberhome Telecommunication Technologies Co.,LTD\nFC:F7:38\t\tHuawei Technologies Co.,Ltd\nFC:F7:63\t\tKunGao Micro (JiangSu) Co., LTd\nFC:F7:7B\t\tHuawei Device Co., Ltd.\nFC:F8:AE\t\tIntel Corporate\nFC:F8:B7\t\tTRONTEQ Electronic\nFC:FA:21\t\tzte corporation\nFC:FA:F7\t\tShanghai Baud Data Communication Co.,Ltd.\nFC:FB:FB\t\tCisco Systems, Inc\nFC:FC:48\t\tApple, Inc.\nFC:FE:77\t\tHitachi Reftechno, Inc.\nFC:FE:C2\t\tInvensys Controls UK Limited\nFC:FF:AA\t\tIEEE Registration Authority\n"
  },
  {
    "path": "relevance/nas-packages/network/services/quickstart/files/quickstart.config",
    "content": "config quickstart 'main'\n"
  },
  {
    "path": "relevance/nas-packages/network/services/quickstart/files/quickstart.hotplug",
    "content": "if [ \"$ACTION\" = \"add\" -o \"$ACTION\" = \"remove\" ]; then\n    quickstart blockChange\nfi"
  },
  {
    "path": "relevance/nas-packages/network/services/quickstart/files/quickstart.init",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=92\nUSE_PROCD=1\n \n\nstart_service() { \n\tprocd_open_instance\n\tprocd_set_param command /usr/sbin/quickstart serve --unix /var/run/quickstart/local.sock\n\tprocd_set_param stderr 1\n\tprocd_set_param respawn\n\tprocd_close_instance\n}\n"
  },
  {
    "path": "relevance/nas-packages/network/services/quickstart/files/quickstart.uci-default",
    "content": "#!/bin/sh\n\nif [ \"$PKG_UPGRADE\" = 1 ]; then\n    /etc/init.d/quickstart enable\n    /etc/init.d/quickstart start\n    /etc/init.d/startdhns enable\n    /etc/init.d/startdhns boot\nfi\n\nexit 0\n"
  },
  {
    "path": "relevance/nas-packages/network/services/quickstart/files/startdhns.hotplug",
    "content": "[ \"$INTERFACE\" = \"planb\" -o \"$INTERFACE\" = \"wan\" ] || exit 0\n\nif [ \"$ACTION\" = \"ifup\" -o \"$ACTION\" = \"ifupdate\" ]; then\n    /usr/sbin/quickstart ifaceEvent up \"$INTERFACE\"\nfi\n\nif [ \"$ACTION\" = \"ifdown\" ]; then\n    /usr/sbin/quickstart ifaceEvent down \"$INTERFACE\"\nfi\n"
  },
  {
    "path": "relevance/nas-packages/network/services/quickstart/files/startdhns.init",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=93\nUSE_PROCD=1\n\nstart_service() {\n\tlocal seconds\n\tfor seconds in $(seq 0 2); do\n\t\t/usr/sbin/quickstart uciChange | grep -q -e OK -e code:501 && break\n\t\tsleep 1 && continue\n\t\tbreak\n\tdone\n}\n\nservice_triggers()\n{\n\tprocd_add_reload_trigger network\n}\n"
  },
  {
    "path": "relevance/nas-packages/network/services/unishare/Makefile",
    "content": "#\n# Copyright (C) 2022 jjm2473 <jjm2473@gmail.com>\n#\n# This is free software, licensed under the MIT License.\n#\n\ninclude $(TOPDIR)/rules.mk\n\n\nPKG_NAME:=unishare\nPKG_VERSION:=1.1.2\nPKG_RELEASE:=1\nPKG_MAINTAINER:=jjm2473 <jjm2473@gmail.com>\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n\tSECTION:=net\n\tCATEGORY:=Network\n\tSUBMENU:=File Transfer\n\tTITLE:=Unified Network Shares Manager\n\tDEPENDS:=+samba4-server +webdav2\n\tPKGARCH:=all\nendef\n\ndefine Package/$(PKG_NAME)/description\n\tConfigure samba, webdav (maybe more?) in one app\nendef\n\ndefine Package/$(PKG_NAME)/conffiles\n/etc/config/unishare\nendef\n\ndefine Build/Configure\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/etc/init.d $(1)/etc/config\n\t$(INSTALL_BIN) ./files/unishare.init $(1)/etc/init.d/unishare\n\t$(INSTALL_CONF) ./files/unishare.config $(1)/etc/config/unishare\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "relevance/nas-packages/network/services/unishare/files/unishare.config",
    "content": "config global\n    option enabled '0'\n    option anonymous '1'\n    option webdav_port '8888'\n"
  },
  {
    "path": "relevance/nas-packages/network/services/unishare/files/unishare.init",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=97\nSTOP=05\nUSE_PROCD=1\n\nNEWLINE=$'\\n'\n\n# $section $proto callback $args\nvalidate_share() {\n    local path\n    local name\n    local rw\n    local ro\n    local proto\n    config_get proto $1 proto\n    echo \"$proto\" | grep -qFw \"$2\" || return 0\n    config_get path $1 path\n    [ -z \"$path\" ] && return 1\n    config_get name $1 name\n    [ -z \"$name\" ] && name=${path##*/}\n    config_get rw $1 rw\n    config_get ro $1 ro\n\n    shift\n    shift\n    $@ \"$path\" \"$name\" \"$rw\" \"$ro\"\n}\n\nclean_unishare() {\n    local unishare\n    config_get unishare $1 unishare \"0\"\n    if [[ $unishare == 1 ]]; then\n        uci delete \"$2.$1\"\n    fi\n}\n\nreset_unishare_smb_users() {\n    local users=`grep -s '^unishare:' /etc/group | cut -d: -f4 | sed 's/,/ /g'`\n    local username\n    [ -z \"$users\" ] && return 0\n    for username in $users; do\n        smbpasswd -L -x \"$username\" >/dev/null 2>&1\n    done\n    lock /var/lock/group\n    sed -i -E 's/^unishare:x:(\\d+):.+/unishare:x:\\1:/' /etc/group\n    lock -u /var/lock/group\n}\n\nclean_unused_smb_users() {\n    local users username\n    grep -s \"^unishare:.*[^:]$\" /etc/group | cut -d: -f4 | sed 's/,/\\n/g' | sed 's/^\\(.*\\)$/^\\1$/g' > /var/run/unishare.users\n    if [ -s /var/run/unishare.users ]; then\n        users=`grep -s ':unishare:' /etc/passwd | cut -d: -f1 | grep -v -f /var/run/unishare.users`\n    else\n        users=`grep -s ':unishare:' /etc/passwd | cut -d: -f1`\n    fi\n    rm -f /var/run/unishare.users\n    if [ -n \"$users\" ]; then\n        lock /var/lock/passwd\n        for username in $users; do\n            sed -i \"/^$username:/d\" /etc/shadow /etc/passwd\n        done\n        lock -u /var/lock/passwd\n    fi\n}\n\nclean_samba() {\n    reset_unishare_smb_users\n    config_load samba4\n\tconfig_foreach clean_unishare sambashare samba4\n}\n\nadd_samba_user() {\n    local username\n    local password\n    local gid=$2\n    config_get username $1 username\n    [ -z \"$username\" ] && return 1\n    user_exists \"$username\" || user_add \"$username\" \"\" $gid \"unishare\"\n    group_add_user \"unishare\" \"$username\"\n    config_get password $1 password\n    if [ -z \"$password\" ]; then\n        smbpasswd -L -c /var/etc/smb.conf -a -n \"$username\" >/dev/null 2>&1\n    else\n        { echo \"$password\" ; echo \"$password\" ; } | smbpasswd -L -c /var/etc/smb.conf -a -s \"$username\" >/dev/null 2>&1\n    fi\n}\n\n# $smbcfg $path $name $rw $ro\nadd_samba_share() {\n    local rw=$4\n    local ro=$5\n    rw=`echo \"$rw\" | sed -e 's/everyone/guest nobody @unishare/g' -e 's/users/@unishare/g'`\n    ro=`echo \"$ro\" | sed -e 's/everyone/guest nobody @unishare/g' -e 's/users/@unishare/g'`\n    {\n        cat <<-EOF\n    add $1 sambashare\n    set $1.@sambashare[-1].unishare=1\n    set $1.@sambashare[-1].path='$2'\n    set $1.@sambashare[-1].name='$3'\n    set $1.@sambashare[-1].read_only=yes\n    set $1.@sambashare[-1].force_root=1\n    set $1.@sambashare[-1].inherit_owner=yes\n    set $1.@sambashare[-1].create_mask=0666\n    set $1.@sambashare[-1].dir_mask=0777\n    set $1.@sambashare[-1].users='$rw $ro'\nEOF\n        [[ $UNISHARE_G_ANONYMOUS == 1 ]] && echo \"    set $1.@sambashare[-1].guest_ok=yes\"\n        [ -n \"$rw\" ] && echo \"    set $1.@sambashare[-1].write_list='$rw'\"\n        [ -n \"$ro\" ] && echo \"    set $1.@sambashare[-1].read_list='$ro'\"\n    } | uci batch >/dev/null\n}\n\nconfig_samba() {\n    local gid=`group_add_next unishare`\n    [ -z \"$gid\" ] && return 1\n    [ -f \"/var/etc/smb.conf\" ] || cat <<-EOF >/var/etc/smb.conf\n[global]\n\tsecurity = user\n\tnull passwords = yes\n\tpassdb backend = smbpasswd\nEOF\n    config_foreach add_samba_user user $gid\n    config_foreach validate_share share samba add_samba_share samba4\n}\n\nreconfig_samba() {\n    config_samba || { uci revert samba4; return 1; }\n    uci commit samba4\n}\n\n# $path $name $rw $ro\nadd_webdav_share() {\n    local rw=\"$3\"\n    local ro=\"$4\"\n    local u\n    local var\n    local v\n    for u in $rw; do\n        var=\"UNISHARE_DAV_${u}_rw\"\n        eval \"v=\\\"\\$$var\\\"\"\n        export -n \"$var=${v}$name$NEWLINE\"\n    done\n    for u in $ro; do\n        var=\"UNISHARE_DAV_${u}_ro\"\n        eval \"v=\\\"\\$$var\\\"\"\n        export -n \"$var=${v}$name$NEWLINE\"\n    done\n    ln -s \"$path\" \"/var/run/unishare/root/$name\"\n}\n\nclean_webdav_user() {\n    local username\n    config_get username $1 username\n    [ -z \"$username\" ] && return 0\n    export -n \"UNISHARE_DAV_${username}_rw=\"\n    export -n \"UNISHARE_DAV_${username}_ro=\"\n}\n\nadd_webdav_user() {\n    local username\n    local password\n    config_get username $1 username\n    [ -z \"$username\" ] && return 1\n    config_get password $1 password\n    echo \"  - username: $username\"\n    echo \"    password: $password\"\n    echo \"    rules:\"\n    local v\n    local r\n\tlocal oifs=$IFS\n\tIFS=\"$NEWLINE\"\n    eval \"v=\\\"\\$UNISHARE_DAV_${username}_rw\\\"\"\n    for r in $v; do\n        echo \"      - path: /$r\"\n        echo \"        modify: true\"\n    done\n    for r in $UNISHARE_DAV_users_rw; do\n        echo \"      - path: /$r\"\n        echo \"        modify: true\"\n    done\n    eval \"v=\\\"\\$UNISHARE_DAV_${username}_ro\\\"\"\n    for r in $v; do\n        echo \"      - path: /$r\"\n        echo \"        allow: true\"\n    done\n    for r in $UNISHARE_DAV_users_ro; do\n        echo \"      - path: /$r\"\n        echo \"        allow: true\"\n    done\n\tIFS=$oifs\n}\n\nconfig_webdav_header() {\n    local r\n    local anonymous=false\n    [[ $UNISHARE_G_ANONYMOUS == 1 ]] && anonymous=true\n    cat <<-EOF\n# Server related settings\naddress: 0.0.0.0\nport: $UNISHARE_G_DAVPORT\nauth: true\nanonymous: $anonymous\ntls: false\ncert: cert.pem\nkey: key.pem\nprefix: /\nno_sniff: true\ndebug: false\n\n# Default user settings (will be merged)\nscope: /var/run/unishare/root\nmodify: false\nrules:\nEOF\n\tlocal oifs=$IFS\n\tIFS=\"$NEWLINE\"\n    for r in $UNISHARE_DAV_everyone_rw; do\n        echo \"  - path: /$r\"\n        echo \"    modify: true\"\n    done\n    for r in $UNISHARE_DAV_everyone_ro; do\n        echo \"  - path: /$r\"\n        echo \"    allow: true\"\n    done\n\tIFS=$oifs\n    cat <<-EOF\n  - regex: true\n    allow: false\n    path: ^/.+\n  - regex: false\n    allow: true\n    path: /\n\n# CORS configuration\ncors:\n  enabled: true\n  credentials: true\n  allowed_headers:\n    - Depth\n  allowed_hosts:\n    - http://localhost:$UNISHARE_G_DAVPORT\n  allowed_methods:\n    - GET\n  exposed_headers:\n    - Content-Length\n    - Content-Range\n\nusers:\nEOF\n}\n\nconfig_webdav() {\n    rm -rf /var/run/unishare 2>/dev/null\n    mkdir -p /var/run/unishare/root || return 1\n    config_foreach clean_webdav_user user\n    config_foreach validate_share share webdav add_webdav_share\n    { config_webdav_header ; config_foreach add_webdav_user user ; } > /var/run/unishare/webdav.yml\n}\n\nglobal_config() {\n    local enabled\n    local anonymous\n    local webdav_port\n    config_get enabled $1 enabled\n    config_get anonymous $1 anonymous\n    config_get webdav_port $1 webdav_port\n    export -n \"UNISHARE_G_ENABLED=$enabled\"\n    export -n \"UNISHARE_G_ANONYMOUS=$anonymous\"\n    export -n \"UNISHARE_G_DAVPORT=$webdav_port\"\n}\n\nboot() {\n    export -n ONBOOT=1\n    start \"$@\"\n}\n\nstart_service() {\n    clean_samba\n    config_load unishare\n    config_foreach global_config global\n    [ \"$UNISHARE_G_ENABLED\" = \"1\" ] || {\n        uci commit samba4\n        [ \"$ONBOOT\" = \"1\" ] || /etc/init.d/samba4 reload\n        clean_unused_smb_users\n        return 0\n    }\n    [ -z \"$UNISHARE_G_DAVPORT\" ] && UNISHARE_G_DAVPORT=8080\n    reconfig_samba || return 1\n    clean_unused_smb_users\n    [ \"$ONBOOT\" = \"1\" ] || /etc/init.d/samba4 reload\n    config_webdav || return 1\n\n    # start webdav2 daemon\n    procd_open_instance\n    procd_set_param command /usr/sbin/webdav2 -c /var/run/unishare/webdav.yml\n    procd_set_param respawn\n    procd_set_param file /var/run/unishare/webdav.yml\n    procd_set_param limits nofile=16384\n    procd_close_instance\n}\n\nshutdown() {\n    export -n ONSHUTDOWN=1\n    stop\n}\n\nservice_stopped() {\n    [ \"$ONSHUTDOWN\" = \"1\" ] && return 0\n\n    clean_samba\n    [ `uci changes samba4 | wc -l` -gt 0 ] && {\n        uci commit samba4\n        /etc/init.d/samba4 reload\n    }\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"unishare\"\n}\n"
  },
  {
    "path": "relevance/nas-packages/network/services/webdav2/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=webdav2\nPKG_VERSION:=4.3.2\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/jjm2473/webdav/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=b7e1c68ef423046ee84a7ae81a43514728731ac65597cf5df132f8b7beeecd7b\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)\n\nPKG_MAINTAINER:=jjm2473 <jjm2473@gmail.com>\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILES:=LICENSE\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\n\nGO_PKG:=github.com/hacdias/webdav\n\nGO_PKG_LDFLAGS_X:= \\\n  github.com/hacdias/webdav/cmd.version=$(PKG_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\nTAR_OPTIONS:=--strip-components 1 $(TAR_OPTIONS)\nTAR_CMD=$(HOST_TAR) -C $(PKG_BUILD_DIR) $(TAR_OPTIONS)\n\ndefine Package/webdav2\n\tSECTION:=net\n\tCATEGORY:=Network\n\tSUBMENU:=File Transfer\n\tTITLE:=Simple Go WebDAV server.\n\tURL:=https://github.com/hacdias/webdav\n\tDEPENDS:=$(GO_ARCH_DEPENDS)\nendef\n\ndefine Package/webdav2/description\n A Simple Go WebDAV server that supports acls.\nendef\n\ndefine Package/webdav2/conffiles\n/etc/config/webdav2\nendef\n\ndefine Package/webdav2/install\n\t$(INSTALL_DIR) $(1)/usr/sbin $(1)/etc/config $(1)/etc/init.d\n\t$(INSTALL_BIN) $(GO_PKG_BUILD_BIN_DIR)/webdav $(1)/usr/sbin/webdav2\n\t$(INSTALL_CONF) ./files/webdav2.config $(1)/etc/config/webdav2\n\t$(INSTALL_BIN) ./files/webdav2.init $(1)/etc/init.d/webdav2\nendef\n\n$(eval $(call GoBinPackage,webdav2))\n$(eval $(call BuildPackage,webdav2))\n"
  },
  {
    "path": "relevance/nas-packages/network/services/webdav2/files/webdav2.config",
    "content": "config global\n    option enabled '0'\n    option anonymous '1'\n    option port '8888'\n    option root '/etc/webdav2/root'\n\nconfig user 'everyone'\n    option username 'everyone'\n    option onlyroot '1'\n    list ro '/public'\n    list ro '/www'\n\nconfig user 'users'\n    option username 'users'\n    list ro '/work'\n\nconfig user\n    option username 'admin'\n    option password 'password'\n    list rw '/mnt'\n    list rw '/public'\n    list rw '/work'\n\nconfig user\n    option username 'jim'\n    option password 'abcdef'\n    list rw '/work'\n\n"
  },
  {
    "path": "relevance/nas-packages/network/services/webdav2/files/webdav2.init",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=98\nSTOP=05\nUSE_PROCD=1\n\nadd_webdav_user() {\n    local username\n    local password\n    local rw\n    local ro\n    config_get username $1 username\n    [ -z \"$username\" ] && return 1\n    [ \"$username\" = \"everyone\" -o \"$username\" = \"users\" ] && return 0\n    config_get password $1 password\n    config_get rw $1 rw\n    config_get ro $1 ro\n    echo \"  - username: $username\"\n    echo \"    password: $password\"\n    echo \"    rules:\"\n\n    local r\n    for r in $rw; do\n        echo \"      - path: $r\"\n        echo \"        modify: true\"\n    done\n    for r in `uci -q get webdav2.users.rw`; do\n        echo \"      - path: $r\"\n        echo \"        modify: true\"\n    done\n    for r in $ro; do\n        echo \"      - path: $r\"\n        echo \"        allow: true\"\n    done\n    for r in `uci -q get webdav2.users.ro`; do\n        echo \"      - path: $r\"\n        echo \"        allow: true\"\n    done\n}\n\nconfig_webdav_header() {\n    local r\n    local anonymous=false\n    [[ $WEBDAV2_G_ANONYMOUS == 1 ]] && anonymous=true\n    cat <<-EOF\n# Server related settings\naddress: 0.0.0.0\nport: $WEBDAV2_G_PORT\nauth: true\nanonymous: $anonymous\ntls: false\ncert: cert.pem\nkey: key.pem\nprefix: /\nno_sniff: true\ndebug: false\n\n# Default user settings (will be merged)\nscope: $WEBDAV2_G_ROOT\nmodify: false\nrules:\nEOF\n    for r in `uci -q get webdav2.everyone.rw`; do\n        echo \"  - path: $r\"\n        echo \"    modify: true\"\n    done\n    for r in `uci -q get webdav2.everyone.ro`; do\n        echo \"  - path: $r\"\n        echo \"    allow: true\"\n    done\n    [ \"`uci -q get webdav2.everyone.onlyroot`\" = \"1\" ] && cat <<-EOF\n  - regex: true\n    allow: false\n    path: ^/.+\nEOF\n\n    cat <<-EOF\n  - regex: false\n    allow: true\n    path: /\n\n# CORS configuration\ncors:\n  enabled: true\n  credentials: true\n  allowed_headers:\n    - Depth\n  allowed_hosts:\n    - http://localhost:$WEBDAV2_G_PORT\n  allowed_methods:\n    - GET\n  exposed_headers:\n    - Content-Length\n    - Content-Range\n\nusers:\nEOF\n}\n\nconfig_webdav2() {\n    rm -rf /var/run/webdav2 2>/dev/null\n    mkdir -p /var/run/webdav2 || return 1\n\n    { config_webdav_header ; config_foreach add_webdav_user user ; } > /var/run/webdav2/webdav.yml\n}\n\nglobal_config() {\n    local enabled\n    local anonymous\n    local port\n    local root\n    config_get enabled $1 enabled\n    config_get anonymous $1 anonymous\n    config_get port $1 port\n    config_get root $1 root\n    export -n \"WEBDAV2_G_ENABLED=$enabled\"\n    export -n \"WEBDAV2_G_ANONYMOUS=$anonymous\"\n    export -n \"WEBDAV2_G_PORT=$port\"\n    export -n \"WEBDAV2_G_ROOT=$root\"\n}\n\nstart_service() {\n    config_load webdav2\n    config_foreach global_config global\n    [ \"$WEBDAV2_G_ENABLED\" = \"1\" ] || return 0\n    [ -z \"$WEBDAV2_G_PORT\" ] && WEBDAV2_G_PORT=8888\n    config_webdav2 || return 1\n\n    # start webdav2 daemon\n    procd_open_instance\n    procd_set_param command /usr/sbin/webdav2 -c /var/run/webdav2/webdav.yml\n    procd_set_param respawn\n    procd_set_param limits nofile=16384\n    procd_close_instance\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"webdav2\"\n}\n"
  },
  {
    "path": "relevance/natter/Makefile",
    "content": "# Copyright (C) 2020-2022 Hyy2001X <https://github.com/Hyy2001X>\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=natter\nPKG_VERSION=0.9\nPKG_RELEASE:=$(AUTORELEASE)\nPKG_SOURCE_VERSION:=42005887f95dcfdfd5ed995bf237003f2f80ccfd\n\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_SOURCE_VERSION)\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/MikeWang000000/Natter/tar.gz/$(PKG_SOURCE_VERSION)?\nPKG_HASH:=skip\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n\tSECTION:=net\n\tCATEGORY:=Network\n\tTITLE:=Open Port under FullCone NAT (NAT 1)\n\tURL:=https://github.com/MikeWang000000/Natter\n\tDEPENDS:=+python3-light +iptables-mod-fullconenat\nendef\n\ndefine Build/Prepare\n\tmkdir -p $(PKG_BUILD_DIR)\n\ttar -zxvf $(DL_DIR)/$(PKG_SOURCE) -C $(PKG_BUILD_DIR)\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/usr/share/$(PKG_NAME)\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/Natter-$(PKG_SOURCE_VERSION)/natter.py $(1)/usr/share/$(PKG_NAME)/natter.py\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/Natter-$(PKG_SOURCE_VERSION)/natter-config.template.json $(1)/usr/share/$(PKG_NAME)/natter-config.template.json\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/Natter-$(PKG_SOURCE_VERSION)/natter-hook.sh $(1)/usr/share/$(PKG_NAME)/natter-hook.sh\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "relevance/natter2/Makefile",
    "content": "# Copyright (C) 2020-2024 Hyy2001X <https://github.com/Hyy2001X>\r\n\r\ninclude $(TOPDIR)/rules.mk\r\n\r\nPKG_NAME:=natter2\r\nPKG_VERSION=2.2.1\r\nPKG_RELEASE:=$(AUTORELEASE)\r\nPKG_SOURCE_VERSION:=ce1427650178167d2330c490d2e5cd979223e9a4\r\n\r\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_SOURCE_VERSION)\r\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_SOURCE_VERSION).tar.gz\r\nPKG_SOURCE_URL:=https://codeload.github.com/MikeWang000000/Natter/tar.gz/$(PKG_SOURCE_VERSION)?\r\nPKG_HASH:=skip\r\n\r\ninclude $(INCLUDE_DIR)/package.mk\r\n\r\ndefine Package/$(PKG_NAME)\r\n\tSECTION:=net\r\n\tCATEGORY:=Network\r\n\tTITLE:=Open Port under FullCone NAT (NAT 1)\r\n\tURL:=https://github.com/MikeWang000000/Natter\r\n\tDEPENDS:=+python3-light\r\nendef\r\n\r\ndefine Build/Prepare\r\n\tmkdir -p $(PKG_BUILD_DIR)\r\n\ttar -zxvf $(DL_DIR)/$(PKG_SOURCE) -C $(PKG_BUILD_DIR)\r\nendef\r\n\r\ndefine Build/Compile\r\nendef\r\n\r\ndefine Package/$(PKG_NAME)/install\r\n\t$(INSTALL_DIR) $(1)/usr/share/$(PKG_NAME)\r\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/Natter-$(PKG_SOURCE_VERSION)/natter.py $(1)/usr/share/$(PKG_NAME)/natter.py\r\n\t$(INSTALL_DIR) $(1)/usr/share/$(PKG_NAME)/natter-check\r\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/Natter-$(PKG_SOURCE_VERSION)/natter-check/natter-check.py $(1)/usr/share/$(PKG_NAME)/natter-check/natter-check.py\r\nendef\r\n\r\n$(eval $(call BuildPackage,$(PKG_NAME)))\r\n"
  },
  {
    "path": "relevance/onekey-install.sh",
    "content": "#!/bin/bash\n#========================================================================================\n#\n# This file is licensed under the terms of the GNU General Public\n# License version 2. This program is licensed \"as is\" without any\n# warranty of any kind, whether express or implied.\n#\n# This file is a part of the luci-app-amlogic plugin\n# https://github.com/ophub/luci-app-amlogic\n#\n# Description: Install luci-app-amlogic plugin for OpenWrt\n# Copyright (C) 2021- https://github.com/unifreq/openwrt_packit\n# Copyright (C) 2021- https://github.com/ophub/luci-app-amlogic\n#\n# Command: curl -fsSL git.io/luci-app-amlogic | bash\n#\n#==================================== Functions list ====================================\n#\n# process_msg      : Output process message\n# query_version    : Query the latest version\n# download_plugin  : Download plug-in\n# install_plugin   : Install plug-in\n#\n#============================ Set make environment variables ============================\n#\n# Set the plugin download directory\ntmp_dir=\"/root\"\n#\n#========================================================================================\n\nprocess_msg() {\n    echo -e \"${1}\"\n    [[ -n \"${2}\" && \"${2}\" -eq \"1\" ]] && exit 1\n}\n\nquery_version() {\n    process_msg \"01. Start querying plugin version...\"\n\n    # Get the latest version\n    latest_version=\"$(\n        curl -fsSL -m 10 \\\n            https://github.com/ophub/luci-app-amlogic/releases |\n            grep -oE 'expanded_assets/[0-9]+.[0-9]+.[0-9]+(-[0-9]+)?' | sed 's|expanded_assets/||g' |\n            sort -urV | head -n 1\n    )\"\n    if [[ -z \"${latest_version}\" ]]; then\n        process_msg \"01.01 Query failed, please try again.\" \"1\"\n    else\n        process_msg \"01.01 Latest version: ${latest_version}\"\n        sleep 2\n    fi\n}\n\ndownload_plugin() {\n    process_msg \"02. Start downloading the latest plugin...\"\n\n    # Delete other ipk files\n    rm -f ${tmp_dir}/*.ipk ${tmp_dir}/*.apk\n\n    # Check if the package manager is opkg or apk\n    package_manager=\"\"\n    if command -v opkg >/dev/null 2>&1; then\n        package_manager=\"ipk\"\n    elif command -v apk >/dev/null 2>&1; then\n        package_manager=\"apk\"\n    else\n        process_msg \"No supported package manager found. Please install opkg or apk.\" \"1\"\n    fi\n    process_msg \"package_manager: ${package_manager}\"\n\n    # Set the plugin download path\n    download_repo=\"https://github.com/ophub/luci-app-amlogic/releases/download\"\n\n    # Intelligent File Discovery\n    plugin_file_name=\"\"\n    lang_file_list=\"\"\n\n    # Method 1: Use GitHub API if 'jq' is installed (Preferred Method)\n    if command -v jq >/dev/null 2>&1; then\n        process_msg \"Using GitHub API with jq to find package files.\"\n        api_url=\"https://api.github.com/repos/ophub/luci-app-amlogic/releases/tags/${latest_version}\"\n\n        # Fetch all asset names from the API\n        asset_list=\"$(curl -fsSL -m 15 \"${api_url}\" | jq -r '.assets[].name' | xargs)\"\n\n        if [[ -n \"${asset_list}\" ]]; then\n            # Discover exact filenames using regular expressions from the asset list\n            plugin_file_name=\"$(echo \"${asset_list}\" | tr ' ' '\\n' | grep -oE \"^luci-app-amlogic.*${package_manager}$\" | head -n 1)\"\n            lang_file_list=($(echo \"${asset_list}\" | tr ' ' '\\n' | grep -oE \"^luci-i18n-amlogic.*${package_manager}$\"))\n        else\n            process_msg \"Warning: Failed to fetch data from GitHub API.\" \"1\"\n        fi\n    else\n        process_msg \"jq not found, Aborting.\" \"1\"\n    fi\n\n    # Validation and Download\n    if [[ -z \"${plugin_file_name}\" || \"${#lang_file_list[@]}\" -eq \"0\" ]]; then\n        process_msg \"Could not discover plugin(.${package_manager}) in the release. Aborting.\" \"1\"\n    fi\n\n    process_msg \"02.01 Found plugin file: ${plugin_file_name}\"\n    process_msg \"02.02 Found language file: $(echo ${lang_file_list[@]} | xargs)\"\n\n    # Download the main plugin file\n    plugin_full_url=\"${download_repo}/${latest_version}/${plugin_file_name}\"\n    process_msg \"02.03 Downloading main plugin [ ${plugin_file_name} ]...\"\n    curl -fsSL \"${plugin_full_url}\" -o \"${tmp_dir}/${plugin_file_name}\"\n    [[ \"${?}\" -ne \"0\" ]] && process_msg \"02.03 Plugin [ ${plugin_file_name} ] download failed.\" \"1\"\n\n    # Download language packs\n    for langfile in \"${lang_file_list[@]}\"; do\n        lang_full_url=\"${download_repo}/${latest_version}/${langfile}\"\n        process_msg \"02.04 Downloading language pack [ ${langfile} ]...\"\n        curl -fsSL \"${lang_full_url}\" -o \"${tmp_dir}/${langfile}\"\n        [[ \"${?}\" -ne \"0\" ]] && process_msg \"02.04 Language pack [ ${langfile} ] download failed.\" \"1\"\n    done\n\n    # The .apk filename is preceded by a tilde (~) instead of a dot (.).\n    for file in ${tmp_dir}/*.apk; do\n        [[ -f \"${file}\" ]] || continue\n        base_name=\"$(basename \"${file}\")\"\n        new_name=\"$(echo \"${base_name}\" | sed -E 's/\\.([a-f0-9]{7}\\.apk)/~\\1/')\"\n        if [[ \"${base_name}\" != \"${new_name}\" ]]; then\n            mv -f \"${file}\" \"${tmp_dir}/${new_name}\" || true\n        fi\n    done\n\n    sync && sleep 2\n}\n\ninstall_plugin() {\n    process_msg \"03. Start installing plugins...\"\n\n    # Force plug-in reinstallation\n    if [[ \"${package_manager}\" == \"opkg\" ]]; then\n        opkg --force-reinstall install ${tmp_dir}/*.ipk\n    elif [[ \"${package_manager}\" == \"apk\" ]]; then\n        apk add --force-overwrite --allow-untrusted ${tmp_dir}/*.apk\n    fi\n\n    # Delete cache file\n    rm -rf /tmp/luci-indexcache /tmp/luci-modulecache/* 2>/dev/null\n    rm -f ${tmp_dir}/*.ipk ${tmp_dir}/*.apk\n\n    process_msg \"03.01 The plugin has been installed successfully, Path: System -> Amlogic Service.\"\n}\n\nquery_version\ndownload_plugin\ninstall_plugin\n\nexit 0\n"
  },
  {
    "path": "relevance/oscam/Config.in",
    "content": "menu \"OSCam build options\"\n\tdepends on PACKAGE_oscam\n\nconfig OSCAM_USE_LIBCRYPTO\n\tbool \"Build with OpenSSL libcrypto\"\n\thelp\n\t\t\"Use OpenSSL libcrypto instead of OSCam internal crypto functions\"\n\tdefault y\n\nconfig OSCAM_USE_LIBUSB\n\tbool\n\tdefault y\n\n\tmenu \"Protocols\"\n\tdepends on PACKAGE_oscam\n\n\tconfig OSCAM_MODULE_CAMD33\n\t\tbool \"camd 3.3\"\n\t\tdefault y\n\n\tconfig OSCAM_MODULE_CAMD35\n\t\tbool \"camd 3.5 UDP\"\n\t\tdefault y\n\n\tconfig OSCAM_MODULE_CAMD35_TCP\n\t\tbool \"camd 3.5 TCP\"\n\t\tdefault y\n\n\tconfig OSCAM_MODULE_NEWCAMD\n\t\tbool \"newcamd\"\n\t\tdefault y\n\n\tconfig OSCAM_MODULE_CCCAM\n\t\tbool \"CCcam\"\n\t\tdefault y\n\n\tconfig OSCAM_MODULE_CCCSHARE\n\t\tbool \"CCcam share\"\n\t\tdefault y\n\n\tconfig OSCAM_MODULE_GBOX\n\t\tbool \"gbox\"\n\t\tdefault y\n\n\tconfig OSCAM_MODULE_RADEGAST\n\t\tbool \"radegast\"\n\t\tdefault y\n\n\tconfig OSCAM_MODULE_SERIAL\n\t\tbool \"Serial\"\n\t\tdefault y\n\n\tconfig OSCAM_MODULE_CONSTCW\n\t\tbool \"constant CW\"\n\t\tdefault y\n\n\tconfig OSCAM_MODULE_PANDORA\n\t\tbool \"Pandora\"\n\t\tdefault y\n\n\tconfig OSCAM_MODULE_GHTTP\n\t\tbool \"Ghttp\"\n\t\tdefault y\n\n\tconfig OSCAM_MODULE_SCAM\n\t\tbool \"scam\"\n\t\tdefault y\n\n\tendmenu\n\n\tmenu \"Readers\"\n\tdepends on PACKAGE_oscam\n\n\tconfig OSCAM_READER_NAGRA\n\t\tbool \"Nagravision\"\n\t\tdefault y\n\n\tconfig OSCAM_READER_IRDETO\n\t\tbool \"Irdeto\"\n\t\tdefault y\n\n\tconfig OSCAM_READER_CONAX\n\t\tbool \"Conax\"\n\t\tdefault y\n\n\tconfig OSCAM_READER_CRYPTOWORKS\n\t\tbool \"Cryptoworks\"\n\t\tdefault y\n\n\tconfig OSCAM_READER_SECA\n\t\tbool \"Seca\"\n\t\tdefault y\n\n\tconfig OSCAM_READER_VIACCESS\n\t\tbool \"Viaccess\"\n\t\tdefault y\n\n\tconfig OSCAM_READER_VIDEOGUARD\n\t\tbool \"NDS Videoguard\"\n\t\tdefault y\n\n\tconfig OSCAM_READER_DRE\n\t\tbool \"DRE Crypt\"\n\t\tdefault y\n\n\tconfig OSCAM_READER_TONGFANG\n\t\tbool \"Tongfang\"\n\t\tdefault y\n\n\tconfig OSCAM_READER_BULCRYPT\n\t\tbool \"Bulcrypt\"\n\t\tdefault y\n\n\tconfig OSCAM_READER_GRIFFIN\n\t\tbool \"Griffin\"\n\t\tdefault y\n\n\tconfig OSCAM_READER_DGCRYPT\n\t\tbool \"DGCrypt\"\n\t\tdefault y\n\n\tendmenu\n\n\tmenu \"Card readers\"\n\tdepends on PACKAGE_oscam\n\n\tconfig OSCAM_USE_PCSC\n\t\tbool \"PCSC compatible readers\"\n\t\tselect OSCAM_USE_LIBUSB\n\t\tdefault y\n\n\tconfig OSCAM_CARDREADER_PHOENIX\n\t\tbool \"Phoenix/mouse USB readers\"\n\t\tselect OSCAM_USE_LIBUSB\n\t\tdefault y\n\n\tconfig OSCAM_CARDREADER_SC8IN1\n\t\tbool \"SC8in1\"\n\t\tselect OSCAM_USE_LIBUSB\n\t\tdefault y\n\n\tconfig OSCAM_CARDREADER_MP35\n\t\tbool \"AD-Teknik MP 3.6/USB Phoenix\"\n\t\tselect OSCAM_USE_LIBUSB\n\t\tdefault y\n\n\tconfig OSCAM_CARDREADER_SMARGO\n\t\tbool \"Argolis Smargo Smartreader\"\n\t\tselect OSCAM_USE_LIBUSB\n\t\tdefault y\n\n\tconfig OSCAM_CARDREADER_STINGER\n\t\tbool \"Stinger USB Dual Smartcard Reader\"\n\t\tselect OSCAM_USE_LIBUSB\n\t\tdefault y\n\n\tconfig OSCAM_CARDREADER_DRECAS\n\t\tbool \"DRECAS reader\"\n\t\tdefault y\n\n\tendmenu\n\ncomment \"Addons\"\nconfig OSCAM_HAVE_DVBAPI\n\tbool \"DVB API\"\n\tdefault y\n\nconfig OSCAM_READ_SDT_CHARSETS\n\tbool \"DVB API read-sdt charsets\"\n\tdefault y\n\nconfig OSCAM_IRDETO_GUESSING\n\tbool \"Irdeto guessing\"\n\tdefault y\n\nconfig OSCAM_CS_ANTICASC\n\tbool \"Anti cascading\"\n\tdefault y\n\nconfig OSCAM_WITH_DEBUG\n\tbool \"Debug messages\"\n\tdefault y\n\nconfig OSCAM_MODULE_MONITOR\n\tbool \"Monitor\"\n\tdefault y\n\nconfig OSCAM_WITH_LB\n\tbool \"Loadbalancing\"\n\tdefault y\n\nconfig OSCAM_S_CACHEEX\n\tbool \"Cache exchange\"\n\tdefault y\n\nconfig OSCAM_CW_CYCLE_CHECK\n\tbool \"CW Cycle Check\"\n\tdefault y\n\nconfig OSCAM_LCDSUPPORT\n\tbool \"LCD support\"\n\tdefault n\n\nconfig OSCAM_LEDSUPPORT\n\tbool \"LED support\"\n\tdefault n\n\nconfig OSCAM_CLOCKFIX\n\tbool \"Clockfix (disable on old systems!)\"\n\tdefault y\n\nconfig OSCAM_IPV6SUPPORT\n\tbool \"IPv6 support (experimental)\"\n\tdefault n\n\nconfig OSCAM_WEBIF\n\tbool \"Web Interface\"\n\tdefault y\n\n\tconfig OSCAM_WEBIF_LIVELOG\n\t\tbool \"LiveLog\"\n\t\tdepends on OSCAM_WEBIF\n\t\tdefault y\n\n\tconfig OSCAM_WEBIF_JQUERY\n\t\tbool \"Jquery onboard (if disabled webload)\"\n\t\tdepends on OSCAM_WEBIF\n\t\tdefault y\n\n\tconfig OSCAM_TOUCH\n\t\tbool \"Touch Web Interface\"\n\t\tdepends on OSCAM_WEBIF\n\t\tdefault y\n\n\tconfig OSCAM_WITH_SSL\n\t\tbool \"SSL support\"\n\t\tdepends on OSCAM_WEBIF\n\t\tselect OSCAM_USE_LIBCRYPTO\n\t\tdefault y\n\nendmenu\n"
  },
  {
    "path": "relevance/oscam/Makefile",
    "content": "#\n# Copyright (C) 2016-2017 Tomasz Maciej Nowak <tomek_n@o2.pl>\n#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=oscam\nPKG_RELEASE:=1\n\nPKG_SOURCE_PROTO:=git\nPKG_SOURCE_URL:=https://github.com/nx111/oscam.git\nPKG_SOURCE_DATE:=2022-03-07\nPKG_SOURCE_VERSION:=c5b2e655d2948a50bdc5a0db288b10f1955c3bd8\nPKG_MIRROR_HASH:=fad891220c4ea41d0eac5de5d4f41ba54f75c46cdd16ed3ebec61b64aa12b14e\n\nPKG_LICENSE:=GPL-3.0\nPKG_LICENSE_FILES:=COPYING\nPKG_MAINTAINER:=Tomasz Maciej Nowak <tomek_n@o2.pl>\n\nPKG_BUILD_PARALLEL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/oscam/config\n\tsource \"$(SOURCE)/Config.in\"\nendef\n\ndefine Package/oscam\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=Open Source Conditional Access Modul\n  URL:=http://www.streamboard.tv/oscam\n  DEPENDS:=+OSCAM_USE_LIBCRYPTO:libopenssl +OSCAM_USE_LIBUSB:libusb-1.0 +OSCAM_USE_PCSC:pcscd\nendef\n\ndefine Package/list-smargo\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=List Smargo readers\n  URL:=http://www.streamboard.tv/oscam\n  DEPENDS:=oscam @OSCAM_CARDREADER_SMARGO\nendef\n\nCONFIGURE_CMD:=./config.sh\nCONFIGURE_ARGS+= \\\n\t--restore \\\n\t$(if $(CONFIG_OSCAM_WEBIF),--enable,--disable) WEBIF \\\n\t$(if $(CONFIG_OSCAM_WEBIF_LIVELOG),--enable,--disable) WEBIF_LIVELOG \\\n\t$(if $(CONFIG_OSCAM_WEBIF_JQUERY),--enable,--disable) WEBIF_JQUERY \\\n\t$(if $(CONFIG_OSCAM_TOUCH),--enable,--disable) TOUCH \\\n\t$(if $(CONFIG_OSCAM_WITH_SSL),--enable,--disable) WITH_SSL \\\n\t$(if $(CONFIG_OSCAM_HAVE_DVBAPI),--enable,--disable) HAVE_DVBAPI \\\n\t$(if $(CONFIG_OSCAM_READ_SDT_CHARSETS),--enable,--disable) READ_SDT_CHARSETS \\\n\t$(if $(CONFIG_OSCAM_IRDETO_GUESSING),--enable,--disable) IRDETO_GUESSING \\\n\t$(if $(CONFIG_OSCAM_CS_ANTICASC),--enable,--disable) CS_ANTICASC \\\n\t$(if $(CONFIG_OSCAM_WITH_DEBUG),--enable,--disable) WITH_DEBUG \\\n\t$(if $(CONFIG_OSCAM_MODULE_MONITOR),--enable,--disable) MODULE_MONITOR \\\n\t$(if $(CONFIG_OSCAM_WITH_LB),--enable,--disable) WITH_LB \\\n\t$(if $(CONFIG_OSCAM_CS_CACHEEX),--enable,--disable) CS_CACHEEX \\\n\t$(if $(CONFIG_OSCAM_CW_CYCLE_CHECK),--enable,--disable) CW_CYCLE_CHECK \\\n\t$(if $(CONFIG_OSCAM_LCDSUPPORT),--enable,--disable) LCDSUPPORT \\\n\t$(if $(CONFIG_OSCAM_LEDSUPPORT),--enable,--disable) LEDSUPPORT \\\n\t$(if $(CONFIG_OSCAM_CLOCKFIX),--enable,--disable) CLOCKFIX \\\n\t$(if $(CONFIG_OSCAM_IPV6SUPPORT),--enable,--disable) IPV6SUPPORT \\\n\t$(if $(CONFIG_OSCAM_MODULE_CAMD33),--enable,--disable) MODULE_CAMD33 \\\n\t$(if $(CONFIG_OSCAM_MODULE_CAMD35),--enable,--disable) MODULE_CAMD35 \\\n\t$(if $(CONFIG_OSCAM_MODULE_CAMD35_TCP),--enable,--disable) MODULE_CAMD35_TCP \\\n\t$(if $(CONFIG_OSCAM_MODULE_NEWCAMD),--enable,--disable) MODULE_NEWCAMD \\\n\t$(if $(CONFIG_OSCAM_MODULE_CCCAM),--enable,--disable) MODULE_CCCAM \\\n\t$(if $(CONFIG_OSCAM_MODULE_CCCSHARE),--enable,--disable) MODULE_CCCSHARE \\\n\t$(if $(CONFIG_OSCAM_MODULE_GBOX),--enable,--disable) MODULE_GBOX \\\n\t$(if $(CONFIG_OSCAM_MODULE_RADEGAST),--enable,--disable) MODULE_RADEGAST \\\n\t$(if $(CONFIG_OSCAM_MODULE_SCAM),--enable,--disable) MODULE_SCAM \\\n\t$(if $(CONFIG_OSCAM_MODULE_SERIAL),--enable,--disable) MODULE_SERIAL \\\n\t$(if $(CONFIG_OSCAM_MODULE_CONSTCW),--enable,--disable) MODULE_CONSTCW \\\n\t$(if $(CONFIG_OSCAM_MODULE_PANDORA),--enable,--disable) MODULE_PANDORA \\\n\t$(if $(CONFIG_OSCAM_MODULE_GHTTP),--enable,--disable) MODULE_GHTTP \\\n\t$(if $(CONFIG_OSCAM_READER_NAGRA),--enable,--disable) READER_NAGRA \\\n\t$(if $(CONFIG_OSCAM_READER_IRDETO),--enable,--disable) READER_IRDETO \\\n\t$(if $(CONFIG_OSCAM_READER_CONAX),--enable,--disable) READER_CONAX \\\n\t$(if $(CONFIG_OSCAM_READER_CRYPTOWORKS),--enable,--disable) READER_CRYPTOWORKS \\\n\t$(if $(CONFIG_OSCAM_READER_SECA),--enable,--disable) READER_SECA \\\n\t$(if $(CONFIG_OSCAM_READER_VIACCESS),--enable,--disable) READER_VIACCESS \\\n\t$(if $(CONFIG_OSCAM_READER_VIDEOGUARD),--enable,--disable) READER_VIDEOGUARD \\\n\t$(if $(CONFIG_OSCAM_READER_DRE),--enable,--disable) READER_DRE \\\n\t$(if $(CONFIG_OSCAM_READER_TONGFANG),--enable,--disable) READER_TONGFANG \\\n\t$(if $(CONFIG_OSCAM_READER_BULCRYPT),--enable,--disable) READER_BULCRYPT \\\n\t$(if $(CONFIG_OSCAM_READER_GRIFFIN),--enable,--disable) READER_GRIFFIN \\\n\t$(if $(CONFIG_OSCAM_READER_DGCRYPT),--enable,--disable) READER_DGCRYPT \\\n\t$(if $(CONFIG_OSCAM_CARDREADER_PHOENIX),--enable,--disable) CARDREADER_PHOENIX \\\n\t$(if $(CONFIG_OSCAM_CARDREADER_SC8IN1),--enable,--disable) CARDREADER_SC8IN1 \\\n\t$(if $(CONFIG_OSCAM_CARDREADER_MP35),--enable,--disable) CARDREADER_MP35 \\\n\t$(if $(CONFIG_OSCAM_CARDREADER_SMARGO),--enable,--disable) CARDREADER_SMARGO \\\n\t$(if $(CONFIG_OSCAM_CARDREADER_STINGER),--enable,--disable) CARDREADER_STINGER \\\n\t$(if $(CONFIG_OSCAM_CARDREADER_DRECAS),--enable,--disable) CARDREADER_DRECAS \\\n\t--disable CARDREADER_INTERNAL_AZBOX \\\n\t--disable CARDREADER_INTERNAL_COOLAPI \\\n\t--disable CARDREADER_INTERNAL_COOLAPI2 \\\n\t--disable CARDREADER_INTERNAL_SCI \\\n\t--disable CARDREADER_DB2COM \\\n\t--disable CARDREADER_STAPI \\\n\t--disable CARDREADER_STAPI5\n\nifeq ($(CONFIG_OSCAM_USE_LIBUSB),y)\n\tMAKE_FLAGS += USE_LIBUSB=1\nendif\n\nifeq ($(CONFIG_OSCAM_USE_PCSC),y)\n\tMAKE_FLAGS += USE_PCSC=1\nendif\n\nifeq ($(CONFIG_OSCAM_USE_LIBCRYPTO),y)\n\tMAKE_FLAGS += USE_LIBCRYPTO=1\nendif\n\nifeq ($(CONFIG_OSCAM_WITH_SSL),y)\n\tMAKE_FLAGS += USE_SSL=1\nendif\n\nMAKE_FLAGS += \\\n\tCONF_DIR=/etc/oscam \\\n\tOSCAM_BIN=Distribution/oscam \\\n\tLIST_SMARGO_BIN=Distribution/list-smargo\n\ndefine Package/oscam/conffiles\n/etc/oscam/\nendef\n\ndefine Package/oscam/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/Distribution/oscam $(1)/usr/bin/oscam\n\n\t$(INSTALL_DIR) $(1)/etc/oscam\n\t# $(CP) $(PKG_BUILD_DIR)/Distribution/doc/example/* $(1)/etc/oscam/\n\t$(INSTALL_CONF) ./files/oscam.conf $(1)/etc/oscam/oscam.conf\n\t$(INSTALL_CONF) ./files/oscam.user $(1)/etc/oscam/oscam.user\n\t$(INSTALL_CONF) ./files/oscam.dvbapi $(1)/etc/oscam/oscam.dvbapi\n\t$(INSTALL_CONF) ./files/oscam.server $(1)/etc/oscam/oscam.server\n\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_BIN) ./files/oscam.init $(1)/etc/init.d/oscam\n\n\t$(INSTALL_DIR) $(1)/usr/share/oscam\n\t$(INSTALL_BIN) ./files/oscam-watchdog.sh $(1)/usr/share/oscam/oscam-watchdog.sh\n\nendef\n\ndefine Package/list-smargo/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/Distribution/list-smargo $(1)/usr/bin/list-smargo\nendef\n\n$(eval $(call BuildPackage,oscam))\n$(eval $(call BuildPackage,list-smargo))\n"
  },
  {
    "path": "relevance/oscam/files/oscam-watchdog.sh",
    "content": "#!/bin/sh\n\nsleeptime=60\nlogfile=\"/var/log/oscam.log\"\nOSCAM_PATH=/usr/bin\nenable=$(uci get oscam.config.enabled 2>/dev/null)\n\noscam_log(){\n\tlogrow=$(grep -c \"\" ${logfile})\n\tif [ $logrow -ge 500 ];then\n\t\tcat /dev/null > ${logfile}\n\t\techo \"$curtime Log条数超限，清空处理！\" >> ${logfile}\n\tfi\n}\n\nwhile [ $enable -eq 1 ];\ndo\n\toscam_log\n\tcurtime=`date \"+%H:%M:%S\"`\n\techo \"$curtime online! \"\n\n\tif ! pidof oscam>/dev/null; then\n\t\tservice_start ${OSCAM_PATH}/oscam -b -r 2 -u\n\t\techo \"$curtime 重启服务！\" >> ${logfile}\n\tfi\n\nsleep ${sleeptime}\ncontinue\ndone\n\n\n"
  },
  {
    "path": "relevance/oscam/files/oscam.conf",
    "content": "# oscam.conf generated automatically by Streamboard OSCAM 1.20-unstable_svn SVN r11390\n# Read more: http://www.streamboard.tv/svn/oscam/trunk/Distribution/doc/txt/oscam.conf.txt\n\n[global]\ndisablelog                    = 1\nlogfile                       = /var/log/oscam/oscam.log\nnice                          = 0\nmaxlogsize                    = 1000\npreferlocalcards              = 1\nlb_mode                       = 3\nlb_min_ecmcount               = 8\n\n[cache]\n\n[dvbapi]\nenabled                       = 1\nau                            = 1\npmt_mode                      = 4\nrequest_mode                  = 1\nlisten_port                   = 9000\ndelayer                       = 80\nuser                          = TVH\nboxtype                       = pc\n\n[camd33]\nport                          = 44444\nserverip                      = 127.0.0.1\nnocrypt                       = 127.0.0.1\n\n[cccam]\nport                          = 12000\nnodeid                        = 178EC950108E1442\nversion                       = 2.3.0\nreshare                       = 1\nignorereshare                 = 1\nstealth                       = 1\n\n[webif]\nhttpport                      = 8888\nhttpuser                      = oscam\nhttppwd                       = oscam\nhttpshowmeminfo               = 1\nhttpshowuserinfo              = 1\nhttpshowecminfo               = 1\nhttpshowloadinfo              = 1\nhttpallowed                   = 0.0.0.0-255.255.255.255\naulow                         = 120\nhttputf8  \n"
  },
  {
    "path": "relevance/oscam/files/oscam.dvbapi",
    "content": "P: 0500:040620 # NTV+ (36Е)\nP: 0500:041200 # NTV+ (36Е)\nP: 0500:060A00 # NTV+ (36E)\nP: 0500:060C00 # NTV+ (36E)\nP: 0500:023100 # trk football (Shara)(5Е)\nP: 0500:041200 # trk football (Shara)(5Е)\nP: 0500:041700 # Dorcel TV (13Е)\nP: 0500:042300 # rtvi (13Е)\nP: 0500:042700 # SCT, S1-7-HQ,HD (13Е)\nP: 0500:042800 # Absat/BisTV (13Е)\nP: 0500:043800 # REDLIGHT HD, Redlight Premium & Daring! TV (13Е)\nP: 0100:000068 # Cyfra+ 13e\nP: 09CD:0      # Sky 13e\nP: 1803:007001 # Polsat (13Е)\nP: 1803:007101 # Polsat (13Е)\nP: 1803:000000 # Polsat (13Е)\nP: 090D:0      # yes 4w\nP: 090F:0      # viasat baltic 5e\n\n# EMU\nP: 2600:000000 # BISS\nP: 0500:023800 # srg (EMU)(13Е)\nP: 0E00:000000 # PowerVU\nP: 0500:007400\nP: 0D00:000000\nP: 0D05:000000\nP: 0D02:000000\nP: 1801:000000\n\n# Ignor\nI:0\n"
  },
  {
    "path": "relevance/oscam/files/oscam.init",
    "content": "#!/bin/sh /etc/rc.common\n\nSTART=99\nOSCAM_PATH=/usr/bin\n\n[ -f  /tmp/oscam ] && \n{\n\tOSCAM_PATH=/tmp\n\t[ -x  /tmp/oscam ] ||  chmod +x /tmp/oscam\n}\n\nstart() {\n\tenable=$(uci get oscam.config.enabled 2>/dev/null)\n\tkill -9 $(ps | grep oscam-watchdog.sh | grep -v \"grep\" | awk '{print $1}') >/dev/null 2>&1\n\tif [ $enable -eq 1 ]; then\n\t\t/etc/init.d/pcscd enable\n\t\t/etc/init.d/pcscd start\n\t\tif pidof oscam >/dev/null; then\n\t\t\tkill $(pidof oscam) >/dev/null 2>&1 || killall -9 oscam >/dev/null 2>&1\n\t\t\tsleep 1\n\t\tfi\n\techo \"enable\"\n\t[ -d /var/log/oscam ] || mkdir -p /var/log/oscam\n\tservice_start ${OSCAM_PATH}/oscam -b -r 2 -u\n\tnohup /usr/share/oscam/oscam-watchdog.sh > /var/log/oscam.log 2>&1 &\n\tfi\n}\n\nstop() {\n\tenable=$(uci get oscam.config.enabled 2>/dev/null)\n\tif [ $enable -ne 1 ]; then\n\t\techo \"stop!\"\n\t\tkill -9 $(ps | grep oscam-watchdog.sh | grep -v \"grep\" | awk '{print $1}') >/dev/null 2>&1\n\t\tkill $(pidof oscam) >/dev/null 2>&1 || killall -9 oscam >/dev/null 2>&1\n\t\t/etc/init.d/pcscd stop \n\t\t/etc/init.d/pcscd disable\n\tfi\n}\n\nrestart(){\n\tstop\n\tsleep 2\n\tstart\n\techo \"oscam Server has restarted.\"\n}"
  },
  {
    "path": "relevance/oscam/files/oscam.server",
    "content": "# oscam.server generated automatically by Streamboard OSCAM 1.20-unstable_svn SVN r11401\n# Read more: http://www.streamboard.tv/svn/oscam/trunk/Distribution/doc/txt/oscam.server.txt\n\n[reader]\nlabel                         = emulator\nprotocol                      = emu\ndevice                        = emulator\ncaid                          = 0D00,0D02,090F,0500,1801,0604,2600,FFFF,0E00\ndetect                        = cd\nident                         = 0D00:000000,000004,000010,000014,000020,0000C0,0000C4,0000C8,0000CC;0D02:000000,00008C,0000A0,0000A4,0000A8;090F:000000;0500:000000,030B00,023800,021110,007400,007800;1801:000000,007301,001101;0604:000000;2600:000000;FFFF:000000;0E00:000000\ngroup                         = 1\nemmcache                      = 2,3,2,0\nemu_auproviders               = 0500:030B00;0604:010200;0E00:000000\n\n"
  },
  {
    "path": "relevance/oscam/files/oscam.user",
    "content": "# oscam.user generated automatically by Streamboard OSCAM 1.20-unstable_svn SVN r11401\n# Read more: http://www.streamboard.tv/svn/oscam/trunk/Distribution/doc/txt/oscam.user.txt\n\n[account]\nuser                          = tvheadend_x\npwd                           = tvheadend_x\nmonlevel                      = 4\nau                            = 1\ngroup                         = 1\nmax_connections               = 100\ncccreshare                    = 1\n\n[account]\nuser                          = user1\npwd                           = user1\nmonlevel                      = 4\nau                            = 1\ngroup                         = 1\nmax_connections               = 100\ncccreshare                    = 1\n\n[account]\nuser                          = monitor\npwd                           = monitor\nmonlevel                      = 4\ngroup                         = 1\n\n"
  },
  {
    "path": "relevance/passwall-packages/chinadns-ng/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=chinadns-ng\nPKG_VERSION:=2025.08.09\nPKG_RELEASE:=1\n\nifeq ($(ARCH),aarch64)\n  ifeq ($(BOARD),rockchip)\n    PKG_ARCH:=chinadns-ng+wolfssl@aarch64-linux-musl@generic+v8a@fast+lto\n    PKG_HASH:=3fe0217615dd7060b7287d2b6b31d2a0b364137398bfb335a03bead322eac716\n  else\n    PKG_ARCH:=chinadns-ng+wolfssl_noasm@aarch64-linux-musl@generic+v8a@fast+lto\n    PKG_HASH:=42ddd494200ec6d88b35902927688d316bc23e06e6c08d9e01eb2412196ab845\n  endif\nelse ifeq ($(ARCH),arm)\n  ifeq ($(CONFIG_arm_v6),y)\n    PKG_ARCH:=chinadns-ng+wolfssl@arm-linux-musleabi@generic+v6+soft_float@fast+lto\n    PKG_HASH:=0a401d1dc11129481b2baf86f847d55d66bd7e725cba4bf57875fdad27ef0052\n  else ifeq ($(CONFIG_arm_v7),y)\n    ifeq ($(CONFIG_HAS_FPU),y)\n      PKG_ARCH:=chinadns-ng+wolfssl@arm-linux-musleabihf@generic+v7a@fast+lto\n      PKG_HASH:=dfa1f6ba80fb0925613822f4c4e00df8da68e7b8b772048d26a0d1a9d07d346b\n    else\n      PKG_ARCH:=chinadns-ng+wolfssl@arm-linux-musleabi@generic+v6+soft_float@fast+lto\n      PKG_HASH:=0a401d1dc11129481b2baf86f847d55d66bd7e725cba4bf57875fdad27ef0052\n    endif\n  else\n    PKG_ARCH:=chinadns-ng+wolfssl@arm-linux-musleabi@generic+v5te+soft_float@fast+lto\n    PKG_HASH:=dc104953fcd95c1c98b7b2b54b0b6731565e0650f81230e6de127a486803f42f\n  endif\nelse ifeq ($(ARCH),mips)\n  PKG_ARCH:=chinadns-ng+wolfssl@mips-linux-musl@mips32+soft_float@fast+lto\n  PKG_HASH:=b610821a8f61b0ed3c8c7e82e10d401348a9de17f900988589024a37c4099c8e\nelse ifeq ($(ARCH),mipsel)\n  ifeq ($(CONFIG_HAS_FPU),)\n    PKG_ARCH:=chinadns-ng+wolfssl@mipsel-linux-musl@mips32+soft_float@fast+lto\n    PKG_HASH:=760544a88724e3b1b9eac79c9400231e81aa8786f8f00a979229e175811ffe6d\n  else\n    PKG_ARCH:=chinadns-ng+wolfssl@mipsel-linux-musl@mips32@fast+lto\n    PKG_HASH:=ec547c31a884e0967437ceb90a5c270864efe81b0e40939e0ec2810c7bfd6653\n  endif\nelse ifeq ($(ARCH),mips64)\n  PKG_ARCH:=chinadns-ng+wolfssl@mips64-linux-musl@mips64+soft_float@fast+lto\n  PKG_HASH:=2d0fce18a7ef1d74fdc12738767e66998a52c2b30d8790da760933853fe8726e\nelse ifeq ($(ARCH),mips64el)\n  PKG_ARCH:=chinadns-ng+wolfssl@mips64el-linux-musl@mips64+soft_float@fast+lto\n  PKG_HASH:=a301d8d200d06582c60bbe0e487a28f5b41e6f0997a548cf882a7b078dab089c\nelse ifeq ($(ARCH),i386)\n  ifneq ($(CONFIG_TARGET_x86_geode)$(CONFIG_TARGET_x86_legacy),)\n    PKG_ARCH:=chinadns-ng+wolfssl@i386-linux-musl@i686@fast+lto\n    PKG_HASH:=85e057dd0a0e8913b30471737436ab8b71834c494ed9f9e53544261b1ffdc8d6\n  else\n    PKG_ARCH:=chinadns-ng+wolfssl@i386-linux-musl@pentium4@fast+lto\n    PKG_HASH:=2d0f1a05c82f2e21e71a6618c7f1d2e7f46aa6a21535d774d517e87ec00c989b\n  endif\nelse ifeq ($(ARCH),x86_64)\n  PKG_ARCH:=chinadns-ng+wolfssl@x86_64-linux-musl@x86_64@fast+lto\n  PKG_HASH:=842ea4e9816efd91d39bc76ead5c4a42e79011757e37c521b4270b675cfcb30c\nelse ifeq ($(ARCH),riscv64)\n  PKG_ARCH:=chinadns-ng+wolfssl@riscv64-linux-musl@baseline_rv64@fast+lto\n  PKG_HASH:=7056f47f4d6b20109e007792694dc83e5eac44c9265d7be20f6dc10375b35a9b\nelse\n  PKG_HASH:=dummy\nendif\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(ARCH_PACKAGES)\nPKG_SOURCE_URL:=https://github.com/zfl9/chinadns-ng/releases/download/$(PKG_VERSION)/$(PKG_ARCH)?\nUNPACK_CMD=$(CP) $(DL_DIR)/$(PKG_SOURCE) $(PKG_BUILD_DIR)/$(PKG_NAME)\n\nPKG_LICENSE:=AGPL-3.0-only\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=sbwml <admin@cooluc.com>\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/chinadns-ng\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=IP Addresses and Names\n  TITLE:=ChinaDNS next generation, refactoring with epoll and ipset.\n  URL:=https://github.com/zfl9/chinadns-ng\n  DEPENDS:=@(aarch64||arm||i386||mips||mipsel||mips64||mips64el||x86_64||riscv64)\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/chinadns-ng/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/chinadns-ng $(1)/usr/bin\nendef\n\n$(eval $(call BuildPackage,chinadns-ng))\n"
  },
  {
    "path": "relevance/passwall-packages/dns2socks/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=dns2socks\nPKG_VERSION:=2.1\nPKG_RELEASE:=2\n\nPKG_SOURCE:=SourceCode.zip\nPKG_SOURCE_URL:=https://github.com/Openwrt-Passwall/openwrt-passwall-packages/releases/download/dns2socks\nPKG_SOURCE_DATE:=2020-02-18\nPKG_HASH:=406b5003523577d39da66767adfe54f7af9b701374363729386f32f6a3a995f4\n\nPKG_MAINTAINER:=ghostmaker\nPKG_LICENSE:=BSD-3-Clause\nPKG_LICENSE_FILE:=LICENSE\n\ninclude $(INCLUDE_DIR)/package.mk\n\nUNZIP_CMD:=unzip -q -d $(PKG_BUILD_DIR) $(DL_DIR)/$(PKG_SOURCE)\n\ndefine Package/dns2socks\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=IP Addresses and Names\n  TITLE:=DNS to SOCKS or HTTP proxy\n  URL:=http://dns2socks.sourceforge.net/\n  DEPENDS:=+libpthread\nendef\n\ndefine Package/dns2socks/description\n  This is a command line utility to resolve DNS requests via\n  a SOCKS tunnel like Tor or a HTTP proxy.\nendef\n\ndefine Build/Compile\n\t$(TARGET_CC) \\\n\t$(TARGET_CFLAGS) \\\n\t$(TARGET_CPPFLAGS) \\\n\t$(FPIC) \\\n\t-o $(PKG_BUILD_DIR)/DNS2SOCKS/dns2socks \\\n\t$(PKG_BUILD_DIR)/DNS2SOCKS/DNS2SOCKS.c \\\n\t$(TARGET_LDFLAGS) -pthread\nendef\n\ndefine Package/dns2socks/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/DNS2SOCKS/dns2socks $(1)/usr/bin/dns2socks\nendef\n\n$(eval $(call BuildPackage,dns2socks))\n"
  },
  {
    "path": "relevance/passwall-packages/geoview/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=geoview\nPKG_VERSION:=0.2.6\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/snowie2000/geoview/tar.gz/$(PKG_VERSION)?\nPKG_HASH:=1b46d4255ab22ec433a14f804e9487885cc2693323579c1385d51919838db132\n\nPKG_LICENSE:=Apache-2.0\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=snowie2000\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/snowie2000/geoview\nGO_PKG_BUILD_PKG:=$(GO_PKG)\n\nGO_PKG_LDFLAGS:=-s -w\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/geoview\n  TITLE:=A geofile toolkit\n  URL:=https://github.com/snowie2000/geoview\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=IP Addresses and Names\n  DEPENDS+= $(GO_ARCH_DEPENDS)\nendef\n\ndefine Package/geoview/description\n  geoview is a handy tool to extract useful information from geo* files.\nendef\n\ndefine Package/geoview/install\n\t$(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR))\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/geoview $(1)/usr/bin/\nendef\n\n$(eval $(call GoBinPackage,geoview))\n$(eval $(call BuildPackage,geoview))\n"
  },
  {
    "path": "relevance/passwall-packages/hysteria/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=hysteria\nPKG_VERSION:=2.9.1\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/apernet/hysteria/tar.gz/app/v$(PKG_VERSION)?\nPKG_HASH:=0ac7f4eb6e355621770396aa42c4bdc36ece5e7f3f6c206a1c9053b850cb7a68\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)-app-v$(PKG_VERSION)\n\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILE:=LICENSE\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/apernet/hysteria\nGO_PKG_BUILD_PKG:=$(GO_PKG)/app/v2\nGO_PKG_LDFLAGS_X = \\\n\t$(GO_PKG)/app/v2/cmd.appVersion=v$(PKG_VERSION) \\\n\t$(GO_PKG)/app/v2/cmd.appType=release \\\n\t$(GO_PKG)/app/v2/cmd.appPlatform=$(GO_OS) \\\n\t$(GO_PKG)/app/v2/cmd.appArch=$(GO_ARCH)\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/hysteria\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=A feature-packed network utility optimized for networks of poor quality\n  URL:=https://github.com/apernet/hysteria\n  DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle\nendef\n\ndefine Package/hysteria/description\n  Hysteria is a feature-packed network utility optimized for networks\n  of poor quality (e.g. satellite connections, congested public Wi-Fi,\n  connecting from China to servers abroad) powered by a custom version\n  of QUIC protocol.\nendef\n\ndefine Package/hysteria/install\n\t$(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR))\n\n\t$(INSTALL_DIR) $(1)/usr/bin/\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/app $(1)/usr/bin/hysteria\nendef\n\n$(eval $(call GoBinPackage,hysteria))\n$(eval $(call BuildPackage,hysteria))\n"
  },
  {
    "path": "relevance/passwall-packages/ipt2socks/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=ipt2socks\nPKG_VERSION:=1.1.4\nPKG_RELEASE:=3\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/zfl9/ipt2socks/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=68dc76e63951d655c2fd9b420e175b5a75a50014d6db6e729398b41f2c988356\n\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\nPKG_BUILD_FLAGS:=no-mips16\n\nPKG_LICENSE:=AGPL-3.0\nPKG_LICENSE_FILE:=LICENSE\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/ipt2socks\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=Convert iptables to socks5\n  URL:=https://github.com/zfl9/ipt2socks\n  DEPENDS:=+libpthread\nendef\n\ndefine Package/ipt2socks/description\n  Utility for converting iptables (redirect/tproxy) to socks5.\nendef\n\nTARGET_CFLAGS+= $(FPIC) -flto\nMAKE_FLAGS+= \\\n\tCFLAGS=\"-std=c99 -pthread $(TARGET_CFLAGS)\" \\\n\tEVCFLAGS=\"$(TARGET_CFLAGS)\"\n\ndefine Package/ipt2socks/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/ipt2socks $(1)/usr/bin\nendef\n\n$(eval $(call BuildPackage,ipt2socks))\n"
  },
  {
    "path": "relevance/passwall-packages/microsocks/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=microsocks\nPKG_VERSION:=1.0.5\nPKG_RELEASE:=2\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/rofl0r/microsocks/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=939d1851a18a4c03f3cc5c92ff7a50eaf045da7814764b4cb9e26921db15abc8\n\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILES:=COPYING\nPKG_MAINTAINER:=lean\n\nPKG_BUILD_PARALLEL:=1\nPKG_INSTALL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/microsocks\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=Web Servers/Proxies\n  TITLE:=Tiny, portable SOCKS5 server. Support forwarding rules\n  URL:=https://github.com/rofl0r/microsocks\n  DEPENDS:=+libpthread\nendef\n\ndefine Package/microsocks/description\n  A SOCKS5 service that you can run on your remote boxes to tunnel connections\n  through them, if for some reason SSH doesn't cut it for you.\n  This version supports forwarding rules.\nendef\n\ndefine Package/microsocks/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/local/bin/microsocks $(1)/usr/bin/microsocks\nendef\n\n$(eval $(call BuildPackage,microsocks))\n"
  },
  {
    "path": "relevance/passwall-packages/microsocks/patches/100-Add-SOCKS5-forwarding-rules-support.patch",
    "content": "--- a/sockssrv.c\n+++ b/sockssrv.c\n@@ -33,8 +33,10 @@\n #include <arpa/inet.h>\n #include <errno.h>\n #include <limits.h>\n+#include <sys/time.h>\n #include \"server.h\"\n #include \"sblist.h\"\n+#define MICROSOCKS_VERSION \"1.0.5-forward\"\n \n /* timeout in microseconds on resource exhaustion to prevent excessive\n    cpu usage. */\n@@ -71,6 +73,7 @@\n static pthread_rwlock_t auth_ips_lock = PTHREAD_RWLOCK_INITIALIZER;\n static const struct server* server;\n static union sockaddr_union bind_addr = {.v4.sin_family = AF_UNSPEC};\n+static sblist *fwd_rules;\n \n enum socksstate {\n \tSS_1_CONNECTED,\n@@ -97,6 +100,17 @@\n \tEC_ADDRESSTYPE_NOT_SUPPORTED = 8,\n };\n \n+struct fwd_rule {\n+\tchar *match_name;\n+\tshort match_port;\n+\tchar *auth_buf; /* Username/Password request buffer (RFC-1929) */\n+\tsize_t auth_len;\n+\tchar *upstream_name;\n+\tshort upstream_port;\n+\tchar *req_buf; /* Client Connection Request buffer to send to upstream */\n+\tsize_t req_len;\n+};\n+\n struct thread {\n \tpthread_t pt;\n \tstruct client client;\n@@ -116,6 +130,109 @@\n static void dolog(const char* fmt, ...) { }\n #endif\n \n+static int upstream_handshake(const struct fwd_rule* rule, unsigned char *client_buf, size_t client_buf_len, \n+\t\t\t\t\t\t\tint client_fd, int upstream_fd, unsigned short client_port) {\n+\tunsigned char sbuf[512];\n+\tssize_t r;\n+\n+\tif(rule->auth_buf) {\n+\t\tunsigned char handshake[4] = {5, 2, 0, 2};\n+\t\tif (write(upstream_fd, handshake, 4) != 4) {\n+\t\t\tclose(upstream_fd);\n+\t\t\treturn -1;\n+\t\t}\n+\t} else {\n+\t\tunsigned char handshake[3] = {5, 1, 0};\n+\t\tif (write(upstream_fd, handshake, 3) != 3) {\n+\t\t\tclose(upstream_fd);\n+\t\t\treturn -1;\n+\t\t}\n+\t}\n+\n+\tif (read(upstream_fd, sbuf, 2) != 2 || sbuf[0] != 5) {\n+\t\tclose(upstream_fd);\n+\t\treturn -1;\n+\t}\n+\n+\tif (sbuf[1] == 2) {\n+\t\tif (!rule->auth_buf) {\n+\t\t\tclose(upstream_fd);\n+\t\t\treturn -1;\n+\t\t}\n+\t\tif (write(upstream_fd, rule->auth_buf, rule->auth_len) != (ssize_t)rule->auth_len) {\n+\t\t\tclose(upstream_fd);\n+\t\t\treturn -1;\n+\t\t}\n+\t\tif (read(upstream_fd, sbuf, 2) != 2 || sbuf[0] != 1 || sbuf[1] != 0) {\n+\t\t\tclose(upstream_fd);\n+\t\t\treturn -1;\n+\t\t}\n+\t} else if (sbuf[1] != 0) {\n+\t\tclose(upstream_fd);\n+\t\treturn -1;\n+\t}\n+\n+\tif (write(upstream_fd, client_buf, client_buf_len) != (ssize_t)client_buf_len) {\n+\t\tclose(upstream_fd);\n+\t\treturn -1;\n+\t}\n+\n+\tsize_t total = 0;\n+\tsize_t need = 4;\n+\n+\twhile (total < need) {\n+\t\tr = read(upstream_fd, sbuf + total, need - total);\n+\t\tif (r <= 0) {\n+\t\t\tclose(upstream_fd);\n+\t\t\treturn -1;\n+\t\t}\n+\t\ttotal += r;\n+\t}\n+\n+\tif (sbuf[1] != 0) {\n+\t\tclose(upstream_fd);\n+\t\treturn -sbuf[1];\n+\t}\n+\n+\tsize_t need_more = 0;\n+\tswitch (sbuf[3]) {\n+\t\tcase 1:\n+\t\t\tneed_more = 4 + 2;\n+\t\t\tbreak;\n+\t\tcase 4:\n+\t\t\tneed_more = 16 + 2;\n+\t\t\tbreak;\n+\t\tcase 3:\n+\t\t\tr = read(upstream_fd, sbuf + total, 1);\n+\t\t\tif (r != 1) {\n+\t\t\t\tclose(upstream_fd);\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t\ttotal += r;\n+\t\t\tneed_more = sbuf[4] + 2;\n+\t\t\tbreak;\n+\t\tdefault:\n+\t\t\tclose(upstream_fd);\n+\t\t\treturn -EC_ADDRESSTYPE_NOT_SUPPORTED;\n+\t}\n+\n+\twhile (total < need + need_more) {\n+\t\tr = read(upstream_fd, sbuf + total, (need + need_more) - total);\n+\t\tif (r <= 0) {\n+\t\t\tclose(upstream_fd);\n+\t\t\treturn -1;\n+\t\t}\n+\t\ttotal += r;\n+\t}\n+\n+\tif (write(client_fd, sbuf, total) != (ssize_t)total) {\n+\t\tclose(upstream_fd);\n+\t\treturn -1;\n+\t}\n+\n+\treturn upstream_fd;\n+}\n+\n static struct addrinfo* addr_choose(struct addrinfo* list, union sockaddr_union* bindaddr) {\n \tint af = SOCKADDR_UNION_AF(bindaddr);\n \tif(af == AF_UNSPEC) return list;\n@@ -125,7 +242,9 @@\n \treturn list;\n }\n \n-static int connect_socks_target(unsigned char *buf, size_t n, struct client *client) {\n+static int connect_socks_target(unsigned char *buf, size_t n, struct client *client, int *used_rule) {\n+\t*used_rule = 0;\n+\n \tif(n < 5) return -EC_GENERAL_FAILURE;\n \tif(buf[0] != 5) return -EC_GENERAL_FAILURE;\n \tif(buf[1] != 1) return -EC_COMMAND_NOT_SUPPORTED; /* we support only CONNECT method */\n@@ -158,6 +277,29 @@\n \t}\n \tunsigned short port;\n \tport = (buf[minlen-2] << 8) | buf[minlen-1];\n+\n+\tsize_t i;\n+\tstruct fwd_rule *rule = NULL;\n+\tchar original_name[256];\n+\tunsigned short original_port = port;\n+\tstrncpy(original_name, namebuf, sizeof(original_name) - 1);\n+\toriginal_name[sizeof(original_name) - 1] = '\\0';\n+\tif(fwd_rules) {\n+\t\tfor(i=0;i<sblist_getsize(fwd_rules);++i) {\n+\t\t\tstruct fwd_rule* r = (struct fwd_rule*)sblist_get(fwd_rules, i);\n+\t\t\tint name_match = (r->match_name[0]=='\\0' || strcmp(r->match_name, namebuf) == 0);\n+\t\t\tint port_match = (r->match_port == 0 || r->match_port == port);\n+\t\t\tif(name_match && port_match) {\n+\t\t\t\trule = r;\n+\t\t\t\t*used_rule = 1;\n+\t\t\t\tstrncpy(namebuf, r->upstream_name, sizeof(namebuf)-1);\n+\t\t\t\tnamebuf[sizeof(namebuf)-1] = '\\0';\n+\t\t\t\tport = r->upstream_port;\n+\t\t\t\tbreak;\n+\t\t\t}\n+\t\t}\n+\t}\n+\n \t/* there's no suitable errorcode in rfc1928 for dns lookup failure */\n \tif(resolve(namebuf, port, &remote)) return -EC_GENERAL_FAILURE;\n \tstruct addrinfo* raddr = addr_choose(remote, &bind_addr);\n@@ -186,6 +328,11 @@\n \t\t\treturn -EC_GENERAL_FAILURE;\n \t\t}\n \t}\n+\n+\tstruct timeval tv = {5, 0};\n+\tsetsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, (const char*)&tv, sizeof(tv));\n+\tsetsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, (const char*)&tv, sizeof(tv));\n+\n \tif(SOCKADDR_UNION_AF(&bind_addr) == raddr->ai_family &&\n \t   bindtoip(fd, &bind_addr) == -1)\n \t\tgoto eval_errno;\n@@ -198,9 +345,22 @@\n \t\taf = SOCKADDR_UNION_AF(&client->addr);\n \t\tvoid *ipdata = SOCKADDR_UNION_ADDRESS(&client->addr);\n \t\tinet_ntop(af, ipdata, clientname, sizeof clientname);\n-\t\tdolog(\"client[%d] %s: connected to %s:%d\\n\", client->fd, clientname, namebuf, port);\n+\t\tif (rule) {\n+\t\t\tdolog(\"client[%d] %s: %s:%d -> via %s:%d\\n\", client->fd, clientname, original_name, original_port, rule->upstream_name, rule->upstream_port);\n+\t\t} else {\n+\t\t\tdolog(\"client[%d] %s: connected to %s:%d\\n\", client->fd, clientname, namebuf, port);\n+\t\t}\n \t}\n-\treturn fd;\n+\n+\tif (rule) {\n+\t\tint result = upstream_handshake(rule, buf, n, client->fd, fd, original_port);\n+\t\tif (result < 0) {\n+\t\t\tclose(fd);\n+\t\t\treturn result;\n+\t\t}\n+\t\treturn result;\n+\t}\n+    return fd;\n }\n \n static int is_authed(union sockaddr_union *client, union sockaddr_union *authedip) {\n@@ -322,6 +482,7 @@\n \tssize_t n;\n \tint ret;\n \tenum authmethod am;\n+\tint used_rule = 0;\n \tt->state = SS_1_CONNECTED;\n \twhile((n = recv(t->client.fd, buf, sizeof buf, 0)) > 0) {\n \t\tswitch(t->state) {\n@@ -345,12 +506,14 @@\n \t\t\t\t}\n \t\t\t\tbreak;\n \t\t\tcase SS_3_AUTHED:\n-\t\t\t\tret = connect_socks_target(buf, n, &t->client);\n+\t\t\t\tret = connect_socks_target(buf, n, &t->client, &used_rule);\n \t\t\t\tif(ret < 0) {\n \t\t\t\t\tsend_error(t->client.fd, ret*-1);\n \t\t\t\t\treturn -1;\n \t\t\t\t}\n-\t\t\t\tsend_error(t->client.fd, EC_SUCCESS);\n+\t\t\t\tif (!used_rule) {\n+\t\t\t\t\tsend_error(t->client.fd, EC_SUCCESS);\n+\t\t\t\t}\n \t\t\t\treturn ret;\n \t\t}\n \t}\n@@ -382,11 +545,131 @@\n \t}\n }\n \n+static short host_get_port(char *name) {\n+\tint p,n;\n+\tchar *c;\n+\tif((c = strrchr(name, ':')) && sscanf(c+1,\"%d%n\",&p, &n)==1 && n == (int)(strlen(c + 1)) && p >= 0 && p < USHRT_MAX)\n+\t\treturn (*c='\\0'),(short)p;\n+\telse\n+\t\treturn -1;\n+}\n+\n+static int fwd_rules_add(char *str) {\n+\tchar *match = NULL, *upstream = NULL, *remote = NULL;\n+\tunsigned short match_port, upstream_port, remote_port;\n+\tint ncred;\n+\n+\tif(sscanf(str, \"%m[^,],%n%m[^,],%ms\\n\", &match, &ncred, &upstream, &remote) != 3)\n+\t\treturn 1;\n+\n+\tmatch_port = host_get_port(match);\n+\tupstream_port = host_get_port(upstream);\n+\tremote_port = host_get_port(remote);\n+\n+\tif(match_port < 0 || upstream_port <= 0 || remote_port < 0) {\n+\t\tfree(match);\n+\t\tfree(upstream);\n+\t\tfree(remote);\n+\t\treturn 1;\n+\t}\n+\n+\tchar *match_copy = strdup(match);\n+\tchar *upstream_copy = strdup(upstream);\n+\tchar *remote_copy = strdup(remote);\n+\n+\tstruct fwd_rule *rule = (struct fwd_rule*)malloc(sizeof(struct fwd_rule));\n+\tif (!rule) {\n+\t\tfree(match_copy);\n+\t\tfree(upstream_copy);\n+\t\tfree(remote_copy);\n+\t\tfree(match);\n+\t\tfree(upstream);\n+\t\tfree(remote);\n+\t\treturn 1;\n+\t}\n+\n+\tif(strcmp(match_copy, \"0.0.0.0\") == 0 || strcmp(match_copy, \"*\") == 0) {\n+\t\tfree(match_copy);\n+\t\trule->match_name = strdup(\"\");\n+\t} else {\n+\t\trule->match_name = match_copy;\n+\t}\n+\trule->match_port = match_port;\n+\trule->auth_buf = NULL;\n+\trule->auth_len = 0;\n+\n+\tchar *at_sign = strchr(upstream_copy, '@');\n+\tif (at_sign) {\n+\t\t*at_sign = '\\0';\n+\t\tchar *auth_part = upstream_copy;\n+\t\tchar *host_part = at_sign + 1;\n+\t\tchar *colon = strchr(auth_part, ':');\n+\t\tif (!colon) {\n+\t\t\tfree(rule);\n+\t\t\tfree(upstream_copy);\n+\t\t\tfree(remote_copy);\n+\t\t\tfree(match);\n+\t\t\tfree(upstream);\n+\t\t\tfree(remote);\n+\t\t\treturn 1;\n+\t\t}\n+\t\t*colon++ = '\\0';\n+\t\tchar *username = auth_part;\n+\t\tchar *password = colon;\n+\t\tsize_t ulen = strlen(username);\n+\t\tsize_t plen = strlen(password);\n+\t\tif (ulen > 255 || plen > 255) {\n+\t\t\tfree(rule);\n+\t\t\tfree(upstream_copy);\n+\t\t\tfree(remote_copy);\n+\t\t\tfree(match);\n+\t\t\tfree(upstream);\n+\t\t\tfree(remote);\n+\t\t\treturn 1;\n+\t\t}\n+\t\trule->auth_len = 1 + 1 + ulen + 1 + plen;\n+\t\trule->auth_buf = malloc(rule->auth_len);\n+\t\trule->auth_buf[0] = 1;\n+\t\trule->auth_buf[1] = ulen;\n+\t\tmemcpy(&rule->auth_buf[2], username, ulen);\n+\t\trule->auth_buf[2 + ulen] = plen;\n+\t\tmemcpy(&rule->auth_buf[3 + ulen], password, plen);\n+\t\trule->upstream_name = strdup(host_part);\n+\t\trule->upstream_port = upstream_port;\n+\t\t/* hide from ps */\n+\t\tmemset(str+ncred, '*', ulen+1+plen);\n+\t} else {\n+\t\trule->upstream_name = strdup(upstream_copy);\n+\t\trule->upstream_port = upstream_port;\n+\t}\n+\n+\tfree(upstream_copy);\n+\tshort rlen = strlen(remote_copy);\n+\trule->req_len = 3 + 1 + 1 + rlen + 2;\n+\trule->req_buf = (char*)malloc(rule->req_len);\n+\trule->req_buf[0] = 5;\n+\trule->req_buf[1] = 1;\n+\trule->req_buf[2] = 0;\n+\trule->req_buf[3] = 3;\n+\trule->req_buf[4] = rlen;\n+\tmemcpy(&rule->req_buf[5], remote_copy, rlen);\n+\tunsigned short rport = remote_port ? remote_port : 0;\n+\trule->req_buf[5 + rlen]     = (rport >> 8) & 0xFF;\n+\trule->req_buf[5 + rlen + 1] = (rport & 0xFF);\n+\tfree(remote_copy);\n+\tsblist_add(fwd_rules, rule);\n+\tfree(match);\n+\tfree(upstream);\n+\tfree(remote);\n+\n+\treturn 0;\n+}\n+\n static int usage(void) {\n \tdprintf(2,\n \t\t\"MicroSocks SOCKS5 Server\\n\"\n \t\t\"------------------------\\n\"\n-\t\t\"usage: microsocks -1 -q -i listenip -p port -u user -P pass -b bindaddr -w ips\\n\"\n+\t\t\"usage: microsocks -1 -q -i listenip -p port -u user -P pass -b bindaddr -w ips -f fwdrule\\n\"\n \t\t\"all arguments are optional.\\n\"\n \t\t\"by default listenip is 0.0.0.0 and port 1080.\\n\\n\"\n \t\t\"option -q disables logging.\\n\"\n@@ -401,6 +684,12 @@\n \t\t\" this is handy for programs like firefox that don't support\\n\"\n \t\t\" user/pass auth. for it to work you'd basically make one connection\\n\"\n \t\t\" with another program that supports it, and then you can use firefox too.\\n\"\n+\t\t\"option -f specifies a forwarding rule of the form\\n\"\n+\t\t\"  match_name:match_port,[user:password@]upstream_name:upstream_port,remote_name:remote_port\\n\"\n+\t\t\" this will cause requests that /match/ to be renamed to /remote/\\n\"\n+\t\t\" and sent to the /upstream/ SOCKS5 proxy server.\\n\"\n+\t\t\" this option may be specified multiple times.\\n\"\n+\t\t\"option -V prints version information and exits.\\n\"\n \t);\n \treturn 1;\n }\n@@ -416,7 +705,7 @@\n \tconst char *listenip = \"0.0.0.0\";\n \tchar *p, *q;\n \tunsigned port = 1080;\n-\twhile((ch = getopt(argc, argv, \":1qb:i:p:u:P:w:\")) != -1) {\n+\twhile((ch = getopt(argc, argv, \":1qb:i:p:u:P:w:f:V\")) != -1) {\n \t\tswitch(ch) {\n \t\t\tcase 'w': /* fall-through */\n \t\t\tcase '1':\n@@ -456,11 +745,20 @@\n \t\t\tcase 'p':\n \t\t\t\tport = atoi(optarg);\n \t\t\t\tbreak;\n+\t\t\tcase 'f':\n+\t\t\t\tif(!fwd_rules)\n+\t\t\t\t\tfwd_rules = sblist_new(sizeof(struct fwd_rule), 16);\n+\t\t\t\tif(fwd_rules_add(optarg))\n+\t\t\t\t\treturn dprintf(2, \"error: could not parse forwarding rule %s\\n\", optarg), 1;\n+\t\t\t\tbreak;\n \t\t\tcase ':':\n \t\t\t\tdprintf(2, \"error: option -%c requires an operand\\n\", optopt);\n \t\t\t\t/* fall through */\n \t\t\tcase '?':\n \t\t\t\treturn usage();\n+\t\t\tcase 'V':\n+\t\t\t\tdprintf(1, \"MicroSocks %s\\n\", MICROSOCKS_VERSION);\n+\t\t\t\treturn 0;\n \t\t}\n \t}\n \tif((auth_user && !auth_pass) || (!auth_user && auth_pass)) {\n"
  },
  {
    "path": "relevance/passwall-packages/naiveproxy/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=naiveproxy\nPKG_VERSION:=148.0.7778.96\nPKG_RELEASE:=5\n\nARCH_PREBUILT:=$(ARCH_PACKAGES)\n\n# intel 80386 & riscv64 & cortex-a76\nifeq ($(ARCH_PREBUILT),aarch64_cortex-a76)\n  ARCH_PREBUILT:=aarch64_generic\nelse ifeq ($(ARCH_PREBUILT),i386_pentium-mmx)\n  ARCH_PREBUILT:=x86\nelse ifeq ($(ARCH_PREBUILT),i386_pentium4)\n  ARCH_PREBUILT:=x86\nelse ifeq ($(ARCH_PREBUILT),mipsel_24kc_24kf)\n  ARCH_PREBUILT:=mipsel_24kc\nelse ifeq ($(ARCH_PREBUILT),mipsel_74kc)\n  ARCH_PREBUILT:=mipsel_24kc\nelse ifeq ($(ARCH_PREBUILT),riscv64_riscv64)\n  ARCH_PREBUILT:=riscv64\nendif\n\nPKG_SOURCE:=naiveproxy-v$(PKG_VERSION)-$(PKG_RELEASE)-openwrt-$(ARCH_PREBUILT).tar.xz\nPKG_SOURCE_URL:=https://github.com/klzgrad/naiveproxy/releases/download/v$(PKG_VERSION)-$(PKG_RELEASE)/\n\nifeq ($(ARCH_PREBUILT),aarch64_cortex-a53)\n  PKG_HASH:=2cc643c0818a5b84a873ceb20132050b98dd9e6d7184bb4df47c054cc14e8b56\nelse ifeq ($(ARCH_PREBUILT),aarch64_cortex-a72)\n  PKG_HASH:=f402da04a623aa67cde64ab86948bf5f91e0968ce12c007c575ebff94b9780e6\nelse ifeq ($(ARCH_PREBUILT),aarch64_generic)\n  PKG_HASH:=088249b5bd8018396eda31ce4712e2304a6576528f996e597ed908bb44e5a69d\nelse ifeq ($(ARCH_PREBUILT),arm_arm1176jzf-s_vfp)\n  PKG_HASH:=c38b1b218420a817d340f99a7c719415cdff2c6f6dc1ab0d28b7245c20db7336\nelse ifeq ($(ARCH_PREBUILT),arm_arm926ej-s)\n  PKG_HASH:=1bfb00c5c2aaa34e2802e172a13d06fd8edfa5dc3c3a9a92f898d02b43e01509\nelse ifeq ($(ARCH_PREBUILT),arm_cortex-a15_neon-vfpv4)\n  PKG_HASH:=0aecbb0745f22535f649d28f6b1a7f0f15695af53efda3cf4d33a636858bb64b\nelse ifeq ($(ARCH_PREBUILT),arm_cortex-a5_vfpv4)\n  PKG_HASH:=fae5b1218eaeeb39b59b16a933092e91b01225bbea472e88ff02773d332d79fc\nelse ifeq ($(ARCH_PREBUILT),arm_cortex-a7)\n  PKG_HASH:=6ac9e3222de2cc079e3c6cd465d8922031e4970ff05c50d3726e8e08a2c80d75\nelse ifeq ($(ARCH_PREBUILT),arm_cortex-a7_neon-vfpv4)\n  PKG_HASH:=ed7b3f9e4cf38eaa9e3451c36203c472a9adfefb134da5acd2b47caf7e8b4885\nelse ifeq ($(ARCH_PREBUILT),arm_cortex-a7_vfpv4)\n  PKG_HASH:=10242073e2aa04b8f09deb7907183ec9933a8f5cc052206c8580a56ab5b68a0d\nelse ifeq ($(ARCH_PREBUILT),arm_cortex-a8_vfpv3)\n  PKG_HASH:=c090e56714dc71c49248c7ec54a95a295daf4f56b66ad889c51ff0eae2ceaadd\nelse ifeq ($(ARCH_PREBUILT),arm_cortex-a9)\n  PKG_HASH:=2aafcb1169336924ce22eef37fef72a2e3b0504c83effc5c18a030e2e79245f8\nelse ifeq ($(ARCH_PREBUILT),arm_cortex-a9_neon)\n  PKG_HASH:=4f119877f9b9326b8648b3015f129ed27f0eab3c1bf14ad59f4bd34b41c1a7ab\nelse ifeq ($(ARCH_PREBUILT),arm_cortex-a9_vfpv3-d16)\n  PKG_HASH:=d47b762719889870d0ecb1b700fd444b840757c34845bd9008031bcbe564dada\nelse ifeq ($(ARCH_PREBUILT),arm_mpcore)\n  PKG_HASH:=04d609af80585520ecb96a512f203c375f2483b41256c5c220c6d687297619d1\nelse ifeq ($(ARCH_PREBUILT),arm_xscale)\n  PKG_HASH:=b98fcc755b4e542965707cae3fd87fb01e5fded09c3279f54825d917f9f0c9e2\nelse ifeq ($(ARCH_PREBUILT),mipsel_24kc)\n  PKG_HASH:=c7c3f3482818fea9d72598d17a03b065b9bd8bccfbe7c8226860a8ab68b12e22\nelse ifeq ($(ARCH_PREBUILT),mipsel_mips32)\n  PKG_HASH:=733ef1bfb67b12111ff05df38c4ee0b14228589f48be5f1f967efe04cffd7ce2\nelse ifeq ($(ARCH_PREBUILT),riscv64)\n  PKG_HASH:=3b9cea024b0d8c79927c463741845f1623be9544dd3b7767fc9d55b0d7c564f4\nelse ifeq ($(ARCH_PREBUILT),x86)\n  PKG_HASH:=06e4c5595b2de9f3f0f6a347add46f72e213a6686be1abc3bc8efca876c4a07d\nelse ifeq ($(ARCH_PREBUILT),x86_64)\n  PKG_HASH:=5fce9437c84c2cec6322753c424c5f2f5621cc91d6aa3743650e6d7b54407a44\nelse\n  PKG_HASH:=dummy\nendif\n\nPKG_LICENSE:=BSD 3-Clause\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=sbwml <admin@cooluc.com>\n\nPKG_BUILD_DIR:=$(BUILD_DIR)/naiveproxy-v$(PKG_VERSION)-$(PKG_RELEASE)-openwrt-$(ARCH_PACKAGES)\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/naiveproxy\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=Web Servers/Proxies\n  TITLE:=Make a fortune quietly\n  URL:=https://github.com/klzgrad/naiveproxy\n  DEPENDS:=@(aarch64||arm||i386||mipsel||riscv64||x86_64) +libatomic\nendef\n\ndefine Package/naiveproxy/description\n  NaïveProxy uses Chrome's network stack to camouflage traffic with strong\n  censorship resistance and low detectability. Reusing Chrome's stack also\n  ensures best practices in performance and security.\nendef\n\ndefine Package/naiveproxy/conffiles\n/etc/config/naiveproxy\nendef\n\ndefine Build/Prepare\n\t$(TAR) --strip-components=1 -C $(PKG_BUILD_DIR) -xJf $(DL_DIR)/naiveproxy-v$(PKG_VERSION)-$(PKG_RELEASE)-openwrt-$(ARCH_PREBUILT).tar.xz\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/naiveproxy/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/naive $(1)/usr/bin/naive\n\t$(INSTALL_DIR) $(1)/etc/config $(1)/etc/init.d\n\t$(INSTALL_CONF) $(CURDIR)/files/naiveproxy.config $(1)/etc/config/naiveproxy\n\t$(INSTALL_BIN) $(CURDIR)/files/naiveproxy.init $(1)/etc/init.d/naiveproxy\nendef\n\n$(eval $(call BuildPackage,naiveproxy))\n"
  },
  {
    "path": "relevance/passwall-packages/naiveproxy/files/naiveproxy.config",
    "content": "\nconfig naiveproxy 'config'\n\toption enable '0'\n\toption listen_addr ''\n\toption server_addr ''\n\toption extra_argument ''\n"
  },
  {
    "path": "relevance/passwall-packages/naiveproxy/files/naiveproxy.init",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2021 ImmortalWrt\n\nUSE_PROCD=1\nSTART=99\n\nNAME=\"naiveproxy\"\n\nstart_service() {\n\tconfig_load \"$NAME\"\n\tconfig_get_bool \"enable\" \"config\" \"enable\" \"0\"\n\t[ \"$enable\" -eq \"1\" ] || return 1\n\n\tconfig_get \"listen_addr\" \"config\" \"listen_addr\"\n\tconfig_get \"server_addr\" \"config\" \"server_addr\"\n\tconfig_get \"extra_argument\" \"config\" \"extra_argument\"\n\n\tprocd_open_instance naiveproxy\n\n\tprocd_set_param command naive\n\tprocd_append_param command --listen=\"$listen_addr\"\n\tprocd_append_param command --proxy=\"$server_addr\"\n\t[ -n \"$extra_argument\" ] && procd_append_param command $extra_argument\n\n\tprocd_set_param respawn\n\tprocd_set_param limits core=\"unlimited\"\n\tprocd_set_param stdout 1\n\tprocd_set_param stderr 1\n\n\tprocd_close_instance\n}\n\nservice_triggers() {\n        procd_add_reload_trigger \"$NAME\"\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadow-tls/Makefile",
    "content": "# SPDX-License-Identifier: GPL-2.0-only\n#\n# Copyright (C) 2025 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=shadow-tls\nPKG_VERSION:=0.2.25\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/ihciah/shadow-tls/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=1d1d436734823ba0302de6e91883ed892ea710769c722a139990194ff5837224\n\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILES:=LICENSE\n\nPKG_BUILD_DEPENDS:=rust/host\nPKG_BUILD_PARALLEL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/rust/rust-package.mk\n\ndefine Package/shadow-tls\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=Web Servers/Proxies\n  TITLE:=A proxy to expose real tls handshake to the firewall\n  URL:=https://github.com/ihciah/shadow-tls\n  DEPENDS:=@(aarch64||arm||x86_64)\nendef\n\ndefine Package/shadow-tls/description\n  A proxy to expose real tls handshake to the firewall.\n\n  It works like trojan but it does not require signing certificate.\n  The firewall will see real tls handshake with valid certificate\n  that you choose.\nendef\n\n$(eval $(call RustBinPackage,shadow-tls))\n$(eval $(call BuildPackage,shadow-tls))\n"
  },
  {
    "path": "relevance/passwall-packages/shadow-tls/patches/010-Fix-reading-WildcardSNI-from-sip003_arg-115.patch",
    "content": "From 045014130570dd23d5a9cce124b78b2bb1ddaf5f Mon Sep 17 00:00:00 2001\nFrom: =?UTF-8?q?=E1=A1=A0=E1=A0=B5=E1=A1=A0=E1=A1=B3=20=E1=A1=A0=E1=A0=B5?=\n =?UTF-8?q?=E1=A1=A0=20=E1=A0=AE=E1=A0=A0=E1=A0=A8=E1=A1=A9=E1=A0=8B?=\n =?UTF-8?q?=E1=A0=A0=E1=A0=A8?=\n <125150101+UjuiUjuMandan@users.noreply.github.com>\nDate: Thu, 24 Apr 2025 22:39:07 +0000\nSubject: [PATCH] Fix reading WildcardSNI from sip003_arg (#115)\n\n---\n src/main.rs | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\n--- a/src/main.rs\n+++ b/src/main.rs\n@@ -269,7 +269,7 @@ pub(crate) fn get_sip003_arg() -> Option\n         let tls_addrs = parse_server_addrs(tls_addr)\n             .expect(\"tls param parse failed(like tls=xxx.com:443 or tls=yyy.com:1.2.3.4:443;zzz.com:443;xxx.com)\");\n         let wildcard_sni =\n-            WildcardSNI::from_str(opts.get(\"tls\").map(AsRef::as_ref).unwrap_or_default(), true)\n+            WildcardSNI::from_str(opts.get(\"wildcard-sni\").map(AsRef::as_ref).unwrap_or(\"off\"), true)\n                 .expect(\"wildcard_sni format error\");\n         Args {\n             cmd: crate::Commands::Server {\n"
  },
  {
    "path": "relevance/passwall-packages/shadow-tls/patches/011-fix-use-tls1-2-only-website-for-tls12-test-suites-129.patch",
    "content": "From 02dd0bc7bae8a2011729f95021690e694fd8e43e Mon Sep 17 00:00:00 2001\nFrom: V <vendettareborn@proton.me>\nDate: Fri, 25 Apr 2025 18:27:13 +0200\nSubject: [PATCH] fix: use tls1.2 only website for tls12 test suites (#129)\n\n* fix: use tls1.2 only website for tls12 test suites\n---\n src/helper_v2.rs |  2 ++\n src/main.rs      | 12 +++++++-----\n src/sip003.rs    |  6 +++---\n src/util.rs      |  2 +-\n tests/tls12.rs   | 32 ++++++++++++++++----------------\n 5 files changed, 29 insertions(+), 25 deletions(-)\n\n--- a/src/helper_v2.rs\n+++ b/src/helper_v2.rs\n@@ -26,6 +26,7 @@ use crate::util::prelude::*;\n \n pub(crate) const HMAC_SIZE_V2: usize = 8;\n \n+#[allow(unused)]\n pub(crate) trait HashedStream {\n     fn hash_stream(&self) -> [u8; 20];\n }\n@@ -98,6 +99,7 @@ impl<S> HashedWriteStream<S> {\n         })\n     }\n \n+    #[allow(unused)]\n     pub(crate) fn hash(&self) -> [u8; 20] {\n         self.hmac\n             .borrow()\n--- a/src/main.rs\n+++ b/src/main.rs\n@@ -252,7 +252,7 @@ pub(crate) fn get_sip003_arg() -> Option\n     let opts: HashMap<_, _> = opts.into_iter().collect();\n \n     let threads = opts.get(\"threads\").map(|s| s.parse::<u8>().unwrap());\n-    let v3 = opts.get(\"v3\").is_some();\n+    let v3 = opts.contains_key(\"v3\");\n     let passwd = opts\n         .get(\"passwd\")\n         .expect(\"need passwd param(like passwd=123456)\");\n@@ -262,15 +262,17 @@ pub(crate) fn get_sip003_arg() -> Option\n         v3,\n         ..Default::default()\n     };\n-    let args = if opts.get(\"server\").is_some() {\n+    let args = if opts.contains_key(\"server\") {\n         let tls_addr = opts\n             .get(\"tls\")\n             .expect(\"tls param must be specified(like tls=xxx.com:443)\");\n         let tls_addrs = parse_server_addrs(tls_addr)\n             .expect(\"tls param parse failed(like tls=xxx.com:443 or tls=yyy.com:1.2.3.4:443;zzz.com:443;xxx.com)\");\n-        let wildcard_sni =\n-            WildcardSNI::from_str(opts.get(\"wildcard-sni\").map(AsRef::as_ref).unwrap_or(\"off\"), true)\n-                .expect(\"wildcard_sni format error\");\n+        let wildcard_sni = WildcardSNI::from_str(\n+            opts.get(\"wildcard-sni\").map(AsRef::as_ref).unwrap_or(\"off\"),\n+            true,\n+        )\n+        .expect(\"wildcard_sni format error\");\n         Args {\n             cmd: crate::Commands::Server {\n                 listen: format!(\"{ss_remote_host}:{ss_remote_port}\"),\n--- a/src/sip003.rs\n+++ b/src/sip003.rs\n@@ -6,7 +6,7 @@ pub fn parse_sip003_options(s: &str) ->\n     let mut i = 0;\n     while i < s.len() {\n         // read key\n-        let (offset, key) = index_unescaped(&s[i..], &[b'=', b';']).context(\"read key\")?;\n+        let (offset, key) = index_unescaped(&s[i..], b\"=;\").context(\"read key\")?;\n         if key.is_empty() {\n             bail!(\"empty key in {}\", &s[i..]);\n         }\n@@ -21,7 +21,7 @@ pub fn parse_sip003_options(s: &str) ->\n         // skip equals\n         i += 1;\n         // read value\n-        let (offset, value) = index_unescaped(&s[i..], &[b'=', b';']).context(\"read value\")?;\n+        let (offset, value) = index_unescaped(&s[i..], b\"=;\").context(\"read value\")?;\n         i += offset;\n         opts.push((key, value));\n         // Skip the semicolon.\n@@ -36,7 +36,7 @@ fn index_unescaped(s: &str, term: &[u8])\n \n     while i < s.len() {\n         let mut b: u8 = s.as_bytes()[i];\n-        if term.iter().any(|&e| b == e) {\n+        if term.contains(&b) {\n             break;\n         }\n         if b == b'\\\\' {\n--- a/src/util.rs\n+++ b/src/util.rs\n@@ -599,7 +599,7 @@ pub(crate) async fn resolve(addr: &str)\n     addr_iter.next().ok_or_else(|| {\n         std::io::Error::new(\n             std::io::ErrorKind::InvalidInput,\n-            format!(\"unable to resolve addr: {}\", addr),\n+            format!(\"unable to resolve addr: {addr}\"),\n         )\n     })\n }\n--- a/tests/tls12.rs\n+++ b/tests/tls12.rs\n@@ -4,7 +4,7 @@ use shadow_tls::{RunningArgs, TlsAddrs,\n mod utils;\n use utils::*;\n \n-// handshake: bing.com(tls1.2 only)\n+// handshake: badssl.com(tls1.2 only)\n // data: captive.apple.com:80\n // protocol: v2\n #[test]\n@@ -12,7 +12,7 @@ fn tls12_v2() {\n     let client = RunningArgs::Client {\n         listen_addr: \"127.0.0.1:30000\".to_string(),\n         target_addr: \"127.0.0.1:30001\".to_string(),\n-        tls_names: TlsNames::try_from(\"bing.com\").unwrap(),\n+        tls_names: TlsNames::try_from(\"badssl.com\").unwrap(),\n         tls_ext: TlsExtConfig::new(None),\n         password: \"test\".to_string(),\n         nodelay: true,\n@@ -22,7 +22,7 @@ fn tls12_v2() {\n     let server = RunningArgs::Server {\n         listen_addr: \"127.0.0.1:30001\".to_string(),\n         target_addr: \"captive.apple.com:80\".to_string(),\n-        tls_addr: TlsAddrs::try_from(\"bing.com\").unwrap(),\n+        tls_addr: TlsAddrs::try_from(\"badssl.com\").unwrap(),\n         password: \"test\".to_string(),\n         nodelay: true,\n         fastopen: true,\n@@ -31,7 +31,7 @@ fn tls12_v2() {\n     test_ok(client, server, CAPTIVE_HTTP_REQUEST, CAPTIVE_HTTP_RESP);\n }\n \n-// handshake: bing.com(tls1.2 only)\n+// handshake: badssl.com(tls1.2 only)\n // data: captive.apple.com:80\n // protocol: v3 lossy\n #[test]\n@@ -39,7 +39,7 @@ fn tls12_v3_lossy() {\n     let client = RunningArgs::Client {\n         listen_addr: \"127.0.0.1:30002\".to_string(),\n         target_addr: \"127.0.0.1:30003\".to_string(),\n-        tls_names: TlsNames::try_from(\"bing.com\").unwrap(),\n+        tls_names: TlsNames::try_from(\"badssl.com\").unwrap(),\n         tls_ext: TlsExtConfig::new(None),\n         password: \"test\".to_string(),\n         nodelay: true,\n@@ -49,7 +49,7 @@ fn tls12_v3_lossy() {\n     let server = RunningArgs::Server {\n         listen_addr: \"127.0.0.1:30003\".to_string(),\n         target_addr: \"captive.apple.com:80\".to_string(),\n-        tls_addr: TlsAddrs::try_from(\"bing.com\").unwrap(),\n+        tls_addr: TlsAddrs::try_from(\"badssl.com\").unwrap(),\n         password: \"test\".to_string(),\n         nodelay: true,\n         fastopen: true,\n@@ -58,7 +58,7 @@ fn tls12_v3_lossy() {\n     utils::test_ok(client, server, CAPTIVE_HTTP_REQUEST, CAPTIVE_HTTP_RESP);\n }\n \n-// handshake: bing.com(tls1.2 only)\n+// handshake: badssl.com(tls1.2 only)\n // data: captive.apple.com:80\n // protocol: v3 strict\n // v3 strict cannot work with tls1.2, so it must fail\n@@ -68,7 +68,7 @@ fn tls12_v3_strict() {\n     let client = RunningArgs::Client {\n         listen_addr: \"127.0.0.1:30004\".to_string(),\n         target_addr: \"127.0.0.1:30005\".to_string(),\n-        tls_names: TlsNames::try_from(\"bing.com\").unwrap(),\n+        tls_names: TlsNames::try_from(\"badssl.com\").unwrap(),\n         tls_ext: TlsExtConfig::new(None),\n         password: \"test\".to_string(),\n         nodelay: true,\n@@ -78,7 +78,7 @@ fn tls12_v3_strict() {\n     let server = RunningArgs::Server {\n         listen_addr: \"127.0.0.1:30005\".to_string(),\n         target_addr: \"captive.apple.com:80\".to_string(),\n-        tls_addr: TlsAddrs::try_from(\"bing.com\").unwrap(),\n+        tls_addr: TlsAddrs::try_from(\"badssl.com\").unwrap(),\n         password: \"test\".to_string(),\n         nodelay: true,\n         fastopen: true,\n@@ -87,8 +87,8 @@ fn tls12_v3_strict() {\n     utils::test_ok(client, server, CAPTIVE_HTTP_REQUEST, CAPTIVE_HTTP_RESP);\n }\n \n-// handshake: bing.com(tls1.2 only)\n-// data: bing.com:443\n+// handshake: badssl.com(tls1.2 only)\n+// data: badssl.com:443\n // protocol: v2\n // Note: v2 can not defend against hijack attack.\n // Here hijack means directly connect to the handshake server.\n@@ -98,8 +98,8 @@ fn tls12_v3_strict() {\n fn tls12_v2_hijack() {\n     let client = RunningArgs::Client {\n         listen_addr: \"127.0.0.1:30006\".to_string(),\n-        target_addr: \"bing.com:443\".to_string(),\n-        tls_names: TlsNames::try_from(\"bing.com\").unwrap(),\n+        target_addr: \"badssl.com:443\".to_string(),\n+        tls_names: TlsNames::try_from(\"badssl.com\").unwrap(),\n         tls_ext: TlsExtConfig::new(None),\n         password: \"test\".to_string(),\n         nodelay: true,\n@@ -109,7 +109,7 @@ fn tls12_v2_hijack() {\n     test_hijack(client);\n }\n \n-// handshake: bing.com(tls1.2 only)\n+// handshake: badssl.com(tls1.2 only)\n // data: captive.apple.com:80\n // protocol: v3 lossy\n // (v3 strict can not work with tls1.2)\n@@ -121,8 +121,8 @@ fn tls12_v2_hijack() {\n fn tls12_v3_lossy_hijack() {\n     let client = RunningArgs::Client {\n         listen_addr: \"127.0.0.1:30007\".to_string(),\n-        target_addr: \"bing.com:443\".to_string(),\n-        tls_names: TlsNames::try_from(\"bing.com\").unwrap(),\n+        target_addr: \"badssl.com:443\".to_string(),\n+        tls_names: TlsNames::try_from(\"badssl.com\").unwrap(),\n         tls_ext: TlsExtConfig::new(None),\n         password: \"test\".to_string(),\n         nodelay: true,\n"
  },
  {
    "path": "relevance/passwall-packages/shadow-tls/patches/100-update-monoio.patch",
    "content": "--- a/Cargo.lock\n+++ b/Cargo.lock\n@@ -1,6 +1,6 @@\n # This file is automatically @generated by Cargo.\n # It is not intended for manual editing.\n-version = 3\n+version = 4\n \n [[package]]\n name = \"aho-corasick\"\n@@ -224,14 +224,13 @@ dependencies = [\n \n [[package]]\n name = \"flume\"\n-version = \"0.10.14\"\n+version = \"0.11.1\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"1657b4441c3403d9f7b3409e47575237dac27b1b5726df654a6ecbf92f0f7577\"\n+checksum = \"da0e4dd2a88388a1f4ccc7c9ce104604dab68d9f408dc34cd45823d5a9069095\"\n dependencies = [\n  \"futures-core\",\n  \"futures-sink\",\n  \"nanorand\",\n- \"pin-project\",\n  \"spin 0.9.8\",\n ]\n \n@@ -393,9 +392,9 @@ dependencies = [\n \n [[package]]\n name = \"memchr\"\n-version = \"2.6.4\"\n+version = \"2.7.5\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"f665ee40bc4a3c5590afb1e9677db74a508659dfd71e126420da8274909a0167\"\n+checksum = \"32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0\"\n \n [[package]]\n name = \"memoffset\"\n@@ -420,9 +419,9 @@ dependencies = [\n \n [[package]]\n name = \"monoio\"\n-version = \"0.2.0\"\n+version = \"0.2.2\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"c91a9bcc2622991bc92f3b6d7dc495329c4863e4dc530d1748529b009bb2170a\"\n+checksum = \"fd5be7ef0eea41e4e5b30fe55aa6fd15288c415118bcdceadd52fd3656816cc7\"\n dependencies = [\n  \"auto-const-array\",\n  \"bytes\",\n@@ -430,9 +429,11 @@ dependencies = [\n  \"fxhash\",\n  \"io-uring\",\n  \"libc\",\n+ \"memchr\",\n  \"mio\",\n  \"monoio-macros\",\n  \"nix 0.26.4\",\n+ \"once_cell\",\n  \"pin-project-lite\",\n  \"socket2\",\n  \"threadpool\",\n@@ -538,26 +539,6 @@ source = \"registry+https://github.com/ru\n checksum = \"b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39\"\n \n [[package]]\n-name = \"pin-project\"\n-version = \"1.1.3\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"fda4ed1c6c173e3fc7a83629421152e01d7b1f9b7f65fb301e490e8cfc656422\"\n-dependencies = [\n- \"pin-project-internal\",\n-]\n-\n-[[package]]\n-name = \"pin-project-internal\"\n-version = \"1.1.3\"\n-source = \"registry+https://github.com/rust-lang/crates.io-index\"\n-checksum = \"4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405\"\n-dependencies = [\n- \"proc-macro2\",\n- \"quote\",\n- \"syn\",\n-]\n-\n-[[package]]\n name = \"pin-project-lite\"\n version = \"0.2.13\"\n source = \"registry+https://github.com/rust-lang/crates.io-index\"\n--- a/Cargo.toml\n+++ b/Cargo.toml\n@@ -10,7 +10,7 @@ repository = \"https://github.com/ihciah/\n version = \"0.2.25\"\n \n [dependencies]\n-monoio = { version = \"0.2.0\", features = [\"sync\"] }\n+monoio = { version = \"=0.2.2\", features = [\"sync\"] }\n monoio-rustls-fork-shadow-tls = { version = \"0.3.0-mod.2\" }\n rustls-fork-shadow-tls = { version = \"0.20.9-mod.2\", default-features = false }\n \n--- a/src/lib.rs\n+++ b/src/lib.rs\n@@ -1,5 +1,3 @@\n-#![feature(impl_trait_in_assoc_type)]\n-\n mod client;\n mod helper_v2;\n mod server;\n--- a/src/main.rs\n+++ b/src/main.rs\n@@ -1,5 +1,3 @@\n-#![feature(type_alias_impl_trait)]\n-\n use std::{collections::HashMap, path::PathBuf, process::exit};\n \n use clap::{Parser, Subcommand, ValueEnum};\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocks-libev/Makefile",
    "content": "#\n# Copyright (C) 2017-2020 Yousong Zhou <yszhou4tech@gmail.com>\n#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\n# Checklist when bumping versions\n#\n# - update cipher list by checking src/crypto.c:crypto_init()\n# - check if default mode has changed from being tcp_only\n#\nPKG_NAME:=shadowsocks-libev\nPKG_VERSION:=3.3.5\nPKG_RELEASE:=13\n\nPKG_SOURCE_PROTO:=git\nPKG_SOURCE_URL:=https://github.com/shadowsocks/shadowsocks-libev.git\nPKG_SOURCE_DATE:=2025-1-20\nPKG_SOURCE_VERSION:=9afa3cacf947f910be46b69fc5a7a1fdd02fd5e6\nPKG_MIRROR_HASH:=b56d015394a3217750ec232570e012461a30af17de20d5598c3b026c8fcaa5b5\n\nPKG_MAINTAINER:=Yousong Zhou <yszhou4tech@gmail.com>\n\nPKG_LICENSE:=GPL-3.0-or-later\nPKG_LICENSE_FILES:=LICENSE\nPKG_CPE_ID:=cpe:/a:shadowsocks:shadowsocks-libev\n\nPKG_FIXUP:=autoreconf\nPKG_INSTALL:=1\nPKG_BUILD_FLAGS:=no-mips16 lto\nPKG_BUILD_PARALLEL:=1\nPKG_BUILD_DEPENDS:=c-ares pcre2\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/shadowsocks-libev/Default\n  define Package/shadowsocks-libev-$(1)\n    SECTION:=net\n    CATEGORY:=Network\n    SUBMENU:=Web Servers/Proxies\n    TITLE:=shadowsocks-libev $(1)\n    URL:=https://github.com/shadowsocks/shadowsocks-libev\n    DEPENDS:=+libev +libmbedtls +libpthread +libsodium $(DEPENDS_$(1))\n  endef\n\n  define Package/shadowsocks-libev-$(1)/install\n\t$$(INSTALL_DIR) $$(1)/usr/bin\n\t$$(INSTALL_BIN) $$(PKG_INSTALL_DIR)/usr/bin/$(1) $$(1)/usr/bin\n  endef\n\nendef\n\nDEPENDS_ss-local = +libpcre2\nDEPENDS_ss-server = +libcares +libpcre2\n\nSHADOWSOCKS_COMPONENTS:=ss-local ss-redir ss-tunnel ss-server\ndefine shadowsocks-libev/templates\n  $(foreach component,$(SHADOWSOCKS_COMPONENTS),\n    $(call Package/shadowsocks-libev/Default,$(component))\n  )\nendef\n$(eval $(call shadowsocks-libev/templates))\n\ndefine Build/Prepare\n\t$(call Build/Prepare/Default)\n\t$(FIND) $(PKG_BUILD_DIR) \\\n\t\t\t   -name '*.o' \\\n\t\t\t-o -name '*.lo' \\\n\t\t\t-o -name '.deps' \\\n\t\t\t-o -name '.libs' \\\n\t\t| $(XARGS) rm -rvf\nendef\n\nCONFIGURE_ARGS += \\\n\t--disable-documentation \\\n\t--disable-silent-rules \\\n\t--disable-assert \\\n\t--disable-ssp \\\n\nTARGET_LDFLAGS += -Wl,--gc-sections,--as-needed\n\n$(foreach component,$(SHADOWSOCKS_COMPONENTS), \\\n  $(eval $(call BuildPackage,shadowsocks-libev-$(component))) \\\n)\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocks-libev/patches/100-Upgrade-PCRE-to-PCRE2.patch",
    "content": "From d4f4d9761cbd41c3ab6de79383ff39b9f97bf452 Mon Sep 17 00:00:00 2001\nFrom: Syrone Wong <wong.syrone@gmail.com>\nDate: Sat, 18 Nov 2017 20:06:50 +0800\nSubject: [PATCH] Upgrade PCRE to PCRE2\n\n- Use 8bit variant by default\n\nThis comes from a PR closed and never reopen as at times PCRE2 was too\nnew(???.)\n\nRef: https://github.com/shadowsocks/shadowsocks-libev/pull/1792\nSigned-off-by: Syrone Wong <wong.syrone@gmail.com>\n[ squash the first 2 patch from PR, drop the last one ]\nSigned-off-by: Christian Marangi <ansuelsmth@gmail.com>\n---\n .travis.yml  |   9 ++-\n configure.ac |   8 +--\n m4/pcre.m4   | 152 ------------------------------------------\n m4/pcre2.m4  | 181 +++++++++++++++++++++++++++++++++++++++++++++++++++\n src/rule.c   |  53 ++++++++++++---\n src/rule.h   |  23 +++++--\n 6 files changed, 253 insertions(+), 173 deletions(-)\n delete mode 100644 m4/pcre.m4\n create mode 100644 m4/pcre2.m4\n\n# diff --git a/.travis.yml b/.travis.yml\n# index ee3424c..e7da08c 100644\n# --- a/.travis.yml\n# +++ b/.travis.yml\n# @@ -11,11 +11,12 @@ env:\n#      global:\n#          - LIBSODIUM_VER=1.0.12\n#          - MBEDTLS_VER=2.4.0\n# +        - PCRE2_VER=10.30\n#  before_install:\n#      - |\n#        if [[ \"$TRAVIS_OS_NAME\" == \"osx\" ]]; then\n#            # All dependencies for macOS build. Some packages has been installed by travis so use reinstall.\n# -          brew reinstall autoconf automake xmlto c-ares libev mbedtls libsodium asciidoc >> /dev/null 2>&1;\n# +          brew reinstall autoconf automake xmlto pcre2 c-ares libev mbedtls libsodium asciidoc >> /dev/null 2>&1;\n#        else\n#            wget  https://github.com/jedisct1/libsodium/releases/download/$LIBSODIUM_VER/libsodium-$LIBSODIUM_VER.tar.gz;\n#            tar xvf libsodium-$LIBSODIUM_VER.tar.gz;\n# @@ -29,6 +30,12 @@ before_install:\n#            make SHARED=1;\n#            sudo make install;\n#            popd;\n# +          wget https://ftp.pcre.org/pub/pcre/pcre2-$PCRE2_VER.tar.gz;\n# +          tar xvf pcre2-$PCRE2_VER.tar.gz;\n# +          pushd pcre2-$PCRE2_VER;\n# +          ./configure --prefix=/usr --enable-pcre2-16 --enable-pcre2-32 && make;\n# +          sudo make install;\n# +          popd;\n#            # Load cached docker images\n#            if [[ -d $HOME/docker ]]; then\n#                ls $HOME/docker/*.tar.gz | xargs -I {file} sh -c \"zcat {file} | docker load\";\n--- a/configure.ac\n+++ b/configure.ac\n@@ -20,10 +20,10 @@ AC_DISABLE_STATIC\n AC_DISABLE_SHARED\n LT_INIT([dlopen])\n \n-dnl Check for pcre library\n-TS_CHECK_PCRE\n-if test \"x${enable_pcre}\" != \"xyes\"; then\n-  AC_MSG_ERROR([Cannot find pcre library. Configure --with-pcre=DIR])\n+dnl Check for pcre2 library\n+TS_CHECK_PCRE2\n+if test \"x${enable_pcre2}\" != \"xyes\"; then\n+  AC_MSG_ERROR([Cannot find pcre2 library. Configure --with-pcre2=DIR])\n fi\n \n dnl Checks for using shared libraries from system\n--- a/m4/pcre.m4\n+++ /dev/null\n@@ -1,152 +0,0 @@\n-dnl -------------------------------------------------------- -*- autoconf -*-\n-dnl Licensed to the Apache Software Foundation (ASF) under one or more\n-dnl contributor license agreements.  See the NOTICE file distributed with\n-dnl this work for additional information regarding copyright ownership.\n-dnl The ASF licenses this file to You under the Apache License, Version 2.0\n-dnl (the \"License\"); you may not use this file except in compliance with\n-dnl the License.  You may obtain a copy of the License at\n-dnl\n-dnl     http://www.apache.org/licenses/LICENSE-2.0\n-dnl\n-dnl Unless required by applicable law or agreed to in writing, software\n-dnl distributed under the License is distributed on an \"AS IS\" BASIS,\n-dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n-dnl See the License for the specific language governing permissions and\n-dnl limitations under the License.\n-\n-dnl\n-dnl TS_ADDTO(variable, value)\n-dnl\n-dnl  Add value to variable\n-dnl\n-AC_DEFUN([TS_ADDTO], [\n-  if test \"x$$1\" = \"x\"; then\n-    test \"x$verbose\" = \"xyes\" && echo \"  setting $1 to \\\"$2\\\"\"\n-    $1=\"$2\"\n-  else\n-    ats_addto_bugger=\"$2\"\n-    for i in $ats_addto_bugger; do\n-      ats_addto_duplicate=\"0\"\n-      for j in $$1; do\n-        if test \"x$i\" = \"x$j\"; then\n-          ats_addto_duplicate=\"1\"\n-          break\n-        fi\n-      done\n-      if test $ats_addto_duplicate = \"0\"; then\n-        test \"x$verbose\" = \"xyes\" && echo \"  adding \\\"$i\\\" to $1\"\n-        $1=\"$$1 $i\"\n-      fi\n-    done\n-  fi\n-])dnl\n-\n-dnl\n-dnl TS_ADDTO_RPATH(path)\n-dnl\n-dnl   Adds path to variable with the '-rpath' directive.\n-dnl\n-AC_DEFUN([TS_ADDTO_RPATH], [\n-  AC_MSG_NOTICE([adding $1 to RPATH])\n-  TS_ADDTO(LIBTOOL_LINK_FLAGS, [-R$1])\n-])dnl\n-\n-dnl\n-dnl pcre.m4: Trafficserver's pcre autoconf macros\n-dnl\n-\n-dnl\n-dnl TS_CHECK_PCRE: look for pcre libraries and headers\n-dnl\n-AC_DEFUN([TS_CHECK_PCRE], [\n-enable_pcre=no\n-AC_ARG_WITH(pcre, [AC_HELP_STRING([--with-pcre=DIR],[use a specific pcre library])],\n-[\n-  if test \"x$withval\" != \"xyes\" && test \"x$withval\" != \"x\"; then\n-    pcre_base_dir=\"$withval\"\n-    if test \"$withval\" != \"no\"; then\n-      enable_pcre=yes\n-      case \"$withval\" in\n-      *\":\"*)\n-        pcre_include=\"`echo $withval |sed -e 's/:.*$//'`\"\n-        pcre_ldflags=\"`echo $withval |sed -e 's/^.*://'`\"\n-        AC_MSG_CHECKING(checking for pcre includes in $pcre_include libs in $pcre_ldflags )\n-        ;;\n-      *)\n-        pcre_include=\"$withval/include\"\n-        pcre_ldflags=\"$withval/lib\"\n-        AC_MSG_CHECKING(checking for pcre includes in $withval)\n-        ;;\n-      esac\n-    fi\n-  fi\n-],\n-[\n-  AC_CHECK_PROG(PCRE_CONFIG, pcre-config, pcre-config)\n-  if test \"x$PCRE_CONFIG\" != \"x\"; then\n-    enable_pcre=yes\n-    pcre_base_dir=\"`$PCRE_CONFIG --prefix`\"\n-    pcre_include=\"`$PCRE_CONFIG --cflags | sed -es/-I//`\"\n-    pcre_ldflags=\"`$PCRE_CONFIG --libs | sed -es/-lpcre// -es/-L//`\"\n-  fi\n-])\n-\n-if test \"x$pcre_base_dir\" = \"x\"; then\n-  AC_MSG_CHECKING([for pcre location])\n-  AC_CACHE_VAL(ats_cv_pcre_dir,[\n-  for dir in /usr/local /usr ; do\n-    if test -d $dir && ( test -f $dir/include/pcre.h || test -f $dir/include/pcre/pcre.h ); then\n-      ats_cv_pcre_dir=$dir\n-      break\n-    fi\n-  done\n-  ])\n-  pcre_base_dir=$ats_cv_pcre_dir\n-  if test \"x$pcre_base_dir\" = \"x\"; then\n-    enable_pcre=no\n-    AC_MSG_RESULT([not found])\n-  else\n-    enable_pcre=yes\n-    pcre_include=\"$pcre_base_dir/include\"\n-    pcre_ldflags=\"$pcre_base_dir/lib\"\n-    AC_MSG_RESULT([$pcre_base_dir])\n-  fi\n-else\n-  AC_MSG_CHECKING(for pcre headers in $pcre_include)\n-  if test -d $pcre_include && test -d $pcre_ldflags && ( test -f $pcre_include/pcre.h || test -f $pcre_include/pcre/pcre.h ); then\n-    AC_MSG_RESULT([ok])\n-  else\n-    AC_MSG_RESULT([not found])\n-  fi\n-fi\n-\n-pcreh=0\n-pcre_pcreh=0\n-if test \"$enable_pcre\" != \"no\"; then\n-  saved_ldflags=$LDFLAGS\n-  saved_cppflags=$CFLAGS\n-  pcre_have_headers=0\n-  pcre_have_libs=0\n-  if test \"$pcre_base_dir\" != \"/usr\"; then\n-    TS_ADDTO(CFLAGS, [-I${pcre_include}])\n-    TS_ADDTO(CFLAGS, [-DPCRE_STATIC])\n-    TS_ADDTO(LDFLAGS, [-L${pcre_ldflags}])\n-    TS_ADDTO_RPATH(${pcre_ldflags})\n-  fi\n-  AC_SEARCH_LIBS([pcre_exec], [pcre], [pcre_have_libs=1])\n-  if test \"$pcre_have_libs\" != \"0\"; then\n-    AC_CHECK_HEADERS(pcre.h, [pcre_have_headers=1])\n-    AC_CHECK_HEADERS(pcre/pcre.h, [pcre_have_headers=1])\n-  fi\n-  if test \"$pcre_have_headers\" != \"0\"; then\n-    AC_DEFINE(HAVE_LIBPCRE,1,[Compiling with pcre support])\n-    AC_SUBST(LIBPCRE, [-lpcre])\n-  else\n-    enable_pcre=no\n-    CFLAGS=$saved_cppflags\n-    LDFLAGS=$saved_ldflags\n-  fi\n-fi\n-AC_SUBST(pcreh)\n-AC_SUBST(pcre_pcreh)\n-])\n--- /dev/null\n+++ b/m4/pcre2.m4\n@@ -0,0 +1,181 @@\n+dnl -------------------------------------------------------- -*- autoconf -*-\n+dnl Licensed to the Apache Software Foundation (ASF) under one or more\n+dnl contributor license agreements.  See the NOTICE file distributed with\n+dnl this work for additional information regarding copyright ownership.\n+dnl The ASF licenses this file to You under the Apache License, Version 2.0\n+dnl (the \"License\"); you may not use this file except in compliance with\n+dnl the License.  You may obtain a copy of the License at\n+dnl\n+dnl     http://www.apache.org/licenses/LICENSE-2.0\n+dnl\n+dnl Unless required by applicable law or agreed to in writing, software\n+dnl distributed under the License is distributed on an \"AS IS\" BASIS,\n+dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+dnl See the License for the specific language governing permissions and\n+dnl limitations under the License.\n+\n+dnl Modified by Syrone Wong <wong.syrone@gmail.com> to support pcre2 8bit variant only\n+\n+dnl\n+dnl TS_ADDTO(variable, value)\n+dnl\n+dnl  Add value to variable\n+dnl\n+AC_DEFUN([TS_ADDTO], [\n+  if test \"x$$1\" = \"x\"; then\n+    test \"x$verbose\" = \"xyes\" && echo \"  setting $1 to \\\"$2\\\"\"\n+    $1=\"$2\"\n+  else\n+    ats_addto_bugger=\"$2\"\n+    for i in $ats_addto_bugger; do\n+      ats_addto_duplicate=\"0\"\n+      for j in $$1; do\n+        if test \"x$i\" = \"x$j\"; then\n+          ats_addto_duplicate=\"1\"\n+          break\n+        fi\n+      done\n+      if test $ats_addto_duplicate = \"0\"; then\n+        test \"x$verbose\" = \"xyes\" && echo \"  adding \\\"$i\\\" to $1\"\n+        $1=\"$$1 $i\"\n+      fi\n+    done\n+  fi\n+])dnl\n+\n+dnl\n+dnl TS_ADDTO_RPATH(path)\n+dnl\n+dnl   Adds path to variable with the '-rpath' directive.\n+dnl\n+AC_DEFUN([TS_ADDTO_RPATH], [\n+  AC_MSG_NOTICE([adding $1 to RPATH])\n+  TS_ADDTO(LIBTOOL_LINK_FLAGS, [-R$1])\n+])dnl\n+\n+dnl\n+dnl pcre2.m4: Trafficserver's pcre2 autoconf macros\n+dnl\n+\n+dnl\n+dnl TS_CHECK_PCRE2: look for pcre2 libraries and headers\n+dnl\n+AC_DEFUN([TS_CHECK_PCRE2], [\n+enable_pcre2=no\n+AC_ARG_WITH(pcre2, [AC_HELP_STRING([--with-pcre2=DIR],[use a specific pcre2 library])],\n+[\n+  if test \"x$withval\" != \"xyes\" && test \"x$withval\" != \"x\"; then\n+    pcre2_base_dir=\"$withval\"\n+    if test \"$withval\" != \"no\"; then\n+      enable_pcre2=yes\n+      case \"$withval\" in\n+      *\":\"*)\n+        pcre2_include=\"`echo $withval |sed -e 's/:.*$//'`\"\n+        pcre2_ldflags=\"`echo $withval |sed -e 's/^.*://'`\"\n+        AC_MSG_CHECKING(checking for pcre2 includes in $pcre2_include libs in $pcre2_ldflags )\n+        ;;\n+      *)\n+        pcre2_include=\"$withval/include\"\n+        pcre2_ldflags=\"$withval/lib\"\n+        AC_MSG_CHECKING(checking for pcre2 includes in $withval)\n+        ;;\n+      esac\n+    fi\n+  fi\n+],\n+[\n+  AC_CHECK_PROG(PCRE2_CONFIG, pcre2-config, pcre2-config)\n+  if test \"x$PCRE2_CONFIG\" != \"x\"; then\n+    enable_pcre2=yes\n+    pcre2_base_dir=\"`$PCRE2_CONFIG --prefix`\"\n+    pcre2_include=\"`$PCRE2_CONFIG --cflags | sed -es/-I//`\"\n+    pcre2_ldflags=\"`$PCRE2_CONFIG --libs8 | sed -es/-lpcre2-8// -es/-L//`\"\n+  fi\n+])\n+\n+if test \"x$pcre2_base_dir\" = \"x\"; then\n+  AC_MSG_CHECKING([for pcre2 location])\n+  AC_CACHE_VAL(ats_cv_pcre2_dir,[\n+  for dir in /usr/local /usr ; do\n+    if test -d $dir && ( test -f $dir/include/pcre2.h || test -f $dir/include/pcre2/pcre2.h ); then\n+      ats_cv_pcre2_dir=$dir\n+      break\n+    fi\n+  done\n+  ])\n+  pcre2_base_dir=$ats_cv_pcre2_dir\n+  if test \"x$pcre2_base_dir\" = \"x\"; then\n+    enable_pcre2=no\n+    AC_MSG_RESULT([not found])\n+  else\n+    enable_pcre2=yes\n+    pcre2_include=\"$pcre2_base_dir/include\"\n+    pcre2_ldflags=\"$pcre2_base_dir/lib\"\n+    AC_MSG_RESULT([$pcre2_base_dir])\n+  fi\n+else\n+  AC_MSG_CHECKING(for pcre2 headers in $pcre2_include)\n+  if test -d $pcre2_include && test -d $pcre2_ldflags && ( test -f $pcre2_include/pcre2.h || test -f $pcre2_include/pcre2/pcre2.h ); then\n+    AC_MSG_RESULT([ok])\n+  else\n+    AC_MSG_RESULT([not found])\n+  fi\n+fi\n+\n+pcre2h=0\n+pcre2_pcre2h=0\n+if test \"$enable_pcre2\" != \"no\"; then\n+  saved_ldflags=$LDFLAGS\n+  saved_cppflags=$CFLAGS\n+  pcre2_have_headers=0\n+  pcre2_have_libs=0\n+  if test \"$pcre2_base_dir\" != \"/usr\"; then\n+    TS_ADDTO(CFLAGS, [-I${pcre2_include}])\n+    TS_ADDTO(CFLAGS, [-DPCRE2_STATIC])\n+    TS_ADDTO(LDFLAGS, [-L${pcre2_ldflags}])\n+    TS_ADDTO_RPATH(${pcre2_ldflags})\n+  fi\n+  AC_SEARCH_LIBS([pcre2_match_8], [pcre2-8], [pcre2_have_libs=1])\n+  if test \"$pcre2_have_libs\" != \"0\"; then\n+      AC_MSG_CHECKING([pcre2.h])\n+  AC_COMPILE_IFELSE(\n+    [AC_LANG_PROGRAM(\n+      [[\n+#define PCRE2_CODE_UNIT_WIDTH 8\n+#include <pcre2.h>\n+      ]],\n+      [[\n+      ]]\n+    )],\n+    [pcre2_have_headers=1\n+    AC_MSG_RESULT([ok])],\n+    [AC_MSG_RESULT([not found])]\n+  )\n+\n+    AC_MSG_CHECKING([pcre2/pcre2.h])\n+  AC_COMPILE_IFELSE(\n+    [AC_LANG_PROGRAM(\n+      [[\n+#define PCRE2_CODE_UNIT_WIDTH 8\n+#include <pcre2/pcre2.h>\n+      ]],\n+      [[\n+      ]]\n+    )],\n+    [pcre2_have_headers=1\n+    AC_MSG_RESULT([ok])],\n+    [AC_MSG_RESULT([not found])]\n+  )\n+  fi\n+  if test \"$pcre2_have_headers\" != \"0\"; then\n+    AC_DEFINE(HAVE_LIBPCRE2,1,[Compiling with pcre2 support])\n+    AC_SUBST(LIBPCRE2, [-lpcre2-8])\n+  else\n+    enable_pcre2=no\n+    CFLAGS=$saved_cppflags\n+    LDFLAGS=$saved_ldflags\n+  fi\n+fi\n+AC_SUBST(pcre2h)\n+AC_SUBST(pcre2_pcre2h)\n+])\n--- a/src/rule.c\n+++ b/src/rule.c\n@@ -1,6 +1,7 @@\n /*\n  * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n  * Copyright (c) 2011 Manuel Kasper <mk@neon1.net>\n+ * Copyright (c) 2017 Syrone Wong <wong.syrone@gmail.com>\n  * All rights reserved.\n  *\n  * Redistribution and use in source and binary forms, with or without\n@@ -74,18 +75,37 @@ add_rule(struct cork_dllist *rules, rule\n     cork_dllist_add(rules, &rule->entries);\n }\n \n+/*\n+ * XXX: As pattern and subject are char arguments, they can be straightforwardly\n+ *      cast to PCRE2_SPTR as we are working in 8-bit code units.\n+ */\n+\n int\n init_rule(rule_t *rule)\n {\n     if (rule->pattern_re == NULL) {\n-        const char *reerr;\n-        int reerroffset;\n+        int errornumber;\n+        PCRE2_SIZE erroroffset;\n+        rule->pattern_re = pcre2_compile(\n+            (PCRE2_SPTR)rule->pattern,   /* the pattern */\n+            PCRE2_ZERO_TERMINATED,       /* indicates pattern is zero-terminated */\n+            0,                           /* default options */\n+            &errornumber,                /* for error number */\n+            &erroroffset,                /* for error offset */\n+            NULL);                       /* use default compile context */\n \n-        rule->pattern_re =\n-            pcre_compile(rule->pattern, 0, &reerr, &reerroffset, NULL);\n         if (rule->pattern_re == NULL) {\n-            LOGE(\"Regex compilation of \\\"%s\\\" failed: %s, offset %d\",\n-                 rule->pattern, reerr, reerroffset);\n+            PCRE2_UCHAR errbuffer[512];\n+            pcre2_get_error_message(errornumber, errbuffer, sizeof(errbuffer));\n+            LOGE(\"PCRE2 regex compilation failed at offset %d: %s\\n\", (int)erroroffset,\n+                 errbuffer);\n+            return 0;\n+        }\n+\n+        rule->pattern_re_match_data = pcre2_match_data_create_from_pattern(rule->pattern_re, NULL);\n+\n+        if (rule->pattern_re_match_data == NULL) {\n+            ERROR(\"PCRE2: the memory for the block could not be obtained\");\n             return 0;\n         }\n     }\n@@ -105,8 +125,15 @@ lookup_rule(const struct cork_dllist *ru\n \n     cork_dllist_foreach_void(rules, curr, next) {\n         rule_t *rule = cork_container_of(curr, rule_t, entries);\n-        if (pcre_exec(rule->pattern_re, NULL,\n-                      name, name_len, 0, 0, NULL, 0) >= 0)\n+        if (pcre2_match(\n+                rule->pattern_re,            /* the compiled pattern */\n+                (PCRE2_SPTR)name,            /* the subject string */\n+                name_len,                    /* the length of the subject */\n+                0,                           /* start at offset 0 in the subject */\n+                0,                           /* default options */\n+                rule->pattern_re_match_data, /* block for storing the result */\n+                NULL                         /* use default match context */\n+                ) >= 0)\n             return rule;\n     }\n \n@@ -127,7 +154,13 @@ free_rule(rule_t *rule)\n         return;\n \n     ss_free(rule->pattern);\n-    if (rule->pattern_re != NULL)\n-        pcre_free(rule->pattern_re);\n+    if (rule->pattern_re != NULL) {\n+        pcre2_code_free(rule->pattern_re);                    /* data and the compiled pattern. */\n+        rule->pattern_re            = NULL;\n+    }\n+    if (rule->pattern_re_match_data != NULL) {\n+        pcre2_match_data_free(rule->pattern_re_match_data);   /* Release memory used for the match */\n+        rule->pattern_re_match_data = NULL;\n+    }\n     ss_free(rule);\n }\n--- a/src/rule.h\n+++ b/src/rule.h\n@@ -1,6 +1,7 @@\n /*\n  * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n  * Copyright (c) 2011 Manuel Kasper <mk@neon1.net>\n+ * Copyright (c) 2017 Syrone Wong <wong.syrone@gmail.com>\n  * All rights reserved.\n  *\n  * Redistribution and use in source and binary forms, with or without\n@@ -33,17 +34,27 @@\n \n #include <libcork/ds.h>\n \n-#ifdef HAVE_PCRE_H\n-#include <pcre.h>\n-#elif HAVE_PCRE_PCRE_H\n-#include <pcre/pcre.h>\n-#endif\n+/*\n+ * The PCRE2_CODE_UNIT_WIDTH macro must be defined before including pcre2.h.\n+ * For a program that uses only one code unit width, setting it to 8, 16, or 32\n+ * makes it possible to use generic function names such as pcre2_compile(). Note\n+ * that just changing 8 to 16 (for example) is not sufficient to convert this\n+ * program to process 16-bit characters. Even in a fully 16-bit environment, where\n+ * string-handling functions such as strcmp() and printf() work with 16-bit\n+ * characters, the code for handling the table of named substrings will still need\n+ * to be modified.\n+ */\n+/* we only need to support ASCII chartable, thus set it to 8 */\n+#define PCRE2_CODE_UNIT_WIDTH 8\n+\n+#include <pcre2.h>\n \n typedef struct rule {\n     char *pattern;\n \n     /* Runtime fields */\n-    pcre *pattern_re;\n+    pcre2_code *pattern_re;\n+    pcre2_match_data *pattern_re_match_data;\n \n     struct cork_dllist_item entries;\n } rule_t;\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocks-libev/patches/101-Fix-mishandling-of-incoming-socket-buffer.-It-must-b.patch",
    "content": "From 8be7a7cb00b9540e9be05d409191b0bc1ba424f0 Mon Sep 17 00:00:00 2001\nFrom: notsure2 <notsure2@protonmail.com>\nDate: Mon, 11 Dec 2023 09:15:47 +0200\nSubject: [PATCH] Fix mishandling of incoming socket buffer. It must be set on\n the listening socket not the accepted socket.\n\n---\n src/local.c  | 16 ++++++++--------\n src/redir.c  | 16 ++++++++--------\n src/server.c | 16 ++++++++--------\n src/tunnel.c | 16 ++++++++--------\n 4 files changed, 32 insertions(+), 32 deletions(-)\n\n--- a/src/local.c\n+++ b/src/local.c\n@@ -205,6 +205,14 @@ create_and_bind(const char *addr, const\n             }\n         }\n \n+        if (tcp_incoming_sndbuf > 0) {\n+            setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));\n+        }\n+\n+        if (tcp_incoming_rcvbuf > 0) {\n+            setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));\n+        }\n+\n         s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);\n         if (s == 0) {\n             /* We managed to bind successfully! */\n@@ -1406,14 +1414,6 @@ accept_cb(EV_P_ ev_io *w, int revents)\n     setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n #endif\n \n-    if (tcp_incoming_sndbuf > 0) {\n-        setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));\n-    }\n-\n-    if (tcp_incoming_rcvbuf > 0) {\n-        setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));\n-    }\n-\n     server_t *server = new_server(serverfd);\n     server->listener = listener;\n \n--- a/src/redir.c\n+++ b/src/redir.c\n@@ -201,6 +201,14 @@ create_and_bind(const char *addr, const\n             LOGI(\"tcp tproxy mode enabled\");\n         }\n \n+        if (tcp_incoming_sndbuf > 0) {\n+            setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));\n+        }\n+\n+        if (tcp_incoming_rcvbuf > 0) {\n+            setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));\n+        }\n+\n         s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);\n         if (s == 0) {\n             /* We managed to bind successfully! */\n@@ -759,14 +767,6 @@ accept_cb(EV_P_ ev_io *w, int revents)\n     setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n #endif\n \n-    if (tcp_incoming_sndbuf > 0) {\n-        setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));\n-    }\n-\n-    if (tcp_incoming_rcvbuf > 0) {\n-        setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));\n-    }\n-\n     int index                    = rand() % listener->remote_num;\n     struct sockaddr *remote_addr = listener->remote_addr[index];\n \n--- a/src/server.c\n+++ b/src/server.c\n@@ -620,6 +620,14 @@ create_and_bind(const char *host, const\n             }\n         }\n \n+        if (tcp_incoming_sndbuf > 0) {\n+            setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));\n+        }\n+\n+        if (tcp_incoming_rcvbuf > 0) {\n+            setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));\n+        }\n+\n         // Enable out-of-tree mptcp\n         if (mptcp == 1) {\n             int i = 0;\n@@ -1769,14 +1777,6 @@ accept_cb(EV_P_ ev_io *w, int revents)\n     setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n #endif\n \n-    if (tcp_incoming_sndbuf > 0) {\n-        setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));\n-    }\n-\n-    if (tcp_incoming_rcvbuf > 0) {\n-        setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));\n-    }\n-\n     setnonblocking(serverfd);\n \n     server_t *server = new_server(serverfd, listener);\n--- a/src/tunnel.c\n+++ b/src/tunnel.c\n@@ -166,6 +166,14 @@ create_and_bind(const char *addr, const\n             }\n         }\n \n+        if (tcp_incoming_sndbuf > 0) {\n+            setsockopt(listen_sock, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));\n+        }\n+\n+        if (tcp_incoming_rcvbuf > 0) {\n+            setsockopt(listen_sock, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));\n+        }\n+\n         s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);\n         if (s == 0) {\n             /* We managed to bind successfully! */\n@@ -725,14 +733,6 @@ accept_cb(EV_P_ ev_io *w, int revents)\n     setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n #endif\n \n-    if (tcp_incoming_sndbuf > 0) {\n-        setsockopt(serverfd, SOL_SOCKET, SO_SNDBUF, &tcp_incoming_sndbuf, sizeof(int));\n-    }\n-\n-    if (tcp_incoming_rcvbuf > 0) {\n-        setsockopt(serverfd, SOL_SOCKET, SO_RCVBUF, &tcp_incoming_rcvbuf, sizeof(int));\n-    }\n-\n     int index                    = rand() % listener->remote_num;\n     struct sockaddr *remote_addr = listener->remote_addr[index];\n \n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocks-libev/patches/102-deprecate-load16-be-replace-with-ntohs.patch",
    "content": "From f4ee43fa27e00a573d90a8cac68f12655570bbf7 Mon Sep 17 00:00:00 2001\nFrom: lwb1978 <86697442+lwb1978@users.noreply.github.com>\nDate: Tue, 4 Feb 2025 15:51:17 +0800\nSubject: [PATCH] Deprecate load16_be() function in favor to ntohs() function\n\n---\n src/aead.c     | 2 +-\n src/local.c    | 6 +++---\n src/server.c   | 2 +-\n src/udprelay.c | 2 +-\n src/utils.c    | 8 --------\n src/utils.h    | 1 -\n 6 files changed, 6 insertions(+), 15 deletions(-)\n\ndiff --git a/src/aead.c b/src/aead.c\nindex 73349da64..e5d9b01e7 100644\n--- a/src/aead.c\n+++ b/src/aead.c\n@@ -605,7 +605,7 @@ aead_chunk_decrypt(cipher_ctx_t *ctx, uint8_t *p, uint8_t *c, uint8_t *n,\n         return CRYPTO_ERROR;\n     assert(*plen == CHUNK_SIZE_LEN);\n \n-    mlen = load16_be(len_buf);\n+    mlen = ntohs(*(uint16_t*)len_buf);\n     mlen = mlen & CHUNK_SIZE_MASK;\n \n     if (mlen == 0)\ndiff --git a/src/local.c b/src/local.c\nindex fa1ca7b31..76d46de17 100644\n--- a/src/local.c\n+++ b/src/local.c\n@@ -382,7 +382,7 @@ server_handshake(EV_P_ ev_io *w, buffer_t *buf)\n         abuf->len += in_addr_len + 2;\n \n         if (acl || verbose) {\n-            uint16_t p = load16_be(buf->data + request_len + in_addr_len);\n+            uint16_t p = ntohs(*(uint16_t*)(buf->data + request_len + in_addr_len));\n             if (!inet_ntop(AF_INET, (const void *)(buf->data + request_len),\n                            ip, INET_ADDRSTRLEN)) {\n                 LOGI(\"inet_ntop(AF_INET): %s\", strerror(errno));\n@@ -400,7 +400,7 @@ server_handshake(EV_P_ ev_io *w, buffer_t *buf)\n         abuf->len += name_len + 2;\n \n         if (acl || verbose) {\n-            uint16_t p = load16_be(buf->data + request_len + 1 + name_len);\n+            uint16_t p = ntohs(*(uint16_t*)(buf->data + request_len + 1 + name_len));\n             memcpy(host, buf->data + request_len + 1, name_len);\n             host[name_len] = '\\0';\n             sprintf(port, \"%d\", p);\n@@ -414,7 +414,7 @@ server_handshake(EV_P_ ev_io *w, buffer_t *buf)\n         abuf->len += in6_addr_len + 2;\n \n         if (acl || verbose) {\n-            uint16_t p = load16_be(buf->data + request_len + in6_addr_len);\n+            uint16_t p = ntohs(*(uint16_t*)(buf->data + request_len + in6_addr_len));\n             if (!inet_ntop(AF_INET6, (const void *)(buf->data + request_len),\n                            ip, INET6_ADDRSTRLEN)) {\n                 LOGI(\"inet_ntop(AF_INET6): %s\", strerror(errno));\ndiff --git a/src/server.c b/src/server.c\nindex 73b65996d..be8c6ffcf 100644\n--- a/src/server.c\n+++ b/src/server.c\n@@ -1129,7 +1129,7 @@ server_recv_cb(EV_P_ ev_io *w, int revents)\n             return;\n         }\n \n-        port = ntohs(load16_be(server->buf->data + offset));\n+        port = *(uint16_t*)(server->buf->data + offset);\n \n         offset += 2;\n \ndiff --git a/src/udprelay.c b/src/udprelay.c\nindex 5de38830a..f6a5a7c25 100644\n--- a/src/udprelay.c\n+++ b/src/udprelay.c\n@@ -316,7 +316,7 @@ parse_udprelay_header(const char *buf, const size_t buf_len,\n     }\n \n     if (port != NULL) {\n-        sprintf(port, \"%d\", load16_be(buf + offset));\n+        sprintf(port, \"%d\", ntohs(*(uint16_t*)(buf + offset)));\n     }\n     offset += 2;\n \ndiff --git a/src/utils.c b/src/utils.c\nindex d3ff2aba6..c7a5f0aa6 100644\n--- a/src/utils.c\n+++ b/src/utils.c\n@@ -571,14 +571,6 @@ get_default_conf(void)\n #endif\n }\n \n-uint16_t\n-load16_be(const void *s)\n-{\n-    const uint8_t *in = (const uint8_t *)s;\n-    return ((uint16_t)in[0] << 8)\n-           | ((uint16_t)in[1]);\n-}\n-\n int\n get_mptcp(int enable)\n {\ndiff --git a/src/utils.h b/src/utils.h\nindex 1df24c166..c20506da9 100644\n--- a/src/utils.h\n+++ b/src/utils.h\n@@ -249,7 +249,6 @@ void *ss_realloc(void *ptr, size_t new_size);\n \n int ss_is_ipv6addr(const char *addr);\n char *get_default_conf(void);\n-uint16_t load16_be(const void *s);\n int get_mptcp(int enable);\n \n #endif // _UTILS_H\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocks-rust/Makefile",
    "content": "# SPDX-License-Identifier: GPL-2.0-only\n#\n# Copyright (C) 2017-2020 Yousong Zhou <yszhou4tech@gmail.com>\n# Copyright (C) 2021-2023 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=shadowsocks-rust\nPKG_VERSION:=1.24.0\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/shadowsocks/shadowsocks-rust/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=a89865d1c5203de1b732017dd032e85f943d1592e8d3152eb7d2c4f3fca387bf\n\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILES:=LICENSE\n\nPKG_BUILD_DEPENDS:=rust/host\nPKG_BUILD_PARALLEL:=1\n\nRUST_PKG_FEATURES:=local-redir\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/rust/rust-package.mk\n\ndefine Package/shadowsocks-rust/Default\n  define Package/shadowsocks-rust-$(1)\n    SECTION:=net\n    CATEGORY:=Network\n    SUBMENU:=Web Servers/Proxies\n    TITLE:=shadowsocks-rust $(1)\n    URL:=https://github.com/shadowsocks/shadowsocks-rust\n    DEPENDS:=$$(RUST_ARCH_DEPENDS)\n  endef\n\n  define Package/shadowsocks-rust-$(1)/install\n\t$$(INSTALL_DIR) $$(1)/usr/bin\n\t$$(INSTALL_BIN) $$(PKG_INSTALL_DIR)/bin/$(1) $$(1)/usr/bin/\n  endef\nendef\n\nSHADOWSOCKS_COMPONENTS:=sslocal ssmanager ssserver ssurl ssservice\ndefine shadowsocks-rust/templates\n  $(foreach component,$(SHADOWSOCKS_COMPONENTS),\n    $(call Package/shadowsocks-rust/Default,$(component))\n  )\nendef\n$(eval $(call shadowsocks-rust/templates))\n\n$(foreach component,$(SHADOWSOCKS_COMPONENTS), \\\n  $(eval $(call BuildPackage,shadowsocks-rust-$(component))) \\\n)\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/Makefile",
    "content": "# SPDX-License-Identifier: GPL-2.0-only\n#\n# Copyright (C) 2017-2020 Yousong Zhou <yszhou4tech@gmail.com>\n# Copyright (C) 2018 Lean <coolsnowwolf@gmail.com>\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=shadowsocksr-libev\nPKG_VERSION:=2.5.6\nPKG_RELEASE:=11\n\nPKG_SOURCE_PROTO:=git\nPKG_SOURCE_URL:=https://github.com/shadowsocksrr/shadowsocksr-libev\nPKG_SOURCE_DATE:=2018-03-07\nPKG_SOURCE_VERSION:=d63ff863800a5645aca4309d5dd5962bd1e95543\nPKG_MIRROR_HASH:=146fa4511a52da2aaa1e11ea0294cfb450e62643156c5da3b10e037ef43961f6\n\nPKG_LICENSE:=GPL-3.0\nPKG_LICENSE_FILES:=LICENSE\n\nPKG_FIXUP:=autoreconf\nPKG_USE_MIPS16:=0\nPKG_BUILD_FLAGS:=no-mips16\nPKG_BUILD_PARALLEL:=1\nPKG_INSTALL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/shadowsocksr-libev/Default\n  define Package/shadowsocksr-libev-ssr-$(1)\n    SECTION:=net\n    CATEGORY:=Network\n    SUBMENU:=Web Servers/Proxies\n    TITLE:=shadowsocksr-libev ssr-$(1)\n    URL:=https://github.com/shadowsocksrr/shadowsocksr-libev\n    DEPENDS:=+libev +libsodium +libopenssl +libpthread +libpcre2 +libudns +zlib\n  endef\n\n  define Package/shadowsocksr-libev-ssr-$(1)/install\n\t$$(INSTALL_DIR) $$(1)/usr/bin\n\t$$(INSTALL_BIN) $$(PKG_INSTALL_DIR)/usr/bin/ss-$(1) $$(1)/usr/bin/ssr-$(1)\n  endef\nendef\n\nSHADOWSOCKSR_COMPONENTS:=check local nat redir server\ndefine shadowsocksr-libev/templates\n  $(foreach component,$(SHADOWSOCKSR_COMPONENTS),\n    $(call Package/shadowsocksr-libev/Default,$(component))\n  )\nendef\n$(eval $(call shadowsocksr-libev/templates))\n\nCONFIGURE_ARGS += \\\n\t--disable-documentation \\\n\t--disable-ssp \\\n\t--disable-assert \\\n\t--enable-system-shared-lib\n\nTARGET_CFLAGS += -flto\nTARGET_LDFLAGS += -Wl,--gc-sections,--as-needed\n\n$(foreach component,$(SHADOWSOCKSR_COMPONENTS), \\\n  $(eval $(call BuildPackage,shadowsocksr-libev-ssr-$(component))) \\\n)\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/patches/0001-Add-ss-server-and-ss-check.patch",
    "content": "--- a/.gitignore\n+++ b/.gitignore\n@@ -2,6 +2,7 @@ build/\n .deps/\n /Makefile\n src/Makefile\n+server/Makefile\n libev/Makefile\n libudns/Makefile\n libcork/Makefile\n--- a/Makefile.am\n+++ b/Makefile.am\n@@ -1,7 +1,7 @@\n if USE_SYSTEM_SHARED_LIB\n-SUBDIRS = libcork libipset src\n+SUBDIRS = libcork libipset src server\n else\n-SUBDIRS = libsodium libcork libipset libudns libev src\n+SUBDIRS = libsodium libcork libipset libudns libev src server\n endif\n \n if ENABLE_DOCUMENTATION\n--- a/Makefile.in\n+++ b/Makefile.in\n@@ -195,7 +195,7 @@ am__define_uniq_tagged_files = \\\n ETAGS = etags\n CTAGS = ctags\n CSCOPE = cscope\n-DIST_SUBDIRS = libsodium libcork libipset libudns libev src doc\n+DIST_SUBDIRS = libsodium libcork libipset libudns libev src server doc\n am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/config.h.in \\\n \t$(srcdir)/shadowsocks-libev.pc.in $(top_srcdir)/auto/ar-lib \\\n \t$(top_srcdir)/auto/compile $(top_srcdir)/auto/config.guess \\\n@@ -377,8 +377,9 @@ top_build_prefix = @top_build_prefix@\n top_builddir = @top_builddir@\n top_srcdir = @top_srcdir@\n @USE_SYSTEM_SHARED_LIB_FALSE@SUBDIRS = libsodium libcork libipset \\\n-@USE_SYSTEM_SHARED_LIB_FALSE@\tlibudns libev src $(am__append_1)\n-@USE_SYSTEM_SHARED_LIB_TRUE@SUBDIRS = libcork libipset src \\\n+@USE_SYSTEM_SHARED_LIB_FALSE@\tlibudns libev src server \\\n+@USE_SYSTEM_SHARED_LIB_FALSE@\t$(am__append_1)\n+@USE_SYSTEM_SHARED_LIB_TRUE@SUBDIRS = libcork libipset src server \\\n @USE_SYSTEM_SHARED_LIB_TRUE@\t$(am__append_1)\n ACLOCAL_AMFLAGS = -I m4\n pkgconfiglibdir = $(libdir)/pkgconfig\n--- a/configure\n+++ b/configure\n@@ -649,7 +649,6 @@ PTHREAD_CC\n ax_pthread_config\n INET_NTOP_LIB\n MV\n-RM\n GZIP\n XMLTO\n ASCIIDOC\n@@ -757,6 +756,7 @@ infodir\n docdir\n oldincludedir\n includedir\n+runstatedir\n localstatedir\n sharedstatedir\n sysconfdir\n@@ -857,6 +857,7 @@ datadir='${datarootdir}'\n sysconfdir='${prefix}/etc'\n sharedstatedir='${prefix}/com'\n localstatedir='${prefix}/var'\n+runstatedir='${localstatedir}/run'\n includedir='${prefix}/include'\n oldincludedir='/usr/include'\n docdir='${datarootdir}/doc/${PACKAGE_TARNAME}'\n@@ -1109,6 +1110,15 @@ do\n   | -silent | --silent | --silen | --sile | --sil)\n     silent=yes ;;\n \n+  -runstatedir | --runstatedir | --runstatedi | --runstated \\\n+  | --runstate | --runstat | --runsta | --runst | --runs \\\n+  | --run | --ru | --r)\n+    ac_prev=runstatedir ;;\n+  -runstatedir=* | --runstatedir=* | --runstatedi=* | --runstated=* \\\n+  | --runstate=* | --runstat=* | --runsta=* | --runst=* | --runs=* \\\n+  | --run=* | --ru=* | --r=*)\n+    runstatedir=$ac_optarg ;;\n+\n   -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb)\n     ac_prev=sbindir ;;\n   -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \\\n@@ -1246,7 +1256,7 @@ fi\n for ac_var in\texec_prefix prefix bindir sbindir libexecdir datarootdir \\\n \t\tdatadir sysconfdir sharedstatedir localstatedir includedir \\\n \t\toldincludedir docdir infodir htmldir dvidir pdfdir psdir \\\n-\t\tlibdir localedir mandir\n+\t\tlibdir localedir mandir runstatedir\n do\n   eval ac_val=\\$$ac_var\n   # Remove trailing slashes.\n@@ -1399,6 +1409,7 @@ Fine tuning of the installation director\n   --sysconfdir=DIR        read-only single-machine data [PREFIX/etc]\n   --sharedstatedir=DIR    modifiable architecture-independent data [PREFIX/com]\n   --localstatedir=DIR     modifiable single-machine data [PREFIX/var]\n+  --runstatedir=DIR       modifiable per-process data [LOCALSTATEDIR/run]\n   --libdir=DIR            object code libraries [EPREFIX/lib]\n   --includedir=DIR        C header files [PREFIX/include]\n   --oldincludedir=DIR     C header files for non-gcc [/usr/include]\n@@ -2472,8 +2483,8 @@ ac_configure=\"$SHELL $ac_aux_dir/configu\n \n \n \n-# expand $ac_aux_dir to an absolute path\n-am_aux_dir=`cd $ac_aux_dir && pwd`\n+# Expand $ac_aux_dir to an absolute path.\n+am_aux_dir=`cd \"$ac_aux_dir\" && pwd`\n \n ac_ext=c\n ac_cpp='$CPP $CPPFLAGS'\n@@ -3783,7 +3794,7 @@ $as_echo \"$ac_cv_safe_to_define___extens\n \n \n \n-am__api_version='1.14'\n+am__api_version='1.15'\n \n # Find a good install program.  We prefer a C program (faster),\n # so one script is as good as another.  But avoid the broken or\n@@ -3972,7 +3983,7 @@ else\n $as_echo \"$as_me: WARNING: 'missing' script is too old or missing\" >&2;}\n fi\n \n-if test x\"${install_sh}\" != xset; then\n+if test x\"${install_sh+set}\" != xset; then\n   case $am_aux_dir in\n   *\\ * | *\\\t*)\n     install_sh=\"\\${SHELL} '$am_aux_dir/install-sh'\" ;;\n@@ -4363,8 +4374,8 @@ MAKEINFO=${MAKEINFO-\"${am_missing_run}ma\n # <http://lists.gnu.org/archive/html/automake/2012-07/msg00014.html>\n mkdir_p='$(MKDIR_P)'\n \n-# We need awk for the \"check\" target.  The system \"awk\" is bad on\n-# some platforms.\n+# We need awk for the \"check\" target (and possibly the TAP driver).  The\n+# system \"awk\" is bad on some platforms.\n # Always define AMTAR for backward compatibility.  Yes, it's still used\n # in the wild :-(  We should find a proper way to deprecate it ...\n AMTAR='$${TAR-tar}'\n@@ -4549,6 +4560,7 @@ END\n     as_fn_error $? \"Your 'rm' program is bad, sorry.\" \"$LINENO\" 5\n   fi\n fi\n+\n if test -n \"$ac_tool_prefix\"; then\n   for ac_prog in ar lib \"link -lib\"\n   do\n@@ -12494,47 +12506,6 @@ $as_echo \"no\" >&6; }\n fi\n \n \n-  # Extract the first word of \"rm\", so it can be a program name with args.\n-set dummy rm; ac_word=$2\n-{ $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n-$as_echo_n \"checking for $ac_word... \" >&6; }\n-if ${ac_cv_path_RM+:} false; then :\n-  $as_echo_n \"(cached) \" >&6\n-else\n-  case $RM in\n-  [\\\\/]* | ?:[\\\\/]*)\n-  ac_cv_path_RM=\"$RM\" # Let the user override the test with a path.\n-  ;;\n-  *)\n-  as_save_IFS=$IFS; IFS=$PATH_SEPARATOR\n-for as_dir in $PATH\n-do\n-  IFS=$as_save_IFS\n-  test -z \"$as_dir\" && as_dir=.\n-    for ac_exec_ext in '' $ac_executable_extensions; do\n-  if as_fn_executable_p \"$as_dir/$ac_word$ac_exec_ext\"; then\n-    ac_cv_path_RM=\"$as_dir/$ac_word$ac_exec_ext\"\n-    $as_echo \"$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext\" >&5\n-    break 2\n-  fi\n-done\n-  done\n-IFS=$as_save_IFS\n-\n-  test -z \"$ac_cv_path_RM\" && ac_cv_path_RM=\"rm\"\n-  ;;\n-esac\n-fi\n-RM=$ac_cv_path_RM\n-if test -n \"$RM\"; then\n-  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: $RM\" >&5\n-$as_echo \"$RM\" >&6; }\n-else\n-  { $as_echo \"$as_me:${as_lineno-$LINENO}: result: no\" >&5\n-$as_echo \"no\" >&6; }\n-fi\n-\n-\n   # Extract the first word of \"mv\", so it can be a program name with args.\n set dummy mv; ac_word=$2\n { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for $ac_word\" >&5\n@@ -16204,15 +16175,162 @@ $as_echo \"#define HAVE_IPv6 1\" >>confdef\n \n \n if test -z \"$USE_SYSTEM_SHARED_LIB_TRUE\"; then :\n-  else\n+\n+    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for sodium_init in -lsodium\" >&5\n+$as_echo_n \"checking for sodium_init in -lsodium... \" >&6; }\n+if ${ac_cv_lib_sodium_sodium_init+:} false; then :\n+  $as_echo_n \"(cached) \" >&6\n+else\n+  ac_check_lib_save_LIBS=$LIBS\n+LIBS=\"-lsodium  $LIBS\"\n+cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n+/* end confdefs.h.  */\n+\n+/* Override any GCC internal prototype to avoid an error.\n+   Use char because int might match the return type of a GCC\n+   builtin and then its argument prototype would still apply.  */\n+#ifdef __cplusplus\n+extern \"C\"\n+#endif\n+char sodium_init ();\n+int\n+main ()\n+{\n+return sodium_init ();\n+  ;\n+  return 0;\n+}\n+_ACEOF\n+if ac_fn_c_try_link \"$LINENO\"; then :\n+  ac_cv_lib_sodium_sodium_init=yes\n+else\n+  ac_cv_lib_sodium_sodium_init=no\n+fi\n+rm -f core conftest.err conftest.$ac_objext \\\n+    conftest$ac_exeext conftest.$ac_ext\n+LIBS=$ac_check_lib_save_LIBS\n+fi\n+{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_sodium_sodium_init\" >&5\n+$as_echo \"$ac_cv_lib_sodium_sodium_init\" >&6; }\n+if test \"x$ac_cv_lib_sodium_sodium_init\" = xyes; then :\n+  cat >>confdefs.h <<_ACEOF\n+#define HAVE_LIBSODIUM 1\n+_ACEOF\n+\n+  LIBS=\"-lsodium $LIBS\"\n+\n+else\n+\n+       as_fn_error $? \"Couldn't find libsodium. Try installing libsodium-dev[el].\" \"$LINENO\" 5\n+\n+fi\n+\n+\n+else\n   subdirs=\"$subdirs libsodium\"\n \n fi\n \n-ac_config_files=\"$ac_config_files shadowsocks-libev.pc Makefile libcork/Makefile libipset/Makefile src/Makefile\"\n+ac_config_files=\"$ac_config_files shadowsocks-libev.pc Makefile libcork/Makefile libipset/Makefile src/Makefile server/Makefile\"\n \n if test -z \"$USE_SYSTEM_SHARED_LIB_TRUE\"; then :\n-  else\n+\n+    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for dns_dnlen in -ludns\" >&5\n+$as_echo_n \"checking for dns_dnlen in -ludns... \" >&6; }\n+if ${ac_cv_lib_udns_dns_dnlen+:} false; then :\n+  $as_echo_n \"(cached) \" >&6\n+else\n+  ac_check_lib_save_LIBS=$LIBS\n+LIBS=\"-ludns  $LIBS\"\n+cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n+/* end confdefs.h.  */\n+\n+/* Override any GCC internal prototype to avoid an error.\n+   Use char because int might match the return type of a GCC\n+   builtin and then its argument prototype would still apply.  */\n+#ifdef __cplusplus\n+extern \"C\"\n+#endif\n+char dns_dnlen ();\n+int\n+main ()\n+{\n+return dns_dnlen ();\n+  ;\n+  return 0;\n+}\n+_ACEOF\n+if ac_fn_c_try_link \"$LINENO\"; then :\n+  ac_cv_lib_udns_dns_dnlen=yes\n+else\n+  ac_cv_lib_udns_dns_dnlen=no\n+fi\n+rm -f core conftest.err conftest.$ac_objext \\\n+    conftest$ac_exeext conftest.$ac_ext\n+LIBS=$ac_check_lib_save_LIBS\n+fi\n+{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_udns_dns_dnlen\" >&5\n+$as_echo \"$ac_cv_lib_udns_dns_dnlen\" >&6; }\n+if test \"x$ac_cv_lib_udns_dns_dnlen\" = xyes; then :\n+  cat >>confdefs.h <<_ACEOF\n+#define HAVE_LIBUDNS 1\n+_ACEOF\n+\n+  LIBS=\"-ludns $LIBS\"\n+\n+else\n+  as_fn_error $? \"Couldn't find libudns. Try installing libudns-dev or udns-devel.\" \"$LINENO\" 5\n+fi\n+\n+    { $as_echo \"$as_me:${as_lineno-$LINENO}: checking for ev_loop_destroy in -lev\" >&5\n+$as_echo_n \"checking for ev_loop_destroy in -lev... \" >&6; }\n+if ${ac_cv_lib_ev_ev_loop_destroy+:} false; then :\n+  $as_echo_n \"(cached) \" >&6\n+else\n+  ac_check_lib_save_LIBS=$LIBS\n+LIBS=\"-lev  $LIBS\"\n+cat confdefs.h - <<_ACEOF >conftest.$ac_ext\n+/* end confdefs.h.  */\n+\n+/* Override any GCC internal prototype to avoid an error.\n+   Use char because int might match the return type of a GCC\n+   builtin and then its argument prototype would still apply.  */\n+#ifdef __cplusplus\n+extern \"C\"\n+#endif\n+char ev_loop_destroy ();\n+int\n+main ()\n+{\n+return ev_loop_destroy ();\n+  ;\n+  return 0;\n+}\n+_ACEOF\n+if ac_fn_c_try_link \"$LINENO\"; then :\n+  ac_cv_lib_ev_ev_loop_destroy=yes\n+else\n+  ac_cv_lib_ev_ev_loop_destroy=no\n+fi\n+rm -f core conftest.err conftest.$ac_objext \\\n+    conftest$ac_exeext conftest.$ac_ext\n+LIBS=$ac_check_lib_save_LIBS\n+fi\n+{ $as_echo \"$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_ev_ev_loop_destroy\" >&5\n+$as_echo \"$ac_cv_lib_ev_ev_loop_destroy\" >&6; }\n+if test \"x$ac_cv_lib_ev_ev_loop_destroy\" = xyes; then :\n+  cat >>confdefs.h <<_ACEOF\n+#define HAVE_LIBEV 1\n+_ACEOF\n+\n+  LIBS=\"-lev $LIBS\"\n+\n+else\n+  as_fn_error $? \"Couldn't find libev. Try installing libev-dev[el].\" \"$LINENO\" 5\n+fi\n+\n+\n+else\n   ac_config_files=\"$ac_config_files libudns/Makefile libev/Makefile\"\n \n fi\n@@ -17258,6 +17376,7 @@ do\n     \"libcork/Makefile\") CONFIG_FILES=\"$CONFIG_FILES libcork/Makefile\" ;;\n     \"libipset/Makefile\") CONFIG_FILES=\"$CONFIG_FILES libipset/Makefile\" ;;\n     \"src/Makefile\") CONFIG_FILES=\"$CONFIG_FILES src/Makefile\" ;;\n+    \"server/Makefile\") CONFIG_FILES=\"$CONFIG_FILES server/Makefile\" ;;\n     \"libudns/Makefile\") CONFIG_FILES=\"$CONFIG_FILES libudns/Makefile\" ;;\n     \"libev/Makefile\") CONFIG_FILES=\"$CONFIG_FILES libev/Makefile\" ;;\n     \"doc/Makefile\") CONFIG_FILES=\"$CONFIG_FILES doc/Makefile\" ;;\n@@ -17958,8 +18077,8 @@ $as_echo X\"$file\" |\n     fi\n \n     cfgfile=\"${ofile}T\"\n-    trap \"$RM -f \\\"$cfgfile\\\"; exit 1\" 1 2 15\n-    $RM -f \"$cfgfile\"\n+    trap \"$RM \\\"$cfgfile\\\"; exit 1\" 1 2 15\n+    $RM \"$cfgfile\"\n \n     cat <<_LT_EOF >> \"$cfgfile\"\n #! $SHELL\n--- a/configure.ac\n+++ b/configure.ac\n@@ -315,7 +315,8 @@ AC_CONFIG_FILES([ shadowsocks-libev.pc\n                  Makefile\n                  libcork/Makefile\n                  libipset/Makefile\n-                 src/Makefile])\n+                 src/Makefile\n+\t\t server/Makefile])\n AM_COND_IF([USE_SYSTEM_SHARED_LIB],[\n     AC_CHECK_LIB([udns], [dns_dnlen], ,[AC_MSG_ERROR([Couldn't find libudns. Try installing libudns-dev or udns-devel.])])\n     AC_CHECK_LIB([ev], [ev_loop_destroy], ,[AC_MSG_ERROR([Couldn't find libev. Try installing libev-dev@<:@el@:>@.])])\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/patches/0002-Revert-verify_simple-and-auth_simple.patch",
    "content": "--- a/src/obfs/obfs.c\n+++ b/src/obfs/obfs.c\n@@ -88,7 +88,7 @@ obfs_class *new_obfs_class(const char *p\n         plugin->client_decode = tls12_ticket_auth_client_decode;\n \n         return plugin;\n-        /*} else if (strcmp(plugin_name, \"verify_simple\") == 0) {\n+        } else if (strcmp(plugin_name, \"verify_simple\") == 0) {\n             obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs_class));\n             plugin->init_data = init_data;\n             plugin->new_obfs = verify_simple_new_obfs;\n@@ -115,7 +115,7 @@ obfs_class *new_obfs_class(const char *p\n             plugin->client_udp_pre_encrypt = NULL;\n             plugin->client_udp_post_decrypt = NULL;\n \n-            return plugin;*/\n+            return plugin;\n     } else if (strcmp(plugin_name, \"auth_sha1\") == 0) {\n         obfs_class *plugin = (obfs_class *) malloc(sizeof(obfs_class));\n         plugin->init_data = auth_simple_init_data;\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/patches/0003-Refine-Usage.patch",
    "content": "--- a/src/utils.c\n+++ b/src/utils.c\n@@ -258,8 +258,6 @@ usage()\n {\n     printf(\"\\n\");\n     printf(\"shadowsocks-libev %s with %s\\n\\n\", VERSION, USING_CRYPTO);\n-    printf(\n-        \"  maintained by Max Lv <max.c.lv@gmail.com> and Linus Yang <laokongzi@gmail.com>\\n\\n\");\n     printf(\"  usage:\\n\\n\");\n #ifdef MODULE_LOCAL\n     printf(\"    ss-local\\n\");\n@@ -299,6 +297,25 @@ usage()\n         \"                                  The default cipher is rc4-md5.\\n\");\n     printf(\"\\n\");\n     printf(\n+        \"       -o <obfs>                  Obfs of your remote server: plain,\\n\");\n+    printf(\n+        \"                                  http_simple, http_post and tls1.2_ticket_auth.\\n\");\n+    printf(\n+        \"       -g <obfs-param>            Obfs-Param of your remote server.\\n\");\n+    printf(\n+        \"       -O <protocol>              Protocol of your remote server: origin,\\n\");\n+    printf(\n+        \"                                  auth_sha1, auth_sha1_v2, auth_sha1_v4,\\n\");\n+    printf(\n+        \"                                  auth_aes128_md5, auth_aes128_sha1,\\n\");\n+    printf(\n+        \"                                  auth_chain_a, auth_chain_b, auth_chain_c,\\n\");\n+    printf(\n+        \"                                  auth_chain_d, auth_chain_e and auth_chain_f.\\n\");\n+    printf(\n+        \"       -G <protocol-param>        Protocol-Param of your remote server.\\n\");\n+    printf(\"\\n\");\n+    printf(\n         \"       [-a <user>]                Run as another user.\\n\");\n     printf(\n         \"       [-f <pid_file>]            The file path to store pid.\\n\");\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/patches/100-fix-gcc-10.patch",
    "content": "--- a/src/http.h\n+++ b/src/http.h\n@@ -29,6 +29,6 @@\n #include <stdio.h>\n #include \"protocol.h\"\n \n-const protocol_t *const http_protocol;\n+extern const protocol_t *const http_protocol;\n \n #endif\n--- a/src/tls.h\n+++ b/src/tls.h\n@@ -28,6 +28,6 @@\n \n #include \"protocol.h\"\n \n-const protocol_t *const tls_protocol;\n+extern const protocol_t *const tls_protocol;\n \n #endif\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/patches/101-Fix-Werror-sizeof-pointer-memaccess.patch",
    "content": "--- a/src/local.c\n+++ b/src/local.c\n@@ -718,7 +718,7 @@ server_recv_cb(EV_P_ ev_io *w, int reven\n \r\n                     ss_free(hostname);\r\n                 } else {\r\n-                    strncpy(host, ip, sizeof(ip));\r\n+                    strncpy(host, ip, INET6_ADDRSTRLEN);\r\n                 }\r\n             }\r\n \r\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/patches/102-Read-listening-mode-from-config.patch",
    "content": "--- a/src/jconf.c\n+++ b/src/jconf.c\n@@ -259,6 +259,19 @@ read_jconf(const char *file)\n                     conf.server_legacy.obfs = to_string(value);\n                 } else if (strcmp(name, \"obfs_param\") == 0) { // SSR\n                     conf.server_legacy.obfs_param = to_string(value);\n+                } else if (strcmp(name, \"mode\") == 0) {\n+                    char *mode_str = to_string(value);\n+\n+                    if (strcmp(mode_str, \"tcp_only\") == 0)\n+                        conf.mode = TCP_ONLY;\n+                    else if (strcmp(mode_str, \"tcp_and_udp\") == 0)\n+                        conf.mode = TCP_AND_UDP;\n+                    else if (strcmp(mode_str, \"udp_only\") == 0)\n+                        conf.mode = UDP_ONLY;\n+                    else\n+                        LOGI(\"ignore unknown mode: %s, use tcp_only as fallback\",\n+                             mode_str);\n+                    ss_free(mode_str);\n                 } else {\n                     match = 0;\n                 }\n--- a/src/redir.c\n+++ b/src/redir.c\n@@ -1252,6 +1252,9 @@ main(int argc, char **argv)\n         if (user == NULL) {\n             user = conf->user;\n         }\n+        if (mode == TCP_ONLY) {\n+            mode = conf->mode;\n+        }\n         if (mtu == 0) {\n             mtu = conf->mtu;\n         }\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/patches/103-Add-TPROXY-support-for-TCP-ssr-redir.patch",
    "content": "--- a/completions/bash/ss-redir\n+++ b/completions/bash/ss-redir\n@@ -2,7 +2,7 @@ _ss_redir()\n {\n     local cur prev opts ciphers\n     ciphers='rc4-md5 table rc4 aes-128-cfb aes-192-cfb aes-256-cfb aes-128-ctr aes-192-ctr aes-256-ctr bf-cfb camellia-128-cfb camellia-192-cfb camellia-256-cfb cast5-cfb des-cfb idea-cfb rc2-cfb seed-cfb salsa20 chacha20 and chacha20-ietf'\n-    opts='-s -b -p -k -f -t -m -c -a -n -u -U -v -h -A --mtu --help --mptcp -l'\n+    opts='-s -b -p -k -f -t -m -c -a -n -u -U -T -v -h -A --mtu --help --mptcp -l'\n     cur=${COMP_WORDS[COMP_CWORD]}\n     prev=\"${COMP_WORDS[COMP_CWORD-1]}\"\n     case \"$prev\" in\n--- a/src/jconf.c\n+++ b/src/jconf.c\n@@ -338,7 +338,11 @@ read_jconf(const char *file)\n                     check_json_value_type(value, json_boolean,\n                                           \"invalid config file: option 'ipv6_first' must be a boolean\");\n                     conf.ipv6_first = value->u.boolean;\n-                }\n+                } else if (strcmp(name, \"tcp_tproxy\") == 0) {\n+                    check_json_value_type(value, json_boolean,\n+                                          \"invalid config file: option 'tcp_tproxy' must be a boolean\");\n+\t\t\t\t\tconf.tcp_tproxy = value->u.boolean;\n+\t\t\t\t}\n             }\n         }\n     } else {\n--- a/src/jconf.h\n+++ b/src/jconf.h\n@@ -105,6 +105,7 @@ typedef struct {\n     int mtu;\n     int mptcp;\n     int ipv6_first;\n+\tint tcp_tproxy;\n } jconf_t;\n \n jconf_t *read_jconf(const char *file);\n--- a/src/redir.c\n+++ b/src/redir.c\n@@ -71,6 +71,14 @@\n #define IP6T_SO_ORIGINAL_DST 80\n #endif\n \n+#ifndef IP_TRANSPARENT\n+#define IP_TRANSPARENT       19\n+#endif\n+\n+#ifndef IPV6_TRANSPARENT\n+#define IPV6_TRANSPARENT     75\n+#endif\n+\n #include \"includeobfs.h\" // I don't want to modify makefile\n #include \"jconf.h\"\n \n@@ -101,18 +109,28 @@ static struct cork_dllist inactive_profi\n static listen_ctx_t *current_profile;\n static struct cork_dllist all_connections;\n \n+static int tcp_tproxy = 0; /* use tproxy instead of redirect (for tcp) */\n+\n int\n getdestaddr(int fd, struct sockaddr_storage *destaddr)\n {\n     socklen_t socklen = sizeof(*destaddr);\n     int error         = 0;\n \n-    error = getsockopt(fd, SOL_IPV6, IP6T_SO_ORIGINAL_DST, destaddr, &socklen);\n-    if (error) { // Didn't find a proper way to detect IP version.\n-        error = getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, destaddr, &socklen);\n-        if (error) {\n-            return -1;\n-        }\n+\tif (tcp_tproxy) {\n+        error = getsockname(fd, (void *)destaddr, &socklen);\n+    } else {\n+\t\terror = getsockopt(fd, SOL_IPV6, IP6T_SO_ORIGINAL_DST, destaddr, &socklen);\n+\t\tif (error) { // Didn't find a proper way to detect IP version.\n+\t\t\terror = getsockopt(fd, SOL_IP, SO_ORIGINAL_DST, destaddr, &socklen);\n+\t\t\tif (error) {\n+\t\t\t\treturn -1;\n+\t\t\t}\n+\t\t}\n+\t}\n+\t\n+\tif (error) {\n+        return -1;\n     }\n     return 0;\n }\n@@ -164,6 +182,23 @@ create_and_bind(const char *addr, const\n         if (err == 0) {\n             LOGI(\"tcp port reuse enabled\");\n         }\n+\t\t\n+\t\tif (tcp_tproxy) {\n+            int level = 0, optname = 0;\n+            if (rp->ai_family == AF_INET) {\n+                level = IPPROTO_IP;\n+                optname = IP_TRANSPARENT;\n+            } else {\n+                level = IPPROTO_IPV6;\n+                optname = IPV6_TRANSPARENT;\n+            }\n+\n+            if (setsockopt(listen_sock, level, optname, &opt, sizeof(opt)) != 0) {\n+                ERROR(\"setsockopt IP_TRANSPARENT\");\n+                exit(EXIT_FAILURE);\n+            }\n+            LOGI(\"tcp tproxy mode enabled\");\n+        }\n \n         s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);\n         if (s == 0) {\n@@ -1094,7 +1129,7 @@ main(int argc, char **argv)\n \n     USE_TTY();\n \n-    while ((c = getopt_long(argc, argv, \"f:s:p:l:k:t:m:c:b:a:n:huUvA6\"\n+    while ((c = getopt_long(argc, argv, \"f:s:p:l:k:t:m:c:b:a:n:huUTvA6\"\n                             \"O:o:G:g:\",\n                             long_options, &option_index)) != -1) {\n         switch (c) {\n@@ -1169,6 +1204,9 @@ main(int argc, char **argv)\n         case 'U':\n             mode = UDP_ONLY;\n             break;\n+\t\tcase 'T':\n+            tcp_tproxy = 1;\n+            break;\n         case 'v':\n             verbose = 1;\n             break;\n@@ -1255,6 +1293,9 @@ main(int argc, char **argv)\n         if (mode == TCP_ONLY) {\n             mode = conf->mode;\n         }\n+\t\tif (tcp_tproxy == 0) {\n+            tcp_tproxy = conf->tcp_tproxy;\n+        }\n         if (mtu == 0) {\n             mtu = conf->mtu;\n         }\n--- a/src/utils.c\n+++ b/src/utils.c\n@@ -342,6 +342,10 @@ usage()\n #endif\n     printf(\n         \"       [-U]                       Enable UDP relay and disable TCP relay.\\n\");\n+#ifdef MODULE_REDIR\n+    printf(\n+        \"       [-T]                       Use tproxy instead of redirect (for tcp).\\n\");\n+#endif\n #ifdef MODULE_REMOTE\n     printf(\n         \"       [-6]                       Resovle hostname to IPv6 address first.\\n\");\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/patches/105-Upgrade-PCRE-to-PCRE2.patch",
    "content": "From 32f944b9a06fb2be4cd50da2434f2fd4b4decede Mon Sep 17 00:00:00 2001\nFrom: sbwml <984419930@qq.com>\nDate: Thu, 1 Feb 2024 21:21:56 +0800\nSubject: [PATCH] Upgrade PCRE to PCRE2\n\nSigned-off-by: sbwml <984419930@qq.com>\n---\n configure.ac |   8 +--\n m4/pcre.m4   | 152 ------------------------------------------\n m4/pcre2.m4  | 181 +++++++++++++++++++++++++++++++++++++++++++++++++++\n src/rule.c   |  47 ++++++++++---\n src/rule.h   |  22 +++++--\n 5 files changed, 238 insertions(+), 172 deletions(-)\n delete mode 100644 m4/pcre.m4\n create mode 100644 m4/pcre2.m4\n\n--- a/configure.ac\n+++ b/configure.ac\n@@ -20,10 +20,10 @@ AC_DISABLE_STATIC\n AC_DISABLE_SHARED\n LT_INIT([dlopen])\n \n-dnl Check for pcre library\n-TS_CHECK_PCRE\n-if test \"x${enable_pcre}\" != \"xyes\"; then\n-  AC_MSG_ERROR([Cannot find pcre library. Configure --with-pcre=DIR])\n+dnl Check for pcre2 library\n+TS_CHECK_PCRE2\n+if test \"x${enable_pcre2}\" != \"xyes\"; then\n+  AC_MSG_ERROR([Cannot find pcre2 library. Configure --with-pcre2=DIR])\n fi\n \n dnl Checks for using shared libraries from system\n--- a/m4/pcre.m4\n+++ /dev/null\n@@ -1,152 +0,0 @@\n-dnl -------------------------------------------------------- -*- autoconf -*-\n-dnl Licensed to the Apache Software Foundation (ASF) under one or more\n-dnl contributor license agreements.  See the NOTICE file distributed with\n-dnl this work for additional information regarding copyright ownership.\n-dnl The ASF licenses this file to You under the Apache License, Version 2.0\n-dnl (the \"License\"); you may not use this file except in compliance with\n-dnl the License.  You may obtain a copy of the License at\n-dnl\n-dnl     http://www.apache.org/licenses/LICENSE-2.0\n-dnl\n-dnl Unless required by applicable law or agreed to in writing, software\n-dnl distributed under the License is distributed on an \"AS IS\" BASIS,\n-dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n-dnl See the License for the specific language governing permissions and\n-dnl limitations under the License.\n-\n-dnl\n-dnl TS_ADDTO(variable, value)\n-dnl\n-dnl  Add value to variable\n-dnl\n-AC_DEFUN([TS_ADDTO], [\n-  if test \"x$$1\" = \"x\"; then\n-    test \"x$verbose\" = \"xyes\" && echo \"  setting $1 to \\\"$2\\\"\"\n-    $1=\"$2\"\n-  else\n-    ats_addto_bugger=\"$2\"\n-    for i in $ats_addto_bugger; do\n-      ats_addto_duplicate=\"0\"\n-      for j in $$1; do\n-        if test \"x$i\" = \"x$j\"; then\n-          ats_addto_duplicate=\"1\"\n-          break\n-        fi\n-      done\n-      if test $ats_addto_duplicate = \"0\"; then\n-        test \"x$verbose\" = \"xyes\" && echo \"  adding \\\"$i\\\" to $1\"\n-        $1=\"$$1 $i\"\n-      fi\n-    done\n-  fi\n-])dnl\n-\n-dnl\n-dnl TS_ADDTO_RPATH(path)\n-dnl\n-dnl   Adds path to variable with the '-rpath' directive.\n-dnl\n-AC_DEFUN([TS_ADDTO_RPATH], [\n-  AC_MSG_NOTICE([adding $1 to RPATH])\n-  TS_ADDTO(LIBTOOL_LINK_FLAGS, [-R$1])\n-])dnl\n-\n-dnl\n-dnl pcre.m4: Trafficserver's pcre autoconf macros\n-dnl\n-\n-dnl\n-dnl TS_CHECK_PCRE: look for pcre libraries and headers\n-dnl\n-AC_DEFUN([TS_CHECK_PCRE], [\n-enable_pcre=no\n-AC_ARG_WITH(pcre, [AC_HELP_STRING([--with-pcre=DIR],[use a specific pcre library])],\n-[\n-  if test \"x$withval\" != \"xyes\" && test \"x$withval\" != \"x\"; then\n-    pcre_base_dir=\"$withval\"\n-    if test \"$withval\" != \"no\"; then\n-      enable_pcre=yes\n-      case \"$withval\" in\n-      *\":\"*)\n-        pcre_include=\"`echo $withval |sed -e 's/:.*$//'`\"\n-        pcre_ldflags=\"`echo $withval |sed -e 's/^.*://'`\"\n-        AC_MSG_CHECKING(checking for pcre includes in $pcre_include libs in $pcre_ldflags )\n-        ;;\n-      *)\n-        pcre_include=\"$withval/include\"\n-        pcre_ldflags=\"$withval/lib\"\n-        AC_MSG_CHECKING(checking for pcre includes in $withval)\n-        ;;\n-      esac\n-    fi\n-  fi\n-],\n-[\n-  AC_CHECK_PROG(PCRE_CONFIG, pcre-config, pcre-config)\n-  if test \"x$PCRE_CONFIG\" != \"x\"; then\n-    enable_pcre=yes\n-    pcre_base_dir=\"`$PCRE_CONFIG --prefix`\"\n-    pcre_include=\"`$PCRE_CONFIG --cflags | sed -es/-I//`\"\n-    pcre_ldflags=\"`$PCRE_CONFIG --libs | sed -es/-lpcre// -es/-L//`\"\n-  fi\n-])\n-\n-if test \"x$pcre_base_dir\" = \"x\"; then\n-  AC_MSG_CHECKING([for pcre location])\n-  AC_CACHE_VAL(ats_cv_pcre_dir,[\n-  for dir in /usr/local /usr ; do\n-    if test -d $dir && ( test -f $dir/include/pcre.h || test -f $dir/include/pcre/pcre.h ); then\n-      ats_cv_pcre_dir=$dir\n-      break\n-    fi\n-  done\n-  ])\n-  pcre_base_dir=$ats_cv_pcre_dir\n-  if test \"x$pcre_base_dir\" = \"x\"; then\n-    enable_pcre=no\n-    AC_MSG_RESULT([not found])\n-  else\n-    enable_pcre=yes\n-    pcre_include=\"$pcre_base_dir/include\"\n-    pcre_ldflags=\"$pcre_base_dir/lib\"\n-    AC_MSG_RESULT([$pcre_base_dir])\n-  fi\n-else\n-  AC_MSG_CHECKING(for pcre headers in $pcre_include)\n-  if test -d $pcre_include && test -d $pcre_ldflags && ( test -f $pcre_include/pcre.h || test -f $pcre_include/pcre/pcre.h ); then\n-    AC_MSG_RESULT([ok])\n-  else\n-    AC_MSG_RESULT([not found])\n-  fi\n-fi\n-\n-pcreh=0\n-pcre_pcreh=0\n-if test \"$enable_pcre\" != \"no\"; then\n-  saved_ldflags=$LDFLAGS\n-  saved_cppflags=$CFLAGS\n-  pcre_have_headers=0\n-  pcre_have_libs=0\n-  if test \"$pcre_base_dir\" != \"/usr\"; then\n-    TS_ADDTO(CFLAGS, [-I${pcre_include}])\n-    TS_ADDTO(CFLAGS, [-DPCRE_STATIC])\n-    TS_ADDTO(LDFLAGS, [-L${pcre_ldflags}])\n-    TS_ADDTO_RPATH(${pcre_ldflags})\n-  fi\n-  AC_SEARCH_LIBS([pcre_exec], [pcre], [pcre_have_libs=1])\n-  if test \"$pcre_have_libs\" != \"0\"; then\n-    AC_CHECK_HEADERS(pcre.h, [pcre_have_headers=1])\n-    AC_CHECK_HEADERS(pcre/pcre.h, [pcre_have_headers=1])\n-  fi\n-  if test \"$pcre_have_headers\" != \"0\"; then\n-    AC_DEFINE(HAVE_LIBPCRE,1,[Compiling with pcre support])\n-    AC_SUBST(LIBPCRE, [-lpcre])\n-  else\n-    enable_pcre=no\n-    CFLAGS=$saved_cppflags\n-    LDFLAGS=$saved_ldflags\n-  fi\n-fi\n-AC_SUBST(pcreh)\n-AC_SUBST(pcre_pcreh)\n-])\n--- /dev/null\n+++ b/m4/pcre2.m4\n@@ -0,0 +1,181 @@\n+dnl -------------------------------------------------------- -*- autoconf -*-\n+dnl Licensed to the Apache Software Foundation (ASF) under one or more\n+dnl contributor license agreements.  See the NOTICE file distributed with\n+dnl this work for additional information regarding copyright ownership.\n+dnl The ASF licenses this file to You under the Apache License, Version 2.0\n+dnl (the \"License\"); you may not use this file except in compliance with\n+dnl the License.  You may obtain a copy of the License at\n+dnl\n+dnl     http://www.apache.org/licenses/LICENSE-2.0\n+dnl\n+dnl Unless required by applicable law or agreed to in writing, software\n+dnl distributed under the License is distributed on an \"AS IS\" BASIS,\n+dnl WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n+dnl See the License for the specific language governing permissions and\n+dnl limitations under the License.\n+\n+dnl Modified by Syrone Wong <wong.syrone@gmail.com> to support pcre2 8bit variant only\n+\n+dnl\n+dnl TS_ADDTO(variable, value)\n+dnl\n+dnl  Add value to variable\n+dnl\n+AC_DEFUN([TS_ADDTO], [\n+  if test \"x$$1\" = \"x\"; then\n+    test \"x$verbose\" = \"xyes\" && echo \"  setting $1 to \\\"$2\\\"\"\n+    $1=\"$2\"\n+  else\n+    ats_addto_bugger=\"$2\"\n+    for i in $ats_addto_bugger; do\n+      ats_addto_duplicate=\"0\"\n+      for j in $$1; do\n+        if test \"x$i\" = \"x$j\"; then\n+          ats_addto_duplicate=\"1\"\n+          break\n+        fi\n+      done\n+      if test $ats_addto_duplicate = \"0\"; then\n+        test \"x$verbose\" = \"xyes\" && echo \"  adding \\\"$i\\\" to $1\"\n+        $1=\"$$1 $i\"\n+      fi\n+    done\n+  fi\n+])dnl\n+\n+dnl\n+dnl TS_ADDTO_RPATH(path)\n+dnl\n+dnl   Adds path to variable with the '-rpath' directive.\n+dnl\n+AC_DEFUN([TS_ADDTO_RPATH], [\n+  AC_MSG_NOTICE([adding $1 to RPATH])\n+  TS_ADDTO(LIBTOOL_LINK_FLAGS, [-R$1])\n+])dnl\n+\n+dnl\n+dnl pcre2.m4: Trafficserver's pcre2 autoconf macros\n+dnl\n+\n+dnl\n+dnl TS_CHECK_PCRE2: look for pcre2 libraries and headers\n+dnl\n+AC_DEFUN([TS_CHECK_PCRE2], [\n+enable_pcre2=no\n+AC_ARG_WITH(pcre2, [AC_HELP_STRING([--with-pcre2=DIR],[use a specific pcre2 library])],\n+[\n+  if test \"x$withval\" != \"xyes\" && test \"x$withval\" != \"x\"; then\n+    pcre2_base_dir=\"$withval\"\n+    if test \"$withval\" != \"no\"; then\n+      enable_pcre2=yes\n+      case \"$withval\" in\n+      *\":\"*)\n+        pcre2_include=\"`echo $withval |sed -e 's/:.*$//'`\"\n+        pcre2_ldflags=\"`echo $withval |sed -e 's/^.*://'`\"\n+        AC_MSG_CHECKING(checking for pcre2 includes in $pcre2_include libs in $pcre2_ldflags )\n+        ;;\n+      *)\n+        pcre2_include=\"$withval/include\"\n+        pcre2_ldflags=\"$withval/lib\"\n+        AC_MSG_CHECKING(checking for pcre2 includes in $withval)\n+        ;;\n+      esac\n+    fi\n+  fi\n+],\n+[\n+  AC_CHECK_PROG(PCRE2_CONFIG, pcre2-config, pcre2-config)\n+  if test \"x$PCRE2_CONFIG\" != \"x\"; then\n+    enable_pcre2=yes\n+    pcre2_base_dir=\"`$PCRE2_CONFIG --prefix`\"\n+    pcre2_include=\"`$PCRE2_CONFIG --cflags | sed -es/-I//`\"\n+    pcre2_ldflags=\"`$PCRE2_CONFIG --libs8 | sed -es/-lpcre2-8// -es/-L//`\"\n+  fi\n+])\n+\n+if test \"x$pcre2_base_dir\" = \"x\"; then\n+  AC_MSG_CHECKING([for pcre2 location])\n+  AC_CACHE_VAL(ats_cv_pcre2_dir,[\n+  for dir in /usr/local /usr ; do\n+    if test -d $dir && ( test -f $dir/include/pcre2.h || test -f $dir/include/pcre2/pcre2.h ); then\n+      ats_cv_pcre2_dir=$dir\n+      break\n+    fi\n+  done\n+  ])\n+  pcre2_base_dir=$ats_cv_pcre2_dir\n+  if test \"x$pcre2_base_dir\" = \"x\"; then\n+    enable_pcre2=no\n+    AC_MSG_RESULT([not found])\n+  else\n+    enable_pcre2=yes\n+    pcre2_include=\"$pcre2_base_dir/include\"\n+    pcre2_ldflags=\"$pcre2_base_dir/lib\"\n+    AC_MSG_RESULT([$pcre2_base_dir])\n+  fi\n+else\n+  AC_MSG_CHECKING(for pcre2 headers in $pcre2_include)\n+  if test -d $pcre2_include && test -d $pcre2_ldflags && ( test -f $pcre2_include/pcre2.h || test -f $pcre2_include/pcre2/pcre2.h ); then\n+    AC_MSG_RESULT([ok])\n+  else\n+    AC_MSG_RESULT([not found])\n+  fi\n+fi\n+\n+pcre2h=0\n+pcre2_pcre2h=0\n+if test \"$enable_pcre2\" != \"no\"; then\n+  saved_ldflags=$LDFLAGS\n+  saved_cppflags=$CFLAGS\n+  pcre2_have_headers=0\n+  pcre2_have_libs=0\n+  if test \"$pcre2_base_dir\" != \"/usr\"; then\n+    TS_ADDTO(CFLAGS, [-I${pcre2_include}])\n+    TS_ADDTO(CFLAGS, [-DPCRE2_STATIC])\n+    TS_ADDTO(LDFLAGS, [-L${pcre2_ldflags}])\n+    TS_ADDTO_RPATH(${pcre2_ldflags})\n+  fi\n+  AC_SEARCH_LIBS([pcre2_match_8], [pcre2-8], [pcre2_have_libs=1])\n+  if test \"$pcre2_have_libs\" != \"0\"; then\n+      AC_MSG_CHECKING([pcre2.h])\n+  AC_COMPILE_IFELSE(\n+    [AC_LANG_PROGRAM(\n+      [[\n+#define PCRE2_CODE_UNIT_WIDTH 8\n+#include <pcre2.h>\n+      ]],\n+      [[\n+      ]]\n+    )],\n+    [pcre2_have_headers=1\n+    AC_MSG_RESULT([ok])],\n+    [AC_MSG_RESULT([not found])]\n+  )\n+\n+    AC_MSG_CHECKING([pcre2/pcre2.h])\n+  AC_COMPILE_IFELSE(\n+    [AC_LANG_PROGRAM(\n+      [[\n+#define PCRE2_CODE_UNIT_WIDTH 8\n+#include <pcre2/pcre2.h>\n+      ]],\n+      [[\n+      ]]\n+    )],\n+    [pcre2_have_headers=1\n+    AC_MSG_RESULT([ok])],\n+    [AC_MSG_RESULT([not found])]\n+  )\n+  fi\n+  if test \"$pcre2_have_headers\" != \"0\"; then\n+    AC_DEFINE(HAVE_LIBPCRE2,1,[Compiling with pcre2 support])\n+    AC_SUBST(LIBPCRE2, [-lpcre2-8])\n+  else\n+    enable_pcre2=no\n+    CFLAGS=$saved_cppflags\n+    LDFLAGS=$saved_ldflags\n+  fi\n+fi\n+AC_SUBST(pcre2h)\n+AC_SUBST(pcre2_pcre2h)\n+])\n--- a/src/rule.c\n+++ b/src/rule.c\n@@ -82,14 +82,28 @@ int\n init_rule(rule_t *rule)\n {\n     if (rule->pattern_re == NULL) {\n-        const char *reerr;\n-        int reerroffset;\n+        int errornumber;\n+        PCRE2_SIZE erroroffset;\n+        rule->pattern_re = pcre2_compile(\n+            (PCRE2_SPTR)rule->pattern,   /* the pattern */\n+            PCRE2_ZERO_TERMINATED,       /* indicates pattern is zero-terminated */\n+            0,                           /* default options */\n+            &errornumber,                /* for error number */\n+            &erroroffset,                /* for error offset */\n+            NULL);                       /* use default compile context */\n \n-        rule->pattern_re =\n-            pcre_compile(rule->pattern, 0, &reerr, &reerroffset, NULL);\n         if (rule->pattern_re == NULL) {\n-            LOGE(\"Regex compilation of \\\"%s\\\" failed: %s, offset %d\",\n-                 rule->pattern, reerr, reerroffset);\n+            PCRE2_UCHAR errbuffer[512];\n+            pcre2_get_error_message(errornumber, errbuffer, sizeof(errbuffer));\n+            LOGE(\"PCRE2 regex compilation failed at offset %d: %s\\n\", (int)erroroffset,\n+                 errbuffer);\n+            return 0;\n+        }\n+\n+        rule->pattern_re_match_data = pcre2_match_data_create_from_pattern(rule->pattern_re, NULL);\n+\n+        if (rule->pattern_re_match_data == NULL) {\n+            ERROR(\"PCRE2: the memory for the block could not be obtained\");\n             return 0;\n         }\n     }\n@@ -109,8 +123,15 @@ lookup_rule(const struct cork_dllist *ru\n \n     cork_dllist_foreach_void(rules, curr, next) {\n         rule_t *rule = cork_container_of(curr, rule_t, entries);\n-        if (pcre_exec(rule->pattern_re, NULL,\n-                      name, name_len, 0, 0, NULL, 0) >= 0)\n+        if (pcre2_match(\n+                rule->pattern_re,            /* the compiled pattern */\n+                (PCRE2_SPTR)name,            /* the subject string */\n+                name_len,                    /* the length of the subject */\n+                0,                           /* start at offset 0 in the subject */\n+                0,                           /* default options */\n+                rule->pattern_re_match_data, /* block for storing the result */\n+                NULL                         /* use default match context */\n+                ) >= 0)\n             return rule;\n     }\n \n@@ -131,7 +152,13 @@ free_rule(rule_t *rule)\n         return;\n \n     ss_free(rule->pattern);\n-    if (rule->pattern_re != NULL)\n-        pcre_free(rule->pattern_re);\n+    if (rule->pattern_re != NULL) {\n+        pcre2_code_free(rule->pattern_re);                    /* data and the compiled pattern. */\n+        rule->pattern_re            = NULL;\n+    }\n+    if (rule->pattern_re_match_data != NULL) {\n+        pcre2_match_data_free(rule->pattern_re_match_data);   /* Release memory used for the match */\n+        rule->pattern_re_match_data = NULL;\n+    }\n     ss_free(rule);\n }\n--- a/src/rule.h\n+++ b/src/rule.h\n@@ -33,17 +33,27 @@\n \n #include <libcork/ds.h>\n \n-#ifdef HAVE_PCRE_H\n-#include <pcre.h>\n-#elif HAVE_PCRE_PCRE_H\n-#include <pcre/pcre.h>\n-#endif\n+/*\n+ * The PCRE2_CODE_UNIT_WIDTH macro must be defined before including pcre2.h.\n+ * For a program that uses only one code unit width, setting it to 8, 16, or 32\n+ * makes it possible to use generic function names such as pcre2_compile(). Note\n+ * that just changing 8 to 16 (for example) is not sufficient to convert this\n+ * program to process 16-bit characters. Even in a fully 16-bit environment, where\n+ * string-handling functions such as strcmp() and printf() work with 16-bit\n+ * characters, the code for handling the table of named substrings will still need\n+ * to be modified.\n+ */\n+/* we only need to support ASCII chartable, thus set it to 8 */\n+#define PCRE2_CODE_UNIT_WIDTH 8\n+\n+#include <pcre2.h>\n \n typedef struct rule {\n     char *pattern;\n \n     /* Runtime fields */\n-    pcre *pattern_re;\n+    pcre2_code *pattern_re;\n+    pcre2_match_data *pattern_re_match_data;\n \n     struct cork_dllist_item entries;\n } rule_t;\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/Makefile.am",
    "content": "VERSION_INFO = 2:0:0\n\nAM_CFLAGS = -g -O2 -Wall -Werror -Wno-deprecated-declarations -fno-strict-aliasing -std=gnu99 -D_GNU_SOURCE\nAM_CFLAGS += $(PTHREAD_CFLAGS)\nif !USE_SYSTEM_SHARED_LIB\nAM_CFLAGS += -I$(top_srcdir)/libev\nAM_CFLAGS += -I$(top_srcdir)/libudns\nAM_CFLAGS += -I$(top_srcdir)/libsodium/src/libsodium/include\nendif\nAM_CFLAGS += -I$(top_srcdir)/libipset/include\nAM_CFLAGS += -I$(top_srcdir)/libcork/include\nAM_CFLAGS += $(LIBPCRE_CFLAGS)\n\nSS_COMMON_LIBS = $(top_builddir)/libipset/libipset.la \\\n                 $(top_builddir)/libcork/libcork.la \\\n                 $(INET_NTOP_LIB) $(LIBPCRE_LIBS)\nif USE_SYSTEM_SHARED_LIB\nSS_COMMON_LIBS += -lev -lsodium -lm\nelse\nSS_COMMON_LIBS += $(top_builddir)/libev/libev.la \\\n                  $(top_builddir)/libsodium/src/libsodium/libsodium.la\nendif\n\nbin_PROGRAMS = ss-server ss-check\n\nsni_src = http.c \\\n          tls.c \\\n          rule.c\n\nss_check_SOURCES = check.c \n\nss_server_SOURCES = utils.c \\\n                    netutils.c \\\n                    jconf.c \\\n                    json.c \\\n                    encrypt.c \\\n                    udprelay.c \\\n                    cache.c \\\n                    acl.c \\\n                    resolv.c \\\n                    server.c \\\n                    $(sni_src)\n\n\nss_check_LDADD = $(SS_COMMON_LIBS)\nss_server_LDADD = $(SS_COMMON_LIBS)\n\nif USE_SYSTEM_SHARED_LIB\nss_server_LDADD += -ludns\nelse\nss_server_LDADD += $(top_builddir)/libudns/libudns.la\nendif\n\nss_check_CFLAGS = $(AM_CFLAGS) \nss_server_CFLAGS = $(AM_CFLAGS) -DMODULE_REMOTE\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/Makefile.in",
    "content": "# Makefile.in generated by automake 1.15 from Makefile.am.\n# @configure_input@\n\n# Copyright (C) 1994-2014 Free Software Foundation, Inc.\n\n# This Makefile.in is free software; the Free Software Foundation\n# gives unlimited permission to copy and/or distribute it,\n# with or without modifications, as long as this notice is preserved.\n\n# This program is distributed in the hope that it will be useful,\n# but WITHOUT ANY WARRANTY, to the extent permitted by law; without\n# even the implied warranty of MERCHANTABILITY or FITNESS FOR A\n# PARTICULAR PURPOSE.\n\n@SET_MAKE@\n\nVPATH = @srcdir@\nam__is_gnu_make = { \\\n  if test -z '$(MAKELEVEL)'; then \\\n    false; \\\n  elif test -n '$(MAKE_HOST)'; then \\\n    true; \\\n  elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \\\n    true; \\\n  else \\\n    false; \\\n  fi; \\\n}\nam__make_running_with_option = \\\n  case $${target_option-} in \\\n      ?) ;; \\\n      *) echo \"am__make_running_with_option: internal error: invalid\" \\\n              \"target option '$${target_option-}' specified\" >&2; \\\n         exit 1;; \\\n  esac; \\\n  has_opt=no; \\\n  sane_makeflags=$$MAKEFLAGS; \\\n  if $(am__is_gnu_make); then \\\n    sane_makeflags=$$MFLAGS; \\\n  else \\\n    case $$MAKEFLAGS in \\\n      *\\\\[\\ \\\t]*) \\\n        bs=\\\\; \\\n        sane_makeflags=`printf '%s\\n' \"$$MAKEFLAGS\" \\\n          | sed \"s/$$bs$$bs[$$bs $$bs\t]*//g\"`;; \\\n    esac; \\\n  fi; \\\n  skip_next=no; \\\n  strip_trailopt () \\\n  { \\\n    flg=`printf '%s\\n' \"$$flg\" | sed \"s/$$1.*$$//\"`; \\\n  }; \\\n  for flg in $$sane_makeflags; do \\\n    test $$skip_next = yes && { skip_next=no; continue; }; \\\n    case $$flg in \\\n      *=*|--*) continue;; \\\n        -*I) strip_trailopt 'I'; skip_next=yes;; \\\n      -*I?*) strip_trailopt 'I';; \\\n        -*O) strip_trailopt 'O'; skip_next=yes;; \\\n      -*O?*) strip_trailopt 'O';; \\\n        -*l) strip_trailopt 'l'; skip_next=yes;; \\\n      -*l?*) strip_trailopt 'l';; \\\n      -[dEDm]) skip_next=yes;; \\\n      -[JT]) skip_next=yes;; \\\n    esac; \\\n    case $$flg in \\\n      *$$target_option*) has_opt=yes; break;; \\\n    esac; \\\n  done; \\\n  test $$has_opt = yes\nam__make_dryrun = (target_option=n; $(am__make_running_with_option))\nam__make_keepgoing = (target_option=k; $(am__make_running_with_option))\npkgdatadir = $(datadir)/@PACKAGE@\npkgincludedir = $(includedir)/@PACKAGE@\npkglibdir = $(libdir)/@PACKAGE@\npkglibexecdir = $(libexecdir)/@PACKAGE@\nam__cd = CDPATH=\"$${ZSH_VERSION+.}$(PATH_SEPARATOR)\" && cd\ninstall_sh_DATA = $(install_sh) -c -m 644\ninstall_sh_PROGRAM = $(install_sh) -c\ninstall_sh_SCRIPT = $(install_sh) -c\nINSTALL_HEADER = $(INSTALL_DATA)\ntransform = $(program_transform_name)\nNORMAL_INSTALL = :\nPRE_INSTALL = :\nPOST_INSTALL = :\nNORMAL_UNINSTALL = :\nPRE_UNINSTALL = :\nPOST_UNINSTALL = :\nbuild_triplet = @build@\nhost_triplet = @host@\n@USE_SYSTEM_SHARED_LIB_FALSE@am__append_1 = -I$(top_srcdir)/libev \\\n@USE_SYSTEM_SHARED_LIB_FALSE@\t-I$(top_srcdir)/libudns \\\n@USE_SYSTEM_SHARED_LIB_FALSE@\t-I$(top_srcdir)/libsodium/src/libsodium/include\n@USE_SYSTEM_SHARED_LIB_TRUE@am__append_2 = -lev -lsodium -lm\n@USE_SYSTEM_SHARED_LIB_FALSE@am__append_3 = $(top_builddir)/libev/libev.la \\\n@USE_SYSTEM_SHARED_LIB_FALSE@                  $(top_builddir)/libsodium/src/libsodium/libsodium.la\n\nbin_PROGRAMS = ss-server$(EXEEXT) ss-check$(EXEEXT)\n@USE_SYSTEM_SHARED_LIB_TRUE@am__append_4 = -ludns\n@USE_SYSTEM_SHARED_LIB_FALSE@am__append_5 = $(top_builddir)/libudns/libudns.la\nsubdir = server\nACLOCAL_M4 = $(top_srcdir)/aclocal.m4\nam__aclocal_m4_deps = $(top_srcdir)/m4/ax_pthread.m4 \\\n\t$(top_srcdir)/m4/ax_tls.m4 $(top_srcdir)/m4/inet_ntop.m4 \\\n\t$(top_srcdir)/m4/libtool.m4 $(top_srcdir)/m4/ltoptions.m4 \\\n\t$(top_srcdir)/m4/ltsugar.m4 $(top_srcdir)/m4/ltversion.m4 \\\n\t$(top_srcdir)/m4/lt~obsolete.m4 $(top_srcdir)/m4/mbedtls.m4 \\\n\t$(top_srcdir)/m4/openssl.m4 $(top_srcdir)/m4/pcre2.m4 \\\n\t$(top_srcdir)/m4/polarssl.m4 \\\n\t$(top_srcdir)/m4/stack-protector.m4 $(top_srcdir)/m4/zlib.m4 \\\n\t$(top_srcdir)/libev/libev.m4 $(top_srcdir)/configure.ac\nam__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \\\n\t$(ACLOCAL_M4)\nDIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON)\nmkinstalldirs = $(install_sh) -d\nCONFIG_HEADER = $(top_builddir)/config.h\nCONFIG_CLEAN_FILES =\nCONFIG_CLEAN_VPATH_FILES =\nam__installdirs = \"$(DESTDIR)$(bindir)\"\nPROGRAMS = $(bin_PROGRAMS)\nam_ss_check_OBJECTS = ss_check-check.$(OBJEXT)\nss_check_OBJECTS = $(am_ss_check_OBJECTS)\nam__DEPENDENCIES_1 =\nam__DEPENDENCIES_2 = $(top_builddir)/libipset/libipset.la \\\n\t$(top_builddir)/libcork/libcork.la $(am__DEPENDENCIES_1) \\\n\t$(am__DEPENDENCIES_1) $(am__append_3)\nss_check_DEPENDENCIES = $(am__DEPENDENCIES_2)\nAM_V_lt = $(am__v_lt_@AM_V@)\nam__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@)\nam__v_lt_0 = --silent\nam__v_lt_1 = \nss_check_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(ss_check_CFLAGS) \\\n\t$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nam__objects_1 = ss_server-http.$(OBJEXT) ss_server-tls.$(OBJEXT) \\\n\tss_server-rule.$(OBJEXT)\nam_ss_server_OBJECTS = ss_server-utils.$(OBJEXT) \\\n\tss_server-netutils.$(OBJEXT) ss_server-jconf.$(OBJEXT) \\\n\tss_server-json.$(OBJEXT) ss_server-encrypt.$(OBJEXT) \\\n\tss_server-udprelay.$(OBJEXT) ss_server-cache.$(OBJEXT) \\\n\tss_server-acl.$(OBJEXT) ss_server-resolv.$(OBJEXT) \\\n\tss_server-server.$(OBJEXT) $(am__objects_1)\nss_server_OBJECTS = $(am_ss_server_OBJECTS)\nss_server_DEPENDENCIES = $(am__DEPENDENCIES_2) $(am__DEPENDENCIES_1) \\\n\t$(am__append_5)\nss_server_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(ss_server_CFLAGS) \\\n\t$(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_P = $(am__v_P_@AM_V@)\nam__v_P_ = $(am__v_P_@AM_DEFAULT_V@)\nam__v_P_0 = false\nam__v_P_1 = :\nAM_V_GEN = $(am__v_GEN_@AM_V@)\nam__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@)\nam__v_GEN_0 = @echo \"  GEN     \" $@;\nam__v_GEN_1 = \nAM_V_at = $(am__v_at_@AM_V@)\nam__v_at_ = $(am__v_at_@AM_DEFAULT_V@)\nam__v_at_0 = @\nam__v_at_1 = \nDEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir)\ndepcomp = $(SHELL) $(top_srcdir)/auto/depcomp\nam__depfiles_maybe = depfiles\nam__mv = mv -f\nCOMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \\\n\t$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)\nLTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \\\n\t$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \\\n\t$(AM_CFLAGS) $(CFLAGS)\nAM_V_CC = $(am__v_CC_@AM_V@)\nam__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@)\nam__v_CC_0 = @echo \"  CC      \" $@;\nam__v_CC_1 = \nCCLD = $(CC)\nLINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \\\n\t$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \\\n\t$(AM_LDFLAGS) $(LDFLAGS) -o $@\nAM_V_CCLD = $(am__v_CCLD_@AM_V@)\nam__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@)\nam__v_CCLD_0 = @echo \"  CCLD    \" $@;\nam__v_CCLD_1 = \nSOURCES = $(ss_check_SOURCES) $(ss_server_SOURCES)\nDIST_SOURCES = $(ss_check_SOURCES) $(ss_server_SOURCES)\nam__can_run_installinfo = \\\n  case $$AM_UPDATE_INFO_DIR in \\\n    n|no|NO) false;; \\\n    *) (install-info --version) >/dev/null 2>&1;; \\\n  esac\nam__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP)\n# Read a list of newline-separated strings from the standard input,\n# and print each of them once, without duplicates.  Input order is\n# *not* preserved.\nam__uniquify_input = $(AWK) '\\\n  BEGIN { nonempty = 0; } \\\n  { items[$$0] = 1; nonempty = 1; } \\\n  END { if (nonempty) { for (i in items) print i; }; } \\\n'\n# Make sure the list of sources is unique.  This is necessary because,\n# e.g., the same source file might be shared among _SOURCES variables\n# for different programs/libraries.\nam__define_uniq_tagged_files = \\\n  list='$(am__tagged_files)'; \\\n  unique=`for i in $$list; do \\\n    if test -f \"$$i\"; then echo $$i; else echo $(srcdir)/$$i; fi; \\\n  done | $(am__uniquify_input)`\nETAGS = etags\nCTAGS = ctags\nam__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/auto/depcomp\nDISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST)\nACLOCAL = @ACLOCAL@\nAMTAR = @AMTAR@\nAM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@\nAR = @AR@\nASCIIDOC = @ASCIIDOC@\nAUTOCONF = @AUTOCONF@\nAUTOHEADER = @AUTOHEADER@\nAUTOMAKE = @AUTOMAKE@\nAWK = @AWK@\nCC = @CC@\nCCDEPMODE = @CCDEPMODE@\nCFLAGS = @CFLAGS@\nCPP = @CPP@\nCPPFLAGS = @CPPFLAGS@\nCYGPATH_W = @CYGPATH_W@\nDEFS = @DEFS@\nDEPDIR = @DEPDIR@\nDLLTOOL = @DLLTOOL@\nDSYMUTIL = @DSYMUTIL@\nDUMPBIN = @DUMPBIN@\nECHO_C = @ECHO_C@\nECHO_N = @ECHO_N@\nECHO_T = @ECHO_T@\nEGREP = @EGREP@\nEXEEXT = @EXEEXT@\nFGREP = @FGREP@\nGREP = @GREP@\nGZIP = @GZIP@\nINET_NTOP_LIB = @INET_NTOP_LIB@\nINSTALL = @INSTALL@\nINSTALL_DATA = @INSTALL_DATA@\nINSTALL_PROGRAM = @INSTALL_PROGRAM@\nINSTALL_SCRIPT = @INSTALL_SCRIPT@\nINSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@\nLD = @LD@\nLDFLAGS = @LDFLAGS@\nLIBOBJS = @LIBOBJS@\nLIBPCRE = @LIBPCRE@\nLIBS = @LIBS@\nLIBTOOL = @LIBTOOL@\nLIPO = @LIPO@\nLN_S = @LN_S@\nLTLIBOBJS = @LTLIBOBJS@\nMAINT = @MAINT@\nMAKEINFO = @MAKEINFO@\nMANIFEST_TOOL = @MANIFEST_TOOL@\nMKDIR_P = @MKDIR_P@\nMV = @MV@\nNM = @NM@\nNMEDIT = @NMEDIT@\nOBJDUMP = @OBJDUMP@\nOBJEXT = @OBJEXT@\nOTOOL = @OTOOL@\nOTOOL64 = @OTOOL64@\nPACKAGE = @PACKAGE@\nPACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@\nPACKAGE_NAME = @PACKAGE_NAME@\nPACKAGE_STRING = @PACKAGE_STRING@\nPACKAGE_TARNAME = @PACKAGE_TARNAME@\nPACKAGE_URL = @PACKAGE_URL@\nPACKAGE_VERSION = @PACKAGE_VERSION@\nPATH_SEPARATOR = @PATH_SEPARATOR@\nPCRE_CONFIG = @PCRE_CONFIG@\nPTHREAD_CC = @PTHREAD_CC@\nPTHREAD_CFLAGS = @PTHREAD_CFLAGS@\nPTHREAD_LIBS = @PTHREAD_LIBS@\nRANLIB = @RANLIB@\nSED = @SED@\nSET_MAKE = @SET_MAKE@\nSHELL = @SHELL@\nSTRIP = @STRIP@\nVERSION = @VERSION@\nXMLTO = @XMLTO@\nabs_builddir = @abs_builddir@\nabs_srcdir = @abs_srcdir@\nabs_top_builddir = @abs_top_builddir@\nabs_top_srcdir = @abs_top_srcdir@\nac_ct_AR = @ac_ct_AR@\nac_ct_CC = @ac_ct_CC@\nac_ct_DUMPBIN = @ac_ct_DUMPBIN@\nam__include = @am__include@\nam__leading_dot = @am__leading_dot@\nam__quote = @am__quote@\nam__tar = @am__tar@\nam__untar = @am__untar@\nax_pthread_config = @ax_pthread_config@\nbindir = @bindir@\nbuild = @build@\nbuild_alias = @build_alias@\nbuild_cpu = @build_cpu@\nbuild_os = @build_os@\nbuild_vendor = @build_vendor@\nbuilddir = @builddir@\ndatadir = @datadir@\ndatarootdir = @datarootdir@\ndocdir = @docdir@\ndvidir = @dvidir@\nexec_prefix = @exec_prefix@\nhost = @host@\nhost_alias = @host_alias@\nhost_cpu = @host_cpu@\nhost_os = @host_os@\nhost_vendor = @host_vendor@\nhtmldir = @htmldir@\nincludedir = @includedir@\ninfodir = @infodir@\ninstall_sh = @install_sh@\nlibdir = @libdir@\nlibexecdir = @libexecdir@\nlocaledir = @localedir@\nlocalstatedir = @localstatedir@\nmandir = @mandir@\nmkdir_p = @mkdir_p@\noldincludedir = @oldincludedir@\npcre_pcreh = @pcre_pcreh@\npcreh = @pcreh@\npdfdir = @pdfdir@\nprefix = @prefix@\nprogram_transform_name = @program_transform_name@\npsdir = @psdir@\nrunstatedir = @runstatedir@\nsbindir = @sbindir@\nsharedstatedir = @sharedstatedir@\nsrcdir = @srcdir@\nsubdirs = @subdirs@\nsysconfdir = @sysconfdir@\ntarget_alias = @target_alias@\ntop_build_prefix = @top_build_prefix@\ntop_builddir = @top_builddir@\ntop_srcdir = @top_srcdir@\nVERSION_INFO = 2:0:0\nAM_CFLAGS = -g -O2 -Wall -Werror -Wno-deprecated-declarations \\\n\t-fno-strict-aliasing -std=gnu99 -D_GNU_SOURCE \\\n\t$(PTHREAD_CFLAGS) $(am__append_1) \\\n\t-I$(top_srcdir)/libipset/include \\\n\t-I$(top_srcdir)/libcork/include $(LIBPCRE_CFLAGS)\nSS_COMMON_LIBS = $(top_builddir)/libipset/libipset.la \\\n\t$(top_builddir)/libcork/libcork.la $(INET_NTOP_LIB) \\\n\t$(LIBPCRE_LIBS) $(am__append_2) $(am__append_3)\nsni_src = http.c \\\n          tls.c \\\n          rule.c\n\nss_check_SOURCES = check.c \nss_server_SOURCES = utils.c \\\n                    netutils.c \\\n                    jconf.c \\\n                    json.c \\\n                    encrypt.c \\\n                    udprelay.c \\\n                    cache.c \\\n                    acl.c \\\n                    resolv.c \\\n                    server.c \\\n                    $(sni_src)\n\nss_check_LDADD = $(SS_COMMON_LIBS)\nss_server_LDADD = $(SS_COMMON_LIBS) $(am__append_4) $(am__append_5)\nss_check_CFLAGS = $(AM_CFLAGS) \nss_server_CFLAGS = $(AM_CFLAGS) -DMODULE_REMOTE\nall: all-am\n\n.SUFFIXES:\n.SUFFIXES: .c .lo .o .obj\n$(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am  $(am__configure_deps)\n\t@for dep in $?; do \\\n\t  case '$(am__configure_deps)' in \\\n\t    *$$dep*) \\\n\t      ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \\\n\t        && { if test -f $@; then exit 0; else break; fi; }; \\\n\t      exit 1;; \\\n\t  esac; \\\n\tdone; \\\n\techo ' cd $(top_srcdir) && $(AUTOMAKE) --foreign server/Makefile'; \\\n\t$(am__cd) $(top_srcdir) && \\\n\t  $(AUTOMAKE) --foreign server/Makefile\nMakefile: $(srcdir)/Makefile.in $(top_builddir)/config.status\n\t@case '$?' in \\\n\t  *config.status*) \\\n\t    cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \\\n\t  *) \\\n\t    echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \\\n\t    cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \\\n\tesac;\n\n$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n\n$(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps)\n\tcd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh\n$(am__aclocal_m4_deps):\ninstall-binPROGRAMS: $(bin_PROGRAMS)\n\t@$(NORMAL_INSTALL)\n\t@list='$(bin_PROGRAMS)'; test -n \"$(bindir)\" || list=; \\\n\tif test -n \"$$list\"; then \\\n\t  echo \" $(MKDIR_P) '$(DESTDIR)$(bindir)'\"; \\\n\t  $(MKDIR_P) \"$(DESTDIR)$(bindir)\" || exit 1; \\\n\tfi; \\\n\tfor p in $$list; do echo \"$$p $$p\"; done | \\\n\tsed 's/$(EXEEXT)$$//' | \\\n\twhile read p p1; do if test -f $$p \\\n\t || test -f $$p1 \\\n\t  ; then echo \"$$p\"; echo \"$$p\"; else :; fi; \\\n\tdone | \\\n\tsed -e 'p;s,.*/,,;n;h' \\\n\t    -e 's|.*|.|' \\\n\t    -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \\\n\tsed 'N;N;N;s,\\n, ,g' | \\\n\t$(AWK) 'BEGIN { files[\".\"] = \"\"; dirs[\".\"] = 1 } \\\n\t  { d=$$3; if (dirs[d] != 1) { print \"d\", d; dirs[d] = 1 } \\\n\t    if ($$2 == $$4) files[d] = files[d] \" \" $$1; \\\n\t    else { print \"f\", $$3 \"/\" $$4, $$1; } } \\\n\t  END { for (d in files) print \"f\", d, files[d] }' | \\\n\twhile read type dir files; do \\\n\t    if test \"$$dir\" = .; then dir=; else dir=/$$dir; fi; \\\n\t    test -z \"$$files\" || { \\\n\t    echo \" $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'\"; \\\n\t    $(INSTALL_PROGRAM_ENV) $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL_PROGRAM) $$files \"$(DESTDIR)$(bindir)$$dir\" || exit $$?; \\\n\t    } \\\n\t; done\n\nuninstall-binPROGRAMS:\n\t@$(NORMAL_UNINSTALL)\n\t@list='$(bin_PROGRAMS)'; test -n \"$(bindir)\" || list=; \\\n\tfiles=`for p in $$list; do echo \"$$p\"; done | \\\n\t  sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \\\n\t      -e 's/$$/$(EXEEXT)/' \\\n\t`; \\\n\ttest -n \"$$list\" || exit 0; \\\n\techo \" ( cd '$(DESTDIR)$(bindir)' && rm -f\" $$files \")\"; \\\n\tcd \"$(DESTDIR)$(bindir)\" && rm -f $$files\n\nclean-binPROGRAMS:\n\t@list='$(bin_PROGRAMS)'; test -n \"$$list\" || exit 0; \\\n\techo \" rm -f\" $$list; \\\n\trm -f $$list || exit $$?; \\\n\ttest -n \"$(EXEEXT)\" || exit 0; \\\n\tlist=`for p in $$list; do echo \"$$p\"; done | sed 's/$(EXEEXT)$$//'`; \\\n\techo \" rm -f\" $$list; \\\n\trm -f $$list\n\nss-check$(EXEEXT): $(ss_check_OBJECTS) $(ss_check_DEPENDENCIES) $(EXTRA_ss_check_DEPENDENCIES) \n\t@rm -f ss-check$(EXEEXT)\n\t$(AM_V_CCLD)$(ss_check_LINK) $(ss_check_OBJECTS) $(ss_check_LDADD) $(LIBS)\n\nss-server$(EXEEXT): $(ss_server_OBJECTS) $(ss_server_DEPENDENCIES) $(EXTRA_ss_server_DEPENDENCIES) \n\t@rm -f ss-server$(EXEEXT)\n\t$(AM_V_CCLD)$(ss_server_LINK) $(ss_server_OBJECTS) $(ss_server_LDADD) $(LIBS)\n\nmostlyclean-compile:\n\t-rm -f *.$(OBJEXT)\n\ndistclean-compile:\n\t-rm -f *.tab.c\n\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_check-check.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-acl.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-cache.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-encrypt.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-http.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-jconf.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-json.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-netutils.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-resolv.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-rule.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-server.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-tls.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-udprelay.Po@am__quote@\n@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ss_server-utils.Po@am__quote@\n\n.c.o:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.o$$||'`;\\\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $<\n\n.c.obj:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.obj$$||'`;\\\n@am__fastdepCC_TRUE@\t$(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'`\n\n.c.lo:\n@am__fastdepCC_TRUE@\t$(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\\.lo$$||'`;\\\n@am__fastdepCC_TRUE@\t$(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\\\n@am__fastdepCC_TRUE@\t$(am__mv) $$depbase.Tpo $$depbase.Plo\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='$<' object='$@' libtool=yes @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(LTCOMPILE) -c -o $@ $<\n\nss_check-check.o: check.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_check_CFLAGS) $(CFLAGS) -MT ss_check-check.o -MD -MP -MF $(DEPDIR)/ss_check-check.Tpo -c -o ss_check-check.o `test -f 'check.c' || echo '$(srcdir)/'`check.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_check-check.Tpo $(DEPDIR)/ss_check-check.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='check.c' object='ss_check-check.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_check_CFLAGS) $(CFLAGS) -c -o ss_check-check.o `test -f 'check.c' || echo '$(srcdir)/'`check.c\n\nss_check-check.obj: check.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_check_CFLAGS) $(CFLAGS) -MT ss_check-check.obj -MD -MP -MF $(DEPDIR)/ss_check-check.Tpo -c -o ss_check-check.obj `if test -f 'check.c'; then $(CYGPATH_W) 'check.c'; else $(CYGPATH_W) '$(srcdir)/check.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_check-check.Tpo $(DEPDIR)/ss_check-check.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='check.c' object='ss_check-check.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_check_CFLAGS) $(CFLAGS) -c -o ss_check-check.obj `if test -f 'check.c'; then $(CYGPATH_W) 'check.c'; else $(CYGPATH_W) '$(srcdir)/check.c'; fi`\n\nss_server-utils.o: utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-utils.o -MD -MP -MF $(DEPDIR)/ss_server-utils.Tpo -c -o ss_server-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-utils.Tpo $(DEPDIR)/ss_server-utils.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='utils.c' object='ss_server-utils.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c\n\nss_server-utils.obj: utils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-utils.obj -MD -MP -MF $(DEPDIR)/ss_server-utils.Tpo -c -o ss_server-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-utils.Tpo $(DEPDIR)/ss_server-utils.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='utils.c' object='ss_server-utils.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi`\n\nss_server-netutils.o: netutils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-netutils.o -MD -MP -MF $(DEPDIR)/ss_server-netutils.Tpo -c -o ss_server-netutils.o `test -f 'netutils.c' || echo '$(srcdir)/'`netutils.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-netutils.Tpo $(DEPDIR)/ss_server-netutils.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='netutils.c' object='ss_server-netutils.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-netutils.o `test -f 'netutils.c' || echo '$(srcdir)/'`netutils.c\n\nss_server-netutils.obj: netutils.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-netutils.obj -MD -MP -MF $(DEPDIR)/ss_server-netutils.Tpo -c -o ss_server-netutils.obj `if test -f 'netutils.c'; then $(CYGPATH_W) 'netutils.c'; else $(CYGPATH_W) '$(srcdir)/netutils.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-netutils.Tpo $(DEPDIR)/ss_server-netutils.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='netutils.c' object='ss_server-netutils.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-netutils.obj `if test -f 'netutils.c'; then $(CYGPATH_W) 'netutils.c'; else $(CYGPATH_W) '$(srcdir)/netutils.c'; fi`\n\nss_server-jconf.o: jconf.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-jconf.o -MD -MP -MF $(DEPDIR)/ss_server-jconf.Tpo -c -o ss_server-jconf.o `test -f 'jconf.c' || echo '$(srcdir)/'`jconf.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-jconf.Tpo $(DEPDIR)/ss_server-jconf.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='jconf.c' object='ss_server-jconf.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-jconf.o `test -f 'jconf.c' || echo '$(srcdir)/'`jconf.c\n\nss_server-jconf.obj: jconf.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-jconf.obj -MD -MP -MF $(DEPDIR)/ss_server-jconf.Tpo -c -o ss_server-jconf.obj `if test -f 'jconf.c'; then $(CYGPATH_W) 'jconf.c'; else $(CYGPATH_W) '$(srcdir)/jconf.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-jconf.Tpo $(DEPDIR)/ss_server-jconf.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='jconf.c' object='ss_server-jconf.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-jconf.obj `if test -f 'jconf.c'; then $(CYGPATH_W) 'jconf.c'; else $(CYGPATH_W) '$(srcdir)/jconf.c'; fi`\n\nss_server-json.o: json.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-json.o -MD -MP -MF $(DEPDIR)/ss_server-json.Tpo -c -o ss_server-json.o `test -f 'json.c' || echo '$(srcdir)/'`json.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-json.Tpo $(DEPDIR)/ss_server-json.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='json.c' object='ss_server-json.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-json.o `test -f 'json.c' || echo '$(srcdir)/'`json.c\n\nss_server-json.obj: json.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-json.obj -MD -MP -MF $(DEPDIR)/ss_server-json.Tpo -c -o ss_server-json.obj `if test -f 'json.c'; then $(CYGPATH_W) 'json.c'; else $(CYGPATH_W) '$(srcdir)/json.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-json.Tpo $(DEPDIR)/ss_server-json.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='json.c' object='ss_server-json.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-json.obj `if test -f 'json.c'; then $(CYGPATH_W) 'json.c'; else $(CYGPATH_W) '$(srcdir)/json.c'; fi`\n\nss_server-encrypt.o: encrypt.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-encrypt.o -MD -MP -MF $(DEPDIR)/ss_server-encrypt.Tpo -c -o ss_server-encrypt.o `test -f 'encrypt.c' || echo '$(srcdir)/'`encrypt.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-encrypt.Tpo $(DEPDIR)/ss_server-encrypt.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='encrypt.c' object='ss_server-encrypt.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-encrypt.o `test -f 'encrypt.c' || echo '$(srcdir)/'`encrypt.c\n\nss_server-encrypt.obj: encrypt.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-encrypt.obj -MD -MP -MF $(DEPDIR)/ss_server-encrypt.Tpo -c -o ss_server-encrypt.obj `if test -f 'encrypt.c'; then $(CYGPATH_W) 'encrypt.c'; else $(CYGPATH_W) '$(srcdir)/encrypt.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-encrypt.Tpo $(DEPDIR)/ss_server-encrypt.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='encrypt.c' object='ss_server-encrypt.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-encrypt.obj `if test -f 'encrypt.c'; then $(CYGPATH_W) 'encrypt.c'; else $(CYGPATH_W) '$(srcdir)/encrypt.c'; fi`\n\nss_server-udprelay.o: udprelay.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-udprelay.o -MD -MP -MF $(DEPDIR)/ss_server-udprelay.Tpo -c -o ss_server-udprelay.o `test -f 'udprelay.c' || echo '$(srcdir)/'`udprelay.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-udprelay.Tpo $(DEPDIR)/ss_server-udprelay.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='udprelay.c' object='ss_server-udprelay.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-udprelay.o `test -f 'udprelay.c' || echo '$(srcdir)/'`udprelay.c\n\nss_server-udprelay.obj: udprelay.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-udprelay.obj -MD -MP -MF $(DEPDIR)/ss_server-udprelay.Tpo -c -o ss_server-udprelay.obj `if test -f 'udprelay.c'; then $(CYGPATH_W) 'udprelay.c'; else $(CYGPATH_W) '$(srcdir)/udprelay.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-udprelay.Tpo $(DEPDIR)/ss_server-udprelay.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='udprelay.c' object='ss_server-udprelay.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-udprelay.obj `if test -f 'udprelay.c'; then $(CYGPATH_W) 'udprelay.c'; else $(CYGPATH_W) '$(srcdir)/udprelay.c'; fi`\n\nss_server-cache.o: cache.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-cache.o -MD -MP -MF $(DEPDIR)/ss_server-cache.Tpo -c -o ss_server-cache.o `test -f 'cache.c' || echo '$(srcdir)/'`cache.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-cache.Tpo $(DEPDIR)/ss_server-cache.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='cache.c' object='ss_server-cache.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-cache.o `test -f 'cache.c' || echo '$(srcdir)/'`cache.c\n\nss_server-cache.obj: cache.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-cache.obj -MD -MP -MF $(DEPDIR)/ss_server-cache.Tpo -c -o ss_server-cache.obj `if test -f 'cache.c'; then $(CYGPATH_W) 'cache.c'; else $(CYGPATH_W) '$(srcdir)/cache.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-cache.Tpo $(DEPDIR)/ss_server-cache.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='cache.c' object='ss_server-cache.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-cache.obj `if test -f 'cache.c'; then $(CYGPATH_W) 'cache.c'; else $(CYGPATH_W) '$(srcdir)/cache.c'; fi`\n\nss_server-acl.o: acl.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-acl.o -MD -MP -MF $(DEPDIR)/ss_server-acl.Tpo -c -o ss_server-acl.o `test -f 'acl.c' || echo '$(srcdir)/'`acl.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-acl.Tpo $(DEPDIR)/ss_server-acl.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='acl.c' object='ss_server-acl.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-acl.o `test -f 'acl.c' || echo '$(srcdir)/'`acl.c\n\nss_server-acl.obj: acl.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-acl.obj -MD -MP -MF $(DEPDIR)/ss_server-acl.Tpo -c -o ss_server-acl.obj `if test -f 'acl.c'; then $(CYGPATH_W) 'acl.c'; else $(CYGPATH_W) '$(srcdir)/acl.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-acl.Tpo $(DEPDIR)/ss_server-acl.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='acl.c' object='ss_server-acl.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-acl.obj `if test -f 'acl.c'; then $(CYGPATH_W) 'acl.c'; else $(CYGPATH_W) '$(srcdir)/acl.c'; fi`\n\nss_server-resolv.o: resolv.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-resolv.o -MD -MP -MF $(DEPDIR)/ss_server-resolv.Tpo -c -o ss_server-resolv.o `test -f 'resolv.c' || echo '$(srcdir)/'`resolv.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-resolv.Tpo $(DEPDIR)/ss_server-resolv.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='resolv.c' object='ss_server-resolv.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-resolv.o `test -f 'resolv.c' || echo '$(srcdir)/'`resolv.c\n\nss_server-resolv.obj: resolv.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-resolv.obj -MD -MP -MF $(DEPDIR)/ss_server-resolv.Tpo -c -o ss_server-resolv.obj `if test -f 'resolv.c'; then $(CYGPATH_W) 'resolv.c'; else $(CYGPATH_W) '$(srcdir)/resolv.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-resolv.Tpo $(DEPDIR)/ss_server-resolv.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='resolv.c' object='ss_server-resolv.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-resolv.obj `if test -f 'resolv.c'; then $(CYGPATH_W) 'resolv.c'; else $(CYGPATH_W) '$(srcdir)/resolv.c'; fi`\n\nss_server-server.o: server.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-server.o -MD -MP -MF $(DEPDIR)/ss_server-server.Tpo -c -o ss_server-server.o `test -f 'server.c' || echo '$(srcdir)/'`server.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-server.Tpo $(DEPDIR)/ss_server-server.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='server.c' object='ss_server-server.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-server.o `test -f 'server.c' || echo '$(srcdir)/'`server.c\n\nss_server-server.obj: server.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-server.obj -MD -MP -MF $(DEPDIR)/ss_server-server.Tpo -c -o ss_server-server.obj `if test -f 'server.c'; then $(CYGPATH_W) 'server.c'; else $(CYGPATH_W) '$(srcdir)/server.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-server.Tpo $(DEPDIR)/ss_server-server.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='server.c' object='ss_server-server.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-server.obj `if test -f 'server.c'; then $(CYGPATH_W) 'server.c'; else $(CYGPATH_W) '$(srcdir)/server.c'; fi`\n\nss_server-http.o: http.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-http.o -MD -MP -MF $(DEPDIR)/ss_server-http.Tpo -c -o ss_server-http.o `test -f 'http.c' || echo '$(srcdir)/'`http.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-http.Tpo $(DEPDIR)/ss_server-http.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='http.c' object='ss_server-http.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-http.o `test -f 'http.c' || echo '$(srcdir)/'`http.c\n\nss_server-http.obj: http.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-http.obj -MD -MP -MF $(DEPDIR)/ss_server-http.Tpo -c -o ss_server-http.obj `if test -f 'http.c'; then $(CYGPATH_W) 'http.c'; else $(CYGPATH_W) '$(srcdir)/http.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-http.Tpo $(DEPDIR)/ss_server-http.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='http.c' object='ss_server-http.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-http.obj `if test -f 'http.c'; then $(CYGPATH_W) 'http.c'; else $(CYGPATH_W) '$(srcdir)/http.c'; fi`\n\nss_server-tls.o: tls.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-tls.o -MD -MP -MF $(DEPDIR)/ss_server-tls.Tpo -c -o ss_server-tls.o `test -f 'tls.c' || echo '$(srcdir)/'`tls.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-tls.Tpo $(DEPDIR)/ss_server-tls.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='tls.c' object='ss_server-tls.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-tls.o `test -f 'tls.c' || echo '$(srcdir)/'`tls.c\n\nss_server-tls.obj: tls.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-tls.obj -MD -MP -MF $(DEPDIR)/ss_server-tls.Tpo -c -o ss_server-tls.obj `if test -f 'tls.c'; then $(CYGPATH_W) 'tls.c'; else $(CYGPATH_W) '$(srcdir)/tls.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-tls.Tpo $(DEPDIR)/ss_server-tls.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='tls.c' object='ss_server-tls.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-tls.obj `if test -f 'tls.c'; then $(CYGPATH_W) 'tls.c'; else $(CYGPATH_W) '$(srcdir)/tls.c'; fi`\n\nss_server-rule.o: rule.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-rule.o -MD -MP -MF $(DEPDIR)/ss_server-rule.Tpo -c -o ss_server-rule.o `test -f 'rule.c' || echo '$(srcdir)/'`rule.c\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-rule.Tpo $(DEPDIR)/ss_server-rule.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='rule.c' object='ss_server-rule.o' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-rule.o `test -f 'rule.c' || echo '$(srcdir)/'`rule.c\n\nss_server-rule.obj: rule.c\n@am__fastdepCC_TRUE@\t$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -MT ss_server-rule.obj -MD -MP -MF $(DEPDIR)/ss_server-rule.Tpo -c -o ss_server-rule.obj `if test -f 'rule.c'; then $(CYGPATH_W) 'rule.c'; else $(CYGPATH_W) '$(srcdir)/rule.c'; fi`\n@am__fastdepCC_TRUE@\t$(AM_V_at)$(am__mv) $(DEPDIR)/ss_server-rule.Tpo $(DEPDIR)/ss_server-rule.Po\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\t$(AM_V_CC)source='rule.c' object='ss_server-rule.obj' libtool=no @AMDEPBACKSLASH@\n@AMDEP_TRUE@@am__fastdepCC_FALSE@\tDEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@\n@am__fastdepCC_FALSE@\t$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(ss_server_CFLAGS) $(CFLAGS) -c -o ss_server-rule.obj `if test -f 'rule.c'; then $(CYGPATH_W) 'rule.c'; else $(CYGPATH_W) '$(srcdir)/rule.c'; fi`\n\nmostlyclean-libtool:\n\t-rm -f *.lo\n\nclean-libtool:\n\t-rm -rf .libs _libs\n\nID: $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); mkid -fID $$unique\ntags: tags-am\nTAGS: tags\n\ntags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\tset x; \\\n\there=`pwd`; \\\n\t$(am__define_uniq_tagged_files); \\\n\tshift; \\\n\tif test -z \"$(ETAGS_ARGS)$$*$$unique\"; then :; else \\\n\t  test -n \"$$unique\" || unique=$$empty_fix; \\\n\t  if test $$# -gt 0; then \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      \"$$@\" $$unique; \\\n\t  else \\\n\t    $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \\\n\t      $$unique; \\\n\t  fi; \\\n\tfi\nctags: ctags-am\n\nCTAGS: ctags\nctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files)\n\t$(am__define_uniq_tagged_files); \\\n\ttest -z \"$(CTAGS_ARGS)$$unique\" \\\n\t  || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \\\n\t     $$unique\n\nGTAGS:\n\there=`$(am__cd) $(top_builddir) && pwd` \\\n\t  && $(am__cd) $(top_srcdir) \\\n\t  && gtags -i $(GTAGS_ARGS) \"$$here\"\ncscopelist: cscopelist-am\n\ncscopelist-am: $(am__tagged_files)\n\tlist='$(am__tagged_files)'; \\\n\tcase \"$(srcdir)\" in \\\n\t  [\\\\/]* | ?:[\\\\/]*) sdir=\"$(srcdir)\" ;; \\\n\t  *) sdir=$(subdir)/$(srcdir) ;; \\\n\tesac; \\\n\tfor i in $$list; do \\\n\t  if test -f \"$$i\"; then \\\n\t    echo \"$(subdir)/$$i\"; \\\n\t  else \\\n\t    echo \"$$sdir/$$i\"; \\\n\t  fi; \\\n\tdone >> $(top_builddir)/cscope.files\n\ndistclean-tags:\n\t-rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags\n\ndistdir: $(DISTFILES)\n\t@srcdirstrip=`echo \"$(srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\ttopsrcdirstrip=`echo \"$(top_srcdir)\" | sed 's/[].[^$$\\\\*]/\\\\\\\\&/g'`; \\\n\tlist='$(DISTFILES)'; \\\n\t  dist_files=`for file in $$list; do echo $$file; done | \\\n\t  sed -e \"s|^$$srcdirstrip/||;t\" \\\n\t      -e \"s|^$$topsrcdirstrip/|$(top_builddir)/|;t\"`; \\\n\tcase $$dist_files in \\\n\t  */*) $(MKDIR_P) `echo \"$$dist_files\" | \\\n\t\t\t   sed '/\\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \\\n\t\t\t   sort -u` ;; \\\n\tesac; \\\n\tfor file in $$dist_files; do \\\n\t  if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \\\n\t  if test -d $$d/$$file; then \\\n\t    dir=`echo \"/$$file\" | sed -e 's,/[^/]*$$,,'`; \\\n\t    if test -d \"$(distdir)/$$file\"; then \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \\\n\t      cp -fpR $(srcdir)/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t      find \"$(distdir)/$$file\" -type d ! -perm -700 -exec chmod u+rwx {} \\;; \\\n\t    fi; \\\n\t    cp -fpR $$d/$$file \"$(distdir)$$dir\" || exit 1; \\\n\t  else \\\n\t    test -f \"$(distdir)/$$file\" \\\n\t    || cp -p $$d/$$file \"$(distdir)/$$file\" \\\n\t    || exit 1; \\\n\t  fi; \\\n\tdone\ncheck-am: all-am\ncheck: check-am\nall-am: Makefile $(PROGRAMS)\ninstalldirs:\n\tfor dir in \"$(DESTDIR)$(bindir)\"; do \\\n\t  test -z \"$$dir\" || $(MKDIR_P) \"$$dir\"; \\\n\tdone\ninstall: install-am\ninstall-exec: install-exec-am\ninstall-data: install-data-am\nuninstall: uninstall-am\n\ninstall-am: all-am\n\t@$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am\n\ninstallcheck: installcheck-am\ninstall-strip:\n\tif test -z '$(STRIP)'; then \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t      install; \\\n\telse \\\n\t  $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" \\\n\t    install_sh_PROGRAM=\"$(INSTALL_STRIP_PROGRAM)\" INSTALL_STRIP_FLAG=-s \\\n\t    \"INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'\" install; \\\n\tfi\nmostlyclean-generic:\n\nclean-generic:\n\ndistclean-generic:\n\t-test -z \"$(CONFIG_CLEAN_FILES)\" || rm -f $(CONFIG_CLEAN_FILES)\n\t-test . = \"$(srcdir)\" || test -z \"$(CONFIG_CLEAN_VPATH_FILES)\" || rm -f $(CONFIG_CLEAN_VPATH_FILES)\n\nmaintainer-clean-generic:\n\t@echo \"This command is intended for maintainers to use\"\n\t@echo \"it deletes files that may require special tools to rebuild.\"\nclean: clean-am\n\nclean-am: clean-binPROGRAMS clean-generic clean-libtool mostlyclean-am\n\ndistclean: distclean-am\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\ndistclean-am: clean-am distclean-compile distclean-generic \\\n\tdistclean-tags\n\ndvi: dvi-am\n\ndvi-am:\n\nhtml: html-am\n\nhtml-am:\n\ninfo: info-am\n\ninfo-am:\n\ninstall-data-am:\n\ninstall-dvi: install-dvi-am\n\ninstall-dvi-am:\n\ninstall-exec-am: install-binPROGRAMS\n\ninstall-html: install-html-am\n\ninstall-html-am:\n\ninstall-info: install-info-am\n\ninstall-info-am:\n\ninstall-man:\n\ninstall-pdf: install-pdf-am\n\ninstall-pdf-am:\n\ninstall-ps: install-ps-am\n\ninstall-ps-am:\n\ninstallcheck-am:\n\nmaintainer-clean: maintainer-clean-am\n\t-rm -rf ./$(DEPDIR)\n\t-rm -f Makefile\nmaintainer-clean-am: distclean-am maintainer-clean-generic\n\nmostlyclean: mostlyclean-am\n\nmostlyclean-am: mostlyclean-compile mostlyclean-generic \\\n\tmostlyclean-libtool\n\npdf: pdf-am\n\npdf-am:\n\nps: ps-am\n\nps-am:\n\nuninstall-am: uninstall-binPROGRAMS\n\n.MAKE: install-am install-strip\n\n.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean \\\n\tclean-binPROGRAMS clean-generic clean-libtool cscopelist-am \\\n\tctags ctags-am distclean distclean-compile distclean-generic \\\n\tdistclean-libtool distclean-tags distdir dvi dvi-am html \\\n\thtml-am info info-am install install-am install-binPROGRAMS \\\n\tinstall-data install-data-am install-dvi install-dvi-am \\\n\tinstall-exec install-exec-am install-html install-html-am \\\n\tinstall-info install-info-am install-man install-pdf \\\n\tinstall-pdf-am install-ps install-ps-am install-strip \\\n\tinstallcheck installcheck-am installdirs maintainer-clean \\\n\tmaintainer-clean-generic mostlyclean mostlyclean-compile \\\n\tmostlyclean-generic mostlyclean-libtool pdf pdf-am ps ps-am \\\n\ttags tags-am uninstall uninstall-am uninstall-binPROGRAMS\n\n.PRECIOUS: Makefile\n\n\n# Tell versions [3.59,3.63) of GNU make to not export all variables.\n# Otherwise a system limit (for SysV at least) may be exceeded.\n.NOEXPORT:\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/acl.c",
    "content": "/*\n * acl.c - Manage the ACL (Access Control List)\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#include <ipset/ipset.h>\n#include <ctype.h>\n\n#include \"rule.h\"\n#include \"utils.h\"\n#include \"cache.h\"\n#include \"acl.h\"\n\nstatic struct ip_set white_list_ipv4;\nstatic struct ip_set white_list_ipv6;\n\nstatic struct ip_set black_list_ipv4;\nstatic struct ip_set black_list_ipv6;\n\nstatic struct cork_dllist black_list_rules;\nstatic struct cork_dllist white_list_rules;\n\nstatic int acl_mode = BLACK_LIST;\n\nstatic struct cache *block_list;\n\nstatic struct ip_set outbound_block_list_ipv4;\nstatic struct ip_set outbound_block_list_ipv6;\nstatic struct cork_dllist outbound_block_list_rules;\n\n#ifdef __linux__\n\n#include <unistd.h>\n#include <stdio.h>\n\n#define NO_FIREWALL_MODE 0\n#define IPTABLES_MODE    1\n#define FIREWALLD_MODE   2\n\nstatic FILE *shell_stdin;\nstatic int mode = NO_FIREWALL_MODE;\n\nstatic char chain_name[64];\nstatic char *iptables_init_chain =\n    \"iptables -N %s; iptables -F %s; iptables -A OUTPUT -p tcp --tcp-flags RST RST -j %s\";\nstatic char *iptables_remove_chain =\n    \"iptables -D OUTPUT -p tcp --tcp-flags RST RST -j %s; iptables -F %s; iptables -X %s\";\nstatic char *iptables_add_rule    = \"iptables -A %s -d %s -j DROP\";\nstatic char *iptables_remove_rule = \"iptables -D %s -d %s -j DROP\";\n\nstatic char *ip6tables_init_chain =\n    \"ip6tables -N %s; ip6tables -F %s; ip6tables -A OUTPUT -p tcp --tcp-flags RST RST -j %s\";\nstatic char *ip6tables_remove_chain =\n    \"ip6tables -D OUTPUT -p tcp --tcp-flags RST RST -j %s; ip6tables -F %s; ip6tables -X %s\";\nstatic char *ip6tables_add_rule    = \"ip6tables -A %s -d %s -j DROP\";\nstatic char *ip6tables_remove_rule = \"ip6tables -D %s -d %s -j DROP\";\n\nstatic char *firewalld_init_chain =\n    \"firewall-cmd --direct --add-chain ipv4 filter %s; \\\n     firewall-cmd --direct --passthrough ipv4 -F %s; \\\n     firewall-cmd --direct --passthrough ipv4 -A OUTPUT -p tcp --tcp-flags RST RST -j %s\";\nstatic char *firewalld_remove_chain =\n    \"firewall-cmd --direct --passthrough ipv4 -D OUTPUT -p tcp --tcp-flags RST RST -j %s; \\\n     firewall-cmd --direct --passthrough ipv4 -F %s; \\\n     firewall-cmd --direct --remove-chain ipv4 filter %s\";\nstatic char *firewalld_add_rule    = \"firewall-cmd --direct --passthrough ipv4 -A %s -d %s -j DROP\";\nstatic char *firewalld_remove_rule = \"firewall-cmd --direct --passthrough ipv4 -D %s -d %s -j DROP\";\n\nstatic char *firewalld6_init_chain =\n    \"firewall-cmd --direct --add-chain ipv6 filter %s; \\\n     firewall-cmd --direct --passthrough ipv6 -F %s; \\\n     firewall-cmd --direct --passthrough ipv6 -A OUTPUT -p tcp --tcp-flags RST RST -j %s\";\nstatic char *firewalld6_remove_chain =\n    \"firewall-cmd --direct --passthrough ipv6 -D OUTPUT -p tcp --tcp-flags RST RST -j %s; \\\n     firewall-cmd --direct --passthrough ipv6 -F %s; \\\n     firewall-cmd --direct --remove-chain ipv6 filter %s\";\nstatic char *firewalld6_add_rule    = \"firewall-cmd --direct --passthrough ipv6 -A %s -d %s -j DROP\";\nstatic char *firewalld6_remove_rule = \"firewall-cmd --direct --passthrough ipv6 -D %s -d %s -j DROP\";\n\nstatic int\nrun_cmd(const char *cmd)\n{\n    int ret = 0;\n    char cmdstring[256];\n\n    sprintf(cmdstring, \"%s\\n\", cmd);\n    size_t len = strlen(cmdstring);\n\n    if (shell_stdin != NULL) {\n        ret = fwrite(cmdstring, 1, len, shell_stdin);\n        fflush(shell_stdin);\n    }\n\n    return ret == len;\n}\n\nstatic int\ninit_firewall()\n{\n    int ret = 0;\n    char cli[256];\n    FILE *fp;\n\n    if (getuid() != 0)\n        return -1;\n\n    sprintf(cli, \"firewall-cmd --version 2>&1\");\n    fp = popen(cli, \"r\");\n\n    if (fp == NULL)\n        return -1;\n\n    if (pclose(fp) == 0) {\n        mode = FIREWALLD_MODE;\n    } else {\n        /* Check whether we have permission to operate iptables.\n\t * Note that checking `iptables --version` is insufficient:\n         * eg, running within a child user namespace.\n\t */\n        sprintf(cli, \"iptables -L 2>&1\");\n        fp = popen(cli, \"r\");\n        if (fp == NULL)\n            return -1;\n        if (pclose(fp) == 0)\n            mode = IPTABLES_MODE;\n    }\n\n    sprintf(chain_name, \"SHADOWSOCKS_LIBEV_%d\", getpid());\n\n    if (mode == FIREWALLD_MODE) {\n        sprintf(cli, firewalld6_init_chain, chain_name, chain_name, chain_name);\n        ret |= system(cli);\n        sprintf(cli, firewalld_init_chain, chain_name, chain_name, chain_name);\n        ret |= system(cli);\n    } else if (mode == IPTABLES_MODE) {\n        sprintf(cli, ip6tables_init_chain, chain_name, chain_name, chain_name);\n        ret |= system(cli);\n        sprintf(cli, iptables_init_chain, chain_name, chain_name, chain_name);\n        ret |= system(cli);\n    }\n\n    shell_stdin = popen(\"/bin/sh\", \"w\");\n\n    return ret;\n}\n\nstatic int\nreset_firewall()\n{\n    int ret = 0;\n    char cli[256];\n\n    if (getuid() != 0)\n        return -1;\n\n    if (mode == IPTABLES_MODE) {\n        sprintf(cli, ip6tables_remove_chain, chain_name, chain_name, chain_name);\n        ret |= system(cli);\n        sprintf(cli, iptables_remove_chain, chain_name, chain_name, chain_name);\n        ret |= system(cli);\n    } else if (mode == FIREWALLD_MODE) {\n        sprintf(cli, firewalld6_remove_chain, chain_name, chain_name, chain_name);\n        ret |= system(cli);\n        sprintf(cli, firewalld_remove_chain, chain_name, chain_name, chain_name);\n        ret |= system(cli);\n    }\n\n    if (shell_stdin != NULL) {\n        run_cmd(\"exit 0\");\n        pclose(shell_stdin);\n    }\n\n    return ret;\n}\n\nstatic int\nset_firewall_rule(char *addr, int add)\n{\n    char cli[256];\n    struct cork_ip ip;\n\n    if (getuid() != 0)\n        return -1;\n\n    if (cork_ip_init(&ip, addr))\n        return -1;\n\n    if (add) {\n        if (mode == IPTABLES_MODE)\n            sprintf(cli, ip.version == 4 ? iptables_add_rule : ip6tables_add_rule,\n                    chain_name, addr);\n        else if (mode == FIREWALLD_MODE)\n            sprintf(cli, ip.version == 4 ? firewalld_add_rule : firewalld6_add_rule,\n                    chain_name, addr);\n        return run_cmd(cli);\n    } else {\n        if (mode == IPTABLES_MODE)\n            sprintf(cli, ip.version == 4 ? iptables_remove_rule : ip6tables_remove_rule,\n                    chain_name, addr);\n        else if (mode == FIREWALLD_MODE)\n            sprintf(cli, ip.version == 4 ? firewalld_remove_rule : firewalld6_remove_rule,\n                    chain_name, addr);\n        return run_cmd(cli);\n    }\n\n    return 0;\n}\n\nstatic void\nfree_firewall_rule(void *key, void *element)\n{\n    if (key == NULL)\n        return;\n    char *addr = (char *)key;\n    set_firewall_rule(addr, 0);\n    ss_free(element);\n}\n\n#endif\n\nvoid\ninit_block_list(int firewall)\n{\n    // Initialize cache\n#ifdef __linux__\n    if (firewall)\n        init_firewall();\n    else\n        mode = NO_FIREWALL_MODE;\n    cache_create(&block_list, 256, free_firewall_rule);\n#else\n    cache_create(&block_list, 256, NULL);\n#endif\n}\n\nvoid\nfree_block_list()\n{\n#ifdef __linux__\n    if (mode != NO_FIREWALL_MODE)\n        reset_firewall();\n#endif\n    cache_clear(block_list, 0); // Remove all items\n}\n\nint\nremove_from_block_list(char *addr)\n{\n    size_t addr_len = strlen(addr);\n    return cache_remove(block_list, addr, addr_len);\n}\n\nvoid\nclear_block_list()\n{\n    cache_clear(block_list, 3600); // Clear items older than 1 hour\n}\n\nint\ncheck_block_list(char *addr)\n{\n    size_t addr_len = strlen(addr);\n\n    if (cache_key_exist(block_list, addr, addr_len)) {\n        int *count = NULL;\n        cache_lookup(block_list, addr, addr_len, &count);\n\n        if (count != NULL && *count > MAX_TRIES)\n            return 1;\n    }\n\n    return 0;\n}\n\nint\nupdate_block_list(char *addr, int err_level)\n{\n    size_t addr_len = strlen(addr);\n\n    if (cache_key_exist(block_list, addr, addr_len)) {\n        int *count = NULL;\n        cache_lookup(block_list, addr, addr_len, &count);\n        if (count != NULL) {\n            if (*count > MAX_TRIES)\n                return 1;\n            (*count) += err_level;\n        }\n    } else if (err_level > 0) {\n        int *count = (int *)ss_malloc(sizeof(int));\n        *count = 1;\n        cache_insert(block_list, addr, addr_len, count);\n#ifdef __linux__\n        if (mode != NO_FIREWALL_MODE)\n            set_firewall_rule(addr, 1);\n#endif\n    }\n\n    return 0;\n}\n\nstatic void\nparse_addr_cidr(const char *str, char *host, int *cidr)\n{\n    int ret = -1, n = 0;\n    char *pch;\n\n    pch = strchr(str, '/');\n    while (pch != NULL) {\n        n++;\n        ret = pch - str;\n        pch = strchr(pch + 1, '/');\n    }\n    if (ret == -1) {\n        strcpy(host, str);\n        *cidr = -1;\n    } else {\n        memcpy(host, str, ret);\n        host[ret] = '\\0';\n        *cidr     = atoi(str + ret + 1);\n    }\n}\n\nchar *\ntrimwhitespace(char *str)\n{\n    char *end;\n\n    // Trim leading space\n    while (isspace(*str))\n        str++;\n\n    if (*str == 0)   // All spaces?\n        return str;\n\n    // Trim trailing space\n    end = str + strlen(str) - 1;\n    while (end > str && isspace(*end))\n        end--;\n\n    // Write new null terminator\n    *(end + 1) = 0;\n\n    return str;\n}\n\nint\ninit_acl(const char *path)\n{\n    // initialize ipset\n    ipset_init_library();\n\n    ipset_init(&white_list_ipv4);\n    ipset_init(&white_list_ipv6);\n    ipset_init(&black_list_ipv4);\n    ipset_init(&black_list_ipv6);\n    ipset_init(&outbound_block_list_ipv4);\n    ipset_init(&outbound_block_list_ipv6);\n\n    cork_dllist_init(&black_list_rules);\n    cork_dllist_init(&white_list_rules);\n    cork_dllist_init(&outbound_block_list_rules);\n\n    struct ip_set *list_ipv4  = &black_list_ipv4;\n    struct ip_set *list_ipv6  = &black_list_ipv6;\n    struct cork_dllist *rules = &black_list_rules;\n\n    FILE *f = fopen(path, \"r\");\n    if (f == NULL) {\n        LOGE(\"Invalid acl path.\");\n        return -1;\n    }\n\n    char buf[257];\n    while (!feof(f))\n        if (fgets(buf, 256, f)) {\n            // Trim the newline\n            int len = strlen(buf);\n            if (len > 0 && buf[len - 1] == '\\n') {\n                buf[len - 1] = '\\0';\n            }\n\n            char *line = trimwhitespace(buf);\n\n            // Skip comments\n            if (line[0] == '#') {\n                continue;\n            }\n\n            if (strlen(line) == 0) {\n                continue;\n            }\n\n            if (strcmp(line, \"[outbound_block_list]\") == 0) {\n                list_ipv4 = &outbound_block_list_ipv4;\n                list_ipv6 = &outbound_block_list_ipv6;\n                rules     = &outbound_block_list_rules;\n                continue;\n            } else if (strcmp(line, \"[black_list]\") == 0\n                       || strcmp(line, \"[bypass_list]\") == 0) {\n                list_ipv4 = &black_list_ipv4;\n                list_ipv6 = &black_list_ipv6;\n                rules     = &black_list_rules;\n                continue;\n            } else if (strcmp(line, \"[white_list]\") == 0\n                       || strcmp(line, \"[proxy_list]\") == 0) {\n                list_ipv4 = &white_list_ipv4;\n                list_ipv6 = &white_list_ipv6;\n                rules     = &white_list_rules;\n                continue;\n            } else if (strcmp(line, \"[reject_all]\") == 0\n                       || strcmp(line, \"[bypass_all]\") == 0) {\n                acl_mode = WHITE_LIST;\n                continue;\n            } else if (strcmp(line, \"[accept_all]\") == 0\n                       || strcmp(line, \"[proxy_all]\") == 0) {\n                acl_mode = BLACK_LIST;\n                continue;\n            }\n\n            char host[257];\n            int cidr;\n            parse_addr_cidr(line, host, &cidr);\n\n            struct cork_ip addr;\n            int err = cork_ip_init(&addr, host);\n            if (!err) {\n                if (addr.version == 4) {\n                    if (cidr >= 0) {\n                        ipset_ipv4_add_network(list_ipv4, &(addr.ip.v4), cidr);\n                    } else {\n                        ipset_ipv4_add(list_ipv4, &(addr.ip.v4));\n                    }\n                } else if (addr.version == 6) {\n                    if (cidr >= 0) {\n                        ipset_ipv6_add_network(list_ipv6, &(addr.ip.v6), cidr);\n                    } else {\n                        ipset_ipv6_add(list_ipv6, &(addr.ip.v6));\n                    }\n                }\n            } else {\n                rule_t *rule = new_rule();\n                accept_rule_arg(rule, line);\n                init_rule(rule);\n                add_rule(rules, rule);\n            }\n        }\n\n    fclose(f);\n\n    return 0;\n}\n\nvoid\nfree_rules(struct cork_dllist *rules)\n{\n    struct cork_dllist_item *iter;\n    while ((iter = cork_dllist_head(rules)) != NULL) {\n        rule_t *rule = cork_container_of(iter, rule_t, entries);\n        remove_rule(rule);\n    }\n}\n\nvoid\nfree_acl(void)\n{\n    ipset_done(&black_list_ipv4);\n    ipset_done(&black_list_ipv6);\n    ipset_done(&white_list_ipv4);\n    ipset_done(&white_list_ipv6);\n\n    free_rules(&black_list_rules);\n    free_rules(&white_list_rules);\n}\n\nint\nget_acl_mode(void)\n{\n    return acl_mode;\n}\n\n/*\n * Return 0,  if not match.\n * Return 1,  if match black list.\n * Return -1, if match white list.\n */\nint\nacl_match_host(const char *host)\n{\n    struct cork_ip addr;\n    int ret = 0;\n    int err = cork_ip_init(&addr, host);\n\n    if (err) {\n        int host_len = strlen(host);\n        if (lookup_rule(&black_list_rules, host, host_len) != NULL)\n            ret = 1;\n        else if (lookup_rule(&white_list_rules, host, host_len) != NULL)\n            ret = -1;\n        return ret;\n    }\n\n    if (addr.version == 4) {\n        if (ipset_contains_ipv4(&black_list_ipv4, &(addr.ip.v4)))\n            ret = 1;\n        else if (ipset_contains_ipv4(&white_list_ipv4, &(addr.ip.v4)))\n            ret = -1;\n    } else if (addr.version == 6) {\n        if (ipset_contains_ipv6(&black_list_ipv6, &(addr.ip.v6)))\n            ret = 1;\n        else if (ipset_contains_ipv6(&white_list_ipv6, &(addr.ip.v6)))\n            ret = -1;\n    }\n\n    return ret;\n}\n\nint\nacl_add_ip(const char *ip)\n{\n    struct cork_ip addr;\n    int err = cork_ip_init(&addr, ip);\n    if (err) {\n        return -1;\n    }\n\n    if (addr.version == 4) {\n        ipset_ipv4_add(&black_list_ipv4, &(addr.ip.v4));\n    } else if (addr.version == 6) {\n        ipset_ipv6_add(&black_list_ipv6, &(addr.ip.v6));\n    }\n\n    return 0;\n}\n\nint\nacl_remove_ip(const char *ip)\n{\n    struct cork_ip addr;\n    int err = cork_ip_init(&addr, ip);\n    if (err) {\n        return -1;\n    }\n\n    if (addr.version == 4) {\n        ipset_ipv4_remove(&black_list_ipv4, &(addr.ip.v4));\n    } else if (addr.version == 6) {\n        ipset_ipv6_remove(&black_list_ipv6, &(addr.ip.v6));\n    }\n\n    return 0;\n}\n\n/*\n * Return 0,  if not match.\n * Return 1,  if match black list.\n */\nint\noutbound_block_match_host(const char *host)\n{\n    struct cork_ip addr;\n    int ret = 0;\n    int err = cork_ip_init(&addr, host);\n\n    if (err) {\n        int host_len = strlen(host);\n        if (lookup_rule(&outbound_block_list_rules, host, host_len) != NULL)\n            ret = 1;\n        return ret;\n    }\n\n    if (addr.version == 4) {\n        if (ipset_contains_ipv4(&outbound_block_list_ipv4, &(addr.ip.v4)))\n            ret = 1;\n    } else if (addr.version == 6) {\n        if (ipset_contains_ipv6(&outbound_block_list_ipv6, &(addr.ip.v6)))\n            ret = 1;\n    }\n\n    return ret;\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/acl.h",
    "content": "/*\n * acl.h - Define the ACL interface\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _ACL_H\n#define _ACL_H\n\n#define BLACK_LIST 0\n#define WHITE_LIST 1\n\n#define MAX_TRIES  64\n#define MALICIOUS  8\n#define SUSPICIOUS 4\n#define BAD        2\n#define MALFORMED  1\n\nint init_acl(const char *path);\nvoid free_acl(void);\nvoid clear_block_list(void);\n\nint acl_match_host(const char *ip);\nint acl_add_ip(const char *ip);\nint acl_remove_ip(const char *ip);\n\nint get_acl_mode(void);\n\nvoid init_block_list(int firewall);\nvoid free_block_list();\nint check_block_list(char *addr);\nint update_block_list(char *addr, int err_level);\nint remove_from_block_list(char *addr);\n\nint outbound_block_match_host(const char *host);\n\n#endif // _ACL_H\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/auth.c",
    "content": "\n#include \"auth.h\"\n\nstatic int auth_simple_pack_unit_size = 2000;\ntypedef int (*hmac_with_key_func)(char *auth, char *msg, int msg_len, uint8_t *auth_key, int key_len);\ntypedef int (*hash_func)(char *auth, char *msg, int msg_len);\n\ntypedef struct auth_simple_global_data {\n    uint8_t local_client_id[8];\n    uint32_t connection_id;\n}auth_simple_global_data;\n\ntypedef struct auth_simple_local_data {\n    int has_sent_header;\n    char * recv_buffer;\n    int recv_buffer_size;\n    uint32_t recv_id;\n    uint32_t pack_id;\n    char * salt;\n    uint8_t * user_key;\n    char uid[4];\n    int user_key_len;\n    hmac_with_key_func hmac;\n    hash_func hash;\n    int hash_len;\n}auth_simple_local_data;\n\nvoid auth_simple_local_data_init(auth_simple_local_data* local) {\n    local->has_sent_header = 0;\n    local->recv_buffer = (char*)malloc(16384);\n    local->recv_buffer_size = 0;\n    local->recv_id = 1;\n    local->pack_id = 1;\n    local->salt = \"\";\n    local->user_key = 0;\n    local->user_key_len = 0;\n    local->hmac = 0;\n    local->hash = 0;\n    local->hash_len = 0;\n    local->salt = \"\";\n}\n\nvoid * auth_simple_init_data() {\n    auth_simple_global_data *global = (auth_simple_global_data*)malloc(sizeof(auth_simple_global_data));\n    rand_bytes(global->local_client_id, 8);\n    rand_bytes((uint8_t*)&global->connection_id, 4);\n    global->connection_id &= 0xFFFFFF;\n    return global;\n}\n\nobfs * auth_simple_new_obfs() {\n    obfs * self = new_obfs();\n    self->l_data = malloc(sizeof(auth_simple_local_data));\n    auth_simple_local_data_init((auth_simple_local_data*)self->l_data);\n    return self;\n}\n\nobfs * auth_aes128_md5_new_obfs() {\n    obfs * self = new_obfs();\n    self->l_data = malloc(sizeof(auth_simple_local_data));\n    auth_simple_local_data_init((auth_simple_local_data*)self->l_data);\n    ((auth_simple_local_data*)self->l_data)->hmac = ss_md5_hmac_with_key;\n    ((auth_simple_local_data*)self->l_data)->hash = ss_md5_hash_func;\n    ((auth_simple_local_data*)self->l_data)->hash_len = 16;\n    ((auth_simple_local_data*)self->l_data)->salt = \"auth_aes128_md5\";\n    return self;\n}\n\nobfs * auth_aes128_sha1_new_obfs() {\n    obfs * self = new_obfs();\n    self->l_data = malloc(sizeof(auth_simple_local_data));\n    auth_simple_local_data_init((auth_simple_local_data*)self->l_data);\n    ((auth_simple_local_data*)self->l_data)->hmac = ss_sha1_hmac_with_key;\n    ((auth_simple_local_data*)self->l_data)->hash = ss_sha1_hash_func;\n    ((auth_simple_local_data*)self->l_data)->hash_len = 20;\n    ((auth_simple_local_data*)self->l_data)->salt = \"auth_aes128_sha1\";\n    return self;\n}\n\nvoid auth_simple_dispose(obfs *self) {\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    if (local->recv_buffer != NULL) {\n        free(local->recv_buffer);\n        local->recv_buffer = NULL;\n    }\n    if (local->user_key != NULL) {\n        free(local->user_key);\n        local->user_key = NULL;\n    }\n    free(local);\n    self->l_data = NULL;\n    dispose_obfs(self);\n}\n\nint auth_simple_pack_data(char *data, int datalength, char *outdata) {\n    unsigned char rand_len = (xorshift128plus() & 0xF) + 1;\n    int out_size = rand_len + datalength + 6;\n    outdata[0] = out_size >> 8;\n    outdata[1] = out_size;\n    outdata[2] = rand_len;\n    memmove(outdata + rand_len + 2, data, datalength);\n    fillcrc32((unsigned char *)outdata, out_size);\n    return out_size;\n}\n\nvoid memintcopy_lt(void *mem, uint32_t val) {\n    ((uint8_t *)mem)[0] = val;\n    ((uint8_t *)mem)[1] = val >> 8;\n    ((uint8_t *)mem)[2] = val >> 16;\n    ((uint8_t *)mem)[3] = val >> 24;\n}\n\nint auth_simple_pack_auth_data(auth_simple_global_data *global, char *data, int datalength, char *outdata) {\n    unsigned char rand_len = (xorshift128plus() & 0xF) + 1;\n    int out_size = rand_len + datalength + 6 + 12;\n    outdata[0] = out_size >> 8;\n    outdata[1] = out_size;\n    outdata[2] = rand_len;\n    ++global->connection_id;\n    if (global->connection_id > 0xFF000000) {\n        rand_bytes(global->local_client_id, 8);\n        rand_bytes((uint8_t*)&global->connection_id, 4);\n        global->connection_id &= 0xFFFFFF;\n    }\n    time_t t = time(NULL);\n    memintcopy_lt(outdata + rand_len + 2, t);\n    memmove(outdata + rand_len + 2 + 4, global->local_client_id, 4);\n    memintcopy_lt(outdata + rand_len + 2 + 8, global->connection_id);\n    memmove(outdata + rand_len + 2 + 12, data, datalength);\n    fillcrc32((unsigned char *)outdata, out_size);\n    return out_size;\n}\n\nint auth_simple_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc(datalength * 2 + 64);\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    if (len > 0 && local->has_sent_header == 0) {\n        int head_size = get_head_size(plaindata, datalength, 30);\n        if (head_size > datalength)\n            head_size = datalength;\n        pack_len = auth_simple_pack_auth_data((auth_simple_global_data *)self->server.g_data, data, head_size, buffer);\n        buffer += pack_len;\n        data += head_size;\n        len -= head_size;\n        local->has_sent_header = 1;\n    }\n    while ( len > auth_simple_pack_unit_size ) {\n        pack_len = auth_simple_pack_data(data, auth_simple_pack_unit_size, buffer);\n        buffer += pack_len;\n        data += auth_simple_pack_unit_size;\n        len -= auth_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = auth_simple_pack_data(data, len, buffer);\n        buffer += pack_len;\n    }\n    len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_simple_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    char * out_buffer = (char*)malloc(local->recv_buffer_size);\n    char * buffer = out_buffer;\n    while (local->recv_buffer_size > 2) {\n        int length = ((int)recv_buffer[0] << 8) | recv_buffer[1];\n        if (length >= 8192 || length < 7) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        int crc = crc32((unsigned char*)recv_buffer, length);\n        if (crc != -1) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        int data_size = length - recv_buffer[2] - 6;\n        memmove(buffer, recv_buffer + 2 + recv_buffer[2], data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\n\nint auth_sha1_pack_data(char *data, int datalength, char *outdata) {\n    unsigned char rand_len = (xorshift128plus() & 0xF) + 1;\n    int out_size = rand_len + datalength + 6;\n    outdata[0] = out_size >> 8;\n    outdata[1] = out_size;\n    outdata[2] = rand_len;\n    memmove(outdata + rand_len + 2, data, datalength);\n    filladler32((unsigned char *)outdata, out_size);\n    return out_size;\n}\n\nint auth_sha1_pack_auth_data(auth_simple_global_data *global, server_info *server, char *data, int datalength, char *outdata) {\n    unsigned char rand_len = (xorshift128plus() & 0x7F) + 1;\n    int data_offset = rand_len + 4 + 2;\n    int out_size = data_offset + datalength + 12 + OBFS_HMAC_SHA1_LEN;\n    fillcrc32to((unsigned char *)server->key, server->key_len, (unsigned char *)outdata);\n    outdata[4] = out_size >> 8;\n    outdata[5] = out_size;\n    outdata[6] = rand_len;\n    ++global->connection_id;\n    if (global->connection_id > 0xFF000000) {\n        rand_bytes(global->local_client_id, 8);\n        rand_bytes((uint8_t*)&global->connection_id, 4);\n        global->connection_id &= 0xFFFFFF;\n    }\n    time_t t = time(NULL);\n    memintcopy_lt(outdata + data_offset, t);\n    memmove(outdata + data_offset + 4, global->local_client_id, 4);\n    memintcopy_lt(outdata + data_offset + 8, global->connection_id);\n    memmove(outdata + data_offset + 12, data, datalength);\n    char hash[ONETIMEAUTH_BYTES * 2];\n    ss_sha1_hmac(hash, outdata, out_size - OBFS_HMAC_SHA1_LEN, server->iv);\n    memcpy(outdata + out_size - OBFS_HMAC_SHA1_LEN, hash, OBFS_HMAC_SHA1_LEN);\n    return out_size;\n}\n\nint auth_sha1_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc(datalength * 2 + 256);\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    if (len > 0 && local->has_sent_header == 0) {\n        int head_size = get_head_size(plaindata, datalength, 30);\n        if (head_size > datalength)\n            head_size = datalength;\n        pack_len = auth_sha1_pack_auth_data((auth_simple_global_data *)self->server.g_data, &self->server, data, head_size, buffer);\n        buffer += pack_len;\n        data += head_size;\n        len -= head_size;\n        local->has_sent_header = 1;\n    }\n    while ( len > auth_simple_pack_unit_size ) {\n        pack_len = auth_sha1_pack_data(data, auth_simple_pack_unit_size, buffer);\n        buffer += pack_len;\n        data += auth_simple_pack_unit_size;\n        len -= auth_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = auth_sha1_pack_data(data, len, buffer);\n        buffer += pack_len;\n    }\n    len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_sha1_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    char * out_buffer = (char*)malloc(local->recv_buffer_size);\n    char * buffer = out_buffer;\n    while (local->recv_buffer_size > 2) {\n        int length = ((int)recv_buffer[0] << 8) | recv_buffer[1];\n        if (length >= 8192 || length < 7) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        if (checkadler32((unsigned char*)recv_buffer, length) == 0) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        int pos = recv_buffer[2] + 2;\n        int data_size = length - pos - 4;\n        memmove(buffer, recv_buffer + pos, data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_sha1_v2_pack_data(char *data, int datalength, char *outdata) {\n    unsigned int rand_len = (datalength > 1300 ? 0 : datalength > 400 ? (xorshift128plus() & 0x7F) : (xorshift128plus() & 0x3FF)) + 1;\n    int out_size = rand_len + datalength + 6;\n    outdata[0] = out_size >> 8;\n    outdata[1] = out_size;\n    if (rand_len < 128)\n    {\n        outdata[2] = rand_len;\n    }\n    else\n    {\n        outdata[2] = 0xFF;\n        outdata[3] = rand_len >> 8;\n        outdata[4] = rand_len;\n    }\n    memmove(outdata + rand_len + 2, data, datalength);\n    filladler32((unsigned char *)outdata, out_size);\n    return out_size;\n}\n\nint auth_sha1_v2_pack_auth_data(auth_simple_global_data *global, server_info *server, char *data, int datalength, char *outdata) {\n    unsigned int rand_len = (datalength > 1300 ? 0 : datalength > 400 ? (xorshift128plus() & 0x7F) : (xorshift128plus() & 0x3FF)) + 1;\n    int data_offset = rand_len + 4 + 2;\n    int out_size = data_offset + datalength + 12 + OBFS_HMAC_SHA1_LEN;\n    const char* salt = \"auth_sha1_v2\";\n    int salt_len = strlen(salt);\n    unsigned char *crc_salt = (unsigned char*)malloc(salt_len + server->key_len);\n    memcpy(crc_salt, salt, salt_len);\n    memcpy(crc_salt + salt_len, server->key, server->key_len);\n    fillcrc32to(crc_salt, salt_len + server->key_len, (unsigned char *)outdata);\n    free(crc_salt);\n    outdata[4] = out_size >> 8;\n    outdata[5] = out_size;\n    if (rand_len < 128)\n    {\n        outdata[6] = rand_len;\n    }\n    else\n    {\n        outdata[6] = 0xFF;\n        outdata[7] = rand_len >> 8;\n        outdata[8] = rand_len;\n    }\n    ++global->connection_id;\n    if (global->connection_id > 0xFF000000) {\n        rand_bytes(global->local_client_id, 8);\n        rand_bytes((uint8_t*)&global->connection_id, 4);\n        global->connection_id &= 0xFFFFFF;\n    }\n    memmove(outdata + data_offset, global->local_client_id, 8);\n    memintcopy_lt(outdata + data_offset + 8, global->connection_id);\n    memmove(outdata + data_offset + 12, data, datalength);\n    char hash[ONETIMEAUTH_BYTES * 2];\n    ss_sha1_hmac(hash, outdata, out_size - OBFS_HMAC_SHA1_LEN, server->iv);\n    memcpy(outdata + out_size - OBFS_HMAC_SHA1_LEN, hash, OBFS_HMAC_SHA1_LEN);\n    return out_size;\n}\n\nint auth_sha1_v2_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc(datalength * 2 + 4096);\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    if (len > 0 && local->has_sent_header == 0) {\n        int head_size = get_head_size(plaindata, datalength, 30);\n        if (head_size > datalength)\n            head_size = datalength;\n        pack_len = auth_sha1_v2_pack_auth_data((auth_simple_global_data *)self->server.g_data, &self->server, data, head_size, buffer);\n        buffer += pack_len;\n        data += head_size;\n        len -= head_size;\n        local->has_sent_header = 1;\n    }\n    while ( len > auth_simple_pack_unit_size ) {\n        pack_len = auth_sha1_v2_pack_data(data, auth_simple_pack_unit_size, buffer);\n        buffer += pack_len;\n        data += auth_simple_pack_unit_size;\n        len -= auth_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = auth_sha1_v2_pack_data(data, len, buffer);\n        buffer += pack_len;\n    }\n    len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_sha1_v2_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    char * out_buffer = (char*)malloc(local->recv_buffer_size);\n    char * buffer = out_buffer;\n    char error = 0;\n    while (local->recv_buffer_size > 2) {\n        int length = ((int)recv_buffer[0] << 8) | recv_buffer[1];\n        if (length >= 8192 || length < 7) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        if (checkadler32((unsigned char*)recv_buffer, length) == 0) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        int pos = recv_buffer[2];\n        if (pos < 255)\n        {\n            pos += 2;\n        }\n        else\n        {\n            pos = ((recv_buffer[3] << 8) | recv_buffer[4]) + 2;\n        }\n        int data_size = length - pos - 4;\n        memmove(buffer, recv_buffer + pos, data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len;\n    if (error == 0) {\n        len = buffer - out_buffer;\n        if (*capacity < len) {\n            *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n            plaindata = *pplaindata;\n        }\n        memmove(plaindata, out_buffer, len);\n    } else {\n        len = -1;\n    }\n    free(out_buffer);\n    return len;\n}\n\nint auth_sha1_v4_pack_data(char *data, int datalength, char *outdata) {\n    unsigned int rand_len = (datalength > 1300 ? 0 : datalength > 400 ? (xorshift128plus() & 0x7F) : (xorshift128plus() & 0x3FF)) + 1;\n    int out_size = rand_len + datalength + 8;\n    outdata[0] = out_size >> 8;\n    outdata[1] = out_size;\n    uint32_t crc_val = crc32((unsigned char*)outdata, 2);\n    outdata[2] = crc_val;\n    outdata[3] = crc_val >> 8;\n    if (rand_len < 128)\n    {\n        outdata[4] = rand_len;\n    }\n    else\n    {\n        outdata[4] = 0xFF;\n        outdata[5] = rand_len >> 8;\n        outdata[6] = rand_len;\n    }\n    memmove(outdata + rand_len + 4, data, datalength);\n    filladler32((unsigned char *)outdata, out_size);\n    return out_size;\n}\n\nint auth_sha1_v4_pack_auth_data(auth_simple_global_data *global, server_info *server, char *data, int datalength, char *outdata) {\n    unsigned int rand_len = (datalength > 1300 ? 0 : datalength > 400 ? (xorshift128plus() & 0x7F) : (xorshift128plus() & 0x3FF)) + 1;\n    int data_offset = rand_len + 4 + 2;\n    int out_size = data_offset + datalength + 12 + OBFS_HMAC_SHA1_LEN;\n    const char* salt = \"auth_sha1_v4\";\n    int salt_len = strlen(salt);\n    unsigned char *crc_salt = (unsigned char*)malloc(salt_len + server->key_len + 2);\n    crc_salt[0] = outdata[0] = out_size >> 8;\n    crc_salt[1] = outdata[1] = out_size;\n\n    memcpy(crc_salt + 2, salt, salt_len);\n    memcpy(crc_salt + salt_len + 2, server->key, server->key_len);\n    fillcrc32to(crc_salt, salt_len + server->key_len + 2, (unsigned char *)outdata + 2);\n    free(crc_salt);\n    if (rand_len < 128)\n    {\n        outdata[6] = rand_len;\n    }\n    else\n    {\n        outdata[6] = 0xFF;\n        outdata[7] = rand_len >> 8;\n        outdata[8] = rand_len;\n    }\n    ++global->connection_id;\n    if (global->connection_id > 0xFF000000) {\n        rand_bytes(global->local_client_id, 8);\n        rand_bytes((uint8_t*)&global->connection_id, 4);\n        global->connection_id &= 0xFFFFFF;\n    }\n    time_t t = time(NULL);\n    memintcopy_lt(outdata + data_offset, t);\n    memmove(outdata + data_offset + 4, global->local_client_id, 4);\n    memintcopy_lt(outdata + data_offset + 8, global->connection_id);\n    memmove(outdata + data_offset + 12, data, datalength);\n    char hash[ONETIMEAUTH_BYTES * 2];\n    ss_sha1_hmac(hash, outdata, out_size - OBFS_HMAC_SHA1_LEN, server->iv);\n    memcpy(outdata + out_size - OBFS_HMAC_SHA1_LEN, hash, OBFS_HMAC_SHA1_LEN);\n    return out_size;\n}\n\nint auth_sha1_v4_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc(datalength * 2 + 4096);\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    if (len > 0 && local->has_sent_header == 0) {\n        int head_size = get_head_size(plaindata, datalength, 30);\n        if (head_size > datalength)\n            head_size = datalength;\n        pack_len = auth_sha1_v4_pack_auth_data((auth_simple_global_data *)self->server.g_data, &self->server, data, head_size, buffer);\n        buffer += pack_len;\n        data += head_size;\n        len -= head_size;\n        local->has_sent_header = 1;\n    }\n    while ( len > auth_simple_pack_unit_size ) {\n        pack_len = auth_sha1_v4_pack_data(data, auth_simple_pack_unit_size, buffer);\n        buffer += pack_len;\n        data += auth_simple_pack_unit_size;\n        len -= auth_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = auth_sha1_v4_pack_data(data, len, buffer);\n        buffer += pack_len;\n    }\n    len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_sha1_v4_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    char * out_buffer = (char*)malloc(local->recv_buffer_size);\n    char * buffer = out_buffer;\n    char error = 0;\n    while (local->recv_buffer_size > 4) {\n        uint32_t crc_val = crc32((unsigned char*)recv_buffer, 2);\n        if ((((uint32_t)recv_buffer[3] << 8) | recv_buffer[2]) != (crc_val & 0xffff)) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        int length = ((int)recv_buffer[0] << 8) | recv_buffer[1];\n        if (length >= 8192 || length < 7) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        if (checkadler32((unsigned char*)recv_buffer, length) == 0) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        int pos = recv_buffer[4];\n        if (pos < 255)\n        {\n            pos += 4;\n        }\n        else\n        {\n            pos = (((int)recv_buffer[5] << 8) | recv_buffer[6]) + 4;\n        }\n        int data_size = length - pos - 4;\n        memmove(buffer, recv_buffer + pos, data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len;\n    if (error == 0) {\n        len = buffer - out_buffer;\n        if (*capacity < len) {\n            *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n            plaindata = *pplaindata;\n        }\n        memmove(plaindata, out_buffer, len);\n    } else {\n        len = -1;\n    }\n    free(out_buffer);\n    return len;\n}\n\n\nint auth_aes128_sha1_pack_data(char *data, int datalength, char *outdata, auth_simple_local_data *local, server_info *server) {\n    unsigned int rand_len = (datalength > 1200 ? 0 : local->pack_id > 4 ? (xorshift128plus() & 0x20) : datalength > 900 ? (xorshift128plus() & 0x80) : (xorshift128plus() & 0x200)) + 1;\n    int out_size = rand_len + datalength + 8;\n    memcpy(outdata + rand_len + 4, data, datalength);\n    outdata[0] = out_size;\n    outdata[1] = out_size >> 8;\n    uint8_t key_len = local->user_key_len + 4;\n    uint8_t *key = (uint8_t*)malloc(key_len);\n    memcpy(key, local->user_key, local->user_key_len);\n    memintcopy_lt(key + key_len - 4, local->pack_id);\n\n    {\n        uint8_t rnd_data[rand_len];\n        rand_bytes(rnd_data, rand_len);\n        memcpy(outdata + 4, rnd_data, rand_len);\n    }\n\n    {\n        char hash[20];\n        local->hmac(hash, outdata, 2, key, key_len);\n        memcpy(outdata + 2, hash, 2);\n    }\n\n    if (rand_len < 128)\n    {\n        outdata[4] = rand_len;\n    }\n    else\n    {\n        outdata[4] = 0xFF;\n        outdata[5] = rand_len;\n        outdata[6] = rand_len >> 8;\n    }\n    ++local->pack_id;\n\n    {\n        char hash[20];\n        local->hmac(hash, outdata, out_size - 4, key, key_len);\n        memcpy(outdata + out_size - 4, hash, 4);\n    }\n    free(key);\n\n    return out_size;\n}\n\nint auth_aes128_sha1_pack_auth_data(auth_simple_global_data *global, server_info *server, auth_simple_local_data *local, char *data, int datalength, char *outdata) {\n    unsigned int rand_len = (datalength > 400 ? (xorshift128plus() & 0x200) : (xorshift128plus() & 0x400));\n    int data_offset = rand_len + 16 + 4 + 4 + 7;\n    int out_size = data_offset + datalength + 4;\n\n    char encrypt[24];\n    char encrypt_data[16];\n\n    uint8_t *key = (uint8_t*)malloc(server->iv_len + server->key_len);\n    uint8_t key_len = server->iv_len + server->key_len;\n    memcpy(key, server->iv, server->iv_len);\n    memcpy(key + server->iv_len, server->key, server->key_len);\n\n    {\n        uint8_t rnd_data[rand_len];\n        rand_bytes(rnd_data, rand_len);\n        memcpy(outdata + data_offset - rand_len, rnd_data, rand_len);\n    }\n\n    ++global->connection_id;\n    if (global->connection_id > 0xFF000000) {\n        rand_bytes(global->local_client_id, 8);\n        rand_bytes((uint8_t*)&global->connection_id, 4);\n        global->connection_id &= 0xFFFFFF;\n    }\n    time_t t = time(NULL);\n    memintcopy_lt(encrypt, t);\n    memcpy(encrypt + 4, global->local_client_id, 4);\n    memintcopy_lt(encrypt + 8, global->connection_id);\n    encrypt[12] = out_size;\n    encrypt[13] = out_size >> 8;\n    encrypt[14] = rand_len;\n    encrypt[15] = rand_len >> 8;\n\n    {\n\n        if (local->user_key == NULL) {\n            if(server->param != NULL && server->param[0] != 0) {\n                char *param = server->param;\n                char *delim = strchr(param, ':');\n                if(delim != NULL) {\n                    char uid_str[16] = {};\n                    strncpy(uid_str, param, delim - param);\n                    char key_str[128];\n                    strcpy(key_str, delim + 1);\n                    long uid_long = strtol(uid_str, NULL, 10);\n                    memintcopy_lt(local->uid, uid_long);\n\n                    char hash[21] = {0};\n                    local->hash(hash, key_str, strlen(key_str));\n\n                    local->user_key_len = local->hash_len;\n                    local->user_key = (uint8_t*)malloc(local->user_key_len);\n                    memcpy(local->user_key, hash, local->hash_len);\n                }\n            }\n            if (local->user_key == NULL) {\n                rand_bytes((uint8_t *)local->uid, 4);\n\n                local->user_key_len = server->key_len;\n                local->user_key = (uint8_t*)malloc(local->user_key_len);\n                memcpy(local->user_key, server->key, local->user_key_len);\n            }\n        }\n\n        char encrypt_key_base64[256] = {0};\n        unsigned char encrypt_key[local->user_key_len];\n        memcpy(encrypt_key, local->user_key, local->user_key_len);\n        base64_encode(encrypt_key, local->user_key_len, encrypt_key_base64);\n\n        int base64_len;\n        base64_len = (local->user_key_len + 2) / 3 * 4;\n        memcpy(encrypt_key_base64 + base64_len, local->salt, strlen(local->salt));\n\n        char enc_key[16];\n        int enc_key_len = base64_len + strlen(local->salt);\n        bytes_to_key_with_size(encrypt_key_base64, enc_key_len, (uint8_t*)enc_key, 16);\n        ss_aes_128_cbc(encrypt, encrypt_data, enc_key);\n        memcpy(encrypt + 4, encrypt_data, 16);\n        memcpy(encrypt, local->uid, 4);\n    }\n\n    {\n        char hash[20];\n        local->hmac(hash, encrypt, 20, key, key_len);\n        memcpy(encrypt + 20, hash, 4);\n    }\n\n    {\n        uint8_t rnd[1];\n        rand_bytes(rnd, 1);\n        memcpy(outdata, rnd, 1);\n        char hash[20];\n        local->hmac(hash, (char *)rnd, 1, key, key_len);\n        memcpy(outdata + 1, hash, 6);\n    }\n\n    memcpy(outdata + 7, encrypt, 24);\n    memcpy(outdata + data_offset, data, datalength);\n\n    {\n        char hash[20];\n        local->hmac(hash, outdata, out_size - 4, local->user_key, local->user_key_len);\n        memmove(outdata + out_size - 4, hash, 4);\n    }\n    free(key);\n\n    return out_size;\n}\n\nint auth_aes128_sha1_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc(datalength * 2 + 4096);\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    if (len > 0 && local->has_sent_header == 0) {\n        int head_size = 1200;\n        if (head_size > datalength)\n            head_size = datalength;\n        pack_len = auth_aes128_sha1_pack_auth_data((auth_simple_global_data *)self->server.g_data, &self->server, local, data, head_size, buffer);\n        buffer += pack_len;\n        data += head_size;\n        len -= head_size;\n        local->has_sent_header = 1;\n    }\n    while ( len > auth_simple_pack_unit_size ) {\n        pack_len = auth_aes128_sha1_pack_data(data, auth_simple_pack_unit_size, buffer, local, &self->server);\n        buffer += pack_len;\n        data += auth_simple_pack_unit_size;\n        len -= auth_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = auth_aes128_sha1_pack_data(data, len, buffer, local, &self->server);\n        buffer += pack_len;\n    }\n    len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint auth_aes128_sha1_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    //server_info *server = (server_info*)&self->server;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    int key_len = local->user_key_len + 4;\n    uint8_t *key = (uint8_t*)malloc(key_len);\n    memcpy(key, local->user_key, local->user_key_len);\n\n    char * out_buffer = (char*)malloc(local->recv_buffer_size);\n    char * buffer = out_buffer;\n    char error = 0;\n    while (local->recv_buffer_size > 4) {\n        memintcopy_lt(key + key_len - 4, local->recv_id);\n\n        {\n            char hash[20];\n            local->hmac(hash, (char*)recv_buffer, 2, key, key_len);\n\n            if (memcmp(hash, recv_buffer + 2, 2)) {\n                local->recv_buffer_size = 0;\n                error = 1;\n                break;\n            }\n        }\n\n        int length = ((int)recv_buffer[1] << 8) + recv_buffer[0];\n        if (length >= 8192 || length < 8) {\n            local->recv_buffer_size = 0;\n            error = 1;\n            break;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        {\n            char hash[20];\n            local->hmac(hash, (char *)recv_buffer, length - 4, key, key_len);\n            if (memcmp(hash, recv_buffer + length - 4, 4))\n            {\n                local->recv_buffer_size = 0;\n                error = 1;\n                break;\n            }\n        }\n\n        ++local->recv_id;\n        int pos = recv_buffer[4];\n        if (pos < 255)\n        {\n            pos += 4;\n        }\n        else\n        {\n            pos = (((int)recv_buffer[6] << 8) | recv_buffer[5]) + 4;\n        }\n        int data_size = length - pos - 4;\n        memmove(buffer, recv_buffer + pos, data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len;\n    if (error == 0) {\n        len = buffer - out_buffer;\n        if (*capacity < len) {\n            *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n            plaindata = *pplaindata;\n        }\n        memmove(plaindata, out_buffer, len);\n    } else {\n        len = -1;\n    }\n    free(out_buffer);\n    free(key);\n    return len;\n}\n\nint auth_aes128_sha1_client_udp_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc(datalength + 8);\n\n    if (local->user_key == NULL) {\n        if(self->server.param != NULL && self->server.param[0] != 0) {\n            char *param = self->server.param;\n            char *delim = strchr(param, ':');\n            if(delim != NULL) {\n                char uid_str[16] = {};\n                strncpy(uid_str, param, delim - param);\n                char key_str[128];\n                strcpy(key_str, delim + 1);\n                long uid_long = strtol(uid_str, NULL, 10);\n                memintcopy_lt(local->uid, uid_long);\n\n                char hash[21] = {0};\n                local->hash(hash, key_str, strlen(key_str));\n\n                local->user_key_len = local->hash_len;\n                local->user_key = (uint8_t*)malloc(local->user_key_len);\n                memcpy(local->user_key, hash, local->hash_len);\n            }\n        }\n        if (local->user_key == NULL) {\n            rand_bytes((uint8_t *)local->uid, 4);\n\n            local->user_key_len = self->server.key_len;\n            local->user_key = (uint8_t*)malloc(local->user_key_len);\n            memcpy(local->user_key, self->server.key, local->user_key_len);\n        }\n    }\n\n    int outlength = datalength + 8;\n    memmove(out_buffer, plaindata, datalength);\n    memmove(out_buffer + datalength, local->uid, 4);\n\n    {\n        char hash[20];\n        local->hmac(hash, out_buffer, outlength - 4, local->user_key, local->user_key_len);\n        memmove(out_buffer + outlength - 4, hash, 4);\n    }\n\n    if (*capacity < outlength) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = outlength * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, outlength);\n\n    free(out_buffer);\n    return outlength;\n}\n\nint auth_aes128_sha1_client_udp_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity) {\n    if (datalength <= 4)\n        return 0;\n\n    char *plaindata = *pplaindata;\n    auth_simple_local_data *local = (auth_simple_local_data*)self->l_data;\n\n    char hash[20];\n    local->hmac(hash, plaindata, datalength - 4, self->server.key, self->server.key_len);\n\n    if (memcmp(hash, plaindata + datalength - 4, 4))\n    {\n        return 0;\n    }\n\n    return datalength - 4;\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/auth.h",
    "content": "/*\n * auth.h - Define shadowsocksR server's buffers and callbacks\n *\n * Copyright (C) 2015 - 2016, Break Wa11 <mmgac001@gmail.com>\n */\n\n#ifndef _AUTH_H\n#define _AUTH_H\n\nvoid * auth_simple_init_data();\nobfs * auth_simple_new_obfs();\nvoid auth_simple_dispose(obfs *self);\n\nint auth_simple_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint auth_simple_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\n\nint auth_sha1_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint auth_sha1_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\nint auth_sha1_v2_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint auth_sha1_v2_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\nint auth_sha1_v4_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint auth_sha1_v4_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\nint auth_aes128_sha1_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint auth_aes128_sha1_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\n#endif // _AUTH_H\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/base64.c",
    "content": "#include \"base64.h\"\n\n/* BASE 64 encode table */\nstatic const char base64en[] = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\";\n\n#define BASE64_PAD  '='\n\n#define BASE64DE_FIRST  '+'\n#define BASE64DE_LAST   'z'\n\n/* ASCII order for BASE 64 decode, -1 in unused character */\nstatic const signed char base64de[] = {\n        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,\n        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,\n        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,\n        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,\n        -1,  -1,  -1,  -1,  -1,  -1,  -1,  -1,\n    /*                '+', ',', '-', '.', '/', */\n        -1,  -1,  -1,  62,  -1,  -1,  -1,  63,\n    /* '0', '1', '2', '3', '4', '5', '6', '7', */\n        52,  53,  54,  55,  56,  57,  58,  59,\n    /* '8', '9', ':', ';', '<', '=', '>', '?', */\n        60,  61,  -1,  -1,  -1,  -1,  -1,  -1,\n    /* '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', */\n        -1,   0,   1,   2,   3,   4,   5,   6,\n    /* 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', */\n         7,   8,   9,  10,  11,  12,  13,  14,\n    /* 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', */\n        15,  16,  17,  18,  19,  20,  21,  22,\n    /* 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', */\n        23,  24,  25,  -1,  -1,  -1,  -1,  -1,\n    /* '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', */\n        -1,  26,  27,  28,  29,  30,  31,  32,\n    /* 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', */\n        33,  34,  35,  36,  37,  38,  39,  40,\n    /* 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', */\n        41,  42,  43,  44,  45,  46,  47,  48,\n    /* 'x', 'y', 'z', */\n        49,  50,  51,\n};\n\nint\nbase64_encode(const unsigned char *in, unsigned int inlen, char *out)\n{\n    unsigned int i, j;\n\n    for (i = j = 0; i < inlen; i++) {\n        int s = i % 3;          /* from 6/gcd(6, 8) */\n\n        switch (s) {\n        case 0:\n            out[j++] = base64en[(in[i] >> 2) & 0x3F];\n            continue;\n        case 1:\n            out[j++] = base64en[((in[i-1] & 0x3) << 4) + ((in[i] >> 4) & 0xF)];\n            continue;\n        case 2:\n            out[j++] = base64en[((in[i-1] & 0xF) << 2) + ((in[i] >> 6) & 0x3)];\n            out[j++] = base64en[in[i] & 0x3F];\n        }\n    }\n\n    /* move back */\n    i -= 1;\n\n    /* check the last and add padding */\n    if ((i % 3) == 0) {\n        out[j++] = base64en[(in[i] & 0x3) << 4];\n        out[j++] = BASE64_PAD;\n        out[j++] = BASE64_PAD;\n    } else if ((i % 3) == 1) {\n        out[j++] = base64en[(in[i] & 0xF) << 2];\n        out[j++] = BASE64_PAD;\n    }\n\n    return BASE64_OK;\n}\n\nint\nbase64_decode(const char *in, unsigned int inlen, unsigned char *out)\n{\n    unsigned int i, j;\n\n    for (i = j = 0; i < inlen; i++) {\n        int c;\n        int s = i % 4;          /* from 8/gcd(6, 8) */\n\n        if (in[i] == '=')\n            return BASE64_OK;\n\n        if (in[i] < BASE64DE_FIRST || in[i] > BASE64DE_LAST ||\n            (c = base64de[(int)in[i]]) == -1)\n            return BASE64_INVALID;\n\n        switch (s) {\n        case 0:\n            out[j] = ((unsigned int)c << 2) & 0xFF;\n            continue;\n        case 1:\n            out[j++] += ((unsigned int)c >> 4) & 0x3;\n\n            /* if not last char with padding */\n            if (i < (inlen - 3) || in[inlen - 2] != '=')\n                out[j] = ((unsigned int)c & 0xF) << 4; \n            continue;\n        case 2:\n            out[j++] += ((unsigned int)c >> 2) & 0xF;\n\n            /* if not last char with padding */\n            if (i < (inlen - 2) || in[inlen - 1] != '=')\n                out[j] =  ((unsigned int)c & 0x3) << 6;\n            continue;\n        case 3:\n            out[j++] += (unsigned char)c;\n        }\n    }\n\n    return BASE64_OK;\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/base64.h",
    "content": "#ifndef __BASE64_H__\n#define __BASE64_H__\n\nenum {BASE64_OK = 0, BASE64_INVALID};\n\n#define BASE64_ENCODE_OUT_SIZE(s)\t(((s) + 2) / 3 * 4)\n#define BASE64_DECODE_OUT_SIZE(s)\t(((s)) / 4 * 3)\n\nint\nbase64_encode(const unsigned char *in, unsigned int inlen, char *out);\n\nint\nbase64_decode(const char *in, unsigned int inlen, unsigned char *out);\n\n\n#endif /* __BASE64_H__ */\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/cache.c",
    "content": "/*\n * cache.c - Manage the connection cache for UDPRELAY\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n/*\n * Original Author:  Oliver Lorenz (ol), olli@olorenz.org, https://olorenz.org\n * License:  This is licensed under the same terms as uthash itself\n */\n\n#include <errno.h>\n#include <stdlib.h>\n\n#include \"cache.h\"\n#include \"utils.h\"\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#endif\n\n/** Creates a new cache object\n *\n *  @param dst\n *  Where the newly allocated cache object will be stored in\n *\n *  @param capacity\n *  The maximum number of elements this cache object can hold\n *\n *  @return EINVAL if dst is NULL, ENOMEM if malloc fails, 0 otherwise\n */\nint\ncache_create(struct cache **dst, const size_t capacity,\n             void (*free_cb)(void *key, void *element))\n{\n    struct cache *new = NULL;\n\n    if (!dst) {\n        return EINVAL;\n    }\n\n    if ((new = malloc(sizeof(*new))) == NULL) {\n        return ENOMEM;\n    }\n\n    new->max_entries = capacity;\n    new->entries     = NULL;\n    new->free_cb     = free_cb;\n    *dst             = new;\n    return 0;\n}\n\n/** Frees an allocated cache object\n *\n *  @param cache\n *  The cache object to free\n *\n *  @param keep_data\n *  Whether to free contained data or just delete references to it\n *\n *  @return EINVAL if cache is NULL, 0 otherwise\n */\nint\ncache_delete(struct cache *cache, int keep_data)\n{\n    struct cache_entry *entry, *tmp;\n\n    if (!cache) {\n        return EINVAL;\n    }\n\n    if (keep_data) {\n        HASH_CLEAR(hh, cache->entries);\n    } else {\n        HASH_ITER(hh, cache->entries, entry, tmp){\n            HASH_DEL(cache->entries, entry);\n            if (entry->data != NULL) {\n                if (cache->free_cb) {\n                    cache->free_cb(entry->key, entry->data);\n                } else {\n                    ss_free(entry->data);\n                }\n            }\n            ss_free(entry->key);\n            ss_free(entry);\n        }\n    }\n\n    ss_free(cache);\n    return 0;\n}\n\n/** Clear old cache object\n *\n *  @param cache\n *  The cache object to clear\n *\n *  @param age\n *  Clear only objects older than the age (sec)\n *\n *  @return EINVAL if cache is NULL, 0 otherwise\n */\nint\ncache_clear(struct cache *cache, ev_tstamp age)\n{\n    struct cache_entry *entry, *tmp;\n\n    if (!cache) {\n        return EINVAL;\n    }\n\n    ev_tstamp now = ev_time();\n\n    HASH_ITER(hh, cache->entries, entry, tmp){\n        if (now - entry->ts > age) {\n            HASH_DEL(cache->entries, entry);\n            if (entry->data != NULL) {\n                if (cache->free_cb) {\n                    cache->free_cb(entry->key, entry->data);\n                } else {\n                    ss_free(entry->data);\n                }\n            }\n            ss_free(entry->key);\n            ss_free(entry);\n        }\n    }\n\n    return 0;\n}\n\n/** Removes a cache entry\n *\n *  @param cache\n *  The cache object\n *\n *  @param key\n *  The key of the entry to remove\n *\n *  @param key_len\n *  The length of key\n *\n *  @return EINVAL if cache is NULL, 0 otherwise\n */\nint\ncache_remove(struct cache *cache, char *key, size_t key_len)\n{\n    struct cache_entry *tmp;\n\n    if (!cache || !key) {\n        return EINVAL;\n    }\n\n    HASH_FIND(hh, cache->entries, key, key_len, tmp);\n\n    if (tmp) {\n        HASH_DEL(cache->entries, tmp);\n        if (tmp->data != NULL) {\n            if (cache->free_cb) {\n                cache->free_cb(tmp->key, tmp->data);\n            } else {\n                ss_free(tmp->data);\n            }\n        }\n        ss_free(tmp->key);\n        ss_free(tmp);\n    }\n\n    return 0;\n}\n\n/** Checks if a given key is in the cache\n *\n *  @param cache\n *  The cache object\n *\n *  @param key\n *  The key to look-up\n *\n *  @param key_len\n *  The length of key\n *\n *  @param result\n *  Where to store the result if key is found.\n *\n *  A warning: Even though result is just a pointer,\n *  you have to call this function with a **ptr,\n *  otherwise this will blow up in your face.\n *\n *  @return EINVAL if cache is NULL, 0 otherwise\n */\nint\ncache_lookup(struct cache *cache, char *key, size_t key_len, void *result)\n{\n    struct cache_entry *tmp = NULL;\n    char **dirty_hack       = result;\n\n    if (!cache || !key || !result) {\n        return EINVAL;\n    }\n\n    HASH_FIND(hh, cache->entries, key, key_len, tmp);\n    if (tmp) {\n        HASH_DELETE(hh, cache->entries, tmp);\n        tmp->ts = ev_time();\n        HASH_ADD_KEYPTR(hh, cache->entries, tmp->key, key_len, tmp);\n        *dirty_hack = tmp->data;\n    } else {\n        *dirty_hack = result = NULL;\n    }\n\n    return 0;\n}\n\nint\ncache_key_exist(struct cache *cache, char *key, size_t key_len)\n{\n    struct cache_entry *tmp = NULL;\n\n    if (!cache || !key) {\n        return 0;\n    }\n\n    HASH_FIND(hh, cache->entries, key, key_len, tmp);\n    if (tmp) {\n        HASH_DELETE(hh, cache->entries, tmp);\n        tmp->ts = ev_time();\n        HASH_ADD_KEYPTR(hh, cache->entries, tmp->key, key_len, tmp);\n        return 1;\n    } else {\n        return 0;\n    }\n\n    return 0;\n}\n\n/** Inserts a given <key, value> pair into the cache\n *\n *  @param cache\n *  The cache object\n *\n *  @param key\n *  The key that identifies <value>\n *\n *  @param key_len\n *  The length of key\n *\n *  @param data\n *  Data associated with <key>\n *\n *  @return EINVAL if cache is NULL, ENOMEM if malloc fails, 0 otherwise\n */\nint\ncache_insert(struct cache *cache, char *key, size_t key_len, void *data)\n{\n    struct cache_entry *entry     = NULL;\n    struct cache_entry *tmp_entry = NULL;\n\n    if (!cache) {\n        return EINVAL;\n    }\n\n    if ((entry = malloc(sizeof(*entry))) == NULL) {\n        return ENOMEM;\n    }\n\n    entry->key = ss_malloc(key_len + 1);\n    memcpy(entry->key, key, key_len);\n    entry->key[key_len] = 0;\n\n    entry->data = data;\n    entry->ts   = ev_time();\n    HASH_ADD_KEYPTR(hh, cache->entries, entry->key, key_len, entry);\n\n    if (HASH_COUNT(cache->entries) >= cache->max_entries) {\n        HASH_ITER(hh, cache->entries, entry, tmp_entry){\n            HASH_DELETE(hh, cache->entries, entry);\n            if (entry->data != NULL) {\n                if (cache->free_cb) {\n                    cache->free_cb(entry->key, entry->data);\n                } else {\n                    ss_free(entry->data);\n                }\n            }\n            ss_free(entry->key);\n            ss_free(entry);\n            break;\n        }\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/cache.h",
    "content": "/*\n * cache.h - Define the cache manager interface\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n/*\n * Original Author:  Oliver Lorenz (ol), olli@olorenz.org, https://olorenz.org\n * License:  This is licensed under the same terms as uthash itself\n */\n\n#ifndef _CACHE_\n#define _CACHE_\n\n#include \"uthash.h\"\n#include \"ev.h\"\n\n/**\n * A cache entry\n */\nstruct cache_entry {\n    char *key;         /**<The key */\n    void *data;        /**<Payload */\n    ev_tstamp ts;    /**<Timestamp */\n    UT_hash_handle hh; /**<Hash Handle for uthash */\n};\n\n/**\n * A cache object\n */\nstruct cache {\n    size_t max_entries;              /**<Amount of entries this cache object can hold */\n    struct cache_entry *entries;     /**<Head pointer for uthash */\n    void (*free_cb) (void *key, void *element); /**<Callback function to free cache entries */\n};\n\nint cache_create(struct cache **dst, const size_t capacity,\n                        void (*free_cb)(void *key, void *element));\nint cache_delete(struct cache *cache, int keep_data);\nint cache_clear(struct cache *cache, ev_tstamp age);\nint cache_lookup(struct cache *cache, char *key, size_t key_len, void *result);\nint cache_insert(struct cache *cache, char *key, size_t key_len, void *data);\nint cache_remove(struct cache *cache, char *key, size_t key_len);\nint cache_key_exist(struct cache *cache, char *key, size_t key_len);\n\n#endif\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/check.c",
    "content": "#include <stdlib.h>\n#include <stdio.h>\n#include <unistd.h>\n#include <fcntl.h>\n#include <sys/types.h>\n#include <sys/socket.h>\n#include <netdb.h>\n#include <netinet/in.h>\n#include <errno.h>\n#include <time.h>\n#include<arpa/inet.h>\n#include <setjmp.h>\n#include <signal.h>\n#include <string.h>\n\n//#define __DEBUG__  \n#ifdef __DEBUG__  \n#define DEBUG(format,...) printf(\"File: \"__FILE__\", Line: %05d: \"format\"/n\", __LINE__, ##__VA_ARGS__)  \n#else  \n#define DEBUG(format,...)  \n#endif  \n\nstatic sigjmp_buf jmpbuf;\nstatic void alarm_func()\n{\n    siglongjmp(jmpbuf, 1);\n}\n\nstatic struct hostent *timeGethostbyname(const char *domain, int timeout)\n{\n    struct hostent *ipHostent = NULL;\n    signal(SIGALRM, alarm_func);\n    if(sigsetjmp(jmpbuf, 1) != 0)\n    {\n        alarm(0);//timout\n        signal(SIGALRM, SIG_IGN);\n        return NULL;\n    }\n    alarm(timeout);//setting alarm\n    ipHostent = gethostbyname(domain);\n    signal(SIGALRM, SIG_IGN);\n    return ipHostent;\n}\n\n\n#define MY_HTTP_DEFAULT_PORT 80\n#define BUFFER_SIZE 1024\n#define HTTP_POST \"POST /%s HTTP/1.1\\r\\nHOST: %s:%d\\r\\nAccept: */*\\r\\n\"\\\n    \"Content-Type:application/x-www-form-urlencoded\\r\\nContent-Length: %d\\r\\n\\r\\n%s\"\n#define HTTP_GET \"GET /%s HTTP/1.1\\r\\nHOST: %s:%d\\r\\nAccept: */*\\r\\n\\r\\n\"\n\nstatic int http_parse_url(const char *url,char *host,char *file,int *port)\n{\n    char *ptr1,*ptr2;\n    int len = 0;\n    if(!url || !host || !file || !port){\n        return 1;\n    }\n\n    ptr1 = (char *)url;\n\n    if(!strncmp(ptr1,\"http://\",strlen(\"http://\"))){\n        ptr1 += strlen(\"http://\");\n    }else{\n        return 1;\n    }\n\n    ptr2 = strchr(ptr1,'/');\n    if(ptr2){\n        len = strlen(ptr1) - strlen(ptr2);\n        memcpy(host,ptr1,len);\n        host[len] = '\\0';\n        if(*(ptr2 + 1)){\n            memcpy(file,ptr2 + 1,strlen(ptr2) - 1 );\n            file[strlen(ptr2) - 1] = '\\0';\n        }\n    }else{\n        memcpy(host,ptr1,strlen(ptr1));\n        host[strlen(ptr1)] = '\\0';\n    }\n    //get host and ip\n    ptr1 = strchr(host,':');\n    if(ptr1){\n        *ptr1++ = '\\0';\n        *port = atoi(ptr1);\n    }else{\n        *port = MY_HTTP_DEFAULT_PORT;\n    }\n\n    return 0;\n}\n\n\nstatic int http_tcpclient_recv(int socket,char *lpbuff){\n    int recvnum = 0;\n\n    recvnum = recv(socket, lpbuff,BUFFER_SIZE*4,0);\n\n    return recvnum;\n}\n\nstatic int http_tcpclient_send(int socket,char *buff,int size){\n    int sent=0,tmpres=0;\n\n    while(sent < size){\n        tmpres = send(socket,buff+sent,size-sent,0);\n        if(tmpres == -1){\n            return 1;\n        }\n        sent += tmpres;\n    }\n    return sent;\n}\n\n\n\n\n\nint  http_get(const char *url,int socket_fd)\n{\n    char lpbuf[BUFFER_SIZE*4] = {'\\0'};\n\n    char host_addr[BUFFER_SIZE] = {'\\0'};\n    char file[BUFFER_SIZE] = {'\\0'};\n    int port = 0;\n\n\n    if(!url){\n       DEBUG(\"      failed!\\n\");\n        return 1;\n    }\n\n    if(http_parse_url(url,host_addr,file,&port)){\n       DEBUG(\"http_parse_url failed!\\n\");\n        return 1;\n    }\n    DEBUG(\"url:  %s\\thost_addr : %s\\tfile:%s\\t,%d\\n\",url,host_addr,file,port);\n\n\n    if(socket_fd < 0){\n       DEBUG(\"http_tcpclient_create failed\\n\");\n        return 1;\n    }\n\n    sprintf(lpbuf,HTTP_GET,file,host_addr,port);\n\n    if(http_tcpclient_send(socket_fd,lpbuf,strlen(lpbuf)) < 0){\n       DEBUG(\"http_tcpclient_send failed..\\n\");\n        return 1;\n    }\n\t  DEBUG(\"request:\\n%s\\n\",lpbuf);\n\n    if(http_tcpclient_recv(socket_fd,lpbuf) <= 0){\n       DEBUG(\"http_tcpclient_recv failed\\n\");\n        close(socket_fd);\n        return 1;\n    }\n    DEBUG(\"rec:\\n%s\\n\",lpbuf);\n    close(socket_fd);\n\n    //return http_parse_result(lpbuf);\nreturn 0;\n}\n\n\n\nint main(int argc, char *argv[])\n{\n        int fd,http_flag=0,http_ret=1;\n        struct sockaddr_in addr;\n        struct hostent *host;\n        struct timeval timeo = {3, 0};\n        socklen_t len = sizeof(timeo);\n        \n        char http_url[100]=\"http://\";\n\n   \n\n        fd = socket(AF_INET, SOCK_STREAM, 0);\n        if (argc >= 4)\n                 timeo.tv_sec = atoi(argv[3]);\n        if (argc>=5)\n         http_flag=1;\n         \n        if((host=timeGethostbyname(argv[1],timeo.tv_sec)) == NULL) {\n        DEBUG(\"gethostbyname err\\n\");\n        return 1;\n    }\n  if (setsockopt(fd, SOL_SOCKET, SO_SNDTIMEO, &timeo, len) == -1)\n    {\n\n      DEBUG(\"setsockopt send err\\n\");\n       return 1;\n    }\n            \n  if (setsockopt(fd, SOL_SOCKET, SO_RCVTIMEO, &timeo, len) == -1)\n    {\n\n      DEBUG(\"setsockopt recv err\\n\");\n       return 1;\n    }\n  \n         addr.sin_family = AF_INET;\n         addr.sin_addr = *((struct in_addr *)host->h_addr);\n         //addr.sin_addr.s_addr = inet_addr(argv[1]);\n         addr.sin_port = htons(atoi(argv[2]));\nif (connect(fd, (struct sockaddr *)&addr, sizeof(addr)) == -1)\n    {  \n      if (errno == EINPROGRESS) \n       {\n         DEBUG(\"timeout err\\n\");\n          return 1;\n        }  \n       DEBUG(\"connect err\\n\");\n        return 1;\n    }\nif(http_flag==0)\n{\n close(fd);\n return 0;\n}\nstrcat(http_url,argv[1]);\nhttp_ret=http_get(http_url,fd);\nif(http_ret==1)\n{\nDEBUG(\"recv err\");\n return 1;\n}\nelse\n{\nDEBUG(\"recv ok\");\n\n return 0;\n}\n\n}"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/common.h",
    "content": "/*\n * common.h - Provide global definitions\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _COMMON_H\n#define _COMMON_H\n\n#define DEFAULT_CONF_PATH \"/etc/shadowsocks-libev/config.json\"\n\n#ifndef SOL_TCP\n#define SOL_TCP IPPROTO_TCP\n#endif\n\n#if defined(MODULE_TUNNEL) || defined(MODULE_REDIR)\n#define MODULE_LOCAL\n#endif\n\nint init_udprelay(const char *server_host, const char *server_port,\n#ifdef MODULE_LOCAL\n                  const struct sockaddr *remote_addr, const int remote_addr_len,\n#ifdef MODULE_TUNNEL\n                  const ss_addr_t tunnel_addr,\n#endif\n#endif\n                  int mtu, int method, int auth, int timeout, const char *iface, const char *protocol, const char *protocol_param);\n\nvoid free_udprelay(void);\n\n#ifdef ANDROID\nint protect_socket(int fd);\nint send_traffic_stat(uint64_t tx, uint64_t rx);\n#endif\n\n#define STAGE_ERROR     -1  /* Error detected                   */\n#define STAGE_INIT       0  /* Initial stage                    */\n#define STAGE_HANDSHAKE  1  /* Handshake with client            */\n#define STAGE_PARSE      2  /* Parse the header                 */\n#define STAGE_RESOLVE    4  /* Resolve the hostname             */\n#define STAGE_STREAM     5  /* Stream between client and server */\n\n#endif // _COMMON_H\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/crc32.c",
    "content": "static uint32_t crc32_table[256] = {0};\n\nvoid init_crc32_table(void) {\n    uint32_t c, i, j;\n    if (crc32_table[0] == 0) {\n        for (i = 0; i < 256; i++) {\n            c = i;\n            for (j = 0; j < 8; j++) {\n                if (c & 1)\n                    c = 0xedb88320L ^ (c >> 1);\n                else\n                    c = c >> 1;\n            }\n            crc32_table[i] = c;\n        }\n    }\n}\n\nuint32_t crc32(unsigned char *buffer, unsigned int size) {\n    uint32_t crc = 0xFFFFFFFF;\n    unsigned int i;\n    for (i = 0; i < size; i++) {\n        crc = crc32_table[(crc ^ buffer[i]) & 0xFF] ^ (crc >> 8);\n    }\n    return crc ^ 0xFFFFFFFF;\n}\n\nvoid fillcrc32to(unsigned char *buffer, unsigned int size, unsigned char *outbuffer) {\n    uint32_t crc = 0xFFFFFFFF;\n    unsigned int i;\n    for (i = 0; i < size; i++) {\n        crc = crc32_table[(crc ^ buffer[i]) & 0xff] ^ (crc >> 8);\n    }\n    crc ^= 0xFFFFFFFF;\n    outbuffer[0] = crc;\n    outbuffer[1] = crc >> 8;\n    outbuffer[2] = crc >> 16;\n    outbuffer[3] = crc >> 24;\n}\n\nvoid fillcrc32(unsigned char *buffer, unsigned int size) {\n    uint32_t crc = 0xFFFFFFFF;\n    unsigned int i;\n    size -= 4;\n    for (i = 0; i < size; i++) {\n        crc = crc32_table[(crc ^ buffer[i]) & 0xff] ^ (crc >> 8);\n    }\n    buffer += size;\n    buffer[0] = crc;\n    buffer[1] = crc >> 8;\n    buffer[2] = crc >> 16;\n    buffer[3] = crc >> 24;\n}\n\nvoid adler32_short(unsigned char *buffer, unsigned int size, uint32_t *a, uint32_t *b) {\n    for (int i = 0; i < size; i++) {\n        *a += buffer[i];\n        *b += *a;\n    }\n    *a %= 65521;\n    *b %= 65521;\n}\n\n#define NMAX 5552\nuint32_t adler32(unsigned char *buffer, unsigned int size) {\n    uint32_t a = 1;\n    uint32_t b = 0;\n    while ( size >= NMAX ) {\n        adler32_short(buffer, NMAX, &a, &b);\n        buffer += NMAX;\n        size -= NMAX;\n    }\n    adler32_short(buffer, size, &a, &b);\n    return (b << 16) + a;\n}\n#undef NMAX\n\nvoid filladler32(unsigned char *buffer, unsigned int size) {\n    size -= 4;\n    uint32_t checksum = adler32(buffer, size);\n    buffer += size;\n    buffer[0] = checksum;\n    buffer[1] = checksum >> 8;\n    buffer[2] = checksum >> 16;\n    buffer[3] = checksum >> 24;\n}\n\nint checkadler32(unsigned char *buffer, unsigned int size) {\n    size -= 4;\n    uint32_t checksum = adler32(buffer, size);\n    buffer += size;\n    return checksum == (((uint32_t)buffer[3] << 24)\n            | ((uint32_t)buffer[2] << 16)\n            | ((uint32_t)buffer[1] << 8)\n            | (uint32_t)buffer[0]);\n}\n\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/encrypt.c",
    "content": "/*\n * encrypt.c - Manage the global encryptor\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#include <stdint.h>\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#if defined(USE_CRYPTO_OPENSSL)\n\n#include <openssl/md5.h>\n#include <openssl/rand.h>\n#include <openssl/hmac.h>\n#include <openssl/aes.h>\n\n#elif defined(USE_CRYPTO_POLARSSL)\n\n#include <polarssl/md5.h>\n#include <polarssl/sha1.h>\n#include <polarssl/aes.h>\n#include <polarssl/entropy.h>\n#include <polarssl/ctr_drbg.h>\n#include <polarssl/version.h>\n#define CIPHER_UNSUPPORTED \"unsupported\"\n\n#include <time.h>\n#ifdef _WIN32\n#include <windows.h>\n#include <wincrypt.h>\n#else\n#include <stdio.h>\n#endif\n\n#elif defined(USE_CRYPTO_MBEDTLS)\n\n#include <mbedtls/md5.h>\n#include <mbedtls/entropy.h>\n#include <mbedtls/ctr_drbg.h>\n#include <mbedtls/version.h>\n#include <mbedtls/aes.h>\n#define CIPHER_UNSUPPORTED \"unsupported\"\n\n#include <time.h>\n#ifdef _WIN32\n#include <windows.h>\n#include <wincrypt.h>\n#else\n#include <stdio.h>\n#endif\n\n#endif\n\n#include <sodium.h>\n\n#ifndef __MINGW32__\n#include <arpa/inet.h>\n#endif\n\n#include \"cache.h\"\n#include \"encrypt.h\"\n#include \"utils.h\"\n\n#define OFFSET_ROL(p, o) ((uint64_t)(*(p + o)) << (8 * o))\n\nstatic uint8_t *enc_table;\nstatic uint8_t *dec_table;\nstatic uint8_t enc_key[MAX_KEY_LENGTH];\nstatic int enc_key_len;\nstatic int enc_iv_len;\nstatic int enc_method;\n\nstatic struct cache *iv_cache;\n\n#ifdef DEBUG\nstatic void\ndump(char *tag, char *text, int len)\n{\n    int i;\n    printf(\"%s: \", tag);\n    for (i = 0; i < len; i++)\n        printf(\"0x%02x \", (uint8_t)text[i]);\n    printf(\"\\n\");\n}\n\n#endif\n\nstatic const char *supported_ciphers[CIPHER_NUM] = {\n    \"table\",\n    \"rc4\",\n    \"rc4-md5-6\",\n    \"rc4-md5\",\n    \"aes-128-cfb\",\n    \"aes-192-cfb\",\n    \"aes-256-cfb\",\n    \"aes-128-ctr\",\n    \"aes-192-ctr\",\n    \"aes-256-ctr\",\n    \"bf-cfb\",\n    \"camellia-128-cfb\",\n    \"camellia-192-cfb\",\n    \"camellia-256-cfb\",\n    \"cast5-cfb\",\n    \"des-cfb\",\n    \"idea-cfb\",\n    \"rc2-cfb\",\n    \"seed-cfb\",\n    \"salsa20\",\n    \"chacha20\",\n    \"chacha20-ietf\"\n};\n\n#ifdef USE_CRYPTO_POLARSSL\nstatic const char *supported_ciphers_polarssl[CIPHER_NUM] = {\n    \"table\",\n    \"ARC4-128\",\n    \"ARC4-128\",\n    \"ARC4-128\",\n    \"AES-128-CFB128\",\n    \"AES-192-CFB128\",\n    \"AES-256-CFB128\",\n    \"AES-128-CTR\",\n    \"AES-192-CTR\",\n    \"AES-256-CTR\",\n    \"BLOWFISH-CFB64\",\n    \"CAMELLIA-128-CFB128\",\n    \"CAMELLIA-192-CFB128\",\n    \"CAMELLIA-256-CFB128\",\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    \"salsa20\",\n    \"chacha20\",\n    \"chacha20-ietf\"\n};\n#endif\n\n#ifdef USE_CRYPTO_MBEDTLS\nstatic const char *supported_ciphers_mbedtls[CIPHER_NUM] = {\n    \"table\",\n    \"ARC4-128\",\n    \"ARC4-128\",\n    \"ARC4-128\",\n    \"AES-128-CFB128\",\n    \"AES-192-CFB128\",\n    \"AES-256-CFB128\",\n    \"AES-128-CTR\",\n    \"AES-192-CTR\",\n    \"AES-256-CTR\",\n    \"BLOWFISH-CFB64\",\n    \"CAMELLIA-128-CFB128\",\n    \"CAMELLIA-192-CFB128\",\n    \"CAMELLIA-256-CFB128\",\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    CIPHER_UNSUPPORTED,\n    \"salsa20\",\n    \"chacha20\",\n    \"chacha20-ietf\"\n};\n#endif\n\n#ifdef USE_CRYPTO_APPLECC\nstatic const CCAlgorithm supported_ciphers_applecc[CIPHER_NUM] = {\n    kCCAlgorithmInvalid,\n    kCCAlgorithmRC4,\n    kCCAlgorithmRC4,\n    kCCAlgorithmRC4,\n    kCCAlgorithmAES,\n    kCCAlgorithmAES,\n    kCCAlgorithmAES,\n    kCCAlgorithmAES,\n    kCCAlgorithmAES,\n    kCCAlgorithmAES,\n    kCCAlgorithmBlowfish,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmCAST,\n    kCCAlgorithmDES,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmRC2,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid\n};\n\nstatic const CCMode supported_modes_applecc[CIPHER_NUM] = {\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCModeRC4,\n    kCCModeRC4,\n    kCCModeCFB,\n    kCCModeCFB,\n    kCCModeCFB,\n    kCCModeCTR,\n    kCCModeCTR,\n    kCCModeCTR,\n    kCCModeCFB,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCModeCFB,\n    kCCModeCFB,\n    kCCModeCFB,\n    kCCModeCFB,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid,\n    kCCAlgorithmInvalid\n};\n#endif\n\nstatic const int supported_ciphers_iv_size[CIPHER_NUM] = {\n    0,  0,  6, 16, 16, 16, 16, 16, 16, 16,  8, 16, 16, 16,  8,  8,  8,  8, 16,  8,  8, 12\n};\n\nstatic const int supported_ciphers_key_size[CIPHER_NUM] = {\n    0, 16, 16, 16, 16, 24, 32, 16, 24, 32, 16, 16, 24, 32, 16,  8, 16, 16, 16, 32, 32, 32\n};\n\nstatic int\nsafe_memcmp(const void *s1, const void *s2, size_t n)\n{\n    const unsigned char *_s1 = (const unsigned char *)s1;\n    const unsigned char *_s2 = (const unsigned char *)s2;\n    int ret                  = 0;\n    size_t i;\n    for (i = 0; i < n; i++)\n        ret |= _s1[i] ^ _s2[i];\n    return !!ret;\n}\n\nint\nballoc(buffer_t *ptr, size_t capacity)\n{\n    sodium_memzero(ptr, sizeof(buffer_t));\n    ptr->array    = ss_malloc(capacity);\n    ptr->capacity = capacity;\n    return capacity;\n}\n\nint\nbrealloc(buffer_t *ptr, size_t len, size_t capacity)\n{\n    if (ptr == NULL)\n        return -1;\n    size_t real_capacity = max(len, capacity);\n    if (ptr->capacity < real_capacity) {\n        ptr->array    = ss_realloc(ptr->array, real_capacity);\n        ptr->capacity = real_capacity;\n    }\n    return real_capacity;\n}\n\nvoid\nbfree(buffer_t *ptr)\n{\n    if (ptr == NULL)\n        return;\n    ptr->idx      = 0;\n    ptr->len      = 0;\n    ptr->capacity = 0;\n    if (ptr->array != NULL) {\n        ss_free(ptr->array);\n    }\n}\n\nstatic int\ncrypto_stream_xor_ic(uint8_t *c, const uint8_t *m, uint64_t mlen,\n                     const uint8_t *n, uint64_t ic, const uint8_t *k,\n                     int method)\n{\n    switch (method) {\n    case SALSA20:\n        return crypto_stream_salsa20_xor_ic(c, m, mlen, n, ic, k);\n    case CHACHA20:\n        return crypto_stream_chacha20_xor_ic(c, m, mlen, n, ic, k);\n    case CHACHA20IETF:\n        return crypto_stream_chacha20_ietf_xor_ic(c, m, mlen, n, (uint32_t)ic, k);\n    }\n    // always return 0\n    return 0;\n}\n\nstatic int\nrandom_compare(const void *_x, const void *_y, uint32_t i,\n               uint64_t a)\n{\n    uint8_t x = *((uint8_t *)_x);\n    uint8_t y = *((uint8_t *)_y);\n    return a % (x + i) - a % (y + i);\n}\n\nstatic void\nmerge(uint8_t *left, int llength, uint8_t *right,\n      int rlength, uint32_t salt, uint64_t key)\n{\n    uint8_t *ltmp = (uint8_t *)malloc(llength * sizeof(uint8_t));\n    uint8_t *rtmp = (uint8_t *)malloc(rlength * sizeof(uint8_t));\n\n    uint8_t *ll = ltmp;\n    uint8_t *rr = rtmp;\n\n    uint8_t *result = left;\n\n    memcpy(ltmp, left, llength * sizeof(uint8_t));\n    memcpy(rtmp, right, rlength * sizeof(uint8_t));\n\n    while (llength > 0 && rlength > 0) {\n        if (random_compare(ll, rr, salt, key) <= 0) {\n            *result = *ll;\n            ++ll;\n            --llength;\n        } else {\n            *result = *rr;\n            ++rr;\n            --rlength;\n        }\n        ++result;\n    }\n\n    if (llength > 0) {\n        while (llength > 0) {\n            *result = *ll;\n            ++result;\n            ++ll;\n            --llength;\n        }\n    } else {\n        while (rlength > 0) {\n            *result = *rr;\n            ++result;\n            ++rr;\n            --rlength;\n        }\n    }\n\n    ss_free(ltmp);\n    ss_free(rtmp);\n}\n\nstatic void\nmerge_sort(uint8_t array[], int length,\n           uint32_t salt, uint64_t key)\n{\n    uint8_t middle;\n    uint8_t *left, *right;\n    int llength;\n\n    if (length <= 1) {\n        return;\n    }\n\n    middle = length / 2;\n\n    llength = length - middle;\n\n    left  = array;\n    right = array + llength;\n\n    merge_sort(left, llength, salt, key);\n    merge_sort(right, middle, salt, key);\n    merge(left, llength, right, middle, salt, key);\n}\n\nint\nenc_get_iv_len()\n{\n    return enc_iv_len;\n}\n\nuint8_t* enc_get_key()\n{\n    return enc_key;\n}\n\nint enc_get_key_len()\n{\n    return enc_key_len;\n}\n\nunsigned char *enc_md5(const unsigned char *d, size_t n, unsigned char *md)\n{\n#if defined(USE_CRYPTO_OPENSSL)\n    return MD5(d, n, md);\n#elif defined(USE_CRYPTO_POLARSSL)\n    static unsigned char m[16];\n    if (md == NULL) {\n        md = m;\n    }\n    md5(d, n, md);\n    return md;\n#elif defined(USE_CRYPTO_MBEDTLS)\n    static unsigned char m[16];\n    if (md == NULL) {\n        md = m;\n    }\n    mbedtls_md5(d, n, md);\n    return md;\n#endif\n}\n\nvoid\nenc_table_init(const char *pass)\n{\n    uint32_t i;\n    uint64_t key = 0;\n    uint8_t *digest;\n\n    enc_table = ss_malloc(256);\n    dec_table = ss_malloc(256);\n\n    digest = enc_md5((const uint8_t *)pass, strlen(pass), NULL);\n\n    for (i = 0; i < 8; i++)\n        key += OFFSET_ROL(digest, i);\n\n    for (i = 0; i < 256; ++i)\n        enc_table[i] = i;\n    for (i = 1; i < 1024; ++i)\n        merge_sort(enc_table, 256, i, key);\n    for (i = 0; i < 256; ++i)\n        // gen decrypt table from encrypt table\n        dec_table[enc_table[i]] = i;\n}\n\nint\ncipher_iv_size(const cipher_t *cipher)\n{\n#if defined(USE_CRYPTO_OPENSSL)\n    if (cipher->info == NULL)\n        return cipher->iv_len;\n    else\n        return EVP_CIPHER_iv_length(cipher->info);\n#elif defined(USE_CRYPTO_POLARSSL) || defined(USE_CRYPTO_MBEDTLS)\n    if (cipher == NULL) {\n        return 0;\n    }\n    return cipher->info->iv_size;\n#endif\n}\n\nint\ncipher_key_size(const cipher_t *cipher)\n{\n#if defined(USE_CRYPTO_OPENSSL)\n    if (cipher->info == NULL)\n        return cipher->key_len;\n    else\n        return EVP_CIPHER_key_length(cipher->info);\n#elif defined(USE_CRYPTO_POLARSSL)\n    if (cipher == NULL) {\n        return 0;\n    }\n    /* Override PolarSSL 32 bit default key size with sane 128 bit default */\n    if (cipher->info->base != NULL && POLARSSL_CIPHER_ID_BLOWFISH ==\n        cipher->info->base->cipher) {\n        return 128 / 8;\n    }\n    return cipher->info->key_length / 8;\n#elif defined(USE_CRYPTO_MBEDTLS)\n    /*\n     * Semi-API changes (technically public, morally private)\n     * Renamed a few headers to include _internal in the name. Those headers are\n     * not supposed to be included by users.\n     * Changed md_info_t into an opaque structure (use md_get_xxx() accessors).\n     * Changed pk_info_t into an opaque structure.\n     * Changed cipher_base_t into an opaque structure.\n     */\n    if (cipher == NULL) {\n        return 0;\n    }\n    /* From Version 1.2.7 released 2013-04-13 Default Blowfish keysize is now 128-bits */\n    return cipher->info->key_bitlen / 8;\n#endif\n}\n\nvoid\nbytes_to_key_with_size(const char *pass, size_t len, uint8_t *md, size_t md_size)\n{\n    uint8_t result[128];\n    enc_md5((const unsigned char *)pass, len, result);\n    memcpy(md, result, 16);\n    int i = 16;\n    for (; i < md_size; i += 16) {\n        memcpy(result + 16, pass, len);\n        enc_md5(result, 16 + len, result);\n        memcpy(md + i, result, 16);\n    }\n}\n\nint\nbytes_to_key(const cipher_t *cipher, const digest_type_t *md,\n             const uint8_t *pass, uint8_t *key)\n{\n    size_t datal;\n    datal = strlen((const char *)pass);\n\n#if defined(USE_CRYPTO_OPENSSL)\n\n    MD5_CTX c;\n    unsigned char md_buf[MAX_MD_SIZE];\n    int nkey;\n    int addmd;\n    unsigned int i, j, mds;\n\n    mds  = 16;\n    nkey = cipher_key_size(cipher);\n    if (pass == NULL)\n        return nkey;\n    memset(&c, 0, sizeof(MD5_CTX));\n\n    for (j = 0, addmd = 0; j < nkey; addmd++) {\n        MD5_Init(&c);\n        if (addmd) {\n            MD5_Update(&c, md_buf, mds);\n        }\n        MD5_Update(&c, pass, datal);\n        MD5_Final(md_buf, &c);\n\n        for (i = 0; i < mds; i++, j++) {\n            if (j >= nkey)\n                break;\n            key[j] = md_buf[i];\n        }\n    }\n\n    return nkey;\n\n#elif defined(USE_CRYPTO_POLARSSL)\n    md_context_t c;\n    unsigned char md_buf[MAX_MD_SIZE];\n    int nkey;\n    int addmd;\n    unsigned int i, j, mds;\n\n    nkey = cipher_key_size(cipher);\n    mds  = md_get_size(md);\n    memset(&c, 0, sizeof(md_context_t));\n\n    if (pass == NULL)\n        return nkey;\n    if (md_init_ctx(&c, md))\n        return 0;\n\n    for (j = 0, addmd = 0; j < nkey; addmd++) {\n        md_starts(&c);\n        if (addmd) {\n            md_update(&c, md_buf, mds);\n        }\n        md_update(&c, pass, datal);\n        md_finish(&c, md_buf);\n\n        for (i = 0; i < mds; i++, j++) {\n            if (j >= nkey)\n                break;\n            key[j] = md_buf[i];\n        }\n    }\n\n    md_free_ctx(&c);\n    return nkey;\n\n#elif defined(USE_CRYPTO_MBEDTLS)\n\n    mbedtls_md_context_t c;\n    unsigned char md_buf[MAX_MD_SIZE];\n    int nkey;\n    int addmd;\n    unsigned int i, j, mds;\n\n    nkey = cipher_key_size(cipher);\n    mds  = mbedtls_md_get_size(md);\n    memset(&c, 0, sizeof(mbedtls_md_context_t));\n\n    if (pass == NULL)\n        return nkey;\n    if (mbedtls_md_setup(&c, md, 1))\n        return 0;\n\n    for (j = 0, addmd = 0; j < nkey; addmd++) {\n        mbedtls_md_starts(&c);\n        if (addmd) {\n            mbedtls_md_update(&c, md_buf, mds);\n        }\n        mbedtls_md_update(&c, pass, datal);\n        mbedtls_md_finish(&c, &(md_buf[0]));\n\n        for (i = 0; i < mds; i++, j++) {\n            if (j >= nkey)\n                break;\n            key[j] = md_buf[i];\n        }\n    }\n\n    mbedtls_md_free(&c);\n    return nkey;\n#endif\n}\n\nint\nrand_bytes(uint8_t *output, int len)\n{\n    randombytes_buf(output, len);\n    // always return success\n    return 0;\n}\n\nconst cipher_kt_t *\nget_cipher_type(int method)\n{\n    if (method <= TABLE || method >= CIPHER_NUM) {\n        LOGE(\"get_cipher_type(): Illegal method\");\n        return NULL;\n    }\n\n    if (method == RC4_MD5 || method == RC4_MD5_6) {\n        method = RC4;\n    }\n\n    if (method >= SALSA20) {\n        return NULL;\n    }\n\n    const char *ciphername = supported_ciphers[method];\n#if defined(USE_CRYPTO_OPENSSL)\n    return EVP_get_cipherbyname(ciphername);\n#elif defined(USE_CRYPTO_POLARSSL)\n    const char *polarname = supported_ciphers_polarssl[method];\n    if (strcmp(polarname, CIPHER_UNSUPPORTED) == 0) {\n        LOGE(\"Cipher %s currently is not supported by PolarSSL library\",\n             ciphername);\n        return NULL;\n    }\n    return cipher_info_from_string(polarname);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    const char *mbedtlsname = supported_ciphers_mbedtls[method];\n    if (strcmp(mbedtlsname, CIPHER_UNSUPPORTED) == 0) {\n        LOGE(\"Cipher %s currently is not supported by mbed TLS library\",\n             ciphername);\n        return NULL;\n    }\n    return mbedtls_cipher_info_from_string(mbedtlsname);\n#endif\n}\n\nconst digest_type_t *\nget_digest_type(const char *digest)\n{\n    if (digest == NULL) {\n        LOGE(\"get_digest_type(): Digest name is null\");\n        return NULL;\n    }\n\n#if defined(USE_CRYPTO_OPENSSL)\n    return EVP_get_digestbyname(digest);\n#elif defined(USE_CRYPTO_POLARSSL)\n    return md_info_from_string(digest);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    return mbedtls_md_info_from_string(digest);\n#endif\n}\n\nvoid\ncipher_context_init(cipher_ctx_t *ctx, int method, int enc)\n{\n    if (method <= TABLE || method >= CIPHER_NUM) {\n        LOGE(\"cipher_context_init(): Illegal method\");\n        return;\n    }\n\n    if (method >= SALSA20) {\n        enc_iv_len = supported_ciphers_iv_size[method];\n        return;\n    }\n\n    const char *ciphername = supported_ciphers[method];\n#if defined(USE_CRYPTO_APPLECC)\n    cipher_cc_t *cc = &ctx->cc;\n    cc->cryptor = NULL;\n    cc->cipher  = supported_ciphers_applecc[method];\n    if (cc->cipher == kCCAlgorithmInvalid) {\n        cc->valid = kCCContextInvalid;\n    } else {\n        cc->valid = kCCContextValid;\n        if (cc->cipher == kCCAlgorithmRC4) {\n            cc->mode    = supported_modes_applecc[method];\n            cc->padding = ccNoPadding;\n        } else {\n            cc->mode = supported_modes_applecc[method];\n            if (cc->mode == kCCModeCTR) {\n                cc->padding = ccNoPadding;\n            } else {\n                cc->padding = ccPKCS7Padding;\n            }\n        }\n        return;\n    }\n#endif\n\n    const cipher_kt_t *cipher = get_cipher_type(method);\n\n#if defined(USE_CRYPTO_OPENSSL)\n    ctx->evp = EVP_CIPHER_CTX_new();\n    cipher_evp_t *evp = ctx->evp;\n\n    if (cipher == NULL) {\n        LOGE(\"Cipher %s not found in OpenSSL library\", ciphername);\n        FATAL(\"Cannot initialize cipher\");\n    }\n    if (!EVP_CipherInit_ex(evp, cipher, NULL, NULL, NULL, enc)) {\n        LOGE(\"Cannot initialize cipher %s\", ciphername);\n        exit(EXIT_FAILURE);\n    }\n    if (!EVP_CIPHER_CTX_set_key_length(evp, enc_key_len)) {\n        EVP_CIPHER_CTX_cleanup(evp);\n        LOGE(\"Invalid key length: %d\", enc_key_len);\n        exit(EXIT_FAILURE);\n    }\n    if (method > RC4_MD5) {\n        EVP_CIPHER_CTX_set_padding(evp, 1);\n    }\n#elif defined(USE_CRYPTO_POLARSSL)\n    ctx->evp = (cipher_evp_t *)ss_malloc(sizeof(cipher_evp_t));\n    cipher_evp_t *evp = ctx->evp;\n\n    if (cipher == NULL) {\n        LOGE(\"Cipher %s not found in PolarSSL library\", ciphername);\n        FATAL(\"Cannot initialize PolarSSL cipher\");\n    }\n    if (cipher_init_ctx(evp, cipher) != 0) {\n        FATAL(\"Cannot initialize PolarSSL cipher context\");\n    }\n#elif defined(USE_CRYPTO_MBEDTLS)\n    ctx->evp = (cipher_evp_t *)ss_malloc(sizeof(cipher_evp_t));\n    cipher_evp_t *evp = ctx->evp;\n\n    if (cipher == NULL) {\n        LOGE(\"Cipher %s not found in mbed TLS library\", ciphername);\n        FATAL(\"Cannot initialize mbed TLS cipher\");\n    }\n    mbedtls_cipher_init(evp);\n    if (mbedtls_cipher_setup(evp, cipher) != 0) {\n        FATAL(\"Cannot initialize mbed TLS cipher context\");\n    }\n#endif\n}\n\nvoid\ncipher_context_set_iv(cipher_ctx_t *ctx, uint8_t *iv, size_t iv_len,\n                      int enc)\n{\n    const unsigned char *true_key;\n\n    if (iv == NULL) {\n        LOGE(\"cipher_context_set_iv(): IV is null\");\n        return;\n    }\n\n    if (!enc) {\n        memcpy(ctx->iv, iv, iv_len);\n    }\n\n    if (enc_method >= SALSA20) {\n        return;\n    }\n\n    if (enc_method == RC4_MD5 || enc_method == RC4_MD5_6) {\n        unsigned char key_iv[32];\n        memcpy(key_iv, enc_key, 16);\n        memcpy(key_iv + 16, iv, iv_len);\n        true_key = enc_md5(key_iv, 16 + iv_len, NULL);\n        iv_len   = 0;\n    } else {\n        true_key = enc_key;\n    }\n\n#ifdef USE_CRYPTO_APPLECC\n    cipher_cc_t *cc = &ctx->cc;\n    if (cc->valid == kCCContextValid) {\n        memcpy(cc->iv, iv, iv_len);\n        memcpy(cc->key, true_key, enc_key_len);\n        cc->iv_len  = iv_len;\n        cc->key_len = enc_key_len;\n        cc->encrypt = enc ? kCCEncrypt : kCCDecrypt;\n        if (cc->cryptor != NULL) {\n            CCCryptorRelease(cc->cryptor);\n            cc->cryptor = NULL;\n        }\n\n        CCCryptorStatus ret;\n        ret = CCCryptorCreateWithMode(\n            cc->encrypt,\n            cc->mode,\n            cc->cipher,\n            cc->padding,\n            cc->iv, cc->key, cc->key_len,\n            NULL, 0, 0, kCCModeOptionCTR_BE,\n            &cc->cryptor);\n        if (ret != kCCSuccess) {\n            if (cc->cryptor != NULL) {\n                CCCryptorRelease(cc->cryptor);\n                cc->cryptor = NULL;\n            }\n            FATAL(\"Cannot set CommonCrypto key and IV\");\n        }\n        return;\n    }\n#endif\n\n    cipher_evp_t *evp = ctx->evp;\n    if (evp == NULL) {\n        LOGE(\"cipher_context_set_iv(): Cipher context is null\");\n        return;\n    }\n#if defined(USE_CRYPTO_OPENSSL)\n    if (!EVP_CipherInit_ex(evp, NULL, NULL, true_key, iv, enc)) {\n        EVP_CIPHER_CTX_cleanup(evp);\n        FATAL(\"Cannot set key and IV\");\n    }\n#elif defined(USE_CRYPTO_POLARSSL)\n    // XXX: PolarSSL 1.3.11: cipher_free_ctx deprecated, Use cipher_free() instead.\n    if (cipher_setkey(evp, true_key, enc_key_len * 8, enc) != 0) {\n        cipher_free_ctx(evp);\n        FATAL(\"Cannot set PolarSSL cipher key\");\n    }\n#if POLARSSL_VERSION_NUMBER >= 0x01030000\n    if (cipher_set_iv(evp, iv, iv_len) != 0) {\n        cipher_free_ctx(evp);\n        FATAL(\"Cannot set PolarSSL cipher IV\");\n    }\n    if (cipher_reset(evp) != 0) {\n        cipher_free_ctx(evp);\n        FATAL(\"Cannot finalize PolarSSL cipher context\");\n    }\n#else\n    if (cipher_reset(evp, iv) != 0) {\n        cipher_free_ctx(evp);\n        FATAL(\"Cannot set PolarSSL cipher IV\");\n    }\n#endif\n#elif defined(USE_CRYPTO_MBEDTLS)\n    if (mbedtls_cipher_setkey(evp, true_key, enc_key_len * 8, enc) != 0) {\n        mbedtls_cipher_free(evp);\n        FATAL(\"Cannot set mbed TLS cipher key\");\n    }\n\n    if (mbedtls_cipher_set_iv(evp, iv, iv_len) != 0) {\n        mbedtls_cipher_free(evp);\n        FATAL(\"Cannot set mbed TLS cipher IV\");\n    }\n    if (mbedtls_cipher_reset(evp) != 0) {\n        mbedtls_cipher_free(evp);\n        FATAL(\"Cannot finalize mbed TLS cipher context\");\n    }\n#endif\n\n#ifdef DEBUG\n    dump(\"IV\", (char *)iv, iv_len);\n#endif\n}\n\nvoid\ncipher_context_release(cipher_ctx_t *ctx)\n{\n    if (enc_method >= SALSA20) {\n        return;\n    }\n\n#ifdef USE_CRYPTO_APPLECC\n    cipher_cc_t *cc = &ctx->cc;\n    if (cc->cryptor != NULL) {\n        CCCryptorRelease(cc->cryptor);\n        cc->cryptor = NULL;\n    }\n    if (cc->valid == kCCContextValid) {\n        return;\n    }\n#endif\n\n#if defined(USE_CRYPTO_OPENSSL)\n    EVP_CIPHER_CTX_free(ctx->evp);\n#elif defined(USE_CRYPTO_POLARSSL)\n// NOTE: cipher_free_ctx deprecated in PolarSSL 1.3.11\n    cipher_free_ctx(ctx->evp);\n    ss_free(ctx->evp);\n#elif defined(USE_CRYPTO_MBEDTLS)\n// NOTE: cipher_free_ctx deprecated\n    mbedtls_cipher_free(ctx->evp);\n    ss_free(ctx->evp);\n#endif\n}\n\nstatic int\ncipher_context_update(cipher_ctx_t *ctx, uint8_t *output, size_t *olen,\n                      const uint8_t *input, size_t ilen)\n{\n#ifdef USE_CRYPTO_APPLECC\n    cipher_cc_t *cc = &ctx->cc;\n    if (cc->valid == kCCContextValid) {\n        CCCryptorStatus ret;\n        ret = CCCryptorUpdate(cc->cryptor, input, ilen, output,\n                              ilen, olen);\n        return (ret == kCCSuccess) ? 1 : 0;\n    }\n#endif\n    cipher_evp_t *evp = ctx->evp;\n#if defined(USE_CRYPTO_OPENSSL)\n    int err = 0, tlen = *olen;\n    err = EVP_CipherUpdate(evp, (uint8_t *)output, &tlen,\n                           (const uint8_t *)input, ilen);\n    *olen = tlen;\n    return err;\n#elif defined(USE_CRYPTO_POLARSSL)\n    return !cipher_update(evp, (const uint8_t *)input, ilen,\n                          (uint8_t *)output, olen);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    return !mbedtls_cipher_update(evp, (const uint8_t *)input, ilen,\n                                  (uint8_t *)output, olen);\n#endif\n}\nint ss_md5_hmac(char *auth, char *msg, int msg_len, uint8_t *iv)\n{\n    uint8_t hash[MD5_BYTES];\n    uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH];\n    memcpy(auth_key, iv, enc_iv_len);\n    memcpy(auth_key + enc_iv_len, enc_key, enc_key_len);\n\n#if defined(USE_CRYPTO_OPENSSL)\n    HMAC(EVP_md5(), auth_key, enc_iv_len + enc_key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_MD5), auth_key, enc_iv_len + enc_key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#else\n    md5_hmac(auth_key, enc_iv_len + enc_key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#endif\n\n    memcpy(auth, hash, MD5_BYTES);\n\n    return 0;\n}\n\nint ss_md5_hmac_with_key(char *auth, char *msg, int msg_len, uint8_t *auth_key, int key_len)\n{\n    uint8_t hash[MD5_BYTES];\n\n#if defined(USE_CRYPTO_OPENSSL)\n    HMAC(EVP_md5(), auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_MD5), auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#else\n    md5_hmac(auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#endif\n\n    memcpy(auth, hash, MD5_BYTES);\n\n    return 0;\n}\n\nint ss_md5_hash_func(char *auth, char *msg, int msg_len)\n{\n    uint8_t hash[MD5_BYTES];\n\n#if defined(USE_CRYPTO_OPENSSL)\n    MD5((uint8_t *)msg, msg_len, (uint8_t *)hash);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md(mbedtls_md_info_from_type(MBEDTLS_MD_MD5), (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#else\n    md5((uint8_t *)msg, msg_len, (uint8_t *)hash);\n#endif\n\n    memcpy(auth, hash, MD5_BYTES);\n\n    return 0;\n}\n\nint ss_sha1_hmac(char *auth, char *msg, int msg_len, uint8_t *iv)\n{\n    uint8_t hash[SHA1_BYTES];\n    uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH];\n    memcpy(auth_key, iv, enc_iv_len);\n    memcpy(auth_key + enc_iv_len, enc_key, enc_key_len);\n\n#if defined(USE_CRYPTO_OPENSSL)\n    HMAC(EVP_sha1(), auth_key, enc_iv_len + enc_key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), auth_key, enc_iv_len + enc_key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#else\n    sha1_hmac(auth_key, enc_iv_len + enc_key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#endif\n\n    memcpy(auth, hash, SHA1_BYTES);\n\n    return 0;\n}\n\nint ss_sha1_hmac_with_key(char *auth, char *msg, int msg_len, uint8_t *auth_key, int key_len)\n{\n    uint8_t hash[SHA1_BYTES];\n\n#if defined(USE_CRYPTO_OPENSSL)\n    HMAC(EVP_sha1(), auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#else\n    sha1_hmac(auth_key, key_len, (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#endif\n\n    memcpy(auth, hash, SHA1_BYTES);\n\n    return 0;\n}\n\nint ss_sha1_hash_func(char *auth, char *msg, int msg_len)\n{\n    uint8_t hash[SHA1_BYTES];\n#if defined(USE_CRYPTO_OPENSSL)\n    SHA1((uint8_t *)msg, msg_len, (uint8_t *)hash);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md(mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), (uint8_t *)msg, msg_len, (uint8_t *)hash);\n#else\n    sha1((uint8_t *)msg, msg_len, (uint8_t *)hash);\n#endif\n\n    memcpy(auth, hash, SHA1_BYTES);\n\n    return 0;\n}\n\nint ss_aes_128_cbc(char *encrypt, char *out_data, char *key)\n{\n    unsigned char iv[16] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };\n\n#if defined(USE_CRYPTO_OPENSSL)\n    AES_KEY aes;\n    AES_set_encrypt_key((unsigned char*)key, 128, &aes);\n    AES_cbc_encrypt((const unsigned char *)encrypt, (unsigned char *)out_data, 16, &aes, iv, AES_ENCRYPT);\n\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_aes_context aes;\n\n    unsigned char output[16];\n\n    mbedtls_aes_setkey_enc( &aes, (unsigned char *)key, 128 );\n    mbedtls_aes_crypt_cbc( &aes, MBEDTLS_AES_ENCRYPT, 16, iv, (unsigned char *)encrypt, output );\n\n    memcpy(out_data, output, 16);\n#else\n\n    aes_context aes;\n\n    unsigned char output[16];\n\n    aes_setkey_enc( &aes, (unsigned char *)key, 128 );\n    aes_crypt_cbc( &aes, AES_ENCRYPT, 16, iv, (unsigned char *)encrypt, output );\n\n    memcpy(out_data, output, 16);\n#endif\n\n    return 0;\n}\n\nint ss_onetimeauth(buffer_t *buf, uint8_t *iv, size_t capacity)\n{\n    uint8_t hash[ONETIMEAUTH_BYTES * 2];\n    uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH];\n    memcpy(auth_key, iv, enc_iv_len);\n    memcpy(auth_key + enc_iv_len, enc_key, enc_key_len);\n\n    brealloc(buf, ONETIMEAUTH_BYTES + buf->len, capacity);\n\n#if defined(USE_CRYPTO_OPENSSL)\n    HMAC(EVP_sha1(), auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, buf->len, (uint8_t *)hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md_hmac(mbedtls_md_info_from_type(\n                        MBEDTLS_MD_SHA1), auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, buf->len,\n                    (uint8_t *)hash);\n#else\n    sha1_hmac(auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, buf->len, (uint8_t *)hash);\n#endif\n\n    memcpy(buf->array + buf->len, hash, ONETIMEAUTH_BYTES);\n    buf->len += ONETIMEAUTH_BYTES;\n\n    return 0;\n}\n\nint\nss_onetimeauth_verify(buffer_t *buf, uint8_t *iv)\n{\n    uint8_t hash[ONETIMEAUTH_BYTES * 2];\n    uint8_t auth_key[MAX_IV_LENGTH + MAX_KEY_LENGTH];\n    memcpy(auth_key, iv, enc_iv_len);\n    memcpy(auth_key + enc_iv_len, enc_key, enc_key_len);\n    size_t len = buf->len - ONETIMEAUTH_BYTES;\n\n#if defined(USE_CRYPTO_OPENSSL)\n    HMAC(EVP_sha1(), auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, len, hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md_hmac(mbedtls_md_info_from_type(\n                        MBEDTLS_MD_SHA1), auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, len, hash);\n#else\n    sha1_hmac(auth_key, enc_iv_len + enc_key_len, (uint8_t *)buf->array, len, hash);\n#endif\n\n    return safe_memcmp(buf->array + len, hash, ONETIMEAUTH_BYTES);\n}\n\nint\nss_encrypt_all(buffer_t *plain, int method, int auth, size_t capacity)\n{\n    if (method > TABLE) {\n        cipher_ctx_t evp;\n        cipher_context_init(&evp, method, 1);\n\n        size_t iv_len = enc_iv_len;\n        int err       = 1;\n\n        static buffer_t tmp = { 0, 0, 0, NULL };\n        brealloc(&tmp, iv_len + plain->len, capacity);\n        buffer_t *cipher = &tmp;\n        cipher->len = plain->len;\n\n        uint8_t iv[MAX_IV_LENGTH];\n\n        rand_bytes(iv, iv_len);\n        cipher_context_set_iv(&evp, iv, iv_len, 1);\n        memcpy(cipher->array, iv, iv_len);\n\n        if (auth) {\n            ss_onetimeauth(plain, iv, capacity);\n            cipher->len = plain->len;\n        }\n\n        if (method >= SALSA20) {\n            crypto_stream_xor_ic((uint8_t *)(cipher->array + iv_len),\n                                 (const uint8_t *)plain->array, (uint64_t)(plain->len),\n                                 (const uint8_t *)iv,\n                                 0, enc_key, method);\n        } else {\n            err = cipher_context_update(&evp, (uint8_t *)(cipher->array + iv_len),\n                                        &cipher->len, (const uint8_t *)plain->array,\n                                        plain->len);\n        }\n\n        if (!err) {\n            bfree(plain);\n            cipher_context_release(&evp);\n            return -1;\n        }\n\n#ifdef DEBUG\n        dump(\"PLAIN\", plain->array, plain->len);\n        dump(\"CIPHER\", cipher->array + iv_len, cipher->len);\n#endif\n\n        cipher_context_release(&evp);\n\n        brealloc(plain, iv_len + cipher->len, capacity);\n        memcpy(plain->array, cipher->array, iv_len + cipher->len);\n        plain->len = iv_len + cipher->len;\n\n        return 0;\n    } else {\n        char *begin = plain->array;\n        char *ptr   = plain->array;\n        while (ptr < begin + plain->len) {\n            *ptr = (char)enc_table[(uint8_t)*ptr];\n            ptr++;\n        }\n        return 0;\n    }\n}\n\nint\nss_encrypt(buffer_t *plain, enc_ctx_t *ctx, size_t capacity)\n{\n    if (ctx != NULL) {\n        static buffer_t tmp = { 0, 0, 0, NULL };\n\n        int err       = 1;\n        size_t iv_len = 0;\n        if (!ctx->init) {\n            iv_len = enc_iv_len;\n        }\n\n        brealloc(&tmp, iv_len + plain->len, capacity);\n        buffer_t *cipher = &tmp;\n        cipher->len = plain->len;\n\n        if (!ctx->init) {\n            cipher_context_set_iv(&ctx->evp, ctx->evp.iv, iv_len, 1);\n            memcpy(cipher->array, ctx->evp.iv, iv_len);\n            ctx->counter = 0;\n            ctx->init    = 1;\n        }\n\n        if (enc_method >= SALSA20) {\n            int padding = ctx->counter % SODIUM_BLOCK_SIZE;\n            brealloc(cipher, iv_len + (padding + cipher->len) * 2, capacity);\n            if (padding) {\n                brealloc(plain, plain->len + padding, capacity);\n                memmove(plain->array + padding, plain->array, plain->len);\n                sodium_memzero(plain->array, padding);\n            }\n            crypto_stream_xor_ic((uint8_t *)(cipher->array + iv_len),\n                                 (const uint8_t *)plain->array,\n                                 (uint64_t)(plain->len + padding),\n                                 (const uint8_t *)ctx->evp.iv,\n                                 ctx->counter / SODIUM_BLOCK_SIZE, enc_key,\n                                 enc_method);\n            ctx->counter += plain->len;\n            if (padding) {\n                memmove(cipher->array + iv_len,\n                        cipher->array + iv_len + padding, cipher->len);\n            }\n        } else {\n            err =\n                cipher_context_update(&ctx->evp,\n                                      (uint8_t *)(cipher->array + iv_len),\n                                      &cipher->len, (const uint8_t *)plain->array,\n                                      plain->len);\n            if (!err) {\n                return -1;\n            }\n        }\n\n#ifdef DEBUG\n        dump(\"PLAIN\", plain->array, plain->len);\n        dump(\"CIPHER\", cipher->array + iv_len, cipher->len);\n#endif\n\n        brealloc(plain, iv_len + cipher->len, capacity);\n        memcpy(plain->array, cipher->array, iv_len + cipher->len);\n        plain->len = iv_len + cipher->len;\n\n        return 0;\n    } else {\n        char *begin = plain->array;\n        char *ptr   = plain->array;\n        while (ptr < begin + plain->len) {\n            *ptr = (char)enc_table[(uint8_t)*ptr];\n            ptr++;\n        }\n        return 0;\n    }\n}\n\nint\nss_decrypt_all(buffer_t *cipher, int method, int auth, size_t capacity)\n{\n    if (method > TABLE) {\n        size_t iv_len = enc_iv_len;\n        int ret       = 1;\n\n        if (cipher->len <= iv_len) {\n            return -1;\n        }\n\n        cipher_ctx_t evp;\n        cipher_context_init(&evp, method, 0);\n\n        static buffer_t tmp = { 0, 0, 0, NULL };\n        brealloc(&tmp, cipher->len, capacity);\n        buffer_t *plain = &tmp;\n        plain->len = cipher->len - iv_len;\n\n        uint8_t iv[MAX_IV_LENGTH];\n        memcpy(iv, cipher->array, iv_len);\n        cipher_context_set_iv(&evp, iv, iv_len, 0);\n\n        if (method >= SALSA20) {\n            crypto_stream_xor_ic((uint8_t *)plain->array,\n                                 (const uint8_t *)(cipher->array + iv_len),\n                                 (uint64_t)(cipher->len - iv_len),\n                                 (const uint8_t *)iv, 0, enc_key, method);\n        } else {\n            ret = cipher_context_update(&evp, (uint8_t *)plain->array, &plain->len,\n                                        (const uint8_t *)(cipher->array + iv_len),\n                                        cipher->len - iv_len);\n        }\n\n        if (auth || (plain->array[0] & ONETIMEAUTH_FLAG)) {\n            if (plain->len > ONETIMEAUTH_BYTES) {\n                ret = !ss_onetimeauth_verify(plain, iv);\n                if (ret) {\n                    plain->len -= ONETIMEAUTH_BYTES;\n                }\n            } else {\n                ret = 0;\n            }\n        }\n\n        if (!ret) {\n            bfree(cipher);\n            cipher_context_release(&evp);\n            return -1;\n        }\n\n#ifdef DEBUG\n        dump(\"PLAIN\", plain->array, plain->len);\n        dump(\"CIPHER\", cipher->array + iv_len, cipher->len - iv_len);\n#endif\n\n        cipher_context_release(&evp);\n\n        brealloc(cipher, plain->len, capacity);\n        memcpy(cipher->array, plain->array, plain->len);\n        cipher->len = plain->len;\n\n        return 0;\n    } else {\n        char *begin = cipher->array;\n        char *ptr   = cipher->array;\n        while (ptr < begin + cipher->len) {\n            *ptr = (char)dec_table[(uint8_t)*ptr];\n            ptr++;\n        }\n        return 0;\n    }\n}\n\nint\nss_decrypt(buffer_t *cipher, enc_ctx_t *ctx, size_t capacity)\n{\n    if (ctx != NULL) {\n        static buffer_t tmp = { 0, 0, 0, NULL };\n\n        size_t iv_len = 0;\n        int err       = 1;\n\n        brealloc(&tmp, cipher->len, capacity);\n        buffer_t *plain = &tmp;\n        plain->len = cipher->len;\n\n        if (!ctx->init) {\n            uint8_t iv[MAX_IV_LENGTH];\n            iv_len      = enc_iv_len;\n            plain->len -= iv_len;\n\n            memcpy(iv, cipher->array, iv_len);\n            cipher_context_set_iv(&ctx->evp, iv, iv_len, 0);\n            ctx->counter = 0;\n            ctx->init    = 1;\n\n            if (enc_method > RC4) {\n                if (cache_key_exist(iv_cache, (char *)iv, iv_len)) {\n                    bfree(cipher);\n                    return -1;\n                } else {\n                    cache_insert(iv_cache, (char *)iv, iv_len, NULL);\n                }\n            }\n        }\n\n        if (enc_method >= SALSA20) {\n            int padding = ctx->counter % SODIUM_BLOCK_SIZE;\n            brealloc(plain, (plain->len + padding) * 2, capacity);\n\n            if (padding) {\n                brealloc(cipher, cipher->len + padding, capacity);\n                memmove(cipher->array + iv_len + padding, cipher->array + iv_len,\n                        cipher->len - iv_len);\n                sodium_memzero(cipher->array + iv_len, padding);\n            }\n            crypto_stream_xor_ic((uint8_t *)plain->array,\n                                 (const uint8_t *)(cipher->array + iv_len),\n                                 (uint64_t)(cipher->len - iv_len + padding),\n                                 (const uint8_t *)ctx->evp.iv,\n                                 ctx->counter / SODIUM_BLOCK_SIZE, enc_key,\n                                 enc_method);\n            ctx->counter += cipher->len - iv_len;\n            if (padding) {\n                memmove(plain->array, plain->array + padding, plain->len);\n            }\n        } else {\n            err = cipher_context_update(&ctx->evp, (uint8_t *)plain->array, &plain->len,\n                                        (const uint8_t *)(cipher->array + iv_len),\n                                        cipher->len - iv_len);\n        }\n\n        if (!err) {\n            bfree(cipher);\n            return -1;\n        }\n\n#ifdef DEBUG\n        dump(\"PLAIN\", plain->array, plain->len);\n        dump(\"CIPHER\", cipher->array + iv_len, cipher->len - iv_len);\n#endif\n\n        brealloc(cipher, plain->len, capacity);\n        memcpy(cipher->array, plain->array, plain->len);\n        cipher->len = plain->len;\n\n        return 0;\n    } else {\n        char *begin = cipher->array;\n        char *ptr   = cipher->array;\n        while (ptr < begin + cipher->len) {\n            *ptr = (char)dec_table[(uint8_t)*ptr];\n            ptr++;\n        }\n        return 0;\n    }\n}\n\nvoid\nenc_ctx_init(int method, enc_ctx_t *ctx, int enc)\n{\n    sodium_memzero(ctx, sizeof(enc_ctx_t));\n    cipher_context_init(&ctx->evp, method, enc);\n\n    if (enc) {\n        rand_bytes(ctx->evp.iv, enc_iv_len);\n    }\n}\n\nvoid\nenc_key_init(int method, const char *pass)\n{\n    if (method <= TABLE || method >= CIPHER_NUM) {\n        LOGE(\"enc_key_init(): Illegal method\");\n        return;\n    }\n\n    // Initialize cache\n    cache_create(&iv_cache, 256, NULL);\n\n#if defined(USE_CRYPTO_OPENSSL)\n    OpenSSL_add_all_algorithms();\n#else\n    cipher_kt_t cipher_info;\n#endif\n\n    cipher_t cipher;\n    memset(&cipher, 0, sizeof(cipher_t));\n\n    // Initialize sodium for random generator\n    if (sodium_init() == -1) {\n        FATAL(\"Failed to initialize sodium\");\n    }\n\n    if (method == SALSA20 || method == CHACHA20 || method == CHACHA20IETF) {\n#if defined(USE_CRYPTO_OPENSSL)\n        cipher.info    = NULL;\n        cipher.key_len = supported_ciphers_key_size[method];\n        cipher.iv_len  = supported_ciphers_iv_size[method];\n#endif\n#if defined(USE_CRYPTO_POLARSSL)\n        cipher.info             = &cipher_info;\n        cipher.info->base       = NULL;\n        cipher.info->key_length = supported_ciphers_key_size[method] * 8;\n        cipher.info->iv_size    = supported_ciphers_iv_size[method];\n#endif\n#if defined(USE_CRYPTO_MBEDTLS)\n        // XXX: key_length changed to key_bitlen in mbed TLS 2.0.0\n        cipher.info             = &cipher_info;\n        cipher.info->base       = NULL;\n        cipher.info->key_bitlen = supported_ciphers_key_size[method] * 8;\n        cipher.info->iv_size    = supported_ciphers_iv_size[method];\n#endif\n    } else {\n        cipher.info = (cipher_kt_t *)get_cipher_type(method);\n    }\n\n    if (cipher.info == NULL && cipher.key_len == 0) {\n        do {\n#if defined(USE_CRYPTO_POLARSSL) && defined(USE_CRYPTO_APPLECC)\n            if (supported_ciphers_applecc[method] != kCCAlgorithmInvalid) {\n                cipher_info.base       = NULL;\n                cipher_info.key_length = supported_ciphers_key_size[method] * 8;\n                cipher_info.iv_size    = supported_ciphers_iv_size[method];\n                cipher.info            = (cipher_kt_t *)&cipher_info;\n                break;\n            }\n#endif\n#if defined(USE_CRYPTO_MBEDTLS) && defined(USE_CRYPTO_APPLECC)\n            // XXX: key_length changed to key_bitlen in mbed TLS 2.0.0\n            if (supported_ciphers_applecc[method] != kCCAlgorithmInvalid) {\n                cipher_info.base       = NULL;\n                cipher_info.key_bitlen = supported_ciphers_key_size[method] * 8;\n                cipher_info.iv_size    = supported_ciphers_iv_size[method];\n                cipher.info            = (cipher_kt_t *)&cipher_info;\n                break;\n            }\n#endif\n            LOGE(\"Cipher %s not found in crypto library\", supported_ciphers[method]);\n            FATAL(\"Cannot initialize cipher\");\n        } while (0);\n    }\n\n    const digest_type_t *md = get_digest_type(\"MD5\");\n    if (md == NULL) {\n        FATAL(\"MD5 Digest not found in crypto library\");\n    }\n\n    enc_key_len = bytes_to_key(&cipher, md, (const uint8_t *)pass, enc_key);\n\n    if (enc_key_len == 0) {\n        FATAL(\"Cannot generate key and IV\");\n    }\n    if (method == RC4_MD5 || method == RC4_MD5_6) {\n        enc_iv_len = supported_ciphers_iv_size[method];\n    } else {\n        enc_iv_len = cipher_iv_size(&cipher);\n    }\n    enc_method = method;\n}\n\nint\nenc_init(const char *pass, const char *method)\n{\n    int m = TABLE;\n    if (method != NULL) {\n        for (m = TABLE; m < CIPHER_NUM; m++)\n            if (strcmp(method, supported_ciphers[m]) == 0) {\n                break;\n            }\n        if (m >= CIPHER_NUM) {\n            LOGE(\"Invalid cipher name: %s, use rc4-md5 instead\", method);\n            m = RC4_MD5;\n        }\n    }\n    if (m == TABLE) {\n        enc_table_init(pass);\n    } else {\n        enc_key_init(m, pass);\n    }\n    return m;\n}\n\nint\nss_check_hash(buffer_t *buf, chunk_t *chunk, enc_ctx_t *ctx, size_t capacity)\n{\n    int i, j, k;\n    ssize_t blen  = buf->len;\n    uint32_t cidx = chunk->idx;\n\n    brealloc(chunk->buf, chunk->len + blen, capacity);\n    brealloc(buf, chunk->len + blen, capacity);\n\n    for (i = 0, j = 0, k = 0; i < blen; i++) {\n        chunk->buf->array[cidx++] = buf->array[k++];\n\n        if (cidx == CLEN_BYTES) {\n            uint16_t clen = ntohs(*((uint16_t *)chunk->buf->array));\n            brealloc(chunk->buf, clen + AUTH_BYTES, capacity);\n            chunk->len = clen;\n        }\n\n        if (cidx == chunk->len + AUTH_BYTES) {\n            // Compare hash\n            uint8_t hash[ONETIMEAUTH_BYTES * 2];\n            uint8_t key[MAX_IV_LENGTH + sizeof(uint32_t)];\n\n            uint32_t c = htonl(chunk->counter);\n            memcpy(key, ctx->evp.iv, enc_iv_len);\n            memcpy(key + enc_iv_len, &c, sizeof(uint32_t));\n#if defined(USE_CRYPTO_OPENSSL)\n            HMAC(EVP_sha1(), key, enc_iv_len + sizeof(uint32_t),\n                 (uint8_t *)chunk->buf->array + AUTH_BYTES, chunk->len, hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n            mbedtls_md_hmac(mbedtls_md_info_from_type(MBEDTLS_MD_SHA1), key, enc_iv_len + sizeof(uint32_t),\n                            (uint8_t *)chunk->buf->array + AUTH_BYTES, chunk->len, hash);\n#else\n            sha1_hmac(key, enc_iv_len + sizeof(uint32_t),\n                      (uint8_t *)chunk->buf->array + AUTH_BYTES, chunk->len, hash);\n#endif\n\n            if (safe_memcmp(hash, chunk->buf->array + CLEN_BYTES, ONETIMEAUTH_BYTES) != 0) {\n                return 0;\n            }\n\n            // Copy chunk back to buffer\n            memmove(buf->array + j + chunk->len, buf->array + k, blen - i - 1);\n            memcpy(buf->array + j, chunk->buf->array + AUTH_BYTES, chunk->len);\n\n            // Reset the base offset\n            j   += chunk->len;\n            k    = j;\n            cidx = 0;\n            chunk->counter++;\n        }\n    }\n\n    buf->len   = j;\n    chunk->idx = cidx;\n    return 1;\n}\n\nint\nss_gen_hash(buffer_t *buf, uint32_t *counter, enc_ctx_t *ctx, size_t capacity)\n{\n    ssize_t blen       = buf->len;\n    uint16_t chunk_len = htons((uint16_t)blen);\n    uint8_t hash[ONETIMEAUTH_BYTES * 2];\n    uint8_t key[MAX_IV_LENGTH + sizeof(uint32_t)];\n    uint32_t c = htonl(*counter);\n\n    brealloc(buf, AUTH_BYTES + blen, capacity);\n    memcpy(key, ctx->evp.iv, enc_iv_len);\n    memcpy(key + enc_iv_len, &c, sizeof(uint32_t));\n#if defined(USE_CRYPTO_OPENSSL)\n    HMAC(EVP_sha1(), key, enc_iv_len + sizeof(uint32_t), (uint8_t *)buf->array, blen, hash, NULL);\n#elif defined(USE_CRYPTO_MBEDTLS)\n    mbedtls_md_hmac(mbedtls_md_info_from_type(\n                        MBEDTLS_MD_SHA1), key, enc_iv_len + sizeof(uint32_t), (uint8_t *)buf->array, blen, hash);\n#else\n    sha1_hmac(key, enc_iv_len + sizeof(uint32_t), (uint8_t *)buf->array, blen, hash);\n#endif\n\n    memmove(buf->array + AUTH_BYTES, buf->array, blen);\n    memcpy(buf->array + CLEN_BYTES, hash, ONETIMEAUTH_BYTES);\n    memcpy(buf->array, &chunk_len, CLEN_BYTES);\n\n    *counter = *counter + 1;\n    buf->len = blen + AUTH_BYTES;\n\n    return 0;\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/encrypt.h",
    "content": "/*\n * encrypt.h - Define the enryptor's interface\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _ENCRYPT_H\n#define _ENCRYPT_H\n\n#ifndef __MINGW32__\n#include <sys/socket.h>\n#else\n\n#ifdef max\n#undef max\n#endif\n\n#ifdef min\n#undef min\n#endif\n\n#endif\n\n#include <string.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <stdint.h>\n\n#if defined(USE_CRYPTO_OPENSSL)\n\n#include <openssl/evp.h>\n#include <openssl/sha.h>\n#include <openssl/md5.h>\ntypedef EVP_CIPHER cipher_kt_t;\ntypedef EVP_CIPHER_CTX cipher_evp_t;\ntypedef EVP_MD digest_type_t;\n#define MAX_KEY_LENGTH EVP_MAX_KEY_LENGTH\n#define MAX_IV_LENGTH EVP_MAX_IV_LENGTH\n#define MAX_MD_SIZE EVP_MAX_MD_SIZE\n\n#elif defined(USE_CRYPTO_POLARSSL)\n\n#include <polarssl/cipher.h>\n#include <polarssl/md.h>\ntypedef cipher_info_t cipher_kt_t;\ntypedef cipher_context_t cipher_evp_t;\ntypedef md_info_t digest_type_t;\n#define MAX_KEY_LENGTH 64\n#define MAX_IV_LENGTH POLARSSL_MAX_IV_LENGTH\n#define MAX_MD_SIZE POLARSSL_MD_MAX_SIZE\n\n#elif defined(USE_CRYPTO_MBEDTLS)\n\n#include <mbedtls/cipher.h>\n#include <mbedtls/md.h>\ntypedef mbedtls_cipher_info_t cipher_kt_t;\ntypedef mbedtls_cipher_context_t cipher_evp_t;\ntypedef mbedtls_md_info_t digest_type_t;\n#define MAX_KEY_LENGTH 64\n#define MAX_IV_LENGTH MBEDTLS_MAX_IV_LENGTH\n#define MAX_MD_SIZE MBEDTLS_MD_MAX_SIZE\n\n/* we must have MBEDTLS_CIPHER_MODE_CFB defined */\n#if !defined(MBEDTLS_CIPHER_MODE_CFB)\n#error Cipher Feedback mode a.k.a CFB not supported by your mbed TLS.\n#endif\n\n#endif\n\n#ifdef USE_CRYPTO_APPLECC\n\n#include <CommonCrypto/CommonCrypto.h>\n\n#define kCCAlgorithmInvalid UINT32_MAX\n#define kCCContextValid 0\n#define kCCContextInvalid -1\n\ntypedef struct {\n    CCCryptorRef cryptor;\n    int valid;\n    CCOperation encrypt;\n    CCAlgorithm cipher;\n    CCMode mode;\n    CCPadding padding;\n    uint8_t iv[MAX_IV_LENGTH];\n    uint8_t key[MAX_KEY_LENGTH];\n    size_t iv_len;\n    size_t key_len;\n} cipher_cc_t;\n\n#endif\n\ntypedef struct {\n    cipher_evp_t *evp;\n#ifdef USE_CRYPTO_APPLECC\n    cipher_cc_t cc;\n#endif\n    uint8_t iv[MAX_IV_LENGTH];\n} cipher_ctx_t;\n\ntypedef struct {\n    cipher_kt_t *info;\n    size_t iv_len;\n    size_t key_len;\n} cipher_t;\n\n#ifdef HAVE_STDINT_H\n#include <stdint.h>\n#elif HAVE_INTTYPES_H\n#include <inttypes.h>\n#endif\n\n#define SODIUM_BLOCK_SIZE   64\n\nenum crpher_index {\n    NONE = -1,\n    TABLE = 0,\n    RC4,\n    RC4_MD5_6,\n    RC4_MD5,\n    AES_128_CFB,\n    AES_192_CFB,\n    AES_256_CFB,\n    AES_128_CTR,\n    AES_192_CTR,\n    AES_256_CTR,\n    BF_CFB,\n    CAMELLIA_128_CFB,\n    CAMELLIA_192_CFB,\n    CAMELLIA_256_CFB,\n    CAST5_CFB,\n    DES_CFB,\n    IDEA_CFB,\n    RC2_CFB,\n    SEED_CFB,\n    SALSA20,\n    CHACHA20,\n    CHACHA20IETF,\n    CIPHER_NUM,\n};\n\n#define ONETIMEAUTH_FLAG 0x10\n#define ADDRTYPE_MASK 0xEF\n\n#define ONETIMEAUTH_BYTES 10U\n#define MD5_BYTES 16U\n#define SHA1_BYTES 20U\n#define CLEN_BYTES 2U\n#define AUTH_BYTES (ONETIMEAUTH_BYTES + CLEN_BYTES)\n\n#define min(a, b) (((a) < (b)) ? (a) : (b))\n#define max(a, b) (((a) > (b)) ? (a) : (b))\n\ntypedef struct buffer {\n    size_t idx;\n    size_t len;\n    size_t capacity;\n    char   *array;\n} buffer_t;\n\ntypedef struct chunk {\n    uint32_t idx;\n    uint32_t len;\n    uint32_t counter;\n    buffer_t *buf;\n} chunk_t;\n\ntypedef struct enc_ctx {\n    uint8_t init;\n    uint64_t counter;\n    cipher_ctx_t evp;\n} enc_ctx_t;\n\nvoid bytes_to_key_with_size(const char *pass, size_t len, uint8_t *md, size_t md_size);\n\nint ss_encrypt_all(buffer_t *plaintext, int method, int auth, size_t capacity);\nint ss_decrypt_all(buffer_t *ciphertext, int method, int auth, size_t capacity);\nint ss_encrypt(buffer_t *plaintext, enc_ctx_t *ctx, size_t capacity);\nint ss_decrypt(buffer_t *ciphertext, enc_ctx_t *ctx, size_t capacity);\n\nvoid enc_ctx_init(int method, enc_ctx_t *ctx, int enc);\nint enc_init(const char *pass, const char *method);\nint enc_get_iv_len(void);\nuint8_t* enc_get_key(void);\nint enc_get_key_len(void);\nvoid cipher_context_release(cipher_ctx_t *evp);\nunsigned char *enc_md5(const unsigned char *d, size_t n, unsigned char *md);\n\nint ss_md5_hmac(char *auth, char *msg, int msg_len, uint8_t *iv);\nint ss_md5_hmac_with_key(char *auth, char *msg, int msg_len, uint8_t *auth_key, int key_len);\nint ss_md5_hash_func(char *auth, char *msg, int msg_len);\nint ss_sha1_hmac(char *auth, char *msg, int msg_len, uint8_t *iv);\nint ss_sha1_hmac_with_key(char *auth, char *msg, int msg_len, uint8_t *auth_key, int key_len);\nint ss_sha1_hash_func(char *auth, char *msg, int msg_len);\nint ss_aes_128_cbc(char *encrypt, char *out_data, char *key);\nint ss_onetimeauth(buffer_t *buf, uint8_t *iv, size_t capacity);\nint ss_onetimeauth_verify(buffer_t *buf, uint8_t *iv);\n\nint ss_check_hash(buffer_t *buf, chunk_t *chunk, enc_ctx_t *ctx, size_t capacity);\nint ss_gen_hash(buffer_t *buf, uint32_t *counter, enc_ctx_t *ctx, size_t capacity);\n\nint balloc(buffer_t *ptr, size_t capacity);\nint brealloc(buffer_t *ptr, size_t len, size_t capacity);\nvoid bfree(buffer_t *ptr);\n\n#endif // _ENCRYPT_H\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/http.c",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <stdlib.h> /* malloc() */\n#include <string.h> /* strncpy() */\n#include <strings.h> /* strncasecmp() */\n#include <ctype.h> /* isblank() */\n\n#include \"http.h\"\n#include \"protocol.h\"\n\n#define SERVER_NAME_LEN 256\n\nstatic int parse_http_header(const char *, size_t, char **);\nstatic int get_header(const char *, const char *, int, char **);\nstatic int next_header(const char **, int *);\n\nstatic const protocol_t http_protocol_st = {\n    .default_port =                 80,\n    .parse_packet = &parse_http_header,\n};\nconst protocol_t *const http_protocol = &http_protocol_st;\n\n/*\n * Parses a HTTP request for the Host: header\n *\n * Returns:\n *  >=0  - length of the hostname and updates *hostname\n *         caller is responsible for freeing *hostname\n *  -1   - Incomplete request\n *  -2   - No Host header included in this request\n *  -3   - Invalid hostname pointer\n *  -4   - malloc failure\n *  < -4 - Invalid HTTP request\n *\n */\nstatic int\nparse_http_header(const char *data, size_t data_len, char **hostname)\n{\n    int result, i;\n\n    if (hostname == NULL)\n        return -3;\n\n    if (data_len == 0)\n        return -1;\n\n    result = get_header(\"Host:\", data, data_len, hostname);\n    if (result < 0)\n        return result;\n\n    /*\n     *  if the user specifies the port in the request, it is included here.\n     *  Host: example.com:80\n     *  so we trim off port portion\n     */\n    for (i = result - 1; i >= 0; i--)\n        if ((*hostname)[i] == ':') {\n            (*hostname)[i] = '\\0';\n            result         = i;\n            break;\n        }\n\n    return result;\n}\n\nstatic int\nget_header(const char *header, const char *data, int data_len, char **value)\n{\n    int len, header_len;\n\n    header_len = strlen(header);\n\n    /* loop through headers stopping at first blank line */\n    while ((len = next_header(&data, &data_len)) != 0)\n        if (len > header_len && strncasecmp(header, data, header_len) == 0) {\n            /* Eat leading whitespace */\n            while (header_len < len && isblank(data[header_len]))\n                header_len++;\n\n            *value = malloc(len - header_len + 1);\n            if (*value == NULL)\n                return -4;\n\n            strncpy(*value, data + header_len, len - header_len);\n            (*value)[len - header_len] = '\\0';\n\n            return len - header_len;\n        }\n\n    /* If there is no data left after reading all the headers then we do not\n     * have a complete HTTP request, there must be a blank line */\n    if (data_len == 0)\n        return -1;\n\n    return -2;\n}\n\nstatic int\nnext_header(const char **data, int *len)\n{\n    int header_len;\n\n    /* perhaps we can optimize this to reuse the value of header_len, rather\n     * than scanning twice.\n     * Walk our data stream until the end of the header */\n    while (*len > 2 && (*data)[0] != '\\r' && (*data)[1] != '\\n') {\n        (*len)--;\n        (*data)++;\n    }\n\n    /* advanced past the <CR><LF> pair */\n    *data += 2;\n    *len  -= 2;\n\n    /* Find the length of the next header */\n    header_len = 0;\n    while (*len > header_len + 1\n           && (*data)[header_len] != '\\r'\n           && (*data)[header_len + 1] != '\\n')\n        header_len++;\n\n    return header_len;\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/http.h",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef HTTP_H\n#define HTTP_H\n\n#include <stdio.h>\n#include \"protocol.h\"\n\nconst protocol_t *const http_protocol;\n\n#endif\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/http_simple.c",
    "content": "\n#include \"http_simple.h\"\n\nstatic char* g_useragent[] = {\n    \"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:40.0) Gecko/20100101 Firefox/40.0\",\n    \"Mozilla/5.0 (Windows NT 6.3; WOW64; rv:40.0) Gecko/20100101 Firefox/44.0\",\n    \"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36\",\n    \"Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/535.11 (KHTML, like Gecko) Ubuntu/11.10 Chromium/27.0.1453.93 Chrome/27.0.1453.93 Safari/537.36\",\n    \"Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:35.0) Gecko/20100101 Firefox/35.0\",\n    \"Mozilla/5.0 (compatible; WOW64; MSIE 10.0; Windows NT 6.2)\",\n    \"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.20.25 (KHTML, like Gecko) Version/5.0.4 Safari/533.20.27\",\n    \"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.3; Trident/7.0; .NET4.0E; .NET4.0C)\",\n    \"Mozilla/5.0 (Windows NT 6.3; Trident/7.0; rv:11.0) like Gecko\",\n    \"Mozilla/5.0 (Linux; Android 4.4; Nexus 5 Build/BuildID) AppleWebKit/537.36 (KHTML, like Gecko) Version/4.0 Chrome/30.0.0.0 Mobile Safari/537.36\",\n    \"Mozilla/5.0 (iPad; CPU OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3\",\n    \"Mozilla/5.0 (iPhone; CPU iPhone OS 5_0 like Mac OS X) AppleWebKit/534.46 (KHTML, like Gecko) Version/5.1 Mobile/9A334 Safari/7534.48.3\",\n};\n\nstatic int g_useragent_index = -1;\n\ntypedef struct http_simple_local_data {\n    int has_sent_header;\n    int has_recv_header;\n    char *encode_buffer;\n    int host_matched;\n    char *recv_buffer;\n    int recv_buffer_size;\n}http_simple_local_data;\n\nvoid http_simple_local_data_init(http_simple_local_data* local) {\n    local->has_sent_header = 0;\n    local->has_recv_header = 0;\n    local->encode_buffer = NULL;\n\n    local->recv_buffer = malloc(0);\n    local->recv_buffer_size = 0;\n\n    local->host_matched = 0;\n\n    if (g_useragent_index == -1) {\n        g_useragent_index = xorshift128plus() % (sizeof(g_useragent) / sizeof(*g_useragent));\n    }\n}\n\nobfs * http_simple_new_obfs() {\n    obfs * self = new_obfs();\n    self->l_data = malloc(sizeof(http_simple_local_data));\n    http_simple_local_data_init((http_simple_local_data*)self->l_data);\n    return self;\n}\n\nvoid http_simple_dispose(obfs *self) {\n    http_simple_local_data *local = (http_simple_local_data*)self->l_data;\n    if (local->encode_buffer != NULL) {\n        free(local->encode_buffer);\n        local->encode_buffer = NULL;\n    }\n    free(local);\n    dispose_obfs(self);\n}\n\nchar http_simple_hex(char c) {\n    if (c < 10) return c + '0';\n    return c - 10 + 'a';\n}\n\nint get_data_from_http_header(char *data, char **outdata) {\n    char *delim = \"\\r\\n\";\n    char *delim_hex = \"%\";\n    int outlength = 0;\n\n    char *buf = *outdata;\n    char *p_line;\n    p_line = strtok(data, delim);\n\n    //while(p_line)\n    {\n        char *p_hex;\n\n        p_hex = strtok(p_line, delim_hex);\n\n        while((p_hex = strtok(NULL, delim_hex)))\n        {\n            char hex = 0;\n\n            if(strlen(p_hex) <= 0)\n            {\n                continue;\n            }\n\n            if(strlen(p_hex) > 2)\n            {\n                char *c_hex = (char*)malloc(2);\n                memcpy(c_hex, p_hex, 2);\n                hex = (char)strtol(c_hex, NULL, 16);\n                free(c_hex);\n            }\n            else\n            {\n                hex = (char)strtol(p_hex, NULL, 16);\n            }\n\n            outlength += 1;\n            buf = (char*)realloc(buf, outlength);\n            buf[outlength - 1] = hex;\n        }\n\n        //p_line = strtok(p_line, delim);\n    }\n    *outdata = buf;\n    return outlength;\n}\n\nvoid get_host_from_http_header(char *data, char **host) {\n    char* data_begin = strstr(data, \"Host: \");\n\n    if(data_begin == NULL)\n    {\n        return;\n    }\n\n    data_begin += 6;\n    char* data_end = strstr(data_begin, \"\\r\\n\");\n    char* data_end_port = strstr(data_begin, \":\");\n\n    int host_length = 0;\n\n    if(data_end_port != NULL)\n    {\n        host_length = data_end_port - data_begin;\n    }\n    else\n    {\n        host_length = data_end - data_begin;\n    }\n\n    if(host_length <= 0)\n    {\n        return;\n    }\n\n    memset(*host, 0x00, 1024);\n    memcpy(*host, data_begin, host_length);\n}\n\nvoid http_simple_encode_head(http_simple_local_data *local, char *data, int datalength) {\n    if (local->encode_buffer == NULL) {\n        local->encode_buffer = (char*)malloc(datalength * 3 + 1);\n    }\n    int pos = 0;\n    for (; pos < datalength; ++pos) {\n        local->encode_buffer[pos * 3] = '%';\n        local->encode_buffer[pos * 3 + 1] = http_simple_hex(((unsigned char)data[pos] >> 4));\n        local->encode_buffer[pos * 3 + 2] = http_simple_hex(data[pos] & 0xF);\n    }\n    local->encode_buffer[pos * 3] = 0;\n}\n\nint http_simple_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity) {\n    char *encryptdata = *pencryptdata;\n    http_simple_local_data *local = (http_simple_local_data*)self->l_data;\n    if (local->has_sent_header) {\n        return datalength;\n    }\n    char hosts[1024];\n    char * phost[128];\n    int host_num = 0;\n    int pos;\n    char hostport[128];\n    int head_size = self->server.head_len + (xorshift128plus() & 0x3F);\n    int outlength;\n    char * out_buffer = (char*)malloc(datalength + 2048);\n    char * body_buffer = NULL;\n    if (head_size > datalength)\n        head_size = datalength;\n    http_simple_encode_head(local, encryptdata, head_size);\n    if (self->server.param && strlen(self->server.param) == 0)\n        self->server.param = NULL;\n    strncpy(hosts, self->server.param ? self->server.param : self->server.host, sizeof hosts);\n    phost[host_num++] = hosts;\n    for (pos = 0; hosts[pos]; ++pos) {\n        if (hosts[pos] == ',') {\n            phost[host_num++] = &hosts[pos + 1];\n            hosts[pos] = 0;\n        } else if (hosts[pos] == '#') {\n            char * body_pointer = &hosts[pos + 1];\n            char * p;\n            int trans_char = 0;\n            p = body_buffer = (char*)malloc(2048);\n            for ( ; *body_pointer; ++body_pointer) {\n                if (*body_pointer == '\\\\') {\n                    trans_char = 1;\n                    continue;\n                } else if (*body_pointer == '\\n') {\n                    *p = '\\r';\n                    *++p = '\\n';\n                    continue;\n                }\n                if (trans_char) {\n                    if (*body_pointer == '\\\\' ) {\n                        *p = '\\\\';\n                    } else if (*body_pointer == 'n' ) {\n                        *p = '\\r';\n                        *++p = '\\n';\n                    } else {\n                        *p = '\\\\';\n                        *p = *body_pointer;\n                    }\n                    trans_char = 0;\n                } else {\n                    *p = *body_pointer;\n                }\n                ++p;\n            }\n            *p = 0;\n            hosts[pos] = 0;\n            break;\n        }\n    }\n    host_num = xorshift128plus() % host_num;\n    if (self->server.port == 80)\n        sprintf(hostport, \"%s\", phost[host_num]);\n    else\n        sprintf(hostport, \"%s:%d\", phost[host_num], self->server.port);\n    if (body_buffer) {\n        sprintf(out_buffer,\n            \"GET /%s HTTP/1.1\\r\\n\"\n            \"Host: %s\\r\\n\"\n            \"%s\\r\\n\\r\\n\",\n            local->encode_buffer,\n            hostport,\n            body_buffer);\n    } else {\n        sprintf(out_buffer,\n            \"GET /%s HTTP/1.1\\r\\n\"\n            \"Host: %s\\r\\n\"\n            \"User-Agent: %s\\r\\n\"\n            \"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\\r\\n\"\n            \"Accept-Language: en-US,en;q=0.8\\r\\n\"\n            \"Accept-Encoding: gzip, deflate\\r\\n\"\n            \"DNT: 1\\r\\n\"\n            \"Connection: keep-alive\\r\\n\"\n            \"\\r\\n\",\n            local->encode_buffer,\n            hostport,\n            g_useragent[g_useragent_index]\n            );\n    }\n    //LOGI(\"http header: %s\", out_buffer);\n    outlength = strlen(out_buffer);\n    memmove(out_buffer + outlength, encryptdata + head_size, datalength - head_size);\n    outlength += datalength - head_size;\n    local->has_sent_header = 1;\n    if (*capacity < outlength) {\n        *pencryptdata = (char*)realloc(*pencryptdata, *capacity = outlength * 2);\n        encryptdata = *pencryptdata;\n    }\n    memmove(encryptdata, out_buffer, outlength);\n    free(out_buffer);\n    if (body_buffer != NULL)\n        free(body_buffer);\n    if (local->encode_buffer != NULL) {\n        free(local->encode_buffer);\n        local->encode_buffer = NULL;\n    }\n    return outlength;\n}\n\nint http_simple_server_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity) {\n    char *encryptdata = *pencryptdata;\n    http_simple_local_data *local = (http_simple_local_data*)self->l_data;\n    if (local->has_sent_header) {\n        return datalength;\n    }\n    int outlength;\n    char * out_buffer = (char*)malloc(datalength + 2048);\n\n    time_t now;\n    struct tm *tm_now;\n    char    datetime[200];\n\n    time(&now);\n    tm_now = localtime(&now);\n    strftime(datetime, 200, \"%a, %d %b %Y %H:%M:%S GMT\", tm_now);\n\n    sprintf(out_buffer,\n        \"HTTP/1.1 200 OK\\r\\nConnection: keep-alive\\r\\nContent-Encoding: gzip\\r\\nContent-Type: text/html\\r\\nDate: \"\n        \"%s\"\n        \"\\r\\nServer: nginx\\r\\nVary: Accept-Encoding\\r\\n\\r\\n\",\n        datetime);\n\n    outlength = strlen(out_buffer);\n    memmove(out_buffer + outlength, encryptdata, datalength);\n    outlength += datalength;\n\n    local->has_sent_header = 1;\n    if (*capacity < outlength) {\n        *pencryptdata = (char*)realloc(*pencryptdata, *capacity = outlength * 2);\n        encryptdata = *pencryptdata;\n    }\n    memmove(encryptdata, out_buffer, outlength);\n    free(out_buffer);\n    return outlength;\n}\n\nint http_simple_client_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback) {\n    char *encryptdata = *pencryptdata;\n    http_simple_local_data *local = (http_simple_local_data*)self->l_data;\n    *needsendback = 0;\n    if (local->has_recv_header) {\n        return datalength;\n    }\n    char* data_begin = strstr(encryptdata, \"\\r\\n\\r\\n\");\n    if (data_begin) {\n        int outlength;\n        data_begin += 4;\n        local->has_recv_header = 1;\n        outlength = datalength - (data_begin - encryptdata);\n        memmove(encryptdata, data_begin, outlength);\n        return outlength;\n    } else {\n        return 0;\n    }\n}\n\nint http_simple_server_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback) {\n    char *encryptdata = *pencryptdata;\n    http_simple_local_data *local = (http_simple_local_data*)self->l_data;\n    *needsendback = 0;\n    if (local->has_recv_header) {\n        return datalength;\n    }\n\n    if(datalength != 0)\n    {\n        local->recv_buffer = (char*)realloc(local->recv_buffer, local->recv_buffer_size + datalength);\n        memmove(local->recv_buffer + local->recv_buffer_size, encryptdata, datalength);\n        local->recv_buffer_size += datalength;\n\n        int outlength = local->recv_buffer_size;\n        if (*capacity < outlength) {\n            *pencryptdata = (char*)realloc(*pencryptdata, *capacity = outlength * 2);\n            encryptdata = *pencryptdata;\n        }\n        memcpy(encryptdata, local->recv_buffer, local->recv_buffer_size);\n    }\n\n    if(local->recv_buffer_size > 10)\n    {\n        if(strstr(local->recv_buffer, \"GET /\") == local->recv_buffer || strstr(local->recv_buffer, \"POST /\") == local->recv_buffer)\n        {\n            if(local->recv_buffer_size > 65536)\n            {\n                free(local->recv_buffer);\n                local->recv_buffer = malloc(0);\n                local->recv_buffer_size = 0;\n                local->has_sent_header = 1;\n                local->has_recv_header = 1;\n                LOGE(\"http_simple: over size\");\n                return -1;\n            }\n        }\n        else\n        {\n            free(local->recv_buffer);\n            local->recv_buffer = malloc(0);\n            local->recv_buffer_size = 0;\n            local->has_sent_header = 1;\n            local->has_recv_header = 1;\n            LOGE(\"http_simple: not match begin\");\n            return -1;\n        }\n    }\n    else\n    {\n        LOGE(\"http_simple: too short\");\n        local->has_sent_header = 1;\n        local->has_recv_header = 1;\n        return -1;\n    }\n\n    char* data_begin = strstr(encryptdata, \"\\r\\n\\r\\n\");\n    if (data_begin) {\n        int outlength;\n        char *ret_buf = (char*)malloc(*capacity);\n        memset(ret_buf, 0x00, *capacity);\n        int ret_buf_len = 0;\n        ret_buf_len = get_data_from_http_header(encryptdata, &ret_buf);\n\n        if (self->server.param && strlen(self->server.param) == 0)\n        {\n            self->server.param = NULL;\n        }\n        else\n        {\n            if(local->host_matched == 0)\n            {\n                char *host = (char*)malloc(1024);\n                get_host_from_http_header(local->recv_buffer, &host);\n                char hosts[1024];\n                char * phost[128];\n                int host_num = 0;\n                int pos = 0;\n                int is_match = 0;\n                char * body_buffer = NULL;\n                strncpy(hosts, self->server.param, sizeof hosts);\n                phost[host_num++] = hosts;\n\n                for (pos = 0; hosts[pos]; ++pos) {\n                    if (hosts[pos] == ',') {\n                        phost[host_num++] = &hosts[pos + 1];\n                        hosts[pos] = 0;\n                    } else if (hosts[pos] == '#') {\n                        char * body_pointer = &hosts[pos + 1];\n                        char * p;\n                        int trans_char = 0;\n                        p = body_buffer = (char*)malloc(2048);\n                        for ( ; *body_pointer; ++body_pointer) {\n                            if (*body_pointer == '\\\\') {\n                                trans_char = 1;\n                                continue;\n                            } else if (*body_pointer == '\\n') {\n                                *p = '\\r';\n                                *++p = '\\n';\n                                continue;\n                            }\n                            if (trans_char) {\n                                if (*body_pointer == '\\\\' ) {\n                                    *p = '\\\\';\n                                } else if (*body_pointer == 'n' ) {\n                                    *p = '\\r';\n                                    *++p = '\\n';\n                                } else {\n                                    *p = '\\\\';\n                                    *p = *body_pointer;\n                                }\n                                trans_char = 0;\n                            } else {\n                                *p = *body_pointer;\n                            }\n                            ++p;\n                        }\n                        *p = 0;\n                        hosts[pos] = 0;\n                        break;\n                    }\n                }\n\n\n                for(pos = 0; pos < host_num; pos++)\n                {\n                    if(strcmp(phost[pos], host) == 0)\n                    {\n                        is_match = 1;\n                        local->host_matched = 1;\n                    }\n                }\n\n                if(is_match == 0)\n                {\n                    free(local->recv_buffer);\n                    local->recv_buffer = malloc(0);\n                    local->recv_buffer_size = 0;\n                    local->has_sent_header = 1;\n                    local->has_recv_header = 1;\n                    LOGE(\"http_simple: not match host, host: %s\", host);\n                    return -1;\n                }\n\n                free(host);\n            }\n        }\n\n        if(ret_buf_len <= 0)\n        {\n            return -1;\n        }\n\n        data_begin += 4;\n        local->has_recv_header = 1;\n\n        ret_buf = (char*)realloc(ret_buf, ret_buf_len + datalength - (data_begin - encryptdata));\n        outlength = ret_buf_len + datalength - (data_begin - encryptdata);\n\n        memcpy(ret_buf + ret_buf_len, data_begin, datalength - (data_begin - encryptdata));\n\n        if (*capacity < outlength) {\n            *pencryptdata = (char*)realloc(*pencryptdata, *capacity = outlength * 2);\n            encryptdata = *pencryptdata;\n        }\n\n        memcpy(encryptdata, ret_buf, outlength);\n        free(ret_buf);\n        return outlength;\n    } else {\n        return 0;\n    }\n}\n\nvoid boundary(char result[])\n{\n    char *str = \"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789\";\n    int i,lstr;\n    char ss[3] = {0};\n    lstr = strlen(str);\n    srand((unsigned int)time((time_t *)NULL));\n    for(i = 0; i < 32; ++i)\n    {\n        sprintf(ss, \"%c\", str[(rand()%lstr)]);\n        strcat(result, ss);\n    }\n}\n\nint http_post_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity) {\n    char *encryptdata = *pencryptdata;\n    http_simple_local_data *local = (http_simple_local_data*)self->l_data;\n    if (local->has_sent_header) {\n        return datalength;\n    }\n    char hosts[1024];\n    char * phost[128];\n    int host_num = 0;\n    int pos;\n    char hostport[128];\n    int head_size = self->server.head_len + (xorshift128plus() & 0x3F);\n    int outlength;\n    char * out_buffer = (char*)malloc(datalength + 2048);\n    char * body_buffer = NULL;\n    if (head_size > datalength)\n        head_size = datalength;\n    http_simple_encode_head(local, encryptdata, head_size);\n    if (self->server.param && strlen(self->server.param) == 0)\n        self->server.param = NULL;\n    strncpy(hosts, self->server.param ? self->server.param : self->server.host, sizeof hosts);\n    phost[host_num++] = hosts;\n    for (pos = 0; hosts[pos]; ++pos) {\n        if (hosts[pos] == ',') {\n            phost[host_num++] = &hosts[pos + 1];\n            hosts[pos] = 0;\n        } else if (hosts[pos] == '#') {\n            char * body_pointer = &hosts[pos + 1];\n            char * p;\n            int trans_char = 0;\n            p = body_buffer = (char*)malloc(2048);\n            for ( ; *body_pointer; ++body_pointer) {\n                if (*body_pointer == '\\\\') {\n                    trans_char = 1;\n                    continue;\n                } else if (*body_pointer == '\\n') {\n                    *p = '\\r';\n                    *++p = '\\n';\n                    continue;\n                }\n                if (trans_char) {\n                    if (*body_pointer == '\\\\' ) {\n                        *p = '\\\\';\n                    } else if (*body_pointer == 'n' ) {\n                        *p = '\\r';\n                        *++p = '\\n';\n                    } else {\n                        *p = '\\\\';\n                        *p = *body_pointer;\n                    }\n                    trans_char = 0;\n                } else {\n                    *p = *body_pointer;\n                }\n                ++p;\n            }\n            *p = 0;\n            hosts[pos] = 0;\n            break;\n        }\n    }\n    host_num = xorshift128plus() % host_num;\n    if (self->server.port == 80)\n        sprintf(hostport, \"%s\", phost[host_num]);\n    else\n        sprintf(hostport, \"%s:%d\", phost[host_num], self->server.port);\n    if (body_buffer) {\n        sprintf(out_buffer,\n            \"POST /%s HTTP/1.1\\r\\n\"\n            \"Host: %s\\r\\n\"\n            \"%s\\r\\n\\r\\n\",\n            local->encode_buffer,\n            hostport,\n            body_buffer);\n    } else {\n        char result[33] = {0};\n        boundary(result);\n        sprintf(out_buffer,\n            \"POST /%s HTTP/1.1\\r\\n\"\n            \"Host: %s\\r\\n\"\n            \"User-Agent: %s\\r\\n\"\n            \"Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\\r\\n\"\n            \"Accept-Language: en-US,en;q=0.8\\r\\n\"\n            \"Accept-Encoding: gzip, deflate\\r\\n\"\n            \"Content-Type: multipart/form-data; boundary=%s\\r\\n\"\n            \"DNT: 1\\r\\n\"\n            \"Connection: keep-alive\\r\\n\"\n            \"\\r\\n\",\n            local->encode_buffer,\n            hostport,\n            g_useragent[g_useragent_index],\n            result\n            );\n    }\n    //LOGI(\"http header: %s\", out_buffer);\n    outlength = strlen(out_buffer);\n    memmove(out_buffer + outlength, encryptdata + head_size, datalength - head_size);\n    outlength += datalength - head_size;\n    local->has_sent_header = 1;\n    if (*capacity < outlength) {\n        *pencryptdata = (char*)realloc(*pencryptdata, *capacity = outlength * 2);\n        encryptdata = *pencryptdata;\n    }\n    memmove(encryptdata, out_buffer, outlength);\n    free(out_buffer);\n    if (body_buffer != NULL)\n        free(body_buffer);\n    if (local->encode_buffer != NULL) {\n        free(local->encode_buffer);\n        local->encode_buffer = NULL;\n    }\n    return outlength;\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/http_simple.h",
    "content": "/*\n * http_simple.h - Define shadowsocksR server's buffers and callbacks\n *\n * Copyright (C) 2015 - 2016, Break Wa11 <mmgac001@gmail.com>\n */\n\n#ifndef _HTTP_SIMPLE_H\n#define _HTTP_SIMPLE_H\n\nobfs * http_simple_new_obfs();\nvoid http_simple_dispose(obfs *self);\n\nint http_simple_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity);\nint http_simple_client_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback);\n\nint http_post_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity);\n\nint http_simple_server_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity);\nint http_simple_server_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback);\n\n#endif // _HTTP_SIMPLE_H\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/jconf.c",
    "content": "/*\n * jconf.c - Parse the JSON format config file\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#include <stdlib.h>\n#include <stdio.h>\n#include <unistd.h>\n#include <string.h>\n#include <time.h>\n\n#include \"utils.h\"\n#include \"jconf.h\"\n#include \"json.h\"\n#include \"string.h\"\n\n#include <libcork/core.h>\n\n#define check_json_value_type(value, expected_type, message) \\\n    do { \\\n        if ((value)->type != (expected_type)) \\\n            FATAL((message)); \\\n    } while(0)\n\nstatic char *\nto_string(const json_value *value)\n{\n    if (value->type == json_string) {\n        return ss_strndup(value->u.string.ptr, value->u.string.length);\n    } else if (value->type == json_integer) {\n        return strdup(ss_itoa(value->u.integer));\n    } else if (value->type == json_null) {\n        return \"null\";\n    } else {\n        LOGE(\"%d\", value->type);\n        FATAL(\"Invalid config format.\");\n    }\n    return 0;\n}\n\nvoid\nfree_addr(ss_addr_t *addr)\n{\n    ss_free(addr->host);\n    ss_free(addr->port);\n}\n\nvoid\nparse_addr(const char *str, ss_addr_t *addr)\n{\n    int ipv6 = 0, ret = -1, n = 0;\n    char *pch;\n\n    struct cork_ip ip;\n    if (cork_ip_init(&ip, str) != -1) {\n        addr->host = strdup(str);\n        addr->port = NULL;\n        return;\n    }\n\n    pch = strchr(str, ':');\n    while (pch != NULL) {\n        n++;\n        ret = pch - str;\n        pch = strchr(pch + 1, ':');\n    }\n    if (n > 1) {\n        ipv6 = 1;\n        if (str[ret - 1] != ']') {\n            ret = -1;\n        }\n    }\n\n    if (ret == -1) {\n        if (ipv6) {\n            addr->host = ss_strndup(str + 1, strlen(str) - 2);\n        } else {\n            addr->host = strdup(str);\n        }\n        addr->port = NULL;\n    } else {\n        if (ipv6) {\n            addr->host = ss_strndup(str + 1, ret - 2);\n        } else {\n            addr->host = ss_strndup(str, ret);\n        }\n        addr->port = strdup(str + ret + 1);\n    }\n}\n\njconf_t *\nread_jconf(const char *file)\n{\n    static jconf_t conf;\n\n    memset(&conf, 0, sizeof(jconf_t));\n\n    char *buf;\n    json_value *obj;\n\n    FILE *f = fopen(file, \"rb\");\n    if (f == NULL) {\n        FATAL(\"Invalid config path.\");\n    }\n\n    fseek(f, 0, SEEK_END);\n    long pos = ftell(f);\n    fseek(f, 0, SEEK_SET);\n\n    if (pos >= MAX_CONF_SIZE) {\n        FATAL(\"Too large config file.\");\n    }\n\n    buf = ss_malloc(pos + 1);\n    if (buf == NULL) {\n        FATAL(\"No enough memory.\");\n    }\n\n    int nread = fread(buf, pos, 1, f);\n    if (!nread) {\n        FATAL(\"Failed to read the config file.\");\n    }\n    fclose(f);\n\n    buf[pos] = '\\0'; // end of string\n\n    json_settings settings = { 0UL, 0, NULL, NULL, NULL };\n    char error_buf[512];\n    obj = json_parse_ex(&settings, buf, pos, error_buf);\n\n    if (obj == NULL) {\n        FATAL(error_buf);\n    }\n\n    if (obj->type == json_object) {\n        unsigned int i, j;\n        for (i = 0; i < obj->u.object.length; i++) {\n            char *name        = obj->u.object.values[i].name;\n            json_value *value = obj->u.object.values[i].value;\n            if (strcmp(name, \"server\") == 0) {\n                if (value->type == json_array) {\n                    for (j = 0; j < value->u.array.length; j++) {\n                        if (j >= MAX_REMOTE_NUM) {\n                            break;\n                        }\n                        json_value *v = value->u.array.values[j];\n                        char *addr_str = to_string(v);\n                        parse_addr(addr_str, conf.remote_addr + j);\n                        ss_free(addr_str);\n                        conf.remote_num = j + 1;\n                    }\n                } else if (value->type == json_string) {\n                    conf.remote_addr[0].host = to_string(value);\n                    conf.remote_addr[0].port = NULL;\n                    conf.remote_num          = 1;\n                }\n            } else if (strcmp(name, \"port_password\") == 0) {\n                if (value->type == json_object) {\n                    for (j = 0; j < value->u.object.length; j++) {\n                        if (j >= MAX_PORT_NUM) {\n                            break;\n                        }\n                        json_value *v = value->u.object.values[j].value;\n                        if (v->type == json_string) {\n                            conf.port_password[j].port = ss_strndup(value->u.object.values[j].name,\n                                                                    value->u.object.values[j].name_length);\n                            conf.port_password[j].password = to_string(v);\n                            conf.port_password_num         = j + 1;\n                        }\n                    }\n                }\n            } else if (strcmp(name, \"server_port\") == 0) {\n                conf.remote_port = to_string(value);\n            } else if (strcmp(name, \"local_address\") == 0) {\n                conf.local_addr = to_string(value);\n            } else if (strcmp(name, \"local_port\") == 0) {\n                conf.local_port = to_string(value);\n            } else if (strcmp(name, \"password\") == 0) {\n                conf.password = to_string(value);\n            } else if (strcmp(name, \"protocol\") == 0) { // SSR\n                conf.protocol = to_string(value);\n            } else if (strcmp(name, \"protocol_param\") == 0) { // SSR\n                conf.protocol_param = to_string(value);\n            } else if (strcmp(name, \"method\") == 0) {\n                conf.method = to_string(value);\n            } else if (strcmp(name, \"obfs\") == 0) { // SSR\n                conf.obfs = to_string(value);\n            } else if (strcmp(name, \"obfs_param\") == 0) { // SSR\n                conf.obfs_param = to_string(value);\n            } else if (strcmp(name, \"timeout\") == 0) {\n                conf.timeout = to_string(value);\n            } else if (strcmp(name, \"user\") == 0) {\n                conf.user = to_string(value);\n            } else if (strcmp(name, \"fast_open\") == 0) {\n                check_json_value_type(value, json_boolean,\n                        \"invalid config file: option 'fast_open' must be a boolean\");\n                conf.fast_open = value->u.boolean;\n            } else if (strcmp(name, \"auth\") == 0) {\n                check_json_value_type(value, json_boolean,\n                        \"invalid config file: option 'auth' must be a boolean\");\n                conf.auth = value->u.boolean;\n            } else if (strcmp(name, \"nofile\") == 0) {\n                check_json_value_type(value, json_integer,\n                    \"invalid config file: option 'nofile' must be an integer\");\n                conf.nofile = value->u.integer;\n            } else if (strcmp(name, \"nameserver\") == 0) {\n                conf.nameserver = to_string(value);\n            } else if (strcmp(name, \"tunnel_address\") == 0) {\n                conf.tunnel_address = to_string(value);\n            } else if (strcmp(name, \"mode\") == 0) {\n                char *mode_str = to_string(value);\n\n                if (strcmp(mode_str, \"tcp_only\") == 0)\n                    conf.mode = TCP_ONLY;\n                else if (strcmp(mode_str, \"tcp_and_udp\") == 0)\n                    conf.mode = TCP_AND_UDP;\n                else if (strcmp(mode_str, \"udp_only\") == 0)\n                    conf.mode = UDP_ONLY;\n                else\n                    LOGI(\"ignore unknown mode: %s, use tcp_only as fallback\",\n                         mode_str);\n                ss_free(mode_str);\n            } else if (strcmp(name, \"mtu\") == 0) {\n                check_json_value_type(value, json_integer,\n                    \"invalid config file: option 'mtu' must be an integer\");\n                conf.mtu = value->u.integer;\n            } else if (strcmp(name, \"mptcp\") == 0) {\n                check_json_value_type(value, json_boolean,\n                    \"invalid config file: option 'mptcp' must be a boolean\");\n                conf.mptcp = value->u.boolean;\n            } else if (strcmp(name, \"ipv6_first\") == 0) {\n                check_json_value_type(value, json_boolean,\n                    \"invalid config file: option 'ipv6_first' must be a boolean\");\n                conf.ipv6_first = value->u.boolean;\n            }\n        }\n    } else {\n        FATAL(\"Invalid config file\");\n    }\n\n    ss_free(buf);\n    json_value_free(obj);\n    return &conf;\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/jconf.h",
    "content": "/*\n * jconf.h - Define the config data structure\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _JCONF_H\n#define _JCONF_H\n\n#define MAX_PORT_NUM 1024\n#define MAX_REMOTE_NUM 10\n#define MAX_CONF_SIZE 128 * 1024\n#define MAX_DNS_NUM 4\n#define MAX_CONNECT_TIMEOUT 10\n#define MAX_REQUEST_TIMEOUT 60\n#define MIN_UDP_TIMEOUT 10\n\n#define TCP_ONLY     0\n#define TCP_AND_UDP  1\n#define UDP_ONLY     3\n\ntypedef struct {\n    char *host;\n    char *port;\n} ss_addr_t;\n\ntypedef struct {\n    char *port;\n    char *password;\n} ss_port_password_t;\n\ntypedef struct {\n    int remote_num;\n    ss_addr_t remote_addr[MAX_REMOTE_NUM];\n    int port_password_num;\n    ss_port_password_t port_password[MAX_PORT_NUM];\n    char *remote_port;\n    char *local_addr;\n    char *local_port;\n    char *password;\n    char *protocol; // SSR\n    char *protocol_param; // SSR\n    char *method;\n    char *obfs; // SSR\n    char *obfs_param; // SSR\n    char *timeout;\n    char *user;\n    int auth;\n    int fast_open;\n    int nofile;\n    char *nameserver;\n    char *tunnel_address;\n    int mode;\n    int mtu;\n    int mptcp;\n    int ipv6_first;\n} jconf_t;\n\njconf_t *read_jconf(const char *file);\nvoid parse_addr(const char *str, ss_addr_t *addr);\nvoid free_addr(ss_addr_t *addr);\n\n#endif // _JCONF_H\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/json.c",
    "content": "/* vim: set et ts=3 sw=3 sts=3 ft=c:\n *\n * Copyright (C) 2012, 2013, 2014 James McLaughlin et al.  All rights reserved.\n * https://github.com/udp/json-parser\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *   notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#include \"json.h\"\n#include \"utils.h\"\n\n#ifdef _MSC_VER\n#ifndef _CRT_SECURE_NO_WARNINGS\n#define _CRT_SECURE_NO_WARNINGS\n#endif\n#endif\n\n#ifdef __cplusplus\nconst struct _json_value json_value_none; /* zero-d by ctor */\n#else\nconst struct _json_value json_value_none = { NULL, 0, { 0 }, { NULL } };\n#endif\n\n#include <stdio.h>\n#include <string.h>\n#include <ctype.h>\n#include <math.h>\n\ntypedef unsigned short json_uchar;\n\nstatic unsigned char\nhex_value(json_char c)\n{\n    if (isdigit((uint8_t)c)) {\n        return c - '0';\n    }\n\n    switch (c) {\n    case 'a':\n    case 'A':\n        return 0x0A;\n    case 'b':\n    case 'B':\n        return 0x0B;\n    case 'c':\n    case 'C':\n        return 0x0C;\n    case 'd':\n    case 'D':\n        return 0x0D;\n    case 'e':\n    case 'E':\n        return 0x0E;\n    case 'f':\n    case 'F':\n        return 0x0F;\n    default:\n        return 0xFF;\n    }\n}\n\ntypedef struct {\n    unsigned long used_memory;\n\n    unsigned int uint_max;\n    unsigned long ulong_max;\n\n    json_settings settings;\n    int first_pass;\n} json_state;\n\nstatic void *\ndefault_alloc(size_t size, int zero, void *user_data)\n{\n    return zero ? calloc(1, size) : ss_malloc(size);\n}\n\nstatic void\ndefault_free(void *ptr, void *user_data)\n{\n    ss_free(ptr);\n}\n\nstatic void *\njson_alloc(json_state *state, unsigned long size, int zero)\n{\n    if ((state->ulong_max - state->used_memory) < size) {\n        return 0;\n    }\n\n    if (state->settings.max_memory\n        && (state->used_memory += size) > state->settings.max_memory) {\n        return 0;\n    }\n\n    return state->settings.mem_alloc(size, zero, state->settings.user_data);\n}\n\nstatic int\nnew_value(json_state *state, json_value **top, json_value **root,\n          json_value **alloc, json_type type)\n{\n    json_value *value;\n    int values_size;\n\n    if (!state->first_pass) {\n        value  = *top = *alloc;\n        *alloc = (*alloc)->_reserved.next_alloc;\n\n        if (!*root) {\n            *root = value;\n        }\n\n        switch (value->type) {\n        case json_array:\n\n            if (!(value->u.array.values = (json_value **)json_alloc\n                                              (state, value->u.array.length *\n                                              sizeof(json_value *), 0))) {\n                return 0;\n            }\n\n            value->u.array.length = 0;\n            break;\n\n        case json_object:\n\n            values_size = sizeof(*value->u.object.values) *\n                          value->u.object.length;\n\n            if (!((*(void **)&value->u.object.values) = json_alloc\n                                                            (state,\n                                                            values_size +\n                                                            ((size_t)value->u.\n                                                             object.values),\n                                                            0))) {\n                return 0;\n            }\n\n            value->_reserved.object_mem = (*(char **)&value->u.object.values) +\n                                          values_size;\n\n            value->u.object.length = 0;\n            break;\n\n        case json_string:\n\n            if (!(value->u.string.ptr = (json_char *)json_alloc\n                                            (state,\n                                            (value->u.string.length +\n                                             1) * sizeof(json_char), 0))) {\n                return 0;\n            }\n\n            value->u.string.length = 0;\n            break;\n\n        default:\n            break;\n        }\n\n        return 1;\n    }\n\n    value = (json_value *)json_alloc(state, sizeof(json_value), 1);\n\n    if (!value) {\n        return 0;\n    }\n\n    if (!*root) {\n        *root = value;\n    }\n\n    value->type   = type;\n    value->parent = *top;\n\n    if (*alloc) {\n        (*alloc)->_reserved.next_alloc = value;\n    }\n\n    *alloc = *top = value;\n\n    return 1;\n}\n\n#define e_off \\\n    ((int)(i - cur_line_begin))\n\n#define whitespace                          \\\ncase '\\n': \\\n    ++cur_line; cur_line_begin = i; \\\ncase ' ': \\\ncase '\\t': \\\ncase '\\r'\n\n#define string_add(b)                                         \\\n    do { if (!state.first_pass) { string[string_length] = b; \\\n         } ++string_length; } while (0)\n\nstatic const long\n    flag_next           = 1 << 0,\n    flag_reproc         = 1 << 1,\n    flag_need_comma     = 1 << 2,\n    flag_seek_value     = 1 << 3,\n    flag_escaped        = 1 << 4,\n    flag_string         = 1 << 5,\n    flag_need_colon     = 1 << 6,\n    flag_done           = 1 << 7,\n    flag_num_negative   = 1 << 8,\n    flag_num_zero       = 1 << 9,\n    flag_num_e          = 1 << 10,\n    flag_num_e_got_sign = 1 << 11,\n    flag_num_e_negative = 1 << 12,\n    flag_line_comment   = 1 << 13,\n    flag_block_comment  = 1 << 14;\n\njson_value *\njson_parse_ex(json_settings *settings,\n              const json_char *json,\n              size_t length,\n              char *error_buf)\n{\n    json_char error[json_error_max];\n    int cur_line;\n    const json_char *cur_line_begin, *i, *end;\n    json_value *top, *root, *alloc = 0;\n    json_state state = { 0UL, 0U, 0UL, { 0UL, 0, NULL, NULL, NULL }, 0 };\n    long flags;\n    long num_digits = 0, num_e = 0;\n    json_int_t num_fraction = 0;\n\n    /* Skip UTF-8 BOM\n     */\n    if (length >= 3 && ((unsigned char)json[0]) == 0xEF\n        && ((unsigned char)json[1]) == 0xBB\n        && ((unsigned char)json[2]) == 0xBF) {\n        json   += 3;\n        length -= 3;\n    }\n\n    error[0] = '\\0';\n    end      = (json + length);\n\n    memcpy(&state.settings, settings, sizeof(json_settings));\n\n    if (!state.settings.mem_alloc) {\n        state.settings.mem_alloc = default_alloc;\n    }\n\n    if (!state.settings.mem_free) {\n        state.settings.mem_free = default_free;\n    }\n\n    memset(&state.uint_max, 0xFF, sizeof(state.uint_max));\n    memset(&state.ulong_max, 0xFF, sizeof(state.ulong_max));\n\n    state.uint_max  -= 8; /* limit of how much can be added before next check */\n    state.ulong_max -= 8;\n\n    for (state.first_pass = 1; state.first_pass >= 0; --state.first_pass) {\n        json_uchar uchar;\n        unsigned char uc_b1, uc_b2, uc_b3, uc_b4;\n        json_char *string          = 0;\n        unsigned int string_length = 0;\n\n        top   = root = 0;\n        flags = flag_seek_value;\n\n        cur_line       = 1;\n        cur_line_begin = json;\n\n        for (i = json;; ++i) {\n            json_char b = (i == end ? 0 : *i);\n\n            if (flags & flag_string) {\n                if (!b) {\n                    sprintf(error, \"Unexpected EOF in string (at %d:%d)\",\n                            cur_line, e_off);\n                    goto e_failed;\n                }\n\n                if (string_length > state.uint_max) {\n                    goto e_overflow;\n                }\n\n                if (flags & flag_escaped) {\n                    flags &= ~flag_escaped;\n\n                    switch (b) {\n                    case 'b':\n                        string_add('\\b');\n                        break;\n                    case 'f':\n                        string_add('\\f');\n                        break;\n                    case 'n':\n                        string_add('\\n');\n                        break;\n                    case 'r':\n                        string_add('\\r');\n                        break;\n                    case 't':\n                        string_add('\\t');\n                        break;\n                    case 'u':\n\n                        if (end - i < 4 ||\n                            (uc_b1 = hex_value(*++i)) == 0xFF ||\n                            (uc_b2 = hex_value(*++i)) == 0xFF\n                            || (uc_b3 = hex_value(*++i)) == 0xFF ||\n                            (uc_b4 = hex_value(*++i)) == 0xFF) {\n                            sprintf(error,\n                                    \"Invalid character value `%c` (at %d:%d)\",\n                                    b, cur_line, e_off);\n                            goto e_failed;\n                        }\n\n                        uc_b1 = uc_b1 * 16 + uc_b2;\n                        uc_b2 = uc_b3 * 16 + uc_b4;\n\n                        uchar = ((json_char)uc_b1) * 256 + uc_b2;\n\n                        if (sizeof(json_char) >= sizeof(json_uchar) ||\n                            (uc_b1 == 0 && uc_b2 <= 0x7F)) {\n                            string_add((json_char)uchar);\n                            break;\n                        }\n\n                        if (uchar <= 0x7FF) {\n                            if (state.first_pass) {\n                                string_length += 2;\n                            } else {\n                                string[string_length++] = 0xC0 |\n                                                          ((uc_b2 &\n                                                            0xC0) >>\n                                                           6) |\n                                                          ((uc_b1 & 0x7) << 2);\n                                string[string_length++] = 0x80 |\n                                                          (uc_b2 & 0x3F);\n                            }\n\n                            break;\n                        }\n\n                        if (state.first_pass) {\n                            string_length += 3;\n                        } else {\n                            string[string_length++] = 0xE0 |\n                                                      ((uc_b1 & 0xF0) >> 4);\n                            string[string_length++] = 0x80 |\n                                                      ((uc_b1 &\n                                                        0xF) <<\n                                                       2) |\n                                                      ((uc_b2 & 0xC0) >> 6);\n                            string[string_length++] = 0x80 | (uc_b2 & 0x3F);\n                        }\n\n                        break;\n\n                    default:\n                        string_add(b);\n                    }\n\n                    continue;\n                }\n\n                if (b == '\\\\') {\n                    flags |= flag_escaped;\n                    continue;\n                }\n\n                if (b == '\"') {\n                    if (!state.first_pass) {\n                        string[string_length] = 0;\n                    }\n\n                    flags &= ~flag_string;\n                    string = 0;\n\n                    switch (top->type) {\n                    case json_string:\n\n                        top->u.string.length = string_length;\n                        flags               |= flag_next;\n\n                        break;\n\n                    case json_object:\n\n                        if (state.first_pass) {\n                            (*(json_char **)&top->u.object.values) +=\n                                string_length + 1;\n                        } else {\n                            top->u.object.values[top->u.object.length].name\n                                = (json_char *)top->_reserved.object_mem;\n\n                            top->u.object.values[top->u.object.length].\n                            name_length\n                                = string_length;\n\n                            (*(json_char **)&top->_reserved.object_mem) +=\n                                string_length + 1;\n                        }\n\n                        flags |= flag_seek_value | flag_need_colon;\n                        continue;\n\n                    default:\n                        break;\n                    }\n                } else {\n                    string_add(b);\n                    continue;\n                }\n            }\n\n            if (state.settings.settings & json_enable_comments) {\n                if (flags & (flag_line_comment | flag_block_comment)) {\n                    if (flags & flag_line_comment) {\n                        if (b == '\\r' || b == '\\n' || !b) {\n                            flags &= ~flag_line_comment;\n                            --i;   /* so null can be reproc'd */\n                        }\n\n                        continue;\n                    }\n\n                    if (flags & flag_block_comment) {\n                        if (!b) {\n                            sprintf(error,\n                                    \"%d:%d: Unexpected EOF in block comment\",\n                                    cur_line, e_off);\n                            goto e_failed;\n                        }\n\n                        if (b == '*' && i < (end - 1) && i[1] == '/') {\n                            flags &= ~flag_block_comment;\n                            ++i;   /* skip closing sequence */\n                        }\n\n                        continue;\n                    }\n                } else if (b == '/') {\n                    if (!(flags & (flag_seek_value | flag_done)) && top->type !=\n                        json_object) {\n                        sprintf(error, \"%d:%d: Comment not allowed here\",\n                                cur_line, e_off);\n                        goto e_failed;\n                    }\n\n                    if (++i == end) {\n                        sprintf(error, \"%d:%d: EOF unexpected\", cur_line,\n                                e_off);\n                        goto e_failed;\n                    }\n\n                    switch (b = *i) {\n                    case '/':\n                        flags |= flag_line_comment;\n                        continue;\n\n                    case '*':\n                        flags |= flag_block_comment;\n                        continue;\n\n                    default:\n                        sprintf(error,\n                                \"%d:%d: Unexpected `%c` in comment opening sequence\", cur_line, e_off,\n                                b);\n                        goto e_failed;\n                    }\n                }\n            }\n\n            if (flags & flag_done) {\n                if (!b) {\n                    break;\n                }\n\n                switch (b) {\nwhitespace:\n                    continue;\n\n                default:\n                    sprintf(error, \"%d:%d: Trailing garbage: `%c`\", cur_line,\n                            e_off, b);\n                    goto e_failed;\n                }\n            }\n\n            if (flags & flag_seek_value) {\n                switch (b) {\nwhitespace:\n                    continue;\n\n                case ']':\n\n                    if (top->type == json_array) {\n                        flags =\n                            (flags &\n                             ~(flag_need_comma | flag_seek_value)) | flag_next;\n                    } else {\n                        sprintf(error, \"%d:%d: Unexpected ]\", cur_line, e_off);\n                        goto e_failed;\n                    }\n\n                    break;\n\n                default:\n\n                    if (flags & flag_need_comma) {\n                        if (b == ',') {\n                            flags &= ~flag_need_comma;\n                            continue;\n                        } else {\n                            sprintf(error, \"%d:%d: Expected , before %c\",\n                                    cur_line, e_off, b);\n                            goto e_failed;\n                        }\n                    }\n\n                    if (flags & flag_need_colon) {\n                        if (b == ':') {\n                            flags &= ~flag_need_colon;\n                            continue;\n                        } else {\n                            sprintf(error, \"%d:%d: Expected : before %c\",\n                                    cur_line, e_off, b);\n                            goto e_failed;\n                        }\n                    }\n\n                    flags &= ~flag_seek_value;\n\n                    switch (b) {\n                    case '{':\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_object)) {\n                            goto e_alloc_failure;\n                        }\n\n                        continue;\n\n                    case '[':\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_array)) {\n                            goto e_alloc_failure;\n                        }\n\n                        flags |= flag_seek_value;\n                        continue;\n\n                    case '\"':\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_string)) {\n                            goto e_alloc_failure;\n                        }\n\n                        flags |= flag_string;\n\n                        string        = top->u.string.ptr;\n                        string_length = 0;\n\n                        continue;\n\n                    case 't':\n\n                        if ((end - i) < 3 || *(++i) != 'r' || *(++i) != 'u' ||\n                            *(++i) != 'e') {\n                            goto e_unknown_value;\n                        }\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_boolean)) {\n                            goto e_alloc_failure;\n                        }\n\n                        top->u.boolean = 1;\n\n                        flags |= flag_next;\n                        break;\n\n                    case 'f':\n\n                        if ((end - i) < 4 || *(++i) != 'a' || *(++i) != 'l' ||\n                            *(++i) != 's' || *(++i) != 'e') {\n                            goto e_unknown_value;\n                        }\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_boolean)) {\n                            goto e_alloc_failure;\n                        }\n\n                        flags |= flag_next;\n                        break;\n\n                    case 'n':\n\n                        if ((end - i) < 3 || *(++i) != 'u' || *(++i) != 'l' ||\n                            *(++i) != 'l') {\n                            goto e_unknown_value;\n                        }\n\n                        if (!new_value(&state, &top, &root, &alloc,\n                                       json_null)) {\n                            goto e_alloc_failure;\n                        }\n\n                        flags |= flag_next;\n                        break;\n\n                    default:\n\n                        if (isdigit((uint8_t)b) || b == '-') {\n                            if (!new_value(&state, &top, &root, &alloc,\n                                           json_integer)) {\n                                goto e_alloc_failure;\n                            }\n\n                            if (!state.first_pass) {\n                                while (isdigit((uint8_t)b) || b == '+' || b ==\n                                       '-'\n                                       || b == 'e' || b == 'E' || b == '.') {\n                                    if ((++i) == end) {\n                                        b = 0;\n                                        break;\n                                    }\n\n                                    b = *i;\n                                }\n\n                                flags |= flag_next | flag_reproc;\n                                break;\n                            }\n\n                            flags &= ~(flag_num_negative | flag_num_e |\n                                       flag_num_e_got_sign |\n                                       flag_num_e_negative |\n                                       flag_num_zero);\n\n                            num_digits   = 0;\n                            num_fraction = 0;\n                            num_e        = 0;\n\n                            if (b != '-') {\n                                flags |= flag_reproc;\n                                break;\n                            }\n\n                            flags |= flag_num_negative;\n                            continue;\n                        } else {\n                            sprintf(error,\n                                    \"%d:%d: Unexpected %c when seeking value\",\n                                    cur_line, e_off, b);\n                            goto e_failed;\n                        }\n                    }\n                }\n            } else {\n                switch (top->type) {\n                case json_object:\n\n                    switch (b) {\nwhitespace:\n                        continue;\n\n                    case '\"':\n\n                        if (flags & flag_need_comma) {\n                            sprintf(error, \"%d:%d: Expected , before \\\"\",\n                                    cur_line, e_off);\n                            goto e_failed;\n                        }\n\n                        flags |= flag_string;\n\n                        string        = (json_char *)top->_reserved.object_mem;\n                        string_length = 0;\n\n                        break;\n\n                    case '}':\n\n                        flags = (flags & ~flag_need_comma) | flag_next;\n                        break;\n\n                    case ',':\n\n                        if (flags & flag_need_comma) {\n                            flags &= ~flag_need_comma;\n                            break;\n                        }\n\n                    default:\n\n                        sprintf(error, \"%d:%d: Unexpected `%c` in object\",\n                                cur_line, e_off, b);\n                        goto e_failed;\n                    }\n\n                    break;\n\n                case json_integer:\n                case json_double:\n\n                    if (isdigit((uint8_t)b)) {\n                        ++num_digits;\n\n                        if (top->type == json_integer || flags & flag_num_e) {\n                            if (!(flags & flag_num_e)) {\n                                if (flags & flag_num_zero) {\n                                    sprintf(error,\n                                            \"%d:%d: Unexpected `0` before `%c`\",\n                                            cur_line, e_off, b);\n                                    goto e_failed;\n                                }\n\n                                if (num_digits == 1 && b == '0') {\n                                    flags |= flag_num_zero;\n                                }\n                            } else {\n                                flags |= flag_num_e_got_sign;\n                                num_e  = (num_e * 10) + (b - '0');\n                                continue;\n                            }\n\n                            top->u.integer = (top->u.integer * 10) + (b - '0');\n                            continue;\n                        }\n\n                        num_fraction = (num_fraction * 10) + (b - '0');\n                        continue;\n                    }\n\n                    if (b == '+' || b == '-') {\n                        if ((flags & flag_num_e) &&\n                            !(flags & flag_num_e_got_sign)) {\n                            flags |= flag_num_e_got_sign;\n\n                            if (b == '-') {\n                                flags |= flag_num_e_negative;\n                            }\n\n                            continue;\n                        }\n                    } else if (b == '.' && top->type == json_integer) {\n                        if (!num_digits) {\n                            sprintf(error, \"%d:%d: Expected digit before `.`\",\n                                    cur_line, e_off);\n                            goto e_failed;\n                        }\n\n                        top->type  = json_double;\n                        top->u.dbl = (double)top->u.integer;\n\n                        num_digits = 0;\n                        continue;\n                    }\n\n                    if (!(flags & flag_num_e)) {\n                        if (top->type == json_double) {\n                            if (!num_digits) {\n                                sprintf(error,\n                                        \"%d:%d: Expected digit after `.`\",\n                                        cur_line, e_off);\n                                goto e_failed;\n                            }\n\n                            top->u.dbl += ((double)num_fraction) /\n                                          (pow(10, (double)num_digits));\n                        }\n\n                        if (b == 'e' || b == 'E') {\n                            flags |= flag_num_e;\n\n                            if (top->type == json_integer) {\n                                top->type  = json_double;\n                                top->u.dbl = (double)top->u.integer;\n                            }\n\n                            num_digits = 0;\n                            flags     &= ~flag_num_zero;\n\n                            continue;\n                        }\n                    } else {\n                        if (!num_digits) {\n                            sprintf(error, \"%d:%d: Expected digit after `e`\",\n                                    cur_line, e_off);\n                            goto e_failed;\n                        }\n\n                        top->u.dbl *=\n                            pow(10,\n                                (double)((flags &\n                                         flag_num_e_negative) ? -num_e : num_e));\n                    }\n\n                    if (flags & flag_num_negative) {\n                        if (top->type == json_integer) {\n                            top->u.integer = -top->u.integer;\n                        } else {\n                            top->u.dbl = -top->u.dbl;\n                        }\n                    }\n\n                    flags |= flag_next | flag_reproc;\n                    break;\n\n                default:\n                    break;\n                }\n            }\n\n            if (flags & flag_reproc) {\n                flags &= ~flag_reproc;\n                --i;\n            }\n\n            if (flags & flag_next) {\n                flags = (flags & ~flag_next) | flag_need_comma;\n\n                if (!top->parent) {\n                    /* root value done */\n\n                    flags |= flag_done;\n                    continue;\n                }\n\n                if (top->parent->type == json_array) {\n                    flags |= flag_seek_value;\n                }\n\n                if (!state.first_pass) {\n                    json_value *parent = top->parent;\n\n                    switch (parent->type) {\n                    case json_object:\n\n                        parent->u.object.values\n                        [parent->u.object.length].value = top;\n\n                        break;\n\n                    case json_array:\n\n                        parent->u.array.values\n                        [parent->u.array.length] = top;\n\n                        break;\n\n                    default:\n                        break;\n                    }\n                }\n\n                if ((++top->parent->u.array.length) > state.uint_max) {\n                    goto e_overflow;\n                }\n\n                top = top->parent;\n\n                continue;\n            }\n        }\n\n        alloc = root;\n    }\n\n    return root;\n\ne_unknown_value:\n\n    sprintf(error, \"%d:%d: Unknown value\", cur_line, e_off);\n    goto e_failed;\n\ne_alloc_failure:\n\n    strcpy(error, \"Memory allocation failure\");\n    goto e_failed;\n\ne_overflow:\n\n    sprintf(error, \"%d:%d: Too long (caught overflow)\", cur_line, e_off);\n    goto e_failed;\n\ne_failed:\n\n    if (error_buf) {\n        if (*error) {\n            strcpy(error_buf, error);\n        } else {\n            strcpy(error_buf, \"Unknown error\");\n        }\n    }\n\n    if (state.first_pass) {\n        alloc = root;\n    }\n\n    while (alloc) {\n        top = alloc->_reserved.next_alloc;\n        state.settings.mem_free(alloc, state.settings.user_data);\n        alloc = top;\n    }\n\n    if (!state.first_pass) {\n        json_value_free_ex(&state.settings, root);\n    }\n\n    return 0;\n}\n\njson_value *\njson_parse(const json_char *json, size_t length)\n{\n    json_settings settings = { 0UL, 0, NULL, NULL, NULL };\n    return json_parse_ex(&settings, json, length, 0);\n}\n\nvoid\njson_value_free_ex(json_settings *settings, json_value *value)\n{\n    json_value *cur_value;\n\n    if (!value) {\n        return;\n    }\n\n    value->parent = 0;\n\n    while (value) {\n        switch (value->type) {\n        case json_array:\n\n            if (!value->u.array.length) {\n                settings->mem_free(value->u.array.values, settings->user_data);\n                break;\n            }\n\n            value = value->u.array.values[--value->u.array.length];\n            continue;\n\n        case json_object:\n\n            if (!value->u.object.length) {\n                settings->mem_free(value->u.object.values, settings->user_data);\n                break;\n            }\n\n            value = value->u.object.values[--value->u.object.length].value;\n            continue;\n\n        case json_string:\n\n            settings->mem_free(value->u.string.ptr, settings->user_data);\n            break;\n\n        default:\n            break;\n        }\n\n        cur_value = value;\n        value     = value->parent;\n        settings->mem_free(cur_value, settings->user_data);\n    }\n}\n\nvoid\njson_value_free(json_value *value)\n{\n    json_settings settings = { 0UL, 0, NULL, NULL, NULL };\n    settings.mem_free = default_free;\n    json_value_free_ex(&settings, value);\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/json.h",
    "content": "/* vim: set et ts=3 sw=3 sts=3 ft=c:\n *\n * Copyright (C) 2012, 2013, 2014 James McLaughlin et al.  All rights reserved.\n * https://github.com/udp/json-parser\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions\n * are met:\n *\n * 1. Redistributions of source code must retain the above copyright\n *   notice, this list of conditions and the following disclaimer.\n *\n * 2. Redistributions in binary form must reproduce the above copyright\n *   notice, this list of conditions and the following disclaimer in the\n *   documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND\n * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE\n * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL\n * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS\n * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\n * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\n * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\n * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF\n * SUCH DAMAGE.\n */\n\n#ifndef _JSON_H\n#define _JSON_H\n\n#ifndef json_char\n#define json_char char\n#endif\n\n#ifndef json_int_t\n#ifndef _MSC_VER\n#include <inttypes.h>\n#define json_int_t int64_t\n#else\n#define json_int_t __int64\n#endif\n#endif\n\n#include <stdlib.h>\n\n#ifdef __cplusplus\n\n#include <string.h>\n\nextern \"C\"\n{\n#endif\n\ntypedef struct {\n    unsigned long max_memory;\n    int settings;\n\n    /* Custom allocator support (leave null to use malloc/free)\n     */\n\n    void * (*mem_alloc)(size_t, int zero, void *user_data);\n    void (*mem_free)(void *, void *user_data);\n\n    void *user_data;       /* will be passed to mem_alloc and mem_free */\n} json_settings;\n\n#define json_enable_comments  0x01\n\ntypedef enum {\n    json_none,\n    json_object,\n    json_array,\n    json_integer,\n    json_double,\n    json_string,\n    json_boolean,\n    json_null\n} json_type;\n\nextern const struct _json_value json_value_none;\n\ntypedef struct _json_value {\n    struct _json_value *parent;\n\n    json_type type;\n\n    union {\n        int boolean;\n        json_int_t integer;\n        double dbl;\n\n        struct {\n            unsigned int length;\n            json_char *ptr;      /* null terminated */\n        } string;\n\n        struct {\n            unsigned int length;\n\n            struct {\n                json_char *name;\n                unsigned int name_length;\n\n                struct _json_value *value;\n            } *values;\n\n#if defined(__cplusplus) && __cplusplus >= 201103L\n            decltype(values) begin() const\n            {\n                return values;\n            }\n            decltype(values) end() const\n            {\n                return values + length;\n            }\n#endif\n        } object;\n\n        struct {\n            unsigned int length;\n            struct _json_value **values;\n\n#if defined(__cplusplus) && __cplusplus >= 201103L\n            decltype(values) begin() const\n            {\n                return values;\n            }\n            decltype(values) end() const\n            {\n                return values + length;\n            }\n#endif\n        } array;\n    } u;\n\n    union {\n        struct _json_value *next_alloc;\n        void *object_mem;\n    } _reserved;\n\n    /* Some C++ operator sugar */\n\n#ifdef __cplusplus\n\npublic:\n\n    inline _json_value(){\n        memset(this, 0, sizeof(_json_value));\n    }\n\n    inline const struct _json_value &operator [] (int index) const {\n        if (type != json_array || index < 0\n            || ((unsigned int)index) >= u.array.length) {\n            return json_value_none;\n        }\n\n        return *u.array.values[index];\n    }\n\n    inline const struct _json_value &operator [] (const char *index) const {\n        if (type != json_object) {\n            return json_value_none;\n        }\n\n        for (unsigned int i = 0; i < u.object.length; ++i)\n            if (!strcmp(u.object.values[i].name, index)) {\n                return *u.object.values[i].value;\n            }\n\n        return json_value_none;\n    }\n\n    inline operator const char * () const\n    {\n        switch (type) {\n        case json_string:\n            return u.string.ptr;\n\n        default:\n            return \"\";\n        }\n    }\n\n    inline operator\n    json_int_t() const\n    {\n        switch (type) {\n        case json_integer:\n            return u.integer;\n\n        case json_double:\n            return (json_int_t)u.dbl;\n\n        default:\n            return 0;\n        }\n    }\n\n    inline operator\n    bool() const\n    {\n        if (type != json_boolean) {\n            return false;\n        }\n\n        return u.boolean != 0;\n    }\n\n    inline operator double () const\n    {\n        switch (type) {\n        case json_integer:\n            return (double)u.integer;\n\n        case json_double:\n            return u.dbl;\n\n        default:\n            return 0;\n        }\n    }\n\n#endif\n} json_value;\n\njson_value *json_parse(const json_char *json,\n                       size_t length);\n\n#define json_error_max 128\njson_value *json_parse_ex(json_settings *settings,\n                          const json_char *json,\n                          size_t length,\n                          char *error);\n\nvoid json_value_free(json_value *);\n\n/* Not usually necessary, unless you used a custom mem_alloc and now want to\n * use a custom mem_free.\n */\nvoid json_value_free_ex(json_settings *settings,\n                        json_value *);\n\n#ifdef __cplusplus\n} /* extern \"C\" */\n#endif\n\n#endif\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/list.c",
    "content": "#include \"list.h\"\n\n/// 文件：list_impl.c\n/// 功能：实现链表的基本操作\n/// 作者：bluewind\n/// 完成时间：2011.5.29\n/// 修改时间：2011.5.31, 2011.7.2\n/// 修改备注：在头节点处添加一个空节点，可以优化添加、删除节点代码\n///  再次修改，链表增加节点数据data_size，限制数据大小，修改了\n///  添加复制数据代码，修正重复添加节点后释放节点的Bug，添加了前\n///  插、排序和遍历功能，7.3 添加tail尾指针，改进后插法性能，并改名\n/// --------------------------------------------------------------\n\nvoid swap_data(Node n1, Node n2);\n\n/// --------------------------------------------------------------\n//  函数名：list_init\n//  功能：  链表初始化\n//  参数：  无\n//  返回值：已初始化链表指针\n//  备注：  链表本身动态分配，由list_destroy函数管理释放\n/// --------------------------------------------------------------\nList list_init(unsigned int data_size)\n{\n    List list = (List) malloc(sizeof(struct clist));\n    if(list != NULL)                                        //内存分配成功\n    {\n        list->head = (Node) malloc(sizeof(node));           //为头节点分配内存\n        if(list->head)          //内存分配成功\n        {\n            list->head->data = NULL;      //初始化头节点\n            list->head->next = NULL;\n            list->data_size  = data_size;\n            list->tail = list->head;\n            list->size = 0;\n\n            list->add_back  = list_add_back;   //初始化成员函数\n            list->add_front  = list_add_front;\n            list->delete_node = list_delete_node;\n            list->delete_at  = list_delete_at;\n            list->modify_at  = list_modify_at;\n            list->have_same  = list_have_same;\n            list->have_same_cmp  = list_have_same_cmp;\n            list->foreach  = list_foreach;\n            list->clear   = list_clear;\n            list->sort   = list_sort;\n            list->destroy  = list_destroy;\n        }\n    }\n    return list;\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_add_back\n//  功能：  添加链表结点 (后插法)\n//  参数：  l--链表指针，data--链表数据指针，可为任意类型\n//  返回值：int型，为1表示添加成功，为0表示添加失败\n//  备注：  如果链表本身为空或是分配节点内存失败，将返回0\n/// --------------------------------------------------------------\nint  list_add_back(List l, void *data)\n{\n    Node new_node = (Node) malloc(sizeof(node));\n\n    if(l != NULL && new_node != NULL)  //链表本身不为空，且内存申请成功\n    {\n        new_node->data = malloc(l->data_size);\n        memcpy(new_node->data, data, l->data_size);\n        new_node->next = NULL;\n\n        l->tail->next = new_node;   //添加节点\n        l->tail = new_node;     //记录尾节点位置\n        l->size ++;       //链表元素总数加1\n\n        return 1;\n    }\n\n    return 0;\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_add_front\n//  功能：  添加链表结点 (前插法)\n//  参数：  l--链表指针，data--链表数据指针，可为任意类型\n//  返回值：int型，为1表示添加成功，为0表示添加失败\n//  备注：  如果链表本身为空或是分配节点内存失败，将返回0\n/// --------------------------------------------------------------\nint list_add_front(List l, void *data)\n{\n    Node new_node = (Node) malloc(sizeof(node));\n\n    if(l != NULL && new_node != NULL)\n    {\n        new_node->data = malloc(l->data_size);\n        memcpy(new_node->data, data, l->data_size);\n        new_node->next = l->head->next;\n\n        l->head->next = new_node;\n        if(!l->size)        //记录尾指针位置\n            l->tail = new_node;\n        l->size ++;\n\n        return 1;\n    }\n\n    return 0;\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_delete_node\n//  功能：删除链表结点\n//  参数：l--链表指针，data--链表数据指针，可为任意类型\n//        *pfunc为指向一个数据类型比较的函数指针\n//  返回值：int型，为1表示删除成功，为0表示没有找到匹配数据\n//  备注：*pfunc函数接口参数ndata为节点数据，data为比较数据，返回为真表示匹配数据\n/// --------------------------------------------------------------\nint  list_delete_node(List l, void *data, int (*pfunc)(void *ndata, void *data))\n{\n    if(l != NULL)\n    {\n        Node prev = l->head;      //前一个节点\n        Node curr = l->head->next;     //当前节点\n\n        while(curr != NULL)\n        {\n            if(pfunc(curr->data, data))    //如果找到匹配数据\n            {\n                if(curr == l->tail)     //如果是删除尾节点\n                 l->tail = prev;\n\n                prev->next = prev->next->next;  //修改前节点next指针指向下下个节点\n\n                free(curr->data);     //释放节点数据\n                free(curr);       //释放节点\n\n                l->size--;       //链表元素总数减1\n                return 1;       //返回真值\n            }\n            prev = prev->next;      //没有找到匹配时移动前节点和当前节点\n            curr = curr->next;\n        }\n    }\n\n return 0;         //没有找到匹配数据\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_delete_at\n//  功能：  修改链表节点元素值\n//  参数：  l--链表指针，index--索引值, 范围(0 -- size-1)\n//  返回值：int型，为1表示删除成功，为0表示删除失败\n//  备注：  如果链表本身为空或是index为非法值，将返回0\n/// --------------------------------------------------------------\nint list_delete_at(List l, unsigned int index)\n{\n    unsigned int cindex = 0;\n\n    if(l != NULL && index >= 0 && index < l->size)\n    {\n        Node prev = l->head;      //前一个节点\n        Node curr = l->head->next;     //当前节点\n\n        while(cindex != index)\n        {\n            prev = prev->next;\n            curr = curr->next;\n            cindex ++;\n        }\n\n        if(index == (l->size) - 1)\n            l->tail = prev;\n\n        prev->next = prev->next->next;\n        free(curr->data);\n        free(curr);\n        l->size --;\n\n        return 1;\n    }\n\n    return 0;\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_modify_at\n//  功能：  修改链表节点元素值\n//  参数：  l--链表指针，index--索引值, 范围(0 -- size-1)\n//   data--链表数据指针\n//  返回值：int型，为1表示修改成功，为0表示修改失败\n//  备注：  如果链表本身为空或是index为非法值，将返回0\n/// --------------------------------------------------------------\nint list_modify_at(List l, unsigned int index, void *new_data)\n{\n    unsigned int cindex = 0;\n\n    if(l != NULL && index >= 0 && index < l->size )  //非空链表，并且index值合法\n    {\n        Node curr = l->head->next;\n        while(cindex != index)\n        {\n            curr = curr->next;\n            cindex ++;\n        }\n        memcpy(curr->data, new_data, l->data_size);\n        return 1;\n    }\n\n    return 0;\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_sort\n//  功能：  链表排序\n//  参数：  l--链表指针，*pfunc为指向一个数据类型比较的函数指针\n//  返回值：无\n//  备注：  使用简单选择排序法，相比冒泡法每次交换，效率高一点\n/// --------------------------------------------------------------\nvoid list_sort(List l, compare pfunc)\n{\n    if(l != NULL)\n    {\n        Node min, icurr, jcurr;\n\n        icurr = l->head->next;\n        while(icurr)\n        {\n            min = icurr;        //记录最小值\n            jcurr = icurr->next;      //内循环指向下一个节点\n            while(jcurr)\n            {\n                if(pfunc(min->data, jcurr->data))  //如果找到n+1到最后一个元素最小值\n                    min = jcurr;      //记录下最小值的位置\n\n                jcurr = jcurr->next;\n            }\n\n            if(min != icurr)       //当最小值位置和n+1元素位置不相同时\n            {\n                swap_data(min, icurr);     //才进行交换，减少交换次数\n            }\n\n            icurr = icurr->next;\n        }\n    }\n}\n\nvoid swap_data(Node n1, Node n2)\n{\n    void *temp;\n\n    temp = n2->data;\n    n2->data = n1->data;\n    n1->data = temp;\n}\n\n\nint list_have_same(List l, void *data, int (*pfunc)(void *ndata, void *data))\n{\n    if(l != NULL)\n    {\n        Node curr;\n\n        for(curr = l->head->next; curr != NULL; curr = curr->next)\n        {\n            if(pfunc(curr->data, data))\n            {\n                return 1;\n            }\n        }\n    }\n\n    return 0;\n}\n\nint list_have_same_cmp(List l, void *data)\n{\n    if(l != NULL)\n    {\n        Node curr;\n\n        for(curr = l->head->next; curr != NULL; curr = curr->next)\n        {\n            if(memcmp(curr->data, data, l->data_size))\n            {\n                return 1;\n            }\n        }\n    }\n\n    return 0;\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_foreach\n//  功能：  遍历链表元素\n//  参数：  l--链表指针，doit为指向一个处理数据的函数指针\n//  返回值：无\n//  备注：  doit申明为void (*dofunc)(void *ndata)原型\n/// --------------------------------------------------------------\nvoid list_foreach(List l, dofunc doit)\n{\n    if(l != NULL)\n    {\n        Node curr;\n\n        for(curr = l->head->next; curr != NULL; curr = curr->next)\n        {\n            doit(curr->data);\n        }\n    }\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_clear\n//  功能：  清空链表元素\n//  参数：  l--链表指针\n//  返回值：无\n// 备注： 没有使用先Destroy再Init链表的办法，直接实现\n/// --------------------------------------------------------------\nvoid list_clear(List l)\n{\n    if(l != NULL)\n    {\n        Node temp;\n        Node curr = l->head->next;\n\n        while(curr != NULL)\n        {\n            temp = curr->next;\n\n            free(curr->data);    //释放节点和数据\n            free(curr);\n\n            curr = temp;\n        }\n\n        l->size = 0;      //重置链表数据\n        l->head->next = NULL;\n        l->tail = l->head;\n    }\n}\n\n/// --------------------------------------------------------------\n//  函数名：list_destroy\n//  功能：  释放链表\n//  参数：  l--链表指针\n//  返回值：空链表指针\n/// --------------------------------------------------------------\nList list_destroy(List l)\n{\n    if(l != NULL)\n    {\n        Node temp;\n\n        while(l->head)\n        {\n            temp = l->head->next;\n\n            if(l->head->data != NULL)   //如果是头节点就不释放数据空间\n            free(l->head->data);   //先释放节点数据(但是节点数据里也有指针？)\n            free(l->head);      //再释放节点\n\n            l->head = temp;\n        }\n\n        free(l);        //释放链表本身占用空间\n        l = NULL;\n    }\n\n    return l;\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/list.h",
    "content": "#ifndef LIST_H_H\n#define LIST_H_H\n\n#include <stdio.h>\n#include <malloc.h>\n#include <string.h>\n\ntypedef struct clist *List;\n\ntypedef int (*compare)(void *ndata, void *data);\ntypedef void (*dofunc)(void *ndata);\n\ntypedef int (*lpf0)(List l, void *data);\ntypedef int (*lpf1)(List l, void *data, compare pfunc);\ntypedef List (*lpf2)(List l);\ntypedef void (*lpf3)(List l);\ntypedef void (*lpf4)(List l, dofunc pfunc);\ntypedef int (*lpf5)(List l, unsigned int index, void *new_data);\ntypedef void (*lpf6)(List l, compare pfunc);\ntypedef int (*lpf7)(List l, unsigned int index);\n\ntypedef struct cnode\n{\n    void *data;\n    struct cnode *next;\n}node, *Node;\n\ntypedef struct clist\n{\n    Node head;\n    Node tail;\n    unsigned int size;\n    unsigned int data_size;\n    lpf0 add_back;\n    lpf0 add_front;\n    lpf1 delete_node;\n    lpf1 have_same;\n    lpf0 have_same_cmp;\n    lpf4 foreach;\n    lpf3 clear;\n    lpf2 destroy;\n    lpf5 modify_at;\n    lpf6 sort;\n    lpf7 delete_at;\n}list;\n\n//初始化链表\nList list_init(unsigned int data_size);\nint  list_add_back(List l, void *data);\nint  list_add_front(List l, void *data);\nint  list_delete_node(List l, void *data, compare pfunc);\nint  list_delete_at(List l, unsigned int index);\nint  list_modify_at(List l, unsigned int index, void *new_data);\nint  list_have_same(List l, void *data, compare pfunc);\nint  list_have_same_cmp(List l, void *data);\nvoid list_foreach(List l, dofunc doit);\nvoid list_sort(List l, compare pfunc);\nvoid list_clear(List l);\n//释放链表\nList list_destroy(List l);\n#endif\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/netutils.c",
    "content": "/*\n * netutils.c - Network utilities\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#include <math.h>\n\n#include <libcork/core.h>\n#include <udns.h>\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#define sleep(n) Sleep(1000 * (n))\n#else\n#include <sys/socket.h>\n#include <netdb.h>\n#include <netinet/in.h>\n#include <unistd.h>\n#endif\n\n#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_NET_IF_H) && defined(__linux__)\n#include <net/if.h>\n#include <sys/ioctl.h>\n#define SET_INTERFACE\n#endif\n\n#include \"netutils.h\"\n#include \"utils.h\"\n\n#ifndef SO_REUSEPORT\n#define SO_REUSEPORT 15\n#endif\n\nextern int verbose;\n\nstatic const char valid_label_bytes[] =\n    \"-0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ_abcdefghijklmnopqrstuvwxyz\";\n\n#if defined(MODULE_LOCAL)\nextern int keep_resolving;\n#endif\n\nint\nset_reuseport(int socket)\n{\n    int opt = 1;\n    return setsockopt(socket, SOL_SOCKET, SO_REUSEPORT, &opt, sizeof(opt));\n}\n\nsize_t\nget_sockaddr_len(struct sockaddr *addr)\n{\n    if (addr->sa_family == AF_INET) {\n        return sizeof(struct sockaddr_in);\n    } else if (addr->sa_family == AF_INET6) {\n        return sizeof(struct sockaddr_in6);\n    }\n    return 0;\n}\n\n#ifdef SET_INTERFACE\nint\nsetinterface(int socket_fd, const char *interface_name)\n{\n    struct ifreq interface;\n    memset(&interface, 0, sizeof(struct ifreq));\n    strncpy(interface.ifr_name, interface_name, IFNAMSIZ);\n    int res = setsockopt(socket_fd, SOL_SOCKET, SO_BINDTODEVICE, &interface,\n                         sizeof(struct ifreq));\n    return res;\n}\n\n#endif\n\nint\nbind_to_address(int socket_fd, const char *host)\n{\n    if (host != NULL) {\n        struct cork_ip ip;\n        struct sockaddr_storage storage;\n        memset(&storage, 0, sizeof(struct sockaddr_storage));\n        if (cork_ip_init(&ip, host) != -1) {\n            if (ip.version == 4) {\n                struct sockaddr_in *addr = (struct sockaddr_in *)&storage;\n                dns_pton(AF_INET, host, &addr->sin_addr);\n                addr->sin_family = AF_INET;\n                return bind(socket_fd, (struct sockaddr *)addr, sizeof(struct sockaddr_in));\n            } else if (ip.version == 6) {\n                struct sockaddr_in6 *addr = (struct sockaddr_in6 *)&storage;\n                dns_pton(AF_INET6, host, &addr->sin6_addr);\n                addr->sin6_family = AF_INET6;\n                return bind(socket_fd, (struct sockaddr *)addr, sizeof(struct sockaddr_in6));\n            }\n        }\n    }\n    return -1;\n}\n\nssize_t\nget_sockaddr(char *host, char *port,\n             struct sockaddr_storage *storage, int block,\n             int ipv6first)\n{\n    struct cork_ip ip;\n    if (cork_ip_init(&ip, host) != -1) {\n        if (ip.version == 4) {\n            struct sockaddr_in *addr = (struct sockaddr_in *)storage;\n            addr->sin_family = AF_INET;\n            dns_pton(AF_INET, host, &(addr->sin_addr));\n            if (port != NULL) {\n                addr->sin_port = htons(atoi(port));\n            }\n        } else if (ip.version == 6) {\n            struct sockaddr_in6 *addr = (struct sockaddr_in6 *)storage;\n            addr->sin6_family = AF_INET6;\n            dns_pton(AF_INET6, host, &(addr->sin6_addr));\n            if (port != NULL) {\n                addr->sin6_port = htons(atoi(port));\n            }\n        }\n        return 0;\n    } else {\n        struct addrinfo hints;\n        struct addrinfo *result, *rp;\n\n        memset(&hints, 0, sizeof(struct addrinfo));\n        hints.ai_family   = AF_UNSPEC;   /* Return IPv4 and IPv6 choices */\n        hints.ai_socktype = SOCK_STREAM; /* We want a TCP socket */\n\n        int err, i;\n\n        for (i = 1; i < 8; i++) {\n            err = getaddrinfo(host, port, &hints, &result);\n#if defined(MODULE_LOCAL)\n            if (!keep_resolving)\n                break;\n#endif\n            if ((!block || !err)) {\n                break;\n            } else {\n                sleep(pow(2, i));\n                LOGE(\"failed to resolve server name, wait %.0f seconds\", pow(2, i));\n            }\n        }\n\n        if (err != 0) {\n            LOGE(\"getaddrinfo: %s\", gai_strerror(err));\n            return -1;\n        }\n\n        int prefer_af = ipv6first ? AF_INET6 : AF_INET;\n        for (rp = result; rp != NULL; rp = rp->ai_next)\n            if (rp->ai_family == prefer_af) {\n                if (rp->ai_family == AF_INET)\n                    memcpy(storage, rp->ai_addr, sizeof(struct sockaddr_in));\n                else if (rp->ai_family == AF_INET6)\n                    memcpy(storage, rp->ai_addr, sizeof(struct sockaddr_in6));\n                break;\n            }\n\n        if (rp == NULL) {\n            for (rp = result; rp != NULL; rp = rp->ai_next) {\n                if (rp->ai_family == AF_INET)\n                    memcpy(storage, rp->ai_addr, sizeof(struct sockaddr_in));\n                else if (rp->ai_family == AF_INET6)\n                    memcpy(storage, rp->ai_addr, sizeof(struct sockaddr_in6));\n                break;\n            }\n        }\n\n        if (rp == NULL) {\n            LOGE(\"failed to resolve remote addr\");\n            return -1;\n        }\n\n        freeaddrinfo(result);\n        return 0;\n    }\n\n    return -1;\n}\n\nint\nsockaddr_cmp(struct sockaddr_storage *addr1,\n             struct sockaddr_storage *addr2, socklen_t len)\n{\n    struct sockaddr_in *p1_in   = (struct sockaddr_in *)addr1;\n    struct sockaddr_in *p2_in   = (struct sockaddr_in *)addr2;\n    struct sockaddr_in6 *p1_in6 = (struct sockaddr_in6 *)addr1;\n    struct sockaddr_in6 *p2_in6 = (struct sockaddr_in6 *)addr2;\n    if (p1_in->sin_family < p2_in->sin_family)\n        return -1;\n    if (p1_in->sin_family > p2_in->sin_family)\n        return 1;\n    /* compare ip4 */\n    if (p1_in->sin_family == AF_INET) {\n        /* just order it, ntohs not required */\n        if (p1_in->sin_port < p2_in->sin_port)\n            return -1;\n        if (p1_in->sin_port > p2_in->sin_port)\n            return 1;\n        return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);\n    } else if (p1_in6->sin6_family == AF_INET6) {\n        /* just order it, ntohs not required */\n        if (p1_in6->sin6_port < p2_in6->sin6_port)\n            return -1;\n        if (p1_in6->sin6_port > p2_in6->sin6_port)\n            return 1;\n        return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,\n                      INET6_SIZE);\n    } else {\n        /* eek unknown type, perform this comparison for sanity. */\n        return memcmp(addr1, addr2, len);\n    }\n}\n\nint\nsockaddr_cmp_addr(struct sockaddr_storage *addr1,\n                  struct sockaddr_storage *addr2, socklen_t len)\n{\n    struct sockaddr_in *p1_in   = (struct sockaddr_in *)addr1;\n    struct sockaddr_in *p2_in   = (struct sockaddr_in *)addr2;\n    struct sockaddr_in6 *p1_in6 = (struct sockaddr_in6 *)addr1;\n    struct sockaddr_in6 *p2_in6 = (struct sockaddr_in6 *)addr2;\n    if (p1_in->sin_family < p2_in->sin_family)\n        return -1;\n    if (p1_in->sin_family > p2_in->sin_family)\n        return 1;\n    /* compare ip4 */\n    if (p1_in->sin_family == AF_INET) {\n        return memcmp(&p1_in->sin_addr, &p2_in->sin_addr, INET_SIZE);\n    } else if (p1_in6->sin6_family == AF_INET6) {\n        return memcmp(&p1_in6->sin6_addr, &p2_in6->sin6_addr,\n                      INET6_SIZE);\n    } else {\n        /* eek unknown type, perform this comparison for sanity. */\n        return memcmp(addr1, addr2, len);\n    }\n}\n\nint\nvalidate_hostname(const char *hostname, const int hostname_len)\n{\n    if (hostname == NULL)\n        return 0;\n\n    if (hostname_len < 1 || hostname_len > 255)\n        return 0;\n\n    if (hostname[0] == '.')\n        return 0;\n\n    const char *label = hostname;\n    while (label < hostname + hostname_len) {\n        size_t label_len = hostname_len - (label - hostname);\n        char *next_dot   = strchr(label, '.');\n        if (next_dot != NULL)\n            label_len = next_dot - label;\n\n        if (label + label_len > hostname + hostname_len)\n            return 0;\n\n        if (label_len > 63 || label_len < 1)\n            return 0;\n\n        if (label[0] == '-' || label[label_len - 1] == '-')\n            return 0;\n\n        if (strspn(label, valid_label_bytes) < label_len)\n            return 0;\n\n        label += label_len + 1;\n    }\n\n    return 1;\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/netutils.h",
    "content": "/*\n * netutils.h - Network utilities\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _NETUTILS_H\n#define _NETUTILS_H\n\n#if defined(__linux__)\n#include <netdb.h>\n#elif !defined(__MINGW32__)\n#include <netinet/tcp.h>\n#endif\n\n// only enable TCP_FASTOPEN on linux\n#if defined(__linux__)\n#include <linux/tcp.h>\n/*  conditional define for TCP_FASTOPEN */\n#ifndef TCP_FASTOPEN\n#define TCP_FASTOPEN   23\n#endif\n/*  conditional define for MSG_FASTOPEN */\n#ifndef MSG_FASTOPEN\n#define MSG_FASTOPEN   0x20000000\n#endif\n#elif !defined(__APPLE__)\n#ifdef TCP_FASTOPEN\n#undef TCP_FASTOPEN\n#endif\n#endif\n\n/* Backward compatibility for MPTCP_ENABLED between kernel 3 & 4 */\n#ifndef MPTCP_ENABLED\n#ifdef TCP_CC_INFO\n#define MPTCP_ENABLED 42\n#else\n#define MPTCP_ENABLED 26\n#endif\n#endif\n\n/** byte size of ip4 address */\n#define INET_SIZE 4\n/** byte size of ip6 address */\n#define INET6_SIZE 16\n\nsize_t get_sockaddr_len(struct sockaddr *addr);\nssize_t get_sockaddr(char *host, char *port,\n                     struct sockaddr_storage *storage, int block,\n                     int ipv6first);\nint set_reuseport(int socket);\n\n#ifdef SET_INTERFACE\nint setinterface(int socket_fd, const char *interface_name);\n#endif\n\nint bind_to_address(int socket_fd, const char *address);\n\n/**\n * Compare two sockaddrs. Imposes an ordering on the addresses.\n * Compares address and port.\n * @param addr1: address 1.\n * @param addr2: address 2.\n * @param len: lengths of addr.\n * @return: 0 if addr1 == addr2. -1 if addr1 is smaller, +1 if larger.\n */\nint sockaddr_cmp(struct sockaddr_storage *addr1,\n                 struct sockaddr_storage *addr2, socklen_t len);\n\n/**\n * Compare two sockaddrs. Compares address, not the port.\n * @param addr1: address 1.\n * @param addr2: address 2.\n * @param len: lengths of addr.\n * @return: 0 if addr1 == addr2. -1 if addr1 is smaller, +1 if larger.\n */\nint sockaddr_cmp_addr(struct sockaddr_storage *addr1,\n                      struct sockaddr_storage *addr2, socklen_t len);\n\nint validate_hostname(const char *hostname, const int hostname_len);\n\n#endif\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/obfs.c",
    "content": "#include <string.h>\n#include <stdlib.h>\n\n#include \"utils.h\"\n#include \"obfs.h\"\n\nint rand_bytes(uint8_t *output, int len);\n#define OBFS_HMAC_SHA1_LEN 10\n\n#include \"obfsutil.c\"\n#include \"crc32.c\"\n#include \"base64.c\"\n#include \"http_simple.c\"\n#include \"tls1.2_ticket.c\"\n#include \"verify.c\"\n#include \"auth.c\"\n\nvoid * init_data() {\n    return malloc(1);\n}\n\nobfs * new_obfs() {\n    obfs * self = (obfs*)malloc(sizeof(obfs));\n    self->l_data = NULL;\n    return self;\n}\n\nvoid set_server_info(obfs *self, server_info *server) {\n    memmove(&self->server, server, sizeof(server_info));\n}\n\nvoid get_server_info(obfs *self, server_info *server) {\n    memmove(server, &self->server, sizeof(server_info));\n}\n\nvoid dispose_obfs(obfs *self) {\n    free(self);\n}\n\nobfs_class * new_obfs_class(char *plugin_name)\n{\n    if (plugin_name == NULL)\n        return NULL;\n    if (strcmp(plugin_name, \"origin\") == 0)\n        return NULL;\n    if (strcmp(plugin_name, \"plain\") == 0)\n        return NULL;\n    init_crc32_table();\n    init_shift128plus();\n    if (strcmp(plugin_name, \"http_simple\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = init_data;\n        plugin->new_obfs = http_simple_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = http_simple_dispose;\n\n        plugin->client_encode = http_simple_client_encode;\n        plugin->client_decode = http_simple_client_decode;\n\n        plugin->server_encode = http_simple_server_encode;\n        plugin->server_decode = http_simple_server_decode;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"http_post\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = init_data;\n        plugin->new_obfs = http_simple_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = http_simple_dispose;\n\n        plugin->client_encode = http_post_client_encode;\n        plugin->client_decode = http_simple_client_decode;\n\n        plugin->server_encode = http_simple_server_encode;\n        plugin->server_decode = http_simple_server_decode;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"tls1.2_ticket_auth\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = tls12_ticket_auth_init_data;\n        plugin->new_obfs = tls12_ticket_auth_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = tls12_ticket_auth_dispose;\n\n        plugin->client_encode = tls12_ticket_auth_client_encode;\n        plugin->client_decode = tls12_ticket_auth_client_decode;\n\n        plugin->server_encode = tls12_ticket_auth_server_encode;\n        plugin->server_decode = tls12_ticket_auth_server_decode;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"verify_simple\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = init_data;\n        plugin->new_obfs = verify_simple_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = verify_simple_dispose;\n\n        plugin->client_pre_encrypt = verify_simple_client_pre_encrypt;\n        plugin->client_post_decrypt = verify_simple_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = NULL;\n        plugin->client_udp_post_decrypt = NULL;\n\n        plugin->server_pre_encrypt = verify_simple_server_pre_encrypt;\n        plugin->server_post_decrypt = verify_simple_server_post_decrypt;\n        plugin->server_udp_pre_encrypt = NULL;\n        plugin->server_udp_post_decrypt = NULL;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_simple\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = auth_simple_init_data;\n        plugin->new_obfs = auth_simple_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = auth_simple_dispose;\n\n        plugin->client_pre_encrypt = auth_simple_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_simple_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = NULL;\n        plugin->client_udp_post_decrypt = NULL;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_sha1\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = auth_simple_init_data;\n        plugin->new_obfs = auth_simple_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = auth_simple_dispose;\n\n        plugin->client_pre_encrypt = auth_sha1_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_sha1_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = NULL;\n        plugin->client_udp_post_decrypt = NULL;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_sha1_v2\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = auth_simple_init_data;\n        plugin->new_obfs = auth_simple_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = auth_simple_dispose;\n\n        plugin->client_pre_encrypt = auth_sha1_v2_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_sha1_v2_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = NULL;\n        plugin->client_udp_post_decrypt = NULL;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_sha1_v4\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = auth_simple_init_data;\n        plugin->new_obfs = auth_simple_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = auth_simple_dispose;\n\n        plugin->client_pre_encrypt = auth_sha1_v4_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_sha1_v4_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = NULL;\n        plugin->client_udp_post_decrypt = NULL;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_aes128_md5\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = auth_simple_init_data;\n        plugin->new_obfs = auth_aes128_md5_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = auth_simple_dispose;\n\n        plugin->client_pre_encrypt = auth_aes128_sha1_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_aes128_sha1_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = auth_aes128_sha1_client_udp_pre_encrypt;\n        plugin->client_udp_post_decrypt = auth_aes128_sha1_client_udp_post_decrypt;\n\n        return plugin;\n    } else if (strcmp(plugin_name, \"auth_aes128_sha1\") == 0) {\n        obfs_class * plugin = (obfs_class*)malloc(sizeof(obfs));\n        plugin->init_data = auth_simple_init_data;\n        plugin->new_obfs = auth_aes128_sha1_new_obfs;\n        plugin->get_server_info = get_server_info;\n        plugin->set_server_info = set_server_info;\n        plugin->dispose = auth_simple_dispose;\n\n        plugin->client_pre_encrypt = auth_aes128_sha1_client_pre_encrypt;\n        plugin->client_post_decrypt = auth_aes128_sha1_client_post_decrypt;\n        plugin->client_udp_pre_encrypt = auth_aes128_sha1_client_udp_pre_encrypt;\n        plugin->client_udp_post_decrypt = auth_aes128_sha1_client_udp_post_decrypt;\n\n        return plugin;\n    }\n    LOGE(\"Load obfs '%s' failed\", plugin_name);\n    return NULL;\n}\n\nvoid free_obfs_class(obfs_class *plugin) {\n    free(plugin);\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/obfs.h",
    "content": "/*\n * obfs.h - Define shadowsocksR server's buffers and callbacks\n *\n * Copyright (C) 2015 - 2016, Break Wa11 <mmgac001@gmail.com>\n */\n\n#ifndef _OBFS_H\n#define _OBFS_H\n\n#include <stdint.h>\n#include <unistd.h>\n\ntypedef struct server_info {\n    char host[64];\n    uint16_t port;\n    char *param;\n    void *g_data;\n    uint8_t *iv;\n    size_t iv_len;\n    uint8_t *recv_iv;\n    size_t recv_iv_len;\n    uint8_t *key;\n    size_t key_len;\n    int head_len;\n    size_t tcp_mss;\n}server_info;\n\ntypedef struct obfs {\n    server_info server;\n    void *l_data;\n}obfs;\n\ntypedef struct obfs_class {\n    void * (*init_data)();\n    obfs * (*new_obfs)();\n    void (*get_server_info)(obfs *self, server_info *server);\n    void (*set_server_info)(obfs *self, server_info *server);\n    void (*dispose)(obfs *self);\n\n    int (*client_pre_encrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*client_encode)(obfs *self,\n            char **pencryptdata,\n            int datalength,\n            size_t* capacity);\n    int (*client_decode)(obfs *self,\n            char **pencryptdata,\n            int datalength,\n            size_t* capacity,\n            int *needsendback);\n    int (*client_post_decrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*client_udp_pre_encrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*client_udp_post_decrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*server_pre_encrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*server_post_decrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*server_udp_pre_encrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*server_udp_post_decrypt)(obfs *self,\n            char **pplaindata,\n            int datalength,\n            size_t* capacity);\n    int (*server_encode)(obfs *self,\n            char **pencryptdata,\n            int datalength,\n            size_t* capacity);\n    int (*server_decode)(obfs *self,\n            char **pencryptdata,\n            int datalength,\n            size_t* capacity,\n            int *needsendback);\n}obfs_class;\n\nobfs_class * new_obfs_class(char *plugin_name);\nvoid free_obfs_class(obfs_class *plugin);\n\nvoid set_server_info(obfs *self, server_info *server);\nvoid get_server_info(obfs *self, server_info *server);\nobfs * new_obfs();\nvoid dispose_obfs(obfs *self);\n\n#endif // _OBFS_H\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/obfsutil.c",
    "content": "int get_head_size(char *plaindata, int size, int def_size) {\n    if (plaindata == NULL || size < 2)\n        return def_size;\n    int head_type = plaindata[0] & 0x7;\n    if (head_type == 1)\n        return 7;\n    if (head_type == 4)\n        return 19;\n    if (head_type == 3)\n        return 4 + plaindata[1];\n    return def_size;\n}\n\nstatic int shift128plus_init_flag = 0;\nstatic uint64_t shift128plus_s[2] = {0x10000000, 0xFFFFFFFF};\n\nvoid init_shift128plus(void) {\n    if (shift128plus_init_flag == 0) {\n        shift128plus_init_flag = 1;\n        uint32_t seed = time(NULL);\n        shift128plus_s[0] = seed | 0x100000000L;\n        shift128plus_s[1] = ((uint64_t)seed << 32) | 0x1;\n    }\n}\n\nuint64_t xorshift128plus(void) {\n    uint64_t x = shift128plus_s[0];\n    uint64_t const y = shift128plus_s[1];\n    shift128plus_s[0] = y;\n    x ^= x << 23; // a\n    x ^= x >> 17; // b\n    x ^= y ^ (y >> 26); // c\n    shift128plus_s[1] = x;\n    return x + y;\n}\n\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/protocol.h",
    "content": "/*\n * Copyright (c) 2014, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef PROTOCOL_H\n#define PROTOCOL_H\n\ntypedef struct protocol {\n    const int default_port;\n    int(*const parse_packet)(const char *, size_t, char **);\n} protocol_t;\n\n#endif\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/resolv.c",
    "content": "/*\n * Copyright (c) 2014, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <fcntl.h>\n#include <ev.h>\n#include <udns.h>\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#else\n#include <sys/socket.h>\n#include <netinet/in.h>\n#include <errno.h>\n#include <unistd.h>\n#endif\n\n#include \"resolv.h\"\n#include \"utils.h\"\n#include \"netutils.h\"\n\n/*\n * Implement DNS resolution interface using libudns\n */\n\nstruct ResolvQuery {\n    void (*client_cb)(struct sockaddr *, void *);\n    void (*client_free_cb)(void *);\n    void *client_cb_data;\n    struct dns_query *queries[2];\n    size_t response_count;\n    struct sockaddr **responses;\n    uint16_t port;\n};\n\nextern int verbose;\n\nstatic struct ev_io resolv_io_watcher;\nstatic struct ev_timer resolv_timeout_watcher;\nstatic const int MODE_IPV4_ONLY  = 0;\nstatic const int MODE_IPV6_ONLY  = 1;\nstatic const int MODE_IPV4_FIRST = 2;\nstatic const int MODE_IPV6_FIRST = 3;\nstatic int resolv_mode           = 0;\n\nstatic void resolv_sock_cb(struct ev_loop *, struct ev_io *, int);\nstatic void resolv_timeout_cb(struct ev_loop *, struct ev_timer *, int);\nstatic void dns_query_v4_cb(struct dns_ctx *, struct dns_rr_a4 *, void *);\nstatic void dns_query_v6_cb(struct dns_ctx *, struct dns_rr_a6 *, void *);\nstatic void dns_timer_setup_cb(struct dns_ctx *, int, void *);\nstatic void process_client_callback(struct ResolvQuery *);\nstatic inline int all_queries_are_null(struct ResolvQuery *);\nstatic struct sockaddr *choose_ipv4_first(struct ResolvQuery *);\nstatic struct sockaddr *choose_ipv6_first(struct ResolvQuery *);\nstatic struct sockaddr *choose_any(struct ResolvQuery *);\n\nint\nresolv_init(struct ev_loop *loop, char **nameservers, int nameserver_num, int ipv6first)\n{\n    if (ipv6first)\n        resolv_mode = MODE_IPV6_FIRST;\n    else\n        resolv_mode = MODE_IPV4_FIRST;\n\n    struct dns_ctx *ctx = &dns_defctx;\n    if (nameservers == NULL) {\n        /* Nameservers not specified, use system resolver config */\n        dns_init(ctx, 0);\n    } else {\n        dns_reset(ctx);\n\n        for (int i = 0; i < nameserver_num; i++) {\n            char *server = nameservers[i];\n            dns_add_serv(ctx, server);\n        }\n    }\n\n    int sockfd = dns_open(ctx);\n    if (sockfd < 0) {\n        FATAL(\"Failed to open DNS resolver socket\");\n    }\n\n    if (nameserver_num == 1 && nameservers != NULL) {\n        if (strncmp(\"127.0.0.1\", nameservers[0], 9) == 0\n            || strncmp(\"::1\", nameservers[0], 3) == 0) {\n            if (verbose) {\n                LOGI(\"bind UDP resolver to %s\", nameservers[0]);\n            }\n            if (bind_to_address(sockfd, nameservers[0]) == -1)\n                ERROR(\"bind_to_address\");\n        }\n    }\n\n#ifdef __MINGW32__\n    setnonblocking(sockfd);\n#else\n    int flags = fcntl(sockfd, F_GETFL, 0);\n    fcntl(sockfd, F_SETFL, flags | O_NONBLOCK);\n#endif\n\n    ev_io_init(&resolv_io_watcher, resolv_sock_cb, sockfd, EV_READ);\n    resolv_io_watcher.data = ctx;\n\n    ev_io_start(loop, &resolv_io_watcher);\n\n    ev_timer_init(&resolv_timeout_watcher, resolv_timeout_cb, 0.0, 0.0);\n    resolv_timeout_watcher.data = ctx;\n\n    dns_set_tmcbck(ctx, dns_timer_setup_cb, loop);\n\n    return sockfd;\n}\n\nvoid\nresolv_shutdown(struct ev_loop *loop)\n{\n    struct dns_ctx *ctx = (struct dns_ctx *)resolv_io_watcher.data;\n\n    ev_io_stop(loop, &resolv_io_watcher);\n\n    if (ev_is_active(&resolv_timeout_watcher)) {\n        ev_timer_stop(loop, &resolv_timeout_watcher);\n    }\n\n    dns_close(ctx);\n}\n\nstruct ResolvQuery *\nresolv_query(const char *hostname, void (*client_cb)(struct sockaddr *, void *),\n             void (*client_free_cb)(void *), void *client_cb_data,\n             uint16_t port)\n{\n    struct dns_ctx *ctx = (struct dns_ctx *)resolv_io_watcher.data;\n\n    /*\n     * Wrap udns's call back in our own\n     */\n    struct ResolvQuery *cb_data = ss_malloc(sizeof(struct ResolvQuery));\n    if (cb_data == NULL) {\n        LOGE(\"Failed to allocate memory for DNS query callback data.\");\n        return NULL;\n    }\n    memset(cb_data, 0, sizeof(struct ResolvQuery));\n\n    cb_data->client_cb      = client_cb;\n    cb_data->client_free_cb = client_free_cb;\n    cb_data->client_cb_data = client_cb_data;\n    memset(cb_data->queries, 0, sizeof(cb_data->queries));\n    cb_data->response_count = 0;\n    cb_data->responses      = NULL;\n    cb_data->port           = port;\n\n    /* Submit A and AAAA queries */\n    if (resolv_mode != MODE_IPV6_ONLY) {\n        cb_data->queries[0] = dns_submit_a4(ctx,\n                                            hostname, 0,\n                                            dns_query_v4_cb, cb_data);\n        if (cb_data->queries[0] == NULL) {\n            LOGE(\"Failed to submit DNS query: %s\",\n                 dns_strerror(dns_status(ctx)));\n        }\n    }\n\n    if (resolv_mode != MODE_IPV4_ONLY) {\n        cb_data->queries[1] = dns_submit_a6(ctx,\n                                            hostname, 0,\n                                            dns_query_v6_cb, cb_data);\n        if (cb_data->queries[1] == NULL) {\n            LOGE(\"Failed to submit DNS query: %s\",\n                 dns_strerror(dns_status(ctx)));\n        }\n    }\n\n    if (all_queries_are_null(cb_data)) {\n        if (cb_data->client_free_cb != NULL) {\n            cb_data->client_free_cb(cb_data->client_cb_data);\n        }\n        ss_free(cb_data);\n    }\n\n    return cb_data;\n}\n\nvoid\nresolv_cancel(struct ResolvQuery *query_handle)\n{\n    struct ResolvQuery *cb_data = (struct ResolvQuery *)query_handle;\n    struct dns_ctx *ctx         = (struct dns_ctx *)resolv_io_watcher.data;\n\n    for (int i = 0; i < sizeof(cb_data->queries) / sizeof(cb_data->queries[0]);\n         i++)\n        if (cb_data->queries[i] != NULL) {\n            dns_cancel(ctx, cb_data->queries[i]);\n            ss_free(cb_data->queries[i]);\n        }\n\n    if (cb_data->client_free_cb != NULL) {\n        cb_data->client_free_cb(cb_data->client_cb_data);\n    }\n\n    ss_free(cb_data);\n}\n\n/*\n * DNS UDP socket activity callback\n */\nstatic void\nresolv_sock_cb(struct ev_loop *loop, struct ev_io *w, int revents)\n{\n    struct dns_ctx *ctx = (struct dns_ctx *)w->data;\n\n    if (revents & EV_READ) {\n        dns_ioevent(ctx, ev_now(loop));\n    }\n}\n\n/*\n * Wrapper for client callback we provide to udns\n */\nstatic void\ndns_query_v4_cb(struct dns_ctx *ctx, struct dns_rr_a4 *result, void *data)\n{\n    struct ResolvQuery *cb_data = (struct ResolvQuery *)data;\n\n    if (result == NULL) {\n        if (verbose) {\n            LOGI(\"IPv4 resolv: %s\", dns_strerror(dns_status(ctx)));\n        }\n    } else if (result->dnsa4_nrr > 0) {\n        struct sockaddr **new_responses = ss_realloc(cb_data->responses,\n                                                     (cb_data->response_count +\n                                                      result->dnsa4_nrr) *\n                                                     sizeof(struct sockaddr *));\n        if (new_responses == NULL) {\n            LOGE(\"Failed to allocate memory for additional DNS responses\");\n        } else {\n            cb_data->responses = new_responses;\n\n            for (int i = 0; i < result->dnsa4_nrr; i++) {\n                struct sockaddr_in *sa =\n                    (struct sockaddr_in *)ss_malloc(sizeof(struct sockaddr_in));\n                sa->sin_family = AF_INET;\n                sa->sin_port   = cb_data->port;\n                sa->sin_addr   = result->dnsa4_addr[i];\n\n                cb_data->responses[cb_data->response_count] =\n                    (struct sockaddr *)sa;\n                if (cb_data->responses[cb_data->response_count] == NULL) {\n                    LOGE(\n                        \"Failed to allocate memory for DNS query result address\");\n                } else {\n                    cb_data->response_count++;\n                }\n            }\n        }\n    }\n\n    ss_free(result);\n    cb_data->queries[0] = NULL; /* mark A query as being completed */\n\n    /* Once all queries have completed, call client callback */\n    if (all_queries_are_null(cb_data)) {\n        return process_client_callback(cb_data);\n    }\n}\n\nstatic void\ndns_query_v6_cb(struct dns_ctx *ctx, struct dns_rr_a6 *result, void *data)\n{\n    struct ResolvQuery *cb_data = (struct ResolvQuery *)data;\n\n    if (result == NULL) {\n        if (verbose) {\n            LOGI(\"IPv6 resolv: %s\", dns_strerror(dns_status(ctx)));\n        }\n    } else if (result->dnsa6_nrr > 0) {\n        struct sockaddr **new_responses = ss_realloc(cb_data->responses,\n                                                     (cb_data->response_count +\n                                                      result->dnsa6_nrr) *\n                                                     sizeof(struct sockaddr *));\n        if (new_responses == NULL) {\n            LOGE(\"Failed to allocate memory for additional DNS responses\");\n        } else {\n            cb_data->responses = new_responses;\n\n            for (int i = 0; i < result->dnsa6_nrr; i++) {\n                struct sockaddr_in6 *sa =\n                    (struct sockaddr_in6 *)ss_malloc(sizeof(struct sockaddr_in6));\n                sa->sin6_family = AF_INET6;\n                sa->sin6_port   = cb_data->port;\n                sa->sin6_addr   = result->dnsa6_addr[i];\n\n                cb_data->responses[cb_data->response_count] =\n                    (struct sockaddr *)sa;\n                if (cb_data->responses[cb_data->response_count] == NULL) {\n                    LOGE(\n                        \"Failed to allocate memory for DNS query result address\");\n                } else {\n                    cb_data->response_count++;\n                }\n            }\n        }\n    }\n\n    ss_free(result);\n    cb_data->queries[1] = NULL; /* mark AAAA query as being completed */\n\n    /* Once all queries have completed, call client callback */\n    if (all_queries_are_null(cb_data)) {\n        return process_client_callback(cb_data);\n    }\n}\n\n/*\n * Called once all queries have been completed\n */\nstatic void\nprocess_client_callback(struct ResolvQuery *cb_data)\n{\n    struct sockaddr *best_address = NULL;\n\n    if (resolv_mode == MODE_IPV4_FIRST) {\n        best_address = choose_ipv4_first(cb_data);\n    } else if (resolv_mode == MODE_IPV6_FIRST) {\n        best_address = choose_ipv6_first(cb_data);\n    } else {\n        best_address = choose_any(cb_data);\n    }\n\n    cb_data->client_cb(best_address, cb_data->client_cb_data);\n\n    for (int i = 0; i < cb_data->response_count; i++)\n        ss_free(cb_data->responses[i]);\n\n    ss_free(cb_data->responses);\n    if (cb_data->client_free_cb != NULL) {\n        cb_data->client_free_cb(cb_data->client_cb_data);\n    }\n    ss_free(cb_data);\n}\n\nstatic struct sockaddr *\nchoose_ipv4_first(struct ResolvQuery *cb_data)\n{\n    for (int i = 0; i < cb_data->response_count; i++)\n        if (cb_data->responses[i]->sa_family == AF_INET) {\n            return cb_data->responses[i];\n        }\n\n    return choose_any(cb_data);\n}\n\nstatic struct sockaddr *\nchoose_ipv6_first(struct ResolvQuery *cb_data)\n{\n    for (int i = 0; i < cb_data->response_count; i++)\n        if (cb_data->responses[i]->sa_family == AF_INET6) {\n            return cb_data->responses[i];\n        }\n\n    return choose_any(cb_data);\n}\n\nstatic struct sockaddr *\nchoose_any(struct ResolvQuery *cb_data)\n{\n    if (cb_data->response_count >= 1) {\n        return cb_data->responses[0];\n    }\n\n    return NULL;\n}\n\n/*\n * DNS timeout callback\n */\nstatic void\nresolv_timeout_cb(struct ev_loop *loop, struct ev_timer *w, int revents)\n{\n    struct dns_ctx *ctx = (struct dns_ctx *)w->data;\n\n    if (revents & EV_TIMER) {\n        dns_timeouts(ctx, 30, ev_now(loop));\n    }\n}\n\n/*\n * Callback to setup DNS timeout callback\n */\nstatic void\ndns_timer_setup_cb(struct dns_ctx *ctx, int timeout, void *data)\n{\n    struct ev_loop *loop = (struct ev_loop *)data;\n\n    if (ev_is_active(&resolv_timeout_watcher)) {\n        ev_timer_stop(loop, &resolv_timeout_watcher);\n    }\n\n    if (ctx != NULL && timeout >= 0) {\n        ev_timer_set(&resolv_timeout_watcher, timeout, 0.0);\n        ev_timer_start(loop, &resolv_timeout_watcher);\n    }\n}\n\nstatic inline int\nall_queries_are_null(struct ResolvQuery *cb_data)\n{\n    int result = 1;\n\n    for (int i = 0; i < sizeof(cb_data->queries) / sizeof(cb_data->queries[0]);\n         i++)\n        result = result && cb_data->queries[i] == NULL;\n\n    return result;\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/resolv.h",
    "content": "/*\n * Copyright (c) 2014, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef RESOLV_H\n#define RESOLV_H\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdint.h>\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#else\n#include <sys/socket.h>\n#endif\n\nstruct ResolvQuery;\n\nint resolv_init(struct ev_loop *, char **, int, int);\nstruct ResolvQuery *resolv_query(const char *, void (*)(struct sockaddr *,\n                                                        void *), void (*)(\n                                     void *), void *, uint16_t);\nvoid resolv_cancel(struct ResolvQuery *);\nvoid resolv_shutdown(struct ev_loop *);\n\n#endif\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/rule.c",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * Copyright (c) 2011 Manuel Kasper <mk@neon1.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <string.h>\n\n#ifdef __MINGW32__\nextern void ss_error(const char *s);\n#endif\n\n#include \"rule.h\"\n#include \"utils.h\"\n\nstatic void free_rule(rule_t *);\n\nrule_t *\nnew_rule()\n{\n    rule_t *rule;\n\n    rule = calloc(1, sizeof(rule_t));\n    if (rule == NULL) {\n        ERROR(\"malloc\");\n        return NULL;\n    }\n\n    return rule;\n}\n\nint\naccept_rule_arg(rule_t *rule, const char *arg)\n{\n    if (rule->pattern == NULL) {\n        rule->pattern = strdup(arg);\n        if (rule->pattern == NULL) {\n            ERROR(\"strdup failed\");\n            return -1;\n        }\n    } else {\n        LOGE(\"Unexpected table rule argument: %s\", arg);\n        return -1;\n    }\n\n    return 1;\n}\n\nvoid\nadd_rule(struct cork_dllist *rules, rule_t *rule)\n{\n    cork_dllist_add(rules, &rule->entries);\n}\n\nint\ninit_rule(rule_t *rule)\n{\n    if (rule->pattern_re == NULL) {\n        int errornumber;\n        PCRE2_SIZE erroroffset;\n        rule->pattern_re = pcre2_compile(\n            (PCRE2_SPTR)rule->pattern,   /* the pattern */\n            PCRE2_ZERO_TERMINATED,       /* indicates pattern is zero-terminated */\n            0,                           /* default options */\n            &errornumber,                /* for error number */\n            &erroroffset,                /* for error offset */\n            NULL);                       /* use default compile context */\n\n        if (rule->pattern_re == NULL) {\n            PCRE2_UCHAR errbuffer[512];\n            pcre2_get_error_message(errornumber, errbuffer, sizeof(errbuffer));\n            LOGE(\"PCRE2 regex compilation failed at offset %d: %s\\n\", (int)erroroffset,\n                 errbuffer);\n            return 0;\n        }\n\n        rule->pattern_re_match_data = pcre2_match_data_create_from_pattern(rule->pattern_re, NULL);\n\n        if (rule->pattern_re_match_data == NULL) {\n            ERROR(\"PCRE2: the memory for the block could not be obtained\");\n            return 0;\n        }\n    }\n\n    return 1;\n}\n\nrule_t *\nlookup_rule(const struct cork_dllist *rules, const char *name, size_t name_len)\n{\n    struct cork_dllist_item *curr, *next;\n\n    if (name == NULL) {\n        name     = \"\";\n        name_len = 0;\n    }\n\n    cork_dllist_foreach_void(rules, curr, next) {\n        rule_t *rule = cork_container_of(curr, rule_t, entries);\n        if (pcre2_match(\n                rule->pattern_re,            /* the compiled pattern */\n                (PCRE2_SPTR)name,            /* the subject string */\n                name_len,                    /* the length of the subject */\n                0,                           /* start at offset 0 in the subject */\n                0,                           /* default options */\n                rule->pattern_re_match_data, /* block for storing the result */\n                NULL                         /* use default match context */\n                ) >= 0)\n            return rule;\n    }\n\n    return NULL;\n}\n\nvoid\nremove_rule(rule_t *rule)\n{\n    cork_dllist_remove(&rule->entries);\n    free_rule(rule);\n}\n\nstatic void\nfree_rule(rule_t *rule)\n{\n    if (rule == NULL)\n        return;\n\n    ss_free(rule->pattern);\n    if (rule->pattern_re != NULL) {\n        pcre2_code_free(rule->pattern_re);                    /* data and the compiled pattern. */\n        rule->pattern_re            = NULL;\n    }\n    if (rule->pattern_re_match_data != NULL) {\n        pcre2_match_data_free(rule->pattern_re_match_data);   /* Release memory used for the match */\n        rule->pattern_re_match_data = NULL;\n    }\n    ss_free(rule);\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/rule.h",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * Copyright (c) 2011 Manuel Kasper <mk@neon1.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef RULE_H\n#define RULE_H\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <libcork/ds.h>\n\n/*\n * The PCRE2_CODE_UNIT_WIDTH macro must be defined before including pcre2.h.\n * For a program that uses only one code unit width, setting it to 8, 16, or 32\n * makes it possible to use generic function names such as pcre2_compile(). Note\n * that just changing 8 to 16 (for example) is not sufficient to convert this\n * program to process 16-bit characters. Even in a fully 16-bit environment, where\n * string-handling functions such as strcmp() and printf() work with 16-bit\n * characters, the code for handling the table of named substrings will still need\n * to be modified.\n */\n/* we only need to support ASCII chartable, thus set it to 8 */\n#define PCRE2_CODE_UNIT_WIDTH 8\n\n#include <pcre2.h>\n\ntypedef struct rule {\n    char *pattern;\n\n    /* Runtime fields */\n    pcre2_code *pattern_re;\n    pcre2_match_data *pattern_re_match_data;\n\n    struct cork_dllist_item entries;\n} rule_t;\n\nvoid add_rule(struct cork_dllist *, rule_t *);\nint init_rule(rule_t *);\nrule_t *lookup_rule(const struct cork_dllist *, const char *, size_t);\nvoid remove_rule(rule_t *);\nrule_t *new_rule();\nint accept_rule_arg(rule_t *, const char *);\n\n#endif\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/server.c",
    "content": "/*\n * server.c - Provide shadowsocks service\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <fcntl.h>\n#include <locale.h>\n#include <signal.h>\n#include <string.h>\n#include <strings.h>\n#include <time.h>\n#include <unistd.h>\n#include <getopt.h>\n#include <math.h>\n\n#ifndef __MINGW32__\n#include <netdb.h>\n#include <errno.h>\n#include <arpa/inet.h>\n#include <netinet/in.h>\n#include <pthread.h>\n#include <sys/un.h>\n#endif\n\n#include <libcork/core.h>\n#include <udns.h>\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#endif\n\n#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_NET_IF_H) && defined(__linux__)\n#include <net/if.h>\n#include <sys/ioctl.h>\n#define SET_INTERFACE\n#endif\n\n#include \"netutils.h\"\n#include \"utils.h\"\n#include \"acl.h\"\n#include \"server.h\"\n\n#include \"obfs.c\" // I don't want to modify makefile\n\n#ifndef EAGAIN\n#define EAGAIN EWOULDBLOCK\n#endif\n\n#ifndef EWOULDBLOCK\n#define EWOULDBLOCK EAGAIN\n#endif\n\n#ifndef BUF_SIZE\n#define BUF_SIZE 2048\n#endif\n\n#ifndef SSMAXCONN\n#define SSMAXCONN 1024\n#endif\n\n#ifndef UPDATE_INTERVAL\n#define UPDATE_INTERVAL 30\n#endif\n\nstatic void signal_cb(EV_P_ ev_signal *w, int revents);\nstatic void accept_cb(EV_P_ ev_io *w, int revents);\nstatic void server_send_cb(EV_P_ ev_io *w, int revents);\nstatic void server_recv_cb(EV_P_ ev_io *w, int revents);\nstatic void remote_recv_cb(EV_P_ ev_io *w, int revents);\nstatic void remote_send_cb(EV_P_ ev_io *w, int revents);\nstatic void server_timeout_cb(EV_P_ ev_timer *watcher, int revents);\nstatic void block_list_clear_cb(EV_P_ ev_timer *watcher, int revents);\n\nstatic remote_t *new_remote(int fd);\nstatic server_t *new_server(int fd, listen_ctx_t *listener);\nstatic remote_t *connect_to_remote(EV_P_ struct addrinfo *res,\n                                   server_t *server);\n\nstatic void free_remote(remote_t *remote);\nstatic void close_and_free_remote(EV_P_ remote_t *remote);\nstatic void free_server(server_t *server);\nstatic void close_and_free_server(EV_P_ server_t *server);\nstatic void server_resolve_cb(struct sockaddr *addr, void *data);\nstatic void query_free_cb(void *data);\n\nstatic size_t parse_header_len(const char atyp, const char *data, size_t offset);\nstatic int is_header_complete(const buffer_t *buf);\n\nint verbose = 0;\n\nstatic int acl       = 0;\nstatic int mode      = TCP_ONLY;\nstatic int auth      = 0;\nstatic int ipv6first = 0;\n\nstatic int protocol_compatible = 0;//SSR\nstatic int obfs_compatible = 0;//SSR\n\nstatic int fast_open = 0;\n#ifdef HAVE_SETRLIMIT\nstatic int nofile = 0;\n#endif\nstatic int remote_conn = 0;\nstatic int server_conn = 0;\n\nstatic char *bind_address    = NULL;\nstatic char *server_port     = NULL;\nstatic char *manager_address = NULL;\nuint64_t tx                  = 0;\nuint64_t rx                  = 0;\nev_timer stat_update_watcher;\nev_timer block_list_watcher;\n\nstatic struct cork_dllist connections;\n\nstatic void\nstat_update_cb(EV_P_ ev_timer *watcher, int revents)\n{\n    struct sockaddr_un svaddr, claddr;\n    int sfd = -1;\n    size_t msgLen;\n    char resp[BUF_SIZE];\n\n    if (verbose) {\n        LOGI(\"update traffic stat: tx: %\" PRIu64 \" rx: %\" PRIu64 \"\", tx, rx);\n    }\n\n    snprintf(resp, BUF_SIZE, \"stat: {\\\"%s\\\":%\" PRIu64 \"}\", server_port, tx + rx);\n    msgLen = strlen(resp) + 1;\n\n    ss_addr_t ip_addr = { .host = NULL, .port = NULL };\n    parse_addr(manager_address, &ip_addr);\n\n    if (ip_addr.host == NULL || ip_addr.port == NULL) {\n        sfd = socket(AF_UNIX, SOCK_DGRAM, 0);\n        if (sfd == -1) {\n            ERROR(\"stat_socket\");\n            return;\n        }\n\n        memset(&claddr, 0, sizeof(struct sockaddr_un));\n        claddr.sun_family = AF_UNIX;\n        snprintf(claddr.sun_path, sizeof(claddr.sun_path), \"/tmp/shadowsocks.%s\", server_port);\n\n        unlink(claddr.sun_path);\n\n        if (bind(sfd, (struct sockaddr *)&claddr, sizeof(struct sockaddr_un)) == -1) {\n            ERROR(\"stat_bind\");\n            close(sfd);\n            return;\n        }\n\n        memset(&svaddr, 0, sizeof(struct sockaddr_un));\n        svaddr.sun_family = AF_UNIX;\n        strncpy(svaddr.sun_path, manager_address, sizeof(svaddr.sun_path) - 1);\n\n        if (sendto(sfd, resp, strlen(resp) + 1, 0, (struct sockaddr *)&svaddr,\n                   sizeof(struct sockaddr_un)) != msgLen) {\n            ERROR(\"stat_sendto\");\n            close(sfd);\n            return;\n        }\n\n        unlink(claddr.sun_path);\n    } else {\n        struct sockaddr_storage storage;\n        memset(&storage, 0, sizeof(struct sockaddr_storage));\n        if (get_sockaddr(ip_addr.host, ip_addr.port, &storage, 0, ipv6first) == -1) {\n            ERROR(\"failed to parse the manager addr\");\n            return;\n        }\n\n        sfd = socket(storage.ss_family, SOCK_DGRAM, 0);\n\n        if (sfd == -1) {\n            ERROR(\"stat_socket\");\n            return;\n        }\n\n        size_t addr_len = get_sockaddr_len((struct sockaddr *)&storage);\n        if (sendto(sfd, resp, strlen(resp) + 1, 0, (struct sockaddr *)&storage,\n                   addr_len) != msgLen) {\n            ERROR(\"stat_sendto\");\n            close(sfd);\n            return;\n        }\n    }\n\n    close(sfd);\n}\n\nstatic void\nfree_connections(struct ev_loop *loop)\n{\n    struct cork_dllist_item *curr, *next;\n    cork_dllist_foreach_void(&connections, curr, next) {\n        server_t *server = cork_container_of(curr, server_t, entries);\n        remote_t *remote = server->remote;\n        close_and_free_server(loop, server);\n        close_and_free_remote(loop, remote);\n    }\n}\n\nstatic size_t\nparse_header_len(const char atyp, const char *data, size_t offset)\n{\n    size_t len = 0;\n    if ((atyp & ADDRTYPE_MASK) == 1) {\n        // IP V4\n        len += sizeof(struct in_addr);\n    } else if ((atyp & ADDRTYPE_MASK) == 3) {\n        // Domain name\n        uint8_t name_len = *(uint8_t *)(data + offset);\n        len += name_len + 1;\n    } else if ((atyp & ADDRTYPE_MASK) == 4) {\n        // IP V6\n        len += sizeof(struct in6_addr);\n    } else {\n        return 0;\n    }\n    len += 2;\n    return len;\n}\n\nstatic int\nis_header_complete(const buffer_t *buf)\n{\n    size_t header_len = 0;\n    size_t buf_len    = buf->len;\n\n    char atyp = buf->array[header_len];\n\n    // 1 byte for atyp\n    header_len++;\n\n    if ((atyp & ADDRTYPE_MASK) == 1) {\n        // IP V4\n        header_len += sizeof(struct in_addr);\n    } else if ((atyp & ADDRTYPE_MASK) == 3) {\n        // Domain name\n        // domain len + len of domain\n        if (buf_len < header_len + 1)\n            return 0;\n        uint8_t name_len = *(uint8_t *)(buf->array + header_len);\n        header_len += name_len + 1;\n    } else if ((atyp & ADDRTYPE_MASK) == 4) {\n        // IP V6\n        header_len += sizeof(struct in6_addr);\n    } else {\n        return -1;\n    }\n\n    // len of port\n    header_len += 2;\n\n    // size of ONETIMEAUTH_BYTES\n    if (auth || (atyp & ONETIMEAUTH_FLAG)) {\n        header_len += ONETIMEAUTH_BYTES;\n    }\n\n    return buf_len >= header_len ? 1 : 0;\n}\n\nstatic char *\nget_peer_name(int fd)\n{\n    static char peer_name[INET6_ADDRSTRLEN] = { 0 };\n    struct sockaddr_storage addr;\n    socklen_t len = sizeof(struct sockaddr_storage);\n    memset(&addr, 0, len);\n    memset(peer_name, 0, INET6_ADDRSTRLEN);\n    int err = getpeername(fd, (struct sockaddr *)&addr, &len);\n    if (err == 0) {\n        if (addr.ss_family == AF_INET) {\n            struct sockaddr_in *s = (struct sockaddr_in *)&addr;\n            dns_ntop(AF_INET, &s->sin_addr, peer_name, INET_ADDRSTRLEN);\n        } else if (addr.ss_family == AF_INET6) {\n            struct sockaddr_in6 *s = (struct sockaddr_in6 *)&addr;\n            dns_ntop(AF_INET6, &s->sin6_addr, peer_name, INET6_ADDRSTRLEN);\n        }\n    } else {\n        return NULL;\n    }\n    return peer_name;\n}\n\n#ifdef __linux__\nstatic void\nset_linger(int fd)\n{\n    struct linger so_linger;\n    memset(&so_linger, 0, sizeof(struct linger));\n    so_linger.l_onoff  = 1;\n    so_linger.l_linger = 0;\n    setsockopt(fd, SOL_SOCKET, SO_LINGER, &so_linger, sizeof so_linger);\n}\n#endif\n\nstatic void\nreset_addr(int fd)\n{\n    char *peer_name;\n    peer_name = get_peer_name(fd);\n    if (peer_name != NULL) {\n        remove_from_block_list(peer_name);\n    }\n}\n\nstatic void\nreport_addr(int fd, int err_level)\n{\n#ifdef __linux__\n    set_linger(fd);\n#endif\n\n    char *peer_name;\n    peer_name = get_peer_name(fd);\n    if (peer_name != NULL) {\n        LOGE(\"failed to handshake with %s\", peer_name);\n        update_block_list(peer_name, err_level);\n    }\n}\n\nint\nsetfastopen(int fd)\n{\n    int s = 0;\n#ifdef TCP_FASTOPEN\n    if (fast_open) {\n#ifdef __APPLE__\n        int opt = 1;\n#else\n        int opt = 5;\n#endif\n        s = setsockopt(fd, IPPROTO_TCP, TCP_FASTOPEN, &opt, sizeof(opt));\n\n        if (s == -1) {\n            if (errno == EPROTONOSUPPORT || errno == ENOPROTOOPT) {\n                LOGE(\"fast open is not supported on this platform\");\n                fast_open = 0;\n            } else {\n                ERROR(\"setsockopt\");\n            }\n        }\n    }\n#endif\n    return s;\n}\n\n#ifndef __MINGW32__\nint\nsetnonblocking(int fd)\n{\n    int flags;\n    if (-1 == (flags = fcntl(fd, F_GETFL, 0))) {\n        flags = 0;\n    }\n    return fcntl(fd, F_SETFL, flags | O_NONBLOCK);\n}\n\n#endif\n\nint\ncreate_and_bind(const char *host, const char *port, int mptcp)\n{\n    struct addrinfo hints;\n    struct addrinfo *result, *rp, *ipv4v6bindall;\n    int s, listen_sock;\n\n    memset(&hints, 0, sizeof(struct addrinfo));\n    hints.ai_family   = AF_UNSPEC;               /* Return IPv4 and IPv6 choices */\n    hints.ai_socktype = SOCK_STREAM;             /* We want a TCP socket */\n    hints.ai_flags    = AI_PASSIVE | AI_ADDRCONFIG; /* For wildcard IP address */\n    hints.ai_protocol = IPPROTO_TCP;\n\n    for (int i = 1; i < 8; i++) {\n        s = getaddrinfo(host, port, &hints, &result);\n        if (s == 0) {\n            break;\n        } else {\n            sleep(pow(2, i));\n            LOGE(\"failed to resolve server name, wait %.0f seconds\", pow(2, i));\n        }\n    }\n\n    if (s != 0) {\n        LOGE(\"getaddrinfo: %s\", gai_strerror(s));\n        return -1;\n    }\n\n    rp = result;\n\n    /*\n     * On Linux, with net.ipv6.bindv6only = 0 (the default), getaddrinfo(NULL) with\n     * AI_PASSIVE returns 0.0.0.0 and :: (in this order). AI_PASSIVE was meant to\n     * return a list of addresses to listen on, but it is impossible to listen on\n     * 0.0.0.0 and :: at the same time, if :: implies dualstack mode.\n     */\n    if (!host) {\n        ipv4v6bindall = result;\n\n        /* Loop over all address infos found until a IPV6 address is found. */\n        while (ipv4v6bindall) {\n            if (ipv4v6bindall->ai_family == AF_INET6) {\n                rp = ipv4v6bindall; /* Take first IPV6 address available */\n                break;\n            }\n            ipv4v6bindall = ipv4v6bindall->ai_next; /* Get next address info, if any */\n        }\n    }\n\n    for (/*rp = result*/; rp != NULL; rp = rp->ai_next) {\n        listen_sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);\n        if (listen_sock == -1) {\n            continue;\n        }\n\n        if (rp->ai_family == AF_INET6) {\n            int ipv6only = host ? 1 : 0;\n            setsockopt(listen_sock, IPPROTO_IPV6, IPV6_V6ONLY, &ipv6only, sizeof(ipv6only));\n        }\n\n        int opt = 1;\n        setsockopt(listen_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));\n#ifdef SO_NOSIGPIPE\n        setsockopt(listen_sock, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n#endif\n        int err = set_reuseport(listen_sock);\n        if (err == 0) {\n            LOGI(\"tcp port reuse enabled\");\n        }\n\n        if (mptcp == 1) {\n            int err = setsockopt(listen_sock, SOL_TCP, MPTCP_ENABLED, &opt, sizeof(opt));\n            if (err == -1) {\n                ERROR(\"failed to enable multipath TCP\");\n            }\n        }\n\n        s = bind(listen_sock, rp->ai_addr, rp->ai_addrlen);\n        if (s == 0) {\n            /* We managed to bind successfully! */\n            break;\n        } else {\n            ERROR(\"bind\");\n        }\n\n        close(listen_sock);\n    }\n\n    if (rp == NULL) {\n        LOGE(\"Could not bind\");\n        return -1;\n    }\n\n    freeaddrinfo(result);\n\n    return listen_sock;\n}\n\nstatic remote_t *\nconnect_to_remote(EV_P_ struct addrinfo *res,\n                  server_t *server)\n{\n    int sockfd;\n#ifdef SET_INTERFACE\n    const char *iface = server->listen_ctx->iface;\n#endif\n\n    if (acl) {\n        char ipstr[INET6_ADDRSTRLEN];\n        memset(ipstr, 0, INET6_ADDRSTRLEN);\n\n        if (res->ai_addr->sa_family == AF_INET) {\n            struct sockaddr_in *s = (struct sockaddr_in *)res->ai_addr;\n            dns_ntop(AF_INET, &s->sin_addr, ipstr, INET_ADDRSTRLEN);\n        } else if (res->ai_addr->sa_family == AF_INET6) {\n            struct sockaddr_in6 *s = (struct sockaddr_in6 *)res->ai_addr;\n            dns_ntop(AF_INET6, &s->sin6_addr, ipstr, INET6_ADDRSTRLEN);\n        }\n\n        if (outbound_block_match_host(ipstr) == 1) {\n            if (verbose)\n                LOGI(\"outbound blocked %s\", ipstr);\n            return NULL;\n        }\n    }\n\n    // initialize remote socks\n    sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol);\n    if (sockfd == -1) {\n        ERROR(\"socket\");\n        close(sockfd);\n        return NULL;\n    }\n\n    int opt = 1;\n    setsockopt(sockfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\n#ifdef SO_NOSIGPIPE\n    setsockopt(sockfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n#endif\n    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));\n\n    // setup remote socks\n\n    if (setnonblocking(sockfd) == -1)\n        ERROR(\"setnonblocking\");\n\n    if (bind_address != NULL)\n        if (bind_to_address(sockfd, bind_address) == -1) {\n            ERROR(\"bind_to_address\");\n            close(sockfd);\n            return NULL;\n        }\n\n#ifdef SET_INTERFACE\n    if (iface) {\n        if (setinterface(sockfd, iface) == -1) {\n            ERROR(\"setinterface\");\n            close(sockfd);\n            return NULL;\n        }\n    }\n#endif\n\n    remote_t *remote = new_remote(sockfd);\n\n#ifdef TCP_FASTOPEN\n    if (fast_open) {\n#ifdef __APPLE__\n        ((struct sockaddr_in *)(res->ai_addr))->sin_len = sizeof(struct sockaddr_in);\n        sa_endpoints_t endpoints;\n        memset((char *)&endpoints, 0, sizeof(endpoints));\n        endpoints.sae_dstaddr    = res->ai_addr;\n        endpoints.sae_dstaddrlen = res->ai_addrlen;\n\n        struct iovec iov;\n        iov.iov_base = server->buf->array + server->buf->idx;\n        iov.iov_len  = server->buf->len;\n        size_t len;\n        int s = connectx(sockfd, &endpoints, SAE_ASSOCID_ANY, CONNECT_DATA_IDEMPOTENT,\n                         &iov, 1, &len, NULL);\n        if (s == 0) {\n            s = len;\n        }\n#else\n        ssize_t s = sendto(sockfd, server->buf->array + server->buf->idx,\n                           server->buf->len, MSG_FASTOPEN, res->ai_addr,\n                           res->ai_addrlen);\n#endif\n        if (s == -1) {\n            if (errno == CONNECT_IN_PROGRESS || errno == EAGAIN\n                || errno == EWOULDBLOCK) {\n                // The remote server doesn't support tfo or it's the first connection to the server.\n                // It will automatically fall back to conventional TCP.\n            } else if (errno == EOPNOTSUPP || errno == EPROTONOSUPPORT ||\n                       errno == ENOPROTOOPT) {\n                // Disable fast open as it's not supported\n                fast_open = 0;\n                LOGE(\"fast open is not supported on this platform\");\n            } else {\n                ERROR(\"sendto\");\n            }\n        } else if (s <= server->buf->len) {\n            server->buf->idx += s;\n            server->buf->len -= s;\n        } else {\n            server->buf->idx = 0;\n            server->buf->len = 0;\n        }\n    }\n#endif\n\n    if (!fast_open) {\n        int r = connect(sockfd, res->ai_addr, res->ai_addrlen);\n\n        if (r == -1 && errno != CONNECT_IN_PROGRESS) {\n            ERROR(\"connect\");\n            close_and_free_remote(EV_A_ remote);\n            return NULL;\n        }\n    }\n\n    return remote;\n}\n\nstatic void\nserver_recv_cb(EV_P_ ev_io *w, int revents)\n{\n    server_ctx_t *server_recv_ctx = (server_ctx_t *)w;\n    server_t *server              = server_recv_ctx->server;\n    remote_t *remote              = NULL;\n\n    int len       = server->buf->len;\n    buffer_t *buf = server->buf;\n\n    if (server->stage > STAGE_PARSE) {\n        remote = server->remote;\n        buf    = remote->buf;\n        len    = 0;\n\n        ev_timer_again(EV_A_ & server->recv_ctx->watcher);\n    }\n\n    if (len > BUF_SIZE) {\n        ERROR(\"out of recv buffer\");\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    ssize_t r = recv(server->fd, buf->array + len, BUF_SIZE - len, 0);\n\n    if (r == 0) {\n        // connection closed\n        if (verbose) {\n            LOGI(\"server_recv close the connection\");\n        }\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else if (r == -1) {\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n            // no data\n            // continue to wait for recv\n            return;\n        } else {\n            ERROR(\"server recv\");\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    }\n\n    tx += r;\n\n    if (server->stage == STAGE_ERROR) {\n        server->buf->len = 0;\n        server->buf->idx = 0;\n        return;\n    }\n\n    // handle incomplete header part 1\n    if (server->stage == STAGE_INIT) {\n        buf->len += r;\n        if (buf->len <= enc_get_iv_len() + 1) {\n            // wait for more\n            return;\n        }\n    } else {\n        buf->len = r;\n    }\n\n    // SSR beg\n\n    if (server->obfs_plugin) {\n        obfs_class *obfs_plugin = server->obfs_plugin;\n        if (obfs_plugin->server_decode) {\n            int needsendback = 0;\n\n            if(obfs_compatible == 1)\n            {\n                char *back_buf = (char*)malloc(sizeof(buffer_t));\n                memcpy(back_buf, buf, sizeof(buffer_t));\n                buf->len = obfs_plugin->server_decode(server->obfs, &buf->array, buf->len, &buf->capacity, &needsendback);\n\n                if ((int)buf->len < 0)\n                {\n                    LOGE(\"obfs_compatible\");\n                    memcpy(buf, back_buf, sizeof(buffer_t));\n                    free(back_buf);\n                    server->obfs_compatible_state = 1;\n                }\n            }\n            else\n            {\n                buf->len = obfs_plugin->server_decode(server->obfs, &buf->array, buf->len, &buf->capacity, &needsendback);\n                if ((int)buf->len < 0) {\n                    LOGE(\"server_decode\");\n                    close_and_free_remote(EV_A_ remote);\n                    close_and_free_server(EV_A_ server);\n                    return;\n                }\n            }\n\n            if (needsendback) {\n                size_t capacity = BUF_SIZE;\n                char *sendback_buf = (char*)malloc(capacity);\n                obfs_class *obfs_plugin = server->obfs_plugin;\n                if (obfs_plugin->server_encode) {\n                    int len = obfs_plugin->server_encode(server->obfs, &sendback_buf, 0, &capacity);\n                    send(server->fd, sendback_buf, len, 0);\n                }\n                free(sendback_buf);\n                return;\n            }\n        }\n    }\n\n    int err = ss_decrypt(buf, server->d_ctx, BUF_SIZE);\n\n    if (err) {\n        report_addr(server->fd, MALICIOUS);\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    if (server->protocol_plugin) {\n        obfs_class *protocol_plugin = server->protocol_plugin;\n        if (protocol_plugin->server_post_decrypt) {\n\n            if(protocol_compatible == 1)\n            {\n                char *back_buf = (char*)malloc(sizeof(buffer_t));\n                memcpy(back_buf, buf, sizeof(buffer_t));\n                buf->len = protocol_plugin->server_post_decrypt(server->protocol, &buf->array, buf->len, &buf->capacity);\n\n                if ((int)buf->len < 0) {\n                    LOGE(\"protocol_compatible\");\n                    memcpy(buf, back_buf, sizeof(buffer_t));\n                    free(back_buf);\n                    server->protocol_compatible_state = 1;\n                }\n                if ( buf->len == 0 )\n                {\n                    LOGE(\"protocol_compatible\");\n                    memcpy(buf, back_buf, sizeof(buffer_t));\n                    free(back_buf);\n                    server->protocol_compatible_state = 1;\n                }\n            }\n            else\n            {\n                buf->len = protocol_plugin->server_post_decrypt(server->protocol, &buf->array, buf->len, &buf->capacity);\n                if ((int)buf->len < 0) {\n                    LOGE(\"server_post_decrypt\");\n                    close_and_free_remote(EV_A_ remote);\n                    close_and_free_server(EV_A_ server);\n                    return;\n                }\n                if ( buf->len == 0 )\n                {\n                    LOGE(\"server_post_decrypt\");\n                    return;\n                }\n            }\n        }\n    }\n    // SSR end\n\n    // handle incomplete header part 2\n    if (server->stage == STAGE_INIT) {\n        int ret = is_header_complete(server->buf);\n        if (ret == 1) {\n            bfree(server->header_buf);\n            ss_free(server->header_buf);\n            server->stage = STAGE_PARSE;\n        } else if (ret == -1) {\n            server->stage = STAGE_ERROR;\n            report_addr(server->fd, MALFORMED);\n            server->buf->len = 0;\n            server->buf->idx = 0;\n            return;\n        } else {\n            server->stage = STAGE_HANDSHAKE;\n        }\n    }\n\n    if (server->stage == STAGE_HANDSHAKE) {\n        size_t header_len = server->header_buf->len;\n        brealloc(server->header_buf, server->buf->len + header_len, BUF_SIZE);\n        memcpy(server->header_buf->array + header_len,\n               server->buf->array, server->buf->len);\n        server->header_buf->len = server->buf->len + header_len;\n\n        int ret = is_header_complete(server->buf);\n\n        if (ret == 1) {\n            brealloc(server->buf, server->header_buf->len, BUF_SIZE);\n            memcpy(server->buf->array, server->header_buf->array, server->header_buf->len);\n            server->buf->len = server->header_buf->len;\n            bfree(server->header_buf);\n            ss_free(server->header_buf);\n            server->stage = STAGE_PARSE;\n        } else {\n            if (ret == -1)\n                server->stage = STAGE_ERROR;\n            server->buf->len = 0;\n            server->buf->idx = 0;\n            return;\n        }\n    }\n\n    // handshake and transmit data\n    if (server->stage == STAGE_STREAM) {\n        if (server->auth && !ss_check_hash(remote->buf, server->chunk, server->d_ctx, BUF_SIZE)) {\n            LOGE(\"hash error\");\n            report_addr(server->fd, BAD);\n            close_and_free_server(EV_A_ server);\n            close_and_free_remote(EV_A_ remote);\n            return;\n        }\n\n        int s = send(remote->fd, remote->buf->array, remote->buf->len, 0);\n        if (s == -1) {\n            if (errno == EAGAIN || errno == EWOULDBLOCK) {\n                // no data, wait for send\n                remote->buf->idx = 0;\n                ev_io_stop(EV_A_ & server_recv_ctx->io);\n                ev_io_start(EV_A_ & remote->send_ctx->io);\n            } else {\n                ERROR(\"server_recv_send\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n            }\n        } else if (s < remote->buf->len) {\n            remote->buf->len -= s;\n            remote->buf->idx  = s;\n            ev_io_stop(EV_A_ & server_recv_ctx->io);\n            ev_io_start(EV_A_ & remote->send_ctx->io);\n        }\n        return;\n    } else if (server->stage == STAGE_PARSE) {\n        /*\n         * Shadowsocks TCP Relay Header:\n         *\n         *    +------+----------+----------+----------------+\n         *    | ATYP | DST.ADDR | DST.PORT |    HMAC-SHA1   |\n         *    +------+----------+----------+----------------+\n         *    |  1   | Variable |    2     |      10        |\n         *    +------+----------+----------+----------------+\n         *\n         *    If ATYP & ONETIMEAUTH_FLAG(0x10) != 0, Authentication (HMAC-SHA1) is enabled.\n         *\n         *    The key of HMAC-SHA1 is (IV + KEY) and the input is the whole header.\n         *    The output of HMAC-SHA is truncated to 10 bytes (leftmost bits).\n         */\n\n        /*\n         * Shadowsocks Request's Chunk Authentication for TCP Relay's payload\n         * (No chunk authentication for response's payload):\n         *\n         *    +------+-----------+-------------+------+\n         *    | LEN  | HMAC-SHA1 |    DATA     |      ...\n         *    +------+-----------+-------------+------+\n         *    |  2   |    10     |  Variable   |      ...\n         *    +------+-----------+-------------+------+\n         *\n         *    The key of HMAC-SHA1 is (IV + CHUNK ID)\n         *    The output of HMAC-SHA is truncated to 10 bytes (leftmost bits).\n         */\n\n        int offset     = 0;\n        int need_query = 0;\n        char atyp      = server->buf->array[offset++];\n        char host[257] = { 0 };\n        uint16_t port  = 0;\n        struct addrinfo info;\n        struct sockaddr_storage storage;\n        memset(&info, 0, sizeof(struct addrinfo));\n        memset(&storage, 0, sizeof(struct sockaddr_storage));\n\n        if (auth || (atyp & ONETIMEAUTH_FLAG)) {\n            size_t header_len = parse_header_len(atyp, server->buf->array, offset);\n            size_t len        = server->buf->len;\n\n            if (header_len == 0 || len < offset + header_len + ONETIMEAUTH_BYTES) {\n                report_addr(server->fd, MALFORMED);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n\n            server->buf->len = offset + header_len + ONETIMEAUTH_BYTES;\n            if (ss_onetimeauth_verify(server->buf, server->d_ctx->evp.iv)) {\n                report_addr(server->fd, BAD);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n\n            server->buf->len = len;\n            server->auth     = 1;\n        }\n\n        // get remote addr and port\n        if ((atyp & ADDRTYPE_MASK) == 1) {\n            // IP V4\n            struct sockaddr_in *addr = (struct sockaddr_in *)&storage;\n            size_t in_addr_len       = sizeof(struct in_addr);\n            addr->sin_family = AF_INET;\n            if (server->buf->len >= in_addr_len + 3) {\n                addr->sin_addr = *(struct in_addr *)(server->buf->array + offset);\n                dns_ntop(AF_INET, (const void *)(server->buf->array + offset),\n                         host, INET_ADDRSTRLEN);\n                offset += in_addr_len;\n            } else {\n                LOGE(\"invalid header with addr type %d\", atyp);\n                report_addr(server->fd, MALFORMED);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n            addr->sin_port   = *(uint16_t *)(server->buf->array + offset);\n            info.ai_family   = AF_INET;\n            info.ai_socktype = SOCK_STREAM;\n            info.ai_protocol = IPPROTO_TCP;\n            info.ai_addrlen  = sizeof(struct sockaddr_in);\n            info.ai_addr     = (struct sockaddr *)addr;\n        } else if ((atyp & ADDRTYPE_MASK) == 3) {\n            // Domain name\n            uint8_t name_len = *(uint8_t *)(server->buf->array + offset);\n            if (name_len + 4 <= server->buf->len) {\n                memcpy(host, server->buf->array + offset + 1, name_len);\n                offset += name_len + 1;\n            } else {\n                LOGE(\"invalid name length: %d\", name_len);\n                report_addr(server->fd, MALFORMED);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n            if (acl && outbound_block_match_host(host) == 1) {\n                if (verbose)\n                    LOGI(\"outbound blocked %s\", host);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n            struct cork_ip ip;\n            if (cork_ip_init(&ip, host) != -1) {\n                info.ai_socktype = SOCK_STREAM;\n                info.ai_protocol = IPPROTO_TCP;\n                if (ip.version == 4) {\n                    struct sockaddr_in *addr = (struct sockaddr_in *)&storage;\n                    dns_pton(AF_INET, host, &(addr->sin_addr));\n                    addr->sin_port   = *(uint16_t *)(server->buf->array + offset);\n                    addr->sin_family = AF_INET;\n                    info.ai_family   = AF_INET;\n                    info.ai_addrlen  = sizeof(struct sockaddr_in);\n                    info.ai_addr     = (struct sockaddr *)addr;\n                } else if (ip.version == 6) {\n                    struct sockaddr_in6 *addr = (struct sockaddr_in6 *)&storage;\n                    dns_pton(AF_INET6, host, &(addr->sin6_addr));\n                    addr->sin6_port   = *(uint16_t *)(server->buf->array + offset);\n                    addr->sin6_family = AF_INET6;\n                    info.ai_family    = AF_INET6;\n                    info.ai_addrlen   = sizeof(struct sockaddr_in6);\n                    info.ai_addr      = (struct sockaddr *)addr;\n                }\n            } else {\n                if (!validate_hostname(host, name_len)) {\n                    LOGE(\"invalid host name\");\n                    report_addr(server->fd, MALFORMED);\n                    close_and_free_server(EV_A_ server);\n                    return;\n                }\n                need_query = 1;\n            }\n        } else if ((atyp & ADDRTYPE_MASK) == 4) {\n            // IP V6\n            struct sockaddr_in6 *addr = (struct sockaddr_in6 *)&storage;\n            size_t in6_addr_len       = sizeof(struct in6_addr);\n            addr->sin6_family = AF_INET6;\n            if (server->buf->len >= in6_addr_len + 3) {\n                addr->sin6_addr = *(struct in6_addr *)(server->buf->array + offset);\n                dns_ntop(AF_INET6, (const void *)(server->buf->array + offset),\n                         host, INET6_ADDRSTRLEN);\n                offset += in6_addr_len;\n            } else {\n                LOGE(\"invalid header with addr type %d\", atyp);\n                report_addr(server->fd, MALFORMED);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n            addr->sin6_port  = *(uint16_t *)(server->buf->array + offset);\n            info.ai_family   = AF_INET6;\n            info.ai_socktype = SOCK_STREAM;\n            info.ai_protocol = IPPROTO_TCP;\n            info.ai_addrlen  = sizeof(struct sockaddr_in6);\n            info.ai_addr     = (struct sockaddr *)addr;\n        }\n\n        if (offset == 1) {\n            LOGE(\"invalid header with addr type %d\", atyp);\n            report_addr(server->fd, MALFORMED);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n\n        port = (*(uint16_t *)(server->buf->array + offset));\n\n        offset += 2;\n\n        if (server->auth) {\n            offset += ONETIMEAUTH_BYTES;\n        }\n\n        if (server->buf->len < offset) {\n            report_addr(server->fd, MALFORMED);\n            close_and_free_server(EV_A_ server);\n            return;\n        } else {\n            server->buf->len -= offset;\n            memmove(server->buf->array, server->buf->array + offset, server->buf->len);\n        }\n\n        if (verbose) {\n            if ((atyp & ADDRTYPE_MASK) == 4)\n                LOGI(\"connect to [%s]:%d\", host, ntohs(port));\n            else\n                LOGI(\"connect to %s:%d\", host, ntohs(port));\n        }\n\n        if (server->auth && !ss_check_hash(server->buf, server->chunk, server->d_ctx, BUF_SIZE)) {\n            LOGE(\"hash error\");\n            report_addr(server->fd, BAD);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n\n\n        if (!need_query) {\n            remote_t *remote = connect_to_remote(EV_A_ &info, server);\n\n            if (remote == NULL) {\n                LOGE(\"connect error\");\n                close_and_free_server(EV_A_ server);\n                return;\n            } else {\n                server->remote = remote;\n                remote->server = server;\n\n                // XXX: should handle buffer carefully\n                if (server->buf->len > 0) {\n                    memcpy(remote->buf->array, server->buf->array, server->buf->len);\n                    remote->buf->len = server->buf->len;\n                    remote->buf->idx = 0;\n                    server->buf->len = 0;\n                    server->buf->idx = 0;\n                }\n\n                // waiting on remote connected event\n                ev_io_stop(EV_A_ & server_recv_ctx->io);\n                ev_io_start(EV_A_ & remote->send_ctx->io);\n            }\n        } else {\n            query_t *query = (query_t *)ss_malloc(sizeof(query_t));\n            query->server = server;\n            snprintf(query->hostname, 256, \"%s\", host);\n\n            server->stage = STAGE_RESOLVE;\n            server->query = resolv_query(host, server_resolve_cb,\n                                         query_free_cb, query, port);\n\n            ev_io_stop(EV_A_ & server_recv_ctx->io);\n        }\n\n        return;\n    }\n    // should not reach here\n    FATAL(\"server context error\");\n}\n\nstatic void\nserver_send_cb(EV_P_ ev_io *w, int revents)\n{\n    server_ctx_t *server_send_ctx = (server_ctx_t *)w;\n    server_t *server              = server_send_ctx->server;\n    remote_t *remote              = server->remote;\n\n    if (remote == NULL) {\n        LOGE(\"invalid server\");\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    if (server->buf->len == 0) {\n        // close and free\n        if (verbose) {\n            LOGI(\"server_send close the connection\");\n        }\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else {\n        // has data to send\n        ssize_t s = send(server->fd, server->buf->array + server->buf->idx,\n                         server->buf->len, 0);\n        if (s == -1) {\n            if (errno != EAGAIN && errno != EWOULDBLOCK) {\n                ERROR(\"server_send_send\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n            }\n            return;\n        } else if (s < server->buf->len) {\n            // partly sent, move memory, wait for the next time to send\n            server->buf->len -= s;\n            server->buf->idx += s;\n            return;\n        } else {\n            // all sent out, wait for reading\n            server->buf->len = 0;\n            server->buf->idx = 0;\n            ev_io_stop(EV_A_ & server_send_ctx->io);\n            if (remote != NULL) {\n                ev_io_start(EV_A_ & remote->recv_ctx->io);\n                return;\n            } else {\n                LOGE(\"invalid remote\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n                return;\n            }\n        }\n    }\n}\n\nstatic void\nblock_list_clear_cb(EV_P_ ev_timer *watcher, int revents)\n{\n    clear_block_list();\n}\n\nstatic void\nserver_timeout_cb(EV_P_ ev_timer *watcher, int revents)\n{\n    server_ctx_t *server_ctx\n        = cork_container_of(watcher, server_ctx_t, watcher);\n    server_t *server = server_ctx->server;\n    remote_t *remote = server->remote;\n\n    if (verbose) {\n        LOGI(\"TCP connection timeout\");\n    }\n\n    if (server->stage < STAGE_PARSE) {\n        if (verbose) {\n            size_t len = server->stage ?\n                         server->header_buf->len : server->buf->len;\n#ifdef __MINGW32__\n            LOGI(\"incomplete header: %u\", len);\n#else\n            LOGI(\"incomplete header: %zu\", len);\n#endif\n        }\n        report_addr(server->fd, SUSPICIOUS);\n    }\n\n    close_and_free_remote(EV_A_ remote);\n    close_and_free_server(EV_A_ server);\n}\n\nstatic void\nquery_free_cb(void *data)\n{\n    if (data != NULL) {\n        ss_free(data);\n    }\n}\n\nstatic void\nserver_resolve_cb(struct sockaddr *addr, void *data)\n{\n    query_t *query       = (query_t *)data;\n    server_t *server     = query->server;\n    struct ev_loop *loop = server->listen_ctx->loop;\n\n    server->query = NULL;\n\n    if (addr == NULL) {\n        LOGE(\"unable to resolve %s\", query->hostname);\n        close_and_free_server(EV_A_ server);\n    } else {\n        if (verbose) {\n            LOGI(\"successfully resolved %s\", query->hostname);\n        }\n\n        struct addrinfo info;\n        memset(&info, 0, sizeof(struct addrinfo));\n        info.ai_socktype = SOCK_STREAM;\n        info.ai_protocol = IPPROTO_TCP;\n        info.ai_addr     = addr;\n\n        if (addr->sa_family == AF_INET) {\n            info.ai_family  = AF_INET;\n            info.ai_addrlen = sizeof(struct sockaddr_in);\n        } else if (addr->sa_family == AF_INET6) {\n            info.ai_family  = AF_INET6;\n            info.ai_addrlen = sizeof(struct sockaddr_in6);\n        }\n\n        remote_t *remote = connect_to_remote(EV_A_ &info, server);\n\n        if (remote == NULL) {\n            close_and_free_server(EV_A_ server);\n        } else {\n            server->remote = remote;\n            remote->server = server;\n\n            // XXX: should handle buffer carefully\n            if (server->buf->len > 0) {\n                memcpy(remote->buf->array, server->buf->array + server->buf->idx,\n                       server->buf->len);\n                remote->buf->len = server->buf->len;\n                remote->buf->idx = 0;\n                server->buf->len = 0;\n                server->buf->idx = 0;\n            }\n\n            // listen to remote connected event\n            ev_io_start(EV_A_ & remote->send_ctx->io);\n        }\n    }\n}\n\nstatic void\nremote_recv_cb(EV_P_ ev_io *w, int revents)\n{\n    remote_ctx_t *remote_recv_ctx = (remote_ctx_t *)w;\n    remote_t *remote              = remote_recv_ctx->remote;\n    server_t *server              = remote->server;\n\n    if (server == NULL) {\n        LOGE(\"invalid server\");\n        close_and_free_remote(EV_A_ remote);\n        return;\n    }\n\n    ev_timer_again(EV_A_ & server->recv_ctx->watcher);\n\n    ssize_t r = recv(remote->fd, server->buf->array, BUF_SIZE, 0);\n\n    if (r == 0) {\n        // connection closed\n        if (verbose) {\n            LOGI(\"remote_recv close the connection\");\n        }\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else if (r == -1) {\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n            // no data\n            // continue to wait for recv\n            return;\n        } else {\n            ERROR(\"remote recv\");\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    }\n\n    rx += r;\n\n    server->buf->len = r;\n\n    // SSR beg\n    server_info _server_info;\n    if (server->obfs_plugin) {\n        server->obfs_plugin->get_server_info(server->obfs, &_server_info);\n        _server_info.head_len = get_head_size(server->buf->array, server->buf->len, 30);\n        server->obfs_plugin->set_server_info(server->obfs, &_server_info);\n    }\n\n    if (server->protocol_plugin && server->obfs_compatible_state == 0) {\n        obfs_class *protocol_plugin = server->protocol_plugin;\n        if (protocol_plugin->server_pre_encrypt) {\n            server->buf->len = protocol_plugin->server_pre_encrypt(server->protocol, &server->buf->array, server->buf->len, &server->buf->capacity);\n        }\n    }\n\n    int err = ss_encrypt(server->buf, server->e_ctx, BUF_SIZE);\n\n    if (err) {\n        LOGE(\"invalid password or cipher\");\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    }\n\n    if (server->obfs_plugin && server->obfs_compatible_state == 0) {\n        obfs_class *obfs_plugin = server->obfs_plugin;\n        if (obfs_plugin->server_encode) {\n            server->buf->len = obfs_plugin->server_encode(server->obfs, &server->buf->array, server->buf->len, &server->buf->capacity);\n        }\n    }\n    // SSR end\n\n    int s = send(server->fd, server->buf->array, server->buf->len, 0);\n\n    if (s == -1) {\n        if (errno == EAGAIN || errno == EWOULDBLOCK) {\n            // no data, wait for send\n            server->buf->idx = 0;\n            ev_io_stop(EV_A_ & remote_recv_ctx->io);\n            ev_io_start(EV_A_ & server->send_ctx->io);\n        } else {\n            ERROR(\"remote_recv_send\");\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    } else if (s < server->buf->len) {\n        server->buf->len -= s;\n        server->buf->idx  = s;\n        ev_io_stop(EV_A_ & remote_recv_ctx->io);\n        ev_io_start(EV_A_ & server->send_ctx->io);\n    }\n\n    // Disable TCP_NODELAY after the first response are sent\n    if (!remote->recv_ctx->connected) {\n        int opt = 0;\n        setsockopt(server->fd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\n        setsockopt(remote->fd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\n        remote->recv_ctx->connected = 1;\n    }\n}\n\nstatic void\nremote_send_cb(EV_P_ ev_io *w, int revents)\n{\n    remote_ctx_t *remote_send_ctx = (remote_ctx_t *)w;\n    remote_t *remote              = remote_send_ctx->remote;\n    server_t *server              = remote->server;\n\n    if (server == NULL) {\n        LOGE(\"invalid server\");\n        close_and_free_remote(EV_A_ remote);\n        return;\n    }\n\n    if (!remote_send_ctx->connected) {\n        struct sockaddr_storage addr;\n        socklen_t len = sizeof(struct sockaddr_storage);\n        memset(&addr, 0, len);\n        int r = getpeername(remote->fd, (struct sockaddr *)&addr, &len);\n        if (r == 0) {\n            if (verbose) {\n                LOGI(\"remote connected\");\n            }\n            remote_send_ctx->connected = 1;\n\n            // Clear the state of this address in the block list\n            reset_addr(server->fd);\n\n            if (remote->buf->len == 0) {\n                server->stage = STAGE_STREAM;\n                ev_io_stop(EV_A_ & remote_send_ctx->io);\n                ev_io_start(EV_A_ & server->recv_ctx->io);\n                ev_io_start(EV_A_ & remote->recv_ctx->io);\n                return;\n            }\n        } else {\n            ERROR(\"getpeername\");\n            // not connected\n            close_and_free_remote(EV_A_ remote);\n            close_and_free_server(EV_A_ server);\n            return;\n        }\n    }\n\n    if (remote->buf->len == 0) {\n        // close and free\n        if (verbose) {\n            LOGI(\"remote_send close the connection\");\n        }\n        close_and_free_remote(EV_A_ remote);\n        close_and_free_server(EV_A_ server);\n        return;\n    } else {\n        // has data to send\n        ssize_t s = send(remote->fd, remote->buf->array + remote->buf->idx,\n                         remote->buf->len, 0);\n        if (s == -1) {\n            if (errno != EAGAIN && errno != EWOULDBLOCK) {\n                ERROR(\"remote_send_send\");\n                // close and free\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n            }\n            return;\n        } else if (s < remote->buf->len) {\n            // partly sent, move memory, wait for the next time to send\n            remote->buf->len -= s;\n            remote->buf->idx += s;\n            return;\n        } else {\n            // all sent out, wait for reading\n            remote->buf->len = 0;\n            remote->buf->idx = 0;\n            ev_io_stop(EV_A_ & remote_send_ctx->io);\n            if (server != NULL) {\n                ev_io_start(EV_A_ & server->recv_ctx->io);\n                if (server->stage != STAGE_STREAM) {\n                    server->stage = STAGE_STREAM;\n                    ev_io_start(EV_A_ & remote->recv_ctx->io);\n                }\n            } else {\n                LOGE(\"invalid server\");\n                close_and_free_remote(EV_A_ remote);\n                close_and_free_server(EV_A_ server);\n            }\n            return;\n        }\n    }\n}\n\nstatic remote_t *\nnew_remote(int fd)\n{\n    if (verbose) {\n        remote_conn++;\n    }\n\n    remote_t *remote;\n\n    remote                      = ss_malloc(sizeof(remote_t));\n    remote->recv_ctx            = ss_malloc(sizeof(remote_ctx_t));\n    remote->send_ctx            = ss_malloc(sizeof(remote_ctx_t));\n    remote->buf                 = ss_malloc(sizeof(buffer_t));\n    remote->fd                  = fd;\n    remote->recv_ctx->remote    = remote;\n    remote->recv_ctx->connected = 0;\n    remote->send_ctx->remote    = remote;\n    remote->send_ctx->connected = 0;\n    remote->server              = NULL;\n\n    ev_io_init(&remote->recv_ctx->io, remote_recv_cb, fd, EV_READ);\n    ev_io_init(&remote->send_ctx->io, remote_send_cb, fd, EV_WRITE);\n\n    balloc(remote->buf, BUF_SIZE);\n\n    return remote;\n}\n\nstatic void\nfree_remote(remote_t *remote)\n{\n    if (remote->server != NULL) {\n        remote->server->remote = NULL;\n    }\n    if (remote->buf != NULL) {\n        bfree(remote->buf);\n        ss_free(remote->buf);\n    }\n    ss_free(remote->recv_ctx);\n    ss_free(remote->send_ctx);\n    ss_free(remote);\n}\n\nstatic void\nclose_and_free_remote(EV_P_ remote_t *remote)\n{\n    if (remote != NULL) {\n        ev_io_stop(EV_A_ & remote->send_ctx->io);\n        ev_io_stop(EV_A_ & remote->recv_ctx->io);\n        close(remote->fd);\n        free_remote(remote);\n        if (verbose) {\n            remote_conn--;\n            LOGI(\"current remote connection: %d\", remote_conn);\n        }\n    }\n}\n\nstatic server_t *\nnew_server(int fd, listen_ctx_t *listener)\n{\n    if (verbose) {\n        server_conn++;\n    }\n\n    server_t *server;\n    server = ss_malloc(sizeof(server_t));\n\n    memset(server, 0, sizeof(server_t));\n\n    server->recv_ctx            = ss_malloc(sizeof(server_ctx_t));\n    server->send_ctx            = ss_malloc(sizeof(server_ctx_t));\n    server->buf                 = ss_malloc(sizeof(buffer_t));\n    server->header_buf          = ss_malloc(sizeof(buffer_t));\n    server->fd                  = fd;\n    server->recv_ctx->server    = server;\n    server->recv_ctx->connected = 0;\n    server->send_ctx->server    = server;\n    server->send_ctx->connected = 0;\n    server->stage               = STAGE_INIT;\n    server->query               = NULL;\n    server->listen_ctx          = listener;\n    server->remote              = NULL;\n\n    if (listener->method) {\n        server->e_ctx = ss_malloc(sizeof(enc_ctx_t));\n        server->d_ctx = ss_malloc(sizeof(enc_ctx_t));\n        enc_ctx_init(listener->method, server->e_ctx, 1);\n        enc_ctx_init(listener->method, server->d_ctx, 0);\n    } else {\n        server->e_ctx = NULL;\n        server->d_ctx = NULL;\n    }\n\n    int request_timeout = min(MAX_REQUEST_TIMEOUT, listener->timeout)\n                          + rand() % MAX_REQUEST_TIMEOUT;\n\n    ev_io_init(&server->recv_ctx->io, server_recv_cb, fd, EV_READ);\n    ev_io_init(&server->send_ctx->io, server_send_cb, fd, EV_WRITE);\n    ev_timer_init(&server->recv_ctx->watcher, server_timeout_cb,\n                  request_timeout, listener->timeout);\n\n    balloc(server->buf, BUF_SIZE);\n    balloc(server->header_buf, BUF_SIZE);\n\n    server->chunk = (chunk_t *)malloc(sizeof(chunk_t));\n    memset(server->chunk, 0, sizeof(chunk_t));\n    server->chunk->buf = ss_malloc(sizeof(buffer_t));\n    memset(server->chunk->buf, 0, sizeof(buffer_t));\n\n    cork_dllist_add(&connections, &server->entries);\n\n    return server;\n}\n\nstatic void\nfree_server(server_t *server)\n{\n    cork_dllist_remove(&server->entries);\n\n    if (server->chunk != NULL) {\n        if (server->chunk->buf != NULL) {\n            bfree(server->chunk->buf);\n            ss_free(server->chunk->buf);\n        }\n        ss_free(server->chunk);\n    }\n    if (server->remote != NULL) {\n        server->remote->server = NULL;\n    }\n    if (server->e_ctx != NULL) {\n        cipher_context_release(&server->e_ctx->evp);\n        ss_free(server->e_ctx);\n    }\n    if (server->d_ctx != NULL) {\n        cipher_context_release(&server->d_ctx->evp);\n        ss_free(server->d_ctx);\n    }\n    if (server->buf != NULL) {\n        bfree(server->buf);\n        ss_free(server->buf);\n    }\n    if (server->header_buf != NULL) {\n        bfree(server->header_buf);\n        ss_free(server->header_buf);\n    }\n\n    ss_free(server->recv_ctx);\n    ss_free(server->send_ctx);\n    ss_free(server);\n}\n\nstatic void\nclose_and_free_server(EV_P_ server_t *server)\n{\n    if (server != NULL) {\n        if (server->query != NULL) {\n            resolv_cancel(server->query);\n            server->query = NULL;\n        }\n        ev_io_stop(EV_A_ & server->send_ctx->io);\n        ev_io_stop(EV_A_ & server->recv_ctx->io);\n        ev_timer_stop(EV_A_ & server->recv_ctx->watcher);\n        close(server->fd);\n        free_server(server);\n        if (verbose) {\n            server_conn--;\n            LOGI(\"current server connection: %d\", server_conn);\n        }\n    }\n}\n\nstatic void\nsignal_cb(EV_P_ ev_signal *w, int revents)\n{\n    if (revents & EV_SIGNAL) {\n        switch (w->signum) {\n        case SIGINT:\n        case SIGTERM:\n            ev_unloop(EV_A_ EVUNLOOP_ALL);\n        }\n    }\n}\n\nstatic void\naccept_cb(EV_P_ ev_io *w, int revents)\n{\n    listen_ctx_t *listener = (listen_ctx_t *)w;\n    int serverfd           = accept(listener->fd, NULL, NULL);\n    if (serverfd == -1) {\n        ERROR(\"accept\");\n        return;\n    }\n\n    char *peer_name = get_peer_name(serverfd);\n    if (peer_name != NULL) {\n        int in_white_list = 0;\n        if (acl) {\n            if ((get_acl_mode() == BLACK_LIST && acl_match_host(peer_name) == 1)\n                || (get_acl_mode() == WHITE_LIST && acl_match_host(peer_name) >= 0)) {\n                LOGE(\"Access denied from %s\", peer_name);\n                close(serverfd);\n                return;\n            } else if (acl_match_host(peer_name) == -1) {\n                in_white_list = 1;\n            }\n        }\n        if (!in_white_list && check_block_list(peer_name)) {\n            LOGE(\"block all requests from %s\", peer_name);\n#ifdef __linux__\n            set_linger(serverfd);\n#endif\n            close(serverfd);\n            return;\n        }\n    }\n\n    int opt = 1;\n    setsockopt(serverfd, SOL_TCP, TCP_NODELAY, &opt, sizeof(opt));\n#ifdef SO_NOSIGPIPE\n    setsockopt(serverfd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n#endif\n    setnonblocking(serverfd);\n\n    if (verbose) {\n        LOGI(\"accept a connection\");\n    }\n\n    server_t *server = new_server(serverfd, listener);\n\n    // SSR beg\n    server->obfs_plugin = new_obfs_class(server->listen_ctx->obfs_name);\n    if (server->obfs_plugin) {\n        server->obfs = server->obfs_plugin->new_obfs();\n        server->obfs_compatible_state = 0;\n    }\n    server->protocol_plugin = new_obfs_class(server->listen_ctx->protocol_name);\n    if (server->protocol_plugin) {\n        server->protocol = server->protocol_plugin->new_obfs();\n        server->protocol_compatible_state = 0;\n    }\n    server_info _server_info;\n    memset(&_server_info, 0, sizeof(server_info));\n    _server_info.param = server->listen_ctx->obfs_param;\n    if(server->obfs_plugin)\n        _server_info.g_data = server->obfs_plugin->init_data();\n    _server_info.head_len = 7;\n    _server_info.iv = server->e_ctx->evp.iv;\n    _server_info.iv_len = enc_get_iv_len();\n    _server_info.key = enc_get_key();\n    _server_info.key_len = enc_get_key_len();\n    _server_info.tcp_mss = 1460;\n\n    if (server->obfs_plugin)\n        server->obfs_plugin->set_server_info(server->obfs, &_server_info);\n\n    _server_info.param = server->listen_ctx->protocol_param;\n    if (server->protocol_plugin)\n        _server_info.g_data = server->protocol_plugin->init_data();\n\n    if (server->protocol_plugin)\n        server->protocol_plugin->set_server_info(server->protocol, &_server_info);\n    // SSR end\n\n    ev_io_start(EV_A_ & server->recv_ctx->io);\n    ev_timer_start(EV_A_ & server->recv_ctx->watcher);\n}\n\nint\nmain(int argc, char **argv)\n{\n    int i, c;\n    int pid_flags   = 0;\n    int mptcp       = 0;\n    int firewall    = 0;\n    int mtu         = 0;\n    char *user      = NULL;\n    char *password  = NULL;\n    char *timeout   = NULL;\n    char *protocol = NULL; // SSR\n    char *protocol_param = NULL; // SSR\n    char *method = NULL;\n    char *obfs = NULL; // SSR\n    char *obfs_param = NULL; // SSR\n    char *pid_path  = NULL;\n    char *conf_path = NULL;\n    char *iface     = NULL;\n\n    int server_num = 0;\n    const char *server_host[MAX_REMOTE_NUM];\n\n    char *nameservers[MAX_DNS_NUM + 1];\n    int nameserver_num = 0;\n\n    int option_index                    = 0;\n    static struct option long_options[] = {\n        { \"fast-open\",       no_argument,       0, 0 },\n        { \"acl\",             required_argument, 0, 0 },\n        { \"manager-address\", required_argument, 0, 0 },\n        { \"mtu\",             required_argument, 0, 0 },\n        { \"help\",            no_argument,       0, 0 },\n#ifdef __linux__\n        { \"mptcp\",           no_argument,       0, 0 },\n        { \"firewall\",        no_argument,       0, 0 },\n#endif\n        {                 0,                 0, 0, 0 }\n    };\n\n    opterr = 0;\n\n    USE_TTY();\n\n    while ((c = getopt_long(argc, argv, \"f:s:p:l:k:t:m:b:c:i:d:a:n:O:o:G:g:huUvA6\",\n                            long_options, &option_index)) != -1) {\n        switch (c) {\n        case 0:\n            if (option_index == 0) {\n                fast_open = 1;\n            } else if (option_index == 1) {\n                LOGI(\"initializing acl...\");\n                acl = !init_acl(optarg);\n            } else if (option_index == 2) {\n                manager_address = optarg;\n            } else if (option_index == 3) {\n                mtu = atoi(optarg);\n                LOGI(\"set MTU to %d\", mtu);\n            } else if (option_index == 4) {\n                usage();\n                exit(EXIT_SUCCESS);\n            } else if (option_index == 5) {\n                mptcp = 1;\n                LOGI(\"enable multipath TCP\");\n            } else if (option_index == 6) {\n                firewall = 1;\n                LOGI(\"enable firewall rules\");\n            }\n            break;\n        case 's':\n            if (server_num < MAX_REMOTE_NUM) {\n                server_host[server_num++] = optarg;\n            }\n            break;\n        case 'b':\n            bind_address = optarg;\n            break;\n        case 'p':\n            server_port = optarg;\n            break;\n        case 'k':\n            password = optarg;\n            break;\n        case 'f':\n            pid_flags = 1;\n            pid_path  = optarg;\n            break;\n        case 't':\n            timeout = optarg;\n            break;\n        // SSR beg\n        case 'O':\n            protocol = optarg;\n            break;\n        case 'm':\n            method = optarg;\n            break;\n        case 'o':\n            obfs = optarg;\n            break;\n        case 'G':\n            protocol_param = optarg;\n            break;\n        case 'g':\n            obfs_param = optarg;\n            break;\n        // SSR end\n        case 'c':\n            conf_path = optarg;\n            break;\n        case 'i':\n            iface = optarg;\n            break;\n        case 'd':\n            if (nameserver_num < MAX_DNS_NUM) {\n                nameservers[nameserver_num++] = optarg;\n            }\n            break;\n        case 'a':\n            user = optarg;\n            break;\n#ifdef HAVE_SETRLIMIT\n        case 'n':\n            nofile = atoi(optarg);\n            break;\n#endif\n        case 'u':\n            mode = TCP_AND_UDP;\n            break;\n        case 'U':\n            mode = UDP_ONLY;\n            break;\n        case 'v':\n            verbose = 1;\n            break;\n        case 'h':\n            usage();\n            exit(EXIT_SUCCESS);\n        case 'A':\n            auth = 1;\n            break;\n        case '6':\n            ipv6first = 1;\n            break;\n        case '?':\n            // The option character is not recognized.\n            LOGE(\"Unrecognized option: %s\", optarg);\n            opterr = 1;\n            break;\n        }\n    }\n\n    if (opterr) {\n        usage();\n        exit(EXIT_FAILURE);\n    }\n\n    if (argc == 1) {\n        if (conf_path == NULL) {\n            conf_path = DEFAULT_CONF_PATH;\n        }\n    }\n\n    if (conf_path != NULL) {\n        jconf_t *conf = read_jconf(conf_path);\n        if (server_num == 0) {\n            server_num = conf->remote_num;\n            for (i = 0; i < server_num; i++)\n                server_host[i] = conf->remote_addr[i].host;\n        }\n        if (server_port == NULL) {\n            server_port = conf->remote_port;\n        }\n        if (password == NULL) {\n            password = conf->password;\n        }\n        // SSR beg\n        if (protocol == NULL) {\n            protocol = conf->protocol;\n            LOGI(\"protocol %s\", protocol);\n        }\n        if (protocol_param == NULL) {\n            protocol_param = conf->protocol_param;\n            LOGI(\"protocol_param %s\", obfs_param);\n        }\n        if (method == NULL) {\n            method = conf->method;\n            LOGI(\"method %s\", method);\n        }\n        if (obfs == NULL) {\n            obfs = conf->obfs;\n            LOGI(\"obfs %s\", obfs);\n        }\n        if (obfs_param == NULL) {\n            obfs_param = conf->obfs_param;\n            LOGI(\"obfs_param %s\", obfs_param);\n        }\n        // SSR end\n        if (timeout == NULL) {\n            timeout = conf->timeout;\n        }\n        if (user == NULL) {\n            user = conf->user;\n        }\n        if (auth == 0) {\n            auth = conf->auth;\n        }\n        if (mode == TCP_ONLY) {\n            mode = conf->mode;\n        }\n        if (mtu == 0) {\n            mtu = conf->mtu;\n        }\n        if (mptcp == 0) {\n            mptcp = conf->mptcp;\n        }\n#ifdef TCP_FASTOPEN\n        if (fast_open == 0) {\n            fast_open = conf->fast_open;\n        }\n#endif\n#ifdef HAVE_SETRLIMIT\n        if (nofile == 0) {\n            nofile = conf->nofile;\n        }\n#endif\n        if (conf->nameserver != NULL) {\n            nameservers[nameserver_num++] = conf->nameserver;\n        }\n        if (ipv6first == 0) {\n            ipv6first = conf->ipv6_first;\n        }\n    }\n\n    //_compatible\n    if(strlen(protocol)>11)\n    {\n        char *text;\n        text = (char*)malloc(12);\n        memcpy(text, protocol + strlen(protocol) - 11, 12);\n\n        if(strcmp(text, \"_compatible\") == 0)\n        {\n            free(text);\n            text = (char*)malloc(strlen(protocol) - 11);\n            memcpy(text, protocol, strlen(protocol) - 11);\n            int length = strlen(protocol) - 11;\n            free(protocol);\n            protocol = (char*)malloc(length);\n            memset(protocol, 0x00, length);\n            memcpy(protocol, text, length);\n            LOGI(\"protocol compatible enable, %s\", protocol);\n            free(text);\n            protocol_compatible = 1;\n        }\n    }\n\n    if(strlen(obfs)>11)\n    {\n        char *text;\n        text = (char*)malloc(12);\n        memcpy(text, obfs + strlen(obfs) - 11, 12);\n\n        if(strcmp(text, \"_compatible\") == 0)\n        {\n            free(text);\n            text = (char*)malloc(strlen(obfs) - 11);\n            memcpy(text, obfs, strlen(obfs) - 11);\n            int length = strlen(obfs) - 11;\n            free(obfs);\n            obfs = (char*)malloc(length);\n            memset(obfs, 0x00, length);\n            memcpy(obfs, text, length);\n            LOGI(\"obfs compatible enable, %s\", obfs);\n            free(text);\n            obfs_compatible = 1;\n        }\n    }\n\n\n    if (server_num == 0) {\n        server_host[server_num++] = NULL;\n    }\n\n    if (server_num == 0 || server_port == NULL || password == NULL) {\n        usage();\n        exit(EXIT_FAILURE);\n    }\n\n    if (protocol && strcmp(protocol, \"verify_sha1\") == 0) {\n        auth = 1;\n        protocol = NULL;\n    }\n\n    if (method == NULL) {\n        method = \"rc4-md5\";\n    }\n\n    if (timeout == NULL) {\n        timeout = \"60\";\n    }\n\n#ifdef HAVE_SETRLIMIT\n    /*\n     * no need to check the return value here since we will show\n     * the user an error message if setrlimit(2) fails\n     */\n    if (nofile > 1024) {\n        if (verbose) {\n            LOGI(\"setting NOFILE to %d\", nofile);\n        }\n        set_nofile(nofile);\n    }\n#endif\n\n    if (pid_flags) {\n        USE_SYSLOG(argv[0]);\n        daemonize(pid_path);\n    }\n\n    if (ipv6first) {\n        LOGI(\"resolving hostname to IPv6 address first\");\n    }\n\n    if (fast_open == 1) {\n#ifdef TCP_FASTOPEN\n        LOGI(\"using tcp fast open\");\n#else\n        LOGE(\"tcp fast open is not supported by this environment\");\n        fast_open = 0;\n#endif\n    }\n\n    if (auth) {\n        LOGI(\"onetime authentication enabled\");\n    }\n\n    if (mode != TCP_ONLY) {\n        LOGI(\"UDP relay enabled\");\n    }\n\n    if (mode == UDP_ONLY) {\n        LOGI(\"TCP relay disabled\");\n    }\n\n#ifdef __MINGW32__\n    winsock_init();\n#else\n    // ignore SIGPIPE\n    signal(SIGPIPE, SIG_IGN);\n    signal(SIGCHLD, SIG_IGN);\n    signal(SIGABRT, SIG_IGN);\n#endif\n\n    struct ev_signal sigint_watcher;\n    struct ev_signal sigterm_watcher;\n    ev_signal_init(&sigint_watcher, signal_cb, SIGINT);\n    ev_signal_init(&sigterm_watcher, signal_cb, SIGTERM);\n    ev_signal_start(EV_DEFAULT, &sigint_watcher);\n    ev_signal_start(EV_DEFAULT, &sigterm_watcher);\n\n    // setup keys\n    LOGI(\"initializing ciphers... %s\", method);\n    int m = enc_init(password, method);\n\n    // initialize ev loop\n    struct ev_loop *loop = EV_DEFAULT;\n\n    // setup udns\n    if (nameserver_num == 0) {\n#ifdef __MINGW32__\n        nameservers[nameserver_num++] = \"8.8.8.8\";\n        resolv_init(loop, nameservers, nameserver_num, ipv6first);\n#else\n        resolv_init(loop, NULL, 0, ipv6first);\n#endif\n    } else {\n        resolv_init(loop, nameservers, nameserver_num, ipv6first);\n    }\n\n    for (int i = 0; i < nameserver_num; i++)\n        LOGI(\"using nameserver: %s\", nameservers[i]);\n\n    // initialize listen context\n    listen_ctx_t listen_ctx_list[server_num];\n\n    // bind to each interface\n    while (server_num > 0) {\n        int index        = --server_num;\n        const char *host = server_host[index];\n\n        if (mode != UDP_ONLY) {\n            // Bind to port\n            int listenfd;\n            listenfd = create_and_bind(host, server_port, mptcp);\n            if (listenfd == -1) {\n                FATAL(\"bind() error\");\n            }\n            if (listen(listenfd, SSMAXCONN) == -1) {\n                FATAL(\"listen() error\");\n            }\n            setfastopen(listenfd);\n            setnonblocking(listenfd);\n            listen_ctx_t *listen_ctx = &listen_ctx_list[index];\n\n            // Setup proxy context\n            listen_ctx->timeout = atoi(timeout);\n            listen_ctx->fd      = listenfd;\n            listen_ctx->method  = m;\n            listen_ctx->iface   = iface;\n\n            // SSR beg\n            listen_ctx->protocol_name = protocol;\n            listen_ctx->protocol_param = protocol_param;\n            listen_ctx->method = m;\n            listen_ctx->obfs_name = obfs;\n            listen_ctx->obfs_param = obfs_param;\n            listen_ctx->list_protocol_global = malloc(sizeof(void *));\n            listen_ctx->list_obfs_global = malloc(sizeof(void *));\n            memset(listen_ctx->list_protocol_global, 0, sizeof(void *));\n            memset(listen_ctx->list_obfs_global, 0, sizeof(void *));\n            // SSR end\n\n            listen_ctx->loop    = loop;\n\n            ev_io_init(&listen_ctx->io, accept_cb, listenfd, EV_READ);\n            ev_io_start(loop, &listen_ctx->io);\n        }\n\n        // Setup UDP\n        if (mode != TCP_ONLY) {\n            init_udprelay(server_host[index], server_port, mtu, m,\n                          auth, atoi(timeout), iface, protocol, protocol_param);\n        }\n\n        if (host && strcmp(host, \":\") > 0)\n            LOGI(\"listening at [%s]:%s\", host, server_port);\n        else\n            LOGI(\"listening at %s:%s\", host ? host : \"*\", server_port);\n    }\n\n    if (manager_address != NULL) {\n        ev_timer_init(&stat_update_watcher, stat_update_cb, UPDATE_INTERVAL, UPDATE_INTERVAL);\n        ev_timer_start(EV_DEFAULT, &stat_update_watcher);\n    }\n\n    ev_timer_init(&block_list_watcher, block_list_clear_cb, UPDATE_INTERVAL, UPDATE_INTERVAL);\n    ev_timer_start(EV_DEFAULT, &block_list_watcher);\n\n    // setuid\n    if (user != NULL && ! run_as(user)) {\n        FATAL(\"failed to switch user\");\n    }\n\n#ifndef __MINGW32__\n    if (geteuid() == 0){\n        LOGI(\"running from root user\");\n    } else if (firewall) {\n        LOGE(\"firewall setup requires running from root user\");\n        exit(-1);\n    }\n#endif\n\n    // init block list\n    init_block_list(firewall);\n\n    // Init connections\n    cork_dllist_init(&connections);\n\n    // start ev loop\n    ev_run(loop, 0);\n\n    if (verbose) {\n        LOGI(\"closed gracefully\");\n    }\n\n    // Free block list\n    free_block_list();\n\n    if (manager_address != NULL) {\n        ev_timer_stop(EV_DEFAULT, &stat_update_watcher);\n    }\n    ev_timer_stop(EV_DEFAULT, &block_list_watcher);\n\n    // Clean up\n    for (int i = 0; i <= server_num; i++) {\n        listen_ctx_t *listen_ctx = &listen_ctx_list[i];\n        if (mode != UDP_ONLY) {\n            ev_io_stop(loop, &listen_ctx->io);\n            close(listen_ctx->fd);\n        }\n    }\n\n    if (mode != UDP_ONLY) {\n        free_connections(loop);\n    }\n\n    if (mode != TCP_ONLY) {\n        free_udprelay();\n    }\n\n    resolv_shutdown(loop);\n\n#ifdef __MINGW32__\n    winsock_cleanup();\n#endif\n\n    ev_signal_stop(EV_DEFAULT, &sigint_watcher);\n    ev_signal_stop(EV_DEFAULT, &sigterm_watcher);\n\n    return 0;\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/server.h",
    "content": "/*\n * server.h - Define shadowsocks server's buffers and callbacks\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _SERVER_H\n#define _SERVER_H\n\n#include <ev.h>\n#include <time.h>\n#include <libcork/ds.h>\n\n#include \"encrypt.h\"\n#include \"jconf.h\"\n#include \"resolv.h\"\n#include \"obfs.h\"\n#include \"protocol.h\"\n\n#include \"common.h\"\n\ntypedef struct listen_ctx {\n    ev_io io;\n    int fd;\n    int timeout;\n    int method;\n    char *iface;\n    struct ev_loop *loop;\n\n    // SSR\n    char *protocol_name;\n    char *protocol_param;\n    char *obfs_name;\n    char *obfs_param;\n    void **list_protocol_global;\n    void **list_obfs_global;\n} listen_ctx_t;\n\ntypedef struct server_ctx {\n    ev_io io;\n    ev_timer watcher;\n    int connected;\n    struct server *server;\n} server_ctx_t;\n\ntypedef struct server {\n    int fd;\n    int stage;\n    buffer_t *buf;\n    ssize_t buf_capacity;\n    buffer_t *header_buf;\n\n    int auth;\n    struct chunk *chunk;\n\n    struct enc_ctx *e_ctx;\n    struct enc_ctx *d_ctx;\n    struct server_ctx *recv_ctx;\n    struct server_ctx *send_ctx;\n    struct listen_ctx *listen_ctx;\n    struct remote *remote;\n\n    struct ResolvQuery *query;\n\n    struct cork_dllist_item entries;\n\n    // SSR\n    obfs *protocol;\n    obfs *obfs;\n    obfs_class *protocol_plugin;\n    obfs_class *obfs_plugin;\n    int obfs_compatible_state;\n    int protocol_compatible_state;\n} server_t;\n\ntypedef struct query {\n    server_t *server;\n    char hostname[257];\n} query_t;\n\ntypedef struct remote_ctx {\n    ev_io io;\n    int connected;\n    struct remote *remote;\n} remote_ctx_t;\n\ntypedef struct remote {\n    int fd;\n    buffer_t *buf;\n    ssize_t buf_capacity;\n    struct remote_ctx *recv_ctx;\n    struct remote_ctx *send_ctx;\n    struct server *server;\n\n    // SSR\n    int remote_index;\n} remote_t;\n\n#endif // _SERVER_H\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/tls.c",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n/*\n * This is a minimal TLS implementation intended only to parse the server name\n * extension.  This was created based primarily on Wireshark dissection of a\n * TLS handshake and RFC4366.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdio.h>\n#include <stdlib.h> /* malloc() */\n#include <string.h> /* strncpy() */\n\n#ifndef __MINGW32__\n#include <sys/socket.h>\n#else\n#include <win32.h>\n#endif\n\n#include \"tls.h\"\n#include \"protocol.h\"\n#include \"utils.h\"\n\n#define SERVER_NAME_LEN 256\n#define TLS_HEADER_LEN 5\n#define TLS_HANDSHAKE_CONTENT_TYPE 0x16\n#define TLS_HANDSHAKE_TYPE_CLIENT_HELLO 0x01\n\n#ifndef MIN\n#define MIN(X, Y) ((X) < (Y) ? (X) : (Y))\n#endif\n\nextern int verbose;\n\nstatic int parse_tls_header(const char *, size_t, char **);\nstatic int parse_extensions(const char *, size_t, char **);\nstatic int parse_server_name_extension(const char *, size_t, char **);\n\nstatic const protocol_t tls_protocol_st = {\n    .default_port =               443,\n    .parse_packet = &parse_tls_header,\n};\nconst protocol_t *const tls_protocol = &tls_protocol_st;\n\n/* Parse a TLS packet for the Server Name Indication extension in the client\n * hello handshake, returning the first servername found (pointer to static\n * array)\n *\n * Returns:\n *  >=0  - length of the hostname and updates *hostname\n *         caller is responsible for freeing *hostname\n *  -1   - Incomplete request\n *  -2   - No Host header included in this request\n *  -3   - Invalid hostname pointer\n *  -4   - malloc failure\n *  < -4 - Invalid TLS client hello\n */\nstatic int\nparse_tls_header(const char *data, size_t data_len, char **hostname)\n{\n    char tls_content_type;\n    char tls_version_major;\n    char tls_version_minor;\n    size_t pos = TLS_HEADER_LEN;\n    size_t len;\n\n    if (hostname == NULL)\n        return -3;\n\n    /* Check that our TCP payload is at least large enough for a TLS header */\n    if (data_len < TLS_HEADER_LEN)\n        return -1;\n\n    /* SSL 2.0 compatible Client Hello\n     *\n     * High bit of first byte (length) and content type is Client Hello\n     *\n     * See RFC5246 Appendix E.2\n     */\n    if (data[0] & 0x80 && data[2] == 1) {\n        if (verbose)\n            LOGI(\"Received SSL 2.0 Client Hello which can not support SNI.\");\n        return -2;\n    }\n\n    tls_content_type = data[0];\n    if (tls_content_type != TLS_HANDSHAKE_CONTENT_TYPE) {\n        if (verbose)\n            LOGI(\"Request did not begin with TLS handshake.\");\n        return -5;\n    }\n\n    tls_version_major = data[1];\n    tls_version_minor = data[2];\n    if (tls_version_major < 3) {\n        if (verbose)\n            LOGI(\"Received SSL %d.%d handshake which can not support SNI.\",\n                 tls_version_major, tls_version_minor);\n\n        return -2;\n    }\n\n    /* TLS record length */\n    len = ((unsigned char)data[3] << 8) +\n          (unsigned char)data[4] + TLS_HEADER_LEN;\n    data_len = MIN(data_len, len);\n\n    /* Check we received entire TLS record length */\n    if (data_len < len)\n        return -1;\n\n    /*\n     * Handshake\n     */\n    if (pos + 1 > data_len) {\n        return -5;\n    }\n    if (data[pos] != TLS_HANDSHAKE_TYPE_CLIENT_HELLO) {\n        if (verbose)\n            LOGI(\"Not a client hello\");\n\n        return -5;\n    }\n\n    /* Skip past fixed length records:\n     * 1\tHandshake Type\n     * 3\tLength\n     * 2\tVersion (again)\n     * 32\tRandom\n     * to\tSession ID Length\n     */\n    pos += 38;\n\n    /* Session ID */\n    if (pos + 1 > data_len)\n        return -5;\n    len  = (unsigned char)data[pos];\n    pos += 1 + len;\n\n    /* Cipher Suites */\n    if (pos + 2 > data_len)\n        return -5;\n    len  = ((unsigned char)data[pos] << 8) + (unsigned char)data[pos + 1];\n    pos += 2 + len;\n\n    /* Compression Methods */\n    if (pos + 1 > data_len)\n        return -5;\n    len  = (unsigned char)data[pos];\n    pos += 1 + len;\n\n    if (pos == data_len && tls_version_major == 3 && tls_version_minor == 0) {\n        if (verbose)\n            LOGI(\"Received SSL 3.0 handshake without extensions\");\n        return -2;\n    }\n\n    /* Extensions */\n    if (pos + 2 > data_len)\n        return -5;\n    len  = ((unsigned char)data[pos] << 8) + (unsigned char)data[pos + 1];\n    pos += 2;\n\n    if (pos + len > data_len)\n        return -5;\n    return parse_extensions(data + pos, len, hostname);\n}\n\nstatic int\nparse_extensions(const char *data, size_t data_len, char **hostname)\n{\n    size_t pos = 0;\n    size_t len;\n\n    /* Parse each 4 bytes for the extension header */\n    while (pos + 4 <= data_len) {\n        /* Extension Length */\n        len = ((unsigned char)data[pos + 2] << 8) +\n              (unsigned char)data[pos + 3];\n\n        /* Check if it's a server name extension */\n        if (data[pos] == 0x00 && data[pos + 1] == 0x00) {\n            /* There can be only one extension of each type, so we break\n             * our state and move p to beinnging of the extension here */\n            if (pos + 4 + len > data_len)\n                return -5;\n            return parse_server_name_extension(data + pos + 4, len, hostname);\n        }\n        pos += 4 + len; /* Advance to the next extension header */\n    }\n    /* Check we ended where we expected to */\n    if (pos != data_len)\n        return -5;\n\n    return -2;\n}\n\nstatic int\nparse_server_name_extension(const char *data, size_t data_len,\n                            char **hostname)\n{\n    size_t pos = 2; /* skip server name list length */\n    size_t len;\n\n    while (pos + 3 < data_len) {\n        len = ((unsigned char)data[pos + 1] << 8) +\n              (unsigned char)data[pos + 2];\n\n        if (pos + 3 + len > data_len)\n            return -5;\n\n        switch (data[pos]) { /* name type */\n        case 0x00:     /* host_name */\n            *hostname = malloc(len + 1);\n            if (*hostname == NULL) {\n                ERROR(\"malloc() failure\");\n                return -4;\n            }\n\n            strncpy(*hostname, data + pos + 3, len);\n\n            (*hostname)[len] = '\\0';\n\n            return len;\n        default:\n            if (verbose)\n                LOGI(\"Unknown server name extension name type: %d\",\n                     data[pos]);\n        }\n        pos += 3 + len;\n    }\n    /* Check we ended where we expected to */\n    if (pos != data_len)\n        return -5;\n\n    return -2;\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/tls.h",
    "content": "/*\n * Copyright (c) 2011 and 2012, Dustin Lundquist <dustin@null-ptr.net>\n * All rights reserved.\n *\n * Redistribution and use in source and binary forms, with or without\n * modification, are permitted provided that the following conditions are met:\n *\n * 1. Redistributions of source code must retain the above copyright notice,\n *    this list of conditions and the following disclaimer.\n * 2. Redistributions in binary form must reproduce the above copyright\n *    notice, this list of conditions and the following disclaimer in the\n *    documentation and/or other materials provided with the distribution.\n *\n * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\"\n * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE\n * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE\n * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n * POSSIBILITY OF SUCH DAMAGE.\n */\n#ifndef TLS_H\n#define TLS_H\n\n#include \"protocol.h\"\n\nconst protocol_t *const tls_protocol;\n\n#endif\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/tls1.2_ticket.c",
    "content": "\n#include \"tls1.2_ticket.h\"\n#include \"list.c\"\n\ntypedef struct tls12_ticket_auth_global_data {\n    uint8_t local_client_id[32];\n    List client_data;\n    time_t startup_time;\n}tls12_ticket_auth_global_data;\n\ntypedef struct tls12_ticket_auth_local_data {\n    int handshake_status;\n    char *send_buffer;\n    int send_buffer_size;\n    char *recv_buffer;\n    int recv_buffer_size;\n}tls12_ticket_auth_local_data;\n\nvoid tls12_ticket_auth_local_data_init(tls12_ticket_auth_local_data* local) {\n    local->handshake_status = 0;\n    local->send_buffer = malloc(0);\n    local->send_buffer_size = 0;\n    local->recv_buffer = malloc(0);\n    local->recv_buffer_size = 0;\n}\n\nvoid * tls12_ticket_auth_init_data() {\n    tls12_ticket_auth_global_data *global = (tls12_ticket_auth_global_data*)malloc(sizeof(tls12_ticket_auth_global_data));\n    rand_bytes(global->local_client_id, 32);\n    global->client_data = list_init(22);\n    global->startup_time = time(NULL);\n    return global;\n}\n\nobfs * tls12_ticket_auth_new_obfs() {\n    obfs * self = new_obfs();\n    self->l_data = malloc(sizeof(tls12_ticket_auth_local_data));\n    tls12_ticket_auth_local_data_init((tls12_ticket_auth_local_data*)self->l_data);\n    return self;\n}\n\nvoid tls12_ticket_auth_dispose(obfs *self) {\n    tls12_ticket_auth_local_data *local = (tls12_ticket_auth_local_data*)self->l_data;\n    if (local->send_buffer != NULL) {\n        free(local->send_buffer);\n        local->send_buffer = NULL;\n    }\n    if (local->recv_buffer != NULL) {\n        free(local->recv_buffer);\n        local->recv_buffer = NULL;\n    }\n    free(local);\n    dispose_obfs(self);\n}\n\nint tls12_ticket_pack_auth_data(tls12_ticket_auth_global_data *global, server_info *server, char *outdata) {\n    int out_size = 32;\n    time_t t = time(NULL);\n    outdata[0] = t >> 24;\n    outdata[1] = t >> 16;\n    outdata[2] = t >> 8;\n    outdata[3] = t;\n    rand_bytes((uint8_t*)outdata + 4, 18);\n\n    uint8_t *key = (uint8_t*)malloc(server->key_len + 32);\n    char hash[ONETIMEAUTH_BYTES * 2];\n    memcpy(key, server->key, server->key_len);\n    memcpy(key + server->key_len, global->local_client_id, 32);\n    ss_sha1_hmac_with_key(hash, outdata, out_size - OBFS_HMAC_SHA1_LEN, key, server->key_len + 32);\n    free(key);\n    memcpy(outdata + out_size - OBFS_HMAC_SHA1_LEN, hash, OBFS_HMAC_SHA1_LEN);\n    return out_size;\n}\n\nvoid tls12_ticket_auth_pack_data(char *encryptdata, int datalength, int start, int len, char *out_buffer, int outlength) {\n    out_buffer[outlength] = 0x17;\n    out_buffer[outlength + 1] = 0x3;\n    out_buffer[outlength + 2] = 0x3;\n    out_buffer[outlength + 3] = len >> 8;\n    out_buffer[outlength + 4] = len;\n    memcpy(out_buffer + outlength + 5, encryptdata + start, len);\n}\n\nint tls12_ticket_auth_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity) {\n    char *encryptdata = *pencryptdata;\n    tls12_ticket_auth_local_data *local = (tls12_ticket_auth_local_data*)self->l_data;\n    tls12_ticket_auth_global_data *global = (tls12_ticket_auth_global_data*)self->server.g_data;\n    char * out_buffer = NULL;\n\n    if (local->handshake_status == 8) {\n        if (datalength < 1024) {\n            if (*capacity < datalength + 5) {\n                *pencryptdata = (char*)realloc(*pencryptdata, *capacity = (datalength + 5) * 2);\n                encryptdata = *pencryptdata;\n            }\n            memmove(encryptdata + 5, encryptdata, datalength);\n            encryptdata[0] = 0x17;\n            encryptdata[1] = 0x3;\n            encryptdata[2] = 0x3;\n            encryptdata[3] = datalength >> 8;\n            encryptdata[4] = datalength;\n            return datalength + 5;\n        } else {\n            out_buffer = (char*)malloc(datalength + 2048);\n            int start = 0;\n            int outlength = 0;\n            int len;\n            while (datalength - start > 2048) {\n                len = xorshift128plus() % 4096 + 100;\n                if (len > datalength - start)\n                    len = datalength - start;\n                tls12_ticket_auth_pack_data(encryptdata, datalength, start, len, out_buffer, outlength);\n                outlength += len + 5;\n                start += len;\n            }\n            if (datalength - start > 0) {\n                len = datalength - start;\n                tls12_ticket_auth_pack_data(encryptdata, datalength, start, len, out_buffer, outlength);\n                outlength += len + 5;\n            }\n            if (*capacity < outlength) {\n                *pencryptdata = (char*)realloc(*pencryptdata, *capacity = outlength * 2);\n                encryptdata = *pencryptdata;\n            }\n            memcpy(encryptdata, out_buffer, outlength);\n            free(out_buffer);\n            return outlength;\n        }\n    }\n    local->send_buffer = (char*)realloc(local->send_buffer, local->send_buffer_size + datalength + 5);\n    memcpy(local->send_buffer + local->send_buffer_size + 5, encryptdata, datalength);\n    local->send_buffer[local->send_buffer_size] = 0x17;\n    local->send_buffer[local->send_buffer_size + 1] = 0x3;\n    local->send_buffer[local->send_buffer_size + 2] = 0x3;\n    local->send_buffer[local->send_buffer_size + 3] = datalength >> 8;\n    local->send_buffer[local->send_buffer_size + 4] = datalength;\n    local->send_buffer_size += datalength + 5;\n\n    if (local->handshake_status == 0) {\n#define CSTR_DECL(name, len, str) const char* name = str; const int len = sizeof(str) - 1;\n        CSTR_DECL(tls_data0, tls_data0_len, \"\\x00\\x1c\\xc0\\x2b\\xc0\\x2f\\xcc\\xa9\\xcc\\xa8\\xcc\\x14\\xcc\\x13\\xc0\\x0a\\xc0\\x14\\xc0\\x09\\xc0\\x13\\x00\\x9c\\x00\\x35\\x00\\x2f\\x00\\x0a\\x01\\x00\"\n                );\n        CSTR_DECL(tls_data1, tls_data1_len, \"\\xff\\x01\\x00\\x01\\x00\"\n                );\n        CSTR_DECL(tls_data2, tls_data2_len, \"\\x00\\x17\\x00\\x00\\x00\\x23\\x00\\xd0\");\n        CSTR_DECL(tls_data3, tls_data3_len, \"\\x00\\x0d\\x00\\x16\\x00\\x14\\x06\\x01\\x06\\x03\\x05\\x01\\x05\\x03\\x04\\x01\\x04\\x03\\x03\\x01\\x03\\x03\\x02\\x01\\x02\\x03\\x00\\x05\\x00\\x05\\x01\\x00\\x00\\x00\\x00\\x00\\x12\\x00\\x00\\x75\\x50\\x00\\x00\\x00\\x0b\\x00\\x02\\x01\\x00\\x00\\x0a\\x00\\x06\\x00\\x04\\x00\\x17\\x00\\x18\"\n                //\"00150066000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000\" // padding\n                );\n        uint8_t tls_data[2048];\n        int tls_data_len = 0;\n        memcpy(tls_data, tls_data1, tls_data1_len);\n        tls_data_len += tls_data1_len;\n\n        char hosts[1024];\n        char * phost[128];\n        int host_num = 0;\n        int pos;\n\n        char sni[256] = {0};\n        if (self->server.param && strlen(self->server.param) == 0)\n            self->server.param = NULL;\n        strncpy(hosts, self->server.param ? self->server.param : self->server.host, sizeof hosts);\n        phost[host_num++] = hosts;\n        for (pos = 0; hosts[pos]; ++pos) {\n            if (hosts[pos] == ',') {\n                phost[host_num++] = &hosts[pos + 1];\n            }\n        }\n        host_num = xorshift128plus() % host_num;\n\n        sprintf(sni, \"%s\", phost[host_num]);\n        int sni_len = strlen(sni);\n        if (sni_len > 0 && sni[sni_len - 1] >= '0' && sni[sni_len - 1] <= '9')\n            sni_len = 0;\n        tls_data[tls_data_len] = '\\0';\n        tls_data[tls_data_len + 1] = '\\0';\n        tls_data[tls_data_len + 2] = (sni_len + 5) >> 8;\n        tls_data[tls_data_len + 3] = (sni_len + 5);\n        tls_data[tls_data_len + 4] = (sni_len + 3) >> 8;\n        tls_data[tls_data_len + 5] = (sni_len + 3);\n        tls_data[tls_data_len + 6] = '\\0';\n        tls_data[tls_data_len + 7] = sni_len >> 8;\n        tls_data[tls_data_len + 8] = sni_len;\n        memcpy(tls_data + tls_data_len + 9, sni, sni_len);\n        tls_data_len += 9 + sni_len;\n        memcpy(tls_data + tls_data_len, tls_data2, tls_data2_len);\n        tls_data_len += tls_data2_len;\n        rand_bytes(tls_data + tls_data_len, 208);\n        tls_data_len += 208;\n        memcpy(tls_data + tls_data_len, tls_data3, tls_data3_len);\n        tls_data_len += tls_data3_len;\n\n        datalength = 11 + 32 + 1 + 32 + tls_data0_len + 2 + tls_data_len;\n        out_buffer = (char*)malloc(datalength);\n        char *pdata = out_buffer + datalength - tls_data_len;\n        int len = tls_data_len;\n        memcpy(pdata, tls_data, tls_data_len);\n        pdata[-1] = tls_data_len;\n        pdata[-2] = tls_data_len >> 8;\n        pdata -= 2; len += 2;\n        memcpy(pdata - tls_data0_len, tls_data0, tls_data0_len);\n        pdata -= tls_data0_len; len += tls_data0_len;\n        memcpy(pdata - 32, global->local_client_id, 32);\n        pdata -= 32; len += 32;\n        pdata[-1] = 0x20;\n        pdata -= 1; len += 1;\n        tls12_ticket_pack_auth_data(global, &self->server, pdata - 32);\n        pdata -= 32; len += 32;\n        pdata[-1] = 0x3;\n        pdata[-2] = 0x3; // tls version\n        pdata -= 2; len += 2;\n        pdata[-1] = len;\n        pdata[-2] = len >> 8;\n        pdata[-3] = 0;\n        pdata[-4] = 1;\n        pdata -= 4; len += 4;\n\n        pdata[-1] = len;\n        pdata[-2] = len >> 8;\n        pdata -= 2; len += 2;\n        pdata[-1] = 0x1;\n        pdata[-2] = 0x3; // tls version\n        pdata -= 2; len += 2;\n        pdata[-1] = 0x16; // tls handshake\n        pdata -= 1; len += 1;\n\n        local->handshake_status = 1;\n    } else if (datalength == 0) {\n        datalength = local->send_buffer_size + 43;\n        out_buffer = (char*)malloc(datalength);\n        char *pdata = out_buffer;\n        memcpy(pdata, \"\\x14\\x03\\x03\\x00\\x01\\x01\", 6);\n        pdata += 6;\n        memcpy(pdata, \"\\x16\\x03\\x03\\x00\\x20\", 5);\n        pdata += 5;\n        rand_bytes((uint8_t*)pdata, 22);\n        pdata += 22;\n\n        uint8_t *key = (uint8_t*)malloc(self->server.key_len + 32);\n        char hash[ONETIMEAUTH_BYTES * 2];\n        memcpy(key, self->server.key, self->server.key_len);\n        memcpy(key + self->server.key_len, global->local_client_id, 32);\n        ss_sha1_hmac_with_key(hash, out_buffer, pdata - out_buffer, key, self->server.key_len + 32);\n        free(key);\n        memcpy(pdata, hash, OBFS_HMAC_SHA1_LEN);\n\n        pdata += OBFS_HMAC_SHA1_LEN;\n        memcpy(pdata, local->send_buffer, local->send_buffer_size);\n        free(local->send_buffer);\n        local->send_buffer = NULL;\n\n        local->handshake_status = 8;\n    } else {\n        return 0;\n    }\n    if (*capacity < datalength) {\n        *pencryptdata = (char*)realloc(*pencryptdata, *capacity = datalength * 2);\n        encryptdata = *pencryptdata;\n    }\n    memmove(encryptdata, out_buffer, datalength);\n    free(out_buffer);\n    return datalength;\n}\n\nint tls12_ticket_auth_server_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity) {\n    char *encryptdata = *pencryptdata;\n    tls12_ticket_auth_local_data *local = (tls12_ticket_auth_local_data*)self->l_data;\n    tls12_ticket_auth_global_data *global = (tls12_ticket_auth_global_data*)self->server.g_data;\n    char * out_buffer = NULL;\n\n    if (local->handshake_status == 8) {\n        if (datalength < 1024) {\n            if (*capacity < datalength + 5) {\n                *pencryptdata = (char*)realloc(*pencryptdata, *capacity = (datalength + 5) * 2);\n                encryptdata = *pencryptdata;\n            }\n            memmove(encryptdata + 5, encryptdata, datalength);\n            encryptdata[0] = 0x17;\n            encryptdata[1] = 0x3;\n            encryptdata[2] = 0x3;\n            encryptdata[3] = datalength >> 8;\n            encryptdata[4] = datalength;\n            return datalength + 5;\n        } else {\n            out_buffer = (char*)malloc(datalength + 2048);\n            int start = 0;\n            int outlength = 0;\n            int len;\n            while (datalength - start > 2048) {\n                len = xorshift128plus() % 4096 + 100;\n                if (len > datalength - start)\n                    len = datalength - start;\n                tls12_ticket_auth_pack_data(encryptdata, datalength, start, len, out_buffer, outlength);\n                outlength += len + 5;\n                start += len;\n            }\n            if (datalength - start > 0) {\n                len = datalength - start;\n                tls12_ticket_auth_pack_data(encryptdata, datalength, start, len, out_buffer, outlength);\n                outlength += len + 5;\n            }\n            if (*capacity < outlength) {\n                *pencryptdata = (char*)realloc(*pencryptdata, *capacity = outlength * 2);\n                encryptdata = *pencryptdata;\n            }\n            memcpy(encryptdata, out_buffer, outlength);\n            free(out_buffer);\n            return outlength;\n        }\n    }\n\n    local->handshake_status = 3;\n\n    out_buffer = (char*)malloc(43 + 86);\n    int data_len = 0;\n    char *p_data = out_buffer + 86;\n\n    memcpy(p_data - 10, \"\\xc0\\x2f\\x00\\x00\\x05\\xff\\x01\\x00\\x01\\x00\", 10);\n    p_data -= 10;data_len += 10;\n\n    memcpy(p_data - 32, global->local_client_id, 32);\n    p_data -= 32;data_len += 32;\n\n    p_data[-1] = 0x20;\n    p_data -= 1;data_len += 1;\n\n    tls12_ticket_pack_auth_data(global, &self->server, p_data - 32);\n    p_data -= 32;data_len += 32;\n\n    p_data[-1] = 0x3;\n    p_data[-2] = 0x3; // tls version\n    p_data -= 2;data_len += 2;\n\n    p_data[-1] = data_len;\n    p_data[-2] = data_len >> 8;\n    p_data[-3] = 0x00;\n    p_data[-4] = 0x02;\n    p_data -= 4; data_len += 4;\n\n    p_data[-1] = data_len;\n    p_data[-2] = data_len >> 8;\n    p_data[-3] = 0x03;\n    p_data[-4] = 0x03;\n    p_data[-5] = 0x16;\n    p_data -= 5; data_len += 5;\n\n    memcpy(out_buffer, p_data, data_len);\n    char *pdata = out_buffer + 86;\n\n    memcpy(pdata, \"\\x14\\x03\\x03\\x00\\x01\\x01\", 6);\n    pdata += 6;\n    memcpy(pdata, \"\\x16\\x03\\x03\\x00\\x20\", 5);\n    pdata += 5;\n    rand_bytes((uint8_t*)pdata, 22);\n    pdata += 22;\n\n    uint8_t *key = (uint8_t*)malloc(self->server.key_len + 32);\n    char hash[ONETIMEAUTH_BYTES * 2];\n    memcpy(key, self->server.key, self->server.key_len);\n    memcpy(key + self->server.key_len, global->local_client_id, 32);\n    ss_sha1_hmac_with_key(hash, out_buffer, 43 + 86, key, self->server.key_len + 32);\n    free(key);\n    memcpy(pdata, hash, OBFS_HMAC_SHA1_LEN);\n\n    memmove(encryptdata, out_buffer, 43 + 86);\n    free(out_buffer);\n    return 43 + 86;\n}\n\nint tls12_ticket_auth_client_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback) {\n    char *encryptdata = *pencryptdata;\n    tls12_ticket_auth_local_data *local = (tls12_ticket_auth_local_data*)self->l_data;\n    tls12_ticket_auth_global_data *global = (tls12_ticket_auth_global_data*)self->server.g_data;\n\n    *needsendback = 0;\n\n    if (local->handshake_status == 8) {\n        local->recv_buffer_size += datalength;\n        local->recv_buffer = (char*)realloc(local->recv_buffer, local->recv_buffer_size);\n        memcpy(local->recv_buffer + local->recv_buffer_size - datalength, encryptdata, datalength);\n        datalength = 0;\n        while (local->recv_buffer_size > 5) {\n            if (local->recv_buffer[0] != 0x17)\n                return -1;\n            int size = ((int)(unsigned char)local->recv_buffer[3] << 8) + (unsigned char)local->recv_buffer[4];\n            if (size + 5 > local->recv_buffer_size)\n                break;\n            if (*capacity < datalength + size) {\n                *pencryptdata = (char*)realloc(*pencryptdata, *capacity = (datalength + size) * 2);\n                encryptdata = *pencryptdata;\n            }\n            memcpy(encryptdata + datalength, local->recv_buffer + 5, size);\n            datalength += size;\n            local->recv_buffer_size -= 5 + size;\n            memmove(local->recv_buffer, local->recv_buffer + 5 + size, local->recv_buffer_size);\n        }\n        return datalength;\n    }\n    if (datalength < 11 + 32 + 1 + 32) {\n        return -1;\n    }\n\n    uint8_t *key = (uint8_t*)malloc(self->server.key_len + 32);\n    char hash[ONETIMEAUTH_BYTES * 2];\n    memcpy(key, self->server.key, self->server.key_len);\n    memcpy(key + self->server.key_len, global->local_client_id, 32);\n    ss_sha1_hmac_with_key(hash, encryptdata + 11, 22, key, self->server.key_len + 32);\n    free(key);\n\n    if (memcmp(encryptdata + 33, hash, OBFS_HMAC_SHA1_LEN)) {\n        return -1;\n    }\n\n    *needsendback = 1;\n    return 0;\n}\n\nint tls12_ticket_auth_server_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback) {\n    char *encryptdata = *pencryptdata;\n    tls12_ticket_auth_local_data *local = (tls12_ticket_auth_local_data*)self->l_data;\n    tls12_ticket_auth_global_data *global = (tls12_ticket_auth_global_data*)self->server.g_data;\n\n    *needsendback = 0;\n\n    if (local->handshake_status == 8) {\n        if(datalength != 0)\n        {\n            local->recv_buffer = (char*)realloc(local->recv_buffer, local->recv_buffer_size + datalength);\n            memmove(local->recv_buffer + local->recv_buffer_size, encryptdata, datalength);\n            local->recv_buffer_size += datalength;\n        }\n        datalength = 0;\n\n        while (local->recv_buffer_size > 5) {\n            if (local->recv_buffer[0] != 0x17 || local->recv_buffer[1] != 0x03 || local->recv_buffer[2] != 0x03)\n            {\n                LOGE(\"server_decode data error, wrong tls version 3\");\n                return -1;\n            }\n            int size = ((int)(unsigned char)local->recv_buffer[3] << 8) + (unsigned char)local->recv_buffer[4];\n            if (size + 5 > local->recv_buffer_size)\n                break;\n            if (*capacity < local->recv_buffer_size + size) {\n                *pencryptdata = (char*)realloc(*pencryptdata, *capacity = (local->recv_buffer_size + size) * 2);\n                encryptdata = *pencryptdata;\n            }\n            memcpy(encryptdata + datalength, local->recv_buffer + 5, size);\n            datalength += size;\n            local->recv_buffer_size -= 5 + size;\n            memmove(local->recv_buffer, local->recv_buffer + 5 + size, local->recv_buffer_size);\n        }\n        return datalength;\n    }\n\n    if (local->handshake_status == 3) {\n\n        char *verify = encryptdata;\n\n        if(datalength < 43)\n        {\n            LOGE(\"server_decode data error, too short:%d\", (int)datalength);\n            return -1;\n        }\n\n        if(encryptdata[0] != 0x14 || encryptdata[1] != 0x03 || encryptdata[2] != 0x03 || encryptdata[3] != 0x00 || encryptdata[4] != 0x01 || encryptdata[5] != 0x01)\n        {\n            LOGE(\"server_decode data error, wrong tls version\");\n            return -1;\n        }\n\n        encryptdata += 6;\n\n        if(encryptdata[0] != 0x16 || encryptdata[1] != 0x03 || encryptdata[2] != 0x03 || encryptdata[3] != 0x00 || encryptdata[4] != 0x20)\n        {\n            LOGE(\"server_decode data error, wrong tls version 2\");\n            return -1;\n        }\n\n        uint8_t *key = (uint8_t*)malloc(self->server.key_len + 32);\n        char hash[ONETIMEAUTH_BYTES * 2];\n        memcpy(key, self->server.key, self->server.key_len);\n        memcpy(key + self->server.key_len, global->local_client_id, 32);\n        ss_sha1_hmac_with_key(hash, verify, 33, key, self->server.key_len + 32);\n        free(key);\n\n        if (memcmp(verify + 33, hash, OBFS_HMAC_SHA1_LEN) != 0) {\n            LOGE(\"server_decode data error, hash Mismatch %d\",(int)memcmp(verify + 33, hash, OBFS_HMAC_SHA1_LEN));\n            return -1;\n        }\n\n        local->recv_buffer_size = datalength - 43;\n        local->recv_buffer = (char*)realloc(local->recv_buffer, local->recv_buffer_size);\n        memmove(local->recv_buffer, encryptdata + 37, datalength - 43);\n\n        local->handshake_status = 8;\n        return tls12_ticket_auth_server_decode(self, pencryptdata, 0, capacity, needsendback);\n    }\n\n    local->handshake_status = 2;\n    if(encryptdata[0] != 0x16 || encryptdata[1] != 0x03 || encryptdata[2] != 0x01)\n    {\n        return -1;\n    }\n\n    encryptdata += 3;\n\n    {\n        int size = ((int)(unsigned char)encryptdata[0] << 8) + (unsigned char)encryptdata[1];\n        if(size != datalength - 5)\n        {\n            LOGE(\"tls_auth wrong tls head size\");\n            return -1;\n        }\n    }\n\n    encryptdata += 2;\n\n    if(encryptdata[0] != 0x01 || encryptdata[1] != 0x00)\n    {\n        LOGE(\"tls_auth not client hello message\");\n        return -1;\n    }\n\n    encryptdata += 2;\n\n    {\n        int size = ((int)(unsigned char)encryptdata[0] << 8) + (unsigned char)encryptdata[1];\n        if(size != datalength - 9)\n        {\n            LOGE(\"tls_auth wrong message size\");\n            return -1;\n        }\n    }\n\n    encryptdata += 2;\n\n    if(encryptdata[0] != 0x03 || encryptdata[1] != 0x03)\n    {\n        LOGE(\"tls_auth wrong tls version\");\n        return -1;\n    }\n\n    encryptdata += 2;\n\n    char *verifyid = encryptdata;\n\n    encryptdata += 32;\n\n    int sessionid_len = encryptdata[0];\n    if(sessionid_len < 32)\n    {\n        LOGE(\"tls_auth wrong sessionid_len\");\n        return -1;\n    }\n\n    char *sessionid = encryptdata + 1;\n    memcpy(global->local_client_id , sessionid, sessionid_len);\n\n    uint8_t *key = (uint8_t*)malloc(self->server.key_len + sessionid_len);\n    char hash[ONETIMEAUTH_BYTES * 2];\n    memcpy(key, self->server.key, self->server.key_len);\n    memcpy(key + self->server.key_len, global->local_client_id, sessionid_len);\n    ss_sha1_hmac_with_key(hash, verifyid, 22, key, self->server.key_len + sessionid_len);\n    free(key);\n\n    encryptdata += (sessionid_len + 1);\n\n    long utc_time = ((int)(unsigned char)verifyid[0] << 24) + ((int)(unsigned char)verifyid[1] << 16) + ((int)(unsigned char)verifyid[2] << 8) + (unsigned char)verifyid[3];\n    time_t t = time(NULL);\n\n\n    if (self->server.param && strlen(self->server.param) == 0)\n    {\n        self->server.param = NULL;\n    }\n\n    int max_time_dif = 0;\n    int time_dif = utc_time - t;\n    if(self->server.param)\n    {\n        max_time_dif = atoi(self->server.param);\n    }\n\n    if(max_time_dif > 0 && (time_dif < -max_time_dif || time_dif > max_time_dif || utc_time - global->startup_time < -max_time_dif / 2))\n    {\n        LOGE(\"tls_auth wrong time\");\n        return -1;\n    }\n\n    if (memcmp(verifyid + 22, hash, OBFS_HMAC_SHA1_LEN)) {\n        LOGE(\"tls_auth wrong sha1\");\n        return -1;\n    }\n\n    int search_result = global->client_data->have_same_cmp(global->client_data, verifyid);\n    if(search_result != 0)\n    {\n        LOGE(\"replay attack detect!\");\n        return -1;\n    }\n\n    global->client_data->add_back(global->client_data, verifyid);\n\n    encryptdata += 48;\n\n    *needsendback = 1;\n\n    return 0;\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/tls1.2_ticket.h",
    "content": "/*\n * http_simple.h - Define shadowsocksR server's buffers and callbacks\n *\n * Copyright (C) 2015 - 2016, Break Wa11 <mmgac001@gmail.com>\n */\n\n#ifndef _TLS1_2_TICKET_H\n#define _TLS1_2_TICKET_H\n\nvoid * tls12_ticket_auth_init_data();\nobfs * tls12_ticket_auth_new_obfs();\nvoid tls12_ticket_auth_dispose(obfs *self);\n\nint tls12_ticket_auth_client_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity);\nint tls12_ticket_auth_client_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback);\n\nint tls12_ticket_auth_server_encode(obfs *self, char **pencryptdata, int datalength, size_t* capacity);\nint tls12_ticket_auth_server_decode(obfs *self, char **pencryptdata, int datalength, size_t* capacity, int *needsendback);\n\n#endif // _TLS1_2_TICKET_H\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/udprelay.c",
    "content": "/*\n * udprelay.c - Setup UDP relay for both client and server\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#include <sys/stat.h>\n#include <sys/types.h>\n#include <fcntl.h>\n#include <locale.h>\n#include <signal.h>\n#include <string.h>\n#include <strings.h>\n#include <time.h>\n#include <unistd.h>\n\n#ifndef __MINGW32__\n#include <arpa/inet.h>\n#include <errno.h>\n#include <netdb.h>\n#include <netinet/in.h>\n#include <pthread.h>\n#endif\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#if defined(HAVE_SYS_IOCTL_H) && defined(HAVE_NET_IF_H) && defined(__linux__)\n#include <net/if.h>\n#include <sys/ioctl.h>\n#define SET_INTERFACE\n#endif\n\n#ifdef __MINGW32__\n#include \"win32.h\"\n#endif\n\n#include <libcork/core.h>\n#include <udns.h>\n\n#include \"utils.h\"\n#include \"netutils.h\"\n#include \"cache.h\"\n#include \"udprelay.h\"\n\n#ifdef MODULE_REMOTE\n#define MAX_UDP_CONN_NUM 512\n#else\n#define MAX_UDP_CONN_NUM 256\n#endif\n\n#ifdef MODULE_REMOTE\n#ifdef MODULE_\n#error \"MODULE_REMOTE and MODULE_LOCAL should not be both defined\"\n#endif\n#endif\n\n#ifndef EAGAIN\n#define EAGAIN EWOULDBLOCK\n#endif\n\n#ifndef EWOULDBLOCK\n#define EWOULDBLOCK EAGAIN\n#endif\n\nstatic void server_recv_cb(EV_P_ ev_io *w, int revents);\nstatic void remote_recv_cb(EV_P_ ev_io *w, int revents);\nstatic void remote_timeout_cb(EV_P_ ev_timer *watcher, int revents);\n\nstatic char *hash_key(const int af, const struct sockaddr_storage *addr);\n#ifdef MODULE_REMOTE\nstatic void query_resolve_cb(struct sockaddr *addr, void *data);\n#endif\nstatic void close_and_free_remote(EV_P_ remote_ctx_t *ctx);\nstatic remote_ctx_t *new_remote(int fd, server_ctx_t *server_ctx);\n\n#ifdef ANDROID\nextern uint64_t tx;\nextern uint64_t rx;\nextern int vpn;\n#endif\n\nextern int verbose;\n#ifdef MODULE_REMOTE\nextern uint64_t tx;\nextern uint64_t rx;\n#endif\n\nstatic int packet_size                               = DEFAULT_PACKET_SIZE;\nstatic int buf_size                                  = DEFAULT_PACKET_SIZE * 2;\nstatic int server_num                                = 0;\nstatic server_ctx_t *server_ctx_list[MAX_REMOTE_NUM] = { NULL };\n\n#ifndef __MINGW32__\nstatic int\nsetnonblocking(int fd)\n{\n    int flags;\n    if (-1 == (flags = fcntl(fd, F_GETFL, 0))) {\n        flags = 0;\n    }\n    return fcntl(fd, F_SETFL, flags | O_NONBLOCK);\n}\n\n#endif\n\n#if defined(MODULE_REMOTE) && defined(SO_BROADCAST)\nstatic int\nset_broadcast(int socket_fd)\n{\n    int opt = 1;\n    return setsockopt(socket_fd, SOL_SOCKET, SO_BROADCAST, &opt, sizeof(opt));\n}\n\n#endif\n\n#ifdef SO_NOSIGPIPE\nstatic int\nset_nosigpipe(int socket_fd)\n{\n    int opt = 1;\n    return setsockopt(socket_fd, SOL_SOCKET, SO_NOSIGPIPE, &opt, sizeof(opt));\n}\n\n#endif\n\n#ifdef MODULE_REDIR\n\n#ifndef IP_TRANSPARENT\n#define IP_TRANSPARENT       19\n#endif\n\n#ifndef IP_RECVORIGDSTADDR\n#define IP_RECVORIGDSTADDR   20\n#endif\n\nstatic int\nget_dstaddr(struct msghdr *msg, struct sockaddr_storage *dstaddr)\n{\n    struct cmsghdr *cmsg;\n\n    for (cmsg = CMSG_FIRSTHDR(msg); cmsg; cmsg = CMSG_NXTHDR(msg, cmsg)) {\n        if (cmsg->cmsg_level == SOL_IP && cmsg->cmsg_type == IP_RECVORIGDSTADDR) {\n            memcpy(dstaddr, CMSG_DATA(cmsg), sizeof(struct sockaddr_in));\n            dstaddr->ss_family = AF_INET;\n            return 0;\n        } else if (cmsg->cmsg_level == SOL_IPV6 && cmsg->cmsg_type == IP_RECVORIGDSTADDR) {\n            memcpy(dstaddr, CMSG_DATA(cmsg), sizeof(struct sockaddr_in6));\n            dstaddr->ss_family = AF_INET6;\n            return 0;\n        }\n    }\n\n    return 1;\n}\n\n#endif\n\n#define HASH_KEY_LEN sizeof(struct sockaddr_storage) + sizeof(int)\nstatic char *\nhash_key(const int af, const struct sockaddr_storage *addr)\n{\n    size_t addr_len = sizeof(struct sockaddr_storage);\n    static char key[HASH_KEY_LEN];\n\n    memset(key, 0, HASH_KEY_LEN);\n    memcpy(key, &af, sizeof(int));\n    memcpy(key + sizeof(int), (const uint8_t *)addr, addr_len);\n\n    return key;\n}\n\n#if defined(MODULE_REDIR) || defined(MODULE_REMOTE)\nstatic int\nconstruct_udprealy_header(const struct sockaddr_storage *in_addr,\n                          char *addr_header)\n{\n    int addr_header_len = 0;\n    if (in_addr->ss_family == AF_INET) {\n        struct sockaddr_in *addr = (struct sockaddr_in *)in_addr;\n        size_t addr_len          = sizeof(struct in_addr);\n        addr_header[addr_header_len++] = 1;\n        memcpy(addr_header + addr_header_len, &addr->sin_addr, addr_len);\n        addr_header_len += addr_len;\n        memcpy(addr_header + addr_header_len, &addr->sin_port, 2);\n        addr_header_len += 2;\n    } else if (in_addr->ss_family == AF_INET6) {\n        struct sockaddr_in6 *addr = (struct sockaddr_in6 *)in_addr;\n        size_t addr_len           = sizeof(struct in6_addr);\n        addr_header[addr_header_len++] = 4;\n        memcpy(addr_header + addr_header_len, &addr->sin6_addr, addr_len);\n        addr_header_len += addr_len;\n        memcpy(addr_header + addr_header_len, &addr->sin6_port, 2);\n        addr_header_len += 2;\n    } else {\n        return 0;\n    }\n    return addr_header_len;\n}\n\n#endif\n\nstatic int\nparse_udprealy_header(const char *buf, const size_t buf_len,\n                      char *host, char *port, struct sockaddr_storage *storage)\n{\n    const uint8_t atyp = *(uint8_t *)buf;\n    int offset         = 1;\n\n    // get remote addr and port\n    if ((atyp & ADDRTYPE_MASK) == 1) {\n        // IP V4\n        size_t in_addr_len = sizeof(struct in_addr);\n        if (buf_len >= in_addr_len + 3) {\n            if (storage != NULL) {\n                struct sockaddr_in *addr = (struct sockaddr_in *)storage;\n                addr->sin_family = AF_INET;\n                addr->sin_addr   = *(struct in_addr *)(buf + offset);\n                addr->sin_port   = *(uint16_t *)(buf + offset + in_addr_len);\n            }\n            if (host != NULL) {\n                dns_ntop(AF_INET, (const void *)(buf + offset),\n                         host, INET_ADDRSTRLEN);\n            }\n            offset += in_addr_len;\n        }\n    } else if ((atyp & ADDRTYPE_MASK) == 3) {\n        // Domain name\n        uint8_t name_len = *(uint8_t *)(buf + offset);\n        if (name_len + 4 <= buf_len) {\n            if (storage != NULL) {\n                char tmp[257] = { 0 };\n                struct cork_ip ip;\n                memcpy(tmp, buf + offset + 1, name_len);\n                if (cork_ip_init(&ip, tmp) != -1) {\n                    if (ip.version == 4) {\n                        struct sockaddr_in *addr = (struct sockaddr_in *)storage;\n                        dns_pton(AF_INET, tmp, &(addr->sin_addr));\n                        addr->sin_port   = *(uint16_t *)(buf + offset + 1 + name_len);\n                        addr->sin_family = AF_INET;\n                    } else if (ip.version == 6) {\n                        struct sockaddr_in6 *addr = (struct sockaddr_in6 *)storage;\n                        dns_pton(AF_INET, tmp, &(addr->sin6_addr));\n                        addr->sin6_port   = *(uint16_t *)(buf + offset + 1 + name_len);\n                        addr->sin6_family = AF_INET6;\n                    }\n                }\n            }\n            if (host != NULL) {\n                memcpy(host, buf + offset + 1, name_len);\n            }\n            offset += 1 + name_len;\n        }\n    } else if ((atyp & ADDRTYPE_MASK) == 4) {\n        // IP V6\n        size_t in6_addr_len = sizeof(struct in6_addr);\n        if (buf_len >= in6_addr_len + 3) {\n            if (storage != NULL) {\n                struct sockaddr_in6 *addr = (struct sockaddr_in6 *)storage;\n                addr->sin6_family = AF_INET6;\n                addr->sin6_addr   = *(struct in6_addr *)(buf + offset);\n                addr->sin6_port   = *(uint16_t *)(buf + offset + in6_addr_len);\n            }\n            if (host != NULL) {\n                dns_ntop(AF_INET6, (const void *)(buf + offset),\n                         host, INET6_ADDRSTRLEN);\n            }\n            offset += in6_addr_len;\n        }\n    }\n\n    if (offset == 1) {\n        LOGE(\"[udp] invalid header with addr type %d\", atyp);\n        return 0;\n    }\n\n    if (port != NULL) {\n        sprintf(port, \"%d\", ntohs(*(uint16_t *)(buf + offset)));\n    }\n    offset += 2;\n\n    return offset;\n}\n\nstatic char *\nget_addr_str(const struct sockaddr *sa)\n{\n    static char s[SS_ADDRSTRLEN];\n    memset(s, 0, SS_ADDRSTRLEN);\n    char addr[INET6_ADDRSTRLEN] = { 0 };\n    char port[PORTSTRLEN]       = { 0 };\n    uint16_t p;\n\n    switch (sa->sa_family) {\n    case AF_INET:\n        dns_ntop(AF_INET, &(((struct sockaddr_in *)sa)->sin_addr),\n                 addr, INET_ADDRSTRLEN);\n        p = ntohs(((struct sockaddr_in *)sa)->sin_port);\n        sprintf(port, \"%d\", p);\n        break;\n\n    case AF_INET6:\n        dns_ntop(AF_INET6, &(((struct sockaddr_in6 *)sa)->sin6_addr),\n                 addr, INET6_ADDRSTRLEN);\n        p = ntohs(((struct sockaddr_in *)sa)->sin_port);\n        sprintf(port, \"%d\", p);\n        break;\n\n    default:\n        strncpy(s, \"Unknown AF\", SS_ADDRSTRLEN);\n    }\n\n    int addr_len = strlen(addr);\n    int port_len = strlen(port);\n    memcpy(s, addr, addr_len);\n    memcpy(s + addr_len + 1, port, port_len);\n    s[addr_len] = ':';\n\n    return s;\n}\n\nint\ncreate_remote_socket(int ipv6)\n{\n    int remote_sock;\n\n    if (ipv6) {\n        // Try to bind IPv6 first\n        struct sockaddr_in6 addr;\n        memset(&addr, 0, sizeof(struct sockaddr_in6));\n        addr.sin6_family = AF_INET6;\n        addr.sin6_addr   = in6addr_any;\n        addr.sin6_port   = 0;\n        remote_sock      = socket(AF_INET6, SOCK_DGRAM, 0);\n        if (remote_sock == -1) {\n            ERROR(\"[udp] cannot create socket\");\n            return -1;\n        }\n        if (bind(remote_sock, (struct sockaddr *)&addr, sizeof(addr)) != 0) {\n            FATAL(\"[udp] cannot bind remote\");\n            return -1;\n        }\n    } else {\n        // Or else bind to IPv4\n        struct sockaddr_in addr;\n        memset(&addr, 0, sizeof(struct sockaddr_in));\n        addr.sin_family      = AF_INET;\n        addr.sin_addr.s_addr = INADDR_ANY;\n        addr.sin_port        = 0;\n        remote_sock          = socket(AF_INET, SOCK_DGRAM, 0);\n        if (remote_sock == -1) {\n            ERROR(\"[udp] cannot create socket\");\n            return -1;\n        }\n\n        if (bind(remote_sock, (struct sockaddr *)&addr, sizeof(addr)) != 0) {\n            FATAL(\"[udp] cannot bind remote\");\n            return -1;\n        }\n    }\n    return remote_sock;\n}\n\nint\ncreate_server_socket(const char *host, const char *port)\n{\n    struct addrinfo hints;\n    struct addrinfo *result, *rp, *ipv4v6bindall;\n    int s, server_sock;\n\n    memset(&hints, 0, sizeof(struct addrinfo));\n    hints.ai_family   = AF_UNSPEC;               /* Return IPv4 and IPv6 choices */\n    hints.ai_socktype = SOCK_DGRAM;              /* We want a UDP socket */\n    hints.ai_flags    = AI_PASSIVE | AI_ADDRCONFIG; /* For wildcard IP address */\n    hints.ai_protocol = IPPROTO_UDP;\n\n    s = getaddrinfo(host, port, &hints, &result);\n    if (s != 0) {\n        LOGE(\"[udp] getaddrinfo: %s\", gai_strerror(s));\n        return -1;\n    }\n\n    rp = result;\n\n    /*\n     * On Linux, with net.ipv6.bindv6only = 0 (the default), getaddrinfo(NULL) with\n     * AI_PASSIVE returns 0.0.0.0 and :: (in this order). AI_PASSIVE was meant to\n     * return a list of addresses to listen on, but it is impossible to listen on\n     * 0.0.0.0 and :: at the same time, if :: implies dualstack mode.\n     */\n    if (!host) {\n        ipv4v6bindall = result;\n\n        /* Loop over all address infos found until a IPV6 address is found. */\n        while (ipv4v6bindall) {\n            if (ipv4v6bindall->ai_family == AF_INET6) {\n                rp = ipv4v6bindall; /* Take first IPV6 address available */\n                break;\n            }\n            ipv4v6bindall = ipv4v6bindall->ai_next; /* Get next address info, if any */\n        }\n    }\n\n    for (/*rp = result*/; rp != NULL; rp = rp->ai_next) {\n        server_sock = socket(rp->ai_family, rp->ai_socktype, rp->ai_protocol);\n        if (server_sock == -1) {\n            continue;\n        }\n\n        if (rp->ai_family == AF_INET6) {\n            int ipv6only = host ? 1 : 0;\n            setsockopt(server_sock, IPPROTO_IPV6, IPV6_V6ONLY, &ipv6only, sizeof(ipv6only));\n        }\n\n        int opt = 1;\n        setsockopt(server_sock, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt));\n#ifdef SO_NOSIGPIPE\n        set_nosigpipe(server_sock);\n#endif\n        int err = set_reuseport(server_sock);\n        if (err == 0) {\n            LOGI(\"udp port reuse enabled\");\n        }\n#ifdef IP_TOS\n        // Set QoS flag\n        int tos = 46;\n        setsockopt(server_sock, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));\n#endif\n\n#ifdef MODULE_REDIR\n        if (setsockopt(server_sock, SOL_IP, IP_TRANSPARENT, &opt, sizeof(opt))) {\n            ERROR(\"[udp] setsockopt IP_TRANSPARENT\");\n            exit(EXIT_FAILURE);\n        }\n        if (setsockopt(server_sock, IPPROTO_IP, IP_RECVORIGDSTADDR, &opt, sizeof(opt))) {\n            FATAL(\"[udp] setsockopt IP_RECVORIGDSTADDR\");\n        }\n#endif\n\n        s = bind(server_sock, rp->ai_addr, rp->ai_addrlen);\n        if (s == 0) {\n            /* We managed to bind successfully! */\n            break;\n        } else {\n            ERROR(\"[udp] bind\");\n        }\n\n        close(server_sock);\n    }\n\n    if (rp == NULL) {\n        LOGE(\"[udp] cannot bind\");\n        return -1;\n    }\n\n    freeaddrinfo(result);\n\n    return server_sock;\n}\n\nremote_ctx_t *\nnew_remote(int fd, server_ctx_t *server_ctx)\n{\n    remote_ctx_t *ctx = ss_malloc(sizeof(remote_ctx_t));\n    memset(ctx, 0, sizeof(remote_ctx_t));\n\n    ctx->fd         = fd;\n    ctx->server_ctx = server_ctx;\n\n    ev_io_init(&ctx->io, remote_recv_cb, fd, EV_READ);\n    ev_timer_init(&ctx->watcher, remote_timeout_cb, server_ctx->timeout,\n                  server_ctx->timeout);\n\n    return ctx;\n}\n\nserver_ctx_t *\nnew_server_ctx(int fd)\n{\n    server_ctx_t *ctx = ss_malloc(sizeof(server_ctx_t));\n    memset(ctx, 0, sizeof(server_ctx_t));\n\n    ctx->fd = fd;\n\n    ev_io_init(&ctx->io, server_recv_cb, fd, EV_READ);\n\n    return ctx;\n}\n\n#ifdef MODULE_REMOTE\nstruct query_ctx *\nnew_query_ctx(char *buf, size_t len)\n{\n    struct query_ctx *ctx = ss_malloc(sizeof(struct query_ctx));\n    memset(ctx, 0, sizeof(struct query_ctx));\n    ctx->buf = ss_malloc(sizeof(buffer_t));\n    balloc(ctx->buf, len);\n    memcpy(ctx->buf->array, buf, len);\n    ctx->buf->len = len;\n    return ctx;\n}\n\nvoid\nclose_and_free_query(EV_P_ struct query_ctx *ctx)\n{\n    if (ctx != NULL) {\n        if (ctx->query != NULL) {\n            resolv_cancel(ctx->query);\n            ctx->query = NULL;\n        }\n        if (ctx->buf != NULL) {\n            bfree(ctx->buf);\n            ss_free(ctx->buf);\n        }\n        ss_free(ctx);\n    }\n}\n\n#endif\n\nvoid\nclose_and_free_remote(EV_P_ remote_ctx_t *ctx)\n{\n    if (ctx != NULL) {\n        ev_timer_stop(EV_A_ & ctx->watcher);\n        ev_io_stop(EV_A_ & ctx->io);\n        close(ctx->fd);\n        ss_free(ctx);\n    }\n}\n\nstatic void\nremote_timeout_cb(EV_P_ ev_timer *watcher, int revents)\n{\n    remote_ctx_t *remote_ctx\n        = cork_container_of(watcher, remote_ctx_t, watcher);\n\n    if (verbose) {\n        LOGI(\"[udp] connection timeout\");\n    }\n\n    char *key = hash_key(remote_ctx->af, &remote_ctx->src_addr);\n    cache_remove(remote_ctx->server_ctx->conn_cache, key, HASH_KEY_LEN);\n}\n\n#ifdef MODULE_REMOTE\nstatic void\nquery_resolve_cb(struct sockaddr *addr, void *data)\n{\n    struct query_ctx *query_ctx = (struct query_ctx *)data;\n    struct ev_loop *loop        = query_ctx->server_ctx->loop;\n\n    if (verbose) {\n        LOGI(\"[udp] udns resolved\");\n    }\n\n    query_ctx->query = NULL;\n\n    if (addr == NULL) {\n        LOGE(\"[udp] udns returned an error\");\n    } else {\n        remote_ctx_t *remote_ctx = query_ctx->remote_ctx;\n        int cache_hit            = 0;\n\n        // Lookup in the conn cache\n        if (remote_ctx == NULL) {\n            char *key = hash_key(AF_UNSPEC, &query_ctx->src_addr);\n            cache_lookup(query_ctx->server_ctx->conn_cache, key, HASH_KEY_LEN, (void *)&remote_ctx);\n        }\n\n        if (remote_ctx == NULL) {\n            int remotefd = create_remote_socket(addr->sa_family == AF_INET6);\n            if (remotefd != -1) {\n                setnonblocking(remotefd);\n#ifdef SO_BROADCAST\n                set_broadcast(remotefd);\n#endif\n#ifdef SO_NOSIGPIPE\n                set_nosigpipe(remotefd);\n#endif\n#ifdef IP_TOS\n                // Set QoS flag\n                int tos = 46;\n                setsockopt(remotefd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));\n#endif\n#ifdef SET_INTERFACE\n                if (query_ctx->server_ctx->iface) {\n                    if (setinterface(remotefd, query_ctx->server_ctx->iface) == -1)\n                        ERROR(\"setinterface\");\n                }\n#endif\n                remote_ctx                  = new_remote(remotefd, query_ctx->server_ctx);\n                remote_ctx->src_addr        = query_ctx->src_addr;\n                remote_ctx->server_ctx      = query_ctx->server_ctx;\n                remote_ctx->addr_header_len = query_ctx->addr_header_len;\n                memcpy(remote_ctx->addr_header, query_ctx->addr_header,\n                       query_ctx->addr_header_len);\n            } else {\n                ERROR(\"[udp] bind() error\");\n            }\n        } else {\n            cache_hit = 1;\n        }\n\n        if (remote_ctx != NULL) {\n            memcpy(&remote_ctx->dst_addr, addr, sizeof(struct sockaddr_storage));\n\n            size_t addr_len = get_sockaddr_len(addr);\n            int s           = sendto(remote_ctx->fd, query_ctx->buf->array, query_ctx->buf->len,\n                                     0, addr, addr_len);\n\n            if (s == -1) {\n                ERROR(\"[udp] sendto_remote\");\n                if (!cache_hit) {\n                    close_and_free_remote(EV_A_ remote_ctx);\n                }\n            } else {\n                if (!cache_hit) {\n                    // Add to conn cache\n                    char *key = hash_key(AF_UNSPEC, &remote_ctx->src_addr);\n                    cache_insert(query_ctx->server_ctx->conn_cache, key, HASH_KEY_LEN, (void *)remote_ctx);\n                    ev_io_start(EV_A_ & remote_ctx->io);\n                    ev_timer_start(EV_A_ & remote_ctx->watcher);\n                }\n            }\n        }\n    }\n\n    // clean up\n    close_and_free_query(EV_A_ query_ctx);\n}\n\n#endif\n\nstatic void\nremote_recv_cb(EV_P_ ev_io *w, int revents)\n{\n    ssize_t r;\n    remote_ctx_t *remote_ctx = (remote_ctx_t *)w;\n    server_ctx_t *server_ctx = remote_ctx->server_ctx;\n\n    // server has been closed\n    if (server_ctx == NULL) {\n        LOGE(\"[udp] invalid server\");\n        close_and_free_remote(EV_A_ remote_ctx);\n        return;\n    }\n\n    struct sockaddr_storage src_addr;\n    socklen_t src_addr_len = sizeof(struct sockaddr_storage);\n    memset(&src_addr, 0, src_addr_len);\n\n    buffer_t *buf = ss_malloc(sizeof(buffer_t));\n    balloc(buf, buf_size);\n\n    // recv\n    r = recvfrom(remote_ctx->fd, buf->array, buf_size, 0, (struct sockaddr *)&src_addr, &src_addr_len);\n\n    if (r == -1) {\n        // error on recv\n        // simply drop that packet\n        ERROR(\"[udp] remote_recv_recvfrom\");\n        goto CLEAN_UP;\n    } else if (r > packet_size) {\n        LOGE(\"[udp] remote_recv_recvfrom fragmentation\");\n        goto CLEAN_UP;\n    }\n\n    buf->len = r;\n\n#ifdef MODULE_LOCAL\n    int err = ss_decrypt_all(buf, server_ctx->method, 0, buf_size);\n    if (err) {\n        // drop the packet silently\n        goto CLEAN_UP;\n    }\n\n    //SSR beg\n    if (server_ctx->protocol_plugin) {\n        obfs_class *protocol_plugin = server_ctx->protocol_plugin;\n        if (protocol_plugin->client_udp_post_decrypt) {\n            buf->len = protocol_plugin->client_udp_post_decrypt(server_ctx->protocol, &buf->array, buf->len, &buf->capacity);\n            if ((int)buf->len < 0) {\n                LOGE(\"client_udp_post_decrypt\");\n                close_and_free_remote(EV_A_ remote_ctx);\n                return;\n            }\n            if ( buf->len == 0 )\n                return;\n        }\n    }\n    // SSR end\n\n#ifdef MODULE_REDIR\n    struct sockaddr_storage dst_addr;\n    memset(&dst_addr, 0, sizeof(struct sockaddr_storage));\n    int len = parse_udprealy_header(buf->array, buf->len, NULL, NULL, &dst_addr);\n\n    if (dst_addr.ss_family != AF_INET && dst_addr.ss_family != AF_INET6) {\n        LOGI(\"[udp] ss-redir does not support domain name\");\n        goto CLEAN_UP;\n    }\n\n    if (verbose) {\n        char src[SS_ADDRSTRLEN];\n        char dst[SS_ADDRSTRLEN];\n        strcpy(src, get_addr_str((struct sockaddr *)&src_addr));\n        strcpy(dst, get_addr_str((struct sockaddr *)&dst_addr));\n        LOGI(\"[udp] recv %s via %s\", dst, src);\n    }\n#else\n    int len = parse_udprealy_header(buf->array, buf->len, NULL, NULL, NULL);\n#endif\n\n    if (len == 0) {\n        LOGI(\"[udp] error in parse header\");\n        // error in parse header\n        goto CLEAN_UP;\n    }\n\n    // server may return using a different address type other than the type we\n    // have used during sending\n#if defined(MODULE_TUNNEL) || defined(MODULE_REDIR)\n    // Construct packet\n    buf->len -= len;\n    memmove(buf->array, buf->array + len, buf->len);\n#else\n#ifdef ANDROID\n    rx += buf->len;\n#endif\n    // Construct packet\n    brealloc(buf, buf->len + 3, buf_size);\n    memmove(buf->array + 3, buf->array, buf->len);\n    memset(buf->array, 0, 3);\n    buf->len += 3;\n#endif\n\n#endif\n\n#ifdef MODULE_REMOTE\n\n    rx += buf->len;\n\n    char addr_header_buf[512];\n    char *addr_header   = remote_ctx->addr_header;\n    int addr_header_len = remote_ctx->addr_header_len;\n\n    if (remote_ctx->af == AF_INET || remote_ctx->af == AF_INET6) {\n        addr_header_len = construct_udprealy_header(&src_addr, addr_header_buf);\n        addr_header     = addr_header_buf;\n    }\n\n    // Construct packet\n    brealloc(buf, buf->len + addr_header_len, buf_size);\n    memmove(buf->array + addr_header_len, buf->array, buf->len);\n    memcpy(buf->array, addr_header, addr_header_len);\n    buf->len += addr_header_len;\n\n    int err = ss_encrypt_all(buf, server_ctx->method, 0, buf_size);\n    if (err) {\n        // drop the packet silently\n        goto CLEAN_UP;\n    }\n\n#endif\n\n    if (buf->len > packet_size) {\n        LOGE(\"[udp] remote_recv_sendto fragmentation\");\n        goto CLEAN_UP;\n    }\n\n    size_t remote_src_addr_len = get_sockaddr_len((struct sockaddr *)&remote_ctx->src_addr);\n\n#ifdef MODULE_REDIR\n\n    size_t remote_dst_addr_len = get_sockaddr_len((struct sockaddr *)&dst_addr);\n\n    int src_fd = socket(remote_ctx->src_addr.ss_family, SOCK_DGRAM, 0);\n    if (src_fd < 0) {\n        ERROR(\"[udp] remote_recv_socket\");\n        goto CLEAN_UP;\n    }\n    int opt = 1;\n    if (setsockopt(src_fd, SOL_IP, IP_TRANSPARENT, &opt, sizeof(opt))) {\n        ERROR(\"[udp] remote_recv_setsockopt\");\n        close(src_fd);\n        goto CLEAN_UP;\n    }\n    if (setsockopt(src_fd, SOL_SOCKET, SO_REUSEADDR, &opt, sizeof(opt))) {\n        ERROR(\"[udp] remote_recv_setsockopt\");\n        close(src_fd);\n        goto CLEAN_UP;\n    }\n#ifdef IP_TOS\n    // Set QoS flag\n    int tos = 46;\n    setsockopt(src_fd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));\n#endif\n    if (bind(src_fd, (struct sockaddr *)&dst_addr, remote_dst_addr_len) != 0) {\n        ERROR(\"[udp] remote_recv_bind\");\n        close(src_fd);\n        goto CLEAN_UP;\n    }\n\n    int s = sendto(src_fd, buf->array, buf->len, 0,\n                   (struct sockaddr *)&remote_ctx->src_addr, remote_src_addr_len);\n    if (s == -1) {\n        ERROR(\"[udp] remote_recv_sendto\");\n        close(src_fd);\n        goto CLEAN_UP;\n    }\n    close(src_fd);\n\n#else\n\n    int s = sendto(server_ctx->fd, buf->array, buf->len, 0,\n                   (struct sockaddr *)&remote_ctx->src_addr, remote_src_addr_len);\n    if (s == -1) {\n        ERROR(\"[udp] remote_recv_sendto\");\n        goto CLEAN_UP;\n    }\n\n#endif\n\n    // handle the UDP packet successfully,\n    // triger the timer\n    ev_timer_again(EV_A_ & remote_ctx->watcher);\n\nCLEAN_UP:\n\n    bfree(buf);\n    ss_free(buf);\n}\n\nstatic void\nserver_recv_cb(EV_P_ ev_io *w, int revents)\n{\n    server_ctx_t *server_ctx = (server_ctx_t *)w;\n    struct sockaddr_storage src_addr;\n    memset(&src_addr, 0, sizeof(struct sockaddr_storage));\n\n    buffer_t *buf = ss_malloc(sizeof(buffer_t));\n    balloc(buf, buf_size);\n\n    socklen_t src_addr_len = sizeof(struct sockaddr_storage);\n    unsigned int offset    = 0;\n\n#ifdef MODULE_REDIR\n    char control_buffer[64] = { 0 };\n    struct msghdr msg;\n    memset(&msg, 0, sizeof(struct msghdr));\n    struct iovec iov[1];\n    struct sockaddr_storage dst_addr;\n    memset(&dst_addr, 0, sizeof(struct sockaddr_storage));\n\n    msg.msg_name       = &src_addr;\n    msg.msg_namelen    = src_addr_len;\n    msg.msg_control    = control_buffer;\n    msg.msg_controllen = sizeof(control_buffer);\n\n    iov[0].iov_base = buf->array;\n    iov[0].iov_len  = buf_size;\n    msg.msg_iov     = iov;\n    msg.msg_iovlen  = 1;\n\n    buf->len = recvmsg(server_ctx->fd, &msg, 0);\n    if (buf->len == -1) {\n        ERROR(\"[udp] server_recvmsg\");\n        goto CLEAN_UP;\n    } else if (buf->len > packet_size) {\n        ERROR(\"[udp] UDP server_recv_recvmsg fragmentation\");\n        goto CLEAN_UP;\n    }\n\n    if (get_dstaddr(&msg, &dst_addr)) {\n        LOGE(\"[udp] unable to get dest addr\");\n        goto CLEAN_UP;\n    }\n\n    src_addr_len = msg.msg_namelen;\n#else\n    ssize_t r;\n    r = recvfrom(server_ctx->fd, buf->array, buf_size,\n                 0, (struct sockaddr *)&src_addr, &src_addr_len);\n\n    if (r == -1) {\n        // error on recv\n        // simply drop that packet\n        ERROR(\"[udp] server_recv_recvfrom\");\n        goto CLEAN_UP;\n    } else if (r > packet_size) {\n        ERROR(\"[udp] server_recv_recvfrom fragmentation\");\n        goto CLEAN_UP;\n    }\n\n    buf->len = r;\n#endif\n\n#ifdef MODULE_REMOTE\n    tx += buf->len;\n\n    int err = ss_decrypt_all(buf, server_ctx->method, server_ctx->auth, buf_size);\n    if (err) {\n        // drop the packet silently\n        goto CLEAN_UP;\n    }\n#endif\n\n#ifdef MODULE_LOCAL\n#if !defined(MODULE_TUNNEL) && !defined(MODULE_REDIR)\n#ifdef ANDROID\n    tx += buf->len;\n#endif\n    uint8_t frag = *(uint8_t *)(buf->array + 2);\n    offset += 3;\n#endif\n#endif\n\n    /*\n     *\n     * SOCKS5 UDP Request\n     * +----+------+------+----------+----------+----------+\n     * |RSV | FRAG | ATYP | DST.ADDR | DST.PORT |   DATA   |\n     * +----+------+------+----------+----------+----------+\n     * | 2  |  1   |  1   | Variable |    2     | Variable |\n     * +----+------+------+----------+----------+----------+\n     *\n     * SOCKS5 UDP Response\n     * +----+------+------+----------+----------+----------+\n     * |RSV | FRAG | ATYP | DST.ADDR | DST.PORT |   DATA   |\n     * +----+------+------+----------+----------+----------+\n     * | 2  |  1   |  1   | Variable |    2     | Variable |\n     * +----+------+------+----------+----------+----------+\n     *\n     * shadowsocks UDP Request (before encrypted)\n     * +------+----------+----------+----------+-------------+\n     * | ATYP | DST.ADDR | DST.PORT |   DATA   |  HMAC-SHA1  |\n     * +------+----------+----------+----------+-------------+\n     * |  1   | Variable |    2     | Variable |     10      |\n     * +------+----------+----------+----------+-------------+\n     *\n     * If ATYP & ONETIMEAUTH_FLAG(0x10) != 0, Authentication (HMAC-SHA1) is enabled.\n     *\n     * The key of HMAC-SHA1 is (IV + KEY) and the input is the whole packet.\n     * The output of HMAC-SHA is truncated to 10 bytes (leftmost bits).\n     *\n     * shadowsocks UDP Response (before encrypted)\n     * +------+----------+----------+----------+\n     * | ATYP | DST.ADDR | DST.PORT |   DATA   |\n     * +------+----------+----------+----------+\n     * |  1   | Variable |    2     | Variable |\n     * +------+----------+----------+----------+\n     *\n     * shadowsocks UDP Request and Response (after encrypted)\n     * +-------+--------------+\n     * |   IV  |    PAYLOAD   |\n     * +-------+--------------+\n     * | Fixed |   Variable   |\n     * +-------+--------------+\n     *\n     */\n\n#ifdef MODULE_REDIR\n    if (verbose) {\n        char src[SS_ADDRSTRLEN];\n        char dst[SS_ADDRSTRLEN];\n        strcpy(src, get_addr_str((struct sockaddr *)&src_addr));\n        strcpy(dst, get_addr_str((struct sockaddr *)&dst_addr));\n        LOGI(\"[udp] redir to %s from %s\", dst, src);\n    }\n\n    char addr_header[512] = { 0 };\n    int addr_header_len   = construct_udprealy_header(&dst_addr, addr_header);\n\n    if (addr_header_len == 0) {\n        LOGE(\"[udp] failed to parse tproxy addr\");\n        goto CLEAN_UP;\n    }\n\n    // reconstruct the buffer\n    brealloc(buf, buf->len + addr_header_len, buf_size);\n    memmove(buf->array + addr_header_len, buf->array, buf->len);\n    memcpy(buf->array, addr_header, addr_header_len);\n    buf->len += addr_header_len;\n\n#elif MODULE_TUNNEL\n\n    char addr_header[512] = { 0 };\n    char *host            = server_ctx->tunnel_addr.host;\n    char *port            = server_ctx->tunnel_addr.port;\n    uint16_t port_num     = (uint16_t)atoi(port);\n    uint16_t port_net_num = htons(port_num);\n    int addr_header_len   = 0;\n\n    struct cork_ip ip;\n    if (cork_ip_init(&ip, host) != -1) {\n        if (ip.version == 4) {\n            // send as IPv4\n            struct in_addr host_addr;\n            memset(&host_addr, 0, sizeof(struct in_addr));\n            int host_len = sizeof(struct in_addr);\n\n            if (dns_pton(AF_INET, host, &host_addr) == -1) {\n                FATAL(\"IP parser error\");\n            }\n            addr_header[addr_header_len++] = 1;\n            memcpy(addr_header + addr_header_len, &host_addr, host_len);\n            addr_header_len += host_len;\n        } else if (ip.version == 6) {\n            // send as IPv6\n            struct in6_addr host_addr;\n            memset(&host_addr, 0, sizeof(struct in6_addr));\n            int host_len = sizeof(struct in6_addr);\n\n            if (dns_pton(AF_INET6, host, &host_addr) == -1) {\n                FATAL(\"IP parser error\");\n            }\n            addr_header[addr_header_len++] = 4;\n            memcpy(addr_header + addr_header_len, &host_addr, host_len);\n            addr_header_len += host_len;\n        } else {\n            FATAL(\"IP parser error\");\n        }\n    } else {\n        // send as domain\n        int host_len = strlen(host);\n\n        addr_header[addr_header_len++] = 3;\n        addr_header[addr_header_len++] = host_len;\n        memcpy(addr_header + addr_header_len, host, host_len);\n        addr_header_len += host_len;\n    }\n    memcpy(addr_header + addr_header_len, &port_net_num, 2);\n    addr_header_len += 2;\n\n    // reconstruct the buffer\n    brealloc(buf, buf->len + addr_header_len, buf_size);\n    memmove(buf->array + addr_header_len, buf->array, buf->len);\n    memcpy(buf->array, addr_header, addr_header_len);\n    buf->len += addr_header_len;\n\n#else\n\n    char host[257] = { 0 };\n    char port[64]  = { 0 };\n    struct sockaddr_storage dst_addr;\n    memset(&dst_addr, 0, sizeof(struct sockaddr_storage));\n\n    int addr_header_len = parse_udprealy_header(buf->array + offset, buf->len - offset,\n                                                host, port, &dst_addr);\n    if (addr_header_len == 0) {\n        // error in parse header\n        goto CLEAN_UP;\n    }\n\n    char *addr_header = buf->array + offset;\n#endif\n\n#ifdef MODULE_LOCAL\n    char *key = hash_key(server_ctx->remote_addr->sa_family, &src_addr);\n#else\n    char *key = hash_key(dst_addr.ss_family, &src_addr);\n#endif\n\n    struct cache *conn_cache = server_ctx->conn_cache;\n\n    remote_ctx_t *remote_ctx = NULL;\n    cache_lookup(conn_cache, key, HASH_KEY_LEN, (void *)&remote_ctx);\n\n    if (remote_ctx != NULL) {\n        if (sockaddr_cmp(&src_addr, &remote_ctx->src_addr, sizeof(src_addr))) {\n            remote_ctx = NULL;\n        }\n    }\n\n    // reset the timer\n    if (remote_ctx != NULL) {\n        ev_timer_again(EV_A_ & remote_ctx->watcher);\n    }\n\n    if (remote_ctx == NULL) {\n        if (verbose) {\n#ifdef MODULE_REDIR\n            char src[SS_ADDRSTRLEN];\n            char dst[SS_ADDRSTRLEN];\n            strcpy(src, get_addr_str((struct sockaddr *)&src_addr));\n            strcpy(dst, get_addr_str((struct sockaddr *)&dst_addr));\n            LOGI(\"[udp] cache miss: %s <-> %s\", dst, src);\n#else\n            LOGI(\"[udp] cache miss: %s:%s <-> %s\", host, port,\n                 get_addr_str((struct sockaddr *)&src_addr));\n#endif\n        }\n    } else {\n        if (verbose) {\n#ifdef MODULE_REDIR\n            char src[SS_ADDRSTRLEN];\n            char dst[SS_ADDRSTRLEN];\n            strcpy(src, get_addr_str((struct sockaddr *)&src_addr));\n            strcpy(dst, get_addr_str((struct sockaddr *)&dst_addr));\n            LOGI(\"[udp] cache hit: %s <-> %s\", dst, src);\n#else\n            LOGI(\"[udp] cache hit: %s:%s <-> %s\", host, port,\n                 get_addr_str((struct sockaddr *)&src_addr));\n#endif\n        }\n    }\n\n#ifdef MODULE_LOCAL\n\n#if !defined(MODULE_TUNNEL) && !defined(MODULE_REDIR)\n    if (frag) {\n        LOGE(\"[udp] drop a message since frag is not 0, but %d\", frag);\n        goto CLEAN_UP;\n    }\n#endif\n\n    const struct sockaddr *remote_addr = server_ctx->remote_addr;\n    const int remote_addr_len          = server_ctx->remote_addr_len;\n\n    if (remote_ctx == NULL) {\n        // Bind to any port\n        int remotefd = create_remote_socket(remote_addr->sa_family == AF_INET6);\n        if (remotefd < 0) {\n            ERROR(\"[udp] udprelay bind() error\");\n            goto CLEAN_UP;\n        }\n        setnonblocking(remotefd);\n\n#ifdef SO_NOSIGPIPE\n        set_nosigpipe(remotefd);\n#endif\n#ifdef IP_TOS\n        // Set QoS flag\n        int tos = 46;\n        setsockopt(remotefd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));\n#endif\n#ifdef SET_INTERFACE\n        if (server_ctx->iface) {\n            if (setinterface(remotefd, server_ctx->iface) == -1)\n                ERROR(\"setinterface\");\n        }\n#endif\n\n#ifdef ANDROID\n        if (vpn) {\n            if (protect_socket(remotefd) == -1) {\n                ERROR(\"protect_socket\");\n                close(remotefd);\n                goto CLEAN_UP;\n            }\n        }\n#endif\n\n        // Init remote_ctx\n        remote_ctx                  = new_remote(remotefd, server_ctx);\n        remote_ctx->src_addr        = src_addr;\n        remote_ctx->af              = remote_addr->sa_family;\n        remote_ctx->addr_header_len = addr_header_len;\n        memcpy(remote_ctx->addr_header, addr_header, addr_header_len);\n\n        // Add to conn cache\n        cache_insert(conn_cache, key, HASH_KEY_LEN, (void *)remote_ctx);\n\n        // Start remote io\n        ev_io_start(EV_A_ & remote_ctx->io);\n        ev_timer_start(EV_A_ & remote_ctx->watcher);\n    }\n\n    if (offset > 0) {\n        buf->len -= offset;\n        memmove(buf->array, buf->array + offset, buf->len);\n    }\n\n    if (server_ctx->auth) {\n        buf->array[0] |= ONETIMEAUTH_FLAG;\n    }\n\n    // SSR beg\n    if (server_ctx->protocol_plugin) {\n        obfs_class *protocol_plugin = server_ctx->protocol_plugin;\n        if (protocol_plugin->client_udp_pre_encrypt) {\n            buf->len = protocol_plugin->client_udp_pre_encrypt(server_ctx->protocol, &buf->array, buf->len, &buf->capacity);\n        }\n    }\n    //SSR end\n\n    int err = ss_encrypt_all(buf, server_ctx->method, server_ctx->auth, buf->len);\n\n    if (err) {\n        // drop the packet silently\n        goto CLEAN_UP;\n    }\n\n    if (buf->len > packet_size) {\n        LOGE(\"[udp] server_recv_sendto fragmentation\");\n        goto CLEAN_UP;\n    }\n\n    int s = sendto(remote_ctx->fd, buf->array, buf->len, 0, remote_addr, remote_addr_len);\n\n    if (s == -1) {\n        ERROR(\"[udp] server_recv_sendto\");\n    }\n\n#else\n\n    int cache_hit  = 0;\n    int need_query = 0;\n\n    if (buf->len - addr_header_len > packet_size) {\n        LOGE(\"[udp] server_recv_sendto fragmentation\");\n        goto CLEAN_UP;\n    }\n\n    if (remote_ctx != NULL) {\n        cache_hit = 1;\n        // detect destination mismatch\n        if (remote_ctx->addr_header_len != addr_header_len\n            || memcmp(addr_header, remote_ctx->addr_header, addr_header_len) != 0) {\n            if (dst_addr.ss_family != AF_INET && dst_addr.ss_family != AF_INET6) {\n                need_query = 1;\n            }\n        } else {\n            memcpy(&dst_addr, &remote_ctx->dst_addr, sizeof(struct sockaddr_storage));\n        }\n    } else {\n        if (dst_addr.ss_family == AF_INET || dst_addr.ss_family == AF_INET6) {\n            int remotefd = create_remote_socket(dst_addr.ss_family == AF_INET6);\n            if (remotefd != -1) {\n                setnonblocking(remotefd);\n#ifdef SO_BROADCAST\n                set_broadcast(remotefd);\n#endif\n#ifdef SO_NOSIGPIPE\n                set_nosigpipe(remotefd);\n#endif\n#ifdef IP_TOS\n                // Set QoS flag\n                int tos = 46;\n                setsockopt(remotefd, IPPROTO_IP, IP_TOS, &tos, sizeof(tos));\n#endif\n#ifdef SET_INTERFACE\n                if (server_ctx->iface) {\n                    if (setinterface(remotefd, server_ctx->iface) == -1)\n                        ERROR(\"setinterface\");\n                }\n#endif\n                remote_ctx                  = new_remote(remotefd, server_ctx);\n                remote_ctx->src_addr        = src_addr;\n                remote_ctx->server_ctx      = server_ctx;\n                remote_ctx->addr_header_len = addr_header_len;\n                memcpy(remote_ctx->addr_header, addr_header, addr_header_len);\n                memcpy(&remote_ctx->dst_addr, &dst_addr, sizeof(struct sockaddr_storage));\n            } else {\n                ERROR(\"[udp] bind() error\");\n                goto CLEAN_UP;\n            }\n        }\n    }\n\n    if (remote_ctx != NULL && !need_query) {\n        size_t addr_len = get_sockaddr_len((struct sockaddr *)&dst_addr);\n        int s           = sendto(remote_ctx->fd, buf->array + addr_header_len,\n                                 buf->len - addr_header_len, 0,\n                                 (struct sockaddr *)&dst_addr, addr_len);\n\n        if (s == -1) {\n            ERROR(\"[udp] sendto_remote\");\n            if (!cache_hit) {\n                close_and_free_remote(EV_A_ remote_ctx);\n            }\n        } else {\n            if (!cache_hit) {\n                // Add to conn cache\n                remote_ctx->af = dst_addr.ss_family;\n                char *key = hash_key(remote_ctx->af, &remote_ctx->src_addr);\n                cache_insert(server_ctx->conn_cache, key, HASH_KEY_LEN, (void *)remote_ctx);\n\n                ev_io_start(EV_A_ & remote_ctx->io);\n                ev_timer_start(EV_A_ & remote_ctx->watcher);\n            }\n        }\n    } else {\n        struct addrinfo hints;\n        memset(&hints, 0, sizeof(struct addrinfo));\n        hints.ai_family   = AF_UNSPEC;\n        hints.ai_socktype = SOCK_DGRAM;\n        hints.ai_protocol = IPPROTO_UDP;\n\n        struct query_ctx *query_ctx = new_query_ctx(buf->array + addr_header_len,\n                                                    buf->len - addr_header_len);\n        query_ctx->server_ctx      = server_ctx;\n        query_ctx->addr_header_len = addr_header_len;\n        query_ctx->src_addr        = src_addr;\n        memcpy(query_ctx->addr_header, addr_header, addr_header_len);\n\n        if (need_query) {\n            query_ctx->remote_ctx = remote_ctx;\n        }\n\n        struct ResolvQuery *query = resolv_query(host, query_resolve_cb,\n                                                 NULL, query_ctx, htons(atoi(port)));\n        if (query == NULL) {\n            ERROR(\"[udp] unable to create DNS query\");\n            close_and_free_query(EV_A_ query_ctx);\n            goto CLEAN_UP;\n        }\n        query_ctx->query = query;\n    }\n#endif\n\nCLEAN_UP:\n    bfree(buf);\n    ss_free(buf);\n}\n\nvoid\nfree_cb(void *key, void *element)\n{\n    remote_ctx_t *remote_ctx = (remote_ctx_t *)element;\n\n    if (verbose) {\n        LOGI(\"[udp] one connection freed\");\n    }\n\n    close_and_free_remote(EV_DEFAULT, remote_ctx);\n}\n\nint\ninit_udprelay(const char *server_host, const char *server_port,\n#ifdef MODULE_LOCAL\n              const struct sockaddr *remote_addr, const int remote_addr_len,\n#ifdef MODULE_TUNNEL\n              const ss_addr_t tunnel_addr,\n#endif\n#endif\n              int mtu, int method, int auth, int timeout, const char *iface, const char *protocol, const char *protocol_param)\n{\n    // Initialize ev loop\n    struct ev_loop *loop = EV_DEFAULT;\n\n    // Initialize MTU\n    if (mtu > 0) {\n        packet_size = mtu - 1 - 28 - 2 - 64;\n        buf_size    = packet_size * 2;\n    }\n\n    // Initialize cache\n    struct cache *conn_cache;\n    cache_create(&conn_cache, MAX_UDP_CONN_NUM, free_cb);\n\n    // ////////////////////////////////////////////////\n    // Setup server context\n\n    // Bind to port\n    int serverfd = create_server_socket(server_host, server_port);\n    if (serverfd < 0) {\n        FATAL(\"[udp] bind() error\");\n    }\n    setnonblocking(serverfd);\n    if (protocol != NULL && strcmp(protocol, \"verify_sha1\") == 0) {\n        auth = 1;\n        protocol = NULL;\n    }\n\n    server_ctx_t *server_ctx = new_server_ctx(serverfd);\n#ifdef MODULE_REMOTE\n    server_ctx->loop = loop;\n#endif\n    server_ctx->auth       = auth;\n    server_ctx->timeout    = max(timeout, MIN_UDP_TIMEOUT);\n    server_ctx->method     = method;\n    server_ctx->iface      = iface;\n    server_ctx->conn_cache = conn_cache;\n#ifdef MODULE_LOCAL\n    server_ctx->remote_addr     = remote_addr;\n    server_ctx->remote_addr_len = remote_addr_len;\n    //SSR beg\n    server_ctx->protocol_plugin = new_obfs_class((char *)protocol);\n    if (server_ctx->protocol_plugin) {\n        server_ctx->protocol = server_ctx->protocol_plugin->new_obfs();\n        server_ctx->protocol_global = server_ctx->protocol_plugin->init_data();\n    }\n\n    server_info _server_info;\n    memset(&_server_info, 0, sizeof(server_info));\n    strcpy(_server_info.host, inet_ntoa(((struct sockaddr_in*)remote_addr)->sin_addr));\n    _server_info.port = ((struct sockaddr_in*)remote_addr)->sin_port;\n    _server_info.port = _server_info.port >> 8 | _server_info.port << 8;\n    _server_info.g_data = server_ctx->protocol_global;\n    _server_info.param = (char *)protocol_param;\n    _server_info.key = enc_get_key();\n    _server_info.key_len = enc_get_key_len();\n\n    if (server_ctx->protocol_plugin)\n        server_ctx->protocol_plugin->set_server_info(server_ctx->protocol, &_server_info);\n    //SSR end\n#ifdef MODULE_TUNNEL\n    server_ctx->tunnel_addr = tunnel_addr;\n#endif\n#endif\n\n    ev_io_start(loop, &server_ctx->io);\n\n    server_ctx_list[server_num++] = server_ctx;\n\n    return 0;\n}\n\nvoid\nfree_udprelay()\n{\n    struct ev_loop *loop = EV_DEFAULT;\n    while (server_num-- > 0) {\n        server_ctx_t *server_ctx = server_ctx_list[server_num];\n\n#ifdef MODULE_LOCAL\n        //SSR beg\n        if (server_ctx->protocol_plugin) {\n            server_ctx->protocol_plugin->dispose(server_ctx->protocol);\n            server_ctx->protocol = NULL;\n            free_obfs_class(server_ctx->protocol_plugin);\n            server_ctx->protocol_plugin = NULL;\n        }\n        //SSR end\n#endif\n\n        ev_io_stop(loop, &server_ctx->io);\n        close(server_ctx->fd);\n        cache_delete(server_ctx->conn_cache, 0);\n        ss_free(server_ctx);\n        server_ctx_list[server_num] = NULL;\n    }\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/udprelay.h",
    "content": "/*\n * udprelay.h - Define UDP relay's buffers and callbacks\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifndef _UDPRELAY_H\n#define _UDPRELAY_H\n\n#include <ev.h>\n#include <time.h>\n\n#include \"encrypt.h\"\n#include \"jconf.h\"\n#include \"obfs.h\"\n\n#ifdef MODULE_REMOTE\n#include \"resolv.h\"\n#endif\n\n#include \"cache.h\"\n\n#include \"common.h\"\n\n#define MAX_UDP_PACKET_SIZE (65507)\n\n#define DEFAULT_PACKET_SIZE 1397 // 1492 - 1 - 28 - 2 - 64 = 1397, the default MTU for UDP relay\n\ntypedef struct server_ctx {\n    ev_io io;\n    int fd;\n    int method;\n    int auth;\n    int timeout;\n    const char *iface;\n    struct cache *conn_cache;\n#ifdef MODULE_LOCAL\n    const struct sockaddr *remote_addr;\n    int remote_addr_len;\n#ifdef MODULE_TUNNEL\n    ss_addr_t tunnel_addr;\n#endif\n#endif\n#ifdef MODULE_REMOTE\n    struct ev_loop *loop;\n#endif\n    // SSR\n    obfs *protocol;\n    obfs_class *protocol_plugin;\n    void *protocol_global;\n} server_ctx_t;\n\n#ifdef MODULE_REMOTE\ntypedef struct query_ctx {\n    struct ResolvQuery *query;\n    struct sockaddr_storage src_addr;\n    buffer_t *buf;\n    int addr_header_len;\n    char addr_header[384];\n    struct server_ctx *server_ctx;\n    struct remote_ctx *remote_ctx;\n} query_ctx_t;\n#endif\n\ntypedef struct remote_ctx {\n    ev_io io;\n    ev_timer watcher;\n    int af;\n    int fd;\n    int addr_header_len;\n    char addr_header[384];\n    struct sockaddr_storage src_addr;\n#ifdef MODULE_REMOTE\n    struct sockaddr_storage dst_addr;\n#endif\n    struct server_ctx *server_ctx;\n} remote_ctx_t;\n\n#endif // _UDPRELAY_H\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/uthash.h",
    "content": "/*\nCopyright (c) 2003-2016, Troy D. Hanson     http://troydhanson.github.com/uthash/\nAll rights reserved.\n\nRedistribution and use in source and binary forms, with or without\nmodification, are permitted provided that the following conditions are met:\n\n    * Redistributions of source code must retain the above copyright\n      notice, this list of conditions and the following disclaimer.\n\nTHIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS\nIS\" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED\nTO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A\nPARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER\nOR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,\nEXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,\nPROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR\nPROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF\nLIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING\nNEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS\nSOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.\n*/\n\n#ifndef UTHASH_H\n#define UTHASH_H\n\n#define UTHASH_VERSION 2.0.1\n\n#include <string.h>   /* memcmp,strlen */\n#include <stddef.h>   /* ptrdiff_t */\n#include <stdlib.h>   /* exit() */\n\n/* These macros use decltype or the earlier __typeof GNU extension.\n   As decltype is only available in newer compilers (VS2010 or gcc 4.3+\n   when compiling c++ source) this code uses whatever method is needed\n   or, for VS2008 where neither is available, uses casting workarounds. */\n#if defined(_MSC_VER)   /* MS compiler */\n#if _MSC_VER >= 1600 && defined(__cplusplus)  /* VS2010 or newer in C++ mode */\n#define DECLTYPE(x) (decltype(x))\n#else                   /* VS2008 or older (or VS2010 in C mode) */\n#define NO_DECLTYPE\n#define DECLTYPE(x)\n#endif\n#elif defined(__BORLANDC__) || defined(__LCC__) || defined(__WATCOMC__)\n#define NO_DECLTYPE\n#define DECLTYPE(x)\n#else                   /* GNU, Sun and other compilers */\n#define DECLTYPE(x) (__typeof(x))\n#endif\n\n#ifdef NO_DECLTYPE\n#define DECLTYPE_ASSIGN(dst,src)                                                 \\\ndo {                                                                             \\\n  char **_da_dst = (char**)(&(dst));                                             \\\n  *_da_dst = (char*)(src);                                                       \\\n} while (0)\n#else\n#define DECLTYPE_ASSIGN(dst,src)                                                 \\\ndo {                                                                             \\\n  (dst) = DECLTYPE(dst)(src);                                                    \\\n} while (0)\n#endif\n\n/* a number of the hash function use uint32_t which isn't defined on Pre VS2010 */\n#if defined(_WIN32)\n#if defined(_MSC_VER) && _MSC_VER >= 1600\n#include <stdint.h>\n#elif defined(__WATCOMC__) || defined(__MINGW32__) || defined(__CYGWIN__)\n#include <stdint.h>\n#else\ntypedef unsigned int uint32_t;\ntypedef unsigned char uint8_t;\n#endif\n#elif defined(__GNUC__) && !defined(__VXWORKS__)\n#include <stdint.h>\n#else\ntypedef unsigned int uint32_t;\ntypedef unsigned char uint8_t;\n#endif\n\n#ifndef uthash_fatal\n#define uthash_fatal(msg) exit(-1)        /* fatal error (out of memory,etc) */\n#endif\n#ifndef uthash_malloc\n#define uthash_malloc(sz) malloc(sz)      /* malloc fcn                      */\n#endif\n#ifndef uthash_free\n#define uthash_free(ptr,sz) free(ptr)     /* free fcn                        */\n#endif\n#ifndef uthash_strlen\n#define uthash_strlen(s) strlen(s)\n#endif\n#ifndef uthash_memcmp\n#define uthash_memcmp(a,b,n) memcmp(a,b,n)\n#endif\n\n#ifndef uthash_noexpand_fyi\n#define uthash_noexpand_fyi(tbl)          /* can be defined to log noexpand  */\n#endif\n#ifndef uthash_expand_fyi\n#define uthash_expand_fyi(tbl)            /* can be defined to log expands   */\n#endif\n\n/* initial number of buckets */\n#define HASH_INITIAL_NUM_BUCKETS 32U     /* initial number of buckets        */\n#define HASH_INITIAL_NUM_BUCKETS_LOG2 5U /* lg2 of initial number of buckets */\n#define HASH_BKT_CAPACITY_THRESH 10U     /* expand when bucket count reaches */\n\n/* calculate the element whose hash handle address is hhp */\n#define ELMT_FROM_HH(tbl,hhp) ((void*)(((char*)(hhp)) - ((tbl)->hho)))\n/* calculate the hash handle from element address elp */\n#define HH_FROM_ELMT(tbl,elp) ((UT_hash_handle *)(((char*)(elp)) + ((tbl)->hho)))\n\n#define HASH_VALUE(keyptr,keylen,hashv)                                          \\\ndo {                                                                             \\\n  HASH_FCN(keyptr, keylen, hashv);                                               \\\n} while (0)\n\n#define HASH_FIND_BYHASHVALUE(hh,head,keyptr,keylen,hashval,out)                 \\\ndo {                                                                             \\\n  (out) = NULL;                                                                  \\\n  if (head) {                                                                    \\\n    unsigned _hf_bkt;                                                            \\\n    HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _hf_bkt);                  \\\n    if (HASH_BLOOM_TEST((head)->hh.tbl, hashval) != 0) {                         \\\n      HASH_FIND_IN_BKT((head)->hh.tbl, hh, (head)->hh.tbl->buckets[ _hf_bkt ], keyptr, keylen, hashval, out); \\\n    }                                                                            \\\n  }                                                                              \\\n} while (0)\n\n#define HASH_FIND(hh,head,keyptr,keylen,out)                                     \\\ndo {                                                                             \\\n  unsigned _hf_hashv;                                                            \\\n  HASH_VALUE(keyptr, keylen, _hf_hashv);                                         \\\n  HASH_FIND_BYHASHVALUE(hh, head, keyptr, keylen, _hf_hashv, out);               \\\n} while (0)\n\n#ifdef HASH_BLOOM\n#define HASH_BLOOM_BITLEN (1UL << HASH_BLOOM)\n#define HASH_BLOOM_BYTELEN (HASH_BLOOM_BITLEN/8UL) + (((HASH_BLOOM_BITLEN%8UL)!=0UL) ? 1UL : 0UL)\n#define HASH_BLOOM_MAKE(tbl)                                                     \\\ndo {                                                                             \\\n  (tbl)->bloom_nbits = HASH_BLOOM;                                               \\\n  (tbl)->bloom_bv = (uint8_t*)uthash_malloc(HASH_BLOOM_BYTELEN);                 \\\n  if (!((tbl)->bloom_bv))  { uthash_fatal( \"out of memory\"); }                   \\\n  memset((tbl)->bloom_bv, 0, HASH_BLOOM_BYTELEN);                                \\\n  (tbl)->bloom_sig = HASH_BLOOM_SIGNATURE;                                       \\\n} while (0)\n\n#define HASH_BLOOM_FREE(tbl)                                                     \\\ndo {                                                                             \\\n  uthash_free((tbl)->bloom_bv, HASH_BLOOM_BYTELEN);                              \\\n} while (0)\n\n#define HASH_BLOOM_BITSET(bv,idx) (bv[(idx)/8U] |= (1U << ((idx)%8U)))\n#define HASH_BLOOM_BITTEST(bv,idx) (bv[(idx)/8U] & (1U << ((idx)%8U)))\n\n#define HASH_BLOOM_ADD(tbl,hashv)                                                \\\n  HASH_BLOOM_BITSET((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1U)))\n\n#define HASH_BLOOM_TEST(tbl,hashv)                                               \\\n  HASH_BLOOM_BITTEST((tbl)->bloom_bv, (hashv & (uint32_t)((1ULL << (tbl)->bloom_nbits) - 1U)))\n\n#else\n#define HASH_BLOOM_MAKE(tbl)\n#define HASH_BLOOM_FREE(tbl)\n#define HASH_BLOOM_ADD(tbl,hashv)\n#define HASH_BLOOM_TEST(tbl,hashv) (1)\n#define HASH_BLOOM_BYTELEN 0U\n#endif\n\n#define HASH_MAKE_TABLE(hh,head)                                                 \\\ndo {                                                                             \\\n  (head)->hh.tbl = (UT_hash_table*)uthash_malloc(                                \\\n                  sizeof(UT_hash_table));                                        \\\n  if (!((head)->hh.tbl))  { uthash_fatal( \"out of memory\"); }                    \\\n  memset((head)->hh.tbl, 0, sizeof(UT_hash_table));                              \\\n  (head)->hh.tbl->tail = &((head)->hh);                                          \\\n  (head)->hh.tbl->num_buckets = HASH_INITIAL_NUM_BUCKETS;                        \\\n  (head)->hh.tbl->log2_num_buckets = HASH_INITIAL_NUM_BUCKETS_LOG2;              \\\n  (head)->hh.tbl->hho = (char*)(&(head)->hh) - (char*)(head);                    \\\n  (head)->hh.tbl->buckets = (UT_hash_bucket*)uthash_malloc(                      \\\n          HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket));               \\\n  if (! (head)->hh.tbl->buckets) { uthash_fatal( \"out of memory\"); }             \\\n  memset((head)->hh.tbl->buckets, 0,                                             \\\n          HASH_INITIAL_NUM_BUCKETS*sizeof(struct UT_hash_bucket));               \\\n  HASH_BLOOM_MAKE((head)->hh.tbl);                                               \\\n  (head)->hh.tbl->signature = HASH_SIGNATURE;                                    \\\n} while (0)\n\n#define HASH_REPLACE_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,replaced,cmpfcn) \\\ndo {                                                                             \\\n  (replaced) = NULL;                                                             \\\n  HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \\\n  if (replaced) {                                                                \\\n     HASH_DELETE(hh, head, replaced);                                            \\\n  }                                                                              \\\n  HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn); \\\n} while (0)\n\n#define HASH_REPLACE_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add,replaced) \\\ndo {                                                                             \\\n  (replaced) = NULL;                                                             \\\n  HASH_FIND_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, replaced); \\\n  if (replaced) {                                                                \\\n     HASH_DELETE(hh, head, replaced);                                            \\\n  }                                                                              \\\n  HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add); \\\n} while (0)\n\n#define HASH_REPLACE(hh,head,fieldname,keylen_in,add,replaced)                   \\\ndo {                                                                             \\\n  unsigned _hr_hashv;                                                            \\\n  HASH_VALUE(&((add)->fieldname), keylen_in, _hr_hashv);                         \\\n  HASH_REPLACE_BYHASHVALUE(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced); \\\n} while (0)\n\n#define HASH_REPLACE_INORDER(hh,head,fieldname,keylen_in,add,replaced,cmpfcn)    \\\ndo {                                                                             \\\n  unsigned _hr_hashv;                                                            \\\n  HASH_VALUE(&((add)->fieldname), keylen_in, _hr_hashv);                         \\\n  HASH_REPLACE_BYHASHVALUE_INORDER(hh, head, fieldname, keylen_in, _hr_hashv, add, replaced, cmpfcn); \\\n} while (0)\n\n#define HASH_APPEND_LIST(hh, head, add)                                          \\\ndo {                                                                             \\\n  (add)->hh.next = NULL;                                                         \\\n  (add)->hh.prev = ELMT_FROM_HH((head)->hh.tbl, (head)->hh.tbl->tail);           \\\n  (head)->hh.tbl->tail->next = (add);                                            \\\n  (head)->hh.tbl->tail = &((add)->hh);                                           \\\n} while (0)\n\n#define HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh,head,keyptr,keylen_in,hashval,add,cmpfcn) \\\ndo {                                                                             \\\n  unsigned _ha_bkt;                                                              \\\n  (add)->hh.hashv = (hashval);                                                   \\\n  (add)->hh.key = (char*) (keyptr);                                              \\\n  (add)->hh.keylen = (unsigned) (keylen_in);                                     \\\n  if (!(head)) {                                                                 \\\n    (add)->hh.next = NULL;                                                       \\\n    (add)->hh.prev = NULL;                                                       \\\n    (head) = (add);                                                              \\\n    HASH_MAKE_TABLE(hh, head);                                                   \\\n  } else {                                                                       \\\n    struct UT_hash_handle *_hs_iter = &(head)->hh;                               \\\n    (add)->hh.tbl = (head)->hh.tbl;                                              \\\n    do {                                                                         \\\n      if (cmpfcn(DECLTYPE(head) ELMT_FROM_HH((head)->hh.tbl, _hs_iter), add) > 0) \\\n        break;                                                                   \\\n    } while ((_hs_iter = _hs_iter->next));                                       \\\n    if (_hs_iter) {                                                              \\\n      (add)->hh.next = _hs_iter;                                                 \\\n      if (((add)->hh.prev = _hs_iter->prev)) {                                   \\\n        HH_FROM_ELMT((head)->hh.tbl, _hs_iter->prev)->next = (add);              \\\n      } else {                                                                   \\\n        (head) = (add);                                                          \\\n      }                                                                          \\\n      _hs_iter->prev = (add);                                                    \\\n    } else {                                                                     \\\n      HASH_APPEND_LIST(hh, head, add);                                           \\\n    }                                                                            \\\n  }                                                                              \\\n  (head)->hh.tbl->num_items++;                                                   \\\n  HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt);                    \\\n  HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], &(add)->hh);                 \\\n  HASH_BLOOM_ADD((head)->hh.tbl, hashval);                                       \\\n  HASH_EMIT_KEY(hh, head, keyptr, keylen_in);                                    \\\n  HASH_FSCK(hh, head);                                                           \\\n} while (0)\n\n#define HASH_ADD_KEYPTR_INORDER(hh,head,keyptr,keylen_in,add,cmpfcn)             \\\ndo {                                                                             \\\n  unsigned _hs_hashv;                                                            \\\n  HASH_VALUE(keyptr, keylen_in, _hs_hashv);                                      \\\n  HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, keyptr, keylen_in, _hs_hashv, add, cmpfcn); \\\n} while (0)\n\n#define HASH_ADD_BYHASHVALUE_INORDER(hh,head,fieldname,keylen_in,hashval,add,cmpfcn) \\\n  HASH_ADD_KEYPTR_BYHASHVALUE_INORDER(hh, head, &((add)->fieldname), keylen_in, hashval, add, cmpfcn)\n\n#define HASH_ADD_INORDER(hh,head,fieldname,keylen_in,add,cmpfcn)                 \\\n  HASH_ADD_KEYPTR_INORDER(hh, head, &((add)->fieldname), keylen_in, add, cmpfcn)\n\n#define HASH_ADD_KEYPTR_BYHASHVALUE(hh,head,keyptr,keylen_in,hashval,add)        \\\ndo {                                                                             \\\n  unsigned _ha_bkt;                                                              \\\n  (add)->hh.hashv = (hashval);                                                   \\\n  (add)->hh.key = (char*) (keyptr);                                              \\\n  (add)->hh.keylen = (unsigned) (keylen_in);                                     \\\n  if (!(head)) {                                                                 \\\n    (add)->hh.next = NULL;                                                       \\\n    (add)->hh.prev = NULL;                                                       \\\n    (head) = (add);                                                              \\\n    HASH_MAKE_TABLE(hh, head);                                                   \\\n  } else {                                                                       \\\n    (add)->hh.tbl = (head)->hh.tbl;                                              \\\n    HASH_APPEND_LIST(hh, head, add);                                             \\\n  }                                                                              \\\n  (head)->hh.tbl->num_items++;                                                   \\\n  HASH_TO_BKT(hashval, (head)->hh.tbl->num_buckets, _ha_bkt);                    \\\n  HASH_ADD_TO_BKT((head)->hh.tbl->buckets[_ha_bkt], &(add)->hh);                 \\\n  HASH_BLOOM_ADD((head)->hh.tbl, hashval);                                       \\\n  HASH_EMIT_KEY(hh, head, keyptr, keylen_in);                                    \\\n  HASH_FSCK(hh, head);                                                           \\\n} while (0)\n\n#define HASH_ADD_KEYPTR(hh,head,keyptr,keylen_in,add)                            \\\ndo {                                                                             \\\n  unsigned _ha_hashv;                                                            \\\n  HASH_VALUE(keyptr, keylen_in, _ha_hashv);                                      \\\n  HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, keyptr, keylen_in, _ha_hashv, add);      \\\n} while (0)\n\n#define HASH_ADD_BYHASHVALUE(hh,head,fieldname,keylen_in,hashval,add)            \\\n  HASH_ADD_KEYPTR_BYHASHVALUE(hh, head, &((add)->fieldname), keylen_in, hashval, add)\n\n#define HASH_ADD(hh,head,fieldname,keylen_in,add)                                \\\n  HASH_ADD_KEYPTR(hh, head, &((add)->fieldname), keylen_in, add)\n\n#define HASH_TO_BKT(hashv,num_bkts,bkt)                                          \\\ndo {                                                                             \\\n  bkt = ((hashv) & ((num_bkts) - 1U));                                           \\\n} while (0)\n\n/* delete \"delptr\" from the hash table.\n * \"the usual\" patch-up process for the app-order doubly-linked-list.\n * The use of _hd_hh_del below deserves special explanation.\n * These used to be expressed using (delptr) but that led to a bug\n * if someone used the same symbol for the head and deletee, like\n *  HASH_DELETE(hh,users,users);\n * We want that to work, but by changing the head (users) below\n * we were forfeiting our ability to further refer to the deletee (users)\n * in the patch-up process. Solution: use scratch space to\n * copy the deletee pointer, then the latter references are via that\n * scratch pointer rather than through the repointed (users) symbol.\n */\n#define HASH_DELETE(hh,head,delptr)                                              \\\ndo {                                                                             \\\n    struct UT_hash_handle *_hd_hh_del;                                           \\\n    if ( ((delptr)->hh.prev == NULL) && ((delptr)->hh.next == NULL) )  {         \\\n        uthash_free((head)->hh.tbl->buckets,                                     \\\n                    (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \\\n        HASH_BLOOM_FREE((head)->hh.tbl);                                         \\\n        uthash_free((head)->hh.tbl, sizeof(UT_hash_table));                      \\\n        head = NULL;                                                             \\\n    } else {                                                                     \\\n        unsigned _hd_bkt;                                                        \\\n        _hd_hh_del = &((delptr)->hh);                                            \\\n        if ((delptr) == ELMT_FROM_HH((head)->hh.tbl,(head)->hh.tbl->tail)) {     \\\n            (head)->hh.tbl->tail =                                               \\\n                (UT_hash_handle*)((ptrdiff_t)((delptr)->hh.prev) +               \\\n                (head)->hh.tbl->hho);                                            \\\n        }                                                                        \\\n        if ((delptr)->hh.prev != NULL) {                                         \\\n            ((UT_hash_handle*)((ptrdiff_t)((delptr)->hh.prev) +                  \\\n                    (head)->hh.tbl->hho))->next = (delptr)->hh.next;             \\\n        } else {                                                                 \\\n            DECLTYPE_ASSIGN(head,(delptr)->hh.next);                             \\\n        }                                                                        \\\n        if (_hd_hh_del->next != NULL) {                                          \\\n            ((UT_hash_handle*)((ptrdiff_t)_hd_hh_del->next +                     \\\n                    (head)->hh.tbl->hho))->prev =                                \\\n                    _hd_hh_del->prev;                                            \\\n        }                                                                        \\\n        HASH_TO_BKT( _hd_hh_del->hashv, (head)->hh.tbl->num_buckets, _hd_bkt);   \\\n        HASH_DEL_IN_BKT(hh,(head)->hh.tbl->buckets[_hd_bkt], _hd_hh_del);        \\\n        (head)->hh.tbl->num_items--;                                             \\\n    }                                                                            \\\n    HASH_FSCK(hh,head);                                                          \\\n} while (0)\n\n\n/* convenience forms of HASH_FIND/HASH_ADD/HASH_DEL */\n#define HASH_FIND_STR(head,findstr,out)                                          \\\n    HASH_FIND(hh,head,findstr,(unsigned)uthash_strlen(findstr),out)\n#define HASH_ADD_STR(head,strfield,add)                                          \\\n    HASH_ADD(hh,head,strfield[0],(unsigned)uthash_strlen(add->strfield),add)\n#define HASH_REPLACE_STR(head,strfield,add,replaced)                             \\\n    HASH_REPLACE(hh,head,strfield[0],(unsigned)uthash_strlen(add->strfield),add,replaced)\n#define HASH_FIND_INT(head,findint,out)                                          \\\n    HASH_FIND(hh,head,findint,sizeof(int),out)\n#define HASH_ADD_INT(head,intfield,add)                                          \\\n    HASH_ADD(hh,head,intfield,sizeof(int),add)\n#define HASH_REPLACE_INT(head,intfield,add,replaced)                             \\\n    HASH_REPLACE(hh,head,intfield,sizeof(int),add,replaced)\n#define HASH_FIND_PTR(head,findptr,out)                                          \\\n    HASH_FIND(hh,head,findptr,sizeof(void *),out)\n#define HASH_ADD_PTR(head,ptrfield,add)                                          \\\n    HASH_ADD(hh,head,ptrfield,sizeof(void *),add)\n#define HASH_REPLACE_PTR(head,ptrfield,add,replaced)                             \\\n    HASH_REPLACE(hh,head,ptrfield,sizeof(void *),add,replaced)\n#define HASH_DEL(head,delptr)                                                    \\\n    HASH_DELETE(hh,head,delptr)\n\n/* HASH_FSCK checks hash integrity on every add/delete when HASH_DEBUG is defined.\n * This is for uthash developer only; it compiles away if HASH_DEBUG isn't defined.\n */\n#ifdef HASH_DEBUG\n#define HASH_OOPS(...) do { fprintf(stderr,__VA_ARGS__); exit(-1); } while (0)\n#define HASH_FSCK(hh,head)                                                       \\\ndo {                                                                             \\\n    struct UT_hash_handle *_thh;                                                 \\\n    if (head) {                                                                  \\\n        unsigned _bkt_i;                                                         \\\n        unsigned _count;                                                         \\\n        char *_prev;                                                             \\\n        _count = 0;                                                              \\\n        for( _bkt_i = 0; _bkt_i < (head)->hh.tbl->num_buckets; _bkt_i++) {       \\\n            unsigned _bkt_count = 0;                                             \\\n            _thh = (head)->hh.tbl->buckets[_bkt_i].hh_head;                      \\\n            _prev = NULL;                                                        \\\n            while (_thh) {                                                       \\\n               if (_prev != (char*)(_thh->hh_prev)) {                            \\\n                   HASH_OOPS(\"invalid hh_prev %p, actual %p\\n\",                  \\\n                    _thh->hh_prev, _prev );                                      \\\n               }                                                                 \\\n               _bkt_count++;                                                     \\\n               _prev = (char*)(_thh);                                            \\\n               _thh = _thh->hh_next;                                             \\\n            }                                                                    \\\n            _count += _bkt_count;                                                \\\n            if ((head)->hh.tbl->buckets[_bkt_i].count !=  _bkt_count) {          \\\n               HASH_OOPS(\"invalid bucket count %u, actual %u\\n\",                 \\\n                (head)->hh.tbl->buckets[_bkt_i].count, _bkt_count);              \\\n            }                                                                    \\\n        }                                                                        \\\n        if (_count != (head)->hh.tbl->num_items) {                               \\\n            HASH_OOPS(\"invalid hh item count %u, actual %u\\n\",                   \\\n                (head)->hh.tbl->num_items, _count );                             \\\n        }                                                                        \\\n        /* traverse hh in app order; check next/prev integrity, count */         \\\n        _count = 0;                                                              \\\n        _prev = NULL;                                                            \\\n        _thh =  &(head)->hh;                                                     \\\n        while (_thh) {                                                           \\\n           _count++;                                                             \\\n           if (_prev !=(char*)(_thh->prev)) {                                    \\\n              HASH_OOPS(\"invalid prev %p, actual %p\\n\",                          \\\n                    _thh->prev, _prev );                                         \\\n           }                                                                     \\\n           _prev = (char*)ELMT_FROM_HH((head)->hh.tbl, _thh);                    \\\n           _thh = ( _thh->next ?  (UT_hash_handle*)((char*)(_thh->next) +        \\\n                                  (head)->hh.tbl->hho) : NULL );                 \\\n        }                                                                        \\\n        if (_count != (head)->hh.tbl->num_items) {                               \\\n            HASH_OOPS(\"invalid app item count %u, actual %u\\n\",                  \\\n                (head)->hh.tbl->num_items, _count );                             \\\n        }                                                                        \\\n    }                                                                            \\\n} while (0)\n#else\n#define HASH_FSCK(hh,head)\n#endif\n\n/* When compiled with -DHASH_EMIT_KEYS, length-prefixed keys are emitted to\n * the descriptor to which this macro is defined for tuning the hash function.\n * The app can #include <unistd.h> to get the prototype for write(2). */\n#ifdef HASH_EMIT_KEYS\n#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen)                                   \\\ndo {                                                                             \\\n    unsigned _klen = fieldlen;                                                   \\\n    write(HASH_EMIT_KEYS, &_klen, sizeof(_klen));                                \\\n    write(HASH_EMIT_KEYS, keyptr, (unsigned long)fieldlen);                      \\\n} while (0)\n#else\n#define HASH_EMIT_KEY(hh,head,keyptr,fieldlen)\n#endif\n\n/* default to Jenkin's hash unless overridden e.g. DHASH_FUNCTION=HASH_SAX */\n#ifdef HASH_FUNCTION\n#define HASH_FCN HASH_FUNCTION\n#else\n#define HASH_FCN HASH_JEN\n#endif\n\n/* The Bernstein hash function, used in Perl prior to v5.6. Note (x<<5+x)=x*33. */\n#define HASH_BER(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned _hb_keylen=(unsigned)keylen;                                          \\\n  const unsigned char *_hb_key=(const unsigned char*)(key);                      \\\n  (hashv) = 0;                                                                   \\\n  while (_hb_keylen-- != 0U) {                                                   \\\n      (hashv) = (((hashv) << 5) + (hashv)) + *_hb_key++;                         \\\n  }                                                                              \\\n} while (0)\n\n\n/* SAX/FNV/OAT/JEN hash functions are macro variants of those listed at\n * http://eternallyconfuzzled.com/tuts/algorithms/jsw_tut_hashing.aspx */\n#define HASH_SAX(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned _sx_i;                                                                \\\n  const unsigned char *_hs_key=(const unsigned char*)(key);                      \\\n  hashv = 0;                                                                     \\\n  for(_sx_i=0; _sx_i < keylen; _sx_i++) {                                        \\\n      hashv ^= (hashv << 5) + (hashv >> 2) + _hs_key[_sx_i];                     \\\n  }                                                                              \\\n} while (0)\n/* FNV-1a variation */\n#define HASH_FNV(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned _fn_i;                                                                \\\n  const unsigned char *_hf_key=(const unsigned char*)(key);                      \\\n  hashv = 2166136261U;                                                           \\\n  for(_fn_i=0; _fn_i < keylen; _fn_i++) {                                        \\\n      hashv = hashv ^ _hf_key[_fn_i];                                            \\\n      hashv = hashv * 16777619U;                                                 \\\n  }                                                                              \\\n} while (0)\n\n#define HASH_OAT(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned _ho_i;                                                                \\\n  const unsigned char *_ho_key=(const unsigned char*)(key);                      \\\n  hashv = 0;                                                                     \\\n  for(_ho_i=0; _ho_i < keylen; _ho_i++) {                                        \\\n      hashv += _ho_key[_ho_i];                                                   \\\n      hashv += (hashv << 10);                                                    \\\n      hashv ^= (hashv >> 6);                                                     \\\n  }                                                                              \\\n  hashv += (hashv << 3);                                                         \\\n  hashv ^= (hashv >> 11);                                                        \\\n  hashv += (hashv << 15);                                                        \\\n} while (0)\n\n#define HASH_JEN_MIX(a,b,c)                                                      \\\ndo {                                                                             \\\n  a -= b; a -= c; a ^= ( c >> 13 );                                              \\\n  b -= c; b -= a; b ^= ( a << 8 );                                               \\\n  c -= a; c -= b; c ^= ( b >> 13 );                                              \\\n  a -= b; a -= c; a ^= ( c >> 12 );                                              \\\n  b -= c; b -= a; b ^= ( a << 16 );                                              \\\n  c -= a; c -= b; c ^= ( b >> 5 );                                               \\\n  a -= b; a -= c; a ^= ( c >> 3 );                                               \\\n  b -= c; b -= a; b ^= ( a << 10 );                                              \\\n  c -= a; c -= b; c ^= ( b >> 15 );                                              \\\n} while (0)\n\n#define HASH_JEN(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned _hj_i,_hj_j,_hj_k;                                                    \\\n  unsigned const char *_hj_key=(unsigned const char*)(key);                      \\\n  hashv = 0xfeedbeefu;                                                           \\\n  _hj_i = _hj_j = 0x9e3779b9u;                                                   \\\n  _hj_k = (unsigned)(keylen);                                                    \\\n  while (_hj_k >= 12U) {                                                         \\\n    _hj_i +=    (_hj_key[0] + ( (unsigned)_hj_key[1] << 8 )                      \\\n        + ( (unsigned)_hj_key[2] << 16 )                                         \\\n        + ( (unsigned)_hj_key[3] << 24 ) );                                      \\\n    _hj_j +=    (_hj_key[4] + ( (unsigned)_hj_key[5] << 8 )                      \\\n        + ( (unsigned)_hj_key[6] << 16 )                                         \\\n        + ( (unsigned)_hj_key[7] << 24 ) );                                      \\\n    hashv += (_hj_key[8] + ( (unsigned)_hj_key[9] << 8 )                         \\\n        + ( (unsigned)_hj_key[10] << 16 )                                        \\\n        + ( (unsigned)_hj_key[11] << 24 ) );                                     \\\n                                                                                 \\\n     HASH_JEN_MIX(_hj_i, _hj_j, hashv);                                          \\\n                                                                                 \\\n     _hj_key += 12;                                                              \\\n     _hj_k -= 12U;                                                               \\\n  }                                                                              \\\n  hashv += (unsigned)(keylen);                                                   \\\n  switch ( _hj_k ) {                                                             \\\n     case 11: hashv += ( (unsigned)_hj_key[10] << 24 ); /* FALLTHROUGH */        \\\n     case 10: hashv += ( (unsigned)_hj_key[9] << 16 );  /* FALLTHROUGH */        \\\n     case 9:  hashv += ( (unsigned)_hj_key[8] << 8 );   /* FALLTHROUGH */        \\\n     case 8:  _hj_j += ( (unsigned)_hj_key[7] << 24 );  /* FALLTHROUGH */        \\\n     case 7:  _hj_j += ( (unsigned)_hj_key[6] << 16 );  /* FALLTHROUGH */        \\\n     case 6:  _hj_j += ( (unsigned)_hj_key[5] << 8 );   /* FALLTHROUGH */        \\\n     case 5:  _hj_j += _hj_key[4];                      /* FALLTHROUGH */        \\\n     case 4:  _hj_i += ( (unsigned)_hj_key[3] << 24 );  /* FALLTHROUGH */        \\\n     case 3:  _hj_i += ( (unsigned)_hj_key[2] << 16 );  /* FALLTHROUGH */        \\\n     case 2:  _hj_i += ( (unsigned)_hj_key[1] << 8 );   /* FALLTHROUGH */        \\\n     case 1:  _hj_i += _hj_key[0];                                               \\\n  }                                                                              \\\n  HASH_JEN_MIX(_hj_i, _hj_j, hashv);                                             \\\n} while (0)\n\n/* The Paul Hsieh hash function */\n#undef get16bits\n#if (defined(__GNUC__) && defined(__i386__)) || defined(__WATCOMC__)             \\\n  || defined(_MSC_VER) || defined (__BORLANDC__) || defined (__TURBOC__)\n#define get16bits(d) (*((const uint16_t *) (d)))\n#endif\n\n#if !defined (get16bits)\n#define get16bits(d) ((((uint32_t)(((const uint8_t *)(d))[1])) << 8)             \\\n                       +(uint32_t)(((const uint8_t *)(d))[0]) )\n#endif\n#define HASH_SFH(key,keylen,hashv)                                               \\\ndo {                                                                             \\\n  unsigned const char *_sfh_key=(unsigned const char*)(key);                     \\\n  uint32_t _sfh_tmp, _sfh_len = (uint32_t)keylen;                                \\\n                                                                                 \\\n  unsigned _sfh_rem = _sfh_len & 3U;                                             \\\n  _sfh_len >>= 2;                                                                \\\n  hashv = 0xcafebabeu;                                                           \\\n                                                                                 \\\n  /* Main loop */                                                                \\\n  for (;_sfh_len > 0U; _sfh_len--) {                                             \\\n    hashv    += get16bits (_sfh_key);                                            \\\n    _sfh_tmp  = ((uint32_t)(get16bits (_sfh_key+2)) << 11) ^ hashv;              \\\n    hashv     = (hashv << 16) ^ _sfh_tmp;                                        \\\n    _sfh_key += 2U*sizeof (uint16_t);                                            \\\n    hashv    += hashv >> 11;                                                     \\\n  }                                                                              \\\n                                                                                 \\\n  /* Handle end cases */                                                         \\\n  switch (_sfh_rem) {                                                            \\\n    case 3: hashv += get16bits (_sfh_key);                                       \\\n            hashv ^= hashv << 16;                                                \\\n            hashv ^= (uint32_t)(_sfh_key[sizeof (uint16_t)]) << 18;              \\\n            hashv += hashv >> 11;                                                \\\n            break;                                                               \\\n    case 2: hashv += get16bits (_sfh_key);                                       \\\n            hashv ^= hashv << 11;                                                \\\n            hashv += hashv >> 17;                                                \\\n            break;                                                               \\\n    case 1: hashv += *_sfh_key;                                                  \\\n            hashv ^= hashv << 10;                                                \\\n            hashv += hashv >> 1;                                                 \\\n  }                                                                              \\\n                                                                                 \\\n    /* Force \"avalanching\" of final 127 bits */                                  \\\n    hashv ^= hashv << 3;                                                         \\\n    hashv += hashv >> 5;                                                         \\\n    hashv ^= hashv << 4;                                                         \\\n    hashv += hashv >> 17;                                                        \\\n    hashv ^= hashv << 25;                                                        \\\n    hashv += hashv >> 6;                                                         \\\n} while (0)\n\n#ifdef HASH_USING_NO_STRICT_ALIASING\n/* The MurmurHash exploits some CPU's (x86,x86_64) tolerance for unaligned reads.\n * For other types of CPU's (e.g. Sparc) an unaligned read causes a bus error.\n * MurmurHash uses the faster approach only on CPU's where we know it's safe.\n *\n * Note the preprocessor built-in defines can be emitted using:\n *\n *   gcc -m64 -dM -E - < /dev/null                  (on gcc)\n *   cc -## a.c (where a.c is a simple test file)   (Sun Studio)\n */\n#if (defined(__i386__) || defined(__x86_64__)  || defined(_M_IX86))\n#define MUR_GETBLOCK(p,i) p[i]\n#else /* non intel */\n#define MUR_PLUS0_ALIGNED(p) (((unsigned long)p & 3UL) == 0UL)\n#define MUR_PLUS1_ALIGNED(p) (((unsigned long)p & 3UL) == 1UL)\n#define MUR_PLUS2_ALIGNED(p) (((unsigned long)p & 3UL) == 2UL)\n#define MUR_PLUS3_ALIGNED(p) (((unsigned long)p & 3UL) == 3UL)\n#define WP(p) ((uint32_t*)((unsigned long)(p) & ~3UL))\n#if (defined(__BIG_ENDIAN__) || defined(SPARC) || defined(__ppc__) || defined(__ppc64__))\n#define MUR_THREE_ONE(p) ((((*WP(p))&0x00ffffff) << 8) | (((*(WP(p)+1))&0xff000000) >> 24))\n#define MUR_TWO_TWO(p)   ((((*WP(p))&0x0000ffff) <<16) | (((*(WP(p)+1))&0xffff0000) >> 16))\n#define MUR_ONE_THREE(p) ((((*WP(p))&0x000000ff) <<24) | (((*(WP(p)+1))&0xffffff00) >>  8))\n#else /* assume little endian non-intel */\n#define MUR_THREE_ONE(p) ((((*WP(p))&0xffffff00) >> 8) | (((*(WP(p)+1))&0x000000ff) << 24))\n#define MUR_TWO_TWO(p)   ((((*WP(p))&0xffff0000) >>16) | (((*(WP(p)+1))&0x0000ffff) << 16))\n#define MUR_ONE_THREE(p) ((((*WP(p))&0xff000000) >>24) | (((*(WP(p)+1))&0x00ffffff) <<  8))\n#endif\n#define MUR_GETBLOCK(p,i) (MUR_PLUS0_ALIGNED(p) ? ((p)[i]) :           \\\n                            (MUR_PLUS1_ALIGNED(p) ? MUR_THREE_ONE(p) : \\\n                             (MUR_PLUS2_ALIGNED(p) ? MUR_TWO_TWO(p) :  \\\n                                                      MUR_ONE_THREE(p))))\n#endif\n#define MUR_ROTL32(x,r) (((x) << (r)) | ((x) >> (32 - (r))))\n#define MUR_FMIX(_h) \\\ndo {                 \\\n  _h ^= _h >> 16;    \\\n  _h *= 0x85ebca6bu; \\\n  _h ^= _h >> 13;    \\\n  _h *= 0xc2b2ae35u; \\\n  _h ^= _h >> 16;    \\\n} while (0)\n\n#define HASH_MUR(key,keylen,hashv)                                     \\\ndo {                                                                   \\\n  const uint8_t *_mur_data = (const uint8_t*)(key);                    \\\n  const int _mur_nblocks = (int)(keylen) / 4;                          \\\n  uint32_t _mur_h1 = 0xf88D5353u;                                      \\\n  uint32_t _mur_c1 = 0xcc9e2d51u;                                      \\\n  uint32_t _mur_c2 = 0x1b873593u;                                      \\\n  uint32_t _mur_k1 = 0;                                                \\\n  const uint8_t *_mur_tail;                                            \\\n  const uint32_t *_mur_blocks = (const uint32_t*)(_mur_data+(_mur_nblocks*4)); \\\n  int _mur_i;                                                          \\\n  for(_mur_i = -_mur_nblocks; _mur_i!=0; _mur_i++) {                   \\\n    _mur_k1 = MUR_GETBLOCK(_mur_blocks,_mur_i);                        \\\n    _mur_k1 *= _mur_c1;                                                \\\n    _mur_k1 = MUR_ROTL32(_mur_k1,15);                                  \\\n    _mur_k1 *= _mur_c2;                                                \\\n                                                                       \\\n    _mur_h1 ^= _mur_k1;                                                \\\n    _mur_h1 = MUR_ROTL32(_mur_h1,13);                                  \\\n    _mur_h1 = (_mur_h1*5U) + 0xe6546b64u;                              \\\n  }                                                                    \\\n  _mur_tail = (const uint8_t*)(_mur_data + (_mur_nblocks*4));          \\\n  _mur_k1=0;                                                           \\\n  switch((keylen) & 3U) {                                              \\\n    case 3: _mur_k1 ^= (uint32_t)_mur_tail[2] << 16; /* FALLTHROUGH */ \\\n    case 2: _mur_k1 ^= (uint32_t)_mur_tail[1] << 8;  /* FALLTHROUGH */ \\\n    case 1: _mur_k1 ^= (uint32_t)_mur_tail[0];                         \\\n    _mur_k1 *= _mur_c1;                                                \\\n    _mur_k1 = MUR_ROTL32(_mur_k1,15);                                  \\\n    _mur_k1 *= _mur_c2;                                                \\\n    _mur_h1 ^= _mur_k1;                                                \\\n  }                                                                    \\\n  _mur_h1 ^= (uint32_t)(keylen);                                       \\\n  MUR_FMIX(_mur_h1);                                                   \\\n  hashv = _mur_h1;                                                     \\\n} while (0)\n#endif  /* HASH_USING_NO_STRICT_ALIASING */\n\n/* iterate over items in a known bucket to find desired item */\n#define HASH_FIND_IN_BKT(tbl,hh,head,keyptr,keylen_in,hashval,out)               \\\ndo {                                                                             \\\n  if ((head).hh_head != NULL) {                                                  \\\n    DECLTYPE_ASSIGN(out, ELMT_FROM_HH(tbl, (head).hh_head));                     \\\n  } else {                                                                       \\\n    (out) = NULL;                                                                \\\n  }                                                                              \\\n  while ((out) != NULL) {                                                        \\\n    if ((out)->hh.hashv == (hashval) && (out)->hh.keylen == (keylen_in)) {       \\\n      if (uthash_memcmp((out)->hh.key, keyptr, keylen_in) == 0) {                \\\n        break;                                                                   \\\n      }                                                                          \\\n    }                                                                            \\\n    if ((out)->hh.hh_next != NULL) {                                             \\\n      DECLTYPE_ASSIGN(out, ELMT_FROM_HH(tbl, (out)->hh.hh_next));                \\\n    } else {                                                                     \\\n      (out) = NULL;                                                              \\\n    }                                                                            \\\n  }                                                                              \\\n} while (0)\n\n/* add an item to a bucket  */\n#define HASH_ADD_TO_BKT(head,addhh)                                              \\\ndo {                                                                             \\\n head.count++;                                                                   \\\n (addhh)->hh_next = head.hh_head;                                                \\\n (addhh)->hh_prev = NULL;                                                        \\\n if (head.hh_head != NULL) { (head).hh_head->hh_prev = (addhh); }                \\\n (head).hh_head=addhh;                                                           \\\n if ((head.count >= ((head.expand_mult+1U) * HASH_BKT_CAPACITY_THRESH))          \\\n     && ((addhh)->tbl->noexpand != 1U)) {                                        \\\n       HASH_EXPAND_BUCKETS((addhh)->tbl);                                        \\\n }                                                                               \\\n} while (0)\n\n/* remove an item from a given bucket */\n#define HASH_DEL_IN_BKT(hh,head,hh_del)                                          \\\n    (head).count--;                                                              \\\n    if ((head).hh_head == hh_del) {                                              \\\n      (head).hh_head = hh_del->hh_next;                                          \\\n    }                                                                            \\\n    if (hh_del->hh_prev) {                                                       \\\n        hh_del->hh_prev->hh_next = hh_del->hh_next;                              \\\n    }                                                                            \\\n    if (hh_del->hh_next) {                                                       \\\n        hh_del->hh_next->hh_prev = hh_del->hh_prev;                              \\\n    }\n\n/* Bucket expansion has the effect of doubling the number of buckets\n * and redistributing the items into the new buckets. Ideally the\n * items will distribute more or less evenly into the new buckets\n * (the extent to which this is true is a measure of the quality of\n * the hash function as it applies to the key domain).\n *\n * With the items distributed into more buckets, the chain length\n * (item count) in each bucket is reduced. Thus by expanding buckets\n * the hash keeps a bound on the chain length. This bounded chain\n * length is the essence of how a hash provides constant time lookup.\n *\n * The calculation of tbl->ideal_chain_maxlen below deserves some\n * explanation. First, keep in mind that we're calculating the ideal\n * maximum chain length based on the *new* (doubled) bucket count.\n * In fractions this is just n/b (n=number of items,b=new num buckets).\n * Since the ideal chain length is an integer, we want to calculate\n * ceil(n/b). We don't depend on floating point arithmetic in this\n * hash, so to calculate ceil(n/b) with integers we could write\n *\n *      ceil(n/b) = (n/b) + ((n%b)?1:0)\n *\n * and in fact a previous version of this hash did just that.\n * But now we have improved things a bit by recognizing that b is\n * always a power of two. We keep its base 2 log handy (call it lb),\n * so now we can write this with a bit shift and logical AND:\n *\n *      ceil(n/b) = (n>>lb) + ( (n & (b-1)) ? 1:0)\n *\n */\n#define HASH_EXPAND_BUCKETS(tbl)                                                 \\\ndo {                                                                             \\\n    unsigned _he_bkt;                                                            \\\n    unsigned _he_bkt_i;                                                          \\\n    struct UT_hash_handle *_he_thh, *_he_hh_nxt;                                 \\\n    UT_hash_bucket *_he_new_buckets, *_he_newbkt;                                \\\n    _he_new_buckets = (UT_hash_bucket*)uthash_malloc(                            \\\n             2UL * tbl->num_buckets * sizeof(struct UT_hash_bucket));            \\\n    if (!_he_new_buckets) { uthash_fatal( \"out of memory\"); }                    \\\n    memset(_he_new_buckets, 0,                                                   \\\n            2UL * tbl->num_buckets * sizeof(struct UT_hash_bucket));             \\\n    tbl->ideal_chain_maxlen =                                                    \\\n       (tbl->num_items >> (tbl->log2_num_buckets+1U)) +                          \\\n       (((tbl->num_items & ((tbl->num_buckets*2U)-1U)) != 0U) ? 1U : 0U);        \\\n    tbl->nonideal_items = 0;                                                     \\\n    for(_he_bkt_i = 0; _he_bkt_i < tbl->num_buckets; _he_bkt_i++)                \\\n    {                                                                            \\\n        _he_thh = tbl->buckets[ _he_bkt_i ].hh_head;                             \\\n        while (_he_thh != NULL) {                                                \\\n           _he_hh_nxt = _he_thh->hh_next;                                        \\\n           HASH_TO_BKT( _he_thh->hashv, tbl->num_buckets*2U, _he_bkt);           \\\n           _he_newbkt = &(_he_new_buckets[ _he_bkt ]);                           \\\n           if (++(_he_newbkt->count) > tbl->ideal_chain_maxlen) {                \\\n             tbl->nonideal_items++;                                              \\\n             _he_newbkt->expand_mult = _he_newbkt->count /                       \\\n                                        tbl->ideal_chain_maxlen;                 \\\n           }                                                                     \\\n           _he_thh->hh_prev = NULL;                                              \\\n           _he_thh->hh_next = _he_newbkt->hh_head;                               \\\n           if (_he_newbkt->hh_head != NULL) { _he_newbkt->hh_head->hh_prev =     \\\n                _he_thh; }                                                       \\\n           _he_newbkt->hh_head = _he_thh;                                        \\\n           _he_thh = _he_hh_nxt;                                                 \\\n        }                                                                        \\\n    }                                                                            \\\n    uthash_free( tbl->buckets, tbl->num_buckets*sizeof(struct UT_hash_bucket) ); \\\n    tbl->num_buckets *= 2U;                                                      \\\n    tbl->log2_num_buckets++;                                                     \\\n    tbl->buckets = _he_new_buckets;                                              \\\n    tbl->ineff_expands = (tbl->nonideal_items > (tbl->num_items >> 1)) ?         \\\n        (tbl->ineff_expands+1U) : 0U;                                            \\\n    if (tbl->ineff_expands > 1U) {                                               \\\n        tbl->noexpand=1;                                                         \\\n        uthash_noexpand_fyi(tbl);                                                \\\n    }                                                                            \\\n    uthash_expand_fyi(tbl);                                                      \\\n} while (0)\n\n\n/* This is an adaptation of Simon Tatham's O(n log(n)) mergesort */\n/* Note that HASH_SORT assumes the hash handle name to be hh.\n * HASH_SRT was added to allow the hash handle name to be passed in. */\n#define HASH_SORT(head,cmpfcn) HASH_SRT(hh,head,cmpfcn)\n#define HASH_SRT(hh,head,cmpfcn)                                                 \\\ndo {                                                                             \\\n  unsigned _hs_i;                                                                \\\n  unsigned _hs_looping,_hs_nmerges,_hs_insize,_hs_psize,_hs_qsize;               \\\n  struct UT_hash_handle *_hs_p, *_hs_q, *_hs_e, *_hs_list, *_hs_tail;            \\\n  if (head != NULL) {                                                            \\\n      _hs_insize = 1;                                                            \\\n      _hs_looping = 1;                                                           \\\n      _hs_list = &((head)->hh);                                                  \\\n      while (_hs_looping != 0U) {                                                \\\n          _hs_p = _hs_list;                                                      \\\n          _hs_list = NULL;                                                       \\\n          _hs_tail = NULL;                                                       \\\n          _hs_nmerges = 0;                                                       \\\n          while (_hs_p != NULL) {                                                \\\n              _hs_nmerges++;                                                     \\\n              _hs_q = _hs_p;                                                     \\\n              _hs_psize = 0;                                                     \\\n              for ( _hs_i = 0; _hs_i  < _hs_insize; _hs_i++ ) {                  \\\n                  _hs_psize++;                                                   \\\n                  _hs_q = (UT_hash_handle*)((_hs_q->next != NULL) ?              \\\n                          ((void*)((char*)(_hs_q->next) +                        \\\n                          (head)->hh.tbl->hho)) : NULL);                         \\\n                  if (! (_hs_q) ) { break; }                                     \\\n              }                                                                  \\\n              _hs_qsize = _hs_insize;                                            \\\n              while ((_hs_psize > 0U) || ((_hs_qsize > 0U) && (_hs_q != NULL))) {\\\n                  if (_hs_psize == 0U) {                                         \\\n                      _hs_e = _hs_q;                                             \\\n                      _hs_q = (UT_hash_handle*)((_hs_q->next != NULL) ?          \\\n                              ((void*)((char*)(_hs_q->next) +                    \\\n                              (head)->hh.tbl->hho)) : NULL);                     \\\n                      _hs_qsize--;                                               \\\n                  } else if ( (_hs_qsize == 0U) || (_hs_q == NULL) ) {           \\\n                      _hs_e = _hs_p;                                             \\\n                      if (_hs_p != NULL){                                        \\\n                        _hs_p = (UT_hash_handle*)((_hs_p->next != NULL) ?        \\\n                                ((void*)((char*)(_hs_p->next) +                  \\\n                                (head)->hh.tbl->hho)) : NULL);                   \\\n                       }                                                         \\\n                      _hs_psize--;                                               \\\n                  } else if ((                                                   \\\n                      cmpfcn(DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_p)), \\\n                             DECLTYPE(head)(ELMT_FROM_HH((head)->hh.tbl,_hs_q))) \\\n                             ) <= 0) {                                           \\\n                      _hs_e = _hs_p;                                             \\\n                      if (_hs_p != NULL){                                        \\\n                        _hs_p = (UT_hash_handle*)((_hs_p->next != NULL) ?        \\\n                               ((void*)((char*)(_hs_p->next) +                   \\\n                               (head)->hh.tbl->hho)) : NULL);                    \\\n                       }                                                         \\\n                      _hs_psize--;                                               \\\n                  } else {                                                       \\\n                      _hs_e = _hs_q;                                             \\\n                      _hs_q = (UT_hash_handle*)((_hs_q->next != NULL) ?          \\\n                              ((void*)((char*)(_hs_q->next) +                    \\\n                              (head)->hh.tbl->hho)) : NULL);                     \\\n                      _hs_qsize--;                                               \\\n                  }                                                              \\\n                  if ( _hs_tail != NULL ) {                                      \\\n                      _hs_tail->next = ((_hs_e != NULL) ?                        \\\n                            ELMT_FROM_HH((head)->hh.tbl,_hs_e) : NULL);          \\\n                  } else {                                                       \\\n                      _hs_list = _hs_e;                                          \\\n                  }                                                              \\\n                  if (_hs_e != NULL) {                                           \\\n                  _hs_e->prev = ((_hs_tail != NULL) ?                            \\\n                     ELMT_FROM_HH((head)->hh.tbl,_hs_tail) : NULL);              \\\n                  }                                                              \\\n                  _hs_tail = _hs_e;                                              \\\n              }                                                                  \\\n              _hs_p = _hs_q;                                                     \\\n          }                                                                      \\\n          if (_hs_tail != NULL){                                                 \\\n            _hs_tail->next = NULL;                                               \\\n          }                                                                      \\\n          if ( _hs_nmerges <= 1U ) {                                             \\\n              _hs_looping=0;                                                     \\\n              (head)->hh.tbl->tail = _hs_tail;                                   \\\n              DECLTYPE_ASSIGN(head,ELMT_FROM_HH((head)->hh.tbl, _hs_list));      \\\n          }                                                                      \\\n          _hs_insize *= 2U;                                                      \\\n      }                                                                          \\\n      HASH_FSCK(hh,head);                                                        \\\n }                                                                               \\\n} while (0)\n\n/* This function selects items from one hash into another hash.\n * The end result is that the selected items have dual presence\n * in both hashes. There is no copy of the items made; rather\n * they are added into the new hash through a secondary hash\n * hash handle that must be present in the structure. */\n#define HASH_SELECT(hh_dst, dst, hh_src, src, cond)                              \\\ndo {                                                                             \\\n  unsigned _src_bkt, _dst_bkt;                                                   \\\n  void *_last_elt=NULL, *_elt;                                                   \\\n  UT_hash_handle *_src_hh, *_dst_hh, *_last_elt_hh=NULL;                         \\\n  ptrdiff_t _dst_hho = ((char*)(&(dst)->hh_dst) - (char*)(dst));                 \\\n  if (src != NULL) {                                                             \\\n    for(_src_bkt=0; _src_bkt < (src)->hh_src.tbl->num_buckets; _src_bkt++) {     \\\n      for(_src_hh = (src)->hh_src.tbl->buckets[_src_bkt].hh_head;                \\\n          _src_hh != NULL;                                                       \\\n          _src_hh = _src_hh->hh_next) {                                          \\\n          _elt = ELMT_FROM_HH((src)->hh_src.tbl, _src_hh);                       \\\n          if (cond(_elt)) {                                                      \\\n            _dst_hh = (UT_hash_handle*)(((char*)_elt) + _dst_hho);               \\\n            _dst_hh->key = _src_hh->key;                                         \\\n            _dst_hh->keylen = _src_hh->keylen;                                   \\\n            _dst_hh->hashv = _src_hh->hashv;                                     \\\n            _dst_hh->prev = _last_elt;                                           \\\n            _dst_hh->next = NULL;                                                \\\n            if (_last_elt_hh != NULL) { _last_elt_hh->next = _elt; }             \\\n            if (dst == NULL) {                                                   \\\n              DECLTYPE_ASSIGN(dst,_elt);                                         \\\n              HASH_MAKE_TABLE(hh_dst,dst);                                       \\\n            } else {                                                             \\\n              _dst_hh->tbl = (dst)->hh_dst.tbl;                                  \\\n            }                                                                    \\\n            HASH_TO_BKT(_dst_hh->hashv, _dst_hh->tbl->num_buckets, _dst_bkt);    \\\n            HASH_ADD_TO_BKT(_dst_hh->tbl->buckets[_dst_bkt],_dst_hh);            \\\n            (dst)->hh_dst.tbl->num_items++;                                      \\\n            _last_elt = _elt;                                                    \\\n            _last_elt_hh = _dst_hh;                                              \\\n          }                                                                      \\\n      }                                                                          \\\n    }                                                                            \\\n  }                                                                              \\\n  HASH_FSCK(hh_dst,dst);                                                         \\\n} while (0)\n\n#define HASH_CLEAR(hh,head)                                                      \\\ndo {                                                                             \\\n  if (head != NULL) {                                                            \\\n    uthash_free((head)->hh.tbl->buckets,                                         \\\n                (head)->hh.tbl->num_buckets*sizeof(struct UT_hash_bucket));      \\\n    HASH_BLOOM_FREE((head)->hh.tbl);                                             \\\n    uthash_free((head)->hh.tbl, sizeof(UT_hash_table));                          \\\n    (head)=NULL;                                                                 \\\n  }                                                                              \\\n} while (0)\n\n#define HASH_OVERHEAD(hh,head)                                                   \\\n ((head != NULL) ? (                                                             \\\n (size_t)(((head)->hh.tbl->num_items   * sizeof(UT_hash_handle))   +             \\\n          ((head)->hh.tbl->num_buckets * sizeof(UT_hash_bucket))   +             \\\n           sizeof(UT_hash_table)                                   +             \\\n           (HASH_BLOOM_BYTELEN))) : 0U)\n\n#ifdef NO_DECLTYPE\n#define HASH_ITER(hh,head,el,tmp)                                                \\\nfor(((el)=(head)), ((*(char**)(&(tmp)))=(char*)((head!=NULL)?(head)->hh.next:NULL)); \\\n  (el) != NULL; ((el)=(tmp)), ((*(char**)(&(tmp)))=(char*)((tmp!=NULL)?(tmp)->hh.next:NULL)))\n#else\n#define HASH_ITER(hh,head,el,tmp)                                                \\\nfor(((el)=(head)), ((tmp)=DECLTYPE(el)((head!=NULL)?(head)->hh.next:NULL));      \\\n  (el) != NULL; ((el)=(tmp)), ((tmp)=DECLTYPE(el)((tmp!=NULL)?(tmp)->hh.next:NULL)))\n#endif\n\n/* obtain a count of items in the hash */\n#define HASH_COUNT(head) HASH_CNT(hh,head)\n#define HASH_CNT(hh,head) ((head != NULL)?((head)->hh.tbl->num_items):0U)\n\ntypedef struct UT_hash_bucket {\n   struct UT_hash_handle *hh_head;\n   unsigned count;\n\n   /* expand_mult is normally set to 0. In this situation, the max chain length\n    * threshold is enforced at its default value, HASH_BKT_CAPACITY_THRESH. (If\n    * the bucket's chain exceeds this length, bucket expansion is triggered).\n    * However, setting expand_mult to a non-zero value delays bucket expansion\n    * (that would be triggered by additions to this particular bucket)\n    * until its chain length reaches a *multiple* of HASH_BKT_CAPACITY_THRESH.\n    * (The multiplier is simply expand_mult+1). The whole idea of this\n    * multiplier is to reduce bucket expansions, since they are expensive, in\n    * situations where we know that a particular bucket tends to be overused.\n    * It is better to let its chain length grow to a longer yet-still-bounded\n    * value, than to do an O(n) bucket expansion too often.\n    */\n   unsigned expand_mult;\n\n} UT_hash_bucket;\n\n/* random signature used only to find hash tables in external analysis */\n#define HASH_SIGNATURE 0xa0111fe1u\n#define HASH_BLOOM_SIGNATURE 0xb12220f2u\n\ntypedef struct UT_hash_table {\n   UT_hash_bucket *buckets;\n   unsigned num_buckets, log2_num_buckets;\n   unsigned num_items;\n   struct UT_hash_handle *tail; /* tail hh in app order, for fast append    */\n   ptrdiff_t hho; /* hash handle offset (byte pos of hash handle in element */\n\n   /* in an ideal situation (all buckets used equally), no bucket would have\n    * more than ceil(#items/#buckets) items. that's the ideal chain length. */\n   unsigned ideal_chain_maxlen;\n\n   /* nonideal_items is the number of items in the hash whose chain position\n    * exceeds the ideal chain maxlen. these items pay the penalty for an uneven\n    * hash distribution; reaching them in a chain traversal takes >ideal steps */\n   unsigned nonideal_items;\n\n   /* ineffective expands occur when a bucket doubling was performed, but\n    * afterward, more than half the items in the hash had nonideal chain\n    * positions. If this happens on two consecutive expansions we inhibit any\n    * further expansion, as it's not helping; this happens when the hash\n    * function isn't a good fit for the key domain. When expansion is inhibited\n    * the hash will still work, albeit no longer in constant time. */\n   unsigned ineff_expands, noexpand;\n\n   uint32_t signature; /* used only to find hash tables in external analysis */\n#ifdef HASH_BLOOM\n   uint32_t bloom_sig; /* used only to test bloom exists in external analysis */\n   uint8_t *bloom_bv;\n   uint8_t bloom_nbits;\n#endif\n\n} UT_hash_table;\n\ntypedef struct UT_hash_handle {\n   struct UT_hash_table *tbl;\n   void *prev;                       /* prev element in app order      */\n   void *next;                       /* next element in app order      */\n   struct UT_hash_handle *hh_prev;   /* previous hh in bucket order    */\n   struct UT_hash_handle *hh_next;   /* next hh in bucket order        */\n   void *key;                        /* ptr to enclosing struct's key  */\n   unsigned keylen;                  /* enclosing struct's key len     */\n   unsigned hashv;                   /* result of hash-fcn(key)        */\n} UT_hash_handle;\n\n#endif /* UTHASH_H */\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/utils.c",
    "content": "/*\n * utils.c - Misc utilities\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#ifdef HAVE_CONFIG_H\n#include \"config.h\"\n#endif\n\n#include <stdlib.h>\n#include <unistd.h>\n#include <string.h>\n#include <errno.h>\n#include <ctype.h>\n#ifndef __MINGW32__\n#include <pwd.h>\n#include <grp.h>\n#endif\n\n#include <sys/types.h>\n#include <sys/stat.h>\n\n#include \"utils.h\"\n\n#ifdef HAVE_SETRLIMIT\n#include <sys/time.h>\n#include <sys/resource.h>\n#endif\n\n#define INT_DIGITS 19           /* enough for 64 bit integer */\n\n#ifdef LIB_ONLY\nFILE *logfile;\n#endif\n\n#ifdef HAS_SYSLOG\nint use_syslog = 0;\n#endif\n\n#ifndef __MINGW32__\nvoid\nERROR(const char *s)\n{\n    char *msg = strerror(errno);\n    LOGE(\"%s: %s\", s, msg);\n}\n\n#endif\n\nint use_tty = 1;\n\nchar *\nss_itoa(int i)\n{\n    /* Room for INT_DIGITS digits, - and '\\0' */\n    static char buf[INT_DIGITS + 2];\n    char *p = buf + INT_DIGITS + 1;     /* points to terminating '\\0' */\n    if (i >= 0) {\n        do {\n            *--p = '0' + (i % 10);\n            i   /= 10;\n        } while (i != 0);\n        return p;\n    } else {                     /* i < 0 */\n        do {\n            *--p = '0' - (i % 10);\n            i   /= 10;\n        } while (i != 0);\n        *--p = '-';\n    }\n    return p;\n}\n\nint\nss_isnumeric(const char *s) {\n    if (!s || !*s)\n        return 0;\n    while (isdigit(*s))\n        ++s;\n    return *s == '\\0';\n}\n\n/*\n * setuid() and setgid() for a specified user.\n */\nint\nrun_as(const char *user)\n{\n#ifndef __MINGW32__\n    if (user[0]) {\n        /* Convert user to a long integer if it is a non-negative number.\n         * -1 means it is a user name. */\n        long uid = -1;\n        if (ss_isnumeric(user)) {\n            errno = 0;\n            char *endptr;\n            uid = strtol(user, &endptr, 10);\n            if (errno || endptr == user)\n                uid = -1;\n        }\n\n#ifdef HAVE_GETPWNAM_R\n        struct passwd pwdbuf, *pwd;\n        memset(&pwdbuf, 0, sizeof(struct passwd));\n        size_t buflen;\n        int err;\n\n        for (buflen = 128;; buflen *= 2) {\n            char buf[buflen];  /* variable length array */\n\n            /* Note that we use getpwnam_r() instead of getpwnam(),\n             * which returns its result in a statically allocated buffer and\n             * cannot be considered thread safe. */\n            err = uid >= 0 ? getpwuid_r((uid_t)uid, &pwdbuf, buf, buflen, &pwd)\n                : getpwnam_r(user, &pwdbuf, buf, buflen, &pwd);\n\n            if (err == 0 && pwd) {\n                /* setgid first, because we may not be allowed to do it anymore after setuid */\n                if (setgid(pwd->pw_gid) != 0) {\n                    LOGE(\n                        \"Could not change group id to that of run_as user '%s': %s\",\n                        pwd->pw_name, strerror(errno));\n                    return 0;\n                }\n\n                if (initgroups(pwd->pw_name, pwd->pw_gid) == -1) {\n                    LOGE(\"Could not change supplementary groups for user '%s'.\", pwd->pw_name);\n                    return 0;\n                }\n\n                if (setuid(pwd->pw_uid) != 0) {\n                    LOGE(\n                        \"Could not change user id to that of run_as user '%s': %s\",\n                        pwd->pw_name, strerror(errno));\n                    return 0;\n                }\n                break;\n            } else if (err != ERANGE) {\n                if (err) {\n                    LOGE(\"run_as user '%s' could not be found: %s\", user,\n                            strerror(err));\n                } else {\n                    LOGE(\"run_as user '%s' could not be found.\", user);\n                }\n                return 0;\n            } else if (buflen >= 16 * 1024) {\n                /* If getpwnam_r() seems defective, call it quits rather than\n                 * keep on allocating ever larger buffers until we crash. */\n                LOGE(\n                    \"getpwnam_r() requires more than %u bytes of buffer space.\",\n                    (unsigned)buflen);\n                return 0;\n            }\n            /* Else try again with larger buffer. */\n        }\n#else\n        /* No getpwnam_r() :-(  We'll use getpwnam() and hope for the best. */\n        struct passwd *pwd;\n\n        if (!(pwd = uid >=0 ? getpwuid((uid_t)uid) : getpwnam(user))) {\n            LOGE(\"run_as user %s could not be found.\", user);\n            return 0;\n        }\n        /* setgid first, because we may not allowed to do it anymore after setuid */\n        if (setgid(pwd->pw_gid) != 0) {\n            LOGE(\"Could not change group id to that of run_as user '%s': %s\",\n                 pwd->pw_name, strerror(errno));\n            return 0;\n        }\n        if (initgroups(pwd->pw_name, pwd->pw_gid) == -1) {\n            LOGE(\"Could not change supplementary groups for user '%s'.\", pwd->pw_name);\n            return 0;\n        }\n        if (setuid(pwd->pw_uid) != 0) {\n            LOGE(\"Could not change user id to that of run_as user '%s': %s\",\n                 pwd->pw_name, strerror(errno));\n            return 0;\n        }\n#endif\n    }\n\n#endif // __MINGW32__\n    return 1;\n}\n\nchar *\nss_strndup(const char *s, size_t n)\n{\n    size_t len = strlen(s);\n    char *ret;\n\n    if (len <= n) {\n        return strdup(s);\n    }\n\n    ret = ss_malloc(n + 1);\n    strncpy(ret, s, n);\n    ret[n] = '\\0';\n    return ret;\n}\n\nvoid\nFATAL(const char *msg)\n{\n    LOGE(\"%s\", msg);\n    exit(-1);\n}\n\nvoid *\nss_malloc(size_t size)\n{\n    void *tmp = malloc(size);\n    if (tmp == NULL)\n        exit(EXIT_FAILURE);\n    return tmp;\n}\n\nvoid *\nss_realloc(void *ptr, size_t new_size)\n{\n    void *new = realloc(ptr, new_size);\n    if (new == NULL) {\n        free(ptr);\n        ptr = NULL;\n        exit(EXIT_FAILURE);\n    }\n    return new;\n}\n\nvoid\nusage()\n{\n    printf(\"\\n\");\n    printf(\"shadowsocks-libev %s with %s\\n\\n\", VERSION, USING_CRYPTO);\n    printf(\n        \"  maintained by Max Lv <max.c.lv@gmail.com> and Linus Yang <laokongzi@gmail.com>\\n\\n\");\n    printf(\"  usage:\\n\\n\");\n#ifdef MODULE_LOCAL\n    printf(\"    ss-local\\n\");\n#elif MODULE_REMOTE\n    printf(\"    ss-server\\n\");\n#elif MODULE_TUNNEL\n    printf(\"    ss-tunnel\\n\");\n#elif MODULE_REDIR\n    printf(\"    ss-redir\\n\");\n#elif MODULE_MANAGER\n    printf(\"    ss-manager\\n\");\n#endif\n    printf(\"\\n\");\n    printf(\n        \"       -s <server_host>           Host name or IP address of your remote server.\\n\");\n    printf(\n        \"       -p <server_port>           Port number of your remote server.\\n\");\n    printf(\n        \"       -l <local_port>            Port number of your local server.\\n\");\n    printf(\n        \"       -k <password>              Password of your remote server.\\n\");\n    printf(\n        \"       -m <encrypt_method>        Encrypt method: table, rc4, rc4-md5,\\n\");\n    printf(\n        \"                                  aes-128-cfb, aes-192-cfb, aes-256-cfb,\\n\");\n    printf(\n        \"                                  aes-128-ctr, aes-192-ctr, aes-256-ctr,\\n\");\n    printf(\n        \"                                  bf-cfb, camellia-128-cfb, camellia-192-cfb,\\n\");\n    printf(\n        \"                                  camellia-256-cfb, cast5-cfb, des-cfb,\\n\");\n    printf(\n        \"                                  idea-cfb, rc2-cfb, seed-cfb, salsa20,\\n\");\n    printf(\n        \"                                  chacha20 and chacha20-ietf.\\n\");\n    printf(\n        \"                                  The default cipher is rc4-md5.\\n\");\n    printf(\"\\n\");\n    printf(\n        \"       [-a <user>]                Run as another user.\\n\");\n    printf(\n        \"       [-f <pid_file>]            The file path to store pid.\\n\");\n    printf(\n        \"       [-t <timeout>]             Socket timeout in seconds.\\n\");\n    printf(\n        \"       [-c <config_file>]         The path to config file.\\n\");\n#ifdef HAVE_SETRLIMIT\n    printf(\n        \"       [-n <number>]              Max number of open files.\\n\");\n#endif\n#ifndef MODULE_REDIR\n    printf(\n        \"       [-i <interface>]           Network interface to bind.\\n\");\n#endif\n    printf(\n        \"       [-b <local_address>]       Local address to bind.\\n\");\n    printf(\"\\n\");\n    printf(\n        \"       [-u]                       Enable UDP relay.\\n\");\n#ifdef MODULE_REDIR\n    printf(\n        \"                                  TPROXY is required in redir mode.\\n\");\n#endif\n    printf(\n        \"       [-U]                       Enable UDP relay and disable TCP relay.\\n\");\n    printf(\n        \"       [-A]                       Enable onetime authentication.\\n\");\n#ifdef MODULE_REMOTE\n    printf(\n        \"       [-6]                       Resovle hostname to IPv6 address first.\\n\");\n#endif\n    printf(\"\\n\");\n#ifdef MODULE_TUNNEL\n    printf(\n        \"       [-L <addr>:<port>]         Destination server address and port\\n\");\n    printf(\n        \"                                  for local port forwarding.\\n\");\n#endif\n#ifdef MODULE_REMOTE\n    printf(\n        \"       [-d <addr>]                Name servers for internal DNS resolver.\\n\");\n#endif\n#if defined(MODULE_REMOTE) || defined(MODULE_LOCAL)\n    printf(\n        \"       [--fast-open]              Enable TCP fast open.\\n\");\n    printf(\n        \"                                  with Linux kernel > 3.7.0.\\n\");\n    printf(\n        \"       [--acl <acl_file>]         Path to ACL (Access Control List).\\n\");\n#endif\n#if defined(MODULE_REMOTE) || defined(MODULE_MANAGER)\n    printf(\n        \"       [--manager-address <addr>] UNIX domain socket address.\\n\");\n#endif\n#ifdef MODULE_MANAGER\n    printf(\n        \"       [--executable <path>]      Path to the executable of ss-server.\\n\");\n#endif\n    printf(\n        \"       [--mtu <MTU>]              MTU of your network interface.\\n\");\n#ifdef __linux__\n    printf(\n        \"       [--mptcp]                  Enable Multipath TCP on MPTCP Kernel.\\n\");\n#ifdef MODULE_REMOTE\n    printf(\n        \"       [--firewall]               Setup firewall rules for auto blocking.\\n\");\n#endif\n#endif\n    printf(\"\\n\");\n    printf(\n        \"       [-v]                       Verbose mode.\\n\");\n    printf(\n        \"       [-h, --help]               Print this message.\\n\");\n    printf(\"\\n\");\n}\n\nvoid\ndaemonize(const char *path)\n{\n#ifndef __MINGW32__\n    /* Our process ID and Session ID */\n    pid_t pid, sid;\n\n    /* Fork off the parent process */\n    pid = fork();\n    if (pid < 0) {\n        exit(EXIT_FAILURE);\n    }\n\n    /* If we got a good PID, then\n     * we can exit the parent process. */\n    if (pid > 0) {\n        FILE *file = fopen(path, \"w\");\n        if (file == NULL) {\n            FATAL(\"Invalid pid file\\n\");\n        }\n\n        fprintf(file, \"%d\", (int)pid);\n        fclose(file);\n        exit(EXIT_SUCCESS);\n    }\n\n    /* Change the file mode mask */\n    umask(0);\n\n    /* Open any logs here */\n\n    /* Create a new SID for the child process */\n    sid = setsid();\n    if (sid < 0) {\n        /* Log the failure */\n        exit(EXIT_FAILURE);\n    }\n\n    /* Change the current working directory */\n    if ((chdir(\"/\")) < 0) {\n        /* Log the failure */\n        exit(EXIT_FAILURE);\n    }\n\n    /* Close out the standard file descriptors */\n    close(STDIN_FILENO);\n    close(STDOUT_FILENO);\n    close(STDERR_FILENO);\n#endif\n}\n\n#ifdef HAVE_SETRLIMIT\nint\nset_nofile(int nofile)\n{\n    struct rlimit limit = { nofile, nofile }; /* set both soft and hard limit */\n\n    if (nofile <= 0) {\n        FATAL(\"nofile must be greater than 0\\n\");\n    }\n\n    if (setrlimit(RLIMIT_NOFILE, &limit) < 0) {\n        if (errno == EPERM) {\n            LOGE(\n                \"insufficient permission to change NOFILE, not starting as root?\");\n            return -1;\n        } else if (errno == EINVAL) {\n            LOGE(\"invalid nofile, decrease nofile and try again\");\n            return -1;\n        } else {\n            LOGE(\"setrlimit failed: %s\", strerror(errno));\n            return -1;\n        }\n    }\n\n    return 0;\n}\n\n#endif\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/utils.h",
    "content": "/*\n * utils.h - Misc utilities\n *\n * Copyright (C) 2013 - 2016, Max Lv <max.c.lv@gmail.com>\n *\n * This file is part of the shadowsocks-libev.\n *\n * shadowsocks-libev is free software; you can redistribute it and/or modify\n * it under the terms of the GNU General Public License as published by\n * the Free Software Foundation; either version 3 of the License, or\n * (at your option) any later version.\n *\n * shadowsocks-libev is distributed in the hope that it will be useful,\n * but WITHOUT ANY WARRANTY; without even the implied warranty of\n * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the\n * GNU General Public License for more details.\n *\n * You should have received a copy of the GNU General Public License\n * along with shadowsocks-libev; see the file COPYING. If not, see\n * <http://www.gnu.org/licenses/>.\n */\n\n#if defined(USE_CRYPTO_OPENSSL)\n\n#include <openssl/opensslv.h>\n#define USING_CRYPTO OPENSSL_VERSION_TEXT\n\n#elif defined(USE_CRYPTO_POLARSSL)\n#include <polarssl/version.h>\n#define USING_CRYPTO POLARSSL_VERSION_STRING_FULL\n\n#elif defined(USE_CRYPTO_MBEDTLS)\n#include <mbedtls/version.h>\n#define USING_CRYPTO MBEDTLS_VERSION_STRING_FULL\n\n#endif\n\n#ifndef _UTILS_H\n#define _UTILS_H\n\n#include <stddef.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <time.h>\n\n#define PORTSTRLEN 16\n#define SS_ADDRSTRLEN (INET6_ADDRSTRLEN + PORTSTRLEN + 1)\n\n#ifdef ANDROID\n\n#include <android/log.h>\n\n#define USE_TTY()\n#define USE_SYSLOG(ident)\n#define LOGI(...)                                                \\\n    ((void)__android_log_print(ANDROID_LOG_DEBUG, \"shadowsocks\", \\\n                               __VA_ARGS__))\n#define LOGE(...)                                                \\\n    ((void)__android_log_print(ANDROID_LOG_ERROR, \"shadowsocks\", \\\n                               __VA_ARGS__))\n\n#else\n\n#define STR(x) # x\n#define TOSTR(x) STR(x)\n\n#ifdef LIB_ONLY\n\nextern FILE *logfile;\n\n#define TIME_FORMAT \"%Y-%m-%d %H:%M:%S\"\n\n#define USE_TTY()\n\n#define USE_SYSLOG(ident)\n\n#define USE_LOGFILE(ident)                                     \\\n    do {                                                       \\\n        if (ident != NULL) { logfile = fopen(ident, \"w+\"); } } \\\n    while (0)\n\n#define CLOSE_LOGFILE                               \\\n    do {                                            \\\n        if (logfile != NULL) { fclose(logfile); } } \\\n    while (0)\n\n#define LOGI(format, ...)                                                        \\\n    do {                                                                         \\\n        if (logfile != NULL) {                                                   \\\n            time_t now = time(NULL);                                             \\\n            char timestr[20];                                                    \\\n            strftime(timestr, 20, TIME_FORMAT, localtime(&now));                 \\\n            fprintf(logfile, \" %s INFO: \" format \"\\n\", timestr, ## __VA_ARGS__); \\\n            fflush(logfile); }                                                   \\\n    }                                                                            \\\n    while (0)\n\n#define LOGE(format, ...)                                        \\\n    do {                                                         \\\n        if (logfile != NULL) {                                   \\\n            time_t now = time(NULL);                             \\\n            char timestr[20];                                    \\\n            strftime(timestr, 20, TIME_FORMAT, localtime(&now)); \\\n            fprintf(logfile, \" %s ERROR: \" format \"\\n\", timestr, \\\n                    ## __VA_ARGS__);                             \\\n            fflush(logfile); }                                   \\\n    }                                                            \\\n    while (0)\n\n#elif defined(_WIN32)\n\n#define TIME_FORMAT \"%Y-%m-%d %H:%M:%S\"\n\n#define USE_TTY()\n\n#define USE_SYSLOG(ident)\n\n#define LOGI(format, ...)                                                   \\\n    do {                                                                    \\\n        time_t now = time(NULL);                                            \\\n        char timestr[20];                                                   \\\n        strftime(timestr, 20, TIME_FORMAT, localtime(&now));                \\\n        fprintf(stderr, \" %s INFO: \" format \"\\n\", timestr, ## __VA_ARGS__); \\\n        fflush(stderr); }                                                   \\\n    while (0)\n\n#define LOGE(format, ...)                                                    \\\n    do {                                                                     \\\n        time_t now = time(NULL);                                             \\\n        char timestr[20];                                                    \\\n        strftime(timestr, 20, TIME_FORMAT, localtime(&now));                 \\\n        fprintf(stderr, \" %s ERROR: \" format \"\\n\", timestr, ## __VA_ARGS__); \\\n        fflush(stderr); }                                                    \\\n    while (0)\n\n#else\n\n#include <syslog.h>\n\nextern int use_tty;\n#define USE_TTY()                        \\\n    do {                                 \\\n        use_tty = isatty(STDERR_FILENO); \\\n    } while (0)                          \\\n\n#define HAS_SYSLOG\nextern int use_syslog;\n\n#define TIME_FORMAT \"%F %T\"\n\n#define USE_SYSLOG(ident)                          \\\n    do {                                           \\\n        use_syslog = 1;                            \\\n        openlog((ident), LOG_CONS | LOG_PID, 0); } \\\n    while (0)\n\n#define LOGI(format, ...)                                                        \\\n    do {                                                                         \\\n        if (use_syslog) {                                                        \\\n            syslog(LOG_INFO, format, ## __VA_ARGS__);                            \\\n        } else {                                                                 \\\n            time_t now = time(NULL);                                             \\\n            char timestr[20];                                                    \\\n            strftime(timestr, 20, TIME_FORMAT, localtime(&now));                 \\\n            if (use_tty) {                                                       \\\n                fprintf(stderr, \"\\e[01;32m %s INFO: \\e[0m\" format \"\\n\", timestr, \\\n                        ## __VA_ARGS__);                                         \\\n            } else {                                                             \\\n                fprintf(stderr, \" %s INFO: \" format \"\\n\", timestr,               \\\n                        ## __VA_ARGS__);                                         \\\n            }                                                                    \\\n        }                                                                        \\\n    }                                                                            \\\n    while (0)\n\n#define LOGE(format, ...)                                                         \\\n    do {                                                                          \\\n        if (use_syslog) {                                                         \\\n            syslog(LOG_ERR, format, ## __VA_ARGS__);                              \\\n        } else {                                                                  \\\n            time_t now = time(NULL);                                              \\\n            char timestr[20];                                                     \\\n            strftime(timestr, 20, TIME_FORMAT, localtime(&now));                  \\\n            if (use_tty) {                                                        \\\n                fprintf(stderr, \"\\e[01;35m %s ERROR: \\e[0m\" format \"\\n\", timestr, \\\n                        ## __VA_ARGS__);                                          \\\n            } else {                                                              \\\n                fprintf(stderr, \" %s ERROR: \" format \"\\n\", timestr,               \\\n                        ## __VA_ARGS__);                                          \\\n            }                                                                     \\\n        } }                                                                       \\\n    while (0)\n\n#endif\n/* _WIN32 */\n\n#endif\n\n#ifdef __MINGW32__\n\n#ifdef ERROR\n#undef ERROR\n#endif\n#define ERROR(s) ss_error(s)\n\n#else\n\nvoid ERROR(const char *s);\n\n#endif\n\nchar *ss_itoa(int i);\nint ss_isnumeric(const char *s);\nint run_as(const char *user);\nvoid FATAL(const char *msg);\nvoid usage(void);\nvoid daemonize(const char *path);\nchar *ss_strndup(const char *s, size_t n);\n#ifdef HAVE_SETRLIMIT\nint set_nofile(int nofile);\n#endif\n\nvoid *ss_malloc(size_t size);\nvoid *ss_realloc(void *ptr, size_t new_size);\n\n#define ss_free(ptr)     \\\n    do {                 \\\n        free(ptr);       \\\n        ptr = NULL;      \\\n    } while (0)\n\n#endif // _UTILS_H\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/verify.c",
    "content": "\n#include \"verify.h\"\n\nstatic int verify_simple_pack_unit_size = 2000;\n\ntypedef struct verify_simple_local_data {\n    char * recv_buffer;\n    int recv_buffer_size;\n}verify_simple_local_data;\n\nvoid verify_simple_local_data_init(verify_simple_local_data* local) {\n    local->recv_buffer = (char*)malloc(16384);\n    local->recv_buffer_size = 0;\n}\n\nobfs * verify_simple_new_obfs() {\n    obfs * self = new_obfs();\n    self->l_data = malloc(sizeof(verify_simple_local_data));\n    verify_simple_local_data_init((verify_simple_local_data*)self->l_data);\n    return self;\n}\n\nvoid verify_simple_dispose(obfs *self) {\n    verify_simple_local_data *local = (verify_simple_local_data*)self->l_data;\n    if (local->recv_buffer != NULL) {\n        free(local->recv_buffer);\n        local->recv_buffer = NULL;\n    }\n    free(local);\n    self->l_data = NULL;\n    dispose_obfs(self);\n}\n\nint verify_simple_pack_data(char *data, int datalength, char *outdata) {\n    unsigned char rand_len = (xorshift128plus() & 0xF) + 1;\n    int out_size = rand_len + datalength + 6;\n    outdata[0] = out_size >> 8;\n    outdata[1] = out_size;\n    outdata[2] = rand_len;\n    memmove(outdata + rand_len + 2, data, datalength);\n    fillcrc32((unsigned char *)outdata, out_size);\n    return out_size;\n}\n\nint verify_simple_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity) {\n    char *plaindata = *pplaindata;\n    //verify_simple_local_data *local = (verify_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc(datalength * 2 + 32);\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    while ( len > verify_simple_pack_unit_size ) {\n        pack_len = verify_simple_pack_data(data, verify_simple_pack_unit_size, buffer);\n        buffer += pack_len;\n        data += verify_simple_pack_unit_size;\n        len -= verify_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = verify_simple_pack_data(data, len, buffer);\n        buffer += pack_len;\n    }\n    len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint verify_simple_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity) {\n    char *plaindata = *pplaindata;\n    verify_simple_local_data *local = (verify_simple_local_data*)self->l_data;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n        return -1;\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    char * out_buffer = (char*)malloc(local->recv_buffer_size);\n    char * buffer = out_buffer;\n    while (local->recv_buffer_size > 2) {\n        int length = ((int)recv_buffer[0] << 8) | recv_buffer[1];\n        if (length >= 8192 || length < 7) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        int crc = crc32((unsigned char*)recv_buffer, length);\n        if (crc != -1) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            return -1;\n        }\n        int data_size = length - recv_buffer[2] - 6;\n        memmove(buffer, recv_buffer + 2 + recv_buffer[2], data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint verify_simple_server_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity) {\n    char *plaindata = *pplaindata;\n    //verify_simple_local_data *local = (verify_simple_local_data*)self->l_data;\n    char * out_buffer = (char*)malloc(datalength * 2 + 32);\n    char * buffer = out_buffer;\n    char * data = plaindata;\n    int len = datalength;\n    int pack_len;\n    while ( len > verify_simple_pack_unit_size ) {\n        pack_len = verify_simple_pack_data(data, verify_simple_pack_unit_size, buffer);\n        buffer += pack_len;\n        data += verify_simple_pack_unit_size;\n        len -= verify_simple_pack_unit_size;\n    }\n    if (len > 0) {\n        pack_len = verify_simple_pack_data(data, len, buffer);\n        buffer += pack_len;\n    }\n    len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n\nint verify_simple_server_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t *capacity) {\n    char *plaindata = *pplaindata;\n    verify_simple_local_data *local = (verify_simple_local_data*)self->l_data;\n    uint8_t * recv_buffer = (uint8_t *)local->recv_buffer;\n    if (local->recv_buffer_size + datalength > 16384)\n    {\n        LOGE(\"verify_simple: wrong buf length %d\", local->recv_buffer_size + datalength);\n        return -1;\n    }\n    memmove(recv_buffer + local->recv_buffer_size, plaindata, datalength);\n    local->recv_buffer_size += datalength;\n\n    char * out_buffer = (char*)malloc(local->recv_buffer_size);\n    char * buffer = out_buffer;\n    while (local->recv_buffer_size > 2) {\n        int length = ((int)recv_buffer[0] << 8) | recv_buffer[1];\n        if (length >= 8192 || length < 7) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            LOGE(\"verify_simple: wrong length %d\", length);\n            return -1;\n        }\n        if (length > local->recv_buffer_size)\n            break;\n\n        int crc = crc32((unsigned char*)recv_buffer, length);\n        if (crc != -1) {\n            free(out_buffer);\n            local->recv_buffer_size = 0;\n            LOGE(\"verify_simple: wrong crc\");\n            return -1;\n        }\n        int data_size = length - recv_buffer[2] - 6;\n        memmove(buffer, recv_buffer + 2 + recv_buffer[2], data_size);\n        buffer += data_size;\n        memmove(recv_buffer, recv_buffer + length, local->recv_buffer_size -= length);\n    }\n    int len = buffer - out_buffer;\n    if (*capacity < len) {\n        *pplaindata = (char*)realloc(*pplaindata, *capacity = len * 2);\n        plaindata = *pplaindata;\n    }\n    memmove(plaindata, out_buffer, len);\n    free(out_buffer);\n    return len;\n}\n"
  },
  {
    "path": "relevance/passwall-packages/shadowsocksr-libev/src/server/verify.h",
    "content": "/*\n * verify.h - Define shadowsocksR server's buffers and callbacks\n *\n * Copyright (C) 2015 - 2016, Break Wa11 <mmgac001@gmail.com>\n */\n\n#ifndef _VERIFY_H\n#define _VERIFY_H\n\nobfs * verify_simple_new_obfs();\nvoid verify_simple_dispose(obfs *self);\n\nint verify_simple_client_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint verify_simple_client_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\nint verify_simple_server_pre_encrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\nint verify_simple_server_post_decrypt(obfs *self, char **pplaindata, int datalength, size_t* capacity);\n\n#endif // _VERIFY_H\n"
  },
  {
    "path": "relevance/passwall-packages/simple-obfs/Makefile",
    "content": "#\n# Copyright (C) 2017-2019 Jian Chang <aa65535@live.com>\n#\n# Copyright (C) 2021 ImmortalWrt\n# <https://immortalwrt.org>\n#\n# This is free software, licensed under the GNU General Public License v3.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=simple-obfs\nPKG_VERSION:=0.0.5\nPKG_RELEASE:=3\n\nPKG_SOURCE_PROTO:=git\nPKG_SOURCE_URL:=https://github.com/shadowsocks/simple-obfs.git\nPKG_SOURCE_DATE:=2019-08-17\nPKG_SOURCE_VERSION:=486bebd9208539058e57e23a12f23103016e09b4\nPKG_MIRROR_HASH:=bc97eba511b86a089ab4bcf0ac78d9e4a39c59046d5cde77b79a118245daa0ba\n\nPKG_LICENSE:=GPL-3.0-or-later\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=Jian Chang <aa65535@live.com>\n\nPKG_BUILD_DEPENDS:=libev\nPKG_FIXUP:=autoreconf\nPKG_BUILD_PARALLEL:=1\nPKG_INSTALL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/simple-obfs/template\n\tSECTION:=net\n\tCATEGORY:=Network\n\tTITLE:=Simple-obfs\n\tURL:=https://github.com/shadowsocks/simple-obfs\n\tDEPENDS:=+libpthread +libev\nendef\n\ndefine Package/simple-obfs-client\n\t$(call Package/simple-obfs/template)\n\tTITLE+= (client)\n\tPROVIDES:=simple-obfs\nendef\n\ndefine Package/simple-obfs-server\n\t$(call Package/simple-obfs/template)\n\tTITLE+= (server)\nendef\n\ndefine Package/simple-obfs/description\n\tSimple-obfs is a simple obfusacting tool, designed as plugin server of shadowsocks.\nendef\n\nPackage/simple-obfs-client/description = $(Package/simple-obfs/description)\nPackage/simple-obfs-server/description = $(Package/simple-obfs/description)\n\nCONFIGURE_ARGS += \\\n\t--disable-ssp \\\n\t--disable-documentation \\\n\t--disable-assert\n\ndefine Package/simple-obfs-client/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/obfs-local $(1)/usr/bin/obfs-local\nendef\n\ndefine Package/simple-obfs-server/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/obfs-server $(1)/usr/bin/obfs-server\nendef\n\n$(eval $(call BuildPackage,simple-obfs-client))\n$(eval $(call BuildPackage,simple-obfs-server))\n"
  },
  {
    "path": "relevance/passwall-packages/simple-obfs/patches/001-convert-arguments-of-isdigit-to-int.patch",
    "content": "From bc8014cd6637798ee96b9394c716eff46115c002 Mon Sep 17 00:00:00 2001\nFrom: DDoSolitary <DDoSolitary@gmail.com>\nDate: Thu, 12 Mar 2020 12:15:37 +0800\nSubject: [PATCH] Convert arguments of isdigit to int.\n\n---\n src/utils.c | 2 +-\n 1 file changed, 1 insertion(+), 1 deletion(-)\n\ndiff --git a/src/utils.c b/src/utils.c\nindex 67cc250..514a001 100644\n--- a/src/utils.c\n+++ b/src/utils.c\n@@ -92,7 +92,7 @@ int\n ss_isnumeric(const char *s) {\n     if (!s || !*s)\n         return 0;\n-    while (isdigit(*s))\n+    while (isdigit((int)*s))\n         ++s;\n     return *s == '\\0';\n }\n"
  },
  {
    "path": "relevance/passwall-packages/sing-box/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2022-2023 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=sing-box\nPKG_VERSION:=1.13.11\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/SagerNet/sing-box/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=5e35f2cc0ad14d3beb1956157fe3f4b3a36787dd115f247c72f2d550d353853b\n\nPKG_LICENSE:=GPL-3.0-or-later\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\n\nPKG_CONFIG_DEPENDS:= \\\n\tCONFIG_SING_BOX_BUILD_ACME \\\n\tCONFIG_SING_BOX_BUILD_CLASH_API \\\n\tCONFIG_SING_BOX_BUILD_DHCP \\\n\tCONFIG_SING_BOX_BUILD_EMBEDDED_TOR \\\n\tCONFIG_SING_BOX_BUILD_GRPC \\\n\tCONFIG_SING_BOX_BUILD_GVISOR \\\n\tCONFIG_SING_BOX_BUILD_QUIC \\\n\tCONFIG_SING_BOX_BUILD_TAILSCALE \\\n\tCONFIG_SING_BOX_BUILD_UTLS \\\n\tCONFIG_SING_BOX_BUILD_V2RAY_API \\\n\tCONFIG_SING_BOX_BUILD_WIREGUARD\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/sagernet/sing-box\nGO_PKG_BUILD_PKG:=$(GO_PKG)/cmd/sing-box\nGO_PKG_LDFLAGS_X:=$(GO_PKG)/constant.Version=$(PKG_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/sing-box\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=Web Servers/Proxies\n  TITLE:=The universal proxy platform\n  URL:=https://sing-box.sagernet.org/\n  DEPENDS:=$(GO_ARCH_DEPENDS) \\\n    +ca-bundle \\\n    +kmod-inet-diag \\\n    +kmod-netlink-diag \\\n    +SING_BOX_BUILD_GVISOR:kmod-tun\n  USERID:=sing-box=5566:sing-box=5566\nendef\n\ndefine Package/sing-box/description\n  Sing-box is a universal proxy platform which supports hysteria, SOCKS, Shadowsocks,\n  ShadowTLS, Tor, trojan, VLess, VMess, WireGuard and so on.\nendef\n\ndefine Package/sing-box/config\n  if PACKAGE_sing-box\n    config SING_BOX_BUILD_ACME\n    bool \"Build with ACME TLS certificate issuer support\"\n    default y\n\n    config SING_BOX_BUILD_CLASH_API\n    bool \"Build with Clash API support\"\n    default y\n\n    config SING_BOX_BUILD_DHCP\n    bool \"Build with DHCP support\"\n\n    config SING_BOX_BUILD_EMBEDDED_TOR\n    bool \"Build with embedded Tor support\"\n    depends on BROKEN\n\n    config SING_BOX_BUILD_GRPC\n    bool \"Build with standard gPRC support\"\n    help\n      Standard gRPC has good compatibility but poor performance.\n\n    config SING_BOX_BUILD_GVISOR\n    bool \"Build with gVisor support\"\n    default y\n\n    config SING_BOX_BUILD_QUIC\n    bool \"Build with QUIC support\"\n    default y\n    help\n      Required by HTTP3 DNS transports, Naive inbound,\n      Hysteria inbound / outbound, and v2ray QUIC transport.\n\n    config SING_BOX_BUILD_TAILSCALE\n    bool \"Build with Tailscale support\"\n    default y\n\n    config SING_BOX_BUILD_UTLS\n    bool \"Build with uTLS support\"\n    default y\n\n    config SING_BOX_BUILD_V2RAY_API\n    bool \"Build with V2Ray API support\"\n\n    config SING_BOX_BUILD_WIREGUARD\n    bool \"Build with WireGuard support\"\n    default y\n  endif\nendef\n\nGO_PKG_TAGS:=$(subst $(space),$(comma),$(strip \\\n\t$(if $(CONFIG_SING_BOX_BUILD_ACME),with_acme) \\\n\t$(if $(CONFIG_SING_BOX_BUILD_CLASH_API),with_clash_api) \\\n\t$(if $(CONFIG_SING_BOX_BUILD_DHCP),with_dhcp) \\\n\t$(if $(CONFIG_SING_BOX_BUILD_EMBEDDED_TOR),with_embedded_tor) \\\n\t$(if $(CONFIG_SING_BOX_BUILD_GRPC),with_grpc) \\\n\t$(if $(CONFIG_SING_BOX_BUILD_GVISOR),with_gvisor) \\\n\t$(if $(CONFIG_SING_BOX_BUILD_QUIC),with_quic) \\\n\t$(if $(CONFIG_SING_BOX_BUILD_TAILSCALE),with_tailscale) \\\n\t$(if $(CONFIG_SING_BOX_BUILD_UTLS),with_utls) \\\n\t$(if $(CONFIG_SING_BOX_BUILD_V2RAY_API),with_v2ray_api) \\\n\t$(if $(CONFIG_SING_BOX_BUILD_WIREGUARD),with_wireguard) \\\n))\n\ndefine Package/sing-box/conffiles\nendef\n\ndefine Package/sing-box/install\n\t$(call GoPackage/Package/Install/Bin,$(1))\nendef\n\n$(eval $(call GoBinPackage,sing-box))\n$(eval $(call BuildPackage,sing-box))\n"
  },
  {
    "path": "relevance/passwall-packages/tcping/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=tcping\nPKG_VERSION:=0.3\nPKG_RELEASE:=1\n\nPKG_SOURCE_PROTO:=git\nPKG_SOURCE_URL:=https://github.com/Lienol/tcping.git\nPKG_SOURCE_DATE:=2020-07-04\nPKG_SOURCE_VERSION:=db9101834732dac9aaa59dbb7fb9c74612dbf723\nPKG_MIRROR_HASH:=36776bf64c41d0c2c2aeb79525499532831133f7b5e174fc51e9e2d7202d5776\n\nPKG_LICENSE:=GPL-2.0-only\nPKG_LICENSE_FILES:=license.txt\n\nPKG_BUILD_PARALLEL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/tcping\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=tcping measures the latency of a tcp-connection\n  URL:=https://github.com/jlyo/tcping\nendef\n\ndefine Package/tcping/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/tcping $(1)/usr/bin/\nendef\n\n$(eval $(call BuildPackage,tcping))\n"
  },
  {
    "path": "relevance/passwall-packages/trojan-plus/Makefile",
    "content": "#\n# Copyright (C) 2018-2019 wongsyrone\n#\n# This is free software, licensed under the GNU General Public License v3.\n# See /LICENSE for more information.\n#\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=trojan-plus\nPKG_VERSION:=10.0.3\nPKG_RELEASE:=2\n\nPKG_SOURCE_PROTO:=git\nPKG_SOURCE_URL:=https://github.com/peter-tank/trojan-plus.git\nPKG_SOURCE_DATE:=2020-09-06\nPKG_SOURCE_VERSION:=a6394cdd718669b0c7491493a78e61f6f0f899b3\nPKG_MIRROR_HASH:=0bc832390044668dc163e9fec3c6cf7ac3037dc30a706e94292d974446c43d97\n\nPKG_BUILD_PARALLEL:=1\nPKG_BUILD_DEPENDS:=openssl\n\nPKG_LICENSE:=GPL-3.0\nPKG_LICENSE_FILE:=LICENSE\nPKG_MAINTAINER:=Trojan-Plus-Group\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(INCLUDE_DIR)/cmake.mk\ninclude ./boost-version.mk\n\nTARGET_CXXFLAGS += -Wall -Wextra\nTARGET_CXXFLAGS += $(FPIC)\n\n# LTO\nTARGET_CXXFLAGS += -flto\nTARGET_LDFLAGS += -flto\n\n# CXX standard\nTARGET_CXXFLAGS += -std=c++11\nTARGET_CXXFLAGS := $(filter-out -O%,$(TARGET_CXXFLAGS)) -O3\nTARGET_CXXFLAGS += -ffunction-sections -fdata-sections\nTARGET_LDFLAGS += -Wl,--gc-sections\n\nCMAKE_OPTIONS += \\\n\t-DENABLE_MYSQL=OFF \\\n\t-DENABLE_NAT=ON \\\n\t-DENABLE_REUSE_PORT=ON \\\n\t-DENABLE_SSL_KEYLOG=ON \\\n\t-DENABLE_TLS13_CIPHERSUITES=ON \\\n\t-DFORCE_TCP_FASTOPEN=OFF \\\n\t-DSYSTEMD_SERVICE=OFF \\\n\t-DOPENSSL_USE_STATIC_LIBS=FALSE \\\n\t-DBoost_DEBUG=ON \\\n\t-DBoost_NO_BOOST_CMAKE=ON\n\ndefine Package/trojan-plus\n\tSECTION:=net\n\tCATEGORY:=Network\n\tTITLE:=An unidentifiable mechanism that helps you bypass GFW. It's compatible with original trojan with experimental features.\n\tURL:=https://github.com/Trojan-Plus-Group/trojan-plus\n\tDEPENDS:= \\\n\t\t+libpthread +libstdcpp +libopenssl \\\n\t\t+boost +boost-program_options \\\n\t\t$(if $(filter y,$(NEED_BOOST_SYSTEM)),,+boost-system)\nendef\n\ndefine Package/trojan-plus/install\n\t$(INSTALL_DIR) $(1)/usr/sbin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/trojan $(1)/usr/sbin/trojan-plus\nendef\n\n$(eval $(call BuildPackage,trojan-plus))\n"
  },
  {
    "path": "relevance/passwall-packages/trojan-plus/boost-version.mk",
    "content": "# boost-version.mk\nBOOST_MAKEFILE := $(firstword $(shell find -L $(TOPDIR) -type f -path \"*/boost/Makefile\"))\n\nBOOST_PKG_VERSION := $(shell grep '^PKG_VERSION:=' $(BOOST_MAKEFILE) | head -n1 | cut -d= -f2)\n\nBOOST_VER_MAJOR := $(word 1,$(subst ., ,$(BOOST_PKG_VERSION)))\nBOOST_VER_MINOR := $(word 2,$(subst ., ,$(BOOST_PKG_VERSION)))\nBOOST_VER_PATCH := $(word 3,$(subst ., ,$(BOOST_PKG_VERSION)))\n\nBOOST_VERSION_CODE := $(shell echo $$(($(BOOST_VER_MAJOR)*100000 + $(BOOST_VER_MINOR)*100 + $(BOOST_VER_PATCH))))\n\nNEED_BOOST_SYSTEM := $(if $(shell [ $(BOOST_VERSION_CODE) -ge 108900 ] && echo y),y,n)\n"
  },
  {
    "path": "relevance/passwall-packages/trojan-plus/patches/001-Fix-boost1.87-build.patch",
    "content": "--- a/src/core/service.cpp\n+++ b/src/core/service.cpp\n@@ -546,8 +546,15 @@ void Service::udp_async_read() {\n             int read_length = (int)length;\n             int ttl         = -1;\n \n+#if BOOST_VERSION >= 108700\n+            auto buffer = udp_read_buf.prepare(config.get_udp_recv_buf());\n+            char* data = static_cast<char*>(buffer.data());\n+\n+            targetdst = recv_tproxy_udp_msg((int)udp_socket.native_handle(), udp_recv_endpoint, data, read_length, ttl);\n+#else\n             targetdst = recv_tproxy_udp_msg((int)udp_socket.native_handle(), udp_recv_endpoint,\n               boost::asio::buffer_cast<char*>(udp_read_buf.prepare(config.get_udp_recv_buf())), read_length, ttl);\n+#endif\n \n             length = read_length < 0 ? 0 : read_length;\n             udp_read_buf.commit(length);\n--- a/src/session/session.cpp\n+++ b/src/session/session.cpp\n@@ -68,7 +68,11 @@ void Session::udp_timer_async_wait(int t\n     }\n \n     boost::system::error_code ec;\n+#if BOOST_VERSION >= 108700\n+    udp_gc_timer.cancel();\n+#else\n     udp_gc_timer.cancel(ec);\n+#endif\n     if (ec) {\n         output_debug_info_ec(ec);\n         destroy();\n@@ -104,7 +108,11 @@ void Session::udp_timer_cancel() {\n     }\n \n     boost::system::error_code ec;\n+#if BOOST_VERSION >= 108700\n+    udp_gc_timer.cancel();\n+#else\n     udp_gc_timer.cancel(ec);\n+#endif\n     if (ec) {\n         output_debug_info_ec(ec);\n     }\n--- a/src/core/utils.cpp\n+++ b/src/core/utils.cpp\n@@ -59,8 +59,13 @@ size_t streambuf_append(\n         return 0;\n     }\n \n+#if BOOST_VERSION >= 108700\n+    auto* dest      = static_cast<uint8_t*>(target.prepare(n).data());\n+    const auto* src = static_cast<const uint8_t*>(append_buf.data().data()) + start;\n+#else\n     auto* dest      = boost::asio::buffer_cast<uint8_t*>(target.prepare(n));\n     const auto* src = boost::asio::buffer_cast<const uint8_t*>(append_buf.data()) + start;\n+#endif\n     memcpy(dest, src, n);\n     target.commit(n);\n     return n;\n@@ -102,7 +107,11 @@ size_t streambuf_append(boost::asio::str\n size_t streambuf_append(boost::asio::streambuf& target, char append_char) {\n     _guard;\n     const size_t char_length = sizeof(char);\n+#if BOOST_VERSION >= 108700\n+    auto cp = gsl::span<char>(static_cast<char*>(target.prepare(char_length).data()), char_length);\n+#else\n     auto cp = gsl::span<char>(boost::asio::buffer_cast<char*>(target.prepare(char_length)), char_length);\n+#endif\n     cp[0]   = append_char;\n     target.commit(char_length);\n     return char_length;\n@@ -137,7 +146,11 @@ size_t streambuf_append(boost::asio::str\n \n std::string_view streambuf_to_string_view(const boost::asio::streambuf& target) {\n     _guard;\n+#if BOOST_VERSION >= 108700\n+    return std::string_view(static_cast<const char*>(target.data().data()), target.size());\n+#else\n     return std::string_view(boost::asio::buffer_cast<const char*>(target.data()), target.size());\n+#endif\n     _unguard;\n }\n \n"
  },
  {
    "path": "relevance/passwall-packages/trojan-plus/patches/002-Fix-boost1.89-build.patch",
    "content": "--- a/CMakeLists.txt\n+++ b/CMakeLists.txt\n@@ -184,26 +184,45 @@ endif()\n set(CMAKE_EXPORT_COMPILE_COMMANDS ON)\n \n if (ANDROID)\n-    set(ANDROID_MY_LIBS ${PROJECT_SOURCE_DIR}/trojan-plus-android-libs) \n+    set(ANDROID_MY_LIBS ${PROJECT_SOURCE_DIR}/trojan-plus-android-libs)\n+\n+    find_path(BOOST_INCLUDE_DIR\n+        NAMES boost/version.hpp\n+        HINTS ${ANDROID_MY_LIBS}/include\n+    )\n+\n     set(ANDROID_MY_LIBS_LIBRARIES \n         ${ANDROID_MY_LIBS}/lib/${ANDROID_ABI}/libssl.a \n         ${ANDROID_MY_LIBS}/lib/${ANDROID_ABI}/libcrypto.a\n-        ${ANDROID_MY_LIBS}/lib/${ANDROID_ABI}/libboost_system.a\n         ${ANDROID_MY_LIBS}/lib/${ANDROID_ABI}/libboost_program_options.a)\n \n+    if(BOOST_INCLUDE_DIR)\n+        file(STRINGS \"${BOOST_INCLUDE_DIR}/boost/version.hpp\" BOOST_VERSION_LINE REGEX \"^#define BOOST_VERSION \")\n+        string(REGEX REPLACE \"^#define BOOST_VERSION ([0-9]+)\" \"\\\\1\" BOOST_VERSION ${BOOST_VERSION_LINE})\n+\n+        if(${BOOST_VERSION} VERSION_LESS 108900)\n+            list(APPEND ANDROID_MY_LIBS_LIBRARIES ${ANDROID_MY_LIBS}/lib/${ANDROID_ABI}/libboost_system.a)\n+        endif()\n+    endif()\n+\n     set(OPENSSL_VERSION 1.1.1)\n \n     include_directories(${ANDROID_MY_LIBS}/include)\n     target_link_libraries(trojan ${ANDROID_MY_LIBS_LIBRARIES})\n else()\n-    find_package(Boost 1.66.0 REQUIRED COMPONENTS system program_options)\n+    find_package(Boost 1.66.0 REQUIRED)\n+    if (Boost_MAJOR_VERSION LESS_EQUAL 1 AND Boost_MINOR_VERSION LESS 89)\n+        find_package(Boost 1.66.0 REQUIRED COMPONENTS system program_options)\n+    else()\n+        find_package(Boost 1.66.0 REQUIRED COMPONENTS program_options)\n+    endif()\n     include_directories(${Boost_INCLUDE_DIR})\n     target_link_libraries(trojan ${Boost_LIBRARIES})\n     if(MSVC)\n         add_definitions(-DBOOST_DATE_TIME_NO_LIB)\n     endif()\n \n-    find_package(OpenSSL 1.1.0 REQUIRED)\n+    find_package(OpenSSL 1.1.1 REQUIRED)\n     include_directories(${OPENSSL_INCLUDE_DIR})\n     target_link_libraries(trojan ${OPENSSL_LIBRARIES})\n endif()\n"
  },
  {
    "path": "relevance/passwall-packages/tuic-client/Makefile",
    "content": "# SPDX-License-Identifier: GPL-2.0-or-later\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=tuic-client\nPKG_VERSION:=1.8.1\nPKG_RELEASE:=1\n\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\n\ninclude $(INCLUDE_DIR)/package.mk\n\nifeq ($(ARCH),aarch64)\n\tTUIC_ARCH:=tuic-client-aarch64-linux-musl\n\tPKG_HASH:=68df41cff74df766f313fbef1f624825e5e8f60b9a40bdb1fb017c232db93bf3\nelse ifeq ($(ARCH),arm)\n# Referred to golang/golang-values.mk\n\tARM_CPU_FEATURES:=$(word 2,$(subst +,$(space),$(call qstrip,$(CONFIG_CPU_TYPE))))\n\tifeq ($(ARM_CPU_FEATURES),)\n\t\tTUIC_ARCH:=tuic-client-armv7-linux-musl\n\t\tPKG_HASH:=19c9af5c7115f4526268a9d86446ce0ceef2ee80ad5ad6aed84ed59540c6262c\n\telse\n\t\tTUIC_ARCH:=tuic-client-armv7-linux-muslhf\n\t\tPKG_HASH:=7a1410197ab5804c9f1ddd1a3ff7f4765e51f30d626ae99e04509ebf69b3979c\n\tendif\nelse ifeq ($(ARCH),i386)\n\tTUIC_ARCH:=tuic-client-i686-linux-musl\n\tPKG_HASH:=fd0992d8a799cf897057d2c5fc3354a7f0f366cc35b3f7508736e81758289883\nelse ifeq ($(ARCH),x86_64)\n\tTUIC_ARCH:=tuic-client-x86_64-linux-musl\n\tPKG_HASH:=542d50e33f9b470a564b9a16f4c321c7c955af81703e2e05bee4fc2869cebffe\n# Set the default value to make OpenWrt Package Checker happy\nelse\n  PKG_SOURCE:=dummy\n  PKG_HASH:=dummy\nendif\n\ndefine Download/tuic-client\n\tURL:=https://github.com/Itsusinn/tuic/releases/download/v$(PKG_VERSION)/\n\tURL_FILE:=$(TUIC_ARCH)\n\tFILE:=$(TUIC_ARCH)-$(PKG_VERSION)\n\tHASH:=$(PKG_HASH)\nendef\n\n$(eval $(call Download,tuic-client))\n\ndefine Package/tuic-client\n\tSECTION:=net\n\tCATEGORY:=Network\n\tSUBMENU:=Web Servers/Proxies\n\tTITLE:=Delicately-TUICed 0-RTT proxy protocol\n\tURL:=https://github.com/Itsusinn/tuic\n\tDEPENDS:=@USE_MUSL @(aarch64||arm_v7||i386||x86_64) @!(TARGET_x86_geode||TARGET_x86_legacy)\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/tuic-client/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(DL_DIR)/$(TUIC_ARCH)-$(PKG_VERSION) $(1)/usr/bin/tuic-client\nendef\n\n$(eval $(call BuildPackage,tuic-client))\n"
  },
  {
    "path": "relevance/passwall-packages/v2ray-geodata/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021-2022 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=v2ray-geodata\nPKG_RELEASE:=1\n\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\n\ninclude $(INCLUDE_DIR)/package.mk\n\nGEOIP_VER:=202605070042\nGEOIP_FILE:=geoip.dat.$(GEOIP_VER)\ndefine Download/geoip\n  URL:=https://github.com/Loyalsoldier/geoip/releases/download/$(GEOIP_VER)/\n  URL_FILE:=geoip.dat\n  FILE:=$(GEOIP_FILE)\n  HASH:=8aa9b4838f29eace96ec99ff971bf62cb1ff795d1cda7a210c3d5e3cb84fe2e6\nendef\n\nGEOSITE_VER:=202605082251\nGEOSITE_FILE:=geosite.dat.$(GEOSITE_VER)\ndefine Download/geosite\n  URL:=https://github.com/Loyalsoldier/v2ray-rules-dat/releases/download/$(GEOSITE_VER)/\n  URL_FILE:=geosite.dat\n  FILE:=$(GEOSITE_FILE)\n  HASH:=bcd052d2f3fb736d60e25f5eb280d9f85837a98ad97e3eb2ce1f694cc5c31dce\nendef\n\ndefine Package/v2ray-geodata/template\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=IP Addresses and Names\n  URL:=https://www.v2fly.org\n  PKGARCH:=all\nendef\n\ndefine Package/v2ray-geoip\n  $(call Package/v2ray-geodata/template)\n  TITLE:=GeoIP List for V2Ray\n  VERSION:=$(GEOIP_VER).$(PKG_RELEASE)\n  LICENSE:=CC-BY-SA-4.0\nendef\n\ndefine Package/v2ray-geosite\n  $(call Package/v2ray-geodata/template)\n  TITLE:=Geosite List for V2Ray\n  VERSION:=$(GEOSITE_VER).$(PKG_RELEASE)\n  LICENSE:=MIT\nendef\n\ndefine Build/Prepare\n\t$(call Build/Prepare/Default)\nifneq ($(CONFIG_PACKAGE_v2ray-geoip),)\n\t$(call Download,geoip)\nendif\nifneq ($(CONFIG_PACKAGE_v2ray-geosite),)\n\t$(call Download,geosite)\nendif\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/v2ray-geoip/install\n\t$(INSTALL_DIR) $(1)/usr/share/v2ray\n\t$(INSTALL_DATA) $(DL_DIR)/$(GEOIP_FILE) $(1)/usr/share/v2ray/geoip.dat\nendef\n\ndefine Package/v2ray-geosite/install\n\t$(INSTALL_DIR) $(1)/usr/share/v2ray\n\t$(INSTALL_DATA) $(DL_DIR)/$(GEOSITE_FILE) $(1)/usr/share/v2ray/geosite.dat\nendef\n\n$(eval $(call BuildPackage,v2ray-geoip))\n$(eval $(call BuildPackage,v2ray-geosite))\n"
  },
  {
    "path": "relevance/passwall-packages/v2ray-plugin/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2020 SharerMax\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=v2ray-plugin\nPKG_VERSION:=5.49.0\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/teddysun/v2ray-plugin/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=7a634a79d9715a899d52366949e09443376715ec86f76cbcfc8b6fb3af0cef53\n\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=madeye <max.c.lv@gmail.com>\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/teddysun/v2ray-plugin\nGO_PKG_LDFLAGS_X:=main.VERSION=v$(PKG_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/v2ray-plugin\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=Web Servers/Proxies\n  TITLE:=SIP003 plugin for shadowsocks, based on v2ray\n  URL:=https://github.com/teddysun/v2ray-plugin\n  DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle\nendef\n\n$(eval $(call GoBinPackage,v2ray-plugin))\n$(eval $(call BuildPackage,v2ray-plugin))\n"
  },
  {
    "path": "relevance/passwall-packages/xray-core/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=Xray-core\nPKG_VERSION:=26.5.9\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/XTLS/Xray-core/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=2cbd37f70b246d93aa4f1f5d4261cf2e622ff78ca71a7f7a4271aa517e749025\n\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\nPKG_LICENSE:=MPL-2.0\nPKG_LICENSE_FILES:=LICENSE\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/xtls/xray-core\nGO_PKG_BUILD_PKG:=$(GO_PKG)/main\nGO_PKG_LDFLAGS_X:= \\\n\t$(GO_PKG)/core.build=OpenWrt \\\n\t$(GO_PKG)/core.version=$(PKG_VERSION)\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/xray/template\n  TITLE:=A platform for building proxies to bypass network restrictions\n  SECTION:=net\n  CATEGORY:=Network\n  URL:=https://xtls.github.io\nendef\n\ndefine Package/xray-core\n  $(call Package/xray/template)\n  DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle\nendef\n\ndefine Package/xray/description\n  Xray, Penetrates Everything. It helps you to build your own computer network.\n  It secures your network connections and thus protects your privacy.\nendef\n\ndefine Package/xray-core/description\n  $(call Package/xray/description)\nendef\n\ndefine Package/xray-core/conffiles\n/etc/xray/\n/etc/config/xray\nendef\n\ndefine Package/xray-core/install\n\t$(call GoPackage/Package/Install/Bin,$(PKG_INSTALL_DIR))\n\t$(INSTALL_DIR) $(1)/usr/bin/\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/main $(1)/usr/bin/xray\nendef\n\n$(eval $(call BuildPackage,xray-core))\n"
  },
  {
    "path": "relevance/passwall-packages/xray-plugin/Makefile",
    "content": "# SPDX-License-Identifier: GPL-3.0-only\n#\n# Copyright (C) 2021 ImmortalWrt.org\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=xray-plugin\nPKG_VERSION:=1.8.24\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/teddysun/xray-plugin/tar.gz/v$(PKG_VERSION)?\nPKG_HASH:=1150968f8791df884ce0ab5b2dbc870496088c90b5ffcc7f21497075aab7b1b5\n\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=Tianling Shen <cnsztl@immortalwrt.org>\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_USE_MIPS16:=0\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/teddysun/xray-plugin\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/xray-plugin\n  SECTION:=net\n  CATEGORY:=Network\n  SUBMENU:=Web Servers/Proxies\n  TITLE:=SIP003 plugin for Shadowsocks, based on Xray\n  URL:=https://github.com/teddysun/xray-plugin\n  DEPENDS:=$(GO_ARCH_DEPENDS) +ca-bundle\nendef\n\ndefine Package/xray-plugin/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(GO_PKG_BUILD_BIN_DIR)/xray-plugin $(1)/usr/bin/xray-plugin\nendef\n\n$(eval $(call GoBinPackage,xray-plugin))\n$(eval $(call BuildPackage,xray-plugin))\n"
  },
  {
    "path": "relevance/quectel_cm-5G/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:= quectel-CM-5G\nPKG_VERSION:=1.6.5\nPKG_RELEASE:=1\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/quectel-CM-5G\n  SECTION:=utils\n  CATEGORY:=Utilities\n  TITLE:=quectel-CM-5G app\nendef\n\ndefine Build/Prepare\n\tmkdir -p $(PKG_BUILD_DIR)\n\t$(CP) ./src/* $(PKG_BUILD_DIR)/\nendef\n\ndefine Build/Compile\n\t$(MAKE) -C \"$(PKG_BUILD_DIR)\" \\\n\t\tEXTRA_CFLAGS=\"$(EXTRA_CFLAGS)\" \\\n\t\tCROSS_COMPILE=\"$(TARGET_CROSS)\" \\\n\t\tARCH=\"$(LINUX_KARCH)\" \\\n\t\tM=\"$(PKG_BUILD_DIR)\" \\\n\t\tCC=\"$(TARGET_CC)\"\nendef\n\ndefine Package/quectel-CM-5G/install\n\t$(INSTALL_DIR) $(1)/usr/bin $(1)/lib/netifd/proto\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/quectel-CM $(1)/usr/bin\n\t$(INSTALL_BIN) ./files/rmnet_init.sh $(1)/lib/netifd\n\t$(INSTALL_BIN) ./files/rmnet.script $(1)/lib/netifd\n\t$(INSTALL_BIN) ./files/rmnet.sh $(1)/lib/netifd/proto\n\t$(INSTALL_BIN) ./files/rmnet6.sh $(1)/lib/netifd/proto\n\t$(INSTALL_BIN) ./files/rmnet6.script $(1)/lib/netifd\nendef\n\n$(eval $(call BuildPackage,quectel-CM-5G))\n"
  },
  {
    "path": "relevance/quectel_cm-5G/files/dhcp",
    "content": "\nconfig dnsmasq\n\toption domainneeded '1'\n\toption boguspriv '1'\n\toption filterwin2k '0'\n\toption localise_queries '1'\n\toption rebind_protection '1'\n\toption rebind_localhost '1'\n\toption local '/lan/'\n\toption domain 'lan'\n\toption expandhosts '1'\n\toption nonegcache '0'\n\toption authoritative '1'\n\toption readethers '1'\n\toption leasefile '/tmp/dhcp.leases'\n\toption resolvfile '/tmp/resolv.conf.auto'\n\toption nonwildcard '1'\n\toption localservice '1'\n\nconfig dhcp 'lan'\n\toption interface 'lan'\n\toption start '100'\n\toption limit '150'\n\toption leasetime '12h'\n\toption ra 'relay'\n\toption dhcpv6 'disabled'\n\toption ndp 'relay'\n\nconfig dhcp 'wan'\n\toption interface 'wan'\n\toption ignore '1'\n\toption ra 'relay'\n\toption dhcpv6 'disabled'\n\toption ndp 'relay'\n\toption ndproxy_routing '0'\n\toption master '1'\n\nconfig dhcp 'wan6'\n\toption ra 'relay'\n\toption dhcpv6 'disabled'\n\toption ndp 'relay'\n\toption ndproxy_routing '0'\n\toption master '1'\n\toption interface 'wan6'\n\nconfig odhcpd 'odhcpd'\n\toption loglevel '7'\n\n"
  },
  {
    "path": "relevance/quectel_cm-5G/files/rmnet.script",
    "content": "#!/bin/sh\n#  Copyright (c) 2019 Qualcomm Technologies, Inc.\n#  All Rights Reserved.\n#  Confidential and Proprietary - Qualcomm Technologies, Inc.\n\n\n[ -z \"$1\" ] && echo \"Error: should be run by rmnet\" && exit 1\n[ -z \"$2\" ] && echo \"Error: should be run by rmnet\" && exit 1\n\n. /lib/functions.sh\n. /lib/functions/network.sh\n. /lib/netifd/netifd-proto.sh\n\nsetup_interface() {\n\tINTERFACE=$1\n\tCONFIG=/tmp/rmnet_$2_ipv4config\n\tlogger \"rmnet setup_interface $1 $2 here\"\n\t#Fetch information from lower.\n\t[ -f ${CONFIG} ] || {\n\t\tproto_notify_error \"$INTERFACE\" \"RMNET data call Not ready\"\n\t\tproto_block_restart \"$INTERFACE\"\n\t\treturn\n\t}\n\t. ${CONFIG} \n\tip=$PUBLIC_IP\n\tDNS=$DNSSERVERS\n\trouter=$GATEWAY\n\tsubnet=$NETMASK\n\tinterface=$IFNAME\n\t#Send the information to the netifd\n\tproto_init_update \"$interface\" 1 1\n\t#ip and subnet\n\tproto_add_ipv4_address \"$ip\" \"${subnet:-255.255.255.0}\"\n\n\t#Any router? if not, remove below scripts\n\t#router format should be separated by space\n\tfor i in $router; do\n\t\tproto_add_ipv4_route \"$i\" 32 \"\" \"$ip\"\n\t\tproto_add_ipv4_route 0.0.0.0 0 \"$i\" \"$ip\"\n\tdone\n\n\t#dns information tell the netifd.\n\tfor dns in $DNS; do\n\t\tproto_add_dns_server \"$dns\"\n\tdone\n\n\t#Domain information tell the netifd\n\tfor domain in $domain; do\n\t\tproto_add_dns_search \"$domain\"\n\tdone\n\n\t#proto_add_data\n\t[ -n \"$ZONE\" ] && json_add_string zone \"$ZONE\"\n\tproto_close_data\n\n\tproto_send_update \"$INTERFACE\"\n\n}\n\ncase \"$1\" in\n\trenew)\n\t\tsetup_interface $2 $3\n\t;;\nesac\n\nexit 0\n"
  },
  {
    "path": "relevance/quectel_cm-5G/files/rmnet.sh",
    "content": "#!/bin/sh\n#  Copyright (c) 2019 Qualcomm Technologies, Inc.\n#  All Rights Reserved.\n#  Confidential and Proprietary - Qualcomm Technologies, Inc.\n\n. /lib/functions.sh\n. /lib/functions/network.sh\n. ../netifd-proto.sh\n\ninit_proto \"$@\"\n\nproto_rmnet_setup() {\n\tlocal cfg=\"$1\"\n\tlocal iface=\"$2\"\n\n\tlogger \"rmnet started\"\n\t#Call rmnet management script below!!\n\tlogger \"rmnet updated ${cfg} ${iface}\"\n\t/lib/netifd/rmnet.script renew $cfg $iface\n}\n\nproto_rmnet_teardown() {\n\tlocal cfg=\"$1\"\n\t#Tear down rmnet manager script here.*/\n}\n\nproto_rmnet_init_config() {\n\t#ddno_device=1\n\tavailable=1\n}\n\nadd_protocol rmnet\n"
  },
  {
    "path": "relevance/quectel_cm-5G/files/rmnet6.script",
    "content": "#!/bin/sh\n#  Copyright (c) 2019 Qualcomm Technologies, Inc.\n#  All Rights Reserved.\n#  Confidential and Proprietary - Qualcomm Technologies, Inc.\n\n\n[ -z \"$1\" ] && echo \"Error: should be run by rmnet\" && exit 1\n[ -z \"$2\" ] && echo \"Error: should be run by rmnet\" && exit 1\n\n. /lib/functions.sh\n. /lib/functions/network.sh\n. /lib/netifd/netifd-proto.sh\n\nsetup_interface() {\n\tINTERFACE=$1\n\tCONFIG=/tmp/rmnet_$2_ipv6config\n\tlogger \"rmnet setup_interface $1 $2 here\"\n\t#Fetch information from lower.\n\t[ -f ${CONFIG} ] || {\n\t\tproto_notify_error \"$INTERFACE\" \"RMNET data call NOT ready\"\n\t\tproto_block_restart \"$INTERFACE\"\n\t\treturn\n\t}\n\t. ${CONFIG} \n\tADDRESSES=$PUBLIC_IP\n\tinterface=$IFNAME\n\t#Send the information to the netifd\n\tproto_init_update \"$interface\" 1 1\n\n\t#ip and subnet\n\tproto_add_ipv6_address \"${PUBLIC_IP}\" \"128\"\n\tproto_add_ipv6_prefix \"${PUBLIC_IP}/${PrefixLength}\"\n\n\t#router format should be separated by space\n\tproto_add_ipv6_route \"$GATEWAY\" 128\n\tproto_add_ipv6_route \"::0\" 0 \"$GATEWAY\" \"\" \"\" \"${PUBLIC_IP}/${PrefixLength}\"\n\n\t#dns information tell the netifd.\n\tfor dns in $DNSSERVERS; do\n\t\tproto_add_dns_server \"$dns\"\n\tdone\n\n\t#Domain information tell the netifd\n\tfor domain in $domain; do\n\t\tproto_add_dns_search \"$domain\"\n\tdone\n\n\t#proto_add_data\n\t[ -n \"$ZONE\" ] && json_add_string zone \"$ZONE\"\n\tproto_close_data\n\n\tproto_send_update \"$INTERFACE\"\n}\n\ncase \"$1\" in\n\trenew|bound)\n\t\tsetup_interface $2 $3\n\t;;\nesac\n\nexit 0\n"
  },
  {
    "path": "relevance/quectel_cm-5G/files/rmnet6.sh",
    "content": "#!/bin/sh\n#  Copyright (c) 2019 Qualcomm Technologies, Inc.\n#  All Rights Reserved.\n#  Confidential and Proprietary - Qualcomm Technologies, Inc.\n\n. /lib/functions.sh\n. /lib/functions/network.sh\n. ../netifd-proto.sh\n\ninit_proto \"$@\"\n\nproto_rmnet6_setup() {\n\tlocal cfg=\"$1\"\n\tlocal iface=\"$2\"\n\n\tlogger \"rmnet6 started\"\n\t#Call rmnet management script below!!\n\t/lib/netifd/rmnet6.script renew $cfg $iface\n\tlogger \"rmnet6 updated\"\n}\n\nproto_rmnet6_teardown() {\n\tlocal cfg=\"$1\"\n\t#Tear down rmnet manager script here.*/\n}\n\nproto_rmnet6_init_config() {\n\t#ddno_device=1\n\tavailable=1\n}\n\nadd_protocol rmnet6\n"
  },
  {
    "path": "relevance/quectel_cm-5G/files/rmnet_init.sh",
    "content": "#!/bin/sh\n\nuci set network.wan='interface'\nuci set network.wan.ifname='wwan0'\nuci set network.wan.proto='rmnet'\n\nuci set network.wan6='interface'\nuci set network.wan6.ifname='wwan0'\nuci set network.wan6.proto='rmnet6'\n\nuci set dhcp.lan.ra='relay'\nuci set dhcp.lan.dhcpv6='disabled'\nuci set dhcp.lan.ndp='relay'\n\nuci set dhcp.wan.ra='relay'\nuci set dhcp.wan.dhcpv6='disabled'\nuci set dhcp.wan.ndp='relay'\nuci set dhcp.wan.ndproxy_routing='0'\n\nuci set dhcp.wan6=dhcp\nuci set dhcp.wan6.interface='wan6'\nuci set dhcp.wan6.ra='relay'\nuci set dhcp.wan6.dhcpv6='disabled'\nuci set dhcp.wan6.ndp='relay'\nuci set dhcp.wan6.ndproxy_routing='0'\nuci set dhcp.wan6.master='1'\n\nuci set dhcp.odhcpd=odhcpd\nuci set dhcp.odhcpd.loglevel='7'\n\nuci commit\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/CMakeLists.txt",
    "content": "cmake_minimum_required(VERSION 2.4) \n\nproject(quectel-CM) \nadd_definitions(-Wall -Wextra -Werror -O1)\noption(USE_QRTR \"Enable QRTR\" OFF) \n\nset( QL_CM_SRC\n     QmiWwanCM.c GobiNetCM.c main.c QCQMUX.c QMIThread.c util.c qmap_bridge_mode.c mbim-cm.c device.c\n     atc.c atchannel.c at_tok.c\n     udhcpc.c\n     )\n\nif(USE_QRTR) \nadd_definitions(-DCONFIG_QRTR)\nset( QRTR_SRC qrtr.c rmnetctl.c)\nendif() \n\nadd_executable(quectel-CM ${QL_CM_SRC} ${QRTR_SRC})\ntarget_link_libraries(quectel-CM PUBLIC pthread) \ninstall (TARGETS quectel-CM DESTINATION bin)\n\nadd_executable(quectel-qmi-proxy quectel-qmi-proxy.c)\ntarget_link_libraries(quectel-qmi-proxy PUBLIC pthread) \ninstall (TARGETS quectel-qmi-proxy DESTINATION bin)\n\nadd_executable(quectel-mbim-proxy quectel-mbim-proxy.c)\ntarget_link_libraries(quectel-mbim-proxy PUBLIC pthread) \ninstall (TARGETS quectel-mbim-proxy DESTINATION bin)\n\nadd_executable(quectel-atc-proxy quectel-atc-proxy.c atchannel.c at_tok.c util.c)\ntarget_link_libraries(quectel-atc-proxy PUBLIC pthread) \ninstall (TARGETS quectel-atc-proxy DESTINATION bin)\n\n#add_executable(quectel-qrtr-proxy quectel-qrtr-proxy.c)\n#target_link_libraries(quectel-qrtr-proxy PUBLIC pthread) \n#install (TARGETS quectel-qrtr-proxy DESTINATION bin)\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/GobiNetCM.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software. \r\n    Under no circumstances may customers modify, demonstrate, use, deliver \r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include <stdio.h>\r\n#include <string.h>\r\n#include <termios.h>\r\n#include <stdio.h>\r\n#include <ctype.h>\r\n#include \"QMIThread.h\"\r\n\r\n#ifdef CONFIG_GOBINET\r\nstatic int qmiclientId[QMUX_TYPE_ALL];\r\n\r\n// IOCTL to generate a client ID for this service type\r\n#define IOCTL_QMI_GET_SERVICE_FILE 0x8BE0 + 1\r\n\r\n// IOCTL to get the VIDPID of the device\r\n#define IOCTL_QMI_GET_DEVICE_VIDPID 0x8BE0 + 2\r\n\r\n// IOCTL to get the MEID of the device\r\n#define IOCTL_QMI_GET_DEVICE_MEID 0x8BE0 + 3\r\n\r\nstatic int GobiNetSendQMI(PQCQMIMSG pRequest) {\r\n    int ret, fd;\r\n\r\n    fd = qmiclientId[pRequest->QMIHdr.QMIType];\r\n    pRequest->QMIHdr.ClientId = (fd&0xFF) ? fd&0xFF : pRequest->QMIHdr.QMIType;\r\n\r\n    if (fd <= 0) {\r\n        dbg_time(\"%s QMIType: %d has no clientID\", __func__, pRequest->QMIHdr.QMIType);\r\n        return -ENODEV;\r\n    }\r\n\r\n    // Always ready to write\r\n    if (1 == 1) {\r\n        ssize_t nwrites = le16_to_cpu(pRequest->QMIHdr.Length) + 1 - sizeof(QCQMI_HDR);\r\n        ret = write(fd, &pRequest->MUXMsg, nwrites);\r\n        if (ret == nwrites) {\r\n            ret = 0;\r\n        } else {\r\n            dbg_time(\"%s write=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\r\n        }\r\n    } else {\r\n        dbg_time(\"%s poll=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\r\n    }\r\n\r\n    return ret;\r\n}\r\n\r\nstatic int GobiNetGetClientID(const char *qcqmi, UCHAR QMIType) {\r\n    int ClientId;\r\n    ClientId = cm_open_dev(qcqmi);\r\n    if (ClientId == -1) {\r\n        dbg_time(\"failed to open %s, errno: %d (%s)\", qcqmi, errno, strerror(errno));\r\n        return 0;\r\n    }\r\n\r\n    if (ioctl(ClientId, IOCTL_QMI_GET_SERVICE_FILE, QMIType) != 0) {\r\n        dbg_time(\"failed to get ClientID for 0x%02x errno: %d (%s)\", QMIType, errno, strerror(errno));\r\n        close(ClientId);\r\n        ClientId = 0;\r\n    }\r\n\r\n    switch (QMIType) {\r\n        case QMUX_TYPE_WDS: dbg_time(\"Get clientWDS = %d\", ClientId); break;\r\n        case QMUX_TYPE_DMS: dbg_time(\"Get clientDMS = %d\", ClientId); break;\r\n        case QMUX_TYPE_NAS: dbg_time(\"Get clientNAS = %d\", ClientId); break;\r\n        case QMUX_TYPE_QOS: dbg_time(\"Get clientQOS = %d\", ClientId); break;\r\n        case QMUX_TYPE_WMS: dbg_time(\"Get clientWMS = %d\", ClientId); break;\r\n        case QMUX_TYPE_PDS: dbg_time(\"Get clientPDS = %d\", ClientId); break;\r\n        case QMUX_TYPE_UIM: dbg_time(\"Get clientUIM = %d\", ClientId); break;\r\n        case QMUX_TYPE_COEX: dbg_time(\"Get clientCOEX = %d\", ClientId); break;\r\n        case QMUX_TYPE_WDS_ADMIN: dbg_time(\"Get clientWDA = %d\", ClientId);\r\n        break;\r\n        default: break;\r\n    }\r\n\r\n    return ClientId;\r\n}\r\n\r\nstatic int GobiNetDeInit(void) {\r\n    unsigned int i;\r\n    for (i = 0; i < sizeof(qmiclientId)/sizeof(qmiclientId[0]); i++)\r\n    {\r\n        if (qmiclientId[i] != 0)\r\n        {\r\n            close(qmiclientId[i]);\r\n            qmiclientId[i] = 0;\r\n        }\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nstatic void * GobiNetThread(void *pData) {\r\n    PROFILE_T *profile = (PROFILE_T *)pData;\r\n    const char *qcqmi = (const char *)profile->qmichannel;\r\n    int wait_for_request_quit = 0;   \r\n    \r\n    qmiclientId[QMUX_TYPE_WDS] = GobiNetGetClientID(qcqmi, QMUX_TYPE_WDS);\r\n    if (profile->enable_ipv6)\r\n        qmiclientId[QMUX_TYPE_WDS_IPV6] = GobiNetGetClientID(qcqmi, QMUX_TYPE_WDS);\r\n    qmiclientId[QMUX_TYPE_DMS] = GobiNetGetClientID(qcqmi, QMUX_TYPE_DMS);\r\n    qmiclientId[QMUX_TYPE_NAS] = GobiNetGetClientID(qcqmi, QMUX_TYPE_NAS);\r\n    qmiclientId[QMUX_TYPE_UIM] = GobiNetGetClientID(qcqmi, QMUX_TYPE_UIM);\r\n#ifdef CONFIG_COEX_WWAN_STATE\r\n    qmiclientId[QMUX_TYPE_COEX] = GobiNetGetClientID(qcqmi, QMUX_TYPE_COEX);\r\n#endif\r\n    if (profile->qmap_mode == 0 || profile->loopback_state) {//when QMAP enabled, set data format in GobiNet Driver\r\n        qmiclientId[QMUX_TYPE_WDS_ADMIN] = GobiNetGetClientID(qcqmi, QMUX_TYPE_WDS_ADMIN);\r\n        profile->wda_client = qmiclientId[QMUX_TYPE_WDS_ADMIN];\r\n    }\r\n\r\n    //donot check clientWDA, there is only one client for WDA, if quectel-CM is killed by SIGKILL, i cannot get client ID for WDA again!\r\n    if (qmiclientId[QMUX_TYPE_WDS] == 0)  /*|| (clientWDA == -1)*/ {\r\n        GobiNetDeInit();\r\n        dbg_time(\"%s Failed to open %s, errno: %d (%s)\", __func__, qcqmi, errno, strerror(errno));\r\n        qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_DISCONNECTED);\r\n        pthread_exit(NULL);\r\n        return NULL;\r\n    }\r\n\r\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_CONNECTED);\r\n\r\n    while (1) {\r\n        struct pollfd pollfds[16] = {{qmidevice_control_fd[1], POLLIN, 0}};\r\n        int ne, ret, nevents = 1;\r\n        unsigned int i;\r\n\r\n        for (i = 0; i < sizeof(qmiclientId)/sizeof(qmiclientId[0]); i++)\r\n        {\r\n            if (qmiclientId[i] != 0)\r\n            {\r\n                pollfds[nevents].fd = qmiclientId[i];\r\n                pollfds[nevents].events = POLLIN;\r\n                pollfds[nevents].revents = 0;\r\n                nevents++;\r\n            }\r\n        }\r\n\r\n        do {\r\n            ret = poll(pollfds, nevents, wait_for_request_quit ? 1000: -1);\r\n         } while ((ret < 0) && (errno == EINTR));\r\n\r\n\tif (ret == 0 && wait_for_request_quit) {\r\n    \t\tQmiThreadRecvQMI(NULL); //main thread may pending on QmiThreadSendQMI()\r\n\t\tcontinue;\r\n\t}\r\n\r\n        if (ret <= 0) {\r\n            dbg_time(\"%s poll=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\r\n            break;\r\n        }\r\n\r\n        for (ne = 0; ne < nevents; ne++) {\r\n            int fd = pollfds[ne].fd;\r\n            short revents = pollfds[ne].revents;\r\n\r\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\r\n                dbg_time(\"%s poll err/hup/inval\", __func__);\r\n                dbg_time(\"epoll fd = %d, events = 0x%04x\", fd, revents);\r\n                if (fd == qmidevice_control_fd[1]) {\r\n                } else {\r\n                }\r\n                if (revents & (POLLERR | POLLHUP | POLLNVAL))\r\n                    goto __GobiNetThread_quit;\r\n            }\r\n\r\n            if ((revents & POLLIN) == 0)\r\n                continue;\r\n\r\n            if (fd == qmidevice_control_fd[1]) {\r\n                int triger_event;\r\n                if (read(fd, &triger_event, sizeof(triger_event)) == sizeof(triger_event)) {\r\n                    //DBG(\"triger_event = 0x%x\", triger_event);\r\n                    switch (triger_event) {\r\n                        case RIL_REQUEST_QUIT:\r\n                            goto __GobiNetThread_quit;\r\n                        break;\r\n                        case SIG_EVENT_STOP:\r\n                            wait_for_request_quit = 1;   \r\n                        break;\r\n                        default:\r\n                        break;\r\n                    }\r\n                }\r\n                continue;\r\n            }\r\n\r\n            {\r\n                ssize_t nreads;\r\n                PQCQMIMSG pResponse = (PQCQMIMSG)cm_recv_buf;\r\n\r\n                nreads = read(fd, &pResponse->MUXMsg, sizeof(cm_recv_buf) - sizeof(QCQMI_HDR));\r\n                if (nreads <= 0)\r\n                {\r\n                    dbg_time(\"%s read=%d errno: %d (%s)\",  __func__, (int)nreads, errno, strerror(errno));\r\n                    break;\r\n                }\r\n\r\n                for (i = 0; i < sizeof(qmiclientId)/sizeof(qmiclientId[0]); i++)\r\n                {\r\n                    if (qmiclientId[i] == fd)\r\n                    {\r\n                        pResponse->QMIHdr.QMIType = i;\r\n                    }\r\n                }\r\n\r\n                pResponse->QMIHdr.IFType = USB_CTL_MSG_TYPE_QMI;\r\n                pResponse->QMIHdr.Length = cpu_to_le16(nreads + sizeof(QCQMI_HDR)  - 1);\r\n                pResponse->QMIHdr.CtlFlags = 0x00;\r\n                pResponse->QMIHdr.ClientId = (fd&0xFF) ? fd&0xFF : pResponse->QMIHdr.QMIType;;\r\n\r\n                QmiThreadRecvQMI(pResponse);\r\n            }\r\n        }\r\n    }\r\n\r\n__GobiNetThread_quit:\r\n    GobiNetDeInit();\r\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_DISCONNECTED);\r\n    QmiThreadRecvQMI(NULL); //main thread may pending on QmiThreadSendQMI()\r\n    dbg_time(\"%s exit\", __func__);\r\n    pthread_exit(NULL);\r\n    return NULL;\r\n}\r\n\r\nconst struct qmi_device_ops gobi_qmidev_ops = {\r\n\t.deinit = GobiNetDeInit,\r\n\t.send = GobiNetSendQMI,\r\n\t.read = GobiNetThread,\r\n};\r\n#endif\r\n\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/Makefile",
    "content": "ifneq ($(CROSS_COMPILE),)\r\nCROSS-COMPILE:=$(CROSS_COMPILE)\r\nendif\r\n#CROSS-COMPILE:=/workspace/buildroot/buildroot-qemu_mips_malta_defconfig/output/host/usr/bin/mips-buildroot-linux-uclibc-\r\n#CROSS-COMPILE:=/workspace/buildroot/buildroot-qemu_arm_vexpress_defconfig/output/host/usr/bin/arm-buildroot-linux-uclibcgnueabi-\r\n#CROSS-COMPILE:=/workspace/buildroot-git/qemu_mips64_malta/output/host/usr/bin/mips-gnu-linux-\r\nifeq ($(CC),cc)\r\nCC:=$(CROSS-COMPILE)gcc\r\nendif\r\nLD:=$(CROSS-COMPILE)ld\r\n\r\nQL_CM_SRC=QmiWwanCM.c GobiNetCM.c main.c QCQMUX.c QMIThread.c util.c qmap_bridge_mode.c mbim-cm.c device.c\r\nQL_CM_SRC+=atc.c atchannel.c at_tok.c\r\n#QL_CM_SRC+=qrtr.c rmnetctl.c\r\nifeq (1,1)\r\nQL_CM_DHCP=udhcpc.c\r\nelse\r\nLIBMNL=libmnl/ifutils.c libmnl/attr.c libmnl/callback.c libmnl/nlmsg.c libmnl/socket.c\r\nDHCP=libmnl/dhcp/dhcpclient.c libmnl/dhcp/dhcpmsg.c libmnl/dhcp/packet.c\r\nQL_CM_DHCP=udhcpc_netlink.c\r\nQL_CM_DHCP+=${LIBMNL}\r\nendif\r\n\r\nCFLAGS += -Wall -Wextra -Werror -O1 #-s\r\nLDFLAGS += -lpthread -ldl -lrt\r\n\r\nrelease: clean qmi-proxy mbim-proxy atc-proxy #qrtr-proxy\r\n\t$(CC) ${CFLAGS} ${QL_CM_SRC} ${QL_CM_DHCP} -o quectel-CM ${LDFLAGS}\r\n\r\ndebug: clean\r\n\t$(CC) ${CFLAGS} -g -DCM_DEBUG ${QL_CM_SRC} ${QL_CM_DHCP} -o quectel-CM -lpthread -ldl -lrt\r\n\r\nqmi-proxy:\r\n\t$(CC) ${CFLAGS} quectel-qmi-proxy.c -o quectel-qmi-proxy ${LDFLAGS} \r\n\r\nmbim-proxy:\r\n\t$(CC) ${CFLAGS} quectel-mbim-proxy.c -o quectel-mbim-proxy ${LDFLAGS} \r\n\r\nqrtr-proxy:\r\n\t$(CC) ${CFLAGS} quectel-qrtr-proxy.c -o quectel-qrtr-proxy ${LDFLAGS} \r\n\r\natc-proxy:\r\n\t$(CC) ${CFLAGS} quectel-atc-proxy.c atchannel.c at_tok.c util.c -o quectel-atc-proxy ${LDFLAGS} \r\n\r\nclean:\r\n\trm -rf *.o libmnl/*.o quectel-CM quectel-qmi-proxy quectel-mbim-proxy quectel-atc-proxy\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/Makefile.am",
    "content": "bin_PROGRAMS = quectel-CM\nQL_CM_SRC=QmiWwanCM.c GobiNetCM.c main.c MPQMUX.c QMIThread.c util.c qmap_bridge_mode.c mbim-cm.c device.c\nQL_CM_SRC+=atc.c atchannel.c at_tok.c\n#QL_CM_SRC+=qrtr.c rmnetctl.c\nQL_CM_DHCP=udhcpc.c\nif USE_QRTR\nquectel_CM_CFLAGS = -DCONFIG_QRTR \nQL_CM_SRC += qrtr.c rmnetctl.c\nif USE_MSM_IPC\nquectel_CM_CFLAGS += -DUSE_LINUX_MSM_IPC\nendif\nendif\n\nquectel_CM_SOURCES = ${QL_CM_SRC} ${QL_CM_DHCP} \n\nbin_PROGRAMS += quectel-qmi-proxy\nquectel_qmi_proxy_SOURCES = quectel-qmi-proxy.c\n\nbin_PROGRAMS += quectel-mbim-proxy\nquectel_mbim_proxy_SOURCES = quectel-mbim-proxy.c\nLIBS = -l pthread\nCFLAGS = -Wall -Wextra -Werror -O1\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/NOTICE",
    "content": "This program is totally open souce code, and public domain software for customers of Quectel company.\r\n\r\nThe APIs of QMI WWAMN interfaces are defined by Qualcomm. And this program complies with Qualcomm QMI WWAN interfaces specification.\r\n\r\nCustomers are free to modify the source codes and redistribute them.\r\n\r\nFor those who is not Quectel's customer, all rights are closed, and any copying and commercial development over this progrma is not allowed. \r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/QCQCTL.h",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software. \r\n    Under no circumstances may customers modify, demonstrate, use, deliver \r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#ifndef QCQCTL_H\r\n#define QCQCTL_H\r\n\r\n#include \"QCQMI.h\"\r\n\r\n#pragma pack(push, 1)\r\n\r\n// ================= QMICTL ==================\r\n\r\n// QMICTL Control Flags\r\n#define QMICTL_CTL_FLAG_CMD     0x00\r\n#define QMICTL_CTL_FLAG_RSP     0x01\r\n#define QMICTL_CTL_FLAG_IND     0x02\r\n\r\n#if 0\r\ntypedef struct _QMICTL_TRANSACTION_ITEM\r\n{\r\n   LIST_ENTRY  List;\r\n   UCHAR       TransactionId;  // QMICTL transaction id\r\n   PVOID       Context;        // Adapter or IocDev\r\n   PIRP        Irp;\r\n} QMICTL_TRANSACTION_ITEM, *PQMICTL_TRANSACTION_ITEM;\r\n#endif\r\n\r\ntypedef struct _QCQMICTL_MSG_HDR\r\n{\r\n   UCHAR  CtlFlags;  // 00-cmd, 01-rsp, 10-ind\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;\r\n   USHORT Length;\r\n} __attribute__ ((packed)) QCQMICTL_MSG_HDR, *PQCQMICTL_MSG_HDR;\r\n\r\n#define QCQMICTL_MSG_HDR_SIZE sizeof(QCQMICTL_MSG_HDR)\r\n\r\ntypedef struct _QCQMICTL_MSG_HDR_RESP\r\n{\r\n   UCHAR  CtlFlags;  // 00-cmd, 01-rsp, 10-ind\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n} __attribute__ ((packed)) QCQMICTL_MSG_HDR_RESP, *PQCQMICTL_MSG_HDR_RESP;\r\n\r\ntypedef struct _QCQMICTL_MSG\r\n{\r\n   UCHAR  CtlFlags;  // 00-cmd, 01-rsp, 10-ind\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;\r\n   USHORT Length;\r\n   UCHAR  Payload;\r\n} __attribute__ ((packed)) QCQMICTL_MSG, *PQCQMICTL_MSG;\r\n\r\n// TLV Header\r\ntypedef struct _QCQMICTL_TLV_HDR\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n} __attribute__ ((packed)) QCQMICTL_TLV_HDR, *PQCQMICTL_TLV_HDR;\r\n\r\n#define QCQMICTL_TLV_HDR_SIZE sizeof(QCQMICTL_TLV_HDR)\r\n\r\n// QMICTL Type\r\n#define QMICTL_SET_INSTANCE_ID_REQ    0x0020\r\n#define QMICTL_SET_INSTANCE_ID_RESP   0x0020\r\n#define QMICTL_GET_VERSION_REQ        0x0021\r\n#define QMICTL_GET_VERSION_RESP       0x0021\r\n#define QMICTL_GET_CLIENT_ID_REQ      0x0022\r\n#define QMICTL_GET_CLIENT_ID_RESP     0x0022\r\n#define QMICTL_RELEASE_CLIENT_ID_REQ  0x0023\r\n#define QMICTL_RELEASE_CLIENT_ID_RESP 0x0023\r\n#define QMICTL_REVOKE_CLIENT_ID_IND   0x0024\r\n#define QMICTL_INVALID_CLIENT_ID_IND  0x0025\r\n#define QMICTL_SET_DATA_FORMAT_REQ    0x0026\r\n#define QMICTL_SET_DATA_FORMAT_RESP   0x0026\r\n#define QMICTL_SYNC_REQ               0x0027\r\n#define QMICTL_SYNC_RESP              0x0027\r\n#define QMICTL_SYNC_IND               0x0027\r\n#define QMI_MESSAGE_CTL_INTERNAL_PROXY_OPEN 0xFF00\r\n\r\n#define QMICTL_FLAG_REQUEST    0x00\r\n#define QMICTL_FLAG_RESPONSE   0x01\r\n#define QMICTL_FLAG_INDICATION 0x02\r\n\r\n// QMICTL Message Definitions\r\n\r\ntypedef struct _QMICTL_SET_INSTANCE_ID_REQ_MSG\r\n{\r\n   UCHAR  CtlFlags;        // QMICTL_FLAG_REQUEST\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;      // QMICTL_SET_INSTANCE_ID_REQ\r\n   USHORT Length;          // 4\r\n   UCHAR  TLVType;         // QCTLV_TYPE_REQUIRED_PARAMETER\r\n   USHORT TLVLength;       // 1\r\n   UCHAR  Value;           // Host-unique QMI instance for this device driver\r\n} __attribute__ ((packed)) QMICTL_SET_INSTANCE_ID_REQ_MSG, *PQMICTL_SET_INSTANCE_ID_REQ_MSG;\r\n\r\ntypedef struct _QMICTL_SET_INSTANCE_ID_RESP_MSG\r\n{\r\n   UCHAR  CtlFlags;        // QMICTL_FLAG_RESPONSE\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;      // QMICTL_SET_INSTANCE_ID_RESP\r\n   USHORT Length;\r\n   UCHAR  TLVType;         // QCTLV_TYPE_RESULT_CODE\r\n   USHORT TLVLength;       // 0x0004\r\n   USHORT QMIResult;\r\n   USHORT QMIError;\r\n   UCHAR  TLV2Type;        // QCTLV_TYPE_REQUIRED_PARAMETER\r\n   USHORT TLV2Length;      // 0x0002\r\n   USHORT QMI_ID;          // Upper byte is assigned by MSM,\r\n                           // lower assigned by host\r\n} __attribute__ ((packed)) QMICTL_SET_INSTANCE_ID_RESP_MSG, *PQMICTL_SET_INSTANCE_ID_RESP_MSG;\r\n\r\ntypedef struct _QMICTL_GET_VERSION_REQ_MSG\r\n{\r\n   UCHAR  CtlFlags;        // QMICTL_FLAG_REQUEST\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;      // QMICTL_GET_VERSION_REQ\r\n   USHORT Length;          // 0\r\n   UCHAR  TLVType;         // QCTLV_TYPE_REQUIRED_PARAMETER\r\n   USHORT TLVLength;       // var\r\n   UCHAR  QMUXTypes;       // List of one byte QMUX_TYPE values\r\n                           // 0xFF returns a list of versions for all\r\n                           // QMUX_TYPEs implemented on the device\r\n} __attribute__ ((packed)) QMICTL_GET_VERSION_REQ_MSG, *PQMICTL_GET_VERSION_REQ_MSG;\r\n\r\ntypedef struct _QMUX_TYPE_VERSION_STRUCT\r\n{\r\n   UCHAR  QMUXType;\r\n   USHORT MajorVersion;\r\n   USHORT MinorVersion;\r\n} __attribute__ ((packed)) QMUX_TYPE_VERSION_STRUCT, *PQMUX_TYPE_VERSION_STRUCT;\r\n\r\ntypedef struct _ADDENDUM_VERSION_PREAMBLE\r\n{\r\n   UCHAR LabelLength;\r\n   UCHAR Label;\r\n} __attribute__ ((packed)) ADDENDUM_VERSION_PREAMBLE, *PADDENDUM_VERSION_PREAMBLE;\r\n\r\n#define QMICTL_GET_VERSION_RSP_TLV_TYPE_VERSION     0x01\r\n#define QMICTL_GET_VERSION_RSP_TLV_TYPE_ADD_VERSION 0x10\r\n\r\ntypedef struct _QMICTL_GET_VERSION_RESP_MSG\r\n{\r\n   UCHAR  CtlFlags;        // QMICTL_FLAG_RESPONSE\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;      // QMICTL_GET_VERSION_RESP\r\n   USHORT Length;\r\n   UCHAR  TLVType;         // QCTLV_TYPE_RESULT_CODE\r\n   USHORT TLVLength;       // 0x0004\r\n   USHORT QMIResult;\r\n   USHORT QMIError;\r\n   UCHAR  TLV2Type;        // QCTLV_TYPE_REQUIRED_PARAMETER\r\n   USHORT TLV2Length;      // var\r\n   UCHAR  NumElements;     // Num of QMUX_TYPE_VERSION_STRUCT\r\n   QMUX_TYPE_VERSION_STRUCT TypeVersion[0];\r\n} __attribute__ ((packed)) QMICTL_GET_VERSION_RESP_MSG, *PQMICTL_GET_VERSION_RESP_MSG;\r\n\r\ntypedef struct _QMICTL_GET_CLIENT_ID_REQ_MSG\r\n{\r\n   UCHAR  CtlFlags;        // QMICTL_FLAG_REQUEST\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;      // QMICTL_GET_CLIENT_ID_REQ\r\n   USHORT Length;\r\n   UCHAR  TLVType;         // QCTLV_TYPE_REQUIRED_PARAMETER\r\n   USHORT TLVLength;       // 1\r\n   UCHAR  QMIType;         // QMUX type\r\n} __attribute__ ((packed)) QMICTL_GET_CLIENT_ID_REQ_MSG, *PQMICTL_GET_CLIENT_ID_REQ_MSG;\r\n\r\ntypedef struct _QMICTL_GET_CLIENT_ID_RESP_MSG\r\n{\r\n   UCHAR  CtlFlags;        // QMICTL_FLAG_RESPONSE\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;      // QMICTL_GET_CLIENT_ID_RESP\r\n   USHORT Length;\r\n   UCHAR  TLVType;         // QCTLV_TYPE_RESULT_CODE\r\n   USHORT TLVLength;       // 0x0004\r\n   USHORT QMIResult;       // result code\r\n   USHORT QMIError;        // error code\r\n   UCHAR  TLV2Type;        // QCTLV_TYPE_REQUIRED_PARAMETER\r\n   USHORT TLV2Length;      // 2\r\n   UCHAR  QMIType;\r\n   UCHAR  ClientId;\r\n} __attribute__ ((packed)) QMICTL_GET_CLIENT_ID_RESP_MSG, *PQMICTL_GET_CLIENT_ID_RESP_MSG;\r\n\r\ntypedef struct _QMICTL_RELEASE_CLIENT_ID_REQ_MSG\r\n{\r\n   UCHAR  CtlFlags;        // QMICTL_FLAG_REQUEST\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;      // QMICTL_RELEASE_CLIENT_ID_REQ\r\n   USHORT Length;\r\n   UCHAR  TLVType;         // QCTLV_TYPE_REQUIRED_PARAMETER\r\n   USHORT TLVLength;       // 0x0002\r\n   UCHAR  QMIType;\r\n   UCHAR  ClientId;\r\n} __attribute__ ((packed)) QMICTL_RELEASE_CLIENT_ID_REQ_MSG, *PQMICTL_RELEASE_CLIENT_ID_REQ_MSG;\r\n\r\ntypedef struct _QMICTL_RELEASE_CLIENT_ID_RESP_MSG\r\n{\r\n   UCHAR  CtlFlags;        // QMICTL_FLAG_RESPONSE\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;      // QMICTL_RELEASE_CLIENT_ID_RESP\r\n   USHORT Length;\r\n   UCHAR  TLVType;         // QCTLV_TYPE_RESULT_CODE\r\n   USHORT TLVLength;       // 0x0004\r\n   USHORT QMIResult;       // result code\r\n   USHORT QMIError;        // error code\r\n   UCHAR  TLV2Type;        // QCTLV_TYPE_REQUIRED_PARAMETER\r\n   USHORT TLV2Length;      // 2\r\n   UCHAR  QMIType;\r\n   UCHAR  ClientId;\r\n} __attribute__ ((packed)) QMICTL_RELEASE_CLIENT_ID_RESP_MSG, *PQMICTL_RELEASE_CLIENT_ID_RESP_MSG;\r\n\r\ntypedef struct _QMICTL_REVOKE_CLIENT_ID_IND_MSG\r\n{\r\n   UCHAR  CtlFlags;        // QMICTL_FLAG_INDICATION\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;      // QMICTL_REVOKE_CLIENT_ID_IND\r\n   USHORT Length;\r\n   UCHAR  TLVType;         // QCTLV_TYPE_REQUIRED_PARAMETER\r\n   USHORT TLVLength;       // 0x0002\r\n   UCHAR  QMIType;\r\n   UCHAR  ClientId;\r\n} __attribute__ ((packed)) QMICTL_REVOKE_CLIENT_ID_IND_MSG, *PQMICTL_REVOKE_CLIENT_ID_IND_MSG;\r\n\r\ntypedef struct _QMICTL_INVALID_CLIENT_ID_IND_MSG\r\n{\r\n   UCHAR  CtlFlags;        // QMICTL_FLAG_INDICATION\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;      // QMICTL_REVOKE_CLIENT_ID_IND\r\n   USHORT Length;\r\n   UCHAR  TLVType;         // QCTLV_TYPE_REQUIRED_PARAMETER\r\n   USHORT TLVLength;       // 0x0002\r\n   UCHAR  QMIType;\r\n   UCHAR  ClientId;\r\n} __attribute__ ((packed)) QMICTL_INVALID_CLIENT_ID_IND_MSG, *PQMICTL_INVALID_CLIENT_ID_IND_MSG;\r\n\r\ntypedef struct _QMICTL_SET_DATA_FORMAT_REQ_MSG\r\n{\r\n   UCHAR  CtlFlags;        // QMICTL_FLAG_REQUEST\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;      // QMICTL_SET_DATA_FORMAT_REQ\r\n   USHORT Length;\r\n   UCHAR  TLVType;         // QCTLV_TYPE_REQUIRED_PARAMETER\r\n   USHORT TLVLength;       // 1\r\n   UCHAR  DataFormat;      // 0-default; 1-QoS hdr present\r\n} __attribute__ ((packed)) QMICTL_SET_DATA_FORMAT_REQ_MSG, *PQMICTL_SET_DATA_FORMAT_REQ_MSG;\r\n\r\n#ifdef QC_IP_MODE\r\n#define SET_DATA_FORMAT_TLV_TYPE_LINK_PROTO 0x10\r\n#define SET_DATA_FORMAT_LINK_PROTO_ETH      0x0001\r\n#define SET_DATA_FORMAT_LINK_PROTO_IP       0x0002\r\ntypedef struct _QMICTL_SET_DATA_FORMAT_TLV_LINK_PROT\r\n{\r\n   UCHAR  TLVType;         // Link-Layer Protocol\r\n   USHORT TLVLength;       // 2\r\n   USHORT LinkProt;        // 0x1: ETH; 0x2: IP\r\n} QMICTL_SET_DATA_FORMAT_TLV_LINK_PROT, *PQMICTL_SET_DATA_FORMAT_TLV_LINK_PROT;\r\n\r\n#ifdef QCMP_UL_TLP\r\n#define SET_DATA_FORMAT_TLV_TYPE_UL_TLP 0x11\r\ntypedef struct _QMICTL_SET_DATA_FORMAT_TLV_UL_TLP\r\n{\r\n   UCHAR  TLVType;         // 0x11, Uplink TLP Setting\r\n   USHORT TLVLength;       // 1\r\n   UCHAR  UlTlpSetting;    // 0x0: Disable; 0x01: Enable\r\n} QMICTL_SET_DATA_FORMAT_TLV_UL_TLP, *PQMICTL_SET_DATA_FORMAT_TLV_UL_TLP;\r\n#endif // QCMP_UL_TLP\r\n\r\n#ifdef QCMP_DL_TLP\r\n#define SET_DATA_FORMAT_TLV_TYPE_DL_TLP 0x13\r\ntypedef struct _QMICTL_SET_DATA_FORMAT_TLV_DL_TLP\r\n{\r\n   UCHAR  TLVType;         // 0x11, Uplink TLP Setting\r\n   USHORT TLVLength;       // 1\r\n   UCHAR  DlTlpSetting;    // 0x0: Disable; 0x01: Enable\r\n} QMICTL_SET_DATA_FORMAT_TLV_DL_TLP, *PQMICTL_SET_DATA_FORMAT_TLV_DL_TLP;\r\n#endif // QCMP_DL_TLP\r\n\r\n#endif // QC_IP_MODE\r\n\r\n#ifdef MP_QCQOS_ENABLED\r\n#define SET_DATA_FORMAT_TLV_TYPE_QOS_SETTING 0x12\r\ntypedef struct _QMICTL_SET_DATA_FORMAT_TLV_QOS_SETTING\r\n{\r\n   UCHAR  TLVType;       // 0x12, QoS setting\r\n   USHORT TLVLength;     // 1\r\n   UCHAR  QosSetting;    // 0x0: Disable; 0x01: Enable\r\n} QMICTL_SET_DATA_FORMAT_TLV_QOS_SETTING, *PQMICTL_SET_DATA_FORMAT_TLV_QOS_SETTING;\r\n#endif // MP_QCQOS_ENABLED\r\n\r\ntypedef struct _QMICTL_SET_DATA_FORMAT_RESP_MSG\r\n{\r\n   UCHAR  CtlFlags;        // QMICTL_FLAG_RESPONSE\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;      // QMICTL_SET_DATA_FORMAT_RESP\r\n   USHORT Length;\r\n   UCHAR  TLVType;         // QCTLV_TYPE_RESULT_CODE\r\n   USHORT TLVLength;       // 0x0004\r\n   USHORT QMIResult;       // result code\r\n   USHORT QMIError;        // error code\r\n} __attribute__ ((packed)) QMICTL_SET_DATA_FORMAT_RESP_MSG, *PQMICTL_SET_DATA_FORMAT_RESP_MSG;\r\n\r\ntypedef struct _QMICTL_SYNC_REQ_MSG\r\n{\r\n   UCHAR  CtlFlags;        // QMICTL_FLAG_REQUEST\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;      // QMICTL_CTL_SYNC_REQ\r\n   USHORT Length;          // 0\r\n} __attribute__ ((packed)) QMICTL_SYNC_REQ_MSG, *PQMICTL_SYNC_REQ_MSG;\r\n\r\ntypedef struct _QMICTL_SYNC_RESP_MSG\r\n{\r\n   UCHAR  CtlFlags;        // QMICTL_FLAG_RESPONSE\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;      // QMICTL_CTL_SYNC_RESP\r\n   USHORT Length;\r\n   UCHAR  TLVType;         // QCTLV_TYPE_RESULT_CODE\r\n   USHORT TLVLength;       // 0x0004\r\n   USHORT QMIResult;\r\n   USHORT QMIError;\r\n} __attribute__ ((packed)) QMICTL_SYNC_RESP_MSG, *PQMICTL_SYNC_RESP_MSG;\r\n\r\ntypedef struct _QMICTL_SYNC_IND_MSG\r\n{\r\n   UCHAR  CtlFlags;        // QMICTL_FLAG_INDICATION\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;      // QMICTL_REVOKE_CLIENT_ID_IND\r\n   USHORT Length;\r\n} __attribute__ ((packed)) QMICTL_SYNC_IND_MSG, *PQMICTL_SYNC_IND_MSG;\r\n\r\ntypedef struct _QMICTL_LIBQMI_PROXY_OPEN_MSG\r\n{\r\n   UCHAR  CtlFlags;        // QMICTL_FLAG_RESPONSE\r\n   UCHAR  TransactionId;\r\n   USHORT QMICTLType;      // QMICTL_SET_DATA_FORMAT_RESP\r\n   USHORT Length;\r\n   UCHAR  TLVType;         // QCTLV_TYPE_RESULT_CODE\r\n   USHORT TLVLength;       // 0x0004\r\n   char device_path[0];       // result code\r\n} __attribute__ ((packed)) QMICTL_LIBQMI_PROXY_OPEN_MSG, *PQMICTL_LIBQMI_PROXY_OPEN_MSG;\r\n\r\ntypedef struct _QMICTL_MSG\r\n{\r\n   union\r\n   {\r\n      // Message Header\r\n      QCQMICTL_MSG_HDR                             QMICTLMsgHdr;\r\n      QCQMICTL_MSG_HDR_RESP                             QMICTLMsgHdrRsp;\r\n\r\n      // QMICTL Message\r\n      QMICTL_SET_INSTANCE_ID_REQ_MSG               SetInstanceIdReq;\r\n      QMICTL_SET_INSTANCE_ID_RESP_MSG              SetInstanceIdRsp;\r\n      QMICTL_GET_VERSION_REQ_MSG                   GetVersionReq;\r\n      QMICTL_GET_VERSION_RESP_MSG                  GetVersionRsp;\r\n      QMICTL_GET_CLIENT_ID_REQ_MSG                 GetClientIdReq;\r\n      QMICTL_GET_CLIENT_ID_RESP_MSG                GetClientIdRsp;\r\n      QMICTL_RELEASE_CLIENT_ID_REQ_MSG             ReleaseClientIdReq;\r\n      QMICTL_RELEASE_CLIENT_ID_RESP_MSG            ReleaseClientIdRsp;\r\n      QMICTL_REVOKE_CLIENT_ID_IND_MSG              RevokeClientIdInd;\r\n      QMICTL_INVALID_CLIENT_ID_IND_MSG             InvalidClientIdInd;\r\n      QMICTL_SET_DATA_FORMAT_REQ_MSG               SetDataFormatReq;\r\n      QMICTL_SET_DATA_FORMAT_RESP_MSG              SetDataFormatRsp;\r\n      QMICTL_SYNC_REQ_MSG                          SyncReq;\r\n      QMICTL_SYNC_RESP_MSG                         SyncRsp;\r\n      QMICTL_SYNC_IND_MSG                          SyncInd;\r\n      QMICTL_LIBQMI_PROXY_OPEN_MSG          LibQmiProxyOpenReq;\r\n   };\r\n} __attribute__ ((packed)) QMICTL_MSG, *PQMICTL_MSG;\r\n#pragma pack(pop)\r\n\r\n#endif //QCQCTL_H"
  },
  {
    "path": "relevance/quectel_cm-5G/src/QCQMI.h",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software. \r\n    Under no circumstances may customers modify, demonstrate, use, deliver \r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n\r\n#ifndef USBQMI_H\r\n#define USBQMI_H\r\n\r\ntypedef uint8_t uint8;\r\ntypedef int8_t int8;\r\ntypedef uint16_t uint16;\r\ntypedef int16_t int16;\r\ntypedef uint32_t uint32;\r\ntypedef uint64_t uint64;\r\n\r\ntypedef signed char    CHAR;\r\ntypedef unsigned char   UCHAR;\r\ntypedef short   SHORT;\r\ntypedef unsigned short   USHORT;\r\ntypedef int   INT;\r\ntypedef unsigned int   UINT;\r\ntypedef long    LONG;\r\ntypedef unsigned int   ULONG;\r\ntypedef unsigned long long   ULONG64;\r\ntypedef signed char   *PCHAR;\r\ntypedef unsigned char   *PUCHAR;\r\ntypedef int   *PINT;\r\ntypedef int   BOOL;\r\n\r\n#define TRUE (1 == 1)\r\n#define FALSE (1 != 1)\r\n\r\n#define QMICTL_SUPPORTED_MAJOR_VERSION 1\r\n#define QMICTL_SUPPORTED_MINOR_VERSION 0\r\n\r\n#pragma pack(push, 1)\r\n\r\n// ========= USB Control Message ==========\r\n\r\n#define USB_CTL_MSG_TYPE_QMI 0x01\r\n\r\n// USB Control Message\r\ntypedef struct _QCUSB_CTL_MSG_HDR\r\n{\r\n   UCHAR IFType;\r\n} __attribute__ ((packed)) QCUSB_CTL_MSG_HDR, *PQCUSB_CTL_MSG_HDR;\r\n\r\n#define QCUSB_CTL_MSG_HDR_SIZE sizeof(QCUSB_CTL_MSG_HDR)\r\n\r\ntypedef struct _QCUSB_CTL_MSG\r\n{\r\n   UCHAR IFType;\r\n   UCHAR Message;\r\n} __attribute__ ((packed)) QCUSB_CTL_MSG, *PQCUSB_CTL_MSG;\r\n\r\n#define QCTLV_TYPE_REQUIRED_PARAMETER 0x01\r\n#define QCTLV_TYPE_RESULT_CODE        0x02\r\n\r\n// ================= QMI ==================\r\n\r\n// Define QMI Type\r\ntypedef enum _QMI_SERVICE_TYPE\r\n{\r\n   QMUX_TYPE_CTL  = 0x00,\r\n   QMUX_TYPE_WDS  = 0x01,\r\n   QMUX_TYPE_DMS  = 0x02,\r\n   QMUX_TYPE_NAS  = 0x03,\r\n   QMUX_TYPE_QOS  = 0x04,\r\n   QMUX_TYPE_WMS  = 0x05,\r\n   QMUX_TYPE_PDS  = 0x06,\r\n   QMUX_TYPE_UIM  = 0x0B,\r\n   QMUX_TYPE_WDS_IPV6  = 0x11,\r\n   QMUX_TYPE_WDS_ADMIN  = 0x1A,\r\n   QMUX_TYPE_COEX  = 0x22,\r\n   QMUX_TYPE_MAX  = 0xFF,\r\n   QMUX_TYPE_ALL  = 0xFF\r\n} QMI_SERVICE_TYPE;\r\n\r\ntypedef enum _QMI_RESULT_CODE_TYPE\r\n{\r\n   QMI_RESULT_SUCCESS = 0x0000,\r\n   QMI_RESULT_FAILURE = 0x0001\r\n} QMI_RESULT_CODE_TYPE;\r\n\r\ntypedef enum _QMI_ERROR_CODE_TYPE\r\n{\r\n    QMI_ERR_NONE  = 0x0000\r\n    ,QMI_ERR_MALFORMED_MSG  = 0x0001\r\n    ,QMI_ERR_NO_MEMORY  = 0x0002\r\n    ,QMI_ERR_INTERNAL  = 0x0003\r\n    ,QMI_ERR_ABORTED  = 0x0004\r\n    ,QMI_ERR_CLIENT_IDS_EXHAUSTED  = 0x0005\r\n    ,QMI_ERR_UNABORTABLE_TRANSACTION  = 0x0006\r\n    ,QMI_ERR_INVALID_CLIENT_ID  = 0x0007\r\n    ,QMI_ERR_NO_THRESHOLDS  = 0x0008\r\n    ,QMI_ERR_INVALID_HANDLE  = 0x0009\r\n    ,QMI_ERR_INVALID_PROFILE  = 0x000A\r\n    ,QMI_ERR_INVALID_PINID  = 0x000B\r\n    ,QMI_ERR_INCORRECT_PIN  = 0x000C\r\n    ,QMI_ERR_NO_NETWORK_FOUND  = 0x000D\r\n    ,QMI_ERR_CALL_FAILED  = 0x000E\r\n    ,QMI_ERR_OUT_OF_CALL  = 0x000F\r\n    ,QMI_ERR_NOT_PROVISIONED  = 0x0010\r\n    ,QMI_ERR_MISSING_ARG  = 0x0011\r\n    ,QMI_ERR_ARG_TOO_LONG  = 0x0013\r\n    ,QMI_ERR_INVALID_TX_ID  = 0x0016\r\n    ,QMI_ERR_DEVICE_IN_USE  = 0x0017\r\n    ,QMI_ERR_OP_NETWORK_UNSUPPORTED  = 0x0018\r\n    ,QMI_ERR_OP_DEVICE_UNSUPPORTED  = 0x0019\r\n    ,QMI_ERR_NO_EFFECT  = 0x001A\r\n    ,QMI_ERR_NO_FREE_PROFILE  = 0x001B\r\n    ,QMI_ERR_INVALID_PDP_TYPE  = 0x001C\r\n    ,QMI_ERR_INVALID_TECH_PREF  = 0x001D\r\n    ,QMI_ERR_INVALID_PROFILE_TYPE  = 0x001E\r\n    ,QMI_ERR_INVALID_SERVICE_TYPE  = 0x001F\r\n    ,QMI_ERR_INVALID_REGISTER_ACTION  = 0x0020\r\n    ,QMI_ERR_INVALID_PS_ATTACH_ACTION  = 0x0021\r\n    ,QMI_ERR_AUTHENTICATION_FAILED  = 0x0022\r\n    ,QMI_ERR_PIN_BLOCKED  = 0x0023\r\n    ,QMI_ERR_PIN_PERM_BLOCKED  = 0x0024\r\n    ,QMI_ERR_SIM_NOT_INITIALIZED  = 0x0025\r\n    ,QMI_ERR_MAX_QOS_REQUESTS_IN_USE  = 0x0026\r\n    ,QMI_ERR_INCORRECT_FLOW_FILTER  = 0x0027\r\n    ,QMI_ERR_NETWORK_QOS_UNAWARE  = 0x0028\r\n    ,QMI_ERR_INVALID_QOS_ID  = 0x0029\r\n    ,QMI_ERR_INVALID_ID  = 0x0029\r\n    ,QMI_ERR_REQUESTED_NUM_UNSUPPORTED  = 0x002A\r\n    ,QMI_ERR_INTERFACE_NOT_FOUND  = 0x002B\r\n    ,QMI_ERR_FLOW_SUSPENDED  = 0x002C\r\n    ,QMI_ERR_INVALID_DATA_FORMAT  = 0x002D\r\n    ,QMI_ERR_GENERAL  = 0x002E\r\n    ,QMI_ERR_UNKNOWN  = 0x002F\r\n    ,QMI_ERR_INVALID_ARG  = 0x0030\r\n    ,QMI_ERR_INVALID_INDEX  = 0x0031\r\n    ,QMI_ERR_NO_ENTRY  = 0x0032\r\n    ,QMI_ERR_DEVICE_STORAGE_FULL  = 0x0033\r\n    ,QMI_ERR_DEVICE_NOT_READY  = 0x0034\r\n    ,QMI_ERR_NETWORK_NOT_READY  = 0x0035\r\n    ,QMI_ERR_CAUSE_CODE  = 0x0036\r\n    ,QMI_ERR_MESSAGE_NOT_SENT  = 0x0037\r\n    ,QMI_ERR_MESSAGE_DELIVERY_FAILURE  = 0x0038\r\n    ,QMI_ERR_INVALID_MESSAGE_ID  = 0x0039\r\n    ,QMI_ERR_ENCODING  = 0x003A\r\n    ,QMI_ERR_AUTHENTICATION_LOCK  = 0x003B\r\n    ,QMI_ERR_INVALID_TRANSITION  = 0x003C\r\n    ,QMI_ERR_NOT_A_MCAST_IFACE  = 0x003D\r\n    ,QMI_ERR_MAX_MCAST_REQUESTS_IN_USE  = 0x003E\r\n    ,QMI_ERR_INVALID_MCAST_HANDLE = 0x003F\r\n    ,QMI_ERR_INVALID_IP_FAMILY_PREF  = 0x0040\r\n    ,QMI_ERR_SESSION_INACTIVE  = 0x0041\r\n    ,QMI_ERR_SESSION_INVALID  = 0x0042\r\n    ,QMI_ERR_SESSION_OWNERSHIP  = 0x0043\r\n    ,QMI_ERR_INSUFFICIENT_RESOURCES  = 0x0044\r\n    ,QMI_ERR_DISABLED  = 0x0045\r\n    ,QMI_ERR_INVALID_OPERATION  = 0x0046\r\n    ,QMI_ERR_INVALID_QMI_CMD  = 0x0047\r\n    ,QMI_ERR_TPDU_TYPE  = 0x0048\r\n    ,QMI_ERR_SMSC_ADDR  = 0x0049\r\n    ,QMI_ERR_INFO_UNAVAILABLE  = 0x004A\r\n    ,QMI_ERR_SEGMENT_TOO_LONG  = 0x004B\r\n    ,QMI_ERR_SEGMENT_ORDER  = 0x004C\r\n    ,QMI_ERR_BUNDLING_NOT_SUPPORTED  = 0x004D\r\n    ,QMI_ERR_OP_PARTIAL_FAILURE  = 0x004E\r\n    ,QMI_ERR_POLICY_MISMATCH  = 0x004F\r\n    ,QMI_ERR_SIM_FILE_NOT_FOUND  = 0x0050\r\n    ,QMI_ERR_EXTENDED_INTERNAL  = 0x0051\r\n    ,QMI_ERR_ACCESS_DENIED  = 0x0052\r\n    ,QMI_ERR_HARDWARE_RESTRICTED  = 0x0053\r\n    ,QMI_ERR_ACK_NOT_SENT  = 0x0054\r\n    ,QMI_ERR_INJECT_TIMEOUT  = 0x0055\r\n    ,QMI_ERR_INCOMPATIBLE_STATE = 0x005A\r\n    ,QMI_ERR_FDN_RESTRICT  = 0x005B\r\n    ,QMI_ERR_SUPS_FAILURE_CAUSE  = 0x005C\r\n    ,QMI_ERR_NO_RADIO  = 0x005D\r\n    ,QMI_ERR_NOT_SUPPORTED  = 0x005E\r\n    ,QMI_ERR_NO_SUBSCRIPTION  = 0x005F\r\n    ,QMI_ERR_CARD_CALL_CONTROL_FAILED  = 0x0060\r\n    ,QMI_ERR_NETWORK_ABORTED  = 0x0061\r\n    ,QMI_ERR_MSG_BLOCKED  = 0x0062\r\n    ,QMI_ERR_INVALID_SESSION_TYPE  = 0x0064\r\n    ,QMI_ERR_INVALID_PB_TYPE  = 0x0065\r\n    ,QMI_ERR_NO_SIM  = 0x0066\r\n    ,QMI_ERR_PB_NOT_READY  = 0x0067\r\n    ,QMI_ERR_PIN_RESTRICTION  = 0x0068\r\n    ,QMI_ERR_PIN2_RESTRICTION  = 0x0069\r\n    ,QMI_ERR_PUK_RESTRICTION  = 0x006A\r\n    ,QMI_ERR_PUK2_RESTRICTION  = 0x006B\r\n    ,QMI_ERR_PB_ACCESS_RESTRICTED  = 0x006C\r\n    ,QMI_ERR_PB_DELETE_IN_PROG  = 0x006D\r\n    ,QMI_ERR_PB_TEXT_TOO_LONG  = 0x006E\r\n    ,QMI_ERR_PB_NUMBER_TOO_LONG  = 0x006F\r\n    ,QMI_ERR_PB_HIDDEN_KEY_RESTRICTION  = 0x0070\r\n} QMI_ERROR_CODE_TYPE;\r\n\r\n#define QCQMI_CTL_FLAG_SERVICE   0x80\r\n#define QCQMI_CTL_FLAG_CTL_POINT 0x00\r\n\r\ntypedef struct _QCQMI_HDR\r\n{\r\n   UCHAR  IFType;\r\n   USHORT Length;\r\n   UCHAR  CtlFlags;  // reserved\r\n   UCHAR  QMIType;\r\n   UCHAR  ClientId;\r\n} __attribute__ ((packed)) QCQMI_HDR, *PQCQMI_HDR;\r\n\r\n#define QCQMI_HDR_SIZE (sizeof(QCQMI_HDR)-1)\r\n\r\ntypedef struct _QCQMI\r\n{\r\n   UCHAR  IFType;\r\n   USHORT Length;\r\n   UCHAR  CtlFlags;  // reserved\r\n   UCHAR  QMIType;\r\n   UCHAR  ClientId;\r\n   UCHAR  SDU;\r\n} __attribute__ ((packed)) QCQMI, *PQCQMI;\r\n\r\ntypedef struct _QMI_SERVICE_VERSION\r\n{\r\n   USHORT Major;\r\n   USHORT Minor;\r\n   USHORT AddendumMajor;\r\n   USHORT AddendumMinor;\r\n} __attribute__ ((packed)) QMI_SERVICE_VERSION, *PQMI_SERVICE_VERSION;\r\n\r\n// ================= QMUX ==================\r\n\r\n#define QMUX_MSG_OVERHEAD_BYTES 4  // Type(USHORT) Length(USHORT) -- header\r\n\r\n#define QMUX_BROADCAST_CID 0xFF\r\n\r\ntypedef struct _QCQMUX_HDR\r\n{\r\n   UCHAR  CtlFlags;      // 0: single QMUX Msg; 1:\r\n   USHORT TransactionId;\r\n} __attribute__ ((packed)) QCQMUX_HDR, *PQCQMUX_HDR;\r\n\r\ntypedef struct _QCQMUX\r\n{\r\n   UCHAR  CtlFlags;      // 0: single QMUX Msg; 1:\r\n   USHORT TransactionId;\r\n   UCHAR  Message;  // Type(2), Length(2), Value\r\n} __attribute__ ((packed)) QCQMUX, *PQCQMUX;\r\n\r\n#define QCQMUX_HDR_SIZE sizeof(QCQMUX_HDR)\r\n\r\ntypedef struct _QCQMUX_MSG_HDR\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n} __attribute__ ((packed)) QCQMUX_MSG_HDR, *PQCQMUX_MSG_HDR;\r\n\r\n#define QCQMUX_MSG_HDR_SIZE sizeof(QCQMUX_MSG_HDR)\r\n\r\ntypedef struct _QCQMUX_MSG_HDR_RESP\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n} __attribute__ ((packed)) QCQMUX_MSG_HDR_RESP, *PQCQMUX_MSG_HDR_RESP;\r\n\r\ntypedef struct _QCQMUX_TLV\r\n{\r\n   UCHAR Type;\r\n   USHORT Length;\r\n   UCHAR  Value;\r\n} __attribute__ ((packed)) QCQMUX_TLV, *PQCQMUX_TLV;\r\n\r\ntypedef struct _QMI_TLV_HDR\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n} __attribute__ ((packed)) QMI_TLV_HDR, *PQMI_TLV_HDR;\r\n\r\ntypedef struct _QMI_TLV\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   union {\r\n        int8_t s8;\r\n        uint8_t u8;\r\n        int16_t s16;\r\n        uint16_t u16;\r\n        int32_t s32;\r\n        uint32_t u32;\r\n        uint64_t u64;\r\n   };\r\n} __attribute__ ((packed)) QMI_TLV, *PQMI_TLV;\r\n\r\n// QMUX Message Definitions -- QMI SDU\r\n#define QMUX_CTL_FLAG_SINGLE_MSG    0x00\r\n#define QMUX_CTL_FLAG_COMPOUND_MSG  0x01\r\n#define QMUX_CTL_FLAG_TYPE_CMD      0x00\r\n#define QMUX_CTL_FLAG_TYPE_RSP      0x02\r\n#define QMUX_CTL_FLAG_TYPE_IND      0x04\r\n#define QMUX_CTL_FLAG_MASK_COMPOUND 0x01\r\n#define QMUX_CTL_FLAG_MASK_TYPE     0x06 // 00-cmd, 01-rsp, 10-ind\r\n\r\n#pragma pack(pop)\r\n\r\n#endif // USBQMI_H\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/QCQMUX.c",
    "content": "/*\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\n\n    Quectel hereby grants customers of Quectel a license to use, modify,\n    distribute and publish the Software in binary form provided that\n    customers shall have no right to reverse engineer, reverse assemble,\n    decompile or reduce to source code form any portion of the Software. \n    Under no circumstances may customers modify, demonstrate, use, deliver \n    or disclose any portion of the Software in source code form.\n*/\n\n#include \"QMIThread.h\"\nstatic char line[1024];\nstatic pthread_mutex_t dumpQMIMutex = PTHREAD_MUTEX_INITIALIZER;\n#undef dbg\n#define dbg( format, arg... ) do {if (strlen(line) < sizeof(line)) snprintf(&line[strlen(line)], sizeof(line) - strlen(line), format, ## arg);} while (0)\n\nPQMI_TLV_HDR GetTLV (PQCQMUX_MSG_HDR pQMUXMsgHdr, int TLVType);\n\ntypedef struct {\n    UINT type;\n    const char *name;\n} QMI_NAME_T;\n\n#define qmi_name_item(type) {type, #type}\n\n#if 0\nstatic const QMI_NAME_T qmi_IFType[] = {\n{USB_CTL_MSG_TYPE_QMI, \"USB_CTL_MSG_TYPE_QMI\"},\n};\n\nstatic const QMI_NAME_T qmi_CtlFlags[] = {\nqmi_name_item(QMICTL_CTL_FLAG_CMD),\nqmi_name_item(QCQMI_CTL_FLAG_SERVICE),\n};\n\nstatic const QMI_NAME_T qmi_QMIType[] = {\nqmi_name_item(QMUX_TYPE_CTL),\nqmi_name_item(QMUX_TYPE_WDS),\nqmi_name_item(QMUX_TYPE_DMS),\nqmi_name_item(QMUX_TYPE_NAS),\nqmi_name_item(QMUX_TYPE_QOS),\nqmi_name_item(QMUX_TYPE_WMS),\nqmi_name_item(QMUX_TYPE_PDS),\nqmi_name_item(QMUX_TYPE_WDS_ADMIN),\nqmi_name_item(QMUX_TYPE_COEX),\n};\n\nstatic const QMI_NAME_T qmi_ctl_CtlFlags[] = {\nqmi_name_item(QMICTL_FLAG_REQUEST),\nqmi_name_item(QMICTL_FLAG_RESPONSE),\nqmi_name_item(QMICTL_FLAG_INDICATION),\n};\n#endif\n\nstatic const QMI_NAME_T qmux_ctl_QMICTLType[] = {\n// QMICTL Type\nqmi_name_item(QMICTL_SET_INSTANCE_ID_REQ), //    0x0020\nqmi_name_item(QMICTL_SET_INSTANCE_ID_RESP), //   0x0020\nqmi_name_item(QMICTL_GET_VERSION_REQ), //        0x0021\nqmi_name_item(QMICTL_GET_VERSION_RESP), //       0x0021\nqmi_name_item(QMICTL_GET_CLIENT_ID_REQ), //      0x0022\nqmi_name_item(QMICTL_GET_CLIENT_ID_RESP), //     0x0022\nqmi_name_item(QMICTL_RELEASE_CLIENT_ID_REQ), //  0x0023\nqmi_name_item(QMICTL_RELEASE_CLIENT_ID_RESP), // 0x0023\nqmi_name_item(QMICTL_REVOKE_CLIENT_ID_IND), //   0x0024\nqmi_name_item(QMICTL_INVALID_CLIENT_ID_IND), //  0x0025\nqmi_name_item(QMICTL_SET_DATA_FORMAT_REQ), //    0x0026\nqmi_name_item(QMICTL_SET_DATA_FORMAT_RESP), //   0x0026\nqmi_name_item(QMICTL_SYNC_REQ), //               0x0027\nqmi_name_item(QMICTL_SYNC_RESP), //              0x0027\nqmi_name_item(QMICTL_SYNC_IND), //               0x0027\n};\n\nstatic const QMI_NAME_T qmux_CtlFlags[] = {\nqmi_name_item(QMUX_CTL_FLAG_TYPE_CMD),\nqmi_name_item(QMUX_CTL_FLAG_TYPE_RSP),\nqmi_name_item(QMUX_CTL_FLAG_TYPE_IND),\n};\n\n\nstatic const QMI_NAME_T qmux_wds_Type[] = {\nqmi_name_item(QMIWDS_SET_EVENT_REPORT_REQ), //           0x0001\nqmi_name_item(QMIWDS_SET_EVENT_REPORT_RESP), //          0x0001\nqmi_name_item(QMIWDS_EVENT_REPORT_IND), //               0x0001\nqmi_name_item(QMIWDS_START_NETWORK_INTERFACE_REQ), //    0x0020\nqmi_name_item(QMIWDS_START_NETWORK_INTERFACE_RESP), //   0x0020\nqmi_name_item(QMIWDS_STOP_NETWORK_INTERFACE_REQ), //     0x0021\nqmi_name_item(QMIWDS_STOP_NETWORK_INTERFACE_RESP), //    0x0021\nqmi_name_item(QMIWDS_GET_PKT_SRVC_STATUS_REQ), //        0x0022\nqmi_name_item(QMIWDS_GET_PKT_SRVC_STATUS_RESP), //       0x0022\nqmi_name_item(QMIWDS_GET_PKT_SRVC_STATUS_IND), //        0x0022  \nqmi_name_item(QMIWDS_GET_CURRENT_CHANNEL_RATE_REQ), //   0x0023  \nqmi_name_item(QMIWDS_GET_CURRENT_CHANNEL_RATE_RESP), //  0x0023  \nqmi_name_item(QMIWDS_GET_PKT_STATISTICS_REQ), //         0x0024  \nqmi_name_item(QMIWDS_GET_PKT_STATISTICS_RESP), //        0x0024  \nqmi_name_item(QMIWDS_MODIFY_PROFILE_SETTINGS_REQ), //    0x0028\nqmi_name_item(QMIWDS_MODIFY_PROFILE_SETTINGS_RESP), //   0x0028\nqmi_name_item(QMIWDS_GET_PROFILE_SETTINGS_REQ), //    0x002B\nqmi_name_item(QMIWDS_GET_PROFILE_SETTINGS_RESP), //   0x002BD\nqmi_name_item(QMIWDS_GET_DEFAULT_SETTINGS_REQ), //       0x002C\nqmi_name_item(QMIWDS_GET_DEFAULT_SETTINGS_RESP), //      0x002C\nqmi_name_item(QMIWDS_GET_RUNTIME_SETTINGS_REQ), //       0x002D\nqmi_name_item(QMIWDS_GET_RUNTIME_SETTINGS_RESP), //      0x002D\nqmi_name_item(QMIWDS_GET_MIP_MODE_REQ), //               0x002F\nqmi_name_item(QMIWDS_GET_MIP_MODE_RESP), //              0x002F\nqmi_name_item(QMIWDS_GET_DATA_BEARER_REQ), //            0x0037\nqmi_name_item(QMIWDS_GET_DATA_BEARER_RESP), //           0x0037\nqmi_name_item(QMIWDS_DUN_CALL_INFO_REQ), //              0x0038\nqmi_name_item(QMIWDS_DUN_CALL_INFO_RESP), //             0x0038\nqmi_name_item(QMIWDS_DUN_CALL_INFO_IND), //              0x0038\nqmi_name_item(QMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ), //  0x004D  \nqmi_name_item(QMIWDS_SET_CLIENT_IP_FAMILY_PREF_RESP), // 0x004D  \nqmi_name_item(QMIWDS_SET_AUTO_CONNECT_REQ), //  0x0051  \nqmi_name_item(QMIWDS_SET_AUTO_CONNECT_RESP), // 0x0051\nqmi_name_item(QMIWDS_BIND_MUX_DATA_PORT_REQ), //         0x00A2  \nqmi_name_item(QMIWDS_BIND_MUX_DATA_PORT_RESP), //        0x00A2  \n};\n\nstatic const QMI_NAME_T qmux_dms_Type[] = {\n// ======================= DMS ==============================\nqmi_name_item(QMIDMS_SET_EVENT_REPORT_REQ), //           0x0001\nqmi_name_item(QMIDMS_SET_EVENT_REPORT_RESP), //          0x0001\nqmi_name_item(QMIDMS_EVENT_REPORT_IND), //               0x0001\nqmi_name_item(QMIDMS_GET_DEVICE_CAP_REQ), //             0x0020\nqmi_name_item(QMIDMS_GET_DEVICE_CAP_RESP), //            0x0020\nqmi_name_item(QMIDMS_GET_DEVICE_MFR_REQ), //             0x0021\nqmi_name_item(QMIDMS_GET_DEVICE_MFR_RESP), //            0x0021\nqmi_name_item(QMIDMS_GET_DEVICE_MODEL_ID_REQ), //        0x0022\nqmi_name_item(QMIDMS_GET_DEVICE_MODEL_ID_RESP), //       0x0022\nqmi_name_item(QMIDMS_GET_DEVICE_REV_ID_REQ), //          0x0023\nqmi_name_item(QMIDMS_GET_DEVICE_REV_ID_RESP), //         0x0023\nqmi_name_item(QMIDMS_GET_MSISDN_REQ), //                 0x0024\nqmi_name_item(QMIDMS_GET_MSISDN_RESP), //                0x0024\nqmi_name_item(QMIDMS_GET_DEVICE_SERIAL_NUMBERS_REQ), //  0x0025\nqmi_name_item(QMIDMS_GET_DEVICE_SERIAL_NUMBERS_RESP), // 0x0025\nqmi_name_item(QMIDMS_UIM_SET_PIN_PROTECTION_REQ), //     0x0027\nqmi_name_item(QMIDMS_UIM_SET_PIN_PROTECTION_RESP), //    0x0027\nqmi_name_item(QMIDMS_UIM_VERIFY_PIN_REQ), //             0x0028\nqmi_name_item(QMIDMS_UIM_VERIFY_PIN_RESP), //            0x0028\nqmi_name_item(QMIDMS_UIM_UNBLOCK_PIN_REQ), //            0x0029\nqmi_name_item(QMIDMS_UIM_UNBLOCK_PIN_RESP), //           0x0029\nqmi_name_item(QMIDMS_UIM_CHANGE_PIN_REQ), //             0x002A\nqmi_name_item(QMIDMS_UIM_CHANGE_PIN_RESP), //            0x002A\nqmi_name_item(QMIDMS_UIM_GET_PIN_STATUS_REQ), //         0x002B\nqmi_name_item(QMIDMS_UIM_GET_PIN_STATUS_RESP), //        0x002B\nqmi_name_item(QMIDMS_GET_DEVICE_HARDWARE_REV_REQ), //    0x002C\nqmi_name_item(QMIDMS_GET_DEVICE_HARDWARE_REV_RESP), //   0x002C\nqmi_name_item(QMIDMS_GET_OPERATING_MODE_REQ), //         0x002D \nqmi_name_item(QMIDMS_GET_OPERATING_MODE_RESP), //        0x002D \nqmi_name_item(QMIDMS_SET_OPERATING_MODE_REQ), //         0x002E \nqmi_name_item(QMIDMS_SET_OPERATING_MODE_RESP), //        0x002E \nqmi_name_item(QMIDMS_GET_ACTIVATED_STATUS_REQ), //       0x0031 \nqmi_name_item(QMIDMS_GET_ACTIVATED_STATUS_RESP), //      0x0031 \nqmi_name_item(QMIDMS_ACTIVATE_AUTOMATIC_REQ), //         0x0032\nqmi_name_item(QMIDMS_ACTIVATE_AUTOMATIC_RESP), //        0x0032\nqmi_name_item(QMIDMS_ACTIVATE_MANUAL_REQ), //            0x0033\nqmi_name_item(QMIDMS_ACTIVATE_MANUAL_RESP), //           0x0033\nqmi_name_item(QMIDMS_UIM_GET_ICCID_REQ), //              0x003C \nqmi_name_item(QMIDMS_UIM_GET_ICCID_RESP), //             0x003C \nqmi_name_item(QMIDMS_UIM_GET_CK_STATUS_REQ), //          0x0040\nqmi_name_item(QMIDMS_UIM_GET_CK_STATUS_RESP), //         0x0040\nqmi_name_item(QMIDMS_UIM_SET_CK_PROTECTION_REQ), //      0x0041\nqmi_name_item(QMIDMS_UIM_SET_CK_PROTECTION_RESP), //     0x0041\nqmi_name_item(QMIDMS_UIM_UNBLOCK_CK_REQ), //             0x0042\nqmi_name_item(QMIDMS_UIM_UNBLOCK_CK_RESP), //            0x0042\nqmi_name_item(QMIDMS_UIM_GET_IMSI_REQ), //               0x0043 \nqmi_name_item(QMIDMS_UIM_GET_IMSI_RESP), //              0x0043 \nqmi_name_item(QMIDMS_UIM_GET_STATE_REQ), //              0x0044 \nqmi_name_item(QMIDMS_UIM_GET_STATE_RESP), //             0x0044 \nqmi_name_item(QMIDMS_GET_BAND_CAP_REQ), //               0x0045 \nqmi_name_item(QMIDMS_GET_BAND_CAP_RESP), //              0x0045 \n};\n\nstatic const QMI_NAME_T qmux_qos_Type[] = {\nqmi_name_item( QMI_QOS_SET_EVENT_REPORT_REQ), //        0x0001\nqmi_name_item( QMI_QOS_SET_EVENT_REPORT_RESP), //       0x0001\nqmi_name_item( QMI_QOS_SET_EVENT_REPORT_IND), //        0x0001\nqmi_name_item( QMI_QOS_BIND_DATA_PORT_REQ), //          0x002B\nqmi_name_item( QMI_QOS_BIND_DATA_PORT_RESP), //         0x002B\nqmi_name_item( QMI_QOS_INDICATION_REGISTER_REQ), //     0x002F\nqmi_name_item( QMI_QOS_INDICATION_REGISTER_RESP), //    0x002F\nqmi_name_item( QMI_QOS_GLOBAL_QOS_FLOW_IND), //         0x0031\nqmi_name_item( QMI_QOS_GET_QOS_INFO_REQ), //            0x0033\nqmi_name_item( QMI_QOS_GET_QOS_INFO_RESP), //           0x0033\n};\n\nstatic const QMI_NAME_T qmux_nas_Type[] = {\n// ======================= NAS ==============================\nqmi_name_item(QMINAS_SET_EVENT_REPORT_REQ), //             0x0002\nqmi_name_item(QMINAS_SET_EVENT_REPORT_RESP), //            0x0002\nqmi_name_item(QMINAS_EVENT_REPORT_IND), //                 0x0002\nqmi_name_item(QMINAS_GET_SIGNAL_STRENGTH_REQ), //          0x0020\nqmi_name_item(QMINAS_GET_SIGNAL_STRENGTH_RESP), //         0x0020\nqmi_name_item(QMINAS_PERFORM_NETWORK_SCAN_REQ), //         0x0021\nqmi_name_item(QMINAS_PERFORM_NETWORK_SCAN_RESP), //        0x0021\nqmi_name_item(QMINAS_INITIATE_NW_REGISTER_REQ), //         0x0022\nqmi_name_item(QMINAS_INITIATE_NW_REGISTER_RESP), //        0x0022\nqmi_name_item(QMINAS_INITIATE_ATTACH_REQ), //              0x0023\nqmi_name_item(QMINAS_INITIATE_ATTACH_RESP), //             0x0023\nqmi_name_item(QMINAS_GET_SERVING_SYSTEM_REQ), //           0x0024\nqmi_name_item(QMINAS_GET_SERVING_SYSTEM_RESP), //          0x0024\nqmi_name_item(QMINAS_SERVING_SYSTEM_IND), //               0x0024\nqmi_name_item(QMINAS_GET_HOME_NETWORK_REQ), //             0x0025\nqmi_name_item(QMINAS_GET_HOME_NETWORK_RESP), //            0x0025\nqmi_name_item(QMINAS_GET_PREFERRED_NETWORK_REQ), //        0x0026\nqmi_name_item(QMINAS_GET_PREFERRED_NETWORK_RESP), //       0x0026\nqmi_name_item(QMINAS_SET_PREFERRED_NETWORK_REQ), //        0x0027\nqmi_name_item(QMINAS_SET_PREFERRED_NETWORK_RESP), //       0x0027\nqmi_name_item(QMINAS_GET_FORBIDDEN_NETWORK_REQ), //        0x0028\nqmi_name_item(QMINAS_GET_FORBIDDEN_NETWORK_RESP), //       0x0028\nqmi_name_item(QMINAS_SET_FORBIDDEN_NETWORK_REQ), //        0x0029\nqmi_name_item(QMINAS_SET_FORBIDDEN_NETWORK_RESP), //       0x0029\nqmi_name_item(QMINAS_SET_TECHNOLOGY_PREF_REQ), //          0x002A\nqmi_name_item(QMINAS_SET_TECHNOLOGY_PREF_RESP), //         0x002A\nqmi_name_item(QMINAS_GET_RF_BAND_INFO_REQ), //             0x0031\nqmi_name_item(QMINAS_GET_RF_BAND_INFO_RESP), //            0x0031\nqmi_name_item(QMINAS_GET_CELL_LOCATION_INFO_REQ),\nqmi_name_item(QMINAS_GET_CELL_LOCATION_INFO_RESP),\nqmi_name_item(QMINAS_GET_PLMN_NAME_REQ), //                0x0044\nqmi_name_item(QMINAS_GET_PLMN_NAME_RESP), //               0x0044\nqmi_name_item(QUECTEL_PACKET_TRANSFER_START_IND), //                0X100\nqmi_name_item(QUECTEL_PACKET_TRANSFER_END_IND), //               0X101\nqmi_name_item(QMINAS_GET_SYS_INFO_REQ), //                 0x004D\nqmi_name_item(QMINAS_GET_SYS_INFO_RESP), //                0x004D\nqmi_name_item(QMINAS_SYS_INFO_IND), //                     0x004D\nqmi_name_item(QMINAS_GET_SIG_INFO_REQ),\nqmi_name_item(QMINAS_GET_SIG_INFO_RESP),\n\n};\n\nstatic const QMI_NAME_T qmux_wms_Type[] = {\n// ======================= WMS ==============================\nqmi_name_item(QMIWMS_SET_EVENT_REPORT_REQ), //           0x0001\nqmi_name_item(QMIWMS_SET_EVENT_REPORT_RESP), //          0x0001\nqmi_name_item(QMIWMS_EVENT_REPORT_IND), //               0x0001\nqmi_name_item(QMIWMS_RAW_SEND_REQ), //                   0x0020\nqmi_name_item(QMIWMS_RAW_SEND_RESP), //                  0x0020\nqmi_name_item(QMIWMS_RAW_WRITE_REQ), //                  0x0021\nqmi_name_item(QMIWMS_RAW_WRITE_RESP), //                 0x0021\nqmi_name_item(QMIWMS_RAW_READ_REQ), //                   0x0022\nqmi_name_item(QMIWMS_RAW_READ_RESP), //                  0x0022\nqmi_name_item(QMIWMS_MODIFY_TAG_REQ), //                 0x0023\nqmi_name_item(QMIWMS_MODIFY_TAG_RESP), //                0x0023\nqmi_name_item(QMIWMS_DELETE_REQ), //                     0x0024\nqmi_name_item(QMIWMS_DELETE_RESP), //                    0x0024\nqmi_name_item(QMIWMS_GET_MESSAGE_PROTOCOL_REQ), //       0x0030\nqmi_name_item(QMIWMS_GET_MESSAGE_PROTOCOL_RESP), //      0x0030\nqmi_name_item(QMIWMS_LIST_MESSAGES_REQ), //              0x0031\nqmi_name_item(QMIWMS_LIST_MESSAGES_RESP), //             0x0031\nqmi_name_item(QMIWMS_GET_SMSC_ADDRESS_REQ), //           0x0034\nqmi_name_item(QMIWMS_GET_SMSC_ADDRESS_RESP), //          0x0034\nqmi_name_item(QMIWMS_SET_SMSC_ADDRESS_REQ), //           0x0035\nqmi_name_item(QMIWMS_SET_SMSC_ADDRESS_RESP), //          0x0035\nqmi_name_item(QMIWMS_GET_STORE_MAX_SIZE_REQ), //         0x0036\nqmi_name_item(QMIWMS_GET_STORE_MAX_SIZE_RESP), //        0x0036\n};\n\nstatic const QMI_NAME_T qmux_wds_admin_Type[] = {\nqmi_name_item(QMIWDS_ADMIN_SET_DATA_FORMAT_REQ), //      0x0020\nqmi_name_item(QMIWDS_ADMIN_SET_DATA_FORMAT_RESP), //     0x0020\nqmi_name_item(QMIWDS_ADMIN_GET_DATA_FORMAT_REQ), //      0x0021\nqmi_name_item(QMIWDS_ADMIN_GET_DATA_FORMAT_RESP), //     0x0021\nqmi_name_item(QMIWDS_ADMIN_SET_QMAP_SETTINGS_REQ), //    0x002B\nqmi_name_item(QMIWDS_ADMIN_SET_QMAP_SETTINGS_RESP), //   0x002B\nqmi_name_item(QMIWDS_ADMIN_GET_QMAP_SETTINGS_REQ), //    0x002C\nqmi_name_item(QMIWDS_ADMIN_GET_QMAP_SETTINGS_RESP), //   0x002C\nqmi_name_item(QMI_WDA_SET_LOOPBACK_CONFIG_REQ), //\t 0x002F\nqmi_name_item(QMI_WDA_SET_LOOPBACK_CONFIG_RESP), //\t 0x002F\nqmi_name_item(QMI_WDA_SET_LOOPBACK_CONFIG_IND), //\t 0x002F\n};\n\nstatic const QMI_NAME_T qmux_uim_Type[] = {\nqmi_name_item( QMIUIM_READ_TRANSPARENT_REQ), //      0x0020\nqmi_name_item( QMIUIM_READ_TRANSPARENT_RESP), //     0x0020\nqmi_name_item( QMIUIM_READ_TRANSPARENT_IND), //      0x0020\nqmi_name_item( QMIUIM_READ_RECORD_REQ), //           0x0021\nqmi_name_item( QMIUIM_READ_RECORD_RESP), //          0x0021\nqmi_name_item( QMIUIM_READ_RECORD_IND), //           0x0021\nqmi_name_item( QMIUIM_WRITE_TRANSPARENT_REQ), //     0x0022\nqmi_name_item( QMIUIM_WRITE_TRANSPARENT_RESP), //    0x0022\nqmi_name_item( QMIUIM_WRITE_TRANSPARENT_IND), //     0x0022\nqmi_name_item( QMIUIM_WRITE_RECORD_REQ), //          0x0023\nqmi_name_item( QMIUIM_WRITE_RECORD_RESP), //         0x0023\nqmi_name_item( QMIUIM_WRITE_RECORD_IND), //          0x0023\nqmi_name_item( QMIUIM_SET_PIN_PROTECTION_REQ), //    0x0025\nqmi_name_item( QMIUIM_SET_PIN_PROTECTION_RESP), //   0x0025\nqmi_name_item( QMIUIM_SET_PIN_PROTECTION_IND), //    0x0025\nqmi_name_item( QMIUIM_VERIFY_PIN_REQ), //            0x0026\nqmi_name_item( QMIUIM_VERIFY_PIN_RESP), //           0x0026\nqmi_name_item( QMIUIM_VERIFY_PIN_IND), //            0x0026\nqmi_name_item( QMIUIM_UNBLOCK_PIN_REQ), //           0x0027\nqmi_name_item( QMIUIM_UNBLOCK_PIN_RESP), //          0x0027\nqmi_name_item( QMIUIM_UNBLOCK_PIN_IND), //           0x0027\nqmi_name_item( QMIUIM_CHANGE_PIN_REQ), //            0x0028\nqmi_name_item( QMIUIM_CHANGE_PIN_RESP), //           0x0028\nqmi_name_item( QMIUIM_CHANGE_PIN_IND), //            0x0028\nqmi_name_item( QMIUIM_DEPERSONALIZATION_REQ), //     0x0029\nqmi_name_item( QMIUIM_DEPERSONALIZATION_RESP), //    0x0029\nqmi_name_item( QMIUIM_EVENT_REG_REQ), //             0x002E\nqmi_name_item( QMIUIM_EVENT_REG_RESP), //            0x002E\nqmi_name_item( QMIUIM_GET_CARD_STATUS_REQ), //       0x002F\nqmi_name_item( QMIUIM_GET_CARD_STATUS_RESP), //      0x002F\nqmi_name_item( QMIUIM_STATUS_CHANGE_IND), //         0x0032\n};\n\nstatic const QMI_NAME_T qmux_coex_Type[] = {\nqmi_name_item(QMI_COEX_GET_WWAN_STATE_REQ), //    0x0022\nqmi_name_item(QMI_COEX_GET_WWAN_STATE_RESP), //    0x0022\n};\n\nstatic const char * qmi_name_get(const QMI_NAME_T *table, size_t size, int type, const char *tag) {\n    static char unknow[40];\n    size_t i;\n\n    if (qmux_CtlFlags == table) {\n        if (!strcmp(tag, \"_REQ\"))\n            tag = \"_CMD\";\n        else  if (!strcmp(tag, \"_RESP\"))\n            tag = \"_RSP\";\n    }\n    \n    for (i = 0; i < size; i++) {\n        if (table[i].type == (UINT)type) {\n            if (!tag || (strstr(table[i].name, tag)))\n                return table[i].name;\n        }\n    }\n    sprintf(unknow, \"unknow_%x\", type);\n    return unknow;\n}\n\n#define QMI_NAME(table, type) qmi_name_get(table, sizeof(table) / sizeof(table[0]), type, 0)\n#define QMUX_NAME(table, type, tag) qmi_name_get(table, sizeof(table) / sizeof(table[0]), type, tag)\n\nvoid dump_tlv(PQCQMUX_MSG_HDR pQMUXMsgHdr) {\n    int TLVFind = 0;\n    int i;\n    //dbg(\"QCQMUX_TLV-----------------------------------\\n\");\n    //dbg(\"{Type,\\tLength,\\tValue}\\n\");\n\n    while (1) {\n        PQMI_TLV_HDR TLVHdr = GetTLV(pQMUXMsgHdr, 0x1000 + (++TLVFind));\n        if (TLVHdr == NULL)\n            break;\n\n        //if ((TLVHdr->TLVType == 0x02) && ((USHORT *)(TLVHdr+1))[0])\n        {        \n            dbg(\"{%02x,\\t%04x,\\t\", TLVHdr->TLVType, le16_to_cpu(TLVHdr->TLVLength));\n            for (i = 0; i < le16_to_cpu(TLVHdr->TLVLength); i++) {\n                dbg(\"%02x \", ((UCHAR *)(TLVHdr+1))[i]);\n            }\n            dbg(\"}\\n\");\n        }\n    }  // while\n}\n\nvoid dump_ctl(PQCQMICTL_MSG_HDR CTLHdr) {\n    const char *tag;\n    \n    //dbg(\"QCQMICTL_MSG--------------------------------------------\\n\");\n    //dbg(\"CtlFlags:           %02x\\t\\t%s\\n\", CTLHdr->CtlFlags, QMI_NAME(qmi_ctl_CtlFlags, CTLHdr->CtlFlags));\n   dbg(\"TransactionId:      %02x\\n\", CTLHdr->TransactionId);\n        switch (CTLHdr->CtlFlags) {\n            case QMICTL_FLAG_REQUEST: tag = \"_REQ\"; break;\n            case QMICTL_FLAG_RESPONSE: tag = \"_RESP\"; break;\n            case QMICTL_FLAG_INDICATION: tag = \"_IND\"; break;\n            default: tag = 0; break;\n       }\n        dbg(\"QMICTLType:         %04x\\t%s\\n\", le16_to_cpu(CTLHdr->QMICTLType),\n        QMUX_NAME(qmux_ctl_QMICTLType, le16_to_cpu(CTLHdr->QMICTLType), tag));     \n        dbg(\"Length:             %04x\\n\", le16_to_cpu(CTLHdr->Length));\n\n     dump_tlv((PQCQMUX_MSG_HDR)(&CTLHdr->QMICTLType));\n}\n\nint dump_qmux(QMI_SERVICE_TYPE serviceType, PQCQMUX_HDR QMUXHdr) {\n    PQCQMUX_MSG_HDR QMUXMsgHdr = (PQCQMUX_MSG_HDR) (QMUXHdr + 1);\n    const char *tag;\n\n    //dbg(\"QCQMUX--------------------------------------------\\n\");\n    switch (QMUXHdr->CtlFlags&QMUX_CTL_FLAG_MASK_TYPE) {\n        case QMUX_CTL_FLAG_TYPE_CMD: tag = \"_REQ\"; break;\n        case QMUX_CTL_FLAG_TYPE_RSP: tag = \"_RESP\"; break;\n        case QMUX_CTL_FLAG_TYPE_IND: tag = \"_IND\"; break;\n        default: tag = 0; break;\n    }\n    //dbg(\"CtlFlags:           %02x\\t\\t%s\\n\", QMUXHdr->CtlFlags, QMUX_NAME(qmux_CtlFlags, QMUXHdr->CtlFlags, tag));\n    dbg(\"TransactionId:    %04x\\n\", le16_to_cpu(QMUXHdr->TransactionId));\n\n    //dbg(\"QCQMUX_MSG_HDR-----------------------------------\\n\");\n    switch (serviceType) {\n        case QMUX_TYPE_DMS:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type),\n            QMUX_NAME(qmux_dms_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));\n        break;\n        case QMUX_TYPE_NAS:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type),\n            QMUX_NAME(qmux_nas_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));\n        break;\n        case QMUX_TYPE_WDS:\n        case QMUX_TYPE_WDS_IPV6:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type),\n            QMUX_NAME(qmux_wds_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));\n        break;\n        case QMUX_TYPE_WMS:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type),\n            QMUX_NAME(qmux_wms_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));\n        break;\n        case QMUX_TYPE_WDS_ADMIN:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type),\n            QMUX_NAME(qmux_wds_admin_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));\n        break;\n        case QMUX_TYPE_UIM:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type),\n            QMUX_NAME(qmux_uim_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));\n        break;\n        case QMUX_TYPE_PDS:\n        case QMUX_TYPE_QOS:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type),\n            QMUX_NAME(qmux_qos_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));\n        break;\n        case QMUX_TYPE_COEX:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type),\n            QMUX_NAME(qmux_coex_Type, le16_to_cpu(QMUXMsgHdr->Type), tag));\n        break;\n        case QMUX_TYPE_CTL:                \n        default:\n            dbg(\"Type:               %04x\\t%s\\n\", le16_to_cpu(QMUXMsgHdr->Type), \"PDS/QOS/CTL/unknown!\");\n        break;    \n    }\n    dbg(\"Length:             %04x\\n\", le16_to_cpu(QMUXMsgHdr->Length));\n\n    dump_tlv(QMUXMsgHdr);\n    \n    return 0;\n}\n\nvoid dump_qmi(void *dataBuffer, int dataLen) \n{\n    PQCQMI_HDR QMIHdr = (PQCQMI_HDR)dataBuffer;\n    PQCQMUX_HDR QMUXHdr = (PQCQMUX_HDR) (QMIHdr + 1);\n    PQCQMICTL_MSG_HDR CTLHdr =  (PQCQMICTL_MSG_HDR) (QMIHdr + 1);\n\n    int i;\n\n    if (!debug_qmi)\n        return;\n\n    pthread_mutex_lock(&dumpQMIMutex);\n    line[0] = 0;\n    for (i = 0; i < dataLen; i++) {\n        dbg(\"%02x \", ((unsigned char *)dataBuffer)[i]);\n    }\n    dbg_time(\"%s\", line);\n    line[0] = 0;\n    \n    //dbg(\"QCQMI_HDR-----------------------------------------\");\n    //dbg(\"IFType:             %02x\\t\\t%s\", QMIHdr->IFType, QMI_NAME(qmi_IFType, QMIHdr->IFType));\n    //dbg(\"Length:             %04x\", le16_to_cpu(QMIHdr->Length));\n    //dbg(\"CtlFlags:           %02x\\t\\t%s\", QMIHdr->CtlFlags, QMI_NAME(qmi_CtlFlags, QMIHdr->CtlFlags));\n    //dbg(\"QMIType:            %02x\\t\\t%s\", QMIHdr->QMIType, QMI_NAME(qmi_QMIType, QMIHdr->QMIType));\n    //dbg(\"ClientId:           %02x\", QMIHdr->ClientId);\n\n    if (QMIHdr->QMIType == QMUX_TYPE_CTL) {\n        dump_ctl(CTLHdr);\n    } else {\n        dump_qmux(QMIHdr->QMIType, QMUXHdr);\n    }\n    dbg_time(\"%s\", line);\n    pthread_mutex_unlock(&dumpQMIMutex);\n}\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/QCQMUX.h",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software. \r\n    Under no circumstances may customers modify, demonstrate, use, deliver \r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#ifndef QCQMUX_H\r\n#define QCQMUX_H\r\n\r\n#include \"QCQMI.h\"\r\n\r\n#pragma pack(push, 1)\r\n\r\n#define QMIWDS_SET_EVENT_REPORT_REQ           0x0001\r\n#define QMIWDS_SET_EVENT_REPORT_RESP          0x0001\r\n#define QMIWDS_EVENT_REPORT_IND               0x0001\r\n#define QMIWDS_START_NETWORK_INTERFACE_REQ    0x0020\r\n#define QMIWDS_START_NETWORK_INTERFACE_RESP   0x0020\r\n#define QMIWDS_STOP_NETWORK_INTERFACE_REQ     0x0021\r\n#define QMIWDS_STOP_NETWORK_INTERFACE_RESP    0x0021\r\n#define QMIWDS_GET_PKT_SRVC_STATUS_REQ        0x0022\r\n#define QMIWDS_GET_PKT_SRVC_STATUS_RESP       0x0022\r\n#define QMIWDS_GET_PKT_SRVC_STATUS_IND        0x0022\r\n#define QMIWDS_GET_CURRENT_CHANNEL_RATE_REQ   0x0023\r\n#define QMIWDS_GET_CURRENT_CHANNEL_RATE_RESP  0x0023\r\n#define QMIWDS_GET_PKT_STATISTICS_REQ         0x0024\r\n#define QMIWDS_GET_PKT_STATISTICS_RESP        0x0024\r\n#define QMIWDS_CREATE_PROFILE_REQ             0x0027\r\n#define QMIWDS_CREATE_PROFILE_RESP            0x0027\r\n#define QMIWDS_MODIFY_PROFILE_SETTINGS_REQ    0x0028\r\n#define QMIWDS_MODIFY_PROFILE_SETTINGS_RESP   0x0028\r\n#define QMIWDS_GET_PROFILE_LIST_REQ           0x002A\r\n#define QMIWDS_GET_PROFILE_LIST_RESP          0x002A\r\n#define QMIWDS_GET_PROFILE_SETTINGS_REQ       0x002B\r\n#define QMIWDS_GET_PROFILE_SETTINGS_RESP      0x002B\r\n#define QMIWDS_GET_DEFAULT_SETTINGS_REQ       0x002C\r\n#define QMIWDS_GET_DEFAULT_SETTINGS_RESP      0x002C\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_REQ       0x002D\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_RESP      0x002D\r\n#define QMIWDS_GET_MIP_MODE_REQ               0x002F\r\n#define QMIWDS_GET_MIP_MODE_RESP              0x002F\r\n#define QMIWDS_GET_DATA_BEARER_REQ            0x0037\r\n#define QMIWDS_GET_DATA_BEARER_RESP           0x0037\r\n#define QMIWDS_DUN_CALL_INFO_REQ              0x0038\r\n#define QMIWDS_DUN_CALL_INFO_RESP             0x0038\r\n#define QMIWDS_DUN_CALL_INFO_IND              0x0038\r\n#define QMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ  0x004D\r\n#define QMIWDS_SET_CLIENT_IP_FAMILY_PREF_RESP 0x004D\r\n#define QMIWDS_SET_AUTO_CONNECT_REQ     0x0051\r\n#define QMIWDS_SET_AUTO_CONNECT_RESP     0x0051\r\n#define QMIWDS_BIND_MUX_DATA_PORT_REQ         0x00A2\r\n#define QMIWDS_BIND_MUX_DATA_PORT_RESP        0x00A2\r\n\r\n\r\n// Stats masks\r\n#define QWDS_STAT_MASK_TX_PKT_OK 0x00000001\r\n#define QWDS_STAT_MASK_RX_PKT_OK 0x00000002\r\n#define QWDS_STAT_MASK_TX_PKT_ER 0x00000004\r\n#define QWDS_STAT_MASK_RX_PKT_ER 0x00000008\r\n#define QWDS_STAT_MASK_TX_PKT_OF 0x00000010\r\n#define QWDS_STAT_MASK_RX_PKT_OF 0x00000020\r\n\r\n// TLV Types for xfer statistics\r\n#define TLV_WDS_TX_GOOD_PKTS      0x10\r\n#define TLV_WDS_RX_GOOD_PKTS      0x11\r\n#define TLV_WDS_TX_ERROR          0x12\r\n#define TLV_WDS_RX_ERROR          0x13\r\n#define TLV_WDS_TX_OVERFLOW       0x14\r\n#define TLV_WDS_RX_OVERFLOW       0x15\r\n#define TLV_WDS_CHANNEL_RATE      0x16\r\n#define TLV_WDS_DATA_BEARER       0x17\r\n#define TLV_WDS_DORMANCY_STATUS   0x18\r\n\r\n#define QWDS_PKT_DATA_UNKNOW    0x00\r\n#define QWDS_PKT_DATA_DISCONNECTED    0x01\r\n#define QWDS_PKT_DATA_CONNECTED        0x02\r\n#define QWDS_PKT_DATA_SUSPENDED        0x03\r\n#define QWDS_PKT_DATA_AUTHENTICATING   0x04\r\n\r\n#define QMIWDS_ADMIN_SET_DATA_FORMAT_REQ      0x0020\r\n#define QMIWDS_ADMIN_SET_DATA_FORMAT_RESP     0x0020\r\n#define QMIWDS_ADMIN_GET_DATA_FORMAT_REQ      0x0021\r\n#define QMIWDS_ADMIN_GET_DATA_FORMAT_RESP     0x0021\r\n#define QMIWDS_ADMIN_SET_QMAP_SETTINGS_REQ    0x002B\r\n#define QMIWDS_ADMIN_SET_QMAP_SETTINGS_RESP   0x002B\r\n#define QMIWDS_ADMIN_GET_QMAP_SETTINGS_REQ    0x002C\r\n#define QMIWDS_ADMIN_GET_QMAP_SETTINGS_RESP   0x002C\r\n#define QMI_WDA_SET_LOOPBACK_CONFIG_REQ       0x002F\r\n#define QMI_WDA_SET_LOOPBACK_CONFIG_RESP      0x002F\r\n#define QMI_WDA_SET_LOOPBACK_CONFIG_IND       0x002F\r\n\r\n#define NETWORK_DESC_ENCODING_OCTET       0x00\r\n#define NETWORK_DESC_ENCODING_EXTPROTOCOL 0x01\r\n#define NETWORK_DESC_ENCODING_7BITASCII   0x02\r\n#define NETWORK_DESC_ENCODING_IA5         0x03\r\n#define NETWORK_DESC_ENCODING_UNICODE     0x04\r\n#define NETWORK_DESC_ENCODING_SHIFTJIS    0x05\r\n#define NETWORK_DESC_ENCODING_KOREAN      0x06\r\n#define NETWORK_DESC_ENCODING_LATINH      0x07\r\n#define NETWORK_DESC_ENCODING_LATIN       0x08\r\n#define NETWORK_DESC_ENCODING_GSM7BIT     0x09\r\n#define NETWORK_DESC_ENCODING_GSMDATA     0x0A\r\n#define NETWORK_DESC_ENCODING_UNKNOWN     0xFF\r\n\r\ntypedef struct _QMIWDS_ADMIN_SET_DATA_FORMAT\r\n{\r\n   USHORT Type;             // QMUX type 0x0000\r\n   USHORT Length;\r\n} __attribute__ ((packed)) QMIWDS_ADMIN_SET_DATA_FORMAT, *PQMIWDS_ADMIN_SET_DATA_FORMAT;\r\n\r\ntypedef struct _QMIWDS_ADMIN_SET_DATA_FORMAT_TLV_QOS\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  QOSSetting;\r\n} __attribute__ ((packed)) QMIWDS_ADMIN_SET_DATA_FORMAT_TLV_QOS, *PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV_QOS;\r\n\r\ntypedef struct _QMIWDS_ADMIN_SET_DATA_FORMAT_TLV\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   ULONG  Value;\r\n} __attribute__ ((packed)) QMIWDS_ADMIN_SET_DATA_FORMAT_TLV, *PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV;\r\n\r\ntypedef struct _QMIWDS_ENDPOINT_TLV\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   ULONG  ep_type;\r\n   ULONG  iface_id;\r\n} __attribute__ ((packed)) QMIWDS_ENDPOINT_TLV, *PQMIWDS_ENDPOINT_TLV;\r\n\r\ntypedef struct _QMIWDS_ADMIN_SET_DATA_FORMAT_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV_QOS QosDataFormatTlv;\r\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV UnderlyingLinkLayerProtocolTlv;\r\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV UplinkDataAggregationProtocolTlv;\r\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV DownlinkDataAggregationProtocolTlv;\r\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV DownlinkDataAggregationMaxDatagramsTlv;\r\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV DownlinkDataAggregationMaxSizeTlv;\r\n    QMIWDS_ENDPOINT_TLV epTlv;\r\n#ifdef QUECTEL_UL_DATA_AGG\r\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV DlMinimumPassingTlv;\r\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV UplinkDataAggregationMaxDatagramsTlv;\r\n    QMIWDS_ADMIN_SET_DATA_FORMAT_TLV UplinkDataAggregationMaxSizeTlv;\r\n#endif\t\r\n} __attribute__ ((packed)) QMIWDS_ADMIN_SET_DATA_FORMAT_REQ_MSG, *PQMIWDS_ADMIN_SET_DATA_FORMAT_REQ_MSG;\r\n\r\ntypedef struct _QMI_U8_TLV\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  TLVVaule;\r\n} __attribute__ ((packed)) QMI_U8_TLV, *PQMI_U8_TLV;\r\n\r\ntypedef struct _QMI_U32_TLV\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   ULONG  TLVVaule;\r\n} __attribute__ ((packed)) QMI_U32_TLV, *PQMI_U32_TLV;\r\n\r\ntypedef struct _QMI_WDA_SET_LOOPBACK_CONFIG_REQ_MSG {\r\n\tUSHORT Type;\r\n\tUSHORT Length;\r\n\tQMI_U8_TLV loopback_state; //0x01\r\n\tQMI_U32_TLV replication_factor; //0x10\r\n} __attribute__ ((packed)) QMI_WDA_SET_LOOPBACK_CONFIG_REQ_MSG, *PQMI_WDA_SET_LOOPBACK_CONFIG_REQ_MSG;\r\n\r\ntypedef struct _QMI_WDA_SET_LOOPBACK_CONFIG_IND_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   QMI_U8_TLV loopback_state; //0x01\r\n   QMI_U32_TLV replication_factor; //0x10\r\n} __attribute__ ((packed)) QMI_WDA_SET_LOOPBACK_CONFIG_IND_MSG, *PQMI_WDA_SET_LOOPBACK_CONFIG_IND_MSG;\r\n\r\n#if 0\r\ntypedef enum _QMI_RETURN_CODES {\r\n   QMI_SUCCESS = 0,\r\n   QMI_SUCCESS_NOT_COMPLETE,\r\n   QMI_FAILURE\r\n}QMI_RETURN_CODES;\r\n\r\ntypedef struct _QMIWDS_GET_PKT_SRVC_STATUS_REQ_MSG\r\n{\r\n   USHORT Type;    // 0x0022\r\n   USHORT Length;  // 0x0000\r\n} QMIWDS_GET_PKT_SRVC_STATUS_REQ_MSG, *PQMIWDS_GET_PKT_SRVC_STATUS_REQ_MSG;\r\n\r\ntypedef struct _QMIWDS_GET_PKT_SRVC_STATUS_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n   UCHAR  TLVType2;\r\n   USHORT TLVLength2;\r\n   UCHAR  ConnectionStatus; // 0x01: QWDS_PKT_DATAC_DISCONNECTED\r\n                            // 0x02: QWDS_PKT_DATA_CONNECTED\r\n                            // 0x03: QWDS_PKT_DATA_SUSPENDED\r\n                            // 0x04: QWDS_PKT_DATA_AUTHENTICATING\r\n} QMIWDS_GET_PKT_SRVC_STATUS_RESP_MSG, *PQMIWDS_GET_PKT_SRVC_STATUS_RESP_MSG;\r\n\r\ntypedef struct _QMIWDS_GET_PKT_SRVC_STATUS_IND_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  ConnectionStatus; // 0x01: QWDS_PKT_DATAC_DISCONNECTED\r\n                            // 0x02: QWDS_PKT_DATA_CONNECTED\r\n                            // 0x03: QWDS_PKT_DATA_SUSPENDED\r\n   UCHAR  ReconfigRequired; // 0x00: No need to reconfigure\r\n                            // 0x01: Reconfiguration required\r\n} QMIWDS_GET_PKT_SRVC_STATUS_IND_MSG, *PQMIWDS_GET_PKT_SRVC_STATUS_IND_MSG;\r\n\r\ntypedef struct _WDS_PKT_SRVC_IP_FAMILY_TLV\r\n{\r\n   UCHAR  TLVType;     // 0x12\r\n   USHORT TLVLength;   // 1\r\n   UCHAR  IpFamily;    // IPV4-0x04, IPV6-0x06\r\n} WDS_PKT_SRVC_IP_FAMILY_TLV, *PWDS_PKT_SRVC_IP_FAMILY_TLV;\r\n\r\ntypedef struct _QMIWDS_DUN_CALL_INFO_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   ULONG  Mask;\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   UCHAR  ReportConnectionStatus;\r\n} QMIWDS_DUN_CALL_INFO_REQ_MSG, *PQMIWDS_DUN_CALL_INFO_REQ_MSG;\r\n\r\ntypedef struct _QMIWDS_DUN_CALL_INFO_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n} QMIWDS_DUN_CALL_INFO_RESP_MSG, *PQMIWDS_DUN_CALL_INFO_RESP_MSG;\r\n\r\ntypedef struct _QMIWDS_DUN_CALL_INFO_IND_MSG\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  ConnectionStatus;\r\n} QMIWDS_DUN_CALL_INFO_IND_MSG, *PQMIWDS_DUN_CALL_INFO_IND_MSG;\r\n\r\ntypedef struct _QMIWDS_GET_CURRENT_CHANNEL_RATE_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0040\r\n   USHORT Length;\r\n} QMIWDS_GET_CURRENT_CHANNEL_RATE_REQ_MSG, *PQMIWDS_GET_CURRENT_CHANNEL_RATE_REQ_MSG;\r\n\r\ntypedef struct _QMIWDS_GET_CURRENT_CHANNEL_RATE_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0040\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n\r\n   UCHAR  TLV2Type;         // 0x01\r\n   USHORT TLV2Length;       // 16\r\n   //ULONG  CallHandle;       // Context corresponding to reported channel\r\n   ULONG  CurrentTxRate;       // bps\r\n   ULONG  CurrentRxRate;       // bps\r\n   ULONG  ServingSystemTxRate; // bps\r\n   ULONG  ServingSystemRxRate; // bps\r\n\r\n} QMIWDS_GET_CURRENT_CHANNEL_RATE_RESP_MSG, *PQMIWDS_GET_CURRENT_CHANNEL_RATE_RESP;\r\n\r\n#define QWDS_EVENT_REPORT_MASK_RATES 0x01\r\n#define QWDS_EVENT_REPORT_MASK_STATS 0x02\r\n\r\n#ifdef QCUSB_MUX_PROTOCOL\r\n#error code not present\r\n#endif // QCUSB_MUX_PROTOCOL\r\n\r\ntypedef struct _QMIWDS_SET_EVENT_REPORT_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0042\r\n   USHORT Length;\r\n\r\n   UCHAR  TLVType;          // 0x10 -- current channel rate indicator\r\n   USHORT TLVLength;        // 1\r\n   UCHAR  Mode;             // 0-do not report; 1-report when rate changes\r\n\r\n   UCHAR  TLV2Type;         // 0x11\r\n   USHORT TLV2Length;       // 5\r\n   UCHAR  StatsPeriod;      // seconds between reports; 0-do not report\r\n   ULONG  StatsMask;        //\r\n\r\n   UCHAR  TLV3Type;          // 0x12 -- current data bearer indicator\r\n   USHORT TLV3Length;        // 1\r\n   UCHAR  Mode3;             // 0-do not report; 1-report when changes\r\n\r\n   UCHAR  TLV4Type;          // 0x13 -- dormancy status indicator\r\n   USHORT TLV4Length;        // 1\r\n   UCHAR  DormancyStatus;    // 0-do not report; 1-report when changes\r\n} QMIWDS_SET_EVENT_REPORT_REQ_MSG, *PQMIWDS_SET_EVENT_REPORT_REQ_MSG;\r\n\r\ntypedef struct _QMIWDS_SET_EVENT_REPORT_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0042\r\n   USHORT Length;\r\n\r\n   UCHAR  TLVType;          // 0x02 result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_NO_BATTERY\r\n                            // QMI_ERR_FAULT\r\n} QMIWDS_SET_EVENT_REPORT_RESP_MSG, *PQMIWDS_SET_EVENT_REPORT_RESP_MSG;\r\n\r\ntypedef struct _QMIWDS_EVENT_REPORT_IND_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0001\r\n   USHORT Length;\r\n} QMIWDS_EVENT_REPORT_IND_MSG, *PQMIWDS_EVENT_REPORT_IND_MSG;\r\n\r\n// PQCTLV_PKT_STATISTICS\r\n\r\ntypedef struct _QMIWDS_EVENT_REPORT_IND_CHAN_RATE_TLV\r\n{\r\n   UCHAR  Type;\r\n   USHORT Length;  // 8\r\n   ULONG  TxRate;\r\n   ULONG  RxRate;\r\n} QMIWDS_EVENT_REPORT_IND_CHAN_RATE_TLV, *PQMIWDS_EVENT_REPORT_IND_CHAN_RATE_TLV;\r\n\r\n#ifdef QCUSB_MUX_PROTOCOL\r\n#error code not present\r\n#endif // QCUSB_MUX_PROTOCOL\r\n\r\ntypedef struct _QMIWDS_GET_PKT_STATISTICS_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0041\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x01\r\n   USHORT TLVLength;        // 4\r\n   ULONG  StateMask;        // 0x00000001  tx success packets\r\n                            // 0x00000002  rx success packets\r\n                            // 0x00000004  rx packet errors (checksum)\r\n                            // 0x00000008  rx packets dropped (memory)\r\n\r\n} QMIWDS_GET_PKT_STATISTICS_REQ_MSG, *PQMIWDS_GET_PKT_STATISTICS_REQ_MSG;\r\n\r\ntypedef struct _QMIWDS_GET_PKT_STATISTICS_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0041\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n} QMIWDS_GET_PKT_STATISTICS_RESP_MSG, *PQMIWDS_GET_PKT_STATISTICS_RESP_MSG;\r\n\r\n// optional TLV for stats\r\ntypedef struct _QCTLV_PKT_STATISTICS\r\n{\r\n   UCHAR  TLVType;          // see above definitions for TLV types\r\n   USHORT TLVLength;        // 4\r\n   ULONG  Count;\r\n} QCTLV_PKT_STATISTICS, *PQCTLV_PKT_STATISTICS;\r\n#endif\r\n\r\n//#ifdef QC_IP_MODE\r\n\r\n/*\r\n    \\E2\\80?Bit 0 \\E2\\80?Profile identifier\r\n    \\E2\\80?Bit 1 \\E2\\80?Profile name\r\n    \\E2\\80?Bit 2 \\E2\\80?PDP type\r\n    \\E2\\80?Bit 3 \\E2\\80?APN name\r\n    \\E2\\80?Bit 4 \\E2\\80?DNS address\r\n    \\E2\\80?Bit 5 \\E2\\80?UMTS/GPRS granted QoS\r\n    \\E2\\80?Bit 6 \\E2\\80?Username\r\n    \\E2\\80?Bit 7 \\E2\\80?Authentication Protocol\r\n    \\E2\\80?Bit 8 \\E2\\80?IP address\r\n    \\E2\\80?Bit 9 \\E2\\80?Gateway information (address and subnet mask)\r\n    \\E2\\80?Bit 10 \\E2\\80?PCSCF address using a PCO flag\r\n    \\E2\\80?Bit 11 \\E2\\80?PCSCF server address list\r\n    \\E2\\80?Bit 12 \\E2\\80?PCSCF domain name list\r\n    \\E2\\80?Bit 13 \\E2\\80?MTU\r\n    \\E2\\80?Bit 14 \\E2\\80?Domain name list\r\n    \\E2\\80?Bit 15 \\E2\\80?IP family\r\n    \\E2\\80?Bit 16 \\E2\\80?IM_CM flag\r\n    \\E2\\80?Bit 17 \\E2\\80?Technology name\r\n    \\E2\\80?Bit 18 \\E2\\80?Operator reserved PCO\r\n*/\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_MASK_IPV4DNS_ADDR       (1 << 4)\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_MASK_IPV4_ADDR          (1 << 8)\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_MASK_IPV4GATEWAY_ADDR   (1 << 9)\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_MASK_MTU                (1 << 13)\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_MASK_PCSCF_SV_ADDR      (1 << 11)\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_MASK_PCSCF_DOM_NAME     (1 << 14)\r\n\r\ntypedef struct _QMIWDS_GET_RUNTIME_SETTINGS_REQ_MSG\r\n{\r\n   USHORT Type;            // QMIWDS_GET_RUNTIME_SETTINGS_REQ\r\n   USHORT Length;\r\n   UCHAR  TLVType;         // 0x10\r\n   USHORT TLVLength;       // 0x0004\r\n   ULONG  Mask;            // mask, bit 8: IP addr -- 0x0100\r\n} __attribute__ ((packed)) QMIWDS_GET_RUNTIME_SETTINGS_REQ_MSG, *PQMIWDS_GET_RUNTIME_SETTINGS_REQ_MSG;\r\n\r\ntypedef struct _QMIWDS_BIND_MUX_DATA_PORT_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   ULONG  ep_type;\r\n   ULONG  iface_id;\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   UCHAR  MuxId;\r\n   UCHAR  TLV3Type;\r\n   USHORT TLV3Length;\r\n   ULONG  client_type;\r\n} __attribute__ ((packed)) QMIWDS_BIND_MUX_DATA_PORT_REQ_MSG, *PQMIWDS_BIND_MUX_DATA_PORT_REQ_MSG;\r\n\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4PRIMARYDNS 0x15\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4SECONDARYDNS 0x16\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4 0x1E\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4GATEWAY 0x20\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4SUBNET 0x21\r\n\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6             0x25\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6GATEWAY      0x26\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6PRIMARYDNS   0x27\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6SECONDARYDNS 0x28\r\n#define QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_MTU              0x29\r\n\r\ntypedef struct _QMIWDS_GET_RUNTIME_SETTINGS_TLV_MTU\r\n{\r\n   UCHAR  TLVType;         // QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_MTU\r\n   USHORT TLVLength;       // 4\r\n   ULONG  Mtu;             // MTU\r\n} __attribute__ ((packed)) QMIWDS_GET_RUNTIME_SETTINGS_TLV_MTU, *PQMIWDS_GET_RUNTIME_SETTINGS_TLV_MTU;\r\n\r\ntypedef struct _QMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR\r\n{\r\n   UCHAR  TLVType;         // QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4\r\n   USHORT TLVLength;       // 4\r\n   ULONG  IPV4Address;     // address\r\n} __attribute__ ((packed)) QMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR, *PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR;\r\n\r\ntypedef struct _QMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV6_ADDR\r\n{\r\n   UCHAR  TLVType;         // QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6\r\n   USHORT TLVLength;       // 16\r\n   UCHAR  IPV6Address[16]; // address\r\n   UCHAR  PrefixLength;    // prefix length\r\n} __attribute__ ((packed)) QMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV6_ADDR, *PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV6_ADDR;\r\n\r\ntypedef struct _QMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV6_ADDR\r\n{\r\n\tUCHAR TLVType;\r\n\tUSHORT TLVLength;\r\n\tUCHAR PCSCFNumber;\r\n} __attribute__ ((packed)) QMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV6_ADDR, *PQMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV6_ADDR;\r\n\r\ntypedef struct _QMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV4_ADDR\r\n{\r\n\tUCHAR TLVType;\r\n\tUSHORT TLVLength;\r\n\tUCHAR PCSCFNumber;\r\n} __attribute__ ((packed)) QMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV4_ADDR, *PQMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV4_ADDR;\r\n\r\ntypedef struct _QMIWDS_GET_RUNTIME_SETTINGS_RESP_MSG\r\n{\r\n   USHORT Type;            // QMIWDS_GET_RUNTIME_SETTINGS_RESP\r\n   USHORT Length;\r\n   UCHAR  TLVType;         // QCTLV_TYPE_RESULT_CODE\r\n   USHORT TLVLength;       // 0x0004\r\n   USHORT QMUXResult;      // result code\r\n   USHORT QMUXError;       // error code\r\n} __attribute__ ((packed)) QMIWDS_GET_RUNTIME_SETTINGS_RESP_MSG, *PQMIWDS_GET_RUNTIME_SETTINGS_RESP_MSG;\r\n\r\n//#endif // QC_IP_MODE\r\n\r\ntypedef struct _QMIWDS_IP_FAMILY_TLV\r\n{\r\n   UCHAR  TLVType;          // 0x12\r\n   USHORT TLVLength;        // 1\r\n   UCHAR  IpFamily;         // IPV4-0x04, IPV6-0x06\r\n} __attribute__ ((packed)) QMIWDS_IP_FAMILY_TLV, *PQMIWDS_IP_FAMILY_TLV;\r\n\r\ntypedef struct _QMIWDS_PKT_SRVC_TLV\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  ConnectionStatus;\r\n   UCHAR  ReconfigReqd;\r\n} __attribute__ ((packed)) QMIWDS_PKT_SRVC_TLV, *PQMIWDS_PKT_SRVC_TLV;\r\n\r\ntypedef struct _QMIWDS_CALL_END_REASON_TLV\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT CallEndReason;\r\n} __attribute__ ((packed)) QMIWDS_CALL_END_REASON_TLV, *PQMIWDS_CALL_END_REASON_TLV;\r\n\r\ntypedef struct _QMIWDS_CALL_END_REASON_V_TLV\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT CallEndReasonType;\r\n   USHORT CallEndReason;\r\n} __attribute__ ((packed)) QMIWDS_CALL_END_REASON_V_TLV, *PQMIWDS_CALL_END_REASON_V_TLV;\r\n\r\ntypedef struct _QMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x004D\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x01\r\n   USHORT TLVLength;        // 1\r\n   UCHAR  IpPreference;     // IPV4-0x04, IPV6-0x06\r\n} __attribute__ ((packed)) QMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ_MSG, *PQMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ_MSG;\r\n\r\ntypedef struct _QMIWDS_SET_CLIENT_IP_FAMILY_PREF_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0037\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS, QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INTERNAL, QMI_ERR_MALFORMED_MSG, QMI_ERR_INVALID_ARG\r\n} __attribute__ ((packed)) QMIWDS_SET_CLIENT_IP_FAMILY_PREF_RESP_MSG, *PQMIWDS_SET_CLIENT_IP_FAMILY_PREF_RESP_MSG;\r\n\r\ntypedef struct _QMIWDS_SET_AUTO_CONNECT_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0051\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x01\r\n   USHORT TLVLength;        // 1\r\n   UCHAR  autoconnect_setting;     //  0x00 ?C Disabled, 0x01 ?C Enabled, 0x02 ?C Paused (resume on power cycle)\r\n} __attribute__ ((packed)) QMIWDS_SET_AUTO_CONNECT_REQ_MSG, *PQMIWDS_SET_AUTO_CONNECT_REQ_MSG;\r\n\r\n#if 0\r\ntypedef struct _QMIWDS_GET_MIP_MODE_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0040\r\n   USHORT Length;\r\n} QMIWDS_GET_MIP_MODE_REQ_MSG, *PQMIWDS_GET_MIP_MODE_REQ_MSG;\r\n\r\ntypedef struct _QMIWDS_GET_MIP_MODE_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0040\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n\r\n   UCHAR  TLV2Type;         // 0x01\r\n   USHORT TLV2Length;       // 20\r\n   UCHAR  MipMode;          //\r\n} QMIWDS_GET_MIP_MODE_RESP_MSG, *PQMIWDS_GET_MIP_MODE_RESP_MSG;\r\n#endif\r\n\r\ntypedef struct _QMIWDS_TECHNOLOGY_PREFERECE\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  TechPreference;\r\n} __attribute__ ((packed)) QMIWDS_TECHNOLOGY_PREFERECE, *PQMIWDS_TECHNOLOGY_PREFERECE;\r\n\r\ntypedef struct _QMIWDS_PROFILE_IDENTIFIER\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  ProfileIndex;\r\n} __attribute__ ((packed)) QMIWDS_PROFILE_IDENTIFIER, *PQMIWDS_PROFILE_IDENTIFIER;\r\n\r\ntypedef struct _QMIWDS_BRINGUP_APNTYPE\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   BOOL  bring_up_by_apn_type;\r\n} __attribute__ ((packed)) QMIWDS_BRINGUP_APNTYPE, *PQMIWDS_BRINGUP_APNTYPE;\r\n\r\n\r\ntypedef struct _QMIWDS_BRINGUP_APNNAME\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   BOOL  bring_up_by_apn_name;\r\n} __attribute__ ((packed)) QMIWDS_BRINGUP_APNNAME, *PQMIWDS_BRINGUP_APNNAME;\r\n\r\ntypedef struct _PQMIWDS_APN_TYPE\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   int    apn_type;\r\n} __attribute__ ((packed)) QMIWDS_APN_TYPE, *PQMIWDS_APN_TYPE;\r\n\r\n#if 0\r\ntypedef struct _QMIWDS_IPADDRESS\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   ULONG  IPv4Address;\r\n}QMIWDS_IPADDRESS, *PQMIWDS_IPADDRESS;\r\n\r\n/*\r\ntypedef struct _QMIWDS_UMTS_QOS\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  TrafficClass;\r\n   ULONG  MaxUplinkBitRate;\r\n   ULONG  MaxDownlinkBitRate;\r\n   ULONG  GuarUplinkBitRate;\r\n   ULONG  GuarDownlinkBitRate;\r\n   UCHAR  QOSDevOrder;\r\n   ULONG  MAXSDUSize;\r\n   UCHAR  SDUErrorRatio;\r\n   UCHAR  ResidualBerRatio;\r\n   UCHAR  DeliveryErrorSDUs;\r\n   ULONG  TransferDelay;\r\n   ULONG  TrafficHndPri;\r\n}QMIWDS_UMTS_QOS, *PQMIWDS_UMTS_QOS;\r\n\r\ntypedef struct _QMIWDS_GPRS_QOS\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   ULONG  PrecedenceClass;\r\n   ULONG  DelayClass;\r\n   ULONG  ReliabilityClass;\r\n   ULONG  PeekThroClass;\r\n   ULONG  MeanThroClass;\r\n}QMIWDS_GPRS_QOS, *PQMIWDS_GPRS_QOS;\r\n*/\r\n#endif\r\n\r\ntypedef struct _QMIWDS_PDPCONTEXT\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  pdp_context;\r\n} __attribute__ ((packed)) QMIWDS_PDPCONTEXT, *PQMIWDS_PDPCONTEXT;\r\n\r\ntypedef struct _QMIWDS_PROFILELIST\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  ProfileList[1024];\r\n} __attribute__ ((packed)) QMIWDS_PROFILELIST, *PQMIWDS_PROFILELIST;\r\n\r\ntypedef struct _QMIWDS_PROFILENAME\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  ProfileName;\r\n} __attribute__ ((packed)) QMIWDS_PROFILENAME, *PQMIWDS_PROFILENAME;\r\n\r\ntypedef struct _QMIWDS_PDPTYPE\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n// 0 ?C PDP-IP (IPv4)\r\n// 1 ?C PDP-PPP\r\n// 2 ?C PDP-IPv6\r\n// 3 ?C PDP-IPv4v6\r\n    UCHAR  PdpType;\r\n} __attribute__ ((packed)) QMIWDS_PDPTYPE, *PQMIWDS_PDPTYPE;\r\n\r\ntypedef struct _QMIWDS_USERNAME\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  UserName;\r\n} __attribute__ ((packed)) QMIWDS_USERNAME, *PQMIWDS_USERNAME;\r\n\r\ntypedef struct _QMIWDS_PD\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  Pd;\r\n} __attribute__ ((packed)) QMIWDS_PD, *PQMIWDS_PD;\r\n\r\ntypedef struct _QMIWDS_AUTH_PREFERENCE\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  AuthPreference;\r\n} __attribute__ ((packed)) QMIWDS_AUTH_PREFERENCE, *PQMIWDS_AUTH_PREFERENCE;\r\n\r\ntypedef struct _QMIWDS_IPTYPE\r\n{\r\n    UCHAR TLVType;\r\n    USHORT TLVLength;\r\n    UCHAR IPType;\r\n} __attribute__ ((packed)) QMIWDS_IPTYPE, *PQMIWDS_IPTYPE;\r\n\r\ntypedef struct _QMIWDS_APNNAME\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  ApnName;\r\n} __attribute__ ((packed)) QMIWDS_APNNAME, *PQMIWDS_APNNAME;\r\n\r\ntypedef struct _QMIWDS_AUTOCONNECT\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  AutoConnect;\r\n} __attribute__ ((packed)) QMIWDS_AUTOCONNECT, *PQMIWDS_AUTOCONNECT;\r\n\r\ntypedef struct _QMIWDS_START_NETWORK_INTERFACE_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n} __attribute__ ((packed)) QMIWDS_START_NETWORK_INTERFACE_REQ_MSG, *PQMIWDS_START_NETWORK_INTERFACE_REQ_MSG;\r\n\r\ntypedef struct _QMIWDS_CALLENDREASON\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT Reason;\r\n}__attribute__ ((packed)) QMIWDS_CALLENDREASON, *PQMIWDS_CALLENDREASON;\r\n\r\ntypedef struct _QMIWDS_START_NETWORK_INTERFACE_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0040\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n\r\n   UCHAR  TLV2Type;         // 0x01\r\n   USHORT TLV2Length;       // 20\r\n   ULONG  Handle;          //\r\n} __attribute__ ((packed)) QMIWDS_START_NETWORK_INTERFACE_RESP_MSG, *PQMIWDS_START_NETWORK_INTERFACE_RESP_MSG;\r\n\r\ntypedef struct _QMIWDS_STOP_NETWORK_INTERFACE_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   ULONG  Handle;\r\n} __attribute__ ((packed)) QMIWDS_STOP_NETWORK_INTERFACE_REQ_MSG, *PQMIWDS_STOP_NETWORK_INTERFACE_REQ_MSG;\r\n\r\ntypedef struct _QMIWDS_STOP_NETWORK_INTERFACE_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0040\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n\r\n} __attribute__ ((packed)) QMIWDS_STOP_NETWORK_INTERFACE_RESP_MSG, *PQMIWDS_STOP_NETWORK_INTERFACE_RESP_MSG;\r\n\r\ntypedef struct _QMIWDS_GET_DEFAULT_SETTINGS_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  ProfileType;\r\n} __attribute__ ((packed)) QMIWDS_GET_DEFAULT_SETTINGS_REQ_MSG, *PQMIWDS_GET_DEFAULT_SETTINGS_REQ_MSG;\r\n\r\ntypedef struct _QMIWDS_GET_DEFAULT_SETTINGS_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n} __attribute__ ((packed)) QMIWDS_GET_DEFAULT_SETTINGS_RESP_MSG, *PQMIWDS_GET_DEFAULT_SETTINGS_RESP_MSG;\r\n\r\ntypedef struct _QMIWDS_MODIFY_PROFILE_SETTINGS_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  ProfileType;\r\n   UCHAR  ProfileIndex;\r\n} __attribute__ ((packed)) QMIWDS_MODIFY_PROFILE_SETTINGS_REQ_MSG, *PQMIWDS_MODIFY_PROFILE_SETTINGS_REQ_MSG;\r\n\r\ntypedef struct _QMIWDS_MODIFY_PROFILE_SETTINGS_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n} __attribute__ ((packed)) QMIWDS_MODIFY_PROFILE_SETTINGS_RESP_MSG, *PQMIWDS_MODIFY_PROFILE_SETTINGS_RESP_MSG;\r\n\r\ntypedef struct _QMIWDS_GET_PROFILE_SETTINGS_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  ProfileType;\r\n   UCHAR  ProfileIndex;\r\n} __attribute__ ((packed)) QMIWDS_GET_PROFILE_SETTINGS_REQ_MSG, *PQMIWDS_GET_PROFILE_SETTINGS_REQ_MSG;\r\n\r\ntypedef struct _QMIWDS_CREATE_PROFILE_SETTINGS_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  ProfileType;\r\n   UCHAR  TLV2Type; //0x25\r\n   USHORT TLV2Length;\r\n   UCHAR  pdp_context;\r\n} __attribute__ ((packed)) QMIWDS_CREATE_PROFILE_SETTINGS_REQ_MSG, *PQMIWDS_CREATE_PROFILE_SETTINGS_REQ_MSG;\r\n\r\ntypedef struct _QMIWDS_GET_PROFILE_LIST_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n} __attribute__ ((packed)) QMIWDS_GET_PROFILE_LIST_REQ_MSG, *PQMIWDS_GET_PROFILE_LIST_REQ_MSG;\r\n\r\ntypedef struct _QMIWDS_GET_PROFILE_LIST_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  ProfileList[1024];\r\n} __attribute__ ((packed)) QMIWDS_GET_PROFILE_LIST_RESP_MSG, *PQMIWDS_GET_PROFILE_LIST_RESP_MSG;\r\n\r\n#if 0\r\ntypedef struct _QMIWDS_EVENT_REPORT_IND_DATA_BEARER_TLV\r\n{\r\n   UCHAR  Type;\r\n   USHORT Length;\r\n   UCHAR  DataBearer;\r\n} QMIWDS_EVENT_REPORT_IND_DATA_BEARER_TLV, *PQMIWDS_EVENT_REPORT_IND_DATA_BEARER_TLV;\r\n\r\ntypedef struct _QMIWDS_EVENT_REPORT_IND_DORMANCY_STATUS_TLV\r\n{\r\n   UCHAR  Type;\r\n   USHORT Length;\r\n   UCHAR  DormancyStatus;\r\n} QMIWDS_EVENT_REPORT_IND_DORMANCY_STATUS_TLV, *PQMIWDS_EVENT_REPORT_IND_DORMANCY_STATUS_TLV;\r\n\r\n\r\ntypedef struct _QMIWDS_GET_DATA_BEARER_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0037\r\n   USHORT Length;\r\n} QMIWDS_GET_DATA_BEARER_REQ_MSG, *PQMIWDS_GET_DATA_BEARER_REQ_MSG;\r\n\r\ntypedef struct _QMIWDS_GET_DATA_BEARER_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0037\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_MALFORMED_MSG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_OUT_OF_CALL\r\n                            // QMI_ERR_INFO_UNAVAILABLE\r\n   UCHAR  TLV2Type;         // 0x01\r\n   USHORT TLV2Length;       //\r\n   UCHAR  Technology;       //\r\n} QMIWDS_GET_DATA_BEARER_RESP_MSG, *PQMIWDS_GET_DATA_BEARER_RESP_MSG;\r\n#endif\r\n\r\n// ======================= DMS ==============================\r\n#define QMIDMS_SET_EVENT_REPORT_REQ           0x0001\r\n#define QMIDMS_SET_EVENT_REPORT_RESP          0x0001\r\n#define QMIDMS_EVENT_REPORT_IND               0x0001\r\n#define QMIDMS_GET_DEVICE_CAP_REQ             0x0020\r\n#define QMIDMS_GET_DEVICE_CAP_RESP            0x0020\r\n#define QMIDMS_GET_DEVICE_MFR_REQ             0x0021\r\n#define QMIDMS_GET_DEVICE_MFR_RESP            0x0021\r\n#define QMIDMS_GET_DEVICE_MODEL_ID_REQ        0x0022\r\n#define QMIDMS_GET_DEVICE_MODEL_ID_RESP       0x0022\r\n#define QMIDMS_GET_DEVICE_REV_ID_REQ          0x0023\r\n#define QMIDMS_GET_DEVICE_REV_ID_RESP         0x0023\r\n#define QMIDMS_GET_MSISDN_REQ                 0x0024\r\n#define QMIDMS_GET_MSISDN_RESP                0x0024\r\n#define QMIDMS_GET_DEVICE_SERIAL_NUMBERS_REQ  0x0025\r\n#define QMIDMS_GET_DEVICE_SERIAL_NUMBERS_RESP 0x0025\r\n#define QMIDMS_UIM_SET_PIN_PROTECTION_REQ     0x0027\r\n#define QMIDMS_UIM_SET_PIN_PROTECTION_RESP    0x0027\r\n#define QMIDMS_UIM_VERIFY_PIN_REQ             0x0028\r\n#define QMIDMS_UIM_VERIFY_PIN_RESP            0x0028\r\n#define QMIDMS_UIM_UNBLOCK_PIN_REQ            0x0029\r\n#define QMIDMS_UIM_UNBLOCK_PIN_RESP           0x0029\r\n#define QMIDMS_UIM_CHANGE_PIN_REQ             0x002A\r\n#define QMIDMS_UIM_CHANGE_PIN_RESP            0x002A\r\n#define QMIDMS_UIM_GET_PIN_STATUS_REQ         0x002B\r\n#define QMIDMS_UIM_GET_PIN_STATUS_RESP        0x002B\r\n#define QMIDMS_GET_DEVICE_HARDWARE_REV_REQ    0x002C\r\n#define QMIDMS_GET_DEVICE_HARDWARE_REV_RESP   0x002C\r\n#define QMIDMS_GET_OPERATING_MODE_REQ         0x002D\r\n#define QMIDMS_GET_OPERATING_MODE_RESP        0x002D\r\n#define QMIDMS_SET_OPERATING_MODE_REQ         0x002E\r\n#define QMIDMS_SET_OPERATING_MODE_RESP        0x002E\r\n#define QMIDMS_GET_ACTIVATED_STATUS_REQ       0x0031\r\n#define QMIDMS_GET_ACTIVATED_STATUS_RESP      0x0031\r\n#define QMIDMS_ACTIVATE_AUTOMATIC_REQ         0x0032\r\n#define QMIDMS_ACTIVATE_AUTOMATIC_RESP        0x0032\r\n#define QMIDMS_ACTIVATE_MANUAL_REQ            0x0033\r\n#define QMIDMS_ACTIVATE_MANUAL_RESP           0x0033\r\n#define QMIDMS_UIM_GET_ICCID_REQ              0x003C\r\n#define QMIDMS_UIM_GET_ICCID_RESP             0x003C\r\n#define QMIDMS_UIM_GET_CK_STATUS_REQ          0x0040\r\n#define QMIDMS_UIM_GET_CK_STATUS_RESP         0x0040\r\n#define QMIDMS_UIM_SET_CK_PROTECTION_REQ      0x0041\r\n#define QMIDMS_UIM_SET_CK_PROTECTION_RESP     0x0041\r\n#define QMIDMS_UIM_UNBLOCK_CK_REQ             0x0042\r\n#define QMIDMS_UIM_UNBLOCK_CK_RESP            0x0042\r\n#define QMIDMS_UIM_GET_IMSI_REQ               0x0043\r\n#define QMIDMS_UIM_GET_IMSI_RESP              0x0043\r\n#define QMIDMS_UIM_GET_STATE_REQ              0x0044\r\n#define QMIDMS_UIM_GET_STATE_RESP             0x0044\r\n#define QMIDMS_GET_BAND_CAP_REQ               0x0045\r\n#define QMIDMS_GET_BAND_CAP_RESP              0x0045\r\n\r\n#if 0\r\ntypedef struct _QMIDMS_GET_DEVICE_MFR_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n} QMIDMS_GET_DEVICE_MFR_REQ_MSG, *PQMIDMS_GET_DEVICE_MFR_REQ_MSG;\r\n\r\ntypedef struct _QMIDMS_GET_DEVICE_MFR_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n   UCHAR  TLV2Type;         // 0x01 - required parameter\r\n   USHORT TLV2Length;       // length of the mfr string\r\n   UCHAR  DeviceManufacturer; // first byte of string\r\n} QMIDMS_GET_DEVICE_MFR_RESP_MSG, *PQMIDMS_GET_DEVICE_MFR_RESP_MSG;\r\n\r\ntypedef struct _QMIDMS_GET_DEVICE_MODEL_ID_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0004\r\n   USHORT Length;\r\n} QMIDMS_GET_DEVICE_MODEL_ID_REQ_MSG, *PQMIDMS_GET_DEVICE_MODEL_ID_REQ_MSG;\r\n\r\ntypedef struct _QMIDMS_GET_DEVICE_MODEL_ID_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0004\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n   UCHAR  TLV2Type;         // 0x01 - required parameter\r\n   USHORT TLV2Length;       // length of the modem id string\r\n   UCHAR  DeviceModelID;    // device model id\r\n} QMIDMS_GET_DEVICE_MODEL_ID_RESP_MSG, *PQMIDMS_GET_DEVICE_MODEL_ID_RESP_MSG;\r\n#endif\r\n\r\ntypedef struct _QMIDMS_GET_DEVICE_REV_ID_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0005\r\n   USHORT Length;\r\n} __attribute__ ((packed)) QMIDMS_GET_DEVICE_REV_ID_REQ_MSG, *PQMIDMS_GET_DEVICE_REV_ID_REQ_MSG;\r\n\r\ntypedef struct _DEVICE_REV_ID\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  RevisionID;\r\n} __attribute__ ((packed)) DEVICE_REV_ID, *PDEVICE_REV_ID;\r\n\r\n#if 0\r\ntypedef struct _QMIDMS_GET_DEVICE_REV_ID_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0023\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n} QMIDMS_GET_DEVICE_REV_ID_RESP_MSG, *PQMIDMS_GET_DEVICE_REV_ID_RESP_MSG;\r\n\r\ntypedef struct _QMIDMS_GET_MSISDN_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n} QMIDMS_GET_MSISDN_REQ_MSG, *PQMIDMS_GET_MSISDN_REQ_MSG;\r\n\r\ntypedef struct _QCTLV_DEVICE_VOICE_NUMBERS\r\n{\r\n   UCHAR  TLVType;            // as defined above\r\n   USHORT TLVLength;          // 4/7/7\r\n   UCHAR  VoideNumberString; // ESN, IMEI, or MEID\r\n\r\n} QCTLV_DEVICE_VOICE_NUMBERS, *PQCTLV_DEVICE_VOICE_NUMBERS;\r\n\r\n\r\ntypedef struct _QMIDMS_GET_MSISDN_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n} QMIDMS_GET_MSISDN_RESP_MSG, *PQMIDMS_GET_MSISDN_RESP_MSG;\r\n#endif\r\n\r\ntypedef struct _QMIDMS_UIM_GET_IMSI_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n} __attribute__ ((packed)) QMIDMS_UIM_GET_IMSI_REQ_MSG, *PQMIDMS_UIM_GET_IMSI_REQ_MSG;\r\n\r\ntypedef struct _QMIDMS_UIM_GET_IMSI_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   UCHAR IMSI;\r\n} __attribute__ ((packed)) QMIDMS_UIM_GET_IMSI_RESP_MSG, *PQMIDMS_UIM_GET_IMSI_RESP_MSG;\r\n\r\n#if 0\r\ntypedef struct _QMIDMS_GET_DEVICE_SERIAL_NUMBERS_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0007\r\n   USHORT Length;\r\n} QMIDMS_GET_DEVICE_SERIAL_NUMBERS_REQ_MSG, *PQMIDMS_GET_DEVICE_SERIAL_NUMBERS_REQ_MSG;\r\n\r\n#define QCTLV_TYPE_SER_NUM_ESN  0x10\r\n#define QCTLV_TYPE_SER_NUM_IMEI 0x11\r\n#define QCTLV_TYPE_SER_NUM_MEID 0x12\r\n\r\ntypedef struct _QCTLV_DEVICE_SERIAL_NUMBER\r\n{\r\n   UCHAR  TLVType;            // as defined above\r\n   USHORT TLVLength;          // 4/7/7\r\n   UCHAR  SerialNumberString; // ESN, IMEI, or MEID\r\n\r\n} QCTLV_DEVICE_SERIAL_NUMBER, *PQCTLV_DEVICE_SERIAL_NUMBER;\r\n\r\ntypedef struct _QMIDMS_GET_DEVICE_SERIAL_NUMBERS_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0007\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n  // followed by optional TLV\r\n} QMIDMS_GET_DEVICE_SERIAL_NUMBERS_RESP_MSG, *PQMIDMS_GET_DEVICE_SERIAL_NUMBERS_RESP;\r\n\r\ntypedef struct _QMIDMS_GET_DMS_BAND_CAP\r\n{\r\n   USHORT  Type;\r\n   USHORT  Length;\r\n} QMIDMS_GET_BAND_CAP_REQ_MSG, *PQMIDMS_GET_BAND_CAP_REQ_MSG;\r\n\r\ntypedef struct _QMIDMS_GET_BAND_CAP_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_NONE\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_MALFORMED_MSG\r\n                            // QMI_ERR_NO_MEMORY\r\n\r\n   UCHAR  TLV2Type;         // 0x01\r\n   USHORT TLV2Length;       // 2\r\n   ULONG64 BandCap;\r\n} QMIDMS_GET_BAND_CAP_RESP_MSG, *PQMIDMS_GET_BAND_CAP_RESP;\r\n\r\ntypedef struct _QMIDMS_GET_DEVICE_CAP_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0002\r\n   USHORT Length;\r\n} QMIDMS_GET_DEVICE_CAP_REQ_MSG, *PQMIDMS_GET_DEVICE_CAP_REQ_MSG;\r\n\r\ntypedef struct _QMIDMS_GET_DEVICE_CAP_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0002\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMUX_RESULT_SUCCESS\r\n                            // QMUX_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMUX_ERR_INVALID_ARG\r\n                            // QMUX_ERR_NO_MEMORY\r\n                            // QMUX_ERR_INTERNAL\r\n                            // QMUX_ERR_FAULT\r\n   UCHAR  TLV2Type;         // 0x01\r\n   USHORT TLV2Length;       // 2\r\n\r\n   ULONG  MaxTxChannelRate;\r\n   ULONG  MaxRxChannelRate;\r\n   UCHAR  VoiceCap;\r\n   UCHAR  SimCap;\r\n\r\n   UCHAR  RadioIfListCnt;   // #elements in radio interface list\r\n   UCHAR  RadioIfList;      // N 1-byte elements\r\n} QMIDMS_GET_DEVICE_CAP_RESP_MSG, *PQMIDMS_GET_DEVICE_CAP_RESP_MSG;\r\n\r\ntypedef struct _QMIDMS_GET_ACTIVATED_STATUS_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0002\r\n   USHORT Length;\r\n} QMIDMS_GET_ACTIVATED_STATUS_REQ_MSG, *PQMIDMS_GET_ACTIVATES_STATUD_REQ_MSG;\r\n\r\ntypedef struct _QMIDMS_GET_ACTIVATED_STATUS_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0002\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMUX_RESULT_SUCCESS\r\n                            // QMUX_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMUX_ERR_INVALID_ARG\r\n                            // QMUX_ERR_NO_MEMORY\r\n                            // QMUX_ERR_INTERNAL\r\n                            // QMUX_ERR_FAULT\r\n   UCHAR  TLV2Type;         // 0x01\r\n   USHORT TLV2Length;       // 2\r\n\r\n   USHORT ActivatedStatus;\r\n} QMIDMS_GET_ACTIVATED_STATUS_RESP_MSG, *PQMIDMS_GET_ACTIVATED_STATUS_RESP_MSG;\r\n\r\ntypedef struct _QMIDMS_GET_OPERATING_MODE_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0002\r\n   USHORT Length;\r\n} QMIDMS_GET_OPERATING_MODE_REQ_MSG, *PQMIDMS_GET_OPERATING_MODE_REQ_MSG;\r\n\r\ntypedef struct _OFFLINE_REASON\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT OfflineReason;\r\n} OFFLINE_REASON, *POFFLINE_REASON;\r\n\r\ntypedef struct _HARDWARE_RESTRICTED_MODE\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  HardwareControlledMode;\r\n} HARDWARE_RESTRICTED_MODE, *PHARDWARE_RESTRICTED_MODE;\r\n\r\ntypedef struct _QMIDMS_GET_OPERATING_MODE_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0002\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMUX_RESULT_SUCCESS\r\n                            // QMUX_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMUX_ERR_INVALID_ARG\r\n                            // QMUX_ERR_NO_MEMORY\r\n                            // QMUX_ERR_INTERNAL\r\n                            // QMUX_ERR_FAULT\r\n   UCHAR  TLV2Type;         // 0x01\r\n   USHORT TLV2Length;       // 2\r\n\r\n   UCHAR  OperatingMode;\r\n} QMIDMS_GET_OPERATING_MODE_RESP_MSG, *PQMIDMS_GET_OPERATING_MODE_RESP_MSG;\r\n\r\ntypedef struct _QMIDMS_UIM_GET_ICCID_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n} QMIDMS_UIM_GET_ICCID_REQ_MSG, *PQMIDMS_UIM_GET_ICCID_REQ_MSG;\r\n\r\ntypedef struct _QMIDMS_UIM_GET_ICCID_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n   UCHAR  TLV2Type;         // 0x01 - required parameter\r\n   USHORT TLV2Length;       // var\r\n   UCHAR  ICCID;      // String of voice number\r\n} QMIDMS_UIM_GET_ICCID_RESP_MSG, *PQMIDMS_UIM_GET_ICCID_RESP_MSG;\r\n#endif\r\n\r\ntypedef struct _QMIDMS_SET_OPERATING_MODE_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0002\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   UCHAR  OperatingMode;\r\n} __attribute__ ((packed)) QMIDMS_SET_OPERATING_MODE_REQ_MSG, *PQMIDMS_SET_OPERATING_MODE_REQ_MSG;\r\n\r\ntypedef struct _QMIDMS_SET_OPERATING_MODE_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0002\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMUX_RESULT_SUCCESS\r\n                            // QMUX_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMUX_ERR_INVALID_ARG\r\n                            // QMUX_ERR_NO_MEMORY\r\n                            // QMUX_ERR_INTERNAL\r\n                            // QMUX_ERR_FAULT\r\n} __attribute__ ((packed)) QMIDMS_SET_OPERATING_MODE_RESP_MSG, *PQMIDMS_SET_OPERATING_MODE_RESP_MSG;\r\n\r\n#if 0\r\ntypedef struct _QMIDMS_ACTIVATE_AUTOMATIC_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        //\r\n   UCHAR  ActivateCodelen;\r\n   UCHAR  ActivateCode;\r\n} QMIDMS_ACTIVATE_AUTOMATIC_REQ_MSG, *PQMIDMS_ACTIVATE_AUTOMATIC_REQ_MSG;\r\n\r\ntypedef struct _QMIDMS_ACTIVATE_AUTOMATIC_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n} QMIDMS_ACTIVATE_AUTOMATIC_RESP_MSG, *PQMIDMS_ACTIVATE_AUTOMATIC_RESP_MSG;\r\n\r\n\r\ntypedef struct _SPC_MSG\r\n{\r\n   UCHAR SPC[6];\r\n   USHORT SID;\r\n} SPC_MSG, *PSPC_MSG;\r\n\r\ntypedef struct _MDN_MSG\r\n{\r\n   UCHAR MDNLEN;\r\n   UCHAR MDN;\r\n} MDN_MSG, *PMDN_MSG;\r\n\r\ntypedef struct _MIN_MSG\r\n{\r\n   UCHAR MINLEN;\r\n   UCHAR MIN;\r\n} MIN_MSG, *PMIN_MSG;\r\n\r\ntypedef struct _PRL_MSG\r\n{\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        //\r\n   USHORT PRLLEN;\r\n   UCHAR PRL;\r\n} PRL_MSG, *PPRL_MSG;\r\n\r\ntypedef struct _MN_HA_KEY_MSG\r\n{\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        //\r\n   UCHAR MN_HA_KEY_LEN;\r\n   UCHAR MN_HA_KEY;\r\n} MN_HA_KEY_MSG, *PMN_HA_KEY_MSG;\r\n\r\ntypedef struct _MN_AAA_KEY_MSG\r\n{\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        //\r\n   UCHAR MN_AAA_KEY_LEN;\r\n   UCHAR MN_AAA_KEY;\r\n} MN_AAA_KEY_MSG, *PMN_AAA_KEY_MSG;\r\n\r\ntypedef struct _QMIDMS_ACTIVATE_MANUAL_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        //\r\n   UCHAR  Value;\r\n} QMIDMS_ACTIVATE_MANUAL_REQ_MSG, *PQMIDMS_ACTIVATE_MANUAL_REQ_MSG;\r\n\r\ntypedef struct _QMIDMS_ACTIVATE_MANUAL_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n} QMIDMS_ACTIVATE_MANUAL_RESP_MSG, *PQMIDMS_ACTIVATE_MANUAL_RESP_MSG;\r\n#endif\r\n\r\ntypedef struct _QMIDMS_UIM_GET_STATE_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n} __attribute__ ((packed)) QMIDMS_UIM_GET_STATE_REQ_MSG, *PQMIDMS_UIM_GET_STATE_REQ_MSG;\r\n\r\ntypedef struct _QMIDMS_UIM_GET_STATE_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   UCHAR  UIMState;\r\n} __attribute__ ((packed)) QMIDMS_UIM_GET_STATE_RESP_MSG, *PQMIDMS_UIM_GET_STATE_RESP_MSG;\r\n\r\ntypedef struct _QMIDMS_UIM_GET_PIN_STATUS_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n} __attribute__ ((packed)) QMIDMS_UIM_GET_PIN_STATUS_REQ_MSG, *PQMIDMS_UIM_GET_PIN_STATUS_REQ_MSG;\r\n\r\ntypedef struct _QMIDMS_UIM_PIN_STATUS\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  PINStatus;\r\n   UCHAR  PINVerifyRetriesLeft;\r\n   UCHAR  PINUnblockRetriesLeft;\r\n} __attribute__ ((packed)) QMIDMS_UIM_PIN_STATUS, *PQMIDMS_UIM_PIN_STATUS;\r\n\r\n#define QMI_PIN_STATUS_NOT_INIT      0\r\n#define QMI_PIN_STATUS_NOT_VERIF     1\r\n#define QMI_PIN_STATUS_VERIFIED      2\r\n#define QMI_PIN_STATUS_DISABLED      3\r\n#define QMI_PIN_STATUS_BLOCKED       4\r\n#define QMI_PIN_STATUS_PERM_BLOCKED  5\r\n#define QMI_PIN_STATUS_UNBLOCKED     6\r\n#define QMI_PIN_STATUS_CHANGED       7\r\n\r\n\r\ntypedef struct _QMIDMS_UIM_GET_PIN_STATUS_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n   UCHAR PinStatus;\r\n} __attribute__ ((packed)) QMIDMS_UIM_GET_PIN_STATUS_RESP_MSG, *PQMIDMS_UIM_GET_PIN_STATUS_RESP_MSG;\r\n\r\n#if 0\r\ntypedef struct _QMIDMS_UIM_GET_CK_STATUS_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  Facility;\r\n} QMIDMS_UIM_GET_CK_STATUS_REQ_MSG, *PQMIDMS_UIM_GET_CK_STATUS_REQ_MSG;\r\n\r\n\r\ntypedef struct _QMIDMS_UIM_CK_STATUS\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  FacilityStatus;\r\n   UCHAR  FacilityVerifyRetriesLeft;\r\n   UCHAR  FacilityUnblockRetriesLeft;\r\n} QMIDMS_UIM_CK_STATUS, *PQMIDMS_UIM_CK_STATUS;\r\n\r\ntypedef struct _QMIDMS_UIM_CK_OPERATION_STATUS\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  OperationBlocking;\r\n} QMIDMS_UIM_CK_OPERATION_STATUS, *PQMIDMS_UIM_CK_OPERATION_STATUS;\r\n\r\ntypedef struct _QMIDMS_UIM_GET_CK_STATUS_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n   UCHAR  CkStatus;\r\n} QMIDMS_UIM_GET_CK_STATUS_RESP_MSG, *PQMIDMS_UIM_GET_CK_STATUS_RESP_MSG;\r\n#endif\r\n\r\ntypedef struct _QMIDMS_UIM_VERIFY_PIN_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   UCHAR  PINID;\r\n   UCHAR  PINLen;\r\n   UCHAR  PINValue;\r\n} __attribute__ ((packed)) QMIDMS_UIM_VERIFY_PIN_REQ_MSG, *PQMIDMS_UIM_VERIFY_PIN_REQ_MSG;\r\n\r\ntypedef struct _QMIDMS_UIM_VERIFY_PIN_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   UCHAR  PINVerifyRetriesLeft;\r\n   UCHAR  PINUnblockRetriesLeft;\r\n} __attribute__ ((packed)) QMIDMS_UIM_VERIFY_PIN_RESP_MSG, *PQMIDMS_UIM_VERIFY_PIN_RESP_MSG;\r\n\r\n#if 0\r\ntypedef struct _QMIDMS_UIM_SET_PIN_PROTECTION_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   UCHAR  PINID;\r\n   UCHAR  ProtectionSetting;\r\n   UCHAR  PINLen;\r\n   UCHAR  PINValue;\r\n} QMIDMS_UIM_SET_PIN_PROTECTION_REQ_MSG, *PQMIDMS_UIM_SET_PIN_PROTECTION_REQ_MSG;\r\n\r\ntypedef struct _QMIDMS_UIM_SET_PIN_PROTECTION_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   UCHAR  PINVerifyRetriesLeft;\r\n   UCHAR  PINUnblockRetriesLeft;\r\n} QMIDMS_UIM_SET_PIN_PROTECTION_RESP_MSG, *PQMIDMS_UIM_SET_PIN_PROTECTION_RESP_MSG;\r\n\r\ntypedef struct _QMIDMS_UIM_SET_CK_PROTECTION_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  Facility;\r\n   UCHAR  FacilityState;\r\n   UCHAR  FacliltyLen;\r\n   UCHAR  FacliltyValue;\r\n} QMIDMS_UIM_SET_CK_PROTECTION_REQ_MSG, *PQMIDMS_UIM_SET_CK_PROTECTION_REQ_MSG;\r\n\r\ntypedef struct _QMIDMS_UIM_SET_CK_PROTECTION_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   UCHAR  FacilityRetriesLeft;\r\n} QMIDMS_UIM_SET_CK_PROTECTION_RESP_MSG, *PQMIDMS_UIM_SET_CK_PROTECTION_RESP_MSG;\r\n\r\n\r\ntypedef struct _UIM_PIN\r\n{\r\n   UCHAR  PinLength;\r\n   UCHAR  PinValue;\r\n} UIM_PIN, *PUIM_PIN;\r\n\r\ntypedef struct _QMIDMS_UIM_CHANGE_PIN_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   UCHAR  PINID;\r\n   UCHAR  PinDetails;\r\n} QMIDMS_UIM_CHANGE_PIN_REQ_MSG, *PQMIDMS_UIM_CHANGE_PIN_REQ_MSG;\r\n\r\ntypedef struct QMIDMS_UIM_CHANGE_PIN_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   UCHAR  PINVerifyRetriesLeft;\r\n   UCHAR  PINUnblockRetriesLeft;\r\n} QMIDMS_UIM_CHANGE_PIN_RESP_MSG, *PQMIDMS_UIM_CHANGE_PIN_RESP_MSG;\r\n\r\ntypedef struct _UIM_PUK\r\n{\r\n   UCHAR  PukLength;\r\n   UCHAR  PukValue;\r\n} UIM_PUK, *PUIM_PUK;\r\n\r\ntypedef struct _QMIDMS_UIM_UNBLOCK_PIN_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   UCHAR  PINID;\r\n   UCHAR  PinDetails;\r\n} QMIDMS_UIM_UNBLOCK_PIN_REQ_MSG, *PQMIDMS_UIM_BLOCK_PIN_REQ_MSG;\r\n\r\ntypedef struct QMIDMS_UIM_UNBLOCK_PIN_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0024\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   UCHAR  PINVerifyRetriesLeft;\r\n   UCHAR  PINUnblockRetriesLeft;\r\n} QMIDMS_UIM_UNBLOCK_PIN_RESP_MSG, *PQMIDMS_UIM_UNBLOCK_PIN_RESP_MSG;\r\n\r\ntypedef struct _QMIDMS_UIM_UNBLOCK_CK_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  Facility;\r\n   UCHAR  FacliltyUnblockLen;\r\n   UCHAR  FacliltyUnblockValue;\r\n} QMIDMS_UIM_UNBLOCK_CK_REQ_MSG, *PQMIDMS_UIM_BLOCK_CK_REQ_MSG;\r\n\r\ntypedef struct QMIDMS_UIM_UNBLOCK_CK_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   UCHAR  FacilityUnblockRetriesLeft;\r\n} QMIDMS_UIM_UNBLOCK_CK_RESP_MSG, *PQMIDMS_UIM_UNBLOCK_CK_RESP_MSG;\r\n\r\ntypedef struct _QMIDMS_SET_EVENT_REPORT_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n} QMIDMS_SET_EVENT_REPORT_REQ_MSG, *PQMIDMS_SET_EVENT_REPORT_REQ_MSG;\r\n\r\ntypedef struct _QMIDMS_SET_EVENT_REPORT_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\r\n} QMIDMS_SET_EVENT_REPORT_RESP_MSG, *PQMIDMS_SET_EVENT_REPORT_RESP_MSG;\r\n\r\ntypedef struct _PIN_STATUS\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  ReportPinState;\r\n} PIN_STATUS, *PPIN_STATUS;\r\n\r\ntypedef struct _POWER_STATUS\r\n{\r\n   UCHAR TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR PowerStatus;\r\n   UCHAR BatteryLvl;\r\n} POWER_STATUS, *PPOWER_STATUS;\r\n\r\ntypedef struct _ACTIVATION_STATE\r\n{\r\n   UCHAR TLVType;\r\n   USHORT TLVLength;\r\n   USHORT ActivationState;\r\n} ACTIVATION_STATE, *PACTIVATION_STATE;\r\n\r\ntypedef struct _ACTIVATION_STATE_REQ\r\n{\r\n   UCHAR TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR ActivationState;\r\n} ACTIVATION_STATE_REQ, *PACTIVATION_STATE_REQ;\r\n\r\ntypedef struct _OPERATING_MODE\r\n{\r\n   UCHAR TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR OperatingMode;\r\n} OPERATING_MODE, *POPERATING_MODE;\r\n\r\ntypedef struct _UIM_STATE\r\n{\r\n   UCHAR TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR UIMState;\r\n} UIM_STATE, *PUIM_STATE;\r\n\r\ntypedef struct _WIRELESS_DISABLE_STATE\r\n{\r\n   UCHAR TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR WirelessDisableState;\r\n} WIRELESS_DISABLE_STATE, *PWIRELESS_DISABLE_STATE;\r\n\r\ntypedef struct _QMIDMS_EVENT_REPORT_IND_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n} QMIDMS_EVENT_REPORT_IND_MSG, *PQMIDMS_EVENT_REPORT_IND_MSG;\r\n#endif\r\n\r\n// ============================ END OF DMS ===============================\r\n\r\n// ======================= QOS ==============================\r\ntypedef struct _MPIOC_DEV_INFO MPIOC_DEV_INFO, *PMPIOC_DEV_INFO;\r\n\r\n#define QMI_QOS_SET_EVENT_REPORT_REQ        0x0001\r\n#define QMI_QOS_SET_EVENT_REPORT_RESP       0x0001\r\n#define QMI_QOS_SET_EVENT_REPORT_IND        0x0001\r\n#define QMI_QOS_BIND_DATA_PORT_REQ          0x002B\r\n#define QMI_QOS_BIND_DATA_PORT_RESP         0x002B\r\n#define QMI_QOS_INDICATION_REGISTER_REQ\t    0x002F\r\n#define QMI_QOS_INDICATION_REGISTER_RESP    0x002F\r\n#define QMI_QOS_GLOBAL_QOS_FLOW_IND\t        0x0031\r\n#define QMI_QOS_GET_QOS_INFO_REQ            0x0033\r\n#define QMI_QOS_GET_QOS_INFO_RESP           0x0033\r\n\r\n\r\n#if 1\r\ntypedef struct _QMI_QOS_SET_EVENT_REPORT_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0001\r\n   USHORT Length;\r\n   // UCHAR  TLVType;          // 0x01 - physical link state\r\n   // USHORT TLVLength;        // 1\r\n   // UCHAR  PhyLinkStatusRpt; // 0-enable; 1-disable\r\n   UCHAR  TLVType2;         // 0x02 = global flow reporting\r\n   USHORT TLVLength2;       // 1\r\n   UCHAR  GlobalFlowRpt;    // 1-enable; 0-disable\r\n} QMI_QOS_SET_EVENT_REPORT_REQ_MSG, *PQMI_QOS_SET_EVENT_REPORT_REQ_MSG;\r\n\r\ntypedef struct _QMI_QOS_SET_EVENT_REPORT_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0010\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMUX_RESULT_SUCCESS\r\n                            // QMUX_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMUX_ERR_INVALID_ARG\r\n                            // QMUX_ERR_NO_MEMORY\r\n                            // QMUX_ERR_INTERNAL\r\n                            // QMUX_ERR_FAULT\r\n} QMI_QOS_SET_EVENT_REPORT_RESP_MSG, *PQMI_QOS_SET_EVENT_REPORT_RESP_MSG;\r\n\r\ntypedef struct _QMI_QOS_SET_EVENT_REPORT_IND_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0001\r\n   USHORT Length;\r\n   UCHAR  TLVs;\r\n} QMI_QOS_SET_EVENT_REPORT_IND_MSG, *PQMI_QOS_SET_EVENT_REPORT_IND_MSG;\r\n\r\n\r\ntypedef struct _QMI_QOS_BIND_DATA_PORT_TLV_EP_ID\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x10\r\n\tUSHORT\tTLVLength;\r\n\tULONG\tep_type;\r\n\tULONG\tiface_id;\r\n} __attribute__ ((packed)) QMI_QOS_BIND_DATA_PORT_TLV_EP_ID, *PQMI_QOS_BIND_DATA_PORT_TLV_EP_ID;\r\n\r\ntypedef struct _QMI_QOS_BIND_DATA_PORT_TLV_MUX_ID\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x11\r\n\tUSHORT\tTLVLength;\r\n\tUCHAR\tmux_id;\r\n} __attribute__ ((packed)) QMI_QOS_BIND_DATA_PORT_TLV_MUX_ID, *PQMI_QOS_BIND_DATA_PORT_TLV_MUX_ID;\r\n\r\ntypedef struct _QMI_QOS_BIND_DATA_PORT_TLV_DATA_PORT\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x12\r\n\tUSHORT\tTLVLength;\r\n\tUSHORT\tdata_port;\r\n} __attribute__ ((packed)) QMI_QOS_BIND_DATA_PORT_TLV_DATA_PORT, *PQMI_QOS_BIND_DATA_PORT_TLV_DATA_PORT;\r\n\r\ntypedef struct _QMI_QOS_BIND_DATA_PORT_REQ_MSG\r\n{\r\n\tUSHORT\tType;\r\n\tUSHORT\tLength;\r\n\tQMI_QOS_BIND_DATA_PORT_TLV_EP_ID\t\tEpIdTlv;\r\n\tQMI_QOS_BIND_DATA_PORT_TLV_MUX_ID\t\tMuxIdTlv;\r\n\t//QMI_QOS_BIND_DATA_PORT_TLV_DATA_PORT\tDataPortTlv;\r\n} __attribute__ ((packed)) QMI_QOS_BIND_DATA_PORT_REQ_MSG, *PQMI_QOS_BIND_DATA_PORT_REQ_MSG;\r\n\r\ntypedef struct _QMI_QOS_BIND_DATA_PORT_RESP_MSG\r\n{\r\n\tUSHORT\tType;\r\n\tUSHORT\tLength;\r\n\tUCHAR\tTLVType;\t\t//0x02\r\n\tUSHORT\tTLVLength;\r\n\tUSHORT\tQMUXResult;\r\n\tUSHORT\tQMUXError;\r\n} __attribute__ ((packed)) QMI_QOS_BIND_DATA_PORT_RESP_MSG, *PQMI_QOS_BIND_DATA_PORT_RESP_MSG;\r\n\r\ntypedef struct _QMI_QOS_INDICATION_REGISTER_TLV_REPORT_GLOBAL_QOS_FLOW\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x10\r\n\tUSHORT\tTLVLength;\r\n\tUCHAR\treport_global_qos_flows;\r\n} __attribute__ ((packed)) QMI_QOS_INDICATION_REGISTER_TLV_REPORT_GLOBAL_QOS_FLOW, *PQMI_QOS_INDICATION_REGISTER_TLV_REPORT_GLOBAL_QOS_FLOW;\r\n\r\ntypedef struct _QMI_QOS_INDICATION_REGISTER_TLV_SUPPRESS_REPORT_FLOW_CTL\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x11\r\n\tUSHORT\tTLVLength;\r\n\tUCHAR\tsuppress_report_flow_control;\r\n} __attribute__ ((packed)) QMI_QOS_INDICATION_REGISTER_TLV_SUPPRESS_REPORT_FLOW_CTL, *PQMI_QOS_INDICATION_REGISTER_TLV_SUPPRESS_REPORT_FLOW_CTL;\r\n\r\ntypedef struct _QMI_QOS_INDICATION_REGISTER_TLV_SUPPRESS_NW_STATUS_IND\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x12\r\n\tUSHORT\tTLVLength;\r\n\tUCHAR\tsuppress_network_status_ind;\r\n} __attribute__ ((packed)) QMI_QOS_INDICATION_REGISTER_TLV_SUPPRESS_NW_STATUS_IND, *PQMI_QOS_INDICATION_REGISTER_TLV_SUPPRESS_NW_STATUS_IND;\r\n\r\ntypedef struct _QMI_QOS_INDICATION_REGISTER_REQ_MSG\r\n{\r\n\tUSHORT\tType;\r\n\tUSHORT\tLength;\r\n\tQMI_QOS_INDICATION_REGISTER_TLV_REPORT_GLOBAL_QOS_FLOW\t\tReportGlobalQosFlowTlv;\r\n \t//QMI_QOS_INDICATION_REGISTER_TLV_SUPPRESS_REPORT_FLOW_CTL\tSuppressReportFlowCtlTlv;\r\n\t//QMI_QOS_INDICATION_REGISTER_TLV_SUPPRESS_NW_STATUS_IND\t\tSuppressNWStatusIndTlv;\r\n} __attribute__ ((packed)) QMI_QOS_INDICATION_REGISTER_REQ_MSG, *PQMI_QOS_INDICATION_REGISTER_REQ_MSG;\r\n\r\ntypedef struct _QMI_QOS_INDICATION_REGISTER_RESP_MSG\r\n{\r\n\tUSHORT\tType;\r\n\tUSHORT\tLength;\r\n\tUCHAR\tTLVType;\t\t//0x02\r\n\tUSHORT\tTLVLength;\r\n\tUSHORT\tQMUXResult;\r\n\tUSHORT\tQMUXError;\r\n} __attribute__ ((packed)) QMI_QOS_INDICATION_REGISTER_RESP_MSG, *PQMI_QOS_INDICATION_REGISTER_RESP_MSG;\r\n\r\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_STATE\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x01\r\n\tUSHORT\tTLVLength;\r\n\tULONG\tqos_id;\r\n\tUCHAR\tnew_flow;\r\n\tULONG\tstate_change;\r\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_STATE, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_STATE;\r\n\r\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x10 0x11\r\n\tUSHORT\tTLVLength;\r\n\tULONG64\tflow_valid_params;\r\n\tULONG\tip_flow_trf_cls;\r\n\tULONG64 data_rate_max;\r\n\tULONG64\tguaranteed_rate;\r\n\tULONG\tpeak_rate;\r\n\tULONG\ttoken_rate;\r\n\tULONG\tbucket_size;\r\n\tULONG\tip_flow_latency;\r\n\tULONG\tip_flow_jitter;\r\n\tUSHORT\tip_flow_pkt_error_rate_multiplier;\r\n\tUSHORT\tip_flow_pkt_error_rate_exponent;\r\n\tULONG\tip_flow_min_policed_packet_size;\r\n\tULONG\tip_flow_max_allowed_packet_size;\r\n\tULONG\tip_flow_3gpp_residual_bit_error_rate;\r\n\tULONG\tip_flow_3gpp_traffic_handling_priority;\r\n\tUSHORT\tip_flow_3gpp2_profile_id;\r\n\tUCHAR\tip_flow_3gpp2_flow_priority;\r\n\tUCHAR\tip_flow_3gpp_im_cn_flag;\r\n\tUCHAR\tip_flow_3gpp_sig_ind;\r\n\tULONG\tip_flow_lte_qci;\r\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED;\r\n\r\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_FILTER\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x12 0x13\r\n\tUSHORT\tTLVLength;\r\n\tUCHAR\ttx_rx_qos_filter_len;\r\n\tUCHAR\tip_version;\r\n\tULONG64\tvalid_params0;\r\n\tULONG\tipv4_addr0;\r\n\tULONG\tsubnet_mask0;\r\n\tULONG\tipv4_addr1;\r\n\tULONG\tsubnet_mask1;\r\n\tUCHAR\tval4;\r\n\tUCHAR\tmask4;\r\n\tULONG64\tvalid_params01;\r\n\tUCHAR\tipv6_address00;\r\n\tUCHAR\tipv6_address01;\r\n\tUCHAR\tipv6_address02;\r\n\tUCHAR\tipv6_address03;\r\n\tUCHAR\tipv6_address04;\r\n\tUCHAR\tipv6_address05;\r\n\tUCHAR\tipv6_address06;\r\n\tUCHAR\tipv6_address07;\r\n\tUCHAR\tipv6_address08;\r\n\tUCHAR\tipv6_address09;\r\n\tUCHAR\tipv6_address010;\r\n\tUCHAR\tipv6_address011;\r\n\tUCHAR\tipv6_address012;\r\n\tUCHAR\tipv6_address013;\r\n\tUCHAR\tipv6_address014;\r\n\tULONG\tipv6_address015;\r\n\tUCHAR\tprefix_len0;\r\n\tUCHAR\tipv6_address10;\r\n\tUCHAR\tipv6_address11;\r\n\tUCHAR\tipv6_address12;\r\n\tUCHAR\tipv6_address13;\r\n\tUCHAR\tipv6_address14;\r\n\tUCHAR\tipv6_address15;\r\n\tUCHAR\tipv6_address16;\r\n\tUCHAR\tipv6_address17;\r\n\tUCHAR\tipv6_address18;\r\n\tUCHAR\tipv6_address19;\r\n\tUCHAR\tipv6_address110;\r\n\tUCHAR\tipv6_address111;\r\n\tUCHAR\tipv6_address112;\r\n\tUCHAR\tipv6_address113;\r\n\tUCHAR\tipv6_address114;\r\n\tULONG\tipv6_address115;\r\n\tUCHAR\tprefix_len1;\r\n\tUCHAR\tval6;\r\n\tUCHAR\tmask6;\r\n\tULONG\tflow_label;\r\n\tULONG\txport_protocol;\r\n\tULONG64\tvalid_params2;\r\n\tUSHORT\tport0;\r\n\tUSHORT\trange0;\r\n\tUSHORT\tport1;\r\n\tUSHORT\trange1;\r\n\tULONG64\tvalid_params3;\r\n\tUSHORT\tport2;\r\n\tUSHORT\trange2;\r\n\tUSHORT\tport3;\r\n\tUSHORT\trange3;\r\n\tULONG64\tvalid_params4;\r\n\tUCHAR\ttype;\r\n\tUCHAR\tcode;\r\n\tULONG64\tvalid_params5;\r\n\tULONG\tspi0;\r\n\tULONG64\tvalid_params6;\r\n\tULONG\tspi1;\r\n\tUSHORT\tfilter_id;\r\n\tUSHORT\tfilter_precedence;\r\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_FILTER, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FILTER;\r\n\r\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_TYPE\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x14\r\n\tUSHORT\tTLVLength;\r\n\tULONG\tflow_type;\r\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_TYPE, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_TYPE;\r\n\r\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_BEARER_ID\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x15\r\n\tUSHORT\tTLVLength;\r\n\tUCHAR\tbearer_id;\r\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_BEARER_ID, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_BEARER_ID;\r\n\r\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_CTL_SEQ_NUM\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x16\r\n\tUSHORT\tTLVLength;\r\n\tUSHORT\tfc_seq_num;\r\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_CTL_SEQ_NUM, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_CTL_SEQ_NUM;\r\n\r\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_5G_QCI\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x17 0x18\r\n\tUSHORT\tTLVLength;\r\n\tULONG\ttx_rx_5g_qci;\r\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_5G_QCI, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_5G_QCI;\r\n\r\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_AVG_WINDOW\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x19 0x1A\r\n\tUSHORT\tTLVLength;\r\n\tUSHORT\ttx_rx_avg_window;\r\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_AVG_WINDOW, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_AVG_WINDOW;\r\n\r\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_TLV_TX_FILTER_MATCH_ALL\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x1B\r\n\tUSHORT\tTLVLength;\r\n\tUCHAR\ttx_filter_match_all_len;\r\n\tUSHORT\tfilter_id;\r\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_TLV_TX_FILTER_MATCH_ALL, *PQMI_QOS_GLOBAL_QOS_FLOW_TLV_TX_FILTER_MATCH_ALL;\r\n\r\ntypedef struct _QMI_QOS_GLOBAL_QOS_FLOW_IND_MSG\r\n{\r\n\tUSHORT\tType;\r\n\tUSHORT\tLength;\r\n\tQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_STATE\t\t\tFlowStateTlv;\r\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED\t\tTxFlowGrantedTlv;\r\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED\t\tRxFlowGrantedTlv;\r\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_FILTER\t\t\t\tTxFilterTlv;\r\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_FILTER\t\t\t\tRxFilterTlv;\r\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_TYPE\t\t\tFlowTypeTlv;\r\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_BEARER_ID\t\t\tBearerIdTlv;\r\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_CTL_SEQ_NUM\tFlowCtlSeqNumTlv;\r\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_5G_QCI\t\t\t\tTx5GQciTlv;\r\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_5G_QCI\t\t\t\tRx5GQciTlv;\r\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_AVG_WINDOW\t\t\tAvgWindowTlv;\r\n\t//QMI_QOS_GLOBAL_QOS_FLOW_TLV_TX_FILTER_MATCH_ALL\tTxFilterMatchAllTlv;\r\n} __attribute__ ((packed)) QMI_QOS_GLOBAL_QOS_FLOW_IND_MSG, *PQMI_QOS_GLOBAL_QOS_FLOW_IND_MSG;\r\n\r\ntypedef struct _QMI_QOS_GET_QOS_INFO_TLV_QOS_ID\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x01\r\n\tUSHORT\tTLVLength;\r\n\tULONG\tqos_id;\r\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_TLV_QOS_ID, *PQMI_QOS_GET_QOS_INFO_TLV_QOS_ID;\r\n\r\ntypedef struct _QMI_QOS_GET_QOS_INFO_TLV_FLOW_STATUS\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x10\r\n\tUSHORT\tTLVLength;\r\n\tUCHAR\tflow_status;\r\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_TLV_FLOW_STATUS, *PQMI_QOS_GET_QOS_INFO_TLV_FLOW_STATUS;\r\n\r\ntypedef struct _QMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x11 0x12\r\n\tUSHORT\tTLVLength;\r\n\tULONG64\tflow_valid_params;\r\n\tULONG\tip_flow_trf_cls;\r\n\tULONG64 data_rate_max;\r\n\tULONG64\tguaranteed_rate;\r\n\tULONG\tpeak_rate;\r\n\tULONG\ttoken_rate;\r\n\tULONG\tbucket_size;\r\n\tULONG\tip_flow_latency;\r\n\tULONG\tip_flow_jitter;\r\n\tUSHORT\tip_flow_pkt_error_rate_multiplier;\r\n\tUSHORT\tip_flow_pkt_error_rate_exponent;\r\n\tULONG\tip_flow_min_policed_packet_size;\r\n\tULONG\tip_flow_max_allowed_packet_size;\r\n\tULONG\tip_flow_3gpp_residual_bit_error_rate;\r\n\tULONG\tip_flow_3gpp_traffic_handling_priority;\r\n\tUSHORT\tip_flow_3gpp2_profile_id;\r\n\tUCHAR\tip_flow_3gpp2_flow_priority;\r\n\tUCHAR\tip_flow_3gpp_im_cn_flag;\r\n\tUCHAR\tip_flow_3gpp_sig_ind;\r\n\tULONG\tip_flow_lte_qci;\r\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW, *PQMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW;\r\n\r\ntypedef struct _QMI_QOS_GET_QOS_INFO_TLV_FILTER_SPECS\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x13 0x14\r\n\tUSHORT\tTLVLength;\r\n\tUCHAR\ttx_rx_qos_filter_len;\r\n\tUCHAR\tip_version;\r\n\tULONG64\tvalid_params0;\r\n\tULONG\tipv4_addr0;\r\n\tULONG\tsubnet_mask0;\r\n\tULONG\tipv4_addr1;\r\n\tULONG\tsubnet_mask1;\r\n\tUCHAR\tval4;\r\n\tUCHAR\tmask4;\r\n\tULONG64\tvalid_params01;\r\n\tUCHAR\tipv6_address00;\r\n\tUCHAR\tipv6_address01;\r\n\tUCHAR\tipv6_address02;\r\n\tUCHAR\tipv6_address03;\r\n\tUCHAR\tipv6_address04;\r\n\tUCHAR\tipv6_address05;\r\n\tUCHAR\tipv6_address06;\r\n\tUCHAR\tipv6_address07;\r\n\tUCHAR\tipv6_address08;\r\n\tUCHAR\tipv6_address09;\r\n\tUCHAR\tipv6_address010;\r\n\tUCHAR\tipv6_address011;\r\n\tUCHAR\tipv6_address012;\r\n\tUCHAR\tipv6_address013;\r\n\tUCHAR\tipv6_address014;\r\n\tULONG\tipv6_address015;\r\n\tUCHAR\tprefix_len0;\r\n\tUCHAR\tipv6_address10;\r\n\tUCHAR\tipv6_address11;\r\n\tUCHAR\tipv6_address12;\r\n\tUCHAR\tipv6_address13;\r\n\tUCHAR\tipv6_address14;\r\n\tUCHAR\tipv6_address15;\r\n\tUCHAR\tipv6_address16;\r\n\tUCHAR\tipv6_address17;\r\n\tUCHAR\tipv6_address18;\r\n\tUCHAR\tipv6_address19;\r\n\tUCHAR\tipv6_address110;\r\n\tUCHAR\tipv6_address111;\r\n\tUCHAR\tipv6_address112;\r\n\tUCHAR\tipv6_address113;\r\n\tUCHAR\tipv6_address114;\r\n\tULONG\tipv6_address115;\r\n\tUCHAR\tprefix_len1;\r\n\tUCHAR\tval6;\r\n\tUCHAR\tmask6;\r\n\tULONG\tflow_label;\r\n\tULONG\txport_protocol;\r\n\tULONG64\tvalid_params2;\r\n\tUSHORT\tport0;\r\n\tUSHORT\trange0;\r\n\tUSHORT\tport1;\r\n\tUSHORT\trange1;\r\n\tULONG64\tvalid_params3;\r\n\tUSHORT\tport2;\r\n\tUSHORT\trange2;\r\n\tUSHORT\tport3;\r\n\tUSHORT\trange3;\r\n\tULONG64\tvalid_params4;\r\n\tUCHAR\ttype;\r\n\tUCHAR\tcode;\r\n\tULONG64\tvalid_params5;\r\n\tULONG\tspi0;\r\n\tULONG64\tvalid_params6;\r\n\tULONG\tspi1;\r\n\tUSHORT\tfilter_id;\r\n\tUSHORT\tfilter_precedence;\r\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_TLV_FILTER_SPECS, *PQMI_QOS_GET_QOS_INFO_TLV_FILTER_SPECS;\r\n\r\ntypedef struct _QMI_QOS_GET_QOS_INFO_TLV_EXT_ERROR_INFO\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x15\r\n\tUSHORT\tTLVLength;\r\n\tUSHORT\text_error_info;\r\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_TLV_EXT_ERROR_INFO, *PQMI_QOS_GET_QOS_INFO_TLV_EXT_ERROR_INFO;\r\n\r\ntypedef struct _QMI_QOS_GET_QOS_INFO_TLV_5G_QCI\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x16 0x17\r\n\tUSHORT\tTLVLength;\r\n\tULONG\ttx_rx_5g_qci;\r\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_TLV_5G_QCI, *PQMI_QOS_GET_QOS_INFO_TLV_5G_QCI;\r\n\r\ntypedef struct _QMI_QOS_GET_QOS_INFO_TLV_AVG_WINDOW\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x18 0x19\r\n\tUSHORT\tTLVLength;\r\n\tUSHORT\ttx_rx_averaging_window;\r\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_TLV_AVG_WINDOW, *PQMI_QOS_GET_QOS_INFO_TLV_AVG_WINDOW;\r\n\r\ntypedef struct _QMI_QOS_GET_QOS_INFO_TLV_TX_FILTER_MATCH_ALL\r\n{\r\n\tUCHAR\tTLVType;\t\t//0x1A\r\n\tUSHORT\tTLVLength;\r\n\tUCHAR\ttx_filter_match_all_len;\r\n\tUSHORT\tfilter_id;\r\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_TLV_TX_FILTER_MATCH_ALL, *PQMI_QOS_GET_QOS_INFO_TLV_TX_FILTER_MATCH_ALL;\r\n\r\ntypedef struct _QMI_QOS_GET_QOS_INFO_REQ_MSG\r\n{\r\n\tUSHORT\tType;\r\n\tUSHORT\tLength;\r\n\tQMI_QOS_GET_QOS_INFO_TLV_QOS_ID\t\tQosIdTlv;\r\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_REQ_MSG, *PQMI_QOS_GET_QOS_INFO_REQ_MSG;\r\n\r\ntypedef struct _QMI_QOS_GET_QOS_INFO_RESP_MSG\r\n{\r\n\tUSHORT\tType;\r\n\tUSHORT\tLength;\r\n\tUCHAR\tTLVType;\t\t//0x02\r\n\tUSHORT\tTLVLength;\r\n\tUSHORT\tQMUXResult;\r\n\tUSHORT\tQMUXError;\r\n\t//QMI_QOS_GET_QOS_INFO_TLV_FLOW_STATUS\t\t\tFlowStatusTlv;\r\n\t//QMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW\t\t\tTxGrantedFlowTlv;\r\n\t//QMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW\t\t\tRxGrantedFlowTlv;\r\n\t//QMI_QOS_GET_QOS_INFO_TLV_FILTER_SPECS\t\t\tTxFilterSpecsTlv;\r\n\t//QMI_QOS_GET_QOS_INFO_TLV_FILTER_SPECS\t\t\tRxFilterSpecsTlv;\r\n\t//QMI_QOS_GET_QOS_INFO_TLV_EXT_ERROR_INFO\t\t\tExtErrorInfoTlv;\r\n\t//QMI_QOS_GET_QOS_INFO_TLV_5G_QCI\t\t\t\t\tTx5GQciTlv;\r\n\t//QMI_QOS_GET_QOS_INFO_TLV_5G_QCI\t\t\t\t\tRx5GQciTlv;\r\n\t//QMI_QOS_GET_QOS_INFO_TLV_AVG_WINDOW\t\t\t\tTxAvgWindowTlv;\r\n\t//QMI_QOS_GET_QOS_INFO_TLV_AVG_WINDOW\t\t\t\tRxAvgWindowTlv;\r\n\t//QMI_QOS_GET_QOS_INFO_TLV_TX_FILTER_MATCH_ALL\tTxFilterMatchAllTlv;\r\n} __attribute__ ((packed)) QMI_QOS_GET_QOS_INFO_RESP_MSG, *PQMI_QOS_GET_QOS_INFO_RESP_MSG;\r\n\r\n#define QOS_IND_FLOW_STATE_ACTIVATED 0x00\r\n#define QOS_IND_FLOW_STATE_MODIFIED  0x01\r\n#define QOS_IND_FLOW_STATE_DELETED   0x02\r\n#define QOS_IND_FLOW_STATE_SUSPENDED 0x03\r\n#define QOS_IND_FLOW_STATE_ENABLED   0x04\r\n#define QOS_IND_FLOW_STATE_DISABLED  0x05\r\n#define QOS_IND_FLOW_STATE_INVALID\t 0x06\r\n\r\n#define QOS_EVENT_RPT_IND_FLOW_ACTIVATED 0x01\r\n#define QOS_EVENT_RPT_IND_FLOW_MODIFIED  0x02\r\n#define QOS_EVENT_RPT_IND_FLOW_DELETED   0x03\r\n#define QOS_EVENT_RPT_IND_FLOW_SUSPENDED 0x04\r\n#define QOS_EVENT_RPT_IND_FLOW_ENABLED   0x05\r\n#define QOS_EVENT_RPT_IND_FLOW_DISABLED  0x06\r\n\r\n#define QOS_EVENT_RPT_IND_TLV_PHY_LINK_STATE_TYPE 0x01\r\n#define QOS_EVENT_RPT_IND_TLV_GLOBAL_FL_RPT_STATE 0x10\r\n#define QOS_EVENT_RPT_IND_TLV_GLOBAL_FL_RPT_TYPE  0x10\r\n#define QOS_EVENT_RPT_IND_TLV_TX_FLOW_TYPE        0x11\r\n#define QOS_EVENT_RPT_IND_TLV_RX_FLOW_TYPE        0x12\r\n#define QOS_EVENT_RPT_IND_TLV_TX_FILTER_TYPE      0x13\r\n#define QOS_EVENT_RPT_IND_TLV_RX_FILTER_TYPE      0x14\r\n#define QOS_EVENT_RPT_IND_TLV_FLOW_SPEC           0x10\r\n#define QOS_EVENT_RPT_IND_TLV_FILTER_SPEC         0x10\r\n\r\ntypedef struct _QOS_EVENT_RPT_IND_TLV_PHY_LINK_STATE\r\n{\r\n   UCHAR  TLVType;       // 0x01\r\n   USHORT TLVLength;     // 1\r\n   UCHAR  PhyLinkState;  // 0-dormant, 1-active\r\n} QOS_EVENT_RPT_IND_TLV_PHY_LINK_STATE, *PQOS_EVENT_RPT_IND_TLV_PHY_LINK_STATE;\r\n\r\ntypedef struct _QOS_EVENT_RPT_IND_TLV_GLOBAL_FL_RPT\r\n{\r\n   UCHAR  TLVType;       // 0x10\r\n   USHORT TLVLength;     // 6\r\n   ULONG  QosId;\r\n   UCHAR  NewFlow;       // 1: newly added flow; 0: existing flow\r\n   UCHAR  StateChange;   // 1: activated; 2: modified; 3: deleted;\r\n                         // 4: suspended(delete); 5: enabled; 6: disabled\r\n} QOS_EVENT_RPT_IND_TLV_GLOBAL_FL_RPT, *PQOS_EVENT_RPT_IND_TLV_GLOBAL_FL_RPT;\r\n\r\n// QOS Flow\r\n\r\ntypedef struct _QOS_EVENT_RPT_IND_TLV_FLOW\r\n{\r\n   UCHAR  TLVType;       // 0x10-TX flow; 0x11-RX flow\r\n   USHORT TLVLength;     // var\r\n   // embedded TLV's\r\n} QOS_EVENT_RPT_IND_TLV_TX_FLOW, *PQOS_EVENT_RPT_IND_TLV_TX_FLOW;\r\n\r\n#define QOS_FLOW_TLV_IP_FLOW_IDX_TYPE                    0x10\r\n#define QOS_FLOW_TLV_IP_FLOW_TRAFFIC_CLASS_TYPE          0x11\r\n#define QOS_FLOW_TLV_IP_FLOW_DATA_RATE_MIN_MAX_TYPE      0x12\r\n#define QOS_FLOW_TLV_IP_FLOW_DATA_RATE_TOKEN_BUCKET_TYPE 0x13\r\n#define QOS_FLOW_TLV_IP_FLOW_LATENCY_TYPE                0x14\r\n#define QOS_FLOW_TLV_IP_FLOW_JITTER_TYPE                 0x15\r\n#define QOS_FLOW_TLV_IP_FLOW_PKT_ERR_RATE_TYPE           0x16\r\n#define QOS_FLOW_TLV_IP_FLOW_MIN_PKT_SIZE_TYPE           0x17\r\n#define QOS_FLOW_TLV_IP_FLOW_MAX_PKT_SIZE_TYPE           0x18\r\n#define QOS_FLOW_TLV_IP_FLOW_3GPP_BIT_ERR_RATE_TYPE      0x19\r\n#define QOS_FLOW_TLV_IP_FLOW_3GPP_TRAF_PRIORITY_TYPE     0x1A\r\n#define QOS_FLOW_TLV_IP_FLOW_3GPP2_PROFILE_ID_TYPE       0x1B\r\n\r\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_IDX\r\n{\r\n   UCHAR  TLVType;       // 0x10\r\n   USHORT TLVLength;     // 1\r\n   UCHAR  IpFlowIndex;\r\n}  QOS_FLOW_TLV_IP_FLOW_IDX, *PQOS_FLOW_TLV_IP_FLOW_IDX;\r\n\r\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_TRAFFIC_CLASS\r\n{\r\n   UCHAR  TLVType;       // 0x11\r\n   USHORT TLVLength;     // 1\r\n   UCHAR  TrafficClass;\r\n}  QOS_FLOW_TLV_IP_FLOW_TRAFFIC_CLASS, *PQOS_FLOW_TLV_IP_FLOW_TRAFFIC_CLASS;\r\n\r\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_DATA_RATE_MIN_MAX\r\n{\r\n   UCHAR  TLVType;       // 0x12\r\n   USHORT TLVLength;     // 8\r\n   ULONG  DataRateMax;\r\n   ULONG  GuaranteedRate;\r\n}  QOS_FLOW_TLV_IP_FLOW_DATA_RATE_MIN_MAX, *PQOS_FLOW_TLV_IP_FLOW_DATA_RATE_MIN_MAX;\r\n\r\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_DATA_RATE_TOKEN_BUCKET\r\n{\r\n   UCHAR  TLVType;       // 0x13\r\n   USHORT TLVLength;     // 12\r\n   ULONG  PeakRate;\r\n   ULONG  TokenRate;\r\n   ULONG  BucketSize;\r\n}  QOS_FLOW_TLV_IP_FLOW_DATA_RATE_TOKEN_BUCKET, *PQOS_FLOW_TLV_IP_FLOW_DATA_RATE_TOKEN_BUCKET;\r\n\r\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_LATENCY\r\n{\r\n   UCHAR  TLVType;       // 0x14\r\n   USHORT TLVLength;     // 4\r\n   ULONG  IpFlowLatency;\r\n}  QOS_FLOW_TLV_IP_FLOW_LATENCY, *PQOS_FLOW_TLV_IP_FLOW_LATENCY;\r\n\r\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_JITTER\r\n{\r\n   UCHAR  TLVType;       // 0x15\r\n   USHORT TLVLength;     // 4\r\n   ULONG  IpFlowJitter;\r\n}  QOS_FLOW_TLV_IP_FLOW_JITTER, *PQOS_FLOW_TLV_IP_FLOW_JITTER;\r\n\r\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_PKT_ERR_RATE\r\n{\r\n   UCHAR  TLVType;       // 0x16\r\n   USHORT TLVLength;     // 4\r\n   USHORT ErrRateMultiplier;\r\n   USHORT ErrRateExponent;\r\n}  QOS_FLOW_TLV_IP_FLOW_PKT_ERR_RATE, *PQOS_FLOW_TLV_IP_FLOW_PKT_ERR_RATE;\r\n\r\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_MIN_PKT_SIZE\r\n{\r\n   UCHAR  TLVType;       // 0x17\r\n   USHORT TLVLength;     // 4\r\n   ULONG  MinPolicedPktSize;\r\n}  QOS_FLOW_TLV_IP_FLOW_MIN_PKT_SIZE, *PQOS_FLOW_TLV_IP_FLOW_MIN_PKT_SIZE;\r\n\r\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_MAX_PKT_SIZE\r\n{\r\n   UCHAR  TLVType;       // 0x18\r\n   USHORT TLVLength;     // 4\r\n   ULONG  MaxAllowedPktSize;\r\n}  QOS_FLOW_TLV_IP_FLOW_MAX_PKT_SIZE, *PQOS_FLOW_TLV_IP_FLOW_MAX_PKT_SIZE;\r\n\r\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_3GPP_BIT_ERR_RATE\r\n{\r\n   UCHAR  TLVType;       // 0x19\r\n   USHORT TLVLength;     // 1\r\n   UCHAR  ResidualBitErrorRate;\r\n}  QOS_FLOW_TLV_IP_FLOW_3GPP_BIT_ERR_RATE, *PQOS_FLOW_TLV_IP_FLOW_3GPP_BIT_ERR_RATE;\r\n\r\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_3GPP_TRAF_PRIORITY\r\n{\r\n   UCHAR  TLVType;       // 0x1A\r\n   USHORT TLVLength;     // 1\r\n   UCHAR  TrafficHandlingPriority;\r\n}  QOS_FLOW_TLV_IP_FLOW_3GPP_TRAF_PRIORITY, *PQOS_FLOW_TLV_IP_FLOW_3GPP_TRAF_PRIORITY;\r\n\r\ntypedef struct _QOS_FLOW_TLV_IP_FLOW_3GPP2_PROFILE_ID\r\n{\r\n   UCHAR  TLVType;       // 0x1B\r\n   USHORT TLVLength;     // 2\r\n   USHORT ProfileId;\r\n}  QOS_FLOW_TLV_IP_FLOW_3GPP2_PROFILE_ID, *PQOS_FLOW_TLV_IP_FLOW_3GPP2_PROFILE_ID;\r\n\r\n// QOS Filter\r\n\r\n#define QOS_FILTER_TLV_IP_FILTER_IDX_TYPE          0x10\r\n#define QOS_FILTER_TLV_IP_VERSION_TYPE             0x11\r\n#define QOS_FILTER_TLV_IPV4_SRC_ADDR_TYPE          0x12\r\n#define QOS_FILTER_TLV_IPV4_DEST_ADDR_TYPE         0x13\r\n#define QOS_FILTER_TLV_NEXT_HDR_PROTOCOL_TYPE      0x14\r\n#define QOS_FILTER_TLV_IPV4_TYPE_OF_SERVICE_TYPE   0x15\r\n#define QOS_FILTER_TLV_TCP_UDP_PORT_SRC_TCP_TYPE   0x1B\r\n#define QOS_FILTER_TLV_TCP_UDP_PORT_DEST_TCP_TYPE  0x1C\r\n#define QOS_FILTER_TLV_TCP_UDP_PORT_SRC_UDP_TYPE   0x1D\r\n#define QOS_FILTER_TLV_TCP_UDP_PORT_DEST_UDP_TYPE  0x1E\r\n#define QOS_FILTER_TLV_ICMP_FILTER_MSG_TYPE_TYPE   0x1F\r\n#define QOS_FILTER_TLV_ICMP_FILTER_MSG_CODE_TYPE   0x20\r\n#define QOS_FILTER_TLV_TCP_UDP_PORT_SRC_TYPE       0x24\r\n#define QOS_FILTER_TLV_TCP_UDP_PORT_DEST_TYPE      0x25\r\n\r\ntypedef struct _QOS_EVENT_RPT_IND_TLV_FILTER\r\n{\r\n   UCHAR  TLVType;       // 0x12-TX filter; 0x13-RX filter\r\n   USHORT TLVLength;     // var\r\n   // embedded TLV's\r\n} QOS_EVENT_RPT_IND_TLV_RX_FILTER, *PQOS_EVENT_RPT_IND_TLV_RX_FILTER;\r\n\r\ntypedef struct _QOS_FILTER_TLV_IP_FILTER_IDX\r\n{\r\n   UCHAR  TLVType;       // 0x10\r\n   USHORT TLVLength;     // 1\r\n   UCHAR  IpFilterIndex;\r\n}  QOS_FILTER_TLV_IP_FILTER_IDX, *PQOS_FILTER_TLV_IP_FILTER_IDX;\r\n\r\ntypedef struct _QOS_FILTER_TLV_IP_VERSION\r\n{\r\n   UCHAR  TLVType;       // 0x11\r\n   USHORT TLVLength;     // 1\r\n   UCHAR  IpVersion;\r\n}  QOS_FILTER_TLV_IP_VERSION, *PQOS_FILTER_TLV_IP_VERSION;\r\n\r\ntypedef struct _QOS_FILTER_TLV_IPV4_SRC_ADDR\r\n{\r\n   UCHAR  TLVType;       // 0x12\r\n   USHORT TLVLength;     // 8\r\n   ULONG  IpSrcAddr;\r\n   ULONG  IpSrcSubnetMask;\r\n}  QOS_FILTER_TLV_IPV4_SRC_ADDR, *PQOS_FILTER_TLV_IPV4_SRC_ADDR;\r\n\r\ntypedef struct _QOS_FILTER_TLV_IPV4_DEST_ADDR\r\n{\r\n   UCHAR  TLVType;       // 0x13\r\n   USHORT TLVLength;     // 8\r\n   ULONG  IpDestAddr;\r\n   ULONG  IpDestSubnetMask;\r\n}  QOS_FILTER_TLV_IPV4_DEST_ADDR, *PQOS_FILTER_TLV_IPV4_DEST_ADDR;\r\n\r\ntypedef struct _QOS_FILTER_TLV_NEXT_HDR_PROTOCOL\r\n{\r\n   UCHAR  TLVType;       // 0x14\r\n   USHORT TLVLength;     // 1\r\n   UCHAR  NextHdrProtocol;\r\n}  QOS_FILTER_TLV_NEXT_HDR_PROTOCOL, *PQOS_FILTER_TLV_NEXT_HDR_PROTOCOL;\r\n\r\ntypedef struct _QOS_FILTER_TLV_IPV4_TYPE_OF_SERVICE\r\n{\r\n   UCHAR  TLVType;       // 0x15\r\n   USHORT TLVLength;     // 2\r\n   UCHAR  Ipv4TypeOfService;\r\n   UCHAR  Ipv4TypeOfServiceMask;\r\n}  QOS_FILTER_TLV_IPV4_TYPE_OF_SERVICE, *PQOS_FILTER_TLV_IPV4_TYPE_OF_SERVICE;\r\n\r\ntypedef struct _QOS_FILTER_TLV_TCP_UDP_PORT\r\n{\r\n   UCHAR  TLVType;       // source port: 0x1B-TCP; 0x1D-UDP\r\n                         // dest port:   0x1C-TCP; 0x1E-UDP\r\n   USHORT TLVLength;     // 4\r\n   USHORT FilterPort;\r\n   USHORT FilterPortRange;\r\n}  QOS_FILTER_TLV_TCP_UDP_PORT, *PQOS_FILTER_TLV_TCP_UDP_PORT;\r\n\r\ntypedef struct _QOS_FILTER_TLV_ICMP_FILTER_MSG_TYPE\r\n{\r\n   UCHAR  TLVType;       // 0x1F\r\n   USHORT TLVLength;     // 1\r\n   UCHAR  IcmpFilterMsgType;\r\n}  QOS_FILTER_TLV_ICMP_FILTER_MSG_TYPE, *PQOS_FILTER_TLV_ICMP_FILTER_MSG_TYPE;\r\n\r\ntypedef struct _QOS_FILTER_TLV_ICMP_FILTER_MSG_CODE\r\n{\r\n   UCHAR  TLVType;       // 0x20\r\n   USHORT TLVLength;     // 1\r\n   UCHAR  IcmpFilterMsgCode;\r\n}  QOS_FILTER_TLV_ICMP_FILTER_MSG_CODE, *PQOS_FILTER_TLV_ICMP_FILTER_MSG_CODE;\r\n\r\n#define QOS_FILTER_PRECEDENCE_INVALID  256\r\n#define QOS_FILTER_TLV_PRECEDENCE_TYPE 0x22\r\n#define QOS_FILTER_TLV_ID_TYPE         0x23\r\n\r\ntypedef struct _QOS_FILTER_TLV_PRECEDENCE\r\n{\r\n   UCHAR  TLVType;    // 0x22\r\n   USHORT TLVLength;  // 2\r\n   USHORT Precedence; // precedence of the filter\r\n}  QOS_FILTER_TLV_PRECEDENCE, *PQOS_FILTER_TLV_PRECEDENCE;\r\n\r\ntypedef struct _QOS_FILTER_TLV_ID\r\n{\r\n   UCHAR  TLVType;    // 0x23\r\n   USHORT TLVLength;  // 2\r\n   USHORT FilterId;   // filter ID\r\n}  QOS_FILTER_TLV_ID, *PQOS_FILTER_TLV_ID;\r\n\r\n#ifdef QCQOS_IPV6\r\n\r\n#define QOS_FILTER_TLV_IPV6_SRC_ADDR_TYPE          0x16\r\n#define QOS_FILTER_TLV_IPV6_DEST_ADDR_TYPE         0x17\r\n#define QOS_FILTER_TLV_IPV6_NEXT_HDR_PROTOCOL_TYPE 0x14  // same as IPV4\r\n#define QOS_FILTER_TLV_IPV6_TRAFFIC_CLASS_TYPE     0x19\r\n#define QOS_FILTER_TLV_IPV6_FLOW_LABEL_TYPE        0x1A\r\n\r\ntypedef struct _QOS_FILTER_TLV_IPV6_SRC_ADDR\r\n{\r\n   UCHAR  TLVType;       // 0x16\r\n   USHORT TLVLength;     // 17\r\n   UCHAR  IpSrcAddr[16];\r\n   UCHAR  IpSrcAddrPrefixLen;  // [0..128]\r\n}  QOS_FILTER_TLV_IPV6_SRC_ADDR, *PQOS_FILTER_TLV_IPV6_SRC_ADDR;\r\n\r\ntypedef struct _QOS_FILTER_TLV_IPV6_DEST_ADDR\r\n{\r\n   UCHAR  TLVType;       // 0x17\r\n   USHORT TLVLength;     // 17\r\n   UCHAR  IpDestAddr[16];\r\n   UCHAR  IpDestAddrPrefixLen;  // [0..128]\r\n}  QOS_FILTER_TLV_IPV6_DEST_ADDR, *PQOS_FILTER_TLV_IPV6_DEST_ADDR;\r\n\r\n#define QOS_FILTER_IPV6_NEXT_HDR_PROTOCOL_TCP 0x06\r\n#define QOS_FILTER_IPV6_NEXT_HDR_PROTOCOL_UDP 0x11\r\n\r\ntypedef struct _QOS_FILTER_TLV_IPV6_TRAFFIC_CLASS\r\n{\r\n   UCHAR  TLVType;       // 0x19\r\n   USHORT TLVLength;     // 2\r\n   UCHAR  TrafficClass;\r\n   UCHAR  TrafficClassMask; // compare the first 6 bits only\r\n}  QOS_FILTER_TLV_IPV6_TRAFFIC_CLASS, *PQOS_FILTER_TLV_IPV6_TRAFFIC_CLASS;\r\n\r\ntypedef struct _QOS_FILTER_TLV_IPV6_FLOW_LABEL\r\n{\r\n   UCHAR  TLVType;       // 0x1A\r\n   USHORT TLVLength;     // 4\r\n   ULONG  FlowLabel;\r\n}  QOS_FILTER_TLV_IPV6_FLOW_LABEL, *PQOS_FILTER_TLV_IPV6_FLOW_LABEL;\r\n\r\n#endif // QCQOS_IPV6\r\n#endif\r\n\r\n// ======================= WMS ==============================\r\n#define QMIWMS_SET_EVENT_REPORT_REQ           0x0001\r\n#define QMIWMS_SET_EVENT_REPORT_RESP          0x0001\r\n#define QMIWMS_EVENT_REPORT_IND               0x0001\r\n#define QMIWMS_RAW_SEND_REQ                   0x0020\r\n#define QMIWMS_RAW_SEND_RESP                  0x0020\r\n#define QMIWMS_RAW_WRITE_REQ                  0x0021\r\n#define QMIWMS_RAW_WRITE_RESP                 0x0021\r\n#define QMIWMS_RAW_READ_REQ                   0x0022\r\n#define QMIWMS_RAW_READ_RESP                  0x0022\r\n#define QMIWMS_MODIFY_TAG_REQ                 0x0023\r\n#define QMIWMS_MODIFY_TAG_RESP                0x0023\r\n#define QMIWMS_DELETE_REQ                     0x0024\r\n#define QMIWMS_DELETE_RESP                    0x0024\r\n#define QMIWMS_GET_MESSAGE_PROTOCOL_REQ       0x0030\r\n#define QMIWMS_GET_MESSAGE_PROTOCOL_RESP      0x0030\r\n#define QMIWMS_LIST_MESSAGES_REQ              0x0031\r\n#define QMIWMS_LIST_MESSAGES_RESP             0x0031\r\n#define QMIWMS_GET_SMSC_ADDRESS_REQ           0x0034\r\n#define QMIWMS_GET_SMSC_ADDRESS_RESP          0x0034\r\n#define QMIWMS_SET_SMSC_ADDRESS_REQ           0x0035\r\n#define QMIWMS_SET_SMSC_ADDRESS_RESP          0x0035\r\n#define QMIWMS_GET_STORE_MAX_SIZE_REQ         0x0036\r\n#define QMIWMS_GET_STORE_MAX_SIZE_RESP        0x0036\r\n\r\n\r\n#define WMS_MESSAGE_PROTOCOL_CDMA             0x00\r\n#define WMS_MESSAGE_PROTOCOL_WCDMA            0x01\r\n\r\n#if 0\r\ntypedef struct _QMIWMS_GET_MESSAGE_PROTOCOL_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n} QMIWMS_GET_MESSAGE_PROTOCOL_REQ_MSG, *PQMIWMS_GET_MESSAGE_PROTOCOL_REQ_MSG;\r\n\r\ntypedef struct _QMIWMS_GET_MESSAGE_PROTOCOL_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   UCHAR  MessageProtocol;\r\n} QMIWMS_GET_MESSAGE_PROTOCOL_RESP_MSG, *PQMIWMS_GET_MESSAGE_PROTOCOL_RESP_MSG;\r\n\r\ntypedef struct _QMIWMS_GET_STORE_MAX_SIZE_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  StorageType;\r\n} QMIWMS_GET_STORE_MAX_SIZE_REQ_MSG, *PQMIWMS_GET_STORE_MAX_SIZE_REQ_MSG;\r\n\r\ntypedef struct _QMIWMS_GET_STORE_MAX_SIZE_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   ULONG  MemStoreMaxSize;\r\n} QMIWMS_GET_STORE_MAX_SIZE_RESP_MSG, *PQMIWMS_GET_STORE_MAX_SIZE_RESP_MSG;\r\n\r\ntypedef struct _REQUEST_TAG\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  TagType;\r\n} REQUEST_TAG, *PREQUEST_TAG;\r\n\r\ntypedef struct _QMIWMS_LIST_MESSAGES_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  StorageType;\r\n} QMIWMS_LIST_MESSAGES_REQ_MSG, *PQMIWMS_LIST_MESSAGES_REQ_MSG;\r\n\r\ntypedef struct _QMIWMS_MESSAGE\r\n{\r\n   ULONG  MessageIndex;\r\n   UCHAR  TagType;\r\n} QMIWMS_MESSAGE, *PQMIWMS_MESSAGE;\r\n\r\ntypedef struct _QMIWMS_LIST_MESSAGES_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   ULONG  NumMessages;\r\n} QMIWMS_LIST_MESSAGES_RESP_MSG, *PQMIWMS_LIST_MESSAGES_RESP_MSG;\r\n\r\ntypedef struct _QMIWMS_RAW_READ_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  StorageType;\r\n   ULONG  MemoryIndex;\r\n} QMIWMS_RAW_READ_REQ_MSG, *PQMIWMS_RAW_READ_REQ_MSG;\r\n\r\ntypedef struct _QMIWMS_RAW_READ_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   UCHAR  TagType;\r\n   UCHAR  Format;\r\n   USHORT MessageLength;\r\n   UCHAR  Message;\r\n} QMIWMS_RAW_READ_RESP_MSG, *PQMIWMS_RAW_READ_RESP_MSG;\r\n\r\ntypedef struct _QMIWMS_MODIFY_TAG_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  StorageType;\r\n   ULONG  MemoryIndex;\r\n   UCHAR  TagType;\r\n} QMIWMS_MODIFY_TAG_REQ_MSG, *PQMIWMS_MODIFY_TAG_REQ_MSG;\r\n\r\ntypedef struct _QMIWMS_MODIFY_TAG_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n} QMIWMS_MODIFY_TAG_RESP_MSG, *PQMIWMS_MODIFY_TAG_RESP_MSG;\r\n\r\ntypedef struct _QMIWMS_RAW_SEND_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  SmsFormat;\r\n   USHORT SmsLength;\r\n   UCHAR  SmsMessage;\r\n} QMIWMS_RAW_SEND_REQ_MSG, *PQMIWMS_RAW_SEND_REQ_MSG;\r\n\r\ntypedef struct _RAW_SEND_CAUSE_CODE\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT CauseCode;\r\n} RAW_SEND_CAUSE_CODE, *PRAW_SEND_CAUSE_CODE;\r\n\r\n\r\ntypedef struct _QMIWMS_RAW_SEND_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n} QMIWMS_RAW_SEND_RESP_MSG, *PQMIWMS_RAW_SEND_RESP_MSG;\r\n\r\n\r\ntypedef struct _WMS_DELETE_MESSAGE_INDEX\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   ULONG  MemoryIndex;\r\n} WMS_DELETE_MESSAGE_INDEX, *PWMS_DELETE_MESSAGE_INDEX;\r\n\r\ntypedef struct _WMS_DELETE_MESSAGE_TAG\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  MessageTag;\r\n} WMS_DELETE_MESSAGE_TAG, *PWMS_DELETE_MESSAGE_TAG;\r\n\r\ntypedef struct _QMIWMS_DELETE_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  StorageType;\r\n} QMIWMS_DELETE_REQ_MSG, *PQMIWMS_DELETE_REQ_MSG;\r\n\r\ntypedef struct _QMIWMS_DELETE_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n} QMIWMS_DELETE_RESP_MSG, *PQMIWMS_DELETE_RESP_MSG;\r\n\r\n\r\ntypedef struct _QMIWMS_GET_SMSC_ADDRESS_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n} QMIWMS_GET_SMSC_ADDRESS_REQ_MSG, *PQMIWMS_GET_SMSC_ADDRESS_REQ_MSG;\r\n\r\ntypedef struct _QMIWMS_SMSC_ADDRESS\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  SMSCAddressType[3];\r\n   UCHAR  SMSCAddressLength;\r\n   UCHAR  SMSCAddressDigits;\r\n} QMIWMS_SMSC_ADDRESS, *PQMIWMS_SMSC_ADDRESS;\r\n\r\n\r\ntypedef struct _QMIWMS_GET_SMSC_ADDRESS_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n   UCHAR  SMSCAddress;\r\n} QMIWMS_GET_SMSC_ADDRESS_RESP_MSG, *PQMIWMS_GET_SMSC_ADDRESS_RESP_MSG;\r\n\r\ntypedef struct _QMIWMS_SET_SMSC_ADDRESS_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  SMSCAddress;\r\n} QMIWMS_SET_SMSC_ADDRESS_REQ_MSG, *PQMIWMS_SET_SMSC_ADDRESS_REQ_MSG;\r\n\r\ntypedef struct _QMIWMS_SET_SMSC_ADDRESS_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n} QMIWMS_SET_SMSC_ADDRESS_RESP_MSG, *PQMIWMS_SET_SMSC_ADDRESS_RESP_MSG;\r\n\r\ntypedef struct _QMIWMS_SET_EVENT_REPORT_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  ReportNewMessage;\r\n} QMIWMS_SET_EVENT_REPORT_REQ_MSG, *PQMIWMS_SET_EVENT_REPORT_REQ_MSG;\r\n\r\ntypedef struct _QMIWMS_SET_EVENT_REPORT_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n} QMIWMS_SET_EVENT_REPORT_RESP_MSG, *PQMIWMS_SET_EVENT_REPORT_RESP_MSG;\r\n\r\ntypedef struct _QMIWMS_EVENT_REPORT_IND_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  StorageType;\r\n   ULONG  StorageIndex;\r\n} QMIWMS_EVENT_REPORT_IND_MSG, *PQMIWMS_EVENT_REPORT_IND_MSG;\r\n#endif\r\n\r\n// ======================= End of WMS ==============================\r\n\r\n\r\n// ======================= NAS ==============================\r\n#define QMINAS_SET_EVENT_REPORT_REQ             0x0002\r\n#define QMINAS_SET_EVENT_REPORT_RESP            0x0002\r\n#define QMINAS_EVENT_REPORT_IND                 0x0002\r\n#define QMINAS_GET_SIGNAL_STRENGTH_REQ          0x0020\r\n#define QMINAS_GET_SIGNAL_STRENGTH_RESP         0x0020\r\n#define QMINAS_PERFORM_NETWORK_SCAN_REQ         0x0021\r\n#define QMINAS_PERFORM_NETWORK_SCAN_RESP        0x0021\r\n#define QMINAS_INITIATE_NW_REGISTER_REQ         0x0022\r\n#define QMINAS_INITIATE_NW_REGISTER_RESP        0x0022\r\n#define QMINAS_INITIATE_ATTACH_REQ              0x0023\r\n#define QMINAS_INITIATE_ATTACH_RESP             0x0023\r\n#define QMINAS_GET_SERVING_SYSTEM_REQ           0x0024\r\n#define QMINAS_GET_SERVING_SYSTEM_RESP          0x0024\r\n#define QMINAS_SERVING_SYSTEM_IND               0x0024\r\n#define QMINAS_GET_HOME_NETWORK_REQ             0x0025\r\n#define QMINAS_GET_HOME_NETWORK_RESP            0x0025\r\n#define QMINAS_GET_PREFERRED_NETWORK_REQ        0x0026\r\n#define QMINAS_GET_PREFERRED_NETWORK_RESP       0x0026\r\n#define QMINAS_SET_PREFERRED_NETWORK_REQ        0x0027\r\n#define QMINAS_SET_PREFERRED_NETWORK_RESP       0x0027\r\n#define QMINAS_GET_FORBIDDEN_NETWORK_REQ        0x0028\r\n#define QMINAS_GET_FORBIDDEN_NETWORK_RESP       0x0028\r\n#define QMINAS_SET_FORBIDDEN_NETWORK_REQ        0x0029\r\n#define QMINAS_SET_FORBIDDEN_NETWORK_RESP       0x0029\r\n#define QMINAS_SET_TECHNOLOGY_PREF_REQ          0x002A\r\n#define QMINAS_SET_TECHNOLOGY_PREF_RESP         0x002A\r\n#define QMINAS_GET_RF_BAND_INFO_REQ             0x0031\r\n#define QMINAS_GET_RF_BAND_INFO_RESP            0x0031\r\n#define QMINAS_GET_CELL_LOCATION_INFO_REQ  0x0043\r\n#define QMINAS_GET_CELL_LOCATION_INFO_RESP 0x0043\r\n#define QMINAS_GET_PLMN_NAME_REQ                0x0044\r\n#define QMINAS_GET_PLMN_NAME_RESP               0x0044\r\n#define QUECTEL_PACKET_TRANSFER_START_IND 0X100\r\n#define QUECTEL_PACKET_TRANSFER_END_IND 0X101\r\n#define QMINAS_GET_SYS_INFO_REQ                 0x004D\r\n#define QMINAS_GET_SYS_INFO_RESP                0x004D\r\n#define QMINAS_SYS_INFO_IND                     0x004E\r\n#define QMINAS_GET_SIG_INFO_REQ                 0x004F\r\n#define QMINAS_GET_SIG_INFO_RESP                0x004F\r\n\r\ntypedef struct _QMINAS_GET_HOME_NETWORK_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n} __attribute__ ((packed)) QMINAS_GET_HOME_NETWORK_REQ_MSG, *PQMINAS_GET_HOME_NETWORK_REQ_MSG;\r\n\r\ntypedef struct _HOME_NETWORK_SYSTEMID\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT SystemID;\r\n   USHORT NetworkID;\r\n} __attribute__ ((packed)) HOME_NETWORK_SYSTEMID, *PHOME_NETWORK_SYSTEMID;\r\n\r\ntypedef struct _HOME_NETWORK\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT MobileCountryCode;\r\n   USHORT MobileNetworkCode;\r\n   UCHAR  NetworkDesclen;\r\n   UCHAR  NetworkDesc;\r\n} __attribute__ ((packed)) HOME_NETWORK, *PHOME_NETWORK;\r\n\r\n#if 0\r\ntypedef struct _HOME_NETWORK_EXT\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT MobileCountryCode;\r\n   USHORT MobileNetworkCode;\r\n   UCHAR  NetworkDescDisp;\r\n   UCHAR  NetworkDescEncoding;\r\n   UCHAR  NetworkDesclen;\r\n   UCHAR  NetworkDesc;\r\n} HOME_NETWORK_EXT, *PHOME_NETWORK_EXT;\r\n\r\ntypedef struct _QMINAS_GET_HOME_NETWORK_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n} QMINAS_GET_HOME_NETWORK_RESP_MSG, *PQMINAS_GET_HOME_NETWORK_RESP_MSG;\r\n\r\ntypedef struct _QMINAS_GET_PREFERRED_NETWORK_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n} QMINAS_GET_PREFERRED_NETWORK_REQ_MSG, *PQMINAS_GET_PREFERRED_NETWORK_REQ_MSG;\r\n\r\n\r\ntypedef struct _PREFERRED_NETWORK\r\n{\r\n   USHORT MobileCountryCode;\r\n   USHORT MobileNetworkCode;\r\n   USHORT RadioAccess;\r\n} PREFERRED_NETWORK, *PPREFERRED_NETWORK;\r\n\r\ntypedef struct _QMINAS_GET_PREFERRED_NETWORK_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n   UCHAR  TLV2Type;         // 0x01 - required parameter\r\n   USHORT TLV2Length;       // length of the mfr string\r\n   USHORT NumPreferredNetwork;\r\n} QMINAS_GET_PREFERRED_NETWORK_RESP_MSG, *PQMINAS_GET_PREFERRED_NETWORK_RESP_MSG;\r\n\r\ntypedef struct _QMINAS_GET_FORBIDDEN_NETWORK_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n} QMINAS_GET_FORBIDDEN_NETWORK_REQ_MSG, *PQMINAS_GET_FORBIDDEN_NETWORK_REQ_MSG;\r\n\r\ntypedef struct _FORBIDDEN_NETWORK\r\n{\r\n   USHORT MobileCountryCode;\r\n   USHORT MobileNetworkCode;\r\n} FORBIDDEN_NETWORK, *PFORBIDDEN_NETWORK;\r\n\r\ntypedef struct _QMINAS_GET_FORBIDDEN_NETWORK_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n   UCHAR  TLV2Type;         // 0x01 - required parameter\r\n   USHORT TLV2Length;       // length of the mfr string\r\n   USHORT NumForbiddenNetwork;\r\n} QMINAS_GET_FORBIDDEN_NETWORK_RESP_MSG, *PQMINAS_GET_FORBIDDEN_NETWORK_RESP_MSG;\r\n\r\ntypedef struct _QMINAS_GET_SERVING_SYSTEM_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n} QMINAS_GET_SERVING_SYSTEM_REQ_MSG, *PQMINAS_GET_SERVING_SYSTEM_REQ_MSG;\r\n\r\ntypedef struct _QMINAS_ROAMING_INDICATOR_MSG\r\n{\r\n   UCHAR  TLVType;         // 0x01 - required parameter\r\n   USHORT TLVLength;       // length of the mfr string\r\n   UCHAR  RoamingIndicator;\r\n} QMINAS_ROAMING_INDICATOR_MSG, *PQMINAS_ROAMING_INDICATOR_MSG;\r\n#endif\r\n\r\ntypedef struct _QMINAS_DATA_CAP\r\n{\r\n   UCHAR  TLVType;         // 0x01 - required parameter\r\n   USHORT TLVLength;       // length of the mfr string\r\n   UCHAR  DataCapListLen;\r\n   UCHAR  DataCap;\r\n} __attribute__ ((packed)) QMINAS_DATA_CAP, *PQMINAS_DATA_CAP;\r\n\r\ntypedef struct _QMINAS_CURRENT_PLMN_MSG\r\n{\r\n   UCHAR  TLVType;         // 0x01 - required parameter\r\n   USHORT TLVLength;       // length of the mfr string\r\n   USHORT MobileCountryCode;\r\n   USHORT MobileNetworkCode;\r\n   UCHAR  NetworkDesclen;\r\n   UCHAR  NetworkDesc;\r\n} __attribute__ ((packed)) QMINAS_CURRENT_PLMN_MSG, *PQMINAS_CURRENT_PLMN_MSG;\r\n\r\ntypedef struct _QMINAS_GET_SERVING_SYSTEM_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n} __attribute__ ((packed)) QMINAS_GET_SERVING_SYSTEM_RESP_MSG, *PQMINAS_GET_SERVING_SYSTEM_RESP_MSG;\r\n\r\ntypedef struct _SERVING_SYSTEM\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  RegistrationState;\r\n   UCHAR  CSAttachedState;\r\n   UCHAR  PSAttachedState;\r\n   UCHAR  RegistredNetwork;\r\n   UCHAR  InUseRadioIF;\r\n   UCHAR  RadioIF;\r\n} __attribute__ ((packed)) SERVING_SYSTEM, *PSERVING_SYSTEM;\r\n\r\ntypedef struct _QMINAS_GET_SYS_INFO_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n} __attribute__ ((packed)) QMINAS_GET_SYS_INFO_RESP_MSG, *PQMINAS_GET_SYS_INFO_RESP_MSG;\r\n\r\ntypedef struct _QMINAS_SYS_INFO_IND_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n} __attribute__ ((packed)) QMINAS_SYS_INFO_IND_MSG, *PQMINAS_SYS_INFO_IND_MSG;\r\n\r\ntypedef struct _SERVICE_STATUS_INFO\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  SrvStatus;\r\n   UCHAR  true_srv_status;\r\n   UCHAR  IsPrefDataPath;\r\n} __attribute__ ((packed)) SERVICE_STATUS_INFO, *PSERVICE_STATUS_INFO;\r\n\r\ntypedef struct _CDMA_SYSTEM_INFO\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  SrvDomainValid;\r\n   UCHAR  SrvDomain;\r\n   UCHAR  SrvCapabilityValid;\r\n   UCHAR  SrvCapability;\r\n   UCHAR  RoamStatusValid;\r\n   UCHAR  RoamStatus;\r\n   UCHAR  IsSysForbiddenValid;\r\n   UCHAR  IsSysForbidden;\r\n   UCHAR  IsSysPrlMatchValid;\r\n   UCHAR  IsSysPrlMatch;\r\n   UCHAR  PRevInUseValid;\r\n   UCHAR  PRevInUse;\r\n   UCHAR  BSPRevValid;\r\n   UCHAR  BSPRev;\r\n   UCHAR  CCSSupportedValid;\r\n   UCHAR  CCSSupported;\r\n   UCHAR  CDMASysIdValid;\r\n   USHORT SID;\r\n   USHORT NID;\r\n   UCHAR  BSInfoValid;\r\n   USHORT BaseID;\r\n   ULONG  BaseLAT;\r\n   ULONG  BaseLONG;\r\n   UCHAR  PacketZoneValid;\r\n   USHORT PacketZone;\r\n   UCHAR  NetworkIdValid;\r\n   UCHAR  MCC[3];\r\n   UCHAR  MNC[3];\r\n} __attribute__ ((packed)) CDMA_SYSTEM_INFO, *PCDMA_SYSTEM_INFO;\r\n\r\ntypedef struct _HDR_SYSTEM_INFO\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  SrvDomainValid;\r\n   UCHAR  SrvDomain;\r\n   UCHAR  SrvCapabilityValid;\r\n   UCHAR  SrvCapability;\r\n   UCHAR  RoamStatusValid;\r\n   UCHAR  RoamStatus;\r\n   UCHAR  IsSysForbiddenValid;\r\n   UCHAR  IsSysForbidden;\r\n   UCHAR  IsSysPrlMatchValid;\r\n   UCHAR  IsSysPrlMatch;\r\n   UCHAR  HdrPersonalityValid;\r\n   UCHAR  HdrPersonality;\r\n   UCHAR  HdrActiveProtValid;\r\n   UCHAR  HdrActiveProt;\r\n   UCHAR  is856SysIdValid;\r\n   UCHAR  is856SysId[16];\r\n} __attribute__ ((packed)) HDR_SYSTEM_INFO, *PHDR_SYSTEM_INFO;\r\n\r\ntypedef struct _GSM_SYSTEM_INFO\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  SrvDomainValid;\r\n   UCHAR  SrvDomain;\r\n   UCHAR  SrvCapabilityValid;\r\n   UCHAR  SrvCapability;\r\n   UCHAR  RoamStatusValid;\r\n   UCHAR  RoamStatus;\r\n   UCHAR  IsSysForbiddenValid;\r\n   UCHAR  IsSysForbidden;\r\n   UCHAR  LacValid;\r\n   USHORT Lac;\r\n   UCHAR  CellIdValid;\r\n   ULONG  CellId;\r\n   UCHAR  RegRejectInfoValid;\r\n   UCHAR  RejectSrvDomain;\r\n   UCHAR  RejCause;\r\n   UCHAR  NetworkIdValid;\r\n   UCHAR  MCC[3];\r\n   UCHAR  MNC[3];\r\n   UCHAR  EgprsSuppValid;\r\n   UCHAR  EgprsSupp;\r\n   UCHAR  DtmSuppValid;\r\n   UCHAR  DtmSupp;\r\n} __attribute__ ((packed)) GSM_SYSTEM_INFO, *PGSM_SYSTEM_INFO;\r\n\r\ntypedef struct _WCDMA_SYSTEM_INFO\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  SrvDomainValid;\r\n   UCHAR  SrvDomain;\r\n   UCHAR  SrvCapabilityValid;\r\n   UCHAR  SrvCapability;\r\n   UCHAR  RoamStatusValid;\r\n   UCHAR  RoamStatus;\r\n   UCHAR  IsSysForbiddenValid;\r\n   UCHAR  IsSysForbidden;\r\n   UCHAR  LacValid;\r\n   USHORT Lac;\r\n   UCHAR  CellIdValid;\r\n   ULONG  CellId;\r\n   UCHAR  RegRejectInfoValid;\r\n   UCHAR  RejectSrvDomain;\r\n   UCHAR  RejCause;\r\n   UCHAR  NetworkIdValid;\r\n   UCHAR  MCC[3];\r\n   UCHAR  MNC[3];\r\n   UCHAR  HsCallStatusValid;\r\n   UCHAR  HsCallStatus;\r\n   UCHAR  HsIndValid;\r\n   UCHAR  HsInd;\r\n   UCHAR  PscValid;\r\n   UCHAR  Psc;\r\n} __attribute__ ((packed)) WCDMA_SYSTEM_INFO, *PWCDMA_SYSTEM_INFO;\r\n\r\ntypedef struct _LTE_SYSTEM_INFO\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  SrvDomainValid;\r\n   UCHAR  SrvDomain;\r\n   UCHAR  SrvCapabilityValid;\r\n   UCHAR  SrvCapability;\r\n   UCHAR  RoamStatusValid;\r\n   UCHAR  RoamStatus;\r\n   UCHAR  IsSysForbiddenValid;\r\n   UCHAR  IsSysForbidden;\r\n   UCHAR  LacValid;\r\n   USHORT Lac;\r\n   UCHAR  CellIdValid;\r\n   ULONG  CellId;\r\n   UCHAR  RegRejectInfoValid;\r\n   UCHAR  RejectSrvDomain;\r\n   UCHAR  RejCause;\r\n   UCHAR  NetworkIdValid;\r\n   UCHAR  MCC[3];\r\n   UCHAR  MNC[3];\r\n   UCHAR  TacValid;\r\n   USHORT Tac;\r\n} __attribute__ ((packed)) LTE_SYSTEM_INFO, *PLTE_SYSTEM_INFO;\r\n\r\ntypedef struct _TDSCDMA_SYSTEM_INFO\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  SrvDomainValid;\r\n   UCHAR  SrvDomain;\r\n   UCHAR  SrvCapabilityValid;\r\n   UCHAR  SrvCapability;\r\n   UCHAR  RoamStatusValid;\r\n   UCHAR  RoamStatus;\r\n   UCHAR  IsSysForbiddenValid;\r\n   UCHAR  IsSysForbidden;\r\n   UCHAR  LacValid;\r\n   USHORT Lac;\r\n   UCHAR  CellIdValid;\r\n   ULONG  CellId;\r\n   UCHAR  RegRejectInfoValid;\r\n   UCHAR  RejectSrvDomain;\r\n   UCHAR  RejCause;\r\n   UCHAR  NetworkIdValid;\r\n   UCHAR  MCC[3];\r\n   UCHAR  MNC[3];\r\n   UCHAR  HsCallStatusValid;\r\n   UCHAR  HsCallStatus;\r\n   UCHAR  HsIndValid;\r\n   UCHAR  HsInd;\r\n   UCHAR  CellParameterIdValid;\r\n   USHORT CellParameterId;\r\n   UCHAR  CellBroadcastCapValid;\r\n   ULONG  CellBroadcastCap;\r\n   UCHAR  CsBarStatusValid;\r\n   ULONG  CsBarStatus;\r\n   UCHAR  PsBarStatusValid;\r\n   ULONG  PsBarStatus;\r\n   UCHAR  CipherDomainValid;\r\n   UCHAR  CipherDomain;\r\n} __attribute__ ((packed)) TDSCDMA_SYSTEM_INFO, *PTDSCDMA_SYSTEM_INFO;\r\n\r\ntypedef enum {\r\n  NAS_SYS_SRV_STATUS_NO_SRV_V01 = 0, \r\n  NAS_SYS_SRV_STATUS_LIMITED_V01 = 1, \r\n  NAS_SYS_SRV_STATUS_SRV_V01 = 2, \r\n  NAS_SYS_SRV_STATUS_LIMITED_REGIONAL_V01 = 3, \r\n  NAS_SYS_SRV_STATUS_PWR_SAVE_V01 = 4, \r\n}nas_service_status_enum_type_v01;\r\n\r\ntypedef enum {\r\n  SYS_SRV_DOMAIN_NO_SRV_V01 = 0, \r\n  SYS_SRV_DOMAIN_CS_ONLY_V01 = 1, \r\n  SYS_SRV_DOMAIN_PS_ONLY_V01 = 2, \r\n  SYS_SRV_DOMAIN_CS_PS_V01 = 3, \r\n  SYS_SRV_DOMAIN_CAMPED_V01 = 4, \r\n}nas_service_domain_enum_type_v01;\r\n\r\ntypedef enum {\r\n    QMI_NAS_RADIO_INTERFACE_UNKNOWN     = -1,\r\n    QMI_NAS_RADIO_INTERFACE_NONE        = 0x00,\r\n    QMI_NAS_RADIO_INTERFACE_CDMA_1X     = 0x01,\r\n    QMI_NAS_RADIO_INTERFACE_CDMA_1XEVDO = 0x02,\r\n    QMI_NAS_RADIO_INTERFACE_AMPS        = 0x03,\r\n    QMI_NAS_RADIO_INTERFACE_GSM         = 0x04,\r\n    QMI_NAS_RADIO_INTERFACE_UMTS        = 0x05,\r\n    QMI_NAS_RADIO_INTERFACE_LTE         = 0x08,\r\n    QMI_NAS_RADIO_INTERFACE_TD_SCDMA    = 0x09,\r\n    QMI_NAS_RADIO_INTERFACE_5GNR        = 0x0C,\r\n} QMI_NAS_RADIO_INTERFACE_E;\r\n\r\ntypedef enum {\r\n    QMI_NAS_ACTIVE_BAND_BC_0 = 0,\r\n    QMI_NAS_ACTIVE_BAND_BC_1 = 1,\r\n    QMI_NAS_ACTIVE_BAND_BC_2 = 2,\r\n    QMI_NAS_ACTIVE_BAND_BC_3 = 3,\r\n    QMI_NAS_ACTIVE_BAND_BC_4 = 4,\r\n    QMI_NAS_ACTIVE_BAND_BC_5 = 5,\r\n    QMI_NAS_ACTIVE_BAND_BC_6 = 6,\r\n    QMI_NAS_ACTIVE_BAND_BC_7 = 7,\r\n    QMI_NAS_ACTIVE_BAND_BC_8 = 8,\r\n    QMI_NAS_ACTIVE_BAND_BC_9 = 9,\r\n    QMI_NAS_ACTIVE_BAND_BC_10 = 10,\r\n    QMI_NAS_ACTIVE_BAND_BC_11 = 11,\r\n    QMI_NAS_ACTIVE_BAND_BC_12 = 12,\r\n    QMI_NAS_ACTIVE_BAND_BC_13 = 13,\r\n    QMI_NAS_ACTIVE_BAND_BC_14 = 14,\r\n    QMI_NAS_ACTIVE_BAND_BC_15 = 15,\r\n    QMI_NAS_ACTIVE_BAND_BC_16 = 16,\r\n    QMI_NAS_ACTIVE_BAND_BC_17 = 17,\r\n    QMI_NAS_ACTIVE_BAND_BC_18 = 18,\r\n    QMI_NAS_ACTIVE_BAND_BC_19 = 19,\r\n    QMI_NAS_ACTIVE_BAND_GSM_450 = 40,\r\n    QMI_NAS_ACTIVE_BAND_GSM_480 = 41,\r\n    QMI_NAS_ACTIVE_BAND_GSM_750 = 42,\r\n    QMI_NAS_ACTIVE_BAND_GSM_850 = 43,\r\n    QMI_NAS_ACTIVE_BAND_GSM_900_EXTENDED = 44,\r\n    QMI_NAS_ACTIVE_BAND_GSM_900_PRIMARY = 45,\r\n    QMI_NAS_ACTIVE_BAND_GSM_900_RAILWAYS = 46,\r\n    QMI_NAS_ACTIVE_BAND_GSM_DCS_1800 = 47,\r\n    QMI_NAS_ACTIVE_BAND_GSM_PCS_1900 = 48,\r\n    QMI_NAS_ACTIVE_BAND_WCDMA_2100 = 80,\r\n    QMI_NAS_ACTIVE_BAND_WCDMA_PCS_1900 = 81,\r\n    QMI_NAS_ACTIVE_BAND_WCDMA_DCS_1800 = 82,\r\n    QMI_NAS_ACTIVE_BAND_WCDMA_1700_US = 83,\r\n    QMI_NAS_ACTIVE_BAND_WCDMA_850 = 84,\r\n    QMI_NAS_ACTIVE_BAND_WCDMA_800 = 85,\r\n    QMI_NAS_ACTIVE_BAND_WCDMA_2600 = 86,\r\n    QMI_NAS_ACTIVE_BAND_WCDMA_900 = 87,\r\n    QMI_NAS_ACTIVE_BAND_WCDMA_1700_JAPAN = 88,\r\n    QMI_NAS_ACTIVE_BAND_WCDMA_1500_JAPAN = 90,\r\n    QMI_NAS_ACTIVE_BAND_WCDMA_850_JAPAN = 91,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_1 = 120,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_2 = 121,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_3 = 122,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_4 = 123,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_5 = 124,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_6 = 125,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_7 = 126,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_8 = 127,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_9 = 128,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_10 = 129,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_11 = 130,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_12 = 131,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_13 = 132,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_14 = 133,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_17 = 134,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_18 = 143,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_19 = 144,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_20 = 145,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_21 = 146,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_23 = 152,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_24 = 147,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_25 = 148,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_26 = 153,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_27 = 164,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_28 = 158,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_29 = 159,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_30 = 160,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_31 = 165,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_32 = 154,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_33 = 135,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_34 = 136,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_35 = 137,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_36 = 138,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_37 = 139,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_38 = 140,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_39 = 141,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_40 = 142,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_41 = 149,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_42 = 150,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_43 = 151,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_46 = 163,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_47 = 166,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_48 = 167,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_66 = 161,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_71 = 168,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_125 = 155,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_126 = 156,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_127 = 157,\r\n    QMI_NAS_ACTIVE_BAND_EUTRAN_250 = 162,\r\n    QMI_NAS_ACTIVE_BAND_TDSCDMA_A = 200,\r\n    QMI_NAS_ACTIVE_BAND_TDSCDMA_B = 201,\r\n    QMI_NAS_ACTIVE_BAND_TDSCDMA_C = 202,\r\n    QMI_NAS_ACTIVE_BAND_TDSCDMA_D = 203,\r\n    QMI_NAS_ACTIVE_BAND_TDSCDMA_E = 204,\r\n    QMI_NAS_ACTIVE_BAND_TDSCDMA_F = 205,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_1  = 250,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_2  = 251,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_3  = 252,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_5  = 253,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_7  = 254,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_8  = 255,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_20 = 256,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_28 = 257,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_38 = 258,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_41 = 259,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_50 = 260,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_51 = 261,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_66 = 262,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_70 = 263,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_71 = 264,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_74 = 265,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_75 = 266,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_76 = 267,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_77 = 268,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_78 = 269,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_79 = 270,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_80 = 271,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_81 = 272,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_82 = 273,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_83 = 274,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_84 = 275,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_85 = 276,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_257= 277,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_258= 278,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_259= 279,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_260= 280,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_261= 281,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_12 = 282,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_25 = 283,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_34 = 284,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_39 = 285,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_40 = 286,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_65 = 287,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_86 = 288,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_48 = 289,\r\n    QMI_NAS_ACTIVE_BAND_NR5G_BAND_14 = 290\r\n} QMI_NAS_ACTIVE_BAND_E;\r\n\r\ntypedef struct {\r\n  UCHAR  TLVType;\r\n  USHORT TLVLength;\r\n\r\n  uint8_t srv_domain_valid;\r\n  uint8_t srv_domain;\r\n  uint8_t srv_capability_valid;\r\n  uint8_t srv_capability;\r\n  uint8_t roam_status_valid;\r\n  uint8_t roam_status;\r\n  uint8_t is_sys_forbidden_valid;\r\n  uint8_t is_sys_forbidden;\r\n\r\n  uint8_t lac_valid;\r\n  uint16_t lac;\r\n  uint8_t cell_id_valid;\r\n  uint32_t cell_id;\r\n  uint8_t reg_reject_info_valid;\r\n  uint8_t reject_srv_domain;\r\n  uint8_t rej_cause;\r\n  uint8_t network_id_valid;\r\n  UCHAR MCC[3];\r\n  UCHAR MNC[3];\r\n\r\n  uint8_t tac_valid;\r\n  uint16_t tac;\r\n} __attribute__ ((packed)) NR5G_SYSTEM_INFO, *PNR5G_SYSTEM_INFO;\r\n\r\n#if 0\r\ntypedef struct _QMINAS_SERVING_SYSTEM_IND_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n} QMINAS_SERVING_SYSTEM_IND_MSG, *PQMINAS_SERVING_SYSTEM_IND_MSG;\r\n\r\ntypedef struct _QMINAS_SET_PREFERRED_NETWORK_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT NumPreferredNetwork;\r\n   USHORT MobileCountryCode;\r\n   USHORT MobileNetworkCode;\r\n   USHORT RadioAccess;\r\n} QMINAS_SET_PREFERRED_NETWORK_REQ_MSG, *PQMINAS_SET_PREFERRED_NETWORK_REQ_MSG;\r\n\r\ntypedef struct _QMINAS_SET_PREFERRED_NETWORK_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n} QMINAS_SET_PREFERRED_NETWORK_RESP_MSG, *PQMINAS_SET_PREFERRED_NETWORK_RESP_MSG;\r\n\r\ntypedef struct _QMINAS_SET_FORBIDDEN_NETWORK_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT NumForbiddenNetwork;\r\n   USHORT MobileCountryCode;\r\n   USHORT MobileNetworkCode;\r\n} QMINAS_SET_FORBIDDEN_NETWORK_REQ_MSG, *PQMINAS_SET_FORBIDDEN_NETWORK_REQ_MSG;\r\n\r\ntypedef struct _QMINAS_SET_FORBIDDEN_NETWORK_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n} QMINAS_SET_FORBIDDEN_NETWORK_RESP_MSG, *PQMINAS_SET_FORBIDDEN_NETWORK_RESP_MSG;\r\n\r\ntypedef struct _QMINAS_PERFORM_NETWORK_SCAN_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n} QMINAS_PERFORM_NETWORK_SCAN_REQ_MSG, *PQMINAS_PERFORM_NETWORK_SCAN_REQ_MSG;\r\n\r\ntypedef struct _VISIBLE_NETWORK\r\n{\r\n   USHORT MobileCountryCode;\r\n   USHORT MobileNetworkCode;\r\n   UCHAR  NetworkStatus;\r\n   UCHAR  NetworkDesclen;\r\n} VISIBLE_NETWORK, *PVISIBLE_NETWORK;\r\n\r\ntypedef struct _QMINAS_PERFORM_NETWORK_SCAN_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n} QMINAS_PERFORM_NETWORK_SCAN_RESP_MSG, *PQMINAS_PERFORM_NETWORK_SCAN_RESP_MSG;\r\n\r\ntypedef struct _QMINAS_PERFORM_NETWORK_SCAN_NETWORK_INFO\r\n{\r\n   UCHAR  TLVType;         // 0x010 - required parameter\r\n   USHORT TLVLength;       // length\r\n   USHORT NumNetworkInstances;\r\n} QMINAS_PERFORM_NETWORK_SCAN_NETWORK_INFO, *PQMINAS_PERFORM_NETWORK_SCAN_NETWORK_INFO;\r\n\r\ntypedef struct _QMINAS_PERFORM_NETWORK_SCAN_RAT_INFO\r\n{\r\n   UCHAR  TLVType;         // 0x011 - required parameter\r\n   USHORT TLVLength;       // length\r\n   USHORT NumInst;\r\n} QMINAS_PERFORM_NETWORK_SCAN_RAT_INFO, *PQMINAS_PERFORM_NETWORK_SCAN_RAT_INFO;\r\n\r\ntypedef struct _QMINAS_PERFORM_NETWORK_SCAN_RAT\r\n{\r\n   USHORT MCC;\r\n   USHORT MNC;\r\n   UCHAR  RAT;\r\n} QMINAS_PERFORM_NETWORK_SCAN_RAT, *PQMINAS_PERFORM_NETWORK_SCAN_RAT;\r\n\r\n\r\ntypedef struct _QMINAS_MANUAL_NW_REGISTER\r\n{\r\n   UCHAR  TLV2Type;          // 0x02 - result code\r\n   USHORT TLV2Length;        // 4\r\n   USHORT MobileCountryCode;\r\n   USHORT MobileNetworkCode;\r\n   UCHAR  RadioAccess;\r\n} QMINAS_MANUAL_NW_REGISTER, *PQMINAS_MANUAL_NW_REGISTER;\r\n\r\ntypedef struct _QMINAS_INITIATE_NW_REGISTER_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   UCHAR  RegisterAction;\r\n} QMINAS_INITIATE_NW_REGISTER_REQ_MSG, *PQMINAS_INITIATE_NW_REGISTER_REQ_MSG;\r\n\r\ntypedef struct _QMINAS_INITIATE_NW_REGISTER_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n} QMINAS_INITIATE_NW_REGISTER_RESP_MSG, *PQMINAS_INITIATE_NW_REGISTER_RESP_MSG;\r\n\r\ntypedef struct _QMINAS_SET_TECHNOLOGY_PREF_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT TechPref;\r\n   UCHAR  Duration;\r\n} QMINAS_SET_TECHNOLOGY_PREF_REQ_MSG, *PQMINAS_SET_TECHNOLOGY_PREF_REQ_MSG;\r\n\r\ntypedef struct _QMINAS_SET_TECHNOLOGY_PREF_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n} QMINAS_SET_TECHNOLOGY_PREF_RESP_MSG, *PQMINAS_SET_TECHNOLOGY_PREF_RESP_MSG;\r\n\r\ntypedef struct _QMINAS_GET_SIGNAL_STRENGTH_REQ_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n} QMINAS_GET_SIGNAL_STRENGTH_REQ_MSG, *PQMINAS_GET_SIGNAL_STRENGTH_REQ_MSG;\r\n\r\ntypedef struct _QMINAS_SIGNAL_STRENGTH\r\n{\r\n   CHAR   SigStrength;\r\n   UCHAR  RadioIf;\r\n} QMINAS_SIGNAL_STRENGTH, *PQMINAS_SIGNAL_STRENGTH;\r\n\r\ntypedef struct _QMINAS_SIGNAL_STRENGTH_LIST\r\n{\r\n   UCHAR  TLV3Type;\r\n   USHORT TLV3Length;\r\n   USHORT NumInstance;\r\n} QMINAS_SIGNAL_STRENGTH_LIST, *PQMINAS_SIGNAL_STRENGTH_LIST;\r\n\r\n\r\ntypedef struct _QMINAS_GET_SIGNAL_STRENGTH_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   CHAR   SignalStrength;\r\n   UCHAR  RadioIf;\r\n} QMINAS_GET_SIGNAL_STRENGTH_RESP_MSG, *PQMINAS_GET_SIGNAL_STRENGTH_RESP_MSG;\r\n\r\n\r\ntypedef struct _QMINAS_SET_EVENT_REPORT_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  ReportSigStrength;\r\n   UCHAR  NumTresholds;\r\n   CHAR   TresholdList[2];\r\n} QMINAS_SET_EVENT_REPORT_REQ_MSG, *PQMINAS_SET_EVENT_REPORT_REQ_MSG;\r\n\r\ntypedef struct _QMINAS_SET_EVENT_REPORT_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n} QMINAS_SET_EVENT_REPORT_RESP_MSG, *PQMINAS_SET_EVENT_REPORT_RESP_MSG;\r\n\r\ntypedef struct _QMINAS_SIGNAL_STRENGTH_TLV\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   CHAR   SigStrength;\r\n   UCHAR  RadioIf;\r\n} QMINAS_SIGNAL_STRENGTH_TLV, *PQMINAS_SIGNAL_STRENGTH_TLV;\r\n\r\ntypedef struct _QMINAS_REJECT_CAUSE_TLV\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  ServiceDomain;\r\n   USHORT RejectCause;\r\n} QMINAS_REJECT_CAUSE_TLV, *PQMINAS_REJECT_CAUSE_TLV;\r\n\r\ntypedef struct _QMINAS_EVENT_REPORT_IND_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n} QMINAS_EVENT_REPORT_IND_MSG, *PQMINAS_EVENT_REPORT_IND_MSG;\r\n\r\ntypedef struct _QMINAS_GET_RF_BAND_INFO_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n} QMINAS_GET_RF_BAND_INFO_REQ_MSG, *PQMINAS_GET_RF_BAND_INFO_REQ_MSG;\r\n\r\ntypedef struct _QMINASRF_BAND_INFO\r\n{\r\n   UCHAR  RadioIf;\r\n   USHORT ActiveBand;\r\n   USHORT ActiveChannel;\r\n} QMINASRF_BAND_INFO, *PQMINASRF_BAND_INFO;\r\n\r\ntypedef struct _QMINAS_GET_RF_BAND_INFO_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   UCHAR  NumInstances;\r\n} QMINAS_GET_RF_BAND_INFO_RESP_MSG, *PQMINAS_GET_RF_BAND_INFO_RESP_MSG;\r\n\r\n\r\ntypedef struct _QMINAS_GET_PLMN_NAME_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT MCC;\r\n   USHORT MNC;\r\n} QMINAS_GET_PLMN_NAME_REQ_MSG, *PQMINAS_GET_PLMN_NAME_REQ_MSG;\r\n\r\ntypedef struct _QMINAS_GET_PLMN_NAME_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;       // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;        // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n} QMINAS_GET_PLMN_NAME_RESP_MSG, *PQMINAS_GET_PLMN_NAME_RESP_MSG;\r\n\r\ntypedef struct _QMINAS_GET_PLMN_NAME_SPN\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  SPN_Enc;\r\n   UCHAR  SPN_Len;\r\n} QMINAS_GET_PLMN_NAME_SPN, *PQMINAS_GET_PLMN_NAME_SPN;\r\n\r\ntypedef struct _QMINAS_GET_PLMN_NAME_PLMN\r\n{\r\n   UCHAR  PLMN_Enc;\r\n   UCHAR  PLMN_Ci;\r\n   UCHAR  PLMN_SpareBits;\r\n   UCHAR  PLMN_Len;\r\n} QMINAS_GET_PLMN_NAME_PLMN, *PQMINAS_GET_PLMN_NAME_PLMN;\r\n\r\ntypedef struct _QMINAS_INITIATE_ATTACH_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  PsAttachAction;\r\n} QMINAS_INITIATE_ATTACH_REQ_MSG, *PQMINAS_INITIATE_ATTACH_REQ_MSG;\r\n\r\ntypedef struct _QMINAS_INITIATE_ATTACH_RESP_MSG\r\n{\r\n   USHORT Type;             // QMUX type 0x0003\r\n   USHORT Length;\r\n   UCHAR  TLVType;          // 0x02 - result code\r\n   USHORT TLVLength;        // 4\r\n   USHORT QMUXResult;      // QMI_RESULT_SUCCESS\r\n                            // QMI_RESULT_FAILURE\r\n   USHORT QMUXError;       // QMI_ERR_INVALID_ARG\r\n                            // QMI_ERR_NO_MEMORY\r\n                            // QMI_ERR_INTERNAL\r\n                            // QMI_ERR_FAULT\r\n} QMINAS_INITIATE_ATTACH_RESP_MSG, *PQMINAS_INITIATE_ATTACH_RESP_MSG;\r\n#endif\r\ntypedef struct {\r\n    UCHAR  TLVType;\r\n    USHORT TLVLength;\r\n    CHAR rssi;\r\n    SHORT ecio;\r\n} __attribute__ ((packed)) QMINAS_SIG_INFO_CDMA_TLV_MSG, *PQMINAS_SIG_INFO_CDMA_TLV_MSG;\r\n\r\ntypedef struct {\r\n    UCHAR  TLVType;\r\n    USHORT TLVLength;\r\n    CHAR rssi;\r\n    SHORT ecio;\r\n    CHAR sinr;\r\n    INT io;\r\n} __attribute__ ((packed)) QMINAS_SIG_INFO_HDR_TLV_MSG, *PQMINAS_SIG_INFO_HDR_TLV_MSG;\r\n\r\ntypedef struct {\r\n    UCHAR  TLVType;\r\n    USHORT TLVLength;\r\n    CHAR rssi;\r\n} __attribute__ ((packed)) QMINAS_SIG_INFO_GSM_TLV_MSG, *PQMINAS_SIG_INFO_GSM_TLV_MSG;\r\n\r\ntypedef struct {\r\n    UCHAR  TLVType;\r\n    USHORT TLVLength;\r\n    CHAR rssi;\r\n    SHORT ecio;\r\n} __attribute__ ((packed)) QMINAS_SIG_INFO_WCDMA_TLV_MSG, *PQMINAS_SIG_INFO_WCDMA_TLV_MSG;\r\n\r\ntypedef struct {\r\n    UCHAR  TLVType;\r\n    USHORT TLVLength;\r\n    CHAR rssi;\r\n    CHAR rsrq;\r\n    SHORT rsrp;\r\n    SHORT snr;\r\n} __attribute__ ((packed)) QMINAS_SIG_INFO_LTE_TLV_MSG, *PQMINAS_SIG_INFO_LTE_TLV_MSG;\r\n\r\ntypedef struct {\r\n    UCHAR  TLVType;\r\n    USHORT TLVLength;\r\n    CHAR rscp;\r\n} __attribute__ ((packed)) QMINAS_SIG_INFO_TDSCDMA_TLV_MSG, *PQMINAS_SIG_INFO_TDSCDMA_TLV_MSG;\r\n\r\ntypedef struct {\r\n    UCHAR  TLVType;\r\n    USHORT TLVLength;\r\n    SHORT rsrp;\r\n    SHORT snr;\r\n} __attribute__ ((packed)) QMINAS_SIG_INFO_5G_NSA_TLV_MSG, *PQMINAS_SIG_INFO_5G_NSA_TLV_MSG;\r\n\r\ntypedef struct {\r\n    UCHAR  TLVType;\r\n    USHORT TLVLength;\r\n    SHORT nr5g_rsrq;\r\n} __attribute__ ((packed)) QMINAS_SIG_INFO_5G_SA_TLV_MSG, *PQMINAS_SIG_INFO_5G_SA_TLV_MSG;\r\n\r\ntypedef struct {\r\n    uint8 radio_if;\r\n    uint16 active_band;\r\n    uint16 active_channel;\r\n} __attribute__ ((packed)) NasGetRfBandInfo;\r\n\r\ntypedef struct {\r\n    UCHAR  TLVType;\r\n    USHORT TLVLength;\r\n\r\n    uint8 num_instances;\r\n    NasGetRfBandInfo bands_array[0];\r\n} __attribute__ ((packed)) NasGetRfBandInfoList;\r\n\r\ntypedef struct {\r\n    uint8 radio_if;\r\n    uint16 dedicated_band;\r\n} __attribute__ ((packed)) NasGetRfBandInfoDedicated;\r\n\r\ntypedef struct {\r\n    UCHAR  TLVType;\r\n    USHORT TLVLength;\r\n\r\n    uint8 num_instances;\r\n    NasGetRfBandInfoDedicated bands_array[0];\r\n} __attribute__ ((packed)) NasGetRfBandInfoDedicatedList;\r\n\r\ntypedef struct {\r\n    uint8 radio_if;\r\n    uint16 active_band;\r\n    uint32 active_channel;\r\n} __attribute__ ((packed)) NasGetRfBandInfoExtended;\r\n\r\ntypedef struct {\r\n    UCHAR  TLVType;\r\n    USHORT TLVLength;\r\n\r\n    uint8 num_instances;\r\n    NasGetRfBandInfoExtended bands_array[0];\r\n} __attribute__ ((packed)) NasGetRfBandInfoExtendedList;\r\n\r\ntypedef struct {\r\n    uint8 radio_if;\r\n    uint32 bandwidth;\r\n} __attribute__ ((packed)) NasGetRfBandInfoBandWidth;\r\n\r\ntypedef struct {\r\n    UCHAR  TLVType;\r\n    USHORT TLVLength;\r\n\r\n    uint8 num_instances;\r\n    NasGetRfBandInfoBandWidth bands_array[0];\r\n} __attribute__ ((packed)) NasGetRfBandInfoBandWidthList;\r\n\r\ntypedef struct {\r\n    UCHAR  TLVType;\r\n    USHORT TLVLength;\r\n\r\n    uint8 plmn[3];\r\n    uint8 tac[3];\r\n    uint64 global_cell_id;\r\n    uint16 physical_cell_id;\r\n    int16 rsrq;\r\n    int16 rsrp;\r\n    int16 snr;\r\n} __attribute__ ((packed)) NasGetCellLocationNr5gServingCell;\r\n\r\ntypedef struct {\r\n    uint16 physical_cell_id;\r\n    int16 rsrq;\r\n    int16 rsrp;\r\n    int16 rssi;\r\n    int16 cell_selection_rx_level;\r\n} __attribute__ ((packed)) NasGetCellLocationLteInfoCell;\r\n\r\ntypedef struct {\r\n    UCHAR  TLVType;\r\n    USHORT TLVLength;\r\n\r\n    uint8 ue_in_idle;\r\n    uint8 plmn[3];\r\n    uint16 tracking_area_code;\r\n    uint32 global_cell_id;\r\n    uint16 absolute_rf_channel_number;\r\n    uint16 serving_cell_id;\r\n    uint8 cell_reselection_priority;\r\n    uint8 s_non_intra_search_threshold;\r\n    uint8 serving_cell_low_threshold;\r\n    uint8 s_intra_search_threshold;\r\n    uint8 cells_len;\r\n    NasGetCellLocationLteInfoCell cells_array[0];\r\n} __attribute__ ((packed)) NasGetCellLocationLteInfoIntrafrequency;\r\n\r\ntypedef struct _QmiMessageNasGetCellLocationInfoOutputInterfrequencyLteInfoFrequencyElement {\r\n    uint16 eutra_absolute_rf_channel_number;\r\n    uint8 cell_selection_rx_level_low_threshold;\r\n    uint8 cell_selection_rx_level_high_threshold;\r\n    uint8 cell_reselection_priority;\r\n    uint8 cells_len;\r\n    NasGetCellLocationLteInfoCell cells_array[0];\r\n} __attribute__ ((packed)) NasGetCellLocationLteInfoInterfrequencyFrequencyElement;\r\n\r\ntypedef struct {\r\n    UCHAR  TLVType;\r\n    USHORT TLVLength;\r\n\r\n    uint8 ue_in_idle;\r\n    uint8 freqs_len;\r\n    NasGetCellLocationLteInfoInterfrequencyFrequencyElement freqs[0];\r\n} __attribute__ ((packed)) NasGetCellLocationLteInfoInterfrequency;\r\n\r\n// ======================= End of NAS ==============================\r\n\r\n// ======================= UIM ==============================\r\n#define QMIUIM_READ_TRANSPARENT_REQ      0x0020\r\n#define QMIUIM_READ_TRANSPARENT_RESP     0x0020\r\n#define QMIUIM_READ_TRANSPARENT_IND      0x0020\r\n#define QMIUIM_READ_RECORD_REQ           0x0021\r\n#define QMIUIM_READ_RECORD_RESP          0x0021\r\n#define QMIUIM_READ_RECORD_IND           0x0021\r\n#define QMIUIM_WRITE_TRANSPARENT_REQ     0x0022\r\n#define QMIUIM_WRITE_TRANSPARENT_RESP    0x0022\r\n#define QMIUIM_WRITE_TRANSPARENT_IND     0x0022\r\n#define QMIUIM_WRITE_RECORD_REQ          0x0023\r\n#define QMIUIM_WRITE_RECORD_RESP         0x0023\r\n#define QMIUIM_WRITE_RECORD_IND          0x0023\r\n#define QMIUIM_SET_PIN_PROTECTION_REQ    0x0025\r\n#define QMIUIM_SET_PIN_PROTECTION_RESP   0x0025\r\n#define QMIUIM_SET_PIN_PROTECTION_IND    0x0025\r\n#define QMIUIM_VERIFY_PIN_REQ            0x0026\r\n#define QMIUIM_VERIFY_PIN_RESP           0x0026\r\n#define QMIUIM_VERIFY_PIN_IND            0x0026\r\n#define QMIUIM_UNBLOCK_PIN_REQ           0x0027\r\n#define QMIUIM_UNBLOCK_PIN_RESP          0x0027\r\n#define QMIUIM_UNBLOCK_PIN_IND           0x0027\r\n#define QMIUIM_CHANGE_PIN_REQ            0x0028\r\n#define QMIUIM_CHANGE_PIN_RESP           0x0028\r\n#define QMIUIM_CHANGE_PIN_IND            0x0028\r\n#define QMIUIM_DEPERSONALIZATION_REQ     0x0029\r\n#define QMIUIM_DEPERSONALIZATION_RESP    0x0029\r\n#define QMIUIM_EVENT_REG_REQ             0x002E\r\n#define QMIUIM_EVENT_REG_RESP            0x002E\r\n#define QMIUIM_GET_CARD_STATUS_REQ       0x002F\r\n#define QMIUIM_GET_CARD_STATUS_RESP      0x002F\r\n#define QMIUIM_STATUS_CHANGE_IND         0x0032\r\n#define QMIUIM_POWER_DOWN                0x0030\r\n#define QMIUIM_POWER_UP                  0x0031\r\n\r\n\r\ntypedef struct _QMIUIM_GET_CARD_STATUS_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n} __attribute__ ((packed)) QMIUIM_GET_CARD_STATUS_RESP_MSG, *PQMIUIM_GET_CARD_STATUS_RESP_MSG;\r\n\r\n#define UIM_CARD_STATE_ABSENT     0x00\r\n#define UIM_CARD_STATE_PRESENT    0x01\r\n#define UIM_CARD_STATE_ERROR      0x02\r\n\r\ntypedef struct _QMIUIM_CARD_STATUS\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT IndexGWPri;\r\n   USHORT Index1XPri;\r\n   USHORT IndexGWSec;\r\n   USHORT Index1XSec;\r\n   UCHAR  NumSlot;\r\n   UCHAR  CardState;\r\n   UCHAR  UPINState;\r\n   UCHAR  UPINRetries;\r\n   UCHAR  UPUKRetries;\r\n   UCHAR  ErrorCode;\r\n   UCHAR  NumApp;\r\n   UCHAR  AppType;\r\n   UCHAR  AppState;\r\n   UCHAR  PersoState;\r\n   UCHAR  PersoFeature;\r\n   UCHAR  PersoRetries;\r\n   UCHAR  PersoUnblockRetries;\r\n   UCHAR  AIDLength;\r\n} __attribute__ ((packed)) QMIUIM_CARD_STATUS, *PQMIUIM_CARD_STATUS;\r\n\r\ntypedef struct _QMIUIM_PIN_STATE\r\n{\r\n   UCHAR  UnivPIN;\r\n   UCHAR  PIN1State;\r\n   UCHAR  PIN1Retries;\r\n   UCHAR  PUK1Retries;\r\n   UCHAR  PIN2State;\r\n   UCHAR  PIN2Retries;\r\n   UCHAR  PUK2Retries;\r\n} __attribute__ ((packed)) QMIUIM_PIN_STATE, *PQMIUIM_PIN_STATE;\r\n\r\ntypedef struct _QMIUIM_VERIFY_PIN_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  Session_Type;\r\n   UCHAR  Aid_Len;\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   UCHAR  PINID;\r\n   UCHAR  PINLen;\r\n   UCHAR  PINValue;\r\n} __attribute__ ((packed)) QMIUIM_VERIFY_PIN_REQ_MSG, *PQMIUIM_VERIFY_PIN_REQ_MSG;\r\n\r\ntypedef struct _QMIUIM_VERIFY_PIN_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   UCHAR  PINVerifyRetriesLeft;\r\n   UCHAR  PINUnblockRetriesLeft;\r\n} __attribute__ ((packed)) QMIUIM_VERIFY_PIN_RESP_MSG, *PQMIUIM_VERIFY_PIN_RESP_MSG;\r\n\r\ntypedef struct _QMIUIM_READ_TRANSPARENT_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR  Session_Type;\r\n   UCHAR  Aid_Len;\r\n   UCHAR  TLV2Type;\r\n   USHORT TLV2Length;\r\n   USHORT file_id;\r\n   UCHAR  path_len;\r\n   UCHAR  path[];\r\n} __attribute__ ((packed)) QMIUIM_READ_TRANSPARENT_REQ_MSG, *PQMIUIM_READ_TRANSPARENT_REQ_MSG;\r\n\r\ntypedef struct _READ_TRANSPARENT_TLV\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT Offset;\r\n   USHORT Length;\r\n} __attribute__ ((packed)) READ_TRANSPARENT_TLV, *PREAD_TRANSPARENT_TLV;\r\n\r\ntypedef struct _QMIUIM_CONTENT\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT content_len;\r\n   UCHAR  content[];\r\n} __attribute__ ((packed)) QMIUIM_CONTENT, *PQMIUIM_CONTENT;\r\n\r\ntypedef struct _QMIUIM_READ_TRANSPARENT_RESP_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   USHORT QMUXResult;\r\n   USHORT QMUXError;\r\n} __attribute__ ((packed)) QMIUIM_READ_TRANSPARENT_RESP_MSG, *PQMIUIM_READ_TRANSPARENT_RESP_MSG;\r\n\r\ntypedef struct _QMIUIM_SET_CARD_SLOT_REQ_MSG\r\n{\r\n   USHORT Type;\r\n   USHORT Length;\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   UCHAR slot;\r\n} __attribute__ ((packed)) QMIUIM_SET_CARD_SLOT_REQ_MSG, *PQMIUIM_SET_CARD_SLOT_REQ_MSG;\r\n\r\n// ======================= COEX ==============================\r\n#define QMI_COEX_GET_WWAN_STATE_REQ 0x22\r\n#define QMI_COEX_GET_WWAN_STATE_RESP 0x22\r\n\r\ntypedef struct {\r\n\r\n  uint32_t freq;\r\n  /**<   Band center frequency in MHz. */\r\n\r\n  uint32_t bandwidth;\r\n  /**<   Bandwidth in MHz. */\r\n}coex_band_type_v01;  /* Type */\r\n\r\ntypedef struct _QMI_COEX_GET_WWAN_STATE_RESP_MSG_LTE_BAND\r\n{\r\n   UCHAR  TLVType;\r\n   USHORT TLVLength;\r\n   coex_band_type_v01 ul_band;\r\n   coex_band_type_v01  dl_band;\r\n} __attribute__ ((packed)) QMI_COEX_GET_WWAN_STATE_RESP_MSG_LTE_BAND, *PQMI_COEX_GET_WWAN_STATE_RESP_MSG_LTE_BAND;\r\n\r\n\r\ntypedef struct _QMUX_MSG\r\n{\r\n   QCQMUX_HDR QMUXHdr;\r\n   union\r\n   {\r\n      // Message Header\r\n      QCQMUX_MSG_HDR                           QMUXMsgHdr;\r\n      QCQMUX_MSG_HDR_RESP                      QMUXMsgHdrResp;\r\n\r\n      // QMIWDS Message\r\n#if 0\r\n      QMIWDS_GET_PKT_SRVC_STATUS_REQ_MSG        PacketServiceStatusReq;\r\n      QMIWDS_GET_PKT_SRVC_STATUS_RESP_MSG       PacketServiceStatusRsp;\r\n      QMIWDS_GET_PKT_SRVC_STATUS_IND_MSG        PacketServiceStatusInd;\r\n      QMIWDS_EVENT_REPORT_IND_MSG               EventReportInd;\r\n      QMIWDS_GET_CURRENT_CHANNEL_RATE_REQ_MSG   GetCurrChannelRateReq;\r\n      QMIWDS_GET_CURRENT_CHANNEL_RATE_RESP_MSG  GetCurrChannelRateRsp;\r\n      QMIWDS_GET_PKT_STATISTICS_REQ_MSG         GetPktStatsReq;\r\n      QMIWDS_GET_PKT_STATISTICS_RESP_MSG        GetPktStatsRsp;\r\n      QMIWDS_SET_EVENT_REPORT_REQ_MSG           EventReportReq;\r\n      QMIWDS_SET_EVENT_REPORT_RESP_MSG          EventReportRsp;\r\n#endif\r\n      //#ifdef QC_IP_MODE\r\n      QMIWDS_GET_RUNTIME_SETTINGS_REQ_MSG       GetRuntimeSettingsReq;\r\n      QMIWDS_GET_RUNTIME_SETTINGS_RESP_MSG      GetRuntimeSettingsRsp;\r\n      //#endif // QC_IP_MODE\r\n      QMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ_MSG  SetClientIpFamilyPrefReq;\r\n      QMIWDS_SET_CLIENT_IP_FAMILY_PREF_RESP_MSG SetClientIpFamilyPrefResp;\r\n      QMIWDS_SET_AUTO_CONNECT_REQ_MSG SetAutoConnectReq;\r\n#if 0\r\n      QMIWDS_GET_MIP_MODE_REQ_MSG               GetMipModeReq;\r\n      QMIWDS_GET_MIP_MODE_RESP_MSG              GetMipModeResp;\r\n#endif\r\n      QMIWDS_START_NETWORK_INTERFACE_REQ_MSG    StartNwInterfaceReq;\r\n      QMIWDS_START_NETWORK_INTERFACE_RESP_MSG   StartNwInterfaceResp;\r\n      QMIWDS_STOP_NETWORK_INTERFACE_REQ_MSG     StopNwInterfaceReq;\r\n      QMIWDS_STOP_NETWORK_INTERFACE_RESP_MSG    StopNwInterfaceResp;\r\n      QMIWDS_GET_DEFAULT_SETTINGS_REQ_MSG       GetDefaultSettingsReq;\r\n      QMIWDS_GET_DEFAULT_SETTINGS_RESP_MSG      GetDefaultSettingsResp;\r\n      QMIWDS_MODIFY_PROFILE_SETTINGS_REQ_MSG    ModifyProfileSettingsReq;\r\n      QMIWDS_MODIFY_PROFILE_SETTINGS_RESP_MSG   ModifyProfileSettingsResp;\r\n      QMIWDS_GET_PROFILE_SETTINGS_REQ_MSG       GetProfileSettingsReq;\r\n      QMIWDS_CREATE_PROFILE_SETTINGS_REQ_MSG    CreatetProfileSettingsReq;\r\n      QMIWDS_GET_PROFILE_LIST_REQ_MSG           GetProfileListReq;\r\n      QMIWDS_GET_PROFILE_LIST_RESP_MSG          GetProfileListResp;\r\n#if 0\r\n      QMIWDS_GET_DATA_BEARER_REQ_MSG            GetDataBearerReq;\r\n      QMIWDS_GET_DATA_BEARER_RESP_MSG           GetDataBearerResp;\r\n      QMIWDS_DUN_CALL_INFO_REQ_MSG              DunCallInfoReq;\r\n      QMIWDS_DUN_CALL_INFO_RESP_MSG             DunCallInfoResp;\r\n#endif\r\n      QMIWDS_BIND_MUX_DATA_PORT_REQ_MSG         BindMuxDataPortReq;\r\n\r\n      // QMIDMS Messages\r\n#if 0\r\n      QMIDMS_GET_DEVICE_MFR_REQ_MSG             GetDeviceMfrReq;\r\n      QMIDMS_GET_DEVICE_MFR_RESP_MSG            GetDeviceMfrRsp;\r\n      QMIDMS_GET_DEVICE_MODEL_ID_REQ_MSG        GetDeviceModeIdReq;\r\n      QMIDMS_GET_DEVICE_MODEL_ID_RESP_MSG       GetDeviceModeIdRsp;\r\n      QMIDMS_GET_DEVICE_REV_ID_REQ_MSG          GetDeviceRevIdReq;\r\n      QMIDMS_GET_DEVICE_REV_ID_RESP_MSG         GetDeviceRevIdRsp;\r\n      QMIDMS_GET_MSISDN_REQ_MSG                 GetMsisdnReq;\r\n      QMIDMS_GET_MSISDN_RESP_MSG                GetMsisdnRsp;\r\n      QMIDMS_GET_DEVICE_SERIAL_NUMBERS_REQ_MSG  GetDeviceSerialNumReq;\r\n      QMIDMS_GET_DEVICE_SERIAL_NUMBERS_RESP_MSG GetDeviceSerialNumRsp;\r\n      QMIDMS_GET_DEVICE_CAP_REQ_MSG             GetDeviceCapReq;\r\n      QMIDMS_GET_DEVICE_CAP_RESP_MSG            GetDeviceCapResp;\r\n      QMIDMS_GET_BAND_CAP_REQ_MSG               GetBandCapReq;\r\n      QMIDMS_GET_BAND_CAP_RESP_MSG              GetBandCapRsp;\r\n      QMIDMS_GET_ACTIVATED_STATUS_REQ_MSG       GetActivatedStatusReq;\r\n      QMIDMS_GET_ACTIVATED_STATUS_RESP_MSG      GetActivatedStatusResp;\r\n      QMIDMS_GET_OPERATING_MODE_REQ_MSG         GetOperatingModeReq;\r\n      QMIDMS_GET_OPERATING_MODE_RESP_MSG        GetOperatingModeResp;\r\n#endif\r\n      QMIDMS_SET_OPERATING_MODE_REQ_MSG         SetOperatingModeReq;\r\n      QMIDMS_SET_OPERATING_MODE_RESP_MSG        SetOperatingModeResp;\r\n#if 0\r\n      QMIDMS_UIM_GET_ICCID_REQ_MSG              GetICCIDReq;\r\n      QMIDMS_UIM_GET_ICCID_RESP_MSG             GetICCIDResp;\r\n      QMIDMS_ACTIVATE_AUTOMATIC_REQ_MSG         ActivateAutomaticReq;\r\n      QMIDMS_ACTIVATE_AUTOMATIC_RESP_MSG        ActivateAutomaticResp;\r\n      QMIDMS_ACTIVATE_MANUAL_REQ_MSG            ActivateManualReq;\r\n      QMIDMS_ACTIVATE_MANUAL_RESP_MSG           ActivateManualResp;\r\n#endif\r\n      QMIDMS_UIM_GET_PIN_STATUS_REQ_MSG         UIMGetPinStatusReq;\r\n      QMIDMS_UIM_GET_PIN_STATUS_RESP_MSG        UIMGetPinStatusResp;\r\n      QMIDMS_UIM_VERIFY_PIN_REQ_MSG             UIMVerifyPinReq;\r\n      QMIDMS_UIM_VERIFY_PIN_RESP_MSG            UIMVerifyPinResp;\r\n#if 0\r\n      QMIDMS_UIM_SET_PIN_PROTECTION_REQ_MSG     UIMSetPinProtectionReq;\r\n      QMIDMS_UIM_SET_PIN_PROTECTION_RESP_MSG    UIMSetPinProtectionResp;\r\n      QMIDMS_UIM_CHANGE_PIN_REQ_MSG             UIMChangePinReq;\r\n      QMIDMS_UIM_CHANGE_PIN_RESP_MSG            UIMChangePinResp;\r\n      QMIDMS_UIM_UNBLOCK_PIN_REQ_MSG            UIMUnblockPinReq;\r\n      QMIDMS_UIM_UNBLOCK_PIN_RESP_MSG           UIMUnblockPinResp;\r\n      QMIDMS_SET_EVENT_REPORT_REQ_MSG           DmsSetEventReportReq;\r\n      QMIDMS_SET_EVENT_REPORT_RESP_MSG          DmsSetEventReportResp;\r\n      QMIDMS_EVENT_REPORT_IND_MSG               DmsEventReportInd;\r\n#endif\r\n      QMIDMS_UIM_GET_STATE_REQ_MSG              UIMGetStateReq;\r\n      QMIDMS_UIM_GET_STATE_RESP_MSG             UIMGetStateResp;\r\n      QMIDMS_UIM_GET_IMSI_REQ_MSG               UIMGetIMSIReq;\r\n      QMIDMS_UIM_GET_IMSI_RESP_MSG              UIMGetIMSIResp;\r\n#if 0\r\n      QMIDMS_UIM_GET_CK_STATUS_REQ_MSG          UIMGetCkStatusReq;\r\n      QMIDMS_UIM_GET_CK_STATUS_RESP_MSG         UIMGetCkStatusResp;\r\n      QMIDMS_UIM_SET_CK_PROTECTION_REQ_MSG      UIMSetCkProtectionReq;\r\n      QMIDMS_UIM_SET_CK_PROTECTION_RESP_MSG     UIMSetCkProtectionResp;\r\n      QMIDMS_UIM_UNBLOCK_CK_REQ_MSG             UIMUnblockCkReq;\r\n      QMIDMS_UIM_UNBLOCK_CK_RESP_MSG            UIMUnblockCkResp;\r\n#endif\r\n\r\n      // QMIQOS Messages\r\n#if 1\r\n      QMI_QOS_SET_EVENT_REPORT_REQ_MSG          QosSetEventReportReq;\r\n      QMI_QOS_SET_EVENT_REPORT_RESP_MSG         QosSetEventReportRsp;\r\n      QMI_QOS_SET_EVENT_REPORT_IND_MSG          QosSetEventReportInd;\r\n\t  QMI_QOS_BIND_DATA_PORT_REQ_MSG\t\t\tQosBindDataPortReq;\r\n\t  QMI_QOS_BIND_DATA_PORT_RESP_MSG\t\t\tQosBindDataPortRsp;\r\n\t  QMI_QOS_INDICATION_REGISTER_REQ_MSG\t\tQosIndRegReq;\r\n\t  QMI_QOS_INDICATION_REGISTER_RESP_MSG\t\tQosIndRegRsp;\r\n\t  QMI_QOS_GLOBAL_QOS_FLOW_IND_MSG\t\t\tQosGlobalQosFlowInd;\r\n\t  QMI_QOS_GET_QOS_INFO_REQ_MSG\t\t\t\tQosGetQosInfoReq;\r\n\t  QMI_QOS_GET_QOS_INFO_RESP_MSG\t\t\t\tQosGetQosInfoRsp;\r\n#endif\r\n\r\n      // QMIWMS Messages\r\n#if 0\r\n      QMIWMS_GET_MESSAGE_PROTOCOL_REQ_MSG       GetMessageProtocolReq;\r\n      QMIWMS_GET_MESSAGE_PROTOCOL_RESP_MSG      GetMessageProtocolResp;\r\n      QMIWMS_GET_SMSC_ADDRESS_REQ_MSG           GetSMSCAddressReq;\r\n      QMIWMS_GET_SMSC_ADDRESS_RESP_MSG          GetSMSCAddressResp;\r\n      QMIWMS_SET_SMSC_ADDRESS_REQ_MSG           SetSMSCAddressReq;\r\n      QMIWMS_SET_SMSC_ADDRESS_RESP_MSG          SetSMSCAddressResp;\r\n      QMIWMS_GET_STORE_MAX_SIZE_REQ_MSG         GetStoreMaxSizeReq;\r\n      QMIWMS_GET_STORE_MAX_SIZE_RESP_MSG        GetStoreMaxSizeResp;\r\n      QMIWMS_LIST_MESSAGES_REQ_MSG              ListMessagesReq;\r\n      QMIWMS_LIST_MESSAGES_RESP_MSG             ListMessagesResp;\r\n      QMIWMS_RAW_READ_REQ_MSG                   RawReadMessagesReq;\r\n      QMIWMS_RAW_READ_RESP_MSG                  RawReadMessagesResp;\r\n      QMIWMS_SET_EVENT_REPORT_REQ_MSG           WmsSetEventReportReq;\r\n      QMIWMS_SET_EVENT_REPORT_RESP_MSG          WmsSetEventReportResp;\r\n      QMIWMS_EVENT_REPORT_IND_MSG               WmsEventReportInd;\r\n      QMIWMS_DELETE_REQ_MSG                     WmsDeleteReq;\r\n      QMIWMS_DELETE_RESP_MSG                    WmsDeleteResp;\r\n      QMIWMS_RAW_SEND_REQ_MSG                   RawSendMessagesReq;\r\n      QMIWMS_RAW_SEND_RESP_MSG                  RawSendMessagesResp;\r\n      QMIWMS_MODIFY_TAG_REQ_MSG                 WmsModifyTagReq;\r\n      QMIWMS_MODIFY_TAG_RESP_MSG                WmsModifyTagResp;\r\n#endif\r\n\r\n      // QMINAS Messages\r\n#if 0\r\n      QMINAS_GET_HOME_NETWORK_REQ_MSG           GetHomeNetworkReq;\r\n      QMINAS_GET_HOME_NETWORK_RESP_MSG          GetHomeNetworkResp;\r\n      QMINAS_GET_PREFERRED_NETWORK_REQ_MSG      GetPreferredNetworkReq;\r\n      QMINAS_GET_PREFERRED_NETWORK_RESP_MSG     GetPreferredNetworkResp;\r\n      QMINAS_GET_FORBIDDEN_NETWORK_REQ_MSG      GetForbiddenNetworkReq;\r\n      QMINAS_GET_FORBIDDEN_NETWORK_RESP_MSG     GetForbiddenNetworkResp;\r\n      QMINAS_GET_SERVING_SYSTEM_REQ_MSG         GetServingSystemReq;\r\n#endif\r\n      QMINAS_GET_SERVING_SYSTEM_RESP_MSG        GetServingSystemResp;\r\n      QMINAS_GET_SYS_INFO_RESP_MSG              GetSysInfoResp;\r\n      QMINAS_SYS_INFO_IND_MSG                   NasSysInfoInd;\r\n#if 0\r\n      QMINAS_SERVING_SYSTEM_IND_MSG             NasServingSystemInd;\r\n      QMINAS_SET_PREFERRED_NETWORK_REQ_MSG      SetPreferredNetworkReq;\r\n      QMINAS_SET_PREFERRED_NETWORK_RESP_MSG     SetPreferredNetworkResp;\r\n      QMINAS_SET_FORBIDDEN_NETWORK_REQ_MSG      SetForbiddenNetworkReq;\r\n      QMINAS_SET_FORBIDDEN_NETWORK_RESP_MSG     SetForbiddenNetworkResp;\r\n      QMINAS_PERFORM_NETWORK_SCAN_REQ_MSG       PerformNetworkScanReq;\r\n      QMINAS_PERFORM_NETWORK_SCAN_RESP_MSG      PerformNetworkScanResp;\r\n      QMINAS_INITIATE_NW_REGISTER_REQ_MSG       InitiateNwRegisterReq;\r\n      QMINAS_INITIATE_NW_REGISTER_RESP_MSG      InitiateNwRegisterResp;\r\n      QMINAS_SET_TECHNOLOGY_PREF_REQ_MSG        SetTechnologyPrefReq;\r\n      QMINAS_SET_TECHNOLOGY_PREF_RESP_MSG       SetTechnologyPrefResp;\r\n      QMINAS_GET_SIGNAL_STRENGTH_REQ_MSG        GetSignalStrengthReq;\r\n      QMINAS_GET_SIGNAL_STRENGTH_RESP_MSG       GetSignalStrengthResp;\r\n      QMINAS_SET_EVENT_REPORT_REQ_MSG           SetEventReportReq;\r\n      QMINAS_SET_EVENT_REPORT_RESP_MSG          SetEventReportResp;\r\n      QMINAS_EVENT_REPORT_IND_MSG               NasEventReportInd;\r\n      QMINAS_GET_RF_BAND_INFO_REQ_MSG           GetRFBandInfoReq;\r\n      QMINAS_GET_RF_BAND_INFO_RESP_MSG          GetRFBandInfoResp;\r\n      QMINAS_INITIATE_ATTACH_REQ_MSG            InitiateAttachReq;\r\n      QMINAS_INITIATE_ATTACH_RESP_MSG           InitiateAttachResp;\r\n      QMINAS_GET_PLMN_NAME_REQ_MSG              GetPLMNNameReq;\r\n      QMINAS_GET_PLMN_NAME_RESP_MSG             GetPLMNNameResp;\r\n#endif\r\n\r\n      // QMIUIM Messages\r\n      QMIUIM_GET_CARD_STATUS_RESP_MSG           UIMGetCardStatus;\r\n      QMIUIM_VERIFY_PIN_REQ_MSG                 UIMUIMVerifyPinReq;\r\n      QMIUIM_VERIFY_PIN_RESP_MSG                UIMUIMVerifyPinResp;\r\n#if 0\r\n      QMIUIM_SET_PIN_PROTECTION_REQ_MSG         UIMUIMSetPinProtectionReq;\r\n      QMIUIM_SET_PIN_PROTECTION_RESP_MSG        UIMUIMSetPinProtectionResp;\r\n      QMIUIM_CHANGE_PIN_REQ_MSG                 UIMUIMChangePinReq;\r\n      QMIUIM_CHANGE_PIN_RESP_MSG                UIMUIMChangePinResp;\r\n      QMIUIM_UNBLOCK_PIN_REQ_MSG                UIMUIMUnblockPinReq;\r\n      QMIUIM_UNBLOCK_PIN_RESP_MSG               UIMUIMUnblockPinResp;\r\n#endif\r\n      QMIUIM_READ_TRANSPARENT_REQ_MSG           UIMUIMReadTransparentReq;\r\n      QMIUIM_READ_TRANSPARENT_RESP_MSG          UIMUIMReadTransparentResp;\r\n      QMIUIM_SET_CARD_SLOT_REQ_MSG                 UIMSetCardSlotReq;\r\n\r\n      QMIWDS_ADMIN_SET_DATA_FORMAT_REQ_MSG      SetDataFormatReq;\r\n      QMI_WDA_SET_LOOPBACK_CONFIG_REQ_MSG       SetLoopBackReq;\r\n      QMI_WDA_SET_LOOPBACK_CONFIG_IND_MSG       SetLoopBackInd;\t  \r\n   };\r\n} __attribute__ ((packed)) QMUX_MSG, *PQMUX_MSG;\r\n\r\ntypedef struct _QCQMIMSG {\r\n    QCQMI_HDR QMIHdr;\r\n    union {\r\n        QMICTL_MSG CTLMsg;\r\n        QMUX_MSG MUXMsg;\r\n    };\r\n} __attribute__ ((packed)) QCQMIMSG, *PQCQMIMSG;\r\n\r\n#pragma pack(pop)\r\n\r\n#endif // QCQMUX_H\r\n\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/QMIThread.c",
    "content": "/*\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\n\n    Quectel hereby grants customers of Quectel a license to use, modify,\n    distribute and publish the Software in binary form provided that\n    customers shall have no right to reverse engineer, reverse assemble,\n    decompile or reduce to source code form any portion of the Software. \n    Under no circumstances may customers modify, demonstrate, use, deliver \n    or disclose any portion of the Software in source code form.\n*/\n\n#include \"QMIThread.h\"\n#include <inttypes.h>\n\n#ifndef MIN\n#define MIN(a, b)\t((a) < (b)? (a): (b))\n#endif\n\n#define qmi_rsp_check_and_return() do { \\\n        if (err < 0 || pResponse == NULL) { \\\n            dbg_time(\"%s err = %d\", __func__, err); \\\n            return err; \\\n        } \\\n        pMUXMsg = &pResponse->MUXMsg; \\\n        if (le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXResult) || le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError)) { \\\n            USHORT QMUXError = le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError); \\\n            dbg_time(\"%s QMUXResult = 0x%x, QMUXError = 0x%x\", __func__, \\\n                le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXResult), QMUXError); \\\n            free(pResponse); \\\n            return QMUXError; \\\n        } \\\n} while(0)\n\n#define qmi_rsp_check() do { \\\n        if (err < 0 || pResponse == NULL) { \\\n            dbg_time(\"%s err = %d\", __func__, err); \\\n            return err; \\\n        } \\\n        pMUXMsg = &pResponse->MUXMsg; \\\n        if (le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXResult) || le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError)) { \\\n            USHORT QMUXError = le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError); \\\n            dbg_time(\"%s QMUXResult = 0x%x, QMUXError = 0x%x\", __func__, \\\n                le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXResult), QMUXError); \\\n        } \\\n} while(0)\n\nstatic uint32_t WdsConnectionIPv4Handle = 0;\nstatic uint32_t WdsConnectionIPv6Handle = 0;\nstatic int s_is_cdma = 0;\nstatic int s_5g_type = WWAN_DATA_CLASS_NONE;\nstatic int s_hdr_personality = 0; // 0x01-HRPD, 0x02-eHRPD\nstatic char *qstrcpy(char *to, const char *from) { //no __strcpy_chk\n\tchar *save = to;\n\tfor (; (*to = *from) != '\\0'; ++from, ++to);\n\treturn(save);\n}\n\nstatic void uchar2char(char *dst_ptr, size_t dst_len, const UCHAR *src_ptr, size_t src_len) { \n    size_t copy = MIN(dst_len-1, src_len);\n\n    if (copy)\n        memcpy(dst_ptr, src_ptr, copy);\n    dst_ptr[copy] = 0;\n}\n\nstatic int s_9x07 = 1;\n\ntypedef USHORT (*CUSTOMQMUX)(PQMUX_MSG pMUXMsg, void *arg);\n\n// To retrieve the ith (Index) TLV\nPQMI_TLV_HDR GetTLV (PQCQMUX_MSG_HDR pQMUXMsgHdr, int TLVType) {\n    int TLVFind = 0;\n    USHORT Length = le16_to_cpu(pQMUXMsgHdr->Length);\n    PQMI_TLV_HDR pTLVHdr = (PQMI_TLV_HDR)(pQMUXMsgHdr + 1);\n\n    while (Length >= sizeof(QMI_TLV_HDR)) {\n        TLVFind++;\n        if (TLVType > 0x1000) {\n            if ((TLVFind + 0x1000) == TLVType)\n                return pTLVHdr;\n        } else  if (pTLVHdr->TLVType == TLVType) {\n            return pTLVHdr;\n        }\n\n        Length -= (le16_to_cpu((pTLVHdr->TLVLength)) + sizeof(QMI_TLV_HDR));\n        pTLVHdr = (PQMI_TLV_HDR)(((UCHAR *)pTLVHdr) + le16_to_cpu(pTLVHdr->TLVLength) + sizeof(QMI_TLV_HDR));\n    }\n\n   return NULL;\n}\n\nstatic USHORT GetQMUXTransactionId(void) {\n    static int TransactionId = 0;\n    if (++TransactionId > 0xFFFF)\n        TransactionId = 1;\n    return TransactionId;\n}\n\nstatic PQCQMIMSG ComposeQMUXMsg(UCHAR QMIType, USHORT Type, CUSTOMQMUX customQmuxMsgFunction, void *arg) {\n    UCHAR QMIBuf[WDM_DEFAULT_BUFSIZE];\n    PQCQMIMSG pRequest = (PQCQMIMSG)QMIBuf;\n    int Length;\n\n    memset(QMIBuf, 0x00, sizeof(QMIBuf));\n    pRequest->QMIHdr.IFType = USB_CTL_MSG_TYPE_QMI;\n    pRequest->QMIHdr.CtlFlags = 0x00;\n    pRequest->QMIHdr.QMIType = QMIType;\n\n    pRequest->MUXMsg.QMUXHdr.CtlFlags = QMUX_CTL_FLAG_SINGLE_MSG | QMUX_CTL_FLAG_TYPE_CMD;\n    pRequest->MUXMsg.QMUXHdr.TransactionId = cpu_to_le16(GetQMUXTransactionId());\n    pRequest->MUXMsg.QMUXMsgHdr.Type = cpu_to_le16(Type);\n    if (customQmuxMsgFunction)\n        pRequest->MUXMsg.QMUXMsgHdr.Length = cpu_to_le16(customQmuxMsgFunction(&pRequest->MUXMsg, arg) - sizeof(QCQMUX_MSG_HDR));\n    else\n        pRequest->MUXMsg.QMUXMsgHdr.Length = cpu_to_le16(0x0000);\n\n    pRequest->QMIHdr.Length = cpu_to_le16(le16_to_cpu(pRequest->MUXMsg.QMUXMsgHdr.Length) + sizeof(QCQMUX_MSG_HDR) + sizeof(QCQMUX_HDR)\n        + sizeof(QCQMI_HDR) - 1);\n    Length = le16_to_cpu(pRequest->QMIHdr.Length) + 1;\n\n    pRequest = (PQCQMIMSG)malloc(Length);\n    if (pRequest == NULL) {\n        dbg_time(\"%s fail to malloc\", __func__);\n    } else {\n        memcpy(pRequest, QMIBuf, Length);\n    }\n\n    return pRequest;\n}\n\n#if 0\nstatic USHORT NasSetEventReportReq(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->SetEventReportReq.TLVType = 0x10;\n    pMUXMsg->SetEventReportReq.TLVLength = 0x04;\n    pMUXMsg->SetEventReportReq.ReportSigStrength = 0x00;\n    pMUXMsg->SetEventReportReq.NumTresholds = 2;\n    pMUXMsg->SetEventReportReq.TresholdList[0] = -113;\n    pMUXMsg->SetEventReportReq.TresholdList[1] = -50;\n    return sizeof(QMINAS_SET_EVENT_REPORT_REQ_MSG);\n}\n\nstatic USHORT WdsSetEventReportReq(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->EventReportReq.TLVType = 0x10;          // 0x10 -- current channel rate indicator\n    pMUXMsg->EventReportReq.TLVLength = 0x0001;        // 1\n    pMUXMsg->EventReportReq.Mode = 0x00;             // 0-do not report; 1-report when rate changes\n\n    pMUXMsg->EventReportReq.TLV2Type = 0x11;         // 0x11\n    pMUXMsg->EventReportReq.TLV2Length = 0x0005;       // 5\n    pMUXMsg->EventReportReq.StatsPeriod = 0x00;      // seconds between reports; 0-do not report\n    pMUXMsg->EventReportReq.StatsMask = 0x000000ff;        //\n\n    pMUXMsg->EventReportReq.TLV3Type = 0x12;          // 0x12 -- current data bearer indicator\n    pMUXMsg->EventReportReq.TLV3Length = 0x0001;        // 1\n    pMUXMsg->EventReportReq.Mode3 = 0x01;             // 0-do not report; 1-report when changes\n\n    pMUXMsg->EventReportReq.TLV4Type = 0x13;          // 0x13 -- dormancy status indicator\n    pMUXMsg->EventReportReq.TLV4Length = 0x0001;        // 1\n    pMUXMsg->EventReportReq.DormancyStatus = 0x00;    // 0-do not report; 1-report when changes\n    return sizeof(QMIWDS_SET_EVENT_REPORT_REQ_MSG);\n}\n\nstatic USHORT DmsSetEventReportReq(PQMUX_MSG pMUXMsg) {\n    PPIN_STATUS pPinState = (PPIN_STATUS)(&pMUXMsg->DmsSetEventReportReq + 1);\n    PUIM_STATE pUimState = (PUIM_STATE)(pPinState + 1);\n    // Pin State\n    pPinState->TLVType = 0x12;\n    pPinState->TLVLength = 0x01;\n    pPinState->ReportPinState = 0x01;\n    // UIM State\n    pUimState->TLVType = 0x15;\n    pUimState->TLVLength = 0x01;\n    pUimState->UIMState = 0x01;\n    return sizeof(QMIDMS_SET_EVENT_REPORT_REQ_MSG) + sizeof(PIN_STATUS) + sizeof(UIM_STATE);\n}\n#endif\n\nstatic USHORT WdsStartNwInterfaceReq(PQMUX_MSG pMUXMsg, void *arg) {\n    PQMIWDS_TECHNOLOGY_PREFERECE pTechPref;\n    PQMIWDS_AUTH_PREFERENCE pAuthPref;\n    PQMIWDS_USERNAME pUserName;\n    PQMIWDS_PD pPd;\n    PQMIWDS_APNNAME pApnName;\n    PQMIWDS_IP_FAMILY_TLV pIpFamily;\n    USHORT TLVLength = 0;\n    UCHAR *pTLV;\n    PROFILE_T *profile = (PROFILE_T *)arg;\n    const char *profile_user = profile->user;\n    const char *profile_pd = profile->pd;\n    int profile_auth = profile->auth;\n\n    if (s_is_cdma && (profile_user == NULL || profile_user[0] == '\\0') && (profile_pd == NULL || profile_pd[0] == '\\0')) {\n        profile_user = \"ctnet@mycdma.cn\";\n        profile_pd = \"vnet.mobi\";\n        profile_auth = 2; //chap\n    }\n\n    pTLV = (UCHAR *)(&pMUXMsg->StartNwInterfaceReq + 1);\n    pMUXMsg->StartNwInterfaceReq.Length = 0;\n\n    // Set technology Preferece\n    pTechPref = (PQMIWDS_TECHNOLOGY_PREFERECE)(pTLV + TLVLength);\n    pTechPref->TLVType = 0x30;\n    pTechPref->TLVLength = cpu_to_le16(0x01);\n    if (s_is_cdma == 0)\n        pTechPref->TechPreference = 0x01;\n    else\n        pTechPref->TechPreference = 0x02;\n    TLVLength +=(le16_to_cpu(pTechPref->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n\n    // Set APN Name\n    if (profile->apn && !s_is_cdma) { //cdma no apn\n        pApnName = (PQMIWDS_APNNAME)(pTLV + TLVLength);\n        pApnName->TLVType = 0x14;\n        pApnName->TLVLength = cpu_to_le16(strlen(profile->apn));\n        qstrcpy((char *)&pApnName->ApnName, profile->apn);\n        TLVLength +=(le16_to_cpu(pApnName->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n    }\n\n    // Set User Name\n    if (profile_user) {\n        pUserName = (PQMIWDS_USERNAME)(pTLV + TLVLength);\n        pUserName->TLVType = 0x17;\n        pUserName->TLVLength = cpu_to_le16(strlen(profile_user));\n        qstrcpy((char *)&pUserName->UserName, profile_user);\n        TLVLength += (le16_to_cpu(pUserName->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n    }\n\n    // Set Password\n    if (profile_pd) {\n        pPd = (PQMIWDS_PD)(pTLV + TLVLength);\n        pPd->TLVType = 0x18;\n        pPd->TLVLength = cpu_to_le16(strlen(profile_pd));\n        qstrcpy((char *)&pPd->Pd, profile_pd);\n\tTLVLength += (le16_to_cpu(pPd->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n    }\n\n    // Set Auth Protocol\n    if (profile_user && profile_pd) {\n        pAuthPref = (PQMIWDS_AUTH_PREFERENCE)(pTLV + TLVLength);\n        pAuthPref->TLVType = 0x16;\n        pAuthPref->TLVLength = cpu_to_le16(0x01);\n        pAuthPref->AuthPreference = profile_auth; // 0 ~ None, 1 ~ Pap, 2 ~ Chap, 3 ~ MsChapV2\n        TLVLength += (le16_to_cpu(pAuthPref->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n    }\n\n    // Add IP Family Preference\n    pIpFamily = (PQMIWDS_IP_FAMILY_TLV)(pTLV + TLVLength);\n    pIpFamily->TLVType = 0x19;\n    pIpFamily->TLVLength = cpu_to_le16(0x01);\n    pIpFamily->IpFamily = profile->curIpFamily;\n    TLVLength += (le16_to_cpu(pIpFamily->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n\n    if(profile->usb_dev.idProduct != 0x0316){\n    \n      //Set Profile Index\n      if (profile->profile_index && !s_is_cdma) { //cdma only support one pdp, so no need to set profile index\n          PQMIWDS_PROFILE_IDENTIFIER pProfileIndex = (PQMIWDS_PROFILE_IDENTIFIER)(pTLV + TLVLength);\n          pProfileIndex->TLVLength = cpu_to_le16(0x01);\n          pProfileIndex->TLVType = 0x31;\n          pProfileIndex->ProfileIndex = profile->profile_index;\n          if (s_is_cdma && s_hdr_personality == 0x02) {\n              pProfileIndex->TLVType = 0x32; //profile_index_3gpp2\n              pProfileIndex->ProfileIndex = 101;\n          }\n          TLVLength += (le16_to_cpu(pProfileIndex->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n      }\n    }\n    else if(profile->usb_dev.idProduct == 0x0316){\n   \n      if(profile->bring_up_by_apn_name)\n      {\n          PQMIWDS_BRINGUP_APNNAME pBring_up_by_apn_name = (PQMIWDS_BRINGUP_APNNAME)(pTLV + TLVLength);        \n          pBring_up_by_apn_name->TLVLength = cpu_to_le16(0x01);  \n          pBring_up_by_apn_name->TLVType = 0x3C;\n          pBring_up_by_apn_name->bring_up_by_apn_name  =   profile->bring_up_by_apn_name;\n          TLVLength += (le16_to_cpu(pBring_up_by_apn_name->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n      }\n\n      if(profile->bring_up_by_apn_type)\n      {\n          PQMIWDS_BRINGUP_APNTYPE pBring_up_by_apn_type = (PQMIWDS_BRINGUP_APNTYPE)(pTLV + TLVLength); \n          pBring_up_by_apn_type->TLVLength = cpu_to_le16(0x01);  \n          pBring_up_by_apn_type->TLVType = 0x3D;\n          pBring_up_by_apn_type->bring_up_by_apn_type  =   profile->bring_up_by_apn_type;\n          TLVLength += (le16_to_cpu(pBring_up_by_apn_type->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n      }\n    \n      if(profile->apn_type)\n      {\n          PQMIWDS_APN_TYPE pApn_type = (PQMIWDS_APN_TYPE)(pTLV + TLVLength); \n          pApn_type->TLVLength = cpu_to_le32(0x04);  \n          pApn_type->TLVType = 0x38;\n          pApn_type->apn_type = cpu_to_le32(profile->apn_type);\n          TLVLength += (le16_to_cpu(pApn_type->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n      }  \n   }\n      return sizeof(QMIWDS_START_NETWORK_INTERFACE_REQ_MSG) + TLVLength;\n}\n\nstatic USHORT WdsStopNwInterfaceReq(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->StopNwInterfaceReq.TLVType = 0x01;\n    pMUXMsg->StopNwInterfaceReq.TLVLength = cpu_to_le16(0x04);\n    if (*((int *)arg) == IpFamilyV4)\n        pMUXMsg->StopNwInterfaceReq.Handle =  cpu_to_le32(WdsConnectionIPv4Handle);\n    else\n        pMUXMsg->StopNwInterfaceReq.Handle =  cpu_to_le32(WdsConnectionIPv6Handle);\n    return sizeof(QMIWDS_STOP_NETWORK_INTERFACE_REQ_MSG);\n}\n\nstatic USHORT WdsSetClientIPFamilyPref(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->SetClientIpFamilyPrefReq.TLVType = 0x01;\n    pMUXMsg->SetClientIpFamilyPrefReq.TLVLength = cpu_to_le16(0x01);\n    pMUXMsg->SetClientIpFamilyPrefReq.IpPreference = *((UCHAR *)arg);\n    return sizeof(QMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ_MSG);\n}\n\nstatic USHORT WdsSetAutoConnect(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->SetAutoConnectReq.TLVType = 0x01;\n    pMUXMsg->SetAutoConnectReq.TLVLength = cpu_to_le16(0x01);\n    pMUXMsg->SetAutoConnectReq.autoconnect_setting = *((UCHAR *)arg);\n    return sizeof(QMIWDS_SET_AUTO_CONNECT_REQ_MSG);\n}\n\nenum peripheral_ep_type {\n\tDATA_EP_TYPE_RESERVED\t= 0x0,\n\tDATA_EP_TYPE_HSIC\t= 0x1,\n\tDATA_EP_TYPE_HSUSB\t= 0x2,\n\tDATA_EP_TYPE_PCIE\t= 0x3,\n\tDATA_EP_TYPE_EMBEDDED\t= 0x4,\n\tDATA_EP_TYPE_BAM_DMUX\t= 0x5,\n};\n        \nstatic USHORT WdsSetQMUXBindMuxDataPort(PQMUX_MSG pMUXMsg, void *arg) {\n    QMAP_SETTING *qmap_settings = (QMAP_SETTING *)arg;\n\n    pMUXMsg->BindMuxDataPortReq.TLVType = 0x10;\n    pMUXMsg->BindMuxDataPortReq.TLVLength = cpu_to_le16(0x08);\n    pMUXMsg->BindMuxDataPortReq.ep_type = cpu_to_le32(qmap_settings->ep_type);\n    pMUXMsg->BindMuxDataPortReq.iface_id = cpu_to_le32(qmap_settings->iface_id);\n    pMUXMsg->BindMuxDataPortReq.TLV2Type = 0x11;\n    pMUXMsg->BindMuxDataPortReq.TLV2Length = cpu_to_le16(0x01);\n    pMUXMsg->BindMuxDataPortReq.MuxId = qmap_settings->MuxId;\n    pMUXMsg->BindMuxDataPortReq.TLV3Type = 0x13;\n    pMUXMsg->BindMuxDataPortReq.TLV3Length = cpu_to_le16(0x04);\n    pMUXMsg->BindMuxDataPortReq.client_type = cpu_to_le32(1); //WDS_CLIENT_TYPE_TETHERED\n    \n    return sizeof(QMIWDS_BIND_MUX_DATA_PORT_REQ_MSG);\n}\n\nstatic int qmap_version = 0x05;\nstatic USHORT WdaSetDataFormat(PQMUX_MSG pMUXMsg, void *arg) {\n    QMAP_SETTING *qmap_settings = (QMAP_SETTING *)arg;\n\n    if (qmap_settings->rx_urb_size == 0) {\n        PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV_QOS pWdsAdminQosTlv;\n        PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV linkProto;\n        PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV dlTlp;\n\n        pWdsAdminQosTlv = (PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV_QOS)(&pMUXMsg->QMUXMsgHdr + 1);\n        pWdsAdminQosTlv->TLVType = 0x10;\n        pWdsAdminQosTlv->TLVLength = cpu_to_le16(0x0001);\n        pWdsAdminQosTlv->QOSSetting = 0; /* no-QOS header */\n\n        linkProto = (PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV)(pWdsAdminQosTlv + 1);\n        linkProto->TLVType = 0x11;\n        linkProto->TLVLength = cpu_to_le16(4);\n        linkProto->Value = cpu_to_le32(0x01);     /* Set Ethernet  mode */\n\n        dlTlp = (PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV)(linkProto + 1);;\n        dlTlp->TLVType = 0x13;\n        dlTlp->TLVLength = cpu_to_le16(4);\n        dlTlp->Value = cpu_to_le32(0x00);\n\n        if (sizeof(*linkProto) != 7 )\n            dbg_time(\"%s sizeof(*linkProto) = %zu, is not 7!\", __func__, sizeof(*linkProto) );\n\n        return sizeof(QCQMUX_MSG_HDR) + sizeof(*pWdsAdminQosTlv) + sizeof(*linkProto) + sizeof(*dlTlp);\n    } \n    else {\n    //Indicates whether the Quality of Service(QOS) data format is used by the client.\n        pMUXMsg->SetDataFormatReq.QosDataFormatTlv.TLVType = 0x10;\n        pMUXMsg->SetDataFormatReq.QosDataFormatTlv.TLVLength = cpu_to_le16(0x0001);\n        pMUXMsg->SetDataFormatReq.QosDataFormatTlv.QOSSetting = 0; /* no-QOS header */\n\t\t\n    //Underlying Link Layer Protocol\n        pMUXMsg->SetDataFormatReq.UnderlyingLinkLayerProtocolTlv.TLVType = 0x11; \n        pMUXMsg->SetDataFormatReq.UnderlyingLinkLayerProtocolTlv.TLVLength = cpu_to_le16(4);\n        pMUXMsg->SetDataFormatReq.UnderlyingLinkLayerProtocolTlv.Value = cpu_to_le32(0x02);     /* Set IP  mode */\n\n    //Uplink (UL) data aggregation protocol to be used for uplink data transfer.\n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationProtocolTlv.TLVType = 0x12; \n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationProtocolTlv.TLVLength = cpu_to_le16(4);\n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationProtocolTlv.Value = cpu_to_le32(qmap_version); //UL QMAP is enabled\n        \n    //Downlink (DL) data aggregation protocol to be used for downlink data transfer\n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationProtocolTlv.TLVType = 0x13; \n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationProtocolTlv.TLVLength = cpu_to_le16(4);\n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationProtocolTlv.Value = cpu_to_le32(qmap_version); //DL QMAP is enabled\n        \n    //Maximum number of datagrams in a single aggregated packet on downlink\n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationMaxDatagramsTlv.TLVType = 0x15; \n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationMaxDatagramsTlv.TLVLength = cpu_to_le16(4);\n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationMaxDatagramsTlv.Value = cpu_to_le32(qmap_settings->rx_urb_size/512);\n\t\t\n    //Maximum size in bytes of a single aggregated packet allowed on downlink\n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationMaxSizeTlv.TLVType = 0x16; \n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationMaxSizeTlv.TLVLength = cpu_to_le16(4);\n        pMUXMsg->SetDataFormatReq.DownlinkDataAggregationMaxSizeTlv.Value = cpu_to_le32(qmap_settings->rx_urb_size);\n\n    //Peripheral End Point ID\n        pMUXMsg->SetDataFormatReq.epTlv.TLVType = 0x17; \n        pMUXMsg->SetDataFormatReq.epTlv.TLVLength = cpu_to_le16(8);\n        pMUXMsg->SetDataFormatReq.epTlv.ep_type = cpu_to_le32(qmap_settings->ep_type);\n        pMUXMsg->SetDataFormatReq.epTlv.iface_id = cpu_to_le32(qmap_settings->iface_id); \n\n#ifdef QUECTEL_UL_DATA_AGG\n        if (!qmap_settings->ul_data_aggregation_max_datagrams) {\n            return ((size_t)&((QMIWDS_ADMIN_SET_DATA_FORMAT_REQ_MSG *)0)->DlMinimumPassingTlv);\n        }\n        \n     //Maximum number of datagrams in a single aggregated packet on uplink\n        pMUXMsg->SetDataFormatReq.DlMinimumPassingTlv.TLVType = 0x19; \n        pMUXMsg->SetDataFormatReq.DlMinimumPassingTlv.TLVLength = cpu_to_le16(4);\n        pMUXMsg->SetDataFormatReq.DlMinimumPassingTlv.Value = cpu_to_le32(qmap_settings->dl_minimum_padding);\n\t\t\n     //Maximum number of datagrams in a single aggregated packet on uplink\n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationMaxDatagramsTlv.TLVType = 0x1B; \n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationMaxDatagramsTlv.TLVLength = cpu_to_le16(4);\n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationMaxDatagramsTlv.Value = cpu_to_le32(qmap_settings->ul_data_aggregation_max_datagrams);\n\t\t\n    //Maximum size in bytes of a single aggregated packet allowed on downlink\n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationMaxSizeTlv.TLVType = 0x1C; \n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationMaxSizeTlv.TLVLength = cpu_to_le16(4);\n        pMUXMsg->SetDataFormatReq.UplinkDataAggregationMaxSizeTlv.Value = cpu_to_le32(qmap_settings->ul_data_aggregation_max_size);\n#endif\n\n        return sizeof(QMIWDS_ADMIN_SET_DATA_FORMAT_REQ_MSG);\n    }\n}\n\n#ifdef CONFIG_SIM\nstatic USHORT DmsUIMVerifyPinReqSend(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->UIMVerifyPinReq.TLVType = 0x01;\n    pMUXMsg->UIMVerifyPinReq.PINID = 0x01; //Pin1, not Puk\n    pMUXMsg->UIMVerifyPinReq.PINLen = strlen((const char *)arg);\n    qstrcpy((char *)&pMUXMsg->UIMVerifyPinReq.PINValue, ((const char *)arg));\n    pMUXMsg->UIMVerifyPinReq.TLVLength = cpu_to_le16(2 + strlen((const char *)arg));\n    return sizeof(QMIDMS_UIM_VERIFY_PIN_REQ_MSG) + (strlen((const char *)arg) - 1);\n}\n\nstatic USHORT UimVerifyPinReqSend(PQMUX_MSG pMUXMsg, void *arg)\n{\n    pMUXMsg->UIMUIMVerifyPinReq.TLVType = 0x01;\n    pMUXMsg->UIMUIMVerifyPinReq.TLVLength = cpu_to_le16(0x02);\n    pMUXMsg->UIMUIMVerifyPinReq.Session_Type = 0x00;\n    pMUXMsg->UIMUIMVerifyPinReq.Aid_Len = 0x00;\n    pMUXMsg->UIMUIMVerifyPinReq.TLV2Type = 0x02;\n    pMUXMsg->UIMUIMVerifyPinReq.TLV2Length = cpu_to_le16(2 + strlen((const char *)arg));\n    pMUXMsg->UIMUIMVerifyPinReq.PINID = 0x01;  //Pin1, not Puk\n    pMUXMsg->UIMUIMVerifyPinReq.PINLen= strlen((const char *)arg);\n    qstrcpy((char *)&pMUXMsg->UIMUIMVerifyPinReq.PINValue, ((const char *)arg));\n    return sizeof(QMIUIM_VERIFY_PIN_REQ_MSG) + (strlen((const char *)arg) - 1);\n}\n\n#ifdef CONFIG_IMSI_ICCID\nstatic USHORT UimReadTransparentIMSIReqSend(PQMUX_MSG pMUXMsg, void *arg) {\n    PREAD_TRANSPARENT_TLV pReadTransparent;\n\n    pMUXMsg->UIMUIMReadTransparentReq.TLVType =  0x01;\n    pMUXMsg->UIMUIMReadTransparentReq.TLVLength = cpu_to_le16(0x02);\n    if (!strcmp((char *)arg, \"EF_ICCID\")) {\n        pMUXMsg->UIMUIMReadTransparentReq.Session_Type = 0x06;\n        pMUXMsg->UIMUIMReadTransparentReq.Aid_Len = 0x00;\n\n        pMUXMsg->UIMUIMReadTransparentReq.TLV2Type = 0x02;\n        pMUXMsg->UIMUIMReadTransparentReq.file_id = cpu_to_le16(0x2FE2);\n        pMUXMsg->UIMUIMReadTransparentReq.path_len = 0x02;\n        pMUXMsg->UIMUIMReadTransparentReq.path[0] = 0x00;\n        pMUXMsg->UIMUIMReadTransparentReq.path[1] = 0x3F;\n    }\n    else if(!strcmp((char *)arg, \"EF_IMSI\")) {\n        pMUXMsg->UIMUIMReadTransparentReq.Session_Type = 0x00;\n        pMUXMsg->UIMUIMReadTransparentReq.Aid_Len = 0x00;\n\n        pMUXMsg->UIMUIMReadTransparentReq.TLV2Type = 0x02;\n        pMUXMsg->UIMUIMReadTransparentReq.file_id = cpu_to_le16(0x6F07);\n        pMUXMsg->UIMUIMReadTransparentReq.path_len = 0x04;\n        pMUXMsg->UIMUIMReadTransparentReq.path[0] = 0x00;\n        pMUXMsg->UIMUIMReadTransparentReq.path[1] = 0x3F;\n        pMUXMsg->UIMUIMReadTransparentReq.path[2] = 0xFF;\n        pMUXMsg->UIMUIMReadTransparentReq.path[3] = 0x7F;\n    }\n\n    pMUXMsg->UIMUIMReadTransparentReq.TLV2Length = cpu_to_le16(3 +  pMUXMsg->UIMUIMReadTransparentReq.path_len);\n\n    pReadTransparent = (PREAD_TRANSPARENT_TLV)(&pMUXMsg->UIMUIMReadTransparentReq.path[pMUXMsg->UIMUIMReadTransparentReq.path_len]);\n    pReadTransparent->TLVType = 0x03;\n    pReadTransparent->TLVLength = cpu_to_le16(0x04);\n    pReadTransparent->Offset = cpu_to_le16(0x00);\n    pReadTransparent->Length = cpu_to_le16(0x00);\n\n    return (sizeof(QMIUIM_READ_TRANSPARENT_REQ_MSG) + pMUXMsg->UIMUIMReadTransparentReq.path_len + sizeof(READ_TRANSPARENT_TLV));\n}\n#endif\n#endif\n\n#ifdef CONFIG_APN\n\nstatic USHORT WdsGetProfileListReqSend(PQMUX_MSG pMUXMsg, void *arg) {\n    (void)(arg);\n    pMUXMsg->GetProfileListReq.Length = cpu_to_le16(sizeof(QMIWDS_GET_PROFILE_LIST_REQ_MSG) - 4);\n    return sizeof(QMIWDS_GET_PROFILE_LIST_REQ_MSG);\n}\n\nstatic USHORT WdsCreateProfileSettingsReqSend(PQMUX_MSG pMUXMsg, void *arg) {\n    PROFILE_T *profile = (PROFILE_T *)arg;\n    pMUXMsg->CreatetProfileSettingsReq.Length = cpu_to_le16(sizeof(QMIWDS_CREATE_PROFILE_SETTINGS_REQ_MSG) - 4);\n    pMUXMsg->CreatetProfileSettingsReq.TLVType = 0x01;\n    pMUXMsg->CreatetProfileSettingsReq.TLVLength = cpu_to_le16(0x01);\n    pMUXMsg->CreatetProfileSettingsReq.ProfileType = 0x00; // 0 ~ 3GPP, 1 ~ 3GPP2\n    pMUXMsg->CreatetProfileSettingsReq.TLV2Type = 0x25;\n    pMUXMsg->CreatetProfileSettingsReq.TLV2Length = cpu_to_le16(0x01);\n    pMUXMsg->CreatetProfileSettingsReq.pdp_context = profile->pdp; // 0 ~ 3GPP, 1 ~ 3GPP2\n    return sizeof(QMIWDS_CREATE_PROFILE_SETTINGS_REQ_MSG);\n}\n\nstatic USHORT WdsGetProfileSettingsReqSend(PQMUX_MSG pMUXMsg, void *arg) {\n    PROFILE_T *profile = (PROFILE_T *)arg;\n    pMUXMsg->GetProfileSettingsReq.Length = cpu_to_le16(sizeof(QMIWDS_GET_PROFILE_SETTINGS_REQ_MSG) - 4);\n    pMUXMsg->GetProfileSettingsReq.TLVType = 0x01;\n    pMUXMsg->GetProfileSettingsReq.TLVLength = cpu_to_le16(0x02);\n    pMUXMsg->GetProfileSettingsReq.ProfileType = 0x00; // 0 ~ 3GPP, 1 ~ 3GPP2\n    pMUXMsg->GetProfileSettingsReq.ProfileIndex = profile->profile_index;\n    return sizeof(QMIWDS_GET_PROFILE_SETTINGS_REQ_MSG);\n}\n\nstatic USHORT WdsModifyProfileSettingsReq(PQMUX_MSG pMUXMsg, void *arg) {\n    USHORT TLVLength = 0;\n    UCHAR *pTLV;\n    PROFILE_T *profile = (PROFILE_T *)arg;\n    PQMIWDS_PDPTYPE pPdpType;\n\n    pMUXMsg->ModifyProfileSettingsReq.Length = cpu_to_le16(sizeof(QMIWDS_MODIFY_PROFILE_SETTINGS_REQ_MSG) - 4);\n    pMUXMsg->ModifyProfileSettingsReq.TLVType = 0x01;\n    pMUXMsg->ModifyProfileSettingsReq.TLVLength = cpu_to_le16(0x02);\n    pMUXMsg->ModifyProfileSettingsReq.ProfileType = 0x00; // 0 ~ 3GPP, 1 ~ 3GPP2\n    pMUXMsg->ModifyProfileSettingsReq.ProfileIndex = profile->profile_index;\n\n    pTLV = (UCHAR *)(&pMUXMsg->ModifyProfileSettingsReq + 1);\n\n    pPdpType = (PQMIWDS_PDPTYPE)(pTLV + TLVLength);\n    pPdpType->TLVType = 0x11;\n    pPdpType->TLVLength = cpu_to_le16(0x01);\n    pPdpType->PdpType = profile->iptype;\n    TLVLength +=(le16_to_cpu(pPdpType->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n\n    // Set APN Name\n    if (profile->apn) {\n        PQMIWDS_APNNAME pApnName = (PQMIWDS_APNNAME)(pTLV + TLVLength);\n        pApnName->TLVType = 0x14;\n        pApnName->TLVLength = cpu_to_le16(strlen(profile->apn));\n        qstrcpy((char *)&pApnName->ApnName, profile->apn);\n        TLVLength +=(le16_to_cpu(pApnName->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n    }\n\n    // Set User Name\n    if (profile->user) {\n        PQMIWDS_USERNAME pUserName = (PQMIWDS_USERNAME)(pTLV + TLVLength);\n        pUserName->TLVType = 0x1B;\n        pUserName->TLVLength = cpu_to_le16(strlen(profile->user));\n        qstrcpy((char *)&pUserName->UserName, profile->user);\n        TLVLength += (le16_to_cpu(pUserName->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n    }\n\n    // Set Password\n    if (profile->pd) {\n        PQMIWDS_PD pPd = (PQMIWDS_PD)(pTLV + TLVLength);\n        pPd->TLVType = 0x1C;\n        pPd->TLVLength = cpu_to_le16(strlen(profile->pd));\n        qstrcpy((char *)&pPd->Pd, profile->pd);\n        TLVLength +=(le16_to_cpu(pPd->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n    }\n\n    // Set Auth Protocol\n    if (profile->user && profile->pd) {\n        PQMIWDS_AUTH_PREFERENCE pAuthPref = (PQMIWDS_AUTH_PREFERENCE)(pTLV + TLVLength);\n        pAuthPref->TLVType = 0x1D;\n        pAuthPref->TLVLength = cpu_to_le16(0x01);\n        pAuthPref->AuthPreference = profile->auth; // 0 ~ None, 1 ~ Pap, 2 ~ Chap, 3 ~ MsChapV2\n        TLVLength += (le16_to_cpu(pAuthPref->TLVLength) + sizeof(QCQMICTL_TLV_HDR));\n    }\n\n    return sizeof(QMIWDS_MODIFY_PROFILE_SETTINGS_REQ_MSG) + TLVLength;\n}\n#endif\n\nstatic USHORT WdsGetRuntimeSettingReq(PQMUX_MSG pMUXMsg, void *arg)\n{\n    (void)arg;\n    pMUXMsg->GetRuntimeSettingsReq.TLVType = 0x10;\n    pMUXMsg->GetRuntimeSettingsReq.TLVLength = cpu_to_le16(0x04);\n    // the following mask also applies to IPV6\n    pMUXMsg->GetRuntimeSettingsReq.Mask = cpu_to_le32(QMIWDS_GET_RUNTIME_SETTINGS_MASK_IPV4DNS_ADDR |\n                                                      QMIWDS_GET_RUNTIME_SETTINGS_MASK_IPV4_ADDR |\n                                                      QMIWDS_GET_RUNTIME_SETTINGS_MASK_MTU |\n                                                      QMIWDS_GET_RUNTIME_SETTINGS_MASK_IPV4GATEWAY_ADDR) |\n                                          QMIWDS_GET_RUNTIME_SETTINGS_MASK_PCSCF_SV_ADDR |\n                                          QMIWDS_GET_RUNTIME_SETTINGS_MASK_PCSCF_DOM_NAME;\n\n    return sizeof(QMIWDS_GET_RUNTIME_SETTINGS_REQ_MSG);\n}\n\nstatic PQCQMIMSG s_pRequest;\nstatic PQCQMIMSG s_pResponse;\n\nstatic int is_response(const PQCQMIMSG pRequest, const PQCQMIMSG pResponse) {\n    if ((pRequest->QMIHdr.QMIType == pResponse->QMIHdr.QMIType)\n        && (pRequest->QMIHdr.ClientId == pResponse->QMIHdr.ClientId)) {\n            USHORT requestTID, responseTID;\n        if (pRequest->QMIHdr.QMIType == QMUX_TYPE_CTL) {\n            requestTID = pRequest->CTLMsg.QMICTLMsgHdr.TransactionId;\n            responseTID = pResponse->CTLMsg.QMICTLMsgHdr.TransactionId;\n        } else {\n            requestTID = le16_to_cpu(pRequest->MUXMsg.QMUXHdr.TransactionId);\n            responseTID = le16_to_cpu(pResponse->MUXMsg.QMUXHdr.TransactionId);\n        }\n        return (requestTID == responseTID);\n    }\n    return 0;\n}\n\nint (*qmidev_send)(PQCQMIMSG pRequest);\n\nint QmiThreadSendQMITimeout(PQCQMIMSG pRequest, PQCQMIMSG *ppResponse, unsigned msecs, const char *funcname) {\n    int ret;\n    \n    if (!pRequest)\n        return -EINVAL;\n\n    pthread_mutex_lock(&cm_command_mutex);\n\n    if (ppResponse)\n        *ppResponse = NULL;\n\n    dump_qmi(pRequest, le16_to_cpu(pRequest->QMIHdr.Length) + 1);\n\n    s_pRequest = pRequest;\n    s_pResponse = NULL;\n\n    ret = qmidev_send(pRequest);\n    if (ret == 0) {\n        ret = pthread_cond_timeout_np(&cm_command_cond, &cm_command_mutex, msecs);\n        if (!ret) {\n            if (s_pResponse && ppResponse) {\n                *ppResponse = s_pResponse;\n            }\n            else if (s_pResponse) {\n                free(s_pResponse);\n                s_pResponse = NULL;\n            }\n            else {\n                dbg_time(\"%s message null\", funcname);\n                ret = -EINVAL;\n            }\n        } else {\n            dbg_time(\"%s message timeout\", funcname);\n        }\n    }\n\n    pthread_mutex_unlock(&cm_command_mutex);\n\n    return ret;\n}\n\nvoid QmiThreadRecvQMI(PQCQMIMSG pResponse) {\n    pthread_mutex_lock(&cm_command_mutex);\n    if (pResponse == NULL) {\n        if (s_pRequest) {\n            free(s_pRequest);\n            s_pRequest = NULL;\n            s_pResponse = NULL;\n            pthread_cond_signal(&cm_command_cond);\n        }\n        pthread_mutex_unlock(&cm_command_mutex);\n        return;\n    }\n    dump_qmi(pResponse, le16_to_cpu(pResponse->QMIHdr.Length) + 1);\n    if (s_pRequest && is_response(s_pRequest, pResponse)) {\n        free(s_pRequest);\n        s_pRequest = NULL;\n        s_pResponse = malloc(le16_to_cpu(pResponse->QMIHdr.Length) + 1);\n        if (s_pResponse != NULL) {\n            memcpy(s_pResponse, pResponse, le16_to_cpu(pResponse->QMIHdr.Length) + 1);\n        }\n        pthread_cond_signal(&cm_command_cond);\n    } else if ((pResponse->QMIHdr.QMIType == QMUX_TYPE_CTL)\n                    && (le16_to_cpu(pResponse->CTLMsg.QMICTLMsgHdrRsp.QMICTLType == QMICTL_REVOKE_CLIENT_ID_IND))) {\n        qmidevice_send_event_to_main(MODEM_REPORT_RESET_EVENT);\n    } else if ((pResponse->QMIHdr.QMIType == QMUX_TYPE_NAS)\n                    && (le16_to_cpu(pResponse->MUXMsg.QMUXMsgHdrResp.Type) == QMINAS_SERVING_SYSTEM_IND)) {\n        qmidevice_send_event_to_main(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED);\n    } else if ((pResponse->QMIHdr.QMIType == QMUX_TYPE_WDS)\n                    && (le16_to_cpu(pResponse->MUXMsg.QMUXMsgHdrResp.Type) == QMIWDS_GET_PKT_SRVC_STATUS_IND)) {\n        qmidevice_send_event_to_main(RIL_UNSOL_DATA_CALL_LIST_CHANGED);\n    } else if ((pResponse->QMIHdr.QMIType == QMUX_TYPE_NAS)\n                    && (le16_to_cpu(pResponse->MUXMsg.QMUXMsgHdrResp.Type) == QMINAS_SYS_INFO_IND)) {\n        qmidevice_send_event_to_main(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED);\n    } else if ((pResponse->QMIHdr.QMIType == QMUX_TYPE_WDS_ADMIN)\n                    && (le16_to_cpu(pResponse->MUXMsg.QMUXMsgHdrResp.Type) == QMI_WDA_SET_LOOPBACK_CONFIG_IND)) {\n    \tqmidevice_send_event_to_main_ext(RIL_UNSOL_LOOPBACK_CONFIG_IND,\n            &pResponse->MUXMsg.SetLoopBackInd, sizeof(pResponse->MUXMsg.SetLoopBackInd));\n    }\n#ifdef CONFIG_REG_QOS_IND\n    else if ((pResponse->QMIHdr.QMIType == QMUX_TYPE_QOS)\n          && (le16_to_cpu(pResponse->MUXMsg.QMUXMsgHdrResp.Type) == QMI_QOS_GLOBAL_QOS_FLOW_IND)) {\n        UINT qos_id = 0;\n        UCHAR new_flow = ql_get_global_qos_flow_ind_qos_id(pResponse, &qos_id);\n        if (qos_id != 0 && new_flow == 1)\n            qmidevice_send_event_to_main_ext(RIL_UNSOL_GLOBAL_QOS_FLOW_IND_QOS_ID, &qos_id, sizeof(qos_id));\n#ifdef CONFIG_GET_QOS_DATA_RATE\n        if (new_flow) {\n            ULONG64 max_data_rate[2] = {0};\n            if (ql_get_global_qos_flow_ind_data_rate(pResponse, (void *)max_data_rate) == 0){}\n        }\n#endif\n    }\n#endif\n    else {\n        if (debug_qmi)\n            dbg_time(\"nobody care this qmi msg!!\");\n    }\n    pthread_mutex_unlock(&cm_command_mutex);\n}\n\n#ifdef CONFIG_COEX_WWAN_STATE\nstatic int requestGetCoexWWANState(void) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    PQMI_COEX_GET_WWAN_STATE_RESP_MSG_LTE_BAND pLteBand;\n    static QMI_COEX_GET_WWAN_STATE_RESP_MSG_LTE_BAND oldLteBand = {-1, -1};\n    int err;\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_COEX, QMI_COEX_GET_WWAN_STATE_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n\n    if (err < 0 || pResponse == NULL) {\n        dbg_time(\"%s err = %d\", __func__, err);\n        return err;\n    }\n\n    pMUXMsg = &pResponse->MUXMsg;\n    if (le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXResult) || le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError)) {\n        dbg_time(\"%s QMUXResult = 0x%x, QMUXError = 0x%x\", __func__, le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXResult), le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError));\n        err = le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError);\n        free(pResponse);\n        return err;\n    } \n    pLteBand = (PQMI_COEX_GET_WWAN_STATE_RESP_MSG_LTE_BAND)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x10);\n\n    if (pLteBand && memcmp(pLteBand, &oldLteBand, sizeof(oldLteBand))) {\n        oldLteBand = *pLteBand;\n        dbg_time(\"%s ul_freq %d ul_bandwidth %d\", __func__, le32_to_cpu(pLteBand->ul_band.freq), le32_to_cpu(pLteBand->ul_band.bandwidth));\n        dbg_time(\"%s dl_freq %d dl_bandwidth %d\", __func__, le32_to_cpu(pLteBand->dl_band.freq), le32_to_cpu(pLteBand->dl_band.bandwidth));\n    }\n    free(pResponse);\n    return 0;\n}\n#endif\n\nstatic int requestSetEthMode(PROFILE_T *profile) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse = NULL;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV linkProto;\n    UCHAR IpPreference;\n    UCHAR autoconnect_setting = 0;\n    QMAP_SETTING qmap_settings = {0};\n\n    qmap_settings.size = sizeof(qmap_settings);\n    \n    if (profile->qmap_mode) {\n        profile->rawIP = 1;\n        s_9x07 = profile->rawIP;\n        \n        qmap_settings.MuxId = profile->muxid;\n\n        if (profile->hardware_interface == HARDWARE_PCIE) { //SDX20_PCIE\n            qmap_settings.rx_urb_size = profile->qmap_size; //SDX24&SDX55 support 32KB \n            qmap_settings.ep_type = DATA_EP_TYPE_PCIE;\n            qmap_settings.iface_id = 0x04;\n        }\n        else if (profile->hardware_interface == HARDWARE_IPA) { // for inside sdx\n            qmap_settings.rx_urb_size = profile->qmap_size; //SDX24&SDX55 support 32KB\n            qmap_settings.ep_type = DATA_EP_TYPE_EMBEDDED;\n            qmap_settings.iface_id = 1; //DSI_DEFAULT_EPID_IPA;\n            //skip for netmgrd send QMI_WDA_SET_DATA_FORMAT_REQ_V01 & QMI_DPM_OPEN_PORT_REQ_V01\n            goto skip_WdaSetDataFormat;\n        }\n        else { // for MDM9x07&MDM9x40&SDX20 USB\n            qmap_settings.rx_urb_size = profile->qmap_size; //SDX24&SDX55 support 32KB\n            qmap_settings.ep_type = DATA_EP_TYPE_HSUSB;\n            qmap_settings.iface_id = 0x04;\n            if(profile->usb_dev.idProduct == 0x0316) //X35 Rmnet interface is 3\n                qmap_settings.iface_id = 0x03;\n        }\n\n        qmap_settings.ul_data_aggregation_max_datagrams = 11; //by test result, 11 can get best TPUT\n        qmap_settings.ul_data_aggregation_max_size = 8*1024;\n        qmap_settings.dl_minimum_padding = 0; //no effect when register to real netowrk\n        if(profile->qmap_version != 0x09)\n            profile->qmap_version = 0x05;\n\n        qmap_version = profile->qmap_version;\n        if (profile->rmnet_info.size) {\n            qmap_settings.rx_urb_size = profile->rmnet_info.rx_urb_size;\n            qmap_settings.ep_type = profile->rmnet_info.ep_type;\n            qmap_settings.iface_id = profile->rmnet_info.iface_id;\n            qmap_settings.dl_minimum_padding = profile->rmnet_info.dl_minimum_padding;\n            qmap_version = profile->rmnet_info.qmap_version;\n        }\n\n        if (!profile->wda_client) {\n            if (qmidev_is_gobinet(profile->qmichannel)) {\n                //when QMAP enabled, set data format in GobiNet driver\n            }\n            else if (profile->proxy[0]) {\n                /* the first running 'quectel-cm' had alloc wda client and set data format,\n                   so we can ingore to set data format here. */\n            }\n            goto skip_WdaSetDataFormat;\n        }\n    }\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS_ADMIN, QMIWDS_ADMIN_SET_DATA_FORMAT_REQ, WdaSetDataFormat, (void *)&qmap_settings);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    linkProto = (PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n    if (linkProto != NULL) {\n        profile->rawIP = (le32_to_cpu(linkProto->Value) == 2);\n        s_9x07 = profile->rawIP; //MDM90x7 only support RAW IP, do not support Eth\n    }\n\n    linkProto = (PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x16);\n    if (linkProto != NULL && profile->qmap_mode) {\n        qmap_settings.rx_urb_size = le32_to_cpu(linkProto->Value);\n        dbg_time(\"qmap_settings.rx_urb_size = %u\", qmap_settings.rx_urb_size); //must same as rx_urb_size defined in GobiNet&qmi_wwan driver\n    }\n\n#ifdef QUECTEL_UL_DATA_AGG\n    if (qmap_settings.ul_data_aggregation_max_datagrams)\n    {\n        linkProto = (PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x17);\n        if (linkProto != NULL) {\n            qmap_settings.ul_data_aggregation_max_datagrams = MIN(qmap_settings.ul_data_aggregation_max_datagrams, le32_to_cpu(linkProto->Value));\n            dbg_time(\"qmap_settings.ul_data_aggregation_max_datagrams  = %u\", qmap_settings.ul_data_aggregation_max_datagrams);\n        }\n\n        linkProto = (PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x18);\n        if (linkProto != NULL) {\n            qmap_settings.ul_data_aggregation_max_size = MIN(qmap_settings.ul_data_aggregation_max_size, le32_to_cpu(linkProto->Value));\n            dbg_time(\"qmap_settings.ul_data_aggregation_max_size       = %u\", qmap_settings.ul_data_aggregation_max_size);\n        }\n\n        linkProto = (PQMIWDS_ADMIN_SET_DATA_FORMAT_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x1A);\n        if (linkProto != NULL) {\n            qmap_settings.dl_minimum_padding = le32_to_cpu(linkProto->Value);\n            dbg_time(\"qmap_settings.dl_minimum_padding                 = %u\", qmap_settings.dl_minimum_padding);\n        }\n\n\tif (qmap_settings.ul_data_aggregation_max_datagrams > 1) {\n\t\tql_set_driver_qmap_setting(profile, &qmap_settings);\n\t}\n    }\n#endif\n\n    free(pResponse);\n\nskip_WdaSetDataFormat:\n    if (profile->enable_ipv4) {\n    \tif (profile->qmapnet_adapter[0]) {\n            // bind wds mux data port\n        \tpRequest = ComposeQMUXMsg(QMUX_TYPE_WDS, QMIWDS_BIND_MUX_DATA_PORT_REQ , WdsSetQMUXBindMuxDataPort, (void *)&qmap_settings);\n        \terr = QmiThreadSendQMI(pRequest, &pResponse);\n        \tqmi_rsp_check_and_return();\n        \tif (pResponse) free(pResponse);\n        }\n\n        // set ipv4\n    \tIpPreference = IpFamilyV4;\n    \tpRequest = ComposeQMUXMsg(QMUX_TYPE_WDS, QMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ, WdsSetClientIPFamilyPref, (void *)&IpPreference);\n    \terr = QmiThreadSendQMI(pRequest, &pResponse);\n    \tif (pResponse) free(pResponse);\n    }\n\n    if (profile->enable_ipv6) {\n        if (profile->qmapnet_adapter[0]) {\n            // bind wds ipv6 mux data port\n            pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS_IPV6, QMIWDS_BIND_MUX_DATA_PORT_REQ , WdsSetQMUXBindMuxDataPort, (void *)&qmap_settings);\n            err = QmiThreadSendQMI(pRequest, &pResponse);\n            qmi_rsp_check_and_return();\n            if (pResponse) free(pResponse);\n        }\n\n        // set ipv6\n        IpPreference = IpFamilyV6;\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS_IPV6, QMIWDS_SET_CLIENT_IP_FAMILY_PREF_REQ, WdsSetClientIPFamilyPref, (void *)&IpPreference);\n        err = QmiThreadSendQMI(pRequest, &pResponse);\n        qmi_rsp_check_and_return();\n        if (pResponse) free(pResponse);\n    }\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS, QMIWDS_SET_AUTO_CONNECT_REQ , WdsSetAutoConnect, (void *)&autoconnect_setting);\n    QmiThreadSendQMI(pRequest, &pResponse);\n    if (pResponse) free(pResponse);\n\n    return 0;\n}\n\n#ifdef CONFIG_SIM\nstatic int requestGetPINStatus(SIM_Status *pSIMStatus) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    PQMIDMS_UIM_PIN_STATUS pPin1Status = NULL;\n    //PQMIDMS_UIM_PIN_STATUS pPin2Status = NULL;\n\n    if (s_9x07)\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_UIM, QMIUIM_GET_CARD_STATUS_REQ, NULL, NULL);\n    else\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_DMS, QMIDMS_UIM_GET_PIN_STATUS_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    pPin1Status = (PQMIDMS_UIM_PIN_STATUS)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n    //pPin2Status = (PQMIDMS_UIM_PIN_STATUS)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x12);\n\n    if (pPin1Status != NULL) {\n        if (pPin1Status->PINStatus == QMI_PIN_STATUS_NOT_VERIF) {\n            *pSIMStatus = SIM_PIN;\n        } else if (pPin1Status->PINStatus == QMI_PIN_STATUS_BLOCKED) {\n            *pSIMStatus = SIM_PUK;\n        } else if (pPin1Status->PINStatus == QMI_PIN_STATUS_PERM_BLOCKED) {\n            *pSIMStatus = SIM_BAD;\n        }\n    }\n\n    free(pResponse);\n    return 0;\n}\n\nstatic int requestGetSIMStatus(SIM_Status *pSIMStatus) { //RIL_REQUEST_GET_SIM_STATUS\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    const char * SIM_Status_String[] = {\n        \"SIM_ABSENT\",\n        \"SIM_NOT_READY\",\n        \"SIM_READY\", /* SIM_READY means the radio state is RADIO_STATE_SIM_READY */\n        \"SIM_PIN\",\n        \"SIM_PUK\",\n        \"SIM_NETWORK_PERSONALIZATION\"\n    };\n\n    if (s_9x07)\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_UIM, QMIUIM_GET_CARD_STATUS_REQ, NULL, NULL);\n    else\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_DMS, QMIDMS_UIM_GET_STATE_REQ, NULL, NULL);\n\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    *pSIMStatus = SIM_ABSENT;\n    if (s_9x07)\n    {\n        PQMIUIM_CARD_STATUS pCardStatus = NULL;\n        PQMIUIM_PIN_STATE pPINState = NULL;\n        UCHAR CardState = 0x01;\n        UCHAR PIN1State = QMI_PIN_STATUS_NOT_VERIF;\n        //UCHAR PIN1Retries;\n        //UCHAR PUK1Retries;\n        //UCHAR PIN2State;\n        //UCHAR PIN2Retries;\n        //UCHAR PUK2Retries;\n\n        pCardStatus = (PQMIUIM_CARD_STATUS)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x10);\n        if (pCardStatus != NULL)\n        {\n            pPINState = (PQMIUIM_PIN_STATE)((PUCHAR)pCardStatus + sizeof(QMIUIM_CARD_STATUS) + pCardStatus->AIDLength);\n            CardState  = pCardStatus->CardState;\n            if (CardState == UIM_CARD_STATE_PRESENT) {\n                if (pPINState->UnivPIN == 1)\n                {\n                   PIN1State = pCardStatus->UPINState;\n                   //PIN1Retries = pCardStatus->UPINRetries;\n                   //PUK1Retries = pCardStatus->UPUKRetries;\n                }\n                else\n                {\n                   PIN1State = pPINState->PIN1State;\n                   //PIN1Retries = pPINState->PIN1Retries;\n                   //PUK1Retries = pPINState->PUK1Retries;\n                }\n                //PIN2State = pPINState->PIN2State;\n                //PIN2Retries = pPINState->PIN2Retries;\n                //PUK2Retries = pPINState->PUK2Retries;\n            }\n        }\n\n        *pSIMStatus = SIM_ABSENT;\n        if ((CardState == 0x01) &&  ((PIN1State == QMI_PIN_STATUS_VERIFIED)|| (PIN1State == QMI_PIN_STATUS_DISABLED)))\n        {\n            *pSIMStatus = SIM_READY;\n        }\n        else if (CardState == 0x01)\n        {\n            if (PIN1State == QMI_PIN_STATUS_NOT_VERIF)\n            {\n                *pSIMStatus = SIM_PIN;\n            }\n            if ( PIN1State == QMI_PIN_STATUS_BLOCKED)\n            {\n                *pSIMStatus = SIM_PUK;\n            }\n            else if (PIN1State == QMI_PIN_STATUS_PERM_BLOCKED)\n            {\n                *pSIMStatus = SIM_BAD;\n            }\n            else if (PIN1State == QMI_PIN_STATUS_NOT_INIT || PIN1State == QMI_PIN_STATUS_VERIFIED || PIN1State == QMI_PIN_STATUS_DISABLED)\n            {\n                *pSIMStatus = SIM_READY;\n            }\n        }\n        else if (CardState == 0x00 || CardState == 0x02)\n        {\n        }\n        else\n        {\n        }\n    }\n    else\n    {\n    //UIM state. Values:\n    // 0x00  UIM initialization completed\n    // 0x01  UIM is locked or the UIM failed\n    // 0x02  UIM is not present\n    // 0x03  Reserved\n    // 0xFF  UIM state is currently\n    //unavailable\n        if (pResponse->MUXMsg.UIMGetStateResp.UIMState == 0x00) {\n            *pSIMStatus = SIM_READY;\n        } else if (pResponse->MUXMsg.UIMGetStateResp.UIMState == 0x01) {\n            *pSIMStatus = SIM_ABSENT;\n            err = requestGetPINStatus(pSIMStatus);\n        } else if ((pResponse->MUXMsg.UIMGetStateResp.UIMState == 0x02) || (pResponse->MUXMsg.UIMGetStateResp.UIMState == 0xFF)) {\n            *pSIMStatus = SIM_ABSENT;\n        } else {\n            *pSIMStatus = SIM_ABSENT;\n        }\n    }\n    dbg_time(\"%s SIMStatus: %s\", __func__, SIM_Status_String[*pSIMStatus]);\n\n    free(pResponse);\n\n    return 0;\n}\n\nstatic int requestEnterSimPin(const char *pPinCode) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n\n    if (s_9x07)\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_UIM, QMIUIM_VERIFY_PIN_REQ, UimVerifyPinReqSend, (void *)pPinCode);\n    else\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_DMS, QMIDMS_UIM_VERIFY_PIN_REQ, DmsUIMVerifyPinReqSend, (void *)pPinCode);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    free(pResponse);\n    return 0;\n}\n#endif\n\n#ifdef CONFIG_IMSI_ICCID\nstatic int requestGetICCID(void) { //RIL_REQUEST_GET_IMSI\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    PQMIUIM_CONTENT pUimContent;\n    int err;\n\n    if (s_9x07) {\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_UIM, QMIUIM_READ_TRANSPARENT_REQ, UimReadTransparentIMSIReqSend, (void *)\"EF_ICCID\");\n        err = QmiThreadSendQMI(pRequest, &pResponse);\n    } else {\n        return 0;\n    }\n    qmi_rsp_check_and_return();\n\n    pUimContent = (PQMIUIM_CONTENT)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n    if (pUimContent != NULL) {\n        static char DeviceICCID[32] = {'\\0'};\n        int i = 0, j = 0;\n\n        for (i = 0, j = 0; i < le16_to_cpu(pUimContent->content_len); ++i) {\n            char charmaps[] = \"0123456789ABCDEF\";\n\n            DeviceICCID[j++] = charmaps[(pUimContent->content[i] & 0x0F)];\n            DeviceICCID[j++] = charmaps[((pUimContent->content[i] & 0xF0) >> 0x04)];\n        }\n        DeviceICCID[j] = '\\0';\n\n        dbg_time(\"%s DeviceICCID: %s\", __func__, DeviceICCID);\n    }\n\n    free(pResponse);\n    return 0;\n}\n\nstatic int requestGetIMSI(void) { //RIL_REQUEST_GET_IMSI\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    PQMIUIM_CONTENT pUimContent;\n    int err;\n\n    if (s_9x07) {\n        pRequest = ComposeQMUXMsg(QMUX_TYPE_UIM, QMIUIM_READ_TRANSPARENT_REQ, UimReadTransparentIMSIReqSend, (void *)\"EF_IMSI\");\n        err = QmiThreadSendQMI(pRequest, &pResponse);\n    } else {\n        return 0;\n    }\n    qmi_rsp_check_and_return();\n\n    pUimContent = (PQMIUIM_CONTENT)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n    if (pUimContent != NULL) {\n        static char DeviceIMSI[32] = {'\\0'};\n        int i = 0, j = 0;\n\n        for (i = 0, j = 0; i < le16_to_cpu(pUimContent->content[0]); ++i) {\n            if (i != 0)\n                DeviceIMSI[j++] = (pUimContent->content[i+1] & 0x0F) + '0';\n            DeviceIMSI[j++] = ((pUimContent->content[i+1] & 0xF0) >> 0x04) + '0';\n        }\n        DeviceIMSI[j] = '\\0';\n\n        dbg_time(\"%s DeviceIMSI: %s\", __func__, DeviceIMSI);\n    }\n\n    free(pResponse);\n    return 0;\n}\n#endif\n\n#if 1\nstatic void quectel_convert_cdma_mcc_2_ascii_mcc( USHORT *p_mcc, USHORT mcc )\n{\n  unsigned int d1, d2, d3, buf = mcc + 111;\n\n  if ( mcc == 0x3FF ) // wildcard\n  {\n    *p_mcc = 3;\n  }\n  else\n  {\n    d3 = buf % 10;\n    buf = ( d3 == 0 ) ? (buf-10)/10 : buf/10;\n\n    d2 = buf % 10;\n    buf = ( d2 == 0 ) ? (buf-10)/10 : buf/10;\n\n    d1 = ( buf == 10 ) ? 0 : buf;\n\n//dbg_time(\"d1:%d, d2:%d,d3:%d\",d1,d2,d3);\n    if ( d1<10 && d2<10 && d3<10 )\n    {\n    *p_mcc = d1*100+d2*10+d3;\n#if 0\n      *(p_mcc+0) = '0' + d1;\n      *(p_mcc+1) = '0' + d2;\n      *(p_mcc+2) = '0' + d3;\n#endif\n    }\n    else\n    {\n      //dbg_time( \"invalid digits %d %d %d\", d1, d2, d3 );\n      *p_mcc = 0;\n    }\n  }\n}\n\nstatic void quectel_convert_cdma_mnc_2_ascii_mnc( USHORT *p_mnc, USHORT imsi_11_12)\n{\n  unsigned int d1, d2, buf = imsi_11_12 + 11;\n\n  if ( imsi_11_12 == 0x7F ) // wildcard\n  {\n    *p_mnc = 7;\n  }\n  else\n  {\n    d2 = buf % 10;\n    buf = ( d2 == 0 ) ? (buf-10)/10 : buf/10;\n\n    d1 = ( buf == 10 ) ? 0 : buf;\n\n    if ( d1<10 && d2<10 )\n    {\n     *p_mnc = d1*10 + d2;\n    }\n    else\n    {\n      //dbg_time( \"invalid digits %d %d\", d1, d2, 0 );\n      *p_mnc = 0;\n    }\n  }\n}\n\nstatic int requestGetHomeNetwork(USHORT *p_mcc, USHORT *p_mnc, USHORT *p_sid, USHORT *p_nid) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    PHOME_NETWORK pHomeNetwork;\n    PHOME_NETWORK_SYSTEMID pHomeNetworkSystemID;\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_NAS, QMINAS_GET_HOME_NETWORK_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    pHomeNetwork = (PHOME_NETWORK)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x01);\n    if (pHomeNetwork && p_mcc && p_mnc ) {\n        *p_mcc = le16_to_cpu(pHomeNetwork->MobileCountryCode);\n        *p_mnc = le16_to_cpu(pHomeNetwork->MobileNetworkCode);\n        //dbg_time(\"%s MobileCountryCode: %d, MobileNetworkCode: %d\", __func__, *pMobileCountryCode, *pMobileNetworkCode);\n    }\n\n    pHomeNetworkSystemID = (PHOME_NETWORK_SYSTEMID)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x10);\n    if (pHomeNetworkSystemID && p_sid && p_nid) {\n        *p_sid = le16_to_cpu(pHomeNetworkSystemID->SystemID); //china-hefei: sid 14451\n        *p_nid = le16_to_cpu(pHomeNetworkSystemID->NetworkID);\n        //dbg_time(\"%s SystemID: %d, NetworkID: %d\", __func__, *pSystemID, *pNetworkID);\n    }\n\n    free(pResponse);\n\n    return 0;\n}\n#endif\n\n#if 0\n// Lookup table for carriers known to produce SIMs which incorrectly indicate MNC length.\nstatic const char * MCCMNC_CODES_HAVING_3DIGITS_MNC[] = {\n    \"302370\", \"302720\", \"310260\",\n    \"405025\", \"405026\", \"405027\", \"405028\", \"405029\", \"405030\", \"405031\", \"405032\",\n    \"405033\", \"405034\", \"405035\", \"405036\", \"405037\", \"405038\", \"405039\", \"405040\",\n    \"405041\", \"405042\", \"405043\", \"405044\", \"405045\", \"405046\", \"405047\", \"405750\",\n    \"405751\", \"405752\", \"405753\", \"405754\", \"405755\", \"405756\", \"405799\", \"405800\",\n    \"405801\", \"405802\", \"405803\", \"405804\", \"405805\", \"405806\", \"405807\", \"405808\",\n    \"405809\", \"405810\", \"405811\", \"405812\", \"405813\", \"405814\", \"405815\", \"405816\",\n    \"405817\", \"405818\", \"405819\", \"405820\", \"405821\", \"405822\", \"405823\", \"405824\",\n    \"405825\", \"405826\", \"405827\", \"405828\", \"405829\", \"405830\", \"405831\", \"405832\",\n    \"405833\", \"405834\", \"405835\", \"405836\", \"405837\", \"405838\", \"405839\", \"405840\",\n    \"405841\", \"405842\", \"405843\", \"405844\", \"405845\", \"405846\", \"405847\", \"405848\",\n    \"405849\", \"405850\", \"405851\", \"405852\", \"405853\", \"405875\", \"405876\", \"405877\",\n    \"405878\", \"405879\", \"405880\", \"405881\", \"405882\", \"405883\", \"405884\", \"405885\",\n    \"405886\", \"405908\", \"405909\", \"405910\", \"405911\", \"405912\", \"405913\", \"405914\",\n    \"405915\", \"405916\", \"405917\", \"405918\", \"405919\", \"405920\", \"405921\", \"405922\",\n    \"405923\", \"405924\", \"405925\", \"405926\", \"405927\", \"405928\", \"405929\", \"405930\",\n    \"405931\", \"405932\", \"502142\", \"502143\", \"502145\", \"502146\", \"502147\", \"502148\"\n};\n\nstatic const char * MCC_CODES_HAVING_3DIGITS_MNC[] = {\n    \"302\",    //Canada\n    \"310\",    //United States of America\n    \"311\",    //United States of America\n    \"312\",    //United States of America\n    \"313\",    //United States of America\n    \"314\",    //United States of America\n    \"315\",    //United States of America\n    \"316\",    //United States of America\n    \"334\",    //Mexico\n    \"338\",    //Jamaica\n    \"342\", //Barbados\n    \"344\",    //Antigua and Barbuda\n    \"346\",    //Cayman Islands\n    \"348\",    //British Virgin Islands\n    \"365\",    //Anguilla\n    \"708\",    //Honduras (Republic of)\n    \"722\",    //Argentine Republic\n    \"732\"    //Colombia (Republic of)\n};\n\nint requestGetIMSI(const char **pp_imsi, USHORT *pMobileCountryCode, USHORT *pMobileNetworkCode) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n\n    if (pp_imsi) *pp_imsi = NULL;\n    if (pMobileCountryCode) *pMobileCountryCode = 0;\n    if (pMobileNetworkCode) *pMobileNetworkCode = 0;\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_DMS, QMIDMS_UIM_GET_IMSI_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    if (pMUXMsg->UIMGetIMSIResp.TLV2Type == 0x01 &&  le16_to_cpu(pMUXMsg->UIMGetIMSIResp.TLV2Length) >= 5) {\n        int mnc_len = 2;\n        unsigned i;\n        char tmp[4];\n\n        if (pp_imsi) *pp_imsi = strndup((const char *)(&pMUXMsg->UIMGetIMSIResp.IMSI), le16_to_cpu(pMUXMsg->UIMGetIMSIResp.TLV2Length));\n\n        for (i = 0; i < sizeof(MCCMNC_CODES_HAVING_3DIGITS_MNC)/sizeof(MCCMNC_CODES_HAVING_3DIGITS_MNC[0]); i++) {\n            if (!strncmp((const char *)(&pMUXMsg->UIMGetIMSIResp.IMSI), MCCMNC_CODES_HAVING_3DIGITS_MNC[i], 6)) {\n                mnc_len = 3;\n                break;\n            }\n        }\n        if (mnc_len == 2) {\n            for (i = 0; i < sizeof(MCC_CODES_HAVING_3DIGITS_MNC)/sizeof(MCC_CODES_HAVING_3DIGITS_MNC[0]); i++) {\n                if (!strncmp((const char *)(&pMUXMsg->UIMGetIMSIResp.IMSI), MCC_CODES_HAVING_3DIGITS_MNC[i], 3)) {\n                    mnc_len = 3;\n                    break;\n                }\n            }\n        }\n\n        tmp[0] = (&pMUXMsg->UIMGetIMSIResp.IMSI)[0];\n        tmp[1] = (&pMUXMsg->UIMGetIMSIResp.IMSI)[1];\n        tmp[2] = (&pMUXMsg->UIMGetIMSIResp.IMSI)[2];\n        tmp[3] = 0;\n        if (pMobileCountryCode) *pMobileCountryCode = atoi(tmp);\n        tmp[0] = (&pMUXMsg->UIMGetIMSIResp.IMSI)[3];\n        tmp[1] = (&pMUXMsg->UIMGetIMSIResp.IMSI)[4];\n        tmp[2] = 0;\n        if (mnc_len == 3) {\n            tmp[2] = (&pMUXMsg->UIMGetIMSIResp.IMSI)[6];\n        }\n        if (pMobileNetworkCode) *pMobileNetworkCode = atoi(tmp);\n    }\n\n    free(pResponse);\n\n    return 0;\n}\n#endif\n\nstatic struct wwan_data_class_str class2str[] = {\n    {WWAN_DATA_CLASS_NONE, \"UNKNOWN\"},\n    {WWAN_DATA_CLASS_GPRS, \"GPRS\"},\n    {WWAN_DATA_CLASS_EDGE, \"EDGE\"},\n    {WWAN_DATA_CLASS_UMTS, \"UMTS\"},\n    {WWAN_DATA_CLASS_HSDPA, \"HSDPA\"},\n    {WWAN_DATA_CLASS_HSUPA, \"HSUPA\"},\n    {WWAN_DATA_CLASS_LTE, \"LTE\"},\n    {WWAN_DATA_CLASS_5G_NSA, \"5G_NSA\"},\n    {WWAN_DATA_CLASS_5G_SA, \"5G_SA\"},\n    {WWAN_DATA_CLASS_1XRTT, \"1XRTT\"},\n    {WWAN_DATA_CLASS_1XEVDO, \"1XEVDO\"},\n    {WWAN_DATA_CLASS_1XEVDO_REVA, \"1XEVDO_REVA\"},\n    {WWAN_DATA_CLASS_1XEVDV, \"1XEVDV\"},\n    {WWAN_DATA_CLASS_3XRTT, \"3XRTT\"},\n    {WWAN_DATA_CLASS_1XEVDO_REVB, \"1XEVDO_REVB\"},\n    {WWAN_DATA_CLASS_UMB, \"UMB\"},\n    {WWAN_DATA_CLASS_CUSTOM, \"CUSTOM\"},\n};\n\nstatic const char *wwan_data_class2str(ULONG class)\n{\n    unsigned int i = 0;\n    for (i = 0; i < sizeof(class2str)/sizeof(class2str[0]); i++) {\n        if (class2str[i].class == class) {\n            return class2str[i].str;\n        }\n    }\n    return \"UNKNOWN\";\n}\n\nstatic USHORT char2ushort(UCHAR str[3]) {\n    int i;\n    char temp[4];\n    USHORT ret= 0;\n\n    memcpy(temp, str, 3);\n    temp[3] = '\\0';\n\n    for (i = 0; i < 4; i++) {\n        if ((UCHAR)temp[i] == 0xFF) {\n            temp[i] = '\\0';\n        }\n    }\n    ret = (USHORT)atoi(temp);\n\n    return ret;\n}\n\nstatic int requestRegistrationState2(UCHAR *pPSAttachedState) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    USHORT MobileCountryCode = 0;\n    USHORT MobileNetworkCode = 0;\n    const char *pDataCapStr = \"UNKNOW\";\n    LONG remainingLen;\n    PSERVICE_STATUS_INFO pServiceStatusInfo;\n    int is_lte = 0;\n    PCDMA_SYSTEM_INFO pCdmaSystemInfo;\n    PHDR_SYSTEM_INFO pHdrSystemInfo;\n    PGSM_SYSTEM_INFO pGsmSystemInfo;\n    PWCDMA_SYSTEM_INFO pWcdmaSystemInfo;\n    PLTE_SYSTEM_INFO pLteSystemInfo;\n    PTDSCDMA_SYSTEM_INFO pTdscdmaSystemInfo;\n    PNR5G_SYSTEM_INFO pNr5gSystemInfo;\n    UCHAR DeviceClass = 0;\n    ULONG DataCapList = 0;\n    \n    /*  Additional LTE System Info - Availability of Dual connectivity of E-UTRA with NR5G */\n    uint8_t endc_available_valid = 0;  /**< Must be set to true if endc_available is being passed */\n    uint8_t endc_available = 0x00;\n    /**<  \n       Upper layer indication in LTE SIB2. Values: \\n\n       - 0x00 -- 5G Not available \\n\n       - 0x01 -- 5G Available\n       \n    */\n    /*  Additional LTE System Info - DCNR restriction Info */\n    uint8_t restrict_dcnr_valid = 0;  /**< Must be set to true if restrict_dcnr is being passed */\n    uint8_t restrict_dcnr = 0x01;\n    /**<  \n       DCNR restriction in NAS attach/TAU accept. Values: \\n\n       - 0x00 -- Not restricted \\n\n       - 0x01 -- Restricted\n    */\n\n    *pPSAttachedState = 0;\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_NAS, QMINAS_GET_SYS_INFO_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    pServiceStatusInfo = (PSERVICE_STATUS_INFO)(((PCHAR)&pMUXMsg->GetSysInfoResp) + QCQMUX_MSG_HDR_SIZE);\n    remainingLen = le16_to_cpu(pMUXMsg->GetSysInfoResp.Length);\n\n    s_is_cdma = 0;\n    s_5g_type = WWAN_DATA_CLASS_NONE;\n    s_hdr_personality = 0;\n    while (remainingLen > 0) {\n        switch (pServiceStatusInfo->TLVType) {\n        case 0x10: // CDMA\n            if (pServiceStatusInfo->SrvStatus == 0x02) {\n                DataCapList = WWAN_DATA_CLASS_1XRTT|\n                              WWAN_DATA_CLASS_1XEVDO|\n                              WWAN_DATA_CLASS_1XEVDO_REVA|\n                              WWAN_DATA_CLASS_1XEVDV|\n                              WWAN_DATA_CLASS_1XEVDO_REVB;\n                DeviceClass = DEVICE_CLASS_CDMA;\n                s_is_cdma = (0 == is_lte);\n            }\n            break;\n        case 0x11: // HDR\n            if (pServiceStatusInfo->SrvStatus == 0x02) {\n                DataCapList = WWAN_DATA_CLASS_3XRTT|\n                              WWAN_DATA_CLASS_UMB;\n                DeviceClass = DEVICE_CLASS_CDMA;\n                s_is_cdma = (0 == is_lte);\n            }\n            break;\n        case 0x12: // GSM\n            if (pServiceStatusInfo->SrvStatus == 0x02) {\n                DataCapList = WWAN_DATA_CLASS_GPRS|\n                              WWAN_DATA_CLASS_EDGE;\n                DeviceClass = DEVICE_CLASS_GSM;\n            }\n            break;\n        case 0x13: // WCDMA\n            if (pServiceStatusInfo->SrvStatus == 0x02) {\n                DataCapList = WWAN_DATA_CLASS_UMTS;\n                DeviceClass = DEVICE_CLASS_GSM;\n            }\n            break;\n        case 0x14: // LTE\n            if (pServiceStatusInfo->SrvStatus == 0x02) {\n                DataCapList = WWAN_DATA_CLASS_LTE;\n                DeviceClass = DEVICE_CLASS_GSM;\n                is_lte = 1;\n                s_is_cdma = 0;\n            }\n            break;\n        case 0x4A: // NR5G Service Status Info\n            if (pServiceStatusInfo->SrvStatus == NAS_SYS_SRV_STATUS_SRV_V01) {\n                DataCapList |= WWAN_DATA_CLASS_5G_SA;\n                DeviceClass = DEVICE_CLASS_GSM;\n                is_lte = 1;\n                s_is_cdma = 0;\n            }\n            break;\n        case 0x4B: // NR5G System Info\n            pNr5gSystemInfo = (PNR5G_SYSTEM_INFO)pServiceStatusInfo;\n            if (pNr5gSystemInfo->srv_domain_valid == 0x01) {\n                if (pNr5gSystemInfo->srv_domain & SYS_SRV_DOMAIN_PS_ONLY_V01) {\n                    *pPSAttachedState = 1;\n                }\n            }\n\n            if (pNr5gSystemInfo->network_id_valid == 0x01) {\n                MobileCountryCode = (USHORT)char2ushort(pNr5gSystemInfo->MCC);\n                MobileNetworkCode = (USHORT)char2ushort(pNr5gSystemInfo->MNC);\n            }\n            break;\n        case 0x4E: //Additional LTE System Info - Availability of Dual Connectivity of E-UTRA with NR5G\n            endc_available_valid = 1;\n            endc_available = pServiceStatusInfo->SrvStatus;\n            break;\n            \n        case 0x4F: //Additional LTE System Info - DCNR restriction Info\n            restrict_dcnr_valid = 1;\n            restrict_dcnr = pServiceStatusInfo->SrvStatus;\n            break;\n\n        case 0x24: // TDSCDMA\n            if (pServiceStatusInfo->SrvStatus == 0x02) {\n                pDataCapStr = \"TD-SCDMA\";\n            }\n            break;\n        case 0x15: // CDMA\n            // CDMA_SYSTEM_INFO\n            pCdmaSystemInfo = (PCDMA_SYSTEM_INFO)pServiceStatusInfo;\n            if (pCdmaSystemInfo->SrvDomainValid == 0x01) {\n                if (pCdmaSystemInfo->SrvDomain & 0x02) {\n                    *pPSAttachedState = 1;\n                    s_is_cdma = (0 == is_lte);\n                }\n            }\n#if 0\n            if (pCdmaSystemInfo->SrvCapabilityValid == 0x01) {\n                *pPSAttachedState = 0;\n                if (pCdmaSystemInfo->SrvCapability & 0x02) {\n                    *pPSAttachedState = 1;\n                    s_is_cdma = (0 == is_lte);\n                }\n            }\n#endif\n            if (pCdmaSystemInfo->NetworkIdValid == 0x01) {\n                MobileCountryCode = (USHORT)char2ushort(pCdmaSystemInfo->MCC);\n                MobileNetworkCode = (USHORT)char2ushort(pCdmaSystemInfo->MNC);\n            }\n            break;\n        case 0x16: // HDR\n            // HDR_SYSTEM_INFO\n            pHdrSystemInfo = (PHDR_SYSTEM_INFO)pServiceStatusInfo;\n            if (pHdrSystemInfo->SrvDomainValid == 0x01) {\n                if (pHdrSystemInfo->SrvDomain & 0x02) {\n                    *pPSAttachedState = 1;\n                    s_is_cdma = (0 == is_lte);\n                }\n            }\n#if 0\n            if (pHdrSystemInfo->SrvCapabilityValid == 0x01) {\n                *pPSAttachedState = 0;\n                if (pHdrSystemInfo->SrvCapability & 0x02) {\n                    *pPSAttachedState = 1;\n                    s_is_cdma = (0 == is_lte);\n                }\n            }\n#endif\n            if (*pPSAttachedState && pHdrSystemInfo->HdrPersonalityValid == 0x01) {\n                if (pHdrSystemInfo->HdrPersonality == 0x03)\n                    s_hdr_personality = 0x02;\n                //else if (pHdrSystemInfo->HdrPersonality == 0x02)\n                //    s_hdr_personality = 0x01;\n            }\n            USHORT cmda_mcc = 0, cdma_mnc = 0;\n            if(!requestGetHomeNetwork(&cmda_mcc, &cdma_mnc,NULL, NULL) && cmda_mcc) {\n                quectel_convert_cdma_mcc_2_ascii_mcc(&MobileCountryCode, cmda_mcc);\n                quectel_convert_cdma_mnc_2_ascii_mnc(&MobileNetworkCode, cdma_mnc);\n            }\n            break;\n        case 0x17: // GSM\n            // GSM_SYSTEM_INFO\n            pGsmSystemInfo = (PGSM_SYSTEM_INFO)pServiceStatusInfo;\n            if (pGsmSystemInfo->SrvDomainValid == 0x01) {\n                if (pGsmSystemInfo->SrvDomain & 0x02) {\n                    *pPSAttachedState = 1;\n                }\n            }\n#if 0\n            if (pGsmSystemInfo->SrvCapabilityValid == 0x01) {\n                *pPSAttachedState = 0;\n                if (pGsmSystemInfo->SrvCapability & 0x02) {\n                    *pPSAttachedState = 1;\n                }\n            }\n#endif\n            if (pGsmSystemInfo->NetworkIdValid == 0x01) {\n                MobileCountryCode = (USHORT)char2ushort(pGsmSystemInfo->MCC);\n                MobileNetworkCode = (USHORT)char2ushort(pGsmSystemInfo->MNC);\n            }\n            break;\n        case 0x18: // WCDMA\n            // WCDMA_SYSTEM_INFO\n            pWcdmaSystemInfo = (PWCDMA_SYSTEM_INFO)pServiceStatusInfo;\n            if (pWcdmaSystemInfo->SrvDomainValid == 0x01) {\n                if (pWcdmaSystemInfo->SrvDomain & 0x02) {\n                    *pPSAttachedState = 1;\n                }\n            }\n#if 0\n            if (pWcdmaSystemInfo->SrvCapabilityValid == 0x01) {\n                *pPSAttachedState = 0;\n                if (pWcdmaSystemInfo->SrvCapability & 0x02) {\n                    *pPSAttachedState = 1;\n                }\n            }\n#endif\n            if (pWcdmaSystemInfo->NetworkIdValid == 0x01) {\n                MobileCountryCode = (USHORT)char2ushort(pWcdmaSystemInfo->MCC);\n                MobileNetworkCode = (USHORT)char2ushort(pWcdmaSystemInfo->MNC);\n            }\n            break;\n        case 0x19: // LTE_SYSTEM_INFO\n            // LTE_SYSTEM_INFO\n            pLteSystemInfo = (PLTE_SYSTEM_INFO)pServiceStatusInfo;\n            if (pLteSystemInfo->SrvDomainValid == 0x01) {\n                if (pLteSystemInfo->SrvDomain & 0x02) {\n                    *pPSAttachedState = 1;\n                    is_lte = 1;\n                    s_is_cdma = 0;\n                }\n            }\n#if 0\n            if (pLteSystemInfo->SrvCapabilityValid == 0x01) {\n                *pPSAttachedState = 0;\n                if (pLteSystemInfo->SrvCapability & 0x02) {\n                    *pPSAttachedState = 1;\n                    is_lte = 1;\n                    s_is_cdma = 0;\n                }\n            }\n#endif\n            if (pLteSystemInfo->NetworkIdValid == 0x01) {\n                MobileCountryCode = (USHORT)char2ushort(pLteSystemInfo->MCC);\n                MobileNetworkCode = (USHORT)char2ushort(pLteSystemInfo->MNC);\n            }\n            break;\n        case 0x25: // TDSCDMA\n            // TDSCDMA_SYSTEM_INFO\n            pTdscdmaSystemInfo = (PTDSCDMA_SYSTEM_INFO)pServiceStatusInfo;\n            if (pTdscdmaSystemInfo->SrvDomainValid == 0x01) {\n                if (pTdscdmaSystemInfo->SrvDomain & 0x02) {\n                    *pPSAttachedState = 1;\n                }\n            }\n#if 0\n            if (pTdscdmaSystemInfo->SrvCapabilityValid == 0x01) {\n                *pPSAttachedState = 0;\n                if (pTdscdmaSystemInfo->SrvCapability & 0x02) {\n                    *pPSAttachedState = 1;\n                }\n            }\n#endif\n            if (pTdscdmaSystemInfo->NetworkIdValid == 0x01) {\n                MobileCountryCode = (USHORT)char2ushort(pTdscdmaSystemInfo->MCC);\n                MobileNetworkCode = (USHORT)char2ushort(pTdscdmaSystemInfo->MNC);\n            }\n            break;\n        default:\n            break;\n        } /* switch (pServiceStatusInfo->TLYType) */\n\n        remainingLen -= (le16_to_cpu(pServiceStatusInfo->TLVLength) + 3);\n        pServiceStatusInfo = (PSERVICE_STATUS_INFO)((PCHAR)&pServiceStatusInfo->TLVLength + le16_to_cpu(pServiceStatusInfo->TLVLength) + sizeof(USHORT));\n    } /* while (remainingLen > 0) */\n\n    if (DataCapList & WWAN_DATA_CLASS_LTE) {\n        if (endc_available_valid && restrict_dcnr_valid) {\n            if (endc_available && !restrict_dcnr) {\n                DataCapList |= WWAN_DATA_CLASS_5G_NSA;\n            }\n        }\n    }\n\n    if (DeviceClass == DEVICE_CLASS_CDMA) {\n        if (s_hdr_personality == 2) {\n            pDataCapStr = s_hdr_personality == 2 ? \"eHRPD\" : \"HRPD\";\n        } else if (DataCapList & WWAN_DATA_CLASS_1XEVDO_REVB) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_1XEVDO_REVB);\n        } else if (DataCapList & WWAN_DATA_CLASS_1XEVDO_REVA) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_1XEVDO_REVA);\n        } else if (DataCapList & WWAN_DATA_CLASS_1XEVDO) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_1XEVDO);\n        } else if (DataCapList & WWAN_DATA_CLASS_1XRTT) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_1XRTT);\n        } else if (DataCapList & WWAN_DATA_CLASS_3XRTT) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_3XRTT);\n        } else if (DataCapList & WWAN_DATA_CLASS_UMB) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_UMB);\n        }\n    } else {\n        if (DataCapList & WWAN_DATA_CLASS_5G_SA) {\n            s_5g_type = WWAN_DATA_CLASS_5G_SA;\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_5G_SA);\n        } else if (DataCapList & WWAN_DATA_CLASS_5G_NSA) {\n            s_5g_type = WWAN_DATA_CLASS_5G_NSA;\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_5G_NSA);\n        } else if (DataCapList & WWAN_DATA_CLASS_LTE) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_LTE);\n        } else if ((DataCapList & WWAN_DATA_CLASS_HSDPA) && (DataCapList & WWAN_DATA_CLASS_HSUPA)) {\n            pDataCapStr = \"HSDPA_HSUPA\";\n        } else if (DataCapList & WWAN_DATA_CLASS_HSDPA) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_HSDPA);\n        } else if (DataCapList & WWAN_DATA_CLASS_HSUPA) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_HSUPA);\n        } else if (DataCapList & WWAN_DATA_CLASS_UMTS) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_UMTS);\n        } else if (DataCapList & WWAN_DATA_CLASS_EDGE) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_EDGE);\n        } else if (DataCapList & WWAN_DATA_CLASS_GPRS) {\n            pDataCapStr = wwan_data_class2str(WWAN_DATA_CLASS_GPRS);\n        }\n    }\n\n    dbg_time(\"%s MCC: %d, MNC: %d, PS: %s, DataCap: %s\", __func__,\n        MobileCountryCode, MobileNetworkCode, (*pPSAttachedState == 1) ? \"Attached\" : \"Detached\" , pDataCapStr);\n\n    free(pResponse);\n\n    return 0;\n}\n\nstatic int requestRegistrationState(UCHAR *pPSAttachedState) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    PQMINAS_CURRENT_PLMN_MSG pCurrentPlmn;\n    PSERVING_SYSTEM pServingSystem;\n    PQMINAS_DATA_CAP pDataCap;\n    USHORT MobileCountryCode = 0;\n    USHORT MobileNetworkCode = 0;\n    const char *pDataCapStr = \"UNKNOW\";\n\n    if (s_9x07) {\n        return requestRegistrationState2(pPSAttachedState);\n    }\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_NAS, QMINAS_GET_SERVING_SYSTEM_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    pCurrentPlmn = (PQMINAS_CURRENT_PLMN_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x12);\n    if (pCurrentPlmn) {\n        MobileCountryCode = le16_to_cpu(pCurrentPlmn->MobileCountryCode);\n        MobileNetworkCode = le16_to_cpu(pCurrentPlmn->MobileNetworkCode);\n    }\n\n    *pPSAttachedState = 0;\n    pServingSystem = (PSERVING_SYSTEM)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x01);\n    if (pServingSystem) {\n    //Packet-switched domain attach state of the mobile.\n    //0x00    PS_UNKNOWN ?Unknown or not applicable\n    //0x01    PS_ATTACHED ?Attached\n    //0x02    PS_DETACHED ?Detached\n        *pPSAttachedState = pServingSystem->RegistrationState;\n        if (pServingSystem->RegistrationState == 0x01) //0x01 ?C REGISTERED ?C Registered with a network\n            *pPSAttachedState  = pServingSystem->PSAttachedState;\n        else {\n            //MobileCountryCode = MobileNetworkCode = 0;\n            *pPSAttachedState  = 0x02;\n        }\n    }\n\n    pDataCap = (PQMINAS_DATA_CAP)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n    if (pDataCap && pDataCap->DataCapListLen) {\n        UCHAR *DataCap = &pDataCap->DataCap;\n        if (pDataCap->DataCapListLen == 2) {\n            if ((DataCap[0] == 0x06) && ((DataCap[1] == 0x08) || (DataCap[1] == 0x0A)))\n                DataCap[0] = DataCap[1];\n        }\n        switch (DataCap[0]) {\n             case 0x01: pDataCapStr = \"GPRS\"; break;\n             case 0x02: pDataCapStr = \"EDGE\"; break;\n             case 0x03: pDataCapStr = \"HSDPA\"; break;\n             case 0x04: pDataCapStr = \"HSUPA\"; break;\n             case 0x05: pDataCapStr = \"UMTS\"; break;\n             case 0x06: pDataCapStr = \"1XRTT\"; break;\n             case 0x07: pDataCapStr = \"1XEVDO\"; break;\n             case 0x08: pDataCapStr = \"1XEVDO_REVA\"; break;\n             case 0x09: pDataCapStr = \"GPRS\"; break;\n             case 0x0A: pDataCapStr = \"1XEVDO_REVB\"; break;\n             case 0x0B: pDataCapStr = \"LTE\"; break;\n             case 0x0C: pDataCapStr = \"HSDPA\"; break;\n             case 0x0D: pDataCapStr = \"HSDPA\"; break;\n             default: pDataCapStr = \"UNKNOW\"; break;\n        }\n    }\n\n    if (pServingSystem && pServingSystem->RegistrationState == 0x01 && pServingSystem->InUseRadioIF && pServingSystem->RadioIF == 0x09) {\n        pDataCapStr = \"TD-SCDMA\";\n    }\n\n    s_is_cdma = 0;\n    if (pServingSystem && pServingSystem->RegistrationState == 0x01 && pServingSystem->InUseRadioIF && (pServingSystem->RadioIF == 0x01 || pServingSystem->RadioIF == 0x02)) {\n        USHORT cmda_mcc = 0, cdma_mnc = 0;\n        s_is_cdma = 1;\n        if(!requestGetHomeNetwork(&cmda_mcc, &cdma_mnc,NULL, NULL) && cmda_mcc) {\n            quectel_convert_cdma_mcc_2_ascii_mcc(&MobileCountryCode, cmda_mcc);\n            quectel_convert_cdma_mnc_2_ascii_mnc(&MobileNetworkCode, cdma_mnc);\n        }\n        if (1) {\n            PQCQMUX_TLV pTLV = (PQCQMUX_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x23);\n            if (pTLV)\n                s_hdr_personality = pTLV->Value;\n            else\n                s_hdr_personality = 0;\n            if (s_hdr_personality == 2)\n                pDataCapStr = \"eHRPD\";\n        }\n    }\n\n    dbg_time(\"%s MCC: %d, MNC: %d, PS: %s, DataCap: %s\", __func__,\n        MobileCountryCode, MobileNetworkCode, (*pPSAttachedState == 1) ? \"Attached\" : \"Detached\" , pDataCapStr);\n\n    free(pResponse);\n\n    return 0;\n}\n\nstatic int requestQueryDataCall(UCHAR  *pConnectionStatus, int curIpFamily) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    PQMIWDS_PKT_SRVC_TLV pPktSrvc;\n    UCHAR oldConnectionStatus = *pConnectionStatus;\n    UCHAR QMIType = (curIpFamily == IpFamilyV4) ? QMUX_TYPE_WDS : QMUX_TYPE_WDS_IPV6;\n\n    pRequest = ComposeQMUXMsg(QMIType, QMIWDS_GET_PKT_SRVC_STATUS_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    *pConnectionStatus = QWDS_PKT_DATA_DISCONNECTED;\n    pPktSrvc = (PQMIWDS_PKT_SRVC_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x01);\n    if (pPktSrvc) {\n        *pConnectionStatus = pPktSrvc->ConnectionStatus;\n        if ((le16_to_cpu(pPktSrvc->TLVLength) == 2) && (pPktSrvc->ReconfigReqd == 0x01))\n            *pConnectionStatus = QWDS_PKT_DATA_DISCONNECTED;\n    }\n\n    if (*pConnectionStatus == QWDS_PKT_DATA_DISCONNECTED) {\n        if (curIpFamily == IpFamilyV4)\n            WdsConnectionIPv4Handle = 0;\n        else\n            WdsConnectionIPv6Handle = 0;\n    }\n\n    if (oldConnectionStatus != *pConnectionStatus || debug_qmi) {\n        dbg_time(\"%s %sConnectionStatus: %s\", __func__, (curIpFamily == IpFamilyV4) ? \"IPv4\" : \"IPv6\",\n            (*pConnectionStatus == QWDS_PKT_DATA_CONNECTED) ? \"CONNECTED\" : \"DISCONNECTED\");\n    }\n\n    free(pResponse);\n    return 0;\n}\n\nstatic int requestSetupDataCall(PROFILE_T *profile, int curIpFamily) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err = 0;\n    UCHAR QMIType = (curIpFamily == IpFamilyV4) ? QMUX_TYPE_WDS : QMUX_TYPE_WDS_IPV6;\n\n//DualIPSupported means can get ipv4 & ipv6 address at the same time, one wds for ipv4, the other wds for ipv6\n    profile->curIpFamily = curIpFamily;\n    pRequest = ComposeQMUXMsg(QMIType, QMIWDS_START_NETWORK_INTERFACE_REQ, WdsStartNwInterfaceReq, profile);\n    err = QmiThreadSendQMITimeout(pRequest, &pResponse, 120 * 1000, __func__);\n    qmi_rsp_check();\n\n    if (le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXResult) || le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError)) {\n        PQMI_TLV_HDR pTLVHdr;\n\n        pTLVHdr = GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x10);\n        if (pTLVHdr) {\n            uint16_t *data16 = (uint16_t *)(pTLVHdr+1);\n            uint16_t call_end_reason = le16_to_cpu(data16[0]);\n            dbg_time(\"call_end_reason is %d\", call_end_reason);\n        }\n\n        pTLVHdr = GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n        if (pTLVHdr) {\n            uint16_t *data16 = (uint16_t *)(pTLVHdr+1);\n            uint16_t call_end_reason_type = le16_to_cpu(data16[0]);\n            uint16_t verbose_call_end_reason  = le16_to_cpu(data16[1]);\n\n            dbg_time(\"call_end_reason_type is %d\", call_end_reason_type);\n            dbg_time(\"call_end_reason_verbose is %d\", verbose_call_end_reason);\n        }\n\n        err = le16_to_cpu(pMUXMsg->QMUXMsgHdrResp.QMUXError);\n        free(pResponse);\n        return err;\n    }\n\n    if (curIpFamily == IpFamilyV4) {\n        WdsConnectionIPv4Handle = le32_to_cpu(pResponse->MUXMsg.StartNwInterfaceResp.Handle);\n        dbg_time(\"%s WdsConnectionIPv4Handle: 0x%08x\", __func__, WdsConnectionIPv4Handle);\n    } else {\n        WdsConnectionIPv6Handle = le32_to_cpu(pResponse->MUXMsg.StartNwInterfaceResp.Handle);\n        dbg_time(\"%s WdsConnectionIPv6Handle: 0x%08x\", __func__, WdsConnectionIPv6Handle);\n    }\n\n    free(pResponse);\n\n    return 0;\n}\n\nstatic int requestDeactivateDefaultPDP(PROFILE_T *profile, int curIpFamily) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    UCHAR QMIType = (curIpFamily == 0x04) ? QMUX_TYPE_WDS : QMUX_TYPE_WDS_IPV6;\n\n    (void)profile;\n    if (curIpFamily == IpFamilyV4 && WdsConnectionIPv4Handle == 0)\n        return 0;\n    if (curIpFamily == IpFamilyV6 && WdsConnectionIPv6Handle == 0)\n        return 0;\n\n    dbg_time(\"%s WdsConnectionIPv%dHandle\", __func__, curIpFamily == IpFamilyV4 ? 4 : 6);\n\n    pRequest = ComposeQMUXMsg(QMIType, QMIWDS_STOP_NETWORK_INTERFACE_REQ , WdsStopNwInterfaceReq, &curIpFamily);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    if (curIpFamily == IpFamilyV4)\n        WdsConnectionIPv4Handle = 0;\n    else\n         WdsConnectionIPv6Handle = 0;\n    free(pResponse);\n    return 0;\n}\n\nstatic int requestGetIPAddress(PROFILE_T *profile, int curIpFamily) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR pIpv4Addr;\n    PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV6_ADDR pIpv6Addr = NULL;\n    PQMIWDS_GET_RUNTIME_SETTINGS_TLV_MTU pMtu;\n    IPV4_T *pIpv4 = &profile->ipv4;\n    IPV6_T *pIpv6 = &profile->ipv6;\n    UCHAR QMIType = (curIpFamily == 0x04) ? QMUX_TYPE_WDS : QMUX_TYPE_WDS_IPV6;\n    PQMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV6_ADDR pPCSCFIpv6Addr;\n\tPQMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV4_ADDR pPCSCFIpv4Addr;\n\n    if (curIpFamily == IpFamilyV4) {\n        memset(pIpv4, 0x00, sizeof(IPV4_T));\n        if (WdsConnectionIPv4Handle == 0)\n            return 0;\n    } else if (curIpFamily == IpFamilyV6) {\n        memset(pIpv6, 0x00, sizeof(IPV6_T));\n        if (WdsConnectionIPv6Handle == 0)\n            return 0;\n    }\n\n    pRequest = ComposeQMUXMsg(QMIType, QMIWDS_GET_RUNTIME_SETTINGS_REQ, WdsGetRuntimeSettingReq, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n\tpPCSCFIpv6Addr = (PQMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV6_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x2e);    // 0x2e - pcscf ipv6 address \n\tif (pPCSCFIpv6Addr) {\n    \tif (pPCSCFIpv6Addr->PCSCFNumber == 1) {\n        \tUCHAR *PCSCFIpv6Addr1 = (UCHAR *)(pPCSCFIpv6Addr + 1);\n        \tmemcpy(profile->PCSCFIpv6Addr1, PCSCFIpv6Addr1, 16);\n        }else if (pPCSCFIpv6Addr->PCSCFNumber == 2) {\n        \tUCHAR *PCSCFIpv6Addr1 = (UCHAR *)(pPCSCFIpv6Addr + 1);\n        \tUCHAR *PCSCFIpv6Addr2 = PCSCFIpv6Addr1 + 16;\n        \tmemcpy(profile->PCSCFIpv6Addr1, PCSCFIpv6Addr1, 16);\n        \tmemcpy(profile->PCSCFIpv6Addr2, PCSCFIpv6Addr2, 16);\n        }\n    }\n    \n\tpPCSCFIpv4Addr = (PQMIWDS_GET_RUNNING_SETTINGS_PCSCF_IPV4_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x23);    // 0x23 - pcscf ipv4 address \n\tif (pPCSCFIpv4Addr) {\n    \tif (pPCSCFIpv4Addr->PCSCFNumber == 1) {\n        \tUCHAR *PCSCFIpv4Addr1 = (UCHAR *)(pPCSCFIpv4Addr + 1);\n        \tmemcpy(&profile->PCSCFIpv4Addr1, PCSCFIpv4Addr1, 4);\n        }else if (pPCSCFIpv4Addr->PCSCFNumber == 2) {\n        \tUCHAR *PCSCFIpv4Addr1 = (UCHAR *)(pPCSCFIpv4Addr + 1);\n        \tUCHAR *PCSCFIpv4Addr2 = PCSCFIpv4Addr1 + 4;\n        \tmemcpy(&profile->PCSCFIpv4Addr1, PCSCFIpv4Addr1, 4);\n        \tmemcpy(&profile->PCSCFIpv4Addr2, PCSCFIpv4Addr2, 4);\n        }\n    }\n\n    pIpv4Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4PRIMARYDNS);\n    if (pIpv4Addr) {\n        pIpv4->DnsPrimary = pIpv4Addr->IPV4Address;\n    }\n\n    pIpv4Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4SECONDARYDNS);\n    if (pIpv4Addr) {\n        pIpv4->DnsSecondary = pIpv4Addr->IPV4Address;\n    }\n\n    pIpv4Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4GATEWAY);\n    if (pIpv4Addr) {\n        pIpv4->Gateway = pIpv4Addr->IPV4Address;\n    }\n\n    pIpv4Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4SUBNET);\n    if (pIpv4Addr) {\n        pIpv4->SubnetMask = pIpv4Addr->IPV4Address;\n    }\n\n    pIpv4Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV4_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV4);\n    if (pIpv4Addr) {\n        pIpv4->Address = pIpv4Addr->IPV4Address;\n    }\n\n    pIpv6Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV6_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6PRIMARYDNS);\n    if (pIpv6Addr) {\n        memcpy(pIpv6->DnsPrimary, pIpv6Addr->IPV6Address, 16);\n    }\n\n    pIpv6Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV6_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6SECONDARYDNS);\n    if (pIpv6Addr) {\n        memcpy(pIpv6->DnsSecondary, pIpv6Addr->IPV6Address, 16);\n    }\n\n    pIpv6Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV6_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6GATEWAY);\n    if (pIpv6Addr) {\n        memcpy(pIpv6->Gateway, pIpv6Addr->IPV6Address, 16);\n        pIpv6->PrefixLengthGateway = pIpv6Addr->PrefixLength;\n    }\n\n    pIpv6Addr = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_IPV6_ADDR)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_IPV6);\n    if (pIpv6Addr) {\n        memcpy(pIpv6->Address, pIpv6Addr->IPV6Address, 16);\n        pIpv6->PrefixLengthIPAddr = pIpv6Addr->PrefixLength;\n    }\n\n    pMtu = (PQMIWDS_GET_RUNTIME_SETTINGS_TLV_MTU)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, QMIWDS_GET_RUNTIME_SETTINGS_TLV_TYPE_MTU);\n    if (pMtu) {\n        if (curIpFamily == IpFamilyV4)\n            pIpv4->Mtu =  le32_to_cpu(pMtu->Mtu);\n        else\n            pIpv6->Mtu =  le32_to_cpu(pMtu->Mtu);\n    }\n\n    free(pResponse);\n    return 0;\n}\n\n#ifdef CONFIG_APN\nstatic int requestSetProfile(PROFILE_T *profile) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    const char *new_apn = profile->apn ? profile->apn : \"\";\n    const char *new_user = profile->user ? profile->user : \"\";\n    const char *new_pd = profile->pd ? profile->pd : \"\";\n    const char *ipStr[] = {\"IPV4\", \"NULL\", \"IPV6\", \"IPV4V6\"};\n\n    dbg_time(\"%s[pdp:%d index:%d] %s/%s/%s/%d/%s\", __func__, profile->pdp, profile->profile_index, profile->apn, profile->user, profile->pd, profile->auth,ipStr[profile->iptype]);\n    if (!profile->profile_index)\n        return -1;\n\n    if ( !strcmp(profile->old_apn, new_apn) && !strcmp(profile->old_user, new_user)\n        && !strcmp(profile->old_pd, new_pd)\n        && profile->old_iptype == profile->iptype\n        && profile->old_auth == profile->auth)\n    {\n        dbg_time(\"no need to set skip the rest\");\n        return 0;\n    }\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS, QMIWDS_MODIFY_PROFILE_SETTINGS_REQ, WdsModifyProfileSettingsReq, profile);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    free(pResponse);\n    return 1;\n}\n\nstatic int requestGetProfile(PROFILE_T *profile) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    PQMIWDS_APNNAME pApnName;\n    PQMIWDS_USERNAME pUserName;\n    PQMIWDS_PD pPd;\n    PQMIWDS_AUTH_PREFERENCE pAuthPref;\n    PQMIWDS_IPTYPE pIpType;\n    PQMIWDS_PDPCONTEXT pPdpContext;\n    PQMIWDS_PROFILELIST pProfileList;\n    \n    const char *ipStr[] = {\"IPV4\", \"NULL\", \"IPV6\", \"IPV4V6\"};\n\n    profile->old_apn[0] = profile->old_user[0] = profile->old_pd[0] = '\\0';\n    profile->old_auth = 0;\n    profile->old_iptype = 0;\n    if (profile->enable_ipv4 && profile->enable_ipv6)\n        profile->iptype = 3;\n    else if (profile->enable_ipv6)\n        profile->iptype = 2;\n    else\n        profile->iptype = 0;\n\n    if (!profile->pdp)\n        return 0;\n\n_re_check:\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS, QMIWDS_GET_PROFILE_LIST_REQ, WdsGetProfileListReqSend, profile);\n    err = QmiThreadSendQMI(pRequest, &pResponse);s_pResponse = malloc(le16_to_cpu(pResponse->QMIHdr.Length) + 1);\n    qmi_rsp_check_and_return();\n    \n    pProfileList = (PQMIWDS_PROFILELIST)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x01);\n    uint8 profile_indexs[42] = {0};\n    uint8 profile_num = pProfileList->ProfileList[0];\n    uint8 i;\n    if(profile_num >= 1)\n    {\n        uint8 j = 0;\n        uint8 k = 2;\n        for(i=0; i<profile_num; i++)\n        {\n            profile_indexs[j++] = pProfileList->ProfileList[k];\n            if(pProfileList->ProfileList[++k] == 0)\n                k+=2;\n            else\n                k+=2+pProfileList->ProfileList[k];\n        }\n    }\n    free(pResponse);\n    \n    for(i=0; i<profile_num; i++)\n    {\n        profile->profile_index = profile_indexs[i];\n        \n        pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS, QMIWDS_GET_PROFILE_SETTINGS_REQ, WdsGetProfileSettingsReqSend, profile);\n        err = QmiThreadSendQMI(pRequest, &pResponse);\n        qmi_rsp_check_and_return();\n        \n        pPdpContext = (PQMIWDS_PDPCONTEXT)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x25);\n        if(pPdpContext->pdp_context == profile->pdp)\n            break;\n        else\n            free(pResponse);\n\n        if(i == profile_num-1)\n        {\n            pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS, QMIWDS_CREATE_PROFILE_REQ, WdsCreateProfileSettingsReqSend, profile);\n            err = QmiThreadSendQMI(pRequest, &pResponse);\n            qmi_rsp_check_and_return();\n            free(pResponse);\n            goto _re_check;\n        }\n    }\n    \n\n    pApnName = (PQMIWDS_APNNAME)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x14);\n    pUserName = (PQMIWDS_USERNAME)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x1B);\n    pPd = (PQMIWDS_PD)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x1C);\n    pAuthPref = (PQMIWDS_AUTH_PREFERENCE)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x1D);\n    pIpType = (PQMIWDS_IPTYPE)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n\n    if (pApnName/* && le16_to_cpu(pApnName->TLVLength)*/)\n        uchar2char(profile->old_apn, sizeof(profile->old_apn), &pApnName->ApnName, le16_to_cpu(pApnName->TLVLength));\n    if (pUserName/*  && pUserName->UserName*/)\n        uchar2char(profile->old_user, sizeof(profile->old_user), &pUserName->UserName, le16_to_cpu(pUserName->TLVLength));\n    if (pPd/*  && le16_to_cpu(pPd->TLVLength)*/)\n        uchar2char(profile->old_pd, sizeof(profile->old_pd), &pPd->Pd, le16_to_cpu(pPd->TLVLength));\n    if (pAuthPref/*  && le16_to_cpu(pAuthPref->TLVLength)*/) {\n        profile->old_auth = pAuthPref->AuthPreference;\n    }\n    if (pIpType) {\n        profile->old_iptype = pIpType->IPType;\n    }\n\n    dbg_time(\"%s[pdp:%d index:%d] %s/%s/%s/%d/%s\", __func__, profile->pdp, profile->profile_index, profile->old_apn, profile->old_user, profile->old_pd, profile->old_auth, ipStr[profile->old_iptype]);\n\n    free(pResponse);\n    return 0;\n}\n#endif\n\n#ifdef CONFIG_SIGNALINFO\nstatic int requestGetSignalInfo(void)\n{\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_NAS, QMINAS_GET_SIG_INFO_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    \n    // CDMA\n    {\n        PQMINAS_SIG_INFO_CDMA_TLV_MSG ptlv = (PQMINAS_SIG_INFO_CDMA_TLV_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x10);\n        if (ptlv && ptlv->TLVLength)\n        {\n            dbg_time(\"%s CDMA: RSSI %d dBm, ECIO %.1lf dBm\", __func__,\n                ptlv->rssi, (-0.5) * (double)ptlv->ecio);\n        }\n    }\n\n    // HDR\n    {\n        PQMINAS_SIG_INFO_HDR_TLV_MSG ptlv = (PQMINAS_SIG_INFO_HDR_TLV_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n        if (ptlv && ptlv->TLVLength)\n        {\n            dbg_time(\"%s HDR: RSSI %d dBm, ECIO %.1lf dBm, IO %d dBm\", __func__,\n                ptlv->rssi, (-0.5) * (double)ptlv->ecio, ptlv->io);\n        }\n    }\n\n    // GSM\n    {\n        PQMINAS_SIG_INFO_GSM_TLV_MSG ptlv = (PQMINAS_SIG_INFO_GSM_TLV_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x12);\n        if (ptlv && ptlv->TLVLength)\n        {\n            dbg_time(\"%s GSM: RSSI %d dBm\", __func__, ptlv->rssi);\n        }\n    }\n\n    // WCDMA\n    {\n        PQMINAS_SIG_INFO_WCDMA_TLV_MSG ptlv = (PQMINAS_SIG_INFO_WCDMA_TLV_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x13);\n        if (ptlv && ptlv->TLVLength)\n        {\n            dbg_time(\"%s WCDMA: RSSI %d dBm, ECIO %.1lf dBm\", __func__,\n                ptlv->rssi, (-0.5) * (double)ptlv->ecio);\n        }\n    }\n\n    // LTE\n    {\n        PQMINAS_SIG_INFO_LTE_TLV_MSG ptlv = (PQMINAS_SIG_INFO_LTE_TLV_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x14);\n        if (ptlv && ptlv->TLVLength)\n        {\n            dbg_time(\"%s LTE: RSSI %d dBm, RSRQ %d dB, RSRP %d dBm, SNR %.1lf dB\", __func__,\n                ptlv->rssi, ptlv->rsrq, ptlv->rsrp, (0.1) * (double)ptlv->snr);\n        }\n    }\n\n    // TDSCDMA\n    {\n        PQMINAS_SIG_INFO_TDSCDMA_TLV_MSG ptlv = (PQMINAS_SIG_INFO_TDSCDMA_TLV_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x15);\n        if (ptlv && ptlv->TLVLength)\n        {\n            dbg_time(\"%s LTE: RSCP %d dBm\", __func__, ptlv->rscp);\n        }\n    }\n\n    // 5G_NSA\n    if (s_5g_type == WWAN_DATA_CLASS_5G_NSA)\n    {\n        PQMINAS_SIG_INFO_5G_NSA_TLV_MSG ptlv = (PQMINAS_SIG_INFO_5G_NSA_TLV_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x17);\n        if (ptlv && ptlv->TLVLength)\n        {\n            dbg_time(\"%s 5G_NSA: RSRP %d dBm, SNR %.1lf dB\", __func__, ptlv->rsrp, (0.1) * (double)ptlv->snr);\n        }\n    }\n\n    // 5G_SA\n    if (s_5g_type == WWAN_DATA_CLASS_5G_SA)\n    {\n        PQMINAS_SIG_INFO_5G_SA_TLV_MSG ptlv = (PQMINAS_SIG_INFO_5G_SA_TLV_MSG)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x18);\n        if (ptlv && ptlv->TLVLength)\n        {\n            dbg_time(\"%s 5G_SA: NR5G_RSRQ %d dB\", __func__, ptlv->nr5g_rsrq);\n        }\n    }\n\n    free(pResponse);\n    return 0;\n}\n#endif\n\n#ifdef CONFIG_VERSION\nstatic int requestBaseBandVersion(PROFILE_T *profile) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    PDEVICE_REV_ID revId;\n    int err;\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_DMS, QMIDMS_GET_DEVICE_REV_ID_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    revId = (PDEVICE_REV_ID)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x01);\n\n    if (revId && le16_to_cpu(revId->TLVLength))\n    {\n        uchar2char(profile->BaseBandVersion, sizeof(profile->BaseBandVersion), &revId->RevisionID, le16_to_cpu(revId->TLVLength));\n        dbg_time(\"%s %s\", __func__, profile->BaseBandVersion);\n    }\n\n    free(pResponse);\n    return 0;\n}\n#endif\n\nstatic USHORT DmsSetOperatingModeReq(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->SetOperatingModeReq.TLVType = 0x01;\n    pMUXMsg->SetOperatingModeReq.TLVLength = cpu_to_le16(1);\n    pMUXMsg->SetOperatingModeReq.OperatingMode = *((UCHAR *)arg);\n\n    return sizeof(QMIDMS_SET_OPERATING_MODE_REQ_MSG);\n}\n\nstatic USHORT UimSetCardSlotReq(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->UIMSetCardSlotReq.TLVType = 0x01;\n    pMUXMsg->UIMSetCardSlotReq.TLVLength = cpu_to_le16(1);\n    pMUXMsg->UIMSetCardSlotReq.slot = *((UCHAR *)arg);\n\n    return sizeof(QMIUIM_SET_CARD_SLOT_REQ_MSG);\n}\n\nstatic int requestRadioPower(int state) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    UCHAR OperatingMode = (!!state) ? DMS_OP_MODE_ONLINE : DMS_OP_MODE_LOW_POWER;\n    USHORT SimOp = (!!state) ? QMIUIM_POWER_UP : QMIUIM_POWER_DOWN;\n    UCHAR cardSlot = 0x01;\n\n    dbg_time(\"%s(%d)\", __func__, state);\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_DMS, QMIDMS_SET_OPERATING_MODE_REQ, DmsSetOperatingModeReq, &OperatingMode);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n    free(pResponse);\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_UIM, SimOp, UimSetCardSlotReq, &cardSlot);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n    free(pResponse);\n\n    return 0;\n}\n\nstatic USHORT WdaSetLoopBackReq(PQMUX_MSG pMUXMsg, void *arg) {\n    (void)arg;\n\tpMUXMsg->SetLoopBackReq.loopback_state.TLVType  = 0x01;\n\tpMUXMsg->SetLoopBackReq.loopback_state.TLVLength = cpu_to_le16(1);\n\n\tpMUXMsg->SetLoopBackReq.replication_factor.TLVType\t= 0x10;\n\tpMUXMsg->SetLoopBackReq.replication_factor.TLVLength = cpu_to_le16(4);\n\n\treturn sizeof(QMI_WDA_SET_LOOPBACK_CONFIG_REQ_MSG);\n}\n\nstatic int requestSetLoopBackState(UCHAR loopback_state, ULONG replication_factor) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n\n    dbg_time(\"%s(loopback_state=%d, replication_factor=%u)\", __func__, loopback_state, replication_factor);\n    \n    pRequest = ComposeQMUXMsg(QMUX_TYPE_WDS_ADMIN, QMI_WDA_SET_LOOPBACK_CONFIG_REQ, WdaSetLoopBackReq, NULL);\n    pRequest->MUXMsg.SetLoopBackReq.loopback_state.TLVVaule = loopback_state;\n    pRequest->MUXMsg.SetLoopBackReq.replication_factor.TLVVaule = cpu_to_le16(replication_factor);\n\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    free(pResponse);\n    return 0;\n}\n\n#ifdef CONFIG_ENABLE_QOS\nstatic USHORT QosSetBindMuxDataPort(PQMUX_MSG pMUXMsg, void *arg) {\n    PROFILE_T *profile = (PROFILE_T *)arg;\n    pMUXMsg->QosBindDataPortReq.EpIdTlv.TLVType = 0x10;\n    pMUXMsg->QosBindDataPortReq.EpIdTlv.TLVLength = cpu_to_le16(8);\n    pMUXMsg->QosBindDataPortReq.EpIdTlv.ep_type = cpu_to_le32(profile->rmnet_info.ep_type);\n    pMUXMsg->QosBindDataPortReq.EpIdTlv.iface_id = cpu_to_le32(profile->rmnet_info.iface_id);\n    pMUXMsg->QosBindDataPortReq.MuxIdTlv.TLVType = 0x11;\n    pMUXMsg->QosBindDataPortReq.MuxIdTlv.TLVLength = cpu_to_le16(1);\n    pMUXMsg->QosBindDataPortReq.MuxIdTlv.mux_id = profile->muxid;\n    return sizeof(QMI_QOS_BIND_DATA_PORT_REQ_MSG);\n}\n\n#ifdef CONFIG_REG_QOS_IND\nstatic USHORT QosIndRegReq(PQMUX_MSG pMUXMsg, void *arg) {\n    pMUXMsg->QosIndRegReq.ReportGlobalQosFlowTlv.TLVType = 0x10;\n    pMUXMsg->QosIndRegReq.ReportGlobalQosFlowTlv.TLVLength = cpu_to_le16(1);\n    pMUXMsg->QosIndRegReq.ReportGlobalQosFlowTlv.report_global_qos_flows = 1;\n    return sizeof(QMI_QOS_INDICATION_REGISTER_REQ_MSG);\n}\n#endif\n\nstatic int requestRegisterQos(PROFILE_T *profile) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse = NULL;\n    PQMUX_MSG pMUXMsg;\n    int err;\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_QOS, QMI_QOS_BIND_DATA_PORT_REQ , QosSetBindMuxDataPort, (void *)profile);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    dbg_time(\"%s QosSetBindMuxDataPort\", __func__);\n    qmi_rsp_check_and_return();\n    if (pResponse) free(pResponse);\n\t\n#ifdef CONFIG_REG_QOS_IND\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_QOS, QMI_QOS_INDICATION_REGISTER_REQ , QosIndRegReq, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    dbg_time(\"%s QosIndRegReq\", __func__);\n    qmi_rsp_check_and_return();\n    if (pResponse) free(pResponse);\n#endif\n    return 0;\n}\n\n#ifdef CONFIG_GET_QOS_INFO\nUCHAR ql_get_qos_info_data_rate(PQCQMIMSG pResponse, void *max_data_rate)\n{\n    PQMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW qos_tx_granted_flow = NULL;\n    PQMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW qos_rx_granted_flow = NULL;\n    qos_tx_granted_flow = (PQMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n    if(qos_tx_granted_flow != NULL)\n    {\n        *(ULONG64 *)(max_data_rate) = le64_to_cpu(qos_tx_granted_flow->data_rate_max);\n        dbg_time(\"GET_QOS_INFO: tx_data_rate_max=%llu\", *(ULONG64 *)(max_data_rate+0));\n    }\n    else\n        dbg_time(\"GET_QOS_INFO: No qos_tx_granted_flow\");\n    qos_rx_granted_flow = (PQMI_QOS_GET_QOS_INFO_TLV_GRANTED_FLOW)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x12);\n    if(qos_rx_granted_flow != NULL)\n    {\n        *(ULONG64 *)(max_data_rate+sizeof(ULONG64)) = le64_to_cpu(qos_rx_granted_flow->data_rate_max);\n        dbg_time(\"GET_QOS_INFO: rx_data_rate_max=%llu\", *(ULONG64 *)(max_data_rate+sizeof(ULONG64)));\n    }\n    else\n        dbg_time(\"GET_QOS_INFO: No qos_rx_granted_flow\");\n    if(qos_tx_granted_flow != NULL || qos_rx_granted_flow != NULL)\n        return 0;\n    else\n        return 1;\n}\n\nstatic USHORT QosGetQosInfoReq(PQMUX_MSG pMUXMsg, void *arg) {\n    PROFILE_T *profile = (PROFILE_T *)arg;\n    pMUXMsg->QosGetQosInfoReq.QosIdTlv.TLVType = 0x01;\n    pMUXMsg->QosGetQosInfoReq.QosIdTlv.TLVLength = cpu_to_le16(4);\n    pMUXMsg->QosGetQosInfoReq.QosIdTlv.qos_id = cpu_to_le32(profile->qos_id);\n    return sizeof(QMI_QOS_GET_QOS_INFO_REQ_MSG);\n}\n\nstatic int requestGetQosInfo(PROFILE_T *profile) {\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse = NULL;\n    PQMUX_MSG pMUXMsg;\n    int err;\n\n    if(profile->qos_id == 0)\n    {\n        dbg_time(\"%s request not send: invalid qos_id\", __func__);\n        return 0;\n    }\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_QOS, QMI_QOS_GET_QOS_INFO_REQ , QosGetQosInfoReq, (void *)profile);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n    if (pResponse)\n    {\n#ifdef CONFIG_GET_QOS_DATA_RATE\n        ULONG64 max_data_rate[2] = {0};\n        if(ql_get_qos_info_data_rate(pResponse, (void *)max_data_rate) == 0){}\n#endif\n        free(pResponse);\n    }\n    return 0;\n}\n#endif //#ifdef CONFIG_GET_QOS_INFO\n\n#ifdef CONFIG_REG_QOS_IND\nUCHAR ql_get_global_qos_flow_ind_qos_id(PQCQMIMSG pResponse, UINT *qos_id)\n{\n    PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_STATE qos_flow_state = NULL;\n    qos_flow_state = (PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_STATE)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x01);\n    if(qos_flow_state != NULL)\n    {\n        if(le32_to_cpu(qos_flow_state->state_change) == QOS_IND_FLOW_STATE_ACTIVATED && qos_flow_state->new_flow == 1)\n        {\n            *qos_id = le32_to_cpu(qos_flow_state->qos_id);\n            dbg_time(\"QMI_QOS_GLOBAL_QOS_FLOW_IND: qos_id=%u state=QOS_IND_FLOW_STATE_ACTIVATED\", *qos_id);\n        }\n        return (qos_flow_state->new_flow);\n    }\n    return (0);\n}\n\n#ifdef CONFIG_GET_QOS_DATA_RATE\nUCHAR ql_get_global_qos_flow_ind_data_rate(PQCQMIMSG pResponse, void *max_data_rate)\n{\n    PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED qos_tx_flow_granted = NULL;\n    PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED qos_rx_flow_granted = NULL;\n    qos_tx_flow_granted = (PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x10);\n    if(qos_tx_flow_granted != NULL)\n    {\n        *(ULONG64 *)(max_data_rate) = le64_to_cpu(qos_tx_flow_granted->data_rate_max);\n        dbg_time(\"QMI_QOS_GLOBAL_QOS_FLOW_IND: tx_data_rate_max=%llu\", *(ULONG64 *)(max_data_rate+0));\n    }\n    else\n    dbg_time(\"QMI_QOS_GLOBAL_QOS_FLOW_IND: No qos_tx_flow_granted\");\n    qos_rx_flow_granted = (PQMI_QOS_GLOBAL_QOS_FLOW_TLV_FLOW_GRANTED)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n    if(qos_rx_flow_granted != NULL)\n    {\n        *(ULONG64 *)(max_data_rate+sizeof(ULONG64)) = le64_to_cpu(qos_rx_flow_granted->data_rate_max);\n        dbg_time(\"QMI_QOS_GLOBAL_QOS_FLOW_IND: rx_data_rate_max=%llu\", *(ULONG64 *)(max_data_rate+sizeof(ULONG64)));\n    }\n    else\n        dbg_time(\"QMI_QOS_GLOBAL_QOS_FLOW_IND: No qos_rx_flow_granted\");\n    if(qos_tx_flow_granted != NULL || qos_rx_flow_granted != NULL)\n        return 0;\n    else\n        return 1;\n}\n#endif\n#endif //#ifdef CONFIG_REG_QOS_IND\n#endif //#ifdef CONFIG_ENABLE_QOS\n\n#ifdef CONFIG_CELLINFO\n/*\n    at+qeng=\"servingcell\" and at+qeng=\"neighbourcell\"\n    https://gitlab.freedesktop.org/mobile-broadband/libqmi/-/blob/master/src/qmicli/qmicli-nas.c\n*/\nstatic int nas_get_cell_location_info(void);\nstatic int nas_get_rf_band_information(void);\n\nstatic int requestGetCellInfoList(void) {\n    dbg_time(\"%s\", __func__);\n    nas_get_cell_location_info();\n    nas_get_rf_band_information();\n    return 0;\n}\n#endif\n\nconst struct request_ops qmi_request_ops = {\n#ifdef CONFIG_VERSION\n    .requestBaseBandVersion = requestBaseBandVersion,\n#endif\n    .requestSetEthMode = requestSetEthMode,\n#ifdef CONFIG_SIM\n    .requestGetSIMStatus = requestGetSIMStatus,\n    .requestEnterSimPin = requestEnterSimPin,\n#endif\n#ifdef CONFIG_IMSI_ICCID\n    .requestGetICCID = requestGetICCID,\n    .requestGetIMSI = requestGetIMSI,\n#endif\n#ifdef CONFIG_APN\n    .requestSetProfile = requestSetProfile,\n    .requestGetProfile = requestGetProfile,\n#endif\n    .requestRegistrationState = requestRegistrationState,\n    .requestSetupDataCall = requestSetupDataCall,\n    .requestQueryDataCall = requestQueryDataCall,\n    .requestDeactivateDefaultPDP = requestDeactivateDefaultPDP,\n    .requestGetIPAddress = requestGetIPAddress,\n#ifdef CONFIG_SIGNALINFO\n    .requestGetSignalInfo = requestGetSignalInfo,\n#endif\n#ifdef CONFIG_CELLINFO\n    .requestGetCellInfoList = requestGetCellInfoList,\n#endif\n    .requestSetLoopBackState = requestSetLoopBackState,\n    .requestRadioPower = requestRadioPower,\n#ifdef CONFIG_ENABLE_QOS\n    .requestRegisterQos = requestRegisterQos,\n#endif\n#ifdef CONFIG_GET_QOS_INFO\n    .requestGetQosInfo = requestGetQosInfo,\n#endif\n#ifdef CONFIG_COEX_WWAN_STATE\n    .requestGetCoexWWANState = requestGetCoexWWANState,\n#endif\n};\n\n#ifdef CONFIG_CELLINFO\nstatic char *str_from_bcd_plmn (uint8 plmn[3])\n{\n    const char bcd_chars[] = \"0123456789*#abc\\0\\0\";\n    static char str[12];\n    int i;\n    int j = 0;\n\n    for (i = 0; i < 3; i++) {\n        str[j] = bcd_chars[plmn[i]&0xF];\n        if (str[j]) j++;\n        str[j] = bcd_chars[plmn[i]>>4];\n        if (str[j]) j++;\n    }\n\n    str[j++] = 0;\n\n    return str;\n}\n\ntypedef struct {\n    UINT type;\n    const char *name;\n} ENUM_NAME_T;\n\n#define enum_name(type) {type, #type}\n#define N_ELEMENTS(arr)\t\t(sizeof (arr) / sizeof ((arr)[0]))\n\nstatic const ENUM_NAME_T QMI_NAS_ACTIVE_BAND_NAME[] = {\n    enum_name(QMI_NAS_ACTIVE_BAND_BC_0),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_1),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_2),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_3),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_4),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_5),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_6),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_7),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_8),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_9),                  \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_10),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_11),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_12),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_13),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_14),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_15),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_16),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_17),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_18),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_BC_19),                 \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_450),               \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_480),               \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_750),               \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_850),               \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_900_EXTENDED),      \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_900_PRIMARY),       \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_900_RAILWAYS),      \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_DCS_1800),          \n    enum_name(QMI_NAS_ACTIVE_BAND_GSM_PCS_1900),          \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_2100),            \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_PCS_1900),        \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_DCS_1800),        \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_1700_US),         \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_850),             \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_800),             \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_2600),            \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_900),             \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_1700_JAPAN),      \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_1500_JAPAN),      \n    enum_name(QMI_NAS_ACTIVE_BAND_WCDMA_850_JAPAN),       \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_1),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_2),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_3),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_4),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_5),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_6),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_7),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_8),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_9),              \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_10),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_11),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_12),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_13),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_14),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_17),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_18),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_19),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_20),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_21),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_23),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_24),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_25),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_26),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_27),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_28),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_29),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_30),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_31),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_32),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_33),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_34),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_35),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_36),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_37),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_38),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_39),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_40),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_41),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_42),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_43),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_46),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_47),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_48),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_66),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_71),             \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_125),            \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_126),            \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_127),            \n    enum_name(QMI_NAS_ACTIVE_BAND_EUTRAN_250),            \n    enum_name(QMI_NAS_ACTIVE_BAND_TDSCDMA_A),             \n    enum_name(QMI_NAS_ACTIVE_BAND_TDSCDMA_B),             \n    enum_name(QMI_NAS_ACTIVE_BAND_TDSCDMA_C),             \n    enum_name(QMI_NAS_ACTIVE_BAND_TDSCDMA_D),             \n    enum_name(QMI_NAS_ACTIVE_BAND_TDSCDMA_E),             \n    enum_name(QMI_NAS_ACTIVE_BAND_TDSCDMA_F),             \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_1 ),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_2 ),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_3 ),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_5 ),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_7 ),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_8 ),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_20),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_28),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_38),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_41),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_50),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_51),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_66),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_70),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_71),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_74),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_75),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_76),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_77),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_78),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_79),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_80),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_81),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_82),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_83),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_84),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_85),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_257),         \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_258),         \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_259),         \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_260),         \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_261),         \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_12),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_25),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_34),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_39),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_40),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_65),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_86),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_48),          \n    enum_name(QMI_NAS_ACTIVE_BAND_NR5G_BAND_14),          \n};\n\nstatic const char *qmi_nas_radio_interface_get_string(uint8 radio_if)\n{\n    const char *str = NULL;\n\n    switch (radio_if) {\n        case QMI_NAS_RADIO_INTERFACE_CDMA_1X: str = \"cdma-1x\"; break;\n        case QMI_NAS_RADIO_INTERFACE_CDMA_1XEVDO: str = \"cdma-1xevdo\"; break;\n        case QMI_NAS_RADIO_INTERFACE_AMPS: str = \"amps\"; break;\n        case QMI_NAS_RADIO_INTERFACE_GSM: str = \"gsm\"; break;\n        case QMI_NAS_RADIO_INTERFACE_UMTS: str = \"umts\"; break;\n        case QMI_NAS_RADIO_INTERFACE_LTE: str = \"lte\"; break;\n        case QMI_NAS_RADIO_INTERFACE_TD_SCDMA: str = \"td-scdma\"; break;\n        case QMI_NAS_RADIO_INTERFACE_5GNR: str = \"5gnr\"; break;\n        default: str = NULL; break;\n    }\n\n    return str ?  str : \"unknown\";\n}\n\nstatic const char *qmi_nas_active_band_get_string(uint32 active_band)\n{\n    size_t i;\n\n    for (i = 0; i < N_ELEMENTS(QMI_NAS_ACTIVE_BAND_NAME); i++) {\n        if (active_band == QMI_NAS_ACTIVE_BAND_NAME[i].type)\n            return QMI_NAS_ACTIVE_BAND_NAME[i].name + strlen(\"QMI_NAS_ACTIVE_BAND_\");\n    }\n\n    return \"unknown\";\n}\n\ntypedef struct {\n    uint16      min;\n    uint16      max;\n    const char *name;\n} EarfcnRange;\n\n/* http://niviuk.free.fr/lte_band.php */\nstatic const EarfcnRange earfcn_ranges[] = {\n    {     0,   599, \"E-UTRA band 1: 2100\"           },\n    {   600,  1199, \"E-UTRA band 2: 1900 PCS\"       },\n    {  1200,  1949, \"E-UTRA band 3: 1800+\"          },\n    {  1950,  2399, \"E-UTRA band 4: AWS-1\"          },\n    {  2400,  2649, \"E-UTRA band 5: 850\"            },\n    {  2650,  2749, \"E-UTRA band 6: UMTS only\"      },\n    {  2750,  3449, \"E-UTRA band 7: 2600\"           },\n    {  3450,  3799, \"E-UTRA band 8: 900\"            },\n    {  3800,  4149, \"E-UTRA band 9: 1800\"           },\n    {  4150,  4749, \"E-UTRA band 10: AWS-1+\"        },\n    {  4750,  4999, \"E-UTRA band 11: 1500 Lower\"    },\n    {  5000,  5179, \"E-UTRA band 12: 700 a\"         },\n    {  5180,  5279, \"E-UTRA band 13: 700 c\"         },\n    {  5280,  5379, \"E-UTRA band 14: 700 PS\"        },\n    {  5730,  5849, \"E-UTRA band 17: 700 b\"         },\n    {  5850,  5999, \"E-UTRA band 18: 800 Lower\"     },\n    {  6000,  6149, \"E-UTRA band 19: 800 Upper\"     },\n    {  6150,  6449, \"E-UTRA band 20: 800 DD\"        },\n    {  6450,  6599, \"E-UTRA band 21: 1500 Upper\"    },\n    {  6600,  7399, \"E-UTRA band 22: 3500\"          },\n    {  7500,  7699, \"E-UTRA band 23: 2000 S-band\"   },\n    {  7700,  8039, \"E-UTRA band 24: 1600 L-band\"   },\n    {  8040,  8689, \"E-UTRA band 25: 1900+\"         },\n    {  8690,  9039, \"E-UTRA band 26: 850+\"          },\n    {  9040,  9209, \"E-UTRA band 27: 800 SMR\"       },\n    {  9210,  9659, \"E-UTRA band 28: 700 APT\"       },\n    {  9660,  9769, \"E-UTRA band 29: 700 d\"         },\n    {  9770,  9869, \"E-UTRA band 30: 2300 WCS\"      },\n    {  9870,  9919, \"E-UTRA band 31: 450\"           },\n    {  9920, 10359, \"E-UTRA band 32: 1500 L-band\"   },\n    { 36000, 36199, \"E-UTRA band 33: TD 1900\"       },\n    { 36200, 36349, \"E-UTRA band 34: TD 2000\"       },\n    { 36350, 36949, \"E-UTRA band 35: TD PCS Lower\"  },\n    { 36950, 37549, \"E-UTRA band 36: TD PCS Upper\"  },\n    { 37550, 37749, \"E-UTRA band 37: TD PCS Center\" },\n    { 37750, 38249, \"E-UTRA band 38: TD 2600\"       },\n    { 38250, 38649, \"E-UTRA band 39: TD 1900+\"      },\n    { 38650, 39649, \"E-UTRA band 40: TD 2300\"       },\n    { 39650, 41589, \"E-UTRA band 41: TD 2500\"       },\n    { 41590, 43589, \"E-UTRA band 42: TD 3500\"       },\n    { 43590, 45589, \"E-UTRA band 43: TD 3700\"       },\n    { 45590, 46589, \"E-UTRA band 44: TD 700\"        },\n};\n\nstatic const char * earfcn_to_eutra_band_string (uint16 earfcn)\n{\n    size_t i;\n\n    for (i = 0; i < N_ELEMENTS (earfcn_ranges); i++) {\n        if (earfcn <= earfcn_ranges[i].max && earfcn >= earfcn_ranges[i].min)\n            return earfcn_ranges[i].name;\n    }\n    \n    return \"unknown\";\n}\n\nstatic int nas_get_cell_location_info(void)\n{\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    PQMI_TLV pV;\n    int err;\n    int i, j;\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_NAS, QMINAS_GET_CELL_LOCATION_INFO_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    pV = (PQMI_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x2E);\n    if (pV && pV->TLVLength) {\n        printf (\"5GNR ARFCN: '%u'\\n\", pV->u32);\n    }\n\n    {\n        NasGetCellLocationNr5gServingCell *ptlv = (NasGetCellLocationNr5gServingCell *)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x2F);\n        if (ptlv && ptlv->TLVLength)\n        {\n            printf (\"5GNR cell information:\\n\"\n                     \"\\tPLMN: '%s'\\n\"\n                     \"\\tTracking Area Code: '%u'\\n\"\n                     \"\\tGlobal Cell ID: '%\" PRIu64 \"'\\n\"\n                     \"\\tPhysical Cell ID: '%u'\\n\"\n                     \"\\tRSRQ: '%.1lf dB'\\n\"\n                     \"\\tRSRP: '%.1lf dBm'\\n\"\n                     \"\\tSNR: '%.1lf dB'\\n\",\n                     str_from_bcd_plmn(ptlv->plmn),\n                     ptlv->tac[0]<<16 | ptlv->tac[1]<<8 | ptlv->tac[2] ,\n                     ptlv->global_cell_id,\n                     ptlv->physical_cell_id,\n                     (0.1) * ((double)ptlv->rsrq),\n                     (0.1) * ((double)ptlv->rsrp),\n                     (0.1) * ((double)ptlv->snr));\n        }\n    }\n\n    {\n        NasGetCellLocationLteInfoIntrafrequency *ptlv = (NasGetCellLocationLteInfoIntrafrequency *)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x13);\n        if (ptlv && ptlv->TLVLength)\n        {\n            printf (\"Intrafrequency LTE Info:\\n\"\n                    \"\\tUE In Idle: '%s'\\n\"\n                    \"\\tPLMN: '%s'\\n\"\n                    \"\\tTracking Area Code: '%u'\\n\"\n                    \"\\tGlobal Cell ID: '%u'\\n\"\n                    \"\\tEUTRA Absolute RF Channel Number: '%u' (%s)\\n\"\n                    \"\\tServing Cell ID: '%u'\\n\",\n                    ptlv->ue_in_idle ? \"yes\" : \"no\",\n                    str_from_bcd_plmn(ptlv->plmn),\n                    ptlv->tracking_area_code,\n                    ptlv->global_cell_id,\n                    ptlv->absolute_rf_channel_number, earfcn_to_eutra_band_string(ptlv->absolute_rf_channel_number),\n                    ptlv->serving_cell_id);\n\n                if (ptlv->ue_in_idle)\n                    printf (\"\\tCell Reselection Priority: '%u'\\n\"\n                             \"\\tS Non Intra Search Threshold: '%u'\\n\"\n                             \"\\tServing Cell Low Threshold: '%u'\\n\"\n                             \"\\tS Intra Search Threshold: '%u'\\n\",\n                             ptlv->cell_reselection_priority,\n                             ptlv->s_non_intra_search_threshold,\n                             ptlv->serving_cell_low_threshold,\n                             ptlv->s_intra_search_threshold);\n\n\n                for (i = 0; i < ptlv->cells_len; i++) {\n                    NasGetCellLocationLteInfoCell *cell = &ptlv->cells_array[i];\n\n                    printf (\"\\tCell [%u]:\\n\"\n                             \"\\t\\tPhysical Cell ID: '%u'\\n\"\n                             \"\\t\\tRSRQ: '%.1lf' dB\\n\"\n                             \"\\t\\tRSRP: '%.1lf' dBm\\n\"\n                             \"\\t\\tRSSI: '%.1lf' dBm\\n\",\n                             i,\n                             cell->physical_cell_id,\n                             (double) cell->rsrq * 0.1,\n                             (double) cell->rsrp * 0.1,\n                             (double) cell->rssi * 0.1);\n\n                    if (ptlv->ue_in_idle)\n                        printf (\"\\t\\tCell Selection RX Level: '%d'\\n\",\n                                 cell->cell_selection_rx_level);\n                }\n        }\n    }\n\n    {\n        NasGetCellLocationLteInfoInterfrequency *ptlv = (NasGetCellLocationLteInfoInterfrequency *)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x14);\n        if (ptlv && ptlv->TLVLength)\n        {\n            int off = offsetof(NasGetCellLocationLteInfoInterfrequency, freqs[0]);\n            printf (\"Interfrequency LTE Info:\\n\"\n                     \"\\tUE In Idle: '%s'\\n\", ptlv->ue_in_idle ? \"yes\" : \"no\");\n\n                for (i = 0; i < ptlv->freqs_len; i++) {\n                    NasGetCellLocationLteInfoInterfrequencyFrequencyElement *freq = (((void *)ptlv) + off);\n\n                    off += sizeof(*freq);\n                    printf (\"\\tFrequency [%u]:\\n\"\n                             \"\\t\\tEUTRA Absolute RF Channel Number: '%u' (%s)\\n\"\n                             \"\\t\\tSelection RX Level Low Threshold: '%u'\\n\"\n                             \"\\t\\tCell Selection RX Level High Threshold: '%u'\\n\",\n                             i,\n                             freq->eutra_absolute_rf_channel_number, earfcn_to_eutra_band_string(freq->eutra_absolute_rf_channel_number),\n                             freq->cell_selection_rx_level_low_threshold,\n                             freq->cell_selection_rx_level_high_threshold);\n                    if (ptlv->ue_in_idle)\n                        printf (\"\\t\\tCell Reselection Priority: '%u'\\n\",\n                                 freq->cell_reselection_priority);\n\n\n                    for (j = 0; j < freq->cells_len; j++) {\n                        NasGetCellLocationLteInfoCell *cell = &freq->cells_array[j];\n\n                        off += sizeof(*cell);\n                        printf (\"\\t\\tCell [%u]:\\n\"\n                                 \"\\t\\t\\tPhysical Cell ID: '%u'\\n\"\n                                 \"\\t\\t\\tRSRQ: '%.1lf' dB\\n\"\n                                 \"\\t\\t\\tRSRP: '%.1lf' dBm\\n\"\n                                 \"\\t\\t\\tRSSI: '%.1lf' dBm\\n\"\n                                 \"\\t\\t\\tCell Selection RX Level: '%u'\\n\",\n                                 j,\n                                 cell->physical_cell_id,\n                                 (double) cell->rsrq * 0.1,\n                                 (double) cell->rsrp * 0.1,\n                                 (double) cell->rssi * 0.1,\n                                 cell->cell_selection_rx_level);\n                    }\n                }\n        }\n    }\n\n    pV = (PQMI_TLV)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x1E);\n    if (pV && pV->TLVLength) {\n        if (pV->u32 == 0xFFFFFFFF)\n            printf (\"LTE Timing Advance: 'unavailable'\\n\");\n        else\n            printf (\"LTE Timing Advance: '%u'\\n\", pV->u32);\n    }\n    \n    free(pResponse);\n    return 0;\n}\n\nstatic int nas_get_rf_band_information(void)\n{\n    PQCQMIMSG pRequest;\n    PQCQMIMSG pResponse;\n    PQMUX_MSG pMUXMsg;\n    int err;\n    int i;\n\n    pRequest = ComposeQMUXMsg(QMUX_TYPE_NAS, QMINAS_GET_RF_BAND_INFO_REQ, NULL, NULL);\n    err = QmiThreadSendQMI(pRequest, &pResponse);\n    qmi_rsp_check_and_return();\n\n    {\n        NasGetRfBandInfoList *ptlv = (NasGetRfBandInfoList *)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x01);\n        if (ptlv && ptlv->TLVLength)\n        {\n            printf (\"Band Information:\\n\");\n            for (i = 0; i < ptlv->num_instances; i++) {\n                NasGetRfBandInfo *band = &ptlv->bands_array[i];\n\n                printf (\"\\tRadio Interface:   '%s'\\n\"\n                         \"\\tActive Band Class: '%s'\\n\"\n                         \"\\tActive Channel:    '%u'\\n\",\n                         qmi_nas_radio_interface_get_string (band->radio_if),\n                         qmi_nas_active_band_get_string (band->active_band),\n                         band->active_channel);\n            }\n        }\n    }\n\n    {\n        NasGetRfBandInfoExtendedList *ptlv = (NasGetRfBandInfoExtendedList *)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x11);\n        if (ptlv && ptlv->TLVLength)\n        {\n            printf (\"Band Information (Extended):\\n\");\n            for (i = 0; i < ptlv->num_instances; i++) {\n                NasGetRfBandInfoExtended *band = &ptlv->bands_array[i];\n\n                printf (\"\\tRadio Interface:   '%s'\\n\"\n                         \"\\tActive Band Class: '%s'\\n\"\n                         \"\\tActive Channel:    '%u'\\n\",\n                         qmi_nas_radio_interface_get_string (band->radio_if),\n                         qmi_nas_active_band_get_string (band->active_band),\n                         band->active_channel);\n            }\n        }\n    }\n\n    {\n        NasGetRfBandInfoBandWidthList *ptlv = (NasGetRfBandInfoBandWidthList *)GetTLV(&pResponse->MUXMsg.QMUXMsgHdr, 0x12);\n        if (ptlv && ptlv->TLVLength)\n        {\n            printf (\"Bandwidth:\\n\");\n            for (i = 0; i < ptlv->num_instances; i++) {\n                NasGetRfBandInfoBandWidth *band = &ptlv->bands_array[i];\n\n                printf (\"\\tRadio Interface:   '%s'\\n\"\n                         \"\\tBandwidth:         '%u'\\n\",\n                     qmi_nas_radio_interface_get_string (band->radio_if),\n                     (band->bandwidth));\n            }\n        }\n    }\n\n    free(pResponse);\n    return 0;\n}\n#endif\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/QMIThread.h",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software. \r\n    Under no circumstances may customers modify, demonstrate, use, deliver \r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#ifndef __QMI_THREAD_H__\r\n#define __QMI_THREAD_H__\r\n\r\n#define CONFIG_GOBINET\r\n#define CONFIG_QMIWWAN\r\n#define CONFIG_SIM\r\n#define CONFIG_APN\r\n#define CONFIG_VERSION\r\n//#define CONFIG_SIGNALINFO\r\n//#define CONFIG_CELLINFO\r\n//#define CONFIG_COEX_WWAN_STATE\r\n#define CONFIG_DEFAULT_PDP 1\r\n//#define CONFIG_IMSI_ICCID\r\n#define QUECTEL_UL_DATA_AGG\r\n//#define QUECTEL_QMI_MERGE\r\n//#define REBOOT_SIM_CARD_WHEN_APN_CHANGE\r\n//#define REBOOT_SIM_CARD_WHEN_LONG_TIME_NO_PS 60 //unit is seconds\r\n//#define CONFIG_QRTR\r\n//#define CONFIG_ENABLE_QOS\r\n//#define CONFIG_REG_QOS_IND\r\n//#define CONFIG_GET_QOS_INFO\r\n//#define CONFIG_GET_QOS_DATA_RATE\r\n\r\n#if (defined(CONFIG_REG_QOS_IND) || defined(CONFIG_GET_QOS_INFO) || defined(CONFIG_GET_QOS_DATA_RATE))\r\n#ifndef CONFIG_REG_QOS_IND\r\n#define CONFIG_REG_QOS_IND\r\n#endif\r\n#ifndef CONFIG_ENABLE_QOS\r\n#define CONFIG_ENABLE_QOS\r\n#endif\r\n#endif\r\n\r\n#include <stdio.h>\r\n#include <string.h>\r\n#include <termios.h>\r\n#include <stdio.h>\r\n#include <ctype.h>\r\n#include <time.h>\r\n#include <fcntl.h>\r\n#include <signal.h>\r\n#include <errno.h>\r\n#include <string.h>\r\n#include <stdlib.h>\r\n#include <unistd.h>\r\n#include <errno.h>\r\n#include <pthread.h>\r\n#include <sys/types.h>\r\n#include <sys/stat.h>\r\n#include <sys/epoll.h>\r\n#include <poll.h>\r\n#include <sys/ioctl.h>\r\n#include <sys/socket.h>\r\n#include <stddef.h>\r\n\r\n#include \"qendian.h\"\r\n#include \"QCQMI.h\"\r\n#include \"QCQCTL.h\"\r\n#include \"QCQMUX.h\"\r\n#include \"util.h\"\r\n\r\n#define DEVICE_CLASS_UNKNOWN           0\r\n#define DEVICE_CLASS_CDMA              1\r\n#define DEVICE_CLASS_GSM               2\r\n\r\n#define WWAN_DATA_CLASS_NONE            0x00000000\r\n#define WWAN_DATA_CLASS_GPRS            0x00000001\r\n#define WWAN_DATA_CLASS_EDGE            0x00000002 /* EGPRS */\r\n#define WWAN_DATA_CLASS_UMTS            0x00000004\r\n#define WWAN_DATA_CLASS_HSDPA           0x00000008\r\n#define WWAN_DATA_CLASS_HSUPA           0x00000010\r\n#define WWAN_DATA_CLASS_LTE             0x00000020\r\n#define WWAN_DATA_CLASS_5G_NSA        0x00000040\r\n#define WWAN_DATA_CLASS_5G_SA        0x00000080\r\n#define WWAN_DATA_CLASS_1XRTT           0x00010000\r\n#define WWAN_DATA_CLASS_1XEVDO          0x00020000\r\n#define WWAN_DATA_CLASS_1XEVDO_REVA     0x00040000\r\n#define WWAN_DATA_CLASS_1XEVDV          0x00080000\r\n#define WWAN_DATA_CLASS_3XRTT           0x00100000\r\n#define WWAN_DATA_CLASS_1XEVDO_REVB     0x00200000 /* for future use */\r\n#define WWAN_DATA_CLASS_UMB             0x00400000\r\n#define WWAN_DATA_CLASS_CUSTOM          0x80000000\r\n\r\nstruct wwan_data_class_str {\r\n    ULONG class;\r\n    const char *str;\r\n};\r\n\r\n#pragma pack(push, 1)\r\ntypedef struct __IPV4 {\r\n    uint32_t Address;\r\n    uint32_t Gateway;\r\n    uint32_t SubnetMask;\r\n    uint32_t DnsPrimary;\r\n    uint32_t DnsSecondary;\r\n    uint32_t Mtu;\r\n} IPV4_T;\r\n\r\ntypedef struct __IPV6 {\r\n    UCHAR Address[16];\r\n    UCHAR Gateway[16];\r\n    UCHAR SubnetMask[16];\r\n    UCHAR DnsPrimary[16];\r\n    UCHAR DnsSecondary[16];\r\n    UCHAR PrefixLengthIPAddr;\r\n    UCHAR PrefixLengthGateway;\r\n    ULONG Mtu;\r\n} IPV6_T;\r\n\r\ntypedef struct {\r\n    UINT size;\r\n    UINT rx_urb_size;\r\n    UINT ep_type;\r\n    UINT iface_id;\r\n    UINT MuxId;\r\n    UINT ul_data_aggregation_max_datagrams; //0x17\r\n    UINT ul_data_aggregation_max_size ;//0x18\r\n    UINT dl_minimum_padding; //0x1A\r\n} QMAP_SETTING;\r\n\r\n//Configured downlink data aggregationprotocol\r\n#define WDA_DL_DATA_AGG_DISABLED (0x00) //DL data aggregation is disabled (default)\r\n#define WDA_DL_DATA_AGG_TLP_ENABLED (0x01) // DL TLP is enabled\r\n#define WDA_DL_DATA_AGG_QC_NCM_ENABLED (0x02) // DL QC_NCM isenabled\r\n#define WDA_DL_DATA_AGG_MBIM_ENABLED (0x03) // DL MBIM isenabled\r\n#define WDA_DL_DATA_AGG_RNDIS_ENABLED (0x04) // DL RNDIS is enabled\r\n#define WDA_DL_DATA_AGG_QMAP_ENABLED (0x05) // DL QMAP isenabled\r\n#define WDA_DL_DATA_AGG_QMAP_V2_ENABLED (0x06) // DL QMAP V2 is enabled\r\n#define WDA_DL_DATA_AGG_QMAP_V3_ENABLED (0x07) // DL QMAP V3 is enabled\r\n#define WDA_DL_DATA_AGG_QMAP_V4_ENABLED (0x08) // DL QMAP V4 is enabled\r\n#define WDA_DL_DATA_AGG_QMAP_V5_ENABLED (0x09) // DL QMAP V5 is enabled\r\n\r\ntypedef struct {\r\n    unsigned int size;\r\n    unsigned int rx_urb_size;\r\n    unsigned int ep_type;\r\n    unsigned int iface_id;\r\n    unsigned int qmap_mode;\r\n    unsigned int qmap_version;\r\n    unsigned int dl_minimum_padding;\r\n    char ifname[8][16];\r\n    unsigned char mux_id[8];\r\n} RMNET_INFO;\r\n\r\n#define IpFamilyV4 (0x04)\r\n#define IpFamilyV6 (0x06)\r\n\r\nstruct __PROFILE;\r\nstruct qmi_device_ops {\r\n\tint (*init)(struct __PROFILE *profile);\r\n\tint (*deinit)(void);\r\n\tint (*send)(PQCQMIMSG pRequest);\r\n\tvoid* (*read)(void *pData);\r\n};\r\n#ifdef CONFIG_QRTR\r\nextern const struct qmi_device_ops qrtr_qmidev_ops;\r\n#endif\r\nextern const struct qmi_device_ops gobi_qmidev_ops;\r\nextern const struct qmi_device_ops qmiwwan_qmidev_ops;\r\nextern const struct qmi_device_ops mbim_dev_ops;\r\nextern const struct qmi_device_ops atc_dev_ops;\r\nextern int (*qmidev_send)(PQCQMIMSG pRequest);\r\n\r\nstruct usb_device_info {\r\n    int idVendor;\r\n    int idProduct;\r\n    int  busnum;\r\n    int devnum;\r\n    int bNumInterfaces;\r\n};\r\n\r\nstruct usb_interface_info {\r\n    int bNumEndpoints;\r\n    int bInterfaceClass;\r\n    int bInterfaceSubClass;\r\n    int bInterfaceProtocol;\r\n    char driver[32];\r\n};\r\n\r\n#define LIBQMI_PROXY \"qmi-proxy\" //src/libqmi-glib/qmi-proxy.h\r\n#define LIBMBIM_PROXY \"mbim-proxy\"\r\n#define QUECTEL_QMI_PROXY \"quectel-qmi-proxy\"\r\n#define QUECTEL_MBIM_PROXY \"quectel-mbim-proxy\"\r\n#define QUECTEL_ATC_PROXY \"quectel-atc-proxy\"\r\n#define QUECTEL_QRTR_PROXY \"quectel-qrtr-proxy\"\r\n\r\n#ifndef bool\r\n#define bool uint8_t\r\n#endif\r\nstruct request_ops;\r\ntypedef struct __PROFILE {\r\n    //user input start\r\n    const char *apn;\r\n    const char *user;\r\n    const char *pd;\r\n    int auth;\r\n    int iptype;\r\n    const char *pincode;\r\n    char proxy[32];\r\n    int pdp;//pdp_context\r\n    int profile_index;//profile_index\r\n    int enable_bridge;\r\n    bool enable_ipv4;\r\n    bool enable_ipv6;\r\n    bool no_dhcp;\r\n    const char *logfile;\r\n    const char *usblogfile;\r\n    char expect_adapter[32];\r\n    int kill_pdp;\r\n    int replication_factor;\r\n    //user input end\r\n\r\n    char qmichannel[32];\r\n    char usbnet_adapter[32];\r\n    char qmapnet_adapter[32];\r\n    char driver_name[32];\r\n    int qmap_mode;\r\n    int qmap_size;\r\n    int qmap_version;\r\n    int curIpFamily;\r\n    int rawIP;\r\n    int muxid;\r\n#ifdef CONFIG_ENABLE_QOS\r\n    UINT qos_id;\r\n#endif\r\n    int wda_client;\r\n    uint32_t udhcpc_ip;\r\n    IPV4_T ipv4;\r\n    IPV6_T ipv6;\r\n    UINT PCSCFIpv4Addr1;\r\n    UINT PCSCFIpv4Addr2;\r\n    UCHAR PCSCFIpv6Addr1[16];\r\n    UCHAR PCSCFIpv6Addr2[16];\r\n    bool reattach_flag;\r\n    int hardware_interface;\r\n    int software_interface;\r\n\r\n    struct usb_device_info usb_dev;\r\n    struct usb_interface_info usb_intf;\r\n\r\n    int usbmon_fd;\r\n    FILE  *usbmon_logfile_fp;\r\n    bool loopback_state;\r\n\r\n    char BaseBandVersion[64];\r\n    char old_apn[64];\r\n    char old_user[64];\r\n    char old_pd[64];\r\n    int old_auth;\r\n    int old_iptype;\r\n\r\n    const struct qmi_device_ops *qmi_ops;\r\n    const struct request_ops *request_ops;\r\n    RMNET_INFO rmnet_info;\r\n    BOOL bring_up_by_apn_name;\r\n    BOOL bring_up_by_apn_type; \r\n    int apn_type;\r\n} PROFILE_T;\r\n\r\n#ifdef QUECTEL_QMI_MERGE\r\n#define MERGE_PACKET_IDENTITY 0x2c7c\r\n#define MERGE_PACKET_VERSION 0x0001\r\n#define MERGE_PACKET_MAX_PAYLOAD_SIZE 56\r\ntypedef struct __QMI_MSG_HEADER {\r\n    uint16_t idenity;\r\n    uint16_t version;\r\n    uint16_t cur_len;\r\n    uint16_t total_len;\r\n} QMI_MSG_HEADER;\r\n\r\ntypedef struct __QMI_MSG_PACKET {\r\n    QMI_MSG_HEADER header;\r\n    uint16_t len;\r\n    char buf[4096];\r\n} QMI_MSG_PACKET;\r\n#endif\r\n\r\ntypedef enum {\r\n    SIM_ABSENT = 0,\r\n    SIM_NOT_READY = 1,\r\n    SIM_READY = 2, /* SIM_READY means the radio state is RADIO_STATE_SIM_READY */\r\n    SIM_PIN = 3,\r\n    SIM_PUK = 4,\r\n    SIM_NETWORK_PERSONALIZATION = 5,\r\n    SIM_BAD = 6,\r\n} SIM_Status;\r\n\r\n#pragma pack(pop)\r\n\r\n#define WDM_DEFAULT_BUFSIZE\t256\r\n#define RIL_REQUEST_QUIT    0x1000\r\n#define RIL_INDICATE_DEVICE_CONNECTED    0x1002\r\n#define RIL_INDICATE_DEVICE_DISCONNECTED    0x1003\r\n#define RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED    0x1004\r\n#define RIL_UNSOL_DATA_CALL_LIST_CHANGED    0x1005\r\n#define MODEM_REPORT_RESET_EVENT 0x1006\r\n#define RIL_UNSOL_LOOPBACK_CONFIG_IND 0x1007\r\n#ifdef CONFIG_REG_QOS_IND\r\n#define RIL_UNSOL_GLOBAL_QOS_FLOW_IND_QOS_ID 0x1008\r\n#endif\r\n\r\nextern pthread_mutex_t cm_command_mutex;\r\nextern pthread_cond_t cm_command_cond;\r\nextern unsigned int cm_recv_buf[1024];\r\nextern int cm_open_dev(const char *dev);\r\nextern int cm_open_proxy(const char *name);\r\nextern int pthread_cond_timeout_np(pthread_cond_t *cond, pthread_mutex_t * mutex, unsigned msecs);\r\nextern int QmiThreadSendQMITimeout(PQCQMIMSG pRequest, PQCQMIMSG *ppResponse, unsigned msecs, const char *funcname);\r\n#define QmiThreadSendQMI(pRequest, ppResponse) QmiThreadSendQMITimeout(pRequest, ppResponse, 30 * 1000, __func__)\r\nextern void QmiThreadRecvQMI(PQCQMIMSG pResponse);\r\nextern void udhcpc_start(PROFILE_T *profile);\r\nextern void udhcpc_stop(PROFILE_T *profile);\r\nextern void ql_set_driver_link_state(PROFILE_T *profile, int link_state);\r\nextern void ql_set_driver_qmap_setting(PROFILE_T *profile, QMAP_SETTING *qmap_settings);\r\nextern void ql_get_driver_rmnet_info(PROFILE_T *profile, RMNET_INFO *rmnet_info);\r\nextern void dump_qmi(void *dataBuffer, int dataLen);\r\nextern void qmidevice_send_event_to_main(int triger_event);\r\nextern void qmidevice_send_event_to_main_ext(int triger_event, void *data, unsigned len);\r\nextern uint8_t qmi_over_mbim_get_client_id(uint8_t QMIType);\r\nextern uint8_t qmi_over_mbim_release_client_id(uint8_t QMIType, uint8_t ClientId);\r\n#ifdef CONFIG_REG_QOS_IND\r\nextern UCHAR ql_get_global_qos_flow_ind_qos_id(PQCQMIMSG pResponse, UINT *qos_id);\r\n#endif\r\n#ifdef CONFIG_GET_QOS_DATA_RATE\r\nextern UCHAR ql_get_global_qos_flow_ind_data_rate(PQCQMIMSG pResponse, void *max_data_rate);\r\n#endif\r\n\r\nstruct request_ops {\r\n    int (*requestBaseBandVersion)(PROFILE_T *profile);\r\n    int (*requestSetEthMode)(PROFILE_T *profile);\r\n    int (*requestSetLoopBackState)(UCHAR loopback_state, ULONG replication_factor);\r\n    int (*requestGetSIMStatus)(SIM_Status *pSIMStatus);\r\n    int (*requestEnterSimPin)(const char *pPinCode);\r\n    int (*requestSetProfile)(PROFILE_T *profile); // 1 ~ success and apn change, 0 ~ success and no apn change, -1 ~ fail\r\n    int (*requestGetProfile)(PROFILE_T *profile);\r\n    int (*requestRegistrationState)(UCHAR *pPSAttachedState);\r\n    int (*requestSetupDataCall)(PROFILE_T *profile, int curIpFamily);\r\n    int (*requestQueryDataCall)(UCHAR  *pConnectionStatus, int curIpFamily);\r\n    int (*requestDeactivateDefaultPDP)(PROFILE_T *profile, int curIpFamily);\r\n    int (*requestGetIPAddress)(PROFILE_T *profile, int curIpFamily);\r\n    int (*requestGetSignalInfo)(void);\r\n    int (*requestGetCellInfoList)(void);\r\n    int (*requestGetICCID)(void);\r\n    int (*requestGetIMSI)(void);\r\n    int (*requestRadioPower)(int state);\r\n    int (*requestRegisterQos)(PROFILE_T *profile);\r\n    int (*requestGetQosInfo)(PROFILE_T *profile);\r\n    int (*requestGetCoexWWANState)(void);\r\n};\r\nextern const struct request_ops qmi_request_ops;\r\nextern const struct request_ops mbim_request_ops;\r\nextern const struct request_ops atc_request_ops;\r\n\r\nextern int get_driver_type(PROFILE_T *profile);\r\nextern BOOL qmidevice_detect(char *qmichannel, char *usbnet_adapter, unsigned bufsize, PROFILE_T *profile);\r\nint mhidevice_detect(char *qmichannel, char *usbnet_adapter, PROFILE_T *profile);\r\nint atdevice_detect(char *atchannel, char *usbnet_adapter, PROFILE_T *profile);\r\nextern int ql_bridge_mode_detect(PROFILE_T *profile);\r\nextern int ql_enable_qmi_wwan_rawip_mode(PROFILE_T *profile);\r\nextern int ql_qmap_mode_detect(PROFILE_T *profile);\r\n#ifdef CONFIG_QRTR\r\nextern int rtrmnet_ctl_new_vnd(char *devname, char *vndname, uint8_t muxid,\r\n\t\t       uint32_t qmap_version, uint32_t ul_agg_cnt, uint32_t ul_agg_size);\r\nextern int rtrmnet_ctl_get_vnd(char *vndname, int *muxid,\r\n\t\t       int *qmap_version);\r\n#endif\r\n\r\n#define qmidev_is_gobinet(_qmichannel) (strncmp(_qmichannel, \"/dev/qcqmi\", strlen(\"/dev/qcqmi\")) == 0)\r\n#define qmidev_is_qmiwwan(_qmichannel) (strncmp(_qmichannel, \"/dev/cdc-wdm\", strlen(\"/dev/cdc-wdm\")) == 0)\r\n#define qmidev_is_pciemhi(_qmichannel) (strncmp(_qmichannel, \"/dev/mhi_\", strlen(\"/dev/mhi_\")) == 0)\r\n\r\n#define driver_is_qmi(_drv_name) (strncasecmp(_drv_name, \"qmi_wwan\", strlen(\"qmi_wwan\")) == 0)\r\n#define driver_is_mbim(_drv_name) (strncasecmp(_drv_name, \"cdc_mbim\", strlen(\"cdc_mbim\")) == 0)\r\n\r\nextern FILE *logfilefp;\r\nextern int debug_qmi;\r\nextern int qmidevice_control_fd[2];\r\nextern int g_donot_exit_when_modem_hangup;\r\nextern void update_resolv_conf(int iptype, const char *ifname, const char *dns1, const char *dns2);\r\nvoid update_ipv4_address(const char *ifname, const char *ip, const char *gw, unsigned prefix);\r\nvoid update_ipv6_address(const char *ifname, const char *ip, const char *gw, unsigned prefix);\r\nint reattach_driver(PROFILE_T *profile);\r\nextern void no_trunc_strncpy(char *dest, const char *src, size_t dest_size);\r\n\r\nenum\r\n{\r\n\tDRV_INVALID,\r\n\tSOFTWARE_QMI,\r\n\tSOFTWARE_MBIM,\r\n\tSOFTWARE_ECM_RNDIS_NCM,\r\n\tSOFTWARE_QRTR,\r\n\tHARDWARE_PCIE,\r\n\tHARDWARE_USB,\r\n\tHARDWARE_IPA,\r\n};\r\n\r\nenum\r\n{\r\n    SIG_EVENT_START,\r\n    SIG_EVENT_CHECK,\r\n    SIG_EVENT_STOP,\r\n};\r\n\r\ntypedef enum\r\n{\r\n    DMS_OP_MODE_ONLINE,\r\n    DMS_OP_MODE_LOW_POWER,\r\n    DMS_OP_MODE_FACTORY_TEST_MODE,\r\n    DMS_OP_MODE_OFFLINE,\r\n    DMS_OP_MODE_RESETTING,\r\n    DMS_OP_MODE_SHUTTING_DOWN,\r\n    DMS_OP_MODE_PERSISTENT_LOW_POWER,\r\n    DMS_OP_MODE_MODE_ONLY_LOW_POWER,\r\n    DMS_OP_MODE_NET_TEST_GW,\r\n}Device_operating_mode;\r\n\r\n#ifdef CM_DEBUG\r\n#define dbg_time(fmt, args...) do { \\\r\n    fprintf(stdout, \"[%15s-%04d: %s] \" fmt \"\\n\", __FILE__, __LINE__, get_time(), ##args); \\\r\n    fflush(stdout);\\\r\n    if (logfilefp) fprintf(logfilefp, \"[%s-%04d: %s] \" fmt \"\\n\", __FILE__, __LINE__, get_time(), ##args); \\\r\n} while(0)\r\n#else\r\n#define dbg_time(fmt, args...) do { \\\r\n    fprintf(stdout, \"[%s] \" fmt \"\\n\", get_time(), ##args); \\\r\n    fflush(stdout);\\\r\n    if (logfilefp) fprintf(logfilefp, \"[%s] \" fmt \"\\n\", get_time(), ##args); \\\r\n} while(0)\r\n#endif\r\n#endif\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/QmiWwanCM.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software. \r\n    Under no circumstances may customers modify, demonstrate, use, deliver \r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include <stdio.h>\r\n#include <string.h>\r\n#include <termios.h>\r\n#include <stdio.h>\r\n#include <ctype.h>\r\n#include \"QMIThread.h\"\r\n\r\n#ifdef CONFIG_QMIWWAN\r\nstatic int cdc_wdm_fd = -1;\r\nstatic UCHAR qmiclientId[QMUX_TYPE_ALL];\r\n\r\nstatic UCHAR GetQCTLTransactionId(void) {\r\n    static int TransactionId = 0;\r\n    if (++TransactionId > 0xFF)\r\n        TransactionId = 1;\r\n    return TransactionId;\r\n}\r\n\r\ntypedef USHORT (*CUSTOMQCTL)(PQMICTL_MSG pCTLMsg, void *arg);\r\n\r\nstatic PQCQMIMSG ComposeQCTLMsg(USHORT QMICTLType, CUSTOMQCTL customQctlMsgFunction, void *arg) {\r\n    UCHAR QMIBuf[WDM_DEFAULT_BUFSIZE];\r\n    PQCQMIMSG pRequest = (PQCQMIMSG)QMIBuf;\r\n    int Length;\r\n\r\n    pRequest->QMIHdr.IFType   = USB_CTL_MSG_TYPE_QMI;\r\n    pRequest->QMIHdr.CtlFlags = 0x00;\r\n    pRequest->QMIHdr.QMIType  = QMUX_TYPE_CTL;\r\n    pRequest->QMIHdr.ClientId= 0x00;\r\n\r\n    pRequest->CTLMsg.QMICTLMsgHdr.CtlFlags = QMICTL_FLAG_REQUEST;\r\n    pRequest->CTLMsg.QMICTLMsgHdr.TransactionId = GetQCTLTransactionId();\r\n    pRequest->CTLMsg.QMICTLMsgHdr.QMICTLType = cpu_to_le16(QMICTLType);\r\n    if (customQctlMsgFunction)\r\n        pRequest->CTLMsg.QMICTLMsgHdr.Length = cpu_to_le16(customQctlMsgFunction(&pRequest->CTLMsg, arg) - sizeof(QCQMICTL_MSG_HDR));\r\n    else\r\n        pRequest->CTLMsg.QMICTLMsgHdr.Length = cpu_to_le16(0x0000);\r\n\r\n    pRequest->QMIHdr.Length = cpu_to_le16(le16_to_cpu(pRequest->CTLMsg.QMICTLMsgHdr.Length) + sizeof(QCQMICTL_MSG_HDR) + sizeof(QCQMI_HDR) - 1);\r\n    Length = le16_to_cpu(pRequest->QMIHdr.Length) + 1;\r\n\r\n    pRequest = (PQCQMIMSG)malloc(Length);\r\n    if (pRequest == NULL) {\r\n        dbg_time(\"%s fail to malloc\", __func__);\r\n    } else {\r\n        memcpy(pRequest, QMIBuf, Length);\r\n    }\r\n\r\n    return pRequest;\r\n}\r\n\r\nstatic USHORT CtlGetVersionReq(PQMICTL_MSG QCTLMsg, void *arg)\r\n{\r\n    (void)arg;\r\n    QCTLMsg->GetVersionReq.TLVType = QCTLV_TYPE_REQUIRED_PARAMETER;\r\n    QCTLMsg->GetVersionReq.TLVLength = cpu_to_le16(0x0001);\r\n    QCTLMsg->GetVersionReq.QMUXTypes = QMUX_TYPE_ALL;\r\n    return sizeof(QMICTL_GET_VERSION_REQ_MSG);\r\n}\r\n\r\nstatic USHORT CtlGetClientIdReq(PQMICTL_MSG QCTLMsg, void *arg) {\r\n   QCTLMsg->GetClientIdReq.TLVType       = QCTLV_TYPE_REQUIRED_PARAMETER;\r\n   QCTLMsg->GetClientIdReq.TLVLength     = cpu_to_le16(0x0001);\r\n   QCTLMsg->GetClientIdReq.QMIType     = ((UCHAR *)arg)[0];\r\n   return sizeof(QMICTL_GET_CLIENT_ID_REQ_MSG);\r\n}\r\n\r\nstatic USHORT CtlReleaseClientIdReq(PQMICTL_MSG QCTLMsg, void *arg) {\r\n   QCTLMsg->ReleaseClientIdReq.TLVType       = QCTLV_TYPE_REQUIRED_PARAMETER;\r\n   QCTLMsg->ReleaseClientIdReq.TLVLength     = cpu_to_le16(0x0002);\r\n   QCTLMsg->ReleaseClientIdReq.QMIType     = ((UCHAR *)arg)[0];\r\n   QCTLMsg->ReleaseClientIdReq.ClientId = ((UCHAR *)arg)[1] ;\r\n   return sizeof(QMICTL_RELEASE_CLIENT_ID_REQ_MSG);\r\n}\r\n\r\nstatic USHORT CtlLibQmiProxyOpenReq(PQMICTL_MSG QCTLMsg, void *arg)\r\n{\r\n    (void)arg;\r\n    const char *device_path = (const char *)(arg);\r\n    QCTLMsg->LibQmiProxyOpenReq.TLVType = 0x01;\r\n    QCTLMsg->LibQmiProxyOpenReq.TLVLength = cpu_to_le16(strlen(device_path));\r\n    //strcpy(QCTLMsg->LibQmiProxyOpenReq.device_path, device_path);\r\n    //__builtin___strcpy_chk\r\n    memcpy(QCTLMsg->LibQmiProxyOpenReq.device_path, device_path, strlen(device_path));\r\n    return sizeof(QMICTL_LIBQMI_PROXY_OPEN_MSG) + (strlen(device_path));\r\n}\r\n\r\nstatic int libqmi_proxy_open(const char *cdc_wdm) {\r\n    int ret;\r\n    PQCQMIMSG pResponse;\r\n\r\n    ret = QmiThreadSendQMI(ComposeQCTLMsg(QMI_MESSAGE_CTL_INTERNAL_PROXY_OPEN,\r\n        CtlLibQmiProxyOpenReq, (void *)cdc_wdm), &pResponse);\r\n    if (!ret && pResponse\r\n        && pResponse->CTLMsg.QMICTLMsgHdrRsp.QMUXResult == 0\r\n        && pResponse->CTLMsg.QMICTLMsgHdrRsp.QMUXError == 0) {\r\n        ret = 0;\r\n    }\r\n    else {\r\n        return -1;\r\n    }\r\n\r\n    if (pResponse)\r\n            free(pResponse);\r\n\r\n    return ret;\r\n}\r\n\r\nstatic int QmiWwanSendQMI(PQCQMIMSG pRequest) {\r\n    struct pollfd pollfds[]= {{cdc_wdm_fd, POLLOUT, 0}};\r\n    int ret;\r\n\r\n    if (cdc_wdm_fd == -1) {\r\n        dbg_time(\"%s cdc_wdm_fd = -1\", __func__);\r\n        return -ENODEV;\r\n    }\r\n\r\n    if (pRequest->QMIHdr.QMIType != QMUX_TYPE_CTL) {\r\n        pRequest->QMIHdr.ClientId = qmiclientId[pRequest->QMIHdr.QMIType];\r\n        if (pRequest->QMIHdr.ClientId == 0) {\r\n            dbg_time(\"QMIType %d has no clientID\", pRequest->QMIHdr.QMIType);\r\n            return -ENODEV;\r\n        }\r\n\r\n        if (pRequest->QMIHdr.QMIType == QMUX_TYPE_WDS_IPV6)\r\n            pRequest->QMIHdr.QMIType = QMUX_TYPE_WDS;\r\n    }\r\n\r\n    do {\r\n        ret = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), 5000);\r\n    } while ((ret < 0) && (errno == EINTR));\r\n\r\n    if (pollfds[0].revents & POLLOUT) {\r\n        ssize_t nwrites = le16_to_cpu(pRequest->QMIHdr.Length) + 1;\r\n        ret = write(cdc_wdm_fd, pRequest, nwrites);\r\n        if (ret == nwrites) {\r\n            ret = 0;\r\n        } else {\r\n            dbg_time(\"%s write=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\r\n        }\r\n    } else {\r\n        dbg_time(\"%s poll=%d, revents = 0x%x, errno: %d (%s)\", __func__, ret, pollfds[0].revents, errno, strerror(errno));\r\n    }\r\n\r\n    return ret;\r\n}\r\n\r\nstatic UCHAR QmiWwanGetClientID(UCHAR QMIType) {\r\n    PQCQMIMSG pResponse;\r\n\r\n    QmiThreadSendQMI(ComposeQCTLMsg(QMICTL_GET_CLIENT_ID_REQ, CtlGetClientIdReq, &QMIType), &pResponse);\r\n\r\n    if (pResponse) {\r\n        USHORT QMUXResult = cpu_to_le16(pResponse->CTLMsg.QMICTLMsgHdrRsp.QMUXResult);       // QMI_RESULT_SUCCESS\r\n        USHORT QMUXError = cpu_to_le16(pResponse->CTLMsg.QMICTLMsgHdrRsp.QMUXError);        // QMI_ERR_INVALID_ARG\r\n        //UCHAR QMIType = pResponse->CTLMsg.GetClientIdRsp.QMIType;\r\n        UCHAR ClientId = pResponse->CTLMsg.GetClientIdRsp.ClientId;\r\n\r\n        if (!QMUXResult && !QMUXError && (QMIType == pResponse->CTLMsg.GetClientIdRsp.QMIType)) {\r\n            switch (QMIType) {\r\n                case QMUX_TYPE_WDS: dbg_time(\"Get clientWDS = %d\", ClientId); break;\r\n                case QMUX_TYPE_DMS: dbg_time(\"Get clientDMS = %d\", ClientId); break;\r\n                case QMUX_TYPE_NAS: dbg_time(\"Get clientNAS = %d\", ClientId); break;\r\n                case QMUX_TYPE_QOS: dbg_time(\"Get clientQOS = %d\", ClientId); break;\r\n                case QMUX_TYPE_WMS: dbg_time(\"Get clientWMS = %d\", ClientId); break;\r\n                case QMUX_TYPE_PDS: dbg_time(\"Get clientPDS = %d\", ClientId); break;\r\n                case QMUX_TYPE_UIM: dbg_time(\"Get clientUIM = %d\", ClientId); break;\r\n                case QMUX_TYPE_COEX: dbg_time(\"Get clientCOEX = %d\", ClientId); break;\r\n                case QMUX_TYPE_WDS_ADMIN: dbg_time(\"Get clientWDA = %d\", ClientId);\r\n                break;\r\n                default: break;\r\n            }\r\n            return ClientId;\r\n        }\r\n    }\r\n    return 0;\r\n}\r\n\r\nstatic int QmiWwanReleaseClientID(QMI_SERVICE_TYPE QMIType, UCHAR ClientId) {\r\n    UCHAR argv[] = {QMIType, ClientId};\r\n    QmiThreadSendQMI(ComposeQCTLMsg(QMICTL_RELEASE_CLIENT_ID_REQ, CtlReleaseClientIdReq, argv), NULL);\r\n    return 0;\r\n}\r\n\r\nstatic int QmiWwanInit(PROFILE_T *profile) {\r\n    unsigned i;\r\n    int ret;\r\n    PQCQMIMSG pResponse;\r\n\r\n    if (profile->proxy[0] && !strcmp(profile->proxy, LIBQMI_PROXY)) {\r\n        ret = libqmi_proxy_open(profile->qmichannel);\r\n        if (ret)\r\n            return ret;\r\n    }\r\n\r\n    if (!profile->proxy[0]) {\r\n        for (i = 0; i < 10; i++) {\r\n            ret = QmiThreadSendQMITimeout(ComposeQCTLMsg(QMICTL_SYNC_REQ, NULL, NULL), NULL, 1 * 1000, __func__);\r\n            if (ret != ETIMEDOUT)\r\n                break;\r\n            sleep(1);\r\n        }\r\n        if (ret)\r\n            return ret;\r\n    }\r\n\r\n    QmiThreadSendQMI(ComposeQCTLMsg(QMICTL_GET_VERSION_REQ, CtlGetVersionReq, NULL), &pResponse);\r\n    if (profile->qmap_mode) {\r\n        if (pResponse) {\r\n            if (pResponse->CTLMsg.QMICTLMsgHdrRsp.QMUXResult == 0 && pResponse->CTLMsg.QMICTLMsgHdrRsp.QMUXError == 0) {\r\n                uint8_t  NumElements = 0;\r\n\r\n                for (NumElements = 0; NumElements < pResponse->CTLMsg.GetVersionRsp.NumElements; NumElements++) {\r\n#if 0\r\n                    dbg_time(\"QMUXType = %02x Version = %d.%d\",\r\n                        pResponse->CTLMsg.GetVersionRsp.TypeVersion[NumElements].QMUXType,\r\n                        pResponse->CTLMsg.GetVersionRsp.TypeVersion[NumElements].MajorVersion,\r\n                        pResponse->CTLMsg.GetVersionRsp.TypeVersion[NumElements].MinorVersion);\r\n#endif\r\n                    if (pResponse->CTLMsg.GetVersionRsp.TypeVersion[NumElements].QMUXType == QMUX_TYPE_WDS_ADMIN)\r\n                        profile->qmap_version = (pResponse->CTLMsg.GetVersionRsp.TypeVersion[NumElements].MinorVersion > 16);\r\n                }\r\n            }\r\n        }\r\n    }\r\n    if (pResponse) free(pResponse);\r\n    qmiclientId[QMUX_TYPE_WDS] = QmiWwanGetClientID(QMUX_TYPE_WDS);\r\n    if (profile->enable_ipv6)\r\n        qmiclientId[QMUX_TYPE_WDS_IPV6] = QmiWwanGetClientID(QMUX_TYPE_WDS);\r\n    qmiclientId[QMUX_TYPE_DMS] = QmiWwanGetClientID(QMUX_TYPE_DMS);\r\n    qmiclientId[QMUX_TYPE_NAS] = QmiWwanGetClientID(QMUX_TYPE_NAS);\r\n    qmiclientId[QMUX_TYPE_UIM] = QmiWwanGetClientID(QMUX_TYPE_UIM);\r\n    qmiclientId[QMUX_TYPE_WDS_ADMIN] = QmiWwanGetClientID(QMUX_TYPE_WDS_ADMIN);\r\n#ifdef CONFIG_COEX_WWAN_STATE\r\n    qmiclientId[QMUX_TYPE_COEX] = QmiWwanGetClientID(QMUX_TYPE_COEX);\r\n#endif\r\n#ifdef CONFIG_ENABLE_QOS\r\n    qmiclientId[QMUX_TYPE_QOS] = QmiWwanGetClientID(QMUX_TYPE_QOS);\r\n#endif\r\n    profile->wda_client = qmiclientId[QMUX_TYPE_WDS_ADMIN];\r\n\r\n    return 0;\r\n}\r\n\r\nstatic int QmiWwanDeInit(void) {\r\n    unsigned int i;\r\n    for (i = 0; i < sizeof(qmiclientId)/sizeof(qmiclientId[0]); i++)\r\n    {\r\n        if (qmiclientId[i] != 0)\r\n        {\r\n            QmiWwanReleaseClientID((QMUX_TYPE_WDS_IPV6 == i ? QMUX_TYPE_WDS : i), qmiclientId[i]);\r\n            qmiclientId[i] = 0;\r\n        }\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nstatic ssize_t qmi_proxy_read (int fd, void *buf, size_t size) {\r\n    ssize_t nreads;\r\n    PQCQMI_HDR pHdr = (PQCQMI_HDR)buf;\r\n\r\n    nreads = read(fd, pHdr, sizeof(QCQMI_HDR));\r\n    if (nreads == sizeof(QCQMI_HDR) && le16_to_cpu(pHdr->Length) < size) {\r\n        nreads += read(fd, pHdr+1, le16_to_cpu(pHdr->Length) + 1 - sizeof(QCQMI_HDR));\r\n    }\r\n\r\n    return nreads;\r\n}\r\n\r\n#ifdef QUECTEL_QMI_MERGE\r\nstatic int QmiWwanMergeQmiRsp(void *buf, ssize_t *src_size) {\r\n    static QMI_MSG_PACKET s_QMIPacket;\r\n    QMI_MSG_HEADER *header = NULL;\r\n    ssize_t size = *src_size;\r\n\r\n    if((uint16_t)size < sizeof(QMI_MSG_HEADER))\r\n        return -1;\r\n\r\n    header = (QMI_MSG_HEADER *)buf;\r\n    if(le16_to_cpu(header->idenity) != MERGE_PACKET_IDENTITY || le16_to_cpu(header->version) != MERGE_PACKET_VERSION || le16_to_cpu(header->cur_len) > le16_to_cpu(header->total_len)) \r\n        return -1;\r\n\r\n    if(le16_to_cpu(header->cur_len) == le16_to_cpu(header->total_len)) {\r\n        *src_size = le16_to_cpu(header->total_len);\r\n        memcpy(buf, buf + sizeof(QMI_MSG_HEADER), *src_size);\r\n        s_QMIPacket.len = 0;  \r\n        return 0;\r\n    } \r\n\r\n    memcpy(s_QMIPacket.buf + s_QMIPacket.len, buf + sizeof(QMI_MSG_HEADER), le16_to_cpu(header->cur_len));\r\n    s_QMIPacket.len += le16_to_cpu(header->cur_len);\r\n\r\n    if (le16_to_cpu(header->cur_len) < MERGE_PACKET_MAX_PAYLOAD_SIZE || s_QMIPacket.len >= le16_to_cpu(header->total_len)) { \r\n       memcpy(buf, s_QMIPacket.buf, s_QMIPacket.len);      \r\n       *src_size = s_QMIPacket.len;\r\n       s_QMIPacket.len = 0;\r\n       return 0;           \r\n    }\r\n\r\n    return -1;\r\n}\r\n#endif\r\n\r\nstatic void * QmiWwanThread(void *pData) {\r\n    PROFILE_T *profile = (PROFILE_T *)pData;\r\n    const char *cdc_wdm = (const char *)profile->qmichannel;\r\n    int wait_for_request_quit = 0;\r\n    char num = cdc_wdm[strlen(cdc_wdm)-1];\r\n\t\r\n    if (profile->proxy[0]) {\r\n         if (!strncmp(profile->proxy, QUECTEL_QMI_PROXY, strlen(QUECTEL_QMI_PROXY))) {\r\n            snprintf(profile->proxy, sizeof(profile->proxy), \"%s%c\", QUECTEL_QMI_PROXY, num);\r\n         }\r\n    }\r\n    else if (!strncmp(cdc_wdm, \"/dev/mhi_IPCR\", strlen(\"/dev/mhi_IPCR\"))) {\r\n        snprintf(profile->proxy, sizeof(profile->proxy), \"%s%c\", QUECTEL_QRTR_PROXY, num);\r\n    }\r\n    else if (profile->qmap_mode > 1) {\r\n        snprintf(profile->proxy, sizeof(profile->proxy), \"%s%c\", QUECTEL_QMI_PROXY, num);\r\n    }\r\n    \r\n    if (profile->proxy[0])\r\n        cdc_wdm_fd = cm_open_proxy(profile->proxy);\r\n    else\r\n        cdc_wdm_fd = cm_open_dev(cdc_wdm);\r\n\r\n    if (cdc_wdm_fd == -1) {\r\n        dbg_time(\"%s Failed to open %s, errno: %d (%s)\", __func__, cdc_wdm, errno, strerror(errno));\r\n        qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_DISCONNECTED);\r\n        pthread_exit(NULL);\r\n        return NULL;\r\n    }\r\n\r\n    dbg_time(\"cdc_wdm_fd = %d\", cdc_wdm_fd);\r\n\r\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_CONNECTED);\r\n    while (1) {\r\n        struct pollfd pollfds[] = {{qmidevice_control_fd[1], POLLIN, 0}, {cdc_wdm_fd, POLLIN, 0}};\r\n        int ne, ret, nevents = sizeof(pollfds)/sizeof(pollfds[0]);\r\n\r\n        do {\r\n            ret = poll(pollfds, nevents, wait_for_request_quit ? 1000 : -1);\r\n         } while ((ret < 0) && (errno == EINTR));\r\n\r\n\tif (ret == 0 && wait_for_request_quit) {\r\n            QmiThreadRecvQMI(NULL);\r\n            continue;\r\n\t}\r\n\r\n        if (ret <= 0) {\r\n            dbg_time(\"%s poll=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\r\n            break;\r\n        }\r\n\r\n        for (ne = 0; ne < nevents; ne++) {\r\n            int fd = pollfds[ne].fd;\r\n            short revents = pollfds[ne].revents;\r\n\r\n            //dbg_time(\"{%d, %x, %x}\", pollfds[ne].fd, pollfds[ne].events, pollfds[ne].revents);\r\n\r\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\r\n                dbg_time(\"%s poll err/hup/inval\", __func__);\r\n                dbg_time(\"poll fd = %d, events = 0x%04x\", fd, revents);\r\n                if (fd == cdc_wdm_fd) {\r\n                } else {\r\n                }\r\n                if (revents & (POLLHUP | POLLNVAL)) //EC20 bug, Can get POLLERR\r\n                    goto __QmiWwanThread_quit;\r\n            }\r\n\r\n            if ((revents & POLLIN) == 0)\r\n                continue;\r\n\r\n            if (fd == qmidevice_control_fd[1]) {\r\n                int triger_event;\r\n                if (read(fd, &triger_event, sizeof(triger_event)) == sizeof(triger_event)) {\r\n                    //DBG(\"triger_event = 0x%x\", triger_event);\r\n                    switch (triger_event) {\r\n                        case RIL_REQUEST_QUIT:\r\n                            goto __QmiWwanThread_quit;\r\n                        break;\r\n                        case SIG_EVENT_STOP:\r\n                            wait_for_request_quit = 1;\r\n                        break;\r\n                        default:\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n\r\n            if (fd == cdc_wdm_fd) {\r\n                ssize_t nreads;\r\n                PQCQMIMSG pResponse = (PQCQMIMSG)cm_recv_buf;\r\n                \r\n                if (!profile->proxy[0])\r\n                    nreads = read(fd, cm_recv_buf, sizeof(cm_recv_buf));\r\n                else\r\n                    nreads = qmi_proxy_read(fd, cm_recv_buf, sizeof(cm_recv_buf));\r\n                //dbg_time(\"%s read=%d errno: %d (%s)\",  __func__, (int)nreads, errno, strerror(errno));\r\n                if (nreads <= 0) {\r\n                    dbg_time(\"%s read=%d errno: %d (%s)\",  __func__, (int)nreads, errno, strerror(errno));\r\n                    break;\r\n                }\r\n#ifdef QUECTEL_QMI_MERGE\r\n                if((profile->qmap_mode == 0 || profile->qmap_mode == 1) && QmiWwanMergeQmiRsp(cm_recv_buf, &nreads))\r\n                    continue;             \r\n#endif\r\n                if (nreads != (le16_to_cpu(pResponse->QMIHdr.Length) + 1)) {\r\n                    dbg_time(\"%s nreads=%d,  pQCQMI->QMIHdr.Length = %d\",  __func__, (int)nreads, le16_to_cpu(pResponse->QMIHdr.Length));\r\n                    continue;\r\n                }\r\n\r\n                QmiThreadRecvQMI(pResponse);\r\n            }\r\n        }\r\n    }\r\n\r\n__QmiWwanThread_quit:\r\n    if (cdc_wdm_fd != -1) { close(cdc_wdm_fd); cdc_wdm_fd = -1; }\r\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_DISCONNECTED);\r\n    QmiThreadRecvQMI(NULL); //main thread may pending on QmiThreadSendQMI()\r\n    dbg_time(\"%s exit\", __func__);\r\n    pthread_exit(NULL);\r\n    return NULL;\r\n}\r\n\r\nconst struct qmi_device_ops qmiwwan_qmidev_ops = {\r\n    .init = QmiWwanInit,\r\n    .deinit = QmiWwanDeInit,\r\n    .send = QmiWwanSendQMI,\r\n    .read = QmiWwanThread,\r\n};\r\n\r\nuint8_t qmi_over_mbim_get_client_id(uint8_t QMIType) {\r\n    return QmiWwanGetClientID(QMIType);\r\n}\r\n\r\nuint8_t qmi_over_mbim_release_client_id(uint8_t QMIType, uint8_t ClientId) {\r\n    return QmiWwanReleaseClientID(QMIType, ClientId);\r\n}\r\n#endif\r\n\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/ReleaseNote.txt",
    "content": "Release Notes\r\n\r\n[V1.6.6]\r\nDate:   1/12/2024\r\nenhancement:\r\n  1. support SDX35 platform\r\nfix:\r\n\r\n  \r\n[V1.6.4]\r\nDate:   9/7/2022\r\nenhancement:\r\n  1. set cflags as -Wall -Wextra -Werror -O1, and fix compile errors\r\n  2. some code refactoring\r\n  3. add quectel-qrtr-proxy\r\nfix:\r\n  1. netmask error when use ifconfig on little endian cpu\r\n\r\n[V1.6.2]\r\nDate:   11/18/2021\r\nenhancement:\r\n\t1. support 'LTE && WiFi Coexistence Solution via QMI'.\r\n\t   If customer want use this feature, need enable CONFIG_COEX_WWAN_STATE in QMIThread.h \r\n\r\n[V1.6.1]\r\nDate:   7/20/2021\r\nenhancement:\r\n\t1. add requestGetCellInfoList requestRadioPower\r\n\t2. add QMI OVER MBIM \r\n\t3. support qrtr and rmnet\r\n\t4. support RG500U PCIE \r\n\t5. add qos service && get qos flow data_rate_max func\r\nfix:\r\n  1. mbim: increase mbim open timeout to 3 seconds. some modem take long time for open cmd.\r\n  2. support MsChapV2\r\n  3. mbim: invalid memory access when only get one DNS\r\n  4. some bug fix for use AT Command to setup data call\r\n\r\n[V1.6.0.26]\r\nDate:   4/22/2021\r\nenhancement:\r\n\t1. add lots of log file to show how to use this tool\r\n\t2. support pcie mhi multiple call\r\n\t3. at command: support EC200U/EC200T/EC200S/RG801H/RG500U/\r\nfix:\r\n  1. mbim-proxy: fix errors on big endian cpu, ignore mbim open/close cmd from quectel-cm \r\n\r\n[V1.6.0.25]\r\nDate:   4/8/2021\r\nenhancement:\r\nfix:\r\n  1. fix compile error when use gcc 9.3.0\r\n  2. fix yocto 'QA Issue: No GNU_HASH in the ELF binary'\r\n\r\n[V1.6.0.24]\r\nDate:   3/9/2021\r\nenhancement:\r\n  1. '-p [quectel-][qmi|mbim]-proxy', can connect to quectel/libqmi/libmbim's proxy, even only one data\r\n  2. set variable s_9x07 as 1 (from 0), most of modems are base on MDM90x7 and later QCOM chip.\r\nfix:\r\n  1. define CHAR as signed char\r\n  2. mofidy Makefile to generate more compile warnnings and fix them\r\n\r\n[V1.6.0.23]\r\nDate:   2/26/2021\r\nenhancement:\r\n  1. support 'AT+QNETDEVCTL' (not release)\r\nfix:\r\n   1. modify help/usage\r\n   2. fix some memroy access error in mbim-cm.c\r\n\r\n[V1.6.0.22]\r\nDate:   2/4/2021\r\nenhancement:\r\n  1. support connect to libqmi's qmi-proxy\r\n  2. only allow ' 0/1/2/none/pap/chap' for auth of '-s'\r\n  3. '-m iface-idx' bind QMAP data call to wwan0_<iface_idx>\r\nfix:\r\n\r\n[V1.6.0.21]\r\nDate:   1/28/2021\r\nenhancement:\r\n  1. print 5G signal\r\nfix:\r\n  1. fix compile errors: -Werror=format-truncation=\r\n  \r\n[V1.6.0.20]\r\nDate:   12/29/2020\r\nenhancement:\r\n  1. Code refactoring\r\n  2. support 'AT+QNETDEVCTL' (not release)\r\nfix:\r\n\r\n[V1.6.0.19]\r\nDate:   12/4/2020\r\nenhancement:\r\n  1. if 'udhcpc's default.script' missed, directy set ip/dns/route by 'ip' co,mand\r\nfix:\r\n\r\n[V1.6.0.18]\r\nDate:   12/4/2020\r\nenhancement:\r\n  1. Code refactoring\r\nfix:\r\n\r\n[V1.6.0.17]\r\nDate:   8/25/2020\r\nenhancement:\r\n  1. support MBIM multi-call\r\n  2. support unisoc RG500U mbim\r\n  3. QUECTEL_QMI_MERGE: some SOC can not read more then 64 bytes (QMI)data via USB Endpoint 0\r\nfix:\r\n\r\n[V1.6.0.15]\r\nDate:   7/24/2020\r\nenhancement:\r\nfix:\r\n  1. QMAP multi-call, AT+CFUN=4 then AT+CFUN=1, only one call can obtain IP by DHCP\r\n \t  \r\n[V1.6.0.14]\r\nDate:   6/10/2020 \r\nenhancement:\r\n  1. support X55's GobiNet LOOPBACK\r\nfix:\r\n  1. very old uclib do not support htole32 and pthread_condattr_setclock\r\n  2. pthread_cond_wait tv_nsec >= 1000000000U is wrong\r\n  3. do not close socket in udhcpc.c ifc_get_addr()\r\n \t                                  \r\n[V1.6.0.13]\r\nDate:   6/9/2020 \r\nenhancement:\r\n  1. add some example for openwrt, marco 'QL_OPENWER_NETWORK_SETUP'\r\nfix:\r\n\r\n[V1.6.0.12]\r\nDate:   5/29/2020 \r\nenhancement:\r\nfix:\r\n\t1. some EM12's usb-net-qmi/mbim interface is at 8 (not 4)\r\n\r\n[V1.6.0.11]\r\nDate:   5/28/2020 \r\nenhancement:\r\nfix:\r\n\t1. fix mbim debug on Big Endian CPU\r\n\r\n[V1.6.0.10]\r\nDate:   5/25/2020 \r\nenhancement:\r\nfix:\r\n\t1. set QMAP .ul_data_aggregation_max_datagrams to 11 (from 16)\r\n\r\n[V1.6.0.9]\r\nDate:   5/22/2020 \r\nenhancement:\r\nfix:\r\n\t1. dial fail when register to 5G-SA\r\n\r\n[V1.6.0.8]\r\nDate:   4/30/2020\r\nenhancement:\r\n  1. support '-b' to seletc brige mode\r\nfix:\r\n\r\n[V1.6.0.7]\r\nDate:   4/29/2020\r\nenhancement:\r\n  1. support QMAP multi-call for qmi_wwan_q and pcie_mhi 's rmnet driver\r\nfix:\r\n\r\n[V1.6.0.6]\r\nDate:   4/20/2020\r\nenhancement:\r\n  1. support '-k pdn_idx' to hangup call '-n pdn_idx'\r\nfix:\r\n  1. fix set dl_minimum_padding as 0, modems do not support this featrue\r\n\r\n[V1.6.0.5]\r\nDate:   4/10/2020\r\nenhancement:\r\n  1. support X55's QMAPV5 for PCIE\r\nfix:\r\n\r\n[V1.6.0.3]\r\nDate:   4/8/2020\r\nenhancement:\r\n  1. support multi-modems all use multi-data-calls\r\nfix:\r\n\r\n[V1.6.0.2]\r\nDate:   4/7/2020\r\nenhancement:\r\n  1. support X55's QMAPV5 for USB\r\nfix:\r\n\r\n[V1.6.0.1]\r\nDate:   4/1/2020\r\nenhancement:\r\n  1. support QMAP UL AGG (multi data call)\r\nfix:\r\n  1. some EM12's usb-net-qmi/mbim interface is at 8 (not 4)\r\n\r\n[V1.5.9]\r\nDate:   3/4/2020\r\nenhancement:\r\n  1. support pcie mhi multi-APN data call\r\n  3. support QMAP UL AGG (single data call)\r\nfix:\r\n  1. set 4 bytes aligned for mbim parameters, or cause dial mbim call fail\r\n\r\n[V1.5.8]\r\nDate:   2/18/2020\r\nenhancement:\r\n  1. support '-l 14' X55's loopback function\r\nfix:\r\n\r\n[V1.5.7]\r\nDate:   2/6/2020\r\nenhancement:\r\n  1. support '-u usbmon_log_file' to catch usbmon log\r\nfix:\r\n\r\n[V1.5.6]\r\nDate:   1/20/202\r\nenhancement:\r\n  1. show driver name and version\r\n  2. support PCSCF\r\n  3. support bridge in mbim\r\nfix:\r\n\r\n[V1.5.5]\r\nDate:   12/31/2019\r\nenhancement:\r\nfix:\r\n  1. fix some memory access bug in mbim-cm.c\r\n\r\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.5.4]\r\nDate:   12/17/2019\r\nenhancement:\r\n  1. Add copyright\r\n  2. auto detect pcie mhi /dev/mhi*\r\nfix:\r\n\r\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.5.3]\r\nDate:   2019/12/11\r\nenhancement:\r\n1. support show SignalInfo, controlled by macro CONFIG_SIGNALINFO\r\n2. support show 5G_NSA/5G_NA\r\n3. support Microsoft Extend MBIM message\r\nfix:\r\n1. quectel-qmi-proxy bugs on Big-Endian CPU\r\n\r\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.5.2]\r\nDate:   12/2/2019\r\nenhancement:\r\n  1. support requestGetSignalInfo()\r\nfix:\r\n\r\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.4.1]\r\nDate:   10/23/2019 \r\nenhancement:\r\n  1. support QMI_CTL_REVOKE_CLIENT_ID_IND (Quectel define QMI)\r\n  2. add copyright\r\nfix:\r\n  1. remove SIGUSR\r\n\r\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.3.10]\r\nDate:   10/14/2019\r\nenhancement:\r\n  1. increase retry interval\r\nfix:\r\n\r\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.2.1]\r\nDate:   2019/02/26\r\nenhancement:\r\n1. Implement help message.\r\n\r\nroot@ubuntu:# ./quectel-CM -h\r\n[02-26_10:39:21:353] Usage: ./quectel-CM [options]\r\n[02-26_10:39:21:353] -s [apn [user password auth]]          Set apn/user/password/auth get from your network provider\r\n[02-26_10:39:21:353] -p pincode                             Verify sim card pin if sim card is locked\r\n[02-26_10:39:21:353] -f logfilename                         Save log message of this program to file\r\n[02-26_10:39:21:353] -i interface                           Specify network interface(default auto-detect)\r\n[02-26_10:39:21:353] -4                                     IPv4 protocol\r\n[02-26_10:39:21:353] -6                                     IPv6 protocol\r\n[02-26_10:39:21:353] -m muxID                               Specify muxid when set multi-pdn data connection.\r\n[02-26_10:39:21:353] -n channelID                           Specify channelID when set multi-pdn data connection(default 1).\r\n[02-26_10:39:21:353] [Examples]\r\n[02-26_10:39:21:353] Example 1: ./quectel-CM\r\n[02-26_10:39:21:353] Example 2: ./quectel-CM -s 3gnet\r\n[02-26_10:39:21:353] Example 3: ./quectel-CM -s 3gnet carl 1234 0 -p 1234 -f gobinet_log.txt\r\nroot@ubuntu:#\r\n2. Support bridge mode when set multi-pdn data connections.\r\n3. Host device can access network in bridge mode.\r\n\r\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.1.46]\r\nDate:   2019/02/18\r\nenhancement:\r\n1. support only IPV6 data call. quectel-CM now support three dialing methods: IPV4 only, IPV6 only, IPV4V6.\r\n\t./quectel-CM  -4(or no argument)  only IPV4\r\n\t\t\t\t  -6\t        only IPV6\r\n\t\t\t\t  -4 -6               IPV4 && IPV6\r\n\r\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.1.45]\r\nDate:   2018/09/13\r\nenhancement:\r\n1. support EG12 PCIE interface\r\n\r\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.1.44]\r\nDate:   2018/09/10\r\nenhancement:\r\n1. support setup IPV4&IPV6 data call.\r\n\r\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.1.43]\r\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.1.42]\r\nDate:   2018/08/29\r\nenhancement:\r\n1. support QMI_WWAN's QMAP fucntion and bridge mode, please contact Quectel FAE to get qmi_wwan.c patch.\r\n   when enable QMI_WWAN's QMAP IP Mux function, must run 'quectel-qmi-proxy -d /dev/cdc-wdmX' before quectel-CM\r\n\r\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.1.41]\r\nDate:   2018/05/24\r\nenhancement:\r\n1. fix a cdma data call error\r\n\r\n[WCDMA&LTE_QConnectManager_Linux&Android_V1.1.40]\r\nDate:   2018/05/12\r\nenhancement:\r\n1. support GobiNet's QMAP fucntion and bridge mode.\r\n\t 'Quectel_WCDMA&LTE_Linux&Android_GobiNet_Driver_V1.3.5' and later version is required to use QMAP and bridge mode.\r\n\t for detail, please refer to GobiNet Driver\r\n\t \r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/at_tok.c",
    "content": "/* //device/system/reference-ril/at_tok.c\n**\n** Copyright 2006, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\");\n** you may not use this file except in compliance with the License.\n** You may obtain a copy of the License at\n**\n**     http://www.apache.org/licenses/LICENSE-2.0\n**\n** Unless required by applicable law or agreed to in writing, software\n** distributed under the License is distributed on an \"AS IS\" BASIS,\n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n** See the License for the specific language governing permissions and\n** limitations under the License.\n*/\n\n#include \"at_tok.h\"\n#include <string.h>\n#include <stdio.h>\n#include <ctype.h>\n#include <stdlib.h>\n#include <stdarg.h>\n\n/**\n * Starts tokenizing an AT response string\n * returns -1 if this is not a valid response string, 0 on success.\n * updates *p_cur with current position\n */\nint at_tok_start(char **p_cur)\n{\n    if (*p_cur == NULL) {\n        return -1;\n    }\n\n    // skip prefix\n    // consume \"^[^:]:\"\n\n    *p_cur = strchr(*p_cur, ':');\n\n    if (*p_cur == NULL) {\n        return -1;\n    }\n\n    (*p_cur)++;\n\n    return 0;\n}\n\nstatic void skipWhiteSpace(char **p_cur)\n{\n    if (*p_cur == NULL) return;\n\n    while (**p_cur != '\\0' && isspace(**p_cur)) {\n        (*p_cur)++;\n    }\n}\n\nstatic void skipNextComma(char **p_cur)\n{\n    if (*p_cur == NULL) return;\n\n    while (**p_cur != '\\0' && **p_cur != ',') {\n        (*p_cur)++;\n    }\n\n    if (**p_cur == ',') {\n        (*p_cur)++;\n    }\n}\n\nstatic char * nextTok(char **p_cur)\n{\n    char *ret = NULL;\n\n    skipWhiteSpace(p_cur);\n\n    if (*p_cur == NULL) {\n        ret = NULL;\n    } else if (**p_cur == '\"') {\n        (*p_cur)++;\n        ret = strsep(p_cur, \"\\\"\");\n        skipNextComma(p_cur);\n    } else {\n        ret = strsep(p_cur, \",\");\n    }\n\n    return ret;\n}\n\n\n/**\n * Parses the next integer in the AT response line and places it in *p_out\n * returns 0 on success and -1 on fail\n * updates *p_cur\n * \"base\" is the same as the base param in strtol\n */\n\nstatic int at_tok_nextint_base(char **p_cur, int *p_out, int base, int  uns)\n{\n    char *ret;\n\n    if (*p_cur == NULL) {\n        return -1;\n    }\n\n    ret = nextTok(p_cur);\n\n    if (ret == NULL) {\n        return -1;\n    } else {\n        long l;\n        char *end;\n\n        if (uns)\n            l = strtoul(ret, &end, base);\n        else\n            l = strtol(ret, &end, base);\n\n        *p_out = (int)l;\n\n        if (end == ret) {\n            return -1;\n        }\n    }\n\n    return 0;\n}\n\n/**\n * Parses the next base 10 integer in the AT response line\n * and places it in *p_out\n * returns 0 on success and -1 on fail\n * updates *p_cur\n */\nint at_tok_nextint(char **p_cur, int *p_out)\n{\n    return at_tok_nextint_base(p_cur, p_out, 10, 0);\n}\n\n/**\n * Parses the next base 16 integer in the AT response line\n * and places it in *p_out\n * returns 0 on success and -1 on fail\n * updates *p_cur\n */\nint at_tok_nexthexint(char **p_cur, int *p_out)\n{\n    return at_tok_nextint_base(p_cur, p_out, 16, 1);\n}\n\nint at_tok_nextbool(char **p_cur, char *p_out)\n{\n    int ret;\n    int result;\n\n    ret = at_tok_nextint(p_cur, &result);\n\n    if (ret < 0) {\n        return -1;\n    }\n\n    // booleans should be 0 or 1\n    if (!(result == 0 || result == 1)) {\n        return -1;\n    }\n\n    if (p_out != NULL) {\n        *p_out = (char)result;\n    }\n\n    return ret;\n}\n\nint at_tok_nextstr(char **p_cur, char **p_out)\n{\n    if (*p_cur == NULL) {\n        return -1;\n    }\n\n    *p_out = nextTok(p_cur);\n\n    return 0;\n}\n\n/** returns 1 on \"has more tokens\" and 0 if no */\nint at_tok_hasmore(char **p_cur)\n{\n    return ! (*p_cur == NULL || **p_cur == '\\0');\n}\n\nint at_tok_count(const char *in_line)\n{\n    int commas = 0;\n    const char *p;\n\n    if (!in_line)\n        return 0;\n\n    for (p = in_line; *p != '\\0' ; p++) {\n        if (*p == ',') commas++;\n    }\n\n    return commas;\n}\n\n//fmt: d ~ int, x ~ hexint, b ~ bool, s ~ str\nint at_tok_scanf(const char *in_line, const char *fmt, ...)\n{\n    int n = 0;\n    int err;\n    va_list ap;\n    const char *p = fmt;\n    void *d;\n    void *dump;\n    static char s_line[1024];\n    char *line = s_line;\n\n    if (!in_line)\n        return 0;\n\n    strncpy(s_line, in_line, sizeof(s_line) - 1);\n\n    va_start(ap, fmt);\n\n    err = at_tok_start(&line);\n    if (err < 0) goto error;\n\n    for (; *p; p++) {\n        if (*p == ',' || *p == ' ')\n            continue;\n\n        if (*p != '%') {\n            goto error;\n        }\n        p++;\n\n        d = va_arg(ap, void *);\n        if (!d)\n            d = &dump;\n\n        if (!at_tok_hasmore(&line))\n            break;\n        \n        if (*line == '-' && *(line + 1) == ',') {\n            line += 2;\n            n++;\n            if (*p == 'd')\n                *(int *)d = -1;\n            continue;\n         }\n\n        switch(*p) {\n            case 'd':\n                err = at_tok_nextint(&line, (int *)d);\n                if (err < 0) goto error;\n           break;\n            case 'x':\n                err = at_tok_nexthexint(&line, (int *)d);\n                if (err < 0) goto error;\n            break;\n            case 'b':\n                err = at_tok_nextbool(&line, (char *)d);\n                if (err < 0) goto error;\n            break;\n            case 's':\n                err = at_tok_nextstr(&line, (char **)d); //if strdup(line), here return free memory to caller\n                if (err < 0) goto error;\n            break;\n            default:\n                goto error;\n            break;\n        }\n\n        n++;\n    }\n\n    va_end(ap);\n\nerror:\n    //free(line);\n    return n;\n}\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/at_tok.h",
    "content": "/* //device/system/reference-ril/at_tok.h\n**\n** Copyright 2006, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\");\n** you may not use this file except in compliance with the License.\n** You may obtain a copy of the License at\n**\n**     http://www.apache.org/licenses/LICENSE-2.0\n**\n** Unless required by applicable law or agreed to in writing, software\n** distributed under the License is distributed on an \"AS IS\" BASIS,\n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n** See the License for the specific language governing permissions and\n** limitations under the License.\n*/\n\n#ifndef AT_TOK_H\n#define AT_TOK_H 1\n\nint at_tok_start(char **p_cur);\nint at_tok_nextint(char **p_cur, int *p_out);\nint at_tok_nexthexint(char **p_cur, int *p_out);\n\nint at_tok_nextbool(char **p_cur, char *p_out);\nint at_tok_nextstr(char **p_cur, char **out);\n\nint at_tok_hasmore(char **p_cur);\nint at_tok_count(const char *in_line);\nint at_tok_scanf(const char *line, const char *fmt, ...);\n\n#endif /*AT_TOK_H */\n\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/atc.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software. \r\n    Under no circumstances may customers modify, demonstrate, use, deliver \r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include <unistd.h>\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <ctype.h>\r\n#include <fcntl.h>\r\n#include <stddef.h>\r\n#include <pthread.h>\r\n#include <errno.h>\r\n#include <time.h>\r\n#include <signal.h>\r\n#include <getopt.h>\r\n#include <poll.h>\r\n#include <sys/time.h>\r\n#include <endian.h>\r\n#include <time.h>\r\n#include <sys/types.h>\r\n#include <limits.h>\r\n#include <inttypes.h>\r\n\r\nextern int asprintf(char **s, const char *fmt, ...);\r\n\r\n#include \"QMIThread.h\"\r\n\r\n#include \"atchannel.h\"\r\n#include \"at_tok.h\"\r\n\r\nstatic int asr_style_atc = 0;\r\nstatic int s_pdp;\r\n#define safe_free(__x) do { if (__x) { free((void *)__x); __x = NULL;}} while(0)\r\n#define safe_at_response_free(__x) { if (__x) { at_response_free(__x); __x = NULL;}}\r\n\r\n#define at_response_error(err, p_response) \\\r\n    (err \\\r\n    || p_response == NULL \\\r\n    || p_response->finalResponse == NULL \\\r\n    || p_response->success == 0)\r\n\r\nstatic int atc_init(PROFILE_T *profile) {\r\n    int err;\r\n    char *cmd;\r\n    ATResponse *p_response = NULL;\r\n\r\n    if (profile->proxy[0])  {\r\n        s_pdp = profile->pdp;\r\n        err = at_send_command_singleline(\"AT+QNETDEVSTATUS=?\", \"+QNETDEVSTATUS:\", &p_response);\r\n        if (at_response_error(err, p_response))\r\n            asr_style_atc = 1; //EC200T/EC100Y do not support this AT, but RG801/RG500U support\r\n        safe_at_response_free(p_response);\r\n\t\t\r\n        return err;\r\n    }\r\n\r\n    err = at_handshake();\r\n    if (err) {\r\n        dbg_time(\"handshake fail, TODO ... \");\r\n        goto exit;\r\n    }\r\n\t\r\n    s_pdp = profile->pdp;\r\n    at_send_command_singleline(\"AT+QCFG=\\\"usbnet\\\"\", \"+QCFG:\", NULL);\r\n    at_send_command_multiline(\"AT+QNETDEVCTL=?\", \"+QNETDEVCTL:\", NULL);\r\n    at_send_command(\"AT+CGREG=2\", NULL); //GPRS Network Registration Status\r\n    at_send_command(\"AT+CEREG=2\", NULL); //EPS Network Registration Status\r\n    at_send_command(\"AT+C5GREG=2\", NULL); //5GS Network Registration Status\r\n\r\n    err = at_send_command_singleline(\"AT+QNETDEVSTATUS=?\", \"+QNETDEVSTATUS:\", &p_response);\r\n    if (at_response_error(err, p_response))\r\n        asr_style_atc = 1; //EC200T/EC100Y do not support this AT, but RG801/RG500U support \r\n    safe_at_response_free(p_response);\r\n\r\n    if(profile->usb_dev.idProduct == 0x6007)\r\n        asr_style_atc = 1;\r\n\r\n    err = at_send_command_singleline(\"AT+QCFG=\\\"NAT\\\"\", \"+QCFG:\", &p_response);\r\n    if (!at_response_error(err, p_response)) {\r\n        int old_nat, new_nat = asr_style_atc ? 1 : 0;\r\n\r\n        err = at_tok_scanf(p_response->p_intermediates->line, \"%s%d\", NULL, &old_nat);\r\n        if (err == 2 && old_nat != new_nat) {\r\n            safe_at_response_free(p_response);\r\n            asprintf(&cmd, \"AT+QCFG=\\\"NAT\\\",%d\", new_nat);\r\n            err = at_send_command(cmd, &p_response);\r\n            safe_free(cmd);\r\n            if (!at_response_error(err, p_response)) {\r\n                err = at_send_command(\"at+cfun=1,1\",NULL);\r\n                if (!err)\r\n                    g_donot_exit_when_modem_hangup = 1;\r\n                //reboot to take effect\r\n            }\r\n            safe_at_response_free(p_response);\r\n        }\r\n        err = 0;\r\n    }\r\n    safe_at_response_free(p_response);\r\n\r\nexit:\r\n    return err;\r\n}\r\n\r\nstatic int atc_deinit(void) {\r\n    return 0;\r\n}\r\n\r\n/**\r\n * Called by atchannel when an unsolicited line appears\r\n * This is called on atchannel's reader thread. AT commands may\r\n * not be issued here\r\n */\r\nstatic void onUnsolicited (const char *s, const char *sms_pdu)\r\n{\r\n    (void)sms_pdu;\r\n\r\n    if (strStartsWith(s, \"+QNETDEVSTATUS:\")) {\r\n        qmidevice_send_event_to_main(RIL_UNSOL_DATA_CALL_LIST_CHANGED);\r\n    }\r\n    else if (strStartsWith(s, \"+CGREG:\")\r\n        || strStartsWith(s, \"+CEREG:\")\r\n        || strStartsWith(s, \"+C5GREG:\")) {\r\n        qmidevice_send_event_to_main(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED);\r\n    }\r\n}\r\n\r\nstatic void onTimeout(void) {\r\n    dbg_time(\"%s\", __func__);\r\n    //TODO\r\n}\r\n\r\nstatic void onClose(void) {\r\n    dbg_time(\"%s\", __func__);\r\n}\r\n\r\nstatic void * atc_read_thread(void *param) {\r\n    PROFILE_T *profile = (PROFILE_T *)param;\r\n    const char *cdc_wdm = (const char *)profile->qmichannel;\r\n    int wait_for_request_quit = 0;\r\n    int atc_fd;\r\n\r\n    atc_fd = cm_open_dev(cdc_wdm);\r\n    if (atc_fd <= 0) {\r\n        dbg_time(\"fail to open (%s), errno: %d (%s)\", cdc_wdm, errno, strerror(errno));\r\n        goto __quit;\r\n    }\r\n\r\n    dbg_time(\"atc_fd = %d\", atc_fd);\r\n\r\n    if (at_open(atc_fd, onUnsolicited, 0))\r\n        goto __quit;\r\n\r\n    at_set_on_timeout(onTimeout);\r\n    at_set_on_reader_closed(onClose);\r\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_CONNECTED);\r\n\r\n    while (atc_fd > 0) {\r\n        struct pollfd pollfds[] = {{atc_fd, POLLIN, 0}, {qmidevice_control_fd[1], POLLIN, 0}};\r\n        int ne, ret, nevents = 2;\r\n\r\n        ret = poll(pollfds, nevents, wait_for_request_quit ? 1000 : -1);\r\n\r\n        if (ret == 0 && wait_for_request_quit) {\r\n            break;\r\n        }\r\n\r\n        if (ret < 0) {\r\n            dbg_time(\"%s poll=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\r\n            break;\r\n        }\r\n\r\n        for (ne = 0; ne < nevents; ne++) {\r\n            int fd = pollfds[ne].fd;\r\n            short revents = pollfds[ne].revents;\r\n\r\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\r\n                dbg_time(\"%s poll err/hup/inval\", __func__);\r\n                dbg_time(\"epoll fd = %d, events = 0x%04x\", fd, revents);\r\n                if (revents & (POLLERR | POLLHUP | POLLNVAL))\r\n                goto __quit;\r\n            }\r\n\r\n            if ((revents & POLLIN) == 0)\r\n                continue;\r\n\r\n            if (atc_fd == fd) {\r\n                usleep(10*1000); //let atchannel.c read at response.\r\n            }\r\n            else if (fd == qmidevice_control_fd[1]) {\r\n                int triger_event;\r\n                if (read(fd, &triger_event, sizeof(triger_event)) == sizeof(triger_event)) {\r\n                    //dbg_time(\"triger_event = 0x%x\", triger_event);\r\n                    switch (triger_event) {\r\n                        case RIL_REQUEST_QUIT:\r\n                            goto __quit;\r\n                        break;\r\n                        case SIG_EVENT_STOP:\r\n                            wait_for_request_quit = 1;\r\n                        break;\r\n                        default:\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n__quit:\r\n    at_close();\r\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_DISCONNECTED);\r\n    dbg_time(\"%s exit\", __func__);\r\n\r\n    return NULL;\r\n}\r\n\r\nconst struct qmi_device_ops atc_dev_ops = {\r\n    .init = atc_init,\r\n    .deinit = atc_deinit,\r\n    .read = atc_read_thread,\r\n};\r\n\r\nstatic int requestBaseBandVersion(PROFILE_T *profile) {\r\n    int retVal = -1;\r\n    int err;\r\n    ATResponse *p_response = NULL;\r\n\r\n    (void)profile;\r\n\r\n    err = at_send_command_multiline(\"AT+CGMR\", \"\\0\", &p_response);\r\n    if (at_response_error(err, p_response))\r\n        goto exit;\r\n\r\n    if (p_response->p_intermediates && p_response->p_intermediates->line) {\r\n        strncpy(profile->BaseBandVersion, p_response->p_intermediates->line, sizeof(profile->BaseBandVersion) - 1);\r\n        retVal = 0;\r\n    }\r\n\r\nexit:\r\n    safe_at_response_free(p_response);\r\n    return retVal;\r\n}\r\n\r\nstatic int requestGetSIMStatus(SIM_Status *pSIMStatus)\r\n{\r\n    int err;\r\n    ATResponse *p_response = NULL;\r\n    char *cpinLine;\r\n    char *cpinResult;\r\n    int ret = SIM_NOT_READY;\r\n\r\n    err = at_send_command_singleline(\"AT+CPIN?\", \"+CPIN:\", &p_response);\r\n    if (at_response_error(err, p_response))\r\n        goto done;\r\n\r\n    switch (at_get_cme_error(p_response))\r\n    {\r\n    case CME_SUCCESS:\r\n        break;\r\n\r\n    case CME_SIM_NOT_INSERTED:\r\n    case CME_OPERATION_NOT_ALLOWED:\r\n    case CME_FAILURE:\r\n        ret = SIM_ABSENT;\r\n        goto done;\r\n\r\n    default:\r\n        ret = SIM_NOT_READY;\r\n        goto done;\r\n    }\r\n\r\n    cpinLine = p_response->p_intermediates->line;\r\n    err = at_tok_start (&cpinLine);\r\n\r\n    if (err < 0)\r\n    {\r\n        ret = SIM_NOT_READY;\r\n        goto done;\r\n    }\r\n\r\n    err = at_tok_nextstr(&cpinLine, &cpinResult);\r\n\r\n    if (err < 0)\r\n    {\r\n        ret = SIM_NOT_READY;\r\n        goto done;\r\n    }\r\n\r\n    if (0 == strcmp (cpinResult, \"SIM PIN\"))\r\n    {\r\n        ret = SIM_PIN;\r\n        goto done;\r\n    }\r\n    else if (0 == strcmp (cpinResult, \"SIM PUK\"))\r\n    {\r\n        ret = SIM_PUK;\r\n        goto done;\r\n    }\r\n    else if (0 == strcmp (cpinResult, \"PH-NET PIN\"))\r\n    {\r\n        return SIM_NETWORK_PERSONALIZATION;\r\n    }\r\n    else if (0 != strcmp (cpinResult, \"READY\"))\r\n    {\r\n        /* we're treating unsupported lock types as \"sim absent\" */\r\n        ret = SIM_ABSENT;\r\n        goto done;\r\n    }\r\n\r\n    ret = SIM_READY;\r\n\r\ndone:\r\n    safe_at_response_free(p_response);\r\n    *pSIMStatus = ret;\r\n    return err;\r\n}\r\n\r\nstatic int requestEnterSimPin(const char *pPinCode) {\r\n    int retVal = -1;\r\n    int err;\r\n    ATResponse *p_response = NULL;\r\n    char *cmd = NULL;\r\n\r\n    asprintf(&cmd, \"AT+CPIN=%s\", pPinCode);\r\n    err = at_send_command(cmd, NULL);\r\n    safe_free(cmd);\r\n\r\n    if (!at_response_error(err, p_response)) {\r\n        retVal = 0;\r\n    }\r\n\r\n    safe_at_response_free(p_response);\r\n    return retVal;\r\n}\r\n\r\nstatic int requestSetProfile(PROFILE_T *profile) {\r\n    int err;\r\n    ATResponse *p_response = NULL;\r\n    char *cmd = NULL;\r\n    const char *new_apn = profile->apn ? profile->apn : \"\";\r\n    const char *new_user = profile->user ? profile->user : \"\";\r\n    const char *new_pd = profile->pd ? profile->pd : \"\";\r\n    const char *ipStr[] = {\"NULL\", \"IPV4\", \"IPV6\", \"IPV4V6\"};\r\n\r\n    dbg_time(\"%s[%d] %s/%s/%s/%d/%s\", __func__,\r\n        profile->pdp, profile->apn, profile->user, profile->pd,\r\n        profile->auth,ipStr[profile->iptype]);\r\n\r\n    if ( !strcmp(profile->old_apn, new_apn) && !strcmp(profile->old_user, new_user)\r\n        && !strcmp(profile->old_pd, new_pd)\r\n        && profile->old_iptype == profile->iptype\r\n        && profile->old_auth == profile->auth)\r\n    {\r\n        dbg_time(\"no need to set skip the rest\");\r\n        return 0;\r\n    }\r\n\r\n    asprintf(&cmd, \"AT+QICSGP=%d,%d,\\\"%s\\\",\\\"%s\\\",\\\"%s\\\",%d\",\r\n        profile->pdp, profile->iptype, new_apn, new_user, new_pd, profile->auth);\r\n    err = at_send_command(cmd, &p_response);\r\n    safe_free(cmd);\r\n    if (at_response_error(err, p_response)) {\r\n        safe_at_response_free(p_response);\r\n        asprintf(&cmd, \"AT+CGDCONT=%d,\\\"%s\\\",\\\"%s\\\"\", profile->pdp, ipStr[profile->iptype], new_apn);\r\n        err = at_send_command(cmd, &p_response);\r\n        safe_free(cmd);\r\n    }\r\n\r\n    safe_at_response_free(p_response);\r\n    return 1;\r\n}\r\n\r\nstatic int requestGetProfile(PROFILE_T *profile) {\r\n    int retVal = -1;\r\n    int err;\r\n    ATResponse *p_response = NULL;\r\n    char *cmd = NULL;\r\n    int pdp;\r\n    int old_iptype = 1; // 1 ~ IPV4, 2 ~ IPV6, 3 ~ IPV4V6\r\n    char *old_apn = \"\", *old_user = \"\", *old_pd = \"\";\r\n    int old_auth = 0;\r\n    const char *ipStr[] = {\"NULL\", \"IPV4\", \"IPV6\", \"IPV4V6\"};\r\n\r\n    if (profile->enable_ipv4 && profile->enable_ipv6)\r\n        profile->iptype = 3;\r\n    else if (profile->enable_ipv6)\r\n        profile->iptype = 2;\r\n    else\r\n        profile->iptype = 1;\r\n\r\n_re_check:\r\n    asprintf(&cmd, \"AT+QICSGP=%d\", profile->pdp);\r\n    err = at_send_command_singleline(cmd, \"+QICSGP:\", &p_response);\r\n    safe_free(cmd);\r\n    if (err == AT_ERROR_INVALID_RESPONSE && p_response == NULL) {\r\n        //bug of RG801H\r\n        safe_at_response_free(p_response);\r\n        asprintf(&cmd, \"AT+QICSGP=%d,%d,\\\"\\\",\\\"\\\",\\\"\\\",0\", profile->pdp, profile->iptype);\r\n        err = at_send_command(cmd, &p_response);\r\n        safe_free(cmd);\r\n        if (!at_response_error(err, p_response)) {\r\n            safe_at_response_free(p_response);\r\n            goto _re_check;\r\n        }\r\n    }\r\n\r\n    if (!at_response_error(err, p_response)) {\r\n        err = at_tok_scanf(p_response->p_intermediates->line,\r\n            \"%d%s%s%s%d\", &old_iptype, &old_apn,  &old_user, &old_pd, &old_auth);\r\n\r\n        if (err != 4 || pdp != profile->pdp)\r\n            goto _error;\r\n    }\r\n    else {\r\n        ATLine *atLine = NULL;\r\n        char *cgdcont_iptype = NULL;\r\n\r\n        safe_at_response_free(p_response);\r\n        err = at_send_command_multiline(\"AT+CGDCONT?\", \"+CGDCONT:\", &p_response);\r\n        if (at_response_error(err, p_response))\r\n            goto _error;\r\n\r\n        atLine = p_response->p_intermediates;\r\n        while (atLine) {\r\n            err = at_tok_scanf(atLine->line, \"%d%s%s\", &pdp, &cgdcont_iptype, &old_apn);\r\n            if (err == 3 && pdp == profile->pdp) {\r\n                if (!strcasecmp(cgdcont_iptype, ipStr[3]))\r\n                    old_iptype = 3;\r\n                else if (!strcasecmp(cgdcont_iptype, ipStr[2]))\r\n                     old_iptype = 2;\r\n                else\r\n                    old_iptype = 1;\r\n               break;\r\n            }\r\n            old_apn = NULL;\r\n            atLine = atLine->p_next;\r\n        }\r\n    }\r\n\r\n    retVal = 0;\r\n\r\n_error:\r\n    if (!old_apn) old_apn = \"\";\r\n    if (!old_user) old_user = \"\";\r\n    if (!old_pd) old_pd = \"\";\r\n\r\n    strncpy(profile->old_apn, old_apn, sizeof(profile->old_apn));\r\n    strncpy(profile->old_user, old_user, sizeof(profile->old_user));\r\n    strncpy(profile->old_pd, old_pd, sizeof(profile->old_pd));\r\n    profile->old_auth = old_auth;\r\n    profile->old_iptype = old_iptype; \r\n\r\n    dbg_time(\"%s[%d] %s/%s/%s/%d/%s\", __func__,\r\n        profile->pdp, profile->old_apn, profile->old_user, profile->old_pd,\r\n        profile->old_auth, ipStr[profile->old_iptype]);\r\n\r\n    safe_at_response_free(p_response);\r\n\r\n    return retVal;\r\n}\r\n\r\nstatic int requestRegistrationState(UCHAR *pPSAttachedState) {\r\n    int retVal = -1;\r\n    int err;\r\n    ATResponse *p_response = NULL;\r\n    ATLine *p_cur;\r\n    int i;\r\n    int cops_act = -1;\r\n    int state = 0, lac = 0, cid = 0, act = 0;\r\n    int commas;\r\n    char *line;\r\n\r\n    *pPSAttachedState = 0;\r\n\r\n    err = at_send_command_multiline(\r\n              \"AT+COPS=3,0;+COPS?;+COPS=3,1;+COPS?;+COPS=3,2;+COPS?\",\r\n              \"+COPS:\", &p_response);\r\n    if (at_response_error(err, p_response))\r\n        goto error;\r\n\r\n/*\r\nAT< +COPS: 0,0,\"CHINA MOBILE\",13\r\nAT< +COPS: 0,1,\"CMCC\",13\r\nAT< +COPS: 0,2,\"46000\",13\r\nAT< OK\r\n*/\r\n    retVal = 0;\r\n    for (i = 0, p_cur = p_response->p_intermediates; p_cur != NULL; p_cur = p_cur->p_next, i++) {\r\n        err = at_tok_scanf(p_cur->line, \"%d%d%s%d\", NULL, NULL, NULL, &cops_act);\r\n        if (err != 4) goto error;\r\n\r\n        break;\r\n    }\r\n\r\n    safe_at_response_free(p_response);\r\n    switch (cops_act) {\r\n        case 2: //UTRAN\r\n        case 3: //GSM W/EGPRS\r\n        case 4: //UTRAN W/HSDPA\r\n        case 5: //UTRAN W/HSUPA\r\n        case 6: //UTRAN W/HSDPA and HSUPA\r\n            //AT+CGREG  GPRS Network Registration Status\r\n            err = at_send_command_singleline(\"AT+CGREG?\", \"+CGREG:\", &p_response);\r\n        break;\r\n\r\n        case 7: //E-UTRAN\r\n        case 13: //E-UTRAN-NR dual connectivity\r\n            //AT+CEREG  EPS Network Registration Status\r\n            err = at_send_command_singleline(\"AT+CEREG?\", \"+CEREG:\", &p_response);\r\n        break;\r\n\r\n        case 10: //E-UTRAN connected to a 5GCN\r\n        case 11: //NR connected to a 5GCN\r\n        case 12: //NG-RAN\r\n            //AT+C5GREG  5GS Network Registration Status\r\n            err = at_send_command_singleline(\"AT+C5GREG?\", \"+C5GREG:\", &p_response);\r\n        break;\r\n\r\n        default:\r\n            goto error;\r\n        break;\r\n    }\r\n\r\n    if (at_response_error(err, p_response))\r\n        goto error;\r\n    if (!p_response->p_intermediates || !p_response->p_intermediates->line) goto error;\r\n\r\n    line = p_response->p_intermediates->line;\r\n    commas = at_tok_count(line);\r\n     switch (commas) {\r\n        case 0: /* +CREG: <stat> */\r\n            err = at_tok_nextint(&line, &state);\r\n            if (err < 0) goto error;\r\n            break;\r\n\r\n        case 1: /* +CREG: <n>, <stat> */\r\n            err = at_tok_scanf(line, \"%d%d\", NULL, &state);\r\n            if (err != 2) goto error;\r\n            break;\r\n\r\n        case 2: /* +CREG: <stat>, <lac>, <cid> */\r\n            err = at_tok_scanf(line, \"%d%x%x\", NULL, &state, &lac, &cid);\r\n            if (err != 3) goto error;\r\n            break;\r\n\r\n        case 3: /* +CREG: <n>, <stat>, <lac>, <cid> */\r\n            err = at_tok_scanf(line, \"%d%d%x%x\", NULL, &state, &lac, &cid);\r\n            if (err != 4) goto error;\r\n            break;\r\n\r\n        case 4: //<n>, <stat>, <lac>, <cid>, <networkType> */\r\n        case 5:\r\n        case 6: \r\n        case 7:\r\n            err = at_tok_scanf(line, \"%d%d%x%x%d\", NULL, &state, &lac, &cid, &act);\r\n            if (err != 5) goto error;\r\n        break;\r\n\r\n        default:\r\n            goto error;\r\n    }\r\n\r\n    //dbg_time(\"state=%d\", state);\r\n\r\n    if (state == 1 || state == 5) { //Registered, home network  / roaming\r\n        *pPSAttachedState = 1;\r\n    }\r\n\r\nerror:\r\n    safe_at_response_free(p_response);\r\n    return retVal;\r\n}\r\n\r\nstatic int requestSetupDataCall(PROFILE_T *profile, int curIpFamily) {\r\n    int err;\r\n    ATResponse *p_response = NULL;\r\n    char *cmd = NULL;\r\n    ATLine *p_cur = NULL;\r\n    int pdp = profile->pdp;\r\n    int state = 0;\r\n\r\n    (void)curIpFamily;\r\n\r\n    if (strStartsWith(profile->BaseBandVersion, \"RG801H\") || strStartsWith(profile->BaseBandVersion, \"EC200H\")) {\r\n        //RG801H will miss USB_CDC_NOTIFY_NETWORK_CONNECTION\r\n        asprintf(&cmd, \"ifconfig %s up\", profile->usbnet_adapter);\r\n        if (system(cmd)) {};\r\n        safe_free(cmd);\r\n    }\r\n\r\n    if (asr_style_atc) {\r\n        err = at_send_command_multiline(\"AT+CGACT?\", \"+CGACT:\", &p_response);\r\n        if (at_response_error(err, p_response))\r\n            goto _error;\r\n\r\n        for (p_cur = p_response->p_intermediates; p_cur != NULL; p_cur = p_cur->p_next) {\r\n            int cid = 0;\r\n\t\t\tstate = 0;\r\n\t\t\t\r\n            err = at_tok_scanf(p_cur->line, \"%d%d\", &cid, &state);\r\n            if (cid == pdp)\r\n                break;\r\n\t\t\telse if(state)\r\n\t\t\t\tstate = 0;\r\n        }\r\n        safe_at_response_free(p_response);\r\n\r\n        if (state == 0) {\r\n            asprintf(&cmd, \"AT+CGACT=1,%d\", pdp);\r\n            err = at_send_command(cmd, &p_response);\r\n            safe_free(cmd);\r\n            if (at_response_error(err, p_response))\r\n                goto _error;\r\n        }\r\n    }\r\n\r\n    if(asr_style_atc)\r\n        asprintf(&cmd, \"AT+QNETDEVCTL=1,%d,%d\", pdp, 1);\r\n    else\r\n        asprintf(&cmd, \"AT+QNETDEVCTL=%d,1,%d\", pdp, 1);\r\n    err = at_send_command(cmd, &p_response);\r\n    safe_free(cmd);\r\n\r\n    if (at_response_error(err, p_response))\r\n        goto _error;\r\n\r\n    if (!asr_style_atc) { //TODO some modems do not sync return setup call resule\r\n        int t = 0;\r\n\r\n        while (t++ < 15) {\r\n            asprintf(&cmd, \"AT+QNETDEVSTATUS=%d\", pdp);\r\n            err = at_send_command_singleline(cmd, \"+QNETDEVSTATUS\", &p_response);\r\n            safe_free(cmd);\r\n            if (err) goto _error;\r\n\r\n            if (!at_response_error(err, p_response)) {\r\n                break;\r\n            }\r\n            safe_at_response_free(p_response);\r\n            sleep(1);\r\n        }\r\n    }\r\n\r\n    //some modem do not report URC\r\n    qmidevice_send_event_to_main(RIL_UNSOL_DATA_CALL_LIST_CHANGED);\r\n\r\n_error:\r\n    safe_at_response_free(p_response);\r\n    //dbg_time(\"%s err=%d\", __func__, err);\r\n    return err;\r\n}\r\n\r\nstatic int at_netdevstatus(int pdp, unsigned int *pV4Addr) {\r\n    int err;\r\n    ATResponse *p_response = NULL;\r\n    char *cmd = NULL;\r\n    char *ipv4_address = NULL;\r\n    char *ipv4_gate = NULL;\r\n    char *ipv4_DHCP = NULL;\r\n    char *ipv4_pDNS = NULL;\r\n    char *ipv4_sDNS = NULL;\r\n    char *ipv6_address = NULL;\r\n    char *ipv6_gate = NULL;\r\n    char *ipv6_DHCP = NULL;\r\n    char *ipv6_pDNS = NULL;\r\n    char *ipv6_sDNS = NULL;\r\n\r\n    *pV4Addr = 0;\r\n\r\n    asprintf(&cmd, \"AT+QNETDEVSTATUS=%d\", pdp);\r\n    err = at_send_command_singleline(cmd, \"+QNETDEVSTATUS\", &p_response);\r\n    safe_free(cmd);\r\n    if (at_response_error(err, p_response)) goto _error;\r\n    if (!p_response->p_intermediates || !p_response->p_intermediates->line) goto _error;\r\n\r\n    err = at_tok_scanf(p_response->p_intermediates->line, \"%s%s%s%s%s%s%s%s%s%s\",\r\n        &ipv4_address, &ipv4_gate, &ipv4_DHCP, &ipv4_pDNS, &ipv4_sDNS,\r\n        &ipv6_address, &ipv6_gate, &ipv6_DHCP, &ipv6_pDNS, &ipv6_sDNS);\r\n    if (err > 0) {\r\n#if 0\r\n        dbg_time(\"%s,%s,%s,%s,%s,%s,%s,%s,%s,%s\",\r\n            ipv4_address, ipv4_gate, ipv4_DHCP, ipv4_pDNS, ipv4_sDNS,\r\n            ipv6_address, ipv6_gate, ipv6_DHCP, ipv6_pDNS, ipv6_sDNS);\r\n#endif\r\n\r\n        if (ipv4_address && ipv4_address[0]) {\r\n            int addr[4] = {0, 0, 0, 0};\r\n\r\n            if (strstr(ipv4_address, \".\")) {\r\n                sscanf(ipv4_address, \"%d.%d.%d.%d\", &addr[0], &addr[1], &addr[2], &addr[3]);\r\n            }\r\n            else {\r\n                sscanf(ipv4_address, \"%02X%02X%02X%02X\", &addr[3], &addr[2], &addr[1], &addr[0]);\r\n            }\r\n            *pV4Addr = (addr[0]) | (addr[1]<<8) | (addr[2]<<16) | (addr[3]<<24);\r\n       }\r\n    }\r\n\r\n_error:\r\n    safe_at_response_free(p_response);\r\n    return 0;\r\n}\r\n\r\nstatic int requestQueryDataCall(UCHAR  *pConnectionStatus, int curIpFamily) {\r\n    int err;\r\n    ATResponse *p_response = NULL;\r\n    ATLine *p_cur = NULL;\r\n    int state = 0;\r\n    int bind = 0;\r\n    int cid;\r\n    int pdp = s_pdp;\r\n    unsigned int v4Addr = 0;\r\n\r\n    (void)curIpFamily;\r\n\r\n    *pConnectionStatus = QWDS_PKT_DATA_DISCONNECTED;\r\n\r\n    if (!asr_style_atc) {\r\n        err = at_netdevstatus(pdp, &v4Addr);\r\n        if (!err && v4Addr) {\r\n            *pConnectionStatus = QWDS_PKT_DATA_CONNECTED;\r\n            //if (profile->ipv4.Address == v4Addr) {} //TODO\r\n        }\r\n        return err;\r\n    }\r\n\r\n    err = at_send_command_multiline(\"AT+QNETDEVCTL?\", \"+QNETDEVCTL:\", &p_response);\r\n    if (at_response_error(err, p_response))\r\n        goto _error;\r\n\r\n    for (p_cur = p_response->p_intermediates; p_cur != NULL; p_cur = p_cur->p_next)\r\n    {\r\n        //+QNETDECTL:<op>,<cid>,<urc_en>,<state>\r\n        err = at_tok_scanf(p_cur->line, \"%d%d%d%d\", &bind, &cid, NULL, &state);\r\n        if (err != 4 || cid != pdp)\r\n            continue;\r\n        if (bind != 1)\r\n            bind = 0;\r\n    }\r\n    safe_at_response_free(p_response);\r\n\r\n    if (bind == 0 || state == 0)\r\n        goto _error;\r\n\r\n    err = at_send_command_multiline(\"AT+CGACT?\", \"+CGACT:\", &p_response);\r\n    if (at_response_error(err, p_response))\r\n        goto _error;\r\n\r\n    for (p_cur = p_response->p_intermediates; p_cur != NULL; p_cur = p_cur->p_next)\r\n    {\r\n\t\tstate = 0;\r\n        err = at_tok_scanf(p_cur->line, \"%d%d\", &cid, &state);\r\n        if (cid == pdp)\r\n            break;\r\n\t\telse if(state)\r\n\t\t\tstate = 0;\r\n    }\r\n    safe_at_response_free(p_response);\r\n\r\n    if (bind && state)\r\n        *pConnectionStatus = QWDS_PKT_DATA_CONNECTED;\r\n\r\n_error:\r\n    safe_at_response_free(p_response);\r\n    //dbg_time(\"%s err=%d, call_state=%d\", __func__, err, *pConnectionStatus);\r\n    return 0;\r\n}\r\n\r\nstatic int requestDeactivateDefaultPDP(PROFILE_T *profile, int curIpFamily) {\r\n    char *cmd = NULL;\r\n    int pdp = profile->pdp;\r\n\r\n    (void)curIpFamily;\r\n\r\n    if (asr_style_atc)\r\n        asprintf(&cmd, \"AT+QNETDEVCTL=0,%d,%d\", pdp, 0);\r\n    else\r\n        asprintf(&cmd, \"AT+QNETDEVCTL=%d,0,%d\", pdp, 0);\r\n    at_send_command(cmd, NULL);\r\n    safe_free(cmd);\r\n\r\n    //dbg_time(\"%s err=%d\", __func__, err);\r\n    return 0;\r\n}\r\n\r\nstatic int requestGetIPAddress(PROFILE_T *profile, int curIpFamily) {\r\n    int err;\r\n    ATResponse *p_response = NULL;\r\n    char *cmd = NULL;\r\n    ATLine *p_cur = NULL;\r\n    int pdp = profile->pdp;\r\n    unsigned int v4Addr = 0;\r\n    unsigned char *v4 = (unsigned char *)&v4Addr;\r\n\r\n    (void)curIpFamily;\r\n\r\n    if (!asr_style_atc) {\r\n        err = at_netdevstatus(pdp, &v4Addr);\r\n        goto _error;\r\n    }\r\n\r\n    asprintf(&cmd, \"AT+CGPADDR=%d\", profile->pdp);\r\n    err = at_send_command_singleline(cmd, \"+CGPADDR:\", &p_response);\r\n    safe_free(cmd);\r\n    if (at_response_error(err, p_response))\r\n        goto _error;\r\n\r\n    //+CGPADDR: 1,\"10.201.80.91\",\"2409:8930:4B3:41C7:F9B8:3D9B:A2F7:CA96\"\r\n    for (p_cur = p_response->p_intermediates; p_cur != NULL; p_cur = p_cur->p_next)\r\n    {\r\n        char *ipv4 = NULL;\r\n        char *ipv6 = NULL;\r\n\r\n        err = at_tok_scanf(p_cur->line, \"%d%s%s\", &pdp, &ipv4, &ipv6);\r\n        if (err < 2 || pdp != profile->pdp)\r\n            continue;\r\n\r\n        if (ipv4) {\r\n            int addr[4] = {0, 0, 0, 0};\r\n\r\n            sscanf(ipv4, \"%d.%d.%d.%d\", &addr[0], &addr[1], &addr[2], &addr[3]);\r\n            v4[0] = addr[0];\r\n            v4[1] = addr[1];\r\n            v4[2] = addr[2];\r\n            v4[3] = addr[3];\r\n            break;\r\n        }\r\n    }\r\n\r\n_error:\r\n    if (v4Addr && profile->ipv4.Address != v4Addr) {\r\n        profile->ipv4.Address = v4Addr;\r\n        dbg_time(\"%s %d.%d.%d.%d\", __func__, v4[0], v4[1], v4[2], v4[3]);    \r\n    }\r\n        \r\n    //dbg_time(\"%s err=%d\", __func__, err);\r\n    return v4Addr ? 0 : -1;\r\n}\r\n\r\nstatic int requestGetSignalInfo(void) {\r\n    int retVal = -1;\r\n    int err;\r\n    ATResponse *p_response = NULL;\r\n    int i;\r\n    ATLine *p_cur = NULL;\r\n    char *rat = NULL;\r\n    int cops_act = 0;\r\n    int is_nr5g_nsa = 0, nr5g_sa = 0;\r\n    int verbose = 0;\r\n\r\n    err = at_send_command_singleline(\"at+cops?\", \"+COPS:\", &p_response);\r\n    if (at_response_error(err, p_response)) goto _error;\r\n    if (!p_response->p_intermediates || !p_response->p_intermediates->line) goto _error;\r\n\r\n    retVal = 0;\r\n    err = at_tok_scanf(p_response->p_intermediates->line, \"%d%d%s%d\", NULL, NULL, NULL, &cops_act);\r\n    if (err != 4) goto _error;\r\n\r\n    nr5g_sa = (cops_act == 11);\r\n\r\n    safe_at_response_free(p_response);\r\n    err = at_send_command_multiline(\"at+qeng=\\\"servingcell\\\"\", \"+QENG:\", &p_response);\r\n    if (at_response_error(err, p_response))\r\n        goto _error;\r\n\r\n    for (i = 0, p_cur = p_response->p_intermediates; p_cur != NULL; p_cur = p_cur->p_next, i++) {\r\n        char *type, *state;\r\n\r\n        err = at_tok_scanf(p_cur->line, \"%s%s\", &type, &state);\r\n        if (err != 2 || strcmp(type, \"servingcell\"))\r\n            continue;\r\n\r\n        if (!strcmp(state, \"SEARCH\") || !strcmp(state, \"LIMSRV\"))\r\n            continue;\r\n\r\n        if (!strcmp(state, \"NOCONN\") || !strcmp(state, \"CONNECT\")) {\r\n            err = at_tok_scanf(p_cur->line, \"%s%s%s\", &type, &state, &rat);\r\n            if (err != 3)\r\n                continue;        \r\n        }\r\n        else {\r\n            rat = state;\r\n        }\r\n       \r\n        if (!strcmp(rat, \"NR5G-SA\"))\r\n        {\r\n            //+QENG: \"servingcell\",<state>,\"NR5G-SA\",<duplex_mode>,<MCC>,<MNC>,<cellID>,<PCID>,<TAC>,<ARFCN>,<band>,<NR_DL_bandwidth>,<RSRP>,<RSRQ>,<SINR>,<tx_power>,<srxlev> \r\n            //+QENG: \"servingcell\",\"NOCONN\",\"NR5G-SA\",\"TDD\", 454,12,0,21,4ED,636576,78,3,-85,-11,32,0,5184\r\n            struct qeng_servingcell_nr5g_sa {\r\n                char *cell_type, *state, *rat, *is_tdd;\r\n                int MCC, MNC, cellID/*hex*/;\r\n                int PCID, TAC/*hex*/, ARFCN;\r\n                int band, NR_DL_bandwidth;\r\n                int RSRP, RSRQ, RSSI, SINR;\r\n            };\r\n            struct qeng_servingcell_nr5g_sa nr5g_sa;\r\n\r\n            memset(&nr5g_sa, 0, sizeof(nr5g_sa));\r\n            err = at_tok_scanf(p_cur->line, \"%s,%s,%s,%s,%d,%d,%x,%d,%x,%d,%d,%d,%d,%d,%d,%d\",\r\n                &nr5g_sa.cell_type, &nr5g_sa.state, &nr5g_sa.rat, &nr5g_sa.is_tdd,\r\n                &nr5g_sa.MCC, &nr5g_sa.MNC, &nr5g_sa.cellID, &nr5g_sa.PCID, &nr5g_sa.TAC,\r\n                &nr5g_sa.ARFCN, &nr5g_sa.band, &nr5g_sa.NR_DL_bandwidth,\r\n                &nr5g_sa.RSRP, &nr5g_sa.RSRQ, &nr5g_sa.RSSI, &nr5g_sa.SINR);\r\n\r\n            if (err >= 13 && verbose) {\r\n                dbg_time(\"%s,%s,%s,%s,%d,%d,%x,%d,%x,%d,%d,%d,%d,%d,%d,%d\",\r\n                    nr5g_sa.cell_type, nr5g_sa.state, nr5g_sa.rat, nr5g_sa.is_tdd,\r\n                    nr5g_sa.MCC, nr5g_sa.MNC, nr5g_sa.cellID, nr5g_sa.PCID, nr5g_sa.TAC,\r\n                    nr5g_sa.ARFCN, nr5g_sa.band, nr5g_sa.NR_DL_bandwidth,\r\n                    nr5g_sa.RSRP, nr5g_sa.RSRQ, nr5g_sa.RSSI, nr5g_sa.SINR);\r\n            }\r\n        }\r\n        else if (!strcmp(rat, \"NR5G-NSA\"))\r\n        {\r\n            //+QENG: \"NR5G-NSA\",<MCC>,<MNC>,<PCID>,<RSRP>,< SINR>,<RSRQ>,<ARFCN>,<band>\r\n            struct qeng_servingcell_nr5g_nsa {\r\n                char *mcc, *mnc;\r\n                int pcid, rsrp, sinr, rsrq;\r\n            };\r\n            struct qeng_servingcell_nr5g_nsa nr5g_nsa;\r\n           \r\n            memset(&nr5g_nsa, 0, sizeof(nr5g_nsa));\r\n            err = at_tok_scanf(p_cur->line, \"%s%s%s%s%d%d%d%dd\",\r\n                NULL, NULL, &nr5g_nsa.mcc, &nr5g_nsa.mnc, &nr5g_nsa.pcid, &nr5g_nsa.rsrp, &nr5g_nsa.sinr, &nr5g_nsa.rsrq);\r\n            if (err == 8 && verbose)\r\n            {\r\n                dbg_time(\"mcc=%s, mnc=%s, pcid=%d, rsrp=%d, sinr=%d, rsrq=%d\",\r\n                    nr5g_nsa.mcc, nr5g_nsa.mnc, nr5g_nsa.pcid, nr5g_nsa.rsrp, nr5g_nsa.sinr, nr5g_nsa.rsrq);\r\n            }\r\n\r\n            is_nr5g_nsa = 1;\r\n        }\r\n        else if (!strcmp(rat, \"LTE\"))\r\n        {\r\n            //+QENG: \"LTE\",<is_tdd>,<MCC>,<MNC>,<cellID>,<PCID>,<earfcn>,<freq_band_ind>,<UL_bandwidth>,<DL_bandwidth>,<TAC>,<RSRP>,<RSRQ>,<RSSI>,<SINR>,<CQI>,<tx_power>,<srxlev>\r\n            struct qeng_servingcell_lte {\r\n                char *is_tdd, *mcc, *mnc;\r\n                int cellID/*hex*/, pcid, earfcn, freq_band_ind, ul_bandwidth, dl_bandwidth;\r\n                int tac/*hex*/, rsrp, rsrq, rssi, sinr, cqi,tx_power,srxlev;\r\n            };\r\n            struct qeng_servingcell_lte lte;\r\n\r\n            memset(&lte, 0, sizeof(lte));\r\n            if (!strcmp(rat, state))\r\n                err = at_tok_scanf(p_cur->line, \"%s%s%s%s%s%x%d%d%d%d%d%x%d%d%d%d%d%d%d\",\r\n                    NULL, NULL, &lte.is_tdd, &lte.mcc, &lte.mnc,\r\n                    &lte.cellID, &lte.pcid, &lte.earfcn, &lte.freq_band_ind, &lte.ul_bandwidth, &lte.dl_bandwidth,\r\n                    &lte.tac, &lte.rsrp, &lte.rsrq, &lte.rssi, &lte.sinr, &lte.cqi, &lte.tx_power, &lte.srxlev);\r\n            else\r\n                 err = at_tok_scanf(p_cur->line, \"%s%s%s%s%s%s%x%d%d%d%d%d%x%d%d%d%d%d%d%d\",\r\n                    NULL, NULL, NULL, &lte.is_tdd, &lte.mcc, &lte.mnc,\r\n                    &lte.cellID, &lte.pcid, &lte.earfcn, &lte.freq_band_ind, &lte.ul_bandwidth, &lte.dl_bandwidth,\r\n                    &lte.tac, &lte.rsrp, &lte.rsrq, &lte.rssi, &lte.sinr, &lte.cqi, &lte.tx_power, &lte.srxlev);\r\n            \r\n                if (err >= 18 && verbose)\r\n                {\r\n                    dbg_time(\"is_tdd=%s, mcc=%s, mnc=%s\", lte.is_tdd, lte.mcc, lte.mnc);\r\n                    dbg_time(\"cellID=%x, pcid=%d, earfcn=%d\", lte.cellID, lte.pcid, lte.earfcn);\r\n                    dbg_time(\"freq_band_ind=%d, ul_bandwidth=%d, dl_bandwidth=%d\", lte.freq_band_ind, lte.ul_bandwidth, lte.dl_bandwidth);\r\n                    dbg_time(\"tac=%x, rsrp=%d, rsrq=%d, rssi=%d, sinr=%d\", lte.tac, lte.rsrp, lte.rsrq, lte.rssi, lte.sinr);\r\n                    dbg_time(\"cqi=%d, tx_power=%d, earfcn=%d\", lte.cqi, lte.tx_power, lte.srxlev);\r\n                }\r\n        }\r\n    }\r\n\r\n    if (is_nr5g_nsa) {\r\n        int endc_avl, plmn_info_list_r15_avl, endc_rstr, nr5g_basic;\r\n\r\n        is_nr5g_nsa = 0;\r\n        safe_at_response_free(p_response);\r\n        err = at_send_command_multiline(\"at+qendc\", \"+QENDC:\", &p_response);\r\n        if (at_response_error(err, p_response)) goto _error;\r\n        if (!p_response->p_intermediates || !p_response->p_intermediates->line) goto _error;\r\n\r\n        err = at_tok_scanf(p_response->p_intermediates->line, \"%d%d%d%d\",\r\n            &endc_avl, &plmn_info_list_r15_avl, &endc_rstr, &nr5g_basic);\r\n        if (err == 4 && nr5g_basic) {\r\n            is_nr5g_nsa = 1;\r\n        }\r\n    }\r\n\r\n    if (verbose)\r\n        dbg_time(\"cops_act=%d, nr5g_nsa=%d, nr5g_sa=%d\", cops_act, is_nr5g_nsa, nr5g_sa);\r\n\r\n_error:\r\n    safe_at_response_free(p_response);\r\n    return retVal;\r\n}\r\n\r\nstatic int requestGetICCID(void) {\r\n    int retVal = -1;\r\n    int err;\r\n    ATResponse *p_response = NULL;\r\n    char *iccid;\r\n\r\n    err = at_send_command_singleline(\"AT+QCCID\", \"+QCCID:\", &p_response);\r\n    if (at_response_error(err, p_response)) goto _error;\r\n    if (!p_response->p_intermediates || !p_response->p_intermediates->line) goto _error;\r\n\r\n    err = at_tok_scanf(p_response->p_intermediates->line, \"%s\", &iccid);\r\n    if (err != 1) goto _error;\r\n\r\n    if (iccid && iccid[0]) {\r\n        dbg_time(\"%s %s\", __func__, iccid);\r\n        retVal = 0;\r\n    }\r\n\r\n_error:\r\n    safe_at_response_free(p_response);\r\n    return retVal;\r\n}\r\n\r\nstatic int requestGetIMSI(void) {\r\n    int retVal = -1;\r\n    int err;\r\n    ATResponse *p_response = NULL;\r\n    char *imsi;\r\n\r\n    err = at_send_command_numeric(\"AT+CIMI\", &p_response);\r\n    if (at_response_error(err, p_response)) goto _error;\r\n    if (!p_response->p_intermediates || !p_response->p_intermediates->line) goto _error;\r\n\r\n    imsi = p_response->p_intermediates->line;\r\n    if (imsi) {\r\n        dbg_time(\"%s %s\", __func__, imsi);\r\n        retVal = 0;\r\n    }\r\n\r\n_error:\r\n    safe_at_response_free(p_response);\r\n    return retVal;\r\n}\r\n\r\nconst struct request_ops atc_request_ops = {\r\n    .requestBaseBandVersion = requestBaseBandVersion,\r\n    .requestGetSIMStatus = requestGetSIMStatus,\r\n    .requestEnterSimPin = requestEnterSimPin,\r\n    .requestSetProfile = requestSetProfile,\r\n    .requestGetProfile = requestGetProfile,\r\n    .requestRegistrationState = requestRegistrationState,\r\n    .requestSetupDataCall = requestSetupDataCall,\r\n    .requestQueryDataCall = requestQueryDataCall,\r\n    .requestDeactivateDefaultPDP = requestDeactivateDefaultPDP,\r\n    .requestGetIPAddress = requestGetIPAddress,\r\n    .requestGetSignalInfo = requestGetSignalInfo,\r\n    .requestGetICCID = requestGetICCID,\r\n    .requestGetIMSI = requestGetIMSI,\r\n};\r\n\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/atchannel.c",
    "content": "/* //device/system/reference-ril/atchannel.c\n**\n** Copyright 2006, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\");\n** you may not use this file except in compliance with the License.\n** You may obtain a copy of the License at\n**\n**     http://www.apache.org/licenses/LICENSE-2.0\n**\n** Unless required by applicable law or agreed to in writing, software\n** distributed under the License is distributed on an \"AS IS\" BASIS,\n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n** See the License for the specific language governing permissions and\n** limitations under the License.\n*/\n\n#include \"atchannel.h\"\n#include \"at_tok.h\"\n\n#include <stdio.h>\n#include <string.h>\n#include <pthread.h>\n#include <ctype.h>\n#include <stdlib.h>\n#include <errno.h>\n#include <fcntl.h>\n#include <sys/time.h>\n#include <time.h>\n#include <unistd.h>\n#include <sys/timeb.h>\n#include <stdarg.h>\n\n#include \"QMIThread.h\"\n#define LOGE dbg_time\n#define LOGD dbg_time\n\n#define NUM_ELEMS(x) (sizeof(x)/sizeof(x[0]))\n\n#define MAX_AT_RESPONSE sizeof(cm_recv_buf)\n#define HANDSHAKE_RETRY_COUNT 8\n#define HANDSHAKE_TIMEOUT_MSEC 1000\n\nstatic pthread_t s_tid_reader;\nstatic int s_fd = -1;    /* fd of the AT channel */\nstatic ATUnsolHandler s_unsolHandler;\nstatic int s_atc_proxy = 0;    /* fd of the AT channel */\n\n/* for input buffering */\n\nstatic char *s_ATBuffer = (char *)cm_recv_buf;\nstatic char *s_ATBufferCur = (char *)cm_recv_buf;\n\nstatic int s_readCount = 0;\n\n#if AT_DEBUG\nvoid  AT_DUMP(const char*  prefix, const char*  buff, int  len)\n{\n    if (len < 0)\n        len = strlen(buff);\n    LOGD(\"%.*s\", len, buff);\n}\n#endif\n\n/*\n * for current pending command\n * these are protected by s_commandmutex\n */\nstatic ATCommandType s_type;\nstatic const char *s_responsePrefix = NULL;\nstatic const char *s_smsPDU = NULL;\nstatic const char *s_raw_data = NULL;\nstatic size_t s_raw_len;\nstatic ATResponse *sp_response = NULL;\n\nstatic void (*s_onTimeout)(void) = NULL;\nstatic void (*s_onReaderClosed)(void) = NULL;\nstatic int s_readerClosed;\n\nstatic void onReaderClosed();\nstatic int writeCtrlZ (const char *s);\nstatic int writeline (const char *s);\nstatic int writeraw (const char *s, size_t len);\n\nstatic void sleepMsec(long long msec)\n{\n    struct timespec ts;\n    int err;\n\n    ts.tv_sec = (msec / 1000);\n    ts.tv_nsec = (msec % 1000) * 1000 * 1000;\n\n    do {\n        err = nanosleep (&ts, &ts);\n    } while (err < 0 && errno == EINTR);\n}\n\n/** returns 1 if line starts with prefix, 0 if it does not */\nint strStartsWith(const char *line, const char *prefix)\n{\n    for ( ; *line != '\\0' && *prefix != '\\0' ; line++, prefix++) {\n        if (*line != *prefix) {\n            return 0;\n        }\n    }\n\n    return *prefix == '\\0';\n}\n\n/** add an intermediate response to sp_response*/\nstatic void addIntermediate(const char *line)\n{\n    ATLine *p_new;\n\n    p_new = (ATLine  *) malloc(sizeof(ATLine));\n\n    p_new->line = strdup(line);\n\n    /* note: this adds to the head of the list, so the list\n       will be in reverse order of lines received. the order is flipped\n       again before passing on to the command issuer */\n    p_new->p_next = sp_response->p_intermediates;\n    sp_response->p_intermediates = p_new;\n}\n\n\n/**\n * returns 1 if line is a final response indicating error\n * See 27.007 annex B\n * WARNING: NO CARRIER and others are sometimes unsolicited\n */\nstatic const char * s_finalResponsesError[] = {\n    \"ERROR\",\n    \"+CMS ERROR:\",\n    \"+CME ERROR:\",\n    \"NO CARRIER\", /* sometimes! */\n    \"NO ANSWER\",\n    \"NO DIALTONE\",\n    \"COMMAND NOT SUPPORT\",\n};\nstatic int isFinalResponseError(const char *line)\n{\n    size_t i;\n\n    for (i = 0 ; i < NUM_ELEMS(s_finalResponsesError) ; i++) {\n        if (strStartsWith(line, s_finalResponsesError[i])) {\n            return 1;\n        }\n    }\n\n    return 0;\n}\n\n/**\n * returns 1 if line is a final response indicating success\n * See 27.007 annex B\n * WARNING: NO CARRIER and others are sometimes unsolicited\n */\nstatic const char * s_finalResponsesSuccess[] = {\n    \"OK\",\n    \"+QIND: \\\"FOTA\\\",\\\"END\\\",0\",\n    \"CONNECT\"       /* some stacks start up data on another channel */\n};\n\nstatic int isFinalResponseSuccess(const char *line)\n{\n    size_t i;\n\n    for (i = 0 ; i < NUM_ELEMS(s_finalResponsesSuccess) ; i++) {\n        if (strStartsWith(line, s_finalResponsesSuccess[i])) {\n            return 1;\n        }\n    }\n\n    return 0;\n}\n\n#if 0\n/**\n * returns 1 if line is a final response, either  error or success\n * See 27.007 annex B\n * WARNING: NO CARRIER and others are sometimes unsolicited\n */\nstatic int isFinalResponse(const char *line)\n{\n    return isFinalResponseSuccess(line) || isFinalResponseError(line);\n}\n#endif\n\n/**\n * returns 1 if line is the first line in (what will be) a two-line\n * SMS unsolicited response\n */\nstatic const char * s_smsUnsoliciteds[] = {\n   \"+CMT:\",\n    \"+CDS:\",\n    \"+CBM:\",\n    \"+CMTI:\"\n};\nstatic int isSMSUnsolicited(const char *line)\n{\n    size_t i;\n\n    for (i = 0 ; i < NUM_ELEMS(s_smsUnsoliciteds) ; i++) {\n        if (strStartsWith(line, s_smsUnsoliciteds[i])) {\n            return 1;\n        }\n    }\n\n    return 0;\n}\n\n\n/** assumes s_commandmutex is held */\nstatic void handleFinalResponse(const char *line)\n{\n    sp_response->finalResponse = strdup(line);\n\n    pthread_cond_signal(&cm_command_cond);\n}\n\nstatic void handleUnsolicited(const char *line)\n{\n    if (s_unsolHandler != NULL) {\n        s_unsolHandler(line, NULL);\n    }\n}\n\nstatic void processLine(const char *line)\n{\n    pthread_mutex_lock(&cm_command_mutex);\n\n    if (sp_response == NULL) {\n        /* no command pending */\n        handleUnsolicited(line);\n    } else if (s_raw_data != NULL && 0 == strcmp(line, \"CONNECT\")) {\n        usleep(500*1000); //for EC20\n        writeraw(s_raw_data, s_raw_len);\n        s_raw_data = NULL;\n    } else if (isFinalResponseSuccess(line)) {\n        if(s_atc_proxy)\n            handleUnsolicited(line);\n        sp_response->success = 1;\n        handleFinalResponse(line);\n    } else if (isFinalResponseError(line)) {\n        if(s_atc_proxy) \n            handleUnsolicited(line);\n        sp_response->success = 0;\n        handleFinalResponse(line);\n    } else if (s_smsPDU != NULL && 0 == strcmp(line, \"> \")) {\n        // See eg. TS 27.005 4.3\n        // Commands like AT+CMGS have a \"> \" prompt\n        writeCtrlZ(s_smsPDU);\n        s_smsPDU = NULL;\n    } else switch (s_type) {\n        case NO_RESULT:\n            handleUnsolicited(line);\n            break;\n        case NUMERIC:\n            if (sp_response->p_intermediates == NULL\n                && isdigit(line[0])\n            ) {\n                addIntermediate(line);\n            } else {\n                /* either we already have an intermediate response or\n                   the line doesn't begin with a digit */\n                handleUnsolicited(line);\n            }\n            break;\n        case SINGLELINE:\n            if (sp_response->p_intermediates == NULL\n                && strStartsWith (line, s_responsePrefix)\n            ) {\n                addIntermediate(line);\n            } else {\n                /* we already have an intermediate response */\n                handleUnsolicited(line);\n            }\n            break;\n        case MULTILINE:\n            if (strStartsWith (line, s_responsePrefix)) {\n                addIntermediate(line);\n            } else {\n                handleUnsolicited(line);\n            }\n        break;\n\n        default: /* this should never be reached */\n            LOGE(\"Unsupported AT command type %d\\n\", s_type);\n            handleUnsolicited(line);\n        break;\n    }\n\n    pthread_mutex_unlock(&cm_command_mutex);\n}\n\n\n/**\n * Returns a pointer to the end of the next line\n * special-cases the \"> \" SMS prompt\n *\n * returns NULL if there is no complete line\n */\nstatic char * findNextEOL(char *cur)\n{\n    if (cur[0] == '>' && cur[1] == ' ' && cur[2] == '\\0') {\n        /* SMS prompt character...not \\r terminated */\n        return cur+2;\n    }\n\n    // Find next newline\n    while (*cur != '\\0' && *cur != '\\r' && *cur != '\\n') cur++;\n\n    return *cur == '\\0' ? NULL : cur;\n}\n\n\n/**\n * Reads a line from the AT channel, returns NULL on timeout.\n * Assumes it has exclusive read access to the FD\n *\n * This line is valid only until the next call to readline\n *\n * This function exists because as of writing, android libc does not\n * have buffered stdio.\n */\n\nstatic const char *readline()\n{\n    ssize_t count;\n\n    char *p_read = NULL;\n    char *p_eol = NULL;\n    char *ret;\n\n    /* this is a little odd. I use *s_ATBufferCur == 0 to\n     * mean \"buffer consumed completely\". If it points to a character, than\n     * the buffer continues until a \\0\n     */\n    if (*s_ATBufferCur == '\\0') {\n        /* empty buffer */\n        s_ATBufferCur = s_ATBuffer;\n        *s_ATBufferCur = '\\0';\n        p_read = s_ATBuffer;\n    } else {   /* *s_ATBufferCur != '\\0' */\n        /* there's data in the buffer from the last read */\n\n        // skip over leading newlines\n        while (*s_ATBufferCur == '\\r' || *s_ATBufferCur == '\\n')\n            s_ATBufferCur++;\n\n        p_eol = findNextEOL(s_ATBufferCur);\n\n        if (p_eol == NULL) {\n            /* a partial line. move it up and prepare to read more */\n            size_t len;\n\n            len = strlen(s_ATBufferCur);\n\n            memmove(s_ATBuffer, s_ATBufferCur, len + 1);\n            p_read = s_ATBuffer + len;\n            s_ATBufferCur = s_ATBuffer;\n        }\n        /* Otherwise, (p_eol !- NULL) there is a complete line  */\n        /* that will be returned the while () loop below        */\n    }\n\n    while (p_eol == NULL) {\n        if (0 == MAX_AT_RESPONSE - (p_read - s_ATBuffer)) {\n            LOGE(\"ERROR: Input line exceeded buffer\\n\");\n            /* ditch buffer and start over again */\n            s_ATBufferCur = s_ATBuffer;\n            *s_ATBufferCur = '\\0';\n            p_read = s_ATBuffer;\n        }\n\n        do {\n            while (s_fd > 0) {\n                struct pollfd pollfds[1] = {{s_fd, POLLIN, 0}};\n                int ret;\n            \n                do {\n                    ret = poll(pollfds, 1, -1);\n                } while ((ret < 0) && (errno == EINTR));\n\n                if (pollfds[0].revents & (POLLERR | POLLHUP | POLLNVAL)) {\n                    break;\n                } else if   (pollfds[0].revents & (POLLIN))  {\n                    break;\n                }\n            };\n\n            count = (s_fd == -1) ? 0 : read(s_fd, p_read,\n                            MAX_AT_RESPONSE - (p_read - s_ATBuffer));\n        } while (count < 0 && errno == EINTR);\n\n        if (count > 0) {\n            AT_DUMP( \"<< \", p_read, count );\n            s_readCount += count;\n\n            p_read[count] = '\\0';\n\n            // skip over leading newlines\n            while (*s_ATBufferCur == '\\r' || *s_ATBufferCur == '\\n')\n                s_ATBufferCur++;\n\n            p_eol = findNextEOL(s_ATBufferCur);\n            p_read += count;\n        } else if (count <= 0) {\n            /* read error encountered or EOF reached */\n            if(count == 0) {\n                LOGD(\"atchannel: EOF reached\");\n            } else {\n                LOGD(\"atchannel: read error %s\", strerror(errno));\n            }\n            return NULL;\n        }\n    }\n\n    /* a full line in the buffer. Place a \\0 over the \\r and return */\n\n    ret = s_ATBufferCur;\n    *p_eol = '\\0';\n    s_ATBufferCur = p_eol + 1; /* this will always be <= p_read,    */\n                              /* and there will be a \\0 at *p_read */\n\n    LOGD(\"AT< %s\", ret);\n    return ret;\n}\n\n\nstatic void onReaderClosed()\n{\n    LOGE(\"%s\", __func__);\n    if (s_onReaderClosed != NULL && s_readerClosed == 0) {\n\n        pthread_mutex_lock(&cm_command_mutex);\n\n        s_readerClosed = 1;\n\n        pthread_cond_signal(&cm_command_cond);\n\n        pthread_mutex_unlock(&cm_command_mutex);\n\n        s_onReaderClosed();\n    }\n}\n\n\nstatic void *readerLoop(void *arg)\n{\n    (void)arg;\n\n    for (;;) {\n        const char * line;\n\n        line = readline();\n\n        if (line == NULL) {\n            break;\n        }\n\n        if(isSMSUnsolicited(line)) {\n            char *line1;\n            const char *line2;\n\n            // The scope of string returned by 'readline()' is valid only\n            // till next call to 'readline()' hence making a copy of line\n            // before calling readline again.\n            line1 = strdup(line);\n            line2 = readline();\n\n            if (line2 == NULL) {\n                break;\n            }\n\n            if (s_unsolHandler != NULL) {\n                s_unsolHandler (line1, line2);\n            }\n            free(line1);\n        } else {\n            processLine(line);\n        }\n    }\n\n    onReaderClosed();\n\n    return NULL;\n}\n\n/**\n * Sends string s to the radio with a \\r appended.\n * Returns AT_ERROR_* on error, 0 on success\n *\n * This function exists because as of writing, android libc does not\n * have buffered stdio.\n */\nstatic int writeline (const char *s)\n{\n    size_t cur = 0;\n    size_t len = strlen(s);\n    ssize_t written;\n    static char at_command[64];\n\n    if (s_fd < 0 || s_readerClosed > 0) {\n        return AT_ERROR_CHANNEL_CLOSED;\n    }\n\n    LOGD(\"AT> %s\", s);\n\n    AT_DUMP( \">> \", s, strlen(s) );\n\n#if 1 //send '\\r' maybe fail via USB controller: Intel Corporation 7 Series/C210 Series Chipset Family USB xHCI Host Controller (rev 04)\n    if (len < (sizeof(at_command) - 1)) {\n        strcpy(at_command, s);\n        at_command[len++] = '\\r';\n        s = (const char *)at_command;\n    }\n#endif\n\n    /* the main string */\n    while (cur < len) {\n        do {\n            written = write (s_fd, s + cur, len - cur);\n        } while (written < 0 && errno == EINTR);\n\n        if (written < 0) {\n            return AT_ERROR_GENERIC;\n        }\n\n        cur += written;\n    }\n\n#if 1 //Quectel send '\\r' maybe fail via USB controller: Intel Corporation 7 Series/C210 Series Chipset Family USB xHCI Host Controller (rev 04)\n    if (s == (const char *)at_command) {\n        return 0;\n    }\n#endif\n\n    /* the \\r  */\n\n    do {\n        written = write (s_fd, \"\\r\" , 1);\n    } while ((written < 0 && errno == EINTR) || (written == 0));\n    \n    if (written < 0) {\n        return AT_ERROR_GENERIC;\n    }\n\n    return 0;\n}\nstatic int writeCtrlZ (const char *s)\n{\n    size_t cur = 0;\n    size_t len = strlen(s);\n    ssize_t written;\n\n    if (s_fd < 0 || s_readerClosed > 0) {\n        return AT_ERROR_CHANNEL_CLOSED;\n    }\n\n    LOGD(\"AT> %s^Z\", s);\n\n    AT_DUMP( \">* \", s, strlen(s) );\n\n    /* the main string */\n    while (cur < len) {\n        do {\n            written = write (s_fd, s + cur, len - cur);\n        } while (written < 0 && errno == EINTR);\n\n        if (written < 0) {\n            return AT_ERROR_GENERIC;\n        }\n\n        cur += written;\n    }\n\n    /* the ^Z  */\n\n    do {\n        written = write (s_fd, \"\\032\" , 1);\n    } while ((written < 0 && errno == EINTR) || (written == 0));\n\n    if (written < 0) {\n        return AT_ERROR_GENERIC;\n    }\n\n    return 0;\n}\n\nstatic int writeraw (const char *s, size_t len) {\n    size_t cur = 0;\n    ssize_t written;\n\n    if (s_fd < 0 || s_readerClosed > 0) {\n        return AT_ERROR_CHANNEL_CLOSED;\n    }\n\n    /* the main string */\n    while (cur < len) {\n        struct pollfd pollfds[1] = {{s_fd, POLLOUT, 0}};\n        int ret;\n\n        ret = poll(pollfds, 1, -1);\n        if (ret <= 0)\n            break;\n            \n        do {\n            written = write (s_fd, s + cur, len - cur);\n        } while (written < 0 && errno == EINTR);\n\n        if (written < 0) {\n            return AT_ERROR_GENERIC;\n        }\n\n        cur += written;\n    }\n\n    if (written < 0) {\n        return AT_ERROR_GENERIC;\n    }\n\n    return cur;\n}\n\nstatic void clearPendingCommand()\n{\n    if (sp_response != NULL) {\n        at_response_free(sp_response);\n    }\n\n    sp_response = NULL;\n    s_responsePrefix = NULL;\n    s_smsPDU = NULL;\n}\n\n\n/**\n * Starts AT handler on stream \"fd'\n * returns 0 on success, -1 on error\n */\nint at_open(int fd, ATUnsolHandler h, int proxy)\n{\n    int ret;\n    pthread_attr_t attr;\n\n    s_fd = fd;\n    s_unsolHandler = h;\n    s_readerClosed = 0;\n\ts_atc_proxy = proxy;\n\n    s_responsePrefix = NULL;\n    s_smsPDU = NULL;\n    sp_response = NULL;\n    \n    pthread_attr_init (&attr);\n    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\n\n    ret = pthread_create(&s_tid_reader, &attr, readerLoop, NULL);\n\n    if (ret < 0) {\n        LOGE(\"readerLoop create fail!\");\n        perror (\"pthread_create\\n\");\n        return -1;\n    }\n\n    return 0;\n}\n\n/* FIXME is it ok to call this from the reader and the command thread? */\nvoid at_close()\n{\n    dbg_time(\"at_close\");\n    if (s_fd >= 0) {\n        close(s_fd);\n    }\n    s_fd = -1;\n\n    pthread_mutex_lock(&cm_command_mutex);\n\n    s_readerClosed = 1;\n\n    pthread_cond_signal(&cm_command_cond);\n\n    pthread_mutex_unlock(&cm_command_mutex);\n\n    /* the reader thread should eventually die */\n}\n\nstatic ATResponse * at_response_new()\n{\n    return (ATResponse *) calloc(1, sizeof(ATResponse));\n}\n\nvoid at_response_free(ATResponse *p_response)\n{\n    ATLine *p_line;\n\n    if (p_response == NULL) return;\n\n    p_line = p_response->p_intermediates;\n\n    while (p_line != NULL) {\n        ATLine *p_toFree;\n\n        p_toFree = p_line;\n        p_line = p_line->p_next;\n\n        free(p_toFree->line);\n        free(p_toFree);\n    }\n\n    free (p_response->finalResponse);\n    free (p_response);\n}\n\n/**\n * The line reader places the intermediate responses in reverse order\n * here we flip them back\n */\nstatic void reverseIntermediates(ATResponse *p_response)\n{\n    ATLine *pcur,*pnext;\n\n    pcur = p_response->p_intermediates;\n    p_response->p_intermediates = NULL;\n\n    while (pcur != NULL) {\n        pnext = pcur->p_next;\n        pcur->p_next = p_response->p_intermediates;\n        p_response->p_intermediates = pcur;\n        pcur = pnext;\n    }\n}\n\n/**\n * Internal send_command implementation\n * Doesn't lock or call the timeout callback\n *\n * timeoutMsec == 0 means infinite timeout\n */\nstatic int at_send_command_full_nolock (const char *command, ATCommandType type,\n                    const char *responsePrefix, const char *smspdu,\n                    long long timeoutMsec, ATResponse **pp_outResponse)\n{\n    int err = 0;\n\n    if (!timeoutMsec)\n        timeoutMsec = 15000;\n\n    if(sp_response != NULL) {\n        err = AT_ERROR_COMMAND_PENDING;\n        goto error;\n    }\n\n    if (command != NULL)\n        err = writeline (command);\n\n    if (err < 0) {\n        printf(\"%s errno: %d (%s)\\n\", __func__, errno, strerror(errno));\n        goto error;\n    }\n\n    s_type = type;\n    s_responsePrefix = responsePrefix;\n    s_smsPDU = smspdu;\n    sp_response = at_response_new();\n\n    while (sp_response->finalResponse == NULL && s_readerClosed == 0) {\n        err = pthread_cond_timeout_np(&cm_command_cond, &cm_command_mutex, timeoutMsec);\n\n        if (err == ETIMEDOUT) {\n            err = AT_ERROR_TIMEOUT;\n            goto error;\n        }\n    }\n\n    if (pp_outResponse == NULL) {\n        at_response_free(sp_response);\n    } else {\n        /* line reader stores intermediate responses in reverse order */\n        reverseIntermediates(sp_response);\n        *pp_outResponse = sp_response;\n    }\n\n    sp_response = NULL;\n\n    if(s_readerClosed > 0) {\n        err = AT_ERROR_CHANNEL_CLOSED;\n        goto error;\n    }\n\n    err = 0;\nerror:\n    clearPendingCommand();\n\n    return err;\n}\n\n/**\n * Internal send_command implementation\n *\n * timeoutMsec == 0 means infinite timeout\n */\nstatic int at_send_command_full (const char *command, ATCommandType type,\n                    const char *responsePrefix, const char *smspdu,\n                    long long timeoutMsec, ATResponse **pp_outResponse)\n{\n    int err;\n\n    if (0 != pthread_equal(s_tid_reader, pthread_self())) {\n        /* cannot be called from reader thread */\n        return AT_ERROR_INVALID_THREAD;\n    }\n\n    pthread_mutex_lock(&cm_command_mutex);\n\n    err = at_send_command_full_nolock(command, type,\n                    responsePrefix, smspdu,\n                    timeoutMsec, pp_outResponse);\n\n    pthread_mutex_unlock(&cm_command_mutex);\n\n    if (err == AT_ERROR_TIMEOUT && s_onTimeout != NULL) {\n        s_onTimeout();\n    }\n\n    return err;\n}\n\n\n/**\n * Issue a single normal AT command with no intermediate response expected\n *\n * \"command\" should not include \\r\n * pp_outResponse can be NULL\n *\n * if non-NULL, the resulting ATResponse * must be eventually freed with\n * at_response_free\n */\nint at_send_command (const char *command, ATResponse **pp_outResponse)\n{\n    int err;\n\n    err = at_send_command_full (command, NO_RESULT, NULL,\n                                    NULL, 0, pp_outResponse);\n\n    return err;\n}\n\n\nint at_send_command_singleline (const char *command,\n                                const char *responsePrefix,\n                                 ATResponse **pp_outResponse)\n{\n    int err;\n\n    err = at_send_command_full (command, SINGLELINE, responsePrefix,\n                                    NULL, 0, pp_outResponse);\n\n    if (err == 0 && pp_outResponse != NULL\n        && (*pp_outResponse)->success > 0\n        && (*pp_outResponse)->p_intermediates == NULL\n    ) {\n        /* successful command must have an intermediate response */\n        at_response_free(*pp_outResponse);\n        *pp_outResponse = NULL;\n        return AT_ERROR_INVALID_RESPONSE;\n    }\n\n    return err;\n}\n\n\nint at_send_command_numeric (const char *command,\n                                 ATResponse **pp_outResponse)\n{\n    int err;\n\n    err = at_send_command_full (command, NUMERIC, NULL,\n                                    NULL, 0, pp_outResponse);\n\n    if (err == 0 && pp_outResponse != NULL\n        && (*pp_outResponse)->success > 0\n        && (*pp_outResponse)->p_intermediates == NULL\n    ) {\n        /* successful command must have an intermediate response */\n        at_response_free(*pp_outResponse);\n        *pp_outResponse = NULL;\n        return AT_ERROR_INVALID_RESPONSE;\n    }\n\n    return err;\n}\n\n\nint at_send_command_sms (const char *command,\n                                const char *pdu,\n                                const char *responsePrefix,\n                                 ATResponse **pp_outResponse)\n{\n    int err;\n\n    err = at_send_command_full (command, SINGLELINE, responsePrefix,\n                                    pdu, 0, pp_outResponse);\n\n    if (err == 0 && pp_outResponse != NULL\n        && (*pp_outResponse)->success > 0\n        && (*pp_outResponse)->p_intermediates == NULL\n    ) {\n        /* successful command must have an intermediate response */\n        at_response_free(*pp_outResponse);\n        *pp_outResponse = NULL;\n        return AT_ERROR_INVALID_RESPONSE;\n    }\n\n    return err;\n}\n\nint at_send_command_multiline (const char *command,\n                                const char *responsePrefix,\n                                 ATResponse **pp_outResponse)\n{\n    int err;\n\n    err = at_send_command_full (command, MULTILINE, responsePrefix,\n                                    NULL, 0, pp_outResponse);\n\n    return err;\n}\n\nint at_send_command_raw (const char *command,\n                                const char *raw_data, unsigned int raw_len,\n                                const char *responsePrefix,\n                                 ATResponse **pp_outResponse)\n{\n    int err;\n\n    s_raw_data = raw_data;\n    s_raw_len = raw_len;\n    err = at_send_command_full (command, SINGLELINE, responsePrefix,\n                                    NULL, 0, pp_outResponse);\n\n    return err;\n}\n\n/**\n * Periodically issue an AT command and wait for a response.\n * Used to ensure channel has start up and is active\n */\n\nint at_handshake()\n{\n    int i;\n    int err = 0;\n\n    if (0 != pthread_equal(s_tid_reader, pthread_self())) {\n        /* cannot be called from reader thread */\n        return AT_ERROR_INVALID_THREAD;\n    }\n\n    pthread_mutex_lock(&cm_command_mutex);\n\n    for (i = 0 ; i < HANDSHAKE_RETRY_COUNT ; i++) {\n        /* some stacks start with verbose off */\n        err = at_send_command_full_nolock (\"ATE0Q0V1\", NO_RESULT,\n                    NULL, NULL, HANDSHAKE_TIMEOUT_MSEC, NULL);\n\n        if (err == 0) {\n            break;\n        }\n    }\n\n    pthread_mutex_unlock(&cm_command_mutex);\n\n    if (err == 0) {\n        /* pause for a bit to let the input buffer drain any unmatched OK's\n           (they will appear as extraneous unsolicited responses) */\n\n        sleepMsec(HANDSHAKE_TIMEOUT_MSEC);\n    }\n\n    return err;\n}\n\nAT_CME_Error at_get_cme_error(const ATResponse *p_response)\n{\n    int ret;\n    int err;\n    char *p_cur;\n\n    if (p_response == NULL)\n        return CME_ERROR_NON_CME;\n\n    if (p_response->success > 0) {\n        return CME_SUCCESS;\n    }\n\n    if (p_response->finalResponse == NULL\n        || !strStartsWith(p_response->finalResponse, \"+CME ERROR:\")\n    ) {\n        return CME_ERROR_NON_CME;\n    }\n\n    p_cur = p_response->finalResponse;\n    err = at_tok_start(&p_cur);\n\n    if (err < 0) {\n        return CME_ERROR_NON_CME;\n    }\n\n    err = at_tok_nextint(&p_cur, &ret);\n\n    if (err < 0) {\n        return CME_ERROR_NON_CME;\n    }\n\n    return (AT_CME_Error) ret;\n}\n\n/** This callback is invoked on the command thread */\nvoid at_set_on_timeout(void (*onTimeout)(void))\n{\n    s_onTimeout = onTimeout;\n}\n\n/**\n *  This callback is invoked on the reader thread (like ATUnsolHandler)\n *  when the input stream closes before you call at_close\n *  (not when you call at_close())\n *  You should still call at_close()\n */\nvoid at_set_on_reader_closed(void (*onClose)(void))\n{\n    s_onReaderClosed = onClose;\n}\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/atchannel.h",
    "content": "/* //device/system/reference-ril/atchannel.h\n**\n** Copyright 2006, The Android Open Source Project\n**\n** Licensed under the Apache License, Version 2.0 (the \"License\");\n** you may not use this file except in compliance with the License.\n** You may obtain a copy of the License at\n**\n**     http://www.apache.org/licenses/LICENSE-2.0\n**\n** Unless required by applicable law or agreed to in writing, software\n** distributed under the License is distributed on an \"AS IS\" BASIS,\n** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n** See the License for the specific language governing permissions and\n** limitations under the License.\n*/\n\n#ifndef ATCHANNEL_H\n#define ATCHANNEL_H 1\n\n#ifdef __cplusplus\nextern \"C\" {\n#endif\n\n/* define AT_DEBUG to send AT traffic to /tmp/radio-at.log\" */\n#define AT_DEBUG  0\n\n#if AT_DEBUG\nextern void  AT_DUMP(const char* prefix, const char*  buff, int  len);\n#else\n#define  AT_DUMP(prefix,buff,len)  do{}while(0)\n#endif\n\n#define AT_ERROR_GENERIC -1\n#define AT_ERROR_COMMAND_PENDING -2\n#define AT_ERROR_CHANNEL_CLOSED -3\n#define AT_ERROR_TIMEOUT -4\n#define AT_ERROR_INVALID_THREAD -5 /* AT commands may not be issued from\n                                       reader thread (or unsolicited response\n                                       callback */\n#define AT_ERROR_INVALID_RESPONSE -6 /* eg an at_send_command_singleline that\n                                        did not get back an intermediate\n                                        response */\n\n\ntypedef enum {\n    NO_RESULT,   /* no intermediate response expected */\n    NUMERIC,     /* a single intermediate response starting with a 0-9 */\n    SINGLELINE,  /* a single intermediate response starting with a prefix */\n    MULTILINE    /* multiple line intermediate response\n                    starting with a prefix */\n} ATCommandType;\n\n/** a singly-lined list of intermediate responses */\ntypedef struct ATLine  {\n    struct ATLine *p_next;\n    char *line;\n} ATLine;\n\n/** Free this with at_response_free() */\ntypedef struct {\n    int success;              /* true if final response indicates\n                                    success (eg \"OK\") */\n    char *finalResponse;      /* eg OK, ERROR */\n    ATLine  *p_intermediates; /* any intermediate responses */\n} ATResponse;\n\n/**\n * a user-provided unsolicited response handler function\n * this will be called from the reader thread, so do not block\n * \"s\" is the line, and \"sms_pdu\" is either NULL or the PDU response\n * for multi-line TS 27.005 SMS PDU responses (eg +CMT:)\n */\ntypedef void (*ATUnsolHandler)(const char *s, const char *sms_pdu);\n\nint at_open(int fd, ATUnsolHandler h, int proxy);\nvoid at_close();\n\n/* This callback is invoked on the command thread.\n   You should reset or handshake here to avoid getting out of sync */\nvoid at_set_on_timeout(void (*onTimeout)(void));\n/* This callback is invoked on the reader thread (like ATUnsolHandler)\n   when the input stream closes before you call at_close\n   (not when you call at_close())\n   You should still call at_close()\n   It may also be invoked immediately from the current thread if the read\n   channel is already closed */\nvoid at_set_on_reader_closed(void (*onClose)(void));\n\nint at_send_command_singleline (const char *command,\n                                const char *responsePrefix,\n                                 ATResponse **pp_outResponse);\n\nint at_send_command_numeric (const char *command,\n                                 ATResponse **pp_outResponse);\n\nint at_send_command_multiline (const char *command,\n                                const char *responsePrefix,\n                                 ATResponse **pp_outResponse);\n\nint at_send_command_raw (const char *command,\n                                const char *raw_data, unsigned int raw_len,\n                                const char *responsePrefix,\n                                 ATResponse **pp_outResponse);\n\nint at_handshake();\n\nint at_send_command (const char *command, ATResponse **pp_outResponse);\n\nint at_send_command_sms (const char *command, const char *pdu,\n                            const char *responsePrefix,\n                            ATResponse **pp_outResponse);\n\nvoid at_response_free(ATResponse *p_response);\n\nint strStartsWith(const char *line, const char *prefix);\n\ntypedef enum {\n    CME_ERROR_NON_CME = -1,\n    CME_SUCCESS = 0,\n\n    CME_OPERATION_NOT_ALLOWED = 3,\n    CME_OPERATION_NOT_SUPPORTED = 4,\n    CME_PH_SIM_PIN= 5,\n    CME_PH_FSIM_PIN = 6,\n    CME_PH_FSIM_PUK = 7,\n    CME_SIM_NOT_INSERTED =10,\n    CME_SIM_PIN_REQUIRED = 11,\n    CME_SIM_PUK_REQUIRED = 12,\n    CME_FAILURE = 13,\n    CME_SIM_BUSY = 14,\n    CME_SIM_WRONG = 15,\n    CME_INCORRECT_PASSWORD = 16,\n    CME_SIM_PIN2_REQUIRED = 17,\n    CME_SIM_PUK2_REQUIRED = 18,\n    CME_MEMORY_FULL = 20,\n    CME_INVALID_INDEX = 21,\n    CME_NOT_FOUND = 22,\n    CME_MEMORY_FAILURE = 23,\n    CME_STRING_TO_LONG = 24,\n    CME_INVALID_CHAR = 25,\n    CME_DIALSTR_TO_LONG = 26,\n    CME_INVALID_DIALCHAR = 27,\n} AT_CME_Error;\n\nAT_CME_Error at_get_cme_error(const ATResponse *p_response);\n\n#ifdef __cplusplus\n}\n#endif\n\n#endif /*ATCHANNEL_H*/\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/configure.ac",
    "content": "#                                               -*- Autoconf -*-\n# Process this file with autoconf to produce a configure script.\n\nAC_PREREQ([2.61])\nAC_INIT([quectel-CM], [1.0], [xxx@xxx.xxx])\nAC_CONFIG_HEADERS([config.h])\n\n# Checks for programs.\nAC_PROG_CC\n\n# Checks for libraries.\n\n# Checks for header files.\n\n# Checks for typedefs, structures, and compiler characteristics.\nAC_ARG_WITH(sanitized-headers,\n      AS_HELP_STRING([--with-sanitized-headers=DIR],\n         [Specify the location of the sanitized Linux headers]),\n      [CPPFLAGS=\"$CPPFLAGS -idirafter $withval\"])\n\nAC_ARG_WITH([qrtr],\n       AC_HELP_STRING([--with-qrtr],\n          [enable qrtr, building which use qrtr]))\n\nif (test \"x${with_qrtr}\" = \"xyes\"); then\n\t#AC_DEFINE(ENABLE_USEQTRT, 1, [Define if uses qrtr])\n\tAC_CHECK_HEADERS([linux/qrtr.h linux/rmnet_data.h])\nfi\n\nAM_CONDITIONAL(USE_QRTR, test \"x${with_qrtr}\" = \"xyes\")\n\nAC_ARG_WITH([msm-ipc],\n       AC_HELP_STRING([--with-msm-ipc],\n          [enable msm-ipc, building which use qrtr]))\n\nif (test \"x${with_msm_ipc}\" = \"xyes\"); then\n\t#AC_DEFINE(ENABLE_USEQTRT, 1, [Define if uses qrtr])\n\tAC_CHECK_HEADERS([linux/msm_ipc.h linux/rmnet_data.h])\nfi\n\nAM_CONDITIONAL(USE_MSM_IPC, test \"x${with_msm_ipc}\" = \"xyes\")\n\n# Checks for library functions.\n\n# Does not strictly follow GNU Coding standards\nAM_INIT_AUTOMAKE([foreign subdir-objects])\nAC_CONFIG_FILES([Makefile])\nAC_OUTPUT\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/default.script",
    "content": "#!/bin/sh\n# Busybox udhcpc dispatcher script. Copyright (C) 2009 by Axel Beckert.\n#\n# Based on the busybox example scripts and the old udhcp source\n# package default.* scripts.\n\nRESOLV_CONF=\"/etc/resolv.conf\"\n\ncase $1 in\n    bound|renew)\n\t[ -n \"$broadcast\" ] && BROADCAST=\"broadcast $broadcast\"\n\t[ -n \"$subnet\" ] && NETMASK=\"netmask $subnet\"\n\n\t/sbin/ifconfig $interface $ip $BROADCAST $NETMASK\n\n\tif [ -n \"$router\" ]; then\n\t    echo \"$0: Resetting default routes\"\n\t    while /sbin/route del default gw 0.0.0.0 dev $interface; do :; done\n\n\t    metric=0\n\t    for i in $router; do\n\t\t/sbin/route add default gw $i dev $interface metric $metric\n\t\tmetric=$(($metric + 1))\n\t    done\n\tfi\n\n\t# Update resolver configuration file\n\tR=\"\"\n\t[ -n \"$domain\" ] && R=\"domain $domain\n\"\n\tfor i in $dns; do\n\t    echo \"$0: Adding DNS $i\"\n\t    R=\"${R}nameserver $i\n\"\n\tdone\n\n\tif [ -x /sbin/resolvconf ]; then\n\t    echo -n \"$R\" | resolvconf -a \"${interface}.udhcpc\"\n\telse\n\t    echo -n \"$R\" > \"$RESOLV_CONF\"\n\tfi\n\t;;\n\n    deconfig)\n\tif [ -x /sbin/resolvconf ]; then\n\t    resolvconf -d \"${interface}.udhcpc\"\n\tfi\n\t/sbin/ifconfig $interface 0.0.0.0\n\t;;\n\n    leasefail)\n\techo \"$0: Lease failed: $message\"\n\t;;\n\n    nak)\n\techo \"$0: Received a NAK: $message\"\n\t;;\n\n    *)\n\techo \"$0: Unknown udhcpc command: $1\";\n\texit 1;\n\t;;\nesac\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/default.script_ip",
    "content": "#!/bin/sh\n# Busybox udhcpc dispatcher script. Copyright (C) 2009 by Axel Beckert.\n#\n# Based on the busybox example scripts and the old udhcp source\n# package default.* scripts.\n\nRESOLV_CONF=\"/etc/resolv.conf\"\nIPCMD=`which ip`\n\ncase $1 in\n    bound|renew)\n\t$IPCMD address add broadcast $broadcast $ip/$subnet dev $interface\n\n\tif [ -n \"$router\" ]; then\n\t    echo \"$0: Resetting default routes\"\n\t    while $IPCMD route del default dev $interface; do :; done\n\n\t    metric=0\n\t    for i in $router; do\n\t\t$IPCMD route add default dev $interface via $router metric $metric\n\t\tmetric=$(($metric + 1))\n\t    done\n\tfi\n\n\t# Update resolver configuration file\n\tR=\"\"\n\t[ -n \"$domain\" ] && R=\"domain $domain\n\"\n\tfor i in $dns; do\n\t    echo \"$0: Adding DNS $i\"\n\t    R=\"${R}nameserver $i\n\"\n\tdone\n\n\tif [ -x /sbin/resolvconf ]; then\n\t    echo -n \"$R\" | resolvconf -a \"${interface}.udhcpc\"\n\telse\n\t    echo -n \"$R\" > \"$RESOLV_CONF\"\n\tfi\n\t;;\n\n    deconfig)\n\tif [ -x /sbin/resolvconf ]; then\n\t    resolvconf -d \"${interface}.udhcpc\"\n\tfi\n\t$IPCMD address flush dev $interface\n\t;;\n\n    leasefail)\n\techo \"$0: Lease failed: $message\"\n\t;;\n\n    nak)\n\techo \"$0: Received a NAK: $message\"\n\t;;\n\n    *)\n\techo \"$0: Unknown udhcpc command: $1\";\n\texit 1;\n\t;;\nesac\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/device.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software. \r\n    Under no circumstances may customers modify, demonstrate, use, deliver \r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include <unistd.h>\r\n#include <sys/types.h>\r\n#include <fcntl.h>\r\n#include <dirent.h>\r\n#include <errno.h>\r\n#include <strings.h>\r\n#include <stdlib.h>\r\n#include <limits.h>\r\n#include <linux/usbdevice_fs.h>\r\n#include <linux/types.h>\r\n#include <sys/ioctl.h>\r\n#include <sys/socket.h>\r\n#include <net/if.h>\r\n#include <time.h>\r\n#include <pthread.h>\r\n\r\n#include \"QMIThread.h\"\r\n#include \"ethtool-copy.h\"\r\n\r\n#define USB_CLASS_VENDOR_SPEC\t\t0xff\r\n#define USB_CLASS_COMM\t\t\t2\r\n#define USB_CDC_SUBCLASS_ACM\t\t\t0x02\r\n#define USB_CDC_SUBCLASS_ETHERNET       0x06\r\n#define USB_CDC_SUBCLASS_NCM\t\t\t0x0d\r\n#define USB_CDC_SUBCLASS_MBIM\t\t\t0x0e\r\n#define USB_CLASS_WIRELESS_CONTROLLER\t0xe0\r\n\r\n#define CM_MAX_PATHLEN 256\r\n\r\n#define CM_INVALID_VAL (~((int)0))\r\n\r\nstatic int RDNIS_MODEL = 0;\r\n\r\n/* get first line from file 'fname'\r\n * And convert the content into a hex number, then return this number */\r\nstatic int file_get_value(const char *fname, int base)\r\n{\r\n    FILE *fp = NULL;\r\n    long num;\r\n    char buff[32 + 1] = {'\\0'};\r\n    char *endptr = NULL;\r\n\r\n    fp = fopen(fname, \"r\");\r\n    if (!fp) goto error;\r\n    if (fgets(buff, sizeof(buff), fp) == NULL)\r\n        goto error;\r\n    fclose(fp);\r\n\r\n    num = (int)strtol(buff, &endptr, base);\r\n    if (errno == ERANGE && (num == LONG_MAX || num == LONG_MIN))\r\n        goto error;\r\n    /* if there is no digit in buff */\r\n    if (endptr == buff)\r\n        goto error;\r\n\r\n    if (debug_qmi)\r\n        dbg_time(\"(%s) = %lx\", fname, num);\r\n    return (int)num;\r\n\r\nerror:\r\n    if (fp) fclose(fp);\r\n    return CM_INVALID_VAL;\r\n}\r\n\r\n/*\r\n * This function will search the directory 'dirname' and return the first child.\r\n * '.' and '..' is ignored by default\r\n */\r\nstatic int dir_get_child(const char *dirname, char *buff, unsigned bufsize, const char *prefix)\r\n{\r\n    struct dirent *entptr = NULL;\r\n    DIR *dirptr;\r\n\r\n    buff[0] = 0;\r\n\r\n    dirptr = opendir(dirname);\r\n    if (!dirptr)\r\n        return -1;\r\n\r\n    while ((entptr = readdir(dirptr))) {\r\n        if (entptr->d_name[0] == '.')\r\n            continue;\r\n        if (prefix && strlen(prefix) && strncmp(entptr->d_name, prefix, strlen(prefix)))\r\n            continue;\r\n        snprintf(buff, bufsize, \"%.31s\", entptr->d_name);\r\n        break;\r\n    }\r\n    closedir(dirptr);\r\n\r\n    return 0;\r\n}\r\n\r\nstatic int conf_get_val(const char *fname, const char *key)\r\n{\r\n    char buff[128] = {'\\0'};\r\n    FILE *fp = fopen(fname, \"r\");\r\n    if (!fp)\r\n        return CM_INVALID_VAL;\r\n\r\n    while (fgets(buff, sizeof(buff)-1, fp)) {\r\n        char prefix[128] = {'\\0'};\r\n        char tail[128] = {'\\0'};\r\n        /* To eliminate cppcheck warnning: Assume string length is no more than 15 */\r\n        sscanf(buff, \"%15[^=]=%15s\", prefix, tail);\r\n        if (!strncasecmp(prefix, key, strlen(key))) {\r\n            fclose(fp);\r\n            return atoi(tail);\r\n        }\r\n    }\r\n\r\n    fclose(fp);\r\n    return CM_INVALID_VAL;\r\n}\r\n\r\nstatic void query_usb_device_info(char *path, struct usb_device_info *p) {\r\n    size_t offset = strlen(path);\r\n\r\n    memset(p, 0, sizeof(*p));\r\n\r\n    path[offset] = '\\0';\r\n    strcat(path, \"/idVendor\");\r\n    p->idVendor = file_get_value(path, 16);\r\n\r\n    if (p->idVendor == CM_INVALID_VAL)\r\n        return;\r\n\r\n    path[offset] = '\\0';\r\n    strcat(path, \"/idProduct\");\r\n    p->idProduct = file_get_value(path, 16);\r\n\r\n    path[offset] = '\\0';\r\n    strcat(path, \"/busnum\");\r\n    p->busnum = file_get_value(path, 10);\r\n\r\n    path[offset] = '\\0';\r\n    strcat(path, \"/devnum\");\r\n    p->devnum = file_get_value(path, 10);\r\n\r\n    path[offset] = '\\0';\r\n    strcat(path, \"/bNumInterfaces\");\r\n    p->bNumInterfaces = file_get_value(path, 10);\r\n\r\n    path[offset] = '\\0';\r\n}\r\n\r\nstatic void query_usb_interface_info(char *path, struct usb_interface_info *p) {\r\n    char driver[128];\r\n    size_t offset = strlen(path);\r\n    int n;\r\n\r\n    memset(p, 0, sizeof(*p));\r\n\r\n    path[offset] = '\\0';\r\n    strcat(path, \"/bNumEndpoints\");\r\n    p->bInterfaceClass = file_get_value(path, 16);\r\n\r\n    path[offset] = '\\0';\r\n    strcat(path, \"/bInterfaceClass\");\r\n    p->bInterfaceClass = file_get_value(path, 16);\r\n\r\n    path[offset] = '\\0';\r\n    strcat(path, \"/bInterfaceSubClass\");\r\n    p->bInterfaceSubClass = file_get_value(path, 16);\r\n\r\n    path[offset] = '\\0';\r\n    strcat(path, \"/bInterfaceProtocol\");\r\n    p->bInterfaceProtocol = file_get_value(path, 16);\r\n\r\n    path[offset] = '\\0';\r\n    strcat(path, \"/driver\");\r\n    n = readlink(path, driver, sizeof(driver));\r\n    if (n > 0) {\r\n        driver[n] = 0;\r\n        if (debug_qmi) dbg_time(\"driver -> %s\", driver);\r\n        n = strlen(driver);\r\n        while (n > 0) {\r\n            if (driver[n] == '/')\r\n                break;\r\n            n--;\r\n        }\r\n        strncpy(p->driver, &driver[n+1], sizeof(p->driver) - 1);\r\n    }\r\n\r\n    path[offset] = '\\0';\r\n}\r\n\r\nstatic int detect_path_cdc_wdm_or_qcqmi(char *path, char *devname, size_t bufsize)\r\n{\r\n    size_t offset = strlen(path);\r\n    char tmp[32];\r\n    \r\n    devname[0] = 0;\r\n\r\n    if (access(path, R_OK))\r\n        return -1;\r\n\r\n    path[offset] = '\\0';\r\n    strcat(path, \"/GobiQMI\");\r\n    if (!access(path, R_OK))\r\n        goto step_1;\r\n\r\n    path[offset] = '\\0';\r\n    strcat(path, \"/usbmisc\");\r\n    if (!access(path, R_OK))\r\n        goto step_1;\r\n\r\n    path[offset] = '\\0';\r\n    strcat(path, \"/usb\");\r\n    if (!access(path, R_OK))\r\n        goto step_1;\r\n\r\n    return -1;\r\n\r\nstep_1: \r\n    /* get device(qcqmiX|cdc-wdmX) */\r\n    if (debug_qmi) dbg_time(\"%s\", path);\r\n    dir_get_child(path, tmp, sizeof(tmp), NULL);\r\n    if (tmp[0] == '\\0')\r\n        return -1;\r\n\r\n    /* There is a chance that, no device(qcqmiX|cdc-wdmX) is generated. We should warn user about that! */\r\n    snprintf(devname, bufsize, \"/dev/%s\", tmp);\r\n    if (access(devname, R_OK | F_OK) && errno == ENOENT)\r\n    {\r\n        int major, minor;\r\n\r\n        dbg_time(\"access %s  failed, errno: %d (%s)\", devname, errno, strerror(errno));\r\n        strcat(path, \"/\");\r\n        strcat(path, tmp);\r\n        strcat(path, \"/uevent\");\r\n        major = conf_get_val(path, \"MAJOR\");\r\n        minor = conf_get_val(path, \"MINOR\");\r\n\r\n        if(major == CM_INVALID_VAL || minor == CM_INVALID_VAL)\r\n            dbg_time(\"get major and minor failed\");\r\n         else if (mknod(devname, S_IFCHR|0666, (((major & 0xfff) << 8) | (minor & 0xff) | ((minor & 0xfff00) << 12))))\r\n            dbg_time(\"please mknod %s c %d %d\", devname, major, minor);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\n/* To detect the device info of the modem.\r\n * return:\r\n *  FALSE -> fail\r\n *  TRUE -> ok\r\n */\r\nBOOL qmidevice_detect(char *qmichannel, char *usbnet_adapter, unsigned bufsize, PROFILE_T *profile) {\r\n    struct dirent* ent = NULL;\r\n    DIR *pDir;\r\n    const char *rootdir = \"/sys/bus/usb/devices\";\r\n    struct {\r\n        char path[255*2];\r\n    } *pl;\r\n    pl = (typeof(pl)) malloc(sizeof(*pl));\r\n    memset(pl, 0x00, sizeof(*pl));\r\n\r\n    pDir = opendir(rootdir);\r\n    if (!pDir) {\r\n        dbg_time(\"opendir %s failed: %s\", rootdir, strerror(errno));\r\n        goto error;\r\n    }\r\n\r\n    while ((ent = readdir(pDir)) != NULL)  {\r\n        char netcard[32+1] = {'\\0'};\r\n        char devname[32+5] = {'\\0'}; //+strlen(\"/dev/\")\r\n        int netIntf;\r\n        int driver_type;\r\n\r\n        if (ent->d_name[0] == 'u')\r\n            continue;\r\n\r\n        snprintf(pl->path, sizeof(pl->path), \"%s/%s\", rootdir, ent->d_name);\r\n        query_usb_device_info(pl->path, &profile->usb_dev);\r\n        if (profile->usb_dev.idVendor == CM_INVALID_VAL)\r\n            continue;\r\n\r\n        if (profile->usb_dev.idVendor == 0x2c7c || profile->usb_dev.idVendor == 0x05c6) {\r\n            dbg_time(\"Find %s/%s idVendor=0x%x idProduct=0x%x, bus=0x%03x, dev=0x%03x\",\r\n                rootdir, ent->d_name, profile->usb_dev.idVendor, profile->usb_dev.idProduct,\r\n                profile->usb_dev.busnum, profile->usb_dev.devnum);\r\n        }\r\n\r\n        /* get network interface */\r\n        /* NOTICE: there is a case that, bNumberInterface=6, but the net interface is 8 */\r\n        /* toolchain-mips_24kc_gcc-5.4.0_musl donot support GLOB_BRACE */\r\n        /* RG500U's MBIM is at inteface 0 */\r\n        for (netIntf = 0;  netIntf < (profile->usb_dev.bNumInterfaces + 8); netIntf++) {\r\n            snprintf(pl->path, sizeof(pl->path), \"%s/%s:1.%d/net\", rootdir, ent->d_name, netIntf);\r\n            dir_get_child(pl->path, netcard, sizeof(netcard), NULL);\r\n            if (netcard[0])\r\n                break;\r\n        }\r\n\r\n        if (netcard[0] == '\\0') { //for centos 2.6.x\r\n            const char *n= \"usb0\";\r\n            const char *c = \"qcqmi0\";\r\n\r\n            snprintf(pl->path, sizeof(pl->path), \"%s/%s:1.4/net:%s\", rootdir, ent->d_name, n);\r\n            if (!access(pl->path, F_OK)) {\r\n                snprintf(pl->path, sizeof(pl->path), \"%s/%s:1.4/GobiQMI:%s\", rootdir, ent->d_name, c);\r\n                if (!access(pl->path, F_OK)) {\r\n                    snprintf(qmichannel, bufsize, \"/dev/%s\", c);\r\n                    snprintf(usbnet_adapter, bufsize, \"%s\", n);\r\n                    snprintf(pl->path, sizeof(pl->path), \"%s/%s:1.4\", rootdir, ent->d_name);\r\n                    query_usb_interface_info(pl->path, &profile->usb_intf);\r\n                    break;\r\n                }\r\n            }\r\n        }\r\n\r\n        if (netcard[0] == '\\0')\r\n            continue;\r\n\r\n        /* not '-i iface' */\r\n        if (usbnet_adapter[0] && strcmp(usbnet_adapter, netcard))\r\n            continue;\r\n\r\n        snprintf(pl->path, sizeof(pl->path), \"%s/%s:1.%d\", rootdir, ent->d_name, netIntf);\r\n        query_usb_interface_info(pl->path, &profile->usb_intf);\r\n        driver_type = get_driver_type(profile);\r\n\r\n        if (driver_type == SOFTWARE_QMI || driver_type == SOFTWARE_MBIM) {\r\n            detect_path_cdc_wdm_or_qcqmi(pl->path, devname, sizeof(devname));\r\n        }\r\n        else if (driver_type == SOFTWARE_ECM_RNDIS_NCM)\r\n        {\r\n            int atIntf = -1;\r\n\r\n            if (profile->usb_dev.idVendor == 0x2c7c) { //Quectel\r\n                switch (profile->usb_dev.idProduct) { //EC200U\r\n                case 0x0901: //EC200U\r\n                case 0x0902: //EC200D\r\n                case 0x8101: //RG801H\r\n                    atIntf = 2;\r\n                break;\r\n                case 0x0900: //RG500U\r\n                    atIntf = 4;\r\n                break;\r\n                case 0x6026: //EC200T\r\n                case 0x6005: //EC200A\r\n                case 0x6002: //EC200S\r\n                case 0x6001: //EC100Y\r\n                    atIntf = 3;\r\n                break;\r\n\r\n                case 0x6007: //EG915Q\\EG800Q\r\n                    if(RDNIS_MODEL == 1)\r\n                        atIntf = 5;\r\n                    else\r\n                        atIntf = 3;\r\n                break;\r\n\r\n                default:\r\n                   dbg_time(\"unknow at interface for USB idProduct:%04x\\n\", profile->usb_dev.idProduct);\r\n                break;\r\n                }\r\n            }\r\n\r\n            if (atIntf != -1) {\r\n                snprintf(pl->path, sizeof(pl->path), \"%s/%s:1.%d\", rootdir, ent->d_name, atIntf);\r\n                dir_get_child(pl->path, devname, sizeof(devname), \"tty\");\r\n                if (devname[0] && !strcmp(devname, \"tty\")) {\r\n                    snprintf(pl->path, sizeof(pl->path), \"%s/%s:1.%d/tty\", rootdir, ent->d_name, atIntf);\r\n                    dir_get_child(pl->path, devname, sizeof(devname), \"tty\");\r\n                }\r\n            }\r\n        }\r\n        \r\n        if (netcard[0] && devname[0]) {\r\n            if (devname[0] == '/')\r\n                snprintf(qmichannel, bufsize, \"%s\", devname);\r\n            else\r\n                snprintf(qmichannel, bufsize, \"/dev/%s\", devname);\r\n            snprintf(usbnet_adapter, bufsize, \"%s\", netcard);\r\n            dbg_time(\"Auto find qmichannel = %s\", qmichannel);\r\n            dbg_time(\"Auto find usbnet_adapter = %s\", usbnet_adapter);\r\n            break;\r\n        }\r\n    }\r\n    closedir(pDir);\r\n\r\n    if (qmichannel[0] == '\\0' || usbnet_adapter[0] == '\\0') {\r\n        dbg_time(\"network interface '%s' or qmidev '%s' is not exist\", usbnet_adapter, qmichannel);\r\n        goto error;\r\n    }\r\n    free(pl);\r\n    return TRUE;\r\nerror:\r\n    free(pl);\r\n    return FALSE;\r\n}\r\n\r\nint mhidevice_detect(char *qmichannel, char *usbnet_adapter, PROFILE_T *profile) {\r\n    struct dirent* ent = NULL;\r\n    DIR *pDir;\r\n    const char *rootdir_mhi[] = {\"/sys/bus/mhi_q/devices\", \"/sys/bus/mhi/devices\", NULL};\r\n    int i = 0;\r\n    char path[256];\r\n    int find = 0;\r\n\r\n    while (rootdir_mhi[i]) {\r\n        const char *rootdir = rootdir_mhi[i++];\r\n\r\n        pDir = opendir(rootdir);\r\n        if (!pDir) {\r\n            if (errno != ENOENT)\r\n                    dbg_time(\"opendir %s failed: %s\", rootdir, strerror(errno));\r\n            continue;\r\n        }\r\n\r\n        while ((ent = readdir(pDir)) != NULL)  {\r\n            char netcard[32] = {'\\0'};\r\n            char devname[32] = {'\\0'};\r\n            int software_interface = SOFTWARE_QMI;\r\n            char *pNode = NULL;\r\n\r\n            pNode = strstr(ent->d_name, \"_IP_HW0\"); //0306_00.01.00_IP_HW0\r\n            if (!pNode)\r\n                continue;\r\n\r\n            snprintf(path, sizeof(path), \"%s/%.32s/net\", rootdir, ent->d_name);\r\n            dir_get_child(path, netcard, sizeof(netcard), NULL);\r\n            if (!netcard[0])\r\n                continue;\r\n\r\n            if (usbnet_adapter[0] && strcmp(netcard, usbnet_adapter)) //not '-i x'\r\n                continue;\r\n\r\n            if (!strcmp(rootdir, \"/sys/bus/mhi/devices\")) {\r\n                snprintf(path, sizeof(path), \"%s/%.13s_IPCR\", rootdir, ent->d_name); // 13 is sizeof(0306_00.01.00)\r\n                if (!access(path, F_OK)) {\r\n                    /* we also need 'cat /dev/mhi_0306_00.01.00_pipe_14' to enable rmnet as like USB's DTR \r\n                         or will get error 'requestSetEthMode QMUXResult = 0x1, QMUXError = 0x46' */\r\n                    sprintf(usbnet_adapter, \"%s\", netcard);\r\n                    sprintf(qmichannel, \"qrtr-%d\", 3); // 3 is sdx modem's node id\r\n                    profile->software_interface = SOFTWARE_QRTR;\r\n                    find = 1;\r\n                    break;\r\n                }\r\n                continue;\r\n            }\r\n\r\n            snprintf(path, sizeof(path), \"%s/%.13s_IPCR\", rootdir, ent->d_name);\r\n            if (access(path, F_OK)) {\r\n                snprintf(path, sizeof(path), \"%s/%.13s_QMI0\", rootdir, ent->d_name);\r\n                if (access(path, F_OK)) {\r\n                    snprintf(path, sizeof(path), \"%s/%.13s_MBIM\", rootdir, ent->d_name);\r\n                    if (!access(path, F_OK))\r\n                        software_interface = SOFTWARE_MBIM;\r\n                }\r\n            }\r\n            if (access(path, F_OK))\r\n                continue;\r\n\r\n            strncat(path, \"/mhi_uci_q\", sizeof(path)-1);\r\n            dir_get_child(path, devname, sizeof(devname), NULL);\r\n            if (!devname[0])\r\n                continue;      \r\n\r\n            sprintf(usbnet_adapter, \"%s\", netcard);\r\n            sprintf(qmichannel, \"/dev/%s\", devname);\r\n            profile->software_interface = software_interface;\r\n            find = 1;\r\n            break;\r\n        }\r\n\r\n        closedir(pDir);\r\n    }\r\n\r\n    return find;\r\n}\r\n\r\nint atdevice_detect(char *atchannel, char *usbnet_adapter, PROFILE_T *profile) {\r\n    if (!access(\"/sys/class/net/sipa_dummy0\", F_OK)) {\r\n\t\tstrcpy(usbnet_adapter, \"sipa_dummy0\");\r\n\t\tsnprintf(profile->qmapnet_adapter, sizeof(profile->qmapnet_adapter), \"%s%d\", \"pcie\", profile->pdp - 1);\r\n    }\r\n\telse {\r\n        dbg_time(\"atdevice_detect failed\");\r\n        goto error;\r\n    }\r\n\r\n    if (!access(\"/dev/stty_nr31\", F_OK)) {\r\n        strcpy(atchannel, \"/dev/stty_nr31\");\r\n        profile->software_interface = SOFTWARE_ECM_RNDIS_NCM;\r\n    }\r\n    else {\r\n        goto error;\r\n    }\r\n\r\n    return 1;\r\nerror:\r\n    return 0;\r\n}\r\n\r\n\r\nint get_driver_type(PROFILE_T *profile)\r\n{\r\n    /* QMI_WWAN */\r\n    if (profile->usb_intf.bInterfaceClass == USB_CLASS_VENDOR_SPEC) {\r\n        return SOFTWARE_QMI;\r\n    }\r\n    else if (profile->usb_intf.bInterfaceClass == USB_CLASS_COMM) {\r\n        switch (profile->usb_intf.bInterfaceSubClass) {\r\n            case USB_CDC_SUBCLASS_MBIM:\r\n                return SOFTWARE_MBIM;\r\n            break;\r\n            case USB_CDC_SUBCLASS_ETHERNET:\r\n            case USB_CDC_SUBCLASS_NCM:\r\n                return SOFTWARE_ECM_RNDIS_NCM;\r\n            break;\r\n            default:\r\n            break;\r\n        }\r\n    }\r\n    else if (profile->usb_intf.bInterfaceClass == USB_CLASS_WIRELESS_CONTROLLER) {\r\n        if (profile->usb_intf.bInterfaceSubClass == 1 && profile->usb_intf.bInterfaceProtocol == 3) {\r\n            RDNIS_MODEL = 1;//Some modules in RNDIS mode the usb port definition is different, adding a marker bit to distinguish.\r\n            return SOFTWARE_ECM_RNDIS_NCM;\r\n        }\r\n    }\r\n\r\n    dbg_time(\"%s unknow bInterfaceClass=%d, bInterfaceSubClass=%d\", __func__,\r\n        profile->usb_intf.bInterfaceClass, profile->usb_intf.bInterfaceSubClass);\r\n    return DRV_INVALID;\r\n}\r\n\r\nstruct usbfs_getdriver\r\n{\r\n    unsigned int interface;\r\n    char driver[255 + 1];\r\n};\r\n\r\nstruct usbfs_ioctl\r\n{\r\n    int ifno;       /* interface 0..N ; negative numbers reserved */\r\n    int ioctl_code; /* MUST encode size + direction of data so the\r\n\t\t\t * macros in <asm/ioctl.h> give correct values */\r\n    void *data;     /* param buffer (in, or out) */\r\n};\r\n\r\n#define IOCTL_USBFS_DISCONNECT\t_IO('U', 22)\r\n#define IOCTL_USBFS_CONNECT\t_IO('U', 23)\r\n\r\nint usbfs_is_kernel_driver_alive(int fd, int ifnum)\r\n{\r\n    struct usbfs_getdriver getdrv;\r\n    getdrv.interface = ifnum;\r\n    if (ioctl(fd, USBDEVFS_GETDRIVER, &getdrv) < 0) {\r\n        dbg_time(\"%s ioctl USBDEVFS_GETDRIVER failed, kernel driver may be inactive\", __func__);\r\n        return 0;\r\n    }\r\n    dbg_time(\"%s find interface %d has match the driver %s\", __func__, ifnum, getdrv.driver);\r\n    return 1;\r\n}\r\n\r\nvoid usbfs_detach_kernel_driver(int fd, int ifnum)\r\n{\r\n    struct usbfs_ioctl operate;\r\n    operate.data = NULL;\r\n    operate.ifno = ifnum;\r\n    operate.ioctl_code = IOCTL_USBFS_DISCONNECT;\r\n    if (ioctl(fd, USBDEVFS_IOCTL, &operate) < 0) {\r\n        dbg_time(\"%s detach kernel driver failed\", __func__);\r\n    } else {\r\n        dbg_time(\"%s detach kernel driver success\", __func__);\r\n    }\r\n}\r\n\r\nvoid usbfs_attach_kernel_driver(int fd, int ifnum)\r\n{\r\n    struct usbfs_ioctl operate;\r\n    operate.data = NULL;\r\n    operate.ifno = ifnum;\r\n    operate.ioctl_code = IOCTL_USBFS_CONNECT;\r\n    if (ioctl(fd, USBDEVFS_IOCTL, &operate) < 0) {\r\n        dbg_time(\"%s detach kernel driver failed\", __func__);\r\n    } else {\r\n        dbg_time(\"%s detach kernel driver success\", __func__);\r\n    }\r\n}\r\n\r\nint reattach_driver(PROFILE_T *profile)\r\n{\r\n    int ifnum = 4;\r\n    int fd;\r\n    char devpath[128] = {'\\0'};\r\n    snprintf(devpath, sizeof(devpath), \"/dev/bus/usb/%03d/%03d\", profile->usb_dev.busnum, profile->usb_dev.devnum);\r\n    fd = open(devpath, O_RDWR | O_NOCTTY);\r\n    if (fd < 0)\r\n    {\r\n        dbg_time(\"%s fail to open %s\", __func__, devpath);\r\n        return -1;\r\n    }\r\n    usbfs_detach_kernel_driver(fd, ifnum);\r\n    usbfs_attach_kernel_driver(fd, ifnum);\r\n    close(fd);\r\n    return 0;\r\n}\r\n\r\n#define SIOCETHTOOL     0x8946\r\nint ql_get_netcard_driver_info(const char *devname)\r\n{\r\n    int fd = -1;\r\n    struct ethtool_drvinfo drvinfo;\r\n    struct ifreq ifr;\t/* ifreq suitable for ethtool ioctl */\r\n\r\n    memset(&ifr, 0, sizeof(ifr));\r\n    strcpy(ifr.ifr_name, devname);\r\n\r\n    fd = socket(AF_INET, SOCK_DGRAM, 0);\r\n    if (fd < 0) {\r\n        dbg_time(\"Cannot get control socket: errno(%d)(%s)\", errno, strerror(errno));\r\n        return -1;\r\n    }\r\n\r\n    drvinfo.cmd = ETHTOOL_GDRVINFO;\r\n    ifr.ifr_data = (void *)&drvinfo;\r\n\r\n    if (ioctl(fd, SIOCETHTOOL, &ifr) < 0) {\r\n        dbg_time(\"ioctl() error: errno(%d)(%s)\", errno, strerror(errno));\r\n        close(fd);\r\n        return -1;\r\n    }\r\n\r\n    dbg_time(\"netcard driver = %s, driver version = %s\", drvinfo.driver, drvinfo.version);\r\n\r\n    close(fd);\r\n\r\n    return 0;\r\n}\r\n\r\nint ql_get_netcard_carrier_state(const char *devname)\r\n{\r\n    int fd = -1;\r\n    struct ethtool_value edata;\r\n    struct ifreq ifr;\t/* ifreq suitable for ethtool ioctl */\r\n\r\n    memset(&ifr, 0, sizeof(ifr));\r\n    strcpy(ifr.ifr_name, devname);\r\n\r\n    fd = socket(AF_INET, SOCK_DGRAM, 0);\r\n    if (fd < 0) {\r\n        dbg_time(\"Cannot get control socket: errno(%d)(%s)\", errno, strerror(errno));\r\n        return -1;\r\n    }\r\n\r\n    edata.cmd = ETHTOOL_GLINK;\r\n    edata.data = 0;\r\n    ifr.ifr_data = (void *)&edata;\r\n\r\n    if (ioctl(fd, SIOCETHTOOL, &ifr) < 0) {\r\n        dbg_time(\"ioctl('%s') error: errno(%d)(%s)\", devname, errno, strerror(errno));\r\n        return -1;\r\n    }\r\n\r\n    if (!edata.data)\r\n        dbg_time(\"netcard carrier = %d\", edata.data);\r\n\r\n    close(fd);\r\n\r\n    return edata.data;\r\n}\r\n\r\nstatic void *catch_log(void *arg)\r\n{\r\n    PROFILE_T *profile = (PROFILE_T *)arg;\r\n    int nreads = 0;\r\n    char tbuff[256+32];\r\n    char filter[32];\r\n    size_t tsize = strlen(get_time()) + 1;\r\n\r\n    snprintf(filter, sizeof(filter), \":%d:%03d:\", profile->usb_dev.busnum, profile->usb_dev.devnum);\r\n\r\n    while(1) {\r\n        nreads = read(profile->usbmon_fd, tbuff + tsize, sizeof(tbuff) - tsize - 1);\r\n        if (nreads <= 0) {\r\n            if (nreads == -1 && errno == EINTR)\r\n                continue;\r\n            break;\r\n        }\r\n\r\n        tbuff[tsize+nreads] = '\\0';   // printf(\"%s\", buff);\r\n\r\n        if (!strstr(tbuff+tsize, filter))\r\n            continue;\r\n\r\n        snprintf(tbuff, sizeof(tbuff), \"%s\", get_time());\r\n        tbuff[tsize-1] = ' ';\r\n\r\n        fwrite(tbuff, strlen(tbuff), 1, profile->usbmon_logfile_fp);\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\nint ql_capture_usbmon_log(PROFILE_T *profile, const char *log_path)\r\n{\r\n    char usbmon_path[256];\r\n    pthread_t pt;\r\n    pthread_attr_t attr;\r\n\r\n    if (access(\"/sys/module/usbmon\", F_OK)) {\r\n        dbg_time(\"usbmon is not load, please execute \\\"modprobe usbmon\\\" or \\\"insmod usbmon.ko\\\"\");\r\n        return -1;\r\n    }\r\n\r\n    if (access(\"/sys/kernel/debug/usb\", F_OK)) {\r\n        dbg_time(\"debugfs is not mount, please execute \\\"mount -t debugfs none_debugs /sys/kernel/debug\\\"\");\r\n        return -1;\r\n    }\r\n\r\n    snprintf(usbmon_path, sizeof(usbmon_path), \"/sys/kernel/debug/usb/usbmon/%du\", profile->usb_dev.busnum);\r\n    profile->usbmon_fd = open(usbmon_path, O_RDONLY);\r\n    if (profile->usbmon_fd < 0) {\r\n        dbg_time(\"open %s error(%d) (%s)\", usbmon_path, errno, strerror(errno));\r\n        return -1;\r\n    }\r\n\r\n    snprintf(usbmon_path, sizeof(usbmon_path), \"cat /sys/kernel/debug/usb/devices >> %s\", log_path);\r\n    if (system(usbmon_path) == -1) {};\r\n\r\n    profile->usbmon_logfile_fp = fopen(log_path, \"wb\");\r\n    if (!profile->usbmon_logfile_fp) {\r\n      dbg_time(\"open %s error(%d) (%s)\", log_path, errno, strerror(errno));\r\n      close(profile->usbmon_fd);\r\n      profile->usbmon_fd = -1;\r\n      return -1;\r\n    }\r\n\r\n    pthread_attr_init(&attr);\r\n    pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);\r\n\r\n    pthread_create(&pt, &attr, catch_log, (void *)profile);\r\n\r\n    return 0;\r\n}\r\n\r\nvoid ql_stop_usbmon_log(PROFILE_T *profile) {\r\n    if (profile->usbmon_fd > 0)\r\n        close(profile->usbmon_fd);\r\n    if (profile->usbmon_logfile_fp)\r\n        fclose(profile->usbmon_logfile_fp);\r\n}\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/ethtool-copy.h",
    "content": "/*\n * ethtool.h: Defines for Linux ethtool.\n *\n * Copyright (C) 1998 David S. Miller (davem@redhat.com)\n * Copyright 2001 Jeff Garzik <jgarzik@pobox.com>\n * Portions Copyright 2001 Sun Microsystems (thockin@sun.com)\n * Portions Copyright 2002 Intel (eli.kupermann@intel.com,\n *                                christopher.leech@intel.com,\n *                                scott.feldman@intel.com)\n * Portions Copyright (C) Sun Microsystems 2008\n\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\n\n    Quectel hereby grants customers of Quectel a license to use, modify,\n    distribute and publish the Software in binary form provided that\n    customers shall have no right to reverse engineer, reverse assemble,\n    decompile or reduce to source code form any portion of the Software. \n    Under no circumstances may customers modify, demonstrate, use, deliver \n    or disclose any portion of the Software in source code form.\n*/\n\n\n#ifndef _LINUX_ETHTOOL_H\n#define _LINUX_ETHTOOL_H\n\n#include <linux/types.h>\n#include <linux/if_ether.h>\n\n/* This should work for both 32 and 64 bit userland. */\nstruct ethtool_cmd {\n\t__u32\tcmd;\n\t__u32\tsupported;\t/* Features this interface supports */\n\t__u32\tadvertising;\t/* Features this interface advertises */\n\t__u16\tspeed;\t        /* The forced speed (lower bits) in\n\t\t\t\t * Mbps. Please use\n\t\t\t\t * ethtool_cmd_speed()/_set() to\n\t\t\t\t * access it */\n\t__u8\tduplex;\t\t/* Duplex, half or full */\n\t__u8\tport;\t\t/* Which connector port */\n\t__u8\tphy_address;\t/* MDIO PHY address (PRTAD for clause 45).\n\t\t\t\t * May be read-only or read-write\n\t\t\t\t * depending on the driver.\n\t\t\t\t */\n\t__u8\ttransceiver;\t/* Which transceiver to use */\n\t__u8\tautoneg;\t/* Enable or disable autonegotiation */\n\t__u8\tmdio_support;\t/* MDIO protocols supported.  Read-only.\n\t\t\t\t * Not set by all drivers.\n\t\t\t\t */\n\t__u32\tmaxtxpkt;\t/* Tx pkts before generating tx int */\n\t__u32\tmaxrxpkt;\t/* Rx pkts before generating rx int */\n\t__u16\tspeed_hi;       /* The forced speed (upper\n\t\t\t\t * bits) in Mbps. Please use\n\t\t\t\t * ethtool_cmd_speed()/_set() to\n\t\t\t\t * access it */\n\t__u8\teth_tp_mdix;\t/* twisted pair MDI-X status */\n\t__u8    eth_tp_mdix_ctrl; /* twisted pair MDI-X control, when set,\n\t\t\t\t   * link should be renegotiated if necessary\n\t\t\t\t   */\n\t__u32\tlp_advertising;\t/* Features the link partner advertises */\n\t__u32\treserved[2];\n};\n\nstatic __inline__ void ethtool_cmd_speed_set(struct ethtool_cmd *ep,\n\t\t\t\t\t __u32 speed)\n{\n\n\tep->speed = (__u16)speed;\n\tep->speed_hi = (__u16)(speed >> 16);\n}\n\nstatic __inline__ __u32 ethtool_cmd_speed(const struct ethtool_cmd *ep)\n{\n\treturn (ep->speed_hi << 16) | ep->speed;\n}\n\n/* Device supports clause 22 register access to PHY or peripherals\n * using the interface defined in <linux/mii.h>.  This should not be\n * set if there are known to be no such peripherals present or if\n * the driver only emulates clause 22 registers for compatibility.\n */\n#define ETH_MDIO_SUPPORTS_C22\t1\n\n/* Device supports clause 45 register access to PHY or peripherals\n * using the interface defined in <linux/mii.h> and <linux/mdio.h>.\n * This should not be set if there are known to be no such peripherals\n * present.\n */\n#define ETH_MDIO_SUPPORTS_C45\t2\n\n#define ETHTOOL_FWVERS_LEN\t32\n#define ETHTOOL_BUSINFO_LEN\t32\n/* these strings are set to whatever the driver author decides... */\nstruct ethtool_drvinfo {\n\t__u32\tcmd;\n\tchar\tdriver[32];\t/* driver short name, \"tulip\", \"eepro100\" */\n\tchar\tversion[32];\t/* driver version string */\n\tchar\tfw_version[ETHTOOL_FWVERS_LEN];\t/* firmware version string */\n\tchar\tbus_info[ETHTOOL_BUSINFO_LEN];\t/* Bus info for this IF. */\n\t\t\t\t/* For PCI devices, use pci_name(pci_dev). */\n\tchar\treserved1[32];\n\tchar\treserved2[12];\n\t\t\t\t/*\n\t\t\t\t * Some struct members below are filled in\n\t\t\t\t * using ops->get_sset_count().  Obtaining\n\t\t\t\t * this info from ethtool_drvinfo is now\n\t\t\t\t * deprecated; Use ETHTOOL_GSSET_INFO\n\t\t\t\t * instead.\n\t\t\t\t */\n\t__u32\tn_priv_flags;\t/* number of flags valid in ETHTOOL_GPFLAGS */\n\t__u32\tn_stats;\t/* number of u64's from ETHTOOL_GSTATS */\n\t__u32\ttestinfo_len;\n\t__u32\teedump_len;\t/* Size of data from ETHTOOL_GEEPROM (bytes) */\n\t__u32\tregdump_len;\t/* Size of data from ETHTOOL_GREGS (bytes) */\n};\n\n#define SOPASS_MAX\t6\n/* wake-on-lan settings */\nstruct ethtool_wolinfo {\n\t__u32\tcmd;\n\t__u32\tsupported;\n\t__u32\twolopts;\n\t__u8\tsopass[SOPASS_MAX]; /* SecureOn(tm) password */\n};\n\n/* for passing single values */\nstruct ethtool_value {\n\t__u32\tcmd;\n\t__u32\tdata;\n};\n\n/* for passing big chunks of data */\nstruct ethtool_regs {\n\t__u32\tcmd;\n\t__u32\tversion; /* driver-specific, indicates different chips/revs */\n\t__u32\tlen; /* bytes */\n\t__u8\tdata[0];\n};\n\n/* for passing EEPROM chunks */\nstruct ethtool_eeprom {\n\t__u32\tcmd;\n\t__u32\tmagic;\n\t__u32\toffset; /* in bytes */\n\t__u32\tlen; /* in bytes */\n\t__u8\tdata[0];\n};\n\n/**\n * struct ethtool_eee - Energy Efficient Ethernet information\n * @cmd: ETHTOOL_{G,S}EEE\n * @supported: Mask of %SUPPORTED_* flags for the speed/duplex combinations\n *\tfor which there is EEE support.\n * @advertised: Mask of %ADVERTISED_* flags for the speed/duplex combinations\n *\tadvertised as eee capable.\n * @lp_advertised: Mask of %ADVERTISED_* flags for the speed/duplex\n *\tcombinations advertised by the link partner as eee capable.\n * @eee_active: Result of the eee auto negotiation.\n * @eee_enabled: EEE configured mode (enabled/disabled).\n * @tx_lpi_enabled: Whether the interface should assert its tx lpi, given\n *\tthat eee was negotiated.\n * @tx_lpi_timer: Time in microseconds the interface delays prior to asserting\n *\tits tx lpi (after reaching 'idle' state). Effective only when eee\n *\twas negotiated and tx_lpi_enabled was set.\n */\nstruct ethtool_eee {\n\t__u32\tcmd;\n\t__u32\tsupported;\n\t__u32\tadvertised;\n\t__u32\tlp_advertised;\n\t__u32\teee_active;\n\t__u32\teee_enabled;\n\t__u32\ttx_lpi_enabled;\n\t__u32\ttx_lpi_timer;\n\t__u32\treserved[2];\n};\n\n/**\n * struct ethtool_modinfo - plugin module eeprom information\n * @cmd: %ETHTOOL_GMODULEINFO\n * @type: Standard the module information conforms to %ETH_MODULE_SFF_xxxx\n * @eeprom_len: Length of the eeprom\n *\n * This structure is used to return the information to\n * properly size memory for a subsequent call to %ETHTOOL_GMODULEEEPROM.\n * The type code indicates the eeprom data format\n */\nstruct ethtool_modinfo {\n\t__u32   cmd;\n\t__u32   type;\n\t__u32   eeprom_len;\n\t__u32   reserved[8];\n};\n\n/**\n * struct ethtool_coalesce - coalescing parameters for IRQs and stats updates\n * @cmd: ETHTOOL_{G,S}COALESCE\n * @rx_coalesce_usecs: How many usecs to delay an RX interrupt after\n *\ta packet arrives.\n * @rx_max_coalesced_frames: Maximum number of packets to receive\n *\tbefore an RX interrupt.\n * @rx_coalesce_usecs_irq: Same as @rx_coalesce_usecs, except that\n *\tthis value applies while an IRQ is being serviced by the host.\n * @rx_max_coalesced_frames_irq: Same as @rx_max_coalesced_frames,\n *\texcept that this value applies while an IRQ is being serviced\n *\tby the host.\n * @tx_coalesce_usecs: How many usecs to delay a TX interrupt after\n *\ta packet is sent.\n * @tx_max_coalesced_frames: Maximum number of packets to be sent\n *\tbefore a TX interrupt.\n * @tx_coalesce_usecs_irq: Same as @tx_coalesce_usecs, except that\n *\tthis value applies while an IRQ is being serviced by the host.\n * @tx_max_coalesced_frames_irq: Same as @tx_max_coalesced_frames,\n *\texcept that this value applies while an IRQ is being serviced\n *\tby the host.\n * @stats_block_coalesce_usecs: How many usecs to delay in-memory\n *\tstatistics block updates.  Some drivers do not have an\n *\tin-memory statistic block, and in such cases this value is\n *\tignored.  This value must not be zero.\n * @use_adaptive_rx_coalesce: Enable adaptive RX coalescing.\n * @use_adaptive_tx_coalesce: Enable adaptive TX coalescing.\n * @pkt_rate_low: Threshold for low packet rate (packets per second).\n * @rx_coalesce_usecs_low: How many usecs to delay an RX interrupt after\n *\ta packet arrives, when the packet rate is below @pkt_rate_low.\n * @rx_max_coalesced_frames_low: Maximum number of packets to be received\n *\tbefore an RX interrupt, when the packet rate is below @pkt_rate_low.\n * @tx_coalesce_usecs_low: How many usecs to delay a TX interrupt after\n *\ta packet is sent, when the packet rate is below @pkt_rate_low.\n * @tx_max_coalesced_frames_low: Maximum nuumber of packets to be sent before\n *\ta TX interrupt, when the packet rate is below @pkt_rate_low.\n * @pkt_rate_high: Threshold for high packet rate (packets per second).\n * @rx_coalesce_usecs_high: How many usecs to delay an RX interrupt after\n *\ta packet arrives, when the packet rate is above @pkt_rate_high.\n * @rx_max_coalesced_frames_high: Maximum number of packets to be received\n *\tbefore an RX interrupt, when the packet rate is above @pkt_rate_high.\n * @tx_coalesce_usecs_high: How many usecs to delay a TX interrupt after\n *\ta packet is sent, when the packet rate is above @pkt_rate_high.\n * @tx_max_coalesced_frames_high: Maximum number of packets to be sent before\n *\ta TX interrupt, when the packet rate is above @pkt_rate_high.\n * @rate_sample_interval: How often to do adaptive coalescing packet rate\n *\tsampling, measured in seconds.  Must not be zero.\n *\n * Each pair of (usecs, max_frames) fields specifies this exit\n * condition for interrupt coalescing:\n *\t(usecs > 0 && time_since_first_completion >= usecs) ||\n *\t(max_frames > 0 && completed_frames >= max_frames)\n * It is illegal to set both usecs and max_frames to zero as this\n * would cause interrupts to never be generated.  To disable\n * coalescing, set usecs = 0 and max_frames = 1.\n *\n * Some implementations ignore the value of max_frames and use the\n * condition:\n *\ttime_since_first_completion >= usecs\n * This is deprecated.  Drivers for hardware that does not support\n * counting completions should validate that max_frames == !rx_usecs.\n *\n * Adaptive RX/TX coalescing is an algorithm implemented by some\n * drivers to improve latency under low packet rates and improve\n * throughput under high packet rates.  Some drivers only implement\n * one of RX or TX adaptive coalescing.  Anything not implemented by\n * the driver causes these values to be silently ignored.\n *\n * When the packet rate is below @pkt_rate_high but above\n * @pkt_rate_low (both measured in packets per second) the\n * normal {rx,tx}_* coalescing parameters are used.\n */\nstruct ethtool_coalesce {\n\t__u32\tcmd;\n\t__u32\trx_coalesce_usecs;\n\t__u32\trx_max_coalesced_frames;\n\t__u32\trx_coalesce_usecs_irq;\n\t__u32\trx_max_coalesced_frames_irq;\n\t__u32\ttx_coalesce_usecs;\n\t__u32\ttx_max_coalesced_frames;\n\t__u32\ttx_coalesce_usecs_irq;\n\t__u32\ttx_max_coalesced_frames_irq;\n\t__u32\tstats_block_coalesce_usecs;\n\t__u32\tuse_adaptive_rx_coalesce;\n\t__u32\tuse_adaptive_tx_coalesce;\n\t__u32\tpkt_rate_low;\n\t__u32\trx_coalesce_usecs_low;\n\t__u32\trx_max_coalesced_frames_low;\n\t__u32\ttx_coalesce_usecs_low;\n\t__u32\ttx_max_coalesced_frames_low;\n\t__u32\tpkt_rate_high;\n\t__u32\trx_coalesce_usecs_high;\n\t__u32\trx_max_coalesced_frames_high;\n\t__u32\ttx_coalesce_usecs_high;\n\t__u32\ttx_max_coalesced_frames_high;\n\t__u32\trate_sample_interval;\n};\n\n/* for configuring RX/TX ring parameters */\nstruct ethtool_ringparam {\n\t__u32\tcmd;\t/* ETHTOOL_{G,S}RINGPARAM */\n\n\t/* Read only attributes.  These indicate the maximum number\n\t * of pending RX/TX ring entries the driver will allow the\n\t * user to set.\n\t */\n\t__u32\trx_max_pending;\n\t__u32\trx_mini_max_pending;\n\t__u32\trx_jumbo_max_pending;\n\t__u32\ttx_max_pending;\n\n\t/* Values changeable by the user.  The valid values are\n\t * in the range 1 to the \"*_max_pending\" counterpart above.\n\t */\n\t__u32\trx_pending;\n\t__u32\trx_mini_pending;\n\t__u32\trx_jumbo_pending;\n\t__u32\ttx_pending;\n};\n\n/**\n * struct ethtool_channels - configuring number of network channel\n * @cmd: ETHTOOL_{G,S}CHANNELS\n * @max_rx: Read only. Maximum number of receive channel the driver support.\n * @max_tx: Read only. Maximum number of transmit channel the driver support.\n * @max_other: Read only. Maximum number of other channel the driver support.\n * @max_combined: Read only. Maximum number of combined channel the driver\n *\tsupport. Set of queues RX, TX or other.\n * @rx_count: Valid values are in the range 1 to the max_rx.\n * @tx_count: Valid values are in the range 1 to the max_tx.\n * @other_count: Valid values are in the range 1 to the max_other.\n * @combined_count: Valid values are in the range 1 to the max_combined.\n *\n * This can be used to configure RX, TX and other channels.\n */\n\nstruct ethtool_channels {\n\t__u32\tcmd;\n\t__u32\tmax_rx;\n\t__u32\tmax_tx;\n\t__u32\tmax_other;\n\t__u32\tmax_combined;\n\t__u32\trx_count;\n\t__u32\ttx_count;\n\t__u32\tother_count;\n\t__u32\tcombined_count;\n};\n\n/* for configuring link flow control parameters */\nstruct ethtool_pauseparam {\n\t__u32\tcmd;\t/* ETHTOOL_{G,S}PAUSEPARAM */\n\n\t/* If the link is being auto-negotiated (via ethtool_cmd.autoneg\n\t * being true) the user may set 'autoneg' here non-zero to have the\n\t * pause parameters be auto-negotiated too.  In such a case, the\n\t * {rx,tx}_pause values below determine what capabilities are\n\t * advertised.\n\t *\n\t * If 'autoneg' is zero or the link is not being auto-negotiated,\n\t * then {rx,tx}_pause force the driver to use/not-use pause\n\t * flow control.\n\t */\n\t__u32\tautoneg;\n\t__u32\trx_pause;\n\t__u32\ttx_pause;\n};\n\n#define ETH_GSTRING_LEN\t\t32\nenum ethtool_stringset {\n\tETH_SS_TEST\t\t= 0,\n\tETH_SS_STATS,\n\tETH_SS_PRIV_FLAGS,\n\tETH_SS_NTUPLE_FILTERS,\t/* Do not use, GRXNTUPLE is now deprecated */\n\tETH_SS_FEATURES,\n};\n\n/* for passing string sets for data tagging */\nstruct ethtool_gstrings {\n\t__u32\tcmd;\t\t/* ETHTOOL_GSTRINGS */\n\t__u32\tstring_set;\t/* string set id e.c. ETH_SS_TEST, etc*/\n\t__u32\tlen;\t\t/* number of strings in the string set */\n\t__u8\tdata[0];\n};\n\nstruct ethtool_sset_info {\n\t__u32\tcmd;\t\t/* ETHTOOL_GSSET_INFO */\n\t__u32\treserved;\n\t__u64\tsset_mask;\t/* input: each bit selects an sset to query */\n\t\t\t\t/* output: each bit a returned sset */\n\t__u32\tdata[0];\t/* ETH_SS_xxx count, in order, based on bits\n\t\t\t\t   in sset_mask.  One bit implies one\n\t\t\t\t   __u32, two bits implies two\n\t\t\t\t   __u32's, etc. */\n};\n\n/**\n * enum ethtool_test_flags - flags definition of ethtool_test\n * @ETH_TEST_FL_OFFLINE: if set perform online and offline tests, otherwise\n *\tonly online tests.\n * @ETH_TEST_FL_FAILED: Driver set this flag if test fails.\n * @ETH_TEST_FL_EXTERNAL_LB: Application request to perform external loopback\n *\ttest.\n * @ETH_TEST_FL_EXTERNAL_LB_DONE: Driver performed the external loopback test\n */\n\nenum ethtool_test_flags {\n\tETH_TEST_FL_OFFLINE\t= (1 << 0),\n\tETH_TEST_FL_FAILED\t= (1 << 1),\n\tETH_TEST_FL_EXTERNAL_LB\t= (1 << 2),\n\tETH_TEST_FL_EXTERNAL_LB_DONE\t= (1 << 3),\n};\n\n/* for requesting NIC test and getting results*/\nstruct ethtool_test {\n\t__u32\tcmd;\t\t/* ETHTOOL_TEST */\n\t__u32\tflags;\t\t/* ETH_TEST_FL_xxx */\n\t__u32\treserved;\n\t__u32\tlen;\t\t/* result length, in number of u64 elements */\n\t__u64\tdata[0];\n};\n\n/* for dumping NIC-specific statistics */\nstruct ethtool_stats {\n\t__u32\tcmd;\t\t/* ETHTOOL_GSTATS */\n\t__u32\tn_stats;\t/* number of u64's being returned */\n\t__u64\tdata[0];\n};\n\nstruct ethtool_perm_addr {\n\t__u32\tcmd;\t\t/* ETHTOOL_GPERMADDR */\n\t__u32\tsize;\n\t__u8\tdata[0];\n};\n\n/* boolean flags controlling per-interface behavior characteristics.\n * When reading, the flag indicates whether or not a certain behavior\n * is enabled/present.  When writing, the flag indicates whether\n * or not the driver should turn on (set) or off (clear) a behavior.\n *\n * Some behaviors may read-only (unconditionally absent or present).\n * If such is the case, return EINVAL in the set-flags operation if the\n * flag differs from the read-only value.\n */\nenum ethtool_flags {\n\tETH_FLAG_TXVLAN\t\t= (1 << 7),\t/* TX VLAN offload enabled */\n\tETH_FLAG_RXVLAN\t\t= (1 << 8),\t/* RX VLAN offload enabled */\n\tETH_FLAG_LRO\t\t= (1 << 15),\t/* LRO is enabled */\n\tETH_FLAG_NTUPLE\t\t= (1 << 27),\t/* N-tuple filters enabled */\n\tETH_FLAG_RXHASH\t\t= (1 << 28),\n};\n\n/* The following structures are for supporting RX network flow\n * classification and RX n-tuple configuration. Note, all multibyte\n * fields, e.g., ip4src, ip4dst, psrc, pdst, spi, etc. are expected to\n * be in network byte order.\n */\n\n/**\n * struct ethtool_tcpip4_spec - flow specification for TCP/IPv4 etc.\n * @ip4src: Source host\n * @ip4dst: Destination host\n * @psrc: Source port\n * @pdst: Destination port\n * @tos: Type-of-service\n *\n * This can be used to specify a TCP/IPv4, UDP/IPv4 or SCTP/IPv4 flow.\n */\nstruct ethtool_tcpip4_spec {\n\t__be32\tip4src;\n\t__be32\tip4dst;\n\t__be16\tpsrc;\n\t__be16\tpdst;\n\t__u8    tos;\n};\n\n/**\n * struct ethtool_ah_espip4_spec - flow specification for IPsec/IPv4\n * @ip4src: Source host\n * @ip4dst: Destination host\n * @spi: Security parameters index\n * @tos: Type-of-service\n *\n * This can be used to specify an IPsec transport or tunnel over IPv4.\n */\nstruct ethtool_ah_espip4_spec {\n\t__be32\tip4src;\n\t__be32\tip4dst;\n\t__be32\tspi;\n\t__u8    tos;\n};\n\n#define\tETH_RX_NFC_IP4\t1\n\n/**\n * struct ethtool_usrip4_spec - general flow specification for IPv4\n * @ip4src: Source host\n * @ip4dst: Destination host\n * @l4_4_bytes: First 4 bytes of transport (layer 4) header\n * @tos: Type-of-service\n * @ip_ver: Value must be %ETH_RX_NFC_IP4; mask must be 0\n * @proto: Transport protocol number; mask must be 0\n */\nstruct ethtool_usrip4_spec {\n\t__be32\tip4src;\n\t__be32\tip4dst;\n\t__be32\tl4_4_bytes;\n\t__u8    tos;\n\t__u8    ip_ver;\n\t__u8    proto;\n};\n\nunion ethtool_flow_union {\n\tstruct ethtool_tcpip4_spec\t\ttcp_ip4_spec;\n\tstruct ethtool_tcpip4_spec\t\tudp_ip4_spec;\n\tstruct ethtool_tcpip4_spec\t\tsctp_ip4_spec;\n\tstruct ethtool_ah_espip4_spec\t\tah_ip4_spec;\n\tstruct ethtool_ah_espip4_spec\t\tesp_ip4_spec;\n\tstruct ethtool_usrip4_spec\t\tusr_ip4_spec;\n\tstruct ethhdr\t\t\t\tether_spec;\n\t__u8\t\t\t\t\thdata[52];\n};\n\n/**\n * struct ethtool_flow_ext - additional RX flow fields\n * @h_dest: destination MAC address\n * @vlan_etype: VLAN EtherType\n * @vlan_tci: VLAN tag control information\n * @data: user defined data\n *\n * Note, @vlan_etype, @vlan_tci, and @data are only valid if %FLOW_EXT\n * is set in &struct ethtool_rx_flow_spec @flow_type.\n * @h_dest is valid if %FLOW_MAC_EXT is set.\n */\nstruct ethtool_flow_ext {\n\t__u8\t\tpadding[2];\n\tunsigned char\th_dest[ETH_ALEN];\n\t__be16\t\tvlan_etype;\n\t__be16\t\tvlan_tci;\n\t__be32\t\tdata[2];\n};\n\n/**\n * struct ethtool_rx_flow_spec - classification rule for RX flows\n * @flow_type: Type of match to perform, e.g. %TCP_V4_FLOW\n * @h_u: Flow fields to match (dependent on @flow_type)\n * @h_ext: Additional fields to match\n * @m_u: Masks for flow field bits to be matched\n * @m_ext: Masks for additional field bits to be matched\n *\tNote, all additional fields must be ignored unless @flow_type\n *\tincludes the %FLOW_EXT or %FLOW_MAC_EXT flag\n *\t(see &struct ethtool_flow_ext description).\n * @ring_cookie: RX ring/queue index to deliver to, or %RX_CLS_FLOW_DISC\n *\tif packets should be discarded\n * @location: Location of rule in the table.  Locations must be\n *\tnumbered such that a flow matching multiple rules will be\n *\tclassified according to the first (lowest numbered) rule.\n */\nstruct ethtool_rx_flow_spec {\n\t__u32\t\tflow_type;\n\tunion ethtool_flow_union h_u;\n\tstruct ethtool_flow_ext h_ext;\n\tunion ethtool_flow_union m_u;\n\tstruct ethtool_flow_ext m_ext;\n\t__u64\t\tring_cookie;\n\t__u32\t\tlocation;\n};\n\n/**\n * struct ethtool_rxnfc - command to get or set RX flow classification rules\n * @cmd: Specific command number - %ETHTOOL_GRXFH, %ETHTOOL_SRXFH,\n *\t%ETHTOOL_GRXRINGS, %ETHTOOL_GRXCLSRLCNT, %ETHTOOL_GRXCLSRULE,\n *\t%ETHTOOL_GRXCLSRLALL, %ETHTOOL_SRXCLSRLDEL or %ETHTOOL_SRXCLSRLINS\n * @flow_type: Type of flow to be affected, e.g. %TCP_V4_FLOW\n * @data: Command-dependent value\n * @fs: Flow classification rule\n * @rule_cnt: Number of rules to be affected\n * @rule_locs: Array of used rule locations\n *\n * For %ETHTOOL_GRXFH and %ETHTOOL_SRXFH, @data is a bitmask indicating\n * the fields included in the flow hash, e.g. %RXH_IP_SRC.  The following\n * structure fields must not be used.\n *\n * For %ETHTOOL_GRXRINGS, @data is set to the number of RX rings/queues\n * on return.\n *\n * For %ETHTOOL_GRXCLSRLCNT, @rule_cnt is set to the number of defined\n * rules on return.  If @data is non-zero on return then it is the\n * size of the rule table, plus the flag %RX_CLS_LOC_SPECIAL if the\n * driver supports any special location values.  If that flag is not\n * set in @data then special location values should not be used.\n *\n * For %ETHTOOL_GRXCLSRULE, @fs.@location specifies the location of an\n * existing rule on entry and @fs contains the rule on return.\n *\n * For %ETHTOOL_GRXCLSRLALL, @rule_cnt specifies the array size of the\n * user buffer for @rule_locs on entry.  On return, @data is the size\n * of the rule table, @rule_cnt is the number of defined rules, and\n * @rule_locs contains the locations of the defined rules.  Drivers\n * must use the second parameter to get_rxnfc() instead of @rule_locs.\n *\n * For %ETHTOOL_SRXCLSRLINS, @fs specifies the rule to add or update.\n * @fs.@location either specifies the location to use or is a special\n * location value with %RX_CLS_LOC_SPECIAL flag set.  On return,\n * @fs.@location is the actual rule location.\n *\n * For %ETHTOOL_SRXCLSRLDEL, @fs.@location specifies the location of an\n * existing rule on entry.\n *\n * A driver supporting the special location values for\n * %ETHTOOL_SRXCLSRLINS may add the rule at any suitable unused\n * location, and may remove a rule at a later location (lower\n * priority) that matches exactly the same set of flows.  The special\n * values are: %RX_CLS_LOC_ANY, selecting any location;\n * %RX_CLS_LOC_FIRST, selecting the first suitable location (maximum\n * priority); and %RX_CLS_LOC_LAST, selecting the last suitable\n * location (minimum priority).  Additional special values may be\n * defined in future and drivers must return -%EINVAL for any\n * unrecognised value.\n */\nstruct ethtool_rxnfc {\n\t__u32\t\t\t\tcmd;\n\t__u32\t\t\t\tflow_type;\n\t__u64\t\t\t\tdata;\n\tstruct ethtool_rx_flow_spec\tfs;\n\t__u32\t\t\t\trule_cnt;\n\t__u32\t\t\t\trule_locs[0];\n};\n\n\n/**\n * struct ethtool_rxfh_indir - command to get or set RX flow hash indirection\n * @cmd: Specific command number - %ETHTOOL_GRXFHINDIR or %ETHTOOL_SRXFHINDIR\n * @size: On entry, the array size of the user buffer, which may be zero.\n *\tOn return from %ETHTOOL_GRXFHINDIR, the array size of the hardware\n *\tindirection table.\n * @ring_index: RX ring/queue index for each hash value\n *\n * For %ETHTOOL_GRXFHINDIR, a @size of zero means that only the size\n * should be returned.  For %ETHTOOL_SRXFHINDIR, a @size of zero means\n * the table should be reset to default values.  This last feature\n * is not supported by the original implementations.\n */\nstruct ethtool_rxfh_indir {\n\t__u32\tcmd;\n\t__u32\tsize;\n\t__u32\tring_index[0];\n};\n\n/**\n * struct ethtool_rx_ntuple_flow_spec - specification for RX flow filter\n * @flow_type: Type of match to perform, e.g. %TCP_V4_FLOW\n * @h_u: Flow field values to match (dependent on @flow_type)\n * @m_u: Masks for flow field value bits to be ignored\n * @vlan_tag: VLAN tag to match\n * @vlan_tag_mask: Mask for VLAN tag bits to be ignored\n * @data: Driver-dependent data to match\n * @data_mask: Mask for driver-dependent data bits to be ignored\n * @action: RX ring/queue index to deliver to (non-negative) or other action\n *\t(negative, e.g. %ETHTOOL_RXNTUPLE_ACTION_DROP)\n *\n * For flow types %TCP_V4_FLOW, %UDP_V4_FLOW and %SCTP_V4_FLOW, where\n * a field value and mask are both zero this is treated as if all mask\n * bits are set i.e. the field is ignored.\n */\nstruct ethtool_rx_ntuple_flow_spec {\n\t__u32\t\t flow_type;\n\tunion {\n\t\tstruct ethtool_tcpip4_spec\t\ttcp_ip4_spec;\n\t\tstruct ethtool_tcpip4_spec\t\tudp_ip4_spec;\n\t\tstruct ethtool_tcpip4_spec\t\tsctp_ip4_spec;\n\t\tstruct ethtool_ah_espip4_spec\t\tah_ip4_spec;\n\t\tstruct ethtool_ah_espip4_spec\t\tesp_ip4_spec;\n\t\tstruct ethtool_usrip4_spec\t\tusr_ip4_spec;\n\t\tstruct ethhdr\t\t\t\tether_spec;\n\t\t__u8\t\t\t\t\thdata[72];\n\t} h_u, m_u;\n\n\t__u16\t        vlan_tag;\n\t__u16\t        vlan_tag_mask;\n\t__u64\t\tdata;\n\t__u64\t\tdata_mask;\n\n\t__s32\t\taction;\n#define ETHTOOL_RXNTUPLE_ACTION_DROP\t(-1)\t/* drop packet */\n#define ETHTOOL_RXNTUPLE_ACTION_CLEAR\t(-2)\t/* clear filter */\n};\n\n/**\n * struct ethtool_rx_ntuple - command to set or clear RX flow filter\n * @cmd: Command number - %ETHTOOL_SRXNTUPLE\n * @fs: Flow filter specification\n */\nstruct ethtool_rx_ntuple {\n\t__u32\t\t\t\t\tcmd;\n\tstruct ethtool_rx_ntuple_flow_spec\tfs;\n};\n\n#define ETHTOOL_FLASH_MAX_FILENAME\t128\nenum ethtool_flash_op_type {\n\tETHTOOL_FLASH_ALL_REGIONS\t= 0,\n};\n\n/* for passing firmware flashing related parameters */\nstruct ethtool_flash {\n\t__u32\tcmd;\n\t__u32\tregion;\n\tchar\tdata[ETHTOOL_FLASH_MAX_FILENAME];\n};\n\n/**\n * struct ethtool_dump - used for retrieving, setting device dump\n * @cmd: Command number - %ETHTOOL_GET_DUMP_FLAG, %ETHTOOL_GET_DUMP_DATA, or\n * \t%ETHTOOL_SET_DUMP\n * @version: FW version of the dump, filled in by driver\n * @flag: driver dependent flag for dump setting, filled in by driver during\n *        get and filled in by ethtool for set operation.\n *        flag must be initialized by macro ETH_FW_DUMP_DISABLE value when\n *        firmware dump is disabled.\n * @len: length of dump data, used as the length of the user buffer on entry to\n * \t %ETHTOOL_GET_DUMP_DATA and this is returned as dump length by driver\n * \t for %ETHTOOL_GET_DUMP_FLAG command\n * @data: data collected for get dump data operation\n */\n\n#define ETH_FW_DUMP_DISABLE 0\n\nstruct ethtool_dump {\n\t__u32\tcmd;\n\t__u32\tversion;\n\t__u32\tflag;\n\t__u32\tlen;\n\t__u8\tdata[0];\n};\n\n/* for returning and changing feature sets */\n\n/**\n * struct ethtool_get_features_block - block with state of 32 features\n * @available: mask of changeable features\n * @requested: mask of features requested to be enabled if possible\n * @active: mask of currently enabled features\n * @never_changed: mask of features not changeable for any device\n */\nstruct ethtool_get_features_block {\n\t__u32\tavailable;\n\t__u32\trequested;\n\t__u32\tactive;\n\t__u32\tnever_changed;\n};\n\n/**\n * struct ethtool_gfeatures - command to get state of device's features\n * @cmd: command number = %ETHTOOL_GFEATURES\n * @size: in: number of elements in the features[] array;\n *       out: number of elements in features[] needed to hold all features\n * @features: state of features\n */\nstruct ethtool_gfeatures {\n\t__u32\tcmd;\n\t__u32\tsize;\n\tstruct ethtool_get_features_block features[0];\n};\n\n/**\n * struct ethtool_set_features_block - block with request for 32 features\n * @valid: mask of features to be changed\n * @requested: values of features to be changed\n */\nstruct ethtool_set_features_block {\n\t__u32\tvalid;\n\t__u32\trequested;\n};\n\n/**\n * struct ethtool_sfeatures - command to request change in device's features\n * @cmd: command number = %ETHTOOL_SFEATURES\n * @size: array size of the features[] array\n * @features: feature change masks\n */\nstruct ethtool_sfeatures {\n\t__u32\tcmd;\n\t__u32\tsize;\n\tstruct ethtool_set_features_block features[0];\n};\n\n/**\n * struct ethtool_ts_info - holds a device's timestamping and PHC association\n * @cmd: command number = %ETHTOOL_GET_TS_INFO\n * @so_timestamping: bit mask of the sum of the supported SO_TIMESTAMPING flags\n * @phc_index: device index of the associated PHC, or -1 if there is none\n * @tx_types: bit mask of the supported hwtstamp_tx_types enumeration values\n * @rx_filters: bit mask of the supported hwtstamp_rx_filters enumeration values\n *\n * The bits in the 'tx_types' and 'rx_filters' fields correspond to\n * the 'hwtstamp_tx_types' and 'hwtstamp_rx_filters' enumeration values,\n * respectively.  For example, if the device supports HWTSTAMP_TX_ON,\n * then (1 << HWTSTAMP_TX_ON) in 'tx_types' will be set.\n */\nstruct ethtool_ts_info {\n\t__u32\tcmd;\n\t__u32\tso_timestamping;\n\t__s32\tphc_index;\n\t__u32\ttx_types;\n\t__u32\ttx_reserved[3];\n\t__u32\trx_filters;\n\t__u32\trx_reserved[3];\n};\n\n/*\n * %ETHTOOL_SFEATURES changes features present in features[].valid to the\n * values of corresponding bits in features[].requested. Bits in .requested\n * not set in .valid or not changeable are ignored.\n *\n * Returns %EINVAL when .valid contains undefined or never-changeable bits\n * or size is not equal to required number of features words (32-bit blocks).\n * Returns >= 0 if request was completed; bits set in the value mean:\n *   %ETHTOOL_F_UNSUPPORTED - there were bits set in .valid that are not\n *\tchangeable (not present in %ETHTOOL_GFEATURES' features[].available)\n *\tthose bits were ignored.\n *   %ETHTOOL_F_WISH - some or all changes requested were recorded but the\n *      resulting state of bits masked by .valid is not equal to .requested.\n *      Probably there are other device-specific constraints on some features\n *      in the set. When %ETHTOOL_F_UNSUPPORTED is set, .valid is considered\n *      here as though ignored bits were cleared.\n *   %ETHTOOL_F_COMPAT - some or all changes requested were made by calling\n *      compatibility functions. Requested offload state cannot be properly\n *      managed by kernel.\n *\n * Meaning of bits in the masks are obtained by %ETHTOOL_GSSET_INFO (number of\n * bits in the arrays - always multiple of 32) and %ETHTOOL_GSTRINGS commands\n * for ETH_SS_FEATURES string set. First entry in the table corresponds to least\n * significant bit in features[0] fields. Empty strings mark undefined features.\n */\nenum ethtool_sfeatures_retval_bits {\n\tETHTOOL_F_UNSUPPORTED__BIT,\n\tETHTOOL_F_WISH__BIT,\n\tETHTOOL_F_COMPAT__BIT,\n};\n\n#define ETHTOOL_F_UNSUPPORTED   (1 << ETHTOOL_F_UNSUPPORTED__BIT)\n#define ETHTOOL_F_WISH          (1 << ETHTOOL_F_WISH__BIT)\n#define ETHTOOL_F_COMPAT        (1 << ETHTOOL_F_COMPAT__BIT)\n\n\n/* CMDs currently supported */\n#define ETHTOOL_GSET\t\t0x00000001 /* Get settings. */\n#define ETHTOOL_SSET\t\t0x00000002 /* Set settings. */\n#define ETHTOOL_GDRVINFO\t0x00000003 /* Get driver info. */\n#define ETHTOOL_GREGS\t\t0x00000004 /* Get NIC registers. */\n#define ETHTOOL_GWOL\t\t0x00000005 /* Get wake-on-lan options. */\n#define ETHTOOL_SWOL\t\t0x00000006 /* Set wake-on-lan options. */\n#define ETHTOOL_GMSGLVL\t\t0x00000007 /* Get driver message level */\n#define ETHTOOL_SMSGLVL\t\t0x00000008 /* Set driver msg level. */\n#define ETHTOOL_NWAY_RST\t0x00000009 /* Restart autonegotiation. */\n/* Get link status for host, i.e. whether the interface *and* the\n * physical port (if there is one) are up (ethtool_value). */\n#define ETHTOOL_GLINK\t\t0x0000000a\n#define ETHTOOL_GEEPROM\t\t0x0000000b /* Get EEPROM data */\n#define ETHTOOL_SEEPROM\t\t0x0000000c /* Set EEPROM data. */\n#define ETHTOOL_GCOALESCE\t0x0000000e /* Get coalesce config */\n#define ETHTOOL_SCOALESCE\t0x0000000f /* Set coalesce config. */\n#define ETHTOOL_GRINGPARAM\t0x00000010 /* Get ring parameters */\n#define ETHTOOL_SRINGPARAM\t0x00000011 /* Set ring parameters. */\n#define ETHTOOL_GPAUSEPARAM\t0x00000012 /* Get pause parameters */\n#define ETHTOOL_SPAUSEPARAM\t0x00000013 /* Set pause parameters. */\n#define ETHTOOL_GRXCSUM\t\t0x00000014 /* Get RX hw csum enable (ethtool_value) */\n#define ETHTOOL_SRXCSUM\t\t0x00000015 /* Set RX hw csum enable (ethtool_value) */\n#define ETHTOOL_GTXCSUM\t\t0x00000016 /* Get TX hw csum enable (ethtool_value) */\n#define ETHTOOL_STXCSUM\t\t0x00000017 /* Set TX hw csum enable (ethtool_value) */\n#define ETHTOOL_GSG\t\t0x00000018 /* Get scatter-gather enable\n\t\t\t\t\t    * (ethtool_value) */\n#define ETHTOOL_SSG\t\t0x00000019 /* Set scatter-gather enable\n\t\t\t\t\t    * (ethtool_value). */\n#define ETHTOOL_TEST\t\t0x0000001a /* execute NIC self-test. */\n#define ETHTOOL_GSTRINGS\t0x0000001b /* get specified string set */\n#define ETHTOOL_PHYS_ID\t\t0x0000001c /* identify the NIC */\n#define ETHTOOL_GSTATS\t\t0x0000001d /* get NIC-specific statistics */\n#define ETHTOOL_GTSO\t\t0x0000001e /* Get TSO enable (ethtool_value) */\n#define ETHTOOL_STSO\t\t0x0000001f /* Set TSO enable (ethtool_value) */\n#define ETHTOOL_GPERMADDR\t0x00000020 /* Get permanent hardware address */\n#define ETHTOOL_GUFO\t\t0x00000021 /* Get UFO enable (ethtool_value) */\n#define ETHTOOL_SUFO\t\t0x00000022 /* Set UFO enable (ethtool_value) */\n#define ETHTOOL_GGSO\t\t0x00000023 /* Get GSO enable (ethtool_value) */\n#define ETHTOOL_SGSO\t\t0x00000024 /* Set GSO enable (ethtool_value) */\n#define ETHTOOL_GFLAGS\t\t0x00000025 /* Get flags bitmap(ethtool_value) */\n#define ETHTOOL_SFLAGS\t\t0x00000026 /* Set flags bitmap(ethtool_value) */\n#define ETHTOOL_GPFLAGS\t\t0x00000027 /* Get driver-private flags bitmap */\n#define ETHTOOL_SPFLAGS\t\t0x00000028 /* Set driver-private flags bitmap */\n\n#define ETHTOOL_GRXFH\t\t0x00000029 /* Get RX flow hash configuration */\n#define ETHTOOL_SRXFH\t\t0x0000002a /* Set RX flow hash configuration */\n#define ETHTOOL_GGRO\t\t0x0000002b /* Get GRO enable (ethtool_value) */\n#define ETHTOOL_SGRO\t\t0x0000002c /* Set GRO enable (ethtool_value) */\n#define ETHTOOL_GRXRINGS\t0x0000002d /* Get RX rings available for LB */\n#define ETHTOOL_GRXCLSRLCNT\t0x0000002e /* Get RX class rule count */\n#define ETHTOOL_GRXCLSRULE\t0x0000002f /* Get RX classification rule */\n#define ETHTOOL_GRXCLSRLALL\t0x00000030 /* Get all RX classification rule */\n#define ETHTOOL_SRXCLSRLDEL\t0x00000031 /* Delete RX classification rule */\n#define ETHTOOL_SRXCLSRLINS\t0x00000032 /* Insert RX classification rule */\n#define ETHTOOL_FLASHDEV\t0x00000033 /* Flash firmware to device */\n#define ETHTOOL_RESET\t\t0x00000034 /* Reset hardware */\n#define ETHTOOL_SRXNTUPLE\t0x00000035 /* Add an n-tuple filter to device */\n#define ETHTOOL_GRXNTUPLE\t0x00000036 /* deprecated */\n#define ETHTOOL_GSSET_INFO\t0x00000037 /* Get string set info */\n#define ETHTOOL_GRXFHINDIR\t0x00000038 /* Get RX flow hash indir'n table */\n#define ETHTOOL_SRXFHINDIR\t0x00000039 /* Set RX flow hash indir'n table */\n\n#define ETHTOOL_GFEATURES\t0x0000003a /* Get device offload settings */\n#define ETHTOOL_SFEATURES\t0x0000003b /* Change device offload settings */\n#define ETHTOOL_GCHANNELS\t0x0000003c /* Get no of channels */\n#define ETHTOOL_SCHANNELS\t0x0000003d /* Set no of channels */\n#define ETHTOOL_SET_DUMP\t0x0000003e /* Set dump settings */\n#define ETHTOOL_GET_DUMP_FLAG\t0x0000003f /* Get dump settings */\n#define ETHTOOL_GET_DUMP_DATA\t0x00000040 /* Get dump data */\n#define ETHTOOL_GET_TS_INFO\t0x00000041 /* Get time stamping and PHC info */\n#define ETHTOOL_GMODULEINFO\t0x00000042 /* Get plug-in module information */\n#define ETHTOOL_GMODULEEEPROM\t0x00000043 /* Get plug-in module eeprom */\n#define ETHTOOL_GEEE\t\t0x00000044 /* Get EEE settings */\n#define ETHTOOL_SEEE\t\t0x00000045 /* Set EEE settings */\n\n/* compatibility with older code */\n#define SPARC_ETH_GSET\t\tETHTOOL_GSET\n#define SPARC_ETH_SSET\t\tETHTOOL_SSET\n\n/* Indicates what features are supported by the interface. */\n#define SUPPORTED_10baseT_Half\t\t(1 << 0)\n#define SUPPORTED_10baseT_Full\t\t(1 << 1)\n#define SUPPORTED_100baseT_Half\t\t(1 << 2)\n#define SUPPORTED_100baseT_Full\t\t(1 << 3)\n#define SUPPORTED_1000baseT_Half\t(1 << 4)\n#define SUPPORTED_1000baseT_Full\t(1 << 5)\n#define SUPPORTED_Autoneg\t\t(1 << 6)\n#define SUPPORTED_TP\t\t\t(1 << 7)\n#define SUPPORTED_AUI\t\t\t(1 << 8)\n#define SUPPORTED_MII\t\t\t(1 << 9)\n#define SUPPORTED_FIBRE\t\t\t(1 << 10)\n#define SUPPORTED_BNC\t\t\t(1 << 11)\n#define SUPPORTED_10000baseT_Full\t(1 << 12)\n#define SUPPORTED_Pause\t\t\t(1 << 13)\n#define SUPPORTED_Asym_Pause\t\t(1 << 14)\n#define SUPPORTED_2500baseX_Full\t(1 << 15)\n#define SUPPORTED_Backplane\t\t(1 << 16)\n#define SUPPORTED_1000baseKX_Full\t(1 << 17)\n#define SUPPORTED_10000baseKX4_Full\t(1 << 18)\n#define SUPPORTED_10000baseKR_Full\t(1 << 19)\n#define SUPPORTED_10000baseR_FEC\t(1 << 20)\n#define SUPPORTED_20000baseMLD2_Full\t(1 << 21)\n#define SUPPORTED_20000baseKR2_Full\t(1 << 22)\n#define SUPPORTED_40000baseKR4_Full\t(1 << 23)\n#define SUPPORTED_40000baseCR4_Full\t(1 << 24)\n#define SUPPORTED_40000baseSR4_Full\t(1 << 25)\n#define SUPPORTED_40000baseLR4_Full\t(1 << 26)\n\n/* Indicates what features are advertised by the interface. */\n#define ADVERTISED_10baseT_Half\t\t(1 << 0)\n#define ADVERTISED_10baseT_Full\t\t(1 << 1)\n#define ADVERTISED_100baseT_Half\t(1 << 2)\n#define ADVERTISED_100baseT_Full\t(1 << 3)\n#define ADVERTISED_1000baseT_Half\t(1 << 4)\n#define ADVERTISED_1000baseT_Full\t(1 << 5)\n#define ADVERTISED_Autoneg\t\t(1 << 6)\n#define ADVERTISED_TP\t\t\t(1 << 7)\n#define ADVERTISED_AUI\t\t\t(1 << 8)\n#define ADVERTISED_MII\t\t\t(1 << 9)\n#define ADVERTISED_FIBRE\t\t(1 << 10)\n#define ADVERTISED_BNC\t\t\t(1 << 11)\n#define ADVERTISED_10000baseT_Full\t(1 << 12)\n#define ADVERTISED_Pause\t\t(1 << 13)\n#define ADVERTISED_Asym_Pause\t\t(1 << 14)\n#define ADVERTISED_2500baseX_Full\t(1 << 15)\n#define ADVERTISED_Backplane\t\t(1 << 16)\n#define ADVERTISED_1000baseKX_Full\t(1 << 17)\n#define ADVERTISED_10000baseKX4_Full\t(1 << 18)\n#define ADVERTISED_10000baseKR_Full\t(1 << 19)\n#define ADVERTISED_10000baseR_FEC\t(1 << 20)\n#define ADVERTISED_20000baseMLD2_Full\t(1 << 21)\n#define ADVERTISED_20000baseKR2_Full\t(1 << 22)\n#define ADVERTISED_40000baseKR4_Full\t(1 << 23)\n#define ADVERTISED_40000baseCR4_Full\t(1 << 24)\n#define ADVERTISED_40000baseSR4_Full\t(1 << 25)\n#define ADVERTISED_40000baseLR4_Full\t(1 << 26)\n\n/* The following are all involved in forcing a particular link\n * mode for the device for setting things.  When getting the\n * devices settings, these indicate the current mode and whether\n * it was forced up into this mode or autonegotiated.\n */\n\n/* The forced speed, 10Mb, 100Mb, gigabit, 2.5Gb, 10GbE. */\n#define SPEED_10\t\t10\n#define SPEED_100\t\t100\n#define SPEED_1000\t\t1000\n#define SPEED_2500\t\t2500\n#define SPEED_10000\t\t10000\n#define SPEED_UNKNOWN\t\t-1\n\n/* Duplex, half or full. */\n#define DUPLEX_HALF\t\t0x00\n#define DUPLEX_FULL\t\t0x01\n#define DUPLEX_UNKNOWN\t\t0xff\n\n/* Which connector port. */\n#define PORT_TP\t\t\t0x00\n#define PORT_AUI\t\t0x01\n#define PORT_MII\t\t0x02\n#define PORT_FIBRE\t\t0x03\n#define PORT_BNC\t\t0x04\n#define PORT_DA\t\t\t0x05\n#define PORT_NONE\t\t0xef\n#define PORT_OTHER\t\t0xff\n\n/* Which transceiver to use. */\n#define XCVR_INTERNAL\t\t0x00\n#define XCVR_EXTERNAL\t\t0x01\n#define XCVR_DUMMY1\t\t0x02\n#define XCVR_DUMMY2\t\t0x03\n#define XCVR_DUMMY3\t\t0x04\n\n/* Enable or disable autonegotiation.  If this is set to enable,\n * the forced link modes above are completely ignored.\n */\n#define AUTONEG_DISABLE\t\t0x00\n#define AUTONEG_ENABLE\t\t0x01\n\n/* MDI or MDI-X status/control - if MDI/MDI_X/AUTO is set then\n * the driver is required to renegotiate link\n */\n#define ETH_TP_MDI_INVALID\t0x00 /* status: unknown; control: unsupported */\n#define ETH_TP_MDI\t\t0x01 /* status: MDI;     control: force MDI */\n#define ETH_TP_MDI_X\t\t0x02 /* status: MDI-X;   control: force MDI-X */\n#define ETH_TP_MDI_AUTO\t\t0x03 /*                  control: auto-select */\n\n/* Wake-On-Lan options. */\n#define WAKE_PHY\t\t(1 << 0)\n#define WAKE_UCAST\t\t(1 << 1)\n#define WAKE_MCAST\t\t(1 << 2)\n#define WAKE_BCAST\t\t(1 << 3)\n#define WAKE_ARP\t\t(1 << 4)\n#define WAKE_MAGIC\t\t(1 << 5)\n#define WAKE_MAGICSECURE\t(1 << 6) /* only meaningful if WAKE_MAGIC */\n\n/* L2-L4 network traffic flow types */\n#define\tTCP_V4_FLOW\t0x01\t/* hash or spec (tcp_ip4_spec) */\n#define\tUDP_V4_FLOW\t0x02\t/* hash or spec (udp_ip4_spec) */\n#define\tSCTP_V4_FLOW\t0x03\t/* hash or spec (sctp_ip4_spec) */\n#define\tAH_ESP_V4_FLOW\t0x04\t/* hash only */\n#define\tTCP_V6_FLOW\t0x05\t/* hash only */\n#define\tUDP_V6_FLOW\t0x06\t/* hash only */\n#define\tSCTP_V6_FLOW\t0x07\t/* hash only */\n#define\tAH_ESP_V6_FLOW\t0x08\t/* hash only */\n#define\tAH_V4_FLOW\t0x09\t/* hash or spec (ah_ip4_spec) */\n#define\tESP_V4_FLOW\t0x0a\t/* hash or spec (esp_ip4_spec) */\n#define\tAH_V6_FLOW\t0x0b\t/* hash only */\n#define\tESP_V6_FLOW\t0x0c\t/* hash only */\n#define\tIP_USER_FLOW\t0x0d\t/* spec only (usr_ip4_spec) */\n#define\tIPV4_FLOW\t0x10\t/* hash only */\n#define\tIPV6_FLOW\t0x11\t/* hash only */\n#define\tETHER_FLOW\t0x12\t/* spec only (ether_spec) */\n/* Flag to enable additional fields in struct ethtool_rx_flow_spec */\n#define\tFLOW_EXT\t0x80000000\n#define\tFLOW_MAC_EXT\t0x40000000\n\n/* L3-L4 network traffic flow hash options */\n#define\tRXH_L2DA\t(1 << 1)\n#define\tRXH_VLAN\t(1 << 2)\n#define\tRXH_L3_PROTO\t(1 << 3)\n#define\tRXH_IP_SRC\t(1 << 4)\n#define\tRXH_IP_DST\t(1 << 5)\n#define\tRXH_L4_B_0_1\t(1 << 6) /* src port in case of TCP/UDP/SCTP */\n#define\tRXH_L4_B_2_3\t(1 << 7) /* dst port in case of TCP/UDP/SCTP */\n#define\tRXH_DISCARD\t(1 << 31)\n\n#define\tRX_CLS_FLOW_DISC\t0xffffffffffffffffULL\n\n/* Special RX classification rule insert location values */\n#define RX_CLS_LOC_SPECIAL\t0x80000000\t/* flag */\n#define RX_CLS_LOC_ANY\t\t0xffffffff\n#define RX_CLS_LOC_FIRST\t0xfffffffe\n#define RX_CLS_LOC_LAST\t\t0xfffffffd\n\n/* EEPROM Standards for plug in modules */\n#define ETH_MODULE_SFF_8079\t\t0x1\n#define ETH_MODULE_SFF_8079_LEN\t\t256\n#define ETH_MODULE_SFF_8472\t\t0x2\n#define ETH_MODULE_SFF_8472_LEN\t\t512\n\n/* Reset flags */\n/* The reset() operation must clear the flags for the components which\n * were actually reset.  On successful return, the flags indicate the\n * components which were not reset, either because they do not exist\n * in the hardware or because they cannot be reset independently.  The\n * driver must never reset any components that were not requested.\n */\nenum ethtool_reset_flags {\n\t/* These flags represent components dedicated to the interface\n\t * the command is addressed to.  Shift any flag left by\n\t * ETH_RESET_SHARED_SHIFT to reset a shared component of the\n\t * same type.\n\t */\n\tETH_RESET_MGMT\t\t= 1 << 0,\t/* Management processor */\n\tETH_RESET_IRQ\t\t= 1 << 1,\t/* Interrupt requester */\n\tETH_RESET_DMA\t\t= 1 << 2,\t/* DMA engine */\n\tETH_RESET_FILTER\t= 1 << 3,\t/* Filtering/flow direction */\n\tETH_RESET_OFFLOAD\t= 1 << 4,\t/* Protocol offload */\n\tETH_RESET_MAC\t\t= 1 << 5,\t/* Media access controller */\n\tETH_RESET_PHY\t\t= 1 << 6,\t/* Transceiver/PHY */\n\tETH_RESET_RAM\t\t= 1 << 7,\t/* RAM shared between\n\t\t\t\t\t\t * multiple components */\n\n\tETH_RESET_DEDICATED\t= 0x0000ffff,\t/* All components dedicated to\n\t\t\t\t\t\t * this interface */\n\tETH_RESET_ALL\t\t= 0xffffffff,\t/* All components used by this\n\t\t\t\t\t\t * interface, even if shared */\n};\n#define ETH_RESET_SHARED_SHIFT\t16\n\n#endif /* _LINUX_ETHTOOL_H */\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/cdc_mbim.txt",
    "content": "root@ZhuoTK:/# dmesg\r\n[  788.920000] usb 1-1.3: new high-speed USB device number 4 using ehci-platform\r\n[  789.160000] cdc_mbim 1-1.3:1.4: cdc-wdm0: USB WDM device\r\n[  789.170000] cdc_mbim 1-1.3:1.4 wwan0: register 'cdc_mbim' at usb-101c0000.ehci-1.3, CDC MBIM, a2:58:dc:4d:dd:ca\r\n\r\nroot@ZhuoTK:/# quectel-CM -s cmnet &\r\n[04-13_05:24:38:767] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_05:24:38:769] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x004\r\n[04-13_05:24:38:771] Auto find qmichannel = /dev/cdc-wdm0\r\n[04-13_05:24:38:771] Auto find usbnet_adapter = wwan0\r\n[04-13_05:24:38:771] netcard driver = cdc_mbim, driver version = 22-Aug-2005\r\n[04-13_05:24:38:771] Modem works in MBIM mode\r\n[04-13_05:24:38:779] cdc_wdm_fd = 7\r\n[04-13_05:24:38:779] mbim_open_device()\r\n[04-13_05:24:39:624] mbim_device_caps_query()\r\n[04-13_05:24:39:656] DeviceId:     866758045439136\r\n[04-13_05:24:39:656] FirmwareInfo: EC25EFAR06A11M4G\r\n[04-13_05:24:39:656] HardwareInfo: QUECTEL Mobile Broadband Modul\r\n[04-13_05:24:39:657] mbim_device_services_query()\r\n[04-13_05:24:39:688] mbim_set_radio_state( 1 )\r\n[04-13_05:24:39:721] HwRadioState: 1, SwRadioState: 1\r\n[04-13_05:24:39:721] mbim_subscriber_status_query()\r\n[04-13_05:24:39:784] SubscriberId: 460028563800461\r\n[04-13_05:24:39:784] SimIccId:     89860015120716380461\r\n[04-13_05:24:39:785] SubscriberReadyState NotInitialized -> Initialized \r\n[04-13_05:24:39:785] mbim_register_state_query()\r\n[04-13_05:24:39:816] RegisterState Unknown -> Home \r\n[04-13_05:24:39:816] mbim_packet_service_query()\r\n[04-13_05:24:39:848] PacketServiceState Unknown -> Attached \r\n[04-13_05:24:39:848] mbim_query_connect(sessionID=0)\r\n[04-13_05:24:39:880] ActivationState Unknown -> Deactivated \r\n[04-13_05:24:39:881] ifconfig wwan0 0.0.0.0\r\n[04-13_05:24:39:899] ifconfig wwan0 down\r\n[04-13_05:24:39:913] mbim_set_connect(onoff=1, sessionID=0)\r\n[04-13_05:24:39:976] ActivationState Deactivated -> Activated \r\n[04-13_05:24:39:977] mbim_ip_config(sessionID=0)\r\n[04-13_05:24:40:008] < SessionId = 0\r\n[04-13_05:24:40:008] < IPv4ConfigurationAvailable = 0xf\r\n[04-13_05:24:40:008] < IPv6ConfigurationAvailable = 0x0\r\n[04-13_05:24:40:008] < IPv4AddressCount = 0x1\r\n[04-13_05:24:40:008] < IPv4AddressOffset = 0x3c\r\n[04-13_05:24:40:009] < IPv6AddressCount = 0x0\r\n[04-13_05:24:40:009] < IPv6AddressOffset = 0x0\r\n[04-13_05:24:40:009] < IPv4 = 10.129.90.29/30\r\n[04-13_05:24:40:009] < gw = 10.129.90.30\r\n[04-13_05:24:40:009] < dns1 = 211.138.180.2\r\n[04-13_05:24:40:009  < dns2 = 211.138.180.3\r\n[04-13_05:24:40:009] < ipv4 mtu = 1500\r\n[04-13_05:24:40:041] ifconfig wwan0 up\r\n[04-13_05:24:40:063] ip -4 address flush dev wwan0\r\n[04-13_05:24:40:073] ip -4 address add 10.129.90.29/30 dev wwan0\r\n[04-13_05:24:40:084] ip -4 route add default via 10.129.90.30 dev wwan0\r\n\r\nroot@ZhuoTK:/# ifconfig wwan0\r\nwwan0     Link encap:Ethernet  HWaddr A2:58:DC:4D:DD:CA  \r\n          inet addr:10.129.90.29  Bcast:0.0.0.0  Mask:255.255.255.252\r\n          inet6 addr: fe80::a058:dcff:fe4d:ddca/64 Scope:Link\r\n          UP BROADCAST RUNNING NOARP MULTICAST  MTU:1500  Metric:1\r\n          RX packets:0 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:5 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:0 (0.0 B)  TX bytes:380 (380.0 B)\r\n\r\nroot@ZhuoTK:/# ip ro show\r\ndefault via 10.129.90.30 dev wwan0 \r\n10.129.90.28/30 dev wwan0  proto kernel  scope link  src 10.129.90.29 \r\n192.168.1.0/24 dev br-lan  proto kernel  scope link  src 192.168.1.251 \r\n\r\nroot@ZhuoTK:/# ping www.qq.com\r\nPING www.qq.com (183.194.238.117): 56 data bytes\r\n64 bytes from 183.194.238.117: seq=0 ttl=53 time=58.674 ms"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/cdc_mbim_vlan.txt",
    "content": "root@ZhuoTK:/# dmesg\r\n[  788.920000] usb 1-1.3: new high-speed USB device number 4 using ehci-platform\r\n[  789.160000] cdc_mbim 1-1.3:1.4: cdc-wdm0: USB WDM device\r\n[  789.170000] cdc_mbim 1-1.3:1.4 wwan0: register 'cdc_mbim' at usb-101c0000.ehci-1.3, CDC MBIM, a2:58:dc:4d:dd:ca\r\n\r\nroot@ZhuoTK:/#  ip link add link wwan0 name wwan0.1 type vlan id 1\r\nroot@ZhuoTK:/#  ip link add link wwan0 name wwan0.2 type vlan id 2\r\nroot@ZhuoTK:/# ifconfig wwan0.1\r\nwwan0.1   Link encap:Ethernet  HWaddr A2:58:DC:4D:DD:CA  \r\n          BROADCAST NOARP MULTICAST  MTU:1500  Metric:1\r\n          RX packets:0 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:0 \r\n          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)\r\n\r\nroot@ZhuoTK:/# ifconfig wwan0.2\r\nwwan0.2   Link encap:Ethernet  HWaddr A2:58:DC:4D:DD:CA  \r\n          BROADCAST NOARP MULTICAST  MTU:1500  Metric:1\r\n          RX packets:0 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:0 \r\n          RX bytes:0 (0.0 B)  TX bytes:0 (0.0 B)\r\n\r\nroot@ZhuoTK:/# quectel-mbim-proxy &\r\nroot@ZhuoTK:/# [04-13_07:04:27:543] mbim_dev_fd=3\r\n[04-13_07:04:27:543] mbim_send_open_msg()\r\n[04-13_07:04:28:321] receive MBIM_OPEN_DONE, status=0\r\n[04-13_07:04:28:321] mbim_server_fd=4\r\n\r\nroot@ZhuoTK:/# quectel-CM -n 1 -s cmnet &\r\n[04-13_07:04:34:256] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_07:04:34:259] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x004\r\n[04-13_07:04:34:260] Auto find qmichannel = /dev/cdc-wdm0\r\n[04-13_07:04:34:260] Auto find usbnet_adapter = wwan0\r\n[04-13_07:04:34:260] netcard driver = cdc_mbim, driver version = 22-Aug-2005\r\n[04-13_07:04:34:261] mbim_qmap_mode = 4, vlan_id = 0x01, qmap_netcard = wwan0.1\r\n[04-13_07:04:34:261] Modem works in MBIM mode\r\n[04-13_07:04:34:261] handle_client_connect client_fd=5, client_idx=1\r\n[04-13_07:04:34:262] connect to quectel-mbim-proxy sockfd = 7\r\n[04-13_07:04:34:262] cdc_wdm_fd = 7\r\n[04-13_07:04:34:262] mbim_open_device()\r\n[04-13_07:04:35:106] mbim_device_caps_query()\r\n[04-13_07:04:35:139] DeviceId:     866758045439136\r\n[04-13_07:04:35:139] FirmwareInfo: EC25EFAR06A11M4G\r\n[04-13_07:04:35:139] HardwareInfo: QUECTEL Mobile Broadband Modul\r\n[04-13_07:04:35:139] mbim_device_services_query()\r\n[04-13_07:04:35:170] mbim_set_radio_state( 1 )\r\n[04-13_07:04:35:202] HwRadioState: 1, SwRadioState: 1\r\n[04-13_07:04:35:202] mbim_subscriber_status_query()\r\n[04-13_07:04:35:267] SubscriberId: 460028563800461\r\n[04-13_07:04:35:267] SimIccId:     89860015120716380461\r\n[04-13_07:04:35:267] SubscriberReadyState NotInitialized -> Initialized \r\n[04-13_07:04:35:267] mbim_register_state_query()\r\n[04-13_07:04:35:297] RegisterState Unknown -> Home \r\n[04-13_07:04:35:298] mbim_packet_service_query()\r\n[04-13_07:04:35:329] PacketServiceState Unknown -> Attached \r\n[04-13_07:04:35:330] mbim_query_connect(sessionID=1)\r\n[04-13_07:04:35:361] ActivationState Unknown -> Deactivated \r\n[04-13_07:04:35:362] ifconfig wwan0.1 0.0.0.0\r\n[04-13_07:04:35:373] ifconfig wwan0.1 down\r\n[04-13_07:04:35:383] mbim_set_connect(onoff=1, sessionID=1)\r\n[04-13_07:04:35:426] ActivationState Deactivated -> Activated \r\n[04-13_07:04:35:426] mbim_ip_config(sessionID=1)\r\n[04-13_07:04:35:457] < SessionId = 1\r\n[04-13_07:04:35:457] < IPv4ConfigurationAvailable = 0xf\r\n[04-13_07:04:35:457] < IPv6ConfigurationAvailable = 0x0\r\n[04-13_07:04:35:457] < IPv4AddressCount = 0x1\r\n[04-13_07:04:35:458] < IPv4AddressOffset = 0x3c\r\n[04-13_07:04:35:458] < IPv6AddressCount = 0x0\r\n[04-13_07:04:35:458] < IPv6AddressOffset = 0x0\r\n[04-13_07:04:35:458] < IPv4 = 10.129.90.29/30\r\n[04-13_07:04:35:458] < gw = 10.129.90.30\r\n[04-13_07:04:35:458] < dns1 = 211.138.180.2\r\n[04-13_07:04:35:458] < dns2 = 211.138.180.3\r\n[04-13_07:04:35:458] < ipv4 mtu = 1500\r\n[04-13_07:04:35:489] ifconfig wwan0 up\r\n[04-13_07:04:35:509] ifconfig wwan0.1 down\r\n[04-13_07:04:35:522] ifconfig wwan0.1 up\r\n[04-13_07:04:35:535] ip -4 address flush dev wwan0.1\r\n[04-13_07:04:35:545] ip -4 address add 10.129.90.29/30 dev wwan0.1\r\n[04-13_07:04:35:556] ip -4 route add default via 10.129.90.30 dev wwan0.1\r\n\r\nroot@ZhuoTK:/# quectel-CM -n 2 -s 4gnet &\r\n[04-13_07:04:45:150] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_07:04:45:152] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x004\r\n[04-13_07:04:45:154] Auto find qmichannel = /dev/cdc-wdm0\r\n[04-13_07:04:45:154] Auto find usbnet_adapter = wwan0\r\n[04-13_07:04:45:154] netcard driver = cdc_mbim, driver version = 22-Aug-2005\r\n[04-13_07:04:45:155] mbim_qmap_mode = 4, vlan_id = 0x02, qmap_netcard = wwan0.2\r\n[04-13_07:04:45:155] Modem works in MBIM mode\r\n[04-13_07:04:45:155] handle_client_connect client_fd=6, client_idx=2\r\n[04-13_07:04:45:156] connect to quectel-mbim-proxy sockfd = 7\r\n[04-13_07:04:45:156] cdc_wdm_fd = 7\r\n[04-13_07:04:45:156] mbim_open_device()\r\n[04-13_07:04:46:025] mbim_device_caps_query()\r\n[04-13_07:04:46:056] DeviceId:     866758045439136\r\n[04-13_07:04:46:056] FirmwareInfo: EC25EFAR06A11M4G\r\n[04-13_07:04:46:056] HardwareInfo: QUECTEL Mobile Broadband Modul\r\n[04-13_07:04:46:056] mbim_device_services_query()\r\n[04-13_07:04:46:088] mbim_set_radio_state( 1 )\r\n[04-13_07:04:46:119] HwRadioState: 1, SwRadioState: 1\r\n[04-13_07:04:46:119] mbim_subscriber_status_query()\r\n[04-13_07:04:46:183] SubscriberId: 460028563800461\r\n[04-13_07:04:46:184] SimIccId:     89860015120716380461\r\n[04-13_07:04:46:184] SubscriberReadyState NotInitialized -> Initialized \r\n[04-13_07:04:46:184] mbim_register_state_query()\r\n[04-13_07:04:46:216] RegisterState Unknown -> Home \r\n[04-13_07:04:46:216] mbim_packet_service_query()\r\n[04-13_07:04:46:248] PacketServiceState Unknown -> Attached \r\n[04-13_07:04:46:248] mbim_query_connect(sessionID=2)\r\n[04-13_07:04:46:280] ActivationState Unknown -> Deactivated \r\n[04-13_07:04:46:280] ifconfig wwan0.2 0.0.0.0\r\n[04-13_07:04:46:291] ifconfig wwan0.2 down\r\n[04-13_07:04:46:304] mbim_set_connect(onoff=1, sessionID=2)\r\n[04-13_07:04:46:504] ActivationState Deactivated -> Activated \r\n[04-13_07:04:46:505] mbim_ip_config(sessionID=2)\r\n[04-13_07:04:46:537] < SessionId = 2\r\n[04-13_07:04:46:537] < IPv4ConfigurationAvailable = 0xf\r\n[04-13_07:04:46:537] < IPv6ConfigurationAvailable = 0x0\r\n[04-13_07:04:46:538] < IPv4AddressCount = 0x1\r\n[04-13_07:04:46:538] < IPv4AddressOffset = 0x3c\r\n[04-13_07:04:46:538] < IPv6AddressCount = 0x0\r\n[04-13_07:04:46:538] < IPv6AddressOffset = 0x0\r\n[04-13_07:04:46:538] < IPv4 = 10.129.37.205/30\r\n[04-13_07:04:46:538] < gw = 10.129.37.206\r\n[04-13_07:04:46:538] < dns1 = 211.138.180.2\r\n[04-13_07:04:46:538] < dns2 = 211.138.180.3\r\n[04-13_07:04:46:538] < ipv4 mtu = 1500\r\n[04-13_07:04:46:569] ifconfig wwan0 up\r\n[04-13_07:04:46:579] ifconfig wwan0.2 up\r\n[04-13_07:04:46:592] ip -4 address flush dev wwan0.2\r\n[04-13_07:04:46:602] ip -4 address add 10.129.37.205/30 dev wwan0.2\r\n[04-13_07:04:46:613] ip -4 route add default via 10.129.37.206 dev wwan0.2\r\n\r\nroot@ZhuoTK:/# ifconfig wwan0.1\r\nwwan0.1   Link encap:Ethernet  HWaddr A2:58:DC:4D:DD:CA  \r\n          inet addr:10.129.90.29  Bcast:0.0.0.0  Mask:255.255.255.252\r\n          inet6 addr: fe80::a058:dcff:fe4d:ddca/64 Scope:Link\r\n          UP BROADCAST RUNNING NOARP MULTICAST  MTU:1500  Metric:1\r\n          RX packets:4 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:13 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:0 \r\n          RX bytes:304 (304.0 B)  TX bytes:1170 (1.1 KiB)\r\n\r\nroot@ZhuoTK:/# ifconfig wwan0.2\r\nwwan0.2   Link encap:Ethernet  HWaddr A2:58:DC:4D:DD:CA  \r\n          inet addr:10.129.37.205  Bcast:0.0.0.0  Mask:255.255.255.252\r\n          inet6 addr: fe80::a058:dcff:fe4d:ddca/64 Scope:Link\r\n          UP BROADCAST RUNNING NOARP MULTICAST  MTU:1500  Metric:1\r\n          RX packets:0 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:8 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:0 \r\n          RX bytes:0 (0.0 B)  TX bytes:720 (720.0 B)\r\n\r\nroot@ZhuoTK:/# ip ro del 8.8.8.8/32 \r\nRTNETLINK answers: No such process\r\nroot@ZhuoTK:/# ip ro add 8.8.8.8/32 dev wwan0.1\r\nroot@ZhuoTK:/# ping 8.8.8.8\r\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\r\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=98.584 ms\r\n\r\nroot@ZhuoTK:/# ip ro del 8.8.8.8/32 \r\nroot@ZhuoTK:/# ip ro del 8.8.8.8/32 \r\nRTNETLINK answers: No such process\r\nroot@ZhuoTK:/# ip ro add 8.8.8.8/32 dev wwan0.2\r\nroot@ZhuoTK:/# ping 8.8.8.8\r\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\r\n64 bytes from 8.8.8.8: seq=0 ttl=111 time=101.770 ms"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/ecm_ncm_rndis.txt",
    "content": "# ./quectel-CM -s cmnet &\n[04-21_17:35:14:362] Quectel_QConnectManager_Linux_V1.6.0.26\n[04-21_17:35:14:363] Find /sys/bus/usb/devices/2-4 idVendor=0x2c7c idProduct=0x8101, bus=0x002, dev=0x016\n[04-21_17:35:14:363] Auto find qmichannel = /dev/ttyUSB0\n[04-21_17:35:14:363] Auto find usbnet_adapter = usb0\n[04-21_17:35:14:363] netcard driver = cdc_ncm, driver version = 22-Aug-2005\n[04-21_17:35:14:363] Modem works in ECM_RNDIS_NCM mode\n[04-21_17:35:14:371] atc_fd = 7\n[04-21_17:35:14:371] AT> ATE0Q0V1\n[04-21_17:35:14:372] AT< RDATE0Q0V1\n[04-21_17:35:14:372] AT< COMMAND NOT SUPPORT\n[04-21_17:35:15:373] AT> AT+QCFG=\"usbnet\"\n[04-21_17:35:15:373] AT< +QCFG: \"usbnet\",5\n[04-21_17:35:15:373] AT< OK\n[04-21_17:35:15:373] AT> AT+QNETDEVCTL=?\n[04-21_17:35:15:374] AT< +QNETDEVCTL: (1-11),(0,1),(0,1)\n[04-21_17:35:15:374] AT< OK\n[04-21_17:35:15:374] AT> AT+CGREG=2\n[04-21_17:35:15:376] AT< OK\n[04-21_17:35:15:376] AT> AT+CEREG=2\n[04-21_17:35:15:381] AT< OK\n[04-21_17:35:15:381] AT> AT+C5GREG=2\n[04-21_17:35:15:384] AT< OK\n[04-21_17:35:15:384] AT> AT+QNETDEVSTATUS=?\n[04-21_17:35:15:385] AT< +QNETDEVSTATUS: (1-11)\n[04-21_17:35:15:385] AT< OK\n[04-21_17:35:15:385] AT> AT+QCFG=\"NAT\"\n[04-21_17:35:15:385] AT< +QCFG: \"nat\",0\n[04-21_17:35:15:385] AT< OK\n[04-21_17:35:15:385] AT> AT+CGMR\n[04-21_17:35:15:386] AT< RG801HEAAAR03A01M8G\n[04-21_17:35:15:386] AT< OK\n[04-21_17:35:15:386] AT> AT+CPIN?\n[04-21_17:35:15:388] AT< +CPIN: READY\n[04-21_17:35:15:388] AT< OK\n[04-21_17:35:15:389] AT> AT+QCCID\n[04-21_17:35:15:393] AT< +QCCID: 89860015120716380461\n[04-21_17:35:15:393] AT< OK\n[04-21_17:35:15:393] requestGetICCID 89860015120716380461\n[04-21_17:35:15:393] AT> AT+CIMI\n[04-21_17:35:15:409] AT< 460028563800461\n[04-21_17:35:15:409] AT< OK\n[04-21_17:35:15:409] requestGetIMSI 460028563800461\n[04-21_17:35:15:409] AT> AT+QICSGP=1\n[04-21_17:35:15:411] AT< +QICSGP: 1,1,\"cment\",\"\",\"\",0,,0,\n[04-21_17:35:15:411] AT< OK\n[04-21_17:35:15:411] AT> AT+QICSGP=1\n[04-21_17:35:15:415] AT< +QICSGP: 1,1,\"cment\",\"\",\"\",0,,0,\n[04-21_17:35:15:415] AT< OK\n[04-21_17:35:15:415] AT> AT+COPS=3,0;+COPS?;+COPS=3,1;+COPS?;+COPS=3,2;+COPS?\n[04-21_17:35:15:421] AT< +COPS: 0,0,\"CHINA  MOBILE\",12\n[04-21_17:35:15:421] AT< +COPS: 0,1,\"CMCC\",12\n[04-21_17:35:15:421] AT< +COPS: 0,2,\"46000\",12\n[04-21_17:35:15:421] AT< OK\n[04-21_17:35:15:421] AT> AT+C5GREG?\n[04-21_17:35:15:424] AT< +C5GREG: 2,1,\"46550B\",\"0000000170C23000\",11,1,\"01\"\n[04-21_17:35:15:424] AT< OK\n[04-21_17:35:15:424] AT> at+cops?\n[04-21_17:35:15:427] AT< +COPS: 0,2,\"46000\",12\n[04-21_17:35:15:427] AT< OK\n[04-21_17:35:15:427] AT> at+qeng=\"servingcell\"\n[04-21_17:35:15:441] AT< +QENG: \"servingcell\",\"NOCONN\",\"NR5G-SA\",\"TDD\",460,00,170C23000,901,46550B,504990,41,-,-54,-10,16,-,-\n[04-21_17:35:15:441] AT< OK\n[04-21_17:35:15:441] AT> AT+QNETDEVSTATUS=1\n[04-21_17:35:15:445] AT< ERROR\n[04-21_17:35:15:445] ifconfig usb0 0.0.0.0\n[04-21_17:35:15:446] ifconfig usb0 down\n[04-21_17:35:15:448] AT> AT+QNETDEVCTL=1,1,0\n[04-21_17:35:15:454] AT< OK\n[04-21_17:35:15:456] AT> AT+QNETDEVSTATUS=1\n[04-21_17:35:15:458] AT< ERROR\n[04-21_17:35:15:989] AT< +QNETDEVSTATUS:1,1,\"IPV4\"\n[04-21_17:35:16:459] AT> AT+QNETDEVSTATUS=1\n[04-21_17:35:16:461] AT< +QNETDEVSTATUS: 4F10190A,E0FFFFFF,4110190A,4110190A,02B48AD3,03B48AD3, 85600, 85600\n[04-21_17:35:16:461] AT< OK\n[04-21_17:35:16:461] AT> AT+QNETDEVSTATUS=1\n[04-21_17:35:16:462] AT< +QNETDEVSTATUS: 4F10190A,E0FFFFFF,4110190A,4110190A,02B48AD3,03B48AD3, 85600, 85600\n[04-21_17:35:16:462] AT< OK\n[04-21_17:35:16:462] requestGetIPAddress 10.25.16.79\n[04-21_17:35:16:462] AT> at+cops?\n[04-21_17:35:16:463] AT< +COPS: 0,2,\"46000\",12\n[04-21_17:35:16:463] AT< OK\n[04-21_17:35:16:463] AT> at+qeng=\"servingcell\"\n[04-21_17:35:16:465] AT< +QENG: \"servingcell\",\"CONNECT\",\"NR5G-SA\",\"TDD\",460,00,170C23000,901,46550B,504990,41,-,-52,-11,15,-,-\n[04-21_17:35:16:465] AT< OK\n[04-21_17:35:16:465] AT> AT+QNETDEVSTATUS=1\n[04-21_17:35:16:466] AT< +QNETDEVSTATUS: 4F10190A,E0FFFFFF,4110190A,4110190A,02B48AD3,03B48AD3, 85600, 85600\n[04-21_17:35:16:466] AT< OK\n[04-21_17:35:16:466] ifconfig usb0 up\n[04-21_17:35:16:470] busybox udhcpc -f -n -q -t 5 -i usb0\nudhcpc: started, v1.30.1\nudhcpc: sending discover\nudhcpc: sending select for 10.25.16.79\nudhcpc: lease of 10.25.16.79 obtained, lease time 518400\n[04-21_17:35:16:602] /etc/udhcpc/default.script: Resetting default routes\nSIOCDELRT: No such process\nSIOCADDRT: Network is unreachable\n[04-21_17:35:16:606] /etc/udhcpc/default.script: Adding DNS 211.138.180.2\n[04-21_17:35:16:606] /etc/udhcpc/default.script: Adding DNS 211.138.180.3\n[04-21_17:35:16:655] AT> at+cops?\n[04-21_17:35:16:656] AT< +COPS: 0,2,\"46000\",12\n[04-21_17:35:16:656] AT< OK\n[04-21_17:35:16:656] AT> at+qeng=\"servingcell\"\n[04-21_17:35:16:657] AT< +QENG: \"servingcell\",\"CONNECT\",\"NR5G-SA\",\"TDD\",460,00,170C23000,901,46550B,504990,41,-,-50,-11,17,-,-\n[04-21_17:35:16:658] AT< OK\nerr = 16\n[04-21_17:35:16:658] AT> AT+QNETDEVSTATUS=1\n[04-21_17:35:16:659] AT< +QNETDEVSTATUS: 4F10190A,E0FFFFFF,4110190A,4110190A,02B48AD3,03B48AD3, 85600, 85600\n[04-21_17:35:16:659] AT< OK\n\nroot@carl-ThinkPad-X1-Carbon-7th:/home/carl/q/quectel-CM# ifconfig usb0\nusb0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500\n        inet 10.25.16.79  netmask 255.255.255.224  broadcast 10.25.16.95\n        inet6 fe80::5c98:e9d4:c82d:5f  prefixlen 64  scopeid 0x20<link>\n        ether 0c:5b:8f:27:9a:64  txqueuelen 1000  (Ethernet)\n        RX packets 7  bytes 1656 (1.6 KB)\n        RX errors 0  dropped 0  overruns 0  frame 0\n        TX packets 32  bytes 5112 (5.1 KB)\n        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\n\nroot@carl-ThinkPad-X1-Carbon-7th:/home/carl/q/quectel-CM# [04-21_17:35:31:670] AT> at+cops?\n[04-21_17:35:31:671] AT< +COPS: 0,2,\"46000\",12\n[04-21_17:35:31:671] AT< OK\n[04-21_17:35:31:671] AT> at+qeng=\"servingcell\"\n[04-21_17:35:31:673] AT< +QENG: \"servingcell\",\"CONNECT\",\"NR5G-SA\",\"TDD\",460,00,170C23000,901,46550B,504990,41,-,-48,-10,17,-,-\n[04-21_17:35:31:673] AT< OK\n[04-21_17:35:31:673] AT> AT+QNETDEVSTATUS=1\n[04-21_17:35:31:674] AT< +QNETDEVSTATUS: 4F10190A,E0FFFFFF,4110190A,4110190A,02B48AD3,03B48AD3, 85600, 85600\n[04-21_17:35:31:674] AT< OK\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/gobinet.txt",
    "content": "root@ZhuoTK:/# dmesg\r\n[  230.590000] GobiNet 1-1.3:1.4 usb0: register 'GobiNet' at usb-101c0000.ehci-1.3, GobiNet Ethernet Device, 02:50:f4:00:00:00\r\n[  230.600000] creating qcqmi0\r\n\r\nroot@ZhuoTK:/# quectel-CM -s cmnet &\r\n[04-13_03:24:58:213] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_03:24:58:216] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x004\r\n[04-13_03:24:58:218] Auto find qmichannel = /dev/qcqmi0\r\n[04-13_03:24:58:218] Auto find usbnet_adapter = usb0\r\n[04-13_03:24:58:218] netcard driver = GobiNet, driver version = V1.6.2.13\r\n[04-13_03:24:58:219] Modem works in QMI mode\r\n[04-13_03:24:58:260] Get clientWDS = 7\r\n[04-13_03:24:58:292] Get clientDMS = 8\r\n[04-13_03:24:58:324] Get clientNAS = 9\r\n[04-13_03:24:58:355] Get clientUIM = 10\r\n[04-13_03:24:58:388] Get clientWDA = 11\r\n[04-13_03:24:58:420] requestBaseBandVersion EC25EFAR06A11M4G\r\n[04-13_03:24:58:548] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_03:24:58:549] requestSetProfile[1] cmnet///0\r\n[04-13_03:24:58:613] requestGetProfile[1] cmnet///0\r\n[04-13_03:24:58:645] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\r\n[04-13_03:24:58:677] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-13_03:24:58:677] ifconfig usb0 0.0.0.0\r\n[04-13_03:24:58:696] ifconfig usb0 down\r\n[04-13_03:24:59:028] requestSetupDataCall WdsConnectionIPv4Handle: 0x87245bd0\r\n[04-13_03:24:59:189] ifconfig usb0 up\r\n[04-13_03:24:59:214] you are use OpenWrt?\r\n[04-13_03:24:59:215] should not calling udhcpc manually?\r\n[04-13_03:24:59:215] should modify /etc/config/network as below?\r\n[04-13_03:24:59:215] config interface wan\r\n[04-13_03:24:59:215] \toption ifname\tusb0\r\n[04-13_03:24:59:215] \toption proto\tdhcp\r\n[04-13_03:24:59:215] should use \"/sbin/ifstaus wan\" to check usb0 's status?\r\n[04-13_03:24:59:216] busybox udhcpc -f -n -q -t 5 -i usb0\r\n[04-13_03:24:59:226] udhcpc (v1.23.2) started\r\n[04-13_03:24:59:238] Sending discover...\r\n[04-13_03:24:59:248] Sending select for 10.198.78.154...\r\n[04-13_03:24:59:251] Lease of 10.198.78.154 obtained, lease time 7200\r\n[04-13_03:24:59:257] udhcpc: ifconfig usb0 10.198.78.154 netmask 255.255.255.252 broadcast +\r\n[04-13_03:24:59:266] udhcpc: setting default routers: 10.198.78.153\r\n\r\nroot@ZhuoTK:/# ifconfig usb0\r\nusb0      Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \r\n          inet addr:10.198.78.154  Mask:255.255.255.252\r\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:6 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:916 (916.0 B)  TX bytes:960 (960.0 B)\r\n\r\nroot@ZhuoTK:/# ip ro show\r\ndefault via 10.198.78.153 dev usb0 \r\n10.198.78.152/30 dev usb0  proto kernel  scope link  src 10.198.78.154 \r\n192.168.1.0/24 dev br-lan  proto kernel  scope link  src 192.168.1.251 \r\n\r\nroot@ZhuoTK:/# killall quectel-CM\r\n[04-13_03:25:38:779] requestDeactivateDefaultPDP WdsConnectionIPv4Handle\r\n[04-13_03:25:39:061] ifconfig usb0 0.0.0.0\r\n[04-13_03:25:39:072] ifconfig usb0 down\r\n[04-13_03:25:39:284] GobiNetThread exit\r\n[04-13_03:25:39:285] qmi_main exit\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/gobinet_bridge.txt",
    "content": "root@ZhuoTK:/# insmod GobiNet.ko \r\n[   80.460000] GobiNet: Quectel_Linux&Android_GobiNet_Driver_V1.6.2.13\r\n[   80.460000] usbcore: registered new interface driver GobiNet\r\n[   97.710000] usb 1-1.3: new high-speed USB device number 3 using ehci-platform\r\n[   97.930000] usb 1-1.3: GSM modem (1-port) converter now attached to ttyUSB103\r\n[   97.950000] GobiNet 1-1.3:1.4 usb0: register 'GobiNet' at usb-101c0000.ehci-1.3, GobiNet Ethernet Device, 02:50:f4:00:00:00\r\n[   97.960000] creating qcqmi0\r\n\r\nroot@ZhuoTK:/# brctl addbr br0\r\nroot@ZhuoTK:/# brctl addif br0 eth0.1\r\nroot@ZhuoTK:/# brctl addif br0 usb0\r\nroot@ZhuoTK:/# brctl show\r\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\r\nbr0\t\t8000.00ca019197b9\tno\t\teth0.1\r\n\t\t\t\t\t\t\t                usb0\r\n\t\t\t\t\t\t\t                \r\nroot@ZhuoTK:/# quectel-CM -s cment -b &\r\n[04-13_05:13:18:213] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_05:13:18:216] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x003\r\n[  122.270000] net usb0: bridge_mode change to 0x1\r\n[04-13_05:13:18:218] Auto find qmichannel = /dev/qcqmi0\r\n[04-13_05:13:18:218] Auto find usbnet_adapter = usb0\r\n[04-13_05:13:18:218] netcard driver = GobiNet, driver version = V1.6.2.13\r\n[04-13_05:13:18:224] Modem works in QMI mode\r\n[04-13_05:13:18:251] Get clientWDS = 7\r\n[04-13_05:13:18:282] Get clientDMS = 8\r\n[04-13_05:13:18:316] Get clientNAS = 9\r\n[04-13_05:13:18:347] Get clientUIM = 10\r\n[04-13_05:13:18:379] Get clientWDA = 11\r\n[04-13_05:13:18:411] requestBaseBandVersion EC25EFAR06A11M4G\r\n[04-13_05:13:18:539] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_05:13:18:540] requestSetProfile[1] cment///0\r\n[04-13_05:13:18:603] requestGetProfile[1] cment///0\r\n[04-13_05:13:18:637] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\r\n[04-13_05:13:18:666] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-13_05:13:18:667] ifconfig usb0 0.0.0.0\r\n[04-13_05:13:18:687] ifconfig usb0 down\r\n[04-13_05:13:19:083] requestSetupDataCall WdsConnectionIPv4Handle: 0x8724d220\r\n[04-13_05:13:19:243] ifconfig usb0 up\r\n[04-13_05:13:19:270] echo '0xa218480' > /sys/class/net/usb0/bridge_ipv4\r\n\r\nroot@ZhuoTK:/# ifconfig br0 up\r\n[  135.530000] usb0 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[  135.570000] usb0 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[  135.580000] usb0 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[  135.610000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\r\n[  135.620000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\r\n[  135.910000] usb0 sip = 0.0.0.0, tip=10.33.132.128, ipv4=10.33.132.128\r\n[  136.000000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\r\n[  136.910000] usb0 sip = 0.0.0.0, tip=10.33.132.128, ipv4=10.33.132.128\r\n[  137.910000] usb0 sip = 0.0.0.0, tip=10.33.132.128, ipv4=10.33.132.128\r\n[  138.740000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\r\n[  138.910000] usb0 sip = 10.33.132.128, tip=10.33.132.128, ipv4=10.33.132.128\r\n[  139.000000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\r\n[  140.860000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\r\n[  143.160000] br0: port 2(usb0) entered forwarding state\r\n[  143.160000] br0: port 1(eth0.1) entered forwarding state\r\n[  148.870000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\r\n[  149.010000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\r\n[  165.630000] usb0 sip = 10.33.132.128, tip=10.33.132.129, ipv4=10.33.132.128\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/gobinet_qmap=1.txt",
    "content": "root@ZhuoTK:/# insmod GobiNet.ko qmap_mode=1\r\n[  798.480000] GobiNet: Quectel_Linux&Android_GobiNet_Driver_V1.6.2.13\r\n[  798.490000] GobiNet 1-1.3:1.4 usb0: register 'GobiNet' at usb-101c0000.ehci-1.3, GobiNet Ethernet Device, 02:50:f4:00:00:00\r\n[  798.510000] creating qcqmi0\r\n[  798.510000] usbcore: registered new interface driver GobiNet\r\n[  799.620000] GobiNet::QMIWDASetDataFormat qmap settings qmap_version=5, rx_size=4096, tx_size=4096\r\n[  799.630000] GobiNet::QMIWDASetDataFormat qmap settings ul_data_aggregation_max_size=4096, ul_data_aggregation_max_datagrams=16\r\n\r\nroot@ZhuoTK:/# quectel-CM -s cmnet &\r\n[04-13_03:32:31:248] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_03:32:31:251] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x005\r\n[04-13_03:32:31:253] Auto find qmichannel = /dev/qcqmi0\r\n[04-13_03:32:31:253] Auto find usbnet_adapter = usb0\r\n[04-13_03:32:31:253] netcard driver = GobiNet, driver version = V1.6.2.13\r\n[04-13_03:32:31:253] qmap_mode = 1, qmap_version = 5, qmap_size = 4096, muxid = 0x81, qmap_netcard = usb0\r\n[04-13_03:32:31:254] Modem works in QMI mode\r\n[04-13_03:32:31:289] Get clientWDS = 7\r\n[04-13_03:32:31:320] Get clientDMS = 8\r\n[04-13_03:32:31:353] Get clientNAS = 9\r\n[04-13_03:32:31:385] Get clientUIM = 10\r\n[04-13_03:32:31:417] requestBaseBandVersion EC25EFAR06A11M4G\r\n[04-13_03:32:31:545] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_03:32:31:545] requestSetProfile[1] cmnet///0\r\n[04-13_03:32:31:609] requestGetProfile[1] cmnet///0\r\n[04-13_03:32:31:641] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\r\n[04-13_03:32:31:673] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-13_03:32:31:674] ifconfig usb0 0.0.0.0\r\n[04-13_03:32:31:698] ifconfig usb0 down\r\n[04-13_03:32:31:770] requestSetupDataCall WdsConnectionIPv4Handle: 0x872481a0\r\n[  857.000000] net usb0: link_state 0x0 -> 0x1\r\n[04-13_03:32:31:902] ifconfig usb0 up\r\n[04-13_03:32:31:928] you are use OpenWrt?\r\n[04-13_03:32:31:928] should not calling udhcpc manually?\r\n[04-13_03:32:31:928] should modify /etc/config/network as below?\r\n[04-13_03:32:31:928] config interface wan\r\n[04-13_03:32:31:928] \toption ifname\tusb0\r\n[04-13_03:32:31:929] \toption proto\tdhcp\r\n[04-13_03:32:31:929] should use \"/sbin/ifstaus wan\" to check usb0 's status?\r\n[04-13_03:32:31:929] busybox udhcpc -f -n -q -t 5 -i usb0\r\n[04-13_03:32:31:939] udhcpc (v1.23.2) started\r\n[04-13_03:32:31:951] Sending discover...\r\n[04-13_03:32:31:956] Sending select for 10.199.102.71...\r\n[04-13_03:32:31:959] Lease of 10.199.102.71 obtained, lease time 7200\r\n[04-13_03:32:31:964] udhcpc: ifconfig usb0 10.199.102.71 netmask 255.255.255.240 broadcast +\r\n[04-13_03:32:31:974] udhcpc: setting default routers: 10.199.102.72\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/gobinet_qmap=1_bridge.txt",
    "content": "root@ZhuoTK:/# insmod GobiNet.ko qmap_mode=1\r\n[   41.540000] GobiNet: Quectel_Linux&Android_GobiNet_Driver_V1.6.2.13\r\n[   41.550000] GobiNet 1-1.3:1.4 usb0: register 'GobiNet' at usb-101c0000.ehci-1.3, GobiNet Ethernet Device, 02:50:f4:00:00:00\r\n[   41.570000] creating qcqmi0\r\n[   41.570000] usbcore: registered new interface driver GobiNet\r\n[   42.700000] GobiNet::QMIWDASetDataFormat qmap settings qmap_version=5, rx_size=4096, tx_size=4096\r\n[   42.710000] GobiNet::QMIWDASetDataFormat qmap settings ul_data_aggregation_max_size=4096, ul_data_aggregation_max_datagrams=16\r\n\r\nroot@ZhuoTK:/# brctl addbr br0\r\nroot@ZhuoTK:/# brctl addif br0 eth0.1\r\nroot@ZhuoTK:/# brctl addif br0 usb0\r\nroot@ZhuoTK:/# brctl show\r\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\r\nbr0\t\t8000.00ca019197b9\tno\t\t eth0.1\r\n\t\t\t\t\t\t\t                 usb0\r\n\t\t\t\t\t\t\t                 \r\nroot@ZhuoTK:/# quectel-CM -s cmnet -b &\r\n# [04-13_05:12:29:338] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_05:12:29:340] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x003\r\n[   73.380000] net usb0: bridge_mode change to 0x1\r\n[04-13_05:12:29:342] Auto find qmichannel = /dev/qcqmi0\r\n[04-13_05:12:29:342] Auto find usbnet_adapter = usb0\r\n[04-13_05:12:29:342] netcard driver = GobiNet, driver version = V1.6.2.13\r\n[04-13_05:12:29:343] qmap_mode = 1, qmap_version = 5, qmap_size = 4096, muxid = 0x81, qmap_netcard = usb0\r\n[04-13_05:12:29:348] Modem works in QMI mode\r\n[04-13_05:12:29:382] Get clientWDS = 7\r\n[04-13_05:12:29:414] Get clientDMS = 8\r\n[04-13_05:12:29:447] Get clientNAS = 9\r\n[04-13_05:12:29:479] Get clientUIM = 10\r\n[04-13_05:12:29:512] requestBaseBandVersion EC25EFAR06A11M4G\r\n[04-13_05:12:29:640] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_05:12:29:640] requestSetProfile[1] cmnet///0\r\n[04-13_05:12:29:704] requestGetProfile[1] cmnet///0\r\n[04-13_05:12:29:735] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\r\n[04-13_05:12:29:767] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-13_05:12:29:768] ifconfig usb0 0.0.0.0\r\n[04-13_05:12:29:792] ifconfig usb0 down\r\n[04-13_05:12:29:863] requestSetupDataCall WdsConnectionIPv4Handle: 0x8724d820\r\n[   74.030000] net usb0: link_state 0x0 -> 0x1\r\n[04-13_05:12:29:996] ifconfig usb0 up\r\n[04-13_05:12:30:022] echo '0xa16b769' > /sys/class/net/usb0/bridge_ipv4\r\n\r\nroot@ZhuoTK:/# ifconfig br0 up\r\n[   82.210000] br0: port 2(usb0) entered forwarding state\r\n[   82.210000] br0: port 2(usb0) entered forwarding state\r\n[   82.220000] br0: port 1(eth0.1) entered forwarding state\r\n[   82.220000] br0: port 1(eth0.1) entered forwarding state\r\n[   88.830000] rt305x-esw 10110000.esw: link changed 0x01\r\n[   89.010000] usb0 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[   89.040000] usb0 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[   89.050000] usb0 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[   89.120000] usb0 sip = 10.22.183.105, tip=10.22.183.106, ipv4=10.22.183.105\r\n[   89.350000] usb0 sip = 0.0.0.0, tip=10.22.183.105, ipv4=10.22.183.105\r\n[   89.400000] usb0 sip = 10.22.183.105, tip=10.22.183.106, ipv4=10.22.183.105\r\n[   89.520000] usb0 sip = 10.22.183.105, tip=10.22.183.106, ipv4=10.22.183.105\r\n[   90.350000] usb0 sip = 0.0.0.0, tip=10.22.183.105, ipv4=10.22.183.105\r\n[   91.350000] usb0 sip = 0.0.0.0, tip=10.22.183.105, ipv4=10.22.183.105\r\n[   92.350000] usb0 sip = 10.22.183.105, tip=10.22.183.105, ipv4=10.22.183.105\r\n[   92.430000] usb0 sip = 10.22.183.105, tip=10.22.183.106, ipv4=10.22.183.105\r\n[   92.660000] usb0 sip = 10.22.183.105, tip=10.22.183.106, ipv4=10.22.183.105\r\n[   97.240000] br0: port 2(usb0) entered forwarding state\r\n[   97.240000] br0: port 1(eth0.1) entered forwarding state\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/gobinet_qmap=4.txt",
    "content": "root@ZhuoTK:/# insmod GobiNet.ko qmap_mode=4\r\n[  970.380000] GobiNet: Quectel_Linux&Android_GobiNet_Driver_V1.6.2.13\r\n[  970.380000] usbcore: registered new interface driver GobiNet\r\n[  989.620000] usb 1-1.3: new high-speed USB device number 6 using ehci-platform\r\n[  989.860000] GobiNet 1-1.3:1.4 usb0: register 'GobiNet' at usb-101c0000.ehci-1.3, GobiNet Ethernet Device, 02:50:f4:00:00:00\r\n[  989.870000] creating qcqmi0\r\n[  989.880000] GobiNet::qmap_register_device usb0.1\r\n[  989.880000] GobiNet::qmap_register_device usb0.2\r\n[  989.890000] GobiNet::qmap_register_device usb0.3\r\n[  989.890000] GobiNet::qmap_register_device usb0.4\r\n[  994.820000] GobiNet::QMIWDASetDataFormat qmap settings qmap_version=5, rx_size=4096, tx_size=4096\r\n[  994.830000] GobiNet::QMIWDASetDataFormat qmap settings ul_data_aggregation_max_size=4096, ul_data_aggregation_max_datagrams=16\r\n\r\nroot@ZhuoTK:/# quectel-CM -n 1 -s cmnet &\r\n[04-13_03:35:31:878] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_03:35:31:881] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x006\r\n[04-13_03:35:31:882] Auto find qmichannel = /dev/qcqmi0\r\n[04-13_03:35:31:882] Auto find usbnet_adapter = usb0\r\n[04-13_03:35:31:883] netcard driver = GobiNet, driver version = V1.6.2.13\r\n[04-13_03:35:31:883] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x81, qmap_netcard = usb0.1\r\n[04-13_03:35:31:883] Modem works in QMI mode\r\n[04-13_03:35:31:896] Get clientWDS = 7\r\n[04-13_03:35:31:927] Get clientDMS = 8\r\n[04-13_03:35:31:959] Get clientNAS = 9\r\n[04-13_03:35:31:992] Get clientUIM = 10\r\n[04-13_03:35:32:024] requestBaseBandVersion EC25EFAR06A11M4G\r\n[04-13_03:35:32:152] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_03:35:32:152] requestSetProfile[1] cmnet///0\r\n[04-13_03:35:32:216] requestGetProfile[1] cmnet///0\r\n[04-13_03:35:32:248] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\r\n[04-13_03:35:32:279] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-13_03:35:32:280] ifconfig usb0 down\r\n[04-13_03:35:32:290] ifconfig usb0.1 0.0.0.0\r\n[04-13_03:35:32:301] ifconfig usb0.1 down\r\n[04-13_03:35:32:344] requestSetupDataCall WdsConnectionIPv4Handle: 0x8723eef0\r\n[ 1037.570000] net usb0: link_state 0x0 -> 0x1\r\n[04-13_03:35:32:477] ifconfig usb0 up\r\n[04-13_03:35:32:496] ifconfig usb0.1 up\r\n[04-13_03:35:32:508] you are use OpenWrt?\r\n[04-13_03:35:32:509] should not calling udhcpc manually?\r\n[04-13_03:35:32:509] should modify /etc/config/network as below?\r\n[04-13_03:35:32:509] config interface wan\r\n[04-13_03:35:32:509] \toption ifname\tusb0.1\r\n[04-13_03:35:32:509] \toption proto\tdhcp\r\n[04-13_03:35:32:509] should use \"/sbin/ifstaus wan\" to check usb0.1 's status?\r\n[04-13_03:35:32:510] busybox udhcpc -f -n -q -t 5 -i usb0.1\r\n[04-13_03:35:32:520] udhcpc (v1.23.2) started\r\n[04-13_03:35:32:532] Sending discover...\r\n[04-13_03:35:32:540] Sending select for 10.187.142.20...\r\n[04-13_03:35:32:545] Lease of 10.187.142.20 obtained, lease time 7200\r\n[04-13_03:35:32:550] udhcpc: ifconfig usb0.1 10.187.142.20 netmask 255.255.255.248 broadcast +\r\n[04-13_03:35:32:560] udhcpc: setting default routers: 10.187.142.21\r\n\r\nroot@ZhuoTK:/# quectel-CM -n 2 -s 4gnet &\r\n[04-13_03:35:38:766] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_03:35:38:769] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x006\r\n[04-13_03:35:38:770] Auto find qmichannel = /dev/qcqmi0\r\n[04-13_03:35:38:770] Auto find usbnet_adapter = usb0\r\n[04-13_03:35:38:771] netcard driver = GobiNet, driver version = V1.6.2.13\r\n[04-13_03:35:38:771] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x82, qmap_netcard = usb0.2\r\n[04-13_03:35:38:771] Modem works in QMI mode\r\n[04-13_03:35:38:809] Get clientWDS = 7\r\n[04-13_03:35:38:841] Get clientDMS = 8\r\n[04-13_03:35:38:873] Get clientNAS = 9\r\n[04-13_03:35:38:905] Get clientUIM = 10\r\n[04-13_03:35:38:937] requestBaseBandVersion EC25EFAR06A11M4G\r\n[04-13_03:35:39:065] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_03:35:39:065] requestSetProfile[2] 4gnet///0\r\n[04-13_03:35:39:129] requestGetProfile[2] 4gnet///0\r\n[04-13_03:35:39:161] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\r\n[04-13_03:35:39:193] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-13_03:35:39:193] ifconfig usb0.2 0.0.0.0\r\n[04-13_03:35:39:206] ifconfig usb0.2 down\r\n[04-13_03:35:39:417] requestSetupDataCall WdsConnectionIPv4Handle: 0x87252eb0\r\n[ 1044.650000] net usb0: link_state 0x1 -> 0x3\r\n[04-13_03:35:39:550] ifconfig usb0 up\r\n[04-13_03:35:39:560] ifconfig usb0.2 up\r\n[04-13_03:35:39:573] you are use OpenWrt?\r\n[04-13_03:35:39:573] should not calling udhcpc manually?\r\n[04-13_03:35:39:573] should modify /etc/config/network as below?\r\n[04-13_03:35:39:573] config interface wan\r\n[04-13_03:35:39:573] \toption ifname\tusb0.2\r\n[04-13_03:35:39:573] \toption proto\tdhcp\r\n[04-13_03:35:39:573] should use \"/sbin/ifstaus wan\" to check usb0.2 's status?\r\n[04-13_03:35:39:574] busybox udhcpc -f -n -q -t 5 -i usb0.2\r\n[04-13_03:35:39:585] udhcpc (v1.23.2) started\r\n[04-13_03:35:39:597] Sending discover...\r\n[04-13_03:35:39:601] Sending select for 10.197.125.183...\r\n[04-13_03:35:39:606] Lease of 10.197.125.183 obtained, lease time 7200\r\n[04-13_03:35:39:611] udhcpc: ifconfig usb0.2 10.197.125.183 netmask 255.255.255.240 broadcast +\r\n[04-13_03:35:39:621] udhcpc: setting default routers: 10.197.125.184\r\n\r\nroot@ZhuoTK:/# ifconfig usb0.1\r\nusb0.1    Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \r\n          inet addr:10.187.142.20  Mask:255.255.255.248\r\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:4 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:10 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:764 (764.0 B)  TX bytes:1824 (1.7 KiB)\r\n\r\nroot@ZhuoTK:/# ifconfig usb0.2\r\nusb0.2    Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \r\n          inet addr:10.197.125.183  Mask:255.255.255.240\r\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:3 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:9 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:688 (688.0 B)  TX bytes:1224 (1.1 KiB)\r\n\r\nroot@ZhuoTK:/# ip ro add 8.8.8.8/32 dev usb0.1\r\nroot@ZhuoTK:/# ping 8.8.8.8\r\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\r\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=74.450 ms\r\n\r\nroot@ZhuoTK:/# ip ro del 8.8.8.8/32\r\nroot@ZhuoTK:/# ip ro del 8.8.8.8/32\r\nRTNETLINK answers: No such process\r\n\r\nroot@ZhuoTK:/# ip ro add 8.8.8.8/32 dev usb0.2\r\nroot@ZhuoTK:/# ping 8.8.8.8\r\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\r\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=257.851 ms\r\n\r\nroot@ZhuoTK:/# quectel-CM -k 2\r\n[04-13_03:39:16:986] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_03:39:16:988] /proc/2294/cmdline: quectel-CM -n 2 -s 4gnet\r\n[04-13_03:39:16:988] send SIGINT to process 2294\r\n[04-13_03:39:16:989] requestDeactivateDefaultPDP WdsConnectionIPv4Handle\r\n[ 1262.310000] net usb0: link_state 0x3 -> 0x1\r\n[04-13_03:39:17:216] ifconfig usb0.2 0.0.0.0\r\n[04-13_03:39:17:228] ifconfig usb0.2 down\r\n[04-13_03:39:17:370] GobiNetThread exit\r\n[04-13_03:39:17:371] qmi_main exit\r\n\r\n[2]+  Done                       quectel-CM -n 2 -s 4gnet\r\n\r\nroot@ZhuoTK:/# ifconfig usb0.2\r\nusb0.2    Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \r\n          NOARP  MTU:1500  Metric:1\r\n          RX packets:30 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:35 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:2816 (2.7 KiB)  TX bytes:3408 (3.3 KiB)\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/gobinet_qmap=4_bridge.txt",
    "content": "root@ZhuoTK:/# insmod GobiNet.ko qmap_mode=4\r\n[   42.120000] GobiNet: Quectel_Linux&Android_GobiNet_Driver_V1.6.2.13\r\n[   42.130000] GobiNet 1-1.3:1.4 usb0: register 'GobiNet' at usb-101c0000.ehci-1.3, GobiNet Ethernet Device, 02:50:f4:00:00:00\r\n[   42.140000] creating qcqmi0\r\n[   42.150000] GobiNet::qmap_register_device usb0.1\r\n[   42.150000] GobiNet::qmap_register_device usb0.2\r\n[   42.160000] GobiNet::qmap_register_device usb0.3\r\n[   42.160000] GobiNet::qmap_register_device usb0.4\r\n[   42.170000] usbcore: registered new interface driver GobiNet\r\n[   43.270000] GobiNet::QMIWDASetDataFormat qmap settings qmap_version=5, rx_size=4096, tx_size=4096\r\n[   43.280000] GobiNet::QMIWDASetDataFormat qmap settings ul_data_aggregation_max_size=4096, ul_data_aggregation_max_datagrams=16\r\n\r\nroot@ZhuoTK:/# brctl addbr br0\r\nroot@ZhuoTK:/# brctl addif br0 eth0.1\r\nroot@ZhuoTK:/# brctl addif br0 usb0.1\r\nroot@ZhuoTK:/# brctl show\r\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\r\nbr0\t\t8000.00ca019197b9\tno\t\teth0.1\r\n\t\t\t\t\t\t\t                usb0.1\r\n\t\t\t\t\t\t\t                \r\nroot@ZhuoTK:/# quectel-CM -n 1 -s cmnet -b &\r\n[04-13_05:12:42:155] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_05:12:42:158] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x003\r\n[   86.130000] net usb0.1: bridge_mode change to 0x1\r\n[04-13_05:12:42:159] Auto find qmichannel = /dev/qcqmi0\r\n[04-13_05:12:42:160] Auto find usbnet_adapter = usb0\r\n[04-13_05:12:42:160] netcard driver = GobiNet, driver version = V1.6.2.13\r\n[04-13_05:12:42:160] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x81, qmap_netcard = usb0.1\r\n[04-13_05:12:42:166] Modem works in QMI mode\r\n[04-13_05:12:42:181] Get clientWDS = 7\r\n[04-13_05:12:42:213] Get clientDMS = 8\r\n[04-13_05:12:42:246] Get clientNAS = 9\r\n[04-13_05:12:42:278] Get clientUIM = 10\r\n[04-13_05:12:42:310] requestBaseBandVersion EC25EFAR06A11M4G\r\n[04-13_05:12:42:438] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_05:12:42:439] requestSetProfile[1] cmnet///0\r\n[04-13_05:12:42:502] requestGetProfile[1] cmnet///0\r\n[04-13_05:12:42:534] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\r\n[04-13_05:12:42:565] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-13_05:12:42:566] ifconfig usb0 down\r\n[04-13_05:12:42:576] ifconfig usb0.1 0.0.0.0\r\n[04-13_05:12:42:587] ifconfig usb0.1 down\r\n[04-13_05:12:42:629] requestSetupDataCall WdsConnectionIPv4Handle: 0x8724d740\r\n[   86.730000] net usb0: link_state 0x0 -> 0x1\r\n[04-13_05:12:42:762] ifconfig usb0 up\r\n[04-13_05:12:42:782] ifconfig usb0.1 up\r\n[04-13_05:12:42:794] echo '0xa16b769' > /sys/class/net/usb0.1/bridge_ipv4\r\n\r\nroot@ZhuoTK:/# ifconfig br0 up\r\n[   98.270000] usb0.1 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[   98.360000] usb0.1 sip = 0.0.0.0, tip=10.22.183.105, ipv4=10.22.183.105\r\n[   98.370000] usb0.1 sip = 10.22.183.105, tip=10.22.183.106, ipv4=10.22.183.105\r\n[   99.360000] usb0.1 sip = 0.0.0.0, tip=10.22.183.105, ipv4=10.22.183.105\r\n[  100.360000] usb0.1 sip = 0.0.0.0, tip=10.22.183.105, ipv4=10.22.183.105\r\n[  100.500000] usb0.1 sip = 10.22.183.105, tip=10.22.183.106, ipv4=10.22.183.105\r\n\r\nroot@ZhuoTK:/# quectel-CM -n 2 -s 4gnet &\r\n[04-13_05:13:05:715] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_05:13:05:717] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x003\r\n[04-13_05:13:05:719] Auto find qmichannel = /dev/qcqmi0\r\n[04-13_05:13:05:719] Auto find usbnet_adapter = usb0\r\n[04-13_05:13:05:719] netcard driver = GobiNet, driver version = V1.6.2.13\r\n[04-13_05:13:05:719] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x82, qmap_netcard = usb0.2\r\n[04-13_05:13:05:720] Modem works in QMI mode\r\n[04-13_05:13:05:734] Get clientWDS = 7\r\n[04-13_05:13:05:766] Get clientDMS = 8\r\n[04-13_05:13:05:798] Get clientNAS = 9\r\n[04-13_05:13:05:830] Get clientUIM = 10\r\n[04-13_05:13:05:861] requestBaseBandVersion EC25EFAR06A11M4G\r\n[04-13_05:13:05:990] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_05:13:05:991] requestSetProfile[2] 4gnet///0\r\n[04-13_05:13:06:054] requestGetProfile[2] 4gnet///0\r\n[04-13_05:13:06:086] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\r\n[04-13_05:13:06:118] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-13_05:13:06:119] ifconfig usb0.2 0.0.0.0\r\n[04-13_05:13:06:131] ifconfig usb0.2 down\r\n[04-13_05:13:06:375] requestSetupDataCall WdsConnectionIPv4Handle: 0x872b8c50\r\n[  110.470000] net usb0: link_state 0x1 -> 0x3\r\n[04-13_05:13:06:507] ifconfig usb0 up\r\n[04-13_05:13:06:518] ifconfig usb0.2 up\r\n[04-13_05:13:06:539] you are use OpenWrt?\r\n[04-13_05:13:06:540] should not calling udhcpc manually?\r\n[04-13_05:13:06:540] should modify /etc/config/network as below?\r\n[04-13_05:13:06:540] config interface wan\r\n[04-13_05:13:06:540] \toption ifname\tusb0.2\r\n[04-13_05:13:06:540] \toption proto\tdhcp\r\n[04-13_05:13:06:540] should use \"/sbin/ifstaus wan\" to check usb0.2 's status?\r\n[04-13_05:13:06:540] busybox udhcpc -f -n -q -t 5 -i usb0.2\r\n[04-13_05:13:06:554] udhcpc (v1.23.2) started\r\n[04-13_05:13:06:614] Sending discover...\r\n[04-13_05:13:06:619] Sending select for 10.22.58.141...\r\n[04-13_05:13:06:623] Lease of 10.22.58.141 obtained, lease time 7200\r\n[04-13_05:13:06:629] udhcpc: ifconfig usb0.2 10.22.58.141 netmask 255.255.255.252 broadcast +\r\n[04-13_05:13:06:638] udhcpc: setting default routers: 10.22.58.142\r\n\r\nroot@ZhuoTK:/# ifconfig usb0.2\r\nusb0.2    Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \r\n          inet addr:10.22.58.141  Mask:255.255.255.252\r\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:2 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:612 (612.0 B)  TX bytes:1064 (1.0 KiB)\r\n\r\nroot@ZhuoTK:/# ip ro show\r\ndefault via 10.22.58.142 dev usb0.2 \r\n10.22.58.140/30 dev usb0.2  proto kernel  scope link  src 10.22.58.141 \r\n192.168.1.0/24 dev br-lan  proto kernel  scope link  src 192.168.1.251 \r\n\r\nroot@ZhuoTK:/# ping 8.8.8.8\r\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\r\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=69.822 ms\r\n\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/pcie_mhi_mbim.txt",
    "content": "root@OpenWrt:/# lspci\r\n00:00.0 Class 0604: 17cb:1001\r\n01:00.0 Class ff00: 17cb:0306\r\n\r\nroot@OpenWrt:/# insmod pcie_mhi.ko mhi_mbim_enabled=1\r\n[   63.094154] mhi_init Quectel_Linux_PCIE_MHI_Driver_V1.3.0.17\r\n[   63.094739] mhi_pci_probe pci_dev->name = 0000:01:00.0, domain=0, bus=1, slot=0, vendor=17CB, device=0306\r\n[   63.099373] mhi_q 0000:01:00.0: BAR 0: assigned [mem 0x48000000-0x48000fff 64bit]\r\n[   63.108476] mhi_q 0000:01:00.0: enabling device (0140 -> 0142)\r\n[   63.293451] [I][mhi_netdev_enable_iface] Prepare the channels for transfer\r\n[   63.324757] [I][mhi_netdev_enable_iface] Exited.\r\n[   63.326265] rmnet_vnd_register_device(rmnet_mhi0.1)=0\r\n\r\nroot@OpenWrt:/# quectel-CM -s cment &\r\n[04-13_09:25:23:910] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_09:25:23:912] network interface '' or qmidev '' is not exist\r\n[04-13_09:25:23:912] netcard driver = pcie_mhi, driver version = V1.3.0.17\r\n[04-13_09:25:23:913] mbim_qmap_mode = 1, vlan_id = 0x00, qmap_netcard = rmnet_mhi0.1\r\n[04-13_09:25:23:913] Modem works in MBIM mode\r\n[04-13_09:25:23:965] cdc_wdm_fd = 7\r\n[04-13_09:25:23:965] mbim_open_device()\r\n[04-13_09:25:24:549] mbim_device_caps_query()\r\n[04-13_09:25:24:575] DeviceId:     869710030002905\r\n[04-13_09:25:24:575] FirmwareInfo: RM500QGLABR10A03M4G_01.001.03\r\n[04-13_09:25:24:575] HardwareInfo: RM500QGL_VH\r\n[04-13_09:25:24:576] mbim_device_services_query()\r\n[04-13_09:25:24:585] mbim_set_radio_state( 1 )\r\n[04-13_09:25:24:588] HwRadioState: 1, SwRadioState: 1\r\n[04-13_09:25:24:588] mbim_subscriber_status_query()\r\n[04-13_09:25:24:612] SubscriberId: 460028563800461\r\n[04-13_09:25:24:612] SimIccId:     89860015120716380461\r\n[04-13_09:25:24:613] SubscriberReadyState NotInitialized -> Initialized \r\n[04-13_09:25:24:613] mbim_register_state_query()\r\n[04-13_09:25:24:617] RegisterState Unknown -> Home \r\n[04-13_09:25:24:617] mbim_packet_service_query()\r\n[04-13_09:25:24:619] PacketServiceState Unknown -> Attached \r\n[04-13_09:25:24:619] CurrentDataClass = 5G_NSA\r\n[04-13_09:25:24:620] mbim_query_connect(sessionID=0)\r\n[04-13_09:25:24:631] ActivationState Unknown -> Deactivated \r\n[04-13_09:25:24:631] ifconfig rmnet_mhi0 down\r\n[04-13_09:25:24:657] ifconfig rmnet_mhi0.1 0.0.0.0\r\nifconfig: SIOCSIFFLAGS: Network is down\r\n[04-13_09:25:24:681] ifconfig rmnet_mhi0.1 down\r\n[04-13_09:25:24:705] mbim_register_state_query()\r\n[04-13_09:25:24:709] mbim_packet_service_query()\r\n[04-13_09:25:24:713] CurrentDataClass = 5G_NSA\r\n[04-13_09:25:24:713] mbim_set_connect(onoff=1, sessionID=0)\r\n[04-13_09:25:25:096] ActivationState Deactivated -> Activated \r\n[04-13_09:25:25:097] mbim_ip_config(sessionID=0)\r\n[04-13_09:25:25:100] < SessionId = 0\r\n[04-13_09:25:25:100] < IPv4ConfigurationAvailable = 0xf\r\n[04-13_09:25:25:100] < IPv6ConfigurationAvailable = 0x0\r\n[04-13_09:25:25:101] < IPv4AddressCount = 0x1\r\n[04-13_09:25:25:101] < IPv4AddressOffset = 0x3c\r\n[04-13_09:25:25:101] < IPv6AddressCount = 0x0\r\n[04-13_09:25:25:102] < IPv6AddressOffset = 0x0\r\n[04-13_09:25:25:102] < IPv4 = 10.190.166.229/30\r\n[04-13_09:25:25:103] < gw = 10.190.166.230\r\n[04-13_09:25:25:103] < dns1 = 211.138.180.2\r\n[04-13_09:25:25:103] < dns2 = 211.138.180.3\r\n[04-13_09:25:25:104] < ipv4 mtu = 1500\r\n[04-13_09:25:25:112] ifconfig rmnet_mhi0 up\r\n[04-13_09:25:25:141] ifconfig rmnet_mhi0.1 up\r\n[04-13_09:25:25:170] ip -4 address flush dev rmnet_mhi0.1\r\n[04-13_09:25:25:190] ip -4 address add 10.190.166.229/30 dev rmnet_mhi0.1\r\n[04-13_09:25:25:213] ip -4 route add default via 10.190.166.230 dev rmnet_mhi0.1\r\n\r\nroot@OpenWrt:/# ifconfig rmnet_mhi0.1\r\nrmnet_mhi0.1 Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \r\n          inet addr:10.190.166.229  Mask:255.255.255.252\r\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:19 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:29 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:2326 (2.2 KiB)  TX bytes:2991 (2.9 KiB)\r\n\r\nroot@OpenWrt:/# ping 8.8.8.8\r\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\r\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=278.561 ms\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/pcie_mhi_mbim_qmap=4.txt",
    "content": "root@OpenWrt:/# lspci\r\n00:00.0 Class 0604: 17cb:1001\r\n01:00.0 Class ff00: 17cb:0304\r\nroot@OpenWrt:/# insmod pcie_mhi.ko mhi_mbim_enabled=1 qmap_mode=4\r\n[   76.596827] mhi_init Quectel_Linux_PCIE_MHI_Driver_V1.3.0.17\r\n[   76.598596] mhi_pci_probe pci_dev->name = 0000:01:00.0, domain=0, bus=1, slot=0, vendor=17CB, device=0304\r\n[   76.602863] mhi_q 0000:01:00.0: BAR 0: assigned [mem 0x48000000-0x48000fff 64bit]\r\n[   76.611323] mhi_q 0000:01:00.0: enabling device (0140 -> 0142)\r\n[   76.760239] [I][mhi_netdev_enable_iface] Prepare the channels for transfer\r\n[   76.828699] [I][mhi_netdev_enable_iface] Exited.\r\n[   76.832727] rmnet_vnd_register_device(rmnet_mhi0.1)=0\r\n[   76.836596] rmnet_vnd_register_device(rmnet_mhi0.2)=0\r\n[   76.841170] rmnet_vnd_register_device(rmnet_mhi0.3)=0\r\n[   76.846373] rmnet_vnd_register_device(rmnet_mhi0.4)=0\r\n\r\nroot@OpenWrt:~# quectel-mbim-proxy -d /dev/mhi_MBIM &\r\nroot@OpenWrt:~# [04-14_03:05:36:296] mbim_dev_fd=3\r\n[04-14_03:05:36:297] mbim_send_open_msg()\r\n[04-14_03:05:36:669] receive MBIM_OPEN_DONE, status=0\r\n[04-14_03:05:36:670] mbim_server_fd=4\r\n\r\nroot@OpenWrt:~# quectel-CM -n 1 -s cmnet &\r\n[04-14_03:05:45:955] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-14_03:05:45:956] network interface '' or qmidev '' is not exist\r\n[04-14_03:05:45:957] netcard driver = pcie_mhi, driver version = V1.3.0.17\r\n[04-14_03:05:45:957] mbim_qmap_mode = 4, vlan_id = 0x01, qmap_netcard = rmnet_mhi0.1\r\n[04-14_03:05:45:958] Modem works in MBIM mode\r\n[04-14_03:05:45:959] connect to quectel-mbim-proxy sockfd = 7\r\n[04-14_03:05:45:959] handle_client_connect client_fd=5, client_idx=1\r\n[04-14_03:05:45:959] cdc_wdm_fd = 7\r\n[04-14_03:05:45:960] mbim_open_device()\r\n[04-14_03:05:45:961] mbim_device_caps_query()\r\n[04-14_03:05:45:967] DeviceId:     860459050041596\r\n[04-14_03:05:45:968] FirmwareInfo: EM120RGLAPR02A03M4G_01.001.07\r\n\r\n[04-14_03:05:45:968] HardwareInfo: EM120R_GL\r\n[04-14_03:05:45:968] mbim_device_services_query()\r\n[04-14_03:05:45:972] mbim_set_radio_state( 1 )\r\n[04-14_03:05:45:976] HwRadioState: 1, SwRadioState: 1\r\n[04-14_03:05:45:976] mbim_subscriber_status_query()\r\n[04-14_03:05:45:985] SubscriberId: 460028563800461\r\n[04-14_03:05:45:985] SimIccId:     89860015120716380461\r\n[04-14_03:05:45:986] SubscriberReadyState NotInitialized -> Initialized \r\n[04-14_03:05:45:986] mbim_register_state_query()\r\n[04-14_03:05:45:991] RegisterState Unknown -> Home \r\n[04-14_03:05:45:991] mbim_packet_service_query()\r\n[04-14_03:05:45:995] PacketServiceState Unknown -> Attached \r\n[04-14_03:05:45:996] mbim_query_connect(sessionID=1)\r\n[04-14_03:05:46:000] ActivationState Unknown -> Deactivated \r\n[04-14_03:05:46:000] ifconfig rmnet_mhi0 down\r\n[04-14_03:05:46:024] ifconfig rmnet_mhi0.1 0.0.0.0\r\nifconfig: SIOCSIFFLAGS: Network is down\r\n[04-14_03:05:46:049] ifconfig rmnet_mhi0.1 down\r\n[04-14_03:05:46:072] mbim_set_connect(onoff=1, sessionID=1)\r\n[04-14_03:05:46:099] ActivationState Deactivated -> Activated \r\n[04-14_03:05:46:099] mbim_ip_config(sessionID=1)\r\n[  222.484298] net rmnet_mhi0: link_state 0x0 -> 0x1\r\n[04-14_03:05:46:103] < SessionId = 1\r\n[04-14_03:05:46:104] < IPv4ConfigurationAvailable = 0xf\r\n[04-14_03:05:46:104] < IPv6ConfigurationAvailable = 0x0\r\n[04-14_03:05:46:104] < IPv4AddressCount = 0x1\r\n[04-14_03:05:46:105] < IPv4AddressOffset = 0x3c\r\n[  222.507775] [I][mhi_netdev_open] Opened net dev interface\r\n[04-14_03:05:46:105] < IPv6AddressCount = 0x0\r\n[04-14_03:05:46:105] < IPv6AddressOffset = 0x0\r\n[04-14_03:05:46:106] < IPv4 = 10.38.21.158/30\r\n[04-14_03:05:46:106] < gw = 10.38.21.157\r\n[04-14_03:05:46:106] < dns1 = 211.138.180.2\r\n[04-14_03:05:46:107] < dns2 = 211.138.180.3\r\n[04-14_03:05:46:107] < ipv4 mtu = 1500\r\n[04-14_03:05:46:112] ifconfig rmnet_mhi0 up\r\n[04-14_03:05:46:140] ifconfig rmnet_mhi0.1 up\r\n[04-14_03:05:46:168] ip -4 address flush dev rmnet_mhi0.1\r\n[04-14_03:05:46:190] ip -4 address add 10.38.21.158/30 dev rmnet_mhi0.1\r\n[04-14_03:05:46:212] ip -4 route add default via 10.38.21.157 dev rmnet_mhi0.1\r\n[04-14_03:05:50:730] handle_client_connect client_fd=6, client_idx=2\r\n[  227.558631] net rmnet_mhi0: link_state 0x1 -> 0x3\r\n\r\nroot@OpenWrt:~# quectel-CM -n 2 -s 4gnet \r\n[04-14_03:05:50:725] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-14_03:05:50:726] network interface '' or qmidev '' is not exist\r\n[04-14_03:05:50:727] netcard driver = pcie_mhi, driver version = V1.3.0.17\r\n[04-14_03:05:50:728] mbim_qmap_mode = 4, vlan_id = 0x02, qmap_netcard = rmnet_mhi0.2\r\n[04-14_03:05:50:729] Modem works in MBIM mode\r\n[04-14_03:05:50:730] connect to quectel-mbim-proxy sockfd = 8\r\n[04-14_03:05:50:730] cdc_wdm_fd = 8\r\n[04-14_03:05:50:731] mbim_open_device()\r\n[04-14_03:05:50:732] mbim_device_caps_query()\r\n[04-14_03:05:50:738] DeviceId:     860459050041596\r\n[04-14_03:05:50:739] FirmwareInfo: EM120RGLAPR02A03M4G_01.001.07\r\n\r\n[04-14_03:05:50:739] HardwareInfo: EM120R_GL\r\n[04-14_03:05:50:740] mbim_device_services_query()\r\n[04-14_03:05:50:744] mbim_set_radio_state( 1 )\r\n[04-14_03:05:50:747] HwRadioState: 1, SwRadioState: 1\r\n[04-14_03:05:50:747] mbim_subscriber_status_query()\r\n[04-14_03:05:50:757] SubscriberId: 460028563800461\r\n[04-14_03:05:50:758] SimIccId:     89860015120716380461\r\n[04-14_03:05:50:758] SubscriberReadyState NotInitialized -> Initialized \r\n[04-14_03:05:50:759] mbim_register_state_query()\r\n[04-14_03:05:50:763] RegisterState Unknown -> Home \r\n[04-14_03:05:50:764] mbim_packet_service_query()\r\n[04-14_03:05:50:768] PacketServiceState Unknown -> Attached \r\n[04-14_03:05:50:769] mbim_query_connect(sessionID=2)\r\n[04-14_03:05:50:772] ActivationState Unknown -> Deactivated \r\n[04-14_03:05:50:773] ifconfig rmnet_mhi0.2 0.0.0.0\r\n[04-14_03:05:50:799] ifconfig rmnet_mhi0.2 down\r\n[04-14_03:05:50:834] mbim_set_connect(onoff=1, sessionID=2)\r\n[04-14_03:05:51:170] ActivationState Deactivated -> Activated \r\n[04-14_03:05:51:171] mbim_ip_config(sessionID=2)\r\n[04-14_03:05:51:174] < SessionId = 2\r\n[04-14_03:05:51:174] < IPv4ConfigurationAvailable = 0xf\r\n[04-14_03:05:51:175] < IPv6ConfigurationAvailable = 0x0\r\n[04-14_03:05:51:175] < IPv4AddressCount = 0x1\r\n[04-14_03:05:51:175] < IPv4AddressOffset = 0x3c\r\n[04-14_03:05:51:176] < IPv6AddressCount = 0x0\r\n[04-14_03:05:51:176] < IPv6AddressOffset = 0x0\r\n[04-14_03:05:51:176] < IPv4 = 10.36.109.217/30\r\n[04-14_03:05:51:177] < gw = 10.36.109.218\r\n[04-14_03:05:51:177] < dns1 = 211.138.180.2\r\n[04-14_03:05:51:178] < dns2 = 211.138.180.3\r\n[04-14_03:05:51:178] < ipv4 mtu = 1500\r\n[04-14_03:05:51:182] ifconfig rmnet_mhi0 up\r\n[04-14_03:05:51:206] ifconfig rmnet_mhi0.2 up\r\n[04-14_03:05:51:233] ip -4 address flush dev rmnet_mhi0.2\r\n[04-14_03:05:51:254] ip -4 address add 10.36.109.217/30 dev rmnet_mhi0.2\r\n[04-14_03:05:51:277] ip -4 route add default via 10.36.109.218 dev rmnet_mhi0.2\r\n\r\nroot@OpenWrt:~# ifconfig rmnet_mhi0.1\r\nrmnet_mhi0.1 Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \r\n          inet addr:10.38.21.158  Mask:255.255.255.252\r\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:37 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:29 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:9907 (9.6 KiB)  TX bytes:2764 (2.6 KiB)\r\n\r\nroot@OpenWrt:~# ifconfig rmnet_mhi0.2\r\nrmnet_mhi0.2 Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \r\n          inet addr:10.36.109.217  Mask:255.255.255.252\r\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:5 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:18 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:344 (344.0 B)  TX bytes:1152 (1.1 KiB)\r\n\r\nroot@OpenWrt:~# ip ro del 8.8.8.8/32\r\nRTNETLINK answers: No such process\r\nroot@OpenWrt:~# ip ro add 8.8.8.8/32 dev rmnet_mhi0.1\r\nroot@OpenWrt:~# ping 8.8.8.8\r\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\r\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=73.248 ms\r\n\r\nroot@OpenWrt:~# ip ro del 8.8.8.8/32\r\nroot@OpenWrt:~# ip ro del 8.8.8.8/32\r\nRTNETLINK answers: No such process\r\nroot@OpenWrt:~# ip ro add 8.8.8.8/32 dev rmnet_mhi0.2\r\nroot@OpenWrt:~# ping 8.8.8.8\r\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\r\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=99.637 ms\r\n\r\nroot@OpenWrt:~# quectel-CM -k 2\r\n[04-14_03:06:58:912] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-14_03:06:59:063] /proc/3565/cmdline: quectel-CM -n 2 -s 4gnet\r\n[04-14_03:06:59:064] send SIGINT to process 3565\r\n[  295.719442] net rmnet_mhi0: link_state 0x3 -> 0x1\r\n[04-14_03:06:59:407] proxy_loop poll fd = 6, revents = 0011\r\n[04-14_03:06:59:408] handle_client_disconnect client_fd=6, client_idx=2\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/pcie_mhi_qmap=1.txt",
    "content": "root@OpenWrt:/# cat /sys/class/net/rmnet_mhi0/qmap_mode \r\n1\r\nroot@OpenWrt:/# cat /sys/module/pcie_mhi/parameters/mhi_mbim_enabled \r\n0\r\nroot@OpenWrt:/# dmesg | grep mhi\r\n[   18.442226] mhi_init Quectel_Linux_PCIE_MHI_Driver_V1.3.0.17\r\n[   18.443032] mhi_pci_probe pci_dev->name = 0000:01:00.0, domain=0, bus=1, slot=0, vendor=17CB, device=0306\r\n[   18.447488] mhi_q 0000:01:00.0: BAR 0: assigned [mem 0x48000000-0x48000fff 64bit]\r\n[   18.456563] mhi_q 0000:01:00.0: enabling device (0140 -> 0142)\r\n[   18.464184] [I][mhi_init_pci_dev] msi_required = 5, msi_allocated = 5, msi_irq = 197\r\n[   18.464215] [I][mhi_power_up] dev_state:RESET\r\n[   18.464225] [I][mhi_async_power_up] Requested to power on\r\n[   18.464432] [I][mhi_alloc_coherent] size = 114688, dma_handle = 8d400000\r\n[   18.464445] [I][mhi_init_dev_ctxt] mhi_ctxt->ctrl_seg = d1766000\r\n[   18.466003] [I][mhi_async_power_up] dev_state:RESET ee:AMSS\r\n[   18.466080] [I][mhi_pm_st_worker] Transition to state:READY\r\n[   18.466109] [I][mhi_pm_st_worker] INVALID_EE -> AMSS\r\n[   18.466135] [I][mhi_ready_state_transition] Waiting to enter READY state\r\n[   18.466224] [I][mhi_async_power_up] Power on setup success\r\n[   18.466265] [I][mhi_pci_probe] Return successful\r\n[   18.577299] [I][mhi_intvec_threaded_handlr] device ee:AMSS dev_state:READY, pm_state:POR\r\n[   18.577312] [I][mhi_ready_state_transition] Device in READY State\r\n[   18.577325] [I][mhi_intvec_threaded_handlr] device ee:AMSS dev_state:READY, INVALID_EE\r\n[   18.577329] [I][mhi_tryset_pm_state] Transition to pm state from:POR to:POR\r\n[   18.577337] [I][mhi_init_mmio] Initializing MMIO\r\n[   18.577344] [I][mhi_init_mmio] CHDBOFF:0x300\r\n[   18.577361] [I][mhi_init_mmio] ERDBOFF:0x700\r\n[   18.577372] [I][mhi_init_mmio] Programming all MMIO values.\r\n[   18.690834] [I][mhi_dump_tre] carl_ev evt_state_change mhistate=2\r\n[   18.690854] [I][mhi_process_ctrl_ev_ring] MHI state change event to state:M0\r\n[   18.690866] [I][mhi_pm_m0_transition] Entered With State:READY PM_STATE:POR\r\n[   18.690879] [I][mhi_tryset_pm_state] Transition to pm state from:POR to:M0\r\n[   18.694229] [I][mhi_dump_tre] carl_ev evt_ee_state execenv=2\r\n[   18.694241] [I][mhi_process_ctrl_ev_ring] MHI EE received event:AMSS\r\n[   18.694293] [I][mhi_pm_st_worker] Transition to state:MISSION MODE\r\n[   18.694310] [I][mhi_pm_st_worker] INVALID_EE -> AMSS\r\n[   18.694319] [I][mhi_pm_mission_mode_transition] Processing Mission Mode Transition\r\n[   18.694341] [I][mhi_init_timesync] No timesync capability found\r\n[   18.694350] [I][mhi_pm_mission_mode_transition] Adding new devices\r\n[   18.696365] [I][mhi_dtr_probe] Enter for DTR control channel\r\n[   18.696383] [I][__mhi_prepare_channel] Entered: preparing channel:18\r\n[   18.703113] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1, type=33\r\n[   18.703164] [I][__mhi_prepare_channel] Chan:18 successfully moved to start state\r\n[   18.703174] [I][__mhi_prepare_channel] Entered: preparing channel:19\r\n[   18.710681] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1, type=33\r\n[   18.710734] [I][__mhi_prepare_channel] Chan:19 successfully moved to start state\r\n[   18.710804] [I][mhi_dtr_probe] Exit with ret:0\r\n[   18.711774] [I][mhi_netdev_enable_iface] Prepare the channels for transfer\r\n[   18.711811] [I][__mhi_prepare_channel] Entered: preparing channel:100\r\n[   18.732097] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1, type=33\r\n[   18.732151] [I][__mhi_prepare_channel] Chan:100 successfully moved to start state\r\n[   18.732162] [I][__mhi_prepare_channel] Entered: preparing channel:101\r\n[   18.744170] [I][mhi_dump_tre] carl_ev evt_cmd_comp code=1, type=33\r\n[   18.744219] [I][__mhi_prepare_channel] Chan:101 successfully moved to start state\r\n[   18.749132] [I][mhi_netdev_enable_iface] Exited.\r\n[   18.750306] rmnet_vnd_register_device(rmnet_mhi0.1)=0\r\n[   18.752927] [I][mhi_pm_mission_mode_transition] Exit with ret:0\r\n\r\nroot@OpenWrt:/# busybox microcom /dev/mhi_DUN \r\nat+cpin?\r\n+CPIN: READY\r\n\r\nOK\r\nat+cops?\r\n+COPS: 0,0,\"CHINA MOBILE\",13\r\n\r\nOK\r\nat+csq\r\n+csq: 23,99\r\n\r\nOK\r\n\r\nroot@OpenWrt:/# quectel-CM -s cmnet &\r\n[04-13_09:26:58:077] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_09:26:58:078] network interface '' or qmidev '' is not exist\r\n[04-13_09:26:58:079] netcard driver = pcie_mhi, driver version = V1.3.0.17\r\n[04-13_09:26:58:080] qmap_mode = 1, qmap_version = 9, qmap_size = 16384, muxid = 0x81, qmap_netcard = rmnet_mhi0.1\r\n[04-13_09:26:58:080] Modem works in QMI mode\r\n[04-13_09:26:58:131] cdc_wdm_fd = 7\r\n[04-13_09:26:59:132] QmiWwanInit message timeout\r\n[04-13_09:27:00:140] Get clientWDS = 15\r\n[04-13_09:27:00:144] Get clientDMS = 1\r\n[04-13_09:27:00:147] Get clientNAS = 4\r\n[04-13_09:27:00:151] Get clientUIM = 1\r\n[04-13_09:27:00:155] Get clientWDA = 1\r\n[04-13_09:27:00:158] requestBaseBandVersion RM500QGLABR10A03M4G\r\n[04-13_09:27:00:161] qmap_settings.rx_urb_size = 16384\r\n[04-13_09:27:00:162] qmap_settings.ul_data_aggregation_max_datagrams  = 11\r\n[04-13_09:27:00:162] qmap_settings.ul_data_aggregation_max_size       = 8192\r\n[04-13_09:27:00:163] qmap_settings.dl_minimum_padding                 = 0\r\n[04-13_09:27:00:176] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_09:27:00:177] requestSetProfile[1] cmnet///0\r\n[04-13_09:27:00:190] requestGetProfile[1] cmnet///0\r\n[04-13_09:27:00:193] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\r\n[04-13_09:27:00:197] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-13_09:27:00:198] ifconfig rmnet_mhi0 down\r\n[04-13_09:27:00:222] ifconfig rmnet_mhi0.1 0.0.0.0\r\n[04-13_09:27:00:247] ifconfig rmnet_mhi0.1 down\r\n[04-13_09:27:00:281] requestSetupDataCall WdsConnectionIPv4Handle: 0x1228bb20\r\n[  245.284909] net rmnet_mhi0: link_state 0x0 -> 0x1\r\n[04-13_09:27:00:293] ifconfig rmnet_mhi0 up\r\n[  245.308696] [I][mhi_netdev_open] Opened net dev interface\r\n[04-13_09:27:00:318] ifconfig rmnet_mhi0.1 up\r\n[04-13_09:27:00:353] you are use OpenWrt?\r\n[04-13_09:27:00:354] should not calling udhcpc manually?\r\n[04-13_09:27:00:354] should modify /etc/config/network as below?\r\n[04-13_09:27:00:355] config interface wan\r\n[04-13_09:27:00:355] \toption ifname\trmnet_mhi0.1\r\n[04-13_09:27:00:355] \toption proto\tdhcp\r\n[04-13_09:27:00:356] should use \"/sbin/ifstaus wan\" to check rmnet_mhi0.1 's status?\r\n[04-13_09:27:00:356] busybox udhcpc -f -n -q -t 5 -i rmnet_mhi0.1\r\nudhcpc: started, v1.28.3\r\nudhcpc: sending discover\r\nudhcpc: sending select for 10.128.73.23\r\nudhcpc: lease of 10.128.73.23 obtained, lease time 7200\r\n[04-13_09:27:00:710] udhcpc: ifconfig rmnet_mhi0.1 10.128.73.23 netmask 255.255.255.240 broadcast +\r\n[04-13_09:27:00:742] udhcpc: setting default routers: 10.128.73.24\r\n\r\nroot@OpenWrt:/# ifconfig rmnet_mhi0.1\r\nrmnet_mhi0.1 Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \r\n          inet addr:10.128.73.23  Mask:255.255.255.240\r\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:2 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:612 (612.0 B)  TX bytes:684 (684.0 B)\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/pcie_mhi_qmap=1_bridge.txt",
    "content": "root@OpenWrt:/# lspci\r\n00:00.0 Class 0604: 17cb:1001\r\n01:00.0 Class ff00: 17cb:0306\r\n\r\nroot@OpenWrt:~# insmod pcie_mhi.ko \r\n[   77.949271] mhi_init Quectel_Linux_PCIE_MHI_Driver_V1.3.0.17\r\n[   77.950949] mhi_pci_probe pci_dev->name = 0000:01:00.0, domain=0, bus=1, slot=0, vendor=17CB, device=0306\r\n[   77.955331] mhi_q 0000:01:00.0: BAR 0: assigned [mem 0x48000000-0x48000fff 64bit]\r\n[   77.963756] mhi_q 0000:01:00.0: enabling device (0140 -> 0142)\r\n[   78.048911] [I][mhi_netdev_enable_iface] Prepare the channels for transfer\r\n[   78.092304] [I][mhi_netdev_enable_iface] Exited.\r\n[   78.096580] rmnet_vnd_register_device(rmnet_mhi0.1)=0\r\n\r\nroot@OpenWrt:~# brctl addbr br0\r\nroot@OpenWrt:~# brctl addif br0 rmnet_mhi0.1\r\nroot@OpenWrt:~# brctl addif br0 eth1\r\n[  250.017213] device eth1 entered promiscuous mode\r\nroot@OpenWrt:~# brctl show\r\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\r\nbr0\t\t8000.00001c353487\tno\t\teth1\r\n\t\t\t\t\t\t\t                rmnet_mhi0.1\r\n\t\t\t\t\t\t\t                \r\nroot@OpenWrt:~# quectel-CM -s cmnet -b &\r\n[04-14_06:43:28:473] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-14_06:43:28:474] network interface '' or qmidev '' is not exist\r\n[04-14_06:43:28:475] netcard driver = pcie_mhi, driver version = V1.3.0.17\r\n[04-14_06:43:28:476] qmap_mode = 1, qmap_version = 9, qmap_size = 16384, muxid = 0x81, qmap_netcard = rmnet_mhi0.1\r\n[04-14_06:43:28:477] Modem works in QMI mode\r\n[04-14_06:43:28:531] cdc_wdm_fd = 7\r\n[04-14_06:43:29:532] QmiWwanInit message timeout\r\n[04-14_06:43:30:540] Get clientWDS = 15\r\n[04-14_06:43:30:543] Get clientDMS = 1\r\n[04-14_06:43:30:546] Get clientNAS = 4\r\n[04-14_06:43:30:550] Get clientUIM = 1\r\n[04-14_06:43:30:553] Get clientWDA = 1\r\n[04-14_06:43:30:557] requestBaseBandVersion RM500QGLABR10A03M4G\r\n[04-14_06:43:30:560] qmap_settings.rx_urb_size = 16384\r\n[04-14_06:43:30:561] qmap_settings.ul_data_aggregation_max_datagrams  = 11\r\n[04-14_06:43:30:561] qmap_settings.ul_data_aggregation_max_size       = 8192\r\n[04-14_06:43:30:561] qmap_settings.dl_minimum_padding                 = 0\r\n[04-14_06:43:30:575] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-14_06:43:30:575] requestSetProfile[1] cmnet///0\r\n[04-14_06:43:30:588] requestGetProfile[1] cmnet///0\r\n[04-14_06:43:30:591] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\r\n[04-14_06:43:30:595] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-14_06:43:30:595] ifconfig rmnet_mhi0 down\r\n[04-14_06:43:30:620] ifconfig rmnet_mhi0.1 0.0.0.0\r\nifconfig: SIOCSIFFLAGS: Network is down\r\n[04-14_06:43:30:644] ifconfig rmnet_mhi0.1 down\r\n[04-14_06:43:30:679] requestSetupDataCall WdsConnectionIPv4Handle: 0xb41f47d0\r\n[  263.869899] net rmnet_mhi0: link_state 0x0 -> 0x1\r\n[04-14_06:43:30:693] ifconfig rmnet_mhi0 up\r\n[  263.892647] [I][mhi_netdev_open] Opened net dev interface\r\n[04-14_06:43:30:718] ifconfig rmnet_mhi0.1 up\r\n[04-14_06:43:30:746] echo '0xa59316b' > /sys/class/net/rmnet_mhi0.1/bridge_ipv4\r\n\r\nroot@OpenWrt:~# ifconfig br0 up\r\n[  268.800026] br0: port 2(eth1) entered forwarding state\r\n[  268.800336] br0: port 2(eth1) entered forwarding state\r\n[  268.804251] br0: port 1(rmnet_mhi0.1) entered forwarding state\r\n[  268.809465] br0: port 1(rmnet_mhi0.1) entered forwarding state\r\n[  283.845790] br0: port 2(eth1) entered forwarding state\r\n\r\n[  296.512489] rmnet_mhi0.1 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[  296.515756] rmnet_mhi0.1 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[  296.586584] rmnet_mhi0.1 sip = 10.89.49.107, tip=10.89.49.108, ipv4=10.89.49.107\r\n[  296.672356] rmnet_mhi0.1 sip = 10.89.49.107, tip=10.89.49.108, ipv4=10.89.49.107\r\n[  296.792061] rmnet_mhi0.1 sip = 10.89.49.107, tip=10.89.49.108, ipv4=10.89.49.107\r\n[  296.832822] rmnet_mhi0.1 sip = 10.89.49.107, tip=10.89.49.108, ipv4=10.89.49.107\r\n[  296.941073] rmnet_mhi0.1 sip = 0.0.0.0, tip=10.89.49.107, ipv4=10.89.49.107\r\n[  297.941310] rmnet_mhi0.1 sip = 0.0.0.0, tip=10.89.49.107, ipv4=10.89.49.107\r\n[  298.941528] rmnet_mhi0.1 sip = 0.0.0.0, tip=10.89.49.107, ipv4=10.89.49.107\r\n[  299.941704] rmnet_mhi0.1 sip = 10.89.49.107, tip=10.89.49.107, ipv4=10.89.49.107\r\n[  300.024484] rmnet_mhi0.1 sip = 10.89.49.107, tip=10.89.49.108, ipv4=10.89.49.107\r\n[  300.051995] rmnet_mhi0.1 sip = 10.89.49.107, tip=10.89.49.108, ipv4=10.89.49.107\r\n[  303.915933] rmnet_mhi0.1 sip = 10.89.49.107, tip=10.89.49.108, ipv4=10.89.49.107\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/pcie_mhi_qmap=4.txt",
    "content": "root@OpenWrt:/# lspci\r\n00:00.0 Class 0604: 17cb:1001\r\n01:00.0 Class ff00: 17cb:0306\r\n\r\nroot@OpenWrt:/# insmod pcie_mhi.ko qmap_mode=4\r\n[   61.988878] mhi_init Quectel_Linux_PCIE_MHI_Driver_V1.3.0.17\r\n[   61.989484] mhi_pci_probe pci_dev->name = 0000:01:00.0, domain=0, bus=1, slot=0, vendor=17CB, device=0306\r\n[   61.994039] mhi_q 0000:01:00.0: BAR 0: assigned [mem 0x48000000-0x48000fff 64bit]\r\n[   62.003208] mhi_q 0000:01:00.0: enabling device (0140 -> 0142)\r\n[   62.191947] [I][mhi_netdev_enable_iface] Prepare the channels for transfer\r\n[   62.224065] [I][mhi_netdev_enable_iface] Exited.\r\n[   62.225619] rmnet_vnd_register_device(rmnet_mhi0.1)=0\r\n[   62.229289] rmnet_vnd_register_device(rmnet_mhi0.2)=0\r\n[   62.234378] rmnet_vnd_register_device(rmnet_mhi0.3)=0\r\n[   62.240039] rmnet_vnd_register_device(rmnet_mhi0.4)=0\r\n\r\nroot@OpenWrt:/# quectel-qmi-proxy -d /dev/mhi_QMI0 &\r\n[04-13_09:25:12:278] Will use cdc-wdm='/dev/mhi_QMI0', proxy='quectel-qmi-proxy0'\r\n[04-13_09:25:12:297] qmi_proxy_init enter\r\n[04-13_09:25:12:297] qmi_proxy_loop enter thread_id 0xb6e88d44\r\n[04-13_09:25:14:298] qmi_proxy_init succful\r\n[04-13_09:25:14:299] local server: quectel-qmi-proxy0 sockfd = 4\r\n[04-13_09:25:14:299] qmi_proxy_server_fd = 4\r\n\r\nroot@OpenWrt:/# quectel-CM -n 1 -s cmnet &\r\n[04-13_09:25:32:336] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_09:25:32:337] network interface '' or qmidev '' is not exist\r\n[04-13_09:25:32:338] netcard driver = pcie_mhi, driver version = V1.3.0.17\r\n[04-13_09:25:32:339] qmap_mode = 4, qmap_version = 9, qmap_size = 16384, muxid = 0x81, qmap_netcard = rmnet_mhi0.1\r\n[04-13_09:25:32:340] Modem works in QMI mode\r\n[04-13_09:25:32:341] connect to quectel-qmi-proxy0 sockfd = 7\r\n[04-13_09:25:32:342] cdc_wdm_fd = 7\r\n[04-13_09:25:32:380] requestBaseBandVersion RM500QGLABR10A03M4G\r\n[04-13_09:25:32:382] qmap_settings.rx_urb_size = 16384\r\n[04-13_09:25:32:383] qmap_settings.ul_data_aggregation_max_datagrams  = 11\r\n[04-13_09:25:32:383] qmap_settings.ul_data_aggregation_max_size       = 8192\r\n[04-13_09:25:32:384] qmap_settings.dl_minimum_padding                 = 0\r\n[04-13_09:25:32:394] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_09:25:32:395] requestSetProfile[1] cmnet///0\r\n[04-13_09:25:32:409] requestGetProfile[1] cmnet///0\r\n[04-13_09:25:32:414] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\r\n[04-13_09:25:32:418] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-13_09:25:32:419] ifconfig rmnet_mhi0 down\r\n[04-13_09:25:32:448] ifconfig rmnet_mhi0.1 0.0.0.0\r\n[04-13_09:25:32:473] ifconfig rmnet_mhi0.1 down\r\n[04-13_09:25:32:514] requestSetupDataCall WdsConnectionIPv4Handle: 0x2313a2a0\r\n[  121.648172] net rmnet_mhi0: link_state 0x0 -> 0x1\r\n[04-13_09:25:32:525] ifconfig rmnet_mhi0 up\r\n[  121.671210] [I][mhi_netdev_open] Opened net dev interface\r\n[04-13_09:25:32:551] ifconfig rmnet_mhi0.1 up\r\n[04-13_09:25:32:586] you are use OpenWrt?\r\n[04-13_09:25:32:587] should not calling udhcpc manually?\r\n[04-13_09:25:32:587] should modify /etc/config/network as below?\r\n[04-13_09:25:32:587] config interface wan\r\n[04-13_09:25:32:588] \toption ifname\trmnet_mhi0.1\r\n[04-13_09:25:32:588] \toption proto\tdhcp\r\n[04-13_09:25:32:589] should use \"/sbin/ifstaus wan\" to check rmnet_mhi0.1 's status?\r\n[04-13_09:25:32:589] busybox udhcpc -f -n -q -t 5 -i rmnet_mhi0.1\r\nudhcpc: started, v1.28.3\r\nudhcpc: sending discover\r\nudhcpc: sending select for 10.174.91.70\r\nudhcpc: lease of 10.174.91.70 obtained, lease time 7200\r\n[04-13_09:25:32:980] udhcpc: ifconfig rmnet_mhi0.1 10.174.91.70 netmask 255.255.255.252 broadcast +\r\n[04-13_09:25:33:007] udhcpc: setting default routers: 10.174.91.69\r\n\r\nroot@OpenWrt:/# quectel-CM -n 2 -s 4gnet &\r\n[04-13_09:25:42:976] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_09:25:42:977] network interface '' or qmidev '' is not exist\r\n[04-13_09:25:42:978] netcard driver = pcie_mhi, driver version = V1.3.0.17\r\n[04-13_09:25:42:978] qmap_mode = 4, qmap_version = 9, qmap_size = 16384, muxid = 0x82, qmap_netcard = rmnet_mhi0.2\r\n[04-13_09:25:42:979] Modem works in QMI mode\r\n[04-13_09:25:42:981] connect to quectel-qmi-proxy0 sockfd = 7\r\n[04-13_09:25:42:982] cdc_wdm_fd = 7\r\n[04-13_09:25:43:010] requestBaseBandVersion RM500QGLABR10A03M4G\r\n[04-13_09:25:43:013] qmap_settings.rx_urb_size = 16384\r\n[04-13_09:25:43:014] qmap_settings.ul_data_aggregation_max_datagrams  = 11\r\n[04-13_09:25:43:014] qmap_settings.ul_data_aggregation_max_size       = 8192\r\n[04-13_09:25:43:015] qmap_settings.dl_minimum_padding                 = 0\r\n[04-13_09:25:43:030] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_09:25:43:030] requestSetProfile[2] 4gnet///0\r\n[04-13_09:25:43:046] requestGetProfile[2] 4gnet///0\r\n[04-13_09:25:43:050] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\r\n[04-13_09:25:43:054] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-13_09:25:43:055] ifconfig rmnet_mhi0.2 0.0.0.0\r\n[04-13_09:25:43:082] ifconfig rmnet_mhi0.2 down\r\n[04-13_09:25:43:507] requestSetupDataCall WdsConnectionIPv4Handle: 0x2332a780\r\n[  132.641313] net rmnet_mhi0: link_state 0x1 -> 0x3\r\n[04-13_09:25:43:519] ifconfig rmnet_mhi0 up\r\n[04-13_09:25:43:543] ifconfig rmnet_mhi0.2 up\r\n[04-13_09:25:43:570] you are use OpenWrt?\r\n[04-13_09:25:43:570] should not calling udhcpc manually?\r\n[04-13_09:25:43:571] should modify /etc/config/network as below?\r\n[04-13_09:25:43:571] config interface wan\r\n[04-13_09:25:43:571] \toption ifname\trmnet_mhi0.2\r\n[04-13_09:25:43:572] \toption proto\tdhcp\r\n[04-13_09:25:43:572] should use \"/sbin/ifstaus wan\" to check rmnet_mhi0.2 's status?\r\n[04-13_09:25:43:573] busybox udhcpc -f -n -q -t 5 -i rmnet_mhi0.2\r\nudhcpc: started, v1.28.3\r\nudhcpc: sending discover\r\nudhcpc: sending select for 10.163.253.197\r\nudhcpc: lease of 10.163.253.197 obtained, lease time 7200\r\n[04-13_09:25:43:810] udhcpc: ifconfig rmnet_mhi0.2 10.163.253.197 netmask 255.255.255.252 broadcast +\r\n[04-13_09:25:43:836] udhcpc: setting default routers: 10.163.253.198\r\n\r\nroot@OpenWrt:/# ifconfig rmnet_mhi0.1\r\nrmnet_mhi0.1 Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \r\n          inet addr:10.174.91.70  Mask:255.255.255.252\r\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:2 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:612 (612.0 B)  TX bytes:1380 (1.3 KiB)\r\n\r\nroot@OpenWrt:/# ifconfig rmnet_mhi0.2\r\nrmnet_mhi0.2 Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \r\n          inet addr:10.163.253.197  Mask:255.255.255.252\r\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:2 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:2 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:612 (612.0 B)  TX bytes:684 (684.0 B)\r\n\r\nroot@OpenWrt:/# ip ro del 8.8.8.8/32 \r\nRTNETLINK answers: No such process\r\nroot@OpenWrt:/# ip ro add 8.8.8.8/32 dev rmnet_mhi0.1\r\nroot@OpenWrt:/# ping 8.8.8.8\r\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\r\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=390.869 ms\r\n\r\nroot@OpenWrt:/# ip ro del 8.8.8.8/32 \r\nroot@OpenWrt:/# ip ro del 8.8.8.8/32 \r\nRTNETLINK answers: No such process\r\nroot@OpenWrt:/# ip ro add 8.8.8.8/32 dev rmnet_mhi0.2\r\nroot@OpenWrt:/# ping 8.8.8.8\r\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\r\n64 bytes from 8.8.8.8: seq=0 ttl=111 time=314.395 ms"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/pcie_mhi_qmap=4_bridge.txt",
    "content": "root@OpenWrt:~# lspci\r\n00:00.0 Class 0604: 17cb:1001\r\n01:00.0 Class ff00: 17cb:0306\r\nroot@OpenWrt:~# \r\n\r\nroot@OpenWrt:~# insmod pcie_mhi.ko qmap_mode=4\r\n[  200.906104] mhi_init Quectel_Linux_PCIE_MHI_Driver_V1.3.0.17\r\n[  200.907913] mhi_pci_probe pci_dev->name = 0000:01:00.0, domain=0, bus=1, slot=0, vendor=17CB, device=0306\r\n[  200.912164] mhi_q 0000:01:00.0: BAR 0: assigned [mem 0x48000000-0x48000fff 64bit]\r\n[  200.920593] mhi_q 0000:01:00.0: enabling device (0140 -> 0142)\r\nroot@OpenWrt:~# [  201.112214] [I][mhi_netdev_enable_iface] Prepare the channels for transfer\r\n[  201.154640] [I][mhi_netdev_enable_iface] Exited.\r\n[  201.159271] rmnet_vnd_register_device(rmnet_mhi0.1)=0\r\n[  201.162953] rmnet_vnd_register_device(rmnet_mhi0.2)=0\r\n[  201.167698] rmnet_vnd_register_device(rmnet_mhi0.3)=0\r\n[  201.172178] rmnet_vnd_register_device(rmnet_mhi0.4)=0\r\n\r\nroot@OpenWrt:~# brctl addbr br0\r\nroot@OpenWrt:~# brctl addif br0 eth1\r\nroot@OpenWrt:~# brctl addif br0 rmnet_mhi0.2\r\nroot@OpenWrt:~# brctl show\r\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\r\nbr0\t\t8000.00001c353487\tno\t\teth1\r\n\t\t\t\t\t\t\t                rmnet_mhi0.2\r\n\t\t\t\t\t\t\t                \r\nroot@OpenWrt:~# quectel-qmi-proxy -d /dev/mhi_QMI0 &\r\n[04-14_06:44:01:556] Will use cdc-wdm='/dev/mhi_QMI0', proxy='quectel-qmi-proxy0'\r\n[04-14_06:44:01:573] qmi_proxy_init enter\r\n[04-14_06:44:01:573] qmi_proxy_loop enter thread_id 0xb6f20d44\r\n[04-14_06:44:03:574] qmi_proxy_init succful\r\n[04-14_06:44:03:574] local server: quectel-qmi-proxy0 sockfd = 4\r\n[04-14_06:44:03:575] qmi_proxy_server_fd = 4\r\n\r\n\r\nroot@OpenWrt:~# quectel-CM -n 1 -s cmnet &\r\n[04-14_06:47:53:303] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-14_06:47:53:314] network interface '' or qmidev '' is not exist\r\n[04-14_06:47:53:315] netcard driver = pcie_mhi, driver version = V1.3.0.17\r\n[04-14_06:47:53:316] qmap_mode = 4, qmap_version = 9, qmap_size = 16384, muxid = 0x81, qmap_netcard = rmnet_mhi0.1\r\n[04-14_06:47:53:316] Modem works in QMI mode\r\n[04-14_06:47:53:318] connect to quectel-qmi-proxy0 sockfd = 7\r\n[04-14_06:47:53:318] cdc_wdm_fd = 7\r\n[04-14_06:47:53:326] Get clientWDS = 15\r\n[04-14_06:47:53:329] Get clientDMS = 2\r\n[04-14_06:47:53:334] Get clientNAS = 4\r\n[04-14_06:47:53:338] Get clientUIM = 1\r\n[04-14_06:47:53:343] Get clientWDA = 1\r\n[04-14_06:47:53:347] requestBaseBandVersion RM500QGLABR10A03M4G\r\n[04-14_06:47:53:351] qmap_settings.rx_urb_size = 16384\r\n[04-14_06:47:53:352] qmap_settings.ul_data_aggregation_max_datagrams  = 11\r\n[04-14_06:47:53:352] qmap_settings.ul_data_aggregation_max_size       = 8192\r\n[04-14_06:47:53:352] qmap_settings.dl_minimum_padding                 = 0\r\n[04-14_06:47:53:369] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-14_06:47:53:370] requestSetProfile[1] cmnet///0\r\n[04-14_06:47:53:402] requestGetProfile[1] cmnet///0\r\n[04-14_06:47:53:407] requestRegistrationState2 MCC: 0, MNC: 0, PS: Detached, DataCap: UNKNOW\r\n[04-14_06:47:53:411] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-14_06:47:53:412] ifconfig rmnet_mhi0 down\r\n[04-14_06:47:53:436] ifconfig rmnet_mhi0.1 0.0.0.0\r\n[04-14_06:47:53:460] ifconfig rmnet_mhi0.1 down\r\n[04-14_06:48:26:399] requestRegistrationState2 MCC: 460, MNC: 0, PS: Detached, DataCap: UNKNOW\r\n[04-14_06:48:26:405] requestRegistrationState2 MCC: 460, MNC: 0, PS: Detached, DataCap: UNKNOW\r\n[04-14_06:48:26:411] requestRegistrationState2 MCC: 460, MNC: 0, PS: Detached, DataCap: UNKNOW\r\n[04-14_06:48:26:970] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\r\n[04-14_06:48:26:992] requestSetupDataCall WdsConnectionIPv4Handle: 0x34176710\r\n[04-14_06:48:27:005] ifconfig rmnet_mhi0 up\r\n[04-14_06:48:27:031] ifconfig rmnet_mhi0.1 up\r\n[04-14_06:48:27:057] you are use OpenWrt?\r\n[04-14_06:48:27:057] should not calling udhcpc manually?\r\n[04-14_06:48:27:080] should use \"/sbin/ifstaus wan\" to check rmnet_mhi0.1 's status?\r\n[04-14_06:48:27:081] busybox udhcpc -f -n -q -t 5 -i rmnet_mhi0.1\r\n[04-14_06:48:27:363] udhcpc: ifconfig rmnet_mhi0.1 10.245.22.3 netmask 255.255.255.248 broadcast +\r\n[04-14_06:48:27:398] udhcpc: setting default routers: 10.245.22.4\r\n[04-14_06:48:27:491] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\r\n\r\nroot@OpenWrt:~# quectel-CM -n 2 -s 4gnet -b  &\r\n[04-14_06:48:06:842] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-14_06:48:06:853] network interface '' or qmidev '' is not exist\r\n[04-14_06:48:06:854] netcard driver = pcie_mhi, driver version = V1.3.0.17\r\n[04-14_06:48:06:855] qmap_mode = 4, qmap_version = 9, qmap_size = 16384, muxid = 0x82, qmap_netcard = rmnet_mhi0.2\r\n[04-14_06:48:06:855] Modem works in QMI mode\r\n[04-14_06:48:06:857] connect to quectel-qmi-proxy0 sockfd = 7\r\n[04-14_06:48:06:858] cdc_wdm_fd = 7\r\n[04-14_06:48:06:864] Get clientWDS = 16\r\n[04-14_06:48:06:867] Get clientDMS = 3\r\n[04-14_06:48:06:871] Get clientNAS = 5\r\n[04-14_06:48:06:874] Get clientUIM = 2\r\n[04-14_06:48:06:879] Get clientWDA = 2\r\n[04-14_06:48:06:886] requestBaseBandVersion RM500QGLABR10A03M4G\r\n[04-14_06:48:06:891] qmap_settings.rx_urb_size = 16384\r\n[04-14_06:48:06:891] qmap_settings.ul_data_aggregation_max_datagrams  = 11\r\n[04-14_06:48:06:892] qmap_settings.ul_data_aggregation_max_size       = 8192\r\n[04-14_06:48:06:892] qmap_settings.dl_minimum_padding                 = 0\r\n[04-14_06:48:06:909] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-14_06:48:06:909] requestSetProfile[2] 4gnet///0\r\n[04-14_06:48:06:940] requestGetProfile[2] 4gnet///0\r\n[04-14_06:48:06:944] requestRegistrationState2 MCC: 0, MNC: 0, PS: Detached, DataCap: UNKNOW\r\n[04-14_06:48:06:949] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-14_06:48:06:949] ifconfig rmnet_mhi0 down\r\n[04-14_06:48:06:973] ifconfig rmnet_mhi0.2 0.0.0.0\r\n[04-14_06:48:06:998] ifconfig rmnet_mhi0.2 down\r\n[04-14_06:48:26:400] requestRegistrationState2 MCC: 460, MNC: 0, PS: Detached, DataCap: UNKNOW\r\n[04-14_06:48:26:405] requestRegistrationState2 MCC: 460, MNC: 0, PS: Detached, DataCap: UNKNOW\r\n[04-14_06:48:26:411] requestRegistrationState2 MCC: 460, MNC: 0, PS: Detached, DataCap: UNKNOW\r\n[04-14_06:48:26:970] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\r\n[04-14_06:48:27:220] requestSetupDataCall WdsConnectionIPv4Handle: 0x341450a0\r\n[04-14_06:48:27:228] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\r\n[04-14_06:48:27:238] ifconfig rmnet_mhi0 up\r\n[04-14_06:48:27:263] ifconfig rmnet_mhi0.2 up\r\n[04-14_06:48:27:313] echo '0xaf51be9' > /sys/class/net/rmnet_mhi0.2/bridge_ipv4\r\n\r\nroot@OpenWrt:~# ifconfig rmnet_mhi0.1\r\nrmnet_mhi0.1 Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \r\n          inet addr:10.245.22.3  Mask:255.255.255.248\r\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:6 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:1836 (1.7 KiB)  TX bytes:2052 (2.0 KiB)\r\n\r\nroot@OpenWrt:~# ifconfig rmnet_mhi0.2\r\nrmnet_mhi0.2 Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \r\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:347 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:795 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:119871 (117.0 KiB)  TX bytes:121254 (118.4 KiB)\r\n\r\nroot@OpenWrt:~# ifconfig br0 up\r\n[  520.005476] rmnet_mhi0.2 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[  520.025896] rmnet_mhi0.2 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[  520.028002] rmnet_mhi0.2 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[  520.144371] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.234, ipv4=10.245.27.233\r\n[  520.410052] rmnet_mhi0.2 sip = 0.0.0.0, tip=10.245.27.233, ipv4=10.245.27.233\r\n[  520.414504] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.234, ipv4=10.245.27.233\r\n[  520.847074] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.234, ipv4=10.245.27.233\r\n[  521.410241] rmnet_mhi0.2 sip = 0.0.0.0, tip=10.245.27.233, ipv4=10.245.27.233\r\n[  522.410455] rmnet_mhi0.2 sip = 0.0.0.0, tip=10.245.27.233, ipv4=10.245.27.233\r\n[  522.822594] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.234, ipv4=10.245.27.233\r\n[  523.410638] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.233, ipv4=10.245.27.233\r\n[  523.510028] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.234, ipv4=10.245.27.233\r\n[  523.997961] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.234, ipv4=10.245.27.233\r\n[  543.799483] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.234, ipv4=10.245.27.233\r\n[  543.929301] rmnet_mhi0.2 sip = 10.245.27.233, tip=10.245.27.234, ipv4=10.245.27.233\r\n\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/qmi_wwan_q.txt",
    "content": "root@ZhuoTK:/# dmesg\r\n[   15.840000] qmi_wwan_q 1-1.3:1.4: cdc-wdm0: USB WDM device\r\n[   15.860000] qmi_wwan_q 1-1.3:1.4: Quectel Android work on RawIP mode\r\n[   15.860000] qmi_wwan_q 1-1.3:1.4: rx_urb_size = 1520\r\n[   15.870000] qmi_wwan_q 1-1.3:1.4 wwan0: register 'qmi_wwan_q' at usb-101c0000.ehci-1.3, WWAN/QMI device, da:0b:ce:b2:db:21\r\n\r\nroot@ZhuoTK:/# quectel-CM -s cment &\r\n[04-13_03:20:20:456] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_03:20:20:459] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x003\r\n[04-13_03:20:20:460] Auto find qmichannel = /dev/cdc-wdm0\r\n[04-13_03:20:20:460] Auto find usbnet_adapter = wwan0\r\n[04-13_03:20:20:461] netcard driver = qmi_wwan_q, driver version = V1.2.0.23\r\n[04-13_03:20:20:461] Modem works in QMI mode\r\n[04-13_03:20:20:469] cdc_wdm_fd = 7\r\n[04-13_03:20:20:547] Get clientWDS = 4\r\n[04-13_03:20:20:579] Get clientDMS = 1\r\n[04-13_03:20:20:611] Get clientNAS = 4\r\n[04-13_03:20:20:643] Get clientUIM = 1\r\n[04-13_03:20:20:675] Get clientWDA = 1\r\n[04-13_03:20:20:707] requestBaseBandVersion EC25EFAR06A11M4G\r\n[04-13_03:20:20:836] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_03:20:20:836] requestSetProfile[1] cment///0\r\n[04-13_03:20:20:899] requestGetProfile[1] cment///0\r\n[04-13_03:20:20:931] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\r\n[04-13_03:20:20:963] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-13_03:20:20:963] ifconfig wwan0 0.0.0.0\r\n[04-13_03:20:20:976] ifconfig wwan0 down\r\n[04-13_03:20:21:186] requestSetupDataCall WdsConnectionIPv4Handle: 0x8723e780\r\n[04-13_03:20:21:316] ifconfig wwan0 up\r\n[04-13_03:20:21:329] you are use OpenWrt?\r\n[04-13_03:20:21:330] should not calling udhcpc manually?\r\n[04-13_03:20:21:330] should modify /etc/config/network as below?\r\n[04-13_03:20:21:330] config interface wan\r\n[04-13_03:20:21:330] \toption ifname\twwan0\r\n[04-13_03:20:21:330] \toption proto\tdhcp\r\n[04-13_03:20:21:330] should use \"/sbin/ifstaus wan\" to check wwan0 's status?\r\n[04-13_03:20:21:331] busybox udhcpc -f -n -q -t 5 -i wwan0\r\n[04-13_03:20:21:341] udhcpc (v1.23.2) started\r\n[04-13_03:20:21:353] Sending discover...\r\n[04-13_03:20:21:362] Sending select for 10.90.1.113...\r\n[04-13_03:20:21:365] Lease of 10.90.1.113 obtained, lease time 7200\r\n[04-13_03:20:21:370] udhcpc: ifconfig wwan0 10.90.1.113 netmask 255.255.255.252 broadcast +\r\n[04-13_03:20:21:380] udhcpc: setting default routers: 10.90.1.114\r\n\r\nroot@ZhuoTK:/# ifconfig wwan0\r\nwwan0     Link encap:Ethernet  HWaddr 00:CA:01:91:97:BA  \r\n          inet addr:10.90.1.113  Mask:255.255.255.252\r\n          inet6 addr: fe80::2ca:1ff:fe91:97ba/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:38 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:46 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:5244 (5.1 KiB)  TX bytes:6964 (6.8 KiB)\r\n\r\nroot@ZhuoTK:/# ip ro show\r\ndefault via 10.90.1.114 dev wwan0 \r\n10.90.1.112/30 dev wwan0  proto kernel  scope link  src 10.90.1.113 \r\n192.168.1.0/24 dev br-lan  proto kernel  scope link  src 192.168.1.251 \r\n\r\nroot@ZhuoTK:/# killall quectel-CM\r\n[04-13_03:20:46:130] requestDeactivateDefaultPDP WdsConnectionIPv4Handle\r\n[04-13_03:20:46:406] ifconfig wwan0 0.0.0.0\r\n[04-13_03:20:46:418] ifconfig wwan0 down\r\n[04-13_03:20:46:600] QmiWwanThread exit\r\n[04-13_03:20:46:600] qmi_main exit\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/qmi_wwan_q_bridge.txt",
    "content": "root@ZhuoTK:/# insmod qmi_wwan_q.ko \r\n[  116.910000] qmi_wwan_q 1-1.3:1.4: cdc-wdm0: USB WDM device\r\n[  116.930000] qmi_wwan_q 1-1.3:1.4: Quectel Android work on RawIP mode\r\n[  116.930000] qmi_wwan_q 1-1.3:1.4: rx_urb_size = 1520\r\n[  116.940000] qmi_wwan_q 1-1.3:1.4 wwan0: register 'qmi_wwan_q' at usb-101c0000.ehci-1.3, WWAN/QMI device, 06:fb:51:a3:d6:c5\r\n[  116.950000] usbcore: registered new interface driver qmi_wwan_q\r\n\r\nroot@ZhuoTK:/# brctl addbr br0\r\nroot@ZhuoTK:/# brctl addif br0 eth0.1\r\nroot@ZhuoTK:/# brctl addif br0 wwan0\r\nroot@ZhuoTK:/# brctl show\r\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\r\nbr0\t\t8000.00ca019197b9\tno\t\teth0.1\r\n\t\t\t\t\t\t\t                wwan0\r\n\r\nroot@ZhuoTK:/# quectel-CM -s cmnet -b &\r\nroot@ZhuoTK:/# [04-13_05:13:39:369] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_05:13:39:372] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x003\r\n[  143.340000] net wwan0: bridge_mode change to 0x1\r\n[04-13_05:13:39:373] Auto find qmichannel = /dev/cdc-wdm0\r\n[04-13_05:13:39:374] Auto find usbnet_adapter = wwan0\r\n[04-13_05:13:39:374] netcard driver = qmi_wwan_q, driver version = V1.2.0.23\r\n[04-13_05:13:39:380] Modem works in QMI mode\r\n[04-13_05:13:39:388] cdc_wdm_fd = 7\r\n[04-13_05:13:39:466] Get clientWDS = 5\r\n[04-13_05:13:39:496] Get clientDMS = 2\r\n[04-13_05:13:39:527] Get clientNAS = 4\r\n[04-13_05:13:39:559] Get clientUIM = 1\r\n[04-13_05:13:39:592] Get clientWDA = 1\r\n[04-13_05:13:39:626] requestBaseBandVersion EC25EFAR06A11M4G\r\n[04-13_05:13:39:752] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_05:13:39:752] requestSetProfile[1] cmnet///0\r\n[04-13_05:13:39:816] requestGetProfile[1] cmnet///0\r\n[04-13_05:13:39:848] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\r\n[04-13_05:13:39:879] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-13_05:13:39:880] ifconfig wwan0 0.0.0.0\r\n[04-13_05:13:39:893] ifconfig wwan0 down\r\n[04-13_05:13:39:943] requestSetupDataCall WdsConnectionIPv4Handle: 0x872627c0\r\n[04-13_05:13:40:073] ifconfig wwan0 up\r\n[04-13_05:13:40:085] echo '0xa8d9237' > /sys/class/net/wwan0/bridge_ipv4\r\n\r\nroot@ZhuoTK:/# ifconfig br0 up\r\n[  165.730000] wwan0 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[  165.750000] wwan0 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[  165.860000] wwan0 sip = 10.141.146.55, tip=10.141.146.56, ipv4=10.141.146.55\r\n[  165.870000] wwan0 sip = 10.141.146.55, tip=10.141.146.56, ipv4=10.141.146.55\r\n[  165.990000] wwan0 sip = 10.141.146.55, tip=10.141.146.56, ipv4=10.141.146.55\r\n[  166.010000] wwan0 sip = 0.0.0.0, tip=10.141.146.55, ipv4=10.141.146.55\r\n[  166.070000] wwan0 sip = 10.141.146.55, tip=10.141.146.56, ipv4=10.141.146.55\r\n[  167.010000] wwan0 sip = 0.0.0.0, tip=10.141.146.55, ipv4=10.141.146.55\r\n[  167.480000] br0: port 2(wwan0) entered forwarding state\r\n[  167.520000] br0: port 1(eth0.1) entered forwarding state\r\n[  168.020000] wwan0 sip = 0.0.0.0, tip=10.141.146.55, ipv4=10.141.146.55\r\n[  169.010000] wwan0 sip = 10.141.146.55, tip=10.141.146.55, ipv4=10.141.146.55\r\n[  169.120000] wwan0 sip = 10.141.146.55, tip=10.141.146.56, ipv4=10.141.146.55\r\n[  169.130000] wwan0 sip = 10.141.146.55, tip=10.141.146.56, ipv4=10.141.146.55\r\n[  176.620000] wwan0 sip = 10.141.146.55, tip=10.141.146.56, ipv4=10.141.146.55\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/qmi_wwan_q_qmap=1.txt",
    "content": "root@ZhuoTK:/# insmod qmi_wwan_q.ko qmap_mode=1\r\n[ 1367.200000] usbcore: registered new interface driver qmi_wwan_q\r\n[ 1383.840000] usb 1-1.3: new high-speed USB device number 7 using ehci-platform\r\n[ 1384.080000] qmi_wwan_q 1-1.3:1.4: cdc-wdm0: USB WDM device\r\n[ 1384.080000] qmi_wwan_q 1-1.3:1.4: Quectel Android work on RawIP mode\r\n[ 1384.100000] qmi_wwan_q 1-1.3:1.4: rx_urb_size = 4096\r\n[ 1384.100000] qmi_wwan_q 1-1.3:1.4 wwan0: register 'qmi_wwan_q' at usb-101c0000.ehci-1.3, WWAN/QMI device, da:0b:ce:b2:db:21\r\n\r\nroot@ZhuoTK:/# quectel-CM -s cmnet &\r\n[04-13_03:41:28:144] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_03:41:28:146] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x007\r\n[04-13_03:41:28:148] Auto find qmichannel = /dev/cdc-wdm0\r\n[04-13_03:41:28:148] Auto find usbnet_adapter = wwan0\r\n[04-13_03:41:28:148] netcard driver = qmi_wwan_q, driver version = V1.2.0.23\r\n[04-13_03:41:28:149] qmap_mode = 1, qmap_version = 5, qmap_size = 4096, muxid = 0x81, qmap_netcard = wwan0\r\n[04-13_03:41:28:150] Modem works in QMI mode\r\n[04-13_03:41:28:158] cdc_wdm_fd = 7\r\n[04-13_03:41:28:238] Get clientWDS = 4\r\n[04-13_03:41:28:271] Get clientDMS = 1\r\n[04-13_03:41:28:302] Get clientNAS = 4\r\n[04-13_03:41:28:334] Get clientUIM = 1\r\n[04-13_03:41:28:365] Get clientWDA = 1\r\n[04-13_03:41:28:397] requestBaseBandVersion EC25EFAR06A11M4G\r\n[04-13_03:41:28:430] qmap_settings.rx_urb_size = 4096\r\n[ 1393.530000] net wwan0: ul_data_aggregation_max_datagrams=11, ul_data_aggregation_max_size=4096, dl_minimum_padding=0\r\n[04-13_03:41:28:431] qmap_settings.ul_data_aggregation_max_datagrams  = 11\r\n[04-13_03:41:28:431] qmap_settings.ul_data_aggregation_max_size       = 4096\r\n[04-13_03:41:28:431] qmap_settings.dl_minimum_padding                 = 0\r\n[04-13_03:41:28:557] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_03:41:28:558] requestSetProfile[1] cmnet///0\r\n[04-13_03:41:28:622] requestGetProfile[1] cmnet///0\r\n[04-13_03:41:28:654] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\r\n[04-13_03:41:28:685] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[ 1393.790000] net wwan0: link_state 0x1 -> 0x0\r\n[04-13_03:41:28:692] ifconfig wwan0 0.0.0.0\r\n[04-13_03:41:28:703] ifconfig wwan0 down\r\n[04-13_03:41:28:751] requestSetupDataCall WdsConnectionIPv4Handle: 0x8729a6b0\r\n[ 1393.980000] net wwan0: link_state 0x0 -> 0x1\r\n[04-13_03:41:28:882] ifconfig wwan0 up\r\n[04-13_03:41:28:895] you are use OpenWrt?\r\n[04-13_03:41:28:895] should not calling udhcpc manually?\r\n[04-13_03:41:28:895] should modify /etc/config/network as below?\r\n[04-13_03:41:28:896] config interface wan\r\n[04-13_03:41:28:896] \toption ifname\twwan0\r\n[04-13_03:41:28:896] \toption proto\tdhcp\r\n[04-13_03:41:28:896] should use \"/sbin/ifstaus wan\" to check wwan0 's status?\r\n[04-13_03:41:28:896] busybox udhcpc -f -n -q -t 5 -i wwan0\r\n[04-13_03:41:28:907] udhcpc (v1.23.2) started\r\n[04-13_03:41:28:919] Sending discover...\r\n[04-13_03:41:28:925] Sending select for 10.129.198.20...\r\n[04-13_03:41:28:929] Lease of 10.129.198.20 obtained, lease time 7200\r\n[04-13_03:41:28:934] udhcpc: ifconfig wwan0 10.129.198.20 netmask 255.255.255.248 broadcast +\r\n[04-13_03:41:28:949] udhcpc: setting default routers: 10.129.198.21\r\n\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/qmi_wwan_q_qmap=1_bridge.txt",
    "content": "root@ZhuoTK:/# insmod qmi_wwan_q.ko qmap_mode=1\r\n[   49.000000] qmi_wwan_q 1-1.3:1.4: cdc-wdm0: USB WDM device\r\n[   49.000000] qmi_wwan_q 1-1.3:1.4: Quectel Android work on RawIP mode\r\n[   49.020000] qmi_wwan_q 1-1.3:1.4: rx_urb_size = 4096\r\n[   49.020000] qmi_wwan_q 1-1.3:1.4 wwan0: register 'qmi_wwan_q' at usb-101c0000.ehci-1.3, WWAN/QMI device, de:ae:5c:82:b5:b2\r\n[   49.030000] usbcore: registered new interface driver qmi_wwan_q\r\n\r\nroot@ZhuoTK:/# brctl addbr br0\r\nroot@ZhuoTK:/# brctl addif br0 eth0.1\r\nroot@ZhuoTK:/# brctl addif br0 wwan0\r\nroot@ZhuoTK:/# brctl show\r\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\r\nbr0\t\t    8000.00ca019197b9\tno\t\teth0.1\r\n\t\t\t\t\t\t\t                    wwan0\r\n\r\nroot@ZhuoTK:/# quectel-CM -s cmnet -b &\r\n[04-13_05:11:46:442] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_05:11:46:444] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x003\r\n[   84.340000] net wwan0: bridge_mode change to 0x1\r\n[04-13_05:11:46:446] Auto find qmichannel = /dev/cdc-wdm0\r\n[04-13_05:11:46:446] Auto find usbnet_adapter = wwan0\r\n[04-13_05:11:46:446] netcard driver = qmi_wwan_q, driver version = V1.2.0.23\r\n[04-13_05:11:46:447] qmap_mode = 1, qmap_version = 5, qmap_size = 4096, muxid = 0x81, qmap_netcard = wwan0\r\n[04-13_05:11:46:454] Modem works in QMI mode\r\n[04-13_05:11:46:462] cdc_wdm_fd = 7\r\n[04-13_05:11:46:537] Get clientWDS = 5\r\n[04-13_05:11:46:569] Get clientDMS = 1\r\n[04-13_05:11:46:601] Get clientNAS = 4\r\n[04-13_05:11:46:633] Get clientUIM = 1\r\n[04-13_05:11:46:666] Get clientWDA = 1\r\n[04-13_05:11:46:697] requestBaseBandVersion EC25EFAR06A11M4G\r\n[04-13_05:11:46:730] qmap_settings.rx_urb_size = 4096\r\n[   84.620000] net wwan0: ul_data_aggregation_max_datagrams=11, ul_data_aggregation_max_size=4096, dl_minimum_padding=0\r\n[04-13_05:11:46:730] qmap_settings.ul_data_aggregation_max_datagrams  = 11\r\n[04-13_05:11:46:730] qmap_settings.ul_data_aggregation_max_size       = 4096\r\n[04-13_05:11:46:730] qmap_settings.dl_minimum_padding                 = 0\r\n[04-13_05:11:46:859] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_05:11:46:859] requestSetProfile[1] cmnet///0\r\n[04-13_05:11:46:922] requestGetProfile[1] cmnet///0\r\n[04-13_05:11:46:954] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\r\n[04-13_05:11:46:986] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[   84.880000] net wwan0: link_state 0x1 -> 0x0\r\n[04-13_05:11:46:992] ifconfig wwan0 0.0.0.0\r\n[04-13_05:11:47:005] ifconfig wwan0 down\r\n[04-13_05:11:47:050] requestSetupDataCall WdsConnectionIPv4Handle: 0x872a5830\r\n[   85.070000] net wwan0: link_state 0x0 -> 0x1\r\n[04-13_05:11:47:183] ifconfig wwan0 up\r\n[04-13_05:11:47:195] echo '0xa54a78b' > /sys/class/net/wwan0/bridge_ipv4\r\n\r\nroot@ZhuoTK:/# ifconfig wwan0\r\nwwan0     Link encap:Ethernet  HWaddr DE:AE:5C:82:B5:B2  \r\n          inet6 addr: fe80::dcae:5cff:fe82:b5b2/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:3792 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:3271 errors:0 dropped:36 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:2271762 (2.1 MiB)  TX bytes:565184 (551.9 KiB)\r\n\r\nroot@ZhuoTK:/# ifconfig br0 up\r\n[   89.530000] br0: port 2(wwan0) entered forwarding state\r\n[   89.530000] br0: port 2(wwan0) entered forwarding state\r\n[   89.540000] br0: port 1(eth0.1) entered forwarding state\r\n[   89.540000] br0: port 1(eth0.1) entered forwarding state\r\n\r\nroot@ZhuoTK:/#\r\n[   93.720000] wwan0 sip = 192.168.1.153, tip=10.84.167.140, ipv4=10.84.167.139\r\n[  104.560000] br0: port 2(wwan0) entered forwarding state\r\n[  104.560000] br0: port 1(eth0.1) entered forwarding state\r\n[  111.750000] rt305x-esw 10110000.esw: link changed 0x00\r\n[  116.440000] rt305x-esw 10110000.esw: link changed 0x01\r\n[  116.620000] wwan0 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[  116.680000] wwan0 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[  116.690000] wwan0 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[  116.760000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\r\n[  117.050000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\r\n[  117.220000] wwan0 sip = 0.0.0.0, tip=10.84.167.139, ipv4=10.84.167.139\r\n[  117.820000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\r\n[  118.220000] wwan0 sip = 0.0.0.0, tip=10.84.167.139, ipv4=10.84.167.139\r\n[  118.300000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\r\n[  119.220000] wwan0 sip = 0.0.0.0, tip=10.84.167.139, ipv4=10.84.167.139\r\n[  120.220000] wwan0 sip = 10.84.167.139, tip=10.84.167.139, ipv4=10.84.167.139\r\n[  120.300000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\r\n[  121.430000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\r\n[  141.730000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\r\n[  144.390000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\r\n[  144.510000] wwan0 sip = 10.84.167.139, tip=10.84.167.140, ipv4=10.84.167.139\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/qmi_wwan_q_qmap=4.txt",
    "content": "root@ZhuoTK:/# insmod qmi_wwan_q.ko qmap_mode=4\r\n[ 1515.180000] usbcore: registered new interface driver qmi_wwan_q\r\n[ 1530.260000] usb 1-1.3: new high-speed USB device number 8 using ehci-platform\r\n[ 1530.500000] qmi_wwan_q 1-1.3:1.4: cdc-wdm0: USB WDM device\r\n[ 1530.500000] qmi_wwan_q 1-1.3:1.4: Quectel Android work on RawIP mode\r\n[ 1530.520000] qmi_wwan_q 1-1.3:1.4: rx_urb_size = 4096\r\n[ 1530.520000] qmi_wwan_q 1-1.3:1.4 wwan0: register 'qmi_wwan_q' at usb-101c0000.ehci-1.3, RMNET/USB device, da:0b:ce:b2:db:21\r\n[ 1530.530000] net wwan0: qmap_register_device wwan0_1\r\n[ 1530.540000] net wwan0: qmap_register_device wwan0_2\r\n[ 1530.550000] net wwan0: qmap_register_device wwan0_3\r\n[ 1530.550000] net wwan0: qmap_register_device wwan0_4\r\n\r\nroot@ZhuoTK:~# quectel-qmi-proxy &\r\n[04-13_03:44:53:958] Will use cdc-wdm='/dev/cdc-wdm0', proxy='quectel-qmi-proxy0'\r\n[04-13_03:44:53:959] qmi_proxy_init enter\r\n[04-13_03:44:53:960] qmi_proxy_loop enter thread_id 0x77c07530\r\n[04-13_03:44:54:960] qmi_proxy_init succful\r\n[04-13_03:44:54:960] local server: quectel-qmi-proxy0 sockfd = 4\r\n[04-13_03:44:54:960] qmi_proxy_server_fd = 4\r\n[04-13_03:45:04:346] +++ ClientFd=5\r\n[04-13_03:45:04:410] +++ ClientFd=5 QMIType=1 ClientId=4\r\n[04-13_03:45:04:442] +++ ClientFd=5 QMIType=2 ClientId=1\r\n[04-13_03:45:04:474] +++ ClientFd=5 QMIType=3 ClientId=4\r\n[04-13_03:45:04:506] +++ ClientFd=5 QMIType=11 ClientId=1\r\n[04-13_03:45:04:539] +++ ClientFd=5 QMIType=26 ClientId=1\r\n[04-13_03:45:10:770] +++ ClientFd=6\r\n[04-13_03:45:10:811] +++ ClientFd=6 QMIType=1 ClientId=21\r\n[04-13_03:45:10:843] +++ ClientFd=6 QMIType=2 ClientId=2\r\n[04-13_03:45:10:875] +++ ClientFd=6 QMIType=3 ClientId=5\r\n[04-13_03:45:10:907] +++ ClientFd=6 QMIType=11 ClientId=2\r\n[04-13_03:46:31:419] --- ClientFd=6 QMIType=1 ClientId=21\r\n[04-13_03:46:31:451] --- ClientFd=6 QMIType=2 ClientId=2\r\n[04-13_03:46:31:484] --- ClientFd=6 QMIType=3 ClientId=5\r\n[04-13_03:46:31:517] --- ClientFd=6 QMIType=11 ClientId=2\r\n[04-13_03:46:31:518] qmi_proxy_loop poll fd = 6, revents = 0011\r\n[04-13_03:46:31:519] --- ClientFd=6\r\n\r\nroot@ZhuoTK:/# quectel-CM -n 1 -s cmnet &\r\nroot@ZhuoTK:/# [04-13_03:45:04:340] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_03:45:04:343] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x008\r\n[04-13_03:45:04:344] Auto find qmichannel = /dev/cdc-wdm0\r\n[04-13_03:45:04:344] Auto find usbnet_adapter = wwan0\r\n[04-13_03:45:04:345] netcard driver = qmi_wwan_q, driver version = V1.2.0.23\r\n[04-13_03:45:04:345] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x81, qmap_netcard = wwan0_1\r\n[04-13_03:45:04:345] Modem works in QMI mode\r\n[04-13_03:45:04:347] connect to quectel-qmi-proxy0 sockfd = 7\r\n[04-13_03:45:04:347] cdc_wdm_fd = 7\r\n[04-13_03:45:04:411] Get clientWDS = 4\r\n[04-13_03:45:04:443] Get clientDMS = 1\r\n[04-13_03:45:04:475] Get clientNAS = 4\r\n[04-13_03:45:04:507] Get clientUIM = 1\r\n[04-13_03:45:04:540] Get clientWDA = 1\r\n[04-13_03:45:04:571] requestBaseBandVersion EC25EFAR06A11M4G\r\n[04-13_03:45:04:602] qmap_settings.rx_urb_size = 4096\r\n[ 1609.700000] net wwan0: ul_data_aggregation_max_datagrams=11, ul_data_aggregation_max_size=4096, dl_minimum_padding=0\r\n[04-13_03:45:04:603] qmap_settings.ul_data_aggregation_max_datagrams  = 11\r\n[04-13_03:45:04:603] qmap_settings.ul_data_aggregation_max_size       = 4096\r\n[04-13_03:45:04:603] qmap_settings.dl_minimum_padding                 = 0\r\n[04-13_03:45:04:731] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_03:45:04:731] requestSetProfile[1] cmnet///0\r\n[04-13_03:45:04:795] requestGetProfile[1] cmnet///0\r\n[04-13_03:45:04:827] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\r\n[04-13_03:45:04:858] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[ 1609.960000] net wwan0: link_state 0x1 -> 0x0\r\n[04-13_03:45:04:865] ifconfig wwan0 down\r\n[04-13_03:45:04:879] ifconfig wwan0_1 0.0.0.0\r\n[04-13_03:45:04:889] ifconfig wwan0_1 down\r\n[04-13_03:45:04:955] requestSetupDataCall WdsConnectionIPv4Handle: 0x87253410\r\n[ 1610.180000] net wwan0: link_state 0x0 -> 0x1\r\n[04-13_03:45:05:087] ifconfig wwan0 up\r\n[ 1610.200000] IPv6: ADDRCONF(NETDEV_UP): wwan0: link is not ready\r\n[04-13_03:45:05:105] ifconfig wwan0_1 up\r\n[ 1610.220000] IPv6: ADDRCONF(NETDEV_CHANGE): wwan0: link becomes ready\r\n[04-13_03:45:05:125] you are use OpenWrt?\r\n[04-13_03:45:05:125] should not calling udhcpc manually?\r\n[04-13_03:45:05:125] should modify /etc/config/network as below?\r\n[04-13_03:45:05:125] config interface wan\r\n[04-13_03:45:05:125] \toption ifname\twwan0_1\r\n[04-13_03:45:05:125] \toption proto\tdhcp\r\n[04-13_03:45:05:126] should use \"/sbin/ifstaus wan\" to check wwan0_1 's status?\r\n[04-13_03:45:05:126] busybox udhcpc -f -n -q -t 5 -i wwan0_1\r\n[04-13_03:45:05:136] udhcpc (v1.23.2) started\r\n[04-13_03:45:05:148] Sending discover...\r\n[04-13_03:45:05:155] Sending select for 10.244.10.206...\r\n[04-13_03:45:05:160] Lease of 10.244.10.206 obtained, lease time 7200\r\n[04-13_03:45:05:165] udhcpc: ifconfig wwan0_1 10.244.10.206 netmask 255.255.255.252 broadcast +\r\n[04-13_03:45:05:174] udhcpc: setting default routers: 10.244.10.205\r\n\r\nroot@ZhuoTK:/# quectel-CM -n 2 -s 4gnet &\r\n[04-13_03:45:10:764] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_03:45:10:767] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x008\r\n[04-13_03:45:10:768] Auto find qmichannel = /dev/cdc-wdm0\r\n[04-13_03:45:10:768] Auto find usbnet_adapter = wwan0\r\n[04-13_03:45:10:768] netcard driver = qmi_wwan_q, driver version = V1.2.0.23\r\n[04-13_03:45:10:769] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x82, qmap_netcard = wwan0_2\r\n[04-13_03:45:10:769] Modem works in QMI mode\r\n[04-13_03:45:10:771] connect to quectel-qmi-proxy0 sockfd = 7\r\n[04-13_03:45:10:771] cdc_wdm_fd = 7\r\n[04-13_03:45:10:812] Get clientWDS = 21\r\n[04-13_03:45:10:844] Get clientDMS = 2\r\n[04-13_03:45:10:876] Get clientNAS = 5\r\n[04-13_03:45:10:908] Get clientUIM = 2\r\n[04-13_03:45:10:971] requestBaseBandVersion EC25EFAR06A11M4G\r\n[04-13_03:45:11:099] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_03:45:11:099] requestSetProfile[2] 4gnet///0\r\n[04-13_03:45:11:163] requestGetProfile[2] 4gnet///0\r\n[04-13_03:45:11:195] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\r\n[04-13_03:45:11:227] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-13_03:45:11:227] ifconfig wwan0_2 0.0.0.0\r\n[ 1616.340000] IPv6: ADDRCONF(NETDEV_UP): wwan0_2: link is not ready\r\n[04-13_03:45:11:246] ifconfig wwan0_2 down\r\n[04-13_03:45:11:642] requestSetupDataCall WdsConnectionIPv4Handle: 0x87254580\r\n[ 1616.870000] net wwan0: link_state 0x1 -> 0x3\r\n[04-13_03:45:11:775] ifconfig wwan0 up\r\n[04-13_03:45:11:785] ifconfig wwan0_2 up\r\n[04-13_03:45:11:798] you are use OpenWrt?\r\n[04-13_03:45:11:798] should not calling udhcpc manually?\r\n[04-13_03:45:11:798] should modify /etc/config/network as below?\r\n[04-13_03:45:11:798] config interface wan\r\n[04-13_03:45:11:798] \toption ifname\twwan0_2\r\n[04-13_03:45:11:798] \toption proto\tdhcp\r\n[04-13_03:45:11:798] should use \"/sbin/ifstaus wan\" to check wwan0_2 's status?\r\n[04-13_03:45:11:799] busybox udhcpc -f -n -q -t 5 -i wwan0_2\r\n[04-13_03:45:11:809] udhcpc (v1.23.2) started\r\n[04-13_03:45:11:821] Sending discover...\r\n[04-13_03:45:11:830] Sending select for 10.245.78.212...\r\n[04-13_03:45:11:836] Lease of 10.245.78.212 obtained, lease time 7200\r\n[04-13_03:45:11:842] udhcpc: ifconfig wwan0_2 10.245.78.212 netmask 255.255.255.248 broadcast +\r\n[04-13_03:45:11:852] udhcpc: setting default routers: 10.245.78.213\r\n\r\nroot@ZhuoTK:/# ifconfig wwan0_1\r\nwwan0_1   Link encap:Ethernet  HWaddr DA:0B:CE:B2:DB:21  \r\n          inet addr:10.244.10.206  Mask:255.255.255.252\r\n          inet6 addr: fe80::d80b:ceff:feb2:db21/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:2 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:4 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:640 (640.0 B)  TX bytes:1344 (1.3 KiB)\r\n\r\nroot@ZhuoTK:/# ifconfig wwan0_2\r\nwwan0_2   Link encap:Ethernet  HWaddr DA:0B:CE:B2:DB:21  \r\n          inet addr:10.245.78.212  Mask:255.255.255.248\r\n          inet6 addr: fe80::d80b:ceff:feb2:db21/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:8 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:7 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:1193 (1.1 KiB)  TX bytes:1028 (1.0 KiB)\r\n\r\nroot@ZhuoTK:/# ip ro del 8.8.8.8/32\r\nRTNETLINK answers: No such process\r\n\r\nroot@ZhuoTK:/# ip ro add 8.8.8.8/32 dev wwan0_1\r\nroot@ZhuoTK:/# ping 8.8.8.8\r\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\r\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=113.508 ms\r\n\r\nroot@ZhuoTK:/# ip ro del 8.8.8.8/32\r\nroot@ZhuoTK:/# ip ro del 8.8.8.8/32\r\nRTNETLINK answers: No such process\r\n\r\nroot@ZhuoTK:/# ip ro add 8.8.8.8/32 dev wwan0_2\r\nroot@ZhuoTK:/# ping 8.8.8.8\r\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\r\n64 bytes from 8.8.8.8: seq=0 ttl=111 time=123.651 ms\r\n\r\nroot@ZhuoTK:/# quectel-CM -k 2\r\n[04-13_03:46:30:808] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_03:46:30:811] /proc/2834/cmdline: quectel-CM -n 2 -s 4gnet\r\n[04-13_03:46:30:811] send SIGINT to process 2834\r\n[04-13_03:46:30:811] requestDeactivateDefaultPDP WdsConnectionIPv4Handle\r\n[ 1696.460000] net wwan0: link_state 0x3 -> 0x1\r\n[04-13_03:46:31:361] ifconfig wwan0_2 0.0.0.0\r\n[04-13_03:46:31:373] ifconfig wwan0_2 down\r\n[04-13_03:46:31:516] QmiWwanThread exit\r\n[04-13_03:46:31:516] qmi_main exit\r\n\r\nroot@ZhuoTK:/# ifconfig wwan0_2\r\nwwan0_2   Link encap:Ethernet  HWaddr DA:0B:CE:B2:DB:21  \r\n          NOARP  MTU:1500  Metric:1\r\n          RX packets:16 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:15 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:1865 (1.8 KiB)  TX bytes:1620 (1.5 KiB)\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/qmi_wwan_q_qmap=4_bridge.txt",
    "content": "root@ZhuoTK:/# brctl addbr br0\r\nbrctl: bridge br0: File exists\r\nroot@ZhuoTK:/# brctl delbr br0\r\nroot@ZhuoTK:/# brctl addbr br0\r\nroot@ZhuoTK:/# brctl addif br0 eth0.1\r\n\r\nroot@ZhuoTK:/# insmod qmi_wwan_q.ko qmap_mode=4\r\n[  365.340000] usbcore: registered new interface driver qmi_wwan_q\r\n[  380.860000] usb 1-1.3: new high-speed USB device number 4 using ehci-platform\r\n[  381.100000] qmi_wwan_q 1-1.3:1.4: cdc-wdm0: USB WDM device\r\n[  381.100000] qmi_wwan_q 1-1.3:1.4: Quectel Android work on RawIP mode\r\n[  381.120000] qmi_wwan_q 1-1.3:1.4: rx_urb_size = 4096\r\n[  381.120000] qmi_wwan_q 1-1.3:1.4 wwan0: register 'qmi_wwan_q' at usb-101c0000.ehci-1.3, RMNET/USB device, fa:24:73:b5:39:a8\r\n[  381.130000] net wwan0: qmap_register_device wwan0_1\r\n[  381.140000] net wwan0: qmap_register_device wwan0_2\r\n[  381.150000] net wwan0: qmap_register_device wwan0_3\r\n[  381.150000] net wwan0: qmap_register_device wwan0_4\r\n\r\nroot@ZhuoTK:/# brctl addbr br0\r\nroot@ZhuoTK:/# brctl addif br0 eth0.1\r\nroot@ZhuoTK:/# brctl addif br0 wwan0_2\r\nroot@ZhuoTK:/# brctl show\r\nbridge name\tbridge id\t\tSTP enabled\tinterfaces\r\nbr0\t\t8000.00ca019197b9\tno\t\teth0.1\r\n\t\t\t\t\t\t\t                wwan0_2\r\n\t\t\t\t\t\t\t                \t\t\t\t\t\t\t                \r\nroot@ZhuoTK:/# quectel-qmi-proxy &\r\n[04-13_05:18:10:832] Will use cdc-wdm='/dev/cdc-wdm0', proxy='quectel-qmi-proxy0'\r\n[04-13_05:18:10:833] qmi_proxy_init enter\r\n[04-13_05:18:10:833] qmi_proxy_loop enter thread_id 0x77995530\r\n[04-13_05:18:11:833] qmi_proxy_init succful\r\n[04-13_05:18:11:833] local server: quectel-qmi-proxy0 sockfd = 4\r\n[04-13_05:18:11:833] qmi_proxy_server_fd = 4\r\n\r\nroot@ZhuoTK:/# quectel-CM -n 2 -s 4gnet -b &\r\n[04-13_05:18:20:144] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_05:18:20:146] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x004\r\n[04-13_05:18:20:147] Auto find qmichannel = /dev/cdc-wdm0\r\n[04-13_05:18:20:148] Auto find usbnet_adapter = wwan0\r\n[04-13_05:18:20:148] netcard driver = qmi_wwan_q, driver version = V1.2.0.23\r\n[04-13_05:18:20:148] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x82, qmap_netcard = wwan0_2\r\n[04-13_05:18:20:149] Modem works in QMI mode\r\n[04-13_05:18:20:150] connect to quectel-qmi-proxy0 sockfd = 7\r\n[04-13_05:18:20:150] cdc_wdm_fd = 7\r\n[04-13_05:18:20:370] requestBaseBandVersion EC25EFAR06A11M4G\r\n[04-13_05:18:20:403] qmap_settings.rx_urb_size = 4096\r\n[04-13_05:18:20:404] qmap_settings.ul_data_aggregation_max_datagrams  = 11\r\n[04-13_05:18:20:404] qmap_settings.ul_data_aggregation_max_size       = 4096\r\n[04-13_05:18:20:404] qmap_settings.dl_minimum_padding                 = 0\r\n[04-13_05:18:20:530] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_05:18:20:530] requestSetProfile[2] 4gnet///0\r\n[04-13_05:18:20:594] requestGetProfile[2] 4gnet///0\r\n[04-13_05:18:20:626] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\r\n[04-13_05:18:20:657] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-13_05:18:20:658] ifconfig wwan0_2 0.0.0.0\r\n[04-13_05:18:20:669] ifconfig wwan0_2 down\r\n[04-13_05:18:21:010] requestSetupDataCall WdsConnectionIPv4Handle: 0x87249650\r\n[  425.100000] net wwan0: link_state 0x1 -> 0x3\r\n[04-13_05:18:21:143] ifconfig wwan0 up\r\n[04-13_05:18:21:156] ifconfig wwan0_2 up\r\n[04-13_05:18:21:168] echo '0xa8ceec7' > /sys/class/net/wwan0_2/bridge_ipv4\r\n\r\nroot@ZhuoTK:/# ifconfig br0 up\r\n\r\n[  450.520000] br0: port 2(wwan0_2) entered forwarding state\r\n[  450.520000] br0: port 1(eth0.1) entered forwarding state\r\n[  450.770000] wwan0_2 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[  450.790000] wwan0_2 PC Mac Address: 00:0e:c6:a6:6c:f1\r\n[  450.840000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\r\n[  450.950000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\r\n[  450.950000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\r\n[  451.120000] wwan0_2 sip = 0.0.0.0, tip=10.140.238.199, ipv4=10.140.238.199\r\n[  451.180000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\r\n[  452.120000] wwan0_2 sip = 0.0.0.0, tip=10.140.238.199, ipv4=10.140.238.199\r\n[  453.080000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\r\n[  453.120000] wwan0_2 sip = 0.0.0.0, tip=10.140.238.199, ipv4=10.140.238.199\r\n[  454.120000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.199, ipv4=10.140.238.199\r\n[  454.220000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\r\n[  456.200000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\r\n[  458.120000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\r\n[  459.240000] wwan0_2 sip = 10.140.238.199, tip=10.140.238.200, ipv4=10.140.238.199\r\n\r\nroot@ZhuoTK:/# quectel-CM -n 1 -s cmnet &\r\n[04-13_05:19:21:122] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_05:19:21:125] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x004\r\n[04-13_05:19:21:126] Auto find qmichannel = /dev/cdc-wdm0\r\n[04-13_05:19:21:126] Auto find usbnet_adapter = wwan0\r\n[04-13_05:19:21:127] netcard driver = qmi_wwan_q, driver version = V1.2.0.23\r\n[04-13_05:19:21:127] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x81, qmap_netcard = wwan0_1\r\n[04-13_05:19:21:127] Modem works in QMI mode\r\n[04-13_05:19:21:128] connect to quectel-qmi-proxy0 sockfd = 7\r\n[04-13_05:19:21:129] cdc_wdm_fd = 7\r\n[04-13_05:19:21:331] requestBaseBandVersion EC25EFAR06A11M4G\r\n[04-13_05:19:21:459] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_05:19:21:459] requestSetProfile[1] cmnet///0\r\n[04-13_05:19:21:522] requestGetProfile[1] cmnet///0\r\n[04-13_05:19:21:554] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\r\n[04-13_05:19:21:585] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[  485.550000] net wwan0: link_state 0x3 -> 0x2\r\n[04-13_05:19:21:592] ifconfig wwan0_1 0.0.0.0\r\n[  485.570000] IPv6: ADDRCONF(NETDEV_UP): wwan0_1: link is not ready\r\n[04-13_05:19:21:610] ifconfig wwan0_1 down\r\n[04-13_05:19:21:682] requestSetupDataCall WdsConnectionIPv4Handle: 0x8725ed70\r\n[  485.780000] net wwan0: link_state 0x2 -> 0x3\r\n[04-13_05:19:21:815] ifconfig wwan0 up\r\n[04-13_05:19:21:826] ifconfig wwan0_1 up\r\n[04-13_05:19:21:845] you are use OpenWrt?\r\n[04-13_05:19:21:845] should not calling udhcpc manually?\r\n[04-13_05:19:21:845] should modify /etc/config/network as below?\r\n[04-13_05:19:21:845] config interface wan\r\n[04-13_05:19:21:845] \toption ifname\twwan0_1\r\n[04-13_05:19:21:845] \toption proto\tdhcp\r\n[04-13_05:19:21:845] should use \"/sbin/ifstaus wan\" to check wwan0_1 's status?\r\n[04-13_05:19:21:846] busybox udhcpc -f -n -q -t 5 -i wwan0_1\r\n[04-13_05:19:21:863] udhcpc (v1.23.2) started\r\n[04-13_05:19:21:923] Sending discover...\r\n[04-13_05:19:21:927] Sending select for 10.141.146.55...\r\n[04-13_05:19:21:932] Lease of 10.141.146.55 obtained, lease time 7200\r\n[04-13_05:19:21:938] udhcpc: ifconfig wwan0_1 10.141.146.55 netmask 255.255.255.240 broadcast +\r\n[04-13_05:19:21:949] udhcpc: setting default routers: 10.141.146.56\r\n\r\nroot@ZhuoTK:/# ip ro show\r\ndefault via 10.141.146.56 dev wwan0_1 \r\n10.141.146.48/28 dev wwan0_1  proto kernel  scope link  src 10.141.146.55 \r\n192.168.1.0/24 dev br-lan  proto kernel  scope link  src 192.168.1.251 \r\n\r\nroot@ZhuoTK:/# ping 8.8.8.8\r\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\r\n64 bytes from 8.8.8.8: seq=0 ttl=111 time=86.006 ms\r\n64 bytes from 8.8.8.8: seq=1 ttl=111 time=74.763 ms\r\n64 bytes from 8.8.8.8: seq=2 ttl=111 time=85.501 ms\r\n64 bytes from 8.8.8.8: seq=3 ttl=111 time=74.231 ms\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/qmi_wwan_qmap=4.txt",
    "content": "# dmesg\r\n[ 1737.738025] usb 1-1.2: new high-speed USB device number 5 using xhci-hcd\r\n[ 1737.838917] usb 1-1.2: New USB device found, idVendor=2c7c, idProduct=0512, bcdDevice= 3.18\r\n[ 1737.838948] usb 1-1.2: New USB device strings: Mfr=1, Product=2, SerialNumber=3\r\n[ 1737.838963] usb 1-1.2: Product: EG12-EA\r\n[ 1737.838975] usb 1-1.2: Manufacturer: Quectel\r\n[ 1737.838986] usb 1-1.2: SerialNumber: 0123456789ABCDE\r\n[ 1737.994955] option 1-1.2:1.0: GSM modem (1-port) converter detected\r\n[ 1737.995430] usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB0\r\n[ 1737.995978] option 1-1.2:1.1: GSM modem (1-port) converter detected\r\n[ 1737.996409] usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB1\r\n[ 1737.996963] option 1-1.2:1.2: GSM modem (1-port) converter detected\r\n[ 1737.997351] usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB2\r\n[ 1737.997909] option 1-1.2:1.3: GSM modem (1-port) converter detected\r\n[ 1737.998976] usb 1-1.2: GSM modem (1-port) converter now attached to ttyUSB3\r\n[ 1825.835796] qmi_wwan 1-1.2:1.4: cdc-wdm0: USB WDM device\r\n[ 1825.839685] qmi_wwan 1-1.2:1.4 wwan0: register 'qmi_wwan' at usb-fe9c0000.xhci-1.2, WWAN/QMI device, 0e:80:14:b1:f6:b9\r\n[ 1825.840062] usbcore: registered new interface driver qmi_wwan\r\n\r\n# ifconfig wwan0 down\r\n# echo Y > /sys/class/net/wwan0/qmi/raw_ip \r\n\r\n# echo 1 > /sys/class/net/wwan0/qmi/add_mux \r\n# ifconfig qmimux0\r\nqmimux0: flags=4240<POINTOPOINT,NOARP,MULTICAST>  mtu 1500\r\n        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)\r\n        RX packets 0  bytes 0 (0.0 B)\r\n        RX errors 0  dropped 0  overruns 0  frame 0\r\n        TX packets 0  bytes 0 (0.0 B)\r\n        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\r\n        \r\n# echo 2 > /sys/class/net/wwan0/qmi/add_mux \r\n# echo 3 > /sys/class/net/wwan0/qmi/add_mux \r\n# echo 4 > /sys/class/net/wwan0/qmi/add_mux \r\n# ifconfig qmimux3\r\nqmimux3: flags=4240<POINTOPOINT,NOARP,MULTICAST>  mtu 1500\r\n        unspec 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00  txqueuelen 1000  (UNSPEC)\r\n        RX packets 0  bytes 0 (0.0 B)\r\n        RX errors 0  dropped 0  overruns 0  frame 0\r\n        TX packets 0  bytes 0 (0.0 B)\r\n        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0\r\n        \r\nset wwan0's mtu to max qmap packet size, for usbnet.c:usbnet_change_mtu() do not accept         \r\n# ifconfig wwan0 mtu 16385\r\n        \r\nrun qmi proxy programm, \r\n# quectel-CM/quectel-qmi-proxy -d /dev/cdc-wdm0\r\nor libqmi's qmi-proxy, if use libqmi's qmi-proxy, you can use qmicli to setup data call.\r\n# /usr/libexec/qmi-proxy --verbose --no-exit\r\n\r\nuse quectel-CM to setup data call, if use libqmi's qmi-proxy, use '-p qmi-proxy' instead of '-p quectel-qmi-proxy'\r\n# quectel-CM -p quectel-qmi-proxy -n 4 -s cmnet4\r\n# quectel-CM -p quectel-qmi-proxy -n 1 -s cmnet\r\n\r\nfor how to use libqmi to setup data call, please refer to https://knowledge.quectel.com/display/SWSYSTLinuxAndroid/libqmi_How+to+using+QMAP+multiplexing"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/usage_of_argument/6.txt",
    "content": "root@OpenWrt:~# quectel-CM -s cmnet -4 -6\r\n[04-14_06:56:51:778] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-14_06:56:51:779] network interface '' or qmidev '' is not exist\r\n[04-14_06:56:51:780] netcard driver = pcie_mhi, driver version = V1.3.0.17\r\n[04-14_06:56:51:781] qmap_mode = 4, qmap_version = 9, qmap_size = 16384, muxid = 0x81, qmap_netcard = rmnet_mhi0.1\r\n[04-14_06:56:51:782] Modem works in QMI mode\r\n[04-14_06:56:51:783] connect to quectel-qmi-proxy0 sockfd = 7\r\n[04-14_06:56:51:783] cdc_wdm_fd = 7\r\n[04-14_06:56:51:789] Get clientWDS = 15\r\n[04-14_06:56:51:792] Get clientWDS = 16\r\n[04-14_06:56:51:794] Get clientDMS = 3\r\n[04-14_06:56:51:798] Get clientNAS = 4\r\n[04-14_06:56:51:801] Get clientUIM = 1\r\n[04-14_06:56:51:805] Get clientWDA = 1\r\n[04-14_06:56:51:809] requestBaseBandVersion RM500QGLABR10A03M4G\r\n[04-14_06:56:51:813] qmap_settings.rx_urb_size = 16384\r\n[04-14_06:56:51:813] qmap_settings.ul_data_aggregation_max_datagrams  = 11\r\n[04-14_06:56:51:814] qmap_settings.ul_data_aggregation_max_size       = 8192\r\n[04-14_06:56:51:814] qmap_settings.dl_minimum_padding                 = 0\r\n[04-14_06:56:51:835] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-14_06:56:51:836] requestSetProfile[1] cmnet///0\r\n[04-14_06:56:51:848] requestGetProfile[1] cmnet///0\r\n[04-14_06:56:51:852] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: 5G_NSA\r\n[04-14_06:56:51:857] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-14_06:56:51:860] requestQueryDataCall IPv6ConnectionStatus: DISCONNECTED\r\n[04-14_06:56:51:861] ifconfig rmnet_mhi0 down\r\n[04-14_06:56:51:885] ifconfig rmnet_mhi0.1 0.0.0.0\r\nifconfig: SIOCSIFFLAGS: Network is down\r\n[04-14_06:56:51:909] ifconfig rmnet_mhi0.1 down\r\n[04-14_06:56:51:943] requestSetupDataCall WdsConnectionIPv4Handle: 0x341450a0\r\n[04-14_06:56:52:423] requestSetupDataCall WdsConnectionIPv6Handle: 0x341439f0\r\n[ 1001.561353] net rmnet_mhi0: link_state 0x0 -> 0x1\r\n[04-14_06:56:52:441] ifconfig rmnet_mhi0 up\r\n[ 1001.584623] [I][mhi_netdev_open] Opened net dev interface\r\n[04-14_06:56:52:467] ifconfig rmnet_mhi0.1 up\r\n[04-14_06:56:52:495] you are use OpenWrt?\r\n[04-14_06:56:52:496] should not calling udhcpc manually?\r\n[04-14_06:56:52:496] should modify /etc/config/network as below?\r\n[04-14_06:56:52:497] config interface wan\r\n[04-14_06:56:52:497] \toption ifname\trmnet_mhi0.1\r\n[04-14_06:56:52:497] \toption proto\tdhcp\r\n[04-14_06:56:52:498] should use \"/sbin/ifstaus wan\" to check rmnet_mhi0.1 's status?\r\n[04-14_06:56:52:498] busybox udhcpc -f -n -q -t 5 -i rmnet_mhi0.1\r\nudhcpc: started, v1.28.3\r\nudhcpc: sending discover\r\nudhcpc: sending select for 10.245.22.3\r\nudhcpc: lease of 10.245.22.3 obtained, lease time 7200\r\n[04-14_06:56:52:713] udhcpc: ifconfig rmnet_mhi0.1 10.245.22.3 netmask 255.255.255.248 broadcast +\r\n[04-14_06:56:52:754] udhcpc: setting default routers: 10.245.22.4\r\n[04-14_06:56:52:838] ip -6 address flush dev rmnet_mhi0.1\r\n[04-14_06:56:52:861] ip -6 address add 2409:8930:463:3daa:7c8e:429a:c902:c6cc/64 dev rmnet_mhi0.1\r\n[04-14_06:56:52:884] ip -6 route add default dev rmnet_mhi0.1\r\n\r\nroot@OpenWrt:~# cat /etc/resolv.conf \r\nnameserver 2409:8030:2000:0:0:0:0:1 # IPV6 rmnet_mhi0.1\r\nnameserver 2409:8030:2000:0:0:0:0:2 # IPV6 rmnet_mhi0.1\r\nsearch lan\r\nnameserver 127.0.0.1\r\n\r\nroot@OpenWrt:~# ip -6 ro show\r\n2409:8930:463:96df::/64 dev rmnet_mhi0.1  proto kernel  metric 256 \r\nfe80::/64 dev br-lan  proto kernel  metric 256 \r\nfe80::/64 dev br0  proto kernel  metric 256 \r\ndefault dev rmnet_mhi0.1  metric 1024 \r\n\r\nroot@OpenWrt:~# ping6 www.qq.com\r\nPING www.qq.com (2402:4e00:1430:1301::9227:79cc:76f2): 56 data bytes\r\n64 bytes from 2402:4e00:1430:1301::9227:79cc:76f2: seq=0 ttl=51 time=97.230 ms\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/log/usage_of_argument/m.txt",
    "content": "root@ZhuoTK:/# quectel-CM -n 1 -m 4 -s cmnet &\r\n[04-13_05:12:07:455] Quectel_QConnectManager_Linux_V1.6.0.25\r\n[04-13_05:12:07:458] Find /sys/bus/usb/devices/1-1.3 idVendor=0x2c7c idProduct=0x125, bus=0x001, dev=0x003\r\n[04-13_05:12:07:459] Auto find qmichannel = /dev/qcqmi0\r\n[04-13_05:12:07:459] Auto find usbnet_adapter = usb0\r\n[04-13_05:12:07:467] netcard driver = GobiNet, driver version = V1.6.2.13\r\n[04-13_05:12:07:467] qmap_mode = 4, qmap_version = 5, qmap_size = 4096, muxid = 0x84, qmap_netcard = usb0.4\r\n[04-13_05:12:07:467] Modem works in QMI mode\r\n[04-13_05:12:07:495] Get clientWDS = 7\r\n[04-13_05:12:07:529] Get clientDMS = 8\r\n[04-13_05:12:07:561] Get clientNAS = 9\r\n[04-13_05:12:07:591] Get clientUIM = 10\r\n[04-13_05:12:07:623] requestBaseBandVersion EC25EFAR06A11M4G\r\n[04-13_05:12:07:752] requestGetSIMStatus SIMStatus: SIM_READY\r\n[04-13_05:12:07:752] requestSetProfile[1] cmnet///0\r\n[04-13_05:12:07:817] requestGetProfile[1] cmnet///0\r\n[04-13_05:12:07:849] requestRegistrationState2 MCC: 460, MNC: 0, PS: Attached, DataCap: LTE\r\n[04-13_05:12:07:881] requestQueryDataCall IPv4ConnectionStatus: DISCONNECTED\r\n[04-13_05:12:07:881] ifconfig usb0 down\r\n[04-13_05:12:07:892] ifconfig usb0.4 0.0.0.0\r\n[04-13_05:12:07:903] ifconfig usb0.4 down\r\n[04-13_05:12:07:944] requestSetupDataCall WdsConnectionIPv4Handle: 0x87265c40\r\n[   52.020000] net usb0: link_state 0x0 -> 0x8\r\n[04-13_05:12:08:077] ifconfig usb0 up\r\n[04-13_05:12:08:096] ifconfig usb0.4 up\r\n[04-13_05:12:08:116] you are use OpenWrt?\r\n[04-13_05:12:08:116] should not calling udhcpc manually?\r\n[04-13_05:12:08:116] should modify /etc/config/network as below?\r\n[04-13_05:12:08:116] config interface wan\r\n[04-13_05:12:08:116] \toption ifname\tusb0.4\r\n[04-13_05:12:08:116] \toption proto\tdhcp\r\n[04-13_05:12:08:116] should use \"/sbin/ifstaus wan\" to check usb0.4 's status?\r\n[04-13_05:12:08:117] busybox udhcpc -f -n -q -t 5 -i usb0.4\r\n[04-13_05:12:08:134] udhcpc (v1.23.2) started\r\n[04-13_05:12:08:193] Sending discover...\r\n[04-13_05:12:08:197] Sending select for 10.84.241.180...\r\n[04-13_05:12:08:203] Lease of 10.84.241.180 obtained, lease time 7200\r\n[04-13_05:12:08:208] udhcpc: ifconfig usb0.4 10.84.241.180 netmask 255.255.255.248 broadcast +\r\n[04-13_05:12:08:221] udhcpc: setting default routers: 10.84.241.181\r\n\r\nroot@ZhuoTK:/# ifconfig usb0.4\r\nusb0.4    Link encap:Ethernet  HWaddr 02:50:F4:00:00:00  \r\n          inet addr:10.84.241.180  Mask:255.255.255.248\r\n          inet6 addr: fe80::50:f4ff:fe00:0/64 Scope:Link\r\n          UP RUNNING NOARP  MTU:1500  Metric:1\r\n          RX packets:2 errors:0 dropped:0 overruns:0 frame:0\r\n          TX packets:6 errors:0 dropped:0 overruns:0 carrier:0\r\n          collisions:0 txqueuelen:1000 \r\n          RX bytes:612 (612.0 B)  TX bytes:984 (984.0 B)\r\n\r\nroot@ZhuoTK:/# ip ro show\r\ndefault via 10.84.241.181 dev usb0.4 \r\n10.84.241.176/29 dev usb0.4  proto kernel  scope link  src 10.84.241.180 \r\n192.168.1.0/24 dev br-lan  proto kernel  scope link  src 192.168.1.251 \r\n\r\nroot@ZhuoTK:/# ping 8.8.8.8\r\nPING 8.8.8.8 (8.8.8.8): 56 data bytes\r\n64 bytes from 8.8.8.8: seq=0 ttl=52 time=99.431 ms\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/main.c",
    "content": "/*\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\n\n    Quectel hereby grants customers of Quectel a license to use, modify,\n    distribute and publish the Software in binary form provided that\n    customers shall have no right to reverse engineer, reverse assemble,\n    decompile or reduce to source code form any portion of the Software. \n    Under no circumstances may customers modify, demonstrate, use, deliver \n    or disclose any portion of the Software in source code form.\n*/\n\n#include \"QMIThread.h\"\n#include <sys/wait.h>\n#include <sys/utsname.h>\n#include <sys/time.h>\n#include <dirent.h>\n\n#include \"util.h\"\n//#define CONFIG_PID_FILE_FORMAT \"/var/run/quectel-CM-%s.pid\" //for example /var/run/quectel-CM-wwan0.pid\n\nstatic PROFILE_T s_profile;\nint debug_qmi = 0;\nint qmidevice_control_fd[2];\nstatic int signal_control_fd[2];\nint g_donot_exit_when_modem_hangup = 0;\nextern int ql_ifconfig(int argc, char *argv[]);\nextern int ql_get_netcard_driver_info(const char*);\nextern int ql_capture_usbmon_log(PROFILE_T *profile, const char *log_path);\nextern void ql_stop_usbmon_log(PROFILE_T *profile);\n//UINT ifc_get_addr(const char *ifname);\nextern int cdc_wdm_fd;\nstatic int s_link = -1;\nstatic void usbnet_link_change(int link, PROFILE_T *profile) {\n    if (s_link == link)\n        return;\n\n    s_link = link;\n\n    if (!(link & (1<<IpFamilyV4)))\n        memset(&profile->ipv4, 0, sizeof(IPV4_T));\n\n    if (!(link & (1<<IpFamilyV6)))\n        memset(&profile->ipv6, 0, sizeof(IPV6_T));\n\n    if (link) {\n        udhcpc_start(profile);\n    } else {\n        udhcpc_stop(profile);\n    }\n}\n\nstatic int check_ipv4_address(PROFILE_T *profile) {\n    uint32_t oldAddress = profile->ipv4.Address;\n\n    if (profile->request_ops == &mbim_request_ops)\n        return 1; //we will get a new ipv6 address per requestGetIPAddress()\n    if (profile->request_ops == &atc_request_ops) {\n       if (!profile->udhcpc_ip) return 1;\n       oldAddress = profile->udhcpc_ip;\n    }\n\n    if (profile->request_ops->requestGetIPAddress(profile, IpFamilyV4) == 0) {\n         if (profile->ipv4.Address != oldAddress || debug_qmi) {\n             unsigned char *l = (unsigned char *)&oldAddress;\n             unsigned char *r = (unsigned char *)&profile->ipv4.Address;\n             dbg_time(\"localIP: %d.%d.%d.%d VS remoteIP: %d.%d.%d.%d\",\n                     l[3], l[2], l[1], l[0], r[3], r[2], r[1], r[0]);\n        }\n        return (profile->ipv4.Address == oldAddress);\n    }\n\n    return 0;\n}\n\nstatic void main_send_event_to_qmidevice(int triger_event) {\n     if (write(qmidevice_control_fd[0], &triger_event, sizeof(triger_event)) == -1) {};\n}\n\nstatic void send_signo_to_main(int signo) {\n     if (write(signal_control_fd[0], &signo, sizeof(signo)) == -1) {};\n}\n\nvoid qmidevice_send_event_to_main(int triger_event) {\n     if (write(qmidevice_control_fd[1], &triger_event, sizeof(triger_event)) == -1) {};\n}\n\nvoid qmidevice_send_event_to_main_ext(int triger_event, void *data, unsigned len) {\n     if (write(qmidevice_control_fd[1], &triger_event, sizeof(triger_event)) == -1) {};\n     if (write(qmidevice_control_fd[1], data, len) == -1) {};\n}\n\n#define MAX_PATH 256\n\nstatic int ls_dir(const char *dir, int (*match)(const char *dir, const char *file, void *argv[]), void *argv[])\n{\n    DIR *pDir;\n    struct dirent* ent = NULL;\n    int match_times = 0;\n\n    pDir = opendir(dir);\n    if (pDir == NULL)  {\n        dbg_time(\"Cannot open directory: %s, errno: %d (%s)\", dir, errno, strerror(errno));\n        return 0;\n    }\n\n    while ((ent = readdir(pDir)) != NULL)  {\n        match_times += match(dir, ent->d_name, argv);\n    }\n    closedir(pDir);\n\n    return match_times;\n}\n\nstatic int is_same_linkfile(const char *dir, const char *file,  void *argv[])\n{\n    const char *qmichannel = (const char *)argv[1];\n    char linkname[MAX_PATH*2+6];\n    char filename[MAX_PATH];\n    int linksize;\n\n    snprintf(linkname, sizeof(linkname), \"%.256s/%s\", dir, file);\n    linksize = readlink(linkname, filename, sizeof(filename));\n    if (linksize <= 0)\n        return 0;\n\n    filename[linksize] = 0;\n    if (strcmp(filename, qmichannel))\n        return 0;\n\n    dbg_time(\"%s -> %s\", linkname, filename);\n    return 1;\n}\n\nstatic int is_brother_process(const char *dir, const char *file, void *argv[])\n{\n    //const char *myself = (const char *)argv[0];\n    char linkname[MAX_PATH*2+6];\n    char filename[MAX_PATH];\n    int linksize;\n    int i = 0, kill_timeout = 15;\n    pid_t pid;\n\n    //dbg_time(\"%s\", file);\n    while (file[i]) {\n        if (!isdigit(file[i]))\n            break;\n        i++;\n    }\n\n    if (file[i]) {\n        //dbg_time(\"%s not digit\", file);\n        return 0;\n    }\n\n    snprintf(linkname, sizeof(linkname), \"%s/%s/exe\", dir, file);\n    linksize = readlink(linkname, filename, sizeof(filename));\n    if (linksize <= 0)\n        return 0;\n\n    filename[linksize] = 0;\n\n    pid = atoi(file);\n    if (pid >= getpid())\n        return 0;\n\n    snprintf(linkname, sizeof(linkname), \"%s/%s/fd\", dir, file);\n    if (!ls_dir(linkname, is_same_linkfile, argv))\n        return 0;\n\n    dbg_time(\"%s/%s/exe -> %s\", dir, file, filename);\n    while (kill_timeout-- && !kill(pid, 0))\n    {\n        kill(pid, SIGTERM);\n        sleep(1);\n    }\n    if (!kill(pid, 0))\n    {\n        dbg_time(\"force kill %s/%s/exe -> %s\", dir, file, filename);\n        kill(pid, SIGKILL);\n        sleep(1);\n    }\n\n    return 1;\n}\n\nstatic int kill_brothers(const char *qmichannel)\n{\n    char myself[MAX_PATH];\n    int filenamesize;\n    void *argv[2] = {myself, (void *)qmichannel};\n\n    filenamesize = readlink(\"/proc/self/exe\", myself, sizeof(myself));\n    if (filenamesize <= 0)\n        return 0;\n    myself[filenamesize] = 0;\n\n    if (ls_dir(\"/proc\", is_brother_process, argv))\n        sleep(1);\n\n    return 0;\n}\n\nstatic int kill_data_call_pdp(int pdp, char *self) {\n    int pid;\n    char *p = NULL;\n\n    p = self;\n    while (*self) {\n        if (*self == '/')\n            p = self+1;\n        self++;\n    }\n\n    pid = getpid_by_pdp(pdp, p);\n    if (pid > 0) {\n        dbg_time(\"send SIGINT to process %d\", pid);\n        return kill(pid, SIGINT);\n    }\n\n    return -1;\n}\n\nstatic void ql_sigaction(int signo) {\n     if (SIGALRM == signo)\n         send_signo_to_main(SIG_EVENT_START);\n     else\n     {\n        g_donot_exit_when_modem_hangup = 0;\n        send_signo_to_main(SIG_EVENT_STOP);\n        main_send_event_to_qmidevice(SIG_EVENT_STOP); //main may be wating qmi response\n    }\n}\n\nstatic int usage(const char *progname) {\n    dbg_time(\"Usage: %s [options]\", progname);\n    dbg_time(\"-s [apn [user password auth]]          Set apn/user/password/auth get from your network provider. auth: 1~pap, 2~chap, 3~MsChapV2\");\n    dbg_time(\"-p pincode                             Verify sim card pin if sim card is locked\");\n    dbg_time(\"-p [quectel-][qmi|mbim]-proxy          Request to use proxy\");\n    dbg_time(\"-f logfilename                         Save log message of this program to file\");\n    dbg_time(\"-u usbmonlog filename                  Save usbmon log to file\");\n    dbg_time(\"-i interface                           Specify which network interface to setup data call when multi-modems exits\");\n    dbg_time(\"-4                                     Setup IPv4 data call (default)\");\n    dbg_time(\"-6                                     Setup IPv6 data call\");\n    dbg_time(\"-n pdn                                 Specify which pdn to setup data call (default 1 for QMI, 0 for MBIM)\");\n    dbg_time(\"-k pdn                                 Specify which pdn to hangup data call (by send SIGINT to 'quectel-CM -n pdn')\");\n    dbg_time(\"-m iface-idx                           Bind QMI data call to wwan0_<iface idx> when QMAP used. E.g '-n 7 -m 1' bind pdn-7 data call to wwan0_1\");\n    dbg_time(\"-b                                     Enable network interface bridge function (default 0)\");\n    dbg_time(\"-v                                     Verbose log mode, for debug purpose.\");\n    dbg_time(\"-d                                     Obtain the IP address and dns through qmi\");\n    dbg_time(\"-a                                     1:Device attempts to bring up a call with the APN name,if -a 1 need add -s apn_name ;2:Device attempts to bring up a call with the APN type,if -a 2 need add -y apn_type\");\n    dbg_time(\"-y                                     Set APN type 0:APN type unspecified 1:internet traffic. 2:IMS\");\n    dbg_time(\"[Examples]\");\n    dbg_time(\"Example 1: %s \", progname);\n    dbg_time(\"Example 2: %s -s 3gnet \", progname);\n    dbg_time(\"Example 3: %s -s 3gnet carl 1234 1 -p 1234 -f gobinet_log.txt\", progname);\n    return 0;\n}\n\nstatic int qmi_main(PROFILE_T *profile)\n{\n    int triger_event = 0;\n    int signo;\n#ifdef CONFIG_SIM\n    SIM_Status SIMStatus = SIM_ABSENT;\n#endif\n    UCHAR PSAttachedState = 0;\n    UCHAR  IPv4ConnectionStatus = QWDS_PKT_DATA_UNKNOW;\n    UCHAR  IPv6ConnectionStatus = QWDS_PKT_DATA_UNKNOW; \n    unsigned SetupCallFail = 0;\n    unsigned long SetupCallAllowTime = clock_msec();\n#ifdef REBOOT_SIM_CARD_WHEN_LONG_TIME_NO_PS\n    unsigned PsAttachFail = 0;\n    unsigned long PsAttachTime = clock_msec();\n#endif\n    int qmierr = 0;\n    const struct request_ops *request_ops = profile ->request_ops;\n    pthread_t gQmiThreadID = 0;\n\n//sudo apt-get install udhcpc\n//sudo apt-get remove ModemManager\n    if (profile->reattach_flag) {\n        if (!reattach_driver(profile)) \n            sleep(2);\n    }\n\n    g_donot_exit_when_modem_hangup = 0;\n\n    /* try to recreate FDs*/\n    if (socketpair( AF_LOCAL, SOCK_STREAM, 0, signal_control_fd) < 0 ) {\n        dbg_time(\"%s Faild to create main_control_fd: %d (%s)\", __func__, errno, strerror(errno));\n        return -1;\n    }\n\n    if ( socketpair( AF_LOCAL, SOCK_STREAM, 0, qmidevice_control_fd ) < 0 ) {\n        dbg_time(\"%s Failed to create thread control socket pair: %d (%s)\", __func__, errno, strerror(errno));\n        return 0;\n    }\n\n    if ((profile->qmap_mode == 0 || profile->qmap_mode == 1)\n        && (!profile->proxy[0] || strstr(profile->qmichannel, \"_IPCR\"))) {\n        kill_brothers(profile->qmichannel);\n     }\n\n    if (pthread_create( &gQmiThreadID, 0, profile->qmi_ops->read, (void *)profile) != 0) {\n        dbg_time(\"%s Failed to create QMIThread: %d (%s)\", __func__, errno, strerror(errno));\n        return 0;\n    }\n\n    if ((read(qmidevice_control_fd[0], &triger_event, sizeof(triger_event)) != sizeof(triger_event))\n        || (triger_event != RIL_INDICATE_DEVICE_CONNECTED)) {\n        dbg_time(\"%s Failed to init QMIThread: %d (%s)\", __func__, errno, strerror(errno));\n        return 0;\n    }\n\n    if (profile->qmi_ops->init && profile->qmi_ops->init(profile)) {\n        dbg_time(\"%s Failed to qmi init: %d (%s)\", __func__, errno, strerror(errno));\n        return 0;\n    }\n\n    if (request_ops->requestBaseBandVersion)\n        request_ops->requestBaseBandVersion(profile);\n\n    if (request_ops->requestSetEthMode)\n        request_ops->requestSetEthMode(profile);\n\n    if (request_ops->requestSetLoopBackState && profile->loopback_state) {\n    \tqmierr = request_ops->requestSetLoopBackState(profile->loopback_state, profile->replication_factor);\n    \tif (qmierr != QMI_ERR_INVALID_QMI_CMD) //X20 return this error \n            profile->loopback_state = 0; //wait for RIL_UNSOL_LOOPBACK_CONFIG_IND\n    }\n\n    if (request_ops->requestGetSIMStatus) {\n        qmierr = request_ops->requestGetSIMStatus(&SIMStatus);\n\n        while (qmierr == QMI_ERR_OP_DEVICE_UNSUPPORTED) {\n            sleep(1);\n            qmierr = request_ops->requestGetSIMStatus(&SIMStatus);\n        }\n\n        if ((SIMStatus == SIM_PIN) && profile->pincode && request_ops->requestEnterSimPin) {\n            request_ops->requestEnterSimPin(profile->pincode);\n        }\n    }\n\n    if (SIMStatus == SIM_READY) {\n        if (request_ops->requestGetICCID)\n            request_ops->requestGetICCID();\n\n        if (request_ops->requestGetIMSI)\n            request_ops->requestGetIMSI();\n    }\nif(profile->usb_dev.idProduct != 0x0316)\n{\n    if (request_ops->requestGetProfile)\n        request_ops->requestGetProfile(profile);\n\n    if (request_ops->requestSetProfile && (profile->apn || profile->user || profile->pd)) {\n        if (request_ops->requestSetProfile(profile) == 1) {\n#ifdef REBOOT_SIM_CARD_WHEN_APN_CHANGE //enable at only when customer asked \n            if (request_ops->requestRadioPower) {\n                request_ops->requestRadioPower(0);\n                request_ops->requestRadioPower(1);\n            }\n#endif\n        }\n    }\n}\n    request_ops->requestRegistrationState(&PSAttachedState);\n\n#ifdef CONFIG_ENABLE_QOS\n    request_ops->requestRegisterQos(profile);\n#endif\n\n#if 1 //USB disconnnect and re-connect, but not reboot modem, will get this bug\n    if (profile->enable_ipv4\n        && profile->request_ops == &atc_request_ops\n        && !request_ops->requestQueryDataCall(&IPv4ConnectionStatus, IpFamilyV4)\n        && IPv4ConnectionStatus == QWDS_PKT_DATA_CONNECTED) {\n        request_ops->requestDeactivateDefaultPDP(profile, IpFamilyV4);\n    }\n#endif\n\n    send_signo_to_main(SIG_EVENT_CHECK);\n\n    while (1)\n    {\n        struct pollfd pollfds[] = {{signal_control_fd[1], POLLIN, 0}, {qmidevice_control_fd[0], POLLIN, 0}};\n        int ne, ret, nevents = sizeof(pollfds)/sizeof(pollfds[0]);\n\n        do {\n            ret = poll(pollfds, nevents,  15*1000);\n        } while ((ret < 0) && (errno == EINTR));\n\n        if (ret == 0)\n        {\n            send_signo_to_main(SIG_EVENT_CHECK);\n            continue;\n        }\n\n        if (ret <= 0) {\n            dbg_time(\"%s poll=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\n            goto __main_quit;\n        }\n\n        for (ne = 0; ne < nevents; ne++) {\n            int fd = pollfds[ne].fd;\n            short revents = pollfds[ne].revents;\n\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\n                dbg_time(\"%s poll err/hup\", __func__);\n                dbg_time(\"epoll fd = %d, events = 0x%04x\", fd, revents);\n                main_send_event_to_qmidevice(RIL_REQUEST_QUIT);\n                if (revents & POLLHUP)\n                    goto __main_quit;\n            }\n\n            if ((revents & POLLIN) == 0)\n                continue;\n\n            if (fd == signal_control_fd[1])\n            {\n                if (read(fd, &signo, sizeof(signo)) == sizeof(signo))\n                {\n                    alarm(0);\n                    switch (signo)\n                    {\n                        case SIG_EVENT_START:\n                            if (PSAttachedState != 1 && profile->loopback_state == 0)\n                                break;\n                            \n                            if (SetupCallAllowTime > clock_msec()) {\n                                alarm((SetupCallAllowTime - clock_msec()+999)/1000);\n                                break;\n                            }\n\n                            if (profile->enable_ipv4 && IPv4ConnectionStatus !=  QWDS_PKT_DATA_CONNECTED) {\n                                qmierr = request_ops->requestSetupDataCall(profile, IpFamilyV4);\n\n                                if ((qmierr > 0) && profile->user && profile->user[0] && profile->pd && profile->pd[0]) {\n                                    int old_auto =  profile->auth;\n\n                                    //may be fail because wrong auth mode, try pap->chap, or chap->pap\n                                    profile->auth = (profile->auth == 1) ? 2 : 1;\n                                \tqmierr = request_ops->requestSetupDataCall(profile, IpFamilyV4);\n\n                                    if (qmierr)\n                                        profile->auth = old_auto; //still fail, restore old auth moe\n                                }\n\n                                if (!qmierr) {\n                                    qmierr = request_ops->requestGetIPAddress(profile, IpFamilyV4);\n                                    if (!qmierr)\n                                        IPv4ConnectionStatus = QWDS_PKT_DATA_CONNECTED;\n                                }\n                                        \n                            }\n\n                            if (profile->enable_ipv6 && IPv6ConnectionStatus !=  QWDS_PKT_DATA_CONNECTED) {\n                                if (profile->enable_ipv4 && profile->request_ops != &qmi_request_ops) {\n                                    IPv6ConnectionStatus = IPv4ConnectionStatus;\n                                }\n                                else {\n                                    qmierr = request_ops->requestSetupDataCall(profile, IpFamilyV6);\n\n                                    if (!qmierr) {\n                                        qmierr = request_ops->requestGetIPAddress(profile, IpFamilyV6);\n                                        if (!qmierr)\n                                            IPv6ConnectionStatus = QWDS_PKT_DATA_CONNECTED;\n                                    }\n                                }\n                            }\n                                \n                            if ((profile->enable_ipv4 && IPv4ConnectionStatus ==  QWDS_PKT_DATA_DISCONNECTED)\n                                    || (profile->enable_ipv6 && IPv6ConnectionStatus ==  QWDS_PKT_DATA_DISCONNECTED)) {\n                                const unsigned allow_time[] = {5, 10, 20, 40, 60};\n\n                                if (SetupCallFail < (sizeof(allow_time)/sizeof(unsigned)))\n                                    SetupCallAllowTime = allow_time[SetupCallFail];\n                                else\n                                    SetupCallAllowTime = 60;\n                                SetupCallFail++;\n                                dbg_time(\"try to requestSetupDataCall %ld second later\", SetupCallAllowTime);\n                                alarm(SetupCallAllowTime);\n                                SetupCallAllowTime = SetupCallAllowTime*1000 + clock_msec();\n                            }\n                            else if (IPv4ConnectionStatus ==  QWDS_PKT_DATA_CONNECTED || IPv6ConnectionStatus ==  QWDS_PKT_DATA_CONNECTED) {\n                                SetupCallFail = 0;\n                                SetupCallAllowTime = clock_msec();\n                            }\n                        break;\n\n                        case SIG_EVENT_CHECK:\n                            if (request_ops->requestGetSignalInfo)\n                                request_ops->requestGetSignalInfo();\n                            \n                            if (request_ops->requestGetCellInfoList)\n                                request_ops->requestGetCellInfoList();\n\t\t\t\t\t\t\t\n                            if (request_ops->requestGetCoexWWANState)\n                                request_ops->requestGetCoexWWANState();\n\t\t\t\t\t\t\t\n                            if (PSAttachedState != 1)\n                                request_ops->requestRegistrationState(&PSAttachedState);\n\n#ifdef REBOOT_SIM_CARD_WHEN_LONG_TIME_NO_PS\n                            if (PSAttachedState) {\n                                PsAttachTime = clock_msec();\n                                PsAttachFail = 0;\n                            }\n                            else {\n                                unsigned long diff = (clock_msec() - PsAttachTime) / 1000;\n                                unsigned long threshold = REBOOT_SIM_CARD_WHEN_LONG_TIME_NO_PS << PsAttachFail;\n\n                                if (diff > threshold || diff > 960) {\n                                    //interval time is 60 -> 120 - > 240 - > 480 -> 960\n                                    PsAttachTime = clock_msec();\n                                    PsAttachFail++;\n\n                                    if (request_ops->requestRadioPower) {\n                                        request_ops->requestRadioPower(0);\n                                        request_ops->requestRadioPower(1);\n                                    }\n                                }\n                            }\n#endif\n\n                            if (profile->enable_ipv4 && IPv4ConnectionStatus != QWDS_PKT_DATA_DISCONNECTED\n                                && !request_ops->requestQueryDataCall(&IPv4ConnectionStatus, IpFamilyV4))\n                            {\n                                if (QWDS_PKT_DATA_CONNECTED == IPv4ConnectionStatus && profile->ipv4.Address == 0) {\n                                    //killall -9 quectel-CM for MBIM and ATC call\n                                    qmierr = request_ops->requestGetIPAddress(profile, IpFamilyV4);\n                                    if (qmierr)\n                                        IPv4ConnectionStatus = QWDS_PKT_DATA_DISCONNECTED;\n                                }\n\n                                //local ip is different with remote ip\n                                if (QWDS_PKT_DATA_CONNECTED == IPv4ConnectionStatus && check_ipv4_address(profile) == 0) {\n                                    request_ops->requestDeactivateDefaultPDP(profile, IpFamilyV4);\n                                    IPv4ConnectionStatus = QWDS_PKT_DATA_DISCONNECTED;\n                                }\n                            }\n                            else {\n                                IPv4ConnectionStatus = QWDS_PKT_DATA_DISCONNECTED;\n                            }\n\n                            if (profile->enable_ipv6 && IPv6ConnectionStatus != QWDS_PKT_DATA_DISCONNECTED) {\n                                if (profile->enable_ipv4 && profile->request_ops != &qmi_request_ops) {\n                                    IPv6ConnectionStatus = IPv4ConnectionStatus;\n                                }\n                                else {\n                                    request_ops->requestQueryDataCall(&IPv6ConnectionStatus, IpFamilyV6);\n                                }\n                            }\n                            else {\n                                IPv6ConnectionStatus = QWDS_PKT_DATA_DISCONNECTED;\n                            }\n\n                            if (IPv4ConnectionStatus ==  QWDS_PKT_DATA_DISCONNECTED && IPv6ConnectionStatus ==  QWDS_PKT_DATA_DISCONNECTED) {\n                                usbnet_link_change(0, profile);\n                            }\n                            else if (IPv4ConnectionStatus ==  QWDS_PKT_DATA_CONNECTED || IPv6ConnectionStatus ==  QWDS_PKT_DATA_CONNECTED) {\n                                int link = 0;\n                                if (IPv4ConnectionStatus == QWDS_PKT_DATA_CONNECTED)\n                                    link |= (1<<IpFamilyV4);\n                                if (IPv6ConnectionStatus == QWDS_PKT_DATA_CONNECTED)\n                                    link |= (1<<IpFamilyV6);\n                                usbnet_link_change(link, profile);\n                            }\n                            \n                            if ((profile->enable_ipv4 && IPv4ConnectionStatus ==  QWDS_PKT_DATA_DISCONNECTED)\n                                || (profile->enable_ipv6 && IPv6ConnectionStatus ==  QWDS_PKT_DATA_DISCONNECTED)) {\n                                send_signo_to_main(SIG_EVENT_START);\n                            }\n                        break;\n\n                        case SIG_EVENT_STOP:\n                            if (profile->enable_ipv4 && IPv4ConnectionStatus ==  QWDS_PKT_DATA_CONNECTED) {\n                                request_ops->requestDeactivateDefaultPDP(profile, IpFamilyV4);\n                            }\n                            if (profile->enable_ipv6 && IPv6ConnectionStatus ==  QWDS_PKT_DATA_CONNECTED) {\n                                if (profile->enable_ipv4 && profile->request_ops != &qmi_request_ops) {\n                                    \n                                }\n                                else {\n                                    request_ops->requestDeactivateDefaultPDP(profile, IpFamilyV6);\n                                }\n                            }\n                            usbnet_link_change(0, profile);\n                            if (profile->qmi_ops->deinit)\n                                profile->qmi_ops->deinit();\n                            main_send_event_to_qmidevice(RIL_REQUEST_QUIT);\n                            goto __main_quit;\n                        break;\n\n                        default:\n                        break;\n                    }\n                }\n            }\n\n            if (fd == qmidevice_control_fd[0]) {\n                if (read(fd, &triger_event, sizeof(triger_event)) == sizeof(triger_event)) {\n                    switch (triger_event) {\n                        case RIL_INDICATE_DEVICE_DISCONNECTED:\n                            usbnet_link_change(0, profile);                            \n                            goto __main_quit;\n                        break;\n\n                        case RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED:\n                            request_ops->requestRegistrationState(&PSAttachedState);\n                            if (PSAttachedState == 1) {\n                                if ((profile->enable_ipv4 && IPv4ConnectionStatus ==  QWDS_PKT_DATA_DISCONNECTED)\n                                    || (profile->enable_ipv6 && IPv6ConnectionStatus ==  QWDS_PKT_DATA_DISCONNECTED)) {\n                                    send_signo_to_main(SIG_EVENT_START);\n                                }\n                             } else {\n                                SetupCallAllowTime = clock_msec();\n                             }\n                        break;\n\n                        case RIL_UNSOL_DATA_CALL_LIST_CHANGED:\n                            if (IPv4ConnectionStatus ==  QWDS_PKT_DATA_CONNECTED || IPv6ConnectionStatus ==  QWDS_PKT_DATA_CONNECTED) {\n                                SetupCallAllowTime = clock_msec() + 1000; //from connect -> disconnect, do not re-dail immediately, wait network stable\n                            }\n                            send_signo_to_main(SIG_EVENT_CHECK);\n                        break;\n\n                        case MODEM_REPORT_RESET_EVENT:\n                        {\n                            dbg_time(\"main recv MODEM RESET SIGNAL\");\n                            main_send_event_to_qmidevice(RIL_REQUEST_QUIT);\n                            g_donot_exit_when_modem_hangup = 1;\n                            goto __main_quit;\n                        }\n                        break;\n\n                    \tcase RIL_UNSOL_LOOPBACK_CONFIG_IND:\n                        {\n                            QMI_WDA_SET_LOOPBACK_CONFIG_IND_MSG SetLoopBackInd;\n                        \tif (read(fd, &SetLoopBackInd, sizeof(SetLoopBackInd)) == sizeof(SetLoopBackInd)) {\n                            \tprofile->loopback_state = SetLoopBackInd.loopback_state.TLVVaule;\n                            \tprofile->replication_factor = le32_to_cpu(SetLoopBackInd.replication_factor.TLVVaule);\n                            \tdbg_time(\"SetLoopBackInd: loopback_state=%d, replication_factor=%u\",\n                                \tprofile->loopback_state, profile->replication_factor);\n                                    if (profile->loopback_state)\n                                        send_signo_to_main(SIG_EVENT_START);\n                            }\n                        }\n                    \tbreak;\n#ifdef CONFIG_REG_QOS_IND\n                        case RIL_UNSOL_GLOBAL_QOS_FLOW_IND_QOS_ID:\n                        {\n                            UINT qos_id = 0;\n                            if (read(fd, &qos_id, sizeof(qos_id)) == sizeof(qos_id)) {\n                                profile->qos_id = qos_id;\n                            }\n                        }\n                    \tbreak;\n#endif\n                        default:\n                        break;\n                    }\n                }\n            }\n        }\n    }\n\n__main_quit:\n    usbnet_link_change(0, profile);\n    if (gQmiThreadID && pthread_join(gQmiThreadID, NULL)) {\n        dbg_time(\"%s Error joining to listener thread (%s)\", __func__, strerror(errno));\n    }\n\n    close(signal_control_fd[0]);\n    close(signal_control_fd[1]);\n    close(qmidevice_control_fd[0]);\n    close(qmidevice_control_fd[1]);\n    dbg_time(\"%s exit\", __func__);\n\n    return 0;\n}\n\nstatic int quectel_CM(PROFILE_T *profile)\n{\n    int ret = 0;\n    char qmichannel[32] = {'\\0'};\n    char usbnet_adapter[32] = {'\\0'};\n\n    if (profile->expect_adapter[0])\n        strncpy(usbnet_adapter, profile->expect_adapter, sizeof(usbnet_adapter));\n    \n    if (qmidevice_detect(qmichannel, usbnet_adapter, sizeof(qmichannel), profile)) {\n    \tprofile->hardware_interface = HARDWARE_USB;\n    }\n    else if (mhidevice_detect(qmichannel, usbnet_adapter, profile)) {\n        profile->hardware_interface = HARDWARE_PCIE;\n    }\n    else if (atdevice_detect(qmichannel, usbnet_adapter, profile)) {\n        profile->hardware_interface = HARDWARE_PCIE;\n    }\n#ifdef CONFIG_QRTR\n    else if (!access(\"/sys/class/net/rmnet_mhi0\", F_OK)) {\n        strcpy(usbnet_adapter, \"rmnet_mhi0\");\n        profile->hardware_interface = HARDWARE_PCIE;\n        strcpy(qmichannel, \"qrtr\");\n        profile->software_interface = SOFTWARE_QRTR;\n    }\n    else if (!access(\"/sys/class/net/rmnet_usb0\", F_OK)) {\n        strcpy(usbnet_adapter, \"rmnet_usb0\");\n        profile->hardware_interface = HARDWARE_USB;\n        strcpy(qmichannel, \"qrtr\");\n        profile->software_interface = SOFTWARE_QRTR;\n    }\n    else if (!access(\"/sys/class/net/rmnet_ipa0\", F_OK)) {\n        strcpy(usbnet_adapter, \"rmnet_ipa0\");\n        profile->hardware_interface = HARDWARE_IPA;\n        strcpy(qmichannel, \"qrtr\");\n        profile->software_interface = SOFTWARE_QRTR;\n    }\n#endif\n    else {\n        dbg_time(\"qmidevice_detect failed\");\n        goto error;\n    }\n\n    strncpy(profile->qmichannel, qmichannel, sizeof(profile->qmichannel));\n    strncpy(profile->usbnet_adapter, usbnet_adapter, sizeof(profile->usbnet_adapter));\n    ql_get_netcard_driver_info(profile->usbnet_adapter);\n\n    if ((profile->hardware_interface == HARDWARE_USB) && profile->usblogfile)\n        ql_capture_usbmon_log(profile, profile->usblogfile);\n\n    if (profile->hardware_interface == HARDWARE_USB) {\n        profile->software_interface = get_driver_type(profile);\n    }\n\n    ql_qmap_mode_detect(profile);\n\n    if (profile->software_interface == SOFTWARE_MBIM) {\n        dbg_time(\"Modem works in MBIM mode\");\n        profile->request_ops = &mbim_request_ops;\n        profile->qmi_ops = &mbim_dev_ops;\n        if (!profile->apn || !profile->apn[0]) {\n            //see FAE-51804  FAE-59811\n            dbg_time(\"When MBIM mode, must specify APN with '-s', or setup data call may fail!\");\n            exit(-404); //if no such issue on your side, please comment this\n        }\n        ret = qmi_main(profile);\n    }\n    else if (profile->software_interface == SOFTWARE_QMI) {\n        dbg_time(\"Modem works in QMI mode\");\n        profile->request_ops = &qmi_request_ops;\n        if (qmidev_is_gobinet(profile->qmichannel))\n            profile->qmi_ops = &gobi_qmidev_ops;\n        else\n            profile->qmi_ops = &qmiwwan_qmidev_ops;\n        qmidev_send = profile->qmi_ops->send;\n        ret = qmi_main(profile);\n    }\n    else if (profile->software_interface == SOFTWARE_ECM_RNDIS_NCM) {\n        dbg_time(\"Modem works in ECM_RNDIS_NCM mode\");\n        profile->request_ops = &atc_request_ops;\n        profile->qmi_ops = &atc_dev_ops;\n        ret = qmi_main(profile);\n    }\n#ifdef CONFIG_QRTR\n    else if (profile->software_interface == SOFTWARE_QRTR) {\n        dbg_time(\"Modem works in QRTR mode\");\n        profile->request_ops = &qmi_request_ops;\n        profile->qmi_ops = &qrtr_qmidev_ops;\n        qmidev_send = profile->qmi_ops->send;\n        ret = qmi_main(profile);\n    }\n#endif\n    else {\n        dbg_time(\"unsupport software_interface %d\", profile->software_interface);\n    }\n\n    ql_stop_usbmon_log(profile);\n\nerror:\n    return ret;\n}\n\nstatic int parse_user_input(int argc, char **argv, PROFILE_T *profile) {\n    int opt = 1;\n    int apn_name_or_type;\n    profile->pdp = CONFIG_DEFAULT_PDP;\n    profile->profile_index = CONFIG_DEFAULT_PDP;\n\n    if (!strcmp(argv[argc-1], \"&\"))\n        argc--;\n\n#define has_more_argv() ((opt < argc) && (argv[opt][0] != '-'))\n    while  (opt < argc) {\n        if (argv[opt][0] != '-') {\n            return usage(argv[0]);\n        }\n\n        switch (argv[opt++][1])\n        {\n            case 's':\n                profile->apn = profile->user = profile->pd = \"\";\n                if (has_more_argv()) {\n                    profile->apn = argv[opt++];\n                }\n                if (has_more_argv()) {\n                    profile->user = argv[opt++];\n                }\n                if (has_more_argv()) {\n                    profile->pd = argv[opt++];\n                    if (profile->pd && profile->pd[0])\n                        profile->auth = 2; //default chap, customers may miss auth\n                }\n                if (has_more_argv()) {\n                    const char *auth = argv[opt++];\n\n                    if (!strcmp(auth, \"0\") || !strcasecmp(auth, \"none\")) {\n                        profile->auth = 0;\n                    }\n                    else if (!strcmp(auth, \"1\") || !strcasecmp(auth, \"pap\")) {\n                        profile->auth = 1;\n                    }\n                    else if (!strcmp(auth, \"2\") || !strcasecmp(auth, \"chap\")) {\n                        profile->auth = 2;\n                    }\n\t\t\t\t\telse if (!strcmp(auth, \"3\") || !strcasecmp(auth, \"MsChapV2\")) {\n                        profile->auth = 3;\n                    }\n                    else {\n                        dbg_time(\"unknow auth '%s'\", auth);\n                        return usage(argv[0]);\n                    }\n                }\n            break;\n\n            case 'p':\n                if (has_more_argv()) {\n                    const char *arg = argv[opt++];\n\n                    if (!strcmp(arg, QUECTEL_QMI_PROXY) || !strcmp(arg, QUECTEL_MBIM_PROXY)\n                        || !strcmp(arg, LIBQMI_PROXY) || !strcmp(arg, LIBMBIM_PROXY) || !strcmp(arg, QUECTEL_ATC_PROXY)) {\n                        strncpy(profile->proxy, arg, sizeof(profile->proxy) - 1);\n                    }\n                    else if ((999 < atoi(arg)) && (atoi(arg) < 10000)) {\n                        profile->pincode = arg;\n                    }\n                    else {\n                        dbg_time(\"unknow -p '%s'\", arg);\n                        return usage(argv[0]);\n                    }\n                }\n            break;\n\n            case 'm':\n                if (has_more_argv())\n                    profile->muxid = argv[opt++][0] - '0' + 0x80;\n            break;\n\n            case 'n':\n                if (has_more_argv())\n                    profile->pdp = argv[opt++][0] - '0';\n            break;\n\n            case 'f':\n                if (has_more_argv()) {\n                    profile->logfile = argv[opt++];\n                }\n            break;\n\n            case 'i':\n                if (has_more_argv()) {\n                    strncpy(profile->expect_adapter, argv[opt++], sizeof(profile->expect_adapter) - 1);\n                }\n            break;\n\n            case 'v':\n                debug_qmi = 1;\n            break;\n\n            case 'l':\n            \tif (has_more_argv()) {\n                    profile->replication_factor = atoi(argv[opt++]);\n                \tif (profile->replication_factor > 0) {\n                        \tprofile->loopback_state = 1;\n                     }\n                }\n            break;\n\n            case '4':\n                profile->enable_ipv4 = 1; \n            break;\n\n            case '6':\n                profile->enable_ipv6 = 1;\n            break;\n\n            case 'd':\n                profile->no_dhcp = 1;\n            break;\n\n            case 'u':\n                if (has_more_argv()) {\n                    profile->usblogfile = argv[opt++];\n                }\n            break;\n\n            case 'b':\n                profile->enable_bridge = 1;\n            break;\n\t\t\t\n            case 'k':\n                if (has_more_argv()) {\n                    profile->kill_pdp = argv[opt++][0] - '0';\n                }\n                break;\n\n            case 'a':\n                if (has_more_argv()) {\n                    apn_name_or_type = argv[opt++][0] - '0';\n                    if(apn_name_or_type == 1)\n                    profile->bring_up_by_apn_name = apn_name_or_type;\n                    else if(apn_name_or_type == 2) \n                    profile->bring_up_by_apn_type = apn_name_or_type;   \n                }\n                break;\n            case 'y':\n                if (has_more_argv()) {\n                    profile->apn_type = argv[opt++][0] - '0';\n                }\n                break;            \n            default:\n                return usage(argv[0]);\n            break;\n        }\n    }\n\n    if (profile->enable_ipv4 != 1 && profile->enable_ipv6 != 1) { // default enable IPv4\n        profile->enable_ipv4 = 1;\n    }\n\n    return 1;\n}\n\nint main(int argc, char *argv[])\n{\n    int ret;\n    PROFILE_T *ctx = &s_profile;\n\n    dbg_time(\"QConnectManager_Linux_V1.6.7\");\n\n    ret = parse_user_input(argc, argv, ctx);\n    if (!ret)\n        return ret;\n\n    if (ctx->kill_pdp) {\n        return kill_data_call_pdp(ctx->kill_pdp, argv[0]);\n    }\n\n    if (ctx->logfile) {\n        logfilefp = fopen(ctx->logfile, \"a+\");\n        if (!logfilefp) {\n            dbg_time(\"Fail to open %s, errno: %d(%s)\", ctx->logfile, errno, strerror(errno));\n        }\n    }\n\n    signal(SIGINT, ql_sigaction);\n    signal(SIGTERM, ql_sigaction);\n    signal(SIGALRM, ql_sigaction);\n\n    do {\n        ret = quectel_CM(ctx);\n        if (g_donot_exit_when_modem_hangup > 0)\n            sleep(3);\n    } while (g_donot_exit_when_modem_hangup > 0);\n\n    if (logfilefp) {\n        fclose(logfilefp);\n    }\n\n    return ret;\n}\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/mbim-cm.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software. \r\n    Under no circumstances may customers modify, demonstrate, use, deliver \r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include <unistd.h>\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <string.h>\r\n#include <ctype.h>\r\n#include <fcntl.h>\r\n#include <stddef.h>\r\n#include <pthread.h>\r\n#include <errno.h>\r\n#include <time.h>\r\n#include <signal.h>\r\n#include <getopt.h>\r\n#include <poll.h>\r\n#include <sys/time.h>\r\n#include <time.h>\r\n#include <sys/types.h>\r\n#include <limits.h>\r\n#include <inttypes.h>\r\n#include \"QMIThread.h\"\r\n\r\n#define mbim_debug dbg_time\r\n\r\n#define UUID_BASIC_CONNECT \"a289cc33-bcbb-8b4f-b6b0-133ec2aae6df\"\r\n//https://docs.microsoft.com/en-us/windows-hardware/drivers/network/mb-5g-data-class-support\r\n#define UUID_BASIC_CONNECT_EXT \"3d01dcc5-fef5-4d05-0d3a-bef7058e9aaf\"\r\n#define UUID_SMS             \"533fbeeb-14fe-4467-9f90-33a223e56c3f\"\r\n#define UUID_USSD             \"e550a0c8-5e82-479e-82f7-10abf4c3351f\"\r\n#define UUID_PHONEBOOK     \"4bf38476-1e6a-41db-b1d8-bed289c25bdb\"\r\n#define UUID_STK             \"d8f20131-fcb5-4e17-8602-d6ed3816164c\"\r\n#define UUID_AUTH             \"1d2b5ff7-0aa1-48b2-aa52-50f15767174e\"\r\n#define UUID_DSS             \"c08a26dd-7718-4382-8482-6e0d583c4d0e\"\r\n#define uuid_ext_qmux \"d1a30bc2-f97a-6e43-bf65-c7e24fb0f0d3\"\r\n#define uuid_mshsd \"883b7c26-985f-43fa-9804-27d7fb80959c\"\r\n#define uuid_qmbe \"2d0c12c9-0e6a-495a-915c-8d174fe5d63c\"\r\n#define UUID_MSFWID \"e9f7dea2-feaf-4009-93ce-90a3694103b6\"\r\n#define uuid_atds \"5967bdcc-7fd2-49a2-9f5c-b2e70e527db3\"\r\n#define uuid_qdu \"6427015f-579d-48f5-8c54-f43ed1e76f83\"\r\n#define UUID_MS_UICC_LOW_LEVEL \"c2f6588e-f037-4bc9-8665-f4d44bd09367\"\r\n#define UUID_MS_SARControl \"68223D04-9F6C-4E0F-822D-28441FB72340\"\r\n#define UUID_VOICEEXTENSIONS\t\"8d8b9eba-37be-449b-8f1e-61cb034a702e\"\r\n#define UUID_LIBMBIM_PROXY \"838cf7fb-8d0d-4d7f-871e-d71dbefbb39b\"\r\n\r\n#define UUID_MBIMContextTypeInternet \"7E5E2A7E-4E6F-7272-736B-656E7E5E2A7E\"\r\n\r\ntypedef unsigned char UINT8;\r\ntypedef unsigned short UINT16;\r\ntypedef unsigned int UINT32;\r\ntypedef unsigned long long UINT64;\r\n\r\n#pragma pack(4)\r\ntypedef enum {\r\n    MBIM_CID_CMD_TYPE_QUERY = 0,\r\n    MBIM_CID_CMD_TYPE_SET = 1,\r\n} MBIM_CID_CMD_TYPE_E;\r\n\r\ntypedef enum {\r\n     MBIM_CID_DEVICE_CAPS = 1, \r\n     MBIM_CID_SUBSCRIBER_READY_STATUS = 2, \r\n     MBIM_CID_RADIO_STATE = 3, MBIM_CID_PIN = 4,\r\n     MBIM_CID_PIN_LIS = 5,\r\n     MBIM_CID_HOME_PROVIDER = 6,\r\n     MBIM_CID_PREFERRED_PROVIDERS = 7,\r\n     MBIM_CID_VISIBLE_PROVIDERS = 8,\r\n     MBIM_CID_REGISTER_STATE = 9,\r\n     MBIM_CID_PACKET_SERVICE = 10,\r\n     MBIM_CID_SIGNAL_STATE = 11,\r\n     MBIM_CID_CONNECT = 12,\r\n     MBIM_CID_PROVISIONED_CONTEXTS = 13,\r\n     MBIM_CID_SERVICE_ACTIVATION = 14,\r\n     MBIM_CID_IP_CONFIGURATION =       15,\r\n     MBIM_CID_DEVICE_SERVICES = 16,\r\n     MBIM_CID_DEVICE_SERVICE_SUBSCRIBE_LIST = 19, \r\n     MBIM_CID_PACKET_STATISTICS = 20, \r\n     MBIM_CID_NETWORK_IDLE_HINT = 21,\r\n     MBIM_CID_EMERGENCY_MODE = 22,\r\n     MBIM_CID_IP_PACKET_FILTERS = 23, \r\n     MBIM_CID_MULTICARRIER_PROVIDERS = 24,\r\n} UUID_BASIC_CONNECT_CID_E;\r\n\r\ntypedef enum{\r\n    MBIM_CID_MS_PROVISIONED_CONTEXT_V2 = 1, \r\n    MBIM_CID_MS_NETWORK_BLACKLIST = 2,\r\n    MBIM_CID_MS_LTE_ATTACH_CONFIG = 3, \r\n    MBIM_CID_MS_LTE_ATTACH_STATUS = 4, \r\n    MBIM_CID_MS_SYS_CAPS = 5, \r\n    MBIM_CID_MS_DEVICE_CAPS_V2 = 6, \r\n    MBIM_CID_MS_DEVICE_SLOT_MAPPING = 7, \r\n    MBIM_CID_MS_SLOT_INFO_STATUS = 8, \r\n    MBIM_CID_MS_PCO = 9, \r\n    MBIM_CID_MS_DEVICE_RESET = 10, \r\n    MBIM_CID_MS_BASE_STATIONS_INFO = 11, \r\n    MBIM_CID_MS_LOCATION_INFO_STATUS = 12, \r\n    MBIM_CID_NOT_DEFINED = 13, \r\n    MBIM_CID_MS_PIN_EX = 14, \r\n    MBIM_CID_MS_VERSION = 15,\r\n} UUID_BASIC_CONNECT_EXT_CID_E;\r\n\r\ntypedef enum {\r\n    MBIM_CID_SMS_CONFIGURATION = 1, // Y Y Y\r\n    MBIM_CID_SMS_READ = 2, // N Y Y\r\n    MBIM_CID_SMS_SEND = 3, // Y N N\r\n    MBIM_CID_SMS_DELETE = 4, // Y N N\r\n    MBIM_CID_SMS_MESSAGE_STORE_STATUS = 5, // N Y Y\r\n} UUID_SMS_CID_E;\r\n\r\ntypedef enum {\r\n    MBIM_CID_DSS_CONNECT = 1, // Y N N\r\n} UUID_DSS_CID_E;\r\n\r\ntypedef enum{\r\n    MBIM_OPEN_MSG = 1, \r\n    MBIM_CLOSE_MSG = 2, \r\n    MBIM_COMMAND_MSG = 3, \r\n    MBIM_HOST_ERROR_MSG = 4,\r\n    MBIM_OPEN_DONE = 0x80000001, \r\n    MBIM_CLOSE_DONE = 0x80000002, \r\n    MBIM_COMMAND_DONE = 0x80000003, \r\n    MBIM_FUNCTION_ERROR_MSG = 0x80000004,       \r\n    MBIM_INDICATE_STATUS_MSG = 0x80000007,\r\n} MBIM_MSG_Type_E;\r\n \r\ntypedef enum { /*< since=1.10 >*/\r\n    MBIM_CID_PROXY_CONTROL_UNKNOWN       = 0,\r\n    MBIM_CID_PROXY_CONTROL_CONFIGURATION = 1\r\n} UUID_LIBMBIM_PROXY_CID_E;\r\n\r\ntypedef enum {\r\n    MBIM_CID_MS_UICC_ATR = 1,\r\n    MBIM_CID_MS_UICC_OPEN_CHANNEL = 2,\r\n    MBIM_CID_MS_UICC_CLOSE_CHANNEL  = 3,\r\n    MBIM_CID_MS_UICC_APDU = 4,\r\n    MBIM_CID_MS_UICC_TERMINAL_CAPABILITY = 5,\r\n    MBIM_CID_MS_UICC_RESET = 6,\r\n    MBIM_CID_MS_APP_LIST = 7,\r\n} UUID_MS_UICC_CID_E;\r\n\r\ntypedef enum {\r\n    MBIM_ERROR_TIMEOUT_FRAGMENT = 1,\r\n    MBIM_ERROR_FRAGMENT_OUT_OF_SEQUENCE = 2,\r\n    MBIM_ERROR_LENGTH_MISMATCH = 3,\r\n    MBIM_ERROR_DUPLICATED_TID = 4,\r\n    MBIM_ERROR_NOT_OPENED = 5,\r\n    MBIM_ERROR_UNKNOWN = 6,\r\n    MBIM_ERROR_CANCEL = 7,\r\n    MBIM_ERROR_MAX_TRANSFER = 8,\r\n} MBIM_ERROR_E;\r\n\r\ntypedef enum {\r\n    MBIM_STATUS_SUCCESS = 0,\r\n    MBIM_STATUS_BUSY =  1,\r\n    MBIM_STATUS_FAILURE = 2,\r\n    MBIM_STATUS_SIM_NOT_INSERTED = 3,\r\n    MBIM_STATUS_BAD_SIM = 4,\r\n    MBIM_STATUS_PIN_REQUIRED = 5,\r\n    MBIM_STATUS_PIN_DISABLED = 6,\r\n    MBIM_STATUS_NOT_REGISTERED = 7,\r\n    MBIM_STATUS_PROVIDERS_NOT_FOUND = 8,\r\n    MBIM_STATUS_NO_DEVICE_SUPPORT = 9,\r\n    MBIM_STATUS_PROVIDER_NOT_VISIBLE = 10,\r\n    MBIM_STATUS_DATA_CLASS_NOT_AVAILABL = 11,\r\n    MBIM_STATUS_PACKET_SERVICE_DETACHED = 12,\r\n}  MBIM_STATUS_CODES_E;\r\n\r\ntypedef enum {\r\n    MBIMPacketServiceActionAttach = 0,\r\n    MBIMPacketServiceActionDetach = 1,\r\n} MBIM_PACKET_SERVICE_ACTION_E;\r\n\r\ntypedef enum {\r\n    MBIMPacketServiceStateUnknown = 0,\r\n    MBIMPacketServiceStateAttaching = 1,\r\n    MBIMPacketServiceStateAttached = 2,\r\n    MBIMPacketServiceStateDetaching = 3,\r\n    MBIMPacketServiceStateDetached = 4,\r\n} MBIM_PACKET_SERVICE_STATE_E;\r\n\r\nstatic const char *MBIMPacketServiceStateStr(int _val) {\r\n    struct { int val;char *name;} _enumstr[] = {\r\n        {MBIMPacketServiceStateUnknown, \"Unknown\"},\r\n        {MBIMPacketServiceStateAttaching, \"Attaching\"},\r\n        {MBIMPacketServiceStateAttached, \"Attached\"},\r\n        {MBIMPacketServiceStateDetaching, \"Detaching\"},\r\n        {MBIMPacketServiceStateDetached, \"Detached\"},\r\n    };\r\n    int idx;\r\n\r\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\r\n        if (_val == _enumstr[idx].val)\r\n            return _enumstr[idx].name;\r\n    }\r\n\r\n    return \"Undefined\";\r\n};\r\n\r\ntypedef enum {\r\n    MBIMDataClassNone = 0x0,\r\n    MBIMDataClassGPRS = 0x1,\r\n    MBIMDataClassEDGE = 0x2,\r\n    MBIMDataClassUMTS = 0x4,\r\n    MBIMDataClassHSDPA = 0x8,\r\n    MBIMDataClassHSUPA = 0x10,\r\n    MBIMDataClassLTE = 0x20,\r\n    MBIMDataClass5G_NSA = 0x40,\r\n    MBIMDataClass5G_SA = 0x80,\r\n    MBIMDataClass1XRTT = 0x10000,\r\n    MBIMDataClass1XEVDO = 0x20000,\r\n    MBIMDataClass1XEVDORevA = 0x40000,\r\n    MBIMDataClass1XEVDV = 0x80000,\r\n    MBIMDataClass3XRTT = 0x100000,\r\n    MBIMDataClass1XEVDORevB = 0x200000,\r\n    MBIMDataClassUMB = 0x400000,\r\n    MBIMDataClassCustom = 0x80000000,\r\n} MBIM_DATA_CLASS_E;\r\n\r\nstatic const char *MBIMDataClassStr(int _val) {\r\n    struct { int val;char *name;} _enumstr[] = {\r\n        {MBIMDataClassNone, \"None\"},\r\n        {MBIMDataClassGPRS, \"GPRS\"},\r\n        {MBIMDataClassEDGE, \"EDGE\"},\r\n        {MBIMDataClassUMTS, \"UMTS\"},\r\n        {MBIMDataClassHSDPA, \"HSDPA\"},\r\n        {MBIMDataClassHSUPA, \"HSUPA\"},\r\n        {MBIMDataClassLTE, \"LTE\"},\r\n        {MBIMDataClass5G_NSA, \"5G_NSA\"},\r\n        {MBIMDataClass5G_SA, \"5G_SA\"},\r\n        {MBIMDataClass1XRTT, \"1XRTT\"},\r\n        {MBIMDataClass1XEVDO, \"1XEVDO\"},\r\n        {MBIMDataClass1XEVDORevA, \"1XEVDORevA\"},\r\n        {MBIMDataClass1XEVDV, \"1XEVDV\"},\r\n        {MBIMDataClass3XRTT, \"3XRTT\"},\r\n        {MBIMDataClass1XEVDORevB, \"1XEVDORevB\"},\r\n        {MBIMDataClassUMB, \"UMB\"},\r\n        {MBIMDataClassCustom, \"Custom\"},\r\n    };\r\n    int idx;\r\n\r\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\r\n        if (_val == _enumstr[idx].val)\r\n            return _enumstr[idx].name;\r\n    }\r\n\r\n    return \"Unknow\";\r\n};\r\n\r\ntypedef struct {\r\n    UINT32 NwError;\r\n    UINT32 PacketServiceState; //MBIM_PACKET_SERVICE_STATE_E\r\n    UINT32 HighestAvailableDataClass; //MBIM_DATA_CLASS_E\r\n    UINT64 UplinkSpeed;\r\n    UINT64 DownlinkSpeed;\r\n} MBIM_PACKET_SERVICE_INFO_T;\r\n\r\ntypedef struct {\r\n    UINT32 NwError;\r\n    UINT32 PacketServiceState; //MBIM_PACKET_SERVICE_STATE_E\r\n    UINT32 CurrentDataClass; //MBIM_DATA_CLASS_E\r\n    UINT64 UplinkSpeed;\r\n    UINT64 DownlinkSpeed;\r\n    UINT32 FrequencyRange;\r\n} MBIM_PACKET_SERVICE_INFO_V2_T;\r\n\r\ntypedef enum {\r\n    MBIMSubscriberReadyStateNotInitialized = 0,\r\n    MBIMSubscriberReadyStateInitialized = 1,\r\n    MBIMSubscriberReadyStateSimNotInserted = 2,\r\n    MBIMSubscriberReadyStateBadSim = 3,\r\n    MBIMSubscriberReadyStateFailure = 4,\r\n    MBIMSubscriberReadyStateNotActivated = 5,\r\n    MBIMSubscriberReadyStateDeviceLocked = 6,\r\n}MBIM_SUBSCRIBER_READY_STATE_E;\r\n\r\nstatic const char *MBIMSubscriberReadyStateStr(int _val) {\r\n    struct { int val;char *name;} _enumstr[] = {\r\n        {MBIMSubscriberReadyStateNotInitialized, \"NotInitialized\"},\r\n        {MBIMSubscriberReadyStateInitialized, \"Initialized\"},\r\n        {MBIMSubscriberReadyStateSimNotInserted, \"NotInserted\"},\r\n        {MBIMSubscriberReadyStateBadSim, \"BadSim\"},\r\n        {MBIMSubscriberReadyStateFailure, \"Failure\"},\r\n        {MBIMSubscriberReadyStateNotActivated, \"NotActivated\"},\r\n        {MBIMSubscriberReadyStateDeviceLocked, \"DeviceLocked\"},\r\n    };\r\n    int idx;\r\n\r\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\r\n        if (_val == _enumstr[idx].val)\r\n            return _enumstr[idx].name;\r\n    }\r\n\r\n    return \"Undefined\";\r\n};\r\n\r\ntypedef struct {\r\n    UINT32 DeviceType; //MBIM_DEVICE_TYPE\r\n    UINT32 CellularClass; //MBIM_CELLULAR_CLASS\r\n    UINT32 VoiceClass; //MBIM_VOICE_CLASS\r\n    UINT32 SimClass; //MBIM_SIM_CLASS\r\n    UINT32 DataClass; //MBIM_DATA_CLASS\r\n    UINT32 SmsCaps; //MBIM_SMS_CAPS\r\n    UINT32 ControlCaps; //MBIM_CTRL_CAPS\r\n    UINT32 MaxSessions;\r\n    UINT32 CustomDataClassOffset;\r\n    UINT32 CustomDataClassSize;\r\n    UINT32 DeviceIdOffset;\r\n    UINT32 DeviceIdSize;\r\n    UINT32 FirmwareInfoOffset;\r\n    UINT32 FirmwareInfoSize;\r\n    UINT32 HardwareInfoOffset;\r\n    UINT32 HardwareInfoSize;\r\n    UINT8 DataBuffer[0]; //DeviceId FirmwareInfo HardwareInfo\r\n} MBIM_DEVICE_CAPS_INFO_T;\r\n\r\ntypedef enum {\r\n    MBIMRadioOff = 0,\r\n    MBIMRadioOn = 1,\r\n} MBIM_RADIO_SWITCH_STATE_E;\r\n\r\ntypedef struct {\r\n    MBIM_RADIO_SWITCH_STATE_E RadioState;\r\n} MBIM_SET_RADIO_STATE_T;\r\n\r\ntypedef struct {\r\n    MBIM_RADIO_SWITCH_STATE_E HwRadioState;\r\n    MBIM_RADIO_SWITCH_STATE_E SwRadioState;\r\n} MBIM_RADIO_STATE_INFO_T;\r\n\r\ntypedef enum {\r\n    MBIMReadyInfoFlagsNone,\r\n    MBIMReadyInfoFlagsProtectUniqueID,\r\n}MBIM_UNIQUE_ID_FLAGS;\r\n\r\ntypedef struct {\r\n    UINT32 ReadyState;\r\n    UINT32 SubscriberIdOffset;\r\n    UINT32 SubscriberIdSize;\r\n    UINT32 SimIccIdOffset;\r\n    UINT32 SimIccIdSize;\r\n    UINT32 ReadyInfo;\r\n    UINT32 ElementCount;\r\n    UINT8 *TelephoneNumbersRefList;\r\n    UINT8 *DataBuffer;\r\n} MBIM_SUBSCRIBER_READY_STATUS_T;\r\n\r\ntypedef enum {\r\n    MBIMRegisterActionAutomatic,\r\n    MBIMRegisterActionManual,\r\n}MBIM_REGISTER_ACTION_E;\r\n\r\ntypedef enum {\r\n    MBIMRegisterStateUnknown = 0,\r\n    MBIMRegisterStateDeregistered = 1,\r\n    MBIMRegisterStateSearching = 2,\r\n    MBIMRegisterStateHome = 3,\r\n    MBIMRegisterStateRoaming = 4,\r\n    MBIMRegisterStatePartner = 5,\r\n    MBIMRegisterStateDenied = 6,\r\n}MBIM_REGISTER_STATE_E;\r\n\r\ntypedef enum {\r\n    MBIMRegisterModeUnknown = 0,\r\n    MBIMRegisterModeAutomatic = 1,\r\n    MBIMRegisterModeManual = 2,\r\n}MBIM_REGISTER_MODE_E;\r\n\r\nstatic const char *MBIMRegisterStateStr(int _val) {\r\n    struct { int val;char *name;} _enumstr[] ={\r\n        {MBIMRegisterStateUnknown, \"Unknown\"},\r\n        {MBIMRegisterStateDeregistered, \"Deregistered\"},\r\n        {MBIMRegisterStateSearching, \"Searching\"},\r\n        {MBIMRegisterStateHome, \"Home\"},\r\n        {MBIMRegisterStateRoaming, \"Roaming\"},\r\n        {MBIMRegisterStatePartner, \"Partner\"},\r\n        {MBIMRegisterStateDenied, \"Denied\"},\r\n    };\r\n    int idx;\r\n\r\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\r\n        if (_val == _enumstr[idx].val)\r\n            return _enumstr[idx].name;\r\n    }\r\n\r\n    return \"Undefined\";\r\n};\r\n\r\nstatic const char *MBIMRegisterModeStr(int _val) {\r\n    struct { int val;char *name;} _enumstr[] = {\r\n        {MBIMRegisterModeUnknown, \"Unknown\"},\r\n        {MBIMRegisterModeAutomatic, \"Automatic\"},\r\n        {MBIMRegisterModeManual, \"Manual\"},\r\n    };\r\n    int idx;\r\n\r\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\r\n        if (_val == _enumstr[idx].val)\r\n            return _enumstr[idx].name;\r\n    }\r\n\r\n    return \"Undefined\";\r\n};\r\n\r\ntypedef enum {\r\n    MBIM_REGISTRATION_NONE,\r\n    MBIM_REGISTRATION_MANUAL_SELECTION_NOT_AVAILABLE,\r\n    MBIM_REGISTRATION_PACKET_SERVICE_AUTOMATIC_ATTACH,\r\n}MBIM_REGISTRATION_FLAGS_E;\r\n\r\ntypedef struct {\r\n    UINT32 NwError;\r\n    UINT32 RegisterState; //MBIM_REGISTER_STATE_E\r\n    UINT32 RegisterMode;\r\n    UINT32 AvailableDataClasses;\r\n    UINT32 CurrentCellularClass;\r\n    UINT32 ProviderIdOffset;\r\n    UINT32 ProviderIdSize;\r\n    UINT32 ProviderNameOffset;\r\n    UINT32 ProviderNameSize;\r\n    UINT32 RoamingTextOffset;\r\n    UINT32 RoamingTextSize;\r\n    UINT32 RegistrationFlag;\r\n    UINT8 *DataBuffer;\r\n} MBIM_REGISTRATION_STATE_INFO_T;\r\n\r\ntypedef struct {\r\n    UINT32 NwError;\r\n    UINT32 RegisterState; //MBIM_REGISTER_STATE_E\r\n    UINT32 RegisterMode;\r\n    UINT32 AvailableDataClasses;\r\n    UINT32 CurrentCellularClass;\r\n    UINT32 ProviderIdOffset;\r\n    UINT32 ProviderIdSize;\r\n    UINT32 ProviderNameOffset;\r\n    UINT32 ProviderNameSize;\r\n    UINT32 RoamingTextOffset;\r\n    UINT32 RoamingTextSize;\r\n    UINT32 RegistrationFlag;\r\n    UINT32 PreferredDataClass;\r\n    UINT8 *DataBuffer;\r\n} MBIM_REGISTRATION_STATE_INFO_V2_T;\r\n\r\ntypedef struct {\r\n    UINT32 MessageType; //Specifies the MBIM message type.\r\n    UINT32 MessageLength; //Specifies the total length of this MBIM message in bytes.\r\n    /* Specifies the MBIM message id value.  This value is used to match host sent messages with function responses.\r\n    This value must be unique among all outstanding transactions.\r\n    For notifications, the TransactionId must be set to 0 by the function */\r\n    UINT32 TransactionId;\r\n} MBIM_MESSAGE_HEADER;\r\n\r\ntypedef struct {\r\n    UINT32 TotalFragments; //this field indicates how many fragments there are intotal.\r\n    UINT32 CurrentFragment; //This field indicates which fragment this message is.  Values are 0 to TotalFragments?\\1\r\n} MBIM_FRAGMENT_HEADER;\r\n\r\ntypedef struct {\r\n    MBIM_MESSAGE_HEADER MessageHeader;\r\n    UINT32 MaxControlTransfer;\r\n} MBIM_OPEN_MSG_T;\r\n\r\ntypedef struct {\r\n    MBIM_MESSAGE_HEADER MessageHeader;\r\n    UINT32 Status; //MBIM_STATUS_CODES_E\r\n} MBIM_OPEN_DONE_T;\r\n\r\ntypedef struct {\r\n    MBIM_MESSAGE_HEADER MessageHeader;\r\n} MBIM_CLOSE_MSG_T;\r\n\r\ntypedef struct {\r\n    MBIM_MESSAGE_HEADER MessageHeader;\r\n    UINT32 Status;\r\n} MBIM_CLOSE_DONE_T;\r\n\r\ntypedef struct {\r\n    UINT8 uuid[16];\r\n} UUID_T;\r\n\r\ntypedef struct {\r\n    MBIM_MESSAGE_HEADER MessageHeader;\r\n    MBIM_FRAGMENT_HEADER FragmentHeader;\r\n    UUID_T DeviceServiceId; //A 16 byte UUID that identifies the device service the following CID value applies.\r\n    UINT32 CID; //Specifies the CID that identifies the parameter being queried for\r\n    UINT32 CommandType; //0 for a query operation, 1 for a Set operation\r\n    UINT32 InformationBufferLength; //Size of the Total InformationBuffer, may be larger than current message if fragmented.\r\n    UINT8 InformationBuffer[0]; //Data supplied to device specific to the CID\r\n} MBIM_COMMAND_MSG_T;\r\n\r\ntypedef struct {\r\n    MBIM_MESSAGE_HEADER MessageHeader;\r\n    MBIM_FRAGMENT_HEADER FragmentHeader;\r\n    UUID_T DeviceServiceId; //A 16 byte UUID that identifies the device service the following CID value applies.\r\n    UINT32 CID; //Specifies the CID that identifies the parameter being queried for\r\n    UINT32 Status;\r\n    UINT32 InformationBufferLength; //Size of the Total InformationBuffer, may be larger than current message if fragmented.\r\n    UINT8 InformationBuffer[0]; //Data supplied to device specific to the CID\r\n} MBIM_COMMAND_DONE_T;\r\n\r\ntypedef struct {\r\n    MBIM_MESSAGE_HEADER MessageHeader;\r\n    UINT32 ErrorStatusCode;\r\n} MBIM_HOST_ERROR_MSG_T;\r\n\r\ntypedef struct {\r\n    MBIM_MESSAGE_HEADER MessageHeader;\r\n    UINT32 ErrorStatusCode;\r\n} MBIM_FUNCTION_ERROR_MSG_T;\r\n\r\ntypedef struct {\r\n    MBIM_MESSAGE_HEADER MessageHeader;\r\n    MBIM_FRAGMENT_HEADER FragmentHeader;\r\n    UUID_T DeviceServiceId; //A 16 byte UUID that identifies the device service the following CID value applies.\r\n    UINT32 CID; //Specifies the CID that identifies the parameter being queried for\r\n    UINT32 InformationBufferLength; //Size of the Total InformationBuffer, may be larger than current message if fragmented.\r\n    UINT8 InformationBuffer[0]; //Data supplied to device specific to the CID\r\n} MBIM_INDICATE_STATUS_MSG_T;\r\n\r\ntypedef struct {\r\n    UINT32 offset;\r\n    UINT32 size;\r\n} OL_PAIR_LIST;\r\n\r\ntypedef struct {\r\n    UUID_T DeviceServiceId;\r\n    UINT32 DssPayload;\r\n    UINT32 MaxDssInstances;\r\n    UINT32 CidCount;\r\n    UINT32 CidList[];\r\n} MBIM_DEVICE_SERVICE_ELEMENT_T;\r\n\r\ntypedef struct {\r\n    UINT32 DeviceServicesCount;\r\n    UINT32 MaxDssSessions;\r\n    OL_PAIR_LIST DeviceServicesRefList[];\r\n} MBIM_DEVICE_SERVICES_INFO_T;\r\n\r\ntypedef enum {\r\n    MBIMActivationCommandDeactivate = 0,\r\n    MBIMActivationCommandActivate = 1,\r\n} MBIM_ACTIVATION_COMMAND_E;\r\n\r\ntypedef enum {\r\n    MBIMCompressionNone =  0,\r\n    MBIMCompressionEnable =  1,\r\n} MBIM_COMPRESSION_E;\r\n\r\ntypedef enum {\r\n    MBIMAuthProtocolNone = 0,\r\n    MBIMAuthProtocolPap = 1,\r\n    MBIMAuthProtocolChap = 2,\r\n    MBIMAuthProtocolMsChapV2 = 3,\r\n} MBIM_AUTH_PROTOCOL_E;\r\n\r\ntypedef enum {\r\n    MBIMContextIPTypeDefault = 0, \r\n    MBIMContextIPTypeIPv4 = 1, \r\n    MBIMContextIPTypeIPv6 = 2, \r\n    MBIMContextIPTypeIPv4v6 = 3, \r\n    MBIMContextIPTypeIPv4AndIPv6 = 4,\r\n} MBIM_CONTEXT_IP_TYPE_E;\r\n\r\ntypedef enum {\r\n    MBIMActivationStateUnknown = 0,\r\n    MBIMActivationStateActivated = 1,\r\n    MBIMActivationStateActivating = 2,\r\n    MBIMActivationStateDeactivated = 3,\r\n    MBIMActivationStateDeactivating = 4,\r\n} MBIM_ACTIVATION_STATE_E;\r\n\r\ntypedef enum {\r\n    MBIMVoiceCallStateNone = 0,\r\n    MBIMVoiceCallStateInProgress = 1,\r\n    MBIMVoiceCallStateHangUp = 2,\r\n} MBIM_VOICECALL_STATE_E;\r\n\r\nstatic const char *MBIMMSGTypeStr(int _val) {\r\n    struct { int val;char *name;} _enumstr[] = { \r\n        {MBIM_OPEN_MSG, \"MBIM_OPEN_MSG\"}, \r\n        {MBIM_CLOSE_MSG, \"MBIM_CLOSE_MSG\"}, \r\n        {MBIM_COMMAND_MSG, \"MBIM_COMMAND_MSG\"}, \r\n        {MBIM_HOST_ERROR_MSG, \"MBIM_HOST_ERROR_MSG\"}, \r\n        {MBIM_OPEN_DONE, \"MBIM_OPEN_DONE\"}, \r\n        {MBIM_CLOSE_DONE, \"MBIM_CLOSE_DONE\"}, \r\n        {MBIM_COMMAND_DONE, \"MBIM_COMMAND_DONE\"}, \r\n        {MBIM_FUNCTION_ERROR_MSG, \"MBIM_FUNCTION_ERROR_MSG\"}, \r\n        {MBIM_INDICATE_STATUS_MSG, \"MBIM_INDICATE_STATUS_MSG\"}, \r\n    }; \r\n    int idx;\r\n\r\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) { \r\n        if (_val == _enumstr[idx].val) \r\n            return _enumstr[idx].name;\r\n    } \r\n\r\n    return \"MBIMMSGTypeUnknow\"; \r\n};\r\n\r\nstatic const char *MBIMContextIPTypeStr(int _val) { \r\n    struct { int val;char *name;} _enumstr[] = { \r\n        {MBIMContextIPTypeDefault, \"MBIMContextIPTypeDefault\"}, \r\n        {MBIMContextIPTypeIPv4, \"MBIMContextIPTypeIPv4\"}, \r\n        {MBIMContextIPTypeIPv6, \"MBIMContextIPTypeIPv6\"}, \r\n        {MBIMContextIPTypeIPv4v6, \"MBIMContextIPTypeIPv4v6\"}, \r\n        {MBIMContextIPTypeIPv4AndIPv6, \"MBIMContextIPTypeIPv4AndIPv6\"}, \r\n    }; \r\n    int idx; \r\n\r\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\r\n        if (_val == _enumstr[idx].val)\r\n            return _enumstr[idx].name;\r\n    } \r\n\r\n    return \"MBIMContextIPTypeUnknow\"; \r\n}\r\n\r\nstatic const char *MBIMActivationStateStr(int _val) {\r\n    struct { int val;char *name;} _enumstr[] = {\r\n        {MBIMActivationStateUnknown, \"Unknown\"},\r\n        {MBIMActivationStateActivated, \"Activated\"},\r\n        {MBIMActivationStateActivating, \"Activating\"},\r\n        {MBIMActivationStateDeactivated, \"Deactivated\"},\r\n        {MBIMActivationStateDeactivating, \"Deactivating\"},\r\n    };\r\n    int idx;\r\n\r\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\r\n        if (_val == _enumstr[idx].val)\r\n            return _enumstr[idx].name;\r\n    }\r\n\r\n    return \"Undefined\";\r\n};\r\n\r\nstatic const char *MBIMVoiceCallStateStr(int _val) {\r\n    struct { int val;char *name;} _enumstr[] = {\r\n        {MBIMVoiceCallStateNone, \"None\"},\r\n        {MBIMVoiceCallStateInProgress, \"InProgress\"},\r\n        {MBIMVoiceCallStateHangUp, \"HangUp\"},\r\n    };\r\n    int idx;\r\n\r\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\r\n        if (_val == _enumstr[idx].val)\r\n        return _enumstr[idx].name;\r\n    }\r\n\r\n    return \"Undefined\";\r\n};\r\n\r\ntypedef struct {\r\n    const char *uuid;\r\n    UINT32 cid;\r\n    const char *name;\r\n} UUID_CID_STR;\r\n\r\nstatic const  UUID_CID_STR uuid_cid_string[] = { \r\n    {UUID_BASIC_CONNECT, MBIM_CID_DEVICE_CAPS, \"MBIM_CID_DEVICE_CAPS\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_SUBSCRIBER_READY_STATUS, \"MBIM_CID_SUBSCRIBER_READY_STATUS\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_RADIO_STATE, \"MBIM_CID_RADIO_STATE\"},\r\n    {UUID_BASIC_CONNECT, MBIM_CID_PIN, \"MBIM_CID_PIN\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_PIN_LIS, \"MBIM_CID_PIN_LIS\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_HOME_PROVIDER, \"MBIM_CID_HOME_PROVIDER\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_PREFERRED_PROVIDERS, \"MBIM_CID_PREFERRED_PROVIDERS\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_VISIBLE_PROVIDERS, \"MBIM_CID_VISIBLE_PROVIDERS\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_REGISTER_STATE, \"MBIM_CID_REGISTER_STATE\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_PACKET_SERVICE, \"MBIM_CID_PACKET_SERVICE\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_SIGNAL_STATE, \"MBIM_CID_SIGNAL_STATE\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_CONNECT, \"MBIM_CID_CONNECT\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_PROVISIONED_CONTEXTS, \"MBIM_CID_PROVISIONED_CONTEXTS\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_SERVICE_ACTIVATION, \"MBIM_CID_SERVICE_ACTIVATION\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_IP_CONFIGURATION, \"MBIM_CID_IP_CONFIGURATION\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_DEVICE_SERVICES, \"MBIM_CID_DEVICE_SERVICES\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_DEVICE_SERVICE_SUBSCRIBE_LIST, \"MBIM_CID_DEVICE_SERVICE_SUBSCRIBE_LIST\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_PACKET_STATISTICS, \"MBIM_CID_PACKET_STATISTICS\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_NETWORK_IDLE_HINT, \"MBIM_CID_NETWORK_IDLE_HINT\"},\r\n    {UUID_BASIC_CONNECT, MBIM_CID_EMERGENCY_MODE, \"MBIM_CID_EMERGENCY_MODE\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_IP_PACKET_FILTERS, \"MBIM_CID_IP_PACKET_FILTERS\"}, \r\n    {UUID_BASIC_CONNECT, MBIM_CID_MULTICARRIER_PROVIDERS, \"MBIM_CID_MULTICARRIER_PROVIDERS\"},\r\n\r\n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_PROVISIONED_CONTEXT_V2, \"MBIM_CID_MS_PROVISIONED_CONTEXT_V2\"}, \r\n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_NETWORK_BLACKLIST, \"MBIM_CID_MS_NETWORK_BLACKLIST\"}, \r\n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_LTE_ATTACH_CONFIG, \"MBIM_CID_MS_LTE_ATTACH_CONFIG\"}, \r\n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_LTE_ATTACH_STATUS, \"MBIM_CID_MS_LTE_ATTACH_STATUS\"}, \r\n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_SYS_CAPS, \"MBIM_CID_MS_SYS_CAPS\"},\r\n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_DEVICE_CAPS_V2, \"MBIM_CID_MS_DEVICE_CAPS_V2\"}, \r\n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_DEVICE_SLOT_MAPPING, \"MBIM_CID_MS_DEVICE_SLOT_MAPPING\"}, \r\n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_SLOT_INFO_STATUS, \"MBIM_CID_MS_SLOT_INFO_STATUS\"}, \r\n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_PCO, \"MBIM_CID_MS_PCO\"}, \r\n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_DEVICE_RESET, \"MBIM_CID_MS_DEVICE_RESET\"}, \r\n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_BASE_STATIONS_INFO, \"MBIM_CID_MS_BASE_STATIONS_INFO\"}, \r\n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_LOCATION_INFO_STATUS, \"MBIM_CID_MS_LOCATION_INFO_STATUS\"}, \r\n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_NOT_DEFINED, \"MBIM_CID_NOT_DEFINED\"}, \r\n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_PIN_EX, \"MBIM_CID_MS_PIN_EX\"}, \r\n    {UUID_BASIC_CONNECT_EXT, MBIM_CID_MS_VERSION, \"MBIM_CID_MS_VERSION\"}, \r\n\r\n    {UUID_MS_UICC_LOW_LEVEL, MBIM_CID_MS_UICC_ATR, \"MBIM_CID_MS_UICC_ATR\"}, \r\n    {UUID_MS_UICC_LOW_LEVEL, MBIM_CID_MS_UICC_OPEN_CHANNEL, \"MBIM_CID_MS_UICC_OPEN_CHANNEL\"}, \r\n    {UUID_MS_UICC_LOW_LEVEL, MBIM_CID_MS_UICC_CLOSE_CHANNEL, \"MBIM_CID_MS_UICC_CLOSE_CHANNEL\"}, \r\n    {UUID_MS_UICC_LOW_LEVEL, MBIM_CID_MS_UICC_APDU, \"MBIM_CID_MS_UICC_APDU\"}, \r\n    {UUID_MS_UICC_LOW_LEVEL, MBIM_CID_MS_UICC_TERMINAL_CAPABILITY, \"MBIM_CID_MS_UICC_TERMINAL_CAPABILITY\"}, \r\n    {UUID_MS_UICC_LOW_LEVEL, MBIM_CID_MS_UICC_RESET, \"MBIM_CID_MS_UICC_RESET\"}, \r\n    {UUID_MS_UICC_LOW_LEVEL, MBIM_CID_MS_APP_LIST, \"MBIM_CID_MS_APP_LIST\"}, \r\n}; \r\n\r\ntypedef struct {\r\n    UINT32 SessionId;\r\n    UINT32 ActivationCommand; //MBIM_ACTIVATION_COMMAND_E\r\n    UINT32 AccessStringOffset;\r\n    UINT32 AccessStringSize;\r\n    UINT32 UserNameOffset;\r\n    UINT32 UserNameSize;\r\n    UINT32 PasswordOffset;\r\n    UINT32 PasswordSize;\r\n    UINT32 Compression; //MBIM_COMPRESSION_E\r\n    UINT32 AuthProtocol; //MBIM_AUTH_PROTOCOL_E\r\n    UINT32 IPType; //MBIM_CONTEXT_IP_TYPE_E\r\n    UUID_T ContextType;\r\n    UINT8 DataBuffer[0];  /* apn, username, password */\r\n} MBIM_SET_CONNECT_T;\r\n\r\ntypedef struct {\r\n    UINT32 SessionId;\r\n    UINT32 ActivationState; //MBIM_ACTIVATION_STATE_E\r\n    UINT32 VoiceCallState;\r\n    UINT32 IPType; //MBIM_CONTEXT_IP_TYPE_E\r\n    UUID_T ContextType;\r\n    UINT32 NwError;\r\n} MBIM_CONNECT_T;\r\n\r\ntypedef struct {\r\n    UINT32 OnLinkPrefixLength;\r\n    UINT8 IPv4Address[4];\r\n} MBIM_IPV4_ELEMENT_T;\r\n\r\ntypedef struct {\r\n    UINT32 OnLinkPrefixLength;\r\n    UINT8 IPv6Address[16];\r\n} MBIM_IPV6_ELEMENT_T;\r\n\r\ntypedef struct {\r\n    UINT32 SessionId;\r\n    UINT32 IPv4ConfigurationAvailable; //bit0~Address, bit1~gateway, bit2~DNS, bit3~MTU\r\n    UINT32 IPv6ConfigurationAvailable; //bit0~Address, bit1~gateway, bit2~DNS, bit3~MTU\r\n    UINT32 IPv4AddressCount;\r\n    UINT32 IPv4AddressOffset;\r\n    UINT32 IPv6AddressCount;\r\n    UINT32 IPv6AddressOffset;\r\n    UINT32 IPv4GatewayOffset;\r\n    UINT32 IPv6GatewayOffset;\r\n    UINT32 IPv4DnsServerCount;\r\n    UINT32 IPv4DnsServerOffset;\r\n    UINT32 IPv6DnsServerCount;\r\n    UINT32 IPv6DnsServerOffset;\r\n    UINT32 IPv4Mtu;\r\n    UINT32 IPv6Mtu;\r\n    UINT8 DataBuffer[];\r\n} MBIM_IP_CONFIGURATION_INFO_T;\r\n\r\ntypedef struct {\r\n    UINT32 RSRP;\r\n    UINT32 SNR;\r\n    UINT32 RSRPThreshold;\r\n    UINT32 SNRThreshold;\r\n    UINT32 SystemType;\r\n} MBIM_RSRP_SNR_INFO_T;\r\n\r\ntypedef struct {\r\n    UINT32 Elementcount;\r\n    MBIM_RSRP_SNR_INFO_T RsrpSnr[0];\r\n} MBIM_RSRP_SNR_T;\r\n\r\ntypedef struct {\r\n    UINT32 Rssi;\r\n    UINT32 ErrorRate;\r\n    UINT32 SignalStrengthInterval;\r\n    UINT32 RssiThreshold;\r\n    UINT32 ErrorRateThreshold;\r\n} MBIM_SIGNAL_STATE_INFO_T;\r\n\r\ntypedef struct {\r\n    UINT32 Rssi;\r\n    UINT32 ErrorRate;\r\n    UINT32 SignalStrengthInterval;\r\n    UINT32 RssiThreshold;\r\n    UINT32 ErrorRateThreshold;\r\n    UINT32 RsrpSnrOffset;\r\n    UINT32 RsrpSnrSize;\r\n    UINT8 DataBuffer[];\r\n} MBIM_SIGNAL_STATE_INFO_V2_T;\r\n\r\ntypedef struct {\r\n    UINT32 SignalStrengthInterval;\r\n    UINT32 RssiThreshold;\r\n    UINT32 ErrorRateThreshold;\r\n} MBIM_SET_SIGNAL_STATE_T;\r\n\r\ntypedef struct {\r\n    UINT32 DevicePathOffset;\r\n    UINT32 DevicePathSize;\r\n    UINT32 Timeout;\r\n    UINT8 DataBuffer[];\r\n} MBIM_LIBQMI_PROXY_CONFIG_T;\r\n\r\ntypedef struct {\r\n    UINT32 AtrSize;\r\n    UINT32 AtrOffset;\r\n    UINT8 DataBuffer[];\r\n} MBIM_MS_ATR_INFO_T;\r\n\r\n#pragma pack()\r\n\r\nstatic pthread_t s_tid_reader = 0;\r\nstatic int mbim_verbose = 0;\r\nstatic UINT32 TransactionId = 1;\r\nstatic unsigned mbim_default_timeout  = 30000;\r\nstatic const char *mbim_apn = NULL;\r\nstatic const char *mbim_user = NULL;\r\nstatic const char *mbim_pd = NULL;\r\nstatic int mbim_iptype = MBIMContextIPTypeDefault;\r\nstatic int mbim_auth = MBIMAuthProtocolNone;\r\nstatic int mbim_sessionID = 0;\r\nstatic int mbim_fd = -1;\r\nstatic MBIM_MESSAGE_HEADER *mbim_pRequest;\r\nstatic MBIM_MESSAGE_HEADER *mbim_pResponse;\r\n\r\nstatic unsigned int qmi_over_mbim_support = 0;\r\nstatic int qmi_over_mbim_sk[2] = {-1, -1};\r\nstatic pthread_mutex_t mbim_command_mutex = PTHREAD_MUTEX_INITIALIZER;\r\nstatic pthread_cond_t mbim_command_cond = PTHREAD_COND_INITIALIZER;\r\nstatic int mbim_ms_version = 1;\r\nstatic uint8_t qmi_over_mbim_nas = 0;\r\nint qmi_over_mbim_qmidev_send(PQCQMIMSG pQMI);\r\n\r\nstatic const UUID_T * str2uuid(const char *str) {\r\n    static UUID_T uuid;\r\n    UINT32 d[16];\r\n    char tmp[16*2+4+1];\r\n    unsigned i = 0;\r\n\r\n    while (str[i]) {\r\n        tmp[i] = tolower(str[i]);\r\n        i++;\r\n    }\r\n    tmp[i] = '\\0';\r\n\r\n    sscanf(tmp, \"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\",\r\n        &d[0], &d[1], &d[2], &d[3], &d[4], &d[5], &d[6], &d[7],\r\n        &d[8], &d[9], &d[10], &d[11], &d[12], &d[13], &d[14], &d[15]);\r\n\r\n    for (i = 0; i < 16; i++) {\r\n        uuid.uuid[i] = d[i]&0xFF;\r\n    }\r\n\r\n    return &uuid;\r\n}\r\n\r\nstatic void wchar2char(const char *src, size_t src_size, char *dst, size_t dst_len) {\r\n    size_t i;\r\n    \r\n    for (i = 0; i < (dst_len-1) && i < (src_size/2); i++)\r\n        dst[i] = src[i*2];\r\n    dst[i] = 0;\r\n}\r\n\r\nstatic size_t char2wchar(const char *src, size_t src_len, uint8_t *dst, size_t dst_len) {\r\n    size_t i;\r\n\r\n    if (src_len > (dst_len/2))\r\n        src_len = (dst_len/2);\r\n\r\n    for (i = 0; i < src_len; i++) {\r\n        *dst++ = *src++;\r\n        *dst++ = 0;\r\n    }\r\n\r\n    return i*2;\r\n}\r\n\r\n#define mbim_alloc( _size)  malloc(_size)\r\n#define mbim_free(_mem) do { if (_mem) { free(_mem); _mem = NULL;}} while(0)\r\n\r\nstatic int mbim_open_state = 0;\r\nstatic MBIM_SUBSCRIBER_READY_STATE_E ReadyState = MBIMSubscriberReadyStateNotInitialized;\r\nstatic MBIM_REGISTER_STATE_E RegisterState = MBIMRegisterStateUnknown;\r\nstatic MBIM_PACKET_SERVICE_STATE_E PacketServiceState = MBIMPacketServiceStateUnknown;\r\nstatic MBIM_ACTIVATION_STATE_E ActivationState = MBIMActivationStateUnknown;\r\nstatic MBIM_SUBSCRIBER_READY_STATE_E oldReadyState = MBIMSubscriberReadyStateNotInitialized;\r\nstatic MBIM_REGISTER_STATE_E oldRegisterState = MBIMRegisterStateUnknown;\r\nstatic MBIM_PACKET_SERVICE_STATE_E oldPacketServiceState = MBIMPacketServiceStateUnknown;\r\nstatic MBIM_ACTIVATION_STATE_E oldActivationState = MBIMActivationStateUnknown;\r\nstatic int mbim_update_state(void);\r\n\r\nstatic __inline uint32_t mbim2qmi_ipv4addr(uint32_t addr) {\r\n    return (addr>>24) | (addr>>8&0xff00) | (addr<<8&0xff0000) | (addr<<24);\r\n}\r\n\r\nstatic __inline void mbim2qmi_ipv6addr(const unsigned char *src, unsigned char *dst) {\r\n    int i;\r\n\r\n    for (i = 0; i < 16 ; i++) {\r\n        dst[i] = src[i];\r\n    }\r\n}\r\n\r\nstatic MBIM_MESSAGE_HEADER *compose_open_command(UINT32 MaxControlTransfer)\r\n{\r\n    MBIM_OPEN_MSG_T *pRequest = (MBIM_OPEN_MSG_T *)mbim_alloc(sizeof(MBIM_OPEN_MSG_T));\r\n\r\n    if(!pRequest)\r\n        return NULL;\r\n\r\n    pRequest->MessageHeader.MessageType = htole32(MBIM_OPEN_MSG);\r\n    pRequest->MessageHeader.MessageLength = htole32(sizeof(MBIM_OPEN_MSG_T));\r\n    pRequest->MessageHeader.TransactionId = htole32(TransactionId++);\r\n    pRequest->MaxControlTransfer = htole32(MaxControlTransfer);\r\n\r\n    return &pRequest->MessageHeader;\r\n}\r\n\r\nstatic MBIM_MESSAGE_HEADER *compose_close_command(void)\r\n{\r\n    MBIM_CLOSE_MSG_T *pRequest = (MBIM_CLOSE_MSG_T *)mbim_alloc(sizeof(MBIM_CLOSE_MSG_T));\r\n\r\n    if(!pRequest)\r\n        return NULL;\r\n\r\n    pRequest->MessageHeader.MessageType = htole32(MBIM_CLOSE_MSG);\r\n    pRequest->MessageHeader.MessageLength = htole32(sizeof(MBIM_CLOSE_MSG_T));\r\n    pRequest->MessageHeader.TransactionId = htole32(TransactionId++);\r\n\r\n    return &pRequest->MessageHeader;\r\n}\r\n\r\nstatic MBIM_MESSAGE_HEADER *compose_basic_connect_command(UINT32 CID, UINT32 CommandType, void *pInformationBuffer, UINT32 InformationBufferLength)\r\n{\r\n    MBIM_COMMAND_MSG_T *pRequest = (MBIM_COMMAND_MSG_T *)mbim_alloc(sizeof(MBIM_COMMAND_MSG_T) + InformationBufferLength);\r\n\r\n    if (!pRequest)\r\n        return NULL;\r\n\r\n    pRequest->MessageHeader.MessageType = htole32(MBIM_COMMAND_MSG);\r\n    pRequest->MessageHeader.MessageLength = htole32((sizeof(MBIM_COMMAND_MSG_T) + InformationBufferLength));\r\n    pRequest->MessageHeader.TransactionId = htole32(TransactionId++);\r\n\r\n    pRequest->FragmentHeader.TotalFragments = htole32(1);\r\n    pRequest->FragmentHeader.CurrentFragment= htole32(0);\r\n\r\n    memcpy(pRequest->DeviceServiceId.uuid, str2uuid(UUID_BASIC_CONNECT), 16);\r\n\r\n    pRequest->CID = htole32(CID);\r\n    pRequest->CommandType = htole32(CommandType);\r\n    if (InformationBufferLength && pInformationBuffer) {\r\n        pRequest->InformationBufferLength = htole32(InformationBufferLength);\r\n        memcpy(pRequest->InformationBuffer, pInformationBuffer, InformationBufferLength);\r\n    } else {\r\n        pRequest->InformationBufferLength = htole32(0);\r\n    }\r\n\r\n    return &pRequest->MessageHeader;\r\n}\r\n\r\nstatic MBIM_MESSAGE_HEADER *compose_basic_connect_ext_command(UINT32 CID, UINT32 CommandType, void *pInformationBuffer, UINT32 InformationBufferLength)\r\n{\r\n    MBIM_COMMAND_MSG_T *pRequest = (MBIM_COMMAND_MSG_T *)compose_basic_connect_command(CID, CommandType, pInformationBuffer, InformationBufferLength);\r\n\r\n    if (!pRequest)\r\n        return NULL;\r\n\r\n    memcpy(pRequest->DeviceServiceId.uuid, str2uuid(UUID_BASIC_CONNECT_EXT), 16);\r\n\r\n    return &pRequest->MessageHeader;\r\n}\r\n\r\nstatic MBIM_MESSAGE_HEADER *compose_qmi_over_mbim_command(UINT32 CID, UINT32 CommandType, void *pInformationBuffer, UINT32 InformationBufferLength)\r\n{\r\n    MBIM_COMMAND_MSG_T *pRequest = (MBIM_COMMAND_MSG_T *)compose_basic_connect_command(CID, CommandType, pInformationBuffer, InformationBufferLength);\r\n\r\n    if (!pRequest)\r\n        return NULL;\r\n\r\n    memcpy(pRequest->DeviceServiceId.uuid, str2uuid(uuid_ext_qmux), 16);\r\n\r\n    return &pRequest->MessageHeader;\r\n}\r\n\r\nstatic const char * uuid2str(const UUID_T *pUUID) {\r\n    static char str[16*2+4+1];\r\n    const UINT8 *d = pUUID->uuid;\r\n\r\n    snprintf(str, sizeof(str), \"%02x%02x%02x%02x-%02x%02x-%02x%02x-%02x%02x-%02x%02x%02x%02x%02x%02x\",\r\n        d[0], d[1], d[2], d[3], d[4], d[5], d[6], d[7],\r\n        d[8], d[9], d[10], d[11], d[12], d[13], d[14], d[15]);\r\n\r\n    return str;\r\n}\r\n\r\nstatic const char *DeviceServiceId2str(const UUID_T *pUUID) {\r\n    const char *str = uuid2str(pUUID);\r\n\r\n    struct { char *val;char *name;} _enumstr[] = {\r\n        {UUID_BASIC_CONNECT, \"UUID_BASIC_CONNECT\"},\r\n        {UUID_BASIC_CONNECT_EXT, \"UUID_BASIC_CONNECT_EXT\"},\r\n        {UUID_SMS, \"UUID_SMS\"},\r\n        {UUID_USSD, \"UUID_USSD\"},\r\n        {UUID_PHONEBOOK, \"UUID_PHONEBOOK\"},\r\n        {UUID_STK, \"UUID_STK\"},\r\n        {UUID_AUTH, \"UUID_AUTH\"},\r\n        {UUID_DSS, \"UUID_DSS\"},\r\n        {uuid_ext_qmux, \"uuid_ext_qmux\"},\r\n        {uuid_mshsd, \"uuid_mshsd\"},\r\n        {uuid_qmbe, \"uuid_qmbe\"},\r\n        {UUID_MSFWID, \"UUID_MSFWID\"},\r\n        {uuid_atds, \"uuid_atds\"},\r\n        {uuid_qdu, \"uuid_qdu\"},\r\n        {UUID_MS_UICC_LOW_LEVEL, \"UUID_MS_UICC_LOW_LEVEL\"},\r\n        {UUID_MS_SARControl, \"UUID_MS_SARControl\"},\r\n        {UUID_VOICEEXTENSIONS, \"UUID_VOICEEXTENSIONS\"},\r\n        {UUID_LIBMBIM_PROXY, \"UUID_LIBMBIM_PROXY\"},\r\n    };\r\n    int idx;\r\n\r\n    for (idx = 0; idx < (int)(sizeof(_enumstr)/sizeof(_enumstr[0])); idx++) {\r\n        if (!strcasecmp(str, _enumstr[idx].val))\r\n            return _enumstr[idx].name;\r\n    }\r\n\r\n    return str;\r\n}\r\n\r\nstatic const char *mbim_get_segment(void *_pMsg, UINT32 offset, UINT32 len)\r\n{\r\n    int idx;\r\n    static char buff[256] = {'\\0'};\r\n    UINT8 *pMsg = (UINT8*)_pMsg;\r\n\r\n    for (idx = 0; idx < (int)(len/2); idx++)\r\n        buff[idx] = pMsg[offset+idx*2];\r\n    buff[idx] = '\\0';\r\n    return buff;\r\n}\r\n\r\nstatic void mbim_dump_header(MBIM_MESSAGE_HEADER *pMsg, const char *direction) {\r\n    mbim_debug(\"%s Header:\", direction);\r\n    mbim_debug(\"%s MessageLength = %u\", direction, le32toh(pMsg->MessageLength));\r\n    mbim_debug(\"%s MessageType =  %s (0x%08x)\", direction, MBIMMSGTypeStr(le32toh(pMsg->MessageType)), le32toh(pMsg->MessageType));\r\n    mbim_debug(\"%s TransactionId = %u\", direction, le32toh(pMsg->TransactionId));\r\n    mbim_debug(\"%s Contents:\", direction);\r\n}\r\n\r\nstatic void mbim_dump_uuid_cid(const UUID_T *pUUID, UINT32 CID, const char *direction) {\r\n    size_t idx;\r\n    const char *uuidStr = uuid2str(pUUID);\r\n    const char *cidStr = \"unknow\";\r\n\r\n    for (idx = 0; idx < (sizeof(uuid_cid_string)/sizeof(uuid_cid_string[0])); idx++) {\r\n        if (!strcmp(uuidStr, uuid_cid_string[idx].uuid) && uuid_cid_string[idx].cid == CID) {\r\n            cidStr = uuid_cid_string[idx].name;\r\n        }\r\n    }\r\n\r\n    mbim_debug(\"%s DeviceServiceId = %s (%s)\", direction, DeviceServiceId2str(pUUID), uuidStr);\r\n    mbim_debug(\"%s CID = %s (%u)\", direction, cidStr, le32toh(CID));\r\n}\r\n\r\n\r\nstatic void mbim_dump_command_msg(MBIM_COMMAND_MSG_T *pCmdMsg, const char *direction) {\r\n    mbim_dump_uuid_cid(&pCmdMsg->DeviceServiceId, le32toh(pCmdMsg->CID), direction);\r\n    mbim_debug(\"%s CommandType = %s (%u)\", direction, le32toh(pCmdMsg->CommandType) ? \"set\" : \"query\", le32toh(pCmdMsg->CommandType));\r\n    mbim_debug(\"%s InformationBufferLength = %u\", direction, le32toh(pCmdMsg->InformationBufferLength));\r\n}\r\n\r\nstatic void mbim_dump_command_done(MBIM_COMMAND_DONE_T *pCmdDone, const char *direction) {\r\n    mbim_dump_uuid_cid(&pCmdDone->DeviceServiceId, le32toh(pCmdDone->CID), direction);\r\n    mbim_debug(\"%s Status = %u\", direction, le32toh(pCmdDone->Status));\r\n    mbim_debug(\"%s InformationBufferLength = %u\", direction, le32toh(pCmdDone->InformationBufferLength));\r\n}\r\n\r\nstatic void mbim_dump_indicate_msg(MBIM_INDICATE_STATUS_MSG_T *pIndMsg, const char *direction) {\r\n    mbim_dump_uuid_cid(&pIndMsg->DeviceServiceId, le32toh(pIndMsg->CID), direction);\r\n    mbim_debug(\"%s InformationBufferLength = %u\", direction, le32toh(pIndMsg->InformationBufferLength));\r\n}\r\n\r\nstatic void mbim_dump_connect(MBIM_CONNECT_T *pInfo, const char *direction) {\r\n    mbim_debug(\"%s SessionId = %u\", direction, le32toh(pInfo->SessionId));\r\n    mbim_debug(\"%s ActivationState = %s (%u)\", direction, MBIMActivationStateStr(le32toh(pInfo->ActivationState)), le32toh(pInfo->ActivationState));\r\n    mbim_debug(\"%s IPType = %s\", direction, MBIMContextIPTypeStr(le32toh(pInfo->IPType)));\r\n    mbim_debug(\"%s VoiceCallState = %s\", direction, MBIMVoiceCallStateStr(le32toh(pInfo->VoiceCallState)));\r\n    mbim_debug(\"%s ContextType = %s\", direction, uuid2str(&pInfo->ContextType));\r\n    mbim_debug(\"%s NwError = %u\", direction, le32toh(pInfo->NwError));\r\n}\r\n\r\nstatic void mbim_dump_signal_state(MBIM_SIGNAL_STATE_INFO_T *pInfo, const char *direction)\r\n{\r\n    mbim_debug(\"%s Rssi = %u\", direction, le32toh(pInfo->Rssi));\r\n    mbim_debug(\"%s ErrorRate = %u\", direction, le32toh(pInfo->ErrorRate));\r\n    mbim_debug(\"%s SignalStrengthInterval = %u\", direction, le32toh(pInfo->SignalStrengthInterval));\r\n    mbim_debug(\"%s RssiThreshold = %u\", direction, le32toh(pInfo->RssiThreshold));\r\n    mbim_debug(\"%s ErrorRateThreshold = %u\", direction, le32toh(pInfo->ErrorRateThreshold));\r\n}\r\n\r\nstatic void mbim_dump_packet_service(MBIM_PACKET_SERVICE_INFO_T *pInfo, const char *direction)\r\n{\r\n    mbim_debug(\"%s NwError = %u\", direction, le32toh(pInfo->NwError));\r\n    mbim_debug(\"%s PacketServiceState = %s\", direction, MBIMPacketServiceStateStr(le32toh(pInfo->PacketServiceState)));\r\n    mbim_debug(\"%s HighestAvailableDataClass = %s\", direction, MBIMDataClassStr(le32toh(pInfo->HighestAvailableDataClass)));\r\n    mbim_debug(\"%s UplinkSpeed = %ld\", direction, (long)le64toh(pInfo->UplinkSpeed));\r\n    mbim_debug(\"%s DownlinkSpeed = %ld\", direction, (long)le64toh(pInfo->DownlinkSpeed));\r\n}\r\n\r\nstatic void mbim_dump_subscriber_status(MBIM_SUBSCRIBER_READY_STATUS_T *pInfo, const char *direction)\r\n{\r\n    mbim_debug(\"%s ReadyState = %s\", direction, MBIMSubscriberReadyStateStr(le32toh(pInfo->ReadyState)));\r\n    mbim_debug(\"%s SIMICCID = %s\", direction, mbim_get_segment(pInfo, le32toh(pInfo->SimIccIdOffset), le32toh(pInfo->SimIccIdSize)));\r\n    mbim_debug(\"%s SubscriberID = %s\", direction, mbim_get_segment(pInfo, le32toh(pInfo->SubscriberIdOffset), le32toh(pInfo->SubscriberIdSize)));\r\n    /* maybe more than one number */\r\n    uint32_t idx;\r\n    for (idx = 0; idx < le32toh(pInfo->ElementCount); idx++) {\r\n        UINT32 offset = ((UINT32*)((UINT8*)pInfo+offsetof(MBIM_SUBSCRIBER_READY_STATUS_T, TelephoneNumbersRefList)))[0];\r\n        UINT32 length = ((UINT32*)((UINT8*)pInfo+offsetof(MBIM_SUBSCRIBER_READY_STATUS_T, TelephoneNumbersRefList)))[1];\r\n        mbim_debug(\"%s Number = %s\", direction, mbim_get_segment(pInfo, le32toh(offset), le32toh(length)));\r\n    }\r\n}\r\n\r\nstatic void mbim_dump_regiester_status(MBIM_REGISTRATION_STATE_INFO_T *pInfo, const char *direction)\r\n{\r\n    mbim_debug(\"%s NwError = %u\", direction, le32toh(pInfo->NwError));\r\n    mbim_debug(\"%s RegisterState = %s\", direction, MBIMRegisterStateStr(le32toh(pInfo->RegisterState)));\r\n    mbim_debug(\"%s RegisterMode = %s\", direction, MBIMRegisterModeStr(le32toh(pInfo->RegisterMode)));\r\n}\r\n\r\nstatic void mbim_dump_ipconfig(MBIM_IP_CONFIGURATION_INFO_T *pInfo, const char *direction)\r\n{\r\n    UINT8 prefix = 0, *ipv4=NULL, *ipv6=NULL, *gw=NULL, *dns1=NULL, *dns2=NULL;\r\n\r\n    mbim_debug(\"%s SessionId = %u\", direction, le32toh(pInfo->SessionId));\r\n    mbim_debug(\"%s IPv4ConfigurationAvailable = 0x%x\", direction, le32toh(pInfo->IPv4ConfigurationAvailable));\r\n    mbim_debug(\"%s IPv6ConfigurationAvailable = 0x%x\", direction, le32toh(pInfo->IPv6ConfigurationAvailable));\r\n    mbim_debug(\"%s IPv4AddressCount = 0x%x\", direction, le32toh(pInfo->IPv4AddressCount));\r\n    mbim_debug(\"%s IPv4AddressOffset = 0x%x\", direction, le32toh(pInfo->IPv4AddressOffset));\r\n    mbim_debug(\"%s IPv6AddressCount = 0x%x\", direction, le32toh(pInfo->IPv6AddressCount));\r\n    mbim_debug(\"%s IPv6AddressOffset = 0x%x\", direction, le32toh(pInfo->IPv6AddressOffset));\r\n\r\n    /* IPv4 */\r\n    if (le32toh(pInfo->IPv4ConfigurationAvailable)&0x1) {\r\n        MBIM_IPV4_ELEMENT_T *pAddress = (MBIM_IPV4_ELEMENT_T *)(&pInfo->DataBuffer[le32toh(pInfo->IPv4AddressOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\r\n        prefix = le32toh(pAddress->OnLinkPrefixLength);\r\n        ipv4 = pAddress->IPv4Address;\r\n        mbim_debug(\"%s IPv4 = %u.%u.%u.%u/%u\", direction, ipv4[0], ipv4[1], ipv4[2], ipv4[3], prefix);\r\n    }\r\n    if (le32toh(pInfo->IPv4ConfigurationAvailable)&0x2) {\r\n        gw = (UINT8 *)(&pInfo->DataBuffer[le32toh(pInfo->IPv4GatewayOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\r\n        mbim_debug(\"%s gw = %u.%u.%u.%u\", direction, gw[0], gw[1], gw[2], gw[3]);\r\n    }\r\n    if (le32toh(pInfo->IPv4ConfigurationAvailable)&0x3) {\r\n        dns1 = (UINT8 *)(&pInfo->DataBuffer[le32toh(pInfo->IPv4DnsServerOffset) -sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\r\n        mbim_debug(\"%s dns1 = %u.%u.%u.%u\", direction, dns1[0], dns1[1], dns1[2], dns1[3]);\r\n        if (le32toh(pInfo->IPv4DnsServerCount) == 2) {\r\n            dns2 = dns1 + 4;\r\n            mbim_debug(\"%s dns2 = %u.%u.%u.%u\", direction, dns2[0], dns2[1], dns2[2], dns2[3]);\r\n        }\r\n    }\r\n    if (le32toh(pInfo->IPv4Mtu)) mbim_debug(\"%s ipv4 mtu = %u\", direction, le32toh(pInfo->IPv4Mtu));\r\n\r\n    /* IPv6 */\r\n    if (le32toh(pInfo->IPv6ConfigurationAvailable)&0x1) {\r\n        MBIM_IPV6_ELEMENT_T *pAddress = (MBIM_IPV6_ELEMENT_T *)(&pInfo->DataBuffer[le32toh(pInfo->IPv6AddressOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\r\n        prefix = le32toh(pAddress->OnLinkPrefixLength);\r\n        ipv6 = pAddress->IPv6Address;\r\n        mbim_debug(\"%s IPv6 = %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x/%d\", \\\r\n            direction, ipv6[0], ipv6[1], ipv6[2], ipv6[3], ipv6[4], ipv6[5], ipv6[6], ipv6[7], \\\r\n            ipv6[8], ipv6[9], ipv6[10], ipv6[11], ipv6[12], ipv6[13], ipv6[14], ipv6[15], prefix);\r\n    }\r\n    if (le32toh(pInfo->IPv6ConfigurationAvailable)&0x2) {\r\n        gw = (UINT8 *)(&pInfo->DataBuffer[le32toh(pInfo->IPv6GatewayOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\r\n        mbim_debug(\"%s gw = %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\", \\\r\n            direction, gw[0], gw[1], gw[2], gw[3], gw[4], gw[5], gw[6], gw[7], \\\r\n            gw[8], gw[9], gw[10], gw[11], gw[12], gw[13], gw[14], gw[15]);\r\n    }\r\n    if (le32toh(pInfo->IPv6ConfigurationAvailable)&0x3) {\r\n        dns1 = (UINT8 *)(&pInfo->DataBuffer[le32toh(pInfo->IPv6DnsServerOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\r\n        mbim_debug(\"%s dns1 = %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\", \\\r\n            direction, dns1[0], dns1[1], dns1[2], dns1[3], dns1[4], dns1[5], dns1[6], dns1[7], \\\r\n            dns1[8], dns1[9], dns1[10], dns1[11], dns1[12], dns1[13], dns1[14], dns1[15]);\r\n        if (le32toh(pInfo->IPv6DnsServerCount) == 2) {\r\n            dns2 = dns1 + 16;\r\n            mbim_debug(\"%s dns2 = %02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x:%02x%02x\", \\\r\n                direction, dns2[0], dns2[1], dns2[2], dns2[3], dns1[4], dns1[5], dns1[6], dns1[7],\r\n                dns2[8], dns2[9], dns2[10], dns2[11], dns2[12], dns2[13], dns2[14], dns2[15]);\r\n        }\r\n    }\r\n    if (le32toh(pInfo->IPv6Mtu)) mbim_debug(\"%s ipv6 mtu = %u\", direction, le32toh(pInfo->IPv6Mtu));\r\n}\r\n\r\nstatic void mbim_dump(MBIM_MESSAGE_HEADER *pMsg, int mbim_verbose) {\r\n    unsigned char *data = (unsigned char *)pMsg;\r\n    const char *direction = (le32toh(pMsg->MessageType) & 0x80000000) ? \"<\" : \">\";\r\n\r\n    if (!mbim_verbose)\r\n        return;\r\n\r\n    if (mbim_verbose) {\r\n        unsigned i;\r\n        static char *_tmp = NULL;\r\n\r\n        if (!_tmp)\r\n            _tmp = (char *)malloc(4096);\r\n\r\n        if (_tmp) {\r\n            _tmp[0] = (le32toh(pMsg->MessageType) & 0x80000000) ? '<' : '>';\r\n            _tmp[1] = '\\0';\r\n            for (i = 0; i < le32toh(pMsg->MessageLength) && i < 4096; i++)\r\n                snprintf(_tmp + strlen(_tmp), 4096 - strlen(_tmp), \"%02X:\", data[i]);\r\n            mbim_debug(\"%s\", _tmp);\r\n        }\r\n    }\r\n\r\n    mbim_dump_header(pMsg, direction);\r\n\r\n    switch (le32toh(pMsg->MessageType)) {\r\n    case MBIM_OPEN_MSG: {\r\n        MBIM_OPEN_MSG_T *pOpenMsg = (MBIM_OPEN_MSG_T *)pMsg;\r\n        mbim_debug(\"%s MaxControlTransfer = %u\", direction, le32toh(pOpenMsg->MaxControlTransfer));\r\n    }\r\n    break;\r\n    case MBIM_OPEN_DONE: {\r\n        MBIM_OPEN_DONE_T *pOpenDone = (MBIM_OPEN_DONE_T *)pMsg;\r\n        mbim_debug(\"%s Status = %u\", direction, le32toh(pOpenDone->Status));\r\n    }\r\n    break;\r\n    case MBIM_CLOSE_MSG: {\r\n\r\n    }\r\n    break;\r\n    case MBIM_CLOSE_DONE: {\r\n        MBIM_CLOSE_DONE_T *pCloseDone = (MBIM_CLOSE_DONE_T *)pMsg;\r\n        mbim_debug(\"%s Status = %u\", direction, le32toh(pCloseDone->Status));\r\n    }\r\n    break;\r\n    case MBIM_COMMAND_MSG: {\r\n        MBIM_COMMAND_MSG_T *pCmdMsg = (MBIM_COMMAND_MSG_T *)pMsg;\r\n\r\n        mbim_dump_command_msg(pCmdMsg, direction);\r\n        if (!memcmp(pCmdMsg->DeviceServiceId.uuid, str2uuid(UUID_BASIC_CONNECT), 16)) {\r\n            switch (le32toh(pCmdMsg->CID)) {\r\n               case  MBIM_CID_CONNECT: {\r\n                    MBIM_SET_CONNECT_T *pInfo = (MBIM_SET_CONNECT_T *)pCmdMsg->InformationBuffer;\r\n                    mbim_debug(\"%s SessionId = %u\", direction, le32toh(pInfo->SessionId));\r\n                }\r\n                break;\r\n                case MBIM_CID_IP_CONFIGURATION: {\r\n                    MBIM_IP_CONFIGURATION_INFO_T *pInfo = (MBIM_IP_CONFIGURATION_INFO_T *)pCmdMsg->InformationBuffer;\r\n                    mbim_debug(\"%s SessionId = %u\", direction, le32toh(pInfo->SessionId));\r\n                }\r\n                break;\r\n                default:\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    break;\r\n    case MBIM_COMMAND_DONE: {\r\n        MBIM_COMMAND_DONE_T *pCmdDone = (MBIM_COMMAND_DONE_T *)pMsg;\r\n\r\n        mbim_dump_command_done(pCmdDone, direction);\r\n        if (le32toh(pCmdDone->InformationBufferLength) == 0)\r\n            return;\r\n\r\n        if (!memcmp(pCmdDone->DeviceServiceId.uuid, str2uuid(UUID_BASIC_CONNECT), 16)) {\r\n            switch (le32toh(pCmdDone->CID)) {\r\n                case MBIM_CID_CONNECT: {\r\n                MBIM_CONNECT_T *pInfo = (MBIM_CONNECT_T *)pCmdDone->InformationBuffer;\r\n                mbim_dump_connect(pInfo, direction);\r\n                }\r\n                break;\r\n                case MBIM_CID_IP_CONFIGURATION: {\r\n                    //MBIM_IP_CONFIGURATION_INFO_T *pInfo = (MBIM_IP_CONFIGURATION_INFO_T *)pCmdDone->InformationBuffer;\r\n                    //mbim_dump_ipconfig(pInfo, direction);\r\n                }\r\n                break;\r\n                case MBIM_CID_PACKET_SERVICE: {\r\n                    MBIM_PACKET_SERVICE_INFO_T *pInfo = (MBIM_PACKET_SERVICE_INFO_T *)pCmdDone->InformationBuffer;\r\n                    mbim_dump_packet_service(pInfo, direction);\r\n                }\r\n                break;\r\n                case MBIM_CID_SUBSCRIBER_READY_STATUS: {\r\n                    MBIM_SUBSCRIBER_READY_STATUS_T *pInfo = (MBIM_SUBSCRIBER_READY_STATUS_T *)pCmdDone->InformationBuffer;\r\n                    mbim_dump_subscriber_status(pInfo, direction);\r\n                }\r\n                break;\r\n                case MBIM_CID_REGISTER_STATE: {\r\n                    MBIM_REGISTRATION_STATE_INFO_T *pInfo = (MBIM_REGISTRATION_STATE_INFO_T *)pCmdDone->InformationBuffer;\r\n                    mbim_dump_regiester_status(pInfo, direction);\r\n                }\r\n                break;\r\n                default:\r\n                break;\r\n            }\r\n        }\r\n    }\r\n    break;\r\n    case MBIM_INDICATE_STATUS_MSG: {\r\n        MBIM_INDICATE_STATUS_MSG_T *pIndMsg = (MBIM_INDICATE_STATUS_MSG_T *)pMsg;\r\n\r\n        mbim_dump_indicate_msg(pIndMsg, direction);\r\n        if (le32toh(pIndMsg->InformationBufferLength) == 0)\r\n            return;\r\n\r\n        if (!memcmp(pIndMsg->DeviceServiceId.uuid, str2uuid(UUID_BASIC_CONNECT), 16)) {\r\n            switch (le32toh(pIndMsg->CID)) {\r\n                case MBIM_CID_CONNECT: {\r\n                    MBIM_CONNECT_T *pInfo = (MBIM_CONNECT_T *)pIndMsg->InformationBuffer;\r\n                    mbim_dump_connect(pInfo, direction);\r\n                }\r\n                break;\r\n                case MBIM_CID_SIGNAL_STATE: {\r\n                    MBIM_SIGNAL_STATE_INFO_T *pInfo = (MBIM_SIGNAL_STATE_INFO_T *)pIndMsg->InformationBuffer;\r\n                    mbim_dump_signal_state(pInfo, direction);\r\n                }\r\n                break;\r\n                case MBIM_CID_SUBSCRIBER_READY_STATUS: {\r\n                    MBIM_SUBSCRIBER_READY_STATUS_T *pInfo = (MBIM_SUBSCRIBER_READY_STATUS_T *)pIndMsg->InformationBuffer;\r\n                    mbim_dump_subscriber_status(pInfo, direction);\r\n                }\r\n                break;\r\n                case MBIM_CID_REGISTER_STATE: {\r\n                    MBIM_REGISTRATION_STATE_INFO_T *pInfo = (MBIM_REGISTRATION_STATE_INFO_T *)pIndMsg->InformationBuffer;\r\n                    mbim_dump_regiester_status(pInfo, direction);\r\n                }\r\n                break;\r\n                case MBIM_CID_PACKET_SERVICE: {\r\n                    MBIM_PACKET_SERVICE_INFO_T *pInfo = (MBIM_PACKET_SERVICE_INFO_T *)pIndMsg->InformationBuffer;\r\n                    mbim_dump_packet_service(pInfo, direction);\r\n                }\r\n                break;\r\n                default:\r\n                break;\r\n            }\r\n        }\r\n        else if (!memcmp(pIndMsg->DeviceServiceId.uuid, str2uuid(UUID_BASIC_CONNECT_EXT), 16)) {\r\n        }\r\n    }\r\n    break;\r\n    case MBIM_FUNCTION_ERROR_MSG: {\r\n        MBIM_FUNCTION_ERROR_MSG_T *pErrMsg = (MBIM_FUNCTION_ERROR_MSG_T*)pMsg;\r\n        mbim_debug(\"%s ErrorStatusCode = %u\", direction, le32toh(pErrMsg->ErrorStatusCode));\r\n    }\r\n    break;\r\n    default:\r\n    break;\r\n    }\r\n}\r\n\r\nstatic void mbim_recv_command(MBIM_MESSAGE_HEADER *pResponse, unsigned size)\r\n{\r\n    (void)size;\r\n    pthread_mutex_lock(&mbim_command_mutex);\r\n\r\n    if (pResponse)\r\n        mbim_dump(pResponse, mbim_verbose);\r\n\r\n    if (pResponse == NULL) {\r\n        pthread_cond_signal(&mbim_command_cond);\r\n    }\r\n    else if (mbim_pRequest && le32toh(mbim_pRequest->TransactionId) == le32toh(pResponse->TransactionId)) {\r\n        mbim_pResponse = mbim_alloc(le32toh(pResponse->MessageLength));\r\n        if (mbim_pResponse)\r\n            memcpy(mbim_pResponse, pResponse, le32toh(pResponse->MessageLength));\r\n        pthread_cond_signal(&mbim_command_cond);\r\n    }\r\n    else if (le32toh(pResponse->MessageType) ==  MBIM_INDICATE_STATUS_MSG) {\r\n        MBIM_INDICATE_STATUS_MSG_T *pIndMsg = (MBIM_INDICATE_STATUS_MSG_T *)pResponse;\r\n\r\n        if (!memcmp(pIndMsg->DeviceServiceId.uuid, str2uuid(UUID_BASIC_CONNECT), 16))\r\n        {\r\n            switch (le32toh(pIndMsg->CID)) {\r\n                case MBIM_CID_SUBSCRIBER_READY_STATUS: {\r\n                    MBIM_SUBSCRIBER_READY_STATUS_T *pInfo = (MBIM_SUBSCRIBER_READY_STATUS_T *)pIndMsg->InformationBuffer;\r\n                    if (oldReadyState != le32toh(pInfo->ReadyState))\r\n                        qmidevice_send_event_to_main(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED);\r\n                }\r\n                break;\r\n                case MBIM_CID_REGISTER_STATE: {\r\n                    MBIM_REGISTRATION_STATE_INFO_T *pInfo = (MBIM_REGISTRATION_STATE_INFO_T *)pIndMsg->InformationBuffer;\r\n                    if (oldRegisterState != le32toh(pInfo->RegisterState))\r\n                        qmidevice_send_event_to_main(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED);\r\n                }\r\n                break;\r\n                case MBIM_CID_PACKET_SERVICE: {\r\n                    MBIM_PACKET_SERVICE_INFO_T *pInfo = (MBIM_PACKET_SERVICE_INFO_T *)pIndMsg->InformationBuffer;\r\n                    MBIM_PACKET_SERVICE_STATE_E state = le32toh(pInfo->PacketServiceState);\r\n\r\n                    if (oldPacketServiceState != state\r\n                            && (1 || MBIMPacketServiceStateAttached == state || MBIMPacketServiceStateDetached == state))\r\n                        qmidevice_send_event_to_main(RIL_UNSOL_RESPONSE_VOICE_NETWORK_STATE_CHANGED);\r\n                }\r\n                break;\r\n                case MBIM_CID_CONNECT: {\r\n                    MBIM_CONNECT_T *pInfo = (MBIM_CONNECT_T *)pIndMsg->InformationBuffer;\r\n                    if (pInfo->SessionId == (uint32_t)mbim_sessionID) {\r\n                        MBIM_ACTIVATION_STATE_E state = le32toh(pInfo->ActivationState);\r\n\r\n                        if (oldActivationState != state\r\n                            && (1 || MBIMActivationStateActivated == state || MBIMActivationStateDeactivated == state))\r\n                            qmidevice_send_event_to_main(RIL_UNSOL_DATA_CALL_LIST_CHANGED);\r\n                    }\r\n                }\r\n                break;\r\n                default:\r\n                break;\r\n            }\r\n        }\r\n    }\r\n\r\n    pthread_mutex_unlock(&mbim_command_mutex);\r\n}\r\n\r\nstatic int mbim_send_command(MBIM_MESSAGE_HEADER *pRequest, MBIM_COMMAND_DONE_T **ppCmdDone, unsigned msecs) {\r\n    int ret;\r\n\r\n    if (ppCmdDone)\r\n         *ppCmdDone = NULL;\r\n\r\n    if (mbim_fd <= 0)\r\n        return -ENODEV;\r\n\r\n   if (s_tid_reader == 0)\r\n      return -EINVAL;\r\n\r\n    if (!pRequest)\r\n        return -ENOMEM;\r\n\r\n    pthread_mutex_lock(&mbim_command_mutex);\r\n\r\n    if (pRequest) {\r\n        if (pRequest->TransactionId == (0xFFFFFF + 1)) { //quectel-mbim-proxy need 0xFF000000 to indicat client\r\n            TransactionId = 1;\r\n            pRequest->TransactionId = htole32(TransactionId++);\r\n        }\r\n        mbim_dump(pRequest, mbim_verbose);\r\n    }\r\n\r\n    mbim_pRequest = pRequest;\r\n    mbim_pResponse = NULL;\r\n\r\n    ret = write(mbim_fd, pRequest, le32toh(pRequest->MessageLength));\r\n\r\n    if (ret > 0 && (uint32_t)ret == le32toh(pRequest->MessageLength)) {\r\n        ret = pthread_cond_timeout_np(&mbim_command_cond, &mbim_command_mutex, msecs);\r\n        if (!ret) {\r\n            if (mbim_pResponse && ppCmdDone) {\r\n                *ppCmdDone = (MBIM_COMMAND_DONE_T *)mbim_pResponse;\r\n            }\r\n        }\r\n    } else {\r\n        mbim_debug(\"%s pthread_cond_timeout_np=%d\", __func__, ret);\r\n    }\r\n\r\n    mbim_pRequest = mbim_pResponse = NULL;\r\n\r\n    pthread_mutex_unlock(&mbim_command_mutex);\r\n\r\n    return ret;\r\n}\r\n\r\nstatic ssize_t mbim_proxy_read (int fd, MBIM_MESSAGE_HEADER *pResponse, size_t size) {\r\n    ssize_t nreads;\r\n\r\n    nreads = read(fd, pResponse, sizeof(MBIM_MESSAGE_HEADER));\r\n    if (nreads == sizeof(MBIM_MESSAGE_HEADER) && le32toh(pResponse->MessageLength) <= size) {\r\n        nreads += read(fd, pResponse+1, le32toh(pResponse->MessageLength) - sizeof(MBIM_MESSAGE_HEADER));\r\n    }\r\n\r\n    return nreads;\r\n}\r\n\r\nstatic void * mbim_read_thread(void *param) {\r\n    PROFILE_T *profile = (PROFILE_T *)param;\r\n    const char *cdc_wdm = (const char *)profile->qmichannel;\r\n    int wait_for_request_quit = 0;\r\n\r\n    mbim_verbose = debug_qmi;\r\n    s_tid_reader = pthread_self();\r\n\r\n    if (profile->qmap_mode > 1 && profile->qmapnet_adapter[0]) {\r\n        if (!profile->proxy[0])\r\n             sprintf(profile->proxy, \"%s\", QUECTEL_MBIM_PROXY);\r\n        mbim_sessionID = profile->pdp;\r\n    }\r\n\r\n    if (profile->proxy[0]) {\r\n        mbim_fd = cm_open_proxy(profile->proxy);\r\n    } \r\n    else {\r\n        mbim_fd = cm_open_dev(cdc_wdm);\r\n    }\r\n\r\n    if (mbim_fd <= 0) {\r\n        mbim_debug(\"fail to open (%s), errno: %d (%s)\", cdc_wdm, errno, strerror(errno));\r\n        goto __quit;\r\n    }\r\n\r\n    dbg_time(\"cdc_wdm_fd = %d\", mbim_fd);\r\n\r\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_CONNECTED);\r\n\r\n    while (mbim_fd > 0) {\r\n        struct pollfd pollfds[] = {{mbim_fd, POLLIN, 0}, {qmidevice_control_fd[1], POLLIN, 0}, {qmi_over_mbim_sk[1], POLLIN, 0}};\r\n        int ne, ret, nevents = 2;\r\n\r\n        if (pollfds[nevents].fd != -1)\r\n            nevents++;\r\n\r\n        ret = poll(pollfds, nevents, wait_for_request_quit ? 1000 : -1);\r\n\r\n        if (ret == 0 && wait_for_request_quit) {\r\n            break;\r\n        }\r\n\r\n        if (ret < 0) {\r\n            mbim_debug(\"%s poll=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\r\n            break;\r\n        }\r\n\r\n        for (ne = 0; ne < nevents; ne++) {\r\n            int fd = pollfds[ne].fd;\r\n            short revents = pollfds[ne].revents;\r\n\r\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\r\n                mbim_debug(\"%s poll err/hup/inval\", __func__);\r\n                mbim_debug(\"epoll fd = %d, events = 0x%04x\", fd, revents);\r\n                if (revents & (POLLERR | POLLHUP | POLLNVAL))\r\n                goto __quit;\r\n            }\r\n\r\n            if ((revents & POLLIN) == 0)\r\n                continue;\r\n\r\n            if (mbim_fd == fd) {\r\n                ssize_t nreads;\r\n                MBIM_MESSAGE_HEADER *pResponse = (MBIM_MESSAGE_HEADER *) cm_recv_buf;\r\n\r\n                if (profile->proxy[0])\r\n                    nreads = mbim_proxy_read(fd, pResponse, sizeof(cm_recv_buf));\r\n                else\r\n                    nreads = read(fd, pResponse, sizeof(cm_recv_buf));\r\n\r\n                if (nreads <= 0) {\r\n                    mbim_debug(\"%s read=%d errno: %d (%s)\",  __func__, (int)nreads, errno, strerror(errno));\r\n                    break;\r\n                }\r\n\r\n                mbim_recv_command(pResponse, nreads);\r\n            }\r\n            else if (fd == qmidevice_control_fd[1]) {\r\n                int triger_event;\r\n                if (read(fd, &triger_event, sizeof(triger_event)) == sizeof(triger_event)) {\r\n                    //mbim_debug(\"triger_event = 0x%x\", triger_event);\r\n                    switch (triger_event) {\r\n                        case RIL_REQUEST_QUIT:\r\n                            goto __quit;\r\n                        break;\r\n                        case SIG_EVENT_STOP:\r\n                            wait_for_request_quit = 1;\r\n                        break;\r\n                        default:\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n            else if (fd == qmi_over_mbim_sk[1]) {\r\n                    ssize_t nreads = read(fd, cm_recv_buf, sizeof(cm_recv_buf));\r\n                    if (nreads > 0)\r\n                        QmiThreadRecvQMI((PQCQMIMSG)cm_recv_buf);\r\n            }\r\n        }\r\n    }\r\n\r\n__quit:\r\n    if (mbim_fd != -1) { close(mbim_fd); mbim_fd = -1; }\r\n    mbim_recv_command(NULL, 0);\r\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_DISCONNECTED);\r\n    mbim_debug(\"%s exit\", __func__);\r\n    s_tid_reader = 0;\r\n\r\n    return NULL;\r\n}\r\n\r\nstatic int mbim_status_code(MBIM_MESSAGE_HEADER *pMsgHdr) {\r\n    int status = 0;\r\n\r\n    if (!pMsgHdr)\r\n        return 0;\r\n\r\n    switch (le32toh(pMsgHdr->MessageType)) {\r\n        case MBIM_OPEN_DONE: {\r\n            MBIM_OPEN_DONE_T *pOpenDone = (MBIM_OPEN_DONE_T *)pMsgHdr;\r\n            status = le32toh(pOpenDone->Status);\r\n        }\r\n        break;\r\n        case MBIM_CLOSE_DONE: {\r\n            MBIM_CLOSE_DONE_T *pCloseDone = (MBIM_CLOSE_DONE_T *)pMsgHdr;\r\n            status = le32toh(pCloseDone->Status);\r\n        }\r\n        break;\r\n        case MBIM_COMMAND_DONE: {\r\n            MBIM_COMMAND_DONE_T *pCmdDone = (MBIM_COMMAND_DONE_T *)pMsgHdr;\r\n            status = le32toh(pCmdDone->Status);\r\n        }\r\n        break;\r\n        case MBIM_FUNCTION_ERROR_MSG: {\r\n            MBIM_FUNCTION_ERROR_MSG_T *pErrMsg = (MBIM_FUNCTION_ERROR_MSG_T *)pMsgHdr;\r\n            status = le32toh(pErrMsg->ErrorStatusCode);\r\n            if (status == MBIM_ERROR_NOT_OPENED)\r\n                mbim_open_state = 0; //EM06ELAR03A05M4G when suspend/resume, may get this error\r\n        }\r\n        break;\r\n        default:\r\n        break;\r\n    }\r\n\r\n    return status;\r\n}\r\n\r\n#define mbim_check_err(err, pRequest, pCmdDone) do { \\\r\n    int _status = mbim_status_code(pCmdDone ? &pCmdDone->MessageHeader : NULL); \\\r\n    if (err || _status || !pCmdDone) { \\\r\n        if (pCmdDone) { mbim_dump(&pCmdDone->MessageHeader, (mbim_verbose == 0)); } \\\r\n        mbim_free(pRequest); mbim_free(pCmdDone); \\\r\n        mbim_debug(\"%s:%d err=%d, Status=%d\", __func__, __LINE__, err, _status); \\\r\n        if (err) return err; \\\r\n        if (_status) return _status; \\\r\n        return 8888; \\\r\n    } \\\r\n} while(0)\r\n\r\n/*\r\n * MBIM device can be open repeatly without error\r\n * So, we can call the function, no matter it have been opened or not\r\n */\r\nstatic int mbim_open_device(uint32_t MaxControlTransfer) {\r\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\r\n    MBIM_OPEN_DONE_T *pOpenDone = NULL;\r\n    int err = 0;\r\n\r\n    mbim_debug(\"%s()\", __func__);\r\n    pRequest = compose_open_command(MaxControlTransfer);\r\n    err = mbim_send_command(pRequest, (MBIM_COMMAND_DONE_T **)&pOpenDone, 3*1000); //EM06ELAR03A09M4G take about 2.5 seconds\r\n    mbim_check_err(err, pRequest, pOpenDone);\r\n\r\n    err = le32toh(pOpenDone->Status);\r\n    mbim_free(pRequest); mbim_free(pOpenDone);\r\n\r\n    return err;\r\n}\r\n\r\nstatic int mbim_close_device(void) {\r\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\r\n    MBIM_CLOSE_DONE_T *pCloseDone = NULL;\r\n    int err = 0;\r\n\r\n    mbim_debug(\"%s()\", __func__);\r\n    pRequest = compose_close_command();\r\n    err = mbim_send_command(pRequest, (MBIM_COMMAND_DONE_T **)&pCloseDone, mbim_default_timeout);\r\n    mbim_check_err(err, pRequest, pCloseDone);\r\n\r\n    err = le32toh(pCloseDone->Status);\r\n    mbim_free(pRequest); mbim_free(pCloseDone);\r\n\r\n    return err;\r\n}\r\n\r\nstatic int mbim_query_connect(int sessionID) {\r\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\r\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\r\n    MBIM_SET_CONNECT_T set_connect;\r\n    int err;\r\n\r\n    if (ActivationState != MBIMActivationStateActivated  || mbim_verbose)\r\n        mbim_debug(\"%s(sessionID=%d)\", __func__, sessionID); //avoid two many log\r\n    set_connect.SessionId = htole32(sessionID);\r\n    pRequest = compose_basic_connect_command(MBIM_CID_CONNECT, MBIM_CID_CMD_TYPE_QUERY, &set_connect, sizeof(set_connect));\r\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\r\n    mbim_check_err(err, pRequest, pCmdDone);\r\n\r\n    if (le32toh(pCmdDone->InformationBufferLength))\r\n    {\r\n        MBIM_CONNECT_T *pInfo = (MBIM_CONNECT_T *)pCmdDone->InformationBuffer;\r\n        ActivationState = le32toh(pInfo->ActivationState);\r\n        mbim_update_state();\r\n    }\r\n    mbim_free(pRequest); mbim_free(pCmdDone);\r\n    return err;\r\n}\r\n\r\nstatic int mbim_ms_version_query(void) {\r\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\r\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\r\n    int err;\r\n\r\n    struct _bc_ext_version {\r\n            UINT8 ver_minor;\r\n            UINT8 ver_major;\r\n            UINT8 ext_ver_minor;\r\n            UINT8 ext_ver_major;\r\n    } __attribute__ ((packed)) bc_ext_version;\r\n\r\n    bc_ext_version.ver_major = 1;\r\n    bc_ext_version.ver_minor = 0;\r\n    bc_ext_version.ext_ver_major = 2;\r\n    bc_ext_version.ext_ver_minor = 0;\r\n\r\n    pRequest = compose_basic_connect_ext_command(MBIM_CID_MS_VERSION, MBIM_CID_CMD_TYPE_QUERY, &bc_ext_version, sizeof(bc_ext_version));\r\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\r\n    mbim_check_err(err, pRequest, pCmdDone);\r\n\r\n    if (le32toh(pCmdDone->InformationBufferLength)) {\r\n        struct _bc_ext_version *pInfo = (struct _bc_ext_version *)pCmdDone->InformationBuffer;\r\n        //mbim_debug(\"%s ext_rel_ver major=%d, minor=%d\", __func__, pInfo->ext_ver_major, pInfo->ext_ver_minor);\r\n        mbim_ms_version = pInfo->ext_ver_major;\r\n    }\r\n\r\n    mbim_free(pRequest); mbim_free(pCmdDone);\r\n    return err;\r\n}\r\n\r\nstatic int mbim_device_services_query(void) {\r\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\r\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\r\n    int err;\r\n    int mbim_v2_support = 0;\r\n\r\n    mbim_debug(\"%s()\", __func__);\r\n    pRequest = compose_basic_connect_command(MBIM_CID_DEVICE_SERVICES, MBIM_CID_CMD_TYPE_QUERY, NULL, 0);\r\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\r\n    mbim_check_err(err, pRequest, pCmdDone);\r\n\r\n    if (pCmdDone->InformationBufferLength) {\r\n         MBIM_DEVICE_SERVICES_INFO_T *pInfo = (MBIM_DEVICE_SERVICES_INFO_T *)pCmdDone->InformationBuffer;\r\n         UINT32 i;\r\n\r\n        for (i = 0; i < le32toh(pInfo->DeviceServicesCount) ; i++) {\r\n            //UINT32 size = pInfo->DeviceServicesRefList[i].size;\r\n            UINT32 offset = le32toh(pInfo->DeviceServicesRefList[i].offset);\r\n            MBIM_DEVICE_SERVICE_ELEMENT_T *pSrvEle = (MBIM_DEVICE_SERVICE_ELEMENT_T *)((void *)pInfo + offset);\r\n\r\n            //mbim_debug(\"\\t[%2d] %s (%s)\", i, DeviceServiceId2str(&pSrvEle->DeviceServiceId), uuid2str(&pSrvEle->DeviceServiceId));\r\n            if (!strcasecmp(UUID_BASIC_CONNECT_EXT, uuid2str(&pSrvEle->DeviceServiceId))) {\r\n                UINT32 cid = 0;\r\n\r\n                for (cid = 0; cid < le32toh(pSrvEle->CidCount); cid++) {\r\n                  if (MBIM_CID_MS_VERSION == le32toh(pSrvEle->CidList[cid])) {\r\n                        mbim_v2_support = 1;\r\n                    }\r\n                }\r\n            }\r\n            else if (!strcasecmp(uuid_ext_qmux, uuid2str(&pSrvEle->DeviceServiceId))) {\r\n                qmi_over_mbim_support = 1;\r\n            }\r\n        }\r\n    }\r\n    mbim_free(pRequest); mbim_free(pCmdDone);\r\n\r\n    if (mbim_v2_support) {\r\n        mbim_ms_version_query();\r\n    }\r\n\r\n    return err;\r\n}\r\n\r\nstatic int mbim_device_caps_query(PROFILE_T *profile) {\r\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\r\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\r\n    int err;\r\n\r\n    mbim_debug(\"%s()\", __func__);\r\n    pRequest = compose_basic_connect_command(MBIM_CID_DEVICE_CAPS, MBIM_CID_CMD_TYPE_QUERY, NULL, 0);\r\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\r\n    mbim_check_err(err, pRequest, pCmdDone);\r\n\r\n    if (le32toh(pCmdDone->InformationBufferLength)) {\r\n         MBIM_DEVICE_CAPS_INFO_T *pInfo = (MBIM_DEVICE_CAPS_INFO_T *)pCmdDone->InformationBuffer;\r\n         char tmp[32];\r\n\r\n         if (le32toh(pInfo->DeviceIdOffset) && le32toh(pInfo->DeviceIdSize)) {\r\n            wchar2char((const char *)pInfo + le32toh(pInfo->DeviceIdOffset), le32toh(pInfo->DeviceIdSize), tmp, sizeof(tmp));\r\n            mbim_debug(\"DeviceId:     %s\", tmp);\r\n         }\r\n         if (le32toh(pInfo->FirmwareInfoOffset) && le32toh(pInfo->FirmwareInfoSize)) {\r\n            wchar2char((const char *)pInfo + le32toh(pInfo->FirmwareInfoOffset), le32toh(pInfo->FirmwareInfoSize), tmp, sizeof(tmp));\r\n            strncpy(profile->BaseBandVersion, tmp, sizeof(profile->BaseBandVersion));\r\n            mbim_debug(\"FirmwareInfo: %s\", tmp);\r\n         }\r\n         if (le32toh(pInfo->HardwareInfoOffset) && le32toh(pInfo->HardwareInfoSize)) {\r\n            wchar2char((const char *)pInfo + le32toh(pInfo->HardwareInfoOffset), le32toh(pInfo->HardwareInfoSize), tmp, sizeof(tmp));\r\n            mbim_debug(\"HardwareInfo: %s\", tmp);\r\n         }\r\n    }\r\n    mbim_free(pRequest); mbim_free(pCmdDone);\r\n    return err;\r\n}\r\n\r\n#if 0\r\nstatic int mbim_radio_state_query(void) {\r\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\r\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\r\n    int err;\r\n\r\n    mbim_debug(\"%s()\", __func__);\r\n    pRequest = compose_basic_connect_command(MBIM_CID_RADIO_STATE, MBIM_CID_CMD_TYPE_QUERY, NULL, 0);\r\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\r\n    mbim_check_err(err, pRequest, pCmdDone);\r\n\r\n    if (pCmdDone->InformationBufferLength) {\r\n         MBIM_RADIO_STATE_INFO_T *pInfo = (MBIM_RADIO_STATE_INFO_T *)pCmdDone->InformationBuffer;\r\n        mbim_debug(\"HwRadioState: %d, SwRadioState: %d\", pInfo->HwRadioState, pInfo->SwRadioState);\r\n    }\r\n    mbim_free(pRequest); mbim_free(pCmdDone);\r\n    return err;\r\n}\r\n#endif\r\n\r\nstatic int mbim_set_radio_state(MBIM_RADIO_SWITCH_STATE_E RadioState) {\r\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\r\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\r\n    UINT32 value = htole32(RadioState);\r\n    int err;\r\n\r\n    mbim_debug(\"%s( %d )\", __func__, RadioState);\r\n    pRequest = compose_basic_connect_command(MBIM_CID_RADIO_STATE, MBIM_CID_CMD_TYPE_SET, &value, sizeof(value));\r\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\r\n    mbim_check_err(err, pRequest, pCmdDone);\r\n\r\n    if (le32toh(pCmdDone->InformationBufferLength)) {\r\n         MBIM_RADIO_STATE_INFO_T *pInfo = (MBIM_RADIO_STATE_INFO_T *)pCmdDone->InformationBuffer;\r\n        mbim_debug(\"HwRadioState: %d, SwRadioState: %d\", le32toh(pInfo->HwRadioState), le32toh(pInfo->SwRadioState));\r\n    }\r\n    mbim_free(pRequest); mbim_free(pCmdDone);\r\n    return err;\r\n}\r\n\r\nstatic int mbim_subscriber_status_query(void) {\r\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\r\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\r\n    int err;\r\n\r\n    mbim_debug(\"%s()\", __func__);\r\n    pRequest = compose_basic_connect_command(MBIM_CID_SUBSCRIBER_READY_STATUS, MBIM_CID_CMD_TYPE_QUERY, NULL, 0);\r\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\r\n    mbim_check_err(err, pRequest, pCmdDone);\r\n\r\n    if (le32toh(pCmdDone->InformationBufferLength)) {\r\n         MBIM_SUBSCRIBER_READY_STATUS_T *pInfo = (MBIM_SUBSCRIBER_READY_STATUS_T *)pCmdDone->InformationBuffer;\r\n         char tmp[32];\r\n\r\n        wchar2char((const char *)pInfo + le32toh(pInfo->SubscriberIdOffset), le32toh(pInfo->SubscriberIdSize), tmp, sizeof(tmp));\r\n        mbim_debug(\"SubscriberId: %s\", tmp);\r\n        wchar2char((const char *)pInfo + le32toh(pInfo->SimIccIdOffset), le32toh(pInfo->SimIccIdSize), tmp, sizeof(tmp));\r\n        mbim_debug(\"SimIccId:     %s\", tmp);\r\n        ReadyState = le32toh(pInfo->ReadyState);\r\n        mbim_update_state();\r\n    }\r\n    mbim_free(pRequest); mbim_free(pCmdDone);\r\n    return err;\r\n}\r\n\r\nstatic int mbim_register_state_query(void) {\r\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\r\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\r\n    int err;\r\n\r\n    mbim_debug(\"%s()\", __func__);\r\n    pRequest = compose_basic_connect_command(MBIM_CID_REGISTER_STATE, MBIM_CID_CMD_TYPE_QUERY, NULL, 0);\r\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\r\n    mbim_check_err(err, pRequest, pCmdDone);\r\n\r\n    if (le32toh(pCmdDone->InformationBufferLength)) {\r\n        MBIM_REGISTRATION_STATE_INFO_T *pInfo = (MBIM_REGISTRATION_STATE_INFO_T *)pCmdDone->InformationBuffer;;\r\n        RegisterState = le32toh(pInfo->RegisterState);\r\n        mbim_update_state();\r\n    }\r\n    mbim_free(pRequest); mbim_free(pCmdDone);\r\n    return err;\r\n}\r\n\r\nstatic int mbim_packet_service_query(void) {\r\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\r\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\r\n    int err;\r\n\r\n    mbim_debug(\"%s()\", __func__);\r\n    pRequest = compose_basic_connect_command(MBIM_CID_PACKET_SERVICE, MBIM_CID_CMD_TYPE_QUERY, NULL, 0);\r\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\r\n    mbim_check_err(err, pRequest, pCmdDone);\r\n\r\n    if (le32toh(pCmdDone->InformationBufferLength)) {\r\n        MBIM_PACKET_SERVICE_INFO_T *pInfo = (MBIM_PACKET_SERVICE_INFO_T *)pCmdDone->InformationBuffer;\r\n        PacketServiceState = le32toh(pInfo->PacketServiceState);\r\n        mbim_update_state();\r\n\r\n        if (le32toh(pCmdDone->InformationBufferLength) == sizeof(MBIM_PACKET_SERVICE_INFO_V2_T)) {\r\n            MBIM_PACKET_SERVICE_INFO_V2_T *pInfo = (MBIM_PACKET_SERVICE_INFO_V2_T *)pCmdDone->InformationBuffer;\r\n            mbim_debug(\"CurrentDataClass = %s\", MBIMDataClassStr(le32toh(pInfo->CurrentDataClass)));\r\n        }\r\n    }\r\n    mbim_free(pRequest); mbim_free(pCmdDone);\r\n    return err;\r\n}\r\n\r\nstatic int mbim_packet_service_set(MBIM_PACKET_SERVICE_ACTION_E action) {\r\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\r\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\r\n    UINT32 value = htole32(action);\r\n    int err;\r\n\r\n    mbim_debug(\"%s()\", __func__);\r\n    pRequest = compose_basic_connect_command(MBIM_CID_PACKET_SERVICE, MBIM_CID_CMD_TYPE_SET, &value, sizeof(value));\r\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\r\n    mbim_check_err(err, pRequest, pCmdDone);\r\n\r\n    if (le32toh(pCmdDone->InformationBufferLength)) {\r\n        MBIM_PACKET_SERVICE_INFO_T *pInfo = (MBIM_PACKET_SERVICE_INFO_T *)pCmdDone->InformationBuffer;\r\n        PacketServiceState = le32toh(pInfo->PacketServiceState);\r\n        mbim_update_state();\r\n    }\r\n    mbim_free(pRequest); mbim_free(pCmdDone);\r\n    return err;\r\n}\r\n\r\n#define _align_32(len) {len += (len % 4) ? (4 - (len % 4)) : 0;}\r\nstatic int mbim_populate_connect_data(MBIM_SET_CONNECT_T **connect_req_ptr) {\r\n    int offset;\r\n    int buflen = 0;\r\n\r\n    if (mbim_apn && strlen(mbim_apn) > 0) buflen += 2*strlen(mbim_apn) ;\r\n    _align_32(buflen);\r\n    if (mbim_user && strlen(mbim_user) > 0) buflen += 2*strlen(mbim_user);\r\n    _align_32(buflen);\r\n    if (mbim_pd && strlen(mbim_pd) > 0) buflen += 2*strlen(mbim_pd);\r\n    _align_32(buflen);\r\n\r\n    *connect_req_ptr = (MBIM_SET_CONNECT_T*)malloc(sizeof(MBIM_SET_CONNECT_T) + buflen);\r\n    if (! *connect_req_ptr) {\r\n        mbim_debug(\"not enough memory\\n\");\r\n        return -1;\r\n    }\r\n    memset(*connect_req_ptr, 0, sizeof(MBIM_SET_CONNECT_T) + buflen);\r\n\r\n    offset = 0;\r\n    if (mbim_apn && strlen(mbim_apn) > 0) {\r\n        (*connect_req_ptr)->AccessStringSize = htole32(2*strlen(mbim_apn));\r\n        (*connect_req_ptr)->AccessStringOffset = htole32(offset + sizeof(MBIM_SET_CONNECT_T));\r\n        offset = char2wchar(mbim_apn, strlen(mbim_apn), &(*connect_req_ptr)->DataBuffer[offset], buflen - offset);\r\n        _align_32(offset);\r\n    }\r\n\r\n    if (mbim_user && strlen(mbim_user) > 0) {\r\n        (*connect_req_ptr)->UserNameSize = htole32(2*strlen(mbim_user));\r\n        (*connect_req_ptr)->UserNameOffset = htole32(offset + sizeof(MBIM_SET_CONNECT_T));\r\n        offset = char2wchar(mbim_user, strlen(mbim_user), &(*connect_req_ptr)->DataBuffer[offset], buflen - offset);\r\n        _align_32(offset);\r\n    }\r\n\r\n    if (mbim_pd && strlen(mbim_pd) > 0) {\r\n        (*connect_req_ptr)->PasswordSize = htole32(2*strlen(mbim_pd));\r\n        (*connect_req_ptr)->PasswordOffset = htole32(offset + sizeof(MBIM_SET_CONNECT_T));\r\n        offset = char2wchar(mbim_pd, strlen(mbim_pd), &(*connect_req_ptr)->DataBuffer[offset], buflen - offset);\r\n    }\r\n\r\n    return buflen;\r\n}\r\n\r\nstatic int mbim_set_connect(int onoff, int sessionID) {\r\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\r\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\r\n    MBIM_SET_CONNECT_T *set_connect = NULL;\r\n    int err;\r\n\r\n    mbim_debug(\"%s(onoff=%d, sessionID=%d)\", __func__, onoff, sessionID);\r\n    /* alloc memory then populate APN USERNAME PASSWORD */\r\n    int buflen = mbim_populate_connect_data(&set_connect);\r\n    if (buflen < 0) {\r\n        return ENOMEM;\r\n     }\r\n\r\n    set_connect->SessionId = htole32(sessionID);\r\n    if (onoff == 0)\r\n        set_connect->ActivationCommand = htole32(MBIMActivationCommandDeactivate);\r\n    else\r\n        set_connect->ActivationCommand = htole32(MBIMActivationCommandActivate);\r\n\r\n    set_connect->Compression = htole32(MBIMCompressionNone);\r\n    set_connect->AuthProtocol = htole32(mbim_auth);\r\n    set_connect->IPType = htole32(mbim_iptype);\r\n    memcpy(set_connect->ContextType.uuid, str2uuid(UUID_MBIMContextTypeInternet), 16);\r\n\r\n    pRequest = compose_basic_connect_command(MBIM_CID_CONNECT, MBIM_CID_CMD_TYPE_SET, set_connect, sizeof(MBIM_SET_CONNECT_T) + buflen);\r\n    mbim_free(set_connect);\r\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout*10);\r\n    mbim_check_err(err, pRequest, pCmdDone);\r\n\r\n    if (le32toh(pCmdDone->InformationBufferLength)) {\r\n        MBIM_CONNECT_T *pInfo = (MBIM_CONNECT_T *)pCmdDone->InformationBuffer;\r\n        ActivationState = le32toh(pInfo->ActivationState);\r\n        mbim_update_state();\r\n    }\r\n\r\n    mbim_free(pRequest); mbim_free(pCmdDone);\r\n    return err;\r\n}\r\n\r\nstatic int mbim_ip_config(PROFILE_T *profile, int sessionID) {\r\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\r\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\r\n    MBIM_IP_CONFIGURATION_INFO_T ip_info;\r\n    int err;\r\n\r\n    if (profile->ipv4.Address == 0 || mbim_verbose)\r\n        mbim_debug(\"%s(sessionID=%d)\", __func__, sessionID);\r\n    ip_info.SessionId = htole32(sessionID);\r\n    pRequest = compose_basic_connect_command(MBIM_CID_IP_CONFIGURATION, MBIM_CID_CMD_TYPE_QUERY, &ip_info, sizeof(ip_info));\r\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\r\n    mbim_check_err(err, pRequest, pCmdDone);\r\n\r\n    if (le32toh(pCmdDone->InformationBufferLength)) {\r\n        UINT8 prefix, *ipv4=NULL, *ipv6=NULL, *gw=NULL, *dns1=NULL, *dns2=NULL;\r\n        UINT32 mtu = 1500;\r\n        MBIM_IP_CONFIGURATION_INFO_T *pInfo = (MBIM_IP_CONFIGURATION_INFO_T *)pCmdDone->InformationBuffer;\r\n\r\n        /* IPv4 network configration */\r\n        if (le32toh(pInfo->IPv4ConfigurationAvailable)&0x1) {\r\n            MBIM_IPV4_ELEMENT_T *pAddress = (MBIM_IPV4_ELEMENT_T *)(&pInfo->DataBuffer[le32toh(pInfo->IPv4AddressOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\r\n            prefix = le32toh(pAddress->OnLinkPrefixLength);\r\n            ipv4 = pAddress->IPv4Address;\r\n\r\n            if (le32toh(pInfo->IPv4ConfigurationAvailable)&0x2)\r\n                gw = (UINT8 *)(&pInfo->DataBuffer[le32toh(pInfo->IPv4GatewayOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\r\n\r\n            if (le32toh(pInfo->IPv4ConfigurationAvailable)&0x4) {\r\n                dns1 = (UINT8 *)(&pInfo->DataBuffer[le32toh(pInfo->IPv4DnsServerOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\r\n                if (le32toh(pInfo->IPv4DnsServerCount) == 2)\r\n                    dns2 = dns1 + 4;\r\n            }\r\n\r\n            if (le32toh(pInfo->IPv4ConfigurationAvailable)&0x8)\r\n                mtu =  le32toh(pInfo->IPv4Mtu);\r\n\r\n            if (profile->ipv4.Address != mbim2qmi_ipv4addr(*(uint32_t *)ipv4) || mbim_verbose) {\r\n                mbim_dump_ipconfig(pInfo, \"<\");\r\n                profile->ipv4.Address = mbim2qmi_ipv4addr(*(uint32_t *)ipv4);\r\n            }\r\n\r\n\t\t\tif(gw != NULL)\r\n            \tprofile->ipv4.Gateway = mbim2qmi_ipv4addr(*(uint32_t *)gw);\r\n            profile->ipv4.SubnetMask = mbim2qmi_ipv4addr(0xFFFFFFFF>>(32-prefix)<<(32-prefix));\r\n\t\t\tif(dns1 != NULL)\r\n            \tprofile->ipv4.DnsPrimary = mbim2qmi_ipv4addr(*(uint32_t *)dns1);\r\n\t\t\tif(dns2 != NULL)\r\n            \tprofile->ipv4.DnsSecondary = mbim2qmi_ipv4addr(*(uint32_t *)dns2);\r\n            profile->ipv4.Mtu = mbim2qmi_ipv4addr(mtu);\r\n        }\r\n\r\n        /* IPv6 network configration */\r\n        if (le32toh(pInfo->IPv6ConfigurationAvailable)&0x1) {\r\n\t\t\tgw = NULL; dns1 = NULL; dns2 = NULL;\r\n            MBIM_IPV6_ELEMENT_T *pAddress = (MBIM_IPV6_ELEMENT_T *)(&pInfo->DataBuffer[le32toh(pInfo->IPv6AddressOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\r\n            prefix = le32toh(pAddress->OnLinkPrefixLength);\r\n            ipv6 = pAddress->IPv6Address;\r\n\r\n            if (le32toh(pInfo->IPv6ConfigurationAvailable)&0x2)\r\n                gw = (UINT8 *)(&pInfo->DataBuffer[le32toh(pInfo->IPv6GatewayOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\r\n\r\n            if (le32toh(pInfo->IPv6ConfigurationAvailable)&0x4) {\r\n                dns1 = (UINT8 *)(&pInfo->DataBuffer[le32toh(pInfo->IPv6DnsServerOffset)-sizeof(MBIM_IP_CONFIGURATION_INFO_T)]);\r\n                if (le32toh(pInfo->IPv6DnsServerCount) == 2)\r\n                    dns2 = dns1 + 16;\r\n            }\r\n\r\n            if (le32toh(pInfo->IPv6ConfigurationAvailable)&0x8)\r\n                mtu =  le32toh(pInfo->IPv6Mtu);\r\n\r\n            if(ipv6 != NULL)\r\n            \tmbim2qmi_ipv6addr(ipv6, profile->ipv6.Address);\r\n\t\t\tif(gw != NULL)\r\n            \tmbim2qmi_ipv6addr(gw, profile->ipv6.Gateway);\r\n\t\t\tif(dns1 != NULL)\r\n            \tmbim2qmi_ipv6addr(dns1, profile->ipv6.DnsPrimary);\r\n\t\t\tif(dns2 != NULL)\r\n            \tmbim2qmi_ipv6addr(dns2, profile->ipv6.DnsSecondary);\r\n            profile->ipv6.PrefixLengthIPAddr = prefix;\r\n            profile->ipv6.PrefixLengthGateway = prefix;\r\n            profile->ipv6.Mtu = mbim2qmi_ipv4addr(mtu);\r\n        }\r\n    }\r\n    return err;\r\n}\r\n\r\nint mbim_proxy_configure(const char *dev) {\r\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\r\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\r\n    MBIM_LIBQMI_PROXY_CONFIG_T *cfg;\r\n    int err;\r\n\r\n    pRequest = compose_basic_connect_command(\r\n                                                    MBIM_CID_PROXY_CONTROL_CONFIGURATION,\r\n                                                    MBIM_CID_CMD_TYPE_SET,\r\n                                                    NULL,\r\n                                                    sizeof(*cfg) + strlen(dev)*2);\r\n    if (pRequest) {\r\n        memcpy(((MBIM_COMMAND_MSG_T *)pRequest)->DeviceServiceId.uuid, str2uuid(UUID_LIBMBIM_PROXY), 16);\r\n        cfg = (MBIM_LIBQMI_PROXY_CONFIG_T *)((MBIM_COMMAND_MSG_T *)pRequest)->InformationBuffer;\r\n\r\n        cfg->DevicePathOffset = sizeof(*cfg);\r\n        cfg->DevicePathSize = char2wchar(dev, strlen(dev), cfg->DataBuffer, strlen(dev)*2);\r\n        cfg->Timeout = 15;\r\n    }\r\n\r\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\r\n    mbim_check_err(err, pRequest, pCmdDone);\r\n\r\n    mbim_free(pRequest); mbim_free(pCmdDone);\r\n    return err;\r\n}\r\n\r\nstatic int mbim_update_state(void) {\r\n    int chages = 0;\r\n\r\n    if (oldReadyState != ReadyState) {\r\n        mbim_debug(\"SubscriberReadyState %s -> %s \", MBIMSubscriberReadyStateStr(oldReadyState), MBIMSubscriberReadyStateStr(ReadyState));\r\n        oldReadyState = ReadyState; chages++;\r\n    }\r\n    if (oldRegisterState != RegisterState) {\r\n        mbim_debug(\"RegisterState %s -> %s \", MBIMRegisterStateStr(oldRegisterState), MBIMRegisterStateStr(RegisterState));\r\n        oldRegisterState = RegisterState; chages++;\r\n    }\r\n    if (oldPacketServiceState != PacketServiceState) {\r\n        mbim_debug(\"PacketServiceState %s -> %s \", MBIMPacketServiceStateStr(oldPacketServiceState), MBIMPacketServiceStateStr(PacketServiceState));\r\n        oldPacketServiceState = PacketServiceState; chages++;\r\n    }\r\n    if (oldActivationState != ActivationState) {\r\n        mbim_debug(\"ActivationState %s -> %s \", MBIMActivationStateStr(oldActivationState), MBIMActivationStateStr(ActivationState));\r\n        oldActivationState = ActivationState; chages++;\r\n    }\r\n\r\n    return chages;\r\n}\r\n\r\nstatic int mbim_init(PROFILE_T *profile) {\r\n    int retval;\r\n    int t = 0;\r\n\r\n    if (profile->proxy[0] && !strcmp(profile->proxy, LIBMBIM_PROXY)) {\r\n        retval = mbim_proxy_configure(profile->qmichannel);\r\n        if (retval) goto exit;\r\n    }\r\n\r\n    while (t++ < 10) {\r\n        retval = mbim_open_device(4096);\r\n        if (retval != ETIMEDOUT)\r\n            break;\r\n    }\r\n    if (retval) goto exit;\r\n    retval = mbim_device_caps_query(profile);\r\n    if (retval) goto exit;\r\n    mbim_update_state();\r\n    retval = mbim_device_services_query();\r\n    if (retval) goto exit;\r\n    mbim_update_state();\r\n    retval = mbim_set_radio_state(MBIMRadioOn);\r\n    if (retval) goto exit;\r\n    mbim_update_state();\r\n\r\n    if (qmi_over_mbim_support) {\r\n        if (!socketpair( AF_LOCAL, SOCK_STREAM, 0, qmi_over_mbim_sk)) {\r\n            qmidev_send = qmi_over_mbim_qmidev_send;\r\n#ifdef CONFIG_CELLINFO //by now, only this function need QMI OVER MBIM\r\n            qmi_over_mbim_nas = qmi_over_mbim_get_client_id(QMUX_TYPE_NAS);\r\n#endif\r\n        }\r\n    }\r\n\r\n    return 0;\r\n\r\nexit:\r\n    return retval;\r\n}\r\n\r\nstatic int mbim_deinit(void) {\r\n    if (qmi_over_mbim_nas) {\r\n        qmi_over_mbim_release_client_id(QMUX_TYPE_NAS, qmi_over_mbim_nas);\r\n        qmi_over_mbim_nas = 0;\r\n    }\r\n    \r\n    mbim_close_device();\r\n\r\n    if (qmi_over_mbim_sk[0] != -1) {\r\n        close(qmi_over_mbim_sk[0]);\r\n        close(qmi_over_mbim_sk[1]);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nconst struct qmi_device_ops mbim_dev_ops = {\r\n    .init = mbim_init,\r\n    .deinit = mbim_deinit,\r\n    .read = mbim_read_thread,\r\n};\r\n\r\nstatic int requestBaseBandVersion(PROFILE_T *profile) {\r\n    (void)profile;\r\n    return 0;\r\n}\r\n\r\nstatic int requestGetSIMStatus(SIM_Status *pSIMStatus)\r\n{\r\n    int retval;\r\n\r\n    *pSIMStatus = SIM_ABSENT;\r\n    retval = mbim_subscriber_status_query();\r\n    if (retval)\r\n        goto exit;\r\n    mbim_update_state();\r\n\r\n     switch(ReadyState) {\r\n        case MBIMSubscriberReadyStateNotInitialized: *pSIMStatus = SIM_NOT_READY; break;\r\n        case MBIMSubscriberReadyStateInitialized: *pSIMStatus = SIM_READY; break;\r\n        case MBIMSubscriberReadyStateSimNotInserted: *pSIMStatus = SIM_ABSENT; break;\r\n        case MBIMSubscriberReadyStateBadSim: *pSIMStatus = SIM_BAD; break;\r\n        case MBIMSubscriberReadyStateFailure: *pSIMStatus = SIM_ABSENT; break;\r\n        case MBIMSubscriberReadyStateNotActivated: *pSIMStatus = SIM_ABSENT; break;\r\n        case MBIMSubscriberReadyStateDeviceLocked: *pSIMStatus = SIM_PIN; break;\r\n        default: *pSIMStatus = SIM_ABSENT; break;\r\n    }\r\n\r\nexit:\r\n    return retval;\r\n}\r\n\r\nstatic int requestRegistrationState(UCHAR *pPSAttachedState) {\r\n    int retval;\r\n\r\n    *pPSAttachedState = 0;\r\n    retval = mbim_register_state_query();\r\n    if (retval)\r\n        goto exit;\r\n    mbim_update_state();\r\n\r\n    switch (RegisterState) {\r\n        case MBIMRegisterStateUnknown: *pPSAttachedState = 0; break;\r\n        case MBIMRegisterStateDeregistered: *pPSAttachedState = 0; break;\r\n        case MBIMRegisterStateSearching: *pPSAttachedState = 0; break;\r\n        case MBIMRegisterStateHome: *pPSAttachedState = 1; break;\r\n        case MBIMRegisterStateRoaming: *pPSAttachedState = 1; break;\r\n        case MBIMRegisterStatePartner: *pPSAttachedState = 0; break;\r\n        case MBIMRegisterStateDenied: *pPSAttachedState = 0; break;\r\n        default: *pPSAttachedState = 0; break;\r\n    }\r\n\r\n    if (*pPSAttachedState == 0)\r\n        goto exit;\r\n\r\n    retval =  mbim_packet_service_query();\r\n    if (retval)\r\n        goto exit;\r\n\r\n    switch (PacketServiceState) {\r\n        case MBIMPacketServiceStateUnknown: *pPSAttachedState = 0; break;\r\n        case MBIMPacketServiceStateAttaching: *pPSAttachedState = 0; break;\r\n        case MBIMPacketServiceStateAttached: *pPSAttachedState = 1; break;\r\n        case MBIMPacketServiceStateDetaching: *pPSAttachedState = 0; break;\r\n        case MBIMPacketServiceStateDetached: *pPSAttachedState = 0; break;\r\n        default: *pPSAttachedState = 0; break;\r\n    }\r\n\r\n    if (*pPSAttachedState == 0)\r\n        mbim_packet_service_set(MBIMPacketServiceActionAttach);\r\n\r\nexit:\r\n    return retval;\r\n}\r\n\r\nstatic int requestSetupDataCall(PROFILE_T *profile, int curIpFamily) {\r\n    int retval;\r\n\r\n    (void)curIpFamily;\r\n\r\n    if (profile->apn)\r\n        mbim_apn = profile->apn;\r\n    if (profile->user)\r\n        mbim_user = profile->user;\r\n    if (profile->pd)\r\n        mbim_pd = profile->pd;\r\n    if (profile->auth)\r\n        mbim_auth = profile->auth;\r\n    if (profile->enable_ipv4)\r\n        mbim_iptype = MBIMContextIPTypeIPv4;\r\n    if (profile->enable_ipv6)\r\n        mbim_iptype = MBIMContextIPTypeIPv6;\r\n    if (profile->enable_ipv4 && profile->enable_ipv6)\r\n        mbim_iptype = MBIMContextIPTypeIPv4AndIPv6;\r\n\r\n    retval = mbim_set_connect(1, mbim_sessionID);\r\n    if (retval)\r\n        goto exit;\r\n\r\nexit:\r\n    return retval;\r\n}\r\n\r\nstatic int requestQueryDataCall(UCHAR  *pConnectionStatus, int curIpFamily) {\r\n    int retval;\r\n\r\n    (void)curIpFamily;\r\n\r\n    *pConnectionStatus = QWDS_PKT_DATA_DISCONNECTED;\r\n\r\n    retval = mbim_query_connect(mbim_sessionID);\r\n    if (retval)\r\n        goto exit;\r\n\r\n    switch(ActivationState) {\r\n        case MBIMActivationStateUnknown: *pConnectionStatus = QWDS_PKT_DATA_UNKNOW; break;\r\n        case MBIMActivationStateActivated: *pConnectionStatus = QWDS_PKT_DATA_CONNECTED; break;\r\n        case MBIMActivationStateActivating: *pConnectionStatus = QWDS_PKT_DATA_DISCONNECTED; break;\r\n        case MBIMActivationStateDeactivated: *pConnectionStatus = QWDS_PKT_DATA_DISCONNECTED; break;\r\n        case MBIMActivationStateDeactivating: *pConnectionStatus = QWDS_PKT_DATA_DISCONNECTED; break;\r\n        default: *pConnectionStatus = QWDS_PKT_DATA_DISCONNECTED; break;\r\n    }\r\n\r\nexit:\r\n    return retval;\r\n}\r\n\r\nstatic int requestDeactivateDefaultPDP(PROFILE_T *profile, int curIpFamily) {\r\n    int retval;\r\n    \r\n    (void)profile;\r\n    (void)curIpFamily;\r\n\r\n    retval = mbim_set_connect(0, mbim_sessionID);\r\n    if (retval)\r\n        goto exit;\r\n\r\nexit:\r\n    return retval;\r\n}\r\n\r\nstatic int requestGetIPAddress(PROFILE_T *profile, int curIpFamily) {\r\n    int retval;\r\n    \r\n    (void)curIpFamily;\r\n    retval = mbim_ip_config(profile, mbim_sessionID);\r\n    if (retval)\r\n        goto exit;\r\n\r\nexit:\r\n    return retval;\r\n}\r\n\r\n#ifdef CONFIG_CELLINFO\r\nstatic int requestGetCellInfoList(void) {\r\n    if (qmi_over_mbim_nas) {\r\n        if (qmi_request_ops.requestGetCellInfoList)\r\n            return qmi_request_ops.requestGetCellInfoList();\r\n    }\r\n\r\n    return 0;\r\n}\r\n#endif\r\n\r\nconst struct request_ops mbim_request_ops = {\r\n    .requestBaseBandVersion = requestBaseBandVersion,\r\n    .requestGetSIMStatus = requestGetSIMStatus,\r\n    .requestRegistrationState = requestRegistrationState,\r\n    .requestSetupDataCall = requestSetupDataCall,\r\n    .requestQueryDataCall = requestQueryDataCall,\r\n    .requestDeactivateDefaultPDP = requestDeactivateDefaultPDP,\r\n    .requestGetIPAddress = requestGetIPAddress,\r\n#ifdef CONFIG_CELLINFO\r\n    .requestGetCellInfoList = requestGetCellInfoList,\r\n#endif\r\n};\r\n\r\nint qmi_over_mbim_qmidev_send(PQCQMIMSG pQMI) {\r\n    MBIM_MESSAGE_HEADER *pRequest = NULL;\r\n    MBIM_COMMAND_DONE_T *pCmdDone = NULL;\r\n    int err;\r\n    size_t len = le16toh(pQMI->QMIHdr.Length) + 1;\r\n\r\n    if (pQMI->QMIHdr.QMIType != QMUX_TYPE_CTL) {\r\n        if (pQMI->QMIHdr.QMIType == QMUX_TYPE_NAS)\r\n            pQMI->QMIHdr.ClientId = qmi_over_mbim_nas;\r\n\r\n        if (pQMI->QMIHdr.ClientId == 0) {\r\n            dbg_time(\"QMIType %d has no clientID\", pQMI->QMIHdr.QMIType);\r\n            return -ENODEV;\r\n        }\r\n    }\r\n\r\n    pRequest = compose_qmi_over_mbim_command(1, MBIM_CID_CMD_TYPE_SET, pQMI, len);\r\n    err = mbim_send_command(pRequest, &pCmdDone, mbim_default_timeout);\r\n    mbim_check_err(err, pRequest, pCmdDone);\r\n\r\n    err = -1;\r\n    len = le32toh(pCmdDone->InformationBufferLength);\r\n    if (len) {\r\n        if (write(qmi_over_mbim_sk[0], pCmdDone->InformationBuffer, len) == (long)len) {\r\n            err = 0;\r\n        };\r\n    }\r\n\r\n    mbim_free(pRequest); mbim_free(pCmdDone);\r\n    return err;\r\n}\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/qendian.h",
    "content": "/*\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\n\n    Quectel hereby grants customers of Quectel a license to use, modify,\n    distribute and publish the Software in binary form provided that\n    customers shall have no right to reverse engineer, reverse assemble,\n    decompile or reduce to source code form any portion of the Software. \n    Under no circumstances may customers modify, demonstrate, use, deliver \n    or disclose any portion of the Software in source code form.\n*/\n\n#ifndef __QUECTEL_ENDIAN_H__\n#define __QUECTEL_ENDIAN_H__\n#include <endian.h>\n\n#ifndef htole32 \n#if __BYTE_ORDER == __LITTLE_ENDIAN\n#define htole16(x) (uint16_t)(x)\n#define le16toh(x) (uint16_t)(x)\n#define letoh16(x) (uint16_t)(x)\n#define htole32(x) (uint32_t)(x)\n#define le32toh(x) (uint32_t)(x)\n#define letoh32(x) (uint32_t)(x)\n#define htole64(x) (uint64_t)(x)\n#define le64toh(x) (uint64_t)(x)\n#define letoh64(x) (uint64_t)(x)\n#else\nstatic __inline uint16_t __bswap16(uint16_t __x) {\n    return (__x<<8) | (__x>>8);\n}\n\nstatic __inline uint32_t __bswap32(uint32_t __x) {\n    return (__x>>24) | (__x>>8&0xff00) | (__x<<8&0xff0000) | (__x<<24);\n}\n\nstatic __inline uint64_t __bswap64(uint64_t __x) {\n    return (__bswap32(__x)+0ULL<<32) | (__bswap32(__x>>32));\n}\n\n#define htole16(x) __bswap16(x)\n#define le16toh(x) __bswap16(x)\n#define letoh16(x) __bswap16(x)\n#define htole32(x) __bswap32(x)\n#define le32toh(x) __bswap32(x)\n#define letoh32(x) __bswap32(x)\n#define htole64(x) __bswap64(x)\n#define le64toh(x) __bswap64(x)\n#define letoh64(x) __bswap64(x)\n#endif\n#endif\n\n#define le16_to_cpu(x) le16toh((uint16_t)(x))\n#define le32_to_cpu(x) le32toh((uint32_t)(x))\n#define le64_to_cpu(x) le64toh((uint64_t)(x))\n#define cpu_to_le16(x) htole16((uint16_t)(x))\n#define cpu_to_le32(x) htole32((uint32_t)(x))\n#define cpu_to_le64(x) htole64((uint64_t)(x))\n\nstatic __inline uint32_t ql_swap32(uint32_t __x) {\n    return (__x>>24) | (__x>>8&0xff00) | (__x<<8&0xff0000) | (__x<<24);\n}\n#endif //__QUECTEL_ENDIAN_H__\n\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/qlist.h",
    "content": "/*\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\n\n    Quectel hereby grants customers of Quectel a license to use, modify,\n    distribute and publish the Software in binary form provided that\n    customers shall have no right to reverse engineer, reverse assemble,\n    decompile or reduce to source code form any portion of the Software. \n    Under no circumstances may customers modify, demonstrate, use, deliver \n    or disclose any portion of the Software in source code form.\n*/\n\n#ifndef __QUECTEL_LIST_H__\n#define __QUECTEL_LIST_H__\nstruct qlistnode\n{\n    struct qlistnode *next;\n    struct qlistnode *prev;\n};\n\n#define qnode_to_item(node, container, member) \\\n    (container *) (((char*) (node)) - offsetof(container, member))\n\n#define qlist_for_each(node, list) \\\n    for (node = (list)->next; node != (list); node = node->next)\n\n#define qlist_empty(list) ((list) == (list)->next)\n#define qlist_head(list) ((list)->next)\n#define qlist_tail(list) ((list)->prev)\n\nstatic void qlist_init(struct qlistnode *node)\n{\n    node->next = node;\n    node->prev = node;\n}\n\nstatic void qlist_add_tail(struct qlistnode *head, struct qlistnode *item)\n{\n    item->next = head;\n    item->prev = head->prev;\n    head->prev->next = item;\n    head->prev = item;\n}\n\nstatic void qlist_remove(struct qlistnode *item)\n{\n    item->next->prev = item->prev;\n    item->prev->next = item->next;\n}\n#endif"
  },
  {
    "path": "relevance/quectel_cm-5G/src/qmap_bridge_mode.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software. \r\n    Under no circumstances may customers modify, demonstrate, use, deliver \r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include \"QMIThread.h\"\r\n\r\nstatic size_t ql_fread(const char *filename, void *buf, size_t size) {\r\n    FILE *fp = fopen(filename , \"r\");\r\n    size_t n = 0;\r\n\r\n    memset(buf, 0x00, size);\r\n\r\n    if (fp) {\r\n        n = fread(buf, 1, size, fp);\r\n        if (n <= 0 || n == size) {\r\n            dbg_time(\"warnning: fail to fread(%s), fread=%zu, buf_size=%zu: (%s)\", filename, n, size, strerror(errno));\r\n        }\r\n        fclose(fp);\r\n    }\r\n\r\n    return n > 0 ? n : 0;\r\n}\r\n\r\nstatic size_t ql_fwrite(const char *filename, const void *buf, size_t size) {\r\n    FILE *fp = fopen(filename , \"w\");\r\n    size_t n = 0;\r\n\r\n    if (fp) {\r\n        n = fwrite(buf, 1, size, fp);\r\n        if (n != size) {\r\n            dbg_time(\"warnning: fail to fwrite(%s), fwrite=%zu, buf_size=%zu: (%s)\", filename, n, size, strerror(errno));\r\n        }\r\n        fclose(fp);\r\n    }\r\n\r\n    return n > 0 ? n : 0;\r\n}\r\n\r\nint ql_bridge_mode_detect(PROFILE_T *profile) {\r\n    const char *ifname = profile->qmapnet_adapter[0] ? profile->qmapnet_adapter : profile->usbnet_adapter;\r\n    const char *driver;\r\n    char bridge_mode[128];\r\n    char bridge_ipv4[128];\r\n    char ipv4[128];\r\n    char buf[64];\r\n    size_t n;\r\n    int in_bridge = 0;\r\n\r\n    driver = profile->driver_name;\r\n    snprintf(bridge_mode, sizeof(bridge_mode), \"/sys/class/net/%s/bridge_mode\", ifname);\r\n    snprintf(bridge_ipv4, sizeof(bridge_ipv4), \"/sys/class/net/%s/bridge_ipv4\", ifname);\r\n\r\n    if (access(bridge_ipv4, R_OK)) {\r\n        if (errno != ENOENT) {\r\n            dbg_time(\"fail to access %s, errno: %d (%s)\", bridge_mode, errno, strerror(errno));\r\n            return 0;\r\n        }\r\n\r\n        snprintf(bridge_mode, sizeof(bridge_mode), \"/sys/module/%s/parameters/bridge_mode\", driver);\r\n        snprintf(bridge_ipv4, sizeof(bridge_ipv4), \"/sys/module/%s/parameters/bridge_ipv4\", driver);\r\n\r\n        if (access(bridge_mode, R_OK)) {\r\n            if (errno != ENOENT) {\r\n                dbg_time(\"fail to access %s, errno: %d (%s)\", bridge_mode, errno, strerror(errno));\r\n            }\r\n            return 0;\r\n        }\r\n    }\r\n\r\n    n = ql_fread(bridge_mode, buf, sizeof(buf));\r\n    if (n > 0) {\r\n        in_bridge = (buf[0] != '0');\r\n    }\r\n    if (!in_bridge)\r\n        return 0;\r\n   \r\n    memset(ipv4, 0, sizeof(ipv4));\r\n\r\n    if (strstr(bridge_ipv4, \"/sys/class/net/\") || profile->qmap_mode == 0 || profile->qmap_mode == 1) {\r\n        snprintf(ipv4, sizeof(ipv4), \"0x%x\", profile->ipv4.Address);\r\n        dbg_time(\"echo '%s' > %s\", ipv4, bridge_ipv4);\r\n        ql_fwrite(bridge_ipv4, ipv4, strlen(ipv4));\r\n    }\r\n    else {\r\n        snprintf(ipv4, sizeof(ipv4), \"0x%x:%d\", profile->ipv4.Address, profile->muxid);\r\n        dbg_time(\"echo '%s' > %s\", ipv4, bridge_ipv4);\r\n        ql_fwrite(bridge_ipv4, ipv4, strlen(ipv4));\r\n    }\r\n\r\n    return in_bridge;\r\n}\r\n\r\nint ql_enable_qmi_wwan_rawip_mode(PROFILE_T *profile) {\r\n    char filename[256];\r\n    char buf[4];\r\n    size_t n;\r\n    FILE *fp;\r\n\r\n    if (!qmidev_is_qmiwwan(profile->qmichannel))\r\n        return 0;\r\n\r\n    snprintf(filename, sizeof(filename), \"/sys/class/net/%s/qmi/rawip\", profile->usbnet_adapter);\r\n    n = ql_fread(filename, buf, sizeof(buf));\r\n\r\n    if (n == 0)\r\n        return 0;\r\n\r\n    if (buf[0] == '1' || buf[0] == 'Y')\r\n        return 0;\r\n\r\n    fp = fopen(filename , \"w\");\r\n    if (fp == NULL) {\r\n        dbg_time(\"Fail to fopen(%s, \\\"w\\\"), errno: %d (%s)\", filename, errno, strerror(errno));\r\n        return 1;\r\n    }\r\n\r\n    buf[0] = 'Y';\r\n    n = fwrite(buf, 1, 1, fp);\r\n    if (n != 1) {\r\n        dbg_time(\"Fail to fwrite(%s), errno: %d (%s)\", filename, errno, strerror(errno));\r\n        fclose(fp);\r\n        return 1;\r\n    }\r\n    fclose(fp);\r\n\r\n    return 0;\r\n}\r\n\r\nint ql_driver_type_detect(PROFILE_T *profile) {\r\n    if (qmidev_is_gobinet(profile->qmichannel)) {\r\n        profile->qmi_ops = &gobi_qmidev_ops;\r\n    }\r\n    else {\r\n        profile->qmi_ops = &qmiwwan_qmidev_ops;\r\n    }\r\n    qmidev_send = profile->qmi_ops->send;\r\n\r\n    return 0;\r\n}\r\n\r\nstatic void ql_set_driver_bridge_mode(PROFILE_T *profile) {\r\n    char enable[16];\r\n    char filename[256];\r\n\r\n    if(profile->qmap_mode)\r\n        snprintf(filename, sizeof(filename), \"/sys/class/net/%s/bridge_mode\", profile->qmapnet_adapter);\r\n    else\r\n        snprintf(filename, sizeof(filename), \"/sys/class/net/%s/bridge_mode\", profile->usbnet_adapter);\r\n    snprintf(enable, sizeof(enable), \"%02d\\n\", profile->enable_bridge);\r\n    ql_fwrite(filename, enable, sizeof(enable));\r\n}\r\n\r\n#ifdef CONFIG_QRTR\r\nstatic int ql_create_or_detect_rmnet_data(PROFILE_T *profile) {\r\n    char tmp[128];\r\n    int muxid = 0,  qmap_version = 0;\r\n\r\n    if (access(\"/sys/module/rmnet_data\", F_OK) != 0 /* spf11.x */\r\n        && access(\"/sys/module/rmnet_core\", F_OK) != 0 /* spf12.x */) {\r\n        dbg_time(\"rmnet_data/rmnet_core driver is not support!\\n\");\r\n        return -ENOENT;\r\n    }\r\n\r\n    snprintf(tmp, sizeof(tmp), \"/sys/class/net/%s\", profile->qmapnet_adapter);\r\n    if (access(tmp, F_OK) && errno == ENOENT) {\r\n        uint32_t ul_agg_cnt = 0, ul_agg_size = 0;\r\n\r\n        if (profile->hardware_interface == HARDWARE_USB) {\r\n            ul_agg_cnt = 11;\r\n            ul_agg_size = 4096; //sdx modem may only support 4096\r\n        }\r\n        rtrmnet_ctl_new_vnd(profile->usbnet_adapter, profile->qmapnet_adapter,\r\n              profile->muxid, profile->qmap_version, ul_agg_cnt, ul_agg_size);\r\n    }\r\n\r\n    if (access(tmp, F_OK) && errno == ENOENT) {\r\n         dbg_time(\"Fail to detect %s\", profile->qmapnet_adapter);\r\n         return -1;\r\n    }\r\n\r\n    rtrmnet_ctl_get_vnd(profile->qmapnet_adapter, &muxid, &qmap_version);\r\n    if (qmap_version != profile->qmap_version || muxid != profile->muxid) {\r\n         dbg_time(\"wrong qmap_version: %d - %d, muxid: %d - %d\",\r\n              qmap_version, profile->qmap_version, muxid, profile->muxid);\r\n         return -1;\r\n    }\r\n\r\n    return 0;\r\n}\r\n#endif\r\n\r\nstatic int ql_qmi_qmap_mode_detect(PROFILE_T *profile) {\r\n    char buf[128];\r\n    int n;\r\n    struct {\r\n        char filename[255 * 2];\r\n        char linkname[255 * 2];\r\n    } *pl;\r\n\r\n    pl = (typeof(pl)) malloc(sizeof(*pl));\r\n\r\n    snprintf(pl->linkname, sizeof(pl->linkname), \"/sys/class/net/%s/device/driver\", profile->usbnet_adapter);\r\n    n = readlink(pl->linkname, pl->filename, sizeof(pl->filename));\r\n    pl->filename[n] = '\\0';\r\n    while (pl->filename[n] != '/')\r\n        n--;\r\n    strncpy(profile->driver_name, &pl->filename[n+1], sizeof(profile->driver_name) - 1);\r\n\r\n    ql_get_driver_rmnet_info(profile, &profile->rmnet_info);\r\n    if (profile->rmnet_info.size) {\r\n        profile->qmap_mode = profile->rmnet_info.qmap_mode;\r\n        if (profile->qmap_mode) {\r\n            int offset_id = (profile->muxid == 0)? profile->pdp - 1 : profile->muxid - 0x81;\r\n\r\n            if (profile->qmap_mode == 1)\r\n                offset_id = 0;\r\n            profile->muxid = profile->rmnet_info.mux_id[offset_id];\r\n            strncpy(profile->qmapnet_adapter, profile->rmnet_info.ifname[offset_id], sizeof(profile->qmapnet_adapter) - 1);\r\n            profile->qmap_size = profile->rmnet_info.rx_urb_size;\r\n            profile->qmap_version = profile->rmnet_info.qmap_version;\r\n        }\r\n\r\n#ifdef CONFIG_QRTR\r\n        if (!strcmp(profile->qmapnet_adapter, \"use_rmnet_data\")) {\r\n            snprintf(profile->qmapnet_adapter, sizeof(profile->qmapnet_adapter), \"%.16s_%d\",\r\n                            profile->usbnet_adapter, profile->pdp);\r\n             ql_create_or_detect_rmnet_data(profile);\r\n        }\r\n#endif\r\n\r\n        goto _out;\r\n    }\r\n\r\n    snprintf(pl->filename, sizeof(pl->filename), \"/sys/class/net/%s/qmap_mode\", profile->usbnet_adapter);\r\n    if (access(pl->filename, R_OK)) {\r\n        if (errno != ENOENT) {\r\n            dbg_time(\"fail to access %s, errno: %d (%s)\", pl->filename, errno, strerror(errno));\r\n            goto _out;\r\n        }\r\n        \r\n        snprintf(pl->filename, sizeof(pl->filename), \"/sys/module/%s/parameters/qmap_mode\", profile->driver_name);\r\n        if (access(pl->filename, R_OK)) {\r\n            if (errno != ENOENT) {\r\n                dbg_time(\"fail to access %s, errno: %d (%s)\", pl->filename, errno, strerror(errno));\r\n                goto _out;\r\n            }\r\n            \r\n            snprintf(pl->filename, sizeof(pl->filename), \"/sys/class/net/%s/device/driver/module/parameters/qmap_mode\", profile->usbnet_adapter);\r\n            if (access(pl->filename, R_OK)) {\r\n                if (errno != ENOENT) {\r\n                    dbg_time(\"fail to access %s, errno: %d (%s)\", pl->filename, errno, strerror(errno));\r\n                    goto _out;\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if (!access(pl->filename, R_OK)) {\r\n        n = ql_fread(pl->filename, buf, sizeof(buf));\r\n        if (n > 0) {\r\n            profile->qmap_mode = atoi(buf);\r\n            \r\n            if (profile->qmap_mode > 1) {\r\n                if(!profile->muxid)\r\n                     profile->muxid = profile->pdp + 0x80; //muxis is 0x8X for PDN-X\r\n                snprintf(profile->qmapnet_adapter, sizeof(profile->qmapnet_adapter),\r\n                    \"%.16s.%d\", profile->usbnet_adapter, profile->muxid - 0x80);\r\n           } if (profile->qmap_mode == 1) {\r\n                profile->muxid = 0x81;\r\n                strncpy(profile->qmapnet_adapter, profile->usbnet_adapter, sizeof(profile->qmapnet_adapter));\r\n           }\r\n        }\r\n    }\r\n    else if (qmidev_is_qmiwwan(profile->qmichannel)) {\r\n        snprintf(pl->filename, sizeof(pl->filename), \"/sys/class/net/qmimux%d\", profile->pdp - 1);\r\n        if (access(pl->filename, R_OK)) {\r\n            if (errno != ENOENT) {\r\n                dbg_time(\"fail to access %s, errno: %d (%s)\", pl->filename, errno, strerror(errno));\r\n            }\r\n            goto _out;\r\n        }\r\n\r\n        //upstream Kernel Style QMAP qmi_wwan.c\r\n        snprintf(pl->filename, sizeof(pl->filename), \"/sys/class/net/%s/qmi/add_mux\", profile->usbnet_adapter);\r\n        n = ql_fread(pl->filename, buf, sizeof(buf));\r\n        if (n >= 5) {\r\n            dbg_time(\"If use QMAP by /sys/class/net/%s/qmi/add_mux\", profile->usbnet_adapter);\r\n            #if 1\r\n            dbg_time(\"Please set mtu of wwan0 >= max dl qmap packet size\");\r\n            #else\r\n            dbg_time(\"File:%s Line:%d Please make sure add next patch to qmi_wwan.c\", __func__, __LINE__);\r\n            /*\r\n            diff --git a/drivers/net/usb/qmi_wwan.c b/drivers/net/usb/qmi_wwan.c\r\n            index 74bebbd..db8a777 100644\r\n            --- a/drivers/net/usb/qmi_wwan.c\r\n            +++ b/drivers/net/usb/qmi_wwan.c\r\n            @@ -379,6 +379,24 @@ static ssize_t add_mux_store(struct device *d,  struct device_attribute *attr, c\r\n                if (!ret) {\r\n                        info->flags |= QMI_WWAN_FLAG_MUX;\r\n                        ret = len;\r\n            +#if 1 //Add by Quectel\r\n            +               if (le16_to_cpu(dev->udev->descriptor.idVendor) == 0x2c7c) {\r\n            +                       int idProduct = le16_to_cpu(dev->udev->descriptor.idProduct);\r\n            +\r\n            +                       if (idProduct == 0x0121 || idProduct == 0x0125 || idProduct == 0x0435) //MDM9x07\r\n            +                               dev->rx_urb_size = 4*1024;\r\n            +                       else if (idProduct == 0x0306) //MDM9x40\r\n            +                               dev->rx_urb_size = 16*1024;\r\n            +                       else if (idProduct == 0x0512) //SDX20\r\n            +                               dev->rx_urb_size = 32*1024;\r\n            +                       else if (idProduct == 0x0620) //SDX24\r\n            +                               dev->rx_urb_size = 32*1024;\r\n            +                       else if (idProduct == 0x0800) //SDX55\r\n            +                               dev->rx_urb_size = 32*1024;\r\n            +                       else\r\n            +                               dev->rx_urb_size = 32*1024;\r\n            +               }\r\n            +#endif\r\n                }\r\n            err:\r\n                rtnl_unlock();\r\n            */\r\n            #endif\r\n            profile->qmap_mode = n/5; //0x11\\n0x22\\n0x33\\n\r\n            if (profile->qmap_mode > 1) {\r\n                //PDN-X map to qmimux-X\r\n                if(!profile->muxid) {\r\n                    profile->muxid = (buf[5*(profile->pdp - 1) + 2] - '0')*16 + (buf[5*(profile->pdp - 1) + 3] - '0');\r\n                    snprintf(profile->qmapnet_adapter, sizeof(profile->qmapnet_adapter), \"qmimux%d\", profile->pdp - 1);\r\n                } else {\r\n                    profile->muxid = (buf[5*(profile->muxid - 0x81) + 2] - '0')*16 + (buf[5*(profile->muxid - 0x81) + 3] - '0');\r\n                    snprintf(profile->qmapnet_adapter, sizeof(profile->qmapnet_adapter), \"qmimux%d\", profile->muxid - 0x81);\r\n                }\r\n            } else if (profile->qmap_mode == 1) {\r\n                profile->muxid = (buf[5*0 + 2] - '0')*16 + (buf[5*0 + 3] - '0');\r\n                snprintf(profile->qmapnet_adapter, sizeof(profile->qmapnet_adapter),\r\n                    \"qmimux%d\", 0);\r\n            }\r\n        }\r\n    } \r\n\r\n_out:\r\n    if (profile->qmap_mode) {\r\n      if (profile->qmap_size == 0) {\r\n            profile->qmap_size = 16*1024;\r\n            snprintf(pl->filename, sizeof(pl->filename), \"/sys/class/net/%s/qmap_size\", profile->usbnet_adapter);\r\n            if (!access(pl->filename, R_OK)) {\r\n                size_t n;\r\n                char buf[32];\r\n                n = ql_fread(pl->filename, buf, sizeof(buf));\r\n                if (n > 0) {\r\n                    profile->qmap_size = atoi(buf);\r\n                }\r\n            }\r\n        }\r\n\r\n        if (profile->qmap_version == 0) {\r\n            profile->qmap_version = WDA_DL_DATA_AGG_QMAP_ENABLED;\r\n        }\r\n\r\n        dbg_time(\"qmap_mode = %d, qmap_version = %d, qmap_size = %d, muxid = 0x%02x, qmap_netcard = %s\",\r\n            profile->qmap_mode, profile->qmap_version, profile->qmap_size, profile->muxid, profile->qmapnet_adapter);\r\n    }\r\n    ql_set_driver_bridge_mode(profile);\r\n    free(pl);\r\n\r\n    return 0;\r\n}\r\n\r\nstatic int ql_mbim_usb_vlan_mode_detect(PROFILE_T *profile) {\r\n    char tmp[128];\r\n\r\n    snprintf(tmp, sizeof(tmp), \"/sys/class/net/%s.%d\", profile->usbnet_adapter, profile->pdp);\r\n    if (!access(tmp, F_OK)) {\r\n        profile->qmap_mode = 4;\r\n        profile->muxid = profile->pdp;\r\n        no_trunc_strncpy(profile->qmapnet_adapter, tmp + strlen(\"/sys/class/net/\"), sizeof(profile->qmapnet_adapter) - 1);\r\n\r\n        dbg_time(\"mbim_qmap_mode = %d, vlan_id = 0x%02x, qmap_netcard = %s\",\r\n            profile->qmap_mode, profile->muxid, profile->qmapnet_adapter);\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nstatic int ql_mbim_mhi_qmap_mode_detect(PROFILE_T *profile) {\r\n    ql_get_driver_rmnet_info(profile, &profile->rmnet_info);\r\n    if (profile->rmnet_info.size) {\r\n        profile->qmap_mode = profile->rmnet_info.qmap_mode;\r\n        if (profile->qmap_mode) {\r\n            int offset_id = profile->pdp - 1;\r\n\r\n            if (profile->qmap_mode == 1)\r\n                offset_id = 0;\r\n            profile->muxid = profile->pdp;\r\n            strcpy(profile->qmapnet_adapter, profile->rmnet_info.ifname[offset_id]);\r\n            profile->qmap_size = profile->rmnet_info.rx_urb_size;\r\n            profile->qmap_version = profile->rmnet_info.qmap_version;\r\n        \r\n            dbg_time(\"mbim_qmap_mode = %d, vlan_id = 0x%02x, qmap_netcard = %s\",\r\n                profile->qmap_mode, profile->muxid, profile->qmapnet_adapter);\r\n        }\r\n\r\n        goto _out;\r\n    }\r\n    \r\n_out:\r\n    return 0;\r\n}\r\n\r\nint ql_qmap_mode_detect(PROFILE_T *profile) {\r\n    if (profile->software_interface == SOFTWARE_MBIM) {\r\n        if (profile->hardware_interface == HARDWARE_USB)\r\n            return ql_mbim_usb_vlan_mode_detect(profile);\r\n        else if (profile->hardware_interface == HARDWARE_PCIE)\r\n            return ql_mbim_mhi_qmap_mode_detect(profile);\r\n    } else if (profile->software_interface == SOFTWARE_QMI) {\r\n        return ql_qmi_qmap_mode_detect(profile);\r\n    }\r\n#ifdef CONFIG_QRTR\r\n    else if (profile->software_interface == SOFTWARE_QRTR) {\r\n            profile->qmap_mode = 1;\r\n            profile->qmap_version = WDA_DL_DATA_AGG_QMAP_V5_ENABLED;\r\n            profile->qmap_size = 15*1024;\r\n            profile->muxid = 0x80 | profile->pdp;\r\n\r\n            if (!strcmp(profile->driver_name, \"mhi_netdev\")) {\r\n                char linkname[64];\r\n                char filename[128];\r\n                int n;\r\n\r\n                snprintf(linkname, sizeof(linkname), \"/sys/class/net/%s/device\", profile->usbnet_adapter);\r\n                n = readlink(linkname, filename, sizeof(filename));\r\n                if (n > 0) {\r\n                    //../../../0308_00.01.00_IP_HW0\r\n                    filename[n] = '\\0';\r\n                    if (strstr(filename, \"_IP_HW0\") && strstr(filename+n, \"0303_\")) //EG18\r\n                        profile->qmap_version = WDA_DL_DATA_AGG_QMAP_ENABLED;\r\n                }\r\n        }\r\n\r\n        snprintf(profile->qmapnet_adapter, sizeof(profile->qmapnet_adapter), \"rmnet_data%d\",\r\n                        profile->pdp);\r\n        return ql_create_or_detect_rmnet_data(profile);\r\n    }\r\n#endif\r\n    return 0;\r\n}\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/qrtr.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software. \r\n    Under no circumstances may customers modify, demonstrate, use, deliver \r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include <stdio.h>\r\n#include <string.h>\r\n#include <termios.h>\r\n#include <stdio.h>\r\n#include <ctype.h>\r\n#include \"QMIThread.h\"\r\n\r\ntypedef struct {\r\n    uint32_t service;\r\n    uint32_t version;\r\n    uint32_t instance;\r\n    uint32_t node;\r\n    uint32_t port;\r\n} QrtrService;\r\n\r\n#define QRTR_MAX (QMUX_TYPE_WDS_ADMIN + 1)\r\nstatic QrtrService service_list[QRTR_MAX];\r\nstatic int qmiclientId[QRTR_MAX];\r\nstatic int get_client(UCHAR QMIType);\r\nstatic uint32_t node_modem = 3; //IPQ ~ 3, QCM ~ 0\r\n\r\n#ifdef USE_LINUX_MSM_IPC\r\n#include <linux/msm_ipc.h>\r\n\r\nstruct xport_ipc_router_server_addr {\r\n        uint32_t service;\r\n        uint32_t instance;\r\n        uint32_t node_id;\r\n        uint32_t port_id;\r\n};\r\n\r\nunion ctl_msg {\r\n        uint32_t cmd;\r\n                struct {\r\n                uint32_t cmd;\r\n                        uint32_t service;\r\n                        uint32_t instance;\r\n                uint32_t node_id;\r\n                uint32_t port_id;\r\n        } srv;\r\n                struct {\r\n                uint32_t cmd;\r\n                uint32_t node_id;\r\n                uint32_t port_id;\r\n        } cli;\r\n        };\r\n#define CTL_CMD_NEW_SERVER          4\r\n#define CTL_CMD_REMOVE_SERVER       5\r\n\r\n#define VERSION_MASK 0xff\r\n#define GET_VERSION(x) (x & 0xff)\r\n#define GET_XPORT_SVC_INSTANCE(x) GET_VERSION(x)\r\n#define GET_INSTANCE(x) ((x & 0xff00) >> 8)\r\n\r\nstatic int msm_ipc_socket(const char *name)\r\n{\r\n    int sock;\r\n    int flags;\r\n\r\n    sock = socket(AF_MSM_IPC, SOCK_DGRAM, 0);\r\n    if (sock < 0) {\r\n        dbg_time(\"%s(%s) errno: %d (%s)\\n\", __func__, name, errno, strerror(errno));\r\n        return -1;\r\n    }\r\n\r\n    fcntl(sock, F_SETFD, FD_CLOEXEC);\r\n    flags = fcntl(sock, F_GETFL, 0);\r\n    fcntl(sock, F_SETFL, flags | O_NONBLOCK);\r\n\r\n    return sock;\r\n}\r\n\r\nstatic uint32_t xport_lookup\r\n(\r\n int lookup_sock_fd,\r\n uint32_t service_id,\r\n uint32_t version\r\n)\r\n{\r\n  uint32_t num_servers_found = 0;\r\n  uint32_t num_entries_to_fill = 4;\r\n  struct server_lookup_args *lookup_arg;\r\n  int i;\r\n\r\n  lookup_arg = (struct server_lookup_args *)malloc(sizeof(*lookup_arg)\r\n      + (num_entries_to_fill * sizeof(struct msm_ipc_server_info)));\r\n  if (!lookup_arg)\r\n  {\r\n    dbg_time(\"%s: Malloc failed\\n\", __func__);\r\n    return 0;\r\n  }\r\n\r\n  lookup_arg->port_name.service = service_id;\r\n  lookup_arg->port_name.instance = GET_XPORT_SVC_INSTANCE(version);\r\n  lookup_arg->num_entries_in_array = num_entries_to_fill;\r\n  lookup_arg->lookup_mask =  VERSION_MASK;\r\n  lookup_arg->num_entries_found = 0;\r\n  if (ioctl(lookup_sock_fd, IPC_ROUTER_IOCTL_LOOKUP_SERVER, lookup_arg) < 0)\r\n  {\r\n    dbg_time(\"%s: Lookup failed for %08x: %08x\\n\", __func__, service_id, version);\r\n    free(lookup_arg);\r\n    return 0;\r\n  }\r\n\r\n  dbg_time(\"%s: num_entries_found %d for type=%d instance=%d\", __func__,\r\n    lookup_arg->num_entries_found, service_id, version);\r\n  num_servers_found = 0;\r\n  for (i = 0; ((i < (int)num_entries_to_fill) && (i < lookup_arg->num_entries_found)); i++)\r\n  {\r\n     QrtrService service_info[1];\r\n\r\n    if (lookup_arg->srv_info[i].node_id != node_modem)\r\n        continue;\r\n    num_servers_found++;\r\n\r\n    service_info[0].service = lookup_arg->srv_info[i].service;\r\n    service_info[0].version = GET_VERSION(lookup_arg->srv_info[i].instance);\r\n    service_info[0].instance = GET_INSTANCE(lookup_arg->srv_info[i].instance);\r\n    service_info[0].node = lookup_arg->srv_info[i].node_id;\r\n    service_info[0].port = lookup_arg->srv_info[i].port_id;\r\n\r\n    service_list[service_id] = service_info[0];\r\n    qmiclientId[service_id] = get_client(service_id);\r\n  }\r\n\r\n  free(lookup_arg);\r\n  return num_servers_found;\r\n}\r\n\r\nstatic int xport_send(int sock, uint32_t node, uint32_t port, const void *data, unsigned int sz)\r\n{\r\n    struct sockaddr_msm_ipc addr = {};\r\n    int rc;\r\n\r\n    addr.family = AF_MSM_IPC;\r\n    addr.address.addrtype = MSM_IPC_ADDR_ID;\r\n    addr.address.addr.port_addr.node_id = node;\r\n    addr.address.addr.port_addr.port_id = port;\r\n\r\n    rc = sendto(sock, data, sz, MSG_DONTWAIT, (void *)&addr, sizeof(addr));\r\n    if (rc < 0) {\r\n        dbg_time(\"xport_send errno: %d (%s)\\n\", errno, strerror(errno));\r\n        return -1;\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nstatic int xport_recv(int sock, void *data, unsigned int sz, uint32_t *node, uint32_t *port)\r\n{\r\n    struct sockaddr_msm_ipc addr = {};\r\n    socklen_t addr_size = sizeof(struct sockaddr_msm_ipc);\r\n    int rc;\r\n\r\n    rc = recvfrom(sock, data, sz, MSG_DONTWAIT, (void *)&addr, &addr_size);\r\n    if (rc < 0) {\r\n        dbg_time(\"xport_recv errno: %d (%s)\\n\", errno, strerror(errno));\r\n    }\r\n    else if (addr.address.addrtype != MSM_IPC_ADDR_ID) {\r\n        dbg_time(\"xport_recv addrtype is NOT MSM_IPC_ADDR_ID\\n\");\r\n        rc = -1;\r\n    }\r\n\r\n    *node = addr.address.addr.port_addr.node_id;\r\n    *port = addr.address.addr.port_addr.port_id;\r\n    return rc;\r\n}\r\n#define qmi_recv xport_recv\r\n\r\nstatic int xport_ctrl_init(void)\r\n{\r\n    int ctrl_sock;\r\n    int rc;\r\n    uint32_t instance = 1; //modem\r\n    uint32_t version;\r\n\r\n    ctrl_sock = msm_ipc_socket(\"ctrl_port\");\r\n    if (ctrl_sock == -1)\r\n        return -1;\r\n\r\n    rc = ioctl(ctrl_sock, IPC_ROUTER_IOCTL_GET_VERSION, &version);\r\n    if (rc < 0) {\r\n        dbg_time(\"%s: failed to get ipc version\\n\", __func__);\r\n        goto init_close_ctrl_fd;\r\n    }\r\n    dbg_time(\"%s ipc_version = %d\", __func__, version);\r\n\r\n    rc = ioctl(ctrl_sock, IPC_ROUTER_IOCTL_BIND_CONTROL_PORT, NULL);\r\n    if (rc < 0) {\r\n        dbg_time(\"%s: failed to bind as control port\\n\", __func__);\r\n        goto init_close_ctrl_fd;\r\n    }\r\n\r\n    //cat /sys/kernel/debug/msm_ipc_router/dump_servers\r\n    rc = 0;\r\n    rc += xport_lookup(ctrl_sock, QMUX_TYPE_WDS, instance);\r\n    if (service_list[QMUX_TYPE_WDS].port) {\r\n        qmiclientId[QMUX_TYPE_WDS_IPV6] = get_client(QMUX_TYPE_WDS);\r\n    }\r\n    rc += xport_lookup(ctrl_sock, QMUX_TYPE_NAS, instance);\r\n    rc += xport_lookup(ctrl_sock, QMUX_TYPE_UIM, instance);\r\n    rc += xport_lookup(ctrl_sock, QMUX_TYPE_DMS, instance);\r\n    rc += xport_lookup(ctrl_sock, QMUX_TYPE_WDS_ADMIN, instance);\r\n\r\n    if (rc == 0) {\r\n        dbg_time(\"%s: failed to lookup qmi service\\n\", __func__);\r\n        goto init_close_ctrl_fd;\r\n    }\r\n\r\n    return ctrl_sock;\r\n\r\ninit_close_ctrl_fd:\r\n    close(ctrl_sock);\r\n    return -1;\r\n}\r\n\r\nstatic void handle_ctrl_pkt(int sock) {\r\n    union ctl_msg pkt;\r\n    uint32_t type;\r\n    int rc;\r\n\r\n    rc = recvfrom(sock, &pkt, sizeof(pkt), 0, NULL, NULL);\r\n    if (rc < 0)\r\n        return;\r\n\r\n    type = le32toh(pkt.cmd);\r\n    if (CTL_CMD_NEW_SERVER == type || CTL_CMD_REMOVE_SERVER == type) {\r\n        QrtrService s;\r\n\r\n        s.service = le32toh(pkt.srv.service);\r\n        s.version = le32toh(pkt.srv.instance) & 0xff;\r\n        s.instance = le32toh(pkt.srv.instance) >> 8;\r\n        s.node = le32toh(pkt.srv.node_id);\r\n        s.port = le32toh(pkt.srv.port_id);\r\n\r\n        if (debug_qmi)\r\n            dbg_time (\"[qrtr] %s  server on %u:%u -> service %u, version %u, instance %u\",\r\n                    CTL_CMD_NEW_SERVER == type ? \"add\" : \"remove\",\r\n                     s.node, s.port, s.service, s.version, s.instance);\r\n\r\n        if (CTL_CMD_NEW_SERVER == type) {\r\n            if (s.service < QRTR_MAX) {\r\n                service_list[s.service] = s;\r\n            }\r\n        }\r\n        else if (CTL_CMD_REMOVE_SERVER == type) {\r\n            if (s.service < QRTR_MAX) {\r\n                memset(&service_list[s.service], 0, sizeof(QrtrService));\r\n            }\r\n        }\r\n    }\r\n}\r\n#else\r\n#include <linux/socket.h>\r\n#include <linux/qrtr.h>\r\n#endif\r\n\r\nstatic int qrtr_socket(void)\r\n{\r\n    struct sockaddr_qrtr sq;\r\n    socklen_t sl = sizeof(sq);\r\n    int sock;\r\n    int rc;\r\n\r\n    sock = socket(AF_QIPCRTR, SOCK_DGRAM, 0);\r\n    if (sock < 0) {\r\n        dbg_time(\"qrtr_socket errno: %d (%s)\\n\", errno, strerror(errno));\r\n        return -1;\r\n    }\r\n\r\n    rc = getsockname(sock, (void *)&sq, &sl);\r\n    if (rc || sq.sq_family != AF_QIPCRTR || sl != sizeof(sq)) {\r\n        dbg_time(\"getsockname: %d (%s)\\n\", errno, strerror(errno));\r\n        close(sock);\r\n        return -1;\r\n    }\r\n\r\n    return sock;\r\n}\r\n\r\nstatic int qrtr_send(int sock, uint32_t node, uint32_t port, const void *data, unsigned int sz)\r\n{\r\n    struct sockaddr_qrtr sq;\r\n    int rc;\r\n\r\n    sq.sq_family = AF_QIPCRTR;\r\n    sq.sq_node = node;\r\n    sq.sq_port = port;\r\n\r\n    rc = sendto(sock, data, sz, MSG_DONTWAIT, (void *)&sq, sizeof(sq));\r\n    if (rc < 0) {\r\n        dbg_time(\"sendto errno: %d (%s)\\n\", errno, strerror(errno));\r\n        return -1;\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nstatic int qrtr_recv(int sock, void *data, unsigned int sz, uint32_t *node, uint32_t *port)\r\n{\r\n    struct sockaddr_qrtr sq;\r\n    socklen_t sl = sizeof(sq);\r\n    int rc;\r\n\r\n    rc = recvfrom(sock, data, sz, MSG_DONTWAIT, (void *)&sq, &sl);\r\n    if (rc < 0) {\r\n        dbg_time(\"qrtr_recv errno: %d (%s)\\n\", errno, strerror(errno));\r\n    }\r\n\r\n    *node  = sq.sq_node;\r\n    *port  = sq.sq_port;\r\n    return rc;\r\n    }\r\n#define qmi_recv qrtr_recv\r\n\r\nstatic int qrtr_ctrl_init(void) {\r\n    int sock;\r\n    int rc;\r\n    struct qrtr_ctrl_pkt pkt;\r\n    struct sockaddr_qrtr sq;\r\n    socklen_t sl = sizeof(sq);\r\n\r\n    sock = qrtr_socket();\r\n    if (sock == -1)\r\n        return -1;\r\n\r\n    memset(&pkt, 0, sizeof(pkt));\r\n    pkt.cmd = htole32(QRTR_TYPE_NEW_LOOKUP);\r\n\r\n    getsockname(sock, (void *)&sq, &sl);\r\n    rc = qrtr_send(sock, sq.sq_node, QRTR_PORT_CTRL, &pkt, sizeof(pkt));\r\n    if (rc == -1) {\r\n        dbg_time(\"qrtr_send errno: %d (%s)\\n\", errno, strerror(errno));\r\n        close(sock);\r\n        return -1;\r\n    }\r\n\r\n    return sock;\r\n}\r\n\r\nstatic void handle_server_change(uint32_t type, struct qrtr_ctrl_pkt *ppkt) {\r\n    struct qrtr_ctrl_pkt pkt = *ppkt;\r\n        QrtrService s;\r\n\r\n        s.service = le32toh(pkt.server.service);\r\n        s.version = le32toh(pkt.server.instance) & 0xff;\r\n        s.instance = le32toh(pkt.server.instance) >> 8;\r\n        s.node = le32toh(pkt.server.node);\r\n        s.port = le32toh(pkt.server.port);\r\n\r\n        if (debug_qmi)\r\n            dbg_time (\"[qrtr] %s  server on %u:%u -> service %u, version %u, instance %u\",\r\n                    QRTR_TYPE_NEW_SERVER == type ? \"add\" : \"remove\",\r\n                     s.node, s.port, s.service, s.version, s.instance);\r\n\r\n        if (s.node != node_modem)\r\n            return; //we only care modem\r\n\r\n        if (QRTR_TYPE_NEW_SERVER == type) {\r\n            if (s.service < QRTR_MAX) {\r\n                service_list[s.service] = s;\r\n            }\r\n        }\r\n        else if (QRTR_TYPE_DEL_SERVER == type) {\r\n            if (s.service < QRTR_MAX) {\r\n                memset(&service_list[s.service], 0, sizeof(QrtrService));\r\n            }\r\n        }\r\n    }\r\n\r\nstatic void handle_ctrl_pkt(int sock) {\r\n    struct qrtr_ctrl_pkt pkt;\r\n    struct sockaddr_qrtr sq;\r\n    socklen_t sl = sizeof(sq);\r\n    uint32_t type;\r\n    int rc;\r\n\r\n    rc = recvfrom(sock, &pkt, sizeof(pkt), 0, (void *)&sq, &sl);\r\n    if (rc < 0)\r\n        return;\r\n\r\n    type = le32toh(pkt.cmd);\r\n    if (debug_qmi)\r\n        dbg_time(\"type %u, node %u, sq.port %x, len: %d\", type, sq.sq_node, sq.sq_port, rc);\r\n\r\n    if (sq.sq_port != QRTR_PORT_CTRL)\r\n        return;\r\n\r\n    if (QRTR_TYPE_NEW_SERVER == type || QRTR_TYPE_DEL_SERVER == type) {\r\n        handle_server_change(type, &pkt);\r\n    }\r\n}\r\n\r\nstatic int get_client(UCHAR QMIType) {\r\n    int ClientId;\r\n    QrtrService *s = &service_list[QMIType];\r\n\r\n    if (!s ->service) {\r\n        dbg_time(\"%s service: %d for QMIType: %d\", __func__, s ->service, QMIType);\r\n        return -ENODEV;\r\n    }\r\n\r\n#ifdef USE_LINUX_MSM_IPC\r\n    ClientId = msm_ipc_socket(\"xport\");\r\n#else\r\n    ClientId = qrtr_socket();\r\n#endif\r\n    if (ClientId == -1) {\r\n        return 0;\r\n    }\r\n\r\n    switch (QMIType) {\r\n        case QMUX_TYPE_WDS: dbg_time(\"Get clientWDS = %d\", ClientId); break;\r\n        case QMUX_TYPE_DMS: dbg_time(\"Get clientDMS = %d\", ClientId); break;\r\n        case QMUX_TYPE_NAS: dbg_time(\"Get clientNAS = %d\", ClientId); break;\r\n        case QMUX_TYPE_QOS: dbg_time(\"Get clientQOS = %d\", ClientId); break;\r\n        case QMUX_TYPE_WMS: dbg_time(\"Get clientWMS = %d\", ClientId); break;\r\n        case QMUX_TYPE_PDS: dbg_time(\"Get clientPDS = %d\", ClientId); break;\r\n        case QMUX_TYPE_UIM: dbg_time(\"Get clientUIM = %d\", ClientId); break;\r\n        case QMUX_TYPE_WDS_ADMIN: dbg_time(\"Get clientWDA = %d\", ClientId);\r\n        break;\r\n        default: break;\r\n    }\r\n\r\n    return ClientId;\r\n}\r\n\r\nstatic void handle_alloc_client(PROFILE_T *profile) {\r\n    int srv_list[] = {QMUX_TYPE_WDS, QMUX_TYPE_NAS, QMUX_TYPE_UIM, QMUX_TYPE_DMS, QMUX_TYPE_WDS_ADMIN};\r\n    size_t i = 0, srv_ready = 0;\r\n    static int report = -1;\r\n\r\n    if (report != -1)\r\n        return;\r\n\r\n    for(i = 0; i < sizeof(srv_list)/sizeof(srv_list[0]); i++) {\r\n        int srv = srv_list[i];\r\n\r\n        if (service_list[srv].service)\r\n            srv_ready++;\r\n        else\r\n            continue;\r\n\r\n        if (qmiclientId[srv] == 0) {\r\n            qmiclientId[srv] = get_client(srv);\r\n\r\n            if (qmiclientId[srv] != 0) {\r\n                if (srv == QMUX_TYPE_WDS) {\r\n                    qmiclientId[QMUX_TYPE_WDS_IPV6] = get_client(QMUX_TYPE_WDS);\r\n                }\r\n                else if (srv == QMUX_TYPE_WDS_ADMIN) {\r\n                     profile->wda_client = qmiclientId[QMUX_TYPE_WDS_ADMIN];\r\n                }\r\n            }\r\n        }\r\n    }\r\n\r\n    if (srv_ready == sizeof(srv_list)/sizeof(srv_list[0])) {\r\n        if (qmiclientId[QMUX_TYPE_WDS]) {\r\n            qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_CONNECTED);\r\n        } else {\r\n            qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_DISCONNECTED);\r\n        }\r\n        report = 1;\r\n    }\r\n}\r\n\r\nstatic int qmi_send(PQCQMIMSG pRequest) {\r\n    uint8_t QMIType = pRequest->QMIHdr.QMIType;\r\n    int sock;\r\n    QrtrService *s = &service_list[QMIType == QMUX_TYPE_WDS_IPV6 ? QMUX_TYPE_WDS: QMIType];\r\n    sock = qmiclientId[QMIType];\r\n\r\n    pRequest->QMIHdr.ClientId = 0xaa;\r\n    if (!s ->service || !sock) {\r\n        dbg_time(\"%s service: %d, sock: %d for QMIType: %d\", __func__, s ->service, sock, QMIType);\r\n        return -ENODEV;\r\n    }\r\n\r\n#ifdef USE_LINUX_MSM_IPC\r\n    return xport_send(sock, s->node, s->port, &pRequest->MUXMsg,\r\n            le16_to_cpu(pRequest->QMIHdr.Length) + 1 - sizeof(QCQMI_HDR));\r\n#else\r\n    return qrtr_send(sock, s->node, s->port, &pRequest->MUXMsg,\r\n            le16_to_cpu(pRequest->QMIHdr.Length) + 1 - sizeof(QCQMI_HDR));\r\n#endif\r\n}\r\n\r\nstatic int qmi_deinit(void) {\r\n    unsigned int i;\r\n\r\n    for (i = 0; i < sizeof(qmiclientId)/sizeof(qmiclientId[0]); i++)\r\n    {\r\n        if (qmiclientId[i] != 0)\r\n        {\r\n            close(qmiclientId[i]);\r\n            qmiclientId[i] = 0;\r\n        }\r\n    }\r\n\r\n    return 0;\r\n}\r\n\r\nstatic void * qmi_read(void *pData) {\r\n    PROFILE_T *profile = (PROFILE_T *)pData;\r\n    int ctrl_sock;\r\n    int wait_for_request_quit = 0;   \r\n\r\n#ifdef USE_LINUX_MSM_IPC\r\n    ctrl_sock = xport_ctrl_init();\r\n    if (ctrl_sock != -1)\r\n        qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_CONNECTED);\r\n#else\r\n    ctrl_sock = qrtr_ctrl_init();\r\n#endif\r\n\r\n    if (ctrl_sock == -1)\r\n        goto _quit;\r\n\r\n    while (1) {\r\n        struct pollfd pollfds[16] = {{qmidevice_control_fd[1], POLLIN, 0}, {ctrl_sock, POLLIN, 0}};\r\n        int ne, ret, nevents = 2;\r\n        unsigned int i;\r\n\r\n        for (i = 0; i < sizeof(qmiclientId)/sizeof(qmiclientId[0]); i++)\r\n        {\r\n            if (qmiclientId[i] != 0)\r\n            {\r\n                pollfds[nevents].fd = qmiclientId[i];\r\n                pollfds[nevents].events = POLLIN;\r\n                pollfds[nevents].revents = 0;\r\n                nevents++;\r\n            }\r\n        }\r\n\r\n        do {\r\n            ret = poll(pollfds, nevents, wait_for_request_quit ? 1000 : -1);\r\n         } while ((ret < 0) && (errno == EINTR));\r\n\r\n\tif (ret == 0 && wait_for_request_quit) {\r\n            QmiThreadRecvQMI(NULL); //main thread may pending on QmiThreadSendQMI()\r\n            continue;\r\n\t}\r\n\r\n        if (ret <= 0) {\r\n            dbg_time(\"%s poll=%d, errno: %d (%s)\", __func__, ret, errno, strerror(errno));\r\n            break;\r\n        }\r\n\r\n        for (ne = 0; ne < nevents; ne++) {\r\n            int fd = pollfds[ne].fd;\r\n            short revents = pollfds[ne].revents;\r\n\r\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\r\n                dbg_time(\"%s poll err/hup/inval\", __func__);\r\n                dbg_time(\"epoll fd = %d, events = 0x%04x\", fd, revents);\r\n                if (fd == qmidevice_control_fd[1]) {\r\n                } else {\r\n                }\r\n                if (revents & (POLLERR | POLLHUP | POLLNVAL))\r\n                    goto _quit;\r\n            }\r\n\r\n            if ((revents & POLLIN) == 0)\r\n                continue;\r\n\r\n            if (fd == qmidevice_control_fd[1]) {\r\n                int triger_event;\r\n                if (read(fd, &triger_event, sizeof(triger_event)) == sizeof(triger_event)) {\r\n                    //DBG(\"triger_event = 0x%x\", triger_event);\r\n                    switch (triger_event) {\r\n                        case RIL_REQUEST_QUIT:\r\n                            goto _quit;\r\n                        break;\r\n                        case SIG_EVENT_STOP:\r\n                            wait_for_request_quit = 1;   \r\n                        break;\r\n                        default:\r\n                        break;\r\n                    }\r\n                }\r\n            }\r\n            else  if (fd == ctrl_sock) {\r\n                handle_ctrl_pkt(ctrl_sock);\r\n                handle_alloc_client(profile);\r\n            }\r\n            else\r\n            {\r\n                PQCQMIMSG pResponse = (PQCQMIMSG)cm_recv_buf;\r\n                int rc;\r\n                uint32_t sq_node = 0;\r\n                uint32_t sq_port = 0;\r\n\r\n                rc = qmi_recv(fd, &pResponse->MUXMsg, sizeof(cm_recv_buf) - sizeof(QCQMI_HDR), &sq_node, &sq_port);\r\n                if (debug_qmi)\r\n                    dbg_time(\"fd %d, node %u, port %x, len: %d\", fd, sq_node, sq_port, rc);\r\n\r\n                if (rc <= 0)\r\n                {\r\n                    dbg_time(\"%s read=%d errno: %d (%s)\",  __func__, rc, errno, strerror(errno));\r\n                    break;\r\n                }\r\n\r\n                for (i = 0; i < sizeof(qmiclientId)/sizeof(qmiclientId[0]); i++)\r\n                {\r\n                    if (qmiclientId[i] == fd)\r\n                    {\r\n                        pResponse->QMIHdr.QMIType = i;\r\n\r\n                        if (service_list[i].node != sq_node || service_list[i].port != sq_port) {\r\n                            continue;\r\n                        }\r\n                    }\r\n                }\r\n\r\n                pResponse->QMIHdr.IFType = USB_CTL_MSG_TYPE_QMI;\r\n                pResponse->QMIHdr.Length = cpu_to_le16(rc + sizeof(QCQMI_HDR)  - 1);\r\n                pResponse->QMIHdr.CtlFlags = 0x00;\r\n                pResponse->QMIHdr.ClientId = 0xaa;\r\n\r\n                QmiThreadRecvQMI(pResponse);\r\n            }\r\n        }\r\n    }\r\n\r\n_quit:\r\n    qmi_deinit();\r\n    close(ctrl_sock);\r\n    qmidevice_send_event_to_main(RIL_INDICATE_DEVICE_DISCONNECTED);\r\n    QmiThreadRecvQMI(NULL); //main thread may pending on QmiThreadSendQMI()\r\n    dbg_time(\"%s exit\", __func__);\r\n    pthread_exit(NULL);\r\n    return NULL;\r\n}\r\n\r\nconst struct qmi_device_ops qrtr_qmidev_ops = {\r\n\t.deinit = qmi_deinit,\r\n\t.send = qmi_send,\r\n\t.read = qmi_read,\r\n};\r\n\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/qrtr.h",
    "content": "/*\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\n\n    Quectel hereby grants customers of Quectel a license to use, modify,\n    distribute and publish the Software in binary form provided that\n    customers shall have no right to reverse engineer, reverse assemble,\n    decompile or reduce to source code form any portion of the Software. \n    Under no circumstances may customers modify, demonstrate, use, deliver \n    or disclose any portion of the Software in source code form.\n*/\n\n/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */\n#ifndef _LINUX_QRTR_H\n#define _LINUX_QRTR_H\n\n#include <linux/socket.h>\n#include <linux/types.h>\n\n#ifndef AF_QIPCRTR\n#define AF_QIPCRTR 42\n#endif\n\n#define QRTR_NODE_BCAST\t0xffffffffu\n#define QRTR_PORT_CTRL\t0xfffffffeu\n\nstruct sockaddr_qrtr {\n\t__kernel_sa_family_t sq_family;\n\t__u32 sq_node;\n\t__u32 sq_port;\n};\n\nenum qrtr_pkt_type {\n\tQRTR_TYPE_DATA\t\t= 1,\n\tQRTR_TYPE_HELLO\t\t= 2,\n\tQRTR_TYPE_BYE\t\t= 3,\n\tQRTR_TYPE_NEW_SERVER\t= 4,\n\tQRTR_TYPE_DEL_SERVER\t= 5,\n\tQRTR_TYPE_DEL_CLIENT\t= 6,\n\tQRTR_TYPE_RESUME_TX\t= 7,\n\tQRTR_TYPE_EXIT          = 8,\n\tQRTR_TYPE_PING          = 9,\n\tQRTR_TYPE_NEW_LOOKUP\t= 10,\n\tQRTR_TYPE_DEL_LOOKUP\t= 11,\n};\n\n#define QRTR_TYPE_DEL_PROC 13\n\nstruct qrtr_ctrl_pkt {\n\t__le32 cmd;\n\n\tunion {\n\t\tstruct {\n\t\t\t__le32 service;\n\t\t\t__le32 instance;\n\t\t\t__le32 node;\n\t\t\t__le32 port;\n\t\t} server;\n\n\t\tstruct {\n\t\t\t__le32 node;\n\t\t\t__le32 port;\n\t\t} client;\n\n\t\tstruct {\n\t\t\t__le32 rsvd;\n\t\t\t__le32 node;\n\t\t} proc;\n\n\t};\n} __attribute__ ((packed));\n\n#define QRTR_PROTO_VER_1 1\n\nstruct qrtr_hdr_v1 {\n\t__le32 version;\n\t__le32 type;\n\t__le32 src_node_id;\n\t__le32 src_port_id;\n\t__le32 confirm_rx;\n\t__le32 size;\n\t__le32 dst_node_id;\n\t__le32 dst_port_id;\n} __attribute__ ((packed));\n\n#endif /* _LINUX_QRTR_H */\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/quectel-atc-proxy.c",
    "content": "/*\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\n\n    Quectel hereby grants customers of Quectel a license to use, modify,\n    distribute and publish the Software in binary form provided that\n    customers shall have no right to reverse engineer, reverse assemble,\n    decompile or reduce to source code form any portion of the Software. \n    Under no circumstances may customers modify, demonstrate, use, deliver \n    or disclose any portion of the Software in source code form.\n*/\n\n#include <unistd.h>\n#include <stdio.h>\n#include <stdlib.h>\n#include <string.h>\n#include <ctype.h>\n#include <fcntl.h>\n#include <stddef.h>\n#include <pthread.h>\n#include <errno.h>\n#include <time.h>\n#include <signal.h>\n#include <getopt.h>\n#include <poll.h>\n#include <sys/time.h>\n#include <endian.h>\n#include <time.h>\n#include <sys/types.h>\n#include <limits.h>\n#include <inttypes.h>\n#include <sys/socket.h>\n#include <unistd.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <fcntl.h>\n#include <pthread.h>\n#include <poll.h>\n#include <sys/socket.h>\n#include <sys/time.h>\n#include <sys/ioctl.h>\n#include <linux/un.h>\n#include <linux/if.h>\n#include <dirent.h>\n#include <signal.h>\n#include <endian.h>\n#include <inttypes.h>\n\n#include \"qlist.h\"\n#include \"QMIThread.h\"\n#include \"atchannel.h\"\n#include \"at_tok.h\"\n\n#define dprintf(fmt, args...) do { fprintf(stdout, \"%s \" fmt, get_time(), ##args); } while(0);\n#define SYSCHECK(c) do{if((c)<0) {dprintf(\"%s %d error: '%s' (code: %d)\\n\", __func__, __LINE__, strerror(errno), errno); return -1;}}while(0)\n#define cfmakenoblock(fd) do{fcntl(fd, F_SETFL, fcntl(fd,F_GETFL) | O_NONBLOCK);}while(0)\n\n#define safe_free(__x) do { if (__x) { free((void *)__x); __x = NULL;}} while(0)\n#define safe_at_response_free(__x) { if (__x) { at_response_free(__x); __x = NULL;}}\n\n#define at_response_error(err, p_response) \\\n    (err \\\n    || p_response == NULL \\\n    || p_response->finalResponse == NULL \\\n    || p_response->success == 0)\n\ntypedef struct {\n    struct qlistnode qnode;\n    int ClientFd;\n    unsigned AccessTime;\n} ATC_PROXY_CONNECTION;\n\nstatic int atc_proxy_quit = 0;\nstatic pthread_t thread_id = 0;\nstatic int atc_dev_fd = -1;\nstatic int atc_proxy_server_fd = -1;\nstatic struct qlistnode atc_proxy_connection;\nstatic int verbose_debug = 0;\nstatic int modem_reset_flag = 0;\nstatic uint8_t atc_buf[4096];\nstatic int asr_style_atc =  0;\nextern int asprintf(char **s, const char *fmt, ...);\nstatic ATC_PROXY_CONNECTION *current_client_fd = NULL;\n\nstatic void dump_atc(uint8_t *pATC, int fd,int size, const char flag)\n{\n    if (verbose_debug) {\n        printf(\"%c %d:\\n\", flag, fd);\n        printf(\"%.*s\\n\", size, pATC);\n    }\n}\n\nstatic int send_atc_to_client(int clientFd, uint8_t *pATC, int size) {\n    struct pollfd pollfds[]= {{clientFd, POLLOUT, 0}};\n    ssize_t ret = 0;\n\n    do {\n        ret = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), 5000);\n    } while (ret == -1 && errno == EINTR && atc_proxy_quit == 0);\n\n    if (pollfds[0].revents & POLLOUT) {\n        ret = write(clientFd, pATC, size);\n    }\n\n    return ret;\n}\n\nstatic void onUnsolicited (const char *s, const char *sms_pdu)\n{\n    struct qlistnode *con_node;\n    int ret;\n    char buf[1024];\n\n    if(s) {\n        strcpy(buf, s);\n        strcat(buf, \"\\r\\n\");\n    }\n    if(sms_pdu) {\n        strcat(buf, sms_pdu);\n        strcat(buf, \"\\r\\n\");\n    }\n\n    if(current_client_fd) {\n        ATC_PROXY_CONNECTION *atc_con = current_client_fd;\n        ret = send_atc_to_client(atc_con->ClientFd, (uint8_t *)buf, strlen(buf));\n        if(ret < 0) {\n            close(atc_con->ClientFd);\n            qlist_remove(&atc_con->qnode);\n            free(atc_con); \n        }\n        return;\n    }\n\n    qlist_for_each(con_node, &atc_proxy_connection) {\n        ATC_PROXY_CONNECTION *atc_con = qnode_to_item(con_node, ATC_PROXY_CONNECTION, qnode);\n        if(atc_con && atc_con->ClientFd > 0) {\n            ret = send_atc_to_client(atc_con->ClientFd, (uint8_t *)buf, strlen(buf));\n            if(ret < 0) {\n                close(atc_con->ClientFd);\n                con_node = con_node->prev;\n                qlist_remove(&atc_con->qnode); \n                free(atc_con);\n                continue;\n            }\n        }\n    }\n}\n\nstatic void onTimeout(void) {\n    dprintf(\"%s\", __func__);\n    //TODO\n}\n\nstatic void onClose(void) {\n    dprintf(\"%s\", __func__);\n}\n\nstatic int create_local_server(const char *name) {\n    int sockfd = -1;\n    int reuse_addr = 1;\n    struct sockaddr_un sockaddr;\n    socklen_t alen;\n\n    /*Create server socket*/\n    SYSCHECK(sockfd = socket(AF_LOCAL, SOCK_STREAM, 0));\n\n    memset(&sockaddr, 0, sizeof(sockaddr));\n    sockaddr.sun_family = AF_LOCAL;\n    sockaddr.sun_path[0] = 0;\n    memcpy(sockaddr.sun_path + 1, name, strlen(name) );\n\n    alen = strlen(name) + offsetof(struct sockaddr_un, sun_path) + 1;\n    SYSCHECK(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse_addr,sizeof(reuse_addr)));\n    if(bind(sockfd, (struct sockaddr *)&sockaddr, alen) < 0) {\n        close(sockfd);\n        dprintf(\"bind %s errno: %d (%s)\\n\", name, errno, strerror(errno));\n        return -1;\n    }\n\n    dprintf(\"local server: %s sockfd = %d\\n\", name, sockfd);\n    cfmakenoblock(sockfd);\n    listen(sockfd, 1);    \n\n    return sockfd;\n}\n\nstatic void accept_atc_connection(int serverfd) {\n    int clientfd = -1;\n    unsigned char addr[128];\n    socklen_t alen = sizeof(addr);\n    ATC_PROXY_CONNECTION *atc_con;\n\n    clientfd = accept(serverfd, (struct sockaddr *)addr, &alen);\n\n    atc_con = (ATC_PROXY_CONNECTION *)malloc(sizeof(ATC_PROXY_CONNECTION));\n    if (atc_con) {\n        qlist_init(&atc_con->qnode);\n        atc_con->ClientFd= clientfd;\n        atc_con->AccessTime = 0;\n        dprintf(\"+++ ClientFd=%d\\n\", atc_con->ClientFd);\n        qlist_add_tail(&atc_proxy_connection, &atc_con->qnode);\n    }\n\n    cfmakenoblock(clientfd);\n}\n\nstatic void cleanup_atc_connection(int clientfd) {\n    struct qlistnode *con_node;\n    \n    qlist_for_each(con_node, &atc_proxy_connection) {\n        ATC_PROXY_CONNECTION *atc_con = qnode_to_item(con_node, ATC_PROXY_CONNECTION, qnode);\n        if (atc_con->ClientFd == clientfd) {\n            dprintf(\"--- ClientFd=%d\\n\", atc_con->ClientFd);    \n            close(atc_con->ClientFd);\n            qlist_remove(&atc_con->qnode);\n            free(atc_con);\n            if (current_client_fd == atc_con)\n                current_client_fd = NULL;\n            break;\n        }\n    }\n}\n\nstatic int atc_proxy_init(void) {\n    int err;\n    char *cmd;\n    ATResponse *p_response = NULL;\n\n    err = at_handshake();\n    if (err) {\n        dprintf(\"handshake fail, TODO ... \");\n        goto exit;\n    }\n\t\n    at_send_command_singleline(\"AT+QCFG=\\\"usbnet\\\"\", \"+QCFG:\", NULL);\n    at_send_command_multiline(\"AT+QNETDEVCTL=?\", \"+QNETDEVCTL:\", NULL);\n    at_send_command(\"AT+CGREG=2\", NULL); //GPRS Network Registration Status\n    at_send_command(\"AT+CEREG=2\", NULL); //EPS Network Registration Status\n    at_send_command(\"AT+C5GREG=2\", NULL); //5GS Network Registration Status\n\n    at_send_command_singleline(\"AT+QNETDEVSTATUS=?\", \"+QNETDEVSTATUS:\", &p_response);\n    if (at_response_error(err, p_response))\n        asr_style_atc = 1; //EC200T/EC100Y do not support this AT, but RG801/RG500U support \n\t\n    safe_at_response_free(p_response);\n\n    err = at_send_command_singleline(\"AT+QCFG=\\\"NAT\\\"\", \"+QCFG:\", &p_response);\n    if (!at_response_error(err, p_response)) {\n        int old_nat, new_nat = asr_style_atc ? 1 : 0;\n\n        err = at_tok_scanf(p_response->p_intermediates->line, \"%s%d\", NULL, &old_nat);\n        if (err == 2 && old_nat != new_nat) {\n            safe_at_response_free(p_response);\n            asprintf(&cmd, \"AT+QCFG=\\\"NAT\\\",%d\", new_nat);\n            err = at_send_command(cmd, &p_response);\n            safe_free(cmd);\n            if (!at_response_error(err, p_response)) {\n                err = at_send_command(\"at+cfun=1,1\",NULL);\n            }\n            safe_at_response_free(p_response);\n        }\n        err = 0;\n    }\n    safe_at_response_free(p_response);\n\nexit:\n    return err;\n}\n\nstatic void atc_start_server(const char* servername) {\n    atc_proxy_server_fd = create_local_server(servername);\n    dprintf(\"atc_proxy_server_fd = %d\\n\", atc_proxy_server_fd);\n    if (atc_proxy_server_fd == -1) {\n        dprintf(\"Failed to create %s, errno: %d (%s)\\n\", servername, errno, strerror(errno));\n    }\n}\n\nstatic void atc_close_server(const char* servername) {\n    if (atc_proxy_server_fd != -1) {\n        dprintf(\"%s %s close server\\n\", __func__, servername);\n        close(atc_proxy_server_fd);\n        atc_proxy_server_fd = -1;\n    }\n}\n\nstatic void *atc_proxy_loop(void *param)\n{\n    uint8_t *pATC = atc_buf;\n    struct qlistnode *con_node;\n    ATC_PROXY_CONNECTION *atc_con;\n\n    (void)param;\n    dprintf(\"%s enter thread_id %p\\n\", __func__, (void *)pthread_self());\n\n    qlist_init(&atc_proxy_connection);\n    while (atc_dev_fd > 0 && atc_proxy_quit == 0) {\n        struct pollfd pollfds[2+64];\n        int ne, ret, nevents = 0;\n        ssize_t nreads;\n\n        pollfds[nevents].fd = atc_dev_fd;\n        pollfds[nevents].events = POLLIN;\n        pollfds[nevents].revents= 0;\n        nevents++;\n        \n        if (atc_proxy_server_fd > 0) {\n            pollfds[nevents].fd = atc_proxy_server_fd;\n            pollfds[nevents].events = POLLIN;\n            pollfds[nevents].revents= 0;\n            nevents++;\n        }\n\n        qlist_for_each(con_node, &atc_proxy_connection) {\n            atc_con = qnode_to_item(con_node, ATC_PROXY_CONNECTION, qnode);\n            \n            pollfds[nevents].fd = atc_con->ClientFd;\n            pollfds[nevents].events = POLLIN;\n            pollfds[nevents].revents= 0;\n            nevents++;\n\n            if (nevents == (sizeof(pollfds)/sizeof(pollfds[0])))\n                break;\n        }\n\n        do {\n            ret = poll(pollfds, nevents, (atc_proxy_server_fd > 0) ? -1 : 200);\n         } while (ret == -1 && errno == EINTR && atc_proxy_quit == 0);\n         \n        if (ret < 0) {\n            dprintf(\"%s poll=%d, errno: %d (%s)\\n\", __func__, ret, errno, strerror(errno));\n            goto atc_proxy_loop_exit;\n        }\n\n        for (ne = 0; ne < nevents; ne++) {\n            int fd = pollfds[ne].fd;\n            short revents = pollfds[ne].revents;\n\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\n                dprintf(\"%s poll fd = %d, revents = %04x\\n\", __func__, fd, revents);\n                if (fd == atc_dev_fd) {\n                    goto atc_proxy_loop_exit;\n                } else if(fd == atc_proxy_server_fd) {\n                \n                } else {\n                    cleanup_atc_connection(fd);\n                }\n                continue;\n            }\n\n            if (!(pollfds[ne].revents & POLLIN)) {\n                continue;\n            }\n\n            if (fd == atc_proxy_server_fd) {\n                accept_atc_connection(fd);\n            }\n            else if (fd == atc_dev_fd) {\n                usleep(10*1000); //let atchannel.c read at response.\n                if (modem_reset_flag)\n                    goto atc_proxy_loop_exit;\n            }\n            else {\n                memset(atc_buf, 0x0, sizeof(atc_buf));\n                nreads = read(fd, pATC, sizeof(atc_buf));\n                if (nreads <= 0) {\n                    dprintf(\"%s read=%d errno: %d (%s)\",  __func__, (int)nreads, errno, strerror(errno));\n                    cleanup_atc_connection(fd);\n                    break;\n                }\n\n                dump_atc(pATC, fd, nreads, 'r');\n                qlist_for_each(con_node, &atc_proxy_connection) {\n                    atc_con = qnode_to_item(con_node, ATC_PROXY_CONNECTION, qnode);\n                    if (atc_con->ClientFd == pollfds[nevents].fd) {\n                        current_client_fd = atc_con;\n                        break;\n                    }\n                }\n                at_send_command ((const char *)pATC, NULL);\n                current_client_fd = NULL;\n            }\n        }\n    }\n\natc_proxy_loop_exit:\n    at_close();\n    while (!qlist_empty(&atc_proxy_connection)) {\n        ATC_PROXY_CONNECTION *atc_con = qnode_to_item(qlist_head(&atc_proxy_connection), ATC_PROXY_CONNECTION, qnode);\n        cleanup_atc_connection(atc_con->ClientFd);\n    }\n    dprintf(\"%s exit, thread_id %p\\n\", __func__, (void *)pthread_self());\n\n    return NULL;\n}\n\nstatic void usage(void) {\n    dprintf(\" -d <device_name>                      A valid atc device\\n\"\n            \"                                       default /dev/ttyUSB2, but /dev/ttyUSB2 may be invalid\\n\"\n            \" -i <netcard_name>                     netcard name\\n\"\n            \" -v                                    Will show all details\\n\");\n}\n\nstatic void sig_action(int sig) {\n    if (atc_proxy_quit == 0) {\n        atc_proxy_quit = 1;\n        if (thread_id)\n            pthread_kill(thread_id, sig);\n    }\n}\n\nint main(int argc, char *argv[]) {\n    int opt;\n    char atc_dev[32+1] = \"/dev/ttyUSB2\";\n    int retry_times = 0;\n    char servername[64] = {0};\n\n    optind = 1;\n    signal(SIGINT, sig_action);\n\n    while ( -1 != (opt = getopt(argc, argv, \"d:i:vh\"))) {\n        switch (opt) {\n            case 'd':\n                strcpy(atc_dev, optarg);\n                break;\n            case 'v':\n                verbose_debug = 1;\n                break;\n            default:\n                usage();\n                return 0;\n        }\n    }\n\n    if (access(atc_dev, R_OK | W_OK)) {\n        dprintf(\"Fail to access %s, errno: %d (%s). break\\n\", atc_dev, errno, strerror(errno));\n        return -1;\n    }\n\n          sprintf(servername, \"quectel-atc-proxy%c\", atc_dev[strlen(atc_dev) - 1]);\n    dprintf(\"Will use atc-dev='%s', proxy='%s'\\n\", atc_dev, servername);\n\n    while (atc_proxy_quit == 0) {\n        if (access(atc_dev, R_OK | W_OK)) {\n            dprintf(\"Fail to access %s, errno: %d (%s). continue\\n\", atc_dev, errno, strerror(errno));\n            // wait device\n            sleep(3);\n            continue;\n        }\n\n        atc_dev_fd = open(atc_dev, O_RDWR | O_NONBLOCK | O_NOCTTY);\n        if (atc_dev_fd == -1) {\n            dprintf(\"Failed to open %s, errno: %d (%s). break\\n\", atc_dev, errno, strerror(errno));\n            return -1;\n        }\n        cfmakenoblock(atc_dev_fd);\n        if (at_open(atc_dev_fd, onUnsolicited, 1)) {\n            close(atc_dev_fd);\n            atc_dev_fd = -1;\n        }\n        at_set_on_timeout(onTimeout);\n        at_set_on_reader_closed(onClose);\n\n        /* no atc_proxy_loop lives, create one */\n        pthread_create(&thread_id, NULL, atc_proxy_loop, NULL);\n        /* try to redo init if failed, init function must be successfully */\n        while (atc_proxy_init() != 0) {\n            if (retry_times < 5) {\n                dprintf(\"fail to init proxy, try again in 2 seconds.\\n\");\n                sleep(2);\n                retry_times++;\n            } else {\n                dprintf(\"has failed too much times, restart the modem and have a try...\\n\");\n                break;\n            }\n            /* break loop if modem is detached */\n            if (access(atc_dev, F_OK|R_OK|W_OK))\n                break;\n        }\n        retry_times = 0;\n        atc_start_server(servername);\n        if (atc_proxy_server_fd == -1)\n            pthread_cancel(thread_id); \n        pthread_join(thread_id, NULL);\n\n        /* close local server at last */\n        atc_close_server(servername);\n        close(atc_dev_fd);\n        /* DO RESTART IN 20s IF MODEM RESET ITSELF */\n        if (modem_reset_flag) {\n            unsigned int time_to_wait = 20;\n            while (time_to_wait) {\n                time_to_wait = sleep(time_to_wait);\n            }\n            modem_reset_flag = 0;\n        }\n    }\n\n    return 0;\n}"
  },
  {
    "path": "relevance/quectel_cm-5G/src/quectel-mbim-proxy.c",
    "content": "/*\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\n\n    Quectel hereby grants customers of Quectel a license to use, modify,\n    distribute and publish the Software in binary form provided that\n    customers shall have no right to reverse engineer, reverse assemble,\n    decompile or reduce to source code form any portion of the Software. \n    Under no circumstances may customers modify, demonstrate, use, deliver \n    or disclose any portion of the Software in source code form.\n*/\n\n#include <unistd.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <fcntl.h>\n#include <pthread.h>\n#include <poll.h>\n#include <sys/socket.h>\n#include <sys/time.h>\n#include <sys/ioctl.h>\n#include <linux/un.h>\n#include <linux/in.h>\n#include <linux/if.h>\n#include <dirent.h>\n#include <signal.h>\n#include <inttypes.h>\n#include <getopt.h>\n#include \"qendian.h\"\n\n#define QUECTEL_MBIM_PROXY \"quectel-mbim-proxy\"\n#define safe_close(_fd) do { if (_fd > 0) { close(_fd); _fd = -1; } } while(0)\n\n#define CM_MAX_CLIENT 32\n#define TID_MASK (0xFFFFFF)\n#define TID_SHIFT (24)\n\ntypedef enum {\n    MBIM_OPEN_MSG = 1,\n    MBIM_CLOSE_MSG = 2,\n    MBIM_OPEN_DONE = 0x80000001,\n    MBIM_CLOSE_DONE = 0x80000002,\n} MBIM_MSG;\n\ntypedef struct {\n    unsigned int  MessageType;\n    unsigned int  MessageLength;\n    unsigned int  TransactionId;\n} MBIM_MESSAGE_HEADER;\n\ntypedef struct {\n    MBIM_MESSAGE_HEADER MessageHeader;\n    unsigned int MaxControlTransfer;\n} MBIM_OPEN_MSG_T;\n\ntypedef struct {\n    MBIM_MESSAGE_HEADER MessageHeader;\n    unsigned int Status;\n} MBIM_OPEN_DONE_T;\n\ntypedef struct {\n    int client_fd;\n    int client_idx;\n} CM_CLIENT_T;\n\nstatic unsigned char cm_recv_buffer[4096];\nstatic CM_CLIENT_T cm_clients[CM_MAX_CLIENT];\nstatic int verbose = 0;\n\nconst char * get_time(void) {\n    static char time_buf[128];\n    struct timeval  tv;\n    time_t time;\n    suseconds_t millitm;\n    struct tm *ti;\n\n    gettimeofday (&tv, NULL);\n\n    time= tv.tv_sec;\n    millitm = (tv.tv_usec + 500) / 1000;\n\n    if (millitm == 1000) {\n        ++time;\n        millitm = 0;\n    }\n\n    ti = localtime(&time);\n    sprintf(time_buf, \"[%02d-%02d_%02d:%02d:%02d:%03d]\", ti->tm_mon+1, ti->tm_mday, ti->tm_hour, ti->tm_min, ti->tm_sec, (int)millitm);\n    return time_buf;\n}\n\n#define mbim_debug(fmt, args...) do { fprintf(stdout, \"%s \" fmt, get_time(), ##args); } while(0);\n\nstatic int non_block_write(int fd, void *data, int len)\n{\n    int ret;\n    struct pollfd pollfd = {fd, POLLOUT, 0};\n    ret = poll(&pollfd, 1, 3000);\n\n    if (ret <= 0) {\n        mbim_debug(\"%s poll ret=%d, errno: %d(%s)\\n\", __func__, ret, errno, strerror(errno));\n    }\n\n    ret = write (fd, data, len);\n    if (ret != len)\n        mbim_debug(\"%s write ret=%d, errno: %d(%s)\\n\", __func__, ret, errno, strerror(errno));\n\n    return len;\n}\n\nstatic int mbim_send_open_msg(int mbim_dev_fd, uint32_t MaxControlTransfer) {\n    MBIM_OPEN_MSG_T open_msg;\n    MBIM_OPEN_MSG_T *pRequest = &open_msg;\n\n    pRequest->MessageHeader.MessageType = htole32(MBIM_OPEN_MSG);\n    pRequest->MessageHeader.MessageLength = htole32(sizeof(MBIM_OPEN_MSG_T));\n    pRequest->MessageHeader.TransactionId = htole32(1);\n    pRequest->MaxControlTransfer = htole32(MaxControlTransfer);\n\n    mbim_debug(\"%s()\\n\", __func__);\n    return non_block_write(mbim_dev_fd, pRequest, sizeof(MBIM_OPEN_MSG_T));\n}\n\n/*\n * parameter: proxy name\n * return: local proxy server fd or -1\n*/\nstatic int proxy_make_server(const char *proxy_name)\n{\n    int len, flag;\n    struct sockaddr_un sockaddr;\n    int mbim_server_fd;\n\n    mbim_server_fd = socket(AF_LOCAL, SOCK_STREAM, 0);\n    if (mbim_server_fd < 0) {\n        mbim_debug(\"socket failed: %s\\n\", strerror(errno));\n        return -1;\n    }\n    if (fcntl(mbim_server_fd, F_SETFL, fcntl(mbim_server_fd, F_GETFL) | O_NONBLOCK) < 0)\n        mbim_debug(\"fcntl set server(%d) NONBLOCK attribute failed: %s\\n\", mbim_server_fd, strerror(errno));\n\n    memset(&sockaddr, 0, sizeof(sockaddr));\n    sockaddr.sun_family = AF_LOCAL;\n    sockaddr.sun_path[0] = 0;\n    snprintf(sockaddr.sun_path, UNIX_PATH_MAX, \"0%s\", proxy_name);\n    sockaddr.sun_path[0] = '\\0';  // string starts with leading '\\0'\n    flag = 1;\n    if (setsockopt(mbim_server_fd, SOL_SOCKET, SO_REUSEADDR, &flag, sizeof(flag)) < 0) {\n        safe_close(mbim_server_fd);\n        mbim_debug(\"setsockopt failed\\n\");\n    }\n\n    len = strlen(proxy_name) + offsetof(struct sockaddr_un, sun_path) + 1;\n    if (bind(mbim_server_fd, (struct sockaddr*)&sockaddr, len) < 0) {\n        safe_close(mbim_server_fd);\n        mbim_debug(\"bind failed: %s\\n\", strerror(errno));\n        return -1;\n    }\n\n    listen(mbim_server_fd, 4);\n    return mbim_server_fd;\n}\n\nstatic int handle_client_connect(int server_fd)\n{\n    int i, client_fd;\n    struct sockaddr_in cli_addr;\n    socklen_t len = sizeof(cli_addr);\n\n    client_fd = accept(server_fd, (struct sockaddr *)&cli_addr, &len);\n    if (client_fd < 0) {\n        mbim_debug(\"proxy accept failed: %s\\n\", strerror(errno));\n        return -1;\n    }\n\n    if (fcntl(client_fd, F_SETFL, fcntl(client_fd, F_GETFL) | O_NONBLOCK) < 0)\n        mbim_debug(\"fcntl set client(%d) NONBLOCK attribute failed: %s\\n\", client_fd, strerror(errno));\n\n    for (i = 0; i < CM_MAX_CLIENT; i++) {\n        if (cm_clients[i].client_fd <= 0) {\n            cm_clients[i].client_fd = client_fd;\n            cm_clients[i].client_idx= i+1;\n            mbim_debug(\"%s client_fd=%d, client_idx=%d\\n\", __func__, cm_clients[i].client_fd, cm_clients[i].client_idx);\n            return 0;\n        }\n    }\n\n    close(client_fd);\n    return -1;\n}\n\nstatic void handle_client_disconnect(int client_fd)\n{\n    int i;\n\n    for (i = 0; i < CM_MAX_CLIENT; i++) {\n        if (cm_clients[i].client_fd == client_fd) {\n            mbim_debug(\"%s client_fd=%d, client_idx=%d\\n\", __func__, cm_clients[i].client_fd, cm_clients[i].client_idx);\n            safe_close(cm_clients[i].client_fd);\n            return;\n        }\n    }\n}\n\nstatic int handle_client_request(int mbim_dev_fd, int client_fd, void *pdata, int len)\n{\n    int i;\n    int client_idx = -1;\n    int ret;\n    MBIM_MESSAGE_HEADER *pRequest = (MBIM_MESSAGE_HEADER *)pdata;\n    unsigned int  TransactionId = le32toh(pRequest->TransactionId);\n\n    for (i = 0; i < CM_MAX_CLIENT; i++) {\n        if (cm_clients[i].client_fd == client_fd) {\n            client_idx = cm_clients[i].client_idx;\n            break;\n        }\n    }\n\n    if (client_idx == -1) {\n        goto error;\n    }\n\n    if (le32toh(pRequest->MessageType) == MBIM_OPEN_MSG\n        || le32toh(pRequest->MessageType) == MBIM_CLOSE_MSG) {\n        MBIM_OPEN_DONE_T OpenDone;\n        OpenDone.MessageHeader.MessageType = htole32(le32toh(pRequest->MessageType) | 0x80000000);\n        OpenDone.MessageHeader.MessageLength = htole32(sizeof(OpenDone));\n        OpenDone.MessageHeader.TransactionId = htole32(TransactionId);\n        OpenDone.Status = htole32(0);\n        non_block_write (client_fd, &OpenDone, sizeof(OpenDone));\n        return 0;\n    }\n\n    /* transfer TransicationID to proxy transicationID and record in sender list */\n    pRequest->TransactionId = htole32(TransactionId | (client_idx << TID_SHIFT));\n    if (verbose) mbim_debug(\"REQ client_fd=%d, client_idx=%d, tid=%u\\n\",\n        cm_clients[client_idx].client_fd, cm_clients[client_idx].client_idx, TransactionId);\n    ret = non_block_write (mbim_dev_fd, pRequest, len);\n    if (ret == len)\n        return 0;\n\nerror:\n    return -1;\n}\n\n/*\n * Will read message from device and transfer it to clients/client\n * Notice:\n *  unsocial message will be send to all clients\n */\nstatic int handle_device_response(void *pdata, int len)\n{\n    int i;\n    MBIM_MESSAGE_HEADER *pResponse = (MBIM_MESSAGE_HEADER *)pdata;\n    unsigned int  TransactionId = le32toh(pResponse->TransactionId);\n\n    /* unsocial/function error message */\n    if (TransactionId == 0) {\n        for (i = 0; i < CM_MAX_CLIENT; i++) {\n            if (cm_clients[i].client_fd > 0) {\n                non_block_write(cm_clients[i].client_fd, pResponse, len);\n            }\n        }\n    }\n    else {\n        /* try to find the sender */\n        int client_idx = (TransactionId >> TID_SHIFT);\n\n        for (i = 0; i < CM_MAX_CLIENT; i++) {\n            if (cm_clients[i].client_idx == client_idx && cm_clients[i].client_fd > 0) {\n                TransactionId &= TID_MASK;\n                pResponse->TransactionId = htole32(TransactionId);\n                if (verbose) mbim_debug(\"RSP client_fd=%d, client_idx=%d, tid=%u\\n\",\n                    cm_clients[i].client_fd, cm_clients[i].client_idx, TransactionId);\n                non_block_write(cm_clients[i].client_fd, pResponse, len);\n                break;\n            }\n        }\n\n        if (i == CM_MAX_CLIENT) {\n           mbim_debug(\"%s nobody care tid=%u\\n\", __func__, TransactionId);     \n        }\n    }\n\n    return 0;\n}\n\nstatic int proxy_loop(int mbim_dev_fd)\n{\n    int i;\n    int mbim_server_fd = -1;\n\n    while (mbim_dev_fd > 0) {\n        struct pollfd pollfds[2+CM_MAX_CLIENT];\n        int ne, ret, nevents = 0;\n\n        pollfds[nevents].fd = mbim_dev_fd;\n        pollfds[nevents].events = POLLIN;\n        pollfds[nevents].revents= 0;\n        nevents++;\n        \n        if (mbim_server_fd > 0) {\n            pollfds[nevents].fd = mbim_server_fd;\n            pollfds[nevents].events = POLLIN;\n            pollfds[nevents].revents= 0;\n            nevents++;\n\n            for (i = 0; i < CM_MAX_CLIENT; i++) {\n                if (cm_clients[i].client_fd > 0) {\n                    pollfds[nevents].fd = cm_clients[i].client_fd;\n                    pollfds[nevents].events = POLLIN;\n                    pollfds[nevents].revents= 0;\n                    nevents++;\n                }\n            }\n        }\n\n        ret = poll(pollfds, nevents, (mbim_server_fd > 0) ? -1 : (10*1000));\n        if (ret <= 0) {\n            goto error;\n        }\n\n        for (ne = 0; ne < nevents; ne++) {\n            int fd = pollfds[ne].fd;\n            short revents = pollfds[ne].revents;\n\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\n                mbim_debug(\"%s poll fd = %d, revents = %04x\\n\", __func__, fd, revents);\n                if (fd == mbim_dev_fd) {\n                    goto error;\n                } else if(fd == mbim_server_fd) {\n                \n                } else {\n                    handle_client_disconnect(fd);\n                }\n                continue;\n            }\n\n            if (!(pollfds[ne].revents & POLLIN)) {\n                continue;\n            }\n\n            if (fd == mbim_server_fd) {\n                handle_client_connect(fd);\n            }\n            else {\n                    int len = read(fd, cm_recv_buffer, sizeof(cm_recv_buffer));\n\n                    if (len <= 0) {\n                        mbim_debug(\"%s read fd=%d, len=%d, errno: %d(%s)\\n\", __func__, fd, len, errno, strerror(errno));\n                        if (fd == mbim_dev_fd)\n                            goto error;\n                        else\n                            handle_client_disconnect(fd);\n\n                        return len;\n                    }\n\n                    if (fd == mbim_dev_fd) {\n                        if (mbim_server_fd == -1) {\n                            MBIM_OPEN_DONE_T *pOpenDone = (MBIM_OPEN_DONE_T *)cm_recv_buffer;\n\n                            if (le32toh(pOpenDone->MessageHeader.MessageType) == MBIM_OPEN_DONE) {\n                                mbim_debug(\"receive MBIM_OPEN_DONE, status=%d\\n\", htole32(pOpenDone->Status));\n                                if (htole32(pOpenDone->Status))\n                                    goto error;\n                                mbim_server_fd = proxy_make_server(QUECTEL_MBIM_PROXY);\n                                mbim_debug(\"mbim_server_fd=%d\\n\", mbim_server_fd);\n                            }\n                        }\n                        else {\n                            handle_device_response(cm_recv_buffer, len);\n                        }\n                    }\n                    else {\n                        handle_client_request(mbim_dev_fd, fd, cm_recv_buffer, len);\n                    }\n            }\n        }\n    }\n\nerror:\n    safe_close(mbim_server_fd);\n    for (i = 0; i < CM_MAX_CLIENT; i++) {\n        safe_close(cm_clients[i].client_fd);\n    }\n\n    mbim_debug(\"%s exit\\n\", __func__);\n    return 0;\n}\n\n/*\n * How to use this proxy?\n * 1. modprobe -a 8021q\n * 2. Create network interface for channels: \n *      ip link add link wwan0 name wwan0.1 type vlan id 1\n *      ip link add link wwan0 name wwan0.2 type vlan id 2\n * 3. Start './mbim-proxy' with -d 'device'\n * 4. Start Clients: ./quectel-CM -n id1\n * 5. Start Clients: ./quectel-CM -n id2\n * ...\n * Notice:\n *      mbim-proxy can work in backgroud as a daemon\n *      '-n' sessionID\n *  The modem may not support multi-PDN mode or how many PDN it supports is undefined. It depends!!!\n *  Besides, some modem also may not support some sessionID. For instance EC20 doesn't support SessionId 1... \n */\nint main(int argc, char **argv)\n{\n    int optidx = 0;\n    int opt;\n    char *optstr = \"d:vh\";\n    const char *device = \"/dev/cdc-wdm0\";\n\n    struct option options[] = {\n        {\"verbose\", no_argument,        NULL, 'v'},\n        {\"device\", required_argument,   NULL, 'd'},\n        {0, 0, 0, 0},\n    };\n    while ((opt = getopt_long(argc, argv, optstr, options, &optidx)) != -1) {\n        switch (opt) {\n        case 'v':\n            verbose = 1;\n            break;\n        case 'd':\n            device = optarg;\n            break;\n        case 'h':\n            mbim_debug(\"-h              Show this message\\n\");\n            mbim_debug(\"-v              Verbose\\n\");\n            mbim_debug(\"-d [device]     MBIM device\\n\");\n            return 0;\n        default:\n            mbim_debug(\"illegal argument\\n\");\n            return -1;\n        }\n    }\n\n    if (!device) {\n        mbim_debug(\"Missing parameter: device\\n\");\n        return -1;\n    }\n\n    while (1) {\n        int mbim_dev_fd = open(device, O_RDWR | O_NONBLOCK | O_NOCTTY);\n        if (mbim_dev_fd < 0) {\n            mbim_debug(\"cannot open mbim_device %s: %s\\n\", device, strerror(errno));\n            sleep(2);\n            continue;\n        }\n        mbim_debug (\"mbim_dev_fd=%d\\n\", mbim_dev_fd);\n\n        memset(cm_clients, 0, sizeof(cm_clients));\n        mbim_send_open_msg(mbim_dev_fd, sizeof(cm_recv_buffer));\n        proxy_loop(mbim_dev_fd);\n        safe_close(mbim_dev_fd);\n    }\n\n    return -1;\n}\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/quectel-qmi-proxy.c",
    "content": "/*\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\n\n    Quectel hereby grants customers of Quectel a license to use, modify,\n    distribute and publish the Software in binary form provided that\n    customers shall have no right to reverse engineer, reverse assemble,\n    decompile or reduce to source code form any portion of the Software. \n    Under no circumstances may customers modify, demonstrate, use, deliver \n    or disclose any portion of the Software in source code form.\n*/\n\n#include <unistd.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <fcntl.h>\n#include <pthread.h>\n#include <poll.h>\n#include <sys/socket.h>\n#include <sys/time.h>\n#include <sys/ioctl.h>\n#include <linux/un.h>\n#include <linux/if.h>\n#include <dirent.h>\n#include <signal.h>\n#include <inttypes.h>\n\n#include \"qendian.h\"\n#include \"qlist.h\"\n#include \"QCQMI.h\"\n#include \"QCQCTL.h\"\n#include \"QCQMUX.h\"\n\n#ifndef MIN\n#define MIN(a, b)\t((a) < (b)? (a): (b))\n#endif\n\nconst char * get_time(void) {\n    static char time_buf[128];\n    struct timeval  tv;\n    time_t time;\n    suseconds_t millitm;\n    struct tm *ti;\n\n    gettimeofday (&tv, NULL);\n\n    time= tv.tv_sec;\n    millitm = (tv.tv_usec + 500) / 1000;\n\n    if (millitm == 1000) {\n        ++time;\n        millitm = 0;\n    }\n\n    ti = localtime(&time);\n    sprintf(time_buf, \"[%02d-%02d_%02d:%02d:%02d:%03d]\", ti->tm_mon+1, ti->tm_mday, ti->tm_hour, ti->tm_min, ti->tm_sec, (int)millitm);\n    return time_buf;\n}\n\n#define dprintf(fmt, args...) do { fprintf(stdout, \"%s \" fmt, get_time(), ##args); } while(0);\n#define SYSCHECK(c) do{if((c)<0) {dprintf(\"%s %d error: '%s' (code: %d)\\n\", __func__, __LINE__, strerror(errno), errno); return -1;}}while(0)\n#define cfmakenoblock(fd) do{fcntl(fd, F_SETFL, fcntl(fd,F_GETFL) | O_NONBLOCK);}while(0)\n\ntypedef struct {\n    struct qlistnode qnode;\n    int ClientFd;\n    QCQMIMSG qmi[0];\n} QMI_PROXY_MSG;\n\ntypedef struct {\n    struct qlistnode qnode;\n    uint8_t QMIType;\n    uint8_t ClientId;\n    unsigned AccessTime;\n} QMI_PROXY_CLINET;\n\ntypedef struct {\n    struct qlistnode qnode;\n    struct qlistnode client_qnode;\n    int ClientFd;\n    unsigned AccessTime;\n} QMI_PROXY_CONNECTION;\n\n#ifdef QUECTEL_QMI_MERGE\n#define MERGE_PACKET_IDENTITY 0x2c7c\n#define MERGE_PACKET_VERSION 0x0001\n#define MERGE_PACKET_MAX_PAYLOAD_SIZE 56\ntypedef struct __QMI_MSG_HEADER {\n    uint16_t idenity;\n    uint16_t version;\n    uint16_t cur_len;\n    uint16_t total_len;\n} QMI_MSG_HEADER;\n\ntypedef struct __QMI_MSG_PACKET {\n    QMI_MSG_HEADER header;\n    uint16_t len;\n    char buf[4096];\n} QMI_MSG_PACKET;\n#endif\n\nstatic int qmi_proxy_quit = 0;\nstatic pthread_t thread_id = 0;\nstatic int cdc_wdm_fd = -1;\nstatic int qmi_proxy_server_fd = -1;\nstatic struct qlistnode qmi_proxy_connection;\nstatic struct qlistnode qmi_proxy_ctl_msg;\nstatic int verbose_debug = 0;\nstatic int modem_reset_flag = 0;\nstatic int qmi_sync_done = 0;\nstatic uint8_t qmi_buf[4096];\n\nstatic int send_qmi_to_cdc_wdm(PQCQMIMSG pQMI);\n\n#ifdef QUECTEL_QMI_MERGE\nstatic int merge_qmi_rsp_packet(void *buf, ssize_t *src_size) {\n    static QMI_MSG_PACKET s_QMIPacket;\n    QMI_MSG_HEADER *header = NULL;\n    ssize_t size = *src_size;\n\n    if((uint16_t)size < sizeof(QMI_MSG_HEADER))\n        return -1;\n\n    header = (QMI_MSG_HEADER *)buf;\n    if(le16toh(header->idenity) != MERGE_PACKET_IDENTITY || le16toh(header->version) != MERGE_PACKET_VERSION || le16toh(header->cur_len) > le16toh(header->total_len)) \n        return -1;\n\n    if(le16toh(header->cur_len) == le16toh(header->total_len)) {\n        *src_size = le16toh(header->total_len);\n        memcpy(buf, buf + sizeof(QMI_MSG_HEADER), *src_size);\n        s_QMIPacket.len = 0;  \n        return 0;\n    } \n\n    memcpy(s_QMIPacket.buf + s_QMIPacket.len, buf + sizeof(QMI_MSG_HEADER), le16toh(header->cur_len));\n    s_QMIPacket.len += le16toh(header->cur_len);\n\n    if (le16toh(header->cur_len) < MERGE_PACKET_MAX_PAYLOAD_SIZE || s_QMIPacket.len >= le16toh(header->total_len)) { \n       memcpy(buf, s_QMIPacket.buf, s_QMIPacket.len);      \n       *src_size = s_QMIPacket.len;\n       s_QMIPacket.len = 0;\n       return 0;           \n    }\n\n    return -1;\n}\n#endif\n\nstatic int create_local_server(const char *name) {\n    int sockfd = -1;\n    int reuse_addr = 1;\n    struct sockaddr_un sockaddr;\n    socklen_t alen;\n\n    /*Create server socket*/\n    SYSCHECK(sockfd = socket(AF_LOCAL, SOCK_STREAM, 0));\n\n    memset(&sockaddr, 0, sizeof(sockaddr));\n    sockaddr.sun_family = AF_LOCAL;\n    sockaddr.sun_path[0] = 0;\n    memcpy(sockaddr.sun_path + 1, name, strlen(name) );\n\n    alen = strlen(name) + offsetof(struct sockaddr_un, sun_path) + 1;\n    SYSCHECK(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse_addr,sizeof(reuse_addr)));\n    if(bind(sockfd, (struct sockaddr *)&sockaddr, alen) < 0) {\n        dprintf(\"bind %s errno: %d (%s)\\n\", name, errno, strerror(errno));\n        close(sockfd);\n        return -1;\n    }\n\n    dprintf(\"local server: %s sockfd = %d\\n\", name, sockfd);\n    cfmakenoblock(sockfd);\n    listen(sockfd, 1);    \n\n    return sockfd;\n}\n\nstatic void accept_qmi_connection(int serverfd) {\n    int clientfd = -1;\n    unsigned char addr[128];\n    socklen_t alen = sizeof(addr);\n    QMI_PROXY_CONNECTION *qmi_con;\n\n    clientfd = accept(serverfd, (struct sockaddr *)addr, &alen);\n\n    qmi_con = (QMI_PROXY_CONNECTION *)malloc(sizeof(QMI_PROXY_CONNECTION));\n    if (qmi_con) {\n        qlist_init(&qmi_con->qnode);\n        qlist_init(&qmi_con->client_qnode);\n        qmi_con->ClientFd= clientfd;\n        qmi_con->AccessTime = 0;\n        dprintf(\"+++ ClientFd=%d\\n\", qmi_con->ClientFd);\n        qlist_add_tail(&qmi_proxy_connection, &qmi_con->qnode);\n    }\n\n    cfmakenoblock(clientfd);\n}\n\nstatic void cleanup_qmi_connection(int clientfd, int clientDisconnect) {\n    struct qlistnode *con_node, *qmi_node;\n    \n    qlist_for_each(con_node, &qmi_proxy_connection) {\n        QMI_PROXY_CONNECTION *qmi_con = qnode_to_item(con_node, QMI_PROXY_CONNECTION, qnode);\n\n        if (qmi_con->ClientFd == clientfd) {\n            while (!qlist_empty(&qmi_con->client_qnode)) {\n                QMI_PROXY_CLINET *qmi_client = qnode_to_item(qlist_head(&qmi_con->client_qnode), QMI_PROXY_CLINET, qnode);\n\n                if (clientDisconnect) {\n                    int size = 17;\n                    QMI_PROXY_MSG *qmi_msg = malloc(sizeof(QMI_PROXY_MSG) + size);\n                    PQCQMIMSG pQMI = &qmi_msg->qmi[0];\n\n                    dprintf(\"xxx ClientFd=%d QMIType=%d ClientId=%d\\n\", qmi_con->ClientFd, qmi_client->QMIType, qmi_client->ClientId);\n                    qlist_init(&qmi_msg->qnode);\n                    qmi_msg->ClientFd = qmi_proxy_server_fd;\n                    pQMI->QMIHdr.IFType   = USB_CTL_MSG_TYPE_QMI;\n                    pQMI->QMIHdr.Length = htole16(16);\n                    pQMI->QMIHdr.CtlFlags = 0x00;\n                    pQMI->QMIHdr.QMIType  = QMUX_TYPE_CTL;\n                    pQMI->QMIHdr.ClientId= 0x00;\n                    pQMI->CTLMsg.ReleaseClientIdReq.CtlFlags = QMICTL_FLAG_REQUEST;\n                    pQMI->CTLMsg.ReleaseClientIdReq.TransactionId = 255;    \n                    pQMI->CTLMsg.ReleaseClientIdReq.QMICTLType = htole16(QMICTL_RELEASE_CLIENT_ID_REQ);\n                    pQMI->CTLMsg.ReleaseClientIdReq.Length = htole16(5);\n                    pQMI->CTLMsg.ReleaseClientIdReq.TLVType = QCTLV_TYPE_REQUIRED_PARAMETER;\n                    pQMI->CTLMsg.ReleaseClientIdReq.TLVLength = htole16(2);\n                    pQMI->CTLMsg.ReleaseClientIdReq.QMIType = qmi_client->QMIType;\n                    pQMI->CTLMsg.ReleaseClientIdReq.ClientId = qmi_client->ClientId;\n\n                    if (qlist_empty(&qmi_proxy_ctl_msg))\n                        send_qmi_to_cdc_wdm(pQMI);\n                    qlist_add_tail(&qmi_proxy_ctl_msg, &qmi_msg->qnode);\n                }\n                \n                qlist_remove(&qmi_client->qnode);\n                free(qmi_client);\n            }\n           \n            qlist_for_each(qmi_node, &qmi_proxy_ctl_msg) {\n                QMI_PROXY_MSG *qmi_msg = qnode_to_item(qmi_node, QMI_PROXY_MSG, qnode);\n\n                if (qmi_msg->ClientFd == qmi_con->ClientFd) {\n                    qlist_remove(&qmi_msg->qnode);\n                    free(qmi_msg);\n                    break;\n                 }\n            }\n\n            dprintf(\"--- ClientFd=%d\\n\", qmi_con->ClientFd);    \n            close(qmi_con->ClientFd);\n            qlist_remove(&qmi_con->qnode);\n            free(qmi_con);\n            break;\n        }\n    }\n}\n\nstatic void get_client_id(QMI_PROXY_CONNECTION *qmi_con, PQMICTL_GET_CLIENT_ID_RESP_MSG pClient) {\n    if (pClient->QMIResult == 0 && pClient->QMIError == 0) {\n        QMI_PROXY_CLINET *qmi_client = (QMI_PROXY_CLINET *)malloc(sizeof(QMI_PROXY_CLINET));\n\n        qlist_init(&qmi_client->qnode);\n        qmi_client->QMIType = pClient->QMIType;\n        qmi_client->ClientId = pClient->ClientId;\n        qmi_client->AccessTime = 0;\n\n        dprintf(\"+++ ClientFd=%d QMIType=%d ClientId=%d\\n\", qmi_con->ClientFd, qmi_client->QMIType, qmi_client->ClientId);\n        qlist_add_tail(&qmi_con->client_qnode, &qmi_client->qnode);\n    }\n}\n\nstatic void release_client_id(QMI_PROXY_CONNECTION *qmi_con, PQMICTL_RELEASE_CLIENT_ID_RESP_MSG pClient) {\n    struct qlistnode *client_node;\n    \n    if (pClient->QMIResult == 0 && pClient->QMIError == 0) {\n        qlist_for_each (client_node, &qmi_con->client_qnode) {\n            QMI_PROXY_CLINET *qmi_client = qnode_to_item(client_node, QMI_PROXY_CLINET, qnode);\n            \n            if (pClient->QMIType == qmi_client->QMIType && pClient->ClientId == qmi_client->ClientId) {\n                dprintf(\"--- ClientFd=%d QMIType=%d ClientId=%d\\n\", qmi_con->ClientFd, qmi_client->QMIType, qmi_client->ClientId);\n                qlist_remove(&qmi_client->qnode);\n                free(qmi_client);\n                break;\n            }\n        }\n    }\n}\n\nstatic void dump_qmi(PQCQMIMSG pQMI, int fd, const char flag)\n{\n    if (verbose_debug)\n    {\n        unsigned i;\n        unsigned size = le16toh(pQMI->QMIHdr.Length) + 1;\n        char buf[128];\n        int cnt = 0;\n\n        cnt += snprintf(buf + cnt, sizeof(buf) - cnt, \"%c %d %u: \", flag, fd, size);\n        for (i = 0; i < size && i < 24; i++)\n            cnt += snprintf(buf + cnt, sizeof(buf) - cnt, \"%02x \", ((uint8_t *)pQMI)[i]);\n        dprintf(\"%s\\n\", buf)\n    }\n}\n\nstatic int send_qmi_to_cdc_wdm(PQCQMIMSG pQMI) {\n    struct pollfd pollfds[]= {{cdc_wdm_fd, POLLOUT, 0}};\n    ssize_t ret = 0;\n\n    do {\n        ret = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), 5000);\n    } while (ret == -1 && errno == EINTR && qmi_proxy_quit == 0);\n\n    if (pollfds[0].revents & POLLOUT) {\n        ssize_t size = le16toh(pQMI->QMIHdr.Length) + 1;\n        ret = write(cdc_wdm_fd, pQMI, size);\n        dump_qmi(pQMI, cdc_wdm_fd, 'w');\n    }\n\n    return ret;\n}\n\nstatic int send_qmi_to_client(PQCQMIMSG pQMI, int clientFd) {\n    struct pollfd pollfds[]= {{clientFd, POLLOUT, 0}};\n    ssize_t ret = 0;\n\n    do {\n        ret = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), 5000);\n    } while (ret == -1 && errno == EINTR && qmi_proxy_quit == 0);\n\n    if (pollfds[0].revents & POLLOUT) {\n        ssize_t size = le16toh(pQMI->QMIHdr.Length) + 1;\n        ret = write(clientFd, pQMI, size);\n        dump_qmi(pQMI, clientFd, 'w');\n    }\n\n    return ret;\n}\n\nstatic void recv_qmi_from_dev(PQCQMIMSG pQMI) {\n    struct qlistnode *con_node, *client_node;\n\n    if (qmi_proxy_server_fd == -1) {\n        qmi_sync_done = 1;\n    }\n    else if (pQMI->QMIHdr.QMIType == QMUX_TYPE_CTL) {\n        if (pQMI->CTLMsg.QMICTLMsgHdr.CtlFlags == QMICTL_CTL_FLAG_RSP) {            \n            if (!qlist_empty(&qmi_proxy_ctl_msg)) {\n                QMI_PROXY_MSG *qmi_msg = qnode_to_item(qlist_head(&qmi_proxy_ctl_msg), QMI_PROXY_MSG, qnode);\n\n                if (qmi_msg->qmi[0].CTLMsg.QMICTLMsgHdrRsp.TransactionId != pQMI->CTLMsg.QMICTLMsgHdrRsp.TransactionId\n                    || qmi_msg->qmi[0].CTLMsg.QMICTLMsgHdrRsp.QMICTLType != pQMI->CTLMsg.QMICTLMsgHdrRsp.QMICTLType) {\n                    dprintf(\"ERROR: ctl rsp tid:%d, type:%d - ctl req %d, %d\\n\",\n                        pQMI->CTLMsg.QMICTLMsgHdrRsp.TransactionId, pQMI->CTLMsg.QMICTLMsgHdrRsp.QMICTLType,\n                        qmi_msg->qmi[0].CTLMsg.QMICTLMsgHdrRsp.TransactionId, qmi_msg->qmi[0].CTLMsg.QMICTLMsgHdrRsp.QMICTLType);\n                }\n                else if (qmi_msg->ClientFd == qmi_proxy_server_fd) {\n                    if (le16toh(pQMI->CTLMsg.QMICTLMsgHdrRsp.QMICTLType) == QMICTL_RELEASE_CLIENT_ID_RESP) {\n                        dprintf(\"--- ClientFd=%d QMIType=%d ClientId=%d\\n\", qmi_proxy_server_fd,\n                                pQMI->CTLMsg.ReleaseClientIdRsp.QMIType,  pQMI->CTLMsg.ReleaseClientIdRsp.ClientId);\n                    }\n                }\n                else {\n                    qlist_for_each(con_node, &qmi_proxy_connection) {\n                        QMI_PROXY_CONNECTION *qmi_con = qnode_to_item(con_node, QMI_PROXY_CONNECTION, qnode);\n\n                        if (qmi_con->ClientFd == qmi_msg->ClientFd) {\n                            send_qmi_to_client(pQMI, qmi_msg->ClientFd);\n\n                            if (le16toh(pQMI->CTLMsg.QMICTLMsgHdrRsp.QMICTLType) == QMICTL_GET_CLIENT_ID_RESP) {\n                                get_client_id(qmi_con, &pQMI->CTLMsg.GetClientIdRsp);                                                        \n                            }\n                            else if (le16toh(pQMI->CTLMsg.QMICTLMsgHdrRsp.QMICTLType) == QMICTL_RELEASE_CLIENT_ID_RESP) {\n                                release_client_id(qmi_con, &pQMI->CTLMsg.ReleaseClientIdRsp);\n                            }\n                            else {\n                            }\n                        }\n                    }\n                }\n\n                qlist_remove(&qmi_msg->qnode);\n                free(qmi_msg);\n\n                if (!qlist_empty(&qmi_proxy_ctl_msg)) {\n                    QMI_PROXY_MSG *qmi_msg = qnode_to_item(qlist_head(&qmi_proxy_ctl_msg), QMI_PROXY_MSG, qnode);\n\n                    send_qmi_to_cdc_wdm(qmi_msg->qmi);\n                }\n            }\n        } \n        else if (pQMI->QMIHdr.QMIType == QMICTL_CTL_FLAG_IND) {\n            if (le16toh(pQMI->CTLMsg.QMICTLMsgHdrRsp.QMICTLType) == QMICTL_REVOKE_CLIENT_ID_IND) {\n                modem_reset_flag = 1;\n            }\n        }\n    }\n    else  {\n        qlist_for_each(con_node, &qmi_proxy_connection) {\n            QMI_PROXY_CONNECTION *qmi_con = qnode_to_item(con_node, QMI_PROXY_CONNECTION, qnode);\n            \n            qlist_for_each(client_node, &qmi_con->client_qnode) {\n                QMI_PROXY_CLINET *qmi_client = qnode_to_item(client_node, QMI_PROXY_CLINET, qnode);\n                if (pQMI->QMIHdr.QMIType == qmi_client->QMIType) {\n                    if (pQMI->QMIHdr.ClientId == 0 || pQMI->QMIHdr.ClientId == qmi_client->ClientId) {\n                        send_qmi_to_client(pQMI, qmi_con->ClientFd);\n                    }\n                }\n            }\n        }\n    }\n}\n\nstatic int recv_qmi_from_client(PQCQMIMSG pQMI, unsigned size, int clientfd) {\n    if (qmi_proxy_server_fd == -1)\n        return -1;\n\n    if (pQMI->QMIHdr.QMIType == QMUX_TYPE_CTL) {  \n        QMI_PROXY_MSG *qmi_msg;\n\n        if (pQMI->CTLMsg.QMICTLMsgHdr.QMICTLType == QMICTL_SYNC_REQ) {\n            dprintf(\"do not allow client send QMICTL_SYNC_REQ\\n\");\n            return 0;\n        }\n\n        qmi_msg = malloc(sizeof(QMI_PROXY_MSG) + size);\n        qlist_init(&qmi_msg->qnode);\n        qmi_msg->ClientFd = clientfd;\n        memcpy(qmi_msg->qmi, pQMI, size);\n\n        if (qlist_empty(&qmi_proxy_ctl_msg))\n            send_qmi_to_cdc_wdm(pQMI);\n        qlist_add_tail(&qmi_proxy_ctl_msg, &qmi_msg->qnode);\n    }\n    else {\n        send_qmi_to_cdc_wdm(pQMI);\n    }\n\n    return 0;\n}\n\nstatic int qmi_proxy_init(unsigned retry) {\n    unsigned i;\n    QCQMIMSG _QMI;\n    PQCQMIMSG pQMI = &_QMI;\n\n    dprintf(\"%s enter\\n\", __func__);\n\n    pQMI->QMIHdr.IFType   = USB_CTL_MSG_TYPE_QMI;\n    pQMI->QMIHdr.CtlFlags = 0x00;\n    pQMI->QMIHdr.QMIType  = QMUX_TYPE_CTL;\n    pQMI->QMIHdr.ClientId= 0x00;\n    \n    pQMI->CTLMsg.QMICTLMsgHdr.CtlFlags = QMICTL_FLAG_REQUEST;\n\n    qmi_sync_done = 0;\n    for (i = 0; i < retry; i++) {\n        pQMI->CTLMsg.SyncReq.TransactionId = i+1;    \n        pQMI->CTLMsg.SyncReq.QMICTLType = htole16(QMICTL_SYNC_REQ);\n        pQMI->CTLMsg.SyncReq.Length = htole16(0);\n\n        pQMI->QMIHdr.Length = \n            htole16(le16toh(pQMI->CTLMsg.QMICTLMsgHdr.Length) + sizeof(QCQMI_HDR) + sizeof(QCQMICTL_MSG_HDR) - 1);\n\n        if (send_qmi_to_cdc_wdm(pQMI) <= 0)\n            break;\n\n        sleep(1);\n        if (qmi_sync_done)\n            break;\n    }\n\n    dprintf(\"%s %s\\n\", __func__, qmi_sync_done ? \"succful\" : \"fail\");\n    return qmi_sync_done ? 0 : -1;\n}\n\nstatic void *qmi_proxy_loop(void *param)\n{\n    PQCQMIMSG pQMI = (PQCQMIMSG)qmi_buf;\n    struct qlistnode *con_node;\n    QMI_PROXY_CONNECTION *qmi_con;\n\n    (void)param;\n    dprintf(\"%s enter thread_id %p\\n\", __func__, (void *)pthread_self());\n\n    qlist_init(&qmi_proxy_connection);\n    qlist_init(&qmi_proxy_ctl_msg);\n\n    while (cdc_wdm_fd > 0 && qmi_proxy_quit == 0) {\n        struct pollfd pollfds[2+64];\n        int ne, ret, nevents = 0;\n        ssize_t nreads;\n\n        pollfds[nevents].fd = cdc_wdm_fd;\n        pollfds[nevents].events = POLLIN;\n        pollfds[nevents].revents= 0;\n        nevents++;\n        \n        if (qmi_proxy_server_fd > 0) {\n            pollfds[nevents].fd = qmi_proxy_server_fd;\n            pollfds[nevents].events = POLLIN;\n            pollfds[nevents].revents= 0;\n            nevents++;\n        }\n\n        qlist_for_each(con_node, &qmi_proxy_connection) {\n            qmi_con = qnode_to_item(con_node, QMI_PROXY_CONNECTION, qnode);\n            \n            pollfds[nevents].fd = qmi_con->ClientFd;\n            pollfds[nevents].events = POLLIN;\n            pollfds[nevents].revents= 0;\n            nevents++;\n\n            if (nevents == (sizeof(pollfds)/sizeof(pollfds[0])))\n                break;\n        }\n\n#if 0\n        dprintf(\"poll \");\n        for (ne = 0; ne < nevents; ne++) {\n            dprintf(\"%d \", pollfds[ne].fd);\n        }\n        dprintf(\"\\n\");\n#endif\n\n        do {\n            //ret = poll(pollfds, nevents, -1);\n            ret = poll(pollfds, nevents, (qmi_proxy_server_fd > 0) ? -1 : 200);\n        } while (ret == -1 && errno == EINTR && qmi_proxy_quit == 0);\n         \n        if (ret < 0) {\n            dprintf(\"%s poll=%d, errno: %d (%s)\\n\", __func__, ret, errno, strerror(errno));\n            goto qmi_proxy_loop_exit;\n        }\n\n        for (ne = 0; ne < nevents; ne++) {\n            int fd = pollfds[ne].fd;\n            short revents = pollfds[ne].revents;\n\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\n                dprintf(\"%s poll fd = %d, revents = %04x\\n\", __func__, fd, revents);\n                if (fd == cdc_wdm_fd) {\n                    goto qmi_proxy_loop_exit;\n                } else if(fd == qmi_proxy_server_fd) {\n                \n                } else {\n                    cleanup_qmi_connection(fd, 1);\n                }\n\n                continue;\n            }\n\n            if (!(pollfds[ne].revents & POLLIN)) {\n                continue;\n            }\n\n            if (fd == qmi_proxy_server_fd) {\n                accept_qmi_connection(fd);\n            }\n            else if (fd == cdc_wdm_fd) {\n                nreads = read(fd, pQMI, sizeof(qmi_buf));\n                if (nreads <= 0) {\n                    dprintf(\"%s read=%d errno: %d (%s)\\n\",  __func__, (int)nreads, errno, strerror(errno));\n                    goto qmi_proxy_loop_exit;\n                }\n#ifdef QUECTEL_QMI_MERGE\n                if(merge_qmi_rsp_packet(pQMI, &nreads))\n                    continue;             \n#endif\n                if (nreads != (le16toh(pQMI->QMIHdr.Length) + 1)) {\n                    dprintf(\"%s nreads=%d,  pQCQMI->QMIHdr.Length = %d\\n\",  __func__, (int)nreads, le16toh(pQMI->QMIHdr.Length));\n                    continue;\n                }\n\n                dump_qmi(pQMI, fd, 'r');\n                recv_qmi_from_dev(pQMI);\n                if (modem_reset_flag)\n                    goto qmi_proxy_loop_exit;\n            }\n            else {\n                nreads = read(fd, pQMI, sizeof(qmi_buf));\n  \n                if (nreads <= 0) {\n                    dprintf(\"%s read=%d errno: %d (%s)\",  __func__, (int)nreads, errno, strerror(errno));\n                    cleanup_qmi_connection(fd, 1);\n                    break;\n                }\n\n                if (nreads != (le16toh(pQMI->QMIHdr.Length) + 1)) {\n                    dprintf(\"%s nreads=%d,  pQCQMI->QMIHdr.Length = %d\\n\",  __func__, (int)nreads, le16toh(pQMI->QMIHdr.Length));\n                    continue;\n                }\n\n                dump_qmi(pQMI, fd, 'r');\n                recv_qmi_from_client(pQMI, nreads, fd);\n            }\n        }\n    }\n\nqmi_proxy_loop_exit:\n    while (!qlist_empty(&qmi_proxy_connection)) {\n        QMI_PROXY_CONNECTION *qmi_con = qnode_to_item(qlist_head(&qmi_proxy_connection), QMI_PROXY_CONNECTION, qnode);\n\n        cleanup_qmi_connection(qmi_con->ClientFd, 0);\n    }\n    \n    dprintf(\"%s exit, thread_id %p\\n\", __func__, (void *)pthread_self());\n\n    return NULL;\n}\n\nstatic void usage(void) {\n    dprintf(\" -d <device_name>                      A valid qmi device\\n\"\n            \"                                       default /dev/cdc-wdm0, but cdc-wdm0 may be invalid\\n\"\n            \" -i <netcard_name>                     netcard name\\n\"\n            \" -v                                    Will show all details\\n\");\n}\n\nstatic void sig_action(int sig) {\n    if (qmi_proxy_quit++ == 0) {\n        if (thread_id)\n            pthread_kill(thread_id, sig);\n    }\n}\n\nint main(int argc, char *argv[]) {\n    int opt;\n    char cdc_wdm[32+1] = \"/dev/cdc-wdm0\";\n    char servername[64] = {0};\n\n    optind = 1;\n\n    signal(SIGINT, sig_action);\n\n    while ( -1 != (opt = getopt(argc, argv, \"d:i:vh\"))) {\n        switch (opt) {\n            case 'd':\n                strcpy(cdc_wdm, optarg);\n                break;\n            case 'v':\n                verbose_debug = 1;\n                break;\n            default:\n                usage();\n                return 0;\n        }\n    }\n\n    sprintf(servername, \"quectel-qmi-proxy%c\", cdc_wdm[strlen(cdc_wdm)-1]);\n    dprintf(\"Will use cdc-wdm='%s', proxy='%s'\\n\", cdc_wdm, servername);\n\n    while (qmi_proxy_quit == 0) {\n        cdc_wdm_fd = open(cdc_wdm, O_RDWR | O_NONBLOCK | O_NOCTTY);\n        if (cdc_wdm_fd == -1) {\n            dprintf(\"Failed to open %s, errno: %d (%s)\\n\", cdc_wdm, errno, strerror(errno));\n            sleep(3);\n            continue;\n        }\n        cfmakenoblock(cdc_wdm_fd);\n        \n        /* no qmi_proxy_loop lives, create one */\n        pthread_create(&thread_id, NULL, qmi_proxy_loop, NULL);\n\n        if (qmi_proxy_init(60) == 0) {\n            qmi_proxy_server_fd = create_local_server(servername);\n            dprintf(\"qmi_proxy_server_fd = %d\\n\", qmi_proxy_server_fd);\n            if (qmi_proxy_server_fd == -1) {\n                dprintf(\"Failed to create %s, errno: %d (%s)\\n\", servername, errno, strerror(errno));\n                pthread_cancel(thread_id);\n            }\n        }\n        else {\n            pthread_cancel(thread_id);\n        }\n\n        pthread_join(thread_id, NULL);\n        thread_id = 0;\n\n        if (qmi_proxy_server_fd != -1) {\n            dprintf(\"close server %s\\n\", servername);\n            close(qmi_proxy_server_fd);\n            qmi_proxy_server_fd = -1;\n        }\n        close(cdc_wdm_fd);\n        cdc_wdm_fd = -1;\n\n        if (qmi_proxy_quit == 0)\n            sleep(modem_reset_flag ? 30 : 3);\n        modem_reset_flag = 0;\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/quectel-qrtr-proxy.c",
    "content": "/*\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\n\n    Quectel hereby grants customers of Quectel a license to use, modify,\n    distribute and publish the Software in binary form provided that\n    customers shall have no right to reverse engineer, reverse assemble,\n    decompile or reduce to source code form any portion of the Software. \n    Under no circumstances may customers modify, demonstrate, use, deliver \n    or disclose any portion of the Software in source code form.\n*/\n\n#include <unistd.h>\n#include <stdlib.h>\n#include <stdio.h>\n#include <string.h>\n#include <errno.h>\n#include <stdarg.h>\n#include <stddef.h>\n#include <fcntl.h>\n#include <pthread.h>\n#include <poll.h>\n#include <sys/socket.h>\n#include <sys/time.h>\n#include <sys/ioctl.h>\n#include <linux/un.h>\n#include <linux/if.h>\n#include <dirent.h>\n#include <signal.h>\n#include <inttypes.h>\n#include <linux/socket.h>\n#include <linux/qrtr.h>\n\n#define QRTR_PROTO_VER_1 1\nstruct qrtr_hdr_v1 {\n\t__le32 version;\n\t__le32 type;\n\t__le32 src_node_id;\n\t__le32 src_port_id;\n\t__le32 confirm_rx;\n\t__le32 size;\n\t__le32 dst_node_id;\n\t__le32 dst_port_id;\n} __attribute__ ((packed));\n\n#include \"qendian.h\"\n#include \"qlist.h\"\n#include \"QCQMI.h\"\n#include \"QCQCTL.h\"\n#include \"QCQMUX.h\"\n\nstatic const char * get_time(void) {\n    static char time_buf[128];\n    struct timeval  tv;\n    time_t time;\n    suseconds_t millitm;\n    struct tm *ti;\n\n    gettimeofday (&tv, NULL);\n\n    time= tv.tv_sec;\n    millitm = (tv.tv_usec + 500) / 1000;\n\n    if (millitm == 1000) {\n        ++time;\n        millitm = 0;\n    }\n\n    ti = localtime(&time);\n    sprintf(time_buf, \"[%02d-%02d_%02d:%02d:%02d:%03d]\", ti->tm_mon+1, ti->tm_mday, ti->tm_hour, ti->tm_min, ti->tm_sec, (int)millitm);\n    return time_buf;\n}\n\n#define dprintf(fmt, args...) do { fprintf(stdout, \"%s \" fmt, get_time(), ##args); } while(0);\n#define SYSCHECK(c) do{if((c)<0) {dprintf(\"%s %d error: '%s' (code: %d)\\n\", __func__, __LINE__, strerror(errno), errno); return -1;}}while(0)\n#define cfmakenoblock(fd) do{fcntl(fd, F_SETFL, fcntl(fd,F_GETFL) | O_NONBLOCK);}while(0)\n#define align_4(_len) (((_len) + 3) & ~3)\n\ntypedef struct {\n    struct qlistnode qnode;\n    int ClientFd;\n    QCQMIMSG qrtr[0];\n} QRTR_PROXY_MSG;\n\ntypedef struct {\n    struct qlistnode qnode;\n    uint8_t QMIType;\n    uint8_t ClientId;\n    uint32_t node_id;\n    uint32_t port_id;\n    unsigned AccessTime;\n} QRTR_PROXY_CLINET;\n\ntypedef struct {\n    struct qlistnode qnode;\n    struct qlistnode client_qnode;\n    int ClientFd;\n    unsigned AccessTime;\n} QRTR_PROXY_CONNECTION;\n\ntypedef struct {\n    struct qlistnode qnode;\n    uint32_t service;\n    uint32_t version;\n    uint32_t instance;\n    uint32_t node;\n    uint32_t port;\n\n    __le32 src_node_id;\n    __le32 src_port_id;\n} QRTR_SERVICE;\n\nstatic int qrtr_proxy_quit = 0;\nstatic pthread_t thread_id = 0;\nstatic int cdc_wdm_fd = -1;\nstatic int qrtr_proxy_server_fd = -1;\nstatic struct qlistnode qrtr_proxy_connection;\nstatic struct qlistnode qrtr_server_list;\nstatic int verbose_debug = 0;\nstatic uint32_t node_modem = 3; //IPQ ~ 3, QCM ~ 0\nstatic uint32_t node_myself = 1;\n\nstatic QRTR_SERVICE *find_qrtr_service(uint8_t QMIType)\n{\n    struct qlistnode *node;\n\n    qlist_for_each (node, &qrtr_server_list) {\n        QRTR_SERVICE *srv = qnode_to_item(node, QRTR_SERVICE, qnode);\n        if (srv->service == QMIType)\n            return srv;\n    }\n        \n    return NULL;\n}\n\nstatic uint8_t client_bitmap[0xf0];\nstatic uint8_t port_bitmap[0xff0];\nstatic int alloc_client_id(void) {\n    int id = 1;\n\n    for (id = 1; id < (int)sizeof(client_bitmap); id++) {\n        if (client_bitmap[id] == 0) {\n            client_bitmap[id] = id;\n            return id;\n        }\n    }\n\n    dprintf(\"NOT find %s()\\n\", __func__);\n    return 0;\n}\n\nstatic void free_client_id(int id) {\n    if (id < (int)sizeof(client_bitmap) && client_bitmap[id] == id) {\n        client_bitmap[id] = 0;\n        return;\n    }\n    dprintf(\"NOT find %s(id=%d)\\n\", __func__, id);\n}\n\nstatic int alloc_port_id(void) {\n    int id = 1;\n\n    for (id = 1; id < (int)sizeof(port_bitmap); id++) {\n        if (port_bitmap[id] == 0) {\n            port_bitmap[id] = id;\n            return id;\n        }\n    }\n\n    dprintf(\"NOT find %s()\\n\", __func__);\n   return 0;\n}\n\nstatic void free_port_id(int id) {\n    if (id < (int)sizeof(port_bitmap) && port_bitmap[id] == id) {\n        port_bitmap[id] = 0;\n        return;\n    }\n    dprintf(\"NOT find %s(id=%d)\\n\", __func__, id);\n}\n\nstatic void dump_qrtr(void *buf, size_t len, char flag)\n{\n    size_t i;\n    static char printf_buf[1024];\n    int cnt = 0, limit=1024;\n    unsigned char *d = (unsigned char *)buf;\n    struct qrtr_hdr_v1 *hdr = (struct qrtr_hdr_v1 *)buf;\n    const char *ctrl_pkt_strings[] = {\n    \t[QRTR_TYPE_DATA]\t= \"data\",\n    \t[QRTR_TYPE_HELLO]\t= \"hello\",\n    \t[QRTR_TYPE_BYE]\t\t= \"bye\",\n    \t[QRTR_TYPE_NEW_SERVER]\t= \"new-server\",\n    \t[QRTR_TYPE_DEL_SERVER]\t= \"del-server\",\n    \t[QRTR_TYPE_DEL_CLIENT]\t= \"del-client\",\n    \t[QRTR_TYPE_RESUME_TX]\t= \"resume-tx\",\n    \t[QRTR_TYPE_EXIT]\t= \"exit\",\n    \t[QRTR_TYPE_PING]\t= \"ping\",\n    \t[QRTR_TYPE_NEW_LOOKUP]\t= \"new-lookup\",\n    \t[QRTR_TYPE_DEL_LOOKUP]\t= \"del-lookup\",\n    };\n\n    for (i = 0; i < len && i < 64; i++) {\n        if (i%4 == 0)\n            cnt += snprintf(printf_buf+cnt, limit-cnt, \" \");\n        cnt += snprintf(printf_buf+cnt, limit-cnt, \"%02x\", d[i]);\n    }\n    dprintf(\"%s\\n\", printf_buf);\n\n    dprintf(\"%c ver=%d, type=%d(%s), %x,%x -> %x,%x, confirm_rx=%d, size=%u\\n\",\n        flag,\n        le32toh(hdr->version), le32toh(hdr->type), ctrl_pkt_strings[le32toh(hdr->type)],\n        le32toh(hdr->src_node_id), le32toh(hdr->src_port_id), le32toh(hdr->dst_node_id), le32toh(hdr->dst_port_id),\n        le32toh(hdr->confirm_rx), le32toh(hdr->size));\n}\n\nstatic int send_qmi_to_client(PQCQMIMSG pQMI, int fd) {\n    struct pollfd pollfds[]= {{fd, POLLOUT, 0}};\n    ssize_t ret = 0;\n    ssize_t size = le16toh(pQMI->QMIHdr.Length) + 1;\n\n    do {\n        ret = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), 5000);\n    } while (ret == -1 && errno == EINTR && qrtr_proxy_quit == 0);\n\n    if (pollfds[0].revents & POLLOUT) {\n        ret = write(fd, pQMI, size);\n    }\n\n    return ret == size ? 0 : -1;\n}\n\nstatic int send_qrtr_to_dev(struct qrtr_hdr_v1 *hdr, int fd) {\n    struct pollfd pollfds[]= {{fd, POLLOUT, 0}};\n    ssize_t ret = 0;\n    ssize_t size = align_4(le32toh(hdr->size) + sizeof(*hdr));\n\n    do {\n        ret = poll(pollfds, sizeof(pollfds)/sizeof(pollfds[0]), 5000);\n    } while (ret == -1 && errno == EINTR && qrtr_proxy_quit == 0);\n\n    if (pollfds[0].revents & POLLOUT) {\n        ret = write(fd, hdr, size);\n    }\n\n    return ret == size ? 0 : -1;\n}\n\nstatic int qrtr_node_enqueue(const void *data, size_t len,\n\t\t\t     int type, struct sockaddr_qrtr *from,\n\t\t\t     struct sockaddr_qrtr *to, unsigned int confirm_rx)\n{\n    int rc = -1;\n    size_t size = sizeof(struct qrtr_hdr_v1) + len;\n    struct qrtr_hdr_v1 *hdr = (struct qrtr_hdr_v1 *)malloc(align_4(size));\n\n    if (hdr) {\n        hdr->version = htole32(QRTR_PROTO_VER_1);\n        hdr->type = htole32(type);\n        hdr->src_node_id = htole32(from->sq_node);\n        hdr->src_port_id = htole32(from->sq_port);\n        hdr->dst_node_id = htole32(to->sq_node);\n        hdr->dst_port_id = htole32(to->sq_port);\n        hdr->size = htole32(len);\n        hdr->confirm_rx = htole32(!!confirm_rx);\n\n        memcpy(hdr + 1, data, len);\n        dump_qrtr(hdr, size, '>');\n        send_qrtr_to_dev(hdr, cdc_wdm_fd);\n        free(hdr);\n    }\n\n    return rc;\n}\n\nstatic int send_ctrl_hello(__u32 sq_node, __u32 sq_port)\n{\n    struct qrtr_ctrl_pkt pkt;\n    int rc;\n    struct sockaddr_qrtr to = {AF_QIPCRTR, sq_node, sq_port};\n    struct sockaddr_qrtr from = {AF_QIPCRTR, node_myself, QRTR_PORT_CTRL};\n\n    memset(&pkt, 0, sizeof(pkt));\n    pkt.cmd =  htole32(QRTR_TYPE_HELLO);\n\n    rc = qrtr_node_enqueue(&pkt, sizeof(pkt), QRTR_TYPE_HELLO, &from, &to, 0);\n    if (rc < 0)\n        return rc;\n\n    return 0;\n}\n\nstatic int ctrl_cmd_del_client(__u32 sq_node, __u32 sq_port, uint8_t QMIType) \n{\n    struct qrtr_ctrl_pkt pkt;\n    int rc;\n    struct sockaddr_qrtr to = {AF_QIPCRTR, QRTR_NODE_BCAST, QRTR_PORT_CTRL};\n    struct sockaddr_qrtr from = {AF_QIPCRTR, sq_node, sq_port};\n    QRTR_SERVICE *srv = find_qrtr_service(QMIType);\n\n    if (srv) {\n        to.sq_node = srv->src_node_id;\n    }\n\n    memset(&pkt, 0, sizeof(pkt));\n    pkt.cmd = htole32(QRTR_TYPE_DEL_CLIENT);\n    pkt.client.node = htole32(sq_node);\n    pkt.client.port = htole32(sq_port);\n\n    rc = qrtr_node_enqueue(&pkt, sizeof(pkt), QRTR_TYPE_DATA, &from, &to, 0);\n    if (rc < 0)\n        return rc;\n\n    return 0;\n}\n\nstatic void handle_server_change(struct qrtr_hdr_v1 *hdr) {\n    struct qrtr_ctrl_pkt *pkt = (struct qrtr_ctrl_pkt *)(hdr + 1);\n    QRTR_SERVICE *s;\n\n    dprintf (\"[qrtr] %s  server on %u:%u(%u:%u) -> service %u, instance %x\\n\",\n            QRTR_TYPE_NEW_SERVER == hdr->type ? \"add\" : \"remove\",\n             le32toh(pkt->server.node), le32toh(pkt->server.port),\n             le32toh(hdr->src_node_id),  le32toh(hdr->src_port_id),\n             le32toh(pkt->server.service), le32toh(pkt->server.instance));\n\n    if (le32toh(pkt->server.node) != node_modem) {\n        return; //we only care modem\n    }\n\n    s = (QRTR_SERVICE *)malloc(sizeof(QRTR_SERVICE));\n    if (!s)\n        return;\n\n    qlist_init(&s->qnode);\n    s->service = le32toh(pkt->server.service);\n    s->version = le32toh(pkt->server.instance) & 0xff;\n    s->instance = le32toh(pkt->server.instance) >> 8;\n    s->node = le32toh(pkt->server.node);\n    s->port = le32toh(pkt->server.port);\n\n    s->src_node_id = le32toh(hdr->src_node_id);\n    s->src_port_id = le32toh(hdr->src_port_id);\n\n    if (QRTR_TYPE_NEW_SERVER == hdr->type) {\n        qlist_add_tail(&qrtr_server_list, &s->qnode);\n    }\n    else if (QRTR_TYPE_DEL_SERVER == hdr->type) {\n        qlist_remove(&s->qnode);\n    }\n}\n\nstatic int create_local_server(const char *name) {\n    int sockfd = -1;\n    int reuse_addr = 1;\n    struct sockaddr_un sockaddr;\n    socklen_t alen;\n\n    /*Create server socket*/\n    SYSCHECK(sockfd = socket(AF_LOCAL, SOCK_STREAM, 0));\n\n    memset(&sockaddr, 0, sizeof(sockaddr));\n    sockaddr.sun_family = AF_LOCAL;\n    sockaddr.sun_path[0] = 0;\n    memcpy(sockaddr.sun_path + 1, name, strlen(name) );\n\n    alen = strlen(name) + offsetof(struct sockaddr_un, sun_path) + 1;\n    SYSCHECK(setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse_addr,sizeof(reuse_addr)));\n    if(bind(sockfd, (struct sockaddr *)&sockaddr, alen) < 0) {\n        close(sockfd);\n        dprintf(\"bind %s errno: %d (%s)\\n\", name, errno, strerror(errno));\n        return -1;\n    }\n\n    dprintf(\"local server: %s sockfd = %d\\n\", name, sockfd);\n    cfmakenoblock(sockfd);\n    listen(sockfd, 1);    \n\n    return sockfd;\n}\n\nstatic uint8_t alloc_qrtr_client_id(QRTR_PROXY_CONNECTION *qrtr_con, uint8_t QMIType) {\n    QRTR_PROXY_CLINET *qrtr_client = (QRTR_PROXY_CLINET *)malloc(sizeof(QRTR_PROXY_CLINET));\n\n    qlist_init(&qrtr_client->qnode);\n    qrtr_client->QMIType = QMIType;\n    qrtr_client->ClientId = alloc_client_id();\n    qrtr_client->node_id = 1;\n    qrtr_client->port_id = alloc_port_id();\n    qrtr_client->AccessTime = 0;\n\n    dprintf(\"+++ ClientFd=%d QMIType=%d ClientId=%d, node_id=%d, port_id=%d\\n\",\n        qrtr_con->ClientFd, qrtr_client->QMIType, qrtr_client->ClientId,\n        qrtr_client->node_id, qrtr_client->port_id);\n    qlist_add_tail(&qrtr_con->client_qnode, &qrtr_client->qnode);\n\n    return qrtr_client->ClientId;\n}\n\nstatic void release_qrtr_client_id(QRTR_PROXY_CONNECTION *qrtr_con, uint8_t QMIType, uint8_t ClientId) {\n    struct qlistnode *client_node;\n    int find = 0;\n\n    qlist_for_each (client_node, &qrtr_con->client_qnode) {\n        QRTR_PROXY_CLINET *qrtr_client = qnode_to_item(client_node, QRTR_PROXY_CLINET, qnode);\n        \n        if (QMIType == qrtr_client->QMIType && ClientId == qrtr_client->ClientId) {\n            dprintf(\"--- ClientFd=%d QMIType=%d ClientId=%d, node_id=%d, port_id=%d\\n\",\n                qrtr_con->ClientFd, qrtr_client->QMIType, qrtr_client->ClientId,\n                qrtr_client->node_id, qrtr_client->port_id);\n            ctrl_cmd_del_client(qrtr_client->node_id, qrtr_client->port_id, qrtr_client->QMIType);\n            free_client_id(qrtr_client->ClientId);\n            free_port_id(qrtr_client->port_id);\n            qlist_remove(&qrtr_client->qnode);\n            free(qrtr_client);\n            find++;\n            break;\n        }\n    }\n\n    if (!find) {\n        dprintf(\"NOT find on %s(ClientFd=%d, QMIType=%d, ClientId=%d)\\n\",\n            __func__, qrtr_con->ClientFd, QMIType, ClientId);\n    }\n}\n\nstatic void accept_qrtr_connection(int serverfd) {\n    int clientfd = -1;\n    unsigned char addr[128];\n    socklen_t alen = sizeof(addr);\n    QRTR_PROXY_CONNECTION *qrtr_con;\n\n    clientfd = accept(serverfd, (struct sockaddr *)addr, &alen);\n\n    qrtr_con = (QRTR_PROXY_CONNECTION *)malloc(sizeof(QRTR_PROXY_CONNECTION));\n    if (qrtr_con) {\n        qlist_init(&qrtr_con->qnode);\n        qlist_init(&qrtr_con->client_qnode);\n        qrtr_con->ClientFd= clientfd;\n        qrtr_con->AccessTime = 0;\n        dprintf(\"+++ ClientFd=%d\\n\", qrtr_con->ClientFd);\n        qlist_add_tail(&qrtr_proxy_connection, &qrtr_con->qnode);\n    }\n\n    cfmakenoblock(clientfd);\n}\n\nstatic void cleanup_qrtr_connection(int clientfd) {\n    struct qlistnode *con_node;\n    int find = 0;\n    \n    qlist_for_each(con_node, &qrtr_proxy_connection) {\n        QRTR_PROXY_CONNECTION *qrtr_con = qnode_to_item(con_node, QRTR_PROXY_CONNECTION, qnode);\n\n        if (qrtr_con->ClientFd == clientfd) {\n            while (!qlist_empty(&qrtr_con->client_qnode)) {\n                QRTR_PROXY_CLINET *qrtr_client = qnode_to_item(qlist_head(&qrtr_con->client_qnode), QRTR_PROXY_CLINET, qnode);\n\n                release_qrtr_client_id(qrtr_con, qrtr_client->QMIType, qrtr_client->ClientId);\n            }\n           \n            dprintf(\"--- ClientFd=%d\\n\", qrtr_con->ClientFd);    \n            close(qrtr_con->ClientFd);\n            qlist_remove(&qrtr_con->qnode);\n            free(qrtr_con);\n            find = 1;\n            break;\n        }\n    }\n\n    if (!find) {\n        dprintf(\"NOT find on %s(ClientFd=%d)\\n\", __func__, clientfd);\n    }\n}\n\nstatic void recv_qrtr_from_dev(struct qrtr_hdr_v1 *hdr) {\n    int find = 0;\n    uint32_t type = le32toh(hdr->type);\n\n    if (type == QRTR_TYPE_HELLO) {\n        send_ctrl_hello(le32toh(hdr->src_node_id), le32toh(hdr->src_port_id));\n        find++;\n    }\n    else if (type == QRTR_TYPE_NEW_SERVER || type == QRTR_TYPE_DEL_SERVER) {\n        handle_server_change(hdr);\n        find++;\n    }\n    else if (type == QRTR_TYPE_DATA) {\n        struct qlistnode *con_node, *client_node;\n\n        qlist_for_each(con_node, &qrtr_proxy_connection) {\n            QRTR_PROXY_CONNECTION *qrtr_con = qnode_to_item(con_node, QRTR_PROXY_CONNECTION, qnode);\n            \n            qlist_for_each(client_node, &qrtr_con->client_qnode) {\n                QRTR_PROXY_CLINET *qrtr_client = qnode_to_item(client_node, QRTR_PROXY_CLINET, qnode);\n\n                if (qrtr_client->node_id == le32toh(hdr->dst_node_id) && qrtr_client->port_id == le32toh(hdr->dst_port_id)) {\n                    PQCQMIMSG pQMI = (PQCQMIMSG)malloc(hdr->size + sizeof(QCQMI_HDR));\n\n                    if (pQMI) {\n                        pQMI->QMIHdr.IFType = USB_CTL_MSG_TYPE_QMI;\n                        pQMI->QMIHdr.Length = htole16(hdr->size + sizeof(QCQMI_HDR) - 1);\n                        pQMI->QMIHdr.CtlFlags = 0x00;\n                        pQMI->QMIHdr.QMIType = qrtr_client->QMIType;\n                        pQMI->QMIHdr.ClientId = qrtr_client->ClientId;\n                        memcpy(&pQMI->MUXMsg, hdr + 1, hdr->size);\n                        send_qmi_to_client(pQMI, qrtr_con->ClientFd);\n                        free(pQMI);\n                        find++;\n                    }\n                }\n            }\n        }\n\n        if (hdr->confirm_rx) {\n            struct qrtr_ctrl_pkt pkt;\n            struct sockaddr_qrtr from = {AF_QIPCRTR, le32toh(hdr->dst_node_id), le32toh(hdr->dst_port_id)};\n            struct sockaddr_qrtr to = {AF_QIPCRTR, le32toh(hdr->src_node_id), le32toh(hdr->src_port_id)};\n\n            memset(&pkt, 0, sizeof(pkt));\n            pkt.cmd = htole32(QRTR_TYPE_RESUME_TX);\n            pkt.client.node = hdr->dst_node_id;\n            pkt.client.port = hdr->dst_port_id;\n\n            qrtr_node_enqueue(&pkt, sizeof(pkt), QRTR_TYPE_RESUME_TX, &from, &to, 0);\n        }\n    }\n    else if (type == QRTR_TYPE_RESUME_TX) {\n    }\n\n    if (!find) {\n        dprintf(\"NOT find on %s()\\n\", __func__);\n    }    \n}\n\nstatic int recv_qmi_from_client(PQCQMIMSG pQMI, int clientfd) {\n    QRTR_PROXY_CONNECTION *qrtr_con;\n    struct qlistnode *con_node, *client_node;\n    int find = 0;\n\n    qlist_for_each(con_node, &qrtr_proxy_connection) {\n        qrtr_con = qnode_to_item(con_node, QRTR_PROXY_CONNECTION, qnode);\n        if (qrtr_con->ClientFd == clientfd)\n            break;\n        qrtr_con = NULL;\n    }\n\n    if (!qrtr_con) {\n        return -1;\n    }\n            \n    if (le16toh(pQMI->QMIHdr.QMIType) == QMUX_TYPE_CTL) {  \n        if (pQMI->CTLMsg.QMICTLMsgHdr.QMICTLType == QMICTL_SYNC_REQ) {\n            dprintf(\"do not allow client send QMICTL_SYNC_REQ\\n\");\n            return 0;\n        }\n        else if (le16toh(pQMI->CTLMsg.QMICTLMsgHdr.QMICTLType) == QMICTL_GET_CLIENT_ID_REQ) {\n            uint8_t QMIType = pQMI->CTLMsg.GetClientIdReq.QMIType;\n            PQCQMIMSG pRsp = (PQCQMIMSG)malloc(256);\n\n            if (pRsp) {\n                uint8_t ClientId = 0;\n\n                if (find_qrtr_service(QMIType)) {\n                    ClientId = alloc_qrtr_client_id(qrtr_con, QMIType);\n                }\n\n                pRsp->QMIHdr.IFType = USB_CTL_MSG_TYPE_QMI;\n                pRsp->QMIHdr.Length = htole16(sizeof(pRsp->CTLMsg.GetClientIdRsp) + sizeof(pRsp->QMIHdr) - 1);\n                pRsp->QMIHdr.CtlFlags = 0x00;\n                pRsp->QMIHdr.QMIType = QMUX_TYPE_CTL;\n                pRsp->QMIHdr.ClientId = 0;\n\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.CtlFlags = QMICTL_FLAG_RESPONSE;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TransactionId = pQMI->CTLMsg.QMICTLMsgHdr.TransactionId;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMICTLType = pQMI->CTLMsg.QMICTLMsgHdr.QMICTLType;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.Length = htole16(sizeof(pRsp->CTLMsg.GetClientIdRsp) - sizeof(pRsp->CTLMsg.QMICTLMsgHdr));\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TLVType = QCTLV_TYPE_RESULT_CODE;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TLVLength = htole16(4);\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMUXResult = htole16(ClientId ? 0 : QMI_RESULT_FAILURE);\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMUXError = htole16(ClientId ? 0 : QMI_ERR_INTERNAL);\n                pRsp->CTLMsg.GetClientIdRsp.TLV2Type = QCTLV_TYPE_REQUIRED_PARAMETER;\n                pRsp->CTLMsg.GetClientIdRsp.TLV2Length = htole16(2);\n                pRsp->CTLMsg.GetClientIdRsp.QMIType = QMIType;\n                pRsp->CTLMsg.GetClientIdRsp.ClientId = ClientId;\n\n                send_qmi_to_client(pRsp, clientfd);\n                free(pRsp);\n                find++;\n            }\n        }\n        else if (le16toh(pQMI->CTLMsg.QMICTLMsgHdr.QMICTLType) == QMICTL_RELEASE_CLIENT_ID_REQ) {\n            PQCQMIMSG pRsp = (PQCQMIMSG)malloc(256);\n            release_qrtr_client_id(qrtr_con, pQMI->CTLMsg.ReleaseClientIdReq.QMIType, pQMI->CTLMsg.ReleaseClientIdReq.ClientId);\n\n            if (pRsp) {\n                pRsp->QMIHdr.IFType = USB_CTL_MSG_TYPE_QMI;\n                pRsp->QMIHdr.Length = htole16(sizeof(pRsp->CTLMsg.ReleaseClientIdRsp) + sizeof(pRsp->QMIHdr) - 1);\n                pRsp->QMIHdr.CtlFlags = 0x00;\n                pRsp->QMIHdr.QMIType = QMUX_TYPE_CTL;\n                pRsp->QMIHdr.ClientId = 0;\n\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.CtlFlags = QMICTL_FLAG_RESPONSE;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TransactionId = pQMI->CTLMsg.QMICTLMsgHdr.TransactionId;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMICTLType = pQMI->CTLMsg.QMICTLMsgHdr.QMICTLType;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.Length = htole16(sizeof(pRsp->CTLMsg.ReleaseClientIdRsp) - sizeof(pRsp->CTLMsg.QMICTLMsgHdr));\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TLVType = QCTLV_TYPE_RESULT_CODE;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TLVLength = htole16(4);\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMUXResult = htole16(0);\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMUXError = htole16(0);\n                pRsp->CTLMsg.ReleaseClientIdRsp.TLV2Type = QCTLV_TYPE_REQUIRED_PARAMETER;\n                pRsp->CTLMsg.ReleaseClientIdRsp.TLV2Length = htole16(2);\n                pRsp->CTLMsg.ReleaseClientIdRsp.QMIType = pQMI->CTLMsg.ReleaseClientIdReq.QMIType;\n                pRsp->CTLMsg.ReleaseClientIdRsp.ClientId = pQMI->CTLMsg.ReleaseClientIdReq.ClientId;\n\n                send_qmi_to_client(pRsp, clientfd);\n                free(pRsp);\n                find++;\n            }\n        }\n        else if (le16toh(pQMI->CTLMsg.QMICTLMsgHdr.QMICTLType) == QMICTL_GET_VERSION_REQ) {\n            PQCQMIMSG pRsp = (PQCQMIMSG)malloc(256);\n\n            if (pRsp) {\n                pRsp->QMIHdr.IFType = USB_CTL_MSG_TYPE_QMI;\n                pRsp->QMIHdr.Length = htole16(sizeof(pRsp->CTLMsg.GetVersionRsp) + sizeof(pRsp->QMIHdr) - 1);\n                pRsp->QMIHdr.CtlFlags = 0x00;\n                pRsp->QMIHdr.QMIType = QMUX_TYPE_CTL;\n                pRsp->QMIHdr.ClientId = 0;\n\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.CtlFlags = QMICTL_FLAG_RESPONSE;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TransactionId = pQMI->CTLMsg.QMICTLMsgHdr.TransactionId;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMICTLType = pQMI->CTLMsg.QMICTLMsgHdr.QMICTLType;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.Length = htole16(sizeof(pRsp->CTLMsg.GetVersionRsp) - sizeof(pRsp->CTLMsg.QMICTLMsgHdr));\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TLVType = QCTLV_TYPE_RESULT_CODE;\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.TLVLength = htole16(4);\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMUXResult = htole16(0);\n                pRsp->CTLMsg.QMICTLMsgHdrRsp.QMUXError = htole16(0);\n                pRsp->CTLMsg.GetVersionRsp.TLV2Type = QCTLV_TYPE_REQUIRED_PARAMETER;\n                pRsp->CTLMsg.GetVersionRsp.TLV2Length = htole16(1);\n                pRsp->CTLMsg.GetVersionRsp.NumElements = 0;\n\n                send_qmi_to_client(pRsp, clientfd);\n                free(pRsp);\n                find++;\n            }\n        }\n    }\n    else {\n        qlist_for_each (client_node, &qrtr_con->client_qnode) {\n            QRTR_PROXY_CLINET *qrtr_client = qnode_to_item(client_node, QRTR_PROXY_CLINET, qnode);\n            \n            if (pQMI->QMIHdr.QMIType == qrtr_client->QMIType && pQMI->QMIHdr.ClientId == qrtr_client->ClientId) {\n                QRTR_SERVICE *srv = find_qrtr_service(pQMI->QMIHdr.QMIType);\n\n                if (srv && srv->service) {\n                    struct sockaddr_qrtr from = {AF_QIPCRTR, qrtr_client->node_id, qrtr_client->port_id};\n                    struct sockaddr_qrtr to = {AF_QIPCRTR, srv->node, srv->port};\n\n                    qrtr_node_enqueue(&pQMI->MUXMsg, le16toh(pQMI->QMIHdr.Length) + 1 - sizeof(QCQMI_HDR),\n                        QRTR_TYPE_DATA, &from, &to, 0);\n                    find++;\n                }\n                break;\n            }\n        }\n    }\n\n    if (!find) {\n        dprintf(\"NOT find on %s()\\n\", __func__);\n    } \n\n    return 0;\n}\n\nstatic int qrtr_proxy_init(void) {\n    unsigned i;\n    int qrtr_sync_done = 0;\n\n    dprintf(\"%s enter\\n\", __func__);\n    send_ctrl_hello(QRTR_NODE_BCAST, QRTR_PORT_CTRL);\n\n    for (i = 0; i < 10; i++) {\n        sleep(1);\n        qrtr_sync_done = !qlist_empty(&qrtr_server_list);\n        if (qrtr_sync_done)\n            break;\n    }\n\n    dprintf(\"%s %s\\n\", __func__, qrtr_sync_done ? \"succful\" : \"fail\");\n    return qrtr_sync_done ? 0 : -1;\n}\n\nstatic void qrtr_start_server(const char* servername) {\n    qrtr_proxy_server_fd = create_local_server(servername);\n    dprintf(\"qrtr_proxy_server_fd = %d\\n\", qrtr_proxy_server_fd);\n    if (qrtr_proxy_server_fd == -1) {\n        dprintf(\"Failed to create %s, errno: %d (%s)\\n\", servername, errno, strerror(errno));\n    }\n}\n\nstatic void qrtr_close_server(const char* servername) {\n    if (qrtr_proxy_server_fd != -1) {\n        dprintf(\"%s %s\\n\", __func__, servername);\n        close(qrtr_proxy_server_fd);\n        qrtr_proxy_server_fd = -1;\n    }\n}\n\nstatic void *qrtr_proxy_loop(void *param)\n{\n    void *rx_buf;\n    struct qlistnode *con_node;\n    QRTR_PROXY_CONNECTION *qrtr_con;\n\n    (void)param;\n    dprintf(\"%s enter thread_id %p\\n\", __func__, (void *)pthread_self());\n    \n    rx_buf = malloc(8192);\n    if (!rx_buf)\n        return NULL;\n\n    while (cdc_wdm_fd > 0 && qrtr_proxy_quit == 0) {\n        struct pollfd pollfds[32];\n        int ne, ret, nevents = 0;\n        ssize_t nreads;\n\n        pollfds[nevents].fd = cdc_wdm_fd;\n        pollfds[nevents].events = POLLIN;\n        pollfds[nevents].revents= 0;\n        nevents++;\n        \n        if (qrtr_proxy_server_fd > 0) {\n            pollfds[nevents].fd = qrtr_proxy_server_fd;\n            pollfds[nevents].events = POLLIN;\n            pollfds[nevents].revents= 0;\n            nevents++;\n        }\n\n        qlist_for_each(con_node, &qrtr_proxy_connection) {\n            qrtr_con = qnode_to_item(con_node, QRTR_PROXY_CONNECTION, qnode);\n            \n            pollfds[nevents].fd = qrtr_con->ClientFd;\n            pollfds[nevents].events = POLLIN;\n            pollfds[nevents].revents= 0;\n            nevents++;\n\n            if (nevents == (sizeof(pollfds)/sizeof(pollfds[0])))\n                break;\n        }\n\n        do {\n            //ret = poll(pollfds, nevents, -1);\n            ret = poll(pollfds, nevents, (qrtr_proxy_server_fd > 0) ? -1 : 200);\n         } while (ret == -1 && errno == EINTR && qrtr_proxy_quit == 0);\n         \n        if (ret < 0) {\n            dprintf(\"%s poll=%d, errno: %d (%s)\\n\", __func__, ret, errno, strerror(errno));\n            goto qrtr_proxy_loop_exit;\n        }\n\n        for (ne = 0; ne < nevents; ne++) {\n            int fd = pollfds[ne].fd;\n            short revents = pollfds[ne].revents;\n\n            if (revents & (POLLERR | POLLHUP | POLLNVAL)) {\n                dprintf(\"%s poll fd = %d, revents = %04x\\n\", __func__, fd, revents);\n                if (fd == cdc_wdm_fd) {\n                    goto qrtr_proxy_loop_exit;\n                }\n                else if (fd == qrtr_proxy_server_fd) {\n                \n                }\n                else {\n                    cleanup_qrtr_connection(fd);\n                }\n\n                continue;\n            }\n\n            if (!(pollfds[ne].revents & POLLIN)) {\n                continue;\n            }\n\n            if (fd == qrtr_proxy_server_fd) {\n                accept_qrtr_connection(fd);\n            }\n            else if (fd == cdc_wdm_fd) {\n                struct qrtr_hdr_v1 *hdr = (struct qrtr_hdr_v1 *)rx_buf;\n\n                nreads = read(fd, rx_buf, 8192);\n                if (nreads <= 0) {\n                    dprintf(\"%s read=%d errno: %d (%s)\\n\",  __func__, (int)nreads, errno, strerror(errno));\n                    goto qrtr_proxy_loop_exit;\n                }\n                else if (nreads != (int)align_4(le32toh(hdr->size) + sizeof(*hdr))) {\n                    dprintf(\"%s nreads=%d,  hdr->size = %d\\n\",  __func__, (int)nreads, le32toh(hdr->size));\n                    continue;\n                }\n\n                dump_qrtr(hdr, nreads, '<');\n                recv_qrtr_from_dev(hdr);\n            }\n            else {\n                PQCQMIMSG pQMI = (PQCQMIMSG)rx_buf;\n\n                nreads = read(fd, rx_buf, 8192);\n                if (nreads <= 0) {\n                    dprintf(\"%s read=%d errno: %d (%s)\",  __func__, (int)nreads, errno, strerror(errno));\n                    cleanup_qrtr_connection(fd);\n                    break;\n                }\n                else if (nreads != (le16toh(pQMI->QMIHdr.Length) + 1)) {\n                    dprintf(\"%s nreads=%d,  pQCQMI->QMIHdr.Length = %d\\n\",  __func__, (int)nreads, le16toh(pQMI->QMIHdr.Length));\n                    continue;\n                }\n\n                recv_qmi_from_client(pQMI, fd);\n            }\n        }\n    }\n\nqrtr_proxy_loop_exit:\n    while (!qlist_empty(&qrtr_proxy_connection)) {\n        QRTR_PROXY_CONNECTION *qrtr_con = qnode_to_item(qlist_head(&qrtr_proxy_connection), QRTR_PROXY_CONNECTION, qnode);\n\n        cleanup_qrtr_connection(qrtr_con->ClientFd);\n    }\n    \n    dprintf(\"%s exit, thread_id %p\\n\", __func__, (void *)pthread_self());\n    free(rx_buf);\n\n    return NULL;\n}\n\nstatic void usage(void) {\n    dprintf(\" -d <device_name>                      A valid qrtr device\\n\"\n            \"                                       default /dev/mhi_IPCR, but mhi_IPCR may be invalid\\n\"\n            \" -i <netcard_name>                     netcard name\\n\"\n            \" -v                                    Will show all details\\n\");\n}\n\nstatic void sig_action(int sig) {\n    if (qrtr_proxy_quit == 0) {\n        qrtr_proxy_quit = 1;\n        if (thread_id)\n            pthread_kill(thread_id, sig);\n    }\n}\n\nint main(int argc, char *argv[]) {\n    int opt;\n    char cdc_wdm[32+1] = \"/dev/mhi_IPCR\";\n    char servername[64] = {0};\n\n    signal(SIGINT, sig_action);\n    signal(SIGTERM, sig_action);\n\n    optind = 1;\n    while ( -1 != (opt = getopt(argc, argv, \"d:i:vh\"))) {\n        switch (opt) {\n            case 'd':\n                strcpy(cdc_wdm, optarg);\n                break;\n            case 'v':\n                verbose_debug = 1;\n                break;\n            default:\n                usage();\n                return 0;\n        }\n    }\n\n    sprintf(servername, \"quectel-qrtr-proxy%c\", cdc_wdm[strlen(cdc_wdm)-1]);\n    dprintf(\"Will use cdc-wdm='%s', proxy='%s'\\n\", cdc_wdm, servername);\n\n    while (qrtr_proxy_quit == 0) {\n        cdc_wdm_fd = open(cdc_wdm, O_RDWR | O_NONBLOCK | O_NOCTTY);\n        if (cdc_wdm_fd == -1) {\n            dprintf(\"Failed to open %s, errno: %d (%s)\\n\", cdc_wdm, errno, strerror(errno));\n            sleep(5);\n            continue;\n        }\n        cfmakenoblock(cdc_wdm_fd);\n        qlist_init(&qrtr_proxy_connection);\n        qlist_init(&qrtr_server_list);\n        pthread_create(&thread_id, NULL, qrtr_proxy_loop, NULL);\n\n        if (qrtr_proxy_init() == 0) {\n            qrtr_start_server(servername);\n            pthread_join(thread_id, NULL);\n            qrtr_close_server(servername);\n        }\n        else {\n            pthread_cancel(thread_id);\n            pthread_join(thread_id, NULL);\n        }\n\n        close(cdc_wdm_fd);\n    }\n\n    return 0;\n}\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/rmnetctl.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software. \r\n    Under no circumstances may customers modify, demonstrate, use, deliver \r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n//https://source.codeaurora.org/quic/la/platform/vendor/qcom-opensource/dataservices/tree/rmnetctl\r\n#include <sys/socket.h>\r\n#include <stdint.h>\r\n#include <linux/netlink.h>\r\n#include <string.h>\r\n#include <stdio.h>\r\n#include <unistd.h>\r\n#include <stdlib.h>\r\n#include <errno.h>\r\n#include <linux/rtnetlink.h>\r\n#include <linux/gen_stats.h>\r\n#include <net/if.h>\r\n#include <asm/types.h>\r\n#include <linux/rmnet_data.h>\r\n#include \"QMIThread.h\"\r\n\r\n#undef RMNET_EGRESS_FORMAT_AGGREGATION //QSDK SPF11.4\r\n#define RMNET_EGRESS_FORMAT_AGGREGATION         (1U << 31)\r\n#ifndef RMNET_FLAGS_INGRESS_MAP_CKSUMV5\r\n#define RMNET_FLAGS_INGRESS_MAP_CKSUMV5           (1U << 5)\n#define RMNET_FLAGS_EGRESS_MAP_CKSUMV5            (1U << 6)\n#endif\r\n\r\n#define RMNETCTL_SUCCESS 0\r\n#define RMNETCTL_LIB_ERR 1\r\n#define RMNETCTL_KERNEL_ERR 2\r\n#define RMNETCTL_INVALID_ARG 3\r\n\r\n#define CONFIG_QRTR_IPQ_NSS_OFFLOAD //defined for ipq nss offload support\r\n\r\nenum rmnetctl_error_codes_e {\r\n    RMNETCTL_API_SUCCESS = 0,\r\n\r\n    RMNETCTL_API_FIRST_ERR = 1,\r\n    RMNETCTL_API_ERR_MESSAGE_SEND = 3,\r\n    RMNETCTL_API_ERR_MESSAGE_RECEIVE = 4,\r\n\r\n    RMNETCTL_INIT_FIRST_ERR = 5,\r\n    RMNETCTL_INIT_ERR_PROCESS_ID = RMNETCTL_INIT_FIRST_ERR,\r\n    RMNETCTL_INIT_ERR_NETLINK_FD = 6,\r\n    RMNETCTL_INIT_ERR_BIND = 7,\r\n\r\n    RMNETCTL_API_SECOND_ERR = 9,\r\n    RMNETCTL_API_ERR_HNDL_INVALID = RMNETCTL_API_SECOND_ERR,\r\n    RMNETCTL_API_ERR_RETURN_TYPE = 13,\r\n\r\n    RMNETCTL_API_THIRD_ERR = 25,\r\n    /* Failed to copy data into netlink message */\r\n    RMNETCTL_API_ERR_RTA_FAILURE = RMNETCTL_API_THIRD_ERR,\r\n};\r\n\r\nstruct rmnetctl_hndl_s {\r\n     uint32_t pid;\r\n     uint32_t transaction_id;\r\n     int netlink_fd;\r\n     struct sockaddr_nl src_addr, dest_addr;\r\n};\r\ntypedef struct rmnetctl_hndl_s rmnetctl_hndl_t;\r\n\r\n#define NLMSG_TAIL(nmsg) \\\r\n    ((struct rtattr *) (((char *)(nmsg)) + NLMSG_ALIGN((nmsg)->nlmsg_len)))\r\n\r\nstruct nlmsg {\r\n    struct nlmsghdr nl_addr;\r\n    struct ifinfomsg ifmsg;\r\n    char data[500];\r\n};\r\n\r\n#define MIN_VALID_PROCESS_ID 0\r\n#define MIN_VALID_SOCKET_FD 0\r\n#define KERNEL_PROCESS_ID 0\r\n#define UNICAST 0\r\n\r\n/* IFLA Attributes for the RT RmNet driver */\r\nenum {\r\n    RMNETCTL_IFLA_UNSPEC,\r\n    RMNETCTL_IFLA_MUX_ID,\r\n    RMNETCTL_IFLA_FLAGS,\r\n    RMNETCTL_IFLA_DFC_QOS,\r\n    RMNETCTL_IFLA_UPLINK_PARAMS,\r\n    RMNETCTL_IFLA_NSS_OFFLOAD,\r\n    __RMNETCTL_IFLA_MAX,\r\n};\r\n\r\nstruct rmnetctl_uplink_params {\r\n    uint16_t byte_count;\r\n    uint8_t packet_count;\r\n    uint8_t features;\r\n    uint32_t time_limit;\r\n};\r\n\r\nstatic void rta_parse(struct rtattr **tb, int maxtype, struct rtattr *head,\r\n              int len)\r\n{\r\n    struct rtattr *rta;\r\n\r\n    memset(tb, 0, sizeof(struct rtattr *) * maxtype);\r\n    for (rta = head; RTA_OK(rta, len);\r\n         rta = RTA_NEXT(rta, len)) {\r\n        __u16 type = rta->rta_type & NLA_TYPE_MASK;\r\n\r\n        if (type > 0 && type < maxtype)\r\n            tb[type] = rta;\r\n    }\r\n}\r\n\r\nstatic struct rtattr *rta_find(struct rtattr *rta, int attrlen, uint16_t type)\r\n{\r\n    for (; RTA_OK(rta, attrlen); rta = RTA_NEXT(rta, attrlen)) {\r\n        if (rta->rta_type == (type & NLA_TYPE_MASK))\r\n            return rta;\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\nstatic struct rtattr * rta_put(struct nlmsg *req,int type, int len, void *data)\r\n{\r\n    struct rtattr *attrinfo = NLMSG_TAIL(&req->nl_addr);\r\n\r\n    attrinfo->rta_type = type;\r\n    attrinfo->rta_len = RTA_ALIGN(RTA_LENGTH(len));\r\n    if (data && len)\r\n        memcpy(RTA_DATA(attrinfo), data, len);\r\n    req->nl_addr.nlmsg_len = NLMSG_ALIGN(req->nl_addr.nlmsg_len) +\r\n                RTA_ALIGN(RTA_LENGTH(len));\r\n    return attrinfo;\r\n}\r\n\r\nstatic int rmnet_get_ack(rmnetctl_hndl_t *hndl, uint16_t *error_code)\r\n{\r\n    struct nlack {\r\n        struct nlmsghdr ackheader;\r\n        struct nlmsgerr ackdata;\r\n        char   data[256];\r\n\r\n    } ack;\r\n    int i;\r\n\r\n    if (!hndl || !error_code)\r\n        return RMNETCTL_INVALID_ARG;\r\n\r\n    if ((i = recv(hndl->netlink_fd, &ack, sizeof(ack), 0)) < 0) {\r\n        *error_code = errno;\r\n        return RMNETCTL_API_ERR_MESSAGE_RECEIVE;\r\n    }\r\n\r\n    /*Ack should always be NLMSG_ERROR type*/\r\n    if (ack.ackheader.nlmsg_type == NLMSG_ERROR) {\r\n        if (ack.ackdata.error == 0) {\r\n            *error_code = RMNETCTL_API_SUCCESS;\r\n            return RMNETCTL_SUCCESS;\r\n        } else {\r\n            *error_code = -ack.ackdata.error;\r\n            return RMNETCTL_KERNEL_ERR;\r\n        }\r\n    }\r\n\r\n    *error_code = RMNETCTL_API_ERR_RETURN_TYPE;\r\n    return RMNETCTL_API_FIRST_ERR;\r\n}\r\n\r\nstatic int rtrmnet_ctl_init(rmnetctl_hndl_t **hndl, uint16_t *error_code)\r\n{\r\n    struct sockaddr_nl __attribute__((__may_alias__)) *saddr_ptr;\r\n    int netlink_fd = -1;\r\n    pid_t pid = 0;\r\n\r\n    if (!hndl || !error_code)\r\n        return RMNETCTL_INVALID_ARG;\r\n\r\n    *hndl = (rmnetctl_hndl_t *)malloc(sizeof(rmnetctl_hndl_t));\r\n    if (!*hndl) {\r\n        *error_code = RMNETCTL_API_ERR_HNDL_INVALID;\r\n        return RMNETCTL_LIB_ERR;\r\n    }\r\n\r\n    memset(*hndl, 0, sizeof(rmnetctl_hndl_t));\r\n\r\n    pid = getpid();\r\n    if (pid  < MIN_VALID_PROCESS_ID) {\r\n        free(*hndl);\r\n        *error_code = RMNETCTL_INIT_ERR_PROCESS_ID;\r\n        return RMNETCTL_LIB_ERR;\r\n    }\r\n    (*hndl)->pid = KERNEL_PROCESS_ID;\r\n    netlink_fd = socket(AF_NETLINK, SOCK_RAW, NETLINK_ROUTE);\r\n    if (netlink_fd < MIN_VALID_SOCKET_FD) {\r\n        free(*hndl);\r\n        *error_code = RMNETCTL_INIT_ERR_NETLINK_FD;\r\n        return RMNETCTL_LIB_ERR;\r\n    }\r\n\r\n    (*hndl)->netlink_fd = netlink_fd;\r\n\r\n    memset(&(*hndl)->src_addr, 0, sizeof(struct sockaddr_nl));\r\n\r\n    (*hndl)->src_addr.nl_family = AF_NETLINK;\r\n    (*hndl)->src_addr.nl_pid = (*hndl)->pid;\r\n\r\n    saddr_ptr = &(*hndl)->src_addr;\r\n    if (bind((*hndl)->netlink_fd,\r\n        (struct sockaddr *)saddr_ptr,\r\n        sizeof(struct sockaddr_nl)) < 0) {\r\n        close((*hndl)->netlink_fd);\r\n        free(*hndl);\r\n        *error_code = RMNETCTL_INIT_ERR_BIND;\r\n        return RMNETCTL_LIB_ERR;\r\n    }\r\n\r\n    memset(&(*hndl)->dest_addr, 0, sizeof(struct sockaddr_nl));\r\n\r\n    (*hndl)->dest_addr.nl_family = AF_NETLINK;\r\n    (*hndl)->dest_addr.nl_pid = KERNEL_PROCESS_ID;\r\n    (*hndl)->dest_addr.nl_groups = UNICAST;\r\n\r\n    return RMNETCTL_SUCCESS;\r\n}\r\n\r\nstatic int rtrmnet_ctl_deinit(rmnetctl_hndl_t *hndl)\r\n{\r\n    if (!hndl)\r\n        return RMNETCTL_SUCCESS;\r\n\r\n    close(hndl->netlink_fd);\r\n    free(hndl);\r\n\r\n    return RMNETCTL_SUCCESS;\r\n}\r\n\r\nstatic int rtrmnet_ctl_newvnd(rmnetctl_hndl_t *hndl, char *devname, char *vndname,\r\n               uint16_t *error_code, uint8_t  index,\r\n               uint32_t flagconfig, uint32_t ul_agg_cnt, uint32_t ul_agg_size)\r\n{\r\n    struct rtattr *datainfo, *linkinfo;\r\n    struct ifla_vlan_flags flags;\r\n    int devindex;\r\n    char *kind = \"rmnet\";\r\n    struct nlmsg req;\r\n    short id;\r\n\r\n    if (!hndl || !devname || !vndname || !error_code)\r\n        return RMNETCTL_INVALID_ARG;\r\n\r\n    memset(&req, 0, sizeof(req));\r\n    req.nl_addr.nlmsg_type = RTM_NEWLINK;\r\n    req.nl_addr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));\r\n    req.nl_addr.nlmsg_flags = NLM_F_REQUEST | NLM_F_CREATE | NLM_F_EXCL |\r\n                  NLM_F_ACK;\r\n    req.nl_addr.nlmsg_seq = hndl->transaction_id;\r\n    hndl->transaction_id++;\r\n\r\n    /* Get index of devname*/\r\n    devindex = if_nametoindex(devname);\r\n    if (devindex < 0) {\r\n        *error_code = errno;\r\n        return RMNETCTL_KERNEL_ERR;\r\n    }\r\n\r\n    /* Setup link attr with devindex as data */\r\n    rta_put(&req, IFLA_LINK, sizeof(devindex), &devindex);\r\n    rta_put(&req, IFLA_IFNAME, strlen(vndname) + 1, vndname);\r\n\r\n    /* Set up IFLA info kind  RMNET that has linkinfo and type */\r\n    linkinfo = rta_put(&req, IFLA_LINKINFO, 0, NULL);\r\n    rta_put(&req, IFLA_INFO_KIND, strlen(kind), kind);\r\n\r\n    datainfo = rta_put(&req, IFLA_INFO_DATA, 0, NULL);\r\n    id = index;\r\n    rta_put(&req, RMNETCTL_IFLA_MUX_ID, sizeof(id), &id);\r\n\r\n    if (flagconfig != 0) {\r\n        flags.mask  = flagconfig;\r\n        flags.flags = flagconfig;\r\n\r\n        rta_put(&req, RMNETCTL_IFLA_FLAGS, sizeof(flags), &flags);\r\n    }\r\n\r\n#ifdef CONFIG_QRTR_IPQ_NSS_OFFLOAD\r\n    if (!access(\"/sys/module/rmnet_nss/\", F_OK)) {\r\n        uint8_t offload = 1;\r\n\r\n        rta_put(&req, RMNETCTL_IFLA_NSS_OFFLOAD, sizeof(offload), &offload);\r\n    }\r\n#endif\r\n\r\n    if (ul_agg_cnt > 1) {\r\n            struct rmnetctl_uplink_params ul_agg;\r\n\r\n            ul_agg.byte_count = ul_agg_size;\r\n            ul_agg.packet_count = ul_agg_cnt;\r\n            ul_agg.features = 0;\r\n            ul_agg.time_limit = 3000000;\r\n\r\n            rta_put(&req, RMNETCTL_IFLA_UPLINK_PARAMS, sizeof(ul_agg), &ul_agg);\r\n    }\r\n\r\n    datainfo->rta_len = (char *)NLMSG_TAIL(&req.nl_addr) - (char *)datainfo;\r\n    linkinfo->rta_len = (char *)NLMSG_TAIL(&req.nl_addr) - (char *)linkinfo;\r\n\r\n    if (send(hndl->netlink_fd, &req, req.nl_addr.nlmsg_len, 0) < 0) {\r\n        *error_code = RMNETCTL_API_ERR_MESSAGE_SEND;\r\n        return RMNETCTL_LIB_ERR;\r\n    }\r\n\r\n    return rmnet_get_ack(hndl, error_code);\r\n}\r\n\r\nint rtrmnet_ctl_new_vnd(char *devname, char *vndname, uint8_t muxid,\r\n               uint32_t qmap_version, uint32_t ul_agg_cnt, uint32_t ul_agg_size)\r\n{\r\n    struct rmnetctl_hndl_s *handle;\r\n    uint16_t error_code;\r\n    int return_code;\r\n    uint32_t flagconfig = RMNET_FLAGS_INGRESS_DEAGGREGATION;\r\n\r\n    dbg_time(\"%s dev: %s, vnd: %s, muxid: %d, qmap_version: %d\",\r\n        __func__, devname, vndname, muxid, qmap_version);\r\n\r\n    if (ul_agg_cnt > 1)\r\n        flagconfig |= RMNET_EGRESS_FORMAT_AGGREGATION;\r\n\r\n    if (qmap_version == 9) { //QMAPV5\r\n        flagconfig |= RMNET_FLAGS_INGRESS_MAP_CKSUMV5;\r\n        flagconfig |= RMNET_FLAGS_EGRESS_MAP_CKSUMV5;\r\n    }\r\n    else if (qmap_version == 5) { //QMAPV1\r\n    }\r\n    else {\r\n        dbg_time(\"%s donot support qmap_version %d\\n\", __func__, qmap_version);\r\n        return -1001;\r\n    }\r\n    \r\n    return_code = rtrmnet_ctl_init(&handle, &error_code);\r\n    if (return_code != RMNETCTL_SUCCESS) {\r\n        dbg_time(\"rtrmnet_ctl_init error_code: %d, return_code: %d, errno: %d (%s)\",\r\n            error_code, return_code, errno, strerror(errno));\r\n    }\r\n\r\n    return_code = rtrmnet_ctl_newvnd(handle, devname, vndname, &error_code,\r\n        muxid, flagconfig, ul_agg_cnt, ul_agg_size);\r\n    if (return_code == RMNETCTL_KERNEL_ERR)\r\n        dbg_time(\"rtrmnet_ctl_newvnd RMNETCTL_KERNEL_ERR errno: %d (%s)\",\r\n            error_code, strerror(error_code));\r\n    else if (return_code != RMNETCTL_SUCCESS) {\r\n        dbg_time(\"rtrmnet_ctl_newvnd error_code: %d, return_code: %d\",\r\n            error_code, return_code);\r\n    }\r\n\r\n    rtrmnet_ctl_deinit(handle);\r\n\r\n    return return_code;\r\n}\r\n\r\nstatic int rtrmnet_ctl_getvnd(rmnetctl_hndl_t *hndl, char *vndname,\r\n               uint16_t *error_code, uint16_t *mux_id,\r\n               uint32_t *flagconfig, struct rmnetctl_uplink_params *ul_agg)\r\n{\r\n    struct nlmsg req;\r\n    struct nlmsghdr *resp;\r\n    struct rtattr *attrs, *linkinfo, *datainfo;\r\n    struct rtattr *tb[__RMNETCTL_IFLA_MAX];\r\n    unsigned int devindex = 0;\r\n    int resp_len;\r\n\r\n    memset(&req, 0, sizeof(req));\r\n\r\n    if (!hndl || !vndname || !error_code || !(mux_id || flagconfig))\r\n        return RMNETCTL_INVALID_ARG;\r\n\r\n    req.nl_addr.nlmsg_type = RTM_GETLINK;\r\n    req.nl_addr.nlmsg_len = NLMSG_LENGTH(sizeof(struct ifinfomsg));\r\n    req.nl_addr.nlmsg_flags = NLM_F_REQUEST;\r\n    req.nl_addr.nlmsg_seq = hndl->transaction_id;\r\n    hndl->transaction_id++;\r\n\r\n    /* Get index of vndname */\r\n    devindex = if_nametoindex(vndname);\r\n    if (devindex == 0) {\r\n        *error_code = errno;\r\n        return RMNETCTL_KERNEL_ERR;\r\n    }\r\n\r\n    req.ifmsg.ifi_index = devindex;\r\n    if (send(hndl->netlink_fd, &req, req.nl_addr.nlmsg_len, 0) < 0) {\r\n        *error_code = RMNETCTL_API_ERR_MESSAGE_SEND;\r\n        return RMNETCTL_LIB_ERR;\r\n    }\r\n\r\n    resp_len = recv(hndl->netlink_fd, NULL, 0, MSG_PEEK | MSG_TRUNC);\r\n    if (resp_len < 0) {\r\n        *error_code = errno;\r\n        return RMNETCTL_API_ERR_MESSAGE_RECEIVE;\r\n    }\r\n\r\n    resp = malloc((size_t)resp_len);\r\n    if (!resp) {\r\n        *error_code = errno;\r\n        return RMNETCTL_LIB_ERR;\r\n    }\r\n\r\n    resp_len = recv(hndl->netlink_fd, (char *)resp, (size_t)resp_len, 0);\r\n    if (resp_len < 0) {\r\n        *error_code = errno;\r\n        free(resp);\r\n        return RMNETCTL_API_ERR_MESSAGE_RECEIVE;\r\n    }\r\n\r\n    /* Parse out the RT attributes */\r\n    attrs = (struct rtattr *)((char *)NLMSG_DATA(resp) + NLMSG_ALIGN(sizeof(req.ifmsg)));\r\n    linkinfo = rta_find(attrs, NLMSG_PAYLOAD(resp, sizeof(req.ifmsg)), IFLA_LINKINFO);\r\n    if (!linkinfo) {\r\n        free(resp);\r\n        *error_code = RMNETCTL_API_ERR_RTA_FAILURE;\r\n        return RMNETCTL_KERNEL_ERR;\r\n    }\r\n\r\n    datainfo = rta_find(RTA_DATA(linkinfo), RTA_PAYLOAD(linkinfo), IFLA_INFO_DATA);\r\n    if (!datainfo) {\r\n        free(resp);\r\n        *error_code = RMNETCTL_API_ERR_RTA_FAILURE;\r\n        return RMNETCTL_KERNEL_ERR;\r\n    }\r\n\r\n    /* Parse all the rmnet-specific information from the kernel */\r\n    rta_parse(tb, __RMNETCTL_IFLA_MAX, RTA_DATA(datainfo), RTA_PAYLOAD(datainfo));\r\n    if (tb[RMNETCTL_IFLA_MUX_ID] && mux_id) {\r\n        *mux_id = *((uint16_t *)RTA_DATA(tb[RMNETCTL_IFLA_MUX_ID]));\r\n        dbg_time(\"\\tMux id: %d\", *mux_id);\r\n    }\r\n\r\n    if (tb[RMNETCTL_IFLA_FLAGS] && flagconfig) {\r\n        struct ifla_vlan_flags *flags;\r\n\r\n        flags = (struct ifla_vlan_flags *)RTA_DATA(tb[RMNETCTL_IFLA_FLAGS]);\r\n        *flagconfig = flags->flags;\r\n        dbg_time(\"\\tData format: 0x%x\", *flagconfig);\r\n    }\r\n\r\n    if (tb[RMNETCTL_IFLA_UPLINK_PARAMS]) {\r\n        *ul_agg = *(struct rmnetctl_uplink_params *)\r\n        RTA_DATA(tb[RMNETCTL_IFLA_UPLINK_PARAMS]);\r\n\r\n        dbg_time(\"\\tUplink Aggregation parameters:\");\r\n        dbg_time(\"\\t\\tPacket limit: %u\", ul_agg->packet_count);\r\n        dbg_time(\"\\t\\tByte limit: %u\", ul_agg->byte_count);\r\n        dbg_time(\"\\t\\tTime limit (ns): %u\", ul_agg->time_limit);\r\n        dbg_time(\"\\t\\tFeatures : 0x%x\", ul_agg->features);\r\n    }\r\n\r\n    free(resp);\r\n    return RMNETCTL_API_SUCCESS;\r\n}\r\n\r\nint rtrmnet_ctl_get_vnd(char *vndname, int *muxid, int *qmap_version)\r\n{\r\n    struct rmnetctl_hndl_s *handle;\r\n    uint16_t error_code;\r\n    int return_code;\r\n    uint32_t flagconfig = 0;\r\n    uint16_t mux_id = 0;\r\n    struct rmnetctl_uplink_params ul_agg;\r\n\r\n    dbg_time(\"%s vnd: %s\", __func__, vndname);\r\n    \r\n    return_code = rtrmnet_ctl_init(&handle, &error_code);\r\n    if (return_code != RMNETCTL_SUCCESS) {\r\n        dbg_time(\"rtrmnet_ctl_init error_code: %d, return_code: %d, errno: %d (%s)\",\r\n            error_code, return_code, errno, strerror(errno));\r\n        return -1;\r\n    }\r\n\r\n    // rmnetcli -n getlink rmnet_data0\r\n    return_code = rtrmnet_ctl_getvnd(handle, /*devname, */vndname, &error_code,\r\n        &mux_id, &flagconfig, &ul_agg);\r\n    if (return_code == RMNETCTL_KERNEL_ERR)\r\n        dbg_time(\"rtrmnet_ctl_uplinkparam RMNETCTL_KERNEL_ERR errno: %d (%s)\",\r\n                error_code, strerror(error_code));\r\n    else if (return_code != RMNETCTL_SUCCESS) {\r\n        dbg_time(\"rtrmnet_ctl_uplinkparam error_code: %d, return_code: %d\",\r\n                error_code, return_code);\r\n    }\r\n    rtrmnet_ctl_deinit(handle);\r\n\r\n    if (return_code == RMNETCTL_SUCCESS) {\r\n        *muxid = mux_id;\r\n        if (flagconfig&RMNET_FLAGS_INGRESS_DEAGGREGATION) {\r\n            if ((flagconfig&RMNET_FLAGS_INGRESS_MAP_CKSUMV5) && (flagconfig&RMNET_FLAGS_EGRESS_MAP_CKSUMV5))\r\n                *qmap_version = 9; //QMAPV5\r\n            else\r\n                *qmap_version = 5; //QMAPV1\r\n        }\r\n    }\r\n\r\n    return return_code;\r\n}\r\n\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/udhcpc.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software. \r\n    Under no circumstances may customers modify, demonstrate, use, deliver \r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include <sys/socket.h>\r\n#include <sys/select.h>\r\n#include <sys/types.h>\r\n#include <net/if.h>\r\n#include <sys/socket.h>\r\n#include <netinet/in.h>\r\n#include <arpa/inet.h>\r\n#include <endian.h>\r\n\r\n#include \"util.h\"\r\n#include \"QMIThread.h\"\r\nextern int ql_get_netcard_carrier_state(const char *devname);\r\n\r\nstatic __inline in_addr_t qmi2addr(uint32_t __x) {\r\n    return (__x>>24) | (__x>>8&0xff00) | (__x<<8&0xff0000) | (__x<<24);\r\n}\r\n\r\nstatic int ql_system(const char *shell_cmd) {\r\n    dbg_time(\"%s\", shell_cmd);\r\n    return system(shell_cmd);\r\n}\r\n\r\nstatic void ifc_init_ifr(const char *name, struct ifreq *ifr)\r\n{\r\n    memset(ifr, 0, sizeof(struct ifreq));\r\n    no_trunc_strncpy(ifr->ifr_name, name, IFNAMSIZ);\r\n    ifr->ifr_name[IFNAMSIZ - 1] = 0;\r\n}\r\n\r\nstatic void ql_set_mtu(const char *ifname, int ifru_mtu) {\r\n    int inet_sock;\r\n    struct ifreq ifr;\r\n\r\n    inet_sock = socket(AF_INET, SOCK_DGRAM, 0);\r\n\r\n    if (inet_sock > 0) {\r\n        ifc_init_ifr(ifname, &ifr);\r\n\r\n        if (!ioctl(inet_sock, SIOCGIFMTU, &ifr)) {\r\n            if (ifr.ifr_ifru.ifru_mtu != ifru_mtu) {\r\n                dbg_time(\"change mtu %d -> %d\", ifr.ifr_ifru.ifru_mtu , ifru_mtu);\r\n                ifr.ifr_ifru.ifru_mtu = ifru_mtu;\r\n                ioctl(inet_sock, SIOCSIFMTU, &ifr);\r\n            }\r\n        }\r\n\r\n        close(inet_sock);\r\n    }\r\n}\r\n\r\nstatic int ifc_get_addr(const char *name, in_addr_t *addr)\r\n{\r\n    int inet_sock;\r\n    struct ifreq ifr;\r\n    int ret = 0;\r\n\r\n    inet_sock = socket(AF_INET, SOCK_DGRAM, 0);\r\n\r\n    ifc_init_ifr(name, &ifr);\r\n    if (addr != NULL) {\r\n        ret = ioctl(inet_sock, SIOCGIFADDR, &ifr);\r\n        if (ret < 0) {\r\n            *addr = 0;\r\n        } else {\r\n            *addr = ((struct sockaddr_in*) &ifr.ifr_addr)->sin_addr.s_addr;\r\n        }\r\n    }\r\n    close(inet_sock);\r\n    return ret;\r\n}\r\n\r\nstatic short ifc_get_flags(const char *ifname)\r\n{\r\n    int inet_sock;\r\n    struct ifreq ifr;\r\n    int ret = 0;\r\n\r\n    inet_sock = socket(AF_INET, SOCK_DGRAM, 0);\r\n\r\n    if (inet_sock > 0) {\r\n        ifc_init_ifr(ifname, &ifr);\r\n\r\n        if (!ioctl(inet_sock, SIOCGIFFLAGS, &ifr)) {\r\n            ret = ifr.ifr_ifru.ifru_flags;\r\n        }\r\n\r\n        close(inet_sock);\r\n    }\r\n\r\n    return ret;\r\n}\r\n\r\nstatic void ifc_set_state(const char *ifname, int state) {\r\n    char shell_cmd[128];\r\n\r\n    if (!access(\"/sbin/ip\", X_OK)) {\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip link set dev %s %s\", ifname, state ? \"up\" : \"down\");\r\n    } else {\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ifconfig %s %s\", ifname, state ? \"up\" : \"down\");\r\n    }\r\n    ql_system(shell_cmd);\r\n}\r\n\r\nstatic int ql_netcard_ipv4_address_check(const char *ifname, in_addr_t ip) {\r\n    in_addr_t addr = 0;\r\n\r\n    ifc_get_addr(ifname, &addr);\r\n    return addr == ip;\r\n}\r\n\r\nstatic int ql_raw_ip_mode_check(const char *ifname, uint32_t ip) {\r\n    int fd;\r\n    char raw_ip[128];\r\n    char mode[2] = \"X\";\r\n    int mode_change = 0;\r\n\r\n    if (ql_netcard_ipv4_address_check(ifname, qmi2addr(ip)))\r\n        return 0;\r\n    \r\n    snprintf(raw_ip, sizeof(raw_ip), \"/sys/class/net/%s/qmi/raw_ip\", ifname);\r\n    if (access(raw_ip, F_OK))\r\n        return 0;\r\n\r\n    fd = open(raw_ip, O_RDWR | O_NONBLOCK | O_NOCTTY);\r\n    if (fd < 0) {\r\n        dbg_time(\"%s %d fail to open(%s), errno:%d (%s)\", __FILE__, __LINE__, raw_ip, errno, strerror(errno));\r\n        return 0;\r\n    }\r\n\r\n    if (read(fd, mode, 2) == -1) {};\r\n    if (mode[0] == '0' || mode[0] == 'N') {\r\n        dbg_time(\"File:%s Line:%d udhcpc fail to get ip address, try next:\", __func__, __LINE__);\r\n        ifc_set_state(ifname, 0);\r\n        dbg_time(\"echo Y > /sys/class/net/%s/qmi/raw_ip\", ifname);\r\n        mode[0] = 'Y';\r\n        if (write(fd, mode, 2) == -1) {};\r\n        mode_change = 1;\r\n        ifc_set_state(ifname, 1);\r\n    }\r\n\r\n    close(fd);\r\n    return mode_change;\r\n}\r\n\r\nstatic void* udhcpc_thread_function(void* arg) {\r\n    FILE * udhcpc_fp;\r\n    char *udhcpc_cmd = (char *)arg;\r\n\r\n    if (udhcpc_cmd == NULL)\r\n        return NULL;\r\n\r\n    dbg_time(\"%s\", udhcpc_cmd);\r\n    udhcpc_fp = popen(udhcpc_cmd, \"r\");\r\n    free(udhcpc_cmd);\r\n    if (udhcpc_fp) {\r\n        char buf[0xff];\r\n\r\n        buf[sizeof(buf)-1] = '\\0';\r\n        while((fgets(buf, sizeof(buf)-1, udhcpc_fp)) != NULL) {\r\n            if ((strlen(buf) > 1) && (buf[strlen(buf) - 1] == '\\n'))\r\n                buf[strlen(buf) - 1] = '\\0';\r\n            dbg_time(\"%s\", buf);\r\n        }\r\n\r\n        pclose(udhcpc_fp);\r\n    }\r\n\r\n    return NULL;\r\n}\r\n\r\n//#define USE_DHCLIENT\r\n#ifdef USE_DHCLIENT\r\nstatic int dhclient_alive = 0;\r\n#endif\r\nstatic int dibbler_client_alive = 0;\r\n\r\nvoid ql_set_driver_link_state(PROFILE_T *profile, int link_state) {\r\n    char link_file[128];\r\n    int fd;\r\n    int new_state = 0;\r\n\r\n    snprintf(link_file, sizeof(link_file), \"/sys/class/net/%s/link_state\", profile->usbnet_adapter);\r\n    fd = open(link_file, O_RDWR | O_NONBLOCK | O_NOCTTY);\r\n    if (fd == -1) {\r\n        if (errno != ENOENT)\r\n            dbg_time(\"Fail to access %s, errno: %d (%s)\", link_file, errno, strerror(errno));\r\n        return;\r\n    }\r\n\r\n    if (profile->qmap_mode <= 1)\r\n        new_state = !!link_state;\r\n    else {\r\n        //0x80 means link off this pdp\r\n        new_state = (link_state ? 0x00 : 0x80) + (profile->muxid & 0x7F);\r\n    }\r\n\r\n    snprintf(link_file, sizeof(link_file), \"%d\\n\", new_state);\r\n    if (write(fd, link_file, sizeof(link_file)) == -1) {};\r\n\r\n    if (link_state == 0 && profile->qmapnet_adapter[0]\r\n        && strcmp(profile->qmapnet_adapter, profile->usbnet_adapter)) {\r\n        size_t rc;\r\n\r\n        lseek(fd, 0, SEEK_SET);\r\n        rc = read(fd, link_file, sizeof(link_file));\r\n        if (rc > 1 && (!strncasecmp(link_file, \"0\\n\", 2) || !strncasecmp(link_file, \"0x0\\n\", 4))) {\r\n            ifc_set_state(profile->usbnet_adapter, 0);\r\n        }\r\n    }\r\n\r\n    close(fd);\r\n}\r\n\r\nstatic const char *ipv4Str(const uint32_t Address) {\r\n    static char str[] = {\"255.225.255.255\"};\r\n    uint8_t *ip = (uint8_t *)&Address;\r\n\r\n    snprintf(str, sizeof(str), \"%d.%d.%d.%d\", ip[3], ip[2], ip[1], ip[0]);\r\n    return str;\r\n}\r\n\r\nstatic const char *ipv6Str(const UCHAR Address[16]) {\r\n    static char str[64];\r\n    uint16_t ip[8];\r\n    int i;\r\n    for (i = 0; i < 8; i++) {\r\n        ip[i] = (Address[i*2]<<8) + Address[i*2+1];\r\n    }\r\n\r\n    snprintf(str, sizeof(str), \"%x:%x:%x:%x:%x:%x:%x:%x\",\r\n        ip[0], ip[1], ip[2], ip[3], ip[4], ip[5], ip[6], ip[7]);\r\n\r\n    return str;\r\n}\r\n\r\nvoid update_ipv4_address(const char *ifname, const char *ip, const char *gw, unsigned prefix)\r\n{\r\n    char shell_cmd[128];\r\n\r\n    if (!ifname)\r\n        return;\r\n\r\n    if (!access(\"/sbin/ip\", X_OK)) {\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip -%d address flush dev %s\", 4, ifname);\r\n        ql_system(shell_cmd);\r\n\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip -%d address add %s/%u dev %s\", 4, ip, prefix, ifname);\r\n        ql_system(shell_cmd);\r\n\r\n        //ping6 www.qq.com\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip -%d route add default via %s dev %s\", 4, gw, ifname);\r\n        ql_system(shell_cmd);\r\n    } else {\r\n        unsigned n =  (0xFFFFFFFF >> (32 - prefix)) << (32 - prefix);\r\n       // n = (n>>24) | (n>>8&0xff00) | (n<<8&0xff0000) | (n<<24);\r\n\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ifconfig %s %s netmask %s\", ifname, ip, ipv4Str(n));\r\n        ql_system(shell_cmd);\r\n\r\n        //Resetting default routes\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"route del default dev %s\", ifname);\r\n        while(!system(shell_cmd));\r\n\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"route add default gw %s dev %s\", gw, ifname);\r\n        ql_system(shell_cmd);\r\n    }\r\n}\r\n\r\nvoid update_ipv6_address(const char *ifname, const char *ip, const char *gw, unsigned prefix) {\r\n    char shell_cmd[128];\r\n\r\n    (void)gw;\r\n    if (!access(\"/sbin/ip\", X_OK)) {\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip -%d address flush dev %s\", 6, ifname);\r\n        ql_system(shell_cmd);\r\n\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip -%d address add %s/%u dev %s\", 6, ip, prefix, ifname);\r\n        ql_system(shell_cmd);\r\n\r\n        //ping6 www.qq.com\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip -%d route add default dev %s\", 6, ifname);\r\n        ql_system(shell_cmd);\r\n    } else {\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ifconfig %s %s/%d\", ifname, ip, prefix);\r\n        ql_system(shell_cmd);\r\n\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"route -A inet6 add default dev %s\", ifname);\r\n        ql_system(shell_cmd);\r\n    }\r\n}\r\n\r\nstatic void update_ip_address_by_qmi(const char *ifname, const IPV4_T *ipv4, const IPV6_T *ipv6) {\r\n    char *d1, *d2;\r\n\r\n    if (ipv4 && ipv4->Address) {\r\n        d1 = strdup(ipv4Str(ipv4->Address));\r\n        d2 = strdup(ipv4Str(ipv4->Gateway));\r\n        unsigned prefix = 0;\r\n        unsigned n = 0;\r\n\r\n        for (n = 0; n < 32; n++) {\r\n            if (ipv4->SubnetMask&((unsigned)1<<n)) {\r\n                prefix++;\r\n            }\r\n        }\r\n\r\n        update_ipv4_address(ifname, d1, d2, prefix);\r\n        free(d1); free(d2);\r\n\r\n        //Adding DNS\r\n        if (ipv4->DnsPrimary) {\r\n            d1 = strdup(ipv4Str(ipv4->DnsPrimary));\r\n            d2 = strdup(ipv4Str(ipv4->DnsSecondary ? ipv4->DnsSecondary : ipv4->DnsPrimary));\r\n            update_resolv_conf(4, ifname, d1, d2);\r\n            free(d1); free(d2);\r\n        }\r\n    }\r\n\r\n    if (ipv6 && ipv6->Address[0] && ipv6->PrefixLengthIPAddr) {\r\n        d1 = strdup(ipv6Str(ipv6->Address));\r\n        d2 = strdup(ipv6Str(ipv6->Gateway));\r\n\r\n        update_ipv6_address(ifname, d1, d2, ipv6->PrefixLengthIPAddr);\r\n        free(d1); free(d2);\r\n\r\n        //Adding DNS\r\n        if (ipv6->DnsPrimary[0]) {\r\n            d1 = strdup(ipv6Str(ipv6->DnsPrimary));\r\n            d2 = strdup(ipv6Str(ipv6->DnsSecondary[0] ? ipv6->DnsSecondary : ipv6->DnsPrimary));\r\n            update_resolv_conf(6, ifname, d1, d2);\r\n            free(d1); free(d2);\r\n        }\r\n    }\r\n}\r\n\r\n//#define QL_OPENWER_NETWORK_SETUP\r\n#ifdef QL_OPENWER_NETWORK_SETUP\r\nstatic const char *openwrt_lan = \"br-lan\";\r\nstatic const char *openwrt_wan = \"wwan0\";\r\n\r\nstatic int ql_openwrt_system(const char *cmd) {\r\n    int i;\r\n    int ret = 1;\r\n    char shell_cmd[128];\r\n\r\n    snprintf(shell_cmd, sizeof(shell_cmd), \"%s 2>1 > /dev/null\", cmd);\r\n    \r\n    for (i = 0; i < 15; i++) {\r\n        dbg_time(\"%s\", cmd);\r\n        ret = system(shell_cmd);\r\n        if (!ret)\r\n            break;\r\n        sleep(1);\r\n    }\r\n\r\n    return ret;\r\n}\r\n\r\nstatic int ql_openwrt_is_wan(const char *ifname) {\r\n    if (openwrt_lan == NULL) {\r\n        system(\"uci show network.wan.ifname\");\r\n    }\r\n\r\n    if (strcmp(ifname, openwrt_wan))\r\n        return 0;\r\n\r\n    return 1;\r\n}\r\n\r\nstatic void ql_openwrt_setup_wan(const char *ifname, const IPV4_T *ipv4) {\r\n    FILE *fp = NULL;\r\n    char config[64];\r\n\r\n    snprintf(config, sizeof(config), \"/tmp/rmnet_%s_ipv4config\", ifname);\r\n     \r\n    if (ipv4 == NULL) {\r\n        if (ql_openwrt_is_wan(ifname))\r\n            ql_openwrt_system(\"ifdown wan\");\r\n        return;\r\n    }\r\n\r\n    fp = fopen(config, \"w\");\r\n    if (fp == NULL)\r\n        return;\r\n\r\n    fprintf(fp, \"IFNAME=\\\"%s\\\"\\n\", ifname);\r\n    fprintf(fp, \"PUBLIC_IP=\\\"%s\\\"\\n\", ipv4Str(ipv4->Address));\r\n    fprintf(fp, \"NETMASK=\\\"%s\\\"\\n\", ipv4Str(ipv4->SubnetMask));\r\n    fprintf(fp, \"GATEWAY=\\\"%s\\\"\\n\", ipv4Str(ipv4->Gateway));\r\n    fprintf(fp, \"DNSSERVERS=\\\"%s\", ipv4Str(ipv4->DnsPrimary));\r\n    if (ipv4->DnsSecondary != 0)\r\n        fprintf(fp, \" %s\", ipv4Str(ipv4->DnsSecondary));\r\n    fprintf(fp, \"\\\"\\n\");\r\n\r\n    fclose(fp);\r\n\r\n    if (!ql_openwrt_is_wan(ifname))\r\n        return;\r\n    \r\n    ql_openwrt_system(\"ifup wan\");\r\n}\r\n\r\nstatic void ql_openwrt_setup_wan6(const char *ifname, const IPV6_T *ipv6) {\r\n    FILE *fp = NULL;\r\n    char config[64];\r\n    int first_ifup;\r\n     \r\n    snprintf(config, sizeof(config), \"/tmp/rmnet_%s_ipv6config\", ifname);\r\n     \r\n    if (ipv6 == NULL) {\r\n        if (ql_openwrt_is_wan(ifname))\r\n            ql_openwrt_system(\"ifdown wan6\");\r\n        return;\r\n    }\r\n\r\n    first_ifup = (access(config, F_OK) != 0);\r\n\r\n    fp = fopen(config, \"w\");\r\n    if (fp == NULL)\r\n        return;\r\n\r\n    fprintf(fp, \"IFNAME=\\\"%s\\\"\\n\", ifname);\r\n    fprintf(fp, \"PUBLIC_IP=\\\"%s\\\"\\n\", ipv6Str(ipv6->Address));\r\n    fprintf(fp, \"NETMASK=\\\"%s\\\"\\n\", ipv6Str(ipv6->SubnetMask));\r\n    fprintf(fp, \"GATEWAY=\\\"%s\\\"\\n\", ipv6Str(ipv6->Gateway));\r\n    fprintf(fp, \"PrefixLength=\\\"%d\\\"\\n\", ipv6->PrefixLengthIPAddr);\r\n    fprintf(fp, \"DNSSERVERS=\\\"%s\", ipv6Str(ipv6->DnsPrimary));\r\n    if (ipv6->DnsSecondary[0])\r\n        fprintf(fp, \" %s\", ipv6Str(ipv6->DnsSecondary));\r\n    fprintf(fp, \"\\\"\\n\");\r\n\r\n    fclose(fp);\r\n\r\n    if (!ql_openwrt_is_wan(ifname))\r\n        return;\r\n\r\n    if (first_ifup)\r\n        ql_openwrt_system(\"ifup wan6\");\r\n    else\r\n        ql_openwrt_system(\"/etc/init.d/network restart\"); //make PC to release old IPV6 address, and RS new IPV6 address\r\n\r\n#if 1 //TODO? why need this?\r\n    if (openwrt_lan) {\r\n        int i;\r\n        char shell_cmd[128];\r\n        UCHAR Address[16] = {0};\r\n\r\n        ql_openwrt_system((\"ifstatus lan\"));\r\n\r\n        for (i = 0; i < (ipv6->PrefixLengthIPAddr/8); i++)\r\n            Address[i] = ipv6->Address[i];\r\n\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip route del %s/%u dev %s\", ipv6Str(Address), ipv6->PrefixLengthIPAddr, ifname);\r\n        ql_openwrt_system(shell_cmd);\r\n\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip route add %s/%u dev %s\", ipv6Str(Address), ipv6->PrefixLengthIPAddr, openwrt_lan);\r\n        ql_system(shell_cmd);        \r\n    }\r\n#endif\r\n}\r\n#endif\r\n\r\nvoid udhcpc_start(PROFILE_T *profile) {\r\n    char *ifname = profile->usbnet_adapter;\r\n\r\n    ql_set_driver_link_state(profile, 1);\r\n\r\n    if (profile->qmapnet_adapter[0]) {\r\n        ifname = profile->qmapnet_adapter;\r\n    }\r\n\r\n    if (profile->rawIP && profile->ipv4.Address && profile->ipv4.Mtu) {\r\n        ql_set_mtu(ifname, (profile->ipv4.Mtu));\r\n    }\r\n\r\n    if (strcmp(ifname, profile->usbnet_adapter)) {\r\n        ifc_set_state(profile->usbnet_adapter, 1);\r\n        if (ifc_get_flags(ifname)&IFF_UP) {\r\n            ifc_set_state(ifname, 0);\r\n        }\r\n    }\r\n\r\n    ifc_set_state(ifname, 1);\r\n    if (profile->ipv4.Address) {\r\n        if (profile->PCSCFIpv4Addr1)\r\n            dbg_time(\"pcscf1: %s\", ipv4Str(profile->PCSCFIpv4Addr1));\r\n        if (profile->PCSCFIpv4Addr2)\r\n            dbg_time(\"pcscf2: %s\", ipv4Str(profile->PCSCFIpv4Addr2));\r\n    }\r\n\r\n    if (profile->ipv6.Address[0] && profile->ipv6.PrefixLengthIPAddr) {\r\n        if (profile->PCSCFIpv6Addr1[0])\r\n            dbg_time(\"pcscf1: %s\", ipv6Str(profile->PCSCFIpv6Addr1));\r\n        if (profile->PCSCFIpv6Addr2[0])\r\n            dbg_time(\"pcscf2: %s\", ipv6Str(profile->PCSCFIpv6Addr2));\r\n    }\r\n\r\n#if 1 //for bridge mode, only one public IP, so do udhcpc manually\r\n    if (ql_bridge_mode_detect(profile)) {\r\n        return;\r\n    }\r\n#endif\r\n\r\n//because must use udhcpc to obtain IP when working on ETH mode,\r\n//so it is better also use udhcpc to obtain IP when working on IP mode.\r\n//use the same policy for all modules\r\n#if 0\r\n    if (profile->rawIP != 0) //mdm9x07/ec25,ec20 R2.0\r\n    {\r\n        update_ip_address_by_qmi(ifname, &profile->ipv4, &profile->ipv6);\r\n        return;\r\n    }\r\n#endif\r\n\r\n    if (profile->ipv4.Address == 0)\r\n        goto set_ipv6;\r\n\r\n    if (profile->no_dhcp || profile->usb_dev.idProduct == 0x0316 || profile->request_ops == &mbim_request_ops) { //lots of mbim modem do not support DHCP\r\n        update_ip_address_by_qmi(ifname, &profile->ipv4, NULL);\r\n    }\r\n    else\r\n/* Do DHCP using busybox tools */\r\n    {\r\n        char udhcpc_cmd[128];\r\n        pthread_attr_t udhcpc_thread_attr;\r\n        pthread_t udhcpc_thread_id;\r\n\r\n        pthread_attr_init(&udhcpc_thread_attr);\r\n        pthread_attr_setdetachstate(&udhcpc_thread_attr, PTHREAD_CREATE_DETACHED);\r\n\r\n#ifdef USE_DHCLIENT\r\n            snprintf(udhcpc_cmd, sizeof(udhcpc_cmd), \"dhclient -4 -d --no-pid %s\", ifname);\r\n            dhclient_alive++;\r\n#else\r\n            if (access(\"/usr/share/udhcpc/default.script\", X_OK)\r\n                && access(\"/etc//udhcpc/default.script\", X_OK)) {\r\n                dbg_time(\"No default.script found, it should be in '/usr/share/udhcpc/' or '/etc//udhcpc' depend on your udhcpc version!\");\r\n            }\r\n\r\n            //-f,--foreground    Run in foreground\r\n            //-b,--background    Background if lease is not obtained\r\n            //-n,--now        Exit if lease is not obtained\r\n            //-q,--quit        Exit after obtaining lease\r\n            //-t,--retries N        Send up to N discover packets (default 3)\r\n            snprintf(udhcpc_cmd, sizeof(udhcpc_cmd), \"busybox udhcpc -f -n -q -t 5 -i %s\", ifname);\r\n#endif\r\n\r\n#if 1 //for OpenWrt\r\n            if (!access(\"/lib/netifd/dhcp.script\", X_OK) && !access(\"/sbin/ifup\", X_OK) && !access(\"/sbin/ifstatus\", X_OK)) {\r\n#if 0 //20210415 do not promot these message\r\n                dbg_time(\"you are use OpenWrt?\");\r\n                dbg_time(\"should not calling udhcpc manually?\");\r\n                dbg_time(\"should modify /etc/config/network as below?\");\r\n                dbg_time(\"config interface wan\");\r\n                dbg_time(\"\\toption ifname\t%s\", ifname);\r\n                dbg_time(\"\\toption proto\tdhcp\");\r\n                dbg_time(\"should use \\\"/sbin/ifstaus wan\\\" to check %s 's status?\", ifname);\r\n#endif\r\n            }\r\n#endif\r\n\r\n#ifdef USE_DHCLIENT            \r\n            pthread_create(&udhcpc_thread_id, &udhcpc_thread_attr, udhcpc_thread_function, (void*)strdup(udhcpc_cmd));\r\n            sleep(1);\r\n#else\r\n            pthread_create(&udhcpc_thread_id, NULL, udhcpc_thread_function, (void*)strdup(udhcpc_cmd));\r\n            pthread_join(udhcpc_thread_id, NULL);\r\n\r\n            if (profile->request_ops == &atc_request_ops) {\r\n                profile->udhcpc_ip = 0;\r\n                ifc_get_addr(ifname, &profile->udhcpc_ip);\r\n                if (profile->udhcpc_ip != profile->ipv4.Address) {\r\n                    unsigned char *l = (unsigned char *)&profile->udhcpc_ip;\r\n                    unsigned char *r = (unsigned char *)&profile->ipv4.Address;\r\n                    dbg_time(\"ERROR: IP from udhcpc (%d.%d.%d.%d) is different to IP from ATC (%d.%d.%d.%d)!\",\r\n                              l[0], l[1], l[2], l[3], r[0], r[1], r[2], r[3]);\r\n                    ql_get_netcard_carrier_state(ifname); //miss udhcpc default.script or modem not report usb-net-cdc-linkup\r\n                }\r\n            }\r\n\r\n            if (profile->request_ops != &qmi_request_ops) { //only QMI modem support next fixup!\r\n                goto set_ipv6;\r\n            }\r\n\r\n            if (ql_raw_ip_mode_check(ifname, profile->ipv4.Address)) {\r\n                pthread_create(&udhcpc_thread_id, NULL, udhcpc_thread_function, (void*)strdup(udhcpc_cmd));\r\n                pthread_join(udhcpc_thread_id, NULL);\r\n            }\r\n\r\n            if (!ql_netcard_ipv4_address_check(ifname, qmi2addr(profile->ipv4.Address))) {\r\n                //no udhcpc's default.script exist, directly set ip and dns\r\n                update_ip_address_by_qmi(ifname, &profile->ipv4, NULL);\r\n            }\r\n            //Add by Demon. check default route \r\n            FILE *rt_fp = NULL;\r\n            char rt_cmd[128] = {0};\r\n            \r\n            //Check if there is a default route. \r\n            snprintf(rt_cmd, sizeof(rt_cmd), \"route -n | grep %s | awk '{print $1}' | grep 0.0.0.0\", ifname);\r\n            rt_fp = popen((const char *)rt_cmd, \"r\");\r\n            if (rt_fp != NULL) {\r\n              char buf[20] = {0};\r\n              int found_default_rt = 0;\r\n\r\n              if (fgets(buf, sizeof(buf), rt_fp) != NULL) {\r\n                //Find the specified interface\r\n                found_default_rt = 1;\r\n              }\r\n\r\n              if (1 == found_default_rt) {\r\n                //dbg_time(\"Route items found for %s\", ifname);\r\n              }\r\n              else {\r\n                dbg_time(\"Warning: No route items found for %s\", ifname);\r\n              }\r\n\r\n              pclose(rt_fp);\r\n            }\r\n            //End by Demon.\r\n#endif\r\n    }\r\n\r\n#ifdef QL_OPENWER_NETWORK_SETUP\r\n    ql_openwrt_setup_wan(ifname, &profile->ipv4);\r\n#endif\r\n\r\nset_ipv6:\r\n    if (profile->ipv6.Address[0] && profile->ipv6.PrefixLengthIPAddr) {\r\n#if 1\r\n        //module do not support DHCPv6, only support 'Router Solicit'\r\n        //and it seem if enable /proc/sys/net/ipv6/conf/all/forwarding, Kernel do not send RS\r\n        const char *forward_file = \"/proc/sys/net/ipv6/conf/all/forwarding\";\r\n        int forward_fd = open(forward_file, O_RDONLY);\r\n        if (forward_fd > 0) {\r\n            char forward_state[2];\r\n            if (read(forward_fd, forward_state, 2) == -1) {};\r\n            if (forward_state[0] == '1') {\r\n                //dbg_time(\"%s enabled, kernel maybe donot send 'Router Solicit'\", forward_file);\r\n            }\r\n            close(forward_fd);\r\n        }\r\n\r\n        update_ip_address_by_qmi(ifname, NULL, &profile->ipv6);\r\n\r\n        if (profile->ipv6.DnsPrimary[0] || profile->ipv6.DnsSecondary[0]) {\r\n            char dns1str[64], dns2str[64];\r\n\r\n            if (profile->ipv6.DnsPrimary[0]) {\r\n                strcpy(dns1str, ipv6Str(profile->ipv6.DnsPrimary));\r\n            }\r\n\r\n            if (profile->ipv6.DnsSecondary[0]) {\r\n                strcpy(dns2str, ipv6Str(profile->ipv6.DnsSecondary));\r\n            }\r\n\r\n            update_resolv_conf(6, ifname, profile->ipv6.DnsPrimary[0] ? dns1str : NULL,\r\n                               profile->ipv6.DnsSecondary[0] != '\\0' ? dns2str : NULL);\r\n        }\r\n\r\n#ifdef QL_OPENWER_NETWORK_SETUP\r\n            ql_openwrt_setup_wan6(ifname, &profile->ipv6);\r\n#endif\r\n#else\r\n#ifdef USE_DHCLIENT\r\n        snprintf(udhcpc_cmd, sizeof(udhcpc_cmd), \"dhclient -6 -d --no-pid %s\",  ifname);\r\n        dhclient_alive++;\r\n#else\r\n        /*\r\n            DHCPv6: Dibbler - a portable DHCPv6\r\n            1. download from http://klub.com.pl/dhcpv6/\r\n            2. cross-compile\r\n                2.1 ./configure --host=arm-linux-gnueabihf\r\n                2.2 copy dibbler-client to your board\r\n            3. mkdir -p /var/log/dibbler/ /var/lib/ on your board\r\n            4. create /etc/dibbler/client.conf on your board, the content is\r\n                log-mode short\r\n                log-level 7\r\n                iface wwan0 {\r\n                    ia\r\n                    option dns-server\r\n                }\r\n             5. run \"dibbler-client start\" to get ipV6 address\r\n             6. run \"route -A inet6 add default dev wwan0\" to add default route\r\n        */\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"route -A inet6 add default %s\", ifname);\r\n        ql_system(shell_cmd);\r\n        snprintf(udhcpc_cmd, sizeof(udhcpc_cmd), \"dibbler-client run\");\r\n        dibbler_client_alive++;\r\n#endif\r\n\r\n        pthread_create(&udhcpc_thread_id, &udhcpc_thread_attr, udhcpc_thread_function, (void*)strdup(udhcpc_cmd));\r\n#endif\r\n    }\r\n}\r\n\r\nvoid udhcpc_stop(PROFILE_T *profile) {\r\n    char *ifname = profile->usbnet_adapter;\r\n    char shell_cmd[128];\r\n\r\n    ql_set_driver_link_state(profile, 0);\r\n\r\n    if (profile->qmapnet_adapter[0]) {\r\n        ifname = profile->qmapnet_adapter;\r\n    }\r\n\r\n#ifdef USE_DHCLIENT\r\n    if (dhclient_alive) {\r\n        system(\"killall dhclient\");\r\n        dhclient_alive = 0;\r\n    }\r\n#endif\r\n    if (dibbler_client_alive) {\r\n        if (system(\"killall dibbler-client\")) {};\r\n        dibbler_client_alive = 0;\r\n    }\r\n\r\n    profile->udhcpc_ip = 0;\r\n//it seems when call netif_carrier_on(), and netcard 's IP is \"0.0.0.0\", will cause netif_queue_stopped()\r\n    if (!access(\"/sbin/ip\", X_OK))\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ip addr flush dev %s\", ifname);\r\n    else\r\n        snprintf(shell_cmd, sizeof(shell_cmd), \"ifconfig %s 0.0.0.0\", ifname);\r\n    ql_system(shell_cmd);\r\n    ifc_set_state(ifname, 0);\r\n\r\n#ifdef QL_OPENWER_NETWORK_SETUP\r\n    ql_openwrt_setup_wan(ifname, NULL);\r\n    ql_openwrt_setup_wan6(ifname, NULL);\r\n#endif\r\n}\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/udhcpc_netlink.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software. \r\n    Under no circumstances may customers modify, demonstrate, use, deliver \r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include <sys/socket.h>\r\n#include <sys/select.h>\r\n#include <sys/types.h>\r\n#include <net/if.h>\r\n#include <sys/socket.h>\r\n#include <netinet/in.h>\r\n#include <arpa/inet.h>\r\n#include <endian.h>\r\n\r\n#include \"libmnl/ifutils.h\"\r\n#include \"libmnl/dhcp/dhcp.h\"\r\n#include \"util.h\"\r\n#include \"QMIThread.h\"\r\n\r\nstatic int ql_raw_ip_mode_check(const char *ifname)\r\n{\r\n    int fd;\r\n    char raw_ip[128];\r\n    char mode[2] = \"X\";\r\n    int mode_change = 0;\r\n\r\n    snprintf(raw_ip, sizeof(raw_ip), \"/sys/class/net/%s/qmi/raw_ip\", ifname);\r\n    if (access(raw_ip, F_OK))\r\n        return 0;\r\n\r\n    fd = open(raw_ip, O_RDWR | O_NONBLOCK | O_NOCTTY);\r\n    if (fd < 0)\r\n    {\r\n        dbg_time(\"%s %d fail to open(%s), errno:%d (%s)\", __FILE__, __LINE__, raw_ip, errno, strerror(errno));\r\n        return 0;\r\n    }\r\n\r\n    read(fd, mode, 2);\r\n    if (mode[0] == '0' || mode[0] == 'N')\r\n    {\r\n        if_link_down(ifname);\r\n        dbg_time(\"echo Y > /sys/class/net/%s/qmi/raw_ip\", ifname);\r\n        mode[0] = 'Y';\r\n        write(fd, mode, 2);\r\n        mode_change = 1;\r\n        if_link_up(ifname);\r\n    }\r\n\r\n    close(fd);\r\n    return mode_change;\r\n}\r\n\r\nvoid ql_set_driver_link_state(PROFILE_T *profile, int link_state)\r\n{\r\n    char link_file[128];\r\n    int fd;\r\n    int new_state = 0;\r\n\r\n    snprintf(link_file, sizeof(link_file), \"/sys/class/net/%s/link_state\", profile->usbnet_adapter);\r\n    fd = open(link_file, O_RDWR | O_NONBLOCK | O_NOCTTY);\r\n    if (fd == -1)\r\n    {\r\n        if (errno != ENOENT)\r\n            dbg_time(\"Fail to access %s, errno: %d (%s)\", link_file, errno, strerror(errno));\r\n        return;\r\n    }\r\n\r\n    if (profile->qmap_mode <= 1)\r\n        new_state = !!link_state;\r\n    else\r\n    {\r\n        //0x80 means link off this pdp\r\n        new_state = (link_state ? 0x00 : 0x80) + profile->pdp;\r\n    }\r\n\r\n    snprintf(link_file, sizeof(link_file), \"%d\\n\", new_state);\r\n    write(fd, link_file, sizeof(link_file));\r\n\r\n    if (link_state == 0 && profile->qmap_mode > 1)\r\n    {\r\n        size_t rc;\r\n\r\n        lseek(fd, 0, SEEK_SET);\r\n        rc = read(fd, link_file, sizeof(link_file));\r\n        if (rc > 1 && (!strcasecmp(link_file, \"0\\n\") || !strcasecmp(link_file, \"0x0\\n\")))\r\n        {\r\n            if_link_down(profile->usbnet_adapter);\r\n        }\r\n    }\r\n\r\n    close(fd);\r\n}\r\n\r\nvoid udhcpc_start(PROFILE_T *profile)\r\n{\r\n    char *ifname = profile->usbnet_adapter;\r\n\r\n    ql_set_driver_link_state(profile, 1);\r\n    ql_raw_ip_mode_check(ifname);\r\n\r\n    if (profile->qmapnet_adapter)\r\n    {\r\n        ifname = profile->qmapnet_adapter;\r\n    }\r\n    if (profile->rawIP && profile->ipv4.Address && profile->ipv4.Mtu)\r\n    {\r\n        if_set_mtu(ifname, (profile->ipv4.Mtu));\r\n    }\r\n\r\n    if (strcmp(ifname, profile->usbnet_adapter))\r\n    {\r\n        if_link_up(profile->usbnet_adapter);\r\n    }\r\n\r\n    if_link_up(ifname);\r\n\r\n#if 1 //for bridge mode, only one public IP, so do udhcpc manually\r\n    if (ql_bridge_mode_detect(profile))\r\n    {\r\n        return;\r\n    }\r\n#endif\r\n    // if use DHCP(should make with ${DHCP} src files)\r\n    // do_dhcp(ifname);\r\n    // return 0;\r\n    /* IPv4 Addr Info */\r\n    if (profile->ipv4.Address)\r\n    {\r\n        dbg_time(\"IPv4 MTU: %d\", profile->ipv4.Mtu);\r\n        dbg_time(\"IPv4 Address: %s\", ipaddr_to_string_v4(ntohl(profile->ipv4.Address)));\r\n        dbg_time(\"IPv4 Netmask: %d\", mask_to_prefix_v4(ntohl(profile->ipv4.SubnetMask)));\r\n        dbg_time(\"IPv4 Gateway: %s\", ipaddr_to_string_v4(ntohl(profile->ipv4.Gateway)));\r\n        dbg_time(\"IPv4 DNS1: %s\", ipaddr_to_string_v4(ntohl(profile->ipv4.DnsPrimary)));\r\n        dbg_time(\"IPv4 DNS2: %s\", ipaddr_to_string_v4(ntohl(profile->ipv4.DnsSecondary)));\r\n        if_set_network_v4(ifname, ntohl(profile->ipv4.Address),\r\n                       mask_to_prefix_v4(profile->ipv4.SubnetMask),\r\n                       ntohl(profile->ipv4.Gateway),\r\n                       ntohl(profile->ipv4.DnsPrimary),\r\n                       ntohl(profile->ipv4.DnsSecondary));\r\n    }\r\n\r\n    if (profile->ipv6.Address[0] && profile->ipv6.PrefixLengthIPAddr)\r\n    {\r\n        //module do not support DHCPv6, only support 'Router Solicit'\r\n        //and it seem if enable /proc/sys/net/ipv6/conf/all/forwarding, Kernel do not send RS\r\n        const char *forward_file = \"/proc/sys/net/ipv6/conf/all/forwarding\";\r\n        int forward_fd = open(forward_file, O_RDONLY);\r\n        if (forward_fd > 0)\r\n        {\r\n            char forward_state[2];\r\n            read(forward_fd, forward_state, 2);\r\n            if (forward_state[0] == '1')\r\n            {\r\n                dbg_time(\"%s enabled, kernel maybe donot send 'Router Solicit'\", forward_file);\r\n            }\r\n            close(forward_fd);\r\n        }\r\n\r\n        dbg_time(\"IPv6 MTU: %d\", profile->ipv6.Mtu);\r\n        dbg_time(\"IPv6 Address: %s\", ipaddr_to_string_v6(profile->ipv6.Address));\r\n        dbg_time(\"IPv6 Netmask: %d\", profile->ipv6.PrefixLengthIPAddr);\r\n        dbg_time(\"IPv6 Gateway: %s\", ipaddr_to_string_v6(profile->ipv6.Gateway));\r\n        dbg_time(\"IPv6 DNS1: %s\", ipaddr_to_string_v6(profile->ipv6.DnsPrimary));\r\n        dbg_time(\"IPv6 DNS2: %s\", ipaddr_to_string_v6(profile->ipv6.DnsSecondary));\r\n        if_set_network_v6(ifname, profile->ipv6.Address, profile->ipv6.PrefixLengthIPAddr,\r\n                       profile->ipv6.Gateway, profile->ipv6.DnsPrimary, profile->ipv6.DnsSecondary);\r\n    }\r\n}\r\n\r\nvoid udhcpc_stop(PROFILE_T *profile)\r\n{\r\n    char *ifname = profile->usbnet_adapter;\r\n\r\n    ql_set_driver_link_state(profile, 0);\r\n\r\n    if (profile->qmapnet_adapter)\r\n    {\r\n        ifname = profile->qmapnet_adapter;\r\n    }\r\n\r\n    if_link_down(ifname);\r\n    if_flush_v4_addr(ifname);\r\n    if_flush_v6_addr(ifname);\r\n}\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/udhcpc_script.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software. \r\n    Under no circumstances may customers modify, demonstrate, use, deliver \r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include <sys/socket.h>\r\n#include <sys/select.h>\r\n#include <sys/types.h>\r\n#include <net/if.h>\r\n#include <sys/socket.h>\r\n#include <netinet/in.h>\r\n#include <arpa/inet.h>\r\n#include <endian.h>\r\n\r\n#include \"util.h\"\r\n#include \"QMIThread.h\"\r\n\r\n#define IFDOWN_SCRIPT \"/etc/quectel/ifdown.sh\"\r\n#define IFUP_SCRIPT \"/etc/quectel/ifup.sh\"\r\n\r\nstatic int ql_system(const char *shell_cmd)\r\n{\r\n    dbg_time(\"%s\", shell_cmd);\r\n    return system(shell_cmd);\r\n}\r\n\r\nuint32_t mask_to_prefix_v4(uint32_t mask)\r\n{\r\n    uint32_t prefix = 0;\r\n    while (mask)\r\n    {\r\n        mask = mask & (mask - 1);\r\n        prefix++;\r\n    }\r\n    return prefix;\r\n}\r\n\r\nuint32_t mask_from_prefix_v4(uint32_t prefix)\r\n{\r\n    return ~((1 << (32 - prefix)) - 1);\r\n}\r\n\r\n/* mask in int */\r\nuint32_t broadcast_from_mask(uint32_t ip, uint32_t mask)\r\n{\r\n    return (ip & mask) | (~mask);\r\n}\r\n\r\nconst char *ipaddr_to_string_v4(in_addr_t ipaddr, char *buf, size_t size)\r\n{\r\n    //    static char buf[INET6_ADDRSTRLEN] = {'\\0'};\r\n    buf[0] = '\\0';\r\n    uint32_t addr = ipaddr;\r\n    return inet_ntop(AF_INET, &addr, buf, size);\r\n}\r\n\r\nconst char *ipaddr_to_string_v6(uint8_t *ipaddr, char *buf, size_t size)\r\n{\r\n    buf[0] = '\\0';\r\n    return inet_ntop(AF_INET6, ipaddr, buf, size);\r\n}\r\n\r\n/**\r\n * For more details see default.script\r\n * \r\n * The main aim of this function is offload ip management to script, CM has not interest in manage IP address.\r\n * just tell script all the info about ip, mask, router, dns...\r\n */\r\nvoid udhcpc_start(PROFILE_T *profile)\r\n{\r\n    char shell_cmd[1024];\r\n    char ip[128];\r\n    char subnet[128];\r\n    char broadcast[128];\r\n    char router[128];\r\n    char domain1[128];\r\n    char domain2[128];\r\n\r\n    if (NULL == getenv(IFUP_SCRIPT))\r\n        return;\r\n\r\n    // manage IPv4???\r\n    // check rawip ???\r\n    snprintf(shell_cmd, sizeof(shell_cmd),\r\n             \" netiface=%s interface=%s mtu=%u ip=%s subnet=%s broadcast=%s router=%s\"\r\n             \" domain=\\\"%s %s\\\" %s\",\r\n             profile->usbnet_adapter,\r\n             profile->qmapnet_adapter ? profile->qmapnet_adapter : profile->usbnet_adapter,\r\n             profile->ipv4.Mtu,\r\n             ipaddr_to_string_v4(ntohl(profile->ipv4.Address), ip, sizeof(ip)),\r\n             ipaddr_to_string_v4(ntohl(profile->ipv4.SubnetMask), subnet, sizeof(subnet)),\r\n             ipaddr_to_string_v4(ntohl(broadcast_from_mask(profile->ipv4.Address, profile->ipv4.SubnetMask)),\r\n                                 broadcast, sizeof(broadcast)),\r\n             ipaddr_to_string_v4(ntohl(profile->ipv4.Gateway), router, sizeof(router)),\r\n             ipaddr_to_string_v4(ntohl(profile->ipv4.DnsPrimary), domain1, sizeof(domain1)),\r\n             ipaddr_to_string_v4(ntohl(profile->ipv4.DnsSecondary), domain2, sizeof(domain2)),\r\n             getenv(IFUP_SCRIPT));\r\n    ql_system(shell_cmd);\r\n\r\n    // manage IPv6???\r\n}\r\n\r\n/**\r\n * For more details see default.script\r\n * \r\n * The main aim of this function is offload ip management to script, CM has not interest in manage IP address.\r\n * just tell script all the info about ip, mask, router, dns...\r\n */\r\nvoid udhcpc_stop(PROFILE_T *profile)\r\n{\r\n    char shell_cmd[1024];\r\n\r\n    if (NULL == getenv(IFDOWN_SCRIPT))\r\n        return;\r\n\r\n    snprintf(shell_cmd, sizeof(shell_cmd),\r\n             \"netiface=%s interface=%s %s\",\r\n             profile->usbnet_adapter,\r\n             profile->qmapnet_adapter ? profile->qmapnet_adapter : profile->usbnet_adapter,\r\n             getenv(IFDOWN_SCRIPT));\r\n    ql_system(shell_cmd);\r\n}\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/util.c",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software. \r\n    Under no circumstances may customers modify, demonstrate, use, deliver \r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#include <sys/time.h>\r\n#include <net/if.h>\r\ntypedef unsigned short sa_family_t;\r\n#include <linux/un.h>\r\n\r\n#if defined(__STDC__)\r\n#include <stdarg.h>\r\n#define __V(x)\tx\r\n#else\r\n#include <varargs.h>\r\n#define __V(x)\t(va_alist) va_dcl\r\n#define const\r\n#define volatile\r\n#endif\r\n\r\n#include <syslog.h>\r\n\r\n#include \"QMIThread.h\"\r\n\r\npthread_mutex_t cm_command_mutex = PTHREAD_MUTEX_INITIALIZER;\r\npthread_cond_t cm_command_cond = PTHREAD_COND_INITIALIZER;\r\nunsigned int cm_recv_buf[1024];\r\n\r\nint cm_open_dev(const char *dev) {\r\n    int fd;\r\n\r\n    fd = open(dev, O_RDWR | O_NONBLOCK | O_NOCTTY);\r\n    if (fd != -1) {\r\n        fcntl(fd, F_SETFL, fcntl(fd,F_GETFL) | O_NONBLOCK);\r\n        fcntl(fd, F_SETFD, FD_CLOEXEC);\r\n\r\n        if (!strncmp(dev, \"/dev/tty\", strlen(\"/dev/tty\")))\r\n        {\r\n            //disable echo on serial ports \r\n            struct termios  ios;\r\n\r\n            memset(&ios, 0, sizeof(ios));\r\n            tcgetattr( fd, &ios );\r\n            cfmakeraw(&ios);\r\n            cfsetispeed(&ios, B115200);\r\n            cfsetospeed(&ios, B115200);\r\n            tcsetattr( fd, TCSANOW, &ios );\r\n            tcflush(fd, TCIOFLUSH);\r\n        }\r\n    } else {\r\n        dbg_time(\"Failed to open %s, errno: %d (%s)\", dev, errno, strerror(errno));\r\n    }\r\n\r\n    return fd;\r\n}\r\n\r\nint cm_open_proxy(const char *name) {\r\n    int sockfd = -1;\r\n    int reuse_addr = 1;\r\n    struct sockaddr_un sockaddr;\r\n    socklen_t alen;\r\n\r\n    /*Create server socket*/\r\n    sockfd = socket(AF_LOCAL, SOCK_STREAM, 0);\r\n    if (sockfd < 0)\r\n        return sockfd;\r\n\r\n    memset(&sockaddr, 0, sizeof(sockaddr));\r\n    sockaddr.sun_family = AF_LOCAL;\r\n    sockaddr.sun_path[0] = 0;\r\n    memcpy(sockaddr.sun_path + 1, name, strlen(name) );\r\n\r\n    alen = strlen(name) + offsetof(struct sockaddr_un, sun_path) + 1;\r\n    if(connect(sockfd, (struct sockaddr *)&sockaddr, alen) < 0) {\r\n        close(sockfd);\r\n        dbg_time(\"connect %s errno: %d (%s)\", name, errno, strerror(errno));\r\n        return -1;\r\n    }\r\n    setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &reuse_addr,sizeof(reuse_addr));\r\n    fcntl(sockfd, F_SETFL, fcntl(sockfd,F_GETFL) | O_NONBLOCK);\r\n    fcntl(sockfd, F_SETFD, FD_CLOEXEC);\r\n\r\n    dbg_time(\"connect to %s sockfd = %d\", name, sockfd);\r\n\r\n    return sockfd;\r\n}\r\n\r\nstatic void setTimespecRelative(struct timespec *p_ts, long long msec)\r\n{\r\n    struct timeval tv;\r\n\r\n    gettimeofday(&tv, (struct timezone *) NULL);\r\n\r\n    /* what's really funny about this is that I know\r\n       pthread_cond_timedwait just turns around and makes this\r\n       a relative time again */\r\n    p_ts->tv_sec = tv.tv_sec + (msec / 1000);\r\n    p_ts->tv_nsec = (tv.tv_usec + (msec % 1000) * 1000L ) * 1000L;\r\n    if ((unsigned long)p_ts->tv_nsec >= 1000000000UL) {\r\n        p_ts->tv_sec += 1;\r\n        p_ts->tv_nsec -= 1000000000UL;\r\n    }\r\n}\r\n\r\nint pthread_cond_timeout_np(pthread_cond_t *cond, pthread_mutex_t * mutex, unsigned msecs) {\r\n    if (msecs != 0) {\r\n        unsigned i;\r\n        unsigned t = msecs/4;\r\n        int ret = 0;\r\n\r\n        if (t == 0)\r\n            t = 1;\r\n\r\n        for (i = 0; i < msecs; i += t) {\r\n            struct timespec ts;\r\n            setTimespecRelative(&ts, t);\r\n//very old uclibc do not support pthread_condattr_setclock(CLOCK_MONOTONIC)\r\n            ret = pthread_cond_timedwait(cond, mutex, &ts); //to advoid system time change\r\n            if (ret != ETIMEDOUT) {\r\n                if(ret) dbg_time(\"ret=%d, msecs=%u, t=%u\", ret, msecs, t);\r\n                break;\r\n            }\r\n        }\r\n\r\n        return ret;\r\n    } else {\r\n        return pthread_cond_wait(cond, mutex);\r\n    }\r\n}\r\n\r\nconst char * get_time(void) {\r\n    static char time_buf[128];\r\n    struct timeval  tv;\r\n    time_t time;\r\n    suseconds_t millitm;\r\n    struct tm *ti;\r\n\r\n    gettimeofday (&tv, NULL);\r\n\r\n    time= tv.tv_sec;\r\n    millitm = (tv.tv_usec + 500) / 1000;\r\n\r\n    if (millitm == 1000) {\r\n        ++time;\r\n        millitm = 0;\r\n    }\r\n\r\n    ti = localtime(&time);\r\n    sprintf(time_buf, \"%02d-%02d_%02d:%02d:%02d:%03d\", ti->tm_mon+1, ti->tm_mday, ti->tm_hour, ti->tm_min, ti->tm_sec, (int)millitm);\r\n    return time_buf;\r\n}\r\n\r\nunsigned long clock_msec(void)\r\n{\r\n\tstruct timespec tm;\r\n\tclock_gettime( CLOCK_MONOTONIC, &tm);\r\n\treturn (unsigned long)(tm.tv_sec*1000 + (tm.tv_nsec/1000000));\r\n}\r\n\r\nFILE *logfilefp = NULL;\r\n\r\nvoid update_resolv_conf(int iptype, const char *ifname, const char *dns1, const char *dns2) {\r\n    const char *dns_file = \"/etc/resolv.conf\";\r\n    FILE *dns_fp;\r\n    char dns_line[256];\r\n    #define MAX_DNS 16\r\n    char *dns_info[MAX_DNS];\r\n    char dns_tag[64];\r\n    int dns_match = 0;\r\n    int i;\r\n\r\n    snprintf(dns_tag, sizeof(dns_tag), \"# IPV%d %s\", iptype, ifname);\r\n\r\n    for (i = 0; i < MAX_DNS; i++)\r\n        dns_info[i] = NULL;\r\n    \r\n    dns_fp = fopen(dns_file, \"r\");\r\n    if (dns_fp) {\r\n        i = 0;    \r\n        dns_line[sizeof(dns_line)-1] = '\\0';\r\n        \r\n        while((fgets(dns_line, sizeof(dns_line)-1, dns_fp)) != NULL) {\r\n            if ((strlen(dns_line) > 1) && (dns_line[strlen(dns_line) - 1] == '\\n'))\r\n                dns_line[strlen(dns_line) - 1] = '\\0';\r\n            //dbg_time(\"%s\", dns_line);\r\n            if (strstr(dns_line, dns_tag)) {\r\n                dns_match++;\r\n                continue;\r\n            }\r\n            dns_info[i++] = strdup(dns_line);\r\n            if (i == MAX_DNS)\r\n                break;\r\n        }\r\n\r\n        fclose(dns_fp);\r\n    }\r\n    else if (errno != ENOENT) {\r\n        dbg_time(\"fopen %s fail, errno:%d (%s)\", dns_file, errno, strerror(errno));\r\n        return;\r\n    }\r\n    \r\n    if (dns1 == NULL && dns_match == 0)\r\n        return;\r\n\r\n    dns_fp = fopen(dns_file, \"w\");\r\n    if (dns_fp) {\r\n        if (dns1)\r\n            fprintf(dns_fp, \"nameserver %s %s\\n\", dns1, dns_tag);\r\n        if (dns2)\r\n            fprintf(dns_fp, \"nameserver %s %s\\n\", dns2, dns_tag);\r\n        \r\n        for (i = 0; i < MAX_DNS && dns_info[i]; i++)\r\n            fprintf(dns_fp, \"%s\\n\", dns_info[i]);\r\n        fclose(dns_fp);\r\n    }\r\n    else {\r\n        dbg_time(\"fopen %s fail, errno:%d (%s)\", dns_file, errno, strerror(errno));\r\n    }\r\n\r\n    for (i = 0; i < MAX_DNS && dns_info[i]; i++)\r\n        free(dns_info[i]);\r\n}\r\n\r\npid_t getpid_by_pdp(int pdp, const char* program_name)\r\n{\r\n    glob_t gt;\r\n    int ret;\r\n    char filter[16];\r\n    pid_t pid;\r\n\r\n    snprintf(filter, sizeof(filter), \"-n %d\", pdp);\r\n    ret = glob(\"/proc/*/cmdline\", GLOB_NOSORT, NULL, &gt);\r\n    if (ret != 0) {\r\n        dbg_time(\"glob error, errno = %d(%s)\", errno, strerror(errno));\r\n\t\treturn -1;\r\n    } else {\r\n        int i = 0, fd = -1;\r\n        ssize_t nreads;\r\n        char cmdline[512] = {0};\r\n\r\n\t\tfor (i = 0; i < (int)gt.gl_pathc; i++) {\r\n            fd = open(gt.gl_pathv[i], O_RDONLY);\r\n            if (fd == -1) {\r\n                dbg_time(\"open %s failed, errno = %d(%s)\", gt.gl_pathv[i], errno, strerror(errno));\r\n                globfree(&gt);\r\n                return -1;\r\n            }\r\n            \r\n            nreads = read(fd, cmdline, sizeof(cmdline));\r\n            if (nreads > 0) {\r\n                int pos = 0;\r\n                while (pos < nreads-1) {\r\n                    if (cmdline[pos] == '\\0')\r\n                        cmdline[pos] = ' ';  // space\r\n                    pos++;\r\n                }\r\n                // printf(\"%s\\n\", cmdline);\r\n            }\r\n\r\n            if (strstr(cmdline, program_name) && strstr(cmdline, filter)) {\r\n            \tchar path[64] = {0};\r\n            \tchar pidstr[64] = {0};\r\n            \tchar *p;\r\n            \t\r\n                dbg_time(\"%s: %s\", gt.gl_pathv[i], cmdline);\r\n            \tstrcpy(path, gt.gl_pathv[i]);\r\n            \tp = strstr(gt.gl_pathv[i], \"/cmdline\");\r\n            \t*p = '\\0';\r\n            \twhile (*(--p) != '/') ;\r\n            \t\t\r\n            \tstrcpy(pidstr, p+1);\r\n            \tpid = atoi(pidstr);\r\n            \tglobfree(&gt);\r\n                \r\n                return pid;\r\n            }\r\n        }\r\n    }\r\n\r\n    globfree(&gt);\r\n    return -1;\r\n}\r\n\r\nvoid ql_get_driver_rmnet_info(PROFILE_T *profile, RMNET_INFO *rmnet_info) {\r\n    int ifc_ctl_sock;\r\n    struct ifreq ifr;\r\n    int rc;\r\n    int request = 0x89F3;\r\n    unsigned char data[512];\r\n\r\n    memset(rmnet_info, 0x00, sizeof(*rmnet_info));\r\n\r\n    ifc_ctl_sock = socket(AF_INET, SOCK_DGRAM, 0);\r\n    if (ifc_ctl_sock <= 0) {\r\n        dbg_time(\"socket() failed: %s\\n\", strerror(errno));\r\n        return;\r\n    }\r\n    \r\n    memset(&ifr, 0, sizeof(struct ifreq));\r\n    strncpy(ifr.ifr_name, profile->usbnet_adapter, IFNAMSIZ);\r\n    ifr.ifr_name[IFNAMSIZ - 1] = 0;    \r\n    ifr.ifr_ifru.ifru_data = (void *)data;\r\n        \r\n    rc = ioctl(ifc_ctl_sock, request, &ifr);\r\n    if (rc < 0) {\r\n        if (errno != ENOTSUP)\r\n            dbg_time(\"ioctl(0x%x, qmap_settings) errno:%d (%s), rc=%d\", request, errno, strerror(errno), rc);\r\n    }\r\n    else {\r\n        memcpy(rmnet_info, data, sizeof(*rmnet_info));\r\n    }\r\n\r\n    close(ifc_ctl_sock);\r\n}\r\n\r\nvoid ql_set_driver_qmap_setting(PROFILE_T *profile, QMAP_SETTING *qmap_settings) {\r\n    int ifc_ctl_sock;\r\n    struct ifreq ifr;\r\n    int rc;\r\n    int request = 0x89F2;\r\n\r\n    ifc_ctl_sock = socket(AF_INET, SOCK_DGRAM, 0);\r\n    if (ifc_ctl_sock <= 0) {\r\n        dbg_time(\"socket() failed: %s\\n\", strerror(errno));\r\n        return;\r\n    }\r\n    \r\n    memset(&ifr, 0, sizeof(struct ifreq));\r\n    strncpy(ifr.ifr_name, profile->usbnet_adapter, IFNAMSIZ);\r\n    ifr.ifr_name[IFNAMSIZ - 1] = 0;    \r\n    ifr.ifr_ifru.ifru_data = (void *)qmap_settings;\r\n        \r\n    rc = ioctl(ifc_ctl_sock, request, &ifr);\r\n    if (rc < 0) {\r\n        dbg_time(\"ioctl(0x%x, qmap_settings) failed: %s, rc=%d\", request, strerror(errno), rc);\r\n    }\r\n\r\n    close(ifc_ctl_sock);\t\r\n}\r\n\r\nvoid no_trunc_strncpy(char *dest, const char *src, size_t dest_size)\r\n{\r\n    size_t i = 0;\r\n\r\n    for (i = 0; i < dest_size && *src; i++) {\r\n        *dest++ = *src++;\r\n    }\r\n\r\n    *dest = 0;\r\n}\r\n"
  },
  {
    "path": "relevance/quectel_cm-5G/src/util.h",
    "content": "/*\r\n    Copyright 2023 Quectel Wireless Solutions Co.,Ltd\r\n\r\n    Quectel hereby grants customers of Quectel a license to use, modify,\r\n    distribute and publish the Software in binary form provided that\r\n    customers shall have no right to reverse engineer, reverse assemble,\r\n    decompile or reduce to source code form any portion of the Software. \r\n    Under no circumstances may customers modify, demonstrate, use, deliver \r\n    or disclose any portion of the Software in source code form.\r\n*/\r\n\r\n#ifndef _UTILS_H_\r\n#define _UTILS_H_\r\n\r\n#include <stddef.h>\r\n#include <glob.h>\r\n\r\nstruct listnode\r\n{\r\n    struct listnode *next;\r\n    struct listnode *prev;\r\n};\r\n\r\n#define node_to_item(node, container, member) \\\r\n    (container *) (((char*) (node)) - offsetof(container, member))\r\n\r\n#define list_declare(name) \\\r\n    struct listnode name = { \\\r\n        .next = &name, \\\r\n        .prev = &name, \\\r\n    }\r\n\r\n#define list_for_each(node, list) \\\r\n    for (node = (list)->next; node != (list); node = node->next)\r\n\r\n#define list_for_each_reverse(node, list) \\\r\n    for (node = (list)->prev; node != (list); node = node->prev)\r\n\r\nvoid list_init(struct listnode *list);\r\nvoid list_add_tail(struct listnode *list, struct listnode *item);\r\nvoid list_add_head(struct listnode *head, struct listnode *item);\r\nvoid list_remove(struct listnode *item);\r\n\r\n#define list_empty(list) ((list) == (list)->next)\r\n#define list_head(list) ((list)->next)\r\n#define list_tail(list) ((list)->prev)\r\n\r\nint epoll_register(int  epoll_fd, int  fd, unsigned int events);\r\nint epoll_deregister(int  epoll_fd, int  fd);\r\nconst char * get_time(void);\r\nunsigned long clock_msec(void);\r\npid_t getpid_by_pdp(int, const char*);\r\n\r\n#endif\r\n"
  },
  {
    "path": "relevance/smartmontools/Makefile",
    "content": "#\n# Copyright (C) 2006-2016 OpenWrt.org\n#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=smartmontools\nPKG_VERSION:=7.5\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=@SF/smartmontools\nPKG_HASH:=690b83ca331378da9ea0d9d61008c4b22dde391387b9bbad7f29387f2595f76e\n\nPKG_MAINTAINER:=Maxim Storchak <m.storchak@gmail.com>\nPKG_LICENSE:=GPL-2.0-or-later\nPKG_LICENSE_FILES:=COPYING\nPKG_CPE_ID:=cpe:/a:smartmontools:smartmontools\n\nPKG_BUILD_PARALLEL:=1\nPKG_INSTALL:=1\nPKG_BUILD_FLAGS:=lto\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/smartmontools/Default\n  SECTION:=utils\n  CATEGORY:=Utilities\n  TITLE:=S.M.A.R.T Monitoring\n  URL:=https://www.smartmontools.org/\nendef\n\ndefine Package/smartmontools\n  $(call Package/smartmontools/Default)\n  DEPENDS:=+libstdcpp\n  TITLE+= Tool\nendef\n\ndefine Package/smartmontools/description\n  smartmontools contains utility programs (smartctl) to\n  control/monitor storage systems using the Self-Monitoring, Analysis\n  and Reporting Technology System (S.M.A.R.T.) built into most modern\n  ATA and SCSI disks. It is derived from smartsuite.\nendef\n\ndefine Package/smartd\n  $(call Package/smartmontools/Default)\n  DEPENDS:=+libstdcpp\n  TITLE+= Daemon\nendef\n\ndefine Package/smartd/description\n  smartmontools contains utility programs (smartd) to\n  control/monitor storage systems using the Self-Monitoring, Analysis\n  and Reporting Technology System (S.M.A.R.T.) built into most modern\n  ATA and SCSI disks. It is derived from smartsuite.\nendef\n\ndefine Package/smartmontools-drivedb\n  $(call Package/smartmontools/Default)\n  TITLE+= Drive database\n  PKGARCH=all\nendef\n\ndefine Package/smartmontools-drivedb/description\n  Database of known drives and USB bridges for smartctl and smartd.\nendef\n\ndefine Package/smartd-mail\n  $(call Package/smartmontools/Default)\n  TITLE+= Email notifications\n  PKGARCH=all\n  DEPENDS+= +smartd +nail +msmtp-mta\nendef\n\ndefine Package/smartd-mail/description\n  A script for mailing about SMART issues\nendef\n\nTARGET_CXXFLAGS +=-fno-rtti\nMAKE_FLAGS +=BUILD_INFO='\"(localbuild)\"' V=$(if $(V),1,0)\n\nCONFIGURE_ARGS += \\\n\t--disable-fast-lebe \\\n\t--without-gnupg \\\n\t--without-libcap-ng \\\n\t--without-libsystemd\n\n#lower file size vs. CONFIGURE_ARGS\nCONFIGURE_VARS += \\\n\twith_cxx11_regex=yes \\\n\twith_smartdplugindir=no \\\n\twith_systemdenvfile=no \\\n\twith_systemdsystemunitdir=no \\\n\twith_update_smart_drivedb=no\n\ndefine Package/smartmontools/install\n\t$(INSTALL_DIR) $(1)/usr/sbin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/smartctl $(1)/usr/sbin/\nendef\n\ndefine Package/smartd/install\n\t$(INSTALL_DIR) $(1)/usr/sbin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/sbin/smartd $(1)/usr/sbin/\n\t$(INSTALL_DIR) $(1)/etc\n\t$(INSTALL_DATA) ./files/smartd.conf $(1)/etc/\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_BIN) ./files/smartd.init $(1)/etc/init.d/smartd\nendef\n\ndefine Package/smartmontools-drivedb/install\n\t$(INSTALL_DIR) $(1)/usr/share/smartmontools/\n\t$(INSTALL_DATA) $(PKG_INSTALL_DIR)/usr/share/smartmontools/drivedb.h $(1)/usr/share/smartmontools/\nendef\n\ndefine Package/smartd-mail/install\n\t$(INSTALL_DIR) $(1)/etc\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/etc/smartd_warning.sh $(1)/etc\nendef\n\ndefine Package/smartd/conffiles\n/etc/smartd.conf\nendef\n\n$(eval $(call BuildPackage,smartmontools))\n$(eval $(call BuildPackage,smartd))\n$(eval $(call BuildPackage,smartmontools-drivedb))\n$(eval $(call BuildPackage,smartd-mail))\n"
  },
  {
    "path": "relevance/smartmontools/files/smartd.conf",
    "content": "/dev/hdb -H\n"
  },
  {
    "path": "relevance/smartmontools/files/smartd.init",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2006-2011 OpenWrt.org\n\nSTART=95\n\nUSE_PROCD=1\nPROG=/usr/sbin/smartd\n\nstart_service() {\n\tprocd_open_instance\n\tprocd_set_param command \"$PROG\"\n\tprocd_append_param command -n -q never\n\tprocd_close_instance\n}\n\nreload_service() {\n\tprocd_send_signal smartd\n}\n"
  },
  {
    "path": "relevance/smartmontools/patches/001-use-external-drivedb.patch",
    "content": "--- a/knowndrives.cpp\n+++ b/knowndrives.cpp\n@@ -40,11 +40,84 @@ const char * knowndrives_cpp_cvsid = \"$I\n // see read_default_drive_databases() below.\n // The drive_settings structure is described in drivedb.h.\n const drive_settings builtin_knowndrives[] = {\n-#include \"drivedb.h\"\n+  { \"DEFAULT\",\n+    \"-\", \"-\",\n+    \"Default settings\",\n+    \"-v 1,raw48,Raw_Read_Error_Rate \"\n+    \"-v 2,raw48,Throughput_Performance \"\n+    \"-v 3,raw16(avg16),Spin_Up_Time \"\n+    \"-v 4,raw48,Start_Stop_Count \"\n+    \"-v 5,raw16(raw16),Reallocated_Sector_Ct \"\n+    \"-v 6,raw48,Read_Channel_Margin,HDD \"\n+    \"-v 7,raw48,Seek_Error_Rate,HDD \"\n+    \"-v 8,raw48,Seek_Time_Performance,HDD \"\n+    \"-v 9,raw24(raw8),Power_On_Hours \"\n+    \"-v 10,raw48,Spin_Retry_Count,HDD \"\n+    \"-v 11,raw48,Calibration_Retry_Count,HDD \"\n+    \"-v 12,raw48,Power_Cycle_Count \"\n+    \"-v 13,raw48,Read_Soft_Error_Rate \"\n+    //  14-174 Unknown_Attribute\n+    \"-v 175,raw48,Program_Fail_Count_Chip,SSD \"\n+    \"-v 176,raw48,Erase_Fail_Count_Chip,SSD \"\n+    \"-v 177,raw48,Wear_Leveling_Count,SSD \"\n+    \"-v 178,raw48,Used_Rsvd_Blk_Cnt_Chip,SSD \"\n+    \"-v 179,raw48,Used_Rsvd_Blk_Cnt_Tot,SSD \"\n+    \"-v 180,raw48,Unused_Rsvd_Blk_Cnt_Tot,SSD \"\n+    \"-v 181,raw48,Program_Fail_Cnt_Total \"\n+    \"-v 182,raw48,Erase_Fail_Count_Total,SSD \"\n+    \"-v 183,raw48,Runtime_Bad_Block \"\n+    \"-v 184,raw48,End-to-End_Error \"\n+    //  185-186 Unknown_Attribute\n+    \"-v 187,raw48,Reported_Uncorrect \"\n+    \"-v 188,raw48,Command_Timeout \"\n+    \"-v 189,raw48,High_Fly_Writes,HDD \"\n+    \"-v 190,tempminmax,Airflow_Temperature_Cel \"\n+    \"-v 191,raw48,G-Sense_Error_Rate,HDD \"\n+    \"-v 192,raw48,Power-Off_Retract_Count \"\n+    \"-v 193,raw48,Load_Cycle_Count,HDD \"\n+    \"-v 194,tempminmax,Temperature_Celsius \"\n+    \"-v 195,raw48,Hardware_ECC_Recovered \"\n+    \"-v 196,raw16(raw16),Reallocated_Event_Count \"\n+    \"-v 197,raw48,Current_Pending_Sector \"\n+    \"-v 198,raw48,Offline_Uncorrectable \"\n+    \"-v 199,raw48,UDMA_CRC_Error_Count \"\n+    \"-v 200,raw48,Multi_Zone_Error_Rate,HDD \"\n+    \"-v 201,raw48,Soft_Read_Error_Rate,HDD \"\n+    \"-v 202,raw48,Data_Address_Mark_Errs,HDD \"\n+    \"-v 203,raw48,Run_Out_Cancel \"\n+    \"-v 204,raw48,Soft_ECC_Correction \"\n+    \"-v 205,raw48,Thermal_Asperity_Rate \"\n+    \"-v 206,raw48,Flying_Height,HDD \"\n+    \"-v 207,raw48,Spin_High_Current,HDD \"\n+    \"-v 208,raw48,Spin_Buzz,HDD \"\n+    \"-v 209,raw48,Offline_Seek_Performnce,HDD \"\n+    //  210-219 Unknown_Attribute\n+    \"-v 220,raw48,Disk_Shift,HDD \"\n+    \"-v 221,raw48,G-Sense_Error_Rate,HDD \"\n+    \"-v 222,raw48,Loaded_Hours,HDD \"\n+    \"-v 223,raw48,Load_Retry_Count,HDD \"\n+    \"-v 224,raw48,Load_Friction,HDD \"\n+    \"-v 225,raw48,Load_Cycle_Count,HDD \"\n+    \"-v 226,raw48,Load-in_Time,HDD \"\n+    \"-v 227,raw48,Torq-amp_Count,HDD \"\n+    \"-v 228,raw48,Power-off_Retract_Count \"\n+    //  229 Unknown_Attribute\n+    \"-v 230,raw48,Head_Amplitude,HDD \"\n+    \"-v 231,raw48,Temperature_Celsius,HDD \"\n+    \"-v 232,raw48,Available_Reservd_Space \"\n+    \"-v 233,raw48,Media_Wearout_Indicator,SSD \"\n+    //  234-239 Unknown_Attribute\n+    \"-v 240,raw24(raw8),Head_Flying_Hours,HDD \"\n+    \"-v 241,raw48,Total_LBAs_Written \"\n+    \"-v 242,raw48,Total_LBAs_Read \"\n+    //  243-249 Unknown_Attribute\n+    \"-v 250,raw48,Read_Error_Retry_Rate \"\n+    //  251-253 Unknown_Attribute\n+    \"-v 254,raw48,Free_Fall_Sensor,HDD\"\n+  },\n };\n \n-const unsigned builtin_knowndrives_size =\n-  sizeof(builtin_knowndrives) / sizeof(builtin_knowndrives[0]);\n+const unsigned builtin_knowndrives_size = 1;\n \n /// Drive database class. Stores custom entries read from file.\n /// Provides transparent access to concatenation of custom and\n"
  },
  {
    "path": "relevance/smartmontools/patches/002-os_mailer-is-mailx.patch",
    "content": "--- a/configure\n+++ b/configure\n@@ -7621,7 +7621,7 @@ fi\n # Set platform-specific modules and symbols\n os_libs=\n os_dltools='curl wget lynx svn'\n-os_mailer=mail\n+os_mailer=mailx\n os_hostname=\"'hostname' 'uname -n'\"\n os_dnsdomainname=\n os_nisdomainname=\"'domainname'\"\n"
  },
  {
    "path": "relevance/smartmontools/test.sh",
    "content": "#!/bin/sh\n\ncase \"$1\" in\n\tsmartctl|smartd) \"$1\" -V | head -n 1 | grep \"$2\" ;;\nesac\n"
  },
  {
    "path": "relevance/socat/Makefile",
    "content": "#\n# This is free software, licensed under the GNU General Public License v2.\n# See /LICENSE for more information.\n#\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=socat\nPKG_VERSION:=1.8.1.1\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.bz2\nPKG_SOURCE_URL:=http://www.dest-unreach.org/socat/download\nPKG_HASH:=5ebc636b7f427053f98806696521653a614c7e06464910353cbf54e2327adc1b\n\nPKG_MAINTAINER:=Ted Hess <thess@kitschensync.net>\nPKG_LICENSE:=GPL-2.0-or-later OpenSSL\nPKG_LICENSE_FILES:=COPYING COPYING.OpenSSL\nPKG_CPE_ID:=cpe:/a:dest-unreach:socat\n\nPKG_INSTALL:=1\nPKG_BUILD_PARALLEL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/socat\n  SECTION:=net\n  CATEGORY:=Network\n  DEPENDS:=+libpthread +librt +SOCAT_SSL:libopenssl\n  TITLE:=A multipurpose relay (SOcket CAT)\n  URL:=http://www.dest-unreach.org/socat/\nendef\n\ndefine Package/socat/description\n\tSoCat (for SOcket CAT) establishes two bidirectional byte streams and\n\ttransfers data between them.\n\tData channels may be files, pipes, devices (terminal or modem, etc.), or\n\tsockets (Unix, IPv4, IPv6, raw, UDP, TCP, SSL). It provides forking,\n\tlogging and tracing, different modes for interprocess communication and\n\tmany more options.\nendef\n\ndefine Package/socat/config\nconfig SOCAT_SSL\n        bool \"SSL support\"\n        depends on PACKAGE_socat\n        select OPENSSL_WITH_DEPRECATED\n        default n\n        help\n          Implements SSL support in socat (using libopenssl).\nendef\n\ndefine Package/socat/conffiles\n/etc/config/socat\nendef\n\nCONFIGURE_ARGS += \\\n\t--disable-libwrap \\\n\t--disable-readline \\\n\t--enable-termios\n\nifneq ($(CONFIG_SOCAT_SSL),y)\n  CONFIGURE_ARGS+= --disable-openssl\nendif\n\n# PowerPC has different TERMIOS bits\nifneq ($(findstring powerpc,$(CONFIG_ARCH)),)\n  CONFIGURE_VARS += \\\n\t  sc_cv_sys_crdly_shift=12 \\\n\t  sc_cv_sys_tabdly_shift=10 \\\n\t  sc_cv_sys_csize_shift=8\nelse\n  CONFIGURE_VARS += \\\n\t  sc_cv_sys_crdly_shift=9 \\\n\t  sc_cv_sys_tabdly_shift=11 \\\n\t  sc_cv_sys_csize_shift=4\nendif\n\nCONFIGURE_VARS += \\\n\tsc_cv_termios_ispeed=\"no\" \\\n\tac_cv_header_bsd_libutil_h=no \\\n\tac_cv_lib_bsd_openpty=no \\\n\tBUILD_DATE=$(SOURCE_DATE_EPOCH)\n\ndefine Package/socat/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_INSTALL_DIR)/usr/bin/socat $(1)/usr/bin/\n\t$(INSTALL_DIR) $(1)/etc/config\n\t$(INSTALL_CONF) ./files/socat.config $(1)/etc/config/socat\n\t$(INSTALL_DIR) $(1)/etc/init.d\n\t$(INSTALL_BIN) ./files/socat.init $(1)/etc/init.d/socat\nendef\n\n$(eval $(call BuildPackage,socat))\n"
  },
  {
    "path": "relevance/socat/files/socat.config",
    "content": "# forward port 8000 on IPv6 to IPv4 host port 80\n# change enable to '1' to use this example\nconfig socat 'http'\n\toption enable '0'\n\toption SocatOptions '-d -d TCP6-LISTEN:8000,fork TCP4:192.168.1.20:80'\n\toption user 'nobody'\n"
  },
  {
    "path": "relevance/socat/files/socat.init",
    "content": "#!/bin/sh /etc/rc.common\n# Copyright (C) 2008-2014 OpenWrt.org\n\nSTART=99\nSTOP=99\n\nUSE_PROCD=1\nPROG=/usr/bin/socat\nNAME=socat\n\nvalidate_section_socat()\n{\n\tuci_load_validate socat socat \"$1\" \"$2\" \\\n\t\t'enable:bool:1' \\\n\t\t'SocatOptions:or(string, list(string))' \\\n\t\t'user:string:root'\n}\n\nappend_param_command()\n{\n\tprocd_append_param command \"$1\"\n}\n\nsocat_instance()\n{\n\tlocal is_list\n\tlocal user\n\n\t[ \"$2\" = 0 ] || {\n\t\techo \"validation failed\"\n\t\treturn 1\n\t}\n\n\t[ \"$enable\" = \"0\" ] && return 1\n\n\tprocd_open_instance\n\tprocd_set_param command \"$PROG\"\n\tconfig_get is_list \"$1\" SocatOptions_LENGTH\n\tif [ -z \"$is_list\" ]; then\n\t\tprocd_append_param command $SocatOptions\n\telse\n\t\tconfig_list_foreach \"$1\" SocatOptions append_param_command\n\tfi\n\tconfig_get user \"$1\" user\n\tif [ -n \"$user\" ]; then\n\t\tprocd_set_param user $user\n\tfi\n\tprocd_set_param stdout 1\n\tprocd_set_param stderr 1\n\tprocd_close_instance\n}\n\nstart_service () {\n\tconfig_load \"$NAME\"\n\tconfig_foreach validate_section_socat socat socat_instance\n}\n\nservice_triggers() {\n\tprocd_add_reload_trigger \"$NAME\"\n\tprocd_add_validation validate_section_socat\n}\n"
  },
  {
    "path": "relevance/syncthing/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=syncthing\nPKG_VERSION:=2.0.16\nPKG_RELEASE:=1\n\nPKG_SOURCE:=syncthing-source-v$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://github.com/syncthing/syncthing/releases/download/v$(PKG_VERSION)\nPKG_HASH:=f93836f943967c8fe608e90fd6dc2c419ce00cfa0ca5266caa86c22ae290f169\n\nPKG_BUILD_DIR=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)/$(PKG_NAME)\n\nPKG_MAINTAINER:=Van Waholtz <brvphoenix@gmail.com>, George Sapkin <george@sapk.in>\nPKG_LICENSE:=MPL-2.0\nPKG_LICENSE_FILES:=LICENSE\nPKG_CPE_ID:=cpe:/a:syncthing:syncthing\n\nPKG_BUILD_DEPENDS:=golang/host\nPKG_BUILD_PARALLEL:=1\nPKG_BUILD_FLAGS:=no-mips16\n\nGO_PKG:=github.com/syncthing/syncthing\nGO_PKG_BUILD_PKG:=\\\n\t$(if $(CONFIG_PACKAGE_syncthing),$(GO_PKG)/cmd/syncthing/) \\\n\t$(if $(CONFIG_PACKAGE_stdiscosrv),$(GO_PKG)/cmd/stdiscosrv/) \\\n\t$(if $(CONFIG_PACKAGE_strelaysrv),$(GO_PKG)/cmd/strelaysrv/)\nGO_PKG_INSTALL_EXTRA:=^gui/\n\nGO_PKG_TAGS:=noupgrade\nGO_PKG_LDFLAGS_X:=\\\n\t$(GO_PKG)/lib/build.Version=v$(PKG_VERSION) \\\n\t$(GO_PKG)/lib/build.Stamp=$(SOURCE_DATE_EPOCH) \\\n\t$(GO_PKG)/lib/build.User=openwrt \\\n\t$(GO_PKG)/lib/build.Host=openwrt \\\n\t$(GO_PKG)/lib/build.Tags=$(GO_PKG_TAGS)\n\ninclude $(INCLUDE_DIR)/package.mk\ninclude $(TOPDIR)/feeds/packages/lang/golang/golang-package.mk\n\ndefine Package/syncthing/Default\n  URL:=https://syncthing.net\n  DEPENDS:=$(GO_ARCH_DEPENDS)\n  SECTION:=utils\n  CATEGORY:=Utilities\n  USERID:=syncthing=499:syncthing=499\nendef\n\ndefine Package/syncthing\n  $(call Package/syncthing/Default)\n  TITLE:=Continuous file synchronization program\nendef\n\ndefine Package/stdiscosrv\n  $(call Package/syncthing/Default)\n  TITLE:=Discovery server for syncthing\nendef\n\ndefine Package/strelaysrv\n  $(call Package/syncthing/Default)\n  TITLE:=Relay server for syncthing\nendef\n\ndefine Package/syncthing/conffiles\n/etc/config/syncthing\n/etc/syncthing\nendef\n\ndefine Package/stdiscosrv/conffiles\n/etc/config/stdiscosrv\n/etc/stdiscosrv\nendef\n\ndefine Package/strelaysrv/conffiles\n/etc/config/strelaysrv\n/etc/strelaysrv\nendef\n\ndefine Package/syncthing/description\n  Syncthing replaces proprietary sync and cloud services with something\n  open, trustworthy and decentralized. Your data is your data alone and\n  you deserve to choose where it is stored, if it is shared with some\n  third party and how it's transmitted over the Internet.\nendef\n\ndefine Package/stdiscosrv/description\n  Syncthing relies on a discovery server to find peers on the internet.\n  Anyone can run a discovery server and point Syncthing installations to\n  it. The Syncthing project also maintains a global cluster for public\n  use.\nendef\n\ndefine Package/strelaysrv/description\n  Syncthing relies on a network of community-contributed relay servers.\n  Anyone can run a relay server, and it will automatically join the relay\n  pool and be available to Syncthing users. The current list of relays can\n  be found at https://relays.syncthing.net/.\nendef\n\ndefine SyncthingInstall\n\t$(INSTALL_DIR) $(1)/etc/$(2)\n\n\t$(INSTALL_DIR) $(1)/etc/config/\n\t$(INSTALL_CONF) $(CURDIR)/files/$(2).conf $(1)/etc/config/$(2)\n\n\t$(INSTALL_DIR) $(1)/etc/init.d/\n\t$(INSTALL_BIN) $(CURDIR)/files/$(2).init $(1)/etc/init.d/$(2)\n\n\t$(INSTALL_DIR) $(1)/usr/bin/\n\t$(INSTALL_BIN) $(GO_PKG_BUILD_BIN_DIR)/$(2) $(1)/usr/bin\nendef\n\ndefine Package/syncthing/install\n\t$(call SyncthingInstall,$(1),syncthing)\n\n\t$(INSTALL_DIR) $(1)/etc/sysctl.d/\n\t$(INSTALL_CONF) $(CURDIR)/files/syncthing.sysctl $(1)/etc/sysctl.d/90-syncthing.conf\nendef\n\ndefine Package/stdiscosrv/install\n\t$(call SyncthingInstall,$(1),stdiscosrv)\nendef\n\ndefine Package/strelaysrv/install\n\t$(call SyncthingInstall,$(1),strelaysrv)\nendef\n\n$(eval $(call BuildPackage,syncthing))\n$(eval $(call BuildPackage,stdiscosrv))\n$(eval $(call BuildPackage,strelaysrv))\n"
  },
  {
    "path": "relevance/syncthing/files/stdiscosrv.conf",
    "content": "\nconfig stdiscosrv 'stdiscosrv'\n\toption enabled '0'\n\toption listen ':8443'\n\toption db_dir '/etc/stdiscosrv/db'\n\n\t# More info: https://docs.syncthing.net/users/stdiscosrv.html\n\t# option cert '/etc/stdiscosrv/cert.pem'\n\t# option key '/etc/stdiscosrv/key.pem'\n\t# option db_flush_interval '5m'\n\t# option metrics_listen ''\n\n\t# Running as 'root' is possible, but not recommended\n\t# option user 'syncthing'\n\t# option group 'syncthing'\n\n\t# CLI options with no value should be defined as booleans\n\t# option compression '0'\n\t# option debug '0'\n\t# option http '1'\n\n\t# Advanced options. Modify at your own risk.\n\n\t# More info: https://go.dev/doc/gc-guide#GOGC\n\t# option gc '0'\n\n\t# Max number of OS threads to use\n\t# 0 to match the number of CPUs (default)\n\t# >0 to explicitly specify concurrency\n\t# option maxprocs '0'\n\n\t# Soft memory limit in MB, 0 to disable\n\t# option memlimit '0'\n"
  },
  {
    "path": "relevance/syncthing/files/stdiscosrv.init",
    "content": "#!/bin/sh /etc/rc.common\n#\n# shellcheck disable=SC3043 # ash supports local\n\nSTART=90\nSTOP=10\n\nPROG=/usr/bin/stdiscosrv\nUSE_PROCD=1\n\nservice_triggers() {\n\tprocd_add_reload_trigger 'stdiscosrv'\n}\n\nstart_service() {\n\tconfig_load 'stdiscosrv'\n\n\tlocal config_name='stdiscosrv'\n\tlocal enabled compression cert db_dir db_flush_interval debug http key \\\n\t\tlisten metrics_listen nice user\n\tlocal gc maxprocs memlimit\n\n\tuci_validate_section 'stdiscosrv' 'stdiscosrv' \"$config_name\" \\\n\t\t'compression:bool:0' \\\n\t\t'cert:string:/etc/stdiscosrv/cert.pem' \\\n\t\t'db_dir:string:/etc/stdiscosrv/db' \\\n\t\t'db_flush_interval:string' \\\n\t\t'debug:bool:0' \\\n\t\t'enabled:bool:0' \\\n\t\t'gc:uinteger:0' \\\n\t\t'group:string:syncthing' \\\n\t\t'http:bool:0' \\\n\t\t'key:string:/etc/stdiscosrv/key.pem' \\\n\t\t'listen:string::8443' \\\n\t\t'maxprocs:uinteger:0' \\\n\t\t'memlimit:uinteger:0' \\\n\t\t'metrics_listen:string' \\\n\t\t'nice:range(-20,19):0' \\\n\t\t'user:string:syncthing'\n\n\t[ \"$enabled\" = 1 ] || return 0\n\n\t[ -z \"$group\" ] && group=$(id -gn \"$user\")\n\n\tmkdir -p \"$db_dir\"\n\t[ -d \"$db_dir\" ] && chown -R \"$user:$group\" \"$db_dir\"\n\n\tprocd_open_instance stdiscosrv\n\n\tprocd_set_param command \"$PROG\"\n\n\t[ \"$gc\" -le 0 ] || procd_append_param env GOGC=\"$gc\"\n\t[ \"$maxprocs\" -le 0 ] || procd_append_param env GOMAXPROCS=\"$maxprocs\"\n\t[ \"$memlimit\" -le 0 ] || procd_append_param env GOMEMLIMIT=\"$memlimit\"\n\n\tprocd_append_param command --cert=\"$cert\"\n\t[ \"$compression\" -eq 0 ] || procd_append_param command --compression\n\tprocd_append_param command --db-dir=\"$db_dir\"\n\t[ -z \"$db_flush_interval\" ] ||\n\t\tprocd_append_param command --db-flush-interval=\"$db_flush_interval\"\n\t[ \"$debug\" -eq 0 ] || procd_append_param command --debug\n\t[ \"$http\" -eq 0 ] || procd_append_param command --http\n\tprocd_append_param command --key=\"$key\"\n\tprocd_append_param command --listen=\"$listen\"\n\t[ -z \"$metrics_listen\" ] ||\n\t\tprocd_append_param command --metrics-listen=\"$metrics_listen\"\n\n\tprocd_set_param nice \"$nice\"\n\tprocd_set_param term_timeout 15\n\tprocd_set_param user \"$user\"\n\tprocd_set_param group \"$group\"\n\tprocd_set_param respawn\n\tprocd_set_param stdout 1\n\tprocd_set_param stderr 1\n\n\tprocd_close_instance\n}\n\nreload_service() {\n\tstop\n\tstart\n}\n"
  },
  {
    "path": "relevance/syncthing/files/strelaysrv.conf",
    "content": "\nconfig strelaysrv 'strelaysrv'\n\toption enabled '0'\n\toption keys '/etc/strelaysrv'\n\toption listen ':22067'\n\n\t# More info: https://docs.syncthing.net/users/strelaysrv.html\n\t# option ext_address ''\n\t# option global_rate ''\n\t# option message_timeout '1m0s'\n\t# option nat_lease '60'\n\t# option nat_renewal '30'\n\t# option nat_timeout '10'\n\t# option network_timeout '2m0s'\n\t# option per_session_rate ''\n\t# option ping_interval '1m0s'\n\t# option pools ''\n\t# option protocol 'tcp'\n\t# option provided_by ''\n\t# option status_srv ':22070'\n\t# option token ''\n\n\t# Running as 'root' is possible, but not recommended\n\t# option user 'syncthing'\n\t# option group 'syncthing'\n\n\t# CLI options with no value should be defined as booleans\n\t# option debug '0'\n\t# option nat '0'\n\t# option pprof '0'\n\n\t# Advanced options. Modify at your own risk.\n\n\t# More info: https://go.dev/doc/gc-guide#GOGC\n\t# option gc '0'\n\n\t# Max number of OS threads to use\n\t# 0 to match the number of CPUs (default)\n\t# >0 to explicitly specify concurrency\n\t# option maxprocs '0'\n\n\t# Soft memory limit in MB, 0 to disable\n\t# option memlimit '0'\n"
  },
  {
    "path": "relevance/syncthing/files/strelaysrv.init",
    "content": "#!/bin/sh /etc/rc.common\n#\n# shellcheck disable=SC3043 # ash supports local\n\nSTART=90\nSTOP=10\n\nPROG=/usr/bin/strelaysrv\nUSE_PROCD=1\n\nservice_triggers() {\n\tprocd_add_reload_trigger 'strelaysrv'\n}\n\nstart_service() {\n\tconfig_load 'strelaysrv'\n\n\tlocal config_name=\"strelaysrv\"\n\tlocal debug enabled ext_address global_rate keys listen memlimit \\\n\t\tmessage_timeout nat nat_lease nat_renewal nat_timeout network_timeout \\\n\t\tnice per_session_rate ping_interval pools pprof protocol provided_by \\\n\t\tstatus_srv token user\n\n\tlocal gc maxprocs memlimit\n\n\tuci_validate_section 'strelaysrv' 'strelaysrv' \"$config_name\" \\\n\t\t'debug:bool:0' \\\n\t\t'enabled:bool:0' \\\n\t\t'ext_address:string' \\\n\t\t'gc:uinteger:0' \\\n\t\t'global_rate:string' \\\n\t\t'group:string:syncthing' \\\n\t\t'keys:string:/etc/strelaysrv' \\\n\t\t'listen:string::22067' \\\n\t\t'maxprocs:uinteger:0' \\\n\t\t'memlimit:uinteger:0' \\\n\t\t'message_timeout:string' \\\n\t\t'nat:bool:0' \\\n\t\t'nat_lease:string' \\\n\t\t'nat_renewal:string' \\\n\t\t'nat_timeout:string' \\\n\t\t'network_timeout:string' \\\n\t\t'nice:range(-20,19):0' \\\n\t\t'per_session_rate:string' \\\n\t\t'ping_interval:string' \\\n\t\t'pools:string' \\\n\t\t'pprof:bool:0' \\\n\t\t'protocol:or(\"tcp\", \"tcp4\", \"tcp6\"):tcp' \\\n\t\t'provided_by:string' \\\n\t\t'status_srv:string' \\\n\t\t'token:string' \\\n\t\t'user:string:syncthing'\n\n\t[ \"$enabled\" = 1 ] || return 0\n\n\t[ -z \"$group\" ] && group=$(id -gn \"$user\")\n\n\tmkdir -p \"$keys\"\n\t[ -d \"$keys\" ] && chown -R \"$user:$group\" \"$keys\"\n\n\tprocd_open_instance strelaysrv\n\n\tprocd_set_param command \"$PROG\"\n\n\t[ \"$gc\" -le 0 ] || procd_append_param env GOGC=\"$gc\"\n\t[ \"$maxprocs\" -le 0 ] || procd_append_param env GOMAXPROCS=\"$maxprocs\"\n\t[ \"$memlimit\" -le 0 ] || procd_append_param env GOMEMLIMIT=\"$memlimit\"\n\n\t[ \"$debug\" -eq 0 ] || procd_append_param command -debug\n\t[ -z \"$ext_address\" ] ||\n\t\tprocd_append_param command -ext-address=\"$ext_address\"\n\t[ -z \"$global_rate\" ] ||\n\t\tprocd_append_param command -global-rate=\"$global_rate\"\n\tprocd_append_param command -keys=\"$keys\"\n\t[ -z \"$listen\" ] || procd_append_param command -listen=\"$listen\"\n\t[ -z \"$message_timeout\" ] ||\n\t\tprocd_append_param command -message-timeout=\"$message_timeout\"\n\t[ \"$nat\" -eq 0 ] || procd_append_param command -nat\n\t[ -z \"$nat_lease\" ] || procd_append_param command -nat-lease=\"$nat_lease\"\n\t[ -z \"$nat_renewal\" ] ||\n\t\tprocd_append_param command -nat-renewal=\"$nat_renewal\"\n\t[ -z \"$nat_timeout\" ] ||\n\t\tprocd_append_param command -nat-timeout=\"$nat_timeout\"\n\t[ -z \"$network_timeout\" ] ||\n\t\tprocd_append_param command -network-timeout=\"$network_timeout\"\n\t[ -z \"$per_session_rate\" ] ||\n\t\tprocd_append_param command -per-session-rate=\"$per_session_rate\"\n\t[ -z \"$ping_interval\" ] ||\n\t\tprocd_append_param command -ping-interval=\"$ping_interval\"\n\t# pools is set to an empty value by default\n\tprocd_append_param command -pools=\"$pools\"\n\t[ \"$pprof\" -eq 0 ] || procd_append_param command -pprof\n\t[ -z \"$protocol\" ] || procd_append_param command -protocol=\"$protocol\"\n\t[ -z \"$provided_by\" ] ||\n\t\tprocd_append_param command -provided-by=\"$provided_by\"\n\t# status-srv is set to an empty value by default\n\tprocd_append_param command -status-srv=\"$status_srv\"\n\t[ -z \"$token\" ] || procd_append_param command -token=\"$token\"\n\n\tprocd_set_param nice \"$nice\"\n\tprocd_set_param term_timeout 15\n\tprocd_set_param user \"$user\"\n\tprocd_set_param group \"$group\"\n\tprocd_set_param respawn\n\tprocd_set_param stdout 1\n\tprocd_set_param stderr 1\n\n\tprocd_close_instance\n}\n\nreload_service() {\n\tstop\n\tstart\n}\n"
  },
  {
    "path": "relevance/syncthing/files/syncthing.conf",
    "content": "\nconfig syncthing 'syncthing'\n\toption enabled '0'\n\n\toption gui_address 'http://0.0.0.0:8384'\n\n\t# Use internal flash for evaluation purposes. Use external storage for\n\t# production. This filesystem must either support ownership/attributes or\n\t# be readable/writable by the user specified in 'option user'.\n\t# Consult syslog if things go wrong.\n\toption home '/etc/syncthing'\n\n\t# Changes to \"niceness\"/maxprocs are not picked up by \"reload_config\" or by\n\t# \"restart\": the service has to be stopped/started for those to take effect.\n\toption nice '19'\n\n\t# More info: https://docs.syncthing.net/users/syncthing.html\n\t# option db_delete_retention_interval ''\n\t# option db_maintenance_interval ''\n\t# option gui_apikey ''\n\n\t# Running as 'root' is possible, but not recommended\n\t# option user 'syncthing'\n\t# option group 'syncthing'\n\n\toption log_file '/var/log/syncthing.log'\n\t# option log_level 'INFO'\n\toption log_max_old_files '7'\n\t# Size in bytes\n\toption log_max_size '1048576'\n\n\t# Advanced options. Modify at your own risk.\n\n\t# More info: https://go.dev/doc/gc-guide#GOGC\n\t# option gc '0'\n\n\t# Max number of OS threads to use\n\t# 0 to match the number of CPUs (default)\n\t# >0 to explicitly specify concurrency\n\t# option maxprocs '0'\n\n\t# Soft memory limit in MB, 0 to disable\n\t# option memlimit '0'\n"
  },
  {
    "path": "relevance/syncthing/files/syncthing.init",
    "content": "#!/bin/sh /etc/rc.common\n#\n# shellcheck disable=SC3043 # ash supports local\n\nSTART=90\nSTOP=10\n\nPROG=/usr/bin/syncthing\nUSE_PROCD=1\n\nservice_triggers() {\n\tprocd_add_reload_trigger 'syncthing'\n}\n\nstart_service() {\n\tconfig_load 'syncthing'\n\n\tlocal config_name='syncthing'\n\tlocal enabled db_delete_retention_interval db_maintenance_interval \\\n\t\tgui_address gui_apikey home log_file logfile log_level \\\n\t\tlog_max_old_files log_max_size nice user\n\tlocal gc maxprocs macprocs memlimit\n\n\tuci_validate_section 'syncthing' 'syncthing' \"$config_name\" \\\n\t\t'db_delete_retention_interval:string' \\\n\t\t'db_maintenance_interval:string' \\\n\t\t'enabled:bool:0' \\\n\t\t'gc:uinteger:0' \\\n\t\t'group:string:syncthing' \\\n\t\t'gui_address:string:http://0.0.0.0:8384' \\\n\t\t'gui_apikey:string' \\\n\t\t'home:string:/etc/syncthing' \\\n\t\t'log_file:string:/var/log/syncthing.log' \\\n\t\t'logfile:string' \\\n\t\t'log_level:or(\"DEBUG\", \"INFO\", \"WARN\", \"ERROR\"):INFO' \\\n\t\t'log_max_old_files:uinteger:7' \\\n\t\t'log_max_size:uinteger:1048576' \\\n\t\t'macprocs:uinteger' \\\n\t\t'maxprocs:uinteger:0' \\\n\t\t'memlimit:uinteger:0' \\\n\t\t'nice:range(-20,19):0' \\\n\t\t'user:string:syncthing'\n\n\t[ \"$enabled\" = 1 ] || return 0\n\n\t# Compatibility with older configs\n\t[ -n \"$logfile\" ] && log_file=\"$logfile\"\n\t[ -n \"$macprocs\" ] && maxprocs=\"$macprocs\"\n\n\t[ -z \"$group\" ] && group=$(id -gn \"$user\")\n\n\tmkdir -p \"$home\"\n\t# A separate step to handle an upgrade use case\n\t[ -d \"$home\" ] && chown -R \"$user:$group\" \"$home\"\n\n\tprocd_open_instance syncthing\n\n\tprocd_set_param command \"$PROG\"\n\n\t[ \"$gc\" -le 0 ] || procd_append_param env GOGC=\"$gc\"\n\t[ \"$maxprocs\" -le 0 ] || procd_append_param env GOMAXPROCS=\"$maxprocs\"\n\t[ \"$memlimit\" -le 0 ] || procd_append_param env GOMEMLIMIT=\"$memlimit\"\n\n\tprocd_append_param command serve\n\t[ -z \"$db_delete_retention_interval\" ] ||\n\t\tprocd_append_param command \\\n\t\t\t--db-delete-retention-interval=\"$db_delete_retention_interval\"\n\t[ -z \"$db_maintenance_interval\" ] ||\n\t\tprocd_append_param command \\\n\t\t\t--db-maintenance-interval=\"$db_maintenance_interval\"\n\tprocd_append_param command --gui-address=\"$gui_address\"\n\t[ -z \"$gui_apikey\" ] ||\n\t\tprocd_append_param command --gui_apikey=\"$gui_apikey\"\n\tprocd_append_param command --home=\"$home\"\n\tprocd_append_param command --log-file=\"$log_file\"\n\t[ -z \"$log_level\" ] || procd_append_param command --log-level=\"$log_level\"\n\t[ -z \"$log_max_old_files\" ] ||\n\t\tprocd_append_param command --log-max-old-files=\"$log_max_old_files\"\n\t[ -z \"$log_max_size\" ] ||\n\t\tprocd_append_param command --log-max-size=\"$log_max_size\"\n\tprocd_append_param command --no-browser\n\tprocd_append_param command --no-port-probing\n\tprocd_append_param command --no-restart\n\t# The package is built with noupgrade tag so --no-upgrade is not necessary\n\n\tprocd_set_param nice \"$nice\"\n\tprocd_set_param term_timeout 15\n\tprocd_set_param user \"$user\"\n\tprocd_set_param group \"$group\"\n\tprocd_set_param respawn\n\tprocd_set_param stdout 0\n\tprocd_set_param stderr 1\n\n\tprocd_close_instance\n}\n\nreload_service() {\n\tstop\n\tstart\n}\n"
  },
  {
    "path": "relevance/syncthing/files/syncthing.sysctl",
    "content": "fs.inotify.max_user_watches=204800\n"
  },
  {
    "path": "relevance/syncthing/test.sh",
    "content": "#!/bin/sh\n\nPKG=$1\nver=$2\n\n\"$PKG\" --version | grep \"$ver\"\n"
  },
  {
    "path": "relevance/udp2raw/Makefile",
    "content": "# SPDX-License-Identifier: MIT\n#\n# Copyright (c) 2017 Yu Wang <wangyucn@gmail.com>\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=udp2raw\nPKG_VERSION:=20230206.0\nPKG_RELEASE:=1\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION).tar.gz\nPKG_SOURCE_URL:=https://codeload.github.com/wangyu-/udp2raw/tar.gz/$(PKG_VERSION)?\nPKG_HASH:=1e459020654d3c65acb252a56fe11a5e2feec5a64d6e2ffd0aacc14213bbc9c0\n\nPKG_LICENSE:=MIT\nPKG_LICENSE_FILES:=LICENSE\nPKG_MAINTAINER:=Yu Wang\n\nPKG_BUILD_PARALLEL:=1\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/udp2raw\n  SECTION:=net\n  CATEGORY:=Network\n  TITLE:=Tunnel which turns UDP Traffic into Encrypted FakeTCP/UDP/ICMP Traffic\n  URL:=https://github.com/wangyu-/udp2raw\n  DEPENDS:=+libstdcpp +libpthread +librt\n  PROVIDES:=udp2raw-tunnel\nendef\n\ndefine Package/udp2raw/description\n  udp2raw-tunnel is a tunnel which turns UDP Traffic into Encrypted FakeTCP/UDP/ICMP Traffic by using Raw Socket.\nendef\n\nMAKE_FLAGS += cross\n\ndefine Build/Prepare\n\t$(PKG_UNPACK)\n\tsed -i 's/cc_cross=.*/cc_cross=$(TARGET_CXX)/g' $(PKG_BUILD_DIR)/makefile\n\tsed -i '/\\*gitversion/d' $(PKG_BUILD_DIR)/makefile\n\techo 'const char *gitversion = \"$(PKG_VERSION)\";' > $(PKG_BUILD_DIR)/git_version.h\n\t$(Build/Patch)\nendef\n\ndefine Package/udp2raw/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/udp2raw_cross $(1)/usr/bin/udp2raw\nendef\n\n$(eval $(call BuildPackage,udp2raw))\n"
  },
  {
    "path": "relevance/upx-static/Makefile",
    "content": "# Copyright (C) 2020-2022 Hyy2001X <https://github.com/Hyy2001X>\n\ninclude $(TOPDIR)/rules.mk\n\nPKG_NAME:=upx-static\nPKG_VERSION:=3.96\nPKG_RELEASE:=20220422\n\nifeq ($(ARCH),x86_64)\n\tPKG_ARCH:=amd64\nendif\nifeq ($(ARCH),i386)\n\tPKG_ARCH:=i386\nendif\nifeq ($(ARCH),mipsel)\n\tPKG_ARCH:=mipsel\nendif\nifeq ($(ARCH),mips)\n\tPKG_ARCH:=mips\nendif\nifeq ($(ARCH),armeb)\n\tPKG_ARCH:=armeb\nendif\nifeq ($(ARCH),arm)\n\tPKG_ARCH:=arm\nendif\nifeq ($(ARCH),arm64)\n\tPKG_ARCH:=arm64\nendif\nifeq ($(ARCH),powerpc)\n\tPKG_ARCH:=powerpc\nendif\nifeq ($(ARCH),powerpc64)\n\tPKG_ARCH:=powerpc64le\nendif\n\nPKG_FILE:=upx-$(PKG_VERSION).tar.xz\nPKG_URL:=https://github.com/upx/upx/releases/download/v$(PKG_VERSION)/upx-$(PKG_VERSION)-$(PKG_ARCH)_linux.tar.xz\nPKG_BUILD_DIR:=$(BUILD_DIR)/$(PKG_NAME)\nPKG_HASH:=skip\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n\tSUBMENU:=Compression\n\tSECTION:=utils\n\tCATEGORY:=Utilities\n\tTITLE:=UPX - The Ultimate Packer for eXecutables\n\tURL:=https://upx.github.io\nendef\n\ndefine Package/$(PKG_NAME)/description\nUPX - The Ultimate Packer for eXecutables\nendef\n\ndefine Build/Prepare\n\tif [ ! -f $(DL_DIR)/$(PKG_FILE) ] ; then \\\n\t\twget -q $(PKG_URL) -O $(DL_DIR)/$(PKG_FILE); \\\n\tfi\n\trm -rf $(PKG_BUILD_DIR)\n\tmkdir -p $(PKG_BUILD_DIR)\n\txz -d -c $(DL_DIR)/$(PKG_FILE) | tar -x -C $(PKG_BUILD_DIR)\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/bin\n\t$(INSTALL_BIN) $(PKG_BUILD_DIR)/upx-$(PKG_VERSION)-$(PKG_ARCH)_linux/upx $(1)/bin/upx\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  },
  {
    "path": "relevance/webd/Makefile",
    "content": "include $(TOPDIR)/rules.mk\n\nPKG_NAME:=webd\nPKG_RELEASE:=1\n\nPKG_VERSION:=20240223\nPKG_VERSION_MEDIATEK_FILO:=20240710\n\ninclude $(INCLUDE_DIR)/package.mk\n\ndefine Package/$(PKG_NAME)\n\tSECTION:=net\n\tCATEGORY:=Network\n\tTITLE:=A Lightweight self-hosted netdisk application\n\tURL:=https://webd.cf\nendef\n\nTARGET_LIBC:=musl\nifeq ($(CONFIG_USE_UCLIBC),y)\n  TARGET_LIBC:=uclibc\nendif\n\nARM_LIBC_TAG:=muslgnueabi\nifeq ($(CONFIG_USE_UCLIBC),y)\n  ARM_LIBC_TAG:=uclibcgnueabi\nendif\n\nTARGET_ARCH:=\nTARGET_BOARD:=\n\nifeq ($(ARCH),x86_64)\n  TARGET_ARCH:=x86_64\n  TARGET_BOARD:=musl\nendif\n\nifeq ($(ARCH),mipsel)\n  TARGET_ARCH:=mipsel\n  ifeq ($(BOARD),ramips)\n    TARGET_BOARD:=$(TARGET_LIBC).ramips-mt7620\n  endif\n  ifeq ($(BOARD),bcm47xx)\n    TARGET_BOARD:=musl.brcm47xx-mips74k\n  endif\nendif\n\nifeq ($(ARCH),mips)\n  TARGET_ARCH:=mips\n  ifeq ($(BOARD),ath79)\n    TARGET_BOARD:=musl.ath79\n  endif\n  ifeq ($(BOARD),ar71xx)\n    TARGET_BOARD:=uclibc.ar71xx\n  endif\n  ifeq ($(BOARD),bcm63xx)\n    TARGET_BOARD:=uclibc.brcm63xx\n  endif\nendif\n\nifeq ($(ARCH),arm)\n  TARGET_ARCH:=arm\n  ifeq ($(BOARD),ipq806x)\n    TARGET_BOARD:=$(ARM_LIBC_TAG).ipq806x\n  endif\n  ifeq ($(BOARD),ipq40xx)\n    TARGET_BOARD:=$(ARM_LIBC_TAG).ipq40xx\n  endif\n  ifeq ($(BOARD),bcm53xx)\n    TARGET_BOARD:=$(ARM_LIBC_TAG).bcm53xx\n  endif\n  ifeq ($(BOARD),oxnas)\n    TARGET_BOARD:=$(ARM_LIBC_TAG).oxnas\n  endif\n  ifeq ($(BOARD),kirkwood)\n    TARGET_BOARD:=$(ARM_LIBC_TAG).kirkwood\n  endif\n  ifeq ($(BOARD),mvebu)\n    TARGET_BOARD:=$(ARM_LIBC_TAG).mvebu-cortexa9\n  endif\nendif\n\nifeq ($(ARCH),aarch64)\n  TARGET_ARCH:=aarch64\n\n  ifeq ($(BOARD),rockchip)\n    TARGET_BOARD:=musl.rockchip-armv8\n  endif\n  ifeq ($(BOARD),brcm2708)\n    TARGET_BOARD:=musl.brcm2708-bcm2710\n  endif\n\n  ifeq ($(BOARD),mediatek)\n    ifneq (,$(filter filogic,$(SUBTARGET)))\n      TARGET_BOARD:=musl.mediatek-filogic\n      PKG_VERSION:=$(PKG_VERSION_MEDIATEK_FILO)\n    endif\n  endif\nendif\n\nifeq ($(strip $(TARGET_ARCH)$(TARGET_BOARD)),)\n  $(error Unsupported ARCH/BOARD combo: ARCH=$(ARCH) BOARD=$(BOARD) SUBTARGET=$(SUBTARGET))\nendif\n\nPKG_SOURCE:=$(PKG_NAME)-$(PKG_VERSION)-$(TARGET_ARCH)-openwrt-linux-$(TARGET_BOARD).tar.gz\nPKG_SOURCE_URL:=https://webd.cf/webd/$(PKG_VERSION)/\nPKG_HASH:=skip\n\nUNTAR_DIR:=$(BUILD_DIR)/$(PKG_NAME)-$(PKG_VERSION)\n\ndefine Build/Prepare\n\t$(INSTALL_DIR) $(UNTAR_DIR)\n\t$(TAR) -C $(UNTAR_DIR) -xzf $(DL_DIR)/$(PKG_SOURCE)\nendef\n\ndefine Build/Compile\nendef\n\ndefine Package/$(PKG_NAME)/install\n\t$(INSTALL_DIR) $(1)/usr/bin\n\t$(INSTALL_BIN) $(UNTAR_DIR)/webd/webd $(1)/usr/bin/webd\n\n\t$(INSTALL_DIR) $(1)/usr/share/$(PKG_NAME)/web\n\t$(CP) -r $(UNTAR_DIR)/webd/web/* $(1)/usr/share/$(PKG_NAME)/web/\n\n\t$(INSTALL_DIR) $(1)/etc\n\t$(INSTALL_DATA) $(UNTAR_DIR)/webd/webd.conf $(1)/etc/webd.conf.example\n\nendef\n\n$(eval $(call BuildPackage,$(PKG_NAME)))\n"
  }
]